summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.clang-tidy112
-rw-r--r--.gitignore1
-rw-r--r--3rdParty/Breakpad/.gitignore90
-rw-r--r--3rdParty/Breakpad/AUTHORS1
-rw-r--r--3rdParty/Breakpad/BreakpadSwiftCleanup.sh58
-rw-r--r--3rdParty/Breakpad/ChangeLog0
-rw-r--r--3rdParty/Breakpad/LICENSE50
-rw-r--r--3rdParty/Breakpad/NEWS0
-rw-r--r--3rdParty/Breakpad/README.md82
-rw-r--r--3rdParty/Breakpad/breakpad.pc.in10
-rw-r--r--3rdParty/Breakpad/default.xml43
-rw-r--r--3rdParty/Breakpad/src/COPYING28
-rw-r--r--3rdParty/Breakpad/src/breakpad_googletest_includes.h57
-rw-r--r--3rdParty/Breakpad/src/client/mac/crash_generation/ConfigFile.h83
-rw-r--r--3rdParty/Breakpad/src/client/mac/crash_generation/ConfigFile.mm167
-rw-r--r--3rdParty/Breakpad/src/client/mac/crash_generation/Inspector.h162
-rw-r--r--3rdParty/Breakpad/src/client/mac/crash_generation/Inspector.mm362
-rw-r--r--3rdParty/Breakpad/src/client/mac/crash_generation/InspectorMain.mm65
-rw-r--r--3rdParty/Breakpad/src/client/mac/crash_generation/client_info.h47
-rw-r--r--3rdParty/Breakpad/src/client/mac/crash_generation/crash_generation_server.cc166
-rw-r--r--3rdParty/Breakpad/src/client/mac/handler/breakpad_nlist_64.cc17
-rw-r--r--3rdParty/Breakpad/src/client/mac/handler/dynamic_images.cc19
-rw-r--r--3rdParty/Breakpad/src/client/mac/handler/dynamic_images.h2
-rw-r--r--3rdParty/Breakpad/src/client/mac/handler/exception_handler.cc170
-rw-r--r--3rdParty/Breakpad/src/client/mac/handler/exception_handler.h8
-rw-r--r--3rdParty/Breakpad/src/client/mac/handler/mach_vm_compat.h7
-rw-r--r--3rdParty/Breakpad/src/client/mac/handler/minidump_generator.cc324
-rw-r--r--3rdParty/Breakpad/src/client/mac/handler/minidump_generator.h36
-rw-r--r--3rdParty/Breakpad/src/client/mac/handler/protected_memory_allocator.cc92
-rw-r--r--3rdParty/Breakpad/src/client/mac/handler/protected_memory_allocator.h85
-rw-r--r--3rdParty/Breakpad/src/client/mac/handler/ucontext_compat.h47
-rw-r--r--3rdParty/Breakpad/src/client/minidump_file_writer.cc98
-rw-r--r--3rdParty/Breakpad/src/client/minidump_file_writer.h6
-rw-r--r--3rdParty/Breakpad/src/client/minidump_file_writer_unittest.cc179
-rw-r--r--3rdParty/Breakpad/src/client/windows/common/auto_critical_section.h81
-rw-r--r--3rdParty/Breakpad/src/client/windows/common/ipc_protocol.h4
-rw-r--r--3rdParty/Breakpad/src/client/windows/crash_generation/ReadMe.txt58
-rw-r--r--3rdParty/Breakpad/src/client/windows/crash_generation/client_info.cc223
-rw-r--r--3rdParty/Breakpad/src/client/windows/crash_generation/client_info.h177
-rw-r--r--3rdParty/Breakpad/src/client/windows/crash_generation/crash_generation_client.cc20
-rw-r--r--3rdParty/Breakpad/src/client/windows/crash_generation/crash_generation_client.h2
-rw-r--r--3rdParty/Breakpad/src/client/windows/crash_generation/crash_generation_server.cc943
-rw-r--r--3rdParty/Breakpad/src/client/windows/crash_generation/crash_generation_server.h299
-rw-r--r--3rdParty/Breakpad/src/client/windows/crash_generation/minidump_generator.cc583
-rw-r--r--3rdParty/Breakpad/src/client/windows/crash_generation/minidump_generator.h203
-rw-r--r--3rdParty/Breakpad/src/client/windows/handler/exception_handler.cc447
-rw-r--r--3rdParty/Breakpad/src/client/windows/handler/exception_handler.h107
-rw-r--r--3rdParty/Breakpad/src/common/basictypes.h58
-rw-r--r--3rdParty/Breakpad/src/common/byte_cursor_unittest.cc776
-rw-r--r--3rdParty/Breakpad/src/common/convert_UTF.c53
-rw-r--r--3rdParty/Breakpad/src/common/convert_UTF.h53
-rw-r--r--3rdParty/Breakpad/src/common/dwarf/bytereader-inl.h29
-rw-r--r--3rdParty/Breakpad/src/common/dwarf/bytereader.cc11
-rw-r--r--3rdParty/Breakpad/src/common/dwarf/bytereader.h31
-rw-r--r--3rdParty/Breakpad/src/common/dwarf/bytereader_unittest.cc707
-rw-r--r--3rdParty/Breakpad/src/common/dwarf/cfi_assembler.cc204
-rw-r--r--3rdParty/Breakpad/src/common/dwarf/cfi_assembler.h271
-rw-r--r--3rdParty/Breakpad/src/common/dwarf/dwarf2diehandler.cc10
-rw-r--r--3rdParty/Breakpad/src/common/dwarf/dwarf2diehandler.h18
-rw-r--r--3rdParty/Breakpad/src/common/dwarf/dwarf2diehandler_unittest.cc527
-rw-r--r--3rdParty/Breakpad/src/common/dwarf/dwarf2enums.h37
-rw-r--r--3rdParty/Breakpad/src/common/dwarf/dwarf2reader.cc617
-rw-r--r--3rdParty/Breakpad/src/common/dwarf/dwarf2reader.h449
-rw-r--r--3rdParty/Breakpad/src/common/dwarf/dwarf2reader_cfi_unittest.cc2555
-rw-r--r--3rdParty/Breakpad/src/common/dwarf/dwarf2reader_die_unittest.cc487
-rw-r--r--3rdParty/Breakpad/src/common/dwarf/dwarf2reader_test_common.h149
-rw-r--r--3rdParty/Breakpad/src/common/dwarf/elf_reader.cc1273
-rw-r--r--3rdParty/Breakpad/src/common/dwarf/elf_reader.h166
-rw-r--r--3rdParty/Breakpad/src/common/dwarf/functioninfo.cc231
-rw-r--r--3rdParty/Breakpad/src/common/dwarf/functioninfo.h188
-rw-r--r--3rdParty/Breakpad/src/common/dwarf/types.h8
-rw-r--r--3rdParty/Breakpad/src/common/dwarf_cfi_to_module.cc39
-rw-r--r--3rdParty/Breakpad/src/common/dwarf_cfi_to_module.h12
-rw-r--r--3rdParty/Breakpad/src/common/dwarf_cfi_to_module_unittest.cc306
-rw-r--r--3rdParty/Breakpad/src/common/dwarf_cu_to_module.cc336
-rw-r--r--3rdParty/Breakpad/src/common/dwarf_cu_to_module.h105
-rw-r--r--3rdParty/Breakpad/src/common/dwarf_cu_to_module_unittest.cc1852
-rw-r--r--3rdParty/Breakpad/src/common/dwarf_line_to_module.cc27
-rw-r--r--3rdParty/Breakpad/src/common/dwarf_line_to_module.h8
-rw-r--r--3rdParty/Breakpad/src/common/dwarf_line_to_module_unittest.cc391
-rw-r--r--3rdParty/Breakpad/src/common/language.cc130
-rw-r--r--3rdParty/Breakpad/src/common/language.h17
-rw-r--r--3rdParty/Breakpad/src/common/linux/linux_libc_support.h17
-rw-r--r--3rdParty/Breakpad/src/common/mac/Breakpad.xcconfig52
-rw-r--r--3rdParty/Breakpad/src/common/mac/BreakpadDebug.xcconfig32
-rw-r--r--3rdParty/Breakpad/src/common/mac/BreakpadRelease.xcconfig34
-rw-r--r--3rdParty/Breakpad/src/common/mac/GTMDefines.h456
-rw-r--r--3rdParty/Breakpad/src/common/mac/GTMLogger.h504
-rw-r--r--3rdParty/Breakpad/src/common/mac/GTMLogger.m611
-rw-r--r--3rdParty/Breakpad/src/common/mac/HTTPMultipartUpload.h61
-rw-r--r--3rdParty/Breakpad/src/common/mac/HTTPMultipartUpload.m267
-rw-r--r--3rdParty/Breakpad/src/common/mac/MachIPC.h8
-rw-r--r--3rdParty/Breakpad/src/common/mac/arch_utilities.cc231
-rw-r--r--3rdParty/Breakpad/src/common/mac/arch_utilities.h47
-rw-r--r--3rdParty/Breakpad/src/common/mac/byteswap.h25
-rw-r--r--3rdParty/Breakpad/src/common/mac/dump_syms.cc646
-rw-r--r--3rdParty/Breakpad/src/common/mac/dump_syms.h76
-rw-r--r--3rdParty/Breakpad/src/common/mac/dump_syms.mm496
-rw-r--r--3rdParty/Breakpad/src/common/mac/file_id.cc19
-rw-r--r--3rdParty/Breakpad/src/common/mac/file_id.h17
-rw-r--r--3rdParty/Breakpad/src/common/mac/launch_reporter.cc84
-rw-r--r--3rdParty/Breakpad/src/common/mac/launch_reporter.h43
-rw-r--r--3rdParty/Breakpad/src/common/mac/macho_id.cc65
-rw-r--r--3rdParty/Breakpad/src/common/mac/macho_id.h33
-rw-r--r--3rdParty/Breakpad/src/common/mac/macho_reader.cc47
-rw-r--r--3rdParty/Breakpad/src/common/mac/macho_reader.h21
-rw-r--r--3rdParty/Breakpad/src/common/mac/macho_reader_unittest.cc1902
-rw-r--r--3rdParty/Breakpad/src/common/mac/macho_utilities.cc89
-rw-r--r--3rdParty/Breakpad/src/common/mac/macho_utilities.h35
-rw-r--r--3rdParty/Breakpad/src/common/mac/macho_walker.cc69
-rw-r--r--3rdParty/Breakpad/src/common/mac/macho_walker.h26
-rw-r--r--3rdParty/Breakpad/src/common/mac/string_utilities.cc2
-rw-r--r--3rdParty/Breakpad/src/common/mac/super_fat_arch.h88
-rw-r--r--3rdParty/Breakpad/src/common/md5.cc8
-rw-r--r--3rdParty/Breakpad/src/common/md5.h2
-rw-r--r--3rdParty/Breakpad/src/common/memory.h193
-rw-r--r--3rdParty/Breakpad/src/common/memory_range.h145
-rw-r--r--3rdParty/Breakpad/src/common/memory_range_unittest.cc193
-rw-r--r--3rdParty/Breakpad/src/common/memory_unittest.cc124
-rw-r--r--3rdParty/Breakpad/src/common/minidump_type_helper.h56
-rw-r--r--3rdParty/Breakpad/src/common/module.cc125
-rw-r--r--3rdParty/Breakpad/src/common/module.h38
-rw-r--r--3rdParty/Breakpad/src/common/module_unittest.cc557
-rw-r--r--3rdParty/Breakpad/src/common/scoped_ptr.h404
-rw-r--r--3rdParty/Breakpad/src/common/simple_string_dictionary.cc45
-rw-r--r--3rdParty/Breakpad/src/common/simple_string_dictionary.h260
-rw-r--r--3rdParty/Breakpad/src/common/simple_string_dictionary_unittest.cc308
-rw-r--r--3rdParty/Breakpad/src/common/stabs_reader.h5
-rw-r--r--3rdParty/Breakpad/src/common/stabs_reader_unittest.cc611
-rw-r--r--3rdParty/Breakpad/src/common/stabs_to_module.cc7
-rw-r--r--3rdParty/Breakpad/src/common/stabs_to_module_unittest.cc258
-rw-r--r--3rdParty/Breakpad/src/common/stdio_wrapper.h43
-rw-r--r--3rdParty/Breakpad/src/common/string_conversion.cc42
-rw-r--r--3rdParty/Breakpad/src/common/string_conversion.h10
-rw-r--r--3rdParty/Breakpad/src/common/symbol_data.h42
-rw-r--r--3rdParty/Breakpad/src/common/test_assembler.cc359
-rw-r--r--3rdParty/Breakpad/src/common/test_assembler.h484
-rw-r--r--3rdParty/Breakpad/src/common/test_assembler_unittest.cc1662
-rw-r--r--3rdParty/Breakpad/src/common/unordered.h62
-rw-r--r--3rdParty/Breakpad/src/common/windows/dia_util.cc92
-rw-r--r--3rdParty/Breakpad/src/common/windows/dia_util.h64
-rw-r--r--3rdParty/Breakpad/src/common/windows/guid_string.h8
-rw-r--r--3rdParty/Breakpad/src/common/windows/http_upload.cc420
-rw-r--r--3rdParty/Breakpad/src/common/windows/http_upload.h129
-rw-r--r--3rdParty/Breakpad/src/common/windows/omap.cc716
-rw-r--r--3rdParty/Breakpad/src/common/windows/omap.h72
-rw-r--r--3rdParty/Breakpad/src/common/windows/omap_internal.h140
-rw-r--r--3rdParty/Breakpad/src/common/windows/omap_unittest.cc329
-rw-r--r--3rdParty/Breakpad/src/common/windows/pdb_source_line_writer.cc1412
-rw-r--r--3rdParty/Breakpad/src/common/windows/pdb_source_line_writer.h257
-rw-r--r--3rdParty/Breakpad/src/common/windows/string_utils-inl.h6
-rw-r--r--3rdParty/Breakpad/src/common/windows/string_utils.cc133
-rw-r--r--3rdParty/Breakpad/src/config.h.in91
-rw-r--r--3rdParty/Breakpad/src/google_breakpad/common/breakpad_types.h35
-rw-r--r--3rdParty/Breakpad/src/google_breakpad/common/minidump_cpu_amd64.h164
-rw-r--r--3rdParty/Breakpad/src/google_breakpad/common/minidump_cpu_arm.h14
-rw-r--r--3rdParty/Breakpad/src/google_breakpad/common/minidump_cpu_arm64.h140
-rw-r--r--3rdParty/Breakpad/src/google_breakpad/common/minidump_cpu_mips.h176
-rw-r--r--3rdParty/Breakpad/src/google_breakpad/common/minidump_cpu_ppc.h43
-rw-r--r--3rdParty/Breakpad/src/google_breakpad/common/minidump_cpu_ppc64.h39
-rw-r--r--3rdParty/Breakpad/src/google_breakpad/common/minidump_cpu_sparc.h29
-rw-r--r--3rdParty/Breakpad/src/google_breakpad/common/minidump_cpu_x86.h66
-rw-r--r--3rdParty/Breakpad/src/google_breakpad/common/minidump_exception_linux.h4
-rw-r--r--3rdParty/Breakpad/src/google_breakpad/common/minidump_exception_mac.h16
-rw-r--r--3rdParty/Breakpad/src/google_breakpad/common/minidump_exception_ps3.h67
-rw-r--r--3rdParty/Breakpad/src/google_breakpad/common/minidump_exception_win32.h2155
-rw-r--r--3rdParty/Breakpad/src/google_breakpad/common/minidump_format.h569
-rw-r--r--3rdParty/Breakpad/src/google_breakpad/common/minidump_size.h6
-rw-r--r--3rdParty/Breakpad/src/processor/scoped_ptr.h335
-rw-r--r--3rdParty/CppUnit/src/COPYING2
-rw-r--r--3rdParty/CppUnit/src/include/cppunit/Asserter.h117
-rw-r--r--3rdParty/CppUnit/src/include/cppunit/Message.h12
-rw-r--r--3rdParty/CppUnit/src/include/cppunit/Portability.h24
-rw-r--r--3rdParty/CppUnit/src/include/cppunit/Protector.h2
-rw-r--r--3rdParty/CppUnit/src/include/cppunit/SynchronizedObject.h12
-rw-r--r--3rdParty/CppUnit/src/include/cppunit/TestAssert.h228
-rw-r--r--3rdParty/CppUnit/src/include/cppunit/TestCaller.h31
-rw-r--r--3rdParty/CppUnit/src/include/cppunit/TestPath.h11
-rw-r--r--3rdParty/CppUnit/src/include/cppunit/TestResult.h8
-rw-r--r--3rdParty/CppUnit/src/include/cppunit/TestResultCollector.h11
-rw-r--r--3rdParty/CppUnit/src/include/cppunit/TestSuite.h6
-rw-r--r--3rdParty/CppUnit/src/include/cppunit/TextTestResult.h2
-rw-r--r--3rdParty/CppUnit/src/include/cppunit/XmlOutputter.h10
-rw-r--r--3rdParty/CppUnit/src/include/cppunit/config-auto.h161
-rw-r--r--3rdParty/CppUnit/src/include/cppunit/config/SelectDllLoader.h7
-rw-r--r--3rdParty/CppUnit/src/include/cppunit/config/config-msvc6.h21
-rw-r--r--3rdParty/CppUnit/src/include/cppunit/extensions/ExceptionTestCaseDecorator.h4
-rw-r--r--3rdParty/CppUnit/src/include/cppunit/extensions/HelperMacros.h24
-rw-r--r--3rdParty/CppUnit/src/include/cppunit/extensions/TestCaseDecorator.h9
-rw-r--r--3rdParty/CppUnit/src/include/cppunit/extensions/TestFactoryRegistry.h9
-rw-r--r--3rdParty/CppUnit/src/include/cppunit/extensions/TestNamer.h27
-rw-r--r--3rdParty/CppUnit/src/include/cppunit/extensions/TestSuiteBuilderContext.h19
-rw-r--r--3rdParty/CppUnit/src/include/cppunit/extensions/TypeInfoHelper.h6
-rw-r--r--3rdParty/CppUnit/src/include/cppunit/portability/CppUnitDeque.h25
-rw-r--r--3rdParty/CppUnit/src/include/cppunit/portability/CppUnitMap.h29
-rw-r--r--3rdParty/CppUnit/src/include/cppunit/portability/CppUnitSet.h28
-rw-r--r--3rdParty/CppUnit/src/include/cppunit/portability/CppUnitVector.h25
-rw-r--r--3rdParty/CppUnit/src/include/cppunit/tools/StringHelper.h45
-rw-r--r--3rdParty/CppUnit/src/include/cppunit/tools/StringTools.h4
-rw-r--r--3rdParty/CppUnit/src/include/cppunit/tools/XmlElement.h6
-rw-r--r--3rdParty/CppUnit/src/include/cppunit/ui/text/TextTestRunner.h6
-rw-r--r--3rdParty/CppUnit/src/src/cppunit/Asserter.cpp119
-rw-r--r--3rdParty/CppUnit/src/src/cppunit/BriefTestProgressListener.cpp2
-rw-r--r--3rdParty/CppUnit/src/src/cppunit/DefaultProtector.cpp2
-rw-r--r--3rdParty/CppUnit/src/src/cppunit/Exception.cpp8
-rw-r--r--3rdParty/CppUnit/src/src/cppunit/Message.cpp16
-rw-r--r--3rdParty/CppUnit/src/src/cppunit/Protector.cpp4
-rw-r--r--3rdParty/CppUnit/src/src/cppunit/ProtectorChain.cpp9
-rw-r--r--3rdParty/CppUnit/src/src/cppunit/ProtectorChain.h8
-rw-r--r--3rdParty/CppUnit/src/src/cppunit/ProtectorContext.h7
-rw-r--r--3rdParty/CppUnit/src/src/cppunit/SourceLine.cpp1
-rw-r--r--3rdParty/CppUnit/src/src/cppunit/TestCase.cpp2
-rw-r--r--3rdParty/CppUnit/src/src/cppunit/TestFactoryRegistry.cpp6
-rw-r--r--3rdParty/CppUnit/src/src/cppunit/TestNamer.cpp14
-rw-r--r--3rdParty/CppUnit/src/src/cppunit/TestPath.cpp4
-rw-r--r--3rdParty/CppUnit/src/src/cppunit/TestResult.cpp6
-rw-r--r--3rdParty/CppUnit/src/src/cppunit/TestResultCollector.cpp3
-rw-r--r--3rdParty/CppUnit/src/src/cppunit/TestSuite.cpp3
-rw-r--r--3rdParty/CppUnit/src/src/cppunit/TestSuiteBuilderContext.cpp1
-rw-r--r--3rdParty/CppUnit/src/src/cppunit/TextTestProgressListener.cpp2
-rw-r--r--3rdParty/CppUnit/src/src/cppunit/TypeInfoHelper.cpp27
-rw-r--r--3rdParty/CppUnit/src/src/cppunit/XmlDocument.cpp2
-rw-r--r--3rdParty/CppUnit/src/src/cppunit/XmlElement.cpp5
-rw-r--r--3rdParty/CppUnit/src/src/cppunit/XmlOutputter.cpp5
-rw-r--r--3rdParty/Expat/SConscript60
-rw-r--r--3rdParty/Expat/src/ascii.h32
-rw-r--r--3rdParty/Expat/src/asciitab.h32
-rw-r--r--3rdParty/Expat/src/expat.h37
-rw-r--r--3rdParty/Expat/src/expat_external.h92
-rw-r--r--3rdParty/Expat/src/iasciitab.h32
-rw-r--r--3rdParty/Expat/src/internal.h36
-rw-r--r--3rdParty/Expat/src/latin1tab.h32
-rw-r--r--3rdParty/Expat/src/loadlibrary.c143
-rw-r--r--3rdParty/Expat/src/nametab.h32
-rw-r--r--3rdParty/Expat/src/siphash.h81
-rw-r--r--3rdParty/Expat/src/utf8tab.h33
-rw-r--r--3rdParty/Expat/src/winconfig.h41
-rw-r--r--3rdParty/Expat/src/xmlparse.c3201
-rw-r--r--3rdParty/Expat/src/xmlrole.c62
-rw-r--r--3rdParty/Expat/src/xmlrole.h32
-rw-r--r--3rdParty/Expat/src/xmltok.c103
-rw-r--r--3rdParty/Expat/src/xmltok.h37
-rw-r--r--3rdParty/Expat/src/xmltok_impl.c132
-rw-r--r--3rdParty/Expat/src/xmltok_impl.h31
-rw-r--r--3rdParty/Expat/src/xmltok_ns.c33
-rw-r--r--3rdParty/LibIDN/SConscript4
-rw-r--r--3rdParty/LibNATPMP/SConscript1
-rw-r--r--3rdParty/OpenSSL/SConscript7
-rw-r--r--3rdParty/SCons/02_fix_python_3_windows_unicode.diff13
-rw-r--r--3rdParty/SCons/scons-2.4.0/CHANGES.txt5899
-rw-r--r--3rdParty/SCons/scons-2.4.0/LICENSE.txt20
-rw-r--r--3rdParty/SCons/scons-2.4.0/MANIFEST211
-rw-r--r--3rdParty/SCons/scons-2.4.0/PKG-INFO13
-rw-r--r--3rdParty/SCons/scons-2.4.0/README.txt250
-rw-r--r--3rdParty/SCons/scons-2.4.0/RELEASE.txt48
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Action.py1258
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Builder.py869
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/CacheDir.py222
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Conftest.py793
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Debug.py234
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Defaults.py513
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Environment.py2448
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Errors.py205
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Executor.py678
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Job.py435
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Memoize.py245
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Node/Alias.py181
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Node/FS.py3612
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Node/Python.py164
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Node/__init__.py1718
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Options/BoolOption.py50
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Options/EnumOption.py50
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Options/ListOption.py50
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Options/PackageOption.py50
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Options/PathOption.py76
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Options/__init__.py67
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/PathList.py227
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Platform/__init__.py264
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Platform/aix.py85
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Platform/cygwin.py55
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Platform/darwin.py70
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Platform/hpux.py46
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Platform/irix.py44
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Platform/os2.py58
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Platform/posix.py124
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Platform/sunos.py50
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Platform/win32.py415
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/SConf.py1054
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/SConsign.py413
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Scanner/C.py132
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Scanner/D.py73
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Scanner/Dir.py109
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Scanner/Fortran.py316
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Scanner/IDL.py48
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Scanner/LaTeX.py390
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Scanner/Prog.py116
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Scanner/RC.py55
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Scanner/__init__.py413
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Script/Interactive.py384
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Script/Main.py1437
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Script/SConsOptions.py1020
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Script/SConscript.py640
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Script/__init__.py412
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Sig.py63
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Subst.py912
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Taskmaster.py1049
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/386asm.py61
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/BitKeeper.py67
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/CVS.py73
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/DCommon.py56
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/FortranCommon.py279
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/GettextCommon.py430
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/JavaCommon.py324
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/MSCommon/__init__.py56
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/MSCommon/arch.py67
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/MSCommon/common.py260
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/MSCommon/netframework.py82
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/MSCommon/sdk.py414
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/MSCommon/vc.py505
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/MSCommon/vs.py566
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/Perforce.py103
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/PharLapCommon.py137
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/RCS.py64
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/SCCS.py64
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/Subversion.py71
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/__init__.py845
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/aixc++.py75
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/aixcc.py74
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/aixf77.py80
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/aixlink.py77
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/applelink.py71
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/ar.py63
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/as.py78
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/bcc32.py81
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/c++.py100
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/cc.py105
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/cvf.py58
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/cyglink.py94
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/default.py50
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/dmd.py152
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/docbook/__init__.py882
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/dvi.py64
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/dvipdf.py125
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/dvips.py95
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/f03.py63
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/f77.py62
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/f90.py62
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/f95.py63
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/filesystem.py98
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/fortran.py62
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/g++.py80
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/g77.py73
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/gas.py53
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/gcc.py100
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/gdc.py128
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/gettext.py48
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/gfortran.py64
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/gnulink.py67
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/gs.py91
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/hpc++.py84
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/hpcc.py53
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/hplink.py77
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/icc.py59
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/icl.py52
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/ifl.py72
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/ifort.py88
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/ilink.py59
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/ilink32.py60
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/install.py501
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/intelc.py608
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/ipkg.py67
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/jar.py116
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/javac.py232
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/javah.py137
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/latex.py80
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/ldc.py144
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/lex.py97
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/link.py218
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/linkloc.py112
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/m4.py63
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/masm.py77
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/midl.py88
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/mingw.py180
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/msgfmt.py108
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/msginit.py120
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/msgmerge.py104
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/mslib.py64
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/mslink.py335
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/mssdk.py50
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/msvc.py278
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/msvs.py2029
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/mwcc.py207
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/mwld.py107
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/nasm.py72
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/packaging/__init__.py314
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/packaging/ipk.py185
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/packaging/msi.py527
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/packaging/rpm.py358
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/packaging/src_tarbz2.py43
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/packaging/src_targz.py43
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/packaging/src_zip.py43
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/packaging/tarbz2.py44
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/packaging/targz.py44
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/packaging/zip.py44
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/pdf.py78
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/pdflatex.py84
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/pdftex.py109
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/qt.py336
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/rmic.py126
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/rpcgen.py70
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/rpm.py132
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/rpmutils.py543
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/sgiar.py68
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/sgic++.py58
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/sgicc.py53
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/sgilink.py62
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/sunar.py67
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/sunc++.py142
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/suncc.py58
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/sunf77.py63
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/sunf90.py64
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/sunf95.py64
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/sunlink.py76
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/swig.py189
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/tar.py73
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/tex.py992
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/textfile.py175
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/tlib.py53
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/wix.py104
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/xgettext.py339
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/yacc.py140
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/zip.py100
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Util.py1492
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Variables/BoolVariable.py89
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Variables/EnumVariable.py103
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Variables/ListVariable.py135
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Variables/PackageVariable.py106
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Variables/PathVariable.py147
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Variables/__init__.py312
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/Warnings.py252
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/__init__.py49
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/compat/__init__.py237
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/compat/_scons_builtins.py107
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/compat/_scons_collections.py45
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/compat/_scons_dbm.py45
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/compat/_scons_hashlib.py76
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/compat/_scons_io.py45
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/compat/_scons_sets.py563
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/compat/_scons_subprocess.py1281
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/cpp.py590
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/dblite.py254
-rw-r--r--3rdParty/SCons/scons-2.4.0/engine/SCons/exitfuncs.py64
-rw-r--r--3rdParty/SCons/scons-2.4.0/scons-time.1795
-rw-r--r--3rdParty/SCons/scons-2.4.0/scons.119588
-rw-r--r--3rdParty/SCons/scons-2.4.0/sconsign.1164
-rw-r--r--3rdParty/SCons/scons-2.4.0/script/scons205
-rw-r--r--3rdParty/SCons/scons-2.4.0/script/scons-time1544
-rw-r--r--3rdParty/SCons/scons-2.4.0/script/scons.bat34
-rw-r--r--3rdParty/SCons/scons-2.4.0/script/sconsign514
-rw-r--r--3rdParty/SCons/scons-2.4.0/setup.cfg5
-rw-r--r--3rdParty/SCons/scons-2.4.0/setup.py515
-rw-r--r--3rdParty/SCons/scons-3.0.1/Announce.txt1270
-rw-r--r--3rdParty/SCons/scons-3.0.1/CHANGES.txt6183
-rw-r--r--3rdParty/SCons/scons-3.0.1/LICENSE.txt20
-rw-r--r--3rdParty/SCons/scons-3.0.1/MANIFEST.in0
-rw-r--r--3rdParty/SCons/scons-3.0.1/README.txt250
-rw-r--r--3rdParty/SCons/scons-3.0.1/RELEASE.txt73
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/MANIFEST-xml.in8
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/MANIFEST.in179
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Action.py1393
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Action.xml146
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/ActionTests.py2131
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Builder.py888
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/BuilderTests.py1651
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/CacheDir.py281
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/CacheDirTests.py304
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Conftest.py812
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Debug.py243
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Defaults.py593
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Defaults.xml586
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/DefaultsTests.py92
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Environment.py2443
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Environment.xml3661
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/EnvironmentTests.py3992
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/EnvironmentValues.py98
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/EnvironmentValuesTest.py16
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Errors.py229
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/ErrorsTests.py111
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Executor.py670
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/ExecutorTests.py497
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Job.py435
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/JobTests.py542
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Memoize.py245
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/MemoizeTests.py182
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Node/Alias.py181
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Node/AliasTests.py131
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Node/FS.py3545
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Node/FSTests.py3787
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Node/NodeTests.py1366
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Node/Python.py171
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Node/PythonTests.py131
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Node/__init__.py1734
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Options/BoolOption.py50
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Options/EnumOption.py50
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Options/ListOption.py50
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Options/PackageOption.py50
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Options/PathOption.py76
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Options/__init__.py67
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/PathList.py227
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/PathListTests.py207
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Platform/PlatformTests.py223
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Platform/__init__.py267
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Platform/__init__.xml244
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Platform/aix.py85
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Platform/cygwin.py55
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Platform/darwin.py74
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Platform/hpux.py46
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Platform/irix.py44
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Platform/os2.py58
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Platform/posix.py126
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Platform/posix.xml80
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Platform/sunos.py50
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Platform/sunos.xml55
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Platform/win32.py470
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Platform/win32.xml37
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/SConf.py1053
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/SConfTests.py789
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/SConsign.py426
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/SConsignTests.py402
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Scanner/C.py131
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Scanner/CTests.py469
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Scanner/D.py73
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Scanner/DTests.py282
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Scanner/Dir.py109
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Scanner/DirTests.py137
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Scanner/Fortran.py316
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Scanner/FortranTests.py542
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Scanner/IDL.py48
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Scanner/IDLTests.py454
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Scanner/LaTeX.py437
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Scanner/LaTeXTests.py174
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Scanner/Prog.py116
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Scanner/ProgTests.py283
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Scanner/RC.py66
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Scanner/RCTests.py176
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Scanner/SWIG.py45
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Scanner/ScannerTests.py634
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Scanner/__init__.py421
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Scanner/__init__.xml91
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Script/Interactive.py376
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Script/Main.py1427
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Script/Main.xml818
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Script/MainTests.py55
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Script/SConsOptions.py988
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Script/SConscript.py640
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Script/SConscript.xml602
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Script/SConscriptTests.py34
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Script/__init__.py429
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Subst.py929
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Subst.xml73
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/SubstTests.py1266
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Taskmaster.py1071
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/TaskmasterTests.py1249
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/386asm.py61
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/386asm.xml48
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/DCommon.py69
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/DCommon.xml71
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/FortranCommon.py280
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/GettextCommon.py469
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/JavaCommon.py324
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/JavaCommonTests.py582
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/MSCommon/__init__.py57
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/MSCommon/arch.py67
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/MSCommon/common.py247
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/MSCommon/netframework.py83
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/MSCommon/sdk.py403
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/MSCommon/vc.py573
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/MSCommon/vs.py573
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/PharLapCommon.py115
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/ToolTests.py89
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/__init__.py1254
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/__init__.xml527
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/aixc++.py43
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/aixc++.xml42
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/aixcc.py74
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/aixcc.xml41
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/aixcxx.py77
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/aixf77.py80
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/aixf77.xml40
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/aixlink.py81
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/aixlink.xml42
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/applelink.py79
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/applelink.xml155
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/ar.py63
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/ar.xml121
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/as.py78
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/as.xml125
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/bcc32.py81
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/bcc32.xml55
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/c++.py44
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/c++.xml141
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/cc.py105
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/cc.xml208
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/clang.py83
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/clang.xml39
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/clangxx.py91
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/clangxx.xml41
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/cvf.py58
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/cvf.xml53
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/cxx.py100
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/cyglink.py236
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/cyglink.xml49
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/default.py50
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/default.xml35
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/dmd.py161
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/dmd.xml371
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/__init__.py883
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/__init__.xml608
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/.CatalogManager.properties.example61
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/.urilist1
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/AUTHORS4
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/BUGS21
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/COPYING47
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/INSTALL88
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/Makefile89
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/NEWS139
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/NEWS.html25
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/NEWS.xml145
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/README157
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/RELEASE-NOTES.html8353
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/RELEASE-NOTES.txt8575
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/RELEASE-NOTES.xml10327
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/TODO23
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/VERSION115
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/catalog.xml8
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/af.xml1229
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/am.xml1229
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/ar.xml1229
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/as.xml660
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/ast.xml660
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/autoidx-kimber.xsl44
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/autoidx-kosek.xsl154
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/az.xml672
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/bg.xml724
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/bn.xml1229
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/bn_in.xml660
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/bs.xml662
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/ca.xml660
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/charmap.xml185
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/charmap.xsl221
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/common.xml622
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/common.xsl2039
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/cs.xml700
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/cy.xml1245
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/da.xml664
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/de.xml666
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/el.xml729
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/en.xml1229
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/entities.ent67
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/eo.xml1229
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/es.xml676
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/et.xml1229
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/eu.xml1229
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/fa.xml660
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/fi.xml670
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/fr.xml690
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/ga.xml1229
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/gentext.xsl839
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/gl.xml1229
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/gu.xml660
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/he.xml1229
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/hi.xml660
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/hr.xml662
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/hu.xml678
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/id.xml1229
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/insertfile.xsl111
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/is.xml672
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/it.xml1229
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/ja.xml660
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/ka.xml700
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/kn.xml1229
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/ko.xml1229
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/ky.xml732
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/l10n.dtd64
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/l10n.xml77
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/l10n.xsl593
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/la.xml1229
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/labels.xsl890
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/lt.xml678
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/lv.xml1229
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/ml.xml660
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/mn.xml730
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/mr.xml660
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/nb.xml1229
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/nds.xml666
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/nl.xml660
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/nn.xml1229
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/olink.xsl1225
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/or.xml1229
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/pa.xml660
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/pi.xml168
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/pi.xsl346
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/pl.xml678
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/pt.xml1229
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/pt_br.xml1229
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/refentry.xml781
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/refentry.xsl1352
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/ro.xml1229
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/ru.xml726
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/sk.xml1229
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/sl.xml1229
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/sq.xml1229
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/sr.xml720
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/sr_Latn.xml679
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/stripns.xsl352
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/subtitles.xsl155
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/sv.xml664
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/ta.xml660
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/table.xsl514
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/targetdatabase.dtd49
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/targets.xsl333
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/te.xml660
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/th.xml1229
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/titles.xsl805
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/tl.xml1229
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/tr.xml666
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/uk.xml726
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/utility.xml259
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/utility.xsl290
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/vi.xml1229
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/xh.xml1229
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/zh.xml660
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/zh_cn.xml660
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/zh_tw.xml660
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/docsrc/authors.xml10
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/docsrc/copyright.xml18
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/docsrc/license.xml23
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/docsrc/reference.css79
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/docsrc/reference.xml229
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/docsrc/reference.xml.included33905
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/docsrc/warranty.xml11
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/eclipse/eclipse.xsl306
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/eclipse/eclipse3.xsl111
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/eclipse/profile-eclipse.xsl269
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/epub/README88
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/epub/bin/dbtoepub76
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/epub/bin/lib/docbook.rb227
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/epub/bin/xslt/obfuscate.xsl12
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/epub/docbook.xsl1690
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/extensions/LICENSE.txt264
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/extensions/NOTICE.txt12
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/extensions/README.LIBXSLT52
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/extensions/README.txt4
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/extensions/docbook.py240
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/extensions/xslt.py85
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/admon.xsl130
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/annotations.xsl18
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/autoidx-kimber.xsl172
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/autoidx-kosek.xsl139
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/autoidx-ng.xsl20
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/autoidx.xsl1330
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/autotoc.xsl915
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/axf.xsl110
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/biblio-iso690.xsl1300
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/biblio.xsl1169
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/block.xsl654
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/callout.xsl231
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/component.xsl887
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/division.xsl612
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/docbook.xsl335
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/ebnf.xsl325
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/fo-rtf.xsl154
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/fo.xsl117
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/footnote.xsl220
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/fop.xsl93
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/fop1.xsl223
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/formal.xsl642
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/glossary.xsl1169
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/graphics.xsl648
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/highlight.xsl77
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/htmltbl.xsl425
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/index.xsl484
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/info.xsl34
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/inline.xsl1288
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/keywords.xsl21
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/lists.xsl1393
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/math.xsl140
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/pagesetup.xsl2569
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/param.xml12445
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/param.xsl946
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/passivetex.xsl36
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/pdf2index140
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/pi.xml1002
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/pi.xsl1092
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/profile-docbook.xsl289
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/ptc.xsl77
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/qandaset.xsl395
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/refentry.xsl638
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/sections.xsl764
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/spaces.xsl274
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/synop.xsl1007
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/table.xml135
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/table.xsl1681
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/task.xsl91
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/titlepage.templates.xml1354
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/titlepage.templates.xsl5182
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/titlepage.xsl767
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/toc.xsl332
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/verbatim.xsl465
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/xep.xsl180
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/xref.xsl1538
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/highlighting/README16
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/highlighting/c-hl.xml101
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/highlighting/common.xsl120
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/highlighting/cpp-hl.xml150
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/highlighting/csharp-hl.xml187
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/highlighting/delphi-hl.xml200
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/highlighting/ini-hl.xml45
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/highlighting/java-hl.xml117
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/highlighting/javascript-hl.xml147
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/highlighting/m2-hl.xml90
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/highlighting/myxml-hl.xml116
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/highlighting/perl-hl.xml120
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/highlighting/php-hl.xml149
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/highlighting/python-hl.xml100
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/highlighting/ruby-hl.xml109
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/highlighting/tcl-hl.xml180
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/highlighting/xslthl-config.xml46
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/admon.xsl134
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/annotations.xsl169
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/autoidx-kimber.xsl165
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/autoidx-kosek.xsl120
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/autoidx-ng.xsl20
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/autoidx.xsl739
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/autotoc.xsl707
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/biblio-iso690.xsl1300
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/biblio.xsl1253
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/block.xsl538
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/callout.xsl201
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/changebars.xsl121
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/chunk-changebars.xsl99
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/chunk-code.xsl674
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/chunk-common.xsl1920
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/chunk.xsl52
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/chunker.xsl439
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/chunkfast.xsl72
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/chunktoc.xsl543
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/component.xsl425
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/division.xsl217
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/docbook.css.xml109
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/docbook.xsl480
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/ebnf.xsl329
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/footnote.xsl313
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/formal.xsl425
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/glossary.xsl492
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/graphics.xsl1515
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/highlight.xsl86
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/html-rtf.xsl336
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/html.xsl612
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/htmltbl.xsl135
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/index.xsl288
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/info.xsl43
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/inline.xsl1490
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/keywords.xsl35
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/lists.xsl1183
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/maketoc.xsl86
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/manifest.xsl22
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/math.xsl270
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/oldchunker.xsl202
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/onechunk.xsl37
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/param.xml10905
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/param.xsl434
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/pi.xml1113
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/pi.xsl1263
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/profile-chunk-code.xsl615
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/profile-chunk.xsl52
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/profile-docbook.xsl413
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/profile-onechunk.xsl37
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/qandaset.xsl437
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/refentry.xsl299
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/sections.xsl615
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/synop.xsl1554
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/table.xsl1200
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/task.xsl76
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/titlepage.templates.xml708
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/titlepage.templates.xsl3817
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/titlepage.xsl1047
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/toc.xsl350
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/verbatim.xsl410
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/xref.xsl1377
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/htmlhelp/htmlhelp-common.xsl1120
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/htmlhelp/htmlhelp.xsl22
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/htmlhelp/profile-htmlhelp-common.xsl1083
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/htmlhelp/profile-htmlhelp.xsl22
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/callouts/1.svg15
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/callouts/10.svg18
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/callouts/11.svg16
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/callouts/12.svg18
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/callouts/13.svg20
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/callouts/14.svg17
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/callouts/15.svg19
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/callouts/16.svg20
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/callouts/17.svg17
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/callouts/18.svg21
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/callouts/19.svg20
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/callouts/2.svg17
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/callouts/20.svg20
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/callouts/21.svg18
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/callouts/22.svg20
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/callouts/23.svg22
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/callouts/24.svg19
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/callouts/25.svg21
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/callouts/26.svg22
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/callouts/27.svg19
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/callouts/28.svg23
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/callouts/29.svg22
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/callouts/3.svg19
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/callouts/30.svg22
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/callouts/4.svg16
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/callouts/5.svg18
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/callouts/6.svg19
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/callouts/7.svg16
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/callouts/8.svg20
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/callouts/9.svg19
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/caution.svg25
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/colorsvg/caution.svg141
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/colorsvg/home.svg498
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/colorsvg/important.svg239
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/colorsvg/next.svg338
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/colorsvg/note.svg200
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/colorsvg/prev.svg338
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/colorsvg/tip.svg367
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/colorsvg/up.svg338
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/colorsvg/warning.svg232
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/home.svg26
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/important.svg25
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/next.svg19
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/note.svg33
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/prev.svg19
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/tip.svg31
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/up.svg19
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/warning.svg23
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/install.sh977
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/javahelp/javahelp.xsl625
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/javahelp/profile-javahelp.xsl549
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/lib/lib.xsl480
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/manpages/ChangeLog.20020917195
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/manpages/block.xsl411
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/manpages/charmap.groff.xsl6013
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/manpages/docbook.xsl311
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/manpages/endnotes.xsl586
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/manpages/html-synop.xsl1567
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/manpages/info.xsl800
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/manpages/inline.xsl219
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/manpages/lists.xsl604
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/manpages/other.xsl888
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/manpages/param.xml3220
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/manpages/param.xsl193
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/manpages/pi.xml70
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/manpages/pi.xsl79
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/manpages/profile-docbook.xsl281
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/manpages/refentry.xsl319
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/manpages/synop.xsl432
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/manpages/table.xsl633
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/manpages/utility.xsl555
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/abstract.notitle.enabled.xml22
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/abstract.properties.xml32
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/abstract.title.properties.xml39
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/active.toc.xml29
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/ade.extensions.xml32
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/admon.graphics.extension.xml27
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/admon.graphics.path.xml27
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/admon.graphics.xml29
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/admon.style.xml31
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/admon.textlabel.xml32
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/admonition.properties.xml25
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/admonition.title.properties.xml32
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/alignment.xml41
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/annotate.toc.xml28
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/annotation.css.xml71
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/annotation.graphic.close.xml31
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/annotation.graphic.open.xml28
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/annotation.js.xml33
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/annotation.support.xml29
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/appendix.autolabel.xml73
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/arbortext.extensions.xml30
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/article.appendix.title.properties.xml33
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/author.othername.in.middle.xml31
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/autolayout-file.xml29
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/autotoc.label.in.hyperlink.xml29
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/autotoc.label.separator.xml27
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/axf.extensions.xml33
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/banner.before.navigation.xml25
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/base.dir.xml29
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/biblioentry.item.separator.xml26
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/biblioentry.properties.xml28
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/bibliography.collection.xml104
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/bibliography.numbered.xml27
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/bibliography.style.xml35
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/blockquote.properties.xml34
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/blurb.on.titlepage.enabled.xml31
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/body.attributes.xml31
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/body.bg.color.xml28
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/body.end.indent.xml37
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/body.font.family.xml32
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/body.font.master.xml30
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/body.font.size.xml31
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/body.margin.bottom.xml29
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/body.margin.top.xml28
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/body.start.indent.xml64
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/bookmarks.collapse.xml31
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/bridgehead.in.toc.xml28
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/bullet.image.xml28
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/callout.defaultcolumn.xml30
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/callout.graphics.extension.xml33
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/callout.graphics.number.limit.xml34
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/callout.graphics.path.xml31
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/callout.graphics.xml30
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/callout.icon.size.xml28
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/callout.list.table.xml32
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/callout.unicode.font.xml29
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/callout.unicode.number.limit.xml35
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/callout.unicode.start.character.xml33
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/callout.unicode.xml26
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/callouts.extension.xml30
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/chapter.autolabel.xml71
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/chunk.append.xml30
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/chunk.first.sections.xml31
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/chunk.quietly.xml30
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/chunk.section.depth.xml27
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/chunk.sections.xml30
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/chunk.separate.lots.xml36
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/chunk.toc.xml30
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/chunk.tocs.and.lots.has.title.xml28
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/chunk.tocs.and.lots.xml32
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/chunker.output.cdata-section-elements.xml30
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/chunker.output.doctype-public.xml31
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/chunker.output.doctype-system.xml31
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/chunker.output.encoding.xml31
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/chunker.output.indent.xml30
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/chunker.output.media-type.xml35
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/chunker.output.method.xml32
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/chunker.output.omit-xml-declaration.xml30
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/chunker.output.standalone.xml31
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/citerefentry.link.xml29
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/collect.xref.targets.xml33
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/column.count.back.xml27
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/column.count.body.xml27
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/column.count.front.xml27
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/column.count.index.xml27
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/column.count.lot.xml28
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/column.count.titlepage.xml27
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/column.gap.back.xml28
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/column.gap.body.xml28
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/column.gap.front.xml28
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/column.gap.index.xml28
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/column.gap.lot.xml28
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/column.gap.titlepage.xml29
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/compact.list.item.spacing.xml28
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/component.label.includes.part.label.xml39
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/component.title.properties.xml40
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/component.titlepage.properties.xml33
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/contrib.inline.enabled.xml26
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/crop.mark.bleed.xml28
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/crop.mark.offset.xml28
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/crop.mark.width.xml28
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/crop.marks.xml28
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/css.decoration.xml33
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/css.stylesheet.dir.xml33
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/css.stylesheet.xml29
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/current.docid.xml27
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/currentpage.marker.xml25
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/custom.css.source.xml119
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/default.float.class.xml34
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/default.image.width.xml30
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/default.table.frame.xml28
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/default.table.rules.xml76
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/default.table.width.xml26
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/default.units.xml37
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/dingbat.font.family.xml33
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/docbook.css.link.xml42
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/docbook.css.source.xml83
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/double.sided.xml31
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/draft.mode.xml36
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/draft.watermark.image.xml27
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/dry-run.xml27
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/dynamic.toc.xml29
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/ebnf.assignment.xml39
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/ebnf.statement.terminator.xml32
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/ebnf.table.bgcolor.xml30
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/ebnf.table.border.xml26
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/eclipse.autolabel.xml28
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/eclipse.plugin.id.xml28
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/eclipse.plugin.name.xml27
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/eclipse.plugin.provider.xml27
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/editedby.enabled.xml27
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/email.delimiters.enabled.xml34
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/email.mailto.enabled.xml29
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/emphasis.propagates.style.xml26
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/entry.propagates.style.xml30
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/epub.autolabel.xml28
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/equation.number.properties.xml28
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/equation.properties.xml27
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/example.properties.xml27
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/exsl.node.set.available.xml44
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/feedback.href.xml28
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/feedback.link.text.xml28
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/feedback.with.ids.xml27
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/figure.properties.xml27
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/filename-prefix.xml28
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/firstterm.only.link.xml29
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/foil.properties.xml37
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/foil.subtitle.properties.xml36
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/foil.title.master.xml29
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/foil.title.size.xml32
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/foilgroup.properties.xml31
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/foilgroup.toc.xml29
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/footer.column.widths.xml80
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/footer.content.properties.xml34
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/footer.hr.xml26
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/footer.rule.xml27
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/footer.table.height.xml32
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/footer.table.properties.xml30
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/footers.on.blank.pages.xml27
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/footnote.font.size.xml28
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/footnote.mark.properties.xml41
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/footnote.number.format.xml33
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/footnote.number.symbols.xml39
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/footnote.properties.xml43
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/footnote.sep.leader.properties.xml39
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/fop.extensions.xml36
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/fop1.extensions.xml34
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/formal.object.properties.xml36
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/formal.procedures.xml28
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/formal.title.placement.xml41
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/formal.title.properties.xml34
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/funcsynopsis.decoration.xml30
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/funcsynopsis.style.xml31
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/function.parens.xml29
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/generate.css.header.xml40
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/generate.id.attributes.xml59
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/generate.index.xml25
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/generate.legalnotice.link.xml72
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/generate.manifest.xml27
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/generate.meta.abstract.xml29
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/generate.revhistory.link.xml50
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/generate.section.toc.level.xml35
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/generate.toc.xml108
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/glossary.as.blocks.xml38
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/glossary.collection.xml252
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/glossary.sort.xml32
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/glossdef.block.properties.xml32
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/glossdef.list.properties.xml30
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/glossentry.list.item.properties.xml32
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/glossentry.show.acronym.xml37
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/glosslist.as.blocks.xml27
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/glossterm.auto.link.xml33
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/glossterm.block.properties.xml35
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/glossterm.list.properties.xml30
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/glossterm.separation.xml31
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/glossterm.width.xml28
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/graphic.default.extension.xml29
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/graphical.admonition.properties.xml42
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/graphics.dir.xml33
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/graphicsize.extension.xml30
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/graphicsize.use.img.src.path.xml30
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/header.column.widths.xml80
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/header.content.properties.xml34
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/header.hr.xml26
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/header.rule.xml27
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/header.table.height.xml32
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/header.table.properties.xml30
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/headers.on.blank.pages.xml27
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/hidetoc.image.xml29
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/highlight.default.language.xml27
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/highlight.source.xml82
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/highlight.xslthl.config.xml33
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/home.image.xml27
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/html.append.xml30
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/html.base.xml30
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/html.cellpadding.xml29
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/html.cellspacing.xml29
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/html.cleanup.xml34
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/html.ext.xml29
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/html.extra.head.links.xml31
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/html.head.legalnotice.link.multiple.xml44
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/html.head.legalnotice.link.types.xml75
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/html.longdesc.link.xml39
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/html.longdesc.xml28
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/html.stylesheet.type.xml26
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/html.stylesheet.xml36
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.alias.file.xml27
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.autolabel.xml28
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.button.back.xml27
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.button.forward.xml27
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.button.hideshow.xml27
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.button.home.url.xml27
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.button.home.xml27
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.button.jump1.title.xml27
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.button.jump1.url.xml27
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.button.jump1.xml23
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.button.jump2.title.xml27
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.button.jump2.url.xml27
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.button.jump2.xml27
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.button.locate.xml28
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.button.next.xml27
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.button.options.xml28
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.button.prev.xml28
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.button.print.xml28
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.button.refresh.xml27
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.button.stop.xml28
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.button.zoom.xml28
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.chm.xml27
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.default.topic.xml37
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.display.progress.xml28
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.encoding.xml28
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.enhanced.decompilation.xml27
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.enumerate.images.xml28
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.force.map.and.alias.xml26
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.hhc.binary.xml29
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.hhc.folders.instead.books.xml31
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.hhc.section.depth.xml27
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.hhc.show.root.xml29
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.hhc.width.xml28
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.hhc.xml27
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.hhk.xml27
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.hhp.tail.xml28
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.hhp.window.xml28
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.hhp.windows.xml29
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.hhp.xml28
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.map.file.xml25
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.only.xml32
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.remember.window.position.xml27
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.show.advanced.search.xml28
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.show.favorities.xml28
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.show.menu.xml28
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.show.toolbar.text.xml28
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.title.xml28
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.use.hhk.xml28
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.window.geometry.xml30
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/hyphenate.verbatim.characters.xml30
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/hyphenate.verbatim.xml45
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/hyphenate.xml29
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/id.warnings.xml25
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/ignore.image.scaling.xml28
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/img.src.path.xml40
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/index.div.title.properties.xml39
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/index.entry.properties.xml33
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/index.links.to.section.xml76
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/index.method.xml162
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/index.number.separator.xml54
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/index.on.role.xml48
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/index.on.type.xml52
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/index.page.number.properties.xml31
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/index.prefer.titleabbrev.xml29
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/index.preferred.page.properties.xml32
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/index.range.separator.xml57
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/index.term.separator.xml54
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/informal.object.properties.xml29
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/informalequation.properties.xml27
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/informalexample.properties.xml27
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/informalfigure.properties.xml27
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/informaltable.properties.xml32
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/inherit.keywords.xml31
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/insert.link.page.number.xml69
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/insert.olink.page.number.xml83
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/insert.olink.pdf.frag.xml68
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/insert.xref.page.number.xml60
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/itemizedlist.label.properties.xml26
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/itemizedlist.label.width.xml28
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/itemizedlist.properties.xml23
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/javahelp.encoding.xml31
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/keep.relative.image.uris.xml34
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/keyboard.nav.xml29
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/l10n.gentext.default.language.xml30
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/l10n.gentext.language.xml33
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/l10n.gentext.use.xref.language.xml53
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/l10n.lang.value.rfc.compliant.xml57
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/label.from.part.xml38
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/line-height.xml27
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/linenumbering.everyNth.xml29
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/linenumbering.extension.xml30
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/linenumbering.separator.xml30
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/linenumbering.width.xml29
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/link.mailto.url.xml29
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/list.block.properties.xml25
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/list.block.spacing.xml29
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/list.item.spacing.xml26
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/make.clean.html.xml51
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/make.graphic.viewport.xml35
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/make.index.markup.xml73
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/make.single.year.ranges.xml28
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/make.valid.html.xml35
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/make.year.ranges.xml32
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.authors.section.enabled.xml46
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.base.url.for.relative.links.xml76
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.break.after.slash.xml46
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.charmap.enabled.xml55
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.charmap.subset.profile.english.xml80
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.charmap.subset.profile.xml297
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.charmap.uri.xml42
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.charmap.use.subset.xml80
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.copyright.section.enabled.xml46
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.endnotes.are.numbered.xml106
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.endnotes.list.enabled.xml105
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.endnotes.list.heading.xml36
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.font.funcprototype.xml30
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.font.funcsynopsisinfo.xml30
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.font.links.xml64
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.font.table.headings.xml30
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.font.table.title.xml30
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.funcsynopsis.style.xml26
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.hyphenate.computer.inlines.xml53
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.hyphenate.filenames.xml47
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.hyphenate.urls.xml46
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.hyphenate.xml59
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.indent.blurbs.xml33
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.indent.lists.xml35
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.indent.refsect.xml70
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.indent.verbatims.xml33
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.indent.width.xml39
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.justify.xml52
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.output.base.dir.xml39
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.output.better.ps.enabled.xml61
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.output.encoding.xml53
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.output.in.separate.dir.xml32
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.output.lang.in.name.enabled.xml50
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.output.manifest.enabled.xml27
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.output.manifest.filename.xml29
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.output.quietly.xml37
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.output.subdirs.enabled.xml40
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.segtitle.suppress.xml28
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.string.subst.map.local.post.xml34
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.string.subst.map.local.pre.xml34
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.string.subst.map.xml162
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.subheading.divider.enabled.xml37
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.subheading.divider.xml37
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.table.footnotes.divider.xml29
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.th.extra1.suppress.xml32
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.th.extra2.max.length.xml43
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.th.extra2.suppress.xml44
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.th.extra3.max.length.xml42
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.th.extra3.suppress.xml34
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.th.title.max.length.xml63
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/manifest.in.base.dir.xml29
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/manifest.xml29
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/manual.toc.xml29
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/margin.note.float.type.xml77
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/margin.note.properties.xml54
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/margin.note.title.properties.xml32
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/margin.note.width.xml35
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/marker.section.level.xml50
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/menuchoice.menu.separator.xml42
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/menuchoice.separator.xml32
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/minus.image.xml29
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/monospace.font.family.xml29
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/monospace.properties.xml38
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/monospace.verbatim.font.width.xml40
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/monospace.verbatim.properties.xml27
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/multiframe.bottom.bgcolor.xml28
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/multiframe.navigation.height.xml28
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/multiframe.top.bgcolor.xml28
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/multiframe.xml31
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/nav.separator.xml28
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/nav.table.summary.xml27
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/navbgcolor.xml26
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/navbodywidth.xml26
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/navig.graphics.extension.xml28
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/navig.graphics.path.xml30
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/navig.graphics.xml31
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/navig.showtitles.xml32
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/navtocwidth.xml26
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/next.image.xml27
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/no.home.image.xml27
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/no.next.image.xml27
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/no.prev.image.xml27
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/no.toc.image.xml27
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/no.up.image.xml27
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/nominal.image.depth.xml27
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/nominal.image.width.xml43
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/nominal.table.width.xml30
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/nongraphical.admonition.properties.xml41
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/normal.para.spacing.xml26
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/olink.base.uri.xml35
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/olink.debug.xml36
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/olink.doctitle.xml146
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/olink.fragid.xml23
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/olink.lang.fallback.sequence.xml83
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/olink.outline.ext.xml28
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/olink.properties.xml33
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/olink.pubid.xml27
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/olink.resolver.xml23
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/olink.sysid.xml27
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/orderedlist.label.properties.xml26
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/orderedlist.label.width.xml28
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/orderedlist.properties.xml24
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/othercredit.like.author.enabled.xml31
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/output-root.xml28
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/output.indent.xml32
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/overlay.js.xml28
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/overlay.logo.xml28
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/overlay.xml32
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/page.height.portrait.xml69
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/page.height.xml37
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/page.margin.bottom.xml29
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/page.margin.inner.xml56
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/page.margin.outer.xml53
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/page.margin.top.xml28
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/page.orientation.xml32
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/page.width.portrait.xml67
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/page.width.xml36
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/pages.template.xml29
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/paper.type.xml73
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/para.propagates.style.xml29
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/part.autolabel.xml73
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/passivetex.extensions.xml37
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/pgwide.properties.xml52
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/phrase.propagates.style.xml29
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/pixels.per.inch.xml31
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/plus.image.xml29
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/points.per.em.xml29
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/preface.autolabel.xml71
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/prefer.internal.olink.xml78
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/preferred.mediaobject.role.xml40
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/prev.image.xml27
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/procedure.properties.xml29
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/process.empty.source.toc.xml39
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/process.source.toc.xml39
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/profile.arch.xml39
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/profile.attribute.xml34
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/profile.audience.xml38
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/profile.condition.xml38
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/profile.conformance.xml38
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/profile.lang.xml38
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/profile.os.xml38
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/profile.revision.xml38
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/profile.revisionflag.xml38
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/profile.role.xml54
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/profile.security.xml38
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/profile.separator.xml27
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/profile.status.xml38
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/profile.userlevel.xml38
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/profile.value.xml41
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/profile.vendor.xml38
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/profile.wordsize.xml38
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/punct.honorific.xml28
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/qanda.defaultlabel.xml86
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/qanda.in.toc.xml34
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/qanda.inherit.numeration.xml30
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/qanda.nested.in.toc.xml29
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/qanda.title.level1.properties.xml32
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/qanda.title.level2.properties.xml32
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/qanda.title.level3.properties.xml32
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/qanda.title.level4.properties.xml32
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/qanda.title.level5.properties.xml32
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/qanda.title.level6.properties.xml34
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/qanda.title.properties.xml37
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/qandadiv.autolabel.xml26
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/refclass.suppress.xml28
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/refentry.date.profile.enabled.xml46
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/refentry.date.profile.xml38
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/refentry.generate.name.xml33
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/refentry.generate.title.xml33
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/refentry.manual.fallback.profile.xml48
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/refentry.manual.profile.enabled.xml47
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/refentry.manual.profile.xml72
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/refentry.meta.get.quietly.xml37
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/refentry.pagebreak.xml33
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/refentry.separator.xml29
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/refentry.source.fallback.profile.xml49
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/refentry.source.name.profile.enabled.xml48
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/refentry.source.name.profile.xml89
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/refentry.source.name.suppress.xml42
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/refentry.title.properties.xml59
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/refentry.version.profile.enabled.xml47
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/refentry.version.profile.xml41
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/refentry.version.suppress.xml43
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/refentry.xref.manvolnum.xml31
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/reference.autolabel.xml67
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/region.after.extent.xml29
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/region.before.extent.xml29
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/revhistory.table.cell.properties.xml28
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/revhistory.table.properties.xml28
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/revhistory.title.properties.xml28
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/root.filename.xml29
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/root.properties.xml46
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/rootid.xml33
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/runinhead.default.title.end.punct.xml27
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/runinhead.title.end.punct.xml32
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/running.foot.properties.xml34
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/sans.font.family.xml29
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/saxon.callouts.xml30
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/saxon.character.representation.xml38
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/saxon.linenumbering.xml32
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/saxon.tablecolumns.xml30
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/script.dir.xml33
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/section.autolabel.max.depth.xml32
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/section.autolabel.xml26
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/section.container.element.xml62
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/section.label.includes.component.label.xml27
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/section.level1.properties.xml43
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/section.level2.properties.xml43
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/section.level3.properties.xml43
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/section.level4.properties.xml43
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/section.level5.properties.xml43
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/section.level6.properties.xml43
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/section.properties.xml35
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/section.title.level1.properties.xml32
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/section.title.level2.properties.xml33
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/section.title.level3.properties.xml32
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/section.title.level4.properties.xml32
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/section.title.level5.properties.xml32
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/section.title.level6.properties.xml33
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/section.title.properties.xml39
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/segmentedlist.as.table.xml28
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/sequential.links.xml25
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/shade.verbatim.style.xml36
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/shade.verbatim.xml30
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/show.comments.xml32
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/show.foil.number.xml28
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/show.revisionflag.xml42
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/showtoc.image.xml29
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/side.float.properties.xml50
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/sidebar.float.type.xml90
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/sidebar.float.width.xml35
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/sidebar.properties.xml42
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/sidebar.title.properties.xml32
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/simplesect.in.toc.xml26
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/slide.font.family.xml31
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/slide.title.font.family.xml31
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/slides.js.xml28
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/slides.properties.xml31
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/spacing.paras.xml30
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/speakernote.properties.xml32
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/subscript.properties.xml29
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/superscript.properties.xml29
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/suppress.footer.navigation.xml26
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/suppress.header.navigation.xml27
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/suppress.homepage.title.xml25
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/suppress.navigation.xml28
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/symbol.font.family.xml45
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/table.borders.with.css.xml28
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/table.cell.border.color.xml39
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/table.cell.border.style.xml42
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/table.cell.border.thickness.xml35
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/table.cell.padding.xml32
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/table.entry.padding.xml27
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/table.footnote.number.format.xml33
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/table.footnote.number.symbols.xml39
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/table.footnote.properties.xml39
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/table.frame.border.color.xml28
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/table.frame.border.style.xml37
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/table.frame.border.thickness.xml27
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/table.properties.xml34
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/table.spacer.image.xml26
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/table.table.properties.xml36
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/tablecolumns.extension.xml30
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/target.database.document.xml37
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/targets.filename.xml32
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/template.xml27
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/tex.math.delims.xml47
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/tex.math.file.xml42
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/tex.math.in.alt.xml76
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/text.home.xml27
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/text.next.xml27
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/text.prev.xml27
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/text.toc.xml27
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/text.up.xml27
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/textbgcolor.xml26
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/textdata.default.encoding.xml32
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/textinsert.extension.xml62
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/title.font.family.xml33
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/title.margin.left.xml65
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/titlefoil.html.xml27
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/toc.bg.color.xml27
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/toc.blank.graphic.xml28
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/toc.blank.image.xml27
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/toc.blank.text.xml27
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/toc.hide.show.xml33
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/toc.html.xml27
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/toc.image.xml27
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/toc.indent.width.xml34
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/toc.line.properties.xml44
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/toc.list.type.xml30
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/toc.margin.properties.xml33
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/toc.max.depth.xml25
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/toc.pointer.graphic.xml28
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/toc.pointer.image.xml27
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/toc.pointer.text.xml27
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/toc.row.height.xml33
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/toc.section.depth.xml28
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/toc.spacer.graphic.xml28
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/toc.spacer.image.xml27
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/toc.spacer.text.xml27
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/toc.width.xml28
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/ua.js.xml28
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/ulink.footnotes.xml34
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/ulink.hyphenate.chars.xml37
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/ulink.hyphenate.xml35
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/ulink.show.xml37
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/ulink.target.xml29
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/up.image.xml27
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/use.embed.for.svg.xml33
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/use.extensions.xml31
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/use.id.as.filename.xml30
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/use.id.function.xml32
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/use.local.olink.style.xml28
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/use.role.as.xrefstyle.xml93
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/use.role.for.mediaobject.xml56
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/use.svg.xml30
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/variablelist.as.blocks.xml62
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/variablelist.as.table.xml54
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/variablelist.max.termlength.xml46
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/variablelist.term.break.after.xml39
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/variablelist.term.properties.xml29
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/variablelist.term.separator.xml40
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/verbatim.properties.xml38
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/wordml.template.xml29
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/writing.mode.xml83
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/xbCollapsibleLists.js.xml28
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/xbDOM.js.xml28
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/xbLibrary.js.xml28
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/xbStyle.js.xml28
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/xep.extensions.xml31
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/xep.index.item.properties.xml36
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/xref.label-page.separator.xml38
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/xref.label-title.separator.xml36
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/xref.properties.xml29
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/xref.title-page.separator.xml36
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/xref.with.number.and.title.xml30
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/profiling/profile-mode.xsl239
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/profiling/profile.xsl56
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/profiling/strip-attributes.xsl27
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/profiling/xsl2profile.xsl159
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/roundtrip/blocks-spec.xml11
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/roundtrip/blocks2dbk.dtd76
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/roundtrip/blocks2dbk.xsl1732
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/roundtrip/dbk2ooo.xsl178
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/roundtrip/dbk2pages.xsl441
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/roundtrip/dbk2wordml.xsl401
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/roundtrip/dbk2wp.xsl1375
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/roundtrip/normalise-common.xsl39
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/roundtrip/normalise2sections.xsl1270
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/roundtrip/pages2normalise.xsl351
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/roundtrip/param.xml105
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/roundtrip/param.xsl18
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/roundtrip/sections-spec.xml38
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/roundtrip/sections2blocks.xsl263
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/roundtrip/specifications.xml1420
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/roundtrip/template-pages.xml2
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/roundtrip/template.xml3
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/roundtrip/wordml2normalise.xsl445
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/browser/CTOCWidget.js169
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/browser/overlay.js142
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/browser/slides-default.css9
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/browser/slides-frames.css73
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/browser/slides-plain.css1
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/browser/slides-table.css41
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/browser/slides-w3c.css1
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/browser/slides.css119
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/browser/slides.js120
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/browser/ua.js135
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/browser/xbCollapsibleLists.js537
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/browser/xbDOM.js374
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/browser/xbDebug.js311
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/browser/xbLibrary.js80
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/browser/xbStyle-css.js791
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/browser/xbStyle-nn4.js485
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/browser/xbStyle-not-supported.js77
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/browser/xbStyle.js295
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/fo/param.xml356
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/fo/param.xsl74
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/fo/plain-titlepage.xml79
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/fo/plain-titlepage.xsl187
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/fo/plain.xsl528
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/html/css.xsl46
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/html/default.xsl261
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/html/flat.xsl70
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/html/frames.xsl2016
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/html/graphics.xsl151
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/html/jscript.xsl127
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/html/param.xml1376
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/html/param.xsl68
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/html/plain.xsl472
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/html/slides-common.xsl1541
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/html/tables.xsl336
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/html/vslides.xsl667
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/html/w3c.xsl376
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/htmlhelp/htmlhelp.xsl89
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/keynote/default.xsl600
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/keynote/xsltsl/cmp.xsl348
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/keynote/xsltsl/date-time.xsl1524
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/keynote/xsltsl/example.xsl90
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/keynote/xsltsl/markup.xsl789
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/keynote/xsltsl/math.xsl704
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/keynote/xsltsl/node.xsl229
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/keynote/xsltsl/stdlib.xsl340
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/keynote/xsltsl/string.xsl1233
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/keynote/xsltsl/svg.xsl177
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/keynote/xsltsl/uri.xsl580
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/svg/default.xsl686
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/xhtml/css.xsl47
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/xhtml/default.xsl246
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/xhtml/flat.xsl71
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/xhtml/frames.xsl1982
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/xhtml/graphics.xsl152
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/xhtml/jscript.xsl128
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/xhtml/param.xsl70
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/xhtml/plain.xsl470
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/xhtml/slides-common.xsl1534
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/xhtml/tables.xsl334
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/xhtml/vslides.xsl652
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/xhtml/w3c.xsl358
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/template/titlepage.xml478
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/template/titlepage.xsl1280
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/tests/refentry.007.ns.xml325
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/tests/refentry.007.xml340
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/tools/bin/docbook-xsl-update53
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/tools/make/Makefile.DocBook698
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/tools/make/Makefile.combine182
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/tools/make/Makefile.docParam59
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/LICENSE1
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/docs/common/css/positioning.css109
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/docs/common/jquery/jquery-1.4.2.min.js154
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/docs/common/jquery/jquery-ui-1.8.2.custom.min.js321
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/docs/common/jquery/jquery.cookie.js93
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/docs/common/jquery/theme-redmond/jquery-ui-1.8.2.custom.css398
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/docs/common/jquery/treeview/jquery.treeview.async.js72
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/docs/common/jquery/treeview/jquery.treeview.css85
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/docs/common/jquery/treeview/jquery.treeview.js255
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/docs/common/jquery/treeview/jquery.treeview.min.js16
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/docs/common/jquery/treeview/jquery.treeview.pack.js16
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/docs/common/main.js161
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/docs/content/ch01.html61
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/docs/content/ch02.html32
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/docs/content/ch02s01.html117
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/docs/content/ch02s02.html102
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/docs/content/ch02s03.html36
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/docs/content/ch02s04.html42
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/docs/content/ch03.html37
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/docs/content/ch03s01.html62
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/docs/content/ch03s02.html124
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/docs/content/index.html71
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/docs/content/search/htmlFileInfoList.js10
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/docs/content/search/htmlFileList.js11
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/docs/content/search/index-1.js224
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/docs/content/search/index-2.js223
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/docs/content/search/index-3.js221
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/docs/content/search/nwSearchFnt.js513
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/docs/content/search/stemmers/en_stemmer.js187
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/docs/index.html13
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/docsrc/readme.xml928
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/template/common/css/positioning.css109
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/template/common/jquery/jquery-1.4.2.min.js154
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/template/common/jquery/jquery-ui-1.8.2.custom.min.js321
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/template/common/jquery/jquery.cookie.js93
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/template/common/jquery/theme-redmond/jquery-ui-1.8.2.custom.css398
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/template/common/jquery/treeview/jquery.treeview.async.js72
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/template/common/jquery/treeview/jquery.treeview.css85
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/template/common/jquery/treeview/jquery.treeview.js255
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/template/common/jquery/treeview/jquery.treeview.min.js16
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/template/common/jquery/treeview/jquery.treeview.pack.js16
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/template/common/main.js161
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/template/content/search/default.props1
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/template/content/search/en-us.props45
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/template/content/search/es-es.props179
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/template/content/search/ja-jp.props1
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/template/content/search/nwSearchFnt.js513
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/template/content/search/punctuation.props31
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/template/content/search/stemmers/de_stemmer.js247
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/template/content/search/stemmers/en_stemmer.js187
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/template/content/search/stemmers/fr_stemmer.js299
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/xsl/webhelp.xsl782
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/website/autolayout.xsl258
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/website/chunk-common.xsl227
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/website/chunk-tabular.xsl12
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/website/chunk-website.xsl12
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/website/head.xsl316
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/website/makefile-dep.xsl143
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/website/olink.xsl297
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/website/param.xml788
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/website/param.xsl53
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/website/rss.xsl143
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/website/tabular.xsl213
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/website/toc-tabular.xsl480
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/website/toc.xsl286
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/website/website-common.xsl821
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/website/website-targets.xsl27
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/website/website.xsl132
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/website/xbel.xsl114
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/admon.xsl133
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/annotations.xsl158
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/autoidx-kimber.xsl139
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/autoidx-kosek.xsl109
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/autoidx-ng.xsl21
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/autoidx.xsl681
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/autotoc.xsl663
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/biblio-iso690.xsl1300
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/biblio.xsl1240
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/block.xsl535
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/callout.xsl188
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/changebars.xsl78
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/chunk-changebars.xsl96
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/chunk-code.xsl645
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/chunk-common.xsl1561
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/chunk.xsl52
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/chunker.xsl302
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/chunkfast.xsl69
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/chunktoc.xsl528
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/component.xsl395
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/division.xsl217
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/docbook.css.xml109
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/docbook.xsl446
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/ebnf.xsl328
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/footnote.xsl305
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/formal.xsl411
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/glossary.xsl564
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/graphics.xsl1436
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/highlight.xsl88
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/html-rtf.xsl321
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/html.xsl598
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/htmltbl.xsl102
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/index.xsl264
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/info.xsl44
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/inline.xsl1451
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/keywords.xsl36
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/lists.xsl1088
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/maketoc.xsl91
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/manifest.xsl22
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/math.xsl284
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/oldchunker.xsl176
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/onechunk.xsl36
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/param.xsl436
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/pi.xsl1203
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/profile-chunk-code.xsl617
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/profile-chunk.xsl52
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/profile-docbook.xsl408
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/profile-onechunk.xsl36
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/qandaset.xsl420
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/refentry.xsl299
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/sections.xsl541
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/synop.xsl1513
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/table.xsl1168
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/task.xsl73
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/titlepage.templates.xsl3817
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/titlepage.xsl1030
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/toc.xsl330
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/verbatim.xsl388
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/xref.xsl1316
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/admon.xsl135
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/annotations.xsl158
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/autoidx-kimber.xsl139
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/autoidx-kosek.xsl109
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/autoidx-ng.xsl21
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/autoidx.xsl681
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/autotoc.xsl663
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/biblio-iso690.xsl1300
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/biblio.xsl1240
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/block.xsl535
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/callout.xsl188
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/changebars.xsl78
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/chunk-changebars.xsl96
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/chunk-code.xsl645
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/chunk-common.xsl1561
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/chunk.xsl52
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/chunker.xsl302
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/chunkfast.xsl69
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/chunktoc.xsl528
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/component.xsl395
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/division.xsl217
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/docbook.css.xml109
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/docbook.xsl446
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/ebnf.xsl328
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/footnote.xsl305
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/formal.xsl411
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/glossary.xsl564
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/graphics.xsl1436
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/highlight.xsl88
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/html-rtf.xsl321
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/html.xsl598
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/htmltbl.xsl102
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/index.xsl264
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/info.xsl44
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/inline.xsl1451
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/keywords.xsl36
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/lists.xsl1121
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/maketoc.xsl91
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/manifest.xsl22
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/math.xsl284
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/oldchunker.xsl176
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/onechunk.xsl36
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/param.xsl436
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/pi.xsl1203
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/profile-chunk-code.xsl617
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/profile-chunk.xsl52
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/profile-docbook.xsl408
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/profile-onechunk.xsl36
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/qandaset.xsl420
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/refentry.xsl299
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/sections.xsl541
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/synop.xsl1513
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/table.xsl1168
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/task.xsl73
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/titlepage.templates.xsl3817
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/titlepage.xsl1030
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/toc.xsl330
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/verbatim.xsl388
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/xref.xsl1316
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docs/SConstruct34
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docs/html.xsl55
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docs/manual.xml270
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docs/pdf.xsl62
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/utils/xmldepend.xsl156
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/dvi.py64
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/dvi.xml94
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/dvipdf.py125
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/dvipdf.xml84
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/dvips.py95
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/dvips.xml118
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/f03.py63
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/f03.xml311
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/f08.py65
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/f08.xml311
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/f77.py62
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/f77.xml324
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/f90.py62
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/f90.xml310
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/f95.py63
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/f95.xml311
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/filesystem.py98
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/fortran.py62
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/fortran.xml375
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/g++.py45
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/g++.xml41
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/g77.py73
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/g77.xml36
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/gas.py56
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/gas.xml38
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/gcc.py100
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/gcc.xml39
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/gdc.py145
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/gdc.xml371
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/gettext.xml257
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/gettext_tool.py48
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/gfortran.py64
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/gfortran.xml48
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/gnulink.py80
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/gnulink.xml43
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/gs.py91
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/gs.xml100
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/gxx.py79
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/hpc++.py45
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/hpc++.xml34
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/hpcc.py53
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/hpcc.xml41
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/hpcxx.py87
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/hplink.py77
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/hplink.xml39
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/icc.py59
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/icc.xml53
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/icl.py52
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/icl.xml35
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/ifl.py72
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/ifl.xml47
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/ifort.py88
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/ifort.xml49
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/ilink.py59
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/ilink.xml46
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/ilink32.py60
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/ilink32.xml46
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/install.py428
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/install.xml96
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/intelc.py613
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/intelc.xml58
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/ipkg.py73
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/jar.py231
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/jar.xml151
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/javac.py232
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/javac.xml285
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/javacTests.py105
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/javah.py137
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/javah.xml137
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/latex.py80
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/latex.xml106
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/ldc.py158
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/ldc.xml371
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/lex.py97
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/lex.xml81
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/link.py331
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/link.xml389
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/linkloc.py113
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/linkloc.xml54
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/m4.py63
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/m4.xml94
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/masm.py77
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/masm.xml49
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/midl.py88
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/midl.xml103
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/mingw.py182
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/mingw.xml61
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/msgfmt.py108
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/msgfmt.xml145
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/msginit.py120
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/msginit.xml225
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/msgmerge.py104
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/msgmerge.xml211
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/mslib.py64
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/mslib.xml46
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/mslink.py337
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/mslink.xml350
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/mssdk.py50
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/mssdk.xml77
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/msvc.py295
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/msvc.xml468
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/msvs.py1999
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/msvs.xml520
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/msvsTests.py855
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/mwcc.py207
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/mwcc.xml80
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/mwld.py108
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/mwld.xml50
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/nasm.py72
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/nasm.xml46
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/packaging.xml110
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/packaging/__init__.py311
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/packaging/__init__.xml845
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/packaging/ipk.py185
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/packaging/msi.py527
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/packaging/rpm.py349
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/packaging/src_tarbz2.py43
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/packaging/src_targz.py43
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/packaging/src_zip.py43
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/packaging/tarbz2.py44
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/packaging/targz.py44
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/packaging/zip.py44
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/pdf.py78
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/pdf.xml78
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/pdflatex.py84
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/pdflatex.xml80
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/pdftex.py109
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/pdftex.xml84
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/qt.py344
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/qt.xml406
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/rmic.py126
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/rmic.xml128
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/rpcgen.py70
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/rpcgen.xml180
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/rpm.py132
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/rpmutils.py547
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/sgiar.py68
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/sgiar.xml47
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/sgic++.py43
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/sgic++.xml41
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/sgicc.py53
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/sgicc.xml41
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/sgicxx.py61
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/sgilink.py62
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/sgilink.xml40
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/sunar.py64
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/sunar.xml44
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/sunc++.py45
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/sunc++.xml42
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/suncc.py58
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/suncc.xml40
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/suncxx.py144
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/sunf77.py63
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/sunf77.xml42
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/sunf90.py64
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/sunf90.xml42
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/sunf95.py64
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/sunf95.xml42
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/sunlink.py80
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/sunlink.xml39
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/swig.py194
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/swig.xml265
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/tar.py73
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/tar.xml130
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/tex.py987
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/tex.xml173
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/textfile.py208
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/textfile.xml253
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/tlib.py53
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/tlib.xml45
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/wix.py104
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/wixTests.py63
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/xgettext.py362
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/xgettext.xml373
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/yacc.py132
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/yacc.xml152
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/zip.py92
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/zip.xml167
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Util.py1637
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/UtilTests.py858
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Variables/BoolVariable.py89
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Variables/BoolVariableTests.py128
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Variables/EnumVariable.py101
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Variables/EnumVariableTests.py205
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Variables/ListVariable.py135
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Variables/ListVariableTests.py135
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Variables/PackageVariable.py106
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Variables/PackageVariableTests.py125
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Variables/PathVariable.py145
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Variables/PathVariableTests.py238
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Variables/VariablesTests.py705
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Variables/__init__.py327
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/Warnings.py254
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/WarningsTests.py137
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/__init__.py49
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/__main__.py4
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/compat/__init__.py212
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/compat/_scons_dbm.py45
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/cpp.py592
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/cppTests.py747
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/dblite.py286
-rw-r--r--3rdParty/SCons/scons-3.0.1/engine/SCons/exitfuncs.py64
-rw-r--r--3rdParty/SCons/scons-3.0.1/script/MANIFEST.in4
-rw-r--r--3rdParty/SCons/scons-3.0.1/script/scons-configure-cache.py141
-rw-r--r--3rdParty/SCons/scons-3.0.1/script/scons-time.py1502
-rw-r--r--3rdParty/SCons/scons-3.0.1/script/scons.bat34
-rw-r--r--3rdParty/SCons/scons-3.0.1/script/scons.py207
-rw-r--r--3rdParty/SCons/scons-3.0.1/script/sconsign.py557
-rw-r--r--3rdParty/SCons/scons-3.0.1/setup.cfg8
-rw-r--r--3rdParty/SCons/scons-3.0.1/setup.py518
-rw-r--r--3rdParty/SCons/scons-3.0.1/test_files.py106
-rw-r--r--3rdParty/SCons/scons-3.0.1/test_interrupts.py146
-rw-r--r--3rdParty/SCons/scons-3.0.1/test_pychecker.py152
-rw-r--r--3rdParty/SCons/scons-3.0.1/test_setup.py333
-rw-r--r--3rdParty/SCons/scons-3.0.1/test_strings.py267
-rwxr-xr-xBuildTools/CheckHeaders.py2
-rwxr-xr-xBuildTools/CheckTranslations.py8
-rwxr-xr-xBuildTools/Copyright/find-contribs.py6
-rwxr-xr-xBuildTools/Copyrighter.py16
-rw-r--r--BuildTools/CrashReportAnalysis/WindowsMinidumpAnalyse.py10
-rw-r--r--BuildTools/DocBook/SCons/DocBook.py21
-rw-r--r--BuildTools/DocBook/SCons/XSLT.py2
-rwxr-xr-xBuildTools/FixIncludes.py4
-rwxr-xr-xBuildTools/GenerateAppCastFeeds.py2
-rwxr-xr-xBuildTools/GetBuildVersion.py2
-rwxr-xr-xBuildTools/Gource/GetGravatars.py14
-rwxr-xr-xBuildTools/InstallSwiftDependencies.sh4
-rwxr-xr-xBuildTools/ProjectCopyrightSummary.py2
-rw-r--r--BuildTools/SCons/SConscript.boot17
-rw-r--r--BuildTools/SCons/SConstruct69
-rw-r--r--BuildTools/SCons/Tools/AppBundle.py4
-rw-r--r--BuildTools/SCons/Tools/InstallWithSymLinks.py8
-rw-r--r--BuildTools/SCons/Tools/WindowsBundle.py26
-rw-r--r--BuildTools/SCons/Tools/qt4.py51
-rw-r--r--BuildTools/SCons/Tools/textfile.py175
-rw-r--r--BuildTools/SCons/Tools/wix.py8
-rw-r--r--BuildTools/SCons/Version.py253
-rw-r--r--BuildTools/TranslationCoverage.xslt50
-rwxr-xr-xBuildTools/UpdateDebianChangelog.py3
-rwxr-xr-xBuildTools/scons2ninja.py24
-rw-r--r--COPYING2
-rw-r--r--COPYING.dependencies23
-rw-r--r--COPYING.gpl2
-rw-r--r--COPYING.thirdparty125
-rw-r--r--DEVELOPMENT.md7
-rw-r--r--Documentation/SwiftenDevelopersGuide/Examples/EchoBot/.gitignore1
-rw-r--r--Documentation/SwiftenDevelopersGuide/SConscript35
-rw-r--r--Makefile21
-rw-r--r--QA/Checker/checker.cpp9
-rw-r--r--README.md5
-rw-r--r--Slimber/Cocoa/CocoaMenulet.mm10
-rw-r--r--Slimber/Cocoa/MainMenu.xib2
-rw-r--r--Slimber/MainController.cpp4
-rw-r--r--Slimber/SConscript4
-rw-r--r--Slimber/Server.cpp8
-rw-r--r--Slimber/Server.h14
-rw-r--r--Slimber/UnitTest/LinkLocalPresenceManagerTest.cpp10
-rw-r--r--Sluift/ElementConvertors/DOMElementConvertor.cpp2
-rw-r--r--Sluift/ElementConvertors/DefaultElementConvertor.cpp4
-rw-r--r--Sluift/ElementConvertors/FormConvertor.cpp4
-rw-r--r--Sluift/ElementConvertors/PubSubAffiliationsConvertor.cpp2
-rw-r--r--Sluift/ElementConvertors/PubSubEventItemConvertor.cpp2
-rw-r--r--Sluift/ElementConvertors/PubSubEventItemsConvertor.cpp4
-rw-r--r--Sluift/ElementConvertors/PubSubItemConvertor.cpp2
-rw-r--r--Sluift/ElementConvertors/PubSubItemsConvertor.cpp2
-rw-r--r--Sluift/ElementConvertors/PubSubOwnerAffiliationsConvertor.cpp2
-rw-r--r--Sluift/ElementConvertors/PubSubOwnerSubscriptionsConvertor.cpp2
-rw-r--r--Sluift/ElementConvertors/PubSubPublishConvertor.cpp2
-rw-r--r--Sluift/ElementConvertors/PubSubRetractConvertor.cpp2
-rw-r--r--Sluift/ElementConvertors/PubSubSubscriptionsConvertor.cpp2
-rw-r--r--Sluift/ElementConvertors/SecurityLabelConvertor.cpp2
-rw-r--r--Sluift/ElementConvertors/StanzaConvertor.h2
-rw-r--r--Sluift/Examples/SendReference.lua74
-rw-r--r--Sluift/Lua/LuaUtils.h17
-rw-r--r--Sluift/SConscript2
-rw-r--r--Sluift/SluiftClient.cpp20
-rw-r--r--Sluift/SluiftClient.h15
-rw-r--r--Sluift/SluiftComponent.cpp13
-rw-r--r--Sluift/SluiftComponent.h6
-rw-r--r--Sluift/client.cpp53
-rw-r--r--Sluift/component.cpp13
-rw-r--r--Sluift/core.lua5
-rw-r--r--SwifTools/Application/ApplicationPathProvider.cpp4
-rw-r--r--SwifTools/Application/MacOSXApplicationPathProvider.cpp4
-rw-r--r--SwifTools/Application/UnixApplicationPathProvider.cpp4
-rw-r--r--SwifTools/AutoUpdater/SparkleAutoUpdater.mm4
-rw-r--r--SwifTools/AutoUpdater/SparkleAutoUpdaterDelegate.mm6
-rw-r--r--SwifTools/CrashReporter.cpp4
-rw-r--r--SwifTools/Dock/Dock.h6
-rw-r--r--SwifTools/Dock/MacOSXDock.h4
-rw-r--r--SwifTools/Dock/MacOSXDock.mm4
-rw-r--r--SwifTools/Dock/NullDock.h6
-rw-r--r--SwifTools/Dock/WindowsDock.h4
-rw-r--r--SwifTools/HunspellChecker.cpp4
-rw-r--r--SwifTools/Idle/MacOSXIdleQuerier.cpp11
-rw-r--r--SwifTools/MacOSXChecker.mm6
-rw-r--r--SwifTools/Notifier/NotificationCenterNotifier.mm4
-rw-r--r--SwifTools/SpellParser.cpp11
-rw-r--r--Swift/ChangeLog.md58
-rw-r--r--Swift/Controllers/AccountController.cpp873
-rw-r--r--Swift/Controllers/AccountController.h203
-rw-r--r--Swift/Controllers/Chat/ChatController.cpp34
-rw-r--r--Swift/Controllers/Chat/ChatController.h9
-rw-r--r--Swift/Controllers/Chat/ChatControllerBase.cpp72
-rw-r--r--Swift/Controllers/Chat/ChatControllerBase.h19
-rw-r--r--Swift/Controllers/Chat/ChatListWindowChatBoostSerialize.h82
-rw-r--r--Swift/Controllers/Chat/ChatsManager.cpp231
-rw-r--r--Swift/Controllers/Chat/ChatsManager.h78
-rw-r--r--Swift/Controllers/Chat/Chattables.cpp43
-rw-r--r--Swift/Controllers/Chat/Chattables.h47
-rw-r--r--Swift/Controllers/Chat/MUCController.cpp93
-rw-r--r--Swift/Controllers/Chat/MUCController.h9
-rw-r--r--Swift/Controllers/Chat/MUCSearchController.cpp12
-rw-r--r--Swift/Controllers/Chat/UnitTest/ChatControllerTest.cpp162
-rw-r--r--Swift/Controllers/Chat/UnitTest/ChatListWindowChatTest.cpp292
-rw-r--r--Swift/Controllers/Chat/UnitTest/ChatsManagerTest.cpp251
-rw-r--r--Swift/Controllers/Chat/UnitTest/ChattablesTest.cpp140
-rw-r--r--Swift/Controllers/Chat/UnitTest/MUCControllerTest.cpp1382
-rw-r--r--Swift/Controllers/Chat/UnitTest/MockChatListWindow.h2
-rw-r--r--Swift/Controllers/ContactSuggester.cpp11
-rw-r--r--Swift/Controllers/FdpFormSubmitController.cpp145
-rw-r--r--Swift/Controllers/FdpFormSubmitController.h47
-rw-r--r--Swift/Controllers/FileTransfer/FileTransferController.cpp6
-rw-r--r--Swift/Controllers/FileTransfer/FileTransferProgressInfo.cpp8
-rw-r--r--Swift/Controllers/FileTransfer/FileTransferProgressInfo.h13
-rw-r--r--Swift/Controllers/Highlighting/HighlightAction.cpp2
-rw-r--r--Swift/Controllers/Highlighting/HighlightAction.h56
-rw-r--r--Swift/Controllers/Highlighting/HighlightManager.cpp4
-rw-r--r--Swift/Controllers/MainController.cpp950
-rw-r--r--Swift/Controllers/MainController.h201
-rw-r--r--Swift/Controllers/Roster/LeastCommonSubsequence.h4
-rw-r--r--Swift/Controllers/Roster/RosterController.cpp21
-rw-r--r--Swift/Controllers/Roster/RosterController.h6
-rw-r--r--Swift/Controllers/Roster/TableRoster.cpp25
-rw-r--r--Swift/Controllers/Roster/UnitTest/RosterControllerTest.cpp10
-rw-r--r--Swift/Controllers/SConscript9
-rw-r--r--Swift/Controllers/SettingConstants.cpp7
-rw-r--r--Swift/Controllers/SettingConstants.h24
-rw-r--r--Swift/Controllers/Settings/XMLSettingsProvider.cpp18
-rw-r--r--Swift/Controllers/StatusCache.cpp8
-rw-r--r--Swift/Controllers/Storages/AvatarFileStorage.cpp31
-rw-r--r--Swift/Controllers/Storages/CertificateFileStorage.cpp17
-rw-r--r--Swift/Controllers/UIEvents/FdpFormSubmitWindowOpenUIEvent.h17
-rw-r--r--Swift/Controllers/UIEvents/JoinMUCUIEvent.h2
-rw-r--r--Swift/Controllers/UIInterfaces/ChatListWindow.h8
-rw-r--r--Swift/Controllers/UIInterfaces/ChatWindow.h13
-rw-r--r--Swift/Controllers/UIInterfaces/FdpFormSubmitWindow.cpp32
-rw-r--r--Swift/Controllers/UIInterfaces/FdpFormSubmitWindow.h54
-rw-r--r--Swift/Controllers/UIInterfaces/FdpFormSubmitWindowFactory.h19
-rw-r--r--Swift/Controllers/UIInterfaces/MainWindow.h4
-rw-r--r--Swift/Controllers/UIInterfaces/MainWindowFactory.h14
-rw-r--r--Swift/Controllers/UIInterfaces/UIFactory.h6
-rw-r--r--Swift/Controllers/UnitTest/FdpFormSubmitControllerTest.cpp269
-rw-r--r--Swift/Controllers/UnitTest/MockChatWindow.h17
-rw-r--r--Swift/Controllers/UnitTest/MockFdpFormSubmitWindow.h37
-rw-r--r--Swift/Controllers/UnitTest/MockFdpFormSubmitWindowFactory.h31
-rw-r--r--Swift/Controllers/UnitTest/MockMainWindow.h3
-rw-r--r--Swift/Controllers/UnitTest/MockMainWindowFactory.h4
-rw-r--r--Swift/Controllers/XMPPEvents/EventController.cpp6
-rw-r--r--Swift/Controllers/XMPPEvents/EventController.h5
-rw-r--r--Swift/Packaging/Debian/.dockerignore1
-rw-r--r--Swift/Packaging/Debian/.gitignore4
-rw-r--r--Swift/Packaging/Debian/Dockerfile.package.in30
-rw-r--r--Swift/Packaging/Debian/Dockerfile.source17
-rwxr-xr-xSwift/Packaging/Debian/Testing/swift-distr-tests.sh16
-rw-r--r--Swift/Packaging/Debian/changelog.debian-unstable18
-rw-r--r--Swift/Packaging/Debian/debian/control.in2
-rw-r--r--Swift/Packaging/Debian/debian/copyright2
-rwxr-xr-xSwift/Packaging/Debian/debian/rules4
-rwxr-xr-xSwift/Packaging/Debian/package.sh12
-rwxr-xr-xSwift/Packaging/Debian/package_all_platforms.sh10
-rwxr-xr-xSwift/Packaging/Debian/package_docker.sh70
-rw-r--r--Swift/Packaging/Debian/update_debian_repo.sh17
-rw-r--r--Swift/Packaging/SConscript29
-rw-r--r--Swift/Packaging/WiX/Swift.wxs143
-rw-r--r--Swift/Packaging/WiX/Swift_en-us.wxl4
-rw-r--r--Swift/Packaging/WiX/include.xslt12
-rw-r--r--Swift/QtUI/CAPICertificateSelector.cpp33
-rw-r--r--Swift/QtUI/ChatList/QtChatListWindow.cpp25
-rw-r--r--Swift/QtUI/ChatList/QtChatListWindow.h6
-rw-r--r--Swift/QtUI/ChattablesModel.cpp63
-rw-r--r--Swift/QtUI/ChattablesModel.h34
-rw-r--r--Swift/QtUI/FlowLayout.cpp7
-rw-r--r--Swift/QtUI/QtAboutWidget.cpp4
-rw-r--r--Swift/QtUI/QtBookmarkDetailWindow.cpp8
-rw-r--r--Swift/QtUI/QtBookmarkDetailWindow.ui23
-rw-r--r--Swift/QtUI/QtCachedImageScaler.cpp2
-rw-r--r--Swift/QtUI/QtChatOverview.cpp66
-rw-r--r--Swift/QtUI/QtChatOverview.h28
-rw-r--r--Swift/QtUI/QtChatOverviewBundle.cpp146
-rw-r--r--Swift/QtUI/QtChatOverviewBundle.h61
-rw-r--r--Swift/QtUI/QtChatOverviewDelegate.cpp88
-rw-r--r--Swift/QtUI/QtChatOverviewDelegate.h23
-rw-r--r--Swift/QtUI/QtChatTabs.cpp24
-rw-r--r--Swift/QtUI/QtChatTabs.h6
-rw-r--r--Swift/QtUI/QtChatTabsShortcutOnlySubstitute.cpp108
-rw-r--r--Swift/QtUI/QtChatTabsShortcutOnlySubstitute.h40
-rw-r--r--Swift/QtUI/QtChatWindow.cpp117
-rw-r--r--Swift/QtUI/QtChatWindow.h17
-rw-r--r--Swift/QtUI/QtChatWindowFactory.cpp22
-rw-r--r--Swift/QtUI/QtChatWindowFactory.h8
-rw-r--r--Swift/QtUI/QtColorToolButton.cpp1
-rw-r--r--Swift/QtUI/QtDBUSURIHandler.cpp4
-rw-r--r--Swift/QtUI/QtEditBookmarkWindow.cpp1
-rw-r--r--Swift/QtUI/QtEmojiCell.cpp15
-rw-r--r--Swift/QtUI/QtEmojisScroll.h4
-rw-r--r--Swift/QtUI/QtEmojisSelector.cpp9
-rw-r--r--Swift/QtUI/QtEmojisSelector.h4
-rw-r--r--Swift/QtUI/QtExpandedListView.cpp111
-rw-r--r--Swift/QtUI/QtExpandedListView.h34
-rw-r--r--Swift/QtUI/QtFdpFormSubmitWindow.cpp215
-rw-r--r--Swift/QtUI/QtFdpFormSubmitWindow.h75
-rw-r--r--Swift/QtUI/QtFormWidget.cpp2
-rw-r--r--Swift/QtUI/QtHighlightNotificationConfigDialog.cpp6
-rw-r--r--Swift/QtUI/QtHistoryWindow.cpp4
-rw-r--r--Swift/QtUI/QtJoinMUCWindow.cpp2
-rw-r--r--Swift/QtUI/QtJoinMUCWindow.ui8
-rw-r--r--Swift/QtUI/QtListWidget.cpp20
-rw-r--r--Swift/QtUI/QtListWidget.h23
-rw-r--r--Swift/QtUI/QtLoginWindow.cpp4
-rw-r--r--Swift/QtUI/QtLoginWindow.h5
-rw-r--r--Swift/QtUI/QtMainWindow.cpp37
-rw-r--r--Swift/QtUI/QtMainWindow.h48
-rw-r--r--Swift/QtUI/QtPlainChatView.cpp8
-rw-r--r--Swift/QtUI/QtScaledAvatarCache.cpp8
-rw-r--r--Swift/QtUI/QtSingleWindow.cpp91
-rw-r--r--Swift/QtUI/QtSingleWindow.h25
-rw-r--r--Swift/QtUI/QtSoundSelectionStyledItemDelegate.h1
-rw-r--r--Swift/QtUI/QtSpellCheckerWindow.cpp4
-rw-r--r--Swift/QtUI/QtStatusWidget.cpp12
-rw-r--r--Swift/QtUI/QtStrings.h12
-rw-r--r--Swift/QtUI/QtSwift.cpp267
-rw-r--r--Swift/QtUI/QtSwift.h47
-rw-r--r--Swift/QtUI/QtTabWidget.cpp4
-rw-r--r--Swift/QtUI/QtTabbable.h2
-rw-r--r--Swift/QtUI/QtTextEdit.cpp4
-rw-r--r--Swift/QtUI/QtUIFactory.cpp100
-rw-r--r--Swift/QtUI/QtUIFactory.h40
-rw-r--r--Swift/QtUI/QtVCardWidget/QtVCardFieldInfo.h4
-rw-r--r--Swift/QtUI/QtVCardWidget/QtVCardWidget.cpp4
-rw-r--r--Swift/QtUI/QtWebKitChatView.cpp80
-rw-r--r--Swift/QtUI/QtWebKitChatView.h10
-rw-r--r--Swift/QtUI/QtWebView.cpp6
-rw-r--r--Swift/QtUI/Roster/QtFilterWidget.cpp2
-rw-r--r--Swift/QtUI/SConscript246
-rw-r--r--Swift/QtUI/ServerList/QtServerListView.cpp31
-rw-r--r--Swift/QtUI/ServerList/QtServerListView.h25
-rw-r--r--Swift/QtUI/ServerList/ServerListDelegate.cpp117
-rw-r--r--Swift/QtUI/ServerList/ServerListDelegate.h31
-rw-r--r--Swift/QtUI/ServerList/ServerListModel.cpp68
-rw-r--r--Swift/QtUI/ServerList/ServerListModel.h87
-rw-r--r--Swift/QtUI/Trellis/QtDynamicGridLayout.cpp33
-rw-r--r--Swift/QtUI/Trellis/QtDynamicGridLayout.h4
-rw-r--r--Swift/QtUI/Trellis/QtGridSelectionDialog.cpp6
-rw-r--r--Swift/QtUI/UserSearch/ContactListModel.cpp28
-rw-r--r--Swift/QtUI/UserSearch/QtSuggestingJIDInput.cpp2
-rw-r--r--Swift/QtUI/UserSearch/QtUserSearchWindow.cpp1
-rw-r--r--Swift/QtUI/UserSearch/QtUserSearchWindow.h3
-rw-r--r--Swift/QtUI/main.cpp2
-rw-r--r--Swift/SConscript10
-rw-r--r--Swift/Translations/swift_de.ts337
-rw-r--r--Swift/Translations/swift_nl.ts463
-rw-r--r--Swift/resources/themes/Default/Noto/LICENSE92
-rw-r--r--Swift/resources/themes/Default/Noto/NotoColorEmoji.ttfbin0 -> 7253060 bytes
-rw-r--r--Swift/resources/themes/Default/main.css46
-rw-r--r--Swiften/Avatars/CombinedAvatarProvider.cpp8
-rw-r--r--Swiften/Avatars/UnitTest/AvatarManagerImplTest.cpp3
-rw-r--r--Swiften/Avatars/VCardUpdateAvatarManager.cpp12
-rw-r--r--Swiften/Base/Algorithm.h26
-rw-r--r--Swiften/Base/DateTime.cpp4
-rw-r--r--Swiften/Base/Log.cpp48
-rw-r--r--Swiften/Base/Log.h25
-rw-r--r--Swiften/Base/Platform.h8
-rw-r--r--Swiften/Base/URL.cpp14
-rw-r--r--Swiften/Base/URL.h10
-rw-r--r--Swiften/Base/UnitTest/LogTest.cpp49
-rw-r--r--Swiften/Base/UnitTest/URLTest.cpp26
-rw-r--r--Swiften/ChangeLog.md25
-rw-r--r--Swiften/Chat/ChatStateTracker.cpp2
-rw-r--r--Swiften/Chat/UnitTest/ChatStateNotifierTest.cpp5
-rw-r--r--Swiften/Client/ClientSession.cpp26
-rw-r--r--Swiften/Client/ClientSessionStanzaChannel.cpp4
-rw-r--r--Swiften/Client/CoreClient.cpp64
-rw-r--r--Swiften/Client/DummyStanzaChannel.h7
-rw-r--r--Swiften/Client/UnitTest/XMLBeautifierTest.cpp5
-rw-r--r--Swiften/Component/ComponentConnector.cpp4
-rw-r--r--Swiften/Component/ComponentConnector.h8
-rw-r--r--Swiften/Component/ComponentSessionStanzaChannel.cpp4
-rw-r--r--Swiften/Component/CoreComponent.cpp14
-rw-r--r--Swiften/Component/CoreComponent.h19
-rw-r--r--Swiften/Component/UnitTest/ComponentConnectorTest.cpp4
-rw-r--r--Swiften/Config/SConscript12
-rw-r--r--Swiften/Crypto/CommonCryptoCryptoProvider.cpp23
-rw-r--r--Swiften/Crypto/OpenSSLCryptoProvider.cpp13
-rw-r--r--Swiften/Disco/CapsManager.cpp4
-rw-r--r--Swiften/Disco/DiscoServiceWalker.cpp18
-rw-r--r--Swiften/Elements/Bytestreams.h6
-rw-r--r--Swiften/Elements/DiscoInfo.cpp3
-rw-r--r--Swiften/Elements/DiscoInfo.h3
-rw-r--r--Swiften/Elements/Form.h6
-rw-r--r--Swiften/Elements/IBB.h12
-rw-r--r--Swiften/Elements/JingleFileTransferFileInfo.h2
-rw-r--r--Swiften/Elements/MIXJoin.h22
-rw-r--r--Swiften/Elements/MIXSubscribe.h38
-rw-r--r--Swiften/Elements/MIXUpdateSubscription.h56
-rw-r--r--Swiften/Elements/PubSubItem.cpp5
-rw-r--r--Swiften/Elements/PubSubItem.h18
-rw-r--r--Swiften/Elements/PubSubItems.h1
-rw-r--r--Swiften/Elements/ReferencePayload.cpp63
-rw-r--r--Swiften/Elements/ReferencePayload.h62
-rw-r--r--Swiften/Elements/S5BProxyRequest.h4
-rw-r--r--Swiften/Elements/SecurityLabel.h1
-rw-r--r--Swiften/Elements/StanzaAck.cpp8
-rw-r--r--Swiften/Elements/StanzaAck.h4
-rw-r--r--Swiften/Elements/StreamError.h2
-rw-r--r--Swiften/Elements/StreamInitiationFileInfo.h2
-rw-r--r--Swiften/Entity/PayloadPersister.cpp6
-rw-r--r--Swiften/EventLoop/BoostASIOEventLoop.cpp4
-rw-r--r--Swiften/EventLoop/Cocoa/CocoaEventLoop.mm4
-rw-r--r--Swiften/EventLoop/DummyEventLoop.cpp6
-rw-r--r--Swiften/EventLoop/EventLoop.cpp34
-rw-r--r--Swiften/EventLoop/EventLoop.h11
-rw-r--r--Swiften/EventLoop/Qt/QtEventLoop.h4
-rw-r--r--Swiften/EventLoop/SimpleEventLoop.cpp4
-rw-r--r--Swiften/EventLoop/SingleThreadedEventLoop.cpp4
-rw-r--r--Swiften/EventLoop/UnitTest/EventLoopTest.cpp13
-rw-r--r--Swiften/Examples/ConnectivityTest/ConnectivityTest.cpp2
-rw-r--r--Swiften/Examples/SendFile/ReceiveFile.cpp4
-rw-r--r--Swiften/FileTransfer/ByteArrayReadBytestream.cpp22
-rw-r--r--Swiften/FileTransfer/DefaultFileTransferTransporter.cpp12
-rw-r--r--Swiften/FileTransfer/FailingTransportSession.cpp4
-rw-r--r--Swiften/FileTransfer/FileTransferManagerImpl.cpp4
-rw-r--r--Swiften/FileTransfer/IBBSendSession.cpp4
-rw-r--r--Swiften/FileTransfer/IncomingJingleFileTransfer.cpp68
-rw-r--r--Swiften/FileTransfer/IncrementalBytestreamHashCalculator.cpp4
-rw-r--r--Swiften/FileTransfer/JingleFileTransfer.cpp56
-rw-r--r--Swiften/FileTransfer/LocalJingleTransportCandidateGenerator.cpp6
-rw-r--r--Swiften/FileTransfer/OutgoingJingleFileTransfer.cpp62
-rw-r--r--Swiften/FileTransfer/RemoteJingleTransportCandidateSelector.cpp8
-rw-r--r--Swiften/FileTransfer/SOCKS5BytestreamClientSession.cpp34
-rw-r--r--Swiften/FileTransfer/SOCKS5BytestreamProxiesManager.cpp12
-rw-r--r--Swiften/FileTransfer/SOCKS5BytestreamProxyFinder.cpp6
-rw-r--r--Swiften/FileTransfer/SOCKS5BytestreamServerManager.cpp34
-rw-r--r--Swiften/FileTransfer/SOCKS5BytestreamServerManager.h4
-rw-r--r--Swiften/FileTransfer/SOCKS5BytestreamServerSession.cpp31
-rw-r--r--Swiften/FileTransfer/UnitTest/IBBSendSessionTest.cpp4
-rw-r--r--Swiften/FileTransfer/UnitTest/SOCKS5BytestreamClientSessionTest.cpp6
-rw-r--r--Swiften/IDN/ICUConverter.cpp13
-rw-r--r--Swiften/IDN/LibIDNConverter.cpp10
-rw-r--r--Swiften/IDN/PlatformIDNConverter.cpp11
-rw-r--r--Swiften/IDN/PlatformIDNConverter.h6
-rw-r--r--Swiften/IDN/SConscript1
-rw-r--r--Swiften/IDN/UnitTest/IDNConverterTest.cpp132
-rw-r--r--Swiften/JID/JID.cpp138
-rw-r--r--Swiften/JID/JID.h6
-rw-r--r--Swiften/JID/UnitTest/JIDTest.cpp120
-rw-r--r--Swiften/Jingle/AbstractJingleSessionListener.cpp16
-rw-r--r--Swiften/Jingle/JingleResponder.cpp8
-rw-r--r--Swiften/Jingle/JingleSessionImpl.cpp6
-rw-r--r--Swiften/Jingle/JingleSessionManager.cpp4
-rw-r--r--Swiften/LinkLocal/DNSSD/Avahi/AvahiQuerier.cpp4
-rw-r--r--Swiften/LinkLocal/DNSSD/Avahi/AvahiQuerier.h4
-rw-r--r--Swiften/LinkLocal/DNSSD/Avahi/AvahiRegisterQuery.h6
-rw-r--r--Swiften/LinkLocal/DNSSD/Avahi/AvahiResolveHostnameQuery.cpp4
-rw-r--r--Swiften/LinkLocal/DNSSD/Bonjour/BonjourBrowseQuery.h17
-rw-r--r--Swiften/LinkLocal/DNSSD/Bonjour/BonjourQuerier.cpp5
-rw-r--r--Swiften/LinkLocal/DNSSD/Bonjour/BonjourQuerier.h4
-rw-r--r--Swiften/LinkLocal/DNSSD/Bonjour/BonjourRegisterQuery.h24
-rw-r--r--Swiften/LinkLocal/DNSSD/Bonjour/BonjourResolveHostnameQuery.h17
-rw-r--r--Swiften/LinkLocal/DNSSD/Bonjour/BonjourResolveServiceQuery.h19
-rw-r--r--Swiften/LinkLocal/DNSSD/DNSSDQuerier.h4
-rw-r--r--Swiften/LinkLocal/DNSSD/DNSSDResolveServiceQuery.h6
-rw-r--r--Swiften/LinkLocal/DNSSD/Fake/FakeDNSSDQuerier.cpp6
-rw-r--r--Swiften/LinkLocal/DNSSD/Fake/FakeDNSSDQuerier.h6
-rw-r--r--Swiften/LinkLocal/DNSSD/Fake/FakeDNSSDRegisterQuery.h6
-rw-r--r--Swiften/LinkLocal/LinkLocalService.h4
-rw-r--r--Swiften/LinkLocal/LinkLocalServiceBrowser.cpp26
-rw-r--r--Swiften/LinkLocal/LinkLocalServiceBrowser.h4
-rw-r--r--Swiften/LinkLocal/LinkLocalServiceInfo.cpp75
-rw-r--r--Swiften/LinkLocal/LinkLocalServiceInfo.h10
-rw-r--r--Swiften/LinkLocal/UnitTest/LinkLocalConnectorTest.cpp10
-rw-r--r--Swiften/LinkLocal/UnitTest/LinkLocalServiceBrowserTest.cpp26
-rw-r--r--Swiften/LinkLocal/UnitTest/LinkLocalServiceInfoTest.cpp17
-rw-r--r--Swiften/LinkLocal/UnitTest/LinkLocalServiceTest.cpp6
-rw-r--r--Swiften/MIX/MIX.cpp14
-rw-r--r--Swiften/MIX/MIX.h69
-rw-r--r--Swiften/MIX/MIXImpl.cpp97
-rw-r--r--Swiften/MIX/MIXImpl.h67
-rw-r--r--Swiften/MIX/UnitTest/MIXImplTest.cpp312
-rw-r--r--Swiften/MUC/MUCBookmarkManager.cpp53
-rw-r--r--Swiften/MUC/MUCBookmarkManager.h5
-rw-r--r--Swiften/MUC/MUCImpl.cpp2
-rw-r--r--Swiften/Network/BOSHConnection.cpp24
-rw-r--r--Swiften/Network/BOSHConnection.h2
-rw-r--r--Swiften/Network/BOSHConnectionPool.cpp4
-rw-r--r--Swiften/Network/BoostConnection.cpp11
-rw-r--r--Swiften/Network/BoostConnectionServer.cpp15
-rw-r--r--Swiften/Network/BoostConnectionServer.h12
-rw-r--r--Swiften/Network/BoostConnectionServerFactory.cpp4
-rw-r--r--Swiften/Network/BoostConnectionServerFactory.h6
-rw-r--r--Swiften/Network/BoostNetworkFactories.cpp7
-rw-r--r--Swiften/Network/BoostNetworkFactories.h8
-rw-r--r--Swiften/Network/ChainedConnector.cpp12
-rw-r--r--Swiften/Network/ChainedConnector.h6
-rw-r--r--Swiften/Network/ConnectionServerFactory.h6
-rw-r--r--Swiften/Network/Connector.cpp38
-rw-r--r--Swiften/Network/Connector.h8
-rw-r--r--Swiften/Network/DomainNameServiceQuery.cpp38
-rw-r--r--Swiften/Network/DomainNameServiceQuery.h6
-rw-r--r--Swiften/Network/DummyConnectionServer.h6
-rw-r--r--Swiften/Network/DummyConnectionServerFactory.h6
-rw-r--r--Swiften/Network/EnvironmentProxyProvider.cpp14
-rw-r--r--Swiften/Network/GConfProxyProvider.cpp14
-rw-r--r--Swiften/Network/HTTPConnectProxiedConnection.cpp14
-rw-r--r--Swiften/Network/HTTPConnectProxiedConnection.h6
-rw-r--r--Swiften/Network/HTTPConnectProxiedConnectionFactory.cpp6
-rw-r--r--Swiften/Network/HTTPConnectProxiedConnectionFactory.h8
-rw-r--r--Swiften/Network/HostAddress.cpp4
-rw-r--r--Swiften/Network/HostAddress.h6
-rw-r--r--Swiften/Network/HostAddressPort.cpp6
-rw-r--r--Swiften/Network/HostAddressPort.h15
-rw-r--r--Swiften/Network/MacOSXProxyProvider.cpp8
-rw-r--r--Swiften/Network/MiniUPnPInterface.cpp18
-rw-r--r--Swiften/Network/MiniUPnPInterface.h4
-rw-r--r--Swiften/Network/NATPMPInterface.cpp28
-rw-r--r--Swiften/Network/NATPMPInterface.h4
-rw-r--r--Swiften/Network/NATPortMapping.h16
-rw-r--r--Swiften/Network/NATTraversalInterface.h4
-rw-r--r--Swiften/Network/NATTraversalRemovePortForwardingRequest.h6
-rw-r--r--Swiften/Network/NATTraverser.h6
-rw-r--r--Swiften/Network/NullNATTraversalInterface.h2
-rw-r--r--Swiften/Network/NullNATTraverser.cpp6
-rw-r--r--Swiften/Network/NullNATTraverser.h6
-rw-r--r--Swiften/Network/PlatformDomainNameServiceQuery.cpp61
-rw-r--r--Swiften/Network/PlatformNATTraversalWorker.cpp16
-rw-r--r--Swiften/Network/PlatformNATTraversalWorker.h6
-rw-r--r--Swiften/Network/ProxiedConnection.cpp6
-rw-r--r--Swiften/Network/ProxiedConnection.h6
-rw-r--r--Swiften/Network/SOCKS5ProxiedConnection.cpp16
-rw-r--r--Swiften/Network/SOCKS5ProxiedConnection.h6
-rw-r--r--Swiften/Network/SOCKS5ProxiedConnectionFactory.cpp2
-rw-r--r--Swiften/Network/SOCKS5ProxiedConnectionFactory.h6
-rw-r--r--Swiften/Network/StaticDomainNameResolver.cpp10
-rw-r--r--Swiften/Network/StaticDomainNameResolver.h4
-rw-r--r--Swiften/Network/TLSConnection.cpp5
-rw-r--r--Swiften/Network/TLSConnection.h4
-rw-r--r--Swiften/Network/UnboundDomainNameResolver.cpp26
-rw-r--r--Swiften/Network/UnitTest/BOSHConnectionPoolTest.cpp8
-rw-r--r--Swiften/Network/UnitTest/BOSHConnectionTest.cpp2
-rw-r--r--Swiften/Network/UnitTest/ConnectorTest.cpp29
-rw-r--r--Swiften/Network/UnitTest/HTTPConnectProxiedConnectionTest.cpp8
-rw-r--r--Swiften/Network/UnitTest/HostAddressTest.cpp30
-rw-r--r--Swiften/Network/WindowsProxyProvider.cpp9
-rw-r--r--Swiften/Parser/Attribute.h8
-rw-r--r--Swiften/Parser/AttributeMap.cpp24
-rw-r--r--Swiften/Parser/AttributeMap.h1
-rw-r--r--Swiften/Parser/BOSHBodyExtractor.cpp10
-rw-r--r--Swiften/Parser/ExpatParser.cpp92
-rw-r--r--Swiften/Parser/ExpatParser.h6
-rw-r--r--Swiften/Parser/IQParser.cpp4
-rw-r--r--Swiften/Parser/LibXMLParser.cpp94
-rw-r--r--Swiften/Parser/LibXMLParser.h9
-rw-r--r--Swiften/Parser/PayloadParsers/BytestreamsParser.cpp7
-rw-r--r--Swiften/Parser/PayloadParsers/FullPayloadParserFactoryCollection.cpp4
-rw-r--r--Swiften/Parser/PayloadParsers/IBBParser.cpp4
-rw-r--r--Swiften/Parser/PayloadParsers/JingleS5BTransportMethodPayloadParser.cpp9
-rw-r--r--Swiften/Parser/PayloadParsers/MIXJoinParser.cpp8
-rw-r--r--Swiften/Parser/PayloadParsers/MIXSubscribeParser.cpp36
-rw-r--r--Swiften/Parser/PayloadParsers/MIXSubscribeParser.h37
-rw-r--r--Swiften/Parser/PayloadParsers/MIXUpdateSubscriptionParser.cpp49
-rw-r--r--Swiften/Parser/PayloadParsers/MIXUpdateSubscriptionParser.h36
-rw-r--r--Swiften/Parser/PayloadParsers/ReferencePayloadParser.cpp79
-rw-r--r--Swiften/Parser/PayloadParsers/ReferencePayloadParser.h35
-rw-r--r--Swiften/Parser/PayloadParsers/S5BProxyRequestParser.cpp12
-rw-r--r--Swiften/Parser/PayloadParsers/UnitTest/MIXJoinParserTest.cpp48
-rw-r--r--Swiften/Parser/PayloadParsers/UnitTest/MIXUpdateSubscriptionParserTest.cpp49
-rw-r--r--Swiften/Parser/PayloadParsers/UnitTest/PayloadsParserTester.h2
-rw-r--r--Swiften/Parser/PayloadParsers/UnitTest/ReferencePayloadParserTest.cpp134
-rw-r--r--Swiften/Parser/PlatformXMLParserFactory.cpp6
-rw-r--r--Swiften/Parser/PlatformXMLParserFactory.h2
-rw-r--r--Swiften/Parser/PresenceParser.cpp4
-rw-r--r--Swiften/Parser/SConscript3
-rw-r--r--Swiften/Parser/StanzaAckParser.cpp4
-rw-r--r--Swiften/Parser/StreamErrorParser.cpp6
-rw-r--r--Swiften/Parser/Tree/ParserElement.cpp12
-rw-r--r--Swiften/Parser/UnitTest/AttributeMapTest.cpp17
-rw-r--r--Swiften/Parser/UnitTest/XMLParserTest.cpp156
-rw-r--r--Swiften/Parser/XMLParser.cpp2
-rw-r--r--Swiften/Parser/XMLParser.h11
-rw-r--r--Swiften/Parser/XMLParserClient.cpp11
-rw-r--r--Swiften/Parser/XMLParserClient.h18
-rw-r--r--Swiften/Parser/XMLParserFactory.h2
-rw-r--r--Swiften/QA/ClientTest/ClientTest.cpp15
-rw-r--r--Swiften/QA/DNSSDTest/DNSSDTest.cpp8
-rw-r--r--Swiften/QA/DNSSDTest/SConscript2
-rw-r--r--Swiften/QA/FileTransferTest/FileTransferTest.cpp9
-rw-r--r--Swiften/QA/NetworkTest/DomainNameResolverTest.cpp10
-rw-r--r--Swiften/QA/StorageTest/SConscript3
-rw-r--r--Swiften/QA/TLSTest/CertificateTest.cpp69
-rw-r--r--Swiften/QA/TLSTest/SConscript2
-rw-r--r--Swiften/QA/TLSTest/certificateChain.pem49
-rw-r--r--Swiften/QA/TLSTest/privateKey.pem40
-rw-r--r--Swiften/Roster/XMPPRosterController.cpp4
-rw-r--r--Swiften/SASL/UnitTest/WindowsServicePrincipalNameTest.cpp10
-rw-r--r--Swiften/SASL/WindowsAuthentication.cpp34
-rw-r--r--Swiften/SASL/WindowsGSSAPIClientAuthenticator.cpp24
-rw-r--r--Swiften/SASL/WindowsServicePrincipalName.cpp20
-rw-r--r--Swiften/SASL/WindowsServicePrincipalName.h4
-rw-r--r--Swiften/SConscript25
-rw-r--r--Swiften/Serializer/PayloadSerializers/BytestreamsSerializer.cpp2
-rw-r--r--Swiften/Serializer/PayloadSerializers/FullPayloadSerializerCollection.cpp5
-rw-r--r--Swiften/Serializer/PayloadSerializers/IBBSerializer.cpp4
-rw-r--r--Swiften/Serializer/PayloadSerializers/JingleFileTransferFileInfoSerializer.cpp4
-rw-r--r--Swiften/Serializer/PayloadSerializers/JingleIBBTransportPayloadSerializer.cpp2
-rw-r--r--Swiften/Serializer/PayloadSerializers/JinglePayloadSerializer.cpp6
-rw-r--r--Swiften/Serializer/PayloadSerializers/JingleS5BTransportPayloadSerializer.cpp4
-rw-r--r--Swiften/Serializer/PayloadSerializers/LastSerializer.h2
-rw-r--r--Swiften/Serializer/PayloadSerializers/MIXJoinSerializer.cpp13
-rw-r--r--Swiften/Serializer/PayloadSerializers/MIXSubscribeSerializer.cpp29
-rw-r--r--Swiften/Serializer/PayloadSerializers/MIXSubscribeSerializer.h30
-rw-r--r--Swiften/Serializer/PayloadSerializers/MIXUpdateSubscriptionSerializer.cpp43
-rw-r--r--Swiften/Serializer/PayloadSerializers/MIXUpdateSubscriptionSerializer.h30
-rw-r--r--Swiften/Serializer/PayloadSerializers/MUCPayloadSerializer.cpp6
-rw-r--r--Swiften/Serializer/PayloadSerializers/PrioritySerializer.h2
-rw-r--r--Swiften/Serializer/PayloadSerializers/PubSubItemsSerializer.cpp2
-rw-r--r--Swiften/Serializer/PayloadSerializers/ReferencePayloadSerializer.cpp64
-rw-r--r--Swiften/Serializer/PayloadSerializers/ReferencePayloadSerializer.h26
-rw-r--r--Swiften/Serializer/PayloadSerializers/ResultSetSerializer.cpp8
-rw-r--r--Swiften/Serializer/PayloadSerializers/S5BProxyRequestSerializer.h2
-rw-r--r--Swiften/Serializer/PayloadSerializers/StreamInitiationFileInfoSerializer.cpp4
-rw-r--r--Swiften/Serializer/PayloadSerializers/StreamInitiationSerializer.cpp2
-rw-r--r--Swiften/Serializer/PayloadSerializers/UnitTest/MIXJoinSerializerTest.cpp76
-rw-r--r--Swiften/Serializer/PayloadSerializers/UnitTest/MIXUpdateSubscriptionSerializerTest.cpp36
-rw-r--r--Swiften/Serializer/PayloadSerializers/UnitTest/ReferencePayloadSerializerTest.cpp81
-rw-r--r--Swiften/Serializer/PayloadSerializers/UserTuneSerializer.cpp4
-rw-r--r--Swiften/Serializer/PayloadSerializers/WhiteboardSerializer.cpp66
-rw-r--r--Swiften/Serializer/StanzaAckSerializer.h2
-rw-r--r--Swiften/Serializer/StanzaSerializer.cpp4
-rw-r--r--Swiften/Serializer/StreamErrorSerializer.cpp2
-rw-r--r--Swiften/Serializer/StreamResumeSerializer.cpp2
-rw-r--r--Swiften/Serializer/StreamResumedSerializer.cpp2
-rw-r--r--Swiften/Serializer/XML/UnitTest/XMLElementTest.cpp7
-rw-r--r--Swiften/Serializer/XML/XMLElement.cpp17
-rw-r--r--Swiften/Serializer/XML/XMLElement.h1
-rw-r--r--Swiften/Serializer/XMPPSerializer.cpp4
-rw-r--r--Swiften/Session/BasicSessionStream.cpp49
-rw-r--r--Swiften/Session/BasicSessionStream.h9
-rw-r--r--Swiften/Session/Session.cpp28
-rw-r--r--Swiften/Session/Session.h16
-rw-r--r--Swiften/StreamManagement/StanzaAckRequester.cpp8
-rw-r--r--Swiften/StreamManagement/StanzaAckResponder.cpp6
-rw-r--r--Swiften/StreamManagement/UnitTest/StanzaAckRequesterTest.cpp7
-rw-r--r--Swiften/StreamManagement/UnitTest/StanzaAckResponderTest.cpp7
-rw-r--r--Swiften/StreamStack/StreamStack.cpp24
-rw-r--r--Swiften/StreamStack/StreamStack.h30
-rw-r--r--Swiften/StreamStack/TLSLayer.cpp30
-rw-r--r--Swiften/StreamStack/TLSLayer.h8
-rw-r--r--Swiften/StreamStack/UnitTest/StreamStackTest.cpp45
-rw-r--r--Swiften/StreamStack/WhitespacePingLayer.cpp4
-rw-r--r--Swiften/TLS/CAPICertificate.cpp67
-rw-r--r--Swiften/TLS/CertificateFactory.cpp23
-rw-r--r--Swiften/TLS/CertificateFactory.h8
-rw-r--r--Swiften/TLS/OpenSSL/OpenSSLCertificate.cpp16
-rw-r--r--Swiften/TLS/OpenSSL/OpenSSLCertificate.h2
-rw-r--r--Swiften/TLS/OpenSSL/OpenSSLCertificateFactory.cpp56
-rw-r--r--Swiften/TLS/OpenSSL/OpenSSLCertificateFactory.h10
-rw-r--r--Swiften/TLS/OpenSSL/OpenSSLContext.cpp716
-rw-r--r--Swiften/TLS/OpenSSL/OpenSSLContext.h74
-rw-r--r--Swiften/TLS/OpenSSL/OpenSSLContextFactory.cpp36
-rw-r--r--Swiften/TLS/OpenSSL/OpenSSLContextFactory.h14
-rw-r--r--Swiften/TLS/PrivateKey.cpp22
-rw-r--r--Swiften/TLS/PrivateKey.h33
-rw-r--r--Swiften/TLS/SConscript4
-rw-r--r--Swiften/TLS/Schannel/SchannelContext.cpp29
-rw-r--r--Swiften/TLS/Schannel/SchannelContextFactory.cpp8
-rw-r--r--Swiften/TLS/Schannel/SchannelContextFactory.h7
-rw-r--r--Swiften/TLS/SecureTransport/SecureTransportCertificate.mm9
-rw-r--r--Swiften/TLS/SecureTransport/SecureTransportContext.mm70
-rw-r--r--Swiften/TLS/SecureTransport/SecureTransportContextFactory.cpp10
-rw-r--r--Swiften/TLS/SecureTransport/SecureTransportContextFactory.h6
-rw-r--r--Swiften/TLS/ServerIdentityVerifier.cpp12
-rw-r--r--Swiften/TLS/ServerIdentityVerifier.h3
-rw-r--r--Swiften/TLS/TLSContext.cpp36
-rw-r--r--Swiften/TLS/TLSContext.h23
-rw-r--r--Swiften/TLS/TLSContextFactory.cpp7
-rw-r--r--Swiften/TLS/TLSContextFactory.h12
-rw-r--r--Swiften/TLS/TLSError.h18
-rw-r--r--Swiften/TLS/TLSOptions.h54
-rw-r--r--Swiften/TLS/UnitTest/CertificateTest.cpp111
-rw-r--r--Swiften/TLS/UnitTest/ClientServerTest.cpp883
-rw-r--r--Swiften/TLS/UnitTest/ServerIdentityVerifierTest.cpp52
-rw-r--r--Swiften/VCards/UnitTest/VCardManagerTest.cpp127
-rw-r--r--Swiften/VCards/VCardManager.cpp5
-rwxr-xr-xscons6
-rw-r--r--scons.bat2
2708 files changed, 569364 insertions, 91017 deletions
diff --git a/.clang-tidy b/.clang-tidy
new file mode 100644
index 0000000..406a7e0
--- /dev/null
+++ b/.clang-tidy
@@ -0,0 +1,112 @@
+---
+Checks: >
+ -*,
+ boost-use-to-string,
+ # M-Link checks to enable later
+ # clang-diagnostic-*,
+ # misc-definitions-in-headers,
+ # misc-forwarding-reference-overload,
+ # misc-incorrect-roundings,
+ # misc-lambda-function-name,
+ # misc-macro-repeated-side-effects,
+ # misc-misplaced-const,
+ # misc-misplaced-widening-cast,
+ # misc-new-delete-overloads,
+ # misc-non-copyable-objects,
+ # misc-redundant-expression,
+ # misc-sizeof-container,
+ # misc-sizeof-expression,
+ # misc-static-assert,
+ # misc-string-compare,
+ # misc-string-integer-assignment,
+ # misc-string-literal-with-embedded-nul,
+ # misc-suspicious-enum-usage,
+ # misc-suspicious-missing-comma,
+ # misc-suspicious-semicolon,
+ # misc-suspicious-string-compare,
+ # misc-swapped-arguments,
+ # misc-throw-by-value-catch-by-reference,
+ # misc-unconventional-assign-operator,
+ # misc-undelegated-constructor,
+ # misc-uniqueptr-reset-release,
+ # misc-unused-alias-decls,
+ # misc-unused-raii,
+ # misc-unused-using-decls,
+ # modernize-avoid-bind,
+ # modernize-deprecated-headers,
+ # modernize-loop-convert,
+ # modernize-make-shared,
+ # modernize-make-unique,
+ # modernize-raw-string-literal,
+ # modernize-redundant-void-arg,
+ # modernize-replace-auto-ptr,
+ # modernize-replace-random-shuffle,
+ # modernize-return-braced-init-list,
+ # modernize-shrink-to-fit,
+ # modernize-unary-static-assert,
+ # modernize-use-bool-literals,
+ # modernize-use-default-member-init,
+ # modernize-use-equals-delete,
+ # modernize-use-noexcept,
+ # modernize-use-transparent-functors,
+ # modernize-use-uncaught-exceptions,
+ # modernize-use-using,
+ # performance-faster-string-find,
+ # performance-implicit-conversion-in-loop,
+ # performance-inefficient-algorithm,
+ # performance-inefficient-string-concatenation,
+ # performance-inefficient-vector-operation,
+ # performance-move-constructor-init,
+ # performance-noexcept-move-constructor,
+ # performance-type-promotion-in-math-fn,
+ # performance-unnecessary-copy-initialization,
+ # readability-avoid-const-params-in-decls,
+ # readability-delete-null-pointer,
+ # readability-deleted-default,
+ # readability-function-size,
+ # readability-identifier-naming,
+ # readability-inconsistent-declaration-parameter-name,
+ # readability-misleading-indentation,
+ # readability-misplaced-array-index,
+ # readability-non-const-parameter,
+ # readability-redundant-control-flow,
+ # readability-redundant-declaration,
+ # readability-redundant-function-ptr-dereference,
+ # readability-redundant-member-init,
+ # readability-redundant-smartptr-get,
+ # readability-redundant-string-cstr,
+ # readability-redundant-string-init,
+ # readability-simplify-subscript-expr,
+ # readability-static-accessed-through-instance,
+ # readability-static-definition-in-anonymous-namespace,
+ # readability-string-compare,
+ # readability-uniqueptr-delete-release
+# Fix code and enable checks:
+# misc-unused-parameters,
+# modernize-pass-by-value,
+# modernize-use-auto,
+# modernize-use-emplace,
+# modernize-use-equals-default,
+# modernize-use-nullptr,
+# modernize-use-override,
+# performance-for-range-copy,
+# performance-move-const-arg,
+# performance-unnecessary-value-param,
+# readability-braces-around-statements,
+# readability-container-size-empty,
+# readability-else-after-return,
+# readability-implicit-bool-conversion,
+# readability-named-parameter,
+# readability-redundant-smartptr-get,
+# readability-simplify-boolean-expr,
+HeaderFilterRegex: '(Swift|Swiften|Sluift)/.*'
+AnalyzeTemporaryDtors: false
+CheckOptions:
+ - key: modernize-loop-convert.MaxCopySize
+ value: '16'
+ - key: modernize-loop-convert.MinConfidence
+ value: reasonable
+ - key: modernize-use-nullptr.NullMacros
+ value: 'NULL'
+ - key: readability-identifier-naming.PrivateMemberSuffix
+ value: '_'
diff --git a/.gitignore b/.gitignore
index 2fd9953..d28db8b 100644
--- a/.gitignore
+++ b/.gitignore
@@ -84,3 +84,4 @@ compile_commands.json
*.vcxproj.filters
*.vcxproj.user
*.sdf
+tags
diff --git a/3rdParty/Breakpad/.gitignore b/3rdParty/Breakpad/.gitignore
index 77270bf..cfc012f 100644
--- a/3rdParty/Breakpad/.gitignore
+++ b/3rdParty/Breakpad/.gitignore
@@ -1 +1,89 @@
-dump_syms
+# Copyright 2014 Google Inc. All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following disclaimer
+# in the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of Google Inc. nor the names of its
+# contributors may be used to endorse or promote products derived from
+# this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+# Ignore other VCSs.
+.repo/
+.svn/
+
+# Ignore common compiled artifacts.
+*~
+*.dwo
+*.o
+lib*.a
+/breakpad.pc
+/breakpad-client.pc
+/src/client/linux/linux_client_unittest_shlib
+/src/client/linux/linux_dumper_unittest_helper
+/src/processor/microdump_stackwalk
+/src/processor/minidump_dump
+/src/processor/minidump_stackwalk
+/src/tools/linux/core2md/core2md
+/src/tools/linux/dump_syms/dump_syms
+/src/tools/linux/md2core/minidump-2-core
+/src/tools/linux/symupload/minidump_upload
+/src/tools/linux/symupload/sym_upload
+/src/tools/mac/dump_syms/dump_syms
+/src/tools/mac/dump_syms/dump_syms_mac
+
+# Ignore unit test artifacts.
+*_unittest
+*.log
+*.trs
+
+# Ignore autotools generated artifacts.
+.deps
+.dirstamp
+autom4te.cache/
+/config.cache
+config.h
+/config.log
+/config.status
+/Makefile
+stamp-h1
+
+# Ignore GYP generated Visual Studio artifacts.
+*.filters
+*.sdf
+*.sln
+*.suo
+*.vcproj
+*.vcxproj
+
+# Ignore GYP generated Makefiles
+src/Makefile
+*.Makefile
+*.target.mk
+
+# Ignore compiled Python files.
+*.pyc
+
+# Ignore directories gclient syncs.
+src/testing
+src/third_party/lss
+src/third_party/protobuf
+src/tools/gyp
diff --git a/3rdParty/Breakpad/AUTHORS b/3rdParty/Breakpad/AUTHORS
new file mode 100644
index 0000000..4858b37
--- /dev/null
+++ b/3rdParty/Breakpad/AUTHORS
@@ -0,0 +1 @@
+opensource@google.com
diff --git a/3rdParty/Breakpad/BreakpadSwiftCleanup.sh b/3rdParty/Breakpad/BreakpadSwiftCleanup.sh
new file mode 100644
index 0000000..9649cd2
--- /dev/null
+++ b/3rdParty/Breakpad/BreakpadSwiftCleanup.sh
@@ -0,0 +1,58 @@
+#!/bin/sh
+# This script removes parts of the breakpad repository that are not used by swift
+
+rm -rf README.ANDROID
+rm -rf .travis.yml
+rm -rf aclocal.m4
+rm -rf appveyor.yml
+rm -rf configure
+rm -rf configure.ac
+rm -rf Makefile.am
+rm -rf Makefile.in
+rm -rf breakpad.pc
+rm -rf codereview.settings
+rm -rf breakpad-client.pc.in
+rm -rf DEPS INSTALL
+rm -rf .git/
+rm -rf m4/
+rm -rf docs/
+rm -rf autotools/
+rm -rf android/
+rm -rf scripts/
+rm -rf src/build/
+rm -rf src/third_party
+rm -rf src/tools
+rm -rf src/client/ios/
+rm -rf src/client/apple/
+rm -rf src/client/linux/
+rm -rf src/client/solaris/
+rm -rf src/client/mac/Framework
+rm -rf src/client/mac/Breakpad.xcodeproj
+rm -rf src/client/mac/sender
+rm -rf src/client/mac/testapp
+rm -rf src/client/mac/tests
+rm -rf src/client/mac/UnitTests-Info.plist
+rm -rf src/client/mac/handler/minidump_test.xcodeproj/project.pbxproj
+rm -rf src/client/mac/handler/minidump_tests32-Info.plist
+rm -rf src/client/mac/handler/minidump_tests64-Info.plist
+rm -rf src/client/mac/handler/obj-cTestCases-Info.plist
+rm -rf src/client/mac/handler/testcases/
+rm -rf src/client/windows/unittests
+rm -rf src/client/windows/sender
+rm -rf src/client/windows/tests
+rm -rf src/client/windows/breakpad_client.gyp
+rm -rf src/client/windows/handler/exception_handler.gyp
+rm -rf src/client/windows/crash_generation/crash_generation.gyp
+rm -rf src/client/mac/handler/testcases/testdata/
+rm -rf src/common/linux/tests/
+find src/common/linux -type f ! -name 'linux_libc_support.h' -delete
+rm -rf src/common/windows/common_windows.gyp
+rm -rf src/common/android/
+rm -rf src/common/solaris/
+rm -rf src/common/tests/
+rm -rf src/common/testdata/
+rm -rf src/common/mac/testing/
+rm -rf src/common/common.gyp
+rm -rf src/processor
+rm -rf src/google_breakpad/processor
+
diff --git a/3rdParty/Breakpad/ChangeLog b/3rdParty/Breakpad/ChangeLog
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/3rdParty/Breakpad/ChangeLog
diff --git a/3rdParty/Breakpad/LICENSE b/3rdParty/Breakpad/LICENSE
new file mode 100644
index 0000000..95207bd
--- /dev/null
+++ b/3rdParty/Breakpad/LICENSE
@@ -0,0 +1,50 @@
+Copyright (c) 2006, Google Inc.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+ * Redistributions of source code must retain the above copyright
+notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the following disclaimer
+in the documentation and/or other materials provided with the
+distribution.
+ * Neither the name of Google Inc. nor the names of its
+contributors may be used to endorse or promote products derived from
+this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+--------------------------------------------------------------------
+
+Copyright 2001-2004 Unicode, Inc.
+
+Disclaimer
+
+This source code is provided as is by Unicode, Inc. No claims are
+made as to fitness for any particular purpose. No warranties of any
+kind are expressed or implied. The recipient agrees to determine
+applicability of information provided. If this file has been
+purchased on magnetic or optical media from Unicode, Inc., the
+sole remedy for any claim will be exchange of defective media
+within 90 days of receipt.
+
+Limitations on Rights to Redistribute This Code
+
+Unicode, Inc. hereby grants the right to freely use the information
+supplied in this file in the creation of products supporting the
+Unicode Standard, and to make copies of this file in any form
+for internal or external distribution as long as this notice
+remains attached.
diff --git a/3rdParty/Breakpad/NEWS b/3rdParty/Breakpad/NEWS
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/3rdParty/Breakpad/NEWS
diff --git a/3rdParty/Breakpad/README.md b/3rdParty/Breakpad/README.md
new file mode 100644
index 0000000..caefdd2
--- /dev/null
+++ b/3rdParty/Breakpad/README.md
@@ -0,0 +1,82 @@
+# Breakpad
+
+Breakpad is a set of client and server components which implement a
+crash-reporting system.
+
+* [Homepage](https://chromium.googlesource.com/breakpad/breakpad/)
+* [Documentation](https://chromium.googlesource.com/breakpad/breakpad/+/master/docs/)
+* [Bugs](https://bugs.chromium.org/p/google-breakpad/)
+* Discussion/Questions: [google-breakpad-discuss@googlegroups.com](https://groups.google.com/d/forum/google-breakpad-discuss)
+* Developer/Reviews: [google-breakpad-dev@googlegroups.com](https://groups.google.com/d/forum/google-breakpad-dev)
+* Tests: [![Build Status](https://travis-ci.org/google/breakpad.svg?branch=master)](https://travis-ci.org/google/breakpad) [![Build status](https://ci.appveyor.com/api/projects/status/eguv4emv2rhq68u2?svg=true)](https://ci.appveyor.com/project/vapier/breakpad)
+* Coverage [![Coverity Status](https://scan.coverity.com/projects/9215/badge.svg)](https://scan.coverity.com/projects/google-breakpad)
+
+## Getting started (from master)
+
+1. First, [download depot_tools](http://dev.chromium.org/developers/how-tos/install-depot-tools)
+ and ensure that they’re in your `PATH`.
+
+2. Create a new directory for checking out the source code (it must be named
+ breakpad).
+
+ ```sh
+ mkdir breakpad && cd breakpad
+ ```
+
+3. Run the `fetch` tool from depot_tools to download all the source repos.
+
+ ```sh
+ fetch breakpad
+ cd src
+ ```
+
+4. Build the source.
+
+ ```sh
+ ./configure && make
+ ```
+
+ You can also cd to another directory and run configure from there to build
+ outside the source tree.
+
+ This will build the processor tools (`src/processor/minidump_stackwalk`,
+ `src/processor/minidump_dump`, etc), and when building on Linux it will
+ also build the client libraries and some tools
+ (`src/tools/linux/dump_syms/dump_syms`,
+ `src/tools/linux/md2core/minidump-2-core`, etc).
+
+5. Optionally, run tests.
+
+ ```sh
+ make check
+ ```
+
+6. Optionally, install the built libraries
+
+ ```sh
+ make install
+ ```
+
+If you need to reconfigure your build be sure to run `make distclean` first.
+
+To update an existing checkout to a newer revision, you can
+`git pull` as usual, but then you should run `gclient sync` to ensure that the
+dependent repos are up-to-date.
+
+## To request change review
+
+1. Follow the steps above to get the source and build it.
+
+2. Make changes. Build and test your changes.
+ For core code like processor use methods above.
+ For linux/mac/windows, there are test targets in each project file.
+
+3. Commit your changes to your local repo and upload them to the server.
+ http://dev.chromium.org/developers/contributing-code
+ e.g. `git commit ... && git cl upload ...`
+ You will be prompted for credential and a description.
+
+4. At https://chromium-review.googlesource.com/ you'll find your issue listed;
+ click on it, then “Add reviewerâ€, and enter in the code reviewer. Depending
+ on your settings, you may not see an email, but the reviewer has been
+ notified with google-breakpad-dev@googlegroups.com always CC’d.
diff --git a/3rdParty/Breakpad/breakpad.pc.in b/3rdParty/Breakpad/breakpad.pc.in
new file mode 100644
index 0000000..9aec9f8
--- /dev/null
+++ b/3rdParty/Breakpad/breakpad.pc.in
@@ -0,0 +1,10 @@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@/@PACKAGE_NAME@
+
+Name: google-breakpad
+Description: An open-source multi-platform crash reporting system
+Version: @PACKAGE_VERSION@
+Libs: -L${libdir} -lbreakpad @PTHREAD_LIBS@
+Cflags: -I${includedir} @PTHREAD_CFLAGS@
diff --git a/3rdParty/Breakpad/default.xml b/3rdParty/Breakpad/default.xml
new file mode 100644
index 0000000..6fba2d6
--- /dev/null
+++ b/3rdParty/Breakpad/default.xml
@@ -0,0 +1,43 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- AUTOGENERATED BY deps-to-manifest.py; DO NOT EDIT -->
+<manifest>
+
+ <default revision='refs/heads/master'
+ remote='chromium'
+ sync-c='true'
+ sync-j='8' />
+
+ <remote name='github'
+ fetch='https://github.com/'
+ review='' />
+
+ <remote name='chromium'
+ fetch='https://chromium.googlesource.com/'
+ review='https://chromium-review.googlesource.com' />
+
+ <project path='src'
+ name='breakpad/breakpad'
+ revision='refs/heads/master'
+ remote='chromium' />
+
+ <project path='src/src/tools/gyp'
+ name='external/gyp/'
+ revision='324dd166b7c0b39d513026fa52d6280ac6d56770'
+ remote='chromium' />
+
+ <project path='src/src/testing'
+ name='google/googletest.git'
+ revision='refs/tags/release-1.8.0'
+ remote='github' />
+
+ <project path='src/src/third_party/lss'
+ name='linux-syscall-support/'
+ revision='a91633d172407f6c83dd69af11510b37afebb7f9'
+ remote='chromium' />
+
+ <project path='src/src/third_party/protobuf/protobuf'
+ name='google/protobuf.git'
+ revision='cb6dd4ef5f82e41e06179dcd57d3b1d9246ad6ac'
+ remote='github' />
+
+</manifest>
diff --git a/3rdParty/Breakpad/src/COPYING b/3rdParty/Breakpad/src/COPYING
deleted file mode 100644
index d15b0c2..0000000
--- a/3rdParty/Breakpad/src/COPYING
+++ /dev/null
@@ -1,28 +0,0 @@
-Copyright (c) 2006, Google Inc.
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-
- * Redistributions of source code must retain the above copyright
-notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
-copyright notice, this list of conditions and the following disclaimer
-in the documentation and/or other materials provided with the
-distribution.
- * Neither the name of Google Inc. nor the names of its
-contributors may be used to endorse or promote products derived from
-this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/3rdParty/Breakpad/src/breakpad_googletest_includes.h b/3rdParty/Breakpad/src/breakpad_googletest_includes.h
new file mode 100644
index 0000000..19a3e98
--- /dev/null
+++ b/3rdParty/Breakpad/src/breakpad_googletest_includes.h
@@ -0,0 +1,57 @@
+// Copyright (c) 2009, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#ifndef BREAKPAD_GOOGLETEST_INCLUDES_H__
+#define BREAKPAD_GOOGLETEST_INCLUDES_H__
+
+#include "gtest/gtest.h"
+#include "gmock/gmock.h"
+
+// If AddressSanitizer is used, NULL pointer dereferences generate SIGILL
+// (illegal instruction) instead of SIGSEGV (segmentation fault). Also,
+// the number of memory regions differs, so there is no point in running
+// this test if AddressSanitizer is used.
+//
+// Ideally we'd use this attribute to disable ASAN on a per-func basis,
+// but this doesn't seem to actually work, and it's changed names over
+// time. So just stick with disabling the actual tests.
+// http://crbug.com/304575
+//#define NO_ASAN __attribute__((no_sanitize_address))
+#if defined(__clang__) && defined(__has_feature)
+// Have to keep this check sep from above as newer gcc will barf on it.
+# if __has_feature(address_sanitizer)
+# define ADDRESS_SANITIZER
+# endif
+#elif defined(__GNUC__) && defined(__SANITIZE_ADDRESS__)
+# define ADDRESS_SANITIZER
+#else
+# undef ADDRESS_SANITIZER
+#endif
+
+#endif // BREAKPAD_GOOGLETEST_INCLUDES_H__
diff --git a/3rdParty/Breakpad/src/client/mac/crash_generation/ConfigFile.h b/3rdParty/Breakpad/src/client/mac/crash_generation/ConfigFile.h
new file mode 100644
index 0000000..5662e8b
--- /dev/null
+++ b/3rdParty/Breakpad/src/client/mac/crash_generation/ConfigFile.h
@@ -0,0 +1,83 @@
+// Copyright (c) 2011, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Utility class that can persist a SimpleStringDictionary to disk.
+
+#import <Foundation/Foundation.h>
+
+#include "common/simple_string_dictionary.h"
+
+namespace google_breakpad {
+
+BOOL EnsureDirectoryPathExists(NSString *dirPath);
+
+//=============================================================================
+class ConfigFile {
+ public:
+ ConfigFile() {
+ config_file_ = -1;
+ config_file_path_[0] = 0;
+ has_created_file_ = false;
+ };
+
+ ~ConfigFile() {
+ };
+
+ void WriteFile(const char* directory,
+ const SimpleStringDictionary *configurationParameters,
+ const char *dump_dir,
+ const char *minidump_id);
+
+ const char *GetFilePath() { return config_file_path_; }
+
+ void Unlink() {
+ if (config_file_ != -1)
+ unlink(config_file_path_);
+
+ config_file_ = -1;
+ }
+
+ private:
+ BOOL WriteData(const void *data, size_t length);
+
+ BOOL AppendConfigData(const char *key,
+ const void *data,
+ size_t length);
+
+ BOOL AppendConfigString(const char *key,
+ const char *value);
+
+ BOOL AppendCrashTimeParameters(const char *processStartTimeString);
+
+ int config_file_; // descriptor for config file
+ char config_file_path_[PATH_MAX]; // Path to configuration file
+ bool has_created_file_;
+};
+
+} // namespace google_breakpad
diff --git a/3rdParty/Breakpad/src/client/mac/crash_generation/ConfigFile.mm b/3rdParty/Breakpad/src/client/mac/crash_generation/ConfigFile.mm
new file mode 100644
index 0000000..acab7de
--- /dev/null
+++ b/3rdParty/Breakpad/src/client/mac/crash_generation/ConfigFile.mm
@@ -0,0 +1,167 @@
+// Copyright (c) 2011, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Utility class that can persist a SimpleStringDictionary to disk.
+
+#import "client/mac/crash_generation/ConfigFile.h"
+
+#import <Foundation/Foundation.h>
+#include <stdio.h>
+#include <sys/time.h>
+
+#import "client/apple/Framework/BreakpadDefines.h"
+#import "common/mac/GTMDefines.h"
+
+
+namespace google_breakpad {
+
+//=============================================================================
+BOOL EnsureDirectoryPathExists(NSString *dirPath) {
+ NSFileManager *mgr = [NSFileManager defaultManager];
+
+ NSDictionary *attrs =
+ [NSDictionary dictionaryWithObject:[NSNumber numberWithUnsignedLong:0750]
+ forKey:NSFilePosixPermissions];
+
+ return [mgr createDirectoryAtPath:dirPath
+ withIntermediateDirectories:YES
+ attributes:attrs
+ error:nil];
+}
+
+//=============================================================================
+BOOL ConfigFile::WriteData(const void *data, size_t length) {
+ size_t result = write(config_file_, data, length);
+
+ return result == length;
+}
+
+//=============================================================================
+BOOL ConfigFile::AppendConfigData(const char *key,
+ const void *data, size_t length) {
+ assert(config_file_ != -1);
+
+ if (!key) {
+ return NO;
+ }
+
+ if (!data) {
+ return NO;
+ }
+
+ // Write the key, \n, length of data (ascii integer), \n, data
+ char buffer[16];
+ char nl = '\n';
+ BOOL result = WriteData(key, strlen(key));
+
+ snprintf(buffer, sizeof(buffer) - 1, "\n%lu\n", length);
+ result &= WriteData(buffer, strlen(buffer));
+ result &= WriteData(data, length);
+ result &= WriteData(&nl, 1);
+ return result;
+}
+
+//=============================================================================
+BOOL ConfigFile::AppendConfigString(const char *key,
+ const char *value) {
+ return AppendConfigData(key, value, strlen(value));
+}
+
+//=============================================================================
+BOOL ConfigFile::AppendCrashTimeParameters(const char *processStartTimeString) {
+ // Set process uptime parameter
+ struct timeval tv;
+ gettimeofday(&tv, NULL);
+
+ char processUptimeString[32], processCrashtimeString[32];
+ // Set up time if we've received the start time.
+ if (processStartTimeString) {
+ time_t processStartTime = strtol(processStartTimeString, NULL, 10);
+ time_t processUptime = tv.tv_sec - processStartTime;
+ // Store the uptime in milliseconds.
+ sprintf(processUptimeString, "%llu",
+ static_cast<unsigned long long int>(processUptime) * 1000);
+ if (!AppendConfigString(BREAKPAD_PROCESS_UP_TIME, processUptimeString))
+ return false;
+ }
+
+ sprintf(processCrashtimeString, "%zd", tv.tv_sec);
+ return AppendConfigString(BREAKPAD_PROCESS_CRASH_TIME,
+ processCrashtimeString);
+}
+
+//=============================================================================
+void ConfigFile::WriteFile(const char* directory,
+ const SimpleStringDictionary *configurationParameters,
+ const char *dump_dir,
+ const char *minidump_id) {
+
+ assert(config_file_ == -1);
+
+ // Open and write out configuration file preamble
+ if (directory) {
+ snprintf(config_file_path_, sizeof(config_file_path_), "%s/Config-XXXXXX",
+ directory);
+ } else {
+ strlcpy(config_file_path_, "/tmp/Config-XXXXXX",
+ sizeof(config_file_path_));
+ }
+ config_file_ = mkstemp(config_file_path_);
+
+ if (config_file_ == -1) {
+ return;
+ }
+
+ has_created_file_ = true;
+
+ // Add the minidump dir
+ AppendConfigString(kReporterMinidumpDirectoryKey, dump_dir);
+ AppendConfigString(kReporterMinidumpIDKey, minidump_id);
+
+ // Write out the configuration parameters
+ BOOL result = YES;
+ const SimpleStringDictionary &dictionary = *configurationParameters;
+
+ const SimpleStringDictionary::Entry *entry = NULL;
+ SimpleStringDictionary::Iterator iter(dictionary);
+
+ while ((entry = iter.Next())) {
+ result = AppendConfigString(entry->key, entry->value);
+
+ if (!result)
+ break;
+ }
+ AppendCrashTimeParameters(
+ configurationParameters->GetValueForKey(BREAKPAD_PROCESS_START_TIME));
+
+ close(config_file_);
+ config_file_ = -1;
+}
+
+} // namespace google_breakpad
diff --git a/3rdParty/Breakpad/src/client/mac/crash_generation/Inspector.h b/3rdParty/Breakpad/src/client/mac/crash_generation/Inspector.h
new file mode 100644
index 0000000..6712355
--- /dev/null
+++ b/3rdParty/Breakpad/src/client/mac/crash_generation/Inspector.h
@@ -0,0 +1,162 @@
+// Copyright (c) 2007, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Interface file between the Breakpad.framework and
+// the Inspector process.
+
+#include "common/simple_string_dictionary.h"
+
+#import <Foundation/Foundation.h>
+#include <mach/mach.h>
+
+#import "client/mac/crash_generation/ConfigFile.h"
+#import "client/mac/handler/minidump_generator.h"
+
+
+// Types of mach messsages (message IDs)
+enum {
+ kMsgType_InspectorInitialInfo = 0, // data is InspectorInfo
+ kMsgType_InspectorKeyValuePair = 1, // data is KeyValueMessageData
+ kMsgType_InspectorAcknowledgement = 2 // no data sent
+};
+
+// Initial information sent from the crashed process by
+// Breakpad.framework to the Inspector process
+// The mach message with this struct as data will also include
+// several descriptors for sending mach port rights to the crashed
+// task, etc.
+struct InspectorInfo {
+ int exception_type;
+ int exception_code;
+ int exception_subcode;
+ unsigned int parameter_count; // key-value pairs
+};
+
+// Key/value message data to be sent to the Inspector
+struct KeyValueMessageData {
+ public:
+ KeyValueMessageData() {}
+ explicit KeyValueMessageData(
+ const google_breakpad::SimpleStringDictionary::Entry &inEntry) {
+ strlcpy(key, inEntry.key, sizeof(key) );
+ strlcpy(value, inEntry.value, sizeof(value) );
+ }
+
+ char key[google_breakpad::SimpleStringDictionary::key_size];
+ char value[google_breakpad::SimpleStringDictionary::value_size];
+};
+
+using std::string;
+using google_breakpad::MinidumpGenerator;
+
+namespace google_breakpad {
+
+//=============================================================================
+class MinidumpLocation {
+ public:
+ MinidumpLocation(NSString *minidumpDir) {
+ // Ensure that the path exists. Fallback to /tmp if unable to locate path.
+ assert(minidumpDir);
+ if (!EnsureDirectoryPathExists(minidumpDir)) {
+ minidumpDir = @"/tmp";
+ }
+
+ strlcpy(minidump_dir_path_, [minidumpDir fileSystemRepresentation],
+ sizeof(minidump_dir_path_));
+
+ // now generate a unique ID
+ string dump_path(minidump_dir_path_);
+ string next_minidump_id;
+
+ string next_minidump_path_ =
+ (MinidumpGenerator::UniqueNameInDirectory(dump_path, &next_minidump_id));
+
+ strlcpy(minidump_id_, next_minidump_id.c_str(), sizeof(minidump_id_));
+ };
+
+ const char *GetPath() { return minidump_dir_path_; }
+ const char *GetID() { return minidump_id_; }
+
+ private:
+ char minidump_dir_path_[PATH_MAX]; // Path to minidump directory
+ char minidump_id_[128];
+};
+
+//=============================================================================
+class Inspector {
+ public:
+ Inspector() {};
+
+ // given a bootstrap service name, receives mach messages
+ // from a crashed process, then inspects it, creates a minidump file
+ // and asks the user if he wants to upload it to a server.
+ void Inspect(const char *receive_port_name);
+
+ private:
+ // The Inspector is invoked with its bootstrap port set to the bootstrap
+ // subset established in OnDemandServer.mm OnDemandServer::Initialize.
+ // For proper communication with the system, the sender (which will inherit
+ // the Inspector's bootstrap port) needs the per-session bootstrap namespace
+ // available directly in its bootstrap port. OnDemandServer stashed this
+ // port into the subset namespace under a special name. ResetBootstrapPort
+ // recovers this port and switches this task to use it as its own bootstrap
+ // (ensuring that children like the sender will inherit it), and saves the
+ // subset in bootstrap_subset_port_ for use by ServiceCheckIn and
+ // ServiceCheckOut.
+ kern_return_t ResetBootstrapPort();
+
+ kern_return_t ServiceCheckIn(const char *receive_port_name);
+ kern_return_t ServiceCheckOut(const char *receive_port_name);
+
+ kern_return_t ReadMessages();
+
+ bool InspectTask();
+ kern_return_t SendAcknowledgement();
+
+ // The bootstrap port in which the inspector is registered and into which it
+ // must check in.
+ mach_port_t bootstrap_subset_port_;
+
+ mach_port_t service_rcv_port_;
+
+ int exception_type_;
+ int exception_code_;
+ int exception_subcode_;
+ mach_port_t remote_task_;
+ mach_port_t crashing_thread_;
+ mach_port_t handler_thread_;
+ mach_port_t ack_port_;
+
+ SimpleStringDictionary config_params_;
+
+ ConfigFile config_file_;
+};
+
+
+} // namespace google_breakpad
diff --git a/3rdParty/Breakpad/src/client/mac/crash_generation/Inspector.mm b/3rdParty/Breakpad/src/client/mac/crash_generation/Inspector.mm
new file mode 100644
index 0000000..dc6f480
--- /dev/null
+++ b/3rdParty/Breakpad/src/client/mac/crash_generation/Inspector.mm
@@ -0,0 +1,362 @@
+// Copyright (c) 2007, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Utility that can inspect another process and write a crash dump
+
+#include <cstdio>
+#include <iostream>
+#include <servers/bootstrap.h>
+#include <stdio.h>
+#include <string.h>
+#include <string>
+
+#import "client/mac/crash_generation/Inspector.h"
+
+#import "client/mac/Framework/Breakpad.h"
+#import "client/mac/handler/minidump_generator.h"
+
+#import "common/mac/MachIPC.h"
+#include "common/mac/bootstrap_compat.h"
+#include "common/mac/launch_reporter.h"
+
+#import "GTMDefines.h"
+
+#import <Foundation/Foundation.h>
+
+namespace google_breakpad {
+
+//=============================================================================
+void Inspector::Inspect(const char *receive_port_name) {
+ kern_return_t result = ResetBootstrapPort();
+ if (result != KERN_SUCCESS) {
+ return;
+ }
+
+ result = ServiceCheckIn(receive_port_name);
+
+ if (result == KERN_SUCCESS) {
+ result = ReadMessages();
+
+ if (result == KERN_SUCCESS) {
+ // Inspect the task and write a minidump file.
+ bool wrote_minidump = InspectTask();
+
+ // Send acknowledgement to the crashed process that the inspection
+ // has finished. It will then be able to cleanly exit.
+ // The return value is ignored because failure isn't fatal. If the process
+ // didn't get the message there's nothing we can do, and we still want to
+ // send the report.
+ SendAcknowledgement();
+
+ if (wrote_minidump) {
+ // Ask the user if he wants to upload the crash report to a server,
+ // and do so if he agrees.
+ LaunchReporter(
+ config_params_.GetValueForKey(BREAKPAD_REPORTER_EXE_LOCATION),
+ config_file_.GetFilePath());
+ } else {
+ fprintf(stderr, "Inspection of crashed process failed\n");
+ }
+
+ // Now that we're done reading messages, cleanup the service, but only
+ // if there was an actual exception
+ // Otherwise, it means the dump was generated on demand and the process
+ // lives on, and we might be needed again in the future.
+ if (exception_code_) {
+ ServiceCheckOut(receive_port_name);
+ }
+ } else {
+ PRINT_MACH_RESULT(result, "Inspector: WaitForMessage()");
+ }
+ }
+}
+
+//=============================================================================
+kern_return_t Inspector::ResetBootstrapPort() {
+ // A reasonable default, in case anything fails.
+ bootstrap_subset_port_ = bootstrap_port;
+
+ mach_port_t self_task = mach_task_self();
+
+ kern_return_t kr = task_get_bootstrap_port(self_task,
+ &bootstrap_subset_port_);
+ if (kr != KERN_SUCCESS) {
+ NSLog(@"ResetBootstrapPort: task_get_bootstrap_port failed: %s (%d)",
+ mach_error_string(kr), kr);
+ return kr;
+ }
+
+ mach_port_t bootstrap_parent_port;
+ kr = bootstrap_look_up(bootstrap_subset_port_,
+ const_cast<char*>(BREAKPAD_BOOTSTRAP_PARENT_PORT),
+ &bootstrap_parent_port);
+ if (kr != BOOTSTRAP_SUCCESS) {
+ NSLog(@"ResetBootstrapPort: bootstrap_look_up failed: %s (%d)",
+#if defined(MAC_OS_X_VERSION_10_5) && \
+ MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5
+ bootstrap_strerror(kr),
+#else
+ mach_error_string(kr),
+#endif
+ kr);
+ return kr;
+ }
+
+ kr = task_set_bootstrap_port(self_task, bootstrap_parent_port);
+ if (kr != KERN_SUCCESS) {
+ NSLog(@"ResetBootstrapPort: task_set_bootstrap_port failed: %s (%d)",
+ mach_error_string(kr), kr);
+ return kr;
+ }
+
+ // Some things access the bootstrap port through this global variable
+ // instead of calling task_get_bootstrap_port.
+ bootstrap_port = bootstrap_parent_port;
+
+ return KERN_SUCCESS;
+}
+
+//=============================================================================
+kern_return_t Inspector::ServiceCheckIn(const char *receive_port_name) {
+ // We need to get the mach port representing this service, so we can
+ // get information from the crashed process.
+ kern_return_t kr = bootstrap_check_in(bootstrap_subset_port_,
+ (char*)receive_port_name,
+ &service_rcv_port_);
+
+ if (kr != KERN_SUCCESS) {
+#if VERBOSE
+ PRINT_MACH_RESULT(kr, "Inspector: bootstrap_check_in()");
+#endif
+ }
+
+ return kr;
+}
+
+//=============================================================================
+kern_return_t Inspector::ServiceCheckOut(const char *receive_port_name) {
+ // We're done receiving mach messages from the crashed process,
+ // so clean up a bit.
+ kern_return_t kr;
+
+ // DO NOT use mach_port_deallocate() here -- it will fail and the
+ // following bootstrap_register() will also fail leaving our service
+ // name hanging around forever (until reboot)
+ kr = mach_port_destroy(mach_task_self(), service_rcv_port_);
+
+ if (kr != KERN_SUCCESS) {
+ PRINT_MACH_RESULT(kr,
+ "Inspector: UNREGISTERING: service_rcv_port mach_port_deallocate()");
+ return kr;
+ }
+
+ // Unregister the service associated with the receive port.
+ kr = breakpad::BootstrapRegister(bootstrap_subset_port_,
+ (char*)receive_port_name,
+ MACH_PORT_NULL);
+
+ if (kr != KERN_SUCCESS) {
+ PRINT_MACH_RESULT(kr, "Inspector: UNREGISTERING: bootstrap_register()");
+ }
+
+ return kr;
+}
+
+//=============================================================================
+kern_return_t Inspector::ReadMessages() {
+ // Wait for an initial message from the crashed process containing basic
+ // information about the crash.
+ ReceivePort receive_port(service_rcv_port_);
+
+ MachReceiveMessage message;
+ kern_return_t result = receive_port.WaitForMessage(&message, 1000);
+
+ if (result == KERN_SUCCESS) {
+ InspectorInfo &info = (InspectorInfo &)*message.GetData();
+ exception_type_ = info.exception_type;
+ exception_code_ = info.exception_code;
+ exception_subcode_ = info.exception_subcode;
+
+#if VERBOSE
+ printf("message ID = %d\n", message.GetMessageID());
+#endif
+
+ remote_task_ = message.GetTranslatedPort(0);
+ crashing_thread_ = message.GetTranslatedPort(1);
+ handler_thread_ = message.GetTranslatedPort(2);
+ ack_port_ = message.GetTranslatedPort(3);
+
+#if VERBOSE
+ printf("exception_type = %d\n", exception_type_);
+ printf("exception_code = %d\n", exception_code_);
+ printf("exception_subcode = %d\n", exception_subcode_);
+ printf("remote_task = %d\n", remote_task_);
+ printf("crashing_thread = %d\n", crashing_thread_);
+ printf("handler_thread = %d\n", handler_thread_);
+ printf("ack_port_ = %d\n", ack_port_);
+ printf("parameter count = %d\n", info.parameter_count);
+#endif
+
+ // In certain situations where multiple crash requests come
+ // through quickly, we can end up with the mach IPC messages not
+ // coming through correctly. Since we don't know what parameters
+ // we've missed, we can't do much besides abort the crash dump
+ // situation in this case.
+ unsigned int parameters_read = 0;
+ // The initial message contains the number of key value pairs that
+ // we are expected to read.
+ // Read each key/value pair, one mach message per key/value pair.
+ for (unsigned int i = 0; i < info.parameter_count; ++i) {
+ MachReceiveMessage parameter_message;
+ result = receive_port.WaitForMessage(&parameter_message, 1000);
+
+ if(result == KERN_SUCCESS) {
+ KeyValueMessageData &key_value_data =
+ (KeyValueMessageData&)*parameter_message.GetData();
+ // If we get a blank key, make sure we don't increment the
+ // parameter count; in some cases (notably on-demand generation
+ // many times in a short period of time) caused the Mach IPC
+ // messages to not come through correctly.
+ if (strlen(key_value_data.key) == 0) {
+ continue;
+ }
+ parameters_read++;
+
+ config_params_.SetKeyValue(key_value_data.key, key_value_data.value);
+ } else {
+ PRINT_MACH_RESULT(result, "Inspector: key/value message");
+ break;
+ }
+ }
+ if (parameters_read != info.parameter_count) {
+ return KERN_FAILURE;
+ }
+ }
+
+ return result;
+}
+
+//=============================================================================
+bool Inspector::InspectTask() {
+ // keep the task quiet while we're looking at it
+ task_suspend(remote_task_);
+
+ NSString *minidumpDir;
+
+ const char *minidumpDirectory =
+ config_params_.GetValueForKey(BREAKPAD_DUMP_DIRECTORY);
+
+ // If the client app has not specified a minidump directory,
+ // use a default of Library/<kDefaultLibrarySubdirectory>/<Product Name>
+ if (!minidumpDirectory || 0 == strlen(minidumpDirectory)) {
+ NSArray *libraryDirectories =
+ NSSearchPathForDirectoriesInDomains(NSLibraryDirectory,
+ NSUserDomainMask,
+ YES);
+
+ NSString *applicationSupportDirectory =
+ [libraryDirectories objectAtIndex:0];
+ NSString *library_subdirectory = [NSString
+ stringWithUTF8String:kDefaultLibrarySubdirectory];
+ NSString *breakpad_product = [NSString
+ stringWithUTF8String:config_params_.GetValueForKey(BREAKPAD_PRODUCT)];
+
+ NSArray *path_components = [NSArray
+ arrayWithObjects:applicationSupportDirectory,
+ library_subdirectory,
+ breakpad_product,
+ nil];
+
+ minidumpDir = [NSString pathWithComponents:path_components];
+ } else {
+ minidumpDir = [[NSString stringWithUTF8String:minidumpDirectory]
+ stringByExpandingTildeInPath];
+ }
+
+ MinidumpLocation minidumpLocation(minidumpDir);
+
+ // Obscure bug alert:
+ // Don't use [NSString stringWithFormat] to build up the path here since it
+ // assumes system encoding and in RTL locales will prepend an LTR override
+ // character for paths beginning with '/' which fileSystemRepresentation does
+ // not remove. Filed as rdar://6889706 .
+ NSString *path_ns = [NSString
+ stringWithUTF8String:minidumpLocation.GetPath()];
+ NSString *pathid_ns = [NSString
+ stringWithUTF8String:minidumpLocation.GetID()];
+ NSString *minidumpPath = [path_ns stringByAppendingPathComponent:pathid_ns];
+ minidumpPath = [minidumpPath
+ stringByAppendingPathExtension:@"dmp"];
+
+ config_file_.WriteFile( 0,
+ &config_params_,
+ minidumpLocation.GetPath(),
+ minidumpLocation.GetID());
+
+
+ MinidumpGenerator generator(remote_task_, handler_thread_);
+
+ if (exception_type_ && exception_code_) {
+ generator.SetExceptionInformation(exception_type_,
+ exception_code_,
+ exception_subcode_,
+ crashing_thread_);
+ }
+
+
+ bool result = generator.Write([minidumpPath fileSystemRepresentation]);
+
+ // let the task continue
+ task_resume(remote_task_);
+
+ return result;
+}
+
+//=============================================================================
+// The crashed task needs to be told that the inspection has finished.
+// It will wait on a mach port (with timeout) until we send acknowledgement.
+kern_return_t Inspector::SendAcknowledgement() {
+ if (ack_port_ != MACH_PORT_DEAD) {
+ MachPortSender sender(ack_port_);
+ MachSendMessage ack_message(kMsgType_InspectorAcknowledgement);
+
+ kern_return_t result = sender.SendMessage(ack_message, 2000);
+
+#if VERBOSE
+ PRINT_MACH_RESULT(result, "Inspector: sent acknowledgement");
+#endif
+
+ return result;
+ }
+
+ return KERN_INVALID_NAME;
+}
+
+} // namespace google_breakpad
+
diff --git a/3rdParty/Breakpad/src/client/mac/crash_generation/InspectorMain.mm b/3rdParty/Breakpad/src/client/mac/crash_generation/InspectorMain.mm
new file mode 100644
index 0000000..137c6a1
--- /dev/null
+++ b/3rdParty/Breakpad/src/client/mac/crash_generation/InspectorMain.mm
@@ -0,0 +1,65 @@
+// Copyright (c) 2007, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Main driver for Inspector
+
+#import "client/mac/crash_generation/Inspector.h"
+#import <Cocoa/Cocoa.h>
+
+namespace google_breakpad {
+
+//=============================================================================
+extern "C" {
+
+int main(int argc, char *const argv[]) {
+#if DEBUG
+ // Since we're launched on-demand, this is necessary to see debugging
+ // output in the console window.
+ freopen("/dev/console", "w", stdout);
+ freopen("/dev/console", "w", stderr);
+#endif
+
+ NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
+
+ if (argc != 2) {
+ exit(0);
+ }
+ // Our first command-line argument contains the name of the service
+ // that we're providing.
+ google_breakpad::Inspector inspector;
+ inspector.Inspect(argv[1]);
+
+ [pool release];
+
+ return 0;
+}
+
+} // extern "C"
+
+} // namespace google_breakpad
diff --git a/3rdParty/Breakpad/src/client/mac/crash_generation/client_info.h b/3rdParty/Breakpad/src/client/mac/crash_generation/client_info.h
new file mode 100644
index 0000000..a3a95dc
--- /dev/null
+++ b/3rdParty/Breakpad/src/client/mac/crash_generation/client_info.h
@@ -0,0 +1,47 @@
+// Copyright (c) 2010 Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#ifndef CLIENT_MAC_CRASH_GENERATION_CLIENT_INFO_H_
+#define CLIENT_MAC_CRASH_GENERATION_CLIENT_INFO_H_
+
+namespace google_breakpad {
+
+class ClientInfo {
+ public:
+ explicit ClientInfo(pid_t pid) : pid_(pid) {}
+
+ pid_t pid() const { return pid_; }
+
+ private:
+ pid_t pid_;
+};
+
+} // namespace google_breakpad
+
+#endif // CLIENT_MAC_CRASH_GENERATION_CLIENT_INFO_H_
diff --git a/3rdParty/Breakpad/src/client/mac/crash_generation/crash_generation_server.cc b/3rdParty/Breakpad/src/client/mac/crash_generation/crash_generation_server.cc
new file mode 100644
index 0000000..451e8d9
--- /dev/null
+++ b/3rdParty/Breakpad/src/client/mac/crash_generation/crash_generation_server.cc
@@ -0,0 +1,166 @@
+// Copyright (c) 2010 Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#include "client/mac/crash_generation/crash_generation_server.h"
+
+#include <pthread.h>
+
+#include "client/mac/crash_generation/client_info.h"
+#include "client/mac/handler/minidump_generator.h"
+#include "common/mac/scoped_task_suspend-inl.h"
+
+namespace google_breakpad {
+
+CrashGenerationServer::CrashGenerationServer(
+ const char *mach_port_name,
+ FilterCallback filter,
+ void *filter_context,
+ OnClientDumpRequestCallback dump_callback,
+ void *dump_context,
+ OnClientExitingCallback exit_callback,
+ void *exit_context,
+ bool generate_dumps,
+ const std::string &dump_path)
+ : filter_(filter),
+ filter_context_(filter_context),
+ dump_callback_(dump_callback),
+ dump_context_(dump_context),
+ exit_callback_(exit_callback),
+ exit_context_(exit_context),
+ generate_dumps_(generate_dumps),
+ dump_dir_(dump_path.empty() ? "/tmp" : dump_path),
+ started_(false),
+ receive_port_(mach_port_name),
+ mach_port_name_(mach_port_name) {
+}
+
+CrashGenerationServer::~CrashGenerationServer() {
+ if (started_)
+ Stop();
+}
+
+bool CrashGenerationServer::Start() {
+ int thread_create_result = pthread_create(&server_thread_, NULL,
+ &WaitForMessages, this);
+ started_ = thread_create_result == 0;
+ return started_;
+}
+
+bool CrashGenerationServer::Stop() {
+ if (!started_)
+ return false;
+
+ // Send a quit message to the background thread, and then join it.
+ MachPortSender sender(mach_port_name_.c_str());
+ MachSendMessage quit_message(kQuitMessage);
+ const mach_msg_timeout_t kSendTimeoutMs = 2 * 1000;
+ kern_return_t result = sender.SendMessage(quit_message, kSendTimeoutMs);
+ if (result == KERN_SUCCESS) {
+ int thread_join_result = pthread_join(server_thread_, NULL);
+ started_ = thread_join_result != 0;
+ }
+
+ return !started_;
+}
+
+// static
+void *CrashGenerationServer::WaitForMessages(void *server) {
+ CrashGenerationServer *self =
+ reinterpret_cast<CrashGenerationServer*>(server);
+ while (self->WaitForOneMessage()) {}
+ return NULL;
+}
+
+bool CrashGenerationServer::WaitForOneMessage() {
+ MachReceiveMessage message;
+ kern_return_t result = receive_port_.WaitForMessage(&message,
+ MACH_MSG_TIMEOUT_NONE);
+ if (result == KERN_SUCCESS) {
+ switch (message.GetMessageID()) {
+ case kDumpRequestMessage: {
+ ExceptionInfo &info = (ExceptionInfo &)*message.GetData();
+
+ mach_port_t remote_task = message.GetTranslatedPort(0);
+ mach_port_t crashing_thread = message.GetTranslatedPort(1);
+ mach_port_t handler_thread = message.GetTranslatedPort(2);
+ mach_port_t ack_port = message.GetTranslatedPort(3);
+ pid_t remote_pid = -1;
+ pid_for_task(remote_task, &remote_pid);
+ ClientInfo client(remote_pid);
+
+ bool result;
+ std::string dump_path;
+ if (generate_dumps_ && (!filter_ || filter_(filter_context_))) {
+ ScopedTaskSuspend suspend(remote_task);
+
+ MinidumpGenerator generator(remote_task, handler_thread);
+ dump_path = generator.UniqueNameInDirectory(dump_dir_, NULL);
+
+ if (info.exception_type && info.exception_code) {
+ generator.SetExceptionInformation(info.exception_type,
+ info.exception_code,
+ info.exception_subcode,
+ crashing_thread);
+ }
+ result = generator.Write(dump_path.c_str());
+ } else {
+ result = true;
+ }
+
+ if (result && dump_callback_) {
+ dump_callback_(dump_context_, client, dump_path);
+ }
+
+ // TODO(ted): support a way for the client to send additional data,
+ // perhaps with a callback so users of the server can read the data
+ // themselves?
+
+ if (ack_port != MACH_PORT_DEAD && ack_port != MACH_PORT_NULL) {
+ MachPortSender sender(ack_port);
+ MachSendMessage ack_message(kAcknowledgementMessage);
+ const mach_msg_timeout_t kSendTimeoutMs = 2 * 1000;
+
+ sender.SendMessage(ack_message, kSendTimeoutMs);
+ }
+
+ if (exit_callback_) {
+ exit_callback_(exit_context_, client);
+ }
+ break;
+ }
+ case kQuitMessage:
+ return false;
+ }
+ } else { // result != KERN_SUCCESS
+ return false;
+ }
+ return true;
+}
+
+} // namespace google_breakpad
diff --git a/3rdParty/Breakpad/src/client/mac/handler/breakpad_nlist_64.cc b/3rdParty/Breakpad/src/client/mac/handler/breakpad_nlist_64.cc
index b50aa03..3492b82 100644
--- a/3rdParty/Breakpad/src/client/mac/handler/breakpad_nlist_64.cc
+++ b/3rdParty/Breakpad/src/client/mac/handler/breakpad_nlist_64.cc
@@ -202,17 +202,6 @@ int __breakpad_fdnlist(int fd, nlist_type *list, const char **symbolNames,
if (CFSwapInt32BigToHost(*((uint32_t *)&buf)) == FAT_MAGIC ||
/* The following is the big-endian ppc64 check */
*((unsigned int *)&buf) == FAT_MAGIC) {
- /* Get host info */
- host_t host = mach_host_self();
- unsigned i = HOST_BASIC_INFO_COUNT;
- struct host_basic_info hbi;
- kern_return_t kr;
- if ((kr = host_info(host, HOST_BASIC_INFO,
- (host_info_t)(&hbi), &i)) != KERN_SUCCESS) {
- return -1;
- }
- mach_port_deallocate(mach_task_self(), host);
-
/* Read in the fat header */
struct fat_header fh;
if (lseek(fd, 0, SEEK_SET) == -1) {
@@ -281,7 +270,7 @@ int __breakpad_fdnlist(int fd, nlist_type *list, const char **symbolNames,
off_t sa; /* symbol address */
off_t ss; /* start of strings */
- register register_t n;
+ register_t n;
if (*((unsigned int *)&buf) == magic) {
if (lseek(fd, arch_offset, SEEK_SET) == -1) {
return -1;
@@ -354,14 +343,14 @@ int __breakpad_fdnlist(int fd, nlist_type *list, const char **symbolNames,
// and look for a match
while (n) {
nlist_type space[BUFSIZ/sizeof (nlist_type)];
- register register_t m = sizeof (space);
+ register_t m = sizeof (space);
if (n < m)
m = n;
if (read(fd, (char *)space, m) != m)
break;
n -= m;
- long savpos = lseek(fd, 0, SEEK_CUR);
+ off_t savpos = lseek(fd, 0, SEEK_CUR);
if (savpos == -1) {
return -1;
}
diff --git a/3rdParty/Breakpad/src/client/mac/handler/dynamic_images.cc b/3rdParty/Breakpad/src/client/mac/handler/dynamic_images.cc
index ef5743c..cdba6df 100644
--- a/3rdParty/Breakpad/src/client/mac/handler/dynamic_images.cc
+++ b/3rdParty/Breakpad/src/client/mac/handler/dynamic_images.cc
@@ -41,6 +41,7 @@ extern "C" { // needed to compile on Leopard
#include <mach/task_info.h>
#include <sys/sysctl.h>
#include <TargetConditionals.h>
+#include <unistd.h>
#include <algorithm>
#include <string>
@@ -261,8 +262,8 @@ bool FindTextSection(DynamicImage& image) {
reinterpret_cast<const mach_segment_command_type *>(cmd);
if (!strcmp(seg->segname, "__TEXT")) {
- image.vmaddr_ = seg->vmaddr;
- image.vmsize_ = seg->vmsize;
+ image.vmaddr_ = static_cast<mach_vm_address_t>(seg->vmaddr);
+ image.vmsize_ = static_cast<mach_vm_size_t>(seg->vmsize);
image.slide_ = 0;
if (seg->fileoff == 0 && seg->filesize != 0) {
@@ -363,7 +364,7 @@ static uint64_t LookupSymbol(const char* symbol_name,
return list.n_value;
}
-#if TARGET_OS_IPHONE
+#if TARGET_OS_IPHONE || MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_6
static bool HasTaskDyldInfo() {
return true;
}
@@ -380,13 +381,9 @@ static SInt32 GetOSVersion() {
}
static bool HasTaskDyldInfo() {
-#if MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_6
- return true;
-#else
return GetOSVersion() >= 0x1060;
-#endif
}
-#endif // TARGET_OS_IPHONE
+#endif // TARGET_OS_IPHONE || MAC_OS_X_VERSION_MIN_REQUIRED >= 10_6
uint64_t DynamicImages::GetDyldAllImageInfosPointer() {
if (HasTaskDyldInfo()) {
@@ -475,8 +472,6 @@ void ReadImageInfo(DynamicImages& images,
mach_header_bytes) != KERN_SUCCESS)
continue;
- header = reinterpret_cast<mach_header_type*>(&mach_header_bytes[0]);
-
// Read the file name from the task's memory space.
string file_path;
if (info.file_path_) {
@@ -492,7 +487,7 @@ void ReadImageInfo(DynamicImages& images,
header_size,
info.load_address_,
file_path,
- info.file_mod_date_,
+ static_cast<uintptr_t>(info.file_mod_date_),
images.task_,
images.cpu_type_);
@@ -568,7 +563,7 @@ cpu_type_t DynamicImages::DetermineTaskCPUType(task_t task) {
cpu_type_t cpu_type;
size_t cpuTypeSize = sizeof(cpu_type);
- sysctl(mib, mibLen, &cpu_type, &cpuTypeSize, 0, 0);
+ sysctl(mib, static_cast<u_int>(mibLen), &cpu_type, &cpuTypeSize, 0, 0);
return cpu_type;
}
diff --git a/3rdParty/Breakpad/src/client/mac/handler/dynamic_images.h b/3rdParty/Breakpad/src/client/mac/handler/dynamic_images.h
index d039eda..6514790 100644
--- a/3rdParty/Breakpad/src/client/mac/handler/dynamic_images.h
+++ b/3rdParty/Breakpad/src/client/mac/handler/dynamic_images.h
@@ -285,6 +285,8 @@ class DynamicImages {
return CPU_TYPE_POWERPC64;
#elif defined(__arm__)
return CPU_TYPE_ARM;
+#elif defined(__aarch64__)
+ return CPU_TYPE_ARM64;
#else
#error "GetNativeCPUType not implemented for this architecture"
#endif
diff --git a/3rdParty/Breakpad/src/client/mac/handler/exception_handler.cc b/3rdParty/Breakpad/src/client/mac/handler/exception_handler.cc
index 4043019..2a19d46 100644
--- a/3rdParty/Breakpad/src/client/mac/handler/exception_handler.cc
+++ b/3rdParty/Breakpad/src/client/mac/handler/exception_handler.cc
@@ -27,19 +27,32 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#include <map>
#include <mach/exc.h>
#include <mach/mig.h>
#include <pthread.h>
#include <signal.h>
#include <TargetConditionals.h>
+#include <map>
+
#include "client/mac/handler/exception_handler.h"
#include "client/mac/handler/minidump_generator.h"
#include "common/mac/macho_utilities.h"
#include "common/mac/scoped_task_suspend-inl.h"
#include "google_breakpad/common/minidump_exception_mac.h"
+#ifndef __EXCEPTIONS
+// This file uses C++ try/catch (but shouldn't). Duplicate the macros from
+// <c++/4.2.1/exception_defines.h> allowing this file to work properly with
+// exceptions disabled even when other C++ libraries are used. #undef the try
+// and catch macros first in case libstdc++ is in use and has already provided
+// its own definitions.
+#undef try
+#define try if (true)
+#undef catch
+#define catch(X) if (false)
+#endif // __EXCEPTIONS
+
#ifndef USE_PROTECTED_ALLOCATIONS
#if TARGET_OS_IPHONE
#define USE_PROTECTED_ALLOCATIONS 1
@@ -61,8 +74,12 @@ namespace google_breakpad {
static union {
#if USE_PROTECTED_ALLOCATIONS
+#if defined PAGE_MAX_SIZE
+ char protected_buffer[PAGE_MAX_SIZE] __attribute__((aligned(PAGE_MAX_SIZE)));
+#else
char protected_buffer[PAGE_SIZE] __attribute__((aligned(PAGE_SIZE)));
-#endif
+#endif // defined PAGE_MAX_SIZE
+#endif // USE_PROTECTED_ALLOCATIONS
google_breakpad::ExceptionHandler *handler;
} gProtectedData;
@@ -103,14 +120,13 @@ exception_mask_t s_exception_mask = EXC_MASK_BAD_ACCESS |
EXC_MASK_BAD_INSTRUCTION | EXC_MASK_ARITHMETIC | EXC_MASK_BREAKPOINT;
#if !TARGET_OS_IPHONE
-extern "C"
-{
+extern "C" {
// Forward declarations for functions that need "C" style compilation
- boolean_t exc_server(mach_msg_header_t *request,
- mach_msg_header_t *reply);
+ boolean_t exc_server(mach_msg_header_t* request,
+ mach_msg_header_t* reply);
// This symbol must be visible to dlsym() - see
- // http://code.google.com/p/google-breakpad/issues/detail?id=345 for details.
+ // https://bugs.chromium.org/p/google-breakpad/issues/detail?id=345 for details.
kern_return_t catch_exception_raise(mach_port_t target_port,
mach_port_t failed_thread,
mach_port_t task,
@@ -129,19 +145,19 @@ kern_return_t ForwardException(mach_port_t task,
#if TARGET_OS_IPHONE
// Implementation is based on the implementation generated by mig.
-boolean_t breakpad_exc_server(mach_msg_header_t *InHeadP,
- mach_msg_header_t *OutHeadP) {
- OutHeadP->msgh_bits =
- MACH_MSGH_BITS(MACH_MSGH_BITS_REMOTE(InHeadP->msgh_bits), 0);
- OutHeadP->msgh_remote_port = InHeadP->msgh_remote_port;
- /* Minimal size: routine() will update it if different */
- OutHeadP->msgh_size = (mach_msg_size_t)sizeof(mig_reply_error_t);
- OutHeadP->msgh_local_port = MACH_PORT_NULL;
- OutHeadP->msgh_id = InHeadP->msgh_id + 100;
+boolean_t breakpad_exc_server(mach_msg_header_t* InHeadP,
+ mach_msg_header_t* OutHeadP) {
+ OutHeadP->msgh_bits =
+ MACH_MSGH_BITS(MACH_MSGH_BITS_REMOTE(InHeadP->msgh_bits), 0);
+ OutHeadP->msgh_remote_port = InHeadP->msgh_remote_port;
+ /* Minimal size: routine() will update it if different */
+ OutHeadP->msgh_size = (mach_msg_size_t)sizeof(mig_reply_error_t);
+ OutHeadP->msgh_local_port = MACH_PORT_NULL;
+ OutHeadP->msgh_id = InHeadP->msgh_id + 100;
if (InHeadP->msgh_id != 2401) {
- ((mig_reply_error_t *)OutHeadP)->NDR = NDR_record;
- ((mig_reply_error_t *)OutHeadP)->RetCode = MIG_BAD_ID;
+ ((mig_reply_error_t*)OutHeadP)->NDR = NDR_record;
+ ((mig_reply_error_t*)OutHeadP)->RetCode = MIG_BAD_ID;
return FALSE;
}
@@ -171,8 +187,8 @@ boolean_t breakpad_exc_server(mach_msg_header_t *InHeadP,
#pragma pack()
#endif
- Request *In0P = (Request *)InHeadP;
- Reply *OutP = (Reply *)OutHeadP;
+ Request* In0P = (Request*)InHeadP;
+ Reply* OutP = (Reply*)OutHeadP;
if (In0P->task.name != mach_task_self()) {
return FALSE;
@@ -186,8 +202,8 @@ boolean_t breakpad_exc_server(mach_msg_header_t *InHeadP,
return TRUE;
}
#else
-boolean_t breakpad_exc_server(mach_msg_header_t *request,
- mach_msg_header_t *reply) {
+boolean_t breakpad_exc_server(mach_msg_header_t* request,
+ mach_msg_header_t* reply) {
return exc_server(request, reply);
}
@@ -207,9 +223,9 @@ kern_return_t catch_exception_raise(mach_port_t port, mach_port_t failed_thread,
ExceptionHandler::ExceptionHandler(const string &dump_path,
FilterCallback filter,
MinidumpCallback callback,
- void *callback_context,
+ void* callback_context,
bool install_handler,
- const char *port_name)
+ const char* port_name)
: dump_path_(),
filter_(filter),
callback_(callback),
@@ -235,7 +251,7 @@ ExceptionHandler::ExceptionHandler(const string &dump_path,
// special constructor if we want to bypass minidump writing and
// simply get a callback with the exception information
ExceptionHandler::ExceptionHandler(DirectCallback callback,
- void *callback_context,
+ void* callback_context,
bool install_handler)
: dump_path_(),
filter_(NULL),
@@ -269,9 +285,13 @@ bool ExceptionHandler::WriteMinidump(bool write_exception_stream) {
if (pthread_mutex_lock(&minidump_write_mutex_) == 0) {
// Send an empty message to the handle port so that a minidump will
// be written
- SendMessageToHandlerThread(write_exception_stream ?
- kWriteDumpWithExceptionMessage :
- kWriteDumpMessage);
+ bool result = SendMessageToHandlerThread(write_exception_stream ?
+ kWriteDumpWithExceptionMessage :
+ kWriteDumpMessage);
+ if (!result) {
+ pthread_mutex_unlock(&minidump_write_mutex_);
+ return false;
+ }
// Wait for the minidump writer to complete its writing. It will unlock
// the mutex when completed
@@ -287,18 +307,18 @@ bool ExceptionHandler::WriteMinidump(bool write_exception_stream) {
bool ExceptionHandler::WriteMinidump(const string &dump_path,
bool write_exception_stream,
MinidumpCallback callback,
- void *callback_context) {
+ void* callback_context) {
ExceptionHandler handler(dump_path, NULL, callback, callback_context, false,
- NULL);
+ NULL);
return handler.WriteMinidump(write_exception_stream);
}
// static
bool ExceptionHandler::WriteMinidumpForChild(mach_port_t child,
- mach_port_t child_blamed_thread,
- const string &dump_path,
- MinidumpCallback callback,
- void *callback_context) {
+ mach_port_t child_blamed_thread,
+ const string &dump_path,
+ MinidumpCallback callback,
+ void* callback_context) {
ScopedTaskSuspend suspend(child);
MinidumpGenerator generator(child, MACH_PORT_NULL);
@@ -306,34 +326,41 @@ bool ExceptionHandler::WriteMinidumpForChild(mach_port_t child,
string dump_filename = generator.UniqueNameInDirectory(dump_path, &dump_id);
generator.SetExceptionInformation(EXC_BREAKPOINT,
-#if defined (__i386__) || defined(__x86_64__)
- EXC_I386_BPT,
-#elif defined (__ppc__) || defined (__ppc64__)
- EXC_PPC_BREAKPOINT,
-#elif defined (__arm__)
- EXC_ARM_BREAKPOINT,
+#if defined(__i386__) || defined(__x86_64__)
+ EXC_I386_BPT,
+#elif defined(__ppc__) || defined(__ppc64__)
+ EXC_PPC_BREAKPOINT,
+#elif defined(__arm__) || defined(__aarch64__)
+ EXC_ARM_BREAKPOINT,
#else
#error architecture not supported
#endif
- 0,
- child_blamed_thread);
+ 0,
+ child_blamed_thread);
bool result = generator.Write(dump_filename.c_str());
if (callback) {
return callback(dump_path.c_str(), dump_id.c_str(),
- callback_context, result);
+ callback_context, result);
}
return result;
}
-bool ExceptionHandler::WriteMinidumpWithException(int exception_type,
- int exception_code,
- int exception_subcode,
- mach_port_t thread_name,
- bool exit_after_write,
- bool report_current_thread) {
+bool ExceptionHandler::WriteMinidumpWithException(
+ int exception_type,
+ int exception_code,
+ int exception_subcode,
+ breakpad_ucontext_t* task_context,
+ mach_port_t thread_name,
+ bool exit_after_write,
+ bool report_current_thread) {
bool result = false;
+#if TARGET_OS_IPHONE
+ // _exit() should never be called on iOS.
+ exit_after_write = false;
+#endif
+
if (directCallback_) {
if (directCallback_(callback_context_,
exception_type,
@@ -349,12 +376,15 @@ bool ExceptionHandler::WriteMinidumpWithException(int exception_type,
// If this is a real exception, give the filter (if any) a chance to
// decide if this should be sent.
if (filter_ && !filter_(callback_context_))
- return false;
- return crash_generation_client_->RequestDumpForException(
- exception_type,
- exception_code,
- exception_subcode,
- thread_name);
+ return false;
+ result = crash_generation_client_->RequestDumpForException(
+ exception_type,
+ exception_code,
+ exception_subcode,
+ thread_name);
+ if (result && exit_after_write) {
+ _exit(exception_type);
+ }
}
#endif
} else {
@@ -366,6 +396,7 @@ bool ExceptionHandler::WriteMinidumpWithException(int exception_type,
MinidumpGenerator md(mach_task_self(),
report_current_thread ? MACH_PORT_NULL :
mach_thread_self());
+ md.SetTaskContext(task_context);
if (exception_type && exception_code) {
// If this is a real exception, give the filter (if any) a chance to
// decide if this should be sent.
@@ -432,12 +463,13 @@ kern_return_t ForwardException(mach_port_t task, mach_port_t failed_thread,
exception_behavior_t target_behavior = current.behaviors[found];
kern_return_t result;
+ // TODO: Handle the case where |target_behavior| has MACH_EXCEPTION_CODES
+ // set. https://bugs.chromium.org/p/google-breakpad/issues/detail?id=551
switch (target_behavior) {
case EXCEPTION_DEFAULT:
result = exception_raise(target_port, failed_thread, task, exception,
code, code_count);
break;
-
default:
fprintf(stderr, "** Unknown exception behavior: %d\n", target_behavior);
result = KERN_FAILURE;
@@ -448,9 +480,9 @@ kern_return_t ForwardException(mach_port_t task, mach_port_t failed_thread,
}
// static
-void *ExceptionHandler::WaitForMessage(void *exception_handler_class) {
- ExceptionHandler *self =
- reinterpret_cast<ExceptionHandler *>(exception_handler_class);
+void* ExceptionHandler::WaitForMessage(void* exception_handler_class) {
+ ExceptionHandler* self =
+ reinterpret_cast<ExceptionHandler*>(exception_handler_class);
ExceptionMessage receive;
// Wait for the exception info
@@ -495,11 +527,11 @@ void *ExceptionHandler::WaitForMessage(void *exception_handler_class) {
if (receive.header.msgh_id == kWriteDumpWithExceptionMessage) {
thread = receive.thread.name;
exception_type = EXC_BREAKPOINT;
-#if defined (__i386__) || defined(__x86_64__)
+#if defined(__i386__) || defined(__x86_64__)
exception_code = EXC_I386_BPT;
-#elif defined (__ppc__) || defined (__ppc64__)
+#elif defined(__ppc__) || defined(__ppc64__)
exception_code = EXC_PPC_BREAKPOINT;
-#elif defined (__arm__)
+#elif defined(__arm__) || defined(__aarch64__)
exception_code = EXC_ARM_BREAKPOINT;
#else
#error architecture not supported
@@ -509,7 +541,7 @@ void *ExceptionHandler::WaitForMessage(void *exception_handler_class) {
// Write out the dump and save the result for later retrieval
self->last_minidump_write_result_ =
self->WriteMinidumpWithException(exception_type, exception_code,
- 0, thread,
+ 0, NULL, thread,
false, false);
#if USE_PROTECTED_ALLOCATIONS
@@ -544,8 +576,8 @@ void *ExceptionHandler::WaitForMessage(void *exception_handler_class) {
// Generate the minidump with the exception data.
self->WriteMinidumpWithException(receive.exception, receive.code[0],
- subcode, receive.thread.name, true,
- false);
+ subcode, NULL, receive.thread.name,
+ true, false);
#if USE_PROTECTED_ALLOCATIONS
// This may have become protected again within
@@ -580,7 +612,7 @@ void *ExceptionHandler::WaitForMessage(void *exception_handler_class) {
return NULL;
}
-//static
+// static
void ExceptionHandler::SignalHandler(int sig, siginfo_t* info, void* uc) {
#if USE_PROTECTED_ALLOCATIONS
if (gBreakpadAllocator)
@@ -590,6 +622,7 @@ void ExceptionHandler::SignalHandler(int sig, siginfo_t* info, void* uc) {
EXC_SOFTWARE,
MD_EXCEPTION_CODE_MAC_ABORT,
0,
+ static_cast<breakpad_ucontext_t*>(uc),
mach_thread_self(),
true,
true);
@@ -604,7 +637,6 @@ bool ExceptionHandler::InstallHandler() {
if (gProtectedData.handler != NULL) {
return false;
}
-#if TARGET_OS_IPHONE
if (!IsOutOfProcess()) {
struct sigaction sa;
memset(&sa, 0, sizeof(sa));
@@ -624,7 +656,6 @@ bool ExceptionHandler::InstallHandler() {
mprotect(gProtectedData.protected_buffer, PAGE_SIZE, PROT_READ);
#endif
}
-#endif
try {
#if USE_PROTECTED_ALLOCATIONS
@@ -633,7 +664,6 @@ bool ExceptionHandler::InstallHandler() {
#else
previous_ = new ExceptionParameters();
#endif
-
}
catch (std::bad_alloc) {
return false;
@@ -732,7 +762,7 @@ bool ExceptionHandler::Setup(bool install_handler) {
result = thread_create_result ? KERN_FAILURE : KERN_SUCCESS;
}
- return result == KERN_SUCCESS ? true : false;
+ return result == KERN_SUCCESS;
}
bool ExceptionHandler::Teardown() {
diff --git a/3rdParty/Breakpad/src/client/mac/handler/exception_handler.h b/3rdParty/Breakpad/src/client/mac/handler/exception_handler.h
index ec09134..f1d9ae9 100644
--- a/3rdParty/Breakpad/src/client/mac/handler/exception_handler.h
+++ b/3rdParty/Breakpad/src/client/mac/handler/exception_handler.h
@@ -41,7 +41,8 @@
#include <string>
-#include "processor/scoped_ptr.h"
+#include "client/mac/handler/ucontext_compat.h"
+#include "common/scoped_ptr.h"
#if !TARGET_OS_IPHONE
#include "client/mac/crash_generation/crash_generation_client.h"
@@ -182,10 +183,13 @@ class ExceptionHandler {
// success, false otherwise.
bool SendMessageToHandlerThread(HandlerThreadMessage message_id);
- // All minidump writing goes through this one routine
+ // All minidump writing goes through this one routine.
+ // |task_context| can be NULL. If not, it will be used to retrieve the
+ // context of the current thread, instead of using |thread_get_state|.
bool WriteMinidumpWithException(int exception_type,
int exception_code,
int exception_subcode,
+ breakpad_ucontext_t *task_context,
mach_port_t thread_name,
bool exit_after_write,
bool report_current_thread);
diff --git a/3rdParty/Breakpad/src/client/mac/handler/mach_vm_compat.h b/3rdParty/Breakpad/src/client/mac/handler/mach_vm_compat.h
index e0459be..9e9028b 100644
--- a/3rdParty/Breakpad/src/client/mac/handler/mach_vm_compat.h
+++ b/3rdParty/Breakpad/src/client/mac/handler/mach_vm_compat.h
@@ -32,15 +32,14 @@
#include <TargetConditionals.h>
-// On iOS 5, mach/mach_vm.h is not supported anymore. As the architecture is 32
-// bits, we can use the simple vm_ functions instead of the mach_vm_ ones.
+// On iOS 5 and higher, mach/mach_vm.h is not supported. Use the corresponding
+// vm_map functions instead.
#if TARGET_OS_IPHONE
#include <mach/vm_map.h>
#define mach_vm_address_t vm_address_t
#define mach_vm_deallocate vm_deallocate
#define mach_vm_read vm_read
-#define mach_vm_region vm_region
-#define mach_vm_region_recurse vm_region_recurse
+#define mach_vm_region_recurse vm_region_recurse_64
#define mach_vm_size_t vm_size_t
#else
#include <mach/mach_vm.h>
diff --git a/3rdParty/Breakpad/src/client/mac/handler/minidump_generator.cc b/3rdParty/Breakpad/src/client/mac/handler/minidump_generator.cc
index b1d429c..48cd2e9 100644
--- a/3rdParty/Breakpad/src/client/mac/handler/minidump_generator.cc
+++ b/3rdParty/Breakpad/src/client/mac/handler/minidump_generator.cc
@@ -31,6 +31,7 @@
#include <cstdio>
#include <mach/host_info.h>
+#include <mach/machine.h>
#include <mach/vm_statistics.h>
#include <mach-o/dyld.h>
#include <mach-o/loader.h>
@@ -41,7 +42,7 @@
#include "client/mac/handler/minidump_generator.h"
-#ifdef HAS_ARM_SUPPORT
+#if defined(HAS_ARM_SUPPORT) || defined(HAS_ARM64_SUPPORT)
#include <mach/arm/thread_status.h>
#endif
#ifdef HAS_PPC_SUPPORT
@@ -61,7 +62,7 @@ using MacStringUtils::IntegerValueAtIndex;
namespace google_breakpad {
-#if __LP64__
+#if defined(__LP64__) && __LP64__
#define LC_SEGMENT_ARCH LC_SEGMENT_64
#else
#define LC_SEGMENT_ARCH LC_SEGMENT
@@ -77,6 +78,7 @@ MinidumpGenerator::MinidumpGenerator()
crashing_task_(mach_task_self()),
handler_thread_(mach_thread_self()),
cpu_type_(DynamicImages::GetNativeCPUType()),
+ task_context_(NULL),
dynamic_images_(NULL),
memory_blocks_(&allocator_) {
GatherSystemInformation();
@@ -94,6 +96,7 @@ MinidumpGenerator::MinidumpGenerator(mach_port_t crashing_task,
crashing_task_(crashing_task),
handler_thread_(handler_thread),
cpu_type_(DynamicImages::GetNativeCPUType()),
+ task_context_(NULL),
dynamic_images_(NULL),
memory_blocks_(&allocator_) {
if (crashing_task != mach_task_self()) {
@@ -130,25 +133,47 @@ void MinidumpGenerator::GatherSystemInformation() {
vers_path,
kCFURLPOSIXPathStyle,
false);
- CFDataRef data;
- SInt32 error;
- CFURLCreateDataAndPropertiesFromResource(NULL, sys_vers, &data, NULL, NULL,
- &error);
-
+ CFReadStreamRef read_stream = CFReadStreamCreateWithFile(NULL, sys_vers);
+ CFRelease(sys_vers);
+ if (!read_stream) {
+ return;
+ }
+ if (!CFReadStreamOpen(read_stream)) {
+ CFRelease(read_stream);
+ return;
+ }
+ CFMutableDataRef data = NULL;
+ while (true) {
+ // Actual data file tests: Mac at 480 bytes and iOS at 413 bytes.
+ const CFIndex kMaxBufferLength = 1024;
+ UInt8 data_bytes[kMaxBufferLength];
+ CFIndex num_bytes_read =
+ CFReadStreamRead(read_stream, data_bytes, kMaxBufferLength);
+ if (num_bytes_read < 0) {
+ if (data) {
+ CFRelease(data);
+ data = NULL;
+ }
+ break;
+ } else if (num_bytes_read == 0) {
+ break;
+ } else if (!data) {
+ data = CFDataCreateMutable(NULL, 0);
+ }
+ CFDataAppendBytes(data, data_bytes, num_bytes_read);
+ }
+ CFReadStreamClose(read_stream);
+ CFRelease(read_stream);
if (!data) {
- CFRelease(sys_vers);
return;
}
-
- CFDictionaryRef list = static_cast<CFDictionaryRef>
- (CFPropertyListCreateFromXMLData(NULL, data, kCFPropertyListImmutable,
- NULL));
+ CFDictionaryRef list =
+ static_cast<CFDictionaryRef>(CFPropertyListCreateWithData(
+ NULL, data, kCFPropertyListImmutable, NULL, NULL));
+ CFRelease(data);
if (!list) {
- CFRelease(sys_vers);
- CFRelease(data);
return;
}
-
CFStringRef build_version = static_cast<CFStringRef>
(CFDictionaryGetValue(list, CFSTR("ProductBuildVersion")));
CFStringRef product_version = static_cast<CFStringRef>
@@ -157,8 +182,6 @@ void MinidumpGenerator::GatherSystemInformation() {
string product_str = ConvertToString(product_version);
CFRelease(list);
- CFRelease(sys_vers);
- CFRelease(data);
strlcpy(build_string_, build_str.c_str(), sizeof(build_string_));
@@ -168,6 +191,10 @@ void MinidumpGenerator::GatherSystemInformation() {
os_build_number_ = IntegerValueAtIndex(product_str, 2);
}
+void MinidumpGenerator::SetTaskContext(breakpad_ucontext_t *task_context) {
+ task_context_ = task_context;
+}
+
string MinidumpGenerator::UniqueNameInDirectory(const string &dir,
string *unique_name) {
CFUUIDRef uuid = CFUUIDCreate(NULL);
@@ -288,7 +315,7 @@ size_t MinidumpGenerator::CalculateStackSize(mach_vm_address_t start_addr) {
mach_vm_address_t proposed_next_region_base = next_region_base;
mach_vm_size_t next_region_size;
nesting_level = 0;
- mach_msg_type_number_t info_count = VM_REGION_SUBMAP_INFO_COUNT_64;
+ info_count = VM_REGION_SUBMAP_INFO_COUNT_64;
result = mach_vm_region_recurse(crashing_task_, &next_region_base,
&next_region_size, &nesting_level,
region_info, &info_count);
@@ -362,6 +389,10 @@ bool MinidumpGenerator::WriteStack(breakpad_thread_state_data_t state,
case CPU_TYPE_ARM:
return WriteStackARM(state, stack_location);
#endif
+#ifdef HAS_ARM64_SUPPORT
+ case CPU_TYPE_ARM64:
+ return WriteStackARM64(state, stack_location);
+#endif
#ifdef HAS_PPC_SUPPORT
case CPU_TYPE_POWERPC:
return WriteStackPPC(state, stack_location);
@@ -386,6 +417,10 @@ bool MinidumpGenerator::WriteContext(breakpad_thread_state_data_t state,
case CPU_TYPE_ARM:
return WriteContextARM(state, register_location);
#endif
+#ifdef HAS_ARM64_SUPPORT
+ case CPU_TYPE_ARM64:
+ return WriteContextARM64(state, register_location);
+#endif
#ifdef HAS_PPC_SUPPORT
case CPU_TYPE_POWERPC:
return WriteContextPPC(state, register_location);
@@ -403,13 +438,17 @@ bool MinidumpGenerator::WriteContext(breakpad_thread_state_data_t state,
}
}
-u_int64_t MinidumpGenerator::CurrentPCForStack(
+uint64_t MinidumpGenerator::CurrentPCForStack(
breakpad_thread_state_data_t state) {
switch (cpu_type_) {
#ifdef HAS_ARM_SUPPORT
case CPU_TYPE_ARM:
return CurrentPCForStackARM(state);
#endif
+#ifdef HAS_ARM64_SUPPORT
+ case CPU_TYPE_ARM64:
+ return CurrentPCForStackARM64(state);
+#endif
#ifdef HAS_PPC_SUPPORT
case CPU_TYPE_POWERPC:
return CurrentPCForStackPPC(state);
@@ -423,7 +462,7 @@ u_int64_t MinidumpGenerator::CurrentPCForStack(
return CurrentPCForStackX86_64(state);
#endif
default:
- assert("Unknown CPU type!");
+ assert(0 && "Unknown CPU type!");
return 0;
}
}
@@ -437,7 +476,7 @@ bool MinidumpGenerator::WriteStackARM(breakpad_thread_state_data_t state,
return WriteStackFromStartAddress(start_addr, stack_location);
}
-u_int64_t
+uint64_t
MinidumpGenerator::CurrentPCForStackARM(breakpad_thread_state_data_t state) {
arm_thread_state_t *machine_state =
reinterpret_cast<arm_thread_state_t *>(state);
@@ -479,7 +518,82 @@ bool MinidumpGenerator::WriteContextARM(breakpad_thread_state_data_t state,
AddGPR(10);
AddGPR(11);
AddGPR(12);
-#undef AddReg
+#undef AddGPR
+
+ return true;
+}
+#endif
+
+#ifdef HAS_ARM64_SUPPORT
+bool MinidumpGenerator::WriteStackARM64(breakpad_thread_state_data_t state,
+ MDMemoryDescriptor *stack_location) {
+ arm_thread_state64_t *machine_state =
+ reinterpret_cast<arm_thread_state64_t *>(state);
+ mach_vm_address_t start_addr = REGISTER_FROM_THREADSTATE(machine_state, sp);
+ return WriteStackFromStartAddress(start_addr, stack_location);
+}
+
+uint64_t
+MinidumpGenerator::CurrentPCForStackARM64(breakpad_thread_state_data_t state) {
+ arm_thread_state64_t *machine_state =
+ reinterpret_cast<arm_thread_state64_t *>(state);
+
+ return REGISTER_FROM_THREADSTATE(machine_state, pc);
+}
+
+bool
+MinidumpGenerator::WriteContextARM64(breakpad_thread_state_data_t state,
+ MDLocationDescriptor *register_location)
+{
+ TypedMDRVA<MDRawContextARM64> context(&writer_);
+ arm_thread_state64_t *machine_state =
+ reinterpret_cast<arm_thread_state64_t *>(state);
+
+ if (!context.Allocate())
+ return false;
+
+ *register_location = context.location();
+ MDRawContextARM64 *context_ptr = context.get();
+ context_ptr->context_flags = MD_CONTEXT_ARM64_FULL;
+
+#define AddGPR(a) context_ptr->iregs[a] = \
+ REGISTER_FROM_THREADSTATE(machine_state, x[a])
+
+ context_ptr->iregs[29] = REGISTER_FROM_THREADSTATE(machine_state, fp);
+ context_ptr->iregs[30] = REGISTER_FROM_THREADSTATE(machine_state, lr);
+ context_ptr->iregs[31] = REGISTER_FROM_THREADSTATE(machine_state, sp);
+ context_ptr->iregs[32] = REGISTER_FROM_THREADSTATE(machine_state, pc);
+ context_ptr->cpsr = REGISTER_FROM_THREADSTATE(machine_state, cpsr);
+
+ AddGPR(0);
+ AddGPR(1);
+ AddGPR(2);
+ AddGPR(3);
+ AddGPR(4);
+ AddGPR(5);
+ AddGPR(6);
+ AddGPR(7);
+ AddGPR(8);
+ AddGPR(9);
+ AddGPR(10);
+ AddGPR(11);
+ AddGPR(12);
+ AddGPR(13);
+ AddGPR(14);
+ AddGPR(15);
+ AddGPR(16);
+ AddGPR(17);
+ AddGPR(18);
+ AddGPR(19);
+ AddGPR(20);
+ AddGPR(21);
+ AddGPR(22);
+ AddGPR(23);
+ AddGPR(24);
+ AddGPR(25);
+ AddGPR(26);
+ AddGPR(27);
+ AddGPR(28);
#undef AddGPR
return true;
@@ -503,7 +617,7 @@ bool MinidumpGenerator::WriteStackPPC64(breakpad_thread_state_data_t state,
return WriteStackFromStartAddress(start_addr, stack_location);
}
-u_int64_t
+uint64_t
MinidumpGenerator::CurrentPCForStackPPC(breakpad_thread_state_data_t state) {
ppc_thread_state_t *machine_state =
reinterpret_cast<ppc_thread_state_t *>(state);
@@ -511,7 +625,7 @@ MinidumpGenerator::CurrentPCForStackPPC(breakpad_thread_state_data_t state) {
return REGISTER_FROM_THREADSTATE(machine_state, srr0);
}
-u_int64_t
+uint64_t
MinidumpGenerator::CurrentPCForStackPPC64(breakpad_thread_state_data_t state) {
ppc_thread_state64_t *machine_state =
reinterpret_cast<ppc_thread_state64_t *>(state);
@@ -533,8 +647,11 @@ bool MinidumpGenerator::WriteContextPPC(breakpad_thread_state_data_t state,
MDRawContextPPC *context_ptr = context.get();
context_ptr->context_flags = MD_CONTEXT_PPC_BASE;
-#define AddReg(a) context_ptr->a = REGISTER_FROM_THREADSTATE(machine_state, a)
-#define AddGPR(a) context_ptr->gpr[a] = REGISTER_FROM_THREADSTATE(machine_state, r ## a)
+#define AddReg(a) context_ptr->a = static_cast<__typeof__(context_ptr->a)>( \
+ REGISTER_FROM_THREADSTATE(machine_state, a))
+#define AddGPR(a) context_ptr->gpr[a] = \
+ static_cast<__typeof__(context_ptr->a)>( \
+ REGISTER_FROM_THREADSTATE(machine_state, r ## a)
AddReg(srr0);
AddReg(cr);
@@ -596,8 +713,11 @@ bool MinidumpGenerator::WriteContextPPC64(
MDRawContextPPC64 *context_ptr = context.get();
context_ptr->context_flags = MD_CONTEXT_PPC_BASE;
-#define AddReg(a) context_ptr->a = REGISTER_FROM_THREADSTATE(machine_state, a)
-#define AddGPR(a) context_ptr->gpr[a] = REGISTER_FROM_THREADSTATE(machine_state, r ## a)
+#define AddReg(a) context_ptr->a = static_cast<__typeof__(context_ptr->a)>( \
+ REGISTER_FROM_THREADSTATE(machine_state, a))
+#define AddGPR(a) context_ptr->gpr[a] = \
+ static_cast<__typeof__(context_ptr->a)>( \
+ REGISTER_FROM_THREADSTATE(machine_state, r ## a)
AddReg(srr0);
AddReg(cr);
@@ -661,11 +781,12 @@ bool MinidumpGenerator::WriteStackX86_64(breakpad_thread_state_data_t state,
x86_thread_state64_t *machine_state =
reinterpret_cast<x86_thread_state64_t *>(state);
- mach_vm_address_t start_addr = REGISTER_FROM_THREADSTATE(machine_state, rsp);
+ mach_vm_address_t start_addr = static_cast<mach_vm_address_t>(
+ REGISTER_FROM_THREADSTATE(machine_state, rsp));
return WriteStackFromStartAddress(start_addr, stack_location);
}
-u_int64_t
+uint64_t
MinidumpGenerator::CurrentPCForStackX86(breakpad_thread_state_data_t state) {
i386_thread_state_t *machine_state =
reinterpret_cast<i386_thread_state_t *>(state);
@@ -673,7 +794,7 @@ MinidumpGenerator::CurrentPCForStackX86(breakpad_thread_state_data_t state) {
return REGISTER_FROM_THREADSTATE(machine_state, eip);
}
-u_int64_t
+uint64_t
MinidumpGenerator::CurrentPCForStackX86_64(breakpad_thread_state_data_t state) {
x86_thread_state64_t *machine_state =
reinterpret_cast<x86_thread_state64_t *>(state);
@@ -694,7 +815,8 @@ bool MinidumpGenerator::WriteContextX86(breakpad_thread_state_data_t state,
*register_location = context.location();
MDRawContextX86 *context_ptr = context.get();
-#define AddReg(a) context_ptr->a = REGISTER_FROM_THREADSTATE(machine_state, a)
+#define AddReg(a) context_ptr->a = static_cast<__typeof__(context_ptr->a)>( \
+ REGISTER_FROM_THREADSTATE(machine_state, a))
context_ptr->context_flags = MD_CONTEXT_X86;
AddReg(eax);
@@ -733,7 +855,8 @@ bool MinidumpGenerator::WriteContextX86_64(
*register_location = context.location();
MDRawContextAMD64 *context_ptr = context.get();
-#define AddReg(a) context_ptr->a = REGISTER_FROM_THREADSTATE(machine_state, a)
+#define AddReg(a) context_ptr->a = static_cast<__typeof__(context_ptr->a)>( \
+ REGISTER_FROM_THREADSTATE(machine_state, a))
context_ptr->context_flags = MD_CONTEXT_AMD64;
AddReg(rax);
@@ -757,7 +880,7 @@ bool MinidumpGenerator::WriteContextX86_64(
// not used in the flags register. Since the minidump format
// specifies 32 bits for the flags register, we can truncate safely
// with no loss.
- context_ptr->eflags = static_cast<u_int32_t>(REGISTER_FROM_THREADSTATE(machine_state, rflags));
+ context_ptr->eflags = static_cast<uint32_t>(REGISTER_FROM_THREADSTATE(machine_state, rflags));
AddReg(cs);
AddReg(fs);
AddReg(gs);
@@ -770,6 +893,40 @@ bool MinidumpGenerator::WriteContextX86_64(
bool MinidumpGenerator::GetThreadState(thread_act_t target_thread,
thread_state_t state,
mach_msg_type_number_t *count) {
+ if (task_context_ && target_thread == mach_thread_self()) {
+ switch (cpu_type_) {
+#ifdef HAS_ARM_SUPPORT
+ case CPU_TYPE_ARM:
+ size_t final_size =
+ std::min(static_cast<size_t>(*count), sizeof(arm_thread_state_t));
+ memcpy(state, &task_context_->breakpad_uc_mcontext->__ss, final_size);
+ *count = static_cast<mach_msg_type_number_t>(final_size);
+ return true;
+#endif
+#ifdef HAS_ARM64_SUPPORT
+ case CPU_TYPE_ARM64: {
+ size_t final_size =
+ std::min(static_cast<size_t>(*count), sizeof(arm_thread_state64_t));
+ memcpy(state, &task_context_->breakpad_uc_mcontext->__ss, final_size);
+ *count = static_cast<mach_msg_type_number_t>(final_size);
+ return true;
+ }
+#endif
+#ifdef HAS_X86_SUPPORT
+ case CPU_TYPE_I386:
+ case CPU_TYPE_X86_64: {
+ size_t state_size = cpu_type_ == CPU_TYPE_I386 ?
+ sizeof(i386_thread_state_t) : sizeof(x86_thread_state64_t);
+ size_t final_size =
+ std::min(static_cast<size_t>(*count), state_size);
+ memcpy(state, &task_context_->breakpad_uc_mcontext->__ss, final_size);
+ *count = static_cast<mach_msg_type_number_t>(final_size);
+ return true;
+ }
+#endif
+ }
+ }
+
thread_state_flavor_t flavor;
switch (cpu_type_) {
#ifdef HAS_ARM_SUPPORT
@@ -777,6 +934,11 @@ bool MinidumpGenerator::GetThreadState(thread_act_t target_thread,
flavor = ARM_THREAD_STATE;
break;
#endif
+#ifdef HAS_ARM64_SUPPORT
+ case CPU_TYPE_ARM64:
+ flavor = ARM_THREAD_STATE64;
+ break;
+#endif
#ifdef HAS_PPC_SUPPORT
case CPU_TYPE_POWERPC:
flavor = PPC_THREAD_STATE;
@@ -878,26 +1040,25 @@ bool MinidumpGenerator::WriteMemoryListStream(
mach_msg_type_number_t stateCount
= static_cast<mach_msg_type_number_t>(sizeof(state));
- if (thread_get_state(exception_thread_,
- BREAKPAD_MACHINE_THREAD_STATE,
- state,
- &stateCount) == KERN_SUCCESS) {
- u_int64_t ip = CurrentPCForStack(state);
+ if (GetThreadState(exception_thread_, state, &stateCount)) {
+ uint64_t ip = CurrentPCForStack(state);
// Bound it to the upper and lower bounds of the region
// it's contained within. If it's not in a known memory region,
// don't bother trying to write it.
- mach_vm_address_t addr = ip;
+ mach_vm_address_t addr = static_cast<vm_address_t>(ip);
mach_vm_size_t size;
natural_t nesting_level = 0;
vm_region_submap_info_64 info;
mach_msg_type_number_t info_count = VM_REGION_SUBMAP_INFO_COUNT_64;
+ vm_region_recurse_info_t recurse_info;
+ recurse_info = reinterpret_cast<vm_region_recurse_info_t>(&info);
kern_return_t ret =
mach_vm_region_recurse(crashing_task_,
&addr,
&size,
&nesting_level,
- (vm_region_recurse_info_t)&info,
+ recurse_info,
&info_count);
if (ret == KERN_SUCCESS && ip >= addr && ip < (addr + size)) {
// Try to get 128 bytes before and after the IP, but
@@ -908,8 +1069,9 @@ bool MinidumpGenerator::WriteMemoryListStream(
uintptr_t end_of_range =
std::min(uintptr_t(ip + (kIPMemorySize / 2)),
uintptr_t(addr + size));
- ip_memory_d.memory.data_size =
- end_of_range - ip_memory_d.start_of_memory_range;
+ uintptr_t range_diff = end_of_range -
+ static_cast<uintptr_t>(ip_memory_d.start_of_memory_range);
+ ip_memory_d.memory.data_size = static_cast<uint32_t>(range_diff);
have_ip_memory = true;
// This needs to get appended to the list even though
// the memory bytes aren't filled in yet so the entire
@@ -921,7 +1083,7 @@ bool MinidumpGenerator::WriteMemoryListStream(
}
// Now fill in the memory list and write it.
- unsigned memory_count = memory_blocks_.size();
+ size_t memory_count = memory_blocks_.size();
if (!list.AllocateObjectAndArray(memory_count,
sizeof(MDMemoryDescriptor)))
return false;
@@ -929,7 +1091,7 @@ bool MinidumpGenerator::WriteMemoryListStream(
memory_list_stream->stream_type = MD_MEMORY_LIST_STREAM;
memory_list_stream->location = list.location();
- list.get()->number_of_memory_ranges = memory_count;
+ list.get()->number_of_memory_ranges = static_cast<uint32_t>(memory_count);
unsigned int i;
for (i = 0; i < memory_count; ++i) {
@@ -1027,6 +1189,11 @@ bool MinidumpGenerator::WriteSystemInfoStream(
info_ptr->processor_architecture = MD_CPU_ARCHITECTURE_ARM;
break;
#endif
+#ifdef HAS_ARM64_SUPPORT
+ case CPU_TYPE_ARM64:
+ info_ptr->processor_architecture = MD_CPU_ARCHITECTURE_ARM64;
+ break;
+#endif
#ifdef HAS_PPC_SUPPORT
case CPU_TYPE_POWERPC:
case CPU_TYPE_POWERPC64:
@@ -1078,9 +1245,9 @@ bool MinidumpGenerator::WriteSystemInfoStream(
info_ptr->processor_level =
(info_ptr->cpu.x86_cpu_info.version_information & 0xF00) >> 8;
// 0xMMSS (Model, Stepping)
- info_ptr->processor_revision =
- (info_ptr->cpu.x86_cpu_info.version_information & 0xF) |
- ((info_ptr->cpu.x86_cpu_info.version_information & 0xF0) << 4);
+ info_ptr->processor_revision = static_cast<uint16_t>(
+ (info_ptr->cpu.x86_cpu_info.version_information & 0xF) |
+ ((info_ptr->cpu.x86_cpu_info.version_information & 0xF0) << 4));
// decode extended model info
if (info_ptr->processor_level == 0xF ||
@@ -1103,7 +1270,7 @@ bool MinidumpGenerator::WriteSystemInfoStream(
break;
}
- info_ptr->number_of_processors = number_of_processors;
+ info_ptr->number_of_processors = static_cast<uint8_t>(number_of_processors);
#if TARGET_OS_IPHONE
info_ptr->platform_id = MD_OS_IOS;
#else
@@ -1142,13 +1309,13 @@ bool MinidumpGenerator::WriteModuleStream(unsigned int index,
return false;
module->base_of_image = image->GetVMAddr() + image->GetVMAddrSlide();
- module->size_of_image = static_cast<u_int32_t>(image->GetVMSize());
+ module->size_of_image = static_cast<uint32_t>(image->GetVMSize());
module->module_name_rva = string_location.rva;
// We'll skip the executable module, because they don't have
// LC_ID_DYLIB load commands, and the crash processing server gets
// version information from the Plist file, anyway.
- if (index != (uint32_t)FindExecutableModule()) {
+ if (index != static_cast<uint32_t>(FindExecutableModule())) {
module->version_info.signature = MD_VSFIXEDFILEINFO_SIGNATURE;
module->version_info.struct_version |= MD_VSFIXEDFILEINFO_VERSION;
// Convert MAC dylib version format, which is a 32 bit number, to the
@@ -1208,7 +1375,7 @@ bool MinidumpGenerator::WriteModuleStream(unsigned int index,
return false;
module->base_of_image = seg->vmaddr + slide;
- module->size_of_image = static_cast<u_int32_t>(seg->vmsize);
+ module->size_of_image = static_cast<uint32_t>(seg->vmsize);
module->module_name_rva = string_location.rva;
bool in_memory = false;
@@ -1267,7 +1434,7 @@ bool MinidumpGenerator::WriteCVRecord(MDRawModule *module, int cpu_type,
size_t module_name_length = strlen(module_name);
- if (!cv.AllocateObjectAndArray(module_name_length + 1, sizeof(u_int8_t)))
+ if (!cv.AllocateObjectAndArray(module_name_length + 1, sizeof(uint8_t)))
return false;
if (!cv.CopyIndexAfterObject(0, module_name, module_name_length))
@@ -1285,22 +1452,27 @@ bool MinidumpGenerator::WriteCVRecord(MDRawModule *module, int cpu_type,
MacFileUtilities::MachoID macho(module_path,
reinterpret_cast<void *>(module->base_of_image),
static_cast<size_t>(module->size_of_image));
- result = macho.UUIDCommand(cpu_type, identifier);
+ result = macho.UUIDCommand(cpu_type, CPU_SUBTYPE_MULTIPLE, identifier);
if (!result)
- result = macho.MD5(cpu_type, identifier);
+ result = macho.MD5(cpu_type, CPU_SUBTYPE_MULTIPLE, identifier);
}
if (!result) {
FileID file_id(module_path);
- result = file_id.MachoIdentifier(cpu_type, identifier);
+ result = file_id.MachoIdentifier(cpu_type, CPU_SUBTYPE_MULTIPLE,
+ identifier);
}
if (result) {
- cv_ptr->signature.data1 = (uint32_t)identifier[0] << 24 |
- (uint32_t)identifier[1] << 16 | (uint32_t)identifier[2] << 8 |
- (uint32_t)identifier[3];
- cv_ptr->signature.data2 = (uint32_t)identifier[4] << 8 | identifier[5];
- cv_ptr->signature.data3 = (uint32_t)identifier[6] << 8 | identifier[7];
+ cv_ptr->signature.data1 =
+ static_cast<uint32_t>(identifier[0]) << 24 |
+ static_cast<uint32_t>(identifier[1]) << 16 |
+ static_cast<uint32_t>(identifier[2]) << 8 |
+ static_cast<uint32_t>(identifier[3]);
+ cv_ptr->signature.data2 =
+ static_cast<uint16_t>(identifier[4] << 8) | identifier[5];
+ cv_ptr->signature.data3 =
+ static_cast<uint16_t>(identifier[6] << 8) | identifier[7];
cv_ptr->signature.data4[0] = identifier[8];
cv_ptr->signature.data4[1] = identifier[9];
cv_ptr->signature.data4[2] = identifier[10];
@@ -1318,8 +1490,8 @@ bool MinidumpGenerator::WriteModuleListStream(
MDRawDirectory *module_list_stream) {
TypedMDRVA<MDRawModuleList> list(&writer_);
- size_t image_count = dynamic_images_ ?
- static_cast<size_t>(dynamic_images_->GetImageCount()) :
+ uint32_t image_count = dynamic_images_ ?
+ dynamic_images_->GetImageCount() :
_dyld_image_count();
if (!list.AllocateObjectAndArray(image_count, MD_MODULE_SIZE))
@@ -1327,22 +1499,22 @@ bool MinidumpGenerator::WriteModuleListStream(
module_list_stream->stream_type = MD_MODULE_LIST_STREAM;
module_list_stream->location = list.location();
- list.get()->number_of_modules = image_count;
+ list.get()->number_of_modules = static_cast<uint32_t>(image_count);
// Write out the executable module as the first one
MDRawModule module;
- size_t executableIndex = FindExecutableModule();
+ uint32_t executableIndex = FindExecutableModule();
- if (!WriteModuleStream(executableIndex, &module)) {
+ if (!WriteModuleStream(static_cast<unsigned>(executableIndex), &module)) {
return false;
}
list.CopyIndexAfterObject(0, &module, MD_MODULE_SIZE);
int destinationIndex = 1; // Write all other modules after this one
- for (size_t i = 0; i < image_count; ++i) {
+ for (uint32_t i = 0; i < image_count; ++i) {
if (i != executableIndex) {
- if (!WriteModuleStream(i, &module)) {
+ if (!WriteModuleStream(static_cast<unsigned>(i), &module)) {
return false;
}
@@ -1363,7 +1535,7 @@ bool MinidumpGenerator::WriteMiscInfoStream(MDRawDirectory *misc_info_stream) {
misc_info_stream->location = info.location();
MDRawMiscInfo *info_ptr = info.get();
- info_ptr->size_of_info = static_cast<u_int32_t>(sizeof(MDRawMiscInfo));
+ info_ptr->size_of_info = static_cast<uint32_t>(sizeof(MDRawMiscInfo));
info_ptr->flags1 = MD_MISCINFO_FLAGS1_PROCESS_ID |
MD_MISCINFO_FLAGS1_PROCESS_TIMES |
MD_MISCINFO_FLAGS1_PROCESSOR_POWER_INFO;
@@ -1376,18 +1548,18 @@ bool MinidumpGenerator::WriteMiscInfoStream(MDRawDirectory *misc_info_stream) {
if (getrusage(RUSAGE_SELF, &usage) != -1) {
// Omit the fractional time since the MDRawMiscInfo only wants seconds
info_ptr->process_user_time =
- static_cast<u_int32_t>(usage.ru_utime.tv_sec);
+ static_cast<uint32_t>(usage.ru_utime.tv_sec);
info_ptr->process_kernel_time =
- static_cast<u_int32_t>(usage.ru_stime.tv_sec);
+ static_cast<uint32_t>(usage.ru_stime.tv_sec);
}
int mib[4] = { CTL_KERN, KERN_PROC, KERN_PROC_PID,
static_cast<int>(info_ptr->process_id) };
- u_int mibsize = static_cast<u_int>(sizeof(mib) / sizeof(mib[0]));
+ uint mibsize = static_cast<uint>(sizeof(mib) / sizeof(mib[0]));
struct kinfo_proc proc;
size_t size = sizeof(proc);
if (sysctl(mib, mibsize, &proc, &size, NULL, 0) == 0) {
info_ptr->process_create_time =
- static_cast<u_int32_t>(proc.kp_proc.p_starttime.tv_sec);
+ static_cast<uint32_t>(proc.kp_proc.p_starttime.tv_sec);
}
// Speed
@@ -1395,11 +1567,11 @@ bool MinidumpGenerator::WriteMiscInfoStream(MDRawDirectory *misc_info_stream) {
const uint64_t kOneMillion = 1000 * 1000;
size = sizeof(speed);
sysctlbyname("hw.cpufrequency_max", &speed, &size, NULL, 0);
- info_ptr->processor_max_mhz = static_cast<u_int32_t>(speed / kOneMillion);
- info_ptr->processor_mhz_limit = static_cast<u_int32_t>(speed / kOneMillion);
+ info_ptr->processor_max_mhz = static_cast<uint32_t>(speed / kOneMillion);
+ info_ptr->processor_mhz_limit = static_cast<uint32_t>(speed / kOneMillion);
size = sizeof(speed);
sysctlbyname("hw.cpufrequency", &speed, &size, NULL, 0);
- info_ptr->processor_current_mhz = static_cast<u_int32_t>(speed / kOneMillion);
+ info_ptr->processor_current_mhz = static_cast<uint32_t>(speed / kOneMillion);
return true;
}
diff --git a/3rdParty/Breakpad/src/client/mac/handler/minidump_generator.h b/3rdParty/Breakpad/src/client/mac/handler/minidump_generator.h
index 8394ce6..4e4b4a6 100644
--- a/3rdParty/Breakpad/src/client/mac/handler/minidump_generator.h
+++ b/3rdParty/Breakpad/src/client/mac/handler/minidump_generator.h
@@ -37,6 +37,7 @@
#include <string>
+#include "client/mac/handler/ucontext_compat.h"
#include "client/minidump_file_writer.h"
#include "common/memory.h"
#include "common/mac/macho_utilities.h"
@@ -49,7 +50,9 @@
#define HAS_PPC_SUPPORT
#endif
#if defined(__arm__)
- #define HAS_ARM_SUPPORT
+#define HAS_ARM_SUPPORT
+#elif defined(__aarch64__)
+#define HAS_ARM64_SUPPORT
#elif defined(__i386__) || defined(__x86_64__)
#define HAS_X86_SUPPORT
#endif
@@ -102,6 +105,11 @@ class MinidumpGenerator {
exception_thread_ = thread_name;
}
+ // Specify the task context. If |task_context| is not NULL, it will be used
+ // to retrieve the context of the current thread, instead of using
+ // |thread_get_state|.
+ void SetTaskContext(breakpad_ucontext_t *task_context);
+
// Gather system information. This should be call at least once before using
// the MinidumpGenerator class.
static void GatherSystemInformation();
@@ -125,7 +133,7 @@ class MinidumpGenerator {
bool WriteBreakpadInfoStream(MDRawDirectory *breakpad_info_stream);
// Helpers
- u_int64_t CurrentPCForStack(breakpad_thread_state_data_t state);
+ uint64_t CurrentPCForStack(breakpad_thread_state_data_t state);
bool GetThreadState(thread_act_t target_thread, thread_state_t state,
mach_msg_type_number_t *count);
bool WriteStackFromStartAddress(mach_vm_address_t start_addr,
@@ -146,31 +154,38 @@ class MinidumpGenerator {
MDMemoryDescriptor *stack_location);
bool WriteContextARM(breakpad_thread_state_data_t state,
MDLocationDescriptor *register_location);
- u_int64_t CurrentPCForStackARM(breakpad_thread_state_data_t state);
+ uint64_t CurrentPCForStackARM(breakpad_thread_state_data_t state);
+#endif
+#ifdef HAS_ARM64_SUPPORT
+ bool WriteStackARM64(breakpad_thread_state_data_t state,
+ MDMemoryDescriptor *stack_location);
+ bool WriteContextARM64(breakpad_thread_state_data_t state,
+ MDLocationDescriptor *register_location);
+ uint64_t CurrentPCForStackARM64(breakpad_thread_state_data_t state);
#endif
#ifdef HAS_PPC_SUPPORT
bool WriteStackPPC(breakpad_thread_state_data_t state,
MDMemoryDescriptor *stack_location);
bool WriteContextPPC(breakpad_thread_state_data_t state,
MDLocationDescriptor *register_location);
- u_int64_t CurrentPCForStackPPC(breakpad_thread_state_data_t state);
+ uint64_t CurrentPCForStackPPC(breakpad_thread_state_data_t state);
bool WriteStackPPC64(breakpad_thread_state_data_t state,
MDMemoryDescriptor *stack_location);
bool WriteContextPPC64(breakpad_thread_state_data_t state,
MDLocationDescriptor *register_location);
- u_int64_t CurrentPCForStackPPC64(breakpad_thread_state_data_t state);
+ uint64_t CurrentPCForStackPPC64(breakpad_thread_state_data_t state);
#endif
#ifdef HAS_X86_SUPPORT
bool WriteStackX86(breakpad_thread_state_data_t state,
MDMemoryDescriptor *stack_location);
bool WriteContextX86(breakpad_thread_state_data_t state,
MDLocationDescriptor *register_location);
- u_int64_t CurrentPCForStackX86(breakpad_thread_state_data_t state);
+ uint64_t CurrentPCForStackX86(breakpad_thread_state_data_t state);
bool WriteStackX86_64(breakpad_thread_state_data_t state,
MDMemoryDescriptor *stack_location);
bool WriteContextX86_64(breakpad_thread_state_data_t state,
MDLocationDescriptor *register_location);
- u_int64_t CurrentPCForStackX86_64(breakpad_thread_state_data_t state);
+ uint64_t CurrentPCForStackX86_64(breakpad_thread_state_data_t state);
#endif
// disallow copy ctor and operator=
@@ -192,13 +207,16 @@ class MinidumpGenerator {
// CPU type of the task being dumped.
cpu_type_t cpu_type_;
-
+
// System information
static char build_string_[16];
static int os_major_version_;
static int os_minor_version_;
static int os_build_number_;
-
+
+ // Context of the task to dump.
+ breakpad_ucontext_t *task_context_;
+
// Information about dynamically loaded code
DynamicImages *dynamic_images_;
diff --git a/3rdParty/Breakpad/src/client/mac/handler/protected_memory_allocator.cc b/3rdParty/Breakpad/src/client/mac/handler/protected_memory_allocator.cc
new file mode 100644
index 0000000..6142ad1
--- /dev/null
+++ b/3rdParty/Breakpad/src/client/mac/handler/protected_memory_allocator.cc
@@ -0,0 +1,92 @@
+// Copyright (c) 2006, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// ProtectedMemoryAllocator
+//
+// See the header file for documentation
+
+#include "protected_memory_allocator.h"
+#include <assert.h>
+
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ProtectedMemoryAllocator::ProtectedMemoryAllocator(vm_size_t pool_size)
+ : pool_size_(pool_size),
+ next_alloc_offset_(0),
+ valid_(false) {
+
+ kern_return_t result = vm_allocate(mach_task_self(),
+ &base_address_,
+ pool_size,
+ TRUE
+ );
+
+ valid_ = (result == KERN_SUCCESS);
+ assert(valid_);
+}
+
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ProtectedMemoryAllocator::~ProtectedMemoryAllocator() {
+ vm_deallocate(mach_task_self(),
+ base_address_,
+ pool_size_
+ );
+}
+
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+char *ProtectedMemoryAllocator::Allocate(vm_size_t bytes) {
+ if (valid_ && next_alloc_offset_ + bytes <= pool_size_) {
+ char *p = (char*)base_address_ + next_alloc_offset_;
+ next_alloc_offset_ += bytes;
+ return p;
+ }
+
+ return NULL; // ran out of memory in our allocation block
+}
+
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+kern_return_t ProtectedMemoryAllocator::Protect() {
+ kern_return_t result = vm_protect(mach_task_self(),
+ base_address_,
+ pool_size_,
+ FALSE,
+ VM_PROT_READ);
+
+ return result;
+}
+
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+kern_return_t ProtectedMemoryAllocator::Unprotect() {
+ kern_return_t result = vm_protect(mach_task_self(),
+ base_address_,
+ pool_size_,
+ FALSE,
+ VM_PROT_READ | VM_PROT_WRITE);
+
+ return result;
+}
diff --git a/3rdParty/Breakpad/src/client/mac/handler/protected_memory_allocator.h b/3rdParty/Breakpad/src/client/mac/handler/protected_memory_allocator.h
new file mode 100644
index 0000000..7e188db
--- /dev/null
+++ b/3rdParty/Breakpad/src/client/mac/handler/protected_memory_allocator.h
@@ -0,0 +1,85 @@
+// Copyright (c) 2006, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// ProtectedMemoryAllocator
+//
+// A very simple allocator class which allows allocation, but not deallocation.
+// The allocations can be made read-only with the Protect() method.
+// This class is NOT useful as a general-purpose memory allocation system,
+// since it does not allow deallocation. It is useful to use for a group
+// of allocations which are created in the same time-frame and destroyed
+// in the same time-frame. It is useful for making allocations of memory
+// which will not need to change often once initialized. This memory can then
+// be protected from memory smashers by calling the Protect() method.
+
+#ifndef PROTECTED_MEMORY_ALLOCATOR_H__
+#define PROTECTED_MEMORY_ALLOCATOR_H__
+
+#include <mach/mach.h>
+
+//
+class ProtectedMemoryAllocator {
+ public:
+ ProtectedMemoryAllocator(vm_size_t pool_size);
+ ~ProtectedMemoryAllocator();
+
+ // Returns a pointer to an allocation of size n within the pool.
+ // Fails by returning NULL is no more space is available.
+ // Please note that the pointers returned from this method should not
+ // be freed in any way (for example by calling free() on them ).
+ char * Allocate(vm_size_t n);
+
+ // Returns the base address of the allocation pool.
+ char * GetBaseAddress() { return (char*)base_address_; }
+
+ // Returns the size of the allocation pool, including allocated
+ // plus free space.
+ vm_size_t GetTotalSize() { return pool_size_; }
+
+ // Returns the number of bytes already allocated in the pool.
+ vm_size_t GetAllocatedSize() { return next_alloc_offset_; }
+
+ // Returns the number of bytes available for allocation.
+ vm_size_t GetFreeSize() { return pool_size_ - next_alloc_offset_; }
+
+ // Makes the entire allocation pool read-only including, of course,
+ // all allocations made from the pool.
+ kern_return_t Protect();
+
+ // Makes the entire allocation pool read/write.
+ kern_return_t Unprotect();
+
+ private:
+ vm_size_t pool_size_;
+ vm_address_t base_address_;
+ vm_size_t next_alloc_offset_;
+ bool valid_;
+};
+
+#endif // PROTECTED_MEMORY_ALLOCATOR_H__
diff --git a/3rdParty/Breakpad/src/client/mac/handler/ucontext_compat.h b/3rdParty/Breakpad/src/client/mac/handler/ucontext_compat.h
new file mode 100644
index 0000000..1e4b752
--- /dev/null
+++ b/3rdParty/Breakpad/src/client/mac/handler/ucontext_compat.h
@@ -0,0 +1,47 @@
+// Copyright 2013 Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#ifndef CLIENT_MAC_HANDLER_UCONTEXT_COMPAT_H_
+#define CLIENT_MAC_HANDLER_UCONTEXT_COMPAT_H_
+
+#include <sys/ucontext.h>
+
+// The purpose of this file is to work around the fact that ucontext_t's
+// uc_mcontext member is an mcontext_t rather than an mcontext64_t on ARM64.
+#if defined(__aarch64__)
+// <sys/ucontext.h> doesn't include the below file.
+#include <sys/_types/_ucontext64.h>
+typedef ucontext64_t breakpad_ucontext_t;
+#define breakpad_uc_mcontext uc_mcontext64
+#else
+typedef ucontext_t breakpad_ucontext_t;
+#define breakpad_uc_mcontext uc_mcontext
+#endif // defined(__aarch64__)
+
+#endif // CLIENT_MAC_HANDLER_UCONTEXT_COMPAT_H_
diff --git a/3rdParty/Breakpad/src/client/minidump_file_writer.cc b/3rdParty/Breakpad/src/client/minidump_file_writer.cc
index c267410..a1957f3 100644
--- a/3rdParty/Breakpad/src/client/minidump_file_writer.cc
+++ b/3rdParty/Breakpad/src/client/minidump_file_writer.cc
@@ -40,10 +40,51 @@
#include "client/minidump_file_writer-inl.h"
#include "common/linux/linux_libc_support.h"
#include "common/string_conversion.h"
-#if __linux__
+#if defined(__linux__) && __linux__
#include "third_party/lss/linux_syscall_support.h"
#endif
+#if defined(__ANDROID__)
+#include <errno.h>
+
+namespace {
+
+bool g_need_ftruncate_workaround = false;
+bool g_checked_need_ftruncate_workaround = false;
+
+void CheckNeedsFTruncateWorkAround(int file) {
+ if (g_checked_need_ftruncate_workaround) {
+ return;
+ }
+ g_checked_need_ftruncate_workaround = true;
+
+ // Attempt an idempotent truncate that chops off nothing and see if we
+ // run into any sort of errors.
+ off_t offset = sys_lseek(file, 0, SEEK_END);
+ if (offset == -1) {
+ // lseek failed. Don't apply work around. It's unlikely that we can write
+ // to a minidump with either method.
+ return;
+ }
+
+ int result = ftruncate(file, offset);
+ if (result == -1 && errno == EACCES) {
+ // It very likely that we are running into the kernel bug in M devices.
+ // We are going to deploy the workaround for writing minidump files
+ // without uses of ftruncate(). This workaround should be fine even
+ // for kernels without the bug.
+ // See http://crbug.com/542840 for more details.
+ g_need_ftruncate_workaround = true;
+ }
+}
+
+bool NeedsFTruncateWorkAround() {
+ return g_need_ftruncate_workaround;
+}
+
+} // namespace
+#endif // defined(__ANDROID__)
+
namespace google_breakpad {
const MDRVA MinidumpFileWriter::kInvalidMDRVA = static_cast<MDRVA>(-1);
@@ -62,7 +103,7 @@ MinidumpFileWriter::~MinidumpFileWriter() {
bool MinidumpFileWriter::Open(const char *path) {
assert(file_ == -1);
-#if __linux__
+#if defined(__linux__) && __linux__
file_ = sys_open(path, O_WRONLY | O_CREAT | O_EXCL, 0600);
#else
file_ = open(path, O_WRONLY | O_CREAT | O_EXCL, 0600);
@@ -75,16 +116,25 @@ void MinidumpFileWriter::SetFile(const int file) {
assert(file_ == -1);
file_ = file;
close_file_when_destroyed_ = false;
+#if defined(__ANDROID__)
+ CheckNeedsFTruncateWorkAround(file);
+#endif
}
bool MinidumpFileWriter::Close() {
bool result = true;
if (file_ != -1) {
- if (-1 == ftruncate(file_, position_)) {
+#if defined(__ANDROID__)
+ if (!NeedsFTruncateWorkAround() && ftruncate(file_, position_)) {
return false;
}
-#if __linux__
+#else
+ if (ftruncate(file_, position_)) {
+ return false;
+ }
+#endif
+#if defined(__linux__) && __linux__
result = (sys_close(file_) == 0);
#else
result = (close(file_) == 0);
@@ -99,11 +149,11 @@ bool MinidumpFileWriter::CopyStringToMDString(const wchar_t *str,
unsigned int length,
TypedMDRVA<MDString> *mdstring) {
bool result = true;
- if (sizeof(wchar_t) == sizeof(u_int16_t)) {
+ if (sizeof(wchar_t) == sizeof(uint16_t)) {
// Shortcut if wchar_t is the same size as MDString's buffer
result = mdstring->Copy(str, mdstring->get()->length);
} else {
- u_int16_t out[2];
+ uint16_t out[2];
int out_idx = 0;
// Copy the string character by character
@@ -120,7 +170,7 @@ bool MinidumpFileWriter::CopyStringToMDString(const wchar_t *str,
// zero, but the second one may be zero, depending on the conversion from
// UTF-32.
int out_count = out[1] ? 2 : 1;
- size_t out_size = sizeof(u_int16_t) * out_count;
+ size_t out_size = sizeof(uint16_t) * out_count;
result = mdstring->CopyIndexAfterObject(out_idx, out, out_size);
out_idx += out_count;
}
@@ -132,7 +182,7 @@ bool MinidumpFileWriter::CopyStringToMDString(const char *str,
unsigned int length,
TypedMDRVA<MDString> *mdstring) {
bool result = true;
- u_int16_t out[2];
+ uint16_t out[2];
int out_idx = 0;
// Copy the string character by character
@@ -147,7 +197,7 @@ bool MinidumpFileWriter::CopyStringToMDString(const char *str,
// Append the one or two UTF-16 characters
int out_count = out[1] ? 2 : 1;
- size_t out_size = sizeof(u_int16_t) * out_count;
+ size_t out_size = sizeof(uint16_t) * out_count;
result = mdstring->CopyIndexAfterObject(out_idx, out, out_size);
out_idx += out_count;
}
@@ -170,17 +220,17 @@ bool MinidumpFileWriter::WriteStringCore(const CharType *str,
// Allocate the string buffer
TypedMDRVA<MDString> mdstring(this);
- if (!mdstring.AllocateObjectAndArray(mdstring_length + 1, sizeof(u_int16_t)))
+ if (!mdstring.AllocateObjectAndArray(mdstring_length + 1, sizeof(uint16_t)))
return false;
// Set length excluding the NULL and copy the string
mdstring.get()->length =
- static_cast<u_int32_t>(mdstring_length * sizeof(u_int16_t));
+ static_cast<uint32_t>(mdstring_length * sizeof(uint16_t));
bool result = CopyStringToMDString(str, mdstring_length, &mdstring);
// NULL terminate
if (result) {
- u_int16_t ch = 0;
+ uint16_t ch = 0;
result = mdstring.CopyIndexAfterObject(mdstring_length, &ch, sizeof(ch));
if (result)
@@ -211,7 +261,7 @@ bool MinidumpFileWriter::WriteMemory(const void *src, size_t size,
if (!mem.Copy(src, mem.size()))
return false;
- output->start_of_memory_range = reinterpret_cast<u_int64_t>(src);
+ output->start_of_memory_range = reinterpret_cast<uint64_t>(src);
output->memory = mem.location();
return true;
@@ -220,6 +270,20 @@ bool MinidumpFileWriter::WriteMemory(const void *src, size_t size,
MDRVA MinidumpFileWriter::Allocate(size_t size) {
assert(size);
assert(file_ != -1);
+#if defined(__ANDROID__)
+ if (NeedsFTruncateWorkAround()) {
+ // If ftruncate() is not available. We simply increase the size beyond the
+ // current file size. sys_write() will expand the file when data is written
+ // to it. Because we did not over allocate to fit memory pages, we also
+ // do not need to ftruncate() the file once we are done.
+ size_ += size;
+
+ // We don't need to seek since the file is unchanged.
+ MDRVA current_position = position_;
+ position_ += static_cast<MDRVA>(size);
+ return current_position;
+ }
+#endif
size_t aligned_size = (size + 7) & ~7; // 64-bit alignment
if (position_ + aligned_size > size_) {
@@ -253,17 +317,19 @@ bool MinidumpFileWriter::Copy(MDRVA position, const void *src, ssize_t size) {
return false;
// Seek and write the data
-#if __linux__
+#if defined(__linux__) && __linux__
if (sys_lseek(file_, position, SEEK_SET) == static_cast<off_t>(position)) {
if (sys_write(file_, src, size) == size) {
+ return true;
+ }
+ }
#else
if (lseek(file_, position, SEEK_SET) == static_cast<off_t>(position)) {
if (write(file_, src, size) == size) {
-#endif
return true;
}
}
-
+#endif
return false;
}
diff --git a/3rdParty/Breakpad/src/client/minidump_file_writer.h b/3rdParty/Breakpad/src/client/minidump_file_writer.h
index 313b250..ce32b6d 100644
--- a/3rdParty/Breakpad/src/client/minidump_file_writer.h
+++ b/3rdParty/Breakpad/src/client/minidump_file_writer.h
@@ -74,8 +74,8 @@ public:
MinidumpFileWriter();
~MinidumpFileWriter();
- // Open |path| as the destination of the minidump data. Any existing file
- // will be overwritten.
+ // Open |path| as the destination of the minidump data. If |path| already
+ // exists, then Open() will fail.
// Return true on success, or false on failure.
bool Open(const char *path);
@@ -172,7 +172,7 @@ class UntypedMDRVA {
// Return size and position
inline MDLocationDescriptor location() const {
- MDLocationDescriptor location = { static_cast<u_int32_t>(size_),
+ MDLocationDescriptor location = { static_cast<uint32_t>(size_),
position_ };
return location;
}
diff --git a/3rdParty/Breakpad/src/client/minidump_file_writer_unittest.cc b/3rdParty/Breakpad/src/client/minidump_file_writer_unittest.cc
new file mode 100644
index 0000000..60c364e
--- /dev/null
+++ b/3rdParty/Breakpad/src/client/minidump_file_writer_unittest.cc
@@ -0,0 +1,179 @@
+// Copyright (c) 2006, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// Author: waylonis@google.com (Dan Waylonis)
+
+/*
+ g++ -I../ ../common/convert_UTF.c \
+ ../common/string_conversion.cc \
+ minidump_file_writer.cc \
+ minidump_file_writer_unittest.cc \
+ -o minidump_file_writer_unittest
+ */
+
+#include <fcntl.h>
+#include <unistd.h>
+
+#include "minidump_file_writer-inl.h"
+
+using google_breakpad::MinidumpFileWriter;
+
+#define ASSERT_TRUE(cond) \
+if (!(cond)) { \
+ fprintf(stderr, "FAILED: %s at %s:%d\n", #cond, __FILE__, __LINE__); \
+ return false; \
+}
+
+#define ASSERT_EQ(e1, e2) ASSERT_TRUE((e1) == (e2))
+#define ASSERT_NE(e1, e2) ASSERT_TRUE((e1) != (e2))
+
+struct StringStructure {
+ unsigned long integer_value;
+ MDLocationDescriptor first_string;
+ MDLocationDescriptor second_string;
+};
+
+struct ArrayStructure {
+ unsigned char char_value;
+ unsigned short short_value;
+ unsigned long long_value;
+};
+
+typedef struct {
+ unsigned long count;
+ ArrayStructure array[0];
+} ObjectAndArrayStructure;
+
+static bool WriteFile(const char *path) {
+ MinidumpFileWriter writer;
+ if (writer.Open(path)) {
+ // Test a single structure
+ google_breakpad::TypedMDRVA<StringStructure> strings(&writer);
+ ASSERT_TRUE(strings.Allocate());
+ strings.get()->integer_value = 0xBEEF;
+ const char *first = "First String";
+ ASSERT_TRUE(writer.WriteString(first, 0, &strings.get()->first_string));
+ const wchar_t *second = L"Second String";
+ ASSERT_TRUE(writer.WriteString(second, 0, &strings.get()->second_string));
+
+ // Test an array structure
+ google_breakpad::TypedMDRVA<ArrayStructure> array(&writer);
+ unsigned int count = 10;
+ ASSERT_TRUE(array.AllocateArray(count));
+ for (unsigned char i = 0; i < count; ++i) {
+ ArrayStructure local;
+ local.char_value = i;
+ local.short_value = i + 1;
+ local.long_value = i + 2;
+ ASSERT_TRUE(array.CopyIndex(i, &local));
+ }
+
+ // Test an object followed by an array
+ google_breakpad::TypedMDRVA<ObjectAndArrayStructure> obj_array(&writer);
+ ASSERT_TRUE(obj_array.AllocateObjectAndArray(count,
+ sizeof(ArrayStructure)));
+ obj_array.get()->count = count;
+ for (unsigned char i = 0; i < count; ++i) {
+ ArrayStructure local;
+ local.char_value = i;
+ local.short_value = i + 1;
+ local.long_value = i + 2;
+ ASSERT_TRUE(obj_array.CopyIndexAfterObject(i, &local, sizeof(local)));
+ }
+ }
+
+ return writer.Close();
+}
+
+static bool CompareFile(const char *path) {
+ unsigned long expected[] = {
+#if defined(__BIG_ENDIAN__)
+ 0x0000beef, 0x0000001e, 0x00000018, 0x00000020, 0x00000038, 0x00000000,
+ 0x00000018, 0x00460069, 0x00720073, 0x00740020, 0x00530074, 0x00720069,
+ 0x006e0067, 0x00000000, 0x0000001a, 0x00530065, 0x0063006f, 0x006e0064,
+ 0x00200053, 0x00740072, 0x0069006e, 0x00670000, 0x00000001, 0x00000002,
+ 0x01000002, 0x00000003, 0x02000003, 0x00000004, 0x03000004, 0x00000005,
+ 0x04000005, 0x00000006, 0x05000006, 0x00000007, 0x06000007, 0x00000008,
+ 0x07000008, 0x00000009, 0x08000009, 0x0000000a, 0x0900000a, 0x0000000b,
+ 0x0000000a, 0x00000001, 0x00000002, 0x01000002, 0x00000003, 0x02000003,
+ 0x00000004, 0x03000004, 0x00000005, 0x04000005, 0x00000006, 0x05000006,
+ 0x00000007, 0x06000007, 0x00000008, 0x07000008, 0x00000009, 0x08000009,
+ 0x0000000a, 0x0900000a, 0x0000000b, 0x00000000
+#else
+ 0x0000beef, 0x0000001e, 0x00000018, 0x00000020,
+ 0x00000038, 0x00000000, 0x00000018, 0x00690046,
+ 0x00730072, 0x00200074, 0x00740053, 0x00690072,
+ 0x0067006e, 0x00000000, 0x0000001a, 0x00650053,
+ 0x006f0063, 0x0064006e, 0x00530020, 0x00720074,
+ 0x006e0069, 0x00000067, 0x00011e00, 0x00000002,
+ 0x00021e01, 0x00000003, 0x00031e02, 0x00000004,
+ 0x00041e03, 0x00000005, 0x00051e04, 0x00000006,
+ 0x00061e05, 0x00000007, 0x00071e06, 0x00000008,
+ 0x00081e07, 0x00000009, 0x00091e08, 0x0000000a,
+ 0x000a1e09, 0x0000000b, 0x0000000a, 0x00011c00,
+ 0x00000002, 0x00021c01, 0x00000003, 0x00031c02,
+ 0x00000004, 0x00041c03, 0x00000005, 0x00051c04,
+ 0x00000006, 0x00061c05, 0x00000007, 0x00071c06,
+ 0x00000008, 0x00081c07, 0x00000009, 0x00091c08,
+ 0x0000000a, 0x000a1c09, 0x0000000b, 0x00000000,
+#endif
+ };
+ size_t expected_byte_count = sizeof(expected);
+ int fd = open(path, O_RDONLY, 0600);
+ void *buffer = malloc(expected_byte_count);
+ ASSERT_NE(fd, -1);
+ ASSERT_TRUE(buffer);
+ ASSERT_EQ(read(fd, buffer, expected_byte_count),
+ static_cast<ssize_t>(expected_byte_count));
+
+ char *b1, *b2;
+ b1 = reinterpret_cast<char*>(buffer);
+ b2 = reinterpret_cast<char*>(expected);
+ while (*b1 == *b2) {
+ b1++;
+ b2++;
+ }
+
+ printf("%p\n", reinterpret_cast<void*>(b1 - (char*)buffer));
+
+ ASSERT_EQ(memcmp(buffer, expected, expected_byte_count), 0);
+ return true;
+}
+
+static bool RunTests() {
+ const char *path = "/tmp/minidump_file_writer_unittest.dmp";
+ ASSERT_TRUE(WriteFile(path));
+ ASSERT_TRUE(CompareFile(path));
+ unlink(path);
+ return true;
+}
+
+extern "C" int main(int argc, const char *argv[]) {
+ return RunTests() ? 0 : 1;
+}
diff --git a/3rdParty/Breakpad/src/client/windows/common/auto_critical_section.h b/3rdParty/Breakpad/src/client/windows/common/auto_critical_section.h
new file mode 100644
index 0000000..3fd4b9b
--- /dev/null
+++ b/3rdParty/Breakpad/src/client/windows/common/auto_critical_section.h
@@ -0,0 +1,81 @@
+// Copyright (c) 2008, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#ifndef CLIENT_WINDOWS_COMMON_AUTO_CRITICAL_SECTION_H__
+#define CLIENT_WINDOWS_COMMON_AUTO_CRITICAL_SECTION_H__
+
+#include <windows.h>
+
+namespace google_breakpad {
+
+// Automatically enters the critical section in the constructor and leaves
+// the critical section in the destructor.
+class AutoCriticalSection {
+ public:
+ // Creates a new instance with the given critical section object
+ // and enters the critical section immediately.
+ explicit AutoCriticalSection(CRITICAL_SECTION* cs) : cs_(cs), taken_(false) {
+ assert(cs_);
+ Acquire();
+ }
+
+ // Destructor: leaves the critical section.
+ ~AutoCriticalSection() {
+ if (taken_) {
+ Release();
+ }
+ }
+
+ // Enters the critical section. Recursive Acquire() calls are not allowed.
+ void Acquire() {
+ assert(!taken_);
+ EnterCriticalSection(cs_);
+ taken_ = true;
+ }
+
+ // Leaves the critical section. The caller should not call Release() unless
+ // the critical seciton has been entered already.
+ void Release() {
+ assert(taken_);
+ taken_ = false;
+ LeaveCriticalSection(cs_);
+ }
+
+ private:
+ // Disable copy ctor and operator=.
+ AutoCriticalSection(const AutoCriticalSection&);
+ AutoCriticalSection& operator=(const AutoCriticalSection&);
+
+ CRITICAL_SECTION* cs_;
+ bool taken_;
+};
+
+} // namespace google_breakpad
+
+#endif // CLIENT_WINDOWS_COMMON_AUTO_CRITICAL_SECTION_H__
diff --git a/3rdParty/Breakpad/src/client/windows/common/ipc_protocol.h b/3rdParty/Breakpad/src/client/windows/common/ipc_protocol.h
index b03c032..c748681 100644
--- a/3rdParty/Breakpad/src/client/windows/common/ipc_protocol.h
+++ b/3rdParty/Breakpad/src/client/windows/common/ipc_protocol.h
@@ -30,8 +30,8 @@
#ifndef CLIENT_WINDOWS_COMMON_IPC_PROTOCOL_H__
#define CLIENT_WINDOWS_COMMON_IPC_PROTOCOL_H__
-#include <Windows.h>
-#include <DbgHelp.h>
+#include <windows.h>
+#include <dbghelp.h>
#include <string>
#include <utility>
#include "common/windows/string_utils-inl.h"
diff --git a/3rdParty/Breakpad/src/client/windows/crash_generation/ReadMe.txt b/3rdParty/Breakpad/src/client/windows/crash_generation/ReadMe.txt
new file mode 100644
index 0000000..b54d0e1
--- /dev/null
+++ b/3rdParty/Breakpad/src/client/windows/crash_generation/ReadMe.txt
@@ -0,0 +1,58 @@
+=========================================================================
+ State machine transitions for the Crash Generation Server
+=========================================================================
+
+=========================================================================
+ |
+ STATE | ACTIONS
+ |
+=========================================================================
+ ERROR | Clean up resources used to serve clients.
+ | Always remain in ERROR state.
+-------------------------------------------------------------------------
+ INITIAL | Connect to the pipe asynchronously.
+ | If connection is successfully queued up asynchronously,
+ | go into CONNECTING state.
+ | If connection is done synchronously, go into CONNECTED
+ | state.
+ | For any unexpected problems, go into ERROR state.
+-------------------------------------------------------------------------
+ CONNECTING | Get the result of async connection request.
+ | If I/O is still incomplete, remain in the CONNECTING
+ | state.
+ | If connection is complete, go into CONNECTED state.
+ | For any unexpected problems, go into DISCONNECTING state.
+-------------------------------------------------------------------------
+ CONNECTED | Read from the pipe asynchronously.
+ | If read request is successfully queued up asynchronously,
+ | go into READING state.
+ | For any unexpected problems, go into DISCONNECTING state.
+-------------------------------------------------------------------------
+ READING | Get the result of async read request.
+ | If read is done, go into READ_DONE state.
+ | For any unexpected problems, go into DISCONNECTING state.
+-------------------------------------------------------------------------
+ READ_DONE | Register the client, prepare the reply and write the
+ | reply to the pipe asynchronously.
+ | If write request is successfully queued up asynchronously,
+ | go into WRITING state.
+ | For any unexpected problems, go into DISCONNECTING state.
+-------------------------------------------------------------------------
+ WRITING | Get the result of the async write request.
+ | If write is done, go into WRITE_DONE state.
+ | For any unexpected problems, go into DISCONNECTING state.
+-------------------------------------------------------------------------
+ WRITE_DONE | Read from the pipe asynchronously (for an ACK).
+ | If read request is successfully queued up asynchonously,
+ | go into READING_ACK state.
+ | For any unexpected problems, go into DISCONNECTING state.
+-------------------------------------------------------------------------
+ READING_ACK | Get the result of the async read request.
+ | If read is done, perform action for successful client
+ | connection.
+ | Go into DISCONNECTING state.
+-------------------------------------------------------------------------
+ DISCONNECTING | Disconnect from the pipe, reset the event and go into
+ | INITIAL state and signal the event again. If anything
+ | fails, go into ERROR state.
+=========================================================================
diff --git a/3rdParty/Breakpad/src/client/windows/crash_generation/client_info.cc b/3rdParty/Breakpad/src/client/windows/crash_generation/client_info.cc
new file mode 100644
index 0000000..ed31263
--- /dev/null
+++ b/3rdParty/Breakpad/src/client/windows/crash_generation/client_info.cc
@@ -0,0 +1,223 @@
+// Copyright (c) 2008, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#include "client/windows/crash_generation/client_info.h"
+#include "client/windows/common/ipc_protocol.h"
+
+static const wchar_t kCustomInfoProcessUptimeName[] = L"ptime";
+static const size_t kMaxCustomInfoEntries = 4096;
+
+namespace google_breakpad {
+
+ClientInfo::ClientInfo(CrashGenerationServer* crash_server,
+ DWORD pid,
+ MINIDUMP_TYPE dump_type,
+ DWORD* thread_id,
+ EXCEPTION_POINTERS** ex_info,
+ MDRawAssertionInfo* assert_info,
+ const CustomClientInfo& custom_client_info)
+ : crash_server_(crash_server),
+ pid_(pid),
+ dump_type_(dump_type),
+ ex_info_(ex_info),
+ assert_info_(assert_info),
+ custom_client_info_(custom_client_info),
+ thread_id_(thread_id),
+ process_handle_(NULL),
+ dump_requested_handle_(NULL),
+ dump_generated_handle_(NULL),
+ dump_request_wait_handle_(NULL),
+ process_exit_wait_handle_(NULL),
+ crash_id_(NULL) {
+ GetSystemTimeAsFileTime(&start_time_);
+}
+
+bool ClientInfo::Initialize() {
+ process_handle_ = OpenProcess(GENERIC_ALL, FALSE, pid_);
+ if (!process_handle_) {
+ return false;
+ }
+
+ // The crash_id will be the low order word of the process creation time.
+ FILETIME creation_time, exit_time, kernel_time, user_time;
+ if (GetProcessTimes(process_handle_, &creation_time, &exit_time,
+ &kernel_time, &user_time)) {
+ start_time_ = creation_time;
+ }
+ crash_id_ = start_time_.dwLowDateTime;
+
+ dump_requested_handle_ = CreateEvent(NULL, // Security attributes.
+ TRUE, // Manual reset.
+ FALSE, // Initial state.
+ NULL); // Name.
+ if (!dump_requested_handle_) {
+ return false;
+ }
+
+ dump_generated_handle_ = CreateEvent(NULL, // Security attributes.
+ TRUE, // Manual reset.
+ FALSE, // Initial state.
+ NULL); // Name.
+ return dump_generated_handle_ != NULL;
+}
+
+void ClientInfo::UnregisterDumpRequestWaitAndBlockUntilNoPending() {
+ if (dump_request_wait_handle_) {
+ // Wait for callbacks that might already be running to finish.
+ UnregisterWaitEx(dump_request_wait_handle_, INVALID_HANDLE_VALUE);
+ dump_request_wait_handle_ = NULL;
+ }
+}
+
+void ClientInfo::UnregisterProcessExitWait(bool block_until_no_pending) {
+ if (process_exit_wait_handle_) {
+ if (block_until_no_pending) {
+ // Wait for the callback that might already be running to finish.
+ UnregisterWaitEx(process_exit_wait_handle_, INVALID_HANDLE_VALUE);
+ } else {
+ UnregisterWait(process_exit_wait_handle_);
+ }
+ process_exit_wait_handle_ = NULL;
+ }
+}
+
+ClientInfo::~ClientInfo() {
+ // Waiting for the callback to finish here is safe because ClientInfo's are
+ // never destroyed from the dump request handling callback.
+ UnregisterDumpRequestWaitAndBlockUntilNoPending();
+
+ // This is a little tricky because ClientInfo's may be destroyed by the same
+ // callback (OnClientEnd) and waiting for it to finish will cause a deadlock.
+ // Regardless of this complication, wait for any running callbacks to finish
+ // so that the common case is properly handled. In order to avoid deadlocks,
+ // the OnClientEnd callback must call UnregisterProcessExitWait(false)
+ // before deleting the ClientInfo.
+ UnregisterProcessExitWait(true);
+
+ if (process_handle_) {
+ CloseHandle(process_handle_);
+ }
+
+ if (dump_requested_handle_) {
+ CloseHandle(dump_requested_handle_);
+ }
+
+ if (dump_generated_handle_) {
+ CloseHandle(dump_generated_handle_);
+ }
+}
+
+bool ClientInfo::GetClientExceptionInfo(EXCEPTION_POINTERS** ex_info) const {
+ SIZE_T bytes_count = 0;
+ if (!ReadProcessMemory(process_handle_,
+ ex_info_,
+ ex_info,
+ sizeof(*ex_info),
+ &bytes_count)) {
+ return false;
+ }
+
+ return bytes_count == sizeof(*ex_info);
+}
+
+bool ClientInfo::GetClientThreadId(DWORD* thread_id) const {
+ SIZE_T bytes_count = 0;
+ if (!ReadProcessMemory(process_handle_,
+ thread_id_,
+ thread_id,
+ sizeof(*thread_id),
+ &bytes_count)) {
+ return false;
+ }
+
+ return bytes_count == sizeof(*thread_id);
+}
+
+void ClientInfo::SetProcessUptime() {
+ FILETIME now = {0};
+ GetSystemTimeAsFileTime(&now);
+
+ ULARGE_INTEGER time_start;
+ time_start.HighPart = start_time_.dwHighDateTime;
+ time_start.LowPart = start_time_.dwLowDateTime;
+
+ ULARGE_INTEGER time_now;
+ time_now.HighPart = now.dwHighDateTime;
+ time_now.LowPart = now.dwLowDateTime;
+
+ // Calculate the delay and convert it from 100-nanoseconds to milliseconds.
+ __int64 delay = (time_now.QuadPart - time_start.QuadPart) / 10 / 1000;
+
+ // Convert it to a string.
+ wchar_t* value = custom_info_entries_.get()[custom_client_info_.count].value;
+ _i64tow_s(delay, value, CustomInfoEntry::kValueMaxLength, 10);
+}
+
+bool ClientInfo::PopulateCustomInfo() {
+ if (custom_client_info_.count > kMaxCustomInfoEntries)
+ return false;
+
+ SIZE_T bytes_count = 0;
+ SIZE_T read_count = sizeof(CustomInfoEntry) * custom_client_info_.count;
+
+ // If the scoped array for custom info already has an array, it will be
+ // the same size as what we need. This is because the number of custom info
+ // entries is always the same. So allocate memory only if scoped array has
+ // a NULL pointer.
+ if (!custom_info_entries_.get()) {
+ // Allocate an extra entry for reporting uptime for the client process.
+ custom_info_entries_.reset(
+ new CustomInfoEntry[custom_client_info_.count + 1]);
+ // Use the last element in the array for uptime.
+ custom_info_entries_.get()[custom_client_info_.count].set_name(
+ kCustomInfoProcessUptimeName);
+ }
+
+ if (!ReadProcessMemory(process_handle_,
+ custom_client_info_.entries,
+ custom_info_entries_.get(),
+ read_count,
+ &bytes_count)) {
+ return false;
+ }
+
+ SetProcessUptime();
+ return (bytes_count == read_count);
+}
+
+CustomClientInfo ClientInfo::GetCustomInfo() const {
+ CustomClientInfo custom_info;
+ custom_info.entries = custom_info_entries_.get();
+ // Add 1 to the count from the client process to account for extra entry for
+ // process uptime.
+ custom_info.count = custom_client_info_.count + 1;
+ return custom_info;
+}
+
+} // namespace google_breakpad
diff --git a/3rdParty/Breakpad/src/client/windows/crash_generation/client_info.h b/3rdParty/Breakpad/src/client/windows/crash_generation/client_info.h
new file mode 100644
index 0000000..6a8fba3
--- /dev/null
+++ b/3rdParty/Breakpad/src/client/windows/crash_generation/client_info.h
@@ -0,0 +1,177 @@
+// Copyright (c) 2008, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#ifndef CLIENT_WINDOWS_CRASH_GENERATION_CLIENT_INFO_H__
+#define CLIENT_WINDOWS_CRASH_GENERATION_CLIENT_INFO_H__
+
+#include <windows.h>
+#include <dbghelp.h>
+#include "client/windows/common/ipc_protocol.h"
+#include "common/scoped_ptr.h"
+#include "google_breakpad/common/minidump_format.h"
+
+namespace google_breakpad {
+
+class CrashGenerationServer;
+
+// Abstraction for a crash client process.
+class ClientInfo {
+ public:
+ // Creates an instance with the given values. Gets the process
+ // handle for the given process id and creates necessary event
+ // objects.
+ ClientInfo(CrashGenerationServer* crash_server,
+ DWORD pid,
+ MINIDUMP_TYPE dump_type,
+ DWORD* thread_id,
+ EXCEPTION_POINTERS** ex_info,
+ MDRawAssertionInfo* assert_info,
+ const CustomClientInfo& custom_client_info);
+
+ ~ClientInfo();
+
+ CrashGenerationServer* crash_server() const { return crash_server_; }
+ DWORD pid() const { return pid_; }
+ MINIDUMP_TYPE dump_type() const { return dump_type_; }
+ EXCEPTION_POINTERS** ex_info() const { return ex_info_; }
+ MDRawAssertionInfo* assert_info() const { return assert_info_; }
+ DWORD* thread_id() const { return thread_id_; }
+ HANDLE process_handle() const { return process_handle_; }
+ HANDLE dump_requested_handle() const { return dump_requested_handle_; }
+ HANDLE dump_generated_handle() const { return dump_generated_handle_; }
+ DWORD crash_id() const { return crash_id_; }
+ const CustomClientInfo& custom_client_info() const {
+ return custom_client_info_;
+ }
+
+ void set_dump_request_wait_handle(HANDLE value) {
+ dump_request_wait_handle_ = value;
+ }
+
+ void set_process_exit_wait_handle(HANDLE value) {
+ process_exit_wait_handle_ = value;
+ }
+
+ // Unregister the dump request wait operation and wait for all callbacks
+ // that might already be running to complete before returning.
+ void UnregisterDumpRequestWaitAndBlockUntilNoPending();
+
+ // Unregister the process exit wait operation. If block_until_no_pending is
+ // true, wait for all callbacks that might already be running to complete
+ // before returning.
+ void UnregisterProcessExitWait(bool block_until_no_pending);
+
+ bool Initialize();
+ bool GetClientExceptionInfo(EXCEPTION_POINTERS** ex_info) const;
+ bool GetClientThreadId(DWORD* thread_id) const;
+
+ // Reads the custom information from the client process address space.
+ bool PopulateCustomInfo();
+
+ // Returns the client custom information.
+ CustomClientInfo GetCustomInfo() const;
+
+ private:
+ // Calcualtes the uptime for the client process, converts it to a string and
+ // stores it in the last entry of client custom info.
+ void SetProcessUptime();
+
+ // Crash generation server.
+ CrashGenerationServer* crash_server_;
+
+ // Client process ID.
+ DWORD pid_;
+
+ // Dump type requested by the client.
+ MINIDUMP_TYPE dump_type_;
+
+ // Address of an EXCEPTION_POINTERS* variable in the client
+ // process address space that will point to an instance of
+ // EXCEPTION_POINTERS containing information about crash.
+ //
+ // WARNING: Do not dereference these pointers as they are pointers
+ // in the address space of another process.
+ EXCEPTION_POINTERS** ex_info_;
+
+ // Address of an instance of MDRawAssertionInfo in the client
+ // process address space that will contain information about
+ // non-exception related crashes like invalid parameter assertion
+ // failures and pure calls.
+ //
+ // WARNING: Do not dereference these pointers as they are pointers
+ // in the address space of another process.
+ MDRawAssertionInfo* assert_info_;
+
+ // Custom information about the client.
+ CustomClientInfo custom_client_info_;
+
+ // Contains the custom client info entries read from the client process
+ // memory. This will be populated only if the method GetClientCustomInfo
+ // is called.
+ scoped_array<CustomInfoEntry> custom_info_entries_;
+
+ // Address of a variable in the client process address space that
+ // will contain the thread id of the crashing client thread.
+ //
+ // WARNING: Do not dereference these pointers as they are pointers
+ // in the address space of another process.
+ DWORD* thread_id_;
+
+ // Client process handle.
+ HANDLE process_handle_;
+
+ // Dump request event handle.
+ HANDLE dump_requested_handle_;
+
+ // Dump generated event handle.
+ HANDLE dump_generated_handle_;
+
+ // Wait handle for dump request event.
+ HANDLE dump_request_wait_handle_;
+
+ // Wait handle for process exit event.
+ HANDLE process_exit_wait_handle_;
+
+ // Time when the client process started. It is used to determine the uptime
+ // for the client process when it signals a crash.
+ FILETIME start_time_;
+
+ // The crash id which can be used to request an upload. This will be the
+ // value of the low order dword of the process creation time for the process
+ // being dumped.
+ DWORD crash_id_;
+
+ // Disallow copy ctor and operator=.
+ ClientInfo(const ClientInfo& client_info);
+ ClientInfo& operator=(const ClientInfo& client_info);
+};
+
+} // namespace google_breakpad
+
+#endif // CLIENT_WINDOWS_CRASH_GENERATION_CLIENT_INFO_H__
diff --git a/3rdParty/Breakpad/src/client/windows/crash_generation/crash_generation_client.cc b/3rdParty/Breakpad/src/client/windows/crash_generation/crash_generation_client.cc
index b0d3d04..3ba5d4e 100644
--- a/3rdParty/Breakpad/src/client/windows/crash_generation/crash_generation_client.cc
+++ b/3rdParty/Breakpad/src/client/windows/crash_generation/crash_generation_client.cc
@@ -96,14 +96,14 @@ CrashGenerationClient::CrashGenerationClient(
const CustomClientInfo* custom_info)
: pipe_name_(pipe_name),
pipe_handle_(NULL),
+ custom_info_(),
dump_type_(dump_type),
- thread_id_(0),
- server_process_id_(0),
crash_event_(NULL),
crash_generated_(NULL),
server_alive_(NULL),
- exception_pointers_(NULL),
- custom_info_() {
+ server_process_id_(0),
+ thread_id_(0),
+ exception_pointers_(NULL) {
memset(&assert_info_, 0, sizeof(assert_info_));
if (custom_info) {
custom_info_ = *custom_info;
@@ -116,14 +116,14 @@ CrashGenerationClient::CrashGenerationClient(
const CustomClientInfo* custom_info)
: pipe_name_(),
pipe_handle_(pipe_handle),
+ custom_info_(),
dump_type_(dump_type),
- thread_id_(0),
- server_process_id_(0),
crash_event_(NULL),
crash_generated_(NULL),
server_alive_(NULL),
- exception_pointers_(NULL),
- custom_info_() {
+ server_process_id_(0),
+ thread_id_(0),
+ exception_pointers_(NULL) {
memset(&assert_info_, 0, sizeof(assert_info_));
if (custom_info) {
custom_info_ = *custom_info;
@@ -178,6 +178,10 @@ CrashGenerationClient::~CrashGenerationClient() {
//
// Returns true if the registration is successful; false otherwise.
bool CrashGenerationClient::Register() {
+ if (IsRegistered()) {
+ return true;
+ }
+
HANDLE pipe = ConnectToServer();
if (!pipe) {
return false;
diff --git a/3rdParty/Breakpad/src/client/windows/crash_generation/crash_generation_client.h b/3rdParty/Breakpad/src/client/windows/crash_generation/crash_generation_client.h
index 2ce14dd..457f731 100644
--- a/3rdParty/Breakpad/src/client/windows/crash_generation/crash_generation_client.h
+++ b/3rdParty/Breakpad/src/client/windows/crash_generation/crash_generation_client.h
@@ -35,7 +35,7 @@
#include <string>
#include <utility>
#include "client/windows/common/ipc_protocol.h"
-#include "processor/scoped_ptr.h"
+#include "common/scoped_ptr.h"
namespace google_breakpad {
diff --git a/3rdParty/Breakpad/src/client/windows/crash_generation/crash_generation_server.cc b/3rdParty/Breakpad/src/client/windows/crash_generation/crash_generation_server.cc
new file mode 100644
index 0000000..0af213b
--- /dev/null
+++ b/3rdParty/Breakpad/src/client/windows/crash_generation/crash_generation_server.cc
@@ -0,0 +1,943 @@
+// Copyright (c) 2008, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#include "client/windows/crash_generation/crash_generation_server.h"
+#include <windows.h>
+#include <cassert>
+#include <list>
+#include "client/windows/common/auto_critical_section.h"
+#include "common/scoped_ptr.h"
+
+#include "client/windows/crash_generation/client_info.h"
+
+namespace google_breakpad {
+
+// Output buffer size.
+static const size_t kOutBufferSize = 64;
+
+// Input buffer size.
+static const size_t kInBufferSize = 64;
+
+// Access flags for the client on the dump request event.
+static const DWORD kDumpRequestEventAccess = EVENT_MODIFY_STATE;
+
+// Access flags for the client on the dump generated event.
+static const DWORD kDumpGeneratedEventAccess = EVENT_MODIFY_STATE |
+ SYNCHRONIZE;
+
+// Access flags for the client on the mutex.
+static const DWORD kMutexAccess = SYNCHRONIZE;
+
+// Attribute flags for the pipe.
+static const DWORD kPipeAttr = FILE_FLAG_FIRST_PIPE_INSTANCE |
+ PIPE_ACCESS_DUPLEX |
+ FILE_FLAG_OVERLAPPED;
+
+// Mode for the pipe.
+static const DWORD kPipeMode = PIPE_TYPE_MESSAGE |
+ PIPE_READMODE_MESSAGE |
+ PIPE_WAIT;
+
+// For pipe I/O, execute the callback in the wait thread itself,
+// since the callback does very little work. The callback executes
+// the code for one of the states of the server state machine and
+// the code for all of the states perform async I/O and hence
+// finish very quickly.
+static const ULONG kPipeIOThreadFlags = WT_EXECUTEINWAITTHREAD;
+
+// Dump request threads will, most likely, generate dumps. That may
+// take some time to finish, so specify WT_EXECUTELONGFUNCTION flag.
+static const ULONG kDumpRequestThreadFlags = WT_EXECUTEINWAITTHREAD |
+ WT_EXECUTELONGFUNCTION;
+
+static bool IsClientRequestValid(const ProtocolMessage& msg) {
+ return msg.tag == MESSAGE_TAG_UPLOAD_REQUEST ||
+ (msg.tag == MESSAGE_TAG_REGISTRATION_REQUEST &&
+ msg.id != 0 &&
+ msg.thread_id != NULL &&
+ msg.exception_pointers != NULL &&
+ msg.assert_info != NULL);
+}
+
+#ifndef NDEBUG
+static bool CheckForIOIncomplete(bool success) {
+ // We should never get an I/O incomplete since we should not execute this
+ // unless the operation has finished and the overlapped event is signaled. If
+ // we do get INCOMPLETE, we have a bug in our code.
+ return success ? false : (GetLastError() == ERROR_IO_INCOMPLETE);
+}
+#endif
+
+CrashGenerationServer::CrashGenerationServer(
+ const std::wstring& pipe_name,
+ SECURITY_ATTRIBUTES* pipe_sec_attrs,
+ OnClientConnectedCallback connect_callback,
+ void* connect_context,
+ OnClientDumpRequestCallback dump_callback,
+ void* dump_context,
+ OnClientExitedCallback exit_callback,
+ void* exit_context,
+ OnClientUploadRequestCallback upload_request_callback,
+ void* upload_context,
+ bool generate_dumps,
+ const std::wstring* dump_path)
+ : pipe_name_(pipe_name),
+ pipe_sec_attrs_(pipe_sec_attrs),
+ pipe_(NULL),
+ pipe_wait_handle_(NULL),
+ server_alive_handle_(NULL),
+ connect_callback_(connect_callback),
+ connect_context_(connect_context),
+ dump_callback_(dump_callback),
+ dump_context_(dump_context),
+ exit_callback_(exit_callback),
+ exit_context_(exit_context),
+ upload_request_callback_(upload_request_callback),
+ upload_context_(upload_context),
+ generate_dumps_(generate_dumps),
+ pre_fetch_custom_info_(true),
+ dump_path_(dump_path ? *dump_path : L""),
+ server_state_(IPC_SERVER_STATE_UNINITIALIZED),
+ shutting_down_(false),
+ overlapped_(),
+ client_info_(NULL) {
+ InitializeCriticalSection(&sync_);
+}
+
+// This should never be called from the OnPipeConnected callback.
+// Otherwise the UnregisterWaitEx call below will cause a deadlock.
+CrashGenerationServer::~CrashGenerationServer() {
+ // New scope to release the lock automatically.
+ {
+ // Make sure no clients are added or removed beyond this point.
+ // Before adding or removing any clients, the critical section
+ // must be entered and the shutting_down_ flag checked. The
+ // critical section is then exited only after the clients_ list
+ // modifications are done and the list is in a consistent state.
+ AutoCriticalSection lock(&sync_);
+
+ // Indicate to existing threads that server is shutting down.
+ shutting_down_ = true;
+ }
+ // No one will modify the clients_ list beyond this point -
+ // not even from another thread.
+
+ // Even if there are no current worker threads running, it is possible that
+ // an I/O request is pending on the pipe right now but not yet done.
+ // In fact, it's very likely this is the case unless we are in an ERROR
+ // state. If we don't wait for the pending I/O to be done, then when the I/O
+ // completes, it may write to invalid memory. AppVerifier will flag this
+ // problem too. So we disconnect from the pipe and then wait for the server
+ // to get into error state so that the pending I/O will fail and get
+ // cleared.
+ DisconnectNamedPipe(pipe_);
+ int num_tries = 100;
+ while (num_tries-- && server_state_ != IPC_SERVER_STATE_ERROR) {
+ Sleep(10);
+ }
+
+ // Unregister wait on the pipe.
+ if (pipe_wait_handle_) {
+ // Wait for already executing callbacks to finish.
+ UnregisterWaitEx(pipe_wait_handle_, INVALID_HANDLE_VALUE);
+ }
+
+ // Close the pipe to avoid further client connections.
+ if (pipe_) {
+ CloseHandle(pipe_);
+ }
+
+ // Request all ClientInfo objects to unregister all waits.
+ // No need to enter the critical section because no one is allowed to modify
+ // the clients_ list once the shutting_down_ flag is set.
+ std::list<ClientInfo*>::iterator iter;
+ for (iter = clients_.begin(); iter != clients_.end(); ++iter) {
+ ClientInfo* client_info = *iter;
+ // Unregister waits. Wait for already executing callbacks to finish.
+ // Unregister the client process exit wait first and only then unregister
+ // the dump request wait. The reason is that the OnClientExit callback
+ // also unregisters the dump request wait and such a race (doing the same
+ // unregistration from two threads) is undesirable.
+ client_info->UnregisterProcessExitWait(true);
+ client_info->UnregisterDumpRequestWaitAndBlockUntilNoPending();
+
+ // Destroying the ClientInfo here is safe because all wait operations for
+ // this ClientInfo were unregistered and no pending or running callbacks
+ // for this ClientInfo can possible exist (block_until_no_pending option
+ // was used).
+ delete client_info;
+ }
+
+ if (server_alive_handle_) {
+ // Release the mutex before closing the handle so that clients requesting
+ // dumps wait for a long time for the server to generate a dump.
+ ReleaseMutex(server_alive_handle_);
+ CloseHandle(server_alive_handle_);
+ }
+
+ if (overlapped_.hEvent) {
+ CloseHandle(overlapped_.hEvent);
+ }
+
+ DeleteCriticalSection(&sync_);
+}
+
+bool CrashGenerationServer::Start() {
+ if (server_state_ != IPC_SERVER_STATE_UNINITIALIZED) {
+ return false;
+ }
+
+ server_state_ = IPC_SERVER_STATE_INITIAL;
+
+ server_alive_handle_ = CreateMutex(NULL, TRUE, NULL);
+ if (!server_alive_handle_) {
+ return false;
+ }
+
+ // Event to signal the client connection and pipe reads and writes.
+ overlapped_.hEvent = CreateEvent(NULL, // Security descriptor.
+ TRUE, // Manual reset.
+ FALSE, // Initially nonsignaled.
+ NULL); // Name.
+ if (!overlapped_.hEvent) {
+ return false;
+ }
+
+ // Register a callback with the thread pool for the client connection.
+ if (!RegisterWaitForSingleObject(&pipe_wait_handle_,
+ overlapped_.hEvent,
+ OnPipeConnected,
+ this,
+ INFINITE,
+ kPipeIOThreadFlags)) {
+ return false;
+ }
+
+ pipe_ = CreateNamedPipe(pipe_name_.c_str(),
+ kPipeAttr,
+ kPipeMode,
+ 1,
+ kOutBufferSize,
+ kInBufferSize,
+ 0,
+ pipe_sec_attrs_);
+ if (pipe_ == INVALID_HANDLE_VALUE) {
+ return false;
+ }
+
+ // Kick-start the state machine. This will initiate an asynchronous wait
+ // for client connections.
+ if (!SetEvent(overlapped_.hEvent)) {
+ server_state_ = IPC_SERVER_STATE_ERROR;
+ return false;
+ }
+
+ // If we are in error state, it's because we failed to start listening.
+ return true;
+}
+
+// If the server thread serving clients ever gets into the
+// ERROR state, reset the event, close the pipe and remain
+// in the error state forever. Error state means something
+// that we didn't account for has happened, and it's dangerous
+// to do anything unknowingly.
+void CrashGenerationServer::HandleErrorState() {
+ assert(server_state_ == IPC_SERVER_STATE_ERROR);
+
+ // If the server is shutting down anyway, don't clean up
+ // here since shut down process will clean up.
+ if (shutting_down_) {
+ return;
+ }
+
+ if (pipe_wait_handle_) {
+ UnregisterWait(pipe_wait_handle_);
+ pipe_wait_handle_ = NULL;
+ }
+
+ if (pipe_) {
+ CloseHandle(pipe_);
+ pipe_ = NULL;
+ }
+
+ if (overlapped_.hEvent) {
+ CloseHandle(overlapped_.hEvent);
+ overlapped_.hEvent = NULL;
+ }
+}
+
+// When the server thread serving clients is in the INITIAL state,
+// try to connect to the pipe asynchronously. If the connection
+// finishes synchronously, directly go into the CONNECTED state;
+// otherwise go into the CONNECTING state. For any problems, go
+// into the ERROR state.
+void CrashGenerationServer::HandleInitialState() {
+ assert(server_state_ == IPC_SERVER_STATE_INITIAL);
+
+ if (!ResetEvent(overlapped_.hEvent)) {
+ EnterErrorState();
+ return;
+ }
+
+ bool success = ConnectNamedPipe(pipe_, &overlapped_) != FALSE;
+ DWORD error_code = success ? ERROR_SUCCESS : GetLastError();
+
+ // From MSDN, it is not clear that when ConnectNamedPipe is used
+ // in an overlapped mode, will it ever return non-zero value, and
+ // if so, in what cases.
+ assert(!success);
+
+ switch (error_code) {
+ case ERROR_IO_PENDING:
+ EnterStateWhenSignaled(IPC_SERVER_STATE_CONNECTING);
+ break;
+
+ case ERROR_PIPE_CONNECTED:
+ EnterStateImmediately(IPC_SERVER_STATE_CONNECTED);
+ break;
+
+ default:
+ EnterErrorState();
+ break;
+ }
+}
+
+// When the server thread serving the clients is in the CONNECTING state,
+// try to get the result of the asynchronous connection request using
+// the OVERLAPPED object. If the result indicates the connection is done,
+// go into the CONNECTED state. If the result indicates I/O is still
+// INCOMPLETE, remain in the CONNECTING state. For any problems,
+// go into the DISCONNECTING state.
+void CrashGenerationServer::HandleConnectingState() {
+ assert(server_state_ == IPC_SERVER_STATE_CONNECTING);
+
+ DWORD bytes_count = 0;
+ bool success = GetOverlappedResult(pipe_,
+ &overlapped_,
+ &bytes_count,
+ FALSE) != FALSE;
+ DWORD error_code = success ? ERROR_SUCCESS : GetLastError();
+
+ if (success) {
+ EnterStateImmediately(IPC_SERVER_STATE_CONNECTED);
+ } else if (error_code != ERROR_IO_INCOMPLETE) {
+ EnterStateImmediately(IPC_SERVER_STATE_DISCONNECTING);
+ } else {
+ // remain in CONNECTING state
+ }
+}
+
+// When the server thread serving the clients is in the CONNECTED state,
+// try to issue an asynchronous read from the pipe. If read completes
+// synchronously or if I/O is pending then go into the READING state.
+// For any problems, go into the DISCONNECTING state.
+void CrashGenerationServer::HandleConnectedState() {
+ assert(server_state_ == IPC_SERVER_STATE_CONNECTED);
+
+ DWORD bytes_count = 0;
+ memset(&msg_, 0, sizeof(msg_));
+ bool success = ReadFile(pipe_,
+ &msg_,
+ sizeof(msg_),
+ &bytes_count,
+ &overlapped_) != FALSE;
+ DWORD error_code = success ? ERROR_SUCCESS : GetLastError();
+
+ // Note that the asynchronous read issued above can finish before the
+ // code below executes. But, it is okay to change state after issuing
+ // the asynchronous read. This is because even if the asynchronous read
+ // is done, the callback for it would not be executed until the current
+ // thread finishes its execution.
+ if (success || error_code == ERROR_IO_PENDING) {
+ EnterStateWhenSignaled(IPC_SERVER_STATE_READING);
+ } else {
+ EnterStateImmediately(IPC_SERVER_STATE_DISCONNECTING);
+ }
+}
+
+// When the server thread serving the clients is in the READING state,
+// try to get the result of the async read. If async read is done,
+// go into the READ_DONE state. For any problems, go into the
+// DISCONNECTING state.
+void CrashGenerationServer::HandleReadingState() {
+ assert(server_state_ == IPC_SERVER_STATE_READING);
+
+ DWORD bytes_count = 0;
+ bool success = GetOverlappedResult(pipe_,
+ &overlapped_,
+ &bytes_count,
+ FALSE) != FALSE;
+ if (success && bytes_count == sizeof(ProtocolMessage)) {
+ EnterStateImmediately(IPC_SERVER_STATE_READ_DONE);
+ return;
+ }
+
+ assert(!CheckForIOIncomplete(success));
+ EnterStateImmediately(IPC_SERVER_STATE_DISCONNECTING);
+}
+
+// When the server thread serving the client is in the READ_DONE state,
+// validate the client's request message, register the client by
+// creating appropriate objects and prepare the response. Then try to
+// write the response to the pipe asynchronously. If that succeeds,
+// go into the WRITING state. For any problems, go into the DISCONNECTING
+// state.
+void CrashGenerationServer::HandleReadDoneState() {
+ assert(server_state_ == IPC_SERVER_STATE_READ_DONE);
+
+ if (!IsClientRequestValid(msg_)) {
+ EnterStateImmediately(IPC_SERVER_STATE_DISCONNECTING);
+ return;
+ }
+
+ if (msg_.tag == MESSAGE_TAG_UPLOAD_REQUEST) {
+ if (upload_request_callback_)
+ upload_request_callback_(upload_context_, msg_.id);
+ EnterStateImmediately(IPC_SERVER_STATE_DISCONNECTING);
+ return;
+ }
+
+ scoped_ptr<ClientInfo> client_info(
+ new ClientInfo(this,
+ msg_.id,
+ msg_.dump_type,
+ msg_.thread_id,
+ msg_.exception_pointers,
+ msg_.assert_info,
+ msg_.custom_client_info));
+
+ if (!client_info->Initialize()) {
+ EnterStateImmediately(IPC_SERVER_STATE_DISCONNECTING);
+ return;
+ }
+
+ // Issues an asynchronous WriteFile call if successful.
+ // Iff successful, assigns ownership of the client_info pointer to the server
+ // instance, in which case we must be sure not to free it in this function.
+ if (!RespondToClient(client_info.get())) {
+ EnterStateImmediately(IPC_SERVER_STATE_DISCONNECTING);
+ return;
+ }
+
+ // This is only valid as long as it can be found in the clients_ list
+ client_info_ = client_info.release();
+
+ // Note that the asynchronous write issued by RespondToClient function
+ // can finish before the code below executes. But it is okay to change
+ // state after issuing the asynchronous write. This is because even if
+ // the asynchronous write is done, the callback for it would not be
+ // executed until the current thread finishes its execution.
+ EnterStateWhenSignaled(IPC_SERVER_STATE_WRITING);
+}
+
+// When the server thread serving the clients is in the WRITING state,
+// try to get the result of the async write. If the async write is done,
+// go into the WRITE_DONE state. For any problems, go into the
+// DISONNECTING state.
+void CrashGenerationServer::HandleWritingState() {
+ assert(server_state_ == IPC_SERVER_STATE_WRITING);
+
+ DWORD bytes_count = 0;
+ bool success = GetOverlappedResult(pipe_,
+ &overlapped_,
+ &bytes_count,
+ FALSE) != FALSE;
+ if (success) {
+ EnterStateImmediately(IPC_SERVER_STATE_WRITE_DONE);
+ return;
+ }
+
+ assert(!CheckForIOIncomplete(success));
+ EnterStateImmediately(IPC_SERVER_STATE_DISCONNECTING);
+}
+
+// When the server thread serving the clients is in the WRITE_DONE state,
+// try to issue an async read on the pipe. If the read completes synchronously
+// or if I/O is still pending then go into the READING_ACK state. For any
+// issues, go into the DISCONNECTING state.
+void CrashGenerationServer::HandleWriteDoneState() {
+ assert(server_state_ == IPC_SERVER_STATE_WRITE_DONE);
+
+ DWORD bytes_count = 0;
+ bool success = ReadFile(pipe_,
+ &msg_,
+ sizeof(msg_),
+ &bytes_count,
+ &overlapped_) != FALSE;
+ DWORD error_code = success ? ERROR_SUCCESS : GetLastError();
+
+ if (success) {
+ EnterStateImmediately(IPC_SERVER_STATE_READING_ACK);
+ } else if (error_code == ERROR_IO_PENDING) {
+ EnterStateWhenSignaled(IPC_SERVER_STATE_READING_ACK);
+ } else {
+ EnterStateImmediately(IPC_SERVER_STATE_DISCONNECTING);
+ }
+}
+
+// When the server thread serving the clients is in the READING_ACK state,
+// try to get result of async read. Go into the DISCONNECTING state.
+void CrashGenerationServer::HandleReadingAckState() {
+ assert(server_state_ == IPC_SERVER_STATE_READING_ACK);
+
+ DWORD bytes_count = 0;
+ bool success = GetOverlappedResult(pipe_,
+ &overlapped_,
+ &bytes_count,
+ FALSE) != FALSE;
+ if (success) {
+ // The connection handshake with the client is now complete; perform
+ // the callback.
+ if (connect_callback_) {
+ // Note that there is only a single copy of the ClientInfo of the
+ // currently connected client. However it is being referenced from
+ // two different places:
+ // - the client_info_ member
+ // - the clients_ list
+ // The lifetime of this ClientInfo depends on the lifetime of the
+ // client process - basically it can go away at any time.
+ // However, as long as it is referenced by the clients_ list it
+ // is guaranteed to be valid. Enter the critical section and check
+ // to see whether the client_info_ can be found in the list.
+ // If found, execute the callback and only then leave the critical
+ // section.
+ AutoCriticalSection lock(&sync_);
+
+ bool client_is_still_alive = false;
+ std::list<ClientInfo*>::iterator iter;
+ for (iter = clients_.begin(); iter != clients_.end(); ++iter) {
+ if (client_info_ == *iter) {
+ client_is_still_alive = true;
+ break;
+ }
+ }
+
+ if (client_is_still_alive) {
+ connect_callback_(connect_context_, client_info_);
+ }
+ }
+ } else {
+ assert(!CheckForIOIncomplete(success));
+ }
+
+ EnterStateImmediately(IPC_SERVER_STATE_DISCONNECTING);
+}
+
+// When the server thread serving the client is in the DISCONNECTING state,
+// disconnect from the pipe and reset the event. If anything fails, go into
+// the ERROR state. If it goes well, go into the INITIAL state and set the
+// event to start all over again.
+void CrashGenerationServer::HandleDisconnectingState() {
+ assert(server_state_ == IPC_SERVER_STATE_DISCONNECTING);
+
+ // Done serving the client.
+ client_info_ = NULL;
+
+ overlapped_.Internal = NULL;
+ overlapped_.InternalHigh = NULL;
+ overlapped_.Offset = 0;
+ overlapped_.OffsetHigh = 0;
+ overlapped_.Pointer = NULL;
+
+ if (!ResetEvent(overlapped_.hEvent)) {
+ EnterErrorState();
+ return;
+ }
+
+ if (!DisconnectNamedPipe(pipe_)) {
+ EnterErrorState();
+ return;
+ }
+
+ // If the server is shutting down do not connect to the
+ // next client.
+ if (shutting_down_) {
+ return;
+ }
+
+ EnterStateImmediately(IPC_SERVER_STATE_INITIAL);
+}
+
+void CrashGenerationServer::EnterErrorState() {
+ SetEvent(overlapped_.hEvent);
+ server_state_ = IPC_SERVER_STATE_ERROR;
+}
+
+void CrashGenerationServer::EnterStateWhenSignaled(IPCServerState state) {
+ server_state_ = state;
+}
+
+void CrashGenerationServer::EnterStateImmediately(IPCServerState state) {
+ server_state_ = state;
+
+ if (!SetEvent(overlapped_.hEvent)) {
+ server_state_ = IPC_SERVER_STATE_ERROR;
+ }
+}
+
+bool CrashGenerationServer::PrepareReply(const ClientInfo& client_info,
+ ProtocolMessage* reply) const {
+ reply->tag = MESSAGE_TAG_REGISTRATION_RESPONSE;
+ reply->id = GetCurrentProcessId();
+
+ if (CreateClientHandles(client_info, reply)) {
+ return true;
+ }
+
+ // Closing of remote handles (belonging to a different process) can
+ // only be done through DuplicateHandle.
+ if (reply->dump_request_handle) {
+ DuplicateHandle(client_info.process_handle(), // hSourceProcessHandle
+ reply->dump_request_handle, // hSourceHandle
+ NULL, // hTargetProcessHandle
+ 0, // lpTargetHandle
+ 0, // dwDesiredAccess
+ FALSE, // bInheritHandle
+ DUPLICATE_CLOSE_SOURCE); // dwOptions
+ reply->dump_request_handle = NULL;
+ }
+
+ if (reply->dump_generated_handle) {
+ DuplicateHandle(client_info.process_handle(), // hSourceProcessHandle
+ reply->dump_generated_handle, // hSourceHandle
+ NULL, // hTargetProcessHandle
+ 0, // lpTargetHandle
+ 0, // dwDesiredAccess
+ FALSE, // bInheritHandle
+ DUPLICATE_CLOSE_SOURCE); // dwOptions
+ reply->dump_generated_handle = NULL;
+ }
+
+ if (reply->server_alive_handle) {
+ DuplicateHandle(client_info.process_handle(), // hSourceProcessHandle
+ reply->server_alive_handle, // hSourceHandle
+ NULL, // hTargetProcessHandle
+ 0, // lpTargetHandle
+ 0, // dwDesiredAccess
+ FALSE, // bInheritHandle
+ DUPLICATE_CLOSE_SOURCE); // dwOptions
+ reply->server_alive_handle = NULL;
+ }
+
+ return false;
+}
+
+bool CrashGenerationServer::CreateClientHandles(const ClientInfo& client_info,
+ ProtocolMessage* reply) const {
+ HANDLE current_process = GetCurrentProcess();
+ if (!DuplicateHandle(current_process,
+ client_info.dump_requested_handle(),
+ client_info.process_handle(),
+ &reply->dump_request_handle,
+ kDumpRequestEventAccess,
+ FALSE,
+ 0)) {
+ return false;
+ }
+
+ if (!DuplicateHandle(current_process,
+ client_info.dump_generated_handle(),
+ client_info.process_handle(),
+ &reply->dump_generated_handle,
+ kDumpGeneratedEventAccess,
+ FALSE,
+ 0)) {
+ return false;
+ }
+
+ if (!DuplicateHandle(current_process,
+ server_alive_handle_,
+ client_info.process_handle(),
+ &reply->server_alive_handle,
+ kMutexAccess,
+ FALSE,
+ 0)) {
+ return false;
+ }
+
+ return true;
+}
+
+bool CrashGenerationServer::RespondToClient(ClientInfo* client_info) {
+ ProtocolMessage reply;
+ if (!PrepareReply(*client_info, &reply)) {
+ return false;
+ }
+
+ DWORD bytes_count = 0;
+ bool success = WriteFile(pipe_,
+ &reply,
+ sizeof(reply),
+ &bytes_count,
+ &overlapped_) != FALSE;
+ DWORD error_code = success ? ERROR_SUCCESS : GetLastError();
+
+ if (!success && error_code != ERROR_IO_PENDING) {
+ return false;
+ }
+
+ // Takes over ownership of client_info. We MUST return true if AddClient
+ // succeeds.
+ return AddClient(client_info);
+}
+
+// The server thread servicing the clients runs this method. The method
+// implements the state machine described in ReadMe.txt along with the
+// helper methods HandleXXXState.
+void CrashGenerationServer::HandleConnectionRequest() {
+ // If the server is shutting down, get into ERROR state, reset the event so
+ // more workers don't run and return immediately.
+ if (shutting_down_) {
+ server_state_ = IPC_SERVER_STATE_ERROR;
+ ResetEvent(overlapped_.hEvent);
+ return;
+ }
+
+ switch (server_state_) {
+ case IPC_SERVER_STATE_ERROR:
+ HandleErrorState();
+ break;
+
+ case IPC_SERVER_STATE_INITIAL:
+ HandleInitialState();
+ break;
+
+ case IPC_SERVER_STATE_CONNECTING:
+ HandleConnectingState();
+ break;
+
+ case IPC_SERVER_STATE_CONNECTED:
+ HandleConnectedState();
+ break;
+
+ case IPC_SERVER_STATE_READING:
+ HandleReadingState();
+ break;
+
+ case IPC_SERVER_STATE_READ_DONE:
+ HandleReadDoneState();
+ break;
+
+ case IPC_SERVER_STATE_WRITING:
+ HandleWritingState();
+ break;
+
+ case IPC_SERVER_STATE_WRITE_DONE:
+ HandleWriteDoneState();
+ break;
+
+ case IPC_SERVER_STATE_READING_ACK:
+ HandleReadingAckState();
+ break;
+
+ case IPC_SERVER_STATE_DISCONNECTING:
+ HandleDisconnectingState();
+ break;
+
+ default:
+ assert(false);
+ // This indicates that we added one more state without
+ // adding handling code.
+ server_state_ = IPC_SERVER_STATE_ERROR;
+ break;
+ }
+}
+
+bool CrashGenerationServer::AddClient(ClientInfo* client_info) {
+ HANDLE request_wait_handle = NULL;
+ if (!RegisterWaitForSingleObject(&request_wait_handle,
+ client_info->dump_requested_handle(),
+ OnDumpRequest,
+ client_info,
+ INFINITE,
+ kDumpRequestThreadFlags)) {
+ return false;
+ }
+
+ client_info->set_dump_request_wait_handle(request_wait_handle);
+
+ // OnClientEnd will be called when the client process terminates.
+ HANDLE process_wait_handle = NULL;
+ if (!RegisterWaitForSingleObject(&process_wait_handle,
+ client_info->process_handle(),
+ OnClientEnd,
+ client_info,
+ INFINITE,
+ WT_EXECUTEONLYONCE)) {
+ return false;
+ }
+
+ client_info->set_process_exit_wait_handle(process_wait_handle);
+
+ // New scope to hold the lock for the shortest time.
+ {
+ AutoCriticalSection lock(&sync_);
+ if (shutting_down_) {
+ // If server is shutting down, don't add new clients
+ return false;
+ }
+ clients_.push_back(client_info);
+ }
+
+ return true;
+}
+
+// static
+void CALLBACK CrashGenerationServer::OnPipeConnected(void* context, BOOLEAN) {
+ assert(context);
+
+ CrashGenerationServer* obj =
+ reinterpret_cast<CrashGenerationServer*>(context);
+ obj->HandleConnectionRequest();
+}
+
+// static
+void CALLBACK CrashGenerationServer::OnDumpRequest(void* context, BOOLEAN) {
+ assert(context);
+ ClientInfo* client_info = reinterpret_cast<ClientInfo*>(context);
+
+ CrashGenerationServer* crash_server = client_info->crash_server();
+ assert(crash_server);
+ if (crash_server->pre_fetch_custom_info_) {
+ client_info->PopulateCustomInfo();
+ }
+ crash_server->HandleDumpRequest(*client_info);
+
+ ResetEvent(client_info->dump_requested_handle());
+}
+
+// static
+void CALLBACK CrashGenerationServer::OnClientEnd(void* context, BOOLEAN) {
+ assert(context);
+ ClientInfo* client_info = reinterpret_cast<ClientInfo*>(context);
+
+ CrashGenerationServer* crash_server = client_info->crash_server();
+ assert(crash_server);
+
+ crash_server->HandleClientProcessExit(client_info);
+}
+
+void CrashGenerationServer::HandleClientProcessExit(ClientInfo* client_info) {
+ assert(client_info);
+
+ // Must unregister the dump request wait operation and wait for any
+ // dump requests that might be pending to finish before proceeding
+ // with the client_info cleanup.
+ client_info->UnregisterDumpRequestWaitAndBlockUntilNoPending();
+
+ if (exit_callback_) {
+ exit_callback_(exit_context_, client_info);
+ }
+
+ // Start a new scope to release lock automatically.
+ {
+ AutoCriticalSection lock(&sync_);
+ if (shutting_down_) {
+ // The crash generation server is shutting down and as part of the
+ // shutdown process it will delete all clients from the clients_ list.
+ return;
+ }
+ clients_.remove(client_info);
+ }
+
+ // Explicitly unregister the process exit wait using the non-blocking method.
+ // Otherwise, the destructor will attempt to unregister it using the blocking
+ // method which will lead to a deadlock because it is being called from the
+ // callback of the same wait operation
+ client_info->UnregisterProcessExitWait(false);
+
+ delete client_info;
+}
+
+void CrashGenerationServer::HandleDumpRequest(const ClientInfo& client_info) {
+ bool execute_callback = true;
+ // Generate the dump only if it's explicitly requested by the
+ // server application; otherwise the server might want to generate
+ // dump in the callback.
+ std::wstring dump_path;
+ if (generate_dumps_) {
+ if (!GenerateDump(client_info, &dump_path)) {
+ // client proccess terminated or some other error
+ execute_callback = false;
+ }
+ }
+
+ if (dump_callback_ && execute_callback) {
+ std::wstring* ptr_dump_path = (dump_path == L"") ? NULL : &dump_path;
+ dump_callback_(dump_context_, &client_info, ptr_dump_path);
+ }
+
+ SetEvent(client_info.dump_generated_handle());
+}
+
+bool CrashGenerationServer::GenerateDump(const ClientInfo& client,
+ std::wstring* dump_path) {
+ assert(client.pid() != 0);
+ assert(client.process_handle());
+
+ // We have to get the address of EXCEPTION_INFORMATION from
+ // the client process address space.
+ EXCEPTION_POINTERS* client_ex_info = NULL;
+ if (!client.GetClientExceptionInfo(&client_ex_info)) {
+ return false;
+ }
+
+ DWORD client_thread_id = 0;
+ if (!client.GetClientThreadId(&client_thread_id)) {
+ return false;
+ }
+
+ MinidumpGenerator dump_generator(dump_path_,
+ client.process_handle(),
+ client.pid(),
+ client_thread_id,
+ GetCurrentThreadId(),
+ client_ex_info,
+ client.assert_info(),
+ client.dump_type(),
+ true);
+
+ if (!dump_generator.GenerateDumpFile(dump_path)) {
+ return false;
+ }
+
+ // If the client requests a full memory dump, we will write a normal mini
+ // dump and a full memory dump. Both dump files use the same uuid as file
+ // name prefix.
+ if (client.dump_type() & MiniDumpWithFullMemory) {
+ std::wstring full_dump_path;
+ if (!dump_generator.GenerateFullDumpFile(&full_dump_path)) {
+ return false;
+ }
+ }
+
+ return dump_generator.WriteMinidump();
+}
+
+} // namespace google_breakpad
diff --git a/3rdParty/Breakpad/src/client/windows/crash_generation/crash_generation_server.h b/3rdParty/Breakpad/src/client/windows/crash_generation/crash_generation_server.h
new file mode 100644
index 0000000..0ea90e5
--- /dev/null
+++ b/3rdParty/Breakpad/src/client/windows/crash_generation/crash_generation_server.h
@@ -0,0 +1,299 @@
+// Copyright (c) 2008, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#ifndef CLIENT_WINDOWS_CRASH_GENERATION_CRASH_GENERATION_SERVER_H__
+#define CLIENT_WINDOWS_CRASH_GENERATION_CRASH_GENERATION_SERVER_H__
+
+#include <list>
+#include <string>
+#include "client/windows/common/ipc_protocol.h"
+#include "client/windows/crash_generation/minidump_generator.h"
+#include "common/scoped_ptr.h"
+
+namespace google_breakpad {
+class ClientInfo;
+
+// Abstraction for server side implementation of out-of-process crash
+// generation protocol for Windows platform only. It generates Windows
+// minidump files for client processes that request dump generation. When
+// the server is requested to start listening for clients (by calling the
+// Start method), it creates a named pipe and waits for the clients to
+// register. In response, it hands them event handles that the client can
+// signal to request dump generation. When the clients request dump
+// generation in this way, the server generates Windows minidump files.
+class CrashGenerationServer {
+ public:
+ typedef void (*OnClientConnectedCallback)(void* context,
+ const ClientInfo* client_info);
+
+ typedef void (*OnClientDumpRequestCallback)(void* context,
+ const ClientInfo* client_info,
+ const std::wstring* file_path);
+
+ typedef void (*OnClientExitedCallback)(void* context,
+ const ClientInfo* client_info);
+
+ typedef void (*OnClientUploadRequestCallback)(void* context,
+ const DWORD crash_id);
+
+ // Creates an instance with the given parameters.
+ //
+ // Parameter pipe_name: Name of the Windows named pipe
+ // Parameter pipe_sec_attrs Security attributes to set on the pipe. Pass
+ // NULL to use default security on the pipe. By default, the pipe created
+ // allows Local System, Administrators and the Creator full control and
+ // the Everyone group read access on the pipe.
+ // Parameter connect_callback: Callback for a new client connection.
+ // Parameter connect_context: Context for client connection callback.
+ // Parameter crash_callback: Callback for a client crash dump request.
+ // Parameter crash_context: Context for client crash dump request callback.
+ // Parameter exit_callback: Callback for client process exit.
+ // Parameter exit_context: Context for client exit callback.
+ // Parameter generate_dumps: Whether to automatically generate dumps.
+ // Client code of this class might want to generate dumps explicitly in the
+ // crash dump request callback. In that case, false can be passed for this
+ // parameter.
+ // Parameter dump_path: Path for generating dumps; required only if true is
+ // passed for generateDumps parameter; NULL can be passed otherwise.
+ CrashGenerationServer(const std::wstring& pipe_name,
+ SECURITY_ATTRIBUTES* pipe_sec_attrs,
+ OnClientConnectedCallback connect_callback,
+ void* connect_context,
+ OnClientDumpRequestCallback dump_callback,
+ void* dump_context,
+ OnClientExitedCallback exit_callback,
+ void* exit_context,
+ OnClientUploadRequestCallback upload_request_callback,
+ void* upload_context,
+ bool generate_dumps,
+ const std::wstring* dump_path);
+
+ ~CrashGenerationServer();
+
+ // Performs initialization steps needed to start listening to clients. Upon
+ // successful return clients may connect to this server's pipe.
+ //
+ // Returns true if initialization is successful; false otherwise.
+ bool Start();
+
+ void pre_fetch_custom_info(bool do_pre_fetch) {
+ pre_fetch_custom_info_ = do_pre_fetch;
+ }
+
+ private:
+ // Various states the client can be in during the handshake with
+ // the server.
+ enum IPCServerState {
+ // Server starts in this state.
+ IPC_SERVER_STATE_UNINITIALIZED,
+
+ // Server is in error state and it cannot serve any clients.
+ IPC_SERVER_STATE_ERROR,
+
+ // Server starts in this state.
+ IPC_SERVER_STATE_INITIAL,
+
+ // Server has issued an async connect to the pipe and it is waiting
+ // for the connection to be established.
+ IPC_SERVER_STATE_CONNECTING,
+
+ // Server is connected successfully.
+ IPC_SERVER_STATE_CONNECTED,
+
+ // Server has issued an async read from the pipe and it is waiting for
+ // the read to finish.
+ IPC_SERVER_STATE_READING,
+
+ // Server is done reading from the pipe.
+ IPC_SERVER_STATE_READ_DONE,
+
+ // Server has issued an async write to the pipe and it is waiting for
+ // the write to finish.
+ IPC_SERVER_STATE_WRITING,
+
+ // Server is done writing to the pipe.
+ IPC_SERVER_STATE_WRITE_DONE,
+
+ // Server has issued an async read from the pipe for an ack and it
+ // is waiting for the read to finish.
+ IPC_SERVER_STATE_READING_ACK,
+
+ // Server is done writing to the pipe and it is now ready to disconnect
+ // and reconnect.
+ IPC_SERVER_STATE_DISCONNECTING
+ };
+
+ //
+ // Helper methods to handle various server IPC states.
+ //
+ void HandleErrorState();
+ void HandleInitialState();
+ void HandleConnectingState();
+ void HandleConnectedState();
+ void HandleReadingState();
+ void HandleReadDoneState();
+ void HandleWritingState();
+ void HandleWriteDoneState();
+ void HandleReadingAckState();
+ void HandleDisconnectingState();
+
+ // Prepares reply for a client from the given parameters.
+ bool PrepareReply(const ClientInfo& client_info,
+ ProtocolMessage* reply) const;
+
+ // Duplicates various handles in the ClientInfo object for the client
+ // process and stores them in the given ProtocolMessage instance. If
+ // creating any handle fails, ProtocolMessage will contain the handles
+ // already created successfully, which should be closed by the caller.
+ bool CreateClientHandles(const ClientInfo& client_info,
+ ProtocolMessage* reply) const;
+
+ // Response to the given client. Return true if all steps of
+ // responding to the client succeed, false otherwise.
+ bool RespondToClient(ClientInfo* client_info);
+
+ // Handles a connection request from the client.
+ void HandleConnectionRequest();
+
+ // Handles a dump request from the client.
+ void HandleDumpRequest(const ClientInfo& client_info);
+
+ // Callback for pipe connected event.
+ static void CALLBACK OnPipeConnected(void* context, BOOLEAN timer_or_wait);
+
+ // Callback for a dump request.
+ static void CALLBACK OnDumpRequest(void* context, BOOLEAN timer_or_wait);
+
+ // Callback for client process exit event.
+ static void CALLBACK OnClientEnd(void* context, BOOLEAN timer_or_wait);
+
+ // Handles client process exit.
+ void HandleClientProcessExit(ClientInfo* client_info);
+
+ // Adds the given client to the list of registered clients.
+ bool AddClient(ClientInfo* client_info);
+
+ // Generates dump for the given client.
+ bool GenerateDump(const ClientInfo& client, std::wstring* dump_path);
+
+ // Puts the server in a permanent error state and sets a signal such that
+ // the state will be immediately entered after the current state transition
+ // is complete.
+ void EnterErrorState();
+
+ // Puts the server in the specified state and sets a signal such that the
+ // state is immediately entered after the current state transition is
+ // complete.
+ void EnterStateImmediately(IPCServerState state);
+
+ // Puts the server in the specified state. No signal will be set, so the state
+ // transition will only occur when signaled manually or by completion of an
+ // asynchronous IO operation.
+ void EnterStateWhenSignaled(IPCServerState state);
+
+ // Sync object for thread-safe access to the shared list of clients.
+ CRITICAL_SECTION sync_;
+
+ // List of clients.
+ std::list<ClientInfo*> clients_;
+
+ // Pipe name.
+ std::wstring pipe_name_;
+
+ // Pipe security attributes
+ SECURITY_ATTRIBUTES* pipe_sec_attrs_;
+
+ // Handle to the pipe used for handshake with clients.
+ HANDLE pipe_;
+
+ // Pipe wait handle.
+ HANDLE pipe_wait_handle_;
+
+ // Handle to server-alive mutex.
+ HANDLE server_alive_handle_;
+
+ // Callback for a successful client connection.
+ OnClientConnectedCallback connect_callback_;
+
+ // Context for client connected callback.
+ void* connect_context_;
+
+ // Callback for a client dump request.
+ OnClientDumpRequestCallback dump_callback_;
+
+ // Context for client dump request callback.
+ void* dump_context_;
+
+ // Callback for client process exit.
+ OnClientExitedCallback exit_callback_;
+
+ // Context for client process exit callback.
+ void* exit_context_;
+
+ // Callback for upload request.
+ OnClientUploadRequestCallback upload_request_callback_;
+
+ // Context for upload request callback.
+ void* upload_context_;
+
+ // Whether to generate dumps.
+ bool generate_dumps_;
+
+ // Wether to populate custom information up-front.
+ bool pre_fetch_custom_info_;
+
+ // The dump path for the server.
+ const std::wstring dump_path_;
+
+ // State of the server in performing the IPC with the client.
+ // Note that since we restrict the pipe to one instance, we
+ // only need to keep one state of the server. Otherwise, server
+ // would have one state per client it is talking to.
+ IPCServerState server_state_;
+
+ // Whether the server is shutting down.
+ bool shutting_down_;
+
+ // Overlapped instance for async I/O on the pipe.
+ OVERLAPPED overlapped_;
+
+ // Message object used in IPC with the client.
+ ProtocolMessage msg_;
+
+ // Client Info for the client that's connecting to the server.
+ ClientInfo* client_info_;
+
+ // Disable copy ctor and operator=.
+ CrashGenerationServer(const CrashGenerationServer& crash_server);
+ CrashGenerationServer& operator=(const CrashGenerationServer& crash_server);
+};
+
+} // namespace google_breakpad
+
+#endif // CLIENT_WINDOWS_CRASH_GENERATION_CRASH_GENERATION_SERVER_H__
diff --git a/3rdParty/Breakpad/src/client/windows/crash_generation/minidump_generator.cc b/3rdParty/Breakpad/src/client/windows/crash_generation/minidump_generator.cc
new file mode 100644
index 0000000..100e365
--- /dev/null
+++ b/3rdParty/Breakpad/src/client/windows/crash_generation/minidump_generator.cc
@@ -0,0 +1,583 @@
+// Copyright (c) 2008, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#include "client/windows/crash_generation/minidump_generator.h"
+
+#include <assert.h>
+#include <avrfsdk.h>
+
+#include <algorithm>
+#include <iterator>
+#include <list>
+#include <vector>
+
+#include "client/windows/common/auto_critical_section.h"
+#include "common/scoped_ptr.h"
+#include "common/windows/guid_string.h"
+
+using std::wstring;
+
+namespace {
+
+// A helper class used to collect handle operations data. Unlike
+// |MiniDumpWithHandleData| it records the operations for a single handle value
+// only, making it possible to include this information to a minidump.
+class HandleTraceData {
+ public:
+ HandleTraceData();
+ ~HandleTraceData();
+
+ // Collects the handle operations data and formats a user stream to be added
+ // to the minidump.
+ bool CollectHandleData(HANDLE process_handle,
+ EXCEPTION_POINTERS* exception_pointers);
+
+ // Fills the user dump entry with a pointer to the collected handle operations
+ // data. Returns |true| if the entry was initialized successfully, or |false|
+ // if no trace data is available.
+ bool GetUserStream(MINIDUMP_USER_STREAM* user_stream);
+
+ private:
+ // Reads the exception code from the client process's address space.
+ // This routine assumes that the client process's pointer width matches ours.
+ static bool ReadExceptionCode(HANDLE process_handle,
+ EXCEPTION_POINTERS* exception_pointers,
+ DWORD* exception_code);
+
+ // Stores handle operations retrieved by VerifierEnumerateResource().
+ static ULONG CALLBACK RecordHandleOperations(void* resource_description,
+ void* enumeration_context,
+ ULONG* enumeration_level);
+
+ // Function pointer type for VerifierEnumerateResource, which is looked up
+ // dynamically.
+ typedef BOOL (WINAPI* VerifierEnumerateResourceType)(
+ HANDLE Process,
+ ULONG Flags,
+ ULONG ResourceType,
+ AVRF_RESOURCE_ENUMERATE_CALLBACK ResourceCallback,
+ PVOID EnumerationContext);
+
+ // Handle to dynamically loaded verifier.dll.
+ HMODULE verifier_module_;
+
+ // Pointer to the VerifierEnumerateResource function.
+ VerifierEnumerateResourceType enumerate_resource_;
+
+ // Handle value to look for.
+ ULONG64 handle_;
+
+ // List of handle operations for |handle_|.
+ std::list<AVRF_HANDLE_OPERATION> operations_;
+
+ // Minidump stream data.
+ std::vector<char> stream_;
+};
+
+HandleTraceData::HandleTraceData()
+ : verifier_module_(NULL),
+ enumerate_resource_(NULL),
+ handle_(NULL) {
+}
+
+HandleTraceData::~HandleTraceData() {
+ if (verifier_module_) {
+ FreeLibrary(verifier_module_);
+ }
+}
+
+bool HandleTraceData::CollectHandleData(
+ HANDLE process_handle,
+ EXCEPTION_POINTERS* exception_pointers) {
+ DWORD exception_code;
+ if (!ReadExceptionCode(process_handle, exception_pointers, &exception_code)) {
+ return false;
+ }
+
+ // Verify whether the execption is STATUS_INVALID_HANDLE. Do not record any
+ // handle information if it is a different exception to keep the minidump
+ // small.
+ if (exception_code != STATUS_INVALID_HANDLE) {
+ return true;
+ }
+
+ // Load verifier!VerifierEnumerateResource() dynamically.
+ verifier_module_ = LoadLibrary(TEXT("verifier.dll"));
+ if (!verifier_module_) {
+ return false;
+ }
+
+ enumerate_resource_ = reinterpret_cast<VerifierEnumerateResourceType>(
+ GetProcAddress(verifier_module_, "VerifierEnumerateResource"));
+ if (!enumerate_resource_) {
+ return false;
+ }
+
+ // STATUS_INVALID_HANDLE does not provide the offending handle value in
+ // the exception parameters so we have to guess. At the moment we scan
+ // the handle operations trace looking for the last invalid handle operation
+ // and record only the operations for that handle value.
+ if (enumerate_resource_(process_handle,
+ 0,
+ AvrfResourceHandleTrace,
+ &RecordHandleOperations,
+ this) != ERROR_SUCCESS) {
+ // The handle tracing must have not been enabled.
+ return true;
+ }
+
+ // Now that |handle_| is initialized, purge all irrelevant operations.
+ std::list<AVRF_HANDLE_OPERATION>::iterator i = operations_.begin();
+ std::list<AVRF_HANDLE_OPERATION>::iterator i_end = operations_.end();
+ while (i != i_end) {
+ if (i->Handle == handle_) {
+ ++i;
+ } else {
+ i = operations_.erase(i);
+ }
+ }
+
+ // Convert the list of recorded operations to a minidump stream.
+ stream_.resize(sizeof(MINIDUMP_HANDLE_OPERATION_LIST) +
+ sizeof(AVRF_HANDLE_OPERATION) * operations_.size());
+
+ MINIDUMP_HANDLE_OPERATION_LIST* stream_data =
+ reinterpret_cast<MINIDUMP_HANDLE_OPERATION_LIST*>(
+ &stream_.front());
+ stream_data->SizeOfHeader = sizeof(MINIDUMP_HANDLE_OPERATION_LIST);
+ stream_data->SizeOfEntry = sizeof(AVRF_HANDLE_OPERATION);
+ stream_data->NumberOfEntries = static_cast<ULONG32>(operations_.size());
+ stream_data->Reserved = 0;
+ std::copy(operations_.begin(),
+ operations_.end(),
+#ifdef _MSC_VER
+ stdext::checked_array_iterator<AVRF_HANDLE_OPERATION*>(
+ reinterpret_cast<AVRF_HANDLE_OPERATION*>(stream_data + 1),
+ operations_.size())
+#else
+ reinterpret_cast<AVRF_HANDLE_OPERATION*>(stream_data + 1)
+#endif
+ );
+
+ return true;
+}
+
+bool HandleTraceData::GetUserStream(MINIDUMP_USER_STREAM* user_stream) {
+ if (stream_.empty()) {
+ return false;
+ } else {
+ user_stream->Type = HandleOperationListStream;
+ user_stream->BufferSize = static_cast<ULONG>(stream_.size());
+ user_stream->Buffer = &stream_.front();
+ return true;
+ }
+}
+
+bool HandleTraceData::ReadExceptionCode(
+ HANDLE process_handle,
+ EXCEPTION_POINTERS* exception_pointers,
+ DWORD* exception_code) {
+ EXCEPTION_POINTERS pointers;
+ if (!ReadProcessMemory(process_handle,
+ exception_pointers,
+ &pointers,
+ sizeof(pointers),
+ NULL)) {
+ return false;
+ }
+
+ if (!ReadProcessMemory(process_handle,
+ pointers.ExceptionRecord,
+ exception_code,
+ sizeof(*exception_code),
+ NULL)) {
+ return false;
+ }
+
+ return true;
+}
+
+ULONG CALLBACK HandleTraceData::RecordHandleOperations(
+ void* resource_description,
+ void* enumeration_context,
+ ULONG* enumeration_level) {
+ AVRF_HANDLE_OPERATION* description =
+ reinterpret_cast<AVRF_HANDLE_OPERATION*>(resource_description);
+ HandleTraceData* self =
+ reinterpret_cast<HandleTraceData*>(enumeration_context);
+
+ // Remember the last invalid handle operation.
+ if (description->OperationType == OperationDbBADREF) {
+ self->handle_ = description->Handle;
+ }
+
+ // Record all handle operations.
+ self->operations_.push_back(*description);
+
+ *enumeration_level = HeapEnumerationEverything;
+ return ERROR_SUCCESS;
+}
+
+} // namespace
+
+namespace google_breakpad {
+
+MinidumpGenerator::MinidumpGenerator(
+ const std::wstring& dump_path,
+ const HANDLE process_handle,
+ const DWORD process_id,
+ const DWORD thread_id,
+ const DWORD requesting_thread_id,
+ EXCEPTION_POINTERS* exception_pointers,
+ MDRawAssertionInfo* assert_info,
+ const MINIDUMP_TYPE dump_type,
+ const bool is_client_pointers)
+ : dbghelp_module_(NULL),
+ write_dump_(NULL),
+ rpcrt4_module_(NULL),
+ create_uuid_(NULL),
+ process_handle_(process_handle),
+ process_id_(process_id),
+ thread_id_(thread_id),
+ requesting_thread_id_(requesting_thread_id),
+ exception_pointers_(exception_pointers),
+ assert_info_(assert_info),
+ dump_type_(dump_type),
+ is_client_pointers_(is_client_pointers),
+ dump_path_(dump_path),
+ uuid_generated_(false),
+ dump_file_(INVALID_HANDLE_VALUE),
+ full_dump_file_(INVALID_HANDLE_VALUE),
+ dump_file_is_internal_(false),
+ full_dump_file_is_internal_(false),
+ additional_streams_(NULL),
+ callback_info_(NULL) {
+ uuid_ = {0};
+ InitializeCriticalSection(&module_load_sync_);
+ InitializeCriticalSection(&get_proc_address_sync_);
+}
+
+MinidumpGenerator::~MinidumpGenerator() {
+ if (dump_file_is_internal_ && dump_file_ != INVALID_HANDLE_VALUE) {
+ CloseHandle(dump_file_);
+ }
+
+ if (full_dump_file_is_internal_ && full_dump_file_ != INVALID_HANDLE_VALUE) {
+ CloseHandle(full_dump_file_);
+ }
+
+ if (dbghelp_module_) {
+ FreeLibrary(dbghelp_module_);
+ }
+
+ if (rpcrt4_module_) {
+ FreeLibrary(rpcrt4_module_);
+ }
+
+ DeleteCriticalSection(&get_proc_address_sync_);
+ DeleteCriticalSection(&module_load_sync_);
+}
+
+bool MinidumpGenerator::WriteMinidump() {
+ bool full_memory_dump = (dump_type_ & MiniDumpWithFullMemory) != 0;
+ if (dump_file_ == INVALID_HANDLE_VALUE ||
+ (full_memory_dump && full_dump_file_ == INVALID_HANDLE_VALUE)) {
+ return false;
+ }
+
+ MiniDumpWriteDumpType write_dump = GetWriteDump();
+ if (!write_dump) {
+ return false;
+ }
+
+ MINIDUMP_EXCEPTION_INFORMATION* dump_exception_pointers = NULL;
+ MINIDUMP_EXCEPTION_INFORMATION dump_exception_info;
+
+ // Setup the exception information object only if it's a dump
+ // due to an exception.
+ if (exception_pointers_) {
+ dump_exception_pointers = &dump_exception_info;
+ dump_exception_info.ThreadId = thread_id_;
+ dump_exception_info.ExceptionPointers = exception_pointers_;
+ dump_exception_info.ClientPointers = is_client_pointers_;
+ }
+
+ // Add an MDRawBreakpadInfo stream to the minidump, to provide additional
+ // information about the exception handler to the Breakpad processor.
+ // The information will help the processor determine which threads are
+ // relevant. The Breakpad processor does not require this information but
+ // can function better with Breakpad-generated dumps when it is present.
+ // The native debugger is not harmed by the presence of this information.
+ MDRawBreakpadInfo breakpad_info = {0};
+ if (!is_client_pointers_) {
+ // Set the dump thread id and requesting thread id only in case of
+ // in-process dump generation.
+ breakpad_info.validity = MD_BREAKPAD_INFO_VALID_DUMP_THREAD_ID |
+ MD_BREAKPAD_INFO_VALID_REQUESTING_THREAD_ID;
+ breakpad_info.dump_thread_id = thread_id_;
+ breakpad_info.requesting_thread_id = requesting_thread_id_;
+ }
+
+ int additional_streams_count = additional_streams_ ?
+ additional_streams_->UserStreamCount : 0;
+ scoped_array<MINIDUMP_USER_STREAM> user_stream_array(
+ new MINIDUMP_USER_STREAM[3 + additional_streams_count]);
+ user_stream_array[0].Type = MD_BREAKPAD_INFO_STREAM;
+ user_stream_array[0].BufferSize = sizeof(breakpad_info);
+ user_stream_array[0].Buffer = &breakpad_info;
+
+ MINIDUMP_USER_STREAM_INFORMATION user_streams;
+ user_streams.UserStreamCount = 1;
+ user_streams.UserStreamArray = user_stream_array.get();
+
+ MDRawAssertionInfo* actual_assert_info = assert_info_;
+ MDRawAssertionInfo client_assert_info = {{0}};
+
+ if (assert_info_) {
+ // If the assertion info object lives in the client process,
+ // read the memory of the client process.
+ if (is_client_pointers_) {
+ SIZE_T bytes_read = 0;
+ if (!ReadProcessMemory(process_handle_,
+ assert_info_,
+ &client_assert_info,
+ sizeof(client_assert_info),
+ &bytes_read)) {
+ if (dump_file_is_internal_)
+ CloseHandle(dump_file_);
+ if (full_dump_file_is_internal_ &&
+ full_dump_file_ != INVALID_HANDLE_VALUE)
+ CloseHandle(full_dump_file_);
+ return false;
+ }
+
+ if (bytes_read != sizeof(client_assert_info)) {
+ if (dump_file_is_internal_)
+ CloseHandle(dump_file_);
+ if (full_dump_file_is_internal_ &&
+ full_dump_file_ != INVALID_HANDLE_VALUE)
+ CloseHandle(full_dump_file_);
+ return false;
+ }
+
+ actual_assert_info = &client_assert_info;
+ }
+
+ user_stream_array[1].Type = MD_ASSERTION_INFO_STREAM;
+ user_stream_array[1].BufferSize = sizeof(MDRawAssertionInfo);
+ user_stream_array[1].Buffer = actual_assert_info;
+ ++user_streams.UserStreamCount;
+ }
+
+ if (additional_streams_) {
+ for (size_t i = 0;
+ i < additional_streams_->UserStreamCount;
+ i++, user_streams.UserStreamCount++) {
+ user_stream_array[user_streams.UserStreamCount].Type =
+ additional_streams_->UserStreamArray[i].Type;
+ user_stream_array[user_streams.UserStreamCount].BufferSize =
+ additional_streams_->UserStreamArray[i].BufferSize;
+ user_stream_array[user_streams.UserStreamCount].Buffer =
+ additional_streams_->UserStreamArray[i].Buffer;
+ }
+ }
+
+ // If the process is terminated by STATUS_INVALID_HANDLE exception store
+ // the trace of operations for the offending handle value. Do nothing special
+ // if the client already requested the handle trace to be stored in the dump.
+ HandleTraceData handle_trace_data;
+ if (exception_pointers_ && (dump_type_ & MiniDumpWithHandleData) == 0) {
+ if (!handle_trace_data.CollectHandleData(process_handle_,
+ exception_pointers_)) {
+ if (dump_file_is_internal_)
+ CloseHandle(dump_file_);
+ if (full_dump_file_is_internal_ &&
+ full_dump_file_ != INVALID_HANDLE_VALUE)
+ CloseHandle(full_dump_file_);
+ return false;
+ }
+ }
+
+ bool result_full_memory = true;
+ if (full_memory_dump) {
+ result_full_memory = write_dump(
+ process_handle_,
+ process_id_,
+ full_dump_file_,
+ static_cast<MINIDUMP_TYPE>((dump_type_ & (~MiniDumpNormal))
+ | MiniDumpWithHandleData),
+ exception_pointers_ ? &dump_exception_info : NULL,
+ &user_streams,
+ NULL) != FALSE;
+ }
+
+ // Add handle operations trace stream to the minidump if it was collected.
+ if (handle_trace_data.GetUserStream(
+ &user_stream_array[user_streams.UserStreamCount])) {
+ ++user_streams.UserStreamCount;
+ }
+
+ bool result_minidump = write_dump(
+ process_handle_,
+ process_id_,
+ dump_file_,
+ static_cast<MINIDUMP_TYPE>((dump_type_ & (~MiniDumpWithFullMemory))
+ | MiniDumpNormal),
+ exception_pointers_ ? &dump_exception_info : NULL,
+ &user_streams,
+ callback_info_) != FALSE;
+
+ return result_minidump && result_full_memory;
+}
+
+bool MinidumpGenerator::GenerateDumpFile(wstring* dump_path) {
+ // The dump file was already set by handle or this function was previously
+ // called.
+ if (dump_file_ != INVALID_HANDLE_VALUE) {
+ return false;
+ }
+
+ wstring dump_file_path;
+ if (!GenerateDumpFilePath(&dump_file_path)) {
+ return false;
+ }
+
+ dump_file_ = CreateFile(dump_file_path.c_str(),
+ GENERIC_WRITE,
+ 0,
+ NULL,
+ CREATE_NEW,
+ FILE_ATTRIBUTE_NORMAL,
+ NULL);
+ if (dump_file_ == INVALID_HANDLE_VALUE) {
+ return false;
+ }
+
+ dump_file_is_internal_ = true;
+ *dump_path = dump_file_path;
+ return true;
+}
+
+bool MinidumpGenerator::GenerateFullDumpFile(wstring* full_dump_path) {
+ // A full minidump was not requested.
+ if ((dump_type_ & MiniDumpWithFullMemory) == 0) {
+ return false;
+ }
+
+ // The dump file was already set by handle or this function was previously
+ // called.
+ if (full_dump_file_ != INVALID_HANDLE_VALUE) {
+ return false;
+ }
+
+ wstring full_dump_file_path;
+ if (!GenerateDumpFilePath(&full_dump_file_path)) {
+ return false;
+ }
+ full_dump_file_path.resize(full_dump_file_path.size() - 4); // strip .dmp
+ full_dump_file_path.append(TEXT("-full.dmp"));
+
+ full_dump_file_ = CreateFile(full_dump_file_path.c_str(),
+ GENERIC_WRITE,
+ 0,
+ NULL,
+ CREATE_NEW,
+ FILE_ATTRIBUTE_NORMAL,
+ NULL);
+ if (full_dump_file_ == INVALID_HANDLE_VALUE) {
+ return false;
+ }
+
+ full_dump_file_is_internal_ = true;
+ *full_dump_path = full_dump_file_path;
+ return true;
+}
+
+HMODULE MinidumpGenerator::GetDbghelpModule() {
+ AutoCriticalSection lock(&module_load_sync_);
+ if (!dbghelp_module_) {
+ dbghelp_module_ = LoadLibrary(TEXT("dbghelp.dll"));
+ }
+
+ return dbghelp_module_;
+}
+
+MinidumpGenerator::MiniDumpWriteDumpType MinidumpGenerator::GetWriteDump() {
+ AutoCriticalSection lock(&get_proc_address_sync_);
+ if (!write_dump_) {
+ HMODULE module = GetDbghelpModule();
+ if (module) {
+ FARPROC proc = GetProcAddress(module, "MiniDumpWriteDump");
+ write_dump_ = reinterpret_cast<MiniDumpWriteDumpType>(proc);
+ }
+ }
+
+ return write_dump_;
+}
+
+HMODULE MinidumpGenerator::GetRpcrt4Module() {
+ AutoCriticalSection lock(&module_load_sync_);
+ if (!rpcrt4_module_) {
+ rpcrt4_module_ = LoadLibrary(TEXT("rpcrt4.dll"));
+ }
+
+ return rpcrt4_module_;
+}
+
+MinidumpGenerator::UuidCreateType MinidumpGenerator::GetCreateUuid() {
+ AutoCriticalSection lock(&module_load_sync_);
+ if (!create_uuid_) {
+ HMODULE module = GetRpcrt4Module();
+ if (module) {
+ FARPROC proc = GetProcAddress(module, "UuidCreate");
+ create_uuid_ = reinterpret_cast<UuidCreateType>(proc);
+ }
+ }
+
+ return create_uuid_;
+}
+
+bool MinidumpGenerator::GenerateDumpFilePath(wstring* file_path) {
+ if (!uuid_generated_) {
+ UuidCreateType create_uuid = GetCreateUuid();
+ if (!create_uuid) {
+ return false;
+ }
+
+ create_uuid(&uuid_);
+ uuid_generated_ = true;
+ }
+
+ wstring id_str = GUIDString::GUIDToWString(&uuid_);
+
+ *file_path = dump_path_ + TEXT("\\") + id_str + TEXT(".dmp");
+ return true;
+}
+
+} // namespace google_breakpad
diff --git a/3rdParty/Breakpad/src/client/windows/crash_generation/minidump_generator.h b/3rdParty/Breakpad/src/client/windows/crash_generation/minidump_generator.h
new file mode 100644
index 0000000..a707c0b
--- /dev/null
+++ b/3rdParty/Breakpad/src/client/windows/crash_generation/minidump_generator.h
@@ -0,0 +1,203 @@
+// Copyright (c) 2008, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#ifndef CLIENT_WINDOWS_CRASH_GENERATION_MINIDUMP_GENERATOR_H_
+#define CLIENT_WINDOWS_CRASH_GENERATION_MINIDUMP_GENERATOR_H_
+
+#include <windows.h>
+#include <dbghelp.h>
+#include <rpc.h>
+#include <list>
+#include <string>
+#include "google_breakpad/common/minidump_format.h"
+
+namespace google_breakpad {
+
+// Abstraction for various objects and operations needed to generate
+// minidump on Windows. This abstraction is useful to hide all the gory
+// details for minidump generation and provide a clean interface to
+// the clients to generate minidumps.
+class MinidumpGenerator {
+ public:
+ // Creates an instance with the given parameters.
+ // is_client_pointers specifies whether the exception_pointers and
+ // assert_info point into the process that is being dumped.
+ // Before calling WriteMinidump on the returned instance a dump file muct be
+ // specified by a call to either SetDumpFile() or GenerateDumpFile().
+ // If a full dump file will be requested via a subsequent call to either
+ // SetFullDumpFile or GenerateFullDumpFile() dump_type must include
+ // MiniDumpWithFullMemory.
+ MinidumpGenerator(const std::wstring& dump_path,
+ const HANDLE process_handle,
+ const DWORD process_id,
+ const DWORD thread_id,
+ const DWORD requesting_thread_id,
+ EXCEPTION_POINTERS* exception_pointers,
+ MDRawAssertionInfo* assert_info,
+ const MINIDUMP_TYPE dump_type,
+ const bool is_client_pointers);
+
+ ~MinidumpGenerator();
+
+ void SetDumpFile(const HANDLE dump_file) { dump_file_ = dump_file; }
+ void SetFullDumpFile(const HANDLE full_dump_file) {
+ full_dump_file_ = full_dump_file;
+ }
+
+ // Generate the name for the dump file that will be written to once
+ // WriteMinidump() is called. Can only be called once and cannot be called
+ // if the dump file is set via SetDumpFile().
+ bool GenerateDumpFile(std::wstring* dump_path);
+
+ // Generate the name for the full dump file that will be written to once
+ // WriteMinidump() is called. Cannot be called unless the minidump type
+ // includes MiniDumpWithFullMemory. Can only be called once and cannot be
+ // called if the dump file is set via SetFullDumpFile().
+ bool GenerateFullDumpFile(std::wstring* full_dump_path);
+
+ void SetAdditionalStreams(
+ MINIDUMP_USER_STREAM_INFORMATION* additional_streams) {
+ additional_streams_ = additional_streams;
+ }
+
+ void SetCallback(MINIDUMP_CALLBACK_INFORMATION* callback_info) {
+ callback_info_ = callback_info;
+ }
+
+ // Writes the minidump with the given parameters. Stores the
+ // dump file path in the dump_path parameter if dump generation
+ // succeeds.
+ bool WriteMinidump();
+
+ private:
+ // Function pointer type for MiniDumpWriteDump, which is looked up
+ // dynamically.
+ typedef BOOL (WINAPI* MiniDumpWriteDumpType)(
+ HANDLE hProcess,
+ DWORD ProcessId,
+ HANDLE hFile,
+ MINIDUMP_TYPE DumpType,
+ CONST PMINIDUMP_EXCEPTION_INFORMATION ExceptionParam,
+ CONST PMINIDUMP_USER_STREAM_INFORMATION UserStreamParam,
+ CONST PMINIDUMP_CALLBACK_INFORMATION CallbackParam);
+
+ // Function pointer type for UuidCreate, which is looked up dynamically.
+ typedef RPC_STATUS (RPC_ENTRY* UuidCreateType)(UUID* Uuid);
+
+ // Loads the appropriate DLL lazily in a thread safe way.
+ HMODULE GetDbghelpModule();
+
+ // Loads the appropriate DLL and gets a pointer to the MiniDumpWriteDump
+ // function lazily and in a thread-safe manner.
+ MiniDumpWriteDumpType GetWriteDump();
+
+ // Loads the appropriate DLL lazily in a thread safe way.
+ HMODULE GetRpcrt4Module();
+
+ // Loads the appropriate DLL and gets a pointer to the UuidCreate
+ // function lazily and in a thread-safe manner.
+ UuidCreateType GetCreateUuid();
+
+ // Returns the path for the file to write dump to.
+ bool GenerateDumpFilePath(std::wstring* file_path);
+
+ // Handle to dynamically loaded DbgHelp.dll.
+ HMODULE dbghelp_module_;
+
+ // Pointer to the MiniDumpWriteDump function.
+ MiniDumpWriteDumpType write_dump_;
+
+ // Handle to dynamically loaded rpcrt4.dll.
+ HMODULE rpcrt4_module_;
+
+ // Pointer to the UuidCreate function.
+ UuidCreateType create_uuid_;
+
+ // Handle for the process to dump.
+ HANDLE process_handle_;
+
+ // Process ID for the process to dump.
+ DWORD process_id_;
+
+ // The crashing thread ID.
+ DWORD thread_id_;
+
+ // The thread ID which is requesting the dump.
+ DWORD requesting_thread_id_;
+
+ // Pointer to the exception information for the crash. This may point to an
+ // address in the crashing process so it should not be dereferenced.
+ EXCEPTION_POINTERS* exception_pointers_;
+
+ // Assertion info for the report.
+ MDRawAssertionInfo* assert_info_;
+
+ // Type of minidump to generate.
+ MINIDUMP_TYPE dump_type_;
+
+ // Specifies whether the exception_pointers_ reference memory in the crashing
+ // process.
+ bool is_client_pointers_;
+
+ // Folder path to store dump files.
+ std::wstring dump_path_;
+
+ // UUID used to make dump file names.
+ UUID uuid_;
+ bool uuid_generated_;
+
+ // The file where the dump will be written.
+ HANDLE dump_file_;
+
+ // The file where the full dump will be written.
+ HANDLE full_dump_file_;
+
+ // Tracks whether the dump file handle is managed externally.
+ bool dump_file_is_internal_;
+
+ // Tracks whether the full dump file handle is managed externally.
+ bool full_dump_file_is_internal_;
+
+ // Additional streams to be written to the dump.
+ MINIDUMP_USER_STREAM_INFORMATION* additional_streams_;
+
+ // The user defined callback for the various stages of the dump process.
+ MINIDUMP_CALLBACK_INFORMATION* callback_info_;
+
+ // Critical section to sychronize action of loading modules dynamically.
+ CRITICAL_SECTION module_load_sync_;
+
+ // Critical section to synchronize action of dynamically getting function
+ // addresses from modules.
+ CRITICAL_SECTION get_proc_address_sync_;
+};
+
+} // namespace google_breakpad
+
+#endif // CLIENT_WINDOWS_CRASH_GENERATION_MINIDUMP_GENERATOR_H_
diff --git a/3rdParty/Breakpad/src/client/windows/handler/exception_handler.cc b/3rdParty/Breakpad/src/client/windows/handler/exception_handler.cc
index 272ca5f..b3daa0c 100644
--- a/3rdParty/Breakpad/src/client/windows/handler/exception_handler.cc
+++ b/3rdParty/Breakpad/src/client/windows/handler/exception_handler.cc
@@ -27,7 +27,7 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#include <ObjBase.h>
+#include <objbase.h>
#include <algorithm>
#include <cassert>
@@ -41,16 +41,17 @@
namespace google_breakpad {
-static const int kWaitForHandlerThreadMs = 60000;
-static const int kExceptionHandlerThreadInitialStackSize = 64 * 1024;
-
// This is passed as the context to the MinidumpWriteDump callback.
typedef struct {
- ULONG64 memory_base;
- ULONG memory_size;
- bool finished;
+ AppMemoryList::const_iterator iter;
+ AppMemoryList::const_iterator end;
} MinidumpCallbackContext;
+// This define is new to Windows 10.
+#ifndef DBG_PRINTEXCEPTION_WIDE_C
+#define DBG_PRINTEXCEPTION_WIDE_C ((DWORD)0x4001000A)
+#endif
+
vector<ExceptionHandler*>* ExceptionHandler::handler_stack_ = NULL;
LONG ExceptionHandler::handler_stack_index_ = 0;
CRITICAL_SECTION ExceptionHandler::handler_stack_critical_section_;
@@ -71,7 +72,8 @@ ExceptionHandler::ExceptionHandler(const wstring& dump_path,
handler_types,
dump_type,
pipe_name,
- NULL,
+ NULL, // pipe_handle
+ NULL, // crash_generation_client
custom_info);
}
@@ -89,10 +91,32 @@ ExceptionHandler::ExceptionHandler(const wstring& dump_path,
callback_context,
handler_types,
dump_type,
- NULL,
+ NULL, // pipe_name
pipe_handle,
+ NULL, // crash_generation_client
custom_info);
-}
+}
+
+ExceptionHandler::ExceptionHandler(
+ const wstring& dump_path,
+ FilterCallback filter,
+ MinidumpCallback callback,
+ void* callback_context,
+ int handler_types,
+ CrashGenerationClient* crash_generation_client) {
+ // The dump_type, pipe_name and custom_info that are passed in to Initialize()
+ // are not used. The ones set in crash_generation_client are used instead.
+ Initialize(dump_path,
+ filter,
+ callback,
+ callback_context,
+ handler_types,
+ MiniDumpNormal, // dump_type - not used
+ NULL, // pipe_name - not used
+ NULL, // pipe_handle
+ crash_generation_client,
+ NULL); // custom_info - not used
+}
ExceptionHandler::ExceptionHandler(const wstring &dump_path,
FilterCallback filter,
@@ -105,20 +129,23 @@ ExceptionHandler::ExceptionHandler(const wstring &dump_path,
callback_context,
handler_types,
MiniDumpNormal,
- NULL,
- NULL,
- NULL);
+ NULL, // pipe_name
+ NULL, // pipe_handle
+ NULL, // crash_generation_client
+ NULL); // custom_info
}
-void ExceptionHandler::Initialize(const wstring& dump_path,
- FilterCallback filter,
- MinidumpCallback callback,
- void* callback_context,
- int handler_types,
- MINIDUMP_TYPE dump_type,
- const wchar_t* pipe_name,
- HANDLE pipe_handle,
- const CustomClientInfo* custom_info) {
+void ExceptionHandler::Initialize(
+ const wstring& dump_path,
+ FilterCallback filter,
+ MinidumpCallback callback,
+ void* callback_context,
+ int handler_types,
+ MINIDUMP_TYPE dump_type,
+ const wchar_t* pipe_name,
+ HANDLE pipe_handle,
+ CrashGenerationClient* crash_generation_client,
+ const CustomClientInfo* custom_info) {
LONG instance_count = InterlockedIncrement(&instance_count_);
filter_ = filter;
callback_ = callback;
@@ -147,24 +174,22 @@ void ExceptionHandler::Initialize(const wstring& dump_path,
assertion_ = NULL;
handler_return_value_ = false;
handle_debug_exceptions_ = false;
+ consume_invalid_handle_exceptions_ = false;
+
+ // Attempt to use out-of-process if user has specified a pipe or a
+ // crash generation client.
+ scoped_ptr<CrashGenerationClient> client;
+ if (crash_generation_client) {
+ client.reset(crash_generation_client);
+ } else if (pipe_name) {
+ client.reset(
+ new CrashGenerationClient(pipe_name, dump_type_, custom_info));
+ } else if (pipe_handle) {
+ client.reset(
+ new CrashGenerationClient(pipe_handle, dump_type_, custom_info));
+ }
- // Attempt to use out-of-process if user has specified a pipe.
- if (pipe_name != NULL || pipe_handle != NULL) {
- assert(!(pipe_name && pipe_handle));
-
- scoped_ptr<CrashGenerationClient> client;
- if (pipe_name) {
- client.reset(
- new CrashGenerationClient(pipe_name,
- dump_type_,
- custom_info));
- } else {
- client.reset(
- new CrashGenerationClient(pipe_handle,
- dump_type_,
- custom_info));
- }
-
+ if (client.get() != NULL) {
// If successful in registering with the monitoring process,
// there is no need to setup in-process crash generation.
if (client->Register()) {
@@ -192,6 +217,7 @@ void ExceptionHandler::Initialize(const wstring& dump_path,
// Don't attempt to create the thread if we could not create the semaphores.
if (handler_finish_semaphore_ != NULL && handler_start_semaphore_ != NULL) {
DWORD thread_id;
+ const int kExceptionHandlerThreadInitialStackSize = 64 * 1024;
handler_thread_ = CreateThread(NULL, // lpThreadAttributes
kExceptionHandlerThreadInitialStackSize,
ExceptionHandlerThreadMain,
@@ -222,6 +248,12 @@ void ExceptionHandler::Initialize(const wstring& dump_path,
set_dump_path(dump_path);
}
+ // Reserve one element for the instruction memory
+ AppMemory instruction_memory;
+ instruction_memory.ptr = NULL;
+ instruction_memory.length = 0;
+ app_memory_info_.push_back(instruction_memory);
+
// There is a race condition here. If the first instance has not yet
// initialized the critical section, the second (and later) instances may
// try to use uninitialized critical section object. The feature of multiple
@@ -323,6 +355,7 @@ ExceptionHandler::~ExceptionHandler() {
// inside DllMain.
is_shutdown_ = true;
ReleaseSemaphore(handler_start_semaphore_, 1, NULL);
+ const int kWaitForHandlerThreadMs = 60000;
WaitForSingleObject(handler_thread_, kWaitForHandlerThreadMs);
#else
TerminateThread(handler_thread_, 1);
@@ -450,7 +483,14 @@ LONG ExceptionHandler::HandleException(EXCEPTION_POINTERS* exinfo) {
DWORD code = exinfo->ExceptionRecord->ExceptionCode;
LONG action;
bool is_debug_exception = (code == EXCEPTION_BREAKPOINT) ||
- (code == EXCEPTION_SINGLE_STEP);
+ (code == EXCEPTION_SINGLE_STEP) ||
+ (code == DBG_PRINTEXCEPTION_C) ||
+ (code == DBG_PRINTEXCEPTION_WIDE_C);
+
+ if (code == EXCEPTION_INVALID_HANDLE &&
+ current_handler->consume_invalid_handle_exceptions_) {
+ return EXCEPTION_CONTINUE_EXECUTION;
+ }
bool success = false;
@@ -729,12 +769,72 @@ bool ExceptionHandler::WriteMinidumpForException(EXCEPTION_POINTERS* exinfo) {
// static
bool ExceptionHandler::WriteMinidump(const wstring &dump_path,
MinidumpCallback callback,
- void* callback_context) {
+ void* callback_context,
+ MINIDUMP_TYPE dump_type) {
ExceptionHandler handler(dump_path, NULL, callback, callback_context,
- HANDLER_NONE);
+ HANDLER_NONE, dump_type, (HANDLE)NULL, NULL);
return handler.WriteMinidump();
}
+// static
+bool ExceptionHandler::WriteMinidumpForChild(HANDLE child,
+ DWORD child_blamed_thread,
+ const wstring& dump_path,
+ MinidumpCallback callback,
+ void* callback_context,
+ MINIDUMP_TYPE dump_type) {
+ EXCEPTION_RECORD ex;
+ CONTEXT ctx;
+ EXCEPTION_POINTERS exinfo = { NULL, NULL };
+ // As documented on MSDN, on failure SuspendThread returns (DWORD) -1
+ const DWORD kFailedToSuspendThread = static_cast<DWORD>(-1);
+ DWORD last_suspend_count = kFailedToSuspendThread;
+ HANDLE child_thread_handle = OpenThread(THREAD_GET_CONTEXT |
+ THREAD_QUERY_INFORMATION |
+ THREAD_SUSPEND_RESUME,
+ FALSE,
+ child_blamed_thread);
+ // This thread may have died already, so not opening the handle is a
+ // non-fatal error.
+ if (child_thread_handle != NULL) {
+ last_suspend_count = SuspendThread(child_thread_handle);
+ if (last_suspend_count != kFailedToSuspendThread) {
+ ctx.ContextFlags = CONTEXT_ALL;
+ if (GetThreadContext(child_thread_handle, &ctx)) {
+ memset(&ex, 0, sizeof(ex));
+ ex.ExceptionCode = EXCEPTION_BREAKPOINT;
+#if defined(_M_IX86)
+ ex.ExceptionAddress = reinterpret_cast<PVOID>(ctx.Eip);
+#elif defined(_M_X64)
+ ex.ExceptionAddress = reinterpret_cast<PVOID>(ctx.Rip);
+#endif
+ exinfo.ExceptionRecord = &ex;
+ exinfo.ContextRecord = &ctx;
+ }
+ }
+ }
+
+ ExceptionHandler handler(dump_path, NULL, callback, callback_context,
+ HANDLER_NONE, dump_type, (HANDLE)NULL, NULL);
+ bool success = handler.WriteMinidumpWithExceptionForProcess(
+ child_blamed_thread,
+ exinfo.ExceptionRecord ? &exinfo : NULL,
+ NULL, child, false);
+
+ if (last_suspend_count != kFailedToSuspendThread) {
+ ResumeThread(child_thread_handle);
+ }
+
+ CloseHandle(child_thread_handle);
+
+ if (callback) {
+ success = callback(handler.dump_path_c_, handler.next_minidump_id_c_,
+ callback_context, NULL, NULL, success);
+ }
+
+ return success;
+}
+
bool ExceptionHandler::WriteMinidumpWithException(
DWORD requesting_thread_id,
EXCEPTION_POINTERS* exinfo,
@@ -753,106 +853,11 @@ bool ExceptionHandler::WriteMinidumpWithException(
if (IsOutOfProcess()) {
success = crash_generation_client_->RequestDump(exinfo, assertion);
} else {
- if (minidump_write_dump_) {
- HANDLE dump_file = CreateFile(next_minidump_path_c_,
- GENERIC_WRITE,
- 0, // no sharing
- NULL,
- CREATE_NEW, // fail if exists
- FILE_ATTRIBUTE_NORMAL,
- NULL);
- if (dump_file != INVALID_HANDLE_VALUE) {
- MINIDUMP_EXCEPTION_INFORMATION except_info;
- except_info.ThreadId = requesting_thread_id;
- except_info.ExceptionPointers = exinfo;
- except_info.ClientPointers = FALSE;
-
- // Add an MDRawBreakpadInfo stream to the minidump, to provide
- // additional information about the exception handler to the Breakpad
- // processor. The information will help the processor determine which
- // threads are relevant. The Breakpad processor does not require this
- // information but can function better with Breakpad-generated dumps
- // when it is present. The native debugger is not harmed by the
- // presence of this information.
- MDRawBreakpadInfo breakpad_info;
- breakpad_info.validity = MD_BREAKPAD_INFO_VALID_DUMP_THREAD_ID |
- MD_BREAKPAD_INFO_VALID_REQUESTING_THREAD_ID;
- breakpad_info.dump_thread_id = GetCurrentThreadId();
- breakpad_info.requesting_thread_id = requesting_thread_id;
-
- // Leave room in user_stream_array for a possible assertion info stream.
- MINIDUMP_USER_STREAM user_stream_array[2];
- user_stream_array[0].Type = MD_BREAKPAD_INFO_STREAM;
- user_stream_array[0].BufferSize = sizeof(breakpad_info);
- user_stream_array[0].Buffer = &breakpad_info;
-
- MINIDUMP_USER_STREAM_INFORMATION user_streams;
- user_streams.UserStreamCount = 1;
- user_streams.UserStreamArray = user_stream_array;
-
- if (assertion) {
- user_stream_array[1].Type = MD_ASSERTION_INFO_STREAM;
- user_stream_array[1].BufferSize = sizeof(MDRawAssertionInfo);
- user_stream_array[1].Buffer = assertion;
- ++user_streams.UserStreamCount;
- }
-
- MINIDUMP_CALLBACK_INFORMATION callback;
- MinidumpCallbackContext context;
- MINIDUMP_CALLBACK_INFORMATION* callback_pointer = NULL;
- // Older versions of DbgHelp.dll don't correctly put the memory around
- // the faulting instruction pointer into the minidump. This
- // callback will ensure that it gets included.
- if (exinfo) {
- // Find a memory region of 256 bytes centered on the
- // faulting instruction pointer.
- const ULONG64 instruction_pointer =
-#if defined(_M_IX86)
- exinfo->ContextRecord->Eip;
-#elif defined(_M_AMD64)
- exinfo->ContextRecord->Rip;
-#else
-#error Unsupported platform
-#endif
-
- MEMORY_BASIC_INFORMATION info;
- if (VirtualQuery(reinterpret_cast<LPCVOID>(instruction_pointer),
- &info,
- sizeof(MEMORY_BASIC_INFORMATION)) != 0 &&
- info.State == MEM_COMMIT) {
- // Attempt to get 128 bytes before and after the instruction
- // pointer, but settle for whatever's available up to the
- // boundaries of the memory region.
- const ULONG64 kIPMemorySize = 256;
- context.memory_base =
- (std::max)(reinterpret_cast<ULONG64>(info.BaseAddress),
- instruction_pointer - (kIPMemorySize / 2));
- ULONG64 end_of_range =
- (std::min)(instruction_pointer + (kIPMemorySize / 2),
- reinterpret_cast<ULONG64>(info.BaseAddress)
- + info.RegionSize);
- context.memory_size =
- static_cast<ULONG>(end_of_range - context.memory_base);
-
- context.finished = false;
- callback.CallbackRoutine = MinidumpWriteDumpCallback;
- callback.CallbackParam = reinterpret_cast<void*>(&context);
- callback_pointer = &callback;
- }
- }
-
- // The explicit comparison to TRUE avoids a warning (C4800).
- success = (minidump_write_dump_(GetCurrentProcess(),
- GetCurrentProcessId(),
- dump_file,
- dump_type_,
- exinfo ? &except_info : NULL,
- &user_streams,
- callback_pointer) == TRUE);
-
- CloseHandle(dump_file);
- }
- }
+ success = WriteMinidumpWithExceptionForProcess(requesting_thread_id,
+ exinfo,
+ assertion,
+ GetCurrentProcess(),
+ true);
}
if (callback_) {
@@ -876,16 +881,16 @@ BOOL CALLBACK ExceptionHandler::MinidumpWriteDumpCallback(
case MemoryCallback: {
MinidumpCallbackContext* callback_context =
reinterpret_cast<MinidumpCallbackContext*>(context);
- if (callback_context->finished)
+ if (callback_context->iter == callback_context->end)
return FALSE;
// Include the specified memory region.
- callback_output->MemoryBase = callback_context->memory_base;
- callback_output->MemorySize = callback_context->memory_size;
- callback_context->finished = true;
+ callback_output->MemoryBase = callback_context->iter->ptr;
+ callback_output->MemorySize = callback_context->iter->length;
+ callback_context->iter++;
return TRUE;
}
-
+
// Include all modules.
case IncludeModuleCallback:
case ModuleCallback:
@@ -906,6 +911,132 @@ BOOL CALLBACK ExceptionHandler::MinidumpWriteDumpCallback(
return FALSE;
}
+bool ExceptionHandler::WriteMinidumpWithExceptionForProcess(
+ DWORD requesting_thread_id,
+ EXCEPTION_POINTERS* exinfo,
+ MDRawAssertionInfo* assertion,
+ HANDLE process,
+ bool write_requester_stream) {
+ bool success = false;
+ if (minidump_write_dump_) {
+ HANDLE dump_file = CreateFile(next_minidump_path_c_,
+ GENERIC_WRITE,
+ 0, // no sharing
+ NULL,
+ CREATE_NEW, // fail if exists
+ FILE_ATTRIBUTE_NORMAL,
+ NULL);
+ if (dump_file != INVALID_HANDLE_VALUE) {
+ MINIDUMP_EXCEPTION_INFORMATION except_info;
+ except_info.ThreadId = requesting_thread_id;
+ except_info.ExceptionPointers = exinfo;
+ except_info.ClientPointers = FALSE;
+
+ // Leave room in user_stream_array for possible breakpad and
+ // assertion info streams.
+ MINIDUMP_USER_STREAM user_stream_array[2];
+ MINIDUMP_USER_STREAM_INFORMATION user_streams;
+ user_streams.UserStreamCount = 0;
+ user_streams.UserStreamArray = user_stream_array;
+
+ if (write_requester_stream) {
+ // Add an MDRawBreakpadInfo stream to the minidump, to provide
+ // additional information about the exception handler to the Breakpad
+ // processor. The information will help the processor determine which
+ // threads are relevant. The Breakpad processor does not require this
+ // information but can function better with Breakpad-generated dumps
+ // when it is present. The native debugger is not harmed by the
+ // presence of this information.
+ MDRawBreakpadInfo breakpad_info;
+ breakpad_info.validity = MD_BREAKPAD_INFO_VALID_DUMP_THREAD_ID |
+ MD_BREAKPAD_INFO_VALID_REQUESTING_THREAD_ID;
+ breakpad_info.dump_thread_id = GetCurrentThreadId();
+ breakpad_info.requesting_thread_id = requesting_thread_id;
+
+ int index = user_streams.UserStreamCount;
+ user_stream_array[index].Type = MD_BREAKPAD_INFO_STREAM;
+ user_stream_array[index].BufferSize = sizeof(breakpad_info);
+ user_stream_array[index].Buffer = &breakpad_info;
+ ++user_streams.UserStreamCount;
+ }
+
+ if (assertion) {
+ int index = user_streams.UserStreamCount;
+ user_stream_array[index].Type = MD_ASSERTION_INFO_STREAM;
+ user_stream_array[index].BufferSize = sizeof(MDRawAssertionInfo);
+ user_stream_array[index].Buffer = assertion;
+ ++user_streams.UserStreamCount;
+ }
+
+ // Older versions of DbgHelp.dll don't correctly put the memory around
+ // the faulting instruction pointer into the minidump. This
+ // callback will ensure that it gets included.
+ if (exinfo) {
+ // Find a memory region of 256 bytes centered on the
+ // faulting instruction pointer.
+ const ULONG64 instruction_pointer =
+#if defined(_M_IX86)
+ exinfo->ContextRecord->Eip;
+#elif defined(_M_AMD64)
+ exinfo->ContextRecord->Rip;
+#else
+#error Unsupported platform
+#endif
+
+ MEMORY_BASIC_INFORMATION info;
+ if (VirtualQueryEx(process,
+ reinterpret_cast<LPCVOID>(instruction_pointer),
+ &info,
+ sizeof(MEMORY_BASIC_INFORMATION)) != 0 &&
+ info.State == MEM_COMMIT) {
+ // Attempt to get 128 bytes before and after the instruction
+ // pointer, but settle for whatever's available up to the
+ // boundaries of the memory region.
+ const ULONG64 kIPMemorySize = 256;
+ ULONG64 base =
+ (std::max)(reinterpret_cast<ULONG64>(info.BaseAddress),
+ instruction_pointer - (kIPMemorySize / 2));
+ ULONG64 end_of_range =
+ (std::min)(instruction_pointer + (kIPMemorySize / 2),
+ reinterpret_cast<ULONG64>(info.BaseAddress)
+ + info.RegionSize);
+ ULONG size = static_cast<ULONG>(end_of_range - base);
+
+ AppMemory& elt = app_memory_info_.front();
+ elt.ptr = base;
+ elt.length = size;
+ }
+ }
+
+ MinidumpCallbackContext context;
+ context.iter = app_memory_info_.begin();
+ context.end = app_memory_info_.end();
+
+ // Skip the reserved element if there was no instruction memory
+ if (context.iter->ptr == 0) {
+ context.iter++;
+ }
+
+ MINIDUMP_CALLBACK_INFORMATION callback;
+ callback.CallbackRoutine = MinidumpWriteDumpCallback;
+ callback.CallbackParam = reinterpret_cast<void*>(&context);
+
+ // The explicit comparison to TRUE avoids a warning (C4800).
+ success = (minidump_write_dump_(process,
+ GetProcessId(process),
+ dump_file,
+ dump_type_,
+ exinfo ? &except_info : NULL,
+ &user_streams,
+ &callback) == TRUE);
+
+ CloseHandle(dump_file);
+ }
+ }
+
+ return success;
+}
+
void ExceptionHandler::UpdateNextID() {
assert(uuid_create_);
UUID id = {0};
@@ -926,4 +1057,26 @@ void ExceptionHandler::UpdateNextID() {
next_minidump_path_c_ = next_minidump_path_.c_str();
}
+void ExceptionHandler::RegisterAppMemory(void* ptr, size_t length) {
+ AppMemoryList::iterator iter =
+ std::find(app_memory_info_.begin(), app_memory_info_.end(), ptr);
+ if (iter != app_memory_info_.end()) {
+ // Don't allow registering the same pointer twice.
+ return;
+ }
+
+ AppMemory app_memory;
+ app_memory.ptr = reinterpret_cast<ULONG64>(ptr);
+ app_memory.length = static_cast<ULONG>(length);
+ app_memory_info_.push_back(app_memory);
+}
+
+void ExceptionHandler::UnregisterAppMemory(void* ptr) {
+ AppMemoryList::iterator iter =
+ std::find(app_memory_info_.begin(), app_memory_info_.end(), ptr);
+ if (iter != app_memory_info_.end()) {
+ app_memory_info_.erase(iter);
+ }
+}
+
} // namespace google_breakpad
diff --git a/3rdParty/Breakpad/src/client/windows/handler/exception_handler.h b/3rdParty/Breakpad/src/client/windows/handler/exception_handler.h
index 6f59348..2939a68 100644
--- a/3rdParty/Breakpad/src/client/windows/handler/exception_handler.h
+++ b/3rdParty/Breakpad/src/client/windows/handler/exception_handler.h
@@ -57,27 +57,44 @@
#define CLIENT_WINDOWS_HANDLER_EXCEPTION_HANDLER_H__
#include <stdlib.h>
-#include <Windows.h>
-#include <DbgHelp.h>
+#include <windows.h>
+#include <dbghelp.h>
#include <rpc.h>
-#pragma warning( push )
+#pragma warning(push)
// Disable exception handler warnings.
-#pragma warning( disable : 4530 )
+#pragma warning(disable:4530)
+#include <list>
#include <string>
#include <vector>
#include "client/windows/common/ipc_protocol.h"
#include "client/windows/crash_generation/crash_generation_client.h"
+#include "common/scoped_ptr.h"
#include "google_breakpad/common/minidump_format.h"
-#include "processor/scoped_ptr.h"
namespace google_breakpad {
using std::vector;
using std::wstring;
+// These entries store a list of memory regions that the client wants included
+// in the minidump.
+struct AppMemory {
+ ULONG64 ptr;
+ ULONG length;
+
+ bool operator==(const struct AppMemory& other) const {
+ return ptr == other.ptr;
+ }
+
+ bool operator==(const void* other) const {
+ return ptr == reinterpret_cast<ULONG64>(other);
+ }
+};
+typedef std::list<AppMemory> AppMemoryList;
+
class ExceptionHandler {
public:
// A callback function to run before Breakpad performs any substantial
@@ -178,6 +195,25 @@ class ExceptionHandler {
HANDLE pipe_handle,
const CustomClientInfo* custom_info);
+ // ExceptionHandler that ENSURES out-of-process dump generation. Expects a
+ // crash generation client that is already registered with a crash generation
+ // server. Takes ownership of the passed-in crash_generation_client.
+ //
+ // Usage example:
+ // crash_generation_client = new CrashGenerationClient(..);
+ // if (crash_generation_client->Register()) {
+ // // Registration with the crash generation server succeeded.
+ // // Out-of-process dump generation is guaranteed.
+ // g_handler = new ExceptionHandler(.., crash_generation_client, ..);
+ // return true;
+ // }
+ ExceptionHandler(const wstring& dump_path,
+ FilterCallback filter,
+ MinidumpCallback callback,
+ void* callback_context,
+ int handler_types,
+ CrashGenerationClient* crash_generation_client);
+
~ExceptionHandler();
// Get and set the minidump path.
@@ -208,7 +244,20 @@ class ExceptionHandler {
// Convenience form of WriteMinidump which does not require an
// ExceptionHandler instance.
static bool WriteMinidump(const wstring &dump_path,
- MinidumpCallback callback, void* callback_context);
+ MinidumpCallback callback, void* callback_context,
+ MINIDUMP_TYPE dump_type = MiniDumpNormal);
+
+ // Write a minidump of |child| immediately. This can be used to
+ // capture the execution state of |child| independently of a crash.
+ // Pass a meaningful |child_blamed_thread| to make that thread in
+ // the child process the one from which a crash signature is
+ // extracted.
+ static bool WriteMinidumpForChild(HANDLE child,
+ DWORD child_blamed_thread,
+ const wstring& dump_path,
+ MinidumpCallback callback,
+ void* callback_context,
+ MINIDUMP_TYPE dump_type = MiniDumpNormal);
// Get the thread ID of the thread requesting the dump (either the exception
// thread or any other thread that called WriteMinidump directly). This
@@ -222,9 +271,23 @@ class ExceptionHandler {
handle_debug_exceptions_ = handle_debug_exceptions;
}
+ // Controls behavior of EXCEPTION_INVALID_HANDLE.
+ bool get_consume_invalid_handle_exceptions() const {
+ return consume_invalid_handle_exceptions_;
+ }
+ void set_consume_invalid_handle_exceptions(
+ bool consume_invalid_handle_exceptions) {
+ consume_invalid_handle_exceptions_ = consume_invalid_handle_exceptions;
+ }
+
// Returns whether out-of-process dump generation is used or not.
bool IsOutOfProcess() const { return crash_generation_client_.get() != NULL; }
+ // Calling RegisterAppMemory(p, len) causes len bytes starting
+ // at address p to be copied to the minidump when a crash happens.
+ void RegisterAppMemory(void* ptr, size_t length);
+ void UnregisterAppMemory(void* ptr);
+
private:
friend class AutoExceptionHandler;
@@ -237,6 +300,7 @@ class ExceptionHandler {
MINIDUMP_TYPE dump_type,
const wchar_t* pipe_name,
HANDLE pipe_handle,
+ CrashGenerationClient* crash_generation_client,
const CustomClientInfo* custom_info);
// Function pointer type for MiniDumpWriteDump, which is looked up
@@ -289,8 +353,9 @@ class ExceptionHandler {
bool WriteMinidumpOnHandlerThread(EXCEPTION_POINTERS* exinfo,
MDRawAssertionInfo* assertion);
- // This function does the actual writing of a minidump. It is called
- // on the handler thread. requesting_thread_id is the ID of the thread
+ // This function is called on the handler thread. It calls into
+ // WriteMinidumpWithExceptionForProcess() with a handle to the
+ // current process. requesting_thread_id is the ID of the thread
// that requested the dump. If the dump is requested as a result of
// an exception, exinfo contains exception information, otherwise,
// it is NULL.
@@ -305,6 +370,20 @@ class ExceptionHandler {
const PMINIDUMP_CALLBACK_INPUT callback_input,
PMINIDUMP_CALLBACK_OUTPUT callback_output);
+ // This function does the actual writing of a minidump. It is
+ // called on the handler thread. requesting_thread_id is the ID of
+ // the thread that requested the dump, if that information is
+ // meaningful. If the dump is requested as a result of an
+ // exception, exinfo contains exception information, otherwise, it
+ // is NULL. process is the one that will be dumped. If
+ // requesting_thread_id is meaningful and should be added to the
+ // minidump, write_requester_stream is |true|.
+ bool WriteMinidumpWithExceptionForProcess(DWORD requesting_thread_id,
+ EXCEPTION_POINTERS* exinfo,
+ MDRawAssertionInfo* assertion,
+ HANDLE process,
+ bool write_requester_stream);
+
// Generates a new ID and stores it in next_minidump_id_, and stores the
// path of the next minidump to be written in next_minidump_path_.
void UpdateNextID();
@@ -414,6 +493,14 @@ class ExceptionHandler {
// to not interfere with debuggers.
bool handle_debug_exceptions_;
+ // If true, the handler will consume any EXCEPTION_INVALID_HANDLE exceptions.
+ // Leave this false (the default) to handle these exceptions as normal.
+ bool consume_invalid_handle_exceptions_;
+
+ // Callers can request additional memory regions to be included in
+ // the dump.
+ AppMemoryList app_memory_info_;
+
// A stack of ExceptionHandler objects that have installed unhandled
// exception filters. This vector is used by HandleException to determine
// which ExceptionHandler object to route an exception to. When an
@@ -433,7 +520,7 @@ class ExceptionHandler {
static CRITICAL_SECTION handler_stack_critical_section_;
// The number of instances of this class.
- volatile static LONG instance_count_;
+ static volatile LONG instance_count_;
// disallow copy ctor and operator=
explicit ExceptionHandler(const ExceptionHandler &);
@@ -442,6 +529,6 @@ class ExceptionHandler {
} // namespace google_breakpad
-#pragma warning( pop )
+#pragma warning(pop)
#endif // CLIENT_WINDOWS_HANDLER_EXCEPTION_HANDLER_H__
diff --git a/3rdParty/Breakpad/src/common/basictypes.h b/3rdParty/Breakpad/src/common/basictypes.h
new file mode 100644
index 0000000..9426c1f
--- /dev/null
+++ b/3rdParty/Breakpad/src/common/basictypes.h
@@ -0,0 +1,58 @@
+// Copyright (c) 2011 Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#ifndef COMMON_BASICTYPES_H_
+#define COMMON_BASICTYPES_H_
+
+// A macro to disallow the copy constructor and operator= functions
+// This should be used in the private: declarations for a class
+#ifndef DISALLOW_COPY_AND_ASSIGN
+#define DISALLOW_COPY_AND_ASSIGN(TypeName) \
+ TypeName(const TypeName&); \
+ void operator=(const TypeName&)
+#endif // DISALLOW_COPY_AND_ASSIGN
+
+namespace google_breakpad {
+
+// Used to explicitly mark the return value of a function as unused. If you are
+// really sure you don't want to do anything with the return value of a function
+// that has been marked with __attribute__((warn_unused_result)), wrap it with
+// this. Example:
+//
+// scoped_ptr<MyType> my_var = ...;
+// if (TakeOwnership(my_var.get()) == SUCCESS)
+// ignore_result(my_var.release());
+//
+template<typename T>
+inline void ignore_result(const T&) {
+}
+
+} // namespace google_breakpad
+
+#endif // COMMON_BASICTYPES_H_
diff --git a/3rdParty/Breakpad/src/common/byte_cursor_unittest.cc b/3rdParty/Breakpad/src/common/byte_cursor_unittest.cc
new file mode 100644
index 0000000..06bfd89
--- /dev/null
+++ b/3rdParty/Breakpad/src/common/byte_cursor_unittest.cc
@@ -0,0 +1,776 @@
+// Copyright (c) 2010 Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// Original author: Jim Blandy <jimb@mozilla.com> <jimb@red-bean.com>
+
+// byte_cursor_unittest.cc: Unit tests for google_breakpad::ByteBuffer
+// and google_breakpad::ByteCursor.
+
+#include <string>
+
+#include <string.h>
+
+#include "breakpad_googletest_includes.h"
+#include "common/byte_cursor.h"
+#include "common/using_std_string.h"
+
+using google_breakpad::ByteBuffer;
+using google_breakpad::ByteCursor;
+
+TEST(Buffer, SizeOfNothing) {
+ uint8_t data[1];
+ ByteBuffer buffer(data, 0);
+ EXPECT_EQ(0U, buffer.Size());
+}
+
+TEST(Buffer, SizeOfSomething) {
+ uint8_t data[10];
+ ByteBuffer buffer(data, sizeof(data));
+ EXPECT_EQ(10U, buffer.Size());
+}
+
+TEST(Extent, AvailableEmpty) {
+ uint8_t data[1];
+ ByteBuffer buffer(data, 0);
+ ByteCursor cursor(&buffer);
+ EXPECT_EQ(0U, cursor.Available());
+}
+
+TEST(Extent, AtEndEmpty) {
+ uint8_t data[1];
+ ByteBuffer buffer(data, 0);
+ ByteCursor cursor(&buffer);
+ EXPECT_TRUE(cursor.AtEnd());
+}
+
+TEST(Extent, AsBoolEmpty) {
+ uint8_t data[1];
+ ByteBuffer buffer(data, 0);
+ ByteCursor cursor(&buffer);
+ EXPECT_TRUE(cursor);
+}
+
+TEST(Extent, AvailableSome) {
+ uint8_t data[10];
+ ByteBuffer buffer(data, sizeof(data));
+ ByteCursor cursor(&buffer);
+ EXPECT_EQ(10U, cursor.Available());
+}
+
+TEST(Extent, AtEndSome) {
+ uint8_t data[10];
+ ByteBuffer buffer(data, sizeof(data));
+ ByteCursor cursor(&buffer);
+ EXPECT_FALSE(cursor.AtEnd());
+ EXPECT_TRUE(cursor.Skip(sizeof(data)).AtEnd());
+}
+
+TEST(Extent, AsBoolSome) {
+ uint8_t data[10];
+ ByteBuffer buffer(data, sizeof(data));
+ ByteCursor cursor(&buffer);
+ EXPECT_TRUE(cursor);
+ EXPECT_TRUE(cursor.Skip(sizeof(data)));
+ EXPECT_FALSE(cursor.Skip(1));
+}
+
+TEST(Extent, Cursor) {
+ uint8_t data[] = { 0xf7,
+ 0x9f, 0xbe,
+ 0x67, 0xfb, 0xd3, 0x58,
+ 0x6f, 0x36, 0xde, 0xd1,
+ 0x2a, 0x2a, 0x2a };
+ ByteBuffer buffer(data, sizeof(data));
+ ByteCursor cursor(&buffer);
+
+ uint8_t a;
+ uint16_t b;
+ uint32_t c;
+ uint32_t d;
+ uint8_t stars[3];
+
+ EXPECT_EQ(data + 0U, cursor.here());
+
+ EXPECT_TRUE(cursor >> a);
+ EXPECT_EQ(data + 1U, cursor.here());
+
+ EXPECT_TRUE(cursor >> b);
+ EXPECT_EQ(data + 3U, cursor.here());
+
+ EXPECT_TRUE(cursor >> c);
+ EXPECT_EQ(data + 7U, cursor.here());
+
+ EXPECT_TRUE(cursor.Skip(4));
+ EXPECT_EQ(data + 11U, cursor.here());
+
+ EXPECT_TRUE(cursor.Read(stars, 3));
+ EXPECT_EQ(data + 14U, cursor.here());
+
+ EXPECT_FALSE(cursor >> d);
+ EXPECT_EQ(data + 14U, cursor.here());
+}
+
+TEST(Extent, SetOffset) {
+ uint8_t data[] = { 0x5c, 0x79, 0x8c, 0xd5 };
+ ByteBuffer buffer(data, sizeof(data));
+ ByteCursor cursor(&buffer);
+
+ uint8_t a, b, c, d, e;
+ EXPECT_TRUE(cursor >> a);
+ EXPECT_EQ(0x5cU, a);
+ EXPECT_EQ(data + 1U, cursor.here());
+ EXPECT_TRUE(((cursor >> b).set_here(data + 3) >> c).set_here(data + 1)
+ >> d >> e);
+ EXPECT_EQ(0x79U, b);
+ EXPECT_EQ(0xd5U, c);
+ EXPECT_EQ(0x79U, d);
+ EXPECT_EQ(0x8cU, e);
+ EXPECT_EQ(data + 3U, cursor.here());
+}
+
+TEST(BigEndian, Signed1) {
+ uint8_t data[] = { 0x00, 0x7f, 0x80, 0xff };
+ ByteBuffer buffer(data, sizeof(data));
+ ByteCursor cursor(&buffer);
+ cursor.set_big_endian(true);
+ int a, b, c, d, e;
+ ASSERT_TRUE(cursor
+ .Read(1, true, &a)
+ .Read(1, true, &b)
+ .Read(1, true, &c)
+ .Read(1, true, &d));
+ EXPECT_EQ(0, a);
+ EXPECT_EQ(0x7f, b);
+ EXPECT_EQ(-0x80, c);
+ EXPECT_EQ(-1, d);
+ EXPECT_TRUE(cursor.AtEnd());
+ EXPECT_FALSE(cursor.Read(1, true, &e));
+}
+
+TEST(BigEndian, Signed2) {
+ uint8_t data[] = { 0x00, 0x00, 0x00, 0x80, 0x7f, 0xff,
+ 0x80, 0x00, 0x80, 0x80, 0xff, 0xff,
+ 0x39, 0xf1, 0x8a, 0xbc, 0x5a, 0xec };
+ ByteBuffer buffer(data, sizeof(data));
+ ByteCursor cursor(&buffer, true);
+ int a, b, c, d, e, f, g, h, i, j;
+ ASSERT_TRUE(cursor
+ .Read(2, true, &a)
+ .Read(2, true, &b)
+ .Read(2, true, &c)
+ .Read(2, true, &d)
+ .Read(2, true, &e)
+ .Read(2, true, &f)
+ .Read(2, true, &g)
+ .Read(2, true, &h)
+ .Read(2, true, &i));
+ EXPECT_EQ(0, a);
+ EXPECT_EQ(0x80, b);
+ EXPECT_EQ(0x7fff, c);
+ EXPECT_EQ(-0x8000, d);
+ EXPECT_EQ(-0x7f80, e);
+ EXPECT_EQ(-1, f);
+ EXPECT_EQ(0x39f1, g);
+ EXPECT_EQ(-0x7544, h);
+ EXPECT_EQ(0x5aec, i);
+ EXPECT_TRUE(cursor.AtEnd());
+ EXPECT_FALSE(cursor.Read(2, true, &j));
+}
+
+TEST(BigEndian, Signed4) {
+ uint8_t data[] = { 0x00, 0x00, 0x00, 0x00,
+ 0x7f, 0xff, 0xff, 0xff,
+ 0x80, 0x00, 0x00, 0x00,
+ 0xff, 0xff, 0xff, 0xff,
+ 0xb6, 0xb1, 0xff, 0xef,
+ 0x19, 0x6a, 0xca, 0x46 };
+ ByteBuffer buffer(data, sizeof(data));
+ ByteCursor cursor(&buffer);
+ cursor.set_big_endian(true);
+ int64_t a, b, c, d, e, f, g;
+ ASSERT_TRUE(cursor
+ .Read(4, true, &a)
+ .Read(4, true, &b)
+ .Read(4, true, &c)
+ .Read(4, true, &d)
+ .Read(4, true, &e)
+ .Read(4, true, &f));
+ EXPECT_EQ(0, a);
+ EXPECT_EQ(0x7fffffff, b);
+ EXPECT_EQ(-0x80000000LL, c);
+ EXPECT_EQ(-1, d);
+ EXPECT_EQ((int32_t) 0xb6b1ffef, e);
+ EXPECT_EQ(0x196aca46, f);
+ EXPECT_TRUE(cursor.AtEnd());
+ EXPECT_FALSE(cursor.Read(4, true, &g));
+}
+
+TEST(BigEndian, Signed8) {
+ uint8_t data[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0x93, 0x20, 0xd5, 0xe9, 0xd2, 0xd5, 0x87, 0x9c,
+ 0x4e, 0x42, 0x49, 0xd2, 0x7f, 0x84, 0x14, 0xa4 };
+ ByteBuffer buffer(data, sizeof(data));
+ ByteCursor cursor(&buffer, true);
+ int64_t a, b, c, d, e, f, g;
+ ASSERT_TRUE(cursor
+ .Read(8, true, &a)
+ .Read(8, true, &b)
+ .Read(8, true, &c)
+ .Read(8, true, &d)
+ .Read(8, true, &e)
+ .Read(8, true, &f));
+ EXPECT_EQ(0, a);
+ EXPECT_EQ(0x7fffffffffffffffLL, b);
+ EXPECT_EQ(-0x7fffffffffffffffLL - 1, c);
+ EXPECT_EQ(-1, d);
+ EXPECT_EQ((int64_t) 0x9320d5e9d2d5879cULL, e);
+ EXPECT_EQ(0x4e4249d27f8414a4LL, f);
+ EXPECT_TRUE(cursor.AtEnd());
+ EXPECT_FALSE(cursor.Read(8, true, &g));
+}
+
+TEST(BigEndian, Unsigned1) {
+ uint8_t data[] = { 0x00, 0x7f, 0x80, 0xff };
+ ByteBuffer buffer(data, sizeof(data));
+ ByteCursor cursor(&buffer);
+ cursor.set_big_endian(true);
+ int32_t a, b, c, d, e;
+ ASSERT_TRUE(cursor
+ .Read(1, false, &a)
+ .Read(1, false, &b)
+ .Read(1, false, &c)
+ .Read(1, false, &d));
+ EXPECT_EQ(0, a);
+ EXPECT_EQ(0x7f, b);
+ EXPECT_EQ(0x80, c);
+ EXPECT_EQ(0xff, d);
+ EXPECT_TRUE(cursor.AtEnd());
+ EXPECT_FALSE(cursor.Read(1, false, &e));
+}
+
+TEST(BigEndian, Unsigned2) {
+ uint8_t data[] = { 0x00, 0x00, 0x00, 0x80, 0x7f, 0xff,
+ 0x80, 0x00, 0x80, 0x80, 0xff, 0xff,
+ 0x39, 0xf1, 0x8a, 0xbc, 0x5a, 0xec };
+ ByteBuffer buffer(data, sizeof(data));
+ ByteCursor cursor(&buffer, true);
+ int64_t a, b, c, d, e, f, g, h, i, j;
+ ASSERT_TRUE(cursor
+ .Read(2, false, &a)
+ .Read(2, false, &b)
+ .Read(2, false, &c)
+ .Read(2, false, &d)
+ .Read(2, false, &e)
+ .Read(2, false, &f)
+ .Read(2, false, &g)
+ .Read(2, false, &h)
+ .Read(2, false, &i));
+ EXPECT_EQ(0, a);
+ EXPECT_EQ(0x80, b);
+ EXPECT_EQ(0x7fff, c);
+ EXPECT_EQ(0x8000, d);
+ EXPECT_EQ(0x8080, e);
+ EXPECT_EQ(0xffff, f);
+ EXPECT_EQ(0x39f1, g);
+ EXPECT_EQ(0x8abc, h);
+ EXPECT_EQ(0x5aec, i);
+ EXPECT_TRUE(cursor.AtEnd());
+ EXPECT_FALSE(cursor.Read(2, false, &j));
+}
+
+TEST(BigEndian, Unsigned4) {
+ uint8_t data[] = { 0x00, 0x00, 0x00, 0x00,
+ 0x7f, 0xff, 0xff, 0xff,
+ 0x80, 0x00, 0x00, 0x00,
+ 0xff, 0xff, 0xff, 0xff,
+ 0xb6, 0xb1, 0xff, 0xef,
+ 0x19, 0x6a, 0xca, 0x46 };
+ ByteBuffer buffer(data, sizeof(data));
+ ByteCursor cursor(&buffer);
+ cursor.set_big_endian(true);
+ int64_t a, b, c, d, e, f, g;
+ ASSERT_TRUE(cursor
+ .Read(4, false, &a)
+ .Read(4, false, &b)
+ .Read(4, false, &c)
+ .Read(4, false, &d)
+ .Read(4, false, &e)
+ .Read(4, false, &f));
+ EXPECT_EQ(0, a);
+ EXPECT_EQ(0x7fffffff, b);
+ EXPECT_EQ(0x80000000, c);
+ EXPECT_EQ(0xffffffff, d);
+ EXPECT_EQ(0xb6b1ffef, e);
+ EXPECT_EQ(0x196aca46, f);
+ EXPECT_TRUE(cursor.AtEnd());
+ EXPECT_FALSE(cursor.Read(4, false, &g));
+}
+
+TEST(BigEndian, Unsigned8) {
+ uint8_t data[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0x93, 0x20, 0xd5, 0xe9, 0xd2, 0xd5, 0x87, 0x9c,
+ 0x4e, 0x42, 0x49, 0xd2, 0x7f, 0x84, 0x14, 0xa4 };
+ ByteBuffer buffer(data, sizeof(data));
+ ByteCursor cursor(&buffer, true);
+ uint64_t a, b, c, d, e, f, g;
+ ASSERT_TRUE(cursor
+ .Read(8, false, &a)
+ .Read(8, false, &b)
+ .Read(8, false, &c)
+ .Read(8, false, &d)
+ .Read(8, false, &e)
+ .Read(8, false, &f));
+ EXPECT_EQ(0U, a);
+ EXPECT_EQ(0x7fffffffffffffffULL, b);
+ EXPECT_EQ(0x8000000000000000ULL, c);
+ EXPECT_EQ(0xffffffffffffffffULL, d);
+ EXPECT_EQ(0x9320d5e9d2d5879cULL, e);
+ EXPECT_EQ(0x4e4249d27f8414a4ULL, f);
+ EXPECT_TRUE(cursor.AtEnd());
+ EXPECT_FALSE(cursor.Read(8, false, &g));
+}
+
+TEST(LittleEndian, Signed1) {
+ uint8_t data[] = { 0x00, 0x7f, 0x80, 0xff };
+ ByteBuffer buffer(data, sizeof(data));
+ ByteCursor cursor(&buffer);
+ int32_t a, b, c, d, e;
+ ASSERT_TRUE(cursor
+ .Read(1, true, &a)
+ .Read(1, true, &b)
+ .Read(1, true, &c)
+ .Read(1, true, &d));
+ EXPECT_EQ(0, a);
+ EXPECT_EQ(0x7f, b);
+ EXPECT_EQ(-0x80, c);
+ EXPECT_EQ(-1, d);
+ EXPECT_TRUE(cursor.AtEnd());
+ EXPECT_FALSE(cursor.Read(1, true, &e));
+}
+
+TEST(LittleEndian, Signed2) {
+ uint8_t data[] = { 0x00, 0x00, 0x80, 0x00, 0xff, 0x7f,
+ 0x00, 0x80, 0x80, 0x80, 0xff, 0xff,
+ 0xf1, 0x39, 0xbc, 0x8a, 0xec, 0x5a };
+ ByteBuffer buffer(data, sizeof(data));
+ ByteCursor cursor(&buffer, false);
+ int32_t a, b, c, d, e, f, g, h, i, j;
+ ASSERT_TRUE(cursor
+ .Read(2, true, &a)
+ .Read(2, true, &b)
+ .Read(2, true, &c)
+ .Read(2, true, &d)
+ .Read(2, true, &e)
+ .Read(2, true, &f)
+ .Read(2, true, &g)
+ .Read(2, true, &h)
+ .Read(2, true, &i));
+ EXPECT_EQ(0, a);
+ EXPECT_EQ(0x80, b);
+ EXPECT_EQ(0x7fff, c);
+ EXPECT_EQ(-0x8000, d);
+ EXPECT_EQ(-0x7f80, e);
+ EXPECT_EQ(-1, f);
+ EXPECT_EQ(0x39f1, g);
+ EXPECT_EQ(-0x7544, h);
+ EXPECT_EQ(0x5aec, i);
+ EXPECT_TRUE(cursor.AtEnd());
+ EXPECT_FALSE(cursor.Read(2, true, &j));
+}
+
+TEST(LittleEndian, Signed4) {
+ uint8_t data[] = { 0x00, 0x00, 0x00, 0x00,
+ 0xff, 0xff, 0xff, 0x7f,
+ 0x00, 0x00, 0x00, 0x80,
+ 0xff, 0xff, 0xff, 0xff,
+ 0xef, 0xff, 0xb1, 0xb6,
+ 0x46, 0xca, 0x6a, 0x19 };
+ ByteBuffer buffer(data, sizeof(data));
+ ByteCursor cursor(&buffer);
+ int64_t a, b, c, d, e, f, g;
+ ASSERT_TRUE(cursor
+ .Read(4, true, &a)
+ .Read(4, true, &b)
+ .Read(4, true, &c)
+ .Read(4, true, &d)
+ .Read(4, true, &e)
+ .Read(4, true, &f));
+ EXPECT_EQ(0, a);
+ EXPECT_EQ(0x7fffffff, b);
+ EXPECT_EQ(-0x80000000LL, c);
+ EXPECT_EQ(-1, d);
+ EXPECT_EQ((int32_t) 0xb6b1ffef, e);
+ EXPECT_EQ(0x196aca46, f);
+ EXPECT_TRUE(cursor.AtEnd());
+ EXPECT_FALSE(cursor.Read(4, true, &g));
+}
+
+TEST(LittleEndian, Signed8) {
+ uint8_t data[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0x9c, 0x87, 0xd5, 0xd2, 0xe9, 0xd5, 0x20, 0x93,
+ 0xa4, 0x14, 0x84, 0x7f, 0xd2, 0x49, 0x42, 0x4e };
+ ByteBuffer buffer(data, sizeof(data));
+ ByteCursor cursor(&buffer, false);
+ int64_t a, b, c, d, e, f, g;
+ ASSERT_TRUE(cursor
+ .Read(8, true, &a)
+ .Read(8, true, &b)
+ .Read(8, true, &c)
+ .Read(8, true, &d)
+ .Read(8, true, &e)
+ .Read(8, true, &f));
+ EXPECT_EQ(0, a);
+ EXPECT_EQ(0x7fffffffffffffffLL, b);
+ EXPECT_EQ(-0x7fffffffffffffffLL - 1, c);
+ EXPECT_EQ(-1, d);
+ EXPECT_EQ((int64_t) 0x9320d5e9d2d5879cULL, e);
+ EXPECT_EQ(0x4e4249d27f8414a4LL, f);
+ EXPECT_TRUE(cursor.AtEnd());
+ EXPECT_FALSE(cursor.Read(8, true, &g));
+}
+
+TEST(LittleEndian, Unsigned1) {
+ uint8_t data[] = { 0x00, 0x7f, 0x80, 0xff };
+ ByteBuffer buffer(data, sizeof(data));
+ ByteCursor cursor(&buffer);
+ int32_t a, b, c, d, e;
+ ASSERT_TRUE(cursor
+ .Read(1, false, &a)
+ .Read(1, false, &b)
+ .Read(1, false, &c)
+ .Read(1, false, &d));
+ EXPECT_EQ(0, a);
+ EXPECT_EQ(0x7f, b);
+ EXPECT_EQ(0x80, c);
+ EXPECT_EQ(0xff, d);
+ EXPECT_TRUE(cursor.AtEnd());
+ EXPECT_FALSE(cursor.Read(1, false, &e));
+}
+
+TEST(LittleEndian, Unsigned2) {
+ uint8_t data[] = { 0x00, 0x00, 0x80, 0x00, 0xff, 0x7f,
+ 0x00, 0x80, 0x80, 0x80, 0xff, 0xff,
+ 0xf1, 0x39, 0xbc, 0x8a, 0xec, 0x5a };
+ ByteBuffer buffer(data, sizeof(data));
+ ByteCursor cursor(&buffer);
+ int32_t a, b, c, d, e, f, g, h, i, j;
+ ASSERT_TRUE(cursor
+ .Read(2, false, &a)
+ .Read(2, false, &b)
+ .Read(2, false, &c)
+ .Read(2, false, &d)
+ .Read(2, false, &e)
+ .Read(2, false, &f)
+ .Read(2, false, &g)
+ .Read(2, false, &h)
+ .Read(2, false, &i));
+ EXPECT_EQ(0, a);
+ EXPECT_EQ(0x80, b);
+ EXPECT_EQ(0x7fff, c);
+ EXPECT_EQ(0x8000, d);
+ EXPECT_EQ(0x8080, e);
+ EXPECT_EQ(0xffff, f);
+ EXPECT_EQ(0x39f1, g);
+ EXPECT_EQ(0x8abc, h);
+ EXPECT_EQ(0x5aec, i);
+ EXPECT_TRUE(cursor.AtEnd());
+ EXPECT_FALSE(cursor.Read(2, false, &j));
+}
+
+TEST(LittleEndian, Unsigned4) {
+ uint8_t data[] = { 0x00, 0x00, 0x00, 0x00,
+ 0xff, 0xff, 0xff, 0x7f,
+ 0x00, 0x00, 0x00, 0x80,
+ 0xff, 0xff, 0xff, 0xff,
+ 0xef, 0xff, 0xb1, 0xb6,
+ 0x46, 0xca, 0x6a, 0x19 };
+ ByteBuffer buffer(data, sizeof(data));
+ ByteCursor cursor(&buffer);
+ int64_t a, b, c, d, e, f, g;
+ ASSERT_TRUE(cursor
+ .Read(4, false, &a)
+ .Read(4, false, &b)
+ .Read(4, false, &c)
+ .Read(4, false, &d)
+ .Read(4, false, &e)
+ .Read(4, false, &f));
+ EXPECT_EQ(0, a);
+ EXPECT_EQ(0x7fffffff, b);
+ EXPECT_EQ(0x80000000, c);
+ EXPECT_EQ(0xffffffff, d);
+ EXPECT_EQ(0xb6b1ffef, e);
+ EXPECT_EQ(0x196aca46, f);
+ EXPECT_TRUE(cursor.AtEnd());
+ EXPECT_FALSE(cursor.Read(4, false, &g));
+}
+
+TEST(LittleEndian, Unsigned8) {
+ uint8_t data[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0x9c, 0x87, 0xd5, 0xd2, 0xe9, 0xd5, 0x20, 0x93,
+ 0xa4, 0x14, 0x84, 0x7f, 0xd2, 0x49, 0x42, 0x4e };
+ ByteBuffer buffer(data, sizeof(data));
+ ByteCursor cursor(&buffer);
+ uint64_t a, b, c, d, e, f, g;
+ ASSERT_TRUE(cursor
+ .Read(8, false, &a)
+ .Read(8, false, &b)
+ .Read(8, false, &c)
+ .Read(8, false, &d)
+ .Read(8, false, &e)
+ .Read(8, false, &f));
+ EXPECT_EQ(0U, a);
+ EXPECT_EQ(0x7fffffffffffffffULL, b);
+ EXPECT_EQ(0x8000000000000000ULL, c);
+ EXPECT_EQ(0xffffffffffffffffULL, d);
+ EXPECT_EQ(0x9320d5e9d2d5879cULL, e);
+ EXPECT_EQ(0x4e4249d27f8414a4ULL, f);
+ EXPECT_TRUE(cursor.AtEnd());
+ EXPECT_FALSE(cursor.Read(8, false, &g));
+}
+
+TEST(Extractor, Signed1) {
+ uint8_t data[] = { 0xfd };
+ ByteBuffer buffer(data, sizeof(data));
+ ByteCursor cursor(&buffer);
+ int8_t a;
+ EXPECT_TRUE(cursor >> a);
+ EXPECT_EQ(-3, a);
+ EXPECT_FALSE(cursor >> a);
+}
+
+TEST(Extractor, Signed2) {
+ uint8_t data[] = { 0x13, 0xcd };
+ ByteBuffer buffer(data, sizeof(data));
+ ByteCursor cursor(&buffer);
+ int16_t a;
+ EXPECT_TRUE(cursor >> a);
+ EXPECT_EQ(-13037, a);
+ EXPECT_FALSE(cursor >> a);
+}
+
+TEST(Extractor, Signed4) {
+ uint8_t data[] = { 0xd2, 0xe4, 0x53, 0xe9 };
+ ByteBuffer buffer(data, sizeof(data));
+ ByteCursor cursor(&buffer);
+ int32_t a;
+ // For some reason, G++ 4.4.1 complains:
+ // warning: array subscript is above array bounds
+ // in ByteCursor::Read(size_t, bool, T *) as it inlines this call, but
+ // I'm not able to see how such a reference would occur.
+ EXPECT_TRUE(cursor >> a);
+ EXPECT_EQ(-380377902, a);
+ EXPECT_FALSE(cursor >> a);
+}
+
+TEST(Extractor, Unsigned1) {
+ uint8_t data[] = { 0xfd };
+ ByteBuffer buffer(data, sizeof(data));
+ ByteCursor cursor(&buffer);
+ uint8_t a;
+ EXPECT_TRUE(cursor >> a);
+ EXPECT_EQ(0xfd, a);
+ EXPECT_FALSE(cursor >> a);
+}
+
+TEST(Extractor, Unsigned2) {
+ uint8_t data[] = { 0x13, 0xcd };
+ ByteBuffer buffer(data, sizeof(data));
+ ByteCursor cursor(&buffer);
+ uint16_t a;
+ EXPECT_TRUE(cursor >> a);
+ EXPECT_EQ(0xcd13, a);
+ EXPECT_FALSE(cursor >> a);
+}
+
+TEST(Extractor, Unsigned4) {
+ uint8_t data[] = { 0xd2, 0xe4, 0x53, 0xe9 };
+ ByteBuffer buffer(data, sizeof(data));
+ ByteCursor cursor(&buffer);
+ uint32_t a;
+ // For some reason, G++ 4.4.1 complains:
+ // warning: array subscript is above array bounds
+ // in ByteCursor::Read(size_t, bool, T *) as it inlines this call, but
+ // I'm not able to see how such a reference would occur.
+ EXPECT_TRUE(cursor >> a);
+ EXPECT_EQ(0xe953e4d2, a);
+ EXPECT_FALSE(cursor >> a);
+ EXPECT_FALSE(cursor >> a);
+}
+
+TEST(Extractor, Mixed) {
+ uint8_t data[] = { 0x42,
+ 0x25, 0x0b,
+ 0x3d, 0x25, 0xed, 0x2a,
+ 0xec, 0x16, 0x9e, 0x14, 0x61, 0x5b, 0x2c, 0xcf,
+ 0xd8,
+ 0x22, 0xa5,
+ 0x3a, 0x02, 0x6a, 0xd7,
+ 0x93, 0x2a, 0x2d, 0x8d, 0xb4, 0x95, 0xe0, 0xc6 };
+ ByteBuffer buffer(data, sizeof(data));
+ ByteCursor cursor(&buffer);
+ cursor.set_big_endian(true);
+
+ uint8_t a;
+ uint16_t b;
+ uint32_t c;
+ uint64_t d;
+ int8_t e;
+ int16_t f;
+ int32_t g;
+ int64_t h;
+ int z;
+ EXPECT_FALSE(cursor.AtEnd());
+ EXPECT_TRUE(cursor >> a >> b >> c >> d >> e >> f >> g >> h);
+ EXPECT_EQ(0x42U, a);
+ EXPECT_EQ(0x250bU, b);
+ EXPECT_EQ(0x3d25ed2aU, c);
+ EXPECT_EQ(0xec169e14615b2ccfULL, d);
+ EXPECT_EQ(-40, e);
+ EXPECT_EQ(0x22a5, f);
+ EXPECT_EQ(0x3a026ad7, g);
+ EXPECT_EQ(-7842405714468937530LL, h);
+
+ EXPECT_TRUE(cursor.AtEnd());
+ EXPECT_FALSE(cursor >> z);
+}
+
+TEST(Strings, Zero) {
+ uint8_t data[] = { 0xa6 };
+ ByteBuffer buffer(data, 0);
+ ByteCursor cursor(&buffer);
+
+ uint8_t received[1];
+ received[0] = 0xc2;
+ EXPECT_TRUE(cursor.Read(received, 0));
+ EXPECT_EQ(0xc2U, received[0]);
+}
+
+TEST(Strings, Some) {
+ uint8_t data[] = { 0x5d, 0x31, 0x09, 0xa6, 0x2e, 0x2c, 0x83, 0xbb };
+ ByteBuffer buffer(data, sizeof(data));
+ ByteCursor cursor(&buffer);
+
+ uint8_t received[7] = { 0xa7, 0xf7, 0x43, 0x0c, 0x27, 0xea, 0xed };
+ EXPECT_TRUE(cursor.Skip(2).Read(received, 5));
+ uint8_t expected[7] = { 0x09, 0xa6, 0x2e, 0x2c, 0x83, 0xea, 0xed };
+ EXPECT_TRUE(memcmp(received, expected, 7) == 0);
+}
+
+TEST(Strings, TooMuch) {
+ uint8_t data[] = { 0x5d, 0x31, 0x09, 0xa6, 0x2e, 0x2c, 0x83, 0xbb };
+ ByteBuffer buffer(data, sizeof(data));
+ ByteCursor cursor(&buffer);
+
+ uint8_t received1[3];
+ uint8_t received2[3];
+ uint8_t received3[3];
+ EXPECT_FALSE(cursor
+ .Read(received1, 3)
+ .Read(received2, 3)
+ .Read(received3, 3));
+ uint8_t expected1[3] = { 0x5d, 0x31, 0x09 };
+ uint8_t expected2[3] = { 0xa6, 0x2e, 0x2c };
+
+ EXPECT_TRUE(memcmp(received1, expected1, 3) == 0);
+ EXPECT_TRUE(memcmp(received2, expected2, 3) == 0);
+}
+
+TEST(Strings, PointTo) {
+ uint8_t data[] = { 0x83, 0x80, 0xb4, 0x38, 0x00, 0x2c, 0x0a, 0x27 };
+ ByteBuffer buffer(data, sizeof(data));
+ ByteCursor cursor(&buffer);
+
+ const uint8_t *received1;
+ const uint8_t *received2;
+ const uint8_t *received3;
+ const uint8_t *received4;
+ EXPECT_FALSE(cursor
+ .PointTo(&received1, 3)
+ .PointTo(&received2, 3)
+ .PointTo(&received3)
+ .PointTo(&received4, 3));
+ EXPECT_EQ(data + 0, received1);
+ EXPECT_EQ(data + 3, received2);
+ EXPECT_EQ(data + 6, received3);
+ EXPECT_EQ(NULL, received4);
+}
+
+TEST(Strings, CString) {
+ uint8_t data[] = "abc\0\0foo";
+ ByteBuffer buffer(data, sizeof(data) - 1); // don't include terminating '\0'
+ ByteCursor cursor(&buffer);
+
+ string a, b, c;
+ EXPECT_TRUE(cursor.CString(&a).CString(&b));
+ EXPECT_EQ("abc", a);
+ EXPECT_EQ("", b);
+ EXPECT_FALSE(cursor.CString(&c));
+ EXPECT_EQ("", c);
+ EXPECT_TRUE(cursor.AtEnd());
+}
+
+TEST(Strings, CStringLimit) {
+ uint8_t data[] = "abcdef\0\0foobar";
+ ByteBuffer buffer(data, sizeof(data) - 1); // don't include terminating '\0'
+ ByteCursor cursor(&buffer);
+
+ string a, b, c, d, e;
+
+ EXPECT_TRUE(cursor.CString(&a, 3));
+ EXPECT_EQ("abc", a);
+
+ EXPECT_TRUE(cursor.CString(&b, 0));
+ EXPECT_EQ("", b);
+
+ EXPECT_TRUE(cursor.CString(&c, 6));
+ EXPECT_EQ("def", c);
+
+ EXPECT_TRUE(cursor.CString(&d, 4));
+ EXPECT_EQ("ooba", d);
+
+ EXPECT_FALSE(cursor.CString(&e, 4));
+ EXPECT_EQ("", e);
+
+ EXPECT_TRUE(cursor.AtEnd());
+}
+
+// uint8_t data[] = { 0xa6, 0x54, 0xdf, 0x67, 0x51, 0x43, 0xac, 0xf1 };
+// ByteBuffer buffer(data, sizeof(data));
diff --git a/3rdParty/Breakpad/src/common/convert_UTF.c b/3rdParty/Breakpad/src/common/convert_UTF.c
index 80178d3..12a3c89 100644
--- a/3rdParty/Breakpad/src/common/convert_UTF.c
+++ b/3rdParty/Breakpad/src/common/convert_UTF.c
@@ -1,23 +1,39 @@
/*
- * Copyright 2001-2004 Unicode, Inc.
+ * Copyright © 1991-2015 Unicode, Inc. All rights reserved.
+ * Distributed under the Terms of Use in
+ * http://www.unicode.org/copyright.html.
*
- * Disclaimer
+ * Permission is hereby granted, free of charge, to any person obtaining
+ * a copy of the Unicode data files and any associated documentation
+ * (the "Data Files") or Unicode software and any associated documentation
+ * (the "Software") to deal in the Data Files or Software
+ * without restriction, including without limitation the rights to use,
+ * copy, modify, merge, publish, distribute, and/or sell copies of
+ * the Data Files or Software, and to permit persons to whom the Data Files
+ * or Software are furnished to do so, provided that
+ * (a) this copyright and permission notice appear with all copies
+ * of the Data Files or Software,
+ * (b) this copyright and permission notice appear in associated
+ * documentation, and
+ * (c) there is clear notice in each modified Data File or in the Software
+ * as well as in the documentation associated with the Data File(s) or
+ * Software that the data or software has been modified.
*
- * This source code is provided as is by Unicode, Inc. No claims are
- * made as to fitness for any particular purpose. No warranties of any
- * kind are expressed or implied. The recipient agrees to determine
- * applicability of information provided. If this file has been
- * purchased on magnetic or optical media from Unicode, Inc., the
- * sole remedy for any claim will be exchange of defective media
- * within 90 days of receipt.
+ * THE DATA FILES AND SOFTWARE ARE PROVIDED "AS IS", WITHOUT WARRANTY OF
+ * ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+ * WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT OF THIRD PARTY RIGHTS.
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS
+ * NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL
+ * DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+ * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+ * PERFORMANCE OF THE DATA FILES OR SOFTWARE.
*
- * Limitations on Rights to Redistribute This Code
- *
- * Unicode, Inc. hereby grants the right to freely use the information
- * supplied in this file in the creation of products supporting the
- * Unicode Standard, and to make copies of this file in any form
- * for internal or external distribution as long as this notice
- * remains attached.
+ * Except as contained in this notice, the name of a copyright holder
+ * shall not be used in advertising or otherwise to promote the sale,
+ * use or other dealings in these Data Files or Software without prior
+ * written authorization of the copyright holder.
*/
/* ---------------------------------------------------------------------
@@ -53,8 +69,13 @@ static const UTF32 halfMask = 0x3FFUL;
#define UNI_SUR_HIGH_END (UTF32)0xDBFF
#define UNI_SUR_LOW_START (UTF32)0xDC00
#define UNI_SUR_LOW_END (UTF32)0xDFFF
+
+#ifndef false
#define false 0
+#endif
+#ifndef true
#define true 1
+#endif
/* --------------------------------------------------------------------- */
diff --git a/3rdParty/Breakpad/src/common/convert_UTF.h b/3rdParty/Breakpad/src/common/convert_UTF.h
index b1556de..644d099 100644
--- a/3rdParty/Breakpad/src/common/convert_UTF.h
+++ b/3rdParty/Breakpad/src/common/convert_UTF.h
@@ -1,25 +1,44 @@
/*
- * Copyright 2001-2004 Unicode, Inc.
+ * Copyright © 1991-2015 Unicode, Inc. All rights reserved.
+ * Distributed under the Terms of Use in
+ * http://www.unicode.org/copyright.html.
*
- * Disclaimer
+ * Permission is hereby granted, free of charge, to any person obtaining
+ * a copy of the Unicode data files and any associated documentation
+ * (the "Data Files") or Unicode software and any associated documentation
+ * (the "Software") to deal in the Data Files or Software
+ * without restriction, including without limitation the rights to use,
+ * copy, modify, merge, publish, distribute, and/or sell copies of
+ * the Data Files or Software, and to permit persons to whom the Data Files
+ * or Software are furnished to do so, provided that
+ * (a) this copyright and permission notice appear with all copies
+ * of the Data Files or Software,
+ * (b) this copyright and permission notice appear in associated
+ * documentation, and
+ * (c) there is clear notice in each modified Data File or in the Software
+ * as well as in the documentation associated with the Data File(s) or
+ * Software that the data or software has been modified.
*
- * This source code is provided as is by Unicode, Inc. No claims are
- * made as to fitness for any particular purpose. No warranties of any
- * kind are expressed or implied. The recipient agrees to determine
- * applicability of information provided. If this file has been
- * purchased on magnetic or optical media from Unicode, Inc., the
- * sole remedy for any claim will be exchange of defective media
- * within 90 days of receipt.
+ * THE DATA FILES AND SOFTWARE ARE PROVIDED "AS IS", WITHOUT WARRANTY OF
+ * ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+ * WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT OF THIRD PARTY RIGHTS.
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS
+ * NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL
+ * DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+ * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+ * PERFORMANCE OF THE DATA FILES OR SOFTWARE.
*
- * Limitations on Rights to Redistribute This Code
- *
- * Unicode, Inc. hereby grants the right to freely use the information
- * supplied in this file in the creation of products supporting the
- * Unicode Standard, and to make copies of this file in any form
- * for internal or external distribution as long as this notice
- * remains attached.
+ * Except as contained in this notice, the name of a copyright holder
+ * shall not be used in advertising or otherwise to promote the sale,
+ * use or other dealings in these Data Files or Software without prior
+ * written authorization of the copyright holder.
*/
+#ifndef COMMON_CONVERT_UTF_H_
+#define COMMON_CONVERT_UTF_H_
+
/* ---------------------------------------------------------------------
Conversions between UTF32, UTF-16, and UTF-8. Header file.
@@ -141,3 +160,5 @@ Boolean isLegalUTF8Sequence(const UTF8 *source, const UTF8 *sourceEnd);
#endif
/* --------------------------------------------------------------------- */
+
+#endif // COMMON_CONVERT_UTF_H_
diff --git a/3rdParty/Breakpad/src/common/dwarf/bytereader-inl.h b/3rdParty/Breakpad/src/common/dwarf/bytereader-inl.h
index 3c16708..42c92f9 100644
--- a/3rdParty/Breakpad/src/common/dwarf/bytereader-inl.h
+++ b/3rdParty/Breakpad/src/common/dwarf/bytereader-inl.h
@@ -32,16 +32,15 @@
#include "common/dwarf/bytereader.h"
#include <assert.h>
+#include <stdint.h>
namespace dwarf2reader {
-inline uint8 ByteReader::ReadOneByte(const char* buffer) const {
+inline uint8 ByteReader::ReadOneByte(const uint8_t *buffer) const {
return buffer[0];
}
-inline uint16 ByteReader::ReadTwoBytes(const char* signed_buffer) const {
- const unsigned char *buffer
- = reinterpret_cast<const unsigned char *>(signed_buffer);
+inline uint16 ByteReader::ReadTwoBytes(const uint8_t *buffer) const {
const uint16 buffer0 = buffer[0];
const uint16 buffer1 = buffer[1];
if (endian_ == ENDIANNESS_LITTLE) {
@@ -51,9 +50,7 @@ inline uint16 ByteReader::ReadTwoBytes(const char* signed_buffer) const {
}
}
-inline uint64 ByteReader::ReadFourBytes(const char* signed_buffer) const {
- const unsigned char *buffer
- = reinterpret_cast<const unsigned char *>(signed_buffer);
+inline uint64 ByteReader::ReadFourBytes(const uint8_t *buffer) const {
const uint32 buffer0 = buffer[0];
const uint32 buffer1 = buffer[1];
const uint32 buffer2 = buffer[2];
@@ -65,9 +62,7 @@ inline uint64 ByteReader::ReadFourBytes(const char* signed_buffer) const {
}
}
-inline uint64 ByteReader::ReadEightBytes(const char* signed_buffer) const {
- const unsigned char *buffer
- = reinterpret_cast<const unsigned char *>(signed_buffer);
+inline uint64 ByteReader::ReadEightBytes(const uint8_t *buffer) const {
const uint64 buffer0 = buffer[0];
const uint64 buffer1 = buffer[1];
const uint64 buffer2 = buffer[2];
@@ -89,12 +84,12 @@ inline uint64 ByteReader::ReadEightBytes(const char* signed_buffer) const {
// information, plus one bit saying whether the number continues or
// not.
-inline uint64 ByteReader::ReadUnsignedLEB128(const char* buffer,
+inline uint64 ByteReader::ReadUnsignedLEB128(const uint8_t *buffer,
size_t* len) const {
uint64 result = 0;
size_t num_read = 0;
unsigned int shift = 0;
- unsigned char byte;
+ uint8_t byte;
do {
byte = *buffer++;
@@ -114,12 +109,12 @@ inline uint64 ByteReader::ReadUnsignedLEB128(const char* buffer,
// Read a signed LEB128 number. These are like regular LEB128
// numbers, except the last byte may have a sign bit set.
-inline int64 ByteReader::ReadSignedLEB128(const char* buffer,
+inline int64 ByteReader::ReadSignedLEB128(const uint8_t *buffer,
size_t* len) const {
int64 result = 0;
unsigned int shift = 0;
size_t num_read = 0;
- unsigned char byte;
+ uint8_t byte;
do {
byte = *buffer++;
@@ -134,18 +129,18 @@ inline int64 ByteReader::ReadSignedLEB128(const char* buffer,
return result;
}
-inline uint64 ByteReader::ReadOffset(const char* buffer) const {
+inline uint64 ByteReader::ReadOffset(const uint8_t *buffer) const {
assert(this->offset_reader_);
return (this->*offset_reader_)(buffer);
}
-inline uint64 ByteReader::ReadAddress(const char* buffer) const {
+inline uint64 ByteReader::ReadAddress(const uint8_t *buffer) const {
assert(this->address_reader_);
return (this->*address_reader_)(buffer);
}
inline void ByteReader::SetCFIDataBase(uint64 section_base,
- const char *buffer_base) {
+ const uint8_t *buffer_base) {
section_base_ = section_base;
buffer_base_ = buffer_base;
have_section_base_ = true;
diff --git a/3rdParty/Breakpad/src/common/dwarf/bytereader.cc b/3rdParty/Breakpad/src/common/dwarf/bytereader.cc
index 6802026..14b43ad 100644
--- a/3rdParty/Breakpad/src/common/dwarf/bytereader.cc
+++ b/3rdParty/Breakpad/src/common/dwarf/bytereader.cc
@@ -27,6 +27,7 @@
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include <assert.h>
+#include <stdint.h>
#include <stdlib.h>
#include "common/dwarf/bytereader-inl.h"
@@ -62,7 +63,7 @@ void ByteReader::SetAddressSize(uint8 size) {
}
}
-uint64 ByteReader::ReadInitialLength(const char* start, size_t* len) {
+uint64 ByteReader::ReadInitialLength(const uint8_t *start, size_t* len) {
const uint64 initial_length = ReadFourBytes(start);
start += 4;
@@ -100,7 +101,7 @@ bool ByteReader::UsableEncoding(DwarfPointerEncoding encoding) const {
}
}
-uint64 ByteReader::ReadEncodedPointer(const char *buffer,
+uint64 ByteReader::ReadEncodedPointer(const uint8_t *buffer,
DwarfPointerEncoding encoding,
size_t *len) const {
// UsableEncoding doesn't approve of DW_EH_PE_omit, so we shouldn't
@@ -129,7 +130,7 @@ uint64 ByteReader::ReadEncodedPointer(const char *buffer,
// Round up to the next boundary.
uint64 aligned = (offset + AddressSize() - 1) & -AddressSize();
// Convert back to a pointer.
- const char *aligned_buffer = buffer_base_ + (aligned - skew);
+ const uint8_t *aligned_buffer = buffer_base_ + (aligned - skew);
// Finally, store the length and actually fetch the pointer.
*len = aligned_buffer - buffer + AddressSize();
return ReadAddress(aligned_buffer);
@@ -242,4 +243,8 @@ uint64 ByteReader::ReadEncodedPointer(const char *buffer,
return pointer;
}
+Endianness ByteReader::GetEndianness() const {
+ return endian_;
+}
+
} // namespace dwarf2reader
diff --git a/3rdParty/Breakpad/src/common/dwarf/bytereader.h b/3rdParty/Breakpad/src/common/dwarf/bytereader.h
index e389427..59d4303 100644
--- a/3rdParty/Breakpad/src/common/dwarf/bytereader.h
+++ b/3rdParty/Breakpad/src/common/dwarf/bytereader.h
@@ -31,7 +31,10 @@
#ifndef COMMON_DWARF_BYTEREADER_H__
#define COMMON_DWARF_BYTEREADER_H__
+#include <stdint.h>
+
#include <string>
+
#include "common/dwarf/types.h"
#include "common/dwarf/dwarf2enums.h"
@@ -59,22 +62,22 @@ class ByteReader {
// Read a single byte from BUFFER and return it as an unsigned 8 bit
// number.
- uint8 ReadOneByte(const char* buffer) const;
+ uint8 ReadOneByte(const uint8_t *buffer) const;
// Read two bytes from BUFFER and return them as an unsigned 16 bit
// number, using this ByteReader's endianness.
- uint16 ReadTwoBytes(const char* buffer) const;
+ uint16 ReadTwoBytes(const uint8_t *buffer) const;
// Read four bytes from BUFFER and return them as an unsigned 32 bit
// number, using this ByteReader's endianness. This function returns
// a uint64 so that it is compatible with ReadAddress and
// ReadOffset. The number it returns will never be outside the range
// of an unsigned 32 bit integer.
- uint64 ReadFourBytes(const char* buffer) const;
+ uint64 ReadFourBytes(const uint8_t *buffer) const;
// Read eight bytes from BUFFER and return them as an unsigned 64
// bit number, using this ByteReader's endianness.
- uint64 ReadEightBytes(const char* buffer) const;
+ uint64 ReadEightBytes(const uint8_t *buffer) const;
// Read an unsigned LEB128 (Little Endian Base 128) number from
// BUFFER and return it as an unsigned 64 bit integer. Set LEN to
@@ -93,7 +96,7 @@ class ByteReader {
// In other words, we break VALUE into groups of seven bits, put
// them in little-endian order, and then write them as eight-bit
// bytes with the high bit on all but the last.
- uint64 ReadUnsignedLEB128(const char* buffer, size_t* len) const;
+ uint64 ReadUnsignedLEB128(const uint8_t *buffer, size_t *len) const;
// Read a signed LEB128 number from BUFFER and return it as an
// signed 64 bit integer. Set LEN to the number of bytes read.
@@ -112,7 +115,7 @@ class ByteReader {
// In other words, we break VALUE into groups of seven bits, put
// them in little-endian order, and then write them as eight-bit
// bytes with the high bit on all but the last.
- int64 ReadSignedLEB128(const char* buffer, size_t* len) const;
+ int64 ReadSignedLEB128(const uint8_t *buffer, size_t *len) const;
// Indicate that addresses on this architecture are SIZE bytes long. SIZE
// must be either 4 or 8. (DWARF allows addresses to be any number of
@@ -135,7 +138,7 @@ class ByteReader {
// Read an address from BUFFER and return it as an unsigned 64 bit
// integer, respecting this ByteReader's endianness and address size. You
// must call SetAddressSize before calling this function.
- uint64 ReadAddress(const char* buffer) const;
+ uint64 ReadAddress(const uint8_t *buffer) const;
// DWARF actually defines two slightly different formats: 32-bit DWARF
// and 64-bit DWARF. This is *not* related to the size of registers or
@@ -172,14 +175,14 @@ class ByteReader {
// - The 32-bit value 0xffffffff, followed by a 64-bit byte count,
// indicating that the data whose length is being measured uses
// the 64-bit DWARF format.
- uint64 ReadInitialLength(const char* start, size_t* len);
+ uint64 ReadInitialLength(const uint8_t *start, size_t *len);
// Read an offset from BUFFER and return it as an unsigned 64 bit
// integer, respecting the ByteReader's endianness. In 32-bit DWARF, the
// offset is 4 bytes long; in 64-bit DWARF, the offset is eight bytes
// long. You must call ReadInitialLength or SetOffsetSize before calling
// this function; see the comments above for details.
- uint64 ReadOffset(const char* buffer) const;
+ uint64 ReadOffset(const uint8_t *buffer) const;
// Return the current offset size, in bytes.
// A return value of 4 indicates that we are reading 32-bit DWARF.
@@ -234,7 +237,7 @@ class ByteReader {
// is BUFFER_BASE. This allows us to find the address that a given
// byte in our buffer would have when loaded into the program the
// data describes. We need this to resolve DW_EH_PE_pcrel pointers.
- void SetCFIDataBase(uint64 section_base, const char *buffer_base);
+ void SetCFIDataBase(uint64 section_base, const uint8_t *buffer_base);
// Indicate that the base address of the program's ".text" section
// is TEXT_BASE. We need this to resolve DW_EH_PE_textrel pointers.
@@ -273,13 +276,15 @@ class ByteReader {
// base address this reader hasn't been given, so you should check
// with ValidEncoding and UsableEncoding first if you would rather
// die in a more helpful way.
- uint64 ReadEncodedPointer(const char *buffer, DwarfPointerEncoding encoding,
+ uint64 ReadEncodedPointer(const uint8_t *buffer,
+ DwarfPointerEncoding encoding,
size_t *len) const;
+ Endianness GetEndianness() const;
private:
// Function pointer type for our address and offset readers.
- typedef uint64 (ByteReader::*AddressReader)(const char*) const;
+ typedef uint64 (ByteReader::*AddressReader)(const uint8_t *) const;
// Read an offset from BUFFER and return it as an unsigned 64 bit
// integer. DWARF2/3 define offsets as either 4 or 8 bytes,
@@ -302,7 +307,7 @@ class ByteReader {
bool have_section_base_, have_text_base_, have_data_base_;
bool have_function_base_;
uint64 section_base_, text_base_, data_base_, function_base_;
- const char *buffer_base_;
+ const uint8_t *buffer_base_;
};
} // namespace dwarf2reader
diff --git a/3rdParty/Breakpad/src/common/dwarf/bytereader_unittest.cc b/3rdParty/Breakpad/src/common/dwarf/bytereader_unittest.cc
new file mode 100644
index 0000000..e66062d
--- /dev/null
+++ b/3rdParty/Breakpad/src/common/dwarf/bytereader_unittest.cc
@@ -0,0 +1,707 @@
+// Copyright (c) 2010, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// Original author: Jim Blandy <jimb@mozilla.com> <jimb@red-bean.com>
+
+// bytereader_unittest.cc: Unit tests for dwarf2reader::ByteReader
+
+#include <stdint.h>
+
+#include <string>
+
+#include "breakpad_googletest_includes.h"
+#include "common/dwarf/bytereader.h"
+#include "common/dwarf/bytereader-inl.h"
+#include "common/dwarf/cfi_assembler.h"
+#include "common/using_std_string.h"
+
+using dwarf2reader::ByteReader;
+using dwarf2reader::DwarfPointerEncoding;
+using dwarf2reader::ENDIANNESS_BIG;
+using dwarf2reader::ENDIANNESS_LITTLE;
+using google_breakpad::CFISection;
+using google_breakpad::test_assembler::Label;
+using google_breakpad::test_assembler::kBigEndian;
+using google_breakpad::test_assembler::kLittleEndian;
+using google_breakpad::test_assembler::Section;
+using testing::Test;
+
+struct ReaderFixture {
+ string contents;
+ size_t pointer_size;
+};
+
+class Reader: public ReaderFixture, public Test { };
+class ReaderDeathTest: public ReaderFixture, public Test { };
+
+TEST_F(Reader, SimpleConstructor) {
+ ByteReader reader(ENDIANNESS_BIG);
+ reader.SetAddressSize(4);
+ CFISection section(kBigEndian, 4);
+ section
+ .D8(0xc0)
+ .D16(0xcf0d)
+ .D32(0x96fdd219)
+ .D64(0xbbf55fef0825f117ULL)
+ .ULEB128(0xa0927048ba8121afULL)
+ .LEB128(-0x4f337badf4483f83LL)
+ .D32(0xfec319c9);
+ ASSERT_TRUE(section.GetContents(&contents));
+ const uint8_t *data = reinterpret_cast<const uint8_t *>(contents.data());
+ EXPECT_EQ(0xc0U, reader.ReadOneByte(data));
+ EXPECT_EQ(0xcf0dU, reader.ReadTwoBytes(data + 1));
+ EXPECT_EQ(0x96fdd219U, reader.ReadFourBytes(data + 3));
+ EXPECT_EQ(0xbbf55fef0825f117ULL, reader.ReadEightBytes(data + 7));
+ size_t leb128_size;
+ EXPECT_EQ(0xa0927048ba8121afULL,
+ reader.ReadUnsignedLEB128(data + 15, &leb128_size));
+ EXPECT_EQ(10U, leb128_size);
+ EXPECT_EQ(-0x4f337badf4483f83LL,
+ reader.ReadSignedLEB128(data + 25, &leb128_size));
+ EXPECT_EQ(10U, leb128_size);
+ EXPECT_EQ(0xfec319c9, reader.ReadAddress(data + 35));
+}
+
+TEST_F(Reader, ValidEncodings) {
+ ByteReader reader(ENDIANNESS_LITTLE);
+ EXPECT_TRUE(reader.ValidEncoding(
+ DwarfPointerEncoding(dwarf2reader::DW_EH_PE_absptr)));
+ EXPECT_TRUE(reader.ValidEncoding(
+ DwarfPointerEncoding(dwarf2reader::DW_EH_PE_omit)));
+ EXPECT_TRUE(reader.ValidEncoding(
+ DwarfPointerEncoding(dwarf2reader::DW_EH_PE_aligned)));
+ EXPECT_TRUE(reader.ValidEncoding(
+ DwarfPointerEncoding(dwarf2reader::DW_EH_PE_uleb128)));
+ EXPECT_TRUE(reader.ValidEncoding(
+ DwarfPointerEncoding(dwarf2reader::DW_EH_PE_udata2)));
+ EXPECT_TRUE(reader.ValidEncoding(
+ DwarfPointerEncoding(dwarf2reader::DW_EH_PE_udata4)));
+ EXPECT_TRUE(reader.ValidEncoding(
+ DwarfPointerEncoding(dwarf2reader::DW_EH_PE_udata8)));
+ EXPECT_TRUE(reader.ValidEncoding(
+ DwarfPointerEncoding(dwarf2reader::DW_EH_PE_sleb128)));
+ EXPECT_TRUE(reader.ValidEncoding(
+ DwarfPointerEncoding(dwarf2reader::DW_EH_PE_sdata2)));
+ EXPECT_TRUE(reader.ValidEncoding(
+ DwarfPointerEncoding(dwarf2reader::DW_EH_PE_sdata4)));
+ EXPECT_TRUE(reader.ValidEncoding(
+ DwarfPointerEncoding(dwarf2reader::DW_EH_PE_sdata8)));
+ EXPECT_TRUE(reader.ValidEncoding(
+ DwarfPointerEncoding(dwarf2reader::DW_EH_PE_absptr |
+ dwarf2reader::DW_EH_PE_pcrel)));
+ EXPECT_TRUE(reader.ValidEncoding(
+ DwarfPointerEncoding(dwarf2reader::DW_EH_PE_uleb128 |
+ dwarf2reader::DW_EH_PE_pcrel)));
+ EXPECT_TRUE(reader.ValidEncoding(
+ DwarfPointerEncoding(dwarf2reader::DW_EH_PE_udata2 |
+ dwarf2reader::DW_EH_PE_pcrel)));
+ EXPECT_TRUE(reader.ValidEncoding(
+ DwarfPointerEncoding(dwarf2reader::DW_EH_PE_udata4 |
+ dwarf2reader::DW_EH_PE_pcrel)));
+ EXPECT_TRUE(reader.ValidEncoding(
+ DwarfPointerEncoding(dwarf2reader::DW_EH_PE_udata8 |
+ dwarf2reader::DW_EH_PE_pcrel)));
+ EXPECT_TRUE(reader.ValidEncoding(
+ DwarfPointerEncoding(dwarf2reader::DW_EH_PE_sleb128 |
+ dwarf2reader::DW_EH_PE_pcrel)));
+ EXPECT_TRUE(reader.ValidEncoding(
+ DwarfPointerEncoding(dwarf2reader::DW_EH_PE_sdata2 |
+ dwarf2reader::DW_EH_PE_pcrel)));
+ EXPECT_TRUE(reader.ValidEncoding(
+ DwarfPointerEncoding(dwarf2reader::DW_EH_PE_sdata4 |
+ dwarf2reader::DW_EH_PE_pcrel)));
+ EXPECT_TRUE(reader.ValidEncoding(
+ DwarfPointerEncoding(dwarf2reader::DW_EH_PE_sdata8 |
+ dwarf2reader::DW_EH_PE_pcrel)));
+ EXPECT_TRUE(reader.ValidEncoding(
+ DwarfPointerEncoding(dwarf2reader::DW_EH_PE_absptr |
+ dwarf2reader::DW_EH_PE_textrel)));
+ EXPECT_TRUE(reader.ValidEncoding(
+ DwarfPointerEncoding(dwarf2reader::DW_EH_PE_uleb128 |
+ dwarf2reader::DW_EH_PE_textrel)));
+ EXPECT_TRUE(reader.ValidEncoding(
+ DwarfPointerEncoding(dwarf2reader::DW_EH_PE_udata2 |
+ dwarf2reader::DW_EH_PE_textrel)));
+ EXPECT_TRUE(reader.ValidEncoding(
+ DwarfPointerEncoding(dwarf2reader::DW_EH_PE_udata4 |
+ dwarf2reader::DW_EH_PE_textrel)));
+ EXPECT_TRUE(reader.ValidEncoding(
+ DwarfPointerEncoding(dwarf2reader::DW_EH_PE_udata8 |
+ dwarf2reader::DW_EH_PE_textrel)));
+ EXPECT_TRUE(reader.ValidEncoding(
+ DwarfPointerEncoding(dwarf2reader::DW_EH_PE_sleb128 |
+ dwarf2reader::DW_EH_PE_textrel)));
+ EXPECT_TRUE(reader.ValidEncoding(
+ DwarfPointerEncoding(dwarf2reader::DW_EH_PE_sdata2 |
+ dwarf2reader::DW_EH_PE_textrel)));
+ EXPECT_TRUE(reader.ValidEncoding(
+ DwarfPointerEncoding(dwarf2reader::DW_EH_PE_sdata4 |
+ dwarf2reader::DW_EH_PE_textrel)));
+ EXPECT_TRUE(reader.ValidEncoding(
+ DwarfPointerEncoding(dwarf2reader::DW_EH_PE_sdata8 |
+ dwarf2reader::DW_EH_PE_textrel)));
+ EXPECT_TRUE(reader.ValidEncoding(
+ DwarfPointerEncoding(dwarf2reader::DW_EH_PE_absptr |
+ dwarf2reader::DW_EH_PE_datarel)));
+ EXPECT_TRUE(reader.ValidEncoding(
+ DwarfPointerEncoding(dwarf2reader::DW_EH_PE_uleb128 |
+ dwarf2reader::DW_EH_PE_datarel)));
+ EXPECT_TRUE(reader.ValidEncoding(
+ DwarfPointerEncoding(dwarf2reader::DW_EH_PE_udata2 |
+ dwarf2reader::DW_EH_PE_datarel)));
+ EXPECT_TRUE(reader.ValidEncoding(
+ DwarfPointerEncoding(dwarf2reader::DW_EH_PE_udata4 |
+ dwarf2reader::DW_EH_PE_datarel)));
+ EXPECT_TRUE(reader.ValidEncoding(
+ DwarfPointerEncoding(dwarf2reader::DW_EH_PE_udata8 |
+ dwarf2reader::DW_EH_PE_datarel)));
+ EXPECT_TRUE(reader.ValidEncoding(
+ DwarfPointerEncoding(dwarf2reader::DW_EH_PE_sleb128 |
+ dwarf2reader::DW_EH_PE_datarel)));
+ EXPECT_TRUE(reader.ValidEncoding(
+ DwarfPointerEncoding(dwarf2reader::DW_EH_PE_sdata2 |
+ dwarf2reader::DW_EH_PE_datarel)));
+ EXPECT_TRUE(reader.ValidEncoding(
+ DwarfPointerEncoding(dwarf2reader::DW_EH_PE_sdata4 |
+ dwarf2reader::DW_EH_PE_datarel)));
+ EXPECT_TRUE(reader.ValidEncoding(
+ DwarfPointerEncoding(dwarf2reader::DW_EH_PE_sdata8 |
+ dwarf2reader::DW_EH_PE_datarel)));
+ EXPECT_TRUE(reader.ValidEncoding(
+ DwarfPointerEncoding(dwarf2reader::DW_EH_PE_absptr |
+ dwarf2reader::DW_EH_PE_funcrel)));
+ EXPECT_TRUE(reader.ValidEncoding(
+ DwarfPointerEncoding(dwarf2reader::DW_EH_PE_uleb128 |
+ dwarf2reader::DW_EH_PE_funcrel)));
+ EXPECT_TRUE(reader.ValidEncoding(
+ DwarfPointerEncoding(dwarf2reader::DW_EH_PE_udata2 |
+ dwarf2reader::DW_EH_PE_funcrel)));
+ EXPECT_TRUE(reader.ValidEncoding(
+ DwarfPointerEncoding(dwarf2reader::DW_EH_PE_udata4 |
+ dwarf2reader::DW_EH_PE_funcrel)));
+ EXPECT_TRUE(reader.ValidEncoding(
+ DwarfPointerEncoding(dwarf2reader::DW_EH_PE_udata8 |
+ dwarf2reader::DW_EH_PE_funcrel)));
+ EXPECT_TRUE(reader.ValidEncoding(
+ DwarfPointerEncoding(dwarf2reader::DW_EH_PE_sleb128 |
+ dwarf2reader::DW_EH_PE_funcrel)));
+ EXPECT_TRUE(reader.ValidEncoding(
+ DwarfPointerEncoding(dwarf2reader::DW_EH_PE_sdata2 |
+ dwarf2reader::DW_EH_PE_funcrel)));
+ EXPECT_TRUE(reader.ValidEncoding(
+ DwarfPointerEncoding(dwarf2reader::DW_EH_PE_sdata4 |
+ dwarf2reader::DW_EH_PE_funcrel)));
+ EXPECT_TRUE(reader.ValidEncoding(
+ DwarfPointerEncoding(dwarf2reader::DW_EH_PE_sdata8 |
+ dwarf2reader::DW_EH_PE_funcrel)));
+ EXPECT_TRUE(reader.ValidEncoding(
+ DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect |
+ dwarf2reader::DW_EH_PE_absptr |
+ dwarf2reader::DW_EH_PE_pcrel)));
+ EXPECT_TRUE(reader.ValidEncoding(
+ DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect |
+ dwarf2reader::DW_EH_PE_uleb128 |
+ dwarf2reader::DW_EH_PE_pcrel)));
+ EXPECT_TRUE(reader.ValidEncoding(
+ DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect |
+ dwarf2reader::DW_EH_PE_udata2 |
+ dwarf2reader::DW_EH_PE_pcrel)));
+ EXPECT_TRUE(reader.ValidEncoding(
+ DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect |
+ dwarf2reader::DW_EH_PE_udata4 |
+ dwarf2reader::DW_EH_PE_pcrel)));
+ EXPECT_TRUE(reader.ValidEncoding(
+ DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect |
+ dwarf2reader::DW_EH_PE_udata8 |
+ dwarf2reader::DW_EH_PE_pcrel)));
+ EXPECT_TRUE(reader.ValidEncoding(
+ DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect |
+ dwarf2reader::DW_EH_PE_sleb128 |
+ dwarf2reader::DW_EH_PE_pcrel)));
+ EXPECT_TRUE(reader.ValidEncoding(
+ DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect |
+ dwarf2reader::DW_EH_PE_sdata2 |
+ dwarf2reader::DW_EH_PE_pcrel)));
+ EXPECT_TRUE(reader.ValidEncoding(
+ DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect |
+ dwarf2reader::DW_EH_PE_sdata4 |
+ dwarf2reader::DW_EH_PE_pcrel)));
+ EXPECT_TRUE(reader.ValidEncoding(
+ DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect |
+ dwarf2reader::DW_EH_PE_sdata8 |
+ dwarf2reader::DW_EH_PE_pcrel)));
+ EXPECT_TRUE(reader.ValidEncoding(
+ DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect |
+ dwarf2reader::DW_EH_PE_absptr |
+ dwarf2reader::DW_EH_PE_textrel)));
+ EXPECT_TRUE(reader.ValidEncoding(
+ DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect |
+ dwarf2reader::DW_EH_PE_uleb128 |
+ dwarf2reader::DW_EH_PE_textrel)));
+ EXPECT_TRUE(reader.ValidEncoding(
+ DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect |
+ dwarf2reader::DW_EH_PE_udata2 |
+ dwarf2reader::DW_EH_PE_textrel)));
+ EXPECT_TRUE(reader.ValidEncoding(
+ DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect |
+ dwarf2reader::DW_EH_PE_udata4 |
+ dwarf2reader::DW_EH_PE_textrel)));
+ EXPECT_TRUE(reader.ValidEncoding(
+ DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect |
+ dwarf2reader::DW_EH_PE_udata8 |
+ dwarf2reader::DW_EH_PE_textrel)));
+ EXPECT_TRUE(reader.ValidEncoding(
+ DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect |
+ dwarf2reader::DW_EH_PE_sleb128 |
+ dwarf2reader::DW_EH_PE_textrel)));
+ EXPECT_TRUE(reader.ValidEncoding(
+ DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect |
+ dwarf2reader::DW_EH_PE_sdata2 |
+ dwarf2reader::DW_EH_PE_textrel)));
+ EXPECT_TRUE(reader.ValidEncoding(
+ DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect |
+ dwarf2reader::DW_EH_PE_sdata4 |
+ dwarf2reader::DW_EH_PE_textrel)));
+ EXPECT_TRUE(reader.ValidEncoding(
+ DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect |
+ dwarf2reader::DW_EH_PE_sdata8 |
+ dwarf2reader::DW_EH_PE_textrel)));
+ EXPECT_TRUE(reader.ValidEncoding(
+ DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect |
+ dwarf2reader::DW_EH_PE_absptr |
+ dwarf2reader::DW_EH_PE_datarel)));
+ EXPECT_TRUE(reader.ValidEncoding(
+ DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect |
+ dwarf2reader::DW_EH_PE_uleb128 |
+ dwarf2reader::DW_EH_PE_datarel)));
+ EXPECT_TRUE(reader.ValidEncoding(
+ DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect |
+ dwarf2reader::DW_EH_PE_udata2 |
+ dwarf2reader::DW_EH_PE_datarel)));
+ EXPECT_TRUE(reader.ValidEncoding(
+ DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect |
+ dwarf2reader::DW_EH_PE_udata4 |
+ dwarf2reader::DW_EH_PE_datarel)));
+ EXPECT_TRUE(reader.ValidEncoding(
+ DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect |
+ dwarf2reader::DW_EH_PE_udata8 |
+ dwarf2reader::DW_EH_PE_datarel)));
+ EXPECT_TRUE(reader.ValidEncoding(
+ DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect |
+ dwarf2reader::DW_EH_PE_sleb128 |
+ dwarf2reader::DW_EH_PE_datarel)));
+ EXPECT_TRUE(reader.ValidEncoding(
+ DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect |
+ dwarf2reader::DW_EH_PE_sdata2 |
+ dwarf2reader::DW_EH_PE_datarel)));
+ EXPECT_TRUE(reader.ValidEncoding(
+ DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect |
+ dwarf2reader::DW_EH_PE_sdata4 |
+ dwarf2reader::DW_EH_PE_datarel)));
+ EXPECT_TRUE(reader.ValidEncoding(
+ DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect |
+ dwarf2reader::DW_EH_PE_sdata8 |
+ dwarf2reader::DW_EH_PE_datarel)));
+ EXPECT_TRUE(reader.ValidEncoding(
+ DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect |
+ dwarf2reader::DW_EH_PE_absptr |
+ dwarf2reader::DW_EH_PE_funcrel)));
+ EXPECT_TRUE(reader.ValidEncoding(
+ DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect |
+ dwarf2reader::DW_EH_PE_uleb128 |
+ dwarf2reader::DW_EH_PE_funcrel)));
+ EXPECT_TRUE(reader.ValidEncoding(
+ DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect |
+ dwarf2reader::DW_EH_PE_udata2 |
+ dwarf2reader::DW_EH_PE_funcrel)));
+ EXPECT_TRUE(reader.ValidEncoding(
+ DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect |
+ dwarf2reader::DW_EH_PE_udata4 |
+ dwarf2reader::DW_EH_PE_funcrel)));
+ EXPECT_TRUE(reader.ValidEncoding(
+ DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect |
+ dwarf2reader::DW_EH_PE_udata8 |
+ dwarf2reader::DW_EH_PE_funcrel)));
+ EXPECT_TRUE(reader.ValidEncoding(
+ DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect |
+ dwarf2reader::DW_EH_PE_sleb128 |
+ dwarf2reader::DW_EH_PE_funcrel)));
+ EXPECT_TRUE(reader.ValidEncoding(
+ DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect |
+ dwarf2reader::DW_EH_PE_sdata2 |
+ dwarf2reader::DW_EH_PE_funcrel)));
+ EXPECT_TRUE(reader.ValidEncoding(
+ DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect |
+ dwarf2reader::DW_EH_PE_sdata4 |
+ dwarf2reader::DW_EH_PE_funcrel)));
+ EXPECT_TRUE(reader.ValidEncoding(
+ DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect |
+ dwarf2reader::DW_EH_PE_sdata8 |
+ dwarf2reader::DW_EH_PE_funcrel)));
+
+ EXPECT_FALSE(reader.ValidEncoding(DwarfPointerEncoding(0x05)));
+ EXPECT_FALSE(reader.ValidEncoding(DwarfPointerEncoding(0x07)));
+ EXPECT_FALSE(reader.ValidEncoding(DwarfPointerEncoding(0x0d)));
+ EXPECT_FALSE(reader.ValidEncoding(DwarfPointerEncoding(0x0f)));
+ EXPECT_FALSE(reader.ValidEncoding(DwarfPointerEncoding(0x51)));
+ EXPECT_FALSE(reader.ValidEncoding(DwarfPointerEncoding(0x60)));
+ EXPECT_FALSE(reader.ValidEncoding(DwarfPointerEncoding(0x70)));
+ EXPECT_FALSE(reader.ValidEncoding(DwarfPointerEncoding(0xf0)));
+ EXPECT_FALSE(reader.ValidEncoding(DwarfPointerEncoding(0xd0)));
+}
+
+TEST_F(ReaderDeathTest, DW_EH_PE_omit) {
+ static const uint8_t data[] = { 42 };
+ ByteReader reader(ENDIANNESS_BIG);
+ reader.SetAddressSize(4);
+ EXPECT_DEATH(reader.ReadEncodedPointer(data, dwarf2reader::DW_EH_PE_omit,
+ &pointer_size),
+ "encoding != DW_EH_PE_omit");
+}
+
+TEST_F(Reader, DW_EH_PE_absptr4) {
+ static const uint8_t data[] = { 0x27, 0x57, 0xea, 0x40 };
+ ByteReader reader(ENDIANNESS_LITTLE);
+ reader.SetAddressSize(4);
+ EXPECT_EQ(0x40ea5727U,
+ reader.ReadEncodedPointer(data, dwarf2reader::DW_EH_PE_absptr,
+ &pointer_size));
+ EXPECT_EQ(4U, pointer_size);
+}
+
+TEST_F(Reader, DW_EH_PE_absptr8) {
+ static const uint8_t data[] = {
+ 0x60, 0x27, 0x57, 0xea, 0x40, 0xc2, 0x98, 0x05, 0x01, 0x50
+ };
+ ByteReader reader(ENDIANNESS_LITTLE);
+ reader.SetAddressSize(8);
+ EXPECT_EQ(0x010598c240ea5727ULL,
+ reader.ReadEncodedPointer(data + 1, dwarf2reader::DW_EH_PE_absptr,
+ &pointer_size));
+ EXPECT_EQ(8U, pointer_size);
+}
+
+TEST_F(Reader, DW_EH_PE_uleb128) {
+ static const uint8_t data[] = { 0x81, 0x84, 0x4c };
+ ByteReader reader(ENDIANNESS_LITTLE);
+ reader.SetAddressSize(4);
+ EXPECT_EQ(0x130201U,
+ reader.ReadEncodedPointer(data, dwarf2reader::DW_EH_PE_uleb128,
+ &pointer_size));
+ EXPECT_EQ(3U, pointer_size);
+}
+
+TEST_F(Reader, DW_EH_PE_udata2) {
+ static const uint8_t data[] = { 0xf4, 0x8d };
+ ByteReader reader(ENDIANNESS_BIG);
+ reader.SetAddressSize(4);
+ EXPECT_EQ(0xf48dU,
+ reader.ReadEncodedPointer(data, dwarf2reader::DW_EH_PE_udata2,
+ &pointer_size));
+ EXPECT_EQ(2U, pointer_size);
+}
+
+TEST_F(Reader, DW_EH_PE_udata4) {
+ static const uint8_t data[] = { 0xb2, 0x68, 0xa5, 0x62, 0x8f, 0x8b };
+ ByteReader reader(ENDIANNESS_BIG);
+ reader.SetAddressSize(8);
+ EXPECT_EQ(0xa5628f8b,
+ reader.ReadEncodedPointer(data + 2, dwarf2reader::DW_EH_PE_udata4,
+ &pointer_size));
+ EXPECT_EQ(4U, pointer_size);
+}
+
+TEST_F(Reader, DW_EH_PE_udata8Addr8) {
+ static const uint8_t data[] = {
+ 0x27, 0x04, 0x73, 0x04, 0x69, 0x9f, 0x19, 0xed, 0x8f, 0xfe
+ };
+ ByteReader reader(ENDIANNESS_LITTLE);
+ reader.SetAddressSize(8);
+ EXPECT_EQ(0x8fed199f69047304ULL,
+ reader.ReadEncodedPointer(data + 1, dwarf2reader::DW_EH_PE_udata8,
+ &pointer_size));
+ EXPECT_EQ(8U, pointer_size);
+}
+
+TEST_F(Reader, DW_EH_PE_udata8Addr4) {
+ static const uint8_t data[] = {
+ 0x27, 0x04, 0x73, 0x04, 0x69, 0x9f, 0x19, 0xed, 0x8f, 0xfe
+ };
+ ByteReader reader(ENDIANNESS_LITTLE);
+ reader.SetAddressSize(4);
+ EXPECT_EQ(0x69047304ULL,
+ reader.ReadEncodedPointer(data + 1, dwarf2reader::DW_EH_PE_udata8,
+ &pointer_size));
+ EXPECT_EQ(8U, pointer_size);
+}
+
+TEST_F(Reader, DW_EH_PE_sleb128) {
+ static const uint8_t data[] = { 0x42, 0xff, 0xfb, 0x73 };
+ ByteReader reader(ENDIANNESS_BIG);
+ reader.SetAddressSize(4);
+ EXPECT_EQ(-0x030201U & 0xffffffff,
+ reader.ReadEncodedPointer(data + 1, dwarf2reader::DW_EH_PE_sleb128,
+ &pointer_size));
+ EXPECT_EQ(3U, pointer_size);
+}
+
+TEST_F(Reader, DW_EH_PE_sdata2) {
+ static const uint8_t data[] = { 0xb9, 0xbf };
+ ByteReader reader(ENDIANNESS_LITTLE);
+ reader.SetAddressSize(8);
+ EXPECT_EQ(0xffffffffffffbfb9ULL,
+ reader.ReadEncodedPointer(data, dwarf2reader::DW_EH_PE_sdata2,
+ &pointer_size));
+ EXPECT_EQ(2U, pointer_size);
+}
+
+TEST_F(Reader, DW_EH_PE_sdata4) {
+ static const uint8_t data[] = { 0xa0, 0xca, 0xf2, 0xb8, 0xc2, 0xad };
+ ByteReader reader(ENDIANNESS_LITTLE);
+ reader.SetAddressSize(8);
+ EXPECT_EQ(0xffffffffadc2b8f2ULL,
+ reader.ReadEncodedPointer(data + 2, dwarf2reader::DW_EH_PE_sdata4,
+ &pointer_size));
+ EXPECT_EQ(4U, pointer_size);
+}
+
+TEST_F(Reader, DW_EH_PE_sdata8) {
+ static const uint8_t data[] = {
+ 0xf6, 0x66, 0x57, 0x79, 0xe0, 0x0c, 0x9b, 0x26, 0x87
+ };
+ ByteReader reader(ENDIANNESS_LITTLE);
+ reader.SetAddressSize(8);
+ EXPECT_EQ(0x87269b0ce0795766ULL,
+ reader.ReadEncodedPointer(data + 1, dwarf2reader::DW_EH_PE_sdata8,
+ &pointer_size));
+ EXPECT_EQ(8U, pointer_size);
+}
+
+TEST_F(Reader, DW_EH_PE_pcrel) {
+ static const uint8_t data[] = {
+ 0x4a, 0x8b, 0x1b, 0x14, 0xc8, 0xc4, 0x02, 0xce
+ };
+ ByteReader reader(ENDIANNESS_BIG);
+ reader.SetAddressSize(4);
+ DwarfPointerEncoding encoding =
+ DwarfPointerEncoding(dwarf2reader::DW_EH_PE_pcrel
+ | dwarf2reader::DW_EH_PE_absptr);
+ reader.SetCFIDataBase(0x89951377, data);
+ EXPECT_EQ(0x89951377 + 3 + 0x14c8c402,
+ reader.ReadEncodedPointer(data + 3, encoding, &pointer_size));
+ EXPECT_EQ(4U, pointer_size);
+}
+
+TEST_F(Reader, DW_EH_PE_textrel) {
+ static const uint8_t data[] = {
+ 0xd9, 0x0d, 0x05, 0x17, 0xc9, 0x7a, 0x42, 0x1e
+ };
+ ByteReader reader(ENDIANNESS_LITTLE);
+ reader.SetAddressSize(4);
+ reader.SetTextBase(0xb91beaf0);
+ DwarfPointerEncoding encoding =
+ DwarfPointerEncoding(dwarf2reader::DW_EH_PE_textrel
+ | dwarf2reader::DW_EH_PE_sdata2);
+ EXPECT_EQ((0xb91beaf0 + 0xffffc917) & 0xffffffff,
+ reader.ReadEncodedPointer(data + 3, encoding, &pointer_size));
+ EXPECT_EQ(2U, pointer_size);
+}
+
+TEST_F(Reader, DW_EH_PE_datarel) {
+ static const uint8_t data[] = {
+ 0x16, 0xf2, 0xbb, 0x82, 0x68, 0xa7, 0xbc, 0x39
+ };
+ ByteReader reader(ENDIANNESS_BIG);
+ reader.SetAddressSize(8);
+ reader.SetDataBase(0xbef308bd25ce74f0ULL);
+ DwarfPointerEncoding encoding =
+ DwarfPointerEncoding(dwarf2reader::DW_EH_PE_datarel
+ | dwarf2reader::DW_EH_PE_sleb128);
+ EXPECT_EQ(0xbef308bd25ce74f0ULL + 0xfffffffffffa013bULL,
+ reader.ReadEncodedPointer(data + 2, encoding, &pointer_size));
+ EXPECT_EQ(3U, pointer_size);
+}
+
+TEST_F(Reader, DW_EH_PE_funcrel) {
+ static const uint8_t data[] = {
+ 0x84, 0xf8, 0x14, 0x01, 0x61, 0xd1, 0x48, 0xc9
+ };
+ ByteReader reader(ENDIANNESS_BIG);
+ reader.SetAddressSize(4);
+ reader.SetFunctionBase(0x823c3520);
+ DwarfPointerEncoding encoding =
+ DwarfPointerEncoding(dwarf2reader::DW_EH_PE_funcrel
+ | dwarf2reader::DW_EH_PE_udata2);
+ EXPECT_EQ(0x823c3520 + 0xd148,
+ reader.ReadEncodedPointer(data + 5, encoding, &pointer_size));
+ EXPECT_EQ(2U, pointer_size);
+}
+
+TEST(UsableBase, CFI) {
+ static const uint8_t data[] = { 0x42 };
+ ByteReader reader(ENDIANNESS_BIG);
+ reader.SetCFIDataBase(0xb31cbd20, data);
+ EXPECT_TRUE(reader.UsableEncoding(dwarf2reader::DW_EH_PE_absptr));
+ EXPECT_TRUE(reader.UsableEncoding(dwarf2reader::DW_EH_PE_pcrel));
+ EXPECT_FALSE(reader.UsableEncoding(dwarf2reader::DW_EH_PE_textrel));
+ EXPECT_FALSE(reader.UsableEncoding(dwarf2reader::DW_EH_PE_datarel));
+ EXPECT_FALSE(reader.UsableEncoding(dwarf2reader::DW_EH_PE_funcrel));
+ EXPECT_FALSE(reader.UsableEncoding(dwarf2reader::DW_EH_PE_omit));
+ EXPECT_FALSE(reader.UsableEncoding(DwarfPointerEncoding(0x60)));
+}
+
+TEST(UsableBase, Text) {
+ ByteReader reader(ENDIANNESS_BIG);
+ reader.SetTextBase(0xa899ccb9);
+ EXPECT_TRUE(reader.UsableEncoding(dwarf2reader::DW_EH_PE_absptr));
+ EXPECT_FALSE(reader.UsableEncoding(dwarf2reader::DW_EH_PE_pcrel));
+ EXPECT_TRUE(reader.UsableEncoding(dwarf2reader::DW_EH_PE_textrel));
+ EXPECT_FALSE(reader.UsableEncoding(dwarf2reader::DW_EH_PE_datarel));
+ EXPECT_FALSE(reader.UsableEncoding(dwarf2reader::DW_EH_PE_funcrel));
+ EXPECT_FALSE(reader.UsableEncoding(dwarf2reader::DW_EH_PE_omit));
+ EXPECT_FALSE(reader.UsableEncoding(DwarfPointerEncoding(0x60)));
+}
+
+TEST(UsableBase, Data) {
+ ByteReader reader(ENDIANNESS_BIG);
+ reader.SetDataBase(0xf7b10bcd);
+ EXPECT_TRUE(reader.UsableEncoding(dwarf2reader::DW_EH_PE_absptr));
+ EXPECT_FALSE(reader.UsableEncoding(dwarf2reader::DW_EH_PE_pcrel));
+ EXPECT_FALSE(reader.UsableEncoding(dwarf2reader::DW_EH_PE_textrel));
+ EXPECT_TRUE(reader.UsableEncoding(dwarf2reader::DW_EH_PE_datarel));
+ EXPECT_FALSE(reader.UsableEncoding(dwarf2reader::DW_EH_PE_funcrel));
+ EXPECT_FALSE(reader.UsableEncoding(dwarf2reader::DW_EH_PE_omit));
+ EXPECT_FALSE(reader.UsableEncoding(DwarfPointerEncoding(0x60)));
+}
+
+TEST(UsableBase, Function) {
+ ByteReader reader(ENDIANNESS_BIG);
+ reader.SetFunctionBase(0xc2c0ed81);
+ EXPECT_TRUE(reader.UsableEncoding(dwarf2reader::DW_EH_PE_absptr));
+ EXPECT_FALSE(reader.UsableEncoding(dwarf2reader::DW_EH_PE_pcrel));
+ EXPECT_FALSE(reader.UsableEncoding(dwarf2reader::DW_EH_PE_textrel));
+ EXPECT_FALSE(reader.UsableEncoding(dwarf2reader::DW_EH_PE_datarel));
+ EXPECT_TRUE(reader.UsableEncoding(dwarf2reader::DW_EH_PE_funcrel));
+ EXPECT_FALSE(reader.UsableEncoding(dwarf2reader::DW_EH_PE_omit));
+ EXPECT_FALSE(reader.UsableEncoding(DwarfPointerEncoding(0x60)));
+}
+
+TEST(UsableBase, ClearFunction) {
+ ByteReader reader(ENDIANNESS_BIG);
+ reader.SetFunctionBase(0xc2c0ed81);
+ reader.ClearFunctionBase();
+ EXPECT_TRUE(reader.UsableEncoding(dwarf2reader::DW_EH_PE_absptr));
+ EXPECT_FALSE(reader.UsableEncoding(dwarf2reader::DW_EH_PE_pcrel));
+ EXPECT_FALSE(reader.UsableEncoding(dwarf2reader::DW_EH_PE_textrel));
+ EXPECT_FALSE(reader.UsableEncoding(dwarf2reader::DW_EH_PE_datarel));
+ EXPECT_FALSE(reader.UsableEncoding(dwarf2reader::DW_EH_PE_funcrel));
+ EXPECT_FALSE(reader.UsableEncoding(dwarf2reader::DW_EH_PE_omit));
+ EXPECT_FALSE(reader.UsableEncoding(DwarfPointerEncoding(0x60)));
+}
+
+struct AlignedFixture {
+ AlignedFixture() : reader(ENDIANNESS_BIG) { reader.SetAddressSize(4); }
+ static const uint8_t data[10];
+ ByteReader reader;
+ size_t pointer_size;
+};
+
+const uint8_t AlignedFixture::data[10] = {
+ 0xfe, 0x6e, 0x93, 0xd8, 0x34, 0xd5, 0x1c, 0xd3, 0xac, 0x2b
+};
+
+class Aligned: public AlignedFixture, public Test { };
+
+TEST_F(Aligned, DW_EH_PE_aligned0) {
+ reader.SetCFIDataBase(0xb440305c, data);
+ EXPECT_EQ(0xfe6e93d8U,
+ reader.ReadEncodedPointer(data, dwarf2reader::DW_EH_PE_aligned,
+ &pointer_size));
+ EXPECT_EQ(4U, pointer_size);
+}
+
+TEST_F(Aligned, DW_EH_PE_aligned1) {
+ reader.SetCFIDataBase(0xb440305d, data);
+ EXPECT_EQ(0xd834d51cU,
+ reader.ReadEncodedPointer(data, dwarf2reader::DW_EH_PE_aligned,
+ &pointer_size));
+ EXPECT_EQ(7U, pointer_size);
+}
+
+TEST_F(Aligned, DW_EH_PE_aligned2) {
+ reader.SetCFIDataBase(0xb440305e, data);
+ EXPECT_EQ(0x93d834d5U,
+ reader.ReadEncodedPointer(data, dwarf2reader::DW_EH_PE_aligned,
+ &pointer_size));
+ EXPECT_EQ(6U, pointer_size);
+}
+
+TEST_F(Aligned, DW_EH_PE_aligned3) {
+ reader.SetCFIDataBase(0xb440305f, data);
+ EXPECT_EQ(0x6e93d834U,
+ reader.ReadEncodedPointer(data, dwarf2reader::DW_EH_PE_aligned,
+ &pointer_size));
+ EXPECT_EQ(5U, pointer_size);
+}
+
+TEST_F(Aligned, DW_EH_PE_aligned11) {
+ reader.SetCFIDataBase(0xb4403061, data);
+ EXPECT_EQ(0xd834d51cU,
+ reader.ReadEncodedPointer(data + 1,
+ dwarf2reader::DW_EH_PE_aligned,
+ &pointer_size));
+ EXPECT_EQ(6U, pointer_size);
+}
+
+TEST_F(Aligned, DW_EH_PE_aligned30) {
+ reader.SetCFIDataBase(0xb4403063, data);
+ EXPECT_EQ(0x6e93d834U,
+ reader.ReadEncodedPointer(data + 1,
+ dwarf2reader::DW_EH_PE_aligned,
+ &pointer_size));
+ EXPECT_EQ(4U, pointer_size);
+}
+
+TEST_F(Aligned, DW_EH_PE_aligned23) {
+ reader.SetCFIDataBase(0xb4403062, data);
+ EXPECT_EQ(0x1cd3ac2bU,
+ reader.ReadEncodedPointer(data + 3,
+ dwarf2reader::DW_EH_PE_aligned,
+ &pointer_size));
+ EXPECT_EQ(7U, pointer_size);
+}
+
+TEST_F(Aligned, DW_EH_PE_aligned03) {
+ reader.SetCFIDataBase(0xb4403064, data);
+ EXPECT_EQ(0x34d51cd3U,
+ reader.ReadEncodedPointer(data + 3,
+ dwarf2reader::DW_EH_PE_aligned,
+ &pointer_size));
+ EXPECT_EQ(5U, pointer_size);
+}
diff --git a/3rdParty/Breakpad/src/common/dwarf/cfi_assembler.cc b/3rdParty/Breakpad/src/common/dwarf/cfi_assembler.cc
new file mode 100644
index 0000000..2dc2208
--- /dev/null
+++ b/3rdParty/Breakpad/src/common/dwarf/cfi_assembler.cc
@@ -0,0 +1,204 @@
+// Copyright (c) 2010, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// Original author: Jim Blandy <jimb@mozilla.com> <jimb@red-bean.com>
+
+// cfi_assembler.cc: Implementation of google_breakpad::CFISection class.
+// See cfi_assembler.h for details.
+
+#include "common/dwarf/cfi_assembler.h"
+
+#include <assert.h>
+#include <stdlib.h>
+
+namespace google_breakpad {
+
+using dwarf2reader::DwarfPointerEncoding;
+
+CFISection &CFISection::CIEHeader(uint64_t code_alignment_factor,
+ int data_alignment_factor,
+ unsigned return_address_register,
+ uint8_t version,
+ const string &augmentation,
+ bool dwarf64,
+ uint8_t address_size,
+ uint8_t segment_size) {
+ assert(!entry_length_);
+ entry_length_ = new PendingLength();
+ in_fde_ = false;
+
+ if (dwarf64) {
+ D32(kDwarf64InitialLengthMarker);
+ D64(entry_length_->length);
+ entry_length_->start = Here();
+ D64(eh_frame_ ? kEHFrame64CIEIdentifier : kDwarf64CIEIdentifier);
+ } else {
+ D32(entry_length_->length);
+ entry_length_->start = Here();
+ D32(eh_frame_ ? kEHFrame32CIEIdentifier : kDwarf32CIEIdentifier);
+ }
+ D8(version);
+ AppendCString(augmentation);
+ if (version >= 4) {
+ D8(address_size);
+ D8(segment_size);
+ }
+ ULEB128(code_alignment_factor);
+ LEB128(data_alignment_factor);
+ if (version == 1)
+ D8(return_address_register);
+ else
+ ULEB128(return_address_register);
+ return *this;
+}
+
+CFISection &CFISection::FDEHeader(Label cie_pointer,
+ uint64_t initial_location,
+ uint64_t address_range,
+ bool dwarf64) {
+ assert(!entry_length_);
+ entry_length_ = new PendingLength();
+ in_fde_ = true;
+ fde_start_address_ = initial_location;
+
+ if (dwarf64) {
+ D32(0xffffffff);
+ D64(entry_length_->length);
+ entry_length_->start = Here();
+ if (eh_frame_)
+ D64(Here() - cie_pointer);
+ else
+ D64(cie_pointer);
+ } else {
+ D32(entry_length_->length);
+ entry_length_->start = Here();
+ if (eh_frame_)
+ D32(Here() - cie_pointer);
+ else
+ D32(cie_pointer);
+ }
+ EncodedPointer(initial_location);
+ // The FDE length in an .eh_frame section uses the same encoding as the
+ // initial location, but ignores the base address (selected by the upper
+ // nybble of the encoding), as it's a length, not an address that can be
+ // made relative.
+ EncodedPointer(address_range,
+ DwarfPointerEncoding(pointer_encoding_ & 0x0f));
+ return *this;
+}
+
+CFISection &CFISection::FinishEntry() {
+ assert(entry_length_);
+ Align(address_size_, dwarf2reader::DW_CFA_nop);
+ entry_length_->length = Here() - entry_length_->start;
+ delete entry_length_;
+ entry_length_ = NULL;
+ in_fde_ = false;
+ return *this;
+}
+
+CFISection &CFISection::EncodedPointer(uint64_t address,
+ DwarfPointerEncoding encoding,
+ const EncodedPointerBases &bases) {
+ // Omitted data is extremely easy to emit.
+ if (encoding == dwarf2reader::DW_EH_PE_omit)
+ return *this;
+
+ // If (encoding & dwarf2reader::DW_EH_PE_indirect) != 0, then we assume
+ // that ADDRESS is the address at which the pointer is stored --- in
+ // other words, that bit has no effect on how we write the pointer.
+ encoding = DwarfPointerEncoding(encoding & ~dwarf2reader::DW_EH_PE_indirect);
+
+ // Find the base address to which this pointer is relative. The upper
+ // nybble of the encoding specifies this.
+ uint64_t base;
+ switch (encoding & 0xf0) {
+ case dwarf2reader::DW_EH_PE_absptr: base = 0; break;
+ case dwarf2reader::DW_EH_PE_pcrel: base = bases.cfi + Size(); break;
+ case dwarf2reader::DW_EH_PE_textrel: base = bases.text; break;
+ case dwarf2reader::DW_EH_PE_datarel: base = bases.data; break;
+ case dwarf2reader::DW_EH_PE_funcrel: base = fde_start_address_; break;
+ case dwarf2reader::DW_EH_PE_aligned: base = 0; break;
+ default: abort();
+ };
+
+ // Make ADDRESS relative. Yes, this is appropriate even for "absptr"
+ // values; see gcc/unwind-pe.h.
+ address -= base;
+
+ // Align the pointer, if required.
+ if ((encoding & 0xf0) == dwarf2reader::DW_EH_PE_aligned)
+ Align(AddressSize());
+
+ // Append ADDRESS to this section in the appropriate form. For the
+ // fixed-width forms, we don't need to differentiate between signed and
+ // unsigned encodings, because ADDRESS has already been extended to 64
+ // bits before it was passed to us.
+ switch (encoding & 0x0f) {
+ case dwarf2reader::DW_EH_PE_absptr:
+ Address(address);
+ break;
+
+ case dwarf2reader::DW_EH_PE_uleb128:
+ ULEB128(address);
+ break;
+
+ case dwarf2reader::DW_EH_PE_sleb128:
+ LEB128(address);
+ break;
+
+ case dwarf2reader::DW_EH_PE_udata2:
+ case dwarf2reader::DW_EH_PE_sdata2:
+ D16(address);
+ break;
+
+ case dwarf2reader::DW_EH_PE_udata4:
+ case dwarf2reader::DW_EH_PE_sdata4:
+ D32(address);
+ break;
+
+ case dwarf2reader::DW_EH_PE_udata8:
+ case dwarf2reader::DW_EH_PE_sdata8:
+ D64(address);
+ break;
+
+ default:
+ abort();
+ }
+
+ return *this;
+};
+
+const uint32_t CFISection::kDwarf64InitialLengthMarker;
+const uint32_t CFISection::kDwarf32CIEIdentifier;
+const uint64_t CFISection::kDwarf64CIEIdentifier;
+const uint32_t CFISection::kEHFrame32CIEIdentifier;
+const uint64_t CFISection::kEHFrame64CIEIdentifier;
+
+} // namespace google_breakpad
diff --git a/3rdParty/Breakpad/src/common/dwarf/cfi_assembler.h b/3rdParty/Breakpad/src/common/dwarf/cfi_assembler.h
new file mode 100644
index 0000000..bd7354d
--- /dev/null
+++ b/3rdParty/Breakpad/src/common/dwarf/cfi_assembler.h
@@ -0,0 +1,271 @@
+// -*- mode: C++ -*-
+
+// Copyright (c) 2010, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// Original author: Jim Blandy <jimb@mozilla.com> <jimb@red-bean.com>
+
+// cfi_assembler.h: Define CFISection, a class for creating properly
+// (and improperly) formatted DWARF CFI data for unit tests.
+
+#ifndef PROCESSOR_CFI_ASSEMBLER_H_
+#define PROCESSOR_CFI_ASSEMBLER_H_
+
+#include <string>
+
+#include "common/dwarf/dwarf2enums.h"
+#include "common/test_assembler.h"
+#include "common/using_std_string.h"
+#include "google_breakpad/common/breakpad_types.h"
+
+namespace google_breakpad {
+
+using dwarf2reader::DwarfPointerEncoding;
+using google_breakpad::test_assembler::Endianness;
+using google_breakpad::test_assembler::Label;
+using google_breakpad::test_assembler::Section;
+
+class CFISection: public Section {
+ public:
+
+ // CFI augmentation strings beginning with 'z', defined by the
+ // Linux/IA-64 C++ ABI, can specify interesting encodings for
+ // addresses appearing in FDE headers and call frame instructions (and
+ // for additional fields whose presence the augmentation string
+ // specifies). In particular, pointers can be specified to be relative
+ // to various base address: the start of the .text section, the
+ // location holding the address itself, and so on. These allow the
+ // frame data to be position-independent even when they live in
+ // write-protected pages. These variants are specified at the
+ // following two URLs:
+ //
+ // http://refspecs.linux-foundation.org/LSB_4.0.0/LSB-Core-generic/LSB-Core-generic/dwarfext.html
+ // http://refspecs.linux-foundation.org/LSB_4.0.0/LSB-Core-generic/LSB-Core-generic/ehframechpt.html
+ //
+ // CFISection leaves the production of well-formed 'z'-augmented CIEs and
+ // FDEs to the user, but does provide EncodedPointer, to emit
+ // properly-encoded addresses for a given pointer encoding.
+ // EncodedPointer uses an instance of this structure to find the base
+ // addresses it should use; you can establish a default for all encoded
+ // pointers appended to this section with SetEncodedPointerBases.
+ struct EncodedPointerBases {
+ EncodedPointerBases() : cfi(), text(), data() { }
+
+ // The starting address of this CFI section in memory, for
+ // DW_EH_PE_pcrel. DW_EH_PE_pcrel pointers may only be used in data
+ // that has is loaded into the program's address space.
+ uint64_t cfi;
+
+ // The starting address of this file's .text section, for DW_EH_PE_textrel.
+ uint64_t text;
+
+ // The starting address of this file's .got or .eh_frame_hdr section,
+ // for DW_EH_PE_datarel.
+ uint64_t data;
+ };
+
+ // Create a CFISection whose endianness is ENDIANNESS, and where
+ // machine addresses are ADDRESS_SIZE bytes long. If EH_FRAME is
+ // true, use the .eh_frame format, as described by the Linux
+ // Standards Base Core Specification, instead of the DWARF CFI
+ // format.
+ CFISection(Endianness endianness, size_t address_size,
+ bool eh_frame = false)
+ : Section(endianness), address_size_(address_size), eh_frame_(eh_frame),
+ pointer_encoding_(dwarf2reader::DW_EH_PE_absptr),
+ encoded_pointer_bases_(), entry_length_(NULL), in_fde_(false) {
+ // The 'start', 'Here', and 'Mark' members of a CFISection all refer
+ // to section offsets.
+ start() = 0;
+ }
+
+ // Return this CFISection's address size.
+ size_t AddressSize() const { return address_size_; }
+
+ // Return true if this CFISection uses the .eh_frame format, or
+ // false if it contains ordinary DWARF CFI data.
+ bool ContainsEHFrame() const { return eh_frame_; }
+
+ // Use ENCODING for pointers in calls to FDEHeader and EncodedPointer.
+ void SetPointerEncoding(DwarfPointerEncoding encoding) {
+ pointer_encoding_ = encoding;
+ }
+
+ // Use the addresses in BASES as the base addresses for encoded
+ // pointers in subsequent calls to FDEHeader or EncodedPointer.
+ // This function makes a copy of BASES.
+ void SetEncodedPointerBases(const EncodedPointerBases &bases) {
+ encoded_pointer_bases_ = bases;
+ }
+
+ // Append a Common Information Entry header to this section with the
+ // given values. If dwarf64 is true, use the 64-bit DWARF initial
+ // length format for the CIE's initial length. Return a reference to
+ // this section. You should call FinishEntry after writing the last
+ // instruction for the CIE.
+ //
+ // Before calling this function, you will typically want to use Mark
+ // or Here to make a label to pass to FDEHeader that refers to this
+ // CIE's position in the section.
+ CFISection &CIEHeader(uint64_t code_alignment_factor,
+ int data_alignment_factor,
+ unsigned return_address_register,
+ uint8_t version = 3,
+ const string &augmentation = "",
+ bool dwarf64 = false,
+ uint8_t address_size = 8,
+ uint8_t segment_size = 0);
+
+ // Append a Frame Description Entry header to this section with the
+ // given values. If dwarf64 is true, use the 64-bit DWARF initial
+ // length format for the CIE's initial length. Return a reference to
+ // this section. You should call FinishEntry after writing the last
+ // instruction for the CIE.
+ //
+ // This function doesn't support entries that are longer than
+ // 0xffffff00 bytes. (The "initial length" is always a 32-bit
+ // value.) Nor does it support .debug_frame sections longer than
+ // 0xffffff00 bytes.
+ CFISection &FDEHeader(Label cie_pointer,
+ uint64_t initial_location,
+ uint64_t address_range,
+ bool dwarf64 = false);
+
+ // Note the current position as the end of the last CIE or FDE we
+ // started, after padding with DW_CFA_nops for alignment. This
+ // defines the label representing the entry's length, cited in the
+ // entry's header. Return a reference to this section.
+ CFISection &FinishEntry();
+
+ // Append the contents of BLOCK as a DW_FORM_block value: an
+ // unsigned LEB128 length, followed by that many bytes of data.
+ CFISection &Block(const string &block) {
+ ULEB128(block.size());
+ Append(block);
+ return *this;
+ }
+
+ // Append ADDRESS to this section, in the appropriate size and
+ // endianness. Return a reference to this section.
+ CFISection &Address(uint64_t address) {
+ Section::Append(endianness(), address_size_, address);
+ return *this;
+ }
+ CFISection &Address(Label address) {
+ Section::Append(endianness(), address_size_, address);
+ return *this;
+ }
+
+ // Append ADDRESS to this section, using ENCODING and BASES. ENCODING
+ // defaults to this section's default encoding, established by
+ // SetPointerEncoding. BASES defaults to this section's bases, set by
+ // SetEncodedPointerBases. If the DW_EH_PE_indirect bit is set in the
+ // encoding, assume that ADDRESS is where the true address is stored.
+ // Return a reference to this section.
+ //
+ // (C++ doesn't let me use default arguments here, because I want to
+ // refer to members of *this in the default argument expression.)
+ CFISection &EncodedPointer(uint64_t address) {
+ return EncodedPointer(address, pointer_encoding_, encoded_pointer_bases_);
+ }
+ CFISection &EncodedPointer(uint64_t address, DwarfPointerEncoding encoding) {
+ return EncodedPointer(address, encoding, encoded_pointer_bases_);
+ }
+ CFISection &EncodedPointer(uint64_t address, DwarfPointerEncoding encoding,
+ const EncodedPointerBases &bases);
+
+ // Restate some member functions, to keep chaining working nicely.
+ CFISection &Mark(Label *label) { Section::Mark(label); return *this; }
+ CFISection &D8(uint8_t v) { Section::D8(v); return *this; }
+ CFISection &D16(uint16_t v) { Section::D16(v); return *this; }
+ CFISection &D16(Label v) { Section::D16(v); return *this; }
+ CFISection &D32(uint32_t v) { Section::D32(v); return *this; }
+ CFISection &D32(const Label &v) { Section::D32(v); return *this; }
+ CFISection &D64(uint64_t v) { Section::D64(v); return *this; }
+ CFISection &D64(const Label &v) { Section::D64(v); return *this; }
+ CFISection &LEB128(long long v) { Section::LEB128(v); return *this; }
+ CFISection &ULEB128(uint64_t v) { Section::ULEB128(v); return *this; }
+
+ private:
+ // A length value that we've appended to the section, but is not yet
+ // known. LENGTH is the appended value; START is a label referring
+ // to the start of the data whose length was cited.
+ struct PendingLength {
+ Label length;
+ Label start;
+ };
+
+ // Constants used in CFI/.eh_frame data:
+
+ // If the first four bytes of an "initial length" are this constant, then
+ // the data uses the 64-bit DWARF format, and the length itself is the
+ // subsequent eight bytes.
+ static const uint32_t kDwarf64InitialLengthMarker = 0xffffffffU;
+
+ // The CIE identifier for 32- and 64-bit DWARF CFI and .eh_frame data.
+ static const uint32_t kDwarf32CIEIdentifier = ~(uint32_t)0;
+ static const uint64_t kDwarf64CIEIdentifier = ~(uint64_t)0;
+ static const uint32_t kEHFrame32CIEIdentifier = 0;
+ static const uint64_t kEHFrame64CIEIdentifier = 0;
+
+ // The size of a machine address for the data in this section.
+ size_t address_size_;
+
+ // If true, we are generating a Linux .eh_frame section, instead of
+ // a standard DWARF .debug_frame section.
+ bool eh_frame_;
+
+ // The encoding to use for FDE pointers.
+ DwarfPointerEncoding pointer_encoding_;
+
+ // The base addresses to use when emitting encoded pointers.
+ EncodedPointerBases encoded_pointer_bases_;
+
+ // The length value for the current entry.
+ //
+ // Oddly, this must be dynamically allocated. Labels never get new
+ // values; they only acquire constraints on the value they already
+ // have, or assert if you assign them something incompatible. So
+ // each header needs truly fresh Label objects to cite in their
+ // headers and track their positions. The alternative is explicit
+ // destructor invocation and a placement new. Ick.
+ PendingLength *entry_length_;
+
+ // True if we are currently emitting an FDE --- that is, we have
+ // called FDEHeader but have not yet called FinishEntry.
+ bool in_fde_;
+
+ // If in_fde_ is true, this is its starting address. We use this for
+ // emitting DW_EH_PE_funcrel pointers.
+ uint64_t fde_start_address_;
+};
+
+} // namespace google_breakpad
+
+#endif // PROCESSOR_CFI_ASSEMBLER_H_
diff --git a/3rdParty/Breakpad/src/common/dwarf/dwarf2diehandler.cc b/3rdParty/Breakpad/src/common/dwarf/dwarf2diehandler.cc
index c741d69..94542b5 100644
--- a/3rdParty/Breakpad/src/common/dwarf/dwarf2diehandler.cc
+++ b/3rdParty/Breakpad/src/common/dwarf/dwarf2diehandler.cc
@@ -32,6 +32,7 @@
// See dwarf2diehandler.h for details.
#include <assert.h>
+#include <stdint.h>
#include <string>
@@ -57,8 +58,7 @@ bool DIEDispatcher::StartCompilationUnit(uint64 offset, uint8 address_size,
dwarf_version);
}
-bool DIEDispatcher::StartDIE(uint64 offset, enum DwarfTag tag,
- const AttributeList& attrs) {
+bool DIEDispatcher::StartDIE(uint64 offset, enum DwarfTag tag) {
// The stack entry for the parent of this DIE, if there is one.
HandlerStack *parent = die_handlers_.empty() ? NULL : &die_handlers_.top();
@@ -82,7 +82,7 @@ bool DIEDispatcher::StartDIE(uint64 offset, enum DwarfTag tag,
if (parent) {
if (parent->handler_)
// Ask the parent to find a handler.
- handler = parent->handler_->FindChildHandler(offset, tag, attrs);
+ handler = parent->handler_->FindChildHandler(offset, tag);
else
// No parent handler means we're not interested in any of our
// children.
@@ -92,7 +92,7 @@ bool DIEDispatcher::StartDIE(uint64 offset, enum DwarfTag tag,
// decides whether to visit it, but the root DIE has no parent
// handler, so we have a special method on the root DIE handler
// itself to decide.
- if (root_handler_->StartRootDIE(offset, tag, attrs))
+ if (root_handler_->StartRootDIE(offset, tag))
handler = root_handler_;
else
handler = NULL;
@@ -168,7 +168,7 @@ void DIEDispatcher::ProcessAttributeReference(uint64 offset,
void DIEDispatcher::ProcessAttributeBuffer(uint64 offset,
enum DwarfAttribute attr,
enum DwarfForm form,
- const char* data,
+ const uint8_t *data,
uint64 len) {
HandlerStack &current = die_handlers_.top();
// This had better be an attribute of the DIE we were meant to handle.
diff --git a/3rdParty/Breakpad/src/common/dwarf/dwarf2diehandler.h b/3rdParty/Breakpad/src/common/dwarf/dwarf2diehandler.h
index 12b8d3a..a1e589a 100644
--- a/3rdParty/Breakpad/src/common/dwarf/dwarf2diehandler.h
+++ b/3rdParty/Breakpad/src/common/dwarf/dwarf2diehandler.h
@@ -156,6 +156,8 @@
#ifndef COMMON_DWARF_DWARF2DIEHANDLER_H__
#define COMMON_DWARF_DWARF2DIEHANDLER_H__
+#include <stdint.h>
+
#include <stack>
#include <string>
@@ -206,7 +208,7 @@ class DIEHandler {
uint64 data) { }
virtual void ProcessAttributeBuffer(enum DwarfAttribute attr,
enum DwarfForm form,
- const char* data,
+ const uint8_t *data,
uint64 len) { }
virtual void ProcessAttributeString(enum DwarfAttribute attr,
enum DwarfForm form,
@@ -239,12 +241,10 @@ class DIEHandler {
// that child DIE (and all its descendants).
//
// OFFSET is the offset of the child; TAG indicates what kind of DIE
- // it is; and ATTRS is the list of attributes the DIE will have, and
- // their forms (their values are not provided).
+ // it is.
//
// The default definition skips all children.
- virtual DIEHandler *FindChildHandler(uint64 offset, enum DwarfTag tag,
- const AttributeList &attrs) {
+ virtual DIEHandler *FindChildHandler(uint64 offset, enum DwarfTag tag) {
return NULL;
}
@@ -280,8 +280,7 @@ class RootDIEHandler: public DIEHandler {
// unit.
//
// The default definition elects to visit the root DIE.
- virtual bool StartRootDIE(uint64 offset, enum DwarfTag tag,
- const AttributeList& attrs) { return true; }
+ virtual bool StartRootDIE(uint64 offset, enum DwarfTag tag) { return true; }
};
class DIEDispatcher: public Dwarf2Handler {
@@ -296,8 +295,7 @@ class DIEDispatcher: public Dwarf2Handler {
bool StartCompilationUnit(uint64 offset, uint8 address_size,
uint8 offset_size, uint64 cu_length,
uint8 dwarf_version);
- bool StartDIE(uint64 offset, enum DwarfTag tag,
- const AttributeList &attrs);
+ bool StartDIE(uint64 offset, enum DwarfTag tag);
void ProcessAttributeUnsigned(uint64 offset,
enum DwarfAttribute attr,
enum DwarfForm form,
@@ -313,7 +311,7 @@ class DIEDispatcher: public Dwarf2Handler {
void ProcessAttributeBuffer(uint64 offset,
enum DwarfAttribute attr,
enum DwarfForm form,
- const char* data,
+ const uint8_t *data,
uint64 len);
void ProcessAttributeString(uint64 offset,
enum DwarfAttribute attr,
diff --git a/3rdParty/Breakpad/src/common/dwarf/dwarf2diehandler_unittest.cc b/3rdParty/Breakpad/src/common/dwarf/dwarf2diehandler_unittest.cc
new file mode 100644
index 0000000..db70eb3
--- /dev/null
+++ b/3rdParty/Breakpad/src/common/dwarf/dwarf2diehandler_unittest.cc
@@ -0,0 +1,527 @@
+// -*- mode: c++ -*-
+
+// Copyright (c) 2010 Google Inc. All Rights Reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// Original author: Jim Blandy <jimb@mozilla.com> <jimb@red-bean.com>
+
+// dwarf2diehander_unittest.cc: Unit tests for google_breakpad::DIEDispatcher.
+
+#include <stdint.h>
+
+#include <string>
+#include <utility>
+
+#include "breakpad_googletest_includes.h"
+
+#include "common/dwarf/dwarf2diehandler.h"
+#include "common/using_std_string.h"
+
+using std::make_pair;
+
+using ::testing::_;
+using ::testing::ContainerEq;
+using ::testing::ElementsAreArray;
+using ::testing::Eq;
+using ::testing::InSequence;
+using ::testing::Return;
+using ::testing::Sequence;
+using ::testing::StrEq;
+
+using dwarf2reader::DIEDispatcher;
+using dwarf2reader::DIEHandler;
+using dwarf2reader::DwarfAttribute;
+using dwarf2reader::DwarfForm;
+using dwarf2reader::DwarfTag;
+using dwarf2reader::RootDIEHandler;
+
+class MockDIEHandler: public DIEHandler {
+ public:
+ MOCK_METHOD3(ProcessAttributeUnsigned,
+ void(DwarfAttribute, DwarfForm, uint64));
+ MOCK_METHOD3(ProcessAttributeSigned,
+ void(DwarfAttribute, DwarfForm, int64));
+ MOCK_METHOD3(ProcessAttributeReference,
+ void(DwarfAttribute, DwarfForm, uint64));
+ MOCK_METHOD4(ProcessAttributeBuffer,
+ void(DwarfAttribute, DwarfForm, const uint8_t *, uint64));
+ MOCK_METHOD3(ProcessAttributeString,
+ void(DwarfAttribute, DwarfForm, const string &));
+ MOCK_METHOD3(ProcessAttributeSignature,
+ void(DwarfAttribute, DwarfForm, uint64));
+ MOCK_METHOD0(EndAttributes, bool());
+ MOCK_METHOD2(FindChildHandler, DIEHandler *(uint64, DwarfTag));
+ MOCK_METHOD0(Finish, void());
+};
+
+class MockRootDIEHandler: public RootDIEHandler {
+ public:
+ MOCK_METHOD3(ProcessAttributeUnsigned,
+ void(DwarfAttribute, DwarfForm, uint64));
+ MOCK_METHOD3(ProcessAttributeSigned,
+ void(DwarfAttribute, DwarfForm, int64));
+ MOCK_METHOD3(ProcessAttributeReference,
+ void(DwarfAttribute, DwarfForm, uint64));
+ MOCK_METHOD4(ProcessAttributeBuffer,
+ void(DwarfAttribute, DwarfForm, const uint8_t *, uint64));
+ MOCK_METHOD3(ProcessAttributeString,
+ void(DwarfAttribute, DwarfForm, const string &));
+ MOCK_METHOD3(ProcessAttributeSignature,
+ void(DwarfAttribute, DwarfForm, uint64));
+ MOCK_METHOD0(EndAttributes, bool());
+ MOCK_METHOD2(FindChildHandler, DIEHandler *(uint64, DwarfTag));
+ MOCK_METHOD0(Finish, void());
+ MOCK_METHOD5(StartCompilationUnit, bool(uint64, uint8, uint8, uint64, uint8));
+ MOCK_METHOD2(StartRootDIE, bool(uint64, DwarfTag));
+};
+
+// If the handler elects to skip the compilation unit, the dispatcher
+// should tell the reader so.
+TEST(Dwarf2DIEHandler, SkipCompilationUnit) {
+ Sequence s;
+ MockRootDIEHandler mock_root_handler;
+ DIEDispatcher die_dispatcher(&mock_root_handler);
+
+ EXPECT_CALL(mock_root_handler,
+ StartCompilationUnit(0x8d42aed77cfccf3eLL,
+ 0x89, 0xdc,
+ 0x2ecb4dc778a80f21LL,
+ 0x66))
+ .InSequence(s)
+ .WillOnce(Return(false));
+
+ EXPECT_FALSE(die_dispatcher.StartCompilationUnit(0x8d42aed77cfccf3eLL,
+ 0x89, 0xdc,
+ 0x2ecb4dc778a80f21LL,
+ 0x66));
+}
+
+// If the handler elects to skip the root DIE, the dispatcher should
+// tell the reader so.
+TEST(Dwarf2DIEHandler, SkipRootDIE) {
+ Sequence s;
+ MockRootDIEHandler mock_root_handler;
+ DIEDispatcher die_dispatcher(&mock_root_handler);
+
+ EXPECT_CALL(mock_root_handler,
+ StartCompilationUnit(0xde8994029fc8b999LL, 0xf4, 0x02,
+ 0xb00febffa76e2b2bLL, 0x5c))
+ .InSequence(s)
+ .WillOnce(Return(true));
+ EXPECT_CALL(mock_root_handler,
+ StartRootDIE(0x7d08242b4b510cf2LL, (DwarfTag) 0xb4f98da6))
+ .InSequence(s)
+ .WillOnce(Return(false));
+
+ EXPECT_TRUE(die_dispatcher.StartCompilationUnit(0xde8994029fc8b999LL,
+ 0xf4, 0x02,
+ 0xb00febffa76e2b2bLL, 0x5c));
+ EXPECT_FALSE(die_dispatcher.StartDIE(0x7d08242b4b510cf2LL,
+ (DwarfTag) 0xb4f98da6));
+ die_dispatcher.EndDIE(0x7d08242b4b510cf2LL);
+}
+
+// If the handler elects to skip the root DIE's children, the
+// dispatcher should tell the reader so --- and avoid deleting the
+// root handler.
+TEST(Dwarf2DIEHandler, SkipRootDIEChildren) {
+ MockRootDIEHandler mock_root_handler;
+ DIEDispatcher die_dispatcher(&mock_root_handler);
+
+ {
+ InSequence s;
+
+ EXPECT_CALL(mock_root_handler,
+ StartCompilationUnit(0x15d6897480cc65a7LL, 0x26, 0xa0,
+ 0x09f8bf0767f91675LL, 0xdb))
+ .WillOnce(Return(true));
+ EXPECT_CALL(mock_root_handler,
+ StartRootDIE(0x7d08242b4b510cf2LL, (DwarfTag) 0xb4f98da6))
+ .WillOnce(Return(true));
+ // Please don't tell me about my children.
+ EXPECT_CALL(mock_root_handler, EndAttributes())
+ .WillOnce(Return(false));
+ EXPECT_CALL(mock_root_handler, Finish())
+ .WillOnce(Return());
+ }
+
+ EXPECT_TRUE(die_dispatcher.StartCompilationUnit(0x15d6897480cc65a7LL,
+ 0x26, 0xa0,
+ 0x09f8bf0767f91675LL, 0xdb));
+ EXPECT_TRUE(die_dispatcher.StartDIE(0x7d08242b4b510cf2LL,
+ (DwarfTag) 0xb4f98da6));
+ EXPECT_FALSE(die_dispatcher.StartDIE(0x435150ceedccda18LL,
+ (DwarfTag) 0xc3a17bba));
+ die_dispatcher.EndDIE(0x435150ceedccda18LL);
+ die_dispatcher.EndDIE(0x7d08242b4b510cf2LL);
+}
+
+// The dispatcher should pass attribute values through to the die
+// handler accurately.
+TEST(Dwarf2DIEHandler, PassAttributeValues) {
+ MockRootDIEHandler mock_root_handler;
+ DIEDispatcher die_dispatcher(&mock_root_handler);
+
+ const uint8_t buffer[10] = {
+ 0x24, 0x24, 0x35, 0x9a, 0xca, 0xcf, 0xa8, 0x84, 0xa7, 0x18
+ };
+ string str = "\xc8\x26\x2e\x0d\xa4\x9c\x37\xd6\xfb\x1d";
+
+ // Set expectations.
+ {
+ InSequence s;
+
+ // We'll like the compilation unit header.
+ EXPECT_CALL(mock_root_handler,
+ StartCompilationUnit(0x8d42aed77cfccf3eLL, 0x89, 0xdc,
+ 0x2ecb4dc778a80f21LL, 0x66))
+ .WillOnce(Return(true));
+
+ // We'll like the root DIE.
+ EXPECT_CALL(mock_root_handler,
+ StartRootDIE(0xe2222da01e29f2a9LL, (DwarfTag) 0x9829445c))
+ .WillOnce(Return(true));
+
+ // Expect some attribute values.
+ EXPECT_CALL(mock_root_handler,
+ ProcessAttributeUnsigned((DwarfAttribute) 0x1cc0bfed,
+ (DwarfForm) 0x424f1468,
+ 0xa592571997facda1ULL))
+ .WillOnce(Return());
+ EXPECT_CALL(mock_root_handler,
+ ProcessAttributeSigned((DwarfAttribute) 0x43694dc9,
+ (DwarfForm) 0xf6f78901L,
+ 0x92602a4e3bf1f446LL))
+ .WillOnce(Return());
+ EXPECT_CALL(mock_root_handler,
+ ProcessAttributeReference((DwarfAttribute) 0x4033e8cL,
+ (DwarfForm) 0xf66fbe0bL,
+ 0x50fddef44734fdecULL))
+ .WillOnce(Return());
+ EXPECT_CALL(mock_root_handler,
+ ProcessAttributeBuffer((DwarfAttribute) 0x25d7e0af,
+ (DwarfForm) 0xe99a539a,
+ buffer, sizeof(buffer)))
+ .WillOnce(Return());
+ EXPECT_CALL(mock_root_handler,
+ ProcessAttributeString((DwarfAttribute) 0x310ed065,
+ (DwarfForm) 0x15762fec,
+ StrEq(str)))
+ .WillOnce(Return());
+ EXPECT_CALL(mock_root_handler,
+ ProcessAttributeSignature((DwarfAttribute) 0x58790d72,
+ (DwarfForm) 0x4159f138,
+ 0x94682463613e6a5fULL))
+ .WillOnce(Return());
+ EXPECT_CALL(mock_root_handler, EndAttributes())
+ .WillOnce(Return(true));
+ EXPECT_CALL(mock_root_handler, FindChildHandler(_, _))
+ .Times(0);
+ EXPECT_CALL(mock_root_handler, Finish())
+ .WillOnce(Return());
+ }
+
+ // Drive the dispatcher.
+
+ // Report the CU header.
+ EXPECT_TRUE(die_dispatcher.StartCompilationUnit(0x8d42aed77cfccf3eLL,
+ 0x89, 0xdc,
+ 0x2ecb4dc778a80f21LL,
+ 0x66));
+ // Report the root DIE.
+ EXPECT_TRUE(die_dispatcher.StartDIE(0xe2222da01e29f2a9LL,
+ (DwarfTag) 0x9829445c));
+
+ // Report some attribute values.
+ die_dispatcher.ProcessAttributeUnsigned(0xe2222da01e29f2a9LL,
+ (DwarfAttribute) 0x1cc0bfed,
+ (DwarfForm) 0x424f1468,
+ 0xa592571997facda1ULL);
+ die_dispatcher.ProcessAttributeSigned(0xe2222da01e29f2a9LL,
+ (DwarfAttribute) 0x43694dc9,
+ (DwarfForm) 0xf6f78901,
+ 0x92602a4e3bf1f446LL);
+ die_dispatcher.ProcessAttributeReference(0xe2222da01e29f2a9LL,
+ (DwarfAttribute) 0x4033e8c,
+ (DwarfForm) 0xf66fbe0b,
+ 0x50fddef44734fdecULL);
+ die_dispatcher.ProcessAttributeBuffer(0xe2222da01e29f2a9LL,
+ (DwarfAttribute) 0x25d7e0af,
+ (DwarfForm) 0xe99a539a,
+ buffer, sizeof(buffer));
+ die_dispatcher.ProcessAttributeString(0xe2222da01e29f2a9LL,
+ (DwarfAttribute) 0x310ed065,
+ (DwarfForm) 0x15762fec,
+ str);
+ die_dispatcher.ProcessAttributeSignature(0xe2222da01e29f2a9LL,
+ (DwarfAttribute) 0x58790d72,
+ (DwarfForm) 0x4159f138,
+ 0x94682463613e6a5fULL);
+
+ // Finish the root DIE (and thus the CU).
+ die_dispatcher.EndDIE(0xe2222da01e29f2a9LL);
+}
+
+TEST(Dwarf2DIEHandler, FindAndSkipChildren) {
+ MockRootDIEHandler mock_root_handler;
+ MockDIEHandler *mock_child1_handler = new(MockDIEHandler);
+ MockDIEHandler *mock_child3_handler = new(MockDIEHandler);
+ DIEDispatcher die_dispatcher(&mock_root_handler);
+
+ {
+ InSequence s;
+
+ // We'll like the compilation unit header.
+ EXPECT_CALL(mock_root_handler,
+ StartCompilationUnit(0x9ec1e6d05e434a0eLL, 0xeb, 0x21,
+ 0x47dd3c764275a216LL, 0xa5))
+ .WillOnce(Return(true));
+
+ // Root DIE.
+ {
+ EXPECT_CALL(mock_root_handler,
+ StartRootDIE(0x15f0e06bdfe3c372LL, (DwarfTag) 0xf5d60c59))
+ .WillOnce(Return(true));
+ EXPECT_CALL(mock_root_handler,
+ ProcessAttributeSigned((DwarfAttribute) 0xf779a642,
+ (DwarfForm) 0x2cb63027,
+ 0x18e744661769d08fLL))
+ .WillOnce(Return());
+ EXPECT_CALL(mock_root_handler, EndAttributes())
+ .WillOnce(Return(true));
+
+ // First child DIE.
+ EXPECT_CALL(mock_root_handler,
+ FindChildHandler(0x149f644f8116fe8cLL,
+ (DwarfTag) 0xac2cbd8c))
+ .WillOnce(Return(mock_child1_handler));
+ {
+ EXPECT_CALL(*mock_child1_handler,
+ ProcessAttributeSigned((DwarfAttribute) 0xa6fd6f65,
+ (DwarfForm) 0xe4f64c41,
+ 0x1b04e5444a55fe67LL))
+ .WillOnce(Return());
+ EXPECT_CALL(*mock_child1_handler, EndAttributes())
+ .WillOnce(Return(false));
+ // Skip first grandchild DIE and first great-grandchild DIE.
+ EXPECT_CALL(*mock_child1_handler, Finish())
+ .WillOnce(Return());
+ }
+
+ // Second child DIE. Root handler will decline to return a handler
+ // for this child.
+ EXPECT_CALL(mock_root_handler,
+ FindChildHandler(0x97412be24875de9dLL,
+ (DwarfTag) 0x505a068b))
+ .WillOnce(Return((DIEHandler *) NULL));
+
+ // Third child DIE.
+ EXPECT_CALL(mock_root_handler,
+ FindChildHandler(0x753c964c8ab538aeLL,
+ (DwarfTag) 0x8c22970e))
+ .WillOnce(Return(mock_child3_handler));
+ {
+ EXPECT_CALL(*mock_child3_handler,
+ ProcessAttributeSigned((DwarfAttribute) 0x4e2b7cfb,
+ (DwarfForm) 0x610b7ae1,
+ 0x3ea5c609d7d7560fLL))
+ .WillOnce(Return());
+ EXPECT_CALL(*mock_child3_handler, EndAttributes())
+ .WillOnce(Return(true));
+ EXPECT_CALL(*mock_child3_handler, Finish())
+ .WillOnce(Return());
+ }
+
+ EXPECT_CALL(mock_root_handler, Finish())
+ .WillOnce(Return());
+ }
+ }
+
+
+ // Drive the dispatcher.
+
+ // Report the CU header.
+ EXPECT_TRUE(die_dispatcher
+ .StartCompilationUnit(0x9ec1e6d05e434a0eLL, 0xeb, 0x21,
+ 0x47dd3c764275a216LL, 0xa5));
+ // Report the root DIE.
+ {
+ EXPECT_TRUE(die_dispatcher.StartDIE(0x15f0e06bdfe3c372LL,
+ (DwarfTag) 0xf5d60c59));
+ die_dispatcher.ProcessAttributeSigned(0x15f0e06bdfe3c372LL,
+ (DwarfAttribute) 0xf779a642,
+ (DwarfForm) 0x2cb63027,
+ 0x18e744661769d08fLL);
+
+ // First child DIE.
+ {
+ EXPECT_TRUE(die_dispatcher.StartDIE(0x149f644f8116fe8cLL,
+ (DwarfTag) 0xac2cbd8c));
+ die_dispatcher.ProcessAttributeSigned(0x149f644f8116fe8cLL,
+ (DwarfAttribute) 0xa6fd6f65,
+ (DwarfForm) 0xe4f64c41,
+ 0x1b04e5444a55fe67LL);
+
+ // First grandchild DIE. Will be skipped.
+ {
+ EXPECT_FALSE(die_dispatcher.StartDIE(0xd68de1ee0bd29419LL,
+ (DwarfTag) 0x22f05a15));
+ // First great-grandchild DIE. Will be skipped without being
+ // mentioned to any handler.
+ {
+ EXPECT_FALSE(die_dispatcher
+ .StartDIE(0xb3076285d25cac25LL,
+ (DwarfTag) 0xcff4061b));
+ die_dispatcher.EndDIE(0xb3076285d25cac25LL);
+ }
+ die_dispatcher.EndDIE(0xd68de1ee0bd29419LL);
+ }
+ die_dispatcher.EndDIE(0x149f644f8116fe8cLL);
+ }
+
+ // Second child DIE. Root handler will decline to find a handler for it.
+ {
+ EXPECT_FALSE(die_dispatcher.StartDIE(0x97412be24875de9dLL,
+ (DwarfTag) 0x505a068b));
+ die_dispatcher.EndDIE(0x97412be24875de9dLL);
+ }
+
+ // Third child DIE.
+ {
+ EXPECT_TRUE(die_dispatcher.StartDIE(0x753c964c8ab538aeLL,
+ (DwarfTag) 0x8c22970e));
+ die_dispatcher.ProcessAttributeSigned(0x753c964c8ab538aeLL,
+ (DwarfAttribute) 0x4e2b7cfb,
+ (DwarfForm) 0x610b7ae1,
+ 0x3ea5c609d7d7560fLL);
+ die_dispatcher.EndDIE(0x753c964c8ab538aeLL);
+ }
+
+ // Finish the root DIE (and thus the CU).
+ die_dispatcher.EndDIE(0x15f0e06bdfe3c372LL);
+ }
+}
+
+// The DIEDispatcher destructor is supposed to delete all handlers on
+// the stack, except for the root.
+TEST(Dwarf2DIEHandler, FreeHandlersOnStack) {
+ MockRootDIEHandler mock_root_handler;
+ MockDIEHandler *mock_child_handler = new(MockDIEHandler);
+ MockDIEHandler *mock_grandchild_handler = new(MockDIEHandler);
+
+ {
+ InSequence s;
+
+ // We'll like the compilation unit header.
+ EXPECT_CALL(mock_root_handler,
+ StartCompilationUnit(0x87b41ba8381cd71cLL, 0xff, 0x89,
+ 0x76d392ff393ddda2LL, 0xbf))
+ .WillOnce(Return(true));
+
+ // Root DIE.
+ {
+ EXPECT_CALL(mock_root_handler,
+ StartRootDIE(0xbf13b761691ddc91LL, (DwarfTag) 0x98980361))
+ .WillOnce(Return(true));
+ EXPECT_CALL(mock_root_handler, EndAttributes())
+ .WillOnce(Return(true));
+
+ // Child DIE.
+ EXPECT_CALL(mock_root_handler,
+ FindChildHandler(0x058f09240c5fc8c9LL,
+ (DwarfTag) 0x898bf0d0))
+ .WillOnce(Return(mock_child_handler));
+ {
+ EXPECT_CALL(*mock_child_handler, EndAttributes())
+ .WillOnce(Return(true));
+
+ // Grandchild DIE.
+ EXPECT_CALL(*mock_child_handler,
+ FindChildHandler(0x32dc00c9945dc0c8LL,
+ (DwarfTag) 0x2802d007))
+ .WillOnce(Return(mock_grandchild_handler));
+ {
+ EXPECT_CALL(*mock_grandchild_handler,
+ ProcessAttributeSigned((DwarfAttribute) 0x4e2b7cfb,
+ (DwarfForm) 0x610b7ae1,
+ 0x3ea5c609d7d7560fLL))
+ .WillOnce(Return());
+
+ // At this point, we abandon the traversal, so none of the
+ // usual stuff should get called.
+ EXPECT_CALL(*mock_grandchild_handler, EndAttributes())
+ .Times(0);
+ EXPECT_CALL(*mock_grandchild_handler, Finish())
+ .Times(0);
+ }
+
+ EXPECT_CALL(*mock_child_handler, Finish())
+ .Times(0);
+ }
+
+ EXPECT_CALL(mock_root_handler, Finish())
+ .Times(0);
+ }
+ }
+
+ // The dispatcher.
+ DIEDispatcher die_dispatcher(&mock_root_handler);
+
+ // Report the CU header.
+ EXPECT_TRUE(die_dispatcher
+ .StartCompilationUnit(0x87b41ba8381cd71cLL, 0xff, 0x89,
+ 0x76d392ff393ddda2LL, 0xbf));
+ // Report the root DIE.
+ {
+ EXPECT_TRUE(die_dispatcher.StartDIE(0xbf13b761691ddc91LL,
+ (DwarfTag) 0x98980361));
+
+ // Child DIE.
+ {
+ EXPECT_TRUE(die_dispatcher.StartDIE(0x058f09240c5fc8c9LL,
+ (DwarfTag) 0x898bf0d0));
+
+ // Grandchild DIE.
+ {
+ EXPECT_TRUE(die_dispatcher.StartDIE(0x32dc00c9945dc0c8LL,
+ (DwarfTag) 0x2802d007));
+ die_dispatcher.ProcessAttributeSigned(0x32dc00c9945dc0c8LL,
+ (DwarfAttribute) 0x4e2b7cfb,
+ (DwarfForm) 0x610b7ae1,
+ 0x3ea5c609d7d7560fLL);
+
+ // Stop the traversal abruptly, so that there will still be
+ // handlers on the stack when the dispatcher is destructed.
+
+ // No EndDIE call...
+ }
+ // No EndDIE call...
+ }
+ // No EndDIE call...
+ }
+}
diff --git a/3rdParty/Breakpad/src/common/dwarf/dwarf2enums.h b/3rdParty/Breakpad/src/common/dwarf/dwarf2enums.h
index 5565d66..4316a89 100644
--- a/3rdParty/Breakpad/src/common/dwarf/dwarf2enums.h
+++ b/3rdParty/Breakpad/src/common/dwarf/dwarf2enums.h
@@ -149,7 +149,10 @@ enum DwarfForm {
DW_FORM_sec_offset = 0x17,
DW_FORM_exprloc = 0x18,
DW_FORM_flag_present = 0x19,
- DW_FORM_ref_sig8 = 0x20
+ DW_FORM_ref_sig8 = 0x20,
+ // Extensions for Fission. See http://gcc.gnu.org/wiki/DebugFission.
+ DW_FORM_GNU_addr_index = 0x1f01,
+ DW_FORM_GNU_str_index = 0x1f02
};
// Attribute names and codes
@@ -229,6 +232,8 @@ enum DwarfAttribute {
DW_AT_call_column = 0x57,
DW_AT_call_file = 0x58,
DW_AT_call_line = 0x59,
+ // DWARF 4
+ DW_AT_linkage_name = 0x6e,
// SGI/MIPS extensions.
DW_AT_MIPS_fde = 0x2001,
DW_AT_MIPS_loop_begin = 0x2002,
@@ -264,6 +269,13 @@ enum DwarfAttribute {
DW_AT_body_begin = 0x2105,
DW_AT_body_end = 0x2106,
DW_AT_GNU_vector = 0x2107,
+ // Extensions for Fission. See http://gcc.gnu.org/wiki/DebugFission.
+ DW_AT_GNU_dwo_name = 0x2130,
+ DW_AT_GNU_dwo_id = 0x2131,
+ DW_AT_GNU_ranges_base = 0x2132,
+ DW_AT_GNU_addr_base = 0x2133,
+ DW_AT_GNU_pubnames = 0x2134,
+ DW_AT_GNU_pubtypes = 0x2135,
// VMS extensions.
DW_AT_VMS_rtnbeg_pd_address = 0x2201,
// UPC extension.
@@ -489,9 +501,24 @@ enum DwarfOpcode {
DW_OP_call_frame_cfa =0x9c,
DW_OP_bit_piece =0x9d,
DW_OP_lo_user =0xe0,
- DW_OP_hi_user =0xff,
+ DW_OP_hi_user =0xff,
// GNU extensions
- DW_OP_GNU_push_tls_address =0xe0
+ DW_OP_GNU_push_tls_address =0xe0,
+ // Extensions for Fission. See http://gcc.gnu.org/wiki/DebugFission.
+ DW_OP_GNU_addr_index =0xfb,
+ DW_OP_GNU_const_index =0xfc
+};
+
+// Section identifiers for DWP files
+enum DwarfSectionId {
+ DW_SECT_INFO = 1,
+ DW_SECT_TYPES = 2,
+ DW_SECT_ABBREV = 3,
+ DW_SECT_LINE = 4,
+ DW_SECT_LOC = 5,
+ DW_SECT_STR_OFFSETS = 6,
+ DW_SECT_MACINFO = 7,
+ DW_SECT_MACRO = 8
};
// Source languages. These are values for DW_AT_language.
@@ -517,6 +544,8 @@ enum DwarfLanguage
DW_LANG_ObjC_plus_plus =0x0011,
DW_LANG_UPC =0x0012,
DW_LANG_D =0x0013,
+ DW_LANG_Rust =0x001c,
+ DW_LANG_Swift =0x001e,
// Implementation-defined language code range.
DW_LANG_lo_user = 0x8000,
DW_LANG_hi_user = 0xffff,
@@ -643,7 +672,7 @@ enum DwarfPointerEncoding
// encoding (except DW_EH_PE_aligned), and indicates that the
// encoded value represents the address at which the true address
// is stored, not the true address itself.
- DW_EH_PE_indirect = 0x80
+ DW_EH_PE_indirect = 0x80
};
} // namespace dwarf2reader
diff --git a/3rdParty/Breakpad/src/common/dwarf/dwarf2reader.cc b/3rdParty/Breakpad/src/common/dwarf/dwarf2reader.cc
index 7c1a29d..8774122 100644
--- a/3rdParty/Breakpad/src/common/dwarf/dwarf2reader.cc
+++ b/3rdParty/Breakpad/src/common/dwarf/dwarf2reader.cc
@@ -44,6 +44,8 @@
#include <string>
#include <utility>
+#include <sys/stat.h>
+
#include "common/dwarf/bytereader-inl.h"
#include "common/dwarf/bytereader.h"
#include "common/dwarf/line_state_machine.h"
@@ -51,11 +53,38 @@
namespace dwarf2reader {
-CompilationUnit::CompilationUnit(const SectionMap& sections, uint64 offset,
+CompilationUnit::CompilationUnit(const string& path,
+ const SectionMap& sections, uint64 offset,
ByteReader* reader, Dwarf2Handler* handler)
- : offset_from_section_start_(offset), reader_(reader),
- sections_(sections), handler_(handler), abbrevs_(NULL),
- string_buffer_(NULL), string_buffer_length_(0) {}
+ : path_(path), offset_from_section_start_(offset), reader_(reader),
+ sections_(sections), handler_(handler), abbrevs_(),
+ string_buffer_(NULL), string_buffer_length_(0),
+ str_offsets_buffer_(NULL), str_offsets_buffer_length_(0),
+ addr_buffer_(NULL), addr_buffer_length_(0),
+ is_split_dwarf_(false), dwo_id_(0), dwo_name_(),
+ skeleton_dwo_id_(0), ranges_base_(0), addr_base_(0),
+ have_checked_for_dwp_(false), dwp_path_(),
+ dwp_byte_reader_(), dwp_reader_() {}
+
+// Initialize a compilation unit from a .dwo or .dwp file.
+// In this case, we need the .debug_addr section from the
+// executable file that contains the corresponding skeleton
+// compilation unit. We also inherit the Dwarf2Handler from
+// the executable file, and call it as if we were still
+// processing the original compilation unit.
+
+void CompilationUnit::SetSplitDwarf(const uint8_t* addr_buffer,
+ uint64 addr_buffer_length,
+ uint64 addr_base,
+ uint64 ranges_base,
+ uint64 dwo_id) {
+ is_split_dwarf_ = true;
+ addr_buffer_ = addr_buffer;
+ addr_buffer_length_ = addr_buffer_length;
+ addr_base_ = addr_base;
+ ranges_base_ = ranges_base;
+ skeleton_dwo_id_ = dwo_id;
+}
// Read a DWARF2/3 abbreviation section.
// Each abbrev consists of a abbreviation number, a tag, a byte
@@ -83,9 +112,9 @@ void CompilationUnit::ReadAbbrevs() {
// The only way to check whether we are reading over the end of the
// buffer would be to first compute the size of the leb128 data by
// reading it, then go back and read it again.
- const char* abbrev_start = iter->second.first +
+ const uint8_t *abbrev_start = iter->second.first +
header_.abbrev_offset;
- const char* abbrevptr = abbrev_start;
+ const uint8_t *abbrevptr = abbrev_start;
#ifndef NDEBUG
const uint64 abbrev_length = iter->second.second - header_.abbrev_offset;
#endif
@@ -132,8 +161,8 @@ void CompilationUnit::ReadAbbrevs() {
}
// Skips a single DIE's attributes.
-const char* CompilationUnit::SkipDIE(const char* start,
- const Abbrev& abbrev) {
+const uint8_t *CompilationUnit::SkipDIE(const uint8_t* start,
+ const Abbrev& abbrev) {
for (AttributeList::const_iterator i = abbrev.attributes.begin();
i != abbrev.attributes.end();
i++) {
@@ -143,8 +172,8 @@ const char* CompilationUnit::SkipDIE(const char* start,
}
// Skips a single attribute form's data.
-const char* CompilationUnit::SkipAttribute(const char* start,
- enum DwarfForm form) {
+const uint8_t *CompilationUnit::SkipAttribute(const uint8_t *start,
+ enum DwarfForm form) {
size_t len;
switch (form) {
@@ -171,9 +200,11 @@ const char* CompilationUnit::SkipAttribute(const char* start,
case DW_FORM_ref_sig8:
return start + 8;
case DW_FORM_string:
- return start + strlen(start) + 1;
+ return start + strlen(reinterpret_cast<const char *>(start)) + 1;
case DW_FORM_udata:
case DW_FORM_ref_udata:
+ case DW_FORM_GNU_str_index:
+ case DW_FORM_GNU_addr_index:
reader_->ReadUnsignedLEB128(start, &len);
return start + len;
@@ -183,14 +214,15 @@ const char* CompilationUnit::SkipAttribute(const char* start,
case DW_FORM_addr:
return start + reader_->AddressSize();
case DW_FORM_ref_addr:
- // DWARF2 and 3 differ on whether ref_addr is address size or
+ // DWARF2 and 3/4 differ on whether ref_addr is address size or
// offset size.
- assert(header_.version == 2 || header_.version == 3);
+ assert(header_.version >= 2);
if (header_.version == 2) {
return start + reader_->AddressSize();
- } else if (header_.version == 3) {
+ } else if (header_.version >= 3) {
return start + reader_->OffsetSize();
}
+ break;
case DW_FORM_block1:
return start + 1 + reader_->ReadOneByte(start);
@@ -217,7 +249,7 @@ const char* CompilationUnit::SkipAttribute(const char* start,
// the offset in the .debug_abbrev section for our abbrevs, and an
// address size.
void CompilationUnit::ReadHeader() {
- const char* headerptr = buffer_;
+ const uint8_t *headerptr = buffer_;
size_t initial_length_size;
assert(headerptr + 4 < buffer_ + buffer_length_);
@@ -234,7 +266,9 @@ void CompilationUnit::ReadHeader() {
header_.abbrev_offset = reader_->ReadOffset(headerptr);
headerptr += reader_->OffsetSize();
- assert(headerptr + 1 < buffer_ + buffer_length_);
+ // Compare against less than or equal because this may be the last
+ // section in the file.
+ assert(headerptr + 1 <= buffer_ + buffer_length_);
header_.address_size = reader_->ReadOneByte(headerptr);
reader_->SetAddressSize(header_.address_size);
headerptr += 1;
@@ -295,17 +329,39 @@ uint64 CompilationUnit::Start() {
string_buffer_length_ = iter->second.second;
}
+ // Set the string offsets section if we have one.
+ iter = sections_.find(".debug_str_offsets");
+ if (iter != sections_.end()) {
+ str_offsets_buffer_ = iter->second.first;
+ str_offsets_buffer_length_ = iter->second.second;
+ }
+
+ // Set the address section if we have one.
+ iter = sections_.find(".debug_addr");
+ if (iter != sections_.end()) {
+ addr_buffer_ = iter->second.first;
+ addr_buffer_length_ = iter->second.second;
+ }
+
// Now that we have our abbreviations, start processing DIE's.
ProcessDIEs();
+ // If this is a skeleton compilation unit generated with split DWARF,
+ // and the client needs the full debug info, we need to find the full
+ // compilation unit in a .dwo or .dwp file.
+ if (!is_split_dwarf_
+ && dwo_name_ != NULL
+ && handler_->NeedSplitDebugInfo())
+ ProcessSplitDwarf();
+
return ourlength;
}
// If one really wanted, you could merge SkipAttribute and
// ProcessAttribute
// This is all boring data manipulation and calling of the handler.
-const char* CompilationUnit::ProcessAttribute(
- uint64 dieoffset, const char* start, enum DwarfAttribute attr,
+const uint8_t *CompilationUnit::ProcessAttribute(
+ uint64 dieoffset, const uint8_t *start, enum DwarfAttribute attr,
enum DwarfForm form) {
size_t len;
@@ -319,48 +375,46 @@ const char* CompilationUnit::ProcessAttribute(
return ProcessAttribute(dieoffset, start, attr, form);
case DW_FORM_flag_present:
- handler_->ProcessAttributeUnsigned(dieoffset, attr, form, 1);
+ ProcessAttributeUnsigned(dieoffset, attr, form, 1);
return start;
case DW_FORM_data1:
case DW_FORM_flag:
- handler_->ProcessAttributeUnsigned(dieoffset, attr, form,
- reader_->ReadOneByte(start));
+ ProcessAttributeUnsigned(dieoffset, attr, form,
+ reader_->ReadOneByte(start));
return start + 1;
case DW_FORM_data2:
- handler_->ProcessAttributeUnsigned(dieoffset, attr, form,
- reader_->ReadTwoBytes(start));
+ ProcessAttributeUnsigned(dieoffset, attr, form,
+ reader_->ReadTwoBytes(start));
return start + 2;
case DW_FORM_data4:
- handler_->ProcessAttributeUnsigned(dieoffset, attr, form,
- reader_->ReadFourBytes(start));
+ ProcessAttributeUnsigned(dieoffset, attr, form,
+ reader_->ReadFourBytes(start));
return start + 4;
case DW_FORM_data8:
- handler_->ProcessAttributeUnsigned(dieoffset, attr, form,
- reader_->ReadEightBytes(start));
+ ProcessAttributeUnsigned(dieoffset, attr, form,
+ reader_->ReadEightBytes(start));
return start + 8;
case DW_FORM_string: {
- const char* str = start;
- handler_->ProcessAttributeString(dieoffset, attr, form,
- str);
+ const char *str = reinterpret_cast<const char *>(start);
+ ProcessAttributeString(dieoffset, attr, form, str);
return start + strlen(str) + 1;
}
case DW_FORM_udata:
- handler_->ProcessAttributeUnsigned(dieoffset, attr, form,
- reader_->ReadUnsignedLEB128(start,
- &len));
+ ProcessAttributeUnsigned(dieoffset, attr, form,
+ reader_->ReadUnsignedLEB128(start, &len));
return start + len;
case DW_FORM_sdata:
- handler_->ProcessAttributeSigned(dieoffset, attr, form,
- reader_->ReadSignedLEB128(start, &len));
+ ProcessAttributeSigned(dieoffset, attr, form,
+ reader_->ReadSignedLEB128(start, &len));
return start + len;
case DW_FORM_addr:
- handler_->ProcessAttributeUnsigned(dieoffset, attr, form,
- reader_->ReadAddress(start));
+ ProcessAttributeUnsigned(dieoffset, attr, form,
+ reader_->ReadAddress(start));
return start + reader_->AddressSize();
case DW_FORM_sec_offset:
- handler_->ProcessAttributeUnsigned(dieoffset, attr, form,
- reader_->ReadOffset(start));
+ ProcessAttributeUnsigned(dieoffset, attr, form,
+ reader_->ReadOffset(start));
return start + reader_->OffsetSize();
case DW_FORM_ref1:
@@ -390,14 +444,14 @@ const char* CompilationUnit::ProcessAttribute(
+ offset_from_section_start_);
return start + len;
case DW_FORM_ref_addr:
- // DWARF2 and 3 differ on whether ref_addr is address size or
+ // DWARF2 and 3/4 differ on whether ref_addr is address size or
// offset size.
- assert(header_.version == 2 || header_.version == 3);
+ assert(header_.version >= 2);
if (header_.version == 2) {
handler_->ProcessAttributeReference(dieoffset, attr, form,
reader_->ReadAddress(start));
return start + reader_->AddressSize();
- } else if (header_.version == 3) {
+ } else if (header_.version >= 3) {
handler_->ProcessAttributeReference(dieoffset, attr, form,
reader_->ReadOffset(start));
return start + reader_->OffsetSize();
@@ -439,34 +493,66 @@ const char* CompilationUnit::ProcessAttribute(
const uint64 offset = reader_->ReadOffset(start);
assert(string_buffer_ + offset < string_buffer_ + string_buffer_length_);
- const char* str = string_buffer_ + offset;
- handler_->ProcessAttributeString(dieoffset, attr, form,
- str);
+ const char *str = reinterpret_cast<const char *>(string_buffer_ + offset);
+ ProcessAttributeString(dieoffset, attr, form, str);
return start + reader_->OffsetSize();
}
+
+ case DW_FORM_GNU_str_index: {
+ uint64 str_index = reader_->ReadUnsignedLEB128(start, &len);
+ const uint8_t* offset_ptr =
+ str_offsets_buffer_ + str_index * reader_->OffsetSize();
+ const uint64 offset = reader_->ReadOffset(offset_ptr);
+ if (offset >= string_buffer_length_) {
+ return NULL;
+ }
+
+ const char* str = reinterpret_cast<const char *>(string_buffer_) + offset;
+ ProcessAttributeString(dieoffset, attr, form, str);
+ return start + len;
+ break;
+ }
+ case DW_FORM_GNU_addr_index: {
+ uint64 addr_index = reader_->ReadUnsignedLEB128(start, &len);
+ const uint8_t* addr_ptr =
+ addr_buffer_ + addr_base_ + addr_index * reader_->AddressSize();
+ ProcessAttributeUnsigned(dieoffset, attr, form,
+ reader_->ReadAddress(addr_ptr));
+ return start + len;
+ }
}
fprintf(stderr, "Unhandled form type\n");
return NULL;
}
-const char* CompilationUnit::ProcessDIE(uint64 dieoffset,
- const char* start,
- const Abbrev& abbrev) {
+const uint8_t *CompilationUnit::ProcessDIE(uint64 dieoffset,
+ const uint8_t *start,
+ const Abbrev& abbrev) {
for (AttributeList::const_iterator i = abbrev.attributes.begin();
i != abbrev.attributes.end();
i++) {
start = ProcessAttribute(dieoffset, start, i->first, i->second);
}
+
+ // If this is a compilation unit in a split DWARF object, verify that
+ // the dwo_id matches. If it does not match, we will ignore this
+ // compilation unit.
+ if (abbrev.tag == DW_TAG_compile_unit
+ && is_split_dwarf_
+ && dwo_id_ != skeleton_dwo_id_) {
+ return NULL;
+ }
+
return start;
}
void CompilationUnit::ProcessDIEs() {
- const char* dieptr = after_header_;
+ const uint8_t *dieptr = after_header_;
size_t len;
// lengthstart is the place the length field is based on.
// It is the point in the header after the initial length field
- const char* lengthstart = buffer_;
+ const uint8_t *lengthstart = buffer_;
// In 64 bit dwarf, the initial length is 12 bytes, because of the
// 0xffffffff at the start.
@@ -500,7 +586,7 @@ void CompilationUnit::ProcessDIEs() {
const Abbrev& abbrev = abbrevs_->at(static_cast<size_t>(abbrev_num));
const enum DwarfTag tag = abbrev.tag;
- if (!handler_->StartDIE(absolute_offset, tag, abbrev.attributes)) {
+ if (!handler_->StartDIE(absolute_offset, tag)) {
dieptr = SkipDIE(dieptr, abbrev);
} else {
dieptr = ProcessDIE(absolute_offset, dieptr, abbrev);
@@ -514,10 +600,313 @@ void CompilationUnit::ProcessDIEs() {
}
}
-LineInfo::LineInfo(const char* buffer, uint64 buffer_length,
+// Check for a valid ELF file and return the Address size.
+// Returns 0 if not a valid ELF file.
+inline int GetElfWidth(const ElfReader& elf) {
+ if (elf.IsElf32File())
+ return 4;
+ if (elf.IsElf64File())
+ return 8;
+ return 0;
+}
+
+void CompilationUnit::ProcessSplitDwarf() {
+ struct stat statbuf;
+ if (!have_checked_for_dwp_) {
+ // Look for a .dwp file in the same directory as the executable.
+ have_checked_for_dwp_ = true;
+ string dwp_suffix(".dwp");
+ dwp_path_ = path_ + dwp_suffix;
+ if (stat(dwp_path_.c_str(), &statbuf) != 0) {
+ // Fall back to a split .debug file in the same directory.
+ string debug_suffix(".debug");
+ dwp_path_ = path_;
+ size_t found = path_.rfind(debug_suffix);
+ if (found + debug_suffix.length() == path_.length())
+ dwp_path_ = dwp_path_.replace(found, debug_suffix.length(), dwp_suffix);
+ }
+ if (stat(dwp_path_.c_str(), &statbuf) == 0) {
+ ElfReader* elf = new ElfReader(dwp_path_);
+ int width = GetElfWidth(*elf);
+ if (width != 0) {
+ dwp_byte_reader_.reset(new ByteReader(reader_->GetEndianness()));
+ dwp_byte_reader_->SetAddressSize(width);
+ dwp_reader_.reset(new DwpReader(*dwp_byte_reader_, elf));
+ dwp_reader_->Initialize();
+ } else {
+ delete elf;
+ }
+ }
+ }
+ bool found_in_dwp = false;
+ if (dwp_reader_) {
+ // If we have a .dwp file, read the debug sections for the requested CU.
+ SectionMap sections;
+ dwp_reader_->ReadDebugSectionsForCU(dwo_id_, &sections);
+ if (!sections.empty()) {
+ found_in_dwp = true;
+ CompilationUnit dwp_comp_unit(dwp_path_, sections, 0,
+ dwp_byte_reader_.get(), handler_);
+ dwp_comp_unit.SetSplitDwarf(addr_buffer_, addr_buffer_length_, addr_base_,
+ ranges_base_, dwo_id_);
+ dwp_comp_unit.Start();
+ }
+ }
+ if (!found_in_dwp) {
+ // If no .dwp file, try to open the .dwo file.
+ if (stat(dwo_name_, &statbuf) == 0) {
+ ElfReader elf(dwo_name_);
+ int width = GetElfWidth(elf);
+ if (width != 0) {
+ ByteReader reader(ENDIANNESS_LITTLE);
+ reader.SetAddressSize(width);
+ SectionMap sections;
+ ReadDebugSectionsFromDwo(&elf, &sections);
+ CompilationUnit dwo_comp_unit(dwo_name_, sections, 0, &reader,
+ handler_);
+ dwo_comp_unit.SetSplitDwarf(addr_buffer_, addr_buffer_length_,
+ addr_base_, ranges_base_, dwo_id_);
+ dwo_comp_unit.Start();
+ }
+ }
+ }
+}
+
+void CompilationUnit::ReadDebugSectionsFromDwo(ElfReader* elf_reader,
+ SectionMap* sections) {
+ static const char* const section_names[] = {
+ ".debug_abbrev",
+ ".debug_info",
+ ".debug_str_offsets",
+ ".debug_str"
+ };
+ for (unsigned int i = 0u;
+ i < sizeof(section_names)/sizeof(*(section_names)); ++i) {
+ string base_name = section_names[i];
+ string dwo_name = base_name + ".dwo";
+ size_t section_size;
+ const char* section_data = elf_reader->GetSectionByName(dwo_name,
+ &section_size);
+ if (section_data != NULL)
+ sections->insert(std::make_pair(
+ base_name, std::make_pair(
+ reinterpret_cast<const uint8_t *>(section_data),
+ section_size)));
+ }
+}
+
+DwpReader::DwpReader(const ByteReader& byte_reader, ElfReader* elf_reader)
+ : elf_reader_(elf_reader), byte_reader_(byte_reader),
+ cu_index_(NULL), cu_index_size_(0), string_buffer_(NULL),
+ string_buffer_size_(0), version_(0), ncolumns_(0), nunits_(0),
+ nslots_(0), phash_(NULL), pindex_(NULL), shndx_pool_(NULL),
+ offset_table_(NULL), size_table_(NULL), abbrev_data_(NULL),
+ abbrev_size_(0), info_data_(NULL), info_size_(0),
+ str_offsets_data_(NULL), str_offsets_size_(0) {}
+
+DwpReader::~DwpReader() {
+ if (elf_reader_) delete elf_reader_;
+}
+
+void DwpReader::Initialize() {
+ cu_index_ = elf_reader_->GetSectionByName(".debug_cu_index",
+ &cu_index_size_);
+ if (cu_index_ == NULL) {
+ return;
+ }
+ // The .debug_str.dwo section is shared by all CUs in the file.
+ string_buffer_ = elf_reader_->GetSectionByName(".debug_str.dwo",
+ &string_buffer_size_);
+
+ version_ = byte_reader_.ReadFourBytes(
+ reinterpret_cast<const uint8_t *>(cu_index_));
+
+ if (version_ == 1) {
+ nslots_ = byte_reader_.ReadFourBytes(
+ reinterpret_cast<const uint8_t *>(cu_index_)
+ + 3 * sizeof(uint32));
+ phash_ = cu_index_ + 4 * sizeof(uint32);
+ pindex_ = phash_ + nslots_ * sizeof(uint64);
+ shndx_pool_ = pindex_ + nslots_ * sizeof(uint32);
+ if (shndx_pool_ >= cu_index_ + cu_index_size_) {
+ version_ = 0;
+ }
+ } else if (version_ == 2) {
+ ncolumns_ = byte_reader_.ReadFourBytes(
+ reinterpret_cast<const uint8_t *>(cu_index_) + sizeof(uint32));
+ nunits_ = byte_reader_.ReadFourBytes(
+ reinterpret_cast<const uint8_t *>(cu_index_) + 2 * sizeof(uint32));
+ nslots_ = byte_reader_.ReadFourBytes(
+ reinterpret_cast<const uint8_t *>(cu_index_) + 3 * sizeof(uint32));
+ phash_ = cu_index_ + 4 * sizeof(uint32);
+ pindex_ = phash_ + nslots_ * sizeof(uint64);
+ offset_table_ = pindex_ + nslots_ * sizeof(uint32);
+ size_table_ = offset_table_ + ncolumns_ * (nunits_ + 1) * sizeof(uint32);
+ abbrev_data_ = elf_reader_->GetSectionByName(".debug_abbrev.dwo",
+ &abbrev_size_);
+ info_data_ = elf_reader_->GetSectionByName(".debug_info.dwo", &info_size_);
+ str_offsets_data_ = elf_reader_->GetSectionByName(".debug_str_offsets.dwo",
+ &str_offsets_size_);
+ if (size_table_ >= cu_index_ + cu_index_size_) {
+ version_ = 0;
+ }
+ }
+}
+
+void DwpReader::ReadDebugSectionsForCU(uint64 dwo_id,
+ SectionMap* sections) {
+ if (version_ == 1) {
+ int slot = LookupCU(dwo_id);
+ if (slot == -1) {
+ return;
+ }
+
+ // The index table points to the section index pool, where we
+ // can read a list of section indexes for the debug sections
+ // for the CU whose dwo_id we are looking for.
+ int index = byte_reader_.ReadFourBytes(
+ reinterpret_cast<const uint8_t *>(pindex_)
+ + slot * sizeof(uint32));
+ const char* shndx_list = shndx_pool_ + index * sizeof(uint32);
+ for (;;) {
+ if (shndx_list >= cu_index_ + cu_index_size_) {
+ version_ = 0;
+ return;
+ }
+ unsigned int shndx = byte_reader_.ReadFourBytes(
+ reinterpret_cast<const uint8_t *>(shndx_list));
+ shndx_list += sizeof(uint32);
+ if (shndx == 0)
+ break;
+ const char* section_name = elf_reader_->GetSectionName(shndx);
+ size_t section_size;
+ const char* section_data;
+ // We're only interested in these four debug sections.
+ // The section names in the .dwo file end with ".dwo", but we
+ // add them to the sections table with their normal names.
+ if (!strncmp(section_name, ".debug_abbrev", strlen(".debug_abbrev"))) {
+ section_data = elf_reader_->GetSectionByIndex(shndx, &section_size);
+ sections->insert(std::make_pair(
+ ".debug_abbrev",
+ std::make_pair(reinterpret_cast<const uint8_t *> (section_data),
+ section_size)));
+ } else if (!strncmp(section_name, ".debug_info", strlen(".debug_info"))) {
+ section_data = elf_reader_->GetSectionByIndex(shndx, &section_size);
+ sections->insert(std::make_pair(
+ ".debug_info",
+ std::make_pair(reinterpret_cast<const uint8_t *> (section_data),
+ section_size)));
+ } else if (!strncmp(section_name, ".debug_str_offsets",
+ strlen(".debug_str_offsets"))) {
+ section_data = elf_reader_->GetSectionByIndex(shndx, &section_size);
+ sections->insert(std::make_pair(
+ ".debug_str_offsets",
+ std::make_pair(reinterpret_cast<const uint8_t *> (section_data),
+ section_size)));
+ }
+ }
+ sections->insert(std::make_pair(
+ ".debug_str",
+ std::make_pair(reinterpret_cast<const uint8_t *> (string_buffer_),
+ string_buffer_size_)));
+ } else if (version_ == 2) {
+ uint32 index = LookupCUv2(dwo_id);
+ if (index == 0) {
+ return;
+ }
+
+ // The index points to a row in each of the section offsets table
+ // and the section size table, where we can read the offsets and sizes
+ // of the contributions to each debug section from the CU whose dwo_id
+ // we are looking for. Row 0 of the section offsets table has the
+ // section ids for each column of the table. The size table begins
+ // with row 1.
+ const char* id_row = offset_table_;
+ const char* offset_row = offset_table_
+ + index * ncolumns_ * sizeof(uint32);
+ const char* size_row =
+ size_table_ + (index - 1) * ncolumns_ * sizeof(uint32);
+ if (size_row + ncolumns_ * sizeof(uint32) > cu_index_ + cu_index_size_) {
+ version_ = 0;
+ return;
+ }
+ for (unsigned int col = 0u; col < ncolumns_; ++col) {
+ uint32 section_id =
+ byte_reader_.ReadFourBytes(reinterpret_cast<const uint8_t *>(id_row)
+ + col * sizeof(uint32));
+ uint32 offset = byte_reader_.ReadFourBytes(
+ reinterpret_cast<const uint8_t *>(offset_row)
+ + col * sizeof(uint32));
+ uint32 size = byte_reader_.ReadFourBytes(
+ reinterpret_cast<const uint8_t *>(size_row) + col * sizeof(uint32));
+ if (section_id == DW_SECT_ABBREV) {
+ sections->insert(std::make_pair(
+ ".debug_abbrev",
+ std::make_pair(reinterpret_cast<const uint8_t *> (abbrev_data_)
+ + offset, size)));
+ } else if (section_id == DW_SECT_INFO) {
+ sections->insert(std::make_pair(
+ ".debug_info",
+ std::make_pair(reinterpret_cast<const uint8_t *> (info_data_)
+ + offset, size)));
+ } else if (section_id == DW_SECT_STR_OFFSETS) {
+ sections->insert(std::make_pair(
+ ".debug_str_offsets",
+ std::make_pair(reinterpret_cast<const uint8_t *> (str_offsets_data_)
+ + offset, size)));
+ }
+ }
+ sections->insert(std::make_pair(
+ ".debug_str",
+ std::make_pair(reinterpret_cast<const uint8_t *> (string_buffer_),
+ string_buffer_size_)));
+ }
+}
+
+int DwpReader::LookupCU(uint64 dwo_id) {
+ uint32 slot = static_cast<uint32>(dwo_id) & (nslots_ - 1);
+ uint64 probe = byte_reader_.ReadEightBytes(
+ reinterpret_cast<const uint8_t *>(phash_) + slot * sizeof(uint64));
+ if (probe != 0 && probe != dwo_id) {
+ uint32 secondary_hash =
+ (static_cast<uint32>(dwo_id >> 32) & (nslots_ - 1)) | 1;
+ do {
+ slot = (slot + secondary_hash) & (nslots_ - 1);
+ probe = byte_reader_.ReadEightBytes(
+ reinterpret_cast<const uint8_t *>(phash_) + slot * sizeof(uint64));
+ } while (probe != 0 && probe != dwo_id);
+ }
+ if (probe == 0)
+ return -1;
+ return slot;
+}
+
+uint32 DwpReader::LookupCUv2(uint64 dwo_id) {
+ uint32 slot = static_cast<uint32>(dwo_id) & (nslots_ - 1);
+ uint64 probe = byte_reader_.ReadEightBytes(
+ reinterpret_cast<const uint8_t *>(phash_) + slot * sizeof(uint64));
+ uint32 index = byte_reader_.ReadFourBytes(
+ reinterpret_cast<const uint8_t *>(pindex_) + slot * sizeof(uint32));
+ if (index != 0 && probe != dwo_id) {
+ uint32 secondary_hash =
+ (static_cast<uint32>(dwo_id >> 32) & (nslots_ - 1)) | 1;
+ do {
+ slot = (slot + secondary_hash) & (nslots_ - 1);
+ probe = byte_reader_.ReadEightBytes(
+ reinterpret_cast<const uint8_t *>(phash_) + slot * sizeof(uint64));
+ index = byte_reader_.ReadFourBytes(
+ reinterpret_cast<const uint8_t *>(pindex_) + slot * sizeof(uint32));
+ } while (index != 0 && probe != dwo_id);
+ }
+ return index;
+}
+
+LineInfo::LineInfo(const uint8_t *buffer, uint64 buffer_length,
ByteReader* reader, LineInfoHandler* handler):
- handler_(handler), reader_(reader), buffer_(buffer),
- buffer_length_(buffer_length) {
+ handler_(handler), reader_(reader), buffer_(buffer) {
+#ifndef NDEBUG
+ buffer_length_ = buffer_length;
+#endif
header_.std_opcode_lengths = NULL;
}
@@ -530,7 +919,7 @@ uint64 LineInfo::Start() {
// The header for a debug_line section is mildly complicated, because
// the line info is very tightly encoded.
void LineInfo::ReadHeader() {
- const char* lineptr = buffer_;
+ const uint8_t *lineptr = buffer_;
size_t initial_length_size;
const uint64 initial_length
@@ -553,6 +942,13 @@ void LineInfo::ReadHeader() {
header_.min_insn_length = reader_->ReadOneByte(lineptr);
lineptr += 1;
+ if (header_.version >= 4) {
+ __attribute__((unused)) uint8 max_ops_per_insn =
+ reader_->ReadOneByte(lineptr);
+ ++lineptr;
+ assert(max_ops_per_insn == 1);
+ }
+
header_.default_is_stmt = reader_->ReadOneByte(lineptr);
lineptr += 1;
@@ -577,7 +973,7 @@ void LineInfo::ReadHeader() {
if (*lineptr) {
uint32 dirindex = 1;
while (*lineptr) {
- const char* dirname = lineptr;
+ const char *dirname = reinterpret_cast<const char *>(lineptr);
handler_->DefineDir(dirname, dirindex);
lineptr += strlen(dirname) + 1;
dirindex++;
@@ -590,7 +986,7 @@ void LineInfo::ReadHeader() {
uint32 fileindex = 1;
size_t len;
while (*lineptr) {
- const char* filename = lineptr;
+ const char *filename = reinterpret_cast<const char *>(lineptr);
lineptr += strlen(filename) + 1;
uint64 dirindex = reader_->ReadUnsignedLEB128(lineptr, &len);
@@ -615,7 +1011,7 @@ void LineInfo::ReadHeader() {
bool LineInfo::ProcessOneOpcode(ByteReader* reader,
LineInfoHandler* handler,
const struct LineInfoHeader &header,
- const char* start,
+ const uint8_t *start,
struct LineStateMachine* lsm,
size_t* len,
uintptr pc,
@@ -756,7 +1152,7 @@ bool LineInfo::ProcessOneOpcode(ByteReader* reader,
}
break;
case DW_LNE_define_file: {
- const char* filename = start;
+ const char *filename = reinterpret_cast<const char *>(start);
templen = strlen(filename) + 1;
start += templen;
@@ -803,7 +1199,7 @@ void LineInfo::ReadLines() {
// lengthstart is the place the length field is based on.
// It is the point in the header after the initial length field
- const char* lengthstart = buffer_;
+ const uint8_t *lengthstart = buffer_;
// In 64 bit dwarf, the initial length is 12 bytes, because of the
// 0xffffffff at the start.
@@ -812,7 +1208,7 @@ void LineInfo::ReadLines() {
else
lengthstart += 4;
- const char* lineptr = after_header_;
+ const uint8_t *lineptr = after_header_;
lsm.Reset(header_.default_is_stmt);
// The LineInfoHandler interface expects each line's length along
@@ -1311,7 +1707,7 @@ class CallFrameInfo::State {
const Entry *entry_;
// The next instruction to process.
- const char *cursor_;
+ const uint8_t *cursor_;
// The current set of rules.
RuleMap rules_;
@@ -1409,7 +1805,8 @@ bool CallFrameInfo::State::ParseOperands(const char *format,
if (len > bytes_left || expression_length > bytes_left - len)
return ReportIncomplete();
cursor_ += len;
- operands->expression = string(cursor_, expression_length);
+ operands->expression = string(reinterpret_cast<const char *>(cursor_),
+ expression_length);
cursor_ += expression_length;
break;
}
@@ -1512,16 +1909,19 @@ bool CallFrameInfo::State::DoInstruction() {
// Change the base register used to compute the CFA.
case DW_CFA_def_cfa_register: {
+ if (!ParseOperands("r", &ops)) return false;
Rule *cfa_rule = rules_.CFARule();
if (!cfa_rule) {
- reporter_->NoCFARule(entry_->offset, entry_->kind, CursorOffset());
+ if (!DoDefCFA(ops.register_number, ops.offset)) {
+ reporter_->NoCFARule(entry_->offset, entry_->kind, CursorOffset());
+ return false;
+ }
+ } else {
+ cfa_rule->SetBaseRegister(ops.register_number);
+ if (!cfa_rule->Handle(handler_, address_,
+ Handler::kCFARegister))
return false;
}
- if (!ParseOperands("r", &ops)) return false;
- cfa_rule->SetBaseRegister(ops.register_number);
- if (!cfa_rule->Handle(handler_, address_,
- Handler::kCFARegister))
- return false;
break;
}
@@ -1759,8 +2159,8 @@ bool CallFrameInfo::State::DoRestore(unsigned reg) {
return DoRule(reg, rule);
}
-bool CallFrameInfo::ReadEntryPrologue(const char *cursor, Entry *entry) {
- const char *buffer_end = buffer_ + buffer_length_;
+bool CallFrameInfo::ReadEntryPrologue(const uint8_t *cursor, Entry *entry) {
+ const uint8_t *buffer_end = buffer_ + buffer_length_;
// Initialize enough of ENTRY for use in error reporting.
entry->offset = cursor - buffer_;
@@ -1838,7 +2238,7 @@ bool CallFrameInfo::ReadEntryPrologue(const char *cursor, Entry *entry) {
}
bool CallFrameInfo::ReadCIEFields(CIE *cie) {
- const char *cursor = cie->fields;
+ const uint8_t *cursor = cie->fields;
size_t len;
assert(cie->kind == kCIE);
@@ -1860,22 +2260,23 @@ bool CallFrameInfo::ReadCIEFields(CIE *cie) {
cursor++;
// If we don't recognize the version, we can't parse any more fields of the
- // CIE. For DWARF CFI, we handle versions 1 through 3 (there was never a
- // version 2 of CFI data). For .eh_frame, we handle versions 1 and 3 as well;
+ // CIE. For DWARF CFI, we handle versions 1 through 4 (there was never a
+ // version 2 of CFI data). For .eh_frame, we handle versions 1 and 4 as well;
// the difference between those versions seems to be the same as for
// .debug_frame.
- if (cie->version < 1 || cie->version > 3) {
+ if (cie->version < 1 || cie->version > 4) {
reporter_->UnrecognizedVersion(cie->offset, cie->version);
return false;
}
- const char *augmentation_start = cursor;
- const void *augmentation_end =
- memchr(augmentation_start, '\0', cie->end - augmentation_start);
+ const uint8_t *augmentation_start = cursor;
+ const uint8_t *augmentation_end =
+ reinterpret_cast<const uint8_t *>(memchr(augmentation_start, '\0',
+ cie->end - augmentation_start));
if (! augmentation_end) return ReportIncomplete(cie);
- cursor = static_cast<const char *>(augmentation_end);
- cie->augmentation = string(augmentation_start,
- cursor - augmentation_start);
+ cursor = augmentation_end;
+ cie->augmentation = string(reinterpret_cast<const char *>(augmentation_start),
+ cursor - augmentation_start);
// Skip the terminating '\0'.
cursor++;
@@ -1893,16 +2294,36 @@ bool CallFrameInfo::ReadCIEFields(CIE *cie) {
}
}
+ if (cie->version >= 4) {
+ uint8_t address_size = *cursor++;
+ if (address_size != 8) {
+ // TODO(scottmg): Only supporting x64 for now.
+ reporter_->UnexpectedAddressSize(cie->offset, address_size);
+ return false;
+ }
+
+ uint8_t segment_size = *cursor++;
+ if (segment_size != 0) {
+ // TODO(scottmg): Only supporting x64 for now.
+ // I would have perhaps expected 4 here, but LLVM emits a 0, near
+ // http://llvm.org/docs/doxygen/html/MCDwarf_8cpp_source.html#l00606. As
+ // we are not using the value, only succeed for now if it's the expected
+ // 0.
+ reporter_->UnexpectedSegmentSize(cie->offset, segment_size);
+ return false;
+ }
+ }
+
// Parse the code alignment factor.
cie->code_alignment_factor = reader_->ReadUnsignedLEB128(cursor, &len);
if (size_t(cie->end - cursor) < len) return ReportIncomplete(cie);
cursor += len;
-
+
// Parse the data alignment factor.
cie->data_alignment_factor = reader_->ReadSignedLEB128(cursor, &len);
if (size_t(cie->end - cursor) < len) return ReportIncomplete(cie);
cursor += len;
-
+
// Parse the return address register. This is a ubyte in version 1, and
// a ULEB128 in version 3.
if (cie->version == 1) {
@@ -1921,9 +2342,9 @@ bool CallFrameInfo::ReadCIEFields(CIE *cie) {
if (size_t(cie->end - cursor) < len + data_size)
return ReportIncomplete(cie);
cursor += len;
- const char *data = cursor;
+ const uint8_t *data = cursor;
cursor += data_size;
- const char *data_end = cursor;
+ const uint8_t *data_end = cursor;
cie->has_z_lsda = false;
cie->has_z_personality = false;
@@ -2013,9 +2434,9 @@ bool CallFrameInfo::ReadCIEFields(CIE *cie) {
return true;
}
-
+
bool CallFrameInfo::ReadFDEFields(FDE *fde) {
- const char *cursor = fde->fields;
+ const uint8_t *cursor = fde->fields;
size_t size;
fde->address = reader_->ReadEncodedPointer(cursor, fde->cie->pointer_encoding,
@@ -2081,10 +2502,10 @@ bool CallFrameInfo::ReadFDEFields(FDE *fde) {
}
bool CallFrameInfo::Start() {
- const char *buffer_end = buffer_ + buffer_length_;
- const char *cursor;
+ const uint8_t *buffer_end = buffer_ + buffer_length_;
+ const uint8_t *cursor;
bool all_ok = true;
- const char *entry_end;
+ const uint8_t *entry_end;
bool ok;
// Traverse all the entries in buffer_, skipping CIEs and offering
@@ -2254,6 +2675,22 @@ void CallFrameInfo::Reporter::BadCIEId(uint64 offset, uint64 cie_offset) {
filename_.c_str(), offset, section_.c_str(), cie_offset);
}
+void CallFrameInfo::Reporter::UnexpectedAddressSize(uint64 offset,
+ uint8_t address_size) {
+ fprintf(stderr,
+ "%s: CFI frame description entry at offset 0x%llx in '%s':"
+ " CIE specifies unexpected address size: %d\n",
+ filename_.c_str(), offset, section_.c_str(), address_size);
+}
+
+void CallFrameInfo::Reporter::UnexpectedSegmentSize(uint64 offset,
+ uint8_t segment_size) {
+ fprintf(stderr,
+ "%s: CFI frame description entry at offset 0x%llx in '%s':"
+ " CIE specifies unexpected segment size: %d\n",
+ filename_.c_str(), offset, section_.c_str(), segment_size);
+}
+
void CallFrameInfo::Reporter::UnrecognizedVersion(uint64 offset, int version) {
fprintf(stderr,
"%s: CFI frame description entry at offset 0x%llx in '%s':"
diff --git a/3rdParty/Breakpad/src/common/dwarf/dwarf2reader.h b/3rdParty/Breakpad/src/common/dwarf/dwarf2reader.h
index ecf4eb2..5d2d7f6 100644
--- a/3rdParty/Breakpad/src/common/dwarf/dwarf2reader.h
+++ b/3rdParty/Breakpad/src/common/dwarf/dwarf2reader.h
@@ -40,25 +40,30 @@
#ifndef COMMON_DWARF_DWARF2READER_H__
#define COMMON_DWARF_DWARF2READER_H__
+#include <stdint.h>
+
#include <list>
#include <map>
#include <string>
#include <utility>
#include <vector>
+#include <memory>
#include "common/dwarf/bytereader.h"
#include "common/dwarf/dwarf2enums.h"
#include "common/dwarf/types.h"
#include "common/using_std_string.h"
+#include "common/dwarf/elf_reader.h"
namespace dwarf2reader {
struct LineStateMachine;
class Dwarf2Handler;
class LineInfoHandler;
+class DwpReader;
// This maps from a string naming a section to a pair containing a
// the data for the section, and the size of the section.
-typedef std::map<string, std::pair<const char*, uint64> > SectionMap;
+typedef std::map<string, std::pair<const uint8_t *, uint64> > SectionMap;
typedef std::list<std::pair<enum DwarfAttribute, enum DwarfForm> >
AttributeList;
typedef AttributeList::iterator AttributeIterator;
@@ -85,7 +90,7 @@ class LineInfo {
// to the beginning and length of the line information to read.
// Reader is a ByteReader class that has the endianness set
// properly.
- LineInfo(const char* buffer_, uint64 buffer_length,
+ LineInfo(const uint8_t *buffer_, uint64 buffer_length,
ByteReader* reader, LineInfoHandler* handler);
virtual ~LineInfo() {
@@ -111,7 +116,7 @@ class LineInfo {
static bool ProcessOneOpcode(ByteReader* reader,
LineInfoHandler* handler,
const struct LineInfoHeader &header,
- const char* start,
+ const uint8_t *start,
struct LineStateMachine* lsm,
size_t* len,
uintptr pc,
@@ -139,9 +144,11 @@ class LineInfo {
// buffer is the buffer for our line info, starting at exactly where
// the line info to read is. after_header is the place right after
// the end of the line information header.
- const char* buffer_;
+ const uint8_t *buffer_;
+#ifndef NDEBUG
uint64 buffer_length_;
- const char* after_header_;
+#endif
+ const uint8_t *after_header_;
};
// This class is the main interface between the line info reader and
@@ -180,6 +187,106 @@ class LineInfoHandler {
uint32 file_num, uint32 line_num, uint32 column_num) { }
};
+// This class is the main interface between the reader and the
+// client. The virtual functions inside this get called for
+// interesting events that happen during DWARF2 reading.
+// The default implementation skips everything.
+class Dwarf2Handler {
+ public:
+ Dwarf2Handler() { }
+
+ virtual ~Dwarf2Handler() { }
+
+ // Start to process a compilation unit at OFFSET from the beginning of the
+ // .debug_info section. Return false if you would like to skip this
+ // compilation unit.
+ virtual bool StartCompilationUnit(uint64 offset, uint8 address_size,
+ uint8 offset_size, uint64 cu_length,
+ uint8 dwarf_version) { return false; }
+
+ // When processing a skeleton compilation unit, resulting from a split
+ // DWARF compilation, once the skeleton debug info has been read,
+ // the reader will call this function to ask the client if it needs
+ // the full debug info from the .dwo or .dwp file. Return true if
+ // you need it, or false to skip processing the split debug info.
+ virtual bool NeedSplitDebugInfo() { return true; }
+
+ // Start to process a split compilation unit at OFFSET from the beginning of
+ // the debug_info section in the .dwp/.dwo file. Return false if you would
+ // like to skip this compilation unit.
+ virtual bool StartSplitCompilationUnit(uint64 offset,
+ uint64 cu_length) { return false; }
+
+ // Start to process a DIE at OFFSET from the beginning of the .debug_info
+ // section. Return false if you would like to skip this DIE.
+ virtual bool StartDIE(uint64 offset, enum DwarfTag tag) { return false; }
+
+ // Called when we have an attribute with unsigned data to give to our
+ // handler. The attribute is for the DIE at OFFSET from the beginning of the
+ // .debug_info section. Its name is ATTR, its form is FORM, and its value is
+ // DATA.
+ virtual void ProcessAttributeUnsigned(uint64 offset,
+ enum DwarfAttribute attr,
+ enum DwarfForm form,
+ uint64 data) { }
+
+ // Called when we have an attribute with signed data to give to our handler.
+ // The attribute is for the DIE at OFFSET from the beginning of the
+ // .debug_info section. Its name is ATTR, its form is FORM, and its value is
+ // DATA.
+ virtual void ProcessAttributeSigned(uint64 offset,
+ enum DwarfAttribute attr,
+ enum DwarfForm form,
+ int64 data) { }
+
+ // Called when we have an attribute whose value is a reference to
+ // another DIE. The attribute belongs to the DIE at OFFSET from the
+ // beginning of the .debug_info section. Its name is ATTR, its form
+ // is FORM, and the offset of the DIE being referred to from the
+ // beginning of the .debug_info section is DATA.
+ virtual void ProcessAttributeReference(uint64 offset,
+ enum DwarfAttribute attr,
+ enum DwarfForm form,
+ uint64 data) { }
+
+ // Called when we have an attribute with a buffer of data to give to our
+ // handler. The attribute is for the DIE at OFFSET from the beginning of the
+ // .debug_info section. Its name is ATTR, its form is FORM, DATA points to
+ // the buffer's contents, and its length in bytes is LENGTH. The buffer is
+ // owned by the caller, not the callee, and may not persist for very long.
+ // If you want the data to be available later, it needs to be copied.
+ virtual void ProcessAttributeBuffer(uint64 offset,
+ enum DwarfAttribute attr,
+ enum DwarfForm form,
+ const uint8_t *data,
+ uint64 len) { }
+
+ // Called when we have an attribute with string data to give to our handler.
+ // The attribute is for the DIE at OFFSET from the beginning of the
+ // .debug_info section. Its name is ATTR, its form is FORM, and its value is
+ // DATA.
+ virtual void ProcessAttributeString(uint64 offset,
+ enum DwarfAttribute attr,
+ enum DwarfForm form,
+ const string& data) { }
+
+ // Called when we have an attribute whose value is the 64-bit signature
+ // of a type unit in the .debug_types section. OFFSET is the offset of
+ // the DIE whose attribute we're reporting. ATTR and FORM are the
+ // attribute's name and form. SIGNATURE is the type unit's signature.
+ virtual void ProcessAttributeSignature(uint64 offset,
+ enum DwarfAttribute attr,
+ enum DwarfForm form,
+ uint64 signature) { }
+
+ // Called when finished processing the DIE at OFFSET.
+ // Because DWARF2/3 specifies a tree of DIEs, you may get starts
+ // before ends of the previous DIE, as we process children before
+ // ending the parent.
+ virtual void EndDIE(uint64 offset) { }
+
+};
+
// The base of DWARF2/3 debug info is a DIE (Debugging Information
// Entry.
// DWARF groups DIE's into a tree and calls the root of this tree a
@@ -221,12 +328,21 @@ class CompilationUnit {
// Initialize a compilation unit. This requires a map of sections,
// the offset of this compilation unit in the .debug_info section, a
// ByteReader, and a Dwarf2Handler class to call callbacks in.
- CompilationUnit(const SectionMap& sections, uint64 offset,
+ CompilationUnit(const string& path, const SectionMap& sections, uint64 offset,
ByteReader* reader, Dwarf2Handler* handler);
virtual ~CompilationUnit() {
if (abbrevs_) delete abbrevs_;
}
+ // Initialize a compilation unit from a .dwo or .dwp file.
+ // In this case, we need the .debug_addr section from the
+ // executable file that contains the corresponding skeleton
+ // compilation unit. We also inherit the Dwarf2Handler from
+ // the executable file, and call it as if we were still
+ // processing the original compilation unit.
+ void SetSplitDwarf(const uint8_t* addr_buffer, uint64 addr_buffer_length,
+ uint64 addr_base, uint64 ranges_base, uint64 dwo_id);
+
// Begin reading a Dwarf2 compilation unit, and calling the
// callbacks in the Dwarf2Handler
@@ -266,29 +382,104 @@ class CompilationUnit {
// Processes a single DIE for this compilation unit and return a new
// pointer just past the end of it
- const char* ProcessDIE(uint64 dieoffset,
- const char* start,
- const Abbrev& abbrev);
+ const uint8_t *ProcessDIE(uint64 dieoffset,
+ const uint8_t *start,
+ const Abbrev& abbrev);
// Processes a single attribute and return a new pointer just past the
// end of it
- const char* ProcessAttribute(uint64 dieoffset,
- const char* start,
- enum DwarfAttribute attr,
- enum DwarfForm form);
+ const uint8_t *ProcessAttribute(uint64 dieoffset,
+ const uint8_t *start,
+ enum DwarfAttribute attr,
+ enum DwarfForm form);
+
+ // Called when we have an attribute with unsigned data to give to
+ // our handler. The attribute is for the DIE at OFFSET from the
+ // beginning of compilation unit, has a name of ATTR, a form of
+ // FORM, and the actual data of the attribute is in DATA.
+ // If we see a DW_AT_GNU_dwo_id attribute, save the value so that
+ // we can find the debug info in a .dwo or .dwp file.
+ void ProcessAttributeUnsigned(uint64 offset,
+ enum DwarfAttribute attr,
+ enum DwarfForm form,
+ uint64 data) {
+ if (attr == DW_AT_GNU_dwo_id) {
+ dwo_id_ = data;
+ }
+ else if (attr == DW_AT_GNU_addr_base) {
+ addr_base_ = data;
+ }
+ else if (attr == DW_AT_GNU_ranges_base) {
+ ranges_base_ = data;
+ }
+ // TODO(yunlian): When we add DW_AT_ranges_base from DWARF-5,
+ // that base will apply to DW_AT_ranges attributes in the
+ // skeleton CU as well as in the .dwo/.dwp files.
+ else if (attr == DW_AT_ranges && is_split_dwarf_) {
+ data += ranges_base_;
+ }
+ handler_->ProcessAttributeUnsigned(offset, attr, form, data);
+ }
+
+ // Called when we have an attribute with signed data to give to
+ // our handler. The attribute is for the DIE at OFFSET from the
+ // beginning of compilation unit, has a name of ATTR, a form of
+ // FORM, and the actual data of the attribute is in DATA.
+ void ProcessAttributeSigned(uint64 offset,
+ enum DwarfAttribute attr,
+ enum DwarfForm form,
+ int64 data) {
+ handler_->ProcessAttributeSigned(offset, attr, form, data);
+ }
+
+ // Called when we have an attribute with a buffer of data to give to
+ // our handler. The attribute is for the DIE at OFFSET from the
+ // beginning of compilation unit, has a name of ATTR, a form of
+ // FORM, and the actual data of the attribute is in DATA, and the
+ // length of the buffer is LENGTH.
+ void ProcessAttributeBuffer(uint64 offset,
+ enum DwarfAttribute attr,
+ enum DwarfForm form,
+ const uint8_t* data,
+ uint64 len) {
+ handler_->ProcessAttributeBuffer(offset, attr, form, data, len);
+ }
+
+ // Called when we have an attribute with string data to give to
+ // our handler. The attribute is for the DIE at OFFSET from the
+ // beginning of compilation unit, has a name of ATTR, a form of
+ // FORM, and the actual data of the attribute is in DATA.
+ // If we see a DW_AT_GNU_dwo_name attribute, save the value so
+ // that we can find the debug info in a .dwo or .dwp file.
+ void ProcessAttributeString(uint64 offset,
+ enum DwarfAttribute attr,
+ enum DwarfForm form,
+ const char* data) {
+ if (attr == DW_AT_GNU_dwo_name)
+ dwo_name_ = data;
+ handler_->ProcessAttributeString(offset, attr, form, data);
+ }
// Processes all DIEs for this compilation unit
void ProcessDIEs();
// Skips the die with attributes specified in ABBREV starting at
// START, and return the new place to position the stream to.
- const char* SkipDIE(const char* start,
- const Abbrev& abbrev);
+ const uint8_t *SkipDIE(const uint8_t *start, const Abbrev& abbrev);
// Skips the attribute starting at START, with FORM, and return the
// new place to position the stream to.
- const char* SkipAttribute(const char* start,
- enum DwarfForm form);
+ const uint8_t *SkipAttribute(const uint8_t *start, enum DwarfForm form);
+
+ // Process the actual debug information in a split DWARF file.
+ void ProcessSplitDwarf();
+
+ // Read the debug sections from a .dwo file.
+ void ReadDebugSectionsFromDwo(ElfReader* elf_reader,
+ SectionMap* sections);
+
+ // Path of the file containing the debug information.
+ const string path_;
// Offset from section start is the offset of this compilation unit
// from the beginning of the .debug_info section.
@@ -297,9 +488,9 @@ class CompilationUnit {
// buffer is the buffer for our CU, starting at .debug_info + offset
// passed in from constructor.
// after_header points to right after the compilation unit header.
- const char* buffer_;
+ const uint8_t *buffer_;
uint64 buffer_length_;
- const char* after_header_;
+ const uint8_t *after_header_;
// The associated ByteReader that handles endianness issues for us
ByteReader* reader_;
@@ -318,97 +509,143 @@ class CompilationUnit {
// String section buffer and length, if we have a string section.
// This is here to avoid doing a section lookup for strings in
// ProcessAttribute, which is in the hot path for DWARF2 reading.
- const char* string_buffer_;
+ const uint8_t *string_buffer_;
uint64 string_buffer_length_;
-};
-// This class is the main interface between the reader and the
-// client. The virtual functions inside this get called for
-// interesting events that happen during DWARF2 reading.
-// The default implementation skips everything.
+ // String offsets section buffer and length, if we have a string offsets
+ // section (.debug_str_offsets or .debug_str_offsets.dwo).
+ const uint8_t* str_offsets_buffer_;
+ uint64 str_offsets_buffer_length_;
-class Dwarf2Handler {
+ // Address section buffer and length, if we have an address section
+ // (.debug_addr).
+ const uint8_t* addr_buffer_;
+ uint64 addr_buffer_length_;
+
+ // Flag indicating whether this compilation unit is part of a .dwo
+ // or .dwp file. If true, we are reading this unit because a
+ // skeleton compilation unit in an executable file had a
+ // DW_AT_GNU_dwo_name or DW_AT_GNU_dwo_id attribute.
+ // In a .dwo file, we expect the string offsets section to
+ // have a ".dwo" suffix, and we will use the ".debug_addr" section
+ // associated with the skeleton compilation unit.
+ bool is_split_dwarf_;
+
+ // The value of the DW_AT_GNU_dwo_id attribute, if any.
+ uint64 dwo_id_;
+
+ // The value of the DW_AT_GNU_dwo_name attribute, if any.
+ const char* dwo_name_;
+
+ // If this is a split DWARF CU, the value of the DW_AT_GNU_dwo_id attribute
+ // from the skeleton CU.
+ uint64 skeleton_dwo_id_;
+
+ // The value of the DW_AT_GNU_ranges_base attribute, if any.
+ uint64 ranges_base_;
+
+ // The value of the DW_AT_GNU_addr_base attribute, if any.
+ uint64 addr_base_;
+
+ // True if we have already looked for a .dwp file.
+ bool have_checked_for_dwp_;
+
+ // Path to the .dwp file.
+ string dwp_path_;
+
+ // ByteReader for the DWP file.
+ std::unique_ptr<ByteReader> dwp_byte_reader_;
+
+ // DWP reader.
+ std::unique_ptr<DwpReader> dwp_reader_;
+};
+
+// A Reader for a .dwp file. Supports the fetching of DWARF debug
+// info for a given dwo_id.
+//
+// There are two versions of .dwp files. In both versions, the
+// .dwp file is an ELF file containing only debug sections.
+// In Version 1, the file contains many copies of each debug
+// section, one for each .dwo file that is packaged in the .dwp
+// file, and the .debug_cu_index section maps from the dwo_id
+// to a set of section indexes. In Version 2, the file contains
+// one of each debug section, and the .debug_cu_index section
+// maps from the dwo_id to a set of offsets and lengths that
+// identify each .dwo file's contribution to the larger sections.
+
+class DwpReader {
public:
- Dwarf2Handler() { }
+ DwpReader(const ByteReader& byte_reader, ElfReader* elf_reader);
- virtual ~Dwarf2Handler() { }
+ ~DwpReader();
- // Start to process a compilation unit at OFFSET from the beginning of the
- // .debug_info section. Return false if you would like to skip this
- // compilation unit.
- virtual bool StartCompilationUnit(uint64 offset, uint8 address_size,
- uint8 offset_size, uint64 cu_length,
- uint8 dwarf_version) { return false; }
+ // Read the CU index and initialize data members.
+ void Initialize();
- // Start to process a DIE at OFFSET from the beginning of the .debug_info
- // section. Return false if you would like to skip this DIE.
- virtual bool StartDIE(uint64 offset, enum DwarfTag tag,
- const AttributeList& attrs) { return false; }
+ // Read the debug sections for the given dwo_id.
+ void ReadDebugSectionsForCU(uint64 dwo_id, SectionMap* sections);
- // Called when we have an attribute with unsigned data to give to our
- // handler. The attribute is for the DIE at OFFSET from the beginning of the
- // .debug_info section. Its name is ATTR, its form is FORM, and its value is
- // DATA.
- virtual void ProcessAttributeUnsigned(uint64 offset,
- enum DwarfAttribute attr,
- enum DwarfForm form,
- uint64 data) { }
+ private:
+ // Search a v1 hash table for "dwo_id". Returns the slot index
+ // where the dwo_id was found, or -1 if it was not found.
+ int LookupCU(uint64 dwo_id);
- // Called when we have an attribute with signed data to give to our handler.
- // The attribute is for the DIE at OFFSET from the beginning of the
- // .debug_info section. Its name is ATTR, its form is FORM, and its value is
- // DATA.
- virtual void ProcessAttributeSigned(uint64 offset,
- enum DwarfAttribute attr,
- enum DwarfForm form,
- int64 data) { }
+ // Search a v2 hash table for "dwo_id". Returns the row index
+ // in the offsets and sizes tables, or 0 if it was not found.
+ uint32 LookupCUv2(uint64 dwo_id);
- // Called when we have an attribute whose value is a reference to
- // another DIE. The attribute belongs to the DIE at OFFSET from the
- // beginning of the .debug_info section. Its name is ATTR, its form
- // is FORM, and the offset of the DIE being referred to from the
- // beginning of the .debug_info section is DATA.
- virtual void ProcessAttributeReference(uint64 offset,
- enum DwarfAttribute attr,
- enum DwarfForm form,
- uint64 data) { }
+ // The ELF reader for the .dwp file.
+ ElfReader* elf_reader_;
- // Called when we have an attribute with a buffer of data to give to our
- // handler. The attribute is for the DIE at OFFSET from the beginning of the
- // .debug_info section. Its name is ATTR, its form is FORM, DATA points to
- // the buffer's contents, and its length in bytes is LENGTH. The buffer is
- // owned by the caller, not the callee, and may not persist for very long.
- // If you want the data to be available later, it needs to be copied.
- virtual void ProcessAttributeBuffer(uint64 offset,
- enum DwarfAttribute attr,
- enum DwarfForm form,
- const char* data,
- uint64 len) { }
+ // The ByteReader for the .dwp file.
+ const ByteReader& byte_reader_;
- // Called when we have an attribute with string data to give to our handler.
- // The attribute is for the DIE at OFFSET from the beginning of the
- // .debug_info section. Its name is ATTR, its form is FORM, and its value is
- // DATA.
- virtual void ProcessAttributeString(uint64 offset,
- enum DwarfAttribute attr,
- enum DwarfForm form,
- const string& data) { }
+ // Pointer to the .debug_cu_index section.
+ const char* cu_index_;
- // Called when we have an attribute whose value is the 64-bit signature
- // of a type unit in the .debug_types section. OFFSET is the offset of
- // the DIE whose attribute we're reporting. ATTR and FORM are the
- // attribute's name and form. SIGNATURE is the type unit's signature.
- virtual void ProcessAttributeSignature(uint64 offset,
- enum DwarfAttribute attr,
- enum DwarfForm form,
- uint64 signature) { }
+ // Size of the .debug_cu_index section.
+ size_t cu_index_size_;
- // Called when finished processing the DIE at OFFSET.
- // Because DWARF2/3 specifies a tree of DIEs, you may get starts
- // before ends of the previous DIE, as we process children before
- // ending the parent.
- virtual void EndDIE(uint64 offset) { }
+ // Pointer to the .debug_str.dwo section.
+ const char* string_buffer_;
+ // Size of the .debug_str.dwo section.
+ size_t string_buffer_size_;
+
+ // Version of the .dwp file. We support versions 1 and 2 currently.
+ int version_;
+
+ // Number of columns in the section tables (version 2).
+ unsigned int ncolumns_;
+
+ // Number of units in the section tables (version 2).
+ unsigned int nunits_;
+
+ // Number of slots in the hash table.
+ unsigned int nslots_;
+
+ // Pointer to the beginning of the hash table.
+ const char* phash_;
+
+ // Pointer to the beginning of the index table.
+ const char* pindex_;
+
+ // Pointer to the beginning of the section index pool (version 1).
+ const char* shndx_pool_;
+
+ // Pointer to the beginning of the section offset table (version 2).
+ const char* offset_table_;
+
+ // Pointer to the beginning of the section size table (version 2).
+ const char* size_table_;
+
+ // Contents of the sections of interest (version 2).
+ const char* abbrev_data_;
+ size_t abbrev_size_;
+ const char* info_data_;
+ size_t info_size_;
+ const char* str_offsets_data_;
+ size_t str_offsets_size_;
};
// This class is a reader for DWARF's Call Frame Information. CFI
@@ -638,7 +875,7 @@ class CallFrameInfo {
// The mechanics of C++ exception handling, personality routines,
// and language-specific data areas are described here, rather nicely:
// http://www.codesourcery.com/public/cxx-abi/abi-eh.html
- CallFrameInfo(const char *buffer, size_t buffer_length,
+ CallFrameInfo(const uint8_t *buffer, size_t buffer_length,
ByteReader *reader, Handler *handler, Reporter *reporter,
bool eh_frame = false)
: buffer_(buffer), buffer_length_(buffer_length),
@@ -666,7 +903,7 @@ class CallFrameInfo {
size_t offset;
// The start of this entry in the buffer.
- const char *start;
+ const uint8_t *start;
// Which kind of entry this is.
//
@@ -677,16 +914,16 @@ class CallFrameInfo {
// The end of this entry's common prologue (initial length and id), and
// the start of this entry's kind-specific fields.
- const char *fields;
+ const uint8_t *fields;
// The start of this entry's instructions.
- const char *instructions;
+ const uint8_t *instructions;
// The address past the entry's last byte in the buffer. (Note that
// since offset points to the entry's initial length field, and the
// length field is the number of bytes after that field, this is not
// simply buffer_ + offset + length.)
- const char *end;
+ const uint8_t *end;
// For both DWARF CFI and .eh_frame sections, this is the CIE id in a
// CIE, and the offset of the associated CIE in an FDE.
@@ -763,7 +1000,7 @@ class CallFrameInfo {
// true. On failure, report the problem, and return false. Even if we
// return false, set ENTRY->end to the first byte after the entry if we
// were able to figure that out, or NULL if we weren't.
- bool ReadEntryPrologue(const char *cursor, Entry *entry);
+ bool ReadEntryPrologue(const uint8_t *cursor, Entry *entry);
// Parse the fields of a CIE after the entry prologue, including any 'z'
// augmentation data. Assume that the 'Entry' fields of CIE are
@@ -791,7 +1028,7 @@ class CallFrameInfo {
}
// The contents of the DWARF .debug_info section we're parsing.
- const char *buffer_;
+ const uint8_t *buffer_;
size_t buffer_length_;
// For reading multi-byte values with the appropriate endianness.
@@ -990,6 +1227,14 @@ class CallFrameInfo::Reporter {
// there is not a CIE.
virtual void BadCIEId(uint64 offset, uint64 cie_offset);
+ // The FDE at OFFSET refers to a CIE with an address size we don't know how
+ // to handle.
+ virtual void UnexpectedAddressSize(uint64 offset, uint8_t address_size);
+
+ // The FDE at OFFSET refers to a CIE with an segment descriptor size we
+ // don't know how to handle.
+ virtual void UnexpectedSegmentSize(uint64 offset, uint8_t segment_size);
+
// The FDE at OFFSET refers to a CIE with version number VERSION,
// which we don't recognize. We cannot parse DWARF CFI if it uses
// a version number we don't recognize.
diff --git a/3rdParty/Breakpad/src/common/dwarf/dwarf2reader_cfi_unittest.cc b/3rdParty/Breakpad/src/common/dwarf/dwarf2reader_cfi_unittest.cc
new file mode 100644
index 0000000..38cc7ea
--- /dev/null
+++ b/3rdParty/Breakpad/src/common/dwarf/dwarf2reader_cfi_unittest.cc
@@ -0,0 +1,2555 @@
+// Copyright (c) 2010, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// Original author: Jim Blandy <jimb@mozilla.com> <jimb@red-bean.com>
+
+// dwarf2reader_cfi_unittest.cc: Unit tests for dwarf2reader::CallFrameInfo
+
+#include <stdint.h>
+#include <stdlib.h>
+
+#include <string>
+#include <vector>
+
+// The '.eh_frame' format, used by the Linux C++ ABI for exception
+// handling, is poorly specified. To help test our support for .eh_frame,
+// if you #define WRITE_ELF while compiling this file, and add the
+// 'include' directory from the binutils, gcc, or gdb source tree to the
+// #include path, then each test that calls the
+// PERHAPS_WRITE_DEBUG_FRAME_FILE or PERHAPS_WRITE_EH_FRAME_FILE will write
+// an ELF file containing a .debug_frame or .eh_frame section; you can then
+// use tools like readelf to examine the test data, and check the tools'
+// interpretation against the test's intentions. Each ELF file is named
+// "cfitest-TEST", where TEST identifies the particular test.
+#ifdef WRITE_ELF
+#include <errno.h>
+#include <stdio.h>
+#include <string.h>
+extern "C" {
+// To compile with WRITE_ELF, you should add the 'include' directory
+// of the binutils, gcc, or gdb source tree to your #include path;
+// that directory contains this header.
+#include "elf/common.h"
+}
+#endif
+
+#include "breakpad_googletest_includes.h"
+#include "common/dwarf/bytereader-inl.h"
+#include "common/dwarf/cfi_assembler.h"
+#include "common/dwarf/dwarf2reader.h"
+#include "common/using_std_string.h"
+#include "google_breakpad/common/breakpad_types.h"
+
+using google_breakpad::CFISection;
+using google_breakpad::test_assembler::Label;
+using google_breakpad::test_assembler::kBigEndian;
+using google_breakpad::test_assembler::kLittleEndian;
+using google_breakpad::test_assembler::Section;
+
+using dwarf2reader::DwarfPointerEncoding;
+using dwarf2reader::ENDIANNESS_BIG;
+using dwarf2reader::ENDIANNESS_LITTLE;
+using dwarf2reader::ByteReader;
+using dwarf2reader::CallFrameInfo;
+
+using std::vector;
+using testing::InSequence;
+using testing::Return;
+using testing::Sequence;
+using testing::Test;
+using testing::_;
+
+#ifdef WRITE_ELF
+void WriteELFFrameSection(const char *filename, const char *section_name,
+ const CFISection &section);
+#define PERHAPS_WRITE_DEBUG_FRAME_FILE(name, section) \
+ WriteELFFrameSection("cfitest-" name, ".debug_frame", section);
+#define PERHAPS_WRITE_EH_FRAME_FILE(name, section) \
+ WriteELFFrameSection("cfitest-" name, ".eh_frame", section);
+#else
+#define PERHAPS_WRITE_DEBUG_FRAME_FILE(name, section)
+#define PERHAPS_WRITE_EH_FRAME_FILE(name, section)
+#endif
+
+class MockCallFrameInfoHandler: public CallFrameInfo::Handler {
+ public:
+ MOCK_METHOD6(Entry, bool(size_t offset, uint64 address, uint64 length,
+ uint8 version, const string &augmentation,
+ unsigned return_address));
+ MOCK_METHOD2(UndefinedRule, bool(uint64 address, int reg));
+ MOCK_METHOD2(SameValueRule, bool(uint64 address, int reg));
+ MOCK_METHOD4(OffsetRule, bool(uint64 address, int reg, int base_register,
+ long offset));
+ MOCK_METHOD4(ValOffsetRule, bool(uint64 address, int reg, int base_register,
+ long offset));
+ MOCK_METHOD3(RegisterRule, bool(uint64 address, int reg, int base_register));
+ MOCK_METHOD3(ExpressionRule, bool(uint64 address, int reg,
+ const string &expression));
+ MOCK_METHOD3(ValExpressionRule, bool(uint64 address, int reg,
+ const string &expression));
+ MOCK_METHOD0(End, bool());
+ MOCK_METHOD2(PersonalityRoutine, bool(uint64 address, bool indirect));
+ MOCK_METHOD2(LanguageSpecificDataArea, bool(uint64 address, bool indirect));
+ MOCK_METHOD0(SignalHandler, bool());
+};
+
+class MockCallFrameErrorReporter: public CallFrameInfo::Reporter {
+ public:
+ MockCallFrameErrorReporter() : Reporter("mock filename", "mock section") { }
+ MOCK_METHOD2(Incomplete, void(uint64, CallFrameInfo::EntryKind));
+ MOCK_METHOD1(EarlyEHTerminator, void(uint64));
+ MOCK_METHOD2(CIEPointerOutOfRange, void(uint64, uint64));
+ MOCK_METHOD2(BadCIEId, void(uint64, uint64));
+ MOCK_METHOD2(UnexpectedAddressSize, void(uint64, uint8_t));
+ MOCK_METHOD2(UnexpectedSegmentSize, void(uint64, uint8_t));
+ MOCK_METHOD2(UnrecognizedVersion, void(uint64, int version));
+ MOCK_METHOD2(UnrecognizedAugmentation, void(uint64, const string &));
+ MOCK_METHOD2(InvalidPointerEncoding, void(uint64, uint8));
+ MOCK_METHOD2(UnusablePointerEncoding, void(uint64, uint8));
+ MOCK_METHOD2(RestoreInCIE, void(uint64, uint64));
+ MOCK_METHOD3(BadInstruction, void(uint64, CallFrameInfo::EntryKind, uint64));
+ MOCK_METHOD3(NoCFARule, void(uint64, CallFrameInfo::EntryKind, uint64));
+ MOCK_METHOD3(EmptyStateStack, void(uint64, CallFrameInfo::EntryKind, uint64));
+};
+
+struct CFIFixture {
+
+ enum { kCFARegister = CallFrameInfo::Handler::kCFARegister };
+
+ CFIFixture() {
+ // Default expectations for the data handler.
+ //
+ // - Leave Entry and End without expectations, as it's probably a
+ // good idea to set those explicitly in each test.
+ //
+ // - Expect the *Rule functions to not be called,
+ // so that each test can simply list the calls they expect.
+ //
+ // I gather I could use StrictMock for this, but the manual seems
+ // to suggest using that only as a last resort, and this isn't so
+ // bad.
+ EXPECT_CALL(handler, UndefinedRule(_, _)).Times(0);
+ EXPECT_CALL(handler, SameValueRule(_, _)).Times(0);
+ EXPECT_CALL(handler, OffsetRule(_, _, _, _)).Times(0);
+ EXPECT_CALL(handler, ValOffsetRule(_, _, _, _)).Times(0);
+ EXPECT_CALL(handler, RegisterRule(_, _, _)).Times(0);
+ EXPECT_CALL(handler, ExpressionRule(_, _, _)).Times(0);
+ EXPECT_CALL(handler, ValExpressionRule(_, _, _)).Times(0);
+ EXPECT_CALL(handler, PersonalityRoutine(_, _)).Times(0);
+ EXPECT_CALL(handler, LanguageSpecificDataArea(_, _)).Times(0);
+ EXPECT_CALL(handler, SignalHandler()).Times(0);
+
+ // Default expectations for the error/warning reporer.
+ EXPECT_CALL(reporter, Incomplete(_, _)).Times(0);
+ EXPECT_CALL(reporter, EarlyEHTerminator(_)).Times(0);
+ EXPECT_CALL(reporter, CIEPointerOutOfRange(_, _)).Times(0);
+ EXPECT_CALL(reporter, BadCIEId(_, _)).Times(0);
+ EXPECT_CALL(reporter, UnrecognizedVersion(_, _)).Times(0);
+ EXPECT_CALL(reporter, UnrecognizedAugmentation(_, _)).Times(0);
+ EXPECT_CALL(reporter, InvalidPointerEncoding(_, _)).Times(0);
+ EXPECT_CALL(reporter, UnusablePointerEncoding(_, _)).Times(0);
+ EXPECT_CALL(reporter, RestoreInCIE(_, _)).Times(0);
+ EXPECT_CALL(reporter, BadInstruction(_, _, _)).Times(0);
+ EXPECT_CALL(reporter, NoCFARule(_, _, _)).Times(0);
+ EXPECT_CALL(reporter, EmptyStateStack(_, _, _)).Times(0);
+ }
+
+ MockCallFrameInfoHandler handler;
+ MockCallFrameErrorReporter reporter;
+};
+
+class CFI: public CFIFixture, public Test { };
+
+TEST_F(CFI, EmptyRegion) {
+ EXPECT_CALL(handler, Entry(_, _, _, _, _, _)).Times(0);
+ EXPECT_CALL(handler, End()).Times(0);
+ static const uint8_t data[] = { 42 };
+
+ ByteReader byte_reader(ENDIANNESS_BIG);
+ CallFrameInfo parser(data, 0, &byte_reader, &handler, &reporter);
+ EXPECT_TRUE(parser.Start());
+}
+
+TEST_F(CFI, IncompleteLength32) {
+ CFISection section(kBigEndian, 8);
+ section
+ // Not even long enough for an initial length.
+ .D16(0xa0f)
+ // Padding to keep valgrind happy. We subtract these off when we
+ // construct the parser.
+ .D16(0);
+
+ EXPECT_CALL(handler, Entry(_, _, _, _, _, _)).Times(0);
+ EXPECT_CALL(handler, End()).Times(0);
+
+ EXPECT_CALL(reporter, Incomplete(_, CallFrameInfo::kUnknown))
+ .WillOnce(Return());
+
+ string contents;
+ ASSERT_TRUE(section.GetContents(&contents));
+
+ ByteReader byte_reader(ENDIANNESS_BIG);
+ byte_reader.SetAddressSize(8);
+ CallFrameInfo parser(reinterpret_cast<const uint8_t *>(contents.data()),
+ contents.size() - 2,
+ &byte_reader, &handler, &reporter);
+ EXPECT_FALSE(parser.Start());
+}
+
+TEST_F(CFI, IncompleteLength64) {
+ CFISection section(kLittleEndian, 4);
+ section
+ // An incomplete 64-bit DWARF initial length.
+ .D32(0xffffffff).D32(0x71fbaec2)
+ // Padding to keep valgrind happy. We subtract these off when we
+ // construct the parser.
+ .D32(0);
+
+ EXPECT_CALL(handler, Entry(_, _, _, _, _, _)).Times(0);
+ EXPECT_CALL(handler, End()).Times(0);
+
+ EXPECT_CALL(reporter, Incomplete(_, CallFrameInfo::kUnknown))
+ .WillOnce(Return());
+
+ string contents;
+ ASSERT_TRUE(section.GetContents(&contents));
+
+ ByteReader byte_reader(ENDIANNESS_LITTLE);
+ byte_reader.SetAddressSize(4);
+ CallFrameInfo parser(reinterpret_cast<const uint8_t *>(contents.data()),
+ contents.size() - 4,
+ &byte_reader, &handler, &reporter);
+ EXPECT_FALSE(parser.Start());
+}
+
+TEST_F(CFI, IncompleteId32) {
+ CFISection section(kBigEndian, 8);
+ section
+ .D32(3) // Initial length, not long enough for id
+ .D8(0xd7).D8(0xe5).D8(0xf1) // incomplete id
+ .CIEHeader(8727, 3983, 8889, 3, "")
+ .FinishEntry();
+
+ EXPECT_CALL(handler, Entry(_, _, _, _, _, _)).Times(0);
+ EXPECT_CALL(handler, End()).Times(0);
+
+ EXPECT_CALL(reporter, Incomplete(_, CallFrameInfo::kUnknown))
+ .WillOnce(Return());
+
+ string contents;
+ ASSERT_TRUE(section.GetContents(&contents));
+
+ ByteReader byte_reader(ENDIANNESS_BIG);
+ byte_reader.SetAddressSize(8);
+ CallFrameInfo parser(reinterpret_cast<const uint8_t *>(contents.data()),
+ contents.size(),
+ &byte_reader, &handler, &reporter);
+ EXPECT_FALSE(parser.Start());
+}
+
+TEST_F(CFI, BadId32) {
+ CFISection section(kBigEndian, 8);
+ section
+ .D32(0x100) // Initial length
+ .D32(0xe802fade) // bogus ID
+ .Append(0x100 - 4, 0x42); // make the length true
+ section
+ .CIEHeader(1672, 9872, 8529, 3, "")
+ .FinishEntry();
+
+ EXPECT_CALL(handler, Entry(_, _, _, _, _, _)).Times(0);
+ EXPECT_CALL(handler, End()).Times(0);
+
+ EXPECT_CALL(reporter, CIEPointerOutOfRange(_, 0xe802fade))
+ .WillOnce(Return());
+
+ string contents;
+ ASSERT_TRUE(section.GetContents(&contents));
+
+ ByteReader byte_reader(ENDIANNESS_BIG);
+ byte_reader.SetAddressSize(8);
+ CallFrameInfo parser(reinterpret_cast<const uint8_t *>(contents.data()),
+ contents.size(),
+ &byte_reader, &handler, &reporter);
+ EXPECT_FALSE(parser.Start());
+}
+
+// A lone CIE shouldn't cause any handler calls.
+TEST_F(CFI, SingleCIE) {
+ CFISection section(kLittleEndian, 4);
+ section.CIEHeader(0xffe799a8, 0x3398dcdd, 0x6e9683de, 3, "");
+ section.Append(10, dwarf2reader::DW_CFA_nop);
+ section.FinishEntry();
+
+ PERHAPS_WRITE_DEBUG_FRAME_FILE("SingleCIE", section);
+
+ EXPECT_CALL(handler, Entry(_, _, _, _, _, _)).Times(0);
+ EXPECT_CALL(handler, End()).Times(0);
+
+ string contents;
+ EXPECT_TRUE(section.GetContents(&contents));
+ ByteReader byte_reader(ENDIANNESS_LITTLE);
+ byte_reader.SetAddressSize(4);
+ CallFrameInfo parser(reinterpret_cast<const uint8_t *>(contents.data()),
+ contents.size(),
+ &byte_reader, &handler, &reporter);
+ EXPECT_TRUE(parser.Start());
+}
+
+// One FDE, one CIE.
+TEST_F(CFI, OneFDE) {
+ CFISection section(kBigEndian, 4);
+ Label cie;
+ section
+ .Mark(&cie)
+ .CIEHeader(0x4be22f75, 0x2492236e, 0x6b6efb87, 3, "")
+ .FinishEntry()
+ .FDEHeader(cie, 0x7714740d, 0x3d5a10cd)
+ .FinishEntry();
+
+ PERHAPS_WRITE_DEBUG_FRAME_FILE("OneFDE", section);
+
+ {
+ InSequence s;
+ EXPECT_CALL(handler,
+ Entry(_, 0x7714740d, 0x3d5a10cd, 3, "", 0x6b6efb87))
+ .WillOnce(Return(true));
+ EXPECT_CALL(handler, End()).WillOnce(Return(true));
+ }
+
+ string contents;
+ EXPECT_TRUE(section.GetContents(&contents));
+ ByteReader byte_reader(ENDIANNESS_BIG);
+ byte_reader.SetAddressSize(4);
+ CallFrameInfo parser(reinterpret_cast<const uint8_t *>(contents.data()),
+ contents.size(),
+ &byte_reader, &handler, &reporter);
+ EXPECT_TRUE(parser.Start());
+}
+
+// Two FDEs share a CIE.
+TEST_F(CFI, TwoFDEsOneCIE) {
+ CFISection section(kBigEndian, 4);
+ Label cie;
+ section
+ // First FDE. readelf complains about this one because it makes
+ // a forward reference to its CIE.
+ .FDEHeader(cie, 0xa42744df, 0xa3b42121)
+ .FinishEntry()
+ // CIE.
+ .Mark(&cie)
+ .CIEHeader(0x04f7dc7b, 0x3d00c05f, 0xbd43cb59, 3, "")
+ .FinishEntry()
+ // Second FDE.
+ .FDEHeader(cie, 0x6057d391, 0x700f608d)
+ .FinishEntry();
+
+ PERHAPS_WRITE_DEBUG_FRAME_FILE("TwoFDEsOneCIE", section);
+
+ {
+ InSequence s;
+ EXPECT_CALL(handler,
+ Entry(_, 0xa42744df, 0xa3b42121, 3, "", 0xbd43cb59))
+ .WillOnce(Return(true));
+ EXPECT_CALL(handler, End()).WillOnce(Return(true));
+ }
+ {
+ InSequence s;
+ EXPECT_CALL(handler,
+ Entry(_, 0x6057d391, 0x700f608d, 3, "", 0xbd43cb59))
+ .WillOnce(Return(true));
+ EXPECT_CALL(handler, End()).WillOnce(Return(true));
+ }
+
+ string contents;
+ EXPECT_TRUE(section.GetContents(&contents));
+ ByteReader byte_reader(ENDIANNESS_BIG);
+ byte_reader.SetAddressSize(4);
+ CallFrameInfo parser(reinterpret_cast<const uint8_t *>(contents.data()),
+ contents.size(),
+ &byte_reader, &handler, &reporter);
+ EXPECT_TRUE(parser.Start());
+}
+
+// Two FDEs, two CIEs.
+TEST_F(CFI, TwoFDEsTwoCIEs) {
+ CFISection section(kLittleEndian, 8);
+ Label cie1, cie2;
+ section
+ // First CIE.
+ .Mark(&cie1)
+ .CIEHeader(0x694d5d45, 0x4233221b, 0xbf45e65a, 3, "")
+ .FinishEntry()
+ // First FDE which cites second CIE. readelf complains about
+ // this one because it makes a forward reference to its CIE.
+ .FDEHeader(cie2, 0x778b27dfe5871f05ULL, 0x324ace3448070926ULL)
+ .FinishEntry()
+ // Second FDE, which cites first CIE.
+ .FDEHeader(cie1, 0xf6054ca18b10bf5fULL, 0x45fdb970d8bca342ULL)
+ .FinishEntry()
+ // Second CIE.
+ .Mark(&cie2)
+ .CIEHeader(0xfba3fad7, 0x6287e1fd, 0x61d2c581, 2, "")
+ .FinishEntry();
+
+ PERHAPS_WRITE_DEBUG_FRAME_FILE("TwoFDEsTwoCIEs", section);
+
+ {
+ InSequence s;
+ EXPECT_CALL(handler,
+ Entry(_, 0x778b27dfe5871f05ULL, 0x324ace3448070926ULL, 2,
+ "", 0x61d2c581))
+ .WillOnce(Return(true));
+ EXPECT_CALL(handler, End()).WillOnce(Return(true));
+ }
+ {
+ InSequence s;
+ EXPECT_CALL(handler,
+ Entry(_, 0xf6054ca18b10bf5fULL, 0x45fdb970d8bca342ULL, 3,
+ "", 0xbf45e65a))
+ .WillOnce(Return(true));
+ EXPECT_CALL(handler, End()).WillOnce(Return(true));
+ }
+
+ string contents;
+ EXPECT_TRUE(section.GetContents(&contents));
+ ByteReader byte_reader(ENDIANNESS_LITTLE);
+ byte_reader.SetAddressSize(8);
+ CallFrameInfo parser(reinterpret_cast<const uint8_t *>(contents.data()),
+ contents.size(),
+ &byte_reader, &handler, &reporter);
+ EXPECT_TRUE(parser.Start());
+}
+
+// An FDE whose CIE specifies a version we don't recognize.
+TEST_F(CFI, BadVersion) {
+ CFISection section(kBigEndian, 4);
+ Label cie1, cie2;
+ section
+ .Mark(&cie1)
+ .CIEHeader(0xca878cf0, 0x7698ec04, 0x7b616f54, 0x52, "")
+ .FinishEntry()
+ // We should skip this entry, as its CIE specifies a version we
+ // don't recognize.
+ .FDEHeader(cie1, 0x08852292, 0x2204004a)
+ .FinishEntry()
+ // Despite the above, we should visit this entry.
+ .Mark(&cie2)
+ .CIEHeader(0x7c3ae7c9, 0xb9b9a512, 0x96cb3264, 3, "")
+ .FinishEntry()
+ .FDEHeader(cie2, 0x2094735a, 0x6e875501)
+ .FinishEntry();
+
+ PERHAPS_WRITE_DEBUG_FRAME_FILE("BadVersion", section);
+
+ EXPECT_CALL(reporter, UnrecognizedVersion(_, 0x52))
+ .WillOnce(Return());
+
+ {
+ InSequence s;
+ // We should see no mention of the first FDE, but we should get
+ // a call to Entry for the second.
+ EXPECT_CALL(handler, Entry(_, 0x2094735a, 0x6e875501, 3, "",
+ 0x96cb3264))
+ .WillOnce(Return(true));
+ EXPECT_CALL(handler, End())
+ .WillOnce(Return(true));
+ }
+
+ string contents;
+ EXPECT_TRUE(section.GetContents(&contents));
+ ByteReader byte_reader(ENDIANNESS_BIG);
+ byte_reader.SetAddressSize(4);
+ CallFrameInfo parser(reinterpret_cast<const uint8_t *>(contents.data()),
+ contents.size(),
+ &byte_reader, &handler, &reporter);
+ EXPECT_FALSE(parser.Start());
+}
+
+// An FDE whose CIE specifies an augmentation we don't recognize.
+TEST_F(CFI, BadAugmentation) {
+ CFISection section(kBigEndian, 4);
+ Label cie1, cie2;
+ section
+ .Mark(&cie1)
+ .CIEHeader(0x4be22f75, 0x2492236e, 0x6b6efb87, 3, "spaniels!")
+ .FinishEntry()
+ // We should skip this entry, as its CIE specifies an
+ // augmentation we don't recognize.
+ .FDEHeader(cie1, 0x7714740d, 0x3d5a10cd)
+ .FinishEntry()
+ // Despite the above, we should visit this entry.
+ .Mark(&cie2)
+ .CIEHeader(0xf8bc4399, 0x8cf09931, 0xf2f519b2, 3, "")
+ .FinishEntry()
+ .FDEHeader(cie2, 0x7bf0fda0, 0xcbcd28d8)
+ .FinishEntry();
+
+ PERHAPS_WRITE_DEBUG_FRAME_FILE("BadAugmentation", section);
+
+ EXPECT_CALL(reporter, UnrecognizedAugmentation(_, "spaniels!"))
+ .WillOnce(Return());
+
+ {
+ InSequence s;
+ // We should see no mention of the first FDE, but we should get
+ // a call to Entry for the second.
+ EXPECT_CALL(handler, Entry(_, 0x7bf0fda0, 0xcbcd28d8, 3, "",
+ 0xf2f519b2))
+ .WillOnce(Return(true));
+ EXPECT_CALL(handler, End())
+ .WillOnce(Return(true));
+ }
+
+ string contents;
+ EXPECT_TRUE(section.GetContents(&contents));
+ ByteReader byte_reader(ENDIANNESS_BIG);
+ byte_reader.SetAddressSize(4);
+ CallFrameInfo parser(reinterpret_cast<const uint8_t *>(contents.data()),
+ contents.size(),
+ &byte_reader, &handler, &reporter);
+ EXPECT_FALSE(parser.Start());
+}
+
+// The return address column field is a byte in CFI version 1
+// (DWARF2), but a ULEB128 value in version 3 (DWARF3).
+TEST_F(CFI, CIEVersion1ReturnColumn) {
+ CFISection section(kBigEndian, 4);
+ Label cie;
+ section
+ // CIE, using the version 1 format: return column is a ubyte.
+ .Mark(&cie)
+ // Use a value for the return column that is parsed differently
+ // as a ubyte and as a ULEB128.
+ .CIEHeader(0xbcdea24f, 0x5be28286, 0x9f, 1, "")
+ .FinishEntry()
+ // FDE, citing that CIE.
+ .FDEHeader(cie, 0xb8d347b5, 0x825e55dc)
+ .FinishEntry();
+
+ PERHAPS_WRITE_DEBUG_FRAME_FILE("CIEVersion1ReturnColumn", section);
+
+ {
+ InSequence s;
+ EXPECT_CALL(handler, Entry(_, 0xb8d347b5, 0x825e55dc, 1, "", 0x9f))
+ .WillOnce(Return(true));
+ EXPECT_CALL(handler, End()).WillOnce(Return(true));
+ }
+
+ string contents;
+ EXPECT_TRUE(section.GetContents(&contents));
+ ByteReader byte_reader(ENDIANNESS_BIG);
+ byte_reader.SetAddressSize(4);
+ CallFrameInfo parser(reinterpret_cast<const uint8_t *>(contents.data()),
+ contents.size(),
+ &byte_reader, &handler, &reporter);
+ EXPECT_TRUE(parser.Start());
+}
+
+// The return address column field is a byte in CFI version 1
+// (DWARF2), but a ULEB128 value in version 3 (DWARF3).
+TEST_F(CFI, CIEVersion3ReturnColumn) {
+ CFISection section(kBigEndian, 4);
+ Label cie;
+ section
+ // CIE, using the version 3 format: return column is a ULEB128.
+ .Mark(&cie)
+ // Use a value for the return column that is parsed differently
+ // as a ubyte and as a ULEB128.
+ .CIEHeader(0x0ab4758d, 0xc010fdf7, 0x89, 3, "")
+ .FinishEntry()
+ // FDE, citing that CIE.
+ .FDEHeader(cie, 0x86763f2b, 0x2a66dc23)
+ .FinishEntry();
+
+ PERHAPS_WRITE_DEBUG_FRAME_FILE("CIEVersion3ReturnColumn", section);
+
+ {
+ InSequence s;
+ EXPECT_CALL(handler, Entry(_, 0x86763f2b, 0x2a66dc23, 3, "", 0x89))
+ .WillOnce(Return(true));
+ EXPECT_CALL(handler, End()).WillOnce(Return(true));
+ }
+
+ string contents;
+ EXPECT_TRUE(section.GetContents(&contents));
+ ByteReader byte_reader(ENDIANNESS_BIG);
+ byte_reader.SetAddressSize(4);
+ CallFrameInfo parser(reinterpret_cast<const uint8_t *>(contents.data()),
+ contents.size(),
+ &byte_reader, &handler, &reporter);
+ EXPECT_TRUE(parser.Start());
+}
+
+TEST_F(CFI, CIEVersion4AdditionalFields) {
+ CFISection section(kBigEndian, 4);
+ Label cie;
+ section
+ .Mark(&cie)
+ // CIE version 4 with expected address and segment size.
+ .CIEHeader(0x0ab4758d, 0xc010fdf7, 0x89, 4, "", true, 8, 0)
+ .FinishEntry()
+ // FDE, citing that CIE.
+ .FDEHeader(cie, 0x86763f2b, 0x2a66dc23)
+ .FinishEntry();
+
+ PERHAPS_WRITE_DEBUG_FRAME_FILE("CIEVersion3ReturnColumn", section);
+
+ {
+ InSequence s;
+ EXPECT_CALL(handler, Entry(_, 0x86763f2b, 0x2a66dc23, 4, "", 0x89))
+ .WillOnce(Return(true));
+ EXPECT_CALL(handler, End()).WillOnce(Return(true));
+ }
+
+ string contents;
+ EXPECT_TRUE(section.GetContents(&contents));
+ ByteReader byte_reader(ENDIANNESS_BIG);
+ byte_reader.SetAddressSize(4);
+ CallFrameInfo parser(reinterpret_cast<const uint8_t *>(contents.data()),
+ contents.size(),
+ &byte_reader, &handler, &reporter);
+ EXPECT_TRUE(parser.Start());
+}
+
+TEST_F(CFI, CIEVersion4AdditionalFieldsUnexpectedAddressSize) {
+ CFISection section(kBigEndian, 4);
+ Label cie;
+
+ section
+ .Mark(&cie)
+ // Unexpected address size.
+ .CIEHeader(0x4be22f75, 0x2492236e, 0x6b6efb87, 4, "", true, 3, 0)
+ .FinishEntry()
+ // FDE, citing that CIE.
+ .FDEHeader(cie, 0x86763f2b, 0x2a66dc23)
+ .FinishEntry();
+
+ PERHAPS_WRITE_DEBUG_FRAME_FILE("AdditionalFieldsUnexpectedAddress", section);
+
+ EXPECT_CALL(reporter, UnexpectedAddressSize(_, 3))
+ .WillOnce(Return());
+
+ string contents;
+ EXPECT_TRUE(section.GetContents(&contents));
+ ByteReader byte_reader(ENDIANNESS_BIG);
+ byte_reader.SetAddressSize(8);
+ CallFrameInfo parser(reinterpret_cast<const uint8_t *>(contents.data()),
+ contents.size(),
+ &byte_reader, &handler, &reporter);
+ EXPECT_FALSE(parser.Start());
+}
+
+TEST_F(CFI, CIEVersion4AdditionalFieldsUnexpectedSegmentSize) {
+ CFISection section(kBigEndian, 4);
+ Label cie;
+
+ section
+ .Mark(&cie)
+ .CIEHeader(0xf8bc4399, 0x8cf09931, 0xf2f519b2, 4, "", true, 8, 7)
+ .FinishEntry()
+ .FDEHeader(cie, 0x7bf0fda0, 0xcbcd28d8)
+ .FinishEntry();
+
+ PERHAPS_WRITE_DEBUG_FRAME_FILE("AdditionalFieldsUnexpectedSegment", section);
+
+ EXPECT_CALL(reporter, UnexpectedSegmentSize(_, 7))
+ .WillOnce(Return());
+
+ string contents;
+ EXPECT_TRUE(section.GetContents(&contents));
+ ByteReader byte_reader(ENDIANNESS_BIG);
+ byte_reader.SetAddressSize(8);
+ CallFrameInfo parser(reinterpret_cast<const uint8_t *>(contents.data()),
+ contents.size(),
+ &byte_reader, &handler, &reporter);
+ EXPECT_FALSE(parser.Start());
+}
+
+struct CFIInsnFixture: public CFIFixture {
+ CFIInsnFixture() : CFIFixture() {
+ data_factor = 0xb6f;
+ return_register = 0x9be1ed9f;
+ version = 3;
+ cfa_base_register = 0x383a3aa;
+ cfa_offset = 0xf748;
+ }
+
+ // Prepare SECTION to receive FDE instructions.
+ //
+ // - Append a stock CIE header that establishes the fixture's
+ // code_factor, data_factor, return_register, version, and
+ // augmentation values.
+ // - Have the CIE set up a CFA rule using cfa_base_register and
+ // cfa_offset.
+ // - Append a stock FDE header, referring to the above CIE, for the
+ // fde_size bytes at fde_start. Choose fde_start and fde_size
+ // appropriately for the section's address size.
+ // - Set appropriate expectations on handler in sequence s for the
+ // frame description entry and the CIE's CFA rule.
+ //
+ // On return, SECTION is ready to have FDE instructions appended to
+ // it, and its FinishEntry member called.
+ void StockCIEAndFDE(CFISection *section) {
+ // Choose appropriate constants for our address size.
+ if (section->AddressSize() == 4) {
+ fde_start = 0xc628ecfbU;
+ fde_size = 0x5dee04a2;
+ code_factor = 0x60b;
+ } else {
+ assert(section->AddressSize() == 8);
+ fde_start = 0x0005c57ce7806bd3ULL;
+ fde_size = 0x2699521b5e333100ULL;
+ code_factor = 0x01008e32855274a8ULL;
+ }
+
+ // Create the CIE.
+ (*section)
+ .Mark(&cie_label)
+ .CIEHeader(code_factor, data_factor, return_register, version,
+ "")
+ .D8(dwarf2reader::DW_CFA_def_cfa)
+ .ULEB128(cfa_base_register)
+ .ULEB128(cfa_offset)
+ .FinishEntry();
+
+ // Create the FDE.
+ section->FDEHeader(cie_label, fde_start, fde_size);
+
+ // Expect an Entry call for the FDE and a ValOffsetRule call for the
+ // CIE's CFA rule.
+ EXPECT_CALL(handler, Entry(_, fde_start, fde_size, version, "",
+ return_register))
+ .InSequence(s)
+ .WillOnce(Return(true));
+ EXPECT_CALL(handler, ValOffsetRule(fde_start, kCFARegister,
+ cfa_base_register, cfa_offset))
+ .InSequence(s)
+ .WillOnce(Return(true));
+ }
+
+ // Run the contents of SECTION through a CallFrameInfo parser,
+ // expecting parser.Start to return SUCCEEDS
+ void ParseSection(CFISection *section, bool succeeds = true) {
+ string contents;
+ EXPECT_TRUE(section->GetContents(&contents));
+ dwarf2reader::Endianness endianness;
+ if (section->endianness() == kBigEndian)
+ endianness = ENDIANNESS_BIG;
+ else {
+ assert(section->endianness() == kLittleEndian);
+ endianness = ENDIANNESS_LITTLE;
+ }
+ ByteReader byte_reader(endianness);
+ byte_reader.SetAddressSize(section->AddressSize());
+ CallFrameInfo parser(reinterpret_cast<const uint8_t *>(contents.data()),
+ contents.size(),
+ &byte_reader, &handler, &reporter);
+ if (succeeds)
+ EXPECT_TRUE(parser.Start());
+ else
+ EXPECT_FALSE(parser.Start());
+ }
+
+ Label cie_label;
+ Sequence s;
+ uint64 code_factor;
+ int data_factor;
+ unsigned return_register;
+ unsigned version;
+ unsigned cfa_base_register;
+ int cfa_offset;
+ uint64 fde_start, fde_size;
+};
+
+class CFIInsn: public CFIInsnFixture, public Test { };
+
+TEST_F(CFIInsn, DW_CFA_set_loc) {
+ CFISection section(kBigEndian, 4);
+ StockCIEAndFDE(&section);
+ section
+ .D8(dwarf2reader::DW_CFA_set_loc).D32(0xb1ee3e7a)
+ // Use DW_CFA_def_cfa to force a handler call that we can use to
+ // check the effect of the DW_CFA_set_loc.
+ .D8(dwarf2reader::DW_CFA_def_cfa).ULEB128(0x4defb431).ULEB128(0x6d17b0ee)
+ .FinishEntry();
+
+ PERHAPS_WRITE_DEBUG_FRAME_FILE("DW_CFA_set_loc", section);
+
+ EXPECT_CALL(handler,
+ ValOffsetRule(0xb1ee3e7a, kCFARegister, 0x4defb431, 0x6d17b0ee))
+ .InSequence(s)
+ .WillOnce(Return(true));
+ EXPECT_CALL(handler, End()).InSequence(s).WillOnce(Return(true));
+
+ ParseSection(&section);
+}
+
+TEST_F(CFIInsn, DW_CFA_advance_loc) {
+ CFISection section(kBigEndian, 8);
+ StockCIEAndFDE(&section);
+ section
+ .D8(dwarf2reader::DW_CFA_advance_loc | 0x2a)
+ // Use DW_CFA_def_cfa to force a handler call that we can use to
+ // check the effect of the DW_CFA_advance_loc.
+ .D8(dwarf2reader::DW_CFA_def_cfa).ULEB128(0x5bbb3715).ULEB128(0x0186c7bf)
+ .FinishEntry();
+
+ PERHAPS_WRITE_DEBUG_FRAME_FILE("DW_CFA_advance_loc", section);
+
+ EXPECT_CALL(handler,
+ ValOffsetRule(fde_start + 0x2a * code_factor,
+ kCFARegister, 0x5bbb3715, 0x0186c7bf))
+ .InSequence(s)
+ .WillOnce(Return(true));
+ EXPECT_CALL(handler, End()).InSequence(s).WillOnce(Return(true));
+
+ ParseSection(&section);
+}
+
+TEST_F(CFIInsn, DW_CFA_advance_loc1) {
+ CFISection section(kLittleEndian, 8);
+ StockCIEAndFDE(&section);
+ section
+ .D8(dwarf2reader::DW_CFA_advance_loc1).D8(0xd8)
+ .D8(dwarf2reader::DW_CFA_def_cfa).ULEB128(0x69d5696a).ULEB128(0x1eb7fc93)
+ .FinishEntry();
+
+ PERHAPS_WRITE_DEBUG_FRAME_FILE("DW_CFA_advance_loc1", section);
+
+ EXPECT_CALL(handler,
+ ValOffsetRule((fde_start + 0xd8 * code_factor),
+ kCFARegister, 0x69d5696a, 0x1eb7fc93))
+ .InSequence(s)
+ .WillOnce(Return(true));
+ EXPECT_CALL(handler, End()).InSequence(s).WillOnce(Return(true));
+
+ ParseSection(&section);
+}
+
+TEST_F(CFIInsn, DW_CFA_advance_loc2) {
+ CFISection section(kLittleEndian, 4);
+ StockCIEAndFDE(&section);
+ section
+ .D8(dwarf2reader::DW_CFA_advance_loc2).D16(0x3adb)
+ .D8(dwarf2reader::DW_CFA_def_cfa).ULEB128(0x3a368bed).ULEB128(0x3194ee37)
+ .FinishEntry();
+
+ PERHAPS_WRITE_DEBUG_FRAME_FILE("DW_CFA_advance_loc2", section);
+
+ EXPECT_CALL(handler,
+ ValOffsetRule((fde_start + 0x3adb * code_factor),
+ kCFARegister, 0x3a368bed, 0x3194ee37))
+ .InSequence(s)
+ .WillOnce(Return(true));
+ EXPECT_CALL(handler, End()).InSequence(s).WillOnce(Return(true));
+
+ ParseSection(&section);
+}
+
+TEST_F(CFIInsn, DW_CFA_advance_loc4) {
+ CFISection section(kBigEndian, 8);
+ StockCIEAndFDE(&section);
+ section
+ .D8(dwarf2reader::DW_CFA_advance_loc4).D32(0x15813c88)
+ .D8(dwarf2reader::DW_CFA_def_cfa).ULEB128(0x135270c5).ULEB128(0x24bad7cb)
+ .FinishEntry();
+
+ PERHAPS_WRITE_DEBUG_FRAME_FILE("DW_CFA_advance_loc4", section);
+
+ EXPECT_CALL(handler,
+ ValOffsetRule((fde_start + 0x15813c88ULL * code_factor),
+ kCFARegister, 0x135270c5, 0x24bad7cb))
+ .InSequence(s)
+ .WillOnce(Return(true));
+ EXPECT_CALL(handler, End()).InSequence(s).WillOnce(Return(true));
+
+ ParseSection(&section);
+}
+
+TEST_F(CFIInsn, DW_CFA_MIPS_advance_loc8) {
+ code_factor = 0x2d;
+ CFISection section(kBigEndian, 8);
+ StockCIEAndFDE(&section);
+ section
+ .D8(dwarf2reader::DW_CFA_MIPS_advance_loc8).D64(0x3c4f3945b92c14ULL)
+ .D8(dwarf2reader::DW_CFA_def_cfa).ULEB128(0xe17ed602).ULEB128(0x3d162e7f)
+ .FinishEntry();
+
+ PERHAPS_WRITE_DEBUG_FRAME_FILE("DW_CFA_advance_loc8", section);
+
+ EXPECT_CALL(handler,
+ ValOffsetRule((fde_start + 0x3c4f3945b92c14ULL * code_factor),
+ kCFARegister, 0xe17ed602, 0x3d162e7f))
+ .InSequence(s)
+ .WillOnce(Return(true));
+ EXPECT_CALL(handler, End()).InSequence(s).WillOnce(Return(true));
+
+ ParseSection(&section);
+}
+
+TEST_F(CFIInsn, DW_CFA_def_cfa) {
+ CFISection section(kLittleEndian, 4);
+ StockCIEAndFDE(&section);
+ section
+ .D8(dwarf2reader::DW_CFA_def_cfa).ULEB128(0x4e363a85).ULEB128(0x815f9aa7)
+ .FinishEntry();
+
+ PERHAPS_WRITE_DEBUG_FRAME_FILE("DW_CFA_def_cfa", section);
+
+ EXPECT_CALL(handler,
+ ValOffsetRule(fde_start, kCFARegister, 0x4e363a85, 0x815f9aa7))
+ .InSequence(s).WillOnce(Return(true));
+ EXPECT_CALL(handler, End()).InSequence(s).WillOnce(Return(true));
+
+ ParseSection(&section);
+}
+
+TEST_F(CFIInsn, DW_CFA_def_cfa_sf) {
+ CFISection section(kBigEndian, 4);
+ StockCIEAndFDE(&section);
+ section
+ .D8(dwarf2reader::DW_CFA_def_cfa_sf).ULEB128(0x8ccb32b7).LEB128(0x9ea)
+ .D8(dwarf2reader::DW_CFA_def_cfa_sf).ULEB128(0x9b40f5da).LEB128(-0x40a2)
+ .FinishEntry();
+
+ EXPECT_CALL(handler,
+ ValOffsetRule(fde_start, kCFARegister, 0x8ccb32b7,
+ 0x9ea * data_factor))
+ .InSequence(s).WillOnce(Return(true));
+ EXPECT_CALL(handler,
+ ValOffsetRule(fde_start, kCFARegister, 0x9b40f5da,
+ -0x40a2 * data_factor))
+ .InSequence(s).WillOnce(Return(true));
+ EXPECT_CALL(handler, End()).InSequence(s).WillOnce(Return(true));
+
+ ParseSection(&section);
+}
+
+TEST_F(CFIInsn, DW_CFA_def_cfa_register) {
+ CFISection section(kLittleEndian, 8);
+ StockCIEAndFDE(&section);
+ section
+ .D8(dwarf2reader::DW_CFA_def_cfa_register).ULEB128(0x3e7e9363)
+ .FinishEntry();
+
+ EXPECT_CALL(handler,
+ ValOffsetRule(fde_start, kCFARegister, 0x3e7e9363, cfa_offset))
+ .InSequence(s).WillOnce(Return(true));
+ EXPECT_CALL(handler, End()).InSequence(s).WillOnce(Return(true));
+
+ ParseSection(&section);
+}
+
+// DW_CFA_def_cfa_register should have no effect when applied to a
+// non-base/offset rule.
+TEST_F(CFIInsn, DW_CFA_def_cfa_registerBadRule) {
+ CFISection section(kBigEndian, 4);
+ StockCIEAndFDE(&section);
+ section
+ .D8(dwarf2reader::DW_CFA_def_cfa_expression).Block("needle in a haystack")
+ .D8(dwarf2reader::DW_CFA_def_cfa_register).ULEB128(0xf1b49e49)
+ .FinishEntry();
+
+ EXPECT_CALL(handler,
+ ValExpressionRule(fde_start, kCFARegister,
+ "needle in a haystack"))
+ .WillRepeatedly(Return(true));
+ EXPECT_CALL(handler, End()).InSequence(s).WillOnce(Return(true));
+
+ ParseSection(&section);
+}
+
+TEST_F(CFIInsn, DW_CFA_def_cfa_offset) {
+ CFISection section(kBigEndian, 4);
+ StockCIEAndFDE(&section);
+ section
+ .D8(dwarf2reader::DW_CFA_def_cfa_offset).ULEB128(0x1e8e3b9b)
+ .FinishEntry();
+
+ EXPECT_CALL(handler,
+ ValOffsetRule(fde_start, kCFARegister, cfa_base_register,
+ 0x1e8e3b9b))
+ .InSequence(s).WillOnce(Return(true));
+ EXPECT_CALL(handler, End()).InSequence(s).WillOnce(Return(true));
+
+ ParseSection(&section);
+}
+
+TEST_F(CFIInsn, DW_CFA_def_cfa_offset_sf) {
+ CFISection section(kLittleEndian, 4);
+ StockCIEAndFDE(&section);
+ section
+ .D8(dwarf2reader::DW_CFA_def_cfa_offset_sf).LEB128(0x970)
+ .D8(dwarf2reader::DW_CFA_def_cfa_offset_sf).LEB128(-0x2cd)
+ .FinishEntry();
+
+ EXPECT_CALL(handler,
+ ValOffsetRule(fde_start, kCFARegister, cfa_base_register,
+ 0x970 * data_factor))
+ .InSequence(s).WillOnce(Return(true));
+ EXPECT_CALL(handler,
+ ValOffsetRule(fde_start, kCFARegister, cfa_base_register,
+ -0x2cd * data_factor))
+ .InSequence(s).WillOnce(Return(true));
+ EXPECT_CALL(handler, End()).InSequence(s).WillOnce(Return(true));
+
+ ParseSection(&section);
+}
+
+// DW_CFA_def_cfa_offset should have no effect when applied to a
+// non-base/offset rule.
+TEST_F(CFIInsn, DW_CFA_def_cfa_offsetBadRule) {
+ CFISection section(kBigEndian, 4);
+ StockCIEAndFDE(&section);
+ section
+ .D8(dwarf2reader::DW_CFA_def_cfa_expression).Block("six ways to Sunday")
+ .D8(dwarf2reader::DW_CFA_def_cfa_offset).ULEB128(0x1e8e3b9b)
+ .FinishEntry();
+
+ EXPECT_CALL(handler,
+ ValExpressionRule(fde_start, kCFARegister, "six ways to Sunday"))
+ .WillRepeatedly(Return(true));
+ EXPECT_CALL(handler, End()).InSequence(s).WillOnce(Return(true));
+
+ ParseSection(&section);
+}
+
+TEST_F(CFIInsn, DW_CFA_def_cfa_expression) {
+ CFISection section(kLittleEndian, 8);
+ StockCIEAndFDE(&section);
+ section
+ .D8(dwarf2reader::DW_CFA_def_cfa_expression).Block("eating crow")
+ .FinishEntry();
+
+ EXPECT_CALL(handler, ValExpressionRule(fde_start, kCFARegister,
+ "eating crow"))
+ .InSequence(s).WillOnce(Return(true));
+ EXPECT_CALL(handler, End()).InSequence(s).WillOnce(Return(true));
+
+ ParseSection(&section);
+}
+
+TEST_F(CFIInsn, DW_CFA_undefined) {
+ CFISection section(kLittleEndian, 4);
+ StockCIEAndFDE(&section);
+ section
+ .D8(dwarf2reader::DW_CFA_undefined).ULEB128(0x300ce45d)
+ .FinishEntry();
+
+ EXPECT_CALL(handler, UndefinedRule(fde_start, 0x300ce45d))
+ .InSequence(s).WillOnce(Return(true));
+ EXPECT_CALL(handler, End()).InSequence(s).WillOnce(Return(true));
+
+ ParseSection(&section);
+}
+
+TEST_F(CFIInsn, DW_CFA_same_value) {
+ CFISection section(kLittleEndian, 4);
+ StockCIEAndFDE(&section);
+ section
+ .D8(dwarf2reader::DW_CFA_same_value).ULEB128(0x3865a760)
+ .FinishEntry();
+
+ EXPECT_CALL(handler, SameValueRule(fde_start, 0x3865a760))
+ .InSequence(s).WillOnce(Return(true));
+ EXPECT_CALL(handler, End()).InSequence(s).WillOnce(Return(true));
+
+ ParseSection(&section);
+}
+
+TEST_F(CFIInsn, DW_CFA_offset) {
+ CFISection section(kBigEndian, 4);
+ StockCIEAndFDE(&section);
+ section
+ .D8(dwarf2reader::DW_CFA_offset | 0x2c).ULEB128(0x9f6)
+ .FinishEntry();
+
+ EXPECT_CALL(handler,
+ OffsetRule(fde_start, 0x2c, kCFARegister, 0x9f6 * data_factor))
+ .InSequence(s).WillOnce(Return(true));
+ EXPECT_CALL(handler, End()).InSequence(s).WillOnce(Return(true));
+
+ ParseSection(&section);
+}
+
+TEST_F(CFIInsn, DW_CFA_offset_extended) {
+ CFISection section(kBigEndian, 4);
+ StockCIEAndFDE(&section);
+ section
+ .D8(dwarf2reader::DW_CFA_offset_extended).ULEB128(0x402b).ULEB128(0xb48)
+ .FinishEntry();
+
+ EXPECT_CALL(handler,
+ OffsetRule(fde_start, 0x402b, kCFARegister, 0xb48 * data_factor))
+ .InSequence(s).WillOnce(Return(true));
+ EXPECT_CALL(handler, End()).InSequence(s).WillOnce(Return(true));
+
+ ParseSection(&section);
+}
+
+TEST_F(CFIInsn, DW_CFA_offset_extended_sf) {
+ CFISection section(kBigEndian, 8);
+ StockCIEAndFDE(&section);
+ section
+ .D8(dwarf2reader::DW_CFA_offset_extended_sf)
+ .ULEB128(0x997c23ee).LEB128(0x2d00)
+ .D8(dwarf2reader::DW_CFA_offset_extended_sf)
+ .ULEB128(0x9519eb82).LEB128(-0xa77)
+ .FinishEntry();
+
+ EXPECT_CALL(handler,
+ OffsetRule(fde_start, 0x997c23ee,
+ kCFARegister, 0x2d00 * data_factor))
+ .InSequence(s).WillOnce(Return(true));
+ EXPECT_CALL(handler,
+ OffsetRule(fde_start, 0x9519eb82,
+ kCFARegister, -0xa77 * data_factor))
+ .InSequence(s).WillOnce(Return(true));
+ EXPECT_CALL(handler, End()).InSequence(s).WillOnce(Return(true));
+
+ ParseSection(&section);
+}
+
+TEST_F(CFIInsn, DW_CFA_val_offset) {
+ CFISection section(kBigEndian, 4);
+ StockCIEAndFDE(&section);
+ section
+ .D8(dwarf2reader::DW_CFA_val_offset).ULEB128(0x623562fe).ULEB128(0x673)
+ .FinishEntry();
+
+ EXPECT_CALL(handler,
+ ValOffsetRule(fde_start, 0x623562fe,
+ kCFARegister, 0x673 * data_factor))
+ .InSequence(s).WillOnce(Return(true));
+ EXPECT_CALL(handler, End()).InSequence(s).WillOnce(Return(true));
+
+ ParseSection(&section);
+}
+
+TEST_F(CFIInsn, DW_CFA_val_offset_sf) {
+ CFISection section(kBigEndian, 4);
+ StockCIEAndFDE(&section);
+ section
+ .D8(dwarf2reader::DW_CFA_val_offset_sf).ULEB128(0x6f4f).LEB128(0xaab)
+ .D8(dwarf2reader::DW_CFA_val_offset_sf).ULEB128(0x2483).LEB128(-0x8a2)
+ .FinishEntry();
+
+ EXPECT_CALL(handler,
+ ValOffsetRule(fde_start, 0x6f4f,
+ kCFARegister, 0xaab * data_factor))
+ .InSequence(s).WillOnce(Return(true));
+ EXPECT_CALL(handler,
+ ValOffsetRule(fde_start, 0x2483,
+ kCFARegister, -0x8a2 * data_factor))
+ .InSequence(s).WillOnce(Return(true));
+ EXPECT_CALL(handler, End()).InSequence(s).WillOnce(Return(true));
+
+ ParseSection(&section);
+}
+
+TEST_F(CFIInsn, DW_CFA_register) {
+ CFISection section(kLittleEndian, 8);
+ StockCIEAndFDE(&section);
+ section
+ .D8(dwarf2reader::DW_CFA_register).ULEB128(0x278d18f9).ULEB128(0x1a684414)
+ .FinishEntry();
+
+ EXPECT_CALL(handler, RegisterRule(fde_start, 0x278d18f9, 0x1a684414))
+ .InSequence(s).WillOnce(Return(true));
+ EXPECT_CALL(handler, End()).InSequence(s).WillOnce(Return(true));
+
+ ParseSection(&section);
+}
+
+TEST_F(CFIInsn, DW_CFA_expression) {
+ CFISection section(kBigEndian, 8);
+ StockCIEAndFDE(&section);
+ section
+ .D8(dwarf2reader::DW_CFA_expression).ULEB128(0xa1619fb2)
+ .Block("plus ça change, plus c'est la même chose")
+ .FinishEntry();
+
+ EXPECT_CALL(handler,
+ ExpressionRule(fde_start, 0xa1619fb2,
+ "plus ça change, plus c'est la même chose"))
+ .InSequence(s).WillOnce(Return(true));
+ EXPECT_CALL(handler, End()).InSequence(s).WillOnce(Return(true));
+
+ ParseSection(&section);
+}
+
+TEST_F(CFIInsn, DW_CFA_val_expression) {
+ CFISection section(kBigEndian, 4);
+ StockCIEAndFDE(&section);
+ section
+ .D8(dwarf2reader::DW_CFA_val_expression).ULEB128(0xc5e4a9e3)
+ .Block("he who has the gold makes the rules")
+ .FinishEntry();
+
+ EXPECT_CALL(handler,
+ ValExpressionRule(fde_start, 0xc5e4a9e3,
+ "he who has the gold makes the rules"))
+ .InSequence(s).WillOnce(Return(true));
+ EXPECT_CALL(handler, End()).InSequence(s).WillOnce(Return(true));
+
+ ParseSection(&section);
+}
+
+TEST_F(CFIInsn, DW_CFA_restore) {
+ CFISection section(kLittleEndian, 8);
+ code_factor = 0x01bd188a9b1fa083ULL;
+ data_factor = -0x1ac8;
+ return_register = 0x8c35b049;
+ version = 2;
+ fde_start = 0x2d70fe998298bbb1ULL;
+ fde_size = 0x46ccc2e63cf0b108ULL;
+ Label cie;
+ section
+ .Mark(&cie)
+ .CIEHeader(code_factor, data_factor, return_register, version,
+ "")
+ // Provide a CFA rule, because register rules require them.
+ .D8(dwarf2reader::DW_CFA_def_cfa).ULEB128(0x6ca1d50e).ULEB128(0x372e38e8)
+ // Provide an offset(N) rule for register 0x3c.
+ .D8(dwarf2reader::DW_CFA_offset | 0x3c).ULEB128(0xb348)
+ .FinishEntry()
+ // In the FDE...
+ .FDEHeader(cie, fde_start, fde_size)
+ // At a second address, provide a new offset(N) rule for register 0x3c.
+ .D8(dwarf2reader::DW_CFA_advance_loc | 0x13)
+ .D8(dwarf2reader::DW_CFA_offset | 0x3c).ULEB128(0x9a50)
+ // At a third address, restore the original rule for register 0x3c.
+ .D8(dwarf2reader::DW_CFA_advance_loc | 0x01)
+ .D8(dwarf2reader::DW_CFA_restore | 0x3c)
+ .FinishEntry();
+
+ {
+ InSequence s;
+ EXPECT_CALL(handler,
+ Entry(_, fde_start, fde_size, version, "", return_register))
+ .WillOnce(Return(true));
+ // CIE's CFA rule.
+ EXPECT_CALL(handler,
+ ValOffsetRule(fde_start, kCFARegister, 0x6ca1d50e, 0x372e38e8))
+ .WillOnce(Return(true));
+ // CIE's rule for register 0x3c.
+ EXPECT_CALL(handler,
+ OffsetRule(fde_start, 0x3c, kCFARegister, 0xb348 * data_factor))
+ .WillOnce(Return(true));
+ // FDE's rule for register 0x3c.
+ EXPECT_CALL(handler,
+ OffsetRule(fde_start + 0x13 * code_factor, 0x3c,
+ kCFARegister, 0x9a50 * data_factor))
+ .WillOnce(Return(true));
+ // Restore CIE's rule for register 0x3c.
+ EXPECT_CALL(handler,
+ OffsetRule(fde_start + (0x13 + 0x01) * code_factor, 0x3c,
+ kCFARegister, 0xb348 * data_factor))
+ .WillOnce(Return(true));
+ EXPECT_CALL(handler, End()).WillOnce(Return(true));
+ }
+
+ ParseSection(&section);
+}
+
+TEST_F(CFIInsn, DW_CFA_restoreNoRule) {
+ CFISection section(kBigEndian, 4);
+ code_factor = 0x005f78143c1c3b82ULL;
+ data_factor = 0x25d0;
+ return_register = 0xe8;
+ version = 1;
+ fde_start = 0x4062e30f;
+ fde_size = 0x5302a389;
+ Label cie;
+ section
+ .Mark(&cie)
+ .CIEHeader(code_factor, data_factor, return_register, version, "")
+ // Provide a CFA rule, because register rules require them.
+ .D8(dwarf2reader::DW_CFA_def_cfa).ULEB128(0x470aa334).ULEB128(0x099ef127)
+ .FinishEntry()
+ // In the FDE...
+ .FDEHeader(cie, fde_start, fde_size)
+ // At a second address, provide an offset(N) rule for register 0x2c.
+ .D8(dwarf2reader::DW_CFA_advance_loc | 0x7)
+ .D8(dwarf2reader::DW_CFA_offset | 0x2c).ULEB128(0x1f47)
+ // At a third address, restore the (missing) CIE rule for register 0x2c.
+ .D8(dwarf2reader::DW_CFA_advance_loc | 0xb)
+ .D8(dwarf2reader::DW_CFA_restore | 0x2c)
+ .FinishEntry();
+
+ {
+ InSequence s;
+ EXPECT_CALL(handler,
+ Entry(_, fde_start, fde_size, version, "", return_register))
+ .WillOnce(Return(true));
+ // CIE's CFA rule.
+ EXPECT_CALL(handler,
+ ValOffsetRule(fde_start, kCFARegister, 0x470aa334, 0x099ef127))
+ .WillOnce(Return(true));
+ // FDE's rule for register 0x2c.
+ EXPECT_CALL(handler,
+ OffsetRule(fde_start + 0x7 * code_factor, 0x2c,
+ kCFARegister, 0x1f47 * data_factor))
+ .WillOnce(Return(true));
+ // Restore CIE's (missing) rule for register 0x2c.
+ EXPECT_CALL(handler,
+ SameValueRule(fde_start + (0x7 + 0xb) * code_factor, 0x2c))
+ .WillOnce(Return(true));
+ EXPECT_CALL(handler, End()).WillOnce(Return(true));
+ }
+
+ ParseSection(&section);
+}
+
+TEST_F(CFIInsn, DW_CFA_restore_extended) {
+ CFISection section(kBigEndian, 4);
+ code_factor = 0x126e;
+ data_factor = -0xd8b;
+ return_register = 0x77711787;
+ version = 3;
+ fde_start = 0x01f55a45;
+ fde_size = 0x452adb80;
+ Label cie;
+ section
+ .Mark(&cie)
+ .CIEHeader(code_factor, data_factor, return_register, version,
+ "", true /* dwarf64 */ )
+ // Provide a CFA rule, because register rules require them.
+ .D8(dwarf2reader::DW_CFA_def_cfa).ULEB128(0x56fa0edd).ULEB128(0x097f78a5)
+ // Provide an offset(N) rule for register 0x0f9b8a1c.
+ .D8(dwarf2reader::DW_CFA_offset_extended)
+ .ULEB128(0x0f9b8a1c).ULEB128(0xc979)
+ .FinishEntry()
+ // In the FDE...
+ .FDEHeader(cie, fde_start, fde_size)
+ // At a second address, provide a new offset(N) rule for reg 0x0f9b8a1c.
+ .D8(dwarf2reader::DW_CFA_advance_loc | 0x3)
+ .D8(dwarf2reader::DW_CFA_offset_extended)
+ .ULEB128(0x0f9b8a1c).ULEB128(0x3b7b)
+ // At a third address, restore the original rule for register 0x0f9b8a1c.
+ .D8(dwarf2reader::DW_CFA_advance_loc | 0x04)
+ .D8(dwarf2reader::DW_CFA_restore_extended).ULEB128(0x0f9b8a1c)
+ .FinishEntry();
+
+ {
+ InSequence s;
+ EXPECT_CALL(handler,
+ Entry(_, fde_start, fde_size, version, "", return_register))
+ .WillOnce(Return(true));
+ // CIE's CFA rule.
+ EXPECT_CALL(handler,
+ ValOffsetRule(fde_start, kCFARegister, 0x56fa0edd, 0x097f78a5))
+ .WillOnce(Return(true));
+ // CIE's rule for register 0x0f9b8a1c.
+ EXPECT_CALL(handler,
+ OffsetRule(fde_start, 0x0f9b8a1c, kCFARegister,
+ 0xc979 * data_factor))
+ .WillOnce(Return(true));
+ // FDE's rule for register 0x0f9b8a1c.
+ EXPECT_CALL(handler,
+ OffsetRule(fde_start + 0x3 * code_factor, 0x0f9b8a1c,
+ kCFARegister, 0x3b7b * data_factor))
+ .WillOnce(Return(true));
+ // Restore CIE's rule for register 0x0f9b8a1c.
+ EXPECT_CALL(handler,
+ OffsetRule(fde_start + (0x3 + 0x4) * code_factor, 0x0f9b8a1c,
+ kCFARegister, 0xc979 * data_factor))
+ .WillOnce(Return(true));
+ EXPECT_CALL(handler, End()).WillOnce(Return(true));
+ }
+
+ ParseSection(&section);
+}
+
+TEST_F(CFIInsn, DW_CFA_remember_and_restore_state) {
+ CFISection section(kLittleEndian, 8);
+ StockCIEAndFDE(&section);
+
+ // We create a state, save it, modify it, and then restore. We
+ // refer to the state that is overridden the restore as the
+ // "outgoing" state, and the restored state the "incoming" state.
+ //
+ // Register outgoing incoming expect
+ // 1 offset(N) no rule new "same value" rule
+ // 2 register(R) offset(N) report changed rule
+ // 3 offset(N) offset(M) report changed offset
+ // 4 offset(N) offset(N) no report
+ // 5 offset(N) no rule new "same value" rule
+ section
+ // Create the "incoming" state, which we will save and later restore.
+ .D8(dwarf2reader::DW_CFA_offset | 2).ULEB128(0x9806)
+ .D8(dwarf2reader::DW_CFA_offset | 3).ULEB128(0x995d)
+ .D8(dwarf2reader::DW_CFA_offset | 4).ULEB128(0x7055)
+ .D8(dwarf2reader::DW_CFA_remember_state)
+ // Advance to a new instruction; an implementation could legitimately
+ // ignore all but the final rule for a given register at a given address.
+ .D8(dwarf2reader::DW_CFA_advance_loc | 1)
+ // Create the "outgoing" state, which we will discard.
+ .D8(dwarf2reader::DW_CFA_offset | 1).ULEB128(0xea1a)
+ .D8(dwarf2reader::DW_CFA_register).ULEB128(2).ULEB128(0x1d2a3767)
+ .D8(dwarf2reader::DW_CFA_offset | 3).ULEB128(0xdd29)
+ .D8(dwarf2reader::DW_CFA_offset | 5).ULEB128(0xf1ce)
+ // At a third address, restore the incoming state.
+ .D8(dwarf2reader::DW_CFA_advance_loc | 1)
+ .D8(dwarf2reader::DW_CFA_restore_state)
+ .FinishEntry();
+
+ uint64 addr = fde_start;
+
+ // Expect the incoming rules to be reported.
+ EXPECT_CALL(handler, OffsetRule(addr, 2, kCFARegister, 0x9806 * data_factor))
+ .InSequence(s).WillOnce(Return(true));
+ EXPECT_CALL(handler, OffsetRule(addr, 3, kCFARegister, 0x995d * data_factor))
+ .InSequence(s).WillOnce(Return(true));
+ EXPECT_CALL(handler, OffsetRule(addr, 4, kCFARegister, 0x7055 * data_factor))
+ .InSequence(s).WillOnce(Return(true));
+
+ addr += code_factor;
+
+ // After the save, we establish the outgoing rule set.
+ EXPECT_CALL(handler, OffsetRule(addr, 1, kCFARegister, 0xea1a * data_factor))
+ .InSequence(s).WillOnce(Return(true));
+ EXPECT_CALL(handler, RegisterRule(addr, 2, 0x1d2a3767))
+ .InSequence(s).WillOnce(Return(true));
+ EXPECT_CALL(handler, OffsetRule(addr, 3, kCFARegister, 0xdd29 * data_factor))
+ .InSequence(s).WillOnce(Return(true));
+ EXPECT_CALL(handler, OffsetRule(addr, 5, kCFARegister, 0xf1ce * data_factor))
+ .InSequence(s).WillOnce(Return(true));
+
+ addr += code_factor;
+
+ // Finally, after the restore, expect to see the differences from
+ // the outgoing to the incoming rules reported.
+ EXPECT_CALL(handler, SameValueRule(addr, 1))
+ .InSequence(s).WillOnce(Return(true));
+ EXPECT_CALL(handler, OffsetRule(addr, 2, kCFARegister, 0x9806 * data_factor))
+ .InSequence(s).WillOnce(Return(true));
+ EXPECT_CALL(handler, OffsetRule(addr, 3, kCFARegister, 0x995d * data_factor))
+ .InSequence(s).WillOnce(Return(true));
+ EXPECT_CALL(handler, SameValueRule(addr, 5))
+ .InSequence(s).WillOnce(Return(true));
+
+ EXPECT_CALL(handler, End()).WillOnce(Return(true));
+
+ ParseSection(&section);
+}
+
+// Check that restoring a rule set reports changes to the CFA rule.
+TEST_F(CFIInsn, DW_CFA_remember_and_restore_stateCFA) {
+ CFISection section(kBigEndian, 4);
+ StockCIEAndFDE(&section);
+
+ section
+ .D8(dwarf2reader::DW_CFA_remember_state)
+ .D8(dwarf2reader::DW_CFA_advance_loc | 1)
+ .D8(dwarf2reader::DW_CFA_def_cfa_offset).ULEB128(0x90481102)
+ .D8(dwarf2reader::DW_CFA_advance_loc | 1)
+ .D8(dwarf2reader::DW_CFA_restore_state)
+ .FinishEntry();
+
+ EXPECT_CALL(handler, ValOffsetRule(fde_start + code_factor, kCFARegister,
+ cfa_base_register, 0x90481102))
+ .InSequence(s).WillOnce(Return(true));
+ EXPECT_CALL(handler, ValOffsetRule(fde_start + code_factor * 2, kCFARegister,
+ cfa_base_register, cfa_offset))
+ .InSequence(s).WillOnce(Return(true));
+
+ EXPECT_CALL(handler, End()).WillOnce(Return(true));
+
+ ParseSection(&section);
+}
+
+TEST_F(CFIInsn, DW_CFA_nop) {
+ CFISection section(kLittleEndian, 4);
+ StockCIEAndFDE(&section);
+ section
+ .D8(dwarf2reader::DW_CFA_nop)
+ .D8(dwarf2reader::DW_CFA_def_cfa).ULEB128(0x3fb8d4f1).ULEB128(0x078dc67b)
+ .D8(dwarf2reader::DW_CFA_nop)
+ .FinishEntry();
+
+ EXPECT_CALL(handler,
+ ValOffsetRule(fde_start, kCFARegister, 0x3fb8d4f1, 0x078dc67b))
+ .InSequence(s).WillOnce(Return(true));
+ EXPECT_CALL(handler, End()).InSequence(s).WillOnce(Return(true));
+
+ ParseSection(&section);
+}
+
+TEST_F(CFIInsn, DW_CFA_GNU_window_save) {
+ CFISection section(kBigEndian, 4);
+ StockCIEAndFDE(&section);
+ section
+ .D8(dwarf2reader::DW_CFA_GNU_window_save)
+ .FinishEntry();
+
+ // Don't include all the rules in any particular sequence.
+
+ // The caller's %o0-%o7 have become the callee's %i0-%i7. This is
+ // the GCC register numbering.
+ for (int i = 8; i < 16; i++)
+ EXPECT_CALL(handler, RegisterRule(fde_start, i, i + 16))
+ .WillOnce(Return(true));
+ // The caller's %l0-%l7 and %i0-%i7 have been saved at the top of
+ // its frame.
+ for (int i = 16; i < 32; i++)
+ EXPECT_CALL(handler, OffsetRule(fde_start, i, kCFARegister, (i-16) * 4))
+ .WillOnce(Return(true));
+
+ EXPECT_CALL(handler, End()).InSequence(s).WillOnce(Return(true));
+
+ ParseSection(&section);
+}
+
+TEST_F(CFIInsn, DW_CFA_GNU_args_size) {
+ CFISection section(kLittleEndian, 8);
+ StockCIEAndFDE(&section);
+ section
+ .D8(dwarf2reader::DW_CFA_GNU_args_size).ULEB128(0xeddfa520)
+ // Verify that we see this, meaning we parsed the above properly.
+ .D8(dwarf2reader::DW_CFA_offset | 0x23).ULEB128(0x269)
+ .FinishEntry();
+
+ EXPECT_CALL(handler,
+ OffsetRule(fde_start, 0x23, kCFARegister, 0x269 * data_factor))
+ .InSequence(s).WillOnce(Return(true));
+ EXPECT_CALL(handler, End()).InSequence(s).WillOnce(Return(true));
+
+ ParseSection(&section);
+}
+
+TEST_F(CFIInsn, DW_CFA_GNU_negative_offset_extended) {
+ CFISection section(kLittleEndian, 4);
+ StockCIEAndFDE(&section);
+ section
+ .D8(dwarf2reader::DW_CFA_GNU_negative_offset_extended)
+ .ULEB128(0x430cc87a).ULEB128(0x613)
+ .FinishEntry();
+
+ EXPECT_CALL(handler,
+ OffsetRule(fde_start, 0x430cc87a,
+ kCFARegister, -0x613 * data_factor))
+ .InSequence(s).WillOnce(Return(true));
+ EXPECT_CALL(handler, End()).InSequence(s).WillOnce(Return(true));
+
+ ParseSection(&section);
+}
+
+// Three FDEs: skip the second
+TEST_F(CFIInsn, SkipFDE) {
+ CFISection section(kBigEndian, 4);
+ Label cie;
+ section
+ // CIE, used by all FDEs.
+ .Mark(&cie)
+ .CIEHeader(0x010269f2, 0x9177, 0xedca5849, 2, "")
+ .D8(dwarf2reader::DW_CFA_def_cfa).ULEB128(0x42ed390b).ULEB128(0x98f43aad)
+ .FinishEntry()
+ // First FDE.
+ .FDEHeader(cie, 0xa870ebdd, 0x60f6aa4)
+ .D8(dwarf2reader::DW_CFA_register).ULEB128(0x3a860351).ULEB128(0x6c9a6bcf)
+ .FinishEntry()
+ // Second FDE.
+ .FDEHeader(cie, 0xc534f7c0, 0xf6552e9, true /* dwarf64 */)
+ .D8(dwarf2reader::DW_CFA_register).ULEB128(0x1b62c234).ULEB128(0x26586b18)
+ .FinishEntry()
+ // Third FDE.
+ .FDEHeader(cie, 0xf681cfc8, 0x7e4594e)
+ .D8(dwarf2reader::DW_CFA_register).ULEB128(0x26c53934).ULEB128(0x18eeb8a4)
+ .FinishEntry();
+
+ {
+ InSequence s;
+
+ // Process the first FDE.
+ EXPECT_CALL(handler, Entry(_, 0xa870ebdd, 0x60f6aa4, 2, "", 0xedca5849))
+ .WillOnce(Return(true));
+ EXPECT_CALL(handler, ValOffsetRule(0xa870ebdd, kCFARegister,
+ 0x42ed390b, 0x98f43aad))
+ .WillOnce(Return(true));
+ EXPECT_CALL(handler, RegisterRule(0xa870ebdd, 0x3a860351, 0x6c9a6bcf))
+ .WillOnce(Return(true));
+ EXPECT_CALL(handler, End())
+ .WillOnce(Return(true));
+
+ // Skip the second FDE.
+ EXPECT_CALL(handler, Entry(_, 0xc534f7c0, 0xf6552e9, 2, "", 0xedca5849))
+ .WillOnce(Return(false));
+
+ // Process the third FDE.
+ EXPECT_CALL(handler, Entry(_, 0xf681cfc8, 0x7e4594e, 2, "", 0xedca5849))
+ .WillOnce(Return(true));
+ EXPECT_CALL(handler, ValOffsetRule(0xf681cfc8, kCFARegister,
+ 0x42ed390b, 0x98f43aad))
+ .WillOnce(Return(true));
+ EXPECT_CALL(handler, RegisterRule(0xf681cfc8, 0x26c53934, 0x18eeb8a4))
+ .WillOnce(Return(true));
+ EXPECT_CALL(handler, End())
+ .WillOnce(Return(true));
+ }
+
+ ParseSection(&section);
+}
+
+// Quit processing in the middle of an entry's instructions.
+TEST_F(CFIInsn, QuitMidentry) {
+ CFISection section(kLittleEndian, 8);
+ StockCIEAndFDE(&section);
+ section
+ .D8(dwarf2reader::DW_CFA_register).ULEB128(0xe0cf850d).ULEB128(0x15aab431)
+ .D8(dwarf2reader::DW_CFA_expression).ULEB128(0x46750aa5).Block("meat")
+ .FinishEntry();
+
+ EXPECT_CALL(handler, RegisterRule(fde_start, 0xe0cf850d, 0x15aab431))
+ .InSequence(s).WillOnce(Return(false));
+ EXPECT_CALL(handler, End())
+ .InSequence(s).WillOnce(Return(true));
+
+ ParseSection(&section, false);
+}
+
+class CFIRestore: public CFIInsnFixture, public Test { };
+
+TEST_F(CFIRestore, RestoreUndefinedRuleUnchanged) {
+ CFISection section(kLittleEndian, 4);
+ StockCIEAndFDE(&section);
+ section
+ .D8(dwarf2reader::DW_CFA_undefined).ULEB128(0x0bac878e)
+ .D8(dwarf2reader::DW_CFA_remember_state)
+ .D8(dwarf2reader::DW_CFA_advance_loc | 1)
+ .D8(dwarf2reader::DW_CFA_restore_state)
+ .FinishEntry();
+
+ EXPECT_CALL(handler, UndefinedRule(fde_start, 0x0bac878e))
+ .InSequence(s).WillOnce(Return(true));
+ EXPECT_CALL(handler, End()).WillOnce(Return(true));
+
+ ParseSection(&section);
+}
+
+TEST_F(CFIRestore, RestoreUndefinedRuleChanged) {
+ CFISection section(kLittleEndian, 4);
+ StockCIEAndFDE(&section);
+ section
+ .D8(dwarf2reader::DW_CFA_undefined).ULEB128(0x7dedff5f)
+ .D8(dwarf2reader::DW_CFA_remember_state)
+ .D8(dwarf2reader::DW_CFA_advance_loc | 1)
+ .D8(dwarf2reader::DW_CFA_same_value).ULEB128(0x7dedff5f)
+ .D8(dwarf2reader::DW_CFA_advance_loc | 1)
+ .D8(dwarf2reader::DW_CFA_restore_state)
+ .FinishEntry();
+
+ EXPECT_CALL(handler, UndefinedRule(fde_start, 0x7dedff5f))
+ .InSequence(s).WillOnce(Return(true));
+ EXPECT_CALL(handler, SameValueRule(fde_start + code_factor, 0x7dedff5f))
+ .InSequence(s).WillOnce(Return(true));
+ EXPECT_CALL(handler, UndefinedRule(fde_start + 2 * code_factor, 0x7dedff5f))
+ .InSequence(s).WillOnce(Return(true));
+ EXPECT_CALL(handler, End()).WillOnce(Return(true));
+
+ ParseSection(&section);
+}
+
+TEST_F(CFIRestore, RestoreSameValueRuleUnchanged) {
+ CFISection section(kLittleEndian, 4);
+ StockCIEAndFDE(&section);
+ section
+ .D8(dwarf2reader::DW_CFA_same_value).ULEB128(0xadbc9b3a)
+ .D8(dwarf2reader::DW_CFA_remember_state)
+ .D8(dwarf2reader::DW_CFA_advance_loc | 1)
+ .D8(dwarf2reader::DW_CFA_restore_state)
+ .FinishEntry();
+
+ EXPECT_CALL(handler, SameValueRule(fde_start, 0xadbc9b3a))
+ .InSequence(s).WillOnce(Return(true));
+ EXPECT_CALL(handler, End()).WillOnce(Return(true));
+
+ ParseSection(&section);
+}
+
+TEST_F(CFIRestore, RestoreSameValueRuleChanged) {
+ CFISection section(kLittleEndian, 4);
+ StockCIEAndFDE(&section);
+ section
+ .D8(dwarf2reader::DW_CFA_same_value).ULEB128(0x3d90dcb5)
+ .D8(dwarf2reader::DW_CFA_remember_state)
+ .D8(dwarf2reader::DW_CFA_advance_loc | 1)
+ .D8(dwarf2reader::DW_CFA_undefined).ULEB128(0x3d90dcb5)
+ .D8(dwarf2reader::DW_CFA_advance_loc | 1)
+ .D8(dwarf2reader::DW_CFA_restore_state)
+ .FinishEntry();
+
+ EXPECT_CALL(handler, SameValueRule(fde_start, 0x3d90dcb5))
+ .InSequence(s).WillOnce(Return(true));
+ EXPECT_CALL(handler, UndefinedRule(fde_start + code_factor, 0x3d90dcb5))
+ .InSequence(s).WillOnce(Return(true));
+ EXPECT_CALL(handler, SameValueRule(fde_start + 2 * code_factor, 0x3d90dcb5))
+ .InSequence(s).WillOnce(Return(true));
+ EXPECT_CALL(handler, End()).WillOnce(Return(true));
+
+ ParseSection(&section);
+}
+
+TEST_F(CFIRestore, RestoreOffsetRuleUnchanged) {
+ CFISection section(kLittleEndian, 4);
+ StockCIEAndFDE(&section);
+ section
+ .D8(dwarf2reader::DW_CFA_offset | 0x14).ULEB128(0xb6f)
+ .D8(dwarf2reader::DW_CFA_remember_state)
+ .D8(dwarf2reader::DW_CFA_advance_loc | 1)
+ .D8(dwarf2reader::DW_CFA_restore_state)
+ .FinishEntry();
+
+ EXPECT_CALL(handler, OffsetRule(fde_start, 0x14,
+ kCFARegister, 0xb6f * data_factor))
+ .InSequence(s).WillOnce(Return(true));
+ EXPECT_CALL(handler, End()).WillOnce(Return(true));
+
+ ParseSection(&section);
+}
+
+TEST_F(CFIRestore, RestoreOffsetRuleChanged) {
+ CFISection section(kLittleEndian, 4);
+ StockCIEAndFDE(&section);
+ section
+ .D8(dwarf2reader::DW_CFA_offset | 0x21).ULEB128(0xeb7)
+ .D8(dwarf2reader::DW_CFA_remember_state)
+ .D8(dwarf2reader::DW_CFA_advance_loc | 1)
+ .D8(dwarf2reader::DW_CFA_undefined).ULEB128(0x21)
+ .D8(dwarf2reader::DW_CFA_advance_loc | 1)
+ .D8(dwarf2reader::DW_CFA_restore_state)
+ .FinishEntry();
+
+ EXPECT_CALL(handler, OffsetRule(fde_start, 0x21,
+ kCFARegister, 0xeb7 * data_factor))
+ .InSequence(s).WillOnce(Return(true));
+ EXPECT_CALL(handler, UndefinedRule(fde_start + code_factor, 0x21))
+ .InSequence(s).WillOnce(Return(true));
+ EXPECT_CALL(handler, OffsetRule(fde_start + 2 * code_factor, 0x21,
+ kCFARegister, 0xeb7 * data_factor))
+ .InSequence(s).WillOnce(Return(true));
+ EXPECT_CALL(handler, End()).WillOnce(Return(true));
+
+ ParseSection(&section);
+}
+
+TEST_F(CFIRestore, RestoreOffsetRuleChangedOffset) {
+ CFISection section(kLittleEndian, 4);
+ StockCIEAndFDE(&section);
+ section
+ .D8(dwarf2reader::DW_CFA_offset | 0x21).ULEB128(0x134)
+ .D8(dwarf2reader::DW_CFA_remember_state)
+ .D8(dwarf2reader::DW_CFA_advance_loc | 1)
+ .D8(dwarf2reader::DW_CFA_offset | 0x21).ULEB128(0xf4f)
+ .D8(dwarf2reader::DW_CFA_advance_loc | 1)
+ .D8(dwarf2reader::DW_CFA_restore_state)
+ .FinishEntry();
+
+ EXPECT_CALL(handler, OffsetRule(fde_start, 0x21,
+ kCFARegister, 0x134 * data_factor))
+ .InSequence(s).WillOnce(Return(true));
+ EXPECT_CALL(handler, OffsetRule(fde_start + code_factor, 0x21,
+ kCFARegister, 0xf4f * data_factor))
+ .InSequence(s).WillOnce(Return(true));
+ EXPECT_CALL(handler, OffsetRule(fde_start + 2 * code_factor, 0x21,
+ kCFARegister, 0x134 * data_factor))
+ .InSequence(s).WillOnce(Return(true));
+ EXPECT_CALL(handler, End()).WillOnce(Return(true));
+
+ ParseSection(&section);
+}
+
+TEST_F(CFIRestore, RestoreValOffsetRuleUnchanged) {
+ CFISection section(kLittleEndian, 4);
+ StockCIEAndFDE(&section);
+ section
+ .D8(dwarf2reader::DW_CFA_val_offset).ULEB128(0x829caee6).ULEB128(0xe4c)
+ .D8(dwarf2reader::DW_CFA_remember_state)
+ .D8(dwarf2reader::DW_CFA_advance_loc | 1)
+ .D8(dwarf2reader::DW_CFA_restore_state)
+ .FinishEntry();
+
+ EXPECT_CALL(handler, ValOffsetRule(fde_start, 0x829caee6,
+ kCFARegister, 0xe4c * data_factor))
+ .InSequence(s).WillOnce(Return(true));
+ EXPECT_CALL(handler, End()).WillOnce(Return(true));
+
+ ParseSection(&section);
+}
+
+TEST_F(CFIRestore, RestoreValOffsetRuleChanged) {
+ CFISection section(kLittleEndian, 4);
+ StockCIEAndFDE(&section);
+ section
+ .D8(dwarf2reader::DW_CFA_val_offset).ULEB128(0xf17c36d6).ULEB128(0xeb7)
+ .D8(dwarf2reader::DW_CFA_remember_state)
+ .D8(dwarf2reader::DW_CFA_advance_loc | 1)
+ .D8(dwarf2reader::DW_CFA_undefined).ULEB128(0xf17c36d6)
+ .D8(dwarf2reader::DW_CFA_advance_loc | 1)
+ .D8(dwarf2reader::DW_CFA_restore_state)
+ .FinishEntry();
+
+ EXPECT_CALL(handler, ValOffsetRule(fde_start, 0xf17c36d6,
+ kCFARegister, 0xeb7 * data_factor))
+ .InSequence(s).WillOnce(Return(true));
+ EXPECT_CALL(handler, UndefinedRule(fde_start + code_factor, 0xf17c36d6))
+ .InSequence(s).WillOnce(Return(true));
+ EXPECT_CALL(handler, ValOffsetRule(fde_start + 2 * code_factor, 0xf17c36d6,
+ kCFARegister, 0xeb7 * data_factor))
+ .InSequence(s).WillOnce(Return(true));
+ EXPECT_CALL(handler, End()).WillOnce(Return(true));
+
+ ParseSection(&section);
+}
+
+TEST_F(CFIRestore, RestoreValOffsetRuleChangedValOffset) {
+ CFISection section(kLittleEndian, 4);
+ StockCIEAndFDE(&section);
+ section
+ .D8(dwarf2reader::DW_CFA_val_offset).ULEB128(0x2cf0ab1b).ULEB128(0x562)
+ .D8(dwarf2reader::DW_CFA_remember_state)
+ .D8(dwarf2reader::DW_CFA_advance_loc | 1)
+ .D8(dwarf2reader::DW_CFA_val_offset).ULEB128(0x2cf0ab1b).ULEB128(0xe88)
+ .D8(dwarf2reader::DW_CFA_advance_loc | 1)
+ .D8(dwarf2reader::DW_CFA_restore_state)
+ .FinishEntry();
+
+ EXPECT_CALL(handler, ValOffsetRule(fde_start, 0x2cf0ab1b,
+ kCFARegister, 0x562 * data_factor))
+ .InSequence(s).WillOnce(Return(true));
+ EXPECT_CALL(handler, ValOffsetRule(fde_start + code_factor, 0x2cf0ab1b,
+ kCFARegister, 0xe88 * data_factor))
+ .InSequence(s).WillOnce(Return(true));
+ EXPECT_CALL(handler, ValOffsetRule(fde_start + 2 * code_factor, 0x2cf0ab1b,
+ kCFARegister, 0x562 * data_factor))
+ .InSequence(s).WillOnce(Return(true));
+ EXPECT_CALL(handler, End()).WillOnce(Return(true));
+
+ ParseSection(&section);
+}
+
+TEST_F(CFIRestore, RestoreRegisterRuleUnchanged) {
+ CFISection section(kLittleEndian, 4);
+ StockCIEAndFDE(&section);
+ section
+ .D8(dwarf2reader::DW_CFA_register).ULEB128(0x77514acc).ULEB128(0x464de4ce)
+ .D8(dwarf2reader::DW_CFA_remember_state)
+ .D8(dwarf2reader::DW_CFA_advance_loc | 1)
+ .D8(dwarf2reader::DW_CFA_restore_state)
+ .FinishEntry();
+
+ EXPECT_CALL(handler, RegisterRule(fde_start, 0x77514acc, 0x464de4ce))
+ .InSequence(s).WillOnce(Return(true));
+ EXPECT_CALL(handler, End()).WillOnce(Return(true));
+
+ ParseSection(&section);
+}
+
+TEST_F(CFIRestore, RestoreRegisterRuleChanged) {
+ CFISection section(kLittleEndian, 4);
+ StockCIEAndFDE(&section);
+ section
+ .D8(dwarf2reader::DW_CFA_register).ULEB128(0xe39acce5).ULEB128(0x095f1559)
+ .D8(dwarf2reader::DW_CFA_remember_state)
+ .D8(dwarf2reader::DW_CFA_advance_loc | 1)
+ .D8(dwarf2reader::DW_CFA_undefined).ULEB128(0xe39acce5)
+ .D8(dwarf2reader::DW_CFA_advance_loc | 1)
+ .D8(dwarf2reader::DW_CFA_restore_state)
+ .FinishEntry();
+
+ EXPECT_CALL(handler, RegisterRule(fde_start, 0xe39acce5, 0x095f1559))
+ .InSequence(s).WillOnce(Return(true));
+ EXPECT_CALL(handler, UndefinedRule(fde_start + code_factor, 0xe39acce5))
+ .InSequence(s).WillOnce(Return(true));
+ EXPECT_CALL(handler, RegisterRule(fde_start + 2 * code_factor, 0xe39acce5,
+ 0x095f1559))
+ .InSequence(s).WillOnce(Return(true));
+ EXPECT_CALL(handler, End()).WillOnce(Return(true));
+
+ ParseSection(&section);
+}
+
+TEST_F(CFIRestore, RestoreRegisterRuleChangedRegister) {
+ CFISection section(kLittleEndian, 4);
+ StockCIEAndFDE(&section);
+ section
+ .D8(dwarf2reader::DW_CFA_register).ULEB128(0xd40e21b1).ULEB128(0x16607d6a)
+ .D8(dwarf2reader::DW_CFA_remember_state)
+ .D8(dwarf2reader::DW_CFA_advance_loc | 1)
+ .D8(dwarf2reader::DW_CFA_register).ULEB128(0xd40e21b1).ULEB128(0xbabb4742)
+ .D8(dwarf2reader::DW_CFA_advance_loc | 1)
+ .D8(dwarf2reader::DW_CFA_restore_state)
+ .FinishEntry();
+
+ EXPECT_CALL(handler, RegisterRule(fde_start, 0xd40e21b1, 0x16607d6a))
+ .InSequence(s).WillOnce(Return(true));
+ EXPECT_CALL(handler, RegisterRule(fde_start + code_factor, 0xd40e21b1,
+ 0xbabb4742))
+ .InSequence(s).WillOnce(Return(true));
+ EXPECT_CALL(handler, RegisterRule(fde_start + 2 * code_factor, 0xd40e21b1,
+ 0x16607d6a))
+ .InSequence(s).WillOnce(Return(true));
+ EXPECT_CALL(handler, End()).WillOnce(Return(true));
+
+ ParseSection(&section);
+}
+
+TEST_F(CFIRestore, RestoreExpressionRuleUnchanged) {
+ CFISection section(kLittleEndian, 4);
+ StockCIEAndFDE(&section);
+ section
+ .D8(dwarf2reader::DW_CFA_expression).ULEB128(0x666ae152).Block("dwarf")
+ .D8(dwarf2reader::DW_CFA_remember_state)
+ .D8(dwarf2reader::DW_CFA_advance_loc | 1)
+ .D8(dwarf2reader::DW_CFA_restore_state)
+ .FinishEntry();
+
+ EXPECT_CALL(handler, ExpressionRule(fde_start, 0x666ae152, "dwarf"))
+ .InSequence(s).WillOnce(Return(true));
+ EXPECT_CALL(handler, End()).WillOnce(Return(true));
+
+ ParseSection(&section);
+}
+
+TEST_F(CFIRestore, RestoreExpressionRuleChanged) {
+ CFISection section(kLittleEndian, 4);
+ StockCIEAndFDE(&section);
+ section
+ .D8(dwarf2reader::DW_CFA_expression).ULEB128(0xb5ca5c46).Block("elf")
+ .D8(dwarf2reader::DW_CFA_remember_state)
+ .D8(dwarf2reader::DW_CFA_advance_loc | 1)
+ .D8(dwarf2reader::DW_CFA_undefined).ULEB128(0xb5ca5c46)
+ .D8(dwarf2reader::DW_CFA_advance_loc | 1)
+ .D8(dwarf2reader::DW_CFA_restore_state)
+ .FinishEntry();
+
+ EXPECT_CALL(handler, ExpressionRule(fde_start, 0xb5ca5c46, "elf"))
+ .InSequence(s).WillOnce(Return(true));
+ EXPECT_CALL(handler, UndefinedRule(fde_start + code_factor, 0xb5ca5c46))
+ .InSequence(s).WillOnce(Return(true));
+ EXPECT_CALL(handler, ExpressionRule(fde_start + 2 * code_factor, 0xb5ca5c46,
+ "elf"))
+ .InSequence(s).WillOnce(Return(true));
+ EXPECT_CALL(handler, End()).WillOnce(Return(true));
+
+ ParseSection(&section);
+}
+
+TEST_F(CFIRestore, RestoreExpressionRuleChangedExpression) {
+ CFISection section(kLittleEndian, 4);
+ StockCIEAndFDE(&section);
+ section
+ .D8(dwarf2reader::DW_CFA_expression).ULEB128(0x500f5739).Block("smurf")
+ .D8(dwarf2reader::DW_CFA_remember_state)
+ .D8(dwarf2reader::DW_CFA_advance_loc | 1)
+ .D8(dwarf2reader::DW_CFA_expression).ULEB128(0x500f5739).Block("orc")
+ .D8(dwarf2reader::DW_CFA_advance_loc | 1)
+ .D8(dwarf2reader::DW_CFA_restore_state)
+ .FinishEntry();
+
+ EXPECT_CALL(handler, ExpressionRule(fde_start, 0x500f5739, "smurf"))
+ .InSequence(s).WillOnce(Return(true));
+ EXPECT_CALL(handler, ExpressionRule(fde_start + code_factor, 0x500f5739,
+ "orc"))
+ .InSequence(s).WillOnce(Return(true));
+ // Expectations are not wishes.
+ EXPECT_CALL(handler, ExpressionRule(fde_start + 2 * code_factor, 0x500f5739,
+ "smurf"))
+ .InSequence(s).WillOnce(Return(true));
+ EXPECT_CALL(handler, End()).WillOnce(Return(true));
+
+ ParseSection(&section);
+}
+
+TEST_F(CFIRestore, RestoreValExpressionRuleUnchanged) {
+ CFISection section(kLittleEndian, 4);
+ StockCIEAndFDE(&section);
+ section
+ .D8(dwarf2reader::DW_CFA_val_expression).ULEB128(0x666ae152)
+ .Block("hideous")
+ .D8(dwarf2reader::DW_CFA_remember_state)
+ .D8(dwarf2reader::DW_CFA_advance_loc | 1)
+ .D8(dwarf2reader::DW_CFA_restore_state)
+ .FinishEntry();
+
+ EXPECT_CALL(handler, ValExpressionRule(fde_start, 0x666ae152, "hideous"))
+ .InSequence(s).WillOnce(Return(true));
+ EXPECT_CALL(handler, End()).WillOnce(Return(true));
+
+ ParseSection(&section);
+}
+
+TEST_F(CFIRestore, RestoreValExpressionRuleChanged) {
+ CFISection section(kLittleEndian, 4);
+ StockCIEAndFDE(&section);
+ section
+ .D8(dwarf2reader::DW_CFA_val_expression).ULEB128(0xb5ca5c46)
+ .Block("revolting")
+ .D8(dwarf2reader::DW_CFA_remember_state)
+ .D8(dwarf2reader::DW_CFA_advance_loc | 1)
+ .D8(dwarf2reader::DW_CFA_undefined).ULEB128(0xb5ca5c46)
+ .D8(dwarf2reader::DW_CFA_advance_loc | 1)
+ .D8(dwarf2reader::DW_CFA_restore_state)
+ .FinishEntry();
+
+ PERHAPS_WRITE_DEBUG_FRAME_FILE("RestoreValExpressionRuleChanged", section);
+
+ EXPECT_CALL(handler, ValExpressionRule(fde_start, 0xb5ca5c46, "revolting"))
+ .InSequence(s).WillOnce(Return(true));
+ EXPECT_CALL(handler, UndefinedRule(fde_start + code_factor, 0xb5ca5c46))
+ .InSequence(s).WillOnce(Return(true));
+ EXPECT_CALL(handler, ValExpressionRule(fde_start + 2 * code_factor, 0xb5ca5c46,
+ "revolting"))
+ .InSequence(s).WillOnce(Return(true));
+ EXPECT_CALL(handler, End()).WillOnce(Return(true));
+
+ ParseSection(&section);
+}
+
+TEST_F(CFIRestore, RestoreValExpressionRuleChangedValExpression) {
+ CFISection section(kLittleEndian, 4);
+ StockCIEAndFDE(&section);
+ section
+ .D8(dwarf2reader::DW_CFA_val_expression).ULEB128(0x500f5739)
+ .Block("repulsive")
+ .D8(dwarf2reader::DW_CFA_remember_state)
+ .D8(dwarf2reader::DW_CFA_advance_loc | 1)
+ .D8(dwarf2reader::DW_CFA_val_expression).ULEB128(0x500f5739)
+ .Block("nauseous")
+ .D8(dwarf2reader::DW_CFA_advance_loc | 1)
+ .D8(dwarf2reader::DW_CFA_restore_state)
+ .FinishEntry();
+
+ PERHAPS_WRITE_DEBUG_FRAME_FILE("RestoreValExpressionRuleChangedValExpression",
+ section);
+
+ EXPECT_CALL(handler, ValExpressionRule(fde_start, 0x500f5739, "repulsive"))
+ .InSequence(s).WillOnce(Return(true));
+ EXPECT_CALL(handler, ValExpressionRule(fde_start + code_factor, 0x500f5739,
+ "nauseous"))
+ .InSequence(s).WillOnce(Return(true));
+ // Expectations are not wishes.
+ EXPECT_CALL(handler, ValExpressionRule(fde_start + 2 * code_factor, 0x500f5739,
+ "repulsive"))
+ .InSequence(s).WillOnce(Return(true));
+ EXPECT_CALL(handler, End()).WillOnce(Return(true));
+
+ ParseSection(&section);
+}
+
+struct EHFrameFixture: public CFIInsnFixture {
+ EHFrameFixture()
+ : CFIInsnFixture(), section(kBigEndian, 4, true) {
+ encoded_pointer_bases.cfi = 0x7f496cb2;
+ encoded_pointer_bases.text = 0x540f67b6;
+ encoded_pointer_bases.data = 0xe3eab768;
+ section.SetEncodedPointerBases(encoded_pointer_bases);
+ }
+ CFISection section;
+ CFISection::EncodedPointerBases encoded_pointer_bases;
+
+ // Parse CFIInsnFixture::ParseSection, but parse the section as
+ // .eh_frame data, supplying stock base addresses.
+ void ParseEHFrameSection(CFISection *section, bool succeeds = true) {
+ EXPECT_TRUE(section->ContainsEHFrame());
+ string contents;
+ EXPECT_TRUE(section->GetContents(&contents));
+ dwarf2reader::Endianness endianness;
+ if (section->endianness() == kBigEndian)
+ endianness = ENDIANNESS_BIG;
+ else {
+ assert(section->endianness() == kLittleEndian);
+ endianness = ENDIANNESS_LITTLE;
+ }
+ ByteReader byte_reader(endianness);
+ byte_reader.SetAddressSize(section->AddressSize());
+ byte_reader.SetCFIDataBase(encoded_pointer_bases.cfi,
+ reinterpret_cast<const uint8_t *>(contents.data()));
+ byte_reader.SetTextBase(encoded_pointer_bases.text);
+ byte_reader.SetDataBase(encoded_pointer_bases.data);
+ CallFrameInfo parser(reinterpret_cast<const uint8_t *>(contents.data()),
+ contents.size(),
+ &byte_reader, &handler, &reporter, true);
+ if (succeeds)
+ EXPECT_TRUE(parser.Start());
+ else
+ EXPECT_FALSE(parser.Start());
+ }
+
+};
+
+class EHFrame: public EHFrameFixture, public Test { };
+
+// A simple CIE, an FDE, and a terminator.
+TEST_F(EHFrame, Terminator) {
+ Label cie;
+ section
+ .Mark(&cie)
+ .CIEHeader(9968, 2466, 67, 1, "")
+ .D8(dwarf2reader::DW_CFA_def_cfa).ULEB128(3772).ULEB128(1372)
+ .FinishEntry()
+ .FDEHeader(cie, 0x848037a1, 0x7b30475e)
+ .D8(dwarf2reader::DW_CFA_set_loc).D32(0x17713850)
+ .D8(dwarf2reader::DW_CFA_undefined).ULEB128(5721)
+ .FinishEntry()
+ .D32(0) // Terminate the sequence.
+ // This FDE should be ignored.
+ .FDEHeader(cie, 0xf19629fe, 0x439fb09b)
+ .FinishEntry();
+
+ PERHAPS_WRITE_EH_FRAME_FILE("EHFrame.Terminator", section);
+
+ EXPECT_CALL(handler, Entry(_, 0x848037a1, 0x7b30475e, 1, "", 67))
+ .InSequence(s).WillOnce(Return(true));
+ EXPECT_CALL(handler, ValOffsetRule(0x848037a1, kCFARegister, 3772, 1372))
+ .InSequence(s).WillOnce(Return(true));
+ EXPECT_CALL(handler, UndefinedRule(0x17713850, 5721))
+ .InSequence(s).WillOnce(Return(true));
+ EXPECT_CALL(handler, End())
+ .InSequence(s).WillOnce(Return(true));
+ EXPECT_CALL(reporter, EarlyEHTerminator(_))
+ .InSequence(s).WillOnce(Return());
+
+ ParseEHFrameSection(&section);
+}
+
+// The parser should recognize the Linux Standards Base 'z' augmentations.
+TEST_F(EHFrame, SimpleFDE) {
+ DwarfPointerEncoding lsda_encoding =
+ DwarfPointerEncoding(dwarf2reader::DW_EH_PE_indirect
+ | dwarf2reader::DW_EH_PE_datarel
+ | dwarf2reader::DW_EH_PE_sdata2);
+ DwarfPointerEncoding fde_encoding =
+ DwarfPointerEncoding(dwarf2reader::DW_EH_PE_textrel
+ | dwarf2reader::DW_EH_PE_udata2);
+
+ section.SetPointerEncoding(fde_encoding);
+ section.SetEncodedPointerBases(encoded_pointer_bases);
+ Label cie;
+ section
+ .Mark(&cie)
+ .CIEHeader(4873, 7012, 100, 1, "zSLPR")
+ .ULEB128(7) // Augmentation data length
+ .D8(lsda_encoding) // LSDA pointer format
+ .D8(dwarf2reader::DW_EH_PE_pcrel) // personality pointer format
+ .EncodedPointer(0x97baa00, dwarf2reader::DW_EH_PE_pcrel) // and value
+ .D8(fde_encoding) // FDE pointer format
+ .D8(dwarf2reader::DW_CFA_def_cfa).ULEB128(6706).ULEB128(31)
+ .FinishEntry()
+ .FDEHeader(cie, 0x540f6b56, 0xf686)
+ .ULEB128(2) // Augmentation data length
+ .EncodedPointer(0xe3eab475, lsda_encoding) // LSDA pointer, signed
+ .D8(dwarf2reader::DW_CFA_set_loc)
+ .EncodedPointer(0x540fa4ce, fde_encoding)
+ .D8(dwarf2reader::DW_CFA_undefined).ULEB128(0x675e)
+ .FinishEntry()
+ .D32(0); // terminator
+
+ PERHAPS_WRITE_EH_FRAME_FILE("EHFrame.SimpleFDE", section);
+
+ EXPECT_CALL(handler, Entry(_, 0x540f6b56, 0xf686, 1, "zSLPR", 100))
+ .InSequence(s).WillOnce(Return(true));
+ EXPECT_CALL(handler, PersonalityRoutine(0x97baa00, false))
+ .InSequence(s).WillOnce(Return(true));
+ EXPECT_CALL(handler, LanguageSpecificDataArea(0xe3eab475, true))
+ .InSequence(s).WillOnce(Return(true));
+ EXPECT_CALL(handler, SignalHandler())
+ .InSequence(s).WillOnce(Return(true));
+ EXPECT_CALL(handler, ValOffsetRule(0x540f6b56, kCFARegister, 6706, 31))
+ .InSequence(s).WillOnce(Return(true));
+ EXPECT_CALL(handler, UndefinedRule(0x540fa4ce, 0x675e))
+ .InSequence(s).WillOnce(Return(true));
+ EXPECT_CALL(handler, End())
+ .InSequence(s).WillOnce(Return(true));
+
+ ParseEHFrameSection(&section);
+}
+
+// Check that we can handle an empty 'z' augmentation.
+TEST_F(EHFrame, EmptyZ) {
+ Label cie;
+ section
+ .Mark(&cie)
+ .CIEHeader(5955, 5805, 228, 1, "z")
+ .ULEB128(0) // Augmentation data length
+ .D8(dwarf2reader::DW_CFA_def_cfa).ULEB128(3629).ULEB128(247)
+ .FinishEntry()
+ .FDEHeader(cie, 0xda007738, 0xfb55c641)
+ .ULEB128(0) // Augmentation data length
+ .D8(dwarf2reader::DW_CFA_advance_loc1).D8(11)
+ .D8(dwarf2reader::DW_CFA_undefined).ULEB128(3769)
+ .FinishEntry();
+
+ PERHAPS_WRITE_EH_FRAME_FILE("EHFrame.EmptyZ", section);
+
+ EXPECT_CALL(handler, Entry(_, 0xda007738, 0xfb55c641, 1, "z", 228))
+ .InSequence(s).WillOnce(Return(true));
+ EXPECT_CALL(handler, ValOffsetRule(0xda007738, kCFARegister, 3629, 247))
+ .InSequence(s).WillOnce(Return(true));
+ EXPECT_CALL(handler, UndefinedRule(0xda007738 + 11 * 5955, 3769))
+ .InSequence(s).WillOnce(Return(true));
+ EXPECT_CALL(handler, End())
+ .InSequence(s).WillOnce(Return(true));
+
+ ParseEHFrameSection(&section);
+}
+
+// Check that we recognize bad 'z' augmentation characters.
+TEST_F(EHFrame, BadZ) {
+ Label cie;
+ section
+ .Mark(&cie)
+ .CIEHeader(6937, 1045, 142, 1, "zQ")
+ .ULEB128(0) // Augmentation data length
+ .D8(dwarf2reader::DW_CFA_def_cfa).ULEB128(9006).ULEB128(7725)
+ .FinishEntry()
+ .FDEHeader(cie, 0x1293efa8, 0x236f53f2)
+ .ULEB128(0) // Augmentation data length
+ .D8(dwarf2reader::DW_CFA_advance_loc | 12)
+ .D8(dwarf2reader::DW_CFA_register).ULEB128(5667).ULEB128(3462)
+ .FinishEntry();
+
+ PERHAPS_WRITE_EH_FRAME_FILE("EHFrame.BadZ", section);
+
+ EXPECT_CALL(reporter, UnrecognizedAugmentation(_, "zQ"))
+ .WillOnce(Return());
+
+ ParseEHFrameSection(&section, false);
+}
+
+TEST_F(EHFrame, zL) {
+ Label cie;
+ DwarfPointerEncoding lsda_encoding =
+ DwarfPointerEncoding(dwarf2reader::DW_EH_PE_funcrel
+ | dwarf2reader::DW_EH_PE_udata2);
+ section
+ .Mark(&cie)
+ .CIEHeader(9285, 9959, 54, 1, "zL")
+ .ULEB128(1) // Augmentation data length
+ .D8(lsda_encoding) // encoding for LSDA pointer in FDE
+
+ .FinishEntry()
+ .FDEHeader(cie, 0xd40091aa, 0x9aa6e746)
+ .ULEB128(2) // Augmentation data length
+ .EncodedPointer(0xd40099cd, lsda_encoding) // LSDA pointer
+ .FinishEntry()
+ .D32(0); // terminator
+
+ PERHAPS_WRITE_EH_FRAME_FILE("EHFrame.zL", section);
+
+ EXPECT_CALL(handler, Entry(_, 0xd40091aa, 0x9aa6e746, 1, "zL", 54))
+ .InSequence(s).WillOnce(Return(true));
+ EXPECT_CALL(handler, LanguageSpecificDataArea(0xd40099cd, false))
+ .InSequence(s).WillOnce(Return(true));
+ EXPECT_CALL(handler, End())
+ .InSequence(s).WillOnce(Return(true));
+
+ ParseEHFrameSection(&section);
+}
+
+TEST_F(EHFrame, zP) {
+ Label cie;
+ DwarfPointerEncoding personality_encoding =
+ DwarfPointerEncoding(dwarf2reader::DW_EH_PE_datarel
+ | dwarf2reader::DW_EH_PE_udata2);
+ section
+ .Mark(&cie)
+ .CIEHeader(1097, 6313, 17, 1, "zP")
+ .ULEB128(3) // Augmentation data length
+ .D8(personality_encoding) // encoding for personality routine
+ .EncodedPointer(0xe3eaccac, personality_encoding) // value
+ .FinishEntry()
+ .FDEHeader(cie, 0x0c8350c9, 0xbef11087)
+ .ULEB128(0) // Augmentation data length
+ .FinishEntry()
+ .D32(0); // terminator
+
+ PERHAPS_WRITE_EH_FRAME_FILE("EHFrame.zP", section);
+
+ EXPECT_CALL(handler, Entry(_, 0x0c8350c9, 0xbef11087, 1, "zP", 17))
+ .InSequence(s).WillOnce(Return(true));
+ EXPECT_CALL(handler, PersonalityRoutine(0xe3eaccac, false))
+ .InSequence(s).WillOnce(Return(true));
+ EXPECT_CALL(handler, End())
+ .InSequence(s).WillOnce(Return(true));
+
+ ParseEHFrameSection(&section);
+}
+
+TEST_F(EHFrame, zR) {
+ Label cie;
+ DwarfPointerEncoding pointer_encoding =
+ DwarfPointerEncoding(dwarf2reader::DW_EH_PE_textrel
+ | dwarf2reader::DW_EH_PE_sdata2);
+ section.SetPointerEncoding(pointer_encoding);
+ section
+ .Mark(&cie)
+ .CIEHeader(8011, 5496, 75, 1, "zR")
+ .ULEB128(1) // Augmentation data length
+ .D8(pointer_encoding) // encoding for FDE addresses
+ .FinishEntry()
+ .FDEHeader(cie, 0x540f9431, 0xbd0)
+ .ULEB128(0) // Augmentation data length
+ .FinishEntry()
+ .D32(0); // terminator
+
+ PERHAPS_WRITE_EH_FRAME_FILE("EHFrame.zR", section);
+
+ EXPECT_CALL(handler, Entry(_, 0x540f9431, 0xbd0, 1, "zR", 75))
+ .InSequence(s).WillOnce(Return(true));
+ EXPECT_CALL(handler, End())
+ .InSequence(s).WillOnce(Return(true));
+
+ ParseEHFrameSection(&section);
+}
+
+TEST_F(EHFrame, zS) {
+ Label cie;
+ section
+ .Mark(&cie)
+ .CIEHeader(9217, 7694, 57, 1, "zS")
+ .ULEB128(0) // Augmentation data length
+ .FinishEntry()
+ .FDEHeader(cie, 0xd40091aa, 0x9aa6e746)
+ .ULEB128(0) // Augmentation data length
+ .FinishEntry()
+ .D32(0); // terminator
+
+ PERHAPS_WRITE_EH_FRAME_FILE("EHFrame.zS", section);
+
+ EXPECT_CALL(handler, Entry(_, 0xd40091aa, 0x9aa6e746, 1, "zS", 57))
+ .InSequence(s).WillOnce(Return(true));
+ EXPECT_CALL(handler, SignalHandler())
+ .InSequence(s).WillOnce(Return(true));
+ EXPECT_CALL(handler, End())
+ .InSequence(s).WillOnce(Return(true));
+
+ ParseEHFrameSection(&section);
+}
+
+// These tests require manual inspection of the test output.
+struct CFIReporterFixture {
+ CFIReporterFixture() : reporter("test file name", "test section name") { }
+ CallFrameInfo::Reporter reporter;
+};
+
+class CFIReporter: public CFIReporterFixture, public Test { };
+
+TEST_F(CFIReporter, Incomplete) {
+ reporter.Incomplete(0x0102030405060708ULL, CallFrameInfo::kUnknown);
+}
+
+TEST_F(CFIReporter, EarlyEHTerminator) {
+ reporter.EarlyEHTerminator(0x0102030405060708ULL);
+}
+
+TEST_F(CFIReporter, CIEPointerOutOfRange) {
+ reporter.CIEPointerOutOfRange(0x0123456789abcdefULL, 0xfedcba9876543210ULL);
+}
+
+TEST_F(CFIReporter, BadCIEId) {
+ reporter.BadCIEId(0x0123456789abcdefULL, 0xfedcba9876543210ULL);
+}
+
+TEST_F(CFIReporter, UnrecognizedVersion) {
+ reporter.UnrecognizedVersion(0x0123456789abcdefULL, 43);
+}
+
+TEST_F(CFIReporter, UnrecognizedAugmentation) {
+ reporter.UnrecognizedAugmentation(0x0123456789abcdefULL, "poodles");
+}
+
+TEST_F(CFIReporter, InvalidPointerEncoding) {
+ reporter.InvalidPointerEncoding(0x0123456789abcdefULL, 0x42);
+}
+
+TEST_F(CFIReporter, UnusablePointerEncoding) {
+ reporter.UnusablePointerEncoding(0x0123456789abcdefULL, 0x42);
+}
+
+TEST_F(CFIReporter, RestoreInCIE) {
+ reporter.RestoreInCIE(0x0123456789abcdefULL, 0xfedcba9876543210ULL);
+}
+
+TEST_F(CFIReporter, BadInstruction) {
+ reporter.BadInstruction(0x0123456789abcdefULL, CallFrameInfo::kFDE,
+ 0xfedcba9876543210ULL);
+}
+
+TEST_F(CFIReporter, NoCFARule) {
+ reporter.NoCFARule(0x0123456789abcdefULL, CallFrameInfo::kCIE,
+ 0xfedcba9876543210ULL);
+}
+
+TEST_F(CFIReporter, EmptyStateStack) {
+ reporter.EmptyStateStack(0x0123456789abcdefULL, CallFrameInfo::kTerminator,
+ 0xfedcba9876543210ULL);
+}
+
+TEST_F(CFIReporter, ClearingCFARule) {
+ reporter.ClearingCFARule(0x0123456789abcdefULL, CallFrameInfo::kFDE,
+ 0xfedcba9876543210ULL);
+}
+
+#ifdef WRITE_ELF
+// See comments at the top of the file mentioning WRITE_ELF for details.
+
+using google_breakpad::test_assembler::Section;
+
+struct ELFSectionHeader {
+ ELFSectionHeader(unsigned int set_type)
+ : type(set_type), flags(0), address(0), link(0), info(0),
+ alignment(1), entry_size(0) { }
+ Label name;
+ unsigned int type;
+ uint64_t flags;
+ uint64_t address;
+ Label file_offset;
+ Label file_size;
+ unsigned int link;
+ unsigned int info;
+ uint64_t alignment;
+ uint64_t entry_size;
+};
+
+void AppendSectionHeader(CFISection *table, const ELFSectionHeader &header) {
+ (*table)
+ .D32(header.name) // name, index in string tbl
+ .D32(header.type) // type
+ .Address(header.flags) // flags
+ .Address(header.address) // address in memory
+ .Address(header.file_offset) // offset in ELF file
+ .Address(header.file_size) // length in bytes
+ .D32(header.link) // link to related section
+ .D32(header.info) // miscellaneous
+ .Address(header.alignment) // alignment
+ .Address(header.entry_size); // entry size
+}
+
+void WriteELFFrameSection(const char *filename, const char *cfi_name,
+ const CFISection &cfi) {
+ int elf_class = cfi.AddressSize() == 4 ? ELFCLASS32 : ELFCLASS64;
+ int elf_data = (cfi.endianness() == kBigEndian
+ ? ELFDATA2MSB : ELFDATA2LSB);
+ CFISection elf(cfi.endianness(), cfi.AddressSize());
+ Label elf_header_size, section_table_offset;
+ elf
+ .Append("\x7f" "ELF")
+ .D8(elf_class) // 32-bit or 64-bit ELF
+ .D8(elf_data) // endianness
+ .D8(1) // ELF version
+ .D8(ELFOSABI_LINUX) // Operating System/ABI indication
+ .D8(0) // ABI version
+ .Append(7, 0xda) // padding
+ .D16(ET_EXEC) // file type: executable file
+ .D16(EM_386) // architecture: Intel IA-32
+ .D32(EV_CURRENT); // ELF version
+ elf
+ .Address(0x0123456789abcdefULL) // program entry point
+ .Address(0) // program header offset
+ .Address(section_table_offset) // section header offset
+ .D32(0) // processor-specific flags
+ .D16(elf_header_size) // ELF header size in bytes */
+ .D16(elf_class == ELFCLASS32 ? 32 : 56) // program header entry size
+ .D16(0) // program header table entry count
+ .D16(elf_class == ELFCLASS32 ? 40 : 64) // section header entry size
+ .D16(3) // section count
+ .D16(1) // section name string table
+ .Mark(&elf_header_size);
+
+ // The null section. Every ELF file has one, as the first entry in
+ // the section header table.
+ ELFSectionHeader null_header(SHT_NULL);
+ null_header.file_offset = 0;
+ null_header.file_size = 0;
+
+ // The CFI section. The whole reason for writing out this ELF file
+ // is to put this in it so that we can run other dumping programs on
+ // it to check its contents.
+ ELFSectionHeader cfi_header(SHT_PROGBITS);
+ cfi_header.file_size = cfi.Size();
+
+ // The section holding the names of the sections. This is the
+ // section whose index appears in the e_shstrndx member of the ELF
+ // header.
+ ELFSectionHeader section_names_header(SHT_STRTAB);
+ CFISection section_names(cfi.endianness(), cfi.AddressSize());
+ section_names
+ .Mark(&null_header.name)
+ .AppendCString("")
+ .Mark(&section_names_header.name)
+ .AppendCString(".shstrtab")
+ .Mark(&cfi_header.name)
+ .AppendCString(cfi_name)
+ .Mark(&section_names_header.file_size);
+
+ // Create the section table. The ELF header's e_shoff member refers
+ // to this, and the e_shnum member gives the number of entries it
+ // contains.
+ CFISection section_table(cfi.endianness(), cfi.AddressSize());
+ AppendSectionHeader(&section_table, null_header);
+ AppendSectionHeader(&section_table, section_names_header);
+ AppendSectionHeader(&section_table, cfi_header);
+
+ // Append the section table and the section contents to the ELF file.
+ elf
+ .Mark(&section_table_offset)
+ .Append(section_table)
+ .Mark(&section_names_header.file_offset)
+ .Append(section_names)
+ .Mark(&cfi_header.file_offset)
+ .Append(cfi);
+
+ string contents;
+ if (!elf.GetContents(&contents)) {
+ fprintf(stderr, "failed to get ELF file contents\n");
+ exit(1);
+ }
+
+ FILE *out = fopen(filename, "w");
+ if (!out) {
+ fprintf(stderr, "error opening ELF file '%s': %s\n",
+ filename, strerror(errno));
+ exit(1);
+ }
+
+ if (fwrite(contents.data(), 1, contents.size(), out) != contents.size()) {
+ fprintf(stderr, "error writing ELF data to '%s': %s\n",
+ filename, strerror(errno));
+ exit(1);
+ }
+
+ if (fclose(out) == EOF) {
+ fprintf(stderr, "error closing ELF file '%s': %s\n",
+ filename, strerror(errno));
+ exit(1);
+ }
+}
+#endif
diff --git a/3rdParty/Breakpad/src/common/dwarf/dwarf2reader_die_unittest.cc b/3rdParty/Breakpad/src/common/dwarf/dwarf2reader_die_unittest.cc
new file mode 100644
index 0000000..71418eb
--- /dev/null
+++ b/3rdParty/Breakpad/src/common/dwarf/dwarf2reader_die_unittest.cc
@@ -0,0 +1,487 @@
+// Copyright (c) 2012, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// Original author: Jim Blandy <jimb@mozilla.com> <jimb@red-bean.com>
+
+// dwarf2reader_die_unittest.cc: Unit tests for dwarf2reader::CompilationUnit
+
+#include <stdint.h>
+#include <stdlib.h>
+
+#include <iostream>
+#include <string>
+#include <vector>
+
+#include "breakpad_googletest_includes.h"
+#include "common/dwarf/bytereader-inl.h"
+#include "common/dwarf/dwarf2reader_test_common.h"
+#include "common/dwarf/dwarf2reader.h"
+#include "common/using_std_string.h"
+#include "google_breakpad/common/breakpad_types.h"
+
+using google_breakpad::test_assembler::Endianness;
+using google_breakpad::test_assembler::Label;
+using google_breakpad::test_assembler::Section;
+using google_breakpad::test_assembler::kBigEndian;
+using google_breakpad::test_assembler::kLittleEndian;
+
+using dwarf2reader::ByteReader;
+using dwarf2reader::CompilationUnit;
+using dwarf2reader::Dwarf2Handler;
+using dwarf2reader::DwarfAttribute;
+using dwarf2reader::DwarfForm;
+using dwarf2reader::DwarfHasChild;
+using dwarf2reader::DwarfTag;
+using dwarf2reader::ENDIANNESS_BIG;
+using dwarf2reader::ENDIANNESS_LITTLE;
+using dwarf2reader::SectionMap;
+
+using std::vector;
+using testing::InSequence;
+using testing::Pointee;
+using testing::Return;
+using testing::Sequence;
+using testing::Test;
+using testing::TestWithParam;
+using testing::_;
+
+class MockDwarf2Handler: public Dwarf2Handler {
+ public:
+ MOCK_METHOD5(StartCompilationUnit, bool(uint64 offset, uint8 address_size,
+ uint8 offset_size, uint64 cu_length,
+ uint8 dwarf_version));
+ MOCK_METHOD2(StartDIE, bool(uint64 offset, enum DwarfTag tag));
+ MOCK_METHOD4(ProcessAttributeUnsigned, void(uint64 offset,
+ DwarfAttribute attr,
+ enum DwarfForm form,
+ uint64 data));
+ MOCK_METHOD4(ProcessAttributeSigned, void(uint64 offset,
+ enum DwarfAttribute attr,
+ enum DwarfForm form,
+ int64 data));
+ MOCK_METHOD4(ProcessAttributeReference, void(uint64 offset,
+ enum DwarfAttribute attr,
+ enum DwarfForm form,
+ uint64 data));
+ MOCK_METHOD5(ProcessAttributeBuffer, void(uint64 offset,
+ enum DwarfAttribute attr,
+ enum DwarfForm form,
+ const uint8_t *data,
+ uint64 len));
+ MOCK_METHOD4(ProcessAttributeString, void(uint64 offset,
+ enum DwarfAttribute attr,
+ enum DwarfForm form,
+ const string& data));
+ MOCK_METHOD4(ProcessAttributeSignature, void(uint64 offset,
+ DwarfAttribute attr,
+ enum DwarfForm form,
+ uint64 signature));
+ MOCK_METHOD1(EndDIE, void(uint64 offset));
+};
+
+struct DIEFixture {
+
+ DIEFixture() {
+ // Fix the initial offset of the .debug_info and .debug_abbrev sections.
+ info.start() = 0;
+ abbrevs.start() = 0;
+
+ // Default expectations for the data handler.
+ EXPECT_CALL(handler, StartCompilationUnit(_, _, _, _, _)).Times(0);
+ EXPECT_CALL(handler, StartDIE(_, _)).Times(0);
+ EXPECT_CALL(handler, ProcessAttributeUnsigned(_, _, _, _)).Times(0);
+ EXPECT_CALL(handler, ProcessAttributeSigned(_, _, _, _)).Times(0);
+ EXPECT_CALL(handler, ProcessAttributeReference(_, _, _, _)).Times(0);
+ EXPECT_CALL(handler, ProcessAttributeBuffer(_, _, _, _, _)).Times(0);
+ EXPECT_CALL(handler, ProcessAttributeString(_, _, _, _)).Times(0);
+ EXPECT_CALL(handler, EndDIE(_)).Times(0);
+ }
+
+ // Return a reference to a section map whose .debug_info section refers
+ // to |info|, and whose .debug_abbrev section refers to |abbrevs|. This
+ // function returns a reference to the same SectionMap each time; new
+ // calls wipe out maps established by earlier calls.
+ const SectionMap &MakeSectionMap() {
+ // Copy the sections' contents into strings that will live as long as
+ // the map itself.
+ assert(info.GetContents(&info_contents));
+ assert(abbrevs.GetContents(&abbrevs_contents));
+ section_map.clear();
+ section_map[".debug_info"].first
+ = reinterpret_cast<const uint8_t *>(info_contents.data());
+ section_map[".debug_info"].second = info_contents.size();
+ section_map[".debug_abbrev"].first
+ = reinterpret_cast<const uint8_t *>(abbrevs_contents.data());
+ section_map[".debug_abbrev"].second = abbrevs_contents.size();
+ return section_map;
+ }
+
+ TestCompilationUnit info;
+ TestAbbrevTable abbrevs;
+ MockDwarf2Handler handler;
+ string abbrevs_contents, info_contents;
+ SectionMap section_map;
+};
+
+struct DwarfHeaderParams {
+ DwarfHeaderParams(Endianness endianness, size_t format_size,
+ int version, size_t address_size)
+ : endianness(endianness), format_size(format_size),
+ version(version), address_size(address_size) { }
+ Endianness endianness;
+ size_t format_size; // 4-byte or 8-byte DWARF offsets
+ int version;
+ size_t address_size;
+};
+
+class DwarfHeader: public DIEFixture,
+ public TestWithParam<DwarfHeaderParams> { };
+
+TEST_P(DwarfHeader, Header) {
+ Label abbrev_table = abbrevs.Here();
+ abbrevs.Abbrev(1, dwarf2reader::DW_TAG_compile_unit,
+ dwarf2reader::DW_children_yes)
+ .Attribute(dwarf2reader::DW_AT_name, dwarf2reader::DW_FORM_string)
+ .EndAbbrev()
+ .EndTable();
+
+ info.set_format_size(GetParam().format_size);
+ info.set_endianness(GetParam().endianness);
+
+ info.Header(GetParam().version, abbrev_table, GetParam().address_size)
+ .ULEB128(1) // DW_TAG_compile_unit, with children
+ .AppendCString("sam") // DW_AT_name, DW_FORM_string
+ .D8(0); // end of children
+ info.Finish();
+
+ {
+ InSequence s;
+ EXPECT_CALL(handler,
+ StartCompilationUnit(0, GetParam().address_size,
+ GetParam().format_size, _,
+ GetParam().version))
+ .WillOnce(Return(true));
+ EXPECT_CALL(handler, StartDIE(_, dwarf2reader::DW_TAG_compile_unit))
+ .WillOnce(Return(true));
+ EXPECT_CALL(handler, ProcessAttributeString(_, dwarf2reader::DW_AT_name,
+ dwarf2reader::DW_FORM_string,
+ "sam"))
+ .WillOnce(Return());
+ EXPECT_CALL(handler, EndDIE(_))
+ .WillOnce(Return());
+ }
+
+ ByteReader byte_reader(GetParam().endianness == kLittleEndian ?
+ ENDIANNESS_LITTLE : ENDIANNESS_BIG);
+ CompilationUnit parser("", MakeSectionMap(), 0, &byte_reader, &handler);
+ EXPECT_EQ(parser.Start(), info_contents.size());
+}
+
+INSTANTIATE_TEST_CASE_P(
+ HeaderVariants, DwarfHeader,
+ ::testing::Values(DwarfHeaderParams(kLittleEndian, 4, 2, 4),
+ DwarfHeaderParams(kLittleEndian, 4, 2, 8),
+ DwarfHeaderParams(kLittleEndian, 4, 3, 4),
+ DwarfHeaderParams(kLittleEndian, 4, 3, 8),
+ DwarfHeaderParams(kLittleEndian, 4, 4, 4),
+ DwarfHeaderParams(kLittleEndian, 4, 4, 8),
+ DwarfHeaderParams(kLittleEndian, 8, 2, 4),
+ DwarfHeaderParams(kLittleEndian, 8, 2, 8),
+ DwarfHeaderParams(kLittleEndian, 8, 3, 4),
+ DwarfHeaderParams(kLittleEndian, 8, 3, 8),
+ DwarfHeaderParams(kLittleEndian, 8, 4, 4),
+ DwarfHeaderParams(kLittleEndian, 8, 4, 8),
+ DwarfHeaderParams(kBigEndian, 4, 2, 4),
+ DwarfHeaderParams(kBigEndian, 4, 2, 8),
+ DwarfHeaderParams(kBigEndian, 4, 3, 4),
+ DwarfHeaderParams(kBigEndian, 4, 3, 8),
+ DwarfHeaderParams(kBigEndian, 4, 4, 4),
+ DwarfHeaderParams(kBigEndian, 4, 4, 8),
+ DwarfHeaderParams(kBigEndian, 8, 2, 4),
+ DwarfHeaderParams(kBigEndian, 8, 2, 8),
+ DwarfHeaderParams(kBigEndian, 8, 3, 4),
+ DwarfHeaderParams(kBigEndian, 8, 3, 8),
+ DwarfHeaderParams(kBigEndian, 8, 4, 4),
+ DwarfHeaderParams(kBigEndian, 8, 4, 8)));
+
+struct DwarfFormsFixture: public DIEFixture {
+ // Start a compilation unit, as directed by |params|, containing one
+ // childless DIE of the given tag, with one attribute of the given name
+ // and form. The 'info' fixture member is left just after the abbrev
+ // code, waiting for the attribute value to be appended.
+ void StartSingleAttributeDIE(const DwarfHeaderParams &params,
+ DwarfTag tag, DwarfAttribute name,
+ DwarfForm form) {
+ // Create the abbreviation table.
+ Label abbrev_table = abbrevs.Here();
+ abbrevs.Abbrev(1, tag, dwarf2reader::DW_children_no)
+ .Attribute(name, form)
+ .EndAbbrev()
+ .EndTable();
+
+ // Create the compilation unit, up to the attribute value.
+ info.set_format_size(params.format_size);
+ info.set_endianness(params.endianness);
+ info.Header(params.version, abbrev_table, params.address_size)
+ .ULEB128(1); // abbrev code
+ }
+
+ // Set up handler to expect a compilation unit matching |params|,
+ // containing one childless DIE of the given tag, in the sequence s. Stop
+ // just before the expectations.
+ void ExpectBeginCompilationUnit(const DwarfHeaderParams &params,
+ DwarfTag tag, uint64 offset=0) {
+ EXPECT_CALL(handler,
+ StartCompilationUnit(offset, params.address_size,
+ params.format_size, _,
+ params.version))
+ .InSequence(s)
+ .WillOnce(Return(true));
+ EXPECT_CALL(handler, StartDIE(_, tag))
+ .InSequence(s)
+ .WillOnce(Return(true));
+ }
+
+ void ExpectEndCompilationUnit() {
+ EXPECT_CALL(handler, EndDIE(_))
+ .InSequence(s)
+ .WillOnce(Return());
+ }
+
+ void ParseCompilationUnit(const DwarfHeaderParams &params, uint64 offset=0) {
+ ByteReader byte_reader(params.endianness == kLittleEndian ?
+ ENDIANNESS_LITTLE : ENDIANNESS_BIG);
+ CompilationUnit parser("", MakeSectionMap(), offset, &byte_reader, &handler);
+ EXPECT_EQ(offset + parser.Start(), info_contents.size());
+ }
+
+ // The sequence to which the fixture's methods append expectations.
+ Sequence s;
+};
+
+struct DwarfForms: public DwarfFormsFixture,
+ public TestWithParam<DwarfHeaderParams> { };
+
+TEST_P(DwarfForms, addr) {
+ StartSingleAttributeDIE(GetParam(), dwarf2reader::DW_TAG_compile_unit,
+ dwarf2reader::DW_AT_low_pc,
+ dwarf2reader::DW_FORM_addr);
+ uint64_t value;
+ if (GetParam().address_size == 4) {
+ value = 0xc8e9ffcc;
+ info.D32(value);
+ } else {
+ value = 0xe942517fc2768564ULL;
+ info.D64(value);
+ }
+ info.Finish();
+
+ ExpectBeginCompilationUnit(GetParam(), dwarf2reader::DW_TAG_compile_unit);
+ EXPECT_CALL(handler, ProcessAttributeUnsigned(_, dwarf2reader::DW_AT_low_pc,
+ dwarf2reader::DW_FORM_addr,
+ value))
+ .InSequence(s)
+ .WillOnce(Return());
+ ExpectEndCompilationUnit();
+
+ ParseCompilationUnit(GetParam());
+}
+
+TEST_P(DwarfForms, block2_empty) {
+ StartSingleAttributeDIE(GetParam(), (DwarfTag) 0x16e4d2f7,
+ (DwarfAttribute) 0xe52c4463,
+ dwarf2reader::DW_FORM_block2);
+ info.D16(0);
+ info.Finish();
+
+ ExpectBeginCompilationUnit(GetParam(), (DwarfTag) 0x16e4d2f7);
+ EXPECT_CALL(handler, ProcessAttributeBuffer(_, (DwarfAttribute) 0xe52c4463,
+ dwarf2reader::DW_FORM_block2,
+ _, 0))
+ .InSequence(s)
+ .WillOnce(Return());
+ ExpectEndCompilationUnit();
+
+ ParseCompilationUnit(GetParam());
+}
+
+TEST_P(DwarfForms, block2) {
+ StartSingleAttributeDIE(GetParam(), (DwarfTag) 0x16e4d2f7,
+ (DwarfAttribute) 0xe52c4463,
+ dwarf2reader::DW_FORM_block2);
+ unsigned char data[258];
+ memset(data, '*', sizeof(data));
+ info.D16(sizeof(data))
+ .Append(data, sizeof(data));
+ info.Finish();
+
+ ExpectBeginCompilationUnit(GetParam(), (DwarfTag) 0x16e4d2f7);
+ EXPECT_CALL(handler, ProcessAttributeBuffer(_, (DwarfAttribute) 0xe52c4463,
+ dwarf2reader::DW_FORM_block2,
+ Pointee('*'), 258))
+ .InSequence(s)
+ .WillOnce(Return());
+ ExpectEndCompilationUnit();
+
+ ParseCompilationUnit(GetParam());
+}
+
+TEST_P(DwarfForms, flag_present) {
+ StartSingleAttributeDIE(GetParam(), (DwarfTag) 0x3e449ac2,
+ (DwarfAttribute) 0x359d1972,
+ dwarf2reader::DW_FORM_flag_present);
+ // DW_FORM_flag_present occupies no space in the DIE.
+ info.Finish();
+
+ ExpectBeginCompilationUnit(GetParam(), (DwarfTag) 0x3e449ac2);
+ EXPECT_CALL(handler,
+ ProcessAttributeUnsigned(_, (DwarfAttribute) 0x359d1972,
+ dwarf2reader::DW_FORM_flag_present,
+ 1))
+ .InSequence(s)
+ .WillOnce(Return());
+ ExpectEndCompilationUnit();
+
+ ParseCompilationUnit(GetParam());
+}
+
+TEST_P(DwarfForms, sec_offset) {
+ StartSingleAttributeDIE(GetParam(), (DwarfTag) 0x1d971689,
+ (DwarfAttribute) 0xa060bfd1,
+ dwarf2reader::DW_FORM_sec_offset);
+ uint64_t value;
+ if (GetParam().format_size == 4) {
+ value = 0xacc9c388;
+ info.D32(value);
+ } else {
+ value = 0xcffe5696ffe3ed0aULL;
+ info.D64(value);
+ }
+ info.Finish();
+
+ ExpectBeginCompilationUnit(GetParam(), (DwarfTag) 0x1d971689);
+ EXPECT_CALL(handler, ProcessAttributeUnsigned(_, (DwarfAttribute) 0xa060bfd1,
+ dwarf2reader::DW_FORM_sec_offset,
+ value))
+ .InSequence(s)
+ .WillOnce(Return());
+ ExpectEndCompilationUnit();
+
+ ParseCompilationUnit(GetParam());
+}
+
+TEST_P(DwarfForms, exprloc) {
+ StartSingleAttributeDIE(GetParam(), (DwarfTag) 0xb6d167bb,
+ (DwarfAttribute) 0xba3ae5cb,
+ dwarf2reader::DW_FORM_exprloc);
+ info.ULEB128(29)
+ .Append(29, 173);
+ info.Finish();
+
+ ExpectBeginCompilationUnit(GetParam(), (DwarfTag) 0xb6d167bb);
+ EXPECT_CALL(handler, ProcessAttributeBuffer(_, (DwarfAttribute) 0xba3ae5cb,
+ dwarf2reader::DW_FORM_exprloc,
+ Pointee(173), 29))
+ .InSequence(s)
+ .WillOnce(Return());
+ ExpectEndCompilationUnit();
+
+ ParseCompilationUnit(GetParam());
+}
+
+TEST_P(DwarfForms, ref_sig8) {
+ StartSingleAttributeDIE(GetParam(), (DwarfTag) 0x253e7b2b,
+ (DwarfAttribute) 0xd708d908,
+ dwarf2reader::DW_FORM_ref_sig8);
+ info.D64(0xf72fa0cb6ddcf9d6ULL);
+ info.Finish();
+
+ ExpectBeginCompilationUnit(GetParam(), (DwarfTag) 0x253e7b2b);
+ EXPECT_CALL(handler, ProcessAttributeSignature(_, (DwarfAttribute) 0xd708d908,
+ dwarf2reader::DW_FORM_ref_sig8,
+ 0xf72fa0cb6ddcf9d6ULL))
+ .InSequence(s)
+ .WillOnce(Return());
+ ExpectEndCompilationUnit();
+
+ ParseCompilationUnit(GetParam());
+}
+
+// A value passed to ProcessAttributeSignature is just an absolute number,
+// not an offset within the compilation unit as most of the other
+// DW_FORM_ref forms are. Check that the reader doesn't try to apply any
+// offset to the signature, by reading it from a compilation unit that does
+// not start at the beginning of the section.
+TEST_P(DwarfForms, ref_sig8_not_first) {
+ info.Append(98, '*');
+ StartSingleAttributeDIE(GetParam(), (DwarfTag) 0x253e7b2b,
+ (DwarfAttribute) 0xd708d908,
+ dwarf2reader::DW_FORM_ref_sig8);
+ info.D64(0xf72fa0cb6ddcf9d6ULL);
+ info.Finish();
+
+ ExpectBeginCompilationUnit(GetParam(), (DwarfTag) 0x253e7b2b, 98);
+ EXPECT_CALL(handler, ProcessAttributeSignature(_, (DwarfAttribute) 0xd708d908,
+ dwarf2reader::DW_FORM_ref_sig8,
+ 0xf72fa0cb6ddcf9d6ULL))
+ .InSequence(s)
+ .WillOnce(Return());
+ ExpectEndCompilationUnit();
+
+ ParseCompilationUnit(GetParam(), 98);
+}
+
+// Tests for the other attribute forms could go here.
+
+INSTANTIATE_TEST_CASE_P(
+ HeaderVariants, DwarfForms,
+ ::testing::Values(DwarfHeaderParams(kLittleEndian, 4, 2, 4),
+ DwarfHeaderParams(kLittleEndian, 4, 2, 8),
+ DwarfHeaderParams(kLittleEndian, 4, 3, 4),
+ DwarfHeaderParams(kLittleEndian, 4, 3, 8),
+ DwarfHeaderParams(kLittleEndian, 4, 4, 4),
+ DwarfHeaderParams(kLittleEndian, 4, 4, 8),
+ DwarfHeaderParams(kLittleEndian, 8, 2, 4),
+ DwarfHeaderParams(kLittleEndian, 8, 2, 8),
+ DwarfHeaderParams(kLittleEndian, 8, 3, 4),
+ DwarfHeaderParams(kLittleEndian, 8, 3, 8),
+ DwarfHeaderParams(kLittleEndian, 8, 4, 4),
+ DwarfHeaderParams(kLittleEndian, 8, 4, 8),
+ DwarfHeaderParams(kBigEndian, 4, 2, 4),
+ DwarfHeaderParams(kBigEndian, 4, 2, 8),
+ DwarfHeaderParams(kBigEndian, 4, 3, 4),
+ DwarfHeaderParams(kBigEndian, 4, 3, 8),
+ DwarfHeaderParams(kBigEndian, 4, 4, 4),
+ DwarfHeaderParams(kBigEndian, 4, 4, 8),
+ DwarfHeaderParams(kBigEndian, 8, 2, 4),
+ DwarfHeaderParams(kBigEndian, 8, 2, 8),
+ DwarfHeaderParams(kBigEndian, 8, 3, 4),
+ DwarfHeaderParams(kBigEndian, 8, 3, 8),
+ DwarfHeaderParams(kBigEndian, 8, 4, 4),
+ DwarfHeaderParams(kBigEndian, 8, 4, 8)));
diff --git a/3rdParty/Breakpad/src/common/dwarf/dwarf2reader_test_common.h b/3rdParty/Breakpad/src/common/dwarf/dwarf2reader_test_common.h
new file mode 100644
index 0000000..e91de90
--- /dev/null
+++ b/3rdParty/Breakpad/src/common/dwarf/dwarf2reader_test_common.h
@@ -0,0 +1,149 @@
+// -*- mode: c++ -*-
+
+// Copyright (c) 2012, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// Original author: Jim Blandy <jimb@mozilla.com> <jimb@red-bean.com>
+
+// dwarf2reader_test_common.h: Define TestCompilationUnit and
+// TestAbbrevTable, classes for creating properly (and improperly)
+// formatted DWARF compilation unit data for unit tests.
+
+#ifndef COMMON_DWARF_DWARF2READER_TEST_COMMON_H__
+#define COMMON_DWARF_DWARF2READER_TEST_COMMON_H__
+
+#include "common/test_assembler.h"
+#include "common/dwarf/dwarf2enums.h"
+
+// A subclass of test_assembler::Section, specialized for constructing
+// DWARF compilation units.
+class TestCompilationUnit: public google_breakpad::test_assembler::Section {
+ public:
+ typedef dwarf2reader::DwarfTag DwarfTag;
+ typedef dwarf2reader::DwarfAttribute DwarfAttribute;
+ typedef dwarf2reader::DwarfForm DwarfForm;
+ typedef google_breakpad::test_assembler::Label Label;
+
+ // Set the section's DWARF format size (the 32-bit DWARF format or the
+ // 64-bit DWARF format, for lengths and section offsets --- not the
+ // address size) to format_size.
+ void set_format_size(size_t format_size) {
+ assert(format_size == 4 || format_size == 8);
+ format_size_ = format_size;
+ }
+
+ // Append a DWARF section offset value, of the appropriate size for this
+ // compilation unit.
+ template<typename T>
+ void SectionOffset(T offset) {
+ if (format_size_ == 4)
+ D32(offset);
+ else
+ D64(offset);
+ }
+
+ // Append a DWARF compilation unit header to the section, with the given
+ // DWARF version, abbrev table offset, and address size.
+ TestCompilationUnit &Header(int version, const Label &abbrev_offset,
+ size_t address_size) {
+ if (format_size_ == 4) {
+ D32(length_);
+ } else {
+ D32(0xffffffff);
+ D64(length_);
+ }
+ post_length_offset_ = Size();
+ D16(version);
+ SectionOffset(abbrev_offset);
+ D8(address_size);
+ return *this;
+ }
+
+ // Mark the end of this header's DIEs.
+ TestCompilationUnit &Finish() {
+ length_ = Size() - post_length_offset_;
+ return *this;
+ }
+
+ private:
+ // The DWARF format size for this compilation unit.
+ size_t format_size_;
+
+ // The offset of the point in the compilation unit header immediately
+ // after the initial length field.
+ uint64_t post_length_offset_;
+
+ // The length of the compilation unit, not including the initial length field.
+ Label length_;
+};
+
+// A subclass of test_assembler::Section specialized for constructing DWARF
+// abbreviation tables.
+class TestAbbrevTable: public google_breakpad::test_assembler::Section {
+ public:
+ typedef dwarf2reader::DwarfTag DwarfTag;
+ typedef dwarf2reader::DwarfAttribute DwarfAttribute;
+ typedef dwarf2reader::DwarfForm DwarfForm;
+ typedef dwarf2reader::DwarfHasChild DwarfHasChild;
+ typedef google_breakpad::test_assembler::Label Label;
+
+ // Start a new abbreviation table entry for abbreviation code |code|,
+ // encoding a DIE whose tag is |tag|, and which has children if and only
+ // if |has_children| is true.
+ TestAbbrevTable &Abbrev(int code, DwarfTag tag, DwarfHasChild has_children) {
+ assert(code != 0);
+ ULEB128(code);
+ ULEB128(static_cast<unsigned>(tag));
+ D8(static_cast<unsigned>(has_children));
+ return *this;
+ };
+
+ // Add an attribute to the current abbreviation code whose name is |name|
+ // and whose form is |form|.
+ TestAbbrevTable &Attribute(DwarfAttribute name, DwarfForm form) {
+ ULEB128(static_cast<unsigned>(name));
+ ULEB128(static_cast<unsigned>(form));
+ return *this;
+ }
+
+ // Finish the current abbreviation code.
+ TestAbbrevTable &EndAbbrev() {
+ ULEB128(0);
+ ULEB128(0);
+ return *this;
+ }
+
+ // Finish the current abbreviation table.
+ TestAbbrevTable &EndTable() {
+ ULEB128(0);
+ return *this;
+ }
+};
+
+#endif // COMMON_DWARF_DWARF2READER_TEST_COMMON_H__
diff --git a/3rdParty/Breakpad/src/common/dwarf/elf_reader.cc b/3rdParty/Breakpad/src/common/dwarf/elf_reader.cc
new file mode 100644
index 0000000..4135a51
--- /dev/null
+++ b/3rdParty/Breakpad/src/common/dwarf/elf_reader.cc
@@ -0,0 +1,1273 @@
+// Copyright 2005 Google Inc. All Rights Reserved.
+// Author: chatham@google.com (Andrew Chatham)
+// Author: satorux@google.com (Satoru Takabayashi)
+//
+// Code for reading in ELF files.
+//
+// For information on the ELF format, see
+// http://www.x86.org/ftp/manuals/tools/elf.pdf
+//
+// I also liked:
+// http://www.caldera.com/developers/gabi/1998-04-29/contents.html
+//
+// A note about types: When dealing with the file format, we use types
+// like Elf32_Word, but in the public interfaces we treat all
+// addresses as uint64. As a result, we should be able to symbolize
+// 64-bit binaries from a 32-bit process (which we don't do,
+// anyway). size_t should therefore be avoided, except where required
+// by things like mmap().
+//
+// Although most of this code can deal with arbitrary ELF files of
+// either word size, the public ElfReader interface only examines
+// files loaded into the current address space, which must all match
+// __WORDSIZE. This code cannot handle ELF files with a non-native
+// byte ordering.
+//
+// TODO(chatham): It would be nice if we could accomplish this task
+// without using malloc(), so we could use it as the process is dying.
+
+#ifndef _GNU_SOURCE
+#define _GNU_SOURCE // needed for pread()
+#endif
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <sys/mman.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <string.h>
+
+#include <algorithm>
+#include <map>
+#include <string>
+#include <vector>
+// TODO(saugustine): Add support for compressed debug.
+// Also need to add configure tests for zlib.
+//#include "zlib.h"
+
+#include "third_party/musl/include/elf.h"
+#include "elf_reader.h"
+#include "common/using_std_string.h"
+
+// EM_AARCH64 is not defined by elf.h of GRTE v3 on x86.
+// TODO(dougkwan): Remove this when v17 is retired.
+#if !defined(EM_AARCH64)
+#define EM_AARCH64 183 /* ARM AARCH64 */
+#endif
+
+// Map Linux macros to their Apple equivalents.
+#if __APPLE__
+#ifndef __LITTLE_ENDIAN
+#define __LITTLE_ENDIAN __ORDER_LITTLE_ENDIAN__
+#endif // __LITTLE_ENDIAN
+#ifndef __BIG_ENDIAN
+#define __BIG_ENDIAN __ORDER_BIG_ENDIAN__
+#endif // __BIG_ENDIAN
+#ifndef __BYTE_ORDER
+#define __BYTE_ORDER __BYTE_ORDER__
+#endif // __BYTE_ORDER
+#endif // __APPLE__
+
+// TODO(dthomson): Can be removed once all Java code is using the Google3
+// launcher. We need to avoid processing PLT functions as it causes memory
+// fragmentation in malloc, which is fixed in tcmalloc - and if the Google3
+// launcher is used the JVM will then use tcmalloc. b/13735638
+//DEFINE_bool(elfreader_process_dynsyms, true,
+// "Activate PLT function processing");
+
+using std::vector;
+
+namespace {
+
+// The lowest bit of an ARM symbol value is used to indicate a Thumb address.
+const int kARMThumbBitOffset = 0;
+
+// Converts an ARM Thumb symbol value to a true aligned address value.
+template <typename T>
+T AdjustARMThumbSymbolValue(const T& symbol_table_value) {
+ return symbol_table_value & ~(1 << kARMThumbBitOffset);
+}
+
+// Names of PLT-related sections.
+const char kElfPLTRelSectionName[] = ".rel.plt"; // Use Rel struct.
+const char kElfPLTRelaSectionName[] = ".rela.plt"; // Use Rela struct.
+const char kElfPLTSectionName[] = ".plt";
+const char kElfDynSymSectionName[] = ".dynsym";
+
+const int kX86PLTCodeSize = 0x10; // Size of one x86 PLT function in bytes.
+const int kARMPLTCodeSize = 0xc;
+const int kAARCH64PLTCodeSize = 0x10;
+
+const int kX86PLT0Size = 0x10; // Size of the special PLT0 entry.
+const int kARMPLT0Size = 0x14;
+const int kAARCH64PLT0Size = 0x20;
+
+// Suffix for PLT functions when it needs to be explicitly identified as such.
+const char kPLTFunctionSuffix[] = "@plt";
+
+} // namespace
+
+namespace dwarf2reader {
+
+template <class ElfArch> class ElfReaderImpl;
+
+// 32-bit and 64-bit ELF files are processed exactly the same, except
+// for various field sizes. Elf32 and Elf64 encompass all of the
+// differences between the two formats, and all format-specific code
+// in this file is templated on one of them.
+class Elf32 {
+ public:
+ typedef Elf32_Ehdr Ehdr;
+ typedef Elf32_Shdr Shdr;
+ typedef Elf32_Phdr Phdr;
+ typedef Elf32_Word Word;
+ typedef Elf32_Sym Sym;
+ typedef Elf32_Rel Rel;
+ typedef Elf32_Rela Rela;
+
+ // What should be in the EI_CLASS header.
+ static const int kElfClass = ELFCLASS32;
+
+ // Given a symbol pointer, return the binding type (eg STB_WEAK).
+ static char Bind(const Elf32_Sym *sym) {
+ return ELF32_ST_BIND(sym->st_info);
+ }
+ // Given a symbol pointer, return the symbol type (eg STT_FUNC).
+ static char Type(const Elf32_Sym *sym) {
+ return ELF32_ST_TYPE(sym->st_info);
+ }
+
+ // Extract the symbol index from the r_info field of a relocation.
+ static int r_sym(const Elf32_Word r_info) {
+ return ELF32_R_SYM(r_info);
+ }
+};
+
+
+class Elf64 {
+ public:
+ typedef Elf64_Ehdr Ehdr;
+ typedef Elf64_Shdr Shdr;
+ typedef Elf64_Phdr Phdr;
+ typedef Elf64_Word Word;
+ typedef Elf64_Sym Sym;
+ typedef Elf64_Rel Rel;
+ typedef Elf64_Rela Rela;
+
+ // What should be in the EI_CLASS header.
+ static const int kElfClass = ELFCLASS64;
+
+ static char Bind(const Elf64_Sym *sym) {
+ return ELF64_ST_BIND(sym->st_info);
+ }
+ static char Type(const Elf64_Sym *sym) {
+ return ELF64_ST_TYPE(sym->st_info);
+ }
+ static int r_sym(const Elf64_Xword r_info) {
+ return ELF64_R_SYM(r_info);
+ }
+};
+
+
+// ElfSectionReader mmaps a section of an ELF file ("section" is ELF
+// terminology). The ElfReaderImpl object providing the section header
+// must exist for the lifetime of this object.
+//
+// The motivation for mmaping individual sections of the file is that
+// many Google executables are large enough when unstripped that we
+// have to worry about running out of virtual address space.
+//
+// For compressed sections we have no choice but to allocate memory.
+template<class ElfArch>
+class ElfSectionReader {
+ public:
+ ElfSectionReader(const char *name, const string &path, int fd,
+ const typename ElfArch::Shdr &section_header)
+ : contents_aligned_(NULL),
+ contents_(NULL),
+ header_(section_header) {
+ // Back up to the beginning of the page we're interested in.
+ const size_t additional = header_.sh_offset % getpagesize();
+ const size_t offset_aligned = header_.sh_offset - additional;
+ section_size_ = header_.sh_size;
+ size_aligned_ = section_size_ + additional;
+ // If the section has been stripped or is empty, do not attempt
+ // to process its contents.
+ if (header_.sh_type == SHT_NOBITS || header_.sh_size == 0)
+ return;
+ contents_aligned_ = mmap(NULL, size_aligned_, PROT_READ, MAP_SHARED,
+ fd, offset_aligned);
+ // Set where the offset really should begin.
+ contents_ = reinterpret_cast<char *>(contents_aligned_) +
+ (header_.sh_offset - offset_aligned);
+
+ // Check for and handle any compressed contents.
+ //if (strncmp(name, ".zdebug_", strlen(".zdebug_")) == 0)
+ // DecompressZlibContents();
+ // TODO(saugustine): Add support for proposed elf-section flag
+ // "SHF_COMPRESS".
+ }
+
+ ~ElfSectionReader() {
+ if (contents_aligned_ != NULL)
+ munmap(contents_aligned_, size_aligned_);
+ else
+ delete[] contents_;
+ }
+
+ // Return the section header for this section.
+ typename ElfArch::Shdr const &header() const { return header_; }
+
+ // Return memory at the given offset within this section.
+ const char *GetOffset(typename ElfArch::Word bytes) const {
+ return contents_ + bytes;
+ }
+
+ const char *contents() const { return contents_; }
+ size_t section_size() const { return section_size_; }
+
+ private:
+ // page-aligned file contents
+ void *contents_aligned_;
+ // contents as usable by the client. For non-compressed sections,
+ // pointer within contents_aligned_ to where the section data
+ // begins; for compressed sections, pointer to the decompressed
+ // data.
+ char *contents_;
+ // size of contents_aligned_
+ size_t size_aligned_;
+ // size of contents.
+ size_t section_size_;
+ const typename ElfArch::Shdr header_;
+};
+
+// An iterator over symbols in a given section. It handles walking
+// through the entries in the specified section and mapping symbol
+// entries to their names in the appropriate string table (in
+// another section).
+template<class ElfArch>
+class SymbolIterator {
+ public:
+ SymbolIterator(ElfReaderImpl<ElfArch> *reader,
+ typename ElfArch::Word section_type)
+ : symbol_section_(reader->GetSectionByType(section_type)),
+ string_section_(NULL),
+ num_symbols_in_section_(0),
+ symbol_within_section_(0) {
+
+ // If this section type doesn't exist, leave
+ // num_symbols_in_section_ as zero, so this iterator is already
+ // done().
+ if (symbol_section_ != NULL) {
+ num_symbols_in_section_ = symbol_section_->header().sh_size /
+ symbol_section_->header().sh_entsize;
+
+ // Symbol sections have sh_link set to the section number of
+ // the string section containing the symbol names.
+ string_section_ = reader->GetSection(symbol_section_->header().sh_link);
+ }
+ }
+
+ // Return true iff we have passed all symbols in this section.
+ bool done() const {
+ return symbol_within_section_ >= num_symbols_in_section_;
+ }
+
+ // Advance to the next symbol in this section.
+ // REQUIRES: !done()
+ void Next() { ++symbol_within_section_; }
+
+ // Return a pointer to the current symbol.
+ // REQUIRES: !done()
+ const typename ElfArch::Sym *GetSymbol() const {
+ return reinterpret_cast<const typename ElfArch::Sym*>(
+ symbol_section_->GetOffset(symbol_within_section_ *
+ symbol_section_->header().sh_entsize));
+ }
+
+ // Return the name of the current symbol, NULL if it has none.
+ // REQUIRES: !done()
+ const char *GetSymbolName() const {
+ int name_offset = GetSymbol()->st_name;
+ if (name_offset == 0)
+ return NULL;
+ return string_section_->GetOffset(name_offset);
+ }
+
+ int GetCurrentSymbolIndex() const {
+ return symbol_within_section_;
+ }
+
+ private:
+ const ElfSectionReader<ElfArch> *const symbol_section_;
+ const ElfSectionReader<ElfArch> *string_section_;
+ int num_symbols_in_section_;
+ int symbol_within_section_;
+};
+
+
+// Copied from strings/strutil.h. Per chatham,
+// this library should not depend on strings.
+
+static inline bool MyHasSuffixString(const string& str, const string& suffix) {
+ int len = str.length();
+ int suflen = suffix.length();
+ return (suflen <= len) && (str.compare(len-suflen, suflen, suffix) == 0);
+}
+
+
+// ElfReader loads an ELF binary and can provide information about its
+// contents. It is most useful for matching addresses to function
+// names. It does not understand debugging formats (eg dwarf2), so it
+// can't print line numbers. It takes a path to an elf file and a
+// readable file descriptor for that file, which it does not assume
+// ownership of.
+template<class ElfArch>
+class ElfReaderImpl {
+ public:
+ explicit ElfReaderImpl(const string &path, int fd)
+ : path_(path),
+ fd_(fd),
+ section_headers_(NULL),
+ program_headers_(NULL),
+ opd_section_(NULL),
+ base_for_text_(0),
+ plts_supported_(false),
+ plt_code_size_(0),
+ plt0_size_(0),
+ visited_relocation_entries_(false) {
+ string error;
+ is_dwp_ = MyHasSuffixString(path, ".dwp");
+ ParseHeaders(fd, path);
+ // Currently we need some extra information for PowerPC64 binaries
+ // including a way to read the .opd section for function descriptors and a
+ // way to find the linked base for function symbols.
+ if (header_.e_machine == EM_PPC64) {
+ // "opd_section_" must always be checked for NULL before use.
+ opd_section_ = GetSectionInfoByName(".opd", &opd_info_);
+ for (unsigned int k = 0u; k < GetNumSections(); ++k) {
+ const char *name = GetSectionName(section_headers_[k].sh_name);
+ if (strncmp(name, ".text", strlen(".text")) == 0) {
+ base_for_text_ =
+ section_headers_[k].sh_addr - section_headers_[k].sh_offset;
+ break;
+ }
+ }
+ }
+ // Turn on PLTs.
+ if (header_.e_machine == EM_386 || header_.e_machine == EM_X86_64) {
+ plt_code_size_ = kX86PLTCodeSize;
+ plt0_size_ = kX86PLT0Size;
+ plts_supported_ = true;
+ } else if (header_.e_machine == EM_ARM) {
+ plt_code_size_ = kARMPLTCodeSize;
+ plt0_size_ = kARMPLT0Size;
+ plts_supported_ = true;
+ } else if (header_.e_machine == EM_AARCH64) {
+ plt_code_size_ = kAARCH64PLTCodeSize;
+ plt0_size_ = kAARCH64PLT0Size;
+ plts_supported_ = true;
+ }
+ }
+
+ ~ElfReaderImpl() {
+ for (unsigned int i = 0u; i < sections_.size(); ++i)
+ delete sections_[i];
+ delete [] section_headers_;
+ delete [] program_headers_;
+ }
+
+ // Examine the headers of the file and return whether the file looks
+ // like an ELF file for this architecture. Takes an already-open
+ // file descriptor for the candidate file, reading in the prologue
+ // to see if the ELF file appears to match the current
+ // architecture. If error is non-NULL, it will be set with a reason
+ // in case of failure.
+ static bool IsArchElfFile(int fd, string *error) {
+ unsigned char header[EI_NIDENT];
+ if (pread(fd, header, sizeof(header), 0) != sizeof(header)) {
+ if (error != NULL) *error = "Could not read header";
+ return false;
+ }
+
+ if (memcmp(header, ELFMAG, SELFMAG) != 0) {
+ if (error != NULL) *error = "Missing ELF magic";
+ return false;
+ }
+
+ if (header[EI_CLASS] != ElfArch::kElfClass) {
+ if (error != NULL) *error = "Different word size";
+ return false;
+ }
+
+ int endian = 0;
+ if (header[EI_DATA] == ELFDATA2LSB)
+ endian = __LITTLE_ENDIAN;
+ else if (header[EI_DATA] == ELFDATA2MSB)
+ endian = __BIG_ENDIAN;
+ if (endian != __BYTE_ORDER) {
+ if (error != NULL) *error = "Different byte order";
+ return false;
+ }
+
+ return true;
+ }
+
+ // Return true if we can use this symbol in Address-to-Symbol map.
+ bool CanUseSymbol(const char *name, const typename ElfArch::Sym *sym) {
+ // For now we only save FUNC and NOTYPE symbols. For now we just
+ // care about functions, but some functions written in assembler
+ // don't have a proper ELF type attached to them, so we store
+ // NOTYPE symbols as well. The remaining significant type is
+ // OBJECT (eg global variables), which represent about 25% of
+ // the symbols in a typical google3 binary.
+ if (ElfArch::Type(sym) != STT_FUNC &&
+ ElfArch::Type(sym) != STT_NOTYPE) {
+ return false;
+ }
+
+ // Target specific filtering.
+ switch (header_.e_machine) {
+ case EM_AARCH64:
+ case EM_ARM:
+ // Filter out '$x' special local symbols used by tools
+ return name[0] != '$' || ElfArch::Bind(sym) != STB_LOCAL;
+ case EM_X86_64:
+ // Filter out read-only constants like .LC123.
+ return name[0] != '.' || ElfArch::Bind(sym) != STB_LOCAL;
+ default:
+ return true;
+ }
+ }
+
+ // Iterate over the symbols in a section, either SHT_DYNSYM or
+ // SHT_SYMTAB. Add all symbols to the given SymbolMap.
+ /*
+ void GetSymbolPositions(SymbolMap *symbols,
+ typename ElfArch::Word section_type,
+ uint64 mem_offset,
+ uint64 file_offset) {
+ // This map is used to filter out "nested" functions.
+ // See comment below.
+ AddrToSymMap addr_to_sym_map;
+ for (SymbolIterator<ElfArch> it(this, section_type);
+ !it.done(); it.Next()) {
+ const char *name = it.GetSymbolName();
+ if (name == NULL)
+ continue;
+ const typename ElfArch::Sym *sym = it.GetSymbol();
+ if (CanUseSymbol(name, sym)) {
+ const int sec = sym->st_shndx;
+
+ // We don't support special section indices. The most common
+ // is SHN_ABS, for absolute symbols used deep in the bowels of
+ // glibc. Also ignore any undefined symbols.
+ if (sec == SHN_UNDEF ||
+ (sec >= SHN_LORESERVE && sec <= SHN_HIRESERVE)) {
+ continue;
+ }
+
+ const typename ElfArch::Shdr& hdr = section_headers_[sec];
+
+ // Adjust for difference between where we expected to mmap
+ // this section, and where it was actually mmapped.
+ const int64 expected_base = hdr.sh_addr - hdr.sh_offset;
+ const int64 real_base = mem_offset - file_offset;
+ const int64 adjust = real_base - expected_base;
+
+ uint64 start = sym->st_value + adjust;
+
+ // Adjust function symbols for PowerPC64 by dereferencing and adjusting
+ // the function descriptor to get the function address.
+ if (header_.e_machine == EM_PPC64 && ElfArch::Type(sym) == STT_FUNC) {
+ const uint64 opd_addr =
+ AdjustPPC64FunctionDescriptorSymbolValue(sym->st_value);
+ // Only adjust the returned value if the function address was found.
+ if (opd_addr != sym->st_value) {
+ const int64 adjust_function_symbols =
+ real_base - base_for_text_;
+ start = opd_addr + adjust_function_symbols;
+ }
+ }
+
+ addr_to_sym_map.push_back(std::make_pair(start, sym));
+ }
+ }
+ std::sort(addr_to_sym_map.begin(), addr_to_sym_map.end(), &AddrToSymSorter);
+ addr_to_sym_map.erase(std::unique(addr_to_sym_map.begin(),
+ addr_to_sym_map.end(), &AddrToSymEquals),
+ addr_to_sym_map.end());
+
+ // Squeeze out any "nested functions".
+ // Nested functions are not allowed in C, but libc plays tricks.
+ //
+ // For example, here is disassembly of /lib64/tls/libc-2.3.5.so:
+ // 0x00000000000aa380 <read+0>: cmpl $0x0,0x2781b9(%rip)
+ // 0x00000000000aa387 <read+7>: jne 0xaa39b <read+27>
+ // 0x00000000000aa389 <__read_nocancel+0>: mov $0x0,%rax
+ // 0x00000000000aa390 <__read_nocancel+7>: syscall
+ // 0x00000000000aa392 <__read_nocancel+9>: cmp $0xfffffffffffff001,%rax
+ // 0x00000000000aa398 <__read_nocancel+15>: jae 0xaa3ef <read+111>
+ // 0x00000000000aa39a <__read_nocancel+17>: retq
+ // 0x00000000000aa39b <read+27>: sub $0x28,%rsp
+ // 0x00000000000aa39f <read+31>: mov %rdi,0x8(%rsp)
+ // ...
+ // Without removing __read_nocancel, symbolizer will return NULL
+ // given e.g. 0xaa39f (because the lower bound is __read_nocancel,
+ // but 0xaa39f is beyond its end.
+ if (addr_to_sym_map.empty()) {
+ return;
+ }
+ const ElfSectionReader<ElfArch> *const symbol_section =
+ this->GetSectionByType(section_type);
+ const ElfSectionReader<ElfArch> *const string_section =
+ this->GetSection(symbol_section->header().sh_link);
+
+ typename AddrToSymMap::iterator curr = addr_to_sym_map.begin();
+ // Always insert the first symbol.
+ symbols->AddSymbol(string_section->GetOffset(curr->second->st_name),
+ curr->first, curr->second->st_size);
+ typename AddrToSymMap::iterator prev = curr++;
+ for (; curr != addr_to_sym_map.end(); ++curr) {
+ const uint64 prev_addr = prev->first;
+ const uint64 curr_addr = curr->first;
+ const typename ElfArch::Sym *const prev_sym = prev->second;
+ const typename ElfArch::Sym *const curr_sym = curr->second;
+ if (prev_addr + prev_sym->st_size <= curr_addr ||
+ // The next condition is true if two symbols overlap like this:
+ //
+ // Previous symbol |----------------------------|
+ // Current symbol |-------------------------------|
+ //
+ // These symbols are not found in google3 codebase, but in
+ // jdk1.6.0_01_gg1/jre/lib/i386/server/libjvm.so.
+ //
+ // 0619e040 00000046 t CardTableModRefBS::write_region_work()
+ // 0619e070 00000046 t CardTableModRefBS::write_ref_array_work()
+ //
+ // We allow overlapped symbols rather than ignore these.
+ // Due to the way SymbolMap::GetSymbolAtPosition() works,
+ // lookup for any address in [curr_addr, curr_addr + its size)
+ // (e.g. 0619e071) will produce the current symbol,
+ // which is the desired outcome.
+ prev_addr + prev_sym->st_size < curr_addr + curr_sym->st_size) {
+ const char *name = string_section->GetOffset(curr_sym->st_name);
+ symbols->AddSymbol(name, curr_addr, curr_sym->st_size);
+ prev = curr;
+ } else {
+ // Current symbol is "nested" inside previous one like this:
+ //
+ // Previous symbol |----------------------------|
+ // Current symbol |---------------------|
+ //
+ // This happens within glibc, e.g. __read_nocancel is nested
+ // "inside" __read. Ignore "inner" symbol.
+ //DCHECK_LE(curr_addr + curr_sym->st_size,
+ // prev_addr + prev_sym->st_size);
+ ;
+ }
+ }
+ }
+*/
+
+ void VisitSymbols(typename ElfArch::Word section_type,
+ ElfReader::SymbolSink *sink) {
+ VisitSymbols(section_type, sink, -1, -1, false);
+ }
+
+ void VisitSymbols(typename ElfArch::Word section_type,
+ ElfReader::SymbolSink *sink,
+ int symbol_binding,
+ int symbol_type,
+ bool get_raw_symbol_values) {
+ for (SymbolIterator<ElfArch> it(this, section_type);
+ !it.done(); it.Next()) {
+ const char *name = it.GetSymbolName();
+ if (!name) continue;
+ const typename ElfArch::Sym *sym = it.GetSymbol();
+ if ((symbol_binding < 0 || ElfArch::Bind(sym) == symbol_binding) &&
+ (symbol_type < 0 || ElfArch::Type(sym) == symbol_type)) {
+ typename ElfArch::Sym symbol = *sym;
+ // Add a PLT symbol in addition to the main undefined symbol.
+ // Only do this for SHT_DYNSYM, because PLT symbols are dynamic.
+ int symbol_index = it.GetCurrentSymbolIndex();
+ // TODO(dthomson): Can be removed once all Java code is using the
+ // Google3 launcher.
+ if (section_type == SHT_DYNSYM &&
+ static_cast<unsigned int>(symbol_index) < symbols_plt_offsets_.size() &&
+ symbols_plt_offsets_[symbol_index] != 0) {
+ string plt_name = string(name) + kPLTFunctionSuffix;
+ if (plt_function_names_[symbol_index].empty()) {
+ plt_function_names_[symbol_index] = plt_name;
+ } else if (plt_function_names_[symbol_index] != plt_name) {
+ ;
+ }
+ sink->AddSymbol(plt_function_names_[symbol_index].c_str(),
+ symbols_plt_offsets_[it.GetCurrentSymbolIndex()],
+ plt_code_size_);
+ }
+ if (!get_raw_symbol_values)
+ AdjustSymbolValue(&symbol);
+ sink->AddSymbol(name, symbol.st_value, symbol.st_size);
+ }
+ }
+ }
+
+ void VisitRelocationEntries() {
+ if (visited_relocation_entries_) {
+ return;
+ }
+ visited_relocation_entries_ = true;
+
+ if (!plts_supported_) {
+ return;
+ }
+ // First determine if PLTs exist. If not, then there is nothing to do.
+ ElfReader::SectionInfo plt_section_info;
+ const char* plt_section =
+ GetSectionInfoByName(kElfPLTSectionName, &plt_section_info);
+ if (!plt_section) {
+ return;
+ }
+ if (plt_section_info.size == 0) {
+ return;
+ }
+
+ // The PLTs could be referenced by either a Rel or Rela (Rel with Addend)
+ // section.
+ ElfReader::SectionInfo rel_section_info;
+ ElfReader::SectionInfo rela_section_info;
+ const char* rel_section =
+ GetSectionInfoByName(kElfPLTRelSectionName, &rel_section_info);
+ const char* rela_section =
+ GetSectionInfoByName(kElfPLTRelaSectionName, &rela_section_info);
+
+ const typename ElfArch::Rel* rel =
+ reinterpret_cast<const typename ElfArch::Rel*>(rel_section);
+ const typename ElfArch::Rela* rela =
+ reinterpret_cast<const typename ElfArch::Rela*>(rela_section);
+
+ if (!rel_section && !rela_section) {
+ return;
+ }
+
+ // Use either Rel or Rela section, depending on which one exists.
+ size_t section_size = rel_section ? rel_section_info.size
+ : rela_section_info.size;
+ size_t entry_size = rel_section ? sizeof(typename ElfArch::Rel)
+ : sizeof(typename ElfArch::Rela);
+
+ // Determine the number of entries in the dynamic symbol table.
+ ElfReader::SectionInfo dynsym_section_info;
+ const char* dynsym_section =
+ GetSectionInfoByName(kElfDynSymSectionName, &dynsym_section_info);
+ // The dynsym section might not exist, or it might be empty. In either case
+ // there is nothing to be done so return.
+ if (!dynsym_section || dynsym_section_info.size == 0) {
+ return;
+ }
+ size_t num_dynamic_symbols =
+ dynsym_section_info.size / dynsym_section_info.entsize;
+ symbols_plt_offsets_.resize(num_dynamic_symbols, 0);
+
+ // TODO(dthomson): Can be removed once all Java code is using the
+ // Google3 launcher.
+ // Make storage room for PLT function name strings.
+ plt_function_names_.resize(num_dynamic_symbols);
+
+ for (size_t i = 0; i < section_size / entry_size; ++i) {
+ // Determine symbol index from the |r_info| field.
+ int sym_index = ElfArch::r_sym(rel_section ? rel[i].r_info
+ : rela[i].r_info);
+ if (static_cast<unsigned int>(sym_index) >= symbols_plt_offsets_.size()) {
+ continue;
+ }
+ symbols_plt_offsets_[sym_index] =
+ plt_section_info.addr + plt0_size_ + i * plt_code_size_;
+ }
+ }
+
+ // Return an ElfSectionReader for the first section of the given
+ // type by iterating through all section headers. Returns NULL if
+ // the section type is not found.
+ const ElfSectionReader<ElfArch> *GetSectionByType(
+ typename ElfArch::Word section_type) {
+ for (unsigned int k = 0u; k < GetNumSections(); ++k) {
+ if (section_headers_[k].sh_type == section_type) {
+ return GetSection(k);
+ }
+ }
+ return NULL;
+ }
+
+ // Return the name of section "shndx". Returns NULL if the section
+ // is not found.
+ const char *GetSectionNameByIndex(int shndx) {
+ return GetSectionName(section_headers_[shndx].sh_name);
+ }
+
+ // Return a pointer to section "shndx", and store the size in
+ // "size". Returns NULL if the section is not found.
+ const char *GetSectionContentsByIndex(int shndx, size_t *size) {
+ const ElfSectionReader<ElfArch> *section = GetSection(shndx);
+ if (section != NULL) {
+ *size = section->section_size();
+ return section->contents();
+ }
+ return NULL;
+ }
+
+ // Return a pointer to the first section of the given name by
+ // iterating through all section headers, and store the size in
+ // "size". Returns NULL if the section name is not found.
+ const char *GetSectionContentsByName(const string &section_name,
+ size_t *size) {
+ for (unsigned int k = 0u; k < GetNumSections(); ++k) {
+ // When searching for sections in a .dwp file, the sections
+ // we're looking for will always be at the end of the section
+ // table, so reverse the direction of iteration.
+ int shndx = is_dwp_ ? GetNumSections() - k - 1 : k;
+ const char *name = GetSectionName(section_headers_[shndx].sh_name);
+ if (name != NULL && ElfReader::SectionNamesMatch(section_name, name)) {
+ const ElfSectionReader<ElfArch> *section = GetSection(shndx);
+ if (section == NULL) {
+ return NULL;
+ } else {
+ *size = section->section_size();
+ return section->contents();
+ }
+ }
+ }
+ return NULL;
+ }
+
+ // This is like GetSectionContentsByName() but it returns a lot of extra
+ // information about the section.
+ const char *GetSectionInfoByName(const string &section_name,
+ ElfReader::SectionInfo *info) {
+ for (unsigned int k = 0u; k < GetNumSections(); ++k) {
+ // When searching for sections in a .dwp file, the sections
+ // we're looking for will always be at the end of the section
+ // table, so reverse the direction of iteration.
+ int shndx = is_dwp_ ? GetNumSections() - k - 1 : k;
+ const char *name = GetSectionName(section_headers_[shndx].sh_name);
+ if (name != NULL && ElfReader::SectionNamesMatch(section_name, name)) {
+ const ElfSectionReader<ElfArch> *section = GetSection(shndx);
+ if (section == NULL) {
+ return NULL;
+ } else {
+ info->type = section->header().sh_type;
+ info->flags = section->header().sh_flags;
+ info->addr = section->header().sh_addr;
+ info->offset = section->header().sh_offset;
+ info->size = section->header().sh_size;
+ info->link = section->header().sh_link;
+ info->info = section->header().sh_info;
+ info->addralign = section->header().sh_addralign;
+ info->entsize = section->header().sh_entsize;
+ return section->contents();
+ }
+ }
+ }
+ return NULL;
+ }
+
+ // p_vaddr of the first PT_LOAD segment (if any), or 0 if no PT_LOAD
+ // segments are present. This is the address an ELF image was linked
+ // (by static linker) to be loaded at. Usually (but not always) 0 for
+ // shared libraries and position-independent executables.
+ uint64 VaddrOfFirstLoadSegment() const {
+ // Relocatable objects (of type ET_REL) do not have LOAD segments.
+ if (header_.e_type == ET_REL) {
+ return 0;
+ }
+ for (int i = 0; i < GetNumProgramHeaders(); ++i) {
+ if (program_headers_[i].p_type == PT_LOAD) {
+ return program_headers_[i].p_vaddr;
+ }
+ }
+ return 0;
+ }
+
+ // According to the LSB ("ELF special sections"), sections with debug
+ // info are prefixed by ".debug". The names are not specified, but they
+ // look like ".debug_line", ".debug_info", etc.
+ bool HasDebugSections() {
+ // Debug sections are likely to be near the end, so reverse the
+ // direction of iteration.
+ for (int k = GetNumSections() - 1; k >= 0; --k) {
+ const char *name = GetSectionName(section_headers_[k].sh_name);
+ if (strncmp(name, ".debug", strlen(".debug")) == 0) return true;
+ if (strncmp(name, ".zdebug", strlen(".zdebug")) == 0) return true;
+ }
+ return false;
+ }
+
+ bool IsDynamicSharedObject() const {
+ return header_.e_type == ET_DYN;
+ }
+
+ // Return the number of sections.
+ uint64_t GetNumSections() const {
+ if (HasManySections())
+ return first_section_header_.sh_size;
+ return header_.e_shnum;
+ }
+
+ private:
+ typedef vector<pair<uint64, const typename ElfArch::Sym *> > AddrToSymMap;
+
+ static bool AddrToSymSorter(const typename AddrToSymMap::value_type& lhs,
+ const typename AddrToSymMap::value_type& rhs) {
+ return lhs.first < rhs.first;
+ }
+
+ static bool AddrToSymEquals(const typename AddrToSymMap::value_type& lhs,
+ const typename AddrToSymMap::value_type& rhs) {
+ return lhs.first == rhs.first;
+ }
+
+ // Does this ELF file have too many sections to fit in the program header?
+ bool HasManySections() const {
+ return header_.e_shnum == SHN_UNDEF;
+ }
+
+ // Return the number of program headers.
+ int GetNumProgramHeaders() const {
+ if (HasManySections() && header_.e_phnum == 0xffff &&
+ first_section_header_.sh_info != 0)
+ return first_section_header_.sh_info;
+ return header_.e_phnum;
+ }
+
+ // Return the index of the string table.
+ int GetStringTableIndex() const {
+ if (HasManySections()) {
+ if (header_.e_shstrndx == 0xffff)
+ return first_section_header_.sh_link;
+ else if (header_.e_shstrndx >= GetNumSections())
+ return 0;
+ }
+ return header_.e_shstrndx;
+ }
+
+ // Given an offset into the section header string table, return the
+ // section name.
+ const char *GetSectionName(typename ElfArch::Word sh_name) {
+ const ElfSectionReader<ElfArch> *shstrtab =
+ GetSection(GetStringTableIndex());
+ if (shstrtab != NULL) {
+ return shstrtab->GetOffset(sh_name);
+ }
+ return NULL;
+ }
+
+ // Return an ElfSectionReader for the given section. The reader will
+ // be freed when this object is destroyed.
+ const ElfSectionReader<ElfArch> *GetSection(int num) {
+ const char *name;
+ // Hard-coding the name for the section-name string table prevents
+ // infinite recursion.
+ if (num == GetStringTableIndex())
+ name = ".shstrtab";
+ else
+ name = GetSectionNameByIndex(num);
+ ElfSectionReader<ElfArch> *& reader = sections_[num];
+ if (reader == NULL)
+ reader = new ElfSectionReader<ElfArch>(name, path_, fd_,
+ section_headers_[num]);
+ return reader;
+ }
+
+ // Parse out the overall header information from the file and assert
+ // that it looks sane. This contains information like the magic
+ // number and target architecture.
+ bool ParseHeaders(int fd, const string &path) {
+ // Read in the global ELF header.
+ if (pread(fd, &header_, sizeof(header_), 0) != sizeof(header_)) {
+ return false;
+ }
+
+ // Must be an executable, dynamic shared object or relocatable object
+ if (header_.e_type != ET_EXEC &&
+ header_.e_type != ET_DYN &&
+ header_.e_type != ET_REL) {
+ return false;
+ }
+ // Need a section header.
+ if (header_.e_shoff == 0) {
+ return false;
+ }
+
+ if (header_.e_shnum == SHN_UNDEF) {
+ // The number of sections in the program header is only a 16-bit value. In
+ // the event of overflow (greater than SHN_LORESERVE sections), e_shnum
+ // will read SHN_UNDEF and the true number of section header table entries
+ // is found in the sh_size field of the first section header.
+ // See: http://www.sco.com/developers/gabi/2003-12-17/ch4.sheader.html
+ if (pread(fd, &first_section_header_, sizeof(first_section_header_),
+ header_.e_shoff) != sizeof(first_section_header_)) {
+ return false;
+ }
+ }
+
+ // Dynamically allocate enough space to store the section headers
+ // and read them out of the file.
+ const int section_headers_size =
+ GetNumSections() * sizeof(*section_headers_);
+ section_headers_ = new typename ElfArch::Shdr[section_headers_size];
+ if (pread(fd, section_headers_, section_headers_size, header_.e_shoff) !=
+ section_headers_size) {
+ return false;
+ }
+
+ // Dynamically allocate enough space to store the program headers
+ // and read them out of the file.
+ //const int program_headers_size =
+ // GetNumProgramHeaders() * sizeof(*program_headers_);
+ program_headers_ = new typename ElfArch::Phdr[GetNumProgramHeaders()];
+
+ // Presize the sections array for efficiency.
+ sections_.resize(GetNumSections(), NULL);
+ return true;
+ }
+
+ // Given the "value" of a function descriptor return the address of the
+ // function (i.e. the dereferenced value). Otherwise return "value".
+ uint64 AdjustPPC64FunctionDescriptorSymbolValue(uint64 value) {
+ if (opd_section_ != NULL &&
+ opd_info_.addr <= value &&
+ value < opd_info_.addr + opd_info_.size) {
+ uint64 offset = value - opd_info_.addr;
+ return (*reinterpret_cast<const uint64*>(opd_section_ + offset));
+ }
+ return value;
+ }
+
+ void AdjustSymbolValue(typename ElfArch::Sym* sym) {
+ switch (header_.e_machine) {
+ case EM_ARM:
+ // For ARM architecture, if the LSB of the function symbol offset is set,
+ // it indicates a Thumb function. This bit should not be taken literally.
+ // Clear it.
+ if (ElfArch::Type(sym) == STT_FUNC)
+ sym->st_value = AdjustARMThumbSymbolValue(sym->st_value);
+ break;
+ case EM_386:
+ // No adjustment needed for Intel x86 architecture. However, explicitly
+ // define this case as we use it quite often.
+ break;
+ case EM_PPC64:
+ // PowerPC64 currently has function descriptors as part of the ABI.
+ // Function symbols need to be adjusted accordingly.
+ if (ElfArch::Type(sym) == STT_FUNC)
+ sym->st_value = AdjustPPC64FunctionDescriptorSymbolValue(sym->st_value);
+ break;
+ default:
+ break;
+ }
+ }
+
+ friend class SymbolIterator<ElfArch>;
+
+ // The file we're reading.
+ const string path_;
+ // Open file descriptor for path_. Not owned by this object.
+ const int fd_;
+
+ // The global header of the ELF file.
+ typename ElfArch::Ehdr header_;
+
+ // The header of the first section. This may be used to supplement the ELF
+ // file header.
+ typename ElfArch::Shdr first_section_header_;
+
+ // Array of GetNumSections() section headers, allocated when we read
+ // in the global header.
+ typename ElfArch::Shdr *section_headers_;
+
+ // Array of GetNumProgramHeaders() program headers, allocated when we read
+ // in the global header.
+ typename ElfArch::Phdr *program_headers_;
+
+ // An array of pointers to ElfSectionReaders. Sections are
+ // mmaped as they're needed and not released until this object is
+ // destroyed.
+ vector<ElfSectionReader<ElfArch>*> sections_;
+
+ // For PowerPC64 we need to keep track of function descriptors when looking up
+ // values for funtion symbols values. Function descriptors are kept in the
+ // .opd section and are dereferenced to find the function address.
+ ElfReader::SectionInfo opd_info_;
+ const char *opd_section_; // Must be checked for NULL before use.
+ int64 base_for_text_;
+
+ // Read PLT-related sections for the current architecture.
+ bool plts_supported_;
+ // Code size of each PLT function for the current architecture.
+ size_t plt_code_size_;
+ // Size of the special first entry in the .plt section that calls the runtime
+ // loader resolution routine, and that all other entries jump to when doing
+ // lazy symbol binding.
+ size_t plt0_size_;
+
+ // Maps a dynamic symbol index to a PLT offset.
+ // The vector entry index is the dynamic symbol index.
+ std::vector<uint64> symbols_plt_offsets_;
+
+ // Container for PLT function name strings. These strings are passed by
+ // reference to SymbolSink::AddSymbol() so they need to be stored somewhere.
+ std::vector<string> plt_function_names_;
+
+ bool visited_relocation_entries_;
+
+ // True if this is a .dwp file.
+ bool is_dwp_;
+};
+
+ElfReader::ElfReader(const string &path)
+ : path_(path), fd_(-1), impl32_(NULL), impl64_(NULL) {
+ // linux 2.6.XX kernel can show deleted files like this:
+ // /var/run/nscd/dbYLJYaE (deleted)
+ // and the kernel-supplied vdso and vsyscall mappings like this:
+ // [vdso]
+ // [vsyscall]
+ if (MyHasSuffixString(path, " (deleted)"))
+ return;
+ if (path == "[vdso]")
+ return;
+ if (path == "[vsyscall]")
+ return;
+
+ fd_ = open(path.c_str(), O_RDONLY);
+}
+
+ElfReader::~ElfReader() {
+ if (fd_ != -1)
+ close(fd_);
+ if (impl32_ != NULL)
+ delete impl32_;
+ if (impl64_ != NULL)
+ delete impl64_;
+}
+
+
+// The only word-size specific part of this file is IsNativeElfFile().
+#if __WORDSIZE == 32
+#define NATIVE_ELF_ARCH Elf32
+#elif __WORDSIZE == 64
+#define NATIVE_ELF_ARCH Elf64
+#else
+#error "Invalid word size"
+#endif
+
+template <typename ElfArch>
+static bool IsElfFile(const int fd, const string &path) {
+ if (fd < 0)
+ return false;
+ if (!ElfReaderImpl<ElfArch>::IsArchElfFile(fd, NULL)) {
+ // No error message here. IsElfFile gets called many times.
+ return false;
+ }
+ return true;
+}
+
+bool ElfReader::IsNativeElfFile() const {
+ return IsElfFile<NATIVE_ELF_ARCH>(fd_, path_);
+}
+
+bool ElfReader::IsElf32File() const {
+ return IsElfFile<Elf32>(fd_, path_);
+}
+
+bool ElfReader::IsElf64File() const {
+ return IsElfFile<Elf64>(fd_, path_);
+}
+
+/*
+void ElfReader::AddSymbols(SymbolMap *symbols,
+ uint64 mem_offset, uint64 file_offset,
+ uint64 length) {
+ if (fd_ < 0)
+ return;
+ // TODO(chatham): Actually use the information about file offset and
+ // the length of the mapped section. On some machines the data
+ // section gets mapped as executable, and we'll end up reading the
+ // file twice and getting some of the offsets wrong.
+ if (IsElf32File()) {
+ GetImpl32()->GetSymbolPositions(symbols, SHT_SYMTAB,
+ mem_offset, file_offset);
+ GetImpl32()->GetSymbolPositions(symbols, SHT_DYNSYM,
+ mem_offset, file_offset);
+ } else if (IsElf64File()) {
+ GetImpl64()->GetSymbolPositions(symbols, SHT_SYMTAB,
+ mem_offset, file_offset);
+ GetImpl64()->GetSymbolPositions(symbols, SHT_DYNSYM,
+ mem_offset, file_offset);
+ }
+}
+*/
+
+void ElfReader::VisitSymbols(ElfReader::SymbolSink *sink) {
+ VisitSymbols(sink, -1, -1);
+}
+
+void ElfReader::VisitSymbols(ElfReader::SymbolSink *sink,
+ int symbol_binding,
+ int symbol_type) {
+ VisitSymbols(sink, symbol_binding, symbol_type, false);
+}
+
+void ElfReader::VisitSymbols(ElfReader::SymbolSink *sink,
+ int symbol_binding,
+ int symbol_type,
+ bool get_raw_symbol_values) {
+ if (IsElf32File()) {
+ GetImpl32()->VisitRelocationEntries();
+ GetImpl32()->VisitSymbols(SHT_SYMTAB, sink, symbol_binding, symbol_type,
+ get_raw_symbol_values);
+ GetImpl32()->VisitSymbols(SHT_DYNSYM, sink, symbol_binding, symbol_type,
+ get_raw_symbol_values);
+ } else if (IsElf64File()) {
+ GetImpl64()->VisitRelocationEntries();
+ GetImpl64()->VisitSymbols(SHT_SYMTAB, sink, symbol_binding, symbol_type,
+ get_raw_symbol_values);
+ GetImpl64()->VisitSymbols(SHT_DYNSYM, sink, symbol_binding, symbol_type,
+ get_raw_symbol_values);
+ }
+}
+
+uint64 ElfReader::VaddrOfFirstLoadSegment() {
+ if (IsElf32File()) {
+ return GetImpl32()->VaddrOfFirstLoadSegment();
+ } else if (IsElf64File()) {
+ return GetImpl64()->VaddrOfFirstLoadSegment();
+ } else {
+ return 0;
+ }
+}
+
+const char *ElfReader::GetSectionName(int shndx) {
+ if (shndx < 0 || static_cast<unsigned int>(shndx) >= GetNumSections()) return NULL;
+ if (IsElf32File()) {
+ return GetImpl32()->GetSectionNameByIndex(shndx);
+ } else if (IsElf64File()) {
+ return GetImpl64()->GetSectionNameByIndex(shndx);
+ } else {
+ return NULL;
+ }
+}
+
+uint64 ElfReader::GetNumSections() {
+ if (IsElf32File()) {
+ return GetImpl32()->GetNumSections();
+ } else if (IsElf64File()) {
+ return GetImpl64()->GetNumSections();
+ } else {
+ return 0;
+ }
+}
+
+const char *ElfReader::GetSectionByIndex(int shndx, size_t *size) {
+ if (IsElf32File()) {
+ return GetImpl32()->GetSectionContentsByIndex(shndx, size);
+ } else if (IsElf64File()) {
+ return GetImpl64()->GetSectionContentsByIndex(shndx, size);
+ } else {
+ return NULL;
+ }
+}
+
+const char *ElfReader::GetSectionByName(const string &section_name,
+ size_t *size) {
+ if (IsElf32File()) {
+ return GetImpl32()->GetSectionContentsByName(section_name, size);
+ } else if (IsElf64File()) {
+ return GetImpl64()->GetSectionContentsByName(section_name, size);
+ } else {
+ return NULL;
+ }
+}
+
+const char *ElfReader::GetSectionInfoByName(const string &section_name,
+ SectionInfo *info) {
+ if (IsElf32File()) {
+ return GetImpl32()->GetSectionInfoByName(section_name, info);
+ } else if (IsElf64File()) {
+ return GetImpl64()->GetSectionInfoByName(section_name, info);
+ } else {
+ return NULL;
+ }
+}
+
+bool ElfReader::SectionNamesMatch(const string &name, const string &sh_name) {
+ if ((name.find(".debug_", 0) == 0) && (sh_name.find(".zdebug_", 0) == 0)) {
+ const string name_suffix(name, strlen(".debug_"));
+ const string sh_name_suffix(sh_name, strlen(".zdebug_"));
+ return name_suffix == sh_name_suffix;
+ }
+ return name == sh_name;
+}
+
+bool ElfReader::IsDynamicSharedObject() {
+ if (IsElf32File()) {
+ return GetImpl32()->IsDynamicSharedObject();
+ } else if (IsElf64File()) {
+ return GetImpl64()->IsDynamicSharedObject();
+ } else {
+ return false;
+ }
+}
+
+ElfReaderImpl<Elf32> *ElfReader::GetImpl32() {
+ if (impl32_ == NULL) {
+ impl32_ = new ElfReaderImpl<Elf32>(path_, fd_);
+ }
+ return impl32_;
+}
+
+ElfReaderImpl<Elf64> *ElfReader::GetImpl64() {
+ if (impl64_ == NULL) {
+ impl64_ = new ElfReaderImpl<Elf64>(path_, fd_);
+ }
+ return impl64_;
+}
+
+// Return true if file is an ELF binary of ElfArch, with unstripped
+// debug info (debug_only=true) or symbol table (debug_only=false).
+// Otherwise, return false.
+template <typename ElfArch>
+static bool IsNonStrippedELFBinaryImpl(const string &path, const int fd,
+ bool debug_only) {
+ if (!ElfReaderImpl<ElfArch>::IsArchElfFile(fd, NULL)) return false;
+ ElfReaderImpl<ElfArch> elf_reader(path, fd);
+ return debug_only ?
+ elf_reader.HasDebugSections()
+ : (elf_reader.GetSectionByType(SHT_SYMTAB) != NULL);
+}
+
+// Helper for the IsNon[Debug]StrippedELFBinary functions.
+static bool IsNonStrippedELFBinaryHelper(const string &path,
+ bool debug_only) {
+ const int fd = open(path.c_str(), O_RDONLY);
+ if (fd == -1) {
+ return false;
+ }
+
+ if (IsNonStrippedELFBinaryImpl<Elf32>(path, fd, debug_only) ||
+ IsNonStrippedELFBinaryImpl<Elf64>(path, fd, debug_only)) {
+ close(fd);
+ return true;
+ }
+ close(fd);
+ return false;
+}
+
+bool ElfReader::IsNonStrippedELFBinary(const string &path) {
+ return IsNonStrippedELFBinaryHelper(path, false);
+}
+
+bool ElfReader::IsNonDebugStrippedELFBinary(const string &path) {
+ return IsNonStrippedELFBinaryHelper(path, true);
+}
+} // namespace dwarf2reader
diff --git a/3rdParty/Breakpad/src/common/dwarf/elf_reader.h b/3rdParty/Breakpad/src/common/dwarf/elf_reader.h
new file mode 100644
index 0000000..b1bb67a
--- /dev/null
+++ b/3rdParty/Breakpad/src/common/dwarf/elf_reader.h
@@ -0,0 +1,166 @@
+// Copyright 2005 Google Inc. All Rights Reserved.
+// Author: chatham@google.com (Andrew Chatham)
+// Author: satorux@google.com (Satoru Takabayashi)
+//
+// ElfReader handles reading in ELF. It can extract symbols from the
+// current process, which may be used to symbolize stack traces
+// without having to make a potentially dangerous call to fork().
+//
+// ElfReader dynamically allocates memory, so it is not appropriate to
+// use once the address space might be corrupted, such as during
+// process death.
+//
+// ElfReader supports both 32-bit and 64-bit ELF binaries.
+
+#ifndef COMMON_DWARF_ELF_READER_H__
+#define COMMON_DWARF_ELF_READER_H__
+
+#include <string>
+#include <vector>
+
+#include "common/dwarf/types.h"
+#include "common/using_std_string.h"
+
+using std::vector;
+using std::pair;
+
+namespace dwarf2reader {
+
+class SymbolMap;
+class Elf32;
+class Elf64;
+template<typename ElfArch>
+class ElfReaderImpl;
+
+class ElfReader {
+ public:
+ explicit ElfReader(const string &path);
+ ~ElfReader();
+
+ // Parse the ELF prologue of this file and return whether it was
+ // successfully parsed and matches the word size and byte order of
+ // the current process.
+ bool IsNativeElfFile() const;
+
+ // Similar to IsNativeElfFile but checks if it's a 32-bit ELF file.
+ bool IsElf32File() const;
+
+ // Similar to IsNativeElfFile but checks if it's a 64-bit ELF file.
+ bool IsElf64File() const;
+
+ // Checks if it's an ELF file of type ET_DYN (shared object file).
+ bool IsDynamicSharedObject();
+
+ // Add symbols in the given ELF file into the provided SymbolMap,
+ // assuming that the file has been loaded into the specified
+ // offset.
+ //
+ // The remaining arguments are typically taken from a
+ // ProcMapsIterator (base/sysinfo.h) and describe which portions of
+ // the ELF file are mapped into which parts of memory:
+ //
+ // mem_offset - position at which the segment is mapped into memory
+ // file_offset - offset in the file where the mapping begins
+ // length - length of the mapped segment
+ void AddSymbols(SymbolMap *symbols,
+ uint64 mem_offset, uint64 file_offset,
+ uint64 length);
+
+ class SymbolSink {
+ public:
+ virtual ~SymbolSink() {}
+ virtual void AddSymbol(const char *name, uint64 address, uint64 size) = 0;
+ };
+
+ // Like AddSymbols above, but with no address correction.
+ // Processes any SHT_SYMTAB section, followed by any SHT_DYNSYM section.
+ void VisitSymbols(SymbolSink *sink);
+
+ // Like VisitSymbols above, but for a specific symbol binding/type.
+ // A negative value for the binding and type parameters means any
+ // binding or type.
+ void VisitSymbols(SymbolSink *sink, int symbol_binding, int symbol_type);
+
+ // Like VisitSymbols above but can optionally export raw symbol values instead
+ // of adjusted ones.
+ void VisitSymbols(SymbolSink *sink, int symbol_binding, int symbol_type,
+ bool get_raw_symbol_values);
+
+ // p_vaddr of the first PT_LOAD segment (if any), or 0 if no PT_LOAD
+ // segments are present. This is the address an ELF image was linked
+ // (by static linker) to be loaded at. Usually (but not always) 0 for
+ // shared libraries and position-independent executables.
+ uint64 VaddrOfFirstLoadSegment();
+
+ // Return the name of section "shndx". Returns NULL if the section
+ // is not found.
+ const char *GetSectionName(int shndx);
+
+ // Return the number of sections in the given ELF file.
+ uint64 GetNumSections();
+
+ // Get section "shndx" from the given ELF file. On success, return
+ // the pointer to the section and store the size in "size".
+ // On error, return NULL. The returned section data is only valid
+ // until the ElfReader gets destroyed.
+ const char *GetSectionByIndex(int shndx, size_t *size);
+
+ // Get section with "section_name" (ex. ".text", ".symtab") in the
+ // given ELF file. On success, return the pointer to the section
+ // and store the size in "size". On error, return NULL. The
+ // returned section data is only valid until the ElfReader gets
+ // destroyed.
+ const char *GetSectionByName(const string &section_name, size_t *size);
+
+ // This is like GetSectionByName() but it returns a lot of extra information
+ // about the section. The SectionInfo structure is almost identical to
+ // the typedef struct Elf64_Shdr defined in <elf.h>, but is redefined
+ // here so that the many short macro names in <elf.h> don't have to be
+ // added to our already cluttered namespace.
+ struct SectionInfo {
+ uint32 type; // Section type (SHT_xxx constant from elf.h).
+ uint64 flags; // Section flags (SHF_xxx constants from elf.h).
+ uint64 addr; // Section virtual address at execution.
+ uint64 offset; // Section file offset.
+ uint64 size; // Section size in bytes.
+ uint32 link; // Link to another section.
+ uint32 info; // Additional section information.
+ uint64 addralign; // Section alignment.
+ uint64 entsize; // Entry size if section holds a table.
+ };
+ const char *GetSectionInfoByName(const string &section_name,
+ SectionInfo *info);
+
+ // Check if "path" is an ELF binary that has not been stripped of symbol
+ // tables. This function supports both 32-bit and 64-bit ELF binaries.
+ static bool IsNonStrippedELFBinary(const string &path);
+
+ // Check if "path" is an ELF binary that has not been stripped of debug
+ // info. Unlike IsNonStrippedELFBinary, this function will return
+ // false for binaries passed through "strip -S".
+ static bool IsNonDebugStrippedELFBinary(const string &path);
+
+ // Match a requested section name with the section name as it
+ // appears in the elf-file, adjusting for compressed debug section
+ // names. For example, returns true if name == ".debug_abbrev" and
+ // sh_name == ".zdebug_abbrev"
+ static bool SectionNamesMatch(const string &name, const string &sh_name);
+
+ private:
+ // Lazily initialize impl32_ and return it.
+ ElfReaderImpl<Elf32> *GetImpl32();
+ // Ditto for impl64_.
+ ElfReaderImpl<Elf64> *GetImpl64();
+
+ // Path of the file we're reading.
+ const string path_;
+ // Read-only file descriptor for the file. May be -1 if there was an
+ // error during open.
+ int fd_;
+ ElfReaderImpl<Elf32> *impl32_;
+ ElfReaderImpl<Elf64> *impl64_;
+};
+
+} // namespace dwarf2reader
+
+#endif // COMMON_DWARF_ELF_READER_H__
diff --git a/3rdParty/Breakpad/src/common/dwarf/functioninfo.cc b/3rdParty/Breakpad/src/common/dwarf/functioninfo.cc
new file mode 100644
index 0000000..55a255e
--- /dev/null
+++ b/3rdParty/Breakpad/src/common/dwarf/functioninfo.cc
@@ -0,0 +1,231 @@
+// Copyright (c) 2010 Google Inc. All Rights Reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// This is a client for the dwarf2reader to extract function and line
+// information from the debug info.
+
+#include <assert.h>
+#include <limits.h>
+#include <stdio.h>
+
+#include <map>
+#include <queue>
+#include <vector>
+
+#include "common/dwarf/functioninfo.h"
+#include "common/dwarf/bytereader.h"
+#include "common/scoped_ptr.h"
+#include "common/using_std_string.h"
+
+using google_breakpad::scoped_ptr;
+
+namespace dwarf2reader {
+
+CULineInfoHandler::CULineInfoHandler(std::vector<SourceFileInfo>* files,
+ std::vector<string>* dirs,
+ LineMap* linemap):linemap_(linemap),
+ files_(files),
+ dirs_(dirs) {
+ // The dirs and files are 1 indexed, so just make sure we put
+ // nothing in the 0 vector.
+ assert(dirs->size() == 0);
+ assert(files->size() == 0);
+ dirs->push_back("");
+ SourceFileInfo s;
+ s.name = "";
+ s.lowpc = ULLONG_MAX;
+ files->push_back(s);
+}
+
+void CULineInfoHandler::DefineDir(const string& name, uint32 dir_num) {
+ // These should never come out of order, actually
+ assert(dir_num == dirs_->size());
+ dirs_->push_back(name);
+}
+
+void CULineInfoHandler::DefineFile(const string& name,
+ int32 file_num, uint32 dir_num,
+ uint64 mod_time, uint64 length) {
+ assert(dir_num >= 0);
+ assert(dir_num < dirs_->size());
+
+ // These should never come out of order, actually.
+ if (file_num == (int32)files_->size() || file_num == -1) {
+ string dir = dirs_->at(dir_num);
+
+ SourceFileInfo s;
+ s.lowpc = ULLONG_MAX;
+
+ if (dir == "") {
+ s.name = name;
+ } else {
+ s.name = dir + "/" + name;
+ }
+
+ files_->push_back(s);
+ } else {
+ fprintf(stderr, "error in DefineFile");
+ }
+}
+
+void CULineInfoHandler::AddLine(uint64 address, uint64 length, uint32 file_num,
+ uint32 line_num, uint32 column_num) {
+ if (file_num < files_->size()) {
+ linemap_->insert(
+ std::make_pair(address,
+ std::make_pair(files_->at(file_num).name.c_str(),
+ line_num)));
+
+ if (address < files_->at(file_num).lowpc) {
+ files_->at(file_num).lowpc = address;
+ }
+ } else {
+ fprintf(stderr, "error in AddLine");
+ }
+}
+
+bool CUFunctionInfoHandler::StartCompilationUnit(uint64 offset,
+ uint8 address_size,
+ uint8 offset_size,
+ uint64 cu_length,
+ uint8 dwarf_version) {
+ current_compilation_unit_offset_ = offset;
+ return true;
+}
+
+
+// For function info, we only care about subprograms and inlined
+// subroutines. For line info, the DW_AT_stmt_list lives in the
+// compile unit tag.
+
+bool CUFunctionInfoHandler::StartDIE(uint64 offset, enum DwarfTag tag) {
+ switch (tag) {
+ case DW_TAG_subprogram:
+ case DW_TAG_inlined_subroutine: {
+ current_function_info_ = new FunctionInfo;
+ current_function_info_->lowpc = current_function_info_->highpc = 0;
+ current_function_info_->name = "";
+ current_function_info_->line = 0;
+ current_function_info_->file = "";
+ offset_to_funcinfo_->insert(std::make_pair(offset,
+ current_function_info_));
+ };
+ // FALLTHROUGH
+ case DW_TAG_compile_unit:
+ return true;
+ default:
+ return false;
+ }
+ return false;
+}
+
+// Only care about the name attribute for functions
+
+void CUFunctionInfoHandler::ProcessAttributeString(uint64 offset,
+ enum DwarfAttribute attr,
+ enum DwarfForm form,
+ const string &data) {
+ if (current_function_info_) {
+ if (attr == DW_AT_name)
+ current_function_info_->name = data;
+ else if (attr == DW_AT_MIPS_linkage_name)
+ current_function_info_->mangled_name = data;
+ }
+}
+
+void CUFunctionInfoHandler::ProcessAttributeUnsigned(uint64 offset,
+ enum DwarfAttribute attr,
+ enum DwarfForm form,
+ uint64 data) {
+ if (attr == DW_AT_stmt_list) {
+ SectionMap::const_iterator iter = sections_.find("__debug_line");
+ assert(iter != sections_.end());
+
+ scoped_ptr<LineInfo> lireader(new LineInfo(iter->second.first + data,
+ iter->second.second - data,
+ reader_, linehandler_));
+ lireader->Start();
+ } else if (current_function_info_) {
+ switch (attr) {
+ case DW_AT_low_pc:
+ current_function_info_->lowpc = data;
+ break;
+ case DW_AT_high_pc:
+ current_function_info_->highpc = data;
+ break;
+ case DW_AT_decl_line:
+ current_function_info_->line = data;
+ break;
+ case DW_AT_decl_file:
+ current_function_info_->file = files_->at(data).name;
+ break;
+ default:
+ break;
+ }
+ }
+}
+
+void CUFunctionInfoHandler::ProcessAttributeReference(uint64 offset,
+ enum DwarfAttribute attr,
+ enum DwarfForm form,
+ uint64 data) {
+ if (current_function_info_) {
+ switch (attr) {
+ case DW_AT_specification: {
+ // Some functions have a "specification" attribute
+ // which means they were defined elsewhere. The name
+ // attribute is not repeated, and must be taken from
+ // the specification DIE. Here we'll assume that
+ // any DIE referenced in this manner will already have
+ // been seen, but that's not really required by the spec.
+ FunctionMap::iterator iter = offset_to_funcinfo_->find(data);
+ if (iter != offset_to_funcinfo_->end()) {
+ current_function_info_->name = iter->second->name;
+ current_function_info_->mangled_name = iter->second->mangled_name;
+ } else {
+ // If you hit this, this code probably needs to be rewritten.
+ fprintf(stderr,
+ "Error: DW_AT_specification was seen before the referenced "
+ "DIE! (Looking for DIE at offset %08llx, in DIE at "
+ "offset %08llx)\n", data, offset);
+ }
+ break;
+ }
+ default:
+ break;
+ }
+ }
+}
+
+void CUFunctionInfoHandler::EndDIE(uint64 offset) {
+ if (current_function_info_ && current_function_info_->lowpc)
+ address_to_funcinfo_->insert(std::make_pair(current_function_info_->lowpc,
+ current_function_info_));
+}
+
+} // namespace dwarf2reader
diff --git a/3rdParty/Breakpad/src/common/dwarf/functioninfo.h b/3rdParty/Breakpad/src/common/dwarf/functioninfo.h
new file mode 100644
index 0000000..0b08a5f
--- /dev/null
+++ b/3rdParty/Breakpad/src/common/dwarf/functioninfo.h
@@ -0,0 +1,188 @@
+// Copyright (c) 2010 Google Inc. All Rights Reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+
+// This file contains the definitions for a DWARF2/3 information
+// collector that uses the DWARF2/3 reader interface to build a mapping
+// of addresses to files, lines, and functions.
+
+#ifndef COMMON_DWARF_FUNCTIONINFO_H__
+#define COMMON_DWARF_FUNCTIONINFO_H__
+
+#include <map>
+#include <string>
+#include <utility>
+#include <vector>
+
+#include "common/dwarf/dwarf2reader.h"
+#include "common/using_std_string.h"
+
+
+namespace dwarf2reader {
+
+struct FunctionInfo {
+ // Name of the function
+ string name;
+ // Mangled name of the function
+ string mangled_name;
+ // File containing this function
+ string file;
+ // Line number for start of function.
+ uint32 line;
+ // Beginning address for this function
+ uint64 lowpc;
+ // End address for this function.
+ uint64 highpc;
+};
+
+struct SourceFileInfo {
+ // Name of the source file name
+ string name;
+ // Low address of source file name
+ uint64 lowpc;
+};
+
+typedef std::map<uint64, FunctionInfo*> FunctionMap;
+typedef std::map<uint64, std::pair<string, uint32> > LineMap;
+
+// This class is a basic line info handler that fills in the dirs,
+// file, and linemap passed into it with the data produced from the
+// LineInfoHandler.
+class CULineInfoHandler: public LineInfoHandler {
+ public:
+
+ //
+ CULineInfoHandler(std::vector<SourceFileInfo>* files,
+ std::vector<string>* dirs,
+ LineMap* linemap);
+ virtual ~CULineInfoHandler() { }
+
+ // Called when we define a directory. We just place NAME into dirs_
+ // at position DIR_NUM.
+ virtual void DefineDir(const string& name, uint32 dir_num);
+
+ // Called when we define a filename. We just place
+ // concat(dirs_[DIR_NUM], NAME) into files_ at position FILE_NUM.
+ virtual void DefineFile(const string& name, int32 file_num,
+ uint32 dir_num, uint64 mod_time, uint64 length);
+
+
+ // Called when the line info reader has a new line, address pair
+ // ready for us. ADDRESS is the address of the code, LENGTH is the
+ // length of its machine code in bytes, FILE_NUM is the file number
+ // containing the code, LINE_NUM is the line number in that file for
+ // the code, and COLUMN_NUM is the column number the code starts at,
+ // if we know it (0 otherwise).
+ virtual void AddLine(uint64 address, uint64 length,
+ uint32 file_num, uint32 line_num, uint32 column_num);
+
+ private:
+ LineMap* linemap_;
+ std::vector<SourceFileInfo>* files_;
+ std::vector<string>* dirs_;
+};
+
+class CUFunctionInfoHandler: public Dwarf2Handler {
+ public:
+ CUFunctionInfoHandler(std::vector<SourceFileInfo>* files,
+ std::vector<string>* dirs,
+ LineMap* linemap,
+ FunctionMap* offset_to_funcinfo,
+ FunctionMap* address_to_funcinfo,
+ CULineInfoHandler* linehandler,
+ const SectionMap& sections,
+ ByteReader* reader)
+ : files_(files), dirs_(dirs), linemap_(linemap),
+ offset_to_funcinfo_(offset_to_funcinfo),
+ address_to_funcinfo_(address_to_funcinfo),
+ linehandler_(linehandler), sections_(sections),
+ reader_(reader), current_function_info_(NULL) { }
+
+ virtual ~CUFunctionInfoHandler() { }
+
+ // Start to process a compilation unit at OFFSET from the beginning of the
+ // .debug_info section. We want to see all compilation units, so we
+ // always return true.
+
+ virtual bool StartCompilationUnit(uint64 offset, uint8 address_size,
+ uint8 offset_size, uint64 cu_length,
+ uint8 dwarf_version);
+
+ // Start to process a DIE at OFFSET from the beginning of the
+ // .debug_info section. We only care about function related DIE's.
+ virtual bool StartDIE(uint64 offset, enum DwarfTag tag);
+
+ // Called when we have an attribute with unsigned data to give to
+ // our handler. The attribute is for the DIE at OFFSET from the
+ // beginning of the .debug_info section, has a name of ATTR, a form of
+ // FORM, and the actual data of the attribute is in DATA.
+ virtual void ProcessAttributeUnsigned(uint64 offset,
+ enum DwarfAttribute attr,
+ enum DwarfForm form,
+ uint64 data);
+
+ // Called when we have an attribute with a DIE reference to give to
+ // our handler. The attribute is for the DIE at OFFSET from the
+ // beginning of the .debug_info section, has a name of ATTR, a form of
+ // FORM, and the offset of the referenced DIE from the start of the
+ // .debug_info section is in DATA.
+ virtual void ProcessAttributeReference(uint64 offset,
+ enum DwarfAttribute attr,
+ enum DwarfForm form,
+ uint64 data);
+
+ // Called when we have an attribute with string data to give to
+ // our handler. The attribute is for the DIE at OFFSET from the
+ // beginning of the .debug_info section, has a name of ATTR, a form of
+ // FORM, and the actual data of the attribute is in DATA.
+ virtual void ProcessAttributeString(uint64 offset,
+ enum DwarfAttribute attr,
+ enum DwarfForm form,
+ const string& data);
+
+ // Called when finished processing the DIE at OFFSET.
+ // Because DWARF2/3 specifies a tree of DIEs, you may get starts
+ // before ends of the previous DIE, as we process children before
+ // ending the parent.
+ virtual void EndDIE(uint64 offset);
+
+ private:
+ std::vector<SourceFileInfo>* files_;
+ std::vector<string>* dirs_;
+ LineMap* linemap_;
+ FunctionMap* offset_to_funcinfo_;
+ FunctionMap* address_to_funcinfo_;
+ CULineInfoHandler* linehandler_;
+ const SectionMap& sections_;
+ ByteReader* reader_;
+ FunctionInfo* current_function_info_;
+ uint64 current_compilation_unit_offset_;
+};
+
+} // namespace dwarf2reader
+#endif // COMMON_DWARF_FUNCTIONINFO_H__
diff --git a/3rdParty/Breakpad/src/common/dwarf/types.h b/3rdParty/Breakpad/src/common/dwarf/types.h
index 61ca457..59dda31 100644
--- a/3rdParty/Breakpad/src/common/dwarf/types.h
+++ b/3rdParty/Breakpad/src/common/dwarf/types.h
@@ -45,11 +45,7 @@ typedef unsigned short uint16;
typedef unsigned int uint32;
typedef unsigned long long uint64;
-#ifdef __PTRDIFF_TYPE__
-typedef __PTRDIFF_TYPE__ intptr;
-typedef unsigned __PTRDIFF_TYPE__ uintptr;
-#else
-#error "Can't find pointer-sized integral types."
-#endif
+typedef intptr_t intptr;
+typedef uintptr_t uintptr;
#endif // _COMMON_DWARF_TYPES_H__
diff --git a/3rdParty/Breakpad/src/common/dwarf_cfi_to_module.cc b/3rdParty/Breakpad/src/common/dwarf_cfi_to_module.cc
index 15904d7..bd298a2 100644
--- a/3rdParty/Breakpad/src/common/dwarf_cfi_to_module.cc
+++ b/3rdParty/Breakpad/src/common/dwarf_cfi_to_module.cc
@@ -105,6 +105,43 @@ vector<string> DwarfCFIToModule::RegisterNames::ARM() {
return MakeVector(names, sizeof(names) / sizeof(names[0]));
}
+// Per ARM IHI 0057A, section 3.1
+vector<string> DwarfCFIToModule::RegisterNames::ARM64() {
+ static const char *const names[] = {
+ "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7",
+ "x8", "x9", "x10", "x11", "x12", "x13", "x14", "x15",
+ "x16", "x17", "x18", "x19", "x20", "x21", "x22", "x23",
+ "x24", "x25", "x26", "x27", "x28", "x29", "x30", "sp",
+ "", "", "", "", "", "", "", "",
+ "", "", "", "", "", "", "", "",
+ "", "", "", "", "", "", "", "",
+ "", "", "", "", "", "", "", "",
+ "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
+ "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
+ "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
+ "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31"
+ };
+
+ return MakeVector(names, sizeof(names) / sizeof(names[0]));
+}
+
+vector<string> DwarfCFIToModule::RegisterNames::MIPS() {
+ static const char* const kRegisterNames[] = {
+ "$zero", "$at", "$v0", "$v1", "$a0", "$a1", "$a2", "$a3",
+ "$t0", "$t1", "$t2", "$t3", "$t4", "$t5", "$t6", "$t7",
+ "$s0", "$s1", "$s2", "$s3", "$s4", "$s5", "$s6", "$s7",
+ "$t8", "$t9", "$k0", "$k1", "$gp", "$sp", "$fp", "$ra",
+ "$lo", "$hi", "$pc", "$f0", "$f2", "$f3", "$f4", "$f5",
+ "$f6", "$f7", "$f8", "$f9", "$f10", "$f11", "$f12", "$f13",
+ "$f14", "$f15", "$f16", "$f17", "$f18", "$f19", "$f20",
+ "$f21", "$f22", "$f23", "$f24", "$f25", "$f26", "$f27",
+ "$f28", "$f29", "$f30", "$f31", "$fcsr", "$fir"
+ };
+
+ return MakeVector(kRegisterNames,
+ sizeof(kRegisterNames) / sizeof(kRegisterNames[0]));
+}
+
bool DwarfCFIToModule::Entry(size_t offset, uint64 address, uint64 length,
uint8 version, const string &augmentation,
unsigned return_address) {
@@ -158,7 +195,7 @@ void DwarfCFIToModule::Record(Module::Address address, int reg,
// Place the name in our global set of strings, and then use the string
// from the set. Even though the assignment looks like a copy, all the
- // major std::string implementations use reference counting internally,
+ // major string implementations use reference counting internally,
// so the effect is to have all our data structures share copies of rules
// whenever possible. Since register names are drawn from a
// vector<string>, register names are already shared.
diff --git a/3rdParty/Breakpad/src/common/dwarf_cfi_to_module.h b/3rdParty/Breakpad/src/common/dwarf_cfi_to_module.h
index 7db552a..a5302e1 100644
--- a/3rdParty/Breakpad/src/common/dwarf_cfi_to_module.h
+++ b/3rdParty/Breakpad/src/common/dwarf_cfi_to_module.h
@@ -109,6 +109,12 @@ class DwarfCFIToModule: public CallFrameInfo::Handler {
// ARM.
static vector<string> ARM();
+ // ARM64, aka AARCH64.
+ static vector<string> ARM64();
+
+ // MIPS.
+ static vector<string> MIPS();
+
private:
// Given STRINGS, an array of C strings with SIZE elements, return an
// equivalent vector<string>.
@@ -175,15 +181,15 @@ class DwarfCFIToModule: public CallFrameInfo::Handler {
// The names of the return address and canonical frame address. Putting
// these here instead of using string literals allows us to share their
- // texts in reference-counted std::string implementations (all the
+ // texts in reference-counted string implementations (all the
// popular ones). Many, many rules cite these strings.
string cfa_name_, ra_name_;
// A set of strings used by this CFI. Before storing a string in one of
// our data structures, insert it into this set, and then use the string
// from the set.
- //
- // Because std::string uses reference counting internally, simply using
+ //
+ // Because string uses reference counting internally, simply using
// strings from this set, even if passed by value, assigned, or held
// directly in structures and containers (map<string, ...>, for example),
// causes those strings to share a single instance of each distinct piece
diff --git a/3rdParty/Breakpad/src/common/dwarf_cfi_to_module_unittest.cc b/3rdParty/Breakpad/src/common/dwarf_cfi_to_module_unittest.cc
new file mode 100644
index 0000000..807d1b2
--- /dev/null
+++ b/3rdParty/Breakpad/src/common/dwarf_cfi_to_module_unittest.cc
@@ -0,0 +1,306 @@
+// Copyright (c) 2010, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// Original author: Jim Blandy <jimb@mozilla.com> <jimb@red-bean.com>
+
+// dwarf_cfi_to_module_unittest.cc: Tests for google_breakpad::DwarfCFIToModule.
+
+#include <string>
+#include <vector>
+
+#include "breakpad_googletest_includes.h"
+#include "common/dwarf_cfi_to_module.h"
+#include "common/using_std_string.h"
+
+using std::vector;
+
+using google_breakpad::Module;
+using google_breakpad::DwarfCFIToModule;
+using testing::ContainerEq;
+using testing::Test;
+using testing::_;
+
+struct MockCFIReporter: public DwarfCFIToModule::Reporter {
+ MockCFIReporter(const string &file, const string &section)
+ : Reporter(file, section) { }
+ MOCK_METHOD2(UnnamedRegister, void(size_t offset, int reg));
+ MOCK_METHOD2(UndefinedNotSupported, void(size_t offset, const string &reg));
+ MOCK_METHOD2(ExpressionsNotSupported, void(size_t offset, const string &reg));
+};
+
+struct DwarfCFIToModuleFixture {
+ DwarfCFIToModuleFixture()
+ : module("module name", "module os", "module arch", "module id"),
+ reporter("reporter file", "reporter section"),
+ handler(&module, register_names, &reporter) {
+ register_names.push_back("reg0");
+ register_names.push_back("reg1");
+ register_names.push_back("reg2");
+ register_names.push_back("reg3");
+ register_names.push_back("reg4");
+ register_names.push_back("reg5");
+ register_names.push_back("reg6");
+ register_names.push_back("reg7");
+ register_names.push_back("sp");
+ register_names.push_back("pc");
+ register_names.push_back("");
+
+ EXPECT_CALL(reporter, UnnamedRegister(_, _)).Times(0);
+ EXPECT_CALL(reporter, UndefinedNotSupported(_, _)).Times(0);
+ EXPECT_CALL(reporter, ExpressionsNotSupported(_, _)).Times(0);
+ }
+
+ Module module;
+ vector<string> register_names;
+ MockCFIReporter reporter;
+ DwarfCFIToModule handler;
+ vector<Module::StackFrameEntry *> entries;
+};
+
+class Entry: public DwarfCFIToModuleFixture, public Test { };
+
+TEST_F(Entry, Accept) {
+ ASSERT_TRUE(handler.Entry(0x3b8961b8, 0xa21069698096fc98ULL,
+ 0xb440ce248169c8d6ULL, 3, "", 0xea93c106));
+ ASSERT_TRUE(handler.End());
+ module.GetStackFrameEntries(&entries);
+ EXPECT_EQ(1U, entries.size());
+ EXPECT_EQ(0xa21069698096fc98ULL, entries[0]->address);
+ EXPECT_EQ(0xb440ce248169c8d6ULL, entries[0]->size);
+ EXPECT_EQ(0U, entries[0]->initial_rules.size());
+ EXPECT_EQ(0U, entries[0]->rule_changes.size());
+}
+
+TEST_F(Entry, AcceptOldVersion) {
+ ASSERT_TRUE(handler.Entry(0xeb60e0fc, 0x75b8806bb09eab78ULL,
+ 0xc771f44958d40bbcULL, 1, "", 0x093c945e));
+ ASSERT_TRUE(handler.End());
+ module.GetStackFrameEntries(&entries);
+ EXPECT_EQ(1U, entries.size());
+ EXPECT_EQ(0x75b8806bb09eab78ULL, entries[0]->address);
+ EXPECT_EQ(0xc771f44958d40bbcULL, entries[0]->size);
+ EXPECT_EQ(0U, entries[0]->initial_rules.size());
+ EXPECT_EQ(0U, entries[0]->rule_changes.size());
+}
+
+struct RuleFixture: public DwarfCFIToModuleFixture {
+ RuleFixture() : DwarfCFIToModuleFixture() {
+ entry_address = 0x89327ebf86b47492ULL;
+ entry_size = 0x2f8cd573072fe02aULL;
+ return_reg = 0x7886a346;
+ }
+ void StartEntry() {
+ ASSERT_TRUE(handler.Entry(0x4445c05c, entry_address, entry_size,
+ 3, "", return_reg));
+ }
+ void CheckEntry() {
+ module.GetStackFrameEntries(&entries);
+ EXPECT_EQ(1U, entries.size());
+ EXPECT_EQ(entry_address, entries[0]->address);
+ EXPECT_EQ(entry_size, entries[0]->size);
+ }
+ uint64 entry_address, entry_size;
+ unsigned return_reg;
+};
+
+class Rule: public RuleFixture, public Test { };
+
+TEST_F(Rule, UndefinedRule) {
+ EXPECT_CALL(reporter, UndefinedNotSupported(_, "reg7"));
+ StartEntry();
+ ASSERT_TRUE(handler.UndefinedRule(entry_address, 7));
+ ASSERT_TRUE(handler.End());
+ CheckEntry();
+ EXPECT_EQ(0U, entries[0]->initial_rules.size());
+ EXPECT_EQ(0U, entries[0]->rule_changes.size());
+}
+
+TEST_F(Rule, RegisterWithEmptyName) {
+ EXPECT_CALL(reporter, UnnamedRegister(_, 10));
+ EXPECT_CALL(reporter, UndefinedNotSupported(_, "unnamed_register10"));
+ StartEntry();
+ ASSERT_TRUE(handler.UndefinedRule(entry_address, 10));
+ ASSERT_TRUE(handler.End());
+ CheckEntry();
+ EXPECT_EQ(0U, entries[0]->initial_rules.size());
+ EXPECT_EQ(0U, entries[0]->rule_changes.size());
+}
+
+TEST_F(Rule, SameValueRule) {
+ StartEntry();
+ ASSERT_TRUE(handler.SameValueRule(entry_address, 6));
+ ASSERT_TRUE(handler.End());
+ CheckEntry();
+ Module::RuleMap expected_initial;
+ expected_initial["reg6"] = "reg6";
+ EXPECT_THAT(entries[0]->initial_rules, ContainerEq(expected_initial));
+ EXPECT_EQ(0U, entries[0]->rule_changes.size());
+}
+
+TEST_F(Rule, OffsetRule) {
+ StartEntry();
+ ASSERT_TRUE(handler.OffsetRule(entry_address + 1, return_reg,
+ DwarfCFIToModule::kCFARegister,
+ 16927065));
+ ASSERT_TRUE(handler.End());
+ CheckEntry();
+ EXPECT_EQ(0U, entries[0]->initial_rules.size());
+ Module::RuleChangeMap expected_changes;
+ expected_changes[entry_address + 1][".ra"] = ".cfa 16927065 + ^";
+ EXPECT_THAT(entries[0]->rule_changes, ContainerEq(expected_changes));
+}
+
+TEST_F(Rule, OffsetRuleNegative) {
+ StartEntry();
+ ASSERT_TRUE(handler.OffsetRule(entry_address + 1,
+ DwarfCFIToModule::kCFARegister, 4, -34530721));
+ ASSERT_TRUE(handler.End());
+ CheckEntry();
+ EXPECT_EQ(0U, entries[0]->initial_rules.size());
+ Module::RuleChangeMap expected_changes;
+ expected_changes[entry_address + 1][".cfa"] = "reg4 -34530721 + ^";
+ EXPECT_THAT(entries[0]->rule_changes, ContainerEq(expected_changes));
+}
+
+TEST_F(Rule, ValOffsetRule) {
+ // Use an unnamed register number, to exercise that branch of RegisterName.
+ EXPECT_CALL(reporter, UnnamedRegister(_, 11));
+ StartEntry();
+ ASSERT_TRUE(handler.ValOffsetRule(entry_address + 0x5ab7,
+ DwarfCFIToModule::kCFARegister,
+ 11, 61812979));
+ ASSERT_TRUE(handler.End());
+ CheckEntry();
+ EXPECT_EQ(0U, entries[0]->initial_rules.size());
+ Module::RuleChangeMap expected_changes;
+ expected_changes[entry_address + 0x5ab7][".cfa"] =
+ "unnamed_register11 61812979 +";
+ EXPECT_THAT(entries[0]->rule_changes, ContainerEq(expected_changes));
+}
+
+TEST_F(Rule, RegisterRule) {
+ StartEntry();
+ ASSERT_TRUE(handler.RegisterRule(entry_address, return_reg, 3));
+ ASSERT_TRUE(handler.End());
+ CheckEntry();
+ Module::RuleMap expected_initial;
+ expected_initial[".ra"] = "reg3";
+ EXPECT_THAT(entries[0]->initial_rules, ContainerEq(expected_initial));
+ EXPECT_EQ(0U, entries[0]->rule_changes.size());
+}
+
+TEST_F(Rule, ExpressionRule) {
+ EXPECT_CALL(reporter, ExpressionsNotSupported(_, "reg2"));
+ StartEntry();
+ ASSERT_TRUE(handler.ExpressionRule(entry_address + 0xf326, 2,
+ "it takes two to tango"));
+ ASSERT_TRUE(handler.End());
+ CheckEntry();
+ EXPECT_EQ(0U, entries[0]->initial_rules.size());
+ EXPECT_EQ(0U, entries[0]->rule_changes.size());
+}
+
+TEST_F(Rule, ValExpressionRule) {
+ EXPECT_CALL(reporter, ExpressionsNotSupported(_, "reg0"));
+ StartEntry();
+ ASSERT_TRUE(handler.ValExpressionRule(entry_address + 0x6367, 0,
+ "bit off more than he could chew"));
+ ASSERT_TRUE(handler.End());
+ CheckEntry();
+ EXPECT_EQ(0U, entries[0]->initial_rules.size());
+ EXPECT_EQ(0U, entries[0]->rule_changes.size());
+}
+
+TEST_F(Rule, DefaultReturnAddressRule) {
+ return_reg = 2;
+ StartEntry();
+ ASSERT_TRUE(handler.RegisterRule(entry_address, 0, 1));
+ ASSERT_TRUE(handler.End());
+ CheckEntry();
+ Module::RuleMap expected_initial;
+ expected_initial[".ra"] = "reg2";
+ expected_initial["reg0"] = "reg1";
+ EXPECT_THAT(entries[0]->initial_rules, ContainerEq(expected_initial));
+ EXPECT_EQ(0U, entries[0]->rule_changes.size());
+}
+
+TEST_F(Rule, DefaultReturnAddressRuleOverride) {
+ return_reg = 2;
+ StartEntry();
+ ASSERT_TRUE(handler.RegisterRule(entry_address, return_reg, 1));
+ ASSERT_TRUE(handler.End());
+ CheckEntry();
+ Module::RuleMap expected_initial;
+ expected_initial[".ra"] = "reg1";
+ EXPECT_THAT(entries[0]->initial_rules, ContainerEq(expected_initial));
+ EXPECT_EQ(0U, entries[0]->rule_changes.size());
+}
+
+TEST_F(Rule, DefaultReturnAddressRuleLater) {
+ return_reg = 2;
+ StartEntry();
+ ASSERT_TRUE(handler.RegisterRule(entry_address + 1, return_reg, 1));
+ ASSERT_TRUE(handler.End());
+ CheckEntry();
+ Module::RuleMap expected_initial;
+ expected_initial[".ra"] = "reg2";
+ EXPECT_THAT(entries[0]->initial_rules, ContainerEq(expected_initial));
+ Module::RuleChangeMap expected_changes;
+ expected_changes[entry_address + 1][".ra"] = "reg1";
+ EXPECT_THAT(entries[0]->rule_changes, ContainerEq(expected_changes));
+}
+
+TEST(RegisterNames, I386) {
+ vector<string> names = DwarfCFIToModule::RegisterNames::I386();
+
+ EXPECT_EQ("$eax", names[0]);
+ EXPECT_EQ("$ecx", names[1]);
+ EXPECT_EQ("$esp", names[4]);
+ EXPECT_EQ("$eip", names[8]);
+}
+
+TEST(RegisterNames, ARM) {
+ vector<string> names = DwarfCFIToModule::RegisterNames::ARM();
+
+ EXPECT_EQ("r0", names[0]);
+ EXPECT_EQ("r10", names[10]);
+ EXPECT_EQ("sp", names[13]);
+ EXPECT_EQ("lr", names[14]);
+ EXPECT_EQ("pc", names[15]);
+}
+
+TEST(RegisterNames, X86_64) {
+ vector<string> names = DwarfCFIToModule::RegisterNames::X86_64();
+
+ EXPECT_EQ("$rax", names[0]);
+ EXPECT_EQ("$rdx", names[1]);
+ EXPECT_EQ("$rbp", names[6]);
+ EXPECT_EQ("$rsp", names[7]);
+ EXPECT_EQ("$rip", names[16]);
+}
diff --git a/3rdParty/Breakpad/src/common/dwarf_cu_to_module.cc b/3rdParty/Breakpad/src/common/dwarf_cu_to_module.cc
index ded5f83..a16bee7 100644
--- a/3rdParty/Breakpad/src/common/dwarf_cu_to_module.cc
+++ b/3rdParty/Breakpad/src/common/dwarf_cu_to_module.cc
@@ -40,23 +40,24 @@
#include <assert.h>
#include <inttypes.h>
+#include <stdint.h>
#include <stdio.h>
#include <algorithm>
-#include <set>
#include <utility>
#include "common/dwarf_line_to_module.h"
+#include "common/unordered.h"
namespace google_breakpad {
using std::map;
using std::pair;
-using std::set;
+using std::sort;
using std::vector;
// Data provided by a DWARF specification DIE.
-//
+//
// In DWARF, the DIE for a definition may contain a DW_AT_specification
// attribute giving the offset of the corresponding declaration DIE, and
// the definition DIE may omit information given in the declaration. For
@@ -73,6 +74,9 @@ using std::vector;
// A Specification holds information gathered from a declaration DIE that
// we may need if we find a DW_AT_specification link pointing to it.
struct DwarfCUToModule::Specification {
+ // The qualified name that can be found by demangling DW_AT_MIPS_linkage_name.
+ string qualified_name;
+
// The name of the enclosing scope, or the empty string if there is none.
string enclosing_name;
@@ -84,7 +88,7 @@ struct DwarfCUToModule::Specification {
// An abstract origin -- base definition of an inline function.
struct AbstractOrigin {
AbstractOrigin() : name() {}
- AbstractOrigin(const string& name) : name(name) {}
+ explicit AbstractOrigin(const string& name) : name(name) {}
string name;
};
@@ -97,13 +101,21 @@ struct DwarfCUToModule::FilePrivate {
// A set of strings used in this CU. Before storing a string in one of
// our data structures, insert it into this set, and then use the string
// from the set.
- //
- // Because std::string uses reference counting internally, simply using
- // strings from this set, even if passed by value, assigned, or held
- // directly in structures and containers (map<string, ...>, for example),
- // causes those strings to share a single instance of each distinct piece
- // of text.
- set<string> common_strings;
+ //
+ // In some STL implementations, strings are reference-counted internally,
+ // meaning that simply using strings from this set, even if passed by
+ // value, assigned, or held directly in structures and containers
+ // (map<string, ...>, for example), causes those strings to share a
+ // single instance of each distinct piece of text. GNU's libstdc++ uses
+ // reference counts, and I believe MSVC did as well, at some point.
+ // However, C++ '11 implementations are moving away from reference
+ // counting.
+ //
+ // In other implementations, string assignments copy the string's text,
+ // so this set will actually hold yet another copy of the string (although
+ // everything will still work). To improve memory consumption portably,
+ // we will probably need to use pointers to strings held in this set.
+ unordered_set<string> common_strings;
// A map from offsets of DIEs within the .debug_info section to
// Specifications describing those DIEs. Specification references can
@@ -113,14 +125,42 @@ struct DwarfCUToModule::FilePrivate {
AbstractOriginByOffset origins;
};
-DwarfCUToModule::FileContext::FileContext(const string &filename_arg,
- Module *module_arg)
- : filename(filename_arg), module(module_arg) {
- file_private = new FilePrivate();
+DwarfCUToModule::FileContext::FileContext(const string &filename,
+ Module *module,
+ bool handle_inter_cu_refs)
+ : filename_(filename),
+ module_(module),
+ handle_inter_cu_refs_(handle_inter_cu_refs),
+ file_private_(new FilePrivate()) {
}
DwarfCUToModule::FileContext::~FileContext() {
- delete file_private;
+}
+
+void DwarfCUToModule::FileContext::AddSectionToSectionMap(
+ const string& name, const uint8_t *contents, uint64 length) {
+ section_map_[name] = std::make_pair(contents, length);
+}
+
+void DwarfCUToModule::FileContext::ClearSectionMapForTest() {
+ section_map_.clear();
+}
+
+const dwarf2reader::SectionMap&
+DwarfCUToModule::FileContext::section_map() const {
+ return section_map_;
+}
+
+void DwarfCUToModule::FileContext::ClearSpecifications() {
+ if (!handle_inter_cu_refs_)
+ file_private_->specifications.clear();
+}
+
+bool DwarfCUToModule::FileContext::IsUnhandledInterCUReference(
+ uint64 offset, uint64 compilation_unit_start) const {
+ if (handle_inter_cu_refs_)
+ return false;
+ return offset < compilation_unit_start;
}
// Information global to the particular compilation unit we're
@@ -130,11 +170,13 @@ struct DwarfCUToModule::CUContext {
CUContext(FileContext *file_context_arg, WarningReporter *reporter_arg)
: file_context(file_context_arg),
reporter(reporter_arg),
- language(Language::CPlusPlus) { }
+ language(Language::CPlusPlus) {}
+
~CUContext() {
for (vector<Module::Function *>::iterator it = functions.begin();
- it != functions.end(); it++)
+ it != functions.end(); ++it) {
delete *it;
+ }
};
// The DWARF-bearing file into which this CU was incorporated.
@@ -218,6 +260,14 @@ class DwarfCUToModule::GenericDIEHandler: public dwarf2reader::DIEHandler {
DIEContext *parent_context_;
uint64 offset_;
+ // Place the name in the global set of strings. Even though this looks
+ // like a copy, all the major string implementations use reference
+ // counting internally, so the effect is to have all the data structures
+ // share copies of strings whenever possible.
+ // FIXME: Should this return something like a string_ref to avoid the
+ // assumption about how strings are implemented?
+ string AddStringToPool(const string &str);
+
// If this DIE has a DW_AT_declaration attribute, this is its value.
// It is false on DIEs with no DW_AT_declaration attribute.
bool declaration_;
@@ -230,6 +280,11 @@ class DwarfCUToModule::GenericDIEHandler: public dwarf2reader::DIEHandler {
// The value of the DW_AT_name attribute, or the empty string if the
// DIE has no such attribute.
string name_attribute_;
+
+ // The demangled value of the DW_AT_MIPS_linkage_name attribute, or the empty
+ // string if the DIE has no such attribute or its content could not be
+ // demangled.
+ string demangled_name_;
};
void DwarfCUToModule::GenericDIEHandler::ProcessAttributeUnsigned(
@@ -248,14 +303,19 @@ void DwarfCUToModule::GenericDIEHandler::ProcessAttributeReference(
uint64 data) {
switch (attr) {
case dwarf2reader::DW_AT_specification: {
+ FileContext *file_context = cu_context_->file_context;
+ if (file_context->IsUnhandledInterCUReference(
+ data, cu_context_->reporter->cu_offset())) {
+ cu_context_->reporter->UnhandledInterCUReference(offset_, data);
+ break;
+ }
// Find the Specification to which this attribute refers, and
// set specification_ appropriately. We could do more processing
// here, but it's better to leave the real work to our
// EndAttribute member function, at which point we know we have
// seen all the DIE's attributes.
- FileContext *file_context = cu_context_->file_context;
- SpecificationByOffset *specifications
- = &file_context->file_private->specifications;
+ SpecificationByOffset *specifications =
+ &file_context->file_private_->specifications;
SpecificationByOffset::iterator spec = specifications->find(data);
if (spec != specifications->end()) {
specification_ = &spec->second;
@@ -273,20 +333,37 @@ void DwarfCUToModule::GenericDIEHandler::ProcessAttributeReference(
}
}
+string DwarfCUToModule::GenericDIEHandler::AddStringToPool(const string &str) {
+ pair<unordered_set<string>::iterator, bool> result =
+ cu_context_->file_context->file_private_->common_strings.insert(str);
+ return *result.first;
+}
+
void DwarfCUToModule::GenericDIEHandler::ProcessAttributeString(
enum DwarfAttribute attr,
enum DwarfForm form,
const string &data) {
switch (attr) {
- case dwarf2reader::DW_AT_name: {
- // Place the name in our global set of strings, and then use the
- // string from the set. Even though the assignment looks like a copy,
- // all the major std::string implementations use reference counting
- // internally, so the effect is to have all our data structures share
- // copies of strings whenever possible.
- pair<set<string>::iterator, bool> result =
- cu_context_->file_context->file_private->common_strings.insert(data);
- name_attribute_ = *result.first;
+ case dwarf2reader::DW_AT_name:
+ name_attribute_ = AddStringToPool(data);
+ break;
+ case dwarf2reader::DW_AT_MIPS_linkage_name:
+ case dwarf2reader::DW_AT_linkage_name: {
+ string demangled;
+ Language::DemangleResult result =
+ cu_context_->language->DemangleName(data, &demangled);
+ switch (result) {
+ case Language::kDemangleSuccess:
+ demangled_name_ = AddStringToPool(demangled);
+ break;
+
+ case Language::kDemangleFailure:
+ cu_context_->reporter->DemangleError(data);
+ // fallthrough
+ case Language::kDontDemangle:
+ demangled_name_.clear();
+ break;
+ }
break;
}
default: break;
@@ -294,37 +371,64 @@ void DwarfCUToModule::GenericDIEHandler::ProcessAttributeString(
}
string DwarfCUToModule::GenericDIEHandler::ComputeQualifiedName() {
- // Find our unqualified name. If the DIE has its own DW_AT_name
- // attribute, then use that; otherwise, check our specification.
- const string *unqualified_name;
- if (name_attribute_.empty() && specification_)
- unqualified_name = &specification_->unqualified_name;
- else
- unqualified_name = &name_attribute_;
-
- // Find the name of our enclosing context. If we have a
- // specification, it's the specification's enclosing context that
- // counts; otherwise, use this DIE's context.
+ // Use the demangled name, if one is available. Demangled names are
+ // preferable to those inferred from the DWARF structure because they
+ // include argument types.
+ const string *qualified_name = NULL;
+ if (!demangled_name_.empty()) {
+ // Found it is this DIE.
+ qualified_name = &demangled_name_;
+ } else if (specification_ && !specification_->qualified_name.empty()) {
+ // Found it on the specification.
+ qualified_name = &specification_->qualified_name;
+ }
+
+ const string *unqualified_name = NULL;
const string *enclosing_name;
- if (specification_)
- enclosing_name = &specification_->enclosing_name;
- else
- enclosing_name = &parent_context_->name;
+ if (!qualified_name) {
+ // Find the unqualified name. If the DIE has its own DW_AT_name
+ // attribute, then use that; otherwise, check the specification.
+ if (!name_attribute_.empty())
+ unqualified_name = &name_attribute_;
+ else if (specification_)
+ unqualified_name = &specification_->unqualified_name;
+
+ // Find the name of the enclosing context. If this DIE has a
+ // specification, it's the specification's enclosing context that
+ // counts; otherwise, use this DIE's context.
+ if (specification_)
+ enclosing_name = &specification_->enclosing_name;
+ else
+ enclosing_name = &parent_context_->name;
+ }
+
+ // Prepare the return value before upcoming mutations possibly invalidate the
+ // existing pointers.
+ string return_value;
+ if (qualified_name) {
+ return_value = *qualified_name;
+ } else if (unqualified_name && enclosing_name) {
+ // Combine the enclosing name and unqualified name to produce our
+ // own fully-qualified name.
+ return_value = cu_context_->language->MakeQualifiedName(*enclosing_name,
+ *unqualified_name);
+ }
// If this DIE was marked as a declaration, record its names in the
// specification table.
- if (declaration_) {
- FileContext *file_context = cu_context_->file_context;
+ if ((declaration_ && qualified_name) ||
+ (unqualified_name && enclosing_name)) {
Specification spec;
- spec.enclosing_name = *enclosing_name;
- spec.unqualified_name = *unqualified_name;
- file_context->file_private->specifications[offset_] = spec;
+ if (qualified_name) {
+ spec.qualified_name = *qualified_name;
+ } else {
+ spec.enclosing_name = *enclosing_name;
+ spec.unqualified_name = *unqualified_name;
+ }
+ cu_context_->file_context->file_private_->specifications[offset_] = spec;
}
- // Combine the enclosing name and unqualified name to produce our
- // own fully-qualified name.
- return cu_context_->language->MakeQualifiedName(*enclosing_name,
- *unqualified_name);
+ return return_value;
}
// A handler class for DW_TAG_subprogram DIEs.
@@ -333,7 +437,8 @@ class DwarfCUToModule::FuncHandler: public GenericDIEHandler {
FuncHandler(CUContext *cu_context, DIEContext *parent_context,
uint64 offset)
: GenericDIEHandler(cu_context, parent_context, offset),
- low_pc_(0), high_pc_(0), abstract_origin_(NULL), inline_(false) { }
+ low_pc_(0), high_pc_(0), high_pc_form_(dwarf2reader::DW_FORM_addr),
+ abstract_origin_(NULL), inline_(false) { }
void ProcessAttributeUnsigned(enum DwarfAttribute attr,
enum DwarfForm form,
uint64 data);
@@ -352,6 +457,7 @@ class DwarfCUToModule::FuncHandler: public GenericDIEHandler {
// specification_, parent_context_. Computed in EndAttributes.
string name_;
uint64 low_pc_, high_pc_; // DW_AT_low_pc, DW_AT_high_pc
+ DwarfForm high_pc_form_; // DW_AT_high_pc can be length or address.
const AbstractOrigin* abstract_origin_;
bool inline_;
};
@@ -367,7 +473,11 @@ void DwarfCUToModule::FuncHandler::ProcessAttributeUnsigned(
case dwarf2reader::DW_AT_inline: inline_ = true; break;
case dwarf2reader::DW_AT_low_pc: low_pc_ = data; break;
- case dwarf2reader::DW_AT_high_pc: high_pc_ = data; break;
+ case dwarf2reader::DW_AT_high_pc:
+ high_pc_form_ = form;
+ high_pc_ = data;
+ break;
+
default:
GenericDIEHandler::ProcessAttributeUnsigned(attr, form, data);
break;
@@ -393,10 +503,10 @@ void DwarfCUToModule::FuncHandler::ProcessAttributeReference(
enum DwarfAttribute attr,
enum DwarfForm form,
uint64 data) {
- switch(attr) {
+ switch (attr) {
case dwarf2reader::DW_AT_abstract_origin: {
const AbstractOriginByOffset& origins =
- cu_context_->file_context->file_private->origins;
+ cu_context_->file_context->file_private_->origins;
AbstractOriginByOffset::const_iterator origin = origins.find(data);
if (origin != origins.end()) {
abstract_origin_ = &(origin->second);
@@ -421,33 +531,39 @@ bool DwarfCUToModule::FuncHandler::EndAttributes() {
}
void DwarfCUToModule::FuncHandler::Finish() {
+ // Make high_pc_ an address, if it isn't already.
+ if (high_pc_form_ != dwarf2reader::DW_FORM_addr) {
+ high_pc_ += low_pc_;
+ }
+
// Did we collect the information we need? Not all DWARF function
// entries have low and high addresses (for example, inlined
// functions that were never used), but all the ones we're
// interested in cover a non-empty range of bytes.
if (low_pc_ < high_pc_) {
- // Create a Module::Function based on the data we've gathered, and
- // add it to the functions_ list.
- Module::Function *func = new Module::Function;
// Malformed DWARF may omit the name, but all Module::Functions must
// have names.
+ string name;
if (!name_.empty()) {
- func->name = name_;
+ name = name_;
} else {
cu_context_->reporter->UnnamedFunction(offset_);
- func->name = "<name omitted>";
+ name = "<name omitted>";
}
- func->address = low_pc_;
+
+ // Create a Module::Function based on the data we've gathered, and
+ // add it to the functions_ list.
+ scoped_ptr<Module::Function> func(new Module::Function(name, low_pc_));
func->size = high_pc_ - low_pc_;
func->parameter_size = 0;
if (func->address) {
// If the function address is zero this is a sign that this function
// description is just empty debug data and should just be discarded.
- cu_context_->functions.push_back(func);
+ cu_context_->functions.push_back(func.release());
}
} else if (inline_) {
AbstractOrigin origin(name_);
- cu_context_->file_context->file_private->origins[offset_] = origin;
+ cu_context_->file_context->file_private_->origins[offset_] = origin;
}
}
@@ -459,8 +575,7 @@ class DwarfCUToModule::NamedScopeHandler: public GenericDIEHandler {
uint64 offset)
: GenericDIEHandler(cu_context, parent_context, offset) { }
bool EndAttributes();
- DIEHandler *FindChildHandler(uint64 offset, enum DwarfTag tag,
- const AttributeList &attrs);
+ DIEHandler *FindChildHandler(uint64 offset, enum DwarfTag tag);
private:
DIEContext child_context_; // A context for our children.
@@ -473,8 +588,7 @@ bool DwarfCUToModule::NamedScopeHandler::EndAttributes() {
dwarf2reader::DIEHandler *DwarfCUToModule::NamedScopeHandler::FindChildHandler(
uint64 offset,
- enum DwarfTag tag,
- const AttributeList &attrs) {
+ enum DwarfTag tag) {
switch (tag) {
case dwarf2reader::DW_TAG_subprogram:
return new FuncHandler(cu_context_, &child_context_, offset);
@@ -561,17 +675,31 @@ void DwarfCUToModule::WarningReporter::UnnamedFunction(uint64 offset) {
filename_.c_str(), offset);
}
+void DwarfCUToModule::WarningReporter::DemangleError(const string &input) {
+ CUHeading();
+ fprintf(stderr, "%s: warning: failed to demangle %s\n",
+ filename_.c_str(), input.c_str());
+}
+
+void DwarfCUToModule::WarningReporter::UnhandledInterCUReference(
+ uint64 offset, uint64 target) {
+ CUHeading();
+ fprintf(stderr, "%s: warning: the DIE at offset 0x%llx has a "
+ "DW_FORM_ref_addr attribute with an inter-CU reference to "
+ "0x%llx, but inter-CU reference handling is turned off.\n",
+ filename_.c_str(), offset, target);
+}
+
DwarfCUToModule::DwarfCUToModule(FileContext *file_context,
- LineToModuleFunctor *line_reader,
+ LineToModuleHandler *line_reader,
WarningReporter *reporter)
- : line_reader_(line_reader), has_source_line_info_(false) {
- cu_context_ = new CUContext(file_context, reporter);
- child_context_ = new DIEContext();
+ : line_reader_(line_reader),
+ cu_context_(new CUContext(file_context, reporter)),
+ child_context_(new DIEContext()),
+ has_source_line_info_(false) {
}
DwarfCUToModule::~DwarfCUToModule() {
- delete cu_context_;
- delete child_context_;
}
void DwarfCUToModule::ProcessAttributeSigned(enum DwarfAttribute attr,
@@ -605,8 +733,16 @@ void DwarfCUToModule::ProcessAttributeUnsigned(enum DwarfAttribute attr,
void DwarfCUToModule::ProcessAttributeString(enum DwarfAttribute attr,
enum DwarfForm form,
const string &data) {
- if (attr == dwarf2reader::DW_AT_name)
- cu_context_->reporter->SetCUName(data);
+ switch (attr) {
+ case dwarf2reader::DW_AT_name:
+ cu_context_->reporter->SetCUName(data);
+ break;
+ case dwarf2reader::DW_AT_comp_dir:
+ line_reader_->StartCompilationUnit(data);
+ break;
+ default:
+ break;
+ }
}
bool DwarfCUToModule::EndAttributes() {
@@ -615,16 +751,17 @@ bool DwarfCUToModule::EndAttributes() {
dwarf2reader::DIEHandler *DwarfCUToModule::FindChildHandler(
uint64 offset,
- enum DwarfTag tag,
- const AttributeList &attrs) {
+ enum DwarfTag tag) {
switch (tag) {
case dwarf2reader::DW_TAG_subprogram:
- return new FuncHandler(cu_context_, child_context_, offset);
+ return new FuncHandler(cu_context_.get(), child_context_.get(), offset);
case dwarf2reader::DW_TAG_namespace:
case dwarf2reader::DW_TAG_class_type:
case dwarf2reader::DW_TAG_structure_type:
case dwarf2reader::DW_TAG_union_type:
- return new NamedScopeHandler(cu_context_, child_context_, offset);
+ case dwarf2reader::DW_TAG_module:
+ return new NamedScopeHandler(cu_context_.get(), child_context_.get(),
+ offset);
default:
return NULL;
}
@@ -636,6 +773,14 @@ void DwarfCUToModule::SetLanguage(DwarfLanguage language) {
cu_context_->language = Language::Java;
break;
+ case dwarf2reader::DW_LANG_Swift:
+ cu_context_->language = Language::Swift;
+ break;
+
+ case dwarf2reader::DW_LANG_Rust:
+ cu_context_->language = Language::Rust;
+ break;
+
// DWARF has no generic language code for assembly language; this is
// what the GNU toolchain uses.
case dwarf2reader::DW_LANG_Mips_Assembler:
@@ -649,7 +794,7 @@ void DwarfCUToModule::SetLanguage(DwarfLanguage language) {
// Objective C and Objective C++ seem to create entries for
// methods whose DW_AT_name values are already fully-qualified:
// "-[Classname method:]". These appear at the top level.
- //
+ //
// DWARF data for C should never include namespaces or functions
// nested in struct types, but if it ever does, then C++'s
// notation is probably not a bad choice for that.
@@ -667,7 +812,7 @@ void DwarfCUToModule::SetLanguage(DwarfLanguage language) {
void DwarfCUToModule::ReadSourceLines(uint64 offset) {
const dwarf2reader::SectionMap &section_map
- = cu_context_->file_context->section_map;
+ = cu_context_->file_context->section_map();
dwarf2reader::SectionMap::const_iterator map_entry
= section_map.find(".debug_line");
// Mac OS X puts DWARF data in sections whose names begin with "__"
@@ -678,14 +823,14 @@ void DwarfCUToModule::ReadSourceLines(uint64 offset) {
cu_context_->reporter->MissingSection(".debug_line");
return;
}
- const char *section_start = map_entry->second.first;
+ const uint8_t *section_start = map_entry->second.first;
uint64 section_length = map_entry->second.second;
if (offset >= section_length) {
cu_context_->reporter->BadLineInfoOffset(offset);
return;
}
- (*line_reader_)(section_start + offset, section_length - offset,
- cu_context_->file_context->module, &lines_);
+ line_reader_->ReadProgram(section_start + offset, section_length - offset,
+ cu_context_->file_context->module_, &lines_);
}
namespace {
@@ -715,9 +860,9 @@ void DwarfCUToModule::AssignLinesToFunctions() {
// complexity from here on out is linear.
// Put both our functions and lines in order by address.
- sort(functions->begin(), functions->end(),
- Module::Function::CompareByAddress);
- sort(lines_.begin(), lines_.end(), Module::Line::CompareByAddress);
+ std::sort(functions->begin(), functions->end(),
+ Module::Function::CompareByAddress);
+ std::sort(lines_.begin(), lines_.end(), Module::Line::CompareByAddress);
// The last line that we used any piece of. We use this only for
// generating warnings.
@@ -852,7 +997,7 @@ void DwarfCUToModule::AssignLinesToFunctions() {
// both func and line begin after CURRENT. The next transition
// is the start of the next function or next line, whichever
// is earliest.
- assert (func || line);
+ assert(func || line);
if (func && line)
next_transition = std::min(func->address, line->address);
else if (func)
@@ -910,12 +1055,14 @@ void DwarfCUToModule::Finish() {
// Add our functions, which now have source lines assigned to them,
// to module_.
- cu_context_->file_context->module->AddFunctions(functions->begin(),
- functions->end());
+ cu_context_->file_context->module_->AddFunctions(functions->begin(),
+ functions->end());
// Ownership of the function objects has shifted from cu_context to
// the Module.
functions->clear();
+
+ cu_context_->file_context->ClearSpecifications();
}
bool DwarfCUToModule::StartCompilationUnit(uint64 offset,
@@ -926,8 +1073,7 @@ bool DwarfCUToModule::StartCompilationUnit(uint64 offset,
return dwarf_version >= 2;
}
-bool DwarfCUToModule::StartRootDIE(uint64 offset, enum DwarfTag tag,
- const AttributeList& attrs) {
+bool DwarfCUToModule::StartRootDIE(uint64 offset, enum DwarfTag tag) {
// We don't deal with partial compilation units (the only other tag
// likely to be used for root DIE).
return tag == dwarf2reader::DW_TAG_compile_unit;
diff --git a/3rdParty/Breakpad/src/common/dwarf_cu_to_module.h b/3rdParty/Breakpad/src/common/dwarf_cu_to_module.h
index ac62846..a36b82b 100644
--- a/3rdParty/Breakpad/src/common/dwarf_cu_to_module.h
+++ b/3rdParty/Breakpad/src/common/dwarf_cu_to_module.h
@@ -39,6 +39,8 @@
#ifndef COMMON_LINUX_DWARF_CU_TO_MODULE_H__
#define COMMON_LINUX_DWARF_CU_TO_MODULE_H__
+#include <stdint.h>
+
#include <string>
#include "common/language.h"
@@ -46,11 +48,11 @@
#include "common/dwarf/bytereader.h"
#include "common/dwarf/dwarf2diehandler.h"
#include "common/dwarf/dwarf2reader.h"
+#include "common/scoped_ptr.h"
#include "common/using_std_string.h"
namespace google_breakpad {
-using dwarf2reader::AttributeList;
using dwarf2reader::DwarfAttribute;
using dwarf2reader::DwarfForm;
using dwarf2reader::DwarfLanguage;
@@ -66,7 +68,6 @@ using dwarf2reader::DwarfTag;
class DwarfCUToModule: public dwarf2reader::RootDIEHandler {
struct FilePrivate;
public:
-
// Information global to the DWARF-bearing file we are processing,
// for use by DwarfCUToModule. Each DwarfCUToModule instance deals
// with a single compilation unit within the file, but information
@@ -74,40 +75,75 @@ class DwarfCUToModule: public dwarf2reader::RootDIEHandler {
// for filling it in appropriately (except for the 'file_private'
// field, which the constructor and destructor take care of), and
// then providing it to the DwarfCUToModule instance for each
- // compilation unit we process in that file.
- struct FileContext {
- FileContext(const string &filename_arg, Module *module_arg);
+ // compilation unit we process in that file. Set HANDLE_INTER_CU_REFS
+ // to true to handle debugging symbols with DW_FORM_ref_addr entries.
+ class FileContext {
+ public:
+ FileContext(const string &filename,
+ Module *module,
+ bool handle_inter_cu_refs);
~FileContext();
+ // Add CONTENTS of size LENGTH to the section map as NAME.
+ void AddSectionToSectionMap(const string& name,
+ const uint8_t *contents,
+ uint64 length);
+
+ // Clear the section map for testing.
+ void ClearSectionMapForTest();
+
+ const dwarf2reader::SectionMap& section_map() const;
+
+ private:
+ friend class DwarfCUToModule;
+
+ // Clears all the Specifications if HANDLE_INTER_CU_REFS_ is false.
+ void ClearSpecifications();
+
+ // Given an OFFSET and a CU that starts at COMPILATION_UNIT_START, returns
+ // true if this is an inter-compilation unit reference that is not being
+ // handled.
+ bool IsUnhandledInterCUReference(uint64 offset,
+ uint64 compilation_unit_start) const;
+
// The name of this file, for use in error messages.
- string filename;
+ const string filename_;
// A map of this file's sections, used for finding other DWARF
// sections that the .debug_info section may refer to.
- dwarf2reader::SectionMap section_map;
+ dwarf2reader::SectionMap section_map_;
// The Module to which we're contributing definitions.
- Module *module;
+ Module *module_;
+
+ // True if we are handling references between compilation units.
+ const bool handle_inter_cu_refs_;
// Inter-compilation unit data used internally by the handlers.
- FilePrivate *file_private;
+ scoped_ptr<FilePrivate> file_private_;
};
- // An abstract base class for functors that handle DWARF line data
+ // An abstract base class for handlers that handle DWARF line data
// for DwarfCUToModule. DwarfCUToModule could certainly just use
// dwarf2reader::LineInfo itself directly, but decoupling things
// this way makes unit testing a little easier.
- class LineToModuleFunctor {
+ class LineToModuleHandler {
public:
- LineToModuleFunctor() { }
- virtual ~LineToModuleFunctor() { }
+ LineToModuleHandler() { }
+ virtual ~LineToModuleHandler() { }
+
+ // Called at the beginning of a new compilation unit, prior to calling
+ // ReadProgram(). compilation_dir will indicate the path that the
+ // current compilation unit was compiled in, consistent with the
+ // DW_AT_comp_dir DIE.
+ virtual void StartCompilationUnit(const string& compilation_dir) = 0;
// Populate MODULE and LINES with source file names and code/line
// mappings, given a pointer to some DWARF line number data
// PROGRAM, and an overestimate of its size. Add no zero-length
// lines to LINES.
- virtual void operator()(const char *program, uint64 length,
- Module *module, vector<Module::Line> *lines) = 0;
+ virtual void ReadProgram(const uint8_t *program, uint64 length,
+ Module *module, vector<Module::Line> *lines) = 0;
};
// The interface DwarfCUToModule uses to report warnings. The member
@@ -165,9 +201,20 @@ class DwarfCUToModule: public dwarf2reader::RootDIEHandler {
// link.
virtual void UnnamedFunction(uint64 offset);
+ // __cxa_demangle() failed to demangle INPUT.
+ virtual void DemangleError(const string &input);
+
+ // The DW_FORM_ref_addr at OFFSET to TARGET was not handled because
+ // FilePrivate did not retain the inter-CU specification data.
+ virtual void UnhandledInterCUReference(uint64 offset, uint64 target);
+
+ uint64 cu_offset() const {
+ return cu_offset_;
+ }
+
protected:
- string filename_;
- uint64 cu_offset_;
+ const string filename_;
+ const uint64 cu_offset_;
string cu_name_;
bool printed_cu_header_;
bool printed_unpaired_header_;
@@ -187,7 +234,7 @@ class DwarfCUToModule: public dwarf2reader::RootDIEHandler {
// unit's line number data. Use REPORTER to report problems with the
// data we find.
DwarfCUToModule(FileContext *file_context,
- LineToModuleFunctor *line_reader,
+ LineToModuleHandler *line_reader,
WarningReporter *reporter);
~DwarfCUToModule();
@@ -201,8 +248,7 @@ class DwarfCUToModule: public dwarf2reader::RootDIEHandler {
enum DwarfForm form,
const string &data);
bool EndAttributes();
- DIEHandler *FindChildHandler(uint64 offset, enum DwarfTag tag,
- const AttributeList &attrs);
+ DIEHandler *FindChildHandler(uint64 offset, enum DwarfTag tag);
// Assign all our source Lines to the Functions that cover their
// addresses, and then add them to module_.
@@ -211,17 +257,14 @@ class DwarfCUToModule: public dwarf2reader::RootDIEHandler {
bool StartCompilationUnit(uint64 offset, uint8 address_size,
uint8 offset_size, uint64 cu_length,
uint8 dwarf_version);
- bool StartRootDIE(uint64 offset, enum DwarfTag tag,
- const AttributeList& attrs);
+ bool StartRootDIE(uint64 offset, enum DwarfTag tag);
private:
-
// Used internally by the handler. Full definitions are in
// dwarf_cu_to_module.cc.
- struct FilePrivate;
- struct Specification;
struct CUContext;
struct DIEContext;
+ struct Specification;
class GenericDIEHandler;
class FuncHandler;
class NamedScopeHandler;
@@ -231,7 +274,7 @@ class DwarfCUToModule: public dwarf2reader::RootDIEHandler {
// Set this compilation unit's source language to LANGUAGE.
void SetLanguage(DwarfLanguage language);
-
+
// Read source line information at OFFSET in the .debug_line
// section. Record source files in module_, but record source lines
// in lines_; we apportion them to functions in
@@ -250,14 +293,14 @@ class DwarfCUToModule: public dwarf2reader::RootDIEHandler {
// owned by this DwarfCUToModule: the constructor sets them, and the
// destructor deletes them.
- // The functor to use to handle line number data.
- LineToModuleFunctor *line_reader_;
+ // The handler to use to handle line number data.
+ LineToModuleHandler *line_reader_;
// This compilation unit's context.
- CUContext *cu_context_;
+ scoped_ptr<CUContext> cu_context_;
// A context for our children.
- DIEContext *child_context_;
+ scoped_ptr<DIEContext> child_context_;
// True if this compilation unit has source line information.
bool has_source_line_info_;
@@ -272,6 +315,6 @@ class DwarfCUToModule: public dwarf2reader::RootDIEHandler {
vector<Module::Line> lines_;
};
-} // namespace google_breakpad
+} // namespace google_breakpad
#endif // COMMON_LINUX_DWARF_CU_TO_MODULE_H__
diff --git a/3rdParty/Breakpad/src/common/dwarf_cu_to_module_unittest.cc b/3rdParty/Breakpad/src/common/dwarf_cu_to_module_unittest.cc
new file mode 100644
index 0000000..2ce4a60
--- /dev/null
+++ b/3rdParty/Breakpad/src/common/dwarf_cu_to_module_unittest.cc
@@ -0,0 +1,1852 @@
+// Copyright (c) 2010 Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// Original author: Jim Blandy <jimb@mozilla.com> <jimb@red-bean.com>
+
+// dwarf_cu_to_module.cc: Unit tests for google_breakpad::DwarfCUToModule.
+
+#include <stdint.h>
+
+#include <string>
+#include <utility>
+#include <vector>
+
+#include "breakpad_googletest_includes.h"
+#include "common/dwarf_cu_to_module.h"
+#include "common/using_std_string.h"
+
+using std::make_pair;
+using std::vector;
+
+using dwarf2reader::DIEHandler;
+using dwarf2reader::DwarfTag;
+using dwarf2reader::DwarfAttribute;
+using dwarf2reader::DwarfForm;
+using dwarf2reader::DwarfInline;
+using dwarf2reader::RootDIEHandler;
+using google_breakpad::DwarfCUToModule;
+using google_breakpad::Module;
+
+using ::testing::_;
+using ::testing::AtMost;
+using ::testing::Invoke;
+using ::testing::Return;
+using ::testing::Test;
+using ::testing::TestWithParam;
+using ::testing::Values;
+using ::testing::ValuesIn;
+
+// Mock classes.
+
+class MockLineToModuleHandler: public DwarfCUToModule::LineToModuleHandler {
+ public:
+ MOCK_METHOD1(StartCompilationUnit, void(const string& compilation_dir));
+ MOCK_METHOD4(ReadProgram, void(const uint8_t *program, uint64 length,
+ Module *module, vector<Module::Line> *lines));
+};
+
+class MockWarningReporter: public DwarfCUToModule::WarningReporter {
+ public:
+ MockWarningReporter(const string &filename, uint64 cu_offset)
+ : DwarfCUToModule::WarningReporter(filename, cu_offset) { }
+ MOCK_METHOD1(SetCUName, void(const string &name));
+ MOCK_METHOD2(UnknownSpecification, void(uint64 offset, uint64 target));
+ MOCK_METHOD2(UnknownAbstractOrigin, void(uint64 offset, uint64 target));
+ MOCK_METHOD1(MissingSection, void(const string &section_name));
+ MOCK_METHOD1(BadLineInfoOffset, void(uint64 offset));
+ MOCK_METHOD1(UncoveredFunction, void(const Module::Function &function));
+ MOCK_METHOD1(UncoveredLine, void(const Module::Line &line));
+ MOCK_METHOD1(UnnamedFunction, void(uint64 offset));
+ MOCK_METHOD1(DemangleError, void(const string &input));
+ MOCK_METHOD2(UnhandledInterCUReference, void(uint64 offset, uint64 target));
+};
+
+// A fixture class including all the objects needed to handle a
+// compilation unit, and their entourage. It includes member functions
+// for doing common kinds of setup and tests.
+class CUFixtureBase {
+ public:
+ // If we have:
+ //
+ // vector<Module::Line> lines;
+ // AppendLinesFunctor appender(lines);
+ //
+ // then doing:
+ //
+ // appender(line_program, length, module, line_vector);
+ //
+ // will append lines to the end of line_vector. We can use this with
+ // MockLineToModuleHandler like this:
+ //
+ // MockLineToModuleHandler l2m;
+ // EXPECT_CALL(l2m, ReadProgram(_,_,_,_))
+ // .WillOnce(DoAll(Invoke(appender), Return()));
+ //
+ // in which case calling l2m with some line vector will append lines.
+ class AppendLinesFunctor {
+ public:
+ explicit AppendLinesFunctor(
+ const vector<Module::Line> *lines) : lines_(lines) { }
+ void operator()(const uint8_t *program, uint64 length,
+ Module *module, vector<Module::Line> *lines) {
+ lines->insert(lines->end(), lines_->begin(), lines_->end());
+ }
+ private:
+ const vector<Module::Line> *lines_;
+ };
+
+ CUFixtureBase()
+ : module_("module-name", "module-os", "module-arch", "module-id"),
+ file_context_("dwarf-filename", &module_, true),
+ language_(dwarf2reader::DW_LANG_none),
+ language_signed_(false),
+ appender_(&lines_),
+ reporter_("dwarf-filename", 0xcf8f9bb6443d29b5LL),
+ root_handler_(&file_context_, &line_reader_, &reporter_),
+ functions_filled_(false) {
+ // By default, expect no warnings to be reported, and expect the
+ // compilation unit's name to be provided. The test can override
+ // these expectations.
+ EXPECT_CALL(reporter_, SetCUName("compilation-unit-name")).Times(1);
+ EXPECT_CALL(reporter_, UnknownSpecification(_, _)).Times(0);
+ EXPECT_CALL(reporter_, UnknownAbstractOrigin(_, _)).Times(0);
+ EXPECT_CALL(reporter_, MissingSection(_)).Times(0);
+ EXPECT_CALL(reporter_, BadLineInfoOffset(_)).Times(0);
+ EXPECT_CALL(reporter_, UncoveredFunction(_)).Times(0);
+ EXPECT_CALL(reporter_, UncoveredLine(_)).Times(0);
+ EXPECT_CALL(reporter_, UnnamedFunction(_)).Times(0);
+ EXPECT_CALL(reporter_, UnhandledInterCUReference(_, _)).Times(0);
+
+ // By default, expect the line program reader not to be invoked. We
+ // may override this in StartCU.
+ EXPECT_CALL(line_reader_, StartCompilationUnit(_)).Times(0);
+ EXPECT_CALL(line_reader_, ReadProgram(_,_,_,_)).Times(0);
+
+ // The handler will consult this section map to decide what to
+ // pass to our line reader.
+ file_context_.AddSectionToSectionMap(".debug_line",
+ dummy_line_program_,
+ dummy_line_size_);
+ }
+
+ // Add a line with the given address, size, filename, and line
+ // number to the end of the statement list the handler will receive
+ // when it invokes its LineToModuleHandler. Call this before calling
+ // StartCU.
+ void PushLine(Module::Address address, Module::Address size,
+ const string &filename, int line_number);
+
+ // Use LANGUAGE for the compilation unit. More precisely, arrange
+ // for StartCU to pass the compilation unit's root DIE a
+ // DW_AT_language attribute whose value is LANGUAGE.
+ void SetLanguage(dwarf2reader::DwarfLanguage language) {
+ language_ = language;
+ }
+
+ // If SIGNED true, have StartCU report DW_AT_language as a signed
+ // attribute; if false, have it report it as unsigned.
+ void SetLanguageSigned(bool is_signed) { language_signed_ = is_signed; }
+
+ // Call the handler this.root_handler_'s StartCompilationUnit and
+ // StartRootDIE member functions, passing it appropriate attributes as
+ // determined by prior calls to PushLine and SetLanguage. Leave
+ // this.root_handler_ ready to hear about children: call
+ // this.root_handler_.EndAttributes, but not this.root_handler_.Finish.
+ void StartCU();
+
+ // Have HANDLER process some strange attribute/form/value triples.
+ void ProcessStrangeAttributes(dwarf2reader::DIEHandler *handler);
+
+ // Start a child DIE of PARENT with the given tag and name. Leave
+ // the handler ready to hear about children: call EndAttributes, but
+ // not Finish.
+ DIEHandler *StartNamedDIE(DIEHandler *parent, DwarfTag tag,
+ const string &name);
+
+ // Start a child DIE of PARENT with the given tag and a
+ // DW_AT_specification attribute whose value is SPECIFICATION. Leave
+ // the handler ready to hear about children: call EndAttributes, but
+ // not Finish. If NAME is non-zero, use it as the DW_AT_name
+ // attribute.
+ DIEHandler *StartSpecifiedDIE(DIEHandler *parent, DwarfTag tag,
+ uint64 specification, const char *name = NULL);
+
+ // Define a function as a child of PARENT with the given name, address, and
+ // size. If high_pc_form is DW_FORM_addr then the DW_AT_high_pc attribute
+ // will be written as an address; otherwise it will be written as the
+ // function's size. Call EndAttributes and Finish; one cannot define
+ // children of the defined function's DIE.
+ void DefineFunction(DIEHandler *parent, const string &name,
+ Module::Address address, Module::Address size,
+ const char* mangled_name,
+ DwarfForm high_pc_form = dwarf2reader::DW_FORM_addr);
+
+ // Create a declaration DIE as a child of PARENT with the given
+ // offset, tag and name. If NAME is the empty string, don't provide
+ // a DW_AT_name attribute. Call EndAttributes and Finish.
+ void DeclarationDIE(DIEHandler *parent, uint64 offset,
+ DwarfTag tag, const string &name,
+ const string &mangled_name);
+
+ // Create a definition DIE as a child of PARENT with the given tag
+ // that refers to the declaration DIE at offset SPECIFICATION as its
+ // specification. If NAME is non-empty, pass it as the DW_AT_name
+ // attribute. If SIZE is non-zero, record ADDRESS and SIZE as
+ // low_pc/high_pc attributes.
+ void DefinitionDIE(DIEHandler *parent, DwarfTag tag,
+ uint64 specification, const string &name,
+ Module::Address address = 0, Module::Address size = 0);
+
+ // Create an inline DW_TAG_subprogram DIE as a child of PARENT. If
+ // SPECIFICATION is non-zero, then the DIE refers to the declaration DIE at
+ // offset SPECIFICATION as its specification. If Name is non-empty, pass it
+ // as the DW_AT_name attribute.
+ void AbstractInstanceDIE(DIEHandler *parent, uint64 offset,
+ DwarfInline type, uint64 specification,
+ const string &name,
+ DwarfForm form = dwarf2reader::DW_FORM_data1);
+
+ // Create a DW_TAG_subprogram DIE as a child of PARENT that refers to
+ // ORIGIN in its DW_AT_abstract_origin attribute. If NAME is the empty
+ // string, don't provide a DW_AT_name attribute.
+ void DefineInlineInstanceDIE(DIEHandler *parent, const string &name,
+ uint64 origin, Module::Address address,
+ Module::Address size);
+
+ // The following Test* functions should be called after calling
+ // this.root_handler_.Finish. After that point, no further calls
+ // should be made on the handler.
+
+ // Test that the number of functions defined in the module this.module_ is
+ // equal to EXPECTED.
+ void TestFunctionCount(size_t expected);
+
+ // Test that the I'th function (ordered by address) in the module
+ // this.module_ has the given name, address, and size, and that its
+ // parameter size is zero.
+ void TestFunction(int i, const string &name,
+ Module::Address address, Module::Address size);
+
+ // Test that the number of source lines owned by the I'th function
+ // in the module this.module_ is equal to EXPECTED.
+ void TestLineCount(int i, size_t expected);
+
+ // Test that the J'th line (ordered by address) of the I'th function
+ // (again, by address) has the given address, size, filename, and
+ // line number.
+ void TestLine(int i, int j, Module::Address address, Module::Address size,
+ const string &filename, int number);
+
+ // Actual objects under test.
+ Module module_;
+ DwarfCUToModule::FileContext file_context_;
+
+ // If this is not DW_LANG_none, we'll pass it as a DW_AT_language
+ // attribute to the compilation unit. This defaults to DW_LANG_none.
+ dwarf2reader::DwarfLanguage language_;
+
+ // If this is true, report DW_AT_language as a signed value; if false,
+ // report it as an unsigned value.
+ bool language_signed_;
+
+ // If this is not empty, we'll give the CU a DW_AT_comp_dir attribute that
+ // indicates the path that this compilation unit was compiled in.
+ string compilation_dir_;
+
+ // If this is not empty, we'll give the CU a DW_AT_stmt_list
+ // attribute that, when passed to line_reader_, adds these lines to the
+ // provided lines array.
+ vector<Module::Line> lines_;
+
+ // Mock line program reader.
+ MockLineToModuleHandler line_reader_;
+ AppendLinesFunctor appender_;
+ static const uint8_t dummy_line_program_[];
+ static const size_t dummy_line_size_;
+
+ MockWarningReporter reporter_;
+ DwarfCUToModule root_handler_;
+
+ private:
+ // Fill functions_, if we haven't already.
+ void FillFunctions();
+
+ // If functions_filled_ is true, this is a table of functions we've
+ // extracted from module_, sorted by address.
+ vector<Module::Function *> functions_;
+ // True if we have filled the above vector with this.module_'s function list.
+ bool functions_filled_;
+};
+
+const uint8_t CUFixtureBase::dummy_line_program_[] = "lots of fun data";
+const size_t CUFixtureBase::dummy_line_size_ =
+ sizeof(CUFixtureBase::dummy_line_program_);
+
+void CUFixtureBase::PushLine(Module::Address address, Module::Address size,
+ const string &filename, int line_number) {
+ Module::Line l;
+ l.address = address;
+ l.size = size;
+ l.file = module_.FindFile(filename);
+ l.number = line_number;
+ lines_.push_back(l);
+}
+
+void CUFixtureBase::StartCU() {
+ if (!compilation_dir_.empty())
+ EXPECT_CALL(line_reader_,
+ StartCompilationUnit(compilation_dir_)).Times(1);
+
+ // If we have lines, make the line reader expect to be invoked at
+ // most once. (Hey, if the handler can pass its tests without
+ // bothering to read the line number data, that's great.)
+ // Have it add the lines passed to PushLine. Otherwise, leave the
+ // initial expectation (no calls) in force.
+ if (!lines_.empty())
+ EXPECT_CALL(line_reader_,
+ ReadProgram(&dummy_line_program_[0], dummy_line_size_,
+ &module_, _))
+ .Times(AtMost(1))
+ .WillOnce(DoAll(Invoke(appender_), Return()));
+
+ ASSERT_TRUE(root_handler_
+ .StartCompilationUnit(0x51182ec307610b51ULL, 0x81, 0x44,
+ 0x4241b4f33720dd5cULL, 3));
+ {
+ ASSERT_TRUE(root_handler_.StartRootDIE(0x02e56bfbda9e7337ULL,
+ dwarf2reader::DW_TAG_compile_unit));
+ }
+ root_handler_.ProcessAttributeString(dwarf2reader::DW_AT_name,
+ dwarf2reader::DW_FORM_strp,
+ "compilation-unit-name");
+ if (!compilation_dir_.empty())
+ root_handler_.ProcessAttributeString(dwarf2reader::DW_AT_comp_dir,
+ dwarf2reader::DW_FORM_strp,
+ compilation_dir_);
+ if (!lines_.empty())
+ root_handler_.ProcessAttributeUnsigned(dwarf2reader::DW_AT_stmt_list,
+ dwarf2reader::DW_FORM_ref4,
+ 0);
+ if (language_ != dwarf2reader::DW_LANG_none) {
+ if (language_signed_)
+ root_handler_.ProcessAttributeSigned(dwarf2reader::DW_AT_language,
+ dwarf2reader::DW_FORM_sdata,
+ language_);
+ else
+ root_handler_.ProcessAttributeUnsigned(dwarf2reader::DW_AT_language,
+ dwarf2reader::DW_FORM_udata,
+ language_);
+ }
+ ASSERT_TRUE(root_handler_.EndAttributes());
+}
+
+void CUFixtureBase::ProcessStrangeAttributes(
+ dwarf2reader::DIEHandler *handler) {
+ handler->ProcessAttributeUnsigned((DwarfAttribute) 0xf560dead,
+ (DwarfForm) 0x4106e4db,
+ 0xa592571997facda1ULL);
+ handler->ProcessAttributeSigned((DwarfAttribute) 0x85380095,
+ (DwarfForm) 0x0f16fe87,
+ 0x12602a4e3bf1f446LL);
+ handler->ProcessAttributeReference((DwarfAttribute) 0xf7f7480f,
+ (DwarfForm) 0x829e038a,
+ 0x50fddef44734fdecULL);
+ static const uint8_t buffer[10] = "frobynode";
+ handler->ProcessAttributeBuffer((DwarfAttribute) 0xa55ffb51,
+ (DwarfForm) 0x2f43b041,
+ buffer, sizeof(buffer));
+ handler->ProcessAttributeString((DwarfAttribute) 0x2f43b041,
+ (DwarfForm) 0x895ffa23,
+ "strange string");
+}
+
+DIEHandler *CUFixtureBase::StartNamedDIE(DIEHandler *parent,
+ DwarfTag tag,
+ const string &name) {
+ dwarf2reader::DIEHandler *handler
+ = parent->FindChildHandler(0x8f4c783c0467c989ULL, tag);
+ if (!handler)
+ return NULL;
+ handler->ProcessAttributeString(dwarf2reader::DW_AT_name,
+ dwarf2reader::DW_FORM_strp,
+ name);
+ ProcessStrangeAttributes(handler);
+ if (!handler->EndAttributes()) {
+ handler->Finish();
+ delete handler;
+ return NULL;
+ }
+
+ return handler;
+}
+
+DIEHandler *CUFixtureBase::StartSpecifiedDIE(DIEHandler *parent,
+ DwarfTag tag,
+ uint64 specification,
+ const char *name) {
+ dwarf2reader::DIEHandler *handler
+ = parent->FindChildHandler(0x8f4c783c0467c989ULL, tag);
+ if (!handler)
+ return NULL;
+ if (name)
+ handler->ProcessAttributeString(dwarf2reader::DW_AT_name,
+ dwarf2reader::DW_FORM_strp,
+ name);
+ handler->ProcessAttributeReference(dwarf2reader::DW_AT_specification,
+ dwarf2reader::DW_FORM_ref4,
+ specification);
+ if (!handler->EndAttributes()) {
+ handler->Finish();
+ delete handler;
+ return NULL;
+ }
+
+ return handler;
+}
+
+void CUFixtureBase::DefineFunction(dwarf2reader::DIEHandler *parent,
+ const string &name, Module::Address address,
+ Module::Address size,
+ const char* mangled_name,
+ DwarfForm high_pc_form) {
+ dwarf2reader::DIEHandler *func
+ = parent->FindChildHandler(0xe34797c7e68590a8LL,
+ dwarf2reader::DW_TAG_subprogram);
+ ASSERT_TRUE(func != NULL);
+ func->ProcessAttributeString(dwarf2reader::DW_AT_name,
+ dwarf2reader::DW_FORM_strp,
+ name);
+ func->ProcessAttributeUnsigned(dwarf2reader::DW_AT_low_pc,
+ dwarf2reader::DW_FORM_addr,
+ address);
+
+ Module::Address high_pc = size;
+ if (high_pc_form == dwarf2reader::DW_FORM_addr) {
+ high_pc += address;
+ }
+ func->ProcessAttributeUnsigned(dwarf2reader::DW_AT_high_pc,
+ high_pc_form,
+ high_pc);
+
+ if (mangled_name)
+ func->ProcessAttributeString(dwarf2reader::DW_AT_MIPS_linkage_name,
+ dwarf2reader::DW_FORM_strp,
+ mangled_name);
+
+ ProcessStrangeAttributes(func);
+ EXPECT_TRUE(func->EndAttributes());
+ func->Finish();
+ delete func;
+}
+
+void CUFixtureBase::DeclarationDIE(DIEHandler *parent, uint64 offset,
+ DwarfTag tag,
+ const string &name,
+ const string &mangled_name) {
+ dwarf2reader::DIEHandler *die = parent->FindChildHandler(offset, tag);
+ ASSERT_TRUE(die != NULL);
+ if (!name.empty())
+ die->ProcessAttributeString(dwarf2reader::DW_AT_name,
+ dwarf2reader::DW_FORM_strp,
+ name);
+ if (!mangled_name.empty())
+ die->ProcessAttributeString(dwarf2reader::DW_AT_MIPS_linkage_name,
+ dwarf2reader::DW_FORM_strp,
+ mangled_name);
+
+ die->ProcessAttributeUnsigned(dwarf2reader::DW_AT_declaration,
+ dwarf2reader::DW_FORM_flag,
+ 1);
+ EXPECT_TRUE(die->EndAttributes());
+ die->Finish();
+ delete die;
+}
+
+void CUFixtureBase::DefinitionDIE(DIEHandler *parent,
+ DwarfTag tag,
+ uint64 specification,
+ const string &name,
+ Module::Address address,
+ Module::Address size) {
+ dwarf2reader::DIEHandler *die
+ = parent->FindChildHandler(0x6ccfea031a9e6cc9ULL, tag);
+ ASSERT_TRUE(die != NULL);
+ die->ProcessAttributeReference(dwarf2reader::DW_AT_specification,
+ dwarf2reader::DW_FORM_ref4,
+ specification);
+ if (!name.empty())
+ die->ProcessAttributeString(dwarf2reader::DW_AT_name,
+ dwarf2reader::DW_FORM_strp,
+ name);
+ if (size) {
+ die->ProcessAttributeUnsigned(dwarf2reader::DW_AT_low_pc,
+ dwarf2reader::DW_FORM_addr,
+ address);
+ die->ProcessAttributeUnsigned(dwarf2reader::DW_AT_high_pc,
+ dwarf2reader::DW_FORM_addr,
+ address + size);
+ }
+ EXPECT_TRUE(die->EndAttributes());
+ die->Finish();
+ delete die;
+}
+
+void CUFixtureBase::AbstractInstanceDIE(DIEHandler *parent,
+ uint64 offset,
+ DwarfInline type,
+ uint64 specification,
+ const string &name,
+ DwarfForm form) {
+ dwarf2reader::DIEHandler *die
+ = parent->FindChildHandler(offset, dwarf2reader::DW_TAG_subprogram);
+ ASSERT_TRUE(die != NULL);
+ if (specification != 0ULL)
+ die->ProcessAttributeReference(dwarf2reader::DW_AT_specification,
+ dwarf2reader::DW_FORM_ref4,
+ specification);
+ if (form == dwarf2reader::DW_FORM_sdata) {
+ die->ProcessAttributeSigned(dwarf2reader::DW_AT_inline, form, type);
+ } else {
+ die->ProcessAttributeUnsigned(dwarf2reader::DW_AT_inline, form, type);
+ }
+ if (!name.empty())
+ die->ProcessAttributeString(dwarf2reader::DW_AT_name,
+ dwarf2reader::DW_FORM_strp,
+ name);
+
+ EXPECT_TRUE(die->EndAttributes());
+ die->Finish();
+ delete die;
+}
+
+void CUFixtureBase::DefineInlineInstanceDIE(DIEHandler *parent,
+ const string &name,
+ uint64 origin,
+ Module::Address address,
+ Module::Address size) {
+ dwarf2reader::DIEHandler *func
+ = parent->FindChildHandler(0x11c70f94c6e87ccdLL,
+ dwarf2reader::DW_TAG_subprogram);
+ ASSERT_TRUE(func != NULL);
+ if (!name.empty()) {
+ func->ProcessAttributeString(dwarf2reader::DW_AT_name,
+ dwarf2reader::DW_FORM_strp,
+ name);
+ }
+ func->ProcessAttributeUnsigned(dwarf2reader::DW_AT_low_pc,
+ dwarf2reader::DW_FORM_addr,
+ address);
+ func->ProcessAttributeUnsigned(dwarf2reader::DW_AT_high_pc,
+ dwarf2reader::DW_FORM_addr,
+ address + size);
+ func->ProcessAttributeReference(dwarf2reader::DW_AT_abstract_origin,
+ dwarf2reader::DW_FORM_ref4,
+ origin);
+ ProcessStrangeAttributes(func);
+ EXPECT_TRUE(func->EndAttributes());
+ func->Finish();
+ delete func;
+}
+
+void CUFixtureBase::FillFunctions() {
+ if (functions_filled_)
+ return;
+ module_.GetFunctions(&functions_, functions_.end());
+ sort(functions_.begin(), functions_.end(),
+ Module::Function::CompareByAddress);
+ functions_filled_ = true;
+}
+
+void CUFixtureBase::TestFunctionCount(size_t expected) {
+ FillFunctions();
+ ASSERT_EQ(expected, functions_.size());
+}
+
+void CUFixtureBase::TestFunction(int i, const string &name,
+ Module::Address address,
+ Module::Address size) {
+ FillFunctions();
+ ASSERT_LT((size_t) i, functions_.size());
+
+ Module::Function *function = functions_[i];
+ EXPECT_EQ(name, function->name);
+ EXPECT_EQ(address, function->address);
+ EXPECT_EQ(size, function->size);
+ EXPECT_EQ(0U, function->parameter_size);
+}
+
+void CUFixtureBase::TestLineCount(int i, size_t expected) {
+ FillFunctions();
+ ASSERT_LT((size_t) i, functions_.size());
+
+ ASSERT_EQ(expected, functions_[i]->lines.size());
+}
+
+void CUFixtureBase::TestLine(int i, int j,
+ Module::Address address, Module::Address size,
+ const string &filename, int number) {
+ FillFunctions();
+ ASSERT_LT((size_t) i, functions_.size());
+ ASSERT_LT((size_t) j, functions_[i]->lines.size());
+
+ Module::Line *line = &functions_[i]->lines[j];
+ EXPECT_EQ(address, line->address);
+ EXPECT_EQ(size, line->size);
+ EXPECT_EQ(filename, line->file->name.c_str());
+ EXPECT_EQ(number, line->number);
+}
+
+// Include caller locations for our test subroutines.
+#define TRACE(call) do { SCOPED_TRACE("called from here"); call; } while (0)
+#define PushLine(a,b,c,d) TRACE(PushLine((a),(b),(c),(d)))
+#define SetLanguage(a) TRACE(SetLanguage(a))
+#define StartCU() TRACE(StartCU())
+#define DefineFunction(a,b,c,d,e) TRACE(DefineFunction((a),(b),(c),(d),(e)))
+// (DefineFunction) instead of DefineFunction to avoid macro expansion.
+#define DefineFunction6(a,b,c,d,e,f) \
+ TRACE((DefineFunction)((a),(b),(c),(d),(e),(f)))
+#define DeclarationDIE(a,b,c,d,e) TRACE(DeclarationDIE((a),(b),(c),(d),(e)))
+#define DefinitionDIE(a,b,c,d,e,f) \
+ TRACE(DefinitionDIE((a),(b),(c),(d),(e),(f)))
+#define TestFunctionCount(a) TRACE(TestFunctionCount(a))
+#define TestFunction(a,b,c,d) TRACE(TestFunction((a),(b),(c),(d)))
+#define TestLineCount(a,b) TRACE(TestLineCount((a),(b)))
+#define TestLine(a,b,c,d,e,f) TRACE(TestLine((a),(b),(c),(d),(e),(f)))
+
+class SimpleCU: public CUFixtureBase, public Test {
+};
+
+TEST_F(SimpleCU, CompilationDir) {
+ compilation_dir_ = "/src/build/";
+
+ StartCU();
+ root_handler_.Finish();
+}
+
+TEST_F(SimpleCU, OneFunc) {
+ PushLine(0x938cf8c07def4d34ULL, 0x55592d727f6cd01fLL, "line-file", 246571772);
+
+ StartCU();
+ DefineFunction(&root_handler_, "function1",
+ 0x938cf8c07def4d34ULL, 0x55592d727f6cd01fLL, NULL);
+ root_handler_.Finish();
+
+ TestFunctionCount(1);
+ TestFunction(0, "function1", 0x938cf8c07def4d34ULL, 0x55592d727f6cd01fLL);
+ TestLineCount(0, 1);
+ TestLine(0, 0, 0x938cf8c07def4d34ULL, 0x55592d727f6cd01fLL, "line-file",
+ 246571772);
+}
+
+// As above, only DW_AT_high_pc is a length rather than an address.
+TEST_F(SimpleCU, OneFuncHighPcIsLength) {
+ PushLine(0x938cf8c07def4d34ULL, 0x55592d727f6cd01fLL, "line-file", 246571772);
+
+ StartCU();
+ DefineFunction6(&root_handler_, "function1",
+ 0x938cf8c07def4d34ULL, 0x55592d727f6cd01fLL, NULL,
+ dwarf2reader::DW_FORM_udata);
+ root_handler_.Finish();
+
+ TestFunctionCount(1);
+ TestFunction(0, "function1", 0x938cf8c07def4d34ULL, 0x55592d727f6cd01fLL);
+ TestLineCount(0, 1);
+ TestLine(0, 0, 0x938cf8c07def4d34ULL, 0x55592d727f6cd01fLL, "line-file",
+ 246571772);
+}
+
+TEST_F(SimpleCU, MangledName) {
+ PushLine(0x938cf8c07def4d34ULL, 0x55592d727f6cd01fLL, "line-file", 246571772);
+
+ StartCU();
+ DefineFunction(&root_handler_, "function1",
+ 0x938cf8c07def4d34ULL, 0x55592d727f6cd01fLL, "_ZN1n1fEi");
+ root_handler_.Finish();
+
+ TestFunctionCount(1);
+ TestFunction(0, "n::f(int)", 0x938cf8c07def4d34ULL, 0x55592d727f6cd01fLL);
+}
+
+TEST_F(SimpleCU, IrrelevantRootChildren) {
+ StartCU();
+ EXPECT_FALSE(root_handler_
+ .FindChildHandler(0x7db32bff4e2dcfb1ULL,
+ dwarf2reader::DW_TAG_lexical_block));
+}
+
+TEST_F(SimpleCU, IrrelevantNamedScopeChildren) {
+ StartCU();
+ DIEHandler *class_A_handler
+ = StartNamedDIE(&root_handler_, dwarf2reader::DW_TAG_class_type, "class_A");
+ EXPECT_TRUE(class_A_handler != NULL);
+ EXPECT_FALSE(class_A_handler
+ ->FindChildHandler(0x02e55999b865e4e9ULL,
+ dwarf2reader::DW_TAG_lexical_block));
+ delete class_A_handler;
+}
+
+// Verify that FileContexts can safely be deleted unused.
+TEST_F(SimpleCU, UnusedFileContext) {
+ Module m("module-name", "module-os", "module-arch", "module-id");
+ DwarfCUToModule::FileContext fc("dwarf-filename", &m, true);
+
+ // Kludge: satisfy reporter_'s expectation.
+ reporter_.SetCUName("compilation-unit-name");
+}
+
+TEST_F(SimpleCU, InlineFunction) {
+ PushLine(0x1758a0f941b71efbULL, 0x1cf154f1f545e146ULL, "line-file", 75173118);
+
+ StartCU();
+ AbstractInstanceDIE(&root_handler_, 0x1e8dac5d507ed7abULL,
+ dwarf2reader::DW_INL_inlined, 0, "inline-name");
+ DefineInlineInstanceDIE(&root_handler_, "", 0x1e8dac5d507ed7abULL,
+ 0x1758a0f941b71efbULL, 0x1cf154f1f545e146ULL);
+ root_handler_.Finish();
+
+ TestFunctionCount(1);
+ TestFunction(0, "inline-name",
+ 0x1758a0f941b71efbULL, 0x1cf154f1f545e146ULL);
+}
+
+TEST_F(SimpleCU, InlineFunctionSignedAttribute) {
+ PushLine(0x1758a0f941b71efbULL, 0x1cf154f1f545e146ULL, "line-file", 75173118);
+
+ StartCU();
+ AbstractInstanceDIE(&root_handler_, 0x1e8dac5d507ed7abULL,
+ dwarf2reader::DW_INL_inlined, 0, "inline-name",
+ dwarf2reader::DW_FORM_sdata);
+ DefineInlineInstanceDIE(&root_handler_, "", 0x1e8dac5d507ed7abULL,
+ 0x1758a0f941b71efbULL, 0x1cf154f1f545e146ULL);
+ root_handler_.Finish();
+
+ TestFunctionCount(1);
+ TestFunction(0, "inline-name",
+ 0x1758a0f941b71efbULL, 0x1cf154f1f545e146ULL);
+}
+
+// Any DIE with an DW_AT_inline attribute can be cited by
+// DW_AT_abstract_origin attributes --- even if the value of the
+// DW_AT_inline attribute is DW_INL_not_inlined.
+TEST_F(SimpleCU, AbstractOriginNotInlined) {
+ PushLine(0x2805c4531be6ca0eULL, 0x686b52155a8d4d2cULL, "line-file", 6111581);
+
+ StartCU();
+ AbstractInstanceDIE(&root_handler_, 0x93e9cdad52826b39ULL,
+ dwarf2reader::DW_INL_not_inlined, 0, "abstract-instance");
+ DefineInlineInstanceDIE(&root_handler_, "", 0x93e9cdad52826b39ULL,
+ 0x2805c4531be6ca0eULL, 0x686b52155a8d4d2cULL);
+ root_handler_.Finish();
+
+ TestFunctionCount(1);
+ TestFunction(0, "abstract-instance",
+ 0x2805c4531be6ca0eULL, 0x686b52155a8d4d2cULL);
+}
+
+TEST_F(SimpleCU, UnknownAbstractOrigin) {
+ EXPECT_CALL(reporter_, UnknownAbstractOrigin(_, 1ULL)).WillOnce(Return());
+ EXPECT_CALL(reporter_, UnnamedFunction(0x11c70f94c6e87ccdLL))
+ .WillOnce(Return());
+ PushLine(0x1758a0f941b71efbULL, 0x1cf154f1f545e146ULL, "line-file", 75173118);
+
+ StartCU();
+ AbstractInstanceDIE(&root_handler_, 0x1e8dac5d507ed7abULL,
+ dwarf2reader::DW_INL_inlined, 0, "inline-name");
+ DefineInlineInstanceDIE(&root_handler_, "", 1ULL,
+ 0x1758a0f941b71efbULL, 0x1cf154f1f545e146ULL);
+ root_handler_.Finish();
+
+ TestFunctionCount(1);
+ TestFunction(0, "<name omitted>",
+ 0x1758a0f941b71efbULL, 0x1cf154f1f545e146ULL);
+}
+
+TEST_F(SimpleCU, UnnamedFunction) {
+ EXPECT_CALL(reporter_, UnnamedFunction(0xe34797c7e68590a8LL))
+ .WillOnce(Return());
+ PushLine(0x72b80e41a0ac1d40ULL, 0x537174f231ee181cULL, "line-file", 14044850);
+
+ StartCU();
+ DefineFunction(&root_handler_, "",
+ 0x72b80e41a0ac1d40ULL, 0x537174f231ee181cULL, NULL);
+ root_handler_.Finish();
+
+ TestFunctionCount(1);
+ TestFunction(0, "<name omitted>",
+ 0x72b80e41a0ac1d40ULL, 0x537174f231ee181cULL);
+}
+
+// An address range.
+struct Range {
+ Module::Address start, end;
+};
+
+// Test data for pairing functions and lines.
+struct Situation {
+ // Two function intervals, and two line intervals.
+ Range functions[2], lines[2];
+
+ // The number of lines we expect to be assigned to each of the
+ // functions, and the address ranges.
+ int paired_count[2];
+ Range paired[2][2];
+
+ // The number of functions that are not entirely covered by lines,
+ // and vice versa.
+ int uncovered_functions, uncovered_lines;
+};
+
+#define PAIRING(func1_start, func1_end, func2_start, func2_end, \
+ line1_start, line1_end, line2_start, line2_end, \
+ func1_num_lines, func2_num_lines, \
+ func1_line1_start, func1_line1_end, \
+ func1_line2_start, func1_line2_end, \
+ func2_line1_start, func2_line1_end, \
+ func2_line2_start, func2_line2_end, \
+ uncovered_functions, uncovered_lines) \
+ { { { func1_start, func1_end }, { func2_start, func2_end } }, \
+ { { line1_start, line1_end }, { line2_start, line2_end } }, \
+ { func1_num_lines, func2_num_lines }, \
+ { { { func1_line1_start, func1_line1_end }, \
+ { func1_line2_start, func1_line2_end } }, \
+ { { func2_line1_start, func2_line1_end }, \
+ { func2_line2_start, func2_line2_end } } }, \
+ uncovered_functions, uncovered_lines },
+
+Situation situations[] = {
+#include "common/testdata/func-line-pairing.h"
+};
+
+#undef PAIRING
+
+class FuncLinePairing: public CUFixtureBase,
+ public TestWithParam<Situation> { };
+
+INSTANTIATE_TEST_CASE_P(AllSituations, FuncLinePairing,
+ ValuesIn(situations));
+
+TEST_P(FuncLinePairing, Pairing) {
+ const Situation &s = GetParam();
+ PushLine(s.lines[0].start,
+ s.lines[0].end - s.lines[0].start,
+ "line-file", 67636963);
+ PushLine(s.lines[1].start,
+ s.lines[1].end - s.lines[1].start,
+ "line-file", 67636963);
+ if (s.uncovered_functions)
+ EXPECT_CALL(reporter_, UncoveredFunction(_))
+ .Times(s.uncovered_functions)
+ .WillRepeatedly(Return());
+ if (s.uncovered_lines)
+ EXPECT_CALL(reporter_, UncoveredLine(_))
+ .Times(s.uncovered_lines)
+ .WillRepeatedly(Return());
+
+ StartCU();
+ DefineFunction(&root_handler_, "function1",
+ s.functions[0].start,
+ s.functions[0].end - s.functions[0].start, NULL);
+ DefineFunction(&root_handler_, "function2",
+ s.functions[1].start,
+ s.functions[1].end - s.functions[1].start, NULL);
+ root_handler_.Finish();
+
+ TestFunctionCount(2);
+ TestFunction(0, "function1",
+ s.functions[0].start,
+ s.functions[0].end - s.functions[0].start);
+ TestLineCount(0, s.paired_count[0]);
+ for (int i = 0; i < s.paired_count[0]; i++)
+ TestLine(0, i, s.paired[0][i].start,
+ s.paired[0][i].end - s.paired[0][i].start,
+ "line-file", 67636963);
+ TestFunction(1, "function2",
+ s.functions[1].start,
+ s.functions[1].end - s.functions[1].start);
+ TestLineCount(1, s.paired_count[1]);
+ for (int i = 0; i < s.paired_count[1]; i++)
+ TestLine(1, i, s.paired[1][i].start,
+ s.paired[1][i].end - s.paired[1][i].start,
+ "line-file", 67636963);
+}
+
+TEST_F(FuncLinePairing, EmptyCU) {
+ StartCU();
+ root_handler_.Finish();
+
+ TestFunctionCount(0);
+}
+
+TEST_F(FuncLinePairing, LinesNoFuncs) {
+ PushLine(40, 2, "line-file", 82485646);
+ EXPECT_CALL(reporter_, UncoveredLine(_)).WillOnce(Return());
+
+ StartCU();
+ root_handler_.Finish();
+
+ TestFunctionCount(0);
+}
+
+TEST_F(FuncLinePairing, FuncsNoLines) {
+ EXPECT_CALL(reporter_, UncoveredFunction(_)).WillOnce(Return());
+
+ StartCU();
+ DefineFunction(&root_handler_, "function1", 0x127da12ffcf5c51fULL, 0x1000U,
+ NULL);
+ root_handler_.Finish();
+
+ TestFunctionCount(1);
+ TestFunction(0, "function1", 0x127da12ffcf5c51fULL, 0x1000U);
+}
+
+TEST_F(FuncLinePairing, GapThenFunction) {
+ PushLine(20, 2, "line-file-2", 174314698);
+ PushLine(10, 2, "line-file-1", 263008005);
+
+ StartCU();
+ DefineFunction(&root_handler_, "function1", 10, 2, NULL);
+ DefineFunction(&root_handler_, "function2", 20, 2, NULL);
+ root_handler_.Finish();
+
+ TestFunctionCount(2);
+ TestFunction(0, "function1", 10, 2);
+ TestLineCount(0, 1);
+ TestLine(0, 0, 10, 2, "line-file-1", 263008005);
+ TestFunction(1, "function2", 20, 2);
+ TestLineCount(1, 1);
+ TestLine(1, 0, 20, 2, "line-file-2", 174314698);
+}
+
+// If GCC emits padding after one function to align the start of
+// the next, then it will attribute the padding instructions to
+// the last source line of function (to reduce the size of the
+// line number info), but omit it from the DW_AT_{low,high}_pc
+// range given in .debug_info (since it costs nothing to be
+// precise there). If we did use at least some of the line
+// we're about to skip, then assume this is what happened, and
+// don't warn.
+TEST_F(FuncLinePairing, GCCAlignmentStretch) {
+ PushLine(10, 10, "line-file", 63351048);
+ PushLine(20, 10, "line-file", 61661044);
+
+ StartCU();
+ DefineFunction(&root_handler_, "function1", 10, 5, NULL);
+ // five-byte gap between functions, covered by line 63351048.
+ // This should not elicit a warning.
+ DefineFunction(&root_handler_, "function2", 20, 10, NULL);
+ root_handler_.Finish();
+
+ TestFunctionCount(2);
+ TestFunction(0, "function1", 10, 5);
+ TestLineCount(0, 1);
+ TestLine(0, 0, 10, 5, "line-file", 63351048);
+ TestFunction(1, "function2", 20, 10);
+ TestLineCount(1, 1);
+ TestLine(1, 0, 20, 10, "line-file", 61661044);
+}
+
+// Unfortunately, neither the DWARF parser's handler interface nor the
+// DIEHandler interface is capable of expressing a function that abuts
+// the end of the address space: the high_pc value looks like zero.
+
+TEST_F(FuncLinePairing, LineAtEndOfAddressSpace) {
+ PushLine(0xfffffffffffffff0ULL, 16, "line-file", 63351048);
+ EXPECT_CALL(reporter_, UncoveredLine(_)).WillOnce(Return());
+
+ StartCU();
+ DefineFunction(&root_handler_, "function1", 0xfffffffffffffff0ULL, 6, NULL);
+ DefineFunction(&root_handler_, "function2", 0xfffffffffffffffaULL, 5, NULL);
+ root_handler_.Finish();
+
+ TestFunctionCount(2);
+ TestFunction(0, "function1", 0xfffffffffffffff0ULL, 6);
+ TestLineCount(0, 1);
+ TestLine(0, 0, 0xfffffffffffffff0ULL, 6, "line-file", 63351048);
+ TestFunction(1, "function2", 0xfffffffffffffffaULL, 5);
+ TestLineCount(1, 1);
+ TestLine(1, 0, 0xfffffffffffffffaULL, 5, "line-file", 63351048);
+}
+
+// A function with more than one uncovered area should only be warned
+// about once.
+TEST_F(FuncLinePairing, WarnOnceFunc) {
+ PushLine(20, 1, "line-file-2", 262951329);
+ PushLine(11, 1, "line-file-1", 219964021);
+ EXPECT_CALL(reporter_, UncoveredFunction(_)).WillOnce(Return());
+
+ StartCU();
+ DefineFunction(&root_handler_, "function", 10, 11, NULL);
+ root_handler_.Finish();
+
+ TestFunctionCount(1);
+ TestFunction(0, "function", 10, 11);
+ TestLineCount(0, 2);
+ TestLine(0, 0, 11, 1, "line-file-1", 219964021);
+ TestLine(0, 1, 20, 1, "line-file-2", 262951329);
+}
+
+// A line with more than one uncovered area should only be warned
+// about once.
+TEST_F(FuncLinePairing, WarnOnceLine) {
+ PushLine(10, 20, "filename1", 118581871);
+ EXPECT_CALL(reporter_, UncoveredLine(_)).WillOnce(Return());
+
+ StartCU();
+ DefineFunction(&root_handler_, "function1", 11, 1, NULL);
+ DefineFunction(&root_handler_, "function2", 13, 1, NULL);
+ root_handler_.Finish();
+
+ TestFunctionCount(2);
+ TestFunction(0, "function1", 11, 1);
+ TestLineCount(0, 1);
+ TestLine(0, 0, 11, 1, "filename1", 118581871);
+ TestFunction(1, "function2", 13, 1);
+ TestLineCount(1, 1);
+ TestLine(1, 0, 13, 1, "filename1", 118581871);
+}
+
+class CXXQualifiedNames: public CUFixtureBase,
+ public TestWithParam<DwarfTag> { };
+
+INSTANTIATE_TEST_CASE_P(VersusEnclosures, CXXQualifiedNames,
+ Values(dwarf2reader::DW_TAG_class_type,
+ dwarf2reader::DW_TAG_structure_type,
+ dwarf2reader::DW_TAG_union_type,
+ dwarf2reader::DW_TAG_namespace));
+
+TEST_P(CXXQualifiedNames, TwoFunctions) {
+ DwarfTag tag = GetParam();
+
+ SetLanguage(dwarf2reader::DW_LANG_C_plus_plus);
+ PushLine(10, 1, "filename1", 69819327);
+ PushLine(20, 1, "filename2", 95115701);
+
+ StartCU();
+ DIEHandler *enclosure_handler = StartNamedDIE(&root_handler_, tag,
+ "Enclosure");
+ EXPECT_TRUE(enclosure_handler != NULL);
+ DefineFunction(enclosure_handler, "func_B", 10, 1, NULL);
+ DefineFunction(enclosure_handler, "func_C", 20, 1, NULL);
+ enclosure_handler->Finish();
+ delete enclosure_handler;
+ root_handler_.Finish();
+
+ TestFunctionCount(2);
+ TestFunction(0, "Enclosure::func_B", 10, 1);
+ TestFunction(1, "Enclosure::func_C", 20, 1);
+}
+
+TEST_P(CXXQualifiedNames, FuncInEnclosureInNamespace) {
+ DwarfTag tag = GetParam();
+
+ SetLanguage(dwarf2reader::DW_LANG_C_plus_plus);
+ PushLine(10, 1, "line-file", 69819327);
+
+ StartCU();
+ DIEHandler *namespace_handler
+ = StartNamedDIE(&root_handler_, dwarf2reader::DW_TAG_namespace,
+ "Namespace");
+ EXPECT_TRUE(namespace_handler != NULL);
+ DIEHandler *enclosure_handler = StartNamedDIE(namespace_handler, tag,
+ "Enclosure");
+ EXPECT_TRUE(enclosure_handler != NULL);
+ DefineFunction(enclosure_handler, "function", 10, 1, NULL);
+ enclosure_handler->Finish();
+ delete enclosure_handler;
+ namespace_handler->Finish();
+ delete namespace_handler;
+ root_handler_.Finish();
+
+ TestFunctionCount(1);
+ TestFunction(0, "Namespace::Enclosure::function", 10, 1);
+}
+
+TEST_F(CXXQualifiedNames, FunctionInClassInStructInNamespace) {
+ SetLanguage(dwarf2reader::DW_LANG_C_plus_plus);
+ PushLine(10, 1, "filename1", 69819327);
+
+ StartCU();
+ DIEHandler *namespace_handler
+ = StartNamedDIE(&root_handler_, dwarf2reader::DW_TAG_namespace,
+ "namespace_A");
+ EXPECT_TRUE(namespace_handler != NULL);
+ DIEHandler *struct_handler
+ = StartNamedDIE(namespace_handler, dwarf2reader::DW_TAG_structure_type,
+ "struct_B");
+ EXPECT_TRUE(struct_handler != NULL);
+ DIEHandler *class_handler
+ = StartNamedDIE(struct_handler, dwarf2reader::DW_TAG_class_type,
+ "class_C");
+ DefineFunction(class_handler, "function_D", 10, 1, NULL);
+ class_handler->Finish();
+ delete class_handler;
+ struct_handler->Finish();
+ delete struct_handler;
+ namespace_handler->Finish();
+ delete namespace_handler;
+ root_handler_.Finish();
+
+ TestFunctionCount(1);
+ TestFunction(0, "namespace_A::struct_B::class_C::function_D", 10, 1);
+}
+
+struct LanguageAndQualifiedName {
+ dwarf2reader::DwarfLanguage language;
+ const char *name;
+};
+
+const LanguageAndQualifiedName LanguageAndQualifiedNameCases[] = {
+ { dwarf2reader::DW_LANG_none, "class_A::function_B" },
+ { dwarf2reader::DW_LANG_C, "class_A::function_B" },
+ { dwarf2reader::DW_LANG_C89, "class_A::function_B" },
+ { dwarf2reader::DW_LANG_C99, "class_A::function_B" },
+ { dwarf2reader::DW_LANG_C_plus_plus, "class_A::function_B" },
+ { dwarf2reader::DW_LANG_Java, "class_A.function_B" },
+ { dwarf2reader::DW_LANG_Cobol74, "class_A::function_B" },
+ { dwarf2reader::DW_LANG_Mips_Assembler, NULL }
+};
+
+class QualifiedForLanguage
+ : public CUFixtureBase,
+ public TestWithParam<LanguageAndQualifiedName> { };
+
+INSTANTIATE_TEST_CASE_P(LanguageAndQualifiedName, QualifiedForLanguage,
+ ValuesIn(LanguageAndQualifiedNameCases));
+
+TEST_P(QualifiedForLanguage, MemberFunction) {
+ const LanguageAndQualifiedName &param = GetParam();
+
+ PushLine(10, 1, "line-file", 212966758);
+ SetLanguage(param.language);
+
+ StartCU();
+ DIEHandler *class_handler
+ = StartNamedDIE(&root_handler_, dwarf2reader::DW_TAG_class_type,
+ "class_A");
+ DefineFunction(class_handler, "function_B", 10, 1, NULL);
+ class_handler->Finish();
+ delete class_handler;
+ root_handler_.Finish();
+
+ if (param.name) {
+ TestFunctionCount(1);
+ TestFunction(0, param.name, 10, 1);
+ } else {
+ TestFunctionCount(0);
+ }
+}
+
+TEST_P(QualifiedForLanguage, MemberFunctionSignedLanguage) {
+ const LanguageAndQualifiedName &param = GetParam();
+
+ PushLine(10, 1, "line-file", 212966758);
+ SetLanguage(param.language);
+ SetLanguageSigned(true);
+
+ StartCU();
+ DIEHandler *class_handler
+ = StartNamedDIE(&root_handler_, dwarf2reader::DW_TAG_class_type,
+ "class_A");
+ DefineFunction(class_handler, "function_B", 10, 1, NULL);
+ class_handler->Finish();
+ delete class_handler;
+ root_handler_.Finish();
+
+ if (param.name) {
+ TestFunctionCount(1);
+ TestFunction(0, param.name, 10, 1);
+ } else {
+ TestFunctionCount(0);
+ }
+}
+
+class Specifications: public CUFixtureBase, public Test { };
+
+TEST_F(Specifications, Function) {
+ PushLine(0x93cd3dfc1aa10097ULL, 0x0397d47a0b4ca0d4ULL, "line-file", 54883661);
+
+ StartCU();
+ DeclarationDIE(&root_handler_, 0xcd3c51b946fb1eeeLL,
+ dwarf2reader::DW_TAG_subprogram, "declaration-name", "");
+ DefinitionDIE(&root_handler_, dwarf2reader::DW_TAG_subprogram,
+ 0xcd3c51b946fb1eeeLL, "",
+ 0x93cd3dfc1aa10097ULL, 0x0397d47a0b4ca0d4ULL);
+ root_handler_.Finish();
+
+ TestFunctionCount(1);
+ TestFunction(0, "declaration-name",
+ 0x93cd3dfc1aa10097ULL, 0x0397d47a0b4ca0d4ULL);
+}
+
+TEST_F(Specifications, MangledName) {
+ // Language defaults to C++, so no need to set it here.
+ PushLine(0x93cd3dfc1aa10097ULL, 0x0397d47a0b4ca0d4ULL, "line-file", 54883661);
+
+ StartCU();
+ DeclarationDIE(&root_handler_, 0xcd3c51b946fb1eeeLL,
+ dwarf2reader::DW_TAG_subprogram, "declaration-name",
+ "_ZN1C1fEi");
+ DefinitionDIE(&root_handler_, dwarf2reader::DW_TAG_subprogram,
+ 0xcd3c51b946fb1eeeLL, "",
+ 0x93cd3dfc1aa10097ULL, 0x0397d47a0b4ca0d4ULL);
+ root_handler_.Finish();
+
+ TestFunctionCount(1);
+ TestFunction(0, "C::f(int)",
+ 0x93cd3dfc1aa10097ULL, 0x0397d47a0b4ca0d4ULL);
+}
+
+TEST_F(Specifications, MangledNameSwift) {
+ // Swift mangled names should pass through untouched.
+ SetLanguage(dwarf2reader::DW_LANG_Swift);
+ PushLine(0x93cd3dfc1aa10097ULL, 0x0397d47a0b4ca0d4ULL, "line-file", 54883661);
+ StartCU();
+ const string kName = "_TFC9swifttest5Shape17simpleDescriptionfS0_FT_Si";
+ DeclarationDIE(&root_handler_, 0xcd3c51b946fb1eeeLL,
+ dwarf2reader::DW_TAG_subprogram, "declaration-name",
+ kName);
+ DefinitionDIE(&root_handler_, dwarf2reader::DW_TAG_subprogram,
+ 0xcd3c51b946fb1eeeLL, "",
+ 0x93cd3dfc1aa10097ULL, 0x0397d47a0b4ca0d4ULL);
+ root_handler_.Finish();
+
+ TestFunctionCount(1);
+ TestFunction(0, kName,
+ 0x93cd3dfc1aa10097ULL, 0x0397d47a0b4ca0d4ULL);
+}
+
+TEST_F(Specifications, MangledNameRust) {
+ SetLanguage(dwarf2reader::DW_LANG_Rust);
+ PushLine(0x93cd3dfc1aa10097ULL, 0x0397d47a0b4ca0d4ULL, "line-file", 54883661);
+
+ StartCU();
+ const string kName = "_ZN14rustc_demangle8demangle17h373defa94bffacdeE";
+ DeclarationDIE(&root_handler_, 0xcd3c51b946fb1eeeLL,
+ dwarf2reader::DW_TAG_subprogram, "declaration-name",
+ kName);
+ DefinitionDIE(&root_handler_, dwarf2reader::DW_TAG_subprogram,
+ 0xcd3c51b946fb1eeeLL, "",
+ 0x93cd3dfc1aa10097ULL, 0x0397d47a0b4ca0d4ULL);
+ root_handler_.Finish();
+
+ TestFunctionCount(1);
+ TestFunction(0,
+#ifndef HAVE_RUST_DEMANGLE
+ // Rust mangled names should pass through untouched if not
+ // using rust-demangle.
+ kName,
+#else
+ // If rust-demangle is available this should be properly
+ // demangled.
+ "rustc_demangle::demangle",
+#endif
+ 0x93cd3dfc1aa10097ULL, 0x0397d47a0b4ca0d4ULL);
+}
+
+TEST_F(Specifications, MemberFunction) {
+ PushLine(0x3341a248634e7170ULL, 0x5f6938ee5553b953ULL, "line-file", 18116691);
+
+ StartCU();
+ DIEHandler *class_handler
+ = StartNamedDIE(&root_handler_, dwarf2reader::DW_TAG_class_type, "class_A");
+ DeclarationDIE(class_handler, 0x7d83028c431406e8ULL,
+ dwarf2reader::DW_TAG_subprogram, "declaration-name", "");
+ class_handler->Finish();
+ delete class_handler;
+ DefinitionDIE(&root_handler_, dwarf2reader::DW_TAG_subprogram,
+ 0x7d83028c431406e8ULL, "",
+ 0x3341a248634e7170ULL, 0x5f6938ee5553b953ULL);
+ root_handler_.Finish();
+
+ TestFunctionCount(1);
+ TestFunction(0, "class_A::declaration-name",
+ 0x3341a248634e7170ULL, 0x5f6938ee5553b953ULL);
+}
+
+// This case should gather the name from both the definition and the
+// declaration's parent.
+TEST_F(Specifications, FunctionDeclarationParent) {
+ PushLine(0x463c9ddf405be227ULL, 0x6a47774af5049680ULL, "line-file", 70254922);
+
+ StartCU();
+ {
+ DIEHandler *class_handler
+ = StartNamedDIE(&root_handler_, dwarf2reader::DW_TAG_class_type,
+ "class_A");
+ ASSERT_TRUE(class_handler != NULL);
+ DeclarationDIE(class_handler, 0x0e0e877c8404544aULL,
+ dwarf2reader::DW_TAG_subprogram, "declaration-name", "");
+ class_handler->Finish();
+ delete class_handler;
+ }
+
+ DefinitionDIE(&root_handler_, dwarf2reader::DW_TAG_subprogram,
+ 0x0e0e877c8404544aULL, "definition-name",
+ 0x463c9ddf405be227ULL, 0x6a47774af5049680ULL);
+
+ root_handler_.Finish();
+
+ TestFunctionCount(1);
+ TestFunction(0, "class_A::definition-name",
+ 0x463c9ddf405be227ULL, 0x6a47774af5049680ULL);
+}
+
+// Named scopes should also gather enclosing name components from
+// their declarations.
+TEST_F(Specifications, NamedScopeDeclarationParent) {
+ PushLine(0x5d13433d0df13d00ULL, 0x48ebebe5ade2cab4ULL, "line-file", 77392604);
+
+ StartCU();
+ {
+ DIEHandler *space_handler
+ = StartNamedDIE(&root_handler_, dwarf2reader::DW_TAG_namespace,
+ "space_A");
+ ASSERT_TRUE(space_handler != NULL);
+ DeclarationDIE(space_handler, 0x419bb1d12f9a73a2ULL,
+ dwarf2reader::DW_TAG_class_type, "class-declaration-name",
+ "");
+ space_handler->Finish();
+ delete space_handler;
+ }
+
+ {
+ DIEHandler *class_handler
+ = StartSpecifiedDIE(&root_handler_, dwarf2reader::DW_TAG_class_type,
+ 0x419bb1d12f9a73a2ULL, "class-definition-name");
+ ASSERT_TRUE(class_handler != NULL);
+ DefineFunction(class_handler, "function",
+ 0x5d13433d0df13d00ULL, 0x48ebebe5ade2cab4ULL, NULL);
+ class_handler->Finish();
+ delete class_handler;
+ }
+
+ root_handler_.Finish();
+
+ TestFunctionCount(1);
+ TestFunction(0, "space_A::class-definition-name::function",
+ 0x5d13433d0df13d00ULL, 0x48ebebe5ade2cab4ULL);
+}
+
+// This test recreates bug 364.
+TEST_F(Specifications, InlineFunction) {
+ PushLine(0x1758a0f941b71efbULL, 0x1cf154f1f545e146ULL, "line-file", 75173118);
+
+ StartCU();
+ DeclarationDIE(&root_handler_, 0xcd3c51b946fb1eeeLL,
+ dwarf2reader::DW_TAG_subprogram, "inline-name", "");
+ AbstractInstanceDIE(&root_handler_, 0x1e8dac5d507ed7abULL,
+ dwarf2reader::DW_INL_inlined, 0xcd3c51b946fb1eeeLL, "");
+ DefineInlineInstanceDIE(&root_handler_, "", 0x1e8dac5d507ed7abULL,
+ 0x1758a0f941b71efbULL, 0x1cf154f1f545e146ULL);
+ root_handler_.Finish();
+
+ TestFunctionCount(1);
+ TestFunction(0, "inline-name",
+ 0x1758a0f941b71efbULL, 0x1cf154f1f545e146ULL);
+}
+
+// An inline function in a namespace should correctly derive its
+// name from its abstract origin, and not just the namespace name.
+TEST_F(Specifications, InlineFunctionInNamespace) {
+ PushLine(0x1758a0f941b71efbULL, 0x1cf154f1f545e146ULL, "line-file", 75173118);
+
+ StartCU();
+ DIEHandler* space_handler
+ = StartNamedDIE(&root_handler_, dwarf2reader::DW_TAG_namespace,
+ "Namespace");
+ ASSERT_TRUE(space_handler != NULL);
+ AbstractInstanceDIE(space_handler, 0x1e8dac5d507ed7abULL,
+ dwarf2reader::DW_INL_inlined, 0LL, "func-name");
+ DefineInlineInstanceDIE(space_handler, "", 0x1e8dac5d507ed7abULL,
+ 0x1758a0f941b71efbULL, 0x1cf154f1f545e146ULL);
+ space_handler->Finish();
+ delete space_handler;
+ root_handler_.Finish();
+
+ TestFunctionCount(1);
+ TestFunction(0, "Namespace::func-name",
+ 0x1758a0f941b71efbULL, 0x1cf154f1f545e146ULL);
+}
+
+// Check name construction for a long chain containing each combination of:
+// - struct, union, class, namespace
+// - direct and definition
+TEST_F(Specifications, LongChain) {
+ PushLine(0x5a0dd6bb85db754cULL, 0x3bccb213d08c7fd3ULL, "line-file", 21192926);
+ SetLanguage(dwarf2reader::DW_LANG_C_plus_plus);
+
+ StartCU();
+ // The structure we're building here is:
+ // space_A full definition
+ // space_B declaration
+ // space_B definition
+ // struct_C full definition
+ // struct_D declaration
+ // struct_D definition
+ // union_E full definition
+ // union_F declaration
+ // union_F definition
+ // class_G full definition
+ // class_H declaration
+ // class_H definition
+ // func_I declaration
+ // func_I definition
+ //
+ // So:
+ // - space_A, struct_C, union_E, and class_G don't use specifications;
+ // - space_B, struct_D, union_F, and class_H do.
+ // - func_I uses a specification.
+ //
+ // The full name for func_I is thus:
+ //
+ // space_A::space_B::struct_C::struct_D::union_E::union_F::
+ // class_G::class_H::func_I
+ {
+ DIEHandler *space_A_handler
+ = StartNamedDIE(&root_handler_, dwarf2reader::DW_TAG_namespace,
+ "space_A");
+ DeclarationDIE(space_A_handler, 0x2e111126496596e2ULL,
+ dwarf2reader::DW_TAG_namespace, "space_B", "");
+ space_A_handler->Finish();
+ delete space_A_handler;
+ }
+
+ {
+ DIEHandler *space_B_handler
+ = StartSpecifiedDIE(&root_handler_, dwarf2reader::DW_TAG_namespace,
+ 0x2e111126496596e2ULL);
+ DIEHandler *struct_C_handler
+ = StartNamedDIE(space_B_handler, dwarf2reader::DW_TAG_structure_type,
+ "struct_C");
+ DeclarationDIE(struct_C_handler, 0x20cd423bf2a25a4cULL,
+ dwarf2reader::DW_TAG_structure_type, "struct_D", "");
+ struct_C_handler->Finish();
+ delete struct_C_handler;
+ space_B_handler->Finish();
+ delete space_B_handler;
+ }
+
+ {
+ DIEHandler *struct_D_handler
+ = StartSpecifiedDIE(&root_handler_, dwarf2reader::DW_TAG_structure_type,
+ 0x20cd423bf2a25a4cULL);
+ DIEHandler *union_E_handler
+ = StartNamedDIE(struct_D_handler, dwarf2reader::DW_TAG_union_type,
+ "union_E");
+ DeclarationDIE(union_E_handler, 0xe25c84805aa58c32ULL,
+ dwarf2reader::DW_TAG_union_type, "union_F", "");
+ union_E_handler->Finish();
+ delete union_E_handler;
+ struct_D_handler->Finish();
+ delete struct_D_handler;
+ }
+
+ {
+ DIEHandler *union_F_handler
+ = StartSpecifiedDIE(&root_handler_, dwarf2reader::DW_TAG_union_type,
+ 0xe25c84805aa58c32ULL);
+ DIEHandler *class_G_handler
+ = StartNamedDIE(union_F_handler, dwarf2reader::DW_TAG_class_type,
+ "class_G");
+ DeclarationDIE(class_G_handler, 0xb70d960dcc173b6eULL,
+ dwarf2reader::DW_TAG_class_type, "class_H", "");
+ class_G_handler->Finish();
+ delete class_G_handler;
+ union_F_handler->Finish();
+ delete union_F_handler;
+ }
+
+ {
+ DIEHandler *class_H_handler
+ = StartSpecifiedDIE(&root_handler_, dwarf2reader::DW_TAG_class_type,
+ 0xb70d960dcc173b6eULL);
+ DeclarationDIE(class_H_handler, 0x27ff829e3bf69f37ULL,
+ dwarf2reader::DW_TAG_subprogram, "func_I", "");
+ class_H_handler->Finish();
+ delete class_H_handler;
+ }
+
+ DefinitionDIE(&root_handler_, dwarf2reader::DW_TAG_subprogram,
+ 0x27ff829e3bf69f37ULL, "",
+ 0x5a0dd6bb85db754cULL, 0x3bccb213d08c7fd3ULL);
+ root_handler_.Finish();
+
+ TestFunctionCount(1);
+ TestFunction(0, "space_A::space_B::struct_C::struct_D::union_E::union_F"
+ "::class_G::class_H::func_I",
+ 0x5a0dd6bb85db754cULL, 0x3bccb213d08c7fd3ULL);
+}
+
+TEST_F(Specifications, InterCU) {
+ Module m("module-name", "module-os", "module-arch", "module-id");
+ DwarfCUToModule::FileContext fc("dwarf-filename", &m, true);
+ EXPECT_CALL(reporter_, UncoveredFunction(_)).WillOnce(Return());
+ MockLineToModuleHandler lr;
+ EXPECT_CALL(lr, ReadProgram(_,_,_,_)).Times(0);
+
+ // Kludge: satisfy reporter_'s expectation.
+ reporter_.SetCUName("compilation-unit-name");
+
+ // First CU. Declares class_A.
+ {
+ DwarfCUToModule root1_handler(&fc, &lr, &reporter_);
+ ASSERT_TRUE(root1_handler.StartCompilationUnit(0, 1, 2, 3, 3));
+ ASSERT_TRUE(root1_handler.StartRootDIE(1,
+ dwarf2reader::DW_TAG_compile_unit));
+ ProcessStrangeAttributes(&root1_handler);
+ ASSERT_TRUE(root1_handler.EndAttributes());
+ DeclarationDIE(&root1_handler, 0xb8fbfdd5f0b26fceULL,
+ dwarf2reader::DW_TAG_class_type, "class_A", "");
+ root1_handler.Finish();
+ }
+
+ // Second CU. Defines class_A, declares member_func_B.
+ {
+ DwarfCUToModule root2_handler(&fc, &lr, &reporter_);
+ ASSERT_TRUE(root2_handler.StartCompilationUnit(0, 1, 2, 3, 3));
+ ASSERT_TRUE(root2_handler.StartRootDIE(1,
+ dwarf2reader::DW_TAG_compile_unit));
+ ASSERT_TRUE(root2_handler.EndAttributes());
+ DIEHandler *class_A_handler
+ = StartSpecifiedDIE(&root2_handler, dwarf2reader::DW_TAG_class_type,
+ 0xb8fbfdd5f0b26fceULL);
+ DeclarationDIE(class_A_handler, 0xb01fef8b380bd1a2ULL,
+ dwarf2reader::DW_TAG_subprogram, "member_func_B", "");
+ class_A_handler->Finish();
+ delete class_A_handler;
+ root2_handler.Finish();
+ }
+
+ // Third CU. Defines member_func_B.
+ {
+ DwarfCUToModule root3_handler(&fc, &lr, &reporter_);
+ ASSERT_TRUE(root3_handler.StartCompilationUnit(0, 1, 2, 3, 3));
+ ASSERT_TRUE(root3_handler.StartRootDIE(1,
+ dwarf2reader::DW_TAG_compile_unit));
+ ASSERT_TRUE(root3_handler.EndAttributes());
+ DefinitionDIE(&root3_handler, dwarf2reader::DW_TAG_subprogram,
+ 0xb01fef8b380bd1a2ULL, "",
+ 0x2618f00a1a711e53ULL, 0x4fd94b76d7c2caf5ULL);
+ root3_handler.Finish();
+ }
+
+ vector<Module::Function *> functions;
+ m.GetFunctions(&functions, functions.end());
+ EXPECT_EQ(1U, functions.size());
+ EXPECT_STREQ("class_A::member_func_B", functions[0]->name.c_str());
+}
+
+TEST_F(Specifications, UnhandledInterCU) {
+ Module m("module-name", "module-os", "module-arch", "module-id");
+ DwarfCUToModule::FileContext fc("dwarf-filename", &m, false);
+ EXPECT_CALL(reporter_, UncoveredFunction(_)).WillOnce(Return());
+ MockLineToModuleHandler lr;
+ EXPECT_CALL(lr, ReadProgram(_,_,_,_)).Times(0);
+
+ // Kludge: satisfy reporter_'s expectation.
+ reporter_.SetCUName("compilation-unit-name");
+
+ // First CU. Declares class_A.
+ {
+ DwarfCUToModule root1_handler(&fc, &lr, &reporter_);
+ ASSERT_TRUE(root1_handler.StartCompilationUnit(0, 1, 2, 3, 3));
+ ASSERT_TRUE(root1_handler.StartRootDIE(1,
+ dwarf2reader::DW_TAG_compile_unit));
+ ProcessStrangeAttributes(&root1_handler);
+ ASSERT_TRUE(root1_handler.EndAttributes());
+ DeclarationDIE(&root1_handler, 0xb8fbfdd5f0b26fceULL,
+ dwarf2reader::DW_TAG_class_type, "class_A", "");
+ root1_handler.Finish();
+ }
+
+ // Second CU. Defines class_A, declares member_func_B.
+ {
+ DwarfCUToModule root2_handler(&fc, &lr, &reporter_);
+ ASSERT_TRUE(root2_handler.StartCompilationUnit(0, 1, 2, 3, 3));
+ ASSERT_TRUE(root2_handler.StartRootDIE(1,
+ dwarf2reader::DW_TAG_compile_unit));
+ ASSERT_TRUE(root2_handler.EndAttributes());
+ EXPECT_CALL(reporter_, UnhandledInterCUReference(_, _)).Times(1);
+ DIEHandler *class_A_handler
+ = StartSpecifiedDIE(&root2_handler, dwarf2reader::DW_TAG_class_type,
+ 0xb8fbfdd5f0b26fceULL);
+ DeclarationDIE(class_A_handler, 0xb01fef8b380bd1a2ULL,
+ dwarf2reader::DW_TAG_subprogram, "member_func_B", "");
+ class_A_handler->Finish();
+ delete class_A_handler;
+ root2_handler.Finish();
+ }
+
+ // Third CU. Defines member_func_B.
+ {
+ DwarfCUToModule root3_handler(&fc, &lr, &reporter_);
+ ASSERT_TRUE(root3_handler.StartCompilationUnit(0, 1, 2, 3, 3));
+ ASSERT_TRUE(root3_handler.StartRootDIE(1,
+ dwarf2reader::DW_TAG_compile_unit));
+ ASSERT_TRUE(root3_handler.EndAttributes());
+ EXPECT_CALL(reporter_, UnhandledInterCUReference(_, _)).Times(1);
+ EXPECT_CALL(reporter_, UnnamedFunction(_)).Times(1);
+ DefinitionDIE(&root3_handler, dwarf2reader::DW_TAG_subprogram,
+ 0xb01fef8b380bd1a2ULL, "",
+ 0x2618f00a1a711e53ULL, 0x4fd94b76d7c2caf5ULL);
+ root3_handler.Finish();
+ }
+}
+
+TEST_F(Specifications, BadOffset) {
+ PushLine(0xa0277efd7ce83771ULL, 0x149554a184c730c1ULL, "line-file", 56636272);
+ EXPECT_CALL(reporter_, UnknownSpecification(_, 0x2be953efa6f9a996ULL))
+ .WillOnce(Return());
+
+ StartCU();
+ DeclarationDIE(&root_handler_, 0xefd7f7752c27b7e4ULL,
+ dwarf2reader::DW_TAG_subprogram, "", "");
+ DefinitionDIE(&root_handler_, dwarf2reader::DW_TAG_subprogram,
+ 0x2be953efa6f9a996ULL, "function",
+ 0xa0277efd7ce83771ULL, 0x149554a184c730c1ULL);
+ root_handler_.Finish();
+}
+
+TEST_F(Specifications, FunctionDefinitionHasOwnName) {
+ PushLine(0xced50b3eea81022cULL, 0x08dd4d301cc7a7d2ULL, "line-file", 56792403);
+
+ StartCU();
+ DeclarationDIE(&root_handler_, 0xc34ff4786cae78bdULL,
+ dwarf2reader::DW_TAG_subprogram, "declaration-name", "");
+ DefinitionDIE(&root_handler_, dwarf2reader::DW_TAG_subprogram,
+ 0xc34ff4786cae78bdULL, "definition-name",
+ 0xced50b3eea81022cULL, 0x08dd4d301cc7a7d2ULL);
+ root_handler_.Finish();
+
+ TestFunctionCount(1);
+ TestFunction(0, "definition-name",
+ 0xced50b3eea81022cULL, 0x08dd4d301cc7a7d2ULL);
+}
+
+TEST_F(Specifications, ClassDefinitionHasOwnName) {
+ PushLine(0x1d0f5e0f6ce309bdULL, 0x654e1852ec3599e7ULL, "line-file", 57119241);
+
+ StartCU();
+ DeclarationDIE(&root_handler_, 0xd0fe467ec2f1a58cULL,
+ dwarf2reader::DW_TAG_class_type, "class-declaration-name", "");
+
+ dwarf2reader::DIEHandler *class_definition
+ = StartSpecifiedDIE(&root_handler_, dwarf2reader::DW_TAG_class_type,
+ 0xd0fe467ec2f1a58cULL, "class-definition-name");
+ ASSERT_TRUE(class_definition);
+ DeclarationDIE(class_definition, 0x6d028229c15623dbULL,
+ dwarf2reader::DW_TAG_subprogram,
+ "function-declaration-name", "");
+ class_definition->Finish();
+ delete class_definition;
+
+ DefinitionDIE(&root_handler_, dwarf2reader::DW_TAG_subprogram,
+ 0x6d028229c15623dbULL, "function-definition-name",
+ 0x1d0f5e0f6ce309bdULL, 0x654e1852ec3599e7ULL);
+
+ root_handler_.Finish();
+
+ TestFunctionCount(1);
+ TestFunction(0, "class-definition-name::function-definition-name",
+ 0x1d0f5e0f6ce309bdULL, 0x654e1852ec3599e7ULL);
+}
+
+// DIEs that cite a specification should prefer the specification's
+// parents over their own when choosing qualified names. In this test,
+// we take the name from our definition but the enclosing scope name
+// from our declaration. I don't see why they'd ever be different, but
+// we want to verify what DwarfCUToModule is looking at.
+TEST_F(Specifications, PreferSpecificationParents) {
+ PushLine(0xbbd9d54dce3b95b7ULL, 0x39188b7b52b0899fULL, "line-file", 79488694);
+
+ StartCU();
+ {
+ dwarf2reader::DIEHandler *declaration_class_handler =
+ StartNamedDIE(&root_handler_, dwarf2reader::DW_TAG_class_type,
+ "declaration-class");
+ DeclarationDIE(declaration_class_handler, 0x9ddb35517455ef7aULL,
+ dwarf2reader::DW_TAG_subprogram, "function-declaration",
+ "");
+ declaration_class_handler->Finish();
+ delete declaration_class_handler;
+ }
+ {
+ dwarf2reader::DIEHandler *definition_class_handler
+ = StartNamedDIE(&root_handler_, dwarf2reader::DW_TAG_class_type,
+ "definition-class");
+ DefinitionDIE(definition_class_handler, dwarf2reader::DW_TAG_subprogram,
+ 0x9ddb35517455ef7aULL, "function-definition",
+ 0xbbd9d54dce3b95b7ULL, 0x39188b7b52b0899fULL);
+ definition_class_handler->Finish();
+ delete definition_class_handler;
+ }
+ root_handler_.Finish();
+
+ TestFunctionCount(1);
+ TestFunction(0, "declaration-class::function-definition",
+ 0xbbd9d54dce3b95b7ULL, 0x39188b7b52b0899fULL);
+}
+
+class CUErrors: public CUFixtureBase, public Test { };
+
+TEST_F(CUErrors, BadStmtList) {
+ EXPECT_CALL(reporter_, BadLineInfoOffset(dummy_line_size_ + 10)).Times(1);
+
+ ASSERT_TRUE(root_handler_
+ .StartCompilationUnit(0xc591d5b037543d7cULL, 0x11, 0xcd,
+ 0x2d7d19546cf6590cULL, 3));
+ ASSERT_TRUE(root_handler_.StartRootDIE(0xae789dc102cfca54ULL,
+ dwarf2reader::DW_TAG_compile_unit));
+ root_handler_.ProcessAttributeString(dwarf2reader::DW_AT_name,
+ dwarf2reader::DW_FORM_strp,
+ "compilation-unit-name");
+ root_handler_.ProcessAttributeUnsigned(dwarf2reader::DW_AT_stmt_list,
+ dwarf2reader::DW_FORM_ref4,
+ dummy_line_size_ + 10);
+ root_handler_.EndAttributes();
+ root_handler_.Finish();
+}
+
+TEST_F(CUErrors, NoLineSection) {
+ EXPECT_CALL(reporter_, MissingSection(".debug_line")).Times(1);
+ PushLine(0x88507fb678052611ULL, 0x42c8e9de6bbaa0faULL, "line-file", 64472290);
+ // Delete the entry for .debug_line added by the fixture class's constructor.
+ file_context_.ClearSectionMapForTest();
+
+ StartCU();
+ root_handler_.Finish();
+}
+
+TEST_F(CUErrors, BadDwarfVersion1) {
+ // Kludge: satisfy reporter_'s expectation.
+ reporter_.SetCUName("compilation-unit-name");
+
+ ASSERT_FALSE(root_handler_
+ .StartCompilationUnit(0xadf6e0eb71e2b0d9ULL, 0x4d, 0x90,
+ 0xc9de224ccb99ac3eULL, 1));
+}
+
+TEST_F(CUErrors, GoodDwarfVersion2) {
+ // Kludge: satisfy reporter_'s expectation.
+ reporter_.SetCUName("compilation-unit-name");
+
+ ASSERT_TRUE(root_handler_
+ .StartCompilationUnit(0xadf6e0eb71e2b0d9ULL, 0x4d, 0x90,
+ 0xc9de224ccb99ac3eULL, 2));
+}
+
+TEST_F(CUErrors, GoodDwarfVersion3) {
+ // Kludge: satisfy reporter_'s expectation.
+ reporter_.SetCUName("compilation-unit-name");
+
+ ASSERT_TRUE(root_handler_
+ .StartCompilationUnit(0xadf6e0eb71e2b0d9ULL, 0x4d, 0x90,
+ 0xc9de224ccb99ac3eULL, 3));
+}
+
+TEST_F(CUErrors, BadCURootDIETag) {
+ // Kludge: satisfy reporter_'s expectation.
+ reporter_.SetCUName("compilation-unit-name");
+
+ ASSERT_TRUE(root_handler_
+ .StartCompilationUnit(0xadf6e0eb71e2b0d9ULL, 0x4d, 0x90,
+ 0xc9de224ccb99ac3eULL, 3));
+
+ ASSERT_FALSE(root_handler_.StartRootDIE(0x02e56bfbda9e7337ULL,
+ dwarf2reader::DW_TAG_subprogram));
+}
+
+// Tests for DwarfCUToModule::Reporter. These just produce (or fail to
+// produce) output, so their results need to be checked by hand.
+struct Reporter: public Test {
+ Reporter()
+ : reporter("filename", 0x123456789abcdef0ULL),
+ function("function name", 0x19c45c30770c1eb0ULL),
+ file("source file name") {
+ reporter.SetCUName("compilation-unit-name");
+
+ function.size = 0x89808a5bdfa0a6a3ULL;
+ function.parameter_size = 0x6a329f18683dcd51ULL;
+
+ line.address = 0x3606ac6267aebeccULL;
+ line.size = 0x5de482229f32556aULL;
+ line.file = &file;
+ line.number = 93400201;
+ }
+
+ DwarfCUToModule::WarningReporter reporter;
+ Module::Function function;
+ Module::File file;
+ Module::Line line;
+};
+
+TEST_F(Reporter, UnknownSpecification) {
+ reporter.UnknownSpecification(0x123456789abcdef1ULL, 0x323456789abcdef2ULL);
+}
+
+TEST_F(Reporter, UnknownAbstractOrigin) {
+ reporter.UnknownAbstractOrigin(0x123456789abcdef1ULL, 0x323456789abcdef2ULL);
+}
+
+TEST_F(Reporter, MissingSection) {
+ reporter.MissingSection("section name");
+}
+
+TEST_F(Reporter, BadLineInfoOffset) {
+ reporter.BadLineInfoOffset(0x123456789abcdef1ULL);
+}
+
+TEST_F(Reporter, UncoveredFunctionDisabled) {
+ reporter.UncoveredFunction(function);
+ EXPECT_FALSE(reporter.uncovered_warnings_enabled());
+}
+
+TEST_F(Reporter, UncoveredFunctionEnabled) {
+ reporter.set_uncovered_warnings_enabled(true);
+ reporter.UncoveredFunction(function);
+ EXPECT_TRUE(reporter.uncovered_warnings_enabled());
+}
+
+TEST_F(Reporter, UncoveredLineDisabled) {
+ reporter.UncoveredLine(line);
+ EXPECT_FALSE(reporter.uncovered_warnings_enabled());
+}
+
+TEST_F(Reporter, UncoveredLineEnabled) {
+ reporter.set_uncovered_warnings_enabled(true);
+ reporter.UncoveredLine(line);
+ EXPECT_TRUE(reporter.uncovered_warnings_enabled());
+}
+
+TEST_F(Reporter, UnnamedFunction) {
+ reporter.UnnamedFunction(0x90c0baff9dedb2d9ULL);
+}
+
+// Would be nice to also test:
+// - overlapping lines, functions
diff --git a/3rdParty/Breakpad/src/common/dwarf_line_to_module.cc b/3rdParty/Breakpad/src/common/dwarf_line_to_module.cc
index 962848d..258b0b6 100644
--- a/3rdParty/Breakpad/src/common/dwarf_line_to_module.cc
+++ b/3rdParty/Breakpad/src/common/dwarf_line_to_module.cc
@@ -48,13 +48,17 @@ static bool PathIsAbsolute(const string &path) {
return (path.size() >= 1 && path[0] == '/');
}
+static bool HasTrailingSlash(const string &path) {
+ return (path.size() >= 1 && path[path.size() - 1] == '/');
+}
+
// If PATH is an absolute path, return PATH. If PATH is a relative path,
// treat it as relative to BASE and return the combined path.
static string ExpandPath(const string &path,
const string &base) {
- if (PathIsAbsolute(path))
+ if (PathIsAbsolute(path) || base.empty())
return path;
- return base + "/" + path;
+ return base + (HasTrailingSlash(base) ? "" : "/") + path;
}
namespace google_breakpad {
@@ -63,7 +67,7 @@ void DwarfLineToModule::DefineDir(const string &name, uint32 dir_num) {
// Directory number zero is reserved to mean the compilation
// directory. Silently ignore attempts to redefine it.
if (dir_num != 0)
- directories_[dir_num] = name;
+ directories_[dir_num] = ExpandPath(name, compilation_dir_);
}
void DwarfLineToModule::DefineFile(const string &name, int32 file_num,
@@ -74,25 +78,26 @@ void DwarfLineToModule::DefineFile(const string &name, int32 file_num,
else if (file_num > highest_file_number_)
highest_file_number_ = file_num;
- string full_name;
- if (dir_num != 0) {
+ string dir_name;
+ if (dir_num == 0) {
+ // Directory number zero is the compilation directory, and is stored as
+ // an attribute on the compilation unit, rather than in the program table.
+ dir_name = compilation_dir_;
+ } else {
DirectoryTable::const_iterator directory_it = directories_.find(dir_num);
if (directory_it != directories_.end()) {
- full_name = ExpandPath(name, directory_it->second);
+ dir_name = directory_it->second;
} else {
if (!warned_bad_directory_number_) {
fprintf(stderr, "warning: DWARF line number data refers to undefined"
" directory numbers\n");
warned_bad_directory_number_ = true;
}
- full_name = name; // just treat name as relative
}
- } else {
- // Directory number zero is the compilation directory; we just report
- // relative paths in that case.
- full_name = name;
}
+ string full_name = ExpandPath(name, dir_name);
+
// Find a Module::File object of the given name, and add it to the
// file table.
files_[file_num] = module_->FindFile(full_name);
diff --git a/3rdParty/Breakpad/src/common/dwarf_line_to_module.h b/3rdParty/Breakpad/src/common/dwarf_line_to_module.h
index 9382e40..1fdd4cb 100644
--- a/3rdParty/Breakpad/src/common/dwarf_line_to_module.h
+++ b/3rdParty/Breakpad/src/common/dwarf_line_to_module.h
@@ -120,8 +120,10 @@ class DwarfLineToModule: public dwarf2reader::LineInfoHandler {
// end of the address space, we clip it. It's up to our client to
// sort out which lines belong to which functions; we don't add them
// to any particular function in MODULE ourselves.
- DwarfLineToModule(Module *module, vector<Module::Line> *lines)
+ DwarfLineToModule(Module *module, const string& compilation_dir,
+ vector<Module::Line> *lines)
: module_(module),
+ compilation_dir_(compilation_dir),
lines_(lines),
highest_file_number_(-1),
omitted_line_end_(0),
@@ -146,6 +148,10 @@ class DwarfLineToModule: public dwarf2reader::LineInfoHandler {
// client.
Module *module_;
+ // The compilation directory for the current compilation unit whose
+ // lines are being accumulated.
+ string compilation_dir_;
+
// The vector of lines we're accumulating. Owned by our client.
//
// In a Module, as in a breakpad symbol file, lines belong to
diff --git a/3rdParty/Breakpad/src/common/dwarf_line_to_module_unittest.cc b/3rdParty/Breakpad/src/common/dwarf_line_to_module_unittest.cc
new file mode 100644
index 0000000..7c0fcfd
--- /dev/null
+++ b/3rdParty/Breakpad/src/common/dwarf_line_to_module_unittest.cc
@@ -0,0 +1,391 @@
+// Copyright (c) 2010 Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// Original author: Jim Blandy <jimb@mozilla.com> <jimb@red-bean.com>
+
+// dwarf_line_to_module.cc: Unit tests for google_breakpad::DwarfLineToModule.
+
+#include <vector>
+
+#include "breakpad_googletest_includes.h"
+#include "common/dwarf_line_to_module.h"
+
+using std::vector;
+
+using google_breakpad::DwarfLineToModule;
+using google_breakpad::Module;
+using google_breakpad::Module;
+
+TEST(SimpleModule, One) {
+ Module m("name", "os", "architecture", "id");
+ vector<Module::Line> lines;
+ DwarfLineToModule h(&m, "/", &lines);
+
+ h.DefineFile("file1", 0x30bf0f27, 0, 0, 0);
+ h.AddLine(0x6fd126fbf74f2680LL, 0x63c9a14cf556712bLL, 0x30bf0f27,
+ 0x4c090cbf, 0x1cf9fe0d);
+
+ vector<Module::File *> files;
+ m.GetFiles(&files);
+ EXPECT_EQ(1U, files.size());
+ EXPECT_STREQ("/file1", files[0]->name.c_str());
+
+ EXPECT_EQ(1U, lines.size());
+ EXPECT_EQ(0x6fd126fbf74f2680ULL, lines[0].address);
+ EXPECT_EQ(0x63c9a14cf556712bULL, lines[0].size);
+ EXPECT_TRUE(lines[0].file == files[0]);
+ EXPECT_EQ(0x4c090cbf, lines[0].number);
+}
+
+TEST(SimpleModule, Many) {
+ Module m("name", "os", "architecture", "id");
+ vector<Module::Line> lines;
+ DwarfLineToModule h(&m, "/", &lines);
+
+ h.DefineDir("directory1", 0x838299ab);
+ h.DefineDir("directory2", 0xf85de023);
+ h.DefineFile("file1", 0x2b80377a, 0x838299ab, 0, 0);
+ h.DefineFile("file1", 0x63beb4a4, 0xf85de023, 0, 0);
+ h.DefineFile("file2", 0x1d161d56, 0x838299ab, 0, 0);
+ h.DefineFile("file2", 0x1e7a667c, 0xf85de023, 0, 0);
+ h.AddLine(0x69900c5d553b7274ULL, 0x90fded183f0d0d3cULL, 0x2b80377a,
+ 0x15b0f0a9U, 0x3ff5abd6U);
+ h.AddLine(0x45811219a39b7101ULL, 0x25a5e6a924afc41fULL, 0x63beb4a4,
+ 0x4d259ce9U, 0x41c5ee32U);
+ h.AddLine(0xfa90514c1dc9704bULL, 0x0063efeabc02f313ULL, 0x1d161d56,
+ 0x1ee9fa4fU, 0xbf70e46aU);
+ h.AddLine(0x556b55fb6a647b10ULL, 0x3f3089ca2bfd80f5ULL, 0x1e7a667c,
+ 0x77fc280eU, 0x2c4a728cU);
+ h.DefineFile("file3", -1, 0, 0, 0);
+ h.AddLine(0xe2d72a37f8d9403aULL, 0x034dfab5b0d4d236ULL, 0x63beb4a5,
+ 0x75047044U, 0xb6a0016cU);
+
+ vector<Module::File *> files;
+ m.GetFiles(&files);
+ ASSERT_EQ(5U, files.size());
+ EXPECT_STREQ("/directory1/file1", files[0]->name.c_str());
+ EXPECT_STREQ("/directory1/file2", files[1]->name.c_str());
+ EXPECT_STREQ("/directory2/file1", files[2]->name.c_str());
+ EXPECT_STREQ("/directory2/file2", files[3]->name.c_str());
+ EXPECT_STREQ("/file3", files[4]->name.c_str());
+
+ ASSERT_EQ(5U, lines.size());
+
+ EXPECT_EQ(0x69900c5d553b7274ULL, lines[0].address);
+ EXPECT_EQ(0x90fded183f0d0d3cULL, lines[0].size);
+ EXPECT_TRUE(lines[0].file == files[0]);
+ EXPECT_EQ(0x15b0f0a9, lines[0].number);
+
+ EXPECT_EQ(0x45811219a39b7101ULL, lines[1].address);
+ EXPECT_EQ(0x25a5e6a924afc41fULL, lines[1].size);
+ EXPECT_TRUE(lines[1].file == files[2]);
+ EXPECT_EQ(0x4d259ce9, lines[1].number);
+
+ EXPECT_EQ(0xfa90514c1dc9704bULL, lines[2].address);
+ EXPECT_EQ(0x0063efeabc02f313ULL, lines[2].size);
+ EXPECT_TRUE(lines[2].file == files[1]);
+ EXPECT_EQ(0x1ee9fa4f, lines[2].number);
+
+ EXPECT_EQ(0x556b55fb6a647b10ULL, lines[3].address);
+ EXPECT_EQ(0x3f3089ca2bfd80f5ULL, lines[3].size);
+ EXPECT_TRUE(lines[3].file == files[3]);
+ EXPECT_EQ(0x77fc280e, lines[3].number);
+
+ EXPECT_EQ(0xe2d72a37f8d9403aULL, lines[4].address);
+ EXPECT_EQ(0x034dfab5b0d4d236ULL, lines[4].size);
+ EXPECT_TRUE(lines[4].file == files[4]);
+ EXPECT_EQ(0x75047044, lines[4].number);
+}
+
+TEST(Filenames, Absolute) {
+ Module m("name", "os", "architecture", "id");
+ vector<Module::Line> lines;
+ DwarfLineToModule h(&m, "/", &lines);
+
+ h.DefineDir("directory1", 1);
+ h.DefineFile("/absolute", 1, 1, 0, 0);
+
+ h.AddLine(1, 1, 1, 0, 0);
+
+ vector<Module::File *> files;
+ m.GetFiles(&files);
+ ASSERT_EQ(1U, files.size());
+ EXPECT_STREQ("/absolute", files[0]->name.c_str());
+ ASSERT_EQ(1U, lines.size());
+ EXPECT_TRUE(lines[0].file == files[0]);
+}
+
+TEST(Filenames, Relative) {
+ Module m("name", "os", "architecture", "id");
+ vector<Module::Line> lines;
+ DwarfLineToModule h(&m, "/", &lines);
+
+ h.DefineDir("directory1", 1);
+ h.DefineFile("relative", 1, 1, 0, 0);
+
+ h.AddLine(1, 1, 1, 0, 0);
+
+ vector<Module::File *> files;
+ m.GetFiles(&files);
+ ASSERT_EQ(1U, files.size());
+ EXPECT_STREQ("/directory1/relative", files[0]->name.c_str());
+ ASSERT_EQ(1U, lines.size());
+ EXPECT_TRUE(lines[0].file == files[0]);
+}
+
+TEST(Filenames, StrangeFile) {
+ Module m("name", "os", "architecture", "id");
+ vector<Module::Line> lines;
+ DwarfLineToModule h(&m, "/", &lines);
+
+ h.DefineDir("directory1", 1);
+ h.DefineFile("", 1, 1, 0, 0);
+ h.AddLine(1, 1, 1, 0, 0);
+
+ ASSERT_EQ(1U, lines.size());
+ EXPECT_STREQ("/directory1/", lines[0].file->name.c_str());
+}
+
+TEST(Filenames, StrangeDirectory) {
+ Module m("name", "os", "architecture", "id");
+ vector<Module::Line> lines;
+ DwarfLineToModule h(&m, "/", &lines);
+
+ h.DefineDir("", 1);
+ h.DefineFile("file1", 1, 1, 0, 0);
+ h.AddLine(1, 1, 1, 0, 0);
+
+ ASSERT_EQ(1U, lines.size());
+ EXPECT_STREQ("/file1", lines[0].file->name.c_str());
+}
+
+TEST(Filenames, StrangeDirectoryAndFile) {
+ Module m("name", "os", "architecture", "id");
+ vector<Module::Line> lines;
+ DwarfLineToModule h(&m, "/", &lines);
+
+ h.DefineDir("", 1);
+ h.DefineFile("", 1, 1, 0, 0);
+ h.AddLine(1, 1, 1, 0, 0);
+
+ ASSERT_EQ(1U, lines.size());
+ EXPECT_STREQ("/", lines[0].file->name.c_str());
+}
+
+// We should use the compilation directory when encountering a file for
+// directory number zero.
+TEST(Filenames, DirectoryZeroFileIsRelativeToCompilationDir) {
+ Module m("name", "os", "architecture", "id");
+ vector<Module::Line> lines;
+ DwarfLineToModule h(&m, "src/build", &lines);
+
+ h.DefineDir("Dir", 1);
+ h.DefineFile("File", 1, 0, 0, 0);
+
+ h.AddLine(1, 1, 1, 0, 0);
+
+ ASSERT_EQ(1U, lines.size());
+ EXPECT_STREQ("src/build/File", lines[0].file->name.c_str());
+}
+
+// We should treat non-absolute directories as relative to the compilation
+// directory.
+TEST(Filenames, IncludeDirectoryRelativeToDirectoryZero) {
+ Module m("name", "os", "architecture", "id");
+ vector<Module::Line> lines;
+ DwarfLineToModule h(&m, "src/build", &lines);
+
+ h.DefineDir("Dir", 1);
+ h.DefineFile("File", 1, 1, 0, 0);
+
+ h.AddLine(1, 1, 1, 0, 0);
+
+ ASSERT_EQ(1U, lines.size());
+ EXPECT_STREQ("src/build/Dir/File", lines[0].file->name.c_str());
+}
+
+// We should treat absolute directories as absolute, and not relative to
+// the compilation dir.
+TEST(Filenames, IncludeDirectoryAbsolute) {
+ Module m("name", "os", "architecture", "id");
+ vector<Module::Line> lines;
+ DwarfLineToModule h(&m, "src/build", &lines);
+
+ h.DefineDir("/Dir", 1);
+ h.DefineFile("File", 1, 1, 0, 0);
+
+ h.AddLine(1, 1, 1, 0, 0);
+
+ ASSERT_EQ(1U, lines.size());
+ EXPECT_STREQ("/Dir/File", lines[0].file->name.c_str());
+}
+
+// We should silently ignore attempts to define directory number zero,
+// since that is always the compilation directory.
+TEST(ModuleErrors, DirectoryZero) {
+ Module m("name", "os", "architecture", "id");
+ vector<Module::Line> lines;
+ DwarfLineToModule h(&m, "/", &lines);
+
+ h.DefineDir("directory0", 0); // should be ignored
+ h.DefineFile("relative", 1, 0, 0, 0);
+
+ h.AddLine(1, 1, 1, 0, 0);
+
+ ASSERT_EQ(1U, lines.size());
+ EXPECT_STREQ("/relative", lines[0].file->name.c_str());
+}
+
+// We should refuse to add lines with bogus file numbers. We should
+// produce only one warning, however.
+TEST(ModuleErrors, BadFileNumber) {
+ Module m("name", "os", "architecture", "id");
+ vector<Module::Line> lines;
+ DwarfLineToModule h(&m, "/", &lines);
+
+ h.DefineFile("relative", 1, 0, 0, 0);
+ h.AddLine(1, 1, 2, 0, 0); // bad file number
+ h.AddLine(2, 1, 2, 0, 0); // bad file number (no duplicate warning)
+
+ EXPECT_EQ(0U, lines.size());
+}
+
+// We should treat files with bogus directory numbers as relative to
+// the compilation unit.
+TEST(ModuleErrors, BadDirectoryNumber) {
+ Module m("name", "os", "architecture", "id");
+ vector<Module::Line> lines;
+ DwarfLineToModule h(&m, "/", &lines);
+
+ h.DefineDir("directory1", 1);
+ h.DefineFile("baddirnumber1", 1, 2, 0, 0); // bad directory number
+ h.DefineFile("baddirnumber2", 2, 2, 0, 0); // bad dir number (no warning)
+ h.AddLine(1, 1, 1, 0, 0);
+
+ ASSERT_EQ(1U, lines.size());
+ EXPECT_STREQ("baddirnumber1", lines[0].file->name.c_str());
+}
+
+// We promise not to report empty lines.
+TEST(ModuleErrors, EmptyLine) {
+ Module m("name", "os", "architecture", "id");
+ vector<Module::Line> lines;
+ DwarfLineToModule h(&m, "/", &lines);
+
+ h.DefineFile("filename1", 1, 0, 0, 0);
+ h.AddLine(1, 0, 1, 0, 0);
+
+ ASSERT_EQ(0U, lines.size());
+}
+
+// We are supposed to clip lines that extend beyond the end of the
+// address space.
+TEST(ModuleErrors, BigLine) {
+ Module m("name", "os", "architecture", "id");
+ vector<Module::Line> lines;
+ DwarfLineToModule h(&m, "/", &lines);
+
+ h.DefineFile("filename1", 1, 0, 0, 0);
+ h.AddLine(0xffffffffffffffffULL, 2, 1, 0, 0);
+
+ ASSERT_EQ(1U, lines.size());
+ EXPECT_EQ(1U, lines[0].size);
+}
+
+// The 'Omitted' tests verify that we correctly omit line information
+// for code in sections that the linker has dropped. See "GNU
+// toolchain omitted sections support" at the top of the
+// DwarfLineToModule class.
+
+TEST(Omitted, DroppedThenGood) {
+ Module m("name", "os", "architecture", "id");
+ vector<Module::Line> lines;
+ DwarfLineToModule h(&m, "/", &lines);
+
+ h.DefineFile("filename1", 1, 0, 0, 0);
+ h.AddLine(0, 10, 1, 83816211, 0); // should be omitted
+ h.AddLine(20, 10, 1, 13059195, 0); // should be recorded
+
+ ASSERT_EQ(1U, lines.size());
+ EXPECT_EQ(13059195, lines[0].number);
+}
+
+TEST(Omitted, GoodThenDropped) {
+ Module m("name", "os", "architecture", "id");
+ vector<Module::Line> lines;
+ DwarfLineToModule h(&m, "/", &lines);
+
+ h.DefineFile("filename1", 1, 0, 0, 0);
+ h.AddLine(0x9dd6a372, 10, 1, 41454594, 0); // should be recorded
+ h.AddLine(0, 10, 1, 44793413, 0); // should be omitted
+
+ ASSERT_EQ(1U, lines.size());
+ EXPECT_EQ(41454594, lines[0].number);
+}
+
+TEST(Omitted, Mix1) {
+ Module m("name", "os", "architecture", "id");
+ vector<Module::Line> lines;
+ DwarfLineToModule h(&m, "/", &lines);
+
+ h.DefineFile("filename1", 1, 0, 0, 0);
+ h.AddLine(0x679ed72f, 10, 1, 58932642, 0); // should be recorded
+ h.AddLine(0xdfb5a72d, 10, 1, 39847385, 0); // should be recorded
+ h.AddLine(0, 0x78, 1, 23053829, 0); // should be omitted
+ h.AddLine(0x78, 0x6a, 1, 65317783, 0); // should be omitted
+ h.AddLine(0x78 + 0x6a, 0x2a, 1, 77601423, 0); // should be omitted
+ h.AddLine(0x9fe0cea5, 10, 1, 91806582, 0); // should be recorded
+ h.AddLine(0x7e41a109, 10, 1, 56169221, 0); // should be recorded
+
+ ASSERT_EQ(4U, lines.size());
+ EXPECT_EQ(58932642, lines[0].number);
+ EXPECT_EQ(39847385, lines[1].number);
+ EXPECT_EQ(91806582, lines[2].number);
+ EXPECT_EQ(56169221, lines[3].number);
+}
+
+TEST(Omitted, Mix2) {
+ Module m("name", "os", "architecture", "id");
+ vector<Module::Line> lines;
+ DwarfLineToModule h(&m, "/", &lines);
+
+ h.DefineFile("filename1", 1, 0, 0, 0);
+ h.AddLine(0, 0xf2, 1, 58802211, 0); // should be omitted
+ h.AddLine(0xf2, 0xb9, 1, 78958222, 0); // should be omitted
+ h.AddLine(0xf2 + 0xb9, 0xf7, 1, 64861892, 0); // should be omitted
+ h.AddLine(0x4e4d271e, 9, 1, 67355743, 0); // should be recorded
+ h.AddLine(0xdfb5a72d, 30, 1, 23365776, 0); // should be recorded
+ h.AddLine(0, 0x64, 1, 76196762, 0); // should be omitted
+ h.AddLine(0x64, 0x33, 1, 71066611, 0); // should be omitted
+ h.AddLine(0x64 + 0x33, 0xe3, 1, 61749337, 0); // should be omitted
+
+ ASSERT_EQ(2U, lines.size());
+ EXPECT_EQ(67355743, lines[0].number);
+ EXPECT_EQ(23365776, lines[1].number);
+}
diff --git a/3rdParty/Breakpad/src/common/language.cc b/3rdParty/Breakpad/src/common/language.cc
index c2fd81f..978fb85 100644
--- a/3rdParty/Breakpad/src/common/language.cc
+++ b/3rdParty/Breakpad/src/common/language.cc
@@ -34,18 +34,70 @@
#include "common/language.h"
+#include <stdlib.h>
+
+#if !defined(__ANDROID__)
+#include <cxxabi.h>
+#endif
+
+#if defined(HAVE_RUST_DEMANGLE)
+#include <rust_demangle.h>
+#endif
+
+#include <limits>
+
+namespace {
+
+string MakeQualifiedNameWithSeparator(const string& parent_name,
+ const char* separator,
+ const string& name) {
+ if (parent_name.empty()) {
+ return name;
+ }
+
+ return parent_name + separator + name;
+}
+
+} // namespace
+
namespace google_breakpad {
// C++ language-specific operations.
class CPPLanguage: public Language {
public:
CPPLanguage() {}
+
string MakeQualifiedName(const string &parent_name,
const string &name) const {
- if (parent_name.empty())
- return name;
- else
- return parent_name + "::" + name;
+ return MakeQualifiedNameWithSeparator(parent_name, "::", name);
+ }
+
+ virtual DemangleResult DemangleName(const string& mangled,
+ string* demangled) const {
+#if defined(__ANDROID__)
+ // Android NDK doesn't provide abi::__cxa_demangle.
+ demangled->clear();
+ return kDontDemangle;
+#else
+ int status;
+ char* demangled_c =
+ abi::__cxa_demangle(mangled.c_str(), NULL, NULL, &status);
+
+ DemangleResult result;
+ if (status == 0) {
+ result = kDemangleSuccess;
+ demangled->assign(demangled_c);
+ } else {
+ result = kDemangleFailure;
+ demangled->clear();
+ }
+
+ if (demangled_c) {
+ free(reinterpret_cast<void*>(demangled_c));
+ }
+
+ return result;
+#endif
}
};
@@ -54,19 +106,79 @@ CPPLanguage CPPLanguageSingleton;
// Java language-specific operations.
class JavaLanguage: public Language {
public:
+ JavaLanguage() {}
+
string MakeQualifiedName(const string &parent_name,
const string &name) const {
- if (parent_name.empty())
- return name;
- else
- return parent_name + "." + name;
+ return MakeQualifiedNameWithSeparator(parent_name, ".", name);
}
};
JavaLanguage JavaLanguageSingleton;
+// Swift language-specific operations.
+class SwiftLanguage: public Language {
+ public:
+ SwiftLanguage() {}
+
+ string MakeQualifiedName(const string &parent_name,
+ const string &name) const {
+ return MakeQualifiedNameWithSeparator(parent_name, ".", name);
+ }
+
+ virtual DemangleResult DemangleName(const string& mangled,
+ string* demangled) const {
+ // There is no programmatic interface to a Swift demangler. Pass through the
+ // mangled form because it encodes more information than the qualified name
+ // that would have been built by MakeQualifiedName(). The output can be
+ // post-processed by xcrun swift-demangle to transform mangled Swift names
+ // into something more readable.
+ demangled->assign(mangled);
+ return kDemangleSuccess;
+ }
+};
+
+SwiftLanguage SwiftLanguageSingleton;
+
+// Rust language-specific operations.
+class RustLanguage: public Language {
+ public:
+ RustLanguage() {}
+
+ string MakeQualifiedName(const string &parent_name,
+ const string &name) const {
+ return MakeQualifiedNameWithSeparator(parent_name, ".", name);
+ }
+
+ virtual DemangleResult DemangleName(const string& mangled,
+ string* demangled) const {
+ // Rust names use GCC C++ name mangling, but demangling them with
+ // abi_demangle doesn't produce stellar results due to them having
+ // another layer of encoding.
+ // If callers provide rustc-demangle, use that.
+#if defined(HAVE_RUST_DEMANGLE)
+ char* rust_demangled = rust_demangle(mangled.c_str());
+ if (rust_demangled == nullptr) {
+ return kDemangleFailure;
+ }
+ demangled->assign(rust_demangled);
+ free_rust_demangled_name(rust_demangled);
+#else
+ // Otherwise, pass through the mangled name so callers can demangle
+ // after the fact.
+ demangled->assign(mangled);
+#endif
+ return kDemangleSuccess;
+ }
+};
+
+RustLanguage RustLanguageSingleton;
+
// Assembler language-specific operations.
class AssemblerLanguage: public Language {
+ public:
+ AssemblerLanguage() {}
+
bool HasFunctions() const { return false; }
string MakeQualifiedName(const string &parent_name,
const string &name) const {
@@ -78,6 +190,8 @@ AssemblerLanguage AssemblerLanguageSingleton;
const Language * const Language::CPlusPlus = &CPPLanguageSingleton;
const Language * const Language::Java = &JavaLanguageSingleton;
+const Language * const Language::Swift = &SwiftLanguageSingleton;
+const Language * const Language::Rust = &RustLanguageSingleton;
const Language * const Language::Assembler = &AssemblerLanguageSingleton;
} // namespace google_breakpad
diff --git a/3rdParty/Breakpad/src/common/language.h b/3rdParty/Breakpad/src/common/language.h
index bbe3033..2d2dbcd 100644
--- a/3rdParty/Breakpad/src/common/language.h
+++ b/3rdParty/Breakpad/src/common/language.h
@@ -77,9 +77,26 @@ class Language {
virtual string MakeQualifiedName (const string &parent_name,
const string &name) const = 0;
+ enum DemangleResult {
+ // Demangling was not performed because it’s not appropriate to attempt.
+ kDontDemangle = -1,
+
+ kDemangleSuccess,
+ kDemangleFailure,
+ };
+
+ // Wraps abi::__cxa_demangle() or similar for languages where appropriate.
+ virtual DemangleResult DemangleName(const string& mangled,
+ string* demangled) const {
+ demangled->clear();
+ return kDontDemangle;
+ }
+
// Instances for specific languages.
static const Language * const CPlusPlus,
* const Java,
+ * const Swift,
+ * const Rust,
* const Assembler;
};
diff --git a/3rdParty/Breakpad/src/common/linux/linux_libc_support.h b/3rdParty/Breakpad/src/common/linux/linux_libc_support.h
index b2f47af..ec5a8d6 100644
--- a/3rdParty/Breakpad/src/common/linux/linux_libc_support.h
+++ b/3rdParty/Breakpad/src/common/linux/linux_libc_support.h
@@ -52,17 +52,16 @@ extern int my_strncmp(const char* a, const char* b, size_t len);
// Return true iff successful.
extern bool my_strtoui(int* result, const char* s);
-// Return the length of the given, non-negative integer when expressed in base
-// 10.
-extern unsigned my_int_len(intmax_t i);
+// Return the length of the given unsigned integer when expressed in base 10.
+extern unsigned my_uint_len(uintmax_t i);
-// Convert a non-negative integer to a string
+// Convert an unsigned integer to a string
// output: (output) the resulting string is written here. This buffer must be
-// large enough to hold the resulting string. Call |my_int_len| to get the
+// large enough to hold the resulting string. Call |my_uint_len| to get the
// required length.
-// i: the non-negative integer to serialise.
-// i_len: the length of the integer in base 10 (see |my_int_len|).
-extern void my_itos(char* output, intmax_t i, unsigned i_len);
+// i: the unsigned integer to serialise.
+// i_len: the length of the integer in base 10 (see |my_uint_len|).
+extern void my_uitos(char* output, uintmax_t i, unsigned i_len);
extern const char* my_strchr(const char* haystack, char needle);
@@ -78,6 +77,8 @@ extern const char* my_read_decimal_ptr(uintptr_t* result, const char* s);
extern void my_memset(void* ip, char c, size_t len);
+extern void* my_memchr(const void* src, int c, size_t len);
+
// The following are considered safe to use in a compromised environment.
// Besides, this gives the compiler an opportunity to optimize their calls.
#define my_memcpy memcpy
diff --git a/3rdParty/Breakpad/src/common/mac/Breakpad.xcconfig b/3rdParty/Breakpad/src/common/mac/Breakpad.xcconfig
new file mode 100644
index 0000000..f091369
--- /dev/null
+++ b/3rdParty/Breakpad/src/common/mac/Breakpad.xcconfig
@@ -0,0 +1,52 @@
+// Copyright (c) 2010, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+GCC_C_LANGUAGE_STANDARD = c99
+
+GCC_WARN_CHECK_SWITCH_STATEMENTS = YES
+// TODO(nealsid): Get the code so we can turn on the 64_TO_32 warning.
+GCC_WARN_64_TO_32_BIT_CONVERSION = NO
+GCC_WARN_INITIALIZER_NOT_FULLY_BRACKETED = YES
+GCC_WARN_ABOUT_RETURN_TYPE = YES
+GCC_WARN_MISSING_PARENTHESES = YES
+
+// Once https://bugs.chromium.org/p/google-breakpad/issues/detail?id=697
+// is fixed this should be reenabled.
+//GCC_WARN_ABOUT_MISSING_FIELD_INITIALIZERS = YES
+GCC_WARN_ABOUT_MISSING_NEWLINE = YES
+GCC_WARN_SIGN_COMPARE = YES
+GCC_TREAT_IMPLICIT_FUNCTION_DECLARATIONS_AS_ERRORS = YES
+GCC_WARN_UNDECLARED_SELECTOR = YES
+GCC_WARN_UNKNOWN_PRAGMAS = YES
+GCC_WARN_UNUSED_VARIABLE = YES
+GCC_TREAT_WARNINGS_AS_ERRORS = YES
+
+DEBUG_INFORMATION_FORMAT = dwarf-with-dsym
+
+ALWAYS_SEARCH_USER_PATHS = NO
diff --git a/3rdParty/Breakpad/src/common/mac/BreakpadDebug.xcconfig b/3rdParty/Breakpad/src/common/mac/BreakpadDebug.xcconfig
new file mode 100644
index 0000000..94cdd8c
--- /dev/null
+++ b/3rdParty/Breakpad/src/common/mac/BreakpadDebug.xcconfig
@@ -0,0 +1,32 @@
+// Copyright (c) 2010, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#include "Breakpad.xcconfig"
+
+GCC_OPTIMIZATION_LEVEL = 0
diff --git a/3rdParty/Breakpad/src/common/mac/BreakpadRelease.xcconfig b/3rdParty/Breakpad/src/common/mac/BreakpadRelease.xcconfig
new file mode 100644
index 0000000..920f277
--- /dev/null
+++ b/3rdParty/Breakpad/src/common/mac/BreakpadRelease.xcconfig
@@ -0,0 +1,34 @@
+// Copyright (c) 2010, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#include "Breakpad.xcconfig"
+
+GCC_OPTIMIZATION_LEVEL = s
+GCC_WARN_UNINITIALIZED_AUTOS = YES
+GCC_PREPROCESSOR_DEFINITIONS = $(inherited) NDEBUG
diff --git a/3rdParty/Breakpad/src/common/mac/GTMDefines.h b/3rdParty/Breakpad/src/common/mac/GTMDefines.h
new file mode 100644
index 0000000..04fcf6d
--- /dev/null
+++ b/3rdParty/Breakpad/src/common/mac/GTMDefines.h
@@ -0,0 +1,456 @@
+//
+// GTMDefines.h
+//
+// Copyright 2008 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License"); you may not
+// use this file except in compliance with the License. You may obtain a copy
+// of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+// License for the specific language governing permissions and limitations under
+// the License.
+//
+
+// ============================================================================
+
+#include <AvailabilityMacros.h>
+#include <TargetConditionals.h>
+
+#ifdef __OBJC__
+#include <Foundation/NSObjCRuntime.h>
+#endif // __OBJC__
+
+#if TARGET_OS_IPHONE
+#include <Availability.h>
+#endif // TARGET_OS_IPHONE
+
+// Not all MAC_OS_X_VERSION_10_X macros defined in past SDKs
+#ifndef MAC_OS_X_VERSION_10_5
+ #define MAC_OS_X_VERSION_10_5 1050
+#endif
+#ifndef MAC_OS_X_VERSION_10_6
+ #define MAC_OS_X_VERSION_10_6 1060
+#endif
+#ifndef MAC_OS_X_VERSION_10_7
+ #define MAC_OS_X_VERSION_10_7 1070
+#endif
+
+// Not all __IPHONE_X macros defined in past SDKs
+#ifndef __IPHONE_3_0
+ #define __IPHONE_3_0 30000
+#endif
+#ifndef __IPHONE_3_1
+ #define __IPHONE_3_1 30100
+#endif
+#ifndef __IPHONE_3_2
+ #define __IPHONE_3_2 30200
+#endif
+#ifndef __IPHONE_4_0
+ #define __IPHONE_4_0 40000
+#endif
+#ifndef __IPHONE_4_3
+ #define __IPHONE_4_3 40300
+#endif
+#ifndef __IPHONE_5_0
+ #define __IPHONE_5_0 50000
+#endif
+
+// ----------------------------------------------------------------------------
+// CPP symbols that can be overridden in a prefix to control how the toolbox
+// is compiled.
+// ----------------------------------------------------------------------------
+
+
+// By setting the GTM_CONTAINERS_VALIDATION_FAILED_LOG and
+// GTM_CONTAINERS_VALIDATION_FAILED_ASSERT macros you can control what happens
+// when a validation fails. If you implement your own validators, you may want
+// to control their internals using the same macros for consistency.
+#ifndef GTM_CONTAINERS_VALIDATION_FAILED_ASSERT
+ #define GTM_CONTAINERS_VALIDATION_FAILED_ASSERT 0
+#endif
+
+// Give ourselves a consistent way to do inlines. Apple's macros even use
+// a few different actual definitions, so we're based off of the foundation
+// one.
+#if !defined(GTM_INLINE)
+ #if (defined (__GNUC__) && (__GNUC__ == 4)) || defined (__clang__)
+ #define GTM_INLINE static __inline__ __attribute__((always_inline))
+ #else
+ #define GTM_INLINE static __inline__
+ #endif
+#endif
+
+// Give ourselves a consistent way of doing externs that links up nicely
+// when mixing objc and objc++
+#if !defined (GTM_EXTERN)
+ #if defined __cplusplus
+ #define GTM_EXTERN extern "C"
+ #define GTM_EXTERN_C_BEGIN extern "C" {
+ #define GTM_EXTERN_C_END }
+ #else
+ #define GTM_EXTERN extern
+ #define GTM_EXTERN_C_BEGIN
+ #define GTM_EXTERN_C_END
+ #endif
+#endif
+
+// Give ourselves a consistent way of exporting things if we have visibility
+// set to hidden.
+#if !defined (GTM_EXPORT)
+ #define GTM_EXPORT __attribute__((visibility("default")))
+#endif
+
+// Give ourselves a consistent way of declaring something as unused. This
+// doesn't use __unused because that is only supported in gcc 4.2 and greater.
+#if !defined (GTM_UNUSED)
+#define GTM_UNUSED(x) ((void)(x))
+#endif
+
+// _GTMDevLog & _GTMDevAssert
+//
+// _GTMDevLog & _GTMDevAssert are meant to be a very lightweight shell for
+// developer level errors. This implementation simply macros to NSLog/NSAssert.
+// It is not intended to be a general logging/reporting system.
+//
+// Please see https://github.com/google/google-toolbox-for-mac/wiki/DevLogNAssert
+// for a little more background on the usage of these macros.
+//
+// _GTMDevLog log some error/problem in debug builds
+// _GTMDevAssert assert if conditon isn't met w/in a method/function
+// in all builds.
+//
+// To replace this system, just provide different macro definitions in your
+// prefix header. Remember, any implementation you provide *must* be thread
+// safe since this could be called by anything in what ever situtation it has
+// been placed in.
+//
+
+// We only define the simple macros if nothing else has defined this.
+#ifndef _GTMDevLog
+
+#ifdef DEBUG
+ #define _GTMDevLog(...) NSLog(__VA_ARGS__)
+#else
+ #define _GTMDevLog(...) do { } while (0)
+#endif
+
+#endif // _GTMDevLog
+
+#ifndef _GTMDevAssert
+// we directly invoke the NSAssert handler so we can pass on the varargs
+// (NSAssert doesn't have a macro we can use that takes varargs)
+#if !defined(NS_BLOCK_ASSERTIONS)
+ #define _GTMDevAssert(condition, ...) \
+ do { \
+ if (!(condition)) { \
+ [[NSAssertionHandler currentHandler] \
+ handleFailureInFunction:[NSString stringWithUTF8String:__PRETTY_FUNCTION__] \
+ file:[NSString stringWithUTF8String:__FILE__] \
+ lineNumber:__LINE__ \
+ description:__VA_ARGS__]; \
+ } \
+ } while(0)
+#else // !defined(NS_BLOCK_ASSERTIONS)
+ #define _GTMDevAssert(condition, ...) do { } while (0)
+#endif // !defined(NS_BLOCK_ASSERTIONS)
+
+#endif // _GTMDevAssert
+
+// _GTMCompileAssert
+// _GTMCompileAssert is an assert that is meant to fire at compile time if you
+// want to check things at compile instead of runtime. For example if you
+// want to check that a wchar is 4 bytes instead of 2 you would use
+// _GTMCompileAssert(sizeof(wchar_t) == 4, wchar_t_is_4_bytes_on_OS_X)
+// Note that the second "arg" is not in quotes, and must be a valid processor
+// symbol in it's own right (no spaces, punctuation etc).
+
+// Wrapping this in an #ifndef allows external groups to define their own
+// compile time assert scheme.
+#ifndef _GTMCompileAssert
+ // We got this technique from here:
+ // http://unixjunkie.blogspot.com/2007/10/better-compile-time-asserts_29.html
+
+ #define _GTMCompileAssertSymbolInner(line, msg) _GTMCOMPILEASSERT ## line ## __ ## msg
+ #define _GTMCompileAssertSymbol(line, msg) _GTMCompileAssertSymbolInner(line, msg)
+ #define _GTMCompileAssert(test, msg) \
+ typedef char _GTMCompileAssertSymbol(__LINE__, msg) [ ((test) ? 1 : -1) ]
+#endif // _GTMCompileAssert
+
+// ----------------------------------------------------------------------------
+// CPP symbols defined based on the project settings so the GTM code has
+// simple things to test against w/o scattering the knowledge of project
+// setting through all the code.
+// ----------------------------------------------------------------------------
+
+// Provide a single constant CPP symbol that all of GTM uses for ifdefing
+// iPhone code.
+#if TARGET_OS_IPHONE // iPhone SDK
+ // For iPhone specific stuff
+ #define GTM_IPHONE_SDK 1
+ #if TARGET_IPHONE_SIMULATOR
+ #define GTM_IPHONE_DEVICE 0
+ #define GTM_IPHONE_SIMULATOR 1
+ #else
+ #define GTM_IPHONE_DEVICE 1
+ #define GTM_IPHONE_SIMULATOR 0
+ #endif // TARGET_IPHONE_SIMULATOR
+ // By default, GTM has provided it's own unittesting support, define this
+ // to use the support provided by Xcode, especially for the Xcode4 support
+ // for unittesting.
+ #ifndef GTM_IPHONE_USE_SENTEST
+ #define GTM_IPHONE_USE_SENTEST 0
+ #endif
+ #define GTM_MACOS_SDK 0
+#else
+ // For MacOS specific stuff
+ #define GTM_MACOS_SDK 1
+ #define GTM_IPHONE_SDK 0
+ #define GTM_IPHONE_SIMULATOR 0
+ #define GTM_IPHONE_DEVICE 0
+ #define GTM_IPHONE_USE_SENTEST 0
+#endif
+
+// Some of our own availability macros
+#if GTM_MACOS_SDK
+#define GTM_AVAILABLE_ONLY_ON_IPHONE UNAVAILABLE_ATTRIBUTE
+#define GTM_AVAILABLE_ONLY_ON_MACOS
+#else
+#define GTM_AVAILABLE_ONLY_ON_IPHONE
+#define GTM_AVAILABLE_ONLY_ON_MACOS UNAVAILABLE_ATTRIBUTE
+#endif
+
+// GC was dropped by Apple, define the old constant incase anyone still keys
+// off of it.
+#ifndef GTM_SUPPORT_GC
+ #define GTM_SUPPORT_GC 0
+#endif
+
+// To simplify support for 64bit (and Leopard in general), we provide the type
+// defines for non Leopard SDKs
+#if !(MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5)
+ // NSInteger/NSUInteger and Max/Mins
+ #ifndef NSINTEGER_DEFINED
+ #if (defined(__LP64__) && __LP64__) || NS_BUILD_32_LIKE_64
+ typedef long NSInteger;
+ typedef unsigned long NSUInteger;
+ #else
+ typedef int NSInteger;
+ typedef unsigned int NSUInteger;
+ #endif
+ #define NSIntegerMax LONG_MAX
+ #define NSIntegerMin LONG_MIN
+ #define NSUIntegerMax ULONG_MAX
+ #define NSINTEGER_DEFINED 1
+ #endif // NSINTEGER_DEFINED
+ // CGFloat
+ #ifndef CGFLOAT_DEFINED
+ #if defined(__LP64__) && __LP64__
+ // This really is an untested path (64bit on Tiger?)
+ typedef double CGFloat;
+ #define CGFLOAT_MIN DBL_MIN
+ #define CGFLOAT_MAX DBL_MAX
+ #define CGFLOAT_IS_DOUBLE 1
+ #else /* !defined(__LP64__) || !__LP64__ */
+ typedef float CGFloat;
+ #define CGFLOAT_MIN FLT_MIN
+ #define CGFLOAT_MAX FLT_MAX
+ #define CGFLOAT_IS_DOUBLE 0
+ #endif /* !defined(__LP64__) || !__LP64__ */
+ #define CGFLOAT_DEFINED 1
+ #endif // CGFLOAT_DEFINED
+#endif // MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5
+
+// Some support for advanced clang static analysis functionality
+// See http://clang-analyzer.llvm.org/annotations.html
+#ifndef __has_feature // Optional.
+ #define __has_feature(x) 0 // Compatibility with non-clang compilers.
+#endif
+
+#ifndef NS_RETURNS_RETAINED
+ #if __has_feature(attribute_ns_returns_retained)
+ #define NS_RETURNS_RETAINED __attribute__((ns_returns_retained))
+ #else
+ #define NS_RETURNS_RETAINED
+ #endif
+#endif
+
+#ifndef NS_RETURNS_NOT_RETAINED
+ #if __has_feature(attribute_ns_returns_not_retained)
+ #define NS_RETURNS_NOT_RETAINED __attribute__((ns_returns_not_retained))
+ #else
+ #define NS_RETURNS_NOT_RETAINED
+ #endif
+#endif
+
+#ifndef CF_RETURNS_RETAINED
+ #if __has_feature(attribute_cf_returns_retained)
+ #define CF_RETURNS_RETAINED __attribute__((cf_returns_retained))
+ #else
+ #define CF_RETURNS_RETAINED
+ #endif
+#endif
+
+#ifndef CF_RETURNS_NOT_RETAINED
+ #if __has_feature(attribute_cf_returns_not_retained)
+ #define CF_RETURNS_NOT_RETAINED __attribute__((cf_returns_not_retained))
+ #else
+ #define CF_RETURNS_NOT_RETAINED
+ #endif
+#endif
+
+#ifndef NS_CONSUMED
+ #if __has_feature(attribute_ns_consumed)
+ #define NS_CONSUMED __attribute__((ns_consumed))
+ #else
+ #define NS_CONSUMED
+ #endif
+#endif
+
+#ifndef CF_CONSUMED
+ #if __has_feature(attribute_cf_consumed)
+ #define CF_CONSUMED __attribute__((cf_consumed))
+ #else
+ #define CF_CONSUMED
+ #endif
+#endif
+
+#ifndef NS_CONSUMES_SELF
+ #if __has_feature(attribute_ns_consumes_self)
+ #define NS_CONSUMES_SELF __attribute__((ns_consumes_self))
+ #else
+ #define NS_CONSUMES_SELF
+ #endif
+#endif
+
+// Defined on 10.6 and above.
+#ifndef NS_FORMAT_ARGUMENT
+ #define NS_FORMAT_ARGUMENT(A)
+#endif
+
+// Defined on 10.6 and above.
+#ifndef NS_FORMAT_FUNCTION
+ #define NS_FORMAT_FUNCTION(F,A)
+#endif
+
+// Defined on 10.6 and above.
+#ifndef CF_FORMAT_ARGUMENT
+ #define CF_FORMAT_ARGUMENT(A)
+#endif
+
+// Defined on 10.6 and above.
+#ifndef CF_FORMAT_FUNCTION
+ #define CF_FORMAT_FUNCTION(F,A)
+#endif
+
+#ifndef GTM_NONNULL
+ #if defined(__has_attribute)
+ #if __has_attribute(nonnull)
+ #define GTM_NONNULL(x) __attribute__((nonnull x))
+ #else
+ #define GTM_NONNULL(x)
+ #endif
+ #else
+ #define GTM_NONNULL(x)
+ #endif
+#endif
+
+// Invalidates the initializer from which it's called.
+#ifndef GTMInvalidateInitializer
+ #if __has_feature(objc_arc)
+ #define GTMInvalidateInitializer() \
+ do { \
+ [self class]; /* Avoid warning of dead store to |self|. */ \
+ _GTMDevAssert(NO, @"Invalid initializer."); \
+ return nil; \
+ } while (0)
+ #else
+ #define GTMInvalidateInitializer() \
+ do { \
+ [self release]; \
+ _GTMDevAssert(NO, @"Invalid initializer."); \
+ return nil; \
+ } while (0)
+ #endif
+#endif
+
+#ifndef GTMCFAutorelease
+ #if __has_feature(objc_arc)
+ #define GTMCFAutorelease(x) CFBridgingRelease(x)
+ #else
+ #define GTMCFAutorelease(x) ([(id)x autorelease])
+ #endif
+#endif
+
+#ifdef __OBJC__
+
+// Declared here so that it can easily be used for logging tracking if
+// necessary. See GTMUnitTestDevLog.h for details.
+@class NSString;
+GTM_EXTERN void _GTMUnitTestDevLog(NSString *format, ...) NS_FORMAT_FUNCTION(1, 2);
+
+// Macro to allow you to create NSStrings out of other macros.
+// #define FOO foo
+// NSString *fooString = GTM_NSSTRINGIFY(FOO);
+#if !defined (GTM_NSSTRINGIFY)
+ #define GTM_NSSTRINGIFY_INNER(x) @#x
+ #define GTM_NSSTRINGIFY(x) GTM_NSSTRINGIFY_INNER(x)
+#endif
+
+// Macro to allow fast enumeration when building for 10.5 or later, and
+// reliance on NSEnumerator for 10.4. Remember, NSDictionary w/ FastEnumeration
+// does keys, so pick the right thing, nothing is done on the FastEnumeration
+// side to be sure you're getting what you wanted.
+#ifndef GTM_FOREACH_OBJECT
+ #if TARGET_OS_IPHONE || !(MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5)
+ #define GTM_FOREACH_ENUMEREE(element, enumeration) \
+ for (element in enumeration)
+ #define GTM_FOREACH_OBJECT(element, collection) \
+ for (element in collection)
+ #define GTM_FOREACH_KEY(element, collection) \
+ for (element in collection)
+ #else
+ #define GTM_FOREACH_ENUMEREE(element, enumeration) \
+ for (NSEnumerator *_ ## element ## _enum = enumeration; \
+ (element = [_ ## element ## _enum nextObject]) != nil; )
+ #define GTM_FOREACH_OBJECT(element, collection) \
+ GTM_FOREACH_ENUMEREE(element, [collection objectEnumerator])
+ #define GTM_FOREACH_KEY(element, collection) \
+ GTM_FOREACH_ENUMEREE(element, [collection keyEnumerator])
+ #endif
+#endif
+
+// ============================================================================
+
+// To simplify support for both Leopard and Snow Leopard we declare
+// the Snow Leopard protocols that we need here.
+#if !defined(GTM_10_6_PROTOCOLS_DEFINED) && !(MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_6)
+#define GTM_10_6_PROTOCOLS_DEFINED 1
+@protocol NSConnectionDelegate
+@end
+@protocol NSAnimationDelegate
+@end
+@protocol NSImageDelegate
+@end
+@protocol NSTabViewDelegate
+@end
+#endif // !defined(GTM_10_6_PROTOCOLS_DEFINED) && !(MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_6)
+
+// GTM_SEL_STRING is for specifying selector (usually property) names to KVC
+// or KVO methods.
+// In debug it will generate warnings for undeclared selectors if
+// -Wunknown-selector is turned on.
+// In release it will have no runtime overhead.
+#ifndef GTM_SEL_STRING
+ #ifdef DEBUG
+ #define GTM_SEL_STRING(selName) NSStringFromSelector(@selector(selName))
+ #else
+ #define GTM_SEL_STRING(selName) @#selName
+ #endif // DEBUG
+#endif // GTM_SEL_STRING
+
+#endif // __OBJC__
diff --git a/3rdParty/Breakpad/src/common/mac/GTMLogger.h b/3rdParty/Breakpad/src/common/mac/GTMLogger.h
new file mode 100644
index 0000000..c4fd140
--- /dev/null
+++ b/3rdParty/Breakpad/src/common/mac/GTMLogger.h
@@ -0,0 +1,504 @@
+//
+// GTMLogger.h
+//
+// Copyright 2007-2008 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License"); you may not
+// use this file except in compliance with the License. You may obtain a copy
+// of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+// License for the specific language governing permissions and limitations under
+// the License.
+//
+
+// Key Abstractions
+// ----------------
+//
+// This file declares multiple classes and protocols that are used by the
+// GTMLogger logging system. The 4 main abstractions used in this file are the
+// following:
+//
+// * logger (GTMLogger) - The main logging class that users interact with. It
+// has methods for logging at different levels and uses a log writer, a log
+// formatter, and a log filter to get the job done.
+//
+// * log writer (GTMLogWriter) - Writes a given string to some log file, where
+// a "log file" can be a physical file on disk, a POST over HTTP to some URL,
+// or even some in-memory structure (e.g., a ring buffer).
+//
+// * log formatter (GTMLogFormatter) - Given a format string and arguments as
+// a va_list, returns a single formatted NSString. A "formatted string" could
+// be a string with the date prepended, a string with values in a CSV format,
+// or even a string of XML.
+//
+// * log filter (GTMLogFilter) - Given a formatted log message as an NSString
+// and the level at which the message is to be logged, this class will decide
+// whether the given message should be logged or not. This is a flexible way
+// to filter out messages logged at a certain level, messages that contain
+// certain text, or filter nothing out at all. This gives the caller the
+// flexibility to dynamically enable debug logging in Release builds.
+//
+// This file also declares some classes to handle the common log writer, log
+// formatter, and log filter cases. Callers can also create their own writers,
+// formatters, and filters and they can even build them on top of the ones
+// declared here. Keep in mind that your custom writer/formatter/filter may be
+// called from multiple threads, so it must be thread-safe.
+
+#import <Foundation/Foundation.h>
+#import "GTMDefines.h"
+
+// Predeclaration of used protocols that are declared later in this file.
+@protocol GTMLogWriter, GTMLogFormatter, GTMLogFilter;
+
+// GTMLogger
+//
+// GTMLogger is the primary user-facing class for an object-oriented logging
+// system. It is built on the concept of log formatters (GTMLogFormatter), log
+// writers (GTMLogWriter), and log filters (GTMLogFilter). When a message is
+// sent to a GTMLogger to log a message, the message is formatted using the log
+// formatter, then the log filter is consulted to see if the message should be
+// logged, and if so, the message is sent to the log writer to be written out.
+//
+// GTMLogger is intended to be a flexible and thread-safe logging solution. Its
+// flexibility comes from the fact that GTMLogger instances can be customized
+// with user defined formatters, filters, and writers. And these writers,
+// filters, and formatters can be combined, stacked, and customized in arbitrary
+// ways to suit the needs at hand. For example, multiple writers can be used at
+// the same time, and a GTMLogger instance can even be used as another
+// GTMLogger's writer. This allows for arbitrarily deep logging trees.
+//
+// A standard GTMLogger uses a writer that sends messages to standard out, a
+// formatter that smacks a timestamp and a few other bits of interesting
+// information on the message, and a filter that filters out debug messages from
+// release builds. Using the standard log settings, a log message will look like
+// the following:
+//
+// 2007-12-30 10:29:24.177 myapp[4588/0xa07d0f60] [lvl=1] foo=<Foo: 0x123>
+//
+// The output contains the date and time of the log message, the name of the
+// process followed by its process ID/thread ID, the log level at which the
+// message was logged (in the previous example the level was 1:
+// kGTMLoggerLevelDebug), and finally, the user-specified log message itself (in
+// this case, the log message was @"foo=%@", foo).
+//
+// Multiple instances of GTMLogger can be created, each configured their own
+// way. Though GTMLogger is not a singleton (in the GoF sense), it does provide
+// access to a shared (i.e., globally accessible) GTMLogger instance. This makes
+// it convenient for all code in a process to use the same GTMLogger instance.
+// The shared GTMLogger instance can also be configured in an arbitrary, and
+// these configuration changes will affect all code that logs through the shared
+// instance.
+
+//
+// Log Levels
+// ----------
+// GTMLogger has 3 different log levels: Debug, Info, and Error. GTMLogger
+// doesn't take any special action based on the log level; it simply forwards
+// this information on to formatters, filters, and writers, each of which may
+// optionally take action based on the level. Since log level filtering is
+// performed at runtime, log messages are typically not filtered out at compile
+// time. The exception to this rule is that calls to the GTMLoggerDebug() macro
+// *ARE* filtered out of non-DEBUG builds. This is to be backwards compatible
+// with behavior that many developers are currently used to. Note that this
+// means that GTMLoggerDebug(@"hi") will be compiled out of Release builds, but
+// [[GTMLogger sharedLogger] logDebug:@"hi"] will NOT be compiled out.
+//
+// Standard loggers are created with the GTMLogLevelFilter log filter, which
+// filters out certain log messages based on log level, and some other settings.
+//
+// In addition to the -logDebug:, -logInfo:, and -logError: methods defined on
+// GTMLogger itself, there are also C macros that make usage of the shared
+// GTMLogger instance very convenient. These macros are:
+//
+// GTMLoggerDebug(...)
+// GTMLoggerInfo(...)
+// GTMLoggerError(...)
+//
+// Again, a notable feature of these macros is that GTMLogDebug() calls *will be
+// compiled out of non-DEBUG builds*.
+//
+// Standard Loggers
+// ----------------
+// GTMLogger has the concept of "standard loggers". A standard logger is simply
+// a logger that is pre-configured with some standard/common writer, formatter,
+// and filter combination. Standard loggers are created using the creation
+// methods beginning with "standard". The alternative to a standard logger is a
+// regular logger, which will send messages to stdout, with no special
+// formatting, and no filtering.
+//
+// How do I use GTMLogger?
+// ----------------------
+// The typical way you will want to use GTMLogger is to simply use the
+// GTMLogger*() macros for logging from code. That way we can easily make
+// changes to the GTMLogger class and simply update the macros accordingly. Only
+// your application startup code (perhaps, somewhere in main()) should use the
+// GTMLogger class directly in order to configure the shared logger, which all
+// of the code using the macros will be using. Again, this is just the typical
+// situation.
+//
+// To be complete, there are cases where you may want to use GTMLogger directly,
+// or even create separate GTMLogger instances for some reason. That's fine,
+// too.
+//
+// Examples
+// --------
+// The following show some common GTMLogger use cases.
+//
+// 1. You want to log something as simply as possible. Also, this call will only
+// appear in debug builds. In non-DEBUG builds it will be completely removed.
+//
+// GTMLoggerDebug(@"foo = %@", foo);
+//
+// 2. The previous example is similar to the following. The major difference is
+// that the previous call (example 1) will be compiled out of Release builds
+// but this statement will not be compiled out.
+//
+// [[GTMLogger sharedLogger] logDebug:@"foo = %@", foo];
+//
+// 3. Send all logging output from the shared logger to a file. We do this by
+// creating an NSFileHandle for writing associated with a file, and setting
+// that file handle as the logger's writer.
+//
+// NSFileHandle *f = [NSFileHandle fileHandleForWritingAtPath:@"/tmp/f.log"
+// create:YES];
+// [[GTMLogger sharedLogger] setWriter:f];
+// GTMLoggerError(@"hi"); // This will be sent to /tmp/f.log
+//
+// 4. Create a new GTMLogger that will log to a file. This example differs from
+// the previous one because here we create a new GTMLogger that is different
+// from the shared logger.
+//
+// GTMLogger *logger = [GTMLogger standardLoggerWithPath:@"/tmp/temp.log"];
+// [logger logInfo:@"hi temp log file"];
+//
+// 5. Create a logger that writes to stdout and does NOT do any formatting to
+// the log message. This might be useful, for example, when writing a help
+// screen for a command-line tool to standard output.
+//
+// GTMLogger *logger = [GTMLogger logger];
+// [logger logInfo:@"%@ version 0.1 usage", progName];
+//
+// 6. Send log output to stdout AND to a log file. The trick here is that
+// NSArrays function as composite log writers, which means when an array is
+// set as the log writer, it forwards all logging messages to all of its
+// contained GTMLogWriters.
+//
+// // Create array of GTMLogWriters
+// NSArray *writers = [NSArray arrayWithObjects:
+// [NSFileHandle fileHandleForWritingAtPath:@"/tmp/f.log" create:YES],
+// [NSFileHandle fileHandleWithStandardOutput], nil];
+//
+// GTMLogger *logger = [GTMLogger standardLogger];
+// [logger setWriter:writers];
+// [logger logInfo:@"hi"]; // Output goes to stdout and /tmp/f.log
+//
+// For futher details on log writers, formatters, and filters, see the
+// documentation below.
+//
+// NOTE: GTMLogger is application level logging. By default it does nothing
+// with _GTMDevLog/_GTMDevAssert (see GTMDefines.h). An application can choose
+// to bridge _GTMDevLog/_GTMDevAssert to GTMLogger by providing macro
+// definitions in its prefix header (see GTMDefines.h for how one would do
+// that).
+//
+@interface GTMLogger : NSObject {
+ @private
+ id<GTMLogWriter> writer_;
+ id<GTMLogFormatter> formatter_;
+ id<GTMLogFilter> filter_;
+}
+
+//
+// Accessors for the shared logger instance
+//
+
+// Returns a shared/global standard GTMLogger instance. Callers should typically
+// use this method to get a GTMLogger instance, unless they explicitly want
+// their own instance to configure for their own needs. This is the only method
+// that returns a shared instance; all the rest return new GTMLogger instances.
++ (id)sharedLogger;
+
+// Sets the shared logger instance to |logger|. Future calls to +sharedLogger
+// will return |logger| instead.
++ (void)setSharedLogger:(GTMLogger *)logger;
+
+//
+// Creation methods
+//
+
+// Returns a new autoreleased GTMLogger instance that will log to stdout, using
+// the GTMLogStandardFormatter, and the GTMLogLevelFilter filter.
++ (id)standardLogger;
+
+// Same as +standardLogger, but logs to stderr.
++ (id)standardLoggerWithStderr;
+
+// Same as +standardLogger but levels >= kGTMLoggerLevelError are routed to
+// stderr, everything else goes to stdout.
++ (id)standardLoggerWithStdoutAndStderr;
+
+// Returns a new standard GTMLogger instance with a log writer that will
+// write to the file at |path|, and will use the GTMLogStandardFormatter and
+// GTMLogLevelFilter classes. If |path| does not exist, it will be created.
++ (id)standardLoggerWithPath:(NSString *)path;
+
+// Returns an autoreleased GTMLogger instance that will use the specified
+// |writer|, |formatter|, and |filter|.
++ (id)loggerWithWriter:(id<GTMLogWriter>)writer
+ formatter:(id<GTMLogFormatter>)formatter
+ filter:(id<GTMLogFilter>)filter;
+
+// Returns an autoreleased GTMLogger instance that logs to stdout, with the
+// basic formatter, and no filter. The returned logger differs from the logger
+// returned by +standardLogger because this one does not do any filtering and
+// does not do any special log formatting; this is the difference between a
+// "regular" logger and a "standard" logger.
++ (id)logger;
+
+// Designated initializer. This method returns a GTMLogger initialized with the
+// specified |writer|, |formatter|, and |filter|. See the setter methods below
+// for what values will be used if nil is passed for a parameter.
+- (id)initWithWriter:(id<GTMLogWriter>)writer
+ formatter:(id<GTMLogFormatter>)formatter
+ filter:(id<GTMLogFilter>)filter;
+
+//
+// Logging methods
+//
+
+// Logs a message at the debug level (kGTMLoggerLevelDebug).
+- (void)logDebug:(NSString *)fmt, ... NS_FORMAT_FUNCTION(1, 2);
+// Logs a message at the info level (kGTMLoggerLevelInfo).
+- (void)logInfo:(NSString *)fmt, ... NS_FORMAT_FUNCTION(1, 2);
+// Logs a message at the error level (kGTMLoggerLevelError).
+- (void)logError:(NSString *)fmt, ... NS_FORMAT_FUNCTION(1, 2);
+// Logs a message at the assert level (kGTMLoggerLevelAssert).
+- (void)logAssert:(NSString *)fmt, ... NS_FORMAT_FUNCTION(1, 2);
+
+
+//
+// Accessors
+//
+
+// Accessor methods for the log writer. If the log writer is set to nil,
+// [NSFileHandle fileHandleWithStandardOutput] is used.
+- (id<GTMLogWriter>)writer;
+- (void)setWriter:(id<GTMLogWriter>)writer;
+
+// Accessor methods for the log formatter. If the log formatter is set to nil,
+// GTMLogBasicFormatter is used. This formatter will format log messages in a
+// plain printf style.
+- (id<GTMLogFormatter>)formatter;
+- (void)setFormatter:(id<GTMLogFormatter>)formatter;
+
+// Accessor methods for the log filter. If the log filter is set to nil,
+// GTMLogNoFilter is used, which allows all log messages through.
+- (id<GTMLogFilter>)filter;
+- (void)setFilter:(id<GTMLogFilter>)filter;
+
+@end // GTMLogger
+
+
+// Helper functions that are used by the convenience GTMLogger*() macros that
+// enable the logging of function names.
+@interface GTMLogger (GTMLoggerMacroHelpers)
+- (void)logFuncDebug:(const char *)func msg:(NSString *)fmt, ...
+ NS_FORMAT_FUNCTION(2, 3);
+- (void)logFuncInfo:(const char *)func msg:(NSString *)fmt, ...
+ NS_FORMAT_FUNCTION(2, 3);
+- (void)logFuncError:(const char *)func msg:(NSString *)fmt, ...
+ NS_FORMAT_FUNCTION(2, 3);
+- (void)logFuncAssert:(const char *)func msg:(NSString *)fmt, ...
+ NS_FORMAT_FUNCTION(2, 3);
+@end // GTMLoggerMacroHelpers
+
+
+// The convenience macros are only defined if they haven't already been defined.
+#ifndef GTMLoggerInfo
+
+// Convenience macros that log to the shared GTMLogger instance. These macros
+// are how users should typically log to GTMLogger. Notice that GTMLoggerDebug()
+// calls will be compiled out of non-Debug builds.
+#define GTMLoggerDebug(...) \
+ [[GTMLogger sharedLogger] logFuncDebug:__func__ msg:__VA_ARGS__]
+#define GTMLoggerInfo(...) \
+ [[GTMLogger sharedLogger] logFuncInfo:__func__ msg:__VA_ARGS__]
+#define GTMLoggerError(...) \
+ [[GTMLogger sharedLogger] logFuncError:__func__ msg:__VA_ARGS__]
+#define GTMLoggerAssert(...) \
+ [[GTMLogger sharedLogger] logFuncAssert:__func__ msg:__VA_ARGS__]
+
+// If we're not in a debug build, remove the GTMLoggerDebug statements. This
+// makes calls to GTMLoggerDebug "compile out" of Release builds
+#ifndef DEBUG
+#undef GTMLoggerDebug
+#define GTMLoggerDebug(...) do {} while(0)
+#endif
+
+#endif // !defined(GTMLoggerInfo)
+
+// Log levels.
+typedef enum {
+ kGTMLoggerLevelUnknown,
+ kGTMLoggerLevelDebug,
+ kGTMLoggerLevelInfo,
+ kGTMLoggerLevelError,
+ kGTMLoggerLevelAssert,
+} GTMLoggerLevel;
+
+
+//
+// Log Writers
+//
+
+// Protocol to be implemented by a GTMLogWriter instance.
+@protocol GTMLogWriter <NSObject>
+// Writes the given log message to where the log writer is configured to write.
+- (void)logMessage:(NSString *)msg level:(GTMLoggerLevel)level;
+@end // GTMLogWriter
+
+
+// Simple category on NSFileHandle that makes NSFileHandles valid log writers.
+// This is convenient because something like, say, +fileHandleWithStandardError
+// now becomes a valid log writer. Log messages are written to the file handle
+// with a newline appended.
+@interface NSFileHandle (GTMFileHandleLogWriter) <GTMLogWriter>
+// Opens the file at |path| in append mode, and creates the file with |mode|
+// if it didn't previously exist.
++ (id)fileHandleForLoggingAtPath:(NSString *)path mode:(mode_t)mode;
+@end // NSFileHandle
+
+
+// This category makes NSArray a GTMLogWriter that can be composed of other
+// GTMLogWriters. This is the classic Composite GoF design pattern. When the
+// GTMLogWriter -logMessage:level: message is sent to the array, the array
+// forwards the message to all of its elements that implement the GTMLogWriter
+// protocol.
+//
+// This is useful in situations where you would like to send log output to
+// multiple log writers at the same time. Simply create an NSArray of the log
+// writers you wish to use, then set the array as the "writer" for your
+// GTMLogger instance.
+@interface NSArray (GTMArrayCompositeLogWriter) <GTMLogWriter>
+@end // GTMArrayCompositeLogWriter
+
+
+// This category adapts the GTMLogger interface so that it can be used as a log
+// writer; it's an "adapter" in the GoF Adapter pattern sense.
+//
+// This is useful when you want to configure a logger to log to a specific
+// writer with a specific formatter and/or filter. But you want to also compose
+// that with a different log writer that may have its own formatter and/or
+// filter.
+@interface GTMLogger (GTMLoggerLogWriter) <GTMLogWriter>
+@end // GTMLoggerLogWriter
+
+
+//
+// Log Formatters
+//
+
+// Protocol to be implemented by a GTMLogFormatter instance.
+@protocol GTMLogFormatter <NSObject>
+// Returns a formatted string using the format specified in |fmt| and the va
+// args specified in |args|.
+- (NSString *)stringForFunc:(NSString *)func
+ withFormat:(NSString *)fmt
+ valist:(va_list)args
+ level:(GTMLoggerLevel)level NS_FORMAT_FUNCTION(2, 0);
+@end // GTMLogFormatter
+
+
+// A basic log formatter that formats a string the same way that NSLog (or
+// printf) would. It does not do anything fancy, nor does it add any data of its
+// own.
+@interface GTMLogBasicFormatter : NSObject <GTMLogFormatter>
+
+// Helper method for prettying C99 __func__ and GCC __PRETTY_FUNCTION__
+- (NSString *)prettyNameForFunc:(NSString *)func;
+
+@end // GTMLogBasicFormatter
+
+
+// A log formatter that formats the log string like the basic formatter, but
+// also prepends a timestamp and some basic process info to the message, as
+// shown in the following sample output.
+// 2007-12-30 10:29:24.177 myapp[4588/0xa07d0f60] [lvl=1] log mesage here
+@interface GTMLogStandardFormatter : GTMLogBasicFormatter {
+ @private
+ NSDateFormatter *dateFormatter_; // yyyy-MM-dd HH:mm:ss.SSS
+ NSString *pname_;
+ pid_t pid_;
+}
+@end // GTMLogStandardFormatter
+
+
+//
+// Log Filters
+//
+
+// Protocol to be imlemented by a GTMLogFilter instance.
+@protocol GTMLogFilter <NSObject>
+// Returns YES if |msg| at |level| should be filtered out; NO otherwise.
+- (BOOL)filterAllowsMessage:(NSString *)msg level:(GTMLoggerLevel)level;
+@end // GTMLogFilter
+
+
+// A log filter that filters messages at the kGTMLoggerLevelDebug level out of
+// non-debug builds. Messages at the kGTMLoggerLevelInfo level are also filtered
+// out of non-debug builds unless GTMVerboseLogging is set in the environment or
+// the processes's defaults. Messages at the kGTMLoggerLevelError level are
+// never filtered.
+@interface GTMLogLevelFilter : NSObject <GTMLogFilter>
+@end // GTMLogLevelFilter
+
+// A simple log filter that does NOT filter anything out;
+// -filterAllowsMessage:level will always return YES. This can be a convenient
+// way to enable debug-level logging in release builds (if you so desire).
+@interface GTMLogNoFilter : NSObject <GTMLogFilter>
+@end // GTMLogNoFilter
+
+
+// Base class for custom level filters. Not for direct use, use the minimum
+// or maximum level subclasses below.
+@interface GTMLogAllowedLevelFilter : NSObject <GTMLogFilter> {
+ @private
+ NSIndexSet *allowedLevels_;
+}
+@end
+
+// A log filter that allows you to set a minimum log level. Messages below this
+// level will be filtered.
+@interface GTMLogMininumLevelFilter : GTMLogAllowedLevelFilter
+
+// Designated initializer, logs at levels < |level| will be filtered.
+- (id)initWithMinimumLevel:(GTMLoggerLevel)level;
+
+@end
+
+// A log filter that allows you to set a maximum log level. Messages whose level
+// exceeds this level will be filtered. This is really only useful if you have
+// a composite GTMLogger that is sending the other messages elsewhere.
+@interface GTMLogMaximumLevelFilter : GTMLogAllowedLevelFilter
+
+// Designated initializer, logs at levels > |level| will be filtered.
+- (id)initWithMaximumLevel:(GTMLoggerLevel)level;
+
+@end
+
+
+// For subclasses only
+@interface GTMLogger (PrivateMethods)
+
+- (void)logInternalFunc:(const char *)func
+ format:(NSString *)fmt
+ valist:(va_list)args
+ level:(GTMLoggerLevel)level NS_FORMAT_FUNCTION(2, 0);
+
+@end
+
diff --git a/3rdParty/Breakpad/src/common/mac/GTMLogger.m b/3rdParty/Breakpad/src/common/mac/GTMLogger.m
new file mode 100644
index 0000000..ebc5836
--- /dev/null
+++ b/3rdParty/Breakpad/src/common/mac/GTMLogger.m
@@ -0,0 +1,611 @@
+//
+// GTMLogger.m
+//
+// Copyright 2007-2008 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License"); you may not
+// use this file except in compliance with the License. You may obtain a copy
+// of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+// License for the specific language governing permissions and limitations under
+// the License.
+//
+
+#import "GTMLogger.h"
+#import <fcntl.h>
+#import <unistd.h>
+#import <stdlib.h>
+#import <pthread.h>
+
+
+#if !defined(__clang__) && (__GNUC__*10+__GNUC_MINOR__ >= 42)
+// Some versions of GCC (4.2 and below AFAIK) aren't great about supporting
+// -Wmissing-format-attribute
+// when the function is anything more complex than foo(NSString *fmt, ...).
+// You see the error inside the function when you turn ... into va_args and
+// attempt to call another function (like vsprintf for example).
+// So we just shut off the warning for this file. We reenable it at the end.
+#pragma GCC diagnostic ignored "-Wmissing-format-attribute"
+#endif // !__clang__
+
+// Reference to the shared GTMLogger instance. This is not a singleton, it's
+// just an easy reference to one shared instance.
+static GTMLogger *gSharedLogger = nil;
+
+
+@implementation GTMLogger
+
+// Returns a pointer to the shared logger instance. If none exists, a standard
+// logger is created and returned.
++ (id)sharedLogger {
+ @synchronized(self) {
+ if (gSharedLogger == nil) {
+ gSharedLogger = [[self standardLogger] retain];
+ }
+ }
+ return [[gSharedLogger retain] autorelease];
+}
+
++ (void)setSharedLogger:(GTMLogger *)logger {
+ @synchronized(self) {
+ [gSharedLogger autorelease];
+ gSharedLogger = [logger retain];
+ }
+}
+
++ (id)standardLogger {
+ // Don't trust NSFileHandle not to throw
+ @try {
+ id<GTMLogWriter> writer = [NSFileHandle fileHandleWithStandardOutput];
+ id<GTMLogFormatter> fr = [[[GTMLogStandardFormatter alloc] init]
+ autorelease];
+ id<GTMLogFilter> filter = [[[GTMLogLevelFilter alloc] init] autorelease];
+ return [[[self alloc] initWithWriter:writer
+ formatter:fr
+ filter:filter] autorelease];
+ }
+ @catch (id e) {
+ // Ignored
+ }
+ return nil;
+}
+
++ (id)standardLoggerWithStderr {
+ // Don't trust NSFileHandle not to throw
+ @try {
+ id me = [self standardLogger];
+ [me setWriter:[NSFileHandle fileHandleWithStandardError]];
+ return me;
+ }
+ @catch (id e) {
+ // Ignored
+ }
+ return nil;
+}
+
++ (id)standardLoggerWithStdoutAndStderr {
+ // We're going to take advantage of the GTMLogger to GTMLogWriter adaptor
+ // and create a composite logger that an outer "standard" logger can use
+ // as a writer. Our inner loggers should apply no formatting since the main
+ // logger does that and we want the caller to be able to change formatters
+ // or add writers without knowing the inner structure of our composite.
+
+ // Don't trust NSFileHandle not to throw
+ @try {
+ GTMLogBasicFormatter *formatter = [[[GTMLogBasicFormatter alloc] init]
+ autorelease];
+ GTMLogger *stdoutLogger =
+ [self loggerWithWriter:[NSFileHandle fileHandleWithStandardOutput]
+ formatter:formatter
+ filter:[[[GTMLogMaximumLevelFilter alloc]
+ initWithMaximumLevel:kGTMLoggerLevelInfo]
+ autorelease]];
+ GTMLogger *stderrLogger =
+ [self loggerWithWriter:[NSFileHandle fileHandleWithStandardError]
+ formatter:formatter
+ filter:[[[GTMLogMininumLevelFilter alloc]
+ initWithMinimumLevel:kGTMLoggerLevelError]
+ autorelease]];
+ GTMLogger *compositeWriter =
+ [self loggerWithWriter:[NSArray arrayWithObjects:
+ stdoutLogger, stderrLogger, nil]
+ formatter:formatter
+ filter:[[[GTMLogNoFilter alloc] init] autorelease]];
+ GTMLogger *outerLogger = [self standardLogger];
+ [outerLogger setWriter:compositeWriter];
+ return outerLogger;
+ }
+ @catch (id e) {
+ // Ignored
+ }
+ return nil;
+}
+
++ (id)standardLoggerWithPath:(NSString *)path {
+ @try {
+ NSFileHandle *fh = [NSFileHandle fileHandleForLoggingAtPath:path mode:0644];
+ if (fh == nil) return nil;
+ id me = [self standardLogger];
+ [me setWriter:fh];
+ return me;
+ }
+ @catch (id e) {
+ // Ignored
+ }
+ return nil;
+}
+
++ (id)loggerWithWriter:(id<GTMLogWriter>)writer
+ formatter:(id<GTMLogFormatter>)formatter
+ filter:(id<GTMLogFilter>)filter {
+ return [[[self alloc] initWithWriter:writer
+ formatter:formatter
+ filter:filter] autorelease];
+}
+
++ (id)logger {
+ return [[[self alloc] init] autorelease];
+}
+
+- (id)init {
+ return [self initWithWriter:nil formatter:nil filter:nil];
+}
+
+- (id)initWithWriter:(id<GTMLogWriter>)writer
+ formatter:(id<GTMLogFormatter>)formatter
+ filter:(id<GTMLogFilter>)filter {
+ if ((self = [super init])) {
+ [self setWriter:writer];
+ [self setFormatter:formatter];
+ [self setFilter:filter];
+ }
+ return self;
+}
+
+- (void)dealloc {
+ // Unlikely, but |writer_| may be an NSFileHandle, which can throw
+ @try {
+ [formatter_ release];
+ [filter_ release];
+ [writer_ release];
+ }
+ @catch (id e) {
+ // Ignored
+ }
+ [super dealloc];
+}
+
+- (id<GTMLogWriter>)writer {
+ return [[writer_ retain] autorelease];
+}
+
+- (void)setWriter:(id<GTMLogWriter>)writer {
+ @synchronized(self) {
+ [writer_ autorelease];
+ writer_ = nil;
+ if (writer == nil) {
+ // Try to use stdout, but don't trust NSFileHandle
+ @try {
+ writer_ = [[NSFileHandle fileHandleWithStandardOutput] retain];
+ }
+ @catch (id e) {
+ // Leave |writer_| nil
+ }
+ } else {
+ writer_ = [writer retain];
+ }
+ }
+}
+
+- (id<GTMLogFormatter>)formatter {
+ return [[formatter_ retain] autorelease];
+}
+
+- (void)setFormatter:(id<GTMLogFormatter>)formatter {
+ @synchronized(self) {
+ [formatter_ autorelease];
+ formatter_ = nil;
+ if (formatter == nil) {
+ @try {
+ formatter_ = [[GTMLogBasicFormatter alloc] init];
+ }
+ @catch (id e) {
+ // Leave |formatter_| nil
+ }
+ } else {
+ formatter_ = [formatter retain];
+ }
+ }
+}
+
+- (id<GTMLogFilter>)filter {
+ return [[filter_ retain] autorelease];
+}
+
+- (void)setFilter:(id<GTMLogFilter>)filter {
+ @synchronized(self) {
+ [filter_ autorelease];
+ filter_ = nil;
+ if (filter == nil) {
+ @try {
+ filter_ = [[GTMLogNoFilter alloc] init];
+ }
+ @catch (id e) {
+ // Leave |filter_| nil
+ }
+ } else {
+ filter_ = [filter retain];
+ }
+ }
+}
+
+- (void)logDebug:(NSString *)fmt, ... {
+ va_list args;
+ va_start(args, fmt);
+ [self logInternalFunc:NULL format:fmt valist:args level:kGTMLoggerLevelDebug];
+ va_end(args);
+}
+
+- (void)logInfo:(NSString *)fmt, ... {
+ va_list args;
+ va_start(args, fmt);
+ [self logInternalFunc:NULL format:fmt valist:args level:kGTMLoggerLevelInfo];
+ va_end(args);
+}
+
+- (void)logError:(NSString *)fmt, ... {
+ va_list args;
+ va_start(args, fmt);
+ [self logInternalFunc:NULL format:fmt valist:args level:kGTMLoggerLevelError];
+ va_end(args);
+}
+
+- (void)logAssert:(NSString *)fmt, ... {
+ va_list args;
+ va_start(args, fmt);
+ [self logInternalFunc:NULL format:fmt valist:args level:kGTMLoggerLevelAssert];
+ va_end(args);
+}
+
+@end // GTMLogger
+
+@implementation GTMLogger (GTMLoggerMacroHelpers)
+
+- (void)logFuncDebug:(const char *)func msg:(NSString *)fmt, ... {
+ va_list args;
+ va_start(args, fmt);
+ [self logInternalFunc:func format:fmt valist:args level:kGTMLoggerLevelDebug];
+ va_end(args);
+}
+
+- (void)logFuncInfo:(const char *)func msg:(NSString *)fmt, ... {
+ va_list args;
+ va_start(args, fmt);
+ [self logInternalFunc:func format:fmt valist:args level:kGTMLoggerLevelInfo];
+ va_end(args);
+}
+
+- (void)logFuncError:(const char *)func msg:(NSString *)fmt, ... {
+ va_list args;
+ va_start(args, fmt);
+ [self logInternalFunc:func format:fmt valist:args level:kGTMLoggerLevelError];
+ va_end(args);
+}
+
+- (void)logFuncAssert:(const char *)func msg:(NSString *)fmt, ... {
+ va_list args;
+ va_start(args, fmt);
+ [self logInternalFunc:func format:fmt valist:args level:kGTMLoggerLevelAssert];
+ va_end(args);
+}
+
+@end // GTMLoggerMacroHelpers
+
+@implementation GTMLogger (PrivateMethods)
+
+- (void)logInternalFunc:(const char *)func
+ format:(NSString *)fmt
+ valist:(va_list)args
+ level:(GTMLoggerLevel)level {
+ // Primary point where logging happens, logging should never throw, catch
+ // everything.
+ @try {
+ NSString *fname = func ? [NSString stringWithUTF8String:func] : nil;
+ NSString *msg = [formatter_ stringForFunc:fname
+ withFormat:fmt
+ valist:args
+ level:level];
+ if (msg && [filter_ filterAllowsMessage:msg level:level])
+ [writer_ logMessage:msg level:level];
+ }
+ @catch (id e) {
+ // Ignored
+ }
+}
+
+@end // PrivateMethods
+
+
+@implementation NSFileHandle (GTMFileHandleLogWriter)
+
++ (id)fileHandleForLoggingAtPath:(NSString *)path mode:(mode_t)mode {
+ int fd = -1;
+ if (path) {
+ int flags = O_WRONLY | O_APPEND | O_CREAT;
+ fd = open([path fileSystemRepresentation], flags, mode);
+ }
+ if (fd == -1) return nil;
+ return [[[self alloc] initWithFileDescriptor:fd
+ closeOnDealloc:YES] autorelease];
+}
+
+- (void)logMessage:(NSString *)msg level:(GTMLoggerLevel)level {
+ @synchronized(self) {
+ // Closed pipes should not generate exceptions in our caller. Catch here
+ // as well [GTMLogger logInternalFunc:...] so that an exception in this
+ // writer does not prevent other writers from having a chance.
+ @try {
+ NSString *line = [NSString stringWithFormat:@"%@\n", msg];
+ [self writeData:[line dataUsingEncoding:NSUTF8StringEncoding]];
+ }
+ @catch (id e) {
+ // Ignored
+ }
+ }
+}
+
+@end // GTMFileHandleLogWriter
+
+
+@implementation NSArray (GTMArrayCompositeLogWriter)
+
+- (void)logMessage:(NSString *)msg level:(GTMLoggerLevel)level {
+ @synchronized(self) {
+ id<GTMLogWriter> child = nil;
+ GTM_FOREACH_OBJECT(child, self) {
+ if ([child conformsToProtocol:@protocol(GTMLogWriter)])
+ [child logMessage:msg level:level];
+ }
+ }
+}
+
+@end // GTMArrayCompositeLogWriter
+
+
+@implementation GTMLogger (GTMLoggerLogWriter)
+
+- (void)logMessage:(NSString *)msg level:(GTMLoggerLevel)level {
+ switch (level) {
+ case kGTMLoggerLevelDebug:
+ [self logDebug:@"%@", msg];
+ break;
+ case kGTMLoggerLevelInfo:
+ [self logInfo:@"%@", msg];
+ break;
+ case kGTMLoggerLevelError:
+ [self logError:@"%@", msg];
+ break;
+ case kGTMLoggerLevelAssert:
+ [self logAssert:@"%@", msg];
+ break;
+ default:
+ // Ignore the message.
+ break;
+ }
+}
+
+@end // GTMLoggerLogWriter
+
+
+@implementation GTMLogBasicFormatter
+
+- (NSString *)prettyNameForFunc:(NSString *)func {
+ NSString *name = [func stringByTrimmingCharactersInSet:
+ [NSCharacterSet whitespaceAndNewlineCharacterSet]];
+ NSString *function = @"(unknown)";
+ if ([name length]) {
+ if (// Objective C __func__ and __PRETTY_FUNCTION__
+ [name hasPrefix:@"-["] || [name hasPrefix:@"+["] ||
+ // C++ __PRETTY_FUNCTION__ and other preadorned formats
+ [name hasSuffix:@")"]) {
+ function = name;
+ } else {
+ // Assume C99 __func__
+ function = [NSString stringWithFormat:@"%@()", name];
+ }
+ }
+ return function;
+}
+
+- (NSString *)stringForFunc:(NSString *)func
+ withFormat:(NSString *)fmt
+ valist:(va_list)args
+ level:(GTMLoggerLevel)level {
+ // Performance note: We may want to do a quick check here to see if |fmt|
+ // contains a '%', and if not, simply return 'fmt'.
+ if (!(fmt && args)) return nil;
+ return [[[NSString alloc] initWithFormat:fmt arguments:args] autorelease];
+}
+
+@end // GTMLogBasicFormatter
+
+
+@implementation GTMLogStandardFormatter
+
+- (id)init {
+ if ((self = [super init])) {
+ dateFormatter_ = [[NSDateFormatter alloc] init];
+ [dateFormatter_ setFormatterBehavior:NSDateFormatterBehavior10_4];
+ [dateFormatter_ setDateFormat:@"yyyy-MM-dd HH:mm:ss.SSS"];
+ pname_ = [[[NSProcessInfo processInfo] processName] copy];
+ pid_ = [[NSProcessInfo processInfo] processIdentifier];
+ if (!(dateFormatter_ && pname_)) {
+ [self release];
+ return nil;
+ }
+ }
+ return self;
+}
+
+- (void)dealloc {
+ [dateFormatter_ release];
+ [pname_ release];
+ [super dealloc];
+}
+
+- (NSString *)stringForFunc:(NSString *)func
+ withFormat:(NSString *)fmt
+ valist:(va_list)args
+ level:(GTMLoggerLevel)level {
+ NSString *tstamp = nil;
+ @synchronized (dateFormatter_) {
+ tstamp = [dateFormatter_ stringFromDate:[NSDate date]];
+ }
+ return [NSString stringWithFormat:@"%@ %@[%d/%p] [lvl=%d] %@ %@",
+ tstamp, pname_, pid_, pthread_self(),
+ level, [self prettyNameForFunc:func],
+ // |super| has guard for nil |fmt| and |args|
+ [super stringForFunc:func withFormat:fmt valist:args level:level]];
+}
+
+@end // GTMLogStandardFormatter
+
+
+@implementation GTMLogLevelFilter
+
+// Check the environment and the user preferences for the GTMVerboseLogging key
+// to see if verbose logging has been enabled. The environment variable will
+// override the defaults setting, so check the environment first.
+// COV_NF_START
+static BOOL IsVerboseLoggingEnabled(void) {
+ static NSString *const kVerboseLoggingKey = @"GTMVerboseLogging";
+ NSString *value = [[[NSProcessInfo processInfo] environment]
+ objectForKey:kVerboseLoggingKey];
+ if (value) {
+ // Emulate [NSString boolValue] for pre-10.5
+ value = [value stringByTrimmingCharactersInSet:
+ [NSCharacterSet whitespaceAndNewlineCharacterSet]];
+ if ([[value uppercaseString] hasPrefix:@"Y"] ||
+ [[value uppercaseString] hasPrefix:@"T"] ||
+ [value intValue]) {
+ return YES;
+ } else {
+ return NO;
+ }
+ }
+ return [[NSUserDefaults standardUserDefaults] boolForKey:kVerboseLoggingKey];
+}
+// COV_NF_END
+
+// In DEBUG builds, log everything. If we're not in a debug build we'll assume
+// that we're in a Release build.
+- (BOOL)filterAllowsMessage:(NSString *)msg level:(GTMLoggerLevel)level {
+#if defined(DEBUG) && DEBUG
+ return YES;
+#endif
+
+ BOOL allow = YES;
+
+ switch (level) {
+ case kGTMLoggerLevelDebug:
+ allow = NO;
+ break;
+ case kGTMLoggerLevelInfo:
+ allow = IsVerboseLoggingEnabled();
+ break;
+ case kGTMLoggerLevelError:
+ allow = YES;
+ break;
+ case kGTMLoggerLevelAssert:
+ allow = YES;
+ break;
+ default:
+ allow = YES;
+ break;
+ }
+
+ return allow;
+}
+
+@end // GTMLogLevelFilter
+
+
+@implementation GTMLogNoFilter
+
+- (BOOL)filterAllowsMessage:(NSString *)msg level:(GTMLoggerLevel)level {
+ return YES; // Allow everything through
+}
+
+@end // GTMLogNoFilter
+
+
+@implementation GTMLogAllowedLevelFilter
+
+// Private designated initializer
+- (id)initWithAllowedLevels:(NSIndexSet *)levels {
+ self = [super init];
+ if (self != nil) {
+ allowedLevels_ = [levels retain];
+ // Cap min/max level
+ if (!allowedLevels_ ||
+ // NSIndexSet is unsigned so only check the high bound, but need to
+ // check both first and last index because NSIndexSet appears to allow
+ // wraparound.
+ ([allowedLevels_ firstIndex] > kGTMLoggerLevelAssert) ||
+ ([allowedLevels_ lastIndex] > kGTMLoggerLevelAssert)) {
+ [self release];
+ return nil;
+ }
+ }
+ return self;
+}
+
+- (id)init {
+ // Allow all levels in default init
+ return [self initWithAllowedLevels:[NSIndexSet indexSetWithIndexesInRange:
+ NSMakeRange(kGTMLoggerLevelUnknown,
+ (kGTMLoggerLevelAssert - kGTMLoggerLevelUnknown + 1))]];
+}
+
+- (void)dealloc {
+ [allowedLevels_ release];
+ [super dealloc];
+}
+
+- (BOOL)filterAllowsMessage:(NSString *)msg level:(GTMLoggerLevel)level {
+ return [allowedLevels_ containsIndex:level];
+}
+
+@end // GTMLogAllowedLevelFilter
+
+
+@implementation GTMLogMininumLevelFilter
+
+- (id)initWithMinimumLevel:(GTMLoggerLevel)level {
+ return [super initWithAllowedLevels:[NSIndexSet indexSetWithIndexesInRange:
+ NSMakeRange(level,
+ (kGTMLoggerLevelAssert - level + 1))]];
+}
+
+@end // GTMLogMininumLevelFilter
+
+
+@implementation GTMLogMaximumLevelFilter
+
+- (id)initWithMaximumLevel:(GTMLoggerLevel)level {
+ return [super initWithAllowedLevels:[NSIndexSet indexSetWithIndexesInRange:
+ NSMakeRange(kGTMLoggerLevelUnknown, level + 1)]];
+}
+
+@end // GTMLogMaximumLevelFilter
+
+#if !defined(__clang__) && (__GNUC__*10+__GNUC_MINOR__ >= 42)
+// See comment at top of file.
+#pragma GCC diagnostic error "-Wmissing-format-attribute"
+#endif // !__clang__
+
diff --git a/3rdParty/Breakpad/src/common/mac/HTTPMultipartUpload.h b/3rdParty/Breakpad/src/common/mac/HTTPMultipartUpload.h
new file mode 100644
index 0000000..42e8fed
--- /dev/null
+++ b/3rdParty/Breakpad/src/common/mac/HTTPMultipartUpload.h
@@ -0,0 +1,61 @@
+// Copyright (c) 2006, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// HTTPMultipartUpload: A multipart/form-data HTTP uploader.
+// Each parameter pair is sent as a boundary
+// Each file is sent with a name field in addition to the filename and data
+// The data will be sent synchronously.
+
+#import <Foundation/Foundation.h>
+
+@interface HTTPMultipartUpload : NSObject {
+ @protected
+ NSURL *url_; // The destination URL (STRONG)
+ NSDictionary *parameters_; // The key/value pairs for sending data (STRONG)
+ NSMutableDictionary *files_; // Dictionary of name/file-path (STRONG)
+ NSString *boundary_; // The boundary string (STRONG)
+ NSHTTPURLResponse *response_; // The response from the send (STRONG)
+}
+
+- (id)initWithURL:(NSURL *)url;
+
+- (NSURL *)URL;
+
+- (void)setParameters:(NSDictionary *)parameters;
+- (NSDictionary *)parameters;
+
+- (void)addFileAtPath:(NSString *)path name:(NSString *)name;
+- (void)addFileContents:(NSData *)data name:(NSString *)name;
+- (NSDictionary *)files;
+
+// Set the data and return the response
+- (NSData *)send:(NSError **)error;
+- (NSHTTPURLResponse *)response;
+
+@end
diff --git a/3rdParty/Breakpad/src/common/mac/HTTPMultipartUpload.m b/3rdParty/Breakpad/src/common/mac/HTTPMultipartUpload.m
new file mode 100644
index 0000000..f6d081e
--- /dev/null
+++ b/3rdParty/Breakpad/src/common/mac/HTTPMultipartUpload.m
@@ -0,0 +1,267 @@
+// Copyright (c) 2006, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#import "HTTPMultipartUpload.h"
+#import "GTMDefines.h"
+
+// As -[NSString stringByAddingPercentEscapesUsingEncoding:] has been
+// deprecated with iOS 9.0 / OS X 10.11 SDKs, this function re-implements it
+// using -[NSString stringByAddingPercentEncodingWithAllowedCharacters:] when
+// using those SDKs.
+static NSString *PercentEncodeNSString(NSString *key) {
+#if (defined(__IPHONE_OS_VERSION_MIN_REQUIRED) && defined(__IPHONE_9_0) && \
+ __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_9_0) || \
+ (defined(MAC_OS_X_VERSION_MIN_REQUIRED) && \
+ defined(MAC_OS_X_VERSION_10_11) && \
+ MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_11)
+ return [key stringByAddingPercentEncodingWithAllowedCharacters:
+ [NSCharacterSet URLQueryAllowedCharacterSet]];
+#else
+ return [key stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
+#endif
+}
+
+// As -[NSURLConnection sendSynchronousRequest:returningResponse:error:] has
+// been deprecated with iOS 9.0 / OS X 10.11 SDKs, this function re-implements
+// it using -[NSURLSession dataTaskWithRequest:completionHandler:] which is
+// available on iOS 7+.
+static NSData *SendSynchronousNSURLRequest(NSURLRequest *req,
+ NSURLResponse **out_response,
+ NSError **out_error) {
+#if (defined(__IPHONE_OS_VERSION_MIN_REQUIRED) && defined(__IPHONE_7_0) && \
+ __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_7_0) || \
+ (defined(MAC_OS_X_VERSION_MIN_REQUIRED) && \
+ defined(MAC_OS_X_VERSION_10_11) && \
+ MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_11)
+ __block NSData* result = nil;
+ __block NSError* error = nil;
+ __block NSURLResponse* response = nil;
+ dispatch_semaphore_t wait_semaphone = dispatch_semaphore_create(0);
+ [[[NSURLSession sharedSession]
+ dataTaskWithRequest:req
+ completionHandler:^(NSData *data,
+ NSURLResponse *resp,
+ NSError *err) {
+ if (out_error)
+ error = [err retain];
+ if (out_response)
+ response = [resp retain];
+ if (err == nil)
+ result = [data retain];
+ dispatch_semaphore_signal(wait_semaphone);
+ }] resume];
+ dispatch_semaphore_wait(wait_semaphone, DISPATCH_TIME_FOREVER);
+ dispatch_release(wait_semaphone);
+ if (out_error)
+ *out_error = [error autorelease];
+ if (out_response)
+ *out_response = [response autorelease];
+ return [result autorelease];
+#else
+ return [NSURLConnection sendSynchronousRequest:req
+ returningResponse:out_response
+ error:out_error];
+#endif
+}
+@interface HTTPMultipartUpload(PrivateMethods)
+- (NSString *)multipartBoundary;
+// Each of the following methods will append the starting multipart boundary,
+// but not the ending one.
+- (NSData *)formDataForKey:(NSString *)key value:(NSString *)value;
+- (NSData *)formDataForFileContents:(NSData *)contents name:(NSString *)name;
+- (NSData *)formDataForFile:(NSString *)file name:(NSString *)name;
+@end
+
+@implementation HTTPMultipartUpload
+//=============================================================================
+#pragma mark -
+#pragma mark || Private ||
+//=============================================================================
+- (NSString *)multipartBoundary {
+ // The boundary has 27 '-' characters followed by 16 hex digits
+ return [NSString stringWithFormat:@"---------------------------%08X%08X",
+ rand(), rand()];
+}
+
+//=============================================================================
+- (NSData *)formDataForKey:(NSString *)key value:(NSString *)value {
+ NSString *escaped = PercentEncodeNSString(key);
+ NSString *fmt =
+ @"--%@\r\nContent-Disposition: form-data; name=\"%@\"\r\n\r\n%@\r\n";
+ NSString *form = [NSString stringWithFormat:fmt, boundary_, escaped, value];
+
+ return [form dataUsingEncoding:NSUTF8StringEncoding];
+}
+
+//=============================================================================
+- (NSData *)formDataForFileContents:(NSData *)contents name:(NSString *)name {
+ NSMutableData *data = [NSMutableData data];
+ NSString *escaped = PercentEncodeNSString(name);
+ NSString *fmt = @"--%@\r\nContent-Disposition: form-data; name=\"%@\"; "
+ "filename=\"minidump.dmp\"\r\nContent-Type: application/octet-stream\r\n\r\n";
+ NSString *pre = [NSString stringWithFormat:fmt, boundary_, escaped];
+
+ [data appendData:[pre dataUsingEncoding:NSUTF8StringEncoding]];
+ [data appendData:contents];
+
+ return data;
+}
+
+//=============================================================================
+- (NSData *)formDataForFile:(NSString *)file name:(NSString *)name {
+ NSData *contents = [NSData dataWithContentsOfFile:file];
+
+ return [self formDataForFileContents:contents name:name];
+}
+
+//=============================================================================
+#pragma mark -
+#pragma mark || Public ||
+//=============================================================================
+- (id)initWithURL:(NSURL *)url {
+ if ((self = [super init])) {
+ url_ = [url copy];
+ boundary_ = [[self multipartBoundary] retain];
+ files_ = [[NSMutableDictionary alloc] init];
+ }
+
+ return self;
+}
+
+//=============================================================================
+- (void)dealloc {
+ [url_ release];
+ [parameters_ release];
+ [files_ release];
+ [boundary_ release];
+ [response_ release];
+
+ [super dealloc];
+}
+
+//=============================================================================
+- (NSURL *)URL {
+ return url_;
+}
+
+//=============================================================================
+- (void)setParameters:(NSDictionary *)parameters {
+ if (parameters != parameters_) {
+ [parameters_ release];
+ parameters_ = [parameters copy];
+ }
+}
+
+//=============================================================================
+- (NSDictionary *)parameters {
+ return parameters_;
+}
+
+//=============================================================================
+- (void)addFileAtPath:(NSString *)path name:(NSString *)name {
+ [files_ setObject:path forKey:name];
+}
+
+//=============================================================================
+- (void)addFileContents:(NSData *)data name:(NSString *)name {
+ [files_ setObject:data forKey:name];
+}
+
+//=============================================================================
+- (NSDictionary *)files {
+ return files_;
+}
+
+//=============================================================================
+- (NSData *)send:(NSError **)error {
+ NSMutableURLRequest *req =
+ [[NSMutableURLRequest alloc]
+ initWithURL:url_ cachePolicy:NSURLRequestUseProtocolCachePolicy
+ timeoutInterval:10.0 ];
+
+ NSMutableData *postBody = [NSMutableData data];
+
+ [req setValue:[NSString stringWithFormat:@"multipart/form-data; boundary=%@",
+ boundary_] forHTTPHeaderField:@"Content-type"];
+
+ // Add any parameters to the message
+ NSArray *parameterKeys = [parameters_ allKeys];
+ NSString *key;
+
+ NSInteger count = [parameterKeys count];
+ for (NSInteger i = 0; i < count; ++i) {
+ key = [parameterKeys objectAtIndex:i];
+ [postBody appendData:[self formDataForKey:key
+ value:[parameters_ objectForKey:key]]];
+ }
+
+ // Add any files to the message
+ NSArray *fileNames = [files_ allKeys];
+ for (NSString *name in fileNames) {
+ id fileOrData = [files_ objectForKey:name];
+ NSData *fileData;
+
+ // The object can be either the path to a file (NSString) or the contents
+ // of the file (NSData).
+ if ([fileOrData isKindOfClass:[NSData class]])
+ fileData = [self formDataForFileContents:fileOrData name:name];
+ else
+ fileData = [self formDataForFile:fileOrData name:name];
+
+ [postBody appendData:fileData];
+ }
+
+ NSString *epilogue = [NSString stringWithFormat:@"\r\n--%@--\r\n", boundary_];
+ [postBody appendData:[epilogue dataUsingEncoding:NSUTF8StringEncoding]];
+
+ [req setHTTPBody:postBody];
+ [req setHTTPMethod:@"POST"];
+
+ [response_ release];
+ response_ = nil;
+
+ NSData *data = nil;
+ if ([[req URL] isFileURL]) {
+ [[req HTTPBody] writeToURL:[req URL] options:0 error:error];
+ } else {
+ NSURLResponse *response = nil;
+ data = SendSynchronousNSURLRequest(req, &response, error);
+ response_ = (NSHTTPURLResponse *)[response retain];
+ }
+ [req release];
+
+ return data;
+}
+
+//=============================================================================
+- (NSHTTPURLResponse *)response {
+ return response_;
+}
+
+@end
diff --git a/3rdParty/Breakpad/src/common/mac/MachIPC.h b/3rdParty/Breakpad/src/common/mac/MachIPC.h
index 52bed59..8df9165 100644
--- a/3rdParty/Breakpad/src/common/mac/MachIPC.h
+++ b/3rdParty/Breakpad/src/common/mac/MachIPC.h
@@ -164,11 +164,11 @@ class MachMessage {
public:
// The receiver of the message can retrieve the raw data this way
- u_int8_t *GetData() {
+ uint8_t *GetData() {
return GetDataLength() > 0 ? GetDataPacket()->data : NULL;
}
- u_int32_t GetDataLength() {
+ uint32_t GetDataLength() {
return EndianU32_LtoN(GetDataPacket()->data_length);
}
@@ -210,7 +210,7 @@ class MachMessage {
struct MessageDataPacket {
int32_t id; // little-endian
int32_t data_length; // little-endian
- u_int8_t data[1]; // actual size limited by sizeof(MachMessage)
+ uint8_t data[1]; // actual size limited by sizeof(MachMessage)
};
MessageDataPacket* GetDataPacket();
@@ -223,7 +223,7 @@ class MachMessage {
mach_msg_header_t head;
mach_msg_body_t body;
- u_int8_t padding[1024]; // descriptors and data may be embedded here
+ uint8_t padding[1024]; // descriptors and data may be embedded here
};
//==============================================================================
diff --git a/3rdParty/Breakpad/src/common/mac/arch_utilities.cc b/3rdParty/Breakpad/src/common/mac/arch_utilities.cc
new file mode 100644
index 0000000..c9225e0
--- /dev/null
+++ b/3rdParty/Breakpad/src/common/mac/arch_utilities.cc
@@ -0,0 +1,231 @@
+// Copyright (c) 2012, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#include "common/mac/arch_utilities.h"
+
+#include <mach-o/arch.h>
+#include <mach-o/fat.h>
+#include <stdio.h>
+#include <string.h>
+
+#ifndef CPU_SUBTYPE_ARM_V7S
+#define CPU_SUBTYPE_ARM_V7S (static_cast<cpu_subtype_t>(11))
+#endif // CPU_SUBTYPE_ARM_V7S
+
+#ifndef CPU_TYPE_ARM64
+#define CPU_TYPE_ARM64 (CPU_TYPE_ARM | CPU_ARCH_ABI64)
+#endif // CPU_TYPE_ARM64
+
+#ifndef CPU_SUBTYPE_ARM64_ALL
+#define CPU_SUBTYPE_ARM64_ALL (static_cast<cpu_subtype_t>(0))
+#endif // CPU_SUBTYPE_ARM64_ALL
+
+namespace {
+
+const NXArchInfo* ArchInfo_arm64() {
+ NXArchInfo* arm64 = new NXArchInfo;
+ *arm64 = *NXGetArchInfoFromCpuType(CPU_TYPE_ARM,
+ CPU_SUBTYPE_ARM_V7);
+ arm64->name = "arm64";
+ arm64->cputype = CPU_TYPE_ARM64;
+ arm64->cpusubtype = CPU_SUBTYPE_ARM64_ALL;
+ arm64->description = "arm 64";
+ return arm64;
+}
+
+const NXArchInfo* ArchInfo_armv7s() {
+ NXArchInfo* armv7s = new NXArchInfo;
+ *armv7s = *NXGetArchInfoFromCpuType(CPU_TYPE_ARM,
+ CPU_SUBTYPE_ARM_V7);
+ armv7s->name = "armv7s";
+ armv7s->cpusubtype = CPU_SUBTYPE_ARM_V7S;
+ armv7s->description = "arm v7s";
+ return armv7s;
+}
+
+} // namespace
+
+namespace google_breakpad {
+
+const NXArchInfo* BreakpadGetArchInfoFromName(const char* arch_name) {
+ // TODO: Remove this when the OS knows about arm64.
+ if (!strcmp("arm64", arch_name))
+ return BreakpadGetArchInfoFromCpuType(CPU_TYPE_ARM64,
+ CPU_SUBTYPE_ARM64_ALL);
+
+ // TODO: Remove this when the OS knows about armv7s.
+ if (!strcmp("armv7s", arch_name))
+ return BreakpadGetArchInfoFromCpuType(CPU_TYPE_ARM, CPU_SUBTYPE_ARM_V7S);
+
+ return NXGetArchInfoFromName(arch_name);
+}
+
+const NXArchInfo* BreakpadGetArchInfoFromCpuType(cpu_type_t cpu_type,
+ cpu_subtype_t cpu_subtype) {
+ // TODO: Remove this when the OS knows about arm64.
+ if (cpu_type == CPU_TYPE_ARM64 && cpu_subtype == CPU_SUBTYPE_ARM64_ALL) {
+ static const NXArchInfo* arm64 = ArchInfo_arm64();
+ return arm64;
+ }
+
+ // TODO: Remove this when the OS knows about armv7s.
+ if (cpu_type == CPU_TYPE_ARM && cpu_subtype == CPU_SUBTYPE_ARM_V7S) {
+ static const NXArchInfo* armv7s = ArchInfo_armv7s();
+ return armv7s;
+ }
+
+ return NXGetArchInfoFromCpuType(cpu_type, cpu_subtype);
+}
+
+} // namespace google_breakpad
+
+#ifndef __APPLE__
+namespace {
+
+enum Architecture {
+ kArch_i386 = 0,
+ kArch_x86_64,
+ kArch_x86_64h,
+ kArch_arm,
+ kArch_arm64,
+ kArch_ppc,
+ // This must be last.
+ kNumArchitectures
+};
+
+// enum Architecture above and kKnownArchitectures below
+// must be kept in sync.
+const NXArchInfo kKnownArchitectures[] = {
+ {
+ "i386",
+ CPU_TYPE_I386,
+ CPU_SUBTYPE_I386_ALL,
+ NX_LittleEndian,
+ "Intel 80x86"
+ },
+ {
+ "x86_64",
+ CPU_TYPE_X86_64,
+ CPU_SUBTYPE_X86_64_ALL,
+ NX_LittleEndian,
+ "Intel x86-64"
+ },
+ {
+ "x86_64h",
+ CPU_TYPE_X86_64,
+ CPU_SUBTYPE_X86_64_H,
+ NX_LittleEndian,
+ "Intel x86-64h Haswell"
+ },
+ {
+ "arm",
+ CPU_TYPE_ARM,
+ CPU_SUBTYPE_ARM_ALL,
+ NX_LittleEndian,
+ "ARM"
+ },
+ {
+ "arm64",
+ CPU_TYPE_ARM64,
+ CPU_SUBTYPE_ARM64_ALL,
+ NX_LittleEndian,
+ "ARM64"
+ },
+ {
+ "ppc",
+ CPU_TYPE_POWERPC,
+ CPU_SUBTYPE_POWERPC_ALL,
+ NX_BigEndian,
+ "PowerPC"
+ }
+};
+
+} // namespace
+
+const NXArchInfo *NXGetLocalArchInfo(void) {
+ Architecture arch;
+#if defined(__i386__)
+ arch = kArch_i386;
+#elif defined(__x86_64__)
+ arch = kArch_x86_64;
+#elif defined(__arm64)
+ arch = kArch_arm64;
+#elif defined(__arm__)
+ arch = kArch_arm;
+#elif defined(__powerpc__)
+ arch = kArch_ppc;
+#else
+ #error "Unsupported CPU architecture"
+#endif
+ return &kKnownArchitectures[arch];
+}
+
+const NXArchInfo *NXGetArchInfoFromName(const char *name) {
+ for (int arch = 0; arch < kNumArchitectures; ++arch) {
+ if (!strcmp(name, kKnownArchitectures[arch].name)) {
+ return &kKnownArchitectures[arch];
+ }
+ }
+ return NULL;
+}
+
+const NXArchInfo *NXGetArchInfoFromCpuType(cpu_type_t cputype,
+ cpu_subtype_t cpusubtype) {
+ const NXArchInfo *candidate = NULL;
+ for (int arch = 0; arch < kNumArchitectures; ++arch) {
+ if (kKnownArchitectures[arch].cputype == cputype) {
+ if (kKnownArchitectures[arch].cpusubtype == cpusubtype) {
+ return &kKnownArchitectures[arch];
+ }
+ if (!candidate) {
+ candidate = &kKnownArchitectures[arch];
+ }
+ }
+ }
+ return candidate;
+}
+
+struct fat_arch *NXFindBestFatArch(cpu_type_t cputype,
+ cpu_subtype_t cpusubtype,
+ struct fat_arch *fat_archs,
+ uint32_t nfat_archs) {
+ struct fat_arch *candidate = NULL;
+ for (uint32_t f = 0; f < nfat_archs; ++f) {
+ if (fat_archs[f].cputype == cputype) {
+ if (fat_archs[f].cpusubtype == cpusubtype) {
+ return &fat_archs[f];
+ }
+ if (!candidate) {
+ candidate = &fat_archs[f];
+ }
+ }
+ }
+ return candidate;
+}
+#endif // !__APPLE__
diff --git a/3rdParty/Breakpad/src/common/mac/arch_utilities.h b/3rdParty/Breakpad/src/common/mac/arch_utilities.h
new file mode 100644
index 0000000..397c1f5
--- /dev/null
+++ b/3rdParty/Breakpad/src/common/mac/arch_utilities.h
@@ -0,0 +1,47 @@
+// Copyright (c) 2012, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// arch_utilities.h: Utilities for architecture introspection for Mac platform.
+
+#ifndef COMMON_MAC_ARCH_UTILITIES_H__
+#define COMMON_MAC_ARCH_UTILITIES_H__
+
+#include <mach-o/arch.h>
+
+namespace google_breakpad {
+
+// Custom implementation of |NXGetArchInfoFromName| and
+// |NXGetArchInfoFromCpuType| that handle newer CPU on older OSes.
+const NXArchInfo* BreakpadGetArchInfoFromName(const char* arch_name);
+const NXArchInfo* BreakpadGetArchInfoFromCpuType(cpu_type_t cpu_type,
+ cpu_subtype_t cpu_subtype);
+
+} // namespace google_breakpad
+
+#endif // COMMON_MAC_ARCH_UTILITIES_H__
diff --git a/3rdParty/Breakpad/src/common/mac/byteswap.h b/3rdParty/Breakpad/src/common/mac/byteswap.h
index a5d745b..b7bbc0b 100644
--- a/3rdParty/Breakpad/src/common/mac/byteswap.h
+++ b/3rdParty/Breakpad/src/common/mac/byteswap.h
@@ -36,6 +36,7 @@
#ifndef COMMON_MAC_BYTESWAP_H_
#define COMMON_MAC_BYTESWAP_H_
+#ifdef __APPLE__
#include <libkern/OSByteOrder.h>
static inline uint16_t ByteSwap(uint16_t v) { return OSSwapInt16(v); }
@@ -45,4 +46,28 @@ static inline int16_t ByteSwap(int16_t v) { return OSSwapInt16(v); }
static inline int32_t ByteSwap(int32_t v) { return OSSwapInt32(v); }
static inline int64_t ByteSwap(int64_t v) { return OSSwapInt64(v); }
+#elif defined(__linux__)
+// For NXByteOrder
+#include <architecture/byte_order.h>
+#include <stdint.h>
+#include <endian.h>
+#include_next <byteswap.h>
+
+static inline uint16_t ByteSwap(uint16_t v) { return bswap_16(v); }
+static inline uint32_t ByteSwap(uint32_t v) { return bswap_32(v); }
+static inline uint64_t ByteSwap(uint64_t v) { return bswap_64(v); }
+static inline int16_t ByteSwap(int16_t v) { return bswap_16(v); }
+static inline int32_t ByteSwap(int32_t v) { return bswap_32(v); }
+static inline int64_t ByteSwap(int64_t v) { return bswap_64(v); }
+
+static inline NXByteOrder NXHostByteOrder() {
+#ifdef __LITTLE_ENDIAN
+ return NX_LittleEndian;
+#else
+ return NX_BigEndian;
+#endif
+}
+
+#endif // __APPLE__
+
#endif // COMMON_MAC_BYTESWAP_H_
diff --git a/3rdParty/Breakpad/src/common/mac/dump_syms.cc b/3rdParty/Breakpad/src/common/mac/dump_syms.cc
new file mode 100644
index 0000000..eb92729
--- /dev/null
+++ b/3rdParty/Breakpad/src/common/mac/dump_syms.cc
@@ -0,0 +1,646 @@
+// -*- mode: c++ -*-
+
+// Copyright (c) 2011, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// Author: Jim Blandy <jimb@mozilla.com> <jimb@red-bean.com>
+
+// dump_syms.cc: Create a symbol file for use with minidumps
+
+#include "common/mac/dump_syms.h"
+
+#include <assert.h>
+#include <dirent.h>
+#include <errno.h>
+#include <libgen.h>
+#include <mach-o/arch.h>
+#include <mach-o/fat.h>
+#include <stdint.h>
+#include <stdio.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <unistd.h>
+
+#include <ostream>
+#include <string>
+#include <vector>
+
+#include "common/dwarf/bytereader-inl.h"
+#include "common/dwarf/dwarf2reader.h"
+#include "common/dwarf_cfi_to_module.h"
+#include "common/dwarf_cu_to_module.h"
+#include "common/dwarf_line_to_module.h"
+#include "common/mac/file_id.h"
+#include "common/mac/arch_utilities.h"
+#include "common/mac/macho_reader.h"
+#include "common/module.h"
+#include "common/scoped_ptr.h"
+#include "common/stabs_reader.h"
+#include "common/stabs_to_module.h"
+#include "common/symbol_data.h"
+
+#ifndef CPU_TYPE_ARM
+#define CPU_TYPE_ARM (static_cast<cpu_type_t>(12))
+#endif // CPU_TYPE_ARM
+
+#ifndef CPU_TYPE_ARM64
+#define CPU_TYPE_ARM64 (static_cast<cpu_type_t>(16777228))
+#endif // CPU_TYPE_ARM64
+
+using dwarf2reader::ByteReader;
+using google_breakpad::DwarfCUToModule;
+using google_breakpad::DwarfLineToModule;
+using google_breakpad::FileID;
+using google_breakpad::mach_o::FatReader;
+using google_breakpad::mach_o::Section;
+using google_breakpad::mach_o::Segment;
+using google_breakpad::Module;
+using google_breakpad::StabsReader;
+using google_breakpad::StabsToModule;
+using google_breakpad::scoped_ptr;
+using std::make_pair;
+using std::pair;
+using std::string;
+using std::vector;
+
+namespace {
+// Return a vector<string> with absolute paths to all the entries
+// in directory (excluding . and ..).
+vector<string> list_directory(const string& directory) {
+ vector<string> entries;
+ DIR* dir = opendir(directory.c_str());
+ if (!dir) {
+ return entries;
+ }
+
+ string path = directory;
+ if (path[path.length() - 1] != '/') {
+ path += '/';
+ }
+
+ struct dirent* entry = NULL;
+ while ((entry = readdir(dir))) {
+ if (strcmp(entry->d_name, ".") != 0 && strcmp(entry->d_name, "..") != 0) {
+ entries.push_back(path + entry->d_name);
+ }
+ }
+
+ closedir(dir);
+ return entries;
+}
+}
+
+namespace google_breakpad {
+
+bool DumpSymbols::Read(const string &filename) {
+ struct stat st;
+ if (stat(filename.c_str(), &st) == -1) {
+ fprintf(stderr, "Could not access object file %s: %s\n",
+ filename.c_str(), strerror(errno));
+ return false;
+ }
+
+ input_pathname_ = filename;
+
+ // Does this filename refer to a dSYM bundle?
+ string contents_path = input_pathname_ + "/Contents/Resources/DWARF";
+ if (S_ISDIR(st.st_mode) &&
+ access(contents_path.c_str(), F_OK) == 0) {
+ // If there's one file under Contents/Resources/DWARF then use that,
+ // otherwise bail out.
+ const vector<string> entries = list_directory(contents_path);
+ if (entries.size() == 0) {
+ fprintf(stderr, "Unable to find DWARF-bearing file in bundle: %s\n",
+ input_pathname_.c_str());
+ return false;
+ }
+ if (entries.size() > 1) {
+ fprintf(stderr, "Too many DWARF files in bundle: %s\n",
+ input_pathname_.c_str());
+ return false;
+ }
+
+ object_filename_ = entries[0];
+ } else {
+ object_filename_ = input_pathname_;
+ }
+
+ // Read the file's contents into memory.
+ bool read_ok = true;
+ string error;
+ if (stat(object_filename_.c_str(), &st) != -1) {
+ FILE* f = fopen(object_filename_.c_str(), "rb");
+ if (f) {
+ contents_.reset(new uint8_t[st.st_size]);
+ off_t total = 0;
+ while (total < st.st_size && !feof(f)) {
+ size_t read = fread(&contents_[0] + total, 1, st.st_size - total, f);
+ if (read == 0) {
+ if (ferror(f)) {
+ read_ok = false;
+ error = strerror(errno);
+ }
+ break;
+ }
+ total += read;
+ }
+ fclose(f);
+ } else {
+ error = strerror(errno);
+ }
+ }
+
+ if (!read_ok) {
+ fprintf(stderr, "Error reading object file: %s: %s\n",
+ object_filename_.c_str(),
+ error.c_str());
+ return false;
+ }
+
+ // Get the list of object files present in the file.
+ FatReader::Reporter fat_reporter(object_filename_);
+ FatReader fat_reader(&fat_reporter);
+ if (!fat_reader.Read(&contents_[0],
+ st.st_size)) {
+ return false;
+ }
+
+ // Get our own copy of fat_reader's object file list.
+ size_t object_files_count;
+ const SuperFatArch *object_files =
+ fat_reader.object_files(&object_files_count);
+ if (object_files_count == 0) {
+ fprintf(stderr, "Fat binary file contains *no* architectures: %s\n",
+ object_filename_.c_str());
+ return false;
+ }
+ object_files_.resize(object_files_count);
+ memcpy(&object_files_[0], object_files,
+ sizeof(SuperFatArch) * object_files_count);
+
+ return true;
+}
+
+bool DumpSymbols::SetArchitecture(cpu_type_t cpu_type,
+ cpu_subtype_t cpu_subtype) {
+ // Find the best match for the architecture the user requested.
+ const SuperFatArch *best_match = FindBestMatchForArchitecture(
+ cpu_type, cpu_subtype);
+ if (!best_match) return false;
+
+ // Record the selected object file.
+ selected_object_file_ = best_match;
+ return true;
+}
+
+bool DumpSymbols::SetArchitecture(const std::string &arch_name) {
+ bool arch_set = false;
+ const NXArchInfo *arch_info =
+ google_breakpad::BreakpadGetArchInfoFromName(arch_name.c_str());
+ if (arch_info) {
+ arch_set = SetArchitecture(arch_info->cputype, arch_info->cpusubtype);
+ }
+ return arch_set;
+}
+
+SuperFatArch* DumpSymbols::FindBestMatchForArchitecture(
+ cpu_type_t cpu_type, cpu_subtype_t cpu_subtype) {
+ // Check if all the object files can be converted to struct fat_arch.
+ bool can_convert_to_fat_arch = true;
+ vector<struct fat_arch> fat_arch_vector;
+ for (vector<SuperFatArch>::const_iterator it = object_files_.begin();
+ it != object_files_.end();
+ ++it) {
+ struct fat_arch arch;
+ bool success = it->ConvertToFatArch(&arch);
+ if (!success) {
+ can_convert_to_fat_arch = false;
+ break;
+ }
+ fat_arch_vector.push_back(arch);
+ }
+
+ // If all the object files can be converted to struct fat_arch, use
+ // NXFindBestFatArch.
+ if (can_convert_to_fat_arch) {
+ const struct fat_arch *best_match
+ = NXFindBestFatArch(cpu_type, cpu_subtype, &fat_arch_vector[0],
+ static_cast<uint32_t>(fat_arch_vector.size()));
+
+ for (size_t i = 0; i < fat_arch_vector.size(); ++i) {
+ if (best_match == &fat_arch_vector[i])
+ return &object_files_[i];
+ }
+ assert(best_match == NULL);
+ return NULL;
+ }
+
+ // Check for an exact match with cpu_type and cpu_subtype.
+ for (vector<SuperFatArch>::iterator it = object_files_.begin();
+ it != object_files_.end();
+ ++it) {
+ if (static_cast<cpu_type_t>(it->cputype) == cpu_type &&
+ static_cast<cpu_subtype_t>(it->cpusubtype) == cpu_subtype)
+ return &*it;
+ }
+
+ // No exact match found.
+ // TODO(erikchen): If it becomes necessary, we can copy the implementation of
+ // NXFindBestFatArch, located at
+ // http://web.mit.edu/darwin/src/modules/cctools/libmacho/arch.c.
+ fprintf(stderr, "Failed to find an exact match for an object file with cpu "
+ "type: %d and cpu subtype: %d. Furthermore, at least one object file is "
+ "larger than 2**32.\n", cpu_type, cpu_subtype);
+ return NULL;
+}
+
+string DumpSymbols::Identifier() {
+ FileID file_id(object_filename_.c_str());
+ unsigned char identifier_bytes[16];
+ cpu_type_t cpu_type = selected_object_file_->cputype;
+ cpu_subtype_t cpu_subtype = selected_object_file_->cpusubtype;
+ if (!file_id.MachoIdentifier(cpu_type, cpu_subtype, identifier_bytes)) {
+ fprintf(stderr, "Unable to calculate UUID of mach-o binary %s!\n",
+ object_filename_.c_str());
+ return "";
+ }
+
+ char identifier_string[40];
+ FileID::ConvertIdentifierToString(identifier_bytes, identifier_string,
+ sizeof(identifier_string));
+
+ string compacted(identifier_string);
+ for(size_t i = compacted.find('-'); i != string::npos;
+ i = compacted.find('-', i))
+ compacted.erase(i, 1);
+
+ return compacted;
+}
+
+// A line-to-module loader that accepts line number info parsed by
+// dwarf2reader::LineInfo and populates a Module and a line vector
+// with the results.
+class DumpSymbols::DumperLineToModule:
+ public DwarfCUToModule::LineToModuleHandler {
+ public:
+ // Create a line-to-module converter using BYTE_READER.
+ DumperLineToModule(dwarf2reader::ByteReader *byte_reader)
+ : byte_reader_(byte_reader) { }
+
+ void StartCompilationUnit(const string& compilation_dir) {
+ compilation_dir_ = compilation_dir;
+ }
+
+ void ReadProgram(const uint8_t *program, uint64 length,
+ Module *module, vector<Module::Line> *lines) {
+ DwarfLineToModule handler(module, compilation_dir_, lines);
+ dwarf2reader::LineInfo parser(program, length, byte_reader_, &handler);
+ parser.Start();
+ }
+ private:
+ string compilation_dir_;
+ dwarf2reader::ByteReader *byte_reader_; // WEAK
+};
+
+bool DumpSymbols::CreateEmptyModule(scoped_ptr<Module>& module) {
+ // Select an object file, if SetArchitecture hasn't been called to set one
+ // explicitly.
+ if (!selected_object_file_) {
+ // If there's only one architecture, that's the one.
+ if (object_files_.size() == 1)
+ selected_object_file_ = &object_files_[0];
+ else {
+ // Look for an object file whose architecture matches our own.
+ const NXArchInfo *local_arch = NXGetLocalArchInfo();
+ if (!SetArchitecture(local_arch->cputype, local_arch->cpusubtype)) {
+ fprintf(stderr, "%s: object file contains more than one"
+ " architecture, none of which match the current"
+ " architecture; specify an architecture explicitly"
+ " with '-a ARCH' to resolve the ambiguity\n",
+ object_filename_.c_str());
+ return false;
+ }
+ }
+ }
+
+ assert(selected_object_file_);
+
+ // Find the name of the selected file's architecture, to appear in
+ // the MODULE record and in error messages.
+ const NXArchInfo *selected_arch_info =
+ google_breakpad::BreakpadGetArchInfoFromCpuType(
+ selected_object_file_->cputype, selected_object_file_->cpusubtype);
+
+ const char *selected_arch_name = selected_arch_info->name;
+ if (strcmp(selected_arch_name, "i386") == 0)
+ selected_arch_name = "x86";
+
+ // Produce a name to use in error messages that includes the
+ // filename, and the architecture, if there is more than one.
+ selected_object_name_ = object_filename_;
+ if (object_files_.size() > 1) {
+ selected_object_name_ += ", architecture ";
+ selected_object_name_ + selected_arch_name;
+ }
+
+ // Compute a module name, to appear in the MODULE record.
+ string module_name = object_filename_;
+ module_name = basename(&module_name[0]);
+
+ // Choose an identifier string, to appear in the MODULE record.
+ string identifier = Identifier();
+ if (identifier.empty())
+ return false;
+ identifier += "0";
+
+ // Create a module to hold the debugging information.
+ module.reset(new Module(module_name,
+ "mac",
+ selected_arch_name,
+ identifier));
+ return true;
+}
+
+bool DumpSymbols::ReadDwarf(google_breakpad::Module *module,
+ const mach_o::Reader &macho_reader,
+ const mach_o::SectionMap &dwarf_sections,
+ bool handle_inter_cu_refs) const {
+ // Build a byte reader of the appropriate endianness.
+ ByteReader byte_reader(macho_reader.big_endian()
+ ? dwarf2reader::ENDIANNESS_BIG
+ : dwarf2reader::ENDIANNESS_LITTLE);
+
+ // Construct a context for this file.
+ DwarfCUToModule::FileContext file_context(selected_object_name_,
+ module,
+ handle_inter_cu_refs);
+
+ // Build a dwarf2reader::SectionMap from our mach_o::SectionMap.
+ for (mach_o::SectionMap::const_iterator it = dwarf_sections.begin();
+ it != dwarf_sections.end(); ++it) {
+ file_context.AddSectionToSectionMap(
+ it->first,
+ it->second.contents.start,
+ it->second.contents.Size());
+ }
+
+ // Find the __debug_info section.
+ dwarf2reader::SectionMap::const_iterator debug_info_entry =
+ file_context.section_map().find("__debug_info");
+ assert(debug_info_entry != file_context.section_map().end());
+ const std::pair<const uint8_t *, uint64>& debug_info_section =
+ debug_info_entry->second;
+ // There had better be a __debug_info section!
+ if (!debug_info_section.first) {
+ fprintf(stderr, "%s: __DWARF segment of file has no __debug_info section\n",
+ selected_object_name_.c_str());
+ return false;
+ }
+
+ // Build a line-to-module loader for the root handler to use.
+ DumperLineToModule line_to_module(&byte_reader);
+
+ // Walk the __debug_info section, one compilation unit at a time.
+ uint64 debug_info_length = debug_info_section.second;
+ for (uint64 offset = 0; offset < debug_info_length;) {
+ // Make a handler for the root DIE that populates MODULE with the
+ // debug info.
+ DwarfCUToModule::WarningReporter reporter(selected_object_name_,
+ offset);
+ DwarfCUToModule root_handler(&file_context, &line_to_module, &reporter);
+ // Make a Dwarf2Handler that drives our DIEHandler.
+ dwarf2reader::DIEDispatcher die_dispatcher(&root_handler);
+ // Make a DWARF parser for the compilation unit at OFFSET.
+ dwarf2reader::CompilationUnit dwarf_reader(selected_object_name_,
+ file_context.section_map(),
+ offset,
+ &byte_reader,
+ &die_dispatcher);
+ // Process the entire compilation unit; get the offset of the next.
+ offset += dwarf_reader.Start();
+ }
+
+ return true;
+}
+
+bool DumpSymbols::ReadCFI(google_breakpad::Module *module,
+ const mach_o::Reader &macho_reader,
+ const mach_o::Section &section,
+ bool eh_frame) const {
+ // Find the appropriate set of register names for this file's
+ // architecture.
+ vector<string> register_names;
+ switch (macho_reader.cpu_type()) {
+ case CPU_TYPE_X86:
+ register_names = DwarfCFIToModule::RegisterNames::I386();
+ break;
+ case CPU_TYPE_X86_64:
+ register_names = DwarfCFIToModule::RegisterNames::X86_64();
+ break;
+ case CPU_TYPE_ARM:
+ register_names = DwarfCFIToModule::RegisterNames::ARM();
+ break;
+ case CPU_TYPE_ARM64:
+ register_names = DwarfCFIToModule::RegisterNames::ARM64();
+ break;
+ default: {
+ const NXArchInfo *arch = google_breakpad::BreakpadGetArchInfoFromCpuType(
+ macho_reader.cpu_type(), macho_reader.cpu_subtype());
+ fprintf(stderr, "%s: cannot convert DWARF call frame information for ",
+ selected_object_name_.c_str());
+ if (arch)
+ fprintf(stderr, "architecture '%s'", arch->name);
+ else
+ fprintf(stderr, "architecture %d,%d",
+ macho_reader.cpu_type(), macho_reader.cpu_subtype());
+ fprintf(stderr, " to Breakpad symbol file: no register name table\n");
+ return false;
+ }
+ }
+
+ // Find the call frame information and its size.
+ const uint8_t *cfi = section.contents.start;
+ size_t cfi_size = section.contents.Size();
+
+ // Plug together the parser, handler, and their entourages.
+ DwarfCFIToModule::Reporter module_reporter(selected_object_name_,
+ section.section_name);
+ DwarfCFIToModule handler(module, register_names, &module_reporter);
+ dwarf2reader::ByteReader byte_reader(macho_reader.big_endian() ?
+ dwarf2reader::ENDIANNESS_BIG :
+ dwarf2reader::ENDIANNESS_LITTLE);
+ byte_reader.SetAddressSize(macho_reader.bits_64() ? 8 : 4);
+ // At the moment, according to folks at Apple and some cursory
+ // investigation, Mac OS X only uses DW_EH_PE_pcrel-based pointers, so
+ // this is the only base address the CFI parser will need.
+ byte_reader.SetCFIDataBase(section.address, cfi);
+
+ dwarf2reader::CallFrameInfo::Reporter dwarf_reporter(selected_object_name_,
+ section.section_name);
+ dwarf2reader::CallFrameInfo parser(cfi, cfi_size,
+ &byte_reader, &handler, &dwarf_reporter,
+ eh_frame);
+ parser.Start();
+ return true;
+}
+
+// A LoadCommandHandler that loads whatever debugging data it finds into a
+// Module.
+class DumpSymbols::LoadCommandDumper:
+ public mach_o::Reader::LoadCommandHandler {
+ public:
+ // Create a load command dumper handling load commands from READER's
+ // file, and adding data to MODULE.
+ LoadCommandDumper(const DumpSymbols &dumper,
+ google_breakpad::Module *module,
+ const mach_o::Reader &reader,
+ SymbolData symbol_data,
+ bool handle_inter_cu_refs)
+ : dumper_(dumper),
+ module_(module),
+ reader_(reader),
+ symbol_data_(symbol_data),
+ handle_inter_cu_refs_(handle_inter_cu_refs) { }
+
+ bool SegmentCommand(const mach_o::Segment &segment);
+ bool SymtabCommand(const ByteBuffer &entries, const ByteBuffer &strings);
+
+ private:
+ const DumpSymbols &dumper_;
+ google_breakpad::Module *module_; // WEAK
+ const mach_o::Reader &reader_;
+ const SymbolData symbol_data_;
+ const bool handle_inter_cu_refs_;
+};
+
+bool DumpSymbols::LoadCommandDumper::SegmentCommand(const Segment &segment) {
+ mach_o::SectionMap section_map;
+ if (!reader_.MapSegmentSections(segment, &section_map))
+ return false;
+
+ if (segment.name == "__TEXT") {
+ module_->SetLoadAddress(segment.vmaddr);
+ if (symbol_data_ != NO_CFI) {
+ mach_o::SectionMap::const_iterator eh_frame =
+ section_map.find("__eh_frame");
+ if (eh_frame != section_map.end()) {
+ // If there is a problem reading this, don't treat it as a fatal error.
+ dumper_.ReadCFI(module_, reader_, eh_frame->second, true);
+ }
+ }
+ return true;
+ }
+
+ if (segment.name == "__DWARF") {
+ if (symbol_data_ != ONLY_CFI) {
+ if (!dumper_.ReadDwarf(module_, reader_, section_map,
+ handle_inter_cu_refs_)) {
+ return false;
+ }
+ }
+ if (symbol_data_ != NO_CFI) {
+ mach_o::SectionMap::const_iterator debug_frame
+ = section_map.find("__debug_frame");
+ if (debug_frame != section_map.end()) {
+ // If there is a problem reading this, don't treat it as a fatal error.
+ dumper_.ReadCFI(module_, reader_, debug_frame->second, false);
+ }
+ }
+ }
+
+ return true;
+}
+
+bool DumpSymbols::LoadCommandDumper::SymtabCommand(const ByteBuffer &entries,
+ const ByteBuffer &strings) {
+ StabsToModule stabs_to_module(module_);
+ // Mac OS X STABS are never "unitized", and the size of the 'value' field
+ // matches the address size of the executable.
+ StabsReader stabs_reader(entries.start, entries.Size(),
+ strings.start, strings.Size(),
+ reader_.big_endian(),
+ reader_.bits_64() ? 8 : 4,
+ true,
+ &stabs_to_module);
+ if (!stabs_reader.Process())
+ return false;
+ stabs_to_module.Finalize();
+ return true;
+}
+
+bool DumpSymbols::ReadSymbolData(Module** out_module) {
+ scoped_ptr<Module> module;
+ if (!CreateEmptyModule(module))
+ return false;
+
+ // Parse the selected object file.
+ mach_o::Reader::Reporter reporter(selected_object_name_);
+ mach_o::Reader reader(&reporter);
+ if (!reader.Read(&contents_[0]
+ + selected_object_file_->offset,
+ selected_object_file_->size,
+ selected_object_file_->cputype,
+ selected_object_file_->cpusubtype))
+ return false;
+
+ // Walk its load commands, and deal with whatever is there.
+ LoadCommandDumper load_command_dumper(*this, module.get(), reader,
+ symbol_data_, handle_inter_cu_refs_);
+ if (!reader.WalkLoadCommands(&load_command_dumper))
+ return false;
+
+ *out_module = module.release();
+
+ return true;
+}
+
+bool DumpSymbols::WriteSymbolFile(std::ostream &stream) {
+ Module* module = NULL;
+
+ if (ReadSymbolData(&module) && module) {
+ bool res = module->Write(stream, symbol_data_);
+ delete module;
+ return res;
+ }
+
+ return false;
+}
+
+// Read the selected object file's debugging information, and write out the
+// header only to |stream|. Return true on success; if an error occurs, report
+// it and return false.
+bool DumpSymbols::WriteSymbolFileHeader(std::ostream &stream) {
+ scoped_ptr<Module> module;
+ if (!CreateEmptyModule(module))
+ return false;
+
+ return module->Write(stream, symbol_data_);
+}
+
+} // namespace google_breakpad
diff --git a/3rdParty/Breakpad/src/common/mac/dump_syms.h b/3rdParty/Breakpad/src/common/mac/dump_syms.h
index 0e2f464..9463f7d 100644
--- a/3rdParty/Breakpad/src/common/mac/dump_syms.h
+++ b/3rdParty/Breakpad/src/common/mac/dump_syms.h
@@ -35,7 +35,6 @@
// reading debugging information from Mach-O files and writing it out as a
// Breakpad symbol file.
-#include <Foundation/Foundation.h>
#include <mach-o/loader.h>
#include <stdio.h>
#include <stdlib.h>
@@ -46,33 +45,32 @@
#include "common/byte_cursor.h"
#include "common/mac/macho_reader.h"
+#include "common/mac/super_fat_arch.h"
#include "common/module.h"
+#include "common/scoped_ptr.h"
+#include "common/symbol_data.h"
namespace google_breakpad {
class DumpSymbols {
public:
- DumpSymbols()
- : input_pathname_(),
+ DumpSymbols(SymbolData symbol_data, bool handle_inter_cu_refs)
+ : symbol_data_(symbol_data),
+ handle_inter_cu_refs_(handle_inter_cu_refs),
+ input_pathname_(),
object_filename_(),
contents_(),
+ object_files_(),
selected_object_file_(),
selected_object_name_() { }
~DumpSymbols() {
- [input_pathname_ release];
- [object_filename_ release];
- [contents_ release];
}
// Prepare to read debugging information from |filename|. |filename| may be
// the name of a universal binary, a Mach-O file, or a dSYM bundle
// containing either of the above. On success, return true; if there is a
// problem reading |filename|, report it and return false.
- //
- // (This class uses NSString for filenames and related values,
- // because the Mac Foundation framework seems to support
- // filename-related operations more fully on NSString values.)
- bool Read(NSString *filename);
+ bool Read(const std::string &filename);
// If this dumper's file includes an object file for |cpu_type| and
// |cpu_subtype|, then select that object file for dumping, and return
@@ -95,14 +93,14 @@ class DumpSymbols {
// architecture matches that of this dumper program.
bool SetArchitecture(const std::string &arch_name);
- // Return a pointer to an array of 'struct fat_arch' structures,
- // describing the object files contained in this dumper's file. Set
- // *|count| to the number of elements in the array. The returned array is
- // owned by this DumpSymbols instance.
+ // Return a pointer to an array of SuperFatArch structures describing the
+ // object files contained in this dumper's file. Set *|count| to the number
+ // of elements in the array. The returned array is owned by this DumpSymbols
+ // instance.
//
// If there are no available architectures, this function
// may return NULL.
- const struct fat_arch *AvailableArchitectures(size_t *count) {
+ const SuperFatArch* AvailableArchitectures(size_t *count) {
*count = object_files_.size();
if (object_files_.size() > 0)
return &object_files_[0];
@@ -110,24 +108,44 @@ class DumpSymbols {
}
// Read the selected object file's debugging information, and write it out to
- // |stream|. Write the CFI section if |cfi| is true. Return true on success;
- // if an error occurs, report it and return false.
- bool WriteSymbolFile(std::ostream &stream, bool cfi);
+ // |stream|. Return true on success; if an error occurs, report it and
+ // return false.
+ bool WriteSymbolFile(std::ostream &stream);
+
+ // Read the selected object file's debugging information, and write out the
+ // header only to |stream|. Return true on success; if an error occurs, report
+ // it and return false.
+ bool WriteSymbolFileHeader(std::ostream &stream);
+
+ // As above, but simply return the debugging information in module
+ // instead of writing it to a stream. The caller owns the resulting
+ // module object and must delete it when finished.
+ bool ReadSymbolData(Module** module);
private:
// Used internally.
class DumperLineToModule;
class LoadCommandDumper;
+ // This method behaves similarly to NXFindBestFatArch, but it supports
+ // SuperFatArch.
+ SuperFatArch* FindBestMatchForArchitecture(
+ cpu_type_t cpu_type, cpu_subtype_t cpu_subtype);
+
// Return an identifier string for the file this DumpSymbols is dumping.
std::string Identifier();
+
+ // Creates an empty module object.
+ bool CreateEmptyModule(scoped_ptr<Module>& module);
+
// Read debugging information from |dwarf_sections|, which was taken from
// |macho_reader|, and add it to |module|. On success, return true;
// on failure, report the problem and return false.
bool ReadDwarf(google_breakpad::Module *module,
const mach_o::Reader &macho_reader,
- const mach_o::SectionMap &dwarf_sections) const;
+ const mach_o::SectionMap &dwarf_sections,
+ bool handle_inter_cu_refs) const;
// Read DWARF CFI or .eh_frame data from |section|, belonging to
// |macho_reader|, and record it in |module|. If |eh_frame| is true,
@@ -139,28 +157,34 @@ class DumpSymbols {
const mach_o::Section &section,
bool eh_frame) const;
+ // The selection of what type of symbol data to read/write.
+ const SymbolData symbol_data_;
+
+ // Whether to handle references between compilation units.
+ const bool handle_inter_cu_refs_;
+
// The name of the file or bundle whose symbols this will dump.
// This is the path given to Read, for use in error messages.
- NSString *input_pathname_;
+ std::string input_pathname_;
// The name of the file this DumpSymbols will actually read debugging
// information from. Normally, this is the same as input_pathname_, but if
// filename refers to a dSYM bundle, then this is the resource file
// within that bundle.
- NSString *object_filename_;
+ std::string object_filename_;
// The complete contents of object_filename_, mapped into memory.
- NSData *contents_;
+ scoped_array<uint8_t> contents_;
- // A vector of fat_arch structures describing the object files
+ // A vector of SuperFatArch structures describing the object files
// object_filename_ contains. If object_filename_ refers to a fat binary,
// this may have more than one element; if it refers to a Mach-O file, this
// has exactly one element.
- vector<struct fat_arch> object_files_;
+ vector<SuperFatArch> object_files_;
// The object file in object_files_ selected to dump, or NULL if
// SetArchitecture hasn't been called yet.
- const struct fat_arch *selected_object_file_;
+ const SuperFatArch *selected_object_file_;
// A string that identifies the selected object file, for use in error
// messages. This is usually object_filename_, but if that refers to a
diff --git a/3rdParty/Breakpad/src/common/mac/dump_syms.mm b/3rdParty/Breakpad/src/common/mac/dump_syms.mm
deleted file mode 100644
index 9783514..0000000
--- a/3rdParty/Breakpad/src/common/mac/dump_syms.mm
+++ /dev/null
@@ -1,496 +0,0 @@
-// -*- mode: c++ -*-
-
-// Copyright (c) 2011, Google Inc.
-// All rights reserved.
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-// Author: Jim Blandy <jimb@mozilla.com> <jimb@red-bean.com>
-
-// dump_syms.mm: Create a symbol file for use with minidumps
-
-#include "common/mac/dump_syms.h"
-
-#include <Foundation/Foundation.h>
-#include <mach-o/arch.h>
-#include <mach-o/fat.h>
-#include <stdio.h>
-
-#include <ostream>
-#include <string>
-#include <vector>
-
-#include "common/dwarf/bytereader-inl.h"
-#include "common/dwarf/dwarf2reader.h"
-#include "common/dwarf_cfi_to_module.h"
-#include "common/dwarf_cu_to_module.h"
-#include "common/dwarf_line_to_module.h"
-#include "common/mac/file_id.h"
-#include "common/mac/macho_reader.h"
-#include "common/module.h"
-#include "common/stabs_reader.h"
-#include "common/stabs_to_module.h"
-
-#ifndef CPU_TYPE_ARM
-#define CPU_TYPE_ARM (static_cast<cpu_type_t>(12))
-#endif // CPU_TYPE_ARM
-
-using dwarf2reader::ByteReader;
-using google_breakpad::DwarfCUToModule;
-using google_breakpad::DwarfLineToModule;
-using google_breakpad::FileID;
-using google_breakpad::mach_o::FatReader;
-using google_breakpad::mach_o::Section;
-using google_breakpad::mach_o::Segment;
-using google_breakpad::Module;
-using google_breakpad::StabsReader;
-using google_breakpad::StabsToModule;
-using std::make_pair;
-using std::pair;
-using std::string;
-using std::vector;
-
-namespace google_breakpad {
-
-bool DumpSymbols::Read(NSString *filename) {
- if (![[NSFileManager defaultManager] fileExistsAtPath:filename]) {
- fprintf(stderr, "Object file does not exist: %s\n",
- [filename fileSystemRepresentation]);
- return false;
- }
-
- input_pathname_ = [filename retain];
-
- // Does this filename refer to a dSYM bundle?
- NSBundle *bundle = [NSBundle bundleWithPath:input_pathname_];
-
- if (bundle) {
- // Filenames referring to bundles usually have names of the form
- // "<basename>.dSYM"; however, if the user has specified a wrapper
- // suffix (the WRAPPER_SUFFIX and WRAPPER_EXTENSION build settings),
- // then the name may have the form "<basename>.<extension>.dSYM". In
- // either case, the resource name for the file containing the DWARF
- // info within the bundle is <basename>.
- //
- // Since there's no way to tell how much to strip off, remove one
- // extension at a time, and use the first one that
- // pathForResource:ofType:inDirectory likes.
- NSString *base_name = [input_pathname_ lastPathComponent];
- NSString *dwarf_resource;
-
- do {
- NSString *new_base_name = [base_name stringByDeletingPathExtension];
-
- // If stringByDeletingPathExtension returned the name unchanged, then
- // there's nothing more for us to strip off --- lose.
- if ([new_base_name isEqualToString:base_name]) {
- fprintf(stderr, "Unable to find DWARF-bearing file in bundle: %s\n",
- [input_pathname_ fileSystemRepresentation]);
- return false;
- }
-
- // Take the shortened result as our new base_name.
- base_name = new_base_name;
-
- // Try to find a DWARF resource in the bundle under the new base_name.
- dwarf_resource = [bundle pathForResource:base_name
- ofType:nil inDirectory:@"DWARF"];
- } while (!dwarf_resource);
-
- object_filename_ = [dwarf_resource retain];
- } else {
- object_filename_ = [input_pathname_ retain];
- }
-
- // Read the file's contents into memory.
- //
- // The documentation for dataWithContentsOfMappedFile says:
- //
- // Because of file mapping restrictions, this method should only be
- // used if the file is guaranteed to exist for the duration of the
- // data object’s existence. It is generally safer to use the
- // dataWithContentsOfFile: method.
- //
- // I gather this means that OS X doesn't have (or at least, that method
- // doesn't use) a form of mapping like Linux's MAP_PRIVATE, where the
- // process appears to get its own copy of the data, and changes to the
- // file don't affect memory and vice versa).
- NSError *error;
- contents_ = [NSData dataWithContentsOfFile:object_filename_
- options:0
- error:&error];
- if (!contents_) {
- fprintf(stderr, "Error reading object file: %s: %s\n",
- [object_filename_ fileSystemRepresentation],
- [[error localizedDescription] UTF8String]);
- return false;
- }
- [contents_ retain];
-
- // Get the list of object files present in the file.
- FatReader::Reporter fat_reporter([object_filename_
- fileSystemRepresentation]);
- FatReader fat_reader(&fat_reporter);
- if (!fat_reader.Read(reinterpret_cast<const uint8_t *>([contents_ bytes]),
- [contents_ length])) {
- return false;
- }
-
- // Get our own copy of fat_reader's object file list.
- size_t object_files_count;
- const struct fat_arch *object_files =
- fat_reader.object_files(&object_files_count);
- if (object_files_count == 0) {
- fprintf(stderr, "Fat binary file contains *no* architectures: %s\n",
- [object_filename_ fileSystemRepresentation]);
- return false;
- }
- object_files_.resize(object_files_count);
- memcpy(&object_files_[0], object_files,
- sizeof(struct fat_arch) * object_files_count);
-
- return true;
-}
-
-bool DumpSymbols::SetArchitecture(cpu_type_t cpu_type,
- cpu_subtype_t cpu_subtype) {
- // Find the best match for the architecture the user requested.
- const struct fat_arch *best_match
- = NXFindBestFatArch(cpu_type, cpu_subtype, &object_files_[0],
- static_cast<uint32_t>(object_files_.size()));
- if (!best_match) return false;
-
- // Record the selected object file.
- selected_object_file_ = best_match;
- return true;
-}
-
-bool DumpSymbols::SetArchitecture(const std::string &arch_name) {
- bool arch_set = false;
- const NXArchInfo *arch_info = NXGetArchInfoFromName(arch_name.c_str());
- if (arch_info) {
- arch_set = SetArchitecture(arch_info->cputype, arch_info->cpusubtype);
- }
- return arch_set;
-}
-
-string DumpSymbols::Identifier() {
- FileID file_id([object_filename_ fileSystemRepresentation]);
- unsigned char identifier_bytes[16];
- cpu_type_t cpu_type = selected_object_file_->cputype;
- if (!file_id.MachoIdentifier(cpu_type, identifier_bytes)) {
- fprintf(stderr, "Unable to calculate UUID of mach-o binary %s!\n",
- [object_filename_ fileSystemRepresentation]);
- return "";
- }
-
- char identifier_string[40];
- FileID::ConvertIdentifierToString(identifier_bytes, identifier_string,
- sizeof(identifier_string));
-
- string compacted(identifier_string);
- for(size_t i = compacted.find('-'); i != string::npos;
- i = compacted.find('-', i))
- compacted.erase(i, 1);
-
- return compacted;
-}
-
-// A line-to-module loader that accepts line number info parsed by
-// dwarf2reader::LineInfo and populates a Module and a line vector
-// with the results.
-class DumpSymbols::DumperLineToModule:
- public DwarfCUToModule::LineToModuleFunctor {
- public:
- // Create a line-to-module converter using BYTE_READER.
- DumperLineToModule(dwarf2reader::ByteReader *byte_reader)
- : byte_reader_(byte_reader) { }
- void operator()(const char *program, uint64 length,
- Module *module, vector<Module::Line> *lines) {
- DwarfLineToModule handler(module, lines);
- dwarf2reader::LineInfo parser(program, length, byte_reader_, &handler);
- parser.Start();
- }
- private:
- dwarf2reader::ByteReader *byte_reader_; // WEAK
-};
-
-bool DumpSymbols::ReadDwarf(google_breakpad::Module *module,
- const mach_o::Reader &macho_reader,
- const mach_o::SectionMap &dwarf_sections) const {
- // Build a byte reader of the appropriate endianness.
- ByteReader byte_reader(macho_reader.big_endian()
- ? dwarf2reader::ENDIANNESS_BIG
- : dwarf2reader::ENDIANNESS_LITTLE);
-
- // Construct a context for this file.
- DwarfCUToModule::FileContext file_context(selected_object_name_,
- module);
-
- // Build a dwarf2reader::SectionMap from our mach_o::SectionMap.
- for (mach_o::SectionMap::const_iterator it = dwarf_sections.begin();
- it != dwarf_sections.end(); it++) {
- file_context.section_map[it->first] =
- make_pair(reinterpret_cast<const char *>(it->second.contents.start),
- it->second.contents.Size());
- }
-
- // Find the __debug_info section.
- std::pair<const char *, uint64> debug_info_section
- = file_context.section_map["__debug_info"];
- // There had better be a __debug_info section!
- if (!debug_info_section.first) {
- fprintf(stderr, "%s: __DWARF segment of file has no __debug_info section\n",
- selected_object_name_.c_str());
- return false;
- }
-
- // Build a line-to-module loader for the root handler to use.
- DumperLineToModule line_to_module(&byte_reader);
-
- // Walk the __debug_info section, one compilation unit at a time.
- uint64 debug_info_length = debug_info_section.second;
- for (uint64 offset = 0; offset < debug_info_length;) {
- // Make a handler for the root DIE that populates MODULE with the
- // debug info.
- DwarfCUToModule::WarningReporter reporter(selected_object_name_,
- offset);
- DwarfCUToModule root_handler(&file_context, &line_to_module, &reporter);
- // Make a Dwarf2Handler that drives our DIEHandler.
- dwarf2reader::DIEDispatcher die_dispatcher(&root_handler);
- // Make a DWARF parser for the compilation unit at OFFSET.
- dwarf2reader::CompilationUnit dwarf_reader(file_context.section_map,
- offset,
- &byte_reader,
- &die_dispatcher);
- // Process the entire compilation unit; get the offset of the next.
- offset += dwarf_reader.Start();
- }
-
- return true;
-}
-
-bool DumpSymbols::ReadCFI(google_breakpad::Module *module,
- const mach_o::Reader &macho_reader,
- const mach_o::Section &section,
- bool eh_frame) const {
- // Find the appropriate set of register names for this file's
- // architecture.
- vector<string> register_names;
- switch (macho_reader.cpu_type()) {
- case CPU_TYPE_X86:
- register_names = DwarfCFIToModule::RegisterNames::I386();
- break;
- case CPU_TYPE_X86_64:
- register_names = DwarfCFIToModule::RegisterNames::X86_64();
- break;
- case CPU_TYPE_ARM:
- register_names = DwarfCFIToModule::RegisterNames::ARM();
- break;
- default: {
- const NXArchInfo *arch =
- NXGetArchInfoFromCpuType(macho_reader.cpu_type(),
- macho_reader.cpu_subtype());
- fprintf(stderr, "%s: cannot convert DWARF call frame information for ",
- selected_object_name_.c_str());
- if (arch)
- fprintf(stderr, "architecture '%s'", arch->name);
- else
- fprintf(stderr, "architecture %d,%d",
- macho_reader.cpu_type(), macho_reader.cpu_subtype());
- fprintf(stderr, " to Breakpad symbol file: no register name table\n");
- return false;
- }
- }
-
- // Find the call frame information and its size.
- const char *cfi = reinterpret_cast<const char *>(section.contents.start);
- size_t cfi_size = section.contents.Size();
-
- // Plug together the parser, handler, and their entourages.
- DwarfCFIToModule::Reporter module_reporter(selected_object_name_,
- section.section_name);
- DwarfCFIToModule handler(module, register_names, &module_reporter);
- dwarf2reader::ByteReader byte_reader(macho_reader.big_endian() ?
- dwarf2reader::ENDIANNESS_BIG :
- dwarf2reader::ENDIANNESS_LITTLE);
- byte_reader.SetAddressSize(macho_reader.bits_64() ? 8 : 4);
- // At the moment, according to folks at Apple and some cursory
- // investigation, Mac OS X only uses DW_EH_PE_pcrel-based pointers, so
- // this is the only base address the CFI parser will need.
- byte_reader.SetCFIDataBase(section.address, cfi);
-
- dwarf2reader::CallFrameInfo::Reporter dwarf_reporter(selected_object_name_,
- section.section_name);
- dwarf2reader::CallFrameInfo parser(cfi, cfi_size,
- &byte_reader, &handler, &dwarf_reporter,
- eh_frame);
- parser.Start();
- return true;
-}
-
-// A LoadCommandHandler that loads whatever debugging data it finds into a
-// Module.
-class DumpSymbols::LoadCommandDumper:
- public mach_o::Reader::LoadCommandHandler {
- public:
- // Create a load command dumper handling load commands from READER's
- // file, and adding data to MODULE.
- LoadCommandDumper(const DumpSymbols &dumper,
- google_breakpad::Module *module,
- const mach_o::Reader &reader)
- : dumper_(dumper), module_(module), reader_(reader) { }
-
- bool SegmentCommand(const mach_o::Segment &segment);
- bool SymtabCommand(const ByteBuffer &entries, const ByteBuffer &strings);
-
- private:
- const DumpSymbols &dumper_;
- google_breakpad::Module *module_; // WEAK
- const mach_o::Reader &reader_;
-};
-
-bool DumpSymbols::LoadCommandDumper::SegmentCommand(const Segment &segment) {
- mach_o::SectionMap section_map;
- if (!reader_.MapSegmentSections(segment, &section_map))
- return false;
-
- if (segment.name == "__TEXT") {
- module_->SetLoadAddress(segment.vmaddr);
- mach_o::SectionMap::const_iterator eh_frame =
- section_map.find("__eh_frame");
- if (eh_frame != section_map.end()) {
- // If there is a problem reading this, don't treat it as a fatal error.
- dumper_.ReadCFI(module_, reader_, eh_frame->second, true);
- }
- return true;
- }
-
- if (segment.name == "__DWARF") {
- if (!dumper_.ReadDwarf(module_, reader_, section_map))
- return false;
- mach_o::SectionMap::const_iterator debug_frame
- = section_map.find("__debug_frame");
- if (debug_frame != section_map.end()) {
- // If there is a problem reading this, don't treat it as a fatal error.
- dumper_.ReadCFI(module_, reader_, debug_frame->second, false);
- }
- }
-
- return true;
-}
-
-bool DumpSymbols::LoadCommandDumper::SymtabCommand(const ByteBuffer &entries,
- const ByteBuffer &strings) {
- StabsToModule stabs_to_module(module_);
- // Mac OS X STABS are never "unitized", and the size of the 'value' field
- // matches the address size of the executable.
- StabsReader stabs_reader(entries.start, entries.Size(),
- strings.start, strings.Size(),
- reader_.big_endian(),
- reader_.bits_64() ? 8 : 4,
- true,
- &stabs_to_module);
- if (!stabs_reader.Process())
- return false;
- stabs_to_module.Finalize();
- return true;
-}
-
-bool DumpSymbols::WriteSymbolFile(std::ostream &stream, bool cfi) {
- // Select an object file, if SetArchitecture hasn't been called to set one
- // explicitly.
- if (!selected_object_file_) {
- // If there's only one architecture, that's the one.
- if (object_files_.size() == 1)
- selected_object_file_ = &object_files_[0];
- else {
- // Look for an object file whose architecture matches our own.
- const NXArchInfo *local_arch = NXGetLocalArchInfo();
- if (!SetArchitecture(local_arch->cputype, local_arch->cpusubtype)) {
- fprintf(stderr, "%s: object file contains more than one"
- " architecture, none of which match the current"
- " architecture; specify an architecture explicitly"
- " with '-a ARCH' to resolve the ambiguity\n",
- [object_filename_ fileSystemRepresentation]);
- return false;
- }
- }
- }
-
- assert(selected_object_file_);
-
- // Find the name of the selected file's architecture, to appear in
- // the MODULE record and in error messages.
- const NXArchInfo *selected_arch_info
- = NXGetArchInfoFromCpuType(selected_object_file_->cputype,
- selected_object_file_->cpusubtype);
-
- const char *selected_arch_name = selected_arch_info->name;
- if (strcmp(selected_arch_name, "i386") == 0)
- selected_arch_name = "x86";
-
- // Produce a name to use in error messages that includes the
- // filename, and the architecture, if there is more than one.
- selected_object_name_ = [object_filename_ UTF8String];
- if (object_files_.size() > 1) {
- selected_object_name_ += ", architecture ";
- selected_object_name_ + selected_arch_name;
- }
-
- // Compute a module name, to appear in the MODULE record.
- NSString *module_name = [object_filename_ lastPathComponent];
-
- // Choose an identifier string, to appear in the MODULE record.
- string identifier = Identifier();
- if (identifier.empty())
- return false;
- identifier += "0";
-
- // Create a module to hold the debugging information.
- Module module([module_name UTF8String], "mac", selected_arch_name,
- identifier);
-
- // Parse the selected object file.
- mach_o::Reader::Reporter reporter(selected_object_name_);
- mach_o::Reader reader(&reporter);
- if (!reader.Read(reinterpret_cast<const uint8_t *>([contents_ bytes])
- + selected_object_file_->offset,
- selected_object_file_->size,
- selected_object_file_->cputype,
- selected_object_file_->cpusubtype))
- return false;
-
- // Walk its load commands, and deal with whatever is there.
- LoadCommandDumper load_command_dumper(*this, &module, reader);
- if (!reader.WalkLoadCommands(&load_command_dumper))
- return false;
-
- return module.Write(stream, cfi);
-}
-
-} // namespace google_breakpad
diff --git a/3rdParty/Breakpad/src/common/mac/file_id.cc b/3rdParty/Breakpad/src/common/mac/file_id.cc
index 50502e4..4661d5d 100644
--- a/3rdParty/Breakpad/src/common/mac/file_id.cc
+++ b/3rdParty/Breakpad/src/common/mac/file_id.cc
@@ -34,6 +34,7 @@
// Author: Dan Waylonis
#include <fcntl.h>
+#include <stdio.h>
#include <string.h>
#include <unistd.h>
@@ -45,7 +46,7 @@ using MacFileUtilities::MachoID;
namespace google_breakpad {
FileID::FileID(const char *path) {
- strlcpy(path_, path, sizeof(path_));
+ snprintf(path_, sizeof(path_), "%s", path);
}
bool FileID::FileIdentifier(unsigned char identifier[16]) {
@@ -61,7 +62,7 @@ bool FileID::FileIdentifier(unsigned char identifier[16]) {
unsigned char buffer[4096 * 2];
size_t buffer_size = sizeof(buffer);
while ((buffer_size = read(fd, buffer, buffer_size) > 0)) {
- MD5Update(&md5, buffer, buffer_size);
+ MD5Update(&md5, buffer, static_cast<unsigned>(buffer_size));
}
close(fd);
@@ -70,13 +71,15 @@ bool FileID::FileIdentifier(unsigned char identifier[16]) {
return true;
}
-bool FileID::MachoIdentifier(int cpu_type, unsigned char identifier[16]) {
+bool FileID::MachoIdentifier(cpu_type_t cpu_type,
+ cpu_subtype_t cpu_subtype,
+ unsigned char identifier[16]) {
MachoID macho(path_);
- if (macho.UUIDCommand(cpu_type, identifier))
+ if (macho.UUIDCommand(cpu_type, cpu_subtype, identifier))
return true;
- return macho.MD5(cpu_type, identifier);
+ return macho.MD5(cpu_type, cpu_subtype, identifier);
}
// static
@@ -90,8 +93,10 @@ void FileID::ConvertIdentifierToString(const unsigned char identifier[16],
if (idx == 4 || idx == 6 || idx == 8 || idx == 10)
buffer[buffer_idx++] = '-';
- buffer[buffer_idx++] = (hi >= 10) ? 'A' + hi - 10 : '0' + hi;
- buffer[buffer_idx++] = (lo >= 10) ? 'A' + lo - 10 : '0' + lo;
+ buffer[buffer_idx++] =
+ static_cast<char>((hi >= 10) ? ('A' + hi - 10) : ('0' + hi));
+ buffer[buffer_idx++] =
+ static_cast<char>((lo >= 10) ? ('A' + lo - 10) : ('0' + lo));
}
// NULL terminate
diff --git a/3rdParty/Breakpad/src/common/mac/file_id.h b/3rdParty/Breakpad/src/common/mac/file_id.h
index eb06b0d..1d6dfde 100644
--- a/3rdParty/Breakpad/src/common/mac/file_id.h
+++ b/3rdParty/Breakpad/src/common/mac/file_id.h
@@ -35,6 +35,7 @@
#define COMMON_MAC_FILE_ID_H__
#include <limits.h>
+#include <mach/machine.h>
namespace google_breakpad {
@@ -50,15 +51,18 @@ class FileID {
bool FileIdentifier(unsigned char identifier[16]);
// Treat the file as a mach-o file that will contain one or more archicture.
- // Accepted values for |cpu_type| (e.g., CPU_TYPE_X86 or CPU_TYPE_POWERPC)
- // are listed in /usr/include/mach/machine.h.
- // If |cpu_type| is 0, then the native cpu type is used.
- // Returns false if opening the file failed or if the |cpu_type| is not
- // present in the file.
+ // Accepted values for |cpu_type| and |cpu_subtype| (e.g., CPU_TYPE_X86 or
+ // CPU_TYPE_POWERPC) are listed in /usr/include/mach/machine.h.
+ // If |cpu_type| is 0, then the native cpu type is used. If |cpu_subtype| is
+ // CPU_SUBTYPE_MULTIPLE, the match is only done on |cpu_type|.
+ // Returns false if opening the file failed or if the |cpu_type|/|cpu_subtype|
+ // is not present in the file.
// Return the unique identifier in |identifier|.
// The current implementation will look for the (in order of priority):
// LC_UUID, LC_ID_DYLIB, or MD5 hash of the given |cpu_type|.
- bool MachoIdentifier(int cpu_type, unsigned char identifier[16]);
+ bool MachoIdentifier(cpu_type_t cpu_type,
+ cpu_subtype_t cpu_subtype,
+ unsigned char identifier[16]);
// Convert the |identifier| data to a NULL terminated string. The string will
// be formatted as a UUID (e.g., 22F065BB-FC9C-49F7-80FE-26A7CEBD7BCE).
@@ -75,4 +79,3 @@ class FileID {
} // namespace google_breakpad
#endif // COMMON_MAC_FILE_ID_H__
-
diff --git a/3rdParty/Breakpad/src/common/mac/launch_reporter.cc b/3rdParty/Breakpad/src/common/mac/launch_reporter.cc
new file mode 100644
index 0000000..245be82
--- /dev/null
+++ b/3rdParty/Breakpad/src/common/mac/launch_reporter.cc
@@ -0,0 +1,84 @@
+// Copyright (c) 2014, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#include <stdio.h>
+#include <sys/wait.h>
+#include <unistd.h>
+
+namespace google_breakpad {
+
+void LaunchReporter(const char *reporter_executable_path,
+ const char *config_file_path) {
+ const char* argv[] = { reporter_executable_path, config_file_path, NULL };
+
+ // Launch the reporter
+ pid_t pid = fork();
+
+ if (pid == -1) {
+ perror("fork");
+ fprintf(stderr, "Failed to fork reporter process\n");
+ return;
+ }
+
+ // If we're in the child, load in our new executable and run.
+ // The parent will not wait for the child to complete.
+ if (pid == 0) {
+ execv(argv[0], (char* const*)argv);
+ perror("exec");
+ fprintf(stderr,
+ "Failed to launch reporter process from path %s\n",
+ reporter_executable_path);
+ unlink(config_file_path); // launch failed - get rid of config file
+ _exit(1);
+ }
+
+ // Wait until the Reporter child process exits.
+ //
+
+ // We'll use a timeout of one minute.
+ int timeout_count = 60; // 60 seconds
+
+ while (timeout_count-- > 0) {
+ int status;
+ pid_t result = waitpid(pid, &status, WNOHANG);
+
+ if (result == 0) {
+ // The child has not yet finished.
+ sleep(1);
+ } else if (result == -1) {
+ // error occurred.
+ break;
+ } else {
+ // child has finished
+ break;
+ }
+ }
+}
+
+} // namespace google_breakpad
diff --git a/3rdParty/Breakpad/src/common/mac/launch_reporter.h b/3rdParty/Breakpad/src/common/mac/launch_reporter.h
new file mode 100644
index 0000000..4531123
--- /dev/null
+++ b/3rdParty/Breakpad/src/common/mac/launch_reporter.h
@@ -0,0 +1,43 @@
+// Copyright (c) 2014, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#ifndef COMMON_MAC_LAUNCH_REPORTER_H__
+#define COMMON_MAC_LAUNCH_REPORTER_H__
+
+namespace google_breakpad {
+
+// Launch the crash dump sender app.
+// |reporter_executable_path| is the path to the sender executable.
+// |config_file_path| is the path to the config file.
+void LaunchReporter(const char *reporter_executable_path,
+ const char *config_file_path);
+
+} // namespace google_breakpad
+
+#endif // COMMON_MAC_LAUNCH_REPORTER_H__
diff --git a/3rdParty/Breakpad/src/common/mac/macho_id.cc b/3rdParty/Breakpad/src/common/mac/macho_id.cc
index abe1fab..c396ad8 100644
--- a/3rdParty/Breakpad/src/common/mac/macho_id.cc
+++ b/3rdParty/Breakpad/src/common/mac/macho_id.cc
@@ -33,17 +33,15 @@
//
// Author: Dan Waylonis
-extern "C" { // necessary for Leopard
- #include <fcntl.h>
- #include <mach-o/loader.h>
- #include <mach-o/swap.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <sys/time.h>
- #include <sys/types.h>
- #include <unistd.h>
-}
+
+#include <fcntl.h>
+#include <mach-o/loader.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/time.h>
+#include <sys/types.h>
+#include <unistd.h>
#include "common/mac/macho_id.h"
#include "common/mac/macho_walker.h"
@@ -61,7 +59,7 @@ MachoID::MachoID(const char *path)
crc_(0),
md5_context_(),
update_function_(NULL) {
- strlcpy(path_, path, sizeof(path_));
+ snprintf(path_, sizeof(path_), "%s", path);
}
MachoID::MachoID(const char *path, void *memory, size_t size)
@@ -70,7 +68,7 @@ MachoID::MachoID(const char *path, void *memory, size_t size)
crc_(0),
md5_context_(),
update_function_(NULL) {
- strlcpy(path_, path, sizeof(path_));
+ snprintf(path_, sizeof(path_), "%s", path);
}
MachoID::~MachoID() {
@@ -125,7 +123,7 @@ void MachoID::UpdateCRC(unsigned char *bytes, size_t size) {
}
void MachoID::UpdateMD5(unsigned char *bytes, size_t size) {
- MD5Update(&md5_context_, bytes, size);
+ MD5Update(&md5_context_, bytes, static_cast<unsigned>(size));
}
void MachoID::Update(MachoWalker *walker, off_t offset, size_t size) {
@@ -153,10 +151,12 @@ void MachoID::Update(MachoWalker *walker, off_t offset, size_t size) {
}
}
-bool MachoID::UUIDCommand(int cpu_type, unsigned char bytes[16]) {
+bool MachoID::UUIDCommand(cpu_type_t cpu_type,
+ cpu_subtype_t cpu_subtype,
+ unsigned char bytes[16]) {
struct breakpad_uuid_command uuid_cmd;
uuid_cmd.cmd = 0;
- if (!WalkHeader(cpu_type, UUIDWalkerCB, &uuid_cmd))
+ if (!WalkHeader(cpu_type, cpu_subtype, UUIDWalkerCB, &uuid_cmd))
return false;
// If we found the command, we'll have initialized the uuid_command
@@ -169,10 +169,12 @@ bool MachoID::UUIDCommand(int cpu_type, unsigned char bytes[16]) {
return false;
}
-bool MachoID::IDCommand(int cpu_type, unsigned char identifier[16]) {
+bool MachoID::IDCommand(cpu_type_t cpu_type,
+ cpu_subtype_t cpu_subtype,
+ unsigned char identifier[16]) {
struct dylib_command dylib_cmd;
dylib_cmd.cmd = 0;
- if (!WalkHeader(cpu_type, IDWalkerCB, &dylib_cmd))
+ if (!WalkHeader(cpu_type, cpu_subtype, IDWalkerCB, &dylib_cmd))
return false;
// If we found the command, we'll have initialized the dylib_command
@@ -210,37 +212,38 @@ bool MachoID::IDCommand(int cpu_type, unsigned char identifier[16]) {
return false;
}
-uint32_t MachoID::Adler32(int cpu_type) {
+uint32_t MachoID::Adler32(cpu_type_t cpu_type, cpu_subtype_t cpu_subtype) {
update_function_ = &MachoID::UpdateCRC;
crc_ = 0;
- if (!WalkHeader(cpu_type, WalkerCB, this))
+ if (!WalkHeader(cpu_type, cpu_subtype, WalkerCB, this))
return 0;
return crc_;
}
-bool MachoID::MD5(int cpu_type, unsigned char identifier[16]) {
+bool MachoID::MD5(cpu_type_t cpu_type, cpu_subtype_t cpu_subtype, unsigned char identifier[16]) {
update_function_ = &MachoID::UpdateMD5;
MD5Init(&md5_context_);
- if (!WalkHeader(cpu_type, WalkerCB, this))
+ if (!WalkHeader(cpu_type, cpu_subtype, WalkerCB, this))
return false;
MD5Final(identifier, &md5_context_);
return true;
}
-bool MachoID::WalkHeader(int cpu_type,
+bool MachoID::WalkHeader(cpu_type_t cpu_type,
+ cpu_subtype_t cpu_subtype,
MachoWalker::LoadCommandCallback callback,
void *context) {
if (memory_) {
MachoWalker walker(memory_, memory_size_, callback, context);
- return walker.WalkHeader(cpu_type);
+ return walker.WalkHeader(cpu_type, cpu_subtype);
} else {
MachoWalker walker(path_, callback, context);
- return walker.WalkHeader(cpu_type);
+ return walker.WalkHeader(cpu_type, cpu_subtype);
}
}
@@ -256,7 +259,7 @@ bool MachoID::WalkerCB(MachoWalker *walker, load_command *cmd, off_t offset,
return false;
if (swap)
- swap_segment_command(&seg, NXHostByteOrder());
+ breakpad_swap_segment_command(&seg);
struct mach_header_64 header;
off_t header_offset;
@@ -273,7 +276,7 @@ bool MachoID::WalkerCB(MachoWalker *walker, load_command *cmd, off_t offset,
return false;
if (swap)
- swap_section(&sec, 1, NXHostByteOrder());
+ breakpad_swap_section(&sec, 1);
// sections of type S_ZEROFILL are "virtual" and contain no data
// in the file itself
@@ -289,7 +292,7 @@ bool MachoID::WalkerCB(MachoWalker *walker, load_command *cmd, off_t offset,
return false;
if (swap)
- breakpad_swap_segment_command_64(&seg64, NXHostByteOrder());
+ breakpad_swap_segment_command_64(&seg64);
struct mach_header_64 header;
off_t header_offset;
@@ -306,7 +309,7 @@ bool MachoID::WalkerCB(MachoWalker *walker, load_command *cmd, off_t offset,
return false;
if (swap)
- breakpad_swap_section_64(&sec64, 1, NXHostByteOrder());
+ breakpad_swap_section_64(&sec64, 1);
// sections of type S_ZEROFILL are "virtual" and contain no data
// in the file itself
@@ -335,7 +338,7 @@ bool MachoID::UUIDWalkerCB(MachoWalker *walker, load_command *cmd, off_t offset,
return false;
if (swap)
- breakpad_swap_uuid_command(uuid_cmd, NXHostByteOrder());
+ breakpad_swap_uuid_command(uuid_cmd);
return false;
}
@@ -354,7 +357,7 @@ bool MachoID::IDWalkerCB(MachoWalker *walker, load_command *cmd, off_t offset,
return false;
if (swap)
- swap_dylib_command(dylib_cmd, NXHostByteOrder());
+ breakpad_swap_dylib_command(dylib_cmd);
return false;
}
diff --git a/3rdParty/Breakpad/src/common/mac/macho_id.h b/3rdParty/Breakpad/src/common/mac/macho_id.h
index ccb126d..1037549 100644
--- a/3rdParty/Breakpad/src/common/mac/macho_id.h
+++ b/3rdParty/Breakpad/src/common/mac/macho_id.h
@@ -35,6 +35,7 @@
#define COMMON_MAC_MACHO_ID_H__
#include <limits.h>
+#include <mach/machine.h>
#include <mach-o/loader.h>
#include "common/mac/macho_walker.h"
@@ -48,22 +49,32 @@ class MachoID {
MachoID(const char *path, void *memory, size_t size);
~MachoID();
- // For the given |cpu_type|, return a UUID from the LC_UUID command.
+ // For the given |cpu_type| and |cpu_subtype|, return a UUID from the LC_UUID
+ // command.
// Return false if there isn't a LC_UUID command.
- bool UUIDCommand(int cpu_type, unsigned char identifier[16]);
+ bool UUIDCommand(cpu_type_t cpu_type,
+ cpu_subtype_t cpu_subtype,
+ unsigned char identifier[16]);
- // For the given |cpu_type|, return a UUID from the LC_ID_DYLIB command.
+ // For the given |cpu_type| and |cpu_subtype|, return a UUID from the
+ // LC_ID_DYLIB command.
// Return false if there isn't a LC_ID_DYLIB command.
- bool IDCommand(int cpu_type, unsigned char identifier[16]);
+ bool IDCommand(cpu_type_t cpu_type,
+ cpu_subtype_t cpu_subtype,
+ unsigned char identifier[16]);
- // For the given |cpu_type|, return the Adler32 CRC for the mach-o data
- // segment(s).
+ // For the given |cpu_type| and |cpu_subtype|, return the Adler32 CRC for the
+ // mach-o data segment(s).
// Return 0 on error (e.g., if the file is not a mach-o file)
- uint32_t Adler32(int cpu_type);
+ uint32_t Adler32(cpu_type_t cpu_type,
+ cpu_subtype_t cpu_subtype);
- // For the given |cpu_type|, return the MD5 for the mach-o data segment(s).
+ // For the given |cpu_type|, and |cpu_subtype| return the MD5 for the mach-o
+ // data segment(s).
// Return true on success, false otherwise
- bool MD5(int cpu_type, unsigned char identifier[16]);
+ bool MD5(cpu_type_t cpu_type,
+ cpu_subtype_t cpu_subtype,
+ unsigned char identifier[16]);
private:
// Signature of class member function to be called with data read from file
@@ -81,8 +92,8 @@ class MachoID {
void Update(MachoWalker *walker, off_t offset, size_t size);
// Factory for the MachoWalker
- bool WalkHeader(int cpu_type, MachoWalker::LoadCommandCallback callback,
- void *context);
+ bool WalkHeader(cpu_type_t cpu_type, cpu_subtype_t cpu_subtype,
+ MachoWalker::LoadCommandCallback callback, void *context);
// The callback from the MachoWalker for CRC and MD5
static bool WalkerCB(MachoWalker *walker, load_command *cmd, off_t offset,
diff --git a/3rdParty/Breakpad/src/common/mac/macho_reader.cc b/3rdParty/Breakpad/src/common/mac/macho_reader.cc
index f1f0a17..52f3c41 100644
--- a/3rdParty/Breakpad/src/common/mac/macho_reader.cc
+++ b/3rdParty/Breakpad/src/common/mac/macho_reader.cc
@@ -43,6 +43,10 @@
#define CPU_TYPE_ARM 12
#endif
+#if !defined(CPU_TYPE_ARM_64)
+#define CPU_TYPE_ARM_64 16777228
+#endif
+
namespace google_breakpad {
namespace mach_o {
@@ -97,22 +101,26 @@ bool FatReader::Read(const uint8_t *buffer, size_t size) {
// Read the list of object files.
object_files_.resize(object_files_count);
for (size_t i = 0; i < object_files_count; i++) {
- struct fat_arch *objfile = &object_files_[i];
+ struct fat_arch objfile;
// Read this object file entry, byte-swapping as appropriate.
- cursor >> objfile->cputype
- >> objfile->cpusubtype
- >> objfile->offset
- >> objfile->size
- >> objfile->align;
+ cursor >> objfile.cputype
+ >> objfile.cpusubtype
+ >> objfile.offset
+ >> objfile.size
+ >> objfile.align;
+
+ SuperFatArch super_fat_arch(objfile);
+ object_files_[i] = super_fat_arch;
+
if (!cursor) {
reporter_->TooShort();
return false;
}
// Does the file actually have the bytes this entry refers to?
size_t fat_size = buffer_.Size();
- if (objfile->offset > fat_size ||
- objfile->size > fat_size - objfile->offset) {
+ if (objfile.offset > fat_size ||
+ objfile.size > fat_size - objfile.offset) {
reporter_->MisplacedObjectFile();
return false;
}
@@ -135,16 +143,14 @@ bool FatReader::Read(const uint8_t *buffer, size_t size) {
}
object_files_[0].offset = 0;
- object_files_[0].size = static_cast<uint32_t>(buffer_.Size());
+ object_files_[0].size = static_cast<uint64_t>(buffer_.Size());
// This alignment is correct for 32 and 64-bit x86 and ppc.
// See get_align in the lipo source for other architectures:
// http://www.opensource.apple.com/source/cctools/cctools-773/misc/lipo.c
object_files_[0].align = 12; // 2^12 == 4096
-
return true;
}
}
-
reporter_->BadHeader();
return false;
}
@@ -175,15 +181,15 @@ void Reader::Reporter::LoadCommandRegionTruncated() {
void Reader::Reporter::LoadCommandsOverrun(size_t claimed, size_t i,
LoadCommandType type) {
- fprintf(stderr, "%s: file's header claims there are %ld"
- " load commands, but load command #%ld",
+ fprintf(stderr, "%s: file's header claims there are %zu"
+ " load commands, but load command #%zu",
filename_.c_str(), claimed, i);
if (type) fprintf(stderr, ", of type %d,", type);
fprintf(stderr, " extends beyond the end of the load command region\n");
}
void Reader::Reporter::LoadCommandTooShort(size_t i, LoadCommandType type) {
- fprintf(stderr, "%s: the contents of load command #%ld, of type %d,"
+ fprintf(stderr, "%s: the contents of load command #%zu, of type %d,"
" extend beyond the size given in the load command's header\n",
filename_.c_str(), i, type);
}
@@ -242,6 +248,7 @@ bool Reader::Read(const uint8_t *buffer,
case CPU_TYPE_POWERPC:
expected_magic = MH_MAGIC;
break;
+ case CPU_TYPE_ARM_64:
case CPU_TYPE_X86_64:
expected_magic = MH_CIGAM_64;
break;
@@ -310,7 +317,7 @@ bool Reader::WalkLoadCommands(Reader::LoadCommandHandler *handler) const {
// remainder of the load command series.
ByteBuffer command(list_cursor.here(), list_cursor.Available());
ByteCursor cursor(&command, big_endian_);
-
+
// Read the command type and size --- fields common to all commands.
uint32_t type, size;
if (!(cursor >> type)) {
@@ -395,7 +402,7 @@ bool Reader::WalkLoadCommands(Reader::LoadCommandHandler *handler) const {
return false;
break;
}
-
+
default: {
if (!handler->UnknownCommand(type, command))
return false;
@@ -414,7 +421,7 @@ class Reader::SegmentFinder : public LoadCommandHandler {
public:
// Create a load command handler that looks for a segment named NAME,
// and sets SEGMENT to describe it if found.
- SegmentFinder(const string &name, Segment *segment)
+ SegmentFinder(const string &name, Segment *segment)
: name_(name), segment_(segment), found_() { }
// Return true if the traversal found the segment, false otherwise.
@@ -474,10 +481,12 @@ bool Reader::WalkSegmentSections(const Segment &segment,
reporter_->SectionsMissing(segment.name);
return false;
}
- if ((section.flags & SECTION_TYPE) == S_ZEROFILL) {
+ const uint32_t section_type = section.flags & SECTION_TYPE;
+ if (section_type == S_ZEROFILL || section_type == S_THREAD_LOCAL_ZEROFILL ||
+ section_type == S_GB_ZEROFILL) {
// Zero-fill sections have a size, but no contents.
section.contents.start = section.contents.end = NULL;
- } else if (segment.contents.start == NULL &&
+ } else if (segment.contents.start == NULL &&
segment.contents.end == NULL) {
// Mach-O files in .dSYM bundles have the contents of the loaded
// segments removed, and their file offsets and file sizes zeroed
diff --git a/3rdParty/Breakpad/src/common/mac/macho_reader.h b/3rdParty/Breakpad/src/common/mac/macho_reader.h
index 7537648..30db742 100644
--- a/3rdParty/Breakpad/src/common/mac/macho_reader.h
+++ b/3rdParty/Breakpad/src/common/mac/macho_reader.h
@@ -47,6 +47,7 @@
#include <vector>
#include "common/byte_cursor.h"
+#include "common/mac/super_fat_arch.h"
namespace google_breakpad {
namespace mach_o {
@@ -93,7 +94,7 @@ class FatReader {
// complete header, or the header implies that contents are present
// beyond the actual end of the file.
virtual void TooShort();
-
+
private:
// The filename to which the reader should attribute problems.
string filename_;
@@ -101,7 +102,7 @@ class FatReader {
// Create a fat binary file reader that uses |reporter| to report problems.
explicit FatReader(Reporter *reporter) : reporter_(reporter) { }
-
+
// Read the |size| bytes at |buffer| as a fat binary file. On success,
// return true; on failure, report the problem to reporter_ and return
// false.
@@ -111,13 +112,13 @@ class FatReader {
// single object file is the Mach-O file.
bool Read(const uint8_t *buffer, size_t size);
- // Return an array of 'struct fat_arch' structures describing the
+ // Return an array of 'SuperFatArch' structures describing the
// object files present in this fat binary file. Set |size| to the
// number of elements in the array.
//
- // Assuming Read returned true, the entries are validated: it is
- // safe to assume that the offsets and sizes in each 'struct
- // fat_arch' refer to subranges of the bytes passed to Read.
+ // Assuming Read returned true, the entries are validated: it is safe to
+ // assume that the offsets and sizes in each SuperFatArch refer to subranges
+ // of the bytes passed to Read.
//
// If there are no object files in this fat binary, then this
// function can return NULL.
@@ -129,7 +130,7 @@ class FatReader {
// possible to use the result with OS X functions like NXFindBestFatArch,
// so that the symbol dumper will behave consistently with other OS X
// utilities that work with fat binaries.
- const struct fat_arch *object_files(size_t *count) const {
+ const SuperFatArch* object_files(size_t *count) const {
*count = object_files_.size();
if (object_files_.size() > 0)
return &object_files_[0];
@@ -149,7 +150,7 @@ class FatReader {
// The list of object files in this binary.
// object_files_.size() == fat_header.nfat_arch
- vector<struct fat_arch> object_files_;
+ vector<SuperFatArch> object_files_;
};
// A segment in a Mach-O file. All these fields have been byte-swapped as
@@ -177,7 +178,7 @@ struct Segment {
// The maximum and initial VM protection of this segment's contents.
uint32_t maxprot;
uint32_t initprot;
-
+
// The number of sections in section_list.
uint32_t nsects;
@@ -376,7 +377,7 @@ class Reader {
return Read(buffer.start,
buffer.Size(),
expected_cpu_type,
- expected_cpu_subtype);
+ expected_cpu_subtype);
}
// Return this file's characteristics, as found in the Mach-O header.
diff --git a/3rdParty/Breakpad/src/common/mac/macho_reader_unittest.cc b/3rdParty/Breakpad/src/common/mac/macho_reader_unittest.cc
new file mode 100644
index 0000000..d8459d8
--- /dev/null
+++ b/3rdParty/Breakpad/src/common/mac/macho_reader_unittest.cc
@@ -0,0 +1,1902 @@
+// Copyright (c) 2010 Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// Original author: Jim Blandy <jimb@mozilla.com> <jimb@red-bean.com>
+
+// macho_reader_unittest.cc: Unit tests for google_breakpad::Mach_O::FatReader
+// and google_breakpad::Mach_O::Reader.
+
+#include <map>
+#include <string>
+#include <vector>
+
+#include "breakpad_googletest_includes.h"
+#include "common/mac/macho_reader.h"
+#include "common/test_assembler.h"
+
+namespace mach_o = google_breakpad::mach_o;
+namespace test_assembler = google_breakpad::test_assembler;
+
+using mach_o::FatReader;
+using mach_o::FileFlags;
+using mach_o::FileType;
+using mach_o::LoadCommandType;
+using mach_o::Reader;
+using mach_o::Section;
+using mach_o::SectionMap;
+using mach_o::Segment;
+using test_assembler::Endianness;
+using test_assembler::Label;
+using test_assembler::kBigEndian;
+using test_assembler::kLittleEndian;
+using test_assembler::kUnsetEndian;
+using google_breakpad::ByteBuffer;
+using std::map;
+using std::string;
+using std::vector;
+using testing::AllOf;
+using testing::DoAll;
+using testing::Field;
+using testing::InSequence;
+using testing::Matcher;
+using testing::Return;
+using testing::SaveArg;
+using testing::Test;
+using testing::_;
+
+
+// Mock classes for the reader's various reporters and handlers.
+
+class MockFatReaderReporter: public FatReader::Reporter {
+ public:
+ MockFatReaderReporter(const string &filename)
+ : FatReader::Reporter(filename) { }
+ MOCK_METHOD0(BadHeader, void());
+ MOCK_METHOD0(MisplacedObjectFile, void());
+ MOCK_METHOD0(TooShort, void());
+};
+
+class MockReaderReporter: public Reader::Reporter {
+ public:
+ MockReaderReporter(const string &filename) : Reader::Reporter(filename) { }
+ MOCK_METHOD0(BadHeader, void());
+ MOCK_METHOD4(CPUTypeMismatch, void(cpu_type_t cpu_type,
+ cpu_subtype_t cpu_subtype,
+ cpu_type_t expected_cpu_type,
+ cpu_subtype_t expected_cpu_subtype));
+ MOCK_METHOD0(HeaderTruncated, void());
+ MOCK_METHOD0(LoadCommandRegionTruncated, void());
+ MOCK_METHOD3(LoadCommandsOverrun, void(size_t claimed, size_t i,
+ LoadCommandType type));
+ MOCK_METHOD2(LoadCommandTooShort, void(size_t i, LoadCommandType type));
+ MOCK_METHOD1(SectionsMissing, void(const string &name));
+ MOCK_METHOD1(MisplacedSegmentData, void(const string &name));
+ MOCK_METHOD2(MisplacedSectionData, void(const string &section,
+ const string &segment));
+ MOCK_METHOD0(MisplacedSymbolTable, void());
+ MOCK_METHOD1(UnsupportedCPUType, void(cpu_type_t cpu_type));
+};
+
+class MockLoadCommandHandler: public Reader::LoadCommandHandler {
+ public:
+ MOCK_METHOD2(UnknownCommand, bool(LoadCommandType, const ByteBuffer &));
+ MOCK_METHOD1(SegmentCommand, bool(const Segment &));
+ MOCK_METHOD2(SymtabCommand, bool(const ByteBuffer &, const ByteBuffer &));
+};
+
+class MockSectionHandler: public Reader::SectionHandler {
+ public:
+ MOCK_METHOD1(HandleSection, bool(const Section &section));
+};
+
+
+// Tests for mach_o::FatReader.
+
+// Since the effect of these functions is to write to stderr, the
+// results of these tests must be inspected by hand.
+TEST(FatReaderReporter, BadHeader) {
+ FatReader::Reporter reporter("filename");
+ reporter.BadHeader();
+}
+
+TEST(FatReaderReporter, MisplacedObjectFile) {
+ FatReader::Reporter reporter("filename");
+ reporter.MisplacedObjectFile();
+}
+
+TEST(FatReaderReporter, TooShort) {
+ FatReader::Reporter reporter("filename");
+ reporter.TooShort();
+}
+
+TEST(MachOReaderReporter, BadHeader) {
+ Reader::Reporter reporter("filename");
+ reporter.BadHeader();
+}
+
+TEST(MachOReaderReporter, CPUTypeMismatch) {
+ Reader::Reporter reporter("filename");
+ reporter.CPUTypeMismatch(CPU_TYPE_I386, CPU_SUBTYPE_X86_ALL,
+ CPU_TYPE_POWERPC, CPU_SUBTYPE_POWERPC_ALL);
+}
+
+TEST(MachOReaderReporter, HeaderTruncated) {
+ Reader::Reporter reporter("filename");
+ reporter.HeaderTruncated();
+}
+
+TEST(MachOReaderReporter, LoadCommandRegionTruncated) {
+ Reader::Reporter reporter("filename");
+ reporter.LoadCommandRegionTruncated();
+}
+
+TEST(MachOReaderReporter, LoadCommandsOverrun) {
+ Reader::Reporter reporter("filename");
+ reporter.LoadCommandsOverrun(10, 9, LC_DYSYMTAB);
+ reporter.LoadCommandsOverrun(10, 9, 0);
+}
+
+TEST(MachOReaderReporter, LoadCommandTooShort) {
+ Reader::Reporter reporter("filename");
+ reporter.LoadCommandTooShort(11, LC_SYMTAB);
+}
+
+TEST(MachOReaderReporter, SectionsMissing) {
+ Reader::Reporter reporter("filename");
+ reporter.SectionsMissing("segment name");
+}
+
+TEST(MachOReaderReporter, MisplacedSegmentData) {
+ Reader::Reporter reporter("filename");
+ reporter.MisplacedSegmentData("segment name");
+}
+
+TEST(MachOReaderReporter, MisplacedSectionData) {
+ Reader::Reporter reporter("filename");
+ reporter.MisplacedSectionData("section name", "segment name");
+}
+
+TEST(MachOReaderReporter, MisplacedSymbolTable) {
+ Reader::Reporter reporter("filename");
+ reporter.MisplacedSymbolTable();
+}
+
+TEST(MachOReaderReporter, UnsupportedCPUType) {
+ Reader::Reporter reporter("filename");
+ reporter.UnsupportedCPUType(CPU_TYPE_HPPA);
+}
+
+struct FatReaderFixture {
+ FatReaderFixture()
+ : fat(kBigEndian),
+ reporter("reporter filename"),
+ reader(&reporter), object_files() {
+ EXPECT_CALL(reporter, BadHeader()).Times(0);
+ EXPECT_CALL(reporter, TooShort()).Times(0);
+
+ // here, start, and Mark are file offsets in 'fat'.
+ fat.start() = 0;
+ }
+ // Append a 'fat_arch' entry to 'fat', with the given field values.
+ void AppendFatArch(cpu_type_t type, cpu_subtype_t subtype,
+ Label offset, Label size, uint32_t align) {
+ fat
+ .B32(type)
+ .B32(subtype)
+ .B32(offset)
+ .B32(size)
+ .B32(align);
+ }
+ // Append |n| dummy 'fat_arch' entries to 'fat'. The cpu type and
+ // subtype have unrealistic values.
+ void AppendDummyArchEntries(int n) {
+ for (int i = 0; i < n; i++)
+ AppendFatArch(0xb68ad617, 0x715a0840, 0, 0, 1);
+ }
+ void ReadFat(bool expect_parse_success = true) {
+ ASSERT_TRUE(fat.GetContents(&contents));
+ fat_bytes = reinterpret_cast<const uint8_t *>(contents.data());
+ if (expect_parse_success) {
+ EXPECT_TRUE(reader.Read(fat_bytes, contents.size()));
+ size_t fat_files_count;
+ const SuperFatArch* fat_files = reader.object_files(&fat_files_count);
+ object_files.resize(fat_files_count);
+ for (size_t i = 0; i < fat_files_count; ++i) {
+ EXPECT_TRUE(fat_files[i].ConvertToFatArch(&object_files[i]));
+ }
+ }
+ else
+ EXPECT_FALSE(reader.Read(fat_bytes, contents.size()));
+ }
+ test_assembler::Section fat;
+ MockFatReaderReporter reporter;
+ FatReader reader;
+ string contents;
+ const uint8_t *fat_bytes;
+ vector<struct fat_arch> object_files;
+};
+
+class FatReaderTest: public FatReaderFixture, public Test { };
+
+TEST_F(FatReaderTest, BadMagic) {
+ EXPECT_CALL(reporter, BadHeader()).Times(1);
+ fat
+ .B32(0xcafed00d) // magic number (incorrect)
+ .B32(10); // number of architectures
+ AppendDummyArchEntries(10);
+ ReadFat(false);
+}
+
+TEST_F(FatReaderTest, HeaderTooShort) {
+ EXPECT_CALL(reporter, TooShort()).Times(1);
+ fat
+ .B32(0xcafebabe); // magic number
+ ReadFat(false);
+}
+
+TEST_F(FatReaderTest, ObjectListTooShort) {
+ EXPECT_CALL(reporter, TooShort()).Times(1);
+ fat
+ .B32(0xcafebabe) // magic number
+ .B32(10); // number of architectures
+ AppendDummyArchEntries(9); // nine dummy architecture entries...
+ fat // and a tenth, missing a byte at the end
+ .B32(0x3d46c8fc) // cpu type
+ .B32(0x8a7bfb01) // cpu subtype
+ .B32(0) // offset
+ .B32(0) // size
+ .Append(3, '*'); // one byte short of a four-byte alignment
+ ReadFat(false);
+}
+
+TEST_F(FatReaderTest, DataTooShort) {
+ EXPECT_CALL(reporter, MisplacedObjectFile()).Times(1);
+ Label arch_data;
+ fat
+ .B32(0xcafebabe) // magic number
+ .B32(1); // number of architectures
+ AppendFatArch(0xb4d4a366, 0x4ba4f525, arch_data, 40, 0);
+ fat
+ .Mark(&arch_data) // file data begins here
+ .Append(30, '*'); // only 30 bytes, not 40 as header claims
+ ReadFat(false);
+}
+
+TEST_F(FatReaderTest, NoObjectFiles) {
+ fat
+ .B32(0xcafebabe) // magic number
+ .B32(0); // number of architectures
+ ReadFat();
+ EXPECT_EQ(0U, object_files.size());
+}
+
+TEST_F(FatReaderTest, OneObjectFile) {
+ Label obj1_offset;
+ fat
+ .B32(0xcafebabe) // magic number
+ .B32(1); // number of architectures
+ // First object file list entry
+ AppendFatArch(0x5e3a6e91, 0x52ccd852, obj1_offset, 0x42, 0x355b15b2);
+ // First object file data
+ fat
+ .Mark(&obj1_offset)
+ .Append(0x42, '*'); // dummy contents
+ ReadFat();
+ ASSERT_EQ(1U, object_files.size());
+ EXPECT_EQ(0x5e3a6e91, object_files[0].cputype);
+ EXPECT_EQ(0x52ccd852, object_files[0].cpusubtype);
+ EXPECT_EQ(obj1_offset.Value(), object_files[0].offset);
+ EXPECT_EQ(0x42U, object_files[0].size);
+ EXPECT_EQ(0x355b15b2U, object_files[0].align);
+}
+
+TEST_F(FatReaderTest, ThreeObjectFiles) {
+ Label obj1, obj2, obj3;
+ fat
+ .B32(0xcafebabe) // magic number
+ .B32(3); // number of architectures
+ // Three object file list entries.
+ AppendFatArch(0x0cb92c30, 0x6a159a71, obj1, 0xfb4, 0x2615dbe8);
+ AppendFatArch(0x0f3f1cbb, 0x6c55e90f, obj2, 0xc31, 0x83af6ffd);
+ AppendFatArch(0x3717276d, 0x10ecdc84, obj3, 0x4b3, 0x035267d7);
+ fat
+ // First object file data
+ .Mark(&obj1)
+ .Append(0xfb4, '*') // dummy contents
+ // Second object file data
+ .Mark(&obj2)
+ .Append(0xc31, '%') // dummy contents
+ // Third object file data
+ .Mark(&obj3)
+ .Append(0x4b3, '^'); // dummy contents
+
+ ReadFat();
+
+ ASSERT_EQ(3U, object_files.size());
+
+ // First object file.
+ EXPECT_EQ(0x0cb92c30, object_files[0].cputype);
+ EXPECT_EQ(0x6a159a71, object_files[0].cpusubtype);
+ EXPECT_EQ(obj1.Value(), object_files[0].offset);
+ EXPECT_EQ(0xfb4U, object_files[0].size);
+ EXPECT_EQ(0x2615dbe8U, object_files[0].align);
+
+ // Second object file.
+ EXPECT_EQ(0x0f3f1cbb, object_files[1].cputype);
+ EXPECT_EQ(0x6c55e90f, object_files[1].cpusubtype);
+ EXPECT_EQ(obj2.Value(), object_files[1].offset);
+ EXPECT_EQ(0xc31U, object_files[1].size);
+ EXPECT_EQ(0x83af6ffdU, object_files[1].align);
+
+ // Third object file.
+ EXPECT_EQ(0x3717276d, object_files[2].cputype);
+ EXPECT_EQ(0x10ecdc84, object_files[2].cpusubtype);
+ EXPECT_EQ(obj3.Value(), object_files[2].offset);
+ EXPECT_EQ(0x4b3U, object_files[2].size);
+ EXPECT_EQ(0x035267d7U, object_files[2].align);
+}
+
+TEST_F(FatReaderTest, BigEndianMachO32) {
+ fat.set_endianness(kBigEndian);
+ fat
+ .D32(0xfeedface) // Mach-O file magic number
+ .D32(0x1a9d0518) // cpu type
+ .D32(0x1b779357) // cpu subtype
+ .D32(0x009df67e) // file type
+ .D32(0) // no load commands
+ .D32(0) // the load commands occupy no bytes
+ .D32(0x21987a99); // flags
+
+ ReadFat();
+
+ // FatReader should treat a Mach-O file as if it were a fat binary file
+ // containing one object file --- the whole thing.
+ ASSERT_EQ(1U, object_files.size());
+ EXPECT_EQ(0x1a9d0518, object_files[0].cputype);
+ EXPECT_EQ(0x1b779357, object_files[0].cpusubtype);
+ EXPECT_EQ(0U, object_files[0].offset);
+ EXPECT_EQ(contents.size(), object_files[0].size);
+}
+
+TEST_F(FatReaderTest, BigEndianMachO64) {
+ fat.set_endianness(kBigEndian);
+ fat
+ .D32(0xfeedfacf) // Mach-O 64-bit file magic number
+ .D32(0x5aff8487) // cpu type
+ .D32(0x4c6a57f7) // cpu subtype
+ .D32(0x4392d2c8) // file type
+ .D32(0) // no load commands
+ .D32(0) // the load commands occupy no bytes
+ .D32(0x1b033eea); // flags
+
+ ReadFat();
+
+ // FatReader should treat a Mach-O file as if it were a fat binary file
+ // containing one object file --- the whole thing.
+ ASSERT_EQ(1U, object_files.size());
+ EXPECT_EQ(0x5aff8487, object_files[0].cputype);
+ EXPECT_EQ(0x4c6a57f7, object_files[0].cpusubtype);
+ EXPECT_EQ(0U, object_files[0].offset);
+ EXPECT_EQ(contents.size(), object_files[0].size);
+}
+
+TEST_F(FatReaderTest, LittleEndianMachO32) {
+ fat.set_endianness(kLittleEndian);
+ fat
+ .D32(0xfeedface) // Mach-O file magic number
+ .D32(0x1a9d0518) // cpu type
+ .D32(0x1b779357) // cpu subtype
+ .D32(0x009df67e) // file type
+ .D32(0) // no load commands
+ .D32(0) // the load commands occupy no bytes
+ .D32(0x21987a99); // flags
+
+ ReadFat();
+
+ // FatReader should treat a Mach-O file as if it were a fat binary file
+ // containing one object file --- the whole thing.
+ ASSERT_EQ(1U, object_files.size());
+ EXPECT_EQ(0x1a9d0518, object_files[0].cputype);
+ EXPECT_EQ(0x1b779357, object_files[0].cpusubtype);
+ EXPECT_EQ(0U, object_files[0].offset);
+ EXPECT_EQ(contents.size(), object_files[0].size);
+}
+
+TEST_F(FatReaderTest, LittleEndianMachO64) {
+ fat.set_endianness(kLittleEndian);
+ fat
+ .D32(0xfeedfacf) // Mach-O 64-bit file magic number
+ .D32(0x5aff8487) // cpu type
+ .D32(0x4c6a57f7) // cpu subtype
+ .D32(0x4392d2c8) // file type
+ .D32(0) // no load commands
+ .D32(0) // the load commands occupy no bytes
+ .D32(0x1b033eea); // flags
+
+ ReadFat();
+
+ // FatReader should treat a Mach-O file as if it were a fat binary file
+ // containing one object file --- the whole thing.
+ ASSERT_EQ(1U, object_files.size());
+ EXPECT_EQ(0x5aff8487, object_files[0].cputype);
+ EXPECT_EQ(0x4c6a57f7, object_files[0].cpusubtype);
+ EXPECT_EQ(0U, object_files[0].offset);
+ EXPECT_EQ(contents.size(), object_files[0].size);
+}
+
+TEST_F(FatReaderTest, IncompleteMach) {
+ fat.set_endianness(kLittleEndian);
+ fat
+ .D32(0xfeedfacf) // Mach-O 64-bit file magic number
+ .D32(0x5aff8487); // cpu type
+ // Truncated!
+
+ EXPECT_CALL(reporter, TooShort()).WillOnce(Return());
+
+ ReadFat(false);
+}
+
+
+// General mach_o::Reader tests.
+
+// Dynamically scoped configuration data.
+class WithConfiguration {
+ public:
+ // Establish the given parameters as the default for SizedSections
+ // created within the dynamic scope of this instance.
+ WithConfiguration(Endianness endianness, size_t word_size)
+ : endianness_(endianness), word_size_(word_size), saved_(current_) {
+ current_ = this;
+ }
+ ~WithConfiguration() { current_ = saved_; }
+ static Endianness endianness() {
+ assert(current_);
+ return current_->endianness_;
+ }
+ static size_t word_size() {
+ assert(current_);
+ return current_->word_size_;
+ }
+
+ private:
+ // The innermost WithConfiguration in whose dynamic scope we are
+ // currently executing.
+ static WithConfiguration *current_;
+
+ // The innermost WithConfiguration whose dynamic scope encloses this
+ // WithConfiguration.
+ Endianness endianness_;
+ size_t word_size_;
+ WithConfiguration *saved_;
+};
+
+WithConfiguration *WithConfiguration::current_ = NULL;
+
+// A test_assembler::Section with a size that we can cite. The start(),
+// Here() and Mark() member functions of a SizedSection always represent
+// offsets within the overall file.
+class SizedSection: public test_assembler::Section {
+ public:
+ // Construct a section of the given endianness and word size.
+ explicit SizedSection(Endianness endianness, size_t word_size)
+ : test_assembler::Section(endianness), word_size_(word_size) {
+ assert(word_size_ == 32 || word_size_ == 64);
+ }
+ SizedSection()
+ : test_assembler::Section(WithConfiguration::endianness()),
+ word_size_(WithConfiguration::word_size()) {
+ assert(word_size_ == 32 || word_size_ == 64);
+ }
+
+ // Access/set this section's word size.
+ size_t word_size() const { return word_size_; }
+ void set_word_size(size_t word_size) {
+ assert(word_size_ == 32 || word_size_ == 64);
+ word_size_ = word_size;
+ }
+
+ // Return a label representing the size this section will have when it
+ // is Placed in some containing section.
+ Label final_size() const { return final_size_; }
+
+ // Append SECTION to the end of this section, and call its Finish member.
+ // Return a reference to this section.
+ SizedSection &Place(SizedSection *section) {
+ assert(section->endianness() == endianness());
+ section->Finish();
+ section->start() = Here();
+ test_assembler::Section::Append(*section);
+ return *this;
+ }
+
+ protected:
+ // Mark this section's contents as complete. For plain SizedSections, we
+ // set SECTION's start to its position in this section, and its final_size
+ // label to its current size. Derived classes can extend this as needed
+ // for their additional semantics.
+ virtual void Finish() {
+ final_size_ = Size();
+ }
+
+ // The word size for this data: either 32 or 64.
+ size_t word_size_;
+
+ private:
+ // This section's final size, set when we are placed in some other
+ // SizedSection.
+ Label final_size_;
+};
+
+// A SizedSection that is loaded into memory at a particular address.
+class LoadedSection: public SizedSection {
+ public:
+ explicit LoadedSection(Label address = Label()) : address_(address) { }
+
+ // Return a label representing this section's address.
+ Label address() const { return address_; }
+
+ // Placing a loaded section within a loaded section sets the relationship
+ // between their addresses.
+ LoadedSection &Place(LoadedSection *section) {
+ section->address() = address() + Size();
+ SizedSection::Place(section);
+ return *this;
+ }
+
+ protected:
+ // The address at which this section's contents will be loaded.
+ Label address_;
+};
+
+// A SizedSection representing a segment load command.
+class SegmentLoadCommand: public SizedSection {
+ public:
+ SegmentLoadCommand() : section_count_(0) { }
+
+ // Append a segment load command header with the given characteristics.
+ // The load command will refer to CONTENTS, which must be Placed in the
+ // file separately, at the desired position. Return a reference to this
+ // section.
+ SegmentLoadCommand &Header(const string &name, const LoadedSection &contents,
+ uint32_t maxprot, uint32_t initprot,
+ uint32_t flags) {
+ assert(contents.word_size() == word_size());
+ D32(word_size() == 32 ? LC_SEGMENT : LC_SEGMENT_64);
+ D32(final_size());
+ AppendCString(name, 16);
+ Append(endianness(), word_size() / 8, contents.address());
+ Append(endianness(), word_size() / 8, vmsize_);
+ Append(endianness(), word_size() / 8, contents.start());
+ Append(endianness(), word_size() / 8, contents.final_size());
+ D32(maxprot);
+ D32(initprot);
+ D32(final_section_count_);
+ D32(flags);
+
+ content_final_size_ = contents.final_size();
+
+ return *this;
+ }
+
+ // Return a label representing the size of this segment when loaded into
+ // memory. If this label is still undefined by the time we place this
+ // segment, it defaults to the final size of the segment's in-file
+ // contents. Return a reference to this load command.
+ Label &vmsize() { return vmsize_; }
+
+ // Add a section entry with the given characteristics to this segment
+ // load command. Return a reference to this. The section entry will refer
+ // to CONTENTS, which must be Placed in the segment's contents
+ // separately, at the desired position.
+ SegmentLoadCommand &AppendSectionEntry(const string &section_name,
+ const string &segment_name,
+ uint32_t alignment, uint32_t flags,
+ const LoadedSection &contents) {
+ AppendCString(section_name, 16);
+ AppendCString(segment_name, 16);
+ Append(endianness(), word_size() / 8, contents.address());
+ Append(endianness(), word_size() / 8, contents.final_size());
+ D32(contents.start());
+ D32(alignment);
+ D32(0); // relocations start
+ D32(0); // relocations size
+ D32(flags);
+ D32(0x93656b95); // reserved1
+ D32(0xc35a2473); // reserved2
+ if (word_size() == 64)
+ D32(0x70284b95); // reserved3
+
+ section_count_++;
+
+ return *this;
+ }
+
+ protected:
+ void Finish() {
+ final_section_count_ = section_count_;
+ if (!vmsize_.IsKnownConstant())
+ vmsize_ = content_final_size_;
+ SizedSection::Finish();
+ }
+
+ private:
+ // The number of sections that have been added to this segment so far.
+ size_t section_count_;
+
+ // A label representing the final number of sections this segment will hold.
+ Label final_section_count_;
+
+ // The size of the contents for this segment present in the file.
+ Label content_final_size_;
+
+ // A label representing the size of this segment when loaded; this can be
+ // larger than the size of its file contents, the difference being
+ // zero-filled. If not set explicitly by calling set_vmsize, this is set
+ // equal to the size of the contents.
+ Label vmsize_;
+};
+
+// A SizedSection holding a list of Mach-O load commands.
+class LoadCommands: public SizedSection {
+ public:
+ LoadCommands() : command_count_(0) { }
+
+ // Return a label representing the final load command count.
+ Label final_command_count() const { return final_command_count_; }
+
+ // Increment the command count; return a reference to this section.
+ LoadCommands &CountCommand() {
+ command_count_++;
+ return *this;
+ }
+
+ // Place COMMAND, containing a load command, at the end of this section.
+ // Return a reference to this section.
+ LoadCommands &Place(SizedSection *section) {
+ SizedSection::Place(section);
+ CountCommand();
+ return *this;
+ }
+
+ protected:
+ // Mark this load command list as complete.
+ void Finish() {
+ SizedSection::Finish();
+ final_command_count_ = command_count_;
+ }
+
+ private:
+ // The number of load commands we have added to this file so far.
+ size_t command_count_;
+
+ // A label representing the final command count.
+ Label final_command_count_;
+};
+
+// A SizedSection holding the contents of a Mach-O file. Within a
+// MachOFile, the start, Here, and Mark members refer to file offsets.
+class MachOFile: public SizedSection {
+ public:
+ MachOFile() {
+ start() = 0;
+ }
+
+ // Create a Mach-O file header using the given characteristics and load
+ // command list. This Places COMMANDS immediately after the header.
+ // Return a reference to this section.
+ MachOFile &Header(LoadCommands *commands,
+ cpu_type_t cpu_type = CPU_TYPE_X86,
+ cpu_subtype_t cpu_subtype = CPU_SUBTYPE_I386_ALL,
+ FileType file_type = MH_EXECUTE,
+ uint32_t file_flags = (MH_TWOLEVEL |
+ MH_DYLDLINK |
+ MH_NOUNDEFS)) {
+ D32(word_size() == 32 ? 0xfeedface : 0xfeedfacf); // magic number
+ D32(cpu_type); // cpu type
+ D32(cpu_subtype); // cpu subtype
+ D32(file_type); // file type
+ D32(commands->final_command_count()); // number of load commands
+ D32(commands->final_size()); // their size in bytes
+ D32(file_flags); // flags
+ if (word_size() == 64)
+ D32(0x55638b90); // reserved
+ Place(commands);
+ return *this;
+ }
+};
+
+
+struct ReaderFixture {
+ ReaderFixture()
+ : reporter("reporter filename"),
+ reader(&reporter) {
+ EXPECT_CALL(reporter, BadHeader()).Times(0);
+ EXPECT_CALL(reporter, CPUTypeMismatch(_, _, _, _)).Times(0);
+ EXPECT_CALL(reporter, HeaderTruncated()).Times(0);
+ EXPECT_CALL(reporter, LoadCommandRegionTruncated()).Times(0);
+ EXPECT_CALL(reporter, LoadCommandsOverrun(_, _, _)).Times(0);
+ EXPECT_CALL(reporter, LoadCommandTooShort(_, _)).Times(0);
+ EXPECT_CALL(reporter, SectionsMissing(_)).Times(0);
+ EXPECT_CALL(reporter, MisplacedSegmentData(_)).Times(0);
+ EXPECT_CALL(reporter, MisplacedSectionData(_, _)).Times(0);
+ EXPECT_CALL(reporter, MisplacedSymbolTable()).Times(0);
+ EXPECT_CALL(reporter, UnsupportedCPUType(_)).Times(0);
+
+ EXPECT_CALL(load_command_handler, UnknownCommand(_, _)).Times(0);
+ EXPECT_CALL(load_command_handler, SegmentCommand(_)).Times(0);
+ }
+
+ void ReadFile(MachOFile *file,
+ bool expect_parse_success,
+ cpu_type_t expected_cpu_type,
+ cpu_subtype_t expected_cpu_subtype) {
+ ASSERT_TRUE(file->GetContents(&file_contents));
+ file_bytes = reinterpret_cast<const uint8_t *>(file_contents.data());
+ if (expect_parse_success) {
+ EXPECT_TRUE(reader.Read(file_bytes,
+ file_contents.size(),
+ expected_cpu_type,
+ expected_cpu_subtype));
+ } else {
+ EXPECT_FALSE(reader.Read(file_bytes,
+ file_contents.size(),
+ expected_cpu_type,
+ expected_cpu_subtype));
+ }
+ }
+
+ string file_contents;
+ const uint8_t *file_bytes;
+ MockReaderReporter reporter;
+ Reader reader;
+ MockLoadCommandHandler load_command_handler;
+ MockSectionHandler section_handler;
+};
+
+class ReaderTest: public ReaderFixture, public Test { };
+
+TEST_F(ReaderTest, BadMagic) {
+ WithConfiguration config(kLittleEndian, 32);
+ const cpu_type_t kCPUType = 0x46b760df;
+ const cpu_subtype_t kCPUSubType = 0x76a0e7f7;
+ MachOFile file;
+ file
+ .D32(0x67bdebe1) // Not a proper magic number.
+ .D32(kCPUType) // cpu type
+ .D32(kCPUSubType) // cpu subtype
+ .D32(0x149fc717) // file type
+ .D32(0) // no load commands
+ .D32(0) // they occupy no bytes
+ .D32(0x80e71d64) // flags
+ .D32(0); // reserved
+ EXPECT_CALL(reporter, BadHeader()).WillOnce(Return());
+ ReadFile(&file, false, CPU_TYPE_ANY, kCPUSubType);
+}
+
+TEST_F(ReaderTest, MismatchedMagic) {
+ WithConfiguration config(kLittleEndian, 32);
+ const cpu_type_t kCPUType = CPU_TYPE_I386;
+ const cpu_subtype_t kCPUSubType = CPU_SUBTYPE_X86_ALL;
+ MachOFile file;
+ file
+ .D32(MH_CIGAM) // Right magic, but winds up wrong
+ // due to bitswapping
+ .D32(kCPUType) // cpu type
+ .D32(kCPUSubType) // cpu subtype
+ .D32(0x149fc717) // file type
+ .D32(0) // no load commands
+ .D32(0) // they occupy no bytes
+ .D32(0x80e71d64) // flags
+ .D32(0); // reserved
+ EXPECT_CALL(reporter, BadHeader()).WillOnce(Return());
+ ReadFile(&file, false, kCPUType, kCPUSubType);
+}
+
+TEST_F(ReaderTest, ShortMagic) {
+ WithConfiguration config(kBigEndian, 32);
+ MachOFile file;
+ file
+ .D16(0xfeed); // magic number
+ // truncated!
+ EXPECT_CALL(reporter, HeaderTruncated()).WillOnce(Return());
+ ReadFile(&file, false, CPU_TYPE_ANY, 0);
+}
+
+TEST_F(ReaderTest, ShortHeader) {
+ WithConfiguration config(kBigEndian, 32);
+ const cpu_type_t kCPUType = CPU_TYPE_ANY;
+ const cpu_subtype_t kCPUSubType = 0x76a0e7f7;
+ MachOFile file;
+ file
+ .D32(0xfeedface) // magic number
+ .D32(kCPUType) // cpu type
+ .D32(kCPUSubType) // cpu subtype
+ .D32(0x149fc717) // file type
+ .D32(0) // no load commands
+ .D32(0); // they occupy no bytes
+ EXPECT_CALL(reporter, HeaderTruncated()).WillOnce(Return());
+ ReadFile(&file, false, CPU_TYPE_ANY, kCPUSubType);
+}
+
+TEST_F(ReaderTest, MismatchedCPU) {
+ WithConfiguration config(kBigEndian, 32);
+ const cpu_type_t kCPUType = CPU_TYPE_I386;
+ const cpu_subtype_t kCPUSubType = CPU_SUBTYPE_X86_ALL;
+ MachOFile file;
+ file
+ .D32(MH_MAGIC) // Right magic for PPC (once bitswapped)
+ .D32(kCPUType) // cpu type
+ .D32(kCPUSubType) // cpu subtype
+ .D32(0x149fc717) // file type
+ .D32(0) // no load commands
+ .D32(0) // they occupy no bytes
+ .D32(0x80e71d64) // flags
+ .D32(0); // reserved
+ EXPECT_CALL(reporter,
+ CPUTypeMismatch(CPU_TYPE_I386, CPU_SUBTYPE_X86_ALL,
+ CPU_TYPE_POWERPC, CPU_SUBTYPE_POWERPC_ALL))
+ .WillOnce(Return());
+ ReadFile(&file, false, CPU_TYPE_POWERPC, CPU_SUBTYPE_POWERPC_ALL);
+}
+
+TEST_F(ReaderTest, LittleEndian32Bit) {
+ WithConfiguration config(kLittleEndian, 32);
+ const cpu_type_t kCPUType = 0x46b760df;
+ const cpu_subtype_t kCPUSubType = 0x76a0e7f7;
+ MachOFile file;
+ file
+ .D32(0xfeedface) // magic number
+ .D32(kCPUType) // cpu type
+ .D32(kCPUSubType) // cpu subtype
+ .D32(0x149fc717) // file type
+ .D32(0) // no load commands
+ .D32(0) // they occupy no bytes
+ .D32(0x80e71d64) // flags
+ .D32(0); // reserved
+ ReadFile(&file, true, CPU_TYPE_ANY, kCPUSubType);
+ EXPECT_FALSE(reader.bits_64());
+ EXPECT_FALSE(reader.big_endian());
+ EXPECT_EQ(kCPUType, reader.cpu_type());
+ EXPECT_EQ(kCPUSubType, reader.cpu_subtype());
+ EXPECT_EQ(FileType(0x149fc717), reader.file_type());
+ EXPECT_EQ(FileFlags(0x80e71d64), reader.flags());
+}
+
+TEST_F(ReaderTest, LittleEndian64Bit) {
+ WithConfiguration config(kLittleEndian, 64);
+ const cpu_type_t kCPUType = 0x46b760df;
+ const cpu_subtype_t kCPUSubType = 0x76a0e7f7;
+ MachOFile file;
+ file
+ .D32(0xfeedfacf) // magic number
+ .D32(kCPUType) // cpu type
+ .D32(kCPUSubType) // cpu subtype
+ .D32(0x149fc717) // file type
+ .D32(0) // no load commands
+ .D32(0) // they occupy no bytes
+ .D32(0x80e71d64) // flags
+ .D32(0); // reserved
+ ReadFile(&file, true, CPU_TYPE_ANY, kCPUSubType);
+ EXPECT_TRUE(reader.bits_64());
+ EXPECT_FALSE(reader.big_endian());
+ EXPECT_EQ(kCPUType, reader.cpu_type());
+ EXPECT_EQ(kCPUSubType, reader.cpu_subtype());
+ EXPECT_EQ(FileType(0x149fc717), reader.file_type());
+ EXPECT_EQ(FileFlags(0x80e71d64), reader.flags());
+}
+
+TEST_F(ReaderTest, BigEndian32Bit) {
+ WithConfiguration config(kBigEndian, 32);
+ const cpu_type_t kCPUType = 0x46b760df;
+ const cpu_subtype_t kCPUSubType = 0x76a0e7f7;
+ MachOFile file;
+ file
+ .D32(0xfeedface) // magic number
+ .D32(kCPUType) // cpu type
+ .D32(kCPUSubType) // cpu subtype
+ .D32(0x149fc717) // file type
+ .D32(0) // no load commands
+ .D32(0) // they occupy no bytes
+ .D32(0x80e71d64) // flags
+ .D32(0); // reserved
+ ReadFile(&file, true, CPU_TYPE_ANY, kCPUSubType);
+ EXPECT_FALSE(reader.bits_64());
+ EXPECT_TRUE(reader.big_endian());
+ EXPECT_EQ(kCPUType, reader.cpu_type());
+ EXPECT_EQ(kCPUSubType, reader.cpu_subtype());
+ EXPECT_EQ(FileType(0x149fc717), reader.file_type());
+ EXPECT_EQ(FileFlags(0x80e71d64), reader.flags());
+}
+
+TEST_F(ReaderTest, BigEndian64Bit) {
+ WithConfiguration config(kBigEndian, 64);
+ const cpu_type_t kCPUType = 0x46b760df;
+ const cpu_subtype_t kCPUSubType = 0x76a0e7f7;
+ MachOFile file;
+ file
+ .D32(0xfeedfacf) // magic number
+ .D32(kCPUType) // cpu type
+ .D32(kCPUSubType) // cpu subtype
+ .D32(0x149fc717) // file type
+ .D32(0) // no load commands
+ .D32(0) // they occupy no bytes
+ .D32(0x80e71d64) // flags
+ .D32(0); // reserved
+ ReadFile(&file, true, CPU_TYPE_ANY, kCPUSubType);
+ EXPECT_TRUE(reader.bits_64());
+ EXPECT_TRUE(reader.big_endian());
+ EXPECT_EQ(kCPUType, reader.cpu_type());
+ EXPECT_EQ(kCPUSubType, reader.cpu_subtype());
+ EXPECT_EQ(FileType(0x149fc717), reader.file_type());
+ EXPECT_EQ(FileFlags(0x80e71d64), reader.flags());
+}
+
+
+// Load command tests.
+
+class LoadCommand: public ReaderFixture, public Test { };
+
+TEST_F(LoadCommand, RegionTruncated) {
+ WithConfiguration config(kBigEndian, 64);
+ const cpu_type_t kCPUType = 0x46b760df;
+ const cpu_subtype_t kCPUSubType = 0x76a0e7f7;
+ MachOFile file;
+ file
+ .D32(0xfeedfacf) // magic number
+ .D32(kCPUType) // cpu type
+ .D32(kCPUSubType) // cpu subtype
+ .D32(0x149fc717) // file type
+ .D32(1) // one load command
+ .D32(40) // occupying 40 bytes
+ .D32(0x80e71d64) // flags
+ .D32(0) // reserved
+ .Append(20, 0); // load command region, not as long as
+ // Mach-O header promised
+
+ EXPECT_CALL(reporter, LoadCommandRegionTruncated()).WillOnce(Return());
+
+ ReadFile(&file, false, CPU_TYPE_ANY, kCPUSubType);
+}
+
+TEST_F(LoadCommand, None) {
+ WithConfiguration config(kLittleEndian, 32);
+ LoadCommands load_commands;
+ MachOFile file;
+ file.Header(&load_commands);
+
+ ReadFile(&file, true, CPU_TYPE_X86, CPU_SUBTYPE_I386_ALL);
+
+ EXPECT_FALSE(reader.bits_64());
+ EXPECT_FALSE(reader.big_endian());
+ EXPECT_EQ(CPU_TYPE_X86, reader.cpu_type());
+ EXPECT_EQ(CPU_SUBTYPE_I386_ALL, reader.cpu_subtype());
+ EXPECT_EQ(static_cast<uint32_t>(MH_EXECUTE), reader.file_type());
+ EXPECT_EQ(FileFlags(MH_TWOLEVEL |
+ MH_DYLDLINK |
+ MH_NOUNDEFS),
+ FileFlags(reader.flags()));
+
+ EXPECT_TRUE(reader.WalkLoadCommands(&load_command_handler));
+}
+
+TEST_F(LoadCommand, Unknown) {
+ WithConfiguration config(kBigEndian, 32);
+ LoadCommands load_commands;
+ load_commands
+ .CountCommand()
+ .D32(0x33293d4a) // unknown load command
+ .D32(40) // total size in bytes
+ .Append(32, '*'); // dummy data
+ MachOFile file;
+ file.Header(&load_commands);
+
+ ReadFile(&file, true, CPU_TYPE_ANY, 0);
+
+ EXPECT_FALSE(reader.bits_64());
+ EXPECT_TRUE(reader.big_endian());
+ EXPECT_EQ(CPU_TYPE_X86, reader.cpu_type());
+ EXPECT_EQ(CPU_SUBTYPE_I386_ALL, reader.cpu_subtype());
+ EXPECT_EQ(static_cast<uint32_t>(MH_EXECUTE), reader.file_type());
+ EXPECT_EQ(FileFlags(MH_TWOLEVEL |
+ MH_DYLDLINK |
+ MH_NOUNDEFS),
+ reader.flags());
+
+ ByteBuffer expected;
+ expected.start = file_bytes + load_commands.start().Value();
+ expected.end = expected.start + load_commands.final_size().Value();
+ EXPECT_CALL(load_command_handler, UnknownCommand(0x33293d4a,
+ expected))
+ .WillOnce(Return(true));
+
+ EXPECT_TRUE(reader.WalkLoadCommands(&load_command_handler));
+}
+
+TEST_F(LoadCommand, TypeIncomplete) {
+ WithConfiguration config(kLittleEndian, 32);
+ LoadCommands load_commands;
+ load_commands
+ .CountCommand()
+ .Append(3, 0); // load command type, incomplete
+
+ MachOFile file;
+ file.Header(&load_commands);
+
+ ReadFile(&file, true, CPU_TYPE_ANY, 0);
+
+ EXPECT_CALL(reporter, LoadCommandsOverrun(1, 0, 0))
+ .WillOnce(Return());
+ EXPECT_FALSE(reader.WalkLoadCommands(&load_command_handler));
+}
+
+TEST_F(LoadCommand, LengthIncomplete) {
+ WithConfiguration config(kBigEndian, 64);
+ LoadCommands load_commands;
+ load_commands
+ .CountCommand()
+ .D32(LC_SEGMENT); // load command
+ // no length
+ MachOFile file;
+ file.Header(&load_commands);
+
+ ReadFile(&file, true, CPU_TYPE_ANY, 0);
+
+ EXPECT_CALL(reporter, LoadCommandsOverrun(1, 0, LC_SEGMENT))
+ .WillOnce(Return());
+ EXPECT_FALSE(reader.WalkLoadCommands(&load_command_handler));
+}
+
+TEST_F(LoadCommand, ContentIncomplete) {
+ WithConfiguration config(kLittleEndian, 64);
+ LoadCommands load_commands;
+ load_commands
+ .CountCommand()
+ .D32(LC_SEGMENT) // load command
+ .D32(40) // total size in bytes
+ .Append(28, '*'); // not enough dummy data
+ MachOFile file;
+ file.Header(&load_commands);
+
+ ReadFile(&file, true, CPU_TYPE_ANY, 0);
+
+ EXPECT_CALL(reporter, LoadCommandsOverrun(1, 0, LC_SEGMENT))
+ .WillOnce(Return());
+ EXPECT_FALSE(reader.WalkLoadCommands(&load_command_handler));
+}
+
+TEST_F(LoadCommand, SegmentBE32) {
+ WithConfiguration config(kBigEndian, 32);
+ LoadedSection segment;
+ segment.address() = 0x1891139c;
+ segment.Append(42, '*'); // segment contents
+ SegmentLoadCommand segment_command;
+ segment_command
+ .Header("froon", segment, 0x94d6dd22, 0x8bdbc319, 0x990a16dd);
+ segment_command.vmsize() = 0xcb76584fU;
+ LoadCommands load_commands;
+ load_commands.Place(&segment_command);
+ MachOFile file;
+ file
+ .Header(&load_commands)
+ .Place(&segment);
+
+ ReadFile(&file, true, CPU_TYPE_ANY, 0);
+
+ Segment actual_segment;
+ EXPECT_CALL(load_command_handler, SegmentCommand(_))
+ .WillOnce(DoAll(SaveArg<0>(&actual_segment),
+ Return(true)));
+ EXPECT_TRUE(reader.WalkLoadCommands(&load_command_handler));
+
+ EXPECT_FALSE(actual_segment.bits_64);
+ EXPECT_EQ("froon", actual_segment.name);
+ EXPECT_EQ(0x1891139cU, actual_segment.vmaddr);
+ EXPECT_EQ(0xcb76584fU, actual_segment.vmsize);
+ EXPECT_EQ(0x94d6dd22U, actual_segment.maxprot);
+ EXPECT_EQ(0x8bdbc319U, actual_segment.initprot);
+ EXPECT_EQ(0x990a16ddU, actual_segment.flags);
+ EXPECT_EQ(0U, actual_segment.nsects);
+ EXPECT_EQ(0U, actual_segment.section_list.Size());
+ EXPECT_EQ(segment.final_size().Value(), actual_segment.contents.Size());
+}
+
+TEST_F(LoadCommand, SegmentLE32) {
+ WithConfiguration config(kLittleEndian, 32);
+ LoadedSection segment;
+ segment.address() = 0x4b877866;
+ segment.Append(42, '*'); // segment contents
+ SegmentLoadCommand segment_command;
+ segment_command
+ .Header("sixteenprecisely", segment,
+ 0x350759ed, 0x6cf5a62e, 0x990a16dd);
+ segment_command.vmsize() = 0xcb76584fU;
+ LoadCommands load_commands;
+ load_commands.Place(&segment_command);
+ MachOFile file;
+ file
+ .Header(&load_commands)
+ .Place(&segment);
+
+ ReadFile(&file, true, CPU_TYPE_ANY, 0);
+
+ Segment actual_segment;
+ EXPECT_CALL(load_command_handler, SegmentCommand(_))
+ .WillOnce(DoAll(SaveArg<0>(&actual_segment),
+ Return(true)));
+ EXPECT_TRUE(reader.WalkLoadCommands(&load_command_handler));
+
+ EXPECT_FALSE(actual_segment.bits_64);
+ EXPECT_EQ("sixteenprecisely", actual_segment.name);
+ EXPECT_EQ(0x4b877866U, actual_segment.vmaddr);
+ EXPECT_EQ(0xcb76584fU, actual_segment.vmsize);
+ EXPECT_EQ(0x350759edU, actual_segment.maxprot);
+ EXPECT_EQ(0x6cf5a62eU, actual_segment.initprot);
+ EXPECT_EQ(0x990a16ddU, actual_segment.flags);
+ EXPECT_EQ(0U, actual_segment.nsects);
+ EXPECT_EQ(0U, actual_segment.section_list.Size());
+ EXPECT_EQ(segment.final_size().Value(), actual_segment.contents.Size());
+}
+
+TEST_F(LoadCommand, SegmentBE64) {
+ WithConfiguration config(kBigEndian, 64);
+ LoadedSection segment;
+ segment.address() = 0x79f484f77009e511ULL;
+ segment.Append(42, '*'); // segment contents
+ SegmentLoadCommand segment_command;
+ segment_command
+ .Header("froon", segment, 0x42b45da5, 0x8bdbc319, 0xb2335220);
+ segment_command.vmsize() = 0x8d92397ce6248abaULL;
+ LoadCommands load_commands;
+ load_commands.Place(&segment_command);
+ MachOFile file;
+ file
+ .Header(&load_commands)
+ .Place(&segment);
+
+ ReadFile(&file, true, CPU_TYPE_ANY, 0);
+
+ Segment actual_segment;
+ EXPECT_CALL(load_command_handler, SegmentCommand(_))
+ .WillOnce(DoAll(SaveArg<0>(&actual_segment),
+ Return(true)));
+ EXPECT_TRUE(reader.WalkLoadCommands(&load_command_handler));
+
+ EXPECT_EQ(true, actual_segment.bits_64);
+ EXPECT_EQ("froon", actual_segment.name);
+ EXPECT_EQ(0x79f484f77009e511ULL, actual_segment.vmaddr);
+ EXPECT_EQ(0x8d92397ce6248abaULL, actual_segment.vmsize);
+ EXPECT_EQ(0x42b45da5U, actual_segment.maxprot);
+ EXPECT_EQ(0x8bdbc319U, actual_segment.initprot);
+ EXPECT_EQ(0xb2335220U, actual_segment.flags);
+ EXPECT_EQ(0U, actual_segment.nsects);
+ EXPECT_EQ(0U, actual_segment.section_list.Size());
+ EXPECT_EQ(segment.final_size().Value(), actual_segment.contents.Size());
+}
+
+TEST_F(LoadCommand, SegmentLE64) {
+ WithConfiguration config(kLittleEndian, 64);
+ LoadedSection segment;
+ segment.address() = 0x50c0501dc5922d35ULL;
+ segment.Append(42, '*'); // segment contents
+ SegmentLoadCommand segment_command;
+ segment_command
+ .Header("sixteenprecisely", segment,
+ 0x917c339d, 0xdbc446fa, 0xb650b563);
+ segment_command.vmsize() = 0x84ae73e7c75469bfULL;
+ LoadCommands load_commands;
+ load_commands.Place(&segment_command);
+ MachOFile file;
+ file
+ .Header(&load_commands)
+ .Place(&segment);
+
+ ReadFile(&file, true, CPU_TYPE_ANY, 0);
+
+ Segment actual_segment;
+ EXPECT_CALL(load_command_handler, SegmentCommand(_))
+ .WillOnce(DoAll(SaveArg<0>(&actual_segment),
+ Return(true)));
+ EXPECT_TRUE(reader.WalkLoadCommands(&load_command_handler));
+
+ EXPECT_EQ(true, actual_segment.bits_64);
+ EXPECT_EQ("sixteenprecisely", actual_segment.name);
+ EXPECT_EQ(0x50c0501dc5922d35ULL, actual_segment.vmaddr);
+ EXPECT_EQ(0x84ae73e7c75469bfULL, actual_segment.vmsize);
+ EXPECT_EQ(0x917c339dU, actual_segment.maxprot);
+ EXPECT_EQ(0xdbc446faU, actual_segment.initprot);
+ EXPECT_EQ(0xb650b563U, actual_segment.flags);
+ EXPECT_EQ(0U, actual_segment.nsects);
+ EXPECT_EQ(0U, actual_segment.section_list.Size());
+ EXPECT_EQ(segment.final_size().Value(), actual_segment.contents.Size());
+}
+
+TEST_F(LoadCommand, SegmentCommandTruncated) {
+ WithConfiguration config(kBigEndian, 32);
+ LoadedSection segment_contents;
+ segment_contents.Append(20, '*'); // lah di dah
+ SizedSection command;
+ command
+ .D32(LC_SEGMENT) // command type
+ .D32(command.final_size()) // command size
+ .AppendCString("too-short", 16) // segment name
+ .D32(0x9c759211) // vmaddr
+ .D32(segment_contents.final_size()) // vmsize
+ .D32(segment_contents.start()) // file offset
+ .D32(segment_contents.final_size()) // file size
+ .D32(0x56f28446) // max protection
+ .D32(0xe7910dcb) // initial protection
+ .D32(0) // no sections
+ .Append(3, 0); // flags (one byte short!)
+ LoadCommands load_commands;
+ load_commands.Place(&command);
+ MachOFile file;
+ file
+ .Header(&load_commands)
+ .Place(&segment_contents);
+
+ ReadFile(&file, true, CPU_TYPE_ANY, 0);
+
+ EXPECT_CALL(reporter, LoadCommandTooShort(0, LC_SEGMENT))
+ .WillOnce(Return());
+
+ EXPECT_FALSE(reader.WalkLoadCommands(&load_command_handler));
+}
+
+TEST_F(LoadCommand, SegmentBadContentOffset) {
+ WithConfiguration config(kLittleEndian, 32);
+ // Instead of letting a Place call set the segment's file offset and size,
+ // set them ourselves, to check that the parser catches invalid offsets
+ // instead of handing us bogus pointers.
+ LoadedSection segment;
+ segment.address() = 0x4db5489c;
+ segment.start() = 0x7e189e76; // beyond end of file
+ segment.final_size() = 0x98b9c3ab;
+ SegmentLoadCommand segment_command;
+ segment_command
+ .Header("notmerelyfifteen", segment, 0xcbab25ee, 0x359a20db, 0x68a3933f);
+ LoadCommands load_commands;
+ load_commands.Place(&segment_command);
+ MachOFile file;
+ file.Header(&load_commands);
+
+ ReadFile(&file, true, CPU_TYPE_ANY, 0);
+
+ EXPECT_CALL(reporter, MisplacedSegmentData("notmerelyfifteen"))
+ .WillOnce(Return());
+
+ EXPECT_FALSE(reader.WalkLoadCommands(&load_command_handler));
+}
+
+TEST_F(LoadCommand, ThreeLoadCommands) {
+ WithConfiguration config(kBigEndian, 32);
+ LoadedSection seg1, seg2, seg3;
+ SegmentLoadCommand cmd1, cmd2, cmd3;
+
+ seg1.Append(128, '@');
+ seg1.address() = 0xa7f61ef6;
+ cmd1.Header("head", seg1, 0x88bf1cc7, 0x889a26a4, 0xe9b80d87);
+ // Include some dummy data at the end of the load command. Since we
+ // didn't claim to have any sections, the reader should ignore this. But
+ // making sure the commands have different lengths ensures that we're
+ // using the right command's length to advance the LoadCommandIterator.
+ cmd1.Append(128, '!');
+
+ seg2.Append(42, '*');
+ seg2.address() = 0xc70fc909;
+ cmd2.Header("thorax", seg2, 0xde7327f4, 0xfdaf771d, 0x65e74b30);
+ // More dummy data at the end of the load command.
+ cmd2.Append(32, '^');
+
+ seg3.Append(42, '%');
+ seg3.address() = 0x46b3ab05;
+ cmd3.Header("abdomen", seg3, 0x7098b70d, 0x8d8d7728, 0x5131419b);
+ // More dummy data at the end of the load command.
+ cmd3.Append(64, '&');
+
+ LoadCommands load_commands;
+ load_commands.Place(&cmd1).Place(&cmd2).Place(&cmd3);
+
+ MachOFile file;
+ file.Header(&load_commands).Place(&seg1).Place(&seg2).Place(&seg3);
+
+ ReadFile(&file, true, CPU_TYPE_ANY, 0);
+
+ {
+ InSequence s;
+ EXPECT_CALL(load_command_handler,
+ SegmentCommand(Field(&Segment::name, "head")))
+ .WillOnce(Return(true));
+ EXPECT_CALL(load_command_handler,
+ SegmentCommand(Field(&Segment::name, "thorax")))
+ .WillOnce(Return(true));
+ EXPECT_CALL(load_command_handler,
+ SegmentCommand(Field(&Segment::name, "abdomen")))
+ .WillOnce(Return(true));
+ }
+
+ EXPECT_TRUE(reader.WalkLoadCommands(&load_command_handler));
+}
+
+static inline Matcher<const Section &> MatchSection(
+ Matcher<bool> bits_64,
+ Matcher<const string &> section_name,
+ Matcher<const string &> segment_name,
+ Matcher<uint64_t> address,
+ Matcher<uint32_t> alignment,
+ Matcher<uint32_t> flags,
+ Matcher<const ByteBuffer &> contents) {
+ return AllOf(AllOf(Field(&Section::bits_64, bits_64),
+ Field(&Section::section_name, section_name),
+ Field(&Section::segment_name, segment_name),
+ Field(&Section::address, address)),
+ AllOf(Field(&Section::align, alignment),
+ Field(&Section::flags, flags),
+ Field(&Section::contents, contents)));
+}
+
+static inline Matcher<const Section &> MatchSection(
+ Matcher<bool> bits_64,
+ Matcher<const string &> section_name,
+ Matcher<const string &> segment_name,
+ Matcher<uint64_t> address) {
+ return AllOf(Field(&Section::bits_64, bits_64),
+ Field(&Section::section_name, section_name),
+ Field(&Section::segment_name, segment_name),
+ Field(&Section::address, address));
+}
+
+TEST_F(LoadCommand, OneSegmentTwoSections) {
+ WithConfiguration config(kBigEndian, 64);
+
+ // Create some sections with some data.
+ LoadedSection section1, section2;
+ section1.Append("buddha's hand");
+ section2.Append("kumquat");
+
+ // Create a segment to hold them.
+ LoadedSection segment;
+ segment.address() = 0xe1d0eeec;
+ segment.Place(&section2).Place(&section1);
+
+ SegmentLoadCommand segment_command;
+ segment_command
+ .Header("head", segment, 0x92c9568c, 0xa89f2627, 0x4dc7a1e2)
+ .AppendSectionEntry("mandarin", "kishu", 12, 0x8cd4604bU, section1)
+ .AppendSectionEntry("bergamot", "cara cara", 12, 0x98746efaU, section2);
+
+ LoadCommands commands;
+ commands.Place(&segment_command);
+
+ MachOFile file;
+ file.Header(&commands).Place(&segment);
+
+ ReadFile(&file, true, CPU_TYPE_ANY, 0);
+
+ Segment actual_segment;
+ EXPECT_CALL(load_command_handler, SegmentCommand(_))
+ .WillOnce(DoAll(SaveArg<0>(&actual_segment),
+ Return(true)));
+ EXPECT_TRUE(reader.WalkLoadCommands(&load_command_handler));
+
+ {
+ InSequence s;
+ ByteBuffer contents1;
+ contents1.start = file_bytes + section1.start().Value();
+ contents1.end = contents1.start + section1.final_size().Value();
+ EXPECT_EQ("buddha's hand",
+ string(reinterpret_cast<const char *>(contents1.start),
+ contents1.Size()));
+ EXPECT_CALL(section_handler,
+ HandleSection(MatchSection(true, "mandarin", "kishu",
+ section1.address().Value(), 12,
+ 0x8cd4604bU, contents1)))
+ .WillOnce(Return(true));
+
+ ByteBuffer contents2;
+ contents2.start = file_bytes + section2.start().Value();
+ contents2.end = contents2.start + section2.final_size().Value();
+ EXPECT_EQ("kumquat",
+ string(reinterpret_cast<const char *>(contents2.start),
+ contents2.Size()));
+ EXPECT_CALL(section_handler,
+ HandleSection(MatchSection(true, "bergamot", "cara cara",
+ section2.address().Value(), 12,
+ 0x98746efaU, contents2)))
+ .WillOnce(Return(true));
+ }
+
+ EXPECT_TRUE(reader.WalkSegmentSections(actual_segment, &section_handler));
+}
+
+TEST_F(LoadCommand, MisplacedSectionBefore) {
+ WithConfiguration config(kLittleEndian, 64);
+
+ // The segment.
+ LoadedSection segment;
+ segment.address() = 0x696d83cc;
+ segment.Append(10, '0');
+
+ // The contents of the following sections don't matter, because
+ // we're not really going to Place them in segment; we're just going
+ // to set all their labels by hand to get the (impossible)
+ // configurations we want.
+
+ // A section whose starting offset is before that of its section.
+ LoadedSection before;
+ before.Append(10, '1');
+ before.start() = segment.start() - 1;
+ before.address() = segment.address() - 1;
+ before.final_size() = before.Size();
+
+ SegmentLoadCommand command;
+ command
+ .Header("segment", segment, 0x173baa29, 0x8407275d, 0xed8f7057)
+ .AppendSectionEntry("before", "segment", 0, 0x686c6921, before);
+
+ LoadCommands commands;
+ commands.Place(&command);
+
+ MachOFile file;
+ file.Header(&commands).Place(&segment);
+
+ ReadFile(&file, true, CPU_TYPE_ANY, 0);
+
+ Segment actual_segment;
+ EXPECT_TRUE(reader.FindSegment("segment", &actual_segment));
+
+ EXPECT_CALL(reporter, MisplacedSectionData("before", "segment"))
+ .WillOnce(Return());
+ EXPECT_FALSE(reader.WalkSegmentSections(actual_segment, &section_handler));
+}
+
+TEST_F(LoadCommand, MisplacedSectionAfter) {
+ WithConfiguration config(kLittleEndian, 64);
+
+ // The segment.
+ LoadedSection segment;
+ segment.address() = 0x696d83cc;
+ segment.Append(10, '0');
+
+ // The contents of the following sections don't matter, because
+ // we're not really going to Place them in segment; we're just going
+ // to set all their labels by hand to get the (impossible)
+ // configurations we want.
+
+ // A section whose starting offset is after the end of its section.
+ LoadedSection after;
+ after.Append(10, '2');
+ after.start() = segment.start() + 11;
+ after.address() = segment.address() + 11;
+ after.final_size() = after.Size();
+
+ SegmentLoadCommand command;
+ command
+ .Header("segment", segment, 0x173baa29, 0x8407275d, 0xed8f7057)
+ .AppendSectionEntry("after", "segment", 0, 0x2ee50124, after);
+
+ LoadCommands commands;
+ commands.Place(&command);
+
+ MachOFile file;
+ file.Header(&commands).Place(&segment);
+
+ ReadFile(&file, true, CPU_TYPE_ANY, 0);
+
+ Segment actual_segment;
+ EXPECT_TRUE(reader.FindSegment("segment", &actual_segment));
+
+ EXPECT_CALL(reporter, MisplacedSectionData("after", "segment"))
+ .WillOnce(Return());
+ EXPECT_FALSE(reader.WalkSegmentSections(actual_segment, &section_handler));
+}
+
+TEST_F(LoadCommand, MisplacedSectionTooBig) {
+ WithConfiguration config(kLittleEndian, 64);
+
+ // The segment.
+ LoadedSection segment;
+ segment.address() = 0x696d83cc;
+ segment.Append(10, '0');
+
+ // The contents of the following sections don't matter, because
+ // we're not really going to Place them in segment; we're just going
+ // to set all their labels by hand to get the (impossible)
+ // configurations we want.
+
+ // A section that extends beyond the end of its section.
+ LoadedSection too_big;
+ too_big.Append(10, '3');
+ too_big.start() = segment.start() + 1;
+ too_big.address() = segment.address() + 1;
+ too_big.final_size() = too_big.Size();
+
+ SegmentLoadCommand command;
+ command
+ .Header("segment", segment, 0x173baa29, 0x8407275d, 0xed8f7057)
+ .AppendSectionEntry("too big", "segment", 0, 0x8b53ae5c, too_big);
+
+ LoadCommands commands;
+ commands.Place(&command);
+
+ MachOFile file;
+ file.Header(&commands).Place(&segment);
+
+ ReadFile(&file, true, CPU_TYPE_ANY, 0);
+
+ Segment actual_segment;
+ EXPECT_TRUE(reader.FindSegment("segment", &actual_segment));
+
+ EXPECT_CALL(reporter, MisplacedSectionData("too big", "segment"))
+ .WillOnce(Return());
+ EXPECT_FALSE(reader.WalkSegmentSections(actual_segment, &section_handler));
+}
+
+
+// The segments in a .dSYM bundle's Mach-O file have their file offset
+// and size set to zero, but the sections don't. The reader shouldn't
+// report an error in this case.
+TEST_F(LoadCommand, ZappedSegment) {
+ WithConfiguration config(kBigEndian, 32);
+
+ // The segment.
+ LoadedSection segment;
+ segment.address() = 0x696d83cc;
+ segment.start() = 0;
+ segment.final_size() = 0;
+
+ // The section.
+ LoadedSection section;
+ section.address() = segment.address();
+ section.start() = 0;
+ section.final_size() = 1000; // extends beyond its segment
+
+ SegmentLoadCommand command;
+ command
+ .Header("zapped", segment, 0x0861a5cb, 0x68ccff67, 0x0b66255c)
+ .AppendSectionEntry("twitching", "zapped", 0, 0x93b3bd42, section);
+
+ LoadCommands commands;
+ commands.Place(&command);
+
+ MachOFile file;
+ file.Header(&commands);
+
+ ReadFile(&file, true, CPU_TYPE_ANY, 0);
+
+ Segment actual_segment;
+ EXPECT_TRUE(reader.FindSegment("zapped", &actual_segment));
+
+ ByteBuffer zapped_extent(NULL, 0);
+ EXPECT_CALL(section_handler,
+ HandleSection(MatchSection(false, "twitching", "zapped",
+ 0x696d83cc, 0, 0x93b3bd42,
+ zapped_extent)))
+ .WillOnce(Return(true));
+
+ EXPECT_TRUE(reader.WalkSegmentSections(actual_segment, &section_handler));
+}
+
+TEST_F(LoadCommand, MapSegmentSections) {
+ WithConfiguration config(kLittleEndian, 32);
+
+ // Create some sections with some data.
+ LoadedSection section1, section2, section3, section4;
+ section1.Append("buddha's hand");
+ section2.start() = 0; // Section 2 is an S_ZEROFILL section.
+ section2.final_size() = 0;
+ section3.Append("shasta gold");
+ section4.Append("satsuma");
+
+ // Create two segments to hold them.
+ LoadedSection segment1, segment2;
+ segment1.address() = 0x13e6c8a9;
+ segment1.Place(&section3).Place(&section1);
+ segment2.set_word_size(64);
+ segment2.address() = 0x04d462e2;
+ segment2.Place(&section4);
+ section2.address() = segment2.address() + segment2.Size();
+
+ SegmentLoadCommand segment_command1, segment_command2;
+ segment_command1
+ .Header("head", segment1, 0x67d955a6, 0x7a61c13e, 0xe3e50c64)
+ .AppendSectionEntry("mandarin", "head", 12, 0x5bb565d7, section1)
+ .AppendSectionEntry("bergamot", "head", 12, 0x8620de73, section3);
+ segment_command2.set_word_size(64);
+ segment_command2
+ .Header("thorax", segment2, 0x7aab2419, 0xe908007f, 0x17961d33)
+ .AppendSectionEntry("sixteenprecisely", "thorax",
+ 12, S_ZEROFILL, section2)
+ .AppendSectionEntry("cara cara", "thorax", 12, 0xb6c5dd8a, section4);
+
+ LoadCommands commands;
+ commands.Place(&segment_command1).Place(&segment_command2);
+
+ MachOFile file;
+ file.Header(&commands).Place(&segment1).Place(&segment2);
+
+ ReadFile(&file, true, CPU_TYPE_ANY, 0);
+
+ Segment segment;
+ SectionMap section_map;
+
+ EXPECT_FALSE(reader.FindSegment("smoot", &segment));
+
+ ASSERT_TRUE(reader.FindSegment("thorax", &segment));
+ ASSERT_TRUE(reader.MapSegmentSections(segment, &section_map));
+
+ EXPECT_FALSE(section_map.find("sixteenpreciselyandthensome")
+ != section_map.end());
+ EXPECT_FALSE(section_map.find("mandarin") != section_map.end());
+ ASSERT_TRUE(section_map.find("cara cara") != section_map.end());
+ EXPECT_THAT(section_map["cara cara"],
+ MatchSection(true, "cara cara", "thorax", 0x04d462e2));
+ ASSERT_TRUE(section_map.find("sixteenprecisely")
+ != section_map.end());
+ ByteBuffer sixteenprecisely_contents(NULL, 0);
+ EXPECT_THAT(section_map["sixteenprecisely"],
+ MatchSection(true, "sixteenprecisely", "thorax",
+ 0x04d462e2 + 7, 12, S_ZEROFILL,
+ sixteenprecisely_contents));
+
+ ASSERT_TRUE(reader.FindSegment("head", &segment));
+ ASSERT_TRUE(reader.MapSegmentSections(segment, &section_map));
+
+ ASSERT_TRUE(section_map.find("mandarin") != section_map.end());
+ EXPECT_THAT(section_map["mandarin"],
+ MatchSection(false, "mandarin", "head", 0x13e6c8a9 + 11));
+ ASSERT_TRUE(section_map.find("bergamot") != section_map.end());
+ EXPECT_THAT(section_map["bergamot"],
+ MatchSection(false, "bergamot", "head", 0x13e6c8a9));
+}
+
+TEST_F(LoadCommand, FindSegment) {
+ WithConfiguration config(kBigEndian, 32);
+
+ LoadedSection segment1, segment2, segment3;
+ segment1.address() = 0xb8ae5752;
+ segment1.Append("Some contents!");
+ segment2.address() = 0xd6b0ce83;
+ segment2.Append("Different stuff.");
+ segment3.address() = 0x7374fd2a;
+ segment3.Append("Further materials.");
+
+ SegmentLoadCommand cmd1, cmd2, cmd3;
+ cmd1.Header("first", segment1, 0xfadb6932, 0x175bf529, 0x0de790ad);
+ cmd2.Header("second", segment2, 0xeef716e0, 0xe103a9d7, 0x7d38a8ef);
+ cmd3.Header("third", segment3, 0xe172b39e, 0x86012f07, 0x080ac94d);
+
+ LoadCommands commands;
+ commands.Place(&cmd1).Place(&cmd2).Place(&cmd3);
+
+ MachOFile file;
+ file.Header(&commands).Place(&segment1).Place(&segment2).Place(&segment3);
+
+ ReadFile(&file, true, CPU_TYPE_ANY, 0);
+
+ Segment actual_segment;
+
+ EXPECT_FALSE(reader.FindSegment("murphy", &actual_segment));
+
+ EXPECT_TRUE(reader.FindSegment("second", &actual_segment));
+ EXPECT_EQ(0xd6b0ce83, actual_segment.vmaddr);
+}
+
+
+// Symtab tests.
+
+// A StringAssembler is a class for generating .stabstr sections to present
+// as input to the STABS parser.
+class StringAssembler: public SizedSection {
+ public:
+ // Add the string S to this StringAssembler, and return the string's
+ // offset within this compilation unit's strings.
+ size_t Add(const string &s) {
+ size_t offset = Size();
+ AppendCString(s);
+ return offset;
+ }
+};
+
+// A SymbolAssembler is a class for generating .stab sections to present as
+// test input for the STABS parser.
+class SymbolAssembler: public SizedSection {
+ public:
+ // Create a SymbolAssembler that uses StringAssembler for its strings.
+ explicit SymbolAssembler(StringAssembler *string_assembler)
+ : string_assembler_(string_assembler),
+ entry_count_(0) { }
+
+ // Append a STAB entry to the end of this section with the given
+ // characteristics. NAME is the offset of this entry's name string within
+ // its compilation unit's portion of the .stabstr section; this can be a
+ // value generated by a StringAssembler. Return a reference to this
+ // SymbolAssembler.
+ SymbolAssembler &Symbol(uint8_t type, uint8_t other, Label descriptor,
+ Label value, Label name) {
+ D32(name);
+ D8(type);
+ D8(other);
+ D16(descriptor);
+ Append(endianness(), word_size_ / 8, value);
+ entry_count_++;
+ return *this;
+ }
+
+ // As above, but automatically add NAME to our StringAssembler.
+ SymbolAssembler &Symbol(uint8_t type, uint8_t other, Label descriptor,
+ Label value, const string &name) {
+ return Symbol(type, other, descriptor, value, string_assembler_->Add(name));
+ }
+
+ private:
+ // The strings for our STABS entries.
+ StringAssembler *string_assembler_;
+
+ // The number of entries in this compilation unit so far.
+ size_t entry_count_;
+};
+
+class Symtab: public ReaderFixture, public Test { };
+
+TEST_F(Symtab, Symtab32) {
+ WithConfiguration config(kLittleEndian, 32);
+
+ StringAssembler strings;
+ SymbolAssembler symbols(&strings);
+ symbols
+ .Symbol(0x52, 0x7c, 0x3470, 0x9bb02e7c, "hrududu")
+ .Symbol(0x50, 0x90, 0x7520, 0x1122525d, "Frith");
+
+ SizedSection symtab_command;
+ symtab_command
+ .D32(LC_SYMTAB) // command
+ .D32(symtab_command.final_size()) // size
+ .D32(symbols.start()) // file offset of symbols
+ .D32(2) // symbol count
+ .D32(strings.start()) // file offset of strings
+ .D32(strings.final_size()); // strings size
+
+ LoadCommands load_commands;
+ load_commands.Place(&symtab_command);
+
+ MachOFile file;
+ file.Header(&load_commands).Place(&symbols).Place(&strings);
+
+ ReadFile(&file, true, CPU_TYPE_ANY, 0);
+
+ ByteBuffer symbols_found, strings_found;
+ EXPECT_CALL(load_command_handler, SymtabCommand(_, _))
+ .WillOnce(DoAll(SaveArg<0>(&symbols_found),
+ SaveArg<1>(&strings_found),
+ Return(true)));
+ EXPECT_TRUE(reader.WalkLoadCommands(&load_command_handler));
+
+ EXPECT_EQ(24U, symbols_found.Size());
+ EXPECT_EQ(14U, strings_found.Size());
+}
+
+TEST_F(Symtab, Symtab64) {
+ WithConfiguration config(kBigEndian, 64);
+
+ StringAssembler strings;
+ SymbolAssembler symbols(&strings);
+ symbols
+ .Symbol(0xa7, 0xaf, 0x03af, 0x42f3072c74335181ULL, "foo")
+ .Symbol(0xb0, 0x9a, 0x2aa7, 0x2e2d349b3d5744a0ULL, "bar");
+
+ SizedSection symtab_command;
+ symtab_command
+ .D32(LC_SYMTAB) // command
+ .D32(symtab_command.final_size()) // size
+ .D32(symbols.start()) // file offset of symbols
+ .D32(2) // symbol count
+ .D32(strings.start()) // file offset of strings
+ .D32(strings.final_size()); // strings size
+
+ LoadCommands load_commands;
+ load_commands.Place(&symtab_command);
+
+ MachOFile file;
+ file.Header(&load_commands).Place(&symbols).Place(&strings);
+
+ ReadFile(&file, true, CPU_TYPE_ANY, 0);
+
+ ByteBuffer symbols_found, strings_found;
+ EXPECT_CALL(load_command_handler, SymtabCommand(_, _))
+ .WillOnce(DoAll(SaveArg<0>(&symbols_found),
+ SaveArg<1>(&strings_found),
+ Return(true)));
+ EXPECT_TRUE(reader.WalkLoadCommands(&load_command_handler));
+
+ EXPECT_EQ(32U, symbols_found.Size());
+ EXPECT_EQ(8U, strings_found.Size());
+}
+
+TEST_F(Symtab, SymtabMisplacedSymbols) {
+ WithConfiguration config(kBigEndian, 32);
+
+ StringAssembler strings;
+ SymbolAssembler symbols(&strings);
+ symbols
+ .Symbol(0xa7, 0xaf, 0x03af, 0x42f3072c74335181ULL, "foo")
+ .Symbol(0xb0, 0x9a, 0x2aa7, 0x2e2d349b3d5744a0ULL, "bar");
+
+ SizedSection symtab_command;
+ symtab_command
+ .D32(LC_SYMTAB) // command
+ .D32(symtab_command.final_size()) // size
+ .D32(symbols.start()) // file offset of symbols
+ .D32(3) // symbol count (too many)
+ .D32(strings.start()) // file offset of strings
+ .D32(strings.final_size()); // strings size
+
+ LoadCommands load_commands;
+ load_commands.Place(&symtab_command);
+
+ MachOFile file;
+ // Put symbols at end, so the excessive length will be noticed.
+ file.Header(&load_commands).Place(&strings).Place(&symbols);
+
+ ReadFile(&file, true, CPU_TYPE_ANY, 0);
+
+ EXPECT_CALL(reporter, MisplacedSymbolTable()).Times(1);
+ EXPECT_FALSE(reader.WalkLoadCommands(&load_command_handler));
+}
+
+TEST_F(Symtab, SymtabMisplacedStrings) {
+ WithConfiguration config(kLittleEndian, 32);
+
+ StringAssembler strings;
+ SymbolAssembler symbols(&strings);
+ symbols
+ .Symbol(0xa7, 0xaf, 0x03af, 0x42f3072c74335181ULL, "foo")
+ .Symbol(0xb0, 0x9a, 0x2aa7, 0x2e2d349b3d5744a0ULL, "bar");
+
+ SizedSection symtab_command;
+ symtab_command
+ .D32(LC_SYMTAB) // command
+ .D32(symtab_command.final_size()) // size
+ .D32(symbols.start()) // file offset of symbols
+ .D32(2) // symbol count
+ .D32(strings.start()) // file offset of strings
+ .D32(strings.final_size() + 1); // strings size (too long)
+
+ LoadCommands load_commands;
+ load_commands.Place(&symtab_command);
+
+ MachOFile file;
+ // Put strings at end, so the excessive length will be noticed.
+ file.Header(&load_commands).Place(&symbols).Place(&strings);
+
+ ReadFile(&file, true, CPU_TYPE_ANY, 0);
+
+ EXPECT_CALL(reporter, MisplacedSymbolTable()).Times(1);
+ EXPECT_FALSE(reader.WalkLoadCommands(&load_command_handler));
+}
+
diff --git a/3rdParty/Breakpad/src/common/mac/macho_utilities.cc b/3rdParty/Breakpad/src/common/mac/macho_utilities.cc
index 89f9e77..f56fe76 100644
--- a/3rdParty/Breakpad/src/common/mac/macho_utilities.cc
+++ b/3rdParty/Breakpad/src/common/mac/macho_utilities.cc
@@ -34,16 +34,44 @@
#include "common/mac/byteswap.h"
#include "common/mac/macho_utilities.h"
-void breakpad_swap_uuid_command(struct breakpad_uuid_command *uc,
- enum NXByteOrder target_byte_order)
-{
+#include <mach-o/fat.h>
+#include <mach-o/loader.h>
+
+void breakpad_swap_uuid_command(struct breakpad_uuid_command *uc) {
uc->cmd = ByteSwap(uc->cmd);
uc->cmdsize = ByteSwap(uc->cmdsize);
}
-void breakpad_swap_segment_command_64(struct segment_command_64 *sg,
- enum NXByteOrder target_byte_order)
-{
+void breakpad_swap_load_command(struct load_command *lc) {
+ lc->cmd = ByteSwap(lc->cmd);
+ lc->cmdsize = ByteSwap(lc->cmdsize);
+}
+
+void breakpad_swap_dylib_command(struct dylib_command *dc) {
+ dc->cmd = ByteSwap(dc->cmd);
+ dc->cmdsize = ByteSwap(dc->cmdsize);
+
+ dc->dylib.name.offset = ByteSwap(dc->dylib.name.offset);
+ dc->dylib.timestamp = ByteSwap(dc->dylib.timestamp);
+ dc->dylib.current_version = ByteSwap(dc->dylib.current_version);
+ dc->dylib.compatibility_version = ByteSwap(dc->dylib.compatibility_version);
+}
+
+void breakpad_swap_segment_command(struct segment_command *sc) {
+ sc->cmd = ByteSwap(sc->cmd);
+ sc->cmdsize = ByteSwap(sc->cmdsize);
+
+ sc->vmaddr = ByteSwap(sc->vmaddr);
+ sc->vmsize = ByteSwap(sc->vmsize);
+ sc->fileoff = ByteSwap(sc->fileoff);
+ sc->filesize = ByteSwap(sc->filesize);
+ sc->maxprot = ByteSwap(sc->maxprot);
+ sc->initprot = ByteSwap(sc->initprot);
+ sc->nsects = ByteSwap(sc->nsects);
+ sc->flags = ByteSwap(sc->flags);
+}
+
+void breakpad_swap_segment_command_64(struct segment_command_64 *sg) {
sg->cmd = ByteSwap(sg->cmd);
sg->cmdsize = ByteSwap(sg->cmdsize);
@@ -58,9 +86,32 @@ void breakpad_swap_segment_command_64(struct segment_command_64 *sg,
sg->flags = ByteSwap(sg->flags);
}
-void breakpad_swap_mach_header_64(struct mach_header_64 *mh,
- enum NXByteOrder target_byte_order)
-{
+void breakpad_swap_fat_header(struct fat_header *fh) {
+ fh->magic = ByteSwap(fh->magic);
+ fh->nfat_arch = ByteSwap(fh->nfat_arch);
+}
+
+void breakpad_swap_fat_arch(struct fat_arch *fa, uint32_t narchs) {
+ for (uint32_t i = 0; i < narchs; ++i) {
+ fa[i].cputype = ByteSwap(fa[i].cputype);
+ fa[i].cpusubtype = ByteSwap(fa[i].cpusubtype);
+ fa[i].offset = ByteSwap(fa[i].offset);
+ fa[i].size = ByteSwap(fa[i].size);
+ fa[i].align = ByteSwap(fa[i].align);
+ }
+}
+
+void breakpad_swap_mach_header(struct mach_header *mh) {
+ mh->magic = ByteSwap(mh->magic);
+ mh->cputype = ByteSwap(mh->cputype);
+ mh->cpusubtype = ByteSwap(mh->cpusubtype);
+ mh->filetype = ByteSwap(mh->filetype);
+ mh->ncmds = ByteSwap(mh->ncmds);
+ mh->sizeofcmds = ByteSwap(mh->sizeofcmds);
+ mh->flags = ByteSwap(mh->flags);
+}
+
+void breakpad_swap_mach_header_64(struct mach_header_64 *mh) {
mh->magic = ByteSwap(mh->magic);
mh->cputype = ByteSwap(mh->cputype);
mh->cpusubtype = ByteSwap(mh->cpusubtype);
@@ -71,10 +122,24 @@ void breakpad_swap_mach_header_64(struct mach_header_64 *mh,
mh->reserved = ByteSwap(mh->reserved);
}
+void breakpad_swap_section(struct section *s,
+ uint32_t nsects) {
+ for (uint32_t i = 0; i < nsects; i++) {
+ s[i].addr = ByteSwap(s[i].addr);
+ s[i].size = ByteSwap(s[i].size);
+
+ s[i].offset = ByteSwap(s[i].offset);
+ s[i].align = ByteSwap(s[i].align);
+ s[i].reloff = ByteSwap(s[i].reloff);
+ s[i].nreloc = ByteSwap(s[i].nreloc);
+ s[i].flags = ByteSwap(s[i].flags);
+ s[i].reserved1 = ByteSwap(s[i].reserved1);
+ s[i].reserved2 = ByteSwap(s[i].reserved2);
+ }
+}
+
void breakpad_swap_section_64(struct section_64 *s,
- uint32_t nsects,
- enum NXByteOrder target_byte_order)
-{
+ uint32_t nsects) {
for (uint32_t i = 0; i < nsects; i++) {
s[i].addr = ByteSwap(s[i].addr);
s[i].size = ByteSwap(s[i].size);
diff --git a/3rdParty/Breakpad/src/common/mac/macho_utilities.h b/3rdParty/Breakpad/src/common/mac/macho_utilities.h
index a07945f..00563a7 100644
--- a/3rdParty/Breakpad/src/common/mac/macho_utilities.h
+++ b/3rdParty/Breakpad/src/common/mac/macho_utilities.h
@@ -54,14 +54,6 @@
# define LC_UUID 0x1b /* the uuid */
#endif
-#if TARGET_CPU_X86
-# define BREAKPAD_MACHINE_THREAD_STATE i386_THREAD_STATE
-#elif TARGET_CPU_X86_64
-# define BREAKPAD_MACHINE_THREAD_STATE x86_THREAD_STATE64
-#else
-# define BREAKPAD_MACHINE_THREAD_STATE MACHINE_THREAD_STATE
-#endif
-
// The uuid_command struct/swap routines were added during the 10.4 series.
// Their presence isn't guaranteed.
struct breakpad_uuid_command {
@@ -70,23 +62,34 @@ struct breakpad_uuid_command {
uint8_t uuid[16]; /* the 128-bit uuid */
};
-void breakpad_swap_uuid_command(struct breakpad_uuid_command *uc,
- enum NXByteOrder target_byte_order);
+void breakpad_swap_uuid_command(struct breakpad_uuid_command *uc);
+
+void breakpad_swap_load_command(struct load_command *lc);
+
+void breakpad_swap_dylib_command(struct dylib_command *dc);
// Older SDKs defines thread_state_data_t as an int[] instead
// of the natural_t[] it should be.
typedef natural_t breakpad_thread_state_data_t[THREAD_STATE_MAX];
+void breakpad_swap_segment_command(struct segment_command *sc);
+
// The 64-bit swap routines were added during the 10.4 series, their
// presence isn't guaranteed.
-void breakpad_swap_segment_command_64(struct segment_command_64 *sg,
- enum NXByteOrder target_byte_order);
+void breakpad_swap_segment_command_64(struct segment_command_64 *sg);
+
+void breakpad_swap_fat_header(struct fat_header *fh);
+
+void breakpad_swap_fat_arch(struct fat_arch *fa, uint32_t narchs);
+
+void breakpad_swap_mach_header(struct mach_header *mh);
+
+void breakpad_swap_mach_header_64(struct mach_header_64 *mh);
-void breakpad_swap_mach_header_64(struct mach_header_64 *mh,
- enum NXByteOrder target_byte_order);
+void breakpad_swap_section(struct section *s,
+ uint32_t nsects);
void breakpad_swap_section_64(struct section_64 *s,
- uint32_t nsects,
- enum NXByteOrder target_byte_order);
+ uint32_t nsects);
#endif
diff --git a/3rdParty/Breakpad/src/common/mac/macho_walker.cc b/3rdParty/Breakpad/src/common/mac/macho_walker.cc
index 92da7b1..1acd866 100644
--- a/3rdParty/Breakpad/src/common/mac/macho_walker.cc
+++ b/3rdParty/Breakpad/src/common/mac/macho_walker.cc
@@ -33,15 +33,13 @@
//
// Author: Dan Waylonis
-extern "C" { // necessary for Leopard
- #include <assert.h>
- #include <fcntl.h>
- #include <mach-o/arch.h>
- #include <mach-o/loader.h>
- #include <mach-o/swap.h>
- #include <string.h>
- #include <unistd.h>
-}
+#include <assert.h>
+#include <fcntl.h>
+#include <mach-o/arch.h>
+#include <mach-o/fat.h>
+#include <mach-o/loader.h>
+#include <string.h>
+#include <unistd.h>
#include "common/mac/byteswap.h"
#include "common/mac/macho_walker.h"
@@ -51,7 +49,7 @@ namespace MacFileUtilities {
MachoWalker::MachoWalker(const char *path, LoadCommandCallback callback,
void *context)
- : file_(0),
+ : file_(-1),
memory_(NULL),
memory_size_(0),
callback_(callback),
@@ -64,7 +62,7 @@ MachoWalker::MachoWalker(const char *path, LoadCommandCallback callback,
MachoWalker::MachoWalker(void *memory, size_t size,
LoadCommandCallback callback, void *context)
- : file_(0),
+ : file_(-1),
memory_(memory),
memory_size_(size),
callback_(callback),
@@ -79,21 +77,18 @@ MachoWalker::~MachoWalker() {
close(file_);
}
-int MachoWalker::ValidateCPUType(int cpu_type) {
- // If the user didn't specify, use the local architecture.
+bool MachoWalker::WalkHeader(cpu_type_t cpu_type, cpu_subtype_t cpu_subtype) {
+ cpu_type_t valid_cpu_type = cpu_type;
+ cpu_subtype_t valid_cpu_subtype = cpu_subtype;
+ // if |cpu_type| is 0, use the native cpu type.
if (cpu_type == 0) {
const NXArchInfo *arch = NXGetLocalArchInfo();
assert(arch);
- cpu_type = arch->cputype;
+ valid_cpu_type = arch->cputype;
+ valid_cpu_subtype = CPU_SUBTYPE_MULTIPLE;
}
-
- return cpu_type;
-}
-
-bool MachoWalker::WalkHeader(int cpu_type) {
- int valid_cpu_type = ValidateCPUType(cpu_type);
off_t offset;
- if (FindHeader(valid_cpu_type, offset)) {
+ if (FindHeader(valid_cpu_type, valid_cpu_subtype, offset)) {
if (cpu_type & CPU_ARCH_ABI64)
return WalkHeader64AtOffset(offset);
@@ -111,7 +106,7 @@ bool MachoWalker::ReadBytes(void *buffer, size_t size, off_t offset) {
if (offset + size > memory_size_) {
if (static_cast<size_t>(offset) >= memory_size_)
return false;
- size = memory_size_ - offset;
+ size = memory_size_ - static_cast<size_t>(offset);
result = false;
}
memcpy(buffer, static_cast<char *>(memory_) + offset, size);
@@ -131,8 +126,9 @@ bool MachoWalker::CurrentHeader(struct mach_header_64 *header, off_t *offset) {
return false;
}
-bool MachoWalker::FindHeader(int cpu_type, off_t &offset) {
- int valid_cpu_type = ValidateCPUType(cpu_type);
+bool MachoWalker::FindHeader(cpu_type_t cpu_type,
+ cpu_subtype_t cpu_subtype,
+ off_t &offset) {
// Read the magic bytes that's common amongst all mach-o files
uint32_t magic;
if (!ReadBytes(&magic, sizeof(magic), 0))
@@ -153,15 +149,18 @@ bool MachoWalker::FindHeader(int cpu_type, off_t &offset) {
if (!is_fat) {
// If we don't have a fat header, check if the cpu type matches the single
// header
- cpu_type_t header_cpu_type;
- if (!ReadBytes(&header_cpu_type, sizeof(header_cpu_type), offset))
+ struct mach_header header;
+ if (!ReadBytes(&header, sizeof(header), 0))
return false;
if (magic == MH_CIGAM || magic == MH_CIGAM_64)
- header_cpu_type = ByteSwap(header_cpu_type);
+ breakpad_swap_mach_header(&header);
- if (valid_cpu_type != header_cpu_type)
+ if (cpu_type != header.cputype ||
+ (cpu_subtype != CPU_SUBTYPE_MULTIPLE &&
+ cpu_subtype != header.cpusubtype)) {
return false;
+ }
offset = 0;
return true;
@@ -173,7 +172,7 @@ bool MachoWalker::FindHeader(int cpu_type, off_t &offset) {
return false;
if (NXHostByteOrder() != NX_BigEndian)
- swap_fat_header(&fat, NXHostByteOrder());
+ breakpad_swap_fat_header(&fat);
offset += sizeof(fat);
@@ -184,9 +183,11 @@ bool MachoWalker::FindHeader(int cpu_type, off_t &offset) {
return false;
if (NXHostByteOrder() != NX_BigEndian)
- swap_fat_arch(&arch, 1, NXHostByteOrder());
+ breakpad_swap_fat_arch(&arch, 1);
- if (arch.cputype == valid_cpu_type) {
+ if (arch.cputype == cpu_type &&
+ (cpu_subtype == CPU_SUBTYPE_MULTIPLE ||
+ arch.cpusubtype == cpu_subtype)) {
offset = arch.offset;
return true;
}
@@ -205,7 +206,7 @@ bool MachoWalker::WalkHeaderAtOffset(off_t offset) {
bool swap = (header.magic == MH_CIGAM);
if (swap)
- swap_mach_header(&header, NXHostByteOrder());
+ breakpad_swap_mach_header(&header);
// Copy the data into the mach_header_64 structure. Since the 32-bit and
// 64-bit only differ in the last field (reserved), this is safe to do.
@@ -231,7 +232,7 @@ bool MachoWalker::WalkHeader64AtOffset(off_t offset) {
bool swap = (header.magic == MH_CIGAM_64);
if (swap)
- breakpad_swap_mach_header_64(&header, NXHostByteOrder());
+ breakpad_swap_mach_header_64(&header);
current_header_ = &header;
current_header_size_ = sizeof(header);
@@ -252,7 +253,7 @@ bool MachoWalker::WalkHeaderCore(off_t offset, uint32_t number_of_commands,
return false;
if (swap)
- swap_load_command(&cmd, NXHostByteOrder());
+ breakpad_swap_load_command(&cmd);
// Call the user callback
if (callback_ && !callback_(this, &cmd, offset, swap, callback_context_))
diff --git a/3rdParty/Breakpad/src/common/mac/macho_walker.h b/3rdParty/Breakpad/src/common/mac/macho_walker.h
index cee3eb8..dd53581 100644
--- a/3rdParty/Breakpad/src/common/mac/macho_walker.h
+++ b/3rdParty/Breakpad/src/common/mac/macho_walker.h
@@ -34,6 +34,7 @@
#ifndef COMMON_MAC_MACHO_WALKER_H__
#define COMMON_MAC_MACHO_WALKER_H__
+#include <mach/machine.h>
#include <mach-o/loader.h>
#include <sys/types.h>
@@ -56,16 +57,14 @@ class MachoWalker {
void *context);
~MachoWalker();
- // Begin walking the header for |cpu_type|. If |cpu_type| is 0, then the
- // native cpu type is used. Otherwise, accepted values are listed in
- // /usr/include/mach/machine.h (e.g., CPU_TYPE_X86 or CPU_TYPE_POWERPC).
- // Returns false if opening the file failed or if the |cpu_type| is not
- // present in the file.
- bool WalkHeader(int cpu_type);
-
- // Locate (if any) the header offset for |cpu_type| and return in |offset|.
- // Return true if found, false otherwise.
- bool FindHeader(int cpu_type, off_t &offset);
+ // Begin walking the header for |cpu_type| and |cpu_subtype|. If |cpu_type|
+ // is 0, then the native cpu type is used. Otherwise, accepted values are
+ // listed in /usr/include/mach/machine.h (e.g., CPU_TYPE_X86 or
+ // CPU_TYPE_POWERPC). If |cpu_subtype| is CPU_SUBTYPE_MULTIPLE, the match is
+ // only done on |cpu_type|.
+ // Returns false if opening the file failed or if the |cpu_type|/|cpu_subtype|
+ // is not present in the file.
+ bool WalkHeader(cpu_type_t cpu_type, cpu_subtype_t cpu_subtype);
// Read |size| bytes from the opened file at |offset| into |buffer|
bool ReadBytes(void *buffer, size_t size, off_t offset);
@@ -74,8 +73,11 @@ class MachoWalker {
bool CurrentHeader(struct mach_header_64 *header, off_t *offset);
private:
- // Validate the |cpu_type|
- int ValidateCPUType(int cpu_type);
+ // Locate (if any) the header offset for |cpu_type| and return in |offset|.
+ // Return true if found, false otherwise.
+ bool FindHeader(cpu_type_t cpu_type,
+ cpu_subtype_t cpu_subtype,
+ off_t &offset);
// Process an individual header starting at |offset| from the start of the
// file. Return true if successful, false otherwise.
diff --git a/3rdParty/Breakpad/src/common/mac/string_utilities.cc b/3rdParty/Breakpad/src/common/mac/string_utilities.cc
index e1f63a9..07c0f42 100644
--- a/3rdParty/Breakpad/src/common/mac/string_utilities.cc
+++ b/3rdParty/Breakpad/src/common/mac/string_utilities.cc
@@ -27,7 +27,7 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#include "processor/scoped_ptr.h"
+#include "common/scoped_ptr.h"
#include "common/mac/string_utilities.h"
namespace MacStringUtils {
diff --git a/3rdParty/Breakpad/src/common/mac/super_fat_arch.h b/3rdParty/Breakpad/src/common/mac/super_fat_arch.h
new file mode 100644
index 0000000..501c865
--- /dev/null
+++ b/3rdParty/Breakpad/src/common/mac/super_fat_arch.h
@@ -0,0 +1,88 @@
+// Copyright (c) 2015, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// Original author: Erik Chen <erikchen@chromium.org>
+
+// super_fat_arch.h: A class to handle 64-bit object files. Has conversions to
+// and from struct fat_arch.
+
+#ifndef BREAKPAD_COMMON_MAC_SUPER_FAT_ARCH_H_
+#define BREAKPAD_COMMON_MAC_SUPER_FAT_ARCH_H_
+
+#include <limits>
+#include <mach-o/fat.h>
+#include <stdint.h>
+
+// Similar to struct fat_arch, except size-related parameters support
+// 64-bits.
+class SuperFatArch {
+ public:
+ uint32_t cputype;
+ uint32_t cpusubtype;
+ uint64_t offset;
+ uint64_t size;
+ uint64_t align;
+
+ SuperFatArch() :
+ cputype(0),
+ cpusubtype(0),
+ offset(0),
+ size(0),
+ align(0) {
+ }
+
+ explicit SuperFatArch(const struct fat_arch &arch) :
+ cputype(arch.cputype),
+ cpusubtype(arch.cpusubtype),
+ offset(arch.offset),
+ size(arch.size),
+ align(arch.align) {
+ }
+
+ // Returns false if the conversion cannot be made.
+ // If the conversion succeeds, the result is placed in |output_arch|.
+ bool ConvertToFatArch(struct fat_arch* output_arch) const {
+ if (offset > std::numeric_limits<uint32_t>::max())
+ return false;
+ if (size > std::numeric_limits<uint32_t>::max())
+ return false;
+ if (align > std::numeric_limits<uint32_t>::max())
+ return false;
+ struct fat_arch arch;
+ arch.cputype = cputype;
+ arch.cpusubtype = cpusubtype;
+ arch.offset = offset;
+ arch.size = size;
+ arch.align = align;
+ *output_arch = arch;
+ return true;
+ }
+};
+
+#endif // BREAKPAD_COMMON_MAC_SUPER_FAT_ARCH_H_
diff --git a/3rdParty/Breakpad/src/common/md5.cc b/3rdParty/Breakpad/src/common/md5.cc
index bccf61c..4f1ac8c 100644
--- a/3rdParty/Breakpad/src/common/md5.cc
+++ b/3rdParty/Breakpad/src/common/md5.cc
@@ -58,7 +58,7 @@ void MD5Init(struct MD5Context *ctx)
* Update context to reflect the concatenation of another buffer full
* of bytes.
*/
-void MD5Update(struct MD5Context *ctx, unsigned char const *buf, unsigned len)
+void MD5Update(struct MD5Context *ctx, unsigned char const *buf, size_t len)
{
u32 t;
@@ -138,8 +138,8 @@ void MD5Final(unsigned char digest[16], struct MD5Context *ctx)
byteReverse(ctx->in, 14);
/* Append length in bits and transform */
- ((u32 *) ctx->in)[14] = ctx->bits[0];
- ((u32 *) ctx->in)[15] = ctx->bits[1];
+ memcpy(&ctx->in[14], &ctx->bits[0], sizeof(u32));
+ memcpy(&ctx->in[15], &ctx->bits[1], sizeof(u32));
MD5Transform(ctx->buf, (u32 *) ctx->in);
byteReverse((unsigned char *) ctx->buf, 4);
@@ -166,7 +166,7 @@ void MD5Final(unsigned char digest[16], struct MD5Context *ctx)
*/
static void MD5Transform(u32 buf[4], u32 const in[16])
{
- register u32 a, b, c, d;
+ u32 a, b, c, d;
a = buf[0];
b = buf[1];
diff --git a/3rdParty/Breakpad/src/common/md5.h b/3rdParty/Breakpad/src/common/md5.h
index e96521e..2ab0ab9 100644
--- a/3rdParty/Breakpad/src/common/md5.h
+++ b/3rdParty/Breakpad/src/common/md5.h
@@ -18,7 +18,7 @@ struct MD5Context {
void MD5Init(struct MD5Context *ctx);
-void MD5Update(struct MD5Context *ctx, unsigned char const *buf, unsigned len);
+void MD5Update(struct MD5Context *ctx, unsigned char const *buf, size_t len);
void MD5Final(unsigned char digest[16], struct MD5Context *ctx);
diff --git a/3rdParty/Breakpad/src/common/memory.h b/3rdParty/Breakpad/src/common/memory.h
index e90bd52..9158b50 100644
--- a/3rdParty/Breakpad/src/common/memory.h
+++ b/3rdParty/Breakpad/src/common/memory.h
@@ -35,9 +35,15 @@
#include <unistd.h>
#include <sys/mman.h>
+#include <memory>
+#include <vector>
+
+#if defined(MEMORY_SANITIZER)
+#include <sanitizer/msan_interface.h>
+#endif
+
#ifdef __APPLE__
#define sys_mmap mmap
-#define sys_mmap2 mmap
#define sys_munmap munmap
#define MAP_ANONYMOUS MAP_ANON
#else
@@ -57,14 +63,15 @@ class PageAllocator {
: page_size_(getpagesize()),
last_(NULL),
current_page_(NULL),
- page_offset_(0) {
+ page_offset_(0),
+ pages_allocated_(0) {
}
~PageAllocator() {
FreeAll();
}
- void *Alloc(unsigned bytes) {
+ void *Alloc(size_t bytes) {
if (!bytes)
return NULL;
@@ -79,35 +86,54 @@ class PageAllocator {
return ret;
}
- const unsigned pages =
+ const size_t pages =
(bytes + sizeof(PageHeader) + page_size_ - 1) / page_size_;
uint8_t *const ret = GetNPages(pages);
if (!ret)
return NULL;
- page_offset_ = (page_size_ - (page_size_ * pages - (bytes + sizeof(PageHeader)))) % page_size_;
+ page_offset_ =
+ (page_size_ - (page_size_ * pages - (bytes + sizeof(PageHeader)))) %
+ page_size_;
current_page_ = page_offset_ ? ret + page_size_ * (pages - 1) : NULL;
return ret + sizeof(PageHeader);
}
+ // Checks whether the page allocator owns the passed-in pointer.
+ // This method exists for testing pursposes only.
+ bool OwnsPointer(const void* p) {
+ for (PageHeader* header = last_; header; header = header->next) {
+ const char* current = reinterpret_cast<char*>(header);
+ if ((p >= current) && (p < current + header->num_pages * page_size_))
+ return true;
+ }
+
+ return false;
+ }
+
+ unsigned long pages_allocated() { return pages_allocated_; }
+
private:
- uint8_t *GetNPages(unsigned num_pages) {
-#ifdef __x86_64
+ uint8_t *GetNPages(size_t num_pages) {
void *a = sys_mmap(NULL, page_size_ * num_pages, PROT_READ | PROT_WRITE,
MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
-#else
- void *a = sys_mmap2(NULL, page_size_ * num_pages, PROT_READ | PROT_WRITE,
- MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
-#endif
if (a == MAP_FAILED)
return NULL;
+#if defined(MEMORY_SANITIZER)
+ // We need to indicate to MSan that memory allocated through sys_mmap is
+ // initialized, since linux_syscall_support.h doesn't have MSan hooks.
+ __msan_unpoison(a, page_size_ * num_pages);
+#endif
+
struct PageHeader *header = reinterpret_cast<PageHeader*>(a);
header->next = last_;
header->num_pages = num_pages;
last_ = header;
+ pages_allocated_ += num_pages;
+
return reinterpret_cast<uint8_t*>(a);
}
@@ -122,97 +148,102 @@ class PageAllocator {
struct PageHeader {
PageHeader *next; // pointer to the start of the next set of pages.
- unsigned num_pages; // the number of pages in this set.
+ size_t num_pages; // the number of pages in this set.
};
- const unsigned page_size_;
+ const size_t page_size_;
PageHeader *last_;
uint8_t *current_page_;
- unsigned page_offset_;
+ size_t page_offset_;
+ unsigned long pages_allocated_;
};
-// A wasteful vector is like a normal std::vector, except that it's very much
-// simplier and it allocates memory from a PageAllocator. It's wasteful
-// because, when resizing, it always allocates a whole new array since the
-// PageAllocator doesn't support realloc.
-template<class T>
-class wasteful_vector {
- public:
- wasteful_vector(PageAllocator *allocator, unsigned size_hint = 16)
- : allocator_(allocator),
- a_((T*) allocator->Alloc(sizeof(T) * size_hint)),
- allocated_(size_hint),
- used_(0) {
- }
-
- T& back() {
- return a_[used_ - 1];
- }
-
- const T& back() const {
- return a_[used_ - 1];
- }
-
- bool empty() const {
- return used_ == 0;
- }
-
- void push_back(const T& new_element) {
- if (used_ == allocated_)
- Realloc(allocated_ * 2);
- a_[used_++] = new_element;
- }
-
- size_t size() const {
- return used_;
- }
-
- void resize(unsigned sz, T c = T()) {
- // No need to test "sz >= 0", as "sz" is unsigned.
- if (sz <= used_) {
- used_ = sz;
- } else {
- unsigned a = allocated_;
- if (sz > a) {
- while (sz > a) {
- a *= 2;
- }
- Realloc(a);
- }
- while (sz > used_) {
- a_[used_++] = c;
- }
+// Wrapper to use with STL containers
+template <typename T>
+struct PageStdAllocator : public std::allocator<T> {
+ typedef typename std::allocator<T>::pointer pointer;
+ typedef typename std::allocator<T>::size_type size_type;
+
+ explicit PageStdAllocator(PageAllocator& allocator) : allocator_(allocator),
+ stackdata_(NULL),
+ stackdata_size_(0)
+ {}
+
+ template <class Other> PageStdAllocator(const PageStdAllocator<Other>& other)
+ : allocator_(other.allocator_),
+ stackdata_(nullptr),
+ stackdata_size_(0)
+ {}
+
+ explicit PageStdAllocator(PageAllocator& allocator,
+ pointer stackdata,
+ size_type stackdata_size) : allocator_(allocator),
+ stackdata_(stackdata),
+ stackdata_size_(stackdata_size)
+ {}
+
+ inline pointer allocate(size_type n, const void* = 0) {
+ const size_type size = sizeof(T) * n;
+ if (size <= stackdata_size_) {
+ return stackdata_;
}
+ return static_cast<pointer>(allocator_.Alloc(size));
}
- T& operator[](size_t index) {
- return a_[index];
+ inline void deallocate(pointer, size_type) {
+ // The PageAllocator doesn't free.
}
- const T& operator[](size_t index) const {
- return a_[index];
- }
+ template <typename U> struct rebind {
+ typedef PageStdAllocator<U> other;
+ };
private:
- void Realloc(unsigned new_size) {
- T *new_array =
- reinterpret_cast<T*>(allocator_->Alloc(sizeof(T) * new_size));
- memcpy(new_array, a_, used_ * sizeof(T));
- a_ = new_array;
- allocated_ = new_size;
+ // Silly workaround for the gcc from Android's ndk (gcc 4.6), which will
+ // otherwise complain that `other.allocator_` is private in the constructor
+ // code.
+ template<typename Other> friend struct PageStdAllocator;
+
+ PageAllocator& allocator_;
+ pointer stackdata_;
+ size_type stackdata_size_;
+};
+
+// A wasteful vector is a std::vector, except that it allocates memory from a
+// PageAllocator. It's wasteful because, when resizing, it always allocates a
+// whole new array since the PageAllocator doesn't support realloc.
+template<class T>
+class wasteful_vector : public std::vector<T, PageStdAllocator<T> > {
+ public:
+ wasteful_vector(PageAllocator* allocator, unsigned size_hint = 16)
+ : std::vector<T, PageStdAllocator<T> >(PageStdAllocator<T>(*allocator)) {
+ std::vector<T, PageStdAllocator<T> >::reserve(size_hint);
}
+ protected:
+ wasteful_vector(PageStdAllocator<T> allocator)
+ : std::vector<T, PageStdAllocator<T> >(allocator) {}
+};
- PageAllocator *const allocator_;
- T *a_; // pointer to an array of |allocated_| elements.
- unsigned allocated_; // size of |a_|, in elements.
- unsigned used_; // number of used slots in |a_|.
+// auto_wasteful_vector allocates space on the stack for N entries to avoid
+// using the PageAllocator for small data, while still allowing for larger data.
+template<class T, unsigned int N>
+class auto_wasteful_vector : public wasteful_vector<T> {
+ T stackdata_[N];
+ public:
+ auto_wasteful_vector(PageAllocator* allocator)
+ : wasteful_vector<T>(
+ PageStdAllocator<T>(*allocator,
+ &stackdata_[0],
+ sizeof(stackdata_))) {
+ std::vector<T, PageStdAllocator<T> >::reserve(N);
+ }
};
} // namespace google_breakpad
inline void* operator new(size_t nbytes,
google_breakpad::PageAllocator& allocator) {
- return allocator.Alloc(nbytes);
+ return allocator.Alloc(nbytes);
}
#endif // GOOGLE_BREAKPAD_COMMON_MEMORY_H_
diff --git a/3rdParty/Breakpad/src/common/memory_range.h b/3rdParty/Breakpad/src/common/memory_range.h
new file mode 100644
index 0000000..41dd2da
--- /dev/null
+++ b/3rdParty/Breakpad/src/common/memory_range.h
@@ -0,0 +1,145 @@
+// Copyright (c) 2011, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// memory_range.h: Define the google_breakpad::MemoryRange class, which
+// is a lightweight wrapper with a pointer and a length to encapsulate
+// a contiguous range of memory.
+
+#ifndef COMMON_MEMORY_RANGE_H_
+#define COMMON_MEMORY_RANGE_H_
+
+#include <stddef.h>
+
+#include "google_breakpad/common/breakpad_types.h"
+
+namespace google_breakpad {
+
+// A lightweight wrapper with a pointer and a length to encapsulate a
+// contiguous range of memory. It provides helper methods for checked
+// access of a subrange of the memory. Its implemementation does not
+// allocate memory or call into libc functions, and is thus safer to use
+// in a crashed environment.
+class MemoryRange {
+ public:
+ MemoryRange() : data_(NULL), length_(0) {}
+
+ MemoryRange(const void* data, size_t length) {
+ Set(data, length);
+ }
+
+ // Returns true if this memory range contains no data.
+ bool IsEmpty() const {
+ // Set() guarantees that |length_| is zero if |data_| is NULL.
+ return length_ == 0;
+ }
+
+ // Resets to an empty range.
+ void Reset() {
+ data_ = NULL;
+ length_ = 0;
+ }
+
+ // Sets this memory range to point to |data| and its length to |length|.
+ void Set(const void* data, size_t length) {
+ data_ = reinterpret_cast<const uint8_t*>(data);
+ // Always set |length_| to zero if |data_| is NULL.
+ length_ = data ? length : 0;
+ }
+
+ // Returns true if this range covers a subrange of |sub_length| bytes
+ // at |sub_offset| bytes of this memory range, or false otherwise.
+ bool Covers(size_t sub_offset, size_t sub_length) const {
+ // The following checks verify that:
+ // 1. sub_offset is within [ 0 .. length_ - 1 ]
+ // 2. sub_offset + sub_length is within
+ // [ sub_offset .. length_ ]
+ return sub_offset < length_ &&
+ sub_offset + sub_length >= sub_offset &&
+ sub_offset + sub_length <= length_;
+ }
+
+ // Returns a raw data pointer to a subrange of |sub_length| bytes at
+ // |sub_offset| bytes of this memory range, or NULL if the subrange
+ // is out of bounds.
+ const void* GetData(size_t sub_offset, size_t sub_length) const {
+ return Covers(sub_offset, sub_length) ? (data_ + sub_offset) : NULL;
+ }
+
+ // Same as the two-argument version of GetData() but uses sizeof(DataType)
+ // as the subrange length and returns an |DataType| pointer for convenience.
+ template <typename DataType>
+ const DataType* GetData(size_t sub_offset) const {
+ return reinterpret_cast<const DataType*>(
+ GetData(sub_offset, sizeof(DataType)));
+ }
+
+ // Returns a raw pointer to the |element_index|-th element of an array
+ // of elements of length |element_size| starting at |sub_offset| bytes
+ // of this memory range, or NULL if the element is out of bounds.
+ const void* GetArrayElement(size_t element_offset,
+ size_t element_size,
+ unsigned element_index) const {
+ size_t sub_offset = element_offset + element_index * element_size;
+ return GetData(sub_offset, element_size);
+ }
+
+ // Same as the three-argument version of GetArrayElement() but deduces
+ // the element size using sizeof(ElementType) and returns an |ElementType|
+ // pointer for convenience.
+ template <typename ElementType>
+ const ElementType* GetArrayElement(size_t element_offset,
+ unsigned element_index) const {
+ return reinterpret_cast<const ElementType*>(
+ GetArrayElement(element_offset, sizeof(ElementType), element_index));
+ }
+
+ // Returns a subrange of |sub_length| bytes at |sub_offset| bytes of
+ // this memory range, or an empty range if the subrange is out of bounds.
+ MemoryRange Subrange(size_t sub_offset, size_t sub_length) const {
+ return Covers(sub_offset, sub_length) ?
+ MemoryRange(data_ + sub_offset, sub_length) : MemoryRange();
+ }
+
+ // Returns a pointer to the beginning of this memory range.
+ const uint8_t* data() const { return data_; }
+
+ // Returns the length, in bytes, of this memory range.
+ size_t length() const { return length_; }
+
+ private:
+ // Pointer to the beginning of this memory range.
+ const uint8_t* data_;
+
+ // Length, in bytes, of this memory range.
+ size_t length_;
+};
+
+} // namespace google_breakpad
+
+#endif // COMMON_MEMORY_RANGE_H_
diff --git a/3rdParty/Breakpad/src/common/memory_range_unittest.cc b/3rdParty/Breakpad/src/common/memory_range_unittest.cc
new file mode 100644
index 0000000..f6cf8c8
--- /dev/null
+++ b/3rdParty/Breakpad/src/common/memory_range_unittest.cc
@@ -0,0 +1,193 @@
+// Copyright (c) 2011, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// memory_range_unittest.cc: Unit tests for google_breakpad::MemoryRange.
+
+#include "breakpad_googletest_includes.h"
+#include "common/memory_range.h"
+
+using google_breakpad::MemoryRange;
+using testing::Message;
+
+namespace {
+
+const uint32_t kBuffer[10] = { 0 };
+const size_t kBufferSize = sizeof(kBuffer);
+const uint8_t* kBufferPointer = reinterpret_cast<const uint8_t*>(kBuffer);
+
+// Test vectors for verifying Covers, GetData, and Subrange.
+const struct {
+ bool valid;
+ size_t offset;
+ size_t length;
+} kSubranges[] = {
+ { true, 0, 0 },
+ { true, 0, 2 },
+ { true, 0, kBufferSize },
+ { true, 2, 0 },
+ { true, 2, 4 },
+ { true, 2, kBufferSize - 2 },
+ { true, kBufferSize - 1, 1 },
+ { false, kBufferSize, 0 },
+ { false, kBufferSize, static_cast<size_t>(-1) },
+ { false, kBufferSize + 1, 0 },
+ { false, static_cast<size_t>(-1), 2 },
+ { false, 1, kBufferSize },
+ { false, kBufferSize - 1, 2 },
+ { false, 0, static_cast<size_t>(-1) },
+ { false, 1, static_cast<size_t>(-1) },
+};
+const size_t kNumSubranges = sizeof(kSubranges) / sizeof(kSubranges[0]);
+
+// Test vectors for verifying GetArrayElement.
+const struct {
+ size_t offset;
+ size_t size;
+ size_t index;
+ const void* const pointer;
+} kElements[] = {
+ // Valid array elemenets
+ { 0, 1, 0, kBufferPointer },
+ { 0, 1, 1, kBufferPointer + 1 },
+ { 0, 1, kBufferSize - 1, kBufferPointer + kBufferSize - 1 },
+ { 0, 2, 1, kBufferPointer + 2 },
+ { 0, 4, 2, kBufferPointer + 8 },
+ { 0, 4, 9, kBufferPointer + 36 },
+ { kBufferSize - 1, 1, 0, kBufferPointer + kBufferSize - 1 },
+ // Invalid array elemenets
+ { 0, 1, kBufferSize, NULL },
+ { 0, 4, 10, NULL },
+ { kBufferSize - 1, 1, 1, NULL },
+ { kBufferSize - 1, 2, 0, NULL },
+ { kBufferSize, 1, 0, NULL },
+};
+const size_t kNumElements = sizeof(kElements) / sizeof(kElements[0]);
+
+} // namespace
+
+TEST(MemoryRangeTest, DefaultConstructor) {
+ MemoryRange range;
+ EXPECT_EQ(NULL, range.data());
+ EXPECT_EQ(0U, range.length());
+}
+
+TEST(MemoryRangeTest, ConstructorWithDataAndLength) {
+ MemoryRange range(kBuffer, kBufferSize);
+ EXPECT_EQ(kBufferPointer, range.data());
+ EXPECT_EQ(kBufferSize, range.length());
+}
+
+TEST(MemoryRangeTest, Reset) {
+ MemoryRange range;
+ range.Reset();
+ EXPECT_EQ(NULL, range.data());
+ EXPECT_EQ(0U, range.length());
+
+ range.Set(kBuffer, kBufferSize);
+ EXPECT_EQ(kBufferPointer, range.data());
+ EXPECT_EQ(kBufferSize, range.length());
+
+ range.Reset();
+ EXPECT_EQ(NULL, range.data());
+ EXPECT_EQ(0U, range.length());
+}
+
+TEST(MemoryRangeTest, Set) {
+ MemoryRange range;
+ range.Set(kBuffer, kBufferSize);
+ EXPECT_EQ(kBufferPointer, range.data());
+ EXPECT_EQ(kBufferSize, range.length());
+
+ range.Set(NULL, 0);
+ EXPECT_EQ(NULL, range.data());
+ EXPECT_EQ(0U, range.length());
+}
+
+TEST(MemoryRangeTest, SubrangeOfEmptyMemoryRange) {
+ MemoryRange range;
+ MemoryRange subrange = range.Subrange(0, 10);
+ EXPECT_EQ(NULL, subrange.data());
+ EXPECT_EQ(0U, subrange.length());
+}
+
+TEST(MemoryRangeTest, SubrangeAndGetData) {
+ MemoryRange range(kBuffer, kBufferSize);
+ for (size_t i = 0; i < kNumSubranges; ++i) {
+ bool valid = kSubranges[i].valid;
+ size_t sub_offset = kSubranges[i].offset;
+ size_t sub_length = kSubranges[i].length;
+ SCOPED_TRACE(Message() << "offset=" << sub_offset
+ << ", length=" << sub_length);
+
+ MemoryRange subrange = range.Subrange(sub_offset, sub_length);
+ if (valid) {
+ EXPECT_TRUE(range.Covers(sub_offset, sub_length));
+ EXPECT_EQ(kBufferPointer + sub_offset,
+ range.GetData(sub_offset, sub_length));
+ EXPECT_EQ(kBufferPointer + sub_offset, subrange.data());
+ EXPECT_EQ(sub_length, subrange.length());
+ } else {
+ EXPECT_FALSE(range.Covers(sub_offset, sub_length));
+ EXPECT_EQ(NULL, range.GetData(sub_offset, sub_length));
+ EXPECT_EQ(NULL, subrange.data());
+ EXPECT_EQ(0U, subrange.length());
+ }
+ }
+}
+
+TEST(MemoryRangeTest, GetDataWithTemplateType) {
+ MemoryRange range(kBuffer, kBufferSize);
+ const char* char_pointer = range.GetData<char>(0);
+ EXPECT_EQ(reinterpret_cast<const char*>(kBufferPointer), char_pointer);
+ const int* int_pointer = range.GetData<int>(0);
+ EXPECT_EQ(reinterpret_cast<const int*>(kBufferPointer), int_pointer);
+}
+
+TEST(MemoryRangeTest, GetArrayElement) {
+ MemoryRange range(kBuffer, kBufferSize);
+ for (size_t i = 0; i < kNumElements; ++i) {
+ size_t element_offset = kElements[i].offset;
+ size_t element_size = kElements[i].size;
+ unsigned element_index = kElements[i].index;
+ const void* const element_pointer = kElements[i].pointer;
+ SCOPED_TRACE(Message() << "offset=" << element_offset
+ << ", size=" << element_size
+ << ", index=" << element_index);
+ EXPECT_EQ(element_pointer, range.GetArrayElement(
+ element_offset, element_size, element_index));
+ }
+}
+
+TEST(MemoryRangeTest, GetArrayElmentWithTemplateType) {
+ MemoryRange range(kBuffer, kBufferSize);
+ const char* char_pointer = range.GetArrayElement<char>(0, 0);
+ EXPECT_EQ(reinterpret_cast<const char*>(kBufferPointer), char_pointer);
+ const int* int_pointer = range.GetArrayElement<int>(0, 0);
+ EXPECT_EQ(reinterpret_cast<const int*>(kBufferPointer), int_pointer);
+}
diff --git a/3rdParty/Breakpad/src/common/memory_unittest.cc b/3rdParty/Breakpad/src/common/memory_unittest.cc
new file mode 100644
index 0000000..8d2494c
--- /dev/null
+++ b/3rdParty/Breakpad/src/common/memory_unittest.cc
@@ -0,0 +1,124 @@
+// Copyright (c) 2009, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#include "breakpad_googletest_includes.h"
+#include "common/memory.h"
+
+using namespace google_breakpad;
+
+namespace {
+typedef testing::Test PageAllocatorTest;
+}
+
+TEST(PageAllocatorTest, Setup) {
+ PageAllocator allocator;
+ EXPECT_EQ(0U, allocator.pages_allocated());
+}
+
+TEST(PageAllocatorTest, SmallObjects) {
+ PageAllocator allocator;
+
+ EXPECT_EQ(0U, allocator.pages_allocated());
+ for (unsigned i = 1; i < 1024; ++i) {
+ uint8_t *p = reinterpret_cast<uint8_t*>(allocator.Alloc(i));
+ ASSERT_FALSE(p == NULL);
+ memset(p, 0, i);
+ }
+}
+
+TEST(PageAllocatorTest, LargeObject) {
+ PageAllocator allocator;
+
+ EXPECT_EQ(0U, allocator.pages_allocated());
+ uint8_t *p = reinterpret_cast<uint8_t*>(allocator.Alloc(10000));
+ ASSERT_FALSE(p == NULL);
+ EXPECT_EQ(3U, allocator.pages_allocated());
+ for (unsigned i = 1; i < 10; ++i) {
+ uint8_t *p = reinterpret_cast<uint8_t*>(allocator.Alloc(i));
+ ASSERT_FALSE(p == NULL);
+ memset(p, 0, i);
+ }
+}
+
+namespace {
+typedef testing::Test WastefulVectorTest;
+}
+
+TEST(WastefulVectorTest, Setup) {
+ PageAllocator allocator_;
+ wasteful_vector<int> v(&allocator_);
+ ASSERT_TRUE(v.empty());
+ ASSERT_EQ(v.size(), 0u);
+}
+
+TEST(WastefulVectorTest, Simple) {
+ PageAllocator allocator_;
+ EXPECT_EQ(0U, allocator_.pages_allocated());
+ wasteful_vector<unsigned> v(&allocator_);
+
+ for (unsigned i = 0; i < 256; ++i) {
+ v.push_back(i);
+ ASSERT_EQ(i, v.back());
+ ASSERT_EQ(&v.back(), &v[i]);
+ }
+ ASSERT_FALSE(v.empty());
+ ASSERT_EQ(v.size(), 256u);
+ EXPECT_EQ(1U, allocator_.pages_allocated());
+ for (unsigned i = 0; i < 256; ++i)
+ ASSERT_EQ(v[i], i);
+}
+
+TEST(WastefulVectorTest, UsesPageAllocator) {
+ PageAllocator allocator_;
+ wasteful_vector<unsigned> v(&allocator_);
+ EXPECT_EQ(1U, allocator_.pages_allocated());
+
+ v.push_back(1);
+ ASSERT_TRUE(allocator_.OwnsPointer(&v[0]));
+}
+
+TEST(WastefulVectorTest, AutoWastefulVector) {
+ PageAllocator allocator_;
+ EXPECT_EQ(0U, allocator_.pages_allocated());
+
+ auto_wasteful_vector<unsigned, 4> v(&allocator_);
+ EXPECT_EQ(0U, allocator_.pages_allocated());
+
+ v.push_back(1);
+ EXPECT_EQ(0U, allocator_.pages_allocated());
+ EXPECT_FALSE(allocator_.OwnsPointer(&v[0]));
+
+ v.resize(4);
+ EXPECT_EQ(0U, allocator_.pages_allocated());
+ EXPECT_FALSE(allocator_.OwnsPointer(&v[0]));
+
+ v.resize(10);
+ EXPECT_EQ(1U, allocator_.pages_allocated());
+ EXPECT_TRUE(allocator_.OwnsPointer(&v[0]));
+}
diff --git a/3rdParty/Breakpad/src/common/minidump_type_helper.h b/3rdParty/Breakpad/src/common/minidump_type_helper.h
new file mode 100644
index 0000000..5a7d5a6
--- /dev/null
+++ b/3rdParty/Breakpad/src/common/minidump_type_helper.h
@@ -0,0 +1,56 @@
+// Copyright (c) 2014, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#ifndef GOOGLE_BREAKPAD_COMMON_MINIDUMP_TYPE_HELPER_H_
+#define GOOGLE_BREAKPAD_COMMON_MINIDUMP_TYPE_HELPER_H_
+
+#include <stdint.h>
+
+#include "google_breakpad/common/minidump_format.h"
+
+namespace google_breakpad {
+
+template <size_t>
+struct MDTypeHelper;
+
+template <>
+struct MDTypeHelper<sizeof(uint32_t)> {
+ typedef MDRawDebug32 MDRawDebug;
+ typedef MDRawLinkMap32 MDRawLinkMap;
+};
+
+template <>
+struct MDTypeHelper<sizeof(uint64_t)> {
+ typedef MDRawDebug64 MDRawDebug;
+ typedef MDRawLinkMap64 MDRawLinkMap;
+};
+
+} // namespace google_breakpad
+
+#endif // GOOGLE_BREAKPAD_COMMON_MINIDUMP_TYPE_HELPER_H_
diff --git a/3rdParty/Breakpad/src/common/module.cc b/3rdParty/Breakpad/src/common/module.cc
index 4e257d1..b5fcb62 100644
--- a/3rdParty/Breakpad/src/common/module.cc
+++ b/3rdParty/Breakpad/src/common/module.cc
@@ -49,11 +49,13 @@ using std::hex;
Module::Module(const string &name, const string &os,
- const string &architecture, const string &id) :
+ const string &architecture, const string &id,
+ const string &code_id /* = "" */) :
name_(name),
os_(os),
architecture_(architecture),
id_(id),
+ code_id_(code_id),
load_address_(0) { }
Module::~Module() {
@@ -79,8 +81,34 @@ void Module::AddFunction(Function *function) {
// FUNC lines must not hold an empty name, so catch the problem early if
// callers try to add one.
assert(!function->name.empty());
+
+ // FUNCs are better than PUBLICs as they come with sizes, so remove an extern
+ // with the same address if present.
+ Extern ext(function->address);
+ ExternSet::iterator it_ext = externs_.find(&ext);
+ if (it_ext == externs_.end() &&
+ architecture_ == "arm" &&
+ (function->address & 0x1) == 0) {
+ // ARM THUMB functions have bit 0 set. ARM64 does not have THUMB.
+ Extern arm_thumb_ext(function->address | 0x1);
+ it_ext = externs_.find(&arm_thumb_ext);
+ }
+ if (it_ext != externs_.end()) {
+ delete *it_ext;
+ externs_.erase(it_ext);
+ }
+#if _DEBUG
+ {
+ // There should be no other PUBLIC symbols that overlap with the function.
+ Extern debug_ext(function->address);
+ ExternSet::iterator it_debug = externs_.lower_bound(&ext);
+ assert(it_debug == externs_.end() ||
+ (*it_debug)->address >= function->address + function->size);
+ }
+#endif
+
std::pair<FunctionSet::iterator,bool> ret = functions_.insert(function);
- if (!ret.second) {
+ if (!ret.second && (*ret.first != function)) {
// Free the duplicate that was not inserted because this Module
// now owns it.
delete function;
@@ -130,8 +158,7 @@ Module::File *Module::FindFile(const string &name) {
FileByNameMap::iterator destiny = files_.lower_bound(&name);
if (destiny == files_.end()
|| *destiny->first != name) { // Repeated string comparison, boo hoo.
- File *file = new File;
- file->name = name;
+ File *file = new File(name);
file->source_id = -1;
destiny = files_.insert(destiny,
FileByNameMap::value_type(&file->name, file));
@@ -155,7 +182,7 @@ void Module::GetFiles(vector<File *> *vec) {
vec->push_back(it->second);
}
-void Module::GetStackFrameEntries(vector<StackFrameEntry *> *vec) {
+void Module::GetStackFrameEntries(vector<StackFrameEntry *> *vec) const {
*vec = stack_frame_entries_;
}
@@ -204,62 +231,66 @@ bool Module::WriteRuleMap(const RuleMap &rule_map, std::ostream &stream) {
return stream.good();
}
-bool Module::Write(std::ostream &stream, bool cfi) {
+bool Module::Write(std::ostream &stream, SymbolData symbol_data) {
stream << "MODULE " << os_ << " " << architecture_ << " "
<< id_ << " " << name_ << endl;
if (!stream.good())
return ReportError();
- AssignSourceIds();
+ if (!code_id_.empty()) {
+ stream << "INFO CODE_ID " << code_id_ << endl;
+ }
- // Write out files.
- for (FileByNameMap::iterator file_it = files_.begin();
- file_it != files_.end(); ++file_it) {
- File *file = file_it->second;
- if (file->source_id >= 0) {
- stream << "FILE " << file->source_id << " " << file->name << endl;
- if (!stream.good())
- return ReportError();
+ if (symbol_data != ONLY_CFI) {
+ AssignSourceIds();
+
+ // Write out files.
+ for (FileByNameMap::iterator file_it = files_.begin();
+ file_it != files_.end(); ++file_it) {
+ File *file = file_it->second;
+ if (file->source_id >= 0) {
+ stream << "FILE " << file->source_id << " " << file->name << endl;
+ if (!stream.good())
+ return ReportError();
+ }
}
- }
- // Write out functions and their lines.
- for (FunctionSet::const_iterator func_it = functions_.begin();
- func_it != functions_.end(); ++func_it) {
- Function *func = *func_it;
- stream << "FUNC " << hex
- << (func->address - load_address_) << " "
- << func->size << " "
- << func->parameter_size << " "
- << func->name << dec << endl;
-
- if (!stream.good())
- return ReportError();
- for (vector<Line>::iterator line_it = func->lines.begin();
- line_it != func->lines.end(); ++line_it) {
- stream << hex
- << (line_it->address - load_address_) << " "
- << line_it->size << " "
- << dec
- << line_it->number << " "
- << line_it->file->source_id << endl;
+ // Write out functions and their lines.
+ for (FunctionSet::const_iterator func_it = functions_.begin();
+ func_it != functions_.end(); ++func_it) {
+ Function *func = *func_it;
+ stream << "FUNC " << hex
+ << (func->address - load_address_) << " "
+ << func->size << " "
+ << func->parameter_size << " "
+ << func->name << dec << endl;
if (!stream.good())
return ReportError();
+
+ for (vector<Line>::iterator line_it = func->lines.begin();
+ line_it != func->lines.end(); ++line_it) {
+ stream << hex
+ << (line_it->address - load_address_) << " "
+ << line_it->size << " "
+ << dec
+ << line_it->number << " "
+ << line_it->file->source_id << endl;
+ if (!stream.good())
+ return ReportError();
+ }
}
- }
- // Write out 'PUBLIC' records.
- for (ExternSet::const_iterator extern_it = externs_.begin();
- extern_it != externs_.end(); ++extern_it) {
- Extern *ext = *extern_it;
- stream << "PUBLIC " << hex
- << (ext->address - load_address_) << " 0 "
- << ext->name << dec << endl;
- if (!stream.good())
- return ReportError();
+ // Write out 'PUBLIC' records.
+ for (ExternSet::const_iterator extern_it = externs_.begin();
+ extern_it != externs_.end(); ++extern_it) {
+ Extern *ext = *extern_it;
+ stream << "PUBLIC " << hex
+ << (ext->address - load_address_) << " 0 "
+ << ext->name << dec << endl;
+ }
}
- if (cfi) {
+ if (symbol_data != NO_CFI) {
// Write out 'STACK CFI INIT' and 'STACK CFI' records.
vector<StackFrameEntry *>::const_iterator frame_it;
for (frame_it = stack_frame_entries_.begin();
diff --git a/3rdParty/Breakpad/src/common/module.h b/3rdParty/Breakpad/src/common/module.h
index cc89bba..6c2bb27 100644
--- a/3rdParty/Breakpad/src/common/module.h
+++ b/3rdParty/Breakpad/src/common/module.h
@@ -44,6 +44,7 @@
#include <string>
#include <vector>
+#include "common/symbol_data.h"
#include "common/using_std_string.h"
#include "google_breakpad/common/breakpad_types.h"
@@ -60,7 +61,7 @@ using std::map;
class Module {
public:
// The type of addresses and sizes in a symbol table.
- typedef u_int64_t Address;
+ typedef uint64_t Address;
struct File;
struct Function;
struct Line;
@@ -73,8 +74,10 @@ class Module {
// A source file.
struct File {
+ explicit File(const string &name_input) : name(name_input), source_id(0) {}
+
// The name of the source file.
- string name;
+ const string name;
// The file's source id. The Write member function clears this
// field and assigns source ids a fresh, so any value placed here
@@ -84,6 +87,9 @@ class Module {
// A function.
struct Function {
+ Function(const string &name_input, const Address &address_input) :
+ name(name_input), address(address_input), size(0), parameter_size(0) {}
+
// For sorting by address. (Not style-guide compliant, but it's
// stupid not to put this in the struct.)
static bool CompareByAddress(const Function *x, const Function *y) {
@@ -91,10 +97,11 @@ class Module {
}
// The function's name.
- string name;
+ const string name;
// The start address and length of the function's code.
- Address address, size;
+ const Address address;
+ Address size;
// The function's parameter size.
Address parameter_size;
@@ -119,7 +126,8 @@ class Module {
// An exported symbol.
struct Extern {
- Address address;
+ explicit Extern(const Address &address_input) : address(address_input) {}
+ const Address address;
string name;
};
@@ -171,7 +179,7 @@ class Module {
// Create a new module with the given name, operating system,
// architecture, and ID string.
Module(const string &name, const string &os, const string &architecture,
- const string &id);
+ const string &id, const string &code_id = "");
~Module();
// Set the module's load address to LOAD_ADDRESS; addresses given
@@ -246,7 +254,7 @@ class Module {
// effectively a copy of the stack frame entry list, this is mostly
// useful for testing; other uses should probably get
// a more appropriate interface.)
- void GetStackFrameEntries(vector<StackFrameEntry *> *vec);
+ void GetStackFrameEntries(vector<StackFrameEntry *> *vec) const;
// Find those files in this module that are actually referred to by
// functions' line number data, and assign them source id numbers.
@@ -259,13 +267,21 @@ class Module {
// breakpad symbol format. Return true if all goes well, or false if
// an error occurs. This method writes out:
// - a header based on the values given to the constructor,
+ // If symbol_data is not ONLY_CFI then:
// - the source files added via FindFile,
// - the functions added via AddFunctions, each with its lines,
// - all public records,
- // - and if CFI is true, all CFI records.
+ // If symbol_data is not NO_CFI then:
+ // - all CFI records.
// Addresses in the output are all relative to the load address
// established by SetLoadAddress.
- bool Write(std::ostream &stream, bool cfi);
+ bool Write(std::ostream &stream, SymbolData symbol_data);
+
+ string name() const { return name_; }
+ string os() const { return os_; }
+ string architecture() const { return architecture_; }
+ string identifier() const { return id_; }
+ string code_identifier() const { return code_id_; }
private:
// Report an error that has occurred writing the symbol file, using
@@ -278,7 +294,7 @@ class Module {
static bool WriteRuleMap(const RuleMap &rule_map, std::ostream &stream);
// Module header entries.
- string name_, os_, architecture_, id_;
+ string name_, os_, architecture_, id_, code_id_;
// The module's nominal load address. Addresses for functions and
// lines are absolute, assuming the module is loaded at this
@@ -288,7 +304,7 @@ class Module {
// Relation for maps whose keys are strings shared with some other
// structure.
struct CompareStringPtrs {
- bool operator()(const string *x, const string *y) { return *x < *y; }
+ bool operator()(const string *x, const string *y) const { return *x < *y; }
};
// A map from filenames to File structures. The map's keys are
diff --git a/3rdParty/Breakpad/src/common/module_unittest.cc b/3rdParty/Breakpad/src/common/module_unittest.cc
new file mode 100644
index 0000000..78406e3
--- /dev/null
+++ b/3rdParty/Breakpad/src/common/module_unittest.cc
@@ -0,0 +1,557 @@
+// Copyright (c) 2010 Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// Original author: Jim Blandy <jimb@mozilla.com> <jimb@red-bean.com>
+
+// module_unittest.cc: Unit tests for google_breakpad::Module.
+
+#include <errno.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <algorithm>
+#include <sstream>
+#include <string>
+
+#include "breakpad_googletest_includes.h"
+#include "common/module.h"
+#include "common/using_std_string.h"
+
+using google_breakpad::Module;
+using std::stringstream;
+using std::vector;
+using testing::ContainerEq;
+
+static Module::Function *generate_duplicate_function(const string &name) {
+ const Module::Address DUP_ADDRESS = 0xd35402aac7a7ad5cLL;
+ const Module::Address DUP_SIZE = 0x200b26e605f99071LL;
+ const Module::Address DUP_PARAMETER_SIZE = 0xf14ac4fed48c4a99LL;
+
+ Module::Function *function = new Module::Function(name, DUP_ADDRESS);
+ function->size = DUP_SIZE;
+ function->parameter_size = DUP_PARAMETER_SIZE;
+ return function;
+}
+
+#define MODULE_NAME "name with spaces"
+#define MODULE_OS "os-name"
+#define MODULE_ARCH "architecture"
+#define MODULE_ID "id-string"
+#define MODULE_CODE_ID "code-id-string"
+
+TEST(Write, Header) {
+ stringstream s;
+ Module m(MODULE_NAME, MODULE_OS, MODULE_ARCH, MODULE_ID);
+ m.Write(s, ALL_SYMBOL_DATA);
+ string contents = s.str();
+ EXPECT_STREQ("MODULE os-name architecture id-string name with spaces\n",
+ contents.c_str());
+}
+
+TEST(Write, HeaderCodeId) {
+ stringstream s;
+ Module m(MODULE_NAME, MODULE_OS, MODULE_ARCH, MODULE_ID, MODULE_CODE_ID);
+ m.Write(s, ALL_SYMBOL_DATA);
+ string contents = s.str();
+ EXPECT_STREQ("MODULE os-name architecture id-string name with spaces\n"
+ "INFO CODE_ID code-id-string\n",
+ contents.c_str());
+}
+
+TEST(Write, OneLineFunc) {
+ stringstream s;
+ Module m(MODULE_NAME, MODULE_OS, MODULE_ARCH, MODULE_ID);
+
+ Module::File *file = m.FindFile("file_name.cc");
+ Module::Function *function = new Module::Function(
+ "function_name", 0xe165bf8023b9d9abLL);
+ function->size = 0x1e4bb0eb1cbf5b09LL;
+ function->parameter_size = 0x772beee89114358aLL;
+ Module::Line line = { 0xe165bf8023b9d9abLL, 0x1e4bb0eb1cbf5b09LL,
+ file, 67519080 };
+ function->lines.push_back(line);
+ m.AddFunction(function);
+
+ m.Write(s, ALL_SYMBOL_DATA);
+ string contents = s.str();
+ EXPECT_STREQ("MODULE os-name architecture id-string name with spaces\n"
+ "FILE 0 file_name.cc\n"
+ "FUNC e165bf8023b9d9ab 1e4bb0eb1cbf5b09 772beee89114358a"
+ " function_name\n"
+ "e165bf8023b9d9ab 1e4bb0eb1cbf5b09 67519080 0\n",
+ contents.c_str());
+}
+
+TEST(Write, RelativeLoadAddress) {
+ stringstream s;
+ Module m(MODULE_NAME, MODULE_OS, MODULE_ARCH, MODULE_ID);
+
+ // Some source files. We will expect to see them in lexicographic order.
+ Module::File *file1 = m.FindFile("filename-b.cc");
+ Module::File *file2 = m.FindFile("filename-a.cc");
+
+ // A function.
+ Module::Function *function = new Module::Function(
+ "A_FLIBBERTIJIBBET::a_will_o_the_wisp(a clown)", 0xbec774ea5dd935f3LL);
+ function->size = 0x2922088f98d3f6fcLL;
+ function->parameter_size = 0xe5e9aa008bd5f0d0LL;
+
+ // Some source lines. The module should not sort these.
+ Module::Line line1 = { 0xbec774ea5dd935f3LL, 0x1c2be6d6c5af2611LL,
+ file1, 41676901 };
+ Module::Line line2 = { 0xdaf35bc123885c04LL, 0xcf621b8d324d0ebLL,
+ file2, 67519080 };
+ function->lines.push_back(line2);
+ function->lines.push_back(line1);
+
+ m.AddFunction(function);
+
+ // Some stack information.
+ Module::StackFrameEntry *entry = new Module::StackFrameEntry();
+ entry->address = 0x30f9e5c83323973dULL;
+ entry->size = 0x49fc9ca7c7c13dc2ULL;
+ entry->initial_rules[".cfa"] = "he was a handsome man";
+ entry->initial_rules["and"] = "what i want to know is";
+ entry->rule_changes[0x30f9e5c83323973eULL]["how"] =
+ "do you like your blueeyed boy";
+ entry->rule_changes[0x30f9e5c83323973eULL]["Mister"] = "Death";
+ m.AddStackFrameEntry(entry);
+
+ // Set the load address. Doing this after adding all the data to
+ // the module must work fine.
+ m.SetLoadAddress(0x2ab698b0b6407073LL);
+
+ m.Write(s, ALL_SYMBOL_DATA);
+ string contents = s.str();
+ EXPECT_STREQ("MODULE os-name architecture id-string name with spaces\n"
+ "FILE 0 filename-a.cc\n"
+ "FILE 1 filename-b.cc\n"
+ "FUNC 9410dc39a798c580 2922088f98d3f6fc e5e9aa008bd5f0d0"
+ " A_FLIBBERTIJIBBET::a_will_o_the_wisp(a clown)\n"
+ "b03cc3106d47eb91 cf621b8d324d0eb 67519080 0\n"
+ "9410dc39a798c580 1c2be6d6c5af2611 41676901 1\n"
+ "STACK CFI INIT 6434d177ce326ca 49fc9ca7c7c13dc2"
+ " .cfa: he was a handsome man"
+ " and: what i want to know is\n"
+ "STACK CFI 6434d177ce326cb"
+ " Mister: Death"
+ " how: do you like your blueeyed boy\n",
+ contents.c_str());
+}
+
+TEST(Write, OmitUnusedFiles) {
+ Module m(MODULE_NAME, MODULE_OS, MODULE_ARCH, MODULE_ID);
+
+ // Create some source files.
+ Module::File *file1 = m.FindFile("filename1");
+ m.FindFile("filename2"); // not used by any line
+ Module::File *file3 = m.FindFile("filename3");
+
+ // Create a function.
+ Module::Function *function = new Module::Function(
+ "function_name", 0x9b926d464f0b9384LL);
+ function->size = 0x4f524a4ba795e6a6LL;
+ function->parameter_size = 0xbbe8133a6641c9b7LL;
+
+ // Source files that refer to some files, but not others.
+ Module::Line line1 = { 0x595fa44ebacc1086LL, 0x1e1e0191b066c5b3LL,
+ file1, 137850127 };
+ Module::Line line2 = { 0x401ce8c8a12d25e3LL, 0x895751c41b8d2ce2LL,
+ file3, 28113549 };
+ function->lines.push_back(line1);
+ function->lines.push_back(line2);
+ m.AddFunction(function);
+
+ m.AssignSourceIds();
+
+ vector<Module::File *> vec;
+ m.GetFiles(&vec);
+ EXPECT_EQ((size_t) 3, vec.size());
+ EXPECT_STREQ("filename1", vec[0]->name.c_str());
+ EXPECT_NE(-1, vec[0]->source_id);
+ // Expect filename2 not to be used.
+ EXPECT_STREQ("filename2", vec[1]->name.c_str());
+ EXPECT_EQ(-1, vec[1]->source_id);
+ EXPECT_STREQ("filename3", vec[2]->name.c_str());
+ EXPECT_NE(-1, vec[2]->source_id);
+
+ stringstream s;
+ m.Write(s, ALL_SYMBOL_DATA);
+ string contents = s.str();
+ EXPECT_STREQ("MODULE os-name architecture id-string name with spaces\n"
+ "FILE 0 filename1\n"
+ "FILE 1 filename3\n"
+ "FUNC 9b926d464f0b9384 4f524a4ba795e6a6 bbe8133a6641c9b7"
+ " function_name\n"
+ "595fa44ebacc1086 1e1e0191b066c5b3 137850127 0\n"
+ "401ce8c8a12d25e3 895751c41b8d2ce2 28113549 1\n",
+ contents.c_str());
+}
+
+TEST(Write, NoCFI) {
+ stringstream s;
+ Module m(MODULE_NAME, MODULE_OS, MODULE_ARCH, MODULE_ID);
+
+ // Some source files. We will expect to see them in lexicographic order.
+ Module::File *file1 = m.FindFile("filename.cc");
+
+ // A function.
+ Module::Function *function = new Module::Function(
+ "A_FLIBBERTIJIBBET::a_will_o_the_wisp(a clown)", 0xbec774ea5dd935f3LL);
+ function->size = 0x2922088f98d3f6fcLL;
+ function->parameter_size = 0xe5e9aa008bd5f0d0LL;
+
+ // Some source lines. The module should not sort these.
+ Module::Line line1 = { 0xbec774ea5dd935f3LL, 0x1c2be6d6c5af2611LL,
+ file1, 41676901 };
+ function->lines.push_back(line1);
+
+ m.AddFunction(function);
+
+ // Some stack information.
+ Module::StackFrameEntry *entry = new Module::StackFrameEntry();
+ entry->address = 0x30f9e5c83323973dULL;
+ entry->size = 0x49fc9ca7c7c13dc2ULL;
+ entry->initial_rules[".cfa"] = "he was a handsome man";
+ entry->initial_rules["and"] = "what i want to know is";
+ entry->rule_changes[0x30f9e5c83323973eULL]["how"] =
+ "do you like your blueeyed boy";
+ entry->rule_changes[0x30f9e5c83323973eULL]["Mister"] = "Death";
+ m.AddStackFrameEntry(entry);
+
+ // Set the load address. Doing this after adding all the data to
+ // the module must work fine.
+ m.SetLoadAddress(0x2ab698b0b6407073LL);
+
+ m.Write(s, NO_CFI);
+ string contents = s.str();
+ EXPECT_STREQ("MODULE os-name architecture id-string name with spaces\n"
+ "FILE 0 filename.cc\n"
+ "FUNC 9410dc39a798c580 2922088f98d3f6fc e5e9aa008bd5f0d0"
+ " A_FLIBBERTIJIBBET::a_will_o_the_wisp(a clown)\n"
+ "9410dc39a798c580 1c2be6d6c5af2611 41676901 0\n",
+ contents.c_str());
+}
+
+TEST(Construct, AddFunctions) {
+ stringstream s;
+ Module m(MODULE_NAME, MODULE_OS, MODULE_ARCH, MODULE_ID);
+
+ // Two functions.
+ Module::Function *function1 = new Module::Function(
+ "_without_form", 0xd35024aa7ca7da5cLL);
+ function1->size = 0x200b26e605f99071LL;
+ function1->parameter_size = 0xf14ac4fed48c4a99LL;
+
+ Module::Function *function2 = new Module::Function(
+ "_and_void", 0x2987743d0b35b13fLL);
+ function2->size = 0xb369db048deb3010LL;
+ function2->parameter_size = 0x938e556cb5a79988LL;
+
+ // Put them in a vector.
+ vector<Module::Function *> vec;
+ vec.push_back(function1);
+ vec.push_back(function2);
+
+ m.AddFunctions(vec.begin(), vec.end());
+
+ m.Write(s, ALL_SYMBOL_DATA);
+ string contents = s.str();
+ EXPECT_STREQ("MODULE os-name architecture id-string name with spaces\n"
+ "FUNC 2987743d0b35b13f b369db048deb3010 938e556cb5a79988"
+ " _and_void\n"
+ "FUNC d35024aa7ca7da5c 200b26e605f99071 f14ac4fed48c4a99"
+ " _without_form\n",
+ contents.c_str());
+
+ // Check that m.GetFunctions returns the functions we expect.
+ vec.clear();
+ m.GetFunctions(&vec, vec.end());
+ EXPECT_TRUE(vec.end() != find(vec.begin(), vec.end(), function1));
+ EXPECT_TRUE(vec.end() != find(vec.begin(), vec.end(), function2));
+ EXPECT_EQ((size_t) 2, vec.size());
+}
+
+TEST(Construct, AddFrames) {
+ stringstream s;
+ Module m(MODULE_NAME, MODULE_OS, MODULE_ARCH, MODULE_ID);
+
+ // First STACK CFI entry, with no initial rules or deltas.
+ Module::StackFrameEntry *entry1 = new Module::StackFrameEntry();
+ entry1->address = 0xddb5f41285aa7757ULL;
+ entry1->size = 0x1486493370dc5073ULL;
+ m.AddStackFrameEntry(entry1);
+
+ // Second STACK CFI entry, with initial rules but no deltas.
+ Module::StackFrameEntry *entry2 = new Module::StackFrameEntry();
+ entry2->address = 0x8064f3af5e067e38ULL;
+ entry2->size = 0x0de2a5ee55509407ULL;
+ entry2->initial_rules[".cfa"] = "I think that I shall never see";
+ entry2->initial_rules["stromboli"] = "a poem lovely as a tree";
+ entry2->initial_rules["cannoli"] = "a tree whose hungry mouth is prest";
+ m.AddStackFrameEntry(entry2);
+
+ // Third STACK CFI entry, with initial rules and deltas.
+ Module::StackFrameEntry *entry3 = new Module::StackFrameEntry();
+ entry3->address = 0x5e8d0db0a7075c6cULL;
+ entry3->size = 0x1c7edb12a7aea229ULL;
+ entry3->initial_rules[".cfa"] = "Whose woods are these";
+ entry3->rule_changes[0x47ceb0f63c269d7fULL]["calzone"] =
+ "the village though";
+ entry3->rule_changes[0x47ceb0f63c269d7fULL]["cannoli"] =
+ "he will not see me stopping here";
+ entry3->rule_changes[0x36682fad3763ffffULL]["stromboli"] =
+ "his house is in";
+ entry3->rule_changes[0x36682fad3763ffffULL][".cfa"] =
+ "I think I know";
+ m.AddStackFrameEntry(entry3);
+
+ // Check that Write writes STACK CFI records properly.
+ m.Write(s, ALL_SYMBOL_DATA);
+ string contents = s.str();
+ EXPECT_STREQ("MODULE os-name architecture id-string name with spaces\n"
+ "STACK CFI INIT ddb5f41285aa7757 1486493370dc5073 \n"
+ "STACK CFI INIT 8064f3af5e067e38 de2a5ee55509407"
+ " .cfa: I think that I shall never see"
+ " cannoli: a tree whose hungry mouth is prest"
+ " stromboli: a poem lovely as a tree\n"
+ "STACK CFI INIT 5e8d0db0a7075c6c 1c7edb12a7aea229"
+ " .cfa: Whose woods are these\n"
+ "STACK CFI 36682fad3763ffff"
+ " .cfa: I think I know"
+ " stromboli: his house is in\n"
+ "STACK CFI 47ceb0f63c269d7f"
+ " calzone: the village though"
+ " cannoli: he will not see me stopping here\n",
+ contents.c_str());
+
+ // Check that GetStackFrameEntries works.
+ vector<Module::StackFrameEntry *> entries;
+ m.GetStackFrameEntries(&entries);
+ ASSERT_EQ(3U, entries.size());
+ // Check first entry.
+ EXPECT_EQ(0xddb5f41285aa7757ULL, entries[0]->address);
+ EXPECT_EQ(0x1486493370dc5073ULL, entries[0]->size);
+ ASSERT_EQ(0U, entries[0]->initial_rules.size());
+ ASSERT_EQ(0U, entries[0]->rule_changes.size());
+ // Check second entry.
+ EXPECT_EQ(0x8064f3af5e067e38ULL, entries[1]->address);
+ EXPECT_EQ(0x0de2a5ee55509407ULL, entries[1]->size);
+ ASSERT_EQ(3U, entries[1]->initial_rules.size());
+ Module::RuleMap entry2_initial;
+ entry2_initial[".cfa"] = "I think that I shall never see";
+ entry2_initial["stromboli"] = "a poem lovely as a tree";
+ entry2_initial["cannoli"] = "a tree whose hungry mouth is prest";
+ EXPECT_THAT(entries[1]->initial_rules, ContainerEq(entry2_initial));
+ ASSERT_EQ(0U, entries[1]->rule_changes.size());
+ // Check third entry.
+ EXPECT_EQ(0x5e8d0db0a7075c6cULL, entries[2]->address);
+ EXPECT_EQ(0x1c7edb12a7aea229ULL, entries[2]->size);
+ Module::RuleMap entry3_initial;
+ entry3_initial[".cfa"] = "Whose woods are these";
+ EXPECT_THAT(entries[2]->initial_rules, ContainerEq(entry3_initial));
+ Module::RuleChangeMap entry3_changes;
+ entry3_changes[0x36682fad3763ffffULL][".cfa"] = "I think I know";
+ entry3_changes[0x36682fad3763ffffULL]["stromboli"] = "his house is in";
+ entry3_changes[0x47ceb0f63c269d7fULL]["calzone"] = "the village though";
+ entry3_changes[0x47ceb0f63c269d7fULL]["cannoli"] =
+ "he will not see me stopping here";
+ EXPECT_THAT(entries[2]->rule_changes, ContainerEq(entry3_changes));
+}
+
+TEST(Construct, UniqueFiles) {
+ Module m(MODULE_NAME, MODULE_OS, MODULE_ARCH, MODULE_ID);
+ Module::File *file1 = m.FindFile("foo");
+ Module::File *file2 = m.FindFile(string("bar"));
+ Module::File *file3 = m.FindFile(string("foo"));
+ Module::File *file4 = m.FindFile("bar");
+ EXPECT_NE(file1, file2);
+ EXPECT_EQ(file1, file3);
+ EXPECT_EQ(file2, file4);
+ EXPECT_EQ(file1, m.FindExistingFile("foo"));
+ EXPECT_TRUE(m.FindExistingFile("baz") == NULL);
+}
+
+TEST(Construct, DuplicateFunctions) {
+ stringstream s;
+ Module m(MODULE_NAME, MODULE_OS, MODULE_ARCH, MODULE_ID);
+
+ // Two functions.
+ Module::Function *function1 = generate_duplicate_function("_without_form");
+ Module::Function *function2 = generate_duplicate_function("_without_form");
+
+ m.AddFunction(function1);
+ m.AddFunction(function2);
+
+ m.Write(s, ALL_SYMBOL_DATA);
+ string contents = s.str();
+ EXPECT_STREQ("MODULE os-name architecture id-string name with spaces\n"
+ "FUNC d35402aac7a7ad5c 200b26e605f99071 f14ac4fed48c4a99"
+ " _without_form\n",
+ contents.c_str());
+}
+
+TEST(Construct, FunctionsWithSameAddress) {
+ stringstream s;
+ Module m(MODULE_NAME, MODULE_OS, MODULE_ARCH, MODULE_ID);
+
+ // Two functions.
+ Module::Function *function1 = generate_duplicate_function("_without_form");
+ Module::Function *function2 = generate_duplicate_function("_and_void");
+
+ m.AddFunction(function1);
+ m.AddFunction(function2);
+
+ m.Write(s, ALL_SYMBOL_DATA);
+ string contents = s.str();
+ EXPECT_STREQ("MODULE os-name architecture id-string name with spaces\n"
+ "FUNC d35402aac7a7ad5c 200b26e605f99071 f14ac4fed48c4a99"
+ " _and_void\n"
+ "FUNC d35402aac7a7ad5c 200b26e605f99071 f14ac4fed48c4a99"
+ " _without_form\n",
+ contents.c_str());
+}
+
+// Externs should be written out as PUBLIC records, sorted by
+// address.
+TEST(Construct, Externs) {
+ stringstream s;
+ Module m(MODULE_NAME, MODULE_OS, MODULE_ARCH, MODULE_ID);
+
+ // Two externs.
+ Module::Extern *extern1 = new Module::Extern(0xffff);
+ extern1->name = "_abc";
+ Module::Extern *extern2 = new Module::Extern(0xaaaa);
+ extern2->name = "_xyz";
+
+ m.AddExtern(extern1);
+ m.AddExtern(extern2);
+
+ m.Write(s, ALL_SYMBOL_DATA);
+ string contents = s.str();
+
+ EXPECT_STREQ("MODULE " MODULE_OS " " MODULE_ARCH " "
+ MODULE_ID " " MODULE_NAME "\n"
+ "PUBLIC aaaa 0 _xyz\n"
+ "PUBLIC ffff 0 _abc\n",
+ contents.c_str());
+}
+
+// Externs with the same address should only keep the first entry
+// added.
+TEST(Construct, DuplicateExterns) {
+ stringstream s;
+ Module m(MODULE_NAME, MODULE_OS, MODULE_ARCH, MODULE_ID);
+
+ // Two externs.
+ Module::Extern *extern1 = new Module::Extern(0xffff);
+ extern1->name = "_xyz";
+ Module::Extern *extern2 = new Module::Extern(0xffff);
+ extern2->name = "_abc";
+
+ m.AddExtern(extern1);
+ m.AddExtern(extern2);
+
+ m.Write(s, ALL_SYMBOL_DATA);
+ string contents = s.str();
+
+ EXPECT_STREQ("MODULE " MODULE_OS " " MODULE_ARCH " "
+ MODULE_ID " " MODULE_NAME "\n"
+ "PUBLIC ffff 0 _xyz\n",
+ contents.c_str());
+}
+
+// If there exists an extern and a function at the same address, only write
+// out the FUNC entry.
+TEST(Construct, FunctionsAndExternsWithSameAddress) {
+ stringstream s;
+ Module m(MODULE_NAME, MODULE_OS, MODULE_ARCH, MODULE_ID);
+
+ // Two externs.
+ Module::Extern* extern1 = new Module::Extern(0xabc0);
+ extern1->name = "abc";
+ Module::Extern* extern2 = new Module::Extern(0xfff0);
+ extern2->name = "xyz";
+
+ m.AddExtern(extern1);
+ m.AddExtern(extern2);
+
+ Module::Function* function = new Module::Function("_xyz", 0xfff0);
+ function->size = 0x10;
+ function->parameter_size = 0;
+ m.AddFunction(function);
+
+ m.Write(s, ALL_SYMBOL_DATA);
+ string contents = s.str();
+
+ EXPECT_STREQ("MODULE " MODULE_OS " " MODULE_ARCH " "
+ MODULE_ID " " MODULE_NAME "\n"
+ "FUNC fff0 10 0 _xyz\n"
+ "PUBLIC abc0 0 abc\n",
+ contents.c_str());
+}
+
+// If there exists an extern and a function at the same address, only write
+// out the FUNC entry. For ARM THUMB, the extern that comes from the ELF
+// symbol section has bit 0 set.
+TEST(Construct, FunctionsAndThumbExternsWithSameAddress) {
+ stringstream s;
+ Module m(MODULE_NAME, MODULE_OS, "arm", MODULE_ID);
+
+ // Two THUMB externs.
+ Module::Extern* thumb_extern1 = new Module::Extern(0xabc1);
+ thumb_extern1->name = "thumb_abc";
+ Module::Extern* thumb_extern2 = new Module::Extern(0xfff1);
+ thumb_extern2->name = "thumb_xyz";
+
+ Module::Extern* arm_extern1 = new Module::Extern(0xcc00);
+ arm_extern1->name = "arm_func";
+
+ m.AddExtern(thumb_extern1);
+ m.AddExtern(thumb_extern2);
+ m.AddExtern(arm_extern1);
+
+ // The corresponding function from the DWARF debug data have the actual
+ // address.
+ Module::Function* function = new Module::Function("_thumb_xyz", 0xfff0);
+ function->size = 0x10;
+ function->parameter_size = 0;
+ m.AddFunction(function);
+
+ m.Write(s, ALL_SYMBOL_DATA);
+ string contents = s.str();
+
+ EXPECT_STREQ("MODULE " MODULE_OS " arm "
+ MODULE_ID " " MODULE_NAME "\n"
+ "FUNC fff0 10 0 _thumb_xyz\n"
+ "PUBLIC abc1 0 thumb_abc\n"
+ "PUBLIC cc00 0 arm_func\n",
+ contents.c_str());
+}
diff --git a/3rdParty/Breakpad/src/common/scoped_ptr.h b/3rdParty/Breakpad/src/common/scoped_ptr.h
new file mode 100644
index 0000000..d137c18
--- /dev/null
+++ b/3rdParty/Breakpad/src/common/scoped_ptr.h
@@ -0,0 +1,404 @@
+// Copyright 2013 Google Inc. All Rights Reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// Scopers help you manage ownership of a pointer, helping you easily manage the
+// a pointer within a scope, and automatically destroying the pointer at the
+// end of a scope. There are two main classes you will use, which correspond
+// to the operators new/delete and new[]/delete[].
+//
+// Example usage (scoped_ptr):
+// {
+// scoped_ptr<Foo> foo(new Foo("wee"));
+// } // foo goes out of scope, releasing the pointer with it.
+//
+// {
+// scoped_ptr<Foo> foo; // No pointer managed.
+// foo.reset(new Foo("wee")); // Now a pointer is managed.
+// foo.reset(new Foo("wee2")); // Foo("wee") was destroyed.
+// foo.reset(new Foo("wee3")); // Foo("wee2") was destroyed.
+// foo->Method(); // Foo::Method() called.
+// foo.get()->Method(); // Foo::Method() called.
+// SomeFunc(foo.release()); // SomeFunc takes ownership, foo no longer
+// // manages a pointer.
+// foo.reset(new Foo("wee4")); // foo manages a pointer again.
+// foo.reset(); // Foo("wee4") destroyed, foo no longer
+// // manages a pointer.
+// } // foo wasn't managing a pointer, so nothing was destroyed.
+//
+// Example usage (scoped_array):
+// {
+// scoped_array<Foo> foo(new Foo[100]);
+// foo.get()->Method(); // Foo::Method on the 0th element.
+// foo[10].Method(); // Foo::Method on the 10th element.
+// }
+
+#ifndef COMMON_SCOPED_PTR_H_
+#define COMMON_SCOPED_PTR_H_
+
+// This is an implementation designed to match the anticipated future TR2
+// implementation of the scoped_ptr class, and its closely-related brethren,
+// scoped_array, scoped_ptr_malloc.
+
+#include <assert.h>
+#include <stddef.h>
+#include <stdlib.h>
+
+namespace google_breakpad {
+
+// A scoped_ptr<T> is like a T*, except that the destructor of scoped_ptr<T>
+// automatically deletes the pointer it holds (if any).
+// That is, scoped_ptr<T> owns the T object that it points to.
+// Like a T*, a scoped_ptr<T> may hold either NULL or a pointer to a T object.
+// Also like T*, scoped_ptr<T> is thread-compatible, and once you
+// dereference it, you get the threadsafety guarantees of T.
+//
+// The size of a scoped_ptr is small:
+// sizeof(scoped_ptr<C>) == sizeof(C*)
+template <class C>
+class scoped_ptr {
+ public:
+
+ // The element type
+ typedef C element_type;
+
+ // Constructor. Defaults to initializing with NULL.
+ // There is no way to create an uninitialized scoped_ptr.
+ // The input parameter must be allocated with new.
+ explicit scoped_ptr(C* p = NULL) : ptr_(p) { }
+
+ // Destructor. If there is a C object, delete it.
+ // We don't need to test ptr_ == NULL because C++ does that for us.
+ ~scoped_ptr() {
+ enum { type_must_be_complete = sizeof(C) };
+ delete ptr_;
+ }
+
+ // Reset. Deletes the current owned object, if any.
+ // Then takes ownership of a new object, if given.
+ // this->reset(this->get()) works.
+ void reset(C* p = NULL) {
+ if (p != ptr_) {
+ enum { type_must_be_complete = sizeof(C) };
+ delete ptr_;
+ ptr_ = p;
+ }
+ }
+
+ // Accessors to get the owned object.
+ // operator* and operator-> will assert() if there is no current object.
+ C& operator*() const {
+ assert(ptr_ != NULL);
+ return *ptr_;
+ }
+ C* operator->() const {
+ assert(ptr_ != NULL);
+ return ptr_;
+ }
+ C* get() const { return ptr_; }
+
+ // Comparison operators.
+ // These return whether two scoped_ptr refer to the same object, not just to
+ // two different but equal objects.
+ bool operator==(C* p) const { return ptr_ == p; }
+ bool operator!=(C* p) const { return ptr_ != p; }
+
+ // Swap two scoped pointers.
+ void swap(scoped_ptr& p2) {
+ C* tmp = ptr_;
+ ptr_ = p2.ptr_;
+ p2.ptr_ = tmp;
+ }
+
+ // Release a pointer.
+ // The return value is the current pointer held by this object.
+ // If this object holds a NULL pointer, the return value is NULL.
+ // After this operation, this object will hold a NULL pointer,
+ // and will not own the object any more.
+ C* release() {
+ C* retVal = ptr_;
+ ptr_ = NULL;
+ return retVal;
+ }
+
+ private:
+ C* ptr_;
+
+ // Forbid comparison of scoped_ptr types. If C2 != C, it totally doesn't
+ // make sense, and if C2 == C, it still doesn't make sense because you should
+ // never have the same object owned by two different scoped_ptrs.
+ template <class C2> bool operator==(scoped_ptr<C2> const& p2) const;
+ template <class C2> bool operator!=(scoped_ptr<C2> const& p2) const;
+
+ // Disallow evil constructors
+ scoped_ptr(const scoped_ptr&);
+ void operator=(const scoped_ptr&);
+};
+
+// Free functions
+template <class C>
+void swap(scoped_ptr<C>& p1, scoped_ptr<C>& p2) {
+ p1.swap(p2);
+}
+
+template <class C>
+bool operator==(C* p1, const scoped_ptr<C>& p2) {
+ return p1 == p2.get();
+}
+
+template <class C>
+bool operator!=(C* p1, const scoped_ptr<C>& p2) {
+ return p1 != p2.get();
+}
+
+// scoped_array<C> is like scoped_ptr<C>, except that the caller must allocate
+// with new [] and the destructor deletes objects with delete [].
+//
+// As with scoped_ptr<C>, a scoped_array<C> either points to an object
+// or is NULL. A scoped_array<C> owns the object that it points to.
+// scoped_array<T> is thread-compatible, and once you index into it,
+// the returned objects have only the threadsafety guarantees of T.
+//
+// Size: sizeof(scoped_array<C>) == sizeof(C*)
+template <class C>
+class scoped_array {
+ public:
+
+ // The element type
+ typedef C element_type;
+
+ // Constructor. Defaults to intializing with NULL.
+ // There is no way to create an uninitialized scoped_array.
+ // The input parameter must be allocated with new [].
+ explicit scoped_array(C* p = NULL) : array_(p) { }
+
+ // Destructor. If there is a C object, delete it.
+ // We don't need to test ptr_ == NULL because C++ does that for us.
+ ~scoped_array() {
+ enum { type_must_be_complete = sizeof(C) };
+ delete[] array_;
+ }
+
+ // Reset. Deletes the current owned object, if any.
+ // Then takes ownership of a new object, if given.
+ // this->reset(this->get()) works.
+ void reset(C* p = NULL) {
+ if (p != array_) {
+ enum { type_must_be_complete = sizeof(C) };
+ delete[] array_;
+ array_ = p;
+ }
+ }
+
+ // Get one element of the current object.
+ // Will assert() if there is no current object, or index i is negative.
+ C& operator[](ptrdiff_t i) const {
+ assert(i >= 0);
+ assert(array_ != NULL);
+ return array_[i];
+ }
+
+ // Get a pointer to the zeroth element of the current object.
+ // If there is no current object, return NULL.
+ C* get() const {
+ return array_;
+ }
+
+ // Comparison operators.
+ // These return whether two scoped_array refer to the same object, not just to
+ // two different but equal objects.
+ bool operator==(C* p) const { return array_ == p; }
+ bool operator!=(C* p) const { return array_ != p; }
+
+ // Swap two scoped arrays.
+ void swap(scoped_array& p2) {
+ C* tmp = array_;
+ array_ = p2.array_;
+ p2.array_ = tmp;
+ }
+
+ // Release an array.
+ // The return value is the current pointer held by this object.
+ // If this object holds a NULL pointer, the return value is NULL.
+ // After this operation, this object will hold a NULL pointer,
+ // and will not own the object any more.
+ C* release() {
+ C* retVal = array_;
+ array_ = NULL;
+ return retVal;
+ }
+
+ private:
+ C* array_;
+
+ // Forbid comparison of different scoped_array types.
+ template <class C2> bool operator==(scoped_array<C2> const& p2) const;
+ template <class C2> bool operator!=(scoped_array<C2> const& p2) const;
+
+ // Disallow evil constructors
+ scoped_array(const scoped_array&);
+ void operator=(const scoped_array&);
+};
+
+// Free functions
+template <class C>
+void swap(scoped_array<C>& p1, scoped_array<C>& p2) {
+ p1.swap(p2);
+}
+
+template <class C>
+bool operator==(C* p1, const scoped_array<C>& p2) {
+ return p1 == p2.get();
+}
+
+template <class C>
+bool operator!=(C* p1, const scoped_array<C>& p2) {
+ return p1 != p2.get();
+}
+
+// This class wraps the c library function free() in a class that can be
+// passed as a template argument to scoped_ptr_malloc below.
+class ScopedPtrMallocFree {
+ public:
+ inline void operator()(void* x) const {
+ free(x);
+ }
+};
+
+// scoped_ptr_malloc<> is similar to scoped_ptr<>, but it accepts a
+// second template argument, the functor used to free the object.
+
+template<class C, class FreeProc = ScopedPtrMallocFree>
+class scoped_ptr_malloc {
+ public:
+
+ // The element type
+ typedef C element_type;
+
+ // Constructor. Defaults to initializing with NULL.
+ // There is no way to create an uninitialized scoped_ptr.
+ // The input parameter must be allocated with an allocator that matches the
+ // Free functor. For the default Free functor, this is malloc, calloc, or
+ // realloc.
+ explicit scoped_ptr_malloc(C* p = NULL): ptr_(p) {}
+
+ // Destructor. If there is a C object, call the Free functor.
+ ~scoped_ptr_malloc() {
+ reset();
+ }
+
+ // Reset. Calls the Free functor on the current owned object, if any.
+ // Then takes ownership of a new object, if given.
+ // this->reset(this->get()) works.
+ void reset(C* p = NULL) {
+ if (ptr_ != p) {
+ FreeProc free_proc;
+ free_proc(ptr_);
+ ptr_ = p;
+ }
+ }
+
+ // Get the current object.
+ // operator* and operator-> will cause an assert() failure if there is
+ // no current object.
+ C& operator*() const {
+ assert(ptr_ != NULL);
+ return *ptr_;
+ }
+
+ C* operator->() const {
+ assert(ptr_ != NULL);
+ return ptr_;
+ }
+
+ C* get() const {
+ return ptr_;
+ }
+
+ // Comparison operators.
+ // These return whether a scoped_ptr_malloc and a plain pointer refer
+ // to the same object, not just to two different but equal objects.
+ // For compatibility with the boost-derived implementation, these
+ // take non-const arguments.
+ bool operator==(C* p) const {
+ return ptr_ == p;
+ }
+
+ bool operator!=(C* p) const {
+ return ptr_ != p;
+ }
+
+ // Swap two scoped pointers.
+ void swap(scoped_ptr_malloc & b) {
+ C* tmp = b.ptr_;
+ b.ptr_ = ptr_;
+ ptr_ = tmp;
+ }
+
+ // Release a pointer.
+ // The return value is the current pointer held by this object.
+ // If this object holds a NULL pointer, the return value is NULL.
+ // After this operation, this object will hold a NULL pointer,
+ // and will not own the object any more.
+ C* release() {
+ C* tmp = ptr_;
+ ptr_ = NULL;
+ return tmp;
+ }
+
+ private:
+ C* ptr_;
+
+ // no reason to use these: each scoped_ptr_malloc should have its own object
+ template <class C2, class GP>
+ bool operator==(scoped_ptr_malloc<C2, GP> const& p) const;
+ template <class C2, class GP>
+ bool operator!=(scoped_ptr_malloc<C2, GP> const& p) const;
+
+ // Disallow evil constructors
+ scoped_ptr_malloc(const scoped_ptr_malloc&);
+ void operator=(const scoped_ptr_malloc&);
+};
+
+template<class C, class FP> inline
+void swap(scoped_ptr_malloc<C, FP>& a, scoped_ptr_malloc<C, FP>& b) {
+ a.swap(b);
+}
+
+template<class C, class FP> inline
+bool operator==(C* p, const scoped_ptr_malloc<C, FP>& b) {
+ return p == b.get();
+}
+
+template<class C, class FP> inline
+bool operator!=(C* p, const scoped_ptr_malloc<C, FP>& b) {
+ return p != b.get();
+}
+
+} // namespace google_breakpad
+
+#endif // COMMON_SCOPED_PTR_H_
diff --git a/3rdParty/Breakpad/src/common/simple_string_dictionary.cc b/3rdParty/Breakpad/src/common/simple_string_dictionary.cc
new file mode 100644
index 0000000..e0a74ce
--- /dev/null
+++ b/3rdParty/Breakpad/src/common/simple_string_dictionary.cc
@@ -0,0 +1,45 @@
+// Copyright (c) 2007, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#include "common/simple_string_dictionary.h"
+
+namespace google_breakpad {
+
+namespace {
+
+// In C++98 (ISO 14882), section 9.5.1 says that a union cannot have a member
+// with a non-trivial ctor, copy ctor, dtor, or assignment operator. Use this
+// property to ensure that Entry remains POD.
+union Compile_Assert {
+ NonAllocatingMap<1, 1, 1>::Entry Compile_Assert__entry_must_be_pod;
+};
+
+}
+
+} // namespace google_breakpad
diff --git a/3rdParty/Breakpad/src/common/simple_string_dictionary.h b/3rdParty/Breakpad/src/common/simple_string_dictionary.h
new file mode 100644
index 0000000..d2ab17f
--- /dev/null
+++ b/3rdParty/Breakpad/src/common/simple_string_dictionary.h
@@ -0,0 +1,260 @@
+// Copyright (c) 2007, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#ifndef COMMON_SIMPLE_STRING_DICTIONARY_H_
+#define COMMON_SIMPLE_STRING_DICTIONARY_H_
+
+#include <assert.h>
+#include <string.h>
+
+#include "common/basictypes.h"
+
+namespace google_breakpad {
+
+// Opaque type for the serialized representation of a NonAllocatingMap. One is
+// created in NonAllocatingMap::Serialize and can be deserialized using one of
+// the constructors.
+struct SerializedNonAllocatingMap;
+
+// NonAllocatingMap is an implementation of a map/dictionary collection that
+// uses a fixed amount of storage, so that it does not perform any dynamic
+// allocations for its operations.
+//
+// The actual map storage (the Entry) is guaranteed to be POD, so that it can
+// be transmitted over various IPC mechanisms.
+//
+// The template parameters control the amount of storage used for the key,
+// value, and map. The KeySize and ValueSize are measured in bytes, not glyphs,
+// and includes space for a \0 byte. This gives space for KeySize-1 and
+// ValueSize-1 characters in an entry. NumEntries is the total number of
+// entries that will fit in the map.
+template <size_t KeySize, size_t ValueSize, size_t NumEntries>
+class NonAllocatingMap {
+ public:
+ // Constant and publicly accessible versions of the template parameters.
+ static const size_t key_size = KeySize;
+ static const size_t value_size = ValueSize;
+ static const size_t num_entries = NumEntries;
+
+ // An Entry object is a single entry in the map. If the key is a 0-length
+ // NUL-terminated string, the entry is empty.
+ struct Entry {
+ char key[KeySize];
+ char value[ValueSize];
+
+ bool is_active() const {
+ return key[0] != '\0';
+ }
+ };
+
+ // An Iterator can be used to iterate over all the active entries in a
+ // NonAllocatingMap.
+ class Iterator {
+ public:
+ explicit Iterator(const NonAllocatingMap& map)
+ : map_(map),
+ current_(0) {
+ }
+
+ // Returns the next entry in the map, or NULL if at the end of the
+ // collection.
+ const Entry* Next() {
+ while (current_ < map_.num_entries) {
+ const Entry* entry = &map_.entries_[current_++];
+ if (entry->is_active()) {
+ return entry;
+ }
+ }
+ return NULL;
+ }
+
+ private:
+ const NonAllocatingMap& map_;
+ size_t current_;
+
+ DISALLOW_COPY_AND_ASSIGN(Iterator);
+ };
+
+ NonAllocatingMap() : entries_() {
+ }
+
+ NonAllocatingMap(const NonAllocatingMap& other) {
+ *this = other;
+ }
+
+ NonAllocatingMap& operator=(const NonAllocatingMap& other) {
+ assert(other.key_size == key_size);
+ assert(other.value_size == value_size);
+ assert(other.num_entries == num_entries);
+ if (other.key_size == key_size && other.value_size == value_size &&
+ other.num_entries == num_entries) {
+ memcpy(entries_, other.entries_, sizeof(entries_));
+ }
+ return *this;
+ }
+
+ // Constructs a map from its serialized form. |map| should be the out
+ // parameter from Serialize() and |size| should be its return value.
+ NonAllocatingMap(const SerializedNonAllocatingMap* map, size_t size) {
+ assert(size == sizeof(entries_));
+ if (size == sizeof(entries_)) {
+ memcpy(entries_, map, size);
+ }
+ }
+
+ // Returns the number of active key/value pairs. The upper limit for this
+ // is NumEntries.
+ size_t GetCount() const {
+ size_t count = 0;
+ for (size_t i = 0; i < num_entries; ++i) {
+ if (entries_[i].is_active()) {
+ ++count;
+ }
+ }
+ return count;
+ }
+
+ // Given |key|, returns its corresponding |value|. |key| must not be NULL. If
+ // the key is not found, NULL is returned.
+ const char* GetValueForKey(const char* key) const {
+ assert(key);
+ if (!key)
+ return NULL;
+
+ const Entry* entry = GetConstEntryForKey(key);
+ if (!entry)
+ return NULL;
+
+ return entry->value;
+ }
+
+ // Stores |value| into |key|, replacing the existing value if |key| is
+ // already present. |key| must not be NULL. If |value| is NULL, the key is
+ // removed from the map. If there is no more space in the map, then the
+ // operation silently fails.
+ void SetKeyValue(const char* key, const char* value) {
+ if (!value) {
+ RemoveKey(key);
+ return;
+ }
+
+ assert(key);
+ if (!key)
+ return;
+
+ // Key must not be an empty string.
+ assert(key[0] != '\0');
+ if (key[0] == '\0')
+ return;
+
+ Entry* entry = GetEntryForKey(key);
+
+ // If it does not yet exist, attempt to insert it.
+ if (!entry) {
+ for (size_t i = 0; i < num_entries; ++i) {
+ if (!entries_[i].is_active()) {
+ entry = &entries_[i];
+
+ strncpy(entry->key, key, key_size);
+ entry->key[key_size - 1] = '\0';
+
+ break;
+ }
+ }
+ }
+
+ // If the map is out of space, entry will be NULL.
+ if (!entry)
+ return;
+
+#ifndef NDEBUG
+ // Sanity check that the key only appears once.
+ int count = 0;
+ for (size_t i = 0; i < num_entries; ++i) {
+ if (strncmp(entries_[i].key, key, key_size) == 0)
+ ++count;
+ }
+ assert(count == 1);
+#endif
+
+ strncpy(entry->value, value, value_size);
+ entry->value[value_size - 1] = '\0';
+ }
+
+ // Given |key|, removes any associated value. |key| must not be NULL. If
+ // the key is not found, this is a noop.
+ void RemoveKey(const char* key) {
+ assert(key);
+ if (!key)
+ return;
+
+ Entry* entry = GetEntryForKey(key);
+ if (entry) {
+ entry->key[0] = '\0';
+ entry->value[0] = '\0';
+ }
+
+#ifndef NDEBUG
+ assert(GetEntryForKey(key) == NULL);
+#endif
+ }
+
+ // Places a serialized version of the map into |map| and returns the size.
+ // Both of these should be passed to the deserializing constructor. Note that
+ // the serialized |map| is scoped to the lifetime of the non-serialized
+ // instance of this class. The |map| can be copied across IPC boundaries.
+ size_t Serialize(const SerializedNonAllocatingMap** map) const {
+ *map = reinterpret_cast<const SerializedNonAllocatingMap*>(entries_);
+ return sizeof(entries_);
+ }
+
+ private:
+ const Entry* GetConstEntryForKey(const char* key) const {
+ for (size_t i = 0; i < num_entries; ++i) {
+ if (strncmp(key, entries_[i].key, key_size) == 0) {
+ return &entries_[i];
+ }
+ }
+ return NULL;
+ }
+
+ Entry* GetEntryForKey(const char* key) {
+ return const_cast<Entry*>(GetConstEntryForKey(key));
+ }
+
+ Entry entries_[NumEntries];
+};
+
+// For historical reasons this specialized version is available with the same
+// size factors as a previous implementation.
+typedef NonAllocatingMap<256, 256, 64> SimpleStringDictionary;
+
+} // namespace google_breakpad
+
+#endif // COMMON_SIMPLE_STRING_DICTIONARY_H_
diff --git a/3rdParty/Breakpad/src/common/simple_string_dictionary_unittest.cc b/3rdParty/Breakpad/src/common/simple_string_dictionary_unittest.cc
new file mode 100644
index 0000000..34f4b9e
--- /dev/null
+++ b/3rdParty/Breakpad/src/common/simple_string_dictionary_unittest.cc
@@ -0,0 +1,308 @@
+// Copyright (c) 2008, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#include "breakpad_googletest_includes.h"
+#include "common/simple_string_dictionary.h"
+
+namespace google_breakpad {
+
+TEST(NonAllocatingMapTest, Entry) {
+ typedef NonAllocatingMap<5, 9, 15> TestMap;
+ TestMap map;
+
+ const TestMap::Entry* entry = TestMap::Iterator(map).Next();
+ EXPECT_FALSE(entry);
+
+ // Try setting a key/value and then verify.
+ map.SetKeyValue("key1", "value1");
+ entry = TestMap::Iterator(map).Next();
+ ASSERT_TRUE(entry);
+ EXPECT_STREQ(entry->key, "key1");
+ EXPECT_STREQ(entry->value, "value1");
+
+ // Try setting a new value.
+ map.SetKeyValue("key1", "value3");
+ EXPECT_STREQ(entry->value, "value3");
+
+ // Make sure the key didn't change.
+ EXPECT_STREQ(entry->key, "key1");
+
+ // Clear the entry and verify the key and value are empty strings.
+ map.RemoveKey("key1");
+ EXPECT_FALSE(entry->is_active());
+ EXPECT_EQ(strlen(entry->key), 0u);
+ EXPECT_EQ(strlen(entry->value), 0u);
+}
+
+TEST(NonAllocatingMapTest, SimpleStringDictionary) {
+ // Make a new dictionary
+ SimpleStringDictionary dict;
+
+ // Set three distinct values on three keys
+ dict.SetKeyValue("key1", "value1");
+ dict.SetKeyValue("key2", "value2");
+ dict.SetKeyValue("key3", "value3");
+
+ EXPECT_NE(dict.GetValueForKey("key1"), "value1");
+ EXPECT_NE(dict.GetValueForKey("key2"), "value2");
+ EXPECT_NE(dict.GetValueForKey("key3"), "value3");
+ EXPECT_EQ(dict.GetCount(), 3u);
+ // try an unknown key
+ EXPECT_FALSE(dict.GetValueForKey("key4"));
+
+ // Remove a key
+ dict.RemoveKey("key3");
+
+ // Now make sure it's not there anymore
+ EXPECT_FALSE(dict.GetValueForKey("key3"));
+
+ // Remove by setting value to NULL
+ dict.SetKeyValue("key2", NULL);
+
+ // Now make sure it's not there anymore
+ EXPECT_FALSE(dict.GetValueForKey("key2"));
+}
+
+TEST(NonAllocatingMapTest, CopyAndAssign) {
+ NonAllocatingMap<10, 10, 10> map;
+ map.SetKeyValue("one", "a");
+ map.SetKeyValue("two", "b");
+ map.SetKeyValue("three", "c");
+ map.RemoveKey("two");
+ EXPECT_EQ(2u, map.GetCount());
+
+ // Test copy.
+ NonAllocatingMap<10, 10, 10> map_copy(map);
+ EXPECT_EQ(2u, map_copy.GetCount());
+ EXPECT_STREQ("a", map_copy.GetValueForKey("one"));
+ EXPECT_STREQ("c", map_copy.GetValueForKey("three"));
+ map_copy.SetKeyValue("four", "d");
+ EXPECT_STREQ("d", map_copy.GetValueForKey("four"));
+ EXPECT_FALSE(map.GetValueForKey("four"));
+
+ // Test assign.
+ NonAllocatingMap<10, 10, 10> map_assign;
+ map_assign = map;
+ EXPECT_EQ(2u, map_assign.GetCount());
+ EXPECT_STREQ("a", map_assign.GetValueForKey("one"));
+ EXPECT_STREQ("c", map_assign.GetValueForKey("three"));
+ map_assign.SetKeyValue("four", "d");
+ EXPECT_STREQ("d", map_assign.GetValueForKey("four"));
+ EXPECT_FALSE(map.GetValueForKey("four"));
+
+ map.RemoveKey("one");
+ EXPECT_FALSE(map.GetValueForKey("one"));
+ EXPECT_STREQ("a", map_copy.GetValueForKey("one"));
+ EXPECT_STREQ("a", map_assign.GetValueForKey("one"));
+}
+
+// Add a bunch of values to the dictionary, remove some entries in the middle,
+// and then add more.
+TEST(NonAllocatingMapTest, Iterator) {
+ SimpleStringDictionary* dict = new SimpleStringDictionary();
+ ASSERT_TRUE(dict);
+
+ char key[SimpleStringDictionary::key_size];
+ char value[SimpleStringDictionary::value_size];
+
+ const int kDictionaryCapacity = SimpleStringDictionary::num_entries;
+ const int kPartitionIndex = kDictionaryCapacity - 5;
+
+ // We assume at least this size in the tests below
+ ASSERT_GE(kDictionaryCapacity, 64);
+
+ // We'll keep track of the number of key/value pairs we think should
+ // be in the dictionary
+ int expectedDictionarySize = 0;
+
+ // Set a bunch of key/value pairs like key0/value0, key1/value1, ...
+ for (int i = 0; i < kPartitionIndex; ++i) {
+ sprintf(key, "key%d", i);
+ sprintf(value, "value%d", i);
+ dict->SetKeyValue(key, value);
+ }
+ expectedDictionarySize = kPartitionIndex;
+
+ // set a couple of the keys twice (with the same value) - should be nop
+ dict->SetKeyValue("key2", "value2");
+ dict->SetKeyValue("key4", "value4");
+ dict->SetKeyValue("key15", "value15");
+
+ // Remove some random elements in the middle
+ dict->RemoveKey("key7");
+ dict->RemoveKey("key18");
+ dict->RemoveKey("key23");
+ dict->RemoveKey("key31");
+ expectedDictionarySize -= 4; // we just removed four key/value pairs
+
+ // Set some more key/value pairs like key59/value59, key60/value60, ...
+ for (int i = kPartitionIndex; i < kDictionaryCapacity; ++i) {
+ sprintf(key, "key%d", i);
+ sprintf(value, "value%d", i);
+ dict->SetKeyValue(key, value);
+ }
+ expectedDictionarySize += kDictionaryCapacity - kPartitionIndex;
+
+ // Now create an iterator on the dictionary
+ SimpleStringDictionary::Iterator iter(*dict);
+
+ // We then verify that it iterates through exactly the number of
+ // key/value pairs we expect, and that they match one-for-one with what we
+ // would expect. The ordering of the iteration does not matter...
+
+ // used to keep track of number of occurrences found for key/value pairs
+ int count[kDictionaryCapacity];
+ memset(count, 0, sizeof(count));
+
+ int totalCount = 0;
+
+ const SimpleStringDictionary::Entry* entry;
+ while ((entry = iter.Next())) {
+ totalCount++;
+
+ // Extract keyNumber from a string of the form key<keyNumber>
+ int keyNumber;
+ sscanf(entry->key, "key%d", &keyNumber);
+
+ // Extract valueNumber from a string of the form value<valueNumber>
+ int valueNumber;
+ sscanf(entry->value, "value%d", &valueNumber);
+
+ // The value number should equal the key number since that's how we set them
+ EXPECT_EQ(keyNumber, valueNumber);
+
+ // Key and value numbers should be in proper range:
+ // 0 <= keyNumber < kDictionaryCapacity
+ bool isKeyInGoodRange =
+ (keyNumber >= 0 && keyNumber < kDictionaryCapacity);
+ bool isValueInGoodRange =
+ (valueNumber >= 0 && valueNumber < kDictionaryCapacity);
+ EXPECT_TRUE(isKeyInGoodRange);
+ EXPECT_TRUE(isValueInGoodRange);
+
+ if (isKeyInGoodRange && isValueInGoodRange) {
+ ++count[keyNumber];
+ }
+ }
+
+ // Make sure each of the key/value pairs showed up exactly one time, except
+ // for the ones which we removed.
+ for (size_t i = 0; i < kDictionaryCapacity; ++i) {
+ // Skip over key7, key18, key23, and key31, since we removed them
+ if (!(i == 7 || i == 18 || i == 23 || i == 31)) {
+ EXPECT_EQ(count[i], 1);
+ }
+ }
+
+ // Make sure the number of iterations matches the expected dictionary size.
+ EXPECT_EQ(totalCount, expectedDictionarySize);
+}
+
+
+TEST(NonAllocatingMapTest, AddRemove) {
+ NonAllocatingMap<5, 7, 6> map;
+ map.SetKeyValue("rob", "ert");
+ map.SetKeyValue("mike", "pink");
+ map.SetKeyValue("mark", "allays");
+
+ EXPECT_EQ(3u, map.GetCount());
+ EXPECT_STREQ("ert", map.GetValueForKey("rob"));
+ EXPECT_STREQ("pink", map.GetValueForKey("mike"));
+ EXPECT_STREQ("allays", map.GetValueForKey("mark"));
+
+ map.RemoveKey("mike");
+
+ EXPECT_EQ(2u, map.GetCount());
+ EXPECT_FALSE(map.GetValueForKey("mike"));
+
+ map.SetKeyValue("mark", "mal");
+ EXPECT_EQ(2u, map.GetCount());
+ EXPECT_STREQ("mal", map.GetValueForKey("mark"));
+
+ map.RemoveKey("mark");
+ EXPECT_EQ(1u, map.GetCount());
+ EXPECT_FALSE(map.GetValueForKey("mark"));
+}
+
+TEST(NonAllocatingMapTest, Serialize) {
+ typedef NonAllocatingMap<4, 5, 7> TestMap;
+ TestMap map;
+ map.SetKeyValue("one", "abc");
+ map.SetKeyValue("two", "def");
+ map.SetKeyValue("tre", "hig");
+
+ EXPECT_STREQ("abc", map.GetValueForKey("one"));
+ EXPECT_STREQ("def", map.GetValueForKey("two"));
+ EXPECT_STREQ("hig", map.GetValueForKey("tre"));
+
+ const SerializedNonAllocatingMap* serialized;
+ size_t size = map.Serialize(&serialized);
+
+ SerializedNonAllocatingMap* serialized_copy =
+ reinterpret_cast<SerializedNonAllocatingMap*>(malloc(size));
+ ASSERT_TRUE(serialized_copy);
+ memcpy(serialized_copy, serialized, size);
+
+ TestMap deserialized(serialized_copy, size);
+ free(serialized_copy);
+
+ EXPECT_EQ(3u, deserialized.GetCount());
+ EXPECT_STREQ("abc", deserialized.GetValueForKey("one"));
+ EXPECT_STREQ("def", deserialized.GetValueForKey("two"));
+ EXPECT_STREQ("hig", deserialized.GetValueForKey("tre"));
+}
+
+// Running out of space shouldn't crash.
+TEST(NonAllocatingMapTest, OutOfSpace) {
+ NonAllocatingMap<3, 2, 2> map;
+ map.SetKeyValue("a", "1");
+ map.SetKeyValue("b", "2");
+ map.SetKeyValue("c", "3");
+ EXPECT_EQ(2u, map.GetCount());
+ EXPECT_FALSE(map.GetValueForKey("c"));
+}
+
+#ifndef NDEBUG
+
+TEST(NonAllocatingMapTest, NullKey) {
+ NonAllocatingMap<4, 6, 6> map;
+ ASSERT_DEATH(map.SetKeyValue(NULL, "hello"), "");
+
+ map.SetKeyValue("hi", "there");
+ ASSERT_DEATH(map.GetValueForKey(NULL), "");
+ EXPECT_STREQ("there", map.GetValueForKey("hi"));
+
+ ASSERT_DEATH(map.GetValueForKey(NULL), "");
+ map.RemoveKey("hi");
+ EXPECT_EQ(0u, map.GetCount());
+}
+
+#endif // !NDEBUG
+
+} // namespace google_breakpad
diff --git a/3rdParty/Breakpad/src/common/stabs_reader.h b/3rdParty/Breakpad/src/common/stabs_reader.h
index d89afc0..98ee2dd 100644
--- a/3rdParty/Breakpad/src/common/stabs_reader.h
+++ b/3rdParty/Breakpad/src/common/stabs_reader.h
@@ -53,11 +53,10 @@
#include <config.h>
#endif
-#ifdef HAVE_A_OUT_H
-#include <a.out.h>
-#endif
#ifdef HAVE_MACH_O_NLIST_H
#include <mach-o/nlist.h>
+#elif defined(HAVE_A_OUT_H)
+#include <a.out.h>
#endif
#include <string>
diff --git a/3rdParty/Breakpad/src/common/stabs_reader_unittest.cc b/3rdParty/Breakpad/src/common/stabs_reader_unittest.cc
new file mode 100644
index 0000000..a84da1c
--- /dev/null
+++ b/3rdParty/Breakpad/src/common/stabs_reader_unittest.cc
@@ -0,0 +1,611 @@
+// Copyright (c) 2010 Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// Original author: Jim Blandy <jimb@mozilla.com> <jimb@red-bean.com>
+
+// stabs_reader_unittest.cc: Unit tests for google_breakpad::StabsReader.
+
+#include <assert.h>
+#include <errno.h>
+#include <stab.h>
+#include <stdarg.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <fstream>
+#include <iomanip>
+#include <iostream>
+#include <map>
+#include <sstream>
+#include <string>
+
+#include "breakpad_googletest_includes.h"
+#include "common/stabs_reader.h"
+#include "common/test_assembler.h"
+#include "common/using_std_string.h"
+
+using ::testing::Eq;
+using ::testing::InSequence;
+using ::testing::Return;
+using ::testing::StrEq;
+using ::testing::Test;
+using ::testing::_;
+using google_breakpad::StabsHandler;
+using google_breakpad::StabsReader;
+using google_breakpad::test_assembler::Label;
+using google_breakpad::test_assembler::Section;
+using google_breakpad::test_assembler::kBigEndian;
+using google_breakpad::test_assembler::kLittleEndian;
+using std::map;
+
+namespace {
+
+// A StringAssembler is a class for generating .stabstr sections to present
+// as input to the STABS parser.
+class StringAssembler: public Section {
+ public:
+ StringAssembler() : in_cu_(false) { StartCU(); }
+
+ // Add the string S to this StringAssembler, and return the string's
+ // offset within this compilation unit's strings. If S has been added
+ // already, this returns the offset of its first instance.
+ size_t Add(const string &s) {
+ map<string, size_t>::iterator it = added_.find(s);
+ if (it != added_.end())
+ return it->second;
+ size_t offset = Size() - cu_start_;
+ AppendCString(s);
+ added_[s] = offset;
+ return offset;
+ }
+
+ // Start a fresh compilation unit string collection.
+ void StartCU() {
+ // Ignore duplicate calls to StartCU. Our test data don't always call
+ // StartCU at all, meaning that our constructor has to take care of it,
+ // meaning that tests that *do* call StartCU call it twice at the
+ // beginning. This is not worth smoothing out.
+ if (in_cu_) return;
+
+ added_.clear();
+ cu_start_ = Size();
+
+ // Each compilation unit's strings start with an empty string.
+ AppendCString("");
+ added_[""] = 0;
+
+ in_cu_ = true;
+ }
+
+ // Finish off the current CU's strings.
+ size_t EndCU() {
+ assert(in_cu_);
+ in_cu_ = false;
+ return Size() - cu_start_;
+ }
+
+ private:
+ // The offset of the start of this compilation unit's strings.
+ size_t cu_start_;
+
+ // True if we're in a CU.
+ bool in_cu_;
+
+ // A map from the strings that have been added to this section to
+ // their starting indices within their compilation unit.
+ map<string, size_t> added_;
+};
+
+// A StabsAssembler is a class for generating .stab sections to present as
+// test input for the STABS parser.
+class StabsAssembler: public Section {
+ public:
+ // Create a StabsAssembler that uses StringAssembler for its strings.
+ StabsAssembler(StringAssembler *string_assembler)
+ : Section(string_assembler->endianness()),
+ string_assembler_(string_assembler),
+ value_size_(0),
+ entry_count_(0),
+ cu_header_(NULL) { }
+ ~StabsAssembler() { assert(!cu_header_); }
+
+ // Accessor and setter for value_size_.
+ size_t value_size() const { return value_size_; }
+ StabsAssembler &set_value_size(size_t value_size) {
+ value_size_ = value_size;
+ return *this;
+ }
+
+ // Append a STAB entry to the end of this section with the given
+ // characteristics. NAME is the offset of this entry's name string within
+ // its compilation unit's portion of the .stabstr section; this can be a
+ // value generated by a StringAssembler. Return a reference to this
+ // StabsAssembler.
+ StabsAssembler &Stab(uint8_t type, uint8_t other, Label descriptor,
+ Label value, Label name) {
+ D32(name);
+ D8(type);
+ D8(other);
+ D16(descriptor);
+ Append(endianness(), value_size_, value);
+ entry_count_++;
+ return *this;
+ }
+
+ // As above, but automatically add NAME to our StringAssembler.
+ StabsAssembler &Stab(uint8_t type, uint8_t other, Label descriptor,
+ Label value, const string &name) {
+ return Stab(type, other, descriptor, value, string_assembler_->Add(name));
+ }
+
+ // Start a compilation unit named NAME, with an N_UNDF symbol to start
+ // it, and its own portion of the string section. Return a reference to
+ // this StabsAssembler.
+ StabsAssembler &StartCU(const string &name) {
+ assert(!cu_header_);
+ cu_header_ = new CUHeader;
+ string_assembler_->StartCU();
+ entry_count_ = 0;
+ return Stab(N_UNDF, 0,
+ cu_header_->final_entry_count,
+ cu_header_->final_string_size,
+ string_assembler_->Add(name));
+ }
+
+ // Close off the current compilation unit. Return a reference to this
+ // StabsAssembler.
+ StabsAssembler &EndCU() {
+ assert(cu_header_);
+ cu_header_->final_entry_count = entry_count_;
+ cu_header_->final_string_size = string_assembler_->EndCU();
+ delete cu_header_;
+ cu_header_ = NULL;
+ return *this;
+ }
+
+ private:
+ // Data used in a compilation unit header STAB that we won't know until
+ // we've finished the compilation unit.
+ struct CUHeader {
+ // The final number of entries this compilation unit will hold.
+ Label final_entry_count;
+
+ // The final size of this compilation unit's strings.
+ Label final_string_size;
+ };
+
+ // The strings for our STABS entries.
+ StringAssembler *string_assembler_;
+
+ // The size of the 'value' field of stabs entries in this section.
+ size_t value_size_;
+
+ // The number of entries in this compilation unit so far.
+ size_t entry_count_;
+
+ // Header labels for this compilation unit, if we've started one but not
+ // finished it.
+ CUHeader *cu_header_;
+};
+
+class MockStabsReaderHandler: public StabsHandler {
+ public:
+ MOCK_METHOD3(StartCompilationUnit,
+ bool(const char *, uint64_t, const char *));
+ MOCK_METHOD1(EndCompilationUnit, bool(uint64_t));
+ MOCK_METHOD2(StartFunction, bool(const string &, uint64_t));
+ MOCK_METHOD1(EndFunction, bool(uint64_t));
+ MOCK_METHOD3(Line, bool(uint64_t, const char *, int));
+ MOCK_METHOD2(Extern, bool(const string &, uint64_t));
+ void Warning(const char *format, ...) { MockWarning(format); }
+ MOCK_METHOD1(MockWarning, void(const char *));
+};
+
+struct StabsFixture {
+ StabsFixture() : stabs(&strings), unitized(true) { }
+
+ // Create a StabsReader to parse the mock stabs data in stabs and
+ // strings, and pass the parsed information to mock_handler. Use the
+ // endianness and value size of stabs to parse the data. If all goes
+ // well, return the result of calling the reader's Process member
+ // function. Otherwise, return false.
+ bool ApplyHandlerToMockStabsData() {
+ string stabs_contents, stabstr_contents;
+ if (!stabs.GetContents(&stabs_contents) ||
+ !strings.GetContents(&stabstr_contents))
+ return false;
+
+ // Run the parser on the test input, passing whatever we find to HANDLER.
+ StabsReader reader(
+ reinterpret_cast<const uint8_t *>(stabs_contents.data()),
+ stabs_contents.size(),
+ reinterpret_cast<const uint8_t *>(stabstr_contents.data()),
+ stabstr_contents.size(),
+ stabs.endianness() == kBigEndian, stabs.value_size(), unitized,
+ &mock_handler);
+ return reader.Process();
+ }
+
+ StringAssembler strings;
+ StabsAssembler stabs;
+ bool unitized;
+ MockStabsReaderHandler mock_handler;
+};
+
+class Stabs: public StabsFixture, public Test { };
+
+TEST_F(Stabs, MockStabsInput) {
+ stabs.set_endianness(kLittleEndian);
+ stabs.set_value_size(4);
+ stabs
+ .Stab(N_SO, 149, 40232, 0x18a2a72bU, "builddir/")
+ .Stab(N_FUN, 83, 50010, 0x91a5353fU,
+ "not the SO with source file name we expected ")
+ .Stab(N_SO, 165, 24791, 0xfe69d23cU, "")
+ .Stab(N_SO, 184, 34178, 0xca4d883aU, "builddir1/")
+ .Stab(N_SO, 83, 40859, 0xd2fe5df3U, "file1.c")
+ .Stab(N_LSYM, 147, 39565, 0x60d4bb8aU, "not the FUN we're looking for")
+ .Stab(N_FUN, 120, 50271, 0xa049f4b1U, "fun1")
+ .Stab(N_BINCL, 150, 15694, 0xef65c659U,
+ "something to ignore in a FUN body")
+ .Stab(N_SLINE, 147, 4967, 0xd904b3f, "")
+ .Stab(N_SOL, 177, 56135, 0xbd97b1dcU, "header.h")
+ .Stab(N_SLINE, 130, 24610, 0x90f145b, "")
+ .Stab(N_FUN, 45, 32441, 0xbf27cf93U,
+ "fun2:some stabs type info here:to trim from the name")
+ .Stab(N_SLINE, 138, 39002, 0x8148b87, "")
+ .Stab(N_SOL, 60, 49318, 0x1d06e025U, "file1.c")
+ .Stab(N_SLINE, 29, 52163, 0x6eebbb7, "")
+ .Stab(N_SO, 167, 4647, 0xd04b7448U, "")
+ .Stab(N_LSYM, 58, 37837, 0xe6b14d37U, "")
+ .Stab(N_SO, 152, 7810, 0x11759f10U, "file3.c")
+ .Stab(N_SO, 218, 12447, 0x11cfe4b5U, "");
+
+ {
+ InSequence s;
+
+ EXPECT_CALL(mock_handler,
+ StartCompilationUnit(StrEq("file1.c"), 0xd2fe5df3U,
+ StrEq("builddir1/")))
+ .WillOnce(Return(true));
+ EXPECT_CALL(mock_handler, StartFunction(StrEq("fun1"), 0xa049f4b1U))
+ .WillOnce(Return(true));
+ EXPECT_CALL(mock_handler,
+ Line(0xa049f4b1U + 0xd904b3f, StrEq("file1.c"), 4967))
+ .WillOnce(Return(true));
+ EXPECT_CALL(mock_handler,
+ Line(0xa049f4b1U + 0x90f145b, StrEq("header.h"), 24610))
+ .WillOnce(Return(true));
+ EXPECT_CALL(mock_handler, EndFunction(0xbf27cf93U))
+ .WillOnce(Return(true));
+ EXPECT_CALL(mock_handler, StartFunction(StrEq("fun2"), 0xbf27cf93U))
+ .WillOnce(Return(true));
+ EXPECT_CALL(mock_handler,
+ Line(0xbf27cf93U + 0x8148b87, StrEq("header.h"), 39002))
+ .WillOnce(Return(true));
+ EXPECT_CALL(mock_handler,
+ Line(0xbf27cf93U + 0x6eebbb7, StrEq("file1.c"), 52163))
+ .WillOnce(Return(true));
+ EXPECT_CALL(mock_handler, EndFunction(0xd04b7448U))
+ .WillOnce(Return(true));
+ EXPECT_CALL(mock_handler, EndCompilationUnit(0xd04b7448U))
+ .WillOnce(Return(true));
+ EXPECT_CALL(mock_handler, StartCompilationUnit(StrEq("file3.c"),
+ 0x11759f10U, NULL))
+ .WillOnce(Return(true));
+ EXPECT_CALL(mock_handler, EndCompilationUnit(0x11cfe4b5U))
+ .WillOnce(Return(true));
+ }
+
+ ASSERT_TRUE(ApplyHandlerToMockStabsData());
+}
+
+TEST_F(Stabs, AbruptCU) {
+ stabs.set_endianness(kBigEndian);
+ stabs.set_value_size(4);
+ stabs.Stab(N_SO, 177, 23446, 0xbf10d5e4, "file2-1.c");
+
+ {
+ InSequence s;
+
+ EXPECT_CALL(mock_handler,
+ StartCompilationUnit(StrEq("file2-1.c"), 0xbf10d5e4, NULL))
+ .WillOnce(Return(true));
+ EXPECT_CALL(mock_handler, EndCompilationUnit(0))
+ .WillOnce(Return(true));
+ }
+
+ ASSERT_TRUE(ApplyHandlerToMockStabsData());
+}
+
+TEST_F(Stabs, AbruptFunction) {
+ stabs.set_endianness(kLittleEndian);
+ stabs.set_value_size(8);
+ stabs
+ .Stab(N_SO, 218, 26631, 0xb83ddf10U, "file3-1.c")
+ .Stab(N_FUN, 113, 24765, 0xbbd4a145U, "fun3_1");
+
+ {
+ InSequence s;
+
+ EXPECT_CALL(mock_handler,
+ StartCompilationUnit(StrEq("file3-1.c"), 0xb83ddf10U, NULL))
+ .WillOnce(Return(true));
+ EXPECT_CALL(mock_handler, StartFunction(StrEq("fun3_1"), 0xbbd4a145U))
+ .WillOnce(Return(true));
+ EXPECT_CALL(mock_handler, EndFunction(0))
+ .WillOnce(Return(true));
+ EXPECT_CALL(mock_handler, EndCompilationUnit(0))
+ .WillOnce(Return(true));
+ }
+
+ ASSERT_TRUE(ApplyHandlerToMockStabsData());
+}
+
+TEST_F(Stabs, NoCU) {
+ stabs.set_endianness(kBigEndian);
+ stabs.set_value_size(8);
+ stabs.Stab(N_SO, 161, 25673, 0x8f676e7bU, "build-directory/");
+
+ EXPECT_CALL(mock_handler, StartCompilationUnit(_, _, _))
+ .Times(0);
+ EXPECT_CALL(mock_handler, StartFunction(_, _))
+ .Times(0);
+
+ ASSERT_TRUE(ApplyHandlerToMockStabsData());
+}
+
+TEST_F(Stabs, NoCUEnd) {
+ stabs.set_endianness(kBigEndian);
+ stabs.set_value_size(8);
+ stabs
+ .Stab(N_SO, 116, 58280, 0x2f7493c9U, "file5-1.c")
+ .Stab(N_SO, 224, 23057, 0xf9f1d50fU, "file5-2.c");
+
+ {
+ InSequence s;
+
+ EXPECT_CALL(mock_handler,
+ StartCompilationUnit(StrEq("file5-1.c"), 0x2f7493c9U, NULL))
+ .WillOnce(Return(true));
+ EXPECT_CALL(mock_handler, EndCompilationUnit(0))
+ .WillOnce(Return(true));
+ EXPECT_CALL(mock_handler,
+ StartCompilationUnit(StrEq("file5-2.c"), 0xf9f1d50fU, NULL))
+ .WillOnce(Return(true));
+ EXPECT_CALL(mock_handler, EndCompilationUnit(0))
+ .WillOnce(Return(true));
+ }
+
+ ASSERT_TRUE(ApplyHandlerToMockStabsData());
+}
+
+// On systems that store STABS in sections, string offsets are relative to
+// the beginning of that compilation unit's strings, marked with N_UNDF
+// symbols; see the comments for StabsReader::StabsReader.
+TEST_F(Stabs, Unitized) {
+ stabs.set_endianness(kBigEndian);
+ stabs.set_value_size(4);
+ stabs
+ .StartCU("antimony")
+ .Stab(N_SO, 49, 26043, 0x7e259f1aU, "antimony")
+ .Stab(N_FUN, 101, 63253, 0x7fbcccaeU, "arsenic")
+ .Stab(N_SO, 124, 37175, 0x80b0014cU, "")
+ .EndCU()
+ .StartCU("aluminum")
+ .Stab(N_SO, 72, 23084, 0x86756839U, "aluminum")
+ .Stab(N_FUN, 59, 3305, 0xa8e120b0U, "selenium")
+ .Stab(N_SO, 178, 56949, 0xbffff983U, "")
+ .EndCU();
+
+ {
+ InSequence s;
+ EXPECT_CALL(mock_handler,
+ StartCompilationUnit(StrEq("antimony"), 0x7e259f1aU, NULL))
+ .WillOnce(Return(true));
+ EXPECT_CALL(mock_handler, StartFunction(Eq("arsenic"), 0x7fbcccaeU))
+ .WillOnce(Return(true));
+ EXPECT_CALL(mock_handler, EndFunction(0x80b0014cU))
+ .WillOnce(Return(true));
+ EXPECT_CALL(mock_handler, EndCompilationUnit(0x80b0014cU))
+ .WillOnce(Return(true));
+ EXPECT_CALL(mock_handler,
+ StartCompilationUnit(StrEq("aluminum"), 0x86756839U, NULL))
+ .WillOnce(Return(true));
+ EXPECT_CALL(mock_handler, StartFunction(Eq("selenium"), 0xa8e120b0U))
+ .WillOnce(Return(true));
+ EXPECT_CALL(mock_handler, EndFunction(0xbffff983U))
+ .WillOnce(Return(true));
+ EXPECT_CALL(mock_handler, EndCompilationUnit(0xbffff983U))
+ .WillOnce(Return(true));
+ }
+
+ ASSERT_TRUE(ApplyHandlerToMockStabsData());
+}
+
+// On systems that store STABS entries in the real symbol table, the N_UNDF
+// entries have no special meaning, and shouldn't mess up the string
+// indices.
+TEST_F(Stabs, NonUnitized) {
+ stabs.set_endianness(kLittleEndian);
+ stabs.set_value_size(4);
+ unitized = false;
+ stabs
+ .Stab(N_UNDF, 21, 11551, 0x9bad2b2e, "")
+ .Stab(N_UNDF, 21, 11551, 0x9bad2b2e, "")
+ .Stab(N_SO, 71, 45139, 0x11a97352, "Tanzania")
+ .Stab(N_SO, 221, 41976, 0x21a97352, "");
+
+ {
+ InSequence s;
+ EXPECT_CALL(mock_handler,
+ StartCompilationUnit(StrEq("Tanzania"),
+ 0x11a97352, NULL))
+ .WillOnce(Return(true));
+ EXPECT_CALL(mock_handler, EndCompilationUnit(0x21a97352))
+ .WillOnce(Return(true));
+ }
+
+ ASSERT_TRUE(ApplyHandlerToMockStabsData());
+}
+
+TEST_F(Stabs, FunctionEnd) {
+ stabs.set_endianness(kLittleEndian);
+ stabs.set_value_size(8);
+ stabs
+ .Stab(N_SO, 102, 62362, 0x52a830d644cd6942ULL, "compilation unit")
+ // This function is terminated by the start of the next function.
+ .Stab(N_FUN, 216, 38405, 0xbb5ab70ecdd23bfeULL, "function 1")
+ // This function is terminated by an explicit end-of-function stab,
+ // whose value is a size in bytes.
+ .Stab(N_FUN, 240, 10973, 0xc954de9b8fb3e5e2ULL, "function 2")
+ .Stab(N_FUN, 14, 36749, 0xc1ab, "")
+ // This function is terminated by the end of the compilation unit.
+ .Stab(N_FUN, 143, 64514, 0xdff98c9a35386e1fULL, "function 3")
+ .Stab(N_SO, 164, 60142, 0xfdacb856e78bbf57ULL, "");
+
+ {
+ InSequence s;
+ EXPECT_CALL(mock_handler,
+ StartCompilationUnit(StrEq("compilation unit"),
+ 0x52a830d644cd6942ULL, NULL))
+ .WillOnce(Return(true));
+ EXPECT_CALL(mock_handler,
+ StartFunction(Eq("function 1"), 0xbb5ab70ecdd23bfeULL))
+ .WillOnce(Return(true));
+ EXPECT_CALL(mock_handler, EndFunction(0xc954de9b8fb3e5e2ULL))
+ .WillOnce(Return(true));
+ EXPECT_CALL(mock_handler,
+ StartFunction(Eq("function 2"), 0xc954de9b8fb3e5e2ULL))
+ .WillOnce(Return(true));
+ EXPECT_CALL(mock_handler, EndFunction(0xc954de9b8fb3e5e2ULL + 0xc1ab))
+ .WillOnce(Return(true));
+ EXPECT_CALL(mock_handler,
+ StartFunction(Eq("function 3"), 0xdff98c9a35386e1fULL))
+ .WillOnce(Return(true));
+ EXPECT_CALL(mock_handler, EndFunction(0xfdacb856e78bbf57ULL))
+ .WillOnce(Return(true));
+ EXPECT_CALL(mock_handler, EndCompilationUnit(0xfdacb856e78bbf57ULL))
+ .WillOnce(Return(true));
+ }
+
+ ASSERT_TRUE(ApplyHandlerToMockStabsData());
+}
+
+// On Mac OS X, SLINE records can appear before the FUN stab to which they
+// belong, and their values are absolute addresses, not offsets.
+TEST_F(Stabs, LeadingLine) {
+ stabs.set_endianness(kBigEndian);
+ stabs.set_value_size(4);
+ stabs
+ .Stab(N_SO, 179, 27357, 0x8adabc15, "build directory/")
+ .Stab(N_SO, 52, 53058, 0x4c7e3bf4, "compilation unit")
+ .Stab(N_SOL, 165, 12086, 0x6a797ca3, "source file name")
+ .Stab(N_SLINE, 229, 20015, 0x4cb3d7e0, "")
+ .Stab(N_SLINE, 89, 43802, 0x4cba8b88, "")
+ .Stab(N_FUN, 251, 51639, 0xce1b98fa, "rutabaga")
+ .Stab(N_FUN, 218, 16113, 0x5798, "")
+ .Stab(N_SO, 52, 53058, 0xd4af4415, "");
+
+ {
+ InSequence s;
+ EXPECT_CALL(mock_handler,
+ StartCompilationUnit(StrEq("compilation unit"),
+ 0x4c7e3bf4, StrEq("build directory/")))
+ .WillOnce(Return(true));
+ EXPECT_CALL(mock_handler,
+ StartFunction(Eq("rutabaga"), 0xce1b98fa))
+ .WillOnce(Return(true));
+ EXPECT_CALL(mock_handler,
+ Line(0x4cb3d7e0, StrEq("source file name"), 20015))
+ .WillOnce(Return(true));
+ EXPECT_CALL(mock_handler,
+ Line(0x4cba8b88, StrEq("source file name"), 43802))
+ .WillOnce(Return(true));
+ EXPECT_CALL(mock_handler, EndFunction(0xce1b98fa + 0x5798))
+ .WillOnce(Return(true));
+ EXPECT_CALL(mock_handler, EndCompilationUnit(0xd4af4415))
+ .WillOnce(Return(true));
+ }
+
+ ASSERT_TRUE(ApplyHandlerToMockStabsData());
+}
+
+
+#if defined(HAVE_MACH_O_NLIST_H)
+// These tests have no meaning on non-Mach-O-based systems, as
+// only Mach-O uses N_SECT to represent public symbols.
+TEST_F(Stabs, OnePublicSymbol) {
+ stabs.set_endianness(kLittleEndian);
+ stabs.set_value_size(4);
+
+ const uint32_t kExpectedAddress = 0x9000;
+ const string kExpectedFunctionName("public_function");
+ stabs
+ .Stab(N_SECT, 1, 0, kExpectedAddress, kExpectedFunctionName);
+
+ {
+ InSequence s;
+ EXPECT_CALL(mock_handler,
+ Extern(StrEq(kExpectedFunctionName),
+ kExpectedAddress))
+ .WillOnce(Return(true));
+ }
+ ASSERT_TRUE(ApplyHandlerToMockStabsData());
+}
+
+TEST_F(Stabs, TwoPublicSymbols) {
+ stabs.set_endianness(kLittleEndian);
+ stabs.set_value_size(4);
+
+ const uint32_t kExpectedAddress1 = 0xB0B0B0B0;
+ const string kExpectedFunctionName1("public_function");
+ const uint32_t kExpectedAddress2 = 0xF0F0F0F0;
+ const string kExpectedFunctionName2("something else");
+ stabs
+ .Stab(N_SECT, 1, 0, kExpectedAddress1, kExpectedFunctionName1)
+ .Stab(N_SECT, 1, 0, kExpectedAddress2, kExpectedFunctionName2);
+
+ {
+ InSequence s;
+ EXPECT_CALL(mock_handler,
+ Extern(StrEq(kExpectedFunctionName1),
+ kExpectedAddress1))
+ .WillOnce(Return(true));
+ EXPECT_CALL(mock_handler,
+ Extern(StrEq(kExpectedFunctionName2),
+ kExpectedAddress2))
+ .WillOnce(Return(true));
+ }
+ ASSERT_TRUE(ApplyHandlerToMockStabsData());
+}
+
+#endif
+
+} // anonymous namespace
diff --git a/3rdParty/Breakpad/src/common/stabs_to_module.cc b/3rdParty/Breakpad/src/common/stabs_to_module.cc
index e59aebd..0a83cf2 100644
--- a/3rdParty/Breakpad/src/common/stabs_to_module.cc
+++ b/3rdParty/Breakpad/src/common/stabs_to_module.cc
@@ -90,9 +90,7 @@ bool StabsToModule::EndCompilationUnit(uint64_t address) {
bool StabsToModule::StartFunction(const string &name,
uint64_t address) {
assert(!current_function_);
- Module::Function *f = new Module::Function;
- f->name = Demangle(name);
- f->address = address;
+ Module::Function *f = new Module::Function(Demangle(name), address);
f->size = 0; // We compute this in StabsToModule::Finalize().
f->parameter_size = 0; // We don't provide this information.
current_function_ = f;
@@ -133,7 +131,7 @@ bool StabsToModule::Line(uint64_t address, const char *name, int number) {
}
bool StabsToModule::Extern(const string &name, uint64_t address) {
- Module::Extern *ext = new Module::Extern;
+ Module::Extern *ext = new Module::Extern(address);
// Older libstdc++ demangle implementations can crash on unexpected
// input, so be careful about what gets passed in.
if (name.compare(0, 3, "__Z") == 0) {
@@ -143,7 +141,6 @@ bool StabsToModule::Extern(const string &name, uint64_t address) {
} else {
ext->name = name;
}
- ext->address = address;
module_->AddExtern(ext);
return true;
}
diff --git a/3rdParty/Breakpad/src/common/stabs_to_module_unittest.cc b/3rdParty/Breakpad/src/common/stabs_to_module_unittest.cc
new file mode 100644
index 0000000..d445d1d
--- /dev/null
+++ b/3rdParty/Breakpad/src/common/stabs_to_module_unittest.cc
@@ -0,0 +1,258 @@
+// Copyright (c) 2010 Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// Original author: Jim Blandy <jimb@mozilla.com> <jimb@red-bean.com>
+
+// dump_stabs_unittest.cc: Unit tests for StabsToModule.
+
+#include <vector>
+
+#include "breakpad_googletest_includes.h"
+#include "common/stabs_to_module.h"
+
+using google_breakpad::Module;
+using google_breakpad::StabsToModule;
+using std::vector;
+
+TEST(StabsToModule, SimpleCU) {
+ Module m("name", "os", "arch", "id");
+ StabsToModule h(&m);
+
+ // Feed in a simple compilation unit that defines a function with
+ // one line.
+ EXPECT_TRUE(h.StartCompilationUnit("compilation-unit", 0x9f4d1271e50db93bLL,
+ "build-directory"));
+ EXPECT_TRUE(h.StartFunction("function", 0xfde4abbed390c394LL));
+ EXPECT_TRUE(h.Line(0xfde4abbed390c394LL, "source-file-name", 174823314));
+ EXPECT_TRUE(h.EndFunction(0xfde4abbed390c3a4LL));
+ EXPECT_TRUE(h.EndCompilationUnit(0xfee4abbed390c3a4LL));
+ h.Finalize();
+
+ // Now check to see what has been added to the Module.
+ Module::File *file = m.FindExistingFile("source-file-name");
+ ASSERT_TRUE(file != NULL);
+
+ vector<Module::Function *> functions;
+ m.GetFunctions(&functions, functions.end());
+ ASSERT_EQ((size_t) 1, functions.size());
+ Module::Function *function = functions[0];
+ EXPECT_STREQ("function", function->name.c_str());
+ EXPECT_EQ(0xfde4abbed390c394LL, function->address);
+ EXPECT_EQ(0x10U, function->size);
+ EXPECT_EQ(0U, function->parameter_size);
+ ASSERT_EQ((size_t) 1, function->lines.size());
+ Module::Line *line = &function->lines[0];
+ EXPECT_EQ(0xfde4abbed390c394LL, line->address);
+ EXPECT_EQ(0x10U, line->size); // derived from EndFunction
+ EXPECT_TRUE(line->file == file);
+ EXPECT_EQ(174823314, line->number);
+}
+
+#ifdef __GNUC__
+// Function name mangling can vary by compiler, so only run mangled-name
+// tests on GCC for simplicity's sake.
+TEST(StabsToModule, Externs) {
+ Module m("name", "os", "arch", "id");
+ StabsToModule h(&m);
+
+ // Feed in a few Extern symbols.
+ EXPECT_TRUE(h.Extern("_foo", 0xffff));
+ EXPECT_TRUE(h.Extern("__Z21dyldGlobalLockAcquirev", 0xaaaa));
+ EXPECT_TRUE(h.Extern("_MorphTableGetNextMorphChain", 0x1111));
+ h.Finalize();
+
+ // Now check to see what has been added to the Module.
+ vector<Module::Extern *> externs;
+ m.GetExterns(&externs, externs.end());
+ ASSERT_EQ((size_t) 3, externs.size());
+ Module::Extern *extern1 = externs[0];
+ EXPECT_STREQ("MorphTableGetNextMorphChain", extern1->name.c_str());
+ EXPECT_EQ((Module::Address)0x1111, extern1->address);
+ Module::Extern *extern2 = externs[1];
+ EXPECT_STREQ("dyldGlobalLockAcquire()", extern2->name.c_str());
+ EXPECT_EQ((Module::Address)0xaaaa, extern2->address);
+ Module::Extern *extern3 = externs[2];
+ EXPECT_STREQ("foo", extern3->name.c_str());
+ EXPECT_EQ((Module::Address)0xffff, extern3->address);
+}
+#endif // __GNUC__
+
+TEST(StabsToModule, DuplicateFunctionNames) {
+ Module m("name", "os", "arch", "id");
+ StabsToModule h(&m);
+
+ // Compilation unit with one function, mangled name.
+ EXPECT_TRUE(h.StartCompilationUnit("compilation-unit", 0xf2cfda36ecf7f46cLL,
+ "build-directory"));
+ EXPECT_TRUE(h.StartFunction("funcfoo",
+ 0xf2cfda36ecf7f46dLL));
+ EXPECT_TRUE(h.EndFunction(0));
+ EXPECT_TRUE(h.StartFunction("funcfoo",
+ 0xf2cfda36ecf7f46dLL));
+ EXPECT_TRUE(h.EndFunction(0));
+ EXPECT_TRUE(h.EndCompilationUnit(0));
+
+ h.Finalize();
+
+ // Now check to see what has been added to the Module.
+ Module::File *file = m.FindExistingFile("compilation-unit");
+ ASSERT_TRUE(file != NULL);
+
+ vector<Module::Function *> functions;
+ m.GetFunctions(&functions, functions.end());
+ ASSERT_EQ(1U, functions.size());
+
+ Module::Function *function = functions[0];
+ EXPECT_EQ(0xf2cfda36ecf7f46dLL, function->address);
+ EXPECT_LT(0U, function->size); // should have used dummy size
+ EXPECT_EQ(0U, function->parameter_size);
+ ASSERT_EQ(0U, function->lines.size());
+}
+
+TEST(InferSizes, LineSize) {
+ Module m("name", "os", "arch", "id");
+ StabsToModule h(&m);
+
+ // Feed in a simple compilation unit that defines a function with
+ // one line.
+ EXPECT_TRUE(h.StartCompilationUnit("compilation-unit", 0xb4513962eff94e92LL,
+ "build-directory"));
+ EXPECT_TRUE(h.StartFunction("function", 0xb4513962eff94e92LL));
+ EXPECT_TRUE(h.Line(0xb4513962eff94e92LL, "source-file-name-1", 77396614));
+ EXPECT_TRUE(h.Line(0xb4513963eff94e92LL, "source-file-name-2", 87660088));
+ EXPECT_TRUE(h.EndFunction(0)); // unknown function end address
+ EXPECT_TRUE(h.EndCompilationUnit(0)); // unknown CU end address
+ EXPECT_TRUE(h.StartCompilationUnit("compilation-unit-2", 0xb4523963eff94e92LL,
+ "build-directory-2")); // next boundary
+ EXPECT_TRUE(h.EndCompilationUnit(0));
+ h.Finalize();
+
+ // Now check to see what has been added to the Module.
+ Module::File *file1 = m.FindExistingFile("source-file-name-1");
+ ASSERT_TRUE(file1 != NULL);
+ Module::File *file2 = m.FindExistingFile("source-file-name-2");
+ ASSERT_TRUE(file2 != NULL);
+
+ vector<Module::Function *> functions;
+ m.GetFunctions(&functions, functions.end());
+ ASSERT_EQ((size_t) 1, functions.size());
+
+ Module::Function *function = functions[0];
+ EXPECT_STREQ("function", function->name.c_str());
+ EXPECT_EQ(0xb4513962eff94e92LL, function->address);
+ EXPECT_EQ(0x1000100000000ULL, function->size); // inferred from CU end
+ EXPECT_EQ(0U, function->parameter_size);
+ ASSERT_EQ((size_t) 2, function->lines.size());
+
+ Module::Line *line1 = &function->lines[0];
+ EXPECT_EQ(0xb4513962eff94e92LL, line1->address);
+ EXPECT_EQ(0x100000000ULL, line1->size); // derived from EndFunction
+ EXPECT_TRUE(line1->file == file1);
+ EXPECT_EQ(77396614, line1->number);
+
+ Module::Line *line2 = &function->lines[1];
+ EXPECT_EQ(0xb4513963eff94e92LL, line2->address);
+ EXPECT_EQ(0x1000000000000ULL, line2->size); // derived from EndFunction
+ EXPECT_TRUE(line2->file == file2);
+ EXPECT_EQ(87660088, line2->number);
+}
+
+#ifdef __GNUC__
+// Function name mangling can vary by compiler, so only run mangled-name
+// tests on GCC for simplicity's sake.
+TEST(FunctionNames, Mangled) {
+ Module m("name", "os", "arch", "id");
+ StabsToModule h(&m);
+
+ // Compilation unit with one function, mangled name.
+ EXPECT_TRUE(h.StartCompilationUnit("compilation-unit", 0xf2cfda63cef7f46cLL,
+ "build-directory"));
+ EXPECT_TRUE(h.StartFunction("_ZNSt6vectorIySaIyEE9push_backERKy",
+ 0xf2cfda63cef7f46dLL));
+ EXPECT_TRUE(h.EndFunction(0));
+ EXPECT_TRUE(h.EndCompilationUnit(0));
+
+ h.Finalize();
+
+ // Now check to see what has been added to the Module.
+ Module::File *file = m.FindExistingFile("compilation-unit");
+ ASSERT_TRUE(file != NULL);
+
+ vector<Module::Function *> functions;
+ m.GetFunctions(&functions, functions.end());
+ ASSERT_EQ(1U, functions.size());
+
+ Module::Function *function = functions[0];
+ // This is GCC-specific, but we shouldn't be seeing STABS data anywhere
+ // but Linux.
+ EXPECT_STREQ("std::vector<unsigned long long, "
+ "std::allocator<unsigned long long> >::"
+ "push_back(unsigned long long const&)",
+ function->name.c_str());
+ EXPECT_EQ(0xf2cfda63cef7f46dLL, function->address);
+ EXPECT_LT(0U, function->size); // should have used dummy size
+ EXPECT_EQ(0U, function->parameter_size);
+ ASSERT_EQ(0U, function->lines.size());
+}
+#endif // __GNUC__
+
+// The GNU toolchain can omit functions that are not used; however,
+// when it does so, it doesn't clean up the debugging information that
+// refers to them. In STABS, this results in compilation units whose
+// SO addresses are zero.
+TEST(Omitted, Function) {
+ Module m("name", "os", "arch", "id");
+ StabsToModule h(&m);
+
+ // The StartCompilationUnit and EndCompilationUnit calls may both have an
+ // address of zero if the compilation unit has had sections removed.
+ EXPECT_TRUE(h.StartCompilationUnit("compilation-unit", 0, "build-directory"));
+ EXPECT_TRUE(h.StartFunction("function", 0x2a133596));
+ EXPECT_TRUE(h.EndFunction(0));
+ EXPECT_TRUE(h.EndCompilationUnit(0));
+}
+
+// TODO --- if we actually cared about STABS. Even without these we've
+// got full coverage of non-failure source lines in dump_stabs.cc.
+
+// Line size from next line
+// Line size from function end
+// Line size from next function start
+// line size from cu end
+// line size from next cu start
+// fallback size is something plausible
+
+// function size from function end
+// function size from next function start
+// function size from cu end
+// function size from next cu start
+// fallback size is something plausible
+
+// omitting functions outside the compilation unit's address range
+// zero-line, one-line, many-line functions
diff --git a/3rdParty/Breakpad/src/common/stdio_wrapper.h b/3rdParty/Breakpad/src/common/stdio_wrapper.h
new file mode 100644
index 0000000..a3dd50a
--- /dev/null
+++ b/3rdParty/Breakpad/src/common/stdio_wrapper.h
@@ -0,0 +1,43 @@
+// Copyright (c) 2016, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#ifndef GOOGLE_BREAKPAD_COMMON_STDIO_WRAPPER_H
+#define GOOGLE_BREAKPAD_COMMON_STDIO_WRAPPER_H
+
+#include <stdio.h>
+
+#if defined(_MSC_VER) && MSC_VER < 1900
+#include <basetsd.h>
+
+#define snprintf _snprintf
+typedef SSIZE_T ssize_t;
+#endif
+
+
+#endif // GOOGLE_BREAKPAD_COMMON_STDIO_WRAPPER_H
diff --git a/3rdParty/Breakpad/src/common/string_conversion.cc b/3rdParty/Breakpad/src/common/string_conversion.cc
index 27fb8cd..040d3e8 100644
--- a/3rdParty/Breakpad/src/common/string_conversion.cc
+++ b/3rdParty/Breakpad/src/common/string_conversion.cc
@@ -30,23 +30,23 @@
#include <string.h>
#include "common/convert_UTF.h"
+#include "common/scoped_ptr.h"
#include "common/string_conversion.h"
#include "common/using_std_string.h"
-#include "processor/scoped_ptr.h"
namespace google_breakpad {
using std::vector;
-void UTF8ToUTF16(const char *in, vector<u_int16_t> *out) {
+void UTF8ToUTF16(const char *in, vector<uint16_t> *out) {
size_t source_length = strlen(in);
const UTF8 *source_ptr = reinterpret_cast<const UTF8 *>(in);
const UTF8 *source_end_ptr = source_ptr + source_length;
// Erase the contents and zero fill to the expected size
out->clear();
out->insert(out->begin(), source_length, 0);
- u_int16_t *target_ptr = &(*out)[0];
- u_int16_t *target_end_ptr = target_ptr + out->capacity() * sizeof(u_int16_t);
+ uint16_t *target_ptr = &(*out)[0];
+ uint16_t *target_end_ptr = target_ptr + out->capacity() * sizeof(uint16_t);
ConversionResult result = ConvertUTF8toUTF16(&source_ptr, source_end_ptr,
&target_ptr, target_end_ptr,
strictConversion);
@@ -55,11 +55,11 @@ void UTF8ToUTF16(const char *in, vector<u_int16_t> *out) {
out->resize(result == conversionOK ? target_ptr - &(*out)[0] + 1: 0);
}
-int UTF8ToUTF16Char(const char *in, int in_length, u_int16_t out[2]) {
+int UTF8ToUTF16Char(const char *in, int in_length, uint16_t out[2]) {
const UTF8 *source_ptr = reinterpret_cast<const UTF8 *>(in);
- const UTF8 *source_end_ptr = source_ptr + sizeof(char);
- u_int16_t *target_ptr = out;
- u_int16_t *target_end_ptr = target_ptr + 2 * sizeof(u_int16_t);
+ const UTF8 *source_end_ptr = source_ptr + 1;
+ uint16_t *target_ptr = out;
+ uint16_t *target_end_ptr = target_ptr + 2;
out[0] = out[1] = 0;
// Process one character at a time
@@ -82,15 +82,15 @@ int UTF8ToUTF16Char(const char *in, int in_length, u_int16_t out[2]) {
return 0;
}
-void UTF32ToUTF16(const wchar_t *in, vector<u_int16_t> *out) {
+void UTF32ToUTF16(const wchar_t *in, vector<uint16_t> *out) {
size_t source_length = wcslen(in);
const UTF32 *source_ptr = reinterpret_cast<const UTF32 *>(in);
const UTF32 *source_end_ptr = source_ptr + source_length;
// Erase the contents and zero fill to the expected size
out->clear();
out->insert(out->begin(), source_length, 0);
- u_int16_t *target_ptr = &(*out)[0];
- u_int16_t *target_end_ptr = target_ptr + out->capacity() * sizeof(u_int16_t);
+ uint16_t *target_ptr = &(*out)[0];
+ uint16_t *target_end_ptr = target_ptr + out->capacity() * sizeof(uint16_t);
ConversionResult result = ConvertUTF32toUTF16(&source_ptr, source_end_ptr,
&target_ptr, target_end_ptr,
strictConversion);
@@ -99,11 +99,11 @@ void UTF32ToUTF16(const wchar_t *in, vector<u_int16_t> *out) {
out->resize(result == conversionOK ? target_ptr - &(*out)[0] + 1: 0);
}
-void UTF32ToUTF16Char(wchar_t in, u_int16_t out[2]) {
+void UTF32ToUTF16Char(wchar_t in, uint16_t out[2]) {
const UTF32 *source_ptr = reinterpret_cast<const UTF32 *>(&in);
const UTF32 *source_end_ptr = source_ptr + 1;
- u_int16_t *target_ptr = out;
- u_int16_t *target_end_ptr = target_ptr + 2 * sizeof(u_int16_t);
+ uint16_t *target_ptr = out;
+ uint16_t *target_end_ptr = target_ptr + 2;
out[0] = out[1] = 0;
ConversionResult result = ConvertUTF32toUTF16(&source_ptr, source_end_ptr,
&target_ptr, target_end_ptr,
@@ -114,20 +114,20 @@ void UTF32ToUTF16Char(wchar_t in, u_int16_t out[2]) {
}
}
-static inline u_int16_t Swap(u_int16_t value) {
- return (value >> 8) | (value << 8);
+static inline uint16_t Swap(uint16_t value) {
+ return (value >> 8) | static_cast<uint16_t>(value << 8);
}
-string UTF16ToUTF8(const vector<u_int16_t> &in, bool swap) {
+string UTF16ToUTF8(const vector<uint16_t> &in, bool swap) {
const UTF16 *source_ptr = &in[0];
- scoped_ptr<u_int16_t> source_buffer;
+ scoped_array<uint16_t> source_buffer;
// If we're to swap, we need to make a local copy and swap each byte pair
if (swap) {
int idx = 0;
- source_buffer.reset(new u_int16_t[in.size()]);
+ source_buffer.reset(new uint16_t[in.size()]);
UTF16 *source_buffer_ptr = source_buffer.get();
- for (vector<u_int16_t>::const_iterator it = in.begin();
+ for (vector<uint16_t>::const_iterator it = in.begin();
it != in.end(); ++it, ++idx)
source_buffer_ptr[idx] = Swap(*it);
@@ -140,7 +140,7 @@ string UTF16ToUTF8(const vector<u_int16_t> &in, bool swap) {
scoped_array<UTF8> target_buffer(new UTF8[target_capacity]);
UTF8 *target_ptr = target_buffer.get();
UTF8 *target_end_ptr = target_ptr + target_capacity;
- ConversionResult result = ConvertUTF16toUTF8(&source_ptr, source_end_ptr,
+ ConversionResult result = ConvertUTF16toUTF8(&source_ptr, source_end_ptr,
&target_ptr, target_end_ptr,
strictConversion);
diff --git a/3rdParty/Breakpad/src/common/string_conversion.h b/3rdParty/Breakpad/src/common/string_conversion.h
index eeed4d2..b9ba96a 100644
--- a/3rdParty/Breakpad/src/common/string_conversion.h
+++ b/3rdParty/Breakpad/src/common/string_conversion.h
@@ -44,24 +44,24 @@ using std::vector;
// Convert |in| to UTF-16 into |out|. Use platform byte ordering. If the
// conversion failed, |out| will be zero length.
-void UTF8ToUTF16(const char *in, vector<u_int16_t> *out);
+void UTF8ToUTF16(const char *in, vector<uint16_t> *out);
// Convert at least one character (up to a maximum of |in_length|) from |in|
// to UTF-16 into |out|. Return the number of characters consumed from |in|.
// Any unused characters in |out| will be initialized to 0. No memory will
// be allocated by this routine.
-int UTF8ToUTF16Char(const char *in, int in_length, u_int16_t out[2]);
+int UTF8ToUTF16Char(const char *in, int in_length, uint16_t out[2]);
// Convert |in| to UTF-16 into |out|. Use platform byte ordering. If the
// conversion failed, |out| will be zero length.
-void UTF32ToUTF16(const wchar_t *in, vector<u_int16_t> *out);
+void UTF32ToUTF16(const wchar_t *in, vector<uint16_t> *out);
// Convert |in| to UTF-16 into |out|. Any unused characters in |out| will be
// initialized to 0. No memory will be allocated by this routine.
-void UTF32ToUTF16Char(wchar_t in, u_int16_t out[2]);
+void UTF32ToUTF16Char(wchar_t in, uint16_t out[2]);
// Convert |in| to UTF-8. If |swap| is true, swap bytes before converting.
-string UTF16ToUTF8(const vector<u_int16_t> &in, bool swap);
+string UTF16ToUTF8(const vector<uint16_t> &in, bool swap);
} // namespace google_breakpad
diff --git a/3rdParty/Breakpad/src/common/symbol_data.h b/3rdParty/Breakpad/src/common/symbol_data.h
new file mode 100644
index 0000000..2cf15a8
--- /dev/null
+++ b/3rdParty/Breakpad/src/common/symbol_data.h
@@ -0,0 +1,42 @@
+// -*- mode: c++ -*-
+
+// Copyright (c) 2013 Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#ifndef COMMON_SYMBOL_DATA_H_
+#define COMMON_SYMBOL_DATA_H_
+
+// Control what data is used from the symbol file.
+enum SymbolData {
+ ALL_SYMBOL_DATA,
+ NO_CFI,
+ ONLY_CFI
+};
+
+#endif // COMMON_SYMBOL_DATA_H_
diff --git a/3rdParty/Breakpad/src/common/test_assembler.cc b/3rdParty/Breakpad/src/common/test_assembler.cc
new file mode 100644
index 0000000..1e783b4
--- /dev/null
+++ b/3rdParty/Breakpad/src/common/test_assembler.cc
@@ -0,0 +1,359 @@
+// Copyright (c) 2010, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// Original author: Jim Blandy <jimb@mozilla.com> <jimb@red-bean.com>
+
+// test_assembler.cc: Implementation of google_breakpad::TestAssembler.
+// See test_assembler.h for details.
+
+#include "common/test_assembler.h"
+
+#include <assert.h>
+#include <stdio.h>
+
+#include <iterator>
+
+namespace google_breakpad {
+namespace test_assembler {
+
+using std::back_insert_iterator;
+
+Label::Label() : value_(new Binding()) { }
+Label::Label(uint64_t value) : value_(new Binding(value)) { }
+Label::Label(const Label &label) {
+ value_ = label.value_;
+ value_->Acquire();
+}
+Label::~Label() {
+ if (value_->Release()) delete value_;
+}
+
+Label &Label::operator=(uint64_t value) {
+ value_->Set(NULL, value);
+ return *this;
+}
+
+Label &Label::operator=(const Label &label) {
+ value_->Set(label.value_, 0);
+ return *this;
+}
+
+Label Label::operator+(uint64_t addend) const {
+ Label l;
+ l.value_->Set(this->value_, addend);
+ return l;
+}
+
+Label Label::operator-(uint64_t subtrahend) const {
+ Label l;
+ l.value_->Set(this->value_, -subtrahend);
+ return l;
+}
+
+// When NDEBUG is #defined, assert doesn't evaluate its argument. This
+// means you can't simply use assert to check the return value of a
+// function with necessary side effects.
+//
+// ALWAYS_EVALUATE_AND_ASSERT(x) evaluates x regardless of whether
+// NDEBUG is #defined; when NDEBUG is not #defined, it further asserts
+// that x is true.
+#ifdef NDEBUG
+#define ALWAYS_EVALUATE_AND_ASSERT(x) x
+#else
+#define ALWAYS_EVALUATE_AND_ASSERT(x) assert(x)
+#endif
+
+uint64_t Label::operator-(const Label &label) const {
+ uint64_t offset;
+ ALWAYS_EVALUATE_AND_ASSERT(IsKnownOffsetFrom(label, &offset));
+ return offset;
+}
+
+uint64_t Label::Value() const {
+ uint64_t v = 0;
+ ALWAYS_EVALUATE_AND_ASSERT(IsKnownConstant(&v));
+ return v;
+};
+
+bool Label::IsKnownConstant(uint64_t *value_p) const {
+ Binding *base;
+ uint64_t addend;
+ value_->Get(&base, &addend);
+ if (base != NULL) return false;
+ if (value_p) *value_p = addend;
+ return true;
+}
+
+bool Label::IsKnownOffsetFrom(const Label &label, uint64_t *offset_p) const
+{
+ Binding *label_base, *this_base;
+ uint64_t label_addend, this_addend;
+ label.value_->Get(&label_base, &label_addend);
+ value_->Get(&this_base, &this_addend);
+ // If this and label are related, Get will find their final
+ // common ancestor, regardless of how indirect the relation is. This
+ // comparison also handles the constant vs. constant case.
+ if (this_base != label_base) return false;
+ if (offset_p) *offset_p = this_addend - label_addend;
+ return true;
+}
+
+Label::Binding::Binding() : base_(this), addend_(), reference_count_(1) { }
+
+Label::Binding::Binding(uint64_t addend)
+ : base_(NULL), addend_(addend), reference_count_(1) { }
+
+Label::Binding::~Binding() {
+ assert(reference_count_ == 0);
+ if (base_ && base_ != this && base_->Release())
+ delete base_;
+}
+
+void Label::Binding::Set(Binding *binding, uint64_t addend) {
+ if (!base_ && !binding) {
+ // We're equating two constants. This could be okay.
+ assert(addend_ == addend);
+ } else if (!base_) {
+ // We are a known constant, but BINDING may not be, so turn the
+ // tables and try to set BINDING's value instead.
+ binding->Set(NULL, addend_ - addend);
+ } else {
+ if (binding) {
+ // Find binding's final value. Since the final value is always either
+ // completely unconstrained or a constant, never a reference to
+ // another variable (otherwise, it wouldn't be final), this
+ // guarantees we won't create cycles here, even for code like this:
+ // l = m, m = n, n = l;
+ uint64_t binding_addend;
+ binding->Get(&binding, &binding_addend);
+ addend += binding_addend;
+ }
+
+ // It seems likely that setting a binding to itself is a bug
+ // (although I can imagine this might turn out to be helpful to
+ // permit).
+ assert(binding != this);
+
+ if (base_ != this) {
+ // Set the other bindings on our chain as well. Note that this
+ // is sufficient even though binding relationships form trees:
+ // All binding operations traverse their chains to the end, and
+ // all bindings related to us share some tail of our chain, so
+ // they will see the changes we make here.
+ base_->Set(binding, addend - addend_);
+ // We're not going to use base_ any more.
+ if (base_->Release()) delete base_;
+ }
+
+ // Adopt BINDING as our base. Note that it should be correct to
+ // acquire here, after the release above, even though the usual
+ // reference-counting rules call for acquiring first, and then
+ // releasing: the self-reference assertion above should have
+ // complained if BINDING were 'this' or anywhere along our chain,
+ // so we didn't release BINDING.
+ if (binding) binding->Acquire();
+ base_ = binding;
+ addend_ = addend;
+ }
+}
+
+void Label::Binding::Get(Binding **base, uint64_t *addend) {
+ if (base_ && base_ != this) {
+ // Recurse to find the end of our reference chain (the root of our
+ // tree), and then rewrite every binding along the chain to refer
+ // to it directly, adjusting addends appropriately. (This is why
+ // this member function isn't this-const.)
+ Binding *final_base;
+ uint64_t final_addend;
+ base_->Get(&final_base, &final_addend);
+ if (final_base) final_base->Acquire();
+ if (base_->Release()) delete base_;
+ base_ = final_base;
+ addend_ += final_addend;
+ }
+ *base = base_;
+ *addend = addend_;
+}
+
+template<typename Inserter>
+static inline void InsertEndian(test_assembler::Endianness endianness,
+ size_t size, uint64_t number, Inserter dest) {
+ assert(size > 0);
+ if (endianness == kLittleEndian) {
+ for (size_t i = 0; i < size; i++) {
+ *dest++ = (char) (number & 0xff);
+ number >>= 8;
+ }
+ } else {
+ assert(endianness == kBigEndian);
+ // The loop condition is odd, but it's correct for size_t.
+ for (size_t i = size - 1; i < size; i--)
+ *dest++ = (char) ((number >> (i * 8)) & 0xff);
+ }
+}
+
+Section &Section::Append(Endianness endianness, size_t size, uint64_t number) {
+ InsertEndian(endianness, size, number,
+ back_insert_iterator<string>(contents_));
+ return *this;
+}
+
+Section &Section::Append(Endianness endianness, size_t size,
+ const Label &label) {
+ // If this label's value is known, there's no reason to waste an
+ // entry in references_ on it.
+ uint64_t value;
+ if (label.IsKnownConstant(&value))
+ return Append(endianness, size, value);
+
+ // This will get caught when the references are resolved, but it's
+ // nicer to find out earlier.
+ assert(endianness != kUnsetEndian);
+
+ references_.push_back(Reference(contents_.size(), endianness, size, label));
+ contents_.append(size, 0);
+ return *this;
+}
+
+#define ENDIANNESS_L kLittleEndian
+#define ENDIANNESS_B kBigEndian
+#define ENDIANNESS(e) ENDIANNESS_ ## e
+
+#define DEFINE_SHORT_APPEND_NUMBER_ENDIAN(e, bits) \
+ Section &Section::e ## bits(uint ## bits ## _t v) { \
+ InsertEndian(ENDIANNESS(e), bits / 8, v, \
+ back_insert_iterator<string>(contents_)); \
+ return *this; \
+ }
+
+#define DEFINE_SHORT_APPEND_LABEL_ENDIAN(e, bits) \
+ Section &Section::e ## bits(const Label &v) { \
+ return Append(ENDIANNESS(e), bits / 8, v); \
+ }
+
+// Define L16, B32, and friends.
+#define DEFINE_SHORT_APPEND_ENDIAN(e, bits) \
+ DEFINE_SHORT_APPEND_NUMBER_ENDIAN(e, bits) \
+ DEFINE_SHORT_APPEND_LABEL_ENDIAN(e, bits)
+
+DEFINE_SHORT_APPEND_LABEL_ENDIAN(L, 8);
+DEFINE_SHORT_APPEND_LABEL_ENDIAN(B, 8);
+DEFINE_SHORT_APPEND_ENDIAN(L, 16);
+DEFINE_SHORT_APPEND_ENDIAN(L, 32);
+DEFINE_SHORT_APPEND_ENDIAN(L, 64);
+DEFINE_SHORT_APPEND_ENDIAN(B, 16);
+DEFINE_SHORT_APPEND_ENDIAN(B, 32);
+DEFINE_SHORT_APPEND_ENDIAN(B, 64);
+
+#define DEFINE_SHORT_APPEND_NUMBER_DEFAULT(bits) \
+ Section &Section::D ## bits(uint ## bits ## _t v) { \
+ InsertEndian(endianness_, bits / 8, v, \
+ back_insert_iterator<string>(contents_)); \
+ return *this; \
+ }
+#define DEFINE_SHORT_APPEND_LABEL_DEFAULT(bits) \
+ Section &Section::D ## bits(const Label &v) { \
+ return Append(endianness_, bits / 8, v); \
+ }
+#define DEFINE_SHORT_APPEND_DEFAULT(bits) \
+ DEFINE_SHORT_APPEND_NUMBER_DEFAULT(bits) \
+ DEFINE_SHORT_APPEND_LABEL_DEFAULT(bits)
+
+DEFINE_SHORT_APPEND_LABEL_DEFAULT(8)
+DEFINE_SHORT_APPEND_DEFAULT(16);
+DEFINE_SHORT_APPEND_DEFAULT(32);
+DEFINE_SHORT_APPEND_DEFAULT(64);
+
+Section &Section::Append(const Section &section) {
+ size_t base = contents_.size();
+ contents_.append(section.contents_);
+ for (vector<Reference>::const_iterator it = section.references_.begin();
+ it != section.references_.end(); it++)
+ references_.push_back(Reference(base + it->offset, it->endianness,
+ it->size, it->label));
+ return *this;
+}
+
+Section &Section::LEB128(long long value) {
+ while (value < -0x40 || 0x3f < value) {
+ contents_ += (value & 0x7f) | 0x80;
+ if (value < 0)
+ value = (value >> 7) | ~(((unsigned long long) -1) >> 7);
+ else
+ value = (value >> 7);
+ }
+ contents_ += value & 0x7f;
+ return *this;
+}
+
+Section &Section::ULEB128(uint64_t value) {
+ while (value > 0x7f) {
+ contents_ += (value & 0x7f) | 0x80;
+ value = (value >> 7);
+ }
+ contents_ += value;
+ return *this;
+}
+
+Section &Section::Align(size_t alignment, uint8_t pad_byte) {
+ // ALIGNMENT must be a power of two.
+ assert(((alignment - 1) & alignment) == 0);
+ size_t new_size = (contents_.size() + alignment - 1) & ~(alignment - 1);
+ contents_.append(new_size - contents_.size(), pad_byte);
+ assert((contents_.size() & (alignment - 1)) == 0);
+ return *this;
+}
+
+void Section::Clear() {
+ contents_.clear();
+ references_.clear();
+}
+
+bool Section::GetContents(string *contents) {
+ // For each label reference, find the label's value, and patch it into
+ // the section's contents.
+ for (size_t i = 0; i < references_.size(); i++) {
+ Reference &r = references_[i];
+ uint64_t value;
+ if (!r.label.IsKnownConstant(&value)) {
+ fprintf(stderr, "Undefined label #%zu at offset 0x%zx\n", i, r.offset);
+ return false;
+ }
+ assert(r.offset < contents_.size());
+ assert(contents_.size() - r.offset >= r.size);
+ InsertEndian(r.endianness, r.size, value, contents_.begin() + r.offset);
+ }
+ contents->clear();
+ std::swap(contents_, *contents);
+ references_.clear();
+ return true;
+}
+
+} // namespace test_assembler
+} // namespace google_breakpad
diff --git a/3rdParty/Breakpad/src/common/test_assembler.h b/3rdParty/Breakpad/src/common/test_assembler.h
new file mode 100644
index 0000000..373dbeb
--- /dev/null
+++ b/3rdParty/Breakpad/src/common/test_assembler.h
@@ -0,0 +1,484 @@
+// -*- mode: C++ -*-
+
+// Copyright (c) 2010, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// Original author: Jim Blandy <jimb@mozilla.com> <jimb@red-bean.com>
+
+// test-assembler.h: interface to class for building complex binary streams.
+
+// To test the Breakpad symbol dumper and processor thoroughly, for
+// all combinations of host system and minidump processor
+// architecture, we need to be able to easily generate complex test
+// data like debugging information and minidump files.
+//
+// For example, if we want our unit tests to provide full code
+// coverage for stack walking, it may be difficult to persuade the
+// compiler to generate every possible sort of stack walking
+// information that we want to support; there are probably DWARF CFI
+// opcodes that GCC never emits. Similarly, if we want to test our
+// error handling, we will need to generate damaged minidumps or
+// debugging information that (we hope) the client or compiler will
+// never produce on its own.
+//
+// google_breakpad::TestAssembler provides a predictable and
+// (relatively) simple way to generate complex formatted data streams
+// like minidumps and CFI. Furthermore, because TestAssembler is
+// portable, developers without access to (say) Visual Studio or a
+// SPARC assembler can still work on test data for those targets.
+
+#ifndef PROCESSOR_TEST_ASSEMBLER_H_
+#define PROCESSOR_TEST_ASSEMBLER_H_
+
+#include <list>
+#include <vector>
+#include <string>
+
+#include "common/using_std_string.h"
+#include "google_breakpad/common/breakpad_types.h"
+
+namespace google_breakpad {
+
+using std::list;
+using std::vector;
+
+namespace test_assembler {
+
+// A Label represents a value not yet known that we need to store in a
+// section. As long as all the labels a section refers to are defined
+// by the time we retrieve its contents as bytes, we can use undefined
+// labels freely in that section's construction.
+//
+// A label can be in one of three states:
+// - undefined,
+// - defined as the sum of some other label and a constant, or
+// - a constant.
+//
+// A label's value never changes, but it can accumulate constraints.
+// Adding labels and integers is permitted, and yields a label.
+// Subtracting a constant from a label is permitted, and also yields a
+// label. Subtracting two labels that have some relationship to each
+// other is permitted, and yields a constant.
+//
+// For example:
+//
+// Label a; // a's value is undefined
+// Label b; // b's value is undefined
+// {
+// Label c = a + 4; // okay, even though a's value is unknown
+// b = c + 4; // also okay; b is now a+8
+// }
+// Label d = b - 2; // okay; d == a+6, even though c is gone
+// d.Value(); // error: d's value is not yet known
+// d - a; // is 6, even though their values are not known
+// a = 12; // now b == 20, and d == 18
+// d.Value(); // 18: no longer an error
+// b.Value(); // 20
+// d = 10; // error: d is already defined.
+//
+// Label objects' lifetimes are unconstrained: notice that, in the
+// above example, even though a and b are only related through c, and
+// c goes out of scope, the assignment to a sets b's value as well. In
+// particular, it's not necessary to ensure that a Label lives beyond
+// Sections that refer to it.
+class Label {
+ public:
+ Label(); // An undefined label.
+ Label(uint64_t value); // A label with a fixed value
+ Label(const Label &value); // A label equal to another.
+ ~Label();
+
+ // Return this label's value; it must be known.
+ //
+ // Providing this as a cast operator is nifty, but the conversions
+ // happen in unexpected places. In particular, ISO C++ says that
+ // Label + size_t becomes ambigious, because it can't decide whether
+ // to convert the Label to a uint64_t and then to a size_t, or use
+ // the overloaded operator that returns a new label, even though the
+ // former could fail if the label is not yet defined and the latter won't.
+ uint64_t Value() const;
+
+ Label &operator=(uint64_t value);
+ Label &operator=(const Label &value);
+ Label operator+(uint64_t addend) const;
+ Label operator-(uint64_t subtrahend) const;
+ uint64_t operator-(const Label &subtrahend) const;
+
+ // We could also provide == and != that work on undefined, but
+ // related, labels.
+
+ // Return true if this label's value is known. If VALUE_P is given,
+ // set *VALUE_P to the known value if returning true.
+ bool IsKnownConstant(uint64_t *value_p = NULL) const;
+
+ // Return true if the offset from LABEL to this label is known. If
+ // OFFSET_P is given, set *OFFSET_P to the offset when returning true.
+ //
+ // You can think of l.KnownOffsetFrom(m, &d) as being like 'd = l-m',
+ // except that it also returns a value indicating whether the
+ // subtraction is possible given what we currently know of l and m.
+ // It can be possible even if we don't know l and m's values. For
+ // example:
+ //
+ // Label l, m;
+ // m = l + 10;
+ // l.IsKnownConstant(); // false
+ // m.IsKnownConstant(); // false
+ // uint64_t d;
+ // l.IsKnownOffsetFrom(m, &d); // true, and sets d to -10.
+ // l-m // -10
+ // m-l // 10
+ // m.Value() // error: m's value is not known
+ bool IsKnownOffsetFrom(const Label &label, uint64_t *offset_p = NULL) const;
+
+ private:
+ // A label's value, or if that is not yet known, how the value is
+ // related to other labels' values. A binding may be:
+ // - a known constant,
+ // - constrained to be equal to some other binding plus a constant, or
+ // - unconstrained, and free to take on any value.
+ //
+ // Many labels may point to a single binding, and each binding may
+ // refer to another, so bindings and labels form trees whose leaves
+ // are labels, whose interior nodes (and roots) are bindings, and
+ // where links point from children to parents. Bindings are
+ // reference counted, allowing labels to be lightweight, copyable,
+ // assignable, placed in containers, and so on.
+ class Binding {
+ public:
+ Binding();
+ Binding(uint64_t addend);
+ ~Binding();
+
+ // Increment our reference count.
+ void Acquire() { reference_count_++; };
+ // Decrement our reference count, and return true if it is zero.
+ bool Release() { return --reference_count_ == 0; }
+
+ // Set this binding to be equal to BINDING + ADDEND. If BINDING is
+ // NULL, then set this binding to the known constant ADDEND.
+ // Update every binding on this binding's chain to point directly
+ // to BINDING, or to be a constant, with addends adjusted
+ // appropriately.
+ void Set(Binding *binding, uint64_t value);
+
+ // Return what we know about the value of this binding.
+ // - If this binding's value is a known constant, set BASE to
+ // NULL, and set ADDEND to its value.
+ // - If this binding is not a known constant but related to other
+ // bindings, set BASE to the binding at the end of the relation
+ // chain (which will always be unconstrained), and set ADDEND to the
+ // value to add to that binding's value to get this binding's
+ // value.
+ // - If this binding is unconstrained, set BASE to this, and leave
+ // ADDEND unchanged.
+ void Get(Binding **base, uint64_t *addend);
+
+ private:
+ // There are three cases:
+ //
+ // - A binding representing a known constant value has base_ NULL,
+ // and addend_ equal to the value.
+ //
+ // - A binding representing a completely unconstrained value has
+ // base_ pointing to this; addend_ is unused.
+ //
+ // - A binding whose value is related to some other binding's
+ // value has base_ pointing to that other binding, and addend_
+ // set to the amount to add to that binding's value to get this
+ // binding's value. We only represent relationships of the form
+ // x = y+c.
+ //
+ // Thus, the bind_ links form a chain terminating in either a
+ // known constant value or a completely unconstrained value. Most
+ // operations on bindings do path compression: they change every
+ // binding on the chain to point directly to the final value,
+ // adjusting addends as appropriate.
+ Binding *base_;
+ uint64_t addend_;
+
+ // The number of Labels and Bindings pointing to this binding.
+ // (When a binding points to itself, indicating a completely
+ // unconstrained binding, that doesn't count as a reference.)
+ int reference_count_;
+ };
+
+ // This label's value.
+ Binding *value_;
+};
+
+inline Label operator+(uint64_t a, const Label &l) { return l + a; }
+// Note that int-Label isn't defined, as negating a Label is not an
+// operation we support.
+
+// Conventions for representing larger numbers as sequences of bytes.
+enum Endianness {
+ kBigEndian, // Big-endian: the most significant byte comes first.
+ kLittleEndian, // Little-endian: the least significant byte comes first.
+ kUnsetEndian, // used internally
+};
+
+// A section is a sequence of bytes, constructed by appending bytes
+// to the end. Sections have a convenient and flexible set of member
+// functions for appending data in various formats: big-endian and
+// little-endian signed and unsigned values of different sizes;
+// LEB128 and ULEB128 values (see below), and raw blocks of bytes.
+//
+// If you need to append a value to a section that is not convenient
+// to compute immediately, you can create a label, append the
+// label's value to the section, and then set the label's value
+// later, when it's convenient to do so. Once a label's value is
+// known, the section class takes care of updating all previously
+// appended references to it.
+//
+// Once all the labels to which a section refers have had their
+// values determined, you can get a copy of the section's contents
+// as a string.
+//
+// Note that there is no specified "start of section" label. This is
+// because there are typically several different meanings for "the
+// start of a section": the offset of the section within an object
+// file, the address in memory at which the section's content appear,
+// and so on. It's up to the code that uses the Section class to
+// keep track of these explicitly, as they depend on the application.
+class Section {
+ public:
+ Section(Endianness endianness = kUnsetEndian)
+ : endianness_(endianness) { };
+
+ // A base class destructor should be either public and virtual,
+ // or protected and nonvirtual.
+ virtual ~Section() { };
+
+ // Set the default endianness of this section to ENDIANNESS. This
+ // sets the behavior of the D<N> appending functions. If the
+ // assembler's default endianness was set, this is the
+ void set_endianness(Endianness endianness) {
+ endianness_ = endianness;
+ }
+
+ // Return the default endianness of this section.
+ Endianness endianness() const { return endianness_; }
+
+ // Append the SIZE bytes at DATA or the contents of STRING to the
+ // end of this section. Return a reference to this section.
+ Section &Append(const uint8_t *data, size_t size) {
+ contents_.append(reinterpret_cast<const char *>(data), size);
+ return *this;
+ };
+ Section &Append(const string &data) {
+ contents_.append(data);
+ return *this;
+ };
+
+ // Append SIZE copies of BYTE to the end of this section. Return a
+ // reference to this section.
+ Section &Append(size_t size, uint8_t byte) {
+ contents_.append(size, (char) byte);
+ return *this;
+ }
+
+ // Append NUMBER to this section. ENDIANNESS is the endianness to
+ // use to write the number. SIZE is the length of the number in
+ // bytes. Return a reference to this section.
+ Section &Append(Endianness endianness, size_t size, uint64_t number);
+ Section &Append(Endianness endianness, size_t size, const Label &label);
+
+ // Append SECTION to the end of this section. The labels SECTION
+ // refers to need not be defined yet.
+ //
+ // Note that this has no effect on any Labels' values, or on
+ // SECTION. If placing SECTION within 'this' provides new
+ // constraints on existing labels' values, then it's up to the
+ // caller to fiddle with those labels as needed.
+ Section &Append(const Section &section);
+
+ // Append the contents of DATA as a series of bytes terminated by
+ // a NULL character.
+ Section &AppendCString(const string &data) {
+ Append(data);
+ contents_ += '\0';
+ return *this;
+ }
+
+ // Append at most SIZE bytes from DATA; if DATA is less than SIZE bytes
+ // long, pad with '\0' characters.
+ Section &AppendCString(const string &data, size_t size) {
+ contents_.append(data, 0, size);
+ if (data.size() < size)
+ Append(size - data.size(), 0);
+ return *this;
+ }
+
+ // Append VALUE or LABEL to this section, with the given bit width and
+ // endianness. Return a reference to this section.
+ //
+ // The names of these functions have the form <ENDIANNESS><BITWIDTH>:
+ // <ENDIANNESS> is either 'L' (little-endian, least significant byte first),
+ // 'B' (big-endian, most significant byte first), or
+ // 'D' (default, the section's default endianness)
+ // <BITWIDTH> is 8, 16, 32, or 64.
+ //
+ // Since endianness doesn't matter for a single byte, all the
+ // <BITWIDTH>=8 functions are equivalent.
+ //
+ // These can be used to write both signed and unsigned values, as
+ // the compiler will properly sign-extend a signed value before
+ // passing it to the function, at which point the function's
+ // behavior is the same either way.
+ Section &L8(uint8_t value) { contents_ += value; return *this; }
+ Section &B8(uint8_t value) { contents_ += value; return *this; }
+ Section &D8(uint8_t value) { contents_ += value; return *this; }
+ Section &L16(uint16_t), &L32(uint32_t), &L64(uint64_t),
+ &B16(uint16_t), &B32(uint32_t), &B64(uint64_t),
+ &D16(uint16_t), &D32(uint32_t), &D64(uint64_t);
+ Section &L8(const Label &label), &L16(const Label &label),
+ &L32(const Label &label), &L64(const Label &label),
+ &B8(const Label &label), &B16(const Label &label),
+ &B32(const Label &label), &B64(const Label &label),
+ &D8(const Label &label), &D16(const Label &label),
+ &D32(const Label &label), &D64(const Label &label);
+
+ // Append VALUE in a signed LEB128 (Little-Endian Base 128) form.
+ //
+ // The signed LEB128 representation of an integer N is a variable
+ // number of bytes:
+ //
+ // - If N is between -0x40 and 0x3f, then its signed LEB128
+ // representation is a single byte whose value is N.
+ //
+ // - Otherwise, its signed LEB128 representation is (N & 0x7f) |
+ // 0x80, followed by the signed LEB128 representation of N / 128,
+ // rounded towards negative infinity.
+ //
+ // In other words, we break VALUE into groups of seven bits, put
+ // them in little-endian order, and then write them as eight-bit
+ // bytes with the high bit on all but the last.
+ //
+ // Note that VALUE cannot be a Label (we would have to implement
+ // relaxation).
+ Section &LEB128(long long value);
+
+ // Append VALUE in unsigned LEB128 (Little-Endian Base 128) form.
+ //
+ // The unsigned LEB128 representation of an integer N is a variable
+ // number of bytes:
+ //
+ // - If N is between 0 and 0x7f, then its unsigned LEB128
+ // representation is a single byte whose value is N.
+ //
+ // - Otherwise, its unsigned LEB128 representation is (N & 0x7f) |
+ // 0x80, followed by the unsigned LEB128 representation of N /
+ // 128, rounded towards negative infinity.
+ //
+ // Note that VALUE cannot be a Label (we would have to implement
+ // relaxation).
+ Section &ULEB128(uint64_t value);
+
+ // Jump to the next location aligned on an ALIGNMENT-byte boundary,
+ // relative to the start of the section. Fill the gap with PAD_BYTE.
+ // ALIGNMENT must be a power of two. Return a reference to this
+ // section.
+ Section &Align(size_t alignment, uint8_t pad_byte = 0);
+
+ // Clear the contents of this section.
+ void Clear();
+
+ // Return the current size of the section.
+ size_t Size() const { return contents_.size(); }
+
+ // Return a label representing the start of the section.
+ //
+ // It is up to the user whether this label represents the section's
+ // position in an object file, the section's address in memory, or
+ // what have you; some applications may need both, in which case
+ // this simple-minded interface won't be enough. This class only
+ // provides a single start label, for use with the Here and Mark
+ // member functions.
+ //
+ // Ideally, we'd provide this in a subclass that actually knows more
+ // about the application at hand and can provide an appropriate
+ // collection of start labels. But then the appending member
+ // functions like Append and D32 would return a reference to the
+ // base class, not the derived class, and the chaining won't work.
+ // Since the only value here is in pretty notation, that's a fatal
+ // flaw.
+ Label start() const { return start_; }
+
+ // Return a label representing the point at which the next Appended
+ // item will appear in the section, relative to start().
+ Label Here() const { return start_ + Size(); }
+
+ // Set *LABEL to Here, and return a reference to this section.
+ Section &Mark(Label *label) { *label = Here(); return *this; }
+
+ // If there are no undefined label references left in this
+ // section, set CONTENTS to the contents of this section, as a
+ // string, and clear this section. Return true on success, or false
+ // if there were still undefined labels.
+ bool GetContents(string *contents);
+
+ private:
+ // Used internally. A reference to a label's value.
+ struct Reference {
+ Reference(size_t set_offset, Endianness set_endianness, size_t set_size,
+ const Label &set_label)
+ : offset(set_offset), endianness(set_endianness), size(set_size),
+ label(set_label) { }
+
+ // The offset of the reference within the section.
+ size_t offset;
+
+ // The endianness of the reference.
+ Endianness endianness;
+
+ // The size of the reference.
+ size_t size;
+
+ // The label to which this is a reference.
+ Label label;
+ };
+
+ // The default endianness of this section.
+ Endianness endianness_;
+
+ // The contents of the section.
+ string contents_;
+
+ // References to labels within those contents.
+ vector<Reference> references_;
+
+ // A label referring to the beginning of the section.
+ Label start_;
+};
+
+} // namespace test_assembler
+} // namespace google_breakpad
+
+#endif // PROCESSOR_TEST_ASSEMBLER_H_
diff --git a/3rdParty/Breakpad/src/common/test_assembler_unittest.cc b/3rdParty/Breakpad/src/common/test_assembler_unittest.cc
new file mode 100644
index 0000000..94b5a5c
--- /dev/null
+++ b/3rdParty/Breakpad/src/common/test_assembler_unittest.cc
@@ -0,0 +1,1662 @@
+// Copyright (c) 2010, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// Original author: Jim Blandy <jimb@mozilla.com> <jimb@red-bean.com>
+
+// test_assembler_unittest.cc: Unit tests for google_breakpad::TestAssembler.
+
+#include <string>
+#include <string.h>
+
+#include "breakpad_googletest_includes.h"
+#include "common/test_assembler.h"
+#include "common/using_std_string.h"
+
+using google_breakpad::test_assembler::Label;
+using google_breakpad::test_assembler::Section;
+using google_breakpad::test_assembler::kBigEndian;
+using google_breakpad::test_assembler::kLittleEndian;
+using testing::Test;
+
+TEST(ConstructLabel, Simple) {
+ Label l;
+}
+
+TEST(ConstructLabel, Undefined) {
+ Label l;
+ EXPECT_FALSE(l.IsKnownConstant());
+}
+
+TEST(ConstructLabelDeathTest, Undefined) {
+ Label l;
+ ASSERT_DEATH(l.Value(), "IsKnownConstant\\(&v\\)");
+}
+
+TEST(ConstructLabel, Constant) {
+ Label l(0x060b9f974eaf301eULL);
+ uint64_t v;
+ EXPECT_TRUE(l.IsKnownConstant(&v));
+ EXPECT_EQ(v, 0x060b9f974eaf301eULL);
+ EXPECT_EQ(l.Value(), 0x060b9f974eaf301eULL);
+}
+
+TEST(ConstructLabel, Copy) {
+ Label l;
+ Label m(l);
+ uint64_t v;
+ EXPECT_TRUE(l.IsKnownOffsetFrom(m, &v));
+ EXPECT_EQ(0U, v);
+}
+
+// The left-hand-side of a label assignment can be either
+// unconstrained, related, or known. The right-hand-side can be any of
+// those, or an integer.
+TEST(Assignment, UnconstrainedToUnconstrained) {
+ Label l, m;
+ l = m;
+ EXPECT_EQ(0U, l-m);
+ EXPECT_TRUE(l.IsKnownOffsetFrom(m));
+ uint64_t d;
+ EXPECT_TRUE(l.IsKnownOffsetFrom(m, &d));
+ EXPECT_EQ(0U, d);
+ EXPECT_FALSE(l.IsKnownConstant());
+}
+
+TEST(Assignment, UnconstrainedToRelated) {
+ Label l, m, n;
+ l = n;
+ l = m;
+ EXPECT_EQ(0U, l-m);
+ EXPECT_TRUE(l.IsKnownOffsetFrom(m));
+ uint64_t d;
+ EXPECT_TRUE(l.IsKnownOffsetFrom(m, &d));
+ EXPECT_EQ(0U, d);
+ EXPECT_FALSE(l.IsKnownConstant());
+}
+
+TEST(Assignment, UnconstrainedToKnown) {
+ Label l, m;
+ l = 0x8fd16e55b20a39c1ULL;
+ l = m;
+ EXPECT_EQ(0U, l-m);
+ EXPECT_TRUE(l.IsKnownOffsetFrom(m));
+ uint64_t d;
+ EXPECT_TRUE(l.IsKnownOffsetFrom(m, &d));
+ EXPECT_EQ(0U, d);
+ EXPECT_TRUE(m.IsKnownConstant());
+ EXPECT_EQ(0x8fd16e55b20a39c1ULL, m.Value());
+}
+
+TEST(Assignment, RelatedToUnconstrained) {
+ Label l, m, n;
+ m = n;
+ l = m;
+ EXPECT_EQ(0U, l-n);
+ EXPECT_TRUE(l.IsKnownOffsetFrom(n));
+ uint64_t d;
+ EXPECT_TRUE(l.IsKnownOffsetFrom(n, &d));
+ EXPECT_EQ(0U, d);
+ EXPECT_FALSE(l.IsKnownConstant());
+}
+
+TEST(Assignment, RelatedToRelated) {
+ Label l, m, n, o;
+ l = n;
+ m = o;
+ l = m;
+ EXPECT_EQ(0U, n-o);
+ EXPECT_TRUE(n.IsKnownOffsetFrom(o));
+ uint64_t d;
+ EXPECT_TRUE(n.IsKnownOffsetFrom(o, &d));
+ EXPECT_EQ(0U, d);
+ EXPECT_FALSE(l.IsKnownConstant());
+}
+
+TEST(Assignment, RelatedToKnown) {
+ Label l, m, n;
+ m = n;
+ l = 0xd2011f8c82ad56f2ULL;
+ l = m;
+ EXPECT_TRUE(l.IsKnownConstant());
+ EXPECT_EQ(0xd2011f8c82ad56f2ULL, l.Value());
+ EXPECT_TRUE(m.IsKnownConstant());
+ EXPECT_EQ(0xd2011f8c82ad56f2ULL, m.Value());
+ EXPECT_TRUE(n.IsKnownConstant());
+ EXPECT_EQ(0xd2011f8c82ad56f2ULL, n.Value());
+}
+
+TEST(Assignment, KnownToUnconstrained) {
+ Label l, m;
+ m = 0x50b024c0d6073887ULL;
+ l = m;
+ EXPECT_TRUE(l.IsKnownConstant());
+ EXPECT_EQ(0x50b024c0d6073887ULL, l.Value());
+ EXPECT_TRUE(m.IsKnownConstant());
+ EXPECT_EQ(0x50b024c0d6073887ULL, m.Value());
+}
+
+TEST(Assignment, KnownToRelated) {
+ Label l, m, n;
+ l = n;
+ m = 0x5348883655c727e5ULL;
+ l = m;
+ EXPECT_TRUE(l.IsKnownConstant());
+ EXPECT_EQ(0x5348883655c727e5ULL, l.Value());
+ EXPECT_TRUE(m.IsKnownConstant());
+ EXPECT_EQ(0x5348883655c727e5ULL, m.Value());
+ EXPECT_TRUE(n.IsKnownConstant());
+ EXPECT_EQ(0x5348883655c727e5ULL, n.Value());
+}
+
+TEST(Assignment, KnownToKnown) {
+ Label l, m;
+ l = 0x36c209c20987564eULL;
+ m = 0x36c209c20987564eULL;
+ l = m;
+ EXPECT_TRUE(l.IsKnownConstant());
+ EXPECT_EQ(0x36c209c20987564eULL, l.Value());
+ EXPECT_TRUE(m.IsKnownConstant());
+ EXPECT_EQ(0x36c209c20987564eULL, m.Value());
+}
+
+TEST(Assignment, ConstantToUnconstrained) {
+ Label l;
+ l = 0xc02495f4d7f5a957ULL;
+ EXPECT_TRUE(l.IsKnownConstant());
+ EXPECT_EQ(0xc02495f4d7f5a957ULL, l.Value());
+}
+
+TEST(Assignment, ConstantToRelated) {
+ Label l, m;
+ l = m;
+ l = 0x4577901cf275488dULL;
+ EXPECT_TRUE(l.IsKnownConstant());
+ EXPECT_EQ(0x4577901cf275488dULL, l.Value());
+ EXPECT_TRUE(m.IsKnownConstant());
+ EXPECT_EQ(0x4577901cf275488dULL, m.Value());
+}
+
+TEST(Assignment, ConstantToKnown) {
+ Label l;
+ l = 0xec0b9c369b7e8ea7ULL;
+ l = 0xec0b9c369b7e8ea7ULL;
+ EXPECT_TRUE(l.IsKnownConstant());
+ EXPECT_EQ(0xec0b9c369b7e8ea7ULL, l.Value());
+}
+
+TEST(AssignmentDeathTest, Self) {
+ Label l;
+ ASSERT_DEATH(l = l, "binding != this");
+}
+
+TEST(AssignmentDeathTest, IndirectCycle) {
+ Label l, m, n;
+ l = m;
+ m = n;
+ ASSERT_DEATH(n = l, "binding != this");
+}
+
+TEST(AssignmentDeathTest, Cycle) {
+ Label l, m, n, o;
+ l = m;
+ m = n;
+ o = n;
+ ASSERT_DEATH(o = l, "binding != this");
+}
+
+TEST(Addition, LabelConstant) {
+ Label l, m;
+ m = l + 0x5248d93e8bbe9497ULL;
+ EXPECT_TRUE(m.IsKnownOffsetFrom(l));
+ uint64_t d;
+ EXPECT_TRUE(m.IsKnownOffsetFrom(l, &d));
+ EXPECT_EQ(0x5248d93e8bbe9497ULL, d);
+ EXPECT_FALSE(m.IsKnownConstant());
+}
+
+TEST(Addition, ConstantLabel) {
+ Label l, m;
+ m = 0xf51e94e00d6e3c84ULL + l;
+ EXPECT_TRUE(m.IsKnownOffsetFrom(l));
+ uint64_t d;
+ EXPECT_TRUE(m.IsKnownOffsetFrom(l, &d));
+ EXPECT_EQ(0xf51e94e00d6e3c84ULL, d);
+ EXPECT_FALSE(m.IsKnownConstant());
+}
+
+TEST(Addition, KnownLabelConstant) {
+ Label l, m;
+ l = 0x16286307042ce0d8ULL;
+ m = l + 0x3fdddd91306719d7ULL;
+ EXPECT_TRUE(m.IsKnownOffsetFrom(l));
+ uint64_t d;
+ EXPECT_TRUE(m.IsKnownOffsetFrom(l, &d));
+ EXPECT_EQ(0x3fdddd91306719d7ULL, d);
+ EXPECT_TRUE(m.IsKnownConstant());
+ EXPECT_EQ(0x16286307042ce0d8ULL + 0x3fdddd91306719d7ULL, m.Value());
+}
+
+TEST(Addition, ConstantKnownLabel) {
+ Label l, m;
+ l = 0x50f62d0cdd1031deULL;
+ m = 0x1b13462d8577c538ULL + l;
+ EXPECT_TRUE(m.IsKnownOffsetFrom(l));
+ uint64_t d;
+ EXPECT_TRUE(m.IsKnownOffsetFrom(l, &d));
+ EXPECT_EQ(0x1b13462d8577c538ULL, d);
+ EXPECT_TRUE(m.IsKnownConstant());
+ EXPECT_EQ(0x50f62d0cdd1031deULL + 0x1b13462d8577c538ULL, m.Value());
+}
+
+TEST(Subtraction, LabelConstant) {
+ Label l, m;
+ m = l - 0x0620884d21d3138eULL;
+ EXPECT_TRUE(m.IsKnownOffsetFrom(l));
+ uint64_t d;
+ EXPECT_TRUE(m.IsKnownOffsetFrom(l, &d));
+ EXPECT_EQ(-0x0620884d21d3138eULL, d);
+ EXPECT_FALSE(m.IsKnownConstant());
+}
+
+TEST(Subtraction, KnownLabelConstant) {
+ Label l, m;
+ l = 0x6237fbaf9ef7929eULL;
+ m = l - 0x317730995d2ab6eeULL;
+ EXPECT_TRUE(m.IsKnownOffsetFrom(l));
+ uint64_t d;
+ EXPECT_TRUE(m.IsKnownOffsetFrom(l, &d));
+ EXPECT_EQ(-0x317730995d2ab6eeULL, d);
+ EXPECT_TRUE(m.IsKnownConstant());
+ EXPECT_EQ(0x6237fbaf9ef7929eULL - 0x317730995d2ab6eeULL, m.Value());
+}
+
+TEST(SubtractionDeathTest, LabelLabel) {
+ Label l, m;
+ ASSERT_DEATH(l - m, "IsKnownOffsetFrom\\(label, &offset\\)");
+}
+
+TEST(Subtraction, LabelLabel) {
+ Label l, m;
+ l = m + 0x7fa77ec63e28a17aULL;
+ EXPECT_EQ(0x7fa77ec63e28a17aULL, l - m);
+ EXPECT_EQ(-0x7fa77ec63e28a17aULL, m - l);
+}
+
+TEST(IsKnownConstant, Undefined) {
+ Label l;
+ EXPECT_FALSE(l.IsKnownConstant());
+}
+
+TEST(IsKnownConstant, RelatedLabel) {
+ Label l, m;
+ l = m;
+ EXPECT_FALSE(l.IsKnownConstant());
+ EXPECT_FALSE(m.IsKnownConstant());
+}
+
+TEST(IsKnownConstant, Constant) {
+ Label l;
+ l = 0xf374b1bdd6a22576ULL;
+ EXPECT_TRUE(l.IsKnownConstant());
+}
+
+TEST(IsKnownOffsetFrom, Unrelated) {
+ Label l, m;
+ EXPECT_FALSE(l.IsKnownOffsetFrom(m));
+}
+
+TEST(IsKnownOffsetFrom, Related) {
+ Label l, m;
+ l = m;
+ EXPECT_TRUE(l.IsKnownOffsetFrom(m));
+}
+
+// Test the construction of chains of related labels, and the
+// propagation of values through them.
+//
+// Although the relations between labels are supposed to behave
+// symmetrically --- that is, 'a = b' should put a and b in
+// indistinguishable states --- there's a distinction made internally
+// between the target (a) and the source (b).
+//
+// So there are five test axes to cover:
+//
+// - Do we construct the chain with assignment ("Assign") or with constructors
+// ("Construct")?
+//
+// - Do we set the value of the label at the start of the chain
+// ("Start") or the label at the end ("End")?
+//
+// - Are we testing the propagation of a relationship between variable
+// values ("Relation"), or the propagation of a known constant value
+// ("Value")?
+//
+// - Do we set the value before building the chain ("Before") or after
+// the chain has been built ("After")?
+//
+// - Do we add new relationships to the end of the existing chain
+// ("Forward") or to the beginning ("Backward")?
+//
+// Of course, "Construct" and "Backward" can't be combined, which
+// eliminates eight combinations, and "Construct", "End", and "Before"
+// can't be combined, which eliminates two more, so there are are 22
+// combinations, not 32.
+
+TEST(LabelChain, AssignStartRelationBeforeForward) {
+ Label a, b, c, d;
+ Label x;
+ a = x;
+ b = a + 0x1;
+ c = b + 0x10;
+ d = c + 0x100;
+ EXPECT_EQ(0x111U, d-x);
+ EXPECT_EQ(0x11U, c-x);
+ EXPECT_EQ(0x1U, b-x);
+ EXPECT_EQ(0U, a-x);
+}
+
+TEST(LabelChain, AssignStartRelationBeforeBackward) {
+ Label a, b, c, d;
+ Label x;
+ a = x;
+ d = c + 0x100;
+ c = b + 0x10;
+ b = a + 0x1;
+ EXPECT_EQ(0x111U, d-x);
+ EXPECT_EQ(0x11U, c-x);
+ EXPECT_EQ(0x1U, b-x);
+ EXPECT_EQ(0U, a-x);
+}
+
+TEST(LabelChain, AssignStartRelationAfterForward) {
+ Label a, b, c, d;
+ Label x;
+ b = a + 0x1;
+ c = b + 0x10;
+ d = c + 0x100;
+ a = x;
+ EXPECT_EQ(0x111U, d-x);
+ EXPECT_EQ(0x11U, c-x);
+ EXPECT_EQ(0x1U, b-x);
+ EXPECT_EQ(0U, a-x);
+}
+
+TEST(LabelChain, AssignStartRelationAfterBackward) {
+ Label a, b, c, d;
+ Label x;
+ d = c + 0x100;
+ c = b + 0x10;
+ b = a + 0x1;
+ a = x;
+ EXPECT_EQ(0x111U, d-x);
+ EXPECT_EQ(0x11U, c-x);
+ EXPECT_EQ(0x1U, b-x);
+ EXPECT_EQ(0U, a-x);
+}
+
+TEST(LabelChain, AssignStartValueBeforeForward) {
+ Label a, b, c, d;
+ a = 0xa131200190546ac2ULL;
+ b = a + 0x1;
+ c = b + 0x10;
+ d = c + 0x100;
+ EXPECT_EQ(0xa131200190546ac2ULL + 0x111U, d.Value());
+ EXPECT_EQ(0xa131200190546ac2ULL + 0x11U, c.Value());
+ EXPECT_EQ(0xa131200190546ac2ULL + 0x1U, b.Value());
+ EXPECT_EQ(0xa131200190546ac2ULL + 0U, a.Value());
+}
+
+TEST(LabelChain, AssignStartValueBeforeBackward) {
+ Label a, b, c, d;
+ a = 0x8da17e1670ad4fa2ULL;
+ d = c + 0x100;
+ c = b + 0x10;
+ b = a + 0x1;
+ EXPECT_EQ(0x8da17e1670ad4fa2ULL + 0x111U, d.Value());
+ EXPECT_EQ(0x8da17e1670ad4fa2ULL + 0x11U, c.Value());
+ EXPECT_EQ(0x8da17e1670ad4fa2ULL + 0x1U, b.Value());
+ EXPECT_EQ(0x8da17e1670ad4fa2ULL + 0U, a.Value());
+}
+
+TEST(LabelChain, AssignStartValueAfterForward) {
+ Label a, b, c, d;
+ b = a + 0x1;
+ c = b + 0x10;
+ d = c + 0x100;
+ a = 0x99b8f51bafd41adaULL;
+ EXPECT_EQ(0x99b8f51bafd41adaULL + 0x111U, d.Value());
+ EXPECT_EQ(0x99b8f51bafd41adaULL + 0x11U, c.Value());
+ EXPECT_EQ(0x99b8f51bafd41adaULL + 0x1U, b.Value());
+ EXPECT_EQ(0x99b8f51bafd41adaULL + 0U, a.Value());
+}
+
+TEST(LabelChain, AssignStartValueAfterBackward) {
+ Label a, b, c, d;
+ d = c + 0x100;
+ c = b + 0x10;
+ b = a + 0x1;
+ a = 0xc86ca1d97ab5df6eULL;
+ EXPECT_EQ(0xc86ca1d97ab5df6eULL + 0x111U, d.Value());
+ EXPECT_EQ(0xc86ca1d97ab5df6eULL + 0x11U, c.Value());
+ EXPECT_EQ(0xc86ca1d97ab5df6eULL + 0x1U, b.Value());
+ EXPECT_EQ(0xc86ca1d97ab5df6eULL + 0U, a.Value());
+}
+
+TEST(LabelChain, AssignEndRelationBeforeForward) {
+ Label a, b, c, d;
+ Label x;
+ x = d;
+ b = a + 0x1;
+ c = b + 0x10;
+ d = c + 0x100;
+ EXPECT_EQ(-(uint64_t)0x111U, a-x);
+ EXPECT_EQ(-(uint64_t)0x110U, b-x);
+ EXPECT_EQ(-(uint64_t)0x100U, c-x);
+ EXPECT_EQ(-(uint64_t)0U, d-x);
+}
+
+TEST(LabelChain, AssignEndRelationBeforeBackward) {
+ Label a, b, c, d;
+ Label x;
+ x = d;
+ d = c + 0x100;
+ c = b + 0x10;
+ b = a + 0x1;
+ EXPECT_EQ(-(uint64_t)0x111U, a-x);
+ EXPECT_EQ(-(uint64_t)0x110U, b-x);
+ EXPECT_EQ(-(uint64_t)0x100U, c-x);
+ EXPECT_EQ(-(uint64_t)0U, d-x);
+}
+
+TEST(LabelChain, AssignEndRelationAfterForward) {
+ Label a, b, c, d;
+ Label x;
+ b = a + 0x1;
+ c = b + 0x10;
+ d = c + 0x100;
+ x = d;
+ EXPECT_EQ(-(uint64_t)0x111U, a-x);
+ EXPECT_EQ(-(uint64_t)0x110U, b-x);
+ EXPECT_EQ(-(uint64_t)0x100U, c-x);
+ EXPECT_EQ(-(uint64_t)0x000U, d-x);
+}
+
+TEST(LabelChain, AssignEndRelationAfterBackward) {
+ Label a, b, c, d;
+ Label x;
+ d = c + 0x100;
+ c = b + 0x10;
+ b = a + 0x1;
+ x = d;
+ EXPECT_EQ(-(uint64_t)0x111U, a-x);
+ EXPECT_EQ(-(uint64_t)0x110U, b-x);
+ EXPECT_EQ(-(uint64_t)0x100U, c-x);
+ EXPECT_EQ(-(uint64_t)0x000U, d-x);
+}
+
+TEST(LabelChain, AssignEndValueBeforeForward) {
+ Label a, b, c, d;
+ d = 0xa131200190546ac2ULL;
+ b = a + 0x1;
+ c = b + 0x10;
+ d = c + 0x100;
+ EXPECT_EQ(0xa131200190546ac2ULL - 0x111, a.Value());
+ EXPECT_EQ(0xa131200190546ac2ULL - 0x110, b.Value());
+ EXPECT_EQ(0xa131200190546ac2ULL - 0x100, c.Value());
+ EXPECT_EQ(0xa131200190546ac2ULL - 0x000, d.Value());
+}
+
+TEST(LabelChain, AssignEndValueBeforeBackward) {
+ Label a, b, c, d;
+ d = 0x8da17e1670ad4fa2ULL;
+ d = c + 0x100;
+ c = b + 0x10;
+ b = a + 0x1;
+ EXPECT_EQ(0x8da17e1670ad4fa2ULL - 0x111, a.Value());
+ EXPECT_EQ(0x8da17e1670ad4fa2ULL - 0x110, b.Value());
+ EXPECT_EQ(0x8da17e1670ad4fa2ULL - 0x100, c.Value());
+ EXPECT_EQ(0x8da17e1670ad4fa2ULL - 0x000, d.Value());
+}
+
+TEST(LabelChain, AssignEndValueAfterForward) {
+ Label a, b, c, d;
+ b = a + 0x1;
+ c = b + 0x10;
+ d = c + 0x100;
+ d = 0x99b8f51bafd41adaULL;
+ EXPECT_EQ(0x99b8f51bafd41adaULL - 0x111, a.Value());
+ EXPECT_EQ(0x99b8f51bafd41adaULL - 0x110, b.Value());
+ EXPECT_EQ(0x99b8f51bafd41adaULL - 0x100, c.Value());
+ EXPECT_EQ(0x99b8f51bafd41adaULL - 0x000, d.Value());
+}
+
+TEST(LabelChain, AssignEndValueAfterBackward) {
+ Label a, b, c, d;
+ d = c + 0x100;
+ c = b + 0x10;
+ b = a + 0x1;
+ d = 0xc86ca1d97ab5df6eULL;
+ EXPECT_EQ(0xc86ca1d97ab5df6eULL - 0x111, a.Value());
+ EXPECT_EQ(0xc86ca1d97ab5df6eULL - 0x110, b.Value());
+ EXPECT_EQ(0xc86ca1d97ab5df6eULL - 0x100, c.Value());
+ EXPECT_EQ(0xc86ca1d97ab5df6eULL - 0x000, d.Value());
+}
+
+TEST(LabelChain, ConstructStartRelationBeforeForward) {
+ Label x;
+ Label a(x);
+ Label b(a + 0x1);
+ Label c(b + 0x10);
+ Label d(c + 0x100);
+ EXPECT_EQ(0x111U, d-x);
+ EXPECT_EQ(0x11U, c-x);
+ EXPECT_EQ(0x1U, b-x);
+ EXPECT_EQ(0U, a-x);
+}
+
+TEST(LabelChain, ConstructStartRelationAfterForward) {
+ Label x;
+ Label a;
+ Label b(a + 0x1);
+ Label c(b + 0x10);
+ Label d(c + 0x100);
+ a = x;
+ EXPECT_EQ(0x111U, d-x);
+ EXPECT_EQ(0x11U, c-x);
+ EXPECT_EQ(0x1U, b-x);
+ EXPECT_EQ(0U, a-x);
+}
+
+TEST(LabelChain, ConstructStartValueBeforeForward) {
+ Label a(0x5d234d177d01ccc8ULL);
+ Label b(a + 0x1);
+ Label c(b + 0x10);
+ Label d(c + 0x100);
+ EXPECT_EQ(0x5d234d177d01ccc8ULL + 0x111U, d.Value());
+ EXPECT_EQ(0x5d234d177d01ccc8ULL + 0x011U, c.Value());
+ EXPECT_EQ(0x5d234d177d01ccc8ULL + 0x001U, b.Value());
+ EXPECT_EQ(0x5d234d177d01ccc8ULL + 0x000U, a.Value());
+}
+
+TEST(LabelChain, ConstructStartValueAfterForward) {
+ Label a;
+ Label b(a + 0x1);
+ Label c(b + 0x10);
+ Label d(c + 0x100);
+ a = 0xded85d54586e84fcULL;
+ EXPECT_EQ(0xded85d54586e84fcULL + 0x111U, d.Value());
+ EXPECT_EQ(0xded85d54586e84fcULL + 0x011U, c.Value());
+ EXPECT_EQ(0xded85d54586e84fcULL + 0x001U, b.Value());
+ EXPECT_EQ(0xded85d54586e84fcULL + 0x000U, a.Value());
+}
+
+TEST(LabelChain, ConstructEndRelationAfterForward) {
+ Label x;
+ Label a;
+ Label b(a + 0x1);
+ Label c(b + 0x10);
+ Label d(c + 0x100);
+ x = d;
+ EXPECT_EQ(-(uint64_t)0x111U, a-x);
+ EXPECT_EQ(-(uint64_t)0x110U, b-x);
+ EXPECT_EQ(-(uint64_t)0x100U, c-x);
+ EXPECT_EQ(-(uint64_t)0x000U, d-x);
+}
+
+TEST(LabelChain, ConstructEndValueAfterForward) {
+ Label a;
+ Label b(a + 0x1);
+ Label c(b + 0x10);
+ Label d(c + 0x100);
+ d = 0x99b8f51bafd41adaULL;
+ EXPECT_EQ(0x99b8f51bafd41adaULL - 0x111, a.Value());
+ EXPECT_EQ(0x99b8f51bafd41adaULL - 0x110, b.Value());
+ EXPECT_EQ(0x99b8f51bafd41adaULL - 0x100, c.Value());
+ EXPECT_EQ(0x99b8f51bafd41adaULL - 0x000, d.Value());
+}
+
+TEST(LabelTree, KnownValue) {
+ Label l, m, n, o, p;
+ l = m;
+ m = n;
+ o = p;
+ p = n;
+ l = 0x536b5de3d468a1b5ULL;
+ EXPECT_EQ(0x536b5de3d468a1b5ULL, o.Value());
+}
+
+TEST(LabelTree, Related) {
+ Label l, m, n, o, p;
+ l = m - 1;
+ m = n - 10;
+ o = p + 100;
+ p = n + 1000;
+ EXPECT_EQ(1111U, o - l);
+}
+
+TEST(EquationDeathTest, EqualConstants) {
+ Label m = 0x0d3962f280f07d24ULL;
+ Label n = 0x0d3962f280f07d24ULL;
+ m = n; // no death expected
+}
+
+TEST(EquationDeathTest, EqualIndirectConstants) {
+ Label m = 0xa347f1e5238fe6a1ULL;
+ Label n;
+ Label o = n;
+ n = 0xa347f1e5238fe6a1ULL;
+ n = m; // no death expected
+}
+
+TEST(EquationDeathTest, ConstantClash) {
+ Label m = 0xd4cc0f4f630ec741ULL;
+ Label n = 0x934cd2d8254fc3eaULL;
+ ASSERT_DEATH(m = n, "addend_ == addend");
+}
+
+TEST(EquationDeathTest, IndirectConstantClash) {
+ Label m = 0xd4cc0f4f630ec741ULL;
+ Label n, o;
+ n = o;
+ o = 0xcfbe3b83ac49ce86ULL;
+ ASSERT_DEATH(m = n, "addend_ == addend");
+}
+
+// Assigning to a related label may free the next Binding on its
+// chain. This test always passes; it is interesting to memory
+// checkers and coverage analysis.
+TEST(LabelReferenceCount, AssignmentFree) {
+ Label l;
+ {
+ Label m;
+ l = m;
+ }
+ // This should free m's Binding.
+ l = 0xca8bae92f0376d4fULL;
+ ASSERT_EQ(0xca8bae92f0376d4fULL, l.Value());
+}
+
+// Finding the value of a label may free the Binding it refers to. This test
+// always passes; it is interesting to memory checkers and coverage analysis.
+TEST(LabelReferenceCount, FindValueFree) {
+ Label l;
+ {
+ Label m, n;
+ l = m;
+ m = n;
+ n = 0x7a0b0c576672daafULL;
+ // At this point, l's Binding refers to m's Binding, which refers
+ // to n's binding.
+ }
+ // Now, l is the only reference keeping the three Bindings alive.
+ // Resolving its value should free l's and m's original bindings.
+ ASSERT_EQ(0x7a0b0c576672daafULL, l.Value());
+}
+
+TEST(ConstructSection, Simple) {
+ Section s;
+}
+
+TEST(ConstructSection, WithEndian) {
+ Section s(kBigEndian);
+}
+
+// A fixture class for TestAssembler::Section tests.
+class SectionFixture {
+ public:
+ Section section;
+ string contents;
+ static const uint8_t data[];
+ static const size_t data_size;
+};
+
+const uint8_t SectionFixture::data[] = {
+ 0x87, 0x4f, 0x43, 0x67, 0x30, 0xd0, 0xd4, 0x0e
+};
+
+#define I0()
+#define I1(a) { a }
+#define I2(a,b) { a,b }
+#define I3(a,b,c) { a,b,c }
+#define I4(a,b,c,d) { a,b,c,d }
+#define I5(a,b,c,d,e) { a,b,c,d,e }
+#define I6(a,b,c,d,e,f) { a,b,c,d,e,f }
+#define I7(a,b,c,d,e,f,g) { a,b,c,d,e,f,g }
+#define I8(a,b,c,d,e,f,g,h) { a,b,c,d,e,f,g,h }
+#define I9(a,b,c,d,e,f,g,h,i) { a,b,c,d,e,f,g,h,i }
+#define ASSERT_BYTES(s, b) \
+ do \
+ { \
+ static const uint8_t expected_bytes[] = b; \
+ ASSERT_EQ(sizeof(expected_bytes), s.size()); \
+ ASSERT_TRUE(memcmp(s.data(), (const char *) expected_bytes, \
+ sizeof(expected_bytes)) == 0); \
+ } \
+ while(0)
+
+class Append: public SectionFixture, public Test { };
+
+TEST_F(Append, Bytes) {
+ section.Append(data, sizeof(data));
+ ASSERT_TRUE(section.GetContents(&contents));
+ ASSERT_EQ(sizeof(data), contents.size());
+ EXPECT_TRUE(0 == memcmp(contents.data(), (const char *) data, sizeof(data)));
+}
+
+TEST_F(Append, BytesTwice) {
+ section.Append(data, sizeof(data));
+ section.Append(data, sizeof(data));
+ ASSERT_TRUE(section.GetContents(&contents));
+ ASSERT_EQ(2 * sizeof(data), contents.size());
+ ASSERT_TRUE(0 == memcmp(contents.data(), (const char *) data, sizeof(data)));
+ ASSERT_TRUE(0 == memcmp(contents.data() + sizeof(data),
+ (const char *) data, sizeof(data)));
+}
+
+TEST_F(Append, String) {
+ string s1 = "howdy ";
+ string s2 = "there";
+ section.Append(s1);
+ section.Append(s2);
+ ASSERT_TRUE(section.GetContents(&contents));
+ ASSERT_STREQ(contents.c_str(), "howdy there");
+}
+
+TEST_F(Append, CString) {
+ section.AppendCString("howdy");
+ section.AppendCString("");
+ section.AppendCString("there");
+ ASSERT_TRUE(section.GetContents(&contents));
+ ASSERT_EQ(string("howdy\0\0there\0", 13), contents);
+}
+
+TEST_F(Append, CStringSize) {
+ section.AppendCString("howdy", 3);
+ section.AppendCString("there", 5);
+ section.AppendCString("fred", 6);
+ section.AppendCString("natalie", 0);
+ section.AppendCString("", 10);
+ ASSERT_TRUE(section.GetContents(&contents));
+ ASSERT_EQ(string("howtherefred\0\0\0\0\0\0\0\0\0\0\0\0", 24), contents);
+}
+
+TEST_F(Append, RepeatedBytes) {
+ section.Append((size_t) 10, '*');
+ ASSERT_TRUE(section.GetContents(&contents));
+ ASSERT_STREQ(contents.c_str(), "**********");
+}
+
+TEST_F(Append, GeneralLE1) {
+ section.Append(kLittleEndian, 1, 42);
+ ASSERT_TRUE(section.GetContents(&contents));
+ ASSERT_BYTES(contents, I1(42));
+}
+
+TEST_F(Append, GeneralLE2) {
+ section.Append(kLittleEndian, 2, 0x15a1);
+ ASSERT_TRUE(section.GetContents(&contents));
+ ASSERT_BYTES(contents, I2(0xa1, 0x15));
+}
+
+TEST_F(Append, GeneralLE3) {
+ section.Append(kLittleEndian, 3, 0x59ae8d);
+ ASSERT_TRUE(section.GetContents(&contents));
+ ASSERT_BYTES(contents, I3(0x8d, 0xae, 0x59));
+}
+
+TEST_F(Append, GeneralLE4) {
+ section.Append(kLittleEndian, 4, 0x51603c56);
+ ASSERT_TRUE(section.GetContents(&contents));
+ ASSERT_BYTES(contents, I4(0x56, 0x3c, 0x60, 0x51));
+}
+
+TEST_F(Append, GeneralLE5) {
+ section.Append(kLittleEndian, 5, 0x385e2803b4ULL);
+ ASSERT_TRUE(section.GetContents(&contents));
+ ASSERT_BYTES(contents, I5(0xb4, 0x03, 0x28, 0x5e, 0x38));
+}
+
+TEST_F(Append, GeneralLE6) {
+ section.Append(kLittleEndian, 6, 0xc7db9534dd1fULL);
+ ASSERT_TRUE(section.GetContents(&contents));
+ ASSERT_BYTES(contents, I6(0x1f, 0xdd, 0x34, 0x95, 0xdb, 0xc7));
+}
+
+TEST_F(Append, GeneralLE7) {
+ section.Append(kLittleEndian, 7, 0x1445c9f1b843e6ULL);
+ ASSERT_TRUE(section.GetContents(&contents));
+ ASSERT_BYTES(contents, I7(0xe6, 0x43, 0xb8, 0xf1, 0xc9, 0x45, 0x14));
+}
+
+TEST_F(Append, GeneralLE8) {
+ section.Append(kLittleEndian, 8, 0xaf48019dfe5c01e5ULL);
+ ASSERT_TRUE(section.GetContents(&contents));
+ ASSERT_BYTES(contents, I8(0xe5, 0x01, 0x5c, 0xfe, 0x9d, 0x01, 0x48, 0xaf));
+}
+
+TEST_F(Append, GeneralBE1) {
+ section.Append(kBigEndian, 1, 0xd0ULL);
+ ASSERT_TRUE(section.GetContents(&contents));
+ ASSERT_BYTES(contents, I1(0xd0));
+}
+
+TEST_F(Append, GeneralBE2) {
+ section.Append(kBigEndian, 2, 0x2e7eULL);
+ ASSERT_TRUE(section.GetContents(&contents));
+ ASSERT_BYTES(contents, I2(0x2e, 0x7e));
+}
+
+TEST_F(Append, GeneralBE3) {
+ section.Append(kBigEndian, 3, 0x37dad6ULL);
+ ASSERT_TRUE(section.GetContents(&contents));
+ ASSERT_BYTES(contents, I3(0x37, 0xda, 0xd6));
+}
+
+TEST_F(Append, GeneralBE4) {
+ section.Append(kBigEndian, 4, 0x715935c7ULL);
+ ASSERT_TRUE(section.GetContents(&contents));
+ ASSERT_BYTES(contents, I4(0x71, 0x59, 0x35, 0xc7));
+}
+
+TEST_F(Append, GeneralBE5) {
+ section.Append(kBigEndian, 5, 0x42baeb02b7ULL);
+ ASSERT_TRUE(section.GetContents(&contents));
+ ASSERT_BYTES(contents, I5(0x42, 0xba, 0xeb, 0x02, 0xb7));
+}
+
+TEST_F(Append, GeneralBE6) {
+ section.Append(kBigEndian, 6, 0xf1cdf10e7b18ULL);
+ ASSERT_TRUE(section.GetContents(&contents));
+ ASSERT_BYTES(contents, I6(0xf1, 0xcd, 0xf1, 0x0e, 0x7b, 0x18));
+}
+
+TEST_F(Append, GeneralBE7) {
+ section.Append(kBigEndian, 7, 0xf50a724f0b0d20ULL);
+ ASSERT_TRUE(section.GetContents(&contents));
+ ASSERT_BYTES(contents, I7(0xf5, 0x0a, 0x72, 0x4f, 0x0b, 0x0d, 0x20));
+}
+
+TEST_F(Append, GeneralBE8) {
+ section.Append(kBigEndian, 8, 0xa6b2cb5e98dc9c16ULL);
+ ASSERT_TRUE(section.GetContents(&contents));
+ ASSERT_BYTES(contents, I8(0xa6, 0xb2, 0xcb, 0x5e, 0x98, 0xdc, 0x9c, 0x16));
+}
+
+TEST_F(Append, GeneralLE1Label) {
+ Label l;
+ section.Append(kLittleEndian, 1, l);
+ l = 42;
+ ASSERT_TRUE(section.GetContents(&contents));
+ ASSERT_BYTES(contents, I1(42));
+}
+
+TEST_F(Append, GeneralLE2Label) {
+ Label l;
+ section.Append(kLittleEndian, 2, l);
+ l = 0x15a1;
+ ASSERT_TRUE(section.GetContents(&contents));
+ ASSERT_BYTES(contents, I2(0xa1, 0x15));
+}
+
+TEST_F(Append, GeneralLE3Label) {
+ Label l;
+ section.Append(kLittleEndian, 3, l);
+ l = 0x59ae8d;
+ ASSERT_TRUE(section.GetContents(&contents));
+ ASSERT_BYTES(contents, I3(0x8d, 0xae, 0x59));
+}
+
+TEST_F(Append, GeneralLE4Label) {
+ Label l;
+ section.Append(kLittleEndian, 4, l);
+ l = 0x51603c56;
+ ASSERT_TRUE(section.GetContents(&contents));
+ ASSERT_BYTES(contents, I4(0x56, 0x3c, 0x60, 0x51));
+}
+
+TEST_F(Append, GeneralLE5Label) {
+ Label l;
+ section.Append(kLittleEndian, 5, l);
+ l = 0x385e2803b4ULL;
+ ASSERT_TRUE(section.GetContents(&contents));
+ ASSERT_BYTES(contents, I5(0xb4, 0x03, 0x28, 0x5e, 0x38));
+}
+
+TEST_F(Append, GeneralLE6Label) {
+ Label l;
+ section.Append(kLittleEndian, 6, l);
+ l = 0xc7db9534dd1fULL;
+ ASSERT_TRUE(section.GetContents(&contents));
+ ASSERT_BYTES(contents, I6(0x1f, 0xdd, 0x34, 0x95, 0xdb, 0xc7));
+}
+
+TEST_F(Append, GeneralLE7Label) {
+ Label l;
+ section.Append(kLittleEndian, 7, l);
+ l = 0x1445c9f1b843e6ULL;
+ ASSERT_TRUE(section.GetContents(&contents));
+ ASSERT_BYTES(contents, I7(0xe6, 0x43, 0xb8, 0xf1, 0xc9, 0x45, 0x14));
+}
+
+TEST_F(Append, GeneralLE8Label) {
+ Label l;
+ section.Append(kLittleEndian, 8, l);
+ l = 0xaf48019dfe5c01e5ULL;
+ ASSERT_TRUE(section.GetContents(&contents));
+ ASSERT_BYTES(contents, I8(0xe5, 0x01, 0x5c, 0xfe, 0x9d, 0x01, 0x48, 0xaf));
+}
+
+TEST_F(Append, GeneralBE1Label) {
+ Label l;
+ section.Append(kBigEndian, 1, l);
+ l = 0xd0ULL;
+ ASSERT_TRUE(section.GetContents(&contents));
+ ASSERT_BYTES(contents, I1(0xd0));
+}
+
+TEST_F(Append, GeneralBE2Label) {
+ Label l;
+ section.Append(kBigEndian, 2, l);
+ l = 0x2e7eULL;
+ ASSERT_TRUE(section.GetContents(&contents));
+ ASSERT_BYTES(contents, I2(0x2e, 0x7e));
+}
+
+TEST_F(Append, GeneralBE3Label) {
+ Label l;
+ section.Append(kBigEndian, 3, l);
+ l = 0x37dad6ULL;
+ ASSERT_TRUE(section.GetContents(&contents));
+ ASSERT_BYTES(contents, I3(0x37, 0xda, 0xd6));
+}
+
+TEST_F(Append, GeneralBE4Label) {
+ Label l;
+ section.Append(kBigEndian, 4, l);
+ l = 0x715935c7ULL;
+ ASSERT_TRUE(section.GetContents(&contents));
+ ASSERT_BYTES(contents, I4(0x71, 0x59, 0x35, 0xc7));
+}
+
+TEST_F(Append, GeneralBE5Label) {
+ Label l;
+ section.Append(kBigEndian, 5, l);
+ l = 0x42baeb02b7ULL;
+ ASSERT_TRUE(section.GetContents(&contents));
+ ASSERT_BYTES(contents, I5(0x42, 0xba, 0xeb, 0x02, 0xb7));
+}
+
+TEST_F(Append, GeneralBE6Label) {
+ Label l;
+ section.Append(kBigEndian, 6, l);
+ l = 0xf1cdf10e7b18ULL;
+ ASSERT_TRUE(section.GetContents(&contents));
+ ASSERT_BYTES(contents, I6(0xf1, 0xcd, 0xf1, 0x0e, 0x7b, 0x18));
+}
+
+TEST_F(Append, GeneralBE7Label) {
+ Label l;
+ section.Append(kBigEndian, 7, l);
+ l = 0xf50a724f0b0d20ULL;
+ ASSERT_TRUE(section.GetContents(&contents));
+ ASSERT_BYTES(contents, I7(0xf5, 0x0a, 0x72, 0x4f, 0x0b, 0x0d, 0x20));
+}
+
+TEST_F(Append, GeneralBE8Label) {
+ Label l;
+ section.Append(kBigEndian, 8, l);
+ l = 0xa6b2cb5e98dc9c16ULL;
+ ASSERT_TRUE(section.GetContents(&contents));
+ ASSERT_BYTES(contents, I8(0xa6, 0xb2, 0xcb, 0x5e, 0x98, 0xdc, 0x9c, 0x16));
+}
+
+TEST_F(Append, B8) {
+ section.Append(1, 0x2a);
+ section.B8(0xd3U);
+ ASSERT_TRUE(section.GetContents(&contents));
+ ASSERT_BYTES(contents, I2(0x2a, 0xd3));
+}
+
+TEST_F(Append, B8Label) {
+ Label l;
+ section.Append(1, 0x2a);
+ section.B8(l);
+ l = 0x4bU;
+ ASSERT_TRUE(section.GetContents(&contents));
+ ASSERT_BYTES(contents, I2(0x2a, 0x4b));
+}
+
+TEST_F(Append, B16) {
+ section.Append(1, 0x2a);
+ section.B16(0x472aU);
+ ASSERT_TRUE(section.GetContents(&contents));
+ ASSERT_BYTES(contents, I3(0x2a, 0x47, 0x2a));
+}
+
+TEST_F(Append, B16Label) {
+ Label l;
+ section.Append(1, 0x2a);
+ section.B16(l);
+ l = 0x55e8U;
+ ASSERT_TRUE(section.GetContents(&contents));
+ ASSERT_BYTES(contents, I3(0x2a, 0x55, 0xe8));
+}
+
+TEST_F(Append, B32) {
+ section.Append(1, 0x2a);
+ section.B32(0xbd412cbcU);
+ ASSERT_TRUE(section.GetContents(&contents));
+ ASSERT_BYTES(contents, I5(0x2a, 0xbd, 0x41, 0x2c, 0xbc));
+}
+
+TEST_F(Append, B32Label) {
+ Label l;
+ section.Append(1, 0x2a);
+ section.B32(l);
+ l = 0x208e37d5U;
+ ASSERT_TRUE(section.GetContents(&contents));
+ ASSERT_BYTES(contents, I5(0x2a, 0x20, 0x8e, 0x37, 0xd5));
+}
+
+TEST_F(Append, B64) {
+ section.Append(1, 0x2a);
+ section.B64(0x3402a013111e68adULL);
+ ASSERT_TRUE(section.GetContents(&contents));
+ ASSERT_BYTES(contents,
+ I9(0x2a, 0x34, 0x02, 0xa0, 0x13, 0x11, 0x1e, 0x68, 0xad));
+}
+
+TEST_F(Append, B64Label) {
+ Label l;
+ section.Append(1, 0x2a);
+ section.B64(l);
+ l = 0x355dbfbb4ac6d57fULL;
+ ASSERT_TRUE(section.GetContents(&contents));
+ ASSERT_BYTES(contents,
+ I9(0x2a, 0x35, 0x5d, 0xbf, 0xbb, 0x4a, 0xc6, 0xd5, 0x7f));
+}
+
+TEST_F(Append, L8) {
+ section.Append(1, 0x2a);
+ section.L8(0x26U);
+ ASSERT_TRUE(section.GetContents(&contents));
+ ASSERT_BYTES(contents, I2(0x2a, 0x26));
+}
+
+TEST_F(Append, L8Label) {
+ Label l;
+ section.Append(1, 0x2a);
+ section.L8(l);
+ l = 0xa8U;
+ ASSERT_TRUE(section.GetContents(&contents));
+ ASSERT_BYTES(contents, I2(0x2a, 0xa8));
+}
+
+TEST_F(Append, L16) {
+ section.Append(1, 0x2a);
+ section.L16(0xca6dU);
+ ASSERT_TRUE(section.GetContents(&contents));
+ ASSERT_BYTES(contents, I3(0x2a, 0x6d, 0xca));
+}
+
+TEST_F(Append, L16Label) {
+ Label l;
+ section.Append(1, 0x2a);
+ section.L16(l);
+ l = 0xd21fU;
+ ASSERT_TRUE(section.GetContents(&contents));
+ ASSERT_BYTES(contents, I3(0x2a, 0x1f, 0xd2));
+}
+
+TEST_F(Append, L32) {
+ section.Append(1, 0x2a);
+ section.L32(0x558f6181U);
+ ASSERT_TRUE(section.GetContents(&contents));
+ ASSERT_BYTES(contents, I5(0x2a, 0x81, 0x61, 0x8f, 0x55));
+}
+
+TEST_F(Append, L32Label) {
+ Label l;
+ section.Append(1, 0x2a);
+ section.L32(l);
+ l = 0x4b810f82U;
+ ASSERT_TRUE(section.GetContents(&contents));
+ ASSERT_BYTES(contents, I5(0x2a, 0x82, 0x0f, 0x81, 0x4b));
+}
+
+TEST_F(Append, L64) {
+ section.Append(1, 0x2a);
+ section.L64(0x564384f7579515bfULL);
+ ASSERT_TRUE(section.GetContents(&contents));
+ ASSERT_BYTES(contents,
+ I9(0x2a, 0xbf, 0x15, 0x95, 0x57, 0xf7, 0x84, 0x43, 0x56));
+}
+
+TEST_F(Append, L64Label) {
+ Label l;
+ section.Append(1, 0x2a);
+ section.L64(l);
+ l = 0x424b1d020667c8dbULL;
+ ASSERT_TRUE(section.GetContents(&contents));
+ ASSERT_BYTES(contents,
+ I9(0x2a, 0xdb, 0xc8, 0x67, 0x06, 0x02, 0x1d, 0x4b, 0x42));
+}
+
+TEST_F(Append, D8Big) {
+ section.set_endianness(kBigEndian);
+ section.Append(1, 0x2a);
+ section.D8(0xe6U);
+ ASSERT_TRUE(section.GetContents(&contents));
+ ASSERT_BYTES(contents, I2(0x2a, 0xe6));
+}
+
+TEST_F(Append, D8BigLabel) {
+ Label l;
+ section.set_endianness(kBigEndian);
+ section.Append(1, 0x2a);
+ section.D8(l);
+ l = 0xeeU;
+ ASSERT_TRUE(section.GetContents(&contents));
+ ASSERT_BYTES(contents, I2(0x2a, 0xee));
+}
+
+TEST_F(Append, D16Big) {
+ section.set_endianness(kBigEndian);
+ section.Append(1, 0x2a);
+ section.D16(0x83b1U);
+ ASSERT_TRUE(section.GetContents(&contents));
+ ASSERT_BYTES(contents, I3(0x2a, 0x83, 0xb1));
+}
+
+TEST_F(Append, D16BigLabel) {
+ Label l;
+ section.set_endianness(kBigEndian);
+ section.Append(1, 0x2a);
+ section.D16(l);
+ l = 0x5b55U;
+ ASSERT_TRUE(section.GetContents(&contents));
+ ASSERT_BYTES(contents, I3(0x2a, 0x5b, 0x55));
+}
+
+TEST_F(Append, D32Big) {
+ section.set_endianness(kBigEndian);
+ section.Append(1, 0x2a);
+ section.D32(0xd0b0e431U);
+ ASSERT_TRUE(section.GetContents(&contents));
+ ASSERT_BYTES(contents, I5(0x2a, 0xd0, 0xb0, 0xe4, 0x31));
+}
+
+TEST_F(Append, D32BigLabel) {
+ Label l;
+ section.set_endianness(kBigEndian);
+ section.Append(1, 0x2a);
+ section.D32(l);
+ l = 0x312fb340U;
+ ASSERT_TRUE(section.GetContents(&contents));
+ ASSERT_BYTES(contents, I5(0x2a, 0x31, 0x2f, 0xb3, 0x40));
+}
+
+TEST_F(Append, D64Big) {
+ section.set_endianness(kBigEndian);
+ section.Append(1, 0x2a);
+ section.D64(0xb109843500dbcb16ULL);
+ ASSERT_TRUE(section.GetContents(&contents));
+ ASSERT_BYTES(contents,
+ I9(0x2a, 0xb1, 0x09, 0x84, 0x35, 0x00, 0xdb, 0xcb, 0x16));
+}
+
+TEST_F(Append, D64BigLabel) {
+ Label l;
+ section.set_endianness(kBigEndian);
+ section.Append(1, 0x2a);
+ section.D64(l);
+ l = 0x9a0d61b70f671fd7ULL;
+ ASSERT_TRUE(section.GetContents(&contents));
+ ASSERT_BYTES(contents,
+ I9(0x2a, 0x9a, 0x0d, 0x61, 0xb7, 0x0f, 0x67, 0x1f, 0xd7));
+}
+
+TEST_F(Append, D8Little) {
+ section.set_endianness(kLittleEndian);
+ section.Append(1, 0x2a);
+ section.D8(0x42U);
+ ASSERT_TRUE(section.GetContents(&contents));
+ ASSERT_BYTES(contents, I2(0x2a, 0x42));
+}
+
+TEST_F(Append, D8LittleLabel) {
+ Label l;
+ section.set_endianness(kLittleEndian);
+ section.Append(1, 0x2a);
+ section.D8(l);
+ l = 0x05U;
+ ASSERT_TRUE(section.GetContents(&contents));
+ ASSERT_BYTES(contents, I2(0x2a, 0x05));
+}
+
+TEST_F(Append, D16Little) {
+ section.set_endianness(kLittleEndian);
+ section.Append(1, 0x2a);
+ section.D16(0xc5c5U);
+ ASSERT_TRUE(section.GetContents(&contents));
+ ASSERT_BYTES(contents, I3(0x2a, 0xc5, 0xc5));
+}
+
+TEST_F(Append, D16LittleLabel) {
+ Label l;
+ section.set_endianness(kLittleEndian);
+ section.Append(1, 0x2a);
+ section.D16(l);
+ l = 0xb620U;
+ ASSERT_TRUE(section.GetContents(&contents));
+ ASSERT_BYTES(contents, I3(0x2a, 0x20, 0xb6));
+}
+
+TEST_F(Append, D32Little) {
+ section.set_endianness(kLittleEndian);
+ section.Append(1, 0x2a);
+ section.D32(0x1a87d0feU);
+ ASSERT_TRUE(section.GetContents(&contents));
+ ASSERT_BYTES(contents, I5(0x2a, 0xfe, 0xd0, 0x87, 0x1a));
+}
+
+TEST_F(Append, D32LittleLabel) {
+ Label l;
+ section.set_endianness(kLittleEndian);
+ section.Append(1, 0x2a);
+ section.D32(l);
+ l = 0xb8012d6bU;
+ ASSERT_TRUE(section.GetContents(&contents));
+ ASSERT_BYTES(contents, I5(0x2a, 0x6b, 0x2d, 0x01, 0xb8));
+}
+
+TEST_F(Append, D64Little) {
+ section.set_endianness(kLittleEndian);
+ section.Append(1, 0x2a);
+ section.D64(0x42de75c61375a1deULL);
+ ASSERT_TRUE(section.GetContents(&contents));
+ ASSERT_BYTES(contents,
+ I9(0x2a, 0xde, 0xa1, 0x75, 0x13, 0xc6, 0x75, 0xde, 0x42));
+}
+
+TEST_F(Append, D64LittleLabel) {
+ Label l;
+ section.set_endianness(kLittleEndian);
+ section.Append(1, 0x2a);
+ section.D64(l);
+ l = 0x8b3bececf3fb5312ULL;
+ ASSERT_TRUE(section.GetContents(&contents));
+ ASSERT_BYTES(contents,
+ I9(0x2a, 0x12, 0x53, 0xfb, 0xf3, 0xec, 0xec, 0x3b, 0x8b));
+}
+
+TEST_F(Append, Variety) {
+ Label a, b, c, d, e, f, g, h;
+ section.Append(kBigEndian, 1, a)
+ .Append(kLittleEndian, 8, h)
+ .Append(kBigEndian, 1, 0x8bULL)
+ .Append(kLittleEndian, 8, 0x0ea56540448f4439ULL)
+ .Append(kBigEndian, 2, b)
+ .Append(kLittleEndian, 7, g)
+ .Append(kBigEndian, 2, 0xcf15ULL)
+ .Append(kLittleEndian, 7, 0x29694f04c5724aULL)
+ .Append(kBigEndian, 3, c)
+ .Append(kLittleEndian, 6, f)
+ .Append(kBigEndian, 3, 0x8c3ffdULL)
+ .Append(kLittleEndian, 6, 0x6f11ba80187aULL)
+ .Append(kBigEndian, 4, d)
+ .Append(kLittleEndian, 5, e)
+ .Append(kBigEndian, 4, 0x2fda2472ULL)
+ .Append(kLittleEndian, 5, 0x0aa02d423fULL)
+ .Append(kBigEndian, 5, e)
+ .Append(kLittleEndian, 4, d)
+ .Append(kBigEndian, 5, 0x53ba432138ULL)
+ .Append(kLittleEndian, 4, 0xf139ae60ULL)
+ .Append(kBigEndian, 6, f)
+ .Append(kLittleEndian, 3, c)
+ .Append(kBigEndian, 6, 0x168e436af716ULL)
+ .Append(kLittleEndian, 3, 0x3ef189ULL)
+ .Append(kBigEndian, 7, g)
+ .Append(kLittleEndian, 2, b)
+ .Append(kBigEndian, 7, 0xacd4ef233e47d9ULL)
+ .Append(kLittleEndian, 2, 0x5311ULL)
+ .Append(kBigEndian, 8, h)
+ .Append(kLittleEndian, 1, a)
+ .Append(kBigEndian, 8, 0x4668d5f1c93637a1ULL)
+ .Append(kLittleEndian, 1, 0x65ULL);
+ a = 0x79ac9bd8aa256b35ULL;
+ b = 0x22d13097ef86c91cULL;
+ c = 0xf204968b0a05862fULL;
+ d = 0x163177f15a0eb4ecULL;
+ e = 0xbd1b0f1d977f2246ULL;
+ f = 0x2b0842eee83c6461ULL;
+ g = 0x92f4b928a4bf875eULL;
+ h = 0x61a199a8f7286ba6ULL;
+ ASSERT_EQ(8 * 18U, section.Size());
+ ASSERT_TRUE(section.GetContents(&contents));
+
+ static const uint8_t expected[] = {
+ 0x35, 0xa6, 0x6b, 0x28, 0xf7, 0xa8, 0x99, 0xa1, 0x61,
+ 0x8b, 0x39, 0x44, 0x8f, 0x44, 0x40, 0x65, 0xa5, 0x0e,
+ 0xc9, 0x1c, 0x5e, 0x87, 0xbf, 0xa4, 0x28, 0xb9, 0xf4,
+ 0xcf, 0x15, 0x4a, 0x72, 0xc5, 0x04, 0x4f, 0x69, 0x29,
+ 0x05, 0x86, 0x2f, 0x61, 0x64, 0x3c, 0xe8, 0xee, 0x42,
+ 0x8c, 0x3f, 0xfd, 0x7a, 0x18, 0x80, 0xba, 0x11, 0x6f,
+ 0x5a, 0x0e, 0xb4, 0xec, 0x46, 0x22, 0x7f, 0x97, 0x1d,
+ 0x2f, 0xda, 0x24, 0x72, 0x3f, 0x42, 0x2d, 0xa0, 0x0a,
+ 0x1d, 0x97, 0x7f, 0x22, 0x46, 0xec, 0xb4, 0x0e, 0x5a,
+ 0x53, 0xba, 0x43, 0x21, 0x38, 0x60, 0xae, 0x39, 0xf1,
+ 0x42, 0xee, 0xe8, 0x3c, 0x64, 0x61, 0x2f, 0x86, 0x05,
+ 0x16, 0x8e, 0x43, 0x6a, 0xf7, 0x16, 0x89, 0xf1, 0x3e,
+ 0xf4, 0xb9, 0x28, 0xa4, 0xbf, 0x87, 0x5e, 0x1c, 0xc9,
+ 0xac, 0xd4, 0xef, 0x23, 0x3e, 0x47, 0xd9, 0x11, 0x53,
+ 0x61, 0xa1, 0x99, 0xa8, 0xf7, 0x28, 0x6b, 0xa6, 0x35,
+ 0x46, 0x68, 0xd5, 0xf1, 0xc9, 0x36, 0x37, 0xa1, 0x65,
+ };
+
+ ASSERT_TRUE(0 == memcmp(contents.data(), expected, sizeof(expected)));
+}
+
+TEST_F(Append, Section) {
+ section.Append("murder");
+ {
+ Section middle;
+ middle.Append(" she");
+ section.Append(middle);
+ }
+ section.Append(" wrote");
+ EXPECT_EQ(16U, section.Size());
+ EXPECT_TRUE(section.GetContents(&contents));
+ EXPECT_STREQ(contents.c_str(), "murder she wrote");
+}
+
+TEST_F(Append, SectionRefs) {
+ section.Append("sugar ");
+ Label l;
+ {
+ Section middle;
+ Label m;
+ middle.B32(m);
+ section.Append(middle);
+ m = 0x66726565;
+ }
+ section.Append(" jazz");
+ EXPECT_EQ(15U, section.Size());
+ EXPECT_TRUE(section.GetContents(&contents));
+ EXPECT_STREQ(contents.c_str(), "sugar free jazz");
+}
+
+TEST_F(Append, LEB128_0) {
+ section.LEB128(0);
+ EXPECT_TRUE(section.GetContents(&contents));
+ EXPECT_EQ(string("\0", 1), contents);
+}
+
+TEST_F(Append, LEB128_0x3f) {
+ section.LEB128(0x3f);
+ EXPECT_TRUE(section.GetContents(&contents));
+ EXPECT_EQ(string("\x3f", 1), contents);
+}
+
+TEST_F(Append, LEB128_0x40) {
+ section.LEB128(0x40);
+ EXPECT_TRUE(section.GetContents(&contents));
+ EXPECT_EQ(string("\xc0\x00", 2), contents);
+}
+
+TEST_F(Append, LEB128_0x7f) {
+ section.LEB128(0x7f);
+ EXPECT_TRUE(section.GetContents(&contents));
+ EXPECT_EQ(string("\xff\x00", 2), contents);
+}
+
+TEST_F(Append, LEB128_0x80) {
+ section.LEB128(0x80);
+ EXPECT_TRUE(section.GetContents(&contents));
+ EXPECT_EQ(string("\x80\x01", 2), contents);
+}
+
+TEST_F(Append, LEB128_0xff) {
+ section.LEB128(0xff);
+ EXPECT_TRUE(section.GetContents(&contents));
+ EXPECT_EQ(string("\xff\x01", 2), contents);
+}
+
+TEST_F(Append, LEB128_0x1fff) {
+ section.LEB128(0x1fff);
+ EXPECT_TRUE(section.GetContents(&contents));
+ EXPECT_EQ(string("\xff\x3f", 2), contents);
+}
+
+TEST_F(Append, LEB128_0x2000) {
+ section.LEB128(0x2000);
+ EXPECT_TRUE(section.GetContents(&contents));
+ EXPECT_EQ(string("\x80\xc0\x00", 3), contents);
+}
+
+TEST_F(Append, LEB128_n1) {
+ section.LEB128(-1);
+ EXPECT_TRUE(section.GetContents(&contents));
+ EXPECT_EQ(string("\x7f", 1), contents);
+}
+
+TEST_F(Append, LEB128_n0x40) {
+ section.LEB128(-0x40);
+ EXPECT_TRUE(section.GetContents(&contents));
+ EXPECT_EQ(string("\x40", 1), contents);
+}
+
+TEST_F(Append, LEB128_n0x41) {
+ section.LEB128(-0x41);
+ EXPECT_TRUE(section.GetContents(&contents));
+ EXPECT_EQ(string("\xbf\x7f", 2), contents);
+}
+
+TEST_F(Append, LEB128_n0x7f) {
+ section.LEB128(-0x7f);
+ EXPECT_TRUE(section.GetContents(&contents));
+ EXPECT_EQ(string("\x81\x7f", 2), contents);
+}
+
+TEST_F(Append, LEB128_n0x80) {
+ section.LEB128(-0x80);
+ EXPECT_TRUE(section.GetContents(&contents));
+ EXPECT_EQ(string("\x80\x7f", 2), contents);
+}
+
+TEST_F(Append, LEB128_n0x2000) {
+ section.LEB128(-0x2000);
+ EXPECT_TRUE(section.GetContents(&contents));
+ EXPECT_EQ(string("\x80\x40", 2), contents);
+}
+
+TEST_F(Append, LEB128_n0x2001) {
+ section.LEB128(-0x2001);
+ EXPECT_TRUE(section.GetContents(&contents));
+ EXPECT_EQ(string("\xff\xbf\x7f", 3), contents);
+}
+
+TEST_F(Append,ULEB128_0) {
+ section.ULEB128(0);
+ EXPECT_TRUE(section.GetContents(&contents));
+ EXPECT_EQ(string("\0", 1), contents);
+}
+
+TEST_F(Append,ULEB128_1) {
+ section.ULEB128(1);
+ EXPECT_TRUE(section.GetContents(&contents));
+ EXPECT_EQ(string("\x01", 1), contents);
+}
+
+TEST_F(Append,ULEB128_0x3f) {
+ section.ULEB128(0x3f);
+ EXPECT_TRUE(section.GetContents(&contents));
+ EXPECT_EQ(string("\x3f", 1), contents);
+}
+
+TEST_F(Append,ULEB128_0x40) {
+ section.ULEB128(0x40);
+ EXPECT_TRUE(section.GetContents(&contents));
+ EXPECT_EQ(string("\x40", 1), contents);
+}
+
+TEST_F(Append,ULEB128_0x7f) {
+ section.ULEB128(0x7f);
+ EXPECT_TRUE(section.GetContents(&contents));
+ EXPECT_EQ(string("\x7f", 1), contents);
+}
+
+TEST_F(Append,ULEB128_0x80) {
+ section.ULEB128(0x80);
+ EXPECT_TRUE(section.GetContents(&contents));
+ EXPECT_EQ(string("\x80\x01", 2), contents);
+}
+
+TEST_F(Append,ULEB128_0xff) {
+ section.ULEB128(0xff);
+ EXPECT_TRUE(section.GetContents(&contents));
+ EXPECT_EQ(string("\xff\x01", 2), contents);
+}
+
+TEST_F(Append,ULEB128_0x100) {
+ section.ULEB128(0x100);
+ EXPECT_TRUE(section.GetContents(&contents));
+ EXPECT_EQ(string("\x80\x02", 2), contents);
+}
+
+TEST_F(Append,ULEB128_0x1fff) {
+ section.ULEB128(0x1fff);
+ EXPECT_TRUE(section.GetContents(&contents));
+ EXPECT_EQ(string("\xff\x3f", 2), contents);
+}
+
+TEST_F(Append,ULEB128_0x2000) {
+ section.ULEB128(0x2000);
+ EXPECT_TRUE(section.GetContents(&contents));
+ EXPECT_EQ(string("\x80\x40", 2), contents);
+}
+
+TEST_F(Append,ULEB128_0x3fff) {
+ section.ULEB128(0x3fff);
+ EXPECT_TRUE(section.GetContents(&contents));
+ EXPECT_EQ(string("\xff\x7f", 2), contents);
+}
+
+TEST_F(Append,ULEB128_0x4000) {
+ section.ULEB128(0x4000);
+ EXPECT_TRUE(section.GetContents(&contents));
+ EXPECT_EQ(string("\x80\x80\x01", 3), contents);
+}
+
+TEST_F(Append,ULEB128_12857) {
+ section.ULEB128(12857);
+ EXPECT_TRUE(section.GetContents(&contents));
+ EXPECT_EQ(string("\xb9\x64", 2), contents);
+}
+
+TEST_F(Append, LEBChain) {
+ section.LEB128(-0x80).ULEB128(12857).Append("*");
+ EXPECT_TRUE(section.GetContents(&contents));
+ EXPECT_EQ(string("\x80\x7f\xb9\x64*", 5), contents);
+}
+
+
+class GetContents: public SectionFixture, public Test { };
+
+TEST_F(GetContents, Undefined) {
+ Label l;
+ section.Append(kLittleEndian, 8, l);
+ ASSERT_FALSE(section.GetContents(&contents));
+}
+
+TEST_F(GetContents, ClearsContents) {
+ section.Append((size_t) 10, '*');
+ EXPECT_EQ(10U, section.Size());
+ EXPECT_TRUE(section.GetContents(&contents));
+ EXPECT_EQ(0U, section.Size());
+}
+
+TEST_F(GetContents, ClearsReferences) {
+ Label l;
+ section.Append(kBigEndian, 1, l);
+ l = 42;
+ ASSERT_TRUE(section.GetContents(&contents));
+ ASSERT_BYTES(contents, I1(42));
+ ASSERT_TRUE(section.GetContents(&contents)); // should not die
+}
+
+class Miscellanea: public SectionFixture, public Test { };
+
+TEST_F(Miscellanea, Clear) {
+ section.Append("howdy");
+ Label l;
+ section.L32(l);
+ EXPECT_EQ(9U, section.Size());
+ section.Clear();
+ EXPECT_EQ(0U, section.Size());
+ l = 0x8d231bf0U;
+ ASSERT_TRUE(section.GetContents(&contents)); // should not die
+}
+
+TEST_F(Miscellanea, Align) {
+ section.Append("*");
+ EXPECT_EQ(1U, section.Size());
+ section.Align(4).Append("*");
+ EXPECT_EQ(5U, section.Size());
+ section.Append("*").Align(2);
+ EXPECT_EQ(6U, section.Size());
+}
+
+TEST_F(Miscellanea, AlignPad) {
+ section.Append("*");
+ EXPECT_EQ(1U, section.Size());
+ section.Align(4, ' ').Append("*");
+ EXPECT_EQ(5U, section.Size());
+ section.Append("*").Align(2, ' ');
+ EXPECT_EQ(6U, section.Size());
+ ASSERT_TRUE(section.GetContents(&contents));
+ ASSERT_EQ(string("* **"), contents);
+}
+
+TEST_F(Miscellanea, StartHereMark) {
+ Label m;
+ section.Append(42, ' ').Mark(&m).Append(13, '+');
+ EXPECT_EQ(42U, m - section.start());
+ EXPECT_EQ(42U + 13U, section.Here() - section.start());
+ EXPECT_FALSE(section.start().IsKnownConstant());
+ EXPECT_FALSE(m.IsKnownConstant());
+ EXPECT_FALSE(section.Here().IsKnownConstant());
+}
+
+TEST_F(Miscellanea, Endianness) {
+ section.set_endianness(kBigEndian);
+ EXPECT_EQ(kBigEndian, section.endianness());
+ section.set_endianness(kLittleEndian);
+ EXPECT_EQ(kLittleEndian, section.endianness());
+}
diff --git a/3rdParty/Breakpad/src/common/unordered.h b/3rdParty/Breakpad/src/common/unordered.h
new file mode 100644
index 0000000..ec665cc
--- /dev/null
+++ b/3rdParty/Breakpad/src/common/unordered.h
@@ -0,0 +1,62 @@
+// Copyright (c) 2010 Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// Include this file to use unordered_map and unordered_set. If tr1
+// or C++11 is not available, you can switch to using hash_set and
+// hash_map by defining BP_USE_HASH_SET.
+
+#ifndef COMMON_UNORDERED_H_
+#define COMMON_UNORDERED_H_
+
+#if defined(BP_USE_HASH_SET)
+#include <hash_map>
+#include <hash_set>
+
+// For hash<string>.
+#include "util/hash/hash.h"
+
+template <class T, class U, class H = __gnu_cxx::hash<T> >
+struct unordered_map : public hash_map<T, U, H> {};
+template <class T, class H = __gnu_cxx::hash<T> >
+struct unordered_set : public hash_set<T, H> {};
+
+#elif defined(_LIBCPP_VERSION) // c++11
+#include <unordered_map>
+#include <unordered_set>
+using std::unordered_map;
+using std::unordered_set;
+
+#else // Fallback to tr1::unordered
+#include <tr1/unordered_map>
+#include <tr1/unordered_set>
+using std::tr1::unordered_map;
+using std::tr1::unordered_set;
+#endif
+
+#endif // COMMON_UNORDERED_H_
diff --git a/3rdParty/Breakpad/src/common/windows/dia_util.cc b/3rdParty/Breakpad/src/common/windows/dia_util.cc
new file mode 100644
index 0000000..f4cfa1d
--- /dev/null
+++ b/3rdParty/Breakpad/src/common/windows/dia_util.cc
@@ -0,0 +1,92 @@
+// Copyright 2013 Google Inc. All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#include "common/windows/dia_util.h"
+
+#include <atlbase.h>
+
+namespace google_breakpad {
+
+bool FindDebugStream(const wchar_t* name,
+ IDiaSession* session,
+ IDiaEnumDebugStreamData** debug_stream) {
+ CComPtr<IDiaEnumDebugStreams> enum_debug_streams;
+ if (FAILED(session->getEnumDebugStreams(&enum_debug_streams))) {
+ fprintf(stderr, "IDiaSession::getEnumDebugStreams failed\n");
+ return false;
+ }
+
+ CComPtr<IDiaEnumDebugStreamData> temp_debug_stream;
+ ULONG fetched = 0;
+ while (SUCCEEDED(enum_debug_streams->Next(1, &temp_debug_stream, &fetched)) &&
+ fetched == 1) {
+ CComBSTR stream_name;
+ if (FAILED(temp_debug_stream->get_name(&stream_name))) {
+ fprintf(stderr, "IDiaEnumDebugStreamData::get_name failed\n");
+ return false;
+ }
+
+ // Found the stream?
+ if (wcsncmp((LPWSTR)stream_name, name, stream_name.Length()) == 0) {
+ *debug_stream = temp_debug_stream.Detach();
+ return true;
+ }
+
+ temp_debug_stream.Release();
+ }
+
+ // No table was found.
+ return false;
+}
+
+bool FindTable(REFIID iid, IDiaSession* session, void** table) {
+ // Get the table enumerator.
+ CComPtr<IDiaEnumTables> enum_tables;
+ if (FAILED(session->getEnumTables(&enum_tables))) {
+ fprintf(stderr, "IDiaSession::getEnumTables failed\n");
+ return false;
+ }
+
+ // Iterate through the tables.
+ CComPtr<IDiaTable> temp_table;
+ ULONG fetched = 0;
+ while (SUCCEEDED(enum_tables->Next(1, &temp_table, &fetched)) &&
+ fetched == 1) {
+ void* temp = NULL;
+ if (SUCCEEDED(temp_table->QueryInterface(iid, &temp))) {
+ *table = temp;
+ return true;
+ }
+ temp_table.Release();
+ }
+
+ // The table was not found.
+ return false;
+}
+
+} // namespace google_breakpad \ No newline at end of file
diff --git a/3rdParty/Breakpad/src/common/windows/dia_util.h b/3rdParty/Breakpad/src/common/windows/dia_util.h
new file mode 100644
index 0000000..b9e0df2
--- /dev/null
+++ b/3rdParty/Breakpad/src/common/windows/dia_util.h
@@ -0,0 +1,64 @@
+// Copyright 2013 Google Inc. All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// Utilities for loading debug streams and tables from a PDB file.
+
+#ifndef COMMON_WINDOWS_DIA_UTIL_H_
+#define COMMON_WINDOWS_DIA_UTIL_H_
+
+#include <Windows.h>
+#include <dia2.h>
+
+namespace google_breakpad {
+
+// Find the debug stream of the given |name| in the given |session|. Returns
+// true on success, false on error of if the stream does not exist. On success
+// the stream will be returned via |debug_stream|.
+bool FindDebugStream(const wchar_t* name,
+ IDiaSession* session,
+ IDiaEnumDebugStreamData** debug_stream);
+
+// Finds the first table implementing the COM interface with ID |iid| in the
+// given |session|. Returns true on success, false on error or if no such
+// table is found. On success the table will be returned via |table|.
+bool FindTable(REFIID iid, IDiaSession* session, void** table);
+
+// A templated version of FindTable. Finds the first table implementing type
+// |InterfaceType| in the given |session|. Returns true on success, false on
+// error or if no such table is found. On success the table will be returned via
+// |table|.
+template<typename InterfaceType>
+bool FindTable(IDiaSession* session, InterfaceType** table) {
+ return FindTable(__uuidof(InterfaceType),
+ session,
+ reinterpret_cast<void**>(table));
+}
+
+} // namespace google_breakpad
+
+#endif // COMMON_WINDOWS_DIA_UTIL_H_
diff --git a/3rdParty/Breakpad/src/common/windows/guid_string.h b/3rdParty/Breakpad/src/common/windows/guid_string.h
index f8aa8a2..48a5c1d 100644
--- a/3rdParty/Breakpad/src/common/windows/guid_string.h
+++ b/3rdParty/Breakpad/src/common/windows/guid_string.h
@@ -29,10 +29,10 @@
// guid_string.cc: Convert GUIDs to strings.
-#ifndef COMMON_WINDOWS_GUID_STRING_H__
-#define COMMON_WINDOWS_GUID_STRING_H__
+#ifndef COMMON_WINDOWS_GUID_STRING_H_
+#define COMMON_WINDOWS_GUID_STRING_H_
-#include <Guiddef.h>
+#include <guiddef.h>
#include <string>
@@ -55,4 +55,4 @@ class GUIDString {
} // namespace google_breakpad
-#endif // COMMON_WINDOWS_GUID_STRING_H__
+#endif // COMMON_WINDOWS_GUID_STRING_H_
diff --git a/3rdParty/Breakpad/src/common/windows/http_upload.cc b/3rdParty/Breakpad/src/common/windows/http_upload.cc
new file mode 100644
index 0000000..7676bdc
--- /dev/null
+++ b/3rdParty/Breakpad/src/common/windows/http_upload.cc
@@ -0,0 +1,420 @@
+// Copyright (c) 2006, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#include <assert.h>
+
+// Disable exception handler warnings.
+#pragma warning(disable:4530)
+
+#include <fstream>
+
+#include "common/windows/string_utils-inl.h"
+
+#include "common/windows/http_upload.h"
+
+namespace google_breakpad {
+
+using std::ifstream;
+using std::ios;
+
+static const wchar_t kUserAgent[] = L"Breakpad/1.0 (Windows)";
+
+// Helper class which closes an internet handle when it goes away
+class HTTPUpload::AutoInternetHandle {
+ public:
+ explicit AutoInternetHandle(HINTERNET handle) : handle_(handle) {}
+ ~AutoInternetHandle() {
+ if (handle_) {
+ InternetCloseHandle(handle_);
+ }
+ }
+
+ HINTERNET get() { return handle_; }
+
+ private:
+ HINTERNET handle_;
+};
+
+// static
+bool HTTPUpload::SendRequest(const wstring &url,
+ const map<wstring, wstring> &parameters,
+ const map<wstring, wstring> &files,
+ int *timeout,
+ wstring *response_body,
+ int *response_code) {
+ if (response_code) {
+ *response_code = 0;
+ }
+
+ // TODO(bryner): support non-ASCII parameter names
+ if (!CheckParameters(parameters)) {
+ return false;
+ }
+
+ // Break up the URL and make sure we can handle it
+ wchar_t scheme[16], host[256], path[256];
+ URL_COMPONENTS components;
+ memset(&components, 0, sizeof(components));
+ components.dwStructSize = sizeof(components);
+ components.lpszScheme = scheme;
+ components.dwSchemeLength = sizeof(scheme) / sizeof(scheme[0]);
+ components.lpszHostName = host;
+ components.dwHostNameLength = sizeof(host) / sizeof(host[0]);
+ components.lpszUrlPath = path;
+ components.dwUrlPathLength = sizeof(path) / sizeof(path[0]);
+ if (!InternetCrackUrl(url.c_str(), static_cast<DWORD>(url.size()),
+ 0, &components)) {
+ return false;
+ }
+ bool secure = false;
+ if (wcscmp(scheme, L"https") == 0) {
+ secure = true;
+ } else if (wcscmp(scheme, L"http") != 0) {
+ return false;
+ }
+
+ AutoInternetHandle internet(InternetOpen(kUserAgent,
+ INTERNET_OPEN_TYPE_PRECONFIG,
+ NULL, // proxy name
+ NULL, // proxy bypass
+ 0)); // flags
+ if (!internet.get()) {
+ return false;
+ }
+
+ AutoInternetHandle connection(InternetConnect(internet.get(),
+ host,
+ components.nPort,
+ NULL, // user name
+ NULL, // password
+ INTERNET_SERVICE_HTTP,
+ 0, // flags
+ NULL)); // context
+ if (!connection.get()) {
+ return false;
+ }
+
+ DWORD http_open_flags = secure ? INTERNET_FLAG_SECURE : 0;
+ http_open_flags |= INTERNET_FLAG_NO_COOKIES;
+ AutoInternetHandle request(HttpOpenRequest(connection.get(),
+ L"POST",
+ path,
+ NULL, // version
+ NULL, // referer
+ NULL, // agent type
+ http_open_flags,
+ NULL)); // context
+ if (!request.get()) {
+ return false;
+ }
+
+ wstring boundary = GenerateMultipartBoundary();
+ wstring content_type_header = GenerateRequestHeader(boundary);
+ HttpAddRequestHeaders(request.get(),
+ content_type_header.c_str(),
+ static_cast<DWORD>(-1),
+ HTTP_ADDREQ_FLAG_ADD);
+
+ string request_body;
+ if (!GenerateRequestBody(parameters, files, boundary, &request_body)) {
+ return false;
+ }
+
+ if (timeout) {
+ if (!InternetSetOption(request.get(),
+ INTERNET_OPTION_SEND_TIMEOUT,
+ timeout,
+ sizeof(*timeout))) {
+ fwprintf(stderr, L"Could not unset send timeout, continuing...\n");
+ }
+
+ if (!InternetSetOption(request.get(),
+ INTERNET_OPTION_RECEIVE_TIMEOUT,
+ timeout,
+ sizeof(*timeout))) {
+ fwprintf(stderr, L"Could not unset receive timeout, continuing...\n");
+ }
+ }
+
+ if (!HttpSendRequest(request.get(), NULL, 0,
+ const_cast<char *>(request_body.data()),
+ static_cast<DWORD>(request_body.size()))) {
+ return false;
+ }
+
+ // The server indicates a successful upload with HTTP status 200.
+ wchar_t http_status[4];
+ DWORD http_status_size = sizeof(http_status);
+ if (!HttpQueryInfo(request.get(), HTTP_QUERY_STATUS_CODE,
+ static_cast<LPVOID>(&http_status), &http_status_size,
+ 0)) {
+ return false;
+ }
+
+ int http_response = wcstol(http_status, NULL, 10);
+ if (response_code) {
+ *response_code = http_response;
+ }
+
+ bool result = (http_response == 200);
+
+ if (result) {
+ result = ReadResponse(request.get(), response_body);
+ }
+
+ return result;
+}
+
+// static
+bool HTTPUpload::ReadResponse(HINTERNET request, wstring *response) {
+ bool has_content_length_header = false;
+ wchar_t content_length[32];
+ DWORD content_length_size = sizeof(content_length);
+ DWORD claimed_size = 0;
+ string response_body;
+
+ if (HttpQueryInfo(request, HTTP_QUERY_CONTENT_LENGTH,
+ static_cast<LPVOID>(&content_length),
+ &content_length_size, 0)) {
+ has_content_length_header = true;
+ claimed_size = wcstol(content_length, NULL, 10);
+ response_body.reserve(claimed_size);
+ }
+
+
+ DWORD bytes_available;
+ DWORD total_read = 0;
+ BOOL return_code;
+
+ while (((return_code = InternetQueryDataAvailable(request, &bytes_available,
+ 0, 0)) != 0) && bytes_available > 0) {
+ vector<char> response_buffer(bytes_available);
+ DWORD size_read;
+
+ return_code = InternetReadFile(request,
+ &response_buffer[0],
+ bytes_available, &size_read);
+
+ if (return_code && size_read > 0) {
+ total_read += size_read;
+ response_body.append(&response_buffer[0], size_read);
+ } else {
+ break;
+ }
+ }
+
+ bool succeeded = return_code && (!has_content_length_header ||
+ (total_read == claimed_size));
+ if (succeeded && response) {
+ *response = UTF8ToWide(response_body);
+ }
+
+ return succeeded;
+}
+
+// static
+wstring HTTPUpload::GenerateMultipartBoundary() {
+ // The boundary has 27 '-' characters followed by 16 hex digits
+ static const wchar_t kBoundaryPrefix[] = L"---------------------------";
+ static const int kBoundaryLength = 27 + 16 + 1;
+
+ // Generate some random numbers to fill out the boundary
+ int r0 = rand();
+ int r1 = rand();
+
+ wchar_t temp[kBoundaryLength];
+ swprintf(temp, kBoundaryLength, L"%s%08X%08X", kBoundaryPrefix, r0, r1);
+
+ // remove when VC++7.1 is no longer supported
+ temp[kBoundaryLength - 1] = L'\0';
+
+ return wstring(temp);
+}
+
+// static
+wstring HTTPUpload::GenerateRequestHeader(const wstring &boundary) {
+ wstring header = L"Content-Type: multipart/form-data; boundary=";
+ header += boundary;
+ return header;
+}
+
+// static
+bool HTTPUpload::GenerateRequestBody(const map<wstring, wstring> &parameters,
+ const map<wstring, wstring> &files,
+ const wstring &boundary,
+ string *request_body) {
+ string boundary_str = WideToUTF8(boundary);
+ if (boundary_str.empty()) {
+ return false;
+ }
+
+ request_body->clear();
+
+ // Append each of the parameter pairs as a form-data part
+ for (map<wstring, wstring>::const_iterator pos = parameters.begin();
+ pos != parameters.end(); ++pos) {
+ request_body->append("--" + boundary_str + "\r\n");
+ request_body->append("Content-Disposition: form-data; name=\"" +
+ WideToUTF8(pos->first) + "\"\r\n\r\n" +
+ WideToUTF8(pos->second) + "\r\n");
+ }
+
+ for (map<wstring, wstring>::const_iterator pos = files.begin();
+ pos != files.end(); ++pos) {
+ vector<char> contents;
+ if (!GetFileContents(pos->second, &contents)) {
+ return false;
+ }
+
+ // Now append the upload files as a binary (octet-stream) part
+ string filename_utf8 = WideToUTF8(pos->second);
+ if (filename_utf8.empty()) {
+ return false;
+ }
+
+ string file_part_name_utf8 = WideToUTF8(pos->first);
+ if (file_part_name_utf8.empty()) {
+ return false;
+ }
+
+ request_body->append("--" + boundary_str + "\r\n");
+ request_body->append("Content-Disposition: form-data; "
+ "name=\"" + file_part_name_utf8 + "\"; "
+ "filename=\"" + filename_utf8 + "\"\r\n");
+ request_body->append("Content-Type: application/octet-stream\r\n");
+ request_body->append("\r\n");
+
+ if (!contents.empty()) {
+ request_body->append(&(contents[0]), contents.size());
+ }
+ request_body->append("\r\n");
+ }
+ request_body->append("--" + boundary_str + "--\r\n");
+ return true;
+}
+
+// static
+bool HTTPUpload::GetFileContents(const wstring &filename,
+ vector<char> *contents) {
+ bool rv = false;
+ // The "open" method on pre-MSVC8 ifstream implementations doesn't accept a
+ // wchar_t* filename, so use _wfopen directly in that case. For VC8 and
+ // later, _wfopen has been deprecated in favor of _wfopen_s, which does
+ // not exist in earlier versions, so let the ifstream open the file itself.
+ // GCC doesn't support wide file name and opening on FILE* requires ugly
+ // hacks, so fallback to multi byte file.
+#ifdef _MSC_VER
+ ifstream file;
+ file.open(filename.c_str(), ios::binary);
+#else // GCC
+ ifstream file(WideToMBCP(filename, CP_ACP).c_str(), ios::binary);
+#endif // _MSC_VER >= 1400
+ if (file.is_open()) {
+ file.seekg(0, ios::end);
+ std::streamoff length = file.tellg();
+ // Check for loss of data when converting lenght from std::streamoff into
+ // std::vector<char>::size_type
+ std::vector<char>::size_type vector_size =
+ static_cast<std::vector<char>::size_type>(length);
+ if (static_cast<std::streamoff>(vector_size) == length) {
+ contents->resize(vector_size);
+ if (length != 0) {
+ file.seekg(0, ios::beg);
+ file.read(&((*contents)[0]), length);
+ }
+ rv = true;
+ }
+ file.close();
+ }
+ return rv;
+}
+
+// static
+wstring HTTPUpload::UTF8ToWide(const string &utf8) {
+ if (utf8.length() == 0) {
+ return wstring();
+ }
+
+ // compute the length of the buffer we'll need
+ int charcount = MultiByteToWideChar(CP_UTF8, 0, utf8.c_str(), -1, NULL, 0);
+
+ if (charcount == 0) {
+ return wstring();
+ }
+
+ // convert
+ wchar_t* buf = new wchar_t[charcount];
+ MultiByteToWideChar(CP_UTF8, 0, utf8.c_str(), -1, buf, charcount);
+ wstring result(buf);
+ delete[] buf;
+ return result;
+}
+
+// static
+string HTTPUpload::WideToMBCP(const wstring &wide, unsigned int cp) {
+ if (wide.length() == 0) {
+ return string();
+ }
+
+ // compute the length of the buffer we'll need
+ int charcount = WideCharToMultiByte(cp, 0, wide.c_str(), -1,
+ NULL, 0, NULL, NULL);
+ if (charcount == 0) {
+ return string();
+ }
+
+ // convert
+ char *buf = new char[charcount];
+ WideCharToMultiByte(cp, 0, wide.c_str(), -1, buf, charcount,
+ NULL, NULL);
+
+ string result(buf);
+ delete[] buf;
+ return result;
+}
+
+// static
+bool HTTPUpload::CheckParameters(const map<wstring, wstring> &parameters) {
+ for (map<wstring, wstring>::const_iterator pos = parameters.begin();
+ pos != parameters.end(); ++pos) {
+ const wstring &str = pos->first;
+ if (str.size() == 0) {
+ return false; // disallow empty parameter names
+ }
+ for (unsigned int i = 0; i < str.size(); ++i) {
+ wchar_t c = str[i];
+ if (c < 32 || c == '"' || c > 127) {
+ return false;
+ }
+ }
+ }
+ return true;
+}
+
+} // namespace google_breakpad
diff --git a/3rdParty/Breakpad/src/common/windows/http_upload.h b/3rdParty/Breakpad/src/common/windows/http_upload.h
new file mode 100644
index 0000000..f8d48cb
--- /dev/null
+++ b/3rdParty/Breakpad/src/common/windows/http_upload.h
@@ -0,0 +1,129 @@
+// Copyright (c) 2006, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// HTTPUpload provides a "nice" API to send a multipart HTTP(S) POST
+// request using wininet. It currently supports requests that contain
+// a set of string parameters (key/value pairs), and a file to upload.
+
+#ifndef COMMON_WINDOWS_HTTP_UPLOAD_H_
+#define COMMON_WINDOWS_HTTP_UPLOAD_H_
+
+#pragma warning(push)
+// Disable exception handler warnings.
+#pragma warning(disable : 4530)
+
+#include <windows.h>
+#include <wininet.h>
+
+#include <map>
+#include <string>
+#include <vector>
+
+namespace google_breakpad {
+
+using std::string;
+using std::wstring;
+using std::map;
+using std::vector;
+
+class HTTPUpload {
+ public:
+ // Sends the given sets of parameters and files as a multipart POST
+ // request to the given URL.
+ // Each key in |files| is the name of the file part of the request
+ // (i.e. it corresponds to the name= attribute on an <input type="file">.
+ // Parameter names must contain only printable ASCII characters,
+ // and may not contain a quote (") character.
+ // Only HTTP(S) URLs are currently supported. Returns true on success.
+ // If the request is successful and response_body is non-NULL,
+ // the response body will be returned in response_body.
+ // If response_code is non-NULL, it will be set to the HTTP response code
+ // received (or 0 if the request failed before getting an HTTP response).
+ static bool SendRequest(const wstring &url,
+ const map<wstring, wstring> &parameters,
+ const map<wstring, wstring> &files,
+ int *timeout,
+ wstring *response_body,
+ int *response_code);
+
+ private:
+ class AutoInternetHandle;
+
+ // Retrieves the HTTP response. If NULL is passed in for response,
+ // this merely checks (via the return value) that we were successfully
+ // able to retrieve exactly as many bytes of content in the response as
+ // were specified in the Content-Length header.
+ static bool ReadResponse(HINTERNET request, wstring* response);
+
+ // Generates a new multipart boundary for a POST request
+ static wstring GenerateMultipartBoundary();
+
+ // Generates a HTTP request header for a multipart form submit.
+ static wstring GenerateRequestHeader(const wstring &boundary);
+
+ // Given a set of parameters, a set of upload files, and a file part name,
+ // generates a multipart request body string with these parameters
+ // and minidump contents. Returns true on success.
+ static bool GenerateRequestBody(const map<wstring, wstring> &parameters,
+ const map<wstring, wstring> &files,
+ const wstring &boundary,
+ string *request_body);
+
+ // Fills the supplied vector with the contents of filename.
+ static bool GetFileContents(const wstring &filename, vector<char> *contents);
+
+ // Converts a UTF8 string to UTF16.
+ static wstring UTF8ToWide(const string &utf8);
+
+ // Converts a UTF16 string to UTF8.
+ static string WideToUTF8(const wstring &wide) {
+ return WideToMBCP(wide, CP_UTF8);
+ }
+
+ // Converts a UTF16 string to specified code page.
+ static string WideToMBCP(const wstring &wide, unsigned int cp);
+
+ // Checks that the given list of parameters has only printable
+ // ASCII characters in the parameter name, and does not contain
+ // any quote (") characters. Returns true if so.
+ static bool CheckParameters(const map<wstring, wstring> &parameters);
+
+ // No instances of this class should be created.
+ // Disallow all constructors, destructors, and operator=.
+ HTTPUpload();
+ explicit HTTPUpload(const HTTPUpload &);
+ void operator=(const HTTPUpload &);
+ ~HTTPUpload();
+};
+
+} // namespace google_breakpad
+
+#pragma warning(pop)
+
+#endif // COMMON_WINDOWS_HTTP_UPLOAD_H_
diff --git a/3rdParty/Breakpad/src/common/windows/omap.cc b/3rdParty/Breakpad/src/common/windows/omap.cc
new file mode 100644
index 0000000..ba3ce86
--- /dev/null
+++ b/3rdParty/Breakpad/src/common/windows/omap.cc
@@ -0,0 +1,716 @@
+// Copyright 2013 Google Inc. All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// This contains a suite of tools for transforming symbol information when
+// when that information has been extracted from a PDB containing OMAP
+// information.
+
+// OMAP information is a lightweight description of a mapping between two
+// address spaces. It consists of two streams, each of them a vector 2-tuples.
+// The OMAPTO stream contains tuples of the form
+//
+// (RVA in transformed image, RVA in original image)
+//
+// while the OMAPFROM stream contains tuples of the form
+//
+// (RVA in original image, RVA in transformed image)
+//
+// The entries in each vector are sorted by the first value of the tuple, and
+// the lengths associated with a mapping are implicit as the distance between
+// two successive addresses in the vector.
+
+// Consider a trivial 10-byte function described by the following symbol:
+//
+// Function: RVA 0x00001000, length 10, "foo"
+//
+// Now consider the same function, but with 5-bytes of instrumentation injected
+// at offset 5. The OMAP streams describing this would look like:
+//
+// OMAPTO : [ [0x00001000, 0x00001000],
+// [0x00001005, 0xFFFFFFFF],
+// [0x0000100a, 0x00001005] ]
+// OMAPFROM: [ [0x00001000, 0x00001000],
+// [0x00001005, 0x0000100a] ]
+//
+// In this case the injected code has been marked as not originating in the
+// source image, and thus it will have no symbol information at all. However,
+// the injected code may also be associated with an original address range;
+// for example, when prepending instrumentation to a basic block the
+// instrumentation can be labelled as originating from the same source BB such
+// that symbol resolution will still find the appropriate source code line
+// number. In this case the OMAP stream would look like:
+//
+// OMAPTO : [ [0x00001000, 0x00001000],
+// [0x00001005, 0x00001005],
+// [0x0000100a, 0x00001005] ]
+// OMAPFROM: [ [0x00001000, 0x00001000],
+// [0x00001005, 0x0000100a] ]
+//
+// Suppose we asked DIA to lookup the symbol at location 0x0000100a of the
+// instrumented image. It would first run this through the OMAPTO table and
+// translate that address to 0x00001005. It would then lookup the symbol
+// at that address and return the symbol for the function "foo". This is the
+// correct result.
+//
+// However, if we query DIA for the length and address of the symbol it will
+// tell us that it has length 10 and is at RVA 0x00001000. The location is
+// correct, but the length doesn't take into account the 5-bytes of injected
+// code. Symbol resolution works (starting from an instrumented address,
+// mapping to an original address, and looking up a symbol), but the symbol
+// metadata is incorrect.
+//
+// If we dump the symbols using DIA they will have their addresses
+// appropriately transformed and reflect positions in the instrumented image.
+// However, if we try to do a lookup using those symbols resolution can fail.
+// For example, the address 0x0000100a will not map to the symbol for "foo",
+// because DIA tells us it is at location 0x00001000 (correct) with length
+// 10 (incorrect). The problem is one of order of operations: in this case
+// we're attempting symbol resolution by looking up an instrumented address
+// in the table of translated symbols.
+//
+// One way to handle this is to dump the OMAP information as part of the
+// breakpad symbols. This requires the rest of the toolchain to be aware of
+// OMAP information and to use it when present prior to performing lookup. The
+// other option is to properly transform the symbols (updating length as well as
+// position) so that resolution will work as expected for translated addresses.
+// This is transparent to the rest of the toolchain.
+
+#include "common/windows/omap.h"
+
+#include <atlbase.h>
+
+#include <algorithm>
+#include <cassert>
+#include <set>
+
+#include "common/windows/dia_util.h"
+
+namespace google_breakpad {
+
+namespace {
+
+static const wchar_t kOmapToDebugStreamName[] = L"OMAPTO";
+static const wchar_t kOmapFromDebugStreamName[] = L"OMAPFROM";
+
+// Dependending on where this is used in breakpad we sometimes get min/max from
+// windef, and other times from algorithm. To get around this we simply
+// define our own min/max functions.
+template<typename T>
+const T& Min(const T& t1, const T& t2) { return t1 < t2 ? t1 : t2; }
+template<typename T>
+const T& Max(const T& t1, const T& t2) { return t1 > t2 ? t1 : t2; }
+
+// It makes things more readable to have two different OMAP types. We cast
+// normal OMAPs into these. They must be the same size as the OMAP structure
+// for this to work, hence the static asserts.
+struct OmapOrigToTran {
+ DWORD rva_original;
+ DWORD rva_transformed;
+};
+struct OmapTranToOrig {
+ DWORD rva_transformed;
+ DWORD rva_original;
+};
+static_assert(sizeof(OmapOrigToTran) == sizeof(OMAP),
+ "OmapOrigToTran must have same size as OMAP.");
+static_assert(sizeof(OmapTranToOrig) == sizeof(OMAP),
+ "OmapTranToOrig must have same size as OMAP.");
+typedef std::vector<OmapOrigToTran> OmapFromTable;
+typedef std::vector<OmapTranToOrig> OmapToTable;
+
+// Used for sorting and searching through a Mapping.
+bool MappedRangeOriginalLess(const MappedRange& lhs, const MappedRange& rhs) {
+ if (lhs.rva_original < rhs.rva_original)
+ return true;
+ if (lhs.rva_original > rhs.rva_original)
+ return false;
+ return lhs.length < rhs.length;
+}
+bool MappedRangeMappedLess(const MappedRange& lhs, const MappedRange& rhs) {
+ if (lhs.rva_transformed < rhs.rva_transformed)
+ return true;
+ if (lhs.rva_transformed > rhs.rva_transformed)
+ return false;
+ return lhs.length < rhs.length;
+}
+
+// Used for searching through the EndpointIndexMap.
+bool EndpointIndexLess(const EndpointIndex& ei1, const EndpointIndex& ei2) {
+ return ei1.endpoint < ei2.endpoint;
+}
+
+// Finds the debug stream with the given |name| in the given |session|, and
+// populates |table| with its contents. Casts the data directly into OMAP
+// structs.
+bool FindAndLoadOmapTable(const wchar_t* name,
+ IDiaSession* session,
+ OmapTable* table) {
+ assert(name != NULL);
+ assert(session != NULL);
+ assert(table != NULL);
+
+ CComPtr<IDiaEnumDebugStreamData> stream;
+ if (!FindDebugStream(name, session, &stream))
+ return false;
+ assert(stream.p != NULL);
+
+ LONG count = 0;
+ if (FAILED(stream->get_Count(&count))) {
+ fprintf(stderr, "IDiaEnumDebugStreamData::get_Count failed for stream "
+ "\"%ws\"\n", name);
+ return false;
+ }
+
+ // Get the length of the stream in bytes.
+ DWORD bytes_read = 0;
+ ULONG count_read = 0;
+ if (FAILED(stream->Next(count, 0, &bytes_read, NULL, &count_read))) {
+ fprintf(stderr, "IDiaEnumDebugStreamData::Next failed while reading "
+ "length of stream \"%ws\"\n", name);
+ return false;
+ }
+
+ // Ensure it's consistent with the OMAP data type.
+ DWORD bytes_expected = count * sizeof(OmapTable::value_type);
+ if (count * sizeof(OmapTable::value_type) != bytes_read) {
+ fprintf(stderr, "DIA debug stream \"%ws\" has an unexpected length", name);
+ return false;
+ }
+
+ // Read the table.
+ table->resize(count);
+ bytes_read = 0;
+ count_read = 0;
+ if (FAILED(stream->Next(count, bytes_expected, &bytes_read,
+ reinterpret_cast<BYTE*>(&table->at(0)),
+ &count_read))) {
+ fprintf(stderr, "IDiaEnumDebugStreamData::Next failed while reading "
+ "data from stream \"%ws\"\n", name);
+ return false;
+ }
+
+ return true;
+}
+
+// This determines the original image length by looking through the segment
+// table.
+bool GetOriginalImageLength(IDiaSession* session, DWORD* image_length) {
+ assert(session != NULL);
+ assert(image_length != NULL);
+
+ CComPtr<IDiaEnumSegments> enum_segments;
+ if (!FindTable(session, &enum_segments))
+ return false;
+ assert(enum_segments.p != NULL);
+
+ DWORD temp_image_length = 0;
+ CComPtr<IDiaSegment> segment;
+ ULONG fetched = 0;
+ while (SUCCEEDED(enum_segments->Next(1, &segment, &fetched)) &&
+ fetched == 1) {
+ assert(segment.p != NULL);
+
+ DWORD rva = 0;
+ DWORD length = 0;
+ DWORD frame = 0;
+ if (FAILED(segment->get_relativeVirtualAddress(&rva)) ||
+ FAILED(segment->get_length(&length)) ||
+ FAILED(segment->get_frame(&frame))) {
+ fprintf(stderr, "Failed to get basic properties for IDiaSegment\n");
+ return false;
+ }
+
+ if (frame > 0) {
+ DWORD segment_end = rva + length;
+ if (segment_end > temp_image_length)
+ temp_image_length = segment_end;
+ }
+ segment.Release();
+ }
+
+ *image_length = temp_image_length;
+ return true;
+}
+
+// Detects regions of the original image that have been removed in the
+// transformed image, and sets the 'removed' property on all mapped ranges
+// immediately preceding a gap. The mapped ranges must be sorted by
+// 'rva_original'.
+void FillInRemovedLengths(Mapping* mapping) {
+ assert(mapping != NULL);
+
+ // Find and fill gaps. We do this with two sweeps. We first sweep forward
+ // looking for gaps. When we identify a gap we then sweep forward with a
+ // second scan and set the 'removed' property for any intervals that
+ // immediately precede the gap.
+ //
+ // Gaps are typically between two successive intervals, but not always:
+ //
+ // Range 1: ---------------
+ // Range 2: -------
+ // Range 3: -------------
+ // Gap : ******
+ //
+ // In the above example the gap is between range 1 and range 3. A forward
+ // sweep finds the gap, and a second forward sweep identifies that range 1
+ // immediately precedes the gap and sets its 'removed' property.
+
+ size_t fill = 0;
+ DWORD rva_front = 0;
+ for (size_t find = 0; find < mapping->size(); ++find) {
+#ifndef NDEBUG
+ // We expect the mapped ranges to be sorted by 'rva_original'.
+ if (find > 0) {
+ assert(mapping->at(find - 1).rva_original <=
+ mapping->at(find).rva_original);
+ }
+#endif
+
+ if (rva_front < mapping->at(find).rva_original) {
+ // We've found a gap. Fill it in by setting the 'removed' property for
+ // any affected intervals.
+ DWORD removed = mapping->at(find).rva_original - rva_front;
+ for (; fill < find; ++fill) {
+ if (mapping->at(fill).rva_original + mapping->at(fill).length !=
+ rva_front) {
+ continue;
+ }
+
+ // This interval ends right where the gap starts. It needs to have its
+ // 'removed' information filled in.
+ mapping->at(fill).removed = removed;
+ }
+ }
+
+ // Advance the front that indicates the covered portion of the image.
+ rva_front = mapping->at(find).rva_original + mapping->at(find).length;
+ }
+}
+
+// Builds a unified view of the mapping between the original and transformed
+// image space by merging OMAPTO and OMAPFROM data.
+void BuildMapping(const OmapData& omap_data, Mapping* mapping) {
+ assert(mapping != NULL);
+
+ mapping->clear();
+
+ if (omap_data.omap_from.empty() || omap_data.omap_to.empty())
+ return;
+
+ // The names 'omap_to' and 'omap_from' are awfully confusing, so we make
+ // ourselves more explicit here. This cast is only safe because the underlying
+ // types have the exact same size.
+ const OmapToTable& tran2orig =
+ reinterpret_cast<const OmapToTable&>(omap_data.omap_to);
+ const OmapFromTable& orig2tran = reinterpret_cast<const OmapFromTable&>(
+ omap_data.omap_from);
+
+ // Handle the range of data at the beginning of the image. This is not usually
+ // specified by the OMAP data.
+ if (tran2orig[0].rva_transformed > 0 && orig2tran[0].rva_original > 0) {
+ DWORD header_transformed = tran2orig[0].rva_transformed;
+ DWORD header_original = orig2tran[0].rva_original;
+ DWORD header = Min(header_transformed, header_original);
+
+ MappedRange mr = {};
+ mr.length = header;
+ mr.injected = header_transformed - header;
+ mr.removed = header_original - header;
+ mapping->push_back(mr);
+ }
+
+ // Convert the implied lengths to explicit lengths, and infer which content
+ // has been injected into the transformed image. Injected content is inferred
+ // as regions of the transformed address space that does not map back to
+ // known valid content in the original image.
+ for (size_t i = 0; i < tran2orig.size(); ++i) {
+ const OmapTranToOrig& o1 = tran2orig[i];
+
+ // This maps to content that is outside the original image, thus it
+ // describes injected content. We can skip this entry.
+ if (o1.rva_original >= omap_data.length_original)
+ continue;
+
+ // Calculate the length of the current OMAP entry. This is implicit as the
+ // distance between successive |rva| values, capped at the end of the
+ // original image.
+ DWORD length = 0;
+ if (i + 1 < tran2orig.size()) {
+ const OmapTranToOrig& o2 = tran2orig[i + 1];
+
+ // We expect the table to be sorted by rva_transformed.
+ assert(o1.rva_transformed <= o2.rva_transformed);
+
+ length = o2.rva_transformed - o1.rva_transformed;
+ if (o1.rva_original + length > omap_data.length_original) {
+ length = omap_data.length_original - o1.rva_original;
+ }
+ } else {
+ length = omap_data.length_original - o1.rva_original;
+ }
+
+ // Zero-length entries don't describe anything and can be ignored.
+ if (length == 0)
+ continue;
+
+ // Any gaps in the transformed address-space are due to injected content.
+ if (!mapping->empty()) {
+ MappedRange& prev_mr = mapping->back();
+ prev_mr.injected += o1.rva_transformed -
+ (prev_mr.rva_transformed + prev_mr.length);
+ }
+
+ MappedRange mr = {};
+ mr.rva_original = o1.rva_original;
+ mr.rva_transformed = o1.rva_transformed;
+ mr.length = length;
+ mapping->push_back(mr);
+ }
+
+ // Sort based on the original image addresses.
+ std::sort(mapping->begin(), mapping->end(), MappedRangeOriginalLess);
+
+ // Fill in the 'removed' lengths by looking for gaps in the coverage of the
+ // original address space.
+ FillInRemovedLengths(mapping);
+
+ return;
+}
+
+void BuildEndpointIndexMap(ImageMap* image_map) {
+ assert(image_map != NULL);
+
+ if (image_map->mapping.size() == 0)
+ return;
+
+ const Mapping& mapping = image_map->mapping;
+ EndpointIndexMap& eim = image_map->endpoint_index_map;
+
+ // Get the unique set of interval endpoints.
+ std::set<DWORD> endpoints;
+ for (size_t i = 0; i < mapping.size(); ++i) {
+ endpoints.insert(mapping[i].rva_original);
+ endpoints.insert(mapping[i].rva_original +
+ mapping[i].length +
+ mapping[i].removed);
+ }
+
+ // Use the endpoints to initialize the secondary search structure for the
+ // mapping.
+ eim.resize(endpoints.size());
+ std::set<DWORD>::const_iterator it = endpoints.begin();
+ for (size_t i = 0; it != endpoints.end(); ++it, ++i) {
+ eim[i].endpoint = *it;
+ eim[i].index = mapping.size();
+ }
+
+ // For each endpoint we want the smallest index of any interval containing
+ // it. We iterate over the intervals and update the indices associated with
+ // each interval endpoint contained in the current interval. In the general
+ // case of an arbitrary set of intervals this is O(n^2), but the structure of
+ // OMAP data makes this O(n).
+ for (size_t i = 0; i < mapping.size(); ++i) {
+ EndpointIndex ei1 = { mapping[i].rva_original, 0 };
+ EndpointIndexMap::iterator it1 = std::lower_bound(
+ eim.begin(), eim.end(), ei1, EndpointIndexLess);
+
+ EndpointIndex ei2 = { mapping[i].rva_original + mapping[i].length +
+ mapping[i].removed, 0 };
+ EndpointIndexMap::iterator it2 = std::lower_bound(
+ eim.begin(), eim.end(), ei2, EndpointIndexLess);
+
+ for (; it1 != it2; ++it1)
+ it1->index = Min(i, it1->index);
+ }
+}
+
+void BuildSubsequentRVAMap(const OmapData &omap_data,
+ std::map<DWORD, DWORD> *subsequent) {
+ assert(subsequent->empty());
+ const OmapFromTable &orig2tran =
+ reinterpret_cast<const OmapFromTable &>(omap_data.omap_from);
+
+ if (orig2tran.empty())
+ return;
+
+ for (size_t i = 0; i < orig2tran.size() - 1; ++i) {
+ // Expect that orig2tran is sorted.
+ if (orig2tran[i].rva_original >= orig2tran[i + 1].rva_original) {
+ fprintf(stderr, "OMAP 'from' table unexpectedly unsorted\n");
+ subsequent->clear();
+ return;
+ }
+ subsequent->insert(std::make_pair(orig2tran[i].rva_original,
+ orig2tran[i + 1].rva_original));
+ }
+}
+
+// Clips the given mapped range.
+void ClipMappedRangeOriginal(const AddressRange& clip_range,
+ MappedRange* mapped_range) {
+ assert(mapped_range != NULL);
+
+ // The clipping range is entirely outside of the mapped range.
+ if (clip_range.end() <= mapped_range->rva_original ||
+ mapped_range->rva_original + mapped_range->length +
+ mapped_range->removed <= clip_range.rva) {
+ mapped_range->length = 0;
+ mapped_range->injected = 0;
+ mapped_range->removed = 0;
+ return;
+ }
+
+ // Clip the left side.
+ if (mapped_range->rva_original < clip_range.rva) {
+ DWORD clip_left = clip_range.rva - mapped_range->rva_original;
+ mapped_range->rva_original += clip_left;
+ mapped_range->rva_transformed += clip_left;
+
+ if (clip_left > mapped_range->length) {
+ // The left clipping boundary entirely erases the content section of the
+ // range.
+ DWORD trim = clip_left - mapped_range->length;
+ mapped_range->length = 0;
+ mapped_range->injected -= Min(trim, mapped_range->injected);
+ // We know that trim <= mapped_range->remove.
+ mapped_range->removed -= trim;
+ } else {
+ // The left clipping boundary removes some, but not all, of the content.
+ // As such it leaves the removed/injected component intact.
+ mapped_range->length -= clip_left;
+ }
+ }
+
+ // Clip the right side.
+ DWORD end_original = mapped_range->rva_original + mapped_range->length;
+ if (clip_range.end() < end_original) {
+ // The right clipping boundary lands in the 'content' section of the range,
+ // entirely clearing the injected/removed portion.
+ DWORD clip_right = end_original - clip_range.end();
+ mapped_range->length -= clip_right;
+ mapped_range->injected = 0;
+ mapped_range->removed = 0;
+ return;
+ } else {
+ // The right clipping boundary is outside of the content, but may affect
+ // the removed/injected portion of the range.
+ DWORD end_removed = end_original + mapped_range->removed;
+ if (clip_range.end() < end_removed)
+ mapped_range->removed = clip_range.end() - end_original;
+
+ DWORD end_injected = end_original + mapped_range->injected;
+ if (clip_range.end() < end_injected)
+ mapped_range->injected = clip_range.end() - end_original;
+ }
+
+ return;
+}
+
+} // namespace
+
+int AddressRange::Compare(const AddressRange& rhs) const {
+ if (end() <= rhs.rva)
+ return -1;
+ if (rhs.end() <= rva)
+ return 1;
+ return 0;
+}
+
+bool GetOmapDataAndDisableTranslation(IDiaSession* session,
+ OmapData* omap_data) {
+ assert(session != NULL);
+ assert(omap_data != NULL);
+
+ CComPtr<IDiaAddressMap> address_map;
+ if (FAILED(session->QueryInterface(&address_map))) {
+ fprintf(stderr, "IDiaSession::QueryInterface(IDiaAddressMap) failed\n");
+ return false;
+ }
+ assert(address_map.p != NULL);
+
+ BOOL omap_enabled = FALSE;
+ if (FAILED(address_map->get_addressMapEnabled(&omap_enabled))) {
+ fprintf(stderr, "IDiaAddressMap::get_addressMapEnabled failed\n");
+ return false;
+ }
+
+ if (!omap_enabled) {
+ // We indicate the non-presence of OMAP data by returning empty tables.
+ omap_data->omap_from.clear();
+ omap_data->omap_to.clear();
+ omap_data->length_original = 0;
+ return true;
+ }
+
+ // OMAP data is present. Disable translation.
+ if (FAILED(address_map->put_addressMapEnabled(FALSE))) {
+ fprintf(stderr, "IDiaAddressMap::put_addressMapEnabled failed\n");
+ return false;
+ }
+
+ // Read the OMAP streams.
+ if (!FindAndLoadOmapTable(kOmapFromDebugStreamName,
+ session,
+ &omap_data->omap_from)) {
+ return false;
+ }
+ if (!FindAndLoadOmapTable(kOmapToDebugStreamName,
+ session,
+ &omap_data->omap_to)) {
+ return false;
+ }
+
+ // Get the lengths of the address spaces.
+ if (!GetOriginalImageLength(session, &omap_data->length_original))
+ return false;
+
+ return true;
+}
+
+void BuildImageMap(const OmapData& omap_data, ImageMap* image_map) {
+ assert(image_map != NULL);
+
+ BuildMapping(omap_data, &image_map->mapping);
+ BuildEndpointIndexMap(image_map);
+ BuildSubsequentRVAMap(omap_data, &image_map->subsequent_rva_block);
+}
+
+void MapAddressRange(const ImageMap& image_map,
+ const AddressRange& original_range,
+ AddressRangeVector* mapped_ranges) {
+ assert(mapped_ranges != NULL);
+
+ const Mapping& map = image_map.mapping;
+
+ // Handle the trivial case of an empty image_map. This means that there is
+ // no transformation to be applied, and we can simply return the original
+ // range.
+ if (map.empty()) {
+ mapped_ranges->push_back(original_range);
+ return;
+ }
+
+ // If we get a query of length 0 we need to handle it by using a non-zero
+ // query length.
+ AddressRange query_range(original_range);
+ if (query_range.length == 0)
+ query_range.length = 1;
+
+ // Find the range of intervals that can potentially intersect our query range.
+ size_t imin = 0;
+ size_t imax = 0;
+ {
+ // The index of the earliest possible range that can affect is us done by
+ // searching through the secondary indexing structure.
+ const EndpointIndexMap& eim = image_map.endpoint_index_map;
+ EndpointIndex q1 = { query_range.rva, 0 };
+ EndpointIndexMap::const_iterator it1 = std::lower_bound(
+ eim.begin(), eim.end(), q1, EndpointIndexLess);
+ if (it1 == eim.end()) {
+ imin = map.size();
+ } else {
+ // Backup to find the interval that contains our query point.
+ if (it1 != eim.begin() && query_range.rva < it1->endpoint)
+ --it1;
+ imin = it1->index;
+ }
+
+ // The first range that can't possibly intersect us is found by searching
+ // through the image map directly as it is already sorted by interval start
+ // point.
+ MappedRange q2 = { query_range.end(), 0 };
+ Mapping::const_iterator it2 = std::lower_bound(
+ map.begin(), map.end(), q2, MappedRangeOriginalLess);
+ imax = it2 - map.begin();
+ }
+
+ // Find all intervals that intersect the query range.
+ Mapping temp_map;
+ for (size_t i = imin; i < imax; ++i) {
+ MappedRange mr = map[i];
+ ClipMappedRangeOriginal(query_range, &mr);
+ if (mr.length + mr.injected > 0)
+ temp_map.push_back(mr);
+ }
+
+ // If there are no intersecting ranges then the query range has been removed
+ // from the image in question.
+ if (temp_map.empty())
+ return;
+
+ // Sort based on transformed addresses.
+ std::sort(temp_map.begin(), temp_map.end(), MappedRangeMappedLess);
+
+ // Zero-length queries can't actually be merged. We simply output the set of
+ // unique RVAs that correspond to the query RVA.
+ if (original_range.length == 0) {
+ mapped_ranges->push_back(AddressRange(temp_map[0].rva_transformed, 0));
+ for (size_t i = 1; i < temp_map.size(); ++i) {
+ if (temp_map[i].rva_transformed > mapped_ranges->back().rva)
+ mapped_ranges->push_back(AddressRange(temp_map[i].rva_transformed, 0));
+ }
+ return;
+ }
+
+ // Merge any ranges that are consecutive in the mapped image. We merge over
+ // injected content if it makes ranges contiguous, but we ignore any injected
+ // content at the tail end of a range. This allows us to detect symbols that
+ // have been lengthened by injecting content in the middle. However, it
+ // misses the case where content has been injected at the head or the tail.
+ // The problem is that it doesn't know whether to attribute it to the
+ // preceding or following symbol. It is up to the author of the transform to
+ // output explicit OMAP info in these cases to ensure full coverage of the
+ // transformed address space.
+ DWORD rva_begin = temp_map[0].rva_transformed;
+ DWORD rva_cur_content = rva_begin + temp_map[0].length;
+ DWORD rva_cur_injected = rva_cur_content + temp_map[0].injected;
+ for (size_t i = 1; i < temp_map.size(); ++i) {
+ if (rva_cur_injected < temp_map[i].rva_transformed) {
+ // This marks the end of a continuous range in the image. Output the
+ // current range and start a new one.
+ if (rva_begin < rva_cur_content) {
+ mapped_ranges->push_back(
+ AddressRange(rva_begin, rva_cur_content - rva_begin));
+ }
+ rva_begin = temp_map[i].rva_transformed;
+ }
+
+ rva_cur_content = temp_map[i].rva_transformed + temp_map[i].length;
+ rva_cur_injected = rva_cur_content + temp_map[i].injected;
+ }
+
+ // Output the range in progress.
+ if (rva_begin < rva_cur_content) {
+ mapped_ranges->push_back(
+ AddressRange(rva_begin, rva_cur_content - rva_begin));
+ }
+
+ return;
+}
+
+} // namespace google_breakpad
diff --git a/3rdParty/Breakpad/src/common/windows/omap.h b/3rdParty/Breakpad/src/common/windows/omap.h
new file mode 100644
index 0000000..bc293af
--- /dev/null
+++ b/3rdParty/Breakpad/src/common/windows/omap.h
@@ -0,0 +1,72 @@
+// Copyright 2013 Google Inc. All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// Provides an API for mapping symbols through OMAP information, if a PDB file
+// is augmented with it. This allows breakpad to work with addresses in
+// transformed images by transforming the symbols themselves, rather than
+// transforming addresses prior to querying symbols (the way it is typically
+// done by Windows-native tools, including the DIA).
+
+#ifndef COMMON_WINDOWS_OMAP_H_
+#define COMMON_WINDOWS_OMAP_H_
+
+#include "common/windows/omap_internal.h"
+
+namespace google_breakpad {
+
+// If the given session contains OMAP data this extracts it, populating
+// |omap_data|, and then disabling automatic translation for the session.
+// OMAP data is present in the PDB if |omap_data| is not empty. This returns
+// true on success, false otherwise.
+bool GetOmapDataAndDisableTranslation(IDiaSession* dia_session,
+ OmapData* omap_data);
+
+// Given raw OMAP data builds an ImageMap. This can be used to query individual
+// image ranges using MapAddressRange.
+// |omap_data|| is the OMAP data extracted from the PDB.
+// |image_map| will be populated with a description of the image mapping. If
+// |omap_data| is empty then this will also be empty.
+void BuildImageMap(const OmapData& omap_data, ImageMap* image_map);
+
+// Given an address range in the original image space determines how exactly it
+// has been tranformed.
+// |omap_data| is the OMAP data extracted from the PDB, which must not be
+// empty.
+// |original_range| is the address range in the original image being queried.
+// |mapped_ranges| will be populated with a full description of the mapping.
+// They may be disjoint in the transformed image so a vector is needed to
+// fully represent the mapping. This will be appended to if it is not
+// empty. If |omap_data| is empty then |mapped_ranges| will simply be
+// populated with a copy of |original_range| (the identity transform).
+void MapAddressRange(const ImageMap& image_map,
+ const AddressRange& original_range,
+ AddressRangeVector* mapped_ranges);
+
+} // namespace google_breakpad
+
+#endif // COMMON_WINDOWS_OMAP_H_
diff --git a/3rdParty/Breakpad/src/common/windows/omap_internal.h b/3rdParty/Breakpad/src/common/windows/omap_internal.h
new file mode 100644
index 0000000..2a4713d
--- /dev/null
+++ b/3rdParty/Breakpad/src/common/windows/omap_internal.h
@@ -0,0 +1,140 @@
+// Copyright 2013 Google Inc. All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// Declares internal implementation details for functionality in omap.h and
+// omap.cc.
+
+#ifndef COMMON_WINDOWS_OMAP_INTERNAL_H_
+#define COMMON_WINDOWS_OMAP_INTERNAL_H_
+
+#include <windows.h>
+#include <dia2.h>
+
+#include <map>
+#include <vector>
+
+namespace google_breakpad {
+
+// The OMAP struct is defined by debughlp.h, which doesn't play nicely with
+// imagehlp.h. We simply redefine it.
+struct OMAP {
+ DWORD rva;
+ DWORD rvaTo;
+};
+static_assert(sizeof(OMAP) == 8, "Wrong size for OMAP structure.");
+typedef std::vector<OMAP> OmapTable;
+
+// This contains the OMAP data extracted from an image.
+struct OmapData {
+ // The table of OMAP entries describing the transformation from the
+ // original image to the transformed image.
+ OmapTable omap_from;
+ // The table of OMAP entries describing the transformation from the
+ // instrumented image to the original image.
+ OmapTable omap_to;
+ // The length of the original untransformed image.
+ DWORD length_original;
+
+ OmapData() : length_original(0) { }
+};
+
+// This represents a range of addresses in an image.
+struct AddressRange {
+ DWORD rva;
+ DWORD length;
+
+ AddressRange() : rva(0), length(0) { }
+ AddressRange(DWORD rva, DWORD length) : rva(rva), length(length) { }
+
+ // Returns the end address of this range.
+ DWORD end() const { return rva + length; }
+
+ // Addreses only compare as less-than or greater-than if they are not
+ // overlapping. Otherwise, they compare equal.
+ int Compare(const AddressRange& rhs) const;
+ bool operator<(const AddressRange& rhs) const { return Compare(rhs) == -1; }
+ bool operator>(const AddressRange& rhs) const { return Compare(rhs) == 1; }
+
+ // Equality operators compare exact values.
+ bool operator==(const AddressRange& rhs) const {
+ return rva == rhs.rva && length == rhs.length;
+ }
+ bool operator!=(const AddressRange& rhs) const { return !((*this) == rhs); }
+};
+
+typedef std::vector<AddressRange> AddressRangeVector;
+
+// This represents an address range in an original image, and its corresponding
+// range in the transformed image.
+struct MappedRange {
+ // An address in the original image.
+ DWORD rva_original;
+ // The corresponding addresses in the transformed image.
+ DWORD rva_transformed;
+ // The length of the address range.
+ DWORD length;
+ // It is possible for code to be injected into a transformed image, for which
+ // there is no corresponding code in the original image. If this range of
+ // transformed image is immediately followed by such injected code we maintain
+ // a record of its length here.
+ DWORD injected;
+ // It is possible for code to be removed from the original image. This happens
+ // for things like padding between blocks. There is no actual content lost,
+ // but the spacing between items may be lost. This keeps track of any removed
+ // content immediately following the |original| range.
+ DWORD removed;
+};
+// A vector of mapped ranges is used as a more useful representation of
+// OMAP data.
+typedef std::vector<MappedRange> Mapping;
+
+// Used as a secondary search structure accompanying a Mapping.
+struct EndpointIndex {
+ DWORD endpoint;
+ size_t index;
+};
+typedef std::vector<EndpointIndex> EndpointIndexMap;
+
+// An ImageMap is vector of mapped ranges, plus a secondary index into it for
+// doing interval searches. (An interval tree would also work, but is overkill
+// because we don't need insertion and deletion.)
+struct ImageMap {
+ // This is a description of the mapping between original and transformed
+ // image, sorted by addresses in the original image.
+ Mapping mapping;
+ // For all interval endpoints in |mapping| this stores the minimum index of
+ // an interval in |mapping| that contains the endpoint. Useful for doing
+ // interval intersection queries.
+ EndpointIndexMap endpoint_index_map;
+
+ std::map<DWORD, DWORD> subsequent_rva_block;
+};
+
+} // namespace google_breakpad
+
+#endif // COMMON_WINDOWS_OMAP_INTERNAL_H_
diff --git a/3rdParty/Breakpad/src/common/windows/omap_unittest.cc b/3rdParty/Breakpad/src/common/windows/omap_unittest.cc
new file mode 100644
index 0000000..b244334
--- /dev/null
+++ b/3rdParty/Breakpad/src/common/windows/omap_unittest.cc
@@ -0,0 +1,329 @@
+// Copyright 2013 Google Inc. All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// Unittests for OMAP related functions.
+
+#include "common/windows/omap.h"
+
+#include "breakpad_googletest_includes.h"
+
+namespace google_breakpad {
+
+// Equality operators for ContainerEq. These must be outside of the anonymous
+// namespace in order for them to be found.
+bool operator==(const MappedRange& mr1, const MappedRange& mr2) {
+ return mr1.rva_original == mr2.rva_original &&
+ mr1.rva_transformed == mr2.rva_transformed &&
+ mr1.length == mr2.length &&
+ mr1.injected == mr2.injected &&
+ mr1.removed == mr2.removed;
+}
+bool operator==(const EndpointIndex& ei1, const EndpointIndex& ei2) {
+ return ei1.endpoint == ei2.endpoint && ei1.index == ei2.index;
+}
+
+// Pretty printers for more meaningful error messages. Also need to be outside
+// the anonymous namespace.
+std::ostream& operator<<(std::ostream& os, const MappedRange& mr) {
+ os << "MappedRange(rva_original=" << mr.rva_original
+ << ", rva_transformed=" << mr.rva_transformed
+ << ", length=" << mr.length
+ << ", injected=" << mr.injected
+ << ", removed=" << mr.removed << ")";
+ return os;
+}
+std::ostream& operator<<(std::ostream& os, const EndpointIndex& ei) {
+ os << "EndpointIndex(endpoint=" << ei.endpoint
+ << ", index=" << ei.index << ")";
+ return os;
+}
+std::ostream& operator<<(std::ostream& os, const AddressRange& ar) {
+ os << "AddressRange(rva=" << ar.rva << ", length=" << ar.length << ")";
+ return os;
+}
+
+namespace {
+
+OMAP CreateOmap(DWORD rva, DWORD rvaTo) {
+ OMAP o = { rva, rvaTo };
+ return o;
+}
+
+MappedRange CreateMappedRange(DWORD rva_original,
+ DWORD rva_transformed,
+ DWORD length,
+ DWORD injected,
+ DWORD removed) {
+ MappedRange mr = { rva_original, rva_transformed, length, injected, removed };
+ return mr;
+}
+
+EndpointIndex CreateEndpointIndex(DWORD endpoint, size_t index) {
+ EndpointIndex ei = { endpoint, index };
+ return ei;
+}
+
+// (C is removed)
+// Original : A B C D E F G H
+// Transformed: A B D F E * H1 G1 G2 H2
+// (* is injected, G is copied, H is split)
+// A is implied.
+
+// Layout of the original image.
+const AddressRange B(100, 15);
+const AddressRange C(B.end(), 10);
+const AddressRange D(C.end(), 25);
+const AddressRange E(D.end(), 10);
+const AddressRange F(E.end(), 40);
+const AddressRange G(F.end(), 3);
+const AddressRange H(G.end(), 7);
+
+// Layout of the transformed image.
+const AddressRange Bt(100, 15);
+const AddressRange Dt(Bt.end(), 20); // D is shortened.
+const AddressRange Ft(Dt.end(), F.length);
+const AddressRange Et(Ft.end(), E.length);
+const AddressRange injected(Et.end(), 5);
+const AddressRange H1t(injected.end(), 4); // H is split.
+const AddressRange G1t(H1t.end(), G.length); // G is copied.
+const AddressRange G2t(G1t.end(), G.length); // G is copied.
+const AddressRange H2t(G2t.end(), 3); // H is split.
+
+class BuildImageMapTest : public testing::Test {
+ public:
+ static const DWORD kInvalidAddress = 0xFFFFFFFF;
+
+ void InitOmapData() {
+ omap_data.length_original = H.end();
+
+ // Build the OMAPTO vector (from transformed to original).
+ omap_data.omap_to.push_back(CreateOmap(Bt.rva, B.rva));
+ omap_data.omap_to.push_back(CreateOmap(Dt.rva, D.rva));
+ omap_data.omap_to.push_back(CreateOmap(Ft.rva, F.rva));
+ omap_data.omap_to.push_back(CreateOmap(Et.rva, E.rva));
+ omap_data.omap_to.push_back(CreateOmap(injected.rva, kInvalidAddress));
+ omap_data.omap_to.push_back(CreateOmap(H1t.rva, H.rva));
+ omap_data.omap_to.push_back(CreateOmap(G1t.rva, G.rva));
+ omap_data.omap_to.push_back(CreateOmap(G2t.rva, G.rva));
+ omap_data.omap_to.push_back(CreateOmap(H2t.rva, H.rva + H1t.length));
+ omap_data.omap_to.push_back(CreateOmap(H2t.end(), kInvalidAddress));
+
+ // Build the OMAPFROM vector (from original to transformed).
+ omap_data.omap_from.push_back(CreateOmap(B.rva, Bt.rva));
+ omap_data.omap_from.push_back(CreateOmap(C.rva, kInvalidAddress));
+ omap_data.omap_from.push_back(CreateOmap(D.rva, Dt.rva));
+ omap_data.omap_from.push_back(CreateOmap(E.rva, Et.rva));
+ omap_data.omap_from.push_back(CreateOmap(F.rva, Ft.rva));
+ omap_data.omap_from.push_back(CreateOmap(G.rva, G1t.rva));
+ omap_data.omap_from.push_back(CreateOmap(H.rva, H1t.rva));
+ omap_data.omap_from.push_back(CreateOmap(H.rva + H1t.length, H2t.rva));
+ omap_data.omap_from.push_back(CreateOmap(H.end(), kInvalidAddress));
+ }
+
+ OmapData omap_data;
+};
+
+} // namespace
+
+TEST_F(BuildImageMapTest, EmptyImageMapOnEmptyOmapData) {
+ ASSERT_EQ(0u, omap_data.omap_from.size());
+ ASSERT_EQ(0u, omap_data.omap_to.size());
+ ASSERT_EQ(0u, omap_data.length_original);
+
+ ImageMap image_map;
+ BuildImageMap(omap_data, &image_map);
+ EXPECT_EQ(0u, image_map.mapping.size());
+ EXPECT_EQ(0u, image_map.endpoint_index_map.size());
+}
+
+TEST_F(BuildImageMapTest, ImageMapIsCorrect) {
+ InitOmapData();
+ ASSERT_LE(0u, omap_data.omap_from.size());
+ ASSERT_LE(0u, omap_data.omap_to.size());
+ ASSERT_LE(0u, omap_data.length_original);
+
+ ImageMap image_map;
+ BuildImageMap(omap_data, &image_map);
+ EXPECT_LE(9u, image_map.mapping.size());
+ EXPECT_LE(9u, image_map.endpoint_index_map.size());
+
+ Mapping mapping;
+ mapping.push_back(CreateMappedRange(0, 0, B.rva, 0, 0));
+ // C is removed, and it originally comes immediately after B.
+ mapping.push_back(CreateMappedRange(B.rva, Bt.rva, B.length, 0, C.length));
+ // D is shortened by a length of 5.
+ mapping.push_back(CreateMappedRange(D.rva, Dt.rva, Dt.length, 0, 5));
+ // The injected content comes immediately after E in the transformed image.
+ mapping.push_back(CreateMappedRange(E.rva, Et.rva, E.length, injected.length,
+ 0));
+ mapping.push_back(CreateMappedRange(F.rva, Ft.rva, F.length, 0, 0));
+ // G is copied so creates two entries.
+ mapping.push_back(CreateMappedRange(G.rva, G1t.rva, G.length, 0, 0));
+ mapping.push_back(CreateMappedRange(G.rva, G2t.rva, G.length, 0, 0));
+ // H is split, so create two entries.
+ mapping.push_back(CreateMappedRange(H.rva, H1t.rva, H1t.length, 0, 0));
+ mapping.push_back(CreateMappedRange(H.rva + H1t.length, H2t.rva, H2t.length,
+ 0, 0));
+ EXPECT_THAT(mapping,
+ testing::ContainerEq(image_map.mapping));
+
+ EndpointIndexMap endpoint_index_map;
+ endpoint_index_map.push_back(CreateEndpointIndex(0, 0));
+ endpoint_index_map.push_back(CreateEndpointIndex(B.rva, 1));
+ endpoint_index_map.push_back(CreateEndpointIndex(D.rva, 2));
+ endpoint_index_map.push_back(CreateEndpointIndex(E.rva, 3));
+ endpoint_index_map.push_back(CreateEndpointIndex(F.rva, 4));
+ // G is duplicated so 2 ranges map back to it, hence the skip from 5 to 7.
+ endpoint_index_map.push_back(CreateEndpointIndex(G.rva, 5));
+ // H is split so we expect 2 endpoints to show up attributed to it.
+ endpoint_index_map.push_back(CreateEndpointIndex(H.rva, 7));
+ endpoint_index_map.push_back(CreateEndpointIndex(H.rva + H1t.length, 8));
+ endpoint_index_map.push_back(CreateEndpointIndex(H.end(), 9));
+ EXPECT_THAT(endpoint_index_map,
+ testing::ContainerEq(image_map.endpoint_index_map));
+}
+
+namespace {
+
+class MapAddressRangeTest : public BuildImageMapTest {
+ public:
+ typedef BuildImageMapTest Super;
+ virtual void SetUp() {
+ Super::SetUp();
+ InitOmapData();
+ BuildImageMap(omap_data, &image_map);
+ }
+
+ ImageMap image_map;
+
+ private:
+ using BuildImageMapTest::InitOmapData;
+ using BuildImageMapTest::omap_data;
+};
+
+} // namespace
+
+TEST_F(MapAddressRangeTest, EmptyImageMapReturnsIdentity) {
+ ImageMap im;
+ AddressRangeVector mapped_ranges;
+ AddressRange ar(0, 1024);
+ MapAddressRange(im, ar, &mapped_ranges);
+ EXPECT_EQ(1u, mapped_ranges.size());
+ EXPECT_EQ(ar, mapped_ranges[0]);
+}
+
+TEST_F(MapAddressRangeTest, MapOutOfImage) {
+ AddressRangeVector mapped_ranges;
+ MapAddressRange(image_map, AddressRange(H.end() + 10, 10), &mapped_ranges);
+ EXPECT_EQ(0u, mapped_ranges.size());
+}
+
+TEST_F(MapAddressRangeTest, MapIdentity) {
+ AddressRangeVector mapped_ranges;
+ MapAddressRange(image_map, B, &mapped_ranges);
+ EXPECT_EQ(1u, mapped_ranges.size());
+ EXPECT_THAT(mapped_ranges, testing::ElementsAre(B));
+}
+
+TEST_F(MapAddressRangeTest, MapReorderedContiguous) {
+ AddressRangeVector mapped_ranges;
+
+ AddressRange DEF(D.rva, F.end() - D.rva);
+ MapAddressRange(image_map, DEF, &mapped_ranges);
+ EXPECT_EQ(1u, mapped_ranges.size());
+
+ AddressRange DFEt(Dt.rva, Et.end() - Dt.rva);
+ EXPECT_THAT(mapped_ranges, testing::ElementsAre(DFEt));
+}
+
+TEST_F(MapAddressRangeTest, MapEmptySingle) {
+ AddressRangeVector mapped_ranges;
+ MapAddressRange(image_map, AddressRange(D.rva, 0), &mapped_ranges);
+ EXPECT_EQ(1u, mapped_ranges.size());
+ EXPECT_THAT(mapped_ranges, testing::ElementsAre(AddressRange(Dt.rva, 0)));
+}
+
+TEST_F(MapAddressRangeTest, MapEmptyCopied) {
+ AddressRangeVector mapped_ranges;
+ MapAddressRange(image_map, AddressRange(G.rva, 0), &mapped_ranges);
+ EXPECT_EQ(2u, mapped_ranges.size());
+ EXPECT_THAT(mapped_ranges, testing::ElementsAre(AddressRange(G1t.rva, 0),
+ AddressRange(G2t.rva, 0)));
+}
+
+TEST_F(MapAddressRangeTest, MapCopiedContiguous) {
+ AddressRangeVector mapped_ranges;
+ MapAddressRange(image_map, G, &mapped_ranges);
+ EXPECT_EQ(1u, mapped_ranges.size());
+ EXPECT_THAT(mapped_ranges, testing::ElementsAre(
+ AddressRange(G1t.rva, G2t.end() - G1t.rva)));
+}
+
+TEST_F(MapAddressRangeTest, MapSplitDiscontiguous) {
+ AddressRangeVector mapped_ranges;
+ MapAddressRange(image_map, H, &mapped_ranges);
+ EXPECT_EQ(2u, mapped_ranges.size());
+ EXPECT_THAT(mapped_ranges, testing::ElementsAre(H1t, H2t));
+}
+
+TEST_F(MapAddressRangeTest, MapInjected) {
+ AddressRangeVector mapped_ranges;
+
+ AddressRange EFGH(E.rva, H.end() - E.rva);
+ MapAddressRange(image_map, EFGH, &mapped_ranges);
+ EXPECT_EQ(1u, mapped_ranges.size());
+
+ AddressRange FEHGGHt(Ft.rva, H2t.end() - Ft.rva);
+ EXPECT_THAT(mapped_ranges, testing::ElementsAre(FEHGGHt));
+}
+
+TEST_F(MapAddressRangeTest, MapRemovedEntirely) {
+ AddressRangeVector mapped_ranges;
+ MapAddressRange(image_map, C, &mapped_ranges);
+ EXPECT_EQ(0u, mapped_ranges.size());
+}
+
+TEST_F(MapAddressRangeTest, MapRemovedPartly) {
+ AddressRangeVector mapped_ranges;
+ MapAddressRange(image_map, D, &mapped_ranges);
+ EXPECT_EQ(1u, mapped_ranges.size());
+ EXPECT_THAT(mapped_ranges, testing::ElementsAre(Dt));
+}
+
+TEST_F(MapAddressRangeTest, MapFull) {
+ AddressRangeVector mapped_ranges;
+
+ AddressRange AH(0, H.end());
+ MapAddressRange(image_map, AH, &mapped_ranges);
+ EXPECT_EQ(1u, mapped_ranges.size());
+
+ AddressRange AHt(0, H2t.end());
+ EXPECT_THAT(mapped_ranges, testing::ElementsAre(AHt));
+}
+
+} // namespace google_breakpad
diff --git a/3rdParty/Breakpad/src/common/windows/pdb_source_line_writer.cc b/3rdParty/Breakpad/src/common/windows/pdb_source_line_writer.cc
new file mode 100644
index 0000000..31920ba
--- /dev/null
+++ b/3rdParty/Breakpad/src/common/windows/pdb_source_line_writer.cc
@@ -0,0 +1,1412 @@
+// Copyright (c) 2006, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#include "common/windows/pdb_source_line_writer.h"
+
+#include <windows.h>
+#include <winnt.h>
+#include <atlbase.h>
+#include <dia2.h>
+#include <diacreate.h>
+#include <ImageHlp.h>
+#include <stdio.h>
+
+#include <limits>
+#include <set>
+
+#include "common/windows/dia_util.h"
+#include "common/windows/guid_string.h"
+#include "common/windows/string_utils-inl.h"
+
+// This constant may be missing from DbgHelp.h. See the documentation for
+// IDiaSymbol::get_undecoratedNameEx.
+#ifndef UNDNAME_NO_ECSU
+#define UNDNAME_NO_ECSU 0x8000 // Suppresses enum/class/struct/union.
+#endif // UNDNAME_NO_ECSU
+
+/*
+ * Not defined in WinNT.h for some reason. Definitions taken from:
+ * http://uninformed.org/index.cgi?v=4&a=1&p=13
+ *
+ */
+typedef unsigned char UBYTE;
+
+#if !defined(_WIN64)
+#define UNW_FLAG_EHANDLER 0x01
+#define UNW_FLAG_UHANDLER 0x02
+#define UNW_FLAG_CHAININFO 0x04
+#endif
+
+union UnwindCode {
+ struct {
+ UBYTE offset_in_prolog;
+ UBYTE unwind_operation_code : 4;
+ UBYTE operation_info : 4;
+ };
+ USHORT frame_offset;
+};
+
+enum UnwindOperationCodes {
+ UWOP_PUSH_NONVOL = 0, /* info == register number */
+ UWOP_ALLOC_LARGE, /* no info, alloc size in next 2 slots */
+ UWOP_ALLOC_SMALL, /* info == size of allocation / 8 - 1 */
+ UWOP_SET_FPREG, /* no info, FP = RSP + UNWIND_INFO.FPRegOffset*16 */
+ UWOP_SAVE_NONVOL, /* info == register number, offset in next slot */
+ UWOP_SAVE_NONVOL_FAR, /* info == register number, offset in next 2 slots */
+ // XXX: these are missing from MSDN!
+ // See: http://www.osronline.com/ddkx/kmarch/64bitamd_4rs7.htm
+ UWOP_SAVE_XMM,
+ UWOP_SAVE_XMM_FAR,
+ UWOP_SAVE_XMM128, /* info == XMM reg number, offset in next slot */
+ UWOP_SAVE_XMM128_FAR, /* info == XMM reg number, offset in next 2 slots */
+ UWOP_PUSH_MACHFRAME /* info == 0: no error-code, 1: error-code */
+};
+
+// See: http://msdn.microsoft.com/en-us/library/ddssxxy8.aspx
+// Note: some fields removed as we don't use them.
+struct UnwindInfo {
+ UBYTE version : 3;
+ UBYTE flags : 5;
+ UBYTE size_of_prolog;
+ UBYTE count_of_codes;
+ UBYTE frame_register : 4;
+ UBYTE frame_offset : 4;
+ UnwindCode unwind_code[1];
+};
+
+namespace google_breakpad {
+
+namespace {
+
+using std::vector;
+
+// A helper class to scope a PLOADED_IMAGE.
+class AutoImage {
+ public:
+ explicit AutoImage(PLOADED_IMAGE img) : img_(img) {}
+ ~AutoImage() {
+ if (img_)
+ ImageUnload(img_);
+ }
+
+ operator PLOADED_IMAGE() { return img_; }
+ PLOADED_IMAGE operator->() { return img_; }
+
+ private:
+ PLOADED_IMAGE img_;
+};
+
+bool SymbolsMatch(IDiaSymbol* a, IDiaSymbol* b) {
+ DWORD a_section, a_offset, b_section, b_offset;
+ if (FAILED(a->get_addressSection(&a_section)) ||
+ FAILED(a->get_addressOffset(&a_offset)) ||
+ FAILED(b->get_addressSection(&b_section)) ||
+ FAILED(b->get_addressOffset(&b_offset)))
+ return false;
+ return a_section == b_section && a_offset == b_offset;
+}
+
+bool CreateDiaDataSourceInstance(CComPtr<IDiaDataSource> &data_source) {
+ if (SUCCEEDED(data_source.CoCreateInstance(CLSID_DiaSource))) {
+ return true;
+ }
+
+ class DECLSPEC_UUID("B86AE24D-BF2F-4ac9-B5A2-34B14E4CE11D") DiaSource100;
+ class DECLSPEC_UUID("761D3BCD-1304-41D5-94E8-EAC54E4AC172") DiaSource110;
+ class DECLSPEC_UUID("3BFCEA48-620F-4B6B-81F7-B9AF75454C7D") DiaSource120;
+ class DECLSPEC_UUID("E6756135-1E65-4D17-8576-610761398C3C") DiaSource140;
+
+ // If the CoCreateInstance call above failed, msdia*.dll is not registered.
+ // We can try loading the DLL corresponding to the #included DIA SDK, but
+ // the DIA headers don't provide a version. Lets try to figure out which DIA
+ // version we're compiling against by comparing CLSIDs.
+ const wchar_t *msdia_dll = nullptr;
+ if (CLSID_DiaSource == _uuidof(DiaSource100)) {
+ msdia_dll = L"msdia100.dll";
+ } else if (CLSID_DiaSource == _uuidof(DiaSource110)) {
+ msdia_dll = L"msdia110.dll";
+ } else if (CLSID_DiaSource == _uuidof(DiaSource120)) {
+ msdia_dll = L"msdia120.dll";
+ } else if (CLSID_DiaSource == _uuidof(DiaSource140)) {
+ msdia_dll = L"msdia140.dll";
+ }
+
+ if (msdia_dll &&
+ SUCCEEDED(NoRegCoCreate(msdia_dll, CLSID_DiaSource, IID_IDiaDataSource,
+ reinterpret_cast<void **>(&data_source)))) {
+ return true;
+ }
+
+ return false;
+}
+
+} // namespace
+
+PDBSourceLineWriter::PDBSourceLineWriter() : output_(NULL) {
+}
+
+PDBSourceLineWriter::~PDBSourceLineWriter() {
+}
+
+bool PDBSourceLineWriter::SetCodeFile(const wstring &exe_file) {
+ if (code_file_.empty()) {
+ code_file_ = exe_file;
+ return true;
+ }
+ // Setting a different code file path is an error. It is success only if the
+ // file paths are the same.
+ return exe_file == code_file_;
+}
+
+bool PDBSourceLineWriter::Open(const wstring &file, FileFormat format) {
+ Close();
+ code_file_.clear();
+
+ if (FAILED(CoInitialize(NULL))) {
+ fprintf(stderr, "CoInitialize failed\n");
+ return false;
+ }
+
+ CComPtr<IDiaDataSource> data_source;
+ if (!CreateDiaDataSourceInstance(data_source)) {
+ const int kGuidSize = 64;
+ wchar_t classid[kGuidSize] = {0};
+ StringFromGUID2(CLSID_DiaSource, classid, kGuidSize);
+ fprintf(stderr, "CoCreateInstance CLSID_DiaSource %S failed "
+ "(msdia*.dll unregistered?)\n", classid);
+ return false;
+ }
+
+ switch (format) {
+ case PDB_FILE:
+ if (FAILED(data_source->loadDataFromPdb(file.c_str()))) {
+ fprintf(stderr, "loadDataFromPdb failed for %ws\n", file.c_str());
+ return false;
+ }
+ break;
+ case EXE_FILE:
+ if (FAILED(data_source->loadDataForExe(file.c_str(), NULL, NULL))) {
+ fprintf(stderr, "loadDataForExe failed for %ws\n", file.c_str());
+ return false;
+ }
+ code_file_ = file;
+ break;
+ case ANY_FILE:
+ if (FAILED(data_source->loadDataFromPdb(file.c_str()))) {
+ if (FAILED(data_source->loadDataForExe(file.c_str(), NULL, NULL))) {
+ fprintf(stderr, "loadDataForPdb and loadDataFromExe failed for %ws\n",
+ file.c_str());
+ return false;
+ }
+ code_file_ = file;
+ }
+ break;
+ default:
+ fprintf(stderr, "Unknown file format\n");
+ return false;
+ }
+
+ if (FAILED(data_source->openSession(&session_))) {
+ fprintf(stderr, "openSession failed\n");
+ }
+
+ return true;
+}
+
+bool PDBSourceLineWriter::PrintLines(IDiaEnumLineNumbers *lines) {
+ // The line number format is:
+ // <rva> <line number> <source file id>
+ CComPtr<IDiaLineNumber> line;
+ ULONG count;
+
+ while (SUCCEEDED(lines->Next(1, &line, &count)) && count == 1) {
+ DWORD rva;
+ if (FAILED(line->get_relativeVirtualAddress(&rva))) {
+ fprintf(stderr, "failed to get line rva\n");
+ return false;
+ }
+
+ DWORD length;
+ if (FAILED(line->get_length(&length))) {
+ fprintf(stderr, "failed to get line code length\n");
+ return false;
+ }
+
+ DWORD dia_source_id;
+ if (FAILED(line->get_sourceFileId(&dia_source_id))) {
+ fprintf(stderr, "failed to get line source file id\n");
+ return false;
+ }
+ // duplicate file names are coalesced to share one ID
+ DWORD source_id = GetRealFileID(dia_source_id);
+
+ DWORD line_num;
+ if (FAILED(line->get_lineNumber(&line_num))) {
+ fprintf(stderr, "failed to get line number\n");
+ return false;
+ }
+
+ AddressRangeVector ranges;
+ MapAddressRange(image_map_, AddressRange(rva, length), &ranges);
+ for (size_t i = 0; i < ranges.size(); ++i) {
+ fprintf(output_, "%lx %lx %lu %lu\n", ranges[i].rva, ranges[i].length,
+ line_num, source_id);
+ }
+ line.Release();
+ }
+ return true;
+}
+
+bool PDBSourceLineWriter::PrintFunction(IDiaSymbol *function,
+ IDiaSymbol *block) {
+ // The function format is:
+ // FUNC <address> <length> <param_stack_size> <function>
+ DWORD rva;
+ if (FAILED(block->get_relativeVirtualAddress(&rva))) {
+ fprintf(stderr, "couldn't get rva\n");
+ return false;
+ }
+
+ ULONGLONG length;
+ if (FAILED(block->get_length(&length))) {
+ fprintf(stderr, "failed to get function length\n");
+ return false;
+ }
+
+ if (length == 0) {
+ // Silently ignore zero-length functions, which can infrequently pop up.
+ return true;
+ }
+
+ CComBSTR name;
+ int stack_param_size;
+ if (!GetSymbolFunctionName(function, &name, &stack_param_size)) {
+ return false;
+ }
+
+ // If the decorated name didn't give the parameter size, try to
+ // calculate it.
+ if (stack_param_size < 0) {
+ stack_param_size = GetFunctionStackParamSize(function);
+ }
+
+ AddressRangeVector ranges;
+ MapAddressRange(image_map_, AddressRange(rva, static_cast<DWORD>(length)),
+ &ranges);
+ for (size_t i = 0; i < ranges.size(); ++i) {
+ fprintf(output_, "FUNC %lx %lx %x %ws\n",
+ ranges[i].rva, ranges[i].length, stack_param_size,
+ name.m_str);
+ }
+
+ CComPtr<IDiaEnumLineNumbers> lines;
+ if (FAILED(session_->findLinesByRVA(rva, DWORD(length), &lines))) {
+ return false;
+ }
+
+ if (!PrintLines(lines)) {
+ return false;
+ }
+ return true;
+}
+
+bool PDBSourceLineWriter::PrintSourceFiles() {
+ CComPtr<IDiaSymbol> global;
+ if (FAILED(session_->get_globalScope(&global))) {
+ fprintf(stderr, "get_globalScope failed\n");
+ return false;
+ }
+
+ CComPtr<IDiaEnumSymbols> compilands;
+ if (FAILED(global->findChildren(SymTagCompiland, NULL,
+ nsNone, &compilands))) {
+ fprintf(stderr, "findChildren failed\n");
+ return false;
+ }
+
+ CComPtr<IDiaSymbol> compiland;
+ ULONG count;
+ while (SUCCEEDED(compilands->Next(1, &compiland, &count)) && count == 1) {
+ CComPtr<IDiaEnumSourceFiles> source_files;
+ if (FAILED(session_->findFile(compiland, NULL, nsNone, &source_files))) {
+ return false;
+ }
+ CComPtr<IDiaSourceFile> file;
+ while (SUCCEEDED(source_files->Next(1, &file, &count)) && count == 1) {
+ DWORD file_id;
+ if (FAILED(file->get_uniqueId(&file_id))) {
+ return false;
+ }
+
+ CComBSTR file_name;
+ if (FAILED(file->get_fileName(&file_name))) {
+ return false;
+ }
+
+ wstring file_name_string(file_name);
+ if (!FileIDIsCached(file_name_string)) {
+ // this is a new file name, cache it and output a FILE line.
+ CacheFileID(file_name_string, file_id);
+ fwprintf(output_, L"FILE %d %ws\n", file_id, file_name_string.c_str());
+ } else {
+ // this file name has already been seen, just save this
+ // ID for later lookup.
+ StoreDuplicateFileID(file_name_string, file_id);
+ }
+ file.Release();
+ }
+ compiland.Release();
+ }
+ return true;
+}
+
+bool PDBSourceLineWriter::PrintFunctions() {
+ ULONG count = 0;
+ DWORD rva = 0;
+ CComPtr<IDiaSymbol> global;
+ HRESULT hr;
+
+ if (FAILED(session_->get_globalScope(&global))) {
+ fprintf(stderr, "get_globalScope failed\n");
+ return false;
+ }
+
+ CComPtr<IDiaEnumSymbols> symbols = NULL;
+
+ // Find all function symbols first.
+ std::set<DWORD> rvas;
+ hr = global->findChildren(SymTagFunction, NULL, nsNone, &symbols);
+
+ if (SUCCEEDED(hr)) {
+ CComPtr<IDiaSymbol> symbol = NULL;
+
+ while (SUCCEEDED(symbols->Next(1, &symbol, &count)) && count == 1) {
+ if (SUCCEEDED(symbol->get_relativeVirtualAddress(&rva))) {
+ // To maintain existing behavior of one symbol per address, place the
+ // rva onto a set here to uniquify them.
+ rvas.insert(rva);
+ } else {
+ fprintf(stderr, "get_relativeVirtualAddress failed on the symbol\n");
+ return false;
+ }
+
+ symbol.Release();
+ }
+
+ symbols.Release();
+ }
+
+ // Find all public symbols. Store public symbols that are not also private
+ // symbols for later.
+ std::set<DWORD> public_only_rvas;
+ hr = global->findChildren(SymTagPublicSymbol, NULL, nsNone, &symbols);
+
+ if (SUCCEEDED(hr)) {
+ CComPtr<IDiaSymbol> symbol = NULL;
+
+ while (SUCCEEDED(symbols->Next(1, &symbol, &count)) && count == 1) {
+ if (SUCCEEDED(symbol->get_relativeVirtualAddress(&rva))) {
+ if (rvas.count(rva) == 0) {
+ rvas.insert(rva); // Keep symbols in rva order.
+ public_only_rvas.insert(rva);
+ }
+ } else {
+ fprintf(stderr, "get_relativeVirtualAddress failed on the symbol\n");
+ return false;
+ }
+
+ symbol.Release();
+ }
+
+ symbols.Release();
+ }
+
+ std::set<DWORD>::iterator it;
+
+ // For each rva, dump the first symbol DIA knows about at the address.
+ for (it = rvas.begin(); it != rvas.end(); ++it) {
+ CComPtr<IDiaSymbol> symbol = NULL;
+ // If the symbol is not in the public list, look for SymTagFunction. This is
+ // a workaround to a bug where DIA will hang if searching for a private
+ // symbol at an address where only a public symbol exists.
+ // See http://connect.microsoft.com/VisualStudio/feedback/details/722366
+ if (public_only_rvas.count(*it) == 0) {
+ if (SUCCEEDED(session_->findSymbolByRVA(*it, SymTagFunction, &symbol))) {
+ // Sometimes findSymbolByRVA returns S_OK, but NULL.
+ if (symbol) {
+ if (!PrintFunction(symbol, symbol))
+ return false;
+ symbol.Release();
+ }
+ } else {
+ fprintf(stderr, "findSymbolByRVA SymTagFunction failed\n");
+ return false;
+ }
+ } else if (SUCCEEDED(session_->findSymbolByRVA(*it,
+ SymTagPublicSymbol,
+ &symbol))) {
+ // Sometimes findSymbolByRVA returns S_OK, but NULL.
+ if (symbol) {
+ if (!PrintCodePublicSymbol(symbol))
+ return false;
+ symbol.Release();
+ }
+ } else {
+ fprintf(stderr, "findSymbolByRVA SymTagPublicSymbol failed\n");
+ return false;
+ }
+ }
+
+ // When building with PGO, the compiler can split functions into
+ // "hot" and "cold" blocks, and move the "cold" blocks out to separate
+ // pages, so the function can be noncontiguous. To find these blocks,
+ // we have to iterate over all the compilands, and then find blocks
+ // that are children of them. We can then find the lexical parents
+ // of those blocks and print out an extra FUNC line for blocks
+ // that are not contained in their parent functions.
+ CComPtr<IDiaEnumSymbols> compilands;
+ if (FAILED(global->findChildren(SymTagCompiland, NULL,
+ nsNone, &compilands))) {
+ fprintf(stderr, "findChildren failed on the global\n");
+ return false;
+ }
+
+ CComPtr<IDiaSymbol> compiland;
+ while (SUCCEEDED(compilands->Next(1, &compiland, &count)) && count == 1) {
+ CComPtr<IDiaEnumSymbols> blocks;
+ if (FAILED(compiland->findChildren(SymTagBlock, NULL,
+ nsNone, &blocks))) {
+ fprintf(stderr, "findChildren failed on a compiland\n");
+ return false;
+ }
+
+ CComPtr<IDiaSymbol> block;
+ while (SUCCEEDED(blocks->Next(1, &block, &count)) && count == 1) {
+ // find this block's lexical parent function
+ CComPtr<IDiaSymbol> parent;
+ DWORD tag;
+ if (SUCCEEDED(block->get_lexicalParent(&parent)) &&
+ SUCCEEDED(parent->get_symTag(&tag)) &&
+ tag == SymTagFunction) {
+ // now get the block's offset and the function's offset and size,
+ // and determine if the block is outside of the function
+ DWORD func_rva, block_rva;
+ ULONGLONG func_length;
+ if (SUCCEEDED(block->get_relativeVirtualAddress(&block_rva)) &&
+ SUCCEEDED(parent->get_relativeVirtualAddress(&func_rva)) &&
+ SUCCEEDED(parent->get_length(&func_length))) {
+ if (block_rva < func_rva || block_rva > (func_rva + func_length)) {
+ if (!PrintFunction(parent, block)) {
+ return false;
+ }
+ }
+ }
+ }
+ parent.Release();
+ block.Release();
+ }
+ blocks.Release();
+ compiland.Release();
+ }
+
+ global.Release();
+ return true;
+}
+
+#undef max
+
+bool PDBSourceLineWriter::PrintFrameDataUsingPDB() {
+ // It would be nice if it were possible to output frame data alongside the
+ // associated function, as is done with line numbers, but the DIA API
+ // doesn't make it possible to get the frame data in that way.
+
+ CComPtr<IDiaEnumFrameData> frame_data_enum;
+ if (!FindTable(session_, &frame_data_enum))
+ return false;
+
+ DWORD last_type = std::numeric_limits<DWORD>::max();
+ DWORD last_rva = std::numeric_limits<DWORD>::max();
+ DWORD last_code_size = 0;
+ DWORD last_prolog_size = std::numeric_limits<DWORD>::max();
+
+ CComPtr<IDiaFrameData> frame_data;
+ ULONG count = 0;
+ while (SUCCEEDED(frame_data_enum->Next(1, &frame_data, &count)) &&
+ count == 1) {
+ DWORD type;
+ if (FAILED(frame_data->get_type(&type)))
+ return false;
+
+ DWORD rva;
+ if (FAILED(frame_data->get_relativeVirtualAddress(&rva)))
+ return false;
+
+ DWORD code_size;
+ if (FAILED(frame_data->get_lengthBlock(&code_size)))
+ return false;
+
+ DWORD prolog_size;
+ if (FAILED(frame_data->get_lengthProlog(&prolog_size)))
+ return false;
+
+ // parameter_size is the size of parameters passed on the stack. If any
+ // parameters are not passed on the stack (such as in registers), their
+ // sizes will not be included in parameter_size.
+ DWORD parameter_size;
+ if (FAILED(frame_data->get_lengthParams(&parameter_size)))
+ return false;
+
+ DWORD saved_register_size;
+ if (FAILED(frame_data->get_lengthSavedRegisters(&saved_register_size)))
+ return false;
+
+ DWORD local_size;
+ if (FAILED(frame_data->get_lengthLocals(&local_size)))
+ return false;
+
+ // get_maxStack can return S_FALSE, just use 0 in that case.
+ DWORD max_stack_size = 0;
+ if (FAILED(frame_data->get_maxStack(&max_stack_size)))
+ return false;
+
+ // get_programString can return S_FALSE, indicating that there is no
+ // program string. In that case, check whether %ebp is used.
+ HRESULT program_string_result;
+ CComBSTR program_string;
+ if (FAILED(program_string_result = frame_data->get_program(
+ &program_string))) {
+ return false;
+ }
+
+ // get_allocatesBasePointer can return S_FALSE, treat that as though
+ // %ebp is not used.
+ BOOL allocates_base_pointer = FALSE;
+ if (program_string_result != S_OK) {
+ if (FAILED(frame_data->get_allocatesBasePointer(
+ &allocates_base_pointer))) {
+ return false;
+ }
+ }
+
+ // Only print out a line if type, rva, code_size, or prolog_size have
+ // changed from the last line. It is surprisingly common (especially in
+ // system library PDBs) for DIA to return a series of identical
+ // IDiaFrameData objects. For kernel32.pdb from Windows XP SP2 on x86,
+ // this check reduces the size of the dumped symbol file by a third.
+ if (type != last_type || rva != last_rva || code_size != last_code_size ||
+ prolog_size != last_prolog_size) {
+ // The prolog and the code portions of the frame have to be treated
+ // independently as they may have independently changed in size, or may
+ // even have been split.
+ // NOTE: If epilog size is ever non-zero, we have to do something
+ // similar with it.
+
+ // Figure out where the prolog bytes have landed.
+ AddressRangeVector prolog_ranges;
+ if (prolog_size > 0) {
+ MapAddressRange(image_map_, AddressRange(rva, prolog_size),
+ &prolog_ranges);
+ }
+
+ // And figure out where the code bytes have landed.
+ AddressRangeVector code_ranges;
+ MapAddressRange(image_map_,
+ AddressRange(rva + prolog_size,
+ code_size - prolog_size),
+ &code_ranges);
+
+ struct FrameInfo {
+ DWORD rva;
+ DWORD code_size;
+ DWORD prolog_size;
+ };
+ std::vector<FrameInfo> frame_infos;
+
+ // Special case: The prolog and the code bytes remain contiguous. This is
+ // only done for compactness of the symbol file, and we could actually
+ // be outputting independent frame info for the prolog and code portions.
+ if (prolog_ranges.size() == 1 && code_ranges.size() == 1 &&
+ prolog_ranges[0].end() == code_ranges[0].rva) {
+ FrameInfo fi = { prolog_ranges[0].rva,
+ prolog_ranges[0].length + code_ranges[0].length,
+ prolog_ranges[0].length };
+ frame_infos.push_back(fi);
+ } else {
+ // Otherwise we output the prolog and code frame info independently.
+ for (size_t i = 0; i < prolog_ranges.size(); ++i) {
+ FrameInfo fi = { prolog_ranges[i].rva,
+ prolog_ranges[i].length,
+ prolog_ranges[i].length };
+ frame_infos.push_back(fi);
+ }
+ for (size_t i = 0; i < code_ranges.size(); ++i) {
+ FrameInfo fi = { code_ranges[i].rva, code_ranges[i].length, 0 };
+ frame_infos.push_back(fi);
+ }
+ }
+
+ for (size_t i = 0; i < frame_infos.size(); ++i) {
+ const FrameInfo& fi(frame_infos[i]);
+ fprintf(output_, "STACK WIN %lx %lx %lx %lx %x %lx %lx %lx %lx %d ",
+ type, fi.rva, fi.code_size, fi.prolog_size,
+ 0 /* epilog_size */, parameter_size, saved_register_size,
+ local_size, max_stack_size, program_string_result == S_OK);
+ if (program_string_result == S_OK) {
+ fprintf(output_, "%ws\n", program_string.m_str);
+ } else {
+ fprintf(output_, "%d\n", allocates_base_pointer);
+ }
+ }
+
+ last_type = type;
+ last_rva = rva;
+ last_code_size = code_size;
+ last_prolog_size = prolog_size;
+ }
+
+ frame_data.Release();
+ }
+
+ return true;
+}
+
+bool PDBSourceLineWriter::PrintFrameDataUsingEXE() {
+ if (code_file_.empty() && !FindPEFile()) {
+ fprintf(stderr, "Couldn't locate EXE or DLL file.\n");
+ return false;
+ }
+
+ // Convert wchar to native charset because ImageLoad only takes
+ // a PSTR as input.
+ string code_file;
+ if (!WindowsStringUtils::safe_wcstombs(code_file_, &code_file)) {
+ return false;
+ }
+
+ AutoImage img(ImageLoad((PSTR)code_file.c_str(), NULL));
+ if (!img) {
+ fprintf(stderr, "Failed to load %s\n", code_file.c_str());
+ return false;
+ }
+ PIMAGE_OPTIONAL_HEADER64 optional_header =
+ &(reinterpret_cast<PIMAGE_NT_HEADERS64>(img->FileHeader))->OptionalHeader;
+ if (optional_header->Magic != IMAGE_NT_OPTIONAL_HDR64_MAGIC) {
+ fprintf(stderr, "Not a PE32+ image\n");
+ return false;
+ }
+
+ // Read Exception Directory
+ DWORD exception_rva = optional_header->
+ DataDirectory[IMAGE_DIRECTORY_ENTRY_EXCEPTION].VirtualAddress;
+ DWORD exception_size = optional_header->
+ DataDirectory[IMAGE_DIRECTORY_ENTRY_EXCEPTION].Size;
+ PIMAGE_RUNTIME_FUNCTION_ENTRY funcs =
+ static_cast<PIMAGE_RUNTIME_FUNCTION_ENTRY>(
+ ImageRvaToVa(img->FileHeader,
+ img->MappedAddress,
+ exception_rva,
+ &img->LastRvaSection));
+ for (DWORD i = 0; i < exception_size / sizeof(*funcs); i++) {
+ DWORD unwind_rva = funcs[i].UnwindInfoAddress;
+ // handle chaining
+ while (unwind_rva & 0x1) {
+ unwind_rva ^= 0x1;
+ PIMAGE_RUNTIME_FUNCTION_ENTRY chained_func =
+ static_cast<PIMAGE_RUNTIME_FUNCTION_ENTRY>(
+ ImageRvaToVa(img->FileHeader,
+ img->MappedAddress,
+ unwind_rva,
+ &img->LastRvaSection));
+ unwind_rva = chained_func->UnwindInfoAddress;
+ }
+
+ UnwindInfo *unwind_info = static_cast<UnwindInfo *>(
+ ImageRvaToVa(img->FileHeader,
+ img->MappedAddress,
+ unwind_rva,
+ &img->LastRvaSection));
+
+ DWORD stack_size = 8; // minimal stack size is 8 for RIP
+ DWORD rip_offset = 8;
+ do {
+ for (UBYTE c = 0; c < unwind_info->count_of_codes; c++) {
+ UnwindCode *unwind_code = &unwind_info->unwind_code[c];
+ switch (unwind_code->unwind_operation_code) {
+ case UWOP_PUSH_NONVOL: {
+ stack_size += 8;
+ break;
+ }
+ case UWOP_ALLOC_LARGE: {
+ if (unwind_code->operation_info == 0) {
+ c++;
+ if (c < unwind_info->count_of_codes)
+ stack_size += (unwind_code + 1)->frame_offset * 8;
+ } else {
+ c += 2;
+ if (c < unwind_info->count_of_codes)
+ stack_size += (unwind_code + 1)->frame_offset |
+ ((unwind_code + 2)->frame_offset << 16);
+ }
+ break;
+ }
+ case UWOP_ALLOC_SMALL: {
+ stack_size += unwind_code->operation_info * 8 + 8;
+ break;
+ }
+ case UWOP_SET_FPREG:
+ case UWOP_SAVE_XMM:
+ case UWOP_SAVE_XMM_FAR:
+ break;
+ case UWOP_SAVE_NONVOL:
+ case UWOP_SAVE_XMM128: {
+ c++; // skip slot with offset
+ break;
+ }
+ case UWOP_SAVE_NONVOL_FAR:
+ case UWOP_SAVE_XMM128_FAR: {
+ c += 2; // skip 2 slots with offset
+ break;
+ }
+ case UWOP_PUSH_MACHFRAME: {
+ if (unwind_code->operation_info) {
+ stack_size += 88;
+ } else {
+ stack_size += 80;
+ }
+ rip_offset += 80;
+ break;
+ }
+ }
+ }
+ if (unwind_info->flags & UNW_FLAG_CHAININFO) {
+ PIMAGE_RUNTIME_FUNCTION_ENTRY chained_func =
+ reinterpret_cast<PIMAGE_RUNTIME_FUNCTION_ENTRY>(
+ (unwind_info->unwind_code +
+ ((unwind_info->count_of_codes + 1) & ~1)));
+
+ unwind_info = static_cast<UnwindInfo *>(
+ ImageRvaToVa(img->FileHeader,
+ img->MappedAddress,
+ chained_func->UnwindInfoAddress,
+ &img->LastRvaSection));
+ } else {
+ unwind_info = NULL;
+ }
+ } while (unwind_info);
+ fprintf(output_, "STACK CFI INIT %lx %lx .cfa: $rsp .ra: .cfa %lu - ^\n",
+ funcs[i].BeginAddress,
+ funcs[i].EndAddress - funcs[i].BeginAddress, rip_offset);
+ fprintf(output_, "STACK CFI %lx .cfa: $rsp %lu +\n",
+ funcs[i].BeginAddress, stack_size);
+ }
+
+ return true;
+}
+
+bool PDBSourceLineWriter::PrintFrameData() {
+ PDBModuleInfo info;
+ if (GetModuleInfo(&info) && info.cpu == L"x86_64") {
+ return PrintFrameDataUsingEXE();
+ } else {
+ return PrintFrameDataUsingPDB();
+ }
+ return false;
+}
+
+bool PDBSourceLineWriter::PrintCodePublicSymbol(IDiaSymbol *symbol) {
+ BOOL is_code;
+ if (FAILED(symbol->get_code(&is_code))) {
+ return false;
+ }
+ if (!is_code) {
+ return true;
+ }
+
+ DWORD rva;
+ if (FAILED(symbol->get_relativeVirtualAddress(&rva))) {
+ return false;
+ }
+
+ CComBSTR name;
+ int stack_param_size;
+ if (!GetSymbolFunctionName(symbol, &name, &stack_param_size)) {
+ return false;
+ }
+
+ AddressRangeVector ranges;
+ MapAddressRange(image_map_, AddressRange(rva, 1), &ranges);
+ for (size_t i = 0; i < ranges.size(); ++i) {
+ fprintf(output_, "PUBLIC %lx %x %ws\n", ranges[i].rva,
+ stack_param_size > 0 ? stack_param_size : 0,
+ name.m_str);
+ }
+
+ // Now walk the function in the original untranslated space, asking DIA
+ // what function is at that location, stepping through OMAP blocks. If
+ // we're still in the same function, emit another entry, because the
+ // symbol could have been split into multiple pieces. If we've gotten to
+ // another symbol in the original address space, then we're done for
+ // this symbol. See https://crbug.com/678874.
+ for (;;) {
+ // This steps to the next block in the original image. Simply doing
+ // rva++ would also be correct, but would emit tons of unnecessary
+ // entries.
+ rva = image_map_.subsequent_rva_block[rva];
+ if (rva == 0)
+ break;
+
+ CComPtr<IDiaSymbol> next_sym = NULL;
+ LONG displacement;
+ if (FAILED(session_->findSymbolByRVAEx(rva, SymTagPublicSymbol, &next_sym,
+ &displacement))) {
+ break;
+ }
+
+ if (!SymbolsMatch(symbol, next_sym))
+ break;
+
+ AddressRangeVector next_ranges;
+ MapAddressRange(image_map_, AddressRange(rva, 1), &next_ranges);
+ for (size_t i = 0; i < next_ranges.size(); ++i) {
+ fprintf(output_, "PUBLIC %lx %x %ws\n", next_ranges[i].rva,
+ stack_param_size > 0 ? stack_param_size : 0, name.m_str);
+ }
+ }
+
+ return true;
+}
+
+bool PDBSourceLineWriter::PrintPDBInfo() {
+ PDBModuleInfo info;
+ if (!GetModuleInfo(&info)) {
+ return false;
+ }
+
+ // Hard-code "windows" for the OS because that's the only thing that makes
+ // sense for PDB files. (This might not be strictly correct for Windows CE
+ // support, but we don't care about that at the moment.)
+ fprintf(output_, "MODULE windows %ws %ws %ws\n",
+ info.cpu.c_str(), info.debug_identifier.c_str(),
+ info.debug_file.c_str());
+
+ return true;
+}
+
+bool PDBSourceLineWriter::PrintPEInfo() {
+ PEModuleInfo info;
+ if (!GetPEInfo(&info)) {
+ return false;
+ }
+
+ fprintf(output_, "INFO CODE_ID %ws %ws\n",
+ info.code_identifier.c_str(),
+ info.code_file.c_str());
+ return true;
+}
+
+// wcstol_positive_strict is sort of like wcstol, but much stricter. string
+// should be a buffer pointing to a null-terminated string containing only
+// decimal digits. If the entire string can be converted to an integer
+// without overflowing, and there are no non-digit characters before the
+// result is set to the value and this function returns true. Otherwise,
+// this function returns false. This is an alternative to the strtol, atoi,
+// and scanf families, which are not as strict about input and in some cases
+// don't provide a good way for the caller to determine if a conversion was
+// successful.
+static bool wcstol_positive_strict(wchar_t *string, int *result) {
+ int value = 0;
+ for (wchar_t *c = string; *c != '\0'; ++c) {
+ int last_value = value;
+ value *= 10;
+ // Detect overflow.
+ if (value / 10 != last_value || value < 0) {
+ return false;
+ }
+ if (*c < '0' || *c > '9') {
+ return false;
+ }
+ unsigned int c_value = *c - '0';
+ last_value = value;
+ value += c_value;
+ // Detect overflow.
+ if (value < last_value) {
+ return false;
+ }
+ // Forbid leading zeroes unless the string is just "0".
+ if (value == 0 && *(c+1) != '\0') {
+ return false;
+ }
+ }
+ *result = value;
+ return true;
+}
+
+bool PDBSourceLineWriter::FindPEFile() {
+ CComPtr<IDiaSymbol> global;
+ if (FAILED(session_->get_globalScope(&global))) {
+ fprintf(stderr, "get_globalScope failed\n");
+ return false;
+ }
+
+ CComBSTR symbols_file;
+ if (SUCCEEDED(global->get_symbolsFileName(&symbols_file))) {
+ wstring file(symbols_file);
+
+ // Look for an EXE or DLL file.
+ const wchar_t *extensions[] = { L"exe", L"dll" };
+ for (size_t i = 0; i < sizeof(extensions) / sizeof(extensions[0]); i++) {
+ size_t dot_pos = file.find_last_of(L".");
+ if (dot_pos != wstring::npos) {
+ file.replace(dot_pos + 1, wstring::npos, extensions[i]);
+ // Check if this file exists.
+ if (GetFileAttributesW(file.c_str()) != INVALID_FILE_ATTRIBUTES) {
+ code_file_ = file;
+ return true;
+ }
+ }
+ }
+ }
+
+ return false;
+}
+
+// static
+bool PDBSourceLineWriter::GetSymbolFunctionName(IDiaSymbol *function,
+ BSTR *name,
+ int *stack_param_size) {
+ *stack_param_size = -1;
+ const DWORD undecorate_options = UNDNAME_NO_MS_KEYWORDS |
+ UNDNAME_NO_FUNCTION_RETURNS |
+ UNDNAME_NO_ALLOCATION_MODEL |
+ UNDNAME_NO_ALLOCATION_LANGUAGE |
+ UNDNAME_NO_THISTYPE |
+ UNDNAME_NO_ACCESS_SPECIFIERS |
+ UNDNAME_NO_THROW_SIGNATURES |
+ UNDNAME_NO_MEMBER_TYPE |
+ UNDNAME_NO_RETURN_UDT_MODEL |
+ UNDNAME_NO_ECSU;
+
+ // Use get_undecoratedNameEx to get readable C++ names with arguments.
+ if (function->get_undecoratedNameEx(undecorate_options, name) != S_OK) {
+ if (function->get_name(name) != S_OK) {
+ fprintf(stderr, "failed to get function name\n");
+ return false;
+ }
+
+ // It's possible for get_name to return an empty string, so
+ // special-case that.
+ if (wcscmp(*name, L"") == 0) {
+ SysFreeString(*name);
+ // dwarf_cu_to_module.cc uses "<name omitted>", so match that.
+ *name = SysAllocString(L"<name omitted>");
+ return true;
+ }
+
+ // If a name comes from get_name because no undecorated form existed,
+ // it's already formatted properly to be used as output. Don't do any
+ // additional processing.
+ //
+ // MSVC7's DIA seems to not undecorate names in as many cases as MSVC8's.
+ // This will result in calling get_name for some C++ symbols, so
+ // all of the parameter and return type information may not be included in
+ // the name string.
+ } else {
+ // C++ uses a bogus "void" argument for functions and methods that don't
+ // take any parameters. Take it out of the undecorated name because it's
+ // ugly and unnecessary.
+ const wchar_t *replace_string = L"(void)";
+ const size_t replace_length = wcslen(replace_string);
+ const wchar_t *replacement_string = L"()";
+ size_t length = wcslen(*name);
+ if (length >= replace_length) {
+ wchar_t *name_end = *name + length - replace_length;
+ if (wcscmp(name_end, replace_string) == 0) {
+ WindowsStringUtils::safe_wcscpy(name_end, replace_length,
+ replacement_string);
+ length = wcslen(*name);
+ }
+ }
+
+ // Undecorate names used for stdcall and fastcall. These names prefix
+ // the identifier with '_' (stdcall) or '@' (fastcall) and suffix it
+ // with '@' followed by the number of bytes of parameters, in decimal.
+ // If such a name is found, take note of the size and undecorate it.
+ // Only do this for names that aren't C++, which is determined based on
+ // whether the undecorated name contains any ':' or '(' characters.
+ if (!wcschr(*name, ':') && !wcschr(*name, '(') &&
+ (*name[0] == '_' || *name[0] == '@')) {
+ wchar_t *last_at = wcsrchr(*name + 1, '@');
+ if (last_at && wcstol_positive_strict(last_at + 1, stack_param_size)) {
+ // If this function adheres to the fastcall convention, it accepts up
+ // to the first 8 bytes of parameters in registers (%ecx and %edx).
+ // We're only interested in the stack space used for parameters, so
+ // so subtract 8 and don't let the size go below 0.
+ if (*name[0] == '@') {
+ if (*stack_param_size > 8) {
+ *stack_param_size -= 8;
+ } else {
+ *stack_param_size = 0;
+ }
+ }
+
+ // Undecorate the name by moving it one character to the left in its
+ // buffer, and terminating it where the last '@' had been.
+ WindowsStringUtils::safe_wcsncpy(*name, length,
+ *name + 1, last_at - *name - 1);
+ } else if (*name[0] == '_') {
+ // This symbol's name is encoded according to the cdecl rules. The
+ // name doesn't end in a '@' character followed by a decimal positive
+ // integer, so it's not a stdcall name. Strip off the leading
+ // underscore.
+ WindowsStringUtils::safe_wcsncpy(*name, length, *name + 1, length);
+ }
+ }
+ }
+
+ return true;
+}
+
+// static
+int PDBSourceLineWriter::GetFunctionStackParamSize(IDiaSymbol *function) {
+ // This implementation is highly x86-specific.
+
+ // Gather the symbols corresponding to data.
+ CComPtr<IDiaEnumSymbols> data_children;
+ if (FAILED(function->findChildren(SymTagData, NULL, nsNone,
+ &data_children))) {
+ return 0;
+ }
+
+ // lowest_base is the lowest %ebp-relative byte offset used for a parameter.
+ // highest_end is one greater than the highest offset (i.e. base + length).
+ // Stack parameters are assumed to be contiguous, because in reality, they
+ // are.
+ int lowest_base = INT_MAX;
+ int highest_end = INT_MIN;
+
+ CComPtr<IDiaSymbol> child;
+ DWORD count;
+ while (SUCCEEDED(data_children->Next(1, &child, &count)) && count == 1) {
+ // If any operation fails at this point, just proceed to the next child.
+ // Use the next_child label instead of continue because child needs to
+ // be released before it's reused. Declare constructable/destructable
+ // types early to avoid gotos that cross initializations.
+ CComPtr<IDiaSymbol> child_type;
+
+ // DataIsObjectPtr is only used for |this|. Because |this| can be passed
+ // as a stack parameter, look for it in addition to traditional
+ // parameters.
+ DWORD child_kind;
+ if (FAILED(child->get_dataKind(&child_kind)) ||
+ (child_kind != DataIsParam && child_kind != DataIsObjectPtr)) {
+ goto next_child;
+ }
+
+ // Only concentrate on register-relative parameters. Parameters may also
+ // be enregistered (passed directly in a register), but those don't
+ // consume any stack space, so they're not of interest.
+ DWORD child_location_type;
+ if (FAILED(child->get_locationType(&child_location_type)) ||
+ child_location_type != LocIsRegRel) {
+ goto next_child;
+ }
+
+ // Of register-relative parameters, the only ones that make any sense are
+ // %ebp- or %esp-relative. Note that MSVC's debugging information always
+ // gives parameters as %ebp-relative even when a function doesn't use a
+ // traditional frame pointer and stack parameters are accessed relative to
+ // %esp, so just look for %ebp-relative parameters. If you wanted to
+ // access parameters, you'd probably want to treat these %ebp-relative
+ // offsets as if they were relative to %esp before a function's prolog
+ // executed.
+ DWORD child_register;
+ if (FAILED(child->get_registerId(&child_register)) ||
+ child_register != CV_REG_EBP) {
+ goto next_child;
+ }
+
+ LONG child_register_offset;
+ if (FAILED(child->get_offset(&child_register_offset))) {
+ goto next_child;
+ }
+
+ // IDiaSymbol::get_type can succeed but still pass back a NULL value.
+ if (FAILED(child->get_type(&child_type)) || !child_type) {
+ goto next_child;
+ }
+
+ ULONGLONG child_length;
+ if (FAILED(child_type->get_length(&child_length))) {
+ goto next_child;
+ }
+
+ int child_end = child_register_offset + static_cast<ULONG>(child_length);
+ if (child_register_offset < lowest_base) {
+ lowest_base = child_register_offset;
+ }
+ if (child_end > highest_end) {
+ highest_end = child_end;
+ }
+
+next_child:
+ child.Release();
+ }
+
+ int param_size = 0;
+ // Make sure lowest_base isn't less than 4, because [%esp+4] is the lowest
+ // possible address to find a stack parameter before executing a function's
+ // prolog (see above). Some optimizations cause parameter offsets to be
+ // lower than 4, but we're not concerned with those because we're only
+ // looking for parameters contained in addresses higher than where the
+ // return address is stored.
+ if (lowest_base < 4) {
+ lowest_base = 4;
+ }
+ if (highest_end > lowest_base) {
+ // All stack parameters are pushed as at least 4-byte quantities. If the
+ // last type was narrower than 4 bytes, promote it. This assumes that all
+ // parameters' offsets are 4-byte-aligned, which is always the case. Only
+ // worry about the last type, because we're not summing the type sizes,
+ // just looking at the lowest and highest offsets.
+ int remainder = highest_end % 4;
+ if (remainder) {
+ highest_end += 4 - remainder;
+ }
+
+ param_size = highest_end - lowest_base;
+ }
+
+ return param_size;
+}
+
+bool PDBSourceLineWriter::WriteMap(FILE *map_file) {
+ output_ = map_file;
+
+ // Load the OMAP information, and disable auto-translation of addresses in
+ // preference of doing it ourselves.
+ OmapData omap_data;
+ if (!GetOmapDataAndDisableTranslation(session_, &omap_data))
+ return false;
+ BuildImageMap(omap_data, &image_map_);
+
+ bool ret = PrintPDBInfo();
+ // This is not a critical piece of the symbol file.
+ PrintPEInfo();
+ ret = ret &&
+ PrintSourceFiles() &&
+ PrintFunctions() &&
+ PrintFrameData();
+
+ output_ = NULL;
+ return ret;
+}
+
+void PDBSourceLineWriter::Close() {
+ session_.Release();
+}
+
+bool PDBSourceLineWriter::GetModuleInfo(PDBModuleInfo *info) {
+ if (!info) {
+ return false;
+ }
+
+ info->debug_file.clear();
+ info->debug_identifier.clear();
+ info->cpu.clear();
+
+ CComPtr<IDiaSymbol> global;
+ if (FAILED(session_->get_globalScope(&global))) {
+ return false;
+ }
+
+ DWORD machine_type;
+ // get_machineType can return S_FALSE.
+ if (global->get_machineType(&machine_type) == S_OK) {
+ // The documentation claims that get_machineType returns a value from
+ // the CV_CPU_TYPE_e enumeration, but that's not the case.
+ // Instead, it returns one of the IMAGE_FILE_MACHINE values as
+ // defined here:
+ // http://msdn.microsoft.com/en-us/library/ms680313%28VS.85%29.aspx
+ switch (machine_type) {
+ case IMAGE_FILE_MACHINE_I386:
+ info->cpu = L"x86";
+ break;
+ case IMAGE_FILE_MACHINE_AMD64:
+ info->cpu = L"x86_64";
+ break;
+ default:
+ info->cpu = L"unknown";
+ break;
+ }
+ } else {
+ // Unexpected, but handle gracefully.
+ info->cpu = L"unknown";
+ }
+
+ // DWORD* and int* are not compatible. This is clean and avoids a cast.
+ DWORD age;
+ if (FAILED(global->get_age(&age))) {
+ return false;
+ }
+
+ bool uses_guid;
+ if (!UsesGUID(&uses_guid)) {
+ return false;
+ }
+
+ if (uses_guid) {
+ GUID guid;
+ if (FAILED(global->get_guid(&guid))) {
+ return false;
+ }
+
+ // Use the same format that the MS symbol server uses in filesystem
+ // hierarchies.
+ wchar_t age_string[9];
+ swprintf(age_string, sizeof(age_string) / sizeof(age_string[0]),
+ L"%x", age);
+
+ // remove when VC++7.1 is no longer supported
+ age_string[sizeof(age_string) / sizeof(age_string[0]) - 1] = L'\0';
+
+ info->debug_identifier = GUIDString::GUIDToSymbolServerWString(&guid);
+ info->debug_identifier.append(age_string);
+ } else {
+ DWORD signature;
+ if (FAILED(global->get_signature(&signature))) {
+ return false;
+ }
+
+ // Use the same format that the MS symbol server uses in filesystem
+ // hierarchies.
+ wchar_t identifier_string[17];
+ swprintf(identifier_string,
+ sizeof(identifier_string) / sizeof(identifier_string[0]),
+ L"%08X%x", signature, age);
+
+ // remove when VC++7.1 is no longer supported
+ identifier_string[sizeof(identifier_string) /
+ sizeof(identifier_string[0]) - 1] = L'\0';
+
+ info->debug_identifier = identifier_string;
+ }
+
+ CComBSTR debug_file_string;
+ if (FAILED(global->get_symbolsFileName(&debug_file_string))) {
+ return false;
+ }
+ info->debug_file =
+ WindowsStringUtils::GetBaseName(wstring(debug_file_string));
+
+ return true;
+}
+
+bool PDBSourceLineWriter::GetPEInfo(PEModuleInfo *info) {
+ if (!info) {
+ return false;
+ }
+
+ if (code_file_.empty() && !FindPEFile()) {
+ fprintf(stderr, "Couldn't locate EXE or DLL file.\n");
+ return false;
+ }
+
+ // Convert wchar to native charset because ImageLoad only takes
+ // a PSTR as input.
+ string code_file;
+ if (!WindowsStringUtils::safe_wcstombs(code_file_, &code_file)) {
+ return false;
+ }
+
+ AutoImage img(ImageLoad((PSTR)code_file.c_str(), NULL));
+ if (!img) {
+ fprintf(stderr, "Failed to open PE file: %s\n", code_file.c_str());
+ return false;
+ }
+
+ info->code_file = WindowsStringUtils::GetBaseName(code_file_);
+
+ // The date and time that the file was created by the linker.
+ DWORD TimeDateStamp = img->FileHeader->FileHeader.TimeDateStamp;
+ // The size of the file in bytes, including all headers.
+ DWORD SizeOfImage = 0;
+ PIMAGE_OPTIONAL_HEADER64 opt =
+ &((PIMAGE_NT_HEADERS64)img->FileHeader)->OptionalHeader;
+ if (opt->Magic == IMAGE_NT_OPTIONAL_HDR64_MAGIC) {
+ // 64-bit PE file.
+ SizeOfImage = opt->SizeOfImage;
+ } else {
+ // 32-bit PE file.
+ SizeOfImage = img->FileHeader->OptionalHeader.SizeOfImage;
+ }
+ wchar_t code_identifier[32];
+ swprintf(code_identifier,
+ sizeof(code_identifier) / sizeof(code_identifier[0]),
+ L"%08X%X", TimeDateStamp, SizeOfImage);
+ info->code_identifier = code_identifier;
+
+ return true;
+}
+
+bool PDBSourceLineWriter::UsesGUID(bool *uses_guid) {
+ if (!uses_guid)
+ return false;
+
+ CComPtr<IDiaSymbol> global;
+ if (FAILED(session_->get_globalScope(&global)))
+ return false;
+
+ GUID guid;
+ if (FAILED(global->get_guid(&guid)))
+ return false;
+
+ DWORD signature;
+ if (FAILED(global->get_signature(&signature)))
+ return false;
+
+ // There are two possibilities for guid: either it's a real 128-bit GUID
+ // as identified in a code module by a new-style CodeView record, or it's
+ // a 32-bit signature (timestamp) as identified by an old-style record.
+ // See MDCVInfoPDB70 and MDCVInfoPDB20 in minidump_format.h.
+ //
+ // Because DIA doesn't provide a way to directly determine whether a module
+ // uses a GUID or a 32-bit signature, this code checks whether the first 32
+ // bits of guid are the same as the signature, and if the rest of guid is
+ // zero. If so, then with a pretty high degree of certainty, there's an
+ // old-style CodeView record in use. This method will only falsely find an
+ // an old-style CodeView record if a real 128-bit GUID has its first 32
+ // bits set the same as the module's signature (timestamp) and the rest of
+ // the GUID is set to 0. This is highly unlikely.
+
+ GUID signature_guid = {signature}; // 0-initializes other members
+ *uses_guid = !IsEqualGUID(guid, signature_guid);
+ return true;
+}
+
+} // namespace google_breakpad
diff --git a/3rdParty/Breakpad/src/common/windows/pdb_source_line_writer.h b/3rdParty/Breakpad/src/common/windows/pdb_source_line_writer.h
new file mode 100644
index 0000000..e9e89bb
--- /dev/null
+++ b/3rdParty/Breakpad/src/common/windows/pdb_source_line_writer.h
@@ -0,0 +1,257 @@
+// Copyright (c) 2006, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// PDBSourceLineWriter uses a pdb file produced by Visual C++ to output
+// a line/address map for use with BasicSourceLineResolver.
+
+#ifndef COMMON_WINDOWS_PDB_SOURCE_LINE_WRITER_H_
+#define COMMON_WINDOWS_PDB_SOURCE_LINE_WRITER_H_
+
+#include <atlcomcli.h>
+
+#include <unordered_map>
+#include <string>
+
+#include "common/windows/omap.h"
+
+struct IDiaEnumLineNumbers;
+struct IDiaSession;
+struct IDiaSymbol;
+
+namespace google_breakpad {
+
+using std::wstring;
+using std::unordered_map;
+
+// A structure that carries information that identifies a pdb file.
+struct PDBModuleInfo {
+ public:
+ // The basename of the pdb file from which information was loaded.
+ wstring debug_file;
+
+ // The pdb's identifier. For recent pdb files, the identifier consists
+ // of the pdb's guid, in uppercase hexadecimal form without any dashes
+ // or separators, followed immediately by the pdb's age, also in
+ // uppercase hexadecimal form. For older pdb files which have no guid,
+ // the identifier is the pdb's 32-bit signature value, in zero-padded
+ // hexadecimal form, followed immediately by the pdb's age, in lowercase
+ // hexadecimal form.
+ wstring debug_identifier;
+
+ // A string identifying the cpu that the pdb is associated with.
+ // Currently, this may be "x86" or "unknown".
+ wstring cpu;
+};
+
+// A structure that carries information that identifies a PE file,
+// either an EXE or a DLL.
+struct PEModuleInfo {
+ // The basename of the PE file.
+ wstring code_file;
+
+ // The PE file's code identifier, which consists of its timestamp
+ // and file size concatenated together into a single hex string.
+ // (The fields IMAGE_OPTIONAL_HEADER::SizeOfImage and
+ // IMAGE_FILE_HEADER::TimeDateStamp, as defined in the ImageHlp
+ // documentation.) This is not well documented, if it's documented
+ // at all, but it's what symstore does and what DbgHelp supports.
+ wstring code_identifier;
+};
+
+class PDBSourceLineWriter {
+ public:
+ enum FileFormat {
+ PDB_FILE, // a .pdb file containing debug symbols
+ EXE_FILE, // a .exe or .dll file
+ ANY_FILE // try PDB_FILE and then EXE_FILE
+ };
+
+ explicit PDBSourceLineWriter();
+ ~PDBSourceLineWriter();
+
+ // Opens the given file. For executable files, the corresponding pdb
+ // file must be available; Open will be if it is not.
+ // If there is already a pdb file open, it is automatically closed.
+ // Returns true on success.
+ bool Open(const wstring &file, FileFormat format);
+
+ // Sets the code file full path. This is optional for 32-bit modules. It is
+ // also optional for 64-bit modules when there is an executable file stored
+ // in the same directory as the PDB file. It is only required for 64-bit
+ // modules when the executable file is not in the same location as the PDB
+ // file and it must be called after Open() and before WriteMap().
+ // If Open() was called for an executable file, then it is an error to call
+ // SetCodeFile() with a different file path and it will return false.
+ bool SetCodeFile(const wstring &exe_file);
+
+ // Writes a map file from the current pdb file to the given file stream.
+ // Returns true on success.
+ bool WriteMap(FILE *map_file);
+
+ // Closes the current pdb file and its associated resources.
+ void Close();
+
+ // Retrieves information about the module's debugging file. Returns
+ // true on success and false on failure.
+ bool GetModuleInfo(PDBModuleInfo *info);
+
+ // Retrieves information about the module's PE file. Returns
+ // true on success and false on failure.
+ bool GetPEInfo(PEModuleInfo *info);
+
+ // Sets uses_guid to true if the opened file uses a new-style CodeView
+ // record with a 128-bit GUID, or false if the opened file uses an old-style
+ // CodeView record. When no GUID is available, a 32-bit signature should be
+ // used to identify the module instead. If the information cannot be
+ // determined, this method returns false.
+ bool UsesGUID(bool *uses_guid);
+
+ private:
+ // Outputs the line/address pairs for each line in the enumerator.
+ // Returns true on success.
+ bool PrintLines(IDiaEnumLineNumbers *lines);
+
+ // Outputs a function address and name, followed by its source line list.
+ // block can be the same object as function, or it can be a reference
+ // to a code block that is lexically part of this function, but
+ // resides at a separate address.
+ // Returns true on success.
+ bool PrintFunction(IDiaSymbol *function, IDiaSymbol *block);
+
+ // Outputs all functions as described above. Returns true on success.
+ bool PrintFunctions();
+
+ // Outputs all of the source files in the session's pdb file.
+ // Returns true on success.
+ bool PrintSourceFiles();
+
+ // Outputs all of the frame information necessary to construct stack
+ // backtraces in the absence of frame pointers. For x86 data stored in
+ // .pdb files. Returns true on success.
+ bool PrintFrameDataUsingPDB();
+
+ // Outputs all of the frame information necessary to construct stack
+ // backtraces in the absence of frame pointers. For x64 data stored in
+ // .exe, .dll files. Returns true on success.
+ bool PrintFrameDataUsingEXE();
+
+ // Outputs all of the frame information necessary to construct stack
+ // backtraces in the absence of frame pointers. Returns true on success.
+ bool PrintFrameData();
+
+ // Outputs a single public symbol address and name, if the symbol corresponds
+ // to a code address. Returns true on success. If symbol is does not
+ // correspond to code, returns true without outputting anything.
+ bool PrintCodePublicSymbol(IDiaSymbol *symbol);
+
+ // Outputs a line identifying the PDB file that is being dumped, along with
+ // its uuid and age.
+ bool PrintPDBInfo();
+
+ // Outputs a line identifying the PE file corresponding to the PDB
+ // file that is being dumped, along with its code identifier,
+ // which consists of its timestamp and file size.
+ bool PrintPEInfo();
+
+ // Returns true if this filename has already been seen,
+ // and an ID is stored for it, or false if it has not.
+ bool FileIDIsCached(const wstring &file) {
+ return unique_files_.find(file) != unique_files_.end();
+ }
+
+ // Cache this filename and ID for later reuse.
+ void CacheFileID(const wstring &file, DWORD id) {
+ unique_files_[file] = id;
+ }
+
+ // Store this ID in the cache as a duplicate for this filename.
+ void StoreDuplicateFileID(const wstring &file, DWORD id) {
+ unordered_map<wstring, DWORD>::iterator iter = unique_files_.find(file);
+ if (iter != unique_files_.end()) {
+ // map this id to the previously seen one
+ file_ids_[id] = iter->second;
+ }
+ }
+
+ // Given a file's unique ID, return the ID that should be used to
+ // reference it. There may be multiple files with identical filenames
+ // but different unique IDs. The cache attempts to coalesce these into
+ // one ID per unique filename.
+ DWORD GetRealFileID(DWORD id) {
+ unordered_map<DWORD, DWORD>::iterator iter = file_ids_.find(id);
+ if (iter == file_ids_.end())
+ return id;
+ return iter->second;
+ }
+
+ // Find the PE file corresponding to the loaded PDB file, and
+ // set the code_file_ member. Returns false on failure.
+ bool FindPEFile();
+
+ // Returns the function name for a symbol. If possible, the name is
+ // undecorated. If the symbol's decorated form indicates the size of
+ // parameters on the stack, this information is returned in stack_param_size.
+ // Returns true on success. If the symbol doesn't encode parameter size
+ // information, stack_param_size is set to -1.
+ static bool GetSymbolFunctionName(IDiaSymbol *function, BSTR *name,
+ int *stack_param_size);
+
+ // Returns the number of bytes of stack space used for a function's
+ // parameters. function must have the tag SymTagFunction. In the event of
+ // a failure, returns 0, which is also a valid number of bytes.
+ static int GetFunctionStackParamSize(IDiaSymbol *function);
+
+ // The filename of the PE file corresponding to the currently-open
+ // pdb file.
+ wstring code_file_;
+
+ // The session for the currently-open pdb file.
+ CComPtr<IDiaSession> session_;
+
+ // The current output file for this WriteMap invocation.
+ FILE *output_;
+
+ // There may be many duplicate filenames with different IDs.
+ // This maps from the DIA "unique ID" to a single ID per unique
+ // filename.
+ unordered_map<DWORD, DWORD> file_ids_;
+ // This maps unique filenames to file IDs.
+ unordered_map<wstring, DWORD> unique_files_;
+
+ // This is used for calculating post-transform symbol addresses and lengths.
+ ImageMap image_map_;
+
+ // Disallow copy ctor and operator=
+ PDBSourceLineWriter(const PDBSourceLineWriter&);
+ void operator=(const PDBSourceLineWriter&);
+};
+
+} // namespace google_breakpad
+
+#endif // COMMON_WINDOWS_PDB_SOURCE_LINE_WRITER_H_
diff --git a/3rdParty/Breakpad/src/common/windows/string_utils-inl.h b/3rdParty/Breakpad/src/common/windows/string_utils-inl.h
index d281aaa..9b63607 100644
--- a/3rdParty/Breakpad/src/common/windows/string_utils-inl.h
+++ b/3rdParty/Breakpad/src/common/windows/string_utils-inl.h
@@ -30,8 +30,8 @@
// string_utils-inl.h: Safer string manipulation on Windows, supporting
// pre-MSVC8 environments.
-#ifndef COMMON_WINDOWS_STRING_UTILS_INL_H__
-#define COMMON_WINDOWS_STRING_UTILS_INL_H__
+#ifndef COMMON_WINDOWS_STRING_UTILS_INL_H_
+#define COMMON_WINDOWS_STRING_UTILS_INL_H_
#include <stdarg.h>
#include <wchar.h>
@@ -139,4 +139,4 @@ inline void WindowsStringUtils::safe_wcsncpy(wchar_t *destination,
} // namespace google_breakpad
-#endif // COMMON_WINDOWS_STRING_UTILS_INL_H__
+#endif // COMMON_WINDOWS_STRING_UTILS_INL_H_
diff --git a/3rdParty/Breakpad/src/common/windows/string_utils.cc b/3rdParty/Breakpad/src/common/windows/string_utils.cc
new file mode 100644
index 0000000..2728000
--- /dev/null
+++ b/3rdParty/Breakpad/src/common/windows/string_utils.cc
@@ -0,0 +1,133 @@
+// Copyright (c) 2006, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#include <cassert>
+#include <vector>
+
+#include "common/windows/string_utils-inl.h"
+
+namespace google_breakpad {
+
+// static
+wstring WindowsStringUtils::GetBaseName(const wstring &filename) {
+ wstring base_name(filename);
+ size_t slash_pos = base_name.find_last_of(L"/\\");
+ if (slash_pos != wstring::npos) {
+ base_name.erase(0, slash_pos + 1);
+ }
+ return base_name;
+}
+
+// static
+bool WindowsStringUtils::safe_mbstowcs(const string &mbs, wstring *wcs) {
+ assert(wcs);
+
+ // First, determine the length of the destination buffer.
+ size_t wcs_length;
+
+#if _MSC_VER >= 1400 // MSVC 2005/8
+ errno_t err;
+ if ((err = mbstowcs_s(&wcs_length, NULL, 0, mbs.c_str(), _TRUNCATE)) != 0) {
+ return false;
+ }
+ assert(wcs_length > 0);
+#else // _MSC_VER >= 1400
+ if ((wcs_length = mbstowcs(NULL, mbs.c_str(), mbs.length())) == (size_t)-1) {
+ return false;
+ }
+
+ // Leave space for the 0-terminator.
+ ++wcs_length;
+#endif // _MSC_VER >= 1400
+
+ std::vector<wchar_t> wcs_v(wcs_length);
+
+ // Now, convert.
+#if _MSC_VER >= 1400 // MSVC 2005/8
+ if ((err = mbstowcs_s(NULL, &wcs_v[0], wcs_length, mbs.c_str(),
+ _TRUNCATE)) != 0) {
+ return false;
+ }
+#else // _MSC_VER >= 1400
+ if (mbstowcs(&wcs_v[0], mbs.c_str(), mbs.length()) == (size_t)-1) {
+ return false;
+ }
+
+ // Ensure presence of 0-terminator.
+ wcs_v[wcs_length - 1] = '\0';
+#endif // _MSC_VER >= 1400
+
+ *wcs = &wcs_v[0];
+ return true;
+}
+
+// static
+bool WindowsStringUtils::safe_wcstombs(const wstring &wcs, string *mbs) {
+ assert(mbs);
+
+ // First, determine the length of the destination buffer.
+ size_t mbs_length;
+
+#if _MSC_VER >= 1400 // MSVC 2005/8
+ errno_t err;
+ if ((err = wcstombs_s(&mbs_length, NULL, 0, wcs.c_str(), _TRUNCATE)) != 0) {
+ return false;
+ }
+ assert(mbs_length > 0);
+#else // _MSC_VER >= 1400
+ if ((mbs_length = wcstombs(NULL, wcs.c_str(), wcs.length())) == (size_t)-1) {
+ return false;
+ }
+
+ // Leave space for the 0-terminator.
+ ++mbs_length;
+#endif // _MSC_VER >= 1400
+
+ std::vector<char> mbs_v(mbs_length);
+
+ // Now, convert.
+#if _MSC_VER >= 1400 // MSVC 2005/8
+ if ((err = wcstombs_s(NULL, &mbs_v[0], mbs_length, wcs.c_str(),
+ _TRUNCATE)) != 0) {
+ return false;
+ }
+#else // _MSC_VER >= 1400
+ if (wcstombs(&mbs_v[0], wcs.c_str(), wcs.length()) == (size_t)-1) {
+ return false;
+ }
+
+ // Ensure presence of 0-terminator.
+ mbs_v[mbs_length - 1] = '\0';
+#endif // _MSC_VER >= 1400
+
+ *mbs = &mbs_v[0];
+ return true;
+}
+
+} // namespace google_breakpad
diff --git a/3rdParty/Breakpad/src/config.h.in b/3rdParty/Breakpad/src/config.h.in
new file mode 100644
index 0000000..618e283
--- /dev/null
+++ b/3rdParty/Breakpad/src/config.h.in
@@ -0,0 +1,91 @@
+/* src/config.h.in. Generated from configure.ac by autoheader. */
+
+/* Define to 1 if you have the `arc4random' function. */
+#undef HAVE_ARC4RANDOM
+
+/* Define to 1 if you have the <a.out.h> header file. */
+#undef HAVE_A_OUT_H
+
+/* define if the compiler supports basic C++11 syntax */
+#undef HAVE_CXX11
+
+/* Define to 1 if you have the `getrandom' function. */
+#undef HAVE_GETRANDOM
+
+/* Define to 1 if you have the <inttypes.h> header file. */
+#undef HAVE_INTTYPES_H
+
+/* Define to 1 if you have the <memory.h> header file. */
+#undef HAVE_MEMORY_H
+
+/* Define if you have POSIX threads libraries and header files. */
+#undef HAVE_PTHREAD
+
+/* Define to 1 if you have the <stdint.h> header file. */
+#undef HAVE_STDINT_H
+
+/* Define to 1 if you have the <stdlib.h> header file. */
+#undef HAVE_STDLIB_H
+
+/* Define to 1 if you have the <strings.h> header file. */
+#undef HAVE_STRINGS_H
+
+/* Define to 1 if you have the <string.h> header file. */
+#undef HAVE_STRING_H
+
+/* Define to 1 if you have the <sys/random.h> header file. */
+#undef HAVE_SYS_RANDOM_H
+
+/* Define to 1 if you have the <sys/stat.h> header file. */
+#undef HAVE_SYS_STAT_H
+
+/* Define to 1 if you have the <sys/types.h> header file. */
+#undef HAVE_SYS_TYPES_H
+
+/* Define to 1 if you have the <unistd.h> header file. */
+#undef HAVE_UNISTD_H
+
+/* Fallback definition for old systems */
+#undef O_CLOEXEC
+
+/* Name of package */
+#undef PACKAGE
+
+/* Define to the address where bug reports for this package should be sent. */
+#undef PACKAGE_BUGREPORT
+
+/* Define to the full name of this package. */
+#undef PACKAGE_NAME
+
+/* Define to the full name and version of this package. */
+#undef PACKAGE_STRING
+
+/* Define to the one symbol short name of this package. */
+#undef PACKAGE_TARNAME
+
+/* Define to the home page for this package. */
+#undef PACKAGE_URL
+
+/* Define to the version of this package. */
+#undef PACKAGE_VERSION
+
+/* Define to necessary symbol if this constant uses a non-standard name on
+ your system. */
+#undef PTHREAD_CREATE_JOINABLE
+
+/* Define to 1 if you have the ANSI C header files. */
+#undef STDC_HEADERS
+
+/* Version number of package */
+#undef VERSION
+
+/* Enable large inode numbers on Mac OS X 10.5. */
+#ifndef _DARWIN_USE_64_BIT_INODE
+# define _DARWIN_USE_64_BIT_INODE 1
+#endif
+
+/* Number of bits in a file offset, on hosts where this is settable. */
+#undef _FILE_OFFSET_BITS
+
+/* Define for large files, on AIX-style hosts. */
+#undef _LARGE_FILES
diff --git a/3rdParty/Breakpad/src/google_breakpad/common/breakpad_types.h b/3rdParty/Breakpad/src/google_breakpad/common/breakpad_types.h
index 926b47f..d882804 100644
--- a/3rdParty/Breakpad/src/google_breakpad/common/breakpad_types.h
+++ b/3rdParty/Breakpad/src/google_breakpad/common/breakpad_types.h
@@ -31,7 +31,7 @@
*
* (This is C99 source, please don't corrupt it with C++.)
*
- * This file ensures that types u_intN_t are defined for N = 8, 16, 32, and
+ * This file ensures that types uintN_t are defined for N = 8, 16, 32, and
* 64. Types of precise widths are crucial to the task of writing data
* structures on one platform and reading them on another.
*
@@ -40,38 +40,23 @@
#ifndef GOOGLE_BREAKPAD_COMMON_BREAKPAD_TYPES_H__
#define GOOGLE_BREAKPAD_COMMON_BREAKPAD_TYPES_H__
-#ifndef _WIN32
+#if (defined(_INTTYPES_H) || defined(_INTTYPES_H_)) && \
+ !defined(__STDC_FORMAT_MACROS)
+#error "inttypes.h has already been included before this header file, but "
+#error "without __STDC_FORMAT_MACROS defined."
+#endif
-#include <sys/types.h>
#ifndef __STDC_FORMAT_MACROS
#define __STDC_FORMAT_MACROS
#endif /* __STDC_FORMAT_MACROS */
#include <inttypes.h>
-#if defined(__SUNPRO_CC) || (defined(__GNUC__) && defined(__sun__))
-typedef uint8_t u_int8_t;
-typedef uint16_t u_int16_t;
-typedef uint32_t u_int32_t;
-typedef uint64_t u_int64_t;
-#endif
-
-#else /* !_WIN32 */
-
-#include <WTypes.h>
-
-typedef unsigned __int8 u_int8_t;
-typedef unsigned __int16 u_int16_t;
-typedef unsigned __int32 u_int32_t;
-typedef unsigned __int64 u_int64_t;
-
-#endif /* !_WIN32 */
-
typedef struct {
- u_int64_t high;
- u_int64_t low;
-} u_int128_t;
+ uint64_t high;
+ uint64_t low;
+} uint128_struct;
-typedef u_int64_t breakpad_time_t;
+typedef uint64_t breakpad_time_t;
/* Try to get PRIx64 from inttypes.h, but if it's not defined, fall back to
* llx, which is the format string for "long long" - this is a 64-bit
diff --git a/3rdParty/Breakpad/src/google_breakpad/common/minidump_cpu_amd64.h b/3rdParty/Breakpad/src/google_breakpad/common/minidump_cpu_amd64.h
index fa6a996..4256706 100644
--- a/3rdParty/Breakpad/src/google_breakpad/common/minidump_cpu_amd64.h
+++ b/3rdParty/Breakpad/src/google_breakpad/common/minidump_cpu_amd64.h
@@ -67,7 +67,7 @@
* equivalent types and values in the Windows Platform SDK are given in
* comments.
*
- * Author: Mark Mentovai
+ * Author: Mark Mentovai
* Change to split into its own file: Neal Sidhwaney */
#ifndef GOOGLE_BREAKPAD_COMMON_MINIDUMP_CPU_AMD64_H__
@@ -79,22 +79,22 @@
*/
typedef struct {
- u_int16_t control_word;
- u_int16_t status_word;
- u_int8_t tag_word;
- u_int8_t reserved1;
- u_int16_t error_opcode;
- u_int32_t error_offset;
- u_int16_t error_selector;
- u_int16_t reserved2;
- u_int32_t data_offset;
- u_int16_t data_selector;
- u_int16_t reserved3;
- u_int32_t mx_csr;
- u_int32_t mx_csr_mask;
- u_int128_t float_registers[8];
- u_int128_t xmm_registers[16];
- u_int8_t reserved4[96];
+ uint16_t control_word;
+ uint16_t status_word;
+ uint8_t tag_word;
+ uint8_t reserved1;
+ uint16_t error_opcode;
+ uint32_t error_offset;
+ uint16_t error_selector;
+ uint16_t reserved2;
+ uint32_t data_offset;
+ uint16_t data_selector;
+ uint16_t reserved3;
+ uint32_t mx_csr;
+ uint32_t mx_csr_mask;
+ uint128_struct float_registers[8];
+ uint128_struct xmm_registers[16];
+ uint8_t reserved4[96];
} MDXmmSaveArea32AMD64; /* XMM_SAVE_AREA32 */
#define MD_CONTEXT_AMD64_VR_COUNT 26
@@ -103,63 +103,63 @@ typedef struct {
/*
* Register parameter home addresses.
*/
- u_int64_t p1_home;
- u_int64_t p2_home;
- u_int64_t p3_home;
- u_int64_t p4_home;
- u_int64_t p5_home;
- u_int64_t p6_home;
+ uint64_t p1_home;
+ uint64_t p2_home;
+ uint64_t p3_home;
+ uint64_t p4_home;
+ uint64_t p5_home;
+ uint64_t p6_home;
/* The next field determines the layout of the structure, and which parts
* of it are populated */
- u_int32_t context_flags;
- u_int32_t mx_csr;
+ uint32_t context_flags;
+ uint32_t mx_csr;
/* The next register is included with MD_CONTEXT_AMD64_CONTROL */
- u_int16_t cs;
+ uint16_t cs;
/* The next 4 registers are included with MD_CONTEXT_AMD64_SEGMENTS */
- u_int16_t ds;
- u_int16_t es;
- u_int16_t fs;
- u_int16_t gs;
+ uint16_t ds;
+ uint16_t es;
+ uint16_t fs;
+ uint16_t gs;
/* The next 2 registers are included with MD_CONTEXT_AMD64_CONTROL */
- u_int16_t ss;
- u_int32_t eflags;
-
+ uint16_t ss;
+ uint32_t eflags;
+
/* The next 6 registers are included with MD_CONTEXT_AMD64_DEBUG_REGISTERS */
- u_int64_t dr0;
- u_int64_t dr1;
- u_int64_t dr2;
- u_int64_t dr3;
- u_int64_t dr6;
- u_int64_t dr7;
+ uint64_t dr0;
+ uint64_t dr1;
+ uint64_t dr2;
+ uint64_t dr3;
+ uint64_t dr6;
+ uint64_t dr7;
/* The next 4 registers are included with MD_CONTEXT_AMD64_INTEGER */
- u_int64_t rax;
- u_int64_t rcx;
- u_int64_t rdx;
- u_int64_t rbx;
+ uint64_t rax;
+ uint64_t rcx;
+ uint64_t rdx;
+ uint64_t rbx;
/* The next register is included with MD_CONTEXT_AMD64_CONTROL */
- u_int64_t rsp;
+ uint64_t rsp;
/* The next 11 registers are included with MD_CONTEXT_AMD64_INTEGER */
- u_int64_t rbp;
- u_int64_t rsi;
- u_int64_t rdi;
- u_int64_t r8;
- u_int64_t r9;
- u_int64_t r10;
- u_int64_t r11;
- u_int64_t r12;
- u_int64_t r13;
- u_int64_t r14;
- u_int64_t r15;
+ uint64_t rbp;
+ uint64_t rsi;
+ uint64_t rdi;
+ uint64_t r8;
+ uint64_t r9;
+ uint64_t r10;
+ uint64_t r11;
+ uint64_t r12;
+ uint64_t r13;
+ uint64_t r14;
+ uint64_t r15;
/* The next register is included with MD_CONTEXT_AMD64_CONTROL */
- u_int64_t rip;
+ uint64_t rip;
/* The next set of registers are included with
* MD_CONTEXT_AMD64_FLOATING_POINT
@@ -167,37 +167,37 @@ typedef struct {
union {
MDXmmSaveArea32AMD64 flt_save;
struct {
- u_int128_t header[2];
- u_int128_t legacy[8];
- u_int128_t xmm0;
- u_int128_t xmm1;
- u_int128_t xmm2;
- u_int128_t xmm3;
- u_int128_t xmm4;
- u_int128_t xmm5;
- u_int128_t xmm6;
- u_int128_t xmm7;
- u_int128_t xmm8;
- u_int128_t xmm9;
- u_int128_t xmm10;
- u_int128_t xmm11;
- u_int128_t xmm12;
- u_int128_t xmm13;
- u_int128_t xmm14;
- u_int128_t xmm15;
+ uint128_struct header[2];
+ uint128_struct legacy[8];
+ uint128_struct xmm0;
+ uint128_struct xmm1;
+ uint128_struct xmm2;
+ uint128_struct xmm3;
+ uint128_struct xmm4;
+ uint128_struct xmm5;
+ uint128_struct xmm6;
+ uint128_struct xmm7;
+ uint128_struct xmm8;
+ uint128_struct xmm9;
+ uint128_struct xmm10;
+ uint128_struct xmm11;
+ uint128_struct xmm12;
+ uint128_struct xmm13;
+ uint128_struct xmm14;
+ uint128_struct xmm15;
} sse_registers;
};
- u_int128_t vector_register[MD_CONTEXT_AMD64_VR_COUNT];
- u_int64_t vector_control;
+ uint128_struct vector_register[MD_CONTEXT_AMD64_VR_COUNT];
+ uint64_t vector_control;
/* The next 5 registers are included with MD_CONTEXT_AMD64_DEBUG_REGISTERS */
- u_int64_t debug_control;
- u_int64_t last_branch_to_rip;
- u_int64_t last_branch_from_rip;
- u_int64_t last_exception_to_rip;
- u_int64_t last_exception_from_rip;
-
+ uint64_t debug_control;
+ uint64_t last_branch_to_rip;
+ uint64_t last_branch_from_rip;
+ uint64_t last_exception_to_rip;
+ uint64_t last_exception_from_rip;
+
} MDRawContextAMD64; /* CONTEXT */
/* For (MDRawContextAMD64).context_flags. These values indicate the type of
diff --git a/3rdParty/Breakpad/src/google_breakpad/common/minidump_cpu_arm.h b/3rdParty/Breakpad/src/google_breakpad/common/minidump_cpu_arm.h
index dd07129..6a71138 100644
--- a/3rdParty/Breakpad/src/google_breakpad/common/minidump_cpu_arm.h
+++ b/3rdParty/Breakpad/src/google_breakpad/common/minidump_cpu_arm.h
@@ -77,13 +77,13 @@
* are not exactly minidumps.
*/
typedef struct {
- u_int64_t fpscr; /* FPU status register */
+ uint64_t fpscr; /* FPU status register */
/* 32 64-bit floating point registers, d0 .. d31. */
- u_int64_t regs[MD_FLOATINGSAVEAREA_ARM_FPR_COUNT];
+ uint64_t regs[MD_FLOATINGSAVEAREA_ARM_FPR_COUNT];
/* Miscellaneous control words */
- u_int32_t extra[MD_FLOATINGSAVEAREA_ARM_FPEXTRA_COUNT];
+ uint32_t extra[MD_FLOATINGSAVEAREA_ARM_FPEXTRA_COUNT];
} MDFloatingSaveAreaARM;
#define MD_CONTEXT_ARM_GPR_COUNT 16
@@ -92,7 +92,7 @@ typedef struct {
/* The next field determines the layout of the structure, and which parts
* of it are populated
*/
- u_int32_t context_flags;
+ uint32_t context_flags;
/* 16 32-bit integer registers, r0 .. r15
* Note the following fixed uses:
@@ -100,7 +100,7 @@ typedef struct {
* r14 is the link register
* r15 is the program counter
*/
- u_int32_t iregs[MD_CONTEXT_ARM_GPR_COUNT];
+ uint32_t iregs[MD_CONTEXT_ARM_GPR_COUNT];
/* CPSR (flags, basically): 32 bits:
bit 31 - N (negative)
@@ -109,14 +109,14 @@ typedef struct {
bit 28 - V (overflow)
bit 27 - Q (saturation flag, sticky)
All other fields -- ignore */
- u_int32_t cpsr;
+ uint32_t cpsr;
/* The next field is included with MD_CONTEXT_ARM_FLOATING_POINT */
MDFloatingSaveAreaARM float_save;
} MDRawContextARM;
-/* Indices into iregs for registers with a dedicated or conventional
+/* Indices into iregs for registers with a dedicated or conventional
* purpose.
*/
enum MDARMRegisterNumbers {
diff --git a/3rdParty/Breakpad/src/google_breakpad/common/minidump_cpu_arm64.h b/3rdParty/Breakpad/src/google_breakpad/common/minidump_cpu_arm64.h
new file mode 100644
index 0000000..5ace0d9
--- /dev/null
+++ b/3rdParty/Breakpad/src/google_breakpad/common/minidump_cpu_arm64.h
@@ -0,0 +1,140 @@
+/* Copyright 2013 Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ * * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */
+
+/* minidump_format.h: A cross-platform reimplementation of minidump-related
+ * portions of DbgHelp.h from the Windows Platform SDK.
+ *
+ * (This is C99 source, please don't corrupt it with C++.)
+ *
+ * This file contains the necessary definitions to read minidump files
+ * produced on ARM. These files may be read on any platform provided
+ * that the alignments of these structures on the processing system are
+ * identical to the alignments of these structures on the producing system.
+ * For this reason, precise-sized types are used. The structures defined
+ * by this file have been laid out to minimize alignment problems by
+ * ensuring that all members are aligned on their natural boundaries.
+ * In some cases, tail-padding may be significant when different ABIs specify
+ * different tail-padding behaviors. To avoid problems when reading or
+ * writing affected structures, MD_*_SIZE macros are provided where needed,
+ * containing the useful size of the structures without padding.
+ *
+ * Structures that are defined by Microsoft to contain a zero-length array
+ * are instead defined here to contain an array with one element, as
+ * zero-length arrays are forbidden by standard C and C++. In these cases,
+ * *_minsize constants are provided to be used in place of sizeof. For a
+ * cleaner interface to these sizes when using C++, see minidump_size.h.
+ *
+ * These structures are also sufficient to populate minidump files.
+ *
+ * Because precise data type sizes are crucial for this implementation to
+ * function properly and portably, a set of primitive types with known sizes
+ * are used as the basis of each structure defined by this file.
+ *
+ * Author: Colin Blundell
+ */
+
+/*
+ * ARM64 support
+ */
+
+#ifndef GOOGLE_BREAKPAD_COMMON_MINIDUMP_CPU_ARM64_H__
+#define GOOGLE_BREAKPAD_COMMON_MINIDUMP_CPU_ARM64_H__
+
+#define MD_FLOATINGSAVEAREA_ARM64_FPR_COUNT 32
+
+typedef struct {
+ uint32_t fpsr; /* FPU status register */
+ uint32_t fpcr; /* FPU control register */
+
+ /* 32 128-bit floating point registers, d0 .. d31. */
+ uint128_struct regs[MD_FLOATINGSAVEAREA_ARM64_FPR_COUNT];
+} MDFloatingSaveAreaARM64;
+
+#define MD_CONTEXT_ARM64_GPR_COUNT 33
+
+/* Use the same 32-bit alignment when accessing this structure from 64-bit code
+ * as is used natively in 32-bit code. */
+#pragma pack(push, 4)
+
+typedef struct {
+ /* The next field determines the layout of the structure, and which parts
+ * of it are populated
+ */
+ uint64_t context_flags;
+
+ /* 33 64-bit integer registers, x0 .. x31 + the PC
+ * Note the following fixed uses:
+ * x29 is the frame pointer
+ * x30 is the link register
+ * x31 is the stack pointer
+ * The PC is effectively x32.
+ */
+ uint64_t iregs[MD_CONTEXT_ARM64_GPR_COUNT];
+
+ /* CPSR (flags, basically): 32 bits:
+ bit 31 - N (negative)
+ bit 30 - Z (zero)
+ bit 29 - C (carry)
+ bit 28 - V (overflow)
+ bit 27 - Q (saturation flag, sticky)
+ All other fields -- ignore */
+ uint32_t cpsr;
+
+ /* The next field is included with MD_CONTEXT64_ARM_FLOATING_POINT */
+ MDFloatingSaveAreaARM64 float_save;
+
+} MDRawContextARM64;
+
+#pragma pack(pop)
+
+/* Indices into iregs for registers with a dedicated or conventional
+ * purpose.
+ */
+enum MDARM64RegisterNumbers {
+ MD_CONTEXT_ARM64_REG_FP = 29,
+ MD_CONTEXT_ARM64_REG_LR = 30,
+ MD_CONTEXT_ARM64_REG_SP = 31,
+ MD_CONTEXT_ARM64_REG_PC = 32
+};
+
+/* For (MDRawContextARM64).context_flags. These values indicate the type of
+ * context stored in the structure. MD_CONTEXT_ARM64 is Breakpad-defined.
+ * This value was chosen to avoid likely conflicts with MD_CONTEXT_*
+ * for other CPUs. */
+#define MD_CONTEXT_ARM64 0x80000000
+#define MD_CONTEXT_ARM64_INTEGER (MD_CONTEXT_ARM64 | 0x00000002)
+#define MD_CONTEXT_ARM64_FLOATING_POINT (MD_CONTEXT_ARM64 | 0x00000004)
+
+#define MD_CONTEXT_ARM64_FULL (MD_CONTEXT_ARM64_INTEGER | \
+ MD_CONTEXT_ARM64_FLOATING_POINT)
+
+#define MD_CONTEXT_ARM64_ALL (MD_CONTEXT_ARM64_INTEGER | \
+ MD_CONTEXT_ARM64_FLOATING_POINT)
+
+#endif /* GOOGLE_BREAKPAD_COMMON_MINIDUMP_CPU_ARM64_H__ */
diff --git a/3rdParty/Breakpad/src/google_breakpad/common/minidump_cpu_mips.h b/3rdParty/Breakpad/src/google_breakpad/common/minidump_cpu_mips.h
new file mode 100644
index 0000000..f4e2b58
--- /dev/null
+++ b/3rdParty/Breakpad/src/google_breakpad/common/minidump_cpu_mips.h
@@ -0,0 +1,176 @@
+/* Copyright (c) 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ * * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */
+
+/* minidump_format.h: A cross-platform reimplementation of minidump-related
+ * portions of DbgHelp.h from the Windows Platform SDK.
+ *
+ * (This is C99 source, please don't corrupt it with C++.)
+ *
+ * This file contains the necessary definitions to read minidump files
+ * produced on MIPS. These files may be read on any platform provided
+ * that the alignments of these structures on the processing system are
+ * identical to the alignments of these structures on the producing system.
+ * For this reason, precise-sized types are used. The structures defined
+ * by this file have been laid out to minimize alignment problems by
+ * ensuring that all members are aligned on their natural boundaries.
+ * In some cases, tail-padding may be significant when different ABIs specify
+ * different tail-padding behaviors. To avoid problems when reading or
+ * writing affected structures, MD_*_SIZE macros are provided where needed,
+ * containing the useful size of the structures without padding.
+ *
+ * Structures that are defined by Microsoft to contain a zero-length array
+ * are instead defined here to contain an array with one element, as
+ * zero-length arrays are forbidden by standard C and C++. In these cases,
+ * *_minsize constants are provided to be used in place of sizeof. For a
+ * cleaner interface to these sizes when using C++, see minidump_size.h.
+ *
+ * These structures are also sufficient to populate minidump files.
+ *
+ * Because precise data type sizes are crucial for this implementation to
+ * function properly and portably, a set of primitive types with known sizes
+ * are used as the basis of each structure defined by this file.
+ *
+ * Author: Chris Dearman
+ */
+
+/*
+ * MIPS support
+ */
+
+#ifndef GOOGLE_BREAKPAD_COMMON_MINIDUMP_CPU_MIPS_H__
+#define GOOGLE_BREAKPAD_COMMON_MINIDUMP_CPU_MIPS_H__
+
+#define MD_CONTEXT_MIPS_GPR_COUNT 32
+#define MD_FLOATINGSAVEAREA_MIPS_FPR_COUNT 32
+#define MD_CONTEXT_MIPS_DSP_COUNT 3
+
+/*
+ * Note that these structures *do not* map directly to the CONTEXT
+ * structure defined in WinNT.h in the Windows Mobile SDK. That structure
+ * does not accomodate VFPv3, and I'm unsure if it was ever used in the
+ * wild anyway, as Windows CE only seems to produce "cedumps" which
+ * are not exactly minidumps.
+ */
+typedef struct {
+ /* 32 64-bit floating point registers, f0..f31 */
+ uint64_t regs[MD_FLOATINGSAVEAREA_MIPS_FPR_COUNT];
+
+ uint32_t fpcsr; /* FPU status register. */
+ uint32_t fir; /* FPU implementation register. */
+} MDFloatingSaveAreaMIPS;
+
+typedef struct {
+ /* The next field determines the layout of the structure, and which parts
+ * of it are populated.
+ */
+ uint32_t context_flags;
+ uint32_t _pad0;
+
+ /* 32 64-bit integer registers, r0..r31.
+ * Note the following fixed uses:
+ * r29 is the stack pointer.
+ * r31 is the return address.
+ */
+ uint64_t iregs[MD_CONTEXT_MIPS_GPR_COUNT];
+
+ /* multiply/divide result. */
+ uint64_t mdhi, mdlo;
+
+ /* DSP accumulators. */
+ uint32_t hi[MD_CONTEXT_MIPS_DSP_COUNT];
+ uint32_t lo[MD_CONTEXT_MIPS_DSP_COUNT];
+ uint32_t dsp_control;
+ uint32_t _pad1;
+
+ uint64_t epc;
+ uint64_t badvaddr;
+ uint32_t status;
+ uint32_t cause;
+
+ /* The next field is included with MD_CONTEXT_MIPS_FLOATING_POINT. */
+ MDFloatingSaveAreaMIPS float_save;
+
+} MDRawContextMIPS;
+
+/* Indices into iregs for registers with a dedicated or conventional
+ * purpose.
+ */
+enum MDMIPSRegisterNumbers {
+ MD_CONTEXT_MIPS_REG_S0 = 16,
+ MD_CONTEXT_MIPS_REG_S1 = 17,
+ MD_CONTEXT_MIPS_REG_S2 = 18,
+ MD_CONTEXT_MIPS_REG_S3 = 19,
+ MD_CONTEXT_MIPS_REG_S4 = 20,
+ MD_CONTEXT_MIPS_REG_S5 = 21,
+ MD_CONTEXT_MIPS_REG_S6 = 22,
+ MD_CONTEXT_MIPS_REG_S7 = 23,
+ MD_CONTEXT_MIPS_REG_GP = 28,
+ MD_CONTEXT_MIPS_REG_SP = 29,
+ MD_CONTEXT_MIPS_REG_FP = 30,
+ MD_CONTEXT_MIPS_REG_RA = 31,
+};
+
+/* For (MDRawContextMIPS).context_flags. These values indicate the type of
+ * context stored in the structure. */
+/* CONTEXT_MIPS from the Windows CE 5.0 SDK. This value isn't correct
+ * because this bit can be used for flags. Presumably this value was
+ * never actually used in minidumps, but only in "CEDumps" which
+ * are a whole parallel minidump file format for Windows CE.
+ * Therefore, Breakpad defines its own value for MIPS CPUs.
+ */
+#define MD_CONTEXT_MIPS 0x00040000
+#define MD_CONTEXT_MIPS_INTEGER (MD_CONTEXT_MIPS | 0x00000002)
+#define MD_CONTEXT_MIPS_FLOATING_POINT (MD_CONTEXT_MIPS | 0x00000004)
+#define MD_CONTEXT_MIPS_DSP (MD_CONTEXT_MIPS | 0x00000008)
+
+#define MD_CONTEXT_MIPS_FULL (MD_CONTEXT_MIPS_INTEGER | \
+ MD_CONTEXT_MIPS_FLOATING_POINT | \
+ MD_CONTEXT_MIPS_DSP)
+
+#define MD_CONTEXT_MIPS_ALL (MD_CONTEXT_MIPS_INTEGER | \
+ MD_CONTEXT_MIPS_FLOATING_POINT \
+ MD_CONTEXT_MIPS_DSP)
+
+/**
+ * Breakpad defines for MIPS64
+ */
+#define MD_CONTEXT_MIPS64 0x00080000
+#define MD_CONTEXT_MIPS64_INTEGER (MD_CONTEXT_MIPS64 | 0x00000002)
+#define MD_CONTEXT_MIPS64_FLOATING_POINT (MD_CONTEXT_MIPS64 | 0x00000004)
+#define MD_CONTEXT_MIPS64_DSP (MD_CONTEXT_MIPS64 | 0x00000008)
+
+#define MD_CONTEXT_MIPS64_FULL (MD_CONTEXT_MIPS64_INTEGER | \
+ MD_CONTEXT_MIPS64_FLOATING_POINT | \
+ MD_CONTEXT_MIPS64_DSP)
+
+#define MD_CONTEXT_MIPS64_ALL (MD_CONTEXT_MIPS64_INTEGER | \
+ MD_CONTEXT_MIPS64_FLOATING_POINT \
+ MD_CONTEXT_MIPS64_DSP)
+
+#endif // GOOGLE_BREAKPAD_COMMON_MINIDUMP_CPU_MIPS_H__
diff --git a/3rdParty/Breakpad/src/google_breakpad/common/minidump_cpu_ppc.h b/3rdParty/Breakpad/src/google_breakpad/common/minidump_cpu_ppc.h
index 038e921..b24cc42 100644
--- a/3rdParty/Breakpad/src/google_breakpad/common/minidump_cpu_ppc.h
+++ b/3rdParty/Breakpad/src/google_breakpad/common/minidump_cpu_ppc.h
@@ -81,11 +81,11 @@
#define MD_FLOATINGSAVEAREA_PPC_FPR_COUNT 32
typedef struct {
- /* fpregs is a double[32] in mach/ppc/_types.h, but a u_int64_t is used
+ /* fpregs is a double[32] in mach/ppc/_types.h, but a uint64_t is used
* here for precise sizing. */
- u_int64_t fpregs[MD_FLOATINGSAVEAREA_PPC_FPR_COUNT];
- u_int32_t fpscr_pad;
- u_int32_t fpscr; /* Status/control */
+ uint64_t fpregs[MD_FLOATINGSAVEAREA_PPC_FPR_COUNT];
+ uint32_t fpscr_pad;
+ uint32_t fpscr; /* Status/control */
} MDFloatingSaveAreaPPC; /* Based on ppc_float_state */
@@ -94,11 +94,11 @@ typedef struct {
typedef struct {
/* Vector registers (including vscr) are 128 bits, but mach/ppc/_types.h
* exposes them as four 32-bit quantities. */
- u_int128_t save_vr[MD_VECTORSAVEAREA_PPC_VR_COUNT];
- u_int128_t save_vscr; /* Status/control */
- u_int32_t save_pad5[4];
- u_int32_t save_vrvalid; /* Identifies which vector registers are saved */
- u_int32_t save_pad6[7];
+ uint128_struct save_vr[MD_VECTORSAVEAREA_PPC_VR_COUNT];
+ uint128_struct save_vscr; /* Status/control */
+ uint32_t save_pad5[4];
+ uint32_t save_vrvalid; /* Indicates which vector registers are saved */
+ uint32_t save_pad6[7];
} MDVectorSaveAreaPPC; /* ppc_vector_state */
@@ -117,21 +117,21 @@ typedef struct {
/* context_flags is not present in ppc_thread_state, but it aids
* identification of MDRawContextPPC among other raw context types,
* and it guarantees alignment when we get to float_save. */
- u_int32_t context_flags;
+ uint32_t context_flags;
- u_int32_t srr0; /* Machine status save/restore: stores pc
+ uint32_t srr0; /* Machine status save/restore: stores pc
* (instruction) */
- u_int32_t srr1; /* Machine status save/restore: stores msr
+ uint32_t srr1; /* Machine status save/restore: stores msr
* (ps, program/machine state) */
/* ppc_thread_state contains 32 fields, r0 .. r31. Here, an array is
* used for brevity. */
- u_int32_t gpr[MD_CONTEXT_PPC_GPR_COUNT];
- u_int32_t cr; /* Condition */
- u_int32_t xer; /* Integer (fiXed-point) exception */
- u_int32_t lr; /* Link */
- u_int32_t ctr; /* Count */
- u_int32_t mq; /* Multiply/Quotient (PPC 601, POWER only) */
- u_int32_t vrsave; /* Vector save */
+ uint32_t gpr[MD_CONTEXT_PPC_GPR_COUNT];
+ uint32_t cr; /* Condition */
+ uint32_t xer; /* Integer (fiXed-point) exception */
+ uint32_t lr; /* Link */
+ uint32_t ctr; /* Count */
+ uint32_t mq; /* Multiply/Quotient (PPC 601, POWER only) */
+ uint32_t vrsave; /* Vector save */
/* float_save and vector_save aren't present in ppc_thread_state, but
* are represented in separate structures that still define a thread's
@@ -140,6 +140,11 @@ typedef struct {
MDVectorSaveAreaPPC vector_save;
} MDRawContextPPC; /* Based on ppc_thread_state */
+/* Indices into gpr for registers with a dedicated or conventional purpose. */
+enum MDPPCRegisterNumbers {
+ MD_CONTEXT_PPC_REG_SP = 1
+};
+
#if defined(__SUNPRO_C) || defined(__SUNPRO_CC)
#pragma pack(0)
#else
diff --git a/3rdParty/Breakpad/src/google_breakpad/common/minidump_cpu_ppc64.h b/3rdParty/Breakpad/src/google_breakpad/common/minidump_cpu_ppc64.h
index a788e5d..61f4193 100644
--- a/3rdParty/Breakpad/src/google_breakpad/common/minidump_cpu_ppc64.h
+++ b/3rdParty/Breakpad/src/google_breakpad/common/minidump_cpu_ppc64.h
@@ -90,20 +90,20 @@ typedef struct {
/* context_flags is not present in ppc_thread_state, but it aids
* identification of MDRawContextPPC among other raw context types,
* and it guarantees alignment when we get to float_save. */
- u_int64_t context_flags;
+ uint64_t context_flags;
- u_int64_t srr0; /* Machine status save/restore: stores pc
+ uint64_t srr0; /* Machine status save/restore: stores pc
* (instruction) */
- u_int64_t srr1; /* Machine status save/restore: stores msr
+ uint64_t srr1; /* Machine status save/restore: stores msr
* (ps, program/machine state) */
/* ppc_thread_state contains 32 fields, r0 .. r31. Here, an array is
* used for brevity. */
- u_int64_t gpr[MD_CONTEXT_PPC64_GPR_COUNT];
- u_int64_t cr; /* Condition */
- u_int64_t xer; /* Integer (fiXed-point) exception */
- u_int64_t lr; /* Link */
- u_int64_t ctr; /* Count */
- u_int64_t vrsave; /* Vector save */
+ uint64_t gpr[MD_CONTEXT_PPC64_GPR_COUNT];
+ uint64_t cr; /* Condition */
+ uint64_t xer; /* Integer (fiXed-point) exception */
+ uint64_t lr; /* Link */
+ uint64_t ctr; /* Count */
+ uint64_t vrsave; /* Vector save */
/* float_save and vector_save aren't present in ppc_thread_state, but
* are represented in separate structures that still define a thread's
@@ -112,18 +112,23 @@ typedef struct {
MDVectorSaveAreaPPC vector_save;
} MDRawContextPPC64; /* Based on ppc_thread_state */
+/* Indices into gpr for registers with a dedicated or conventional purpose. */
+enum MDPPC64RegisterNumbers {
+ MD_CONTEXT_PPC64_REG_SP = 1
+};
+
/* For (MDRawContextPPC).context_flags. These values indicate the type of
* context stored in the structure. MD_CONTEXT_PPC is Breakpad-defined. Its
* value was chosen to avoid likely conflicts with MD_CONTEXT_* for other
* CPUs. */
-#define MD_CONTEXT_PPC 0x20000000
-#define MD_CONTEXT_PPC_BASE (MD_CONTEXT_PPC | 0x00000001)
-#define MD_CONTEXT_PPC_FLOATING_POINT (MD_CONTEXT_PPC | 0x00000008)
-#define MD_CONTEXT_PPC_VECTOR (MD_CONTEXT_PPC | 0x00000020)
+#define MD_CONTEXT_PPC64 0x01000000
+#define MD_CONTEXT_PPC64_BASE (MD_CONTEXT_PPC64 | 0x00000001)
+#define MD_CONTEXT_PPC64_FLOATING_POINT (MD_CONTEXT_PPC64 | 0x00000008)
+#define MD_CONTEXT_PPC64_VECTOR (MD_CONTEXT_PPC64 | 0x00000020)
-#define MD_CONTEXT_PPC_FULL MD_CONTEXT_PPC_BASE
-#define MD_CONTEXT_PPC_ALL (MD_CONTEXT_PPC_FULL | \
- MD_CONTEXT_PPC_FLOATING_POINT | \
- MD_CONTEXT_PPC_VECTOR)
+#define MD_CONTEXT_PPC64_FULL MD_CONTEXT_PPC64_BASE
+#define MD_CONTEXT_PPC64_ALL (MD_CONTEXT_PPC64_FULL | \
+ MD_CONTEXT_PPC64_FLOATING_POINT | \
+ MD_CONTEXT_PPC64_VECTOR)
#endif /* GOOGLE_BREAKPAD_COMMON_MINIDUMP_CPU_PPC64_H__ */
diff --git a/3rdParty/Breakpad/src/google_breakpad/common/minidump_cpu_sparc.h b/3rdParty/Breakpad/src/google_breakpad/common/minidump_cpu_sparc.h
index ee95b64..95c08b1 100644
--- a/3rdParty/Breakpad/src/google_breakpad/common/minidump_cpu_sparc.h
+++ b/3rdParty/Breakpad/src/google_breakpad/common/minidump_cpu_sparc.h
@@ -82,10 +82,10 @@
typedef struct {
/* FPU floating point regs */
- u_int64_t regs[MD_FLOATINGSAVEAREA_SPARC_FPR_COUNT];
+ uint64_t regs[MD_FLOATINGSAVEAREA_SPARC_FPR_COUNT];
- u_int64_t filler;
- u_int64_t fsr; /* FPU status register */
+ uint64_t filler;
+ uint64_t fsr; /* FPU status register */
} MDFloatingSaveAreaSPARC; /* FLOATING_SAVE_AREA */
#define MD_CONTEXT_SPARC_GPR_COUNT 32
@@ -94,8 +94,8 @@ typedef struct {
/* The next field determines the layout of the structure, and which parts
* of it are populated
*/
- u_int32_t context_flags;
- u_int32_t flag_pad;
+ uint32_t context_flags;
+ uint32_t flag_pad;
/*
* General register access (SPARC).
* Don't confuse definitions here with definitions in <sys/regset.h>.
@@ -110,34 +110,39 @@ typedef struct {
* g_r[16-23] local registers(l0-l7)
* g_r[24-31] in registers(i0-i7)
*/
- u_int64_t g_r[MD_CONTEXT_SPARC_GPR_COUNT];
+ uint64_t g_r[MD_CONTEXT_SPARC_GPR_COUNT];
/* several control registers */
/* Processor State register(PSR) for SPARC V7/V8
* Condition Code register (CCR) for SPARC V9
*/
- u_int64_t ccr;
+ uint64_t ccr;
- u_int64_t pc; /* Program Counter register (PC) */
- u_int64_t npc; /* Next Program Counter register (nPC) */
- u_int64_t y; /* Y register (Y) */
+ uint64_t pc; /* Program Counter register (PC) */
+ uint64_t npc; /* Next Program Counter register (nPC) */
+ uint64_t y; /* Y register (Y) */
/* Address Space Identifier register (ASI) for SPARC V9
* WIM for SPARC V7/V8
*/
- u_int64_t asi;
+ uint64_t asi;
/* Floating-Point Registers State register (FPRS) for SPARC V9
* TBR for for SPARC V7/V8
*/
- u_int64_t fprs;
+ uint64_t fprs;
/* The next field is included with MD_CONTEXT_SPARC_FLOATING_POINT */
MDFloatingSaveAreaSPARC float_save;
} MDRawContextSPARC; /* CONTEXT_SPARC */
+/* Indices into g_r for registers with a dedicated or conventional purpose. */
+enum MDSPARCRegisterNumbers {
+ MD_CONTEXT_SPARC_REG_SP = 14
+};
+
/* For (MDRawContextSPARC).context_flags. These values indicate the type of
* context stored in the structure. MD_CONTEXT_SPARC is Breakpad-defined. Its
* value was chosen to avoid likely conflicts with MD_CONTEXT_* for other
diff --git a/3rdParty/Breakpad/src/google_breakpad/common/minidump_cpu_x86.h b/3rdParty/Breakpad/src/google_breakpad/common/minidump_cpu_x86.h
index 32aff8a..e09cb7c 100644
--- a/3rdParty/Breakpad/src/google_breakpad/common/minidump_cpu_x86.h
+++ b/3rdParty/Breakpad/src/google_breakpad/common/minidump_cpu_x86.h
@@ -76,18 +76,18 @@
/* SIZE_OF_80387_REGISTERS */
typedef struct {
- u_int32_t control_word;
- u_int32_t status_word;
- u_int32_t tag_word;
- u_int32_t error_offset;
- u_int32_t error_selector;
- u_int32_t data_offset;
- u_int32_t data_selector;
+ uint32_t control_word;
+ uint32_t status_word;
+ uint32_t tag_word;
+ uint32_t error_offset;
+ uint32_t error_selector;
+ uint32_t data_offset;
+ uint32_t data_selector;
/* register_area contains eight 80-bit (x87 "long double") quantities for
* floating-point registers %st0 (%mm0) through %st7 (%mm7). */
- u_int8_t register_area[MD_FLOATINGSAVEAREA_X86_REGISTERAREA_SIZE];
- u_int32_t cr0_npx_state;
+ uint8_t register_area[MD_FLOATINGSAVEAREA_X86_REGISTERAREA_SIZE];
+ uint32_t cr0_npx_state;
} MDFloatingSaveAreaX86; /* FLOATING_SAVE_AREA */
@@ -97,46 +97,46 @@ typedef struct {
typedef struct {
/* The next field determines the layout of the structure, and which parts
* of it are populated */
- u_int32_t context_flags;
+ uint32_t context_flags;
/* The next 6 registers are included with MD_CONTEXT_X86_DEBUG_REGISTERS */
- u_int32_t dr0;
- u_int32_t dr1;
- u_int32_t dr2;
- u_int32_t dr3;
- u_int32_t dr6;
- u_int32_t dr7;
+ uint32_t dr0;
+ uint32_t dr1;
+ uint32_t dr2;
+ uint32_t dr3;
+ uint32_t dr6;
+ uint32_t dr7;
/* The next field is included with MD_CONTEXT_X86_FLOATING_POINT */
MDFloatingSaveAreaX86 float_save;
/* The next 4 registers are included with MD_CONTEXT_X86_SEGMENTS */
- u_int32_t gs;
- u_int32_t fs;
- u_int32_t es;
- u_int32_t ds;
+ uint32_t gs;
+ uint32_t fs;
+ uint32_t es;
+ uint32_t ds;
/* The next 6 registers are included with MD_CONTEXT_X86_INTEGER */
- u_int32_t edi;
- u_int32_t esi;
- u_int32_t ebx;
- u_int32_t edx;
- u_int32_t ecx;
- u_int32_t eax;
+ uint32_t edi;
+ uint32_t esi;
+ uint32_t ebx;
+ uint32_t edx;
+ uint32_t ecx;
+ uint32_t eax;
/* The next 6 registers are included with MD_CONTEXT_X86_CONTROL */
- u_int32_t ebp;
- u_int32_t eip;
- u_int32_t cs; /* WinNT.h says "must be sanitized" */
- u_int32_t eflags; /* WinNT.h says "must be sanitized" */
- u_int32_t esp;
- u_int32_t ss;
+ uint32_t ebp;
+ uint32_t eip;
+ uint32_t cs; /* WinNT.h says "must be sanitized" */
+ uint32_t eflags; /* WinNT.h says "must be sanitized" */
+ uint32_t esp;
+ uint32_t ss;
/* The next field is included with MD_CONTEXT_X86_EXTENDED_REGISTERS.
* It contains vector (MMX/SSE) registers. It it laid out in the
* format used by the fxsave and fsrstor instructions, so it includes
* a copy of the x87 floating-point registers as well. See FXSAVE in
* "Intel Architecture Software Developer's Manual, Volume 2." */
- u_int8_t extended_registers[
+ uint8_t extended_registers[
MD_CONTEXT_X86_EXTENDED_REGISTERS_SIZE];
} MDRawContextX86; /* CONTEXT */
diff --git a/3rdParty/Breakpad/src/google_breakpad/common/minidump_exception_linux.h b/3rdParty/Breakpad/src/google_breakpad/common/minidump_exception_linux.h
index d52c751..9e7e4f1 100644
--- a/3rdParty/Breakpad/src/google_breakpad/common/minidump_exception_linux.h
+++ b/3rdParty/Breakpad/src/google_breakpad/common/minidump_exception_linux.h
@@ -79,7 +79,9 @@ typedef enum {
MD_EXCEPTION_CODE_LIN_SIGWINCH = 28, /* Window size change (4.3 BSD, Sun) */
MD_EXCEPTION_CODE_LIN_SIGIO = 29, /* I/O now possible (4.2 BSD) */
MD_EXCEPTION_CODE_LIN_SIGPWR = 30, /* Power failure restart (System V) */
- MD_EXCEPTION_CODE_LIN_SIGSYS = 31 /* Bad system call */
+ MD_EXCEPTION_CODE_LIN_SIGSYS = 31, /* Bad system call */
+ MD_EXCEPTION_CODE_LIN_DUMP_REQUESTED = 0xFFFFFFFF /* No exception,
+ dump requested. */
} MDExceptionCodeLinux;
#endif /* GOOGLE_BREAKPAD_COMMON_MINIDUMP_EXCEPTION_LINUX_H__ */
diff --git a/3rdParty/Breakpad/src/google_breakpad/common/minidump_exception_mac.h b/3rdParty/Breakpad/src/google_breakpad/common/minidump_exception_mac.h
index 01f8feb..a42a152 100644
--- a/3rdParty/Breakpad/src/google_breakpad/common/minidump_exception_mac.h
+++ b/3rdParty/Breakpad/src/google_breakpad/common/minidump_exception_mac.h
@@ -34,7 +34,7 @@
*
* Author: Mark Mentovai
* Split into its own file: Neal Sidhwaney */
-
+
#ifndef GOOGLE_BREAKPAD_COMMON_MINIDUMP_EXCEPTION_MAC_H__
#define GOOGLE_BREAKPAD_COMMON_MINIDUMP_EXCEPTION_MAC_H__
@@ -65,8 +65,10 @@ typedef enum {
/* EXC_SYSCALL */
MD_EXCEPTION_MAC_MACH_SYSCALL = 8,
/* EXC_MACH_SYSCALL */
- MD_EXCEPTION_MAC_RPC_ALERT = 9
+ MD_EXCEPTION_MAC_RPC_ALERT = 9,
/* EXC_RPC_ALERT */
+ MD_EXCEPTION_MAC_SIMULATED = 0x43507378
+ /* Fake exception code used by Crashpad's SimulateCrash ('CPsx'). */
} MDExceptionMac;
/* For (MDException).exception_flags. Breakpad minidump extension for Mac OS X
@@ -93,6 +95,16 @@ typedef enum {
/* Custom values */
MD_EXCEPTION_CODE_MAC_NS_EXCEPTION = 0xDEADC0DE, /* uncaught NSException */
+ /* With MD_EXCEPTION_MAC_BAD_ACCESS on arm */
+ MD_EXCEPTION_CODE_MAC_ARM_DA_ALIGN = 0x0101, /* EXC_ARM_DA_ALIGN */
+ MD_EXCEPTION_CODE_MAC_ARM_DA_DEBUG = 0x0102, /* EXC_ARM_DA_DEBUG */
+
+ /* With MD_EXCEPTION_MAC_BAD_INSTRUCTION on arm */
+ MD_EXCEPTION_CODE_MAC_ARM_UNDEFINED = 1, /* EXC_ARM_UNDEFINED */
+
+ /* With MD_EXCEPTION_MAC_BREAKPOINT on arm */
+ MD_EXCEPTION_CODE_MAC_ARM_BREAKPOINT = 1, /* EXC_ARM_BREAKPOINT */
+
/* With MD_EXCEPTION_MAC_BAD_ACCESS on ppc */
MD_EXCEPTION_CODE_MAC_PPC_VM_PROT_READ = 0x0101,
/* EXC_PPC_VM_PROT_READ */
diff --git a/3rdParty/Breakpad/src/google_breakpad/common/minidump_exception_ps3.h b/3rdParty/Breakpad/src/google_breakpad/common/minidump_exception_ps3.h
new file mode 100644
index 0000000..adff5a6
--- /dev/null
+++ b/3rdParty/Breakpad/src/google_breakpad/common/minidump_exception_ps3.h
@@ -0,0 +1,67 @@
+/* Copyright (c) 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ * * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */
+
+/* minidump_exception_ps3.h: A definition of exception codes for
+ * PS3 */
+
+
+#ifndef GOOGLE_BREAKPAD_COMMON_MINIDUMP_EXCEPTION_PS3_H__
+#define GOOGLE_BREAKPAD_COMMON_MINIDUMP_EXCEPTION_PS3_H__
+
+#include <stddef.h>
+
+#include "google_breakpad/common/breakpad_types.h"
+
+typedef enum {
+ MD_EXCEPTION_CODE_PS3_UNKNOWN = 0,
+ MD_EXCEPTION_CODE_PS3_TRAP_EXCEP = 1,
+ MD_EXCEPTION_CODE_PS3_PRIV_INSTR = 2,
+ MD_EXCEPTION_CODE_PS3_ILLEGAL_INSTR = 3,
+ MD_EXCEPTION_CODE_PS3_INSTR_STORAGE = 4,
+ MD_EXCEPTION_CODE_PS3_INSTR_SEGMENT = 5,
+ MD_EXCEPTION_CODE_PS3_DATA_STORAGE = 6,
+ MD_EXCEPTION_CODE_PS3_DATA_SEGMENT = 7,
+ MD_EXCEPTION_CODE_PS3_FLOAT_POINT = 8,
+ MD_EXCEPTION_CODE_PS3_DABR_MATCH = 9,
+ MD_EXCEPTION_CODE_PS3_ALIGN_EXCEP = 10,
+ MD_EXCEPTION_CODE_PS3_MEMORY_ACCESS = 11,
+ MD_EXCEPTION_CODE_PS3_COPRO_ALIGN = 12,
+ MD_EXCEPTION_CODE_PS3_COPRO_INVALID_COM = 13,
+ MD_EXCEPTION_CODE_PS3_COPRO_ERR = 14,
+ MD_EXCEPTION_CODE_PS3_COPRO_FIR = 15,
+ MD_EXCEPTION_CODE_PS3_COPRO_DATA_SEGMENT = 16,
+ MD_EXCEPTION_CODE_PS3_COPRO_DATA_STORAGE = 17,
+ MD_EXCEPTION_CODE_PS3_COPRO_STOP_INSTR = 18,
+ MD_EXCEPTION_CODE_PS3_COPRO_HALT_INSTR = 19,
+ MD_EXCEPTION_CODE_PS3_COPRO_HALTINST_UNKNOWN = 20,
+ MD_EXCEPTION_CODE_PS3_COPRO_MEMORY_ACCESS = 21,
+ MD_EXCEPTION_CODE_PS3_GRAPHIC = 22
+} MDExceptionCodePS3;
+
+#endif /* GOOGLE_BREAKPAD_COMMON_MINIDUMP_EXCEPTION_PS3_H__ */
diff --git a/3rdParty/Breakpad/src/google_breakpad/common/minidump_exception_win32.h b/3rdParty/Breakpad/src/google_breakpad/common/minidump_exception_win32.h
index 458a705..4b5d57c 100644
--- a/3rdParty/Breakpad/src/google_breakpad/common/minidump_exception_win32.h
+++ b/3rdParty/Breakpad/src/google_breakpad/common/minidump_exception_win32.h
@@ -94,17 +94,2162 @@ typedef enum {
/* EXCEPTION_PRIV_INSTRUCTION */
MD_EXCEPTION_CODE_WIN_STACK_OVERFLOW = 0xc00000fd,
/* EXCEPTION_STACK_OVERFLOW */
+ MD_EXCEPTION_CODE_WIN_BAD_FUNCTION_TABLE = 0xc00000ff,
+ /* EXCEPTION_BAD_FUNCTION_TABLE */
MD_EXCEPTION_CODE_WIN_POSSIBLE_DEADLOCK = 0xc0000194,
/* EXCEPTION_POSSIBLE_DEADLOCK */
MD_EXCEPTION_CODE_WIN_STACK_BUFFER_OVERRUN = 0xc0000409,
/* STATUS_STACK_BUFFER_OVERRUN */
MD_EXCEPTION_CODE_WIN_HEAP_CORRUPTION = 0xc0000374,
/* STATUS_HEAP_CORRUPTION */
- MD_EXCEPTION_CODE_WIN_UNHANDLED_CPP_EXCEPTION = 0xe06d7363
+ MD_EXCEPTION_OUT_OF_MEMORY = 0xe0000008,
+ /* Exception thrown by Chromium allocators to indicate OOM.
+ See base/process/memory.h in Chromium for rationale. */
+ MD_EXCEPTION_CODE_WIN_UNHANDLED_CPP_EXCEPTION = 0xe06d7363,
/* Per http://support.microsoft.com/kb/185294,
generated by Visual C++ compiler */
+ MD_EXCEPTION_CODE_WIN_SIMULATED = 0x0517a7ed
+ /* Fake exception code used by Crashpad's
+ CrashpadClient::DumpWithoutCrash. */
} MDExceptionCodeWin;
+
+/* For (MDException).exception_information[2], when (MDException).exception_code
+ * is MD_EXCEPTION_CODE_WIN_IN_PAGE_ERROR. This describes the underlying reason
+ * for the error. These values come from ntstatus.h.
+ *
+ * The content of this enum was created from ntstatus.h in the 8.1 SDK with
+ *
+ * egrep '#define [A-Z_0-9]+\s+\(\(NTSTATUS\)0xC[0-9A-F]+L\)' ntstatus.h
+ * | tr -d '\r'
+ * | sed -r 's@#define ([A-Z_0-9]+)\s+\(\(NTSTATUS\)(0xC[0-9A-F]+)L\).*@\2 \1@'
+ * | sort
+ * | sed -r 's@(0xC[0-9A-F]+) ([A-Z_0-9]+)@ MD_NTSTATUS_WIN_\2 = \1,@'
+ *
+ * With easy copy to clipboard with
+ * | xclip -selection c # on linux
+ * | clip # on windows
+ * | pbcopy # on mac
+ *
+ * and then the last comma manually removed. */
+typedef enum {
+ MD_NTSTATUS_WIN_STATUS_UNSUCCESSFUL = 0xC0000001,
+ MD_NTSTATUS_WIN_STATUS_NOT_IMPLEMENTED = 0xC0000002,
+ MD_NTSTATUS_WIN_STATUS_INVALID_INFO_CLASS = 0xC0000003,
+ MD_NTSTATUS_WIN_STATUS_INFO_LENGTH_MISMATCH = 0xC0000004,
+ MD_NTSTATUS_WIN_STATUS_ACCESS_VIOLATION = 0xC0000005,
+ MD_NTSTATUS_WIN_STATUS_IN_PAGE_ERROR = 0xC0000006,
+ MD_NTSTATUS_WIN_STATUS_PAGEFILE_QUOTA = 0xC0000007,
+ MD_NTSTATUS_WIN_STATUS_INVALID_HANDLE = 0xC0000008,
+ MD_NTSTATUS_WIN_STATUS_BAD_INITIAL_STACK = 0xC0000009,
+ MD_NTSTATUS_WIN_STATUS_BAD_INITIAL_PC = 0xC000000A,
+ MD_NTSTATUS_WIN_STATUS_INVALID_CID = 0xC000000B,
+ MD_NTSTATUS_WIN_STATUS_TIMER_NOT_CANCELED = 0xC000000C,
+ MD_NTSTATUS_WIN_STATUS_INVALID_PARAMETER = 0xC000000D,
+ MD_NTSTATUS_WIN_STATUS_NO_SUCH_DEVICE = 0xC000000E,
+ MD_NTSTATUS_WIN_STATUS_NO_SUCH_FILE = 0xC000000F,
+ MD_NTSTATUS_WIN_STATUS_INVALID_DEVICE_REQUEST = 0xC0000010,
+ MD_NTSTATUS_WIN_STATUS_END_OF_FILE = 0xC0000011,
+ MD_NTSTATUS_WIN_STATUS_WRONG_VOLUME = 0xC0000012,
+ MD_NTSTATUS_WIN_STATUS_NO_MEDIA_IN_DEVICE = 0xC0000013,
+ MD_NTSTATUS_WIN_STATUS_UNRECOGNIZED_MEDIA = 0xC0000014,
+ MD_NTSTATUS_WIN_STATUS_NONEXISTENT_SECTOR = 0xC0000015,
+ MD_NTSTATUS_WIN_STATUS_MORE_PROCESSING_REQUIRED = 0xC0000016,
+ MD_NTSTATUS_WIN_STATUS_NO_MEMORY = 0xC0000017,
+ MD_NTSTATUS_WIN_STATUS_CONFLICTING_ADDRESSES = 0xC0000018,
+ MD_NTSTATUS_WIN_STATUS_NOT_MAPPED_VIEW = 0xC0000019,
+ MD_NTSTATUS_WIN_STATUS_UNABLE_TO_FREE_VM = 0xC000001A,
+ MD_NTSTATUS_WIN_STATUS_UNABLE_TO_DELETE_SECTION = 0xC000001B,
+ MD_NTSTATUS_WIN_STATUS_INVALID_SYSTEM_SERVICE = 0xC000001C,
+ MD_NTSTATUS_WIN_STATUS_ILLEGAL_INSTRUCTION = 0xC000001D,
+ MD_NTSTATUS_WIN_STATUS_INVALID_LOCK_SEQUENCE = 0xC000001E,
+ MD_NTSTATUS_WIN_STATUS_INVALID_VIEW_SIZE = 0xC000001F,
+ MD_NTSTATUS_WIN_STATUS_INVALID_FILE_FOR_SECTION = 0xC0000020,
+ MD_NTSTATUS_WIN_STATUS_ALREADY_COMMITTED = 0xC0000021,
+ MD_NTSTATUS_WIN_STATUS_ACCESS_DENIED = 0xC0000022,
+ MD_NTSTATUS_WIN_STATUS_BUFFER_TOO_SMALL = 0xC0000023,
+ MD_NTSTATUS_WIN_STATUS_OBJECT_TYPE_MISMATCH = 0xC0000024,
+ MD_NTSTATUS_WIN_STATUS_NONCONTINUABLE_EXCEPTION = 0xC0000025,
+ MD_NTSTATUS_WIN_STATUS_INVALID_DISPOSITION = 0xC0000026,
+ MD_NTSTATUS_WIN_STATUS_UNWIND = 0xC0000027,
+ MD_NTSTATUS_WIN_STATUS_BAD_STACK = 0xC0000028,
+ MD_NTSTATUS_WIN_STATUS_INVALID_UNWIND_TARGET = 0xC0000029,
+ MD_NTSTATUS_WIN_STATUS_NOT_LOCKED = 0xC000002A,
+ MD_NTSTATUS_WIN_STATUS_PARITY_ERROR = 0xC000002B,
+ MD_NTSTATUS_WIN_STATUS_UNABLE_TO_DECOMMIT_VM = 0xC000002C,
+ MD_NTSTATUS_WIN_STATUS_NOT_COMMITTED = 0xC000002D,
+ MD_NTSTATUS_WIN_STATUS_INVALID_PORT_ATTRIBUTES = 0xC000002E,
+ MD_NTSTATUS_WIN_STATUS_PORT_MESSAGE_TOO_LONG = 0xC000002F,
+ MD_NTSTATUS_WIN_STATUS_INVALID_PARAMETER_MIX = 0xC0000030,
+ MD_NTSTATUS_WIN_STATUS_INVALID_QUOTA_LOWER = 0xC0000031,
+ MD_NTSTATUS_WIN_STATUS_DISK_CORRUPT_ERROR = 0xC0000032,
+ MD_NTSTATUS_WIN_STATUS_OBJECT_NAME_INVALID = 0xC0000033,
+ MD_NTSTATUS_WIN_STATUS_OBJECT_NAME_NOT_FOUND = 0xC0000034,
+ MD_NTSTATUS_WIN_STATUS_OBJECT_NAME_COLLISION = 0xC0000035,
+ MD_NTSTATUS_WIN_STATUS_PORT_DISCONNECTED = 0xC0000037,
+ MD_NTSTATUS_WIN_STATUS_DEVICE_ALREADY_ATTACHED = 0xC0000038,
+ MD_NTSTATUS_WIN_STATUS_OBJECT_PATH_INVALID = 0xC0000039,
+ MD_NTSTATUS_WIN_STATUS_OBJECT_PATH_NOT_FOUND = 0xC000003A,
+ MD_NTSTATUS_WIN_STATUS_OBJECT_PATH_SYNTAX_BAD = 0xC000003B,
+ MD_NTSTATUS_WIN_STATUS_DATA_OVERRUN = 0xC000003C,
+ MD_NTSTATUS_WIN_STATUS_DATA_LATE_ERROR = 0xC000003D,
+ MD_NTSTATUS_WIN_STATUS_DATA_ERROR = 0xC000003E,
+ MD_NTSTATUS_WIN_STATUS_CRC_ERROR = 0xC000003F,
+ MD_NTSTATUS_WIN_STATUS_SECTION_TOO_BIG = 0xC0000040,
+ MD_NTSTATUS_WIN_STATUS_PORT_CONNECTION_REFUSED = 0xC0000041,
+ MD_NTSTATUS_WIN_STATUS_INVALID_PORT_HANDLE = 0xC0000042,
+ MD_NTSTATUS_WIN_STATUS_SHARING_VIOLATION = 0xC0000043,
+ MD_NTSTATUS_WIN_STATUS_QUOTA_EXCEEDED = 0xC0000044,
+ MD_NTSTATUS_WIN_STATUS_INVALID_PAGE_PROTECTION = 0xC0000045,
+ MD_NTSTATUS_WIN_STATUS_MUTANT_NOT_OWNED = 0xC0000046,
+ MD_NTSTATUS_WIN_STATUS_SEMAPHORE_LIMIT_EXCEEDED = 0xC0000047,
+ MD_NTSTATUS_WIN_STATUS_PORT_ALREADY_SET = 0xC0000048,
+ MD_NTSTATUS_WIN_STATUS_SECTION_NOT_IMAGE = 0xC0000049,
+ MD_NTSTATUS_WIN_STATUS_SUSPEND_COUNT_EXCEEDED = 0xC000004A,
+ MD_NTSTATUS_WIN_STATUS_THREAD_IS_TERMINATING = 0xC000004B,
+ MD_NTSTATUS_WIN_STATUS_BAD_WORKING_SET_LIMIT = 0xC000004C,
+ MD_NTSTATUS_WIN_STATUS_INCOMPATIBLE_FILE_MAP = 0xC000004D,
+ MD_NTSTATUS_WIN_STATUS_SECTION_PROTECTION = 0xC000004E,
+ MD_NTSTATUS_WIN_STATUS_EAS_NOT_SUPPORTED = 0xC000004F,
+ MD_NTSTATUS_WIN_STATUS_EA_TOO_LARGE = 0xC0000050,
+ MD_NTSTATUS_WIN_STATUS_NONEXISTENT_EA_ENTRY = 0xC0000051,
+ MD_NTSTATUS_WIN_STATUS_NO_EAS_ON_FILE = 0xC0000052,
+ MD_NTSTATUS_WIN_STATUS_EA_CORRUPT_ERROR = 0xC0000053,
+ MD_NTSTATUS_WIN_STATUS_FILE_LOCK_CONFLICT = 0xC0000054,
+ MD_NTSTATUS_WIN_STATUS_LOCK_NOT_GRANTED = 0xC0000055,
+ MD_NTSTATUS_WIN_STATUS_DELETE_PENDING = 0xC0000056,
+ MD_NTSTATUS_WIN_STATUS_CTL_FILE_NOT_SUPPORTED = 0xC0000057,
+ MD_NTSTATUS_WIN_STATUS_UNKNOWN_REVISION = 0xC0000058,
+ MD_NTSTATUS_WIN_STATUS_REVISION_MISMATCH = 0xC0000059,
+ MD_NTSTATUS_WIN_STATUS_INVALID_OWNER = 0xC000005A,
+ MD_NTSTATUS_WIN_STATUS_INVALID_PRIMARY_GROUP = 0xC000005B,
+ MD_NTSTATUS_WIN_STATUS_NO_IMPERSONATION_TOKEN = 0xC000005C,
+ MD_NTSTATUS_WIN_STATUS_CANT_DISABLE_MANDATORY = 0xC000005D,
+ MD_NTSTATUS_WIN_STATUS_NO_LOGON_SERVERS = 0xC000005E,
+ MD_NTSTATUS_WIN_STATUS_NO_SUCH_LOGON_SESSION = 0xC000005F,
+ MD_NTSTATUS_WIN_STATUS_NO_SUCH_PRIVILEGE = 0xC0000060,
+ MD_NTSTATUS_WIN_STATUS_PRIVILEGE_NOT_HELD = 0xC0000061,
+ MD_NTSTATUS_WIN_STATUS_INVALID_ACCOUNT_NAME = 0xC0000062,
+ MD_NTSTATUS_WIN_STATUS_USER_EXISTS = 0xC0000063,
+ MD_NTSTATUS_WIN_STATUS_NO_SUCH_USER = 0xC0000064,
+ MD_NTSTATUS_WIN_STATUS_GROUP_EXISTS = 0xC0000065,
+ MD_NTSTATUS_WIN_STATUS_NO_SUCH_GROUP = 0xC0000066,
+ MD_NTSTATUS_WIN_STATUS_MEMBER_IN_GROUP = 0xC0000067,
+ MD_NTSTATUS_WIN_STATUS_MEMBER_NOT_IN_GROUP = 0xC0000068,
+ MD_NTSTATUS_WIN_STATUS_LAST_ADMIN = 0xC0000069,
+ MD_NTSTATUS_WIN_STATUS_WRONG_PASSWORD = 0xC000006A,
+ MD_NTSTATUS_WIN_STATUS_ILL_FORMED_PASSWORD = 0xC000006B,
+ MD_NTSTATUS_WIN_STATUS_PASSWORD_RESTRICTION = 0xC000006C,
+ MD_NTSTATUS_WIN_STATUS_LOGON_FAILURE = 0xC000006D,
+ MD_NTSTATUS_WIN_STATUS_ACCOUNT_RESTRICTION = 0xC000006E,
+ MD_NTSTATUS_WIN_STATUS_INVALID_LOGON_HOURS = 0xC000006F,
+ MD_NTSTATUS_WIN_STATUS_INVALID_WORKSTATION = 0xC0000070,
+ MD_NTSTATUS_WIN_STATUS_PASSWORD_EXPIRED = 0xC0000071,
+ MD_NTSTATUS_WIN_STATUS_ACCOUNT_DISABLED = 0xC0000072,
+ MD_NTSTATUS_WIN_STATUS_NONE_MAPPED = 0xC0000073,
+ MD_NTSTATUS_WIN_STATUS_TOO_MANY_LUIDS_REQUESTED = 0xC0000074,
+ MD_NTSTATUS_WIN_STATUS_LUIDS_EXHAUSTED = 0xC0000075,
+ MD_NTSTATUS_WIN_STATUS_INVALID_SUB_AUTHORITY = 0xC0000076,
+ MD_NTSTATUS_WIN_STATUS_INVALID_ACL = 0xC0000077,
+ MD_NTSTATUS_WIN_STATUS_INVALID_SID = 0xC0000078,
+ MD_NTSTATUS_WIN_STATUS_INVALID_SECURITY_DESCR = 0xC0000079,
+ MD_NTSTATUS_WIN_STATUS_PROCEDURE_NOT_FOUND = 0xC000007A,
+ MD_NTSTATUS_WIN_STATUS_INVALID_IMAGE_FORMAT = 0xC000007B,
+ MD_NTSTATUS_WIN_STATUS_NO_TOKEN = 0xC000007C,
+ MD_NTSTATUS_WIN_STATUS_BAD_INHERITANCE_ACL = 0xC000007D,
+ MD_NTSTATUS_WIN_STATUS_RANGE_NOT_LOCKED = 0xC000007E,
+ MD_NTSTATUS_WIN_STATUS_DISK_FULL = 0xC000007F,
+ MD_NTSTATUS_WIN_STATUS_SERVER_DISABLED = 0xC0000080,
+ MD_NTSTATUS_WIN_STATUS_SERVER_NOT_DISABLED = 0xC0000081,
+ MD_NTSTATUS_WIN_STATUS_TOO_MANY_GUIDS_REQUESTED = 0xC0000082,
+ MD_NTSTATUS_WIN_STATUS_GUIDS_EXHAUSTED = 0xC0000083,
+ MD_NTSTATUS_WIN_STATUS_INVALID_ID_AUTHORITY = 0xC0000084,
+ MD_NTSTATUS_WIN_STATUS_AGENTS_EXHAUSTED = 0xC0000085,
+ MD_NTSTATUS_WIN_STATUS_INVALID_VOLUME_LABEL = 0xC0000086,
+ MD_NTSTATUS_WIN_STATUS_SECTION_NOT_EXTENDED = 0xC0000087,
+ MD_NTSTATUS_WIN_STATUS_NOT_MAPPED_DATA = 0xC0000088,
+ MD_NTSTATUS_WIN_STATUS_RESOURCE_DATA_NOT_FOUND = 0xC0000089,
+ MD_NTSTATUS_WIN_STATUS_RESOURCE_TYPE_NOT_FOUND = 0xC000008A,
+ MD_NTSTATUS_WIN_STATUS_RESOURCE_NAME_NOT_FOUND = 0xC000008B,
+ MD_NTSTATUS_WIN_STATUS_ARRAY_BOUNDS_EXCEEDED = 0xC000008C,
+ MD_NTSTATUS_WIN_STATUS_FLOAT_DENORMAL_OPERAND = 0xC000008D,
+ MD_NTSTATUS_WIN_STATUS_FLOAT_DIVIDE_BY_ZERO = 0xC000008E,
+ MD_NTSTATUS_WIN_STATUS_FLOAT_INEXACT_RESULT = 0xC000008F,
+ MD_NTSTATUS_WIN_STATUS_FLOAT_INVALID_OPERATION = 0xC0000090,
+ MD_NTSTATUS_WIN_STATUS_FLOAT_OVERFLOW = 0xC0000091,
+ MD_NTSTATUS_WIN_STATUS_FLOAT_STACK_CHECK = 0xC0000092,
+ MD_NTSTATUS_WIN_STATUS_FLOAT_UNDERFLOW = 0xC0000093,
+ MD_NTSTATUS_WIN_STATUS_INTEGER_DIVIDE_BY_ZERO = 0xC0000094,
+ MD_NTSTATUS_WIN_STATUS_INTEGER_OVERFLOW = 0xC0000095,
+ MD_NTSTATUS_WIN_STATUS_PRIVILEGED_INSTRUCTION = 0xC0000096,
+ MD_NTSTATUS_WIN_STATUS_TOO_MANY_PAGING_FILES = 0xC0000097,
+ MD_NTSTATUS_WIN_STATUS_FILE_INVALID = 0xC0000098,
+ MD_NTSTATUS_WIN_STATUS_ALLOTTED_SPACE_EXCEEDED = 0xC0000099,
+ MD_NTSTATUS_WIN_STATUS_INSUFFICIENT_RESOURCES = 0xC000009A,
+ MD_NTSTATUS_WIN_STATUS_DFS_EXIT_PATH_FOUND = 0xC000009B,
+ MD_NTSTATUS_WIN_STATUS_DEVICE_DATA_ERROR = 0xC000009C,
+ MD_NTSTATUS_WIN_STATUS_DEVICE_NOT_CONNECTED = 0xC000009D,
+ MD_NTSTATUS_WIN_STATUS_DEVICE_POWER_FAILURE = 0xC000009E,
+ MD_NTSTATUS_WIN_STATUS_FREE_VM_NOT_AT_BASE = 0xC000009F,
+ MD_NTSTATUS_WIN_STATUS_MEMORY_NOT_ALLOCATED = 0xC00000A0,
+ MD_NTSTATUS_WIN_STATUS_WORKING_SET_QUOTA = 0xC00000A1,
+ MD_NTSTATUS_WIN_STATUS_MEDIA_WRITE_PROTECTED = 0xC00000A2,
+ MD_NTSTATUS_WIN_STATUS_DEVICE_NOT_READY = 0xC00000A3,
+ MD_NTSTATUS_WIN_STATUS_INVALID_GROUP_ATTRIBUTES = 0xC00000A4,
+ MD_NTSTATUS_WIN_STATUS_BAD_IMPERSONATION_LEVEL = 0xC00000A5,
+ MD_NTSTATUS_WIN_STATUS_CANT_OPEN_ANONYMOUS = 0xC00000A6,
+ MD_NTSTATUS_WIN_STATUS_BAD_VALIDATION_CLASS = 0xC00000A7,
+ MD_NTSTATUS_WIN_STATUS_BAD_TOKEN_TYPE = 0xC00000A8,
+ MD_NTSTATUS_WIN_STATUS_BAD_MASTER_BOOT_RECORD = 0xC00000A9,
+ MD_NTSTATUS_WIN_STATUS_INSTRUCTION_MISALIGNMENT = 0xC00000AA,
+ MD_NTSTATUS_WIN_STATUS_INSTANCE_NOT_AVAILABLE = 0xC00000AB,
+ MD_NTSTATUS_WIN_STATUS_PIPE_NOT_AVAILABLE = 0xC00000AC,
+ MD_NTSTATUS_WIN_STATUS_INVALID_PIPE_STATE = 0xC00000AD,
+ MD_NTSTATUS_WIN_STATUS_PIPE_BUSY = 0xC00000AE,
+ MD_NTSTATUS_WIN_STATUS_ILLEGAL_FUNCTION = 0xC00000AF,
+ MD_NTSTATUS_WIN_STATUS_PIPE_DISCONNECTED = 0xC00000B0,
+ MD_NTSTATUS_WIN_STATUS_PIPE_CLOSING = 0xC00000B1,
+ MD_NTSTATUS_WIN_STATUS_PIPE_CONNECTED = 0xC00000B2,
+ MD_NTSTATUS_WIN_STATUS_PIPE_LISTENING = 0xC00000B3,
+ MD_NTSTATUS_WIN_STATUS_INVALID_READ_MODE = 0xC00000B4,
+ MD_NTSTATUS_WIN_STATUS_IO_TIMEOUT = 0xC00000B5,
+ MD_NTSTATUS_WIN_STATUS_FILE_FORCED_CLOSED = 0xC00000B6,
+ MD_NTSTATUS_WIN_STATUS_PROFILING_NOT_STARTED = 0xC00000B7,
+ MD_NTSTATUS_WIN_STATUS_PROFILING_NOT_STOPPED = 0xC00000B8,
+ MD_NTSTATUS_WIN_STATUS_COULD_NOT_INTERPRET = 0xC00000B9,
+ MD_NTSTATUS_WIN_STATUS_FILE_IS_A_DIRECTORY = 0xC00000BA,
+ MD_NTSTATUS_WIN_STATUS_NOT_SUPPORTED = 0xC00000BB,
+ MD_NTSTATUS_WIN_STATUS_REMOTE_NOT_LISTENING = 0xC00000BC,
+ MD_NTSTATUS_WIN_STATUS_DUPLICATE_NAME = 0xC00000BD,
+ MD_NTSTATUS_WIN_STATUS_BAD_NETWORK_PATH = 0xC00000BE,
+ MD_NTSTATUS_WIN_STATUS_NETWORK_BUSY = 0xC00000BF,
+ MD_NTSTATUS_WIN_STATUS_DEVICE_DOES_NOT_EXIST = 0xC00000C0,
+ MD_NTSTATUS_WIN_STATUS_TOO_MANY_COMMANDS = 0xC00000C1,
+ MD_NTSTATUS_WIN_STATUS_ADAPTER_HARDWARE_ERROR = 0xC00000C2,
+ MD_NTSTATUS_WIN_STATUS_INVALID_NETWORK_RESPONSE = 0xC00000C3,
+ MD_NTSTATUS_WIN_STATUS_UNEXPECTED_NETWORK_ERROR = 0xC00000C4,
+ MD_NTSTATUS_WIN_STATUS_BAD_REMOTE_ADAPTER = 0xC00000C5,
+ MD_NTSTATUS_WIN_STATUS_PRINT_QUEUE_FULL = 0xC00000C6,
+ MD_NTSTATUS_WIN_STATUS_NO_SPOOL_SPACE = 0xC00000C7,
+ MD_NTSTATUS_WIN_STATUS_PRINT_CANCELLED = 0xC00000C8,
+ MD_NTSTATUS_WIN_STATUS_NETWORK_NAME_DELETED = 0xC00000C9,
+ MD_NTSTATUS_WIN_STATUS_NETWORK_ACCESS_DENIED = 0xC00000CA,
+ MD_NTSTATUS_WIN_STATUS_BAD_DEVICE_TYPE = 0xC00000CB,
+ MD_NTSTATUS_WIN_STATUS_BAD_NETWORK_NAME = 0xC00000CC,
+ MD_NTSTATUS_WIN_STATUS_TOO_MANY_NAMES = 0xC00000CD,
+ MD_NTSTATUS_WIN_STATUS_TOO_MANY_SESSIONS = 0xC00000CE,
+ MD_NTSTATUS_WIN_STATUS_SHARING_PAUSED = 0xC00000CF,
+ MD_NTSTATUS_WIN_STATUS_REQUEST_NOT_ACCEPTED = 0xC00000D0,
+ MD_NTSTATUS_WIN_STATUS_REDIRECTOR_PAUSED = 0xC00000D1,
+ MD_NTSTATUS_WIN_STATUS_NET_WRITE_FAULT = 0xC00000D2,
+ MD_NTSTATUS_WIN_STATUS_PROFILING_AT_LIMIT = 0xC00000D3,
+ MD_NTSTATUS_WIN_STATUS_NOT_SAME_DEVICE = 0xC00000D4,
+ MD_NTSTATUS_WIN_STATUS_FILE_RENAMED = 0xC00000D5,
+ MD_NTSTATUS_WIN_STATUS_VIRTUAL_CIRCUIT_CLOSED = 0xC00000D6,
+ MD_NTSTATUS_WIN_STATUS_NO_SECURITY_ON_OBJECT = 0xC00000D7,
+ MD_NTSTATUS_WIN_STATUS_CANT_WAIT = 0xC00000D8,
+ MD_NTSTATUS_WIN_STATUS_PIPE_EMPTY = 0xC00000D9,
+ MD_NTSTATUS_WIN_STATUS_CANT_ACCESS_DOMAIN_INFO = 0xC00000DA,
+ MD_NTSTATUS_WIN_STATUS_CANT_TERMINATE_SELF = 0xC00000DB,
+ MD_NTSTATUS_WIN_STATUS_INVALID_SERVER_STATE = 0xC00000DC,
+ MD_NTSTATUS_WIN_STATUS_INVALID_DOMAIN_STATE = 0xC00000DD,
+ MD_NTSTATUS_WIN_STATUS_INVALID_DOMAIN_ROLE = 0xC00000DE,
+ MD_NTSTATUS_WIN_STATUS_NO_SUCH_DOMAIN = 0xC00000DF,
+ MD_NTSTATUS_WIN_STATUS_DOMAIN_EXISTS = 0xC00000E0,
+ MD_NTSTATUS_WIN_STATUS_DOMAIN_LIMIT_EXCEEDED = 0xC00000E1,
+ MD_NTSTATUS_WIN_STATUS_OPLOCK_NOT_GRANTED = 0xC00000E2,
+ MD_NTSTATUS_WIN_STATUS_INVALID_OPLOCK_PROTOCOL = 0xC00000E3,
+ MD_NTSTATUS_WIN_STATUS_INTERNAL_DB_CORRUPTION = 0xC00000E4,
+ MD_NTSTATUS_WIN_STATUS_INTERNAL_ERROR = 0xC00000E5,
+ MD_NTSTATUS_WIN_STATUS_GENERIC_NOT_MAPPED = 0xC00000E6,
+ MD_NTSTATUS_WIN_STATUS_BAD_DESCRIPTOR_FORMAT = 0xC00000E7,
+ MD_NTSTATUS_WIN_STATUS_INVALID_USER_BUFFER = 0xC00000E8,
+ MD_NTSTATUS_WIN_STATUS_UNEXPECTED_IO_ERROR = 0xC00000E9,
+ MD_NTSTATUS_WIN_STATUS_UNEXPECTED_MM_CREATE_ERR = 0xC00000EA,
+ MD_NTSTATUS_WIN_STATUS_UNEXPECTED_MM_MAP_ERROR = 0xC00000EB,
+ MD_NTSTATUS_WIN_STATUS_UNEXPECTED_MM_EXTEND_ERR = 0xC00000EC,
+ MD_NTSTATUS_WIN_STATUS_NOT_LOGON_PROCESS = 0xC00000ED,
+ MD_NTSTATUS_WIN_STATUS_LOGON_SESSION_EXISTS = 0xC00000EE,
+ MD_NTSTATUS_WIN_STATUS_INVALID_PARAMETER_1 = 0xC00000EF,
+ MD_NTSTATUS_WIN_STATUS_INVALID_PARAMETER_2 = 0xC00000F0,
+ MD_NTSTATUS_WIN_STATUS_INVALID_PARAMETER_3 = 0xC00000F1,
+ MD_NTSTATUS_WIN_STATUS_INVALID_PARAMETER_4 = 0xC00000F2,
+ MD_NTSTATUS_WIN_STATUS_INVALID_PARAMETER_5 = 0xC00000F3,
+ MD_NTSTATUS_WIN_STATUS_INVALID_PARAMETER_6 = 0xC00000F4,
+ MD_NTSTATUS_WIN_STATUS_INVALID_PARAMETER_7 = 0xC00000F5,
+ MD_NTSTATUS_WIN_STATUS_INVALID_PARAMETER_8 = 0xC00000F6,
+ MD_NTSTATUS_WIN_STATUS_INVALID_PARAMETER_9 = 0xC00000F7,
+ MD_NTSTATUS_WIN_STATUS_INVALID_PARAMETER_10 = 0xC00000F8,
+ MD_NTSTATUS_WIN_STATUS_INVALID_PARAMETER_11 = 0xC00000F9,
+ MD_NTSTATUS_WIN_STATUS_INVALID_PARAMETER_12 = 0xC00000FA,
+ MD_NTSTATUS_WIN_STATUS_REDIRECTOR_NOT_STARTED = 0xC00000FB,
+ MD_NTSTATUS_WIN_STATUS_REDIRECTOR_STARTED = 0xC00000FC,
+ MD_NTSTATUS_WIN_STATUS_STACK_OVERFLOW = 0xC00000FD,
+ MD_NTSTATUS_WIN_STATUS_NO_SUCH_PACKAGE = 0xC00000FE,
+ MD_NTSTATUS_WIN_STATUS_BAD_FUNCTION_TABLE = 0xC00000FF,
+ MD_NTSTATUS_WIN_STATUS_VARIABLE_NOT_FOUND = 0xC0000100,
+ MD_NTSTATUS_WIN_STATUS_DIRECTORY_NOT_EMPTY = 0xC0000101,
+ MD_NTSTATUS_WIN_STATUS_FILE_CORRUPT_ERROR = 0xC0000102,
+ MD_NTSTATUS_WIN_STATUS_NOT_A_DIRECTORY = 0xC0000103,
+ MD_NTSTATUS_WIN_STATUS_BAD_LOGON_SESSION_STATE = 0xC0000104,
+ MD_NTSTATUS_WIN_STATUS_LOGON_SESSION_COLLISION = 0xC0000105,
+ MD_NTSTATUS_WIN_STATUS_NAME_TOO_LONG = 0xC0000106,
+ MD_NTSTATUS_WIN_STATUS_FILES_OPEN = 0xC0000107,
+ MD_NTSTATUS_WIN_STATUS_CONNECTION_IN_USE = 0xC0000108,
+ MD_NTSTATUS_WIN_STATUS_MESSAGE_NOT_FOUND = 0xC0000109,
+ MD_NTSTATUS_WIN_STATUS_PROCESS_IS_TERMINATING = 0xC000010A,
+ MD_NTSTATUS_WIN_STATUS_INVALID_LOGON_TYPE = 0xC000010B,
+ MD_NTSTATUS_WIN_STATUS_NO_GUID_TRANSLATION = 0xC000010C,
+ MD_NTSTATUS_WIN_STATUS_CANNOT_IMPERSONATE = 0xC000010D,
+ MD_NTSTATUS_WIN_STATUS_IMAGE_ALREADY_LOADED = 0xC000010E,
+ MD_NTSTATUS_WIN_STATUS_ABIOS_NOT_PRESENT = 0xC000010F,
+ MD_NTSTATUS_WIN_STATUS_ABIOS_LID_NOT_EXIST = 0xC0000110,
+ MD_NTSTATUS_WIN_STATUS_ABIOS_LID_ALREADY_OWNED = 0xC0000111,
+ MD_NTSTATUS_WIN_STATUS_ABIOS_NOT_LID_OWNER = 0xC0000112,
+ MD_NTSTATUS_WIN_STATUS_ABIOS_INVALID_COMMAND = 0xC0000113,
+ MD_NTSTATUS_WIN_STATUS_ABIOS_INVALID_LID = 0xC0000114,
+ MD_NTSTATUS_WIN_STATUS_ABIOS_SELECTOR_NOT_AVAILABLE = 0xC0000115,
+ MD_NTSTATUS_WIN_STATUS_ABIOS_INVALID_SELECTOR = 0xC0000116,
+ MD_NTSTATUS_WIN_STATUS_NO_LDT = 0xC0000117,
+ MD_NTSTATUS_WIN_STATUS_INVALID_LDT_SIZE = 0xC0000118,
+ MD_NTSTATUS_WIN_STATUS_INVALID_LDT_OFFSET = 0xC0000119,
+ MD_NTSTATUS_WIN_STATUS_INVALID_LDT_DESCRIPTOR = 0xC000011A,
+ MD_NTSTATUS_WIN_STATUS_INVALID_IMAGE_NE_FORMAT = 0xC000011B,
+ MD_NTSTATUS_WIN_STATUS_RXACT_INVALID_STATE = 0xC000011C,
+ MD_NTSTATUS_WIN_STATUS_RXACT_COMMIT_FAILURE = 0xC000011D,
+ MD_NTSTATUS_WIN_STATUS_MAPPED_FILE_SIZE_ZERO = 0xC000011E,
+ MD_NTSTATUS_WIN_STATUS_TOO_MANY_OPENED_FILES = 0xC000011F,
+ MD_NTSTATUS_WIN_STATUS_CANCELLED = 0xC0000120,
+ MD_NTSTATUS_WIN_STATUS_CANNOT_DELETE = 0xC0000121,
+ MD_NTSTATUS_WIN_STATUS_INVALID_COMPUTER_NAME = 0xC0000122,
+ MD_NTSTATUS_WIN_STATUS_FILE_DELETED = 0xC0000123,
+ MD_NTSTATUS_WIN_STATUS_SPECIAL_ACCOUNT = 0xC0000124,
+ MD_NTSTATUS_WIN_STATUS_SPECIAL_GROUP = 0xC0000125,
+ MD_NTSTATUS_WIN_STATUS_SPECIAL_USER = 0xC0000126,
+ MD_NTSTATUS_WIN_STATUS_MEMBERS_PRIMARY_GROUP = 0xC0000127,
+ MD_NTSTATUS_WIN_STATUS_FILE_CLOSED = 0xC0000128,
+ MD_NTSTATUS_WIN_STATUS_TOO_MANY_THREADS = 0xC0000129,
+ MD_NTSTATUS_WIN_STATUS_THREAD_NOT_IN_PROCESS = 0xC000012A,
+ MD_NTSTATUS_WIN_STATUS_TOKEN_ALREADY_IN_USE = 0xC000012B,
+ MD_NTSTATUS_WIN_STATUS_PAGEFILE_QUOTA_EXCEEDED = 0xC000012C,
+ MD_NTSTATUS_WIN_STATUS_COMMITMENT_LIMIT = 0xC000012D,
+ MD_NTSTATUS_WIN_STATUS_INVALID_IMAGE_LE_FORMAT = 0xC000012E,
+ MD_NTSTATUS_WIN_STATUS_INVALID_IMAGE_NOT_MZ = 0xC000012F,
+ MD_NTSTATUS_WIN_STATUS_INVALID_IMAGE_PROTECT = 0xC0000130,
+ MD_NTSTATUS_WIN_STATUS_INVALID_IMAGE_WIN_16 = 0xC0000131,
+ MD_NTSTATUS_WIN_STATUS_LOGON_SERVER_CONFLICT = 0xC0000132,
+ MD_NTSTATUS_WIN_STATUS_TIME_DIFFERENCE_AT_DC = 0xC0000133,
+ MD_NTSTATUS_WIN_STATUS_SYNCHRONIZATION_REQUIRED = 0xC0000134,
+ MD_NTSTATUS_WIN_STATUS_DLL_NOT_FOUND = 0xC0000135,
+ MD_NTSTATUS_WIN_STATUS_OPEN_FAILED = 0xC0000136,
+ MD_NTSTATUS_WIN_STATUS_IO_PRIVILEGE_FAILED = 0xC0000137,
+ MD_NTSTATUS_WIN_STATUS_ORDINAL_NOT_FOUND = 0xC0000138,
+ MD_NTSTATUS_WIN_STATUS_ENTRYPOINT_NOT_FOUND = 0xC0000139,
+ MD_NTSTATUS_WIN_STATUS_CONTROL_C_EXIT = 0xC000013A,
+ MD_NTSTATUS_WIN_STATUS_LOCAL_DISCONNECT = 0xC000013B,
+ MD_NTSTATUS_WIN_STATUS_REMOTE_DISCONNECT = 0xC000013C,
+ MD_NTSTATUS_WIN_STATUS_REMOTE_RESOURCES = 0xC000013D,
+ MD_NTSTATUS_WIN_STATUS_LINK_FAILED = 0xC000013E,
+ MD_NTSTATUS_WIN_STATUS_LINK_TIMEOUT = 0xC000013F,
+ MD_NTSTATUS_WIN_STATUS_INVALID_CONNECTION = 0xC0000140,
+ MD_NTSTATUS_WIN_STATUS_INVALID_ADDRESS = 0xC0000141,
+ MD_NTSTATUS_WIN_STATUS_DLL_INIT_FAILED = 0xC0000142,
+ MD_NTSTATUS_WIN_STATUS_MISSING_SYSTEMFILE = 0xC0000143,
+ MD_NTSTATUS_WIN_STATUS_UNHANDLED_EXCEPTION = 0xC0000144,
+ MD_NTSTATUS_WIN_STATUS_APP_INIT_FAILURE = 0xC0000145,
+ MD_NTSTATUS_WIN_STATUS_PAGEFILE_CREATE_FAILED = 0xC0000146,
+ MD_NTSTATUS_WIN_STATUS_NO_PAGEFILE = 0xC0000147,
+ MD_NTSTATUS_WIN_STATUS_INVALID_LEVEL = 0xC0000148,
+ MD_NTSTATUS_WIN_STATUS_WRONG_PASSWORD_CORE = 0xC0000149,
+ MD_NTSTATUS_WIN_STATUS_ILLEGAL_FLOAT_CONTEXT = 0xC000014A,
+ MD_NTSTATUS_WIN_STATUS_PIPE_BROKEN = 0xC000014B,
+ MD_NTSTATUS_WIN_STATUS_REGISTRY_CORRUPT = 0xC000014C,
+ MD_NTSTATUS_WIN_STATUS_REGISTRY_IO_FAILED = 0xC000014D,
+ MD_NTSTATUS_WIN_STATUS_NO_EVENT_PAIR = 0xC000014E,
+ MD_NTSTATUS_WIN_STATUS_UNRECOGNIZED_VOLUME = 0xC000014F,
+ MD_NTSTATUS_WIN_STATUS_SERIAL_NO_DEVICE_INITED = 0xC0000150,
+ MD_NTSTATUS_WIN_STATUS_NO_SUCH_ALIAS = 0xC0000151,
+ MD_NTSTATUS_WIN_STATUS_MEMBER_NOT_IN_ALIAS = 0xC0000152,
+ MD_NTSTATUS_WIN_STATUS_MEMBER_IN_ALIAS = 0xC0000153,
+ MD_NTSTATUS_WIN_STATUS_ALIAS_EXISTS = 0xC0000154,
+ MD_NTSTATUS_WIN_STATUS_LOGON_NOT_GRANTED = 0xC0000155,
+ MD_NTSTATUS_WIN_STATUS_TOO_MANY_SECRETS = 0xC0000156,
+ MD_NTSTATUS_WIN_STATUS_SECRET_TOO_LONG = 0xC0000157,
+ MD_NTSTATUS_WIN_STATUS_INTERNAL_DB_ERROR = 0xC0000158,
+ MD_NTSTATUS_WIN_STATUS_FULLSCREEN_MODE = 0xC0000159,
+ MD_NTSTATUS_WIN_STATUS_TOO_MANY_CONTEXT_IDS = 0xC000015A,
+ MD_NTSTATUS_WIN_STATUS_LOGON_TYPE_NOT_GRANTED = 0xC000015B,
+ MD_NTSTATUS_WIN_STATUS_NOT_REGISTRY_FILE = 0xC000015C,
+ MD_NTSTATUS_WIN_STATUS_NT_CROSS_ENCRYPTION_REQUIRED = 0xC000015D,
+ MD_NTSTATUS_WIN_STATUS_DOMAIN_CTRLR_CONFIG_ERROR = 0xC000015E,
+ MD_NTSTATUS_WIN_STATUS_FT_MISSING_MEMBER = 0xC000015F,
+ MD_NTSTATUS_WIN_STATUS_ILL_FORMED_SERVICE_ENTRY = 0xC0000160,
+ MD_NTSTATUS_WIN_STATUS_ILLEGAL_CHARACTER = 0xC0000161,
+ MD_NTSTATUS_WIN_STATUS_UNMAPPABLE_CHARACTER = 0xC0000162,
+ MD_NTSTATUS_WIN_STATUS_UNDEFINED_CHARACTER = 0xC0000163,
+ MD_NTSTATUS_WIN_STATUS_FLOPPY_VOLUME = 0xC0000164,
+ MD_NTSTATUS_WIN_STATUS_FLOPPY_ID_MARK_NOT_FOUND = 0xC0000165,
+ MD_NTSTATUS_WIN_STATUS_FLOPPY_WRONG_CYLINDER = 0xC0000166,
+ MD_NTSTATUS_WIN_STATUS_FLOPPY_UNKNOWN_ERROR = 0xC0000167,
+ MD_NTSTATUS_WIN_STATUS_FLOPPY_BAD_REGISTERS = 0xC0000168,
+ MD_NTSTATUS_WIN_STATUS_DISK_RECALIBRATE_FAILED = 0xC0000169,
+ MD_NTSTATUS_WIN_STATUS_DISK_OPERATION_FAILED = 0xC000016A,
+ MD_NTSTATUS_WIN_STATUS_DISK_RESET_FAILED = 0xC000016B,
+ MD_NTSTATUS_WIN_STATUS_SHARED_IRQ_BUSY = 0xC000016C,
+ MD_NTSTATUS_WIN_STATUS_FT_ORPHANING = 0xC000016D,
+ MD_NTSTATUS_WIN_STATUS_BIOS_FAILED_TO_CONNECT_INTERRUPT = 0xC000016E,
+ MD_NTSTATUS_WIN_STATUS_PARTITION_FAILURE = 0xC0000172,
+ MD_NTSTATUS_WIN_STATUS_INVALID_BLOCK_LENGTH = 0xC0000173,
+ MD_NTSTATUS_WIN_STATUS_DEVICE_NOT_PARTITIONED = 0xC0000174,
+ MD_NTSTATUS_WIN_STATUS_UNABLE_TO_LOCK_MEDIA = 0xC0000175,
+ MD_NTSTATUS_WIN_STATUS_UNABLE_TO_UNLOAD_MEDIA = 0xC0000176,
+ MD_NTSTATUS_WIN_STATUS_EOM_OVERFLOW = 0xC0000177,
+ MD_NTSTATUS_WIN_STATUS_NO_MEDIA = 0xC0000178,
+ MD_NTSTATUS_WIN_STATUS_NO_SUCH_MEMBER = 0xC000017A,
+ MD_NTSTATUS_WIN_STATUS_INVALID_MEMBER = 0xC000017B,
+ MD_NTSTATUS_WIN_STATUS_KEY_DELETED = 0xC000017C,
+ MD_NTSTATUS_WIN_STATUS_NO_LOG_SPACE = 0xC000017D,
+ MD_NTSTATUS_WIN_STATUS_TOO_MANY_SIDS = 0xC000017E,
+ MD_NTSTATUS_WIN_STATUS_LM_CROSS_ENCRYPTION_REQUIRED = 0xC000017F,
+ MD_NTSTATUS_WIN_STATUS_KEY_HAS_CHILDREN = 0xC0000180,
+ MD_NTSTATUS_WIN_STATUS_CHILD_MUST_BE_VOLATILE = 0xC0000181,
+ MD_NTSTATUS_WIN_STATUS_DEVICE_CONFIGURATION_ERROR = 0xC0000182,
+ MD_NTSTATUS_WIN_STATUS_DRIVER_INTERNAL_ERROR = 0xC0000183,
+ MD_NTSTATUS_WIN_STATUS_INVALID_DEVICE_STATE = 0xC0000184,
+ MD_NTSTATUS_WIN_STATUS_IO_DEVICE_ERROR = 0xC0000185,
+ MD_NTSTATUS_WIN_STATUS_DEVICE_PROTOCOL_ERROR = 0xC0000186,
+ MD_NTSTATUS_WIN_STATUS_BACKUP_CONTROLLER = 0xC0000187,
+ MD_NTSTATUS_WIN_STATUS_LOG_FILE_FULL = 0xC0000188,
+ MD_NTSTATUS_WIN_STATUS_TOO_LATE = 0xC0000189,
+ MD_NTSTATUS_WIN_STATUS_NO_TRUST_LSA_SECRET = 0xC000018A,
+ MD_NTSTATUS_WIN_STATUS_NO_TRUST_SAM_ACCOUNT = 0xC000018B,
+ MD_NTSTATUS_WIN_STATUS_TRUSTED_DOMAIN_FAILURE = 0xC000018C,
+ MD_NTSTATUS_WIN_STATUS_TRUSTED_RELATIONSHIP_FAILURE = 0xC000018D,
+ MD_NTSTATUS_WIN_STATUS_EVENTLOG_FILE_CORRUPT = 0xC000018E,
+ MD_NTSTATUS_WIN_STATUS_EVENTLOG_CANT_START = 0xC000018F,
+ MD_NTSTATUS_WIN_STATUS_TRUST_FAILURE = 0xC0000190,
+ MD_NTSTATUS_WIN_STATUS_MUTANT_LIMIT_EXCEEDED = 0xC0000191,
+ MD_NTSTATUS_WIN_STATUS_NETLOGON_NOT_STARTED = 0xC0000192,
+ MD_NTSTATUS_WIN_STATUS_ACCOUNT_EXPIRED = 0xC0000193,
+ MD_NTSTATUS_WIN_STATUS_POSSIBLE_DEADLOCK = 0xC0000194,
+ MD_NTSTATUS_WIN_STATUS_NETWORK_CREDENTIAL_CONFLICT = 0xC0000195,
+ MD_NTSTATUS_WIN_STATUS_REMOTE_SESSION_LIMIT = 0xC0000196,
+ MD_NTSTATUS_WIN_STATUS_EVENTLOG_FILE_CHANGED = 0xC0000197,
+ MD_NTSTATUS_WIN_STATUS_NOLOGON_INTERDOMAIN_TRUST_ACCOUNT = 0xC0000198,
+ MD_NTSTATUS_WIN_STATUS_NOLOGON_WORKSTATION_TRUST_ACCOUNT = 0xC0000199,
+ MD_NTSTATUS_WIN_STATUS_NOLOGON_SERVER_TRUST_ACCOUNT = 0xC000019A,
+ MD_NTSTATUS_WIN_STATUS_DOMAIN_TRUST_INCONSISTENT = 0xC000019B,
+ MD_NTSTATUS_WIN_STATUS_FS_DRIVER_REQUIRED = 0xC000019C,
+ MD_NTSTATUS_WIN_STATUS_IMAGE_ALREADY_LOADED_AS_DLL = 0xC000019D,
+ MD_NTSTATUS_WIN_STATUS_INCOMPATIBLE_WITH_GLOBAL_SHORT_NAME_REGISTRY_SETTING = 0xC000019E,
+ MD_NTSTATUS_WIN_STATUS_SHORT_NAMES_NOT_ENABLED_ON_VOLUME = 0xC000019F,
+ MD_NTSTATUS_WIN_STATUS_SECURITY_STREAM_IS_INCONSISTENT = 0xC00001A0,
+ MD_NTSTATUS_WIN_STATUS_INVALID_LOCK_RANGE = 0xC00001A1,
+ MD_NTSTATUS_WIN_STATUS_INVALID_ACE_CONDITION = 0xC00001A2,
+ MD_NTSTATUS_WIN_STATUS_IMAGE_SUBSYSTEM_NOT_PRESENT = 0xC00001A3,
+ MD_NTSTATUS_WIN_STATUS_NOTIFICATION_GUID_ALREADY_DEFINED = 0xC00001A4,
+ MD_NTSTATUS_WIN_STATUS_INVALID_EXCEPTION_HANDLER = 0xC00001A5,
+ MD_NTSTATUS_WIN_STATUS_DUPLICATE_PRIVILEGES = 0xC00001A6,
+ MD_NTSTATUS_WIN_STATUS_NOT_ALLOWED_ON_SYSTEM_FILE = 0xC00001A7,
+ MD_NTSTATUS_WIN_STATUS_REPAIR_NEEDED = 0xC00001A8,
+ MD_NTSTATUS_WIN_STATUS_QUOTA_NOT_ENABLED = 0xC00001A9,
+ MD_NTSTATUS_WIN_STATUS_NO_APPLICATION_PACKAGE = 0xC00001AA,
+ MD_NTSTATUS_WIN_STATUS_NETWORK_OPEN_RESTRICTION = 0xC0000201,
+ MD_NTSTATUS_WIN_STATUS_NO_USER_SESSION_KEY = 0xC0000202,
+ MD_NTSTATUS_WIN_STATUS_USER_SESSION_DELETED = 0xC0000203,
+ MD_NTSTATUS_WIN_STATUS_RESOURCE_LANG_NOT_FOUND = 0xC0000204,
+ MD_NTSTATUS_WIN_STATUS_INSUFF_SERVER_RESOURCES = 0xC0000205,
+ MD_NTSTATUS_WIN_STATUS_INVALID_BUFFER_SIZE = 0xC0000206,
+ MD_NTSTATUS_WIN_STATUS_INVALID_ADDRESS_COMPONENT = 0xC0000207,
+ MD_NTSTATUS_WIN_STATUS_INVALID_ADDRESS_WILDCARD = 0xC0000208,
+ MD_NTSTATUS_WIN_STATUS_TOO_MANY_ADDRESSES = 0xC0000209,
+ MD_NTSTATUS_WIN_STATUS_ADDRESS_ALREADY_EXISTS = 0xC000020A,
+ MD_NTSTATUS_WIN_STATUS_ADDRESS_CLOSED = 0xC000020B,
+ MD_NTSTATUS_WIN_STATUS_CONNECTION_DISCONNECTED = 0xC000020C,
+ MD_NTSTATUS_WIN_STATUS_CONNECTION_RESET = 0xC000020D,
+ MD_NTSTATUS_WIN_STATUS_TOO_MANY_NODES = 0xC000020E,
+ MD_NTSTATUS_WIN_STATUS_TRANSACTION_ABORTED = 0xC000020F,
+ MD_NTSTATUS_WIN_STATUS_TRANSACTION_TIMED_OUT = 0xC0000210,
+ MD_NTSTATUS_WIN_STATUS_TRANSACTION_NO_RELEASE = 0xC0000211,
+ MD_NTSTATUS_WIN_STATUS_TRANSACTION_NO_MATCH = 0xC0000212,
+ MD_NTSTATUS_WIN_STATUS_TRANSACTION_RESPONDED = 0xC0000213,
+ MD_NTSTATUS_WIN_STATUS_TRANSACTION_INVALID_ID = 0xC0000214,
+ MD_NTSTATUS_WIN_STATUS_TRANSACTION_INVALID_TYPE = 0xC0000215,
+ MD_NTSTATUS_WIN_STATUS_NOT_SERVER_SESSION = 0xC0000216,
+ MD_NTSTATUS_WIN_STATUS_NOT_CLIENT_SESSION = 0xC0000217,
+ MD_NTSTATUS_WIN_STATUS_CANNOT_LOAD_REGISTRY_FILE = 0xC0000218,
+ MD_NTSTATUS_WIN_STATUS_DEBUG_ATTACH_FAILED = 0xC0000219,
+ MD_NTSTATUS_WIN_STATUS_SYSTEM_PROCESS_TERMINATED = 0xC000021A,
+ MD_NTSTATUS_WIN_STATUS_DATA_NOT_ACCEPTED = 0xC000021B,
+ MD_NTSTATUS_WIN_STATUS_NO_BROWSER_SERVERS_FOUND = 0xC000021C,
+ MD_NTSTATUS_WIN_STATUS_VDM_HARD_ERROR = 0xC000021D,
+ MD_NTSTATUS_WIN_STATUS_DRIVER_CANCEL_TIMEOUT = 0xC000021E,
+ MD_NTSTATUS_WIN_STATUS_REPLY_MESSAGE_MISMATCH = 0xC000021F,
+ MD_NTSTATUS_WIN_STATUS_MAPPED_ALIGNMENT = 0xC0000220,
+ MD_NTSTATUS_WIN_STATUS_IMAGE_CHECKSUM_MISMATCH = 0xC0000221,
+ MD_NTSTATUS_WIN_STATUS_LOST_WRITEBEHIND_DATA = 0xC0000222,
+ MD_NTSTATUS_WIN_STATUS_CLIENT_SERVER_PARAMETERS_INVALID = 0xC0000223,
+ MD_NTSTATUS_WIN_STATUS_PASSWORD_MUST_CHANGE = 0xC0000224,
+ MD_NTSTATUS_WIN_STATUS_NOT_FOUND = 0xC0000225,
+ MD_NTSTATUS_WIN_STATUS_NOT_TINY_STREAM = 0xC0000226,
+ MD_NTSTATUS_WIN_STATUS_RECOVERY_FAILURE = 0xC0000227,
+ MD_NTSTATUS_WIN_STATUS_STACK_OVERFLOW_READ = 0xC0000228,
+ MD_NTSTATUS_WIN_STATUS_FAIL_CHECK = 0xC0000229,
+ MD_NTSTATUS_WIN_STATUS_DUPLICATE_OBJECTID = 0xC000022A,
+ MD_NTSTATUS_WIN_STATUS_OBJECTID_EXISTS = 0xC000022B,
+ MD_NTSTATUS_WIN_STATUS_CONVERT_TO_LARGE = 0xC000022C,
+ MD_NTSTATUS_WIN_STATUS_RETRY = 0xC000022D,
+ MD_NTSTATUS_WIN_STATUS_FOUND_OUT_OF_SCOPE = 0xC000022E,
+ MD_NTSTATUS_WIN_STATUS_ALLOCATE_BUCKET = 0xC000022F,
+ MD_NTSTATUS_WIN_STATUS_PROPSET_NOT_FOUND = 0xC0000230,
+ MD_NTSTATUS_WIN_STATUS_MARSHALL_OVERFLOW = 0xC0000231,
+ MD_NTSTATUS_WIN_STATUS_INVALID_VARIANT = 0xC0000232,
+ MD_NTSTATUS_WIN_STATUS_DOMAIN_CONTROLLER_NOT_FOUND = 0xC0000233,
+ MD_NTSTATUS_WIN_STATUS_ACCOUNT_LOCKED_OUT = 0xC0000234,
+ MD_NTSTATUS_WIN_STATUS_HANDLE_NOT_CLOSABLE = 0xC0000235,
+ MD_NTSTATUS_WIN_STATUS_CONNECTION_REFUSED = 0xC0000236,
+ MD_NTSTATUS_WIN_STATUS_GRACEFUL_DISCONNECT = 0xC0000237,
+ MD_NTSTATUS_WIN_STATUS_ADDRESS_ALREADY_ASSOCIATED = 0xC0000238,
+ MD_NTSTATUS_WIN_STATUS_ADDRESS_NOT_ASSOCIATED = 0xC0000239,
+ MD_NTSTATUS_WIN_STATUS_CONNECTION_INVALID = 0xC000023A,
+ MD_NTSTATUS_WIN_STATUS_CONNECTION_ACTIVE = 0xC000023B,
+ MD_NTSTATUS_WIN_STATUS_NETWORK_UNREACHABLE = 0xC000023C,
+ MD_NTSTATUS_WIN_STATUS_HOST_UNREACHABLE = 0xC000023D,
+ MD_NTSTATUS_WIN_STATUS_PROTOCOL_UNREACHABLE = 0xC000023E,
+ MD_NTSTATUS_WIN_STATUS_PORT_UNREACHABLE = 0xC000023F,
+ MD_NTSTATUS_WIN_STATUS_REQUEST_ABORTED = 0xC0000240,
+ MD_NTSTATUS_WIN_STATUS_CONNECTION_ABORTED = 0xC0000241,
+ MD_NTSTATUS_WIN_STATUS_BAD_COMPRESSION_BUFFER = 0xC0000242,
+ MD_NTSTATUS_WIN_STATUS_USER_MAPPED_FILE = 0xC0000243,
+ MD_NTSTATUS_WIN_STATUS_AUDIT_FAILED = 0xC0000244,
+ MD_NTSTATUS_WIN_STATUS_TIMER_RESOLUTION_NOT_SET = 0xC0000245,
+ MD_NTSTATUS_WIN_STATUS_CONNECTION_COUNT_LIMIT = 0xC0000246,
+ MD_NTSTATUS_WIN_STATUS_LOGIN_TIME_RESTRICTION = 0xC0000247,
+ MD_NTSTATUS_WIN_STATUS_LOGIN_WKSTA_RESTRICTION = 0xC0000248,
+ MD_NTSTATUS_WIN_STATUS_IMAGE_MP_UP_MISMATCH = 0xC0000249,
+ MD_NTSTATUS_WIN_STATUS_INSUFFICIENT_LOGON_INFO = 0xC0000250,
+ MD_NTSTATUS_WIN_STATUS_BAD_DLL_ENTRYPOINT = 0xC0000251,
+ MD_NTSTATUS_WIN_STATUS_BAD_SERVICE_ENTRYPOINT = 0xC0000252,
+ MD_NTSTATUS_WIN_STATUS_LPC_REPLY_LOST = 0xC0000253,
+ MD_NTSTATUS_WIN_STATUS_IP_ADDRESS_CONFLICT1 = 0xC0000254,
+ MD_NTSTATUS_WIN_STATUS_IP_ADDRESS_CONFLICT2 = 0xC0000255,
+ MD_NTSTATUS_WIN_STATUS_REGISTRY_QUOTA_LIMIT = 0xC0000256,
+ MD_NTSTATUS_WIN_STATUS_PATH_NOT_COVERED = 0xC0000257,
+ MD_NTSTATUS_WIN_STATUS_NO_CALLBACK_ACTIVE = 0xC0000258,
+ MD_NTSTATUS_WIN_STATUS_LICENSE_QUOTA_EXCEEDED = 0xC0000259,
+ MD_NTSTATUS_WIN_STATUS_PWD_TOO_SHORT = 0xC000025A,
+ MD_NTSTATUS_WIN_STATUS_PWD_TOO_RECENT = 0xC000025B,
+ MD_NTSTATUS_WIN_STATUS_PWD_HISTORY_CONFLICT = 0xC000025C,
+ MD_NTSTATUS_WIN_STATUS_PLUGPLAY_NO_DEVICE = 0xC000025E,
+ MD_NTSTATUS_WIN_STATUS_UNSUPPORTED_COMPRESSION = 0xC000025F,
+ MD_NTSTATUS_WIN_STATUS_INVALID_HW_PROFILE = 0xC0000260,
+ MD_NTSTATUS_WIN_STATUS_INVALID_PLUGPLAY_DEVICE_PATH = 0xC0000261,
+ MD_NTSTATUS_WIN_STATUS_DRIVER_ORDINAL_NOT_FOUND = 0xC0000262,
+ MD_NTSTATUS_WIN_STATUS_DRIVER_ENTRYPOINT_NOT_FOUND = 0xC0000263,
+ MD_NTSTATUS_WIN_STATUS_RESOURCE_NOT_OWNED = 0xC0000264,
+ MD_NTSTATUS_WIN_STATUS_TOO_MANY_LINKS = 0xC0000265,
+ MD_NTSTATUS_WIN_STATUS_QUOTA_LIST_INCONSISTENT = 0xC0000266,
+ MD_NTSTATUS_WIN_STATUS_FILE_IS_OFFLINE = 0xC0000267,
+ MD_NTSTATUS_WIN_STATUS_EVALUATION_EXPIRATION = 0xC0000268,
+ MD_NTSTATUS_WIN_STATUS_ILLEGAL_DLL_RELOCATION = 0xC0000269,
+ MD_NTSTATUS_WIN_STATUS_LICENSE_VIOLATION = 0xC000026A,
+ MD_NTSTATUS_WIN_STATUS_DLL_INIT_FAILED_LOGOFF = 0xC000026B,
+ MD_NTSTATUS_WIN_STATUS_DRIVER_UNABLE_TO_LOAD = 0xC000026C,
+ MD_NTSTATUS_WIN_STATUS_DFS_UNAVAILABLE = 0xC000026D,
+ MD_NTSTATUS_WIN_STATUS_VOLUME_DISMOUNTED = 0xC000026E,
+ MD_NTSTATUS_WIN_STATUS_WX86_INTERNAL_ERROR = 0xC000026F,
+ MD_NTSTATUS_WIN_STATUS_WX86_FLOAT_STACK_CHECK = 0xC0000270,
+ MD_NTSTATUS_WIN_STATUS_VALIDATE_CONTINUE = 0xC0000271,
+ MD_NTSTATUS_WIN_STATUS_NO_MATCH = 0xC0000272,
+ MD_NTSTATUS_WIN_STATUS_NO_MORE_MATCHES = 0xC0000273,
+ MD_NTSTATUS_WIN_STATUS_NOT_A_REPARSE_POINT = 0xC0000275,
+ MD_NTSTATUS_WIN_STATUS_IO_REPARSE_TAG_INVALID = 0xC0000276,
+ MD_NTSTATUS_WIN_STATUS_IO_REPARSE_TAG_MISMATCH = 0xC0000277,
+ MD_NTSTATUS_WIN_STATUS_IO_REPARSE_DATA_INVALID = 0xC0000278,
+ MD_NTSTATUS_WIN_STATUS_IO_REPARSE_TAG_NOT_HANDLED = 0xC0000279,
+ MD_NTSTATUS_WIN_STATUS_PWD_TOO_LONG = 0xC000027A,
+ MD_NTSTATUS_WIN_STATUS_STOWED_EXCEPTION = 0xC000027B,
+ MD_NTSTATUS_WIN_STATUS_REPARSE_POINT_NOT_RESOLVED = 0xC0000280,
+ MD_NTSTATUS_WIN_STATUS_DIRECTORY_IS_A_REPARSE_POINT = 0xC0000281,
+ MD_NTSTATUS_WIN_STATUS_RANGE_LIST_CONFLICT = 0xC0000282,
+ MD_NTSTATUS_WIN_STATUS_SOURCE_ELEMENT_EMPTY = 0xC0000283,
+ MD_NTSTATUS_WIN_STATUS_DESTINATION_ELEMENT_FULL = 0xC0000284,
+ MD_NTSTATUS_WIN_STATUS_ILLEGAL_ELEMENT_ADDRESS = 0xC0000285,
+ MD_NTSTATUS_WIN_STATUS_MAGAZINE_NOT_PRESENT = 0xC0000286,
+ MD_NTSTATUS_WIN_STATUS_REINITIALIZATION_NEEDED = 0xC0000287,
+ MD_NTSTATUS_WIN_STATUS_ENCRYPTION_FAILED = 0xC000028A,
+ MD_NTSTATUS_WIN_STATUS_DECRYPTION_FAILED = 0xC000028B,
+ MD_NTSTATUS_WIN_STATUS_RANGE_NOT_FOUND = 0xC000028C,
+ MD_NTSTATUS_WIN_STATUS_NO_RECOVERY_POLICY = 0xC000028D,
+ MD_NTSTATUS_WIN_STATUS_NO_EFS = 0xC000028E,
+ MD_NTSTATUS_WIN_STATUS_WRONG_EFS = 0xC000028F,
+ MD_NTSTATUS_WIN_STATUS_NO_USER_KEYS = 0xC0000290,
+ MD_NTSTATUS_WIN_STATUS_FILE_NOT_ENCRYPTED = 0xC0000291,
+ MD_NTSTATUS_WIN_STATUS_NOT_EXPORT_FORMAT = 0xC0000292,
+ MD_NTSTATUS_WIN_STATUS_FILE_ENCRYPTED = 0xC0000293,
+ MD_NTSTATUS_WIN_STATUS_WMI_GUID_NOT_FOUND = 0xC0000295,
+ MD_NTSTATUS_WIN_STATUS_WMI_INSTANCE_NOT_FOUND = 0xC0000296,
+ MD_NTSTATUS_WIN_STATUS_WMI_ITEMID_NOT_FOUND = 0xC0000297,
+ MD_NTSTATUS_WIN_STATUS_WMI_TRY_AGAIN = 0xC0000298,
+ MD_NTSTATUS_WIN_STATUS_SHARED_POLICY = 0xC0000299,
+ MD_NTSTATUS_WIN_STATUS_POLICY_OBJECT_NOT_FOUND = 0xC000029A,
+ MD_NTSTATUS_WIN_STATUS_POLICY_ONLY_IN_DS = 0xC000029B,
+ MD_NTSTATUS_WIN_STATUS_VOLUME_NOT_UPGRADED = 0xC000029C,
+ MD_NTSTATUS_WIN_STATUS_REMOTE_STORAGE_NOT_ACTIVE = 0xC000029D,
+ MD_NTSTATUS_WIN_STATUS_REMOTE_STORAGE_MEDIA_ERROR = 0xC000029E,
+ MD_NTSTATUS_WIN_STATUS_NO_TRACKING_SERVICE = 0xC000029F,
+ MD_NTSTATUS_WIN_STATUS_SERVER_SID_MISMATCH = 0xC00002A0,
+ MD_NTSTATUS_WIN_STATUS_DS_NO_ATTRIBUTE_OR_VALUE = 0xC00002A1,
+ MD_NTSTATUS_WIN_STATUS_DS_INVALID_ATTRIBUTE_SYNTAX = 0xC00002A2,
+ MD_NTSTATUS_WIN_STATUS_DS_ATTRIBUTE_TYPE_UNDEFINED = 0xC00002A3,
+ MD_NTSTATUS_WIN_STATUS_DS_ATTRIBUTE_OR_VALUE_EXISTS = 0xC00002A4,
+ MD_NTSTATUS_WIN_STATUS_DS_BUSY = 0xC00002A5,
+ MD_NTSTATUS_WIN_STATUS_DS_UNAVAILABLE = 0xC00002A6,
+ MD_NTSTATUS_WIN_STATUS_DS_NO_RIDS_ALLOCATED = 0xC00002A7,
+ MD_NTSTATUS_WIN_STATUS_DS_NO_MORE_RIDS = 0xC00002A8,
+ MD_NTSTATUS_WIN_STATUS_DS_INCORRECT_ROLE_OWNER = 0xC00002A9,
+ MD_NTSTATUS_WIN_STATUS_DS_RIDMGR_INIT_ERROR = 0xC00002AA,
+ MD_NTSTATUS_WIN_STATUS_DS_OBJ_CLASS_VIOLATION = 0xC00002AB,
+ MD_NTSTATUS_WIN_STATUS_DS_CANT_ON_NON_LEAF = 0xC00002AC,
+ MD_NTSTATUS_WIN_STATUS_DS_CANT_ON_RDN = 0xC00002AD,
+ MD_NTSTATUS_WIN_STATUS_DS_CANT_MOD_OBJ_CLASS = 0xC00002AE,
+ MD_NTSTATUS_WIN_STATUS_DS_CROSS_DOM_MOVE_FAILED = 0xC00002AF,
+ MD_NTSTATUS_WIN_STATUS_DS_GC_NOT_AVAILABLE = 0xC00002B0,
+ MD_NTSTATUS_WIN_STATUS_DIRECTORY_SERVICE_REQUIRED = 0xC00002B1,
+ MD_NTSTATUS_WIN_STATUS_REPARSE_ATTRIBUTE_CONFLICT = 0xC00002B2,
+ MD_NTSTATUS_WIN_STATUS_CANT_ENABLE_DENY_ONLY = 0xC00002B3,
+ MD_NTSTATUS_WIN_STATUS_FLOAT_MULTIPLE_FAULTS = 0xC00002B4,
+ MD_NTSTATUS_WIN_STATUS_FLOAT_MULTIPLE_TRAPS = 0xC00002B5,
+ MD_NTSTATUS_WIN_STATUS_DEVICE_REMOVED = 0xC00002B6,
+ MD_NTSTATUS_WIN_STATUS_JOURNAL_DELETE_IN_PROGRESS = 0xC00002B7,
+ MD_NTSTATUS_WIN_STATUS_JOURNAL_NOT_ACTIVE = 0xC00002B8,
+ MD_NTSTATUS_WIN_STATUS_NOINTERFACE = 0xC00002B9,
+ MD_NTSTATUS_WIN_STATUS_DS_RIDMGR_DISABLED = 0xC00002BA,
+ MD_NTSTATUS_WIN_STATUS_DS_ADMIN_LIMIT_EXCEEDED = 0xC00002C1,
+ MD_NTSTATUS_WIN_STATUS_DRIVER_FAILED_SLEEP = 0xC00002C2,
+ MD_NTSTATUS_WIN_STATUS_MUTUAL_AUTHENTICATION_FAILED = 0xC00002C3,
+ MD_NTSTATUS_WIN_STATUS_CORRUPT_SYSTEM_FILE = 0xC00002C4,
+ MD_NTSTATUS_WIN_STATUS_DATATYPE_MISALIGNMENT_ERROR = 0xC00002C5,
+ MD_NTSTATUS_WIN_STATUS_WMI_READ_ONLY = 0xC00002C6,
+ MD_NTSTATUS_WIN_STATUS_WMI_SET_FAILURE = 0xC00002C7,
+ MD_NTSTATUS_WIN_STATUS_COMMITMENT_MINIMUM = 0xC00002C8,
+ MD_NTSTATUS_WIN_STATUS_REG_NAT_CONSUMPTION = 0xC00002C9,
+ MD_NTSTATUS_WIN_STATUS_TRANSPORT_FULL = 0xC00002CA,
+ MD_NTSTATUS_WIN_STATUS_DS_SAM_INIT_FAILURE = 0xC00002CB,
+ MD_NTSTATUS_WIN_STATUS_ONLY_IF_CONNECTED = 0xC00002CC,
+ MD_NTSTATUS_WIN_STATUS_DS_SENSITIVE_GROUP_VIOLATION = 0xC00002CD,
+ MD_NTSTATUS_WIN_STATUS_PNP_RESTART_ENUMERATION = 0xC00002CE,
+ MD_NTSTATUS_WIN_STATUS_JOURNAL_ENTRY_DELETED = 0xC00002CF,
+ MD_NTSTATUS_WIN_STATUS_DS_CANT_MOD_PRIMARYGROUPID = 0xC00002D0,
+ MD_NTSTATUS_WIN_STATUS_SYSTEM_IMAGE_BAD_SIGNATURE = 0xC00002D1,
+ MD_NTSTATUS_WIN_STATUS_PNP_REBOOT_REQUIRED = 0xC00002D2,
+ MD_NTSTATUS_WIN_STATUS_POWER_STATE_INVALID = 0xC00002D3,
+ MD_NTSTATUS_WIN_STATUS_DS_INVALID_GROUP_TYPE = 0xC00002D4,
+ MD_NTSTATUS_WIN_STATUS_DS_NO_NEST_GLOBALGROUP_IN_MIXEDDOMAIN = 0xC00002D5,
+ MD_NTSTATUS_WIN_STATUS_DS_NO_NEST_LOCALGROUP_IN_MIXEDDOMAIN = 0xC00002D6,
+ MD_NTSTATUS_WIN_STATUS_DS_GLOBAL_CANT_HAVE_LOCAL_MEMBER = 0xC00002D7,
+ MD_NTSTATUS_WIN_STATUS_DS_GLOBAL_CANT_HAVE_UNIVERSAL_MEMBER = 0xC00002D8,
+ MD_NTSTATUS_WIN_STATUS_DS_UNIVERSAL_CANT_HAVE_LOCAL_MEMBER = 0xC00002D9,
+ MD_NTSTATUS_WIN_STATUS_DS_GLOBAL_CANT_HAVE_CROSSDOMAIN_MEMBER = 0xC00002DA,
+ MD_NTSTATUS_WIN_STATUS_DS_LOCAL_CANT_HAVE_CROSSDOMAIN_LOCAL_MEMBER = 0xC00002DB,
+ MD_NTSTATUS_WIN_STATUS_DS_HAVE_PRIMARY_MEMBERS = 0xC00002DC,
+ MD_NTSTATUS_WIN_STATUS_WMI_NOT_SUPPORTED = 0xC00002DD,
+ MD_NTSTATUS_WIN_STATUS_INSUFFICIENT_POWER = 0xC00002DE,
+ MD_NTSTATUS_WIN_STATUS_SAM_NEED_BOOTKEY_PASSWORD = 0xC00002DF,
+ MD_NTSTATUS_WIN_STATUS_SAM_NEED_BOOTKEY_FLOPPY = 0xC00002E0,
+ MD_NTSTATUS_WIN_STATUS_DS_CANT_START = 0xC00002E1,
+ MD_NTSTATUS_WIN_STATUS_DS_INIT_FAILURE = 0xC00002E2,
+ MD_NTSTATUS_WIN_STATUS_SAM_INIT_FAILURE = 0xC00002E3,
+ MD_NTSTATUS_WIN_STATUS_DS_GC_REQUIRED = 0xC00002E4,
+ MD_NTSTATUS_WIN_STATUS_DS_LOCAL_MEMBER_OF_LOCAL_ONLY = 0xC00002E5,
+ MD_NTSTATUS_WIN_STATUS_DS_NO_FPO_IN_UNIVERSAL_GROUPS = 0xC00002E6,
+ MD_NTSTATUS_WIN_STATUS_DS_MACHINE_ACCOUNT_QUOTA_EXCEEDED = 0xC00002E7,
+ MD_NTSTATUS_WIN_STATUS_MULTIPLE_FAULT_VIOLATION = 0xC00002E8,
+ MD_NTSTATUS_WIN_STATUS_CURRENT_DOMAIN_NOT_ALLOWED = 0xC00002E9,
+ MD_NTSTATUS_WIN_STATUS_CANNOT_MAKE = 0xC00002EA,
+ MD_NTSTATUS_WIN_STATUS_SYSTEM_SHUTDOWN = 0xC00002EB,
+ MD_NTSTATUS_WIN_STATUS_DS_INIT_FAILURE_CONSOLE = 0xC00002EC,
+ MD_NTSTATUS_WIN_STATUS_DS_SAM_INIT_FAILURE_CONSOLE = 0xC00002ED,
+ MD_NTSTATUS_WIN_STATUS_UNFINISHED_CONTEXT_DELETED = 0xC00002EE,
+ MD_NTSTATUS_WIN_STATUS_NO_TGT_REPLY = 0xC00002EF,
+ MD_NTSTATUS_WIN_STATUS_OBJECTID_NOT_FOUND = 0xC00002F0,
+ MD_NTSTATUS_WIN_STATUS_NO_IP_ADDRESSES = 0xC00002F1,
+ MD_NTSTATUS_WIN_STATUS_WRONG_CREDENTIAL_HANDLE = 0xC00002F2,
+ MD_NTSTATUS_WIN_STATUS_CRYPTO_SYSTEM_INVALID = 0xC00002F3,
+ MD_NTSTATUS_WIN_STATUS_MAX_REFERRALS_EXCEEDED = 0xC00002F4,
+ MD_NTSTATUS_WIN_STATUS_MUST_BE_KDC = 0xC00002F5,
+ MD_NTSTATUS_WIN_STATUS_STRONG_CRYPTO_NOT_SUPPORTED = 0xC00002F6,
+ MD_NTSTATUS_WIN_STATUS_TOO_MANY_PRINCIPALS = 0xC00002F7,
+ MD_NTSTATUS_WIN_STATUS_NO_PA_DATA = 0xC00002F8,
+ MD_NTSTATUS_WIN_STATUS_PKINIT_NAME_MISMATCH = 0xC00002F9,
+ MD_NTSTATUS_WIN_STATUS_SMARTCARD_LOGON_REQUIRED = 0xC00002FA,
+ MD_NTSTATUS_WIN_STATUS_KDC_INVALID_REQUEST = 0xC00002FB,
+ MD_NTSTATUS_WIN_STATUS_KDC_UNABLE_TO_REFER = 0xC00002FC,
+ MD_NTSTATUS_WIN_STATUS_KDC_UNKNOWN_ETYPE = 0xC00002FD,
+ MD_NTSTATUS_WIN_STATUS_SHUTDOWN_IN_PROGRESS = 0xC00002FE,
+ MD_NTSTATUS_WIN_STATUS_SERVER_SHUTDOWN_IN_PROGRESS = 0xC00002FF,
+ MD_NTSTATUS_WIN_STATUS_NOT_SUPPORTED_ON_SBS = 0xC0000300,
+ MD_NTSTATUS_WIN_STATUS_WMI_GUID_DISCONNECTED = 0xC0000301,
+ MD_NTSTATUS_WIN_STATUS_WMI_ALREADY_DISABLED = 0xC0000302,
+ MD_NTSTATUS_WIN_STATUS_WMI_ALREADY_ENABLED = 0xC0000303,
+ MD_NTSTATUS_WIN_STATUS_MFT_TOO_FRAGMENTED = 0xC0000304,
+ MD_NTSTATUS_WIN_STATUS_COPY_PROTECTION_FAILURE = 0xC0000305,
+ MD_NTSTATUS_WIN_STATUS_CSS_AUTHENTICATION_FAILURE = 0xC0000306,
+ MD_NTSTATUS_WIN_STATUS_CSS_KEY_NOT_PRESENT = 0xC0000307,
+ MD_NTSTATUS_WIN_STATUS_CSS_KEY_NOT_ESTABLISHED = 0xC0000308,
+ MD_NTSTATUS_WIN_STATUS_CSS_SCRAMBLED_SECTOR = 0xC0000309,
+ MD_NTSTATUS_WIN_STATUS_CSS_REGION_MISMATCH = 0xC000030A,
+ MD_NTSTATUS_WIN_STATUS_CSS_RESETS_EXHAUSTED = 0xC000030B,
+ MD_NTSTATUS_WIN_STATUS_PASSWORD_CHANGE_REQUIRED = 0xC000030C,
+ MD_NTSTATUS_WIN_STATUS_PKINIT_FAILURE = 0xC0000320,
+ MD_NTSTATUS_WIN_STATUS_SMARTCARD_SUBSYSTEM_FAILURE = 0xC0000321,
+ MD_NTSTATUS_WIN_STATUS_NO_KERB_KEY = 0xC0000322,
+ MD_NTSTATUS_WIN_STATUS_HOST_DOWN = 0xC0000350,
+ MD_NTSTATUS_WIN_STATUS_UNSUPPORTED_PREAUTH = 0xC0000351,
+ MD_NTSTATUS_WIN_STATUS_EFS_ALG_BLOB_TOO_BIG = 0xC0000352,
+ MD_NTSTATUS_WIN_STATUS_PORT_NOT_SET = 0xC0000353,
+ MD_NTSTATUS_WIN_STATUS_DEBUGGER_INACTIVE = 0xC0000354,
+ MD_NTSTATUS_WIN_STATUS_DS_VERSION_CHECK_FAILURE = 0xC0000355,
+ MD_NTSTATUS_WIN_STATUS_AUDITING_DISABLED = 0xC0000356,
+ MD_NTSTATUS_WIN_STATUS_PRENT4_MACHINE_ACCOUNT = 0xC0000357,
+ MD_NTSTATUS_WIN_STATUS_DS_AG_CANT_HAVE_UNIVERSAL_MEMBER = 0xC0000358,
+ MD_NTSTATUS_WIN_STATUS_INVALID_IMAGE_WIN_32 = 0xC0000359,
+ MD_NTSTATUS_WIN_STATUS_INVALID_IMAGE_WIN_64 = 0xC000035A,
+ MD_NTSTATUS_WIN_STATUS_BAD_BINDINGS = 0xC000035B,
+ MD_NTSTATUS_WIN_STATUS_NETWORK_SESSION_EXPIRED = 0xC000035C,
+ MD_NTSTATUS_WIN_STATUS_APPHELP_BLOCK = 0xC000035D,
+ MD_NTSTATUS_WIN_STATUS_ALL_SIDS_FILTERED = 0xC000035E,
+ MD_NTSTATUS_WIN_STATUS_NOT_SAFE_MODE_DRIVER = 0xC000035F,
+ MD_NTSTATUS_WIN_STATUS_ACCESS_DISABLED_BY_POLICY_DEFAULT = 0xC0000361,
+ MD_NTSTATUS_WIN_STATUS_ACCESS_DISABLED_BY_POLICY_PATH = 0xC0000362,
+ MD_NTSTATUS_WIN_STATUS_ACCESS_DISABLED_BY_POLICY_PUBLISHER = 0xC0000363,
+ MD_NTSTATUS_WIN_STATUS_ACCESS_DISABLED_BY_POLICY_OTHER = 0xC0000364,
+ MD_NTSTATUS_WIN_STATUS_FAILED_DRIVER_ENTRY = 0xC0000365,
+ MD_NTSTATUS_WIN_STATUS_DEVICE_ENUMERATION_ERROR = 0xC0000366,
+ MD_NTSTATUS_WIN_STATUS_MOUNT_POINT_NOT_RESOLVED = 0xC0000368,
+ MD_NTSTATUS_WIN_STATUS_INVALID_DEVICE_OBJECT_PARAMETER = 0xC0000369,
+ MD_NTSTATUS_WIN_STATUS_MCA_OCCURED = 0xC000036A,
+ MD_NTSTATUS_WIN_STATUS_DRIVER_BLOCKED_CRITICAL = 0xC000036B,
+ MD_NTSTATUS_WIN_STATUS_DRIVER_BLOCKED = 0xC000036C,
+ MD_NTSTATUS_WIN_STATUS_DRIVER_DATABASE_ERROR = 0xC000036D,
+ MD_NTSTATUS_WIN_STATUS_SYSTEM_HIVE_TOO_LARGE = 0xC000036E,
+ MD_NTSTATUS_WIN_STATUS_INVALID_IMPORT_OF_NON_DLL = 0xC000036F,
+ MD_NTSTATUS_WIN_STATUS_NO_SECRETS = 0xC0000371,
+ MD_NTSTATUS_WIN_STATUS_ACCESS_DISABLED_NO_SAFER_UI_BY_POLICY = 0xC0000372,
+ MD_NTSTATUS_WIN_STATUS_FAILED_STACK_SWITCH = 0xC0000373,
+ MD_NTSTATUS_WIN_STATUS_HEAP_CORRUPTION = 0xC0000374,
+ MD_NTSTATUS_WIN_STATUS_SMARTCARD_WRONG_PIN = 0xC0000380,
+ MD_NTSTATUS_WIN_STATUS_SMARTCARD_CARD_BLOCKED = 0xC0000381,
+ MD_NTSTATUS_WIN_STATUS_SMARTCARD_CARD_NOT_AUTHENTICATED = 0xC0000382,
+ MD_NTSTATUS_WIN_STATUS_SMARTCARD_NO_CARD = 0xC0000383,
+ MD_NTSTATUS_WIN_STATUS_SMARTCARD_NO_KEY_CONTAINER = 0xC0000384,
+ MD_NTSTATUS_WIN_STATUS_SMARTCARD_NO_CERTIFICATE = 0xC0000385,
+ MD_NTSTATUS_WIN_STATUS_SMARTCARD_NO_KEYSET = 0xC0000386,
+ MD_NTSTATUS_WIN_STATUS_SMARTCARD_IO_ERROR = 0xC0000387,
+ MD_NTSTATUS_WIN_STATUS_DOWNGRADE_DETECTED = 0xC0000388,
+ MD_NTSTATUS_WIN_STATUS_SMARTCARD_CERT_REVOKED = 0xC0000389,
+ MD_NTSTATUS_WIN_STATUS_ISSUING_CA_UNTRUSTED = 0xC000038A,
+ MD_NTSTATUS_WIN_STATUS_REVOCATION_OFFLINE_C = 0xC000038B,
+ MD_NTSTATUS_WIN_STATUS_PKINIT_CLIENT_FAILURE = 0xC000038C,
+ MD_NTSTATUS_WIN_STATUS_SMARTCARD_CERT_EXPIRED = 0xC000038D,
+ MD_NTSTATUS_WIN_STATUS_DRIVER_FAILED_PRIOR_UNLOAD = 0xC000038E,
+ MD_NTSTATUS_WIN_STATUS_SMARTCARD_SILENT_CONTEXT = 0xC000038F,
+ MD_NTSTATUS_WIN_STATUS_PER_USER_TRUST_QUOTA_EXCEEDED = 0xC0000401,
+ MD_NTSTATUS_WIN_STATUS_ALL_USER_TRUST_QUOTA_EXCEEDED = 0xC0000402,
+ MD_NTSTATUS_WIN_STATUS_USER_DELETE_TRUST_QUOTA_EXCEEDED = 0xC0000403,
+ MD_NTSTATUS_WIN_STATUS_DS_NAME_NOT_UNIQUE = 0xC0000404,
+ MD_NTSTATUS_WIN_STATUS_DS_DUPLICATE_ID_FOUND = 0xC0000405,
+ MD_NTSTATUS_WIN_STATUS_DS_GROUP_CONVERSION_ERROR = 0xC0000406,
+ MD_NTSTATUS_WIN_STATUS_VOLSNAP_PREPARE_HIBERNATE = 0xC0000407,
+ MD_NTSTATUS_WIN_STATUS_USER2USER_REQUIRED = 0xC0000408,
+ MD_NTSTATUS_WIN_STATUS_STACK_BUFFER_OVERRUN = 0xC0000409,
+ MD_NTSTATUS_WIN_STATUS_NO_S4U_PROT_SUPPORT = 0xC000040A,
+ MD_NTSTATUS_WIN_STATUS_CROSSREALM_DELEGATION_FAILURE = 0xC000040B,
+ MD_NTSTATUS_WIN_STATUS_REVOCATION_OFFLINE_KDC = 0xC000040C,
+ MD_NTSTATUS_WIN_STATUS_ISSUING_CA_UNTRUSTED_KDC = 0xC000040D,
+ MD_NTSTATUS_WIN_STATUS_KDC_CERT_EXPIRED = 0xC000040E,
+ MD_NTSTATUS_WIN_STATUS_KDC_CERT_REVOKED = 0xC000040F,
+ MD_NTSTATUS_WIN_STATUS_PARAMETER_QUOTA_EXCEEDED = 0xC0000410,
+ MD_NTSTATUS_WIN_STATUS_HIBERNATION_FAILURE = 0xC0000411,
+ MD_NTSTATUS_WIN_STATUS_DELAY_LOAD_FAILED = 0xC0000412,
+ MD_NTSTATUS_WIN_STATUS_AUTHENTICATION_FIREWALL_FAILED = 0xC0000413,
+ MD_NTSTATUS_WIN_STATUS_VDM_DISALLOWED = 0xC0000414,
+ MD_NTSTATUS_WIN_STATUS_HUNG_DISPLAY_DRIVER_THREAD = 0xC0000415,
+ MD_NTSTATUS_WIN_STATUS_INSUFFICIENT_RESOURCE_FOR_SPECIFIED_SHARED_SECTION_SIZE = 0xC0000416,
+ MD_NTSTATUS_WIN_STATUS_INVALID_CRUNTIME_PARAMETER = 0xC0000417,
+ MD_NTSTATUS_WIN_STATUS_NTLM_BLOCKED = 0xC0000418,
+ MD_NTSTATUS_WIN_STATUS_DS_SRC_SID_EXISTS_IN_FOREST = 0xC0000419,
+ MD_NTSTATUS_WIN_STATUS_DS_DOMAIN_NAME_EXISTS_IN_FOREST = 0xC000041A,
+ MD_NTSTATUS_WIN_STATUS_DS_FLAT_NAME_EXISTS_IN_FOREST = 0xC000041B,
+ MD_NTSTATUS_WIN_STATUS_INVALID_USER_PRINCIPAL_NAME = 0xC000041C,
+ MD_NTSTATUS_WIN_STATUS_FATAL_USER_CALLBACK_EXCEPTION = 0xC000041D,
+ MD_NTSTATUS_WIN_STATUS_ASSERTION_FAILURE = 0xC0000420,
+ MD_NTSTATUS_WIN_STATUS_VERIFIER_STOP = 0xC0000421,
+ MD_NTSTATUS_WIN_STATUS_CALLBACK_POP_STACK = 0xC0000423,
+ MD_NTSTATUS_WIN_STATUS_INCOMPATIBLE_DRIVER_BLOCKED = 0xC0000424,
+ MD_NTSTATUS_WIN_STATUS_HIVE_UNLOADED = 0xC0000425,
+ MD_NTSTATUS_WIN_STATUS_COMPRESSION_DISABLED = 0xC0000426,
+ MD_NTSTATUS_WIN_STATUS_FILE_SYSTEM_LIMITATION = 0xC0000427,
+ MD_NTSTATUS_WIN_STATUS_INVALID_IMAGE_HASH = 0xC0000428,
+ MD_NTSTATUS_WIN_STATUS_NOT_CAPABLE = 0xC0000429,
+ MD_NTSTATUS_WIN_STATUS_REQUEST_OUT_OF_SEQUENCE = 0xC000042A,
+ MD_NTSTATUS_WIN_STATUS_IMPLEMENTATION_LIMIT = 0xC000042B,
+ MD_NTSTATUS_WIN_STATUS_ELEVATION_REQUIRED = 0xC000042C,
+ MD_NTSTATUS_WIN_STATUS_NO_SECURITY_CONTEXT = 0xC000042D,
+ MD_NTSTATUS_WIN_STATUS_PKU2U_CERT_FAILURE = 0xC000042F,
+ MD_NTSTATUS_WIN_STATUS_BEYOND_VDL = 0xC0000432,
+ MD_NTSTATUS_WIN_STATUS_ENCOUNTERED_WRITE_IN_PROGRESS = 0xC0000433,
+ MD_NTSTATUS_WIN_STATUS_PTE_CHANGED = 0xC0000434,
+ MD_NTSTATUS_WIN_STATUS_PURGE_FAILED = 0xC0000435,
+ MD_NTSTATUS_WIN_STATUS_CRED_REQUIRES_CONFIRMATION = 0xC0000440,
+ MD_NTSTATUS_WIN_STATUS_CS_ENCRYPTION_INVALID_SERVER_RESPONSE = 0xC0000441,
+ MD_NTSTATUS_WIN_STATUS_CS_ENCRYPTION_UNSUPPORTED_SERVER = 0xC0000442,
+ MD_NTSTATUS_WIN_STATUS_CS_ENCRYPTION_EXISTING_ENCRYPTED_FILE = 0xC0000443,
+ MD_NTSTATUS_WIN_STATUS_CS_ENCRYPTION_NEW_ENCRYPTED_FILE = 0xC0000444,
+ MD_NTSTATUS_WIN_STATUS_CS_ENCRYPTION_FILE_NOT_CSE = 0xC0000445,
+ MD_NTSTATUS_WIN_STATUS_INVALID_LABEL = 0xC0000446,
+ MD_NTSTATUS_WIN_STATUS_DRIVER_PROCESS_TERMINATED = 0xC0000450,
+ MD_NTSTATUS_WIN_STATUS_AMBIGUOUS_SYSTEM_DEVICE = 0xC0000451,
+ MD_NTSTATUS_WIN_STATUS_SYSTEM_DEVICE_NOT_FOUND = 0xC0000452,
+ MD_NTSTATUS_WIN_STATUS_RESTART_BOOT_APPLICATION = 0xC0000453,
+ MD_NTSTATUS_WIN_STATUS_INSUFFICIENT_NVRAM_RESOURCES = 0xC0000454,
+ MD_NTSTATUS_WIN_STATUS_INVALID_SESSION = 0xC0000455,
+ MD_NTSTATUS_WIN_STATUS_THREAD_ALREADY_IN_SESSION = 0xC0000456,
+ MD_NTSTATUS_WIN_STATUS_THREAD_NOT_IN_SESSION = 0xC0000457,
+ MD_NTSTATUS_WIN_STATUS_INVALID_WEIGHT = 0xC0000458,
+ MD_NTSTATUS_WIN_STATUS_REQUEST_PAUSED = 0xC0000459,
+ MD_NTSTATUS_WIN_STATUS_NO_RANGES_PROCESSED = 0xC0000460,
+ MD_NTSTATUS_WIN_STATUS_DISK_RESOURCES_EXHAUSTED = 0xC0000461,
+ MD_NTSTATUS_WIN_STATUS_NEEDS_REMEDIATION = 0xC0000462,
+ MD_NTSTATUS_WIN_STATUS_DEVICE_FEATURE_NOT_SUPPORTED = 0xC0000463,
+ MD_NTSTATUS_WIN_STATUS_DEVICE_UNREACHABLE = 0xC0000464,
+ MD_NTSTATUS_WIN_STATUS_INVALID_TOKEN = 0xC0000465,
+ MD_NTSTATUS_WIN_STATUS_SERVER_UNAVAILABLE = 0xC0000466,
+ MD_NTSTATUS_WIN_STATUS_FILE_NOT_AVAILABLE = 0xC0000467,
+ MD_NTSTATUS_WIN_STATUS_DEVICE_INSUFFICIENT_RESOURCES = 0xC0000468,
+ MD_NTSTATUS_WIN_STATUS_PACKAGE_UPDATING = 0xC0000469,
+ MD_NTSTATUS_WIN_STATUS_NOT_READ_FROM_COPY = 0xC000046A,
+ MD_NTSTATUS_WIN_STATUS_FT_WRITE_FAILURE = 0xC000046B,
+ MD_NTSTATUS_WIN_STATUS_FT_DI_SCAN_REQUIRED = 0xC000046C,
+ MD_NTSTATUS_WIN_STATUS_OBJECT_NOT_EXTERNALLY_BACKED = 0xC000046D,
+ MD_NTSTATUS_WIN_STATUS_EXTERNAL_BACKING_PROVIDER_UNKNOWN = 0xC000046E,
+ MD_NTSTATUS_WIN_STATUS_DATA_CHECKSUM_ERROR = 0xC0000470,
+ MD_NTSTATUS_WIN_STATUS_INTERMIXED_KERNEL_EA_OPERATION = 0xC0000471,
+ MD_NTSTATUS_WIN_STATUS_TRIM_READ_ZERO_NOT_SUPPORTED = 0xC0000472,
+ MD_NTSTATUS_WIN_STATUS_TOO_MANY_SEGMENT_DESCRIPTORS = 0xC0000473,
+ MD_NTSTATUS_WIN_STATUS_INVALID_OFFSET_ALIGNMENT = 0xC0000474,
+ MD_NTSTATUS_WIN_STATUS_INVALID_FIELD_IN_PARAMETER_LIST = 0xC0000475,
+ MD_NTSTATUS_WIN_STATUS_OPERATION_IN_PROGRESS = 0xC0000476,
+ MD_NTSTATUS_WIN_STATUS_INVALID_INITIATOR_TARGET_PATH = 0xC0000477,
+ MD_NTSTATUS_WIN_STATUS_SCRUB_DATA_DISABLED = 0xC0000478,
+ MD_NTSTATUS_WIN_STATUS_NOT_REDUNDANT_STORAGE = 0xC0000479,
+ MD_NTSTATUS_WIN_STATUS_RESIDENT_FILE_NOT_SUPPORTED = 0xC000047A,
+ MD_NTSTATUS_WIN_STATUS_COMPRESSED_FILE_NOT_SUPPORTED = 0xC000047B,
+ MD_NTSTATUS_WIN_STATUS_DIRECTORY_NOT_SUPPORTED = 0xC000047C,
+ MD_NTSTATUS_WIN_STATUS_IO_OPERATION_TIMEOUT = 0xC000047D,
+ MD_NTSTATUS_WIN_STATUS_SYSTEM_NEEDS_REMEDIATION = 0xC000047E,
+ MD_NTSTATUS_WIN_STATUS_APPX_INTEGRITY_FAILURE_CLR_NGEN = 0xC000047F,
+ MD_NTSTATUS_WIN_STATUS_SHARE_UNAVAILABLE = 0xC0000480,
+ MD_NTSTATUS_WIN_STATUS_APISET_NOT_HOSTED = 0xC0000481,
+ MD_NTSTATUS_WIN_STATUS_APISET_NOT_PRESENT = 0xC0000482,
+ MD_NTSTATUS_WIN_STATUS_DEVICE_HARDWARE_ERROR = 0xC0000483,
+ MD_NTSTATUS_WIN_STATUS_INVALID_TASK_NAME = 0xC0000500,
+ MD_NTSTATUS_WIN_STATUS_INVALID_TASK_INDEX = 0xC0000501,
+ MD_NTSTATUS_WIN_STATUS_THREAD_ALREADY_IN_TASK = 0xC0000502,
+ MD_NTSTATUS_WIN_STATUS_CALLBACK_BYPASS = 0xC0000503,
+ MD_NTSTATUS_WIN_STATUS_UNDEFINED_SCOPE = 0xC0000504,
+ MD_NTSTATUS_WIN_STATUS_INVALID_CAP = 0xC0000505,
+ MD_NTSTATUS_WIN_STATUS_NOT_GUI_PROCESS = 0xC0000506,
+ MD_NTSTATUS_WIN_STATUS_FAIL_FAST_EXCEPTION = 0xC0000602,
+ MD_NTSTATUS_WIN_STATUS_IMAGE_CERT_REVOKED = 0xC0000603,
+ MD_NTSTATUS_WIN_STATUS_DYNAMIC_CODE_BLOCKED = 0xC0000604,
+ MD_NTSTATUS_WIN_STATUS_PORT_CLOSED = 0xC0000700,
+ MD_NTSTATUS_WIN_STATUS_MESSAGE_LOST = 0xC0000701,
+ MD_NTSTATUS_WIN_STATUS_INVALID_MESSAGE = 0xC0000702,
+ MD_NTSTATUS_WIN_STATUS_REQUEST_CANCELED = 0xC0000703,
+ MD_NTSTATUS_WIN_STATUS_RECURSIVE_DISPATCH = 0xC0000704,
+ MD_NTSTATUS_WIN_STATUS_LPC_RECEIVE_BUFFER_EXPECTED = 0xC0000705,
+ MD_NTSTATUS_WIN_STATUS_LPC_INVALID_CONNECTION_USAGE = 0xC0000706,
+ MD_NTSTATUS_WIN_STATUS_LPC_REQUESTS_NOT_ALLOWED = 0xC0000707,
+ MD_NTSTATUS_WIN_STATUS_RESOURCE_IN_USE = 0xC0000708,
+ MD_NTSTATUS_WIN_STATUS_HARDWARE_MEMORY_ERROR = 0xC0000709,
+ MD_NTSTATUS_WIN_STATUS_THREADPOOL_HANDLE_EXCEPTION = 0xC000070A,
+ MD_NTSTATUS_WIN_STATUS_THREADPOOL_SET_EVENT_ON_COMPLETION_FAILED = 0xC000070B,
+ MD_NTSTATUS_WIN_STATUS_THREADPOOL_RELEASE_SEMAPHORE_ON_COMPLETION_FAILED = 0xC000070C,
+ MD_NTSTATUS_WIN_STATUS_THREADPOOL_RELEASE_MUTEX_ON_COMPLETION_FAILED = 0xC000070D,
+ MD_NTSTATUS_WIN_STATUS_THREADPOOL_FREE_LIBRARY_ON_COMPLETION_FAILED = 0xC000070E,
+ MD_NTSTATUS_WIN_STATUS_THREADPOOL_RELEASED_DURING_OPERATION = 0xC000070F,
+ MD_NTSTATUS_WIN_STATUS_CALLBACK_RETURNED_WHILE_IMPERSONATING = 0xC0000710,
+ MD_NTSTATUS_WIN_STATUS_APC_RETURNED_WHILE_IMPERSONATING = 0xC0000711,
+ MD_NTSTATUS_WIN_STATUS_PROCESS_IS_PROTECTED = 0xC0000712,
+ MD_NTSTATUS_WIN_STATUS_MCA_EXCEPTION = 0xC0000713,
+ MD_NTSTATUS_WIN_STATUS_CERTIFICATE_MAPPING_NOT_UNIQUE = 0xC0000714,
+ MD_NTSTATUS_WIN_STATUS_SYMLINK_CLASS_DISABLED = 0xC0000715,
+ MD_NTSTATUS_WIN_STATUS_INVALID_IDN_NORMALIZATION = 0xC0000716,
+ MD_NTSTATUS_WIN_STATUS_NO_UNICODE_TRANSLATION = 0xC0000717,
+ MD_NTSTATUS_WIN_STATUS_ALREADY_REGISTERED = 0xC0000718,
+ MD_NTSTATUS_WIN_STATUS_CONTEXT_MISMATCH = 0xC0000719,
+ MD_NTSTATUS_WIN_STATUS_PORT_ALREADY_HAS_COMPLETION_LIST = 0xC000071A,
+ MD_NTSTATUS_WIN_STATUS_CALLBACK_RETURNED_THREAD_PRIORITY = 0xC000071B,
+ MD_NTSTATUS_WIN_STATUS_INVALID_THREAD = 0xC000071C,
+ MD_NTSTATUS_WIN_STATUS_CALLBACK_RETURNED_TRANSACTION = 0xC000071D,
+ MD_NTSTATUS_WIN_STATUS_CALLBACK_RETURNED_LDR_LOCK = 0xC000071E,
+ MD_NTSTATUS_WIN_STATUS_CALLBACK_RETURNED_LANG = 0xC000071F,
+ MD_NTSTATUS_WIN_STATUS_CALLBACK_RETURNED_PRI_BACK = 0xC0000720,
+ MD_NTSTATUS_WIN_STATUS_CALLBACK_RETURNED_THREAD_AFFINITY = 0xC0000721,
+ MD_NTSTATUS_WIN_STATUS_DISK_REPAIR_DISABLED = 0xC0000800,
+ MD_NTSTATUS_WIN_STATUS_DS_DOMAIN_RENAME_IN_PROGRESS = 0xC0000801,
+ MD_NTSTATUS_WIN_STATUS_DISK_QUOTA_EXCEEDED = 0xC0000802,
+ MD_NTSTATUS_WIN_STATUS_CONTENT_BLOCKED = 0xC0000804,
+ MD_NTSTATUS_WIN_STATUS_BAD_CLUSTERS = 0xC0000805,
+ MD_NTSTATUS_WIN_STATUS_VOLUME_DIRTY = 0xC0000806,
+ MD_NTSTATUS_WIN_STATUS_DISK_REPAIR_UNSUCCESSFUL = 0xC0000808,
+ MD_NTSTATUS_WIN_STATUS_CORRUPT_LOG_OVERFULL = 0xC0000809,
+ MD_NTSTATUS_WIN_STATUS_CORRUPT_LOG_CORRUPTED = 0xC000080A,
+ MD_NTSTATUS_WIN_STATUS_CORRUPT_LOG_UNAVAILABLE = 0xC000080B,
+ MD_NTSTATUS_WIN_STATUS_CORRUPT_LOG_DELETED_FULL = 0xC000080C,
+ MD_NTSTATUS_WIN_STATUS_CORRUPT_LOG_CLEARED = 0xC000080D,
+ MD_NTSTATUS_WIN_STATUS_ORPHAN_NAME_EXHAUSTED = 0xC000080E,
+ MD_NTSTATUS_WIN_STATUS_PROACTIVE_SCAN_IN_PROGRESS = 0xC000080F,
+ MD_NTSTATUS_WIN_STATUS_ENCRYPTED_IO_NOT_POSSIBLE = 0xC0000810,
+ MD_NTSTATUS_WIN_STATUS_CORRUPT_LOG_UPLEVEL_RECORDS = 0xC0000811,
+ MD_NTSTATUS_WIN_STATUS_FILE_CHECKED_OUT = 0xC0000901,
+ MD_NTSTATUS_WIN_STATUS_CHECKOUT_REQUIRED = 0xC0000902,
+ MD_NTSTATUS_WIN_STATUS_BAD_FILE_TYPE = 0xC0000903,
+ MD_NTSTATUS_WIN_STATUS_FILE_TOO_LARGE = 0xC0000904,
+ MD_NTSTATUS_WIN_STATUS_FORMS_AUTH_REQUIRED = 0xC0000905,
+ MD_NTSTATUS_WIN_STATUS_VIRUS_INFECTED = 0xC0000906,
+ MD_NTSTATUS_WIN_STATUS_VIRUS_DELETED = 0xC0000907,
+ MD_NTSTATUS_WIN_STATUS_BAD_MCFG_TABLE = 0xC0000908,
+ MD_NTSTATUS_WIN_STATUS_CANNOT_BREAK_OPLOCK = 0xC0000909,
+ MD_NTSTATUS_WIN_STATUS_BAD_KEY = 0xC000090A,
+ MD_NTSTATUS_WIN_STATUS_BAD_DATA = 0xC000090B,
+ MD_NTSTATUS_WIN_STATUS_NO_KEY = 0xC000090C,
+ MD_NTSTATUS_WIN_STATUS_FILE_HANDLE_REVOKED = 0xC0000910,
+ MD_NTSTATUS_WIN_STATUS_WOW_ASSERTION = 0xC0009898,
+ MD_NTSTATUS_WIN_STATUS_INVALID_SIGNATURE = 0xC000A000,
+ MD_NTSTATUS_WIN_STATUS_HMAC_NOT_SUPPORTED = 0xC000A001,
+ MD_NTSTATUS_WIN_STATUS_AUTH_TAG_MISMATCH = 0xC000A002,
+ MD_NTSTATUS_WIN_STATUS_INVALID_STATE_TRANSITION = 0xC000A003,
+ MD_NTSTATUS_WIN_STATUS_INVALID_KERNEL_INFO_VERSION = 0xC000A004,
+ MD_NTSTATUS_WIN_STATUS_INVALID_PEP_INFO_VERSION = 0xC000A005,
+ MD_NTSTATUS_WIN_STATUS_IPSEC_QUEUE_OVERFLOW = 0xC000A010,
+ MD_NTSTATUS_WIN_STATUS_ND_QUEUE_OVERFLOW = 0xC000A011,
+ MD_NTSTATUS_WIN_STATUS_HOPLIMIT_EXCEEDED = 0xC000A012,
+ MD_NTSTATUS_WIN_STATUS_PROTOCOL_NOT_SUPPORTED = 0xC000A013,
+ MD_NTSTATUS_WIN_STATUS_FASTPATH_REJECTED = 0xC000A014,
+ MD_NTSTATUS_WIN_STATUS_LOST_WRITEBEHIND_DATA_NETWORK_DISCONNECTED = 0xC000A080,
+ MD_NTSTATUS_WIN_STATUS_LOST_WRITEBEHIND_DATA_NETWORK_SERVER_ERROR = 0xC000A081,
+ MD_NTSTATUS_WIN_STATUS_LOST_WRITEBEHIND_DATA_LOCAL_DISK_ERROR = 0xC000A082,
+ MD_NTSTATUS_WIN_STATUS_XML_PARSE_ERROR = 0xC000A083,
+ MD_NTSTATUS_WIN_STATUS_XMLDSIG_ERROR = 0xC000A084,
+ MD_NTSTATUS_WIN_STATUS_WRONG_COMPARTMENT = 0xC000A085,
+ MD_NTSTATUS_WIN_STATUS_AUTHIP_FAILURE = 0xC000A086,
+ MD_NTSTATUS_WIN_STATUS_DS_OID_MAPPED_GROUP_CANT_HAVE_MEMBERS = 0xC000A087,
+ MD_NTSTATUS_WIN_STATUS_DS_OID_NOT_FOUND = 0xC000A088,
+ MD_NTSTATUS_WIN_STATUS_INCORRECT_ACCOUNT_TYPE = 0xC000A089,
+ MD_NTSTATUS_WIN_STATUS_HASH_NOT_SUPPORTED = 0xC000A100,
+ MD_NTSTATUS_WIN_STATUS_HASH_NOT_PRESENT = 0xC000A101,
+ MD_NTSTATUS_WIN_STATUS_SECONDARY_IC_PROVIDER_NOT_REGISTERED = 0xC000A121,
+ MD_NTSTATUS_WIN_STATUS_GPIO_CLIENT_INFORMATION_INVALID = 0xC000A122,
+ MD_NTSTATUS_WIN_STATUS_GPIO_VERSION_NOT_SUPPORTED = 0xC000A123,
+ MD_NTSTATUS_WIN_STATUS_GPIO_INVALID_REGISTRATION_PACKET = 0xC000A124,
+ MD_NTSTATUS_WIN_STATUS_GPIO_OPERATION_DENIED = 0xC000A125,
+ MD_NTSTATUS_WIN_STATUS_GPIO_INCOMPATIBLE_CONNECT_MODE = 0xC000A126,
+ MD_NTSTATUS_WIN_STATUS_CANNOT_SWITCH_RUNLEVEL = 0xC000A141,
+ MD_NTSTATUS_WIN_STATUS_INVALID_RUNLEVEL_SETTING = 0xC000A142,
+ MD_NTSTATUS_WIN_STATUS_RUNLEVEL_SWITCH_TIMEOUT = 0xC000A143,
+ MD_NTSTATUS_WIN_STATUS_RUNLEVEL_SWITCH_AGENT_TIMEOUT = 0xC000A145,
+ MD_NTSTATUS_WIN_STATUS_RUNLEVEL_SWITCH_IN_PROGRESS = 0xC000A146,
+ MD_NTSTATUS_WIN_STATUS_NOT_APPCONTAINER = 0xC000A200,
+ MD_NTSTATUS_WIN_STATUS_NOT_SUPPORTED_IN_APPCONTAINER = 0xC000A201,
+ MD_NTSTATUS_WIN_STATUS_INVALID_PACKAGE_SID_LENGTH = 0xC000A202,
+ MD_NTSTATUS_WIN_STATUS_APP_DATA_NOT_FOUND = 0xC000A281,
+ MD_NTSTATUS_WIN_STATUS_APP_DATA_EXPIRED = 0xC000A282,
+ MD_NTSTATUS_WIN_STATUS_APP_DATA_CORRUPT = 0xC000A283,
+ MD_NTSTATUS_WIN_STATUS_APP_DATA_LIMIT_EXCEEDED = 0xC000A284,
+ MD_NTSTATUS_WIN_STATUS_APP_DATA_REBOOT_REQUIRED = 0xC000A285,
+ MD_NTSTATUS_WIN_STATUS_OFFLOAD_READ_FLT_NOT_SUPPORTED = 0xC000A2A1,
+ MD_NTSTATUS_WIN_STATUS_OFFLOAD_WRITE_FLT_NOT_SUPPORTED = 0xC000A2A2,
+ MD_NTSTATUS_WIN_STATUS_OFFLOAD_READ_FILE_NOT_SUPPORTED = 0xC000A2A3,
+ MD_NTSTATUS_WIN_STATUS_OFFLOAD_WRITE_FILE_NOT_SUPPORTED = 0xC000A2A4,
+ MD_NTSTATUS_WIN_DBG_NO_STATE_CHANGE = 0xC0010001,
+ MD_NTSTATUS_WIN_DBG_APP_NOT_IDLE = 0xC0010002,
+ MD_NTSTATUS_WIN_RPC_NT_INVALID_STRING_BINDING = 0xC0020001,
+ MD_NTSTATUS_WIN_RPC_NT_WRONG_KIND_OF_BINDING = 0xC0020002,
+ MD_NTSTATUS_WIN_RPC_NT_INVALID_BINDING = 0xC0020003,
+ MD_NTSTATUS_WIN_RPC_NT_PROTSEQ_NOT_SUPPORTED = 0xC0020004,
+ MD_NTSTATUS_WIN_RPC_NT_INVALID_RPC_PROTSEQ = 0xC0020005,
+ MD_NTSTATUS_WIN_RPC_NT_INVALID_STRING_UUID = 0xC0020006,
+ MD_NTSTATUS_WIN_RPC_NT_INVALID_ENDPOINT_FORMAT = 0xC0020007,
+ MD_NTSTATUS_WIN_RPC_NT_INVALID_NET_ADDR = 0xC0020008,
+ MD_NTSTATUS_WIN_RPC_NT_NO_ENDPOINT_FOUND = 0xC0020009,
+ MD_NTSTATUS_WIN_RPC_NT_INVALID_TIMEOUT = 0xC002000A,
+ MD_NTSTATUS_WIN_RPC_NT_OBJECT_NOT_FOUND = 0xC002000B,
+ MD_NTSTATUS_WIN_RPC_NT_ALREADY_REGISTERED = 0xC002000C,
+ MD_NTSTATUS_WIN_RPC_NT_TYPE_ALREADY_REGISTERED = 0xC002000D,
+ MD_NTSTATUS_WIN_RPC_NT_ALREADY_LISTENING = 0xC002000E,
+ MD_NTSTATUS_WIN_RPC_NT_NO_PROTSEQS_REGISTERED = 0xC002000F,
+ MD_NTSTATUS_WIN_RPC_NT_NOT_LISTENING = 0xC0020010,
+ MD_NTSTATUS_WIN_RPC_NT_UNKNOWN_MGR_TYPE = 0xC0020011,
+ MD_NTSTATUS_WIN_RPC_NT_UNKNOWN_IF = 0xC0020012,
+ MD_NTSTATUS_WIN_RPC_NT_NO_BINDINGS = 0xC0020013,
+ MD_NTSTATUS_WIN_RPC_NT_NO_PROTSEQS = 0xC0020014,
+ MD_NTSTATUS_WIN_RPC_NT_CANT_CREATE_ENDPOINT = 0xC0020015,
+ MD_NTSTATUS_WIN_RPC_NT_OUT_OF_RESOURCES = 0xC0020016,
+ MD_NTSTATUS_WIN_RPC_NT_SERVER_UNAVAILABLE = 0xC0020017,
+ MD_NTSTATUS_WIN_RPC_NT_SERVER_TOO_BUSY = 0xC0020018,
+ MD_NTSTATUS_WIN_RPC_NT_INVALID_NETWORK_OPTIONS = 0xC0020019,
+ MD_NTSTATUS_WIN_RPC_NT_NO_CALL_ACTIVE = 0xC002001A,
+ MD_NTSTATUS_WIN_RPC_NT_CALL_FAILED = 0xC002001B,
+ MD_NTSTATUS_WIN_RPC_NT_CALL_FAILED_DNE = 0xC002001C,
+ MD_NTSTATUS_WIN_RPC_NT_PROTOCOL_ERROR = 0xC002001D,
+ MD_NTSTATUS_WIN_RPC_NT_UNSUPPORTED_TRANS_SYN = 0xC002001F,
+ MD_NTSTATUS_WIN_RPC_NT_UNSUPPORTED_TYPE = 0xC0020021,
+ MD_NTSTATUS_WIN_RPC_NT_INVALID_TAG = 0xC0020022,
+ MD_NTSTATUS_WIN_RPC_NT_INVALID_BOUND = 0xC0020023,
+ MD_NTSTATUS_WIN_RPC_NT_NO_ENTRY_NAME = 0xC0020024,
+ MD_NTSTATUS_WIN_RPC_NT_INVALID_NAME_SYNTAX = 0xC0020025,
+ MD_NTSTATUS_WIN_RPC_NT_UNSUPPORTED_NAME_SYNTAX = 0xC0020026,
+ MD_NTSTATUS_WIN_RPC_NT_UUID_NO_ADDRESS = 0xC0020028,
+ MD_NTSTATUS_WIN_RPC_NT_DUPLICATE_ENDPOINT = 0xC0020029,
+ MD_NTSTATUS_WIN_RPC_NT_UNKNOWN_AUTHN_TYPE = 0xC002002A,
+ MD_NTSTATUS_WIN_RPC_NT_MAX_CALLS_TOO_SMALL = 0xC002002B,
+ MD_NTSTATUS_WIN_RPC_NT_STRING_TOO_LONG = 0xC002002C,
+ MD_NTSTATUS_WIN_RPC_NT_PROTSEQ_NOT_FOUND = 0xC002002D,
+ MD_NTSTATUS_WIN_RPC_NT_PROCNUM_OUT_OF_RANGE = 0xC002002E,
+ MD_NTSTATUS_WIN_RPC_NT_BINDING_HAS_NO_AUTH = 0xC002002F,
+ MD_NTSTATUS_WIN_RPC_NT_UNKNOWN_AUTHN_SERVICE = 0xC0020030,
+ MD_NTSTATUS_WIN_RPC_NT_UNKNOWN_AUTHN_LEVEL = 0xC0020031,
+ MD_NTSTATUS_WIN_RPC_NT_INVALID_AUTH_IDENTITY = 0xC0020032,
+ MD_NTSTATUS_WIN_RPC_NT_UNKNOWN_AUTHZ_SERVICE = 0xC0020033,
+ MD_NTSTATUS_WIN_EPT_NT_INVALID_ENTRY = 0xC0020034,
+ MD_NTSTATUS_WIN_EPT_NT_CANT_PERFORM_OP = 0xC0020035,
+ MD_NTSTATUS_WIN_EPT_NT_NOT_REGISTERED = 0xC0020036,
+ MD_NTSTATUS_WIN_RPC_NT_NOTHING_TO_EXPORT = 0xC0020037,
+ MD_NTSTATUS_WIN_RPC_NT_INCOMPLETE_NAME = 0xC0020038,
+ MD_NTSTATUS_WIN_RPC_NT_INVALID_VERS_OPTION = 0xC0020039,
+ MD_NTSTATUS_WIN_RPC_NT_NO_MORE_MEMBERS = 0xC002003A,
+ MD_NTSTATUS_WIN_RPC_NT_NOT_ALL_OBJS_UNEXPORTED = 0xC002003B,
+ MD_NTSTATUS_WIN_RPC_NT_INTERFACE_NOT_FOUND = 0xC002003C,
+ MD_NTSTATUS_WIN_RPC_NT_ENTRY_ALREADY_EXISTS = 0xC002003D,
+ MD_NTSTATUS_WIN_RPC_NT_ENTRY_NOT_FOUND = 0xC002003E,
+ MD_NTSTATUS_WIN_RPC_NT_NAME_SERVICE_UNAVAILABLE = 0xC002003F,
+ MD_NTSTATUS_WIN_RPC_NT_INVALID_NAF_ID = 0xC0020040,
+ MD_NTSTATUS_WIN_RPC_NT_CANNOT_SUPPORT = 0xC0020041,
+ MD_NTSTATUS_WIN_RPC_NT_NO_CONTEXT_AVAILABLE = 0xC0020042,
+ MD_NTSTATUS_WIN_RPC_NT_INTERNAL_ERROR = 0xC0020043,
+ MD_NTSTATUS_WIN_RPC_NT_ZERO_DIVIDE = 0xC0020044,
+ MD_NTSTATUS_WIN_RPC_NT_ADDRESS_ERROR = 0xC0020045,
+ MD_NTSTATUS_WIN_RPC_NT_FP_DIV_ZERO = 0xC0020046,
+ MD_NTSTATUS_WIN_RPC_NT_FP_UNDERFLOW = 0xC0020047,
+ MD_NTSTATUS_WIN_RPC_NT_FP_OVERFLOW = 0xC0020048,
+ MD_NTSTATUS_WIN_RPC_NT_CALL_IN_PROGRESS = 0xC0020049,
+ MD_NTSTATUS_WIN_RPC_NT_NO_MORE_BINDINGS = 0xC002004A,
+ MD_NTSTATUS_WIN_RPC_NT_GROUP_MEMBER_NOT_FOUND = 0xC002004B,
+ MD_NTSTATUS_WIN_EPT_NT_CANT_CREATE = 0xC002004C,
+ MD_NTSTATUS_WIN_RPC_NT_INVALID_OBJECT = 0xC002004D,
+ MD_NTSTATUS_WIN_RPC_NT_NO_INTERFACES = 0xC002004F,
+ MD_NTSTATUS_WIN_RPC_NT_CALL_CANCELLED = 0xC0020050,
+ MD_NTSTATUS_WIN_RPC_NT_BINDING_INCOMPLETE = 0xC0020051,
+ MD_NTSTATUS_WIN_RPC_NT_COMM_FAILURE = 0xC0020052,
+ MD_NTSTATUS_WIN_RPC_NT_UNSUPPORTED_AUTHN_LEVEL = 0xC0020053,
+ MD_NTSTATUS_WIN_RPC_NT_NO_PRINC_NAME = 0xC0020054,
+ MD_NTSTATUS_WIN_RPC_NT_NOT_RPC_ERROR = 0xC0020055,
+ MD_NTSTATUS_WIN_RPC_NT_SEC_PKG_ERROR = 0xC0020057,
+ MD_NTSTATUS_WIN_RPC_NT_NOT_CANCELLED = 0xC0020058,
+ MD_NTSTATUS_WIN_RPC_NT_INVALID_ASYNC_HANDLE = 0xC0020062,
+ MD_NTSTATUS_WIN_RPC_NT_INVALID_ASYNC_CALL = 0xC0020063,
+ MD_NTSTATUS_WIN_RPC_NT_PROXY_ACCESS_DENIED = 0xC0020064,
+ MD_NTSTATUS_WIN_RPC_NT_COOKIE_AUTH_FAILED = 0xC0020065,
+ MD_NTSTATUS_WIN_RPC_NT_NO_MORE_ENTRIES = 0xC0030001,
+ MD_NTSTATUS_WIN_RPC_NT_SS_CHAR_TRANS_OPEN_FAIL = 0xC0030002,
+ MD_NTSTATUS_WIN_RPC_NT_SS_CHAR_TRANS_SHORT_FILE = 0xC0030003,
+ MD_NTSTATUS_WIN_RPC_NT_SS_IN_NULL_CONTEXT = 0xC0030004,
+ MD_NTSTATUS_WIN_RPC_NT_SS_CONTEXT_MISMATCH = 0xC0030005,
+ MD_NTSTATUS_WIN_RPC_NT_SS_CONTEXT_DAMAGED = 0xC0030006,
+ MD_NTSTATUS_WIN_RPC_NT_SS_HANDLES_MISMATCH = 0xC0030007,
+ MD_NTSTATUS_WIN_RPC_NT_SS_CANNOT_GET_CALL_HANDLE = 0xC0030008,
+ MD_NTSTATUS_WIN_RPC_NT_NULL_REF_POINTER = 0xC0030009,
+ MD_NTSTATUS_WIN_RPC_NT_ENUM_VALUE_OUT_OF_RANGE = 0xC003000A,
+ MD_NTSTATUS_WIN_RPC_NT_BYTE_COUNT_TOO_SMALL = 0xC003000B,
+ MD_NTSTATUS_WIN_RPC_NT_BAD_STUB_DATA = 0xC003000C,
+ MD_NTSTATUS_WIN_RPC_NT_INVALID_ES_ACTION = 0xC0030059,
+ MD_NTSTATUS_WIN_RPC_NT_WRONG_ES_VERSION = 0xC003005A,
+ MD_NTSTATUS_WIN_RPC_NT_WRONG_STUB_VERSION = 0xC003005B,
+ MD_NTSTATUS_WIN_RPC_NT_INVALID_PIPE_OBJECT = 0xC003005C,
+ MD_NTSTATUS_WIN_RPC_NT_INVALID_PIPE_OPERATION = 0xC003005D,
+ MD_NTSTATUS_WIN_RPC_NT_WRONG_PIPE_VERSION = 0xC003005E,
+ MD_NTSTATUS_WIN_RPC_NT_PIPE_CLOSED = 0xC003005F,
+ MD_NTSTATUS_WIN_RPC_NT_PIPE_DISCIPLINE_ERROR = 0xC0030060,
+ MD_NTSTATUS_WIN_RPC_NT_PIPE_EMPTY = 0xC0030061,
+ MD_NTSTATUS_WIN_STATUS_PNP_BAD_MPS_TABLE = 0xC0040035,
+ MD_NTSTATUS_WIN_STATUS_PNP_TRANSLATION_FAILED = 0xC0040036,
+ MD_NTSTATUS_WIN_STATUS_PNP_IRQ_TRANSLATION_FAILED = 0xC0040037,
+ MD_NTSTATUS_WIN_STATUS_PNP_INVALID_ID = 0xC0040038,
+ MD_NTSTATUS_WIN_STATUS_IO_REISSUE_AS_CACHED = 0xC0040039,
+ MD_NTSTATUS_WIN_STATUS_CTX_WINSTATION_NAME_INVALID = 0xC00A0001,
+ MD_NTSTATUS_WIN_STATUS_CTX_INVALID_PD = 0xC00A0002,
+ MD_NTSTATUS_WIN_STATUS_CTX_PD_NOT_FOUND = 0xC00A0003,
+ MD_NTSTATUS_WIN_STATUS_CTX_CLOSE_PENDING = 0xC00A0006,
+ MD_NTSTATUS_WIN_STATUS_CTX_NO_OUTBUF = 0xC00A0007,
+ MD_NTSTATUS_WIN_STATUS_CTX_MODEM_INF_NOT_FOUND = 0xC00A0008,
+ MD_NTSTATUS_WIN_STATUS_CTX_INVALID_MODEMNAME = 0xC00A0009,
+ MD_NTSTATUS_WIN_STATUS_CTX_RESPONSE_ERROR = 0xC00A000A,
+ MD_NTSTATUS_WIN_STATUS_CTX_MODEM_RESPONSE_TIMEOUT = 0xC00A000B,
+ MD_NTSTATUS_WIN_STATUS_CTX_MODEM_RESPONSE_NO_CARRIER = 0xC00A000C,
+ MD_NTSTATUS_WIN_STATUS_CTX_MODEM_RESPONSE_NO_DIALTONE = 0xC00A000D,
+ MD_NTSTATUS_WIN_STATUS_CTX_MODEM_RESPONSE_BUSY = 0xC00A000E,
+ MD_NTSTATUS_WIN_STATUS_CTX_MODEM_RESPONSE_VOICE = 0xC00A000F,
+ MD_NTSTATUS_WIN_STATUS_CTX_TD_ERROR = 0xC00A0010,
+ MD_NTSTATUS_WIN_STATUS_CTX_LICENSE_CLIENT_INVALID = 0xC00A0012,
+ MD_NTSTATUS_WIN_STATUS_CTX_LICENSE_NOT_AVAILABLE = 0xC00A0013,
+ MD_NTSTATUS_WIN_STATUS_CTX_LICENSE_EXPIRED = 0xC00A0014,
+ MD_NTSTATUS_WIN_STATUS_CTX_WINSTATION_NOT_FOUND = 0xC00A0015,
+ MD_NTSTATUS_WIN_STATUS_CTX_WINSTATION_NAME_COLLISION = 0xC00A0016,
+ MD_NTSTATUS_WIN_STATUS_CTX_WINSTATION_BUSY = 0xC00A0017,
+ MD_NTSTATUS_WIN_STATUS_CTX_BAD_VIDEO_MODE = 0xC00A0018,
+ MD_NTSTATUS_WIN_STATUS_CTX_GRAPHICS_INVALID = 0xC00A0022,
+ MD_NTSTATUS_WIN_STATUS_CTX_NOT_CONSOLE = 0xC00A0024,
+ MD_NTSTATUS_WIN_STATUS_CTX_CLIENT_QUERY_TIMEOUT = 0xC00A0026,
+ MD_NTSTATUS_WIN_STATUS_CTX_CONSOLE_DISCONNECT = 0xC00A0027,
+ MD_NTSTATUS_WIN_STATUS_CTX_CONSOLE_CONNECT = 0xC00A0028,
+ MD_NTSTATUS_WIN_STATUS_CTX_SHADOW_DENIED = 0xC00A002A,
+ MD_NTSTATUS_WIN_STATUS_CTX_WINSTATION_ACCESS_DENIED = 0xC00A002B,
+ MD_NTSTATUS_WIN_STATUS_CTX_INVALID_WD = 0xC00A002E,
+ MD_NTSTATUS_WIN_STATUS_CTX_WD_NOT_FOUND = 0xC00A002F,
+ MD_NTSTATUS_WIN_STATUS_CTX_SHADOW_INVALID = 0xC00A0030,
+ MD_NTSTATUS_WIN_STATUS_CTX_SHADOW_DISABLED = 0xC00A0031,
+ MD_NTSTATUS_WIN_STATUS_RDP_PROTOCOL_ERROR = 0xC00A0032,
+ MD_NTSTATUS_WIN_STATUS_CTX_CLIENT_LICENSE_NOT_SET = 0xC00A0033,
+ MD_NTSTATUS_WIN_STATUS_CTX_CLIENT_LICENSE_IN_USE = 0xC00A0034,
+ MD_NTSTATUS_WIN_STATUS_CTX_SHADOW_ENDED_BY_MODE_CHANGE = 0xC00A0035,
+ MD_NTSTATUS_WIN_STATUS_CTX_SHADOW_NOT_RUNNING = 0xC00A0036,
+ MD_NTSTATUS_WIN_STATUS_CTX_LOGON_DISABLED = 0xC00A0037,
+ MD_NTSTATUS_WIN_STATUS_CTX_SECURITY_LAYER_ERROR = 0xC00A0038,
+ MD_NTSTATUS_WIN_STATUS_TS_INCOMPATIBLE_SESSIONS = 0xC00A0039,
+ MD_NTSTATUS_WIN_STATUS_TS_VIDEO_SUBSYSTEM_ERROR = 0xC00A003A,
+ MD_NTSTATUS_WIN_STATUS_MUI_FILE_NOT_FOUND = 0xC00B0001,
+ MD_NTSTATUS_WIN_STATUS_MUI_INVALID_FILE = 0xC00B0002,
+ MD_NTSTATUS_WIN_STATUS_MUI_INVALID_RC_CONFIG = 0xC00B0003,
+ MD_NTSTATUS_WIN_STATUS_MUI_INVALID_LOCALE_NAME = 0xC00B0004,
+ MD_NTSTATUS_WIN_STATUS_MUI_INVALID_ULTIMATEFALLBACK_NAME = 0xC00B0005,
+ MD_NTSTATUS_WIN_STATUS_MUI_FILE_NOT_LOADED = 0xC00B0006,
+ MD_NTSTATUS_WIN_STATUS_RESOURCE_ENUM_USER_STOP = 0xC00B0007,
+ MD_NTSTATUS_WIN_STATUS_CLUSTER_INVALID_NODE = 0xC0130001,
+ MD_NTSTATUS_WIN_STATUS_CLUSTER_NODE_EXISTS = 0xC0130002,
+ MD_NTSTATUS_WIN_STATUS_CLUSTER_JOIN_IN_PROGRESS = 0xC0130003,
+ MD_NTSTATUS_WIN_STATUS_CLUSTER_NODE_NOT_FOUND = 0xC0130004,
+ MD_NTSTATUS_WIN_STATUS_CLUSTER_LOCAL_NODE_NOT_FOUND = 0xC0130005,
+ MD_NTSTATUS_WIN_STATUS_CLUSTER_NETWORK_EXISTS = 0xC0130006,
+ MD_NTSTATUS_WIN_STATUS_CLUSTER_NETWORK_NOT_FOUND = 0xC0130007,
+ MD_NTSTATUS_WIN_STATUS_CLUSTER_NETINTERFACE_EXISTS = 0xC0130008,
+ MD_NTSTATUS_WIN_STATUS_CLUSTER_NETINTERFACE_NOT_FOUND = 0xC0130009,
+ MD_NTSTATUS_WIN_STATUS_CLUSTER_INVALID_REQUEST = 0xC013000A,
+ MD_NTSTATUS_WIN_STATUS_CLUSTER_INVALID_NETWORK_PROVIDER = 0xC013000B,
+ MD_NTSTATUS_WIN_STATUS_CLUSTER_NODE_DOWN = 0xC013000C,
+ MD_NTSTATUS_WIN_STATUS_CLUSTER_NODE_UNREACHABLE = 0xC013000D,
+ MD_NTSTATUS_WIN_STATUS_CLUSTER_NODE_NOT_MEMBER = 0xC013000E,
+ MD_NTSTATUS_WIN_STATUS_CLUSTER_JOIN_NOT_IN_PROGRESS = 0xC013000F,
+ MD_NTSTATUS_WIN_STATUS_CLUSTER_INVALID_NETWORK = 0xC0130010,
+ MD_NTSTATUS_WIN_STATUS_CLUSTER_NO_NET_ADAPTERS = 0xC0130011,
+ MD_NTSTATUS_WIN_STATUS_CLUSTER_NODE_UP = 0xC0130012,
+ MD_NTSTATUS_WIN_STATUS_CLUSTER_NODE_PAUSED = 0xC0130013,
+ MD_NTSTATUS_WIN_STATUS_CLUSTER_NODE_NOT_PAUSED = 0xC0130014,
+ MD_NTSTATUS_WIN_STATUS_CLUSTER_NO_SECURITY_CONTEXT = 0xC0130015,
+ MD_NTSTATUS_WIN_STATUS_CLUSTER_NETWORK_NOT_INTERNAL = 0xC0130016,
+ MD_NTSTATUS_WIN_STATUS_CLUSTER_POISONED = 0xC0130017,
+ MD_NTSTATUS_WIN_STATUS_CLUSTER_NON_CSV_PATH = 0xC0130018,
+ MD_NTSTATUS_WIN_STATUS_CLUSTER_CSV_VOLUME_NOT_LOCAL = 0xC0130019,
+ MD_NTSTATUS_WIN_STATUS_CLUSTER_CSV_READ_OPLOCK_BREAK_IN_PROGRESS = 0xC0130020,
+ MD_NTSTATUS_WIN_STATUS_CLUSTER_CSV_AUTO_PAUSE_ERROR = 0xC0130021,
+ MD_NTSTATUS_WIN_STATUS_CLUSTER_CSV_REDIRECTED = 0xC0130022,
+ MD_NTSTATUS_WIN_STATUS_CLUSTER_CSV_NOT_REDIRECTED = 0xC0130023,
+ MD_NTSTATUS_WIN_STATUS_CLUSTER_CSV_VOLUME_DRAINING = 0xC0130024,
+ MD_NTSTATUS_WIN_STATUS_CLUSTER_CSV_SNAPSHOT_CREATION_IN_PROGRESS = 0xC0130025,
+ MD_NTSTATUS_WIN_STATUS_CLUSTER_CSV_VOLUME_DRAINING_SUCCEEDED_DOWNLEVEL = 0xC0130026,
+ MD_NTSTATUS_WIN_STATUS_ACPI_INVALID_OPCODE = 0xC0140001,
+ MD_NTSTATUS_WIN_STATUS_ACPI_STACK_OVERFLOW = 0xC0140002,
+ MD_NTSTATUS_WIN_STATUS_ACPI_ASSERT_FAILED = 0xC0140003,
+ MD_NTSTATUS_WIN_STATUS_ACPI_INVALID_INDEX = 0xC0140004,
+ MD_NTSTATUS_WIN_STATUS_ACPI_INVALID_ARGUMENT = 0xC0140005,
+ MD_NTSTATUS_WIN_STATUS_ACPI_FATAL = 0xC0140006,
+ MD_NTSTATUS_WIN_STATUS_ACPI_INVALID_SUPERNAME = 0xC0140007,
+ MD_NTSTATUS_WIN_STATUS_ACPI_INVALID_ARGTYPE = 0xC0140008,
+ MD_NTSTATUS_WIN_STATUS_ACPI_INVALID_OBJTYPE = 0xC0140009,
+ MD_NTSTATUS_WIN_STATUS_ACPI_INVALID_TARGETTYPE = 0xC014000A,
+ MD_NTSTATUS_WIN_STATUS_ACPI_INCORRECT_ARGUMENT_COUNT = 0xC014000B,
+ MD_NTSTATUS_WIN_STATUS_ACPI_ADDRESS_NOT_MAPPED = 0xC014000C,
+ MD_NTSTATUS_WIN_STATUS_ACPI_INVALID_EVENTTYPE = 0xC014000D,
+ MD_NTSTATUS_WIN_STATUS_ACPI_HANDLER_COLLISION = 0xC014000E,
+ MD_NTSTATUS_WIN_STATUS_ACPI_INVALID_DATA = 0xC014000F,
+ MD_NTSTATUS_WIN_STATUS_ACPI_INVALID_REGION = 0xC0140010,
+ MD_NTSTATUS_WIN_STATUS_ACPI_INVALID_ACCESS_SIZE = 0xC0140011,
+ MD_NTSTATUS_WIN_STATUS_ACPI_ACQUIRE_GLOBAL_LOCK = 0xC0140012,
+ MD_NTSTATUS_WIN_STATUS_ACPI_ALREADY_INITIALIZED = 0xC0140013,
+ MD_NTSTATUS_WIN_STATUS_ACPI_NOT_INITIALIZED = 0xC0140014,
+ MD_NTSTATUS_WIN_STATUS_ACPI_INVALID_MUTEX_LEVEL = 0xC0140015,
+ MD_NTSTATUS_WIN_STATUS_ACPI_MUTEX_NOT_OWNED = 0xC0140016,
+ MD_NTSTATUS_WIN_STATUS_ACPI_MUTEX_NOT_OWNER = 0xC0140017,
+ MD_NTSTATUS_WIN_STATUS_ACPI_RS_ACCESS = 0xC0140018,
+ MD_NTSTATUS_WIN_STATUS_ACPI_INVALID_TABLE = 0xC0140019,
+ MD_NTSTATUS_WIN_STATUS_ACPI_REG_HANDLER_FAILED = 0xC0140020,
+ MD_NTSTATUS_WIN_STATUS_ACPI_POWER_REQUEST_FAILED = 0xC0140021,
+ MD_NTSTATUS_WIN_STATUS_SXS_SECTION_NOT_FOUND = 0xC0150001,
+ MD_NTSTATUS_WIN_STATUS_SXS_CANT_GEN_ACTCTX = 0xC0150002,
+ MD_NTSTATUS_WIN_STATUS_SXS_INVALID_ACTCTXDATA_FORMAT = 0xC0150003,
+ MD_NTSTATUS_WIN_STATUS_SXS_ASSEMBLY_NOT_FOUND = 0xC0150004,
+ MD_NTSTATUS_WIN_STATUS_SXS_MANIFEST_FORMAT_ERROR = 0xC0150005,
+ MD_NTSTATUS_WIN_STATUS_SXS_MANIFEST_PARSE_ERROR = 0xC0150006,
+ MD_NTSTATUS_WIN_STATUS_SXS_ACTIVATION_CONTEXT_DISABLED = 0xC0150007,
+ MD_NTSTATUS_WIN_STATUS_SXS_KEY_NOT_FOUND = 0xC0150008,
+ MD_NTSTATUS_WIN_STATUS_SXS_VERSION_CONFLICT = 0xC0150009,
+ MD_NTSTATUS_WIN_STATUS_SXS_WRONG_SECTION_TYPE = 0xC015000A,
+ MD_NTSTATUS_WIN_STATUS_SXS_THREAD_QUERIES_DISABLED = 0xC015000B,
+ MD_NTSTATUS_WIN_STATUS_SXS_ASSEMBLY_MISSING = 0xC015000C,
+ MD_NTSTATUS_WIN_STATUS_SXS_PROCESS_DEFAULT_ALREADY_SET = 0xC015000E,
+ MD_NTSTATUS_WIN_STATUS_SXS_EARLY_DEACTIVATION = 0xC015000F,
+ MD_NTSTATUS_WIN_STATUS_SXS_INVALID_DEACTIVATION = 0xC0150010,
+ MD_NTSTATUS_WIN_STATUS_SXS_MULTIPLE_DEACTIVATION = 0xC0150011,
+ MD_NTSTATUS_WIN_STATUS_SXS_SYSTEM_DEFAULT_ACTIVATION_CONTEXT_EMPTY = 0xC0150012,
+ MD_NTSTATUS_WIN_STATUS_SXS_PROCESS_TERMINATION_REQUESTED = 0xC0150013,
+ MD_NTSTATUS_WIN_STATUS_SXS_CORRUPT_ACTIVATION_STACK = 0xC0150014,
+ MD_NTSTATUS_WIN_STATUS_SXS_CORRUPTION = 0xC0150015,
+ MD_NTSTATUS_WIN_STATUS_SXS_INVALID_IDENTITY_ATTRIBUTE_VALUE = 0xC0150016,
+ MD_NTSTATUS_WIN_STATUS_SXS_INVALID_IDENTITY_ATTRIBUTE_NAME = 0xC0150017,
+ MD_NTSTATUS_WIN_STATUS_SXS_IDENTITY_DUPLICATE_ATTRIBUTE = 0xC0150018,
+ MD_NTSTATUS_WIN_STATUS_SXS_IDENTITY_PARSE_ERROR = 0xC0150019,
+ MD_NTSTATUS_WIN_STATUS_SXS_COMPONENT_STORE_CORRUPT = 0xC015001A,
+ MD_NTSTATUS_WIN_STATUS_SXS_FILE_HASH_MISMATCH = 0xC015001B,
+ MD_NTSTATUS_WIN_STATUS_SXS_MANIFEST_IDENTITY_SAME_BUT_CONTENTS_DIFFERENT = 0xC015001C,
+ MD_NTSTATUS_WIN_STATUS_SXS_IDENTITIES_DIFFERENT = 0xC015001D,
+ MD_NTSTATUS_WIN_STATUS_SXS_ASSEMBLY_IS_NOT_A_DEPLOYMENT = 0xC015001E,
+ MD_NTSTATUS_WIN_STATUS_SXS_FILE_NOT_PART_OF_ASSEMBLY = 0xC015001F,
+ MD_NTSTATUS_WIN_STATUS_ADVANCED_INSTALLER_FAILED = 0xC0150020,
+ MD_NTSTATUS_WIN_STATUS_XML_ENCODING_MISMATCH = 0xC0150021,
+ MD_NTSTATUS_WIN_STATUS_SXS_MANIFEST_TOO_BIG = 0xC0150022,
+ MD_NTSTATUS_WIN_STATUS_SXS_SETTING_NOT_REGISTERED = 0xC0150023,
+ MD_NTSTATUS_WIN_STATUS_SXS_TRANSACTION_CLOSURE_INCOMPLETE = 0xC0150024,
+ MD_NTSTATUS_WIN_STATUS_SMI_PRIMITIVE_INSTALLER_FAILED = 0xC0150025,
+ MD_NTSTATUS_WIN_STATUS_GENERIC_COMMAND_FAILED = 0xC0150026,
+ MD_NTSTATUS_WIN_STATUS_SXS_FILE_HASH_MISSING = 0xC0150027,
+ MD_NTSTATUS_WIN_STATUS_TRANSACTIONAL_CONFLICT = 0xC0190001,
+ MD_NTSTATUS_WIN_STATUS_INVALID_TRANSACTION = 0xC0190002,
+ MD_NTSTATUS_WIN_STATUS_TRANSACTION_NOT_ACTIVE = 0xC0190003,
+ MD_NTSTATUS_WIN_STATUS_TM_INITIALIZATION_FAILED = 0xC0190004,
+ MD_NTSTATUS_WIN_STATUS_RM_NOT_ACTIVE = 0xC0190005,
+ MD_NTSTATUS_WIN_STATUS_RM_METADATA_CORRUPT = 0xC0190006,
+ MD_NTSTATUS_WIN_STATUS_TRANSACTION_NOT_JOINED = 0xC0190007,
+ MD_NTSTATUS_WIN_STATUS_DIRECTORY_NOT_RM = 0xC0190008,
+ MD_NTSTATUS_WIN_STATUS_TRANSACTIONS_UNSUPPORTED_REMOTE = 0xC019000A,
+ MD_NTSTATUS_WIN_STATUS_LOG_RESIZE_INVALID_SIZE = 0xC019000B,
+ MD_NTSTATUS_WIN_STATUS_REMOTE_FILE_VERSION_MISMATCH = 0xC019000C,
+ MD_NTSTATUS_WIN_STATUS_CRM_PROTOCOL_ALREADY_EXISTS = 0xC019000F,
+ MD_NTSTATUS_WIN_STATUS_TRANSACTION_PROPAGATION_FAILED = 0xC0190010,
+ MD_NTSTATUS_WIN_STATUS_CRM_PROTOCOL_NOT_FOUND = 0xC0190011,
+ MD_NTSTATUS_WIN_STATUS_TRANSACTION_SUPERIOR_EXISTS = 0xC0190012,
+ MD_NTSTATUS_WIN_STATUS_TRANSACTION_REQUEST_NOT_VALID = 0xC0190013,
+ MD_NTSTATUS_WIN_STATUS_TRANSACTION_NOT_REQUESTED = 0xC0190014,
+ MD_NTSTATUS_WIN_STATUS_TRANSACTION_ALREADY_ABORTED = 0xC0190015,
+ MD_NTSTATUS_WIN_STATUS_TRANSACTION_ALREADY_COMMITTED = 0xC0190016,
+ MD_NTSTATUS_WIN_STATUS_TRANSACTION_INVALID_MARSHALL_BUFFER = 0xC0190017,
+ MD_NTSTATUS_WIN_STATUS_CURRENT_TRANSACTION_NOT_VALID = 0xC0190018,
+ MD_NTSTATUS_WIN_STATUS_LOG_GROWTH_FAILED = 0xC0190019,
+ MD_NTSTATUS_WIN_STATUS_OBJECT_NO_LONGER_EXISTS = 0xC0190021,
+ MD_NTSTATUS_WIN_STATUS_STREAM_MINIVERSION_NOT_FOUND = 0xC0190022,
+ MD_NTSTATUS_WIN_STATUS_STREAM_MINIVERSION_NOT_VALID = 0xC0190023,
+ MD_NTSTATUS_WIN_STATUS_MINIVERSION_INACCESSIBLE_FROM_SPECIFIED_TRANSACTION = 0xC0190024,
+ MD_NTSTATUS_WIN_STATUS_CANT_OPEN_MINIVERSION_WITH_MODIFY_INTENT = 0xC0190025,
+ MD_NTSTATUS_WIN_STATUS_CANT_CREATE_MORE_STREAM_MINIVERSIONS = 0xC0190026,
+ MD_NTSTATUS_WIN_STATUS_HANDLE_NO_LONGER_VALID = 0xC0190028,
+ MD_NTSTATUS_WIN_STATUS_LOG_CORRUPTION_DETECTED = 0xC0190030,
+ MD_NTSTATUS_WIN_STATUS_RM_DISCONNECTED = 0xC0190032,
+ MD_NTSTATUS_WIN_STATUS_ENLISTMENT_NOT_SUPERIOR = 0xC0190033,
+ MD_NTSTATUS_WIN_STATUS_FILE_IDENTITY_NOT_PERSISTENT = 0xC0190036,
+ MD_NTSTATUS_WIN_STATUS_CANT_BREAK_TRANSACTIONAL_DEPENDENCY = 0xC0190037,
+ MD_NTSTATUS_WIN_STATUS_CANT_CROSS_RM_BOUNDARY = 0xC0190038,
+ MD_NTSTATUS_WIN_STATUS_TXF_DIR_NOT_EMPTY = 0xC0190039,
+ MD_NTSTATUS_WIN_STATUS_INDOUBT_TRANSACTIONS_EXIST = 0xC019003A,
+ MD_NTSTATUS_WIN_STATUS_TM_VOLATILE = 0xC019003B,
+ MD_NTSTATUS_WIN_STATUS_ROLLBACK_TIMER_EXPIRED = 0xC019003C,
+ MD_NTSTATUS_WIN_STATUS_TXF_ATTRIBUTE_CORRUPT = 0xC019003D,
+ MD_NTSTATUS_WIN_STATUS_EFS_NOT_ALLOWED_IN_TRANSACTION = 0xC019003E,
+ MD_NTSTATUS_WIN_STATUS_TRANSACTIONAL_OPEN_NOT_ALLOWED = 0xC019003F,
+ MD_NTSTATUS_WIN_STATUS_TRANSACTED_MAPPING_UNSUPPORTED_REMOTE = 0xC0190040,
+ MD_NTSTATUS_WIN_STATUS_TRANSACTION_REQUIRED_PROMOTION = 0xC0190043,
+ MD_NTSTATUS_WIN_STATUS_CANNOT_EXECUTE_FILE_IN_TRANSACTION = 0xC0190044,
+ MD_NTSTATUS_WIN_STATUS_TRANSACTIONS_NOT_FROZEN = 0xC0190045,
+ MD_NTSTATUS_WIN_STATUS_TRANSACTION_FREEZE_IN_PROGRESS = 0xC0190046,
+ MD_NTSTATUS_WIN_STATUS_NOT_SNAPSHOT_VOLUME = 0xC0190047,
+ MD_NTSTATUS_WIN_STATUS_NO_SAVEPOINT_WITH_OPEN_FILES = 0xC0190048,
+ MD_NTSTATUS_WIN_STATUS_SPARSE_NOT_ALLOWED_IN_TRANSACTION = 0xC0190049,
+ MD_NTSTATUS_WIN_STATUS_TM_IDENTITY_MISMATCH = 0xC019004A,
+ MD_NTSTATUS_WIN_STATUS_FLOATED_SECTION = 0xC019004B,
+ MD_NTSTATUS_WIN_STATUS_CANNOT_ACCEPT_TRANSACTED_WORK = 0xC019004C,
+ MD_NTSTATUS_WIN_STATUS_CANNOT_ABORT_TRANSACTIONS = 0xC019004D,
+ MD_NTSTATUS_WIN_STATUS_TRANSACTION_NOT_FOUND = 0xC019004E,
+ MD_NTSTATUS_WIN_STATUS_RESOURCEMANAGER_NOT_FOUND = 0xC019004F,
+ MD_NTSTATUS_WIN_STATUS_ENLISTMENT_NOT_FOUND = 0xC0190050,
+ MD_NTSTATUS_WIN_STATUS_TRANSACTIONMANAGER_NOT_FOUND = 0xC0190051,
+ MD_NTSTATUS_WIN_STATUS_TRANSACTIONMANAGER_NOT_ONLINE = 0xC0190052,
+ MD_NTSTATUS_WIN_STATUS_TRANSACTIONMANAGER_RECOVERY_NAME_COLLISION = 0xC0190053,
+ MD_NTSTATUS_WIN_STATUS_TRANSACTION_NOT_ROOT = 0xC0190054,
+ MD_NTSTATUS_WIN_STATUS_TRANSACTION_OBJECT_EXPIRED = 0xC0190055,
+ MD_NTSTATUS_WIN_STATUS_COMPRESSION_NOT_ALLOWED_IN_TRANSACTION = 0xC0190056,
+ MD_NTSTATUS_WIN_STATUS_TRANSACTION_RESPONSE_NOT_ENLISTED = 0xC0190057,
+ MD_NTSTATUS_WIN_STATUS_TRANSACTION_RECORD_TOO_LONG = 0xC0190058,
+ MD_NTSTATUS_WIN_STATUS_NO_LINK_TRACKING_IN_TRANSACTION = 0xC0190059,
+ MD_NTSTATUS_WIN_STATUS_OPERATION_NOT_SUPPORTED_IN_TRANSACTION = 0xC019005A,
+ MD_NTSTATUS_WIN_STATUS_TRANSACTION_INTEGRITY_VIOLATED = 0xC019005B,
+ MD_NTSTATUS_WIN_STATUS_TRANSACTIONMANAGER_IDENTITY_MISMATCH = 0xC019005C,
+ MD_NTSTATUS_WIN_STATUS_RM_CANNOT_BE_FROZEN_FOR_SNAPSHOT = 0xC019005D,
+ MD_NTSTATUS_WIN_STATUS_TRANSACTION_MUST_WRITETHROUGH = 0xC019005E,
+ MD_NTSTATUS_WIN_STATUS_TRANSACTION_NO_SUPERIOR = 0xC019005F,
+ MD_NTSTATUS_WIN_STATUS_EXPIRED_HANDLE = 0xC0190060,
+ MD_NTSTATUS_WIN_STATUS_TRANSACTION_NOT_ENLISTED = 0xC0190061,
+ MD_NTSTATUS_WIN_STATUS_LOG_SECTOR_INVALID = 0xC01A0001,
+ MD_NTSTATUS_WIN_STATUS_LOG_SECTOR_PARITY_INVALID = 0xC01A0002,
+ MD_NTSTATUS_WIN_STATUS_LOG_SECTOR_REMAPPED = 0xC01A0003,
+ MD_NTSTATUS_WIN_STATUS_LOG_BLOCK_INCOMPLETE = 0xC01A0004,
+ MD_NTSTATUS_WIN_STATUS_LOG_INVALID_RANGE = 0xC01A0005,
+ MD_NTSTATUS_WIN_STATUS_LOG_BLOCKS_EXHAUSTED = 0xC01A0006,
+ MD_NTSTATUS_WIN_STATUS_LOG_READ_CONTEXT_INVALID = 0xC01A0007,
+ MD_NTSTATUS_WIN_STATUS_LOG_RESTART_INVALID = 0xC01A0008,
+ MD_NTSTATUS_WIN_STATUS_LOG_BLOCK_VERSION = 0xC01A0009,
+ MD_NTSTATUS_WIN_STATUS_LOG_BLOCK_INVALID = 0xC01A000A,
+ MD_NTSTATUS_WIN_STATUS_LOG_READ_MODE_INVALID = 0xC01A000B,
+ MD_NTSTATUS_WIN_STATUS_LOG_METADATA_CORRUPT = 0xC01A000D,
+ MD_NTSTATUS_WIN_STATUS_LOG_METADATA_INVALID = 0xC01A000E,
+ MD_NTSTATUS_WIN_STATUS_LOG_METADATA_INCONSISTENT = 0xC01A000F,
+ MD_NTSTATUS_WIN_STATUS_LOG_RESERVATION_INVALID = 0xC01A0010,
+ MD_NTSTATUS_WIN_STATUS_LOG_CANT_DELETE = 0xC01A0011,
+ MD_NTSTATUS_WIN_STATUS_LOG_CONTAINER_LIMIT_EXCEEDED = 0xC01A0012,
+ MD_NTSTATUS_WIN_STATUS_LOG_START_OF_LOG = 0xC01A0013,
+ MD_NTSTATUS_WIN_STATUS_LOG_POLICY_ALREADY_INSTALLED = 0xC01A0014,
+ MD_NTSTATUS_WIN_STATUS_LOG_POLICY_NOT_INSTALLED = 0xC01A0015,
+ MD_NTSTATUS_WIN_STATUS_LOG_POLICY_INVALID = 0xC01A0016,
+ MD_NTSTATUS_WIN_STATUS_LOG_POLICY_CONFLICT = 0xC01A0017,
+ MD_NTSTATUS_WIN_STATUS_LOG_PINNED_ARCHIVE_TAIL = 0xC01A0018,
+ MD_NTSTATUS_WIN_STATUS_LOG_RECORD_NONEXISTENT = 0xC01A0019,
+ MD_NTSTATUS_WIN_STATUS_LOG_RECORDS_RESERVED_INVALID = 0xC01A001A,
+ MD_NTSTATUS_WIN_STATUS_LOG_SPACE_RESERVED_INVALID = 0xC01A001B,
+ MD_NTSTATUS_WIN_STATUS_LOG_TAIL_INVALID = 0xC01A001C,
+ MD_NTSTATUS_WIN_STATUS_LOG_FULL = 0xC01A001D,
+ MD_NTSTATUS_WIN_STATUS_LOG_MULTIPLEXED = 0xC01A001E,
+ MD_NTSTATUS_WIN_STATUS_LOG_DEDICATED = 0xC01A001F,
+ MD_NTSTATUS_WIN_STATUS_LOG_ARCHIVE_NOT_IN_PROGRESS = 0xC01A0020,
+ MD_NTSTATUS_WIN_STATUS_LOG_ARCHIVE_IN_PROGRESS = 0xC01A0021,
+ MD_NTSTATUS_WIN_STATUS_LOG_EPHEMERAL = 0xC01A0022,
+ MD_NTSTATUS_WIN_STATUS_LOG_NOT_ENOUGH_CONTAINERS = 0xC01A0023,
+ MD_NTSTATUS_WIN_STATUS_LOG_CLIENT_ALREADY_REGISTERED = 0xC01A0024,
+ MD_NTSTATUS_WIN_STATUS_LOG_CLIENT_NOT_REGISTERED = 0xC01A0025,
+ MD_NTSTATUS_WIN_STATUS_LOG_FULL_HANDLER_IN_PROGRESS = 0xC01A0026,
+ MD_NTSTATUS_WIN_STATUS_LOG_CONTAINER_READ_FAILED = 0xC01A0027,
+ MD_NTSTATUS_WIN_STATUS_LOG_CONTAINER_WRITE_FAILED = 0xC01A0028,
+ MD_NTSTATUS_WIN_STATUS_LOG_CONTAINER_OPEN_FAILED = 0xC01A0029,
+ MD_NTSTATUS_WIN_STATUS_LOG_CONTAINER_STATE_INVALID = 0xC01A002A,
+ MD_NTSTATUS_WIN_STATUS_LOG_STATE_INVALID = 0xC01A002B,
+ MD_NTSTATUS_WIN_STATUS_LOG_PINNED = 0xC01A002C,
+ MD_NTSTATUS_WIN_STATUS_LOG_METADATA_FLUSH_FAILED = 0xC01A002D,
+ MD_NTSTATUS_WIN_STATUS_LOG_INCONSISTENT_SECURITY = 0xC01A002E,
+ MD_NTSTATUS_WIN_STATUS_LOG_APPENDED_FLUSH_FAILED = 0xC01A002F,
+ MD_NTSTATUS_WIN_STATUS_LOG_PINNED_RESERVATION = 0xC01A0030,
+ MD_NTSTATUS_WIN_STATUS_VIDEO_HUNG_DISPLAY_DRIVER_THREAD = 0xC01B00EA,
+ MD_NTSTATUS_WIN_STATUS_FLT_NO_HANDLER_DEFINED = 0xC01C0001,
+ MD_NTSTATUS_WIN_STATUS_FLT_CONTEXT_ALREADY_DEFINED = 0xC01C0002,
+ MD_NTSTATUS_WIN_STATUS_FLT_INVALID_ASYNCHRONOUS_REQUEST = 0xC01C0003,
+ MD_NTSTATUS_WIN_STATUS_FLT_DISALLOW_FAST_IO = 0xC01C0004,
+ MD_NTSTATUS_WIN_STATUS_FLT_INVALID_NAME_REQUEST = 0xC01C0005,
+ MD_NTSTATUS_WIN_STATUS_FLT_NOT_SAFE_TO_POST_OPERATION = 0xC01C0006,
+ MD_NTSTATUS_WIN_STATUS_FLT_NOT_INITIALIZED = 0xC01C0007,
+ MD_NTSTATUS_WIN_STATUS_FLT_FILTER_NOT_READY = 0xC01C0008,
+ MD_NTSTATUS_WIN_STATUS_FLT_POST_OPERATION_CLEANUP = 0xC01C0009,
+ MD_NTSTATUS_WIN_STATUS_FLT_INTERNAL_ERROR = 0xC01C000A,
+ MD_NTSTATUS_WIN_STATUS_FLT_DELETING_OBJECT = 0xC01C000B,
+ MD_NTSTATUS_WIN_STATUS_FLT_MUST_BE_NONPAGED_POOL = 0xC01C000C,
+ MD_NTSTATUS_WIN_STATUS_FLT_DUPLICATE_ENTRY = 0xC01C000D,
+ MD_NTSTATUS_WIN_STATUS_FLT_CBDQ_DISABLED = 0xC01C000E,
+ MD_NTSTATUS_WIN_STATUS_FLT_DO_NOT_ATTACH = 0xC01C000F,
+ MD_NTSTATUS_WIN_STATUS_FLT_DO_NOT_DETACH = 0xC01C0010,
+ MD_NTSTATUS_WIN_STATUS_FLT_INSTANCE_ALTITUDE_COLLISION = 0xC01C0011,
+ MD_NTSTATUS_WIN_STATUS_FLT_INSTANCE_NAME_COLLISION = 0xC01C0012,
+ MD_NTSTATUS_WIN_STATUS_FLT_FILTER_NOT_FOUND = 0xC01C0013,
+ MD_NTSTATUS_WIN_STATUS_FLT_VOLUME_NOT_FOUND = 0xC01C0014,
+ MD_NTSTATUS_WIN_STATUS_FLT_INSTANCE_NOT_FOUND = 0xC01C0015,
+ MD_NTSTATUS_WIN_STATUS_FLT_CONTEXT_ALLOCATION_NOT_FOUND = 0xC01C0016,
+ MD_NTSTATUS_WIN_STATUS_FLT_INVALID_CONTEXT_REGISTRATION = 0xC01C0017,
+ MD_NTSTATUS_WIN_STATUS_FLT_NAME_CACHE_MISS = 0xC01C0018,
+ MD_NTSTATUS_WIN_STATUS_FLT_NO_DEVICE_OBJECT = 0xC01C0019,
+ MD_NTSTATUS_WIN_STATUS_FLT_VOLUME_ALREADY_MOUNTED = 0xC01C001A,
+ MD_NTSTATUS_WIN_STATUS_FLT_ALREADY_ENLISTED = 0xC01C001B,
+ MD_NTSTATUS_WIN_STATUS_FLT_CONTEXT_ALREADY_LINKED = 0xC01C001C,
+ MD_NTSTATUS_WIN_STATUS_FLT_NO_WAITER_FOR_REPLY = 0xC01C0020,
+ MD_NTSTATUS_WIN_STATUS_FLT_REGISTRATION_BUSY = 0xC01C0023,
+ MD_NTSTATUS_WIN_STATUS_MONITOR_NO_DESCRIPTOR = 0xC01D0001,
+ MD_NTSTATUS_WIN_STATUS_MONITOR_UNKNOWN_DESCRIPTOR_FORMAT = 0xC01D0002,
+ MD_NTSTATUS_WIN_STATUS_MONITOR_INVALID_DESCRIPTOR_CHECKSUM = 0xC01D0003,
+ MD_NTSTATUS_WIN_STATUS_MONITOR_INVALID_STANDARD_TIMING_BLOCK = 0xC01D0004,
+ MD_NTSTATUS_WIN_STATUS_MONITOR_WMI_DATABLOCK_REGISTRATION_FAILED = 0xC01D0005,
+ MD_NTSTATUS_WIN_STATUS_MONITOR_INVALID_SERIAL_NUMBER_MONDSC_BLOCK = 0xC01D0006,
+ MD_NTSTATUS_WIN_STATUS_MONITOR_INVALID_USER_FRIENDLY_MONDSC_BLOCK = 0xC01D0007,
+ MD_NTSTATUS_WIN_STATUS_MONITOR_NO_MORE_DESCRIPTOR_DATA = 0xC01D0008,
+ MD_NTSTATUS_WIN_STATUS_MONITOR_INVALID_DETAILED_TIMING_BLOCK = 0xC01D0009,
+ MD_NTSTATUS_WIN_STATUS_MONITOR_INVALID_MANUFACTURE_DATE = 0xC01D000A,
+ MD_NTSTATUS_WIN_STATUS_GRAPHICS_NOT_EXCLUSIVE_MODE_OWNER = 0xC01E0000,
+ MD_NTSTATUS_WIN_STATUS_GRAPHICS_INSUFFICIENT_DMA_BUFFER = 0xC01E0001,
+ MD_NTSTATUS_WIN_STATUS_GRAPHICS_INVALID_DISPLAY_ADAPTER = 0xC01E0002,
+ MD_NTSTATUS_WIN_STATUS_GRAPHICS_ADAPTER_WAS_RESET = 0xC01E0003,
+ MD_NTSTATUS_WIN_STATUS_GRAPHICS_INVALID_DRIVER_MODEL = 0xC01E0004,
+ MD_NTSTATUS_WIN_STATUS_GRAPHICS_PRESENT_MODE_CHANGED = 0xC01E0005,
+ MD_NTSTATUS_WIN_STATUS_GRAPHICS_PRESENT_OCCLUDED = 0xC01E0006,
+ MD_NTSTATUS_WIN_STATUS_GRAPHICS_PRESENT_DENIED = 0xC01E0007,
+ MD_NTSTATUS_WIN_STATUS_GRAPHICS_CANNOTCOLORCONVERT = 0xC01E0008,
+ MD_NTSTATUS_WIN_STATUS_GRAPHICS_DRIVER_MISMATCH = 0xC01E0009,
+ MD_NTSTATUS_WIN_STATUS_GRAPHICS_PRESENT_REDIRECTION_DISABLED = 0xC01E000B,
+ MD_NTSTATUS_WIN_STATUS_GRAPHICS_PRESENT_UNOCCLUDED = 0xC01E000C,
+ MD_NTSTATUS_WIN_STATUS_GRAPHICS_WINDOWDC_NOT_AVAILABLE = 0xC01E000D,
+ MD_NTSTATUS_WIN_STATUS_GRAPHICS_WINDOWLESS_PRESENT_DISABLED = 0xC01E000E,
+ MD_NTSTATUS_WIN_STATUS_GRAPHICS_NO_VIDEO_MEMORY = 0xC01E0100,
+ MD_NTSTATUS_WIN_STATUS_GRAPHICS_CANT_LOCK_MEMORY = 0xC01E0101,
+ MD_NTSTATUS_WIN_STATUS_GRAPHICS_ALLOCATION_BUSY = 0xC01E0102,
+ MD_NTSTATUS_WIN_STATUS_GRAPHICS_TOO_MANY_REFERENCES = 0xC01E0103,
+ MD_NTSTATUS_WIN_STATUS_GRAPHICS_TRY_AGAIN_LATER = 0xC01E0104,
+ MD_NTSTATUS_WIN_STATUS_GRAPHICS_TRY_AGAIN_NOW = 0xC01E0105,
+ MD_NTSTATUS_WIN_STATUS_GRAPHICS_ALLOCATION_INVALID = 0xC01E0106,
+ MD_NTSTATUS_WIN_STATUS_GRAPHICS_UNSWIZZLING_APERTURE_UNAVAILABLE = 0xC01E0107,
+ MD_NTSTATUS_WIN_STATUS_GRAPHICS_UNSWIZZLING_APERTURE_UNSUPPORTED = 0xC01E0108,
+ MD_NTSTATUS_WIN_STATUS_GRAPHICS_CANT_EVICT_PINNED_ALLOCATION = 0xC01E0109,
+ MD_NTSTATUS_WIN_STATUS_GRAPHICS_INVALID_ALLOCATION_USAGE = 0xC01E0110,
+ MD_NTSTATUS_WIN_STATUS_GRAPHICS_CANT_RENDER_LOCKED_ALLOCATION = 0xC01E0111,
+ MD_NTSTATUS_WIN_STATUS_GRAPHICS_ALLOCATION_CLOSED = 0xC01E0112,
+ MD_NTSTATUS_WIN_STATUS_GRAPHICS_INVALID_ALLOCATION_INSTANCE = 0xC01E0113,
+ MD_NTSTATUS_WIN_STATUS_GRAPHICS_INVALID_ALLOCATION_HANDLE = 0xC01E0114,
+ MD_NTSTATUS_WIN_STATUS_GRAPHICS_WRONG_ALLOCATION_DEVICE = 0xC01E0115,
+ MD_NTSTATUS_WIN_STATUS_GRAPHICS_ALLOCATION_CONTENT_LOST = 0xC01E0116,
+ MD_NTSTATUS_WIN_STATUS_GRAPHICS_GPU_EXCEPTION_ON_DEVICE = 0xC01E0200,
+ MD_NTSTATUS_WIN_STATUS_GRAPHICS_INVALID_VIDPN_TOPOLOGY = 0xC01E0300,
+ MD_NTSTATUS_WIN_STATUS_GRAPHICS_VIDPN_TOPOLOGY_NOT_SUPPORTED = 0xC01E0301,
+ MD_NTSTATUS_WIN_STATUS_GRAPHICS_VIDPN_TOPOLOGY_CURRENTLY_NOT_SUPPORTED = 0xC01E0302,
+ MD_NTSTATUS_WIN_STATUS_GRAPHICS_INVALID_VIDPN = 0xC01E0303,
+ MD_NTSTATUS_WIN_STATUS_GRAPHICS_INVALID_VIDEO_PRESENT_SOURCE = 0xC01E0304,
+ MD_NTSTATUS_WIN_STATUS_GRAPHICS_INVALID_VIDEO_PRESENT_TARGET = 0xC01E0305,
+ MD_NTSTATUS_WIN_STATUS_GRAPHICS_VIDPN_MODALITY_NOT_SUPPORTED = 0xC01E0306,
+ MD_NTSTATUS_WIN_STATUS_GRAPHICS_INVALID_VIDPN_SOURCEMODESET = 0xC01E0308,
+ MD_NTSTATUS_WIN_STATUS_GRAPHICS_INVALID_VIDPN_TARGETMODESET = 0xC01E0309,
+ MD_NTSTATUS_WIN_STATUS_GRAPHICS_INVALID_FREQUENCY = 0xC01E030A,
+ MD_NTSTATUS_WIN_STATUS_GRAPHICS_INVALID_ACTIVE_REGION = 0xC01E030B,
+ MD_NTSTATUS_WIN_STATUS_GRAPHICS_INVALID_TOTAL_REGION = 0xC01E030C,
+ MD_NTSTATUS_WIN_STATUS_GRAPHICS_INVALID_VIDEO_PRESENT_SOURCE_MODE = 0xC01E0310,
+ MD_NTSTATUS_WIN_STATUS_GRAPHICS_INVALID_VIDEO_PRESENT_TARGET_MODE = 0xC01E0311,
+ MD_NTSTATUS_WIN_STATUS_GRAPHICS_PINNED_MODE_MUST_REMAIN_IN_SET = 0xC01E0312,
+ MD_NTSTATUS_WIN_STATUS_GRAPHICS_PATH_ALREADY_IN_TOPOLOGY = 0xC01E0313,
+ MD_NTSTATUS_WIN_STATUS_GRAPHICS_MODE_ALREADY_IN_MODESET = 0xC01E0314,
+ MD_NTSTATUS_WIN_STATUS_GRAPHICS_INVALID_VIDEOPRESENTSOURCESET = 0xC01E0315,
+ MD_NTSTATUS_WIN_STATUS_GRAPHICS_INVALID_VIDEOPRESENTTARGETSET = 0xC01E0316,
+ MD_NTSTATUS_WIN_STATUS_GRAPHICS_SOURCE_ALREADY_IN_SET = 0xC01E0317,
+ MD_NTSTATUS_WIN_STATUS_GRAPHICS_TARGET_ALREADY_IN_SET = 0xC01E0318,
+ MD_NTSTATUS_WIN_STATUS_GRAPHICS_INVALID_VIDPN_PRESENT_PATH = 0xC01E0319,
+ MD_NTSTATUS_WIN_STATUS_GRAPHICS_NO_RECOMMENDED_VIDPN_TOPOLOGY = 0xC01E031A,
+ MD_NTSTATUS_WIN_STATUS_GRAPHICS_INVALID_MONITOR_FREQUENCYRANGESET = 0xC01E031B,
+ MD_NTSTATUS_WIN_STATUS_GRAPHICS_INVALID_MONITOR_FREQUENCYRANGE = 0xC01E031C,
+ MD_NTSTATUS_WIN_STATUS_GRAPHICS_FREQUENCYRANGE_NOT_IN_SET = 0xC01E031D,
+ MD_NTSTATUS_WIN_STATUS_GRAPHICS_FREQUENCYRANGE_ALREADY_IN_SET = 0xC01E031F,
+ MD_NTSTATUS_WIN_STATUS_GRAPHICS_STALE_MODESET = 0xC01E0320,
+ MD_NTSTATUS_WIN_STATUS_GRAPHICS_INVALID_MONITOR_SOURCEMODESET = 0xC01E0321,
+ MD_NTSTATUS_WIN_STATUS_GRAPHICS_INVALID_MONITOR_SOURCE_MODE = 0xC01E0322,
+ MD_NTSTATUS_WIN_STATUS_GRAPHICS_NO_RECOMMENDED_FUNCTIONAL_VIDPN = 0xC01E0323,
+ MD_NTSTATUS_WIN_STATUS_GRAPHICS_MODE_ID_MUST_BE_UNIQUE = 0xC01E0324,
+ MD_NTSTATUS_WIN_STATUS_GRAPHICS_EMPTY_ADAPTER_MONITOR_MODE_SUPPORT_INTERSECTION = 0xC01E0325,
+ MD_NTSTATUS_WIN_STATUS_GRAPHICS_VIDEO_PRESENT_TARGETS_LESS_THAN_SOURCES = 0xC01E0326,
+ MD_NTSTATUS_WIN_STATUS_GRAPHICS_PATH_NOT_IN_TOPOLOGY = 0xC01E0327,
+ MD_NTSTATUS_WIN_STATUS_GRAPHICS_ADAPTER_MUST_HAVE_AT_LEAST_ONE_SOURCE = 0xC01E0328,
+ MD_NTSTATUS_WIN_STATUS_GRAPHICS_ADAPTER_MUST_HAVE_AT_LEAST_ONE_TARGET = 0xC01E0329,
+ MD_NTSTATUS_WIN_STATUS_GRAPHICS_INVALID_MONITORDESCRIPTORSET = 0xC01E032A,
+ MD_NTSTATUS_WIN_STATUS_GRAPHICS_INVALID_MONITORDESCRIPTOR = 0xC01E032B,
+ MD_NTSTATUS_WIN_STATUS_GRAPHICS_MONITORDESCRIPTOR_NOT_IN_SET = 0xC01E032C,
+ MD_NTSTATUS_WIN_STATUS_GRAPHICS_MONITORDESCRIPTOR_ALREADY_IN_SET = 0xC01E032D,
+ MD_NTSTATUS_WIN_STATUS_GRAPHICS_MONITORDESCRIPTOR_ID_MUST_BE_UNIQUE = 0xC01E032E,
+ MD_NTSTATUS_WIN_STATUS_GRAPHICS_INVALID_VIDPN_TARGET_SUBSET_TYPE = 0xC01E032F,
+ MD_NTSTATUS_WIN_STATUS_GRAPHICS_RESOURCES_NOT_RELATED = 0xC01E0330,
+ MD_NTSTATUS_WIN_STATUS_GRAPHICS_SOURCE_ID_MUST_BE_UNIQUE = 0xC01E0331,
+ MD_NTSTATUS_WIN_STATUS_GRAPHICS_TARGET_ID_MUST_BE_UNIQUE = 0xC01E0332,
+ MD_NTSTATUS_WIN_STATUS_GRAPHICS_NO_AVAILABLE_VIDPN_TARGET = 0xC01E0333,
+ MD_NTSTATUS_WIN_STATUS_GRAPHICS_MONITOR_COULD_NOT_BE_ASSOCIATED_WITH_ADAPTER = 0xC01E0334,
+ MD_NTSTATUS_WIN_STATUS_GRAPHICS_NO_VIDPNMGR = 0xC01E0335,
+ MD_NTSTATUS_WIN_STATUS_GRAPHICS_NO_ACTIVE_VIDPN = 0xC01E0336,
+ MD_NTSTATUS_WIN_STATUS_GRAPHICS_STALE_VIDPN_TOPOLOGY = 0xC01E0337,
+ MD_NTSTATUS_WIN_STATUS_GRAPHICS_MONITOR_NOT_CONNECTED = 0xC01E0338,
+ MD_NTSTATUS_WIN_STATUS_GRAPHICS_SOURCE_NOT_IN_TOPOLOGY = 0xC01E0339,
+ MD_NTSTATUS_WIN_STATUS_GRAPHICS_INVALID_PRIMARYSURFACE_SIZE = 0xC01E033A,
+ MD_NTSTATUS_WIN_STATUS_GRAPHICS_INVALID_VISIBLEREGION_SIZE = 0xC01E033B,
+ MD_NTSTATUS_WIN_STATUS_GRAPHICS_INVALID_STRIDE = 0xC01E033C,
+ MD_NTSTATUS_WIN_STATUS_GRAPHICS_INVALID_PIXELFORMAT = 0xC01E033D,
+ MD_NTSTATUS_WIN_STATUS_GRAPHICS_INVALID_COLORBASIS = 0xC01E033E,
+ MD_NTSTATUS_WIN_STATUS_GRAPHICS_INVALID_PIXELVALUEACCESSMODE = 0xC01E033F,
+ MD_NTSTATUS_WIN_STATUS_GRAPHICS_TARGET_NOT_IN_TOPOLOGY = 0xC01E0340,
+ MD_NTSTATUS_WIN_STATUS_GRAPHICS_NO_DISPLAY_MODE_MANAGEMENT_SUPPORT = 0xC01E0341,
+ MD_NTSTATUS_WIN_STATUS_GRAPHICS_VIDPN_SOURCE_IN_USE = 0xC01E0342,
+ MD_NTSTATUS_WIN_STATUS_GRAPHICS_CANT_ACCESS_ACTIVE_VIDPN = 0xC01E0343,
+ MD_NTSTATUS_WIN_STATUS_GRAPHICS_INVALID_PATH_IMPORTANCE_ORDINAL = 0xC01E0344,
+ MD_NTSTATUS_WIN_STATUS_GRAPHICS_INVALID_PATH_CONTENT_GEOMETRY_TRANSFORMATION = 0xC01E0345,
+ MD_NTSTATUS_WIN_STATUS_GRAPHICS_PATH_CONTENT_GEOMETRY_TRANSFORMATION_NOT_SUPPORTED = 0xC01E0346,
+ MD_NTSTATUS_WIN_STATUS_GRAPHICS_INVALID_GAMMA_RAMP = 0xC01E0347,
+ MD_NTSTATUS_WIN_STATUS_GRAPHICS_GAMMA_RAMP_NOT_SUPPORTED = 0xC01E0348,
+ MD_NTSTATUS_WIN_STATUS_GRAPHICS_MULTISAMPLING_NOT_SUPPORTED = 0xC01E0349,
+ MD_NTSTATUS_WIN_STATUS_GRAPHICS_MODE_NOT_IN_MODESET = 0xC01E034A,
+ MD_NTSTATUS_WIN_STATUS_GRAPHICS_INVALID_VIDPN_TOPOLOGY_RECOMMENDATION_REASON = 0xC01E034D,
+ MD_NTSTATUS_WIN_STATUS_GRAPHICS_INVALID_PATH_CONTENT_TYPE = 0xC01E034E,
+ MD_NTSTATUS_WIN_STATUS_GRAPHICS_INVALID_COPYPROTECTION_TYPE = 0xC01E034F,
+ MD_NTSTATUS_WIN_STATUS_GRAPHICS_UNASSIGNED_MODESET_ALREADY_EXISTS = 0xC01E0350,
+ MD_NTSTATUS_WIN_STATUS_GRAPHICS_INVALID_SCANLINE_ORDERING = 0xC01E0352,
+ MD_NTSTATUS_WIN_STATUS_GRAPHICS_TOPOLOGY_CHANGES_NOT_ALLOWED = 0xC01E0353,
+ MD_NTSTATUS_WIN_STATUS_GRAPHICS_NO_AVAILABLE_IMPORTANCE_ORDINALS = 0xC01E0354,
+ MD_NTSTATUS_WIN_STATUS_GRAPHICS_INCOMPATIBLE_PRIVATE_FORMAT = 0xC01E0355,
+ MD_NTSTATUS_WIN_STATUS_GRAPHICS_INVALID_MODE_PRUNING_ALGORITHM = 0xC01E0356,
+ MD_NTSTATUS_WIN_STATUS_GRAPHICS_INVALID_MONITOR_CAPABILITY_ORIGIN = 0xC01E0357,
+ MD_NTSTATUS_WIN_STATUS_GRAPHICS_INVALID_MONITOR_FREQUENCYRANGE_CONSTRAINT = 0xC01E0358,
+ MD_NTSTATUS_WIN_STATUS_GRAPHICS_MAX_NUM_PATHS_REACHED = 0xC01E0359,
+ MD_NTSTATUS_WIN_STATUS_GRAPHICS_CANCEL_VIDPN_TOPOLOGY_AUGMENTATION = 0xC01E035A,
+ MD_NTSTATUS_WIN_STATUS_GRAPHICS_INVALID_CLIENT_TYPE = 0xC01E035B,
+ MD_NTSTATUS_WIN_STATUS_GRAPHICS_CLIENTVIDPN_NOT_SET = 0xC01E035C,
+ MD_NTSTATUS_WIN_STATUS_GRAPHICS_SPECIFIED_CHILD_ALREADY_CONNECTED = 0xC01E0400,
+ MD_NTSTATUS_WIN_STATUS_GRAPHICS_CHILD_DESCRIPTOR_NOT_SUPPORTED = 0xC01E0401,
+ MD_NTSTATUS_WIN_STATUS_GRAPHICS_NOT_A_LINKED_ADAPTER = 0xC01E0430,
+ MD_NTSTATUS_WIN_STATUS_GRAPHICS_LEADLINK_NOT_ENUMERATED = 0xC01E0431,
+ MD_NTSTATUS_WIN_STATUS_GRAPHICS_CHAINLINKS_NOT_ENUMERATED = 0xC01E0432,
+ MD_NTSTATUS_WIN_STATUS_GRAPHICS_ADAPTER_CHAIN_NOT_READY = 0xC01E0433,
+ MD_NTSTATUS_WIN_STATUS_GRAPHICS_CHAINLINKS_NOT_STARTED = 0xC01E0434,
+ MD_NTSTATUS_WIN_STATUS_GRAPHICS_CHAINLINKS_NOT_POWERED_ON = 0xC01E0435,
+ MD_NTSTATUS_WIN_STATUS_GRAPHICS_INCONSISTENT_DEVICE_LINK_STATE = 0xC01E0436,
+ MD_NTSTATUS_WIN_STATUS_GRAPHICS_NOT_POST_DEVICE_DRIVER = 0xC01E0438,
+ MD_NTSTATUS_WIN_STATUS_GRAPHICS_ADAPTER_ACCESS_NOT_EXCLUDED = 0xC01E043B,
+ MD_NTSTATUS_WIN_STATUS_GRAPHICS_OPM_NOT_SUPPORTED = 0xC01E0500,
+ MD_NTSTATUS_WIN_STATUS_GRAPHICS_COPP_NOT_SUPPORTED = 0xC01E0501,
+ MD_NTSTATUS_WIN_STATUS_GRAPHICS_UAB_NOT_SUPPORTED = 0xC01E0502,
+ MD_NTSTATUS_WIN_STATUS_GRAPHICS_OPM_INVALID_ENCRYPTED_PARAMETERS = 0xC01E0503,
+ MD_NTSTATUS_WIN_STATUS_GRAPHICS_OPM_NO_PROTECTED_OUTPUTS_EXIST = 0xC01E0505,
+ MD_NTSTATUS_WIN_STATUS_GRAPHICS_OPM_INTERNAL_ERROR = 0xC01E050B,
+ MD_NTSTATUS_WIN_STATUS_GRAPHICS_OPM_INVALID_HANDLE = 0xC01E050C,
+ MD_NTSTATUS_WIN_STATUS_GRAPHICS_PVP_INVALID_CERTIFICATE_LENGTH = 0xC01E050E,
+ MD_NTSTATUS_WIN_STATUS_GRAPHICS_OPM_SPANNING_MODE_ENABLED = 0xC01E050F,
+ MD_NTSTATUS_WIN_STATUS_GRAPHICS_OPM_THEATER_MODE_ENABLED = 0xC01E0510,
+ MD_NTSTATUS_WIN_STATUS_GRAPHICS_PVP_HFS_FAILED = 0xC01E0511,
+ MD_NTSTATUS_WIN_STATUS_GRAPHICS_OPM_INVALID_SRM = 0xC01E0512,
+ MD_NTSTATUS_WIN_STATUS_GRAPHICS_OPM_OUTPUT_DOES_NOT_SUPPORT_HDCP = 0xC01E0513,
+ MD_NTSTATUS_WIN_STATUS_GRAPHICS_OPM_OUTPUT_DOES_NOT_SUPPORT_ACP = 0xC01E0514,
+ MD_NTSTATUS_WIN_STATUS_GRAPHICS_OPM_OUTPUT_DOES_NOT_SUPPORT_CGMSA = 0xC01E0515,
+ MD_NTSTATUS_WIN_STATUS_GRAPHICS_OPM_HDCP_SRM_NEVER_SET = 0xC01E0516,
+ MD_NTSTATUS_WIN_STATUS_GRAPHICS_OPM_RESOLUTION_TOO_HIGH = 0xC01E0517,
+ MD_NTSTATUS_WIN_STATUS_GRAPHICS_OPM_ALL_HDCP_HARDWARE_ALREADY_IN_USE = 0xC01E0518,
+ MD_NTSTATUS_WIN_STATUS_GRAPHICS_OPM_PROTECTED_OUTPUT_NO_LONGER_EXISTS = 0xC01E051A,
+ MD_NTSTATUS_WIN_STATUS_GRAPHICS_OPM_PROTECTED_OUTPUT_DOES_NOT_HAVE_COPP_SEMANTICS = 0xC01E051C,
+ MD_NTSTATUS_WIN_STATUS_GRAPHICS_OPM_INVALID_INFORMATION_REQUEST = 0xC01E051D,
+ MD_NTSTATUS_WIN_STATUS_GRAPHICS_OPM_DRIVER_INTERNAL_ERROR = 0xC01E051E,
+ MD_NTSTATUS_WIN_STATUS_GRAPHICS_OPM_PROTECTED_OUTPUT_DOES_NOT_HAVE_OPM_SEMANTICS = 0xC01E051F,
+ MD_NTSTATUS_WIN_STATUS_GRAPHICS_OPM_SIGNALING_NOT_SUPPORTED = 0xC01E0520,
+ MD_NTSTATUS_WIN_STATUS_GRAPHICS_OPM_INVALID_CONFIGURATION_REQUEST = 0xC01E0521,
+ MD_NTSTATUS_WIN_STATUS_GRAPHICS_I2C_NOT_SUPPORTED = 0xC01E0580,
+ MD_NTSTATUS_WIN_STATUS_GRAPHICS_I2C_DEVICE_DOES_NOT_EXIST = 0xC01E0581,
+ MD_NTSTATUS_WIN_STATUS_GRAPHICS_I2C_ERROR_TRANSMITTING_DATA = 0xC01E0582,
+ MD_NTSTATUS_WIN_STATUS_GRAPHICS_I2C_ERROR_RECEIVING_DATA = 0xC01E0583,
+ MD_NTSTATUS_WIN_STATUS_GRAPHICS_DDCCI_VCP_NOT_SUPPORTED = 0xC01E0584,
+ MD_NTSTATUS_WIN_STATUS_GRAPHICS_DDCCI_INVALID_DATA = 0xC01E0585,
+ MD_NTSTATUS_WIN_STATUS_GRAPHICS_DDCCI_MONITOR_RETURNED_INVALID_TIMING_STATUS_BYTE = 0xC01E0586,
+ MD_NTSTATUS_WIN_STATUS_GRAPHICS_DDCCI_INVALID_CAPABILITIES_STRING = 0xC01E0587,
+ MD_NTSTATUS_WIN_STATUS_GRAPHICS_MCA_INTERNAL_ERROR = 0xC01E0588,
+ MD_NTSTATUS_WIN_STATUS_GRAPHICS_DDCCI_INVALID_MESSAGE_COMMAND = 0xC01E0589,
+ MD_NTSTATUS_WIN_STATUS_GRAPHICS_DDCCI_INVALID_MESSAGE_LENGTH = 0xC01E058A,
+ MD_NTSTATUS_WIN_STATUS_GRAPHICS_DDCCI_INVALID_MESSAGE_CHECKSUM = 0xC01E058B,
+ MD_NTSTATUS_WIN_STATUS_GRAPHICS_INVALID_PHYSICAL_MONITOR_HANDLE = 0xC01E058C,
+ MD_NTSTATUS_WIN_STATUS_GRAPHICS_MONITOR_NO_LONGER_EXISTS = 0xC01E058D,
+ MD_NTSTATUS_WIN_STATUS_GRAPHICS_ONLY_CONSOLE_SESSION_SUPPORTED = 0xC01E05E0,
+ MD_NTSTATUS_WIN_STATUS_GRAPHICS_NO_DISPLAY_DEVICE_CORRESPONDS_TO_NAME = 0xC01E05E1,
+ MD_NTSTATUS_WIN_STATUS_GRAPHICS_DISPLAY_DEVICE_NOT_ATTACHED_TO_DESKTOP = 0xC01E05E2,
+ MD_NTSTATUS_WIN_STATUS_GRAPHICS_MIRRORING_DEVICES_NOT_SUPPORTED = 0xC01E05E3,
+ MD_NTSTATUS_WIN_STATUS_GRAPHICS_INVALID_POINTER = 0xC01E05E4,
+ MD_NTSTATUS_WIN_STATUS_GRAPHICS_NO_MONITORS_CORRESPOND_TO_DISPLAY_DEVICE = 0xC01E05E5,
+ MD_NTSTATUS_WIN_STATUS_GRAPHICS_PARAMETER_ARRAY_TOO_SMALL = 0xC01E05E6,
+ MD_NTSTATUS_WIN_STATUS_GRAPHICS_INTERNAL_ERROR = 0xC01E05E7,
+ MD_NTSTATUS_WIN_STATUS_GRAPHICS_SESSION_TYPE_CHANGE_IN_PROGRESS = 0xC01E05E8,
+ MD_NTSTATUS_WIN_STATUS_FVE_LOCKED_VOLUME = 0xC0210000,
+ MD_NTSTATUS_WIN_STATUS_FVE_NOT_ENCRYPTED = 0xC0210001,
+ MD_NTSTATUS_WIN_STATUS_FVE_BAD_INFORMATION = 0xC0210002,
+ MD_NTSTATUS_WIN_STATUS_FVE_TOO_SMALL = 0xC0210003,
+ MD_NTSTATUS_WIN_STATUS_FVE_FAILED_WRONG_FS = 0xC0210004,
+ MD_NTSTATUS_WIN_STATUS_FVE_BAD_PARTITION_SIZE = 0xC0210005,
+ MD_NTSTATUS_WIN_STATUS_FVE_FS_NOT_EXTENDED = 0xC0210006,
+ MD_NTSTATUS_WIN_STATUS_FVE_FS_MOUNTED = 0xC0210007,
+ MD_NTSTATUS_WIN_STATUS_FVE_NO_LICENSE = 0xC0210008,
+ MD_NTSTATUS_WIN_STATUS_FVE_ACTION_NOT_ALLOWED = 0xC0210009,
+ MD_NTSTATUS_WIN_STATUS_FVE_BAD_DATA = 0xC021000A,
+ MD_NTSTATUS_WIN_STATUS_FVE_VOLUME_NOT_BOUND = 0xC021000B,
+ MD_NTSTATUS_WIN_STATUS_FVE_NOT_DATA_VOLUME = 0xC021000C,
+ MD_NTSTATUS_WIN_STATUS_FVE_CONV_READ_ERROR = 0xC021000D,
+ MD_NTSTATUS_WIN_STATUS_FVE_CONV_WRITE_ERROR = 0xC021000E,
+ MD_NTSTATUS_WIN_STATUS_FVE_OVERLAPPED_UPDATE = 0xC021000F,
+ MD_NTSTATUS_WIN_STATUS_FVE_FAILED_SECTOR_SIZE = 0xC0210010,
+ MD_NTSTATUS_WIN_STATUS_FVE_FAILED_AUTHENTICATION = 0xC0210011,
+ MD_NTSTATUS_WIN_STATUS_FVE_NOT_OS_VOLUME = 0xC0210012,
+ MD_NTSTATUS_WIN_STATUS_FVE_KEYFILE_NOT_FOUND = 0xC0210013,
+ MD_NTSTATUS_WIN_STATUS_FVE_KEYFILE_INVALID = 0xC0210014,
+ MD_NTSTATUS_WIN_STATUS_FVE_KEYFILE_NO_VMK = 0xC0210015,
+ MD_NTSTATUS_WIN_STATUS_FVE_TPM_DISABLED = 0xC0210016,
+ MD_NTSTATUS_WIN_STATUS_FVE_TPM_SRK_AUTH_NOT_ZERO = 0xC0210017,
+ MD_NTSTATUS_WIN_STATUS_FVE_TPM_INVALID_PCR = 0xC0210018,
+ MD_NTSTATUS_WIN_STATUS_FVE_TPM_NO_VMK = 0xC0210019,
+ MD_NTSTATUS_WIN_STATUS_FVE_PIN_INVALID = 0xC021001A,
+ MD_NTSTATUS_WIN_STATUS_FVE_AUTH_INVALID_APPLICATION = 0xC021001B,
+ MD_NTSTATUS_WIN_STATUS_FVE_AUTH_INVALID_CONFIG = 0xC021001C,
+ MD_NTSTATUS_WIN_STATUS_FVE_DEBUGGER_ENABLED = 0xC021001D,
+ MD_NTSTATUS_WIN_STATUS_FVE_DRY_RUN_FAILED = 0xC021001E,
+ MD_NTSTATUS_WIN_STATUS_FVE_BAD_METADATA_POINTER = 0xC021001F,
+ MD_NTSTATUS_WIN_STATUS_FVE_OLD_METADATA_COPY = 0xC0210020,
+ MD_NTSTATUS_WIN_STATUS_FVE_REBOOT_REQUIRED = 0xC0210021,
+ MD_NTSTATUS_WIN_STATUS_FVE_RAW_ACCESS = 0xC0210022,
+ MD_NTSTATUS_WIN_STATUS_FVE_RAW_BLOCKED = 0xC0210023,
+ MD_NTSTATUS_WIN_STATUS_FVE_NO_AUTOUNLOCK_MASTER_KEY = 0xC0210024,
+ MD_NTSTATUS_WIN_STATUS_FVE_MOR_FAILED = 0xC0210025,
+ MD_NTSTATUS_WIN_STATUS_FVE_NO_FEATURE_LICENSE = 0xC0210026,
+ MD_NTSTATUS_WIN_STATUS_FVE_POLICY_USER_DISABLE_RDV_NOT_ALLOWED = 0xC0210027,
+ MD_NTSTATUS_WIN_STATUS_FVE_CONV_RECOVERY_FAILED = 0xC0210028,
+ MD_NTSTATUS_WIN_STATUS_FVE_VIRTUALIZED_SPACE_TOO_BIG = 0xC0210029,
+ MD_NTSTATUS_WIN_STATUS_FVE_INVALID_DATUM_TYPE = 0xC021002A,
+ MD_NTSTATUS_WIN_STATUS_FVE_VOLUME_TOO_SMALL = 0xC0210030,
+ MD_NTSTATUS_WIN_STATUS_FVE_ENH_PIN_INVALID = 0xC0210031,
+ MD_NTSTATUS_WIN_STATUS_FVE_FULL_ENCRYPTION_NOT_ALLOWED_ON_TP_STORAGE = 0xC0210032,
+ MD_NTSTATUS_WIN_STATUS_FVE_WIPE_NOT_ALLOWED_ON_TP_STORAGE = 0xC0210033,
+ MD_NTSTATUS_WIN_STATUS_FVE_NOT_ALLOWED_ON_CSV_STACK = 0xC0210034,
+ MD_NTSTATUS_WIN_STATUS_FVE_NOT_ALLOWED_ON_CLUSTER = 0xC0210035,
+ MD_NTSTATUS_WIN_STATUS_FVE_NOT_ALLOWED_TO_UPGRADE_WHILE_CONVERTING = 0xC0210036,
+ MD_NTSTATUS_WIN_STATUS_FVE_WIPE_CANCEL_NOT_APPLICABLE = 0xC0210037,
+ MD_NTSTATUS_WIN_STATUS_FVE_EDRIVE_DRY_RUN_FAILED = 0xC0210038,
+ MD_NTSTATUS_WIN_STATUS_FVE_SECUREBOOT_DISABLED = 0xC0210039,
+ MD_NTSTATUS_WIN_STATUS_FVE_SECUREBOOT_CONFIG_CHANGE = 0xC021003A,
+ MD_NTSTATUS_WIN_STATUS_FVE_DEVICE_LOCKEDOUT = 0xC021003B,
+ MD_NTSTATUS_WIN_STATUS_FVE_VOLUME_EXTEND_PREVENTS_EOW_DECRYPT = 0xC021003C,
+ MD_NTSTATUS_WIN_STATUS_FVE_NOT_DE_VOLUME = 0xC021003D,
+ MD_NTSTATUS_WIN_STATUS_FVE_PROTECTION_DISABLED = 0xC021003E,
+ MD_NTSTATUS_WIN_STATUS_FVE_PROTECTION_CANNOT_BE_DISABLED = 0xC021003F,
+ MD_NTSTATUS_WIN_STATUS_FWP_CALLOUT_NOT_FOUND = 0xC0220001,
+ MD_NTSTATUS_WIN_STATUS_FWP_CONDITION_NOT_FOUND = 0xC0220002,
+ MD_NTSTATUS_WIN_STATUS_FWP_FILTER_NOT_FOUND = 0xC0220003,
+ MD_NTSTATUS_WIN_STATUS_FWP_LAYER_NOT_FOUND = 0xC0220004,
+ MD_NTSTATUS_WIN_STATUS_FWP_PROVIDER_NOT_FOUND = 0xC0220005,
+ MD_NTSTATUS_WIN_STATUS_FWP_PROVIDER_CONTEXT_NOT_FOUND = 0xC0220006,
+ MD_NTSTATUS_WIN_STATUS_FWP_SUBLAYER_NOT_FOUND = 0xC0220007,
+ MD_NTSTATUS_WIN_STATUS_FWP_NOT_FOUND = 0xC0220008,
+ MD_NTSTATUS_WIN_STATUS_FWP_ALREADY_EXISTS = 0xC0220009,
+ MD_NTSTATUS_WIN_STATUS_FWP_IN_USE = 0xC022000A,
+ MD_NTSTATUS_WIN_STATUS_FWP_DYNAMIC_SESSION_IN_PROGRESS = 0xC022000B,
+ MD_NTSTATUS_WIN_STATUS_FWP_WRONG_SESSION = 0xC022000C,
+ MD_NTSTATUS_WIN_STATUS_FWP_NO_TXN_IN_PROGRESS = 0xC022000D,
+ MD_NTSTATUS_WIN_STATUS_FWP_TXN_IN_PROGRESS = 0xC022000E,
+ MD_NTSTATUS_WIN_STATUS_FWP_TXN_ABORTED = 0xC022000F,
+ MD_NTSTATUS_WIN_STATUS_FWP_SESSION_ABORTED = 0xC0220010,
+ MD_NTSTATUS_WIN_STATUS_FWP_INCOMPATIBLE_TXN = 0xC0220011,
+ MD_NTSTATUS_WIN_STATUS_FWP_TIMEOUT = 0xC0220012,
+ MD_NTSTATUS_WIN_STATUS_FWP_NET_EVENTS_DISABLED = 0xC0220013,
+ MD_NTSTATUS_WIN_STATUS_FWP_INCOMPATIBLE_LAYER = 0xC0220014,
+ MD_NTSTATUS_WIN_STATUS_FWP_KM_CLIENTS_ONLY = 0xC0220015,
+ MD_NTSTATUS_WIN_STATUS_FWP_LIFETIME_MISMATCH = 0xC0220016,
+ MD_NTSTATUS_WIN_STATUS_FWP_BUILTIN_OBJECT = 0xC0220017,
+ MD_NTSTATUS_WIN_STATUS_FWP_TOO_MANY_CALLOUTS = 0xC0220018,
+ MD_NTSTATUS_WIN_STATUS_FWP_NOTIFICATION_DROPPED = 0xC0220019,
+ MD_NTSTATUS_WIN_STATUS_FWP_TRAFFIC_MISMATCH = 0xC022001A,
+ MD_NTSTATUS_WIN_STATUS_FWP_INCOMPATIBLE_SA_STATE = 0xC022001B,
+ MD_NTSTATUS_WIN_STATUS_FWP_NULL_POINTER = 0xC022001C,
+ MD_NTSTATUS_WIN_STATUS_FWP_INVALID_ENUMERATOR = 0xC022001D,
+ MD_NTSTATUS_WIN_STATUS_FWP_INVALID_FLAGS = 0xC022001E,
+ MD_NTSTATUS_WIN_STATUS_FWP_INVALID_NET_MASK = 0xC022001F,
+ MD_NTSTATUS_WIN_STATUS_FWP_INVALID_RANGE = 0xC0220020,
+ MD_NTSTATUS_WIN_STATUS_FWP_INVALID_INTERVAL = 0xC0220021,
+ MD_NTSTATUS_WIN_STATUS_FWP_ZERO_LENGTH_ARRAY = 0xC0220022,
+ MD_NTSTATUS_WIN_STATUS_FWP_NULL_DISPLAY_NAME = 0xC0220023,
+ MD_NTSTATUS_WIN_STATUS_FWP_INVALID_ACTION_TYPE = 0xC0220024,
+ MD_NTSTATUS_WIN_STATUS_FWP_INVALID_WEIGHT = 0xC0220025,
+ MD_NTSTATUS_WIN_STATUS_FWP_MATCH_TYPE_MISMATCH = 0xC0220026,
+ MD_NTSTATUS_WIN_STATUS_FWP_TYPE_MISMATCH = 0xC0220027,
+ MD_NTSTATUS_WIN_STATUS_FWP_OUT_OF_BOUNDS = 0xC0220028,
+ MD_NTSTATUS_WIN_STATUS_FWP_RESERVED = 0xC0220029,
+ MD_NTSTATUS_WIN_STATUS_FWP_DUPLICATE_CONDITION = 0xC022002A,
+ MD_NTSTATUS_WIN_STATUS_FWP_DUPLICATE_KEYMOD = 0xC022002B,
+ MD_NTSTATUS_WIN_STATUS_FWP_ACTION_INCOMPATIBLE_WITH_LAYER = 0xC022002C,
+ MD_NTSTATUS_WIN_STATUS_FWP_ACTION_INCOMPATIBLE_WITH_SUBLAYER = 0xC022002D,
+ MD_NTSTATUS_WIN_STATUS_FWP_CONTEXT_INCOMPATIBLE_WITH_LAYER = 0xC022002E,
+ MD_NTSTATUS_WIN_STATUS_FWP_CONTEXT_INCOMPATIBLE_WITH_CALLOUT = 0xC022002F,
+ MD_NTSTATUS_WIN_STATUS_FWP_INCOMPATIBLE_AUTH_METHOD = 0xC0220030,
+ MD_NTSTATUS_WIN_STATUS_FWP_INCOMPATIBLE_DH_GROUP = 0xC0220031,
+ MD_NTSTATUS_WIN_STATUS_FWP_EM_NOT_SUPPORTED = 0xC0220032,
+ MD_NTSTATUS_WIN_STATUS_FWP_NEVER_MATCH = 0xC0220033,
+ MD_NTSTATUS_WIN_STATUS_FWP_PROVIDER_CONTEXT_MISMATCH = 0xC0220034,
+ MD_NTSTATUS_WIN_STATUS_FWP_INVALID_PARAMETER = 0xC0220035,
+ MD_NTSTATUS_WIN_STATUS_FWP_TOO_MANY_SUBLAYERS = 0xC0220036,
+ MD_NTSTATUS_WIN_STATUS_FWP_CALLOUT_NOTIFICATION_FAILED = 0xC0220037,
+ MD_NTSTATUS_WIN_STATUS_FWP_INVALID_AUTH_TRANSFORM = 0xC0220038,
+ MD_NTSTATUS_WIN_STATUS_FWP_INVALID_CIPHER_TRANSFORM = 0xC0220039,
+ MD_NTSTATUS_WIN_STATUS_FWP_INCOMPATIBLE_CIPHER_TRANSFORM = 0xC022003A,
+ MD_NTSTATUS_WIN_STATUS_FWP_INVALID_TRANSFORM_COMBINATION = 0xC022003B,
+ MD_NTSTATUS_WIN_STATUS_FWP_DUPLICATE_AUTH_METHOD = 0xC022003C,
+ MD_NTSTATUS_WIN_STATUS_FWP_INVALID_TUNNEL_ENDPOINT = 0xC022003D,
+ MD_NTSTATUS_WIN_STATUS_FWP_L2_DRIVER_NOT_READY = 0xC022003E,
+ MD_NTSTATUS_WIN_STATUS_FWP_KEY_DICTATOR_ALREADY_REGISTERED = 0xC022003F,
+ MD_NTSTATUS_WIN_STATUS_FWP_KEY_DICTATION_INVALID_KEYING_MATERIAL = 0xC0220040,
+ MD_NTSTATUS_WIN_STATUS_FWP_CONNECTIONS_DISABLED = 0xC0220041,
+ MD_NTSTATUS_WIN_STATUS_FWP_INVALID_DNS_NAME = 0xC0220042,
+ MD_NTSTATUS_WIN_STATUS_FWP_STILL_ON = 0xC0220043,
+ MD_NTSTATUS_WIN_STATUS_FWP_IKEEXT_NOT_RUNNING = 0xC0220044,
+ MD_NTSTATUS_WIN_STATUS_FWP_TCPIP_NOT_READY = 0xC0220100,
+ MD_NTSTATUS_WIN_STATUS_FWP_INJECT_HANDLE_CLOSING = 0xC0220101,
+ MD_NTSTATUS_WIN_STATUS_FWP_INJECT_HANDLE_STALE = 0xC0220102,
+ MD_NTSTATUS_WIN_STATUS_FWP_CANNOT_PEND = 0xC0220103,
+ MD_NTSTATUS_WIN_STATUS_FWP_DROP_NOICMP = 0xC0220104,
+ MD_NTSTATUS_WIN_STATUS_NDIS_CLOSING = 0xC0230002,
+ MD_NTSTATUS_WIN_STATUS_NDIS_BAD_VERSION = 0xC0230004,
+ MD_NTSTATUS_WIN_STATUS_NDIS_BAD_CHARACTERISTICS = 0xC0230005,
+ MD_NTSTATUS_WIN_STATUS_NDIS_ADAPTER_NOT_FOUND = 0xC0230006,
+ MD_NTSTATUS_WIN_STATUS_NDIS_OPEN_FAILED = 0xC0230007,
+ MD_NTSTATUS_WIN_STATUS_NDIS_DEVICE_FAILED = 0xC0230008,
+ MD_NTSTATUS_WIN_STATUS_NDIS_MULTICAST_FULL = 0xC0230009,
+ MD_NTSTATUS_WIN_STATUS_NDIS_MULTICAST_EXISTS = 0xC023000A,
+ MD_NTSTATUS_WIN_STATUS_NDIS_MULTICAST_NOT_FOUND = 0xC023000B,
+ MD_NTSTATUS_WIN_STATUS_NDIS_REQUEST_ABORTED = 0xC023000C,
+ MD_NTSTATUS_WIN_STATUS_NDIS_RESET_IN_PROGRESS = 0xC023000D,
+ MD_NTSTATUS_WIN_STATUS_NDIS_INVALID_PACKET = 0xC023000F,
+ MD_NTSTATUS_WIN_STATUS_NDIS_INVALID_DEVICE_REQUEST = 0xC0230010,
+ MD_NTSTATUS_WIN_STATUS_NDIS_ADAPTER_NOT_READY = 0xC0230011,
+ MD_NTSTATUS_WIN_STATUS_NDIS_INVALID_LENGTH = 0xC0230014,
+ MD_NTSTATUS_WIN_STATUS_NDIS_INVALID_DATA = 0xC0230015,
+ MD_NTSTATUS_WIN_STATUS_NDIS_BUFFER_TOO_SHORT = 0xC0230016,
+ MD_NTSTATUS_WIN_STATUS_NDIS_INVALID_OID = 0xC0230017,
+ MD_NTSTATUS_WIN_STATUS_NDIS_ADAPTER_REMOVED = 0xC0230018,
+ MD_NTSTATUS_WIN_STATUS_NDIS_UNSUPPORTED_MEDIA = 0xC0230019,
+ MD_NTSTATUS_WIN_STATUS_NDIS_GROUP_ADDRESS_IN_USE = 0xC023001A,
+ MD_NTSTATUS_WIN_STATUS_NDIS_FILE_NOT_FOUND = 0xC023001B,
+ MD_NTSTATUS_WIN_STATUS_NDIS_ERROR_READING_FILE = 0xC023001C,
+ MD_NTSTATUS_WIN_STATUS_NDIS_ALREADY_MAPPED = 0xC023001D,
+ MD_NTSTATUS_WIN_STATUS_NDIS_RESOURCE_CONFLICT = 0xC023001E,
+ MD_NTSTATUS_WIN_STATUS_NDIS_MEDIA_DISCONNECTED = 0xC023001F,
+ MD_NTSTATUS_WIN_STATUS_NDIS_INVALID_ADDRESS = 0xC0230022,
+ MD_NTSTATUS_WIN_STATUS_NDIS_PAUSED = 0xC023002A,
+ MD_NTSTATUS_WIN_STATUS_NDIS_INTERFACE_NOT_FOUND = 0xC023002B,
+ MD_NTSTATUS_WIN_STATUS_NDIS_UNSUPPORTED_REVISION = 0xC023002C,
+ MD_NTSTATUS_WIN_STATUS_NDIS_INVALID_PORT = 0xC023002D,
+ MD_NTSTATUS_WIN_STATUS_NDIS_INVALID_PORT_STATE = 0xC023002E,
+ MD_NTSTATUS_WIN_STATUS_NDIS_LOW_POWER_STATE = 0xC023002F,
+ MD_NTSTATUS_WIN_STATUS_NDIS_REINIT_REQUIRED = 0xC0230030,
+ MD_NTSTATUS_WIN_STATUS_NDIS_NOT_SUPPORTED = 0xC02300BB,
+ MD_NTSTATUS_WIN_STATUS_NDIS_OFFLOAD_POLICY = 0xC023100F,
+ MD_NTSTATUS_WIN_STATUS_NDIS_OFFLOAD_CONNECTION_REJECTED = 0xC0231012,
+ MD_NTSTATUS_WIN_STATUS_NDIS_OFFLOAD_PATH_REJECTED = 0xC0231013,
+ MD_NTSTATUS_WIN_STATUS_NDIS_DOT11_AUTO_CONFIG_ENABLED = 0xC0232000,
+ MD_NTSTATUS_WIN_STATUS_NDIS_DOT11_MEDIA_IN_USE = 0xC0232001,
+ MD_NTSTATUS_WIN_STATUS_NDIS_DOT11_POWER_STATE_INVALID = 0xC0232002,
+ MD_NTSTATUS_WIN_STATUS_NDIS_PM_WOL_PATTERN_LIST_FULL = 0xC0232003,
+ MD_NTSTATUS_WIN_STATUS_NDIS_PM_PROTOCOL_OFFLOAD_LIST_FULL = 0xC0232004,
+ MD_NTSTATUS_WIN_STATUS_TPM_ERROR_MASK = 0xC0290000,
+ MD_NTSTATUS_WIN_STATUS_TPM_AUTHFAIL = 0xC0290001,
+ MD_NTSTATUS_WIN_STATUS_TPM_BADINDEX = 0xC0290002,
+ MD_NTSTATUS_WIN_STATUS_TPM_BAD_PARAMETER = 0xC0290003,
+ MD_NTSTATUS_WIN_STATUS_TPM_AUDITFAILURE = 0xC0290004,
+ MD_NTSTATUS_WIN_STATUS_TPM_CLEAR_DISABLED = 0xC0290005,
+ MD_NTSTATUS_WIN_STATUS_TPM_DEACTIVATED = 0xC0290006,
+ MD_NTSTATUS_WIN_STATUS_TPM_DISABLED = 0xC0290007,
+ MD_NTSTATUS_WIN_STATUS_TPM_DISABLED_CMD = 0xC0290008,
+ MD_NTSTATUS_WIN_STATUS_TPM_FAIL = 0xC0290009,
+ MD_NTSTATUS_WIN_STATUS_TPM_BAD_ORDINAL = 0xC029000A,
+ MD_NTSTATUS_WIN_STATUS_TPM_INSTALL_DISABLED = 0xC029000B,
+ MD_NTSTATUS_WIN_STATUS_TPM_INVALID_KEYHANDLE = 0xC029000C,
+ MD_NTSTATUS_WIN_STATUS_TPM_KEYNOTFOUND = 0xC029000D,
+ MD_NTSTATUS_WIN_STATUS_TPM_INAPPROPRIATE_ENC = 0xC029000E,
+ MD_NTSTATUS_WIN_STATUS_TPM_MIGRATEFAIL = 0xC029000F,
+ MD_NTSTATUS_WIN_STATUS_TPM_INVALID_PCR_INFO = 0xC0290010,
+ MD_NTSTATUS_WIN_STATUS_TPM_NOSPACE = 0xC0290011,
+ MD_NTSTATUS_WIN_STATUS_TPM_NOSRK = 0xC0290012,
+ MD_NTSTATUS_WIN_STATUS_TPM_NOTSEALED_BLOB = 0xC0290013,
+ MD_NTSTATUS_WIN_STATUS_TPM_OWNER_SET = 0xC0290014,
+ MD_NTSTATUS_WIN_STATUS_TPM_RESOURCES = 0xC0290015,
+ MD_NTSTATUS_WIN_STATUS_TPM_SHORTRANDOM = 0xC0290016,
+ MD_NTSTATUS_WIN_STATUS_TPM_SIZE = 0xC0290017,
+ MD_NTSTATUS_WIN_STATUS_TPM_WRONGPCRVAL = 0xC0290018,
+ MD_NTSTATUS_WIN_STATUS_TPM_BAD_PARAM_SIZE = 0xC0290019,
+ MD_NTSTATUS_WIN_STATUS_TPM_SHA_THREAD = 0xC029001A,
+ MD_NTSTATUS_WIN_STATUS_TPM_SHA_ERROR = 0xC029001B,
+ MD_NTSTATUS_WIN_STATUS_TPM_FAILEDSELFTEST = 0xC029001C,
+ MD_NTSTATUS_WIN_STATUS_TPM_AUTH2FAIL = 0xC029001D,
+ MD_NTSTATUS_WIN_STATUS_TPM_BADTAG = 0xC029001E,
+ MD_NTSTATUS_WIN_STATUS_TPM_IOERROR = 0xC029001F,
+ MD_NTSTATUS_WIN_STATUS_TPM_ENCRYPT_ERROR = 0xC0290020,
+ MD_NTSTATUS_WIN_STATUS_TPM_DECRYPT_ERROR = 0xC0290021,
+ MD_NTSTATUS_WIN_STATUS_TPM_INVALID_AUTHHANDLE = 0xC0290022,
+ MD_NTSTATUS_WIN_STATUS_TPM_NO_ENDORSEMENT = 0xC0290023,
+ MD_NTSTATUS_WIN_STATUS_TPM_INVALID_KEYUSAGE = 0xC0290024,
+ MD_NTSTATUS_WIN_STATUS_TPM_WRONG_ENTITYTYPE = 0xC0290025,
+ MD_NTSTATUS_WIN_STATUS_TPM_INVALID_POSTINIT = 0xC0290026,
+ MD_NTSTATUS_WIN_STATUS_TPM_INAPPROPRIATE_SIG = 0xC0290027,
+ MD_NTSTATUS_WIN_STATUS_TPM_BAD_KEY_PROPERTY = 0xC0290028,
+ MD_NTSTATUS_WIN_STATUS_TPM_BAD_MIGRATION = 0xC0290029,
+ MD_NTSTATUS_WIN_STATUS_TPM_BAD_SCHEME = 0xC029002A,
+ MD_NTSTATUS_WIN_STATUS_TPM_BAD_DATASIZE = 0xC029002B,
+ MD_NTSTATUS_WIN_STATUS_TPM_BAD_MODE = 0xC029002C,
+ MD_NTSTATUS_WIN_STATUS_TPM_BAD_PRESENCE = 0xC029002D,
+ MD_NTSTATUS_WIN_STATUS_TPM_BAD_VERSION = 0xC029002E,
+ MD_NTSTATUS_WIN_STATUS_TPM_NO_WRAP_TRANSPORT = 0xC029002F,
+ MD_NTSTATUS_WIN_STATUS_TPM_AUDITFAIL_UNSUCCESSFUL = 0xC0290030,
+ MD_NTSTATUS_WIN_STATUS_TPM_AUDITFAIL_SUCCESSFUL = 0xC0290031,
+ MD_NTSTATUS_WIN_STATUS_TPM_NOTRESETABLE = 0xC0290032,
+ MD_NTSTATUS_WIN_STATUS_TPM_NOTLOCAL = 0xC0290033,
+ MD_NTSTATUS_WIN_STATUS_TPM_BAD_TYPE = 0xC0290034,
+ MD_NTSTATUS_WIN_STATUS_TPM_INVALID_RESOURCE = 0xC0290035,
+ MD_NTSTATUS_WIN_STATUS_TPM_NOTFIPS = 0xC0290036,
+ MD_NTSTATUS_WIN_STATUS_TPM_INVALID_FAMILY = 0xC0290037,
+ MD_NTSTATUS_WIN_STATUS_TPM_NO_NV_PERMISSION = 0xC0290038,
+ MD_NTSTATUS_WIN_STATUS_TPM_REQUIRES_SIGN = 0xC0290039,
+ MD_NTSTATUS_WIN_STATUS_TPM_KEY_NOTSUPPORTED = 0xC029003A,
+ MD_NTSTATUS_WIN_STATUS_TPM_AUTH_CONFLICT = 0xC029003B,
+ MD_NTSTATUS_WIN_STATUS_TPM_AREA_LOCKED = 0xC029003C,
+ MD_NTSTATUS_WIN_STATUS_TPM_BAD_LOCALITY = 0xC029003D,
+ MD_NTSTATUS_WIN_STATUS_TPM_READ_ONLY = 0xC029003E,
+ MD_NTSTATUS_WIN_STATUS_TPM_PER_NOWRITE = 0xC029003F,
+ MD_NTSTATUS_WIN_STATUS_TPM_FAMILYCOUNT = 0xC0290040,
+ MD_NTSTATUS_WIN_STATUS_TPM_WRITE_LOCKED = 0xC0290041,
+ MD_NTSTATUS_WIN_STATUS_TPM_BAD_ATTRIBUTES = 0xC0290042,
+ MD_NTSTATUS_WIN_STATUS_TPM_INVALID_STRUCTURE = 0xC0290043,
+ MD_NTSTATUS_WIN_STATUS_TPM_KEY_OWNER_CONTROL = 0xC0290044,
+ MD_NTSTATUS_WIN_STATUS_TPM_BAD_COUNTER = 0xC0290045,
+ MD_NTSTATUS_WIN_STATUS_TPM_NOT_FULLWRITE = 0xC0290046,
+ MD_NTSTATUS_WIN_STATUS_TPM_CONTEXT_GAP = 0xC0290047,
+ MD_NTSTATUS_WIN_STATUS_TPM_MAXNVWRITES = 0xC0290048,
+ MD_NTSTATUS_WIN_STATUS_TPM_NOOPERATOR = 0xC0290049,
+ MD_NTSTATUS_WIN_STATUS_TPM_RESOURCEMISSING = 0xC029004A,
+ MD_NTSTATUS_WIN_STATUS_TPM_DELEGATE_LOCK = 0xC029004B,
+ MD_NTSTATUS_WIN_STATUS_TPM_DELEGATE_FAMILY = 0xC029004C,
+ MD_NTSTATUS_WIN_STATUS_TPM_DELEGATE_ADMIN = 0xC029004D,
+ MD_NTSTATUS_WIN_STATUS_TPM_TRANSPORT_NOTEXCLUSIVE = 0xC029004E,
+ MD_NTSTATUS_WIN_STATUS_TPM_OWNER_CONTROL = 0xC029004F,
+ MD_NTSTATUS_WIN_STATUS_TPM_DAA_RESOURCES = 0xC0290050,
+ MD_NTSTATUS_WIN_STATUS_TPM_DAA_INPUT_DATA0 = 0xC0290051,
+ MD_NTSTATUS_WIN_STATUS_TPM_DAA_INPUT_DATA1 = 0xC0290052,
+ MD_NTSTATUS_WIN_STATUS_TPM_DAA_ISSUER_SETTINGS = 0xC0290053,
+ MD_NTSTATUS_WIN_STATUS_TPM_DAA_TPM_SETTINGS = 0xC0290054,
+ MD_NTSTATUS_WIN_STATUS_TPM_DAA_STAGE = 0xC0290055,
+ MD_NTSTATUS_WIN_STATUS_TPM_DAA_ISSUER_VALIDITY = 0xC0290056,
+ MD_NTSTATUS_WIN_STATUS_TPM_DAA_WRONG_W = 0xC0290057,
+ MD_NTSTATUS_WIN_STATUS_TPM_BAD_HANDLE = 0xC0290058,
+ MD_NTSTATUS_WIN_STATUS_TPM_BAD_DELEGATE = 0xC0290059,
+ MD_NTSTATUS_WIN_STATUS_TPM_BADCONTEXT = 0xC029005A,
+ MD_NTSTATUS_WIN_STATUS_TPM_TOOMANYCONTEXTS = 0xC029005B,
+ MD_NTSTATUS_WIN_STATUS_TPM_MA_TICKET_SIGNATURE = 0xC029005C,
+ MD_NTSTATUS_WIN_STATUS_TPM_MA_DESTINATION = 0xC029005D,
+ MD_NTSTATUS_WIN_STATUS_TPM_MA_SOURCE = 0xC029005E,
+ MD_NTSTATUS_WIN_STATUS_TPM_MA_AUTHORITY = 0xC029005F,
+ MD_NTSTATUS_WIN_STATUS_TPM_PERMANENTEK = 0xC0290061,
+ MD_NTSTATUS_WIN_STATUS_TPM_BAD_SIGNATURE = 0xC0290062,
+ MD_NTSTATUS_WIN_STATUS_TPM_NOCONTEXTSPACE = 0xC0290063,
+ MD_NTSTATUS_WIN_STATUS_TPM_COMMAND_BLOCKED = 0xC0290400,
+ MD_NTSTATUS_WIN_STATUS_TPM_INVALID_HANDLE = 0xC0290401,
+ MD_NTSTATUS_WIN_STATUS_TPM_DUPLICATE_VHANDLE = 0xC0290402,
+ MD_NTSTATUS_WIN_STATUS_TPM_EMBEDDED_COMMAND_BLOCKED = 0xC0290403,
+ MD_NTSTATUS_WIN_STATUS_TPM_EMBEDDED_COMMAND_UNSUPPORTED = 0xC0290404,
+ MD_NTSTATUS_WIN_STATUS_TPM_RETRY = 0xC0290800,
+ MD_NTSTATUS_WIN_STATUS_TPM_NEEDS_SELFTEST = 0xC0290801,
+ MD_NTSTATUS_WIN_STATUS_TPM_DOING_SELFTEST = 0xC0290802,
+ MD_NTSTATUS_WIN_STATUS_TPM_DEFEND_LOCK_RUNNING = 0xC0290803,
+ MD_NTSTATUS_WIN_STATUS_TPM_COMMAND_CANCELED = 0xC0291001,
+ MD_NTSTATUS_WIN_STATUS_TPM_TOO_MANY_CONTEXTS = 0xC0291002,
+ MD_NTSTATUS_WIN_STATUS_TPM_NOT_FOUND = 0xC0291003,
+ MD_NTSTATUS_WIN_STATUS_TPM_ACCESS_DENIED = 0xC0291004,
+ MD_NTSTATUS_WIN_STATUS_TPM_INSUFFICIENT_BUFFER = 0xC0291005,
+ MD_NTSTATUS_WIN_STATUS_TPM_PPI_FUNCTION_UNSUPPORTED = 0xC0291006,
+ MD_NTSTATUS_WIN_STATUS_PCP_ERROR_MASK = 0xC0292000,
+ MD_NTSTATUS_WIN_STATUS_PCP_DEVICE_NOT_READY = 0xC0292001,
+ MD_NTSTATUS_WIN_STATUS_PCP_INVALID_HANDLE = 0xC0292002,
+ MD_NTSTATUS_WIN_STATUS_PCP_INVALID_PARAMETER = 0xC0292003,
+ MD_NTSTATUS_WIN_STATUS_PCP_FLAG_NOT_SUPPORTED = 0xC0292004,
+ MD_NTSTATUS_WIN_STATUS_PCP_NOT_SUPPORTED = 0xC0292005,
+ MD_NTSTATUS_WIN_STATUS_PCP_BUFFER_TOO_SMALL = 0xC0292006,
+ MD_NTSTATUS_WIN_STATUS_PCP_INTERNAL_ERROR = 0xC0292007,
+ MD_NTSTATUS_WIN_STATUS_PCP_AUTHENTICATION_FAILED = 0xC0292008,
+ MD_NTSTATUS_WIN_STATUS_PCP_AUTHENTICATION_IGNORED = 0xC0292009,
+ MD_NTSTATUS_WIN_STATUS_PCP_POLICY_NOT_FOUND = 0xC029200A,
+ MD_NTSTATUS_WIN_STATUS_PCP_PROFILE_NOT_FOUND = 0xC029200B,
+ MD_NTSTATUS_WIN_STATUS_PCP_VALIDATION_FAILED = 0xC029200C,
+ MD_NTSTATUS_WIN_STATUS_PCP_DEVICE_NOT_FOUND = 0xC029200D,
+ MD_NTSTATUS_WIN_STATUS_HV_INVALID_HYPERCALL_CODE = 0xC0350002,
+ MD_NTSTATUS_WIN_STATUS_HV_INVALID_HYPERCALL_INPUT = 0xC0350003,
+ MD_NTSTATUS_WIN_STATUS_HV_INVALID_ALIGNMENT = 0xC0350004,
+ MD_NTSTATUS_WIN_STATUS_HV_INVALID_PARAMETER = 0xC0350005,
+ MD_NTSTATUS_WIN_STATUS_HV_ACCESS_DENIED = 0xC0350006,
+ MD_NTSTATUS_WIN_STATUS_HV_INVALID_PARTITION_STATE = 0xC0350007,
+ MD_NTSTATUS_WIN_STATUS_HV_OPERATION_DENIED = 0xC0350008,
+ MD_NTSTATUS_WIN_STATUS_HV_UNKNOWN_PROPERTY = 0xC0350009,
+ MD_NTSTATUS_WIN_STATUS_HV_PROPERTY_VALUE_OUT_OF_RANGE = 0xC035000A,
+ MD_NTSTATUS_WIN_STATUS_HV_INSUFFICIENT_MEMORY = 0xC035000B,
+ MD_NTSTATUS_WIN_STATUS_HV_PARTITION_TOO_DEEP = 0xC035000C,
+ MD_NTSTATUS_WIN_STATUS_HV_INVALID_PARTITION_ID = 0xC035000D,
+ MD_NTSTATUS_WIN_STATUS_HV_INVALID_VP_INDEX = 0xC035000E,
+ MD_NTSTATUS_WIN_STATUS_HV_INVALID_PORT_ID = 0xC0350011,
+ MD_NTSTATUS_WIN_STATUS_HV_INVALID_CONNECTION_ID = 0xC0350012,
+ MD_NTSTATUS_WIN_STATUS_HV_INSUFFICIENT_BUFFERS = 0xC0350013,
+ MD_NTSTATUS_WIN_STATUS_HV_NOT_ACKNOWLEDGED = 0xC0350014,
+ MD_NTSTATUS_WIN_STATUS_HV_ACKNOWLEDGED = 0xC0350016,
+ MD_NTSTATUS_WIN_STATUS_HV_INVALID_SAVE_RESTORE_STATE = 0xC0350017,
+ MD_NTSTATUS_WIN_STATUS_HV_INVALID_SYNIC_STATE = 0xC0350018,
+ MD_NTSTATUS_WIN_STATUS_HV_OBJECT_IN_USE = 0xC0350019,
+ MD_NTSTATUS_WIN_STATUS_HV_INVALID_PROXIMITY_DOMAIN_INFO = 0xC035001A,
+ MD_NTSTATUS_WIN_STATUS_HV_NO_DATA = 0xC035001B,
+ MD_NTSTATUS_WIN_STATUS_HV_INACTIVE = 0xC035001C,
+ MD_NTSTATUS_WIN_STATUS_HV_NO_RESOURCES = 0xC035001D,
+ MD_NTSTATUS_WIN_STATUS_HV_FEATURE_UNAVAILABLE = 0xC035001E,
+ MD_NTSTATUS_WIN_STATUS_HV_INSUFFICIENT_BUFFER = 0xC0350033,
+ MD_NTSTATUS_WIN_STATUS_HV_INSUFFICIENT_DEVICE_DOMAINS = 0xC0350038,
+ MD_NTSTATUS_WIN_STATUS_HV_INVALID_LP_INDEX = 0xC0350041,
+ MD_NTSTATUS_WIN_STATUS_HV_NOT_PRESENT = 0xC0351000,
+ MD_NTSTATUS_WIN_STATUS_IPSEC_BAD_SPI = 0xC0360001,
+ MD_NTSTATUS_WIN_STATUS_IPSEC_SA_LIFETIME_EXPIRED = 0xC0360002,
+ MD_NTSTATUS_WIN_STATUS_IPSEC_WRONG_SA = 0xC0360003,
+ MD_NTSTATUS_WIN_STATUS_IPSEC_REPLAY_CHECK_FAILED = 0xC0360004,
+ MD_NTSTATUS_WIN_STATUS_IPSEC_INVALID_PACKET = 0xC0360005,
+ MD_NTSTATUS_WIN_STATUS_IPSEC_INTEGRITY_CHECK_FAILED = 0xC0360006,
+ MD_NTSTATUS_WIN_STATUS_IPSEC_CLEAR_TEXT_DROP = 0xC0360007,
+ MD_NTSTATUS_WIN_STATUS_IPSEC_AUTH_FIREWALL_DROP = 0xC0360008,
+ MD_NTSTATUS_WIN_STATUS_IPSEC_THROTTLE_DROP = 0xC0360009,
+ MD_NTSTATUS_WIN_STATUS_IPSEC_DOSP_BLOCK = 0xC0368000,
+ MD_NTSTATUS_WIN_STATUS_IPSEC_DOSP_RECEIVED_MULTICAST = 0xC0368001,
+ MD_NTSTATUS_WIN_STATUS_IPSEC_DOSP_INVALID_PACKET = 0xC0368002,
+ MD_NTSTATUS_WIN_STATUS_IPSEC_DOSP_STATE_LOOKUP_FAILED = 0xC0368003,
+ MD_NTSTATUS_WIN_STATUS_IPSEC_DOSP_MAX_ENTRIES = 0xC0368004,
+ MD_NTSTATUS_WIN_STATUS_IPSEC_DOSP_KEYMOD_NOT_ALLOWED = 0xC0368005,
+ MD_NTSTATUS_WIN_STATUS_IPSEC_DOSP_MAX_PER_IP_RATELIMIT_QUEUES = 0xC0368006,
+ MD_NTSTATUS_WIN_STATUS_VID_DUPLICATE_HANDLER = 0xC0370001,
+ MD_NTSTATUS_WIN_STATUS_VID_TOO_MANY_HANDLERS = 0xC0370002,
+ MD_NTSTATUS_WIN_STATUS_VID_QUEUE_FULL = 0xC0370003,
+ MD_NTSTATUS_WIN_STATUS_VID_HANDLER_NOT_PRESENT = 0xC0370004,
+ MD_NTSTATUS_WIN_STATUS_VID_INVALID_OBJECT_NAME = 0xC0370005,
+ MD_NTSTATUS_WIN_STATUS_VID_PARTITION_NAME_TOO_LONG = 0xC0370006,
+ MD_NTSTATUS_WIN_STATUS_VID_MESSAGE_QUEUE_NAME_TOO_LONG = 0xC0370007,
+ MD_NTSTATUS_WIN_STATUS_VID_PARTITION_ALREADY_EXISTS = 0xC0370008,
+ MD_NTSTATUS_WIN_STATUS_VID_PARTITION_DOES_NOT_EXIST = 0xC0370009,
+ MD_NTSTATUS_WIN_STATUS_VID_PARTITION_NAME_NOT_FOUND = 0xC037000A,
+ MD_NTSTATUS_WIN_STATUS_VID_MESSAGE_QUEUE_ALREADY_EXISTS = 0xC037000B,
+ MD_NTSTATUS_WIN_STATUS_VID_EXCEEDED_MBP_ENTRY_MAP_LIMIT = 0xC037000C,
+ MD_NTSTATUS_WIN_STATUS_VID_MB_STILL_REFERENCED = 0xC037000D,
+ MD_NTSTATUS_WIN_STATUS_VID_CHILD_GPA_PAGE_SET_CORRUPTED = 0xC037000E,
+ MD_NTSTATUS_WIN_STATUS_VID_INVALID_NUMA_SETTINGS = 0xC037000F,
+ MD_NTSTATUS_WIN_STATUS_VID_INVALID_NUMA_NODE_INDEX = 0xC0370010,
+ MD_NTSTATUS_WIN_STATUS_VID_NOTIFICATION_QUEUE_ALREADY_ASSOCIATED = 0xC0370011,
+ MD_NTSTATUS_WIN_STATUS_VID_INVALID_MEMORY_BLOCK_HANDLE = 0xC0370012,
+ MD_NTSTATUS_WIN_STATUS_VID_PAGE_RANGE_OVERFLOW = 0xC0370013,
+ MD_NTSTATUS_WIN_STATUS_VID_INVALID_MESSAGE_QUEUE_HANDLE = 0xC0370014,
+ MD_NTSTATUS_WIN_STATUS_VID_INVALID_GPA_RANGE_HANDLE = 0xC0370015,
+ MD_NTSTATUS_WIN_STATUS_VID_NO_MEMORY_BLOCK_NOTIFICATION_QUEUE = 0xC0370016,
+ MD_NTSTATUS_WIN_STATUS_VID_MEMORY_BLOCK_LOCK_COUNT_EXCEEDED = 0xC0370017,
+ MD_NTSTATUS_WIN_STATUS_VID_INVALID_PPM_HANDLE = 0xC0370018,
+ MD_NTSTATUS_WIN_STATUS_VID_MBPS_ARE_LOCKED = 0xC0370019,
+ MD_NTSTATUS_WIN_STATUS_VID_MESSAGE_QUEUE_CLOSED = 0xC037001A,
+ MD_NTSTATUS_WIN_STATUS_VID_VIRTUAL_PROCESSOR_LIMIT_EXCEEDED = 0xC037001B,
+ MD_NTSTATUS_WIN_STATUS_VID_STOP_PENDING = 0xC037001C,
+ MD_NTSTATUS_WIN_STATUS_VID_INVALID_PROCESSOR_STATE = 0xC037001D,
+ MD_NTSTATUS_WIN_STATUS_VID_EXCEEDED_KM_CONTEXT_COUNT_LIMIT = 0xC037001E,
+ MD_NTSTATUS_WIN_STATUS_VID_KM_INTERFACE_ALREADY_INITIALIZED = 0xC037001F,
+ MD_NTSTATUS_WIN_STATUS_VID_MB_PROPERTY_ALREADY_SET_RESET = 0xC0370020,
+ MD_NTSTATUS_WIN_STATUS_VID_MMIO_RANGE_DESTROYED = 0xC0370021,
+ MD_NTSTATUS_WIN_STATUS_VID_INVALID_CHILD_GPA_PAGE_SET = 0xC0370022,
+ MD_NTSTATUS_WIN_STATUS_VID_RESERVE_PAGE_SET_IS_BEING_USED = 0xC0370023,
+ MD_NTSTATUS_WIN_STATUS_VID_RESERVE_PAGE_SET_TOO_SMALL = 0xC0370024,
+ MD_NTSTATUS_WIN_STATUS_VID_MBP_ALREADY_LOCKED_USING_RESERVED_PAGE = 0xC0370025,
+ MD_NTSTATUS_WIN_STATUS_VID_MBP_COUNT_EXCEEDED_LIMIT = 0xC0370026,
+ MD_NTSTATUS_WIN_STATUS_VID_SAVED_STATE_CORRUPT = 0xC0370027,
+ MD_NTSTATUS_WIN_STATUS_VID_SAVED_STATE_UNRECOGNIZED_ITEM = 0xC0370028,
+ MD_NTSTATUS_WIN_STATUS_VID_SAVED_STATE_INCOMPATIBLE = 0xC0370029,
+ MD_NTSTATUS_WIN_STATUS_VOLMGR_DATABASE_FULL = 0xC0380001,
+ MD_NTSTATUS_WIN_STATUS_VOLMGR_DISK_CONFIGURATION_CORRUPTED = 0xC0380002,
+ MD_NTSTATUS_WIN_STATUS_VOLMGR_DISK_CONFIGURATION_NOT_IN_SYNC = 0xC0380003,
+ MD_NTSTATUS_WIN_STATUS_VOLMGR_PACK_CONFIG_UPDATE_FAILED = 0xC0380004,
+ MD_NTSTATUS_WIN_STATUS_VOLMGR_DISK_CONTAINS_NON_SIMPLE_VOLUME = 0xC0380005,
+ MD_NTSTATUS_WIN_STATUS_VOLMGR_DISK_DUPLICATE = 0xC0380006,
+ MD_NTSTATUS_WIN_STATUS_VOLMGR_DISK_DYNAMIC = 0xC0380007,
+ MD_NTSTATUS_WIN_STATUS_VOLMGR_DISK_ID_INVALID = 0xC0380008,
+ MD_NTSTATUS_WIN_STATUS_VOLMGR_DISK_INVALID = 0xC0380009,
+ MD_NTSTATUS_WIN_STATUS_VOLMGR_DISK_LAST_VOTER = 0xC038000A,
+ MD_NTSTATUS_WIN_STATUS_VOLMGR_DISK_LAYOUT_INVALID = 0xC038000B,
+ MD_NTSTATUS_WIN_STATUS_VOLMGR_DISK_LAYOUT_NON_BASIC_BETWEEN_BASIC_PARTITIONS = 0xC038000C,
+ MD_NTSTATUS_WIN_STATUS_VOLMGR_DISK_LAYOUT_NOT_CYLINDER_ALIGNED = 0xC038000D,
+ MD_NTSTATUS_WIN_STATUS_VOLMGR_DISK_LAYOUT_PARTITIONS_TOO_SMALL = 0xC038000E,
+ MD_NTSTATUS_WIN_STATUS_VOLMGR_DISK_LAYOUT_PRIMARY_BETWEEN_LOGICAL_PARTITIONS = 0xC038000F,
+ MD_NTSTATUS_WIN_STATUS_VOLMGR_DISK_LAYOUT_TOO_MANY_PARTITIONS = 0xC0380010,
+ MD_NTSTATUS_WIN_STATUS_VOLMGR_DISK_MISSING = 0xC0380011,
+ MD_NTSTATUS_WIN_STATUS_VOLMGR_DISK_NOT_EMPTY = 0xC0380012,
+ MD_NTSTATUS_WIN_STATUS_VOLMGR_DISK_NOT_ENOUGH_SPACE = 0xC0380013,
+ MD_NTSTATUS_WIN_STATUS_VOLMGR_DISK_REVECTORING_FAILED = 0xC0380014,
+ MD_NTSTATUS_WIN_STATUS_VOLMGR_DISK_SECTOR_SIZE_INVALID = 0xC0380015,
+ MD_NTSTATUS_WIN_STATUS_VOLMGR_DISK_SET_NOT_CONTAINED = 0xC0380016,
+ MD_NTSTATUS_WIN_STATUS_VOLMGR_DISK_USED_BY_MULTIPLE_MEMBERS = 0xC0380017,
+ MD_NTSTATUS_WIN_STATUS_VOLMGR_DISK_USED_BY_MULTIPLE_PLEXES = 0xC0380018,
+ MD_NTSTATUS_WIN_STATUS_VOLMGR_DYNAMIC_DISK_NOT_SUPPORTED = 0xC0380019,
+ MD_NTSTATUS_WIN_STATUS_VOLMGR_EXTENT_ALREADY_USED = 0xC038001A,
+ MD_NTSTATUS_WIN_STATUS_VOLMGR_EXTENT_NOT_CONTIGUOUS = 0xC038001B,
+ MD_NTSTATUS_WIN_STATUS_VOLMGR_EXTENT_NOT_IN_PUBLIC_REGION = 0xC038001C,
+ MD_NTSTATUS_WIN_STATUS_VOLMGR_EXTENT_NOT_SECTOR_ALIGNED = 0xC038001D,
+ MD_NTSTATUS_WIN_STATUS_VOLMGR_EXTENT_OVERLAPS_EBR_PARTITION = 0xC038001E,
+ MD_NTSTATUS_WIN_STATUS_VOLMGR_EXTENT_VOLUME_LENGTHS_DO_NOT_MATCH = 0xC038001F,
+ MD_NTSTATUS_WIN_STATUS_VOLMGR_FAULT_TOLERANT_NOT_SUPPORTED = 0xC0380020,
+ MD_NTSTATUS_WIN_STATUS_VOLMGR_INTERLEAVE_LENGTH_INVALID = 0xC0380021,
+ MD_NTSTATUS_WIN_STATUS_VOLMGR_MAXIMUM_REGISTERED_USERS = 0xC0380022,
+ MD_NTSTATUS_WIN_STATUS_VOLMGR_MEMBER_IN_SYNC = 0xC0380023,
+ MD_NTSTATUS_WIN_STATUS_VOLMGR_MEMBER_INDEX_DUPLICATE = 0xC0380024,
+ MD_NTSTATUS_WIN_STATUS_VOLMGR_MEMBER_INDEX_INVALID = 0xC0380025,
+ MD_NTSTATUS_WIN_STATUS_VOLMGR_MEMBER_MISSING = 0xC0380026,
+ MD_NTSTATUS_WIN_STATUS_VOLMGR_MEMBER_NOT_DETACHED = 0xC0380027,
+ MD_NTSTATUS_WIN_STATUS_VOLMGR_MEMBER_REGENERATING = 0xC0380028,
+ MD_NTSTATUS_WIN_STATUS_VOLMGR_ALL_DISKS_FAILED = 0xC0380029,
+ MD_NTSTATUS_WIN_STATUS_VOLMGR_NO_REGISTERED_USERS = 0xC038002A,
+ MD_NTSTATUS_WIN_STATUS_VOLMGR_NO_SUCH_USER = 0xC038002B,
+ MD_NTSTATUS_WIN_STATUS_VOLMGR_NOTIFICATION_RESET = 0xC038002C,
+ MD_NTSTATUS_WIN_STATUS_VOLMGR_NUMBER_OF_MEMBERS_INVALID = 0xC038002D,
+ MD_NTSTATUS_WIN_STATUS_VOLMGR_NUMBER_OF_PLEXES_INVALID = 0xC038002E,
+ MD_NTSTATUS_WIN_STATUS_VOLMGR_PACK_DUPLICATE = 0xC038002F,
+ MD_NTSTATUS_WIN_STATUS_VOLMGR_PACK_ID_INVALID = 0xC0380030,
+ MD_NTSTATUS_WIN_STATUS_VOLMGR_PACK_INVALID = 0xC0380031,
+ MD_NTSTATUS_WIN_STATUS_VOLMGR_PACK_NAME_INVALID = 0xC0380032,
+ MD_NTSTATUS_WIN_STATUS_VOLMGR_PACK_OFFLINE = 0xC0380033,
+ MD_NTSTATUS_WIN_STATUS_VOLMGR_PACK_HAS_QUORUM = 0xC0380034,
+ MD_NTSTATUS_WIN_STATUS_VOLMGR_PACK_WITHOUT_QUORUM = 0xC0380035,
+ MD_NTSTATUS_WIN_STATUS_VOLMGR_PARTITION_STYLE_INVALID = 0xC0380036,
+ MD_NTSTATUS_WIN_STATUS_VOLMGR_PARTITION_UPDATE_FAILED = 0xC0380037,
+ MD_NTSTATUS_WIN_STATUS_VOLMGR_PLEX_IN_SYNC = 0xC0380038,
+ MD_NTSTATUS_WIN_STATUS_VOLMGR_PLEX_INDEX_DUPLICATE = 0xC0380039,
+ MD_NTSTATUS_WIN_STATUS_VOLMGR_PLEX_INDEX_INVALID = 0xC038003A,
+ MD_NTSTATUS_WIN_STATUS_VOLMGR_PLEX_LAST_ACTIVE = 0xC038003B,
+ MD_NTSTATUS_WIN_STATUS_VOLMGR_PLEX_MISSING = 0xC038003C,
+ MD_NTSTATUS_WIN_STATUS_VOLMGR_PLEX_REGENERATING = 0xC038003D,
+ MD_NTSTATUS_WIN_STATUS_VOLMGR_PLEX_TYPE_INVALID = 0xC038003E,
+ MD_NTSTATUS_WIN_STATUS_VOLMGR_PLEX_NOT_RAID5 = 0xC038003F,
+ MD_NTSTATUS_WIN_STATUS_VOLMGR_PLEX_NOT_SIMPLE = 0xC0380040,
+ MD_NTSTATUS_WIN_STATUS_VOLMGR_STRUCTURE_SIZE_INVALID = 0xC0380041,
+ MD_NTSTATUS_WIN_STATUS_VOLMGR_TOO_MANY_NOTIFICATION_REQUESTS = 0xC0380042,
+ MD_NTSTATUS_WIN_STATUS_VOLMGR_TRANSACTION_IN_PROGRESS = 0xC0380043,
+ MD_NTSTATUS_WIN_STATUS_VOLMGR_UNEXPECTED_DISK_LAYOUT_CHANGE = 0xC0380044,
+ MD_NTSTATUS_WIN_STATUS_VOLMGR_VOLUME_CONTAINS_MISSING_DISK = 0xC0380045,
+ MD_NTSTATUS_WIN_STATUS_VOLMGR_VOLUME_ID_INVALID = 0xC0380046,
+ MD_NTSTATUS_WIN_STATUS_VOLMGR_VOLUME_LENGTH_INVALID = 0xC0380047,
+ MD_NTSTATUS_WIN_STATUS_VOLMGR_VOLUME_LENGTH_NOT_SECTOR_SIZE_MULTIPLE = 0xC0380048,
+ MD_NTSTATUS_WIN_STATUS_VOLMGR_VOLUME_NOT_MIRRORED = 0xC0380049,
+ MD_NTSTATUS_WIN_STATUS_VOLMGR_VOLUME_NOT_RETAINED = 0xC038004A,
+ MD_NTSTATUS_WIN_STATUS_VOLMGR_VOLUME_OFFLINE = 0xC038004B,
+ MD_NTSTATUS_WIN_STATUS_VOLMGR_VOLUME_RETAINED = 0xC038004C,
+ MD_NTSTATUS_WIN_STATUS_VOLMGR_NUMBER_OF_EXTENTS_INVALID = 0xC038004D,
+ MD_NTSTATUS_WIN_STATUS_VOLMGR_DIFFERENT_SECTOR_SIZE = 0xC038004E,
+ MD_NTSTATUS_WIN_STATUS_VOLMGR_BAD_BOOT_DISK = 0xC038004F,
+ MD_NTSTATUS_WIN_STATUS_VOLMGR_PACK_CONFIG_OFFLINE = 0xC0380050,
+ MD_NTSTATUS_WIN_STATUS_VOLMGR_PACK_CONFIG_ONLINE = 0xC0380051,
+ MD_NTSTATUS_WIN_STATUS_VOLMGR_NOT_PRIMARY_PACK = 0xC0380052,
+ MD_NTSTATUS_WIN_STATUS_VOLMGR_PACK_LOG_UPDATE_FAILED = 0xC0380053,
+ MD_NTSTATUS_WIN_STATUS_VOLMGR_NUMBER_OF_DISKS_IN_PLEX_INVALID = 0xC0380054,
+ MD_NTSTATUS_WIN_STATUS_VOLMGR_NUMBER_OF_DISKS_IN_MEMBER_INVALID = 0xC0380055,
+ MD_NTSTATUS_WIN_STATUS_VOLMGR_VOLUME_MIRRORED = 0xC0380056,
+ MD_NTSTATUS_WIN_STATUS_VOLMGR_PLEX_NOT_SIMPLE_SPANNED = 0xC0380057,
+ MD_NTSTATUS_WIN_STATUS_VOLMGR_NO_VALID_LOG_COPIES = 0xC0380058,
+ MD_NTSTATUS_WIN_STATUS_VOLMGR_PRIMARY_PACK_PRESENT = 0xC0380059,
+ MD_NTSTATUS_WIN_STATUS_VOLMGR_NUMBER_OF_DISKS_INVALID = 0xC038005A,
+ MD_NTSTATUS_WIN_STATUS_VOLMGR_MIRROR_NOT_SUPPORTED = 0xC038005B,
+ MD_NTSTATUS_WIN_STATUS_VOLMGR_RAID5_NOT_SUPPORTED = 0xC038005C,
+ MD_NTSTATUS_WIN_STATUS_BCD_TOO_MANY_ELEMENTS = 0xC0390002,
+ MD_NTSTATUS_WIN_STATUS_VHD_DRIVE_FOOTER_MISSING = 0xC03A0001,
+ MD_NTSTATUS_WIN_STATUS_VHD_DRIVE_FOOTER_CHECKSUM_MISMATCH = 0xC03A0002,
+ MD_NTSTATUS_WIN_STATUS_VHD_DRIVE_FOOTER_CORRUPT = 0xC03A0003,
+ MD_NTSTATUS_WIN_STATUS_VHD_FORMAT_UNKNOWN = 0xC03A0004,
+ MD_NTSTATUS_WIN_STATUS_VHD_FORMAT_UNSUPPORTED_VERSION = 0xC03A0005,
+ MD_NTSTATUS_WIN_STATUS_VHD_SPARSE_HEADER_CHECKSUM_MISMATCH = 0xC03A0006,
+ MD_NTSTATUS_WIN_STATUS_VHD_SPARSE_HEADER_UNSUPPORTED_VERSION = 0xC03A0007,
+ MD_NTSTATUS_WIN_STATUS_VHD_SPARSE_HEADER_CORRUPT = 0xC03A0008,
+ MD_NTSTATUS_WIN_STATUS_VHD_BLOCK_ALLOCATION_FAILURE = 0xC03A0009,
+ MD_NTSTATUS_WIN_STATUS_VHD_BLOCK_ALLOCATION_TABLE_CORRUPT = 0xC03A000A,
+ MD_NTSTATUS_WIN_STATUS_VHD_INVALID_BLOCK_SIZE = 0xC03A000B,
+ MD_NTSTATUS_WIN_STATUS_VHD_BITMAP_MISMATCH = 0xC03A000C,
+ MD_NTSTATUS_WIN_STATUS_VHD_PARENT_VHD_NOT_FOUND = 0xC03A000D,
+ MD_NTSTATUS_WIN_STATUS_VHD_CHILD_PARENT_ID_MISMATCH = 0xC03A000E,
+ MD_NTSTATUS_WIN_STATUS_VHD_CHILD_PARENT_TIMESTAMP_MISMATCH = 0xC03A000F,
+ MD_NTSTATUS_WIN_STATUS_VHD_METADATA_READ_FAILURE = 0xC03A0010,
+ MD_NTSTATUS_WIN_STATUS_VHD_METADATA_WRITE_FAILURE = 0xC03A0011,
+ MD_NTSTATUS_WIN_STATUS_VHD_INVALID_SIZE = 0xC03A0012,
+ MD_NTSTATUS_WIN_STATUS_VHD_INVALID_FILE_SIZE = 0xC03A0013,
+ MD_NTSTATUS_WIN_STATUS_VIRTDISK_PROVIDER_NOT_FOUND = 0xC03A0014,
+ MD_NTSTATUS_WIN_STATUS_VIRTDISK_NOT_VIRTUAL_DISK = 0xC03A0015,
+ MD_NTSTATUS_WIN_STATUS_VHD_PARENT_VHD_ACCESS_DENIED = 0xC03A0016,
+ MD_NTSTATUS_WIN_STATUS_VHD_CHILD_PARENT_SIZE_MISMATCH = 0xC03A0017,
+ MD_NTSTATUS_WIN_STATUS_VHD_DIFFERENCING_CHAIN_CYCLE_DETECTED = 0xC03A0018,
+ MD_NTSTATUS_WIN_STATUS_VHD_DIFFERENCING_CHAIN_ERROR_IN_PARENT = 0xC03A0019,
+ MD_NTSTATUS_WIN_STATUS_VIRTUAL_DISK_LIMITATION = 0xC03A001A,
+ MD_NTSTATUS_WIN_STATUS_VHD_INVALID_TYPE = 0xC03A001B,
+ MD_NTSTATUS_WIN_STATUS_VHD_INVALID_STATE = 0xC03A001C,
+ MD_NTSTATUS_WIN_STATUS_VIRTDISK_UNSUPPORTED_DISK_SECTOR_SIZE = 0xC03A001D,
+ MD_NTSTATUS_WIN_STATUS_VIRTDISK_DISK_ALREADY_OWNED = 0xC03A001E,
+ MD_NTSTATUS_WIN_STATUS_VIRTDISK_DISK_ONLINE_AND_WRITABLE = 0xC03A001F,
+ MD_NTSTATUS_WIN_STATUS_CTLOG_TRACKING_NOT_INITIALIZED = 0xC03A0020,
+ MD_NTSTATUS_WIN_STATUS_CTLOG_LOGFILE_SIZE_EXCEEDED_MAXSIZE = 0xC03A0021,
+ MD_NTSTATUS_WIN_STATUS_CTLOG_VHD_CHANGED_OFFLINE = 0xC03A0022,
+ MD_NTSTATUS_WIN_STATUS_CTLOG_INVALID_TRACKING_STATE = 0xC03A0023,
+ MD_NTSTATUS_WIN_STATUS_CTLOG_INCONSISTENT_TRACKING_FILE = 0xC03A0024,
+ MD_NTSTATUS_WIN_STATUS_VHD_METADATA_FULL = 0xC03A0028,
+ MD_NTSTATUS_WIN_STATUS_RKF_KEY_NOT_FOUND = 0xC0400001,
+ MD_NTSTATUS_WIN_STATUS_RKF_DUPLICATE_KEY = 0xC0400002,
+ MD_NTSTATUS_WIN_STATUS_RKF_BLOB_FULL = 0xC0400003,
+ MD_NTSTATUS_WIN_STATUS_RKF_STORE_FULL = 0xC0400004,
+ MD_NTSTATUS_WIN_STATUS_RKF_FILE_BLOCKED = 0xC0400005,
+ MD_NTSTATUS_WIN_STATUS_RKF_ACTIVE_KEY = 0xC0400006,
+ MD_NTSTATUS_WIN_STATUS_RDBSS_RESTART_OPERATION = 0xC0410001,
+ MD_NTSTATUS_WIN_STATUS_RDBSS_CONTINUE_OPERATION = 0xC0410002,
+ MD_NTSTATUS_WIN_STATUS_RDBSS_POST_OPERATION = 0xC0410003,
+ MD_NTSTATUS_WIN_STATUS_BTH_ATT_INVALID_HANDLE = 0xC0420001,
+ MD_NTSTATUS_WIN_STATUS_BTH_ATT_READ_NOT_PERMITTED = 0xC0420002,
+ MD_NTSTATUS_WIN_STATUS_BTH_ATT_WRITE_NOT_PERMITTED = 0xC0420003,
+ MD_NTSTATUS_WIN_STATUS_BTH_ATT_INVALID_PDU = 0xC0420004,
+ MD_NTSTATUS_WIN_STATUS_BTH_ATT_INSUFFICIENT_AUTHENTICATION = 0xC0420005,
+ MD_NTSTATUS_WIN_STATUS_BTH_ATT_REQUEST_NOT_SUPPORTED = 0xC0420006,
+ MD_NTSTATUS_WIN_STATUS_BTH_ATT_INVALID_OFFSET = 0xC0420007,
+ MD_NTSTATUS_WIN_STATUS_BTH_ATT_INSUFFICIENT_AUTHORIZATION = 0xC0420008,
+ MD_NTSTATUS_WIN_STATUS_BTH_ATT_PREPARE_QUEUE_FULL = 0xC0420009,
+ MD_NTSTATUS_WIN_STATUS_BTH_ATT_ATTRIBUTE_NOT_FOUND = 0xC042000A,
+ MD_NTSTATUS_WIN_STATUS_BTH_ATT_ATTRIBUTE_NOT_LONG = 0xC042000B,
+ MD_NTSTATUS_WIN_STATUS_BTH_ATT_INSUFFICIENT_ENCRYPTION_KEY_SIZE = 0xC042000C,
+ MD_NTSTATUS_WIN_STATUS_BTH_ATT_INVALID_ATTRIBUTE_VALUE_LENGTH = 0xC042000D,
+ MD_NTSTATUS_WIN_STATUS_BTH_ATT_UNLIKELY = 0xC042000E,
+ MD_NTSTATUS_WIN_STATUS_BTH_ATT_INSUFFICIENT_ENCRYPTION = 0xC042000F,
+ MD_NTSTATUS_WIN_STATUS_BTH_ATT_UNSUPPORTED_GROUP_TYPE = 0xC0420010,
+ MD_NTSTATUS_WIN_STATUS_BTH_ATT_INSUFFICIENT_RESOURCES = 0xC0420011,
+ MD_NTSTATUS_WIN_STATUS_BTH_ATT_UNKNOWN_ERROR = 0xC0421000,
+ MD_NTSTATUS_WIN_STATUS_SECUREBOOT_ROLLBACK_DETECTED = 0xC0430001,
+ MD_NTSTATUS_WIN_STATUS_SECUREBOOT_POLICY_VIOLATION = 0xC0430002,
+ MD_NTSTATUS_WIN_STATUS_SECUREBOOT_INVALID_POLICY = 0xC0430003,
+ MD_NTSTATUS_WIN_STATUS_SECUREBOOT_POLICY_PUBLISHER_NOT_FOUND = 0xC0430004,
+ MD_NTSTATUS_WIN_STATUS_SECUREBOOT_POLICY_NOT_SIGNED = 0xC0430005,
+ MD_NTSTATUS_WIN_STATUS_SECUREBOOT_FILE_REPLACED = 0xC0430007,
+ MD_NTSTATUS_WIN_STATUS_AUDIO_ENGINE_NODE_NOT_FOUND = 0xC0440001,
+ MD_NTSTATUS_WIN_STATUS_HDAUDIO_EMPTY_CONNECTION_LIST = 0xC0440002,
+ MD_NTSTATUS_WIN_STATUS_HDAUDIO_CONNECTION_LIST_NOT_SUPPORTED = 0xC0440003,
+ MD_NTSTATUS_WIN_STATUS_HDAUDIO_NO_LOGICAL_DEVICES_CREATED = 0xC0440004,
+ MD_NTSTATUS_WIN_STATUS_HDAUDIO_NULL_LINKED_LIST_ENTRY = 0xC0440005,
+ MD_NTSTATUS_WIN_STATUS_VOLSNAP_BOOTFILE_NOT_VALID = 0xC0500003,
+ MD_NTSTATUS_WIN_STATUS_IO_PREEMPTED = 0xC0510001,
+ MD_NTSTATUS_WIN_STATUS_SVHDX_ERROR_STORED = 0xC05C0000,
+ MD_NTSTATUS_WIN_STATUS_SVHDX_ERROR_NOT_AVAILABLE = 0xC05CFF00,
+ MD_NTSTATUS_WIN_STATUS_SVHDX_UNIT_ATTENTION_AVAILABLE = 0xC05CFF01,
+ MD_NTSTATUS_WIN_STATUS_SVHDX_UNIT_ATTENTION_CAPACITY_DATA_CHANGED = 0xC05CFF02,
+ MD_NTSTATUS_WIN_STATUS_SVHDX_UNIT_ATTENTION_RESERVATIONS_PREEMPTED = 0xC05CFF03,
+ MD_NTSTATUS_WIN_STATUS_SVHDX_UNIT_ATTENTION_RESERVATIONS_RELEASED = 0xC05CFF04,
+ MD_NTSTATUS_WIN_STATUS_SVHDX_UNIT_ATTENTION_REGISTRATIONS_PREEMPTED = 0xC05CFF05,
+ MD_NTSTATUS_WIN_STATUS_SVHDX_UNIT_ATTENTION_OPERATING_DEFINITION_CHANGED = 0xC05CFF06,
+ MD_NTSTATUS_WIN_STATUS_SVHDX_RESERVATION_CONFLICT = 0xC05CFF07,
+ MD_NTSTATUS_WIN_STATUS_SVHDX_WRONG_FILE_TYPE = 0xC05CFF08,
+ MD_NTSTATUS_WIN_STATUS_SVHDX_VERSION_MISMATCH = 0xC05CFF09,
+ MD_NTSTATUS_WIN_STATUS_VHD_SHARED = 0xC05CFF0A,
+ MD_NTSTATUS_WIN_STATUS_SPACES_RESILIENCY_TYPE_INVALID = 0xC0E70003,
+ MD_NTSTATUS_WIN_STATUS_SPACES_DRIVE_SECTOR_SIZE_INVALID = 0xC0E70004,
+ MD_NTSTATUS_WIN_STATUS_SPACES_INTERLEAVE_LENGTH_INVALID = 0xC0E70009,
+ MD_NTSTATUS_WIN_STATUS_SPACES_NUMBER_OF_COLUMNS_INVALID = 0xC0E7000A,
+ MD_NTSTATUS_WIN_STATUS_SPACES_NOT_ENOUGH_DRIVES = 0xC0E7000B
+} MDNTStatusCodeWin;
+
// These constants are defined in the MSDN documentation of
// the EXCEPTION_RECORD structure.
typedef enum {
@@ -113,4 +2258,12 @@ typedef enum {
MD_ACCESS_VIOLATION_WIN_EXEC = 8
} MDAccessViolationTypeWin;
+// These constants are defined in the MSDN documentation of
+// the EXCEPTION_RECORD structure.
+typedef enum {
+ MD_IN_PAGE_ERROR_WIN_READ = 0,
+ MD_IN_PAGE_ERROR_WIN_WRITE = 1,
+ MD_IN_PAGE_ERROR_WIN_EXEC = 8
+} MDInPageErrorTypeWin;
+
#endif /* GOOGLE_BREAKPAD_COMMON_MINIDUMP_EXCEPTION_WIN32_H__ */
diff --git a/3rdParty/Breakpad/src/google_breakpad/common/minidump_format.h b/3rdParty/Breakpad/src/google_breakpad/common/minidump_format.h
index 28a81d4..225433b 100644
--- a/3rdParty/Breakpad/src/google_breakpad/common/minidump_format.h
+++ b/3rdParty/Breakpad/src/google_breakpad/common/minidump_format.h
@@ -79,10 +79,10 @@
*/
typedef struct {
- u_int32_t data1;
- u_int16_t data2;
- u_int16_t data3;
- u_int8_t data4[8];
+ uint32_t data1;
+ uint16_t data2;
+ uint16_t data3;
+ uint8_t data4[8];
} MDGUID; /* GUID */
@@ -97,7 +97,6 @@ typedef struct {
#define MD_CONTEXT_IA64 0x00080000 /* CONTEXT_IA64 */
/* Additional values from winnt.h in the Windows CE 5.0 SDK: */
#define MD_CONTEXT_SHX 0x000000c0 /* CONTEXT_SH4 (Super-H, includes SH3) */
-#define MD_CONTEXT_MIPS 0x00010000 /* CONTEXT_R4000 (same value as x86?) */
#define MD_CONTEXT_ALPHA 0x00020000 /* CONTEXT_ALPHA */
/* As of Windows 7 SP1, the number of flag bits has increased to
@@ -110,11 +109,13 @@ typedef struct {
* structure should never be allocated directly. The actual structure type
* can be determined by examining the context_flags field. */
typedef struct {
- u_int32_t context_flags;
+ uint32_t context_flags;
} MDRawContextBase;
#include "minidump_cpu_amd64.h"
#include "minidump_cpu_arm.h"
+#include "minidump_cpu_arm64.h"
+#include "minidump_cpu_mips.h"
#include "minidump_cpu_ppc.h"
#include "minidump_cpu_ppc64.h"
#include "minidump_cpu_sparc.h"
@@ -126,19 +127,19 @@ typedef struct {
typedef struct {
- u_int32_t signature;
- u_int32_t struct_version;
- u_int32_t file_version_hi;
- u_int32_t file_version_lo;
- u_int32_t product_version_hi;
- u_int32_t product_version_lo;
- u_int32_t file_flags_mask; /* Identifies valid bits in fileFlags */
- u_int32_t file_flags;
- u_int32_t file_os;
- u_int32_t file_type;
- u_int32_t file_subtype;
- u_int32_t file_date_hi;
- u_int32_t file_date_lo;
+ uint32_t signature;
+ uint32_t struct_version;
+ uint32_t file_version_hi;
+ uint32_t file_version_lo;
+ uint32_t product_version_hi;
+ uint32_t product_version_lo;
+ uint32_t file_flags_mask; /* Identifies valid bits in fileFlags */
+ uint32_t file_flags;
+ uint32_t file_os;
+ uint32_t file_type;
+ uint32_t file_subtype;
+ uint32_t file_date_hi;
+ uint32_t file_date_lo;
} MDVSFixedFileInfo; /* VS_FIXEDFILEINFO */
/* For (MDVSFixedFileInfo).signature */
@@ -231,10 +232,10 @@ typedef struct {
/* An MDRVA is an offset into the minidump file. The beginning of the
* MDRawHeader is at offset 0. */
-typedef u_int32_t MDRVA; /* RVA */
+typedef uint32_t MDRVA; /* RVA */
typedef struct {
- u_int32_t data_size;
+ uint32_t data_size;
MDRVA rva;
} MDLocationDescriptor; /* MINIDUMP_LOCATION_DESCRIPTOR */
@@ -242,22 +243,22 @@ typedef struct {
typedef struct {
/* The base address of the memory range on the host that produced the
* minidump. */
- u_int64_t start_of_memory_range;
+ uint64_t start_of_memory_range;
MDLocationDescriptor memory;
} MDMemoryDescriptor; /* MINIDUMP_MEMORY_DESCRIPTOR */
typedef struct {
- u_int32_t signature;
- u_int32_t version;
- u_int32_t stream_count;
+ uint32_t signature;
+ uint32_t version;
+ uint32_t stream_count;
MDRVA stream_directory_rva; /* A |stream_count|-sized array of
* MDRawDirectory structures. */
- u_int32_t checksum; /* Can be 0. In fact, that's all that's
+ uint32_t checksum; /* Can be 0. In fact, that's all that's
* been found in minidump files. */
- u_int32_t time_date_stamp; /* time_t */
- u_int64_t flags;
+ uint32_t time_date_stamp; /* time_t */
+ uint64_t flags;
} MDRawHeader; /* MINIDUMP_HEADER */
/* For (MDRawHeader).signature and (MDRawHeader).version. Note that only the
@@ -302,7 +303,7 @@ typedef enum {
typedef struct {
- u_int32_t stream_type;
+ uint32_t stream_type;
MDLocationDescriptor location;
} MDRawDirectory; /* MINIDUMP_DIRECTORY */
@@ -327,6 +328,10 @@ typedef enum {
MD_MEMORY_INFO_LIST_STREAM = 16, /* MDRawMemoryInfoList */
MD_THREAD_INFO_LIST_STREAM = 17,
MD_HANDLE_OPERATION_LIST_STREAM = 18,
+ MD_TOKEN_STREAM = 19,
+ MD_JAVASCRIPT_DATA_STREAM = 20,
+ MD_SYSTEM_MEMORY_INFO_STREAM = 21,
+ MD_PROCESS_VM_COUNTERS_STREAM = 22,
MD_LAST_RESERVED_STREAM = 0x0000ffff,
/* Breakpad extension types. 0x4767 = "Gg" */
@@ -341,32 +346,36 @@ typedef enum {
MD_LINUX_ENVIRON = 0x47670007, /* /proc/$x/environ */
MD_LINUX_AUXV = 0x47670008, /* /proc/$x/auxv */
MD_LINUX_MAPS = 0x47670009, /* /proc/$x/maps */
- MD_LINUX_DSO_DEBUG = 0x4767000A /* MDRawDebug */
+ MD_LINUX_DSO_DEBUG = 0x4767000A, /* MDRawDebug{32,64} */
+
+ /* Crashpad extension types. 0x4350 = "CP"
+ * See Crashpad's minidump/minidump_extensions.h. */
+ MD_CRASHPAD_INFO_STREAM = 0x43500001, /* MDRawCrashpadInfo */
} MDStreamType; /* MINIDUMP_STREAM_TYPE */
typedef struct {
- u_int32_t length; /* Length of buffer in bytes (not characters),
- * excluding 0-terminator */
- u_int16_t buffer[1]; /* UTF-16-encoded, 0-terminated */
+ uint32_t length; /* Length of buffer in bytes (not characters),
+ * excluding 0-terminator */
+ uint16_t buffer[1]; /* UTF-16-encoded, 0-terminated */
} MDString; /* MINIDUMP_STRING */
static const size_t MDString_minsize = offsetof(MDString, buffer[0]);
typedef struct {
- u_int32_t thread_id;
- u_int32_t suspend_count;
- u_int32_t priority_class;
- u_int32_t priority;
- u_int64_t teb; /* Thread environment block */
+ uint32_t thread_id;
+ uint32_t suspend_count;
+ uint32_t priority_class;
+ uint32_t priority;
+ uint64_t teb; /* Thread environment block */
MDMemoryDescriptor stack;
MDLocationDescriptor thread_context; /* MDRawContext[CPU] */
} MDRawThread; /* MINIDUMP_THREAD */
typedef struct {
- u_int32_t number_of_threads;
+ uint32_t number_of_threads;
MDRawThread threads[1];
} MDRawThreadList; /* MINIDUMP_THREAD_LIST */
@@ -375,10 +384,10 @@ static const size_t MDRawThreadList_minsize = offsetof(MDRawThreadList,
typedef struct {
- u_int64_t base_of_image;
- u_int32_t size_of_image;
- u_int32_t checksum; /* 0 if unknown */
- u_int32_t time_date_stamp; /* time_t */
+ uint64_t base_of_image;
+ uint32_t size_of_image;
+ uint32_t checksum; /* 0 if unknown */
+ uint32_t time_date_stamp; /* time_t */
MDRVA module_name_rva; /* MDString, pathname or filename */
MDVSFixedFileInfo version_info;
@@ -402,8 +411,8 @@ typedef struct {
* As a workaround, reserved0 and reserved1 are instead defined here as
* four 32-bit quantities. This should be harmless, as there are
* currently no known uses for these fields. */
- u_int32_t reserved0[2];
- u_int32_t reserved1[2];
+ uint32_t reserved0[2];
+ uint32_t reserved1[2];
} MDRawModule; /* MINIDUMP_MODULE */
/* The inclusion of a 64-bit type in MINIDUMP_MODULE forces the struct to
@@ -419,15 +428,15 @@ typedef struct {
* MDCVInfoPDB70 is the expected structure type with recent toolchains. */
typedef struct {
- u_int32_t signature;
- u_int32_t offset; /* Offset to debug data (expect 0 in minidump) */
+ uint32_t signature;
+ uint32_t offset; /* Offset to debug data (expect 0 in minidump) */
} MDCVHeader;
typedef struct {
MDCVHeader cv_header;
- u_int32_t signature; /* time_t debug information created */
- u_int32_t age; /* revision of PDB file */
- u_int8_t pdb_file_name[1]; /* Pathname or filename of PDB file */
+ uint32_t signature; /* time_t debug information created */
+ uint32_t age; /* revision of PDB file */
+ uint8_t pdb_file_name[1]; /* Pathname or filename of PDB file */
} MDCVInfoPDB20;
static const size_t MDCVInfoPDB20_minsize = offsetof(MDCVInfoPDB20,
@@ -436,10 +445,10 @@ static const size_t MDCVInfoPDB20_minsize = offsetof(MDCVInfoPDB20,
#define MD_CVINFOPDB20_SIGNATURE 0x3031424e /* cvHeader.signature = '01BN' */
typedef struct {
- u_int32_t cv_signature;
+ uint32_t cv_signature;
MDGUID signature; /* GUID, identifies PDB file */
- u_int32_t age; /* Identifies incremental changes to PDB file */
- u_int8_t pdb_file_name[1]; /* Pathname or filename of PDB file,
+ uint32_t age; /* Identifies incremental changes to PDB file */
+ uint8_t pdb_file_name[1]; /* Pathname or filename of PDB file,
* 0-terminated 8-bit character data (UTF-8?) */
} MDCVInfoPDB70;
@@ -448,15 +457,26 @@ static const size_t MDCVInfoPDB70_minsize = offsetof(MDCVInfoPDB70,
#define MD_CVINFOPDB70_SIGNATURE 0x53445352 /* cvSignature = 'SDSR' */
+/*
+ * Modern ELF toolchains insert a "build id" into the ELF headers that
+ * usually contains a hash of some ELF headers + sections to uniquely
+ * identify a binary.
+ *
+ * https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/6/html/Developer_Guide/compiling-build-id.html
+ * https://sourceware.org/binutils/docs-2.26/ld/Options.html#index-g_t_002d_002dbuild_002did-292
+ */
typedef struct {
- u_int32_t data1[2];
- u_int32_t data2;
- u_int32_t data3;
- u_int32_t data4;
- u_int32_t data5[3];
- u_int8_t extra[2];
+ uint32_t cv_signature;
+ uint8_t build_id[1]; /* Bytes of build id from GNU_BUILD_ID ELF note.
+ * This is variable-length, but usually 20 bytes
+ * as the binutils ld default is a SHA-1 hash. */
} MDCVInfoELF;
+static const size_t MDCVInfoELF_minsize = offsetof(MDCVInfoELF,
+ build_id[0]);
+
+#define MD_CVINFOELF_SIGNATURE 0x4270454c /* cvSignature = 'BpEL' */
+
/* In addition to the two CodeView record formats above, used for linking
* to external pdb files, it is possible for debugging data to be carried
* directly in the CodeView record itself. These signature values will
@@ -479,12 +499,12 @@ typedef struct {
* obsolete with modules built by recent toolchains. */
typedef struct {
- u_int32_t data_type; /* IMAGE_DEBUG_TYPE_*, not defined here because
+ uint32_t data_type; /* IMAGE_DEBUG_TYPE_*, not defined here because
* this debug record type is mostly obsolete. */
- u_int32_t length; /* Length of entire MDImageDebugMisc structure */
- u_int8_t unicode; /* True if data is multibyte */
- u_int8_t reserved[3];
- u_int8_t data[1];
+ uint32_t length; /* Length of entire MDImageDebugMisc structure */
+ uint8_t unicode; /* True if data is multibyte */
+ uint8_t reserved[3];
+ uint8_t data[1];
} MDImageDebugMisc; /* IMAGE_DEBUG_MISC */
static const size_t MDImageDebugMisc_minsize = offsetof(MDImageDebugMisc,
@@ -492,7 +512,7 @@ static const size_t MDImageDebugMisc_minsize = offsetof(MDImageDebugMisc,
typedef struct {
- u_int32_t number_of_modules;
+ uint32_t number_of_modules;
MDRawModule modules[1];
} MDRawModuleList; /* MINIDUMP_MODULE_LIST */
@@ -501,7 +521,7 @@ static const size_t MDRawModuleList_minsize = offsetof(MDRawModuleList,
typedef struct {
- u_int32_t number_of_memory_ranges;
+ uint32_t number_of_memory_ranges;
MDMemoryDescriptor memory_ranges[1];
} MDRawMemoryList; /* MINIDUMP_MEMORY_LIST */
@@ -512,33 +532,34 @@ static const size_t MDRawMemoryList_minsize = offsetof(MDRawMemoryList,
#define MD_EXCEPTION_MAXIMUM_PARAMETERS 15
typedef struct {
- u_int32_t exception_code; /* Windows: MDExceptionCodeWin,
+ uint32_t exception_code; /* Windows: MDExceptionCodeWin,
* Mac OS X: MDExceptionMac,
* Linux: MDExceptionCodeLinux. */
- u_int32_t exception_flags; /* Windows: 1 if noncontinuable,
+ uint32_t exception_flags; /* Windows: 1 if noncontinuable,
Mac OS X: MDExceptionCodeMac. */
- u_int64_t exception_record; /* Address (in the minidump-producing host's
+ uint64_t exception_record; /* Address (in the minidump-producing host's
* memory) of another MDException, for
* nested exceptions. */
- u_int64_t exception_address; /* The address that caused the exception.
+ uint64_t exception_address; /* The address that caused the exception.
* Mac OS X: exception subcode (which is
* typically the address). */
- u_int32_t number_parameters; /* Number of valid elements in
+ uint32_t number_parameters; /* Number of valid elements in
* exception_information. */
- u_int32_t __align;
- u_int64_t exception_information[MD_EXCEPTION_MAXIMUM_PARAMETERS];
+ uint32_t __align;
+ uint64_t exception_information[MD_EXCEPTION_MAXIMUM_PARAMETERS];
} MDException; /* MINIDUMP_EXCEPTION */
-#include "minidump_exception_win32.h"
-#include "minidump_exception_mac.h"
#include "minidump_exception_linux.h"
+#include "minidump_exception_mac.h"
+#include "minidump_exception_ps3.h"
#include "minidump_exception_solaris.h"
+#include "minidump_exception_win32.h"
typedef struct {
- u_int32_t thread_id; /* Thread in which the exception
+ uint32_t thread_id; /* Thread in which the exception
* occurred. Corresponds to
* (MDRawThread).thread_id. */
- u_int32_t __align;
+ uint32_t __align;
MDException exception_record;
MDLocationDescriptor thread_context; /* MDRawContext[CPU] */
} MDRawExceptionStream; /* MINIDUMP_EXCEPTION_STREAM */
@@ -546,34 +567,63 @@ typedef struct {
typedef union {
struct {
- u_int32_t vendor_id[3]; /* cpuid 0: ebx, edx, ecx */
- u_int32_t version_information; /* cpuid 1: eax */
- u_int32_t feature_information; /* cpuid 1: edx */
- u_int32_t amd_extended_cpu_features; /* cpuid 0x80000001, ebx */
+ uint32_t vendor_id[3]; /* cpuid 0: ebx, edx, ecx */
+ uint32_t version_information; /* cpuid 1: eax */
+ uint32_t feature_information; /* cpuid 1: edx */
+ uint32_t amd_extended_cpu_features; /* cpuid 0x80000001, ebx */
} x86_cpu_info;
struct {
- u_int64_t processor_features[2];
+ uint32_t cpuid;
+ uint32_t elf_hwcaps; /* linux specific, 0 otherwise */
+ } arm_cpu_info;
+ struct {
+ uint64_t processor_features[2];
} other_cpu_info;
} MDCPUInformation; /* CPU_INFORMATION */
+/* For (MDCPUInformation).arm_cpu_info.elf_hwcaps.
+ * This matches the Linux kernel definitions from <asm/hwcaps.h> */
+typedef enum {
+ MD_CPU_ARM_ELF_HWCAP_SWP = (1 << 0),
+ MD_CPU_ARM_ELF_HWCAP_HALF = (1 << 1),
+ MD_CPU_ARM_ELF_HWCAP_THUMB = (1 << 2),
+ MD_CPU_ARM_ELF_HWCAP_26BIT = (1 << 3),
+ MD_CPU_ARM_ELF_HWCAP_FAST_MULT = (1 << 4),
+ MD_CPU_ARM_ELF_HWCAP_FPA = (1 << 5),
+ MD_CPU_ARM_ELF_HWCAP_VFP = (1 << 6),
+ MD_CPU_ARM_ELF_HWCAP_EDSP = (1 << 7),
+ MD_CPU_ARM_ELF_HWCAP_JAVA = (1 << 8),
+ MD_CPU_ARM_ELF_HWCAP_IWMMXT = (1 << 9),
+ MD_CPU_ARM_ELF_HWCAP_CRUNCH = (1 << 10),
+ MD_CPU_ARM_ELF_HWCAP_THUMBEE = (1 << 11),
+ MD_CPU_ARM_ELF_HWCAP_NEON = (1 << 12),
+ MD_CPU_ARM_ELF_HWCAP_VFPv3 = (1 << 13),
+ MD_CPU_ARM_ELF_HWCAP_VFPv3D16 = (1 << 14),
+ MD_CPU_ARM_ELF_HWCAP_TLS = (1 << 15),
+ MD_CPU_ARM_ELF_HWCAP_VFPv4 = (1 << 16),
+ MD_CPU_ARM_ELF_HWCAP_IDIVA = (1 << 17),
+ MD_CPU_ARM_ELF_HWCAP_IDIVT = (1 << 18),
+} MDCPUInformationARMElfHwCaps;
typedef struct {
/* The next 3 fields and numberOfProcessors are from the SYSTEM_INFO
* structure as returned by GetSystemInfo */
- u_int16_t processor_architecture;
- u_int16_t processor_level; /* x86: 5 = 586, 6 = 686, ... */
- u_int16_t processor_revision; /* x86: 0xMMSS, where MM=model,
+ uint16_t processor_architecture;
+ uint16_t processor_level; /* x86: 5 = 586, 6 = 686, ... */
+ /* ARM: 6 = ARMv6, 7 = ARMv7 ... */
+ uint16_t processor_revision; /* x86: 0xMMSS, where MM=model,
* SS=stepping */
+ /* ARM: 0 */
- u_int8_t number_of_processors;
- u_int8_t product_type; /* Windows: VER_NT_* from WinNT.h */
+ uint8_t number_of_processors;
+ uint8_t product_type; /* Windows: VER_NT_* from WinNT.h */
/* The next 5 fields are from the OSVERSIONINFO structure as returned
* by GetVersionEx */
- u_int32_t major_version;
- u_int32_t minor_version;
- u_int32_t build_number;
- u_int32_t platform_id;
+ uint32_t major_version;
+ uint32_t minor_version;
+ uint32_t build_number;
+ uint32_t platform_id;
MDRVA csd_version_rva; /* MDString further identifying the
* host OS.
* Windows: name of the installed OS
@@ -582,8 +632,8 @@ typedef struct {
* (sw_vers -buildVersion).
* Linux: uname -srvmo */
- u_int16_t suite_mask; /* Windows: VER_SUITE_* from WinNT.h */
- u_int16_t reserved2;
+ uint16_t suite_mask; /* Windows: VER_SUITE_* from WinNT.h */
+ uint16_t reserved2;
MDCPUInformation cpu;
} MDRawSystemInfo; /* MINIDUMP_SYSTEM_INFO */
@@ -605,6 +655,9 @@ typedef enum {
MD_CPU_ARCHITECTURE_X86_WIN64 = 10,
/* PROCESSOR_ARCHITECTURE_IA32_ON_WIN64 (WoW64) */
MD_CPU_ARCHITECTURE_SPARC = 0x8001, /* Breakpad-defined value for SPARC */
+ MD_CPU_ARCHITECTURE_PPC64 = 0x8002, /* Breakpad-defined value for PPC64 */
+ MD_CPU_ARCHITECTURE_ARM64 = 0x8003, /* Breakpad-defined value for ARM64 */
+ MD_CPU_ARCHITECTURE_MIPS64 = 0x8004, /* Breakpad-defined value for MIPS64 */
MD_CPU_ARCHITECTURE_UNKNOWN = 0xffff /* PROCESSOR_ARCHITECTURE_UNKNOWN */
} MDCPUArchitecture;
@@ -622,51 +675,221 @@ typedef enum {
MD_OS_IOS = 0x8102, /* iOS */
MD_OS_LINUX = 0x8201, /* Linux */
MD_OS_SOLARIS = 0x8202, /* Solaris */
- MD_OS_ANDROID = 0x8203 /* Android */
+ MD_OS_ANDROID = 0x8203, /* Android */
+ MD_OS_PS3 = 0x8204, /* PS3 */
+ MD_OS_NACL = 0x8205 /* Native Client (NaCl) */
} MDOSPlatform;
+typedef struct {
+ uint64_t base_of_image;
+ uint32_t size_of_image;
+ uint32_t checksum;
+ uint32_t time_date_stamp;
+ MDRVA module_name_rva;
+} MDRawUnloadedModule;
+
+typedef struct {
+ uint32_t size_of_header;
+ uint32_t size_of_entry;
+ uint32_t number_of_entries;
+} MDRawUnloadedModuleList; /* MINIDUMP_UNLOADED_MODULE_LIST */
+
+typedef struct {
+ uint16_t year;
+ uint16_t month;
+ uint16_t day_of_week;
+ uint16_t day;
+ uint16_t hour;
+ uint16_t minute;
+ uint16_t second;
+ uint16_t milliseconds;
+} MDSystemTime; /* SYSTEMTIME */
typedef struct {
- u_int32_t size_of_info; /* Length of entire MDRawMiscInfo structure. */
- u_int32_t flags1;
+ /* Required field. The bias is the difference, in minutes, between
+ * Coordinated Universal Time (UTC) and local time.
+ * Formula: UTC = local time + bias */
+ int32_t bias;
+ /* A description for standard time. For example, "EST" could indicate Eastern
+ * Standard Time. In practice this contains the full time zone names. This
+ * string can be empty. */
+ uint16_t standard_name[32]; /* UTF-16-encoded, 0-terminated */
+ /* A MDSystemTime structure that contains a date and local time when the
+ * transition from daylight saving time to standard time occurs on this
+ * operating system. If the time zone does not support daylight saving time,
+ * the month member in the MDSystemTime structure is zero. */
+ MDSystemTime standard_date;
+ /* The bias value to be used during local time translations that occur during
+ * standard time. */
+ int32_t standard_bias;
+ /* A description for daylight saving time. For example, "PDT" could indicate
+ * Pacific Daylight Time. In practice this contains the full time zone names.
+ * This string can be empty. */
+ uint16_t daylight_name[32]; /* UTF-16-encoded, 0-terminated */
+ /* A MDSystemTime structure that contains a date and local time when the
+ * transition from standard time to daylight saving time occurs on this
+ * operating system. If the time zone does not support daylight saving time,
+ * the month member in the MDSystemTime structure is zero.*/
+ MDSystemTime daylight_date;
+ /* The bias value to be used during local time translations that occur during
+ * daylight saving time. */
+ int32_t daylight_bias;
+} MDTimeZoneInformation; /* TIME_ZONE_INFORMATION */
+
+/* MAX_PATH from windef.h */
+#define MD_MAX_PATH 260
+
+/* For MDXStateConfigFeatureMscInfo.features */
+typedef struct {
+ uint32_t offset;
+ uint32_t size;
+} MDXStateFeature;
+
+/* For MDXStateConfigFeatureMscInfo.enabled_features from winnt.h */
+typedef enum {
+ MD_XSTATE_LEGACY_FLOATING_POINT = 0, /* XSTATE_LEGACY_FLOATING_POINT */
+ MD_XSTATE_LEGACY_SSE = 1, /* XSTATE_LEGACY_SSE */
+ MD_XSTATE_GSSE = 2, /* XSTATE_GSSE */
+ MD_XSTATE_AVX = MD_XSTATE_GSSE, /* XSTATE_AVX */
+ MD_XSTATE_MPX_BNDREGS = 3, /* XSTATE_MPX_BNDREGS */
+ MD_XSTATE_MPX_BNDCSR = 4, /* XSTATE_MPX_BNDCSR */
+ MD_XSTATE_AVX512_KMASK = 5, /* XSTATE_AVX512_KMASK */
+ MD_XSTATE_AVX512_ZMM_H = 6, /* XSTATE_AVX512_ZMM_H */
+ MD_XSTATE_AVX512_ZMM = 7, /* XSTATE_AVX512_ZMM */
+ MD_XSTATE_IPT = 8, /* XSTATE_IPT */
+ MD_XSTATE_LWP = 62 /* XSTATE_LWP */
+} MDXStateFeatureFlag;
+
+/* MAXIMUM_XSTATE_FEATURES from winnt.h */
+#define MD_MAXIMUM_XSTATE_FEATURES 64
+
+/* For MDRawMiscInfo.xstate_data */
+typedef struct {
+ uint32_t size_of_info;
+ uint32_t context_size;
+ /* An entry in the features array is valid only if the corresponding bit in
+ * the enabled_features flag is set. */
+ uint64_t enabled_features;
+ MDXStateFeature features[MD_MAXIMUM_XSTATE_FEATURES];
+} MDXStateConfigFeatureMscInfo;
+
+
+/* The miscellaneous information stream contains a variety
+ * of small pieces of information. A member is valid if
+ * it's within the available size and its corresponding
+ * bit is set. */
+typedef struct {
+ uint32_t size_of_info; /* Length of entire MDRawMiscInfo structure. */
+ uint32_t flags1;
/* The next field is only valid if flags1 contains
* MD_MISCINFO_FLAGS1_PROCESS_ID. */
- u_int32_t process_id;
+ uint32_t process_id;
/* The next 3 fields are only valid if flags1 contains
* MD_MISCINFO_FLAGS1_PROCESS_TIMES. */
- u_int32_t process_create_time; /* time_t process started */
- u_int32_t process_user_time; /* seconds of user CPU time */
- u_int32_t process_kernel_time; /* seconds of kernel CPU time */
+ uint32_t process_create_time; /* time_t process started */
+ uint32_t process_user_time; /* seconds of user CPU time */
+ uint32_t process_kernel_time; /* seconds of kernel CPU time */
/* The following fields are not present in MINIDUMP_MISC_INFO but are
* in MINIDUMP_MISC_INFO_2. When this struct is populated, these values
- * may not be set. Use flags1 or sizeOfInfo to determine whether these
+ * may not be set. Use flags1 and size_of_info to determine whether these
* values are present. These are only valid when flags1 contains
* MD_MISCINFO_FLAGS1_PROCESSOR_POWER_INFO. */
- u_int32_t processor_max_mhz;
- u_int32_t processor_current_mhz;
- u_int32_t processor_mhz_limit;
- u_int32_t processor_max_idle_state;
- u_int32_t processor_current_idle_state;
-} MDRawMiscInfo; /* MINIDUMP_MISC_INFO, MINIDUMP_MISC_INFO2 */
-
-#define MD_MISCINFO_SIZE 24
-#define MD_MISCINFO2_SIZE 44
+ uint32_t processor_max_mhz;
+ uint32_t processor_current_mhz;
+ uint32_t processor_mhz_limit;
+ uint32_t processor_max_idle_state;
+ uint32_t processor_current_idle_state;
+
+ /* The following fields are not present in MINIDUMP_MISC_INFO_2 but are
+ * in MINIDUMP_MISC_INFO_3. When this struct is populated, these values
+ * may not be set. Use flags1 and size_of_info to determine whether these
+ * values are present. */
+
+ /* The following field is only valid if flags1 contains
+ * MD_MISCINFO_FLAGS1_PROCESS_INTEGRITY. */
+ uint32_t process_integrity_level;
+
+ /* The following field is only valid if flags1 contains
+ * MD_MISCINFO_FLAGS1_PROCESS_EXECUTE_FLAGS. */
+ uint32_t process_execute_flags;
+
+ /* The following field is only valid if flags1 contains
+ * MD_MISCINFO_FLAGS1_PROTECTED_PROCESS. */
+ uint32_t protected_process;
+
+ /* The following 2 fields are only valid if flags1 contains
+ * MD_MISCINFO_FLAGS1_TIMEZONE. */
+ uint32_t time_zone_id;
+ MDTimeZoneInformation time_zone;
+
+ /* The following fields are not present in MINIDUMP_MISC_INFO_3 but are
+ * in MINIDUMP_MISC_INFO_4. When this struct is populated, these values
+ * may not be set. Use flags1 and size_of_info to determine whether these
+ * values are present. */
+
+ /* The following 2 fields are only valid if flags1 contains
+ * MD_MISCINFO_FLAGS1_BUILDSTRING. */
+ uint16_t build_string[MD_MAX_PATH]; /* UTF-16-encoded, 0-terminated */
+ uint16_t dbg_bld_str[40]; /* UTF-16-encoded, 0-terminated */
+
+ /* The following fields are not present in MINIDUMP_MISC_INFO_4 but are
+ * in MINIDUMP_MISC_INFO_5. When this struct is populated, these values
+ * may not be set. Use flags1 and size_of_info to determine whether these
+ * values are present. */
+
+ /* The following field has its own flags for establishing the validity of
+ * the structure's contents.*/
+ MDXStateConfigFeatureMscInfo xstate_data;
+
+ /* The following field is only valid if flags1 contains
+ * MD_MISCINFO_FLAGS1_PROCESS_COOKIE. */
+ uint32_t process_cookie;
+} MDRawMiscInfo; /* MINIDUMP_MISC_INFO, MINIDUMP_MISC_INFO_2,
+ * MINIDUMP_MISC_INFO_3, MINIDUMP_MISC_INFO_4,
+ * MINIDUMP_MISC_INFO_5, MINIDUMP_MISC_INFO_N */
+
+static const size_t MD_MISCINFO_SIZE =
+ offsetof(MDRawMiscInfo, processor_max_mhz);
+static const size_t MD_MISCINFO2_SIZE =
+ offsetof(MDRawMiscInfo, process_integrity_level);
+static const size_t MD_MISCINFO3_SIZE =
+ offsetof(MDRawMiscInfo, build_string[0]);
+static const size_t MD_MISCINFO4_SIZE =
+ offsetof(MDRawMiscInfo, xstate_data);
+/* Version 5 of the MDRawMiscInfo structure is not a multiple of 8 in size and
+ * yet it contains some 8-bytes sized fields. This causes many compilers to
+ * round the structure size up to a multiple of 8 by adding padding at the end.
+ * The following hack is thus required for matching the proper on-disk size. */
+static const size_t MD_MISCINFO5_SIZE =
+ offsetof(MDRawMiscInfo, process_cookie) + sizeof(uint32_t);
/* For (MDRawMiscInfo).flags1. These values indicate which fields in the
* MDRawMiscInfoStructure are valid. */
typedef enum {
- MD_MISCINFO_FLAGS1_PROCESS_ID = 0x00000001,
+ MD_MISCINFO_FLAGS1_PROCESS_ID = 0x00000001,
/* MINIDUMP_MISC1_PROCESS_ID */
- MD_MISCINFO_FLAGS1_PROCESS_TIMES = 0x00000002,
+ MD_MISCINFO_FLAGS1_PROCESS_TIMES = 0x00000002,
/* MINIDUMP_MISC1_PROCESS_TIMES */
- MD_MISCINFO_FLAGS1_PROCESSOR_POWER_INFO = 0x00000004
+ MD_MISCINFO_FLAGS1_PROCESSOR_POWER_INFO = 0x00000004,
/* MINIDUMP_MISC1_PROCESSOR_POWER_INFO */
+ MD_MISCINFO_FLAGS1_PROCESS_INTEGRITY = 0x00000010,
+ /* MINIDUMP_MISC3_PROCESS_INTEGRITY */
+ MD_MISCINFO_FLAGS1_PROCESS_EXECUTE_FLAGS = 0x00000020,
+ /* MINIDUMP_MISC3_PROCESS_EXECUTE_FLAGS */
+ MD_MISCINFO_FLAGS1_TIMEZONE = 0x00000040,
+ /* MINIDUMP_MISC3_TIMEZONE */
+ MD_MISCINFO_FLAGS1_PROTECTED_PROCESS = 0x00000080,
+ /* MINIDUMP_MISC3_PROTECTED_PROCESS */
+ MD_MISCINFO_FLAGS1_BUILDSTRING = 0x00000100,
+ /* MINIDUMP_MISC4_BUILDSTRING */
+ MD_MISCINFO_FLAGS1_PROCESS_COOKIE = 0x00000200,
+ /* MINIDUMP_MISC5_PROCESS_COOKIE */
} MDMiscInfoFlags1;
-/*
+/*
* Around DbgHelp version 6.0, the style of new LIST structures changed
* from including an array of length 1 at the end of the struct to
* represent the variable-length data to including explicit
@@ -677,24 +900,24 @@ typedef enum {
*/
typedef struct {
- u_int32_t size_of_header; /* sizeof(MDRawMemoryInfoList) */
- u_int32_t size_of_entry; /* sizeof(MDRawMemoryInfo) */
- u_int64_t number_of_entries;
+ uint32_t size_of_header; /* sizeof(MDRawMemoryInfoList) */
+ uint32_t size_of_entry; /* sizeof(MDRawMemoryInfo) */
+ uint64_t number_of_entries;
} MDRawMemoryInfoList; /* MINIDUMP_MEMORY_INFO_LIST */
typedef struct {
- u_int64_t base_address; /* Base address of a region of pages */
- u_int64_t allocation_base; /* Base address of a range of pages
+ uint64_t base_address; /* Base address of a region of pages */
+ uint64_t allocation_base; /* Base address of a range of pages
* within this region. */
- u_int32_t allocation_protection; /* Memory protection when this region
+ uint32_t allocation_protection; /* Memory protection when this region
* was originally allocated:
* MDMemoryProtection */
- u_int32_t __alignment1;
- u_int64_t region_size;
- u_int32_t state; /* MDMemoryState */
- u_int32_t protection; /* MDMemoryProtection */
- u_int32_t type; /* MDMemoryType */
- u_int32_t __alignment2;
+ uint32_t __alignment1;
+ uint64_t region_size;
+ uint32_t state; /* MDMemoryState */
+ uint32_t protection; /* MDMemoryProtection */
+ uint32_t type; /* MDMemoryType */
+ uint32_t __alignment2;
} MDRawMemoryInfo; /* MINIDUMP_MEMORY_INFO */
/* For (MDRawMemoryInfo).state */
@@ -721,7 +944,7 @@ typedef enum {
} MDMemoryProtection;
/* Used to mask the mutually exclusive options from the combinable flags. */
-const u_int32_t MD_MEMORY_PROTECTION_ACCESS_MASK = 0xFF;
+const uint32_t MD_MEMORY_PROTECTION_ACCESS_MASK = 0xFF;
/* For (MDRawMemoryInfo).type */
typedef enum {
@@ -738,7 +961,7 @@ typedef enum {
typedef struct {
/* validity is a bitmask with values from MDBreakpadInfoValidity, indicating
* which of the other fields in the structure are valid. */
- u_int32_t validity;
+ uint32_t validity;
/* Thread ID of the handler thread. dump_thread_id should correspond to
* the thread_id of an MDRawThread in the minidump's MDRawThreadList if
@@ -746,7 +969,7 @@ typedef struct {
* the MDRawThreadList does not contain a dedicated thread used to produce
* the minidump, this field should be set to 0 and the validity field
* must not contain MD_BREAKPAD_INFO_VALID_DUMP_THREAD_ID. */
- u_int32_t dump_thread_id;
+ uint32_t dump_thread_id;
/* Thread ID of the thread that requested the minidump be produced. As
* with dump_thread_id, requesting_thread_id should correspond to the
@@ -759,7 +982,7 @@ typedef struct {
* other than a thread in the MDRawThreadList, this field should be set
* to 0 and the validity field must not contain
* MD_BREAKPAD_INFO_VALID_REQUESTING_THREAD_ID. */
- u_int32_t requesting_thread_id;
+ uint32_t requesting_thread_id;
} MDRawBreakpadInfo;
/* For (MDRawBreakpadInfo).validity: */
@@ -777,11 +1000,11 @@ typedef struct {
* written to a file.
* Fixed-length strings are used because MiniDumpWriteDump doesn't offer
* a way for user streams to point to arbitrary RVAs for strings. */
- u_int16_t expression[128]; /* Assertion that failed... */
- u_int16_t function[128]; /* ...within this function... */
- u_int16_t file[128]; /* ...in this file... */
- u_int32_t line; /* ...at this line. */
- u_int32_t type;
+ uint16_t expression[128]; /* Assertion that failed... */
+ uint16_t function[128]; /* ...within this function... */
+ uint16_t file[128]; /* ...in this file... */
+ uint32_t line; /* ...at this line. */
+ uint32_t type;
} MDRawAssertionInfo;
/* For (MDRawAssertionInfo).type: */
@@ -798,21 +1021,75 @@ typedef enum {
} MDAssertionInfoData;
/* These structs are used to store the DSO debug data in Linux minidumps,
- * which is necessary for converting minidumps to usable coredumps. */
+ * which is necessary for converting minidumps to usable coredumps.
+ * Because of a historical accident, several fields are variably encoded
+ * according to client word size, so tools potentially need to support both. */
+
typedef struct {
- void* addr;
+ uint32_t addr;
MDRVA name;
- void* ld;
-} MDRawLinkMap;
+ uint32_t ld;
+} MDRawLinkMap32;
+
+typedef struct {
+ uint32_t version;
+ MDRVA map; /* array of MDRawLinkMap32 */
+ uint32_t dso_count;
+ uint32_t brk;
+ uint32_t ldbase;
+ uint32_t dynamic;
+} MDRawDebug32;
+
+typedef struct {
+ uint64_t addr;
+ MDRVA name;
+ uint64_t ld;
+} MDRawLinkMap64;
+
+typedef struct {
+ uint32_t version;
+ MDRVA map; /* array of MDRawLinkMap64 */
+ uint32_t dso_count;
+ uint64_t brk;
+ uint64_t ldbase;
+ uint64_t dynamic;
+} MDRawDebug64;
+
+/* Crashpad extension types. See Crashpad's minidump/minidump_extensions.h. */
+
+typedef struct {
+ MDRVA key;
+ MDRVA value;
+} MDRawSimpleStringDictionaryEntry;
+
+typedef struct {
+ uint32_t count;
+ MDRawSimpleStringDictionaryEntry entries[0];
+} MDRawSimpleStringDictionary;
+
+typedef struct {
+ uint32_t version;
+ MDLocationDescriptor list_annotations;
+ MDLocationDescriptor simple_annotations; /* MDRawSimpleStringDictionary */
+} MDRawModuleCrashpadInfo;
+
+typedef struct {
+ uint32_t minidump_module_list_index;
+ MDLocationDescriptor location; /* MDRawModuleCrashpadInfo */
+} MDRawModuleCrashpadInfoLink;
+
+typedef struct {
+ uint32_t count;
+ MDLocationDescriptor modules[0]; /* MDRawModuleCrashpadInfoLink */
+} MDRawModuleCrashpadInfoList;
typedef struct {
- u_int32_t version;
- MDRVA map;
- u_int32_t dso_count;
- void* brk;
- void* ldbase;
- void* dynamic;
-} MDRawDebug;
+ uint32_t version;
+ MDGUID report_id;
+ MDGUID client_id;
+ MDLocationDescriptor simple_annotations; /* MDRawSimpleStringDictionary */
+ MDLocationDescriptor module_list; /* MDRawModuleCrashpadInfoList */
+} MDRawCrashpadInfo;
#if defined(_MSC_VER)
#pragma warning(pop)
diff --git a/3rdParty/Breakpad/src/google_breakpad/common/minidump_size.h b/3rdParty/Breakpad/src/google_breakpad/common/minidump_size.h
index 918544b..fae5792 100644
--- a/3rdParty/Breakpad/src/google_breakpad/common/minidump_size.h
+++ b/3rdParty/Breakpad/src/google_breakpad/common/minidump_size.h
@@ -76,6 +76,12 @@ class minidump_size<MDCVInfoPDB70> {
};
template<>
+class minidump_size<MDCVInfoELF> {
+ public:
+ static size_t size() { return MDCVInfoELF_minsize; }
+};
+
+template<>
class minidump_size<MDImageDebugMisc> {
public:
static size_t size() { return MDImageDebugMisc_minsize; }
diff --git a/3rdParty/Breakpad/src/processor/scoped_ptr.h b/3rdParty/Breakpad/src/processor/scoped_ptr.h
deleted file mode 100644
index 0d4f7fd..0000000
--- a/3rdParty/Breakpad/src/processor/scoped_ptr.h
+++ /dev/null
@@ -1,335 +0,0 @@
-// (C) Copyright Greg Colvin and Beman Dawes 1998, 1999.
-// Copyright (c) 2001, 2002 Peter Dimov
-//
-// Permission to copy, use, modify, sell and distribute this software
-// is granted provided this copyright notice appears in all copies.
-// This software is provided "as is" without express or implied
-// warranty, and with no claim as to its suitability for any purpose.
-//
-// See http://www.boost.org/libs/smart_ptr/scoped_ptr.htm for documentation.
-//
-
-// scoped_ptr mimics a built-in pointer except that it guarantees deletion
-// of the object pointed to, either on destruction of the scoped_ptr or via
-// an explicit reset(). scoped_ptr is a simple solution for simple needs;
-// use shared_ptr or std::auto_ptr if your needs are more complex.
-
-// *** NOTE ***
-// If your scoped_ptr is a class member of class FOO pointing to a
-// forward declared type BAR (as shown below), then you MUST use a non-inlined
-// version of the destructor. The destructor of a scoped_ptr (called from
-// FOO's destructor) must have a complete definition of BAR in order to
-// destroy it. Example:
-//
-// -- foo.h --
-// class BAR;
-//
-// class FOO {
-// public:
-// FOO();
-// ~FOO(); // Required for sources that instantiate class FOO to compile!
-//
-// private:
-// scoped_ptr<BAR> bar_;
-// };
-//
-// -- foo.cc --
-// #include "foo.h"
-// FOO::~FOO() {} // Empty, but must be non-inlined to FOO's class definition.
-
-// scoped_ptr_malloc added by Google
-// When one of these goes out of scope, instead of doing a delete or
-// delete[], it calls free(). scoped_ptr_malloc<char> is likely to see
-// much more use than any other specializations.
-
-// release() added by Google
-// Use this to conditionally transfer ownership of a heap-allocated object
-// to the caller, usually on method success.
-
-#ifndef PROCESSOR_SCOPED_PTR_H__
-#define PROCESSOR_SCOPED_PTR_H__
-
-#include <cstddef> // for std::ptrdiff_t
-#include <assert.h> // for assert
-#include <stdlib.h> // for free() decl
-
-namespace google_breakpad {
-
-template <typename T>
-class scoped_ptr {
- private:
-
- T* ptr;
-
- scoped_ptr(scoped_ptr const &);
- scoped_ptr & operator=(scoped_ptr const &);
-
- public:
-
- typedef T element_type;
-
- explicit scoped_ptr(T* p = 0): ptr(p) {}
-
- ~scoped_ptr() {
- typedef char type_must_be_complete[sizeof(T)];
- delete ptr;
- }
-
- void reset(T* p = 0) {
- typedef char type_must_be_complete[sizeof(T)];
-
- if (ptr != p) {
- delete ptr;
- ptr = p;
- }
- }
-
- T& operator*() const {
- assert(ptr != 0);
- return *ptr;
- }
-
- T* operator->() const {
- assert(ptr != 0);
- return ptr;
- }
-
- bool operator==(T* p) const {
- return ptr == p;
- }
-
- bool operator!=(T* p) const {
- return ptr != p;
- }
-
- T* get() const {
- return ptr;
- }
-
- void swap(scoped_ptr & b) {
- T* tmp = b.ptr;
- b.ptr = ptr;
- ptr = tmp;
- }
-
- T* release() {
- T* tmp = ptr;
- ptr = 0;
- return tmp;
- }
-
- private:
-
- // no reason to use these: each scoped_ptr should have its own object
- template <typename U> bool operator==(scoped_ptr<U> const& p) const;
- template <typename U> bool operator!=(scoped_ptr<U> const& p) const;
-};
-
-template<typename T> inline
-void swap(scoped_ptr<T>& a, scoped_ptr<T>& b) {
- a.swap(b);
-}
-
-template<typename T> inline
-bool operator==(T* p, const scoped_ptr<T>& b) {
- return p == b.get();
-}
-
-template<typename T> inline
-bool operator!=(T* p, const scoped_ptr<T>& b) {
- return p != b.get();
-}
-
-// scoped_array extends scoped_ptr to arrays. Deletion of the array pointed to
-// is guaranteed, either on destruction of the scoped_array or via an explicit
-// reset(). Use shared_array or std::vector if your needs are more complex.
-
-template<typename T>
-class scoped_array {
- private:
-
- T* ptr;
-
- scoped_array(scoped_array const &);
- scoped_array & operator=(scoped_array const &);
-
- public:
-
- typedef T element_type;
-
- explicit scoped_array(T* p = 0) : ptr(p) {}
-
- ~scoped_array() {
- typedef char type_must_be_complete[sizeof(T)];
- delete[] ptr;
- }
-
- void reset(T* p = 0) {
- typedef char type_must_be_complete[sizeof(T)];
-
- if (ptr != p) {
- delete [] ptr;
- ptr = p;
- }
- }
-
- T& operator[](std::ptrdiff_t i) const {
- assert(ptr != 0);
- assert(i >= 0);
- return ptr[i];
- }
-
- bool operator==(T* p) const {
- return ptr == p;
- }
-
- bool operator!=(T* p) const {
- return ptr != p;
- }
-
- T* get() const {
- return ptr;
- }
-
- void swap(scoped_array & b) {
- T* tmp = b.ptr;
- b.ptr = ptr;
- ptr = tmp;
- }
-
- T* release() {
- T* tmp = ptr;
- ptr = 0;
- return tmp;
- }
-
- private:
-
- // no reason to use these: each scoped_array should have its own object
- template <typename U> bool operator==(scoped_array<U> const& p) const;
- template <typename U> bool operator!=(scoped_array<U> const& p) const;
-};
-
-template<class T> inline
-void swap(scoped_array<T>& a, scoped_array<T>& b) {
- a.swap(b);
-}
-
-template<typename T> inline
-bool operator==(T* p, const scoped_array<T>& b) {
- return p == b.get();
-}
-
-template<typename T> inline
-bool operator!=(T* p, const scoped_array<T>& b) {
- return p != b.get();
-}
-
-
-// This class wraps the c library function free() in a class that can be
-// passed as a template argument to scoped_ptr_malloc below.
-class ScopedPtrMallocFree {
- public:
- inline void operator()(void* x) const {
- free(x);
- }
-};
-
-// scoped_ptr_malloc<> is similar to scoped_ptr<>, but it accepts a
-// second template argument, the functor used to free the object.
-
-template<typename T, typename FreeProc = ScopedPtrMallocFree>
-class scoped_ptr_malloc {
- private:
-
- T* ptr;
-
- scoped_ptr_malloc(scoped_ptr_malloc const &);
- scoped_ptr_malloc & operator=(scoped_ptr_malloc const &);
-
- public:
-
- typedef T element_type;
-
- explicit scoped_ptr_malloc(T* p = 0): ptr(p) {}
-
- ~scoped_ptr_malloc() {
- typedef char type_must_be_complete[sizeof(T)];
- free_((void*) ptr);
- }
-
- void reset(T* p = 0) {
- typedef char type_must_be_complete[sizeof(T)];
-
- if (ptr != p) {
- free_((void*) ptr);
- ptr = p;
- }
- }
-
- T& operator*() const {
- assert(ptr != 0);
- return *ptr;
- }
-
- T* operator->() const {
- assert(ptr != 0);
- return ptr;
- }
-
- bool operator==(T* p) const {
- return ptr == p;
- }
-
- bool operator!=(T* p) const {
- return ptr != p;
- }
-
- T* get() const {
- return ptr;
- }
-
- void swap(scoped_ptr_malloc & b) {
- T* tmp = b.ptr;
- b.ptr = ptr;
- ptr = tmp;
- }
-
- T* release() {
- T* tmp = ptr;
- ptr = 0;
- return tmp;
- }
-
- private:
-
- // no reason to use these: each scoped_ptr_malloc should have its own object
- template <typename U, typename GP>
- bool operator==(scoped_ptr_malloc<U, GP> const& p) const;
- template <typename U, typename GP>
- bool operator!=(scoped_ptr_malloc<U, GP> const& p) const;
-
- static FreeProc const free_;
-};
-
-template<typename T, typename FP>
-FP const scoped_ptr_malloc<T,FP>::free_ = FP();
-
-template<typename T, typename FP> inline
-void swap(scoped_ptr_malloc<T,FP>& a, scoped_ptr_malloc<T,FP>& b) {
- a.swap(b);
-}
-
-template<typename T, typename FP> inline
-bool operator==(T* p, const scoped_ptr_malloc<T,FP>& b) {
- return p == b.get();
-}
-
-template<typename T, typename FP> inline
-bool operator!=(T* p, const scoped_ptr_malloc<T,FP>& b) {
- return p != b.get();
-}
-
-} // namespace google_breakpad
-
-#endif // PROCESSOR_SCOPED_PTR_H__
diff --git a/3rdParty/CppUnit/src/COPYING b/3rdParty/CppUnit/src/COPYING
index b1e3f5a..0a41847 100644
--- a/3rdParty/CppUnit/src/COPYING
+++ b/3rdParty/CppUnit/src/COPYING
@@ -2,7 +2,7 @@
Version 2.1, February 1999
Copyright (C) 1991, 1999 Free Software Foundation, Inc.
- 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
diff --git a/3rdParty/CppUnit/src/include/cppunit/Asserter.h b/3rdParty/CppUnit/src/include/cppunit/Asserter.h
index 94dadaa..3321b87 100644
--- a/3rdParty/CppUnit/src/include/cppunit/Asserter.h
+++ b/3rdParty/CppUnit/src/include/cppunit/Asserter.h
@@ -42,17 +42,24 @@ class Message;
* CPPUNIT_SOURCELINE() )
* \endcode
*/
+
+#if defined __GNUC__
+# define NORETURN __attribute__((noreturn))
+#else
+# define NORETURN
+#endif
+
struct Asserter
{
/*! \brief Throws a Exception with the specified message and location.
*/
- static void CPPUNIT_API fail( const Message &message,
+ NORETURN static void CPPUNIT_API fail( const Message &message,
const SourceLine &sourceLine = SourceLine() );
/*! \brief Throws a Exception with the specified message and location.
* \deprecated Use fail( Message, SourceLine ) instead.
*/
- static void CPPUNIT_API fail( std::string message,
+ NORETURN static void CPPUNIT_API fail( std::string message,
const SourceLine &sourceLine = SourceLine() );
/*! \brief Throws a Exception with the specified message and location.
@@ -76,16 +83,55 @@ struct Asserter
std::string message,
const SourceLine &sourceLine = SourceLine() );
- /*! \brief Returns a expected value string for a message.
+ /*! \brief Returns a expected value string for a message, case equal than
* Typically used to create 'not equal' message, or to check that a message
* contains the expected content when writing unit tests for your custom
* assertions.
*
* \param expectedValue String that represents the expected value.
* \return \a expectedValue prefixed with "Expected: ".
+ * \deprecated Use makeExpectedEqual instead
* \see makeActual().
*/
static std::string CPPUNIT_API makeExpected( const std::string &expectedValue );
+ /*! \brief Returns a expected value string for a message, case equal than
+ * Typically used to create 'not equal' message, or to check that a message
+ * contains the expected content when writing unit tests for your custom
+ * assertions.
+ *
+ * \param expectedValue String that represents the expected value.
+ * \return \a expectedValue prefixed with "Expected: ".
+ * \see makeActual().
+ */
+ static std::string CPPUNIT_API makeExpectedEqual( const std::string &expectedValue );
+ /*! \brief Returns a expected value string for a message, case less than.
+ *
+ * \param expectedValue String that represents the expected value.
+ * \return \a expectedValue prefixed with "Expected less than: ".
+ * \see makeExpectedEqual().
+ */
+ static std::string CPPUNIT_API makeExpectedLess( const std::string &expectedValue );
+ /*! \brief Returns a expected value string for a message, case less or equal than.
+ *
+ * \param expectedValue String that represents the expected value.
+ * \return \a expectedValue prefixed with "Expected: ".
+ * \see makeExpectedEqual().
+ */
+ static std::string CPPUNIT_API makeExpectedLessEqual( const std::string &expectedValue );
+ /*! \brief Returns a expected value string for a message, case greater than.
+ *
+ * \param expectedValue String that represents the expected value.
+ * \return \a expectedValue prefixed with "Expected: ".
+ * \see makeExpectedEqual().
+ */
+ static std::string CPPUNIT_API makeExpectedGreater( const std::string &expectedValue );
+ /*! \brief Returns a expected value string for a message, greater or equal than.
+ *
+ * \param expectedValue String that represents the expected value.
+ * \return \a expectedValue prefixed with "Expected: ".
+ * \see makeExpectedEqual().
+ */
+ static std::string CPPUNIT_API makeExpectedGreaterEqual( const std::string &expectedValue );
/*! \brief Returns an actual value string for a message.
* Typically used to create 'not equal' message, or to check that a message
@@ -98,11 +144,19 @@ struct Asserter
*/
static std::string CPPUNIT_API makeActual( const std::string &actualValue );
+ /*!
+ * \deprecated Use makeMessage instead
+ */
static Message CPPUNIT_API makeNotEqualMessage( const std::string &expectedValue,
const std::string &actualValue,
const AdditionalMessage &additionalMessage = AdditionalMessage(),
const std::string &shortDescription = "equality assertion failed");
+ static Message CPPUNIT_API makeMessage( const std::string &expectedValue,
+ const std::string &actualValue,
+ const std::string &shortDescription,
+ const AdditionalMessage &additionalMessage = AdditionalMessage());
+
/*! \brief Throws an Exception with the specified message and location.
* \param expected Text describing the expected value.
* \param actual Text describing the actual value.
@@ -111,13 +165,68 @@ struct Asserter
* what are the differences between the expected and actual value.
* \param shortDescription Short description for the failure message.
*/
- static void CPPUNIT_API failNotEqual( std::string expected,
+ NORETURN static void CPPUNIT_API failNotEqual( std::string expected,
std::string actual,
const SourceLine &sourceLine,
const AdditionalMessage &additionalMessage = AdditionalMessage(),
std::string shortDescription = "equality assertion failed" );
/*! \brief Throws an Exception with the specified message and location.
+ * \param expected Text describing the expected value.
+ * \param actual Text describing the actual value.
+ * \param sourceLine Location of the assertion.
+ * \param additionalMessage Additional message. Usually used to report
+ * what are the differences between the expected and actual value.
+ * \param shortDescription Short description for the failure message.
+ */
+ static void CPPUNIT_API failNotLess( std::string expected,
+ std::string actual,
+ const SourceLine &sourceLine,
+ const AdditionalMessage &additionalMessage = AdditionalMessage(),
+ std::string shortDescription = "less assertion failed" );
+
+ /*! \brief Throws an Exception with the specified message and location.
+ * \param expected Text describing the expected value.
+ * \param actual Text describing the actual value.
+ * \param sourceLine Location of the assertion.
+ * \param additionalMessage Additional message. Usually used to report
+ * what are the differences between the expected and actual value.
+ * \param shortDescription Short description for the failure message.
+ */
+ static void CPPUNIT_API failNotGreater( std::string expected,
+ std::string actual,
+ const SourceLine &sourceLine,
+ const AdditionalMessage &additionalMessage = AdditionalMessage(),
+ std::string shortDescription = "greater assertion failed" );
+
+ /*! \brief Throws an Exception with the specified message and location.
+ * \param expected Text describing the expected value.
+ * \param actual Text describing the actual value.
+ * \param sourceLine Location of the assertion.
+ * \param additionalMessage Additional message. Usually used to report
+ * what are the differences between the expected and actual value.
+ * \param shortDescription Short description for the failure message.
+ */
+ static void CPPUNIT_API failNotLessEqual( std::string expected,
+ std::string actual,
+ const SourceLine &sourceLine,
+ const AdditionalMessage &additionalMessage = AdditionalMessage(),
+ std::string shortDescription = "less equal assertion failed" );
+
+ /*! \brief Throws an Exception with the specified message and location.
+ * \param expected Text describing the expected value.
+ * \param actual Text describing the actual value.
+ * \param sourceLine Location of the assertion.
+ * \param additionalMessage Additional message. Usually used to report
+ * what are the differences between the expected and actual value.
+ * \param shortDescription Short description for the failure message.
+ */
+ static void CPPUNIT_API failNotGreaterEqual( std::string expected,
+ std::string actual,
+ const SourceLine &sourceLine,
+ const AdditionalMessage &additionalMessage = AdditionalMessage(),
+ std::string shortDescription = "greater equal assertion failed" ); /*! \brief Throws an Exception with the specified message and location.
+
* \param shouldFail if \c true then the exception is thrown. Otherwise
* nothing happen.
* \param expected Text describing the expected value.
diff --git a/3rdParty/CppUnit/src/include/cppunit/Message.h b/3rdParty/CppUnit/src/include/cppunit/Message.h
index 1ae51cc..c3d8d92 100644
--- a/3rdParty/CppUnit/src/include/cppunit/Message.h
+++ b/3rdParty/CppUnit/src/include/cppunit/Message.h
@@ -8,17 +8,13 @@
#pragma warning( disable: 4251 ) // X needs to have dll-interface to be used by clients of class Z
#endif
-#include <cppunit/portability/CppUnitDeque.h>
+#include <deque>
#include <string>
CPPUNIT_NS_BEGIN
-#if CPPUNIT_NEED_DLL_DECL
-// template class CPPUNIT_API std::deque<std::string>;
-#endif
-
/*! \brief Message associated to an Exception.
* \ingroup CreatingNewAssertions
* A message is composed of two items:
@@ -38,7 +34,7 @@ CPPUNIT_NS_BEGIN
class CPPUNIT_API Message
{
public:
- Message();
+ Message() {};
// Ensure thread-safe copy by detaching the string.
Message( const Message &other );
@@ -57,6 +53,8 @@ public:
const std::string &detail2,
const std::string &detail3 );
+ virtual ~Message();
+
Message &operator =( const Message &other );
/*! \brief Returns the short description.
@@ -141,7 +139,7 @@ public:
private:
std::string m_shortDescription;
- typedef CppUnitDeque<std::string> Details;
+ typedef std::deque<std::string> Details;
Details m_details;
};
diff --git a/3rdParty/CppUnit/src/include/cppunit/Portability.h b/3rdParty/CppUnit/src/include/cppunit/Portability.h
index ddf0316..d7c4c11 100644
--- a/3rdParty/CppUnit/src/include/cppunit/Portability.h
+++ b/3rdParty/CppUnit/src/include/cppunit/Portability.h
@@ -20,7 +20,7 @@
// Version number of package
#ifndef CPPUNIT_VERSION
-#define CPPUNIT_VERSION "1.12.0"
+#define CPPUNIT_VERSION "1.14.0"
#endif
#include <cppunit/config/CppUnitApi.h> // define CPPUNIT_API & CPPUNIT_NEED_DLL_DECL
@@ -61,20 +61,6 @@
# endif // !defined(CPPUNIT_NO_STD_NAMESPACE)
#endif // !defined(CPPUNIT_HAVE_NAMESPACES)
-/* Define CPPUNIT_STD_NEED_ALLOCATOR to 1 if you need to specify
- * the allocator you used when instantiating STL container. Typically
- * used for compilers that do not support template default parameter.
- * CPPUNIT_STD_ALLOCATOR will be used as the allocator. Default is
- * std::allocator. On some compilers, you may need to change this to
- * std::allocator<T>.
- */
-#if CPPUNIT_STD_NEED_ALLOCATOR
-# if !defined(CPPUNIT_STD_ALLOCATOR)
-# define CPPUNIT_STD_ALLOCATOR std::allocator
-# endif // !defined(CPPUNIT_STD_ALLOCATOR)
-#endif // defined(CPPUNIT_STD_NEED_ALLOCATOR)
-
-
// Compiler error location format for CompilerOutputter
// If not define, assumes that it's gcc
// See class CompilerOutputter for format.
@@ -162,11 +148,17 @@
/// \internal
#define _CPPUNIT_DO_JOIN2( symbol1, symbol2 ) symbol1##symbol2
+/// \internal Unique suffix for variable name. Can be overridden in platform specific
+/// config-*.h. Default to line number.
+#ifndef CPPUNIT_UNIQUE_COUNTER
+# define CPPUNIT_UNIQUE_COUNTER __LINE__
+#endif
+
/*! Adds the line number to the specified string to create a unique identifier.
* \param prefix Prefix added to the line number to create a unique identifier.
* \see CPPUNIT_TEST_SUITE_REGISTRATION for an example of usage.
*/
-#define CPPUNIT_MAKE_UNIQUE_NAME( prefix ) CPPUNIT_JOIN( prefix, __LINE__ )
+#define CPPUNIT_MAKE_UNIQUE_NAME( prefix ) CPPUNIT_JOIN( prefix, CPPUNIT_UNIQUE_COUNTER )
/*! Defines wrap colunm for %CppUnit. Used by CompilerOuputter.
*/
diff --git a/3rdParty/CppUnit/src/include/cppunit/Protector.h b/3rdParty/CppUnit/src/include/cppunit/Protector.h
index d14e75f..c6d2e7c 100644
--- a/3rdParty/CppUnit/src/include/cppunit/Protector.h
+++ b/3rdParty/CppUnit/src/include/cppunit/Protector.h
@@ -84,6 +84,8 @@ public:
~ProtectorGuard();
private:
+ ProtectorGuard( const ProtectorGuard& ); /* not copyable */
+ ProtectorGuard& operator=( const ProtectorGuard& ); /* not assignable */
TestResult *m_result;
};
diff --git a/3rdParty/CppUnit/src/include/cppunit/SynchronizedObject.h b/3rdParty/CppUnit/src/include/cppunit/SynchronizedObject.h
index 0f7d094..59c3cbb 100644
--- a/3rdParty/CppUnit/src/include/cppunit/SynchronizedObject.h
+++ b/3rdParty/CppUnit/src/include/cppunit/SynchronizedObject.h
@@ -50,15 +50,21 @@ protected:
public:
ExclusiveZone( SynchronizationObject *syncObject )
- : m_syncObject( syncObject )
+ : m_syncObject( syncObject )
{
- m_syncObject->lock();
+ m_syncObject->lock();
}
~ExclusiveZone()
{
- m_syncObject->unlock ();
+ m_syncObject->unlock ();
}
+ private:
+ /// Prevents the use of the copy constructor.
+ ExclusiveZone( const ExclusiveZone& );
+
+ /// Prevents the use of the copy operator.
+ ExclusiveZone& operator=( const ExclusiveZone& );
};
virtual void setSynchronizationObject( SynchronizationObject *syncObject );
diff --git a/3rdParty/CppUnit/src/include/cppunit/TestAssert.h b/3rdParty/CppUnit/src/include/cppunit/TestAssert.h
index f74797b..bb29ac0 100644
--- a/3rdParty/CppUnit/src/include/cppunit/TestAssert.h
+++ b/3rdParty/CppUnit/src/include/cppunit/TestAssert.h
@@ -5,14 +5,20 @@
#include <cppunit/Exception.h>
#include <cppunit/Asserter.h>
#include <cppunit/portability/Stream.h>
+#include <cppunit/tools/StringHelper.h>
#include <stdio.h>
#include <float.h> // For struct assertion_traits<double>
+// Work around "passing 'T' chooses 'int' over 'unsigned int'" warnings when T
+// is an enum type:
+#if defined __GNUC__ && (__GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 6))
+#pragma GCC system_header
+#endif
-CPPUNIT_NS_BEGIN
+CPPUNIT_NS_BEGIN
-/*! \brief Traits used by CPPUNIT_ASSERT_EQUAL().
+/*! \brief Traits used by CPPUNIT_ASSERT* macros.
*
* Here is an example of specialising these traits:
*
@@ -24,7 +30,17 @@ CPPUNIT_NS_BEGIN
* {
* return x == y;
* }
- *
+ *
+ * static bool less( const std::string& x, const std::string& y )
+ * {
+ * return x < y;
+ * }
+ *
+ * static bool lessEqual( const std::string& x, const std::string& y )
+ * {
+ * return x <= y;
+ * }
+ *
* static std::string toString( const std::string& x )
* {
* std::string text = '"' + x + '"'; // adds quote around the string to see whitespace
@@ -43,15 +59,22 @@ struct assertion_traits
return x == y;
}
+ static bool less( const T& x, const T& y )
+ {
+ return x < y;
+ }
+
+ static bool lessEqual( const T& x, const T& y )
+ {
+ return x <= y;
+ }
+
static std::string toString( const T& x )
{
- OStringStream ost;
- ost << x;
- return ost.str();
+ return CPPUNIT_NS::StringHelper::toString(x);
}
};
-
/*! \brief Traits used by CPPUNIT_ASSERT_DOUBLES_EQUAL().
*
* This specialisation from @c struct @c assertion_traits<> ensures that
@@ -68,6 +91,16 @@ struct assertion_traits<double>
return x == y;
}
+ static bool less( double x, double y )
+ {
+ return x < y;
+ }
+
+ static bool lessEqual( double x, double y )
+ {
+ return x <= y;
+ }
+
static std::string toString( double x )
{
#ifdef DBL_DIG
@@ -118,6 +151,82 @@ void CPPUNIT_API assertDoubleEquals( double expected,
const std::string &message );
+/*! \brief (Implementation) Asserts that an object is less than another one of the same type
+ * Use CPPUNIT_ASSERT_LESS, CPPUNIT_ASSERT_GREATER instead of this function.
+ * \sa assertion_traits, Asserter::failNotLess().
+ */
+template <class T>
+void assertLess( const T& expected,
+ const T& actual,
+ SourceLine sourceLine,
+ const std::string& message )
+{
+ if ( !assertion_traits<T>::less(actual,expected) )
+ {
+ Asserter::failNotLess( assertion_traits<T>::toString(expected),
+ assertion_traits<T>::toString(actual),
+ sourceLine,
+ message );
+ }
+}
+
+
+/*! \brief (Implementation) Asserts that an object is less than another one of the same type
+ * Use CPPUNIT_ASSERT_LESS, CPPUNIT_ASSERT_GREATER instead of this function.
+ * \sa assertion_traits, Asserter::failNotLess().
+ */
+template <class T>
+void assertGreater( const T& expected,
+ const T& actual,
+ SourceLine sourceLine,
+ const std::string& message )
+{
+ if ( !assertion_traits<T>::less(expected,actual) )
+ {
+ Asserter::failNotGreater( assertion_traits<T>::toString(expected),
+ assertion_traits<T>::toString(actual),
+ sourceLine,
+ message );
+ }
+}
+
+/*! \brief (Implementation) Asserts that two objects of the same type are equals.
+ * Use CPPUNIT_ASSERT_LESSEQUAL, CPPUNIT_ASSERT_GREATEREQUAL instead of this function.
+ * \sa assertion_traits, Asserter::failNotLessEqual().
+ */
+template <class T>
+void assertLessEqual( const T& expected,
+ const T& actual,
+ SourceLine sourceLine,
+ const std::string& message )
+{
+ if ( !assertion_traits<T>::lessEqual(actual,expected) )
+ {
+ Asserter::failNotLessEqual( assertion_traits<T>::toString(expected),
+ assertion_traits<T>::toString(actual),
+ sourceLine,
+ message );
+ }
+}
+
+/*! \brief (Implementation) Asserts that two objects of the same type are equals.
+ * Use CPPUNIT_ASSERT_LESSEQUAL, CPPUNIT_ASSERT_GREATEREQUAL instead of this function.
+ * \sa assertion_traits, Asserter::failNotLessEqual().
+ */
+template <class T>
+void assertGreaterEqual( const T& expected,
+ const T& actual,
+ SourceLine sourceLine,
+ const std::string& message )
+{
+ if ( !assertion_traits<T>::lessEqual(expected,actual) )
+ {
+ Asserter::failNotGreaterEqual( assertion_traits<T>::toString(expected),
+ assertion_traits<T>::toString(actual),
+ sourceLine,
+ message );
+ }
+}
/* A set of macros which allow us to get the line number
* and file name at the point of an error.
* Just goes to show that preprocessors do have some
@@ -217,6 +326,109 @@ void CPPUNIT_API assertDoubleEquals( double expected,
(message) ) )
#endif
+/** Asserts that actual is less than expected, provides additional message on failure.
+ * \ingroup Assertions
+ *
+ * Less and string representation can be defined with
+ * an appropriate assertion_traits class.
+ *
+ * A diagnostic is printed if actual is less than expected.
+ * The message is printed in addition to the expected and actual value
+ * to provide additional information.
+ *
+ * Requirement for \a expected and \a actual parameters:
+ * - They are exactly of the same type
+ * - They are serializable into a std::strstream using operator <<.
+ * - They can be compared using operator <.
+ *
+ * The last two requirements (serialization and comparison) can be
+ * removed by specializing the CppUnit::assertion_traits.
+ *
+ * \sa CPPUNIT_ASSERT_GREATER
+ */
+#define CPPUNIT_ASSERT_LESS(expected, actual) \
+ ( CPPUNIT_NS::assertLess( (expected), \
+ (actual), \
+ CPPUNIT_SOURCELINE(), \
+ "" ) )
+
+/** Asserts that actual is greater than expected, provides additional message on failure.
+ * \ingroup Assertions
+ *
+ * String representation can be defined with
+ * an appropriate assertion_traits class. For comparison assertLess is used.
+ *
+ * A diagnostic is printed if actual is less than expected.
+ * The message is printed in addition to the expected and actual value
+ * to provide additional information.
+ *
+ * Requirement for \a expected and \a actual parameters:
+ * - They are exactly of the same type
+ * - They are serializable into a std::strstream using operator <<.
+ * - They can be compared using operator<.
+ *
+ * The last two requirements (serialization and comparison) can be
+ * removed by specializing the CppUnit::assertion_traits.
+ *
+ * \sa CPPUNIT_ASSERT_LESS
+ */
+#define CPPUNIT_ASSERT_GREATER(expected, actual) \
+ ( CPPUNIT_NS::assertGreater( (expected), \
+ (actual), \
+ CPPUNIT_SOURCELINE(), \
+ "" ) )
+
+/** Asserts that actual is less or equal than expected, provides additional message on failure.
+ * \ingroup Assertions
+ *
+ * LessEqual and string representation can be defined with
+ * an appropriate assertion_traits class.
+ *
+ * A diagnostic is printed if actual is greater than expected.
+ * The message is printed in addition to the expected and actual value
+ * to provide additional information.
+ *
+ * Requirement for \a expected and \a actual parameters:
+ * - They are exactly of the same type
+ * - They are serializable into a std::strstream using operator <<.
+ * - They can be compared using operator <=.
+ *
+ * The last two requirements (serialization and comparison) can be
+ * removed by specializing the CppUnit::assertion_traits.
+ *
+ * \sa CPPUNIT_ASSERT_GREATEREQUAL
+ */
+#define CPPUNIT_ASSERT_LESSEQUAL(expected, actual) \
+ ( CPPUNIT_NS::assertLessEqual( (expected), \
+ (actual), \
+ CPPUNIT_SOURCELINE(), \
+ "" ) )
+
+/** Asserts that actual is greater than expected, provides additional message on failure.
+ * \ingroup Assertions
+ *
+ * String representation can be defined with
+ * an appropriate assertion_traits class. For comparison assertLess is used.
+ *
+ * A diagnostic is printed if actual is less than expected.
+ * The message is printed in addition to the expected and actual value
+ * to provide additional information.
+ *
+ * Requirement for \a expected and \a actual parameters:
+ * - They are exactly of the same type
+ * - They are serializable into a std::strstream using operator <<.
+ * - They can be compared using operator<=.
+ *
+ * The last two requirements (serialization and comparison) can be
+ * removed by specializing the CppUnit::assertion_traits.
+ *
+ * \sa CPPUNIT_ASSERT_LESSEQUAL
+ */
+#define CPPUNIT_ASSERT_GREATEREQUAL(expected, actual) \
+ ( CPPUNIT_NS::assertGreaterEqual( (expected), \
+ (actual), \
+ CPPUNIT_SOURCELINE(), \
+ "" ) )
/*! \brief Macro for primitive double value comparisons.
* \ingroup Assertions
*
@@ -263,7 +475,7 @@ void CPPUNIT_API assertDoubleEquals( double expected,
// implementation detail
-#if CPPUNIT_USE_TYPEINFO_NAME
+#if defined(CPPUNIT_USE_TYPEINFO_NAME)
#define CPPUNIT_EXTRACT_EXCEPTION_TYPE_( exception, no_rtti_message ) \
CPPUNIT_NS::TypeInfoHelper::getClassName( typeid(exception) )
#else
diff --git a/3rdParty/CppUnit/src/include/cppunit/TestCaller.h b/3rdParty/CppUnit/src/include/cppunit/TestCaller.h
index dc4d82e..fbf3902 100644
--- a/3rdParty/CppUnit/src/include/cppunit/TestCaller.h
+++ b/3rdParty/CppUnit/src/include/cppunit/TestCaller.h
@@ -4,8 +4,10 @@
#include <cppunit/Exception.h>
#include <cppunit/TestCase.h>
+#include <functional>
-#if CPPUNIT_USE_TYPEINFO_NAME
+
+#if defined(CPPUNIT_USE_TYPEINFO_NAME)
# include <cppunit/extensions/TypeInfoHelper.h>
#endif
@@ -33,7 +35,7 @@ struct ExpectedExceptionTraits
{
static void expectedException()
{
-#if CPPUNIT_USE_TYPEINFO_NAME
+#if defined(CPPUNIT_USE_TYPEINFO_NAME)
throw Exception( Message(
"expected exception not thrown",
"Expected exception type: " +
@@ -116,7 +118,7 @@ public:
TestCase( name ),
m_ownFixture( true ),
m_fixture( new Fixture() ),
- m_test( test )
+ m_test_function( std::bind(test, m_fixture) )
{
}
@@ -133,7 +135,7 @@ public:
TestCase( name ),
m_ownFixture( false ),
m_fixture( &fixture ),
- m_test( test )
+ m_test_function( std::bind(test, &fixture) )
{
}
@@ -150,9 +152,17 @@ public:
TestCase( name ),
m_ownFixture( true ),
m_fixture( fixture ),
- m_test( test )
+ m_test_function( std::bind(test, fixture) )
{
}
+
+ TestCaller(std::string name, std::function<void()> test_function, Fixture* fixture):
+ TestCase(name),
+ m_ownFixture(true),
+ m_fixture(fixture),
+ m_test_function(test_function)
+ {
+ }
~TestCaller()
{
@@ -162,14 +172,7 @@ public:
void runTest()
{
-// try {
- (m_fixture->*m_test)();
-// }
-// catch ( ExpectedException & ) {
-// return;
-// }
-
-// ExpectedExceptionTraits<ExpectedException>::expectedException();
+ m_test_function();
}
void setUp()
@@ -194,7 +197,7 @@ private:
private:
bool m_ownFixture;
Fixture *m_fixture;
- TestMethod m_test;
+ std::function<void()> m_test_function;
};
diff --git a/3rdParty/CppUnit/src/include/cppunit/TestPath.h b/3rdParty/CppUnit/src/include/cppunit/TestPath.h
index c3c851c..8934479 100644
--- a/3rdParty/CppUnit/src/include/cppunit/TestPath.h
+++ b/3rdParty/CppUnit/src/include/cppunit/TestPath.h
@@ -8,7 +8,7 @@
#pragma warning( disable: 4251 ) // X needs to have dll-interface to be used by clients of class Z
#endif
-#include <cppunit/portability/CppUnitDeque.h>
+#include <deque>
#include <string>
CPPUNIT_NS_BEGIN
@@ -16,11 +16,6 @@ CPPUNIT_NS_BEGIN
class Test;
-#if CPPUNIT_NEED_DLL_DECL
-// template class CPPUNIT_API std::deque<Test *>;
-#endif
-
-
/*! \brief A List of Test representing a path to access a Test.
* \ingroup ExecutingTest
*
@@ -174,7 +169,7 @@ protected:
void checkIndexValid( int index ) const;
/// A list of test names.
- typedef CppUnitDeque<std::string> PathTestNames;
+ typedef std::deque<std::string> PathTestNames;
/*! \brief Splits a path string into its test name components.
* \param pathAsString Path string created with toString().
@@ -199,7 +194,7 @@ protected:
PathTestNames &testNames );
protected:
- typedef CppUnitDeque<Test *> Tests;
+ typedef std::deque<Test *> Tests;
Tests m_tests;
};
diff --git a/3rdParty/CppUnit/src/include/cppunit/TestResult.h b/3rdParty/CppUnit/src/include/cppunit/TestResult.h
index e7e1050..aabd80b 100644
--- a/3rdParty/CppUnit/src/include/cppunit/TestResult.h
+++ b/3rdParty/CppUnit/src/include/cppunit/TestResult.h
@@ -9,7 +9,7 @@
#endif
#include <cppunit/SynchronizedObject.h>
-#include <cppunit/portability/CppUnitDeque.h>
+#include <deque>
#include <string>
CPPUNIT_NS_BEGIN
@@ -24,10 +24,6 @@ class TestFailure;
class TestListener;
-#if CPPUNIT_NEED_DLL_DECL
-// template class CPPUNIT_API std::deque<TestListener *>;
-#endif
-
/*! \brief Manages TestListener.
* \ingroup TrackingTestExecution
*
@@ -133,7 +129,7 @@ protected:
virtual void endTestRun( Test *test );
protected:
- typedef CppUnitDeque<TestListener *> TestListeners;
+ typedef std::deque<TestListener *> TestListeners;
TestListeners m_listeners;
ProtectorChain *m_protectorChain;
bool m_stop;
diff --git a/3rdParty/CppUnit/src/include/cppunit/TestResultCollector.h b/3rdParty/CppUnit/src/include/cppunit/TestResultCollector.h
index 01b0a54..b78c978 100644
--- a/3rdParty/CppUnit/src/include/cppunit/TestResultCollector.h
+++ b/3rdParty/CppUnit/src/include/cppunit/TestResultCollector.h
@@ -9,16 +9,11 @@
#endif
#include <cppunit/TestSuccessListener.h>
-#include <cppunit/portability/CppUnitDeque.h>
+#include <deque>
CPPUNIT_NS_BEGIN
-#if CPPUNIT_NEED_DLL_DECL
-// template class CPPUNIT_API std::deque<TestFailure *>;
-// template class CPPUNIT_API std::deque<Test *>;
-#endif
-
/*! \brief Collects test result.
* \ingroup WritingTestResult
@@ -36,8 +31,8 @@ CPPUNIT_NS_BEGIN
class CPPUNIT_API TestResultCollector : public TestSuccessListener
{
public:
- typedef CppUnitDeque<TestFailure *> TestFailures;
- typedef CppUnitDeque<Test *> Tests;
+ typedef std::deque<TestFailure *> TestFailures;
+ typedef std::deque<Test *> Tests;
/*! Constructs a TestResultCollector object.
diff --git a/3rdParty/CppUnit/src/include/cppunit/TestSuite.h b/3rdParty/CppUnit/src/include/cppunit/TestSuite.h
index 2b9cd8d..63c0a6b 100644
--- a/3rdParty/CppUnit/src/include/cppunit/TestSuite.h
+++ b/3rdParty/CppUnit/src/include/cppunit/TestSuite.h
@@ -9,7 +9,7 @@
#endif
#include <cppunit/TestComposite.h>
-#include <cppunit/portability/CppUnitVector.h>
+#include <vector>
CPPUNIT_NS_BEGIN
@@ -56,7 +56,7 @@ public:
* TestComposite interface instead.
* \return Reference on a vector that contains the tests of the suite.
*/
- const CppUnitVector<Test *> &getTests() const;
+ const std::vector<Test *> &getTests() const;
/*! Destroys all the tests of the suite.
*/
@@ -67,7 +67,7 @@ public:
Test *doGetChildTestAt( int index ) const;
private:
- CppUnitVector<Test *> m_tests;
+ std::vector<Test *> m_tests;
};
diff --git a/3rdParty/CppUnit/src/include/cppunit/TextTestResult.h b/3rdParty/CppUnit/src/include/cppunit/TextTestResult.h
index e7b1fa3..63937b0 100644
--- a/3rdParty/CppUnit/src/include/cppunit/TextTestResult.h
+++ b/3rdParty/CppUnit/src/include/cppunit/TextTestResult.h
@@ -26,6 +26,8 @@ public:
virtual void addFailure( const TestFailure &failure );
virtual void startTest( Test *test );
virtual void print( OStream &stream );
+
+ using TestResult::addFailure;
};
/** insertion operator for easy output */
diff --git a/3rdParty/CppUnit/src/include/cppunit/XmlOutputter.h b/3rdParty/CppUnit/src/include/cppunit/XmlOutputter.h
index 0de9676..2bf9411 100644
--- a/3rdParty/CppUnit/src/include/cppunit/XmlOutputter.h
+++ b/3rdParty/CppUnit/src/include/cppunit/XmlOutputter.h
@@ -9,8 +9,8 @@
#endif
#include <cppunit/Outputter.h>
-#include <cppunit/portability/CppUnitDeque.h>
-#include <cppunit/portability/CppUnitMap.h>
+#include <deque>
+#include <map>
#include <cppunit/portability/Stream.h>
@@ -46,7 +46,7 @@ public:
*/
XmlOutputter( TestResultCollector *result,
OStream &stream,
- std::string encoding = std::string("ISO-8859-1") );
+ const std::string& encoding = std::string("ISO-8859-1") );
/// Destructor.
virtual ~XmlOutputter();
@@ -85,7 +85,7 @@ public:
*/
virtual void setStandalone( bool standalone );
- typedef CppUnitMap<Test *,TestFailure*, std::less<Test*> > FailedTests;
+ typedef std::map<Test *,TestFailure*, std::less<Test*> > FailedTests;
/*! \brief Sets the root element and adds its children.
*
@@ -137,7 +137,7 @@ protected:
virtual void fillFailedTestsMap( FailedTests &failedTests );
protected:
- typedef CppUnitDeque<XmlOutputterHook *> Hooks;
+ typedef std::deque<XmlOutputterHook *> Hooks;
TestResultCollector *m_result;
OStream &m_stream;
diff --git a/3rdParty/CppUnit/src/include/cppunit/config-auto.h b/3rdParty/CppUnit/src/include/cppunit/config-auto.h
deleted file mode 100644
index 58b3d6e..0000000
--- a/3rdParty/CppUnit/src/include/cppunit/config-auto.h
+++ /dev/null
@@ -1,161 +0,0 @@
-#ifndef _INCLUDE_CPPUNIT_CONFIG_AUTO_H
-#define _INCLUDE_CPPUNIT_CONFIG_AUTO_H 1
-
-/* include/cppunit/config-auto.h. Generated automatically at end of configure. */
-/* config/config.h. Generated by configure. */
-/* config/config.h.in. Generated from configure.in by autoheader. */
-
-/* define if library uses std::string::compare(string,pos,n) */
-/* #undef CPPUNIT_FUNC_STRING_COMPARE_STRING_FIRST */
-
-
-#define CPPUNIT_HAVE_CPP_CAST
-
-/* define if the library defines strstream */
-#ifndef CPPUNIT_HAVE_CLASS_STRSTREAM
-#define CPPUNIT_HAVE_CLASS_STRSTREAM 1
-#endif
-
-/* Define to 1 if you have the <cmath> header file. */
-#ifndef CPPUNIT_HAVE_CMATH
-#define CPPUNIT_HAVE_CMATH 1
-#endif
-
-/* Define if you have the GNU dld library. */
-/* #undef CPPUNIT_HAVE_DLD */
-
-/* Define to 1 if you have the `dlerror' function. */
-#ifndef CPPUNIT_HAVE_DLERROR
-#define CPPUNIT_HAVE_DLERROR 1
-#endif
-
-/* Define to 1 if you have the <dlfcn.h> header file. */
-#ifndef CPPUNIT_HAVE_DLFCN_H
-#define CPPUNIT_HAVE_DLFCN_H 1
-#endif
-
-/* define if the compiler supports GCC C++ ABI name demangling */
-#ifndef CPPUNIT_HAVE_GCC_ABI_DEMANGLE
-#define CPPUNIT_HAVE_GCC_ABI_DEMANGLE 1
-#endif
-
-/* Define to 1 if you have the <inttypes.h> header file. */
-#ifndef CPPUNIT_HAVE_INTTYPES_H
-#define CPPUNIT_HAVE_INTTYPES_H 1
-#endif
-
-/* Define if you have the libdl library or equivalent. */
-#ifndef CPPUNIT_HAVE_LIBDL
-#define CPPUNIT_HAVE_LIBDL 1
-#endif
-
-/* Define to 1 if you have the <memory.h> header file. */
-#ifndef CPPUNIT_HAVE_MEMORY_H
-#define CPPUNIT_HAVE_MEMORY_H 1
-#endif
-
-/* define to 1 if the compiler implements namespaces */
-#ifndef CPPUNIT_HAVE_NAMESPACES
-#define CPPUNIT_HAVE_NAMESPACES 1
-#endif
-
-/* define if the compiler supports Run-Time Type Identification */
-#ifndef CPPUNIT_HAVE_RTTI
-#define CPPUNIT_HAVE_RTTI 1
-#endif
-
-/* Define if you have the shl_load function. */
-/* #undef CPPUNIT_HAVE_SHL_LOAD */
-
-/* define if the compiler has stringstream */
-#ifndef CPPUNIT_HAVE_SSTREAM
-#define CPPUNIT_HAVE_SSTREAM 1
-#endif
-
-/* Define to 1 if you have the <stdint.h> header file. */
-#ifndef CPPUNIT_HAVE_STDINT_H
-#define CPPUNIT_HAVE_STDINT_H 1
-#endif
-
-/* Define to 1 if you have the <stdlib.h> header file. */
-#ifndef CPPUNIT_HAVE_STDLIB_H
-#define CPPUNIT_HAVE_STDLIB_H 1
-#endif
-
-/* Define to 1 if you have the <strings.h> header file. */
-#ifndef CPPUNIT_HAVE_STRINGS_H
-#define CPPUNIT_HAVE_STRINGS_H 1
-#endif
-
-/* Define to 1 if you have the <string.h> header file. */
-#ifndef CPPUNIT_HAVE_STRING_H
-#define CPPUNIT_HAVE_STRING_H 1
-#endif
-
-/* Define to 1 if you have the <strstream> header file. */
-#ifndef CPPUNIT_HAVE_STRSTREAM
-#define CPPUNIT_HAVE_STRSTREAM 1
-#endif
-
-/* Define to 1 if you have the <sys/stat.h> header file. */
-#ifndef CPPUNIT_HAVE_SYS_STAT_H
-#define CPPUNIT_HAVE_SYS_STAT_H 1
-#endif
-
-/* Define to 1 if you have the <sys/types.h> header file. */
-#ifndef CPPUNIT_HAVE_SYS_TYPES_H
-#define CPPUNIT_HAVE_SYS_TYPES_H 1
-#endif
-
-/* Define to 1 if you have the <unistd.h> header file. */
-#ifndef CPPUNIT_HAVE_UNISTD_H
-#define CPPUNIT_HAVE_UNISTD_H 1
-#endif
-
-/* Name of package */
-#ifndef CPPUNIT_PACKAGE
-#define CPPUNIT_PACKAGE "cppunit"
-#endif
-
-/* Define to the address where bug reports for this package should be sent. */
-#ifndef CPPUNIT_PACKAGE_BUGREPORT
-#define CPPUNIT_PACKAGE_BUGREPORT ""
-#endif
-
-/* Define to the full name of this package. */
-#ifndef CPPUNIT_PACKAGE_NAME
-#define CPPUNIT_PACKAGE_NAME ""
-#endif
-
-/* Define to the full name and version of this package. */
-#ifndef CPPUNIT_PACKAGE_STRING
-#define CPPUNIT_PACKAGE_STRING ""
-#endif
-
-/* Define to the one symbol short name of this package. */
-#ifndef CPPUNIT_PACKAGE_TARNAME
-#define CPPUNIT_PACKAGE_TARNAME ""
-#endif
-
-/* Define to the version of this package. */
-#ifndef CPPUNIT_PACKAGE_VERSION
-#define CPPUNIT_PACKAGE_VERSION ""
-#endif
-
-/* Define to 1 if you have the ANSI C header files. */
-#ifndef CPPUNIT_STDC_HEADERS
-#define CPPUNIT_STDC_HEADERS 1
-#endif
-
-/* Define to 1 to use type_info::name() for class names */
-#ifndef CPPUNIT_USE_TYPEINFO_NAME
-#define CPPUNIT_USE_TYPEINFO_NAME CPPUNIT_HAVE_RTTI
-#endif
-
-/* Version number of package */
-#ifndef CPPUNIT_VERSION
-#define CPPUNIT_VERSION "1.12.0"
-#endif
-
-/* _INCLUDE_CPPUNIT_CONFIG_AUTO_H */
-#endif
diff --git a/3rdParty/CppUnit/src/include/cppunit/config/SelectDllLoader.h b/3rdParty/CppUnit/src/include/cppunit/config/SelectDllLoader.h
index dc1c011..9f8c0d6 100644
--- a/3rdParty/CppUnit/src/include/cppunit/config/SelectDllLoader.h
+++ b/3rdParty/CppUnit/src/include/cppunit/config/SelectDllLoader.h
@@ -15,9 +15,6 @@
* CPPUNIT_HAVE_WIN32_DLL_LOADER
* If defined, Win32 implementation of DynamicLibraryManager will be used.
*
- * CPPUNIT_HAVE_BEOS_DLL_LOADER
- * If defined, BeOs implementation of DynamicLibraryManager will be used.
- *
* CPPUNIT_HAVE_UNIX_DLL_LOADER
* If defined, Unix implementation (dlfcn.h) of DynamicLibraryManager will be used.
*/
@@ -50,10 +47,6 @@
#undef CPPUNIT_PLUGIN_EXPORT
#define CPPUNIT_PLUGIN_EXPORT extern "C" __declspec(dllexport)
-// Is BeOS platform ?
-#elif defined(__BEOS__)
-#define CPPUNIT_HAVE_BEOS_DLL_LOADER 1
-
// Is Unix platform and have shl_load() (hp-ux)
#elif defined(CPPUNIT_HAVE_SHL_LOAD)
#define CPPUNIT_HAVE_UNIX_SHL_LOADER 1
diff --git a/3rdParty/CppUnit/src/include/cppunit/config/config-msvc6.h b/3rdParty/CppUnit/src/include/cppunit/config/config-msvc6.h
index d688171..0edc059 100644
--- a/3rdParty/CppUnit/src/include/cppunit/config/config-msvc6.h
+++ b/3rdParty/CppUnit/src/include/cppunit/config/config-msvc6.h
@@ -30,20 +30,6 @@
#define CPPUNIT_HAVE_NAMESPACES 1
#endif
-/* define if the compiler supports Run-Time Type Identification */
-#ifndef CPPUNIT_HAVE_RTTI
-# ifdef _CPPRTTI // Defined by the compiler option /GR
-# define CPPUNIT_HAVE_RTTI 1
-# else
-# define CPPUNIT_HAVE_RTTI 0
-# endif
-#endif
-
-/* Define to 1 to use type_info::name() for class names */
-#ifndef CPPUNIT_USE_TYPEINFO_NAME
-#define CPPUNIT_USE_TYPEINFO_NAME CPPUNIT_HAVE_RTTI
-#endif
-
#define CPPUNIT_HAVE_SSTREAM 1
/* Name of package */
@@ -73,11 +59,12 @@
// Uncomment to turn on STL wrapping => use this to test compilation.
// This will make CppUnit subclass std::vector & co to provide default
// parameter.
-/*#define CPPUNIT_STD_NEED_ALLOCATOR 1
-#define CPPUNIT_STD_ALLOCATOR std::allocator<T>
-//#define CPPUNIT_NO_NAMESPACE 1
+/*#define CPPUNIT_NO_NAMESPACE 1
*/
+#if _MSC_VER >= 1300 // VS 7.0
+#define CPPUNIT_UNIQUE_COUNTER __COUNTER__
+#endif // if _MSC_VER >= 1300 // VS 7.0
/* _INCLUDE_CPPUNIT_CONFIG_MSVC6_H */
#endif
diff --git a/3rdParty/CppUnit/src/include/cppunit/extensions/ExceptionTestCaseDecorator.h b/3rdParty/CppUnit/src/include/cppunit/extensions/ExceptionTestCaseDecorator.h
index 9c816ad..a3f2b3e 100644
--- a/3rdParty/CppUnit/src/include/cppunit/extensions/ExceptionTestCaseDecorator.h
+++ b/3rdParty/CppUnit/src/include/cppunit/extensions/ExceptionTestCaseDecorator.h
@@ -76,7 +76,7 @@ public:
// Moved outside the try{} statement to handle the case where the
// expected exception type is Exception (expecting assertion failure).
-#if CPPUNIT_USE_TYPEINFO_NAME
+#if defined(CPPUNIT_USE_TYPEINFO_NAME)
throw Exception( Message(
"expected exception not thrown",
"Expected exception type: " +
@@ -92,7 +92,7 @@ private:
*
* Should be overriden to check the exception.
*/
- virtual void checkException( ExpectedExceptionType &e )
+ virtual void checkException( ExpectedExceptionType & )
{
}
};
diff --git a/3rdParty/CppUnit/src/include/cppunit/extensions/HelperMacros.h b/3rdParty/CppUnit/src/include/cppunit/extensions/HelperMacros.h
index 12431e4..4c30319 100644
--- a/3rdParty/CppUnit/src/include/cppunit/extensions/HelperMacros.h
+++ b/3rdParty/CppUnit/src/include/cppunit/extensions/HelperMacros.h
@@ -166,17 +166,18 @@
#define CPPUNIT_TEST_SUITE_END() \
} \
\
+public: \
static CPPUNIT_NS::TestSuite *suite() \
{ \
const CPPUNIT_NS::TestNamer &namer = getTestNamer__(); \
- std::auto_ptr<CPPUNIT_NS::TestSuite> suite( \
- new CPPUNIT_NS::TestSuite( namer.getFixtureName() )); \
+ std::unique_ptr<CPPUNIT_NS::TestSuite> guard( \
+ new CPPUNIT_NS::TestSuite( namer.getFixtureName() )); \
CPPUNIT_NS::ConcretTestFixtureFactory<TestFixtureType> factory; \
- CPPUNIT_NS::TestSuiteBuilderContextBase context( *suite.get(), \
+ CPPUNIT_NS::TestSuiteBuilderContextBase context( *guard.get(), \
namer, \
factory ); \
TestFixtureType::addTestsToSuite( context ); \
- return suite.release(); \
+ return guard.release(); \
} \
private: /* dummy typedef so that the macro can still end with ';'*/ \
typedef int CppUnitDummyTypedefForSemiColonEnding__
@@ -300,6 +301,17 @@
&TestFixtureType::testMethod, \
context.makeFixture() ) ) )
+#define CPPUNIT_TEST_PARAMETERIZED( testMethod, ... ) \
+ for (auto& i : __VA_ARGS__) \
+ { \
+ TestFixtureType* fixture = context.makeFixture(); \
+ CPPUNIT_TEST_SUITE_ADD_TEST( \
+ ( new CPPUNIT_NS::TestCaller<TestFixtureType>( \
+ context.getTestNameFor(#testMethod, i), \
+ std::bind(&TestFixtureType::testMethod, fixture, i), \
+ fixture))); \
+ }
+
/*! \brief Add a test which fail if the specified exception is not caught.
*
* Example:
@@ -308,13 +320,13 @@
* #include <vector>
* class MyTest : public CppUnit::TestFixture {
* CPPUNIT_TEST_SUITE( MyTest );
- * CPPUNIT_TEST_EXCEPTION( testVectorAtThrow, std::invalid_argument );
+ * CPPUNIT_TEST_EXCEPTION( testVectorAtThrow, std::out_of_range );
* CPPUNIT_TEST_SUITE_END();
* public:
* void testVectorAtThrow()
* {
* std::vector<int> v;
- * v.at( 1 ); // must throw exception std::invalid_argument
+ * v.at( 1 ); // must throw exception std::out_of_range
* }
* };
* \endcode
diff --git a/3rdParty/CppUnit/src/include/cppunit/extensions/TestCaseDecorator.h b/3rdParty/CppUnit/src/include/cppunit/extensions/TestCaseDecorator.h
index 3a15ba9..effde25 100644
--- a/3rdParty/CppUnit/src/include/cppunit/extensions/TestCaseDecorator.h
+++ b/3rdParty/CppUnit/src/include/cppunit/extensions/TestCaseDecorator.h
@@ -13,7 +13,7 @@ CPPUNIT_NS_BEGIN
* of a test class without subclassing the test. Instead, one can
* subclass the decorater and use it to wrap the test class.
*
- * Does not assume ownership of the test it decorates
+ * Assumes ownership of the test it decorates
*/
class CPPUNIT_API TestCaseDecorator : public TestCase
{
@@ -31,6 +31,13 @@ public:
protected:
TestCase *m_test;
+
+private:
+
+ //prevent the creation of copy c'tor and operator=
+ TestCaseDecorator( const TestCaseDecorator& );
+ TestCaseDecorator& operator=( const TestCaseDecorator& );
+
};
diff --git a/3rdParty/CppUnit/src/include/cppunit/extensions/TestFactoryRegistry.h b/3rdParty/CppUnit/src/include/cppunit/extensions/TestFactoryRegistry.h
index fc8723e..9d10c94 100644
--- a/3rdParty/CppUnit/src/include/cppunit/extensions/TestFactoryRegistry.h
+++ b/3rdParty/CppUnit/src/include/cppunit/extensions/TestFactoryRegistry.h
@@ -8,7 +8,7 @@
#pragma warning( disable: 4251) // X needs to have dll-interface to be used by clients of class Z
#endif
-#include <cppunit/portability/CppUnitSet.h>
+#include <set>
#include <cppunit/extensions/TestFactory.h>
#include <string>
@@ -17,11 +17,6 @@ CPPUNIT_NS_BEGIN
class TestSuite;
-#if CPPUNIT_NEED_DLL_DECL
-// template class CPPUNIT_API std::set<TestFactory *>;
-#endif
-
-
/*! \brief Registry for TestFactory.
* \ingroup CreatingTestSuite
*
@@ -165,7 +160,7 @@ private:
void operator =( const TestFactoryRegistry &copy );
private:
- typedef CppUnitSet<TestFactory *, std::less<TestFactory*> > Factories;
+ typedef std::set<TestFactory *, std::less<TestFactory*> > Factories;
Factories m_factories;
std::string m_name;
diff --git a/3rdParty/CppUnit/src/include/cppunit/extensions/TestNamer.h b/3rdParty/CppUnit/src/include/cppunit/extensions/TestNamer.h
index 5a6471c..0c8fb31 100644
--- a/3rdParty/CppUnit/src/include/cppunit/extensions/TestNamer.h
+++ b/3rdParty/CppUnit/src/include/cppunit/extensions/TestNamer.h
@@ -3,20 +3,16 @@
#include <cppunit/Portability.h>
#include <string>
+#include <cppunit/tools/StringHelper.h>
-#if CPPUNIT_HAVE_RTTI
-# include <typeinfo>
-#endif
+#include <typeinfo>
/*! \def CPPUNIT_TESTNAMER_DECL( variableName, FixtureType )
* \brief Declares a TestNamer.
*
- * Declares a TestNamer for the specified type, using RTTI if enabled, otherwise
- * using macro string expansion.
- *
- * RTTI is used if CPPUNIT_USE_TYPEINFO_NAME is defined and not null.
+ * Declares a TestNamer for the specified type
*
* \code
* void someMethod()
@@ -29,19 +25,11 @@
* \relates TestNamer
* \see TestNamer
*/
-#if CPPUNIT_USE_TYPEINFO_NAME
# define CPPUNIT_TESTNAMER_DECL( variableName, FixtureType ) \
CPPUNIT_NS::TestNamer variableName( typeid(FixtureType) )
-#else
-# define CPPUNIT_TESTNAMER_DECL( variableName, FixtureType ) \
- CPPUNIT_NS::TestNamer variableName( std::string(#FixtureType) )
-#endif
-
-
CPPUNIT_NS_BEGIN
-
/*! \brief Names a test or a fixture suite.
*
* TestNamer is usually instantiated using CPPUNIT_TESTNAMER_DECL.
@@ -50,12 +38,10 @@ CPPUNIT_NS_BEGIN
class CPPUNIT_API TestNamer
{
public:
-#if CPPUNIT_HAVE_RTTI
/*! \brief Constructs a namer using the fixture's type-info.
* \param typeInfo Type-info of the fixture type. Use to name the fixture suite.
*/
TestNamer( const std::type_info &typeInfo );
-#endif
/*! \brief Constructs a namer using the specified fixture name.
* \param fixtureName Name of the fixture suite. Usually extracted using a macro.
@@ -78,11 +64,16 @@ public:
*/
virtual std::string getTestNameFor( const std::string &testMethodName ) const;
+ template<typename E>
+ std::string getTestNameFor( const std::string& testMethodName, const E& val) const
+ {
+ return getTestNameFor(testMethodName) + " with parameter: " + CPPUNIT_NS::StringHelper::toString(val);
+ }
+
protected:
std::string m_fixtureName;
};
-
CPPUNIT_NS_END
#endif // CPPUNIT_EXTENSIONS_TESTNAMER_H
diff --git a/3rdParty/CppUnit/src/include/cppunit/extensions/TestSuiteBuilderContext.h b/3rdParty/CppUnit/src/include/cppunit/extensions/TestSuiteBuilderContext.h
index db26926..72bfa70 100644
--- a/3rdParty/CppUnit/src/include/cppunit/extensions/TestSuiteBuilderContext.h
+++ b/3rdParty/CppUnit/src/include/cppunit/extensions/TestSuiteBuilderContext.h
@@ -2,7 +2,7 @@
#define CPPUNIT_HELPER_TESTSUITEBUILDERCONTEXT_H
#include <cppunit/Portability.h>
-#include <cppunit/portability/CppUnitMap.h>
+#include <map>
#include <string>
#if CPPUNIT_NEED_DLL_DECL
@@ -62,6 +62,21 @@ public:
*/
std::string getTestNameFor( const std::string &testMethodName ) const;
+ /*! \brief Returns the name of the test for the specified method with the corresponding parameter.
+ *
+ * \param testMethodName Name (including a parameter) of the method that implements a test.
+ * \return A string that is the concatenation of the test fixture name
+ * (returned by getFixtureName()), \a testMethodName,
+ * separated using '::' and the parameter. This provides a fairly unique name for a given
+ * test. The parameter must be convertable to std::string through operator<<
+ * or a specialization of CPPUNIT_NS::StringHelper::toString needs to exist.
+ */
+ template<typename T>
+ std::string getTestNameFor( const std::string &testMethodName, const T& value ) const
+ {
+ return m_namer.getTestNameFor(testMethodName, value);
+ }
+
/*! \brief Adds property pair.
* \param key PropertyKey string to add.
* \param value PropertyValue string to add.
@@ -81,7 +96,7 @@ protected:
// shared std::map in dll bug in VC6.
// See http://www.dinkumware.com/vc_fixes.html for detail.
typedef std::pair<std::string,std::string> Property;
- typedef CppUnitVector<Property> Properties;
+ typedef std::vector<Property> Properties;
TestSuite &m_suite;
const TestNamer &m_namer;
diff --git a/3rdParty/CppUnit/src/include/cppunit/extensions/TypeInfoHelper.h b/3rdParty/CppUnit/src/include/cppunit/extensions/TypeInfoHelper.h
index c0ecdbc..1adec83 100644
--- a/3rdParty/CppUnit/src/include/cppunit/extensions/TypeInfoHelper.h
+++ b/3rdParty/CppUnit/src/include/cppunit/extensions/TypeInfoHelper.h
@@ -3,14 +3,11 @@
#include <cppunit/Portability.h>
-#if CPPUNIT_HAVE_RTTI
-
#include <typeinfo>
#include <string>
CPPUNIT_NS_BEGIN
-
/**! \brief Helper to use type_info.
*/
class CPPUNIT_API TypeInfoHelper
@@ -25,9 +22,6 @@ CPPUNIT_NS_BEGIN
static std::string getClassName( const std::type_info &info );
};
-
CPPUNIT_NS_END
-#endif // CPPUNIT_HAVE_RTTI
-
#endif // CPPUNIT_TYPEINFOHELPER_H
diff --git a/3rdParty/CppUnit/src/include/cppunit/portability/CppUnitDeque.h b/3rdParty/CppUnit/src/include/cppunit/portability/CppUnitDeque.h
deleted file mode 100644
index bbab21f..0000000
--- a/3rdParty/CppUnit/src/include/cppunit/portability/CppUnitDeque.h
+++ /dev/null
@@ -1,25 +0,0 @@
-#ifndef CPPUNIT_PORTABILITY_CPPUNITDEQUE_H
-#define CPPUNIT_PORTABILITY_CPPUNITDEQUE_H
-
-// The technic used is similar to the wrapper of STLPort.
-
-#include <cppunit/Portability.h>
-#include <deque>
-
-
-#if CPPUNIT_STD_NEED_ALLOCATOR
-
-template<class T>
-class CppUnitDeque : public std::deque<T,CPPUNIT_STD_ALLOCATOR>
-{
-public:
-};
-
-#else // CPPUNIT_STD_NEED_ALLOCATOR
-
-#define CppUnitDeque std::deque
-
-#endif
-
-#endif // CPPUNIT_PORTABILITY_CPPUNITDEQUE_H
-
diff --git a/3rdParty/CppUnit/src/include/cppunit/portability/CppUnitMap.h b/3rdParty/CppUnit/src/include/cppunit/portability/CppUnitMap.h
deleted file mode 100644
index 0cdc723..0000000
--- a/3rdParty/CppUnit/src/include/cppunit/portability/CppUnitMap.h
+++ /dev/null
@@ -1,29 +0,0 @@
-#ifndef CPPUNIT_PORTABILITY_CPPUNITMAP_H
-#define CPPUNIT_PORTABILITY_CPPUNITMAP_H
-
-// The technic used is similar to the wrapper of STLPort.
-
-#include <cppunit/Portability.h>
-#include <functional>
-#include <map>
-
-
-#if CPPUNIT_STD_NEED_ALLOCATOR
-
-template<class Key, class T>
-class CppUnitMap : public std::map<Key
- ,T
- ,std::less<Key>
- ,CPPUNIT_STD_ALLOCATOR>
-{
-public:
-};
-
-#else // CPPUNIT_STD_NEED_ALLOCATOR
-
-#define CppUnitMap std::map
-
-#endif
-
-#endif // CPPUNIT_PORTABILITY_CPPUNITMAP_H
-
diff --git a/3rdParty/CppUnit/src/include/cppunit/portability/CppUnitSet.h b/3rdParty/CppUnit/src/include/cppunit/portability/CppUnitSet.h
deleted file mode 100644
index 18b8662..0000000
--- a/3rdParty/CppUnit/src/include/cppunit/portability/CppUnitSet.h
+++ /dev/null
@@ -1,28 +0,0 @@
-#ifndef CPPUNIT_PORTABILITY_CPPUNITSET_H
-#define CPPUNIT_PORTABILITY_CPPUNITSET_H
-
-// The technic used is similar to the wrapper of STLPort.
-
-#include <cppunit/Portability.h>
-#include <functional>
-#include <set>
-
-
-#if CPPUNIT_STD_NEED_ALLOCATOR
-
-template<class T>
-class CppUnitSet : public std::set<T
- ,std::less<T>
- ,CPPUNIT_STD_ALLOCATOR>
-{
-public:
-};
-
-#else // CPPUNIT_STD_NEED_ALLOCATOR
-
-#define CppUnitSet std::set
-
-#endif
-
-#endif // CPPUNIT_PORTABILITY_CPPUNITSET_H
-
diff --git a/3rdParty/CppUnit/src/include/cppunit/portability/CppUnitVector.h b/3rdParty/CppUnit/src/include/cppunit/portability/CppUnitVector.h
deleted file mode 100644
index 6666a63..0000000
--- a/3rdParty/CppUnit/src/include/cppunit/portability/CppUnitVector.h
+++ /dev/null
@@ -1,25 +0,0 @@
-#ifndef CPPUNIT_PORTABILITY_CPPUNITVECTOR_H
-#define CPPUNIT_PORTABILITY_CPPUNITVECTOR_H
-
-// The technic used is similar to the wrapper of STLPort.
-
-#include <cppunit/Portability.h>
-#include <vector>
-
-
-#if CPPUNIT_STD_NEED_ALLOCATOR
-
-template<class T>
-class CppUnitVector : public std::vector<T,CPPUNIT_STD_ALLOCATOR>
-{
-public:
-};
-
-#else // CPPUNIT_STD_NEED_ALLOCATOR
-
-#define CppUnitVector std::vector
-
-#endif
-
-#endif // CPPUNIT_PORTABILITY_CPPUNITVECTOR_H
-
diff --git a/3rdParty/CppUnit/src/include/cppunit/tools/StringHelper.h b/3rdParty/CppUnit/src/include/cppunit/tools/StringHelper.h
new file mode 100644
index 0000000..3301045
--- /dev/null
+++ b/3rdParty/CppUnit/src/include/cppunit/tools/StringHelper.h
@@ -0,0 +1,45 @@
+#ifndef CPPUNIT_TOOLS_STRINGHELPER_H
+#define CPPUNIT_TOOLS_STRINGHELPER_H
+
+#include <cppunit/Portability.h>
+#include <cppunit/portability/Stream.h>
+#include <string>
+#include <type_traits>
+
+
+CPPUNIT_NS_BEGIN
+
+
+/*! \brief Methods for converting values to strings. Replaces CPPUNIT_NS::StringTools::toString
+ */
+namespace StringHelper
+{
+
+// work around to handle C++11 enum class correctly. We need an own conversion to std::string
+// as there is no implicit coversion to int for enum class.
+
+template<typename T>
+typename std::enable_if<!std::is_enum<T>::value, std::string>::type toString(const T& x)
+{
+ OStringStream ost;
+ ost << x;
+
+ return ost.str();
+}
+
+template<typename T>
+typename std::enable_if<std::is_enum<T>::value, std::string>::type toString(const T& x)
+{
+ OStringStream ost;
+ ost << static_cast<typename std::underlying_type<T>::type>(x);
+
+ return ost.str();
+}
+
+}
+
+
+CPPUNIT_NS_END
+
+#endif // CPPUNIT_TOOLS_STRINGHELPER_H
+
diff --git a/3rdParty/CppUnit/src/include/cppunit/tools/StringTools.h b/3rdParty/CppUnit/src/include/cppunit/tools/StringTools.h
index 7a6b6d7..d08c6e0 100644
--- a/3rdParty/CppUnit/src/include/cppunit/tools/StringTools.h
+++ b/3rdParty/CppUnit/src/include/cppunit/tools/StringTools.h
@@ -3,7 +3,7 @@
#include <cppunit/Portability.h>
#include <string>
-#include <cppunit/portability/CppUnitVector.h>
+#include <vector>
CPPUNIT_NS_BEGIN
@@ -14,7 +14,7 @@ CPPUNIT_NS_BEGIN
struct StringTools
{
- typedef CppUnitVector<std::string> Strings;
+ typedef std::vector<std::string> Strings;
static std::string CPPUNIT_API toString( int value );
diff --git a/3rdParty/CppUnit/src/include/cppunit/tools/XmlElement.h b/3rdParty/CppUnit/src/include/cppunit/tools/XmlElement.h
index 0b36bd2..70e21f8 100644
--- a/3rdParty/CppUnit/src/include/cppunit/tools/XmlElement.h
+++ b/3rdParty/CppUnit/src/include/cppunit/tools/XmlElement.h
@@ -8,7 +8,7 @@
#pragma warning( disable: 4251 ) // X needs to have dll-interface to be used by clients of class Z
#endif
-#include <cppunit/portability/CppUnitDeque.h>
+#include <deque>
#include <string>
@@ -131,10 +131,10 @@ private:
std::string m_name;
std::string m_content;
- typedef CppUnitDeque<Attribute> Attributes;
+ typedef std::deque<Attribute> Attributes;
Attributes m_attributes;
- typedef CppUnitDeque<XmlElement *> Elements;
+ typedef std::deque<XmlElement *> Elements;
Elements m_elements;
};
diff --git a/3rdParty/CppUnit/src/include/cppunit/ui/text/TextTestRunner.h b/3rdParty/CppUnit/src/include/cppunit/ui/text/TextTestRunner.h
index 86da4d4..6250166 100644
--- a/3rdParty/CppUnit/src/include/cppunit/ui/text/TextTestRunner.h
+++ b/3rdParty/CppUnit/src/include/cppunit/ui/text/TextTestRunner.h
@@ -86,6 +86,12 @@ protected:
virtual void wait( bool doWait );
virtual void printResult( bool doPrintResult );
+private:
+ // prohibit copying
+ TextTestRunner( const TextTestRunner& );
+ // prohibit copying
+ TextTestRunner& operator=( const TextTestRunner& );
+
TestResultCollector *m_result;
TestResult *m_eventManager;
Outputter *m_outputter;
diff --git a/3rdParty/CppUnit/src/src/cppunit/Asserter.cpp b/3rdParty/CppUnit/src/src/cppunit/Asserter.cpp
index a9cf95c..79fcb2e 100644
--- a/3rdParty/CppUnit/src/src/cppunit/Asserter.cpp
+++ b/3rdParty/CppUnit/src/src/cppunit/Asserter.cpp
@@ -6,6 +6,7 @@
CPPUNIT_NS_BEGIN
+// coverity[+kill]
void
Asserter::fail( std::string message,
const SourceLine &sourceLine )
@@ -13,7 +14,7 @@ Asserter::fail( std::string message,
fail( Message( "assertion failed", message ), sourceLine );
}
-
+// coverity[+kill]
void
Asserter::fail( const Message &message,
const SourceLine &sourceLine )
@@ -40,13 +41,41 @@ Asserter::failIf( bool shouldFail,
failIf( shouldFail, Message( "assertion failed", message ), sourceLine );
}
-
std::string
Asserter::makeExpected( const std::string &expectedValue )
{
return "Expected: " + expectedValue;
}
+std::string
+Asserter::makeExpectedEqual( const std::string &expectedValue )
+{
+ return "Expected: " + expectedValue;
+}
+
+std::string
+Asserter::makeExpectedLess( const std::string& expectedValue )
+{
+ return "Expected less than: " + expectedValue;
+}
+
+std::string
+Asserter::makeExpectedLessEqual( const std::string& expectedValue )
+{
+ return "Expected less or equal than: " + expectedValue;
+}
+
+std::string
+Asserter::makeExpectedGreater( const std::string& expectedValue )
+{
+ return "Expected greater than: " + expectedValue;
+}
+
+std::string
+Asserter::makeExpectedGreaterEqual( const std::string& expectedValue )
+{
+ return "Expected greater or equal than: " + expectedValue;
+}
std::string
Asserter::makeActual( const std::string &actualValue )
@@ -55,18 +84,28 @@ Asserter::makeActual( const std::string &actualValue )
}
+Message
+Asserter::makeMessage( const std::string& expectedMessage,
+ const std::string& actualMessage,
+ const std::string& shortDescription,
+ const AdditionalMessage& additionalMessage)
+{
+ Message message( shortDescription,
+ expectedMessage,
+ actualMessage );
+ message.addDetail( additionalMessage );
+
+ return message;
+}
+
+
Message
Asserter::makeNotEqualMessage( const std::string &expectedValue,
const std::string &actualValue,
const AdditionalMessage &additionalMessage,
const std::string &shortDescription )
{
- Message message( shortDescription,
- makeExpected( expectedValue ),
- makeActual( actualValue ) );
- message.addDetail( additionalMessage );
-
- return message;
+ return makeMessage(makeExpectedEqual(expectedValue), makeActual(actualValue), shortDescription, additionalMessage);
}
@@ -77,15 +116,71 @@ Asserter::failNotEqual( std::string expected,
const AdditionalMessage &additionalMessage,
std::string shortDescription )
{
- fail( makeNotEqualMessage( expected,
- actual,
- additionalMessage,
- shortDescription ),
+ fail( makeMessage( makeExpectedEqual(expected),
+ makeActual(actual),
+ shortDescription,
+ additionalMessage ),
+ sourceLine );
+}
+
+
+void
+Asserter::failNotLess( std::string expected,
+ std::string actual,
+ const SourceLine &sourceLine,
+ const AdditionalMessage &additionalMessage,
+ std::string shortDescription )
+{
+ fail( makeMessage( makeExpectedLess(expected),
+ makeActual(actual),
+ shortDescription,
+ additionalMessage),
sourceLine );
}
void
+Asserter::failNotGreater( std::string expected,
+ std::string actual,
+ const SourceLine &sourceLine,
+ const AdditionalMessage &additionalMessage,
+ std::string shortDescription )
+{
+ fail( makeMessage( makeExpectedGreater(expected),
+ makeActual(actual),
+ shortDescription,
+ additionalMessage),
+ sourceLine );
+}
+
+void
+Asserter::failNotLessEqual( std::string expected,
+ std::string actual,
+ const SourceLine &sourceLine,
+ const AdditionalMessage &additionalMessage,
+ std::string shortDescription )
+{
+ fail( makeMessage( makeExpectedLessEqual(expected),
+ makeActual(actual),
+ shortDescription,
+ additionalMessage ),
+ sourceLine );
+}
+
+void
+Asserter::failNotGreaterEqual( std::string expected,
+ std::string actual,
+ const SourceLine &sourceLine,
+ const AdditionalMessage &additionalMessage,
+ std::string shortDescription )
+{
+ fail( makeMessage( makeExpectedGreaterEqual(expected),
+ makeActual(actual),
+ shortDescription,
+ additionalMessage ),
+ sourceLine );
+}
+void
Asserter::failNotEqualIf( bool shouldFail,
std::string expected,
std::string actual,
diff --git a/3rdParty/CppUnit/src/src/cppunit/BriefTestProgressListener.cpp b/3rdParty/CppUnit/src/src/cppunit/BriefTestProgressListener.cpp
index 120e6d5..4ea8d35 100644
--- a/3rdParty/CppUnit/src/src/cppunit/BriefTestProgressListener.cpp
+++ b/3rdParty/CppUnit/src/src/cppunit/BriefTestProgressListener.cpp
@@ -37,7 +37,7 @@ BriefTestProgressListener::addFailure( const TestFailure &failure )
void
-BriefTestProgressListener::endTest( Test *)
+BriefTestProgressListener::endTest( Test * )
{
if ( !m_lastTestFailed )
stdCOut() << " : OK";
diff --git a/3rdParty/CppUnit/src/src/cppunit/DefaultProtector.cpp b/3rdParty/CppUnit/src/src/cppunit/DefaultProtector.cpp
index 6fb306b..fa6ac87 100644
--- a/3rdParty/CppUnit/src/src/cppunit/DefaultProtector.cpp
+++ b/3rdParty/CppUnit/src/src/cppunit/DefaultProtector.cpp
@@ -21,7 +21,7 @@ DefaultProtector::protect( const Functor &functor,
catch ( std::exception &e )
{
std::string shortDescription( "uncaught exception of type " );
-#if CPPUNIT_USE_TYPEINFO_NAME
+#if defined(CPPUNIT_USE_TYPEINFO_NAME)
shortDescription += TypeInfoHelper::getClassName( typeid(e) );
#else
shortDescription += "std::exception (or derived).";
diff --git a/3rdParty/CppUnit/src/src/cppunit/Exception.cpp b/3rdParty/CppUnit/src/src/cppunit/Exception.cpp
index 3bbe24b..6685480 100644
--- a/3rdParty/CppUnit/src/src/cppunit/Exception.cpp
+++ b/3rdParty/CppUnit/src/src/cppunit/Exception.cpp
@@ -19,20 +19,20 @@ const long Exception::UNKNOWNLINENUMBER = -1;
Exception::Exception( const Exception &other )
: std::exception( other )
+ , m_message(other.m_message)
+ , m_sourceLine(other.m_sourceLine)
+ , m_whatMessage(other.m_whatMessage)
{
- m_message = other.m_message;
- m_sourceLine = other.m_sourceLine;
}
-
Exception::Exception( const Message &message,
const SourceLine &sourceLine )
: m_message( message )
, m_sourceLine( sourceLine )
+ , m_whatMessage()
{
}
-
#ifdef CPPUNIT_ENABLE_SOURCELINE_DEPRECATED
Exception::Exception( std::string message,
long lineNumber,
diff --git a/3rdParty/CppUnit/src/src/cppunit/Message.cpp b/3rdParty/CppUnit/src/src/cppunit/Message.cpp
index 9d6a0e9..ad2efd9 100644
--- a/3rdParty/CppUnit/src/src/cppunit/Message.cpp
+++ b/3rdParty/CppUnit/src/src/cppunit/Message.cpp
@@ -4,19 +4,16 @@
CPPUNIT_NS_BEGIN
-
-Message::Message()
-{
-}
-
Message::Message( const Message &other )
+ : m_shortDescription()
+ , m_details()
{
*this = other;
}
-
Message::Message( const std::string &shortDescription )
: m_shortDescription( shortDescription )
+ , m_details()
{
}
@@ -24,6 +21,7 @@ Message::Message( const std::string &shortDescription )
Message::Message( const std::string &shortDescription,
const std::string &detail1 )
: m_shortDescription( shortDescription )
+ , m_details()
{
addDetail( detail1 );
}
@@ -33,6 +31,7 @@ Message::Message( const std::string &shortDescription,
const std::string &detail1,
const std::string &detail2 )
: m_shortDescription( shortDescription )
+ , m_details()
{
addDetail( detail1, detail2 );
}
@@ -43,10 +42,15 @@ Message::Message( const std::string &shortDescription,
const std::string &detail2,
const std::string &detail3 )
: m_shortDescription( shortDescription )
+ , m_details()
{
addDetail( detail1, detail2, detail3 );
}
+Message::~Message()
+{
+}
+
Message &
Message::operator =( const Message &other )
{
diff --git a/3rdParty/CppUnit/src/src/cppunit/Protector.cpp b/3rdParty/CppUnit/src/src/cppunit/Protector.cpp
index 5c171ec..99188bb 100644
--- a/3rdParty/CppUnit/src/src/cppunit/Protector.cpp
+++ b/3rdParty/CppUnit/src/src/cppunit/Protector.cpp
@@ -21,7 +21,7 @@ void
Protector::reportError( const ProtectorContext &context,
const Exception &error ) const
{
- std::auto_ptr<Exception> actualError( error.clone() );
+ std::unique_ptr<Exception> actualError( error.clone() );
actualError->setMessage( actualMessage( actualError->message(), context ) );
context.m_result->addError( context.m_test,
actualError.release() );
@@ -42,7 +42,7 @@ void
Protector::reportFailure( const ProtectorContext &context,
const Exception &failure ) const
{
- std::auto_ptr<Exception> actualFailure( failure.clone() );
+ std::unique_ptr<Exception> actualFailure( failure.clone() );
actualFailure->setMessage( actualMessage( actualFailure->message(), context ) );
context.m_result->addFailure( context.m_test,
actualFailure.release() );
diff --git a/3rdParty/CppUnit/src/src/cppunit/ProtectorChain.cpp b/3rdParty/CppUnit/src/src/cppunit/ProtectorChain.cpp
index f528341..db7744a 100644
--- a/3rdParty/CppUnit/src/src/cppunit/ProtectorChain.cpp
+++ b/3rdParty/CppUnit/src/src/cppunit/ProtectorChain.cpp
@@ -21,11 +21,20 @@ public:
}
private:
+ // disable copying
+ ProtectFunctor( const ProtectFunctor& );
+ // disable copying
+ ProtectFunctor& operator=( const ProtectFunctor& );
+
Protector *m_protector;
const Functor &m_functor;
const ProtectorContext &m_context;
};
+ProtectorChain::ProtectorChain()
+ : m_protectors(0)
+{
+}
ProtectorChain::~ProtectorChain()
{
diff --git a/3rdParty/CppUnit/src/src/cppunit/ProtectorChain.h b/3rdParty/CppUnit/src/src/cppunit/ProtectorChain.h
index 711b56f..9123782 100644
--- a/3rdParty/CppUnit/src/src/cppunit/ProtectorChain.h
+++ b/3rdParty/CppUnit/src/src/cppunit/ProtectorChain.h
@@ -2,7 +2,7 @@
#define CPPUNIT_PROTECTORCHAIN_H
#include <cppunit/Protector.h>
-#include <cppunit/portability/CppUnitDeque.h>
+#include <deque>
#if CPPUNIT_NEED_DLL_DECL
#pragma warning( push )
@@ -19,6 +19,8 @@ CPPUNIT_NS_BEGIN
class CPPUNIT_API ProtectorChain : public Protector
{
public:
+ ProtectorChain();
+
~ProtectorChain();
void push( Protector *protector );
@@ -34,10 +36,10 @@ private:
class ProtectFunctor;
private:
- typedef CppUnitDeque<Protector *> Protectors;
+ typedef std::deque<Protector *> Protectors;
Protectors m_protectors;
- typedef CppUnitDeque<Functor *> Functors;
+ typedef std::deque<Functor *> Functors;
};
diff --git a/3rdParty/CppUnit/src/src/cppunit/ProtectorContext.h b/3rdParty/CppUnit/src/src/cppunit/ProtectorContext.h
index c3d496c..4957e05 100644
--- a/3rdParty/CppUnit/src/src/cppunit/ProtectorContext.h
+++ b/3rdParty/CppUnit/src/src/cppunit/ProtectorContext.h
@@ -26,6 +26,13 @@ public:
{
}
+private:
+ /// disable copy construction
+ ProtectorContext( const ProtectorContext& );
+ /// disable assignment
+ ProtectorContext& operator=(const ProtectorContext&);
+
+public:
Test *m_test;
TestResult *m_result;
std::string m_shortDescription;
diff --git a/3rdParty/CppUnit/src/src/cppunit/SourceLine.cpp b/3rdParty/CppUnit/src/src/cppunit/SourceLine.cpp
index dfadae3..ecc9558 100644
--- a/3rdParty/CppUnit/src/src/cppunit/SourceLine.cpp
+++ b/3rdParty/CppUnit/src/src/cppunit/SourceLine.cpp
@@ -5,6 +5,7 @@ CPPUNIT_NS_BEGIN
SourceLine::SourceLine() :
+ m_fileName(),
m_lineNumber( -1 )
{
}
diff --git a/3rdParty/CppUnit/src/src/cppunit/TestCase.cpp b/3rdParty/CppUnit/src/src/cppunit/TestCase.cpp
index 13c0525..431a0c5 100644
--- a/3rdParty/CppUnit/src/src/cppunit/TestCase.cpp
+++ b/3rdParty/CppUnit/src/src/cppunit/TestCase.cpp
@@ -5,7 +5,7 @@
#include <cppunit/TestResult.h>
#include <stdexcept>
-#if CPPUNIT_USE_TYPEINFO_NAME
+#if defined(CPPUNIT_USE_TYPEINFO_NAME)
# include <typeinfo>
#endif
diff --git a/3rdParty/CppUnit/src/src/cppunit/TestFactoryRegistry.cpp b/3rdParty/CppUnit/src/src/cppunit/TestFactoryRegistry.cpp
index 3457da3..f1623cc 100644
--- a/3rdParty/CppUnit/src/src/cppunit/TestFactoryRegistry.cpp
+++ b/3rdParty/CppUnit/src/src/cppunit/TestFactoryRegistry.cpp
@@ -1,6 +1,6 @@
#include <cppunit/config/SourcePrefix.h>
#include <cppunit/extensions/TestFactoryRegistry.h>
-#include <cppunit/portability/CppUnitMap.h>
+#include <map>
#include <cppunit/TestSuite.h>
#include <assert.h>
@@ -12,7 +12,7 @@ CPPUNIT_NS_BEGIN
class TestFactoryRegistryList
{
private:
- typedef CppUnitMap<std::string, TestFactoryRegistry *, std::less<std::string> > Registries;
+ typedef std::map<std::string, TestFactoryRegistry *, std::less<std::string> > Registries;
Registries m_registries;
enum State {
@@ -50,6 +50,7 @@ private:
public:
TestFactoryRegistryList()
+ : m_registries()
{
stateFlag( exist );
}
@@ -83,6 +84,7 @@ public:
TestFactoryRegistry::TestFactoryRegistry( std::string name ) :
+ m_factories(),
m_name( name )
{
}
diff --git a/3rdParty/CppUnit/src/src/cppunit/TestNamer.cpp b/3rdParty/CppUnit/src/src/cppunit/TestNamer.cpp
index eec9be9..1eb6c5f 100644
--- a/3rdParty/CppUnit/src/src/cppunit/TestNamer.cpp
+++ b/3rdParty/CppUnit/src/src/cppunit/TestNamer.cpp
@@ -1,44 +1,34 @@
#include <cppunit/extensions/TestNamer.h>
#include <cppunit/extensions/TypeInfoHelper.h>
+#include <cppunit/tools/StringHelper.h>
#include <string>
-
CPPUNIT_NS_BEGIN
-
-#if CPPUNIT_HAVE_RTTI
TestNamer::TestNamer( const std::type_info &typeInfo )
+ : m_fixtureName( TypeInfoHelper::getClassName( typeInfo ) )
{
- m_fixtureName = TypeInfoHelper::getClassName( typeInfo );
}
-#endif
-
TestNamer::TestNamer( const std::string &fixtureName )
: m_fixtureName( fixtureName )
{
}
-
TestNamer::~TestNamer()
{
}
-
std::string
TestNamer::getFixtureName() const
{
return m_fixtureName;
}
-
std::string
TestNamer::getTestNameFor( const std::string &testMethodName ) const
{
return getFixtureName() + "::" + testMethodName;
}
-
-
-
CPPUNIT_NS_END
diff --git a/3rdParty/CppUnit/src/src/cppunit/TestPath.cpp b/3rdParty/CppUnit/src/src/cppunit/TestPath.cpp
index a2783a2..5affffb 100644
--- a/3rdParty/CppUnit/src/src/cppunit/TestPath.cpp
+++ b/3rdParty/CppUnit/src/src/cppunit/TestPath.cpp
@@ -8,11 +8,13 @@ CPPUNIT_NS_BEGIN
TestPath::TestPath()
+ : m_tests()
{
}
TestPath::TestPath( Test *root )
+ : m_tests()
{
add( root );
}
@@ -21,6 +23,7 @@ TestPath::TestPath( Test *root )
TestPath::TestPath( const TestPath &other,
int indexFirst,
int count )
+ : m_tests()
{
int countAdjustment = 0;
if ( indexFirst < 0 )
@@ -42,6 +45,7 @@ TestPath::TestPath( const TestPath &other,
TestPath::TestPath( Test *searchRoot,
const std::string &pathAsString )
+ : m_tests()
{
PathTestNames testNames;
diff --git a/3rdParty/CppUnit/src/src/cppunit/TestResult.cpp b/3rdParty/CppUnit/src/src/cppunit/TestResult.cpp
index 6be19f1..ad880bc 100644
--- a/3rdParty/CppUnit/src/src/cppunit/TestResult.cpp
+++ b/3rdParty/CppUnit/src/src/cppunit/TestResult.cpp
@@ -3,6 +3,7 @@
#include <cppunit/TestListener.h>
#include <cppunit/TestResult.h>
#include <cppunit/tools/Algorithm.h>
+#include <cppunit/portability/Stream.h>
#include <algorithm>
#include "DefaultProtector.h"
#include "ProtectorChain.h"
@@ -13,7 +14,8 @@ CPPUNIT_NS_BEGIN
TestResult::TestResult( SynchronizationObject *syncObject )
: SynchronizedObject( syncObject )
- , m_protectorChain( new ProtectorChain() )
+ , m_listeners()
+ , m_protectorChain( new ProtectorChain )
, m_stop( false )
{
m_protectorChain->push( new DefaultProtector() );
@@ -22,6 +24,8 @@ TestResult::TestResult( SynchronizationObject *syncObject )
TestResult::~TestResult()
{
+ stdCOut().flush();
+ stdCErr().flush();
delete m_protectorChain;
}
diff --git a/3rdParty/CppUnit/src/src/cppunit/TestResultCollector.cpp b/3rdParty/CppUnit/src/src/cppunit/TestResultCollector.cpp
index 4371c50..73f81da 100644
--- a/3rdParty/CppUnit/src/src/cppunit/TestResultCollector.cpp
+++ b/3rdParty/CppUnit/src/src/cppunit/TestResultCollector.cpp
@@ -7,6 +7,9 @@ CPPUNIT_NS_BEGIN
TestResultCollector::TestResultCollector( SynchronizationObject *syncObject )
: TestSuccessListener( syncObject )
+ , m_tests()
+ , m_failures()
+ , m_testErrors(0)
{
reset();
}
diff --git a/3rdParty/CppUnit/src/src/cppunit/TestSuite.cpp b/3rdParty/CppUnit/src/src/cppunit/TestSuite.cpp
index 8dd2ea6..b5d6db3 100644
--- a/3rdParty/CppUnit/src/src/cppunit/TestSuite.cpp
+++ b/3rdParty/CppUnit/src/src/cppunit/TestSuite.cpp
@@ -8,6 +8,7 @@ CPPUNIT_NS_BEGIN
/// Default constructor
TestSuite::TestSuite( std::string name )
: TestComposite( name )
+ , m_tests()
{
}
@@ -39,7 +40,7 @@ TestSuite::addTest( Test *test )
}
-const CppUnitVector<Test *> &
+const std::vector<Test *> &
TestSuite::getTests() const
{
return m_tests;
diff --git a/3rdParty/CppUnit/src/src/cppunit/TestSuiteBuilderContext.cpp b/3rdParty/CppUnit/src/src/cppunit/TestSuiteBuilderContext.cpp
index ff71b52..5e4347e 100644
--- a/3rdParty/CppUnit/src/src/cppunit/TestSuiteBuilderContext.cpp
+++ b/3rdParty/CppUnit/src/src/cppunit/TestSuiteBuilderContext.cpp
@@ -13,6 +13,7 @@ TestSuiteBuilderContextBase::TestSuiteBuilderContextBase(
: m_suite( suite )
, m_namer( namer )
, m_factory( factory )
+ , m_properties()
{
}
diff --git a/3rdParty/CppUnit/src/src/cppunit/TextTestProgressListener.cpp b/3rdParty/CppUnit/src/src/cppunit/TextTestProgressListener.cpp
index 5bbe768..ea4fb17 100644
--- a/3rdParty/CppUnit/src/src/cppunit/TextTestProgressListener.cpp
+++ b/3rdParty/CppUnit/src/src/cppunit/TextTestProgressListener.cpp
@@ -20,6 +20,7 @@ void
TextTestProgressListener::startTest( Test * )
{
stdCOut() << ".";
+ stdCOut().flush();
}
@@ -27,6 +28,7 @@ void
TextTestProgressListener::addFailure( const TestFailure &failure )
{
stdCOut() << ( failure.isError() ? "E" : "F" );
+ stdCOut().flush();
}
diff --git a/3rdParty/CppUnit/src/src/cppunit/TypeInfoHelper.cpp b/3rdParty/CppUnit/src/src/cppunit/TypeInfoHelper.cpp
index 2febac6..aa24a80 100644
--- a/3rdParty/CppUnit/src/src/cppunit/TypeInfoHelper.cpp
+++ b/3rdParty/CppUnit/src/src/cppunit/TypeInfoHelper.cpp
@@ -1,19 +1,16 @@
#include <cppunit/Portability.h>
#include <cppunit/extensions/TypeInfoHelper.h>
-#include <stdlib.h>
-
-#if CPPUNIT_HAVE_RTTI
#include <string>
#if CPPUNIT_HAVE_GCC_ABI_DEMANGLE
+#include <cstdlib>
#include <cxxabi.h>
#endif
CPPUNIT_NS_BEGIN
-
std::string
TypeInfoHelper::getClassName( const std::type_info &info )
{
@@ -22,10 +19,21 @@ TypeInfoHelper::getClassName( const std::type_info &info )
int status = 0;
char* c_name = 0;
- c_name = abi::__cxa_demangle( info.name(), 0, 0, &status );
-
- std::string name( c_name );
- free( c_name );
+ const char* c_origName = info.name();
+ if(c_origName[0] == '*')
+ ++c_origName;
+ c_name = abi::__cxa_demangle( c_origName, 0, 0, &status );
+
+ std::string name;
+ if(c_name)
+ {
+ name = std::string( c_name );
+ free( c_name );
+ }
+ else
+ {
+ name = std::string( c_origName );
+ }
#else // CPPUNIT_HAVE_GCC_ABI_DEMANGLE
@@ -48,7 +56,4 @@ TypeInfoHelper::getClassName( const std::type_info &info )
return name;
}
-
CPPUNIT_NS_END
-
-#endif // CPPUNIT_HAVE_RTTI
diff --git a/3rdParty/CppUnit/src/src/cppunit/XmlDocument.cpp b/3rdParty/CppUnit/src/src/cppunit/XmlDocument.cpp
index 31f9115..4b09769 100644
--- a/3rdParty/CppUnit/src/src/cppunit/XmlDocument.cpp
+++ b/3rdParty/CppUnit/src/src/cppunit/XmlDocument.cpp
@@ -5,7 +5,6 @@
CPPUNIT_NS_BEGIN
-
XmlDocument::XmlDocument( const std::string &encoding,
const std::string &styleSheet )
: m_styleSheet( styleSheet )
@@ -15,7 +14,6 @@ XmlDocument::XmlDocument( const std::string &encoding,
setEncoding( encoding );
}
-
XmlDocument::~XmlDocument()
{
delete m_rootElement;
diff --git a/3rdParty/CppUnit/src/src/cppunit/XmlElement.cpp b/3rdParty/CppUnit/src/src/cppunit/XmlElement.cpp
index f930ad4..b16d2fe 100644
--- a/3rdParty/CppUnit/src/src/cppunit/XmlElement.cpp
+++ b/3rdParty/CppUnit/src/src/cppunit/XmlElement.cpp
@@ -10,6 +10,8 @@ XmlElement::XmlElement( std::string elementName,
std::string content )
: m_name( elementName )
, m_content( content )
+ , m_attributes()
+ , m_elements()
{
}
@@ -17,6 +19,9 @@ XmlElement::XmlElement( std::string elementName,
XmlElement::XmlElement( std::string elementName,
int numericContent )
: m_name( elementName )
+ , m_content()
+ , m_attributes()
+ , m_elements()
{
setContent( numericContent );
}
diff --git a/3rdParty/CppUnit/src/src/cppunit/XmlOutputter.cpp b/3rdParty/CppUnit/src/src/cppunit/XmlOutputter.cpp
index c605e33..e1cb690 100644
--- a/3rdParty/CppUnit/src/src/cppunit/XmlOutputter.cpp
+++ b/3rdParty/CppUnit/src/src/cppunit/XmlOutputter.cpp
@@ -15,10 +15,13 @@ CPPUNIT_NS_BEGIN
XmlOutputter::XmlOutputter( TestResultCollector *result,
OStream &stream,
- std::string encoding )
+ const std::string& encoding )
: m_result( result )
, m_stream( stream )
+ , m_encoding( encoding )
+ , m_styleSheet()
, m_xml( new XmlDocument( encoding ) )
+ , m_hooks()
{
}
diff --git a/3rdParty/Expat/SConscript b/3rdParty/Expat/SConscript
index 56949aa..9a0cecd 100644
--- a/3rdParty/Expat/SConscript
+++ b/3rdParty/Expat/SConscript
@@ -8,6 +8,12 @@ if env.get("EXPAT_BUNDLED", False) :
"LIBPATH": [Dir(".")],
}
+ def checkBuilds(context, message, source):
+ context.Message(message)
+ result = context.TryLink(source, '.cpp')
+ context.Result(result)
+ return result
+
if env["SCONS_STAGE"] == "build" :
myenv = env.Clone()
myenv.Append(CPPDEFINES = ["XML_STATIC", "HAVE_EXPAT_CONFIG_H"])
@@ -22,8 +28,58 @@ if env.get("EXPAT_BUNDLED", False) :
myenv.Append(CPPDEFINES = ["HAVE_MEMMOVE"])
conf.Finish()
+ if env["PLATFORM"] != "win32" :
+ conf = Configure(conf_env, custom_tests = { "CheckBuilds" : checkBuilds})
+ if conf.CheckBuilds('Checking for C function getrandom()... ',
+ """
+ #include <stdlib.h> /* for NULL */
+ #include <sys/random.h>
+ int main() {
+ return getrandom(NULL, 0U, 0U);
+ }
+ """):
+ myenv.Append(CPPDEFINES = ["HAVE_GETRANDOM"])
+ elif conf.CheckBuilds('Checking for syscall SYS_getrandom... ',
+ """
+ #include <stdlib.h> /* for NULL */
+ #include <unistd.h> /* for syscall */
+ #include <sys/syscall.h> /* for SYS_getrandom */
+ int main() {
+ syscall(SYS_getrandom, NULL, 0, 0);
+ return 0;
+ }
+ """):
+ myenv.Append(CPPDEFINES = ["HAVE_SYSCALL_GETRANDOM"])
+ elif conf.CheckBuilds('Checking for arc4random_buf... ',
+ """
+ #include <stdlib.h> /* for arc4random_buf on BSD, for NULL */
+ #if defined(HAVE_LIBBSD)
+ # include <bsd/stdlib.h>
+ #endif
+ int main() {
+ arc4random_buf(NULL, 0U);
+ return 0;
+ }
+ """):
+ myenv.Append(CPPDEFINES = ["HAVE_ARC4RANDOM_BUF"])
+ elif conf.CheckBuilds('Checking for arc4random... ',
+ """
+ #if defined(HAVE_LIBBSD)
+ # include <bsd/stdlib.h>
+ #else
+ # include <stdlib.h>
+ #endif
+ int main() {
+ arc4random();
+ return 0;
+ }
+ """):
+ myenv.Append(CPPDEFINES = ["HAVE_ARC4RANDOM"])
+ conf.Finish()
+
env["EXPAT_OBJECTS"] = myenv.SwiftenObject([
"src/xmltok.c",
"src/xmlparse.c",
- "src/xmlrole.c"
- ])
+ "src/xmlrole.c",
+ "src/loadlibrary.c",
+ ]) \ No newline at end of file
diff --git a/3rdParty/Expat/src/ascii.h b/3rdParty/Expat/src/ascii.h
index d10530b..c3587e5 100644
--- a/3rdParty/Expat/src/ascii.h
+++ b/3rdParty/Expat/src/ascii.h
@@ -1,5 +1,33 @@
-/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd
- See the file COPYING for copying permission.
+/*
+ __ __ _
+ ___\ \/ /_ __ __ _| |_
+ / _ \\ /| '_ \ / _` | __|
+ | __// \| |_) | (_| | |_
+ \___/_/\_\ .__/ \__,_|\__|
+ |_| XML parser
+
+ Copyright (c) 1997-2000 Thai Open Source Software Center Ltd
+ Copyright (c) 2000-2017 Expat development team
+ Licensed under the MIT license:
+
+ Permission is hereby granted, free of charge, to any person obtaining
+ a copy of this software and associated documentation files (the
+ "Software"), to deal in the Software without restriction, including
+ without limitation the rights to use, copy, modify, merge, publish,
+ distribute, sublicense, and/or sell copies of the Software, and to permit
+ persons to whom the Software is furnished to do so, subject to the
+ following conditions:
+
+ The above copyright notice and this permission notice shall be included
+ in all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+ NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+ OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+ USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
#define ASCII_A 0x41
diff --git a/3rdParty/Expat/src/asciitab.h b/3rdParty/Expat/src/asciitab.h
index 79a15c2..2f59fd9 100644
--- a/3rdParty/Expat/src/asciitab.h
+++ b/3rdParty/Expat/src/asciitab.h
@@ -1,5 +1,33 @@
-/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd
- See the file COPYING for copying permission.
+/*
+ __ __ _
+ ___\ \/ /_ __ __ _| |_
+ / _ \\ /| '_ \ / _` | __|
+ | __// \| |_) | (_| | |_
+ \___/_/\_\ .__/ \__,_|\__|
+ |_| XML parser
+
+ Copyright (c) 1997-2000 Thai Open Source Software Center Ltd
+ Copyright (c) 2000-2017 Expat development team
+ Licensed under the MIT license:
+
+ Permission is hereby granted, free of charge, to any person obtaining
+ a copy of this software and associated documentation files (the
+ "Software"), to deal in the Software without restriction, including
+ without limitation the rights to use, copy, modify, merge, publish,
+ distribute, sublicense, and/or sell copies of the Software, and to permit
+ persons to whom the Software is furnished to do so, subject to the
+ following conditions:
+
+ The above copyright notice and this permission notice shall be included
+ in all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+ NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+ OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+ USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
/* 0x00 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML,
diff --git a/3rdParty/Expat/src/expat.h b/3rdParty/Expat/src/expat.h
index 28b0f95..c050f1d 100644
--- a/3rdParty/Expat/src/expat.h
+++ b/3rdParty/Expat/src/expat.h
@@ -1,5 +1,33 @@
-/* Copyright (c) 1998, 1999, 2000 Thai Open Source Software Center Ltd
- See the file COPYING for copying permission.
+/*
+ __ __ _
+ ___\ \/ /_ __ __ _| |_
+ / _ \\ /| '_ \ / _` | __|
+ | __// \| |_) | (_| | |_
+ \___/_/\_\ .__/ \__,_|\__|
+ |_| XML parser
+
+ Copyright (c) 1997-2000 Thai Open Source Software Center Ltd
+ Copyright (c) 2000-2017 Expat development team
+ Licensed under the MIT license:
+
+ Permission is hereby granted, free of charge, to any person obtaining
+ a copy of this software and associated documentation files (the
+ "Software"), to deal in the Software without restriction, including
+ without limitation the rights to use, copy, modify, merge, publish,
+ distribute, sublicense, and/or sell copies of the Software, and to permit
+ persons to whom the Software is furnished to do so, subject to the
+ following conditions:
+
+ The above copyright notice and this permission notice shall be included
+ in all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+ NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+ OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+ USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
#ifndef Expat_INCLUDED
@@ -24,7 +52,6 @@ extern "C" {
struct XML_ParserStruct;
typedef struct XML_ParserStruct *XML_Parser;
-/* Should this be defined using stdbool.h when C99 is available? */
typedef unsigned char XML_Bool;
#define XML_TRUE ((XML_Bool) 1)
#define XML_FALSE ((XML_Bool) 0)
@@ -237,7 +264,7 @@ XML_ParserCreate_MM(const XML_Char *encoding,
const XML_Char *namespaceSeparator);
/* Prepare a parser object to be re-used. This is particularly
- valuable when memory allocation overhead is disproportionatly high,
+ valuable when memory allocation overhead is disproportionately high,
such as when a large number of small documnents need to be parsed.
All handlers are cleared from the parser, except for the
unknownEncodingHandler. The parser's external state is re-initialized
@@ -1049,7 +1076,7 @@ XML_GetFeatureList(void);
*/
#define XML_MAJOR_VERSION 2
#define XML_MINOR_VERSION 2
-#define XML_MICRO_VERSION 1
+#define XML_MICRO_VERSION 7
#ifdef __cplusplus
}
diff --git a/3rdParty/Expat/src/expat_external.h b/3rdParty/Expat/src/expat_external.h
index 892eb4b..875225d 100644
--- a/3rdParty/Expat/src/expat_external.h
+++ b/3rdParty/Expat/src/expat_external.h
@@ -1,5 +1,33 @@
-/* Copyright (c) 1998, 1999, 2000 Thai Open Source Software Center Ltd
- See the file COPYING for copying permission.
+/*
+ __ __ _
+ ___\ \/ /_ __ __ _| |_
+ / _ \\ /| '_ \ / _` | __|
+ | __// \| |_) | (_| | |_
+ \___/_/\_\ .__/ \__,_|\__|
+ |_| XML parser
+
+ Copyright (c) 1997-2000 Thai Open Source Software Center Ltd
+ Copyright (c) 2000-2017 Expat development team
+ Licensed under the MIT license:
+
+ Permission is hereby granted, free of charge, to any person obtaining
+ a copy of this software and associated documentation files (the
+ "Software"), to deal in the Software without restriction, including
+ without limitation the rights to use, copy, modify, merge, publish,
+ distribute, sublicense, and/or sell copies of the Software, and to permit
+ persons to whom the Software is furnished to do so, subject to the
+ following conditions:
+
+ The above copyright notice and this permission notice shall be included
+ in all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+ NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+ OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+ USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
#ifndef Expat_External_INCLUDED
@@ -8,7 +36,7 @@
/* External API definitions */
#if defined(_MSC_EXTENSIONS) && !defined(__BEOS__) && !defined(__CYGWIN__)
-#define XML_USE_MSC_EXTENSIONS 1
+# define XML_USE_MSC_EXTENSIONS 1
#endif
/* Expat tries very hard to make the API boundary very specifically
@@ -34,11 +62,11 @@
system headers may assume the cdecl convention.
*/
#ifndef XMLCALL
-#if defined(_MSC_VER)
-#define XMLCALL __cdecl
-#elif defined(__GNUC__) && defined(__i386) && !defined(__INTEL_COMPILER)
-#define XMLCALL __attribute__((cdecl))
-#else
+# if defined(_MSC_VER)
+# define XMLCALL __cdecl
+# elif defined(__GNUC__) && defined(__i386) && !defined(__INTEL_COMPILER)
+# define XMLCALL __attribute__((cdecl))
+# else
/* For any platform which uses this definition and supports more than
one calling convention, we need to extend this definition to
declare the convention used on that platform, if it's possible to
@@ -49,41 +77,45 @@
pre-processor and how to specify the same calling convention as the
platform's malloc() implementation.
*/
-#define XMLCALL
-#endif
+# define XMLCALL
+# endif
#endif /* not defined XMLCALL */
#if !defined(XML_STATIC) && !defined(XMLIMPORT)
-#ifndef XML_BUILDING_EXPAT
+# ifndef XML_BUILDING_EXPAT
/* using Expat from an application */
-#ifdef XML_USE_MSC_EXTENSIONS
-#define XMLIMPORT __declspec(dllimport)
-#endif
+# ifdef XML_USE_MSC_EXTENSIONS
+# define XMLIMPORT __declspec(dllimport)
+# endif
-#endif
+# endif
#endif /* not defined XML_STATIC */
-#if !defined(XMLIMPORT) && defined(__GNUC__) && (__GNUC__ >= 4)
-#define XMLIMPORT __attribute__ ((visibility ("default")))
+#ifndef XML_ENABLE_VISIBILITY
+# define XML_ENABLE_VISIBILITY 0
+#endif
+
+#if !defined(XMLIMPORT) && XML_ENABLE_VISIBILITY
+# define XMLIMPORT __attribute__ ((visibility ("default")))
#endif
/* If we didn't define it above, define it away: */
#ifndef XMLIMPORT
-#define XMLIMPORT
+# define XMLIMPORT
#endif
#if defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 96))
-#define XML_ATTR_MALLOC __attribute__((__malloc__))
+# define XML_ATTR_MALLOC __attribute__((__malloc__))
#else
-#define XML_ATTR_MALLOC
+# define XML_ATTR_MALLOC
#endif
#if defined(__GNUC__) && ((__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3))
-#define XML_ATTR_ALLOC_SIZE(x) __attribute__((__alloc_size__(x)))
+# define XML_ATTR_ALLOC_SIZE(x) __attribute__((__alloc_size__(x)))
#else
-#define XML_ATTR_ALLOC_SIZE(x)
+# define XML_ATTR_ALLOC_SIZE(x)
#endif
#define XMLPARSEAPI(type) XMLIMPORT type XMLCALL
@@ -93,33 +125,35 @@ extern "C" {
#endif
#ifdef XML_UNICODE_WCHAR_T
-# define XML_UNICODE
+# ifndef XML_UNICODE
+# define XML_UNICODE
+# endif
# if defined(__SIZEOF_WCHAR_T__) && (__SIZEOF_WCHAR_T__ != 2)
# error "sizeof(wchar_t) != 2; Need -fshort-wchar for both Expat and libc"
# endif
#endif
#ifdef XML_UNICODE /* Information is UTF-16 encoded. */
-#ifdef XML_UNICODE_WCHAR_T
+# ifdef XML_UNICODE_WCHAR_T
typedef wchar_t XML_Char;
typedef wchar_t XML_LChar;
-#else
+# else
typedef unsigned short XML_Char;
typedef char XML_LChar;
-#endif /* XML_UNICODE_WCHAR_T */
+# endif /* XML_UNICODE_WCHAR_T */
#else /* Information is UTF-8 encoded. */
typedef char XML_Char;
typedef char XML_LChar;
#endif /* XML_UNICODE */
#ifdef XML_LARGE_SIZE /* Use large integers for file/stream positions. */
-#if defined(XML_USE_MSC_EXTENSIONS) && _MSC_VER < 1400
+# if defined(XML_USE_MSC_EXTENSIONS) && _MSC_VER < 1400
typedef __int64 XML_Index;
typedef unsigned __int64 XML_Size;
-#else
+# else
typedef long long XML_Index;
typedef unsigned long long XML_Size;
-#endif
+# endif
#else
typedef long XML_Index;
typedef unsigned long XML_Size;
diff --git a/3rdParty/Expat/src/iasciitab.h b/3rdParty/Expat/src/iasciitab.h
index 24a1d5c..ce4a4bf 100644
--- a/3rdParty/Expat/src/iasciitab.h
+++ b/3rdParty/Expat/src/iasciitab.h
@@ -1,5 +1,33 @@
-/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd
- See the file COPYING for copying permission.
+/*
+ __ __ _
+ ___\ \/ /_ __ __ _| |_
+ / _ \\ /| '_ \ / _` | __|
+ | __// \| |_) | (_| | |_
+ \___/_/\_\ .__/ \__,_|\__|
+ |_| XML parser
+
+ Copyright (c) 1997-2000 Thai Open Source Software Center Ltd
+ Copyright (c) 2000-2017 Expat development team
+ Licensed under the MIT license:
+
+ Permission is hereby granted, free of charge, to any person obtaining
+ a copy of this software and associated documentation files (the
+ "Software"), to deal in the Software without restriction, including
+ without limitation the rights to use, copy, modify, merge, publish,
+ distribute, sublicense, and/or sell copies of the Software, and to permit
+ persons to whom the Software is furnished to do so, subject to the
+ following conditions:
+
+ The above copyright notice and this permission notice shall be included
+ in all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+ NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+ OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+ USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
/* Like asciitab.h, except that 0xD has code BT_S rather than BT_CR */
diff --git a/3rdParty/Expat/src/internal.h b/3rdParty/Expat/src/internal.h
index 94cb98e..dc4ef0c 100644
--- a/3rdParty/Expat/src/internal.h
+++ b/3rdParty/Expat/src/internal.h
@@ -18,6 +18,35 @@
Note: Use of these macros is based on judgement, not hard rules,
and therefore subject to change.
+ __ __ _
+ ___\ \/ /_ __ __ _| |_
+ / _ \\ /| '_ \ / _` | __|
+ | __// \| |_) | (_| | |_
+ \___/_/\_\ .__/ \__,_|\__|
+ |_| XML parser
+
+ Copyright (c) 1997-2000 Thai Open Source Software Center Ltd
+ Copyright (c) 2000-2017 Expat development team
+ Licensed under the MIT license:
+
+ Permission is hereby granted, free of charge, to any person obtaining
+ a copy of this software and associated documentation files (the
+ "Software"), to deal in the Software without restriction, including
+ without limitation the rights to use, copy, modify, merge, publish,
+ distribute, sublicense, and/or sell copies of the Software, and to permit
+ persons to whom the Software is furnished to do so, subject to the
+ following conditions:
+
+ The above copyright notice and this permission notice shall be included
+ in all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+ NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+ OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+ USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
#if defined(__GNUC__) && defined(__i386__) && !defined(__MINGW32__)
@@ -86,8 +115,13 @@ extern "C" {
#endif
+#ifdef XML_ENABLE_VISIBILITY
+#if XML_ENABLE_VISIBILITY
+__attribute__ ((visibility ("default")))
+#endif
+#endif
void
-align_limit_to_full_utf8_characters(const char * from, const char ** fromLimRef);
+_INTERNAL_trim_to_complete_utf8_characters(const char * from, const char ** fromLimRef);
#ifdef __cplusplus
diff --git a/3rdParty/Expat/src/latin1tab.h b/3rdParty/Expat/src/latin1tab.h
index 53c25d7..95dfa52 100644
--- a/3rdParty/Expat/src/latin1tab.h
+++ b/3rdParty/Expat/src/latin1tab.h
@@ -1,5 +1,33 @@
-/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd
- See the file COPYING for copying permission.
+/*
+ __ __ _
+ ___\ \/ /_ __ __ _| |_
+ / _ \\ /| '_ \ / _` | __|
+ | __// \| |_) | (_| | |_
+ \___/_/\_\ .__/ \__,_|\__|
+ |_| XML parser
+
+ Copyright (c) 1997-2000 Thai Open Source Software Center Ltd
+ Copyright (c) 2000-2017 Expat development team
+ Licensed under the MIT license:
+
+ Permission is hereby granted, free of charge, to any person obtaining
+ a copy of this software and associated documentation files (the
+ "Software"), to deal in the Software without restriction, including
+ without limitation the rights to use, copy, modify, merge, publish,
+ distribute, sublicense, and/or sell copies of the Software, and to permit
+ persons to whom the Software is furnished to do so, subject to the
+ following conditions:
+
+ The above copyright notice and this permission notice shall be included
+ in all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+ NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+ OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+ USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
/* 0x80 */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER,
diff --git a/3rdParty/Expat/src/loadlibrary.c b/3rdParty/Expat/src/loadlibrary.c
new file mode 100644
index 0000000..35fdf98
--- /dev/null
+++ b/3rdParty/Expat/src/loadlibrary.c
@@ -0,0 +1,143 @@
+/***************************************************************************
+ * _ _ ____ _
+ * Project ___| | | | _ \| |
+ * / __| | | | |_) | |
+ * | (__| |_| | _ <| |___
+ * \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 2016 - 2017, Steve Holme, <steve_holme@hotmail.com>.
+ * Copyright (C) 2017, Expat development team
+ *
+ * All rights reserved.
+ * Licensed under the MIT license:
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF
+ * THIRD PARTY RIGHTS. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+ * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
+ * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH
+ * THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * Except as contained in this notice, the name of a copyright holder shall
+ * not be used in advertising or otherwise to promote the sale, use or other
+ * dealings in this Software without prior written authorization of the
+ * copyright holder.
+ *
+ ***************************************************************************/
+
+#if defined(_WIN32)
+
+#include <windows.h>
+#include <tchar.h>
+
+
+HMODULE _Expat_LoadLibrary(LPCTSTR filename);
+
+
+#if !defined(LOAD_WITH_ALTERED_SEARCH_PATH)
+#define LOAD_WITH_ALTERED_SEARCH_PATH 0x00000008
+#endif
+
+#if !defined(LOAD_LIBRARY_SEARCH_SYSTEM32)
+#define LOAD_LIBRARY_SEARCH_SYSTEM32 0x00000800
+#endif
+
+/* We use our own typedef here since some headers might lack these */
+typedef HMODULE (APIENTRY *LOADLIBRARYEX_FN)(LPCTSTR, HANDLE, DWORD);
+
+/* See function definitions in winbase.h */
+#ifdef UNICODE
+# ifdef _WIN32_WCE
+# define LOADLIBARYEX L"LoadLibraryExW"
+# else
+# define LOADLIBARYEX "LoadLibraryExW"
+# endif
+#else
+# define LOADLIBARYEX "LoadLibraryExA"
+#endif
+
+
+/*
+ * _Expat_LoadLibrary()
+ *
+ * This is used to dynamically load DLLs using the most secure method available
+ * for the version of Windows that we are running on.
+ *
+ * Parameters:
+ *
+ * filename [in] - The filename or full path of the DLL to load. If only the
+ * filename is passed then the DLL will be loaded from the
+ * Windows system directory.
+ *
+ * Returns the handle of the module on success; otherwise NULL.
+ */
+HMODULE _Expat_LoadLibrary(LPCTSTR filename)
+{
+ HMODULE hModule = NULL;
+ LOADLIBRARYEX_FN pLoadLibraryEx = NULL;
+
+ /* Get a handle to kernel32 so we can access it's functions at runtime */
+ HMODULE hKernel32 = GetModuleHandle(TEXT("kernel32"));
+ if(!hKernel32)
+ return NULL; /* LCOV_EXCL_LINE */
+
+ /* Attempt to find LoadLibraryEx() which is only available on Windows 2000
+ and above */
+ pLoadLibraryEx = (LOADLIBRARYEX_FN) GetProcAddress(hKernel32, LOADLIBARYEX);
+
+ /* Detect if there's already a path in the filename and load the library if
+ there is. Note: Both back slashes and forward slashes have been supported
+ since the earlier days of DOS at an API level although they are not
+ supported by command prompt */
+ if(_tcspbrk(filename, TEXT("\\/"))) {
+ /** !checksrc! disable BANNEDFUNC 1 **/
+ hModule = pLoadLibraryEx ?
+ pLoadLibraryEx(filename, NULL, LOAD_WITH_ALTERED_SEARCH_PATH) :
+ LoadLibrary(filename);
+ }
+ /* Detect if KB2533623 is installed, as LOAD_LIBARY_SEARCH_SYSTEM32 is only
+ supported on Windows Vista, Windows Server 2008, Windows 7 and Windows
+ Server 2008 R2 with this patch or natively on Windows 8 and above */
+ else if(pLoadLibraryEx && GetProcAddress(hKernel32, "AddDllDirectory")) {
+ /* Load the DLL from the Windows system directory */
+ hModule = pLoadLibraryEx(filename, NULL, LOAD_LIBRARY_SEARCH_SYSTEM32);
+ }
+ else {
+ /* Attempt to get the Windows system path */
+ UINT systemdirlen = GetSystemDirectory(NULL, 0);
+ if(systemdirlen) {
+ /* Allocate space for the full DLL path (Room for the null terminator
+ is included in systemdirlen) */
+ size_t filenamelen = _tcslen(filename);
+ TCHAR *path = malloc(sizeof(TCHAR) * (systemdirlen + 1 + filenamelen));
+ if(path && GetSystemDirectory(path, systemdirlen)) {
+ /* Calculate the full DLL path */
+ _tcscpy(path + _tcslen(path), TEXT("\\"));
+ _tcscpy(path + _tcslen(path), filename);
+
+ /* Load the DLL from the Windows system directory */
+ /** !checksrc! disable BANNEDFUNC 1 **/
+ hModule = pLoadLibraryEx ?
+ pLoadLibraryEx(path, NULL, LOAD_WITH_ALTERED_SEARCH_PATH) :
+ LoadLibrary(path);
+
+ }
+ free(path);
+ }
+ }
+
+ return hModule;
+}
+
+#else /* defined(_WIN32) */
+
+/* ISO C requires a translation unit to contain at least one declaration
+ [-Wempty-translation-unit] */
+typedef int _TRANSLATION_UNIT_LOAD_LIBRARY_C_NOT_EMTPY;
+
+#endif /* defined(_WIN32) */
diff --git a/3rdParty/Expat/src/nametab.h b/3rdParty/Expat/src/nametab.h
index b05e62c..bfa2bd3 100644
--- a/3rdParty/Expat/src/nametab.h
+++ b/3rdParty/Expat/src/nametab.h
@@ -1,3 +1,35 @@
+/*
+ __ __ _
+ ___\ \/ /_ __ __ _| |_
+ / _ \\ /| '_ \ / _` | __|
+ | __// \| |_) | (_| | |_
+ \___/_/\_\ .__/ \__,_|\__|
+ |_| XML parser
+
+ Copyright (c) 1997-2000 Thai Open Source Software Center Ltd
+ Copyright (c) 2000-2017 Expat development team
+ Licensed under the MIT license:
+
+ Permission is hereby granted, free of charge, to any person obtaining
+ a copy of this software and associated documentation files (the
+ "Software"), to deal in the Software without restriction, including
+ without limitation the rights to use, copy, modify, merge, publish,
+ distribute, sublicense, and/or sell copies of the Software, and to permit
+ persons to whom the Software is furnished to do so, subject to the
+ following conditions:
+
+ The above copyright notice and this permission notice shall be included
+ in all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+ NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+ OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+ USE OR OTHER DEALINGS IN THE SOFTWARE.
+*/
+
static const unsigned namingBitmap[] = {
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
diff --git a/3rdParty/Expat/src/siphash.h b/3rdParty/Expat/src/siphash.h
index 23b56d2..4d6786d 100644
--- a/3rdParty/Expat/src/siphash.h
+++ b/3rdParty/Expat/src/siphash.h
@@ -2,9 +2,8 @@
* siphash.h - SipHash-2-4 in a single header file
* --------------------------------------------------------------------------
* Derived by William Ahern from the reference implementation[1] published[2]
- * by Jean-Philippe Aumasson and Daniel J. Berstein. Licensed in kind.
* by Jean-Philippe Aumasson and Daniel J. Berstein.
- * Minimal changes by Sebastian Pipping on top, details below.
+ * Minimal changes by Sebastian Pipping and Victor Stinner on top, see below.
* Licensed under the CC0 Public Domain Dedication license.
*
* 1. https://www.131002.net/siphash/siphash24.c
@@ -12,14 +11,31 @@
* --------------------------------------------------------------------------
* HISTORY:
*
- * 2017-06-10 (Sebastian Pipping)
+ * 2018-07-08 (Anton Maklakov)
+ * - Add "fall through" markers for GCC's -Wimplicit-fallthrough
+ *
+ * 2017-11-03 (Sebastian Pipping)
+ * - Hide sip_tobin and sip_binof unless SIPHASH_TOBIN macro is defined
+ *
+ * 2017-07-25 (Vadim Zeitlin)
+ * - Fix use of SIPHASH_MAIN macro
+ *
+ * 2017-07-05 (Sebastian Pipping)
+ * - Use _SIP_ULL macro to not require a C++11 compiler if compiled as C++
+ * - Add const qualifiers at two places
+ * - Ensure <=80 characters line length (assuming tab width 4)
+ *
+ * 2017-06-23 (Victor Stinner)
+ * - Address Win64 compile warnings
+ *
+ * 2017-06-18 (Sebastian Pipping)
* - Clarify license note in the header
* - Address C89 issues:
* - Stop using inline keyword (and let compiler decide)
- * - Turn integer suffix ULL to UL
* - Replace _Bool by int
* - Turn macro siphash24 into a function
* - Address invalid conversion (void pointer) by explicit cast
+ * - Address lack of stdint.h for Visual Studio 2003 to 2008
* - Always expose sip24_valid (for self-tests)
*
* 2012-11-04 - Born. (William Ahern)
@@ -76,7 +92,23 @@
#define SIPHASH_H
#include <stddef.h> /* size_t */
-#include <stdint.h> /* uint64_t uint32_t uint8_t */
+
+#if defined(_WIN32) && defined(_MSC_VER) && (_MSC_VER < 1600)
+ /* For vs2003/7.1 up to vs2008/9.0; _MSC_VER 1600 is vs2010/10.0 */
+ typedef unsigned __int8 uint8_t;
+ typedef unsigned __int32 uint32_t;
+ typedef unsigned __int64 uint64_t;
+#else
+ #include <stdint.h> /* uint64_t uint32_t uint8_t */
+#endif
+
+
+/*
+ * Workaround to not require a C++11 compiler for using ULL suffix
+ * if this code is included and compiled as C++; related GCC warning is:
+ * warning: use of C++11 long long integer constant [-Wlong-long]
+ */
+#define _SIP_ULL(high, low) (((uint64_t)high << 32) | low)
#define SIP_ROTL(x, b) (uint64_t)(((x) << (b)) | ( (x) >> (64 - (b))))
@@ -125,6 +157,8 @@ static struct sipkey *sip_tokey(struct sipkey *key, const void *src) {
} /* sip_tokey() */
+#ifdef SIPHASH_TOBIN
+
#define sip_binof(v) sip_tobin((unsigned char[8]){ 0 }, (v))
static void *sip_tobin(void *dst, uint64_t u64) {
@@ -132,6 +166,8 @@ static void *sip_tobin(void *dst, uint64_t u64) {
return dst;
} /* sip_tobin() */
+#endif /* SIPHASH_TOBIN */
+
static void sip_round(struct siphash *H, const int rounds) {
int i;
@@ -158,11 +194,12 @@ static void sip_round(struct siphash *H, const int rounds) {
} /* sip_round() */
-static struct siphash *sip24_init(struct siphash *H, const struct sipkey *key) {
- H->v0 = 0x736f6d6570736575UL ^ key->k[0];
- H->v1 = 0x646f72616e646f6dUL ^ key->k[1];
- H->v2 = 0x6c7967656e657261UL ^ key->k[0];
- H->v3 = 0x7465646279746573UL ^ key->k[1];
+static struct siphash *sip24_init(struct siphash *H,
+ const struct sipkey *key) {
+ H->v0 = _SIP_ULL(0x736f6d65U, 0x70736575U) ^ key->k[0];
+ H->v1 = _SIP_ULL(0x646f7261U, 0x6e646f6dU) ^ key->k[1];
+ H->v2 = _SIP_ULL(0x6c796765U, 0x6e657261U) ^ key->k[0];
+ H->v3 = _SIP_ULL(0x74656462U, 0x79746573U) ^ key->k[1];
H->p = H->buf;
H->c = 0;
@@ -173,7 +210,8 @@ static struct siphash *sip24_init(struct siphash *H, const struct sipkey *key) {
#define sip_endof(a) (&(a)[sizeof (a) / sizeof *(a)])
-static struct siphash *sip24_update(struct siphash *H, const void *src, size_t len) {
+static struct siphash *sip24_update(struct siphash *H, const void *src,
+ size_t len) {
const unsigned char *p = (const unsigned char *)src, *pe = p + len;
uint64_t m;
@@ -198,17 +236,24 @@ static struct siphash *sip24_update(struct siphash *H, const void *src, size_t l
static uint64_t sip24_final(struct siphash *H) {
- char left = H->p - H->buf;
+ const char left = (char)(H->p - H->buf);
uint64_t b = (H->c + left) << 56;
switch (left) {
case 7: b |= (uint64_t)H->buf[6] << 48;
+ /* fall through */
case 6: b |= (uint64_t)H->buf[5] << 40;
+ /* fall through */
case 5: b |= (uint64_t)H->buf[4] << 32;
+ /* fall through */
case 4: b |= (uint64_t)H->buf[3] << 24;
+ /* fall through */
case 3: b |= (uint64_t)H->buf[2] << 16;
+ /* fall through */
case 2: b |= (uint64_t)H->buf[1] << 8;
+ /* fall through */
case 1: b |= (uint64_t)H->buf[0] << 0;
+ /* fall through */
case 0: break;
}
@@ -222,7 +267,8 @@ static uint64_t sip24_final(struct siphash *H) {
} /* sip24_final() */
-static uint64_t siphash24(const void *src, size_t len, const struct sipkey *key) {
+static uint64_t siphash24(const void *src, size_t len,
+ const struct sipkey *key) {
struct siphash state = SIPHASH_INITIALIZER;
return sip24_final(sip24_update(sip24_init(&state, key), src, len));
} /* siphash24() */
@@ -310,10 +356,11 @@ static int sip24_valid(void) {
struct sipkey k;
size_t i;
- sip_tokey(&k, "\000\001\002\003\004\005\006\007\010\011\012\013\014\015\016\017");
+ sip_tokey(&k, "\000\001\002\003\004\005\006\007\010\011"
+ "\012\013\014\015\016\017");
for (i = 0; i < sizeof in; ++i) {
- in[i] = i;
+ in[i] = (unsigned char)i;
if (siphash24(in, i, &k) != SIP_U8TO64_LE(vectors[i]))
return 0;
@@ -323,12 +370,12 @@ static int sip24_valid(void) {
} /* sip24_valid() */
-#if SIPHASH_MAIN
+#ifdef SIPHASH_MAIN
#include <stdio.h>
int main(void) {
- int ok = sip24_valid();
+ const int ok = sip24_valid();
if (ok)
puts("OK");
diff --git a/3rdParty/Expat/src/utf8tab.h b/3rdParty/Expat/src/utf8tab.h
index 7bb3e77..fa0bed6 100644
--- a/3rdParty/Expat/src/utf8tab.h
+++ b/3rdParty/Expat/src/utf8tab.h
@@ -1,7 +1,34 @@
-/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd
- See the file COPYING for copying permission.
-*/
+/*
+ __ __ _
+ ___\ \/ /_ __ __ _| |_
+ / _ \\ /| '_ \ / _` | __|
+ | __// \| |_) | (_| | |_
+ \___/_/\_\ .__/ \__,_|\__|
+ |_| XML parser
+
+ Copyright (c) 1997-2000 Thai Open Source Software Center Ltd
+ Copyright (c) 2000-2017 Expat development team
+ Licensed under the MIT license:
+
+ Permission is hereby granted, free of charge, to any person obtaining
+ a copy of this software and associated documentation files (the
+ "Software"), to deal in the Software without restriction, including
+ without limitation the rights to use, copy, modify, merge, publish,
+ distribute, sublicense, and/or sell copies of the Software, and to permit
+ persons to whom the Software is furnished to do so, subject to the
+ following conditions:
+ The above copyright notice and this permission notice shall be included
+ in all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+ NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+ OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+ USE OR OTHER DEALINGS IN THE SOFTWARE.
+*/
/* 0x80 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL,
/* 0x84 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL,
diff --git a/3rdParty/Expat/src/winconfig.h b/3rdParty/Expat/src/winconfig.h
index 9bf014d..28a043c 100644
--- a/3rdParty/Expat/src/winconfig.h
+++ b/3rdParty/Expat/src/winconfig.h
@@ -1,10 +1,33 @@
-/*================================================================
-** Copyright 2000, Clark Cooper
-** All rights reserved.
-**
-** This is free software. You are permitted to copy, distribute, or modify
-** it under the terms of the MIT/X license (contained in the COPYING file
-** with this distribution.)
+/*
+ __ __ _
+ ___\ \/ /_ __ __ _| |_
+ / _ \\ /| '_ \ / _` | __|
+ | __// \| |_) | (_| | |_
+ \___/_/\_\ .__/ \__,_|\__|
+ |_| XML parser
+
+ Copyright (c) 1997-2000 Thai Open Source Software Center Ltd
+ Copyright (c) 2000-2017 Expat development team
+ Licensed under the MIT license:
+
+ Permission is hereby granted, free of charge, to any person obtaining
+ a copy of this software and associated documentation files (the
+ "Software"), to deal in the Software without restriction, including
+ without limitation the rights to use, copy, modify, merge, publish,
+ distribute, sublicense, and/or sell copies of the Software, and to permit
+ persons to whom the Software is furnished to do so, subject to the
+ following conditions:
+
+ The above copyright notice and this permission notice shall be included
+ in all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+ NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+ OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+ USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
#ifndef WINCONFIG_H
@@ -30,10 +53,6 @@
/* we will assume all Windows platforms are little endian */
#define BYTEORDER 1234
-/* Windows has memmove() available. */
-#define HAVE_MEMMOVE
-
-
#endif /* !defined(HAVE_EXPAT_CONFIG_H) */
diff --git a/3rdParty/Expat/src/xmlparse.c b/3rdParty/Expat/src/xmlparse.c
index 76f078e..02a11ae 100644
--- a/3rdParty/Expat/src/xmlparse.c
+++ b/3rdParty/Expat/src/xmlparse.c
@@ -1,10 +1,38 @@
-/* Copyright (c) 1998, 1999, 2000 Thai Open Source Software Center Ltd
- See the file COPYING for copying permission.
-
- 77fea421d361dca90041d0040ecf1dca651167fadf2af79e990e35168d70d933 (2.2.1+)
+/* 69df5be70289a11fb834869ce4a91c23c1d9dd04baffcbd10e86742d149a080c (2.2.7+)
+ __ __ _
+ ___\ \/ /_ __ __ _| |_
+ / _ \\ /| '_ \ / _` | __|
+ | __// \| |_) | (_| | |_
+ \___/_/\_\ .__/ \__,_|\__|
+ |_| XML parser
+
+ Copyright (c) 1997-2000 Thai Open Source Software Center Ltd
+ Copyright (c) 2000-2017 Expat development team
+ Licensed under the MIT license:
+
+ Permission is hereby granted, free of charge, to any person obtaining
+ a copy of this software and associated documentation files (the
+ "Software"), to deal in the Software without restriction, including
+ without limitation the rights to use, copy, modify, merge, publish,
+ distribute, sublicense, and/or sell copies of the Software, and to permit
+ persons to whom the Software is furnished to do so, subject to the
+ following conditions:
+
+ The above copyright notice and this permission notice shall be included
+ in all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+ NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+ OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+ USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
-#define _GNU_SOURCE /* syscall prototype */
+#if !defined(_GNU_SOURCE)
+# define _GNU_SOURCE 1 /* syscall prototype */
+#endif
#include <stddef.h>
#include <string.h> /* memset(), memcpy() */
@@ -19,6 +47,8 @@
#include <sys/time.h> /* gettimeofday() */
#include <sys/types.h> /* getpid() */
#include <unistd.h> /* getpid() */
+#include <fcntl.h> /* O_RDONLY */
+#include <errno.h>
#endif
#define XML_BUILDING_EXPAT 1
@@ -33,6 +63,54 @@
#include "expat.h"
#include "siphash.h"
+#if defined(HAVE_GETRANDOM) || defined(HAVE_SYSCALL_GETRANDOM)
+# if defined(HAVE_GETRANDOM)
+# include <sys/random.h> /* getrandom */
+# else
+# include <unistd.h> /* syscall */
+# include <sys/syscall.h> /* SYS_getrandom */
+# endif
+# if ! defined(GRND_NONBLOCK)
+# define GRND_NONBLOCK 0x0001
+# endif /* defined(GRND_NONBLOCK) */
+#endif /* defined(HAVE_GETRANDOM) || defined(HAVE_SYSCALL_GETRANDOM) */
+
+#if defined(HAVE_LIBBSD) \
+ && (defined(HAVE_ARC4RANDOM_BUF) || defined(HAVE_ARC4RANDOM))
+# include <bsd/stdlib.h>
+#endif
+
+#if defined(_WIN32) && !defined(LOAD_LIBRARY_SEARCH_SYSTEM32)
+# define LOAD_LIBRARY_SEARCH_SYSTEM32 0x00000800
+#endif
+
+#if !defined(HAVE_GETRANDOM) && !defined(HAVE_SYSCALL_GETRANDOM) \
+ && !defined(HAVE_ARC4RANDOM_BUF) && !defined(HAVE_ARC4RANDOM) \
+ && !defined(XML_DEV_URANDOM) \
+ && !defined(_WIN32) \
+ && !defined(XML_POOR_ENTROPY)
+# error \
+ You do not have support for any sources of high quality entropy \
+ enabled. For end user security, that is probably not what you want. \
+ \
+ Your options include: \
+ * Linux + glibc >=2.25 (getrandom): HAVE_GETRANDOM, \
+ * Linux + glibc <2.25 (syscall SYS_getrandom): HAVE_SYSCALL_GETRANDOM, \
+ * BSD / macOS >=10.7 (arc4random_buf): HAVE_ARC4RANDOM_BUF, \
+ * BSD / macOS <10.7 (arc4random): HAVE_ARC4RANDOM, \
+ * libbsd (arc4random_buf): HAVE_ARC4RANDOM_BUF + HAVE_LIBBSD, \
+ * libbsd (arc4random): HAVE_ARC4RANDOM + HAVE_LIBBSD, \
+ * Linux / BSD / macOS (/dev/urandom): XML_DEV_URANDOM \
+ * Windows (RtlGenRandom): _WIN32. \
+ \
+ If insist on not using any of these, bypass this error by defining \
+ XML_POOR_ENTROPY; you have been warned. \
+ \
+ If you have reasons to patch this detection code away or need changes \
+ to the build system, please open a bug. Thank you!
+#endif
+
+
#ifdef XML_UNICODE
#define XML_ENCODE_MAX XML_UTF16_ENCODE_MAX
#define XmlConvert XmlUtf16Convert
@@ -83,14 +161,8 @@ typedef char ICHAR;
/* Round up n to be a multiple of sz, where sz is a power of 2. */
#define ROUND_UP(n, sz) (((n) + ((sz) - 1)) & ~((sz) - 1))
-/* Handle the case where memmove() doesn't exist. */
-#ifndef HAVE_MEMMOVE
-#ifdef HAVE_BCOPY
-#define memmove(d,s,l) bcopy((s),(d),(l))
-#else
-#error memmove does not exist on this platform, nor is a substitute available
-#endif /* HAVE_BCOPY */
-#endif /* HAVE_MEMMOVE */
+/* Do safe (NULL-aware) pointer arithmetic */
+#define EXPAT_SAFE_PTR_DIFF(p, q) (((p) && (q)) ? ((p) - (q)) : 0)
#include "internal.h"
#include "xmltok.h"
@@ -392,7 +464,7 @@ setContext(XML_Parser parser, const XML_Char *context);
static void FASTCALL normalizePublicId(XML_Char *s);
static DTD * dtdCreate(const XML_Memory_Handling_Suite *ms);
-/* do not call if parentParser != NULL */
+/* do not call if m_parentParser != NULL */
static void dtdReset(DTD *p, const XML_Memory_Handling_Suite *ms);
static void
dtdDestroy(DTD *p, XML_Bool isDocEntity, const XML_Memory_Handling_Suite *ms);
@@ -436,6 +508,9 @@ static ELEMENT_TYPE *
getElementType(XML_Parser parser, const ENCODING *enc,
const char *ptr, const char *end);
+static XML_Char *copyString(const XML_Char *s,
+ const XML_Memory_Handling_Suite *memsuite);
+
static unsigned long generate_hash_secret_salt(XML_Parser parser);
static XML_Bool startParsing(XML_Parser parser);
@@ -461,7 +536,7 @@ parserInit(XML_Parser parser, const XML_Char *encodingName);
: ((*((pool)->ptr)++ = c), 1))
struct XML_ParserStruct {
- /* The first member must be userData so that the XML_GetUserData
+ /* The first member must be m_userData so that the XML_GetUserData
macro works. */
void *m_userData;
void *m_handlerArg;
@@ -471,7 +546,7 @@ struct XML_ParserStruct {
const char *m_bufferPtr;
/* past last character to be parsed */
char *m_bufferEnd;
- /* allocated end of buffer */
+ /* allocated end of m_buffer */
const char *m_bufferLim;
XML_Index m_parseEndByteIndex;
const char *m_parseEndPtr;
@@ -563,113 +638,10 @@ struct XML_ParserStruct {
unsigned long m_hash_secret_salt;
};
-#define MALLOC(s) (parser->m_mem.malloc_fcn((s)))
-#define REALLOC(p,s) (parser->m_mem.realloc_fcn((p),(s)))
-#define FREE(p) (parser->m_mem.free_fcn((p)))
-
-#define userData (parser->m_userData)
-#define handlerArg (parser->m_handlerArg)
-#define startElementHandler (parser->m_startElementHandler)
-#define endElementHandler (parser->m_endElementHandler)
-#define characterDataHandler (parser->m_characterDataHandler)
-#define processingInstructionHandler \
- (parser->m_processingInstructionHandler)
-#define commentHandler (parser->m_commentHandler)
-#define startCdataSectionHandler \
- (parser->m_startCdataSectionHandler)
-#define endCdataSectionHandler (parser->m_endCdataSectionHandler)
-#define defaultHandler (parser->m_defaultHandler)
-#define startDoctypeDeclHandler (parser->m_startDoctypeDeclHandler)
-#define endDoctypeDeclHandler (parser->m_endDoctypeDeclHandler)
-#define unparsedEntityDeclHandler \
- (parser->m_unparsedEntityDeclHandler)
-#define notationDeclHandler (parser->m_notationDeclHandler)
-#define startNamespaceDeclHandler \
- (parser->m_startNamespaceDeclHandler)
-#define endNamespaceDeclHandler (parser->m_endNamespaceDeclHandler)
-#define notStandaloneHandler (parser->m_notStandaloneHandler)
-#define externalEntityRefHandler \
- (parser->m_externalEntityRefHandler)
-#define externalEntityRefHandlerArg \
- (parser->m_externalEntityRefHandlerArg)
-#define internalEntityRefHandler \
- (parser->m_internalEntityRefHandler)
-#define skippedEntityHandler (parser->m_skippedEntityHandler)
-#define unknownEncodingHandler (parser->m_unknownEncodingHandler)
-#define elementDeclHandler (parser->m_elementDeclHandler)
-#define attlistDeclHandler (parser->m_attlistDeclHandler)
-#define entityDeclHandler (parser->m_entityDeclHandler)
-#define xmlDeclHandler (parser->m_xmlDeclHandler)
-#define encoding (parser->m_encoding)
-#define initEncoding (parser->m_initEncoding)
-#define internalEncoding (parser->m_internalEncoding)
-#define unknownEncodingMem (parser->m_unknownEncodingMem)
-#define unknownEncodingData (parser->m_unknownEncodingData)
-#define unknownEncodingHandlerData \
- (parser->m_unknownEncodingHandlerData)
-#define unknownEncodingRelease (parser->m_unknownEncodingRelease)
-#define protocolEncodingName (parser->m_protocolEncodingName)
-#define ns (parser->m_ns)
-#define ns_triplets (parser->m_ns_triplets)
-#define prologState (parser->m_prologState)
-#define processor (parser->m_processor)
-#define errorCode (parser->m_errorCode)
-#define eventPtr (parser->m_eventPtr)
-#define eventEndPtr (parser->m_eventEndPtr)
-#define positionPtr (parser->m_positionPtr)
-#define position (parser->m_position)
-#define openInternalEntities (parser->m_openInternalEntities)
-#define freeInternalEntities (parser->m_freeInternalEntities)
-#define defaultExpandInternalEntities \
- (parser->m_defaultExpandInternalEntities)
-#define tagLevel (parser->m_tagLevel)
-#define buffer (parser->m_buffer)
-#define bufferPtr (parser->m_bufferPtr)
-#define bufferEnd (parser->m_bufferEnd)
-#define parseEndByteIndex (parser->m_parseEndByteIndex)
-#define parseEndPtr (parser->m_parseEndPtr)
-#define bufferLim (parser->m_bufferLim)
-#define dataBuf (parser->m_dataBuf)
-#define dataBufEnd (parser->m_dataBufEnd)
-#define _dtd (parser->m_dtd)
-#define curBase (parser->m_curBase)
-#define declEntity (parser->m_declEntity)
-#define doctypeName (parser->m_doctypeName)
-#define doctypeSysid (parser->m_doctypeSysid)
-#define doctypePubid (parser->m_doctypePubid)
-#define declAttributeType (parser->m_declAttributeType)
-#define declNotationName (parser->m_declNotationName)
-#define declNotationPublicId (parser->m_declNotationPublicId)
-#define declElementType (parser->m_declElementType)
-#define declAttributeId (parser->m_declAttributeId)
-#define declAttributeIsCdata (parser->m_declAttributeIsCdata)
-#define declAttributeIsId (parser->m_declAttributeIsId)
-#define freeTagList (parser->m_freeTagList)
-#define freeBindingList (parser->m_freeBindingList)
-#define inheritedBindings (parser->m_inheritedBindings)
-#define tagStack (parser->m_tagStack)
-#define atts (parser->m_atts)
-#define attsSize (parser->m_attsSize)
-#define nSpecifiedAtts (parser->m_nSpecifiedAtts)
-#define idAttIndex (parser->m_idAttIndex)
-#define nsAtts (parser->m_nsAtts)
-#define nsAttsVersion (parser->m_nsAttsVersion)
-#define nsAttsPower (parser->m_nsAttsPower)
-#define attInfo (parser->m_attInfo)
-#define tempPool (parser->m_tempPool)
-#define temp2Pool (parser->m_temp2Pool)
-#define groupConnector (parser->m_groupConnector)
-#define groupSize (parser->m_groupSize)
-#define namespaceSeparator (parser->m_namespaceSeparator)
-#define parentParser (parser->m_parentParser)
-#define ps_parsing (parser->m_parsingStatus.parsing)
-#define ps_finalBuffer (parser->m_parsingStatus.finalBuffer)
-#ifdef XML_DTD
-#define isParamEntity (parser->m_isParamEntity)
-#define useForeignDTD (parser->m_useForeignDTD)
-#define paramEntityParsing (parser->m_paramEntityParsing)
-#endif /* XML_DTD */
-#define hash_secret_salt (parser->m_hash_secret_salt)
+#define MALLOC(parser, s) (parser->m_mem.malloc_fcn((s)))
+#define REALLOC(parser, p, s) (parser->m_mem.realloc_fcn((p),(s)))
+#define FREE(parser, p) (parser->m_mem.free_fcn((p)))
+
XML_Parser XMLCALL
XML_ParserCreate(const XML_Char *encodingName)
@@ -695,22 +667,17 @@ static const XML_Char implicitContext[] = {
};
-#if defined(HAVE_GETRANDOM) || defined(HAVE_SYSCALL_GETRANDOM)
-# include <errno.h>
+/* To avoid warnings about unused functions: */
+#if ! defined(HAVE_ARC4RANDOM_BUF) && ! defined(HAVE_ARC4RANDOM)
-# if defined(HAVE_GETRANDOM)
-# include <sys/random.h> /* getrandom */
-# else
-# include <unistd.h> /* syscall */
-# include <sys/syscall.h> /* SYS_getrandom */
-# endif
+#if defined(HAVE_GETRANDOM) || defined(HAVE_SYSCALL_GETRANDOM)
/* Obtain entropy on Linux 3.17+ */
static int
-writeRandomBytes_getrandom(void * target, size_t count) {
+writeRandomBytes_getrandom_nonblock(void * target, size_t count) {
int success = 0; /* full count bytes written? */
size_t bytesWrittenTotal = 0;
- const unsigned int getrandomFlags = 0;
+ const unsigned int getrandomFlags = GRND_NONBLOCK;
do {
void * const currentTarget = (void*)((char*)target + bytesWrittenTotal);
@@ -728,7 +695,7 @@ writeRandomBytes_getrandom(void * target, size_t count) {
if (bytesWrittenTotal >= count)
success = 1;
}
- } while (! success && (errno == EINTR || errno == EAGAIN));
+ } while (! success && (errno == EINTR));
return success;
}
@@ -736,12 +703,69 @@ writeRandomBytes_getrandom(void * target, size_t count) {
#endif /* defined(HAVE_GETRANDOM) || defined(HAVE_SYSCALL_GETRANDOM) */
+#if ! defined(_WIN32) && defined(XML_DEV_URANDOM)
+
+/* Extract entropy from /dev/urandom */
+static int
+writeRandomBytes_dev_urandom(void * target, size_t count) {
+ int success = 0; /* full count bytes written? */
+ size_t bytesWrittenTotal = 0;
+
+ const int fd = open("/dev/urandom", O_RDONLY);
+ if (fd < 0) {
+ return 0;
+ }
+
+ do {
+ void * const currentTarget = (void*)((char*)target + bytesWrittenTotal);
+ const size_t bytesToWrite = count - bytesWrittenTotal;
+
+ const ssize_t bytesWrittenMore = read(fd, currentTarget, bytesToWrite);
+
+ if (bytesWrittenMore > 0) {
+ bytesWrittenTotal += bytesWrittenMore;
+ if (bytesWrittenTotal >= count)
+ success = 1;
+ }
+ } while (! success && (errno == EINTR));
+
+ close(fd);
+ return success;
+}
+
+#endif /* ! defined(_WIN32) && defined(XML_DEV_URANDOM) */
+
+#endif /* ! defined(HAVE_ARC4RANDOM_BUF) && ! defined(HAVE_ARC4RANDOM) */
+
+
+#if defined(HAVE_ARC4RANDOM) && ! defined(HAVE_ARC4RANDOM_BUF)
+
+static void
+writeRandomBytes_arc4random(void * target, size_t count) {
+ size_t bytesWrittenTotal = 0;
+
+ while (bytesWrittenTotal < count) {
+ const uint32_t random32 = arc4random();
+ size_t i = 0;
+
+ for (; (i < sizeof(random32)) && (bytesWrittenTotal < count);
+ i++, bytesWrittenTotal++) {
+ const uint8_t random8 = (uint8_t)(random32 >> (i * 8));
+ ((uint8_t *)target)[bytesWrittenTotal] = random8;
+ }
+ }
+}
+
+#endif /* defined(HAVE_ARC4RANDOM) && ! defined(HAVE_ARC4RANDOM_BUF) */
+
+
#ifdef _WIN32
typedef BOOLEAN (APIENTRY *RTLGENRANDOM_FUNC)(PVOID, ULONG);
+HMODULE _Expat_LoadLibrary(LPCTSTR filename); /* see loadlibrary.c */
/* Obtain entropy on Windows XP / Windows Server 2003 and later.
- * Hint on RtlGenRandom and the following article from libsodioum.
+ * Hint on RtlGenRandom and the following article from libsodium.
*
* Michael Howard: Cryptographically Secure Random number on Windows without using CryptoAPI
* https://blogs.msdn.microsoft.com/michael_howard/2005/01/14/cryptographically-secure-random-number-on-windows-without-using-cryptoapi/
@@ -749,7 +773,7 @@ typedef BOOLEAN (APIENTRY *RTLGENRANDOM_FUNC)(PVOID, ULONG);
static int
writeRandomBytes_RtlGenRandom(void * target, size_t count) {
int success = 0; /* full count bytes written? */
- const HMODULE advapi32 = LoadLibrary("ADVAPI32.DLL");
+ const HMODULE advapi32 = _Expat_LoadLibrary(TEXT("ADVAPI32.DLL"));
if (advapi32) {
const RTLGENRANDOM_FUNC RtlGenRandom
@@ -768,6 +792,8 @@ writeRandomBytes_RtlGenRandom(void * target, size_t count) {
#endif /* _WIN32 */
+#if ! defined(HAVE_ARC4RANDOM_BUF) && ! defined(HAVE_ARC4RANDOM)
+
static unsigned long
gather_time_entropy(void)
{
@@ -780,16 +806,20 @@ gather_time_entropy(void)
int gettimeofday_res;
gettimeofday_res = gettimeofday(&tv, NULL);
+
+#if defined(NDEBUG)
+ (void)gettimeofday_res;
+#else
assert (gettimeofday_res == 0);
+#endif /* defined(NDEBUG) */
/* Microseconds time is <20 bits entropy */
return tv.tv_usec;
#endif
}
-#if defined(HAVE_ARC4RANDOM_BUF) && defined(HAVE_LIBBSD)
-# include <bsd/stdlib.h>
-#endif
+#endif /* ! defined(HAVE_ARC4RANDOM_BUF) && ! defined(HAVE_ARC4RANDOM) */
+
static unsigned long
ENTROPY_DEBUG(const char * label, unsigned long entropy) {
@@ -808,10 +838,14 @@ generate_hash_secret_salt(XML_Parser parser)
{
unsigned long entropy;
(void)parser;
-#if defined(HAVE_ARC4RANDOM_BUF) || defined(__CloudABI__)
- (void)gather_time_entropy;
+
+ /* "Failproof" high quality providers: */
+#if defined(HAVE_ARC4RANDOM_BUF)
arc4random_buf(&entropy, sizeof(entropy));
return ENTROPY_DEBUG("arc4random_buf", entropy);
+#elif defined(HAVE_ARC4RANDOM)
+ writeRandomBytes_arc4random((void *)&entropy, sizeof(entropy));
+ return ENTROPY_DEBUG("arc4random", entropy);
#else
/* Try high quality providers first .. */
#ifdef _WIN32
@@ -819,10 +853,15 @@ generate_hash_secret_salt(XML_Parser parser)
return ENTROPY_DEBUG("RtlGenRandom", entropy);
}
#elif defined(HAVE_GETRANDOM) || defined(HAVE_SYSCALL_GETRANDOM)
- if (writeRandomBytes_getrandom((void *)&entropy, sizeof(entropy))) {
+ if (writeRandomBytes_getrandom_nonblock((void *)&entropy, sizeof(entropy))) {
return ENTROPY_DEBUG("getrandom", entropy);
}
#endif
+#if ! defined(_WIN32) && defined(XML_DEV_URANDOM)
+ if (writeRandomBytes_dev_urandom((void *)&entropy, sizeof(entropy))) {
+ return ENTROPY_DEBUG("/dev/urandom", entropy);
+ }
+#endif /* ! defined(_WIN32) && defined(XML_DEV_URANDOM) */
/* .. and self-made low quality for backup: */
/* Process ID is 0 bits entropy if attacker has local access */
@@ -833,7 +872,7 @@ generate_hash_secret_salt(XML_Parser parser)
return ENTROPY_DEBUG("fallback(4)", entropy * 2147483647);
} else {
return ENTROPY_DEBUG("fallback(8)",
- entropy * (unsigned long)2305843009213693951);
+ entropy * (unsigned long)2305843009213693951ULL);
}
#endif
}
@@ -849,9 +888,9 @@ static XML_Bool /* only valid for root parser */
startParsing(XML_Parser parser)
{
/* hash functions must be initialized before setContext() is called */
- if (hash_secret_salt == 0)
- hash_secret_salt = generate_hash_secret_salt(parser);
- if (ns) {
+ if (parser->m_hash_secret_salt == 0)
+ parser->m_hash_secret_salt = generate_hash_secret_salt(parser);
+ if (parser->m_ns) {
/* implicit context only set for root parser, since child
parsers (i.e. external entity parsers) will inherit it
*/
@@ -901,83 +940,85 @@ parserCreate(const XML_Char *encodingName,
if (!parser)
return parser;
- buffer = NULL;
- bufferLim = NULL;
+ parser->m_buffer = NULL;
+ parser->m_bufferLim = NULL;
- attsSize = INIT_ATTS_SIZE;
- atts = (ATTRIBUTE *)MALLOC(attsSize * sizeof(ATTRIBUTE));
- if (atts == NULL) {
- FREE(parser);
+ parser->m_attsSize = INIT_ATTS_SIZE;
+ parser->m_atts = (ATTRIBUTE *)MALLOC(parser, parser->m_attsSize * sizeof(ATTRIBUTE));
+ if (parser->m_atts == NULL) {
+ FREE(parser, parser);
return NULL;
}
#ifdef XML_ATTR_INFO
- attInfo = (XML_AttrInfo*)MALLOC(attsSize * sizeof(XML_AttrInfo));
- if (attInfo == NULL) {
- FREE(atts);
- FREE(parser);
+ parser->m_attInfo = (XML_AttrInfo*)MALLOC(parser, parser->m_attsSize * sizeof(XML_AttrInfo));
+ if (parser->m_attInfo == NULL) {
+ FREE(parser, parser->m_atts);
+ FREE(parser, parser);
return NULL;
}
#endif
- dataBuf = (XML_Char *)MALLOC(INIT_DATA_BUF_SIZE * sizeof(XML_Char));
- if (dataBuf == NULL) {
- FREE(atts);
+ parser->m_dataBuf = (XML_Char *)MALLOC(parser, INIT_DATA_BUF_SIZE * sizeof(XML_Char));
+ if (parser->m_dataBuf == NULL) {
+ FREE(parser, parser->m_atts);
#ifdef XML_ATTR_INFO
- FREE(attInfo);
+ FREE(parser, parser->m_attInfo);
#endif
- FREE(parser);
+ FREE(parser, parser);
return NULL;
}
- dataBufEnd = dataBuf + INIT_DATA_BUF_SIZE;
+ parser->m_dataBufEnd = parser->m_dataBuf + INIT_DATA_BUF_SIZE;
if (dtd)
- _dtd = dtd;
+ parser->m_dtd = dtd;
else {
- _dtd = dtdCreate(&parser->m_mem);
- if (_dtd == NULL) {
- FREE(dataBuf);
- FREE(atts);
+ parser->m_dtd = dtdCreate(&parser->m_mem);
+ if (parser->m_dtd == NULL) {
+ FREE(parser, parser->m_dataBuf);
+ FREE(parser, parser->m_atts);
#ifdef XML_ATTR_INFO
- FREE(attInfo);
+ FREE(parser, parser->m_attInfo);
#endif
- FREE(parser);
+ FREE(parser, parser);
return NULL;
}
}
- freeBindingList = NULL;
- freeTagList = NULL;
- freeInternalEntities = NULL;
+ parser->m_freeBindingList = NULL;
+ parser->m_freeTagList = NULL;
+ parser->m_freeInternalEntities = NULL;
+
+ parser->m_groupSize = 0;
+ parser->m_groupConnector = NULL;
- groupSize = 0;
- groupConnector = NULL;
+ parser->m_unknownEncodingHandler = NULL;
+ parser->m_unknownEncodingHandlerData = NULL;
- unknownEncodingHandler = NULL;
- unknownEncodingHandlerData = NULL;
+ parser->m_namespaceSeparator = ASCII_EXCL;
+ parser->m_ns = XML_FALSE;
+ parser->m_ns_triplets = XML_FALSE;
- namespaceSeparator = ASCII_EXCL;
- ns = XML_FALSE;
- ns_triplets = XML_FALSE;
+ parser->m_nsAtts = NULL;
+ parser->m_nsAttsVersion = 0;
+ parser->m_nsAttsPower = 0;
- nsAtts = NULL;
- nsAttsVersion = 0;
- nsAttsPower = 0;
+ parser->m_protocolEncodingName = NULL;
- poolInit(&tempPool, &(parser->m_mem));
- poolInit(&temp2Pool, &(parser->m_mem));
+ poolInit(&parser->m_tempPool, &(parser->m_mem));
+ poolInit(&parser->m_temp2Pool, &(parser->m_mem));
parserInit(parser, encodingName);
- if (encodingName && !protocolEncodingName) {
+ if (encodingName && !parser->m_protocolEncodingName) {
XML_ParserFree(parser);
return NULL;
}
if (nameSep) {
- ns = XML_TRUE;
- internalEncoding = XmlGetInternalEncodingNS();
- namespaceSeparator = *nameSep;
+ parser->m_ns = XML_TRUE;
+ parser->m_internalEncoding = XmlGetInternalEncodingNS();
+ parser->m_namespaceSeparator = *nameSep;
}
else {
- internalEncoding = XmlGetInternalEncoding();
+ parser->m_internalEncoding = XmlGetInternalEncoding();
}
return parser;
@@ -986,85 +1027,85 @@ parserCreate(const XML_Char *encodingName,
static void
parserInit(XML_Parser parser, const XML_Char *encodingName)
{
- processor = prologInitProcessor;
- XmlPrologStateInit(&prologState);
- protocolEncodingName = (encodingName != NULL
- ? poolCopyString(&tempPool, encodingName)
- : NULL);
- curBase = NULL;
- XmlInitEncoding(&initEncoding, &encoding, 0);
- userData = NULL;
- handlerArg = NULL;
- startElementHandler = NULL;
- endElementHandler = NULL;
- characterDataHandler = NULL;
- processingInstructionHandler = NULL;
- commentHandler = NULL;
- startCdataSectionHandler = NULL;
- endCdataSectionHandler = NULL;
- defaultHandler = NULL;
- startDoctypeDeclHandler = NULL;
- endDoctypeDeclHandler = NULL;
- unparsedEntityDeclHandler = NULL;
- notationDeclHandler = NULL;
- startNamespaceDeclHandler = NULL;
- endNamespaceDeclHandler = NULL;
- notStandaloneHandler = NULL;
- externalEntityRefHandler = NULL;
- externalEntityRefHandlerArg = parser;
- skippedEntityHandler = NULL;
- elementDeclHandler = NULL;
- attlistDeclHandler = NULL;
- entityDeclHandler = NULL;
- xmlDeclHandler = NULL;
- bufferPtr = buffer;
- bufferEnd = buffer;
- parseEndByteIndex = 0;
- parseEndPtr = NULL;
- declElementType = NULL;
- declAttributeId = NULL;
- declEntity = NULL;
- doctypeName = NULL;
- doctypeSysid = NULL;
- doctypePubid = NULL;
- declAttributeType = NULL;
- declNotationName = NULL;
- declNotationPublicId = NULL;
- declAttributeIsCdata = XML_FALSE;
- declAttributeIsId = XML_FALSE;
- memset(&position, 0, sizeof(POSITION));
- errorCode = XML_ERROR_NONE;
- eventPtr = NULL;
- eventEndPtr = NULL;
- positionPtr = NULL;
- openInternalEntities = NULL;
- defaultExpandInternalEntities = XML_TRUE;
- tagLevel = 0;
- tagStack = NULL;
- inheritedBindings = NULL;
- nSpecifiedAtts = 0;
- unknownEncodingMem = NULL;
- unknownEncodingRelease = NULL;
- unknownEncodingData = NULL;
- parentParser = NULL;
- ps_parsing = XML_INITIALIZED;
+ parser->m_processor = prologInitProcessor;
+ XmlPrologStateInit(&parser->m_prologState);
+ if (encodingName != NULL) {
+ parser->m_protocolEncodingName = copyString(encodingName, &(parser->m_mem));
+ }
+ parser->m_curBase = NULL;
+ XmlInitEncoding(&parser->m_initEncoding, &parser->m_encoding, 0);
+ parser->m_userData = NULL;
+ parser->m_handlerArg = NULL;
+ parser->m_startElementHandler = NULL;
+ parser->m_endElementHandler = NULL;
+ parser->m_characterDataHandler = NULL;
+ parser->m_processingInstructionHandler = NULL;
+ parser->m_commentHandler = NULL;
+ parser->m_startCdataSectionHandler = NULL;
+ parser->m_endCdataSectionHandler = NULL;
+ parser->m_defaultHandler = NULL;
+ parser->m_startDoctypeDeclHandler = NULL;
+ parser->m_endDoctypeDeclHandler = NULL;
+ parser->m_unparsedEntityDeclHandler = NULL;
+ parser->m_notationDeclHandler = NULL;
+ parser->m_startNamespaceDeclHandler = NULL;
+ parser->m_endNamespaceDeclHandler = NULL;
+ parser->m_notStandaloneHandler = NULL;
+ parser->m_externalEntityRefHandler = NULL;
+ parser->m_externalEntityRefHandlerArg = parser;
+ parser->m_skippedEntityHandler = NULL;
+ parser->m_elementDeclHandler = NULL;
+ parser->m_attlistDeclHandler = NULL;
+ parser->m_entityDeclHandler = NULL;
+ parser->m_xmlDeclHandler = NULL;
+ parser->m_bufferPtr = parser->m_buffer;
+ parser->m_bufferEnd = parser->m_buffer;
+ parser->m_parseEndByteIndex = 0;
+ parser->m_parseEndPtr = NULL;
+ parser->m_declElementType = NULL;
+ parser->m_declAttributeId = NULL;
+ parser->m_declEntity = NULL;
+ parser->m_doctypeName = NULL;
+ parser->m_doctypeSysid = NULL;
+ parser->m_doctypePubid = NULL;
+ parser->m_declAttributeType = NULL;
+ parser->m_declNotationName = NULL;
+ parser->m_declNotationPublicId = NULL;
+ parser->m_declAttributeIsCdata = XML_FALSE;
+ parser->m_declAttributeIsId = XML_FALSE;
+ memset(&parser->m_position, 0, sizeof(POSITION));
+ parser->m_errorCode = XML_ERROR_NONE;
+ parser->m_eventPtr = NULL;
+ parser->m_eventEndPtr = NULL;
+ parser->m_positionPtr = NULL;
+ parser->m_openInternalEntities = NULL;
+ parser->m_defaultExpandInternalEntities = XML_TRUE;
+ parser->m_tagLevel = 0;
+ parser->m_tagStack = NULL;
+ parser->m_inheritedBindings = NULL;
+ parser->m_nSpecifiedAtts = 0;
+ parser->m_unknownEncodingMem = NULL;
+ parser->m_unknownEncodingRelease = NULL;
+ parser->m_unknownEncodingData = NULL;
+ parser->m_parentParser = NULL;
+ parser->m_parsingStatus.parsing = XML_INITIALIZED;
#ifdef XML_DTD
- isParamEntity = XML_FALSE;
- useForeignDTD = XML_FALSE;
- paramEntityParsing = XML_PARAM_ENTITY_PARSING_NEVER;
+ parser->m_isParamEntity = XML_FALSE;
+ parser->m_useForeignDTD = XML_FALSE;
+ parser->m_paramEntityParsing = XML_PARAM_ENTITY_PARSING_NEVER;
#endif
- hash_secret_salt = 0;
+ parser->m_hash_secret_salt = 0;
}
-/* moves list of bindings to freeBindingList */
+/* moves list of bindings to m_freeBindingList */
static void FASTCALL
moveToFreeBindingList(XML_Parser parser, BINDING *bindings)
{
while (bindings) {
BINDING *b = bindings;
bindings = bindings->nextTagBinding;
- b->nextTagBinding = freeBindingList;
- freeBindingList = b;
+ b->nextTagBinding = parser->m_freeBindingList;
+ parser->m_freeBindingList = b;
}
}
@@ -1077,34 +1118,36 @@ XML_ParserReset(XML_Parser parser, const XML_Char *encodingName)
if (parser == NULL)
return XML_FALSE;
- if (parentParser)
+ if (parser->m_parentParser)
return XML_FALSE;
- /* move tagStack to freeTagList */
- tStk = tagStack;
+ /* move m_tagStack to m_freeTagList */
+ tStk = parser->m_tagStack;
while (tStk) {
TAG *tag = tStk;
tStk = tStk->parent;
- tag->parent = freeTagList;
+ tag->parent = parser->m_freeTagList;
moveToFreeBindingList(parser, tag->bindings);
tag->bindings = NULL;
- freeTagList = tag;
+ parser->m_freeTagList = tag;
}
- /* move openInternalEntities to freeInternalEntities */
- openEntityList = openInternalEntities;
+ /* move m_openInternalEntities to m_freeInternalEntities */
+ openEntityList = parser->m_openInternalEntities;
while (openEntityList) {
OPEN_INTERNAL_ENTITY *openEntity = openEntityList;
openEntityList = openEntity->next;
- openEntity->next = freeInternalEntities;
- freeInternalEntities = openEntity;
- }
- moveToFreeBindingList(parser, inheritedBindings);
- FREE(unknownEncodingMem);
- if (unknownEncodingRelease)
- unknownEncodingRelease(unknownEncodingData);
- poolClear(&tempPool);
- poolClear(&temp2Pool);
+ openEntity->next = parser->m_freeInternalEntities;
+ parser->m_freeInternalEntities = openEntity;
+ }
+ moveToFreeBindingList(parser, parser->m_inheritedBindings);
+ FREE(parser, parser->m_unknownEncodingMem);
+ if (parser->m_unknownEncodingRelease)
+ parser->m_unknownEncodingRelease(parser->m_unknownEncodingData);
+ poolClear(&parser->m_tempPool);
+ poolClear(&parser->m_temp2Pool);
+ FREE(parser, (void *)parser->m_protocolEncodingName);
+ parser->m_protocolEncodingName = NULL;
parserInit(parser, encodingName);
- dtdReset(_dtd, &parser->m_mem);
+ dtdReset(parser->m_dtd, &parser->m_mem);
return XML_TRUE;
}
@@ -1117,13 +1160,19 @@ XML_SetEncoding(XML_Parser parser, const XML_Char *encodingName)
XXX There's no way for the caller to determine which of the
XXX possible error cases caused the XML_STATUS_ERROR return.
*/
- if (ps_parsing == XML_PARSING || ps_parsing == XML_SUSPENDED)
+ if (parser->m_parsingStatus.parsing == XML_PARSING || parser->m_parsingStatus.parsing == XML_SUSPENDED)
return XML_STATUS_ERROR;
+
+ /* Get rid of any previous encoding name */
+ FREE(parser, (void *)parser->m_protocolEncodingName);
+
if (encodingName == NULL)
- protocolEncodingName = NULL;
+ /* No new encoding name */
+ parser->m_protocolEncodingName = NULL;
else {
- protocolEncodingName = poolCopyString(&tempPool, encodingName);
- if (!protocolEncodingName)
+ /* Copy the new encoding name into allocated memory */
+ parser->m_protocolEncodingName = copyString(encodingName, &(parser->m_mem));
+ if (!parser->m_protocolEncodingName)
return XML_STATUS_ERROR;
}
return XML_STATUS_OK;
@@ -1180,44 +1229,44 @@ XML_ExternalEntityParserCreate(XML_Parser oldParser,
return NULL;
/* Stash the original parser contents on the stack */
- oldDtd = _dtd;
- oldStartElementHandler = startElementHandler;
- oldEndElementHandler = endElementHandler;
- oldCharacterDataHandler = characterDataHandler;
- oldProcessingInstructionHandler = processingInstructionHandler;
- oldCommentHandler = commentHandler;
- oldStartCdataSectionHandler = startCdataSectionHandler;
- oldEndCdataSectionHandler = endCdataSectionHandler;
- oldDefaultHandler = defaultHandler;
- oldUnparsedEntityDeclHandler = unparsedEntityDeclHandler;
- oldNotationDeclHandler = notationDeclHandler;
- oldStartNamespaceDeclHandler = startNamespaceDeclHandler;
- oldEndNamespaceDeclHandler = endNamespaceDeclHandler;
- oldNotStandaloneHandler = notStandaloneHandler;
- oldExternalEntityRefHandler = externalEntityRefHandler;
- oldSkippedEntityHandler = skippedEntityHandler;
- oldUnknownEncodingHandler = unknownEncodingHandler;
- oldElementDeclHandler = elementDeclHandler;
- oldAttlistDeclHandler = attlistDeclHandler;
- oldEntityDeclHandler = entityDeclHandler;
- oldXmlDeclHandler = xmlDeclHandler;
- oldDeclElementType = declElementType;
-
- oldUserData = userData;
- oldHandlerArg = handlerArg;
- oldDefaultExpandInternalEntities = defaultExpandInternalEntities;
- oldExternalEntityRefHandlerArg = externalEntityRefHandlerArg;
+ oldDtd = parser->m_dtd;
+ oldStartElementHandler = parser->m_startElementHandler;
+ oldEndElementHandler = parser->m_endElementHandler;
+ oldCharacterDataHandler = parser->m_characterDataHandler;
+ oldProcessingInstructionHandler = parser->m_processingInstructionHandler;
+ oldCommentHandler = parser->m_commentHandler;
+ oldStartCdataSectionHandler = parser->m_startCdataSectionHandler;
+ oldEndCdataSectionHandler = parser->m_endCdataSectionHandler;
+ oldDefaultHandler = parser->m_defaultHandler;
+ oldUnparsedEntityDeclHandler = parser->m_unparsedEntityDeclHandler;
+ oldNotationDeclHandler = parser->m_notationDeclHandler;
+ oldStartNamespaceDeclHandler = parser->m_startNamespaceDeclHandler;
+ oldEndNamespaceDeclHandler = parser->m_endNamespaceDeclHandler;
+ oldNotStandaloneHandler = parser->m_notStandaloneHandler;
+ oldExternalEntityRefHandler = parser->m_externalEntityRefHandler;
+ oldSkippedEntityHandler = parser->m_skippedEntityHandler;
+ oldUnknownEncodingHandler = parser->m_unknownEncodingHandler;
+ oldElementDeclHandler = parser->m_elementDeclHandler;
+ oldAttlistDeclHandler = parser->m_attlistDeclHandler;
+ oldEntityDeclHandler = parser->m_entityDeclHandler;
+ oldXmlDeclHandler = parser->m_xmlDeclHandler;
+ oldDeclElementType = parser->m_declElementType;
+
+ oldUserData = parser->m_userData;
+ oldHandlerArg = parser->m_handlerArg;
+ oldDefaultExpandInternalEntities = parser->m_defaultExpandInternalEntities;
+ oldExternalEntityRefHandlerArg = parser->m_externalEntityRefHandlerArg;
#ifdef XML_DTD
- oldParamEntityParsing = paramEntityParsing;
- oldInEntityValue = prologState.inEntityValue;
+ oldParamEntityParsing = parser->m_paramEntityParsing;
+ oldInEntityValue = parser->m_prologState.inEntityValue;
#endif
- oldns_triplets = ns_triplets;
+ oldns_triplets = parser->m_ns_triplets;
/* Note that the new parser shares the same hash secret as the old
parser, so that dtdCopy and copyEntityTable can lookup values
from hash tables associated with either parser without us having
to worry which hash secrets each table has.
*/
- oldhash_secret_salt = hash_secret_salt;
+ oldhash_secret_salt = parser->m_hash_secret_salt;
#ifdef XML_DTD
if (!context)
@@ -1229,9 +1278,9 @@ XML_ExternalEntityParserCreate(XML_Parser oldParser,
here. This makes this function more painful to follow than it
would be otherwise.
*/
- if (ns) {
+ if (parser->m_ns) {
XML_Char tmp[2];
- *tmp = namespaceSeparator;
+ *tmp = parser->m_namespaceSeparator;
parser = parserCreate(encodingName, &parser->m_mem, tmp, newDtd);
}
else {
@@ -1241,62 +1290,62 @@ XML_ExternalEntityParserCreate(XML_Parser oldParser,
if (!parser)
return NULL;
- startElementHandler = oldStartElementHandler;
- endElementHandler = oldEndElementHandler;
- characterDataHandler = oldCharacterDataHandler;
- processingInstructionHandler = oldProcessingInstructionHandler;
- commentHandler = oldCommentHandler;
- startCdataSectionHandler = oldStartCdataSectionHandler;
- endCdataSectionHandler = oldEndCdataSectionHandler;
- defaultHandler = oldDefaultHandler;
- unparsedEntityDeclHandler = oldUnparsedEntityDeclHandler;
- notationDeclHandler = oldNotationDeclHandler;
- startNamespaceDeclHandler = oldStartNamespaceDeclHandler;
- endNamespaceDeclHandler = oldEndNamespaceDeclHandler;
- notStandaloneHandler = oldNotStandaloneHandler;
- externalEntityRefHandler = oldExternalEntityRefHandler;
- skippedEntityHandler = oldSkippedEntityHandler;
- unknownEncodingHandler = oldUnknownEncodingHandler;
- elementDeclHandler = oldElementDeclHandler;
- attlistDeclHandler = oldAttlistDeclHandler;
- entityDeclHandler = oldEntityDeclHandler;
- xmlDeclHandler = oldXmlDeclHandler;
- declElementType = oldDeclElementType;
- userData = oldUserData;
+ parser->m_startElementHandler = oldStartElementHandler;
+ parser->m_endElementHandler = oldEndElementHandler;
+ parser->m_characterDataHandler = oldCharacterDataHandler;
+ parser->m_processingInstructionHandler = oldProcessingInstructionHandler;
+ parser->m_commentHandler = oldCommentHandler;
+ parser->m_startCdataSectionHandler = oldStartCdataSectionHandler;
+ parser->m_endCdataSectionHandler = oldEndCdataSectionHandler;
+ parser->m_defaultHandler = oldDefaultHandler;
+ parser->m_unparsedEntityDeclHandler = oldUnparsedEntityDeclHandler;
+ parser->m_notationDeclHandler = oldNotationDeclHandler;
+ parser->m_startNamespaceDeclHandler = oldStartNamespaceDeclHandler;
+ parser->m_endNamespaceDeclHandler = oldEndNamespaceDeclHandler;
+ parser->m_notStandaloneHandler = oldNotStandaloneHandler;
+ parser->m_externalEntityRefHandler = oldExternalEntityRefHandler;
+ parser->m_skippedEntityHandler = oldSkippedEntityHandler;
+ parser->m_unknownEncodingHandler = oldUnknownEncodingHandler;
+ parser->m_elementDeclHandler = oldElementDeclHandler;
+ parser->m_attlistDeclHandler = oldAttlistDeclHandler;
+ parser->m_entityDeclHandler = oldEntityDeclHandler;
+ parser->m_xmlDeclHandler = oldXmlDeclHandler;
+ parser->m_declElementType = oldDeclElementType;
+ parser->m_userData = oldUserData;
if (oldUserData == oldHandlerArg)
- handlerArg = userData;
+ parser->m_handlerArg = parser->m_userData;
else
- handlerArg = parser;
+ parser->m_handlerArg = parser;
if (oldExternalEntityRefHandlerArg != oldParser)
- externalEntityRefHandlerArg = oldExternalEntityRefHandlerArg;
- defaultExpandInternalEntities = oldDefaultExpandInternalEntities;
- ns_triplets = oldns_triplets;
- hash_secret_salt = oldhash_secret_salt;
- parentParser = oldParser;
+ parser->m_externalEntityRefHandlerArg = oldExternalEntityRefHandlerArg;
+ parser->m_defaultExpandInternalEntities = oldDefaultExpandInternalEntities;
+ parser->m_ns_triplets = oldns_triplets;
+ parser->m_hash_secret_salt = oldhash_secret_salt;
+ parser->m_parentParser = oldParser;
#ifdef XML_DTD
- paramEntityParsing = oldParamEntityParsing;
- prologState.inEntityValue = oldInEntityValue;
+ parser->m_paramEntityParsing = oldParamEntityParsing;
+ parser->m_prologState.inEntityValue = oldInEntityValue;
if (context) {
#endif /* XML_DTD */
- if (!dtdCopy(oldParser, _dtd, oldDtd, &parser->m_mem)
+ if (!dtdCopy(oldParser, parser->m_dtd, oldDtd, &parser->m_mem)
|| !setContext(parser, context)) {
XML_ParserFree(parser);
return NULL;
}
- processor = externalEntityInitProcessor;
+ parser->m_processor = externalEntityInitProcessor;
#ifdef XML_DTD
}
else {
- /* The DTD instance referenced by _dtd is shared between the document's
+ /* The DTD instance referenced by parser->m_dtd is shared between the document's
root parser and external PE parsers, therefore one does not need to
call setContext. In addition, one also *must* not call setContext,
because this would overwrite existing prefix->binding pointers in
- _dtd with ones that get destroyed with the external PE parser.
+ parser->m_dtd with ones that get destroyed with the external PE parser.
This would leave those prefixes with dangling pointers.
*/
- isParamEntity = XML_TRUE;
- XmlPrologStateInitExternalEntity(&prologState);
- processor = externalParEntInitProcessor;
+ parser->m_isParamEntity = XML_TRUE;
+ XmlPrologStateInitExternalEntity(&parser->m_prologState);
+ parser->m_processor = externalParEntInitProcessor;
}
#endif /* XML_DTD */
return parser;
@@ -1310,8 +1359,8 @@ destroyBindings(BINDING *bindings, XML_Parser parser)
if (!b)
break;
bindings = b->nextTagBinding;
- FREE(b->uri);
- FREE(b);
+ FREE(parser, b->uri);
+ FREE(parser, b);
}
}
@@ -1322,69 +1371,70 @@ XML_ParserFree(XML_Parser parser)
OPEN_INTERNAL_ENTITY *entityList;
if (parser == NULL)
return;
- /* free tagStack and freeTagList */
- tagList = tagStack;
+ /* free m_tagStack and m_freeTagList */
+ tagList = parser->m_tagStack;
for (;;) {
TAG *p;
if (tagList == NULL) {
- if (freeTagList == NULL)
+ if (parser->m_freeTagList == NULL)
break;
- tagList = freeTagList;
- freeTagList = NULL;
+ tagList = parser->m_freeTagList;
+ parser->m_freeTagList = NULL;
}
p = tagList;
tagList = tagList->parent;
- FREE(p->buf);
+ FREE(parser, p->buf);
destroyBindings(p->bindings, parser);
- FREE(p);
+ FREE(parser, p);
}
- /* free openInternalEntities and freeInternalEntities */
- entityList = openInternalEntities;
+ /* free m_openInternalEntities and m_freeInternalEntities */
+ entityList = parser->m_openInternalEntities;
for (;;) {
OPEN_INTERNAL_ENTITY *openEntity;
if (entityList == NULL) {
- if (freeInternalEntities == NULL)
+ if (parser->m_freeInternalEntities == NULL)
break;
- entityList = freeInternalEntities;
- freeInternalEntities = NULL;
+ entityList = parser->m_freeInternalEntities;
+ parser->m_freeInternalEntities = NULL;
}
openEntity = entityList;
entityList = entityList->next;
- FREE(openEntity);
+ FREE(parser, openEntity);
}
- destroyBindings(freeBindingList, parser);
- destroyBindings(inheritedBindings, parser);
- poolDestroy(&tempPool);
- poolDestroy(&temp2Pool);
+ destroyBindings(parser->m_freeBindingList, parser);
+ destroyBindings(parser->m_inheritedBindings, parser);
+ poolDestroy(&parser->m_tempPool);
+ poolDestroy(&parser->m_temp2Pool);
+ FREE(parser, (void *)parser->m_protocolEncodingName);
#ifdef XML_DTD
/* external parameter entity parsers share the DTD structure
parser->m_dtd with the root parser, so we must not destroy it
*/
- if (!isParamEntity && _dtd)
+ if (!parser->m_isParamEntity && parser->m_dtd)
#else
- if (_dtd)
+ if (parser->m_dtd)
#endif /* XML_DTD */
- dtdDestroy(_dtd, (XML_Bool)!parentParser, &parser->m_mem);
- FREE((void *)atts);
+ dtdDestroy(parser->m_dtd, (XML_Bool)!parser->m_parentParser, &parser->m_mem);
+ FREE(parser, (void *)parser->m_atts);
#ifdef XML_ATTR_INFO
- FREE((void *)attInfo);
+ FREE(parser, (void *)parser->m_attInfo);
#endif
- FREE(groupConnector);
- FREE(buffer);
- FREE(dataBuf);
- FREE(nsAtts);
- FREE(unknownEncodingMem);
- if (unknownEncodingRelease)
- unknownEncodingRelease(unknownEncodingData);
- FREE(parser);
+ FREE(parser, parser->m_groupConnector);
+ FREE(parser, parser->m_buffer);
+ FREE(parser, parser->m_dataBuf);
+ FREE(parser, parser->m_nsAtts);
+ FREE(parser, parser->m_unknownEncodingMem);
+ if (parser->m_unknownEncodingRelease)
+ parser->m_unknownEncodingRelease(parser->m_unknownEncodingData);
+ FREE(parser, parser);
}
void XMLCALL
XML_UseParserAsHandlerArg(XML_Parser parser)
{
if (parser != NULL)
- handlerArg = parser;
+ parser->m_handlerArg = parser;
}
enum XML_Error XMLCALL
@@ -1394,9 +1444,9 @@ XML_UseForeignDTD(XML_Parser parser, XML_Bool useDTD)
return XML_ERROR_INVALID_ARGUMENT;
#ifdef XML_DTD
/* block after XML_Parse()/XML_ParseBuffer() has been called */
- if (ps_parsing == XML_PARSING || ps_parsing == XML_SUSPENDED)
+ if (parser->m_parsingStatus.parsing == XML_PARSING || parser->m_parsingStatus.parsing == XML_SUSPENDED)
return XML_ERROR_CANT_CHANGE_FEATURE_ONCE_PARSING;
- useForeignDTD = useDTD;
+ parser->m_useForeignDTD = useDTD;
return XML_ERROR_NONE;
#else
return XML_ERROR_FEATURE_REQUIRES_XML_DTD;
@@ -1409,9 +1459,9 @@ XML_SetReturnNSTriplet(XML_Parser parser, int do_nst)
if (parser == NULL)
return;
/* block after XML_Parse()/XML_ParseBuffer() has been called */
- if (ps_parsing == XML_PARSING || ps_parsing == XML_SUSPENDED)
+ if (parser->m_parsingStatus.parsing == XML_PARSING || parser->m_parsingStatus.parsing == XML_SUSPENDED)
return;
- ns_triplets = do_nst ? XML_TRUE : XML_FALSE;
+ parser->m_ns_triplets = do_nst ? XML_TRUE : XML_FALSE;
}
void XMLCALL
@@ -1419,10 +1469,10 @@ XML_SetUserData(XML_Parser parser, void *p)
{
if (parser == NULL)
return;
- if (handlerArg == userData)
- handlerArg = userData = p;
+ if (parser->m_handlerArg == parser->m_userData)
+ parser->m_handlerArg = parser->m_userData = p;
else
- userData = p;
+ parser->m_userData = p;
}
enum XML_Status XMLCALL
@@ -1431,13 +1481,13 @@ XML_SetBase(XML_Parser parser, const XML_Char *p)
if (parser == NULL)
return XML_STATUS_ERROR;
if (p) {
- p = poolCopyString(&_dtd->pool, p);
+ p = poolCopyString(&parser->m_dtd->pool, p);
if (!p)
return XML_STATUS_ERROR;
- curBase = p;
+ parser->m_curBase = p;
}
else
- curBase = NULL;
+ parser->m_curBase = NULL;
return XML_STATUS_OK;
}
@@ -1446,7 +1496,7 @@ XML_GetBase(XML_Parser parser)
{
if (parser == NULL)
return NULL;
- return curBase;
+ return parser->m_curBase;
}
int XMLCALL
@@ -1454,7 +1504,7 @@ XML_GetSpecifiedAttributeCount(XML_Parser parser)
{
if (parser == NULL)
return -1;
- return nSpecifiedAtts;
+ return parser->m_nSpecifiedAtts;
}
int XMLCALL
@@ -1462,7 +1512,7 @@ XML_GetIdAttributeIndex(XML_Parser parser)
{
if (parser == NULL)
return -1;
- return idAttIndex;
+ return parser->m_idAttIndex;
}
#ifdef XML_ATTR_INFO
@@ -1471,7 +1521,7 @@ XML_GetAttributeInfo(XML_Parser parser)
{
if (parser == NULL)
return NULL;
- return attInfo;
+ return parser->m_attInfo;
}
#endif
@@ -1482,22 +1532,22 @@ XML_SetElementHandler(XML_Parser parser,
{
if (parser == NULL)
return;
- startElementHandler = start;
- endElementHandler = end;
+ parser->m_startElementHandler = start;
+ parser->m_endElementHandler = end;
}
void XMLCALL
XML_SetStartElementHandler(XML_Parser parser,
XML_StartElementHandler start) {
if (parser != NULL)
- startElementHandler = start;
+ parser->m_startElementHandler = start;
}
void XMLCALL
XML_SetEndElementHandler(XML_Parser parser,
XML_EndElementHandler end) {
if (parser != NULL)
- endElementHandler = end;
+ parser->m_endElementHandler = end;
}
void XMLCALL
@@ -1505,7 +1555,7 @@ XML_SetCharacterDataHandler(XML_Parser parser,
XML_CharacterDataHandler handler)
{
if (parser != NULL)
- characterDataHandler = handler;
+ parser->m_characterDataHandler = handler;
}
void XMLCALL
@@ -1513,7 +1563,7 @@ XML_SetProcessingInstructionHandler(XML_Parser parser,
XML_ProcessingInstructionHandler handler)
{
if (parser != NULL)
- processingInstructionHandler = handler;
+ parser->m_processingInstructionHandler = handler;
}
void XMLCALL
@@ -1521,7 +1571,7 @@ XML_SetCommentHandler(XML_Parser parser,
XML_CommentHandler handler)
{
if (parser != NULL)
- commentHandler = handler;
+ parser->m_commentHandler = handler;
}
void XMLCALL
@@ -1531,22 +1581,22 @@ XML_SetCdataSectionHandler(XML_Parser parser,
{
if (parser == NULL)
return;
- startCdataSectionHandler = start;
- endCdataSectionHandler = end;
+ parser->m_startCdataSectionHandler = start;
+ parser->m_endCdataSectionHandler = end;
}
void XMLCALL
XML_SetStartCdataSectionHandler(XML_Parser parser,
XML_StartCdataSectionHandler start) {
if (parser != NULL)
- startCdataSectionHandler = start;
+ parser->m_startCdataSectionHandler = start;
}
void XMLCALL
XML_SetEndCdataSectionHandler(XML_Parser parser,
XML_EndCdataSectionHandler end) {
if (parser != NULL)
- endCdataSectionHandler = end;
+ parser->m_endCdataSectionHandler = end;
}
void XMLCALL
@@ -1555,8 +1605,8 @@ XML_SetDefaultHandler(XML_Parser parser,
{
if (parser == NULL)
return;
- defaultHandler = handler;
- defaultExpandInternalEntities = XML_FALSE;
+ parser->m_defaultHandler = handler;
+ parser->m_defaultExpandInternalEntities = XML_FALSE;
}
void XMLCALL
@@ -1565,8 +1615,8 @@ XML_SetDefaultHandlerExpand(XML_Parser parser,
{
if (parser == NULL)
return;
- defaultHandler = handler;
- defaultExpandInternalEntities = XML_TRUE;
+ parser->m_defaultHandler = handler;
+ parser->m_defaultExpandInternalEntities = XML_TRUE;
}
void XMLCALL
@@ -1576,22 +1626,22 @@ XML_SetDoctypeDeclHandler(XML_Parser parser,
{
if (parser == NULL)
return;
- startDoctypeDeclHandler = start;
- endDoctypeDeclHandler = end;
+ parser->m_startDoctypeDeclHandler = start;
+ parser->m_endDoctypeDeclHandler = end;
}
void XMLCALL
XML_SetStartDoctypeDeclHandler(XML_Parser parser,
XML_StartDoctypeDeclHandler start) {
if (parser != NULL)
- startDoctypeDeclHandler = start;
+ parser->m_startDoctypeDeclHandler = start;
}
void XMLCALL
XML_SetEndDoctypeDeclHandler(XML_Parser parser,
XML_EndDoctypeDeclHandler end) {
if (parser != NULL)
- endDoctypeDeclHandler = end;
+ parser->m_endDoctypeDeclHandler = end;
}
void XMLCALL
@@ -1599,7 +1649,7 @@ XML_SetUnparsedEntityDeclHandler(XML_Parser parser,
XML_UnparsedEntityDeclHandler handler)
{
if (parser != NULL)
- unparsedEntityDeclHandler = handler;
+ parser->m_unparsedEntityDeclHandler = handler;
}
void XMLCALL
@@ -1607,7 +1657,7 @@ XML_SetNotationDeclHandler(XML_Parser parser,
XML_NotationDeclHandler handler)
{
if (parser != NULL)
- notationDeclHandler = handler;
+ parser->m_notationDeclHandler = handler;
}
void XMLCALL
@@ -1617,22 +1667,22 @@ XML_SetNamespaceDeclHandler(XML_Parser parser,
{
if (parser == NULL)
return;
- startNamespaceDeclHandler = start;
- endNamespaceDeclHandler = end;
+ parser->m_startNamespaceDeclHandler = start;
+ parser->m_endNamespaceDeclHandler = end;
}
void XMLCALL
XML_SetStartNamespaceDeclHandler(XML_Parser parser,
XML_StartNamespaceDeclHandler start) {
if (parser != NULL)
- startNamespaceDeclHandler = start;
+ parser->m_startNamespaceDeclHandler = start;
}
void XMLCALL
XML_SetEndNamespaceDeclHandler(XML_Parser parser,
XML_EndNamespaceDeclHandler end) {
if (parser != NULL)
- endNamespaceDeclHandler = end;
+ parser->m_endNamespaceDeclHandler = end;
}
void XMLCALL
@@ -1640,7 +1690,7 @@ XML_SetNotStandaloneHandler(XML_Parser parser,
XML_NotStandaloneHandler handler)
{
if (parser != NULL)
- notStandaloneHandler = handler;
+ parser->m_notStandaloneHandler = handler;
}
void XMLCALL
@@ -1648,7 +1698,7 @@ XML_SetExternalEntityRefHandler(XML_Parser parser,
XML_ExternalEntityRefHandler handler)
{
if (parser != NULL)
- externalEntityRefHandler = handler;
+ parser->m_externalEntityRefHandler = handler;
}
void XMLCALL
@@ -1657,9 +1707,9 @@ XML_SetExternalEntityRefHandlerArg(XML_Parser parser, void *arg)
if (parser == NULL)
return;
if (arg)
- externalEntityRefHandlerArg = (XML_Parser)arg;
+ parser->m_externalEntityRefHandlerArg = (XML_Parser)arg;
else
- externalEntityRefHandlerArg = parser;
+ parser->m_externalEntityRefHandlerArg = parser;
}
void XMLCALL
@@ -1667,7 +1717,7 @@ XML_SetSkippedEntityHandler(XML_Parser parser,
XML_SkippedEntityHandler handler)
{
if (parser != NULL)
- skippedEntityHandler = handler;
+ parser->m_skippedEntityHandler = handler;
}
void XMLCALL
@@ -1677,8 +1727,8 @@ XML_SetUnknownEncodingHandler(XML_Parser parser,
{
if (parser == NULL)
return;
- unknownEncodingHandler = handler;
- unknownEncodingHandlerData = data;
+ parser->m_unknownEncodingHandler = handler;
+ parser->m_unknownEncodingHandlerData = data;
}
void XMLCALL
@@ -1686,7 +1736,7 @@ XML_SetElementDeclHandler(XML_Parser parser,
XML_ElementDeclHandler eldecl)
{
if (parser != NULL)
- elementDeclHandler = eldecl;
+ parser->m_elementDeclHandler = eldecl;
}
void XMLCALL
@@ -1694,7 +1744,7 @@ XML_SetAttlistDeclHandler(XML_Parser parser,
XML_AttlistDeclHandler attdecl)
{
if (parser != NULL)
- attlistDeclHandler = attdecl;
+ parser->m_attlistDeclHandler = attdecl;
}
void XMLCALL
@@ -1702,14 +1752,14 @@ XML_SetEntityDeclHandler(XML_Parser parser,
XML_EntityDeclHandler handler)
{
if (parser != NULL)
- entityDeclHandler = handler;
+ parser->m_entityDeclHandler = handler;
}
void XMLCALL
XML_SetXmlDeclHandler(XML_Parser parser,
XML_XmlDeclHandler handler) {
if (parser != NULL)
- xmlDeclHandler = handler;
+ parser->m_xmlDeclHandler = handler;
}
int XMLCALL
@@ -1719,10 +1769,10 @@ XML_SetParamEntityParsing(XML_Parser parser,
if (parser == NULL)
return 0;
/* block after XML_Parse()/XML_ParseBuffer() has been called */
- if (ps_parsing == XML_PARSING || ps_parsing == XML_SUSPENDED)
+ if (parser->m_parsingStatus.parsing == XML_PARSING || parser->m_parsingStatus.parsing == XML_SUSPENDED)
return 0;
#ifdef XML_DTD
- paramEntityParsing = peParsing;
+ parser->m_paramEntityParsing = peParsing;
return 1;
#else
return peParsing == XML_PARAM_ENTITY_PARSING_NEVER;
@@ -1738,9 +1788,9 @@ XML_SetHashSalt(XML_Parser parser,
if (parser->m_parentParser)
return XML_SetHashSalt(parser->m_parentParser, hash_salt);
/* block after XML_Parse()/XML_ParseBuffer() has been called */
- if (ps_parsing == XML_PARSING || ps_parsing == XML_SUSPENDED)
+ if (parser->m_parsingStatus.parsing == XML_PARSING || parser->m_parsingStatus.parsing == XML_SUSPENDED)
return 0;
- hash_secret_salt = hash_salt;
+ parser->m_hash_secret_salt = hash_salt;
return 1;
}
@@ -1748,88 +1798,103 @@ enum XML_Status XMLCALL
XML_Parse(XML_Parser parser, const char *s, int len, int isFinal)
{
if ((parser == NULL) || (len < 0) || ((s == NULL) && (len != 0))) {
- errorCode = XML_ERROR_INVALID_ARGUMENT;
+ if (parser != NULL)
+ parser->m_errorCode = XML_ERROR_INVALID_ARGUMENT;
return XML_STATUS_ERROR;
}
- switch (ps_parsing) {
+ switch (parser->m_parsingStatus.parsing) {
case XML_SUSPENDED:
- errorCode = XML_ERROR_SUSPENDED;
+ parser->m_errorCode = XML_ERROR_SUSPENDED;
return XML_STATUS_ERROR;
case XML_FINISHED:
- errorCode = XML_ERROR_FINISHED;
+ parser->m_errorCode = XML_ERROR_FINISHED;
return XML_STATUS_ERROR;
case XML_INITIALIZED:
- if (parentParser == NULL && !startParsing(parser)) {
- errorCode = XML_ERROR_NO_MEMORY;
+ if (parser->m_parentParser == NULL && !startParsing(parser)) {
+ parser->m_errorCode = XML_ERROR_NO_MEMORY;
return XML_STATUS_ERROR;
}
+ /* fall through */
default:
- ps_parsing = XML_PARSING;
+ parser->m_parsingStatus.parsing = XML_PARSING;
}
if (len == 0) {
- ps_finalBuffer = (XML_Bool)isFinal;
+ parser->m_parsingStatus.finalBuffer = (XML_Bool)isFinal;
if (!isFinal)
return XML_STATUS_OK;
- positionPtr = bufferPtr;
- parseEndPtr = bufferEnd;
+ parser->m_positionPtr = parser->m_bufferPtr;
+ parser->m_parseEndPtr = parser->m_bufferEnd;
/* If data are left over from last buffer, and we now know that these
data are the final chunk of input, then we have to check them again
to detect errors based on that fact.
*/
- errorCode = processor(parser, bufferPtr, parseEndPtr, &bufferPtr);
+ parser->m_errorCode = parser->m_processor(parser, parser->m_bufferPtr, parser->m_parseEndPtr, &parser->m_bufferPtr);
- if (errorCode == XML_ERROR_NONE) {
- switch (ps_parsing) {
+ if (parser->m_errorCode == XML_ERROR_NONE) {
+ switch (parser->m_parsingStatus.parsing) {
case XML_SUSPENDED:
- XmlUpdatePosition(encoding, positionPtr, bufferPtr, &position);
- positionPtr = bufferPtr;
+ /* It is hard to be certain, but it seems that this case
+ * cannot occur. This code is cleaning up a previous parse
+ * with no new data (since len == 0). Changing the parsing
+ * state requires getting to execute a handler function, and
+ * there doesn't seem to be an opportunity for that while in
+ * this circumstance.
+ *
+ * Given the uncertainty, we retain the code but exclude it
+ * from coverage tests.
+ *
+ * LCOV_EXCL_START
+ */
+ XmlUpdatePosition(parser->m_encoding, parser->m_positionPtr, parser->m_bufferPtr, &parser->m_position);
+ parser->m_positionPtr = parser->m_bufferPtr;
return XML_STATUS_SUSPENDED;
+ /* LCOV_EXCL_STOP */
case XML_INITIALIZED:
case XML_PARSING:
- ps_parsing = XML_FINISHED;
+ parser->m_parsingStatus.parsing = XML_FINISHED;
/* fall through */
default:
return XML_STATUS_OK;
}
}
- eventEndPtr = eventPtr;
- processor = errorProcessor;
+ parser->m_eventEndPtr = parser->m_eventPtr;
+ parser->m_processor = errorProcessor;
return XML_STATUS_ERROR;
}
#ifndef XML_CONTEXT_BYTES
- else if (bufferPtr == bufferEnd) {
+ else if (parser->m_bufferPtr == parser->m_bufferEnd) {
const char *end;
int nLeftOver;
enum XML_Status result;
/* Detect overflow (a+b > MAX <==> b > MAX-a) */
- if (len > ((XML_Size)-1) / 2 - parseEndByteIndex) {
- errorCode = XML_ERROR_NO_MEMORY;
- eventPtr = eventEndPtr = NULL;
- processor = errorProcessor;
+ if (len > ((XML_Size)-1) / 2 - parser->m_parseEndByteIndex) {
+ parser->m_errorCode = XML_ERROR_NO_MEMORY;
+ parser->m_eventPtr = parser->m_eventEndPtr = NULL;
+ parser->m_processor = errorProcessor;
return XML_STATUS_ERROR;
}
- parseEndByteIndex += len;
- positionPtr = s;
- ps_finalBuffer = (XML_Bool)isFinal;
+ parser->m_parseEndByteIndex += len;
+ parser->m_positionPtr = s;
+ parser->m_parsingStatus.finalBuffer = (XML_Bool)isFinal;
- errorCode = processor(parser, s, parseEndPtr = s + len, &end);
+ parser->m_errorCode = parser->m_processor(parser, s, parser->m_parseEndPtr = s + len, &end);
- if (errorCode != XML_ERROR_NONE) {
- eventEndPtr = eventPtr;
- processor = errorProcessor;
+ if (parser->m_errorCode != XML_ERROR_NONE) {
+ parser->m_eventEndPtr = parser->m_eventPtr;
+ parser->m_processor = errorProcessor;
return XML_STATUS_ERROR;
}
else {
- switch (ps_parsing) {
+ switch (parser->m_parsingStatus.parsing) {
case XML_SUSPENDED:
result = XML_STATUS_SUSPENDED;
break;
case XML_INITIALIZED:
case XML_PARSING:
if (isFinal) {
- ps_parsing = XML_FINISHED;
+ parser->m_parsingStatus.parsing = XML_FINISHED;
return XML_STATUS_OK;
}
/* fall through */
@@ -1838,35 +1903,33 @@ XML_Parse(XML_Parser parser, const char *s, int len, int isFinal)
}
}
- XmlUpdatePosition(encoding, positionPtr, end, &position);
+ XmlUpdatePosition(parser->m_encoding, parser->m_positionPtr, end, &parser->m_position);
nLeftOver = s + len - end;
if (nLeftOver) {
- if (buffer == NULL || nLeftOver > bufferLim - buffer) {
+ if (parser->m_buffer == NULL || nLeftOver > parser->m_bufferLim - parser->m_buffer) {
/* avoid _signed_ integer overflow */
char *temp = NULL;
const int bytesToAllocate = (int)((unsigned)len * 2U);
if (bytesToAllocate > 0) {
- temp = (buffer == NULL
- ? (char *)MALLOC(bytesToAllocate)
- : (char *)REALLOC(buffer, bytesToAllocate));
+ temp = (char *)REALLOC(parser, parser->m_buffer, bytesToAllocate);
}
if (temp == NULL) {
- errorCode = XML_ERROR_NO_MEMORY;
- eventPtr = eventEndPtr = NULL;
- processor = errorProcessor;
+ parser->m_errorCode = XML_ERROR_NO_MEMORY;
+ parser->m_eventPtr = parser->m_eventEndPtr = NULL;
+ parser->m_processor = errorProcessor;
return XML_STATUS_ERROR;
}
- buffer = temp;
- bufferLim = buffer + bytesToAllocate;
+ parser->m_buffer = temp;
+ parser->m_bufferLim = parser->m_buffer + bytesToAllocate;
}
- memcpy(buffer, end, nLeftOver);
+ memcpy(parser->m_buffer, end, nLeftOver);
}
- bufferPtr = buffer;
- bufferEnd = buffer + nLeftOver;
- positionPtr = bufferPtr;
- parseEndPtr = bufferEnd;
- eventPtr = bufferPtr;
- eventEndPtr = bufferPtr;
+ parser->m_bufferPtr = parser->m_buffer;
+ parser->m_bufferEnd = parser->m_buffer + nLeftOver;
+ parser->m_positionPtr = parser->m_bufferPtr;
+ parser->m_parseEndPtr = parser->m_bufferEnd;
+ parser->m_eventPtr = parser->m_bufferPtr;
+ parser->m_eventEndPtr = parser->m_bufferPtr;
return result;
}
#endif /* not defined XML_CONTEXT_BYTES */
@@ -1889,53 +1952,54 @@ XML_ParseBuffer(XML_Parser parser, int len, int isFinal)
if (parser == NULL)
return XML_STATUS_ERROR;
- switch (ps_parsing) {
+ switch (parser->m_parsingStatus.parsing) {
case XML_SUSPENDED:
- errorCode = XML_ERROR_SUSPENDED;
+ parser->m_errorCode = XML_ERROR_SUSPENDED;
return XML_STATUS_ERROR;
case XML_FINISHED:
- errorCode = XML_ERROR_FINISHED;
+ parser->m_errorCode = XML_ERROR_FINISHED;
return XML_STATUS_ERROR;
case XML_INITIALIZED:
- if (parentParser == NULL && !startParsing(parser)) {
- errorCode = XML_ERROR_NO_MEMORY;
+ if (parser->m_parentParser == NULL && !startParsing(parser)) {
+ parser->m_errorCode = XML_ERROR_NO_MEMORY;
return XML_STATUS_ERROR;
}
+ /* fall through */
default:
- ps_parsing = XML_PARSING;
+ parser->m_parsingStatus.parsing = XML_PARSING;
}
- start = bufferPtr;
- positionPtr = start;
- bufferEnd += len;
- parseEndPtr = bufferEnd;
- parseEndByteIndex += len;
- ps_finalBuffer = (XML_Bool)isFinal;
+ start = parser->m_bufferPtr;
+ parser->m_positionPtr = start;
+ parser->m_bufferEnd += len;
+ parser->m_parseEndPtr = parser->m_bufferEnd;
+ parser->m_parseEndByteIndex += len;
+ parser->m_parsingStatus.finalBuffer = (XML_Bool)isFinal;
- errorCode = processor(parser, start, parseEndPtr, &bufferPtr);
+ parser->m_errorCode = parser->m_processor(parser, start, parser->m_parseEndPtr, &parser->m_bufferPtr);
- if (errorCode != XML_ERROR_NONE) {
- eventEndPtr = eventPtr;
- processor = errorProcessor;
+ if (parser->m_errorCode != XML_ERROR_NONE) {
+ parser->m_eventEndPtr = parser->m_eventPtr;
+ parser->m_processor = errorProcessor;
return XML_STATUS_ERROR;
}
else {
- switch (ps_parsing) {
+ switch (parser->m_parsingStatus.parsing) {
case XML_SUSPENDED:
result = XML_STATUS_SUSPENDED;
break;
case XML_INITIALIZED:
case XML_PARSING:
if (isFinal) {
- ps_parsing = XML_FINISHED;
+ parser->m_parsingStatus.parsing = XML_FINISHED;
return result;
}
default: ; /* should not happen */
}
}
- XmlUpdatePosition(encoding, positionPtr, bufferPtr, &position);
- positionPtr = bufferPtr;
+ XmlUpdatePosition(parser->m_encoding, parser->m_positionPtr, parser->m_bufferPtr, &parser->m_position);
+ parser->m_positionPtr = parser->m_bufferPtr;
return result;
}
@@ -1945,52 +2009,59 @@ XML_GetBuffer(XML_Parser parser, int len)
if (parser == NULL)
return NULL;
if (len < 0) {
- errorCode = XML_ERROR_NO_MEMORY;
+ parser->m_errorCode = XML_ERROR_NO_MEMORY;
return NULL;
}
- switch (ps_parsing) {
+ switch (parser->m_parsingStatus.parsing) {
case XML_SUSPENDED:
- errorCode = XML_ERROR_SUSPENDED;
+ parser->m_errorCode = XML_ERROR_SUSPENDED;
return NULL;
case XML_FINISHED:
- errorCode = XML_ERROR_FINISHED;
+ parser->m_errorCode = XML_ERROR_FINISHED;
return NULL;
default: ;
}
- if (len > bufferLim - bufferEnd) {
+ if (len > EXPAT_SAFE_PTR_DIFF(parser->m_bufferLim, parser->m_bufferEnd)) {
#ifdef XML_CONTEXT_BYTES
int keep;
#endif /* defined XML_CONTEXT_BYTES */
/* Do not invoke signed arithmetic overflow: */
- int neededSize = (int) ((unsigned)len + (unsigned)(bufferEnd - bufferPtr));
+ int neededSize = (int) ((unsigned)len +
+ (unsigned)EXPAT_SAFE_PTR_DIFF(parser->m_bufferEnd,
+ parser->m_bufferPtr));
if (neededSize < 0) {
- errorCode = XML_ERROR_NO_MEMORY;
+ parser->m_errorCode = XML_ERROR_NO_MEMORY;
return NULL;
}
#ifdef XML_CONTEXT_BYTES
- keep = (int)(bufferPtr - buffer);
+ keep = (int)EXPAT_SAFE_PTR_DIFF(parser->m_bufferPtr, parser->m_buffer);
if (keep > XML_CONTEXT_BYTES)
keep = XML_CONTEXT_BYTES;
neededSize += keep;
#endif /* defined XML_CONTEXT_BYTES */
- if (neededSize <= bufferLim - buffer) {
+ if (neededSize <= EXPAT_SAFE_PTR_DIFF(parser->m_bufferLim, parser->m_buffer)) {
#ifdef XML_CONTEXT_BYTES
- if (keep < bufferPtr - buffer) {
- int offset = (int)(bufferPtr - buffer) - keep;
- memmove(buffer, &buffer[offset], bufferEnd - bufferPtr + keep);
- bufferEnd -= offset;
- bufferPtr -= offset;
+ if (keep < EXPAT_SAFE_PTR_DIFF(parser->m_bufferPtr, parser->m_buffer)) {
+ int offset = (int)EXPAT_SAFE_PTR_DIFF(parser->m_bufferPtr, parser->m_buffer) - keep;
+ /* The buffer pointers cannot be NULL here; we have at least some bytes in the buffer */
+ memmove(parser->m_buffer, &parser->m_buffer[offset], parser->m_bufferEnd - parser->m_bufferPtr + keep);
+ parser->m_bufferEnd -= offset;
+ parser->m_bufferPtr -= offset;
}
#else
- memmove(buffer, bufferPtr, bufferEnd - bufferPtr);
- bufferEnd = buffer + (bufferEnd - bufferPtr);
- bufferPtr = buffer;
+ if (parser->m_buffer && parser->m_bufferPtr) {
+ memmove(parser->m_buffer, parser->m_bufferPtr,
+ EXPAT_SAFE_PTR_DIFF(parser->m_bufferEnd, parser->m_bufferPtr));
+ parser->m_bufferEnd = parser->m_buffer +
+ EXPAT_SAFE_PTR_DIFF(parser->m_bufferEnd, parser->m_bufferPtr);
+ parser->m_bufferPtr = parser->m_buffer;
+ }
#endif /* not defined XML_CONTEXT_BYTES */
}
else {
char *newBuf;
- int bufferSize = (int)(bufferLim - bufferPtr);
+ int bufferSize = (int)EXPAT_SAFE_PTR_DIFF(parser->m_bufferLim, parser->m_bufferPtr);
if (bufferSize == 0)
bufferSize = INIT_BUFFER_SIZE;
do {
@@ -1998,43 +2069,52 @@ XML_GetBuffer(XML_Parser parser, int len)
bufferSize = (int) (2U * (unsigned) bufferSize);
} while (bufferSize < neededSize && bufferSize > 0);
if (bufferSize <= 0) {
- errorCode = XML_ERROR_NO_MEMORY;
+ parser->m_errorCode = XML_ERROR_NO_MEMORY;
return NULL;
}
- newBuf = (char *)MALLOC(bufferSize);
+ newBuf = (char *)MALLOC(parser, bufferSize);
if (newBuf == 0) {
- errorCode = XML_ERROR_NO_MEMORY;
+ parser->m_errorCode = XML_ERROR_NO_MEMORY;
return NULL;
}
- bufferLim = newBuf + bufferSize;
+ parser->m_bufferLim = newBuf + bufferSize;
#ifdef XML_CONTEXT_BYTES
- if (bufferPtr) {
- int keep = (int)(bufferPtr - buffer);
+ if (parser->m_bufferPtr) {
+ int keep = (int)EXPAT_SAFE_PTR_DIFF(parser->m_bufferPtr, parser->m_buffer);
if (keep > XML_CONTEXT_BYTES)
keep = XML_CONTEXT_BYTES;
- memcpy(newBuf, &bufferPtr[-keep], bufferEnd - bufferPtr + keep);
- FREE(buffer);
- buffer = newBuf;
- bufferEnd = buffer + (bufferEnd - bufferPtr) + keep;
- bufferPtr = buffer + keep;
+ memcpy(newBuf, &parser->m_bufferPtr[-keep],
+ EXPAT_SAFE_PTR_DIFF(parser->m_bufferEnd, parser->m_bufferPtr) + keep);
+ FREE(parser, parser->m_buffer);
+ parser->m_buffer = newBuf;
+ parser->m_bufferEnd = parser->m_buffer +
+ EXPAT_SAFE_PTR_DIFF(parser->m_bufferEnd, parser->m_bufferPtr) + keep;
+ parser->m_bufferPtr = parser->m_buffer + keep;
}
else {
- bufferEnd = newBuf + (bufferEnd - bufferPtr);
- bufferPtr = buffer = newBuf;
+ /* This must be a brand new buffer with no data in it yet */
+ parser->m_bufferEnd = newBuf;
+ parser->m_bufferPtr = parser->m_buffer = newBuf;
}
#else
- if (bufferPtr) {
- memcpy(newBuf, bufferPtr, bufferEnd - bufferPtr);
- FREE(buffer);
+ if (parser->m_bufferPtr) {
+ memcpy(newBuf, parser->m_bufferPtr,
+ EXPAT_SAFE_PTR_DIFF(parser->m_bufferEnd, parser->m_bufferPtr));
+ FREE(parser, parser->m_buffer);
+ parser->m_bufferEnd = newBuf +
+ EXPAT_SAFE_PTR_DIFF(parser->m_bufferEnd, parser->m_bufferPtr);
+ }
+ else {
+ /* This must be a brand new buffer with no data in it yet */
+ parser->m_bufferEnd = newBuf;
}
- bufferEnd = newBuf + (bufferEnd - bufferPtr);
- bufferPtr = buffer = newBuf;
+ parser->m_bufferPtr = parser->m_buffer = newBuf;
#endif /* not defined XML_CONTEXT_BYTES */
}
- eventPtr = eventEndPtr = NULL;
- positionPtr = NULL;
+ parser->m_eventPtr = parser->m_eventEndPtr = NULL;
+ parser->m_positionPtr = NULL;
}
- return bufferEnd;
+ return parser->m_bufferEnd;
}
enum XML_Status XMLCALL
@@ -2042,29 +2122,29 @@ XML_StopParser(XML_Parser parser, XML_Bool resumable)
{
if (parser == NULL)
return XML_STATUS_ERROR;
- switch (ps_parsing) {
+ switch (parser->m_parsingStatus.parsing) {
case XML_SUSPENDED:
if (resumable) {
- errorCode = XML_ERROR_SUSPENDED;
+ parser->m_errorCode = XML_ERROR_SUSPENDED;
return XML_STATUS_ERROR;
}
- ps_parsing = XML_FINISHED;
+ parser->m_parsingStatus.parsing = XML_FINISHED;
break;
case XML_FINISHED:
- errorCode = XML_ERROR_FINISHED;
+ parser->m_errorCode = XML_ERROR_FINISHED;
return XML_STATUS_ERROR;
default:
if (resumable) {
#ifdef XML_DTD
- if (isParamEntity) {
- errorCode = XML_ERROR_SUSPEND_PE;
+ if (parser->m_isParamEntity) {
+ parser->m_errorCode = XML_ERROR_SUSPEND_PE;
return XML_STATUS_ERROR;
}
#endif
- ps_parsing = XML_SUSPENDED;
+ parser->m_parsingStatus.parsing = XML_SUSPENDED;
}
else
- ps_parsing = XML_FINISHED;
+ parser->m_parsingStatus.parsing = XML_FINISHED;
}
return XML_STATUS_OK;
}
@@ -2076,36 +2156,36 @@ XML_ResumeParser(XML_Parser parser)
if (parser == NULL)
return XML_STATUS_ERROR;
- if (ps_parsing != XML_SUSPENDED) {
- errorCode = XML_ERROR_NOT_SUSPENDED;
+ if (parser->m_parsingStatus.parsing != XML_SUSPENDED) {
+ parser->m_errorCode = XML_ERROR_NOT_SUSPENDED;
return XML_STATUS_ERROR;
}
- ps_parsing = XML_PARSING;
+ parser->m_parsingStatus.parsing = XML_PARSING;
- errorCode = processor(parser, bufferPtr, parseEndPtr, &bufferPtr);
+ parser->m_errorCode = parser->m_processor(parser, parser->m_bufferPtr, parser->m_parseEndPtr, &parser->m_bufferPtr);
- if (errorCode != XML_ERROR_NONE) {
- eventEndPtr = eventPtr;
- processor = errorProcessor;
+ if (parser->m_errorCode != XML_ERROR_NONE) {
+ parser->m_eventEndPtr = parser->m_eventPtr;
+ parser->m_processor = errorProcessor;
return XML_STATUS_ERROR;
}
else {
- switch (ps_parsing) {
+ switch (parser->m_parsingStatus.parsing) {
case XML_SUSPENDED:
result = XML_STATUS_SUSPENDED;
break;
case XML_INITIALIZED:
case XML_PARSING:
- if (ps_finalBuffer) {
- ps_parsing = XML_FINISHED;
+ if (parser->m_parsingStatus.finalBuffer) {
+ parser->m_parsingStatus.parsing = XML_FINISHED;
return result;
}
default: ;
}
}
- XmlUpdatePosition(encoding, positionPtr, bufferPtr, &position);
- positionPtr = bufferPtr;
+ XmlUpdatePosition(parser->m_encoding, parser->m_positionPtr, parser->m_bufferPtr, &parser->m_position);
+ parser->m_positionPtr = parser->m_bufferPtr;
return result;
}
@@ -2123,7 +2203,7 @@ XML_GetErrorCode(XML_Parser parser)
{
if (parser == NULL)
return XML_ERROR_INVALID_ARGUMENT;
- return errorCode;
+ return parser->m_errorCode;
}
XML_Index XMLCALL
@@ -2131,8 +2211,8 @@ XML_GetCurrentByteIndex(XML_Parser parser)
{
if (parser == NULL)
return -1;
- if (eventPtr)
- return (XML_Index)(parseEndByteIndex - (parseEndPtr - eventPtr));
+ if (parser->m_eventPtr)
+ return (XML_Index)(parser->m_parseEndByteIndex - (parser->m_parseEndPtr - parser->m_eventPtr));
return -1;
}
@@ -2141,8 +2221,8 @@ XML_GetCurrentByteCount(XML_Parser parser)
{
if (parser == NULL)
return 0;
- if (eventEndPtr && eventPtr)
- return (int)(eventEndPtr - eventPtr);
+ if (parser->m_eventEndPtr && parser->m_eventPtr)
+ return (int)(parser->m_eventEndPtr - parser->m_eventPtr);
return 0;
}
@@ -2152,12 +2232,12 @@ XML_GetInputContext(XML_Parser parser, int *offset, int *size)
#ifdef XML_CONTEXT_BYTES
if (parser == NULL)
return NULL;
- if (eventPtr && buffer) {
+ if (parser->m_eventPtr && parser->m_buffer) {
if (offset != NULL)
- *offset = (int)(eventPtr - buffer);
+ *offset = (int)(parser->m_eventPtr - parser->m_buffer);
if (size != NULL)
- *size = (int)(bufferEnd - buffer);
- return buffer;
+ *size = (int)(parser->m_bufferEnd - parser->m_buffer);
+ return parser->m_buffer;
}
#else
(void)parser;
@@ -2172,11 +2252,11 @@ XML_GetCurrentLineNumber(XML_Parser parser)
{
if (parser == NULL)
return 0;
- if (eventPtr && eventPtr >= positionPtr) {
- XmlUpdatePosition(encoding, positionPtr, eventPtr, &position);
- positionPtr = eventPtr;
+ if (parser->m_eventPtr && parser->m_eventPtr >= parser->m_positionPtr) {
+ XmlUpdatePosition(parser->m_encoding, parser->m_positionPtr, parser->m_eventPtr, &parser->m_position);
+ parser->m_positionPtr = parser->m_eventPtr;
}
- return position.lineNumber + 1;
+ return parser->m_position.lineNumber + 1;
}
XML_Size XMLCALL
@@ -2184,18 +2264,18 @@ XML_GetCurrentColumnNumber(XML_Parser parser)
{
if (parser == NULL)
return 0;
- if (eventPtr && eventPtr >= positionPtr) {
- XmlUpdatePosition(encoding, positionPtr, eventPtr, &position);
- positionPtr = eventPtr;
+ if (parser->m_eventPtr && parser->m_eventPtr >= parser->m_positionPtr) {
+ XmlUpdatePosition(parser->m_encoding, parser->m_positionPtr, parser->m_eventPtr, &parser->m_position);
+ parser->m_positionPtr = parser->m_eventPtr;
}
- return position.columnNumber;
+ return parser->m_position.columnNumber;
}
void XMLCALL
XML_FreeContentModel(XML_Parser parser, XML_Content *model)
{
if (parser != NULL)
- FREE(model);
+ FREE(parser, model);
}
void * XMLCALL
@@ -2203,7 +2283,7 @@ XML_MemMalloc(XML_Parser parser, size_t size)
{
if (parser == NULL)
return NULL;
- return MALLOC(size);
+ return MALLOC(parser, size);
}
void * XMLCALL
@@ -2211,14 +2291,14 @@ XML_MemRealloc(XML_Parser parser, void *ptr, size_t size)
{
if (parser == NULL)
return NULL;
- return REALLOC(ptr, size);
+ return REALLOC(parser, ptr, size);
}
void XMLCALL
XML_MemFree(XML_Parser parser, void *ptr)
{
if (parser != NULL)
- FREE(ptr);
+ FREE(parser, ptr);
}
void XMLCALL
@@ -2226,65 +2306,110 @@ XML_DefaultCurrent(XML_Parser parser)
{
if (parser == NULL)
return;
- if (defaultHandler) {
- if (openInternalEntities)
+ if (parser->m_defaultHandler) {
+ if (parser->m_openInternalEntities)
reportDefault(parser,
- internalEncoding,
- openInternalEntities->internalEventPtr,
- openInternalEntities->internalEventEndPtr);
+ parser->m_internalEncoding,
+ parser->m_openInternalEntities->internalEventPtr,
+ parser->m_openInternalEntities->internalEventEndPtr);
else
- reportDefault(parser, encoding, eventPtr, eventEndPtr);
+ reportDefault(parser, parser->m_encoding, parser->m_eventPtr, parser->m_eventEndPtr);
}
}
const XML_LChar * XMLCALL
XML_ErrorString(enum XML_Error code)
{
- static const XML_LChar* const message[] = {
- 0,
- XML_L("out of memory"),
- XML_L("syntax error"),
- XML_L("no element found"),
- XML_L("not well-formed (invalid token)"),
- XML_L("unclosed token"),
- XML_L("partial character"),
- XML_L("mismatched tag"),
- XML_L("duplicate attribute"),
- XML_L("junk after document element"),
- XML_L("illegal parameter entity reference"),
- XML_L("undefined entity"),
- XML_L("recursive entity reference"),
- XML_L("asynchronous entity"),
- XML_L("reference to invalid character number"),
- XML_L("reference to binary entity"),
- XML_L("reference to external entity in attribute"),
- XML_L("XML or text declaration not at start of entity"),
- XML_L("unknown encoding"),
- XML_L("encoding specified in XML declaration is incorrect"),
- XML_L("unclosed CDATA section"),
- XML_L("error in processing external entity reference"),
- XML_L("document is not standalone"),
- XML_L("unexpected parser state - please send a bug report"),
- XML_L("entity declared in parameter entity"),
- XML_L("requested feature requires XML_DTD support in Expat"),
- XML_L("cannot change setting once parsing has begun"),
- XML_L("unbound prefix"),
- XML_L("must not undeclare prefix"),
- XML_L("incomplete markup in parameter entity"),
- XML_L("XML declaration not well-formed"),
- XML_L("text declaration not well-formed"),
- XML_L("illegal character(s) in public id"),
- XML_L("parser suspended"),
- XML_L("parser not suspended"),
- XML_L("parsing aborted"),
- XML_L("parsing finished"),
- XML_L("cannot suspend in external parameter entity"),
- XML_L("reserved prefix (xml) must not be undeclared or bound to another namespace name"),
- XML_L("reserved prefix (xmlns) must not be declared or undeclared"),
- XML_L("prefix must not be bound to one of the reserved namespace names")
- };
- if (code > 0 && code < sizeof(message)/sizeof(message[0]))
- return message[code];
+ switch (code) {
+ case XML_ERROR_NONE:
+ return NULL;
+ case XML_ERROR_NO_MEMORY:
+ return XML_L("out of memory");
+ case XML_ERROR_SYNTAX:
+ return XML_L("syntax error");
+ case XML_ERROR_NO_ELEMENTS:
+ return XML_L("no element found");
+ case XML_ERROR_INVALID_TOKEN:
+ return XML_L("not well-formed (invalid token)");
+ case XML_ERROR_UNCLOSED_TOKEN:
+ return XML_L("unclosed token");
+ case XML_ERROR_PARTIAL_CHAR:
+ return XML_L("partial character");
+ case XML_ERROR_TAG_MISMATCH:
+ return XML_L("mismatched tag");
+ case XML_ERROR_DUPLICATE_ATTRIBUTE:
+ return XML_L("duplicate attribute");
+ case XML_ERROR_JUNK_AFTER_DOC_ELEMENT:
+ return XML_L("junk after document element");
+ case XML_ERROR_PARAM_ENTITY_REF:
+ return XML_L("illegal parameter entity reference");
+ case XML_ERROR_UNDEFINED_ENTITY:
+ return XML_L("undefined entity");
+ case XML_ERROR_RECURSIVE_ENTITY_REF:
+ return XML_L("recursive entity reference");
+ case XML_ERROR_ASYNC_ENTITY:
+ return XML_L("asynchronous entity");
+ case XML_ERROR_BAD_CHAR_REF:
+ return XML_L("reference to invalid character number");
+ case XML_ERROR_BINARY_ENTITY_REF:
+ return XML_L("reference to binary entity");
+ case XML_ERROR_ATTRIBUTE_EXTERNAL_ENTITY_REF:
+ return XML_L("reference to external entity in attribute");
+ case XML_ERROR_MISPLACED_XML_PI:
+ return XML_L("XML or text declaration not at start of entity");
+ case XML_ERROR_UNKNOWN_ENCODING:
+ return XML_L("unknown encoding");
+ case XML_ERROR_INCORRECT_ENCODING:
+ return XML_L("encoding specified in XML declaration is incorrect");
+ case XML_ERROR_UNCLOSED_CDATA_SECTION:
+ return XML_L("unclosed CDATA section");
+ case XML_ERROR_EXTERNAL_ENTITY_HANDLING:
+ return XML_L("error in processing external entity reference");
+ case XML_ERROR_NOT_STANDALONE:
+ return XML_L("document is not standalone");
+ case XML_ERROR_UNEXPECTED_STATE:
+ return XML_L("unexpected parser state - please send a bug report");
+ case XML_ERROR_ENTITY_DECLARED_IN_PE:
+ return XML_L("entity declared in parameter entity");
+ case XML_ERROR_FEATURE_REQUIRES_XML_DTD:
+ return XML_L("requested feature requires XML_DTD support in Expat");
+ case XML_ERROR_CANT_CHANGE_FEATURE_ONCE_PARSING:
+ return XML_L("cannot change setting once parsing has begun");
+ /* Added in 1.95.7. */
+ case XML_ERROR_UNBOUND_PREFIX:
+ return XML_L("unbound prefix");
+ /* Added in 1.95.8. */
+ case XML_ERROR_UNDECLARING_PREFIX:
+ return XML_L("must not undeclare prefix");
+ case XML_ERROR_INCOMPLETE_PE:
+ return XML_L("incomplete markup in parameter entity");
+ case XML_ERROR_XML_DECL:
+ return XML_L("XML declaration not well-formed");
+ case XML_ERROR_TEXT_DECL:
+ return XML_L("text declaration not well-formed");
+ case XML_ERROR_PUBLICID:
+ return XML_L("illegal character(s) in public id");
+ case XML_ERROR_SUSPENDED:
+ return XML_L("parser suspended");
+ case XML_ERROR_NOT_SUSPENDED:
+ return XML_L("parser not suspended");
+ case XML_ERROR_ABORTED:
+ return XML_L("parsing aborted");
+ case XML_ERROR_FINISHED:
+ return XML_L("parsing finished");
+ case XML_ERROR_SUSPEND_PE:
+ return XML_L("cannot suspend in external parameter entity");
+ /* Added in 2.0.0. */
+ case XML_ERROR_RESERVED_PREFIX_XML:
+ return XML_L("reserved prefix (xml) must not be undeclared or bound to another namespace name");
+ case XML_ERROR_RESERVED_PREFIX_XMLNS:
+ return XML_L("reserved prefix (xmlns) must not be declared or undeclared");
+ case XML_ERROR_RESERVED_NAMESPACE_URI:
+ return XML_L("prefix must not be bound to one of the reserved namespace names");
+ /* Added in 2.2.5. */
+ case XML_ERROR_INVALID_ARGUMENT: /* Constant added in 2.2.1, already */
+ return XML_L("invalid argument");
+ }
return NULL;
}
@@ -2367,12 +2492,12 @@ XML_GetFeatureList(void)
static XML_Bool
storeRawNames(XML_Parser parser)
{
- TAG *tag = tagStack;
+ TAG *tag = parser->m_tagStack;
while (tag) {
int bufSize;
int nameLen = sizeof(XML_Char) * (tag->name.strLen + 1);
char *rawNameBuf = tag->buf + nameLen;
- /* Stop if already stored. Since tagStack is a stack, we can stop
+ /* Stop if already stored. Since m_tagStack is a stack, we can stop
at the first entry that has already been copied; everything
below it in the stack is already been accounted for in a
previous call to this function.
@@ -2384,7 +2509,7 @@ storeRawNames(XML_Parser parser)
*/
bufSize = nameLen + ROUND_UP(tag->rawNameLength, sizeof(XML_Char));
if (bufSize > tag->bufEnd - tag->buf) {
- char *temp = (char *)REALLOC(tag->buf, bufSize);
+ char *temp = (char *)REALLOC(parser, tag->buf, bufSize);
if (temp == NULL)
return XML_FALSE;
/* if tag->name.str points to tag->buf (only when namespace
@@ -2415,8 +2540,8 @@ contentProcessor(XML_Parser parser,
const char *end,
const char **endPtr)
{
- enum XML_Error result = doContent(parser, 0, encoding, start, end,
- endPtr, (XML_Bool)!ps_finalBuffer);
+ enum XML_Error result = doContent(parser, 0, parser->m_encoding, start, end,
+ endPtr, (XML_Bool)!parser->m_parsingStatus.finalBuffer);
if (result == XML_ERROR_NONE) {
if (!storeRawNames(parser))
return XML_ERROR_NO_MEMORY;
@@ -2433,7 +2558,7 @@ externalEntityInitProcessor(XML_Parser parser,
enum XML_Error result = initializeEncoding(parser);
if (result != XML_ERROR_NONE)
return result;
- processor = externalEntityInitProcessor2;
+ parser->m_processor = externalEntityInitProcessor2;
return externalEntityInitProcessor2(parser, start, end, endPtr);
}
@@ -2444,7 +2569,7 @@ externalEntityInitProcessor2(XML_Parser parser,
const char **endPtr)
{
const char *next = start; /* XmlContentTok doesn't always set the last arg */
- int tok = XmlContentTok(encoding, start, end, &next);
+ int tok = XmlContentTok(parser->m_encoding, start, end, &next);
switch (tok) {
case XML_TOK_BOM:
/* If we are at the end of the buffer, this would cause the next stage,
@@ -2452,28 +2577,28 @@ externalEntityInitProcessor2(XML_Parser parser,
doContent (by detecting XML_TOK_NONE) without processing any xml text
declaration - causing the error XML_ERROR_MISPLACED_XML_PI in doContent.
*/
- if (next == end && !ps_finalBuffer) {
+ if (next == end && !parser->m_parsingStatus.finalBuffer) {
*endPtr = next;
return XML_ERROR_NONE;
}
start = next;
break;
case XML_TOK_PARTIAL:
- if (!ps_finalBuffer) {
+ if (!parser->m_parsingStatus.finalBuffer) {
*endPtr = start;
return XML_ERROR_NONE;
}
- eventPtr = start;
+ parser->m_eventPtr = start;
return XML_ERROR_UNCLOSED_TOKEN;
case XML_TOK_PARTIAL_CHAR:
- if (!ps_finalBuffer) {
+ if (!parser->m_parsingStatus.finalBuffer) {
*endPtr = start;
return XML_ERROR_NONE;
}
- eventPtr = start;
+ parser->m_eventPtr = start;
return XML_ERROR_PARTIAL_CHAR;
}
- processor = externalEntityInitProcessor3;
+ parser->m_processor = externalEntityInitProcessor3;
return externalEntityInitProcessor3(parser, start, end, endPtr);
}
@@ -2485,9 +2610,9 @@ externalEntityInitProcessor3(XML_Parser parser,
{
int tok;
const char *next = start; /* XmlContentTok doesn't always set the last arg */
- eventPtr = start;
- tok = XmlContentTok(encoding, start, end, &next);
- eventEndPtr = next;
+ parser->m_eventPtr = start;
+ tok = XmlContentTok(parser->m_encoding, start, end, &next);
+ parser->m_eventEndPtr = next;
switch (tok) {
case XML_TOK_XML_DECL:
@@ -2496,7 +2621,7 @@ externalEntityInitProcessor3(XML_Parser parser,
result = processXmlDecl(parser, 1, start, next);
if (result != XML_ERROR_NONE)
return result;
- switch (ps_parsing) {
+ switch (parser->m_parsingStatus.parsing) {
case XML_SUSPENDED:
*endPtr = next;
return XML_ERROR_NONE;
@@ -2508,20 +2633,20 @@ externalEntityInitProcessor3(XML_Parser parser,
}
break;
case XML_TOK_PARTIAL:
- if (!ps_finalBuffer) {
+ if (!parser->m_parsingStatus.finalBuffer) {
*endPtr = start;
return XML_ERROR_NONE;
}
return XML_ERROR_UNCLOSED_TOKEN;
case XML_TOK_PARTIAL_CHAR:
- if (!ps_finalBuffer) {
+ if (!parser->m_parsingStatus.finalBuffer) {
*endPtr = start;
return XML_ERROR_NONE;
}
return XML_ERROR_PARTIAL_CHAR;
}
- processor = externalEntityContentProcessor;
- tagLevel = 1;
+ parser->m_processor = externalEntityContentProcessor;
+ parser->m_tagLevel = 1;
return externalEntityContentProcessor(parser, start, end, endPtr);
}
@@ -2531,8 +2656,8 @@ externalEntityContentProcessor(XML_Parser parser,
const char *end,
const char **endPtr)
{
- enum XML_Error result = doContent(parser, 1, encoding, start, end,
- endPtr, (XML_Bool)!ps_finalBuffer);
+ enum XML_Error result = doContent(parser, 1, parser->m_encoding, start, end,
+ endPtr, (XML_Bool)!parser->m_parsingStatus.finalBuffer);
if (result == XML_ERROR_NONE) {
if (!storeRawNames(parser))
return XML_ERROR_NO_MEMORY;
@@ -2550,17 +2675,17 @@ doContent(XML_Parser parser,
XML_Bool haveMore)
{
/* save one level of indirection */
- DTD * const dtd = _dtd;
+ DTD * const dtd = parser->m_dtd;
const char **eventPP;
const char **eventEndPP;
- if (enc == encoding) {
- eventPP = &eventPtr;
- eventEndPP = &eventEndPtr;
+ if (enc == parser->m_encoding) {
+ eventPP = &parser->m_eventPtr;
+ eventEndPP = &parser->m_eventEndPtr;
}
else {
- eventPP = &(openInternalEntities->internalEventPtr);
- eventEndPP = &(openInternalEntities->internalEventEndPtr);
+ eventPP = &(parser->m_openInternalEntities->internalEventPtr);
+ eventEndPP = &(parser->m_openInternalEntities->internalEventEndPtr);
}
*eventPP = s;
@@ -2575,18 +2700,18 @@ doContent(XML_Parser parser,
return XML_ERROR_NONE;
}
*eventEndPP = end;
- if (characterDataHandler) {
+ if (parser->m_characterDataHandler) {
XML_Char c = 0xA;
- characterDataHandler(handlerArg, &c, 1);
+ parser->m_characterDataHandler(parser->m_handlerArg, &c, 1);
}
- else if (defaultHandler)
+ else if (parser->m_defaultHandler)
reportDefault(parser, enc, s, end);
/* We are at the end of the final buffer, should we check for
XML_SUSPENDED, XML_FINISHED?
*/
if (startTagLevel == 0)
return XML_ERROR_NO_ELEMENTS;
- if (tagLevel != startTagLevel)
+ if (parser->m_tagLevel != startTagLevel)
return XML_ERROR_ASYNC_ENTITY;
*nextPtr = end;
return XML_ERROR_NONE;
@@ -2596,7 +2721,7 @@ doContent(XML_Parser parser,
return XML_ERROR_NONE;
}
if (startTagLevel > 0) {
- if (tagLevel != startTagLevel)
+ if (parser->m_tagLevel != startTagLevel)
return XML_ERROR_ASYNC_ENTITY;
*nextPtr = s;
return XML_ERROR_NONE;
@@ -2625,9 +2750,9 @@ doContent(XML_Parser parser,
s + enc->minBytesPerChar,
next - enc->minBytesPerChar);
if (ch) {
- if (characterDataHandler)
- characterDataHandler(handlerArg, &ch, 1);
- else if (defaultHandler)
+ if (parser->m_characterDataHandler)
+ parser->m_characterDataHandler(parser->m_handlerArg, &ch, 1);
+ else if (parser->m_defaultHandler)
reportDefault(parser, enc, s, next);
break;
}
@@ -2649,9 +2774,9 @@ doContent(XML_Parser parser,
return XML_ERROR_ENTITY_DECLARED_IN_PE;
}
else if (!entity) {
- if (skippedEntityHandler)
- skippedEntityHandler(handlerArg, name, 0);
- else if (defaultHandler)
+ if (parser->m_skippedEntityHandler)
+ parser->m_skippedEntityHandler(parser->m_handlerArg, name, 0);
+ else if (parser->m_defaultHandler)
reportDefault(parser, enc, s, next);
break;
}
@@ -2661,10 +2786,10 @@ doContent(XML_Parser parser,
return XML_ERROR_BINARY_ENTITY_REF;
if (entity->textPtr) {
enum XML_Error result;
- if (!defaultExpandInternalEntities) {
- if (skippedEntityHandler)
- skippedEntityHandler(handlerArg, entity->name, 0);
- else if (defaultHandler)
+ if (!parser->m_defaultExpandInternalEntities) {
+ if (parser->m_skippedEntityHandler)
+ parser->m_skippedEntityHandler(parser->m_handlerArg, entity->name, 0);
+ else if (parser->m_defaultHandler)
reportDefault(parser, enc, s, next);
break;
}
@@ -2672,22 +2797,22 @@ doContent(XML_Parser parser,
if (result != XML_ERROR_NONE)
return result;
}
- else if (externalEntityRefHandler) {
+ else if (parser->m_externalEntityRefHandler) {
const XML_Char *context;
entity->open = XML_TRUE;
context = getContext(parser);
entity->open = XML_FALSE;
if (!context)
return XML_ERROR_NO_MEMORY;
- if (!externalEntityRefHandler(externalEntityRefHandlerArg,
+ if (!parser->m_externalEntityRefHandler(parser->m_externalEntityRefHandlerArg,
context,
entity->base,
entity->systemId,
entity->publicId))
return XML_ERROR_EXTERNAL_ENTITY_HANDLING;
- poolDiscard(&tempPool);
+ poolDiscard(&parser->m_tempPool);
}
- else if (defaultHandler)
+ else if (parser->m_defaultHandler)
reportDefault(parser, enc, s, next);
break;
}
@@ -2698,29 +2823,29 @@ doContent(XML_Parser parser,
TAG *tag;
enum XML_Error result;
XML_Char *toPtr;
- if (freeTagList) {
- tag = freeTagList;
- freeTagList = freeTagList->parent;
+ if (parser->m_freeTagList) {
+ tag = parser->m_freeTagList;
+ parser->m_freeTagList = parser->m_freeTagList->parent;
}
else {
- tag = (TAG *)MALLOC(sizeof(TAG));
+ tag = (TAG *)MALLOC(parser, sizeof(TAG));
if (!tag)
return XML_ERROR_NO_MEMORY;
- tag->buf = (char *)MALLOC(INIT_TAG_BUF_SIZE);
+ tag->buf = (char *)MALLOC(parser, INIT_TAG_BUF_SIZE);
if (!tag->buf) {
- FREE(tag);
+ FREE(parser, tag);
return XML_ERROR_NO_MEMORY;
}
tag->bufEnd = tag->buf + INIT_TAG_BUF_SIZE;
}
tag->bindings = NULL;
- tag->parent = tagStack;
- tagStack = tag;
+ tag->parent = parser->m_tagStack;
+ parser->m_tagStack = tag;
tag->name.localPart = NULL;
tag->name.prefix = NULL;
tag->rawName = s + enc->minBytesPerChar;
tag->rawNameLength = XmlNameLength(enc, tag->rawName);
- ++tagLevel;
+ ++parser->m_tagLevel;
{
const char *rawNameEnd = tag->rawName + tag->rawNameLength;
const char *fromPtr = tag->rawName;
@@ -2738,7 +2863,7 @@ doContent(XML_Parser parser,
}
bufSize = (int)(tag->bufEnd - tag->buf) << 1;
{
- char *temp = (char *)REALLOC(tag->buf, bufSize);
+ char *temp = (char *)REALLOC(parser, tag->buf, bufSize);
if (temp == NULL)
return XML_ERROR_NO_MEMORY;
tag->buf = temp;
@@ -2752,12 +2877,12 @@ doContent(XML_Parser parser,
result = storeAtts(parser, enc, s, &(tag->name), &(tag->bindings));
if (result)
return result;
- if (startElementHandler)
- startElementHandler(handlerArg, tag->name.str,
- (const XML_Char **)atts);
- else if (defaultHandler)
+ if (parser->m_startElementHandler)
+ parser->m_startElementHandler(parser->m_handlerArg, tag->name.str,
+ (const XML_Char **)parser->m_atts);
+ else if (parser->m_defaultHandler)
reportDefault(parser, enc, s, next);
- poolClear(&tempPool);
+ poolClear(&parser->m_tempPool);
break;
}
case XML_TOK_EMPTY_ELEMENT_NO_ATTS:
@@ -2769,45 +2894,49 @@ doContent(XML_Parser parser,
BINDING *bindings = NULL;
XML_Bool noElmHandlers = XML_TRUE;
TAG_NAME name;
- name.str = poolStoreString(&tempPool, enc, rawName,
+ name.str = poolStoreString(&parser->m_tempPool, enc, rawName,
rawName + XmlNameLength(enc, rawName));
if (!name.str)
return XML_ERROR_NO_MEMORY;
- poolFinish(&tempPool);
+ poolFinish(&parser->m_tempPool);
result = storeAtts(parser, enc, s, &name, &bindings);
if (result != XML_ERROR_NONE) {
freeBindings(parser, bindings);
return result;
}
- poolFinish(&tempPool);
- if (startElementHandler) {
- startElementHandler(handlerArg, name.str, (const XML_Char **)atts);
+ poolFinish(&parser->m_tempPool);
+ if (parser->m_startElementHandler) {
+ parser->m_startElementHandler(parser->m_handlerArg, name.str, (const XML_Char **)parser->m_atts);
noElmHandlers = XML_FALSE;
}
- if (endElementHandler) {
- if (startElementHandler)
+ if (parser->m_endElementHandler) {
+ if (parser->m_startElementHandler)
*eventPP = *eventEndPP;
- endElementHandler(handlerArg, name.str);
+ parser->m_endElementHandler(parser->m_handlerArg, name.str);
noElmHandlers = XML_FALSE;
}
- if (noElmHandlers && defaultHandler)
+ if (noElmHandlers && parser->m_defaultHandler)
reportDefault(parser, enc, s, next);
- poolClear(&tempPool);
+ poolClear(&parser->m_tempPool);
freeBindings(parser, bindings);
}
- if (tagLevel == 0)
- return epilogProcessor(parser, next, end, nextPtr);
+ if ((parser->m_tagLevel == 0) && (parser->m_parsingStatus.parsing != XML_FINISHED)) {
+ if (parser->m_parsingStatus.parsing == XML_SUSPENDED)
+ parser->m_processor = epilogProcessor;
+ else
+ return epilogProcessor(parser, next, end, nextPtr);
+ }
break;
case XML_TOK_END_TAG:
- if (tagLevel == startTagLevel)
+ if (parser->m_tagLevel == startTagLevel)
return XML_ERROR_ASYNC_ENTITY;
else {
int len;
const char *rawName;
- TAG *tag = tagStack;
- tagStack = tag->parent;
- tag->parent = freeTagList;
- freeTagList = tag;
+ TAG *tag = parser->m_tagStack;
+ parser->m_tagStack = tag->parent;
+ tag->parent = parser->m_freeTagList;
+ parser->m_freeTagList = tag;
rawName = s + enc->minBytesPerChar*2;
len = XmlNameLength(enc, rawName);
if (len != tag->rawNameLength
@@ -2815,13 +2944,13 @@ doContent(XML_Parser parser,
*eventPP = rawName;
return XML_ERROR_TAG_MISMATCH;
}
- --tagLevel;
- if (endElementHandler) {
+ --parser->m_tagLevel;
+ if (parser->m_endElementHandler) {
const XML_Char *localPart;
const XML_Char *prefix;
XML_Char *uri;
localPart = tag->name.localPart;
- if (ns && localPart) {
+ if (parser->m_ns && localPart) {
/* localPart and prefix may have been overwritten in
tag->name.str, since this points to the binding->uri
buffer which gets re-used; so we have to add them again
@@ -2830,26 +2959,26 @@ doContent(XML_Parser parser,
/* don't need to check for space - already done in storeAtts() */
while (*localPart) *uri++ = *localPart++;
prefix = (XML_Char *)tag->name.prefix;
- if (ns_triplets && prefix) {
- *uri++ = namespaceSeparator;
+ if (parser->m_ns_triplets && prefix) {
+ *uri++ = parser->m_namespaceSeparator;
while (*prefix) *uri++ = *prefix++;
}
*uri = XML_T('\0');
}
- endElementHandler(handlerArg, tag->name.str);
+ parser->m_endElementHandler(parser->m_handlerArg, tag->name.str);
}
- else if (defaultHandler)
+ else if (parser->m_defaultHandler)
reportDefault(parser, enc, s, next);
while (tag->bindings) {
BINDING *b = tag->bindings;
- if (endNamespaceDeclHandler)
- endNamespaceDeclHandler(handlerArg, b->prefix->name);
+ if (parser->m_endNamespaceDeclHandler)
+ parser->m_endNamespaceDeclHandler(parser->m_handlerArg, b->prefix->name);
tag->bindings = tag->bindings->nextTagBinding;
- b->nextTagBinding = freeBindingList;
- freeBindingList = b;
+ b->nextTagBinding = parser->m_freeBindingList;
+ parser->m_freeBindingList = b;
b->prefix->binding = b->prevPrefixBinding;
}
- if (tagLevel == 0)
+ if (parser->m_tagLevel == 0)
return epilogProcessor(parser, next, end, nextPtr);
}
break;
@@ -2858,30 +2987,30 @@ doContent(XML_Parser parser,
int n = XmlCharRefNumber(enc, s);
if (n < 0)
return XML_ERROR_BAD_CHAR_REF;
- if (characterDataHandler) {
+ if (parser->m_characterDataHandler) {
XML_Char buf[XML_ENCODE_MAX];
- characterDataHandler(handlerArg, buf, XmlEncode(n, (ICHAR *)buf));
+ parser->m_characterDataHandler(parser->m_handlerArg, buf, XmlEncode(n, (ICHAR *)buf));
}
- else if (defaultHandler)
+ else if (parser->m_defaultHandler)
reportDefault(parser, enc, s, next);
}
break;
case XML_TOK_XML_DECL:
return XML_ERROR_MISPLACED_XML_PI;
case XML_TOK_DATA_NEWLINE:
- if (characterDataHandler) {
+ if (parser->m_characterDataHandler) {
XML_Char c = 0xA;
- characterDataHandler(handlerArg, &c, 1);
+ parser->m_characterDataHandler(parser->m_handlerArg, &c, 1);
}
- else if (defaultHandler)
+ else if (parser->m_defaultHandler)
reportDefault(parser, enc, s, next);
break;
case XML_TOK_CDATA_SECT_OPEN:
{
enum XML_Error result;
- if (startCdataSectionHandler)
- startCdataSectionHandler(handlerArg);
-#if 0
+ if (parser->m_startCdataSectionHandler)
+ parser->m_startCdataSectionHandler(parser->m_handlerArg);
+/* BEGIN disabled code */
/* Suppose you doing a transformation on a document that involves
changing only the character data. You set up a defaultHandler
and a characterDataHandler. The defaultHandler simply copies
@@ -2894,16 +3023,16 @@ doContent(XML_Parser parser,
However, now we have a start/endCdataSectionHandler, so it seems
easier to let the user deal with this.
*/
- else if (characterDataHandler)
- characterDataHandler(handlerArg, dataBuf, 0);
-#endif
- else if (defaultHandler)
+ else if (0 && parser->m_characterDataHandler)
+ parser->m_characterDataHandler(parser->m_handlerArg, parser->m_dataBuf, 0);
+/* END disabled code */
+ else if (parser->m_defaultHandler)
reportDefault(parser, enc, s, next);
result = doCdataSection(parser, enc, &next, end, nextPtr, haveMore);
if (result != XML_ERROR_NONE)
return result;
else if (!next) {
- processor = cdataSectionProcessor;
+ parser->m_processor = cdataSectionProcessor;
return result;
}
}
@@ -2913,19 +3042,19 @@ doContent(XML_Parser parser,
*nextPtr = s;
return XML_ERROR_NONE;
}
- if (characterDataHandler) {
+ if (parser->m_characterDataHandler) {
if (MUST_CONVERT(enc, s)) {
- ICHAR *dataPtr = (ICHAR *)dataBuf;
- XmlConvert(enc, &s, end, &dataPtr, (ICHAR *)dataBufEnd);
- characterDataHandler(handlerArg, dataBuf,
- (int)(dataPtr - (ICHAR *)dataBuf));
+ ICHAR *dataPtr = (ICHAR *)parser->m_dataBuf;
+ XmlConvert(enc, &s, end, &dataPtr, (ICHAR *)parser->m_dataBufEnd);
+ parser->m_characterDataHandler(parser->m_handlerArg, parser->m_dataBuf,
+ (int)(dataPtr - (ICHAR *)parser->m_dataBuf));
}
else
- characterDataHandler(handlerArg,
+ parser->m_characterDataHandler(parser->m_handlerArg,
(XML_Char *)s,
(int)((XML_Char *)end - (XML_Char *)s));
}
- else if (defaultHandler)
+ else if (parser->m_defaultHandler)
reportDefault(parser, enc, s, end);
/* We are at the end of the final buffer, should we check for
XML_SUSPENDED, XML_FINISHED?
@@ -2934,7 +3063,7 @@ doContent(XML_Parser parser,
*eventPP = end;
return XML_ERROR_NO_ELEMENTS;
}
- if (tagLevel != startTagLevel) {
+ if (parser->m_tagLevel != startTagLevel) {
*eventPP = end;
return XML_ERROR_ASYNC_ENTITY;
}
@@ -2942,26 +3071,26 @@ doContent(XML_Parser parser,
return XML_ERROR_NONE;
case XML_TOK_DATA_CHARS:
{
- XML_CharacterDataHandler charDataHandler = characterDataHandler;
+ XML_CharacterDataHandler charDataHandler = parser->m_characterDataHandler;
if (charDataHandler) {
if (MUST_CONVERT(enc, s)) {
for (;;) {
- ICHAR *dataPtr = (ICHAR *)dataBuf;
- const enum XML_Convert_Result convert_res = XmlConvert(enc, &s, next, &dataPtr, (ICHAR *)dataBufEnd);
+ ICHAR *dataPtr = (ICHAR *)parser->m_dataBuf;
+ const enum XML_Convert_Result convert_res = XmlConvert(enc, &s, next, &dataPtr, (ICHAR *)parser->m_dataBufEnd);
*eventEndPP = s;
- charDataHandler(handlerArg, dataBuf,
- (int)(dataPtr - (ICHAR *)dataBuf));
+ charDataHandler(parser->m_handlerArg, parser->m_dataBuf,
+ (int)(dataPtr - (ICHAR *)parser->m_dataBuf));
if ((convert_res == XML_CONVERT_COMPLETED) || (convert_res == XML_CONVERT_INPUT_INCOMPLETE))
break;
*eventPP = s;
}
}
else
- charDataHandler(handlerArg,
+ charDataHandler(parser->m_handlerArg,
(XML_Char *)s,
(int)((XML_Char *)next - (XML_Char *)s));
}
- else if (defaultHandler)
+ else if (parser->m_defaultHandler)
reportDefault(parser, enc, s, next);
}
break;
@@ -2974,12 +3103,20 @@ doContent(XML_Parser parser,
return XML_ERROR_NO_MEMORY;
break;
default:
- if (defaultHandler)
+ /* All of the tokens produced by XmlContentTok() have their own
+ * explicit cases, so this default is not strictly necessary.
+ * However it is a useful safety net, so we retain the code and
+ * simply exclude it from the coverage tests.
+ *
+ * LCOV_EXCL_START
+ */
+ if (parser->m_defaultHandler)
reportDefault(parser, enc, s, next);
break;
+ /* LCOV_EXCL_STOP */
}
*eventPP = s = next;
- switch (ps_parsing) {
+ switch (parser->m_parsingStatus.parsing) {
case XML_SUSPENDED:
*nextPtr = next;
return XML_ERROR_NONE;
@@ -2992,7 +3129,7 @@ doContent(XML_Parser parser,
}
/* This function does not call free() on the allocated memory, merely
- * moving it to the parser's freeBindingList where it can be freed or
+ * moving it to the parser's m_freeBindingList where it can be freed or
* reused as appropriate.
*/
static void
@@ -3001,15 +3138,15 @@ freeBindings(XML_Parser parser, BINDING *bindings)
while (bindings) {
BINDING *b = bindings;
- /* startNamespaceDeclHandler will have been called for this
+ /* m_startNamespaceDeclHandler will have been called for this
* binding in addBindings(), so call the end handler now.
*/
- if (endNamespaceDeclHandler)
- endNamespaceDeclHandler(handlerArg, b->prefix->name);
+ if (parser->m_endNamespaceDeclHandler)
+ parser->m_endNamespaceDeclHandler(parser->m_handlerArg, b->prefix->name);
bindings = bindings->nextTagBinding;
- b->nextTagBinding = freeBindingList;
- freeBindingList = b;
+ b->nextTagBinding = parser->m_freeBindingList;
+ parser->m_freeBindingList = b;
b->prefix->binding = b->prevPrefixBinding;
}
}
@@ -3029,7 +3166,7 @@ storeAtts(XML_Parser parser, const ENCODING *enc,
const char *attStr, TAG_NAME *tagNamePtr,
BINDING **bindingsPtr)
{
- DTD * const dtd = _dtd; /* save one level of indirection */
+ DTD * const dtd = parser->m_dtd; /* save one level of indirection */
ELEMENT_TYPE *elementType;
int nDefaultAtts;
const XML_Char **appAtts; /* the attribute list for the application */
@@ -3052,39 +3189,43 @@ storeAtts(XML_Parser parser, const ENCODING *enc,
sizeof(ELEMENT_TYPE));
if (!elementType)
return XML_ERROR_NO_MEMORY;
- if (ns && !setElementTypePrefix(parser, elementType))
+ if (parser->m_ns && !setElementTypePrefix(parser, elementType))
return XML_ERROR_NO_MEMORY;
}
nDefaultAtts = elementType->nDefaultAtts;
/* get the attributes from the tokenizer */
- n = XmlGetAttributes(enc, attStr, attsSize, atts);
- if (n + nDefaultAtts > attsSize) {
- int oldAttsSize = attsSize;
+ n = XmlGetAttributes(enc, attStr, parser->m_attsSize, parser->m_atts);
+ if (n + nDefaultAtts > parser->m_attsSize) {
+ int oldAttsSize = parser->m_attsSize;
ATTRIBUTE *temp;
#ifdef XML_ATTR_INFO
XML_AttrInfo *temp2;
#endif
- attsSize = n + nDefaultAtts + INIT_ATTS_SIZE;
- temp = (ATTRIBUTE *)REALLOC((void *)atts, attsSize * sizeof(ATTRIBUTE));
- if (temp == NULL)
+ parser->m_attsSize = n + nDefaultAtts + INIT_ATTS_SIZE;
+ temp = (ATTRIBUTE *)REALLOC(parser, (void *)parser->m_atts, parser->m_attsSize * sizeof(ATTRIBUTE));
+ if (temp == NULL) {
+ parser->m_attsSize = oldAttsSize;
return XML_ERROR_NO_MEMORY;
- atts = temp;
+ }
+ parser->m_atts = temp;
#ifdef XML_ATTR_INFO
- temp2 = (XML_AttrInfo *)REALLOC((void *)attInfo, attsSize * sizeof(XML_AttrInfo));
- if (temp2 == NULL)
+ temp2 = (XML_AttrInfo *)REALLOC(parser, (void *)parser->m_attInfo, parser->m_attsSize * sizeof(XML_AttrInfo));
+ if (temp2 == NULL) {
+ parser->m_attsSize = oldAttsSize;
return XML_ERROR_NO_MEMORY;
- attInfo = temp2;
+ }
+ parser->m_attInfo = temp2;
#endif
if (n > oldAttsSize)
- XmlGetAttributes(enc, attStr, n, atts);
+ XmlGetAttributes(enc, attStr, n, parser->m_atts);
}
- appAtts = (const XML_Char **)atts;
+ appAtts = (const XML_Char **)parser->m_atts;
for (i = 0; i < n; i++) {
- ATTRIBUTE *currAtt = &atts[i];
+ ATTRIBUTE *currAtt = &parser->m_atts[i];
#ifdef XML_ATTR_INFO
- XML_AttrInfo *currAttInfo = &attInfo[i];
+ XML_AttrInfo *currAttInfo = &parser->m_attInfo[i];
#endif
/* add the name and value to the attribute list */
ATTRIBUTE_ID *attId = getAttributeId(parser, enc, currAtt->name,
@@ -3093,25 +3234,25 @@ storeAtts(XML_Parser parser, const ENCODING *enc,
if (!attId)
return XML_ERROR_NO_MEMORY;
#ifdef XML_ATTR_INFO
- currAttInfo->nameStart = parseEndByteIndex - (parseEndPtr - currAtt->name);
+ currAttInfo->nameStart = parser->m_parseEndByteIndex - (parser->m_parseEndPtr - currAtt->name);
currAttInfo->nameEnd = currAttInfo->nameStart +
XmlNameLength(enc, currAtt->name);
- currAttInfo->valueStart = parseEndByteIndex -
- (parseEndPtr - currAtt->valuePtr);
- currAttInfo->valueEnd = parseEndByteIndex - (parseEndPtr - currAtt->valueEnd);
+ currAttInfo->valueStart = parser->m_parseEndByteIndex -
+ (parser->m_parseEndPtr - currAtt->valuePtr);
+ currAttInfo->valueEnd = parser->m_parseEndByteIndex - (parser->m_parseEndPtr - currAtt->valueEnd);
#endif
/* Detect duplicate attributes by their QNames. This does not work when
namespace processing is turned on and different prefixes for the same
namespace are used. For this case we have a check further down.
*/
if ((attId->name)[-1]) {
- if (enc == encoding)
- eventPtr = atts[i].name;
+ if (enc == parser->m_encoding)
+ parser->m_eventPtr = parser->m_atts[i].name;
return XML_ERROR_DUPLICATE_ATTRIBUTE;
}
(attId->name)[-1] = 1;
appAtts[attIndex++] = attId->name;
- if (!atts[i].normalized) {
+ if (!parser->m_atts[i].normalized) {
enum XML_Error result;
XML_Bool isCdata = XML_TRUE;
@@ -3128,20 +3269,20 @@ storeAtts(XML_Parser parser, const ENCODING *enc,
/* normalize the attribute value */
result = storeAttributeValue(parser, enc, isCdata,
- atts[i].valuePtr, atts[i].valueEnd,
- &tempPool);
+ parser->m_atts[i].valuePtr, parser->m_atts[i].valueEnd,
+ &parser->m_tempPool);
if (result)
return result;
- appAtts[attIndex] = poolStart(&tempPool);
- poolFinish(&tempPool);
+ appAtts[attIndex] = poolStart(&parser->m_tempPool);
+ poolFinish(&parser->m_tempPool);
}
else {
/* the value did not need normalizing */
- appAtts[attIndex] = poolStoreString(&tempPool, enc, atts[i].valuePtr,
- atts[i].valueEnd);
+ appAtts[attIndex] = poolStoreString(&parser->m_tempPool, enc, parser->m_atts[i].valuePtr,
+ parser->m_atts[i].valueEnd);
if (appAtts[attIndex] == 0)
return XML_ERROR_NO_MEMORY;
- poolFinish(&tempPool);
+ poolFinish(&parser->m_tempPool);
}
/* handle prefixed attribute names */
if (attId->prefix) {
@@ -3165,16 +3306,16 @@ storeAtts(XML_Parser parser, const ENCODING *enc,
}
/* set-up for XML_GetSpecifiedAttributeCount and XML_GetIdAttributeIndex */
- nSpecifiedAtts = attIndex;
+ parser->m_nSpecifiedAtts = attIndex;
if (elementType->idAtt && (elementType->idAtt->name)[-1]) {
for (i = 0; i < attIndex; i += 2)
if (appAtts[i] == elementType->idAtt->name) {
- idAttIndex = i;
+ parser->m_idAttIndex = i;
break;
}
}
else
- idAttIndex = -1;
+ parser->m_idAttIndex = -1;
/* do attribute defaulting */
for (i = 0; i < nDefaultAtts; i++) {
@@ -3208,29 +3349,33 @@ storeAtts(XML_Parser parser, const ENCODING *enc,
i = 0;
if (nPrefixes) {
int j; /* hash table index */
- unsigned long version = nsAttsVersion;
- int nsAttsSize = (int)1 << nsAttsPower;
+ unsigned long version = parser->m_nsAttsVersion;
+ int nsAttsSize = (int)1 << parser->m_nsAttsPower;
+ unsigned char oldNsAttsPower = parser->m_nsAttsPower;
/* size of hash table must be at least 2 * (# of prefixed attributes) */
- if ((nPrefixes << 1) >> nsAttsPower) { /* true for nsAttsPower = 0 */
+ if ((nPrefixes << 1) >> parser->m_nsAttsPower) { /* true for m_nsAttsPower = 0 */
NS_ATT *temp;
/* hash table size must also be a power of 2 and >= 8 */
- while (nPrefixes >> nsAttsPower++);
- if (nsAttsPower < 3)
- nsAttsPower = 3;
- nsAttsSize = (int)1 << nsAttsPower;
- temp = (NS_ATT *)REALLOC(nsAtts, nsAttsSize * sizeof(NS_ATT));
- if (!temp)
+ while (nPrefixes >> parser->m_nsAttsPower++);
+ if (parser->m_nsAttsPower < 3)
+ parser->m_nsAttsPower = 3;
+ nsAttsSize = (int)1 << parser->m_nsAttsPower;
+ temp = (NS_ATT *)REALLOC(parser, parser->m_nsAtts, nsAttsSize * sizeof(NS_ATT));
+ if (!temp) {
+ /* Restore actual size of memory in m_nsAtts */
+ parser->m_nsAttsPower = oldNsAttsPower;
return XML_ERROR_NO_MEMORY;
- nsAtts = temp;
- version = 0; /* force re-initialization of nsAtts hash table */
+ }
+ parser->m_nsAtts = temp;
+ version = 0; /* force re-initialization of m_nsAtts hash table */
}
- /* using a version flag saves us from initializing nsAtts every time */
+ /* using a version flag saves us from initializing m_nsAtts every time */
if (!version) { /* initialize version flags when version wraps around */
version = INIT_ATTS_VERSION;
for (j = nsAttsSize; j != 0; )
- nsAtts[--j].version = version;
+ parser->m_nsAtts[--j].version = version;
}
- nsAttsVersion = --version;
+ parser->m_nsAttsVersion = --version;
/* expand prefixed names and check for duplicates */
for (; i < attIndex; i += 2) {
@@ -3247,15 +3392,32 @@ storeAtts(XML_Parser parser, const ENCODING *enc,
((XML_Char *)s)[-1] = 0; /* clear flag */
id = (ATTRIBUTE_ID *)lookup(parser, &dtd->attributeIds, s, 0);
- if (!id || !id->prefix)
- return XML_ERROR_NO_MEMORY;
+ if (!id || !id->prefix) {
+ /* This code is walking through the appAtts array, dealing
+ * with (in this case) a prefixed attribute name. To be in
+ * the array, the attribute must have already been bound, so
+ * has to have passed through the hash table lookup once
+ * already. That implies that an entry for it already
+ * exists, so the lookup above will return a pointer to
+ * already allocated memory. There is no opportunaity for
+ * the allocator to fail, so the condition above cannot be
+ * fulfilled.
+ *
+ * Since it is difficult to be certain that the above
+ * analysis is complete, we retain the test and merely
+ * remove the code from coverage tests.
+ */
+ return XML_ERROR_NO_MEMORY; /* LCOV_EXCL_LINE */
+ }
b = id->prefix->binding;
- if (!b)
- return XML_ERROR_UNBOUND_PREFIX;
+ if (!b) {
+ //return XML_ERROR_UNBOUND_PREFIX;
+ continue;
+ }
for (j = 0; j < b->uriLen; j++) {
const XML_Char c = b->uri[j];
- if (!poolAppendChar(&tempPool, c))
+ if (!poolAppendChar(&parser->m_tempPool, c))
return XML_ERROR_NO_MEMORY;
}
@@ -3267,7 +3429,7 @@ storeAtts(XML_Parser parser, const ENCODING *enc,
sip24_update(&sip_state, s, keylen(s) * sizeof(XML_Char));
do { /* copies null terminator */
- if (!poolAppendChar(&tempPool, *s))
+ if (!poolAppendChar(&parser->m_tempPool, *s))
return XML_ERROR_NO_MEMORY;
} while (*s++);
@@ -3279,40 +3441,40 @@ storeAtts(XML_Parser parser, const ENCODING *enc,
unsigned char step = 0;
unsigned long mask = nsAttsSize - 1;
j = uriHash & mask; /* index into hash table */
- while (nsAtts[j].version == version) {
+ while (parser->m_nsAtts[j].version == version) {
/* for speed we compare stored hash values first */
- if (uriHash == nsAtts[j].hash) {
- const XML_Char *s1 = poolStart(&tempPool);
- const XML_Char *s2 = nsAtts[j].uriName;
+ if (uriHash == parser->m_nsAtts[j].hash) {
+ const XML_Char *s1 = poolStart(&parser->m_tempPool);
+ const XML_Char *s2 = parser->m_nsAtts[j].uriName;
/* s1 is null terminated, but not s2 */
for (; *s1 == *s2 && *s1 != 0; s1++, s2++);
if (*s1 == 0)
return XML_ERROR_DUPLICATE_ATTRIBUTE;
}
if (!step)
- step = PROBE_STEP(uriHash, mask, nsAttsPower);
+ step = PROBE_STEP(uriHash, mask, parser->m_nsAttsPower);
j < step ? (j += nsAttsSize - step) : (j -= step);
}
}
- if (ns_triplets) { /* append namespace separator and prefix */
- tempPool.ptr[-1] = namespaceSeparator;
+ if (parser->m_ns_triplets) { /* append namespace separator and prefix */
+ parser->m_tempPool.ptr[-1] = parser->m_namespaceSeparator;
s = b->prefix->name;
do {
- if (!poolAppendChar(&tempPool, *s))
+ if (!poolAppendChar(&parser->m_tempPool, *s))
return XML_ERROR_NO_MEMORY;
} while (*s++);
}
/* store expanded name in attribute list */
- s = poolStart(&tempPool);
- poolFinish(&tempPool);
+ s = poolStart(&parser->m_tempPool);
+ poolFinish(&parser->m_tempPool);
appAtts[i] = s;
/* fill empty slot with new version, uriName and hash value */
- nsAtts[j].version = version;
- nsAtts[j].hash = uriHash;
- nsAtts[j].uriName = s;
+ parser->m_nsAtts[j].version = version;
+ parser->m_nsAtts[j].hash = uriHash;
+ parser->m_nsAtts[j].uriName = s;
if (!--nPrefixes) {
i += 2;
@@ -3329,11 +3491,11 @@ storeAtts(XML_Parser parser, const ENCODING *enc,
for (binding = *bindingsPtr; binding; binding = binding->nextTagBinding)
binding->attId->name[-1] = 0;
- if (!ns)
+ if (!parser->m_ns)
return XML_ERROR_NONE;
/* expand the element type name */
- if (elementType->prefix) {
+ if (elementType->prefix && elementType->prefix->binding) {
binding = elementType->prefix->binding;
if (!binding)
return XML_ERROR_UNBOUND_PREFIX;
@@ -3348,7 +3510,7 @@ storeAtts(XML_Parser parser, const ENCODING *enc,
else
return XML_ERROR_NONE;
prefixLen = 0;
- if (ns_triplets && binding->prefix->name) {
+ if (parser->m_ns_triplets && binding->prefix->name) {
for (; binding->prefix->name[prefixLen++];)
; /* prefixLen includes null terminator */
}
@@ -3361,24 +3523,24 @@ storeAtts(XML_Parser parser, const ENCODING *enc,
n = i + binding->uriLen + prefixLen;
if (n > binding->uriAlloc) {
TAG *p;
- uri = (XML_Char *)MALLOC((n + EXPAND_SPARE) * sizeof(XML_Char));
+ uri = (XML_Char *)MALLOC(parser, (n + EXPAND_SPARE) * sizeof(XML_Char));
if (!uri)
return XML_ERROR_NO_MEMORY;
binding->uriAlloc = n + EXPAND_SPARE;
memcpy(uri, binding->uri, binding->uriLen * sizeof(XML_Char));
- for (p = tagStack; p; p = p->parent)
+ for (p = parser->m_tagStack; p; p = p->parent)
if (p->name.str == binding->uri)
p->name.str = uri;
- FREE(binding->uri);
+ FREE(parser, binding->uri);
binding->uri = uri;
}
- /* if namespaceSeparator != '\0' then uri includes it already */
+ /* if m_namespaceSeparator != '\0' then uri includes it already */
uri = binding->uri + binding->uriLen;
memcpy(uri, localPart, i * sizeof(XML_Char));
/* we always have a namespace separator between localPart and prefix */
if (prefixLen) {
uri += i - 1;
- *uri = namespaceSeparator; /* replace null terminator */
+ *uri = parser->m_namespaceSeparator; /* replace null terminator */
memcpy(uri + 1, binding->prefix->name, prefixLen * sizeof(XML_Char));
}
tagNamePtr->str = binding->uri;
@@ -3429,10 +3591,10 @@ addBinding(XML_Parser parser, PREFIX *prefix, const ATTRIBUTE_ID *attId,
&& prefix->name[2] == XML_T(ASCII_l)) {
/* Not allowed to bind xmlns */
- if (prefix->name[3] == XML_T(ASCII_n)
+ /*if (prefix->name[3] == XML_T(ASCII_n)
&& prefix->name[4] == XML_T(ASCII_s)
&& prefix->name[5] == XML_T('\0'))
- return XML_ERROR_RESERVED_PREFIX_XMLNS;
+ return XML_ERROR_RESERVED_PREFIX_XMLNS;*/
if (prefix->name[3] == XML_T('\0'))
mustBeXML = XML_TRUE;
@@ -3449,55 +3611,55 @@ addBinding(XML_Parser parser, PREFIX *prefix, const ATTRIBUTE_ID *attId,
isXML = isXML && len == xmlLen;
isXMLNS = isXMLNS && len == xmlnsLen;
- if (mustBeXML != isXML)
+ /*if (mustBeXML != isXML)
return mustBeXML ? XML_ERROR_RESERVED_PREFIX_XML
- : XML_ERROR_RESERVED_NAMESPACE_URI;
+ : XML_ERROR_RESERVED_NAMESPACE_URI;*/
- if (isXMLNS)
- return XML_ERROR_RESERVED_NAMESPACE_URI;
+ /*if (isXMLNS)
+ return XML_ERROR_RESERVED_NAMESPACE_URI;*/
- if (namespaceSeparator)
+ if (parser->m_namespaceSeparator)
len++;
- if (freeBindingList) {
- b = freeBindingList;
+ if (parser->m_freeBindingList) {
+ b = parser->m_freeBindingList;
if (len > b->uriAlloc) {
- XML_Char *temp = (XML_Char *)REALLOC(b->uri,
+ XML_Char *temp = (XML_Char *)REALLOC(parser, b->uri,
sizeof(XML_Char) * (len + EXPAND_SPARE));
if (temp == NULL)
return XML_ERROR_NO_MEMORY;
b->uri = temp;
b->uriAlloc = len + EXPAND_SPARE;
}
- freeBindingList = b->nextTagBinding;
+ parser->m_freeBindingList = b->nextTagBinding;
}
else {
- b = (BINDING *)MALLOC(sizeof(BINDING));
+ b = (BINDING *)MALLOC(parser, sizeof(BINDING));
if (!b)
return XML_ERROR_NO_MEMORY;
- b->uri = (XML_Char *)MALLOC(sizeof(XML_Char) * (len + EXPAND_SPARE));
+ b->uri = (XML_Char *)MALLOC(parser, sizeof(XML_Char) * (len + EXPAND_SPARE));
if (!b->uri) {
- FREE(b);
+ FREE(parser, b);
return XML_ERROR_NO_MEMORY;
}
b->uriAlloc = len + EXPAND_SPARE;
}
b->uriLen = len;
memcpy(b->uri, uri, len * sizeof(XML_Char));
- if (namespaceSeparator)
- b->uri[len - 1] = namespaceSeparator;
+ if (parser->m_namespaceSeparator)
+ b->uri[len - 1] = parser->m_namespaceSeparator;
b->prefix = prefix;
b->attId = attId;
b->prevPrefixBinding = prefix->binding;
/* NULL binding when default namespace undeclared */
- if (*uri == XML_T('\0') && prefix == &_dtd->defaultPrefix)
+ if (*uri == XML_T('\0') && prefix == &parser->m_dtd->defaultPrefix)
prefix->binding = NULL;
else
prefix->binding = b;
b->nextTagBinding = *bindingsPtr;
*bindingsPtr = b;
/* if attId == NULL then we are not starting a namespace scope */
- if (attId && startNamespaceDeclHandler)
- startNamespaceDeclHandler(handlerArg, prefix->name,
+ if (attId && parser->m_startNamespaceDeclHandler)
+ parser->m_startNamespaceDeclHandler(parser->m_handlerArg, prefix->name,
prefix->binding ? uri : 0);
return XML_ERROR_NONE;
}
@@ -3511,17 +3673,17 @@ cdataSectionProcessor(XML_Parser parser,
const char *end,
const char **endPtr)
{
- enum XML_Error result = doCdataSection(parser, encoding, &start, end,
- endPtr, (XML_Bool)!ps_finalBuffer);
+ enum XML_Error result = doCdataSection(parser, parser->m_encoding, &start, end,
+ endPtr, (XML_Bool)!parser->m_parsingStatus.finalBuffer);
if (result != XML_ERROR_NONE)
return result;
if (start) {
- if (parentParser) { /* we are parsing an external entity */
- processor = externalEntityContentProcessor;
+ if (parser->m_parentParser) { /* we are parsing an external entity */
+ parser->m_processor = externalEntityContentProcessor;
return externalEntityContentProcessor(parser, start, end, endPtr);
}
else {
- processor = contentProcessor;
+ parser->m_processor = contentProcessor;
return contentProcessor(parser, start, end, endPtr);
}
}
@@ -3542,14 +3704,14 @@ doCdataSection(XML_Parser parser,
const char *s = *startPtr;
const char **eventPP;
const char **eventEndPP;
- if (enc == encoding) {
- eventPP = &eventPtr;
+ if (enc == parser->m_encoding) {
+ eventPP = &parser->m_eventPtr;
*eventPP = s;
- eventEndPP = &eventEndPtr;
+ eventEndPP = &parser->m_eventEndPtr;
}
else {
- eventPP = &(openInternalEntities->internalEventPtr);
- eventEndPP = &(openInternalEntities->internalEventEndPtr);
+ eventPP = &(parser->m_openInternalEntities->internalEventPtr);
+ eventEndPP = &(parser->m_openInternalEntities->internalEventEndPtr);
}
*eventPP = s;
*startPtr = NULL;
@@ -3560,51 +3722,51 @@ doCdataSection(XML_Parser parser,
*eventEndPP = next;
switch (tok) {
case XML_TOK_CDATA_SECT_CLOSE:
- if (endCdataSectionHandler)
- endCdataSectionHandler(handlerArg);
-#if 0
+ if (parser->m_endCdataSectionHandler)
+ parser->m_endCdataSectionHandler(parser->m_handlerArg);
+/* BEGIN disabled code */
/* see comment under XML_TOK_CDATA_SECT_OPEN */
- else if (characterDataHandler)
- characterDataHandler(handlerArg, dataBuf, 0);
-#endif
- else if (defaultHandler)
+ else if (0 && parser->m_characterDataHandler)
+ parser->m_characterDataHandler(parser->m_handlerArg, parser->m_dataBuf, 0);
+/* END disabled code */
+ else if (parser->m_defaultHandler)
reportDefault(parser, enc, s, next);
*startPtr = next;
*nextPtr = next;
- if (ps_parsing == XML_FINISHED)
+ if (parser->m_parsingStatus.parsing == XML_FINISHED)
return XML_ERROR_ABORTED;
else
return XML_ERROR_NONE;
case XML_TOK_DATA_NEWLINE:
- if (characterDataHandler) {
+ if (parser->m_characterDataHandler) {
XML_Char c = 0xA;
- characterDataHandler(handlerArg, &c, 1);
+ parser->m_characterDataHandler(parser->m_handlerArg, &c, 1);
}
- else if (defaultHandler)
+ else if (parser->m_defaultHandler)
reportDefault(parser, enc, s, next);
break;
case XML_TOK_DATA_CHARS:
{
- XML_CharacterDataHandler charDataHandler = characterDataHandler;
+ XML_CharacterDataHandler charDataHandler = parser->m_characterDataHandler;
if (charDataHandler) {
if (MUST_CONVERT(enc, s)) {
for (;;) {
- ICHAR *dataPtr = (ICHAR *)dataBuf;
- const enum XML_Convert_Result convert_res = XmlConvert(enc, &s, next, &dataPtr, (ICHAR *)dataBufEnd);
+ ICHAR *dataPtr = (ICHAR *)parser->m_dataBuf;
+ const enum XML_Convert_Result convert_res = XmlConvert(enc, &s, next, &dataPtr, (ICHAR *)parser->m_dataBufEnd);
*eventEndPP = next;
- charDataHandler(handlerArg, dataBuf,
- (int)(dataPtr - (ICHAR *)dataBuf));
+ charDataHandler(parser->m_handlerArg, parser->m_dataBuf,
+ (int)(dataPtr - (ICHAR *)parser->m_dataBuf));
if ((convert_res == XML_CONVERT_COMPLETED) || (convert_res == XML_CONVERT_INPUT_INCOMPLETE))
break;
*eventPP = s;
}
}
else
- charDataHandler(handlerArg,
+ charDataHandler(parser->m_handlerArg,
(XML_Char *)s,
(int)((XML_Char *)next - (XML_Char *)s));
}
- else if (defaultHandler)
+ else if (parser->m_defaultHandler)
reportDefault(parser, enc, s, next);
}
break;
@@ -3625,12 +3787,20 @@ doCdataSection(XML_Parser parser,
}
return XML_ERROR_UNCLOSED_CDATA_SECTION;
default:
+ /* Every token returned by XmlCdataSectionTok() has its own
+ * explicit case, so this default case will never be executed.
+ * We retain it as a safety net and exclude it from the coverage
+ * statistics.
+ *
+ * LCOV_EXCL_START
+ */
*eventPP = next;
return XML_ERROR_UNEXPECTED_STATE;
+ /* LCOV_EXCL_STOP */
}
*eventPP = s = next;
- switch (ps_parsing) {
+ switch (parser->m_parsingStatus.parsing) {
case XML_SUSPENDED:
*nextPtr = next;
return XML_ERROR_NONE;
@@ -3653,12 +3823,12 @@ ignoreSectionProcessor(XML_Parser parser,
const char *end,
const char **endPtr)
{
- enum XML_Error result = doIgnoreSection(parser, encoding, &start, end,
- endPtr, (XML_Bool)!ps_finalBuffer);
+ enum XML_Error result = doIgnoreSection(parser, parser->m_encoding, &start, end,
+ endPtr, (XML_Bool)!parser->m_parsingStatus.finalBuffer);
if (result != XML_ERROR_NONE)
return result;
if (start) {
- processor = prologProcessor;
+ parser->m_processor = prologProcessor;
return prologProcessor(parser, start, end, endPtr);
}
return result;
@@ -3680,14 +3850,26 @@ doIgnoreSection(XML_Parser parser,
const char *s = *startPtr;
const char **eventPP;
const char **eventEndPP;
- if (enc == encoding) {
- eventPP = &eventPtr;
+ if (enc == parser->m_encoding) {
+ eventPP = &parser->m_eventPtr;
*eventPP = s;
- eventEndPP = &eventEndPtr;
+ eventEndPP = &parser->m_eventEndPtr;
}
else {
- eventPP = &(openInternalEntities->internalEventPtr);
- eventEndPP = &(openInternalEntities->internalEventEndPtr);
+ /* It's not entirely clear, but it seems the following two lines
+ * of code cannot be executed. The only occasions on which 'enc'
+ * is not 'encoding' are when this function is called
+ * from the internal entity processing, and IGNORE sections are an
+ * error in internal entities.
+ *
+ * Since it really isn't clear that this is true, we keep the code
+ * and just remove it from our coverage tests.
+ *
+ * LCOV_EXCL_START
+ */
+ eventPP = &(parser->m_openInternalEntities->internalEventPtr);
+ eventEndPP = &(parser->m_openInternalEntities->internalEventEndPtr);
+ /* LCOV_EXCL_STOP */
}
*eventPP = s;
*startPtr = NULL;
@@ -3695,11 +3877,11 @@ doIgnoreSection(XML_Parser parser,
*eventEndPP = next;
switch (tok) {
case XML_TOK_IGNORE_SECT:
- if (defaultHandler)
+ if (parser->m_defaultHandler)
reportDefault(parser, enc, s, next);
*startPtr = next;
*nextPtr = next;
- if (ps_parsing == XML_FINISHED)
+ if (parser->m_parsingStatus.parsing == XML_FINISHED)
return XML_ERROR_ABORTED;
else
return XML_ERROR_NONE;
@@ -3720,8 +3902,16 @@ doIgnoreSection(XML_Parser parser,
}
return XML_ERROR_SYNTAX; /* XML_ERROR_UNCLOSED_IGNORE_SECTION */
default:
+ /* All of the tokens that XmlIgnoreSectionTok() returns have
+ * explicit cases to handle them, so this default case is never
+ * executed. We keep it as a safety net anyway, and remove it
+ * from our test coverage statistics.
+ *
+ * LCOV_EXCL_START
+ */
*eventPP = next;
return XML_ERROR_UNEXPECTED_STATE;
+ /* LCOV_EXCL_STOP */
}
/* not reached */
}
@@ -3734,27 +3924,28 @@ initializeEncoding(XML_Parser parser)
const char *s;
#ifdef XML_UNICODE
char encodingBuf[128];
- if (!protocolEncodingName)
+ /* See comments abount `protoclEncodingName` in parserInit() */
+ if (!parser->m_protocolEncodingName)
s = NULL;
else {
int i;
- for (i = 0; protocolEncodingName[i]; i++) {
+ for (i = 0; parser->m_protocolEncodingName[i]; i++) {
if (i == sizeof(encodingBuf) - 1
- || (protocolEncodingName[i] & ~0x7f) != 0) {
+ || (parser->m_protocolEncodingName[i] & ~0x7f) != 0) {
encodingBuf[0] = '\0';
break;
}
- encodingBuf[i] = (char)protocolEncodingName[i];
+ encodingBuf[i] = (char)parser->m_protocolEncodingName[i];
}
encodingBuf[i] = '\0';
s = encodingBuf;
}
#else
- s = protocolEncodingName;
+ s = parser->m_protocolEncodingName;
#endif
- if ((ns ? XmlInitEncodingNS : XmlInitEncoding)(&initEncoding, &encoding, s))
+ if ((parser->m_ns ? XmlInitEncodingNS : XmlInitEncoding)(&parser->m_initEncoding, &parser->m_encoding, s))
return XML_ERROR_NONE;
- return handleUnknownEncoding(parser, protocolEncodingName);
+ return handleUnknownEncoding(parser, parser->m_protocolEncodingName);
}
static enum XML_Error
@@ -3768,13 +3959,13 @@ processXmlDecl(XML_Parser parser, int isGeneralTextEntity,
const char *versionend;
const XML_Char *storedversion = NULL;
int standalone = -1;
- if (!(ns
+ if (!(parser->m_ns
? XmlParseXmlDeclNS
: XmlParseXmlDecl)(isGeneralTextEntity,
- encoding,
+ parser->m_encoding,
s,
next,
- &eventPtr,
+ &parser->m_eventPtr,
&version,
&versionend,
&encodingName,
@@ -3786,62 +3977,69 @@ processXmlDecl(XML_Parser parser, int isGeneralTextEntity,
return XML_ERROR_XML_DECL;
}
if (!isGeneralTextEntity && standalone == 1) {
- _dtd->standalone = XML_TRUE;
+ parser->m_dtd->standalone = XML_TRUE;
#ifdef XML_DTD
- if (paramEntityParsing == XML_PARAM_ENTITY_PARSING_UNLESS_STANDALONE)
- paramEntityParsing = XML_PARAM_ENTITY_PARSING_NEVER;
+ if (parser->m_paramEntityParsing == XML_PARAM_ENTITY_PARSING_UNLESS_STANDALONE)
+ parser->m_paramEntityParsing = XML_PARAM_ENTITY_PARSING_NEVER;
#endif /* XML_DTD */
}
- if (xmlDeclHandler) {
+ if (parser->m_xmlDeclHandler) {
if (encodingName != NULL) {
- storedEncName = poolStoreString(&temp2Pool,
- encoding,
+ storedEncName = poolStoreString(&parser->m_temp2Pool,
+ parser->m_encoding,
encodingName,
encodingName
- + XmlNameLength(encoding, encodingName));
+ + XmlNameLength(parser->m_encoding, encodingName));
if (!storedEncName)
return XML_ERROR_NO_MEMORY;
- poolFinish(&temp2Pool);
+ poolFinish(&parser->m_temp2Pool);
}
if (version) {
- storedversion = poolStoreString(&temp2Pool,
- encoding,
+ storedversion = poolStoreString(&parser->m_temp2Pool,
+ parser->m_encoding,
version,
- versionend - encoding->minBytesPerChar);
+ versionend - parser->m_encoding->minBytesPerChar);
if (!storedversion)
return XML_ERROR_NO_MEMORY;
}
- xmlDeclHandler(handlerArg, storedversion, storedEncName, standalone);
+ parser->m_xmlDeclHandler(parser->m_handlerArg, storedversion, storedEncName, standalone);
}
- else if (defaultHandler)
- reportDefault(parser, encoding, s, next);
- if (protocolEncodingName == NULL) {
+ else if (parser->m_defaultHandler)
+ reportDefault(parser, parser->m_encoding, s, next);
+ if (parser->m_protocolEncodingName == NULL) {
if (newEncoding) {
- if (newEncoding->minBytesPerChar != encoding->minBytesPerChar) {
- eventPtr = encodingName;
+ /* Check that the specified encoding does not conflict with what
+ * the parser has already deduced. Do we have the same number
+ * of bytes in the smallest representation of a character? If
+ * this is UTF-16, is it the same endianness?
+ */
+ if (newEncoding->minBytesPerChar != parser->m_encoding->minBytesPerChar
+ || (newEncoding->minBytesPerChar == 2 &&
+ newEncoding != parser->m_encoding)) {
+ parser->m_eventPtr = encodingName;
return XML_ERROR_INCORRECT_ENCODING;
}
- encoding = newEncoding;
+ parser->m_encoding = newEncoding;
}
else if (encodingName) {
enum XML_Error result;
if (!storedEncName) {
storedEncName = poolStoreString(
- &temp2Pool, encoding, encodingName,
- encodingName + XmlNameLength(encoding, encodingName));
+ &parser->m_temp2Pool, parser->m_encoding, encodingName,
+ encodingName + XmlNameLength(parser->m_encoding, encodingName));
if (!storedEncName)
return XML_ERROR_NO_MEMORY;
}
result = handleUnknownEncoding(parser, storedEncName);
- poolClear(&temp2Pool);
+ poolClear(&parser->m_temp2Pool);
if (result == XML_ERROR_UNKNOWN_ENCODING)
- eventPtr = encodingName;
+ parser->m_eventPtr = encodingName;
return result;
}
}
if (storedEncName || storedversion)
- poolClear(&temp2Pool);
+ poolClear(&parser->m_temp2Pool);
return XML_ERROR_NONE;
}
@@ -3849,7 +4047,7 @@ processXmlDecl(XML_Parser parser, int isGeneralTextEntity,
static enum XML_Error
handleUnknownEncoding(XML_Parser parser, const XML_Char *encodingName)
{
- if (unknownEncodingHandler) {
+ if (parser->m_unknownEncodingHandler) {
XML_Encoding info;
int i;
for (i = 0; i < 256; i++)
@@ -3857,25 +4055,25 @@ handleUnknownEncoding(XML_Parser parser, const XML_Char *encodingName)
info.convert = NULL;
info.data = NULL;
info.release = NULL;
- if (unknownEncodingHandler(unknownEncodingHandlerData, encodingName,
+ if (parser->m_unknownEncodingHandler(parser->m_unknownEncodingHandlerData, encodingName,
&info)) {
ENCODING *enc;
- unknownEncodingMem = MALLOC(XmlSizeOfUnknownEncoding());
- if (!unknownEncodingMem) {
+ parser->m_unknownEncodingMem = MALLOC(parser, XmlSizeOfUnknownEncoding());
+ if (!parser->m_unknownEncodingMem) {
if (info.release)
info.release(info.data);
return XML_ERROR_NO_MEMORY;
}
- enc = (ns
+ enc = (parser->m_ns
? XmlInitUnknownEncodingNS
- : XmlInitUnknownEncoding)(unknownEncodingMem,
+ : XmlInitUnknownEncoding)(parser->m_unknownEncodingMem,
info.map,
info.convert,
info.data);
if (enc) {
- unknownEncodingData = info.data;
- unknownEncodingRelease = info.release;
- encoding = enc;
+ parser->m_unknownEncodingData = info.data;
+ parser->m_unknownEncodingRelease = info.release;
+ parser->m_encoding = enc;
return XML_ERROR_NONE;
}
}
@@ -3894,7 +4092,7 @@ prologInitProcessor(XML_Parser parser,
enum XML_Error result = initializeEncoding(parser);
if (result != XML_ERROR_NONE)
return result;
- processor = prologProcessor;
+ parser->m_processor = prologProcessor;
return prologProcessor(parser, s, end, nextPtr);
}
@@ -3912,14 +4110,14 @@ externalParEntInitProcessor(XML_Parser parser,
/* we know now that XML_Parse(Buffer) has been called,
so we consider the external parameter entity read */
- _dtd->paramEntityRead = XML_TRUE;
+ parser->m_dtd->paramEntityRead = XML_TRUE;
- if (prologState.inEntityValue) {
- processor = entityValueInitProcessor;
+ if (parser->m_prologState.inEntityValue) {
+ parser->m_processor = entityValueInitProcessor;
return entityValueInitProcessor(parser, s, end, nextPtr);
}
else {
- processor = externalParEntProcessor;
+ parser->m_processor = externalParEntProcessor;
return externalParEntProcessor(parser, s, end, nextPtr);
}
}
@@ -3933,13 +4131,13 @@ entityValueInitProcessor(XML_Parser parser,
int tok;
const char *start = s;
const char *next = start;
- eventPtr = start;
+ parser->m_eventPtr = start;
for (;;) {
- tok = XmlPrologTok(encoding, start, end, &next);
- eventEndPtr = next;
+ tok = XmlPrologTok(parser->m_encoding, start, end, &next);
+ parser->m_eventEndPtr = next;
if (tok <= 0) {
- if (!ps_finalBuffer && tok != XML_TOK_INVALID) {
+ if (!parser->m_parsingStatus.finalBuffer && tok != XML_TOK_INVALID) {
*nextPtr = s;
return XML_ERROR_NONE;
}
@@ -3955,24 +4153,23 @@ entityValueInitProcessor(XML_Parser parser,
break;
}
/* found end of entity value - can store it now */
- return storeEntityValue(parser, encoding, s, end);
+ return storeEntityValue(parser, parser->m_encoding, s, end);
}
else if (tok == XML_TOK_XML_DECL) {
enum XML_Error result;
result = processXmlDecl(parser, 0, start, next);
if (result != XML_ERROR_NONE)
return result;
- switch (ps_parsing) {
- case XML_SUSPENDED:
- *nextPtr = next;
- return XML_ERROR_NONE;
- case XML_FINISHED:
+ /* At this point, m_parsingStatus.parsing cannot be XML_SUSPENDED. For that
+ * to happen, a parameter entity parsing handler must have
+ * attempted to suspend the parser, which fails and raises an
+ * error. The parser can be aborted, but can't be suspended.
+ */
+ if (parser->m_parsingStatus.parsing == XML_FINISHED)
return XML_ERROR_ABORTED;
- default:
- *nextPtr = next;
- }
+ *nextPtr = next;
/* stop scanning for text declaration - we found one */
- processor = entityValueProcessor;
+ parser->m_processor = entityValueProcessor;
return entityValueProcessor(parser, next, end, nextPtr);
}
/* If we are at the end of the buffer, this would cause XmlPrologTok to
@@ -3982,7 +4179,7 @@ entityValueInitProcessor(XML_Parser parser,
then, when this routine is entered the next time, XmlPrologTok will
return XML_TOK_INVALID, since the BOM is still in the buffer
*/
- else if (tok == XML_TOK_BOM && next == end && !ps_finalBuffer) {
+ else if (tok == XML_TOK_BOM && next == end && !parser->m_parsingStatus.finalBuffer) {
*nextPtr = next;
return XML_ERROR_NONE;
}
@@ -3995,7 +4192,7 @@ entityValueInitProcessor(XML_Parser parser,
return XML_ERROR_SYNTAX;
}
start = next;
- eventPtr = start;
+ parser->m_eventPtr = start;
}
}
@@ -4008,9 +4205,9 @@ externalParEntProcessor(XML_Parser parser,
const char *next = s;
int tok;
- tok = XmlPrologTok(encoding, s, end, &next);
+ tok = XmlPrologTok(parser->m_encoding, s, end, &next);
if (tok <= 0) {
- if (!ps_finalBuffer && tok != XML_TOK_INVALID) {
+ if (!parser->m_parsingStatus.finalBuffer && tok != XML_TOK_INVALID) {
*nextPtr = s;
return XML_ERROR_NONE;
}
@@ -4032,12 +4229,12 @@ externalParEntProcessor(XML_Parser parser,
*/
else if (tok == XML_TOK_BOM) {
s = next;
- tok = XmlPrologTok(encoding, s, end, &next);
+ tok = XmlPrologTok(parser->m_encoding, s, end, &next);
}
- processor = prologProcessor;
- return doProlog(parser, encoding, s, end, tok, next,
- nextPtr, (XML_Bool)!ps_finalBuffer);
+ parser->m_processor = prologProcessor;
+ return doProlog(parser, parser->m_encoding, s, end, tok, next,
+ nextPtr, (XML_Bool)!parser->m_parsingStatus.finalBuffer);
}
static enum XML_Error PTRCALL
@@ -4048,13 +4245,13 @@ entityValueProcessor(XML_Parser parser,
{
const char *start = s;
const char *next = s;
- const ENCODING *enc = encoding;
+ const ENCODING *enc = parser->m_encoding;
int tok;
for (;;) {
tok = XmlPrologTok(enc, start, end, &next);
if (tok <= 0) {
- if (!ps_finalBuffer && tok != XML_TOK_INVALID) {
+ if (!parser->m_parsingStatus.finalBuffer && tok != XML_TOK_INVALID) {
*nextPtr = s;
return XML_ERROR_NONE;
}
@@ -4085,9 +4282,9 @@ prologProcessor(XML_Parser parser,
const char **nextPtr)
{
const char *next = s;
- int tok = XmlPrologTok(encoding, s, end, &next);
- return doProlog(parser, encoding, s, end, tok, next,
- nextPtr, (XML_Bool)!ps_finalBuffer);
+ int tok = XmlPrologTok(parser->m_encoding, s, end, &next);
+ return doProlog(parser, parser->m_encoding, s, end, tok, next,
+ nextPtr, (XML_Bool)!parser->m_parsingStatus.finalBuffer);
}
static enum XML_Error
@@ -4124,19 +4321,19 @@ doProlog(XML_Parser parser,
static const XML_Char enumValueStart[] = { ASCII_LPAREN, '\0' };
/* save one level of indirection */
- DTD * const dtd = _dtd;
+ DTD * const dtd = parser->m_dtd;
const char **eventPP;
const char **eventEndPP;
enum XML_Content_Quant quant;
- if (enc == encoding) {
- eventPP = &eventPtr;
- eventEndPP = &eventEndPtr;
+ if (enc == parser->m_encoding) {
+ eventPP = &parser->m_eventPtr;
+ eventEndPP = &parser->m_eventEndPtr;
}
else {
- eventPP = &(openInternalEntities->internalEventPtr);
- eventEndPP = &(openInternalEntities->internalEventEndPtr);
+ eventPP = &(parser->m_openInternalEntities->internalEventPtr);
+ eventEndPP = &(parser->m_openInternalEntities->internalEventEndPtr);
}
for (;;) {
@@ -4163,7 +4360,7 @@ doProlog(XML_Parser parser,
case XML_TOK_NONE:
#ifdef XML_DTD
/* for internal PE NOT referenced between declarations */
- if (enc != encoding && !openInternalEntities->betweenDecl) {
+ if (enc != parser->m_encoding && !parser->m_openInternalEntities->betweenDecl) {
*nextPtr = s;
return XML_ERROR_NONE;
}
@@ -4171,8 +4368,8 @@ doProlog(XML_Parser parser,
complete markup, not only for external PEs, but also for
internal PEs if the reference occurs between declarations.
*/
- if (isParamEntity || enc != encoding) {
- if (XmlTokenRole(&prologState, XML_TOK_NONE, end, end, enc)
+ if (parser->m_isParamEntity || enc != parser->m_encoding) {
+ if (XmlTokenRole(&parser->m_prologState, XML_TOK_NONE, end, end, enc)
== XML_ROLE_ERROR)
return XML_ERROR_INCOMPLETE_PE;
*nextPtr = s;
@@ -4186,34 +4383,34 @@ doProlog(XML_Parser parser,
break;
}
}
- role = XmlTokenRole(&prologState, tok, s, next, enc);
+ role = XmlTokenRole(&parser->m_prologState, tok, s, next, enc);
switch (role) {
case XML_ROLE_XML_DECL:
{
enum XML_Error result = processXmlDecl(parser, 0, s, next);
if (result != XML_ERROR_NONE)
return result;
- enc = encoding;
+ enc = parser->m_encoding;
handleDefault = XML_FALSE;
}
break;
case XML_ROLE_DOCTYPE_NAME:
- if (startDoctypeDeclHandler) {
- doctypeName = poolStoreString(&tempPool, enc, s, next);
- if (!doctypeName)
+ if (parser->m_startDoctypeDeclHandler) {
+ parser->m_doctypeName = poolStoreString(&parser->m_tempPool, enc, s, next);
+ if (!parser->m_doctypeName)
return XML_ERROR_NO_MEMORY;
- poolFinish(&tempPool);
- doctypePubid = NULL;
+ poolFinish(&parser->m_tempPool);
+ parser->m_doctypePubid = NULL;
handleDefault = XML_FALSE;
}
- doctypeSysid = NULL; /* always initialize to NULL */
+ parser->m_doctypeSysid = NULL; /* always initialize to NULL */
break;
case XML_ROLE_DOCTYPE_INTERNAL_SUBSET:
- if (startDoctypeDeclHandler) {
- startDoctypeDeclHandler(handlerArg, doctypeName, doctypeSysid,
- doctypePubid, 1);
- doctypeName = NULL;
- poolClear(&tempPool);
+ if (parser->m_startDoctypeDeclHandler) {
+ parser->m_startDoctypeDeclHandler(parser->m_handlerArg, parser->m_doctypeName, parser->m_doctypeSysid,
+ parser->m_doctypePubid, 1);
+ parser->m_doctypeName = NULL;
+ poolClear(&parser->m_tempPool);
handleDefault = XML_FALSE;
}
break;
@@ -4223,34 +4420,34 @@ doProlog(XML_Parser parser,
enum XML_Error result = processXmlDecl(parser, 1, s, next);
if (result != XML_ERROR_NONE)
return result;
- enc = encoding;
+ enc = parser->m_encoding;
handleDefault = XML_FALSE;
}
break;
#endif /* XML_DTD */
case XML_ROLE_DOCTYPE_PUBLIC_ID:
#ifdef XML_DTD
- useForeignDTD = XML_FALSE;
- declEntity = (ENTITY *)lookup(parser,
+ parser->m_useForeignDTD = XML_FALSE;
+ parser->m_declEntity = (ENTITY *)lookup(parser,
&dtd->paramEntities,
externalSubsetName,
sizeof(ENTITY));
- if (!declEntity)
+ if (!parser->m_declEntity)
return XML_ERROR_NO_MEMORY;
#endif /* XML_DTD */
dtd->hasParamEntityRefs = XML_TRUE;
- if (startDoctypeDeclHandler) {
+ if (parser->m_startDoctypeDeclHandler) {
XML_Char *pubId;
if (!XmlIsPublicId(enc, s, next, eventPP))
return XML_ERROR_PUBLICID;
- pubId = poolStoreString(&tempPool, enc,
+ pubId = poolStoreString(&parser->m_tempPool, enc,
s + enc->minBytesPerChar,
next - enc->minBytesPerChar);
if (!pubId)
return XML_ERROR_NO_MEMORY;
normalizePublicId(pubId);
- poolFinish(&tempPool);
- doctypePubid = pubId;
+ poolFinish(&parser->m_tempPool);
+ parser->m_doctypePubid = pubId;
handleDefault = XML_FALSE;
goto alreadyChecked;
}
@@ -4259,7 +4456,7 @@ doProlog(XML_Parser parser,
if (!XmlIsPublicId(enc, s, next, eventPP))
return XML_ERROR_PUBLICID;
alreadyChecked:
- if (dtd->keepProcessing && declEntity) {
+ if (dtd->keepProcessing && parser->m_declEntity) {
XML_Char *tem = poolStoreString(&dtd->pool,
enc,
s + enc->minBytesPerChar,
@@ -4267,38 +4464,47 @@ doProlog(XML_Parser parser,
if (!tem)
return XML_ERROR_NO_MEMORY;
normalizePublicId(tem);
- declEntity->publicId = tem;
+ parser->m_declEntity->publicId = tem;
poolFinish(&dtd->pool);
- if (entityDeclHandler)
+ /* Don't suppress the default handler if we fell through from
+ * the XML_ROLE_DOCTYPE_PUBLIC_ID case.
+ */
+ if (parser->m_entityDeclHandler && role == XML_ROLE_ENTITY_PUBLIC_ID)
handleDefault = XML_FALSE;
}
break;
case XML_ROLE_DOCTYPE_CLOSE:
- if (doctypeName) {
- startDoctypeDeclHandler(handlerArg, doctypeName,
- doctypeSysid, doctypePubid, 0);
- poolClear(&tempPool);
+ if (parser->m_doctypeName) {
+ parser->m_startDoctypeDeclHandler(parser->m_handlerArg, parser->m_doctypeName,
+ parser->m_doctypeSysid, parser->m_doctypePubid, 0);
+ poolClear(&parser->m_tempPool);
handleDefault = XML_FALSE;
}
- /* doctypeSysid will be non-NULL in the case of a previous
- XML_ROLE_DOCTYPE_SYSTEM_ID, even if startDoctypeDeclHandler
+ /* parser->m_doctypeSysid will be non-NULL in the case of a previous
+ XML_ROLE_DOCTYPE_SYSTEM_ID, even if parser->m_startDoctypeDeclHandler
was not set, indicating an external subset
*/
#ifdef XML_DTD
- if (doctypeSysid || useForeignDTD) {
+ if (parser->m_doctypeSysid || parser->m_useForeignDTD) {
XML_Bool hadParamEntityRefs = dtd->hasParamEntityRefs;
dtd->hasParamEntityRefs = XML_TRUE;
- if (paramEntityParsing && externalEntityRefHandler) {
+ if (parser->m_paramEntityParsing && parser->m_externalEntityRefHandler) {
ENTITY *entity = (ENTITY *)lookup(parser,
&dtd->paramEntities,
externalSubsetName,
sizeof(ENTITY));
- if (!entity)
- return XML_ERROR_NO_MEMORY;
- if (useForeignDTD)
- entity->base = curBase;
+ if (!entity) {
+ /* The external subset name "#" will have already been
+ * inserted into the hash table at the start of the
+ * external entity parsing, so no allocation will happen
+ * and lookup() cannot fail.
+ */
+ return XML_ERROR_NO_MEMORY; /* LCOV_EXCL_LINE */
+ }
+ if (parser->m_useForeignDTD)
+ entity->base = parser->m_curBase;
dtd->paramEntityRead = XML_FALSE;
- if (!externalEntityRefHandler(externalEntityRefHandlerArg,
+ if (!parser->m_externalEntityRefHandler(parser->m_externalEntityRefHandlerArg,
0,
entity->base,
entity->systemId,
@@ -4306,22 +4512,22 @@ doProlog(XML_Parser parser,
return XML_ERROR_EXTERNAL_ENTITY_HANDLING;
if (dtd->paramEntityRead) {
if (!dtd->standalone &&
- notStandaloneHandler &&
- !notStandaloneHandler(handlerArg))
+ parser->m_notStandaloneHandler &&
+ !parser->m_notStandaloneHandler(parser->m_handlerArg))
return XML_ERROR_NOT_STANDALONE;
}
/* if we didn't read the foreign DTD then this means that there
is no external subset and we must reset dtd->hasParamEntityRefs
*/
- else if (!doctypeSysid)
+ else if (!parser->m_doctypeSysid)
dtd->hasParamEntityRefs = hadParamEntityRefs;
/* end of DTD - no need to update dtd->keepProcessing */
}
- useForeignDTD = XML_FALSE;
+ parser->m_useForeignDTD = XML_FALSE;
}
#endif /* XML_DTD */
- if (endDoctypeDeclHandler) {
- endDoctypeDeclHandler(handlerArg);
+ if (parser->m_endDoctypeDeclHandler) {
+ parser->m_endDoctypeDeclHandler(parser->m_handlerArg);
handleDefault = XML_FALSE;
}
break;
@@ -4330,18 +4536,18 @@ doProlog(XML_Parser parser,
/* if there is no DOCTYPE declaration then now is the
last chance to read the foreign DTD
*/
- if (useForeignDTD) {
+ if (parser->m_useForeignDTD) {
XML_Bool hadParamEntityRefs = dtd->hasParamEntityRefs;
dtd->hasParamEntityRefs = XML_TRUE;
- if (paramEntityParsing && externalEntityRefHandler) {
+ if (parser->m_paramEntityParsing && parser->m_externalEntityRefHandler) {
ENTITY *entity = (ENTITY *)lookup(parser, &dtd->paramEntities,
externalSubsetName,
sizeof(ENTITY));
if (!entity)
return XML_ERROR_NO_MEMORY;
- entity->base = curBase;
+ entity->base = parser->m_curBase;
dtd->paramEntityRead = XML_FALSE;
- if (!externalEntityRefHandler(externalEntityRefHandlerArg,
+ if (!parser->m_externalEntityRefHandler(parser->m_externalEntityRefHandlerArg,
0,
entity->base,
entity->systemId,
@@ -4349,8 +4555,8 @@ doProlog(XML_Parser parser,
return XML_ERROR_EXTERNAL_ENTITY_HANDLING;
if (dtd->paramEntityRead) {
if (!dtd->standalone &&
- notStandaloneHandler &&
- !notStandaloneHandler(handlerArg))
+ parser->m_notStandaloneHandler &&
+ !parser->m_notStandaloneHandler(parser->m_handlerArg))
return XML_ERROR_NOT_STANDALONE;
}
/* if we didn't read the foreign DTD then this means that there
@@ -4362,55 +4568,55 @@ doProlog(XML_Parser parser,
}
}
#endif /* XML_DTD */
- processor = contentProcessor;
+ parser->m_processor = contentProcessor;
return contentProcessor(parser, s, end, nextPtr);
case XML_ROLE_ATTLIST_ELEMENT_NAME:
- declElementType = getElementType(parser, enc, s, next);
- if (!declElementType)
+ parser->m_declElementType = getElementType(parser, enc, s, next);
+ if (!parser->m_declElementType)
return XML_ERROR_NO_MEMORY;
goto checkAttListDeclHandler;
case XML_ROLE_ATTRIBUTE_NAME:
- declAttributeId = getAttributeId(parser, enc, s, next);
- if (!declAttributeId)
+ parser->m_declAttributeId = getAttributeId(parser, enc, s, next);
+ if (!parser->m_declAttributeId)
return XML_ERROR_NO_MEMORY;
- declAttributeIsCdata = XML_FALSE;
- declAttributeType = NULL;
- declAttributeIsId = XML_FALSE;
+ parser->m_declAttributeIsCdata = XML_FALSE;
+ parser->m_declAttributeType = NULL;
+ parser->m_declAttributeIsId = XML_FALSE;
goto checkAttListDeclHandler;
case XML_ROLE_ATTRIBUTE_TYPE_CDATA:
- declAttributeIsCdata = XML_TRUE;
- declAttributeType = atypeCDATA;
+ parser->m_declAttributeIsCdata = XML_TRUE;
+ parser->m_declAttributeType = atypeCDATA;
goto checkAttListDeclHandler;
case XML_ROLE_ATTRIBUTE_TYPE_ID:
- declAttributeIsId = XML_TRUE;
- declAttributeType = atypeID;
+ parser->m_declAttributeIsId = XML_TRUE;
+ parser->m_declAttributeType = atypeID;
goto checkAttListDeclHandler;
case XML_ROLE_ATTRIBUTE_TYPE_IDREF:
- declAttributeType = atypeIDREF;
+ parser->m_declAttributeType = atypeIDREF;
goto checkAttListDeclHandler;
case XML_ROLE_ATTRIBUTE_TYPE_IDREFS:
- declAttributeType = atypeIDREFS;
+ parser->m_declAttributeType = atypeIDREFS;
goto checkAttListDeclHandler;
case XML_ROLE_ATTRIBUTE_TYPE_ENTITY:
- declAttributeType = atypeENTITY;
+ parser->m_declAttributeType = atypeENTITY;
goto checkAttListDeclHandler;
case XML_ROLE_ATTRIBUTE_TYPE_ENTITIES:
- declAttributeType = atypeENTITIES;
+ parser->m_declAttributeType = atypeENTITIES;
goto checkAttListDeclHandler;
case XML_ROLE_ATTRIBUTE_TYPE_NMTOKEN:
- declAttributeType = atypeNMTOKEN;
+ parser->m_declAttributeType = atypeNMTOKEN;
goto checkAttListDeclHandler;
case XML_ROLE_ATTRIBUTE_TYPE_NMTOKENS:
- declAttributeType = atypeNMTOKENS;
+ parser->m_declAttributeType = atypeNMTOKENS;
checkAttListDeclHandler:
- if (dtd->keepProcessing && attlistDeclHandler)
+ if (dtd->keepProcessing && parser->m_attlistDeclHandler)
handleDefault = XML_FALSE;
break;
case XML_ROLE_ATTRIBUTE_ENUM_VALUE:
case XML_ROLE_ATTRIBUTE_NOTATION_VALUE:
- if (dtd->keepProcessing && attlistDeclHandler) {
+ if (dtd->keepProcessing && parser->m_attlistDeclHandler) {
const XML_Char *prefix;
- if (declAttributeType) {
+ if (parser->m_declAttributeType) {
prefix = enumValueSep;
}
else {
@@ -4418,37 +4624,37 @@ doProlog(XML_Parser parser,
? notationPrefix
: enumValueStart);
}
- if (!poolAppendString(&tempPool, prefix))
+ if (!poolAppendString(&parser->m_tempPool, prefix))
return XML_ERROR_NO_MEMORY;
- if (!poolAppend(&tempPool, enc, s, next))
+ if (!poolAppend(&parser->m_tempPool, enc, s, next))
return XML_ERROR_NO_MEMORY;
- declAttributeType = tempPool.start;
+ parser->m_declAttributeType = parser->m_tempPool.start;
handleDefault = XML_FALSE;
}
break;
case XML_ROLE_IMPLIED_ATTRIBUTE_VALUE:
case XML_ROLE_REQUIRED_ATTRIBUTE_VALUE:
if (dtd->keepProcessing) {
- if (!defineAttribute(declElementType, declAttributeId,
- declAttributeIsCdata, declAttributeIsId,
+ if (!defineAttribute(parser->m_declElementType, parser->m_declAttributeId,
+ parser->m_declAttributeIsCdata, parser->m_declAttributeIsId,
0, parser))
return XML_ERROR_NO_MEMORY;
- if (attlistDeclHandler && declAttributeType) {
- if (*declAttributeType == XML_T(ASCII_LPAREN)
- || (*declAttributeType == XML_T(ASCII_N)
- && declAttributeType[1] == XML_T(ASCII_O))) {
+ if (parser->m_attlistDeclHandler && parser->m_declAttributeType) {
+ if (*parser->m_declAttributeType == XML_T(ASCII_LPAREN)
+ || (*parser->m_declAttributeType == XML_T(ASCII_N)
+ && parser->m_declAttributeType[1] == XML_T(ASCII_O))) {
/* Enumerated or Notation type */
- if (!poolAppendChar(&tempPool, XML_T(ASCII_RPAREN))
- || !poolAppendChar(&tempPool, XML_T('\0')))
+ if (!poolAppendChar(&parser->m_tempPool, XML_T(ASCII_RPAREN))
+ || !poolAppendChar(&parser->m_tempPool, XML_T('\0')))
return XML_ERROR_NO_MEMORY;
- declAttributeType = tempPool.start;
- poolFinish(&tempPool);
+ parser->m_declAttributeType = parser->m_tempPool.start;
+ poolFinish(&parser->m_tempPool);
}
*eventEndPP = s;
- attlistDeclHandler(handlerArg, declElementType->name,
- declAttributeId->name, declAttributeType,
+ parser->m_attlistDeclHandler(parser->m_handlerArg, parser->m_declElementType->name,
+ parser->m_declAttributeId->name, parser->m_declAttributeType,
0, role == XML_ROLE_REQUIRED_ATTRIBUTE_VALUE);
- poolClear(&tempPool);
+ poolClear(&parser->m_tempPool);
handleDefault = XML_FALSE;
}
}
@@ -4458,7 +4664,7 @@ doProlog(XML_Parser parser,
if (dtd->keepProcessing) {
const XML_Char *attVal;
enum XML_Error result =
- storeAttributeValue(parser, enc, declAttributeIsCdata,
+ storeAttributeValue(parser, enc, parser->m_declAttributeIsCdata,
s + enc->minBytesPerChar,
next - enc->minBytesPerChar,
&dtd->pool);
@@ -4467,26 +4673,26 @@ doProlog(XML_Parser parser,
attVal = poolStart(&dtd->pool);
poolFinish(&dtd->pool);
/* ID attributes aren't allowed to have a default */
- if (!defineAttribute(declElementType, declAttributeId,
- declAttributeIsCdata, XML_FALSE, attVal, parser))
+ if (!defineAttribute(parser->m_declElementType, parser->m_declAttributeId,
+ parser->m_declAttributeIsCdata, XML_FALSE, attVal, parser))
return XML_ERROR_NO_MEMORY;
- if (attlistDeclHandler && declAttributeType) {
- if (*declAttributeType == XML_T(ASCII_LPAREN)
- || (*declAttributeType == XML_T(ASCII_N)
- && declAttributeType[1] == XML_T(ASCII_O))) {
+ if (parser->m_attlistDeclHandler && parser->m_declAttributeType) {
+ if (*parser->m_declAttributeType == XML_T(ASCII_LPAREN)
+ || (*parser->m_declAttributeType == XML_T(ASCII_N)
+ && parser->m_declAttributeType[1] == XML_T(ASCII_O))) {
/* Enumerated or Notation type */
- if (!poolAppendChar(&tempPool, XML_T(ASCII_RPAREN))
- || !poolAppendChar(&tempPool, XML_T('\0')))
+ if (!poolAppendChar(&parser->m_tempPool, XML_T(ASCII_RPAREN))
+ || !poolAppendChar(&parser->m_tempPool, XML_T('\0')))
return XML_ERROR_NO_MEMORY;
- declAttributeType = tempPool.start;
- poolFinish(&tempPool);
+ parser->m_declAttributeType = parser->m_tempPool.start;
+ poolFinish(&parser->m_tempPool);
}
*eventEndPP = s;
- attlistDeclHandler(handlerArg, declElementType->name,
- declAttributeId->name, declAttributeType,
+ parser->m_attlistDeclHandler(parser->m_handlerArg, parser->m_declElementType->name,
+ parser->m_declAttributeId->name, parser->m_declAttributeType,
attVal,
role == XML_ROLE_FIXED_ATTRIBUTE_VALUE);
- poolClear(&tempPool);
+ poolClear(&parser->m_tempPool);
handleDefault = XML_FALSE;
}
}
@@ -4496,18 +4702,18 @@ doProlog(XML_Parser parser,
enum XML_Error result = storeEntityValue(parser, enc,
s + enc->minBytesPerChar,
next - enc->minBytesPerChar);
- if (declEntity) {
- declEntity->textPtr = poolStart(&dtd->entityValuePool);
- declEntity->textLen = (int)(poolLength(&dtd->entityValuePool));
+ if (parser->m_declEntity) {
+ parser->m_declEntity->textPtr = poolStart(&dtd->entityValuePool);
+ parser->m_declEntity->textLen = (int)(poolLength(&dtd->entityValuePool));
poolFinish(&dtd->entityValuePool);
- if (entityDeclHandler) {
+ if (parser->m_entityDeclHandler) {
*eventEndPP = s;
- entityDeclHandler(handlerArg,
- declEntity->name,
- declEntity->is_param,
- declEntity->textPtr,
- declEntity->textLen,
- curBase, 0, 0, 0);
+ parser->m_entityDeclHandler(parser->m_handlerArg,
+ parser->m_declEntity->name,
+ parser->m_declEntity->is_param,
+ parser->m_declEntity->textPtr,
+ parser->m_declEntity->textLen,
+ parser->m_curBase, 0, 0, 0);
handleDefault = XML_FALSE;
}
}
@@ -4519,97 +4725,100 @@ doProlog(XML_Parser parser,
break;
case XML_ROLE_DOCTYPE_SYSTEM_ID:
#ifdef XML_DTD
- useForeignDTD = XML_FALSE;
+ parser->m_useForeignDTD = XML_FALSE;
#endif /* XML_DTD */
dtd->hasParamEntityRefs = XML_TRUE;
- if (startDoctypeDeclHandler) {
- doctypeSysid = poolStoreString(&tempPool, enc,
+ if (parser->m_startDoctypeDeclHandler) {
+ parser->m_doctypeSysid = poolStoreString(&parser->m_tempPool, enc,
s + enc->minBytesPerChar,
next - enc->minBytesPerChar);
- if (doctypeSysid == NULL)
+ if (parser->m_doctypeSysid == NULL)
return XML_ERROR_NO_MEMORY;
- poolFinish(&tempPool);
+ poolFinish(&parser->m_tempPool);
handleDefault = XML_FALSE;
}
#ifdef XML_DTD
else
- /* use externalSubsetName to make doctypeSysid non-NULL
- for the case where no startDoctypeDeclHandler is set */
- doctypeSysid = externalSubsetName;
+ /* use externalSubsetName to make parser->m_doctypeSysid non-NULL
+ for the case where no parser->m_startDoctypeDeclHandler is set */
+ parser->m_doctypeSysid = externalSubsetName;
#endif /* XML_DTD */
if (!dtd->standalone
#ifdef XML_DTD
- && !paramEntityParsing
+ && !parser->m_paramEntityParsing
#endif /* XML_DTD */
- && notStandaloneHandler
- && !notStandaloneHandler(handlerArg))
+ && parser->m_notStandaloneHandler
+ && !parser->m_notStandaloneHandler(parser->m_handlerArg))
return XML_ERROR_NOT_STANDALONE;
#ifndef XML_DTD
break;
#else /* XML_DTD */
- if (!declEntity) {
- declEntity = (ENTITY *)lookup(parser,
+ if (!parser->m_declEntity) {
+ parser->m_declEntity = (ENTITY *)lookup(parser,
&dtd->paramEntities,
externalSubsetName,
sizeof(ENTITY));
- if (!declEntity)
+ if (!parser->m_declEntity)
return XML_ERROR_NO_MEMORY;
- declEntity->publicId = NULL;
+ parser->m_declEntity->publicId = NULL;
}
- /* fall through */
#endif /* XML_DTD */
+ /* fall through */
case XML_ROLE_ENTITY_SYSTEM_ID:
- if (dtd->keepProcessing && declEntity) {
- declEntity->systemId = poolStoreString(&dtd->pool, enc,
+ if (dtd->keepProcessing && parser->m_declEntity) {
+ parser->m_declEntity->systemId = poolStoreString(&dtd->pool, enc,
s + enc->minBytesPerChar,
next - enc->minBytesPerChar);
- if (!declEntity->systemId)
+ if (!parser->m_declEntity->systemId)
return XML_ERROR_NO_MEMORY;
- declEntity->base = curBase;
+ parser->m_declEntity->base = parser->m_curBase;
poolFinish(&dtd->pool);
- if (entityDeclHandler)
+ /* Don't suppress the default handler if we fell through from
+ * the XML_ROLE_DOCTYPE_SYSTEM_ID case.
+ */
+ if (parser->m_entityDeclHandler && role == XML_ROLE_ENTITY_SYSTEM_ID)
handleDefault = XML_FALSE;
}
break;
case XML_ROLE_ENTITY_COMPLETE:
- if (dtd->keepProcessing && declEntity && entityDeclHandler) {
+ if (dtd->keepProcessing && parser->m_declEntity && parser->m_entityDeclHandler) {
*eventEndPP = s;
- entityDeclHandler(handlerArg,
- declEntity->name,
- declEntity->is_param,
+ parser->m_entityDeclHandler(parser->m_handlerArg,
+ parser->m_declEntity->name,
+ parser->m_declEntity->is_param,
0,0,
- declEntity->base,
- declEntity->systemId,
- declEntity->publicId,
+ parser->m_declEntity->base,
+ parser->m_declEntity->systemId,
+ parser->m_declEntity->publicId,
0);
handleDefault = XML_FALSE;
}
break;
case XML_ROLE_ENTITY_NOTATION_NAME:
- if (dtd->keepProcessing && declEntity) {
- declEntity->notation = poolStoreString(&dtd->pool, enc, s, next);
- if (!declEntity->notation)
+ if (dtd->keepProcessing && parser->m_declEntity) {
+ parser->m_declEntity->notation = poolStoreString(&dtd->pool, enc, s, next);
+ if (!parser->m_declEntity->notation)
return XML_ERROR_NO_MEMORY;
poolFinish(&dtd->pool);
- if (unparsedEntityDeclHandler) {
+ if (parser->m_unparsedEntityDeclHandler) {
*eventEndPP = s;
- unparsedEntityDeclHandler(handlerArg,
- declEntity->name,
- declEntity->base,
- declEntity->systemId,
- declEntity->publicId,
- declEntity->notation);
+ parser->m_unparsedEntityDeclHandler(parser->m_handlerArg,
+ parser->m_declEntity->name,
+ parser->m_declEntity->base,
+ parser->m_declEntity->systemId,
+ parser->m_declEntity->publicId,
+ parser->m_declEntity->notation);
handleDefault = XML_FALSE;
}
- else if (entityDeclHandler) {
+ else if (parser->m_entityDeclHandler) {
*eventEndPP = s;
- entityDeclHandler(handlerArg,
- declEntity->name,
+ parser->m_entityDeclHandler(parser->m_handlerArg,
+ parser->m_declEntity->name,
0,0,0,
- declEntity->base,
- declEntity->systemId,
- declEntity->publicId,
- declEntity->notation);
+ parser->m_declEntity->base,
+ parser->m_declEntity->systemId,
+ parser->m_declEntity->publicId,
+ parser->m_declEntity->notation);
handleDefault = XML_FALSE;
}
}
@@ -4617,36 +4826,36 @@ doProlog(XML_Parser parser,
case XML_ROLE_GENERAL_ENTITY_NAME:
{
if (XmlPredefinedEntityName(enc, s, next)) {
- declEntity = NULL;
+ parser->m_declEntity = NULL;
break;
}
if (dtd->keepProcessing) {
const XML_Char *name = poolStoreString(&dtd->pool, enc, s, next);
if (!name)
return XML_ERROR_NO_MEMORY;
- declEntity = (ENTITY *)lookup(parser, &dtd->generalEntities, name,
+ parser->m_declEntity = (ENTITY *)lookup(parser, &dtd->generalEntities, name,
sizeof(ENTITY));
- if (!declEntity)
+ if (!parser->m_declEntity)
return XML_ERROR_NO_MEMORY;
- if (declEntity->name != name) {
+ if (parser->m_declEntity->name != name) {
poolDiscard(&dtd->pool);
- declEntity = NULL;
+ parser->m_declEntity = NULL;
}
else {
poolFinish(&dtd->pool);
- declEntity->publicId = NULL;
- declEntity->is_param = XML_FALSE;
+ parser->m_declEntity->publicId = NULL;
+ parser->m_declEntity->is_param = XML_FALSE;
/* if we have a parent parser or are reading an internal parameter
entity, then the entity declaration is not considered "internal"
*/
- declEntity->is_internal = !(parentParser || openInternalEntities);
- if (entityDeclHandler)
+ parser->m_declEntity->is_internal = !(parser->m_parentParser || parser->m_openInternalEntities);
+ if (parser->m_entityDeclHandler)
handleDefault = XML_FALSE;
}
}
else {
poolDiscard(&dtd->pool);
- declEntity = NULL;
+ parser->m_declEntity = NULL;
}
}
break;
@@ -4656,90 +4865,90 @@ doProlog(XML_Parser parser,
const XML_Char *name = poolStoreString(&dtd->pool, enc, s, next);
if (!name)
return XML_ERROR_NO_MEMORY;
- declEntity = (ENTITY *)lookup(parser, &dtd->paramEntities,
+ parser->m_declEntity = (ENTITY *)lookup(parser, &dtd->paramEntities,
name, sizeof(ENTITY));
- if (!declEntity)
+ if (!parser->m_declEntity)
return XML_ERROR_NO_MEMORY;
- if (declEntity->name != name) {
+ if (parser->m_declEntity->name != name) {
poolDiscard(&dtd->pool);
- declEntity = NULL;
+ parser->m_declEntity = NULL;
}
else {
poolFinish(&dtd->pool);
- declEntity->publicId = NULL;
- declEntity->is_param = XML_TRUE;
+ parser->m_declEntity->publicId = NULL;
+ parser->m_declEntity->is_param = XML_TRUE;
/* if we have a parent parser or are reading an internal parameter
entity, then the entity declaration is not considered "internal"
*/
- declEntity->is_internal = !(parentParser || openInternalEntities);
- if (entityDeclHandler)
+ parser->m_declEntity->is_internal = !(parser->m_parentParser || parser->m_openInternalEntities);
+ if (parser->m_entityDeclHandler)
handleDefault = XML_FALSE;
}
}
else {
poolDiscard(&dtd->pool);
- declEntity = NULL;
+ parser->m_declEntity = NULL;
}
#else /* not XML_DTD */
- declEntity = NULL;
+ parser->m_declEntity = NULL;
#endif /* XML_DTD */
break;
case XML_ROLE_NOTATION_NAME:
- declNotationPublicId = NULL;
- declNotationName = NULL;
- if (notationDeclHandler) {
- declNotationName = poolStoreString(&tempPool, enc, s, next);
- if (!declNotationName)
+ parser->m_declNotationPublicId = NULL;
+ parser->m_declNotationName = NULL;
+ if (parser->m_notationDeclHandler) {
+ parser->m_declNotationName = poolStoreString(&parser->m_tempPool, enc, s, next);
+ if (!parser->m_declNotationName)
return XML_ERROR_NO_MEMORY;
- poolFinish(&tempPool);
+ poolFinish(&parser->m_tempPool);
handleDefault = XML_FALSE;
}
break;
case XML_ROLE_NOTATION_PUBLIC_ID:
if (!XmlIsPublicId(enc, s, next, eventPP))
return XML_ERROR_PUBLICID;
- if (declNotationName) { /* means notationDeclHandler != NULL */
- XML_Char *tem = poolStoreString(&tempPool,
+ if (parser->m_declNotationName) { /* means m_notationDeclHandler != NULL */
+ XML_Char *tem = poolStoreString(&parser->m_tempPool,
enc,
s + enc->minBytesPerChar,
next - enc->minBytesPerChar);
if (!tem)
return XML_ERROR_NO_MEMORY;
normalizePublicId(tem);
- declNotationPublicId = tem;
- poolFinish(&tempPool);
+ parser->m_declNotationPublicId = tem;
+ poolFinish(&parser->m_tempPool);
handleDefault = XML_FALSE;
}
break;
case XML_ROLE_NOTATION_SYSTEM_ID:
- if (declNotationName && notationDeclHandler) {
+ if (parser->m_declNotationName && parser->m_notationDeclHandler) {
const XML_Char *systemId
- = poolStoreString(&tempPool, enc,
+ = poolStoreString(&parser->m_tempPool, enc,
s + enc->minBytesPerChar,
next - enc->minBytesPerChar);
if (!systemId)
return XML_ERROR_NO_MEMORY;
*eventEndPP = s;
- notationDeclHandler(handlerArg,
- declNotationName,
- curBase,
+ parser->m_notationDeclHandler(parser->m_handlerArg,
+ parser->m_declNotationName,
+ parser->m_curBase,
systemId,
- declNotationPublicId);
+ parser->m_declNotationPublicId);
handleDefault = XML_FALSE;
}
- poolClear(&tempPool);
+ poolClear(&parser->m_tempPool);
break;
case XML_ROLE_NOTATION_NO_SYSTEM_ID:
- if (declNotationPublicId && notationDeclHandler) {
+ if (parser->m_declNotationPublicId && parser->m_notationDeclHandler) {
*eventEndPP = s;
- notationDeclHandler(handlerArg,
- declNotationName,
- curBase,
+ parser->m_notationDeclHandler(parser->m_handlerArg,
+ parser->m_declNotationName,
+ parser->m_curBase,
0,
- declNotationPublicId);
+ parser->m_declNotationPublicId);
handleDefault = XML_FALSE;
}
- poolClear(&tempPool);
+ poolClear(&parser->m_tempPool);
break;
case XML_ROLE_ERROR:
switch (tok) {
@@ -4756,41 +4965,45 @@ doProlog(XML_Parser parser,
case XML_ROLE_IGNORE_SECT:
{
enum XML_Error result;
- if (defaultHandler)
+ if (parser->m_defaultHandler)
reportDefault(parser, enc, s, next);
handleDefault = XML_FALSE;
result = doIgnoreSection(parser, enc, &next, end, nextPtr, haveMore);
if (result != XML_ERROR_NONE)
return result;
else if (!next) {
- processor = ignoreSectionProcessor;
+ parser->m_processor = ignoreSectionProcessor;
return result;
}
}
break;
#endif /* XML_DTD */
case XML_ROLE_GROUP_OPEN:
- if (prologState.level >= groupSize) {
- if (groupSize) {
- char *temp = (char *)REALLOC(groupConnector, groupSize *= 2);
- if (temp == NULL)
+ if (parser->m_prologState.level >= parser->m_groupSize) {
+ if (parser->m_groupSize) {
+ char *temp = (char *)REALLOC(parser, parser->m_groupConnector, parser->m_groupSize *= 2);
+ if (temp == NULL) {
+ parser->m_groupSize /= 2;
return XML_ERROR_NO_MEMORY;
- groupConnector = temp;
+ }
+ parser->m_groupConnector = temp;
if (dtd->scaffIndex) {
- int *temp = (int *)REALLOC(dtd->scaffIndex,
- groupSize * sizeof(int));
+ int *temp = (int *)REALLOC(parser, dtd->scaffIndex,
+ parser->m_groupSize * sizeof(int));
if (temp == NULL)
return XML_ERROR_NO_MEMORY;
dtd->scaffIndex = temp;
}
}
else {
- groupConnector = (char *)MALLOC(groupSize = 32);
- if (!groupConnector)
+ parser->m_groupConnector = (char *)MALLOC(parser, parser->m_groupSize = 32);
+ if (!parser->m_groupConnector) {
+ parser->m_groupSize = 0;
return XML_ERROR_NO_MEMORY;
+ }
}
}
- groupConnector[prologState.level] = 0;
+ parser->m_groupConnector[parser->m_prologState.level] = 0;
if (dtd->in_eldecl) {
int myindex = nextScaffoldPart(parser);
if (myindex < 0)
@@ -4798,37 +5011,37 @@ doProlog(XML_Parser parser,
dtd->scaffIndex[dtd->scaffLevel] = myindex;
dtd->scaffLevel++;
dtd->scaffold[myindex].type = XML_CTYPE_SEQ;
- if (elementDeclHandler)
+ if (parser->m_elementDeclHandler)
handleDefault = XML_FALSE;
}
break;
case XML_ROLE_GROUP_SEQUENCE:
- if (groupConnector[prologState.level] == ASCII_PIPE)
+ if (parser->m_groupConnector[parser->m_prologState.level] == ASCII_PIPE)
return XML_ERROR_SYNTAX;
- groupConnector[prologState.level] = ASCII_COMMA;
- if (dtd->in_eldecl && elementDeclHandler)
+ parser->m_groupConnector[parser->m_prologState.level] = ASCII_COMMA;
+ if (dtd->in_eldecl && parser->m_elementDeclHandler)
handleDefault = XML_FALSE;
break;
case XML_ROLE_GROUP_CHOICE:
- if (groupConnector[prologState.level] == ASCII_COMMA)
+ if (parser->m_groupConnector[parser->m_prologState.level] == ASCII_COMMA)
return XML_ERROR_SYNTAX;
if (dtd->in_eldecl
- && !groupConnector[prologState.level]
+ && !parser->m_groupConnector[parser->m_prologState.level]
&& (dtd->scaffold[dtd->scaffIndex[dtd->scaffLevel - 1]].type
!= XML_CTYPE_MIXED)
) {
dtd->scaffold[dtd->scaffIndex[dtd->scaffLevel - 1]].type
= XML_CTYPE_CHOICE;
- if (elementDeclHandler)
+ if (parser->m_elementDeclHandler)
handleDefault = XML_FALSE;
}
- groupConnector[prologState.level] = ASCII_PIPE;
+ parser->m_groupConnector[parser->m_prologState.level] = ASCII_PIPE;
break;
case XML_ROLE_PARAM_ENTITY_REF:
#ifdef XML_DTD
case XML_ROLE_INNER_PARAM_ENTITY_REF:
dtd->hasParamEntityRefs = XML_TRUE;
- if (!paramEntityParsing)
+ if (!parser->m_paramEntityParsing)
dtd->keepProcessing = dtd->standalone;
else {
const XML_Char *name;
@@ -4844,20 +5057,41 @@ doProlog(XML_Parser parser,
if yes, check that the entity exists, and that it is internal,
otherwise call the skipped entity handler
*/
- if (prologState.documentEntity &&
+ if (parser->m_prologState.documentEntity &&
(dtd->standalone
- ? !openInternalEntities
+ ? !parser->m_openInternalEntities
: !dtd->hasParamEntityRefs)) {
if (!entity)
return XML_ERROR_UNDEFINED_ENTITY;
- else if (!entity->is_internal)
- return XML_ERROR_ENTITY_DECLARED_IN_PE;
+ else if (!entity->is_internal) {
+ /* It's hard to exhaustively search the code to be sure,
+ * but there doesn't seem to be a way of executing the
+ * following line. There are two cases:
+ *
+ * If 'standalone' is false, the DTD must have no
+ * parameter entities or we wouldn't have passed the outer
+ * 'if' statement. That measn the only entity in the hash
+ * table is the external subset name "#" which cannot be
+ * given as a parameter entity name in XML syntax, so the
+ * lookup must have returned NULL and we don't even reach
+ * the test for an internal entity.
+ *
+ * If 'standalone' is true, it does not seem to be
+ * possible to create entities taking this code path that
+ * are not internal entities, so fail the test above.
+ *
+ * Because this analysis is very uncertain, the code is
+ * being left in place and merely removed from the
+ * coverage test statistics.
+ */
+ return XML_ERROR_ENTITY_DECLARED_IN_PE; /* LCOV_EXCL_LINE */
+ }
}
else if (!entity) {
dtd->keepProcessing = dtd->standalone;
/* cannot report skipped entities in declarations */
- if ((role == XML_ROLE_PARAM_ENTITY_REF) && skippedEntityHandler) {
- skippedEntityHandler(handlerArg, name, 1);
+ if ((role == XML_ROLE_PARAM_ENTITY_REF) && parser->m_skippedEntityHandler) {
+ parser->m_skippedEntityHandler(parser->m_handlerArg, name, 1);
handleDefault = XML_FALSE;
}
break;
@@ -4874,10 +5108,10 @@ doProlog(XML_Parser parser,
handleDefault = XML_FALSE;
break;
}
- if (externalEntityRefHandler) {
+ if (parser->m_externalEntityRefHandler) {
dtd->paramEntityRead = XML_FALSE;
entity->open = XML_TRUE;
- if (!externalEntityRefHandler(externalEntityRefHandlerArg,
+ if (!parser->m_externalEntityRefHandler(parser->m_externalEntityRefHandlerArg,
0,
entity->base,
entity->systemId,
@@ -4899,17 +5133,17 @@ doProlog(XML_Parser parser,
}
#endif /* XML_DTD */
if (!dtd->standalone &&
- notStandaloneHandler &&
- !notStandaloneHandler(handlerArg))
+ parser->m_notStandaloneHandler &&
+ !parser->m_notStandaloneHandler(parser->m_handlerArg))
return XML_ERROR_NOT_STANDALONE;
break;
/* Element declaration stuff */
case XML_ROLE_ELEMENT_NAME:
- if (elementDeclHandler) {
- declElementType = getElementType(parser, enc, s, next);
- if (!declElementType)
+ if (parser->m_elementDeclHandler) {
+ parser->m_declElementType = getElementType(parser, enc, s, next);
+ if (!parser->m_declElementType)
return XML_ERROR_NO_MEMORY;
dtd->scaffLevel = 0;
dtd->scaffCount = 0;
@@ -4921,8 +5155,8 @@ doProlog(XML_Parser parser,
case XML_ROLE_CONTENT_ANY:
case XML_ROLE_CONTENT_EMPTY:
if (dtd->in_eldecl) {
- if (elementDeclHandler) {
- XML_Content * content = (XML_Content *) MALLOC(sizeof(XML_Content));
+ if (parser->m_elementDeclHandler) {
+ XML_Content * content = (XML_Content *) MALLOC(parser, sizeof(XML_Content));
if (!content)
return XML_ERROR_NO_MEMORY;
content->quant = XML_CQUANT_NONE;
@@ -4933,7 +5167,7 @@ doProlog(XML_Parser parser,
XML_CTYPE_ANY :
XML_CTYPE_EMPTY);
*eventEndPP = s;
- elementDeclHandler(handlerArg, declElementType->name, content);
+ parser->m_elementDeclHandler(parser->m_handlerArg, parser->m_declElementType->name, content);
handleDefault = XML_FALSE;
}
dtd->in_eldecl = XML_FALSE;
@@ -4944,7 +5178,7 @@ doProlog(XML_Parser parser,
if (dtd->in_eldecl) {
dtd->scaffold[dtd->scaffIndex[dtd->scaffLevel - 1]].type
= XML_CTYPE_MIXED;
- if (elementDeclHandler)
+ if (parser->m_elementDeclHandler)
handleDefault = XML_FALSE;
}
break;
@@ -4981,7 +5215,7 @@ doProlog(XML_Parser parser,
nameLen = 0;
for (; name[nameLen++]; );
dtd->contentStringLen += nameLen;
- if (elementDeclHandler)
+ if (parser->m_elementDeclHandler)
handleDefault = XML_FALSE;
}
break;
@@ -4999,7 +5233,7 @@ doProlog(XML_Parser parser,
quant = XML_CQUANT_PLUS;
closeGroup:
if (dtd->in_eldecl) {
- if (elementDeclHandler)
+ if (parser->m_elementDeclHandler)
handleDefault = XML_FALSE;
dtd->scaffLevel--;
dtd->scaffold[dtd->scaffIndex[dtd->scaffLevel]].quant = quant;
@@ -5009,7 +5243,7 @@ doProlog(XML_Parser parser,
if (!model)
return XML_ERROR_NO_MEMORY;
*eventEndPP = s;
- elementDeclHandler(handlerArg, declElementType->name, model);
+ parser->m_elementDeclHandler(parser->m_handlerArg, parser->m_declElementType->name, model);
}
dtd->in_eldecl = XML_FALSE;
dtd->contentStringLen = 0;
@@ -5036,31 +5270,31 @@ doProlog(XML_Parser parser,
}
break;
case XML_ROLE_DOCTYPE_NONE:
- if (startDoctypeDeclHandler)
+ if (parser->m_startDoctypeDeclHandler)
handleDefault = XML_FALSE;
break;
case XML_ROLE_ENTITY_NONE:
- if (dtd->keepProcessing && entityDeclHandler)
+ if (dtd->keepProcessing && parser->m_entityDeclHandler)
handleDefault = XML_FALSE;
break;
case XML_ROLE_NOTATION_NONE:
- if (notationDeclHandler)
+ if (parser->m_notationDeclHandler)
handleDefault = XML_FALSE;
break;
case XML_ROLE_ATTLIST_NONE:
- if (dtd->keepProcessing && attlistDeclHandler)
+ if (dtd->keepProcessing && parser->m_attlistDeclHandler)
handleDefault = XML_FALSE;
break;
case XML_ROLE_ELEMENT_NONE:
- if (elementDeclHandler)
+ if (parser->m_elementDeclHandler)
handleDefault = XML_FALSE;
break;
} /* end of big switch */
- if (handleDefault && defaultHandler)
+ if (handleDefault && parser->m_defaultHandler)
reportDefault(parser, enc, s, next);
- switch (ps_parsing) {
+ switch (parser->m_parsingStatus.parsing) {
case XML_SUSPENDED:
*nextPtr = next;
return XML_ERROR_NONE;
@@ -5080,18 +5314,18 @@ epilogProcessor(XML_Parser parser,
const char *end,
const char **nextPtr)
{
- processor = epilogProcessor;
- eventPtr = s;
+ parser->m_processor = epilogProcessor;
+ parser->m_eventPtr = s;
for (;;) {
const char *next = NULL;
- int tok = XmlPrologTok(encoding, s, end, &next);
- eventEndPtr = next;
+ int tok = XmlPrologTok(parser->m_encoding, s, end, &next);
+ parser->m_eventEndPtr = next;
switch (tok) {
/* report partial linebreak - it might be the last token */
case -XML_TOK_PROLOG_S:
- if (defaultHandler) {
- reportDefault(parser, encoding, s, next);
- if (ps_parsing == XML_FINISHED)
+ if (parser->m_defaultHandler) {
+ reportDefault(parser, parser->m_encoding, s, next);
+ if (parser->m_parsingStatus.parsing == XML_FINISHED)
return XML_ERROR_ABORTED;
}
*nextPtr = next;
@@ -5100,28 +5334,28 @@ epilogProcessor(XML_Parser parser,
*nextPtr = s;
return XML_ERROR_NONE;
case XML_TOK_PROLOG_S:
- if (defaultHandler)
- reportDefault(parser, encoding, s, next);
+ if (parser->m_defaultHandler)
+ reportDefault(parser, parser->m_encoding, s, next);
break;
case XML_TOK_PI:
- if (!reportProcessingInstruction(parser, encoding, s, next))
+ if (!reportProcessingInstruction(parser, parser->m_encoding, s, next))
return XML_ERROR_NO_MEMORY;
break;
case XML_TOK_COMMENT:
- if (!reportComment(parser, encoding, s, next))
+ if (!reportComment(parser, parser->m_encoding, s, next))
return XML_ERROR_NO_MEMORY;
break;
case XML_TOK_INVALID:
- eventPtr = next;
+ parser->m_eventPtr = next;
return XML_ERROR_INVALID_TOKEN;
case XML_TOK_PARTIAL:
- if (!ps_finalBuffer) {
+ if (!parser->m_parsingStatus.finalBuffer) {
*nextPtr = s;
return XML_ERROR_NONE;
}
return XML_ERROR_UNCLOSED_TOKEN;
case XML_TOK_PARTIAL_CHAR:
- if (!ps_finalBuffer) {
+ if (!parser->m_parsingStatus.finalBuffer) {
*nextPtr = s;
return XML_ERROR_NONE;
}
@@ -5129,8 +5363,8 @@ epilogProcessor(XML_Parser parser,
default:
return XML_ERROR_JUNK_AFTER_DOC_ELEMENT;
}
- eventPtr = s = next;
- switch (ps_parsing) {
+ parser->m_eventPtr = s = next;
+ switch (parser->m_parsingStatus.parsing) {
case XML_SUSPENDED:
*nextPtr = next;
return XML_ERROR_NONE;
@@ -5150,21 +5384,21 @@ processInternalEntity(XML_Parser parser, ENTITY *entity,
enum XML_Error result;
OPEN_INTERNAL_ENTITY *openEntity;
- if (freeInternalEntities) {
- openEntity = freeInternalEntities;
- freeInternalEntities = openEntity->next;
+ if (parser->m_freeInternalEntities) {
+ openEntity = parser->m_freeInternalEntities;
+ parser->m_freeInternalEntities = openEntity->next;
}
else {
- openEntity = (OPEN_INTERNAL_ENTITY *)MALLOC(sizeof(OPEN_INTERNAL_ENTITY));
+ openEntity = (OPEN_INTERNAL_ENTITY *)MALLOC(parser, sizeof(OPEN_INTERNAL_ENTITY));
if (!openEntity)
return XML_ERROR_NO_MEMORY;
}
entity->open = XML_TRUE;
entity->processed = 0;
- openEntity->next = openInternalEntities;
- openInternalEntities = openEntity;
+ openEntity->next = parser->m_openInternalEntities;
+ parser->m_openInternalEntities = openEntity;
openEntity->entity = entity;
- openEntity->startTagLevel = tagLevel;
+ openEntity->startTagLevel = parser->m_tagLevel;
openEntity->betweenDecl = betweenDecl;
openEntity->internalEventPtr = NULL;
openEntity->internalEventEndPtr = NULL;
@@ -5175,26 +5409,26 @@ processInternalEntity(XML_Parser parser, ENTITY *entity,
#ifdef XML_DTD
if (entity->is_param) {
- int tok = XmlPrologTok(internalEncoding, textStart, textEnd, &next);
- result = doProlog(parser, internalEncoding, textStart, textEnd, tok,
+ int tok = XmlPrologTok(parser->m_internalEncoding, textStart, textEnd, &next);
+ result = doProlog(parser, parser->m_internalEncoding, textStart, textEnd, tok,
next, &next, XML_FALSE);
}
else
#endif /* XML_DTD */
- result = doContent(parser, tagLevel, internalEncoding, textStart,
+ result = doContent(parser, parser->m_tagLevel, parser->m_internalEncoding, textStart,
textEnd, &next, XML_FALSE);
if (result == XML_ERROR_NONE) {
- if (textEnd != next && ps_parsing == XML_SUSPENDED) {
+ if (textEnd != next && parser->m_parsingStatus.parsing == XML_SUSPENDED) {
entity->processed = (int)(next - textStart);
- processor = internalEntityProcessor;
+ parser->m_processor = internalEntityProcessor;
}
else {
entity->open = XML_FALSE;
- openInternalEntities = openEntity->next;
+ parser->m_openInternalEntities = openEntity->next;
/* put openEntity back in list of free instances */
- openEntity->next = freeInternalEntities;
- freeInternalEntities = openEntity;
+ openEntity->next = parser->m_freeInternalEntities;
+ parser->m_freeInternalEntities = openEntity;
}
}
return result;
@@ -5210,7 +5444,7 @@ internalEntityProcessor(XML_Parser parser,
const char *textStart, *textEnd;
const char *next;
enum XML_Error result;
- OPEN_INTERNAL_ENTITY *openEntity = openInternalEntities;
+ OPEN_INTERNAL_ENTITY *openEntity = parser->m_openInternalEntities;
if (!openEntity)
return XML_ERROR_UNEXPECTED_STATE;
@@ -5222,44 +5456,44 @@ internalEntityProcessor(XML_Parser parser,
#ifdef XML_DTD
if (entity->is_param) {
- int tok = XmlPrologTok(internalEncoding, textStart, textEnd, &next);
- result = doProlog(parser, internalEncoding, textStart, textEnd, tok,
+ int tok = XmlPrologTok(parser->m_internalEncoding, textStart, textEnd, &next);
+ result = doProlog(parser, parser->m_internalEncoding, textStart, textEnd, tok,
next, &next, XML_FALSE);
}
else
#endif /* XML_DTD */
- result = doContent(parser, openEntity->startTagLevel, internalEncoding,
+ result = doContent(parser, openEntity->startTagLevel, parser->m_internalEncoding,
textStart, textEnd, &next, XML_FALSE);
if (result != XML_ERROR_NONE)
return result;
- else if (textEnd != next && ps_parsing == XML_SUSPENDED) {
+ else if (textEnd != next && parser->m_parsingStatus.parsing == XML_SUSPENDED) {
entity->processed = (int)(next - (char *)entity->textPtr);
return result;
}
else {
entity->open = XML_FALSE;
- openInternalEntities = openEntity->next;
+ parser->m_openInternalEntities = openEntity->next;
/* put openEntity back in list of free instances */
- openEntity->next = freeInternalEntities;
- freeInternalEntities = openEntity;
+ openEntity->next = parser->m_freeInternalEntities;
+ parser->m_freeInternalEntities = openEntity;
}
#ifdef XML_DTD
if (entity->is_param) {
int tok;
- processor = prologProcessor;
- tok = XmlPrologTok(encoding, s, end, &next);
- return doProlog(parser, encoding, s, end, tok, next, nextPtr,
- (XML_Bool)!ps_finalBuffer);
+ parser->m_processor = prologProcessor;
+ tok = XmlPrologTok(parser->m_encoding, s, end, &next);
+ return doProlog(parser, parser->m_encoding, s, end, tok, next, nextPtr,
+ (XML_Bool)!parser->m_parsingStatus.finalBuffer);
}
else
#endif /* XML_DTD */
{
- processor = contentProcessor;
+ parser->m_processor = contentProcessor;
/* see externalEntityContentProcessor vs contentProcessor */
- return doContent(parser, parentParser ? 1 : 0, encoding, s, end,
- nextPtr, (XML_Bool)!ps_finalBuffer);
+ return doContent(parser, parser->m_parentParser ? 1 : 0, parser->m_encoding, s, end,
+ nextPtr, (XML_Bool)!parser->m_parsingStatus.finalBuffer);
}
}
@@ -5269,7 +5503,7 @@ errorProcessor(XML_Parser parser,
const char *UNUSED_P(end),
const char **UNUSED_P(nextPtr))
{
- return errorCode;
+ return parser->m_errorCode;
}
static enum XML_Error
@@ -5293,7 +5527,7 @@ appendAttributeValue(XML_Parser parser, const ENCODING *enc, XML_Bool isCdata,
const char *ptr, const char *end,
STRING_POOL *pool)
{
- DTD * const dtd = _dtd; /* save one level of indirection */
+ DTD * const dtd = parser->m_dtd; /* save one level of indirection */
for (;;) {
const char *next;
int tok = XmlAttributeValueTok(enc, ptr, end, &next);
@@ -5301,12 +5535,12 @@ appendAttributeValue(XML_Parser parser, const ENCODING *enc, XML_Bool isCdata,
case XML_TOK_NONE:
return XML_ERROR_NONE;
case XML_TOK_INVALID:
- if (enc == encoding)
- eventPtr = next;
+ if (enc == parser->m_encoding)
+ parser->m_eventPtr = next;
return XML_ERROR_INVALID_TOKEN;
case XML_TOK_PARTIAL:
- if (enc == encoding)
- eventPtr = ptr;
+ if (enc == parser->m_encoding)
+ parser->m_eventPtr = ptr;
return XML_ERROR_INVALID_TOKEN;
case XML_TOK_CHAR_REF:
{
@@ -5314,8 +5548,8 @@ appendAttributeValue(XML_Parser parser, const ENCODING *enc, XML_Bool isCdata,
int i;
int n = XmlCharRefNumber(enc, ptr);
if (n < 0) {
- if (enc == encoding)
- eventPtr = ptr;
+ if (enc == parser->m_encoding)
+ parser->m_eventPtr = ptr;
return XML_ERROR_BAD_CHAR_REF;
}
if (!isCdata
@@ -5323,11 +5557,15 @@ appendAttributeValue(XML_Parser parser, const ENCODING *enc, XML_Bool isCdata,
&& (poolLength(pool) == 0 || poolLastChar(pool) == 0x20))
break;
n = XmlEncode(n, (ICHAR *)buf);
- if (!n) {
- if (enc == encoding)
- eventPtr = ptr;
- return XML_ERROR_BAD_CHAR_REF;
- }
+ /* The XmlEncode() functions can never return 0 here. That
+ * error return happens if the code point passed in is either
+ * negative or greater than or equal to 0x110000. The
+ * XmlCharRefNumber() functions will all return a number
+ * strictly less than 0x110000 or a negative value if an error
+ * occurred. The negative value is intercepted above, so
+ * XmlEncode() is never passed a value it might return an
+ * error for.
+ */
for (i = 0; i < n; i++) {
if (!poolAppendChar(pool, buf[i]))
return XML_ERROR_NO_MEMORY;
@@ -5361,25 +5599,25 @@ appendAttributeValue(XML_Parser parser, const ENCODING *enc, XML_Bool isCdata,
return XML_ERROR_NO_MEMORY;
break;
}
- name = poolStoreString(&temp2Pool, enc,
+ name = poolStoreString(&parser->m_temp2Pool, enc,
ptr + enc->minBytesPerChar,
next - enc->minBytesPerChar);
if (!name)
return XML_ERROR_NO_MEMORY;
entity = (ENTITY *)lookup(parser, &dtd->generalEntities, name, 0);
- poolDiscard(&temp2Pool);
+ poolDiscard(&parser->m_temp2Pool);
/* First, determine if a check for an existing declaration is needed;
if yes, check that the entity exists, and that it is internal.
*/
if (pool == &dtd->pool) /* are we called from prolog? */
checkEntityDecl =
#ifdef XML_DTD
- prologState.documentEntity &&
+ parser->m_prologState.documentEntity &&
#endif /* XML_DTD */
(dtd->standalone
- ? !openInternalEntities
+ ? !parser->m_openInternalEntities
: !dtd->hasParamEntityRefs);
- else /* if (pool == &tempPool): we are called from content */
+ else /* if (pool == &parser->m_tempPool): we are called from content */
checkEntityDecl = !dtd->hasParamEntityRefs || dtd->standalone;
if (checkEntityDecl) {
if (!entity)
@@ -5389,37 +5627,55 @@ appendAttributeValue(XML_Parser parser, const ENCODING *enc, XML_Bool isCdata,
}
else if (!entity) {
/* Cannot report skipped entity here - see comments on
- skippedEntityHandler.
- if (skippedEntityHandler)
- skippedEntityHandler(handlerArg, name, 0);
+ parser->m_skippedEntityHandler.
+ if (parser->m_skippedEntityHandler)
+ parser->m_skippedEntityHandler(parser->m_handlerArg, name, 0);
*/
/* Cannot call the default handler because this would be
out of sync with the call to the startElementHandler.
- if ((pool == &tempPool) && defaultHandler)
+ if ((pool == &parser->m_tempPool) && parser->m_defaultHandler)
reportDefault(parser, enc, ptr, next);
*/
break;
}
if (entity->open) {
- if (enc == encoding)
- eventPtr = ptr;
+ if (enc == parser->m_encoding) {
+ /* It does not appear that this line can be executed.
+ *
+ * The "if (entity->open)" check catches recursive entity
+ * definitions. In order to be called with an open
+ * entity, it must have gone through this code before and
+ * been through the recursive call to
+ * appendAttributeValue() some lines below. That call
+ * sets the local encoding ("enc") to the parser's
+ * internal encoding (internal_utf8 or internal_utf16),
+ * which can never be the same as the principle encoding.
+ * It doesn't appear there is another code path that gets
+ * here with entity->open being TRUE.
+ *
+ * Since it is not certain that this logic is watertight,
+ * we keep the line and merely exclude it from coverage
+ * tests.
+ */
+ parser->m_eventPtr = ptr; /* LCOV_EXCL_LINE */
+ }
return XML_ERROR_RECURSIVE_ENTITY_REF;
}
if (entity->notation) {
- if (enc == encoding)
- eventPtr = ptr;
+ if (enc == parser->m_encoding)
+ parser->m_eventPtr = ptr;
return XML_ERROR_BINARY_ENTITY_REF;
}
if (!entity->textPtr) {
- if (enc == encoding)
- eventPtr = ptr;
+ if (enc == parser->m_encoding)
+ parser->m_eventPtr = ptr;
return XML_ERROR_ATTRIBUTE_EXTERNAL_ENTITY_REF;
}
else {
enum XML_Error result;
const XML_Char *textEnd = entity->textPtr + entity->textLen;
entity->open = XML_TRUE;
- result = appendAttributeValue(parser, internalEncoding, isCdata,
+ result = appendAttributeValue(parser, parser->m_internalEncoding, isCdata,
(char *)entity->textPtr,
(char *)textEnd, pool);
entity->open = XML_FALSE;
@@ -5429,9 +5685,21 @@ appendAttributeValue(XML_Parser parser, const ENCODING *enc, XML_Bool isCdata,
}
break;
default:
- if (enc == encoding)
- eventPtr = ptr;
+ /* The only token returned by XmlAttributeValueTok() that does
+ * not have an explicit case here is XML_TOK_PARTIAL_CHAR.
+ * Getting that would require an entity name to contain an
+ * incomplete XML character (e.g. \xE2\x82); however previous
+ * tokenisers will have already recognised and rejected such
+ * names before XmlAttributeValueTok() gets a look-in. This
+ * default case should be retained as a safety net, but the code
+ * excluded from coverage tests.
+ *
+ * LCOV_EXCL_START
+ */
+ if (enc == parser->m_encoding)
+ parser->m_eventPtr = ptr;
return XML_ERROR_UNEXPECTED_STATE;
+ /* LCOV_EXCL_STOP */
}
ptr = next;
}
@@ -5444,12 +5712,12 @@ storeEntityValue(XML_Parser parser,
const char *entityTextPtr,
const char *entityTextEnd)
{
- DTD * const dtd = _dtd; /* save one level of indirection */
+ DTD * const dtd = parser->m_dtd; /* save one level of indirection */
STRING_POOL *pool = &(dtd->entityValuePool);
enum XML_Error result = XML_ERROR_NONE;
#ifdef XML_DTD
- int oldInEntityValue = prologState.inEntityValue;
- prologState.inEntityValue = 1;
+ int oldInEntityValue = parser->m_prologState.inEntityValue;
+ parser->m_prologState.inEntityValue = 1;
#endif /* XML_DTD */
/* never return Null for the value argument in EntityDeclHandler,
since this would indicate an external entity; therefore we
@@ -5465,10 +5733,10 @@ storeEntityValue(XML_Parser parser,
switch (tok) {
case XML_TOK_PARAM_ENTITY_REF:
#ifdef XML_DTD
- if (isParamEntity || enc != encoding) {
+ if (parser->m_isParamEntity || enc != parser->m_encoding) {
const XML_Char *name;
ENTITY *entity;
- name = poolStoreString(&tempPool, enc,
+ name = poolStoreString(&parser->m_tempPool, enc,
entityTextPtr + enc->minBytesPerChar,
next - enc->minBytesPerChar);
if (!name) {
@@ -5476,28 +5744,28 @@ storeEntityValue(XML_Parser parser,
goto endEntityValue;
}
entity = (ENTITY *)lookup(parser, &dtd->paramEntities, name, 0);
- poolDiscard(&tempPool);
+ poolDiscard(&parser->m_tempPool);
if (!entity) {
/* not a well-formedness error - see XML 1.0: WFC Entity Declared */
/* cannot report skipped entity here - see comments on
- skippedEntityHandler
- if (skippedEntityHandler)
- skippedEntityHandler(handlerArg, name, 0);
+ parser->m_skippedEntityHandler
+ if (parser->m_skippedEntityHandler)
+ parser->m_skippedEntityHandler(parser->m_handlerArg, name, 0);
*/
dtd->keepProcessing = dtd->standalone;
goto endEntityValue;
}
if (entity->open) {
- if (enc == encoding)
- eventPtr = entityTextPtr;
+ if (enc == parser->m_encoding)
+ parser->m_eventPtr = entityTextPtr;
result = XML_ERROR_RECURSIVE_ENTITY_REF;
goto endEntityValue;
}
if (entity->systemId) {
- if (externalEntityRefHandler) {
+ if (parser->m_externalEntityRefHandler) {
dtd->paramEntityRead = XML_FALSE;
entity->open = XML_TRUE;
- if (!externalEntityRefHandler(externalEntityRefHandlerArg,
+ if (!parser->m_externalEntityRefHandler(parser->m_externalEntityRefHandlerArg,
0,
entity->base,
entity->systemId,
@@ -5516,7 +5784,7 @@ storeEntityValue(XML_Parser parser,
else {
entity->open = XML_TRUE;
result = storeEntityValue(parser,
- internalEncoding,
+ parser->m_internalEncoding,
(char *)entity->textPtr,
(char *)(entity->textPtr
+ entity->textLen));
@@ -5529,7 +5797,7 @@ storeEntityValue(XML_Parser parser,
#endif /* XML_DTD */
/* In the internal subset, PE references are not legal
within markup declarations, e.g entity values in this case. */
- eventPtr = entityTextPtr;
+ parser->m_eventPtr = entityTextPtr;
result = XML_ERROR_PARAM_ENTITY_REF;
goto endEntityValue;
case XML_TOK_NONE:
@@ -5558,18 +5826,21 @@ storeEntityValue(XML_Parser parser,
int i;
int n = XmlCharRefNumber(enc, entityTextPtr);
if (n < 0) {
- if (enc == encoding)
- eventPtr = entityTextPtr;
+ if (enc == parser->m_encoding)
+ parser->m_eventPtr = entityTextPtr;
result = XML_ERROR_BAD_CHAR_REF;
goto endEntityValue;
}
n = XmlEncode(n, (ICHAR *)buf);
- if (!n) {
- if (enc == encoding)
- eventPtr = entityTextPtr;
- result = XML_ERROR_BAD_CHAR_REF;
- goto endEntityValue;
- }
+ /* The XmlEncode() functions can never return 0 here. That
+ * error return happens if the code point passed in is either
+ * negative or greater than or equal to 0x110000. The
+ * XmlCharRefNumber() functions will all return a number
+ * strictly less than 0x110000 or a negative value if an error
+ * occurred. The negative value is intercepted above, so
+ * XmlEncode() is never passed a value it might return an
+ * error for.
+ */
for (i = 0; i < n; i++) {
if (pool->end == pool->ptr && !poolGrow(pool)) {
result = XML_ERROR_NO_MEMORY;
@@ -5580,26 +5851,34 @@ storeEntityValue(XML_Parser parser,
}
break;
case XML_TOK_PARTIAL:
- if (enc == encoding)
- eventPtr = entityTextPtr;
+ if (enc == parser->m_encoding)
+ parser->m_eventPtr = entityTextPtr;
result = XML_ERROR_INVALID_TOKEN;
goto endEntityValue;
case XML_TOK_INVALID:
- if (enc == encoding)
- eventPtr = next;
+ if (enc == parser->m_encoding)
+ parser->m_eventPtr = next;
result = XML_ERROR_INVALID_TOKEN;
goto endEntityValue;
default:
- if (enc == encoding)
- eventPtr = entityTextPtr;
+ /* This default case should be unnecessary -- all the tokens
+ * that XmlEntityValueTok() can return have their own explicit
+ * cases -- but should be retained for safety. We do however
+ * exclude it from the coverage statistics.
+ *
+ * LCOV_EXCL_START
+ */
+ if (enc == parser->m_encoding)
+ parser->m_eventPtr = entityTextPtr;
result = XML_ERROR_UNEXPECTED_STATE;
goto endEntityValue;
+ /* LCOV_EXCL_STOP */
}
entityTextPtr = next;
}
endEntityValue:
#ifdef XML_DTD
- prologState.inEntityValue = oldInEntityValue;
+ parser->m_prologState.inEntityValue = oldInEntityValue;
#endif /* XML_DTD */
return result;
}
@@ -5634,25 +5913,25 @@ reportProcessingInstruction(XML_Parser parser, const ENCODING *enc,
const XML_Char *target;
XML_Char *data;
const char *tem;
- if (!processingInstructionHandler) {
- if (defaultHandler)
+ if (!parser->m_processingInstructionHandler) {
+ if (parser->m_defaultHandler)
reportDefault(parser, enc, start, end);
return 1;
}
start += enc->minBytesPerChar * 2;
tem = start + XmlNameLength(enc, start);
- target = poolStoreString(&tempPool, enc, start, tem);
+ target = poolStoreString(&parser->m_tempPool, enc, start, tem);
if (!target)
return 0;
- poolFinish(&tempPool);
- data = poolStoreString(&tempPool, enc,
+ poolFinish(&parser->m_tempPool);
+ data = poolStoreString(&parser->m_tempPool, enc,
XmlSkipS(enc, tem),
end - enc->minBytesPerChar*2);
if (!data)
return 0;
normalizeLines(data);
- processingInstructionHandler(handlerArg, target, data);
- poolClear(&tempPool);
+ parser->m_processingInstructionHandler(parser->m_handlerArg, target, data);
+ poolClear(&parser->m_tempPool);
return 1;
}
@@ -5661,20 +5940,20 @@ reportComment(XML_Parser parser, const ENCODING *enc,
const char *start, const char *end)
{
XML_Char *data;
- if (!commentHandler) {
- if (defaultHandler)
+ if (!parser->m_commentHandler) {
+ if (parser->m_defaultHandler)
reportDefault(parser, enc, start, end);
return 1;
}
- data = poolStoreString(&tempPool,
+ data = poolStoreString(&parser->m_tempPool,
enc,
start + enc->minBytesPerChar * 4,
end - enc->minBytesPerChar * 3);
if (!data)
return 0;
normalizeLines(data);
- commentHandler(handlerArg, data);
- poolClear(&tempPool);
+ parser->m_commentHandler(parser->m_handlerArg, data);
+ poolClear(&parser->m_tempPool);
return 1;
}
@@ -5686,24 +5965,41 @@ reportDefault(XML_Parser parser, const ENCODING *enc,
enum XML_Convert_Result convert_res;
const char **eventPP;
const char **eventEndPP;
- if (enc == encoding) {
- eventPP = &eventPtr;
- eventEndPP = &eventEndPtr;
+ if (enc == parser->m_encoding) {
+ eventPP = &parser->m_eventPtr;
+ eventEndPP = &parser->m_eventEndPtr;
}
else {
- eventPP = &(openInternalEntities->internalEventPtr);
- eventEndPP = &(openInternalEntities->internalEventEndPtr);
+ /* To get here, two things must be true; the parser must be
+ * using a character encoding that is not the same as the
+ * encoding passed in, and the encoding passed in must need
+ * conversion to the internal format (UTF-8 unless XML_UNICODE
+ * is defined). The only occasions on which the encoding passed
+ * in is not the same as the parser's encoding are when it is
+ * the internal encoding (e.g. a previously defined parameter
+ * entity, already converted to internal format). This by
+ * definition doesn't need conversion, so the whole branch never
+ * gets executed.
+ *
+ * For safety's sake we don't delete these lines and merely
+ * exclude them from coverage statistics.
+ *
+ * LCOV_EXCL_START
+ */
+ eventPP = &(parser->m_openInternalEntities->internalEventPtr);
+ eventEndPP = &(parser->m_openInternalEntities->internalEventEndPtr);
+ /* LCOV_EXCL_STOP */
}
do {
- ICHAR *dataPtr = (ICHAR *)dataBuf;
- convert_res = XmlConvert(enc, &s, end, &dataPtr, (ICHAR *)dataBufEnd);
+ ICHAR *dataPtr = (ICHAR *)parser->m_dataBuf;
+ convert_res = XmlConvert(enc, &s, end, &dataPtr, (ICHAR *)parser->m_dataBufEnd);
*eventEndPP = s;
- defaultHandler(handlerArg, dataBuf, (int)(dataPtr - (ICHAR *)dataBuf));
+ parser->m_defaultHandler(parser->m_handlerArg, parser->m_dataBuf, (int)(dataPtr - (ICHAR *)parser->m_dataBuf));
*eventPP = s;
} while ((convert_res != XML_CONVERT_COMPLETED) && (convert_res != XML_CONVERT_INPUT_INCOMPLETE));
}
else
- defaultHandler(handlerArg, (XML_Char *)s, (int)((XML_Char *)end - (XML_Char *)s));
+ parser->m_defaultHandler(parser->m_handlerArg, (XML_Char *)s, (int)((XML_Char *)end - (XML_Char *)s));
}
@@ -5725,16 +6021,18 @@ defineAttribute(ELEMENT_TYPE *type, ATTRIBUTE_ID *attId, XML_Bool isCdata,
if (type->nDefaultAtts == type->allocDefaultAtts) {
if (type->allocDefaultAtts == 0) {
type->allocDefaultAtts = 8;
- type->defaultAtts = (DEFAULT_ATTRIBUTE *)MALLOC(type->allocDefaultAtts
+ type->defaultAtts = (DEFAULT_ATTRIBUTE *)MALLOC(parser, type->allocDefaultAtts
* sizeof(DEFAULT_ATTRIBUTE));
- if (!type->defaultAtts)
+ if (!type->defaultAtts) {
+ type->allocDefaultAtts = 0;
return 0;
+ }
}
else {
DEFAULT_ATTRIBUTE *temp;
int count = type->allocDefaultAtts * 2;
temp = (DEFAULT_ATTRIBUTE *)
- REALLOC(type->defaultAtts, (count * sizeof(DEFAULT_ATTRIBUTE)));
+ REALLOC(parser, type->defaultAtts, (count * sizeof(DEFAULT_ATTRIBUTE)));
if (temp == NULL)
return 0;
type->allocDefaultAtts = count;
@@ -5754,7 +6052,7 @@ defineAttribute(ELEMENT_TYPE *type, ATTRIBUTE_ID *attId, XML_Bool isCdata,
static int
setElementTypePrefix(XML_Parser parser, ELEMENT_TYPE *elementType)
{
- DTD * const dtd = _dtd; /* save one level of indirection */
+ DTD * const dtd = parser->m_dtd; /* save one level of indirection */
const XML_Char *name;
for (name = elementType->name; *name; name++) {
if (*name == XML_T(ASCII_COLON)) {
@@ -5775,7 +6073,7 @@ setElementTypePrefix(XML_Parser parser, ELEMENT_TYPE *elementType)
else
poolDiscard(&dtd->pool);
elementType->prefix = prefix;
-
+ break;
}
}
return 1;
@@ -5785,7 +6083,7 @@ static ATTRIBUTE_ID *
getAttributeId(XML_Parser parser, const ENCODING *enc,
const char *start, const char *end)
{
- DTD * const dtd = _dtd; /* save one level of indirection */
+ DTD * const dtd = parser->m_dtd; /* save one level of indirection */
ATTRIBUTE_ID *id;
const XML_Char *name;
if (!poolAppendChar(&dtd->pool, XML_T('\0')))
@@ -5802,7 +6100,7 @@ getAttributeId(XML_Parser parser, const ENCODING *enc,
poolDiscard(&dtd->pool);
else {
poolFinish(&dtd->pool);
- if (!ns)
+ if (!parser->m_ns)
;
else if (name[0] == XML_T(ASCII_x)
&& name[1] == XML_T(ASCII_m)
@@ -5849,21 +6147,42 @@ getAttributeId(XML_Parser parser, const ENCODING *enc,
static const XML_Char *
getContext(XML_Parser parser)
{
- DTD * const dtd = _dtd; /* save one level of indirection */
+ DTD * const dtd = parser->m_dtd; /* save one level of indirection */
HASH_TABLE_ITER iter;
XML_Bool needSep = XML_FALSE;
if (dtd->defaultPrefix.binding) {
int i;
int len;
- if (!poolAppendChar(&tempPool, XML_T(ASCII_EQUALS)))
+ if (!poolAppendChar(&parser->m_tempPool, XML_T(ASCII_EQUALS)))
return NULL;
len = dtd->defaultPrefix.binding->uriLen;
- if (namespaceSeparator)
+ if (parser->m_namespaceSeparator)
len--;
- for (i = 0; i < len; i++)
- if (!poolAppendChar(&tempPool, dtd->defaultPrefix.binding->uri[i]))
- return NULL;
+ for (i = 0; i < len; i++) {
+ if (!poolAppendChar(&parser->m_tempPool, dtd->defaultPrefix.binding->uri[i])) {
+ /* Because of memory caching, I don't believe this line can be
+ * executed.
+ *
+ * This is part of a loop copying the default prefix binding
+ * URI into the parser's temporary string pool. Previously,
+ * that URI was copied into the same string pool, with a
+ * terminating NUL character, as part of setContext(). When
+ * the pool was cleared, that leaves a block definitely big
+ * enough to hold the URI on the free block list of the pool.
+ * The URI copy in getContext() therefore cannot run out of
+ * memory.
+ *
+ * If the pool is used between the setContext() and
+ * getContext() calls, the worst it can do is leave a bigger
+ * block on the front of the free list. Given that this is
+ * all somewhat inobvious and program logic can be changed, we
+ * don't delete the line but we do exclude it from the test
+ * coverage statistics.
+ */
+ return NULL; /* LCOV_EXCL_LINE */
+ }
+ }
needSep = XML_TRUE;
}
@@ -5875,20 +6194,27 @@ getContext(XML_Parser parser)
PREFIX *prefix = (PREFIX *)hashTableIterNext(&iter);
if (!prefix)
break;
- if (!prefix->binding)
- continue;
- if (needSep && !poolAppendChar(&tempPool, CONTEXT_SEP))
+ if (!prefix->binding) {
+ /* This test appears to be (justifiable) paranoia. There does
+ * not seem to be a way of injecting a prefix without a binding
+ * that doesn't get errored long before this function is called.
+ * The test should remain for safety's sake, so we instead
+ * exclude the following line from the coverage statistics.
+ */
+ continue; /* LCOV_EXCL_LINE */
+ }
+ if (needSep && !poolAppendChar(&parser->m_tempPool, CONTEXT_SEP))
return NULL;
for (s = prefix->name; *s; s++)
- if (!poolAppendChar(&tempPool, *s))
+ if (!poolAppendChar(&parser->m_tempPool, *s))
return NULL;
- if (!poolAppendChar(&tempPool, XML_T(ASCII_EQUALS)))
+ if (!poolAppendChar(&parser->m_tempPool, XML_T(ASCII_EQUALS)))
return NULL;
len = prefix->binding->uriLen;
- if (namespaceSeparator)
+ if (parser->m_namespaceSeparator)
len--;
for (i = 0; i < len; i++)
- if (!poolAppendChar(&tempPool, prefix->binding->uri[i]))
+ if (!poolAppendChar(&parser->m_tempPool, prefix->binding->uri[i]))
return NULL;
needSep = XML_TRUE;
}
@@ -5902,73 +6228,73 @@ getContext(XML_Parser parser)
break;
if (!e->open)
continue;
- if (needSep && !poolAppendChar(&tempPool, CONTEXT_SEP))
+ if (needSep && !poolAppendChar(&parser->m_tempPool, CONTEXT_SEP))
return NULL;
for (s = e->name; *s; s++)
- if (!poolAppendChar(&tempPool, *s))
+ if (!poolAppendChar(&parser->m_tempPool, *s))
return 0;
needSep = XML_TRUE;
}
- if (!poolAppendChar(&tempPool, XML_T('\0')))
+ if (!poolAppendChar(&parser->m_tempPool, XML_T('\0')))
return NULL;
- return tempPool.start;
+ return parser->m_tempPool.start;
}
static XML_Bool
setContext(XML_Parser parser, const XML_Char *context)
{
- DTD * const dtd = _dtd; /* save one level of indirection */
+ DTD * const dtd = parser->m_dtd; /* save one level of indirection */
const XML_Char *s = context;
while (*context != XML_T('\0')) {
if (*s == CONTEXT_SEP || *s == XML_T('\0')) {
ENTITY *e;
- if (!poolAppendChar(&tempPool, XML_T('\0')))
+ if (!poolAppendChar(&parser->m_tempPool, XML_T('\0')))
return XML_FALSE;
- e = (ENTITY *)lookup(parser, &dtd->generalEntities, poolStart(&tempPool), 0);
+ e = (ENTITY *)lookup(parser, &dtd->generalEntities, poolStart(&parser->m_tempPool), 0);
if (e)
e->open = XML_TRUE;
if (*s != XML_T('\0'))
s++;
context = s;
- poolDiscard(&tempPool);
+ poolDiscard(&parser->m_tempPool);
}
else if (*s == XML_T(ASCII_EQUALS)) {
PREFIX *prefix;
- if (poolLength(&tempPool) == 0)
+ if (poolLength(&parser->m_tempPool) == 0)
prefix = &dtd->defaultPrefix;
else {
- if (!poolAppendChar(&tempPool, XML_T('\0')))
+ if (!poolAppendChar(&parser->m_tempPool, XML_T('\0')))
return XML_FALSE;
- prefix = (PREFIX *)lookup(parser, &dtd->prefixes, poolStart(&tempPool),
+ prefix = (PREFIX *)lookup(parser, &dtd->prefixes, poolStart(&parser->m_tempPool),
sizeof(PREFIX));
if (!prefix)
return XML_FALSE;
- if (prefix->name == poolStart(&tempPool)) {
+ if (prefix->name == poolStart(&parser->m_tempPool)) {
prefix->name = poolCopyString(&dtd->pool, prefix->name);
if (!prefix->name)
return XML_FALSE;
}
- poolDiscard(&tempPool);
+ poolDiscard(&parser->m_tempPool);
}
for (context = s + 1;
*context != CONTEXT_SEP && *context != XML_T('\0');
context++)
- if (!poolAppendChar(&tempPool, *context))
+ if (!poolAppendChar(&parser->m_tempPool, *context))
return XML_FALSE;
- if (!poolAppendChar(&tempPool, XML_T('\0')))
+ if (!poolAppendChar(&parser->m_tempPool, XML_T('\0')))
return XML_FALSE;
- if (addBinding(parser, prefix, NULL, poolStart(&tempPool),
- &inheritedBindings) != XML_ERROR_NONE)
+ if (addBinding(parser, prefix, NULL, poolStart(&parser->m_tempPool),
+ &parser->m_inheritedBindings) != XML_ERROR_NONE)
return XML_FALSE;
- poolDiscard(&tempPool);
+ poolDiscard(&parser->m_tempPool);
if (*context != XML_T('\0'))
++context;
s = context;
}
else {
- if (!poolAppendChar(&tempPool, *s))
+ if (!poolAppendChar(&parser->m_tempPool, *s))
return XML_FALSE;
s++;
}
@@ -6333,7 +6659,6 @@ hash(XML_Parser parser, KEY s)
{
struct siphash state;
struct sipkey key;
- (void)sip_tobin;
(void)sip24_valid;
copy_salt_to_sipkey(parser, &key);
sip24_init(&state, &key);
@@ -6547,8 +6872,20 @@ poolCopyString(STRING_POOL *pool, const XML_Char *s)
static const XML_Char *
poolCopyStringN(STRING_POOL *pool, const XML_Char *s, int n)
{
- if (!pool->ptr && !poolGrow(pool))
- return NULL;
+ if (!pool->ptr && !poolGrow(pool)) {
+ /* The following line is unreachable given the current usage of
+ * poolCopyStringN(). Currently it is called from exactly one
+ * place to copy the text of a simple general entity. By that
+ * point, the name of the entity is already stored in the pool, so
+ * pool->ptr cannot be NULL.
+ *
+ * If poolCopyStringN() is used elsewhere as it well might be,
+ * this line may well become executable again. Regardless, this
+ * sort of check shouldn't be removed lightly, so we just exclude
+ * it from the coverage statistics.
+ */
+ return NULL; /* LCOV_EXCL_LINE */
+ }
for (; n > 0; --n, s++) {
if (!poolAppendChar(pool, *s))
return NULL;
@@ -6641,8 +6978,19 @@ poolGrow(STRING_POOL *pool)
int blockSize = (int)((unsigned)(pool->end - pool->start)*2U);
size_t bytesToAllocate;
- if (blockSize < 0)
- return XML_FALSE;
+ /* NOTE: Needs to be calculated prior to calling `realloc`
+ to avoid dangling pointers: */
+ const ptrdiff_t offsetInsideBlock = pool->ptr - pool->start;
+
+ if (blockSize < 0) {
+ /* This condition traps a situation where either more than
+ * INT_MAX/2 bytes have already been allocated. This isn't
+ * readily testable, since it is unlikely that an average
+ * machine will have that much memory, so we exclude it from the
+ * coverage statistics.
+ */
+ return XML_FALSE; /* LCOV_EXCL_LINE */
+ }
bytesToAllocate = poolBytesToAllocateFor(blockSize);
if (bytesToAllocate == 0)
@@ -6654,7 +7002,7 @@ poolGrow(STRING_POOL *pool)
return XML_FALSE;
pool->blocks = temp;
pool->blocks->size = blockSize;
- pool->ptr = pool->blocks->s + (pool->ptr - pool->start);
+ pool->ptr = pool->blocks->s + offsetInsideBlock;
pool->start = pool->blocks->s;
pool->end = pool->start + blockSize;
}
@@ -6663,8 +7011,18 @@ poolGrow(STRING_POOL *pool)
int blockSize = (int)(pool->end - pool->start);
size_t bytesToAllocate;
- if (blockSize < 0)
- return XML_FALSE;
+ if (blockSize < 0) {
+ /* This condition traps a situation where either more than
+ * INT_MAX bytes have already been allocated (which is prevented
+ * by various pieces of program logic, not least this one, never
+ * mind the unlikelihood of actually having that much memory) or
+ * the pool control fields have been corrupted (which could
+ * conceivably happen in an extremely buggy user handler
+ * function). Either way it isn't readily testable, so we
+ * exclude it from the coverage statistics.
+ */
+ return XML_FALSE; /* LCOV_EXCL_LINE */
+ }
if (blockSize < INIT_BLOCK_SIZE)
blockSize = INIT_BLOCK_SIZE;
@@ -6699,12 +7057,12 @@ poolGrow(STRING_POOL *pool)
static int FASTCALL
nextScaffoldPart(XML_Parser parser)
{
- DTD * const dtd = _dtd; /* save one level of indirection */
+ DTD * const dtd = parser->m_dtd; /* save one level of indirection */
CONTENT_SCAFFOLD * me;
int next;
if (!dtd->scaffIndex) {
- dtd->scaffIndex = (int *)MALLOC(groupSize * sizeof(int));
+ dtd->scaffIndex = (int *)MALLOC(parser, parser->m_groupSize * sizeof(int));
if (!dtd->scaffIndex)
return -1;
dtd->scaffIndex[0] = 0;
@@ -6714,13 +7072,13 @@ nextScaffoldPart(XML_Parser parser)
CONTENT_SCAFFOLD *temp;
if (dtd->scaffold) {
temp = (CONTENT_SCAFFOLD *)
- REALLOC(dtd->scaffold, dtd->scaffSize * 2 * sizeof(CONTENT_SCAFFOLD));
+ REALLOC(parser, dtd->scaffold, dtd->scaffSize * 2 * sizeof(CONTENT_SCAFFOLD));
if (temp == NULL)
return -1;
dtd->scaffSize *= 2;
}
else {
- temp = (CONTENT_SCAFFOLD *)MALLOC(INIT_SCAFFOLD_ELEMENTS
+ temp = (CONTENT_SCAFFOLD *)MALLOC(parser, INIT_SCAFFOLD_ELEMENTS
* sizeof(CONTENT_SCAFFOLD));
if (temp == NULL)
return -1;
@@ -6751,7 +7109,7 @@ build_node(XML_Parser parser,
XML_Content **contpos,
XML_Char **strpos)
{
- DTD * const dtd = _dtd; /* save one level of indirection */
+ DTD * const dtd = parser->m_dtd; /* save one level of indirection */
dest->type = dtd->scaffold[src_node].type;
dest->quant = dtd->scaffold[src_node].quant;
if (dest->type == XML_CTYPE_NAME) {
@@ -6785,14 +7143,14 @@ build_node(XML_Parser parser,
static XML_Content *
build_model (XML_Parser parser)
{
- DTD * const dtd = _dtd; /* save one level of indirection */
+ DTD * const dtd = parser->m_dtd; /* save one level of indirection */
XML_Content *ret;
XML_Content *cpos;
XML_Char * str;
int allocsize = (dtd->scaffCount * sizeof(XML_Content)
+ (dtd->contentStringLen * sizeof(XML_Char)));
- ret = (XML_Content *)MALLOC(allocsize);
+ ret = (XML_Content *)MALLOC(parser, allocsize);
if (!ret)
return NULL;
@@ -6809,7 +7167,7 @@ getElementType(XML_Parser parser,
const char *ptr,
const char *end)
{
- DTD * const dtd = _dtd; /* save one level of indirection */
+ DTD * const dtd = parser->m_dtd; /* save one level of indirection */
const XML_Char *name = poolStoreString(&dtd->pool, enc, ptr, end);
ELEMENT_TYPE *ret;
@@ -6827,3 +7185,26 @@ getElementType(XML_Parser parser,
}
return ret;
}
+
+static XML_Char *
+copyString(const XML_Char *s,
+ const XML_Memory_Handling_Suite *memsuite)
+{
+ int charsRequired = 0;
+ XML_Char *result;
+
+ /* First determine how long the string is */
+ while (s[charsRequired] != 0) {
+ charsRequired++;
+ }
+ /* Include the terminator */
+ charsRequired++;
+
+ /* Now allocate space for the copy */
+ result = memsuite->malloc_fcn(charsRequired * sizeof(XML_Char));
+ if (result == NULL)
+ return NULL;
+ /* Copy the original into place */
+ memcpy(result, s, charsRequired * sizeof(XML_Char));
+ return result;
+}
diff --git a/3rdParty/Expat/src/xmlrole.c b/3rdParty/Expat/src/xmlrole.c
index a7c5630..708507d 100644
--- a/3rdParty/Expat/src/xmlrole.c
+++ b/3rdParty/Expat/src/xmlrole.c
@@ -1,5 +1,33 @@
-/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd
- See the file COPYING for copying permission.
+/*
+ __ __ _
+ ___\ \/ /_ __ __ _| |_
+ / _ \\ /| '_ \ / _` | __|
+ | __// \| |_) | (_| | |_
+ \___/_/\_\ .__/ \__,_|\__|
+ |_| XML parser
+
+ Copyright (c) 1997-2000 Thai Open Source Software Center Ltd
+ Copyright (c) 2000-2017 Expat development team
+ Licensed under the MIT license:
+
+ Permission is hereby granted, free of charge, to any person obtaining
+ a copy of this software and associated documentation files (the
+ "Software"), to deal in the Software without restriction, including
+ without limitation the rights to use, copy, modify, merge, publish,
+ distribute, sublicense, and/or sell copies of the Software, and to permit
+ persons to whom the Software is furnished to do so, subject to the
+ following conditions:
+
+ The above copyright notice and this permission notice shall be included
+ in all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+ NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+ OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+ USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
#include <stddef.h>
@@ -170,7 +198,14 @@ prolog1(PROLOG_STATE *state,
case XML_TOK_COMMENT:
return XML_ROLE_COMMENT;
case XML_TOK_BOM:
- return XML_ROLE_NONE;
+ /* This case can never arise. To reach this role function, the
+ * parse must have passed through prolog0 and therefore have had
+ * some form of input, even if only a space. At that point, a
+ * byte order mark is no longer a valid character (though
+ * technically it should be interpreted as a non-breaking space),
+ * so will be rejected by the tokenizing stages.
+ */
+ return XML_ROLE_NONE; /* LCOV_EXCL_LINE */
case XML_TOK_DECL_OPEN:
if (!XmlNameMatchesAscii(enc,
ptr + 2 * MIN_BYTES_PER_CHAR(enc),
@@ -1285,6 +1320,26 @@ declClose(PROLOG_STATE *state,
return common(state, tok);
}
+/* This function will only be invoked if the internal logic of the
+ * parser has broken down. It is used in two cases:
+ *
+ * 1: When the XML prolog has been finished. At this point the
+ * processor (the parser level above these role handlers) should
+ * switch from prologProcessor to contentProcessor and reinitialise
+ * the handler function.
+ *
+ * 2: When an error has been detected (via common() below). At this
+ * point again the processor should be switched to errorProcessor,
+ * which will never call a handler.
+ *
+ * The result of this is that error() can only be called if the
+ * processor switch failed to happen, which is an internal error and
+ * therefore we shouldn't be able to provoke it simply by using the
+ * library. It is a necessary backstop, however, so we merely exclude
+ * it from the coverage statistics.
+ *
+ * LCOV_EXCL_START
+ */
static int PTRCALL
error(PROLOG_STATE *UNUSED_P(state),
int UNUSED_P(tok),
@@ -1294,6 +1349,7 @@ error(PROLOG_STATE *UNUSED_P(state),
{
return XML_ROLE_NONE;
}
+/* LCOV_EXCL_STOP */
static int FASTCALL
common(PROLOG_STATE *state, int tok)
diff --git a/3rdParty/Expat/src/xmlrole.h b/3rdParty/Expat/src/xmlrole.h
index 4dd9f06..e5f048e 100644
--- a/3rdParty/Expat/src/xmlrole.h
+++ b/3rdParty/Expat/src/xmlrole.h
@@ -1,5 +1,33 @@
-/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd
- See the file COPYING for copying permission.
+/*
+ __ __ _
+ ___\ \/ /_ __ __ _| |_
+ / _ \\ /| '_ \ / _` | __|
+ | __// \| |_) | (_| | |_
+ \___/_/\_\ .__/ \__,_|\__|
+ |_| XML parser
+
+ Copyright (c) 1997-2000 Thai Open Source Software Center Ltd
+ Copyright (c) 2000-2017 Expat development team
+ Licensed under the MIT license:
+
+ Permission is hereby granted, free of charge, to any person obtaining
+ a copy of this software and associated documentation files (the
+ "Software"), to deal in the Software without restriction, including
+ without limitation the rights to use, copy, modify, merge, publish,
+ distribute, sublicense, and/or sell copies of the Software, and to permit
+ persons to whom the Software is furnished to do so, subject to the
+ following conditions:
+
+ The above copyright notice and this permission notice shall be included
+ in all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+ NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+ OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+ USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
#ifndef XmlRole_INCLUDED
diff --git a/3rdParty/Expat/src/xmltok.c b/3rdParty/Expat/src/xmltok.c
index cdf0720..6b415d8 100644
--- a/3rdParty/Expat/src/xmltok.c
+++ b/3rdParty/Expat/src/xmltok.c
@@ -1,8 +1,47 @@
-/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd
- See the file COPYING for copying permission.
+/*
+ __ __ _
+ ___\ \/ /_ __ __ _| |_
+ / _ \\ /| '_ \ / _` | __|
+ | __// \| |_) | (_| | |_
+ \___/_/\_\ .__/ \__,_|\__|
+ |_| XML parser
+
+ Copyright (c) 1997-2000 Thai Open Source Software Center Ltd
+ Copyright (c) 2000-2017 Expat development team
+ Licensed under the MIT license:
+
+ Permission is hereby granted, free of charge, to any person obtaining
+ a copy of this software and associated documentation files (the
+ "Software"), to deal in the Software without restriction, including
+ without limitation the rights to use, copy, modify, merge, publish,
+ distribute, sublicense, and/or sell copies of the Software, and to permit
+ persons to whom the Software is furnished to do so, subject to the
+ following conditions:
+
+ The above copyright notice and this permission notice shall be included
+ in all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+ NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+ OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+ USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
#include <stddef.h>
+#include <string.h> /* memcpy */
+
+#if defined(_MSC_VER) && (_MSC_VER <= 1700)
+ /* for vs2012/11.0/1700 and earlier Visual Studio compilers */
+# define bool int
+# define false 0
+# define true 1
+#else
+# include <stdbool.h>
+#endif
+
#ifdef _WIN32
#include "winconfig.h"
@@ -27,7 +66,6 @@
{ PREFIX(prologTok), PREFIX(contentTok), \
PREFIX(cdataSectionTok) IGNORE_SECTION_TOK_VTABLE }, \
{ PREFIX(attributeValueTok), PREFIX(entityValueTok) }, \
- PREFIX(sameName), \
PREFIX(nameMatchesAscii), \
PREFIX(nameLength), \
PREFIX(skipS), \
@@ -324,7 +362,7 @@ enum { /* UTF8_cvalN is value of masked first byte of N byte sequence */
};
void
-align_limit_to_full_utf8_characters(const char * from, const char ** fromLimRef)
+_INTERNAL_trim_to_complete_utf8_characters(const char * from, const char ** fromLimRef)
{
const char * fromLim = *fromLimRef;
size_t walked = 0;
@@ -363,22 +401,37 @@ utf8_toUtf8(const ENCODING *UNUSED_P(enc),
const char **fromP, const char *fromLim,
char **toP, const char *toLim)
{
- char *to;
- const char *from;
- const char *fromLimInitial = fromLim;
+ bool input_incomplete = false;
+ bool output_exhausted = false;
+
+ /* Avoid copying partial characters (due to limited space). */
+ const ptrdiff_t bytesAvailable = fromLim - *fromP;
+ const ptrdiff_t bytesStorable = toLim - *toP;
+ if (bytesAvailable > bytesStorable) {
+ fromLim = *fromP + bytesStorable;
+ output_exhausted = true;
+ }
- /* Avoid copying partial characters. */
- align_limit_to_full_utf8_characters(*fromP, &fromLim);
+ /* Avoid copying partial characters (from incomplete input). */
+ {
+ const char * const fromLimBefore = fromLim;
+ _INTERNAL_trim_to_complete_utf8_characters(*fromP, &fromLim);
+ if (fromLim < fromLimBefore) {
+ input_incomplete = true;
+ }
+ }
- for (to = *toP, from = *fromP; (from < fromLim) && (to < toLim); from++, to++)
- *to = *from;
- *fromP = from;
- *toP = to;
+ {
+ const ptrdiff_t bytesToCopy = fromLim - *fromP;
+ memcpy(*toP, *fromP, bytesToCopy);
+ *fromP += bytesToCopy;
+ *toP += bytesToCopy;
+ }
- if (fromLim < fromLimInitial)
- return XML_CONVERT_INPUT_INCOMPLETE;
- else if ((to == toLim) && (from < fromLim))
+ if (output_exhausted) /* needs to go first */
return XML_CONVERT_OUTPUT_EXHAUSTED;
+ else if (input_incomplete)
+ return XML_CONVERT_INPUT_INCOMPLETE;
else
return XML_CONVERT_COMPLETED;
}
@@ -1019,7 +1072,11 @@ streqci(const char *s1, const char *s2)
if (ASCII_a <= c1 && c1 <= ASCII_z)
c1 += ASCII_A - ASCII_a;
if (ASCII_a <= c2 && c2 <= ASCII_z)
- c2 += ASCII_A - ASCII_a;
+ /* The following line will never get executed. streqci() is
+ * only called from two places, both of which guarantee to put
+ * upper-case strings into s2.
+ */
+ c2 += ASCII_A - ASCII_a; /* LCOV_EXCL_LINE */
if (c1 != c2)
return 0;
if (!c1)
@@ -1291,7 +1348,7 @@ XmlUtf8Encode(int c, char *buf)
};
if (c < 0)
- return 0;
+ return 0; /* LCOV_EXCL_LINE: this case is always eliminated beforehand */
if (c < min2) {
buf[0] = (char)(c | UTF8_cval1);
return 1;
@@ -1314,7 +1371,7 @@ XmlUtf8Encode(int c, char *buf)
buf[3] = (char)((c & 0x3f) | 0x80);
return 4;
}
- return 0;
+ return 0; /* LCOV_EXCL_LINE: this case too is eliminated before calling */
}
int FASTCALL
@@ -1407,9 +1464,8 @@ unknown_toUtf8(const ENCODING *enc,
return XML_CONVERT_OUTPUT_EXHAUSTED;
(*fromP)++;
}
- do {
- *(*toP)++ = *utf8++;
- } while (--n != 0);
+ memcpy(*toP, utf8, n);
+ *toP += n;
}
}
@@ -1465,6 +1521,9 @@ XmlInitUnknownEncoding(void *mem,
else if (c < 0) {
if (c < -4)
return 0;
+ /* Multi-byte sequences need a converter function */
+ if (!convert)
+ return 0;
e->normal.type[i] = (unsigned char)(BT_LEAD2 - (c + 2));
e->utf8[i][0] = 0;
e->utf16[i] = 0;
diff --git a/3rdParty/Expat/src/xmltok.h b/3rdParty/Expat/src/xmltok.h
index 752007e..50926f3 100644
--- a/3rdParty/Expat/src/xmltok.h
+++ b/3rdParty/Expat/src/xmltok.h
@@ -1,5 +1,33 @@
-/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd
- See the file COPYING for copying permission.
+/*
+ __ __ _
+ ___\ \/ /_ __ __ _| |_
+ / _ \\ /| '_ \ / _` | __|
+ | __// \| |_) | (_| | |_
+ \___/_/\_\ .__/ \__,_|\__|
+ |_| XML parser
+
+ Copyright (c) 1997-2000 Thai Open Source Software Center Ltd
+ Copyright (c) 2000-2017 Expat development team
+ Licensed under the MIT license:
+
+ Permission is hereby granted, free of charge, to any person obtaining
+ a copy of this software and associated documentation files (the
+ "Software"), to deal in the Software without restriction, including
+ without limitation the rights to use, copy, modify, merge, publish,
+ distribute, sublicense, and/or sell copies of the Software, and to permit
+ persons to whom the Software is furnished to do so, subject to the
+ following conditions:
+
+ The above copyright notice and this permission notice shall be included
+ in all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+ NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+ OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+ USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
#ifndef XmlTok_INCLUDED
@@ -139,9 +167,6 @@ enum XML_Convert_Result {
struct encoding {
SCANNER scanners[XML_N_STATES];
SCANNER literalScanners[XML_N_LITERAL_TYPES];
- int (PTRCALL *sameName)(const ENCODING *,
- const char *,
- const char *);
int (PTRCALL *nameMatchesAscii)(const ENCODING *,
const char *,
const char *,
@@ -232,8 +257,6 @@ struct encoding {
#define XmlEntityValueTok(enc, ptr, end, nextTokPtr) \
XmlLiteralTok(enc, XML_ENTITY_VALUE_LITERAL, ptr, end, nextTokPtr)
-#define XmlSameName(enc, ptr1, ptr2) (((enc)->sameName)(enc, ptr1, ptr2))
-
#define XmlNameMatchesAscii(enc, ptr1, end1, ptr2) \
(((enc)->nameMatchesAscii)(enc, ptr1, end1, ptr2))
diff --git a/3rdParty/Expat/src/xmltok_impl.c b/3rdParty/Expat/src/xmltok_impl.c
index 5f779c0..4d9ae7d 100644
--- a/3rdParty/Expat/src/xmltok_impl.c
+++ b/3rdParty/Expat/src/xmltok_impl.c
@@ -1,8 +1,35 @@
-/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd
- See the file COPYING for copying permission.
+/* This file is included!
+ __ __ _
+ ___\ \/ /_ __ __ _| |_
+ / _ \\ /| '_ \ / _` | __|
+ | __// \| |_) | (_| | |_
+ \___/_/\_\ .__/ \__,_|\__|
+ |_| XML parser
+
+ Copyright (c) 1997-2000 Thai Open Source Software Center Ltd
+ Copyright (c) 2000-2017 Expat development team
+ Licensed under the MIT license:
+
+ Permission is hereby granted, free of charge, to any person obtaining
+ a copy of this software and associated documentation files (the
+ "Software"), to deal in the Software without restriction, including
+ without limitation the rights to use, copy, modify, merge, publish,
+ distribute, sublicense, and/or sell copies of the Software, and to permit
+ persons to whom the Software is furnished to do so, subject to the
+ following conditions:
+
+ The above copyright notice and this permission notice shall be included
+ in all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+ NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+ OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+ USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
-/* This file is included! */
#ifdef XML_TOK_IMPL_C
#ifndef IS_INVALID_CHAR
@@ -47,6 +74,7 @@
*nextTokPtr = ptr; \
return XML_TOK_INVALID; \
} \
+ /* fall through */ \
case BT_NMSTRT: \
case BT_HEX: \
case BT_DIGIT: \
@@ -75,6 +103,7 @@
*nextTokPtr = ptr; \
return XML_TOK_INVALID; \
} \
+ /* fall through */ \
case BT_NMSTRT: \
case BT_HEX: \
ptr += MINBPC(enc); \
@@ -575,7 +604,7 @@ PREFIX(scanAtts)(const ENCODING *enc, const char *ptr, const char *end,
return XML_TOK_INVALID;
}
}
- /* fall through */
+ /* fall through */
case BT_EQUALS:
{
int open;
@@ -1198,8 +1227,14 @@ PREFIX(attributeValueTok)(const ENCODING *enc, const char *ptr,
const char *start;
if (ptr >= end)
return XML_TOK_NONE;
- else if (! HAS_CHAR(enc, ptr, end))
- return XML_TOK_PARTIAL;
+ else if (! HAS_CHAR(enc, ptr, end)) {
+ /* This line cannot be executed. The incoming data has already
+ * been tokenized once, so incomplete characters like this have
+ * already been eliminated from the input. Retaining the paranoia
+ * check is still valuable, however.
+ */
+ return XML_TOK_PARTIAL; /* LCOV_EXCL_LINE */
+ }
start = ptr;
while (HAS_CHAR(enc, ptr, end)) {
switch (BYTE_TYPE(enc, ptr)) {
@@ -1258,8 +1293,14 @@ PREFIX(entityValueTok)(const ENCODING *enc, const char *ptr,
const char *start;
if (ptr >= end)
return XML_TOK_NONE;
- else if (! HAS_CHAR(enc, ptr, end))
- return XML_TOK_PARTIAL;
+ else if (! HAS_CHAR(enc, ptr, end)) {
+ /* This line cannot be executed. The incoming data has already
+ * been tokenized once, so incomplete characters like this have
+ * already been eliminated from the input. Retaining the paranoia
+ * check is still valuable, however.
+ */
+ return XML_TOK_PARTIAL; /* LCOV_EXCL_LINE */
+ }
start = ptr;
while (HAS_CHAR(enc, ptr, end)) {
switch (BYTE_TYPE(enc, ptr)) {
@@ -1403,6 +1444,7 @@ PREFIX(isPublicId)(const ENCODING *enc, const char *ptr, const char *end,
case BT_NMSTRT:
if (!(BYTE_TO_ASCII(enc, ptr) & ~0x7f))
break;
+ /* fall through */
default:
switch (BYTE_TO_ASCII(enc, ptr)) {
case 0x24: /* $ */
@@ -1615,76 +1657,18 @@ PREFIX(predefinedEntityName)(const ENCODING *UNUSED_P(enc), const char *ptr,
}
static int PTRCALL
-PREFIX(sameName)(const ENCODING *enc, const char *ptr1, const char *ptr2)
-{
- for (;;) {
- switch (BYTE_TYPE(enc, ptr1)) {
-#define LEAD_CASE(n) \
- case BT_LEAD ## n: \
- if (*ptr1++ != *ptr2++) \
- return 0;
- LEAD_CASE(4) LEAD_CASE(3) LEAD_CASE(2)
-#undef LEAD_CASE
- /* fall through */
- if (*ptr1++ != *ptr2++)
- return 0;
- break;
- case BT_NONASCII:
- case BT_NMSTRT:
-#ifdef XML_NS
- case BT_COLON:
-#endif
- case BT_HEX:
- case BT_DIGIT:
- case BT_NAME:
- case BT_MINUS:
- if (*ptr2++ != *ptr1++)
- return 0;
- if (MINBPC(enc) > 1) {
- if (*ptr2++ != *ptr1++)
- return 0;
- if (MINBPC(enc) > 2) {
- if (*ptr2++ != *ptr1++)
- return 0;
- if (MINBPC(enc) > 3) {
- if (*ptr2++ != *ptr1++)
- return 0;
- }
- }
- }
- break;
- default:
- if (MINBPC(enc) == 1 && *ptr1 == *ptr2)
- return 1;
- switch (BYTE_TYPE(enc, ptr2)) {
- case BT_LEAD2:
- case BT_LEAD3:
- case BT_LEAD4:
- case BT_NONASCII:
- case BT_NMSTRT:
-#ifdef XML_NS
- case BT_COLON:
-#endif
- case BT_HEX:
- case BT_DIGIT:
- case BT_NAME:
- case BT_MINUS:
- return 0;
- default:
- return 1;
- }
- }
- }
- /* not reached */
-}
-
-static int PTRCALL
PREFIX(nameMatchesAscii)(const ENCODING *UNUSED_P(enc), const char *ptr1,
const char *end1, const char *ptr2)
{
for (; *ptr2; ptr1 += MINBPC(enc), ptr2++) {
- if (end1 - ptr1 < MINBPC(enc))
- return 0;
+ if (end1 - ptr1 < MINBPC(enc)) {
+ /* This line cannot be executed. The incoming data has already
+ * been tokenized once, so incomplete characters like this have
+ * already been eliminated from the input. Retaining the
+ * paranoia check is still valuable, however.
+ */
+ return 0; /* LCOV_EXCL_LINE */
+ }
if (!CHAR_MATCHES(enc, ptr1, *ptr2))
return 0;
}
diff --git a/3rdParty/Expat/src/xmltok_impl.h b/3rdParty/Expat/src/xmltok_impl.h
index da0ea60..a6420f4 100644
--- a/3rdParty/Expat/src/xmltok_impl.h
+++ b/3rdParty/Expat/src/xmltok_impl.h
@@ -1,6 +1,33 @@
/*
-Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd
-See the file COPYING for copying permission.
+ __ __ _
+ ___\ \/ /_ __ __ _| |_
+ / _ \\ /| '_ \ / _` | __|
+ | __// \| |_) | (_| | |_
+ \___/_/\_\ .__/ \__,_|\__|
+ |_| XML parser
+
+ Copyright (c) 1997-2000 Thai Open Source Software Center Ltd
+ Copyright (c) 2000-2017 Expat development team
+ Licensed under the MIT license:
+
+ Permission is hereby granted, free of charge, to any person obtaining
+ a copy of this software and associated documentation files (the
+ "Software"), to deal in the Software without restriction, including
+ without limitation the rights to use, copy, modify, merge, publish,
+ distribute, sublicense, and/or sell copies of the Software, and to permit
+ persons to whom the Software is furnished to do so, subject to the
+ following conditions:
+
+ The above copyright notice and this permission notice shall be included
+ in all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+ NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+ OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+ USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
enum {
diff --git a/3rdParty/Expat/src/xmltok_ns.c b/3rdParty/Expat/src/xmltok_ns.c
index c3b88fd..23d31e8 100644
--- a/3rdParty/Expat/src/xmltok_ns.c
+++ b/3rdParty/Expat/src/xmltok_ns.c
@@ -1,8 +1,35 @@
-/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd
- See the file COPYING for copying permission.
+/* This file is included!
+ __ __ _
+ ___\ \/ /_ __ __ _| |_
+ / _ \\ /| '_ \ / _` | __|
+ | __// \| |_) | (_| | |_
+ \___/_/\_\ .__/ \__,_|\__|
+ |_| XML parser
+
+ Copyright (c) 1997-2000 Thai Open Source Software Center Ltd
+ Copyright (c) 2000-2017 Expat development team
+ Licensed under the MIT license:
+
+ Permission is hereby granted, free of charge, to any person obtaining
+ a copy of this software and associated documentation files (the
+ "Software"), to deal in the Software without restriction, including
+ without limitation the rights to use, copy, modify, merge, publish,
+ distribute, sublicense, and/or sell copies of the Software, and to permit
+ persons to whom the Software is furnished to do so, subject to the
+ following conditions:
+
+ The above copyright notice and this permission notice shall be included
+ in all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+ NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+ OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+ USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
-/* This file is included! */
#ifdef XML_TOK_NS_C
const ENCODING *
diff --git a/3rdParty/LibIDN/SConscript b/3rdParty/LibIDN/SConscript
index 90892b0..c99aff8 100644
--- a/3rdParty/LibIDN/SConscript
+++ b/3rdParty/LibIDN/SConscript
@@ -40,13 +40,13 @@ if env.get("LIBIDN_BUNDLED", False) :
if conf.CheckFunc("stricmp") :
myenv.Append(CPPDEFINES = [("strcasecmp", "stricmp")])
else :
- print "Error: Cannot find strcasecmp() or stricmp()"
+ print("Error: Cannot find strcasecmp() or stricmp()")
Exit(1)
if not conf.CheckFunc('strncasecmp') :
if conf.CheckFunc("strnicmp") :
myenv.Append(CPPDEFINES = [("strncasecmp", "strnicmp")])
else :
- print "Error: Cannot find strncasecmp() or strnicmp()"
+ print("Error: Cannot find strncasecmp() or strnicmp()")
Exit(1)
conf.Finish()
diff --git a/3rdParty/LibNATPMP/SConscript b/3rdParty/LibNATPMP/SConscript
index e1aef1c..717b1da 100644
--- a/3rdParty/LibNATPMP/SConscript
+++ b/3rdParty/LibNATPMP/SConscript
@@ -47,7 +47,6 @@ if env.get("LIBNATPMP_BUNDLED", False) :
src_files = [
"src/libnatpmp/getgateway.c",
"src/libnatpmp/natpmp.c",
- "src/libnatpmp/natpmpc.c",
]
if myenv["PLATFORM"] == "win32":
diff --git a/3rdParty/OpenSSL/SConscript b/3rdParty/OpenSSL/SConscript
index c95ea05..6e114e4 100644
--- a/3rdParty/OpenSSL/SConscript
+++ b/3rdParty/OpenSSL/SConscript
@@ -2,10 +2,15 @@ Import("env", "conf_env")
openssl_bundle_dir = "openssl"
+if env["PLATFORM"] == "win32" :
+ systemIncludeFlag = "/I"
+else:
+ systemIncludeFlag = "-isystem"
+
if env.get("OPENSSL_BUNDLED", False) :
if env["SCONS_STAGE"] == "flags" :
env["OPENSSL_FLAGS"] = {
- "CPPPATH": [Dir(openssl_bundle_dir + "/include")],
+ "CCFLAGS": [systemIncludeFlag + Dir(openssl_bundle_dir + "/include").abspath],
"LIBPATH": [Dir(".")],
"LIBS": ["ssl", "crypto"]
}
diff --git a/3rdParty/SCons/02_fix_python_3_windows_unicode.diff b/3rdParty/SCons/02_fix_python_3_windows_unicode.diff
new file mode 100644
index 0000000..f512ba9
--- /dev/null
+++ b/3rdParty/SCons/02_fix_python_3_windows_unicode.diff
@@ -0,0 +1,13 @@
+diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/textfile.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/textfile.py
+index 9e2327af3..46176adc1 100644
+--- a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/textfile.py
++++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/textfile.py
+@@ -127,7 +127,7 @@ def _action(target, source, env):
+ # write the file
+ try:
+ if SCons.Util.PY3:
+- target_file = open(target[0].get_path(), TEXTFILE_FILE_WRITE_MODE, newline='')
++ target_file = open(target[0].get_path(), TEXTFILE_FILE_WRITE_MODE, newline='', encoding="utf8")
+ else:
+ target_file = open(target[0].get_path(), TEXTFILE_FILE_WRITE_MODE)
+ except (OSError, IOError):
diff --git a/3rdParty/SCons/scons-2.4.0/CHANGES.txt b/3rdParty/SCons/scons-2.4.0/CHANGES.txt
deleted file mode 100644
index 5f96a23..0000000
--- a/3rdParty/SCons/scons-2.4.0/CHANGES.txt
+++ /dev/null
@@ -1,5899 +0,0 @@
-
-
- SCons - a software construction tool
-
- Change Log
-
-RELEASE 2.4.0 - Mon, 21 Sep 2015 09:07:51 -0700
-
- From Dirk Baechle:
- - Switched several core classes to use "slots", to
- reduce the overall memory consumption in large
- projects (fixes #2180, #2178, #2198)
- - Memoizer counting uses decorators now, instead of
- the old metaclasses approach.
-
- From Andrew Featherstone
- - Fixed typo in SWIGPATH description
-
-RELEASE 2.3.6 - Mon, 31 Jul 2015 14:35:03 -0700
-
- From Rob Smith:
- - Added support for Visual Studio 2015
-
-RELEASE 2.3.5 - Mon, 17 Jun 2015 21:07:32 -0700
-
- From Stephen Pollard:
- - Documentation fixes for libraries.xml and
- builders-writing.xml (#2989 and #2990)
-
- From William Deegan:
- - Extended docs for InstallVersionedLib/SharedLibrary,
- and added SKIP_WIN_PACKAGES argument to build script
- bootstrap.py (PR #230, #3002).
-
- From William Blevins:
- - Fixed symlink support (PR #227, #2395).
- - Updated debug-count test case (PR #229).
-
- From Alexey Klimkin:
- - Fixed incomplete LIBS flattening and substitution in
- Program scanner(PR #205, #2954).
-
- From Dirk Baechle:
- - Added new method rentry_exists_on_disk to Node.FS (PR #193).
-
- From Russel Winder:
- - Fixed several D tests under the different OS.
- - Add support for f08 file extensions for Fortran 2008 code.
-
- From Anatoly Techtonik:
- - Show --config choices if no argument is specified (PR #202).
- - Fixed build crash when XML toolchain isn't installed, and
- activated compression for ZIP archives.
-
- From Alexandre Feblot:
- - Fix for VersionedSharedLibrary under 'sunos' platform.
- - Fixed dll link with precompiled headers on MSVC 2012
- - Added an 'exclude' parameter to Glob()
-
- From Laurent Marchelli:
- - Support for multiple cmdargs (one per variant) in VS project files.
- - Various improvements for TempFileMunge class.
- - Added an implementation for Visual Studio users files (PR #209).
-
- From Dan Pidcock:
- - Added support for the 'PlatformToolset' tag in VS project files (#2978).
-
- From James McCoy:
- - Added support for '-isystem' to ParseFlags.
-
-RELEASE 2.3.4 - Mon, 27 Sep 2014 12:50:35 -0400
-
- From Bernhard Walle and Dirk Baechle:
- - Fixed the interactive mode, in connection with
- Configure contexts (#2971).
-
- From Anatoly Techtonik:
- - Fix EnsureSConsVersion warning when running packaged version
-
- From Russel Winder:
- - Fix D tools for building shared libraries
-
-RELEASE 2.3.3 - Sun, 24 Aug 2014 21:08:33 -0400
-
- From Roland Stark:
- - Fixed false line length calculation in the TempFileMunge class (#2970).
-
- From Gary Oberbrunner:
- - Improve SWIG detection
-
- From Russel Winder:
- - Fix regression on Windows in D language update
-
- From Anatoly Techtonik:
- - Do not fail on EnsureSConsVersion when running from checkout
-
- From Kendrick Boyd and Rob Managan:
- - Fixed the newglossary action to work with VariantDir (LaTeX).
-
- From Manuel Francisco Naranjo:
- - Added a default for the BUILDERS environment variable,
- to prevent not defined exception on a Clone().
-
- From Andrew Featherstone:
- - Added description of CheckTypeSize method (#1991).
- - Fixed handling of CPPDEFINE var in Append()
- for several list-dict combinations (#2900).
-
- From William Blevins:
- - Added test for Java derived-source dependency tree generation.
- - Added Copy Action symlink soft-copy support (#2395).
- - Various contributions to the documentation (UserGuide).
-
-RELEASE 2.3.2
-
- From veon on bitbucket:
- - Fixed handling of nested ifs in CPP scanner PreProcessor class.
-
- From Michael Haubenwallner:
- - Respect user's CC/CXX values; don't always overwrite in generate()
- - Delegate linker Tool.exists() to CC/CXX Tool.exists().
-
- From Amir Szekely:
- - Fixed NoClean() for multi-target builders (#2353).
-
- From Russel Winder:
- - Revamp of the D language support. Tools for DMD, GDC and LDC provided
- and integrated with the C and C++ linking. NOTE: This is only tested
- with D v2. Support for D v1 is now deprecated.
-
- From Paweł Tomulik:
- - Fix SConf tests that write output
-
- From Gary Oberbrunner:
- - get default RPM architecture more robustly when building RPMs
-
- From Shane Gannon:
- - Support for Visual Studio 2013 (12.0)
-
- From Sye van der Veen:
- - Support for Visual Studio 12.0Exp, and fixes for earlier MSVS
- versions.
-
- From Anatoly Techtonik:
- - Several improvements for running scons.py from source:
- * engine files form source directory take priority over all other
- importable versions
- * message about scons.py running from source is removed to fix tests
- that were failing because of this extra line in the output
- * error message when SCons import fails now lists lookup paths
- - Remove support for QMTest harness from runtest.py
- - Remove RPM and m4 from default tools on Windows
- - BitKeeper, CVS, Perforce, RCS, SCCS are deprecated from default
- tools and will be removed in future SCons versions to speed up
- SCons initialization (it will still be possible to use these tools
- explicitly)
-
- From Dirk Baechle:
- - Update XML doc editor configuration
- - Fix: Allow varlist to be specified as list of strings for Actions (#2754)
-
- From Rob Managan:
- - Updated the TeX builder to support use of the -synctex=1
- option and the files it creates.
- - Updated the TeX builder to correctly clean auxiliary files when
- the biblatex package is used.
-
-RELEASE 2.3.1
-
- From Andrew Featherstone:
- - Added support for EPUB output format to the DocBook tool.
-
- From Tom Tanner:
- - Stop leaking file handles to subprocesses by switching to using subprocess
- always.
- - Allow multiple options to be specified with --debug=a,b,c
- - Add support for a readonly cache (--cache-readonly)
- - Always print stats if requested
- - Generally try harder to print out a message on build errors
- - Adds a switch to warn on missing targets
- - Add Pseudo command to mark targets which should not exist after
- they are built.
-
- From Bogdan Tenea:
- - Check for 8.3 filenames on cygwin as well as win32 to make variant_dir work properly.
-
- From Alexandre Feblot:
- - Make sure SharedLibrary depends on all dependent libs (by depending on SHLINKCOM)
-
- From Stefan Sperling:
- - Fixed the setup of linker flags for a versioned SharedLibrary
- under OpenBSD (#2916).
-
- From Antonio Cavallo:
- - Improve error if Visual Studio bat file not found.
-
- From Manuel Francisco Naranjo:
- - Allow Subst.Literal string objects to be compared with each other,
- so they work better in AddUnique() and Remove().
-
- From David Rothenberger:
- - Added cyglink linker that uses Cygwin naming conventions for
- shared libraries and automatically generates import libraries.
-
- From Dirk Baechle:
- - Update bootstrap.py so it can be used from any dir, to run
- SCons from a source (non-installed) dir.
- - Count statistics of instances are now collected only when
- the --debug=count command-line option is used (#2922).
- - Added release_target_info() to File nodes, which helps to
- reduce memory consumption in clean builds and update runs
- of large projects.
- - Fixed the handling of long options in the command-line
- parsing (#2929).
- - Fixed misspelled variable in intelc.py (#2928).
-
- From Gary Oberbrunner:
- - Test harness: fail_test() can now print a message to help debugging.
-
- From Anatoly Techtonik:
- - Require rpmbuild when building SCons package.
- - Print full stack on certain errors, for debugging.
- - Improve documentation for Textfile builder.
-
- From William Deegan:
- - VS2012 & VS2010 Resolve initialization issues by adding path to reg.exe
- in shell used to run batch files.
- - MSVC Support fixed defaulting TARGET_ARCH to HOST_ARCH. It should be
- None if not explicitly set.
- - MSVC Fixed issue where if more than one Architectures compilers are
- detected, it would take the last one found, and not the first.
-
- From Philipp Kraus:
- - Added optional ZIPROOT to Zip tool.
-
- From Dirk Baechle:
- - Replaced old SGML-based documentation toolchain with a more modern
- approach, that also requires less external dependencies (programs and
- Python packages). Added a customized Docbook XSD for strict validation of
- all input XML files.
-
- From Luca Falavigna:
- - Fixed spelling errors in MAN pages (#2897).
-
- From Michael McDougall:
- - Fixed description of ignore_case for EnumVariable in the
- MAN page (#2774).
-
-RELEASE 2.3.0 - Mon, 02 Mar 2013 13:22:29 -0400
-
- From Anatoly Techtonik:
- - Added ability to run scripts/scons.py directly from source checkout
- - Hide deprecated --debug={dtree,stree,tree} from --help output
- - Error messages from option parser now include hints about valid choices
- - Cleaned up some Python 1.5 and pre-2.3 code, so don't expect SCons
- to run on anything less than Python 2.4 anymore
- - Several fixes for runtest.py:
- * exit with an error if no tests were found
- * removed --noqmtest option - this behavior is by default
- * replaced `-o FILE --xml` combination with `--xml FILE`
- * changed `-o, --output FILE` option to capture stdout/stderr output
- from runtest.py
- - Remove os_spawnv_fix.diff patch required to enable parallel builds
- support prior to Python 2.2
-
- From Juan Lang:
- - Fix WiX Tool to use .wixobj rather than .wxiobj for compiler output
- - Support building with WiX releases after 2.0
-
- From Alexey Klimkin:
- - Fix nested LIBPATH expansion by flattening sequences in subst_path.
-
- From eyan on Bitbucket:
- - Print target name with command execution time with --debug=time
-
- From Thomas Berg and Evgeny Podjachev:
- - Fix subprocess spawning on Windows. Work around a Windows
- bug that can crash python occasionally when using -jN. (#2449)
-
- From Dirk Baechle:
- - Updated test framework to support dir and file fixtures and
- added ability to test external (out-of-tree) tools (#2862).
- See doc in QMTest/test-framework.rst.
- - Fixed several errors in the test suite (Java paths, MSVS version
- detection, Tool import), additionally
- * provided MinGW command-line support for the CXX, AS and
- Fortran tests,
- * refactored the detection of the gcc version and the according
- Fortran startup library,
- * provided a new module rpmutils.py, wrapping the RPM naming rules
- for target files and further hardware-dependent info (compatibility,
- compiler flags, ...),
- * added new test methods must_exist_one_of() and
- must_not_exist_any_of() and
- * removed Aegis support from runtest.py. (#2872)
-
- From Gary Oberbrunner:
- - Add -jN support to runtest.py to run tests in parallel
- - Add MSVC10 and MSVC11 support to get_output low-level bat script runner.
- - Fix MSVS solution generation for VS11, and fixed tests.
-
- From Rob Managan:
- - Updated the TeX builder to support the \newglossary command
- in LaTeX's glossaries package and the files it creates.
- - Improve support for new versions of biblatex in the TeX builder
- so biber is called automatically if biblatex requires it.
- - Add SHLIBVERSION as an option that tells SharedLibrary to build
- a versioned shared library and create the required symlinks.
- Add builder InstallVersionedLib to create the required symlinks
- installing a versioned shared library.
-
-RELEASE 2.2.0 - Mon, 05 Aug 2012 15:37:48 +0000
-
- From dubcanada on Bitbucket:
- - Fix 32-bit Visual Express C++ on 64-bit Windows (generate 32-bit code)
-
- From Paweł Tomulik:
- - Added gettext toolset
- - Fixed FindSourceFiles to find final sources (leaf nodes).
-
- From Greg Ward:
- - Allow Node objects in Java path (#2825)
-
- From Joshua Hughes:
- - Make Windows not redefine builtin file as un-inheritable (#2857)
- - Fix WINDOWS_INSERT_DEF on MinGW (Windows) (#2856)
-
- From smallbub on Bitbucket:
- - Fix LINKCOMSTR, SHLINKCOMSTR, and LDMODULECOMSTR on Windows (#2833).
-
- From Mortoray:
- - Make -s (silent mode) be silent about entering subdirs (#2976).
- - Fix cloning of builders when cloning environment (#2821).
-
- From Gary Oberbrunner:
- - Show valid Visual Studio architectures in error message
- when user passes invalid arch.
-
- From Alexey Petruchik:
- - Support for Microsoft Visual Studio 11 (both using it
- and generating MSVS11 solution files).
-
- From Alexey Klimkin:
- - Fixed the Taskmaster, curing spurious build failures in
- multi-threaded runs (#2720).
-
- From Dirk Baechle:
- - Improved documentation of command-line variables (#2809).
- - Fixed scons-doc.py to properly convert main XML files (#2812).
-
- From Rob Managan:
- - Updated the TeX builder to support LaTeX's multibib package.
- - Updated the TeX builder to support LaTeX's biblatex package.
- - Added support for using biber instead of bibtex by setting
- env['BIBTEX'] = 'biber'
-
- From Arve Knudsen:
- - Test for FORTRANPPFILESUFFIXES (#2129).
-
-
-RELEASE 2.1.0 - Mon, 09 Sep 2011 20:54:57 -0700
-
- From Anton Lazarev:
- - Fix Windows resource compiler scanner to accept DOS line endings.
-
- From Matthias:
- - Update MSVS documents to remove note indicating that only one
- project is currently supported per solution file.
-
- From Grzegorz Bizoń:
- - Fix long compile lines in batch mode by using TEMPFILE
- - Fix MSVC_BATCH=False (was treating it as true)
-
- From Justin Gullingsrud:
- - support -std=c++0x and related CXXFLAGS in pkgconfig (ParseFlags)
-
- From Vincent Beffara:
- - Support -dylib_file in pkgconfig (ParseFlags)
-
- From Gary Oberbrunner and Sohail Somani:
- - new construction variable WINDOWS_EMBED_MANIFEST to automatically
- embed manifests in Windows EXEs and DLLs.
-
- From Gary Oberbrunner:
- - Fix Visual Studio project generation when CPPPATH contains Dir nodes
- - Ensure Visual Studio project is regenerated when CPPPATH or CPPDEFINES change
- - Fix unicode error when using non-ASCII filenames with Copy or Install
- - Put RPATH in LINKCOM rather than LINKFLAGS so resetting
- LINKFLAGS doesn't kill RPATH
- - Fix precompiled headers on Windows when variant dir name has spaces.
- - Adding None to an Action no longer fails (just returns original action)
- - New --debug=prepare option to show each target as it's being
- prepared, whether or not anything needs to be done for it.
- - New debug option --debug=duplicate to print a line for each
- unlink/relink (or copy) of a variant file from its source file.
- - Improve error message for EnumVariables to show legal values.
- - Fix Intel compiler to sort versions >9 correctly (esp. on Linux)
- - Fix Install() when the source and target are directories and the
- target directory exists.
-
- From David Garcia Garzon:
- - Fix Delete to be able to delete broken symlinks and dir
- symlinks.
-
- From Imran Fanaswala and Robert Lehr:
- - Handle .output file generated by bison/yacc properly. Cleaning it
- when necessary.
-
- From Antoine Dechaume:
- - Handle SWIG file where there is whitespace after the module name
- properly. Previously the generated files would include
- the whitespace.
-
- From Dmitry R.:
- - Handle Environment in case __semi_deepcopy is None
-
- From Benoit Belley:
-
- - Much improved support for Windows UNC paths (\\SERVERNAME).
-
- From Jean-Baptiste Lab:
-
- - Fix problems with appending CPPDEFINES that contain
- dictionaries, and related issues with Parse/MergeFlags and
- CPPDEFINES.
-
- From Allen Weeks:
-
- - Fix for an issue with implicit-cache with multiple targets
- when dependencies are removed on disk.
-
- From Evgeny Podjachev and Alexey Petruchick:
-
- - Support generation of Microsoft Visual Studio 2008 (9.0)
- and 2010 (10.0) project and solution files.
-
- From Ken Deeter:
-
- - Fix a problem when FS Entries which are actually Dirs have builders.
-
- From Luca Falavigna:
-
- - Support Fortran 03
-
- From Gary Oberbrunner:
-
- - Print the path to the SCons package in scons --version
-
- From Jean-Fran�ois Colson:
-
- - Improve Microsoft Visual Studio Solution generation, and fix
- various errors in the generated solutions especially when using
- MSVS_SCC_PROVIDER, and when generating multiple projects. The
- construction variable MSVS_SCC_PROJECT_BASE_PATH, which never
- worked properly, is removed. Users can use the new variable
- MSVS_SCC_CONNECTION_ROOT instead if desired.
-
- From Anatoly Techtonik:
-
- - Use subprocess in bootstrap.py instead of os.execve to avoid
- losing output control on Windows (http://bugs.python.org/issue9148)
-
- - Revert patch for adding SCons to App Paths, because standard cmd
- shell doesn't search there. This is confusing, because `scons` can
- be executed from explorer, but fail to start from console.
-
- - Fix broken installation with easy_install on Windows (issue #2051)
- SCons traditionally installed in a way that allowed to run multiple
- versions side by side. This custom logic was incompatible with
- easy_install way of doing things.
-
- - Use epydoc module for generating API docs in HTML if command line
- utility is not found in PATH. Actual for Windows.
-
- From Alexander Goomenyuk:
-
- - Add .sx to assembly source scanner list so .sx files
- get their header file dependencies detected.
-
- From Arve Knudsen:
-
- - Set module metadata when loading site_scons/site_init.py
- so it is treated as a proper module; __doc__, __file__ and
- __name__ now refer to the site_init.py file.
-
- From Russel Winder:
-
- - Users Guide updates explaining that Tools can be packages as
- well as python modules.
-
- From Gary Oberbrunner:
-
- - New systemwide and per-user site_scons dirs.
-
- From Dirk Baechle:
-
- - XML fixes in User's Guide.
- - Fixed the detection of 'jar' and 'rmic' during
- the initialization of the respective Tools (#2730).
- - Improved docs for custom Decider functions and
- custom Scanner objects (#2711, #2713).
- - Corrected SWIG module names for generated *.i files (#2707).
-
- From Joe Zuntz:
-
- - Fixed a case-sensitivity problem with Fortran modules.
-
- From Bauke Conijn:
-
- - Added Users Guide example for auto-generated source code
-
- From Steven Knight:
-
- - Fix explicit dependencies (Depends()) on Nodes that don't have
- attached Builders.
-
- - Fix use of the global Alias() function with command actions.
-
- From Matt Hughes:
-
- - Fix the ability to append to default $*FLAGS values (which are
- implemented as CLVar instances) in a copied construction environment
- without affecting the original construction environment's value.
-
- From Rob Managan:
-
- - Updated the TeX command strings to include a /D on Windows in
- case the new directory is on a different drive letter.
-
- - Fixed the LaTeX scanner so dependencies are found in commands that
- are broken across lines with a comment or have embedded spaces.
-
- - The TeX builders should now work with tex files that are generated
- by another program. Thanks to Hans-Martin von Gaudecker for
- isolating the cause of this bug.
-
- - Added support for INDEXSTYLE environment variable so makeindex can
- find style files.
-
- - Added support for the bibunits package so we call bibtex on all
- the bu*.aux files.
-
- - Add support of finding path information on OSX for TeX applications
- MacPorts and Fink paths need to be added by the user
-
- From Russel Winder:
-
- - Add support for DMD version 2 (the phobos2 library).
-
- From William Deegan:
-
- - Add initial support for VS/VC 2010 (express and non-express versions)
- - Remove warning for not finding MS VC/VS install.
- "scons: warning: No version of Visual Studio compiler found
- - C/C++ compilers most likely not set correctly"
- - Add support for Linux 3.0
-
-
-RELEASE 2.0.1 - Mon, 15 Aug 2010 15:46:32 -0700
-
- From Dirk Baechle:
-
- - Fix XML in documentation.
-
- From Joe Zuntz:
-
- - Fixed a case-sensitivity problem with Fortran modules.
-
- From Bauke Conijn:
-
- - Added Users Guide example for auto-generated source code
-
- From Steven Knight:
-
- - Fix explicit dependencies (Depends()) on Nodes that don't have
- attached Builders.
-
- From Matt Hughes:
-
- - Fix the ability to append to default $*FLAGS values (which are
- implemented as CLVar instances) in a copied construction environment
- without affecting the original construction environment's value.
-
- From Rob Managan:
-
- - Updated the TeX command strings to include a /D on Windows in
- case the new directory is on a different drive letter.
-
- - Fixed the LaTeX scanner so dependencies are found in commands that
- are broken across lines with a comment or have embedded spaces.
-
-
-RELEASE 2.0.0.final.0 - Mon, 14 Jun 2010 22:01:37 -0700
-
- From Dirk Baechle:
-
- - Fix XML in documentation.
-
- From Steven Knight:
-
- - Provide forward compatibility for the 'profile' module.
-
- - Provide forward compatibility for the 'pickle' module.
-
- - Provide forward compatibility for the 'io' module.
-
- - Provide forward compatibility for the 'queue' module.
-
- - Provide forward compatibility for the 'collections' module.
-
- - Provide forward compatibility for the 'builtins' module.
-
- - Provide forward compatibility for 'sys.intern()'.
-
- - Convert to os.walk() from of os.path.walk().
-
- - Remove compatibility logic no longer needed.
-
- - Add a '-3' option to runtest to print 3.x incompatibility warnings.
-
- - Convert old-style classes into new-style classes.
-
- - Fix "Ignoring corrupt sconsign entry" warnings when building
- in a tree with a pre-2.0 .sconsign file.
-
- - Fix propagation from environment of VS*COMNTOOLS to resolve issues
- initializing MSVC/MSVS/SDK issues.
-
- - Handle detecting Visual C++ on Python verions with upper-case
- platform architectures like 'AMD64'.
-
- From W. Trevor King:
-
- - Revisions to README.
-
- From Greg Noel:
-
- - Apply numerous Python fixers to update code to more modern idioms.
- Find where fixers should be applied to code in test strings and
- apply the fixers there, too.
-
- - Write a fixer to convert string functions to string methods.
-
- - Modify the 'dict' fixer to be less conservative.
-
- - Modify the 'apply' fixer to handle more cases.
-
- - Create a modified 'types' fixer that converts types to 2.x
- equivalents rather than 3.x equivalents.
-
- - Write a 'division' fixer to highlight uses of the old-style
- division operator. Correct usage where needed.
-
- - Add forward compatibility for the new 'memoryview' function
- (which replaces the 'buffer' function).
-
- - Add forward compatibility for the 'winreg' module.
-
- - Remove no-longer-needed 'platform' module.
-
- - Run tests with the '-3' option to Python 2.6 and clear up
- various reported incompatibilities.
-
- - Comb out code paths specialized to Pythons older than 2.4.
-
- - Update deprecation warnings; most now become mandatory.
-
- - Start deprecation cycle for BuildDir() and build_dir.
-
- - Start deprecation cycle for SourceCode() and related factories
-
- - Fixed a problem with is_Dict() not identifying some objects derived
- from UserDict.
-
- From Jim Randall:
-
- - Document the AllowSubstExceptions() function in the User's Guide.
-
- From William Deegan:
-
- - Migrate MSVC/MSVS/SDK improvements from 1.3 branch.
-
-
-RELEASE 1.3.0 - Tue, 23 Mar 2010 21:44:19 -0400
-
- From Steven Knight:
-
- - Update man page and documentation.
-
- From William Deegan (plus minor patch from Gary Oberbrunner):
-
- - Support Visual Studio 8.0 Express
-
-RELEASE 1.2.0.d20100306 - Sat, 06 Mar 2010 16:18:33 -0800
-
- From Luca Falavigna:
-
- - Fix typos in the man page.
-
- From Gottfried Ganssauge:
-
- - Support execution when SCons is installed via easy_install.
-
- From Steven Knight:
-
- - Make the messages for Configure checks of compilers consistent.
-
- - Issue an error message if a BUILDERS entry is not a Builder
- object or a callable wrapper.
-
- From Rob Managan:
-
- - Update tex builder to handle the case where a \input{foo}
- command tries to work with a directory named foo instead of the
- file foo.tex. The builder now ignores a directory and continues
- searching to find the correct file. Thanks to Lennart Sauerbeck
- for the test case and initial patch
-
- Also allow the \include of files in subdirectories when variantDir
- is used with duplicate=0. Previously latex would crash since
- the directory in which the .aux file is written was not created.
- Thanks to Stefan Hepp for finding this and part of the solution.
-
- From James Teh:
- - Patches to fix some issues using MS SDK V7.0
-
- From William Deegan:
- - Lots of testing and minor patches to handle mixed MS VC and SDK
- installations, as well as having only the SDK installed.
-
-
-RELEASE 1.2.0.d20100117 - Sun, 17 Jan 2010 14:26:59 -0800
-
- From Jim Randall:
- - Fixed temp filename race condition on Windows with long cmd lines.
-
- From David Cournapeau:
- - Fixed tryRun when sconf directory is in a variant dir.
- - Do not add -fPIC for ifort tool on non-posix platforms (darwin and
- windows).
- - Fix bug 2294 (spurious CheckCC failures).
- - Fix scons bootstrap process on windows 64 (wrong wininst name)
-
- From William Deegan:
- - Final merge from vs_revamp branch to main
-
- - Added definition and usage of HOST_OS, HOST_ARCH, TARGET_OS,
- TARGET_ARCH, currently only defined/used by Visual Studio
- Compilers. This will be rolled out to other platforms/tools
- in the future.
-
- - Add check for python >= 3.0.0 and exit gracefully.
- For 1.3 python >= 1.5.2 and < 3.0.0 are supported
-
- - Fix bug 1944 - Handle non-existent .i file in swig emitter, previously
- it would crash with an IOError exception. Now it will try to make an
- educated guess on the module name based on the filename.
-
- From Lukas Erlinghagen:
-
- - Have AddOption() remove variables from the list of
- seen-but-unknown variables (which are reported later).
-
- - An option name and aliases can now be specified as a tuple.
-
- From Hartmut Goebel:
-
- - Textfile builder.
-
- From Jared Grubb:
-
- - use "is/is not" in comparisons with None instead of "==" or "!=".
-
- From Jim Hunziker:
-
- - Avoid adding -gphobos to a command line multiple times
- when initializing use of the DMD compiler.
-
- From Jason Kenney:
-
- - Sugguested HOST/TARGET OS/ARCH separation.
-
- From Steven Knight:
-
- - Fix the -n option when used with VariantDir(duplicate=1)
- and the variant directory doesn't already exist.
-
- - Fix scanning of Unicode files for both UTF-16 endian flavors.
-
- - Fix a TypeError on #include of file names with Unicode characters.
-
- - Fix an exception if a null command-line argument is passed in.
-
- - Evaluate Requires() prerequisites before a Node's direct children
- (sources and dependencies).
-
- From Greg Noel:
-
- - Remove redundant __metaclass__ initializations in Environment.py.
-
- - Correct the documentation of text returned by sconf.Result().
-
- - Document that filenames with '.' as the first character are
- ignored by Glob() by default (matching UNIX glob semantics).
-
- - Fix SWIG testing infrastructure to work on Mac OS X.
-
- - Restructure a test that occasionally hung so that the test would
- detect when it was stuck and fail instead.
-
- - Substfile builder.
-
- From Gary Oberbrunner:
-
- - When reporting a target that SCons doesn't know how to make,
- specify whether it's a File, Dir, etc.
-
- From Ben Webb:
-
- - Fix use of $SWIGOUTDIR when generating Python wrappers.
-
- - Add $SWIGDIRECTORSUFFIX and $SWIGVERSION construction variables.
-
- From Rob Managan:
-
- - Add -recorder flag to Latex commands and updated internals to
- use the output to find files TeX creates. This allows the MiKTeX
- installations to find the created files
-
- - Notify user of Latex errors that would get buried in the
- Latex output
-
- - Remove LATEXSUFFIXES from environments that don't initialize Tex.
-
- - Add support for the glossaries package for glossaries and acronyms
-
- - Fix problem that pdftex, latex, and pdflatex tools by themselves did
- not create the actions for bibtex, makeindex,... by creating them
- and other environment settings in one routine called by all four
- tex tools.
-
- - Fix problem with filenames of sideeffects when the user changes
- the name of the output file from the latex default
-
- - Add scanning of files included in Latex by means of \lstinputlisting{}
- Patch from Stefan Hepp.
-
- - Change command line for epstopdf to use --outfile= instead of -o
- since this works on all platforms.
- Patch from Stefan Hepp.
-
- - Change scanner to properly search for included file from the
- directory of the main file instead of the file it is included from.
- Also update the emitter to add the .aux file associated with
- \include{filename} commands. This makes sure the required directories
- if any are created for variantdir cases.
- Half of the patch from Stefan Hepp.
-
-RELEASE 1.2.0.d20090223 - Mon, 23 Feb 2009 08:41:06 -0800
-
- From Stanislav Baranov:
-
- - Make suffix-matching for scanners case-insensitive on Windows.
-
- From David Cournapeau:
-
- - Change the way SCons finds versions of Visual C/C++ and Visual
- Studio to find and use the Microsoft v*vars.bat files.
-
- From Robert P. J. Day:
-
- - User's Guide updates.
-
- From Dan Eaton:
-
- - Fix generation of Visual Studio 8 project files on x64 platforms.
-
- From Allan Erskine:
-
- - Set IncludeSearchPath and PreprocessorDefinitions in generated
- Visual Studio 8 project files, to help IntelliSense work.
-
- From Mateusz Gruca:
-
- - Fix deletion of broken symlinks by the --clean option.
-
- From Steven Knight:
-
- - Fix the error message when use of a non-existent drive on Windows
- is detected.
-
- - Add sources for files whose targets don't exist in $CHANGED_SOURCES.
-
- - Detect implicit dependencies on commands even when the command is
- quoted.
-
- - Fix interaction of $CHANGED_SOURCES with the --config=force option.
-
- - Fix finding #include files when the string contains escaped
- backslashes like "C:\\some\\include.h".
-
- - Pass $CCFLAGS to Visual C/C++ precompiled header compilation.
-
- - Remove unnecessary nested $( $) around $_LIBDIRFLAGS on link lines
- for the Microsoft linker, the OS/2 ilink linker and the Phar Lap
- linkloc linker.
-
- - Spell the Windows environment variables consistently "SystemDrive"
- and "SystemRoot" instead of "SYSTEMDRIVE" and "SYSTEMROOT".
-
-
-
-RELEASE 1.2.0.d20090113 - Tue, 13 Jan 2009 02:50:30 -0800
-
- From Stanislav Baranov, Ted Johnson and Steven Knight:
-
- - Add support for batch compilation of Visual Studio C/C++ source
- files, controlled by a new $MSVC_BATCH construction variable.
-
- From Steven Knight:
-
- - Print the message, "scons: Build interrupted." on error output,
- not standard output.
-
- - Add a --warn=future-deprecated option for advance warnings about
- deprecated features that still have warnings hidden by default.
-
- - Fix use of $SOURCE and $SOURCES attributes when there are no
- sources specified in the Builder call.
-
- - Add support for new $CHANGED_SOURCES, $CHANGED_TARGETS,
- $UNCHANGED_SOURCES and $UNCHANGED_TARGETS variables.
-
- - Add general support for batch builds through new batch_key= and
- targets= keywords to Action object creation.
-
- From Arve Knudsen:
-
- - Make linker tools differentiate properly between SharedLibrary
- and LoadableModule.
-
- - Document TestCommon.shobj_prefix variable.
-
- - Support $SWIGOUTDIR values with spaces.
-
- From Rob Managan:
-
- - Don't automatically try to build .pdf graphics files for
- .eps files in \includegraphics{} calls in TeX/LaTeX files
- when building with the PDF builder (and thus using pdflatex).
-
- From Gary Oberbrunner:
-
- - Allow AppendENVPath() and PrependENVPath() to interpret '#'
- for paths relative to the top-level SConstruct directory.
-
- - Use the Borland ilink -e option to specify the output file name.
-
- - Document that the msvc Tool module uses $PCH, $PCHSTOP and $PDB.
-
- - Allow WINDOWS_INSERT_DEF=0 to disable --output-def when linking
- under MinGW.
-
- From Zia Sobhani:
-
- - Fix typos in the User's Guide.
-
- From Greg Spencer:
-
- - Support implicit dependency scanning of files encoded in utf-8
- and utf-16.
-
- From Roberto de Vecchi:
-
- - Remove $CCFLAGS from the the default definitions of $CXXFLAGS for
- Visual C/C++ and MIPSpro C++ on SGI so, they match other tools
- and avoid flag duplication on C++ command lines.
-
- From Ben Webb:
-
- - Handle quoted module names in SWIG source files.
-
- - Emit *_wrap.h when SWIG generates header file for directors
-
- From Matthew Wesley:
-
- - Copy file attributes so we identify, and can link a shared library
- from, shared object files in a Repository.
-
-
-
-RELEASE 1.2.0 - Sat, 20 Dec 2008 22:47:29 -0800
-
- From Steven Knight:
-
- - Don't fail if can't import a _subprocess module on Windows.
-
- - Add warnings for use of the deprecated Options object.
-
-
-
-RELEASE 1.1.0.d20081207 - Sun, 07 Dec 2008 19:17:23 -0800
-
- From Benoit Belley:
-
- - Improve the robustness of GetBuildFailures() by refactoring
- SCons exception handling (especially BuildError exceptions).
-
- - Have the --taskmastertrace= option print information about
- individual Task methods, not just the Taskmaster control flow.
-
- - Eliminate some spurious dependency cycles by being more aggressive
- about pruning pending children from the Taskmaster walk.
-
- - Suppress mistaken reports of a dependency cycle when a child
- left on the pending list is a single Node in EXECUTED state.
-
- From David Cournapeau:
-
- - Fix $FORTRANMODDIRPREFIX for the ifort (Intel Fortran) tool.
-
- From Brad Fitzpatrick:
-
- - Don't pre-generate an exception message (which will likely be
- ignored anyway) when an EntryProxy re-raises an AttributeError.
-
- From Jared Grubb:
-
- - Clean up coding style and white space in Node/FS.py.
-
- - Fix a typo in the documentation for $_CPPDEFFLAGS.
-
- - Issue 2401: Fix usage of comparisons with None.
-
- From Ludwig H�hne:
-
- - Handle Java inner classes declared within a method.
-
- From Steven Knight:
-
- - Fix label placement by the "scons-time.py func" subcommand
- when a profile value was close to (or equal to) 0.0.
-
- - Fix env.Append() and env.Prepend()'s ability to add a string to
- list-like variables like $CCFLAGS under Python 2.6.
-
- - Other Python2.6 portability: don't use "as" (a Python 2.6 keyword).
- Don't use the deprecated Exception.message attribute.
-
- - Support using the -f option to search for a different top-level
- file name when walking up with the -D, -U or -u options.
-
- - Fix use of VariantDir when the -n option is used and doesn't,
- therefore, actually create the variant directory.
-
- - Fix a stack trace from the --debug=includes option when passed a
- static or shared library as an argument.
-
- - Speed up the internal find_file() function (used for searching
- CPPPATH, LIBPATH, etc.).
-
- - Add support for using the Python "in" keyword on construction
- environments (for example, if "CPPPATH" in env: ...).
-
- - Fix use of Glob() when a repository or source directory contains
- an in-memory Node without a corresponding on-disk file or directory.
-
- - Add a warning about future reservation of $CHANGED_SOURCES,
- $CHANGED_TARGETS, $UNCHANGED_SOURCES and $UNCHANGED_TARGETS.
-
- - Enable by default the existing warnings about setting the resource
- $SOURCE, $SOURCES, $TARGET and $TARGETS variable.
-
- From Rob Managan:
-
- - Scan for TeX files in the paths specified in the $TEXINPUTS
- construction variable and the $TEXINPUTS environment variable.
-
- - Configure the PDF() and PostScript() Builders as single_source so
- they know each source file generates a separate target file.
-
- - Add $EPSTOPDF, $EPSTOPDFFLAGS and $EPSTOPDFCOM
-
- - Add .tex as a valid extension for the PDF() builder.
-
- - Add regular expressions to find \input, \include and
- \includegraphics.
-
- - Support generating a .pdf file from a .eps source.
-
- - Recursive scan included input TeX files.
-
- - Handle requiring searched-for TeX input graphics files to have
- extensions (to avoid trying to build a .eps from itself, e.g.).
-
- From Greg Noel:
-
- - Make the Action() function handle positional parameters consistently.
-
- - Clarify use of Configure.CheckType().
-
- - Make the File.{Dir,Entry,File}() methods create their entries
- relative to the calling File's directory, not the SConscript
- directory.
-
- - Use the Python os.devnull variable to discard error output when
- looking for the $CC or $CXX version.
-
- - Mention LoadableModule() in the SharedLibrary() documentation.
-
- From Gary Oberbrunner:
-
- - Update the User's Guide to clarify use of the site_scons/
- directory and the site_init.py module.
-
- - Make env.AppendUnique() and env.PrependUnique remove duplicates
- within a passed-in list being added, too.
-
- From Randall Spangler:
-
- - Fix Glob() so an on-disk file or directory beginning with '#'
- doesn't throw an exception.
-
-
-
-RELEASE 1.1.0 - Thu, 09 Oct 2008 08:33:47 -0700
-
- From Chris AtLee
-
- - Use the specified environment when checking for the GCC compiler
- version.
-
- From Ian P. Cardenas:
-
- - Fix Glob() polluting LIBPATH by returning copy of list
-
- From David Cournapeau:
-
- - Add CheckCC, CheckCXX, CheckSHCC and CheckSHCXX tests to
- configuration contexts.
-
- - Have the --profile= argument use the much faster cProfile module
- (if it's available in the running Python version).
-
- - Reorder MSVC compilation arguments so the /Fo is first.
-
- From Bill Deegan:
-
- - Add scanning Windows resource (.rc) files for implicit dependencies.
-
- From John Gozde:
-
- - When scanning for a #include file, don't use a directory that
- has the same name as the file.
-
- From Ralf W. Grosse-Kunstleve
-
- - Suppress error output when checking for the GCC compiler version.
-
- From Jared Grubb:
-
- - Fix VariantDir duplication of #included files in subdirectories.
-
- From Ludwig H�hne:
-
- - Reduce memory usage when a directory is used as a dependency of
- another Node (such as an Alias) by returning a concatenation
- of the children's signatures + names, not the children's contents,
- as the directory contents.
-
- - Raise AttributeError, not KeyError, when a Builder can't be found.
-
- - Invalidate cached Node information (such as the contenst returned
- by the get_contents() method) when calling actions with Execute().
-
- - Avoid object reference cycles from frame objects.
-
- - Reduce memory usage from Null Executor objects.
-
- - Compute MD5 checksums of large files without reading the entire
- file contents into memory. Add a new --md5-chunksize option to
- control the size of each chunk read into memory.
-
- From Steven Knight:
-
- - Fix the ability of the add_src_builder() method to add a new
- source builder to any other builder.
-
- - Avoid an infinite loop on non-Windows systems trying to find the
- SCons library directory if the Python library directory does not
- begin with the string "python".
-
- - Search for the SCons library directory in "scons-local" (with
- no version number) after "scons-local-{VERSION}".
-
- From Rob Managan:
-
- - Fix the user's ability to interrupt the TeX build chain.
-
- - Fix the TeX builder's allowing the user to specify the target name,
- instead of always using its default output name based on the source.
-
- - Iterate building TeX output files until all warning are gone
- and the auxiliary files stop changing, or until we reach the
- (configurable) maximum number of retries.
-
- - Add TeX scanner support for: glossaries, nomenclatures, lists of
- figures, lists of tables, hyperref and beamer.
-
- - Use the $BIBINPUTS, $BSTINPUTS, $TEXINPUTS and $TEXPICTS construction
- variables as search paths for the relevant types of input file.
-
- - Fix building TeX with VariantDir(duplicate=0) in effect.
-
- - Fix the LaTeX scanner to search for graphics on the TEXINPUTS path.
-
- - Have the PDFLaTeX scanner search for .gif files as well.
-
- From Greg Noel:
-
- - Fix typos and format bugs in the man page.
-
- - Add a first draft of a wrapper module for Python's subprocess
- module.
-
- - Refactor use of the SCons.compat module so other modules don't
- have to import it individually.
-
- - Add .sx as a suffix for assembly language files that use the
- C preprocessor.
-
- From Gary Oberbrunner:
-
- - Make Glob() sort the returned list of Files or Nodes
- to prevent spurious rebuilds.
-
- - Add a delete_existing keyword argument to the AppendENVPath()
- and PrependENVPath() Environment methods.
-
- - Add ability to use "$SOURCE" when specifying a target to a builder
-
- From Damyan Pepper:
-
- - Add a test case to verify that SConsignFile() files can be
- created in previously non-existent subdirectories.
-
- From Jim Randall:
-
- - Make the subdirectory in which the SConsignFile() file will
- live, if the subdirectory doesn't already exist.
-
- From Ali Tofigh:
-
- - Add a test to verify duplication of files in VariantDir subdirectories.
-
-
-
-RELEASE 1.0.1 - Sat, 06 Sep 2008 07:29:34 -0700
-
- From Greg Noel:
-
- - Add a FindFile() section to the User's Guide.
-
- - Fix the FindFile() documentation in the man page.
-
- - Fix formatting errors in the Package() description in the man page.
-
- - Escape parentheses that appear within variable names when spawning
- command lines using os.system().
-
-
-
-RELEASE 1.0.0 - XXX
-
- From Jared Grubb:
-
- - Clear the Node state when turning a generic Entry into a Dir.
-
- From Ludwig H�hne:
-
- - Fix sporadic output-order failures in test/GetBuildFailures/parallel.py.
-
- - Document the ParseDepends() function in the User's Guide.
-
- From khomenko:
-
- - Create a separate description and long_description for RPM packages.
-
- From Steven Knight:
-
- - Document the GetLaunchDir() function in the User's Guide.
-
- - Have the env.Execute() method print an error message if the
- executed command fails.
-
- - Add a script for creating a standard SCons development system on
- Ubuntu Hardy. Rewrite subsidiary scripts for install Python and
- SCons versions in Python (from shell).
-
- From Greg Noel:
-
- - Handle yacc/bison on newer Mac OS X versions creating file.hpp,
- not file.cpp.h.
-
- - In RPCGEN tests, ignore stderr messages from older versions of
- rpcgen on some versions of Mac OS X.
-
- - Fix typos in man page descriptions of Tag() and Package(), and in
- the scons-time man page.
-
- - Fix documentation of SConf.CheckLibWithHeader and other SConf methods.
-
- - Update documentation of SConscript(variant_dir) usage.
-
- - Fix SWIG tests for (some versions of) Mac OS X.
-
- From Jonas Olsson:
-
- - Print the warning about -j on Windows being potentially unreliable if
- the pywin32 extensions are unavailable or lack file handle operations.
-
- From Jim Randall:
-
- - Fix the env.WhereIs() method to expand construction variables.
-
- From Rogier Schouten:
-
- - Enable building of shared libraries with the Bordand ilink32 linker.
-
-
-
-RELEASE 1.0.0 - Sat, 09 Aug 2008 12:19:44 -0700
-
- From Luca Falavigna:
-
- - Fix SCons man page indentation under Debian's man page macros.
-
- From Steven Knight:
-
- - Clarify the man page description of the SConscript(src_dir) argument.
-
- - User's Guide updates:
-
- - Document the BUILD_TARGETS, COMMAND_LINE_TARGETS and
- DEFAULT_TARGETS variables.
-
- - Document the AddOption(), GetOption() and SetOption() functions.
-
- - Document the Requires() function; convert to the Variables
- object, its UnknownOptions() method, and its associated
- BoolVariable(), EnumVariable(), ListVariable(), PackageVariable()
- and PathVariable() functions.
-
- - Document the Progress() function.
-
- - Reorganize the chapter and sections describing the different
- types of environments and how they interact. Document the
- SetDefault() method. Document the PrependENVPath() and
- AppendENVPath() functions.
-
- - Reorganize the command-line arguments chapter. Document the
- ARGLIST variable.
-
- - Collect some miscellaneous sections into a chapter about
- configuring build output.
-
- - Man page updates:
-
- - Document suggested use of the Visual C/C++ /FC option to fix
- the ability to double-click on file names in compilation error
- messages.
-
- - Document the need to use Clean() for any SideEffect() files that
- must be explicitly removed when their targets are removed.
-
- - Explicitly document use of Node lists as input to Dependency().
-
- From Greg Noel:
-
- - Document MergeFlags(), ParseConfig(), ParseFlags() and SideEffect()
- in the User's Guide.
-
- From Gary Oberbrunner:
-
- - Document use of the GetBuildFailures() function in the User's Guide.
-
- From Adam Simpkins:
-
- - Add man page text clarifying the behavior of AddPreAction() and
- AddPostAction() when called with multiple targets.
-
- From Alexey Zezukin:
-
- - Fix incorrectly swapped man page descriptions of the --warn= options
- for duplicate-environment and missing-sconscript.
-
-
-
-RELEASE 0.98.5 - Sat, 07 Jun 2008 08:20:35 -0700
-
- From Benoit Belley:
-
- - Fix the Intel C++ compiler ABI specification for EMT64 processors.
-
- From David Cournapeau:
-
- - Issue a (suppressable) warning, not an error, when trying to link
- C++ and Fortran object files into the same executable.
-
- From Steven Knight:
-
- - Update the scons.bat file so that it returns the real exit status
- from SCons, even though it uses setlocal + endlocal.
-
- - Fix the --interactive post-build messages so it doesn't get stuck
- mistakenly reporting failures after any individual build fails.
-
- - Fix calling File() as a File object method in some circumstances.
-
- - Fix setup.py installation on Mac OS X so SCons gets installed
- under /usr/lcoal by default, not in the Mac OS X Python framework.
-
-
-
-RELEASE 0.98.4 - Sat, 17 May 2008 22:14:46 -0700
-
- From Benoit Belley:
-
- - Fix calculation of signatures for Python function actions with
- closures in Python versions before 2.5.
-
- From David Cournapeau:
-
- - Fix the initialization of $SHF77FLAGS so it includes $F77FLAGS.
-
- From Jonas Olsson:
-
- - Fix a syntax error in the Intel C compiler support on Windows.
-
- From Steven Knight:
-
- - Change how we represent Python Value Nodes when printing and when
- stored in .sconsign files (to avoid blowing out memory by storing
- huge strings in .sconsign files after multiple runs using Configure
- contexts cause the Value strings to be re-escaped each time).
-
- - Fix a regression in not executing configuration checks after failure
- of any configuration check that used the same compiler or other tool.
-
- - Handle multiple destinations in Visual Studio 8 settings for the
- analogues to the INCLUDE, LIBRARY and PATH variables.
-
- From Greg Noel:
-
- - Update man page text for VariantDir().
-
-
-
-RELEASE 0.98.3 - Tue, 29 Apr 2008 22:40:12 -0700
-
- From Greg Noel:
-
- - Fix use of $CXXFLAGS when building C++ shared object files.
-
- From Steven Knight:
-
- - Fix a regression when a Builder's source_scanner doesn't select
- a more specific scanner for the suffix of a specified source file.
-
- - Fix the Options object backwards compatibility so people can still
- "import SCons.Options.{Bool,Enum,List,Package,Path}Option" submodules.
-
- - Fix searching for implicit dependencies when an Entry Node shows up
- in the search path list.
-
- From Stefano:
-
- - Fix expansion of $FORTRANMODDIR in the default Fortran command line(s)
- when it's set to something like ${TARGET.dir}.
-
-
-
-RELEASE 0.98.2 - Sun, 20 Apr 2008 23:38:56 -0700
-
- From Steven Knight:
-
- - Fix a bug in Fortran suffix computation that would cause SCons to
- run out of memory on Windows systems.
-
- - Fix being able to specify --interactive mode command lines with
- \ (backslash) path name separators on Windows.
-
- From Gary Oberbrunner:
-
- - Document Glob() in the User's Guide.
-
-
-
-RELEASE 0.98.1 - Fri, 18 Apr 2008 19:11:58 -0700
-
- From Benoit Belley:
-
- - Speed up the SCons.Util.to_string*() functions.
-
- - Optimize various Node intialization and calculations.
-
- - Optimize Executor scanning code.
-
- - Optimize Taskmaster execution, including dependency-cycle checking.
-
- - Fix the --debug=stree option so it prints its tree once, not twice.
-
- From Johan Boul�:
-
- - Fix the ability to use LoadableModule() under MinGW.
-
- From David Cournapeau:
-
- - Various missing Fortran-related construction variables have been added.
-
- - SCons now uses the program specified in the $FORTRAN construction
- variable to link Fortran object files.
-
- - Fortran compilers on Linux (Intel, g77 and gfortran) now add the -fPIC
- option by default when compilling shared objects.
-
- - New 'sunf77', 'sunf90' and 'sunf95' Tool modules have been added to
- support Sun Fortran compilers. On Solaris, the Sun Fortran compilers
- are used in preference to other compilers by default.
-
- - Fortran support now uses gfortran in preference to g77.
-
- - Fortran file suffixes are now configurable through the
- $F77FILESUFFIXES, $F90FILESUFFIXES, $F95FILESUFFIXES and
- $FORTRANFILESUFFIXES variables.
-
- From Steven Knight:
-
- - Make the -d, -e, -w and --no-print-directory options "Ignored for
- compatibility." (We're not going to implement them.)
-
- - Fix a serious inefficiency in how SCons checks for whether any source
- files are missing when a Builder call creates many targets from many
- input source files.
-
- - In Java projects, make the target .class files depend only on the
- specific source .java files where the individual classes are defined.
-
- - Don't store duplicate source file entries in the .sconsign file so
- we don't endlessly rebuild the target(s) for no reason.
-
- - Add a Variables object as the first step towards deprecating the
- Options object name. Similarly, add BoolVariable(), EnumVariable(),
- ListVariable(), PackageVariable() and PathVariable() functions
- as first steps towards replacing BoolOption(), EnumOption(),
- ListOption(), PackageOption() and PathOption().
-
- - Change the options= keyword argument to the Environment() function
- to variables=, to avoid confusion with SCons command-line options.
- Continue supporting the options= keyword for backwards compatibility.
-
- - When $SWIGFLAGS contains the -python flag, expect the generated .py
- file to be in the same (sub)directory as the target.
-
- - When compiling C++ files, allow $CCFLAGS settings to show up on the
- command line even when $CXXFLAGS has been redefined.
-
- - Fix --interactive with -u/-U/-D when a VariantDir() is used.
-
- From Anatoly Techtonik:
-
- - Have the scons.bat file add the script execution directory to its
- local %PATH% on Windows, so the Python executable can be found.
-
- From Mike Wake:
-
- - Fix passing variable names as a list to the Return() function.
-
- From Matthew Wesley:
-
- - Add support for the GDC 'D' language compiler.
-
-
-
-RELEASE 0.98 - Sun, 30 Mar 2008 23:33:05 -0700
-
- From Benoit Belley:
-
- - Fix the --keep-going flag so it builds all possible targets even when
- a later top-level target depends on a child that failed its build.
-
- - Fix being able to use $PDB and $WINDWOWS_INSERT_MANIFEST together.
-
- - Don't crash if un-installing the Intel C compiler leaves left-over,
- dangling entries in the Windows registry.
-
- - Improve support for non-standard library prefixes and suffixes by
- stripping all prefixes/suffixes from file name string as appropriate.
-
- - Reduce the default stack size for -j worker threads to 256 Kbytes.
- Provide user control over this value by adding --stack-size and
- --warn=stack-size options, and a SetOption('stack_size') function.
-
- - Fix a crash on Linux systems when trying to use the Intel C compiler
- and no /opt/intel_cc_* directories are found.
-
- - Improve using Python functions as actions by incorporating into
- a FunctionAction's signature:
- - literal values referenced by the byte code.
- - values of default arguments
- - code of nested functions
- - values of variables captured by closures
- - names of referenced global variables and functions
-
- - Fix the closing message when --clean and --keep-going are both
- used and no errors occur.
-
- - Add support for the Intel C compiler on Mac OS X.
-
- - Speed up reading SConscript files by about 20% (for some
- configurations) by: 1) optimizing the SCons.Util.is_*() and
- SCons.Util.flatten() functions; 2) avoiding unnecessary os.stat()
- calls by using a File's .suffix attribute directly instead of
- stringifying it.
-
- From Jérôme Berger:
-
- - Have the D language scanner search for .di files as well as .d files.
-
- - Add a find_include_names() method to the Scanner.Classic class to
- abstract out how included names can be generated by subclasses.
-
- - Allow the D language scanner to detect multiple modules imported by
- a single statement.
-
- From Konstantin Bozhikov:
-
- - Support expansion of construction variables that contain or refer
- to lists of other variables or Nodes within expansions like $CPPPATH.
-
- - Change variable substitution (the env.subst() method) so that an
- input sequence (list or tuple) is preserved as a list in the output.
-
- From David Cournapeau:
-
- - Add a CheckDeclaration() call to configure contexts.
-
- - Improve the CheckTypeSize() code.
-
- - Add a Define() call to configure contexts, to add arbitrary #define
- lines to a generated configure header file.
-
- - Add a "gfortran" Tool module for the GNU F95/F2003 compiler.
-
- - Avoid use of -rpath with the Mac OS X linker.
-
- - Add comment lines to the generated config.h file to describe what
- the various #define/#undef lines are doing.
-
- From Steven Knight:
-
- - Support the ability to subclass the new-style "str" class as input
- to Builders.
-
- - Improve the performance of our type-checking by using isinstance()
- with new-style classes.
-
- - Fix #include (and other $*PATH variables searches) of files with
- absolute path names. Don't die if they don't exist (due to being
- #ifdef'ed out or the like).
-
- - Fix --interactive mode when Default(None) is used.
-
- - Fix --debug=memoizer to work around a bug in base Python 2.2 metaclass
- initialization (by just not allowing Memoization in Python versions
- that have the bug).
-
- - Have the "scons-time time" subcommand handle empty log files, and
- log files that contain no results specified by the --which option.
-
- - Fix the max Y of vertical bars drawn by "scons-time --fmt=gnuplot".
-
- - On Mac OS X, account for the fact that the header file generated
- from a C++ file will be named (e.g.) file.cpp.h, not file.hpp.
-
- - Fix floating-point numbers confusing the Java parser about
- generated .class file names in some configurations.
-
- - Document (nearly) all the values you can now fetch with GetOption().
-
- - Fix use of file names containing strings of multiple spaces when
- using ActionFactory instances like the Copy() or Move() function.
-
- - Fix a 0.97 regression when using a variable expansion (like
- $OBJSUFFIX) in a source file name to a builder with attached source
- builders that match suffix (like Program()+Object()).
-
- - Have the Java parser recognize generics (surrounded by angle brackets)
- so they don't interfere with identifying anonymous inner classes.
-
- - Avoid an infinite loop when trying to use saved copies of the
- env.Install() or env.InstallAs() after replacing the method
- attributes.
-
- - Improve the performance of setting construction variables.
-
- - When cloning a construction environment, avoid over-writing an
- attribute for an added method if the user explicitly replaced it.
-
- - Add a warning about deprecated support for Python 1.5, 2.0 and 2.1.
-
- - Fix being able to SetOption('warn', ...) in SConscript files.
-
- - Add a warning about env.Copy() being deprecated.
-
- - Add warnings about the --debug={dtree,stree,tree} options
- being deprecated.
-
- - Add VariantDir() as the first step towards deprecating BuildDir().
- Add the keyword argument "variant_dir" as the replacement for
- "build_dir".
-
- - Add warnings about the {Target,Source}Signatures() methods and
- functions being deprecated.
-
- From Rob Managan:
-
- - Enhance TeX and LaTeX support to work with BuildDir(duplicate=0).
-
- - Re-run LaTeX when it issues a package warning that it must be re-run.
-
- From Leanid Nazdrynau:
-
- - Have the Copy() action factory preserve file modes and times
- when copying individual files.
-
- From Jan Nijtmans:
-
- - If $JARCHDIR isn't set explicitly, use the .java_classdir attribute
- that was set when the Java() Builder built the .class files.
-
- From Greg Noel:
-
- - Document the Dir(), File() and Entry() methods of Dir and File Nodes.
-
- - Add the parse_flags option when creating Environments
-
- From Gary Oberbrunner:
-
- - Make File(), Dir() and Entry() return a list of Nodes when passed
- a list of names, instead of trying to make a string from the name
- list and making a Node from that string.
-
- - Fix the ability to build an Alias in --interactive mode.
-
- - Fix the ability to hash the contents of actions for nested Python
- functions on Python versions where the inability to pickle them
- returns a TypeError (instead of the documented PicklingError).
-
- From Jonas Olsson:
-
- - Fix use of the Intel C compiler when the top compiler directory,
- but not the compiler version, is specified.
-
- - Handle Intel C compiler network license files (port@system).
-
- From Jim Randall:
-
- - Fix how Python Value Nodes are printed in --debug=explain output.
-
- From Adam Simpkins:
-
- - Add a --interactive option that starts a session for building (or
- cleaning) targets without re-reading the SConscript files every time.
-
- - Fix use of readline command-line editing in --interactive mode.
-
- - Have the --interactive mode "build" command with no arguments
- build the specified Default() targets.
-
- - Fix the Chmod(), Delete(), Mkdir() and Touch() Action factories to
- take a list (of Nodes or strings) as arguments.
-
- From Vaclav Smilauer:
-
- - Fix saving and restoring an Options value of 'all' on Python
- versions where all() is a builtin function.
-
- From Daniel Svensson:
-
- - Code correction in SCons.Util.is_List().
-
- From Ben Webb:
-
- - Support the SWIG %module statement with following modifiers in
- parenthese (e.g., '%module(directors="1")').
-
-
-
-RELEASE 0.97.0d20071212 - Wed, 12 Dec 2007 09:29:32 -0600
-
- From Benoit Belley:
-
- - Fix occasional spurious rebuilds and inefficiency when using
- --implicit-cache and Builders that produce multiple targets.
-
- - Allow SCons to not have to know about the builders of generated
- files when BuildDir(duplicate=0) is used, potentially allowing some
- SConscript files to be ignored for smaller builds.
-
- From David Cournapeau:
-
- - Add a CheckTypeSize() call to configure contexts.
-
- From Ken Deeter:
-
- - Make the "contents" of Alias Nodes a concatenation of the children's
- content signatures (MD5 checksums), not a concatenation of the
- children's contents, to avoid using large amounts of memory during
- signature calculation.
-
- From Malte Helmert:
-
- - Fix a lot of typos in the man page and User's Guide.
-
- From Geoffrey Irving:
-
- - Speed up conversion of paths in .sconsign files to File or Dir Nodes.
-
- From Steven Knight:
-
- - Add an Options.UnknownOptions() method that returns any settings
- (from the command line, or whatever dictionary was passed in)
- that aren't known to the Options object.
-
- - Add a Glob() function.
-
- - When removing targets with the -c option, use the absolute path (to
- avoid problems interpreting BuildDir() when the top-level directory
- is the source directory).
-
- - Fix problems with Install() and InstallAs() when called through a
- clone (of a clone, ...) of a cloned construction environment.
-
- - When executing a file containing Options() settings, add the file's
- directory to sys.path (so modules can be imported from there) and
- explicity set __name__ to the name of the file so the statement's
- in the file can deduce the location if they need to.
-
- - Fix an O(n^2) performance problem when adding sources to a target
- through calls to a multi Builder (including Aliases).
-
- - Redefine the $WINDOWSPROGMANIFESTSUFFIX and
- $WINDOWSSHLIBMANIFESTSUFFIX variables so they pick up changes to
- the underlying $SHLIBSUFFIX and $PROGSUFFIX variables.
-
- - Add a GetBuildFailures() function that can be called from functions
- registered with the Python atexit module to print summary information
- about any failures encountered while building.
-
- - Return a NodeList object, not a Python list, when a single_source
- Builder like Object() is called with more than one file.
-
- - When searching for implicit dependency files in the directories
- in a $*PATH list, don't create Dir Nodes for directories that
- don't actually exist on-disk.
-
- - Add a Requires() function to allow the specification of order-only
- prerequisites, which will be updated before specified "downstream"
- targets but which don't actually cause the target to be rebuilt.
-
- - Restore the FS.{Dir,File,Entry}.rel_path() method.
-
- - Make the default behavior of {Source,Target}Signatures('timestamp')
- be equivalent to 'timestamp-match', not 'timestamp-newer'.
-
- - Fix use of CacheDir with Decider('timestamp-newer') by updating
- the modification time when copying files from the cache.
-
- - Fix random issues with parallel (-j) builds on Windows when Python
- holds open file handles (especially for SCons temporary files,
- or targets built by Python function actions) across process creation.
-
- From Maxim Kartashev:
-
- - Fix test scripts when run on Solaris.
-
- From Gary Oberbrunner:
-
- - Fix Glob() when a pattern is in an explicitly-named subdirectory.
-
- From Philipp Scholl:
-
- - Fix setting up targets if multiple Package builders are specified
- at once.
-
-
-
-RELEASE 0.97.0d20070918 - Tue, 18 Sep 2007 10:51:27 -0500
-
- From Steven Knight:
-
- - Fix the wix Tool module to handle null entries in $PATH variables.
-
- - Move the documentation of Install() and InstallAs() from the list
- of functions to the list of Builders (now that they're implemented
- as such).
-
- - Allow env.CacheDir() to be set per construction environment. The
- global CacheDir() function now sets an overridable global default.
-
- - Add an env.Decider() method and a Node.Decider() method that allow
- flexible specification of an arbitrary function to decide if a given
- dependency has changed since the last time a target was built.
-
- - Don't execute Configure actions (while reading SConscript files)
- when cleaning (-c) or getting help (-h or -H).
-
- - Add to each target an implicit dependency on the external command(s)
- used to build the target, as found by searching env['ENV']['PATH']
- for the first argument on each executed command line.
-
- - Add support for a $IMPLICIT_COMMAND_DEPENDENCIES construction
- variabe that can be used to disable the automatic implicit
- dependency on executed commands.
-
- - Add an "ensure_suffix" keyword to Builder() definitions that, when
- true, will add the configured suffix to the targets even if it looks
- like they already have a different suffix.
-
- - Add a Progress() function that allows for calling a function or string
- (or list of strings) to display progress while walking the DAG.
-
- - Allow ParseConfig(), MergeFlags() and ParseFlags() to handle output
- from a *config command with quoted path names that contain spaces.
-
- - Make the Return() function stop processing the SConscript file and
- return immediately. Add a "stop=" keyword argument that can be set
- to False to preserve the old behavior.
-
- - Fix use of exitstatfunc on an Action.
-
- - Introduce all man page function examples with "Example:" or "Examples:".
-
- - When a file gets added to a directory, make sure the directory gets
- re-scanned for the new implicit dependency.
-
- - Fix handling a file that's specified multiple times in a target
- list so that it doesn't cause dependent Nodes to "disappear" from
- the dependency graph walk.
-
- From Carsten Koch:
-
- - Avoid race conditions with same-named files and directory creation
- when pushing copies of files to CacheDir().
-
- From Tzvetan Mikov:
-
- - Handle $ in Java class names.
-
- From Gary Oberbrunner:
-
- - Add support for the Intel C compiler on Windows64.
-
- - On SGI IRIX, have $SHCXX use $CXX by default (like other platforms).
-
- From Sohail Somani:
-
- - When Cloning a construction environment, set any variables before
- applying tools (so the tool module can access the configured settings)
- and re-set them after (so they end up matching what the user set).
-
- From Matthias Troffaes:
-
- - Make sure extra auxiliary files generated by some LaTeX packages
- and not ending in .aux also get deleted by scons -c.
-
- From Greg Ward:
-
- - Add a $JAVABOOTCLASSPATH variable for directories to be passed to the
- javac -bootclasspath option.
-
- From Christoph Wiedemann:
-
- - Add implicit dependencies on the commands used to build a target.
-
-
-
-
-RELEASE 0.97.0d20070809 - Fri, 10 Aug 2007 10:51:27 -0500
-
- From Lars Albertsson:
-
- - Don't error if a #include line happens to match a directory
- somewhere on a path (like $CPPPATH, $FORTRANPATH, etc.).
-
- From Mark Bertoglio:
-
- - Fix listing multiple projects in Visual Studio 7.[01] solution files,
- including generating individual project GUIDs instead of re-using
- the solution GUID.
-
- From Jean Brouwers:
-
- - Add /opt/SUNWspro/bin to the default execution PATH on Solaris.
-
- From Allan Erskine:
-
- - Only expect the Microsoft IDL compiler to emit *_p.c and *_data.c
- files if the /proxy and /dlldata switches are used (respectively).
-
- From Steven Knight:
-
- - Have --debug=explain report if a target is being rebuilt because
- AlwaysBuild() is specified (instead of "unknown reasons").
-
- - Support {Get,Set}Option('help') to make it easier for SConscript
- files to tell if a help option (-h, --help, etc.) has been specified.
-
- - Support {Get,Set}Option('random') so random-dependency interaction
- with CacheDir() is controllable from SConscript files.
-
- - Add a new AddOption() function to support user-defined command-
- line flags (like --prefix=, --force, etc.).
-
- - Replace modified Optik version with new optparse compatibility module
- for command line processing in Scripts/SConsOptions.py
-
- - Push and retrieve built symlinks to/from a CacheDir() as actual
- symlinks, not by copying the file contents.
-
- - Fix how the Action module handles stringifying the shared library
- generator in the Tool/mingw.py module.
-
- - When generating a config.h file, print "#define HAVE_{FEATURE} 1"
- instad of just "#define HAVE_{FEATURE}", for more compatibility
- with Autoconf-style projects.
-
- - Fix expansion of $TARGET, $TARGETS, $SOURCE and $SOURCES keywords in
- Visual C/C++ PDB file names.
-
- - Fix locating Visual C/C++ PDB files in build directories.
-
- - Support an env.AddMethod() method and an AddMethod() global function
- for adding a new method, respectively, to a construction environment
- or an arbitrary object (such as a class).
-
- - Fix the --debug=time option when the -j option is specified and all
- files are up to date.
-
- - Add a $SWIGOUTDIR variable to allow setting the swig -outdir option,
- and use it to identify files created by the swig -java option.
-
- - Add a $SWIGPATH variable that specifies the path to be searched
- for included SWIG files, Also add related $SWIGINCPREFIX and
- $SWIGINCSUFFIX variables that specify the prefix and suffix to
- be be added to each $SWIGPATH directory when expanded on the SWIG
- command line.
-
- - More efficient copying of construction environments (mostly borrowed
- from copy.deepcopy() in the standard Python library).
-
- - When printing --tree=prune output, don't print [brackets] around
- source files, only do so for built targets with children.
-
- - Fix interpretation of Builder source arguments when the Builder has
- a src_suffix *and* a source_builder and the argument has no suffix.
-
- - Fix use of expansions like ${TARGET.dir} or ${SOURCE.dir} in the
- following construction variables: $FORTRANMODDIR, $JARCHDIR,
- $JARFLAGS, $LEXFLAGS, $SWIGFLAGS, $SWIGOUTDIR and $YACCFLAGS.
-
- - Fix dependencies on Java files generated by SWIG so they can be
- detected and built in one pass.
-
- - Fix SWIG when used with a BuildDir().
-
- From Leanid Nazdrynau:
-
- - When applying Tool modules after a construction environment has
- already been created, don't overwrite existing $CFILESUFFIX and
- $CXXFILESUFFIX value.
-
- - Support passing the Java() builder a list of explicit .java files
- (not only a list of directories to be scanned for .java files).
-
- - Support passing .java files to the Jar() and JavaH() builders, which
- then use the builder underlying the Java() builder to turn them into
- .class files. (That is, the Jar()-Java() chain of builders become
- multi-step, like the Program()-Object()-CFile() builders.)
-
- - Support passing SWIG .i files to the Java builders (Java(),
- Jar(), JavaH()), to cause intermediate .java files to be created
- automatically.
-
- - Add $JAVACLASSPATH and $JAVASOURCEPATH variables, that get added to
- the javac "-classpath" and "-sourcepath" options. (Note that SCons
- does *not* currently search these paths for implicit dependencies.)
-
- - Commonize initialization of Java-related builders.
-
- From Jan Nijtmans:
-
- - Find Java anonymous classes when the next token after the name is
- an open parenthesis.
-
- From Gary Oberbrunner:
-
- - Fix a code example in the man page.
-
- From Tilo Prutz:
-
- - Add support for the file names that Java 1.5 (and 1.6) generates for
- nested anonymous inner classes, which are different from Java 1.4.
-
- From Adam Simpkins:
-
- - Allow worker threads to terminate gracefully when all jobs are
- finished.
-
- From Sohail Somani:
-
- - Add LaTeX scanner support for finding dependencies specified with
- the \usepackage{} directive.
-
-
-
-RELEASE 0.97 - Thu, 17 May 2007 08:59:41 -0500
-
- From Steven Knight:
-
- - Fix a bug that would make parallel builds stop in their tracks if
- Nodes that depended on lists that contained some Nodes built together
- caused the reference count to drop below 0 if the Nodes were visited
- and commands finished in the wrong order.
-
- - Make sure the DirEntryScanner doesn't choke if it's handed something
- that's not a directory (Node.FS.Dir) Node.
-
-
-
-RELEASE 0.96.96 - Thu, 12 Apr 2007 12:36:25 -0500
-
- NOTE: This is (Yet) a(nother) pre-release of 0.97 for testing purposes.
-
- From Joe Bloggs:
-
- - Man page fix: remove cut-and-paste sentence in NoCache() description.
-
- From Dmitry Grigorenko and Gary Oberbrunner:
-
- - Use the Intel C++ compiler, not $CC, to link C++ source.
-
- From Helmut Grohne:
-
- - Fix the man page example of propagating a user's external environment.
-
- From Steven Knight:
-
- - Back out (most of) the Windows registry installer patch, which
- seems to not work on some versions of Windows.
-
- - Don't treat Java ".class" attributes as defining an inner class.
-
- - Fix detecting an erroneous Java anonymous class when the first
- non-skipped token after a "new" keyword is a closing brace.
-
- - Fix a regression when a CPPDEFINES list contains a tuple, the second
- item of which (the option value) is a construction variable expansion
- (e.g. $VALUE) and the value of the variable isn't a string.
-
- - Improve the error message if an IOError (like trying to read a
- directory as a file) occurs while deciding if a node is up-to-date.
-
- - Fix "maximum recursion" / "unhashable type" errors in $CPPPATH
- PathList expansion if a subsidiary expansion yields a stringable,
- non-Node object.
-
- - Generate API documentation from the docstrings (using epydoc).
-
- - Fix use of --debug=presub with Actions for out-of-the-box Builders.
-
- - Fix handling nested lists within $CPPPATH, $LIBPATH, etc.
-
- - Fix a "builders_used" AttributeError that real-world Qt initialization
- triggered in the refactored suffix handling for Builders.
-
- - Make the reported --debug=time timings meaningful when used with -j.
- Better documentation of what the times mean.
-
- - User Guide updates: --random, AlwaysBuild(), --tree=,
- --debug=findlibs, --debug=presub, --debug=stacktrace,
- --taskmastertrace.
-
- - Document (in both man page and User's Guide) that --implicit-cache
- ignores changes in $CPPPATH, $LIBPATH, etc.
-
- From Jean-Baptiste Lab:
-
- - Remove hard-coded dependency on Python 2.2 from Debian packaging files.
-
- From Jeff Mahovsky:
-
- - Handle spaces in the build target name in Visual Studio project files.
-
- From Rob Managan:
-
- - Re-run LaTeX after BibTeX has been re-run in response to a changed
- .bib file.
-
- From Joel B. Mohler:
-
- - Make additional TeX auxiliary files (.toc, .idx and .bbl files)
- Precious so their removal doesn't affect whether the necessary
- sections are included in output PDF or PostScript files.
-
- From Gary Oberbrunner:
-
- - Fix the ability to import modules in the site_scons directory from
- a subdirectory.
-
- From Adam Simpkins:
-
- - Make sure parallel (-j) builds all targets even if they show up
- multiple times in the child list (as a source and a dependency).
-
- From Matthias Troffaes:
-
- - Don't re-run TeX if the triggering strings (\makeindex, \bibliography
- \tableofcontents) are commented out.
-
- From Richard Viney:
-
- - Fix use of custom include and lib paths with Visual Studio 8.
-
- - Select the default .NET Framework SDK Dir based on the version of
- Visual Studio being used.
-
-
-
-RELEASE 0.96.95 - Mon, 12 Feb 2007 20:25:16 -0600
-
- From Anatoly Techtonik:
-
- - Add the scons.org URL and a package description to the setup.py
- arguments.
-
- - Have the Windows installer add a registry entry for scons.bat in the
- "App Paths" key, so scons.bat can be executed without adding the
- directory to the %PATH%. (Python itself works this way.)
-
- From Anonymous:
-
- - Fix looking for default paths in Visual Studio 8.0 (and later).
-
- - Add -lm to the list of default D libraries for linking.
-
- From Matt Doar:
-
- - Provide a more complete write-your-own-Scanner example in the man page.
-
- From Ralf W. Grosse-Kunstleve:
-
- - Contributed upstream Python change to our copied subprocess.py module
- for more efficient standard input processing.
-
- From Steven Knight:
-
- - Fix the Node.FS.Base.rel_path() method when the two nodes are on
- different drive letters. (This caused an infinite loop when
- trying to write .sconsign files.)
-
- - Fully support Scanners that use a dictionary to map file suffixes
- to other scanners.
-
- - Support delayed evaluation of the $SPAWN variable to allow selection
- of a function via ${} string expansions.
-
- - Add --srcdir as a synonym for -Y/--repository.
-
- - Document limitations of #include "file.h" with Repository().
-
- - Fix use of a toolpath under the source directory of a BuildDir().
-
- - Fix env.Install() with a file name portion that begins with '#'.
-
- - Fix ParseConfig()'s handling of multiple options in a string that's
- replaced a *FLAGS construction variable.
-
- - Have the C++ tools initialize common C compilation variables ($CCFLAGS,
- $SHCCFLAGS and $_CCCOMCOM) even if the 'cc' Tool isn't loaded.
-
- From Leanid Nazdrynau:
-
- - Fix detection of Java anonymous classes if a newline precedes the
- opening brace.
-
- From Gary Oberbrunner:
-
- - Document use of ${} to execute arbitrary Python code.
-
- - Add support for:
- 1) automatically adding a site_scons subdirectory (in the top-level
- SConstruct directory) to sys.path (PYTHONPATH);
- 2) automatically importing site_scons/site_init.py;
- 3) automatically adding site_scons/site_tools to the toolpath.
-
- From John Pye:
-
- - Change ParseConfig() to preserve white space in arguments passed in
- as a list.
-
- From a smith:
-
- - Fix adding explicitly-named Java inner class files (and any
- other file names that may contain a '$') to Jar files.
-
- From David Vitek:
-
- - Add a NoCache() function to mark targets as unsuitable for propagating
- to (or retrieving from) a CacheDir().
-
- From Ben Webb:
-
- - If the swig -noproxy option is used, it won't generate a .py file,
- so don't emit it as a target that we expect to be built.
-
-
-
-RELEASE 0.96.94 - Sun, 07 Jan 2007 18:36:20 -0600
-
- NOTE: This is a pre-release of 0.97 for testing purposes.
-
- From Anonymous:
-
- - Allow arbitrary white space after a SWIG %module declaration.
-
- From Paul:
-
- - When compiling resources under MinGW, make sure there's a space
- between the --include-dir option and its argument.
-
- From Jay Kint:
-
- - Alleviate long command line issues on Windows by executing command
- lines directly via os.spawnv() if the command line doesn't need
- shell interpretation (has no pipes, redirection, etc.).
-
- From Walter Franzini:
-
- - Exclude additional Debian packaging files from the copyright check.
-
- From Fawad Halim:
-
- - Handle the conflict between the impending Python 2.6 'as' keyword
- and our Tool/as.py module name.
-
- From Steven Knight:
-
- - Speed up the Node.FS.Dir.rel_path() method used to generate path names
- that get put into the .sconsign* file(s).
-
- - Optimize Node.FS.Base.get_suffix() by computing the suffix once, up
- front, when we set the Node's name. (Duh...)
-
- - Reduce the Memoizer's responsibilities to simply counting hits and
- misses when the --debug=memoizer option is used, not to actually
- handling the key calculation and memoization itself. This speeds
- up some configurations significantly, and should cause no functional
- differences.
-
- - Add a new scons-time script with subcommands for generating
- consistent timing output from SCons configurations, extracting
- various information from those timings, and displaying them in
- different formats.
-
- - Reduce some unnecessary stat() calls from on-disk entry type checks.
-
- - Fix SideEffect() when used with -j, which was badly broken in 0.96.93.
-
- - Propagate TypeError exceptions when evaluating construction variable
- expansions up the stack, so users can see what's going on.
-
- - When disambiguating a Node.FS.Entry into a Dir or File, don't look
- in the on-disk source directory until we've confirmed there's no
- on-disk entry locally and there *is* one in the srcdir. This avoids
- creating a phantom Node that can interfere with dependencies on
- directory contents.
-
- - Add an AllowSubstExceptions() function that gives the SConscript
- files control over what exceptions cause a string to expand to ''
- vs. terminating processing with an error.
-
- - Allow the f90.py and f95.py Tool modules to compile earlier source
- source files of earlier Fortran version.
-
- - Fix storing signatures of files retrieved from CacheDir() so they're
- correctly identified as up-to-date next invocation.
-
- - Make sure lists of computed source suffixes cached by Builder objects
- don't persist across changes to the list of source Builders (so the
- addition of suffixes like .ui by the qt.py Tool module take effect).
-
- - Enhance the bootstrap.py script to allow it to be used to execute
- SCons more easily from a checked-out source tree.
-
- From Ben Leslie:
-
- - Fix post-Memoizer value caching misspellings in Node.FS._doLookup().
-
- From Rob Managan, Dmitry Mikhin and Joel B. Mohler:
-
- - Handle TeX/LaTeX files in subdirectories by changing directory
- before invoking TeX/LaTeX.
-
- - Scan LaTeX files for \bibliography lines.
-
- - Support multiple file names in a "\bibliography{file1,file2}" string.
-
- - Handle TeX warnings about undefined citations.
-
- - Support re-running LaTeX if necessary due to a Table of Contents.
-
- From Dmitry Mikhin:
-
- - Return LaTeX if "Rerun to get citations correct" shows up on the next
- line after the "Warning:" string.
-
- From Gary Oberbrunner:
-
- - Add #include lines to fix portability issues in two tests.
-
- - Eliminate some unnecessary os.path.normpath() calls.
-
- - Add a $CFLAGS variable for C-specific options, leaving $CCFLAGS
- for options common to C and C++.
-
- From Tom Parker:
-
- - Have the error message print the missing file that Qt can't find.
-
- From John Pye:
-
- - Fix env.MergeFlags() appending to construction variable value of None.
-
- From Steve Robbins:
-
- - Fix the "sconsign" script when the .sconsign.dblite file is explicitly
- specified on the command line (and not intuited from the old way of
- calling it with just ".sconsign").
-
- From Jose Pablo Ezequiel "Pupeno" Fernandez Silva:
-
- - Give the 'lex' tool knowledge of the additional target files produced
- by the flex "--header-file=" and "--tables-file=" options.
-
- - Give the 'yacc' tool knowledge of the additional target files produced
- by the bison "-g", "--defines=" and "--graph=" options.
-
- - Generate intermediate files with Objective C file suffixes (.m) when
- the lex and yacc source files have appropriate suffixes (.lm and .ym).
-
- From Sohail Somain:
-
- - Have the mslink.py Tool only look for a 'link' executable on Windows
- systems.
-
- From Vaclav Smilauer:
-
- - Add support for a "srcdir" keyword argument when calling a Builder,
- which will add a srcdir prefix to all non-relative string sources.
-
- From Jonathan Ultis:
-
- - Allow Options converters to take the construction environment as
- an optional argument.
-
-
-
-RELEASE 0.96.93 - Mon, 06 Nov 2006 00:44:11 -0600
-
- NOTE: This is a pre-release of 0.97 for testing purposes.
-
- From Anonymous:
-
- - Allow Python Value Nodes to be Builder targets.
-
- From Matthias:
-
- - Only filter Visual Studio common filename prefixes on complete
- directory names.
-
- From Chad Austin:
-
- - Fix the build of the SCons documentation on systems that don't
- have "python" in the $PATH.
-
- From Ken Boortz:
-
- - Enhance ParseConfig() to recognize options that begin with '+'.
-
- From John Calcote, Elliot Murphy:
-
- - Document ways to override the CCPDBFLAGS variable to use the
- Microsoft linker's /Zi option instead of the default /Z7.
-
- From Christopher Drexler:
-
- - Make SCons aware bibtex must be called if any \include files
- cause creation of a bibliography.
-
- - Make SCons aware that "\bilbiography" in TeX source files means
- that related .bbl and .blg bibliography files will be created.
- (NOTE: This still needs to search for the string in \include files.)
-
- From David Gruener:
-
- - Fix inconsistent handling of Action strfunction arguments.
-
- - Preserve white space in display Action strfunction strings.
-
- From James Y. Knight and Gerard Patel:
-
- - Support creation of shared object files from assembly language.
-
- From Steven Knight:
-
- - Speed up the Taskmaster significantly by avoiding unnecessary
- re-scans of Nodes to find out if there's work to be done, having it
- track the currently-executed top-level target directly and not
- through its presence on the target list, and eliminating some other
- minor list(s), method(s) and manipulation.
-
- - Fix the expansion of $TARGET and $SOURCE in the expansion of
- $INSTALLSTR displayed for non-environment calls to InstallAs().
-
- - Fix the ability to have an Alias() call refer to a directory
- name that's not identified as a directory until later.
-
- - Enhance runtest.py with an option to use QMTest as the harness.
- This will become the default behavior as we add more functionality
- to the QMTest side.
-
- - Let linking on mingw use the default function that chooses $CC (gcc)
- or $CXX (g++) depending on whether there are any C++ source files.
-
- - Work around a bug in early versions of the Python 2.4 profile module
- that caused the --profile= option to fail.
-
- - Only call Options validators and converters once when initializing a
- construction environment.
-
- - Fix the ability of env.Append() and env.Prepend(), in all known Python
- versions, to handle different input value types when the construction
- variable being updated is a dictionary.
-
- - Add a --cache-debug option for information about what files it's
- looking for in a CacheDir().
-
- - Document the difference in construction variable expansion between
- {Action,Builder}() and env.{Action,Builder}().
-
- - Change the name of env.Copy() to env.Clone(), keeping the old name
- around for backwards compatibility (with the intention of eventually
- phasing it out to avoid confusion with the Copy() Action factory).
-
- From Arve Knudsen:
-
- - Support cleaning and scanning SWIG-generated files.
-
- From Carsten Koch:
-
- - Allow selection of Visual Studio version by setting $MSVS_VERSION
- after construction environment initialization.
-
- From Jean-Baptiste Lab:
-
- - Try using zipimport if we can't import Tool or Platform modules
- using the normal "imp" module. This allows SCons to be packaged
- using py2exe's all-in-one-zip-file approach.
-
- From Ben Liblit:
-
- - Do not re-scan files if the scanner returns no implicit dependencies.
-
- From Sanjoy Mahajan:
-
- - Change use of $SOURCES to $SOURCE in all TeX-related Tool modules.
-
- From Joel B. Mohler:
-
- - Make SCons aware that "\makeindex" in TeX source files means that
- related .ilg, .ind and .idx index files will be created.
- (NOTE: This still needs to search for the string in \include files.)
-
- - Prevent scanning the TeX .aux file for additional files from
- trying to remove it twice when the -c option is used.
-
- From Leanid Nazdrynau:
-
- - Give the MSVC RES (resource) Builder a src_builder list and a .rc
- src_suffix so other builders can generate .rc files.
-
- From Matthew A. Nicholson:
-
- - Enhance Install() and InstallAs() to handle directory trees as sources.
-
- From Jan Nijtmans:
-
- - Don't use the -fPIC flag when using gcc on Windows (e.g. MinGW).
-
- From Greg Noel:
-
- - Add an env.ParseFlags() method that provides separate logic for
- parsing GNU tool chain flags into a dictionary.
-
- - Add an env.MergeFlags() method to apply an arbitrary dictionary
- of flags to a construction environment's variables.
-
- From Gary Oberbrunner:
-
- - Fix parsing tripartite Intel C compiler version numbers on Linux.
-
- - Extend the ParseConfig() function to recognize -arch and
- -isysroot options.
-
- - Have the error message list the known suffixes when a Builder call
- can't build a source file with an unknown suffix.
-
- From Karol Pietrzak:
-
- - Avoid recursive calls to main() in the program snippet used by the
- SConf subsystem to test linking against libraries. This changes the
- default behavior of CheckLib() and CheckLibWithHeader() to print
- "Checking for C library foo..." instead of "Checking for main()
- in C library foo...".
-
- From John Pye:
-
- - Throw an exception if a command called by ParseConfig() or
- ParseFlags() returns an error.
-
- From Stefan Seefeld:
-
- - Initial infrastructure for running SCons tests under QMTest.
-
- From Sohail Somani:
-
- - Fix tests that fail due to gcc warnings.
-
- From Dobes Vandermeer:
-
- - In stack traces, print the full paths of SConscript files.
-
- From Atul Varma:
-
- - Fix detection of Visual C++ Express Edition.
-
- From Dobes Vandermeer:
-
- - Let the src_dir option to the SConscript() function affect all the
- the source file paths, instead of treating all source files paths
- as relative to the SConscript directory itself.
-
- From Nicolas Vigier:
-
- - Fix finding Fortran modules in build directories.
-
- - Fix use of BuildDir() when the source file in the source directory
- is a symlink with a relative path.
-
- From Edward Wang:
-
- - Fix the Memoizer when the SCons Python modules are executed from
- .pyo files at different locations from where they were compiled.
-
- From Johan Zander:
-
- - Fix missing os.path.join() when constructing the $FRAMEWORKSDKDIR/bin.
-
-
-
-RELEASE 0.96.92 - Mon, 10 Apr 2006 21:08:22 -0400
-
- NOTE: This was a pre-release of 0.97 for testing purposes.
-
- From Anonymous:
-
- - Fix the intelc.py Tool module to not throw an exception if the
- only installed version is something other than ia32.
-
- - Set $CCVERSION when using gcc.
-
- From Matthias:
-
- - Support generating project and solution files for Microsoft
- Visual Studio version 8.
-
- - Support generating more than one project file for a Microsoft
- Visual Studio solution file.
-
- - Add support for a support "runfile" parameter to Microsoft
- Visual Studio project file creation.
-
- - Put the project GUID, not the solution GUID, in the right spot
- in the solution file.
-
- From Erling Andersen:
-
- - Fix interpretation of Node.FS objects wrapped in Proxy instances,
- allowing expansion of things like ${File(TARGET)} in command lines.
-
- From Stanislav Baranov:
-
- - Add a separate MSVSSolution() Builder, with support for the
- following new construction variables: $MSVSBUILDCOM, $MSVSCLEANCOM,
- $MSVSENCODING, $MSVSREBUILDCOM, $MSVSSCONS, $MSVSSCONSCOM,
- $MSVSSCONSFLAGS, $MSVSSCONSCRIPT and $MSVSSOLUTIONCOM.
-
- From Ralph W. Grosse-Kunstleve and Patrick Mezard:
-
- - Remove unneceesary (and incorrect) SCons.Util strings on some function
- calls in SCons.Util.
-
- From Bob Halley:
-
- - Fix C/C++ compiler selection on AIX to not always use the external $CC
- environment variable.
-
- From August Hörandl:
-
- - Add a scanner for \include and \import files, with support for
- searching a directory list in $TEXINPUTS (imported from the external
- environment).
-
- - Support $MAKEINDEX, $MAKEINDEXCOM, $MAKEINDEXCOMSTR and
- $MAKEINDEXFLAGS for generating indices from .idx files.
-
- From Steven Johnson:
-
- - Add a NoClean() Environment method and function to override removal
- of targets during a -c clean, including documentation and tests.
-
- From Steven Knight:
-
- - Check for whether files exist on disk by listing the directory
- contents, not calling os.path.exists() file by file. This is
- somewhat more efficient in general, and may be significantly
- more efficient on Windows.
-
- - Minor speedups in the internal is_Dict(), is_List() and is_String()
- functions.
-
- - Fix a signature refactoring bug that caused Qt header files to
- get re-generated every time.
-
- - Don't fail when writing signatures if the .sconsign.dblite file is
- owned by a different user (e.g. root) from a previous run.
-
- - When deleting variables from stacked OverrideEnvironments, don't
- throw a KeyError if we were able to delte the variable from any
- Environment in the stack.
-
- - Get rid of the last indentation tabs in the SCons source files and
- add -tt to the Python invocations in the packaging build and the
- tests so they don't creep back in.
-
- - In Visual Studio project files, put quotes around the -C directory
- so everything works even if the path has spaces in it.
-
- - The Intel Fortran compiler uses -object:$TARGET, not "-o $TARGET",
- when building object files on Windows. Have the the ifort Tool
- modify the default command lines appropriately.
-
- - Document the --debug=explain option in the man page. (How did we
- miss this?)
-
- - Add a $LATEXRETRIES variable to allow configuration of the number of
- times LaTex can be re-called to try to resolve undefined references.
-
- - Change the order of the arguments to Configure.Checklib() to match
- the documentation.
-
- - Handle signature calculation properly when the Python function used
- for a FunctionAction is an object method.
-
- - On Windows, assume that absolute path names without a drive letter
- refer to the drive on which the SConstruct file lives.
-
- - Add /usr/ccs/bin to the end of the the default external execution
- PATH on Solaris.
-
- - Add $PKGCHK and $PKGINFO variables for use on Solaris when searching
- for the SunPRO C++ compiler. Make the default value for $PKGCHK
- be /usr/sbin/pgkchk (since /usr/sbin isn't usually on the external
- execution $PATH).
-
- - Fix a man page example of overriding variables when calling
- SharedLibrary() to also set the $LIBSUFFIXES variable.
-
- - Add a --taskmastertrace=FILE option to give some insight on how
- the taskmaster decides what Node to build next.
-
- - Changed the names of the old $WIN32DEFPREFIX, $WIN32DEFSUFFIX,
- $WIN32DLLPREFIX and $WIN32IMPLIBPREFIX construction variables to
- new $WINDOWSDEFPREFIX, $WINDOWSDEFSUFFIX, $WINDOWSDLLPREFIX and
- $WINDOWSIMPLIBPREFIX construction variables. The old names are now
- deprecated, but preserved for backwards compatibility.
-
- - Fix (?) a runtest.py hang on Windows when the --xml option is used.
-
- - Change the message when an error occurs trying to interact with the
- file system to report the target(s) in square brackets (as before) and
- the actual file or directory that encountered the error afterwards.
-
- From Chen Lee:
-
- - Add x64 support for Microsoft Visual Studio 8.
-
- From Baptiste Lepilleur:
-
- - Support the --debug=memory option on Windows when the Python version
- has the win32process and win32api modules.
-
- - Add support for Visual Studio 2005 Pro.
-
- - Fix portability issues in various tests: test/Case.py,
- Test/Java/{JAR,JARCHDIR,JARFLAGS,JAVAC,JAVACFLAGS,JAVAH,RMIC}.py,
- test/MSVS/vs-{6.0,7.0,7.1,8.0}-exec.py,
- test/Repository/{Java,JavaH,RMIC}.py,
- test/QT/{generated-ui,installed,up-to-date,warnings}.py,
- test/ZIP/ZIP.py.
-
- - Ignore pkgchk errors on Solaris when searching for the C++ compiler.
-
- - Speed up the SCons/EnvironmentTests.py unit tests.
-
- - Add a --verbose= option to runtest.py to print executed commands
- and their output at various levels.
-
- From Christian Maaser:
-
- - Add support for Visual Studio Express Editions.
-
- - Add support for Visual Studio 8 *.manifest files, includng
- new $WINDOWS_INSERT_MANIFEST, $WINDOWSPROGMANIFESTSUFFIX,
- $WINDOWSPROGMANIFESTPREFIX, $WINDOWSPROGMANIFESTSUFFIX,
- $WINDOWSSHLIBMANIFESTPREFIX and $WINDOWSSHLIBMANIFESTSUFFIX
- construction variables.
-
- From Adam MacBeth:
-
- - Fix detection of additional Java inner classes following use of a
- "new" keyword inside an inner class.
-
- From Sanjoy Mahajan:
-
- - Correct TeX-related command lines to just $SOURCE, not $SOURCES
-
- From Patrick Mezard:
-
- - Execute build commands for a command-line target if any of the
- files built along with the target is out of date or non-existent,
- not just if the command-line target itself is out of date.
-
- - Fix the -n option when used with -c to print all of the targets
- that will be removed for a multi-target Builder call.
-
- - If there's no file in the source directory, make sure there isn't
- one in the build directory, too, to avoid dangling files left
- over from previous runs when a source file is removed.
-
- - Allow AppendUnique() and PrependUnique() to append strings (and
- other atomic objects) to lists.
-
- From Joel B. Mohler:
-
- - Extend latex.py, pdflatex.py, pdftex.py and tex.py so that building
- from both TeX and LaTeX files uses the same logic to call $BIBTEX
- when it's necessary, to call $MAKEINDEX when it's necessary, and to
- call $TEX or $LATEX multiple times to handle undefined references.
-
- - Add an emitter to the various TeX builders so that the generated
- .aux and .log files also get deleted by the -c option.
-
- From Leanid Nazdrynau:
-
- - Fix the Qt UIC scanner to work with generated .ui files (by using
- the FindFile() function instead of checking by-hand for the file).
-
- From Jan Nieuwenhuizen:
-
- - Fix a problem with interpreting quoted argument lists on command lines.
-
- From Greg Noel:
-
- - Add /sw/bin to the default execution PATH on Mac OS X.
-
- From Kian Win Ong:
-
- - When building a .jar file and there is a $JARCHDIR, put the -C
- in front of each .class file on the command line.
-
- - Recognize the Java 1.5 enum keyword.
-
- From Asfand Yar Qazi:
-
- - Add /opt/bin to the default execution PATH on all POSIX platforms
- (between /usr/local/bin and /bin).
-
- From Jon Rafkind:
-
- - Fix the use of Configure() contexts from nested subsidiary
- SConscript files.
-
- From Christoph Schulz:
-
- - Add support for $CONFIGUREDIR and $CONFIGURELOG variables to control
- the directory and logs for configuration tests.
-
- - Add support for a $INSTALLSTR variable.
-
- - Add support for $RANLIBCOM and $RANLIBCOMSTR variables (which fixes
- a bug when setting $ARCOMSTR).
-
- From Amir Szekely:
-
- - Add use of $CPPDEFINES to $RCCOM (resource file compilation) on MinGW.
-
- From Erick Tryzelaar:
-
- - Fix the error message when trying to report that a given option is
- not gettable/settable from an SConscript file.
-
- From Dobes Vandermeer:
-
- - Add support for SCC and other settings in Microsoft Visual
- Studio project and solution files: $MSVS_PROJECT_BASE_PATH,
- $MSVS_PROJECT_GUID, $MSVS_SCC_AUX_PATH, $MSVS_SCC_LOCAL_PATH,
- $MSVS_SCC_PROJECT_NAME, $MSVS_SCC_PROVIDER,
-
- - Add support for using a $SCONS_HOME variable (imported from the
- external environment, or settable internally) to put a shortened
- SCons execution line in the Visual Studio project file.
-
- From David J. Van Maren:
-
- - Only filter common prefixes from source files names in Visual Studio
- project files if the prefix is a complete (sub)directory name.
-
- From Thad Ward:
-
- - If $MSVSVERSIONS is already set, don't overwrite it with
- information from the registry.
-
-
-
-RELEASE 0.96.91 - Thu, 08 Sep 2005 07:18:23 -0400
-
- NOTE: This was a pre-release of 0.97 for testing purposes.
-
- From Chad Austin:
-
- - Have the environment store the toolpath and re-use it to find Tools
- modules during later Copy() or Tool() calls (unless overridden).
-
- - Normalize the directory path names in SConsignFile() database
- files so the same signature file can interoperate on Windows and
- non-Windows systems.
-
- - Make --debug=stacktrace print a stacktrace when a UserError is thrown.
-
- - Remove an old, erroneous cut-and-paste comment in Scanner/Dir.py.
-
- From Stanislav Baranov:
-
- - Make it possible to support with custom Alias (sub-)classes.
-
- - Allow Builders to take empty source lists when called.
-
- - Allow access to both TARGET and SOURCE in $*PATH expansions.
-
- - Allow SConscript files to modify BUILD_TARGETS.
-
- From Timothee Besset:
-
- - Add support for Objective C/C++ .m and .mm file suffixes (for
- Mac OS X).
-
- From Charles Crain
-
- - Fix the PharLap linkloc.py module to use target+source arguments
- when calling env.subst().
-
- From Bjorn Eriksson:
-
- - Fix an incorrect Command() keyword argument in the man page.
-
- - Add a $TEMPFILEPREFIX variable to control the prefix or flag used
- to pass a long-command-line-execution tempfile to a command.
-
- From Steven Knight:
-
- - Enhanced the SCons setup.py script to install man pages on
- UNIX/Linux systems.
-
- - Add support for an Options.FormatOptionHelpText() method that can
- be overridden to customize the format of Options help text.
-
- - Add a global name for the Entry class (which had already been
- documented).
-
- - Fix re-scanning of generated source files for implicit dependencies
- when the -j option is used.
-
- - Fix a dependency problem that caused $LIBS scans to not be added
- to all of the targets in a multiple-target builder call, which
- could cause out-of-order builds when the -j option is used.
-
- - Store the paths of source files and dependencies in the .sconsign*
- file(s) relative to the target's directory, not relative to the
- top-level SConstruct directory. This starts to make it possible to
- subdivide the dependency tree arbitrarily by putting an SConstruct
- file in every directory and using content signatures.
-
- - Add support for $YACCHFILESUFFIX and $YACCHXXFILESUFFIX variables
- that accomodate parser generators that write header files to a
- different suffix than the hard-coded .hpp when the -d option is used.
-
- - The default behavior is now to store signature information in a
- single .sconsign.dblite file in the top-level SConstruct directory.
- The old behavior of a separate .sconsign file in each directory can
- be specified by calling SConsignFile(None).
-
- - Remove line number byte codes within the signature calculation
- of Python function actions, so that changing the location of an
- otherwise unmodified Python function doesn't cause rebuilds.
-
- - Fix AddPreAction() and AddPostAction() when an action has more than
- one target file: attach the actions to the Executor, not the Node.
-
- - Allow the source directory of a BuildDir / build_dir to be outside
- of the top-level SConstruct directory tree.
-
- - Add a --debug=nomemoizer option that disables the Memoizer for clearer
- looks at the counts and profiles of the underlying function calls,
- not the Memoizer wrappers.
-
- - Print various --debug= stats even if we exit early (e.g. using -h).
-
- - Really only use the cached content signature value if the file
- is older than --max-drift, not just if --max-drift is set.
-
- - Remove support for conversion from old (pre 0.96) .sconsign formats.
-
- - Add support for a --diskcheck option to enable or disable various
- on-disk checks: that File and Dir nodes match on-disk entries;
- whether an RCS file exists for a missing source file; whether an
- SCCS file exists for a missing source file.
-
- - Add a --raw argument to the sconsign script, so it can print a
- raw representation of each entry's NodeInfo dictionary.
-
- - Add the 'f90' and 'f95' tools to the list of Fortran compilers
- searched for by default.
-
- - Add the +Z option by default when compiling shared objects on
- HP-UX.
-
- From Chen Lee:
-
- - Handle Visual Studio project and solution files in Unicode.
-
- From Sanjoy Mahajan:
-
- - Fix a bad use of Copy() in an example in the man page, and a
- bad regular expression example in the man page and User's Guide.
-
- From Shannon Mann:
-
- - Have the Visual Studio project file(s) echo "Starting SCons" before
- executing SCons, mainly to work around a quote-stripping bug in
- (some versions of?) the Windows cmd command executor.
-
- From Georg Mischler:
-
- - Remove the space after the -o option when invoking the Borland
- BCC compiler; some versions apparently require that the file name
- argument be concatenated with the option.
-
- From Leanid Nazdrynau:
-
- - Fix the Java parser's handling of backslashes in strings.
-
- From Greg Noel:
-
- - Add construction variables to support frameworks on Mac OS X:
- $FRAMEWORKS, $FRAMEWORKPREFIX, $FRAMEWORKPATH, $FRAMEWORKPATHPREFIX.
-
- - Re-order link lines so the -o option always comes right after the
- command name.
-
- From Gary Oberbrunner:
-
- - Add support for Intel C++ beta 9.0 (both 32 and 64 bit versions).
-
- - Document the new $FRAMEWORK* variables for Mac OS X.
-
- From Karol Pietrzak:
-
- - Add $RPATH (-R) support to the Sun linker Tool (sunlink).
-
- - Add a description of env.subst() to the man page.
-
- From Chris Prince:
-
- - Look in the right directory, not always the local directory, for a
- same-named file or directory conflict on disk.
-
- - On Windows, preserve the external environment's %SYSTEMDRIVE%
- variable, too.
-
- From Craig Scott:
-
- - Have the Fortran module emitter look for Fortan modules to be created
- relative to $FORTRANMODDIR, not the top-level directory.
-
- - When saving Options to a file, run default values through the
- converter before comparing them with the set values. This correctly
- suppresses Boolean Option values from getting written to the saved
- file when they're one of the many synonyms for a default True or
- False value.
-
- - Fix the Fortran Scanner's ability to handle a module being used
- in the same file in which it is defined.
-
- From Steve-o:
-
- - Add the -KPIC option by default when compiling shared objects on
- Solaris.
-
- - Change the default suffix for Solaris objects to .o, to conform to
- Sun WorkShop's expectations. Change the profix to so_ so they can
- still be differentiated from static objects in the same directory.
-
- From Amir Szekely:
-
- - When calling the resource compiler on MinGW, add --include-dir and
- the source directory so it finds the source file.
-
- - Update EnsureSConsVersion() to support revision numbers.
-
- From Greg Ward:
-
- - Fix a misplaced line in the man page.
-
-
-
-RELEASE 0.96.90 - Tue, 15 Feb 2005 21:21:12 +0000
-
- NOTE: This was a pre-release of 0.97 for testing purposes.
-
- From Anonymous:
-
- - Fix Java parsing to avoid erroneously identifying a new array
- of class instances as an anonymous inner class.
-
- - Fix a typo in the man page description of PathIsDirCreate.
-
- From Chad Austin:
-
- - Allow Help() to be called multiple times, appending to the help
- text each call.
-
- - Allow Tools found on a toolpath to import Python modules from
- their local directory.
-
- From Steve Christensen:
-
- - Handle exceptions from Python functions as build actions.
-
- - Add a set of canned PathOption validators: PathExists (the default),
- PathIsFile, PathIsDir and PathIsDirCreate.
-
- From Matthew Doar:
-
- - Add support for .lex and .yacc file suffixes for Lex and Yacc files.
-
- From Eric Frias:
-
- - Huge performance improvement: wrap the tuples representing an
- include path in an object, so that the time it takes to hash the
- path doesn't grow porportionally to the length of the path.
-
- From Gottfried Ganssauge:
-
- - Fix SCons on SuSE/AMD-64 Linux by having the wrapper script also
- check for the build engine in the parent directory of the Python
- library directory (/usr/lib64 instead of /usr/lib).
-
- From Stephen Kennedy:
-
- - Speed up writing the .sconsign file at the end of a run by only
- calling sync() once at the end, not after every entry.
-
- From Steven Knight:
-
- - When compiling with Microsoft Visual Studio, don't include the ATL and
- MFC directories in the default INCLUDE and LIB environment variables.
-
- - Remove the following deprecated features: the ParseConfig()
- global function (deprecated in 0.93); the misspelled "validater"
- keyword to the Options.Add() method (deprecated in 0.91); the
- SetBuildSignatureType(), SetContentSignatureType(), SetJobs() and
- GetJobs() global functions (deprecated in 0.14).
-
- - Fix problems with corrupting the .sconsign.dblite file when
- interrupting builds by writing to a temporary file and renaming,
- not writing the file directly.
-
- - Fix a 0.96 regression where when running with -k, targets built from
- walking dependencies later on the command line would not realize
- that a dependency had failed an earlier build attempt, and would
- try to rebuild the dependent targets.
-
- - Change the final messages when using -k and errors occur from
- "{building,cleaning} terminated because of errors" to "done
- {building,cleaning} targets (errors occurred during {build,clean})."
-
- - Allow Configure.CheckFunc() to take an optional header argument
- (already supported by Conftest.py) to specify text at the top of
- the compiled test file.
-
- - Fix the --debug=explain output when a Python function action changed
- so it prints a meaningful string, not the binary representation of
- the function contents.
-
- - Allow a ListOption's default value(s) to be a Python list of specified
- values, not just a string containing a comma-separated list of names.
-
- - Add a ParseDepends() function that will parse up a list of explicit
- dependencies from a "make depend" style file.
-
- - Support the ability to change directory when executing an Action
- through "chdir" keyword arguments to Action and Builder creation
- and calls.
-
- - Fix handling of Action ojects (and other callables that don't match
- our calling arguments) in construction variable expansions.
-
- - On Win32, install scons.bat in the Python directory when installing
- from setup.py. (The bdist_wininst installer was already doing this.)
-
- - Fix env.SConscript() when called with a list of SConscipt files.
- (The SConscript() global function already worked properly.)
-
- - Add a missing newline to the end of the --debug=explain "unknown
- reasons" message.
-
- - Enhance ParseConfig() to work properly for spaces in between the -I,
- -L and -l options and their arguments.
-
- - Packaging build fix: Rebuild the files that are use to report the
- --version of SCons whenever the development version number changes.
-
- - Fix the ability to specify a target_factory of Dir() to a Builder,
- which the default create-a-directory Builder was interfering with.
-
- - Mark a directory as built if it's created as part of the preparation
- for another target, to avoid trying to build it again when it comes
- up in the target list.
-
- - Allow a function with the right calling signature to be put directly
- in an Environment's BUILDERS dictionary, making for easier creation
- and use of wrappers (pseudo-Builders) that call other Builders.
-
- - On Python 2.x, wrap lists of Nodes returned by Builders in a UserList
- object that adds a method that makes str() object return a string
- with all of the Nodes expanded to their path names. (Builders under
- Python 1.5.2 still return lists to avoid TypeErrors when trying
- to extend() list, so Python 1.5.2 doesn't get pretty-printing of Node
- lists, but everything should still function.)
-
- - Allow Aliases to have actions that will be executed whenever
- any of the expanded Alias targets are out of date.
-
- - Fix expansion of env.Command() overrides within target and
- source file names.
-
- - Support easier customization of what's displayed by various default
- actions by adding lots of new construction variables: $ARCOMSTR,
- $ASCOMSTR, $ASPPCOMSTR, $BIBTEXCOMSTR, $BITKEEPERCOMSTR, $CCCOMSTR,
- $CVSCOMSTR, $CXXCOMSTR, $DCOMSTR, $DVIPDFCOMSTR, $F77COMSTR,
- $F90COMSTR, $F95COMSTR, $FORTRANCOMSTR, $GSCOMSTR, $JARCOMSTR,
- $JAVACCOMSTR, $JAVAHCOMSTR, $LATEXCOMSTR, $LEXCOMSTR, $LINKCOMSTR,
- $M4COMSTR, $MIDLCOMSTR, $P4COMSTR, $PCHCOMSTR, $PDFLATEXCOMSTR,
- $PDFTEXCOMSTR, $PSCOMSTR, $QT_MOCFROMCXXCOMSTR, $QT_MOCFROMHCOMSTR,
- $QT_UICCOMSTR, $RCCOMSTR, $REGSVRCOMSTR, $RCS_COCOMSTR, $RMICCOMSTR,
- $SCCSCOMSTR, $SHCCCOMSTR, $SHCXXCOMSTR, $SHF77COMSTR, $SHF90COMSTR,
- $SHF95COMSTR, $SHFORTRANCOMSTR, $SHLINKCOMSTR, $SWIGCOMSTR,
- $TARCOMSTR, $TEXCOMSTR, $YACCCOMSTR and $ZIPCOMSTR.
-
- - Add an optional "map" keyword argument to ListOption() that takes a
- dictionary to map user-specified values to legal values from the list
- (like EnumOption() already doee).
-
- - Add specific exceptions to try:-except: blocks without any listed,
- so that they won't catch and mask keyboard interrupts.
-
- - Make --debug={tree,dtree,stree} print something even when there's
- a build failure.
-
- - Fix how Scanners sort the found dependencies so that it doesn't
- matter whether the dependency file is in a Repository or not.
- This may cause recompilations upon upgrade to this version.
-
- - Make AlwaysBuild() work with Alias and Python value Nodes (making
- it much simpler to support aliases like "clean" that just invoke
- an arbitrary action).
-
- - Have env.ParseConfig() use AppendUnique() by default to suppress
- duplicate entries from multiple calls. Add a "unique" keyword
- argument to allow the old behavior to be specified.
-
- - Allow the library modules imported by an SConscript file to get at
- all of the normally-available global functions and variables by saying
- "from SCons.Script import *".
-
- - Add a --debug=memoizer option to print Memoizer hit/mass statistics.
-
- - Allow more than one --debug= option to be set at a time.
-
- - Change --debug=count to report object counts before and after
- reading SConscript files and before and after building targets.
-
- - Change --debug=memory output to line up the numbers and to better
- match (more or less) the headers on the --debug=count columns.
-
- - Speed things up when there are lists of targets and/or sources by
- getting rid of some N^2 walks of the lists involved.
-
- - Cache evaluation of LazyActions so we don't create a new object
- for each invocation.
-
- - When scanning, don't create Nodes for include files that don't
- actually exist on disk.
-
- - Make supported global variables CScanner, DScanner, ProgramScanner and
- SourceFileScanner. Make SourceFileScanner.add_scanner() a supported
- part of the public interface. Keep the old SCons.Defaults.*Scan names
- around for a while longer since some people were already using them.
-
- - By default, don't scan directories for on-disk files. Add a
- DirScanner global scanner that can be used in Builders or Command()
- calls that want source directory trees scanned for on-disk changes.
- Have the Tar() and Zip() Builders use the new DirScanner to preserve
- the behavior of rebuilding a .tar or .zip file if any file or
- directory under a source tree changes. Add Command() support for
- a source_scanner keyword argument to Command() that can be set to
- DirScanner to get this behavior.
-
- - Documentation changes: Explain that $CXXFLAGS contains $CCFLAGS
- by default. Fix a bad target_factory example in the man page.
- Add appendices to the User's Guide to cover the available Tools,
- Builders and construction variables. Comment out the build of
- the old Python 10 paper, which doesn't build on all systems and
- is old enough at this point that it probably isn't worth the
- effort to make it do so.
-
- From Wayne Lee:
-
- - Avoid "maximum recursion limit" errors when removing $(-$) pairs
- from long command lines.
-
- From Clive Levinson:
-
- - Make ParseConfig() recognize and add -mno-cygwin to $LINKFLAGS and
- $CCFLAGS, and -mwindows to $LINKFLAGS.
-
- From Michael McCracken:
-
- - Add a new "applelink" tool to handle the things like Frameworks and
- bundles that Apple has added to gcc for linking.
-
- - Use more appropriate default search lists of linkers, compilers and
- and other tools for the 'darwin' platform.
-
- - Add a LoadableModule Builder that builds a bundle on Mac OS X (Darwin)
- and a shared library on other systems.
-
- - Improve SWIG tests for use on Mac OS X (Darwin).
-
- From Elliot Murphy:
-
- - Enhance the tests to guarantee persistence of ListOption
- values in saved options files.
-
- - Supply the help text when -h is used with the -u, -U or -D options.
-
- From Christian Neeb:
-
- - Fix the Java parser's handling of string definitions to avoid ignoring
- subsequent code.
-
- From Han-Wen Nienhuys:
-
- - Optimize variable expansion by: using the re.sub() method (when
- possible); not using "eval" for variables for which we can fetch the
- value directory; avoiding slowing substitution logic when there's no
- '$' in the string.
-
- From Gary Oberbrunner:
-
- - Add an Environment.Dump() method to print the contents of a
- construction environment.
-
- - Allow $LIBS (and similar variables) to contain explicit File Nodes.
-
- - Change ParseConfig to add the found library names directly to the
- $LIBS variable, instead of returning them.
-
- - Add ParseConfig() support for the -framework GNU linker option.
-
- - Add a PRINT_CMD_LINE_FUNC construction variable to allow people
- to filter (or log) command-line output.
-
- - Print an internal Python stack trace in response to an otherwise
- unexplained error when --debug=stacktrace is specified.
-
- - Add a --debug=findlibs option to print what's happening when
- the scanner is searching for libraries.
-
- - Allow Tool specifications to be passed a dictionary of keyword
- arguments.
-
- - Support an Options default value of None, in which case the variable
- will not be added to the construction environment unless it's set
- explicitly by the user or from an Options file.
-
- - Avoid copying __builtin__ values into a construction environment's
- dictionary when evaluating construction variables.
-
- - Add a new cross-platform intelc.py Tool that can detect and
- configure the Intel C++ v8 compiler on both Windows, where it's
- named icl, and Linux, where it's named icc. It also checks that
- the directory specified in the Windows registry exists, and sets a
- new $INTEL_C_COMPILER_VERSION construction variable to identify the
- version being used. (Niall Douglas contributed an early prototype
- of parts of this module.)
-
- - Fix the private Conftest._Have() function so it doesn't change
- non-alphanumeric characters to underscores.
-
- - Supply a better error message when a construction variable expansion
- has an unknown attribute.
-
- - Documentation changes: Update the man page to describe use of
- filenames or Nodes in $LIBS.
-
- From Chris Pawling:
-
- - Have the linkloc tool use $MSVS_VERSION to select the Microsoft
- Visual Studio version to use.
-
- From Kevin Quick:
-
- - Fix the Builder name returned from ListBuilders and other instances
- of subclasses of the BuilderBase class.
-
- - Add Builders and construction variables to support rpcgen:
- RPCGenClient(), RPCGenHeader(), RPCGenService(), RPCGenXDR(),
- $RPCGEN, $RPCGENFLAGS, $RPCGENCLIENTFLAGS, $RPCGENHEADERFLAGS,
- $RPCGENSERVICEFLAGS, $RPCGENXDRFLAGS.
-
- - Update the man page to document that prefix and suffix Builder
- keyword arguments can be strings, callables or dictionaries.
-
- - Provide more info in the error message when a user tries to build
- a target multiple ways.
-
- - Fix Delete() when a file doesn't exist and must_exist=1. (We were
- unintentionally dependent on a bug in versions of the Python shutil.py
- module prior to Python 2.3, which would generate an exception for
- a nonexistent file even when ignore_errors was set.)
-
- - Only replace a Node's builder with a non-null source builder.
-
- - Fix a stack trace when a suffix selection dictionary is passed
- an empty source file list.
-
- - Allow optional names to be attached to Builders, for default
- Builders that don't get attached to construction environments.
-
- - Fix problems with Parallel Task Exception handling.
-
- - Build targets in an associated BuildDir even if there are targets
- or subdirectories locally in the source directory.
-
- - If a FunctionAction has a callable class as its underlying Python
- function, use its strfunction() method (if any) to display the
- action.
-
- - Fix handling when BuildDir() exists but is unwriteable. Add
- "Stop." to those error messages for consistency.
-
- - Catch incidents of bad builder creation (without an action) and
- supply meaningful error messages.
-
- - Fix handling of src_suffix values that aren't extensions (don't
- begin with a '.').
-
- - Don't retrieve files from a CacheDir, but report what would happen,
- when the -n option is used.
-
- - Use the source_scanner from the target Node, not the source node
- itself.
-
- - Internal Scanners fixes: Make sure Scanners are only passed Nodes.
- Fix how a Scanner.Selector called its base class initialization.
- Make comparisons of Scanner objects more robust. Add a name to
- an internal default ObjSourceScanner.
-
- - Add a deprecated warning for use of the old "scanner" keyword argument
- to Builder creation.
-
- - Improve the --debug=explain message when the build action changes.
-
- - Test enhancements in SourceCode.py, option-n.py, midl.py. Better
- Command() and Scanner test coverage. Improved test infrastructure
- for -c output.
-
- - Refactor the interface between Action and Executor objects to treat
- Actions atomically.
-
- - The --debug=presub option will now report the pre-substitution
- each action seprately, instead of reporting the entire list before
- executing the actions one by one.
-
- - The --debug=explain option explaining a changed action will now
- (more correctly) show pre-substitution action strings, instead of
- the commands with substituted file names.
-
- - A Node (file) will now be rebuilt if its PreAction or PostAction
- actions change.
-
- - Python Function actions now have their calling signature (target,
- source, env) reported correctly when displayed.
-
- - Fix BuildDir()/build_dir handling when the build_dir is underneath
- the source directory and trying to use entries from the build_dir
- as sources for other targets in the build-dir.
-
- - Fix hard-coding of JDK path names in various Java tests.
-
- - Handle Python stack traces consistently (stop at the SConscript stack
- frame, by default) even if the Python source code isn't available.
-
- - Improve the performance of the --debug={tree,dtree} options.
-
- - Add --debug=objects logging of creation of OverrideWarner,
- EnvironmentCopy and EnvironmentOverride objects.
-
- - Fix command-line expansion of Python Value Nodes.
-
- - Internal cleanups: Remove an unnecessary scan argument. Associate
- Scanners only with Builders, not nodes. Apply overrides once when
- a Builder is called, not in multiple places. Cache results from the
- Node.FS.get_suffix() and Node.get_build_env() methods. Use the Python
- md5 modules' hexdigest() method, if there is one. Have Taskmaster
- call get_stat() once for each Node and re-use the value instead of
- calling it each time it needs the value. Have Node.depends_on()
- re-use the list from the children() method instead of calling it
- multiple times.
-
- - Use the correct scanner if the same source file is used for targets in
- two different environments with the same path but different scanners.
-
- - Collect logic for caching values in memory in a Memoizer class,
- which cleans up a lot of special-case code in various methods and
- caches additional values to speed up most configurations.
-
- - Add a PathAccept validator to the list of new canned PathOption
- validators.
-
- From Jeff Squyres:
-
- - Documentation changes: Use $CPPDEFINES instead of $CCFLAGS in man
- page examples.
-
- From Levi Stephen:
-
- - Allow $JARCHDIR to be expanded to other construction variables.
-
- From Christoph Wiedemann:
-
- - Add an Environment.SetDefault() method that only sets values if
- they aren't already set.
-
- - Have the qt.py Tool not override variables already set by the user.
-
- - Add separate $QT_BINPATH, $QT_CPPPATH and $QT_LIBPATH variables
- so these can be set individually, instead of being hard-wired
- relative to $QTDIR.
-
- - The %TEMP% and %TMP% external environment variables are now propagated
- automatically to the command execution environment on Windows systems.
-
- - A new --config= command-line option allows explicit control of
- of when the Configure() tests are run: --config=force forces all
- checks to be run, --config=cache uses all previously cached values,
- --config=auto (the default) runs tests only when dependency analysis
- determines it's necessary.
-
- - The Configure() subsystem can now write a config.h file with values
- like HAVE_STDIO_H, HAVE_LIBM, etc.
-
- - The Configure() subsystem now executes its checks silently when the
- -Q option is specified.
-
- - The Configure() subsystem now reports if a test result is being
- taken from cache, and prints the standard output and error output
- of tests even when cached.
-
- - Configure() test results are now reported as "yes" or "no" instead of
- "ok" or "failed."
-
- - Fixed traceback printing when calling the env.Configure() method
- instead of the Configure() global function.
-
- - The Configure() subsystem now caches build failures in a .sconsign
- file in the subdirectory, not a .cache file. This may cause
- tests to be re-executed the first time after you install 0.97.
-
- - Additional significant internal cleanups in the Configure() subsystem
- and its tests.
-
- - Have the Qt Builder make uic-generated files dependent on the .ui.h
- file, if one exists.
-
- - Add a test to make sure that SCons source code does not contain
- try:-except: blocks that catch all errors, which potentially catch
- and mask keyboard interrupts.
-
- - Fix us of TargetSignatures('content') with the SConf subsystem.
-
- From Russell Yanofsky:
-
- - Add support for the Metrowerks Codewarrior compiler and linker
- (mwcc and mwld).
-
-
-
-RELEASE 0.96.1 - Mon, 23 Aug 2004 12:55:50 +0000
-
- From Craig Bachelor:
-
- - Handle white space in the executable Python path name within in MSVS
- project files by quoting the path.
-
- - Correct the format of a GUID string in a solution (.dsw) file so
- MSVS can correctly "build enable" a project.
-
- From Steven Knight:
-
- - Add a must_exist flag to Delete() to let the user control whether
- it's an error if the specified entry doesn't exist. The default
- behavior is now to silently do nothing if it doesn't exist.
-
- - Package up the new Platform/darwin.py, mistakenly left out of 0.96.
-
- - Make the scons.bat REM statements into @REM so they aren't printed.
-
- - Make the SCons packaging SConscript files platform independent.
-
- From Anthony Roach:
-
- - Fix scanning of pre-compiled header (.pch) files for #includes,
- broken in 0.96.
-
-
-
-RELEASE 0.96 - Wed, 18 Aug 2004 13:36:40 +0000
-
- From Chad Austin:
-
- - Make the CacheDir() directory if it doesn't already exist.
-
- - Allow construction variable substitutions in $LIBS specifications.
-
- - Allow the emitter argument to a Builder() to be or expand to a list
- of emitter functions, which will be called in sequence.
-
- - Suppress null values in construction variables like $LIBS that use
- the internal _concat() function.
-
- - Remove .dll files from the construction variables searched for
- libraries that can be fed to Win32 compilers.
-
- From Chad Austin and Christoph Wiedemann:
-
- - Add support for a $RPATH variable to supply a list of directories
- to search for shared libraries when linking a program. Used by
- the GNU and IRIX linkers (gnulink and sgilink).
-
- From Charles Crain:
-
- - Restore the ability to do construction variable substitutions in all
- kinds of *PATH variables, even when the substitution returns a Node
- or other object.
-
- From Tom Epperly:
-
- - Allow the Java() Builder to take more than one source directory.
-
- From Ralf W. Grosse-Kunstleve:
-
- - Have SConsignFile() use, by default, a custom "dblite.py" that we can
- control and guarantee to work on all Python versions (or nearly so).
-
- From Jonathan Gurley:
-
- - Add support for the newer "ifort" versions of the Intel Fortran
- Compiler for Linux.
-
- From Bob Halley:
-
- - Make the new *FLAGS variable type work with copied Environments.
-
- From Chris Hoeppler:
-
- - Initialize the name of a Scanner.Classic scanner correctly.
-
- From James Juhasz:
-
- - Add support for the .dylib shared library suffix and the -dynamiclib
- linker option on Mac OS X.
-
- From Steven Knight:
-
- - Add an Execute() method for executing actions directly.
-
- - Support passing environment override keyword arguments to Command().
-
- - Fix use of $MSVS_IGNORE_IDE_PATHS, which was broken when we added
- support for $MSVS_USE_MFC_DIRS last release.
-
- - Make env.Append() and env.Prepend() act like the underlying Python
- behavior when the variable being appended to is a UserList object.
-
- - Fix a regression that prevented the Command() global function in
- 0.95 from working with command-line strings as actions.
-
- - Fix checking out a file from a source code management system when
- the env.SourceCode() method was called with an individual file name
- or node, not a directory name or node.
-
- - Enhance the Task.make_ready() method to create a list of the
- out-of-date Nodes for the task for use by the wrapping interface.
-
- - Allow Scanners to pull the list of suffixes from the construction
- environment when the "skeys" keyword argument is a string containing
- a construction variable to be expanded.
-
- - Support new $CPPSUFFIXES, $DSUFFIXES $FORTRANSUFFIXES, and
- $IDLSUFFIXES. construction variables that contain the default list
- of suffixes to be scanned by a given type of scanner, allowing these
- suffix lists to be easily added to or overridden.
-
- - Speed up Node creation when calling a Builder by comparing whether two
- Environments are the same object, not if their underlying dictionaries
- are equivalent.
-
- - Add a --debug=explain option that reports the reason(s) why SCons
- thinks it must rebuild something.
-
- - Add support for functions that return platform-independent Actions
- to Chmod(), Copy(), Delete(), Mkdir(), Move() and Touch() files
- and/or directories. Like any other Actions, the returned Action
- object may be executed directly using the Execute() global function
- or env.Execute() environment method, or may be used as a Builder
- action or in an env.Command() action list.
-
- - Add support for the strfunction argument to all types of Actions:
- CommandAction, ListAction, and CommandGeneratorAction.
-
- - Speed up turning file system Nodes into strings by caching the
- values after we're finished reading the SConscript files.
-
- - Have ParseConfig() recognize and supporting adding the -Wa, -Wl,
- and -Wp, flags to ASFLAGS, LINKFLAGS and CPPFLAGS, respectively.
-
- - Change the .sconsign format and the checks for whether a Node is
- up-to-date to make dependency checks more efficient and correct.
-
- - Add wrapper Actions to SCons.Defaults for $ASCOM, $ASPPCOM, $LINKCOM,
- $SHLINKCOM, $ARCOM, $LEXCOM and $YACCCOM. This makes it possible
- to replace the default print behavior with a custom strfunction()
- for each of these.
-
- - When a Node has been built, don't walk the whole tree back to delete
- the parents's implicit dependencies, let returning up the normal
- Taskmaster descent take care of it for us.
-
- - Add documented support for separate target_scanner and source_scanner
- arguments to Builder creation, which allows different scanners to
- be applied to source files
-
- - Don't re-install or (re-generate) .h files when a subsidiary #included
- .h file changes. This eliminates incorrect circular dependencies
- with .h files generated from other source files.
-
- - Slim down the internal Sig.Calculator class by eliminating methods
- whose functionality is now covered by Node methods.
-
- - Document use of the target_factory and source_factory keyword
- arguments when creating Builder objects. Enhance Dir Nodes so that
- they can be created with user-specified Builder objects.
-
- - Don't blow up with stack trace when the external $PATH environment
- variable isn't set.
-
- - Make Builder calls return lists all the time, even if there's only
- one target. This keeps things consistent and easier to program to
- across platforms.
-
- - Add a Flatten() function to make it easier to deal with the Builders
- all returning lists of targets, not individual targets.
-
- - Performance optimizations in Node.FS.__doLookup().
-
- - Man page fixes: formatting typos, misspellings, bad example.
-
- - User's Guide fixes: Fix the signatures of the various example
- *Options() calls. Triple-quote properly a multi-line Split example.
-
- - User's Guide additions: Chapter describing File and Directory
- Nodes. Section describing declarative nature of SCons functions in
- SConscript files. Better organization and clarification of points
- raised by Robert P. J. Day. Chapter describing SConf (Autoconf-like)
- functionality. Chapter describing how to install Python and
- SCons. Chapter describing Java builds.
-
- From Chris Murray:
-
- - Add a .win32 attribute to force file names to expand with
- Windows backslash path separators.
-
- - Fix escaping file names on command lines when the expansion is
- concatenated with another string.
-
- - Add support for Fortran 90 and Fortran 95. This adds $FORTRAN*
- variables that specify a default compiler, command-line, flags,
- etc. for all Fortran versions, plus separate $F90* and $F95*
- variables for when different compilers/flags/etc. must be specified
- for different Fortran versions.
-
- - Have individual tools that create libraries override the default
- $LIBPREFIX and $LIBSUFFIX values set by the platform. This makes
- it easier to use Microsoft Visual Studio tools on a CygWin platform.
-
- From Gary Oberbrunner:
-
- - Add a --debug=presub option to print actions prior to substitution.
-
- - Add a warning upon use of the override keywords "targets" and
- "sources" when calling Builders. These are usually mistakes which
- are otherwise silently (and confusingly) turned into construction
- variable overrides.
-
- - Try to find the ICL license file path name in the external environment
- and the registry before resorting to the hard-coded path name.
-
- - Add support for fetching command-line keyword=value arguments in
- order from an ARGLIST list.
-
- - Avoid stack traces when trying to read dangling symlinks.
-
- - Treat file "extensions" that only contain digits as part of the
- file basename. This supports version numbers as part of shared
- library names, for example.
-
- - Avoid problems when there are null entries (None or '') in tool
- lists or CPPPATH.
-
- - Add an example and explanation of how to use "tools = ['default', ..."
- when creating a construction environment.
-
- - Add a section describing File and Directory Nodes and some of their
- attributes and methods.
-
- - Have ParseConfig() add a returned -pthread flag to both $CCFLAGS
- and $LINKFLAGS.
-
- - Fix some test portability issues on Mac OS X (darwin).
-
- From Simon Perkins:
-
- - Fix a bug introduced in building shared libraries under MinGW.
-
- From Kevin Quick:
-
- - Handling SCons exceptions according to Pythonic standards.
-
- - Fix test/chained-build.py on systems that execute within one second.
-
- - Fix tests on systems where 'ar' warns about archive creation.
-
- From Anthony Roach:
-
- - Fix use of the --implicit-cache option with timestamp signatures.
-
- - If Visual Studio is installed, assume the C/C++ compiler, the linker
- and the MIDL compiler that comes with it are available, too.
-
- - Better error messages when evaluating a construction variable
- expansion yields a Python syntax error.
-
- - Change the generation of PDB files when using Visual Studio from
- compile time to link time.
-
- From sam th:
-
- - Allow SConf.CheckLib() to search a list of libraries, like the
- Autoconf AC_SEARCH_LIBS macro.
-
- - Allow the env.WhereIs() method to take a "reject" argument to
- let it weed out specific path names.
-
- From Christoph Wiedemann:
-
- - Add new Moc() and Uic() Builders for more explicit control over
- Qt builds, plus new construction variables to control them:
- $QT_AUTOSCAN, $QT_DEBUG, $QT_MOCCXXPREFIX, $QT_MOCCXXSUFFIX,
- $QT_MOCHPREFIX, $QT_MOCHSUFFIX, $QT_UICDECLPREFIX, $QT_UICDECLSUFFIX,
- $QT_UICIMPLPREFIX, $QT_UICIMPLSUFFIX and $QT_UISUFFIX.
-
- - Add a new single_source keyword argument for Builders that enforces
- a single source file on calls to the Builder.
-
-
-
-RELEASE 0.95 - Mon, 08 Mar 2004 06:43:20 -0600
-
- From Chad Austin:
-
- - Replace print statements with calls to sys.stdout.write() so output
- lines stay together when -j is used.
-
- - Add portability fixes for a number of tests.
-
- - Accomodate the fact that Cygwin's os.path.normcase() lies about
- the underlying system being case-sensitive.
-
- - Fix an incorrect _concat() call in the $RCINCFLAGS definition for
- the mingw Tool.
-
- - Fix a problem with the msvc tool with Python versions prior to 2.3.
-
- - Add support for a "toolpath" Tool() and Environment keyword that
- allows Tool modules to be found in specified local directories.
-
- - Work around Cygwin Python's silly fiction that it's using a
- case-sensitive file system.
-
- - More robust handling of data in VCComponents.dat.
-
- - If the "env" command is available, spawn commands with the more
- general "env -" instead of "env -i".
-
- From Kerim Borchaev:
-
- - Fix a typo in a msvc.py's registry lookup: "VCComponents.dat", not
- "VSComponents.dat".
-
- From Chris Burghart:
-
- - Fix the ability to save/restore a PackageOption to a file.
-
- From Steve Christensen:
-
- - Update the MSVS .NET and MSVC 6.0/7.0 path detection.
-
- From David M. Cooke:
-
- - Make the Fortran scanner case-insensitive for the INCLUDE string.
-
- From Charles Crain:
-
- - If no version of MSVC is detected but the tool is specified,
- use the MSVC 6.0 paths by default.
-
- - Ignore any "6.1" version of MSVC found in the registry; this is a
- phony version number (created by later service packs?) and would
- throw off the logic if the user had any non-default paths configure.
-
- - Correctly detect if the user has independently configured the MSVC
- "include," "lib" or "path" in the registry and use the appropriate
- values. Previously, SCons would only use the values if all three
- were set in the registry.
-
- - Make sure side-effect nodes are prepare()d before building their
- corresponding target.
-
- - Preserve the ability to call BuildDir() multiple times with the
- same target and source directory arguments.
-
- From Andy Friesen:
-
- - Add support for the Digital Mars "D" programming language.
-
- From Scott Lystig Fritchie:
-
- - Fix the ability to use a custom _concat() function in the
- construction environment when calling _stripixes().
-
- - Make the message about ignoring a missing SConscript file into a
- suppressable Warning, not a hard-coded sys.stderr.write().
-
- - If a builder can be called multiple times for a target (because
- the sources and overrides are identical, or it's a builder with the
- "multi" flag set), allow the builder to be called through multiple
- environments so long as the builders have the same signature for
- the environments in questions (that is, they're the same action).
-
- From Bob Halley:
-
- - When multiple targets are built by a single action, retrieve all
- of them from cache, not just the first target, and exec the build
- command if any of the targets isn't present in the cache.
-
- From Zephaniah Hull:
-
- - Fix command-line ARGUMENTS with multiple = in them.
-
- From Steven Knight:
-
- - Fix EnsureSConsVersion() so it checks against the SCons version,
- not the Python version, on Pythons with sys.version_info.
-
- - Don't swallow the AttributeError when someone uses an expansion like
- $TARGET.bak, so we can supply a more informative error message.
-
- - Fix an odd double-quote escape sequence in the man page.
-
- - Fix looking up a naked drive letter as a directory (Dir('C:')).
-
- - Support using File nodes in the LIBS construction variable.
-
- - Allow the LIBS construction variable to be a single string or File
- node, not a list, when only one library is needed.
-
- - Fix typos in the man page: JAVACHDIR => JARCHDIR; add "for_signature"
- to the __call__() example in the "Variable Substitution" section.
-
- - Correct error message spellings of "non-existant" to "non-existent."
-
- - When scanning for libraries to link with, don't append $LIBPREFIXES
- or $LIBSUFFIXES values to the $LIBS values if they're already present.
-
- - Add a ZIPCOMPRESSION construction variable to control whether the
- internal Python action for the Zip Builder compresses the file or
- not. The default value is zipfile.ZIP_DEFLATED, which generates
- a compressed file.
-
- - Refactor construction variable expansion to support recursive
- expansion of variables (e.g. CCFLAGS = "$CCFLAGS -g") without going
- into an infinite loop. Support this in all construction variable
- overrides, as well as when copying Environments.
-
- - Fix calling Configure() from more than one subsidiary SConscript file.
-
- - Fix the env.Action() method so it returns the correct type of
- Action for its argument(s).
-
- - Fix specifying .class files as input to JavaH with the .class suffix
- when they weren't generated using the Java Builder.
-
- - Make the check for whether all of the objects going into a
- SharedLibrary() are shared work even if the object was built in a
- previous run.
-
- - Supply meaningful error messages, not stack traces, if we try to add
- a non-Node as a source, dependency, or ignored dependency of a Node.
-
- - Generate MSVS Project files that re-invoke SCons properly regardless
- of whether the file was built via scons.bat or scons.py.
- (Thanks to Niall Douglas for contributing code and testing.)
-
- - Fix TestCmd.py, runtest.py and specific tests to accomodate being
- run from directories whose paths include white space.
-
- - Provide a more useful error message if a construction variable
- expansion contains a syntax error during evaluation.
-
- - Fix transparent checkout of implicit dependency files from SCCS
- and RCS.
-
- - Added new --debug=count, --debug=memory and --debug=objects options.
- --debug=count and --debug=objects only print anything when run
- under Python 2.1 or later.
-
- - Deprecate the "overrides" keyword argument to Builder() creation
- in favor of using keyword argument values directly (like we do
- for builder execution and the like).
-
- - Always use the Builder overrides in substitutions, not just if
- there isn't a target-specific environment.
-
- - Add new "rsrcpath" and "rsrcdir" and attributes to $TARGET/$SOURCE,
- so Builder command lines can find things in Repository source
- directories when using BuildDir.
-
- - Fix the M4 Builder so that it chdirs to the Repository directory
- when the input file is in the source directory of a BuildDir.
-
- - Save memory at build time by allowing Nodes to delete their build
- environments after they've been built.
-
- - Add AppendUnique() and PrependUnique() Environment methods, which
- add values to construction variables like Append() and Prepend()
- do, but suppress any duplicate elements in the list.
-
- - Allow the 'qt' tool to still be used successfully from a copied
- Environment. The include and library directories previously ended up
- having the same string re-appended to the end, yielding an incorrect
- path name.
-
- - Supply a more descriptive error message when the source for a target
- can't be found.
-
- - Initialize all *FLAGS variables with objects do the right thing with
- appending flags as strings or lists.
-
- - Make things like ${TARGET.dir} work in *PATH construction variables.
-
- - Allow a $MSVS_USE_MFC_DIRS construction variable to control whether
- ATL and MFC directories are included in the default INCLUDE and
- LIB paths.
-
- - Document the dbm_module argument to the SConsignFile() function.
-
- From Vincent Risi:
-
- - Add support for the bcc32, ilink32 and tlib Borland tools.
-
- From Anthony Roach:
-
- - Supply an error message if the user tries to configure a BuildDir
- for a directory that already has one.
-
- - Remove documentation of the still-unimplemented -e option.
-
- - Add -H help text listing the legal --debug values.
-
- - Don't choke if a construction variable is a non-string value.
-
- - Build Type Libraries in the target directory, not the source
- directory.
-
- - Add an appendix to the User's Guide showing how to accomplish
- various common tasks in Python.
-
- From Greg Spencer:
-
- - Add support for Microsoft Visual Studio 2003 (version 7.1).
-
- - Evaluate $MSVSPROJECTSUFFIX and $MSVSSOLUTIONSUFFIX when the Builder
- is invoked, not when the tool is initialized.
-
- From Christoph Wiedemann:
-
- - When compiling Qt, make sure the moc_*.cc files are compiled using
- the flags from the environment used to specify the target, not
- the environment that first has the Qt Builders attached.
-
-
-
-RELEASE 0.94 - Fri, 07 Nov 2003 05:29:48 -0600
-
- From Hartmut Goebel:
-
- - Add several new types of canned functions to help create options:
- BoolOption(), EnumOption(), ListOption(), PackageOption(),
- PathOption().
-
- From Steven Knight:
-
- - Fix use of CPPDEFINES with C++ source files.
-
- - Fix env.Append() when the operand is an object with a __cmp__()
- method (like a Scanner instance).
-
- - Fix subclassing the Environment and Scanner classes.
-
- - Add BUILD_TARGETS, COMMAND_LINE_TARGETS and DEFAULT_TARGETS variables.
-
- From Steve Leblanc:
-
- - SGI fixes: Fix C++ compilation, add a separate Tool/sgic++.py module.
-
- From Gary Oberbrunner:
-
- - Fix how the man page un-indents after examples in some browsers.
-
- From Vincent Risi:
-
- - Fix the C and C++ tool specifications for AIX.
-
-
-
-RELEASE 0.93 - Thu, 23 Oct 2003 07:26:55 -0500
-
- From J.T. Conklin:
-
- - On POSIX, execute commands with the more modern os.spawnvpe()
- function, if it's available.
-
- - Scan .S, .spp and .SPP files for C preprocessor dependencies.
-
- - Refactor the Job.Parallel() class to use a thread pool without a
- condition variable. This improves parallel build performance and
- handles keyboard interrupts properly when -j is used.
-
- From Charles Crain:
-
- - Add support for a JARCHDIR variable to control changing to a
- directory using the jar -C option.
-
- - Add support for detecting Java manifest files when using jar,
- and specifying them using the jar m flag.
-
- - Fix some Python 2.2 specific things in various tool modules.
-
- - Support directories as build sources, so that a rebuild of a target
- can be triggered if anything underneath the directory changes.
-
- - Have the scons.bat and scons.py files look for the SCons modules
- in site-packages as well.
-
- From Christian Engel:
-
- - Support more flexible inclusion of separate C and C++ compilers.
-
- - Use package management tools on AIX and Solaris to find where
- the comilers are installed, and what version they are.
-
- - Add support for CCVERSION and CXXVERSION variables for a number
- of C and C++ compilers.
-
- From Sergey Fogel:
-
- - Add test cases for the new capabilities to run bibtex and to rerun
- latex as needed.
-
- From Ralf W. Grosse-Kunstleve:
-
- - Accomodate anydbm modules that don't have a sync() method.
-
- - Allow SConsignFile() to take an argument specifying the DBM
- module to be used.
-
- From Stephen Kennedy:
-
- - Add support for a configurable global .sconsign.dbm file which
- can be used to avoid cluttering each directory with an individual
- .sconsign file.
-
- From John Johnson:
-
- - Fix (re-)scanning of dependencies in generated or installed
- header files.
-
- From Steven Knight:
-
- - The -Q option suppressed too many messages; fix it so that it only
- suppresses the Reading/Building messages.
-
- - Support #include when there's no space before the opening quote
- or angle bracket.
-
- - Accomodate alphanumeric version strings in EnsurePythonVersion().
-
- - Support arbitrary expansion of construction variables within
- file and directory arguments to Builder calls and Environment methods.
-
- - Add Environment-method versions of the following global functions:
- Action(), AddPostAction(), AddPreAction(), Alias(), Builder(),
- BuildDir(), CacheDir(), Clean(), Configure(), Default(),
- EnsurePythonVersion(), EnsureSConsVersion(), Environment(),
- Exit(), Export(), FindFile(), GetBuildPath(), GetOption(), Help(),
- Import(), Literal(), Local(), Platform(), Repository(), Scanner(),
- SConscriptChdir(), SConsignFile(), SetOption(), SourceSignatures(),
- Split(), TargetSignatures(), Tool(), Value().
-
- - Add the following global functions that correspond to the same-named
- Environment methods: AlwaysBuild(), Command(), Depends(), Ignore(),
- Install(), InstallAs(), Precious(), SideEffect() and SourceCode().
-
- - Add the following global functions that correspond to the default
- Builder methods supported by SCons: CFile(), CXXFile(), DVI(), Jar(),
- Java(), JavaH(), Library(), M4(), MSVSProject(), Object(), PCH(),
- PDF(), PostScript(), Program(), RES(), RMIC(), SharedLibrary(),
- SharedObject(), StaticLibrary(), StaticObject(), Tar(), TypeLibrary()
- and Zip().
-
- - Rearrange the man page to show construction environment methods and
- global functions in the same list, and to explain the difference.
-
- - Alphabetize the explanations of the builder methods in the man page.
-
- - Rename the Environment.Environment class to Enviroment.Base.
- Allow the wrapping interface to extend an Environment by using its own
- subclass of Environment.Base and setting a new Environment.Environment
- variable as the calling entry point.
-
- - Deprecate the ParseConfig() global function in favor of a same-named
- construction environment method.
-
- - Allow the Environment.WhereIs() method to take explicit path and
- pathext arguments (like the underlying SCons.Util.WhereIs() function).
-
- - Remove the long-obsolete {Get,Set}CommandHandler() functions.
-
- - Enhance env.Append() to suppress null values when appropriate.
-
- - Fix ParseConfig() so it works regardless of initial construction
- variable values.
-
- Extend CheckHeader(), CheckCHeader(), CheckCXXHeader() and
- CheckLibWithHeader() to accept a list of header files that will be
- #included in the test. The last one in the list is assumed to be
- the one being checked for. (Prototype code contributed by Gerard
- Patel and Niall Douglas).
-
- - Supply a warning when -j is used and threading isn't built in to
- the current version of Python.
-
- - First release of the User's Guide (finally, and despite a lot
- of things still missing from it...).
-
- From Clark McGrew:
-
- - Generalize the action for .tex files so that it will decide whether
- a file is TeX or LaTeX, check the .aux output to decide if it should
- run bibtex, and check the .log output to re-run LaTeX if needed.
-
- From Bram Moolenaar:
-
- - Split the non-SCons-specific functionality from SConf.py to a new,
- re-usable Conftest.py module.
-
- From Gary Oberbrunner:
-
- - Allow a directory to be the target or source or dependency of a
- Depends(), Ignore(), Precious() or SideEffect() call.
-
- From Gerard Patel:
-
- - Use the %{_mandir} macro when building our RPM package.
-
- From Marko Rauhamaa:
-
- - Have the closing message say "...terminated because of errors" if
- there were any.
-
- From Anthony Roach:
-
- - On Win32 systems, only use "rm" to delete files if Cygwin is being
- used. ("rm" doesn't understand Win32-format path names.)
-
- From Christoph Wiedemann:
-
- - Fix test/SWIG.py to find the Python include directory in all cases.
-
- - Fix a bug in detection of Qt installed on the local system.
-
- - Support returning Python 2.3 BooleanType values from Configure checks.
-
- - Provide an error message if someone mistakenly tries to call a
- Configure check from within a Builder function.
-
- - Support calling a Builder when a Configure context is still open.
-
- - Handle interrupts better by eliminating all try:-except: blocks
- which caught any and all exceptions, including KeyboardInterrupt.
-
- - Add a --duplicate= option to control how files are duplicated.
-
-
-
-RELEASE 0.92 - Wed, 20 Aug 2003 03:45:28 -0500
-
- From Charles Crain and Gary Oberbrunner:
-
- - Fix Tool import problems with the Intel and PharLap linkers.
-
- From Steven Knight
-
- - Refactor the DictCmdGenerator class to be a Selector subclass.
-
- - Allow the DefaultEnvironment() function to take arguments and pass
- them to instantiation of the default construction environment.
-
- - Update the Debian package so it uses Python 2.2 and more closely
- resembles the currently official Debian packaging info.
-
- From Gerard Patel
-
- - When the yacc -d flag is used, take the .h file base name from the
- target .c file, not the source (matching what yacc does).
-
-
-
-RELEASE 0.91 - Thu, 14 Aug 2003 13:00:44 -0500
-
- From Chad Austin:
-
- - Support specifying a list of tools when calling Environment.Copy().
-
- - Give a Value Nodes a timestamp of the system time when they're
- created, so they'll work when using timestamp-based signatures.
-
- - Add a DefaultEnvironment() function that only creates a default
- environment on-demand (for fetching source files, e.g.).
-
- - Portability fix for test/M4.py.
-
- From Steven Knight:
-
- - Tighten up the scons -H help output.
-
- - When the input yacc file ends in .yy and the -d flag is specified,
- recognize that a .hpp file (not a .h file) will be created.
-
- - Make builder prefixes work correctly when deducing a target
- from a source file name in another directory.
-
- - Documentation fixes: typo in the man page; explain up-front about
- not propagating the external environment.
-
- - Use "cvs co -d" instead of "cvs co -p >" when checking out something
- from CVS with a specified module name. This avoids zero-length
- files when there is a checkout error.
-
- - Add an "sconsign" script to print the contents of .sconsign files.
-
- - Speed up maintaining the various lists of Node children by using
- dictionaries to avoid "x in list" searches.
-
- - Cache the computed list of Node children minus those being Ignored
- so it's only calculated once.
-
- - Fix use of the --cache-show option when building a Program()
- (or using any other arbitrary action) by making sure all Action
- instances have strfunction() methods.
-
- - Allow the source of Command() to be a directory.
-
- - Better error handling of things like raw TypeErrors in SConscripts.
-
- - When installing using "setup.py install --prefix=", suppress the
- distutils warning message about adding the (incorrect) library
- directory to your search path.
-
- - Correct the spelling of the "validater" option to "validator."
- Add a DeprecatedWarning when the old spelling is used.
-
- - Allow a Builder's emitter to be a dictionary that maps source file
- suffixes to emitter functions, using the suffix of the first file
- in the source list to pick the right one.
-
- - Refactor the creation of the Program, *Object and *Library Builders
- so that they're moved out of SCons.Defaults and created on demand.
-
- - Don't split SConscript file names on white space.
-
- - Document the SConscript function's "dirs" and "name" keywords.
-
- - Remove the internal (and superfluous) SCons.Util.argmunge() function.
-
- - Add /TP to the default CXXFLAGS for msvc, so it can compile all
- of the suffixes we use as C++ files.
-
- - Allow the "prefix" and "suffix" attributes of a Builder to be
- callable objects that return generated strings, or dictionaries
- that map a source file suffix to the right prefix/suffix.
-
- - Support a MAXLINELINELENGTH construction variable on Win32 systems
- to control when a temporary file is used for long command lines.
-
- - Make how we build .rpm packages not depend on the installation
- locations from the distutils being used.
-
- - When deducing a target Node, create it directly from the first
- source Node, not by trying to create the right string to pass to
- arg2nodes().
-
- - Add support for SWIG.
-
- From Bram Moolenaar:
-
- - Test portability fixes for FreeBSD.
-
- From Gary Oberbrunner:
-
- - Report the target being built in error messages when building
- multiple sources from different extensions, or when the target file
- extension can't be deduced, or when we don't have an action for a
- file suffix.
-
- - Provide helpful error messages when the arguments to env.Install()
- are incorrect.
-
- - Fix the value returned by the Node.prevsiginfo() method to conform
- to a previous change when checking whether a node is current.
-
- - Supply a stack trace if the Taskmaster catches an exception.
-
- - When using a temporary file for a long link line on Win32 systems,
- (also) print the command line that is being executed through the
- temporary file.
-
- - Initialize the LIB environment variable when using the Intel
- compiler (icl).
-
- - Documentation fixes: better explain the AlwaysBuild() function.
-
- From Laurent Pelecq:
-
- - When the -debug=pdb option is specified, use pdb.Pdb().runcall() to
- call pdb directly, don't call Python recursively.
-
- From Ben Scott:
-
- - Add support for a platform-independent CPPDEFINES variable.
-
- From Christoph Wiedemann:
-
- - Have the g++ Tool actually use g++ in preference to c++.
-
- - Have the gcc Tool actually use gcc in preference to cc.
-
- - Add a gnutools.py test of the GNU tool chain.
-
- - Be smarter about linking: use $CC by default and $CXX only if we're
- linking with any C++ objects.
-
- - Avoid SCons hanging when a piped command has a lot of output to read.
-
- - Add QT support for preprocessing .ui files into .c files.
-
-
-
-RELEASE 0.90 - Wed, 25 Jun 2003 14:24:52 -0500
-
- From Chad Austin:
-
- - Fix the _concat() documentation, and add a test for it.
-
- - Portability fixes for non-GNU versions of lex and yacc.
-
- From Matt Balvin:
-
- - Fix handling of library prefixes when the subdirectory matches
- the prefix.
-
- From Timothee Bessett:
-
- - Add an M4 Builder.
-
- From Charles Crain:
-
- - Use '.lnk' as the suffix on the temporary file for linking long
- command lines (necessary for the Phar Lap linkloc linker).
-
- - Save non-string Options values as their actual type.
-
- - Save Options string values that contain a single quote correctly.
-
- - Save any Options values that are changed from the default
- Environment values, not just ones changed on the command line or in
- an Options file.
-
- - Make closing the Options file descriptor exception-safe.
-
- From Steven Knight:
-
- - SCons now enforces (with an error) that construction variables
- must have the same form as valid Python identifiers.
-
- - Fix man page bugs: remove duplicate AddPostAction() description;
- document no_import_lib; mention that CPPFLAGS does not contain
- $_CPPINCFLAGS; mention that F77FLAGS does not contain $_F77INCFLAGS;
- mention that LINKFLAGS and SHLINKFLAGS contains neither $_LIBFLAGS
- nor $_LIBDIRFLAGS.
-
- - Eliminate a dependency on the distutils.fancy_getopt module by
- copying and pasting its wrap_text() function directly.
-
- - Make the Script.Options() subclass match the underlying base class
- implementation.
-
- - When reporting a target is up to date, quote the target like make
- (backquote-quote) instead of with double quotes.
-
- - Fix handling of ../* targets when using -U, -D or -u.
-
- From Steve Leblanc:
-
- - Don't update the .sconsign files when run with -n.
-
- From Gary Oberbrunner:
-
- - Add support for the Intel C Compiler (icl.exe).
-
- From Anthony Roach
-
- - Fix Import('*').
-
- From David Snopek
-
- - Fix use of SConf in paths with white space in them.
-
- - Add CheckFunc and CheckType functionality to SConf.
-
- - Fix use of SConf with Builders that return a list of nodes.
-
- From David Snopek and Christoph Wiedemann
-
- - Fix use of the SConf subsystem with SConscriptChdir().
-
- From Greg Spencer
-
- - Check for the existence of MS Visual Studio on disk before using it,
- to avoid getting fooled by leftover junk in the registry.
-
- - Add support for MSVC++ .NET.
-
- - Add support for MS Visual Studio project files (DSP, DSW,
- SLN and VCPROJ files).
-
- From Christoph Wiedemann
-
- - SConf now works correctly when the -n and -q options are used.
-
-
-
-RELEASE 0.14 - Wed, 21 May 2003 05:16:32 -0500
-
- From Chad Austin:
-
- - Use .dll (not .so) for shared libraries on Cygwin; use -fPIC
- when compiling them.
-
- - Use 'rm' to remove files under Cygwin.
-
- - Add a PLATFORM variable to construction environments.
-
- - Remove the "platform" argument from tool specifications.
-
- - Propogate PYTHONPATH when running the regression tests so distutils
- can be found in non-standard locations.
-
- - Using MSVC long command-line linking when running Cygwin.
-
- - Portability fixes for a lot of tests.
-
- - Add a Value Node class for dependencies on in-core Python values.
-
- From Allen Bierbaum:
-
- - Pass an Environment to the Options validator method, and
- add an Options.Save() method.
-
- From Steve Christensen:
-
- - Add an optional sort function argument to the GenerateHelpText()
- Options function.
-
- - Evaluate the "varlist" variables when computing the signature of a
- function action.
-
- From Charles Crain:
-
- - Parse the source .java files for class names (including inner class
- names) to figure out the target .class files that will be created.
-
- - Make Java support work with Repositories and SConscriptChdir(0).
-
- - Pass Nodes, not strings, to Builder emitter functions.
-
- - Refactor command-line interpolation and signature calculation
- so we can use real Node attributes.
-
- From Steven Knight:
-
- - Add Java support (javac, javah, jar and rmic).
-
- - Propagate the external SYSTEMROOT environment variable into ENV on
- Win32 systems, so external commands that use sockets will work.
-
- - Add a .posix attribute to PathList expansions.
-
- - Check out CVS source files using POSIX path names (forward slashes
- as separators) even on Win32.
-
- - Add Node.clear() and Node.FS.Entry.clear() methods to wipe out a
- Node's state, allowing it to be re-evaluated by continuous
- integration build interfaces.
-
- - Change the name of the Set{Build,Content}SignatureType() functions
- to {Target,Source}Signatures(). Deprecate the old names but support
- them for backwards compatibility.
-
- - Add internal SCons.Node.FS.{Dir,File}.Entry() methods.
-
- - Interpolate the null string if an out-of-range subscript is used
- for a construction variable.
-
- - Fix the internal Link function so that it properly links or copies
- files in subsidiary BuildDir directories.
-
- - Refactor the internal representation of a single execution instance
- of an action to eliminate redundant signature calculations.
-
- - Eliminate redundant signature calculations for Nodes.
-
- - Optimize out calling hasattr() before accessing attributes.
-
- - Say "Cleaning targets" (not "Building...") when the -c option is
- used.
-
- From Damyan Pepper:
-
- - Quote the "Entering directory" message like Make.
-
- From Stefan Reichor:
-
- - Add support for using Ghostscript to convert Postscript to PDF files.
-
- From Anthony Roach:
-
- - Add a standalone "Alias" function (separate from an Environment).
-
- - Make Export() work for local variables.
-
- - Support passing a dictionary to Export().
-
- - Support Import('*') to import everything that's been Export()ed.
-
- - Fix an undefined exitvalmap on Win32 systems.
-
- - Support new SetOption() and GetOption() functions for setting
- various command-line options from with an SConscript file.
-
- - Deprecate the old SetJobs() and GetJobs() functions in favor of
- using the new generic {Set,Get}Option() functions.
-
- - Fix a number of tests that searched for a Fortran compiler using the
- external PATH instead of what SCons would use.
-
- - Fix the interaction of SideEffect() and BuildDir() so that (for
- example) PDB files get put correctly in a BuildDir().
-
- From David Snopek:
-
- - Contribute the "Autoscons" code for Autoconf-like checking for
- the existence of libraries, header files and the like.
-
- - Have the Tool() function add the tool name to the $TOOLS
- construction variable.
-
- From Greg Spencer:
-
- - Support the C preprocessor #import statement.
-
- - Allow the SharedLibrary() Builder on Win32 systems to be able to
- register a newly-built dll using regsvr32.
-
- - Add a Builder for Windows type library (.tlb) files from IDL files.
-
- - Add an IDL scanner.
-
- - Refactor the Fortran, C and IDL scanners to share common logic.
-
- - Add .srcpath and .srcdir attributes to $TARGET and $SOURCE.
-
- From Christoph Wiedemann:
-
- - Integrate David Snopek's "Autoscons" code as the new SConf
- configuration subsystem, including caching of values between
- runs (using normal SCons dependency mechanisms), tests, and
- documentation.
-
-
-
-RELEASE 0.13 - Mon, 31 Mar 2003 20:22:00 -0600
-
- From Charles Crain:
-
- - Fix a bug when BuildDir(duplicate=0) is used and SConscript
- files are called from within other SConscript files.
-
- - Support (older) versions of Perforce which don't set the Windows
- registry.
-
-
-
-RELEASE 0.12 - Thu, 27 Mar 2003 23:52:09 -0600
-
- From Charles Crain:
-
- - Added support for the Perforce source code management system.
-
- - Fix str(Node.FS) so that it returns a path relative to the calling
- SConscript file's directory, not the top-level directory.
-
- - Added support for a separate src_dir argument to SConscript()
- that allows explicit specification of where the source files
- for an SConscript file can be found.
-
- - Support more easily re-usable flavors of command generators by
- calling callable variables when strings are expanded.
-
- From Steven Knight:
-
- - Added an INSTALL construction variable that can be set to a function
- to control how the Install() and InstallAs() Builders install files.
- The default INSTALL function now copies, not links, files.
-
- - Remove deprecated features: the "name" argument to Builder objects,
- and the Environment.Update() method.
-
- - Add an Environment.SourceCode() method to support fetching files
- from source code systems. Add factory methods that create Builders
- to support BitKeeper, CVS, RCS, and SCCS. Add support for fetching
- files from RCS or SCCS transparently (like GNU Make).
-
- - Make the internal to_String() function more efficient.
-
- - Make the error message the same as other build errors when there's a
- problem unlinking a target file in preparation for it being built.
-
- - Make TARGET, TARGETS, SOURCE and SOURCES reserved variable names and
- warn if the user tries to set them in a construction environment.
-
- - Add support for Tar and Zip files.
-
- - Better documentation of the different ways to export variables to a
- subsidiary SConscript file. Fix documentation bugs in a tools
- example, places that still assumed SCons split strings on white
- space, and typos.
-
- - Support fetching arbitrary files from the TARGETS or SOURCES lists
- (e.g. ${SOURCES[2]}) when calculating the build signature of a
- command.
-
- - Don't silently swallow exceptions thrown by Scanners (or other
- exceptions while finding a node's dependent children).
-
- - Push files to CacheDir() before calling the superclass built()
- method (which may clear the build signature as part of clearing
- cached implicit dependencies, if the file has a source scanner).
- (Bug reported by Jeff Petkau.)
-
- - Raise an internal error if we attempt to push a file to CacheDir()
- with a build signature of None.
-
- - Add an explicit Exit() function for terminating early.
-
- - Change the documentation to correctly describe that the -f option
- doesn't change to the directory in which the specified file lives.
-
- - Support changing directories locally with SConscript directory
- path names relative to any SConstruct file specified with -f.
- This allows you to build in another directory by simply changing
- there and pointing at the SConstruct file in another directory.
-
- - Change the default SConscriptChdir() behavior to change to the
- SConscript directory while it's being read.
-
- - Fix an exception thrown when the -U option was used with no
- Default() target specified.
-
- - Fix -u so that it builds things in corresponding build directories
- when used in a source directory.
-
- From Lachlan O'Dea:
-
- - Add SharedObject() support to the masm tool.
-
- - Fix WhereIs() to return normalized paths.
-
- From Jeff Petkau:
-
- - Don't copy a built file to a CacheDir() if it's already there.
-
- - Avoid partial copies of built files in a CacheDir() by copying
- to a temporary file and renaming.
-
- From Anthony Roach:
-
- - Fix incorrect dependency-cycle errors when an Aliased source doesn't
- exist.
-
-
-
-RELEASE 0.11 - Tue, 11 Feb 2003 05:24:33 -0600
-
- From Chad Austin:
-
- - Add support for IRIX and the SGI MIPSPro tool chain.
-
- - Support using the MSVC tool chain when running Cygwin Python.
-
- From Michael Cook:
-
- - Avoid losing signal bits in the exit status from a command,
- helping terminate builds on interrupt (CTRL+C).
-
- From Charles Crain:
-
- - Added new AddPreAction() and AddPostAction() functions that support
- taking additional actions before or after building specific targets.
-
- - Add support for the PharLap ETS tool chain.
-
- From Steven Knight:
-
- - Allow Python function Actions to specify a list of construction
- variables that should be included in the Action's signature.
-
- - Allow libraries in the LIBS variable to explicitly include the prefix
- and suffix, even when using the GNU linker.
- (Bug reported by Neal Becker.)
-
- - Use DOS-standard CR-LF line endings in the scons.bat file.
- (Bug reported by Gary Ruben.)
-
- - Doc changes: Eliminate description of deprecated "name" keyword
- argument from Builder definition (reported by Gary Ruben).
-
- - Support using env.Append() on BUILDERS (and other dictionaries).
- (Bug reported by Bj=F6rn Bylander.)
-
- - Setting the BUILDERS construction variable now properly clears
- the previous Builder attributes from the construction Environment.
- (Bug reported by Bj=F6rn Bylander.)
-
- - Fix adding a prefix to a file when the target isn't specified.
- (Bug reported by Esa Ilari Vuokko.)
-
- - Clean up error messages from problems duplicating into read-only
- BuildDir directories or into read-only files.
-
- - Add a CommandAction.strfunction() method, and add an "env" argument
- to the FunctionAction.strfunction() method, so that all Action
- objects have strfunction() methods, and the functions for building
- and returning a string both take the same arguments.
-
- - Add support for new CacheDir() functionality to share derived files
- between builds, with related options --cache-disable, --cache-force,
- and --cache-show.
-
- - Change the default behavior when no targets are specified to build
- everything in the current directory and below (like Make). This
- can be disabled by specifying Default(None) in an SConscript.
-
- - Revamp SCons installation to fix a case-sensitive installation
- on Win32 systems, and to add SCons-specific --standard-lib,
- --standalone-lib, and --version-lib options for easier user
- control of where the libraries get installed.
-
- - Fix the ability to directly import and use Platform and Tool modules
- that have been implicitly imported into an Environment().
-
- - Add support for allowing an embedding interface to annotate a node
- when it's created.
-
- - Extend the SConscript() function to accept build_dir and duplicate
- keyword arguments that function like a BuildDir() call.
-
- From Steve Leblanc:
-
- - Fix the output of -c -n when directories are involved, so it
- matches -c.
-
- From Anthony Roach:
-
- - Use a different shared object suffix (.os) when using gcc so shared
- and static objects can exist side-by-side in the same directory.
-
- - Allow the same object files on Win32 to be linked into either
- shared or static libraries.
-
- - Cache implicit cache values when using --implicit-cache.
-
-
-
-RELEASE 0.10 - Thu, 16 Jan 2003 04:11:46 -0600
-
- From Derrick 'dman' Hudson:
-
- - Support Repositories on other file systems by symlinking or
- copying files when hard linking won't work.
-
- From Steven Knight:
-
- - Remove Python bytecode (*.pyc) files from the scons-local packages.
-
- - Have FunctionActions print a description of what they're doing
- (a representation of the Python call).
-
- - Fix the Install() method so that, like other actions, it prints
- what would have happened when the -n option is used.
-
- - Don't create duplicate source files in a BuildDir when the -n
- option is used.
-
- - Refactor the Scanner interface to eliminate unnecessary Scanner
- calls and make it easier to write efficient scanners.
-
- - Added a "recursive" flag to Scanner creation that specifies the
- Scanner should be invoked recursively on dependency files returned
- by the scanner.
-
- - Significant performance improvement from using a more efficient
- check, throughout the code, for whether a Node has a Builder.
-
- - Fix specifying only the source file to MultiStepBuilders such as
- the Program Builder. (Bug reported by Dean Bair.)
-
- - Fix an exception when building from a file with the same basename as
- the subdirectory in which it lives. (Bug reported by Gerard Patel.)
-
- - Fix automatic deduction of a target file name when there are
- multiple source files specified; the target is now deduced from just
- the first source file in the list.
-
- - Documentation fixes: better initial explanation of SConscript files;
- fix a misformatted "table" in the StaticObject explanation.
-
- From Steven Knight and Steve Leblanc:
-
- - Fix the -c option so it will remove symlinks.
-
- From Steve Leblanc:
-
- - Add a Clean() method to support removing user-specified targets
- when using the -c option.
-
- - Add a development script for running SCons through PyChecker.
-
- - Clean up things found by PyChecker (mostly unnecessary imports).
-
- - Add a script to use HappyDoc to create HTML class documentation.
-
- From Lachlan O'Dea:
-
- - Make the Environment.get() method return None by default.
-
- From Anthony Roach:
-
- - Add SetJobs() and GetJobs() methods to allow configuration of the
- number of default jobs (still overridden by -j).
-
- - Convert the .sconsign file format from ASCII to a pickled Python
- data structure.
-
- - Error message cleanups: Made consistent the format of error
- messages (now all start with "scons: ***") and warning messages (now
- all start with "scons: warning:"). Caught more cases with the "Do
- not know how to build" error message.
-
- - Added support for the MinGW tool chain.
-
- - Added a --debug=includes option.
-
-
-
-RELEASE 0.09 - Thu, 5 Dec 2002 04:48:25 -0600
-
- From Chad Austin:
-
- - Add a Prepend() method to Environments, to append values to
- the beginning of construction variables.
-
- From Matt Balvin:
-
- - Add long command-line support to the "lib" Tool (Microsoft library
- archiver), too.
-
- From Charles Crain:
-
- - Allow $$ in a string to be passed through as $.
-
- - Support file names with odd characters in them.
-
- - Add support for construction variable substition on scanner
- directories (in CPPPATH, F77PATH, LIBPATH, etc.).
-
- From Charles Crain and Steven Knight:
-
- - Add Repository() functionality, including the -Y option.
-
- From Steven Knight:
-
- - Fix auto-deduction of target names so that deduced targets end
- up in the same subdirectory as the source.
-
- - Don't remove source files specified on the command line!
-
- - Suport the Intel Fortran Compiler (ifl.exe).
-
- - Supply an error message if there are no command-line or
- Default() targets specified.
-
- - Fix the ASPPCOM values for the GNU assembler.
- (Bug reported by Brett Polivka.)
-
- - Fix an exception thrown when a Default() directory was specified
- when using the -U option.
-
- - Issue a warning when -c can't remove a target.
-
- - Eliminate unnecessary Scanner calls by checking for the
- existence of a file before scanning it. (This adds a generic
- hook to check an arbitrary condition before scanning.)
-
- - Add explicit messages to tell when we're "Reading SConscript files
- ...," "done reading SConscript files," "Building targets," and
- "done building targets." Add a -Q option to supress these.
-
- - Add separate $SHOBJPREFIX and $SHOBJSUFFIX construction variables
- (by default, the same as $OBJPREFIX and $OBJSUFFIX).
-
- - Add Make-like error messages when asked to build a source file,
- and before trying to build a file that doesn't have all its source
- files (including when an invalid drive letter is used on WIN32).
-
- - Add an scons-local-{version} package (in both .tar.gz and .zip
- flavors) to help people who want to ship SCons as a stand-alone
- build tool in their software packages.
-
- - Prevent SCons from unlinking files in certain situations when
- the -n option is used.
-
- - Change the name of Tool/lib.py to Tool/mslib.py.
-
- From Steven Knight and Anthony Roach:
-
- - Man page: document the fact that Builder calls return Node objects.
-
- From Steve LeBlanc:
-
- - Refactor option processing to use our own version of Greg Ward's
- Optik module, modified to run under Python 1.5.2.
-
- - Add a ParseConfig() command to modify an environment based on
- parsing output from a *-config command.
-
- From Jeff Petkau:
-
- - Fix interpretation of '#/../foo' on Win32 systems.
-
- From Anthony Roach:
-
- - Fixed use of command lines with spaces in their arguments,
- and use of Nodes with spaces in their string representation.
-
- - Make access and modification times of files in a BuildDir match
- the source file, even when hard linking isn't available.
-
- - Make -U be case insensitive on Win32 systems.
-
- - Issue a warning and continue when finding a corrupt .sconsign file.
-
- - Fix using an alias as a dependency of a target so that if one of the
- alias' dependencies gets rebuilt, the resulting target will, too.
-
- - Fix differently ordered targets causing unnecessary rebuilds
- on case insensitive systems.
-
- - Use os.system() to execute external commands whenever the "env"
- utility is available, which is much faster than fork()/exec(),
- and fixes the -j option on several platforms.
-
- - Fix use of -j with multiple targets.
-
- - Add an Options() object for friendlier accomodation of command-
- line arguments.
-
- - Add support for Microsoft VC++ precompiled header (.pch) files,
- debugger (.pdb) files, and resource (.rc) files.
-
- - Don't compute the $_CPPINCFLAGS, $_F77INCFLAGS, $_LIBFLAGS and
- $_LIBDIRFLAGS variables each time a command is executed, define
- them so they're computed only as needed. Add a new _concat
- function to the Environment that allows people to define their
- own similar variables.
-
- - Fix dependency scans when $LIBS is overridden.
-
- - Add EnsurePythonVersion() and EnsureSConsVersion() functions.
-
- - Fix the overly-verbose stack trace on ListBuilder build errors.
-
- - Add a SetContentSignatureType() function, allowing use of file
- timestamps instead of MD5 signatures.
-
- - Make -U and Default('source') fail gracefully.
-
- - Allow the File() and Dir() methods to take a path-name string as
- the starting directory, in addition to a Dir object.
-
- - Allow the command handler to be selected via the SPAWN, SHELL
- and ESCAPE construction variables.
-
- - Allow construction variables to be overridden when a Builder
- is called.
-
- From sam th:
-
- - Dynamically check for the existence of utilities with which to
- initialize Environments by default.
-
-
-
-RELEASE 0.08 - Mon, 15 Jul 2002 12:08:51 -0500
-
- From Charles Crain:
-
- - Fixed a bug with relative CPPPATH dirs when using BuildDir().
- (Bug reported by Bob Summerwill.)
-
- - Added a warnings framework and a --warn option to enable or
- disable warnings.
-
- - Make the C scanner warn users if files referenced by #include
- directives cannot be found and --warn=dependency is specified.
-
- - The BUILDERS construction variable should now be a dictionary
- that maps builder names to actions. Existing uses of lists,
- and the Builder name= keyword argument, generate warnings
- about use of deprecated features.
-
- - Removed the "shared" keyword argument from the Object and
- Library builders.
-
- - Added separated StaticObject, SharedObject, StaticLibrary and
- SharedLibrary builders. Made Object and Library synonyms for
- StaticObject and StaticLibrary, respectively.
-
- - Add LIBS and LIBPATH dependencies for shared libraries.
-
- - Removed support for the prefix, suffix and src_suffix arguments
- to Builder() to be callable functions.
-
- - Fix handling file names with multiple dots.
-
- - Allow a build directory to be outside of the SConstruct tree.
-
- - Add a FindFile() function that searches for a file node with a
- specified name.
-
- - Add $CPPFLAGS to the shared-object command lines for g++ and gcc.
-
- From Charles Crain and Steven Knight:
-
- - Add a "tools=" keyword argument to Environment instantiation,
- and a separate Tools() method, for more flexible specification
- of tool-specific environment changes.
-
- From Steven Knight:
-
- - Add a "platform=" keyword argument to Environment instantiation,
- and a separate Platform() method, for more flexible specification
- of platform-specific environment changes.
-
- - Updated README instructions and setup.py code to catch an
- installation failure from not having distutils installed.
-
- - Add descriptions to the -H help text for -D, -u and -U so
- people can tell them apart.
-
- - Remove the old feature of automatically splitting strings
- of file names on white space.
-
- - Add a dependency Scanner for native Fortran "include" statements,
- using a new "F77PATH" construction variable.
-
- - Fix C #include scanning to detect file names with characters like
- '-' in them.
-
- - Add more specific version / build output to the -v option.
-
- - Add support for the GNU as, Microsoft masm, and nasm assemblers.
-
- - Allow the "target" argument to a Builder call to be omitted, in
- which case the target(s) are deduced from the source file(s) and the
- Builder's specified suffix.
-
- - Add a tar archive builder.
-
- - Add preliminary support for the OS/2 Platform, including the icc
- and ilink Tools.
-
- From Jeff Petkau:
-
- - Fix --implicit-cache if the scanner returns an empty list.
-
- From Anthony Roach:
-
- - Add a "multi" keyword argument to Builder creation that specifies
- it's okay to call the builder multiple times for a target.
-
- - Set a "multi" on Aliases so multiple calls will append to an Alias.
-
- - Fix emitter functions' use of path names when using BuildDir or
- in subdirectories.
-
- - Fix --implicit-cache causing redundant rebuilds when the header
- file list changed.
-
- - Fix --implicit-cache when a file has no implicit dependencies and
- its source is generated.
-
- - Make the drive letters on Windows always be the same case, so that
- changes in the case of drive letters don't cause a rebuild.
-
- - Fall back to importing the SCons.TimeStamp module if the SCons.MD5
- module can't be imported.
-
- - Fix interrupt handling to guarantee that a single interrupt will
- halt SCons both when using -j and not.
-
- - Fix .sconsign signature storage so that output files of one build
- can be safely used as input files to another build.
-
- - Added a --debug=time option to print SCons execution times.
-
- - Print an error message if a file can't be unlinked before being
- built, rather than just silently terminating the build.
-
- - Add a SideEffect() method that can be used to tell the build
- engine that a given file is created as a side effect of building
- a target. A file can be specified as a side effect of more than
- one build comand, in which case the commands will not be executed
- simultaneously.
-
- - Significant performance gains from not using our own version of
- the inefficient stock os.path.splitext() method, caching source
- suffix computation, code cleanup in MultiStepBuilder.__call__(),
- and replicating some logic in scons_subst().
-
- - Add --implicit-deps-changed and --implicit-deps-unchanged options.
-
- - Add a GetLaunchDir() function.
-
- - Add a SetBuildSignatureType() function.
-
- From Zed Shaw:
-
- - Add an Append() method to Environments, to append values to
- construction variables.
-
- - Change the name of Update() to Replace(). Keep Update() as a
- deprecated synonym, at least for now.
-
- From Terrel Shumway:
-
- - Use a $PYTHON construction variable, initialized to sys.executable,
- when using Python to build parts of the SCons packages.
-
- - Use sys.prefix, not sys.exec_prefix, to find pdb.py.
-
-
-
-RELEASE 0.07 - Thu, 2 May 2002 13:37:16 -0500
-
- From Chad Austin:
-
- - Changes to build SCons packages on IRIX (and other *NIces).
-
- - Don't create a directory Node when a file already exists there,
- and vice versa.
-
- - Add 'dirs' and 'names' keyword arguments to SConscript for
- easier specification of subsidiary SConscript files.
-
- From Charles Crain:
-
- - Internal cleanup of environment passing to function Actions.
-
- - Builders can now take arbitrary keyword arguments to create
- attributes to be passed to: command generator functions,
- FunctionAction functions, Builder emitter functions (below),
- and prefix/suffix generator functions (below).
-
- - Command generator functions can now return ANYTHING that can be
- converted into an Action (a function, a string, a CommandGenerator
- instance, even an ActionBase instance).
-
- - Actions now call get_contents() with the actual target and source
- nodes used for the build.
-
- - A new DictCmdGenerator class replaces CompositeBuilder to support
- more flexible Builder behavior internally.
-
- - Builders can now take an emitter= keyword argument. An emitter
- is a function that takes target, source, and env argument, then
- return a 2-tuple of (new sources, new targets). The emitter is
- called when the Builder is __call__'ed, allowing a user to modify
- source and target lists.
-
- - The prefix, suffix and src_suffix Builder arguments now take a
- callable as well a string. The callable is passed the Environment
- and any extra Builder keyword arguments and is expected to return
- the appropriate prefix or suffix.
-
- - CommandActions can now be a string, a list of command + argument
- strings, or a list of commands (strings or lists).
-
- - Added shared library support. The Object and Library Builders now
- take a "shared=1" keyword argument to specify that a shared object
- or shared library should be built. It is an error to try to build
- static objects into a shared library or vice versa.
-
- - Win32 support for .def files has been added. Added the Win32-specific
- construction variables $WIN32DEFPREFIX, $WIN32DEFSUFFIX,
- $WIN32DLLPREFIX and $WIN32IMPLIBPREFIX. When building a .dll,
- the new construction variable $WIN32_INSERT_DEF, controls whether
- the appropriately-named .def file is inserted into the target
- list (if not already present). A .lib file is always added to
- a Library build if not present in the list of targets.
-
- - ListBuilder now passes all targets to the action, not just the first.
-
- - Fix so that -c now deletes generated yacc .h files.
-
- - Builder actions and emitter functions can now be initialized, through
- construction variables, to things other than strings.
-
- - Make top-relative '#/dir' lookups work like '#dir'.
-
- - Fix for relative CPPPATH directories in subsidiary SConscript files
- (broken in 0.06).
-
- - Add a for_signature argument to command generators, so that
- generators that need to can return distinct values for the
- command signature and for executing the command.
-
- From Alex Jacques:
-
- - Create a better scons.bat file from a py2bat.py script on the Python
- mailing list two years ago (modeled after pl2bat.pl).
-
- From Steven Knight:
-
- - Fix so that -c -n does *not* remove the targets!
-
- - Man page: Add a hierarchical libraries + Program example.
-
- - Support long MSVC linker command lines through a builder action
- that writes to a temporary file and uses the magic MSVC "link @file"
- argument syntax if the line is longer than 2K characters.
-
- - Fix F77 command-line options on Win32 (use /Fo instead of -o).
-
- - Use the same action to build from .c (lower case) and .C (upper
- case) files on case-insensitive systems like Win32.
-
- - Support building a PDF file directly from a TeX or LaTeX file
- using pdftex or pdflatex.
-
- - Add a -x option to runtest.py to specify the script being tested.
- A -X option indicates it's an executable, not a script to feed
- to the Python interpreter.
-
- - Add a Split() function (identical to SCons.Util.argmunge()) for use
- in the next release, when Builders will no longer automatically split
- strings on white space.
-
- From Steve Leblanc:
-
- - Add the SConscriptChdir() method.
-
- From Anthony Roach:
-
- - Fix --debug=tree when used with directory targets.
-
- - Significant internal restructuring of Scanners and Taskmaster.
-
- - Added new --debug=dtree option.
-
- - Fixes for --profile option.
-
- - Performance improvement in construction variable substitution.
-
- - Implemented caching of content signatures, plus added --max-drift
- option to control caching.
-
- - Implemented caching of dependency signatures, enabled by new
- --implicit-cache option.
-
- - Added abspath construction variable modifier.
-
- - Added $SOURCE variable as a synonym for $SOURCES[0].
-
- - Write out .sconsign files on error or interrupt so intermediate
- build results are saved.
-
- - Change the -U option to -D. Make a new -U that builds just the
- targets from the local SConscript file.
-
- - Fixed use of sys.path so Python modules can be imported from
- the SConscript directory.
-
- - Fix for using Aliases with the -u, -U and -D options.
-
- - Fix so that Nodes can be passed to SConscript files.
-
- From Moshe Zadka:
-
- - Changes for official Debian packaging.
-
-
-
-RELEASE 0.06 - Thu, 28 Mar 2002 01:24:29 -0600
-
- From Charles Crain:
-
- - Fix command generators to expand construction variables.
-
- - Make FunctionAction arguments be Nodes, not strings.
-
- From Stephen Kennedy:
-
- - Performance: Use a dictionary, not a list, for a Node's parents.
-
- From Steven Knight:
-
- - Add .zip files to the packages we build.
-
- - Man page: document LIBS, fix a typo, document ARGUMENTS.
-
- - Added RANLIB and RANLIBFLAGS construction variables. Only use them
- in ARCOM if there's a "ranlib" program on the system.
-
- - Add a configurable CFILESUFFIX for the Builder of .l and .y files
- into C files.
-
- - Add a CXXFile Builder that turns .ll and .yy files into .cc files
- (configurable via a CXXFILESUFFIX construction variable).
-
- - Use the POSIX-standard lex -t flag, not the GNU-specific -o flag.
- (Bug reported by Russell Christensen.)
-
- - Fixed an exception when CPPPATH or LIBPATH is a null string.
- (Bug reported by Richard Kiss.)
-
- - Add a --profile=FILE option to make profiling SCons easier.
-
- - Modify the new DVI builder to create .dvi files from LaTeX (.ltx
- and .latex) files.
-
- - Add support for Aliases (phony targets).
-
- - Add a WhereIs() method for searching for path names to executables.
-
- - Add PDF and PostScript document builders.
-
- - Add support for compiling Fortran programs from a variety of
- suffixes (a la GNU Make): .f, .F, .for, .FOR, .fpp and .FPP
-
- - Support a CPPFLAGS variable on all default commands that use the
- C preprocessor.
-
- From Steve Leblanc:
-
- - Add support for the -U option.
-
- - Allow CPPPATH, LIBPATH and LIBS to be specified as white-space
- separated strings.
-
- - Add a document builder to create .dvi files from TeX (.tex) files.
-
- From Anthony Roach:
-
- - Fix: Construction variables with values of 0 were incorrectly
- interpolated as ''.
-
- - Support env['VAR'] to fetch construction variable values.
-
- - Man page: document Precious().
-
-
-
-RELEASE 0.05 - Thu, 21 Feb 2002 16:50:03 -0600
-
- From Chad Austin:
-
- - Set PROGSUFFIX to .exe under Cygwin.
-
- From Charles Crain:
-
- - Allow a library to specified as a command-line source file, not just
- in the LIBS construction variable.
-
- - Compensate for a bug in os.path.normpath() that returns '' for './'
- on WIN32.
-
- - More performance optimizations: cache #include lines from files,
- eliminate unnecessary calls.
-
- - If a prefix or suffix contains white space, treat the resulting
- concatenation as separate arguments.
-
- - Fix irregularities in the way we fetch DevStudio information from
- the Windows registry, and in our registry error handling.
-
- From Steven Knight:
-
- - Flush stdout after print so it intermixes correctly with stderr
- when redirected.
-
- - Allow Scanners to return a list of strings, and document how to
- write your own Scanners.
-
- - Look up implicit (scanned) dependencies relative to the directory
- of file being scanned.
-
- - Make writing .sconsign files more robust by first trying to write
- to a temp file that gets renamed.
-
- - Create all of the directories for a list of targets before trying
- to build any of the targets.
-
- - WIN32 portability fixes in tests.
-
- - Allow the list of variables exported to an SConscript file to be
- a UserList, too.
-
- - Document the overlooked LIBPATH construction variable.
- (Bug reported by Eicke Godehardt.)
-
- - Fix so that Ignore() ignores indirect, implicit dependencies
- (included files), not just direct dependencies.
-
- - Put the man page in the Debian distribution.
-
- - Run HTML docs through tidy to clean up the HTML (for Konqueror).
-
- - Add preliminary support for Unicode strings.
-
- - Efficiency: don't scan dependencies more than once during the
- walk of a tree.
-
- - Fix the -c option so it doesn't stop removing targets if one doesn't
- already exist.
- (Bug reported by Paul Connell.)
-
- - Fix the --debug=pdb option when run on Windows NT.
- (Bug reported by Paul Connell.)
-
- - Add support for the -q option.
-
- From Steve Leblanc:
-
- - Add support for the -u option.
-
- - Add .cc and .hh file suffixes to the C Scanner.
-
- From Anthony Roach:
-
- - Make the scons script return an error code on failures.
-
- - Add support for using code to generate a command to build a target.
-
-
-
-RELEASE 0.04 - Wed, 30 Jan 2002 11:09:42 -0600
-
- From Charles Crain:
-
- - Significant performance improvements in the Node.FS and
- Scanner subsystems.
-
- - Fix signatures of binary files on Win32 systems.
-
- - Allow LIBS and LIBPATH to be strings, not just arrays.
-
- - Print a traceback if a Python-function builder throws an exception.
-
- From Steven Knight:
-
- - Fix using a directory as a Default(), and allow Default() to
- support white space in file names for strings in arrays.
-
- - Man page updates: corrected some mistakes, documented various
- missing Environment methods, alphabetized the construction
- variables and other functions, defined begin and end macros for
- the example sections, regularized white space separation, fixed
- the use of Export() in the Multiple Variants example.
-
- - Function action fixes: None is now a successful return value.
- Exceptions are now reported. Document function actions.
-
- - Add 'Action' and 'Scanner' to the global keywords so SConscript
- files can use them too.
-
- - Removed the Wrapper class between Nodes and Walkers.
-
- - Add examples using Library, LIBS, and LIBPATH.
-
- - The C Scanner now always returns a sorted list of dependencies
- so order changes don't cause unnecessary rebuilds.
-
- - Strip $(-$) bracketed text from command lines. Use this to
- surround $_INCDIRS and $_LIBDIRS so we don't rebuild in response
- to changes to -I or -L options.
-
- - Add the Ignore() method to ignore dependencies.
-
- - Provide an error message when a nonexistent target is specified
- on the command line.
-
- - Remove targets before building them, and add an Environment
- Precious() method to override that.
-
- - Eliminate redundant calls to the same builder when the target is a
- list of targets: Add a ListBuilder class that wraps Builders to
- handle lists atomically. Extend the Task class to support building
- and updating multiple targets in a single Task. Simplify the
- interface between Task and Taskmaster.
-
- - Add a --debug=pdb option to re-run SCons under the Python debugger.
-
- - Only compute a build signature once for each node.
-
- - Changes to our sys.path[] manipulation to support installation into
- an arbitrary --prefix value.
-
- From Steve Leblanc:
-
- - Add var=value command-line arguments.
-
-
-
-RELEASE 0.03 - Fri, 11 Jan 2002 01:09:30 -0600
-
- From Charles Crain:
-
- - Performance improvements in the Node.FS and Sig.Calculator classes.
-
- - Add the InstallAs() method.
-
- - Execute commands through an external interpreter (sh, cmd.exe, or
- command.com) to handle redirection metacharacters.
-
- - Allow the user to supply a command handler.
-
- From Steven Knight:
-
- - Search both /usr/lib and /usr/local/lib for scons directories by
- adding them both to sys.path, with whichever is in sys.prefix first.
-
- - Fix interpreting strings of multiple white-space separated file names
- as separate file names, allowing prefixes and suffixes to be appended
- to each individually.
-
- - Refactor to move CompositeBuilder initialization logic from the
- factory wrapper to the __init__() method, and allow a Builder to
- have both an action and a src_builder (or array of them).
-
- - Refactor BuilderBase.__call__() to separate Node creation/lookup
- from initialization of the Node's builder information.
-
- - Add a CFile Builder object that supports turning lex (.l) and
- yacc (.y) files into .c files.
-
- - Document: variable interpretation attributes; how to propogate
- the user's environment variables to executed commands; how to
- build variants in multiple BuildDirs.
-
- - Collect String, Dict, and List type-checking in common utility
- routines so we can accept User{String,Dict,List}s all over.
-
- - Put the Action factory and classes into their own module.
-
- - Use one CPlusPlusAction in the Object Builder's action dictionary,
- instead of letting it create multiple identical instances.
-
- - Document the Install() and InstallAs() methods.
-
- From Steve Leblanc:
-
- - Require that a Builder be given a name argument, supplying a
- useful error message when it isn't.
-
- From Anthony Roach:
-
- - Add a "duplicate" keyword argument to BuildDir() that can be set
- to prevent linking/copying source files into build directories.
-
- - Add a "--debug=tree" option to print an ASCII dependency tree.
-
- - Fetch the location of the Microsoft Visual C++ compiler(s) from
- the Registry, instead of hard-coding the location.
-
- - Made Scanner objects take Nodes, not path names.
-
- - Have the C Scanner cache the #include file names instead of
- (re-)scanning the file each time it's called.
-
- - Created a separate class for parent "nodes" of file system roots,
- eliminating the need for separate is-parent-null checks everywhere.
-
- - Removed defined __hash__() and __cmp() methods from FS.Entry, in
- favor of Python's more efficient built-in identity comparisons.
-
-
-
-RELEASE 0.02 - Sun, 23 Dec 2001 19:05:09 -0600
-
- From Charles Crain:
-
- - Added the Install(), BuildDir(), and Export() methods.
-
- - Fix the -C option by delaying setting the top of the FS tree.
-
- - Avoid putting the directory path on the libraries in the LIBS
- construction variable.
-
- - Added a GetBuildPath() method to return the full path to the
- Node for a specified string.
-
- - Fixed variable substitution in CPPPATH and LIBPATH.
-
- From Steven Knight:
-
- - Fixed the version comment in the scons.bat (the UNIX geek used
- # instead of @rem).
-
- - Fix to setup.py so it doesn't require a sys.argv[1] argument.
-
- - Provide make-like warning message for "command not found" and
- similar errors.
-
- - Added an EXAMPLES section to the man page.
-
- - Make Default() targets properly relative to their SConscript
- file's subdirectory.
-
- From Anthony Roach:
-
- - Documented CXXFLAGS, CXXCOM, and CPPPATH.
-
- - Fixed SCONS_LIB_DIR to work as documented.
-
- - Made Default() accept Nodes as arguments.
-
- - Changed Export() to make it easier to use.
-
- - Added the Import() and Return() methods.
-
-
-
-RELEASE 0.01 - Thu Dec 13 19:25:23 CST 2001
-
-A brief overview of important functionality available in release 0.01:
-
- - C and C++ compilation on POSIX and Windows NT.
-
- - Automatic scanning of C/C++ source files for #include dependencies.
-
- - Support for building libraries; setting construction variables
- allows creation of shared libraries.
-
- - Library and C preprocessor search paths.
-
- - File changes detected using MD5 signatures.
-
- - User-definable Builder objects for building files.
-
- - User-definable Scanner objects for scanning for dependencies.
-
- - Parallel build (-j) support.
-
- - Dependency cycles detected.
-
- - Linux packages available in RPM and Debian format.
-
- - Windows installer available.
-
-
-
-Copyright (c) 2001 - 2015 The SCons Foundation
-src/CHANGES.txt rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog
diff --git a/3rdParty/SCons/scons-2.4.0/LICENSE.txt b/3rdParty/SCons/scons-2.4.0/LICENSE.txt
deleted file mode 100644
index a0a96a0..0000000
--- a/3rdParty/SCons/scons-2.4.0/LICENSE.txt
+++ /dev/null
@@ -1,20 +0,0 @@
-Copyright (c) 2001 - 2015 The SCons Foundation
-
-Permission is hereby granted, free of charge, to any person obtaining
-a copy of this software and associated documentation files (the
-"Software"), to deal in the Software without restriction, including
-without limitation the rights to use, copy, modify, merge, publish,
-distribute, sublicense, and/or sell copies of the Software, and to
-permit persons to whom the Software is furnished to do so, subject to
-the following conditions:
-
-The above copyright notice and this permission notice shall be included
-in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/3rdParty/SCons/scons-2.4.0/MANIFEST b/3rdParty/SCons/scons-2.4.0/MANIFEST
deleted file mode 100644
index 9c6504f..0000000
--- a/3rdParty/SCons/scons-2.4.0/MANIFEST
+++ /dev/null
@@ -1,211 +0,0 @@
-CHANGES.txt
-LICENSE.txt
-MANIFEST
-README.txt
-RELEASE.txt
-engine/SCons/Action.py
-engine/SCons/Builder.py
-engine/SCons/CacheDir.py
-engine/SCons/Conftest.py
-engine/SCons/Debug.py
-engine/SCons/Defaults.py
-engine/SCons/Environment.py
-engine/SCons/Errors.py
-engine/SCons/Executor.py
-engine/SCons/Job.py
-engine/SCons/Memoize.py
-engine/SCons/Node/Alias.py
-engine/SCons/Node/FS.py
-engine/SCons/Node/Python.py
-engine/SCons/Node/__init__.py
-engine/SCons/Options/BoolOption.py
-engine/SCons/Options/EnumOption.py
-engine/SCons/Options/ListOption.py
-engine/SCons/Options/PackageOption.py
-engine/SCons/Options/PathOption.py
-engine/SCons/Options/__init__.py
-engine/SCons/PathList.py
-engine/SCons/Platform/__init__.py
-engine/SCons/Platform/aix.py
-engine/SCons/Platform/cygwin.py
-engine/SCons/Platform/darwin.py
-engine/SCons/Platform/hpux.py
-engine/SCons/Platform/irix.py
-engine/SCons/Platform/os2.py
-engine/SCons/Platform/posix.py
-engine/SCons/Platform/sunos.py
-engine/SCons/Platform/win32.py
-engine/SCons/SConf.py
-engine/SCons/SConsign.py
-engine/SCons/Scanner/C.py
-engine/SCons/Scanner/D.py
-engine/SCons/Scanner/Dir.py
-engine/SCons/Scanner/Fortran.py
-engine/SCons/Scanner/IDL.py
-engine/SCons/Scanner/LaTeX.py
-engine/SCons/Scanner/Prog.py
-engine/SCons/Scanner/RC.py
-engine/SCons/Scanner/__init__.py
-engine/SCons/Script/Interactive.py
-engine/SCons/Script/Main.py
-engine/SCons/Script/SConsOptions.py
-engine/SCons/Script/SConscript.py
-engine/SCons/Script/__init__.py
-engine/SCons/Sig.py
-engine/SCons/Subst.py
-engine/SCons/Taskmaster.py
-engine/SCons/Tool/386asm.py
-engine/SCons/Tool/BitKeeper.py
-engine/SCons/Tool/CVS.py
-engine/SCons/Tool/DCommon.py
-engine/SCons/Tool/FortranCommon.py
-engine/SCons/Tool/GettextCommon.py
-engine/SCons/Tool/JavaCommon.py
-engine/SCons/Tool/MSCommon/__init__.py
-engine/SCons/Tool/MSCommon/arch.py
-engine/SCons/Tool/MSCommon/common.py
-engine/SCons/Tool/MSCommon/netframework.py
-engine/SCons/Tool/MSCommon/sdk.py
-engine/SCons/Tool/MSCommon/vc.py
-engine/SCons/Tool/MSCommon/vs.py
-engine/SCons/Tool/Perforce.py
-engine/SCons/Tool/PharLapCommon.py
-engine/SCons/Tool/RCS.py
-engine/SCons/Tool/SCCS.py
-engine/SCons/Tool/Subversion.py
-engine/SCons/Tool/__init__.py
-engine/SCons/Tool/aixc++.py
-engine/SCons/Tool/aixcc.py
-engine/SCons/Tool/aixf77.py
-engine/SCons/Tool/aixlink.py
-engine/SCons/Tool/applelink.py
-engine/SCons/Tool/ar.py
-engine/SCons/Tool/as.py
-engine/SCons/Tool/bcc32.py
-engine/SCons/Tool/c++.py
-engine/SCons/Tool/cc.py
-engine/SCons/Tool/cvf.py
-engine/SCons/Tool/cyglink.py
-engine/SCons/Tool/default.py
-engine/SCons/Tool/dmd.py
-engine/SCons/Tool/docbook/__init__.py
-engine/SCons/Tool/dvi.py
-engine/SCons/Tool/dvipdf.py
-engine/SCons/Tool/dvips.py
-engine/SCons/Tool/f03.py
-engine/SCons/Tool/f77.py
-engine/SCons/Tool/f90.py
-engine/SCons/Tool/f95.py
-engine/SCons/Tool/filesystem.py
-engine/SCons/Tool/fortran.py
-engine/SCons/Tool/g++.py
-engine/SCons/Tool/g77.py
-engine/SCons/Tool/gas.py
-engine/SCons/Tool/gcc.py
-engine/SCons/Tool/gdc.py
-engine/SCons/Tool/gettext.py
-engine/SCons/Tool/gfortran.py
-engine/SCons/Tool/gnulink.py
-engine/SCons/Tool/gs.py
-engine/SCons/Tool/hpc++.py
-engine/SCons/Tool/hpcc.py
-engine/SCons/Tool/hplink.py
-engine/SCons/Tool/icc.py
-engine/SCons/Tool/icl.py
-engine/SCons/Tool/ifl.py
-engine/SCons/Tool/ifort.py
-engine/SCons/Tool/ilink.py
-engine/SCons/Tool/ilink32.py
-engine/SCons/Tool/install.py
-engine/SCons/Tool/intelc.py
-engine/SCons/Tool/ipkg.py
-engine/SCons/Tool/jar.py
-engine/SCons/Tool/javac.py
-engine/SCons/Tool/javah.py
-engine/SCons/Tool/latex.py
-engine/SCons/Tool/ldc.py
-engine/SCons/Tool/lex.py
-engine/SCons/Tool/link.py
-engine/SCons/Tool/linkloc.py
-engine/SCons/Tool/m4.py
-engine/SCons/Tool/masm.py
-engine/SCons/Tool/midl.py
-engine/SCons/Tool/mingw.py
-engine/SCons/Tool/msgfmt.py
-engine/SCons/Tool/msginit.py
-engine/SCons/Tool/msgmerge.py
-engine/SCons/Tool/mslib.py
-engine/SCons/Tool/mslink.py
-engine/SCons/Tool/mssdk.py
-engine/SCons/Tool/msvc.py
-engine/SCons/Tool/msvs.py
-engine/SCons/Tool/mwcc.py
-engine/SCons/Tool/mwld.py
-engine/SCons/Tool/nasm.py
-engine/SCons/Tool/packaging/__init__.py
-engine/SCons/Tool/packaging/ipk.py
-engine/SCons/Tool/packaging/msi.py
-engine/SCons/Tool/packaging/rpm.py
-engine/SCons/Tool/packaging/src_tarbz2.py
-engine/SCons/Tool/packaging/src_targz.py
-engine/SCons/Tool/packaging/src_zip.py
-engine/SCons/Tool/packaging/tarbz2.py
-engine/SCons/Tool/packaging/targz.py
-engine/SCons/Tool/packaging/zip.py
-engine/SCons/Tool/pdf.py
-engine/SCons/Tool/pdflatex.py
-engine/SCons/Tool/pdftex.py
-engine/SCons/Tool/qt.py
-engine/SCons/Tool/rmic.py
-engine/SCons/Tool/rpcgen.py
-engine/SCons/Tool/rpm.py
-engine/SCons/Tool/rpmutils.py
-engine/SCons/Tool/sgiar.py
-engine/SCons/Tool/sgic++.py
-engine/SCons/Tool/sgicc.py
-engine/SCons/Tool/sgilink.py
-engine/SCons/Tool/sunar.py
-engine/SCons/Tool/sunc++.py
-engine/SCons/Tool/suncc.py
-engine/SCons/Tool/sunf77.py
-engine/SCons/Tool/sunf90.py
-engine/SCons/Tool/sunf95.py
-engine/SCons/Tool/sunlink.py
-engine/SCons/Tool/swig.py
-engine/SCons/Tool/tar.py
-engine/SCons/Tool/tex.py
-engine/SCons/Tool/textfile.py
-engine/SCons/Tool/tlib.py
-engine/SCons/Tool/wix.py
-engine/SCons/Tool/xgettext.py
-engine/SCons/Tool/yacc.py
-engine/SCons/Tool/zip.py
-engine/SCons/Util.py
-engine/SCons/Variables/BoolVariable.py
-engine/SCons/Variables/EnumVariable.py
-engine/SCons/Variables/ListVariable.py
-engine/SCons/Variables/PackageVariable.py
-engine/SCons/Variables/PathVariable.py
-engine/SCons/Variables/__init__.py
-engine/SCons/Warnings.py
-engine/SCons/__init__.py
-engine/SCons/compat/__init__.py
-engine/SCons/compat/_scons_builtins.py
-engine/SCons/compat/_scons_collections.py
-engine/SCons/compat/_scons_dbm.py
-engine/SCons/compat/_scons_hashlib.py
-engine/SCons/compat/_scons_io.py
-engine/SCons/compat/_scons_sets.py
-engine/SCons/compat/_scons_subprocess.py
-engine/SCons/cpp.py
-engine/SCons/dblite.py
-engine/SCons/exitfuncs.py
-scons-time.1
-scons.1
-sconsign.1
-script/scons
-script/scons-time
-script/scons.bat
-script/sconsign
-setup.cfg
-setup.py
diff --git a/3rdParty/SCons/scons-2.4.0/PKG-INFO b/3rdParty/SCons/scons-2.4.0/PKG-INFO
deleted file mode 100644
index 7a848af..0000000
--- a/3rdParty/SCons/scons-2.4.0/PKG-INFO
+++ /dev/null
@@ -1,13 +0,0 @@
-Metadata-Version: 1.0
-Name: scons
-Version: 2.4.0
-Summary: Open Source next-generation build tool.
-Home-page: http://www.scons.org/
-Author: Steven Knight
-Author-email: knight@baldmt.com
-License: UNKNOWN
-Description: Open Source next-generation build tool.
- Improved, cross-platform substitute for the classic Make
- utility. In short, SCons is an easier, more reliable
- and faster way to build software.
-Platform: UNKNOWN
diff --git a/3rdParty/SCons/scons-2.4.0/README.txt b/3rdParty/SCons/scons-2.4.0/README.txt
deleted file mode 100644
index 7f4db66..0000000
--- a/3rdParty/SCons/scons-2.4.0/README.txt
+++ /dev/null
@@ -1,250 +0,0 @@
-
-
- SCons - a software construction tool
-
- Version 2.4.0
-
-
-This is SCons, a tool for building software (and other files). SCons is
-implemented in Python, and its "configuration files" are actually Python
-scripts, allowing you to use the full power of a real scripting language
-to solve build problems. You do not, however, need to know Python to
-use SCons effectively.
-
-See the RELEASE.txt file for notes about this specific release,
-including known problems. See the CHANGES.txt file for a list of
-changes since the previous release.
-
-
-LATEST VERSION
-==============
-
-Before going further, you can check that this package you have is
-the latest version by checking the SCons download page at:
-
- http://www.scons.org/download.html
-
-
-EXECUTION REQUIREMENTS
-======================
-
-Running SCons requires Python version 2.7.*. Currently it does not
-run on the Python 3.x release. There should be
-no other dependencies or requirements to run SCons. (There is, however,
-an additional requirement to *install* SCons from this particular
-package; see the next section.)
-
-By default, SCons knows how to search for available programming tools
-on various systems--see the SCons man page for details. You may,
-of course, override the default SCons choices made by appropriate
-configuration of Environment construction variables.
-
-
-INSTALLATION REQUIREMENTS
-=========================
-
-Nothing special.
-
-
-INSTALLATION
-============
-
-Assuming your system satisfies the installation requirements in the
-previous section, install SCons from this package simply by running the
-provided Python-standard setup script as follows:
-
- # python setup.py install
-
-By default, the above command will do the following:
-
- -- Install the version-numbered "scons-2.4.0" and "sconsign-2.4.0"
- scripts in the default system script directory (/usr/bin or
- C:\Python*\Scripts, for example). This can be disabled by
- specifying the "--no-version-script" option on the command
- line.
-
- -- Install scripts named "scons" and "sconsign" scripts in the
- default system script directory (/usr/bin or C:\Python*\Scripts,
- for example). This can be disabled by specifying the
- "--no-scons-script" option on the command line, which is useful
- if you want to install and experiment with a new version before
- making it the default on your system.
-
- On UNIX or Linux systems, you can have the "scons" and "sconsign"
- scripts be hard links or symbolic links to the "scons-2.4.0" and
- "sconsign-2.4.0" scripts by specifying the "--hardlink-scons"
- or "--symlink-scons" options on the command line.
-
- -- Install "scons-2.4.0.bat" and "scons.bat" wrapper scripts in the
- Python prefix directory on Windows (C:\Python*, for example).
- This can be disabled by specifying the "--no-install-bat" option
- on the command line.
-
- On UNIX or Linux systems, the "--install-bat" option may be
- specified to have "scons-2.4.0.bat" and "scons.bat" files
- installed in the default system script directory, which is useful
- if you want to install SCons in a shared file system directory
- that can be used to execute SCons from both UNIX/Linux and
- Windows systems.
-
- -- Install the SCons build engine (a Python module) in an
- appropriate version-numbered SCons library directory
- (/usr/lib/scons-2.4.0 or C:\Python*\scons-2.4.0, for example).
- See below for more options related to installing the build
- engine library.
-
- -- Install the troff-format man pages in an appropriate directory
- on UNIX or Linux systems (/usr/share/man/man1 or /usr/man/man1,
- for example). This can be disabled by specifying the
- "--no-install-man" option on the command line. The man pages
- can be installed on Windows systems by specifying the
- "--install-man" option on the command line.
-
-Note that, by default, SCons does not install its build engine library
-in the standard Python library directories. If you want to be able to
-use the SCons library modules (the build engine) in other Python
-scripts, specify the "--standard-lib" option on the command line, as
-follows:
-
- # python setup.py install --standard-lib
-
-This will install the build engine in the standard Python library
-directory (/usr/lib/python*/site-packages or
-C:\Python*\Lib\site-packages).
-
-Alternatively, you can have SCons install its build engine library in a
-hard-coded standalone library directory, instead of the default
-version-numbered directory, by specifying the "--standalone-lib" option
-on the command line, as follows:
-
- # python setup.py install --standalone-lib
-
-This is usually not recommended, however.
-
-Note that, to install SCons in any of the above system directories,
-you should have system installation privileges (that is, "root" or
-"Administrator") when running the setup.py script. If you don't have
-system installation privileges, you can use the --prefix option to
-specify an alternate installation location, such as your home directory:
-
- $ python setup.py install --prefix=$HOME
-
-This will install SCons in the appropriate locations relative to
-$HOME--that is, the scons script itself $HOME/bin and the associated
-library in $HOME/lib/scons, for example.
-
-
-DOCUMENTATION
-=============
-
-See the RELEASE.txt file for notes about this specific release,
-including known problems. See the CHANGES.txt file for a list of
-changes since the previous release.
-
-The scons.1 man page is included in this package, and contains a section
-of small examples for getting started using SCons.
-
-Additional documentation for SCons is available at:
-
- http://www.scons.org/doc.html
-
-
-LICENSING
-=========
-
-SCons is distributed under the MIT license, a full copy of which is
-available in the LICENSE.txt file. The MIT license is an approved Open
-Source license, which means:
-
- This software is OSI Certified Open Source Software. OSI
- Certified is a certification mark of the Open Source Initiative.
-
-More information about OSI certifications and Open Source software is
-available at:
-
- http://www.opensource.org/
-
-
-REPORTING BUGS
-==============
-
-Please report bugs by following the detailed instructions on our Bug
-Submission page:
-
- http://scons.tigris.org/bug-submission.html
-
-You can also send mail to the SCons developers' mailing list:
-
- scons-dev@scons.org
-
-But even if you send email to the mailing list please make sure that you
-ALSO submit a bug report to the project page bug tracker, because bug
-reports in email often get overlooked in the general flood of messages.
-
-
-MAILING LISTS
-=============
-
-An active mailing list for users of SCons is available. You may send
-questions or comments to the list at:
-
- scons-users@scons.org
-
-You may subscribe to the mailing list by sending email to:
-
- scons-users-join@scons.org
-
-There is also a low-volume mailing list available for announcements
-about SCons. Subscribe by sending email to:
-
- announce-subscribe@scons.tigris.org
-
-There are other mailing lists available for SCons developers, for
-notification of SCons code changes, and for notification of updated
-bug reports and project documents. Please see our mailing lists page
-for details.
-
-
-DONATIONS
-=========
-
-If you find SCons helpful, please consider making a donation (of cash,
-software, or hardware) to support continued work on the project.
-Information is available at:
-
- http://www.scons.org/donate.html
-
-
-FOR MORE INFORMATION
-====================
-
-Check the SCons web site at:
-
- http://www.scons.org/
-
-
-AUTHOR INFO
-===========
-SCons was originally written by Steven Knight, knight at baldmt dot com.
-Since around 2010 it has been maintained by the SCons
-development team, co-managed by Bill Deegan and Gary Oberbrunner, with
-many contributors, including but not at all limited to:
-
-- Chad Austin
-- Dirk Baechle
-- Charles Crain
-- William Deegan
-- Steve Leblanc
-- Rob Managan
-- Greg Noel
-- Gary Oberbrunner
-- Anthony Roach
-- Greg Spencer
-- Tom Tanner
-- Anatoly Techtonik
-- Christoph Wiedemann
-- Russel Winder
-
-\... and many others.
-
-Copyright (c) 2001 - 2015 The SCons Foundation
diff --git a/3rdParty/SCons/scons-2.4.0/RELEASE.txt b/3rdParty/SCons/scons-2.4.0/RELEASE.txt
deleted file mode 100644
index 88d176e..0000000
--- a/3rdParty/SCons/scons-2.4.0/RELEASE.txt
+++ /dev/null
@@ -1,48 +0,0 @@
- A new SCons release, 2.4.0, is now available
- on the SCons download page:
-
- http://www.scons.org/download.php
-
- Here is a summary of the changes since 2.3.6:
-
- NEW FUNCTIONALITY
-
- - None
-
- DEPRECATED FUNCTIONALITY
-
- - None
-
- CHANGED/ENHANCED EXISTING FUNCTIONALITY
-
- - None
-
- FIXES
-
- - None
-
- IMPROVEMENTS
-
- - Switched several core classes to use "slots", to
- reduce the overall memory consumption in large
- projects (fixes #2180, #2178, #2198)
- - Memoizer counting uses decorators now, instead of
- the old metaclasses approach.
-
- PACKAGING
-
- - Added new amd64 windows 64 bit installer
-
- DOCUMENTATION
-
- - None
-
- DEVELOPMENT
-
- - None
-
- Thanks to Dirk Baechle, Andrew Featherstone for their contributions to this release.
- Contributors are listed alphabetically by their last name.
-
-Copyright (c) 2001 - 2015 The SCons Foundation
-src/RELEASE.txt rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Action.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Action.py
deleted file mode 100644
index 7acde46..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Action.py
+++ /dev/null
@@ -1,1258 +0,0 @@
-"""SCons.Action
-
-This encapsulates information about executing any sort of action that
-can build one or more target Nodes (typically files) from one or more
-source Nodes (also typically files) given a specific Environment.
-
-The base class here is ActionBase. The base class supplies just a few
-OO utility methods and some generic methods for displaying information
-about an Action in response to the various commands that control printing.
-
-A second-level base class is _ActionAction. This extends ActionBase
-by providing the methods that can be used to show and perform an
-action. True Action objects will subclass _ActionAction; Action
-factory class objects will subclass ActionBase.
-
-The heavy lifting is handled by subclasses for the different types of
-actions we might execute:
-
- CommandAction
- CommandGeneratorAction
- FunctionAction
- ListAction
-
-The subclasses supply the following public interface methods used by
-other modules:
-
- __call__()
- THE public interface, "calling" an Action object executes the
- command or Python function. This also takes care of printing
- a pre-substitution command for debugging purposes.
-
- get_contents()
- Fetches the "contents" of an Action for signature calculation
- plus the varlist. This is what gets MD5 checksummed to decide
- if a target needs to be rebuilt because its action changed.
-
- genstring()
- Returns a string representation of the Action *without*
- command substitution, but allows a CommandGeneratorAction to
- generate the right action based on the specified target,
- source and env. This is used by the Signature subsystem
- (through the Executor) to obtain an (imprecise) representation
- of the Action operation for informative purposes.
-
-
-Subclasses also supply the following methods for internal use within
-this module:
-
- __str__()
- Returns a string approximation of the Action; no variable
- substitution is performed.
-
- execute()
- The internal method that really, truly, actually handles the
- execution of a command or Python function. This is used so
- that the __call__() methods can take care of displaying any
- pre-substitution representations, and *then* execute an action
- without worrying about the specific Actions involved.
-
- get_presig()
- Fetches the "contents" of a subclass for signature calculation.
- The varlist is added to this to produce the Action's contents.
-
- strfunction()
- Returns a substituted string representation of the Action.
- This is used by the _ActionAction.show() command to display the
- command/function that will be executed to generate the target(s).
-
-There is a related independent ActionCaller class that looks like a
-regular Action, and which serves as a wrapper for arbitrary functions
-that we want to let the user specify the arguments to now, but actually
-execute later (when an out-of-date check determines that it's needed to
-be executed, for example). Objects of this class are returned by an
-ActionFactory class that provides a __call__() method as a convenient
-way for wrapping up the functions.
-
-"""
-
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-__revision__ = "src/engine/SCons/Action.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-import dis
-import os
-# compat layer imports "cPickle" for us if it's available.
-import pickle
-import re
-import sys
-import subprocess
-
-import SCons.Debug
-from SCons.Debug import logInstanceCreation
-import SCons.Errors
-import SCons.Util
-import SCons.Subst
-
-# we use these a lot, so try to optimize them
-is_String = SCons.Util.is_String
-is_List = SCons.Util.is_List
-
-class _null(object):
- pass
-
-print_actions = 1
-execute_actions = 1
-print_actions_presub = 0
-
-def rfile(n):
- try:
- return n.rfile()
- except AttributeError:
- return n
-
-def default_exitstatfunc(s):
- return s
-
-try:
- SET_LINENO = dis.SET_LINENO
- HAVE_ARGUMENT = dis.HAVE_ARGUMENT
-except AttributeError:
- remove_set_lineno_codes = lambda x: x
-else:
- def remove_set_lineno_codes(code):
- result = []
- n = len(code)
- i = 0
- while i < n:
- c = code[i]
- op = ord(c)
- if op >= HAVE_ARGUMENT:
- if op != SET_LINENO:
- result.append(code[i:i+3])
- i = i+3
- else:
- result.append(c)
- i = i+1
- return ''.join(result)
-
-strip_quotes = re.compile('^[\'"](.*)[\'"]$')
-
-
-def _callable_contents(obj):
- """Return the signature contents of a callable Python object.
- """
- try:
- # Test if obj is a method.
- return _function_contents(obj.im_func)
-
- except AttributeError:
- try:
- # Test if obj is a callable object.
- return _function_contents(obj.__call__.im_func)
-
- except AttributeError:
- try:
- # Test if obj is a code object.
- return _code_contents(obj)
-
- except AttributeError:
- # Test if obj is a function object.
- return _function_contents(obj)
-
-
-def _object_contents(obj):
- """Return the signature contents of any Python object.
-
- We have to handle the case where object contains a code object
- since it can be pickled directly.
- """
- try:
- # Test if obj is a method.
- return _function_contents(obj.im_func)
-
- except AttributeError:
- try:
- # Test if obj is a callable object.
- return _function_contents(obj.__call__.im_func)
-
- except AttributeError:
- try:
- # Test if obj is a code object.
- return _code_contents(obj)
-
- except AttributeError:
- try:
- # Test if obj is a function object.
- return _function_contents(obj)
-
- except AttributeError:
- # Should be a pickable Python object.
- try:
- return pickle.dumps(obj)
- except (pickle.PicklingError, TypeError):
- # This is weird, but it seems that nested classes
- # are unpickable. The Python docs say it should
- # always be a PicklingError, but some Python
- # versions seem to return TypeError. Just do
- # the best we can.
- return str(obj)
-
-
-def _code_contents(code):
- """Return the signature contents of a code object.
-
- By providing direct access to the code object of the
- function, Python makes this extremely easy. Hooray!
-
- Unfortunately, older versions of Python include line
- number indications in the compiled byte code. Boo!
- So we remove the line number byte codes to prevent
- recompilations from moving a Python function.
- """
-
- contents = []
-
- # The code contents depends on the number of local variables
- # but not their actual names.
- contents.append("%s,%s" % (code.co_argcount, len(code.co_varnames)))
- try:
- contents.append(",%s,%s" % (len(code.co_cellvars), len(code.co_freevars)))
- except AttributeError:
- # Older versions of Python do not support closures.
- contents.append(",0,0")
-
- # The code contents depends on any constants accessed by the
- # function. Note that we have to call _object_contents on each
- # constants because the code object of nested functions can
- # show-up among the constants.
- #
- # Note that we also always ignore the first entry of co_consts
- # which contains the function doc string. We assume that the
- # function does not access its doc string.
- contents.append(',(' + ','.join(map(_object_contents,code.co_consts[1:])) + ')')
-
- # The code contents depends on the variable names used to
- # accessed global variable, as changing the variable name changes
- # the variable actually accessed and therefore changes the
- # function result.
- contents.append(',(' + ','.join(map(_object_contents,code.co_names)) + ')')
-
-
- # The code contents depends on its actual code!!!
- contents.append(',(' + str(remove_set_lineno_codes(code.co_code)) + ')')
-
- return ''.join(contents)
-
-
-def _function_contents(func):
- """Return the signature contents of a function."""
-
- contents = [_code_contents(func.func_code)]
-
- # The function contents depends on the value of defaults arguments
- if func.func_defaults:
- contents.append(',(' + ','.join(map(_object_contents,func.func_defaults)) + ')')
- else:
- contents.append(',()')
-
- # The function contents depends on the closure captured cell values.
- try:
- closure = func.func_closure or []
- except AttributeError:
- # Older versions of Python do not support closures.
- closure = []
-
- #xxx = [_object_contents(x.cell_contents) for x in closure]
- try:
- xxx = [_object_contents(x.cell_contents) for x in closure]
- except AttributeError:
- xxx = []
- contents.append(',(' + ','.join(xxx) + ')')
-
- return ''.join(contents)
-
-
-def _actionAppend(act1, act2):
- # This function knows how to slap two actions together.
- # Mainly, it handles ListActions by concatenating into
- # a single ListAction.
- a1 = Action(act1)
- a2 = Action(act2)
- if a1 is None:
- return a2
- if a2 is None:
- return a1
- if isinstance(a1, ListAction):
- if isinstance(a2, ListAction):
- return ListAction(a1.list + a2.list)
- else:
- return ListAction(a1.list + [ a2 ])
- else:
- if isinstance(a2, ListAction):
- return ListAction([ a1 ] + a2.list)
- else:
- return ListAction([ a1, a2 ])
-
-def _do_create_keywords(args, kw):
- """This converts any arguments after the action argument into
- their equivalent keywords and adds them to the kw argument.
- """
- v = kw.get('varlist', ())
- # prevent varlist="FOO" from being interpreted as ['F', 'O', 'O']
- if is_String(v): v = (v,)
- kw['varlist'] = tuple(v)
- if args:
- # turn positional args into equivalent keywords
- cmdstrfunc = args[0]
- if cmdstrfunc is None or is_String(cmdstrfunc):
- kw['cmdstr'] = cmdstrfunc
- elif callable(cmdstrfunc):
- kw['strfunction'] = cmdstrfunc
- else:
- raise SCons.Errors.UserError(
- 'Invalid command display variable type. '
- 'You must either pass a string or a callback which '
- 'accepts (target, source, env) as parameters.')
- if len(args) > 1:
- kw['varlist'] = tuple(SCons.Util.flatten(args[1:])) + kw['varlist']
- if kw.get('strfunction', _null) is not _null \
- and kw.get('cmdstr', _null) is not _null:
- raise SCons.Errors.UserError(
- 'Cannot have both strfunction and cmdstr args to Action()')
-
-def _do_create_action(act, kw):
- """This is the actual "implementation" for the
- Action factory method, below. This handles the
- fact that passing lists to Action() itself has
- different semantics than passing lists as elements
- of lists.
-
- The former will create a ListAction, the latter
- will create a CommandAction by converting the inner
- list elements to strings."""
-
- if isinstance(act, ActionBase):
- return act
-
- if is_String(act):
- var=SCons.Util.get_environment_var(act)
- if var:
- # This looks like a string that is purely an Environment
- # variable reference, like "$FOO" or "${FOO}". We do
- # something special here...we lazily evaluate the contents
- # of that Environment variable, so a user could put something
- # like a function or a CommandGenerator in that variable
- # instead of a string.
- return LazyAction(var, kw)
- commands = str(act).split('\n')
- if len(commands) == 1:
- return CommandAction(commands[0], **kw)
- # The list of string commands may include a LazyAction, so we
- # reprocess them via _do_create_list_action.
- return _do_create_list_action(commands, kw)
-
- if is_List(act):
- return CommandAction(act, **kw)
-
- if callable(act):
- try:
- gen = kw['generator']
- del kw['generator']
- except KeyError:
- gen = 0
- if gen:
- action_type = CommandGeneratorAction
- else:
- action_type = FunctionAction
- return action_type(act, kw)
-
- # Catch a common error case with a nice message:
- if isinstance(act, int) or isinstance(act, float):
- raise TypeError("Don't know how to create an Action from a number (%s)"%act)
- # Else fail silently (???)
- return None
-
-def _do_create_list_action(act, kw):
- """A factory for list actions. Convert the input list into Actions
- and then wrap them in a ListAction."""
- acts = []
- for a in act:
- aa = _do_create_action(a, kw)
- if aa is not None: acts.append(aa)
- if not acts:
- return ListAction([])
- elif len(acts) == 1:
- return acts[0]
- else:
- return ListAction(acts)
-
-def Action(act, *args, **kw):
- """A factory for action objects."""
- # Really simple: the _do_create_* routines do the heavy lifting.
- _do_create_keywords(args, kw)
- if is_List(act):
- return _do_create_list_action(act, kw)
- return _do_create_action(act, kw)
-
-class ActionBase(object):
- """Base class for all types of action objects that can be held by
- other objects (Builders, Executors, etc.) This provides the
- common methods for manipulating and combining those actions."""
-
- def __cmp__(self, other):
- return cmp(self.__dict__, other)
-
- def no_batch_key(self, env, target, source):
- return None
-
- batch_key = no_batch_key
-
- def genstring(self, target, source, env):
- return str(self)
-
- def get_contents(self, target, source, env):
- result = [ self.get_presig(target, source, env) ]
- # This should never happen, as the Action() factory should wrap
- # the varlist, but just in case an action is created directly,
- # we duplicate this check here.
- vl = self.get_varlist(target, source, env)
- if is_String(vl): vl = (vl,)
- for v in vl:
- # do the subst this way to ignore $(...$) parts:
- result.append(env.subst_target_source('${'+v+'}', SCons.Subst.SUBST_SIG, target, source))
- return ''.join(result)
-
- def __add__(self, other):
- return _actionAppend(self, other)
-
- def __radd__(self, other):
- return _actionAppend(other, self)
-
- def presub_lines(self, env):
- # CommandGeneratorAction needs a real environment
- # in order to return the proper string here, since
- # it may call LazyAction, which looks up a key
- # in that env. So we temporarily remember the env here,
- # and CommandGeneratorAction will use this env
- # when it calls its _generate method.
- self.presub_env = env
- lines = str(self).split('\n')
- self.presub_env = None # don't need this any more
- return lines
-
- def get_varlist(self, target, source, env, executor=None):
- return self.varlist
-
- def get_targets(self, env, executor):
- """
- Returns the type of targets ($TARGETS, $CHANGED_TARGETS) used
- by this action.
- """
- return self.targets
-
-class _ActionAction(ActionBase):
- """Base class for actions that create output objects."""
- def __init__(self, cmdstr=_null, strfunction=_null, varlist=(),
- presub=_null, chdir=None, exitstatfunc=None,
- batch_key=None, targets='$TARGETS',
- **kw):
- self.cmdstr = cmdstr
- if strfunction is not _null:
- if strfunction is None:
- self.cmdstr = None
- else:
- self.strfunction = strfunction
- self.varlist = varlist
- self.presub = presub
- self.chdir = chdir
- if not exitstatfunc:
- exitstatfunc = default_exitstatfunc
- self.exitstatfunc = exitstatfunc
-
- self.targets = targets
-
- if batch_key:
- if not callable(batch_key):
- # They have set batch_key, but not to their own
- # callable. The default behavior here will batch
- # *all* targets+sources using this action, separated
- # for each construction environment.
- def default_batch_key(self, env, target, source):
- return (id(self), id(env))
- batch_key = default_batch_key
- SCons.Util.AddMethod(self, batch_key, 'batch_key')
-
- def print_cmd_line(self, s, target, source, env):
- # In python 3, and in some of our tests, sys.stdout is
- # a String io object, and it takes unicode strings only
- # In other cases it's a regular Python 2.x file object
- # which takes strings (bytes), and if you pass those a
- # unicode object they try to decode with 'ascii' codec
- # which fails if the cmd line has any hi-bit-set chars.
- # This code assumes s is a regular string, but should
- # work if it's unicode too.
- try:
- sys.stdout.write(unicode(s + "\n"))
- except UnicodeDecodeError:
- sys.stdout.write(s + "\n")
-
- def __call__(self, target, source, env,
- exitstatfunc=_null,
- presub=_null,
- show=_null,
- execute=_null,
- chdir=_null,
- executor=None):
- if not is_List(target):
- target = [target]
- if not is_List(source):
- source = [source]
-
- if presub is _null:
- presub = self.presub
- if presub is _null:
- presub = print_actions_presub
- if exitstatfunc is _null: exitstatfunc = self.exitstatfunc
- if show is _null: show = print_actions
- if execute is _null: execute = execute_actions
- if chdir is _null: chdir = self.chdir
- save_cwd = None
- if chdir:
- save_cwd = os.getcwd()
- try:
- chdir = str(chdir.get_abspath())
- except AttributeError:
- if not is_String(chdir):
- if executor:
- chdir = str(executor.batches[0].targets[0].dir)
- else:
- chdir = str(target[0].dir)
- if presub:
- if executor:
- target = executor.get_all_targets()
- source = executor.get_all_sources()
- t = ' and '.join(map(str, target))
- l = '\n '.join(self.presub_lines(env))
- out = u"Building %s with action:\n %s\n" % (t, l)
- sys.stdout.write(out)
- cmd = None
- if show and self.strfunction:
- if executor:
- target = executor.get_all_targets()
- source = executor.get_all_sources()
- try:
- cmd = self.strfunction(target, source, env, executor)
- except TypeError:
- cmd = self.strfunction(target, source, env)
- if cmd:
- if chdir:
- cmd = ('os.chdir(%s)\n' % repr(chdir)) + cmd
- try:
- get = env.get
- except AttributeError:
- print_func = self.print_cmd_line
- else:
- print_func = get('PRINT_CMD_LINE_FUNC')
- if not print_func:
- print_func = self.print_cmd_line
- print_func(cmd, target, source, env)
- stat = 0
- if execute:
- if chdir:
- os.chdir(chdir)
- try:
- stat = self.execute(target, source, env, executor=executor)
- if isinstance(stat, SCons.Errors.BuildError):
- s = exitstatfunc(stat.status)
- if s:
- stat.status = s
- else:
- stat = s
- else:
- stat = exitstatfunc(stat)
- finally:
- if save_cwd:
- os.chdir(save_cwd)
- if cmd and save_cwd:
- print_func('os.chdir(%s)' % repr(save_cwd), target, source, env)
-
- return stat
-
-
-def _string_from_cmd_list(cmd_list):
- """Takes a list of command line arguments and returns a pretty
- representation for printing."""
- cl = []
- for arg in map(str, cmd_list):
- if ' ' in arg or '\t' in arg:
- arg = '"' + arg + '"'
- cl.append(arg)
- return ' '.join(cl)
-
-# A fiddlin' little function that has an 'import SCons.Environment' which
-# can't be moved to the top level without creating an import loop. Since
-# this import creates a local variable named 'SCons', it blocks access to
-# the global variable, so we move it here to prevent complaints about local
-# variables being used uninitialized.
-default_ENV = None
-def get_default_ENV(env):
- global default_ENV
- try:
- return env['ENV']
- except KeyError:
- if not default_ENV:
- import SCons.Environment
- # This is a hideously expensive way to get a default shell
- # environment. What it really should do is run the platform
- # setup to get the default ENV. Fortunately, it's incredibly
- # rare for an Environment not to have a shell environment, so
- # we're not going to worry about it overmuch.
- default_ENV = SCons.Environment.Environment()['ENV']
- return default_ENV
-
-# This function is still in draft mode. We're going to need something like
-# it in the long run as more and more places use subprocess, but I'm sure
-# it'll have to be tweaked to get the full desired functionality.
-# one special arg (so far?), 'error', to tell what to do with exceptions.
-def _subproc(scons_env, cmd, error = 'ignore', **kw):
- """Do common setup for a subprocess.Popen() call"""
- # allow std{in,out,err} to be "'devnull'"
- io = kw.get('stdin')
- if is_String(io) and io == 'devnull':
- kw['stdin'] = open(os.devnull)
- io = kw.get('stdout')
- if is_String(io) and io == 'devnull':
- kw['stdout'] = open(os.devnull, 'w')
- io = kw.get('stderr')
- if is_String(io) and io == 'devnull':
- kw['stderr'] = open(os.devnull, 'w')
-
- # Figure out what shell environment to use
- ENV = kw.get('env', None)
- if ENV is None: ENV = get_default_ENV(scons_env)
-
- # Ensure that the ENV values are all strings:
- new_env = {}
- for key, value in ENV.items():
- if is_List(value):
- # If the value is a list, then we assume it is a path list,
- # because that's a pretty common list-like value to stick
- # in an environment variable:
- value = SCons.Util.flatten_sequence(value)
- new_env[key] = os.pathsep.join(map(str, value))
- else:
- # It's either a string or something else. If it's a string,
- # we still want to call str() because it might be a *Unicode*
- # string, which makes subprocess.Popen() gag. If it isn't a
- # string or a list, then we just coerce it to a string, which
- # is the proper way to handle Dir and File instances and will
- # produce something reasonable for just about everything else:
- new_env[key] = str(value)
- kw['env'] = new_env
-
- try:
- return subprocess.Popen(cmd, **kw)
- except EnvironmentError, e:
- if error == 'raise': raise
- # return a dummy Popen instance that only returns error
- class dummyPopen(object):
- def __init__(self, e): self.exception = e
- def communicate(self,input=None): return ('','')
- def wait(self): return -self.exception.errno
- stdin = None
- class f(object):
- def read(self): return ''
- def readline(self): return ''
- def __iter__(self): return iter(())
- stdout = stderr = f()
- return dummyPopen(e)
-
-class CommandAction(_ActionAction):
- """Class for command-execution actions."""
- def __init__(self, cmd, **kw):
- # Cmd can actually be a list or a single item; if it's a
- # single item it should be the command string to execute; if a
- # list then it should be the words of the command string to
- # execute. Only a single command should be executed by this
- # object; lists of commands should be handled by embedding
- # these objects in a ListAction object (which the Action()
- # factory above does). cmd will be passed to
- # Environment.subst_list() for substituting environment
- # variables.
- if SCons.Debug.track_instances: logInstanceCreation(self, 'Action.CommandAction')
-
- _ActionAction.__init__(self, **kw)
- if is_List(cmd):
- if list(filter(is_List, cmd)):
- raise TypeError("CommandAction should be given only " \
- "a single command")
- self.cmd_list = cmd
-
- def __str__(self):
- if is_List(self.cmd_list):
- return ' '.join(map(str, self.cmd_list))
- return str(self.cmd_list)
-
- def process(self, target, source, env, executor=None):
- if executor:
- result = env.subst_list(self.cmd_list, 0, executor=executor)
- else:
- result = env.subst_list(self.cmd_list, 0, target, source)
- silent = None
- ignore = None
- while True:
- try: c = result[0][0][0]
- except IndexError: c = None
- if c == '@': silent = 1
- elif c == '-': ignore = 1
- else: break
- result[0][0] = result[0][0][1:]
- try:
- if not result[0][0]:
- result[0] = result[0][1:]
- except IndexError:
- pass
- return result, ignore, silent
-
- def strfunction(self, target, source, env, executor=None):
- if self.cmdstr is None:
- return None
- if self.cmdstr is not _null:
- from SCons.Subst import SUBST_RAW
- if executor:
- c = env.subst(self.cmdstr, SUBST_RAW, executor=executor)
- else:
- c = env.subst(self.cmdstr, SUBST_RAW, target, source)
- if c:
- return c
- cmd_list, ignore, silent = self.process(target, source, env, executor)
- if silent:
- return ''
- return _string_from_cmd_list(cmd_list[0])
-
- def execute(self, target, source, env, executor=None):
- """Execute a command action.
-
- This will handle lists of commands as well as individual commands,
- because construction variable substitution may turn a single
- "command" into a list. This means that this class can actually
- handle lists of commands, even though that's not how we use it
- externally.
- """
- escape_list = SCons.Subst.escape_list
- flatten_sequence = SCons.Util.flatten_sequence
-
- try:
- shell = env['SHELL']
- except KeyError:
- raise SCons.Errors.UserError('Missing SHELL construction variable.')
-
- try:
- spawn = env['SPAWN']
- except KeyError:
- raise SCons.Errors.UserError('Missing SPAWN construction variable.')
- else:
- if is_String(spawn):
- spawn = env.subst(spawn, raw=1, conv=lambda x: x)
-
- escape = env.get('ESCAPE', lambda x: x)
-
- ENV = get_default_ENV(env)
-
- # Ensure that the ENV values are all strings:
- for key, value in ENV.items():
- if not is_String(value):
- if is_List(value):
- # If the value is a list, then we assume it is a
- # path list, because that's a pretty common list-like
- # value to stick in an environment variable:
- value = flatten_sequence(value)
- ENV[key] = os.pathsep.join(map(str, value))
- else:
- # If it isn't a string or a list, then we just coerce
- # it to a string, which is the proper way to handle
- # Dir and File instances and will produce something
- # reasonable for just about everything else:
- ENV[key] = str(value)
-
- if executor:
- target = executor.get_all_targets()
- source = executor.get_all_sources()
- cmd_list, ignore, silent = self.process(target, list(map(rfile, source)), env, executor)
-
- # Use len() to filter out any "command" that's zero-length.
- for cmd_line in filter(len, cmd_list):
- # Escape the command line for the interpreter we are using.
- cmd_line = escape_list(cmd_line, escape)
- result = spawn(shell, escape, cmd_line[0], cmd_line, ENV)
- if not ignore and result:
- msg = "Error %s" % result
- return SCons.Errors.BuildError(errstr=msg,
- status=result,
- action=self,
- command=cmd_line)
- return 0
-
- def get_presig(self, target, source, env, executor=None):
- """Return the signature contents of this action's command line.
-
- This strips $(-$) and everything in between the string,
- since those parts don't affect signatures.
- """
- from SCons.Subst import SUBST_SIG
- cmd = self.cmd_list
- if is_List(cmd):
- cmd = ' '.join(map(str, cmd))
- else:
- cmd = str(cmd)
- if executor:
- return env.subst_target_source(cmd, SUBST_SIG, executor=executor)
- else:
- return env.subst_target_source(cmd, SUBST_SIG, target, source)
-
- def get_implicit_deps(self, target, source, env, executor=None):
- icd = env.get('IMPLICIT_COMMAND_DEPENDENCIES', True)
- if is_String(icd) and icd[:1] == '$':
- icd = env.subst(icd)
- if not icd or icd in ('0', 'None'):
- return []
- from SCons.Subst import SUBST_SIG
- if executor:
- cmd_list = env.subst_list(self.cmd_list, SUBST_SIG, executor=executor)
- else:
- cmd_list = env.subst_list(self.cmd_list, SUBST_SIG, target, source)
- res = []
- for cmd_line in cmd_list:
- if cmd_line:
- d = str(cmd_line[0])
- m = strip_quotes.match(d)
- if m:
- d = m.group(1)
- d = env.WhereIs(d)
- if d:
- res.append(env.fs.File(d))
- return res
-
-class CommandGeneratorAction(ActionBase):
- """Class for command-generator actions."""
- def __init__(self, generator, kw):
- if SCons.Debug.track_instances: logInstanceCreation(self, 'Action.CommandGeneratorAction')
- self.generator = generator
- self.gen_kw = kw
- self.varlist = kw.get('varlist', ())
- self.targets = kw.get('targets', '$TARGETS')
-
- def _generate(self, target, source, env, for_signature, executor=None):
- # ensure that target is a list, to make it easier to write
- # generator functions:
- if not is_List(target):
- target = [target]
-
- if executor:
- target = executor.get_all_targets()
- source = executor.get_all_sources()
- ret = self.generator(target=target,
- source=source,
- env=env,
- for_signature=for_signature)
- gen_cmd = Action(ret, **self.gen_kw)
- if not gen_cmd:
- raise SCons.Errors.UserError("Object returned from command generator: %s cannot be used to create an Action." % repr(ret))
- return gen_cmd
-
- def __str__(self):
- try:
- env = self.presub_env
- except AttributeError:
- env = None
- if env is None:
- env = SCons.Defaults.DefaultEnvironment()
- act = self._generate([], [], env, 1)
- return str(act)
-
- def batch_key(self, env, target, source):
- return self._generate(target, source, env, 1).batch_key(env, target, source)
-
- def genstring(self, target, source, env, executor=None):
- return self._generate(target, source, env, 1, executor).genstring(target, source, env)
-
- def __call__(self, target, source, env, exitstatfunc=_null, presub=_null,
- show=_null, execute=_null, chdir=_null, executor=None):
- act = self._generate(target, source, env, 0, executor)
- if act is None:
- raise SCons.Errors.UserError("While building `%s': "
- "Cannot deduce file extension from source files: %s"
- % (repr(list(map(str, target))), repr(list(map(str, source)))))
- return act(target, source, env, exitstatfunc, presub,
- show, execute, chdir, executor)
-
- def get_presig(self, target, source, env, executor=None):
- """Return the signature contents of this action's command line.
-
- This strips $(-$) and everything in between the string,
- since those parts don't affect signatures.
- """
- return self._generate(target, source, env, 1, executor).get_presig(target, source, env)
-
- def get_implicit_deps(self, target, source, env, executor=None):
- return self._generate(target, source, env, 1, executor).get_implicit_deps(target, source, env)
-
- def get_varlist(self, target, source, env, executor=None):
- return self._generate(target, source, env, 1, executor).get_varlist(target, source, env, executor)
-
- def get_targets(self, env, executor):
- return self._generate(None, None, env, 1, executor).get_targets(env, executor)
-
-
-
-# A LazyAction is a kind of hybrid generator and command action for
-# strings of the form "$VAR". These strings normally expand to other
-# strings (think "$CCCOM" to "$CC -c -o $TARGET $SOURCE"), but we also
-# want to be able to replace them with functions in the construction
-# environment. Consequently, we want lazy evaluation and creation of
-# an Action in the case of the function, but that's overkill in the more
-# normal case of expansion to other strings.
-#
-# So we do this with a subclass that's both a generator *and*
-# a command action. The overridden methods all do a quick check
-# of the construction variable, and if it's a string we just call
-# the corresponding CommandAction method to do the heavy lifting.
-# If not, then we call the same-named CommandGeneratorAction method.
-# The CommandGeneratorAction methods work by using the overridden
-# _generate() method, that is, our own way of handling "generation" of
-# an action based on what's in the construction variable.
-
-class LazyAction(CommandGeneratorAction, CommandAction):
-
- def __init__(self, var, kw):
- if SCons.Debug.track_instances: logInstanceCreation(self, 'Action.LazyAction')
- #FUTURE CommandAction.__init__(self, '${'+var+'}', **kw)
- CommandAction.__init__(self, '${'+var+'}', **kw)
- self.var = SCons.Util.to_String(var)
- self.gen_kw = kw
-
- def get_parent_class(self, env):
- c = env.get(self.var)
- if is_String(c) and not '\n' in c:
- return CommandAction
- return CommandGeneratorAction
-
- def _generate_cache(self, env):
- if env:
- c = env.get(self.var, '')
- else:
- c = ''
- gen_cmd = Action(c, **self.gen_kw)
- if not gen_cmd:
- raise SCons.Errors.UserError("$%s value %s cannot be used to create an Action." % (self.var, repr(c)))
- return gen_cmd
-
- def _generate(self, target, source, env, for_signature, executor=None):
- return self._generate_cache(env)
-
- def __call__(self, target, source, env, *args, **kw):
- c = self.get_parent_class(env)
- return c.__call__(self, target, source, env, *args, **kw)
-
- def get_presig(self, target, source, env):
- c = self.get_parent_class(env)
- return c.get_presig(self, target, source, env)
-
- def get_varlist(self, target, source, env, executor=None):
- c = self.get_parent_class(env)
- return c.get_varlist(self, target, source, env, executor)
-
-
-class FunctionAction(_ActionAction):
- """Class for Python function actions."""
-
- def __init__(self, execfunction, kw):
- if SCons.Debug.track_instances: logInstanceCreation(self, 'Action.FunctionAction')
-
- self.execfunction = execfunction
- try:
- self.funccontents = _callable_contents(execfunction)
- except AttributeError:
- try:
- # See if execfunction will do the heavy lifting for us.
- self.gc = execfunction.get_contents
- except AttributeError:
- # This is weird, just do the best we can.
- self.funccontents = _object_contents(execfunction)
-
- _ActionAction.__init__(self, **kw)
-
- def function_name(self):
- try:
- return self.execfunction.__name__
- except AttributeError:
- try:
- return self.execfunction.__class__.__name__
- except AttributeError:
- return "unknown_python_function"
-
- def strfunction(self, target, source, env, executor=None):
- if self.cmdstr is None:
- return None
- if self.cmdstr is not _null:
- from SCons.Subst import SUBST_RAW
- if executor:
- c = env.subst(self.cmdstr, SUBST_RAW, executor=executor)
- else:
- c = env.subst(self.cmdstr, SUBST_RAW, target, source)
- if c:
- return c
- def array(a):
- def quote(s):
- try:
- str_for_display = s.str_for_display
- except AttributeError:
- s = repr(s)
- else:
- s = str_for_display()
- return s
- return '[' + ", ".join(map(quote, a)) + ']'
- try:
- strfunc = self.execfunction.strfunction
- except AttributeError:
- pass
- else:
- if strfunc is None:
- return None
- if callable(strfunc):
- return strfunc(target, source, env)
- name = self.function_name()
- tstr = array(target)
- sstr = array(source)
- return "%s(%s, %s)" % (name, tstr, sstr)
-
- def __str__(self):
- name = self.function_name()
- if name == 'ActionCaller':
- return str(self.execfunction)
- return "%s(target, source, env)" % name
-
- def execute(self, target, source, env, executor=None):
- exc_info = (None,None,None)
- try:
- if executor:
- target = executor.get_all_targets()
- source = executor.get_all_sources()
- rsources = list(map(rfile, source))
- try:
- result = self.execfunction(target=target, source=rsources, env=env)
- except KeyboardInterrupt, e:
- raise
- except SystemExit, e:
- raise
- except Exception, e:
- result = e
- exc_info = sys.exc_info()
-
- if result:
- result = SCons.Errors.convert_to_BuildError(result, exc_info)
- result.node=target
- result.action=self
- try:
- result.command=self.strfunction(target, source, env, executor)
- except TypeError:
- result.command=self.strfunction(target, source, env)
-
- # FIXME: This maintains backward compatibility with respect to
- # which type of exceptions were returned by raising an
- # exception and which ones were returned by value. It would
- # probably be best to always return them by value here, but
- # some codes do not check the return value of Actions and I do
- # not have the time to modify them at this point.
- if (exc_info[1] and
- not isinstance(exc_info[1],EnvironmentError)):
- raise result
-
- return result
- finally:
- # Break the cycle between the traceback object and this
- # function stack frame. See the sys.exc_info() doc info for
- # more information about this issue.
- del exc_info
-
-
- def get_presig(self, target, source, env):
- """Return the signature contents of this callable action."""
- try:
- return self.gc(target, source, env)
- except AttributeError:
- return self.funccontents
-
- def get_implicit_deps(self, target, source, env):
- return []
-
-class ListAction(ActionBase):
- """Class for lists of other actions."""
- def __init__(self, actionlist):
- if SCons.Debug.track_instances: logInstanceCreation(self, 'Action.ListAction')
- def list_of_actions(x):
- if isinstance(x, ActionBase):
- return x
- return Action(x)
- self.list = list(map(list_of_actions, actionlist))
- # our children will have had any varlist
- # applied; we don't need to do it again
- self.varlist = ()
- self.targets = '$TARGETS'
-
- def genstring(self, target, source, env):
- return '\n'.join([a.genstring(target, source, env) for a in self.list])
-
- def __str__(self):
- return '\n'.join(map(str, self.list))
-
- def presub_lines(self, env):
- return SCons.Util.flatten_sequence(
- [a.presub_lines(env) for a in self.list])
-
- def get_presig(self, target, source, env):
- """Return the signature contents of this action list.
-
- Simple concatenation of the signatures of the elements.
- """
- return "".join([x.get_contents(target, source, env) for x in self.list])
-
- def __call__(self, target, source, env, exitstatfunc=_null, presub=_null,
- show=_null, execute=_null, chdir=_null, executor=None):
- if executor:
- target = executor.get_all_targets()
- source = executor.get_all_sources()
- for act in self.list:
- stat = act(target, source, env, exitstatfunc, presub,
- show, execute, chdir, executor)
- if stat:
- return stat
- return 0
-
- def get_implicit_deps(self, target, source, env):
- result = []
- for act in self.list:
- result.extend(act.get_implicit_deps(target, source, env))
- return result
-
- def get_varlist(self, target, source, env, executor=None):
- result = SCons.Util.OrderedDict()
- for act in self.list:
- for var in act.get_varlist(target, source, env, executor):
- result[var] = True
- return list(result.keys())
-
-class ActionCaller(object):
- """A class for delaying calling an Action function with specific
- (positional and keyword) arguments until the Action is actually
- executed.
-
- This class looks to the rest of the world like a normal Action object,
- but what it's really doing is hanging on to the arguments until we
- have a target, source and env to use for the expansion.
- """
- def __init__(self, parent, args, kw):
- self.parent = parent
- self.args = args
- self.kw = kw
-
- def get_contents(self, target, source, env):
- actfunc = self.parent.actfunc
- try:
- # "self.actfunc" is a function.
- contents = str(actfunc.func_code.co_code)
- except AttributeError:
- # "self.actfunc" is a callable object.
- try:
- contents = str(actfunc.__call__.im_func.func_code.co_code)
- except AttributeError:
- # No __call__() method, so it might be a builtin
- # or something like that. Do the best we can.
- contents = str(actfunc)
- contents = remove_set_lineno_codes(contents)
- return contents
-
- def subst(self, s, target, source, env):
- # If s is a list, recursively apply subst()
- # to every element in the list
- if is_List(s):
- result = []
- for elem in s:
- result.append(self.subst(elem, target, source, env))
- return self.parent.convert(result)
-
- # Special-case hack: Let a custom function wrapped in an
- # ActionCaller get at the environment through which the action
- # was called by using this hard-coded value as a special return.
- if s == '$__env__':
- return env
- elif is_String(s):
- return env.subst(s, 1, target, source)
- return self.parent.convert(s)
-
- def subst_args(self, target, source, env):
- return [self.subst(x, target, source, env) for x in self.args]
-
- def subst_kw(self, target, source, env):
- kw = {}
- for key in self.kw.keys():
- kw[key] = self.subst(self.kw[key], target, source, env)
- return kw
-
- def __call__(self, target, source, env, executor=None):
- args = self.subst_args(target, source, env)
- kw = self.subst_kw(target, source, env)
- return self.parent.actfunc(*args, **kw)
-
- def strfunction(self, target, source, env):
- args = self.subst_args(target, source, env)
- kw = self.subst_kw(target, source, env)
- return self.parent.strfunc(*args, **kw)
-
- def __str__(self):
- return self.parent.strfunc(*self.args, **self.kw)
-
-class ActionFactory(object):
- """A factory class that will wrap up an arbitrary function
- as an SCons-executable Action object.
-
- The real heavy lifting here is done by the ActionCaller class.
- We just collect the (positional and keyword) arguments that we're
- called with and give them to the ActionCaller object we create,
- so it can hang onto them until it needs them.
- """
- def __init__(self, actfunc, strfunc, convert=lambda x: x):
- self.actfunc = actfunc
- self.strfunc = strfunc
- self.convert = convert
-
- def __call__(self, *args, **kw):
- ac = ActionCaller(self, args, kw)
- action = Action(ac, strfunction=ac.strfunction)
- return action
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Builder.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Builder.py
deleted file mode 100644
index 4c68d5c..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Builder.py
+++ /dev/null
@@ -1,869 +0,0 @@
-"""SCons.Builder
-
-Builder object subsystem.
-
-A Builder object is a callable that encapsulates information about how
-to execute actions to create a target Node (file) from source Nodes
-(files), and how to create those dependencies for tracking.
-
-The main entry point here is the Builder() factory method. This provides
-a procedural interface that creates the right underlying Builder object
-based on the keyword arguments supplied and the types of the arguments.
-
-The goal is for this external interface to be simple enough that the
-vast majority of users can create new Builders as necessary to support
-building new types of files in their configurations, without having to
-dive any deeper into this subsystem.
-
-The base class here is BuilderBase. This is a concrete base class which
-does, in fact, represent the Builder objects that we (or users) create.
-
-There is also a proxy that looks like a Builder:
-
- CompositeBuilder
-
- This proxies for a Builder with an action that is actually a
- dictionary that knows how to map file suffixes to a specific
- action. This is so that we can invoke different actions
- (compilers, compile options) for different flavors of source
- files.
-
-Builders and their proxies have the following public interface methods
-used by other modules:
-
- __call__()
- THE public interface. Calling a Builder object (with the
- use of internal helper methods) sets up the target and source
- dependencies, appropriate mapping to a specific action, and the
- environment manipulation necessary for overridden construction
- variable. This also takes care of warning about possible mistakes
- in keyword arguments.
-
- add_emitter()
- Adds an emitter for a specific file suffix, used by some Tool
- modules to specify that (for example) a yacc invocation on a .y
- can create a .h *and* a .c file.
-
- add_action()
- Adds an action for a specific file suffix, heavily used by
- Tool modules to add their specific action(s) for turning
- a source file into an object file to the global static
- and shared object file Builders.
-
-There are the following methods for internal use within this module:
-
- _execute()
- The internal method that handles the heavily lifting when a
- Builder is called. This is used so that the __call__() methods
- can set up warning about possible mistakes in keyword-argument
- overrides, and *then* execute all of the steps necessary so that
- the warnings only occur once.
-
- get_name()
- Returns the Builder's name within a specific Environment,
- primarily used to try to return helpful information in error
- messages.
-
- adjust_suffix()
- get_prefix()
- get_suffix()
- get_src_suffix()
- set_src_suffix()
- Miscellaneous stuff for handling the prefix and suffix
- manipulation we use in turning source file names into target
- file names.
-
-"""
-
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-__revision__ = "src/engine/SCons/Builder.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-import collections
-
-import SCons.Action
-import SCons.Debug
-from SCons.Debug import logInstanceCreation
-from SCons.Errors import InternalError, UserError
-import SCons.Executor
-import SCons.Memoize
-import SCons.Util
-import SCons.Warnings
-
-class _Null(object):
- pass
-
-_null = _Null
-
-def match_splitext(path, suffixes = []):
- if suffixes:
- matchsuf = [S for S in suffixes if path[-len(S):] == S]
- if matchsuf:
- suf = max([(len(_f),_f) for _f in matchsuf])[1]
- return [path[:-len(suf)], path[-len(suf):]]
- return SCons.Util.splitext(path)
-
-class DictCmdGenerator(SCons.Util.Selector):
- """This is a callable class that can be used as a
- command generator function. It holds on to a dictionary
- mapping file suffixes to Actions. It uses that dictionary
- to return the proper action based on the file suffix of
- the source file."""
-
- def __init__(self, dict=None, source_ext_match=1):
- SCons.Util.Selector.__init__(self, dict)
- self.source_ext_match = source_ext_match
-
- def src_suffixes(self):
- return list(self.keys())
-
- def add_action(self, suffix, action):
- """Add a suffix-action pair to the mapping.
- """
- self[suffix] = action
-
- def __call__(self, target, source, env, for_signature):
- if not source:
- return []
-
- if self.source_ext_match:
- suffixes = self.src_suffixes()
- ext = None
- for src in map(str, source):
- my_ext = match_splitext(src, suffixes)[1]
- if ext and my_ext != ext:
- raise UserError("While building `%s' from `%s': Cannot build multiple sources with different extensions: %s, %s"
- % (repr(list(map(str, target))), src, ext, my_ext))
- ext = my_ext
- else:
- ext = match_splitext(str(source[0]), self.src_suffixes())[1]
-
- if not ext:
- #return ext
- raise UserError("While building `%s': "
- "Cannot deduce file extension from source files: %s"
- % (repr(list(map(str, target))), repr(list(map(str, source)))))
-
- try:
- ret = SCons.Util.Selector.__call__(self, env, source, ext)
- except KeyError, e:
- raise UserError("Ambiguous suffixes after environment substitution: %s == %s == %s" % (e.args[0], e.args[1], e.args[2]))
- if ret is None:
- raise UserError("While building `%s' from `%s': Don't know how to build from a source file with suffix `%s'. Expected a suffix in this list: %s." % \
- (repr(list(map(str, target))), repr(list(map(str, source))), ext, repr(list(self.keys()))))
- return ret
-
-class CallableSelector(SCons.Util.Selector):
- """A callable dictionary that will, in turn, call the value it
- finds if it can."""
- def __call__(self, env, source):
- value = SCons.Util.Selector.__call__(self, env, source)
- if callable(value):
- value = value(env, source)
- return value
-
-class DictEmitter(SCons.Util.Selector):
- """A callable dictionary that maps file suffixes to emitters.
- When called, it finds the right emitter in its dictionary for the
- suffix of the first source file, and calls that emitter to get the
- right lists of targets and sources to return. If there's no emitter
- for the suffix in its dictionary, the original target and source are
- returned.
- """
- def __call__(self, target, source, env):
- emitter = SCons.Util.Selector.__call__(self, env, source)
- if emitter:
- target, source = emitter(target, source, env)
- return (target, source)
-
-class ListEmitter(collections.UserList):
- """A callable list of emitters that calls each in sequence,
- returning the result.
- """
- def __call__(self, target, source, env):
- for e in self.data:
- target, source = e(target, source, env)
- return (target, source)
-
-# These are a common errors when calling a Builder;
-# they are similar to the 'target' and 'source' keyword args to builders,
-# so we issue warnings when we see them. The warnings can, of course,
-# be disabled.
-misleading_keywords = {
- 'targets' : 'target',
- 'sources' : 'source',
-}
-
-class OverrideWarner(collections.UserDict):
- """A class for warning about keyword arguments that we use as
- overrides in a Builder call.
-
- This class exists to handle the fact that a single Builder call
- can actually invoke multiple builders. This class only emits the
- warnings once, no matter how many Builders are invoked.
- """
- def __init__(self, dict):
- collections.UserDict.__init__(self, dict)
- if SCons.Debug.track_instances: logInstanceCreation(self, 'Builder.OverrideWarner')
- self.already_warned = None
- def warn(self):
- if self.already_warned:
- return
- for k in self.keys():
- if k in misleading_keywords:
- alt = misleading_keywords[k]
- msg = "Did you mean to use `%s' instead of `%s'?" % (alt, k)
- SCons.Warnings.warn(SCons.Warnings.MisleadingKeywordsWarning, msg)
- self.already_warned = 1
-
-def Builder(**kw):
- """A factory for builder objects."""
- composite = None
- if 'generator' in kw:
- if 'action' in kw:
- raise UserError("You must not specify both an action and a generator.")
- kw['action'] = SCons.Action.CommandGeneratorAction(kw['generator'], {})
- del kw['generator']
- elif 'action' in kw:
- source_ext_match = kw.get('source_ext_match', 1)
- if 'source_ext_match' in kw:
- del kw['source_ext_match']
- if SCons.Util.is_Dict(kw['action']):
- composite = DictCmdGenerator(kw['action'], source_ext_match)
- kw['action'] = SCons.Action.CommandGeneratorAction(composite, {})
- kw['src_suffix'] = composite.src_suffixes()
- else:
- kw['action'] = SCons.Action.Action(kw['action'])
-
- if 'emitter' in kw:
- emitter = kw['emitter']
- if SCons.Util.is_String(emitter):
- # This allows users to pass in an Environment
- # variable reference (like "$FOO") as an emitter.
- # We will look in that Environment variable for
- # a callable to use as the actual emitter.
- var = SCons.Util.get_environment_var(emitter)
- if not var:
- raise UserError("Supplied emitter '%s' does not appear to refer to an Environment variable" % emitter)
- kw['emitter'] = EmitterProxy(var)
- elif SCons.Util.is_Dict(emitter):
- kw['emitter'] = DictEmitter(emitter)
- elif SCons.Util.is_List(emitter):
- kw['emitter'] = ListEmitter(emitter)
-
- result = BuilderBase(**kw)
-
- if not composite is None:
- result = CompositeBuilder(result, composite)
-
- return result
-
-def _node_errors(builder, env, tlist, slist):
- """Validate that the lists of target and source nodes are
- legal for this builder and environment. Raise errors or
- issue warnings as appropriate.
- """
-
- # First, figure out if there are any errors in the way the targets
- # were specified.
- for t in tlist:
- if t.side_effect:
- raise UserError("Multiple ways to build the same target were specified for: %s" % t)
- if t.has_explicit_builder():
- if not t.env is None and not t.env is env:
- action = t.builder.action
- t_contents = action.get_contents(tlist, slist, t.env)
- contents = action.get_contents(tlist, slist, env)
-
- if t_contents == contents:
- msg = "Two different environments were specified for target %s,\n\tbut they appear to have the same action: %s" % (t, action.genstring(tlist, slist, t.env))
- SCons.Warnings.warn(SCons.Warnings.DuplicateEnvironmentWarning, msg)
- else:
- msg = "Two environments with different actions were specified for the same target: %s" % t
- raise UserError(msg)
- if builder.multi:
- if t.builder != builder:
- msg = "Two different builders (%s and %s) were specified for the same target: %s" % (t.builder.get_name(env), builder.get_name(env), t)
- raise UserError(msg)
- # TODO(batch): list constructed each time!
- if t.get_executor().get_all_targets() != tlist:
- msg = "Two different target lists have a target in common: %s (from %s and from %s)" % (t, list(map(str, t.get_executor().get_all_targets())), list(map(str, tlist)))
- raise UserError(msg)
- elif t.sources != slist:
- msg = "Multiple ways to build the same target were specified for: %s (from %s and from %s)" % (t, list(map(str, t.sources)), list(map(str, slist)))
- raise UserError(msg)
-
- if builder.single_source:
- if len(slist) > 1:
- raise UserError("More than one source given for single-source builder: targets=%s sources=%s" % (list(map(str,tlist)), list(map(str,slist))))
-
-class EmitterProxy(object):
- """This is a callable class that can act as a
- Builder emitter. It holds on to a string that
- is a key into an Environment dictionary, and will
- look there at actual build time to see if it holds
- a callable. If so, we will call that as the actual
- emitter."""
- def __init__(self, var):
- self.var = SCons.Util.to_String(var)
-
- def __call__(self, target, source, env):
- emitter = self.var
-
- # Recursively substitute the variable.
- # We can't use env.subst() because it deals only
- # in strings. Maybe we should change that?
- while SCons.Util.is_String(emitter) and emitter in env:
- emitter = env[emitter]
- if callable(emitter):
- target, source = emitter(target, source, env)
- elif SCons.Util.is_List(emitter):
- for e in emitter:
- target, source = e(target, source, env)
-
- return (target, source)
-
-
- def __cmp__(self, other):
- return cmp(self.var, other.var)
-
-class BuilderBase(object):
- """Base class for Builders, objects that create output
- nodes (files) from input nodes (files).
- """
-
- def __init__(self, action = None,
- prefix = '',
- suffix = '',
- src_suffix = '',
- target_factory = None,
- source_factory = None,
- target_scanner = None,
- source_scanner = None,
- emitter = None,
- multi = 0,
- env = None,
- single_source = 0,
- name = None,
- chdir = _null,
- is_explicit = 1,
- src_builder = None,
- ensure_suffix = False,
- **overrides):
- if SCons.Debug.track_instances: logInstanceCreation(self, 'Builder.BuilderBase')
- self._memo = {}
- self.action = action
- self.multi = multi
- if SCons.Util.is_Dict(prefix):
- prefix = CallableSelector(prefix)
- self.prefix = prefix
- if SCons.Util.is_Dict(suffix):
- suffix = CallableSelector(suffix)
- self.env = env
- self.single_source = single_source
- if 'overrides' in overrides:
- SCons.Warnings.warn(SCons.Warnings.DeprecatedBuilderKeywordsWarning,
- "The \"overrides\" keyword to Builder() creation has been deprecated;\n" +\
- "\tspecify the items as keyword arguments to the Builder() call instead.")
- overrides.update(overrides['overrides'])
- del overrides['overrides']
- if 'scanner' in overrides:
- SCons.Warnings.warn(SCons.Warnings.DeprecatedBuilderKeywordsWarning,
- "The \"scanner\" keyword to Builder() creation has been deprecated;\n"
- "\tuse: source_scanner or target_scanner as appropriate.")
- del overrides['scanner']
- self.overrides = overrides
-
- self.set_suffix(suffix)
- self.set_src_suffix(src_suffix)
- self.ensure_suffix = ensure_suffix
-
- self.target_factory = target_factory
- self.source_factory = source_factory
- self.target_scanner = target_scanner
- self.source_scanner = source_scanner
-
- self.emitter = emitter
-
- # Optional Builder name should only be used for Builders
- # that don't get attached to construction environments.
- if name:
- self.name = name
- self.executor_kw = {}
- if not chdir is _null:
- self.executor_kw['chdir'] = chdir
- self.is_explicit = is_explicit
-
- if src_builder is None:
- src_builder = []
- elif not SCons.Util.is_List(src_builder):
- src_builder = [ src_builder ]
- self.src_builder = src_builder
-
- def __nonzero__(self):
- raise InternalError("Do not test for the Node.builder attribute directly; use Node.has_builder() instead")
-
- def get_name(self, env):
- """Attempts to get the name of the Builder.
-
- Look at the BUILDERS variable of env, expecting it to be a
- dictionary containing this Builder, and return the key of the
- dictionary. If there's no key, then return a directly-configured
- name (if there is one) or the name of the class (by default)."""
-
- try:
- index = list(env['BUILDERS'].values()).index(self)
- return list(env['BUILDERS'].keys())[index]
- except (AttributeError, KeyError, TypeError, ValueError):
- try:
- return self.name
- except AttributeError:
- return str(self.__class__)
-
- def __cmp__(self, other):
- return cmp(self.__dict__, other.__dict__)
-
- def splitext(self, path, env=None):
- if not env:
- env = self.env
- if env:
- suffixes = self.src_suffixes(env)
- else:
- suffixes = []
- return match_splitext(path, suffixes)
-
- def _adjustixes(self, files, pre, suf, ensure_suffix=False):
- if not files:
- return []
- result = []
- if not SCons.Util.is_List(files):
- files = [files]
-
- for f in files:
- if SCons.Util.is_String(f):
- f = SCons.Util.adjustixes(f, pre, suf, ensure_suffix)
- result.append(f)
- return result
-
- def _create_nodes(self, env, target = None, source = None):
- """Create and return lists of target and source nodes.
- """
- src_suf = self.get_src_suffix(env)
-
- target_factory = env.get_factory(self.target_factory)
- source_factory = env.get_factory(self.source_factory)
-
- source = self._adjustixes(source, None, src_suf)
- slist = env.arg2nodes(source, source_factory)
-
- pre = self.get_prefix(env, slist)
- suf = self.get_suffix(env, slist)
-
- if target is None:
- try:
- t_from_s = slist[0].target_from_source
- except AttributeError:
- raise UserError("Do not know how to create a target from source `%s'" % slist[0])
- except IndexError:
- tlist = []
- else:
- splitext = lambda S: self.splitext(S,env)
- tlist = [ t_from_s(pre, suf, splitext) ]
- else:
- target = self._adjustixes(target, pre, suf, self.ensure_suffix)
- tlist = env.arg2nodes(target, target_factory, target=target, source=source)
-
- if self.emitter:
- # The emitter is going to do str(node), but because we're
- # being called *from* a builder invocation, the new targets
- # don't yet have a builder set on them and will look like
- # source files. Fool the emitter's str() calls by setting
- # up a temporary builder on the new targets.
- new_targets = []
- for t in tlist:
- if not t.is_derived():
- t.builder_set(self)
- new_targets.append(t)
-
- orig_tlist = tlist[:]
- orig_slist = slist[:]
-
- target, source = self.emitter(target=tlist, source=slist, env=env)
-
- # Now delete the temporary builders that we attached to any
- # new targets, so that _node_errors() doesn't do weird stuff
- # to them because it thinks they already have builders.
- for t in new_targets:
- if t.builder is self:
- # Only delete the temporary builder if the emitter
- # didn't change it on us.
- t.builder_set(None)
-
- # Have to call arg2nodes yet again, since it is legal for
- # emitters to spit out strings as well as Node instances.
- tlist = env.arg2nodes(target, target_factory,
- target=orig_tlist, source=orig_slist)
- slist = env.arg2nodes(source, source_factory,
- target=orig_tlist, source=orig_slist)
-
- return tlist, slist
-
- def _execute(self, env, target, source, overwarn={}, executor_kw={}):
- # We now assume that target and source are lists or None.
- if self.src_builder:
- source = self.src_builder_sources(env, source, overwarn)
-
- if self.single_source and len(source) > 1 and target is None:
- result = []
- if target is None: target = [None]*len(source)
- for tgt, src in zip(target, source):
- if not tgt is None: tgt = [tgt]
- if not src is None: src = [src]
- result.extend(self._execute(env, tgt, src, overwarn))
- return SCons.Node.NodeList(result)
-
- overwarn.warn()
-
- tlist, slist = self._create_nodes(env, target, source)
-
- # Check for errors with the specified target/source lists.
- _node_errors(self, env, tlist, slist)
-
- # The targets are fine, so find or make the appropriate Executor to
- # build this particular list of targets from this particular list of
- # sources.
-
- executor = None
- key = None
-
- if self.multi:
- try:
- executor = tlist[0].get_executor(create = 0)
- except (AttributeError, IndexError):
- pass
- else:
- executor.add_sources(slist)
-
- if executor is None:
- if not self.action:
- fmt = "Builder %s must have an action to build %s."
- raise UserError(fmt % (self.get_name(env or self.env),
- list(map(str,tlist))))
- key = self.action.batch_key(env or self.env, tlist, slist)
- if key:
- try:
- executor = SCons.Executor.GetBatchExecutor(key)
- except KeyError:
- pass
- else:
- executor.add_batch(tlist, slist)
-
- if executor is None:
- executor = SCons.Executor.Executor(self.action, env, [],
- tlist, slist, executor_kw)
- if key:
- SCons.Executor.AddBatchExecutor(key, executor)
-
- # Now set up the relevant information in the target Nodes themselves.
- for t in tlist:
- t.cwd = env.fs.getcwd()
- t.builder_set(self)
- t.env_set(env)
- t.add_source(slist)
- t.set_executor(executor)
- t.set_explicit(self.is_explicit)
-
- return SCons.Node.NodeList(tlist)
-
- def __call__(self, env, target=None, source=None, chdir=_null, **kw):
- # We now assume that target and source are lists or None.
- # The caller (typically Environment.BuilderWrapper) is
- # responsible for converting any scalar values to lists.
- if chdir is _null:
- ekw = self.executor_kw
- else:
- ekw = self.executor_kw.copy()
- ekw['chdir'] = chdir
- if kw:
- if 'srcdir' in kw:
- def prependDirIfRelative(f, srcdir=kw['srcdir']):
- import os.path
- if SCons.Util.is_String(f) and not os.path.isabs(f):
- f = os.path.join(srcdir, f)
- return f
- if not SCons.Util.is_List(source):
- source = [source]
- source = list(map(prependDirIfRelative, source))
- del kw['srcdir']
- if self.overrides:
- env_kw = self.overrides.copy()
- env_kw.update(kw)
- else:
- env_kw = kw
- else:
- env_kw = self.overrides
- env = env.Override(env_kw)
- return self._execute(env, target, source, OverrideWarner(kw), ekw)
-
- def adjust_suffix(self, suff):
- if suff and not suff[0] in [ '.', '_', '$' ]:
- return '.' + suff
- return suff
-
- def get_prefix(self, env, sources=[]):
- prefix = self.prefix
- if callable(prefix):
- prefix = prefix(env, sources)
- return env.subst(prefix)
-
- def set_suffix(self, suffix):
- if not callable(suffix):
- suffix = self.adjust_suffix(suffix)
- self.suffix = suffix
-
- def get_suffix(self, env, sources=[]):
- suffix = self.suffix
- if callable(suffix):
- suffix = suffix(env, sources)
- return env.subst(suffix)
-
- def set_src_suffix(self, src_suffix):
- if not src_suffix:
- src_suffix = []
- elif not SCons.Util.is_List(src_suffix):
- src_suffix = [ src_suffix ]
- self.src_suffix = [callable(suf) and suf or self.adjust_suffix(suf) for suf in src_suffix]
-
- def get_src_suffix(self, env):
- """Get the first src_suffix in the list of src_suffixes."""
- ret = self.src_suffixes(env)
- if not ret:
- return ''
- return ret[0]
-
- def add_emitter(self, suffix, emitter):
- """Add a suffix-emitter mapping to this Builder.
-
- This assumes that emitter has been initialized with an
- appropriate dictionary type, and will throw a TypeError if
- not, so the caller is responsible for knowing that this is an
- appropriate method to call for the Builder in question.
- """
- self.emitter[suffix] = emitter
-
- def add_src_builder(self, builder):
- """
- Add a new Builder to the list of src_builders.
-
- This requires wiping out cached values so that the computed
- lists of source suffixes get re-calculated.
- """
- self._memo = {}
- self.src_builder.append(builder)
-
- def _get_sdict(self, env):
- """
- Returns a dictionary mapping all of the source suffixes of all
- src_builders of this Builder to the underlying Builder that
- should be called first.
-
- This dictionary is used for each target specified, so we save a
- lot of extra computation by memoizing it for each construction
- environment.
-
- Note that this is re-computed each time, not cached, because there
- might be changes to one of our source Builders (or one of their
- source Builders, and so on, and so on...) that we can't "see."
-
- The underlying methods we call cache their computed values,
- though, so we hope repeatedly aggregating them into a dictionary
- like this won't be too big a hit. We may need to look for a
- better way to do this if performance data show this has turned
- into a significant bottleneck.
- """
- sdict = {}
- for bld in self.get_src_builders(env):
- for suf in bld.src_suffixes(env):
- sdict[suf] = bld
- return sdict
-
- def src_builder_sources(self, env, source, overwarn={}):
- sdict = self._get_sdict(env)
-
- src_suffixes = self.src_suffixes(env)
-
- lengths = list(set(map(len, src_suffixes)))
-
- def match_src_suffix(name, src_suffixes=src_suffixes, lengths=lengths):
- node_suffixes = [name[-l:] for l in lengths]
- for suf in src_suffixes:
- if suf in node_suffixes:
- return suf
- return None
-
- result = []
- for s in SCons.Util.flatten(source):
- if SCons.Util.is_String(s):
- match_suffix = match_src_suffix(env.subst(s))
- if not match_suffix and not '.' in s:
- src_suf = self.get_src_suffix(env)
- s = self._adjustixes(s, None, src_suf)[0]
- else:
- match_suffix = match_src_suffix(s.name)
- if match_suffix:
- try:
- bld = sdict[match_suffix]
- except KeyError:
- result.append(s)
- else:
- tlist = bld._execute(env, None, [s], overwarn)
- # If the subsidiary Builder returned more than one
- # target, then filter out any sources that this
- # Builder isn't capable of building.
- if len(tlist) > 1:
- tlist = [t for t in tlist if match_src_suffix(t.name)]
- result.extend(tlist)
- else:
- result.append(s)
-
- source_factory = env.get_factory(self.source_factory)
-
- return env.arg2nodes(result, source_factory)
-
- def _get_src_builders_key(self, env):
- return id(env)
-
- @SCons.Memoize.CountDictCall(_get_src_builders_key)
- def get_src_builders(self, env):
- """
- Returns the list of source Builders for this Builder.
-
- This exists mainly to look up Builders referenced as
- strings in the 'BUILDER' variable of the construction
- environment and cache the result.
- """
- memo_key = id(env)
- try:
- memo_dict = self._memo['get_src_builders']
- except KeyError:
- memo_dict = {}
- self._memo['get_src_builders'] = memo_dict
- else:
- try:
- return memo_dict[memo_key]
- except KeyError:
- pass
-
- builders = []
- for bld in self.src_builder:
- if SCons.Util.is_String(bld):
- try:
- bld = env['BUILDERS'][bld]
- except KeyError:
- continue
- builders.append(bld)
-
- memo_dict[memo_key] = builders
- return builders
-
- def _subst_src_suffixes_key(self, env):
- return id(env)
-
- @SCons.Memoize.CountDictCall(_subst_src_suffixes_key)
- def subst_src_suffixes(self, env):
- """
- The suffix list may contain construction variable expansions,
- so we have to evaluate the individual strings. To avoid doing
- this over and over, we memoize the results for each construction
- environment.
- """
- memo_key = id(env)
- try:
- memo_dict = self._memo['subst_src_suffixes']
- except KeyError:
- memo_dict = {}
- self._memo['subst_src_suffixes'] = memo_dict
- else:
- try:
- return memo_dict[memo_key]
- except KeyError:
- pass
- suffixes = [env.subst(x) for x in self.src_suffix]
- memo_dict[memo_key] = suffixes
- return suffixes
-
- def src_suffixes(self, env):
- """
- Returns the list of source suffixes for all src_builders of this
- Builder.
-
- This is essentially a recursive descent of the src_builder "tree."
- (This value isn't cached because there may be changes in a
- src_builder many levels deep that we can't see.)
- """
- sdict = {}
- suffixes = self.subst_src_suffixes(env)
- for s in suffixes:
- sdict[s] = 1
- for builder in self.get_src_builders(env):
- for s in builder.src_suffixes(env):
- if s not in sdict:
- sdict[s] = 1
- suffixes.append(s)
- return suffixes
-
-class CompositeBuilder(SCons.Util.Proxy):
- """A Builder Proxy whose main purpose is to always have
- a DictCmdGenerator as its action, and to provide access
- to the DictCmdGenerator's add_action() method.
- """
-
- def __init__(self, builder, cmdgen):
- if SCons.Debug.track_instances: logInstanceCreation(self, 'Builder.CompositeBuilder')
- SCons.Util.Proxy.__init__(self, builder)
-
- # cmdgen should always be an instance of DictCmdGenerator.
- self.cmdgen = cmdgen
- self.builder = builder
-
- __call__ = SCons.Util.Delegate('__call__')
-
- def add_action(self, suffix, action):
- self.cmdgen.add_action(suffix, action)
- self.set_src_suffix(self.cmdgen.src_suffixes())
-
-def is_a_Builder(obj):
- """"Returns True if the specified obj is one of our Builder classes.
-
- The test is complicated a bit by the fact that CompositeBuilder
- is a proxy, not a subclass of BuilderBase.
- """
- return (isinstance(obj, BuilderBase)
- or isinstance(obj, CompositeBuilder)
- or callable(obj))
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/CacheDir.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/CacheDir.py
deleted file mode 100644
index 9e3ec6b..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/CacheDir.py
+++ /dev/null
@@ -1,222 +0,0 @@
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-
-__revision__ = "src/engine/SCons/CacheDir.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-__doc__ = """
-CacheDir support
-"""
-
-import os.path
-import stat
-import sys
-
-import SCons.Action
-
-cache_enabled = True
-cache_debug = False
-cache_force = False
-cache_show = False
-cache_readonly = False
-
-def CacheRetrieveFunc(target, source, env):
- t = target[0]
- fs = t.fs
- cd = env.get_CacheDir()
- cachedir, cachefile = cd.cachepath(t)
- if not fs.exists(cachefile):
- cd.CacheDebug('CacheRetrieve(%s): %s not in cache\n', t, cachefile)
- return 1
- cd.CacheDebug('CacheRetrieve(%s): retrieving from %s\n', t, cachefile)
- if SCons.Action.execute_actions:
- if fs.islink(cachefile):
- fs.symlink(fs.readlink(cachefile), t.get_internal_path())
- else:
- env.copy_from_cache(cachefile, t.get_internal_path())
- st = fs.stat(cachefile)
- fs.chmod(t.get_internal_path(), stat.S_IMODE(st[stat.ST_MODE]) | stat.S_IWRITE)
- return 0
-
-def CacheRetrieveString(target, source, env):
- t = target[0]
- fs = t.fs
- cd = env.get_CacheDir()
- cachedir, cachefile = cd.cachepath(t)
- if t.fs.exists(cachefile):
- return "Retrieved `%s' from cache" % t.get_internal_path()
- return None
-
-CacheRetrieve = SCons.Action.Action(CacheRetrieveFunc, CacheRetrieveString)
-
-CacheRetrieveSilent = SCons.Action.Action(CacheRetrieveFunc, None)
-
-def CachePushFunc(target, source, env):
- if cache_readonly: return
-
- t = target[0]
- if t.nocache:
- return
- fs = t.fs
- cd = env.get_CacheDir()
- cachedir, cachefile = cd.cachepath(t)
- if fs.exists(cachefile):
- # Don't bother copying it if it's already there. Note that
- # usually this "shouldn't happen" because if the file already
- # existed in cache, we'd have retrieved the file from there,
- # not built it. This can happen, though, in a race, if some
- # other person running the same build pushes their copy to
- # the cache after we decide we need to build it but before our
- # build completes.
- cd.CacheDebug('CachePush(%s): %s already exists in cache\n', t, cachefile)
- return
-
- cd.CacheDebug('CachePush(%s): pushing to %s\n', t, cachefile)
-
- tempfile = cachefile+'.tmp'+str(os.getpid())
- errfmt = "Unable to copy %s to cache. Cache file is %s"
-
- if not fs.isdir(cachedir):
- try:
- fs.makedirs(cachedir)
- except EnvironmentError:
- # We may have received an exception because another process
- # has beaten us creating the directory.
- if not fs.isdir(cachedir):
- msg = errfmt % (str(target), cachefile)
- raise SCons.Errors.EnvironmentError(msg)
-
- try:
- if fs.islink(t.get_internal_path()):
- fs.symlink(fs.readlink(t.get_internal_path()), tempfile)
- else:
- fs.copy2(t.get_internal_path(), tempfile)
- fs.rename(tempfile, cachefile)
- st = fs.stat(t.get_internal_path())
- fs.chmod(cachefile, stat.S_IMODE(st[stat.ST_MODE]) | stat.S_IWRITE)
- except EnvironmentError:
- # It's possible someone else tried writing the file at the
- # same time we did, or else that there was some problem like
- # the CacheDir being on a separate file system that's full.
- # In any case, inability to push a file to cache doesn't affect
- # the correctness of the build, so just print a warning.
- msg = errfmt % (str(target), cachefile)
- SCons.Warnings.warn(SCons.Warnings.CacheWriteErrorWarning, msg)
-
-CachePush = SCons.Action.Action(CachePushFunc, None)
-
-class CacheDir(object):
-
- def __init__(self, path):
- try:
- import hashlib
- except ImportError:
- msg = "No hashlib or MD5 module available, CacheDir() not supported"
- SCons.Warnings.warn(SCons.Warnings.NoMD5ModuleWarning, msg)
- self.path = None
- else:
- self.path = path
- self.current_cache_debug = None
- self.debugFP = None
-
- def CacheDebug(self, fmt, target, cachefile):
- if cache_debug != self.current_cache_debug:
- if cache_debug == '-':
- self.debugFP = sys.stdout
- elif cache_debug:
- self.debugFP = open(cache_debug, 'w')
- else:
- self.debugFP = None
- self.current_cache_debug = cache_debug
- if self.debugFP:
- self.debugFP.write(fmt % (target, os.path.split(cachefile)[1]))
-
- def is_enabled(self):
- return (cache_enabled and not self.path is None)
-
- def is_readonly(self):
- return cache_readonly
-
- def cachepath(self, node):
- """
- """
- if not self.is_enabled():
- return None, None
-
- sig = node.get_cachedir_bsig()
- subdir = sig[0].upper()
- dir = os.path.join(self.path, subdir)
- return dir, os.path.join(dir, sig)
-
- def retrieve(self, node):
- """
- This method is called from multiple threads in a parallel build,
- so only do thread safe stuff here. Do thread unsafe stuff in
- built().
-
- Note that there's a special trick here with the execute flag
- (one that's not normally done for other actions). Basically
- if the user requested a no_exec (-n) build, then
- SCons.Action.execute_actions is set to 0 and when any action
- is called, it does its showing but then just returns zero
- instead of actually calling the action execution operation.
- The problem for caching is that if the file does NOT exist in
- cache then the CacheRetrieveString won't return anything to
- show for the task, but the Action.__call__ won't call
- CacheRetrieveFunc; instead it just returns zero, which makes
- the code below think that the file *was* successfully
- retrieved from the cache, therefore it doesn't do any
- subsequent building. However, the CacheRetrieveString didn't
- print anything because it didn't actually exist in the cache,
- and no more build actions will be performed, so the user just
- sees nothing. The fix is to tell Action.__call__ to always
- execute the CacheRetrieveFunc and then have the latter
- explicitly check SCons.Action.execute_actions itself.
- """
- if not self.is_enabled():
- return False
-
- env = node.get_build_env()
- if cache_show:
- if CacheRetrieveSilent(node, [], env, execute=1) == 0:
- node.build(presub=0, execute=0)
- return True
- else:
- if CacheRetrieve(node, [], env, execute=1) == 0:
- return True
-
- return False
-
- def push(self, node):
- if self.is_readonly() or not self.is_enabled():
- return
- return CachePush(node, [], node.get_build_env())
-
- def push_if_forced(self, node):
- if cache_force:
- return self.push(node)
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Conftest.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Conftest.py
deleted file mode 100644
index e9702ff..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Conftest.py
+++ /dev/null
@@ -1,793 +0,0 @@
-"""SCons.Conftest
-
-Autoconf-like configuration support; low level implementation of tests.
-"""
-
-#
-# Copyright (c) 2003 Stichting NLnet Labs
-# Copyright (c) 2001, 2002, 2003 Steven Knight
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-
-#
-# The purpose of this module is to define how a check is to be performed.
-# Use one of the Check...() functions below.
-#
-
-#
-# A context class is used that defines functions for carrying out the tests,
-# logging and messages. The following methods and members must be present:
-#
-# context.Display(msg) Function called to print messages that are normally
-# displayed for the user. Newlines are explicitly used.
-# The text should also be written to the logfile!
-#
-# context.Log(msg) Function called to write to a log file.
-#
-# context.BuildProg(text, ext)
-# Function called to build a program, using "ext" for the
-# file extention. Must return an empty string for
-# success, an error message for failure.
-# For reliable test results building should be done just
-# like an actual program would be build, using the same
-# command and arguments (including configure results so
-# far).
-#
-# context.CompileProg(text, ext)
-# Function called to compile a program, using "ext" for
-# the file extention. Must return an empty string for
-# success, an error message for failure.
-# For reliable test results compiling should be done just
-# like an actual source file would be compiled, using the
-# same command and arguments (including configure results
-# so far).
-#
-# context.AppendLIBS(lib_name_list)
-# Append "lib_name_list" to the value of LIBS.
-# "lib_namelist" is a list of strings.
-# Return the value of LIBS before changing it (any type
-# can be used, it is passed to SetLIBS() later.)
-#
-# context.PrependLIBS(lib_name_list)
-# Prepend "lib_name_list" to the value of LIBS.
-# "lib_namelist" is a list of strings.
-# Return the value of LIBS before changing it (any type
-# can be used, it is passed to SetLIBS() later.)
-#
-# context.SetLIBS(value)
-# Set LIBS to "value". The type of "value" is what
-# AppendLIBS() returned.
-# Return the value of LIBS before changing it (any type
-# can be used, it is passed to SetLIBS() later.)
-#
-# context.headerfilename
-# Name of file to append configure results to, usually
-# "confdefs.h".
-# The file must not exist or be empty when starting.
-# Empty or None to skip this (some tests will not work!).
-#
-# context.config_h (may be missing). If present, must be a string, which
-# will be filled with the contents of a config_h file.
-#
-# context.vardict Dictionary holding variables used for the tests and
-# stores results from the tests, used for the build
-# commands.
-# Normally contains "CC", "LIBS", "CPPFLAGS", etc.
-#
-# context.havedict Dictionary holding results from the tests that are to
-# be used inside a program.
-# Names often start with "HAVE_". These are zero
-# (feature not present) or one (feature present). Other
-# variables may have any value, e.g., "PERLVERSION" can
-# be a number and "SYSTEMNAME" a string.
-#
-
-import re
-from types import IntType
-
-#
-# PUBLIC VARIABLES
-#
-
-LogInputFiles = 1 # Set that to log the input files in case of a failed test
-LogErrorMessages = 1 # Set that to log Conftest-generated error messages
-
-#
-# PUBLIC FUNCTIONS
-#
-
-# Generic remarks:
-# - When a language is specified which is not supported the test fails. The
-# message is a bit different, because not all the arguments for the normal
-# message are available yet (chicken-egg problem).
-
-
-def CheckBuilder(context, text = None, language = None):
- """
- Configure check to see if the compiler works.
- Note that this uses the current value of compiler and linker flags, make
- sure $CFLAGS, $CPPFLAGS and $LIBS are set correctly.
- "language" should be "C" or "C++" and is used to select the compiler.
- Default is "C".
- "text" may be used to specify the code to be build.
- Returns an empty string for success, an error message for failure.
- """
- lang, suffix, msg = _lang2suffix(language)
- if msg:
- context.Display("%s\n" % msg)
- return msg
-
- if not text:
- text = """
-int main() {
- return 0;
-}
-"""
-
- context.Display("Checking if building a %s file works... " % lang)
- ret = context.BuildProg(text, suffix)
- _YesNoResult(context, ret, None, text)
- return ret
-
-def CheckCC(context):
- """
- Configure check for a working C compiler.
-
- This checks whether the C compiler, as defined in the $CC construction
- variable, can compile a C source file. It uses the current $CCCOM value
- too, so that it can test against non working flags.
-
- """
- context.Display("Checking whether the C compiler works... ")
- text = """
-int main()
-{
- return 0;
-}
-"""
- ret = _check_empty_program(context, 'CC', text, 'C')
- _YesNoResult(context, ret, None, text)
- return ret
-
-def CheckSHCC(context):
- """
- Configure check for a working shared C compiler.
-
- This checks whether the C compiler, as defined in the $SHCC construction
- variable, can compile a C source file. It uses the current $SHCCCOM value
- too, so that it can test against non working flags.
-
- """
- context.Display("Checking whether the (shared) C compiler works... ")
- text = """
-int foo()
-{
- return 0;
-}
-"""
- ret = _check_empty_program(context, 'SHCC', text, 'C', use_shared = True)
- _YesNoResult(context, ret, None, text)
- return ret
-
-def CheckCXX(context):
- """
- Configure check for a working CXX compiler.
-
- This checks whether the CXX compiler, as defined in the $CXX construction
- variable, can compile a CXX source file. It uses the current $CXXCOM value
- too, so that it can test against non working flags.
-
- """
- context.Display("Checking whether the C++ compiler works... ")
- text = """
-int main()
-{
- return 0;
-}
-"""
- ret = _check_empty_program(context, 'CXX', text, 'C++')
- _YesNoResult(context, ret, None, text)
- return ret
-
-def CheckSHCXX(context):
- """
- Configure check for a working shared CXX compiler.
-
- This checks whether the CXX compiler, as defined in the $SHCXX construction
- variable, can compile a CXX source file. It uses the current $SHCXXCOM value
- too, so that it can test against non working flags.
-
- """
- context.Display("Checking whether the (shared) C++ compiler works... ")
- text = """
-int main()
-{
- return 0;
-}
-"""
- ret = _check_empty_program(context, 'SHCXX', text, 'C++', use_shared = True)
- _YesNoResult(context, ret, None, text)
- return ret
-
-def _check_empty_program(context, comp, text, language, use_shared = False):
- """Return 0 on success, 1 otherwise."""
- if comp not in context.env or not context.env[comp]:
- # The compiler construction variable is not set or empty
- return 1
-
- lang, suffix, msg = _lang2suffix(language)
- if msg:
- return 1
-
- if use_shared:
- return context.CompileSharedObject(text, suffix)
- else:
- return context.CompileProg(text, suffix)
-
-
-def CheckFunc(context, function_name, header = None, language = None):
- """
- Configure check for a function "function_name".
- "language" should be "C" or "C++" and is used to select the compiler.
- Default is "C".
- Optional "header" can be defined to define a function prototype, include a
- header file or anything else that comes before main().
- Sets HAVE_function_name in context.havedict according to the result.
- Note that this uses the current value of compiler and linker flags, make
- sure $CFLAGS, $CPPFLAGS and $LIBS are set correctly.
- Returns an empty string for success, an error message for failure.
- """
-
- # Remarks from autoconf:
- # - Don't include <ctype.h> because on OSF/1 3.0 it includes <sys/types.h>
- # which includes <sys/select.h> which contains a prototype for select.
- # Similarly for bzero.
- # - assert.h is included to define __stub macros and hopefully few
- # prototypes, which can conflict with char $1(); below.
- # - Override any gcc2 internal prototype to avoid an error.
- # - We use char for the function declaration because int might match the
- # return type of a gcc2 builtin and then its argument prototype would
- # still apply.
- # - The GNU C library defines this for functions which it implements to
- # always fail with ENOSYS. Some functions are actually named something
- # starting with __ and the normal name is an alias.
-
- if context.headerfilename:
- includetext = '#include "%s"' % context.headerfilename
- else:
- includetext = ''
- if not header:
- header = """
-#ifdef __cplusplus
-extern "C"
-#endif
-char %s();""" % function_name
-
- lang, suffix, msg = _lang2suffix(language)
- if msg:
- context.Display("Cannot check for %s(): %s\n" % (function_name, msg))
- return msg
-
- text = """
-%(include)s
-#include <assert.h>
-%(hdr)s
-
-int main() {
-#if defined (__stub_%(name)s) || defined (__stub___%(name)s)
- fail fail fail
-#else
- %(name)s();
-#endif
-
- return 0;
-}
-""" % { 'name': function_name,
- 'include': includetext,
- 'hdr': header }
-
- context.Display("Checking for %s function %s()... " % (lang, function_name))
- ret = context.BuildProg(text, suffix)
- _YesNoResult(context, ret, "HAVE_" + function_name, text,
- "Define to 1 if the system has the function `%s'." %\
- function_name)
- return ret
-
-
-def CheckHeader(context, header_name, header = None, language = None,
- include_quotes = None):
- """
- Configure check for a C or C++ header file "header_name".
- Optional "header" can be defined to do something before including the
- header file (unusual, supported for consistency).
- "language" should be "C" or "C++" and is used to select the compiler.
- Default is "C".
- Sets HAVE_header_name in context.havedict according to the result.
- Note that this uses the current value of compiler and linker flags, make
- sure $CFLAGS and $CPPFLAGS are set correctly.
- Returns an empty string for success, an error message for failure.
- """
- # Why compile the program instead of just running the preprocessor?
- # It is possible that the header file exists, but actually using it may
- # fail (e.g., because it depends on other header files). Thus this test is
- # more strict. It may require using the "header" argument.
- #
- # Use <> by default, because the check is normally used for system header
- # files. SCons passes '""' to overrule this.
-
- # Include "confdefs.h" first, so that the header can use HAVE_HEADER_H.
- if context.headerfilename:
- includetext = '#include "%s"\n' % context.headerfilename
- else:
- includetext = ''
- if not header:
- header = ""
-
- lang, suffix, msg = _lang2suffix(language)
- if msg:
- context.Display("Cannot check for header file %s: %s\n"
- % (header_name, msg))
- return msg
-
- if not include_quotes:
- include_quotes = "<>"
-
- text = "%s%s\n#include %s%s%s\n\n" % (includetext, header,
- include_quotes[0], header_name, include_quotes[1])
-
- context.Display("Checking for %s header file %s... " % (lang, header_name))
- ret = context.CompileProg(text, suffix)
- _YesNoResult(context, ret, "HAVE_" + header_name, text,
- "Define to 1 if you have the <%s> header file." % header_name)
- return ret
-
-
-def CheckType(context, type_name, fallback = None,
- header = None, language = None):
- """
- Configure check for a C or C++ type "type_name".
- Optional "header" can be defined to include a header file.
- "language" should be "C" or "C++" and is used to select the compiler.
- Default is "C".
- Sets HAVE_type_name in context.havedict according to the result.
- Note that this uses the current value of compiler and linker flags, make
- sure $CFLAGS, $CPPFLAGS and $LIBS are set correctly.
- Returns an empty string for success, an error message for failure.
- """
-
- # Include "confdefs.h" first, so that the header can use HAVE_HEADER_H.
- if context.headerfilename:
- includetext = '#include "%s"' % context.headerfilename
- else:
- includetext = ''
- if not header:
- header = ""
-
- lang, suffix, msg = _lang2suffix(language)
- if msg:
- context.Display("Cannot check for %s type: %s\n" % (type_name, msg))
- return msg
-
- # Remarks from autoconf about this test:
- # - Grepping for the type in include files is not reliable (grep isn't
- # portable anyway).
- # - Using "TYPE my_var;" doesn't work for const qualified types in C++.
- # Adding an initializer is not valid for some C++ classes.
- # - Using the type as parameter to a function either fails for K&$ C or for
- # C++.
- # - Using "TYPE *my_var;" is valid in C for some types that are not
- # declared (struct something).
- # - Using "sizeof(TYPE)" is valid when TYPE is actually a variable.
- # - Using the previous two together works reliably.
- text = """
-%(include)s
-%(header)s
-
-int main() {
- if ((%(name)s *) 0)
- return 0;
- if (sizeof (%(name)s))
- return 0;
-}
-""" % { 'include': includetext,
- 'header': header,
- 'name': type_name }
-
- context.Display("Checking for %s type %s... " % (lang, type_name))
- ret = context.BuildProg(text, suffix)
- _YesNoResult(context, ret, "HAVE_" + type_name, text,
- "Define to 1 if the system has the type `%s'." % type_name)
- if ret and fallback and context.headerfilename:
- f = open(context.headerfilename, "a")
- f.write("typedef %s %s;\n" % (fallback, type_name))
- f.close()
-
- return ret
-
-def CheckTypeSize(context, type_name, header = None, language = None, expect = None):
- """This check can be used to get the size of a given type, or to check whether
- the type is of expected size.
-
- Arguments:
- - type : str
- the type to check
- - includes : sequence
- list of headers to include in the test code before testing the type
- - language : str
- 'C' or 'C++'
- - expect : int
- if given, will test wether the type has the given number of bytes.
- If not given, will automatically find the size.
-
- Returns:
- status : int
- 0 if the check failed, or the found size of the type if the check succeeded."""
-
- # Include "confdefs.h" first, so that the header can use HAVE_HEADER_H.
- if context.headerfilename:
- includetext = '#include "%s"' % context.headerfilename
- else:
- includetext = ''
-
- if not header:
- header = ""
-
- lang, suffix, msg = _lang2suffix(language)
- if msg:
- context.Display("Cannot check for %s type: %s\n" % (type_name, msg))
- return msg
-
- src = includetext + header
- if not expect is None:
- # Only check if the given size is the right one
- context.Display('Checking %s is %d bytes... ' % (type_name, expect))
-
- # test code taken from autoconf: this is a pretty clever hack to find that
- # a type is of a given size using only compilation. This speeds things up
- # quite a bit compared to straightforward code using TryRun
- src = src + r"""
-typedef %s scons_check_type;
-
-int main()
-{
- static int test_array[1 - 2 * !(((long int) (sizeof(scons_check_type))) == %d)];
- test_array[0] = 0;
-
- return 0;
-}
-"""
-
- st = context.CompileProg(src % (type_name, expect), suffix)
- if not st:
- context.Display("yes\n")
- _Have(context, "SIZEOF_%s" % type_name, expect,
- "The size of `%s', as computed by sizeof." % type_name)
- return expect
- else:
- context.Display("no\n")
- _LogFailed(context, src, st)
- return 0
- else:
- # Only check if the given size is the right one
- context.Message('Checking size of %s ... ' % type_name)
-
- # We have to be careful with the program we wish to test here since
- # compilation will be attempted using the current environment's flags.
- # So make sure that the program will compile without any warning. For
- # example using: 'int main(int argc, char** argv)' will fail with the
- # '-Wall -Werror' flags since the variables argc and argv would not be
- # used in the program...
- #
- src = src + """
-#include <stdlib.h>
-#include <stdio.h>
-int main() {
- printf("%d", (int)sizeof(""" + type_name + """));
- return 0;
-}
- """
- st, out = context.RunProg(src, suffix)
- try:
- size = int(out)
- except ValueError:
- # If cannot convert output of test prog to an integer (the size),
- # something went wront, so just fail
- st = 1
- size = 0
-
- if not st:
- context.Display("yes\n")
- _Have(context, "SIZEOF_%s" % type_name, size,
- "The size of `%s', as computed by sizeof." % type_name)
- return size
- else:
- context.Display("no\n")
- _LogFailed(context, src, st)
- return 0
-
- return 0
-
-def CheckDeclaration(context, symbol, includes = None, language = None):
- """Checks whether symbol is declared.
-
- Use the same test as autoconf, that is test whether the symbol is defined
- as a macro or can be used as an r-value.
-
- Arguments:
- symbol : str
- the symbol to check
- includes : str
- Optional "header" can be defined to include a header file.
- language : str
- only C and C++ supported.
-
- Returns:
- status : bool
- True if the check failed, False if succeeded."""
-
- # Include "confdefs.h" first, so that the header can use HAVE_HEADER_H.
- if context.headerfilename:
- includetext = '#include "%s"' % context.headerfilename
- else:
- includetext = ''
-
- if not includes:
- includes = ""
-
- lang, suffix, msg = _lang2suffix(language)
- if msg:
- context.Display("Cannot check for declaration %s: %s\n" % (symbol, msg))
- return msg
-
- src = includetext + includes
- context.Display('Checking whether %s is declared... ' % symbol)
-
- src = src + r"""
-int main()
-{
-#ifndef %s
- (void) %s;
-#endif
- ;
- return 0;
-}
-""" % (symbol, symbol)
-
- st = context.CompileProg(src, suffix)
- _YesNoResult(context, st, "HAVE_DECL_" + symbol, src,
- "Set to 1 if %s is defined." % symbol)
- return st
-
-def CheckLib(context, libs, func_name = None, header = None,
- extra_libs = None, call = None, language = None, autoadd = 1,
- append = True):
- """
- Configure check for a C or C++ libraries "libs". Searches through
- the list of libraries, until one is found where the test succeeds.
- Tests if "func_name" or "call" exists in the library. Note: if it exists
- in another library the test succeeds anyway!
- Optional "header" can be defined to include a header file. If not given a
- default prototype for "func_name" is added.
- Optional "extra_libs" is a list of library names to be added after
- "lib_name" in the build command. To be used for libraries that "lib_name"
- depends on.
- Optional "call" replaces the call to "func_name" in the test code. It must
- consist of complete C statements, including a trailing ";".
- Both "func_name" and "call" arguments are optional, and in that case, just
- linking against the libs is tested.
- "language" should be "C" or "C++" and is used to select the compiler.
- Default is "C".
- Note that this uses the current value of compiler and linker flags, make
- sure $CFLAGS, $CPPFLAGS and $LIBS are set correctly.
- Returns an empty string for success, an error message for failure.
- """
- # Include "confdefs.h" first, so that the header can use HAVE_HEADER_H.
- if context.headerfilename:
- includetext = '#include "%s"' % context.headerfilename
- else:
- includetext = ''
- if not header:
- header = ""
-
- text = """
-%s
-%s""" % (includetext, header)
-
- # Add a function declaration if needed.
- if func_name and func_name != "main":
- if not header:
- text = text + """
-#ifdef __cplusplus
-extern "C"
-#endif
-char %s();
-""" % func_name
-
- # The actual test code.
- if not call:
- call = "%s();" % func_name
-
- # if no function to test, leave main() blank
- text = text + """
-int
-main() {
- %s
-return 0;
-}
-""" % (call or "")
-
- if call:
- i = call.find("\n")
- if i > 0:
- calltext = call[:i] + ".."
- elif call[-1] == ';':
- calltext = call[:-1]
- else:
- calltext = call
-
- for lib_name in libs:
-
- lang, suffix, msg = _lang2suffix(language)
- if msg:
- context.Display("Cannot check for library %s: %s\n" % (lib_name, msg))
- return msg
-
- # if a function was specified to run in main(), say it
- if call:
- context.Display("Checking for %s in %s library %s... "
- % (calltext, lang, lib_name))
- # otherwise, just say the name of library and language
- else:
- context.Display("Checking for %s library %s... "
- % (lang, lib_name))
-
- if lib_name:
- l = [ lib_name ]
- if extra_libs:
- l.extend(extra_libs)
- if append:
- oldLIBS = context.AppendLIBS(l)
- else:
- oldLIBS = context.PrependLIBS(l)
- sym = "HAVE_LIB" + lib_name
- else:
- oldLIBS = -1
- sym = None
-
- ret = context.BuildProg(text, suffix)
-
- _YesNoResult(context, ret, sym, text,
- "Define to 1 if you have the `%s' library." % lib_name)
- if oldLIBS != -1 and (ret or not autoadd):
- context.SetLIBS(oldLIBS)
-
- if not ret:
- return ret
-
- return ret
-
-#
-# END OF PUBLIC FUNCTIONS
-#
-
-def _YesNoResult(context, ret, key, text, comment = None):
- """
- Handle the result of a test with a "yes" or "no" result.
- "ret" is the return value: empty if OK, error message when not.
- "key" is the name of the symbol to be defined (HAVE_foo).
- "text" is the source code of the program used for testing.
- "comment" is the C comment to add above the line defining the symbol (the
- comment is automatically put inside a /* */). If None, no comment is added.
- """
- if key:
- _Have(context, key, not ret, comment)
- if ret:
- context.Display("no\n")
- _LogFailed(context, text, ret)
- else:
- context.Display("yes\n")
-
-
-def _Have(context, key, have, comment = None):
- """
- Store result of a test in context.havedict and context.headerfilename.
- "key" is a "HAVE_abc" name. It is turned into all CAPITALS and non-
- alphanumerics are replaced by an underscore.
- The value of "have" can be:
- 1 - Feature is defined, add "#define key".
- 0 - Feature is not defined, add "/* #undef key */".
- Adding "undef" is what autoconf does. Not useful for the
- compiler, but it shows that the test was done.
- number - Feature is defined to this number "#define key have".
- Doesn't work for 0 or 1, use a string then.
- string - Feature is defined to this string "#define key have".
- Give "have" as is should appear in the header file, include quotes
- when desired and escape special characters!
- """
- key_up = key.upper()
- key_up = re.sub('[^A-Z0-9_]', '_', key_up)
- context.havedict[key_up] = have
- if have == 1:
- line = "#define %s 1\n" % key_up
- elif have == 0:
- line = "/* #undef %s */\n" % key_up
- elif isinstance(have, IntType):
- line = "#define %s %d\n" % (key_up, have)
- else:
- line = "#define %s %s\n" % (key_up, str(have))
-
- if comment is not None:
- lines = "\n/* %s */\n" % comment + line
- else:
- lines = "\n" + line
-
- if context.headerfilename:
- f = open(context.headerfilename, "a")
- f.write(lines)
- f.close()
- elif hasattr(context,'config_h'):
- context.config_h = context.config_h + lines
-
-
-def _LogFailed(context, text, msg):
- """
- Write to the log about a failed program.
- Add line numbers, so that error messages can be understood.
- """
- if LogInputFiles:
- context.Log("Failed program was:\n")
- lines = text.split('\n')
- if len(lines) and lines[-1] == '':
- lines = lines[:-1] # remove trailing empty line
- n = 1
- for line in lines:
- context.Log("%d: %s\n" % (n, line))
- n = n + 1
- if LogErrorMessages:
- context.Log("Error message: %s\n" % msg)
-
-
-def _lang2suffix(lang):
- """
- Convert a language name to a suffix.
- When "lang" is empty or None C is assumed.
- Returns a tuple (lang, suffix, None) when it works.
- For an unrecognized language returns (None, None, msg).
- Where:
- lang = the unified language name
- suffix = the suffix, including the leading dot
- msg = an error message
- """
- if not lang or lang in ["C", "c"]:
- return ("C", ".c", None)
- if lang in ["c++", "C++", "cpp", "CXX", "cxx"]:
- return ("C++", ".cpp", None)
-
- return None, None, "Unsupported language: %s" % lang
-
-
-# vim: set sw=4 et sts=4 tw=79 fo+=l:
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Debug.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Debug.py
deleted file mode 100644
index 0aa077d..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Debug.py
+++ /dev/null
@@ -1,234 +0,0 @@
-"""SCons.Debug
-
-Code for debugging SCons internal things. Shouldn't be
-needed by most users.
-
-"""
-
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-
-__revision__ = "src/engine/SCons/Debug.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-import os
-import sys
-import time
-import weakref
-import inspect
-
-# Global variable that gets set to 'True' by the Main script,
-# when the creation of class instances should get tracked.
-track_instances = False
-# List of currently tracked classes
-tracked_classes = {}
-
-def logInstanceCreation(instance, name=None):
- if name is None:
- name = instance.__class__.__name__
- if name not in tracked_classes:
- tracked_classes[name] = []
- if hasattr(instance, '__dict__'):
- tracked_classes[name].append(weakref.ref(instance))
- else:
- # weakref doesn't seem to work when the instance
- # contains only slots...
- tracked_classes[name].append(instance)
-
-def string_to_classes(s):
- if s == '*':
- return sorted(tracked_classes.keys())
- else:
- return s.split()
-
-def fetchLoggedInstances(classes="*"):
- classnames = string_to_classes(classes)
- return [(cn, len(tracked_classes[cn])) for cn in classnames]
-
-def countLoggedInstances(classes, file=sys.stdout):
- for classname in string_to_classes(classes):
- file.write("%s: %d\n" % (classname, len(tracked_classes[classname])))
-
-def listLoggedInstances(classes, file=sys.stdout):
- for classname in string_to_classes(classes):
- file.write('\n%s:\n' % classname)
- for ref in tracked_classes[classname]:
- if inspect.isclass(ref):
- obj = ref()
- else:
- obj = ref
- if obj is not None:
- file.write(' %s\n' % repr(obj))
-
-def dumpLoggedInstances(classes, file=sys.stdout):
- for classname in string_to_classes(classes):
- file.write('\n%s:\n' % classname)
- for ref in tracked_classes[classname]:
- obj = ref()
- if obj is not None:
- file.write(' %s:\n' % obj)
- for key, value in obj.__dict__.items():
- file.write(' %20s : %s\n' % (key, value))
-
-
-
-if sys.platform[:5] == "linux":
- # Linux doesn't actually support memory usage stats from getrusage().
- def memory():
- mstr = open('/proc/self/stat').read()
- mstr = mstr.split()[22]
- return int(mstr)
-elif sys.platform[:6] == 'darwin':
- #TODO really get memory stats for OS X
- def memory():
- return 0
-else:
- try:
- import resource
- except ImportError:
- try:
- import win32process
- import win32api
- except ImportError:
- def memory():
- return 0
- else:
- def memory():
- process_handle = win32api.GetCurrentProcess()
- memory_info = win32process.GetProcessMemoryInfo( process_handle )
- return memory_info['PeakWorkingSetSize']
- else:
- def memory():
- res = resource.getrusage(resource.RUSAGE_SELF)
- return res[4]
-
-# returns caller's stack
-def caller_stack():
- import traceback
- tb = traceback.extract_stack()
- # strip itself and the caller from the output
- tb = tb[:-2]
- result = []
- for back in tb:
- # (filename, line number, function name, text)
- key = back[:3]
- result.append('%s:%d(%s)' % func_shorten(key))
- return result
-
-caller_bases = {}
-caller_dicts = {}
-
-# trace a caller's stack
-def caller_trace(back=0):
- import traceback
- tb = traceback.extract_stack(limit=3+back)
- tb.reverse()
- callee = tb[1][:3]
- caller_bases[callee] = caller_bases.get(callee, 0) + 1
- for caller in tb[2:]:
- caller = callee + caller[:3]
- try:
- entry = caller_dicts[callee]
- except KeyError:
- caller_dicts[callee] = entry = {}
- entry[caller] = entry.get(caller, 0) + 1
- callee = caller
-
-# print a single caller and its callers, if any
-def _dump_one_caller(key, file, level=0):
- leader = ' '*level
- for v,c in sorted([(-v,c) for c,v in caller_dicts[key].items()]):
- file.write("%s %6d %s:%d(%s)\n" % ((leader,-v) + func_shorten(c[-3:])))
- if c in caller_dicts:
- _dump_one_caller(c, file, level+1)
-
-# print each call tree
-def dump_caller_counts(file=sys.stdout):
- for k in sorted(caller_bases.keys()):
- file.write("Callers of %s:%d(%s), %d calls:\n"
- % (func_shorten(k) + (caller_bases[k],)))
- _dump_one_caller(k, file)
-
-shorten_list = [
- ( '/scons/SCons/', 1),
- ( '/src/engine/SCons/', 1),
- ( '/usr/lib/python', 0),
-]
-
-if os.sep != '/':
- shorten_list = [(t[0].replace('/', os.sep), t[1]) for t in shorten_list]
-
-def func_shorten(func_tuple):
- f = func_tuple[0]
- for t in shorten_list:
- i = f.find(t[0])
- if i >= 0:
- if t[1]:
- i = i + len(t[0])
- return (f[i:],)+func_tuple[1:]
- return func_tuple
-
-
-TraceFP = {}
-if sys.platform == 'win32':
- TraceDefault = 'con'
-else:
- TraceDefault = '/dev/tty'
-
-TimeStampDefault = None
-StartTime = time.time()
-PreviousTime = StartTime
-
-def Trace(msg, file=None, mode='w', tstamp=None):
- """Write a trace message to a file. Whenever a file is specified,
- it becomes the default for the next call to Trace()."""
- global TraceDefault
- global TimeStampDefault
- global PreviousTime
- if file is None:
- file = TraceDefault
- else:
- TraceDefault = file
- if tstamp is None:
- tstamp = TimeStampDefault
- else:
- TimeStampDefault = tstamp
- try:
- fp = TraceFP[file]
- except KeyError:
- try:
- fp = TraceFP[file] = open(file, mode)
- except TypeError:
- # Assume we were passed an open file pointer.
- fp = file
- if tstamp:
- now = time.time()
- fp.write('%8.4f %8.4f: ' % (now - StartTime, now - PreviousTime))
- PreviousTime = now
- fp.write(msg)
- fp.flush()
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Defaults.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Defaults.py
deleted file mode 100644
index b4cbb9a..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Defaults.py
+++ /dev/null
@@ -1,513 +0,0 @@
-"""SCons.Defaults
-
-Builders and other things for the local site. Here's where we'll
-duplicate the functionality of autoconf until we move it into the
-installation procedure or use something like qmconf.
-
-The code that reads the registry to find MSVC components was borrowed
-from distutils.msvccompiler.
-
-"""
-
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-from __future__ import division
-
-__revision__ = "src/engine/SCons/Defaults.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-
-import os
-import errno
-import shutil
-import stat
-import time
-import sys
-
-import SCons.Action
-import SCons.Builder
-import SCons.CacheDir
-import SCons.Environment
-import SCons.PathList
-import SCons.Subst
-import SCons.Tool
-
-# A placeholder for a default Environment (for fetching source files
-# from source code management systems and the like). This must be
-# initialized later, after the top-level directory is set by the calling
-# interface.
-_default_env = None
-
-# Lazily instantiate the default environment so the overhead of creating
-# it doesn't apply when it's not needed.
-def _fetch_DefaultEnvironment(*args, **kw):
- """
- Returns the already-created default construction environment.
- """
- global _default_env
- return _default_env
-
-def DefaultEnvironment(*args, **kw):
- """
- Initial public entry point for creating the default construction
- Environment.
-
- After creating the environment, we overwrite our name
- (DefaultEnvironment) with the _fetch_DefaultEnvironment() function,
- which more efficiently returns the initialized default construction
- environment without checking for its existence.
-
- (This function still exists with its _default_check because someone
- else (*cough* Script/__init__.py *cough*) may keep a reference
- to this function. So we can't use the fully functional idiom of
- having the name originally be a something that *only* creates the
- construction environment and then overwrites the name.)
- """
- global _default_env
- if not _default_env:
- import SCons.Util
- _default_env = SCons.Environment.Environment(*args, **kw)
- if SCons.Util.md5:
- _default_env.Decider('MD5')
- else:
- _default_env.Decider('timestamp-match')
- global DefaultEnvironment
- DefaultEnvironment = _fetch_DefaultEnvironment
- _default_env._CacheDir_path = None
- return _default_env
-
-# Emitters for setting the shared attribute on object files,
-# and an action for checking that all of the source files
-# going into a shared library are, in fact, shared.
-def StaticObjectEmitter(target, source, env):
- for tgt in target:
- tgt.attributes.shared = None
- return (target, source)
-
-def SharedObjectEmitter(target, source, env):
- for tgt in target:
- tgt.attributes.shared = 1
- return (target, source)
-
-def SharedFlagChecker(source, target, env):
- same = env.subst('$STATIC_AND_SHARED_OBJECTS_ARE_THE_SAME')
- if same == '0' or same == '' or same == 'False':
- for src in source:
- try:
- shared = src.attributes.shared
- except AttributeError:
- shared = None
- if not shared:
- raise SCons.Errors.UserError("Source file: %s is static and is not compatible with shared target: %s" % (src, target[0]))
-
-SharedCheck = SCons.Action.Action(SharedFlagChecker, None)
-
-# Some people were using these variable name before we made
-# SourceFileScanner part of the public interface. Don't break their
-# SConscript files until we've given them some fair warning and a
-# transition period.
-CScan = SCons.Tool.CScanner
-DScan = SCons.Tool.DScanner
-LaTeXScan = SCons.Tool.LaTeXScanner
-ObjSourceScan = SCons.Tool.SourceFileScanner
-ProgScan = SCons.Tool.ProgramScanner
-
-# These aren't really tool scanners, so they don't quite belong with
-# the rest of those in Tool/__init__.py, but I'm not sure where else
-# they should go. Leave them here for now.
-import SCons.Scanner.Dir
-DirScanner = SCons.Scanner.Dir.DirScanner()
-DirEntryScanner = SCons.Scanner.Dir.DirEntryScanner()
-
-# Actions for common languages.
-CAction = SCons.Action.Action("$CCCOM", "$CCCOMSTR")
-ShCAction = SCons.Action.Action("$SHCCCOM", "$SHCCCOMSTR")
-CXXAction = SCons.Action.Action("$CXXCOM", "$CXXCOMSTR")
-ShCXXAction = SCons.Action.Action("$SHCXXCOM", "$SHCXXCOMSTR")
-
-DAction = SCons.Action.Action("$DCOM", "$DCOMSTR")
-ShDAction = SCons.Action.Action("$SHDCOM", "$SHDCOMSTR")
-
-ASAction = SCons.Action.Action("$ASCOM", "$ASCOMSTR")
-ASPPAction = SCons.Action.Action("$ASPPCOM", "$ASPPCOMSTR")
-
-LinkAction = SCons.Action.Action("$LINKCOM", "$LINKCOMSTR")
-ShLinkAction = SCons.Action.Action("$SHLINKCOM", "$SHLINKCOMSTR")
-
-LdModuleLinkAction = SCons.Action.Action("$LDMODULECOM", "$LDMODULECOMSTR")
-
-# Common tasks that we allow users to perform in platform-independent
-# ways by creating ActionFactory instances.
-ActionFactory = SCons.Action.ActionFactory
-
-def get_paths_str(dest):
- # If dest is a list, we need to manually call str() on each element
- if SCons.Util.is_List(dest):
- elem_strs = []
- for element in dest:
- elem_strs.append('"' + str(element) + '"')
- return '[' + ', '.join(elem_strs) + ']'
- else:
- return '"' + str(dest) + '"'
-
-def chmod_func(dest, mode):
- SCons.Node.FS.invalidate_node_memos(dest)
- if not SCons.Util.is_List(dest):
- dest = [dest]
- for element in dest:
- os.chmod(str(element), mode)
-
-def chmod_strfunc(dest, mode):
- return 'Chmod(%s, 0%o)' % (get_paths_str(dest), mode)
-
-Chmod = ActionFactory(chmod_func, chmod_strfunc)
-
-def copy_func(dest, src, symlinks=True):
- """
- If symlinks (is true), then a symbolic link will be
- shallow copied and recreated as a symbolic link; otherwise, copying
- a symbolic link will be equivalent to copying the symbolic link's
- final target regardless of symbolic link depth.
- """
-
- dest = str(dest)
- src = str(src)
-
- SCons.Node.FS.invalidate_node_memos(dest)
- if SCons.Util.is_List(src) and os.path.isdir(dest):
- for file in src:
- shutil.copy2(file, dest)
- return 0
- elif os.path.islink(src):
- if symlinks:
- return os.symlink(os.readlink(src), dest)
- else:
- return copy_func(dest, os.path.realpath(src))
- elif os.path.isfile(src):
- return shutil.copy2(src, dest)
- else:
- return shutil.copytree(src, dest, symlinks)
-
-Copy = ActionFactory(
- copy_func,
- lambda dest, src, symlinks=True: 'Copy("%s", "%s")' % (dest, src)
-)
-
-def delete_func(dest, must_exist=0):
- SCons.Node.FS.invalidate_node_memos(dest)
- if not SCons.Util.is_List(dest):
- dest = [dest]
- for entry in dest:
- entry = str(entry)
- # os.path.exists returns False with broken links that exist
- entry_exists = os.path.exists(entry) or os.path.islink(entry)
- if not entry_exists and not must_exist:
- continue
- # os.path.isdir returns True when entry is a link to a dir
- if os.path.isdir(entry) and not os.path.islink(entry):
- shutil.rmtree(entry, 1)
- continue
- os.unlink(entry)
-
-def delete_strfunc(dest, must_exist=0):
- return 'Delete(%s)' % get_paths_str(dest)
-
-Delete = ActionFactory(delete_func, delete_strfunc)
-
-def mkdir_func(dest):
- SCons.Node.FS.invalidate_node_memos(dest)
- if not SCons.Util.is_List(dest):
- dest = [dest]
- for entry in dest:
- try:
- os.makedirs(str(entry))
- except os.error, e:
- p = str(entry)
- if (e.args[0] == errno.EEXIST or
- (sys.platform=='win32' and e.args[0]==183)) \
- and os.path.isdir(str(entry)):
- pass # not an error if already exists
- else:
- raise
-
-Mkdir = ActionFactory(mkdir_func,
- lambda dir: 'Mkdir(%s)' % get_paths_str(dir))
-
-def move_func(dest, src):
- SCons.Node.FS.invalidate_node_memos(dest)
- SCons.Node.FS.invalidate_node_memos(src)
- shutil.move(src, dest)
-
-Move = ActionFactory(move_func,
- lambda dest, src: 'Move("%s", "%s")' % (dest, src),
- convert=str)
-
-def touch_func(dest):
- SCons.Node.FS.invalidate_node_memos(dest)
- if not SCons.Util.is_List(dest):
- dest = [dest]
- for file in dest:
- file = str(file)
- mtime = int(time.time())
- if os.path.exists(file):
- atime = os.path.getatime(file)
- else:
- open(file, 'w')
- atime = mtime
- os.utime(file, (atime, mtime))
-
-Touch = ActionFactory(touch_func,
- lambda file: 'Touch(%s)' % get_paths_str(file))
-
-# Internal utility functions
-
-def _concat(prefix, list, suffix, env, f=lambda x: x, target=None, source=None):
- """
- Creates a new list from 'list' by first interpolating each element
- in the list using the 'env' dictionary and then calling f on the
- list, and finally calling _concat_ixes to concatenate 'prefix' and
- 'suffix' onto each element of the list.
- """
- if not list:
- return list
-
- l = f(SCons.PathList.PathList(list).subst_path(env, target, source))
- if l is not None:
- list = l
-
- return _concat_ixes(prefix, list, suffix, env)
-
-def _concat_ixes(prefix, list, suffix, env):
- """
- Creates a new list from 'list' by concatenating the 'prefix' and
- 'suffix' arguments onto each element of the list. A trailing space
- on 'prefix' or leading space on 'suffix' will cause them to be put
- into separate list elements rather than being concatenated.
- """
-
- result = []
-
- # ensure that prefix and suffix are strings
- prefix = str(env.subst(prefix, SCons.Subst.SUBST_RAW))
- suffix = str(env.subst(suffix, SCons.Subst.SUBST_RAW))
-
- for x in list:
- if isinstance(x, SCons.Node.FS.File):
- result.append(x)
- continue
- x = str(x)
- if x:
-
- if prefix:
- if prefix[-1] == ' ':
- result.append(prefix[:-1])
- elif x[:len(prefix)] != prefix:
- x = prefix + x
-
- result.append(x)
-
- if suffix:
- if suffix[0] == ' ':
- result.append(suffix[1:])
- elif x[-len(suffix):] != suffix:
- result[-1] = result[-1]+suffix
-
- return result
-
-def _stripixes(prefix, itms, suffix, stripprefixes, stripsuffixes, env, c=None):
- """
- This is a wrapper around _concat()/_concat_ixes() that checks for
- the existence of prefixes or suffixes on list items and strips them
- where it finds them. This is used by tools (like the GNU linker)
- that need to turn something like 'libfoo.a' into '-lfoo'.
- """
-
- if not itms:
- return itms
-
- if not callable(c):
- env_c = env['_concat']
- if env_c != _concat and callable(env_c):
- # There's a custom _concat() method in the construction
- # environment, and we've allowed people to set that in
- # the past (see test/custom-concat.py), so preserve the
- # backwards compatibility.
- c = env_c
- else:
- c = _concat_ixes
-
- stripprefixes = list(map(env.subst, SCons.Util.flatten(stripprefixes)))
- stripsuffixes = list(map(env.subst, SCons.Util.flatten(stripsuffixes)))
-
- stripped = []
- for l in SCons.PathList.PathList(itms).subst_path(env, None, None):
- if isinstance(l, SCons.Node.FS.File):
- stripped.append(l)
- continue
-
- if not SCons.Util.is_String(l):
- l = str(l)
-
- for stripprefix in stripprefixes:
- lsp = len(stripprefix)
- if l[:lsp] == stripprefix:
- l = l[lsp:]
- # Do not strip more than one prefix
- break
-
- for stripsuffix in stripsuffixes:
- lss = len(stripsuffix)
- if l[-lss:] == stripsuffix:
- l = l[:-lss]
- # Do not strip more than one suffix
- break
-
- stripped.append(l)
-
- return c(prefix, stripped, suffix, env)
-
-def processDefines(defs):
- """process defines, resolving strings, lists, dictionaries, into a list of
- strings
- """
- if SCons.Util.is_List(defs):
- l = []
- for d in defs:
- if d is None:
- continue
- elif SCons.Util.is_List(d) or isinstance(d, tuple):
- if len(d) >= 2:
- l.append(str(d[0]) + '=' + str(d[1]))
- else:
- l.append(str(d[0]))
- elif SCons.Util.is_Dict(d):
- for macro,value in d.iteritems():
- if value is not None:
- l.append(str(macro) + '=' + str(value))
- else:
- l.append(str(macro))
- elif SCons.Util.is_String(d):
- l.append(str(d))
- else:
- raise SCons.Errors.UserError("DEFINE %s is not a list, dict, string or None."%repr(d))
- elif SCons.Util.is_Dict(defs):
- # The items in a dictionary are stored in random order, but
- # if the order of the command-line options changes from
- # invocation to invocation, then the signature of the command
- # line will change and we'll get random unnecessary rebuilds.
- # Consequently, we have to sort the keys to ensure a
- # consistent order...
- l = []
- for k,v in sorted(defs.items()):
- if v is None:
- l.append(str(k))
- else:
- l.append(str(k) + '=' + str(v))
- else:
- l = [str(defs)]
- return l
-
-def _defines(prefix, defs, suffix, env, c=_concat_ixes):
- """A wrapper around _concat_ixes that turns a list or string
- into a list of C preprocessor command-line definitions.
- """
-
- return c(prefix, env.subst_path(processDefines(defs)), suffix, env)
-
-class NullCmdGenerator(object):
- """This is a callable class that can be used in place of other
- command generators if you don't want them to do anything.
-
- The __call__ method for this class simply returns the thing
- you instantiated it with.
-
- Example usage:
- env["DO_NOTHING"] = NullCmdGenerator
- env["LINKCOM"] = "${DO_NOTHING('$LINK $SOURCES $TARGET')}"
- """
-
- def __init__(self, cmd):
- self.cmd = cmd
-
- def __call__(self, target, source, env, for_signature=None):
- return self.cmd
-
-class Variable_Method_Caller(object):
- """A class for finding a construction variable on the stack and
- calling one of its methods.
-
- We use this to support "construction variables" in our string
- eval()s that actually stand in for methods--specifically, use
- of "RDirs" in call to _concat that should actually execute the
- "TARGET.RDirs" method. (We used to support this by creating a little
- "build dictionary" that mapped RDirs to the method, but this got in
- the way of Memoizing construction environments, because we had to
- create new environment objects to hold the variables.)
- """
- def __init__(self, variable, method):
- self.variable = variable
- self.method = method
- def __call__(self, *args, **kw):
- try: 1//0
- except ZeroDivisionError:
- # Don't start iterating with the current stack-frame to
- # prevent creating reference cycles (f_back is safe).
- frame = sys.exc_info()[2].tb_frame.f_back
- variable = self.variable
- while frame:
- if variable in frame.f_locals:
- v = frame.f_locals[variable]
- if v:
- method = getattr(v, self.method)
- return method(*args, **kw)
- frame = frame.f_back
- return None
-
-ConstructionEnvironment = {
- 'BUILDERS' : {},
- 'SCANNERS' : [],
- 'CONFIGUREDIR' : '#/.sconf_temp',
- 'CONFIGURELOG' : '#/config.log',
- 'CPPSUFFIXES' : SCons.Tool.CSuffixes,
- 'DSUFFIXES' : SCons.Tool.DSuffixes,
- 'ENV' : {},
- 'IDLSUFFIXES' : SCons.Tool.IDLSuffixes,
-# 'LATEXSUFFIXES' : SCons.Tool.LaTeXSuffixes, # moved to the TeX tools generate functions
- '_concat' : _concat,
- '_defines' : _defines,
- '_stripixes' : _stripixes,
- '_LIBFLAGS' : '${_concat(LIBLINKPREFIX, LIBS, LIBLINKSUFFIX, __env__)}',
- '_LIBDIRFLAGS' : '$( ${_concat(LIBDIRPREFIX, LIBPATH, LIBDIRSUFFIX, __env__, RDirs, TARGET, SOURCE)} $)',
- '_CPPINCFLAGS' : '$( ${_concat(INCPREFIX, CPPPATH, INCSUFFIX, __env__, RDirs, TARGET, SOURCE)} $)',
- '_CPPDEFFLAGS' : '${_defines(CPPDEFPREFIX, CPPDEFINES, CPPDEFSUFFIX, __env__)}',
- 'TEMPFILE' : NullCmdGenerator,
- 'Dir' : Variable_Method_Caller('TARGET', 'Dir'),
- 'Dirs' : Variable_Method_Caller('TARGET', 'Dirs'),
- 'File' : Variable_Method_Caller('TARGET', 'File'),
- 'RDirs' : Variable_Method_Caller('TARGET', 'RDirs'),
-}
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Environment.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Environment.py
deleted file mode 100644
index 865c821..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Environment.py
+++ /dev/null
@@ -1,2448 +0,0 @@
-"""SCons.Environment
-
-Base class for construction Environments. These are
-the primary objects used to communicate dependency and
-construction information to the build engine.
-
-Keyword arguments supplied when the construction Environment
-is created are construction variables used to initialize the
-Environment
-"""
-
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-__revision__ = "src/engine/SCons/Environment.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-
-import copy
-import os
-import sys
-import re
-import shlex
-from collections import UserDict
-
-import SCons.Action
-import SCons.Builder
-import SCons.Debug
-from SCons.Debug import logInstanceCreation
-import SCons.Defaults
-import SCons.Errors
-import SCons.Memoize
-import SCons.Node
-import SCons.Node.Alias
-import SCons.Node.FS
-import SCons.Node.Python
-import SCons.Platform
-import SCons.SConf
-import SCons.SConsign
-import SCons.Subst
-import SCons.Tool
-import SCons.Util
-import SCons.Warnings
-
-class _Null(object):
- pass
-
-_null = _Null
-
-_warn_copy_deprecated = True
-_warn_source_signatures_deprecated = True
-_warn_target_signatures_deprecated = True
-
-CleanTargets = {}
-CalculatorArgs = {}
-
-semi_deepcopy = SCons.Util.semi_deepcopy
-semi_deepcopy_dict = SCons.Util.semi_deepcopy_dict
-
-# Pull UserError into the global name space for the benefit of
-# Environment().SourceSignatures(), which has some import statements
-# which seem to mess up its ability to reference SCons directly.
-UserError = SCons.Errors.UserError
-
-def alias_builder(env, target, source):
- pass
-
-AliasBuilder = SCons.Builder.Builder(action = alias_builder,
- target_factory = SCons.Node.Alias.default_ans.Alias,
- source_factory = SCons.Node.FS.Entry,
- multi = 1,
- is_explicit = None,
- name='AliasBuilder')
-
-def apply_tools(env, tools, toolpath):
- # Store the toolpath in the Environment.
- if toolpath is not None:
- env['toolpath'] = toolpath
-
- if not tools:
- return
- # Filter out null tools from the list.
- for tool in [_f for _f in tools if _f]:
- if SCons.Util.is_List(tool) or isinstance(tool, tuple):
- toolname = tool[0]
- toolargs = tool[1] # should be a dict of kw args
- tool = env.Tool(toolname, **toolargs)
- else:
- env.Tool(tool)
-
-# These names are (or will be) controlled by SCons; users should never
-# set or override them. This warning can optionally be turned off,
-# but scons will still ignore the illegal variable names even if it's off.
-reserved_construction_var_names = [
- 'CHANGED_SOURCES',
- 'CHANGED_TARGETS',
- 'SOURCE',
- 'SOURCES',
- 'TARGET',
- 'TARGETS',
- 'UNCHANGED_SOURCES',
- 'UNCHANGED_TARGETS',
-]
-
-future_reserved_construction_var_names = [
- #'HOST_OS',
- #'HOST_ARCH',
- #'HOST_CPU',
- ]
-
-def copy_non_reserved_keywords(dict):
- result = semi_deepcopy(dict)
- for k in result.keys():
- if k in reserved_construction_var_names:
- msg = "Ignoring attempt to set reserved variable `$%s'"
- SCons.Warnings.warn(SCons.Warnings.ReservedVariableWarning, msg % k)
- del result[k]
- return result
-
-def _set_reserved(env, key, value):
- msg = "Ignoring attempt to set reserved variable `$%s'"
- SCons.Warnings.warn(SCons.Warnings.ReservedVariableWarning, msg % key)
-
-def _set_future_reserved(env, key, value):
- env._dict[key] = value
- msg = "`$%s' will be reserved in a future release and setting it will become ignored"
- SCons.Warnings.warn(SCons.Warnings.FutureReservedVariableWarning, msg % key)
-
-def _set_BUILDERS(env, key, value):
- try:
- bd = env._dict[key]
- for k in bd.keys():
- del bd[k]
- except KeyError:
- bd = BuilderDict(kwbd, env)
- env._dict[key] = bd
- for k, v in value.items():
- if not SCons.Builder.is_a_Builder(v):
- raise SCons.Errors.UserError('%s is not a Builder.' % repr(v))
- bd.update(value)
-
-def _del_SCANNERS(env, key):
- del env._dict[key]
- env.scanner_map_delete()
-
-def _set_SCANNERS(env, key, value):
- env._dict[key] = value
- env.scanner_map_delete()
-
-def _delete_duplicates(l, keep_last):
- """Delete duplicates from a sequence, keeping the first or last."""
- seen={}
- result=[]
- if keep_last: # reverse in & out, then keep first
- l.reverse()
- for i in l:
- try:
- if i not in seen:
- result.append(i)
- seen[i]=1
- except TypeError:
- # probably unhashable. Just keep it.
- result.append(i)
- if keep_last:
- result.reverse()
- return result
-
-
-
-# The following is partly based on code in a comment added by Peter
-# Shannon at the following page (there called the "transplant" class):
-#
-# ASPN : Python Cookbook : Dynamically added methods to a class
-# http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/81732
-#
-# We had independently been using the idiom as BuilderWrapper, but
-# factoring out the common parts into this base class, and making
-# BuilderWrapper a subclass that overrides __call__() to enforce specific
-# Builder calling conventions, simplified some of our higher-layer code.
-
-class MethodWrapper(object):
- """
- A generic Wrapper class that associates a method (which can
- actually be any callable) with an object. As part of creating this
- MethodWrapper object an attribute with the specified (by default,
- the name of the supplied method) is added to the underlying object.
- When that new "method" is called, our __call__() method adds the
- object as the first argument, simulating the Python behavior of
- supplying "self" on method calls.
-
- We hang on to the name by which the method was added to the underlying
- base class so that we can provide a method to "clone" ourselves onto
- a new underlying object being copied (without which we wouldn't need
- to save that info).
- """
- def __init__(self, object, method, name=None):
- if name is None:
- name = method.__name__
- self.object = object
- self.method = method
- self.name = name
- setattr(self.object, name, self)
-
- def __call__(self, *args, **kwargs):
- nargs = (self.object,) + args
- return self.method(*nargs, **kwargs)
-
- def clone(self, new_object):
- """
- Returns an object that re-binds the underlying "method" to
- the specified new object.
- """
- return self.__class__(new_object, self.method, self.name)
-
-class BuilderWrapper(MethodWrapper):
- """
- A MethodWrapper subclass that that associates an environment with
- a Builder.
-
- This mainly exists to wrap the __call__() function so that all calls
- to Builders can have their argument lists massaged in the same way
- (treat a lone argument as the source, treat two arguments as target
- then source, make sure both target and source are lists) without
- having to have cut-and-paste code to do it.
-
- As a bit of obsessive backwards compatibility, we also intercept
- attempts to get or set the "env" or "builder" attributes, which were
- the names we used before we put the common functionality into the
- MethodWrapper base class. We'll keep this around for a while in case
- people shipped Tool modules that reached into the wrapper (like the
- Tool/qt.py module does, or did). There shouldn't be a lot attribute
- fetching or setting on these, so a little extra work shouldn't hurt.
- """
- def __call__(self, target=None, source=_null, *args, **kw):
- if source is _null:
- source = target
- target = None
- if target is not None and not SCons.Util.is_List(target):
- target = [target]
- if source is not None and not SCons.Util.is_List(source):
- source = [source]
- return MethodWrapper.__call__(self, target, source, *args, **kw)
-
- def __repr__(self):
- return '<BuilderWrapper %s>' % repr(self.name)
-
- def __str__(self):
- return self.__repr__()
-
- def __getattr__(self, name):
- if name == 'env':
- return self.object
- elif name == 'builder':
- return self.method
- else:
- raise AttributeError(name)
-
- def __setattr__(self, name, value):
- if name == 'env':
- self.object = value
- elif name == 'builder':
- self.method = value
- else:
- self.__dict__[name] = value
-
- # This allows a Builder to be executed directly
- # through the Environment to which it's attached.
- # In practice, we shouldn't need this, because
- # builders actually get executed through a Node.
- # But we do have a unit test for this, and can't
- # yet rule out that it would be useful in the
- # future, so leave it for now.
- #def execute(self, **kw):
- # kw['env'] = self.env
- # self.builder.execute(**kw)
-
-class BuilderDict(UserDict):
- """This is a dictionary-like class used by an Environment to hold
- the Builders. We need to do this because every time someone changes
- the Builders in the Environment's BUILDERS dictionary, we must
- update the Environment's attributes."""
- def __init__(self, dict, env):
- # Set self.env before calling the superclass initialization,
- # because it will end up calling our other methods, which will
- # need to point the values in this dictionary to self.env.
- self.env = env
- UserDict.__init__(self, dict)
-
- def __semi_deepcopy__(self):
- # These cannot be copied since they would both modify the same builder object, and indeed
- # just copying would modify the original builder
- raise TypeError( 'cannot semi_deepcopy a BuilderDict' )
-
- def __setitem__(self, item, val):
- try:
- method = getattr(self.env, item).method
- except AttributeError:
- pass
- else:
- self.env.RemoveMethod(method)
- UserDict.__setitem__(self, item, val)
- BuilderWrapper(self.env, val, item)
-
- def __delitem__(self, item):
- UserDict.__delitem__(self, item)
- delattr(self.env, item)
-
- def update(self, dict):
- for i, v in dict.items():
- self.__setitem__(i, v)
-
-
-
-_is_valid_var = re.compile(r'[_a-zA-Z]\w*$')
-
-def is_valid_construction_var(varstr):
- """Return if the specified string is a legitimate construction
- variable.
- """
- return _is_valid_var.match(varstr)
-
-
-
-class SubstitutionEnvironment(object):
- """Base class for different flavors of construction environments.
-
- This class contains a minimal set of methods that handle contruction
- variable expansion and conversion of strings to Nodes, which may or
- may not be actually useful as a stand-alone class. Which methods
- ended up in this class is pretty arbitrary right now. They're
- basically the ones which we've empirically determined are common to
- the different construction environment subclasses, and most of the
- others that use or touch the underlying dictionary of construction
- variables.
-
- Eventually, this class should contain all the methods that we
- determine are necessary for a "minimal" interface to the build engine.
- A full "native Python" SCons environment has gotten pretty heavyweight
- with all of the methods and Tools and construction variables we've
- jammed in there, so it would be nice to have a lighter weight
- alternative for interfaces that don't need all of the bells and
- whistles. (At some point, we'll also probably rename this class
- "Base," since that more reflects what we want this class to become,
- but because we've released comments that tell people to subclass
- Environment.Base to create their own flavors of construction
- environment, we'll save that for a future refactoring when this
- class actually becomes useful.)
- """
-
- def __init__(self, **kw):
- """Initialization of an underlying SubstitutionEnvironment class.
- """
- if SCons.Debug.track_instances: logInstanceCreation(self, 'Environment.SubstitutionEnvironment')
- self.fs = SCons.Node.FS.get_default_fs()
- self.ans = SCons.Node.Alias.default_ans
- self.lookup_list = SCons.Node.arg2nodes_lookups
- self._dict = kw.copy()
- self._init_special()
- self.added_methods = []
- #self._memo = {}
-
- def _init_special(self):
- """Initial the dispatch tables for special handling of
- special construction variables."""
- self._special_del = {}
- self._special_del['SCANNERS'] = _del_SCANNERS
-
- self._special_set = {}
- for key in reserved_construction_var_names:
- self._special_set[key] = _set_reserved
- for key in future_reserved_construction_var_names:
- self._special_set[key] = _set_future_reserved
- self._special_set['BUILDERS'] = _set_BUILDERS
- self._special_set['SCANNERS'] = _set_SCANNERS
-
- # Freeze the keys of self._special_set in a list for use by
- # methods that need to check. (Empirically, list scanning has
- # gotten better than dict.has_key() in Python 2.5.)
- self._special_set_keys = list(self._special_set.keys())
-
- def __cmp__(self, other):
- return cmp(self._dict, other._dict)
-
- def __delitem__(self, key):
- special = self._special_del.get(key)
- if special:
- special(self, key)
- else:
- del self._dict[key]
-
- def __getitem__(self, key):
- return self._dict[key]
-
- def __setitem__(self, key, value):
- # This is heavily used. This implementation is the best we have
- # according to the timings in bench/env.__setitem__.py.
- #
- # The "key in self._special_set_keys" test here seems to perform
- # pretty well for the number of keys we have. A hard-coded
- # list works a little better in Python 2.5, but that has the
- # disadvantage of maybe getting out of sync if we ever add more
- # variable names. Using self._special_set.has_key() works a
- # little better in Python 2.4, but is worse than this test.
- # So right now it seems like a good trade-off, but feel free to
- # revisit this with bench/env.__setitem__.py as needed (and
- # as newer versions of Python come out).
- if key in self._special_set_keys:
- self._special_set[key](self, key, value)
- else:
- # If we already have the entry, then it's obviously a valid
- # key and we don't need to check. If we do check, using a
- # global, pre-compiled regular expression directly is more
- # efficient than calling another function or a method.
- if key not in self._dict \
- and not _is_valid_var.match(key):
- raise SCons.Errors.UserError("Illegal construction variable `%s'" % key)
- self._dict[key] = value
-
- def get(self, key, default=None):
- """Emulates the get() method of dictionaries."""
- return self._dict.get(key, default)
-
- def has_key(self, key):
- return key in self._dict
-
- def __contains__(self, key):
- return self._dict.__contains__(key)
-
- def items(self):
- return list(self._dict.items())
-
- def arg2nodes(self, args, node_factory=_null, lookup_list=_null, **kw):
- if node_factory is _null:
- node_factory = self.fs.File
- if lookup_list is _null:
- lookup_list = self.lookup_list
-
- if not args:
- return []
-
- args = SCons.Util.flatten(args)
-
- nodes = []
- for v in args:
- if SCons.Util.is_String(v):
- n = None
- for l in lookup_list:
- n = l(v)
- if n is not None:
- break
- if n is not None:
- if SCons.Util.is_String(n):
- # n = self.subst(n, raw=1, **kw)
- kw['raw'] = 1
- n = self.subst(n, **kw)
- if node_factory:
- n = node_factory(n)
- if SCons.Util.is_List(n):
- nodes.extend(n)
- else:
- nodes.append(n)
- elif node_factory:
- # v = node_factory(self.subst(v, raw=1, **kw))
- kw['raw'] = 1
- v = node_factory(self.subst(v, **kw))
- if SCons.Util.is_List(v):
- nodes.extend(v)
- else:
- nodes.append(v)
- else:
- nodes.append(v)
-
- return nodes
-
- def gvars(self):
- return self._dict
-
- def lvars(self):
- return {}
-
- def subst(self, string, raw=0, target=None, source=None, conv=None, executor=None):
- """Recursively interpolates construction variables from the
- Environment into the specified string, returning the expanded
- result. Construction variables are specified by a $ prefix
- in the string and begin with an initial underscore or
- alphabetic character followed by any number of underscores
- or alphanumeric characters. The construction variable names
- may be surrounded by curly braces to separate the name from
- trailing characters.
- """
- gvars = self.gvars()
- lvars = self.lvars()
- lvars['__env__'] = self
- if executor:
- lvars.update(executor.get_lvars())
- return SCons.Subst.scons_subst(string, self, raw, target, source, gvars, lvars, conv)
-
- def subst_kw(self, kw, raw=0, target=None, source=None):
- nkw = {}
- for k, v in kw.items():
- k = self.subst(k, raw, target, source)
- if SCons.Util.is_String(v):
- v = self.subst(v, raw, target, source)
- nkw[k] = v
- return nkw
-
- def subst_list(self, string, raw=0, target=None, source=None, conv=None, executor=None):
- """Calls through to SCons.Subst.scons_subst_list(). See
- the documentation for that function."""
- gvars = self.gvars()
- lvars = self.lvars()
- lvars['__env__'] = self
- if executor:
- lvars.update(executor.get_lvars())
- return SCons.Subst.scons_subst_list(string, self, raw, target, source, gvars, lvars, conv)
-
- def subst_path(self, path, target=None, source=None):
- """Substitute a path list, turning EntryProxies into Nodes
- and leaving Nodes (and other objects) as-is."""
-
- if not SCons.Util.is_List(path):
- path = [path]
-
- def s(obj):
- """This is the "string conversion" routine that we have our
- substitutions use to return Nodes, not strings. This relies
- on the fact that an EntryProxy object has a get() method that
- returns the underlying Node that it wraps, which is a bit of
- architectural dependence that we might need to break or modify
- in the future in response to additional requirements."""
- try:
- get = obj.get
- except AttributeError:
- obj = SCons.Util.to_String_for_subst(obj)
- else:
- obj = get()
- return obj
-
- r = []
- for p in path:
- if SCons.Util.is_String(p):
- p = self.subst(p, target=target, source=source, conv=s)
- if SCons.Util.is_List(p):
- if len(p) == 1:
- p = p[0]
- else:
- # We have an object plus a string, or multiple
- # objects that we need to smush together. No choice
- # but to make them into a string.
- p = ''.join(map(SCons.Util.to_String_for_subst, p))
- else:
- p = s(p)
- r.append(p)
- return r
-
- subst_target_source = subst
-
- def backtick(self, command):
- import subprocess
- # common arguments
- kw = { 'stdin' : 'devnull',
- 'stdout' : subprocess.PIPE,
- 'stderr' : subprocess.PIPE,
- 'universal_newlines' : True,
- }
- # if the command is a list, assume it's been quoted
- # othewise force a shell
- if not SCons.Util.is_List(command): kw['shell'] = True
- # run constructed command
- p = SCons.Action._subproc(self, command, **kw)
- out,err = p.communicate()
- status = p.wait()
- if err:
- sys.stderr.write(unicode(err))
- if status:
- raise OSError("'%s' exited %d" % (command, status))
- return out
-
- def AddMethod(self, function, name=None):
- """
- Adds the specified function as a method of this construction
- environment with the specified name. If the name is omitted,
- the default name is the name of the function itself.
- """
- method = MethodWrapper(self, function, name)
- self.added_methods.append(method)
-
- def RemoveMethod(self, function):
- """
- Removes the specified function's MethodWrapper from the
- added_methods list, so we don't re-bind it when making a clone.
- """
- self.added_methods = [dm for dm in self.added_methods if not dm.method is function]
-
- def Override(self, overrides):
- """
- Produce a modified environment whose variables are overriden by
- the overrides dictionaries. "overrides" is a dictionary that
- will override the variables of this environment.
-
- This function is much more efficient than Clone() or creating
- a new Environment because it doesn't copy the construction
- environment dictionary, it just wraps the underlying construction
- environment, and doesn't even create a wrapper object if there
- are no overrides.
- """
- if not overrides: return self
- o = copy_non_reserved_keywords(overrides)
- if not o: return self
- overrides = {}
- merges = None
- for key, value in o.items():
- if key == 'parse_flags':
- merges = value
- else:
- overrides[key] = SCons.Subst.scons_subst_once(value, self, key)
- env = OverrideEnvironment(self, overrides)
- if merges: env.MergeFlags(merges)
- return env
-
- def ParseFlags(self, *flags):
- """
- Parse the set of flags and return a dict with the flags placed
- in the appropriate entry. The flags are treated as a typical
- set of command-line flags for a GNU-like toolchain and used to
- populate the entries in the dict immediately below. If one of
- the flag strings begins with a bang (exclamation mark), it is
- assumed to be a command and the rest of the string is executed;
- the result of that evaluation is then added to the dict.
- """
- dict = {
- 'ASFLAGS' : SCons.Util.CLVar(''),
- 'CFLAGS' : SCons.Util.CLVar(''),
- 'CCFLAGS' : SCons.Util.CLVar(''),
- 'CXXFLAGS' : SCons.Util.CLVar(''),
- 'CPPDEFINES' : [],
- 'CPPFLAGS' : SCons.Util.CLVar(''),
- 'CPPPATH' : [],
- 'FRAMEWORKPATH' : SCons.Util.CLVar(''),
- 'FRAMEWORKS' : SCons.Util.CLVar(''),
- 'LIBPATH' : [],
- 'LIBS' : [],
- 'LINKFLAGS' : SCons.Util.CLVar(''),
- 'RPATH' : [],
- }
-
- def do_parse(arg):
- # if arg is a sequence, recurse with each element
- if not arg:
- return
-
- if not SCons.Util.is_String(arg):
- for t in arg: do_parse(t)
- return
-
- # if arg is a command, execute it
- if arg[0] == '!':
- arg = self.backtick(arg[1:])
-
- # utility function to deal with -D option
- def append_define(name, dict = dict):
- t = name.split('=')
- if len(t) == 1:
- dict['CPPDEFINES'].append(name)
- else:
- dict['CPPDEFINES'].append([t[0], '='.join(t[1:])])
-
- # Loop through the flags and add them to the appropriate option.
- # This tries to strike a balance between checking for all possible
- # flags and keeping the logic to a finite size, so it doesn't
- # check for some that don't occur often. It particular, if the
- # flag is not known to occur in a config script and there's a way
- # of passing the flag to the right place (by wrapping it in a -W
- # flag, for example) we don't check for it. Note that most
- # preprocessor options are not handled, since unhandled options
- # are placed in CCFLAGS, so unless the preprocessor is invoked
- # separately, these flags will still get to the preprocessor.
- # Other options not currently handled:
- # -iqoutedir (preprocessor search path)
- # -u symbol (linker undefined symbol)
- # -s (linker strip files)
- # -static* (linker static binding)
- # -shared* (linker dynamic binding)
- # -symbolic (linker global binding)
- # -R dir (deprecated linker rpath)
- # IBM compilers may also accept -qframeworkdir=foo
-
- params = shlex.split(arg)
- append_next_arg_to = None # for multi-word args
- for arg in params:
- if append_next_arg_to:
- if append_next_arg_to == 'CPPDEFINES':
- append_define(arg)
- elif append_next_arg_to == '-include':
- t = ('-include', self.fs.File(arg))
- dict['CCFLAGS'].append(t)
- elif append_next_arg_to == '-isysroot':
- t = ('-isysroot', arg)
- dict['CCFLAGS'].append(t)
- dict['LINKFLAGS'].append(t)
- elif append_next_arg_to == '-isystem':
- t = ('-isystem', arg)
- dict['CCFLAGS'].append(t)
- elif append_next_arg_to == '-arch':
- t = ('-arch', arg)
- dict['CCFLAGS'].append(t)
- dict['LINKFLAGS'].append(t)
- else:
- dict[append_next_arg_to].append(arg)
- append_next_arg_to = None
- elif not arg[0] in ['-', '+']:
- dict['LIBS'].append(self.fs.File(arg))
- elif arg == '-dylib_file':
- dict['LINKFLAGS'].append(arg)
- append_next_arg_to = 'LINKFLAGS'
- elif arg[:2] == '-L':
- if arg[2:]:
- dict['LIBPATH'].append(arg[2:])
- else:
- append_next_arg_to = 'LIBPATH'
- elif arg[:2] == '-l':
- if arg[2:]:
- dict['LIBS'].append(arg[2:])
- else:
- append_next_arg_to = 'LIBS'
- elif arg[:2] == '-I':
- if arg[2:]:
- dict['CPPPATH'].append(arg[2:])
- else:
- append_next_arg_to = 'CPPPATH'
- elif arg[:4] == '-Wa,':
- dict['ASFLAGS'].append(arg[4:])
- dict['CCFLAGS'].append(arg)
- elif arg[:4] == '-Wl,':
- if arg[:11] == '-Wl,-rpath=':
- dict['RPATH'].append(arg[11:])
- elif arg[:7] == '-Wl,-R,':
- dict['RPATH'].append(arg[7:])
- elif arg[:6] == '-Wl,-R':
- dict['RPATH'].append(arg[6:])
- else:
- dict['LINKFLAGS'].append(arg)
- elif arg[:4] == '-Wp,':
- dict['CPPFLAGS'].append(arg)
- elif arg[:2] == '-D':
- if arg[2:]:
- append_define(arg[2:])
- else:
- append_next_arg_to = 'CPPDEFINES'
- elif arg == '-framework':
- append_next_arg_to = 'FRAMEWORKS'
- elif arg[:14] == '-frameworkdir=':
- dict['FRAMEWORKPATH'].append(arg[14:])
- elif arg[:2] == '-F':
- if arg[2:]:
- dict['FRAMEWORKPATH'].append(arg[2:])
- else:
- append_next_arg_to = 'FRAMEWORKPATH'
- elif arg in ['-mno-cygwin',
- '-pthread',
- '-openmp',
- '-fopenmp']:
- dict['CCFLAGS'].append(arg)
- dict['LINKFLAGS'].append(arg)
- elif arg == '-mwindows':
- dict['LINKFLAGS'].append(arg)
- elif arg[:5] == '-std=':
- if arg[5:].find('++')!=-1:
- key='CXXFLAGS'
- else:
- key='CFLAGS'
- dict[key].append(arg)
- elif arg[0] == '+':
- dict['CCFLAGS'].append(arg)
- dict['LINKFLAGS'].append(arg)
- elif arg in ['-include', '-isysroot', '-isystem', '-arch']:
- append_next_arg_to = arg
- else:
- dict['CCFLAGS'].append(arg)
-
- for arg in flags:
- do_parse(arg)
- return dict
-
- def MergeFlags(self, args, unique=1, dict=None):
- """
- Merge the dict in args into the construction variables of this
- env, or the passed-in dict. If args is not a dict, it is
- converted into a dict using ParseFlags. If unique is not set,
- the flags are appended rather than merged.
- """
-
- if dict is None:
- dict = self
- if not SCons.Util.is_Dict(args):
- args = self.ParseFlags(args)
- if not unique:
- self.Append(**args)
- return self
- for key, value in args.items():
- if not value:
- continue
- try:
- orig = self[key]
- except KeyError:
- orig = value
- else:
- if not orig:
- orig = value
- elif value:
- # Add orig and value. The logic here was lifted from
- # part of env.Append() (see there for a lot of comments
- # about the order in which things are tried) and is
- # used mainly to handle coercion of strings to CLVar to
- # "do the right thing" given (e.g.) an original CCFLAGS
- # string variable like '-pipe -Wall'.
- try:
- orig = orig + value
- except (KeyError, TypeError):
- try:
- add_to_orig = orig.append
- except AttributeError:
- value.insert(0, orig)
- orig = value
- else:
- add_to_orig(value)
- t = []
- if key[-4:] == 'PATH':
- ### keep left-most occurence
- for v in orig:
- if v not in t:
- t.append(v)
- else:
- ### keep right-most occurence
- orig.reverse()
- for v in orig:
- if v not in t:
- t.insert(0, v)
- self[key] = t
- return self
-
-# def MergeShellPaths(self, args, prepend=1):
-# """
-# Merge the dict in args into the shell environment in env['ENV'].
-# Shell path elements are appended or prepended according to prepend.
-
-# Uses Pre/AppendENVPath, so it always appends or prepends uniquely.
-
-# Example: env.MergeShellPaths({'LIBPATH': '/usr/local/lib'})
-# prepends /usr/local/lib to env['ENV']['LIBPATH'].
-# """
-
-# for pathname, pathval in args.items():
-# if not pathval:
-# continue
-# if prepend:
-# self.PrependENVPath(pathname, pathval)
-# else:
-# self.AppendENVPath(pathname, pathval)
-
-
-def default_decide_source(dependency, target, prev_ni):
- f = SCons.Defaults.DefaultEnvironment().decide_source
- return f(dependency, target, prev_ni)
-
-def default_decide_target(dependency, target, prev_ni):
- f = SCons.Defaults.DefaultEnvironment().decide_target
- return f(dependency, target, prev_ni)
-
-def default_copy_from_cache(src, dst):
- f = SCons.Defaults.DefaultEnvironment().copy_from_cache
- return f(src, dst)
-
-class Base(SubstitutionEnvironment):
- """Base class for "real" construction Environments. These are the
- primary objects used to communicate dependency and construction
- information to the build engine.
-
- Keyword arguments supplied when the construction Environment
- is created are construction variables used to initialize the
- Environment.
- """
-
- #######################################################################
- # This is THE class for interacting with the SCons build engine,
- # and it contains a lot of stuff, so we're going to try to keep this
- # a little organized by grouping the methods.
- #######################################################################
-
- #######################################################################
- # Methods that make an Environment act like a dictionary. These have
- # the expected standard names for Python mapping objects. Note that
- # we don't actually make an Environment a subclass of UserDict for
- # performance reasons. Note also that we only supply methods for
- # dictionary functionality that we actually need and use.
- #######################################################################
-
- def __init__(self,
- platform=None,
- tools=None,
- toolpath=None,
- variables=None,
- parse_flags = None,
- **kw):
- """
- Initialization of a basic SCons construction environment,
- including setting up special construction variables like BUILDER,
- PLATFORM, etc., and searching for and applying available Tools.
-
- Note that we do *not* call the underlying base class
- (SubsitutionEnvironment) initialization, because we need to
- initialize things in a very specific order that doesn't work
- with the much simpler base class initialization.
- """
- if SCons.Debug.track_instances: logInstanceCreation(self, 'Environment.Base')
- self._memo = {}
- self.fs = SCons.Node.FS.get_default_fs()
- self.ans = SCons.Node.Alias.default_ans
- self.lookup_list = SCons.Node.arg2nodes_lookups
- self._dict = semi_deepcopy(SCons.Defaults.ConstructionEnvironment)
- self._init_special()
- self.added_methods = []
-
- # We don't use AddMethod, or define these as methods in this
- # class, because we *don't* want these functions to be bound
- # methods. They need to operate independently so that the
- # settings will work properly regardless of whether a given
- # target ends up being built with a Base environment or an
- # OverrideEnvironment or what have you.
- self.decide_target = default_decide_target
- self.decide_source = default_decide_source
-
- self.copy_from_cache = default_copy_from_cache
-
- self._dict['BUILDERS'] = BuilderDict(self._dict['BUILDERS'], self)
-
- if platform is None:
- platform = self._dict.get('PLATFORM', None)
- if platform is None:
- platform = SCons.Platform.Platform()
- if SCons.Util.is_String(platform):
- platform = SCons.Platform.Platform(platform)
- self._dict['PLATFORM'] = str(platform)
- platform(self)
-
- self._dict['HOST_OS'] = self._dict.get('HOST_OS',None)
- self._dict['HOST_ARCH'] = self._dict.get('HOST_ARCH',None)
-
- # Now set defaults for TARGET_{OS|ARCH}
- self._dict['TARGET_OS'] = self._dict.get('TARGET_OS',None)
- self._dict['TARGET_ARCH'] = self._dict.get('TARGET_ARCH',None)
-
-
- # Apply the passed-in and customizable variables to the
- # environment before calling the tools, because they may use
- # some of them during initialization.
- if 'options' in kw:
- # Backwards compatibility: they may stll be using the
- # old "options" keyword.
- variables = kw['options']
- del kw['options']
- self.Replace(**kw)
- keys = list(kw.keys())
- if variables:
- keys = keys + list(variables.keys())
- variables.Update(self)
-
- save = {}
- for k in keys:
- try:
- save[k] = self._dict[k]
- except KeyError:
- # No value may have been set if they tried to pass in a
- # reserved variable name like TARGETS.
- pass
-
- SCons.Tool.Initializers(self)
-
- if tools is None:
- tools = self._dict.get('TOOLS', None)
- if tools is None:
- tools = ['default']
- apply_tools(self, tools, toolpath)
-
- # Now restore the passed-in and customized variables
- # to the environment, since the values the user set explicitly
- # should override any values set by the tools.
- for key, val in save.items():
- self._dict[key] = val
-
- # Finally, apply any flags to be merged in
- if parse_flags: self.MergeFlags(parse_flags)
-
- #######################################################################
- # Utility methods that are primarily for internal use by SCons.
- # These begin with lower-case letters.
- #######################################################################
-
- def get_builder(self, name):
- """Fetch the builder with the specified name from the environment.
- """
- try:
- return self._dict['BUILDERS'][name]
- except KeyError:
- return None
-
- def get_CacheDir(self):
- try:
- path = self._CacheDir_path
- except AttributeError:
- path = SCons.Defaults.DefaultEnvironment()._CacheDir_path
- try:
- if path == self._last_CacheDir_path:
- return self._last_CacheDir
- except AttributeError:
- pass
- cd = SCons.CacheDir.CacheDir(path)
- self._last_CacheDir_path = path
- self._last_CacheDir = cd
- return cd
-
- def get_factory(self, factory, default='File'):
- """Return a factory function for creating Nodes for this
- construction environment.
- """
- name = default
- try:
- is_node = issubclass(factory, SCons.Node.FS.Base)
- except TypeError:
- # The specified factory isn't a Node itself--it's
- # most likely None, or possibly a callable.
- pass
- else:
- if is_node:
- # The specified factory is a Node (sub)class. Try to
- # return the FS method that corresponds to the Node's
- # name--that is, we return self.fs.Dir if they want a Dir,
- # self.fs.File for a File, etc.
- try: name = factory.__name__
- except AttributeError: pass
- else: factory = None
- if not factory:
- # They passed us None, or we picked up a name from a specified
- # class, so return the FS method. (Note that we *don't*
- # use our own self.{Dir,File} methods because that would
- # cause env.subst() to be called twice on the file name,
- # interfering with files that have $$ in them.)
- factory = getattr(self.fs, name)
- return factory
-
- @SCons.Memoize.CountMethodCall
- def _gsm(self):
- try:
- return self._memo['_gsm']
- except KeyError:
- pass
-
- result = {}
-
- try:
- scanners = self._dict['SCANNERS']
- except KeyError:
- pass
- else:
- # Reverse the scanner list so that, if multiple scanners
- # claim they can scan the same suffix, earlier scanners
- # in the list will overwrite later scanners, so that
- # the result looks like a "first match" to the user.
- if not SCons.Util.is_List(scanners):
- scanners = [scanners]
- else:
- scanners = scanners[:] # copy so reverse() doesn't mod original
- scanners.reverse()
- for scanner in scanners:
- for k in scanner.get_skeys(self):
- if k and self['PLATFORM'] == 'win32':
- k = k.lower()
- result[k] = scanner
-
- self._memo['_gsm'] = result
-
- return result
-
- def get_scanner(self, skey):
- """Find the appropriate scanner given a key (usually a file suffix).
- """
- if skey and self['PLATFORM'] == 'win32':
- skey = skey.lower()
- return self._gsm().get(skey)
-
- def scanner_map_delete(self, kw=None):
- """Delete the cached scanner map (if we need to).
- """
- try:
- del self._memo['_gsm']
- except KeyError:
- pass
-
- def _update(self, dict):
- """Update an environment's values directly, bypassing the normal
- checks that occur when users try to set items.
- """
- self._dict.update(dict)
-
- def get_src_sig_type(self):
- try:
- return self.src_sig_type
- except AttributeError:
- t = SCons.Defaults.DefaultEnvironment().src_sig_type
- self.src_sig_type = t
- return t
-
- def get_tgt_sig_type(self):
- try:
- return self.tgt_sig_type
- except AttributeError:
- t = SCons.Defaults.DefaultEnvironment().tgt_sig_type
- self.tgt_sig_type = t
- return t
-
- #######################################################################
- # Public methods for manipulating an Environment. These begin with
- # upper-case letters. The essential characteristic of methods in
- # this section is that they do *not* have corresponding same-named
- # global functions. For example, a stand-alone Append() function
- # makes no sense, because Append() is all about appending values to
- # an Environment's construction variables.
- #######################################################################
-
- def Append(self, **kw):
- """Append values to existing construction variables
- in an Environment.
- """
- kw = copy_non_reserved_keywords(kw)
- for key, val in kw.items():
- # It would be easier on the eyes to write this using
- # "continue" statements whenever we finish processing an item,
- # but Python 1.5.2 apparently doesn't let you use "continue"
- # within try:-except: blocks, so we have to nest our code.
- try:
- if key == 'CPPDEFINES' and SCons.Util.is_String(self._dict[key]):
- self._dict[key] = [self._dict[key]]
- orig = self._dict[key]
- except KeyError:
- # No existing variable in the environment, so just set
- # it to the new value.
- if key == 'CPPDEFINES' and SCons.Util.is_String(val):
- self._dict[key] = [val]
- else:
- self._dict[key] = val
- else:
- try:
- # Check if the original looks like a dictionary.
- # If it is, we can't just try adding the value because
- # dictionaries don't have __add__() methods, and
- # things like UserList will incorrectly coerce the
- # original dict to a list (which we don't want).
- update_dict = orig.update
- except AttributeError:
- try:
- # Most straightforward: just try to add them
- # together. This will work in most cases, when the
- # original and new values are of compatible types.
- self._dict[key] = orig + val
- except (KeyError, TypeError):
- try:
- # Check if the original is a list.
- add_to_orig = orig.append
- except AttributeError:
- # The original isn't a list, but the new
- # value is (by process of elimination),
- # so insert the original in the new value
- # (if there's one to insert) and replace
- # the variable with it.
- if orig:
- val.insert(0, orig)
- self._dict[key] = val
- else:
- # The original is a list, so append the new
- # value to it (if there's a value to append).
- if val:
- add_to_orig(val)
- else:
- # The original looks like a dictionary, so update it
- # based on what we think the value looks like.
- if SCons.Util.is_List(val):
- if key == 'CPPDEFINES':
- tmp = []
- for (k, v) in orig.iteritems():
- if v is not None:
- tmp.append((k, v))
- else:
- tmp.append((k,))
- orig = tmp
- orig += val
- self._dict[key] = orig
- else:
- for v in val:
- orig[v] = None
- else:
- try:
- update_dict(val)
- except (AttributeError, TypeError, ValueError):
- if SCons.Util.is_Dict(val):
- for k, v in val.items():
- orig[k] = v
- else:
- orig[val] = None
- self.scanner_map_delete(kw)
-
- # allow Dirs and strings beginning with # for top-relative
- # Note this uses the current env's fs (in self).
- def _canonicalize(self, path):
- if not SCons.Util.is_String(path): # typically a Dir
- path = str(path)
- if path and path[0] == '#':
- path = str(self.fs.Dir(path))
- return path
-
- def AppendENVPath(self, name, newpath, envname = 'ENV',
- sep = os.pathsep, delete_existing=1):
- """Append path elements to the path 'name' in the 'ENV'
- dictionary for this environment. Will only add any particular
- path once, and will normpath and normcase all paths to help
- assure this. This can also handle the case where the env
- variable is a list instead of a string.
-
- If delete_existing is 0, a newpath which is already in the path
- will not be moved to the end (it will be left where it is).
- """
-
- orig = ''
- if envname in self._dict and name in self._dict[envname]:
- orig = self._dict[envname][name]
-
- nv = SCons.Util.AppendPath(orig, newpath, sep, delete_existing,
- canonicalize=self._canonicalize)
-
- if envname not in self._dict:
- self._dict[envname] = {}
-
- self._dict[envname][name] = nv
-
- def AppendUnique(self, delete_existing=0, **kw):
- """Append values to existing construction variables
- in an Environment, if they're not already there.
- If delete_existing is 1, removes existing values first, so
- values move to end.
- """
- kw = copy_non_reserved_keywords(kw)
- for key, val in kw.items():
- if SCons.Util.is_List(val):
- val = _delete_duplicates(val, delete_existing)
- if key not in self._dict or self._dict[key] in ('', None):
- self._dict[key] = val
- elif SCons.Util.is_Dict(self._dict[key]) and \
- SCons.Util.is_Dict(val):
- self._dict[key].update(val)
- elif SCons.Util.is_List(val):
- dk = self._dict[key]
- if key == 'CPPDEFINES':
- tmp = []
- for i in val:
- if SCons.Util.is_List(i):
- if len(i) >= 2:
- tmp.append((i[0], i[1]))
- else:
- tmp.append((i[0],))
- elif SCons.Util.is_Tuple(i):
- tmp.append(i)
- else:
- tmp.append((i,))
- val = tmp
- # Construct a list of (key, value) tuples.
- if SCons.Util.is_Dict(dk):
- tmp = []
- for (k, v) in dk.iteritems():
- if v is not None:
- tmp.append((k, v))
- else:
- tmp.append((k,))
- dk = tmp
- elif SCons.Util.is_String(dk):
- dk = [(dk,)]
- else:
- tmp = []
- for i in dk:
- if SCons.Util.is_List(i):
- if len(i) >= 2:
- tmp.append((i[0], i[1]))
- else:
- tmp.append((i[0],))
- elif SCons.Util.is_Tuple(i):
- tmp.append(i)
- else:
- tmp.append((i,))
- dk = tmp
- else:
- if not SCons.Util.is_List(dk):
- dk = [dk]
- if delete_existing:
- dk = [x for x in dk if x not in val]
- else:
- val = [x for x in val if x not in dk]
- self._dict[key] = dk + val
- else:
- dk = self._dict[key]
- if SCons.Util.is_List(dk):
- if key == 'CPPDEFINES':
- tmp = []
- for i in dk:
- if SCons.Util.is_List(i):
- if len(i) >= 2:
- tmp.append((i[0], i[1]))
- else:
- tmp.append((i[0],))
- elif SCons.Util.is_Tuple(i):
- tmp.append(i)
- else:
- tmp.append((i,))
- dk = tmp
- # Construct a list of (key, value) tuples.
- if SCons.Util.is_Dict(val):
- tmp = []
- for (k, v) in val.iteritems():
- if v is not None:
- tmp.append((k, v))
- else:
- tmp.append((k,))
- val = tmp
- elif SCons.Util.is_String(val):
- val = [(val,)]
- if delete_existing:
- dk = filter(lambda x, val=val: x not in val, dk)
- self._dict[key] = dk + val
- else:
- dk = [x for x in dk if x not in val]
- self._dict[key] = dk + val
- else:
- # By elimination, val is not a list. Since dk is a
- # list, wrap val in a list first.
- if delete_existing:
- dk = filter(lambda x, val=val: x not in val, dk)
- self._dict[key] = dk + [val]
- else:
- if not val in dk:
- self._dict[key] = dk + [val]
- else:
- if key == 'CPPDEFINES':
- if SCons.Util.is_String(dk):
- dk = [dk]
- elif SCons.Util.is_Dict(dk):
- tmp = []
- for (k, v) in dk.iteritems():
- if v is not None:
- tmp.append((k, v))
- else:
- tmp.append((k,))
- dk = tmp
- if SCons.Util.is_String(val):
- if val in dk:
- val = []
- else:
- val = [val]
- elif SCons.Util.is_Dict(val):
- tmp = []
- for i,j in val.iteritems():
- if j is not None:
- tmp.append((i,j))
- else:
- tmp.append(i)
- val = tmp
- if delete_existing:
- dk = [x for x in dk if x not in val]
- self._dict[key] = dk + val
- self.scanner_map_delete(kw)
-
- def Clone(self, tools=[], toolpath=None, parse_flags = None, **kw):
- """Return a copy of a construction Environment. The
- copy is like a Python "deep copy"--that is, independent
- copies are made recursively of each objects--except that
- a reference is copied when an object is not deep-copyable
- (like a function). There are no references to any mutable
- objects in the original Environment.
- """
-
- builders = self._dict.get('BUILDERS', {})
-
- clone = copy.copy(self)
- # BUILDERS is not safe to do a simple copy
- clone._dict = semi_deepcopy_dict(self._dict, ['BUILDERS'])
- clone._dict['BUILDERS'] = BuilderDict(builders, clone)
-
- # Check the methods added via AddMethod() and re-bind them to
- # the cloned environment. Only do this if the attribute hasn't
- # been overwritten by the user explicitly and still points to
- # the added method.
- clone.added_methods = []
- for mw in self.added_methods:
- if mw == getattr(self, mw.name):
- clone.added_methods.append(mw.clone(clone))
-
- clone._memo = {}
-
- # Apply passed-in variables before the tools
- # so the tools can use the new variables
- kw = copy_non_reserved_keywords(kw)
- new = {}
- for key, value in kw.items():
- new[key] = SCons.Subst.scons_subst_once(value, self, key)
- clone.Replace(**new)
-
- apply_tools(clone, tools, toolpath)
-
- # apply them again in case the tools overwrote them
- clone.Replace(**new)
-
- # Finally, apply any flags to be merged in
- if parse_flags: clone.MergeFlags(parse_flags)
-
- if SCons.Debug.track_instances: logInstanceCreation(self, 'Environment.EnvironmentClone')
- return clone
-
- def Copy(self, *args, **kw):
- global _warn_copy_deprecated
- if _warn_copy_deprecated:
- msg = "The env.Copy() method is deprecated; use the env.Clone() method instead."
- SCons.Warnings.warn(SCons.Warnings.DeprecatedCopyWarning, msg)
- _warn_copy_deprecated = False
- return self.Clone(*args, **kw)
-
- def _changed_build(self, dependency, target, prev_ni):
- if dependency.changed_state(target, prev_ni):
- return 1
- return self.decide_source(dependency, target, prev_ni)
-
- def _changed_content(self, dependency, target, prev_ni):
- return dependency.changed_content(target, prev_ni)
-
- def _changed_source(self, dependency, target, prev_ni):
- target_env = dependency.get_build_env()
- type = target_env.get_tgt_sig_type()
- if type == 'source':
- return target_env.decide_source(dependency, target, prev_ni)
- else:
- return target_env.decide_target(dependency, target, prev_ni)
-
- def _changed_timestamp_then_content(self, dependency, target, prev_ni):
- return dependency.changed_timestamp_then_content(target, prev_ni)
-
- def _changed_timestamp_newer(self, dependency, target, prev_ni):
- return dependency.changed_timestamp_newer(target, prev_ni)
-
- def _changed_timestamp_match(self, dependency, target, prev_ni):
- return dependency.changed_timestamp_match(target, prev_ni)
-
- def _copy_from_cache(self, src, dst):
- return self.fs.copy(src, dst)
-
- def _copy2_from_cache(self, src, dst):
- return self.fs.copy2(src, dst)
-
- def Decider(self, function):
- copy_function = self._copy2_from_cache
- if function in ('MD5', 'content'):
- if not SCons.Util.md5:
- raise UserError("MD5 signatures are not available in this version of Python.")
- function = self._changed_content
- elif function == 'MD5-timestamp':
- function = self._changed_timestamp_then_content
- elif function in ('timestamp-newer', 'make'):
- function = self._changed_timestamp_newer
- copy_function = self._copy_from_cache
- elif function == 'timestamp-match':
- function = self._changed_timestamp_match
- elif not callable(function):
- raise UserError("Unknown Decider value %s" % repr(function))
-
- # We don't use AddMethod because we don't want to turn the
- # function, which only expects three arguments, into a bound
- # method, which would add self as an initial, fourth argument.
- self.decide_target = function
- self.decide_source = function
-
- self.copy_from_cache = copy_function
-
- def Detect(self, progs):
- """Return the first available program in progs.
- """
- if not SCons.Util.is_List(progs):
- progs = [ progs ]
- for prog in progs:
- path = self.WhereIs(prog)
- if path: return prog
- return None
-
- def Dictionary(self, *args):
- if not args:
- return self._dict
- dlist = [self._dict[x] for x in args]
- if len(dlist) == 1:
- dlist = dlist[0]
- return dlist
-
- def Dump(self, key = None):
- """
- Using the standard Python pretty printer, return the contents of the
- scons build environment as a string.
-
- If the key passed in is anything other than None, then that will
- be used as an index into the build environment dictionary and
- whatever is found there will be fed into the pretty printer. Note
- that this key is case sensitive.
- """
- import pprint
- pp = pprint.PrettyPrinter(indent=2)
- if key:
- dict = self.Dictionary(key)
- else:
- dict = self.Dictionary()
- return pp.pformat(dict)
-
- def FindIxes(self, paths, prefix, suffix):
- """
- Search a list of paths for something that matches the prefix and suffix.
-
- paths - the list of paths or nodes.
- prefix - construction variable for the prefix.
- suffix - construction variable for the suffix.
- """
-
- suffix = self.subst('$'+suffix)
- prefix = self.subst('$'+prefix)
-
- for path in paths:
- dir,name = os.path.split(str(path))
- if name[:len(prefix)] == prefix and name[-len(suffix):] == suffix:
- return path
-
- def ParseConfig(self, command, function=None, unique=1):
- """
- Use the specified function to parse the output of the command
- in order to modify the current environment. The 'command' can
- be a string or a list of strings representing a command and
- its arguments. 'Function' is an optional argument that takes
- the environment, the output of the command, and the unique flag.
- If no function is specified, MergeFlags, which treats the output
- as the result of a typical 'X-config' command (i.e. gtk-config),
- will merge the output into the appropriate variables.
- """
- if function is None:
- def parse_conf(env, cmd, unique=unique):
- return env.MergeFlags(cmd, unique)
- function = parse_conf
- if SCons.Util.is_List(command):
- command = ' '.join(command)
- command = self.subst(command)
- return function(self, self.backtick(command))
-
- def ParseDepends(self, filename, must_exist=None, only_one=0):
- """
- Parse a mkdep-style file for explicit dependencies. This is
- completely abusable, and should be unnecessary in the "normal"
- case of proper SCons configuration, but it may help make
- the transition from a Make hierarchy easier for some people
- to swallow. It can also be genuinely useful when using a tool
- that can write a .d file, but for which writing a scanner would
- be too complicated.
- """
- filename = self.subst(filename)
- try:
- fp = open(filename, 'r')
- except IOError:
- if must_exist:
- raise
- return
- lines = SCons.Util.LogicalLines(fp).readlines()
- lines = [l for l in lines if l[0] != '#']
- tdlist = []
- for line in lines:
- try:
- target, depends = line.split(':', 1)
- except (AttributeError, ValueError):
- # Throws AttributeError if line isn't a string. Can throw
- # ValueError if line doesn't split into two or more elements.
- pass
- else:
- tdlist.append((target.split(), depends.split()))
- if only_one:
- targets = []
- for td in tdlist:
- targets.extend(td[0])
- if len(targets) > 1:
- raise SCons.Errors.UserError(
- "More than one dependency target found in `%s': %s"
- % (filename, targets))
- for target, depends in tdlist:
- self.Depends(target, depends)
-
- def Platform(self, platform):
- platform = self.subst(platform)
- return SCons.Platform.Platform(platform)(self)
-
- def Prepend(self, **kw):
- """Prepend values to existing construction variables
- in an Environment.
- """
- kw = copy_non_reserved_keywords(kw)
- for key, val in kw.items():
- # It would be easier on the eyes to write this using
- # "continue" statements whenever we finish processing an item,
- # but Python 1.5.2 apparently doesn't let you use "continue"
- # within try:-except: blocks, so we have to nest our code.
- try:
- orig = self._dict[key]
- except KeyError:
- # No existing variable in the environment, so just set
- # it to the new value.
- self._dict[key] = val
- else:
- try:
- # Check if the original looks like a dictionary.
- # If it is, we can't just try adding the value because
- # dictionaries don't have __add__() methods, and
- # things like UserList will incorrectly coerce the
- # original dict to a list (which we don't want).
- update_dict = orig.update
- except AttributeError:
- try:
- # Most straightforward: just try to add them
- # together. This will work in most cases, when the
- # original and new values are of compatible types.
- self._dict[key] = val + orig
- except (KeyError, TypeError):
- try:
- # Check if the added value is a list.
- add_to_val = val.append
- except AttributeError:
- # The added value isn't a list, but the
- # original is (by process of elimination),
- # so insert the the new value in the original
- # (if there's one to insert).
- if val:
- orig.insert(0, val)
- else:
- # The added value is a list, so append
- # the original to it (if there's a value
- # to append).
- if orig:
- add_to_val(orig)
- self._dict[key] = val
- else:
- # The original looks like a dictionary, so update it
- # based on what we think the value looks like.
- if SCons.Util.is_List(val):
- for v in val:
- orig[v] = None
- else:
- try:
- update_dict(val)
- except (AttributeError, TypeError, ValueError):
- if SCons.Util.is_Dict(val):
- for k, v in val.items():
- orig[k] = v
- else:
- orig[val] = None
- self.scanner_map_delete(kw)
-
- def PrependENVPath(self, name, newpath, envname = 'ENV', sep = os.pathsep,
- delete_existing=1):
- """Prepend path elements to the path 'name' in the 'ENV'
- dictionary for this environment. Will only add any particular
- path once, and will normpath and normcase all paths to help
- assure this. This can also handle the case where the env
- variable is a list instead of a string.
-
- If delete_existing is 0, a newpath which is already in the path
- will not be moved to the front (it will be left where it is).
- """
-
- orig = ''
- if envname in self._dict and name in self._dict[envname]:
- orig = self._dict[envname][name]
-
- nv = SCons.Util.PrependPath(orig, newpath, sep, delete_existing,
- canonicalize=self._canonicalize)
-
- if envname not in self._dict:
- self._dict[envname] = {}
-
- self._dict[envname][name] = nv
-
- def PrependUnique(self, delete_existing=0, **kw):
- """Prepend values to existing construction variables
- in an Environment, if they're not already there.
- If delete_existing is 1, removes existing values first, so
- values move to front.
- """
- kw = copy_non_reserved_keywords(kw)
- for key, val in kw.items():
- if SCons.Util.is_List(val):
- val = _delete_duplicates(val, not delete_existing)
- if key not in self._dict or self._dict[key] in ('', None):
- self._dict[key] = val
- elif SCons.Util.is_Dict(self._dict[key]) and \
- SCons.Util.is_Dict(val):
- self._dict[key].update(val)
- elif SCons.Util.is_List(val):
- dk = self._dict[key]
- if not SCons.Util.is_List(dk):
- dk = [dk]
- if delete_existing:
- dk = [x for x in dk if x not in val]
- else:
- val = [x for x in val if x not in dk]
- self._dict[key] = val + dk
- else:
- dk = self._dict[key]
- if SCons.Util.is_List(dk):
- # By elimination, val is not a list. Since dk is a
- # list, wrap val in a list first.
- if delete_existing:
- dk = [x for x in dk if x not in val]
- self._dict[key] = [val] + dk
- else:
- if not val in dk:
- self._dict[key] = [val] + dk
- else:
- if delete_existing:
- dk = [x for x in dk if x not in val]
- self._dict[key] = val + dk
- self.scanner_map_delete(kw)
-
- def Replace(self, **kw):
- """Replace existing construction variables in an Environment
- with new construction variables and/or values.
- """
- try:
- kwbd = kw['BUILDERS']
- except KeyError:
- pass
- else:
- kwbd = BuilderDict(kwbd,self)
- del kw['BUILDERS']
- self.__setitem__('BUILDERS', kwbd)
- kw = copy_non_reserved_keywords(kw)
- self._update(semi_deepcopy(kw))
- self.scanner_map_delete(kw)
-
- def ReplaceIxes(self, path, old_prefix, old_suffix, new_prefix, new_suffix):
- """
- Replace old_prefix with new_prefix and old_suffix with new_suffix.
-
- env - Environment used to interpolate variables.
- path - the path that will be modified.
- old_prefix - construction variable for the old prefix.
- old_suffix - construction variable for the old suffix.
- new_prefix - construction variable for the new prefix.
- new_suffix - construction variable for the new suffix.
- """
- old_prefix = self.subst('$'+old_prefix)
- old_suffix = self.subst('$'+old_suffix)
-
- new_prefix = self.subst('$'+new_prefix)
- new_suffix = self.subst('$'+new_suffix)
-
- dir,name = os.path.split(str(path))
- if name[:len(old_prefix)] == old_prefix:
- name = name[len(old_prefix):]
- if name[-len(old_suffix):] == old_suffix:
- name = name[:-len(old_suffix)]
- return os.path.join(dir, new_prefix+name+new_suffix)
-
- def SetDefault(self, **kw):
- for k in kw.keys():
- if k in self._dict:
- del kw[k]
- self.Replace(**kw)
-
- def _find_toolpath_dir(self, tp):
- return self.fs.Dir(self.subst(tp)).srcnode().get_abspath()
-
- def Tool(self, tool, toolpath=None, **kw):
- if SCons.Util.is_String(tool):
- tool = self.subst(tool)
- if toolpath is None:
- toolpath = self.get('toolpath', [])
- toolpath = list(map(self._find_toolpath_dir, toolpath))
- tool = SCons.Tool.Tool(tool, toolpath, **kw)
- tool(self)
-
- def WhereIs(self, prog, path=None, pathext=None, reject=[]):
- """Find prog in the path.
- """
- if path is None:
- try:
- path = self['ENV']['PATH']
- except KeyError:
- pass
- elif SCons.Util.is_String(path):
- path = self.subst(path)
- if pathext is None:
- try:
- pathext = self['ENV']['PATHEXT']
- except KeyError:
- pass
- elif SCons.Util.is_String(pathext):
- pathext = self.subst(pathext)
- prog = SCons.Util.CLVar(self.subst(prog)) # support "program --with-args"
- path = SCons.Util.WhereIs(prog[0], path, pathext, reject)
- if path: return path
- return None
-
- #######################################################################
- # Public methods for doing real "SCons stuff" (manipulating
- # dependencies, setting attributes on targets, etc.). These begin
- # with upper-case letters. The essential characteristic of methods
- # in this section is that they all *should* have corresponding
- # same-named global functions.
- #######################################################################
-
- def Action(self, *args, **kw):
- def subst_string(a, self=self):
- if SCons.Util.is_String(a):
- a = self.subst(a)
- return a
- nargs = list(map(subst_string, args))
- nkw = self.subst_kw(kw)
- return SCons.Action.Action(*nargs, **nkw)
-
- def AddPreAction(self, files, action):
- nodes = self.arg2nodes(files, self.fs.Entry)
- action = SCons.Action.Action(action)
- uniq = {}
- for executor in [n.get_executor() for n in nodes]:
- uniq[executor] = 1
- for executor in uniq.keys():
- executor.add_pre_action(action)
- return nodes
-
- def AddPostAction(self, files, action):
- nodes = self.arg2nodes(files, self.fs.Entry)
- action = SCons.Action.Action(action)
- uniq = {}
- for executor in [n.get_executor() for n in nodes]:
- uniq[executor] = 1
- for executor in uniq.keys():
- executor.add_post_action(action)
- return nodes
-
- def Alias(self, target, source=[], action=None, **kw):
- tlist = self.arg2nodes(target, self.ans.Alias)
- if not SCons.Util.is_List(source):
- source = [source]
- source = [_f for _f in source if _f]
-
- if not action:
- if not source:
- # There are no source files and no action, so just
- # return a target list of classic Alias Nodes, without
- # any builder. The externally visible effect is that
- # this will make the wrapping Script.BuildTask class
- # say that there's "Nothing to be done" for this Alias,
- # instead of that it's "up to date."
- return tlist
-
- # No action, but there are sources. Re-call all the target
- # builders to add the sources to each target.
- result = []
- for t in tlist:
- bld = t.get_builder(AliasBuilder)
- result.extend(bld(self, t, source))
- return result
-
- nkw = self.subst_kw(kw)
- nkw.update({
- 'action' : SCons.Action.Action(action),
- 'source_factory' : self.fs.Entry,
- 'multi' : 1,
- 'is_explicit' : None,
- })
- bld = SCons.Builder.Builder(**nkw)
-
- # Apply the Builder separately to each target so that the Aliases
- # stay separate. If we did one "normal" Builder call with the
- # whole target list, then all of the target Aliases would be
- # associated under a single Executor.
- result = []
- for t in tlist:
- # Calling the convert() method will cause a new Executor to be
- # created from scratch, so we have to explicitly initialize
- # it with the target's existing sources, plus our new ones,
- # so nothing gets lost.
- b = t.get_builder()
- if b is None or b is AliasBuilder:
- b = bld
- else:
- nkw['action'] = b.action + action
- b = SCons.Builder.Builder(**nkw)
- t.convert()
- result.extend(b(self, t, t.sources + source))
- return result
-
- def AlwaysBuild(self, *targets):
- tlist = []
- for t in targets:
- tlist.extend(self.arg2nodes(t, self.fs.Entry))
- for t in tlist:
- t.set_always_build()
- return tlist
-
- def BuildDir(self, *args, **kw):
- msg = """BuildDir() and the build_dir keyword have been deprecated;\n\tuse VariantDir() and the variant_dir keyword instead."""
- SCons.Warnings.warn(SCons.Warnings.DeprecatedBuildDirWarning, msg)
- if 'build_dir' in kw:
- kw['variant_dir'] = kw['build_dir']
- del kw['build_dir']
- return self.VariantDir(*args, **kw)
-
- def Builder(self, **kw):
- nkw = self.subst_kw(kw)
- return SCons.Builder.Builder(**nkw)
-
- def CacheDir(self, path):
- import SCons.CacheDir
- if path is not None:
- path = self.subst(path)
- self._CacheDir_path = path
-
- def Clean(self, targets, files):
- global CleanTargets
- tlist = self.arg2nodes(targets, self.fs.Entry)
- flist = self.arg2nodes(files, self.fs.Entry)
- for t in tlist:
- try:
- CleanTargets[t].extend(flist)
- except KeyError:
- CleanTargets[t] = flist
-
- def Configure(self, *args, **kw):
- nargs = [self]
- if args:
- nargs = nargs + self.subst_list(args)[0]
- nkw = self.subst_kw(kw)
- nkw['_depth'] = kw.get('_depth', 0) + 1
- try:
- nkw['custom_tests'] = self.subst_kw(nkw['custom_tests'])
- except KeyError:
- pass
- return SCons.SConf.SConf(*nargs, **nkw)
-
- def Command(self, target, source, action, **kw):
- """Builds the supplied target files from the supplied
- source files using the supplied action. Action may
- be any type that the Builder constructor will accept
- for an action."""
- bkw = {
- 'action' : action,
- 'target_factory' : self.fs.Entry,
- 'source_factory' : self.fs.Entry,
- }
- try: bkw['source_scanner'] = kw['source_scanner']
- except KeyError: pass
- else: del kw['source_scanner']
- bld = SCons.Builder.Builder(**bkw)
- return bld(self, target, source, **kw)
-
- def Depends(self, target, dependency):
- """Explicity specify that 'target's depend on 'dependency'."""
- tlist = self.arg2nodes(target, self.fs.Entry)
- dlist = self.arg2nodes(dependency, self.fs.Entry)
- for t in tlist:
- t.add_dependency(dlist)
- return tlist
-
- def Dir(self, name, *args, **kw):
- """
- """
- s = self.subst(name)
- if SCons.Util.is_Sequence(s):
- result=[]
- for e in s:
- result.append(self.fs.Dir(e, *args, **kw))
- return result
- return self.fs.Dir(s, *args, **kw)
-
- def NoClean(self, *targets):
- """Tags a target so that it will not be cleaned by -c"""
- tlist = []
- for t in targets:
- tlist.extend(self.arg2nodes(t, self.fs.Entry))
- for t in tlist:
- t.set_noclean()
- return tlist
-
- def NoCache(self, *targets):
- """Tags a target so that it will not be cached"""
- tlist = []
- for t in targets:
- tlist.extend(self.arg2nodes(t, self.fs.Entry))
- for t in tlist:
- t.set_nocache()
- return tlist
-
- def Entry(self, name, *args, **kw):
- """
- """
- s = self.subst(name)
- if SCons.Util.is_Sequence(s):
- result=[]
- for e in s:
- result.append(self.fs.Entry(e, *args, **kw))
- return result
- return self.fs.Entry(s, *args, **kw)
-
- def Environment(self, **kw):
- return SCons.Environment.Environment(**self.subst_kw(kw))
-
- def Execute(self, action, *args, **kw):
- """Directly execute an action through an Environment
- """
- action = self.Action(action, *args, **kw)
- result = action([], [], self)
- if isinstance(result, SCons.Errors.BuildError):
- errstr = result.errstr
- if result.filename:
- errstr = result.filename + ': ' + errstr
- sys.stderr.write("scons: *** %s\n" % errstr)
- return result.status
- else:
- return result
-
- def File(self, name, *args, **kw):
- """
- """
- s = self.subst(name)
- if SCons.Util.is_Sequence(s):
- result=[]
- for e in s:
- result.append(self.fs.File(e, *args, **kw))
- return result
- return self.fs.File(s, *args, **kw)
-
- def FindFile(self, file, dirs):
- file = self.subst(file)
- nodes = self.arg2nodes(dirs, self.fs.Dir)
- return SCons.Node.FS.find_file(file, tuple(nodes))
-
- def Flatten(self, sequence):
- return SCons.Util.flatten(sequence)
-
- def GetBuildPath(self, files):
- result = list(map(str, self.arg2nodes(files, self.fs.Entry)))
- if SCons.Util.is_List(files):
- return result
- else:
- return result[0]
-
- def Glob(self, pattern, ondisk=True, source=False, strings=False, exclude=None):
- return self.fs.Glob(self.subst(pattern), ondisk, source, strings, exclude)
-
- def Ignore(self, target, dependency):
- """Ignore a dependency."""
- tlist = self.arg2nodes(target, self.fs.Entry)
- dlist = self.arg2nodes(dependency, self.fs.Entry)
- for t in tlist:
- t.add_ignore(dlist)
- return tlist
-
- def Literal(self, string):
- return SCons.Subst.Literal(string)
-
- def Local(self, *targets):
- ret = []
- for targ in targets:
- if isinstance(targ, SCons.Node.Node):
- targ.set_local()
- ret.append(targ)
- else:
- for t in self.arg2nodes(targ, self.fs.Entry):
- t.set_local()
- ret.append(t)
- return ret
-
- def Precious(self, *targets):
- tlist = []
- for t in targets:
- tlist.extend(self.arg2nodes(t, self.fs.Entry))
- for t in tlist:
- t.set_precious()
- return tlist
-
- def Pseudo(self, *targets):
- tlist = []
- for t in targets:
- tlist.extend(self.arg2nodes(t, self.fs.Entry))
- for t in tlist:
- t.set_pseudo()
- return tlist
-
- def Repository(self, *dirs, **kw):
- dirs = self.arg2nodes(list(dirs), self.fs.Dir)
- self.fs.Repository(*dirs, **kw)
-
- def Requires(self, target, prerequisite):
- """Specify that 'prerequisite' must be built before 'target',
- (but 'target' does not actually depend on 'prerequisite'
- and need not be rebuilt if it changes)."""
- tlist = self.arg2nodes(target, self.fs.Entry)
- plist = self.arg2nodes(prerequisite, self.fs.Entry)
- for t in tlist:
- t.add_prerequisite(plist)
- return tlist
-
- def Scanner(self, *args, **kw):
- nargs = []
- for arg in args:
- if SCons.Util.is_String(arg):
- arg = self.subst(arg)
- nargs.append(arg)
- nkw = self.subst_kw(kw)
- return SCons.Scanner.Base(*nargs, **nkw)
-
- def SConsignFile(self, name=".sconsign", dbm_module=None):
- if name is not None:
- name = self.subst(name)
- if not os.path.isabs(name):
- name = os.path.join(str(self.fs.SConstruct_dir), name)
- if name:
- name = os.path.normpath(name)
- sconsign_dir = os.path.dirname(name)
- if sconsign_dir and not os.path.exists(sconsign_dir):
- self.Execute(SCons.Defaults.Mkdir(sconsign_dir))
- SCons.SConsign.File(name, dbm_module)
-
- def SideEffect(self, side_effect, target):
- """Tell scons that side_effects are built as side
- effects of building targets."""
- side_effects = self.arg2nodes(side_effect, self.fs.Entry)
- targets = self.arg2nodes(target, self.fs.Entry)
-
- for side_effect in side_effects:
- if side_effect.multiple_side_effect_has_builder():
- raise SCons.Errors.UserError("Multiple ways to build the same target were specified for: %s" % str(side_effect))
- side_effect.add_source(targets)
- side_effect.side_effect = 1
- self.Precious(side_effect)
- for target in targets:
- target.side_effects.append(side_effect)
- return side_effects
-
- def SourceCode(self, entry, builder):
- """Arrange for a source code builder for (part of) a tree."""
- msg = """SourceCode() has been deprecated and there is no replacement.
-\tIf you need this function, please contact scons-dev@scons.org"""
- SCons.Warnings.warn(SCons.Warnings.DeprecatedSourceCodeWarning, msg)
- entries = self.arg2nodes(entry, self.fs.Entry)
- for entry in entries:
- entry.set_src_builder(builder)
- return entries
-
- def SourceSignatures(self, type):
- global _warn_source_signatures_deprecated
- if _warn_source_signatures_deprecated:
- msg = "The env.SourceSignatures() method is deprecated;\n" + \
- "\tconvert your build to use the env.Decider() method instead."
- SCons.Warnings.warn(SCons.Warnings.DeprecatedSourceSignaturesWarning, msg)
- _warn_source_signatures_deprecated = False
- type = self.subst(type)
- self.src_sig_type = type
- if type == 'MD5':
- if not SCons.Util.md5:
- raise UserError("MD5 signatures are not available in this version of Python.")
- self.decide_source = self._changed_content
- elif type == 'timestamp':
- self.decide_source = self._changed_timestamp_match
- else:
- raise UserError("Unknown source signature type '%s'" % type)
-
- def Split(self, arg):
- """This function converts a string or list into a list of strings
- or Nodes. This makes things easier for users by allowing files to
- be specified as a white-space separated list to be split.
- The input rules are:
- - A single string containing names separated by spaces. These will be
- split apart at the spaces.
- - A single Node instance
- - A list containing either strings or Node instances. Any strings
- in the list are not split at spaces.
- In all cases, the function returns a list of Nodes and strings."""
- if SCons.Util.is_List(arg):
- return list(map(self.subst, arg))
- elif SCons.Util.is_String(arg):
- return self.subst(arg).split()
- else:
- return [self.subst(arg)]
-
- def TargetSignatures(self, type):
- global _warn_target_signatures_deprecated
- if _warn_target_signatures_deprecated:
- msg = "The env.TargetSignatures() method is deprecated;\n" + \
- "\tconvert your build to use the env.Decider() method instead."
- SCons.Warnings.warn(SCons.Warnings.DeprecatedTargetSignaturesWarning, msg)
- _warn_target_signatures_deprecated = False
- type = self.subst(type)
- self.tgt_sig_type = type
- if type in ('MD5', 'content'):
- if not SCons.Util.md5:
- raise UserError("MD5 signatures are not available in this version of Python.")
- self.decide_target = self._changed_content
- elif type == 'timestamp':
- self.decide_target = self._changed_timestamp_match
- elif type == 'build':
- self.decide_target = self._changed_build
- elif type == 'source':
- self.decide_target = self._changed_source
- else:
- raise UserError("Unknown target signature type '%s'"%type)
-
- def Value(self, value, built_value=None):
- """
- """
- return SCons.Node.Python.Value(value, built_value)
-
- def VariantDir(self, variant_dir, src_dir, duplicate=1):
- variant_dir = self.arg2nodes(variant_dir, self.fs.Dir)[0]
- src_dir = self.arg2nodes(src_dir, self.fs.Dir)[0]
- self.fs.VariantDir(variant_dir, src_dir, duplicate)
-
- def FindSourceFiles(self, node='.'):
- """ returns a list of all source files.
- """
- node = self.arg2nodes(node, self.fs.Entry)[0]
-
- sources = []
- def build_source(ss):
- for s in ss:
- if isinstance(s, SCons.Node.FS.Dir):
- build_source(s.all_children())
- elif s.has_builder():
- build_source(s.sources)
- elif isinstance(s.disambiguate(), SCons.Node.FS.File):
- sources.append(s)
- build_source(node.all_children())
-
- def final_source(node):
- while (node != node.srcnode()):
- node = node.srcnode()
- return node
- sources = map( final_source, sources );
- # remove duplicates
- return list(set(sources))
-
- def FindInstalledFiles(self):
- """ returns the list of all targets of the Install and InstallAs Builder.
- """
- from SCons.Tool import install
- if install._UNIQUE_INSTALLED_FILES is None:
- install._UNIQUE_INSTALLED_FILES = SCons.Util.uniquer_hashables(install._INSTALLED_FILES)
- return install._UNIQUE_INSTALLED_FILES
-
-
-class OverrideEnvironment(Base):
- """A proxy that overrides variables in a wrapped construction
- environment by returning values from an overrides dictionary in
- preference to values from the underlying subject environment.
-
- This is a lightweight (I hope) proxy that passes through most use of
- attributes to the underlying Environment.Base class, but has just
- enough additional methods defined to act like a real construction
- environment with overridden values. It can wrap either a Base
- construction environment, or another OverrideEnvironment, which
- can in turn nest arbitrary OverrideEnvironments...
-
- Note that we do *not* call the underlying base class
- (SubsitutionEnvironment) initialization, because we get most of those
- from proxying the attributes of the subject construction environment.
- But because we subclass SubstitutionEnvironment, this class also
- has inherited arg2nodes() and subst*() methods; those methods can't
- be proxied because they need *this* object's methods to fetch the
- values from the overrides dictionary.
- """
-
- def __init__(self, subject, overrides={}):
- if SCons.Debug.track_instances: logInstanceCreation(self, 'Environment.OverrideEnvironment')
- self.__dict__['__subject'] = subject
- self.__dict__['overrides'] = overrides
-
- # Methods that make this class act like a proxy.
- def __getattr__(self, name):
- return getattr(self.__dict__['__subject'], name)
- def __setattr__(self, name, value):
- setattr(self.__dict__['__subject'], name, value)
-
- # Methods that make this class act like a dictionary.
- def __getitem__(self, key):
- try:
- return self.__dict__['overrides'][key]
- except KeyError:
- return self.__dict__['__subject'].__getitem__(key)
- def __setitem__(self, key, value):
- if not is_valid_construction_var(key):
- raise SCons.Errors.UserError("Illegal construction variable `%s'" % key)
- self.__dict__['overrides'][key] = value
- def __delitem__(self, key):
- try:
- del self.__dict__['overrides'][key]
- except KeyError:
- deleted = 0
- else:
- deleted = 1
- try:
- result = self.__dict__['__subject'].__delitem__(key)
- except KeyError:
- if not deleted:
- raise
- result = None
- return result
- def get(self, key, default=None):
- """Emulates the get() method of dictionaries."""
- try:
- return self.__dict__['overrides'][key]
- except KeyError:
- return self.__dict__['__subject'].get(key, default)
- def has_key(self, key):
- try:
- self.__dict__['overrides'][key]
- return 1
- except KeyError:
- return key in self.__dict__['__subject']
- def __contains__(self, key):
- if self.__dict__['overrides'].__contains__(key):
- return 1
- return self.__dict__['__subject'].__contains__(key)
- def Dictionary(self):
- """Emulates the items() method of dictionaries."""
- d = self.__dict__['__subject'].Dictionary().copy()
- d.update(self.__dict__['overrides'])
- return d
- def items(self):
- """Emulates the items() method of dictionaries."""
- return list(self.Dictionary().items())
-
- # Overridden private construction environment methods.
- def _update(self, dict):
- """Update an environment's values directly, bypassing the normal
- checks that occur when users try to set items.
- """
- self.__dict__['overrides'].update(dict)
-
- def gvars(self):
- return self.__dict__['__subject'].gvars()
-
- def lvars(self):
- lvars = self.__dict__['__subject'].lvars()
- lvars.update(self.__dict__['overrides'])
- return lvars
-
- # Overridden public construction environment methods.
- def Replace(self, **kw):
- kw = copy_non_reserved_keywords(kw)
- self.__dict__['overrides'].update(semi_deepcopy(kw))
-
-# The entry point that will be used by the external world
-# to refer to a construction environment. This allows the wrapper
-# interface to extend a construction environment for its own purposes
-# by subclassing SCons.Environment.Base and then assigning the
-# class to SCons.Environment.Environment.
-
-Environment = Base
-
-# An entry point for returning a proxy subclass instance that overrides
-# the subst*() methods so they don't actually perform construction
-# variable substitution. This is specifically intended to be the shim
-# layer in between global function calls (which don't want construction
-# variable substitution) and the DefaultEnvironment() (which would
-# substitute variables if left to its own devices)."""
-#
-# We have to wrap this in a function that allows us to delay definition of
-# the class until it's necessary, so that when it subclasses Environment
-# it will pick up whatever Environment subclass the wrapper interface
-# might have assigned to SCons.Environment.Environment.
-
-def NoSubstitutionProxy(subject):
- class _NoSubstitutionProxy(Environment):
- def __init__(self, subject):
- self.__dict__['__subject'] = subject
- def __getattr__(self, name):
- return getattr(self.__dict__['__subject'], name)
- def __setattr__(self, name, value):
- return setattr(self.__dict__['__subject'], name, value)
- def executor_to_lvars(self, kwdict):
- if kwdict.has_key('executor'):
- kwdict['lvars'] = kwdict['executor'].get_lvars()
- del kwdict['executor']
- else:
- kwdict['lvars'] = {}
- def raw_to_mode(self, dict):
- try:
- raw = dict['raw']
- except KeyError:
- pass
- else:
- del dict['raw']
- dict['mode'] = raw
- def subst(self, string, *args, **kwargs):
- return string
- def subst_kw(self, kw, *args, **kwargs):
- return kw
- def subst_list(self, string, *args, **kwargs):
- nargs = (string, self,) + args
- nkw = kwargs.copy()
- nkw['gvars'] = {}
- self.executor_to_lvars(nkw)
- self.raw_to_mode(nkw)
- return SCons.Subst.scons_subst_list(*nargs, **nkw)
- def subst_target_source(self, string, *args, **kwargs):
- nargs = (string, self,) + args
- nkw = kwargs.copy()
- nkw['gvars'] = {}
- self.executor_to_lvars(nkw)
- self.raw_to_mode(nkw)
- return SCons.Subst.scons_subst(*nargs, **nkw)
- return _NoSubstitutionProxy(subject)
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Errors.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Errors.py
deleted file mode 100644
index 998a70d..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Errors.py
+++ /dev/null
@@ -1,205 +0,0 @@
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-
-"""SCons.Errors
-
-This file contains the exception classes used to handle internal
-and user errors in SCons.
-
-"""
-
-__revision__ = "src/engine/SCons/Errors.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-import SCons.Util
-
-import exceptions
-
-class BuildError(Exception):
- """ Errors occuring while building.
-
- BuildError have the following attributes:
-
- Information about the cause of the build error:
- -----------------------------------------------
-
- errstr : a description of the error message
-
- status : the return code of the action that caused the build
- error. Must be set to a non-zero value even if the
- build error is not due to an action returning a
- non-zero returned code.
-
- exitstatus : SCons exit status due to this build error.
- Must be nonzero unless due to an explicit Exit()
- call. Not always the same as status, since
- actions return a status code that should be
- respected, but SCons typically exits with 2
- irrespective of the return value of the failed
- action.
-
- filename : The name of the file or directory that caused the
- build error. Set to None if no files are associated with
- this error. This might be different from the target
- being built. For example, failure to create the
- directory in which the target file will appear. It
- can be None if the error is not due to a particular
- filename.
-
- exc_info : Info about exception that caused the build
- error. Set to (None, None, None) if this build
- error is not due to an exception.
-
-
- Information about the cause of the location of the error:
- ---------------------------------------------------------
-
- node : the error occured while building this target node(s)
-
- executor : the executor that caused the build to fail (might
- be None if the build failures is not due to the
- executor failing)
-
- action : the action that caused the build to fail (might be
- None if the build failures is not due to the an
- action failure)
-
- command : the command line for the action that caused the
- build to fail (might be None if the build failures
- is not due to the an action failure)
- """
-
- def __init__(self,
- node=None, errstr="Unknown error", status=2, exitstatus=2,
- filename=None, executor=None, action=None, command=None,
- exc_info=(None, None, None)):
-
- self.errstr = errstr
- self.status = status
- self.exitstatus = exitstatus
- self.filename = filename
- self.exc_info = exc_info
-
- self.node = node
- self.executor = executor
- self.action = action
- self.command = command
-
- Exception.__init__(self, node, errstr, status, exitstatus, filename,
- executor, action, command, exc_info)
-
- def __str__(self):
- if self.filename:
- return self.filename + ': ' + self.errstr
- else:
- return self.errstr
-
-class InternalError(Exception):
- pass
-
-class UserError(Exception):
- pass
-
-class StopError(Exception):
- pass
-
-class EnvironmentError(Exception):
- pass
-
-class MSVCError(IOError):
- pass
-
-class ExplicitExit(Exception):
- def __init__(self, node=None, status=None, *args):
- self.node = node
- self.status = status
- self.exitstatus = status
- Exception.__init__(self, *args)
-
-def convert_to_BuildError(status, exc_info=None):
- """
- Convert any return code a BuildError Exception.
-
- `status' can either be a return code or an Exception.
- The buildError.status we set here will normally be
- used as the exit status of the "scons" process.
- """
- if not exc_info and isinstance(status, Exception):
- exc_info = (status.__class__, status, None)
-
- if isinstance(status, BuildError):
- buildError = status
- buildError.exitstatus = 2 # always exit with 2 on build errors
- elif isinstance(status, ExplicitExit):
- status = status.status
- errstr = 'Explicit exit, status %s' % status
- buildError = BuildError(
- errstr=errstr,
- status=status, # might be 0, OK here
- exitstatus=status, # might be 0, OK here
- exc_info=exc_info)
- elif isinstance(status, (StopError, UserError)):
- buildError = BuildError(
- errstr=str(status),
- status=2,
- exitstatus=2,
- exc_info=exc_info)
- elif isinstance(status, exceptions.EnvironmentError):
- # If an IOError/OSError happens, raise a BuildError.
- # Report the name of the file or directory that caused the
- # error, which might be different from the target being built
- # (for example, failure to create the directory in which the
- # target file will appear).
- try: filename = status.filename
- except AttributeError: filename = None
- buildError = BuildError(
- errstr=status.strerror,
- status=status.errno,
- exitstatus=2,
- filename=filename,
- exc_info=exc_info)
- elif isinstance(status, Exception):
- buildError = BuildError(
- errstr='%s : %s' % (status.__class__.__name__, status),
- status=2,
- exitstatus=2,
- exc_info=exc_info)
- elif SCons.Util.is_String(status):
- buildError = BuildError(
- errstr=status,
- status=2,
- exitstatus=2)
- else:
- buildError = BuildError(
- errstr="Error %s" % status,
- status=status,
- exitstatus=2)
-
- #import sys
- #sys.stderr.write("convert_to_BuildError: status %s => (errstr %s, status %s)"%(status,buildError.errstr, buildError.status))
- return buildError
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Executor.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Executor.py
deleted file mode 100644
index 3211fd1..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Executor.py
+++ /dev/null
@@ -1,678 +0,0 @@
-"""SCons.Executor
-
-A module for executing actions with specific lists of target and source
-Nodes.
-
-"""
-
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-__revision__ = "src/engine/SCons/Executor.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-import collections
-
-import SCons.Debug
-from SCons.Debug import logInstanceCreation
-import SCons.Errors
-import SCons.Memoize
-
-
-class Batch(object):
- """Remembers exact association between targets
- and sources of executor."""
-
- __slots__ = ('targets',
- 'sources')
-
- def __init__(self, targets=[], sources=[]):
- self.targets = targets
- self.sources = sources
-
-
-
-class TSList(collections.UserList):
- """A class that implements $TARGETS or $SOURCES expansions by wrapping
- an executor Method. This class is used in the Executor.lvars()
- to delay creation of NodeList objects until they're needed.
-
- Note that we subclass collections.UserList purely so that the
- is_Sequence() function will identify an object of this class as
- a list during variable expansion. We're not really using any
- collections.UserList methods in practice.
- """
- def __init__(self, func):
- self.func = func
- def __getattr__(self, attr):
- nl = self.func()
- return getattr(nl, attr)
- def __getitem__(self, i):
- nl = self.func()
- return nl[i]
- def __getslice__(self, i, j):
- nl = self.func()
- i = max(i, 0); j = max(j, 0)
- return nl[i:j]
- def __str__(self):
- nl = self.func()
- return str(nl)
- def __repr__(self):
- nl = self.func()
- return repr(nl)
-
-class TSObject(object):
- """A class that implements $TARGET or $SOURCE expansions by wrapping
- an Executor method.
- """
- def __init__(self, func):
- self.func = func
- def __getattr__(self, attr):
- n = self.func()
- return getattr(n, attr)
- def __str__(self):
- n = self.func()
- if n:
- return str(n)
- return ''
- def __repr__(self):
- n = self.func()
- if n:
- return repr(n)
- return ''
-
-def rfile(node):
- """
- A function to return the results of a Node's rfile() method,
- if it exists, and the Node itself otherwise (if it's a Value
- Node, e.g.).
- """
- try:
- rfile = node.rfile
- except AttributeError:
- return node
- else:
- return rfile()
-
-
-def execute_nothing(obj, target, kw):
- return 0
-
-def execute_action_list(obj, target, kw):
- """Actually execute the action list."""
- env = obj.get_build_env()
- kw = obj.get_kw(kw)
- status = 0
- for act in obj.get_action_list():
- #args = (self.get_all_targets(), self.get_all_sources(), env)
- args = ([], [], env)
- status = act(*args, **kw)
- if isinstance(status, SCons.Errors.BuildError):
- status.executor = obj
- raise status
- elif status:
- msg = "Error %s" % status
- raise SCons.Errors.BuildError(
- errstr=msg,
- node=obj.batches[0].targets,
- executor=obj,
- action=act)
- return status
-
-_do_execute_map = {0 : execute_nothing,
- 1 : execute_action_list}
-
-
-def execute_actions_str(obj):
- env = obj.get_build_env()
- return "\n".join([action.genstring(obj.get_all_targets(),
- obj.get_all_sources(),
- env)
- for action in obj.get_action_list()])
-
-def execute_null_str(obj):
- return ''
-
-_execute_str_map = {0 : execute_null_str,
- 1 : execute_actions_str}
-
-
-class Executor(object):
- """A class for controlling instances of executing an action.
-
- This largely exists to hold a single association of an action,
- environment, list of environment override dictionaries, targets
- and sources for later processing as needed.
- """
-
- __slots__ = ('pre_actions',
- 'post_actions',
- 'env',
- 'overridelist',
- 'batches',
- 'builder_kw',
- '_memo',
- 'lvars',
- '_changed_sources_list',
- '_changed_targets_list',
- '_unchanged_sources_list',
- '_unchanged_targets_list',
- 'action_list',
- '_do_execute',
- '_execute_str')
-
- def __init__(self, action, env=None, overridelist=[{}],
- targets=[], sources=[], builder_kw={}):
- if SCons.Debug.track_instances: logInstanceCreation(self, 'Executor.Executor')
- self.set_action_list(action)
- self.pre_actions = []
- self.post_actions = []
- self.env = env
- self.overridelist = overridelist
- if targets or sources:
- self.batches = [Batch(targets[:], sources[:])]
- else:
- self.batches = []
- self.builder_kw = builder_kw
- self._do_execute = 1
- self._execute_str = 1
- self._memo = {}
-
- def get_lvars(self):
- try:
- return self.lvars
- except AttributeError:
- self.lvars = {
- 'CHANGED_SOURCES' : TSList(self._get_changed_sources),
- 'CHANGED_TARGETS' : TSList(self._get_changed_targets),
- 'SOURCE' : TSObject(self._get_source),
- 'SOURCES' : TSList(self._get_sources),
- 'TARGET' : TSObject(self._get_target),
- 'TARGETS' : TSList(self._get_targets),
- 'UNCHANGED_SOURCES' : TSList(self._get_unchanged_sources),
- 'UNCHANGED_TARGETS' : TSList(self._get_unchanged_targets),
- }
- return self.lvars
-
- def _get_changes(self):
- cs = []
- ct = []
- us = []
- ut = []
- for b in self.batches:
- if b.targets[0].is_up_to_date():
- us.extend(list(map(rfile, b.sources)))
- ut.extend(b.targets)
- else:
- cs.extend(list(map(rfile, b.sources)))
- ct.extend(b.targets)
- self._changed_sources_list = SCons.Util.NodeList(cs)
- self._changed_targets_list = SCons.Util.NodeList(ct)
- self._unchanged_sources_list = SCons.Util.NodeList(us)
- self._unchanged_targets_list = SCons.Util.NodeList(ut)
-
- def _get_changed_sources(self, *args, **kw):
- try:
- return self._changed_sources_list
- except AttributeError:
- self._get_changes()
- return self._changed_sources_list
-
- def _get_changed_targets(self, *args, **kw):
- try:
- return self._changed_targets_list
- except AttributeError:
- self._get_changes()
- return self._changed_targets_list
-
- def _get_source(self, *args, **kw):
- #return SCons.Util.NodeList([rfile(self.batches[0].sources[0]).get_subst_proxy()])
- return rfile(self.batches[0].sources[0]).get_subst_proxy()
-
- def _get_sources(self, *args, **kw):
- return SCons.Util.NodeList([rfile(n).get_subst_proxy() for n in self.get_all_sources()])
-
- def _get_target(self, *args, **kw):
- #return SCons.Util.NodeList([self.batches[0].targets[0].get_subst_proxy()])
- return self.batches[0].targets[0].get_subst_proxy()
-
- def _get_targets(self, *args, **kw):
- return SCons.Util.NodeList([n.get_subst_proxy() for n in self.get_all_targets()])
-
- def _get_unchanged_sources(self, *args, **kw):
- try:
- return self._unchanged_sources_list
- except AttributeError:
- self._get_changes()
- return self._unchanged_sources_list
-
- def _get_unchanged_targets(self, *args, **kw):
- try:
- return self._unchanged_targets_list
- except AttributeError:
- self._get_changes()
- return self._unchanged_targets_list
-
- def get_action_targets(self):
- if not self.action_list:
- return []
- targets_string = self.action_list[0].get_targets(self.env, self)
- if targets_string[0] == '$':
- targets_string = targets_string[1:]
- return self.get_lvars()[targets_string]
-
- def set_action_list(self, action):
- import SCons.Util
- if not SCons.Util.is_List(action):
- if not action:
- import SCons.Errors
- raise SCons.Errors.UserError("Executor must have an action.")
- action = [action]
- self.action_list = action
-
- def get_action_list(self):
- if self.action_list is None:
- return []
- return self.pre_actions + self.action_list + self.post_actions
-
- def get_all_targets(self):
- """Returns all targets for all batches of this Executor."""
- result = []
- for batch in self.batches:
- result.extend(batch.targets)
- return result
-
- def get_all_sources(self):
- """Returns all sources for all batches of this Executor."""
- result = []
- for batch in self.batches:
- result.extend(batch.sources)
- return result
-
- def get_all_children(self):
- """Returns all unique children (dependencies) for all batches
- of this Executor.
-
- The Taskmaster can recognize when it's already evaluated a
- Node, so we don't have to make this list unique for its intended
- canonical use case, but we expect there to be a lot of redundancy
- (long lists of batched .cc files #including the same .h files
- over and over), so removing the duplicates once up front should
- save the Taskmaster a lot of work.
- """
- result = SCons.Util.UniqueList([])
- for target in self.get_all_targets():
- result.extend(target.children())
- return result
-
- def get_all_prerequisites(self):
- """Returns all unique (order-only) prerequisites for all batches
- of this Executor.
- """
- result = SCons.Util.UniqueList([])
- for target in self.get_all_targets():
- if target.prerequisites is not None:
- result.extend(target.prerequisites)
- return result
-
- def get_action_side_effects(self):
-
- """Returns all side effects for all batches of this
- Executor used by the underlying Action.
- """
- result = SCons.Util.UniqueList([])
- for target in self.get_action_targets():
- result.extend(target.side_effects)
- return result
-
- @SCons.Memoize.CountMethodCall
- def get_build_env(self):
- """Fetch or create the appropriate build Environment
- for this Executor.
- """
- try:
- return self._memo['get_build_env']
- except KeyError:
- pass
-
- # Create the build environment instance with appropriate
- # overrides. These get evaluated against the current
- # environment's construction variables so that users can
- # add to existing values by referencing the variable in
- # the expansion.
- overrides = {}
- for odict in self.overridelist:
- overrides.update(odict)
-
- import SCons.Defaults
- env = self.env or SCons.Defaults.DefaultEnvironment()
- build_env = env.Override(overrides)
-
- self._memo['get_build_env'] = build_env
-
- return build_env
-
- def get_build_scanner_path(self, scanner):
- """Fetch the scanner path for this executor's targets and sources.
- """
- env = self.get_build_env()
- try:
- cwd = self.batches[0].targets[0].cwd
- except (IndexError, AttributeError):
- cwd = None
- return scanner.path(env, cwd,
- self.get_all_targets(),
- self.get_all_sources())
-
- def get_kw(self, kw={}):
- result = self.builder_kw.copy()
- result.update(kw)
- result['executor'] = self
- return result
-
- # use extra indirection because with new-style objects (Python 2.2
- # and above) we can't override special methods, and nullify() needs
- # to be able to do this.
-
- def __call__(self, target, **kw):
- return _do_execute_map[self._do_execute](self, target, kw)
-
- def cleanup(self):
- self._memo = {}
-
- def add_sources(self, sources):
- """Add source files to this Executor's list. This is necessary
- for "multi" Builders that can be called repeatedly to build up
- a source file list for a given target."""
- # TODO(batch): extend to multiple batches
- assert (len(self.batches) == 1)
- # TODO(batch): remove duplicates?
- sources = [x for x in sources if x not in self.batches[0].sources]
- self.batches[0].sources.extend(sources)
-
- def get_sources(self):
- return self.batches[0].sources
-
- def add_batch(self, targets, sources):
- """Add pair of associated target and source to this Executor's list.
- This is necessary for "batch" Builders that can be called repeatedly
- to build up a list of matching target and source files that will be
- used in order to update multiple target files at once from multiple
- corresponding source files, for tools like MSVC that support it."""
- self.batches.append(Batch(targets, sources))
-
- def prepare(self):
- """
- Preparatory checks for whether this Executor can go ahead
- and (try to) build its targets.
- """
- for s in self.get_all_sources():
- if s.missing():
- msg = "Source `%s' not found, needed by target `%s'."
- raise SCons.Errors.StopError(msg % (s, self.batches[0].targets[0]))
-
- def add_pre_action(self, action):
- self.pre_actions.append(action)
-
- def add_post_action(self, action):
- self.post_actions.append(action)
-
- # another extra indirection for new-style objects and nullify...
-
- def __str__(self):
- return _execute_str_map[self._execute_str](self)
-
- def nullify(self):
- self.cleanup()
- self._do_execute = 0
- self._execute_str = 0
-
- @SCons.Memoize.CountMethodCall
- def get_contents(self):
- """Fetch the signature contents. This is the main reason this
- class exists, so we can compute this once and cache it regardless
- of how many target or source Nodes there are.
- """
- try:
- return self._memo['get_contents']
- except KeyError:
- pass
- env = self.get_build_env()
- result = "".join([action.get_contents(self.get_all_targets(),
- self.get_all_sources(),
- env)
- for action in self.get_action_list()])
- self._memo['get_contents'] = result
- return result
-
- def get_timestamp(self):
- """Fetch a time stamp for this Executor. We don't have one, of
- course (only files do), but this is the interface used by the
- timestamp module.
- """
- return 0
-
- def scan_targets(self, scanner):
- # TODO(batch): scan by batches
- self.scan(scanner, self.get_all_targets())
-
- def scan_sources(self, scanner):
- # TODO(batch): scan by batches
- if self.batches[0].sources:
- self.scan(scanner, self.get_all_sources())
-
- def scan(self, scanner, node_list):
- """Scan a list of this Executor's files (targets or sources) for
- implicit dependencies and update all of the targets with them.
- This essentially short-circuits an N*M scan of the sources for
- each individual target, which is a hell of a lot more efficient.
- """
- env = self.get_build_env()
-
- # TODO(batch): scan by batches)
- deps = []
- if scanner:
- for node in node_list:
- node.disambiguate()
- s = scanner.select(node)
- if not s:
- continue
- path = self.get_build_scanner_path(s)
- deps.extend(node.get_implicit_deps(env, s, path))
- else:
- kw = self.get_kw()
- for node in node_list:
- node.disambiguate()
- scanner = node.get_env_scanner(env, kw)
- if not scanner:
- continue
- scanner = scanner.select(node)
- if not scanner:
- continue
- path = self.get_build_scanner_path(scanner)
- deps.extend(node.get_implicit_deps(env, scanner, path))
-
- deps.extend(self.get_implicit_deps())
-
- for tgt in self.get_all_targets():
- tgt.add_to_implicit(deps)
-
- def _get_unignored_sources_key(self, node, ignore=()):
- return (node,) + tuple(ignore)
-
- @SCons.Memoize.CountDictCall(_get_unignored_sources_key)
- def get_unignored_sources(self, node, ignore=()):
- key = (node,) + tuple(ignore)
- try:
- memo_dict = self._memo['get_unignored_sources']
- except KeyError:
- memo_dict = {}
- self._memo['get_unignored_sources'] = memo_dict
- else:
- try:
- return memo_dict[key]
- except KeyError:
- pass
-
- if node:
- # TODO: better way to do this (it's a linear search,
- # but it may not be critical path)?
- sourcelist = []
- for b in self.batches:
- if node in b.targets:
- sourcelist = b.sources
- break
- else:
- sourcelist = self.get_all_sources()
- if ignore:
- idict = {}
- for i in ignore:
- idict[i] = 1
- sourcelist = [s for s in sourcelist if s not in idict]
-
- memo_dict[key] = sourcelist
-
- return sourcelist
-
- def get_implicit_deps(self):
- """Return the executor's implicit dependencies, i.e. the nodes of
- the commands to be executed."""
- result = []
- build_env = self.get_build_env()
- for act in self.get_action_list():
- deps = act.get_implicit_deps(self.get_all_targets(),
- self.get_all_sources(),
- build_env)
- result.extend(deps)
- return result
-
-
-
-_batch_executors = {}
-
-def GetBatchExecutor(key):
- return _batch_executors[key]
-
-def AddBatchExecutor(key, executor):
- assert key not in _batch_executors
- _batch_executors[key] = executor
-
-nullenv = None
-
-
-import SCons.Util
-class NullEnvironment(SCons.Util.Null):
- import SCons.CacheDir
- _CacheDir_path = None
- _CacheDir = SCons.CacheDir.CacheDir(None)
- def get_CacheDir(self):
- return self._CacheDir
-
-
-def get_NullEnvironment():
- """Use singleton pattern for Null Environments."""
- global nullenv
-
- if nullenv is None:
- nullenv = NullEnvironment()
- return nullenv
-
-class Null(object):
- """A null Executor, with a null build Environment, that does
- nothing when the rest of the methods call it.
-
- This might be able to disappear when we refactor things to
- disassociate Builders from Nodes entirely, so we're not
- going to worry about unit tests for this--at least for now.
- """
-
- __slots__ = ('pre_actions',
- 'post_actions',
- 'env',
- 'overridelist',
- 'batches',
- 'builder_kw',
- '_memo',
- 'lvars',
- '_changed_sources_list',
- '_changed_targets_list',
- '_unchanged_sources_list',
- '_unchanged_targets_list',
- 'action_list',
- '_do_execute',
- '_execute_str')
-
- def __init__(self, *args, **kw):
- if SCons.Debug.track_instances: logInstanceCreation(self, 'Executor.Null')
- self.batches = [Batch(kw['targets'][:], [])]
- def get_build_env(self):
- return get_NullEnvironment()
- def get_build_scanner_path(self):
- return None
- def cleanup(self):
- pass
- def prepare(self):
- pass
- def get_unignored_sources(self, *args, **kw):
- return tuple(())
- def get_action_targets(self):
- return []
- def get_action_list(self):
- return []
- def get_all_targets(self):
- return self.batches[0].targets
- def get_all_sources(self):
- return self.batches[0].targets[0].sources
- def get_all_children(self):
- return self.batches[0].targets[0].children()
- def get_all_prerequisites(self):
- return []
- def get_action_side_effects(self):
- return []
- def __call__(self, *args, **kw):
- return 0
- def get_contents(self):
- return ''
- def _morph(self):
- """Morph this Null executor to a real Executor object."""
- batches = self.batches
- self.__class__ = Executor
- self.__init__([])
- self.batches = batches
-
- # The following methods require morphing this Null Executor to a
- # real Executor object.
-
- def add_pre_action(self, action):
- self._morph()
- self.add_pre_action(action)
- def add_post_action(self, action):
- self._morph()
- self.add_post_action(action)
- def set_action_list(self, action):
- self._morph()
- self.set_action_list(action)
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Job.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Job.py
deleted file mode 100644
index 60aa0ae..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Job.py
+++ /dev/null
@@ -1,435 +0,0 @@
-"""SCons.Job
-
-This module defines the Serial and Parallel classes that execute tasks to
-complete a build. The Jobs class provides a higher level interface to start,
-stop, and wait on jobs.
-
-"""
-
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-
-__revision__ = "src/engine/SCons/Job.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-import SCons.compat
-
-import os
-import signal
-
-import SCons.Errors
-
-# The default stack size (in kilobytes) of the threads used to execute
-# jobs in parallel.
-#
-# We use a stack size of 256 kilobytes. The default on some platforms
-# is too large and prevents us from creating enough threads to fully
-# parallelized the build. For example, the default stack size on linux
-# is 8 MBytes.
-
-explicit_stack_size = None
-default_stack_size = 256
-
-interrupt_msg = 'Build interrupted.'
-
-
-class InterruptState(object):
- def __init__(self):
- self.interrupted = False
-
- def set(self):
- self.interrupted = True
-
- def __call__(self):
- return self.interrupted
-
-
-class Jobs(object):
- """An instance of this class initializes N jobs, and provides
- methods for starting, stopping, and waiting on all N jobs.
- """
-
- def __init__(self, num, taskmaster):
- """
- create 'num' jobs using the given taskmaster.
-
- If 'num' is 1 or less, then a serial job will be used,
- otherwise a parallel job with 'num' worker threads will
- be used.
-
- The 'num_jobs' attribute will be set to the actual number of jobs
- allocated. If more than one job is requested but the Parallel
- class can't do it, it gets reset to 1. Wrapping interfaces that
- care should check the value of 'num_jobs' after initialization.
- """
-
- self.job = None
- if num > 1:
- stack_size = explicit_stack_size
- if stack_size is None:
- stack_size = default_stack_size
-
- try:
- self.job = Parallel(taskmaster, num, stack_size)
- self.num_jobs = num
- except NameError:
- pass
- if self.job is None:
- self.job = Serial(taskmaster)
- self.num_jobs = 1
-
- def run(self, postfunc=lambda: None):
- """Run the jobs.
-
- postfunc() will be invoked after the jobs has run. It will be
- invoked even if the jobs are interrupted by a keyboard
- interrupt (well, in fact by a signal such as either SIGINT,
- SIGTERM or SIGHUP). The execution of postfunc() is protected
- against keyboard interrupts and is guaranteed to run to
- completion."""
- self._setup_sig_handler()
- try:
- self.job.start()
- finally:
- postfunc()
- self._reset_sig_handler()
-
- def were_interrupted(self):
- """Returns whether the jobs were interrupted by a signal."""
- return self.job.interrupted()
-
- def _setup_sig_handler(self):
- """Setup an interrupt handler so that SCons can shutdown cleanly in
- various conditions:
-
- a) SIGINT: Keyboard interrupt
- b) SIGTERM: kill or system shutdown
- c) SIGHUP: Controlling shell exiting
-
- We handle all of these cases by stopping the taskmaster. It
- turns out that it very difficult to stop the build process
- by throwing asynchronously an exception such as
- KeyboardInterrupt. For example, the python Condition
- variables (threading.Condition) and queue's do not seem to
- asynchronous-exception-safe. It would require adding a whole
- bunch of try/finally block and except KeyboardInterrupt all
- over the place.
-
- Note also that we have to be careful to handle the case when
- SCons forks before executing another process. In that case, we
- want the child to exit immediately.
- """
- def handler(signum, stack, self=self, parentpid=os.getpid()):
- if os.getpid() == parentpid:
- self.job.taskmaster.stop()
- self.job.interrupted.set()
- else:
- os._exit(2)
-
- self.old_sigint = signal.signal(signal.SIGINT, handler)
- self.old_sigterm = signal.signal(signal.SIGTERM, handler)
- try:
- self.old_sighup = signal.signal(signal.SIGHUP, handler)
- except AttributeError:
- pass
-
- def _reset_sig_handler(self):
- """Restore the signal handlers to their previous state (before the
- call to _setup_sig_handler()."""
-
- signal.signal(signal.SIGINT, self.old_sigint)
- signal.signal(signal.SIGTERM, self.old_sigterm)
- try:
- signal.signal(signal.SIGHUP, self.old_sighup)
- except AttributeError:
- pass
-
-class Serial(object):
- """This class is used to execute tasks in series, and is more efficient
- than Parallel, but is only appropriate for non-parallel builds. Only
- one instance of this class should be in existence at a time.
-
- This class is not thread safe.
- """
-
- def __init__(self, taskmaster):
- """Create a new serial job given a taskmaster.
-
- The taskmaster's next_task() method should return the next task
- that needs to be executed, or None if there are no more tasks. The
- taskmaster's executed() method will be called for each task when it
- is successfully executed or failed() will be called if it failed to
- execute (e.g. execute() raised an exception)."""
-
- self.taskmaster = taskmaster
- self.interrupted = InterruptState()
-
- def start(self):
- """Start the job. This will begin pulling tasks from the taskmaster
- and executing them, and return when there are no more tasks. If a task
- fails to execute (i.e. execute() raises an exception), then the job will
- stop."""
-
- while True:
- task = self.taskmaster.next_task()
-
- if task is None:
- break
-
- try:
- task.prepare()
- if task.needs_execute():
- task.execute()
- except:
- if self.interrupted():
- try:
- raise SCons.Errors.BuildError(
- task.targets[0], errstr=interrupt_msg)
- except:
- task.exception_set()
- else:
- task.exception_set()
-
- # Let the failed() callback function arrange for the
- # build to stop if that's appropriate.
- task.failed()
- else:
- task.executed()
-
- task.postprocess()
- self.taskmaster.cleanup()
-
-
-# Trap import failure so that everything in the Job module but the
-# Parallel class (and its dependent classes) will work if the interpreter
-# doesn't support threads.
-try:
- import queue
- import threading
-except ImportError:
- pass
-else:
- class Worker(threading.Thread):
- """A worker thread waits on a task to be posted to its request queue,
- dequeues the task, executes it, and posts a tuple including the task
- and a boolean indicating whether the task executed successfully. """
-
- def __init__(self, requestQueue, resultsQueue, interrupted):
- threading.Thread.__init__(self)
- self.setDaemon(1)
- self.requestQueue = requestQueue
- self.resultsQueue = resultsQueue
- self.interrupted = interrupted
- self.start()
-
- def run(self):
- while True:
- task = self.requestQueue.get()
-
- if task is None:
- # The "None" value is used as a sentinel by
- # ThreadPool.cleanup(). This indicates that there
- # are no more tasks, so we should quit.
- break
-
- try:
- if self.interrupted():
- raise SCons.Errors.BuildError(
- task.targets[0], errstr=interrupt_msg)
- task.execute()
- except:
- task.exception_set()
- ok = False
- else:
- ok = True
-
- self.resultsQueue.put((task, ok))
-
- class ThreadPool(object):
- """This class is responsible for spawning and managing worker threads."""
-
- def __init__(self, num, stack_size, interrupted):
- """Create the request and reply queues, and 'num' worker threads.
-
- One must specify the stack size of the worker threads. The
- stack size is specified in kilobytes.
- """
- self.requestQueue = queue.Queue(0)
- self.resultsQueue = queue.Queue(0)
-
- try:
- prev_size = threading.stack_size(stack_size*1024)
- except AttributeError, e:
- # Only print a warning if the stack size has been
- # explicitly set.
- if not explicit_stack_size is None:
- msg = "Setting stack size is unsupported by this version of Python:\n " + \
- e.args[0]
- SCons.Warnings.warn(SCons.Warnings.StackSizeWarning, msg)
- except ValueError, e:
- msg = "Setting stack size failed:\n " + str(e)
- SCons.Warnings.warn(SCons.Warnings.StackSizeWarning, msg)
-
- # Create worker threads
- self.workers = []
- for _ in range(num):
- worker = Worker(self.requestQueue, self.resultsQueue, interrupted)
- self.workers.append(worker)
-
- if 'prev_size' in locals():
- threading.stack_size(prev_size)
-
- def put(self, task):
- """Put task into request queue."""
- self.requestQueue.put(task)
-
- def get(self):
- """Remove and return a result tuple from the results queue."""
- return self.resultsQueue.get()
-
- def preparation_failed(self, task):
- self.resultsQueue.put((task, False))
-
- def cleanup(self):
- """
- Shuts down the thread pool, giving each worker thread a
- chance to shut down gracefully.
- """
- # For each worker thread, put a sentinel "None" value
- # on the requestQueue (indicating that there's no work
- # to be done) so that each worker thread will get one and
- # terminate gracefully.
- for _ in self.workers:
- self.requestQueue.put(None)
-
- # Wait for all of the workers to terminate.
- #
- # If we don't do this, later Python versions (2.4, 2.5) often
- # seem to raise exceptions during shutdown. This happens
- # in requestQueue.get(), as an assertion failure that
- # requestQueue.not_full is notified while not acquired,
- # seemingly because the main thread has shut down (or is
- # in the process of doing so) while the workers are still
- # trying to pull sentinels off the requestQueue.
- #
- # Normally these terminations should happen fairly quickly,
- # but we'll stick a one-second timeout on here just in case
- # someone gets hung.
- for worker in self.workers:
- worker.join(1.0)
- self.workers = []
-
- class Parallel(object):
- """This class is used to execute tasks in parallel, and is somewhat
- less efficient than Serial, but is appropriate for parallel builds.
-
- This class is thread safe.
- """
-
- def __init__(self, taskmaster, num, stack_size):
- """Create a new parallel job given a taskmaster.
-
- The taskmaster's next_task() method should return the next
- task that needs to be executed, or None if there are no more
- tasks. The taskmaster's executed() method will be called
- for each task when it is successfully executed or failed()
- will be called if the task failed to execute (i.e. execute()
- raised an exception).
-
- Note: calls to taskmaster are serialized, but calls to
- execute() on distinct tasks are not serialized, because
- that is the whole point of parallel jobs: they can execute
- multiple tasks simultaneously. """
-
- self.taskmaster = taskmaster
- self.interrupted = InterruptState()
- self.tp = ThreadPool(num, stack_size, self.interrupted)
-
- self.maxjobs = num
-
- def start(self):
- """Start the job. This will begin pulling tasks from the
- taskmaster and executing them, and return when there are no
- more tasks. If a task fails to execute (i.e. execute() raises
- an exception), then the job will stop."""
-
- jobs = 0
-
- while True:
- # Start up as many available tasks as we're
- # allowed to.
- while jobs < self.maxjobs:
- task = self.taskmaster.next_task()
- if task is None:
- break
-
- try:
- # prepare task for execution
- task.prepare()
- except:
- task.exception_set()
- task.failed()
- task.postprocess()
- else:
- if task.needs_execute():
- # dispatch task
- self.tp.put(task)
- jobs = jobs + 1
- else:
- task.executed()
- task.postprocess()
-
- if not task and not jobs: break
-
- # Let any/all completed tasks finish up before we go
- # back and put the next batch of tasks on the queue.
- while True:
- task, ok = self.tp.get()
- jobs = jobs - 1
-
- if ok:
- task.executed()
- else:
- if self.interrupted():
- try:
- raise SCons.Errors.BuildError(
- task.targets[0], errstr=interrupt_msg)
- except:
- task.exception_set()
-
- # Let the failed() callback function arrange
- # for the build to stop if that's appropriate.
- task.failed()
-
- task.postprocess()
-
- if self.tp.resultsQueue.empty():
- break
-
- self.tp.cleanup()
- self.taskmaster.cleanup()
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Memoize.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Memoize.py
deleted file mode 100644
index 77a8e16..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Memoize.py
+++ /dev/null
@@ -1,245 +0,0 @@
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-
-__revision__ = "src/engine/SCons/Memoize.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-__doc__ = """Memoizer
-
-A decorator-based implementation to count hits and misses of the computed
-values that various methods cache in memory.
-
-Use of this modules assumes that wrapped methods be coded to cache their
-values in a consistent way. In particular, it requires that the class uses a
-dictionary named "_memo" to store the cached values.
-
-Here is an example of wrapping a method that returns a computed value,
-with no input parameters:
-
- @SCons.Memoize.CountMethodCall
- def foo(self):
-
- try: # Memoization
- return self._memo['foo'] # Memoization
- except KeyError: # Memoization
- pass # Memoization
-
- result = self.compute_foo_value()
-
- self._memo['foo'] = result # Memoization
-
- return result
-
-Here is an example of wrapping a method that will return different values
-based on one or more input arguments:
-
- def _bar_key(self, argument): # Memoization
- return argument # Memoization
-
- @SCons.Memoize.CountDictCall(_bar_key)
- def bar(self, argument):
-
- memo_key = argument # Memoization
- try: # Memoization
- memo_dict = self._memo['bar'] # Memoization
- except KeyError: # Memoization
- memo_dict = {} # Memoization
- self._memo['dict'] = memo_dict # Memoization
- else: # Memoization
- try: # Memoization
- return memo_dict[memo_key] # Memoization
- except KeyError: # Memoization
- pass # Memoization
-
- result = self.compute_bar_value(argument)
-
- memo_dict[memo_key] = result # Memoization
-
- return result
-
-Deciding what to cache is tricky, because different configurations
-can have radically different performance tradeoffs, and because the
-tradeoffs involved are often so non-obvious. Consequently, deciding
-whether or not to cache a given method will likely be more of an art than
-a science, but should still be based on available data from this module.
-Here are some VERY GENERAL guidelines about deciding whether or not to
-cache return values from a method that's being called a lot:
-
- -- The first question to ask is, "Can we change the calling code
- so this method isn't called so often?" Sometimes this can be
- done by changing the algorithm. Sometimes the *caller* should
- be memoized, not the method you're looking at.
-
- -- The memoized function should be timed with multiple configurations
- to make sure it doesn't inadvertently slow down some other
- configuration.
-
- -- When memoizing values based on a dictionary key composed of
- input arguments, you don't need to use all of the arguments
- if some of them don't affect the return values.
-
-"""
-
-# A flag controlling whether or not we actually use memoization.
-use_memoizer = None
-
-# Global list of counter objects
-CounterList = {}
-
-class Counter(object):
- """
- Base class for counting memoization hits and misses.
-
- We expect that the initialization in a matching decorator will
- fill in the correct class name and method name that represents
- the name of the function being counted.
- """
- def __init__(self, cls_name, method_name):
- """
- """
- self.cls_name = cls_name
- self.method_name = method_name
- self.hit = 0
- self.miss = 0
- def key(self):
- return self.cls_name+'.'+self.method_name
- def display(self):
- fmt = " %7d hits %7d misses %s()"
- print fmt % (self.hit, self.miss, self.key())
- def __cmp__(self, other):
- try:
- return cmp(self.key(), other.key())
- except AttributeError:
- return 0
-
-class CountValue(Counter):
- """
- A counter class for simple, atomic memoized values.
-
- A CountValue object should be instantiated in a decorator for each of
- the class's methods that memoizes its return value by simply storing
- the return value in its _memo dictionary.
- """
- def count(self, *args, **kw):
- """ Counts whether the memoized value has already been
- set (a hit) or not (a miss).
- """
- obj = args[0]
- if self.method_name in obj._memo:
- self.hit = self.hit + 1
- else:
- self.miss = self.miss + 1
-
-class CountDict(Counter):
- """
- A counter class for memoized values stored in a dictionary, with
- keys based on the method's input arguments.
-
- A CountDict object is instantiated in a decorator for each of the
- class's methods that memoizes its return value in a dictionary,
- indexed by some key that can be computed from one or more of
- its input arguments.
- """
- def __init__(self, cls_name, method_name, keymaker):
- """
- """
- Counter.__init__(self, cls_name, method_name)
- self.keymaker = keymaker
- def count(self, *args, **kw):
- """ Counts whether the computed key value is already present
- in the memoization dictionary (a hit) or not (a miss).
- """
- obj = args[0]
- try:
- memo_dict = obj._memo[self.method_name]
- except KeyError:
- self.miss = self.miss + 1
- else:
- key = self.keymaker(*args, **kw)
- if key in memo_dict:
- self.hit = self.hit + 1
- else:
- self.miss = self.miss + 1
-
-def Dump(title=None):
- """ Dump the hit/miss count for all the counters
- collected so far.
- """
- if title:
- print title
- for counter in sorted(CounterList):
- CounterList[counter].display()
-
-def EnableMemoization():
- global use_memoizer
- use_memoizer = 1
-
-def CountMethodCall(fn):
- """ Decorator for counting memoizer hits/misses while retrieving
- a simple value in a class method. It wraps the given method
- fn and uses a CountValue object to keep track of the
- caching statistics.
- Wrapping gets enabled by calling EnableMemoization().
- """
- if use_memoizer:
- def wrapper(self, *args, **kwargs):
- global CounterList
- key = self.__class__.__name__+'.'+fn.__name__
- if key not in CounterList:
- CounterList[key] = CountValue(self.__class__.__name__, fn.__name__)
- CounterList[key].count(self, *args, **kwargs)
- return fn(self, *args, **kwargs)
- wrapper.__name__= fn.__name__
- return wrapper
- else:
- return fn
-
-def CountDictCall(keyfunc):
- """ Decorator for counting memoizer hits/misses while accessing
- dictionary values with a key-generating function. Like
- CountMethodCall above, it wraps the given method
- fn and uses a CountDict object to keep track of the
- caching statistics. The dict-key function keyfunc has to
- get passed in the decorator call and gets stored in the
- CountDict instance.
- Wrapping gets enabled by calling EnableMemoization().
- """
- def decorator(fn):
- if use_memoizer:
- def wrapper(self, *args, **kwargs):
- global CounterList
- key = self.__class__.__name__+'.'+fn.__name__
- if key not in CounterList:
- CounterList[key] = CountDict(self.__class__.__name__, fn.__name__, keyfunc)
- CounterList[key].count(self, *args, **kwargs)
- return fn(self, *args, **kwargs)
- wrapper.__name__= fn.__name__
- return wrapper
- else:
- return fn
- return decorator
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Node/Alias.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Node/Alias.py
deleted file mode 100644
index 7e13b00..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Node/Alias.py
+++ /dev/null
@@ -1,181 +0,0 @@
-
-"""scons.Node.Alias
-
-Alias nodes.
-
-This creates a hash of global Aliases (dummy targets).
-
-"""
-
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-
-__revision__ = "src/engine/SCons/Node/Alias.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-import collections
-
-import SCons.Errors
-import SCons.Node
-import SCons.Util
-
-class AliasNameSpace(collections.UserDict):
- def Alias(self, name, **kw):
- if isinstance(name, SCons.Node.Alias.Alias):
- return name
- try:
- a = self[name]
- except KeyError:
- a = SCons.Node.Alias.Alias(name, **kw)
- self[name] = a
- return a
-
- def lookup(self, name, **kw):
- try:
- return self[name]
- except KeyError:
- return None
-
-class AliasNodeInfo(SCons.Node.NodeInfoBase):
- __slots__ = ('csig',)
- current_version_id = 2
- field_list = ['csig']
- def str_to_node(self, s):
- return default_ans.Alias(s)
-
- def __getstate__(self):
- """
- Return all fields that shall be pickled. Walk the slots in the class
- hierarchy and add those to the state dictionary. If a '__dict__' slot is
- available, copy all entries to the dictionary. Also include the version
- id, which is fixed for all instances of a class.
- """
- state = getattr(self, '__dict__', {}).copy()
- for obj in type(self).mro():
- for name in getattr(obj,'__slots__',()):
- if hasattr(self, name):
- state[name] = getattr(self, name)
-
- state['_version_id'] = self.current_version_id
- try:
- del state['__weakref__']
- except KeyError:
- pass
-
- return state
-
- def __setstate__(self, state):
- """
- Restore the attributes from a pickled state.
- """
- # TODO check or discard version
- del state['_version_id']
- for key, value in state.items():
- if key not in ('__weakref__',):
- setattr(self, key, value)
-
-
-class AliasBuildInfo(SCons.Node.BuildInfoBase):
- __slots__ = ()
- current_version_id = 2
-
-class Alias(SCons.Node.Node):
-
- NodeInfo = AliasNodeInfo
- BuildInfo = AliasBuildInfo
-
- def __init__(self, name):
- SCons.Node.Node.__init__(self)
- self.name = name
- self.changed_since_last_build = 1
- self.store_info = 0
-
- def str_for_display(self):
- return '"' + self.__str__() + '"'
-
- def __str__(self):
- return self.name
-
- def make_ready(self):
- self.get_csig()
-
- really_build = SCons.Node.Node.build
- is_up_to_date = SCons.Node.Node.children_are_up_to_date
-
- def is_under(self, dir):
- # Make Alias nodes get built regardless of
- # what directory scons was run from. Alias nodes
- # are outside the filesystem:
- return 1
-
- def get_contents(self):
- """The contents of an alias is the concatenation
- of the content signatures of all its sources."""
- childsigs = [n.get_csig() for n in self.children()]
- return ''.join(childsigs)
-
- def sconsign(self):
- """An Alias is not recorded in .sconsign files"""
- pass
-
- #
- #
- #
-
- def build(self):
- """A "builder" for aliases."""
- pass
-
- def convert(self):
- try: del self.builder
- except AttributeError: pass
- self.reset_executor()
- self.build = self.really_build
-
- def get_csig(self):
- """
- Generate a node's content signature, the digested signature
- of its content.
-
- node - the node
- cache - alternate node to use for the signature cache
- returns - the content signature
- """
- try:
- return self.ninfo.csig
- except AttributeError:
- pass
-
- contents = self.get_contents()
- csig = SCons.Util.MD5signature(contents)
- self.get_ninfo().csig = csig
- return csig
-
-default_ans = AliasNameSpace()
-
-SCons.Node.arg2nodes_lookups.append(default_ans.lookup)
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Node/FS.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Node/FS.py
deleted file mode 100644
index b6a1bb5..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Node/FS.py
+++ /dev/null
@@ -1,3612 +0,0 @@
-"""scons.Node.FS
-
-File system nodes.
-
-These Nodes represent the canonical external objects that people think
-of when they think of building software: files and directories.
-
-This holds a "default_fs" variable that should be initialized with an FS
-that can be used by scripts or modules looking for the canonical default.
-
-"""
-
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-__revision__ = "src/engine/SCons/Node/FS.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-import fnmatch
-import os
-import re
-import shutil
-import stat
-import sys
-import time
-import codecs
-
-import SCons.Action
-import SCons.Debug
-from SCons.Debug import logInstanceCreation
-import SCons.Errors
-import SCons.Memoize
-import SCons.Node
-import SCons.Node.Alias
-import SCons.Subst
-import SCons.Util
-import SCons.Warnings
-
-from SCons.Debug import Trace
-
-print_duplicate = 0
-
-
-def sconsign_none(node):
- raise NotImplementedError
-
-def sconsign_dir(node):
- """Return the .sconsign file info for this directory,
- creating it first if necessary."""
- if not node._sconsign:
- import SCons.SConsign
- node._sconsign = SCons.SConsign.ForDirectory(node)
- return node._sconsign
-
-_sconsign_map = {0 : sconsign_none,
- 1 : sconsign_dir}
-
-class EntryProxyAttributeError(AttributeError):
- """
- An AttributeError subclass for recording and displaying the name
- of the underlying Entry involved in an AttributeError exception.
- """
- def __init__(self, entry_proxy, attribute):
- AttributeError.__init__(self)
- self.entry_proxy = entry_proxy
- self.attribute = attribute
- def __str__(self):
- entry = self.entry_proxy.get()
- fmt = "%s instance %s has no attribute %s"
- return fmt % (entry.__class__.__name__,
- repr(entry.name),
- repr(self.attribute))
-
-# The max_drift value: by default, use a cached signature value for
-# any file that's been untouched for more than two days.
-default_max_drift = 2*24*60*60
-
-#
-# We stringify these file system Nodes a lot. Turning a file system Node
-# into a string is non-trivial, because the final string representation
-# can depend on a lot of factors: whether it's a derived target or not,
-# whether it's linked to a repository or source directory, and whether
-# there's duplication going on. The normal technique for optimizing
-# calculations like this is to memoize (cache) the string value, so you
-# only have to do the calculation once.
-#
-# A number of the above factors, however, can be set after we've already
-# been asked to return a string for a Node, because a Repository() or
-# VariantDir() call or the like may not occur until later in SConscript
-# files. So this variable controls whether we bother trying to save
-# string values for Nodes. The wrapper interface can set this whenever
-# they're done mucking with Repository and VariantDir and the other stuff,
-# to let this module know it can start returning saved string values
-# for Nodes.
-#
-Save_Strings = None
-
-def save_strings(val):
- global Save_Strings
- Save_Strings = val
-
-#
-# Avoid unnecessary function calls by recording a Boolean value that
-# tells us whether or not os.path.splitdrive() actually does anything
-# on this system, and therefore whether we need to bother calling it
-# when looking up path names in various methods below.
-#
-
-do_splitdrive = None
-_my_splitdrive =None
-
-def initialize_do_splitdrive():
- global do_splitdrive
- global has_unc
- drive, path = os.path.splitdrive('X:/foo')
- has_unc = hasattr(os.path, 'splitunc')
-
- do_splitdrive = not not drive or has_unc
-
- global _my_splitdrive
- if has_unc:
- def splitdrive(p):
- if p[1:2] == ':':
- return p[:2], p[2:]
- if p[0:2] == '//':
- # Note that we leave a leading slash in the path
- # because UNC paths are always absolute.
- return '//', p[1:]
- return '', p
- else:
- def splitdrive(p):
- if p[1:2] == ':':
- return p[:2], p[2:]
- return '', p
- _my_splitdrive = splitdrive
-
- # Keep some commonly used values in global variables to skip to
- # module look-up costs.
- global OS_SEP
- global UNC_PREFIX
- global os_sep_is_slash
-
- OS_SEP = os.sep
- UNC_PREFIX = OS_SEP + OS_SEP
- os_sep_is_slash = OS_SEP == '/'
-
-initialize_do_splitdrive()
-
-# Used to avoid invoking os.path.normpath if not necessary.
-needs_normpath_check = re.compile(
- r'''
- # We need to renormalize the path if it contains any consecutive
- # '/' characters.
- .*// |
-
- # We need to renormalize the path if it contains a '..' directory.
- # Note that we check for all the following cases:
- #
- # a) The path is a single '..'
- # b) The path starts with '..'. E.g. '../' or '../moredirs'
- # but we not match '..abc/'.
- # c) The path ends with '..'. E.g. '/..' or 'dirs/..'
- # d) The path contains a '..' in the middle.
- # E.g. dirs/../moredirs
-
- (.*/)?\.\.(?:/|$) |
-
- # We need to renormalize the path if it contains a '.'
- # directory, but NOT if it is a single '.' '/' characters. We
- # do not want to match a single '.' because this case is checked
- # for explicitely since this is common enough case.
- #
- # Note that we check for all the following cases:
- #
- # a) We don't match a single '.'
- # b) We match if the path starts with '.'. E.g. './' or
- # './moredirs' but we not match '.abc/'.
- # c) We match if the path ends with '.'. E.g. '/.' or
- # 'dirs/.'
- # d) We match if the path contains a '.' in the middle.
- # E.g. dirs/./moredirs
-
- \./|.*/\.(?:/|$)
-
- ''',
- re.VERBOSE
- )
-needs_normpath_match = needs_normpath_check.match
-
-#
-# SCons.Action objects for interacting with the outside world.
-#
-# The Node.FS methods in this module should use these actions to
-# create and/or remove files and directories; they should *not* use
-# os.{link,symlink,unlink,mkdir}(), etc., directly.
-#
-# Using these SCons.Action objects ensures that descriptions of these
-# external activities are properly displayed, that the displays are
-# suppressed when the -s (silent) option is used, and (most importantly)
-# the actions are disabled when the the -n option is used, in which case
-# there should be *no* changes to the external file system(s)...
-#
-
-if hasattr(os, 'link'):
- def _hardlink_func(fs, src, dst):
- # If the source is a symlink, we can't just hard-link to it
- # because a relative symlink may point somewhere completely
- # different. We must disambiguate the symlink and then
- # hard-link the final destination file.
- while fs.islink(src):
- link = fs.readlink(src)
- if not os.path.isabs(link):
- src = link
- else:
- src = os.path.join(os.path.dirname(src), link)
- fs.link(src, dst)
-else:
- _hardlink_func = None
-
-if hasattr(os, 'symlink'):
- def _softlink_func(fs, src, dst):
- fs.symlink(src, dst)
-else:
- _softlink_func = None
-
-def _copy_func(fs, src, dest):
- shutil.copy2(src, dest)
- st = fs.stat(src)
- fs.chmod(dest, stat.S_IMODE(st[stat.ST_MODE]) | stat.S_IWRITE)
-
-
-Valid_Duplicates = ['hard-soft-copy', 'soft-hard-copy',
- 'hard-copy', 'soft-copy', 'copy']
-
-Link_Funcs = [] # contains the callables of the specified duplication style
-
-def set_duplicate(duplicate):
- # Fill in the Link_Funcs list according to the argument
- # (discarding those not available on the platform).
-
- # Set up the dictionary that maps the argument names to the
- # underlying implementations. We do this inside this function,
- # not in the top-level module code, so that we can remap os.link
- # and os.symlink for testing purposes.
- link_dict = {
- 'hard' : _hardlink_func,
- 'soft' : _softlink_func,
- 'copy' : _copy_func
- }
-
- if not duplicate in Valid_Duplicates:
- raise SCons.Errors.InternalError("The argument of set_duplicate "
- "should be in Valid_Duplicates")
- global Link_Funcs
- Link_Funcs = []
- for func in duplicate.split('-'):
- if link_dict[func]:
- Link_Funcs.append(link_dict[func])
-
-def LinkFunc(target, source, env):
- # Relative paths cause problems with symbolic links, so
- # we use absolute paths, which may be a problem for people
- # who want to move their soft-linked src-trees around. Those
- # people should use the 'hard-copy' mode, softlinks cannot be
- # used for that; at least I have no idea how ...
- src = source[0].get_abspath()
- dest = target[0].get_abspath()
- dir, file = os.path.split(dest)
- if dir and not target[0].fs.isdir(dir):
- os.makedirs(dir)
- if not Link_Funcs:
- # Set a default order of link functions.
- set_duplicate('hard-soft-copy')
- fs = source[0].fs
- # Now link the files with the previously specified order.
- for func in Link_Funcs:
- try:
- func(fs, src, dest)
- break
- except (IOError, OSError):
- # An OSError indicates something happened like a permissions
- # problem or an attempt to symlink across file-system
- # boundaries. An IOError indicates something like the file
- # not existing. In either case, keeping trying additional
- # functions in the list and only raise an error if the last
- # one failed.
- if func == Link_Funcs[-1]:
- # exception of the last link method (copy) are fatal
- raise
- return 0
-
-Link = SCons.Action.Action(LinkFunc, None)
-def LocalString(target, source, env):
- return 'Local copy of %s from %s' % (target[0], source[0])
-
-LocalCopy = SCons.Action.Action(LinkFunc, LocalString)
-
-def UnlinkFunc(target, source, env):
- t = target[0]
- t.fs.unlink(t.get_abspath())
- return 0
-
-Unlink = SCons.Action.Action(UnlinkFunc, None)
-
-def MkdirFunc(target, source, env):
- t = target[0]
- if not t.exists():
- t.fs.mkdir(t.get_abspath())
- return 0
-
-Mkdir = SCons.Action.Action(MkdirFunc, None, presub=None)
-
-MkdirBuilder = None
-
-def get_MkdirBuilder():
- global MkdirBuilder
- if MkdirBuilder is None:
- import SCons.Builder
- import SCons.Defaults
- # "env" will get filled in by Executor.get_build_env()
- # calling SCons.Defaults.DefaultEnvironment() when necessary.
- MkdirBuilder = SCons.Builder.Builder(action = Mkdir,
- env = None,
- explain = None,
- is_explicit = None,
- target_scanner = SCons.Defaults.DirEntryScanner,
- name = "MkdirBuilder")
- return MkdirBuilder
-
-class _Null(object):
- pass
-
-_null = _Null()
-
-DefaultSCCSBuilder = None
-DefaultRCSBuilder = None
-
-def get_DefaultSCCSBuilder():
- global DefaultSCCSBuilder
- if DefaultSCCSBuilder is None:
- import SCons.Builder
- # "env" will get filled in by Executor.get_build_env()
- # calling SCons.Defaults.DefaultEnvironment() when necessary.
- act = SCons.Action.Action('$SCCSCOM', '$SCCSCOMSTR')
- DefaultSCCSBuilder = SCons.Builder.Builder(action = act,
- env = None,
- name = "DefaultSCCSBuilder")
- return DefaultSCCSBuilder
-
-def get_DefaultRCSBuilder():
- global DefaultRCSBuilder
- if DefaultRCSBuilder is None:
- import SCons.Builder
- # "env" will get filled in by Executor.get_build_env()
- # calling SCons.Defaults.DefaultEnvironment() when necessary.
- act = SCons.Action.Action('$RCS_COCOM', '$RCS_COCOMSTR')
- DefaultRCSBuilder = SCons.Builder.Builder(action = act,
- env = None,
- name = "DefaultRCSBuilder")
- return DefaultRCSBuilder
-
-# Cygwin's os.path.normcase pretends it's on a case-sensitive filesystem.
-_is_cygwin = sys.platform == "cygwin"
-if os.path.normcase("TeSt") == os.path.normpath("TeSt") and not _is_cygwin:
- def _my_normcase(x):
- return x
-else:
- def _my_normcase(x):
- return x.upper()
-
-
-
-class DiskChecker(object):
- def __init__(self, type, do, ignore):
- self.type = type
- self.do = do
- self.ignore = ignore
- self.func = do
- def __call__(self, *args, **kw):
- return self.func(*args, **kw)
- def set(self, list):
- if self.type in list:
- self.func = self.do
- else:
- self.func = self.ignore
-
-def do_diskcheck_match(node, predicate, errorfmt):
- result = predicate()
- try:
- # If calling the predicate() cached a None value from stat(),
- # remove it so it doesn't interfere with later attempts to
- # build this Node as we walk the DAG. (This isn't a great way
- # to do this, we're reaching into an interface that doesn't
- # really belong to us, but it's all about performance, so
- # for now we'll just document the dependency...)
- if node._memo['stat'] is None:
- del node._memo['stat']
- except (AttributeError, KeyError):
- pass
- if result:
- raise TypeError(errorfmt % node.get_abspath())
-
-def ignore_diskcheck_match(node, predicate, errorfmt):
- pass
-
-def do_diskcheck_rcs(node, name):
- try:
- rcs_dir = node.rcs_dir
- except AttributeError:
- if node.entry_exists_on_disk('RCS'):
- rcs_dir = node.Dir('RCS')
- else:
- rcs_dir = None
- node.rcs_dir = rcs_dir
- if rcs_dir:
- return rcs_dir.entry_exists_on_disk(name+',v')
- return None
-
-def ignore_diskcheck_rcs(node, name):
- return None
-
-def do_diskcheck_sccs(node, name):
- try:
- sccs_dir = node.sccs_dir
- except AttributeError:
- if node.entry_exists_on_disk('SCCS'):
- sccs_dir = node.Dir('SCCS')
- else:
- sccs_dir = None
- node.sccs_dir = sccs_dir
- if sccs_dir:
- return sccs_dir.entry_exists_on_disk('s.'+name)
- return None
-
-def ignore_diskcheck_sccs(node, name):
- return None
-
-diskcheck_match = DiskChecker('match', do_diskcheck_match, ignore_diskcheck_match)
-diskcheck_rcs = DiskChecker('rcs', do_diskcheck_rcs, ignore_diskcheck_rcs)
-diskcheck_sccs = DiskChecker('sccs', do_diskcheck_sccs, ignore_diskcheck_sccs)
-
-diskcheckers = [
- diskcheck_match,
- diskcheck_rcs,
- diskcheck_sccs,
-]
-
-def set_diskcheck(list):
- for dc in diskcheckers:
- dc.set(list)
-
-def diskcheck_types():
- return [dc.type for dc in diskcheckers]
-
-
-
-class EntryProxy(SCons.Util.Proxy):
-
- __str__ = SCons.Util.Delegate('__str__')
-
- def __get_abspath(self):
- entry = self.get()
- return SCons.Subst.SpecialAttrWrapper(entry.get_abspath(),
- entry.name + "_abspath")
-
- def __get_filebase(self):
- name = self.get().name
- return SCons.Subst.SpecialAttrWrapper(SCons.Util.splitext(name)[0],
- name + "_filebase")
-
- def __get_suffix(self):
- name = self.get().name
- return SCons.Subst.SpecialAttrWrapper(SCons.Util.splitext(name)[1],
- name + "_suffix")
-
- def __get_file(self):
- name = self.get().name
- return SCons.Subst.SpecialAttrWrapper(name, name + "_file")
-
- def __get_base_path(self):
- """Return the file's directory and file name, with the
- suffix stripped."""
- entry = self.get()
- return SCons.Subst.SpecialAttrWrapper(SCons.Util.splitext(entry.get_path())[0],
- entry.name + "_base")
-
- def __get_posix_path(self):
- """Return the path with / as the path separator,
- regardless of platform."""
- if os_sep_is_slash:
- return self
- else:
- entry = self.get()
- r = entry.get_path().replace(OS_SEP, '/')
- return SCons.Subst.SpecialAttrWrapper(r, entry.name + "_posix")
-
- def __get_windows_path(self):
- """Return the path with \ as the path separator,
- regardless of platform."""
- if OS_SEP == '\\':
- return self
- else:
- entry = self.get()
- r = entry.get_path().replace(OS_SEP, '\\')
- return SCons.Subst.SpecialAttrWrapper(r, entry.name + "_windows")
-
- def __get_srcnode(self):
- return EntryProxy(self.get().srcnode())
-
- def __get_srcdir(self):
- """Returns the directory containing the source node linked to this
- node via VariantDir(), or the directory of this node if not linked."""
- return EntryProxy(self.get().srcnode().dir)
-
- def __get_rsrcnode(self):
- return EntryProxy(self.get().srcnode().rfile())
-
- def __get_rsrcdir(self):
- """Returns the directory containing the source node linked to this
- node via VariantDir(), or the directory of this node if not linked."""
- return EntryProxy(self.get().srcnode().rfile().dir)
-
- def __get_dir(self):
- return EntryProxy(self.get().dir)
-
- dictSpecialAttrs = { "base" : __get_base_path,
- "posix" : __get_posix_path,
- "windows" : __get_windows_path,
- "win32" : __get_windows_path,
- "srcpath" : __get_srcnode,
- "srcdir" : __get_srcdir,
- "dir" : __get_dir,
- "abspath" : __get_abspath,
- "filebase" : __get_filebase,
- "suffix" : __get_suffix,
- "file" : __get_file,
- "rsrcpath" : __get_rsrcnode,
- "rsrcdir" : __get_rsrcdir,
- }
-
- def __getattr__(self, name):
- # This is how we implement the "special" attributes
- # such as base, posix, srcdir, etc.
- try:
- attr_function = self.dictSpecialAttrs[name]
- except KeyError:
- try:
- attr = SCons.Util.Proxy.__getattr__(self, name)
- except AttributeError, e:
- # Raise our own AttributeError subclass with an
- # overridden __str__() method that identifies the
- # name of the entry that caused the exception.
- raise EntryProxyAttributeError(self, name)
- return attr
- else:
- return attr_function(self)
-
-class Base(SCons.Node.Node):
- """A generic class for file system entries. This class is for
- when we don't know yet whether the entry being looked up is a file
- or a directory. Instances of this class can morph into either
- Dir or File objects by a later, more precise lookup.
-
- Note: this class does not define __cmp__ and __hash__ for
- efficiency reasons. SCons does a lot of comparing of
- Node.FS.{Base,Entry,File,Dir} objects, so those operations must be
- as fast as possible, which means we want to use Python's built-in
- object identity comparisons.
- """
-
- __slots__ = ['name',
- 'fs',
- '_abspath',
- '_labspath',
- '_path',
- '_tpath',
- '_path_elements',
- 'dir',
- 'cwd',
- 'duplicate',
- '_local',
- 'sbuilder',
- '_proxy',
- '_func_sconsign']
-
- def __init__(self, name, directory, fs):
- """Initialize a generic Node.FS.Base object.
-
- Call the superclass initialization, take care of setting up
- our relative and absolute paths, identify our parent
- directory, and indicate that this node should use
- signatures."""
- if SCons.Debug.track_instances: logInstanceCreation(self, 'Node.FS.Base')
- SCons.Node.Node.__init__(self)
-
- # Filenames and paths are probably reused and are intern'ed to
- # save some memory.
-
- #: Filename with extension as it was specified when the object was
- #: created; to obtain filesystem path, use Python str() function
- self.name = SCons.Util.silent_intern(name)
- self.fs = fs #: Reference to parent Node.FS object
-
- assert directory, "A directory must be provided"
-
- self._abspath = None
- self._labspath = None
- self._path = None
- self._tpath = None
- self._path_elements = None
-
- self.dir = directory
- self.cwd = None # will hold the SConscript directory for target nodes
- self.duplicate = directory.duplicate
- self.changed_since_last_build = 2
- self._func_sconsign = 0
- self._func_exists = 2
- self._func_rexists = 2
- self._func_get_contents = 0
- self._func_target_from_source = 1
- self.store_info = 1
-
- def str_for_display(self):
- return '"' + self.__str__() + '"'
-
- def must_be_same(self, klass):
- """
- This node, which already existed, is being looked up as the
- specified klass. Raise an exception if it isn't.
- """
- if isinstance(self, klass) or klass is Entry:
- return
- raise TypeError("Tried to lookup %s '%s' as a %s." %\
- (self.__class__.__name__, self.get_internal_path(), klass.__name__))
-
- def get_dir(self):
- return self.dir
-
- def get_suffix(self):
- return SCons.Util.splitext(self.name)[1]
-
- def rfile(self):
- return self
-
- def __getattr__(self, attr):
- """ Together with the node_bwcomp dict defined below,
- this method provides a simple backward compatibility
- layer for the Node attributes 'abspath', 'labspath',
- 'path', 'tpath', 'suffix' and 'path_elements'. These Node
- attributes used to be directly available in v2.3 and earlier, but
- have been replaced by getter methods that initialize the
- single variables lazily when required, in order to save memory.
- The redirection to the getters lets older Tools and
- SConstruct continue to work without any additional changes,
- fully transparent to the user.
- Note, that __getattr__ is only called as fallback when the
- requested attribute can't be found, so there should be no
- speed performance penalty involved for standard builds.
- """
- if attr in node_bwcomp:
- return node_bwcomp[attr](self)
-
- raise AttributeError("%r object has no attribute %r" %
- (self.__class__, attr))
-
- def __str__(self):
- """A Node.FS.Base object's string representation is its path
- name."""
- global Save_Strings
- if Save_Strings:
- return self._save_str()
- return self._get_str()
-
- @SCons.Memoize.CountMethodCall
- def _save_str(self):
- try:
- return self._memo['_save_str']
- except KeyError:
- pass
- result = sys.intern(self._get_str())
- self._memo['_save_str'] = result
- return result
-
- def _get_str(self):
- global Save_Strings
- if self.duplicate or self.is_derived():
- return self.get_path()
- srcnode = self.srcnode()
- if srcnode.stat() is None and self.stat() is not None:
- result = self.get_path()
- else:
- result = srcnode.get_path()
- if not Save_Strings:
- # We're not at the point where we're saving the string
- # representations of FS Nodes (because we haven't finished
- # reading the SConscript files and need to have str() return
- # things relative to them). That also means we can't yet
- # cache values returned (or not returned) by stat(), since
- # Python code in the SConscript files might still create
- # or otherwise affect the on-disk file. So get rid of the
- # values that the underlying stat() method saved.
- try: del self._memo['stat']
- except KeyError: pass
- if self is not srcnode:
- try: del srcnode._memo['stat']
- except KeyError: pass
- return result
-
- rstr = __str__
-
- @SCons.Memoize.CountMethodCall
- def stat(self):
- try: return self._memo['stat']
- except KeyError: pass
- try: result = self.fs.stat(self.get_abspath())
- except os.error: result = None
- self._memo['stat'] = result
- return result
-
- def exists(self):
- return SCons.Node._exists_map[self._func_exists](self)
-
- def rexists(self):
- return SCons.Node._rexists_map[self._func_rexists](self)
-
- def getmtime(self):
- st = self.stat()
- if st: return st[stat.ST_MTIME]
- else: return None
-
- def getsize(self):
- st = self.stat()
- if st: return st[stat.ST_SIZE]
- else: return None
-
- def isdir(self):
- st = self.stat()
- return st is not None and stat.S_ISDIR(st[stat.ST_MODE])
-
- def isfile(self):
- st = self.stat()
- return st is not None and stat.S_ISREG(st[stat.ST_MODE])
-
- if hasattr(os, 'symlink'):
- def islink(self):
- try: st = self.fs.lstat(self.get_abspath())
- except os.error: return 0
- return stat.S_ISLNK(st[stat.ST_MODE])
- else:
- def islink(self):
- return 0 # no symlinks
-
- def is_under(self, dir):
- if self is dir:
- return 1
- else:
- return self.dir.is_under(dir)
-
- def set_local(self):
- self._local = 1
-
- def srcnode(self):
- """If this node is in a build path, return the node
- corresponding to its source file. Otherwise, return
- ourself.
- """
- srcdir_list = self.dir.srcdir_list()
- if srcdir_list:
- srcnode = srcdir_list[0].Entry(self.name)
- srcnode.must_be_same(self.__class__)
- return srcnode
- return self
-
- def get_path(self, dir=None):
- """Return path relative to the current working directory of the
- Node.FS.Base object that owns us."""
- if not dir:
- dir = self.fs.getcwd()
- if self == dir:
- return '.'
- path_elems = self.get_path_elements()
- pathname = ''
- try: i = path_elems.index(dir)
- except ValueError:
- for p in path_elems[:-1]:
- pathname += p.dirname
- else:
- for p in path_elems[i+1:-1]:
- pathname += p.dirname
- return pathname + path_elems[-1].name
-
- def set_src_builder(self, builder):
- """Set the source code builder for this node."""
- self.sbuilder = builder
- if not self.has_builder():
- self.builder_set(builder)
-
- def src_builder(self):
- """Fetch the source code builder for this node.
-
- If there isn't one, we cache the source code builder specified
- for the directory (which in turn will cache the value from its
- parent directory, and so on up to the file system root).
- """
- try:
- scb = self.sbuilder
- except AttributeError:
- scb = self.dir.src_builder()
- self.sbuilder = scb
- return scb
-
- def get_abspath(self):
- """Get the absolute path of the file."""
- return self.dir.entry_abspath(self.name)
-
- def get_labspath(self):
- """Get the absolute path of the file."""
- return self.dir.entry_labspath(self.name)
-
- def get_internal_path(self):
- if self.dir._path == '.':
- return self.name
- else:
- return self.dir.entry_path(self.name)
-
- def get_tpath(self):
- if self.dir._tpath == '.':
- return self.name
- else:
- return self.dir.entry_tpath(self.name)
-
- def get_path_elements(self):
- return self.dir._path_elements + [self]
-
- def for_signature(self):
- # Return just our name. Even an absolute path would not work,
- # because that can change thanks to symlinks or remapped network
- # paths.
- return self.name
-
- def get_subst_proxy(self):
- try:
- return self._proxy
- except AttributeError:
- ret = EntryProxy(self)
- self._proxy = ret
- return ret
-
- def target_from_source(self, prefix, suffix, splitext=SCons.Util.splitext):
- """
-
- Generates a target entry that corresponds to this entry (usually
- a source file) with the specified prefix and suffix.
-
- Note that this method can be overridden dynamically for generated
- files that need different behavior. See Tool/swig.py for
- an example.
- """
- return SCons.Node._target_from_source_map[self._func_target_from_source](self, prefix, suffix, splitext)
-
- def _Rfindalldirs_key(self, pathlist):
- return pathlist
-
- @SCons.Memoize.CountDictCall(_Rfindalldirs_key)
- def Rfindalldirs(self, pathlist):
- """
- Return all of the directories for a given path list, including
- corresponding "backing" directories in any repositories.
-
- The Node lookups are relative to this Node (typically a
- directory), so memoizing result saves cycles from looking
- up the same path for each target in a given directory.
- """
- try:
- memo_dict = self._memo['Rfindalldirs']
- except KeyError:
- memo_dict = {}
- self._memo['Rfindalldirs'] = memo_dict
- else:
- try:
- return memo_dict[pathlist]
- except KeyError:
- pass
-
- create_dir_relative_to_self = self.Dir
- result = []
- for path in pathlist:
- if isinstance(path, SCons.Node.Node):
- result.append(path)
- else:
- dir = create_dir_relative_to_self(path)
- result.extend(dir.get_all_rdirs())
-
- memo_dict[pathlist] = result
-
- return result
-
- def RDirs(self, pathlist):
- """Search for a list of directories in the Repository list."""
- cwd = self.cwd or self.fs._cwd
- return cwd.Rfindalldirs(pathlist)
-
- @SCons.Memoize.CountMethodCall
- def rentry(self):
- try:
- return self._memo['rentry']
- except KeyError:
- pass
- result = self
- if not self.exists():
- norm_name = _my_normcase(self.name)
- for dir in self.dir.get_all_rdirs():
- try:
- node = dir.entries[norm_name]
- except KeyError:
- if dir.entry_exists_on_disk(self.name):
- result = dir.Entry(self.name)
- break
- self._memo['rentry'] = result
- return result
-
- def _glob1(self, pattern, ondisk=True, source=False, strings=False):
- return []
-
-# Dict that provides a simple backward compatibility
-# layer for the Node attributes 'abspath', 'labspath',
-# 'path', 'tpath' and 'path_elements'.
-# @see Base.__getattr__ above
-node_bwcomp = {'abspath' : Base.get_abspath,
- 'labspath' : Base.get_labspath,
- 'path' : Base.get_internal_path,
- 'tpath' : Base.get_tpath,
- 'path_elements' : Base.get_path_elements,
- 'suffix' : Base.get_suffix}
-
-class Entry(Base):
- """This is the class for generic Node.FS entries--that is, things
- that could be a File or a Dir, but we're just not sure yet.
- Consequently, the methods in this class really exist just to
- transform their associated object into the right class when the
- time comes, and then call the same-named method in the transformed
- class."""
-
- __slots__ = ['scanner_paths',
- 'cachedir_csig',
- 'cachesig',
- 'repositories',
- 'srcdir',
- 'entries',
- 'searched',
- '_sconsign',
- 'variant_dirs',
- 'root',
- 'dirname',
- 'on_disk_entries',
- 'sccs_dir',
- 'rcs_dir',
- 'released_target_info',
- 'contentsig']
-
- def __init__(self, name, directory, fs):
- Base.__init__(self, name, directory, fs)
- self._func_exists = 3
- self._func_get_contents = 1
-
- def diskcheck_match(self):
- pass
-
- def disambiguate(self, must_exist=None):
- """
- """
- if self.isdir():
- self.__class__ = Dir
- self._morph()
- elif self.isfile():
- self.__class__ = File
- self._morph()
- self.clear()
- else:
- # There was nothing on-disk at this location, so look in
- # the src directory.
- #
- # We can't just use self.srcnode() straight away because
- # that would create an actual Node for this file in the src
- # directory, and there might not be one. Instead, use the
- # dir_on_disk() method to see if there's something on-disk
- # with that name, in which case we can go ahead and call
- # self.srcnode() to create the right type of entry.
- srcdir = self.dir.srcnode()
- if srcdir != self.dir and \
- srcdir.entry_exists_on_disk(self.name) and \
- self.srcnode().isdir():
- self.__class__ = Dir
- self._morph()
- elif must_exist:
- msg = "No such file or directory: '%s'" % self.get_abspath()
- raise SCons.Errors.UserError(msg)
- else:
- self.__class__ = File
- self._morph()
- self.clear()
- return self
-
- def rfile(self):
- """We're a generic Entry, but the caller is actually looking for
- a File at this point, so morph into one."""
- self.__class__ = File
- self._morph()
- self.clear()
- return File.rfile(self)
-
- def scanner_key(self):
- return self.get_suffix()
-
- def get_contents(self):
- """Fetch the contents of the entry. Returns the exact binary
- contents of the file."""
- return SCons.Node._get_contents_map[self._func_get_contents](self)
-
- def get_text_contents(self):
- """Fetch the decoded text contents of a Unicode encoded Entry.
-
- Since this should return the text contents from the file
- system, we check to see into what sort of subclass we should
- morph this Entry."""
- try:
- self = self.disambiguate(must_exist=1)
- except SCons.Errors.UserError:
- # There was nothing on disk with which to disambiguate
- # this entry. Leave it as an Entry, but return a null
- # string so calls to get_text_contents() in emitters and
- # the like (e.g. in qt.py) don't have to disambiguate by
- # hand or catch the exception.
- return ''
- else:
- return self.get_text_contents()
-
- def must_be_same(self, klass):
- """Called to make sure a Node is a Dir. Since we're an
- Entry, we can morph into one."""
- if self.__class__ is not klass:
- self.__class__ = klass
- self._morph()
- self.clear()
-
- # The following methods can get called before the Taskmaster has
- # had a chance to call disambiguate() directly to see if this Entry
- # should really be a Dir or a File. We therefore use these to call
- # disambiguate() transparently (from our caller's point of view).
- #
- # Right now, this minimal set of methods has been derived by just
- # looking at some of the methods that will obviously be called early
- # in any of the various Taskmasters' calling sequences, and then
- # empirically figuring out which additional methods are necessary
- # to make various tests pass.
-
- def exists(self):
- return SCons.Node._exists_map[self._func_exists](self)
-
- def rel_path(self, other):
- d = self.disambiguate()
- if d.__class__ is Entry:
- raise Exception("rel_path() could not disambiguate File/Dir")
- return d.rel_path(other)
-
- def new_ninfo(self):
- return self.disambiguate().new_ninfo()
-
- def _glob1(self, pattern, ondisk=True, source=False, strings=False):
- return self.disambiguate()._glob1(pattern, ondisk, source, strings)
-
- def get_subst_proxy(self):
- return self.disambiguate().get_subst_proxy()
-
-# This is for later so we can differentiate between Entry the class and Entry
-# the method of the FS class.
-_classEntry = Entry
-
-
-class LocalFS(object):
-
- # This class implements an abstraction layer for operations involving
- # a local file system. Essentially, this wraps any function in
- # the os, os.path or shutil modules that we use to actually go do
- # anything with or to the local file system.
- #
- # Note that there's a very good chance we'll refactor this part of
- # the architecture in some way as we really implement the interface(s)
- # for remote file system Nodes. For example, the right architecture
- # might be to have this be a subclass instead of a base class.
- # Nevertheless, we're using this as a first step in that direction.
- #
- # We're not using chdir() yet because the calling subclass method
- # needs to use os.chdir() directly to avoid recursion. Will we
- # really need this one?
- #def chdir(self, path):
- # return os.chdir(path)
- def chmod(self, path, mode):
- return os.chmod(path, mode)
- def copy(self, src, dst):
- return shutil.copy(src, dst)
- def copy2(self, src, dst):
- return shutil.copy2(src, dst)
- def exists(self, path):
- return os.path.exists(path)
- def getmtime(self, path):
- return os.path.getmtime(path)
- def getsize(self, path):
- return os.path.getsize(path)
- def isdir(self, path):
- return os.path.isdir(path)
- def isfile(self, path):
- return os.path.isfile(path)
- def link(self, src, dst):
- return os.link(src, dst)
- def lstat(self, path):
- return os.lstat(path)
- def listdir(self, path):
- return os.listdir(path)
- def makedirs(self, path):
- return os.makedirs(path)
- def mkdir(self, path):
- return os.mkdir(path)
- def rename(self, old, new):
- return os.rename(old, new)
- def stat(self, path):
- return os.stat(path)
- def symlink(self, src, dst):
- return os.symlink(src, dst)
- def open(self, path):
- return open(path)
- def unlink(self, path):
- return os.unlink(path)
-
- if hasattr(os, 'symlink'):
- def islink(self, path):
- return os.path.islink(path)
- else:
- def islink(self, path):
- return 0 # no symlinks
-
- if hasattr(os, 'readlink'):
- def readlink(self, file):
- return os.readlink(file)
- else:
- def readlink(self, file):
- return ''
-
-
-#class RemoteFS:
-# # Skeleton for the obvious methods we might need from the
-# # abstraction layer for a remote filesystem.
-# def upload(self, local_src, remote_dst):
-# pass
-# def download(self, remote_src, local_dst):
-# pass
-
-
-class FS(LocalFS):
-
- def __init__(self, path = None):
- """Initialize the Node.FS subsystem.
-
- The supplied path is the top of the source tree, where we
- expect to find the top-level build file. If no path is
- supplied, the current directory is the default.
-
- The path argument must be a valid absolute path.
- """
- if SCons.Debug.track_instances: logInstanceCreation(self, 'Node.FS')
-
- self._memo = {}
-
- self.Root = {}
- self.SConstruct_dir = None
- self.max_drift = default_max_drift
-
- self.Top = None
- if path is None:
- self.pathTop = os.getcwd()
- else:
- self.pathTop = path
- self.defaultDrive = _my_normcase(_my_splitdrive(self.pathTop)[0])
-
- self.Top = self.Dir(self.pathTop)
- self.Top._path = '.'
- self.Top._tpath = '.'
- self._cwd = self.Top
-
- DirNodeInfo.fs = self
- FileNodeInfo.fs = self
-
- def set_SConstruct_dir(self, dir):
- self.SConstruct_dir = dir
-
- def get_max_drift(self):
- return self.max_drift
-
- def set_max_drift(self, max_drift):
- self.max_drift = max_drift
-
- def getcwd(self):
- if hasattr(self, "_cwd"):
- return self._cwd
- else:
- return "<no cwd>"
-
- def chdir(self, dir, change_os_dir=0):
- """Change the current working directory for lookups.
- If change_os_dir is true, we will also change the "real" cwd
- to match.
- """
- curr=self._cwd
- try:
- if dir is not None:
- self._cwd = dir
- if change_os_dir:
- os.chdir(dir.get_abspath())
- except OSError:
- self._cwd = curr
- raise
-
- def get_root(self, drive):
- """
- Returns the root directory for the specified drive, creating
- it if necessary.
- """
- drive = _my_normcase(drive)
- try:
- return self.Root[drive]
- except KeyError:
- root = RootDir(drive, self)
- self.Root[drive] = root
- if not drive:
- self.Root[self.defaultDrive] = root
- elif drive == self.defaultDrive:
- self.Root[''] = root
- return root
-
- def _lookup(self, p, directory, fsclass, create=1):
- """
- The generic entry point for Node lookup with user-supplied data.
-
- This translates arbitrary input into a canonical Node.FS object
- of the specified fsclass. The general approach for strings is
- to turn it into a fully normalized absolute path and then call
- the root directory's lookup_abs() method for the heavy lifting.
-
- If the path name begins with '#', it is unconditionally
- interpreted relative to the top-level directory of this FS. '#'
- is treated as a synonym for the top-level SConstruct directory,
- much like '~' is treated as a synonym for the user's home
- directory in a UNIX shell. So both '#foo' and '#/foo' refer
- to the 'foo' subdirectory underneath the top-level SConstruct
- directory.
-
- If the path name is relative, then the path is looked up relative
- to the specified directory, or the current directory (self._cwd,
- typically the SConscript directory) if the specified directory
- is None.
- """
- if isinstance(p, Base):
- # It's already a Node.FS object. Make sure it's the right
- # class and return.
- p.must_be_same(fsclass)
- return p
- # str(p) in case it's something like a proxy object
- p = str(p)
-
- if not os_sep_is_slash:
- p = p.replace(OS_SEP, '/')
-
- if p[0:1] == '#':
- # There was an initial '#', so we strip it and override
- # whatever directory they may have specified with the
- # top-level SConstruct directory.
- p = p[1:]
- directory = self.Top
-
- # There might be a drive letter following the
- # '#'. Although it is not described in the SCons man page,
- # the regression test suite explicitly tests for that
- # syntax. It seems to mean the following thing:
- #
- # Assuming the the SCons top dir is in C:/xxx/yyy,
- # '#X:/toto' means X:/xxx/yyy/toto.
- #
- # i.e. it assumes that the X: drive has a directory
- # structure similar to the one found on drive C:.
- if do_splitdrive:
- drive, p = _my_splitdrive(p)
- if drive:
- root = self.get_root(drive)
- else:
- root = directory.root
- else:
- root = directory.root
-
- # We can only strip trailing after splitting the drive
- # since the drive might the UNC '//' prefix.
- p = p.strip('/')
-
- needs_normpath = needs_normpath_match(p)
-
- # The path is relative to the top-level SCons directory.
- if p in ('', '.'):
- p = directory.get_labspath()
- else:
- p = directory.get_labspath() + '/' + p
- else:
- if do_splitdrive:
- drive, p = _my_splitdrive(p)
- if drive and not p:
- # This causes a naked drive letter to be treated
- # as a synonym for the root directory on that
- # drive.
- p = '/'
- else:
- drive = ''
-
- # We can only strip trailing '/' since the drive might the
- # UNC '//' prefix.
- if p != '/':
- p = p.rstrip('/')
-
- needs_normpath = needs_normpath_match(p)
-
- if p[0:1] == '/':
- # Absolute path
- root = self.get_root(drive)
- else:
- # This is a relative lookup or to the current directory
- # (the path name is not absolute). Add the string to the
- # appropriate directory lookup path, after which the whole
- # thing gets normalized.
- if directory:
- if not isinstance(directory, Dir):
- directory = self.Dir(directory)
- else:
- directory = self._cwd
-
- if p in ('', '.'):
- p = directory.get_labspath()
- else:
- p = directory.get_labspath() + '/' + p
-
- if drive:
- root = self.get_root(drive)
- else:
- root = directory.root
-
- if needs_normpath is not None:
- # Normalize a pathname. Will return the same result for
- # equivalent paths.
- #
- # We take advantage of the fact that we have an absolute
- # path here for sure. In addition, we know that the
- # components of lookup path are separated by slashes at
- # this point. Because of this, this code is about 2X
- # faster than calling os.path.normpath() followed by
- # replacing os.sep with '/' again.
- ins = p.split('/')[1:]
- outs = []
- for d in ins:
- if d == '..':
- try:
- outs.pop()
- except IndexError:
- pass
- elif d not in ('', '.'):
- outs.append(d)
- p = '/' + '/'.join(outs)
-
- return root._lookup_abs(p, fsclass, create)
-
- def Entry(self, name, directory = None, create = 1):
- """Look up or create a generic Entry node with the specified name.
- If the name is a relative path (begins with ./, ../, or a file
- name), then it is looked up relative to the supplied directory
- node, or to the top level directory of the FS (supplied at
- construction time) if no directory is supplied.
- """
- return self._lookup(name, directory, Entry, create)
-
- def File(self, name, directory = None, create = 1):
- """Look up or create a File node with the specified name. If
- the name is a relative path (begins with ./, ../, or a file name),
- then it is looked up relative to the supplied directory node,
- or to the top level directory of the FS (supplied at construction
- time) if no directory is supplied.
-
- This method will raise TypeError if a directory is found at the
- specified path.
- """
- return self._lookup(name, directory, File, create)
-
- def Dir(self, name, directory = None, create = True):
- """Look up or create a Dir node with the specified name. If
- the name is a relative path (begins with ./, ../, or a file name),
- then it is looked up relative to the supplied directory node,
- or to the top level directory of the FS (supplied at construction
- time) if no directory is supplied.
-
- This method will raise TypeError if a normal file is found at the
- specified path.
- """
- return self._lookup(name, directory, Dir, create)
-
- def VariantDir(self, variant_dir, src_dir, duplicate=1):
- """Link the supplied variant directory to the source directory
- for purposes of building files."""
-
- if not isinstance(src_dir, SCons.Node.Node):
- src_dir = self.Dir(src_dir)
- if not isinstance(variant_dir, SCons.Node.Node):
- variant_dir = self.Dir(variant_dir)
- if src_dir.is_under(variant_dir):
- raise SCons.Errors.UserError("Source directory cannot be under variant directory.")
- if variant_dir.srcdir:
- if variant_dir.srcdir == src_dir:
- return # We already did this.
- raise SCons.Errors.UserError("'%s' already has a source directory: '%s'."%(variant_dir, variant_dir.srcdir))
- variant_dir.link(src_dir, duplicate)
-
- def Repository(self, *dirs):
- """Specify Repository directories to search."""
- for d in dirs:
- if not isinstance(d, SCons.Node.Node):
- d = self.Dir(d)
- self.Top.addRepository(d)
-
- def variant_dir_target_climb(self, orig, dir, tail):
- """Create targets in corresponding variant directories
-
- Climb the directory tree, and look up path names
- relative to any linked variant directories we find.
-
- Even though this loops and walks up the tree, we don't memoize
- the return value because this is really only used to process
- the command-line targets.
- """
- targets = []
- message = None
- fmt = "building associated VariantDir targets: %s"
- start_dir = dir
- while dir:
- for bd in dir.variant_dirs:
- if start_dir.is_under(bd):
- # If already in the build-dir location, don't reflect
- return [orig], fmt % str(orig)
- p = os.path.join(bd._path, *tail)
- targets.append(self.Entry(p))
- tail = [dir.name] + tail
- dir = dir.up()
- if targets:
- message = fmt % ' '.join(map(str, targets))
- return targets, message
-
- def Glob(self, pathname, ondisk=True, source=True, strings=False, exclude=None, cwd=None):
- """
- Globs
-
- This is mainly a shim layer
- """
- if cwd is None:
- cwd = self.getcwd()
- return cwd.glob(pathname, ondisk, source, strings, exclude)
-
-class DirNodeInfo(SCons.Node.NodeInfoBase):
- __slots__ = ()
- # This should get reset by the FS initialization.
- current_version_id = 2
-
- fs = None
-
- def str_to_node(self, s):
- top = self.fs.Top
- root = top.root
- if do_splitdrive:
- drive, s = _my_splitdrive(s)
- if drive:
- root = self.fs.get_root(drive)
- if not os.path.isabs(s):
- s = top.get_labspath() + '/' + s
- return root._lookup_abs(s, Entry)
-
-class DirBuildInfo(SCons.Node.BuildInfoBase):
- __slots__ = ()
- current_version_id = 2
-
-glob_magic_check = re.compile('[*?[]')
-
-def has_glob_magic(s):
- return glob_magic_check.search(s) is not None
-
-class Dir(Base):
- """A class for directories in a file system.
- """
-
- __slots__ = ['scanner_paths',
- 'cachedir_csig',
- 'cachesig',
- 'repositories',
- 'srcdir',
- 'entries',
- 'searched',
- '_sconsign',
- 'variant_dirs',
- 'root',
- 'dirname',
- 'on_disk_entries',
- 'sccs_dir',
- 'rcs_dir',
- 'released_target_info',
- 'contentsig']
-
- NodeInfo = DirNodeInfo
- BuildInfo = DirBuildInfo
-
- def __init__(self, name, directory, fs):
- if SCons.Debug.track_instances: logInstanceCreation(self, 'Node.FS.Dir')
- Base.__init__(self, name, directory, fs)
- self._morph()
-
- def _morph(self):
- """Turn a file system Node (either a freshly initialized directory
- object or a separate Entry object) into a proper directory object.
-
- Set up this directory's entries and hook it into the file
- system tree. Specify that directories (this Node) don't use
- signatures for calculating whether they're current.
- """
-
- self.repositories = []
- self.srcdir = None
-
- self.entries = {}
- self.entries['.'] = self
- self.entries['..'] = self.dir
- self.cwd = self
- self.searched = 0
- self._sconsign = None
- self.variant_dirs = []
- self.root = self.dir.root
- self.changed_since_last_build = 3
- self._func_sconsign = 1
- self._func_exists = 2
- self._func_get_contents = 2
-
- self._abspath = SCons.Util.silent_intern(self.dir.entry_abspath(self.name))
- self._labspath = SCons.Util.silent_intern(self.dir.entry_labspath(self.name))
- if self.dir._path == '.':
- self._path = SCons.Util.silent_intern(self.name)
- else:
- self._path = SCons.Util.silent_intern(self.dir.entry_path(self.name))
- if self.dir._tpath == '.':
- self._tpath = SCons.Util.silent_intern(self.name)
- else:
- self._tpath = SCons.Util.silent_intern(self.dir.entry_tpath(self.name))
- self._path_elements = self.dir._path_elements + [self]
-
- # For directories, we make a difference between the directory
- # 'name' and the directory 'dirname'. The 'name' attribute is
- # used when we need to print the 'name' of the directory or
- # when we it is used as the last part of a path. The 'dirname'
- # is used when the directory is not the last element of the
- # path. The main reason for making that distinction is that
- # for RoorDir's the dirname can not be easily inferred from
- # the name. For example, we have to add a '/' after a drive
- # letter but not after a UNC path prefix ('//').
- self.dirname = self.name + OS_SEP
-
- # Don't just reset the executor, replace its action list,
- # because it might have some pre-or post-actions that need to
- # be preserved.
- #
- # But don't reset the executor if there is a non-null executor
- # attached already. The existing executor might have other
- # targets, in which case replacing the action list with a
- # Mkdir action is a big mistake.
- if not hasattr(self, 'executor'):
- self.builder = get_MkdirBuilder()
- self.get_executor().set_action_list(self.builder.action)
- else:
- # Prepend MkdirBuilder action to existing action list
- l = self.get_executor().action_list
- a = get_MkdirBuilder().action
- l.insert(0, a)
- self.get_executor().set_action_list(l)
-
- def diskcheck_match(self):
- diskcheck_match(self, self.isfile,
- "File %s found where directory expected.")
-
- def __clearRepositoryCache(self, duplicate=None):
- """Called when we change the repository(ies) for a directory.
- This clears any cached information that is invalidated by changing
- the repository."""
-
- for node in self.entries.values():
- if node != self.dir:
- if node != self and isinstance(node, Dir):
- node.__clearRepositoryCache(duplicate)
- else:
- node.clear()
- try:
- del node._srcreps
- except AttributeError:
- pass
- if duplicate is not None:
- node.duplicate=duplicate
-
- def __resetDuplicate(self, node):
- if node != self:
- node.duplicate = node.get_dir().duplicate
-
- def Entry(self, name):
- """
- Looks up or creates an entry node named 'name' relative to
- this directory.
- """
- return self.fs.Entry(name, self)
-
- def Dir(self, name, create=True):
- """
- Looks up or creates a directory node named 'name' relative to
- this directory.
- """
- return self.fs.Dir(name, self, create)
-
- def File(self, name):
- """
- Looks up or creates a file node named 'name' relative to
- this directory.
- """
- return self.fs.File(name, self)
-
- def link(self, srcdir, duplicate):
- """Set this directory as the variant directory for the
- supplied source directory."""
- self.srcdir = srcdir
- self.duplicate = duplicate
- self.__clearRepositoryCache(duplicate)
- srcdir.variant_dirs.append(self)
-
- def getRepositories(self):
- """Returns a list of repositories for this directory.
- """
- if self.srcdir and not self.duplicate:
- return self.srcdir.get_all_rdirs() + self.repositories
- return self.repositories
-
- @SCons.Memoize.CountMethodCall
- def get_all_rdirs(self):
- try:
- return list(self._memo['get_all_rdirs'])
- except KeyError:
- pass
-
- result = [self]
- fname = '.'
- dir = self
- while dir:
- for rep in dir.getRepositories():
- result.append(rep.Dir(fname))
- if fname == '.':
- fname = dir.name
- else:
- fname = dir.name + OS_SEP + fname
- dir = dir.up()
-
- self._memo['get_all_rdirs'] = list(result)
-
- return result
-
- def addRepository(self, dir):
- if dir != self and not dir in self.repositories:
- self.repositories.append(dir)
- dir._tpath = '.'
- self.__clearRepositoryCache()
-
- def up(self):
- return self.dir
-
- def _rel_path_key(self, other):
- return str(other)
-
- @SCons.Memoize.CountDictCall(_rel_path_key)
- def rel_path(self, other):
- """Return a path to "other" relative to this directory.
- """
-
- # This complicated and expensive method, which constructs relative
- # paths between arbitrary Node.FS objects, is no longer used
- # by SCons itself. It was introduced to store dependency paths
- # in .sconsign files relative to the target, but that ended up
- # being significantly inefficient.
- #
- # We're continuing to support the method because some SConstruct
- # files out there started using it when it was available, and
- # we're all about backwards compatibility..
-
- try:
- memo_dict = self._memo['rel_path']
- except KeyError:
- memo_dict = {}
- self._memo['rel_path'] = memo_dict
- else:
- try:
- return memo_dict[other]
- except KeyError:
- pass
-
- if self is other:
- result = '.'
-
- elif not other in self._path_elements:
- try:
- other_dir = other.get_dir()
- except AttributeError:
- result = str(other)
- else:
- if other_dir is None:
- result = other.name
- else:
- dir_rel_path = self.rel_path(other_dir)
- if dir_rel_path == '.':
- result = other.name
- else:
- result = dir_rel_path + OS_SEP + other.name
- else:
- i = self._path_elements.index(other) + 1
-
- path_elems = ['..'] * (len(self._path_elements) - i) \
- + [n.name for n in other._path_elements[i:]]
-
- result = OS_SEP.join(path_elems)
-
- memo_dict[other] = result
-
- return result
-
- def get_env_scanner(self, env, kw={}):
- import SCons.Defaults
- return SCons.Defaults.DirEntryScanner
-
- def get_target_scanner(self):
- import SCons.Defaults
- return SCons.Defaults.DirEntryScanner
-
- def get_found_includes(self, env, scanner, path):
- """Return this directory's implicit dependencies.
-
- We don't bother caching the results because the scan typically
- shouldn't be requested more than once (as opposed to scanning
- .h file contents, which can be requested as many times as the
- files is #included by other files).
- """
- if not scanner:
- return []
- # Clear cached info for this Dir. If we already visited this
- # directory on our walk down the tree (because we didn't know at
- # that point it was being used as the source for another Node)
- # then we may have calculated build signature before realizing
- # we had to scan the disk. Now that we have to, though, we need
- # to invalidate the old calculated signature so that any node
- # dependent on our directory structure gets one that includes
- # info about everything on disk.
- self.clear()
- return scanner(self, env, path)
-
- #
- # Taskmaster interface subsystem
- #
-
- def prepare(self):
- pass
-
- def build(self, **kw):
- """A null "builder" for directories."""
- global MkdirBuilder
- if self.builder is not MkdirBuilder:
- SCons.Node.Node.build(self, **kw)
-
- #
- #
- #
-
- def _create(self):
- """Create this directory, silently and without worrying about
- whether the builder is the default or not."""
- listDirs = []
- parent = self
- while parent:
- if parent.exists():
- break
- listDirs.append(parent)
- p = parent.up()
- if p is None:
- # Don't use while: - else: for this condition because
- # if so, then parent is None and has no .path attribute.
- raise SCons.Errors.StopError(parent._path)
- parent = p
- listDirs.reverse()
- for dirnode in listDirs:
- try:
- # Don't call dirnode.build(), call the base Node method
- # directly because we definitely *must* create this
- # directory. The dirnode.build() method will suppress
- # the build if it's the default builder.
- SCons.Node.Node.build(dirnode)
- dirnode.get_executor().nullify()
- # The build() action may or may not have actually
- # created the directory, depending on whether the -n
- # option was used or not. Delete the _exists and
- # _rexists attributes so they can be reevaluated.
- dirnode.clear()
- except OSError:
- pass
-
- def multiple_side_effect_has_builder(self):
- global MkdirBuilder
- return self.builder is not MkdirBuilder and self.has_builder()
-
- def alter_targets(self):
- """Return any corresponding targets in a variant directory.
- """
- return self.fs.variant_dir_target_climb(self, self, [])
-
- def scanner_key(self):
- """A directory does not get scanned."""
- return None
-
- def get_text_contents(self):
- """We already emit things in text, so just return the binary
- version."""
- return self.get_contents()
-
- def get_contents(self):
- """Return content signatures and names of all our children
- separated by new-lines. Ensure that the nodes are sorted."""
- return SCons.Node._get_contents_map[self._func_get_contents](self)
-
- def get_csig(self):
- """Compute the content signature for Directory nodes. In
- general, this is not needed and the content signature is not
- stored in the DirNodeInfo. However, if get_contents on a Dir
- node is called which has a child directory, the child
- directory should return the hash of its contents."""
- contents = self.get_contents()
- return SCons.Util.MD5signature(contents)
-
- def do_duplicate(self, src):
- pass
-
- def is_up_to_date(self):
- """If any child is not up-to-date, then this directory isn't,
- either."""
- if self.builder is not MkdirBuilder and not self.exists():
- return 0
- up_to_date = SCons.Node.up_to_date
- for kid in self.children():
- if kid.get_state() > up_to_date:
- return 0
- return 1
-
- def rdir(self):
- if not self.exists():
- norm_name = _my_normcase(self.name)
- for dir in self.dir.get_all_rdirs():
- try: node = dir.entries[norm_name]
- except KeyError: node = dir.dir_on_disk(self.name)
- if node and node.exists() and \
- (isinstance(dir, Dir) or isinstance(dir, Entry)):
- return node
- return self
-
- def sconsign(self):
- """Return the .sconsign file info for this directory. """
- return _sconsign_map[self._func_sconsign](self)
-
- def srcnode(self):
- """Dir has a special need for srcnode()...if we
- have a srcdir attribute set, then that *is* our srcnode."""
- if self.srcdir:
- return self.srcdir
- return Base.srcnode(self)
-
- def get_timestamp(self):
- """Return the latest timestamp from among our children"""
- stamp = 0
- for kid in self.children():
- if kid.get_timestamp() > stamp:
- stamp = kid.get_timestamp()
- return stamp
-
- def get_abspath(self):
- """Get the absolute path of the file."""
- return self._abspath
-
- def get_labspath(self):
- """Get the absolute path of the file."""
- return self._labspath
-
- def get_internal_path(self):
- return self._path
-
- def get_tpath(self):
- return self._tpath
-
- def get_path_elements(self):
- return self._path_elements
-
- def entry_abspath(self, name):
- return self._abspath + OS_SEP + name
-
- def entry_labspath(self, name):
- return self._labspath + '/' + name
-
- def entry_path(self, name):
- return self._path + OS_SEP + name
-
- def entry_tpath(self, name):
- return self._tpath + OS_SEP + name
-
- def entry_exists_on_disk(self, name):
- """ Searches through the file/dir entries of the current
- directory, and returns True if a physical entry with the given
- name could be found.
-
- @see rentry_exists_on_disk
- """
- try:
- d = self.on_disk_entries
- except AttributeError:
- d = {}
- try:
- entries = os.listdir(self._abspath)
- except OSError:
- pass
- else:
- for entry in map(_my_normcase, entries):
- d[entry] = True
- self.on_disk_entries = d
- if sys.platform == 'win32' or sys.platform == 'cygwin':
- name = _my_normcase(name)
- result = d.get(name)
- if result is None:
- # Belt-and-suspenders for Windows: check directly for
- # 8.3 file names that don't show up in os.listdir().
- result = os.path.exists(self._abspath + OS_SEP + name)
- d[name] = result
- return result
- else:
- return name in d
-
- def rentry_exists_on_disk(self, name):
- """ Searches through the file/dir entries of the current
- *and* all its remote directories (repos), and returns
- True if a physical entry with the given name could be found.
- The local directory (self) gets searched first, so
- repositories take a lower precedence regarding the
- searching order.
-
- @see entry_exists_on_disk
- """
-
- rentry_exists = self.entry_exists_on_disk(name)
- if not rentry_exists:
- # Search through the repository folders
- norm_name = _my_normcase(name)
- for rdir in self.get_all_rdirs():
- try:
- node = rdir.entries[norm_name]
- if node:
- rentry_exists = True
- break
- except KeyError:
- if rdir.entry_exists_on_disk(name):
- rentry_exists = True
- break
- return rentry_exists
-
- @SCons.Memoize.CountMethodCall
- def srcdir_list(self):
- try:
- return self._memo['srcdir_list']
- except KeyError:
- pass
-
- result = []
-
- dirname = '.'
- dir = self
- while dir:
- if dir.srcdir:
- result.append(dir.srcdir.Dir(dirname))
- dirname = dir.name + OS_SEP + dirname
- dir = dir.up()
-
- self._memo['srcdir_list'] = result
-
- return result
-
- def srcdir_duplicate(self, name):
- for dir in self.srcdir_list():
- if self.is_under(dir):
- # We shouldn't source from something in the build path;
- # variant_dir is probably under src_dir, in which case
- # we are reflecting.
- break
- if dir.entry_exists_on_disk(name):
- srcnode = dir.Entry(name).disambiguate()
- if self.duplicate:
- node = self.Entry(name).disambiguate()
- node.do_duplicate(srcnode)
- return node
- else:
- return srcnode
- return None
-
- def _srcdir_find_file_key(self, filename):
- return filename
-
- @SCons.Memoize.CountDictCall(_srcdir_find_file_key)
- def srcdir_find_file(self, filename):
- try:
- memo_dict = self._memo['srcdir_find_file']
- except KeyError:
- memo_dict = {}
- self._memo['srcdir_find_file'] = memo_dict
- else:
- try:
- return memo_dict[filename]
- except KeyError:
- pass
-
- def func(node):
- if (isinstance(node, File) or isinstance(node, Entry)) and \
- (node.is_derived() or node.exists()):
- return node
- return None
-
- norm_name = _my_normcase(filename)
-
- for rdir in self.get_all_rdirs():
- try: node = rdir.entries[norm_name]
- except KeyError: node = rdir.file_on_disk(filename)
- else: node = func(node)
- if node:
- result = (node, self)
- memo_dict[filename] = result
- return result
-
- for srcdir in self.srcdir_list():
- for rdir in srcdir.get_all_rdirs():
- try: node = rdir.entries[norm_name]
- except KeyError: node = rdir.file_on_disk(filename)
- else: node = func(node)
- if node:
- result = (File(filename, self, self.fs), srcdir)
- memo_dict[filename] = result
- return result
-
- result = (None, None)
- memo_dict[filename] = result
- return result
-
- def dir_on_disk(self, name):
- if self.entry_exists_on_disk(name):
- try: return self.Dir(name)
- except TypeError: pass
- node = self.srcdir_duplicate(name)
- if isinstance(node, File):
- return None
- return node
-
- def file_on_disk(self, name):
- if self.entry_exists_on_disk(name) or \
- diskcheck_rcs(self, name) or \
- diskcheck_sccs(self, name):
- try: return self.File(name)
- except TypeError: pass
- node = self.srcdir_duplicate(name)
- if isinstance(node, Dir):
- return None
- return node
-
- def walk(self, func, arg):
- """
- Walk this directory tree by calling the specified function
- for each directory in the tree.
-
- This behaves like the os.path.walk() function, but for in-memory
- Node.FS.Dir objects. The function takes the same arguments as
- the functions passed to os.path.walk():
-
- func(arg, dirname, fnames)
-
- Except that "dirname" will actually be the directory *Node*,
- not the string. The '.' and '..' entries are excluded from
- fnames. The fnames list may be modified in-place to filter the
- subdirectories visited or otherwise impose a specific order.
- The "arg" argument is always passed to func() and may be used
- in any way (or ignored, passing None is common).
- """
- entries = self.entries
- names = list(entries.keys())
- names.remove('.')
- names.remove('..')
- func(arg, self, names)
- for dirname in [n for n in names if isinstance(entries[n], Dir)]:
- entries[dirname].walk(func, arg)
-
- def glob(self, pathname, ondisk=True, source=False, strings=False, exclude=None):
- """
- Returns a list of Nodes (or strings) matching a specified
- pathname pattern.
-
- Pathname patterns follow UNIX shell semantics: * matches
- any-length strings of any characters, ? matches any character,
- and [] can enclose lists or ranges of characters. Matches do
- not span directory separators.
-
- The matches take into account Repositories, returning local
- Nodes if a corresponding entry exists in a Repository (either
- an in-memory Node or something on disk).
-
- By defafult, the glob() function matches entries that exist
- on-disk, in addition to in-memory Nodes. Setting the "ondisk"
- argument to False (or some other non-true value) causes the glob()
- function to only match in-memory Nodes. The default behavior is
- to return both the on-disk and in-memory Nodes.
-
- The "source" argument, when true, specifies that corresponding
- source Nodes must be returned if you're globbing in a build
- directory (initialized with VariantDir()). The default behavior
- is to return Nodes local to the VariantDir().
-
- The "strings" argument, when true, returns the matches as strings,
- not Nodes. The strings are path names relative to this directory.
-
- The "exclude" argument, if not None, must be a pattern or a list
- of patterns following the same UNIX shell semantics.
- Elements matching a least one pattern of this list will be excluded
- from the result.
-
- The underlying algorithm is adapted from the glob.glob() function
- in the Python library (but heavily modified), and uses fnmatch()
- under the covers.
- """
- dirname, basename = os.path.split(pathname)
- if not dirname:
- result = self._glob1(basename, ondisk, source, strings)
- else:
- if has_glob_magic(dirname):
- list = self.glob(dirname, ondisk, source, False, exclude)
- else:
- list = [self.Dir(dirname, create=True)]
- result = []
- for dir in list:
- r = dir._glob1(basename, ondisk, source, strings)
- if strings:
- r = [os.path.join(str(dir), x) for x in r]
- result.extend(r)
- if exclude:
- result = filter(lambda x: not any(fnmatch.fnmatch(str(x), e) for e in SCons.Util.flatten(exclude)), result)
- return sorted(result, key=lambda a: str(a))
-
- def _glob1(self, pattern, ondisk=True, source=False, strings=False):
- """
- Globs for and returns a list of entry names matching a single
- pattern in this directory.
-
- This searches any repositories and source directories for
- corresponding entries and returns a Node (or string) relative
- to the current directory if an entry is found anywhere.
-
- TODO: handle pattern with no wildcard
- """
- search_dir_list = self.get_all_rdirs()
- for srcdir in self.srcdir_list():
- search_dir_list.extend(srcdir.get_all_rdirs())
-
- selfEntry = self.Entry
- names = []
- for dir in search_dir_list:
- # We use the .name attribute from the Node because the keys of
- # the dir.entries dictionary are normalized (that is, all upper
- # case) on case-insensitive systems like Windows.
- node_names = [ v.name for k, v in dir.entries.items()
- if k not in ('.', '..') ]
- names.extend(node_names)
- if not strings:
- # Make sure the working directory (self) actually has
- # entries for all Nodes in repositories or variant dirs.
- for name in node_names: selfEntry(name)
- if ondisk:
- try:
- disk_names = os.listdir(dir._abspath)
- except os.error:
- continue
- names.extend(disk_names)
- if not strings:
- # We're going to return corresponding Nodes in
- # the local directory, so we need to make sure
- # those Nodes exist. We only want to create
- # Nodes for the entries that will match the
- # specified pattern, though, which means we
- # need to filter the list here, even though
- # the overall list will also be filtered later,
- # after we exit this loop.
- if pattern[0] != '.':
- #disk_names = [ d for d in disk_names if d[0] != '.' ]
- disk_names = [x for x in disk_names if x[0] != '.']
- disk_names = fnmatch.filter(disk_names, pattern)
- dirEntry = dir.Entry
- for name in disk_names:
- # Add './' before disk filename so that '#' at
- # beginning of filename isn't interpreted.
- name = './' + name
- node = dirEntry(name).disambiguate()
- n = selfEntry(name)
- if n.__class__ != node.__class__:
- n.__class__ = node.__class__
- n._morph()
-
- names = set(names)
- if pattern[0] != '.':
- names = [x for x in names if x[0] != '.']
- names = fnmatch.filter(names, pattern)
-
- if strings:
- return names
-
- return [self.entries[_my_normcase(n)] for n in names]
-
-class RootDir(Dir):
- """A class for the root directory of a file system.
-
- This is the same as a Dir class, except that the path separator
- ('/' or '\\') is actually part of the name, so we don't need to
- add a separator when creating the path names of entries within
- this directory.
- """
-
- __slots__ = ['_lookupDict']
-
- def __init__(self, drive, fs):
- if SCons.Debug.track_instances: logInstanceCreation(self, 'Node.FS.RootDir')
- SCons.Node.Node.__init__(self)
-
- # Handle all the types of drives:
- if drive == '':
- # No drive, regular UNIX root or Windows default drive.
- name = OS_SEP
- dirname = OS_SEP
- elif drive == '//':
- # UNC path
- name = UNC_PREFIX
- dirname = UNC_PREFIX
- else:
- # Windows drive letter
- name = drive
- dirname = drive + OS_SEP
-
- #: Filename with extension as it was specified when the object was
- #: created; to obtain filesystem path, use Python str() function
- self.name = SCons.Util.silent_intern(name)
- self.fs = fs #: Reference to parent Node.FS object
-
- self._path_elements = [self]
- self.dir = self
- self._func_rexists = 2
- self._func_target_from_source = 1
- self.store_info = 1
-
- # Now set our paths to what we really want them to be. The
- # name should already contain any necessary separators, such
- # as the initial drive letter (the name) plus the directory
- # separator, except for the "lookup abspath," which does not
- # have the drive letter.
- self._abspath = dirname
- self._labspath = ''
- self._path = dirname
- self._tpath = dirname
- self.dirname = dirname
-
- self._morph()
-
- self.duplicate = 0
- self._lookupDict = {}
-
- self._lookupDict[''] = self
- self._lookupDict['/'] = self
- self.root = self
- # The // entry is necessary because os.path.normpath()
- # preserves double slashes at the beginning of a path on Posix
- # platforms.
- if not has_unc:
- self._lookupDict['//'] = self
-
- def _morph(self):
- """Turn a file system Node (either a freshly initialized directory
- object or a separate Entry object) into a proper directory object.
-
- Set up this directory's entries and hook it into the file
- system tree. Specify that directories (this Node) don't use
- signatures for calculating whether they're current.
- """
-
- self.repositories = []
- self.srcdir = None
-
- self.entries = {}
- self.entries['.'] = self
- self.entries['..'] = self.dir
- self.cwd = self
- self.searched = 0
- self._sconsign = None
- self.variant_dirs = []
- self.changed_since_last_build = 3
- self._func_sconsign = 1
- self._func_exists = 2
- self._func_get_contents = 2
-
- # Don't just reset the executor, replace its action list,
- # because it might have some pre-or post-actions that need to
- # be preserved.
- #
- # But don't reset the executor if there is a non-null executor
- # attached already. The existing executor might have other
- # targets, in which case replacing the action list with a
- # Mkdir action is a big mistake.
- if not hasattr(self, 'executor'):
- self.builder = get_MkdirBuilder()
- self.get_executor().set_action_list(self.builder.action)
- else:
- # Prepend MkdirBuilder action to existing action list
- l = self.get_executor().action_list
- a = get_MkdirBuilder().action
- l.insert(0, a)
- self.get_executor().set_action_list(l)
-
-
- def must_be_same(self, klass):
- if klass is Dir:
- return
- Base.must_be_same(self, klass)
-
- def _lookup_abs(self, p, klass, create=1):
- """
- Fast (?) lookup of a *normalized* absolute path.
-
- This method is intended for use by internal lookups with
- already-normalized path data. For general-purpose lookups,
- use the FS.Entry(), FS.Dir() or FS.File() methods.
-
- The caller is responsible for making sure we're passed a
- normalized absolute path; we merely let Python's dictionary look
- up and return the One True Node.FS object for the path.
-
- If a Node for the specified "p" doesn't already exist, and
- "create" is specified, the Node may be created after recursive
- invocation to find or create the parent directory or directories.
- """
- k = _my_normcase(p)
- try:
- result = self._lookupDict[k]
- except KeyError:
- if not create:
- msg = "No such file or directory: '%s' in '%s' (and create is False)" % (p, str(self))
- raise SCons.Errors.UserError(msg)
- # There is no Node for this path name, and we're allowed
- # to create it.
- dir_name, file_name = p.rsplit('/',1)
- dir_node = self._lookup_abs(dir_name, Dir)
- result = klass(file_name, dir_node, self.fs)
-
- # Double-check on disk (as configured) that the Node we
- # created matches whatever is out there in the real world.
- result.diskcheck_match()
-
- self._lookupDict[k] = result
- dir_node.entries[_my_normcase(file_name)] = result
- dir_node.implicit = None
- else:
- # There is already a Node for this path name. Allow it to
- # complain if we were looking for an inappropriate type.
- result.must_be_same(klass)
- return result
-
- def __str__(self):
- return self._abspath
-
- def entry_abspath(self, name):
- return self._abspath + name
-
- def entry_labspath(self, name):
- return '/' + name
-
- def entry_path(self, name):
- return self._path + name
-
- def entry_tpath(self, name):
- return self._tpath + name
-
- def is_under(self, dir):
- if self is dir:
- return 1
- else:
- return 0
-
- def up(self):
- return None
-
- def get_dir(self):
- return None
-
- def src_builder(self):
- return _null
-
-class FileNodeInfo(SCons.Node.NodeInfoBase):
- __slots__ = ('csig', 'timestamp', 'size')
- current_version_id = 2
-
- field_list = ['csig', 'timestamp', 'size']
-
- # This should get reset by the FS initialization.
- fs = None
-
- def str_to_node(self, s):
- top = self.fs.Top
- root = top.root
- if do_splitdrive:
- drive, s = _my_splitdrive(s)
- if drive:
- root = self.fs.get_root(drive)
- if not os.path.isabs(s):
- s = top.get_labspath() + '/' + s
- return root._lookup_abs(s, Entry)
-
- def __getstate__(self):
- """
- Return all fields that shall be pickled. Walk the slots in the class
- hierarchy and add those to the state dictionary. If a '__dict__' slot is
- available, copy all entries to the dictionary. Also include the version
- id, which is fixed for all instances of a class.
- """
- state = getattr(self, '__dict__', {}).copy()
- for obj in type(self).mro():
- for name in getattr(obj,'__slots__',()):
- if hasattr(self, name):
- state[name] = getattr(self, name)
-
- state['_version_id'] = self.current_version_id
- try:
- del state['__weakref__']
- except KeyError:
- pass
-
- return state
-
- def __setstate__(self, state):
- """
- Restore the attributes from a pickled state.
- """
- # TODO check or discard version
- del state['_version_id']
- for key, value in state.items():
- if key not in ('__weakref__',):
- setattr(self, key, value)
-
-class FileBuildInfo(SCons.Node.BuildInfoBase):
- __slots__ = ()
- current_version_id = 2
-
- def convert_to_sconsign(self):
- """
- Converts this FileBuildInfo object for writing to a .sconsign file
-
- This replaces each Node in our various dependency lists with its
- usual string representation: relative to the top-level SConstruct
- directory, or an absolute path if it's outside.
- """
- if os_sep_is_slash:
- node_to_str = str
- else:
- def node_to_str(n):
- try:
- s = n.get_internal_path()
- except AttributeError:
- s = str(n)
- else:
- s = s.replace(OS_SEP, '/')
- return s
- for attr in ['bsources', 'bdepends', 'bimplicit']:
- try:
- val = getattr(self, attr)
- except AttributeError:
- pass
- else:
- setattr(self, attr, list(map(node_to_str, val)))
- def convert_from_sconsign(self, dir, name):
- """
- Converts a newly-read FileBuildInfo object for in-SCons use
-
- For normal up-to-date checking, we don't have any conversion to
- perform--but we're leaving this method here to make that clear.
- """
- pass
- def prepare_dependencies(self):
- """
- Prepares a FileBuildInfo object for explaining what changed
-
- The bsources, bdepends and bimplicit lists have all been
- stored on disk as paths relative to the top-level SConstruct
- directory. Convert the strings to actual Nodes (for use by the
- --debug=explain code and --implicit-cache).
- """
- attrs = [
- ('bsources', 'bsourcesigs'),
- ('bdepends', 'bdependsigs'),
- ('bimplicit', 'bimplicitsigs'),
- ]
- for (nattr, sattr) in attrs:
- try:
- strings = getattr(self, nattr)
- nodeinfos = getattr(self, sattr)
- except AttributeError:
- continue
- if strings is None or nodeinfos is None:
- continue
- nodes = []
- for s, ni in zip(strings, nodeinfos):
- if not isinstance(s, SCons.Node.Node):
- s = ni.str_to_node(s)
- nodes.append(s)
- setattr(self, nattr, nodes)
- def format(self, names=0):
- result = []
- bkids = self.bsources + self.bdepends + self.bimplicit
- bkidsigs = self.bsourcesigs + self.bdependsigs + self.bimplicitsigs
- for bkid, bkidsig in zip(bkids, bkidsigs):
- result.append(str(bkid) + ': ' +
- ' '.join(bkidsig.format(names=names)))
- if not hasattr(self,'bact'):
- self.bact = "none"
- result.append('%s [%s]' % (self.bactsig, self.bact))
- return '\n'.join(result)
-
-class File(Base):
- """A class for files in a file system.
- """
-
- __slots__ = ['scanner_paths',
- 'cachedir_csig',
- 'cachesig',
- 'repositories',
- 'srcdir',
- 'entries',
- 'searched',
- '_sconsign',
- 'variant_dirs',
- 'root',
- 'dirname',
- 'on_disk_entries',
- 'sccs_dir',
- 'rcs_dir',
- 'released_target_info',
- 'contentsig']
-
- NodeInfo = FileNodeInfo
- BuildInfo = FileBuildInfo
-
- md5_chunksize = 64
-
- def diskcheck_match(self):
- diskcheck_match(self, self.isdir,
- "Directory %s found where file expected.")
-
- def __init__(self, name, directory, fs):
- if SCons.Debug.track_instances: logInstanceCreation(self, 'Node.FS.File')
- Base.__init__(self, name, directory, fs)
- self._morph()
-
- def Entry(self, name):
- """Create an entry node named 'name' relative to
- the directory of this file."""
- return self.dir.Entry(name)
-
- def Dir(self, name, create=True):
- """Create a directory node named 'name' relative to
- the directory of this file."""
- return self.dir.Dir(name, create=create)
-
- def Dirs(self, pathlist):
- """Create a list of directories relative to the SConscript
- directory of this file."""
- return [self.Dir(p) for p in pathlist]
-
- def File(self, name):
- """Create a file node named 'name' relative to
- the directory of this file."""
- return self.dir.File(name)
-
- #def generate_build_dict(self):
- # """Return an appropriate dictionary of values for building
- # this File."""
- # return {'Dir' : self.Dir,
- # 'File' : self.File,
- # 'RDirs' : self.RDirs}
-
- def _morph(self):
- """Turn a file system node into a File object."""
- self.scanner_paths = {}
- if not hasattr(self, '_local'):
- self._local = 0
- if not hasattr(self, 'released_target_info'):
- self.released_target_info = False
-
- self.store_info = 1
- self._func_exists = 4
- self._func_get_contents = 3
-
- # Initialize this Node's decider function to decide_source() because
- # every file is a source file until it has a Builder attached...
- self.changed_since_last_build = 4
-
- # If there was already a Builder set on this entry, then
- # we need to make sure we call the target-decider function,
- # not the source-decider. Reaching in and doing this by hand
- # is a little bogus. We'd prefer to handle this by adding
- # an Entry.builder_set() method that disambiguates like the
- # other methods, but that starts running into problems with the
- # fragile way we initialize Dir Nodes with their Mkdir builders,
- # yet still allow them to be overridden by the user. Since it's
- # not clear right now how to fix that, stick with what works
- # until it becomes clear...
- if self.has_builder():
- self.changed_since_last_build = 5
-
- def scanner_key(self):
- return self.get_suffix()
-
- def get_contents(self):
- return SCons.Node._get_contents_map[self._func_get_contents](self)
-
- # This attempts to figure out what the encoding of the text is
- # based upon the BOM bytes, and then decodes the contents so that
- # it's a valid python string.
- def get_text_contents(self):
- contents = self.get_contents()
- # The behavior of various decode() methods and functions
- # w.r.t. the initial BOM bytes is different for different
- # encodings and/or Python versions. ('utf-8' does not strip
- # them, but has a 'utf-8-sig' which does; 'utf-16' seems to
- # strip them; etc.) Just sidestep all the complication by
- # explicitly stripping the BOM before we decode().
- if contents.startswith(codecs.BOM_UTF8):
- return contents[len(codecs.BOM_UTF8):].decode('utf-8')
- if contents.startswith(codecs.BOM_UTF16_LE):
- return contents[len(codecs.BOM_UTF16_LE):].decode('utf-16-le')
- if contents.startswith(codecs.BOM_UTF16_BE):
- return contents[len(codecs.BOM_UTF16_BE):].decode('utf-16-be')
- return contents
-
- def get_content_hash(self):
- """
- Compute and return the MD5 hash for this file.
- """
- if not self.rexists():
- return SCons.Util.MD5signature('')
- fname = self.rfile().get_abspath()
- try:
- cs = SCons.Util.MD5filesignature(fname,
- chunksize=SCons.Node.FS.File.md5_chunksize*1024)
- except EnvironmentError, e:
- if not e.filename:
- e.filename = fname
- raise
- return cs
-
- @SCons.Memoize.CountMethodCall
- def get_size(self):
- try:
- return self._memo['get_size']
- except KeyError:
- pass
-
- if self.rexists():
- size = self.rfile().getsize()
- else:
- size = 0
-
- self._memo['get_size'] = size
-
- return size
-
- @SCons.Memoize.CountMethodCall
- def get_timestamp(self):
- try:
- return self._memo['get_timestamp']
- except KeyError:
- pass
-
- if self.rexists():
- timestamp = self.rfile().getmtime()
- else:
- timestamp = 0
-
- self._memo['get_timestamp'] = timestamp
-
- return timestamp
-
- convert_copy_attrs = [
- 'bsources',
- 'bimplicit',
- 'bdepends',
- 'bact',
- 'bactsig',
- 'ninfo',
- ]
-
-
- convert_sig_attrs = [
- 'bsourcesigs',
- 'bimplicitsigs',
- 'bdependsigs',
- ]
-
- def convert_old_entry(self, old_entry):
- # Convert a .sconsign entry from before the Big Signature
- # Refactoring, doing what we can to convert its information
- # to the new .sconsign entry format.
- #
- # The old format looked essentially like this:
- #
- # BuildInfo
- # .ninfo (NodeInfo)
- # .bsig
- # .csig
- # .timestamp
- # .size
- # .bsources
- # .bsourcesigs ("signature" list)
- # .bdepends
- # .bdependsigs ("signature" list)
- # .bimplicit
- # .bimplicitsigs ("signature" list)
- # .bact
- # .bactsig
- #
- # The new format looks like this:
- #
- # .ninfo (NodeInfo)
- # .bsig
- # .csig
- # .timestamp
- # .size
- # .binfo (BuildInfo)
- # .bsources
- # .bsourcesigs (NodeInfo list)
- # .bsig
- # .csig
- # .timestamp
- # .size
- # .bdepends
- # .bdependsigs (NodeInfo list)
- # .bsig
- # .csig
- # .timestamp
- # .size
- # .bimplicit
- # .bimplicitsigs (NodeInfo list)
- # .bsig
- # .csig
- # .timestamp
- # .size
- # .bact
- # .bactsig
- #
- # The basic idea of the new structure is that a NodeInfo always
- # holds all available information about the state of a given Node
- # at a certain point in time. The various .b*sigs lists can just
- # be a list of pointers to the .ninfo attributes of the different
- # dependent nodes, without any copying of information until it's
- # time to pickle it for writing out to a .sconsign file.
- #
- # The complicating issue is that the *old* format only stored one
- # "signature" per dependency, based on however the *last* build
- # was configured. We don't know from just looking at it whether
- # it was a build signature, a content signature, or a timestamp
- # "signature". Since we no longer use build signatures, the
- # best we can do is look at the length and if it's thirty two,
- # assume that it was (or might have been) a content signature.
- # If it was actually a build signature, then it will cause a
- # rebuild anyway when it doesn't match the new content signature,
- # but that's probably the best we can do.
- import SCons.SConsign
- new_entry = SCons.SConsign.SConsignEntry()
- new_entry.binfo = self.new_binfo()
- binfo = new_entry.binfo
- for attr in self.convert_copy_attrs:
- try:
- value = getattr(old_entry, attr)
- except AttributeError:
- continue
- setattr(binfo, attr, value)
- delattr(old_entry, attr)
- for attr in self.convert_sig_attrs:
- try:
- sig_list = getattr(old_entry, attr)
- except AttributeError:
- continue
- value = []
- for sig in sig_list:
- ninfo = self.new_ninfo()
- if len(sig) == 32:
- ninfo.csig = sig
- else:
- ninfo.timestamp = sig
- value.append(ninfo)
- setattr(binfo, attr, value)
- delattr(old_entry, attr)
- return new_entry
-
- @SCons.Memoize.CountMethodCall
- def get_stored_info(self):
- try:
- return self._memo['get_stored_info']
- except KeyError:
- pass
-
- try:
- sconsign_entry = self.dir.sconsign().get_entry(self.name)
- except (KeyError, EnvironmentError):
- import SCons.SConsign
- sconsign_entry = SCons.SConsign.SConsignEntry()
- sconsign_entry.binfo = self.new_binfo()
- sconsign_entry.ninfo = self.new_ninfo()
- else:
- if isinstance(sconsign_entry, FileBuildInfo):
- # This is a .sconsign file from before the Big Signature
- # Refactoring; convert it as best we can.
- sconsign_entry = self.convert_old_entry(sconsign_entry)
- try:
- delattr(sconsign_entry.ninfo, 'bsig')
- except AttributeError:
- pass
-
- self._memo['get_stored_info'] = sconsign_entry
-
- return sconsign_entry
-
- def get_stored_implicit(self):
- binfo = self.get_stored_info().binfo
- binfo.prepare_dependencies()
- try: return binfo.bimplicit
- except AttributeError: return None
-
- def rel_path(self, other):
- return self.dir.rel_path(other)
-
- def _get_found_includes_key(self, env, scanner, path):
- return (id(env), id(scanner), path)
-
- @SCons.Memoize.CountDictCall(_get_found_includes_key)
- def get_found_includes(self, env, scanner, path):
- """Return the included implicit dependencies in this file.
- Cache results so we only scan the file once per path
- regardless of how many times this information is requested.
- """
- memo_key = (id(env), id(scanner), path)
- try:
- memo_dict = self._memo['get_found_includes']
- except KeyError:
- memo_dict = {}
- self._memo['get_found_includes'] = memo_dict
- else:
- try:
- return memo_dict[memo_key]
- except KeyError:
- pass
-
- if scanner:
- # result = [n.disambiguate() for n in scanner(self, env, path)]
- result = scanner(self, env, path)
- result = [N.disambiguate() for N in result]
- else:
- result = []
-
- memo_dict[memo_key] = result
-
- return result
-
- def _createDir(self):
- # ensure that the directories for this node are
- # created.
- self.dir._create()
-
- def push_to_cache(self):
- """Try to push the node into a cache
- """
- # This should get called before the Nodes' .built() method is
- # called, which would clear the build signature if the file has
- # a source scanner.
- #
- # We have to clear the local memoized values *before* we push
- # the node to cache so that the memoization of the self.exists()
- # return value doesn't interfere.
- if self.nocache:
- return
- self.clear_memoized_values()
- if self.exists():
- self.get_build_env().get_CacheDir().push(self)
-
- def retrieve_from_cache(self):
- """Try to retrieve the node's content from a cache
-
- This method is called from multiple threads in a parallel build,
- so only do thread safe stuff here. Do thread unsafe stuff in
- built().
-
- Returns true if the node was successfully retrieved.
- """
- if self.nocache:
- return None
- if not self.is_derived():
- return None
- return self.get_build_env().get_CacheDir().retrieve(self)
-
- def visited(self):
- if self.exists() and self.executor is not None:
- self.get_build_env().get_CacheDir().push_if_forced(self)
-
- ninfo = self.get_ninfo()
-
- csig = self.get_max_drift_csig()
- if csig:
- ninfo.csig = csig
-
- ninfo.timestamp = self.get_timestamp()
- ninfo.size = self.get_size()
-
- if not self.has_builder():
- # This is a source file, but it might have been a target file
- # in another build that included more of the DAG. Copy
- # any build information that's stored in the .sconsign file
- # into our binfo object so it doesn't get lost.
- old = self.get_stored_info()
- self.get_binfo().merge(old.binfo)
-
- SCons.Node.store_info_map[self.store_info](self)
-
- def release_target_info(self):
- """Called just after this node has been marked
- up-to-date or was built completely.
-
- This is where we try to release as many target node infos
- as possible for clean builds and update runs, in order
- to minimize the overall memory consumption.
-
- We'd like to remove a lot more attributes like self.sources
- and self.sources_set, but they might get used
- in a next build step. For example, during configuration
- the source files for a built *.o file are used to figure out
- which linker to use for the resulting Program (gcc vs. g++)!
- That's why we check for the 'keep_targetinfo' attribute,
- config Nodes and the Interactive mode just don't allow
- an early release of most variables.
-
- In the same manner, we can't simply remove the self.attributes
- here. The smart linking relies on the shared flag, and some
- parts of the java Tool use it to transport information
- about nodes...
-
- @see: built() and Node.release_target_info()
- """
- if (self.released_target_info or SCons.Node.interactive):
- return
-
- if not hasattr(self.attributes, 'keep_targetinfo'):
- # Cache some required values, before releasing
- # stuff like env, executor and builder...
- self.changed(allowcache=True)
- self.get_contents_sig()
- self.get_build_env()
- # Now purge unneeded stuff to free memory...
- self.executor = None
- self._memo.pop('rfile', None)
- self.prerequisites = None
- # Cleanup lists, but only if they're empty
- if not len(self.ignore_set):
- self.ignore_set = None
- if not len(self.implicit_set):
- self.implicit_set = None
- if not len(self.depends_set):
- self.depends_set = None
- if not len(self.ignore):
- self.ignore = None
- if not len(self.depends):
- self.depends = None
- # Mark this node as done, we only have to release
- # the memory once...
- self.released_target_info = True
-
- def find_src_builder(self):
- if self.rexists():
- return None
- scb = self.dir.src_builder()
- if scb is _null:
- if diskcheck_sccs(self.dir, self.name):
- scb = get_DefaultSCCSBuilder()
- elif diskcheck_rcs(self.dir, self.name):
- scb = get_DefaultRCSBuilder()
- else:
- scb = None
- if scb is not None:
- try:
- b = self.builder
- except AttributeError:
- b = None
- if b is None:
- self.builder_set(scb)
- return scb
-
- def has_src_builder(self):
- """Return whether this Node has a source builder or not.
-
- If this Node doesn't have an explicit source code builder, this
- is where we figure out, on the fly, if there's a transparent
- source code builder for it.
-
- Note that if we found a source builder, we also set the
- self.builder attribute, so that all of the methods that actually
- *build* this file don't have to do anything different.
- """
- try:
- scb = self.sbuilder
- except AttributeError:
- scb = self.sbuilder = self.find_src_builder()
- return scb is not None
-
- def alter_targets(self):
- """Return any corresponding targets in a variant directory.
- """
- if self.is_derived():
- return [], None
- return self.fs.variant_dir_target_climb(self, self.dir, [self.name])
-
- def _rmv_existing(self):
- self.clear_memoized_values()
- if SCons.Node.print_duplicate:
- print "dup: removing existing target %s"%self
- e = Unlink(self, [], None)
- if isinstance(e, SCons.Errors.BuildError):
- raise e
-
- #
- # Taskmaster interface subsystem
- #
-
- def make_ready(self):
- self.has_src_builder()
- self.get_binfo()
-
- def prepare(self):
- """Prepare for this file to be created."""
- SCons.Node.Node.prepare(self)
-
- if self.get_state() != SCons.Node.up_to_date:
- if self.exists():
- if self.is_derived() and not self.precious:
- self._rmv_existing()
- else:
- try:
- self._createDir()
- except SCons.Errors.StopError, drive:
- desc = "No drive `%s' for target `%s'." % (drive, self)
- raise SCons.Errors.StopError(desc)
-
- #
- #
- #
-
- def remove(self):
- """Remove this file."""
- if self.exists() or self.islink():
- self.fs.unlink(self.get_internal_path())
- return 1
- return None
-
- def do_duplicate(self, src):
- self._createDir()
- if SCons.Node.print_duplicate:
- print "dup: relinking variant '%s' from '%s'"%(self, src)
- Unlink(self, None, None)
- e = Link(self, src, None)
- if isinstance(e, SCons.Errors.BuildError):
- desc = "Cannot duplicate `%s' in `%s': %s." % (src.get_internal_path(), self.dir._path, e.errstr)
- raise SCons.Errors.StopError(desc)
- self.linked = 1
- # The Link() action may or may not have actually
- # created the file, depending on whether the -n
- # option was used or not. Delete the _exists and
- # _rexists attributes so they can be reevaluated.
- self.clear()
-
- @SCons.Memoize.CountMethodCall
- def exists(self):
- try:
- return self._memo['exists']
- except KeyError:
- pass
-
- result = SCons.Node._exists_map[self._func_exists](self)
- self._memo['exists'] = result
- return result
-
- #
- # SIGNATURE SUBSYSTEM
- #
-
- def get_max_drift_csig(self):
- """
- Returns the content signature currently stored for this node
- if it's been unmodified longer than the max_drift value, or the
- max_drift value is 0. Returns None otherwise.
- """
- old = self.get_stored_info()
- mtime = self.get_timestamp()
-
- max_drift = self.fs.max_drift
- if max_drift > 0:
- if (time.time() - mtime) > max_drift:
- try:
- n = old.ninfo
- if n.timestamp and n.csig and n.timestamp == mtime:
- return n.csig
- except AttributeError:
- pass
- elif max_drift == 0:
- try:
- return old.ninfo.csig
- except AttributeError:
- pass
-
- return None
-
- def get_csig(self):
- """
- Generate a node's content signature, the digested signature
- of its content.
-
- node - the node
- cache - alternate node to use for the signature cache
- returns - the content signature
- """
- ninfo = self.get_ninfo()
- try:
- return ninfo.csig
- except AttributeError:
- pass
-
- csig = self.get_max_drift_csig()
- if csig is None:
-
- try:
- if self.get_size() < SCons.Node.FS.File.md5_chunksize:
- contents = self.get_contents()
- else:
- csig = self.get_content_hash()
- except IOError:
- # This can happen if there's actually a directory on-disk,
- # which can be the case if they've disabled disk checks,
- # or if an action with a File target actually happens to
- # create a same-named directory by mistake.
- csig = ''
- else:
- if not csig:
- csig = SCons.Util.MD5signature(contents)
-
- ninfo.csig = csig
-
- return csig
-
- #
- # DECISION SUBSYSTEM
- #
-
- def builder_set(self, builder):
- SCons.Node.Node.builder_set(self, builder)
- self.changed_since_last_build = 5
-
- def built(self):
- """Called just after this File node is successfully built.
-
- Just like for 'release_target_info' we try to release
- some more target node attributes in order to minimize the
- overall memory consumption.
-
- @see: release_target_info
- """
-
- SCons.Node.Node.built(self)
-
- if (not SCons.Node.interactive and
- not hasattr(self.attributes, 'keep_targetinfo')):
- # Ensure that the build infos get computed and cached...
- SCons.Node.store_info_map[self.store_info](self)
- # ... then release some more variables.
- self._specific_sources = False
- self._labspath = None
- self._save_str()
- self.cwd = None
-
- self.scanner_paths = None
-
- def changed(self, node=None, allowcache=False):
- """
- Returns if the node is up-to-date with respect to the BuildInfo
- stored last time it was built.
-
- For File nodes this is basically a wrapper around Node.changed(),
- but we allow the return value to get cached after the reference
- to the Executor got released in release_target_info().
-
- @see: Node.changed()
- """
- if node is None:
- try:
- return self._memo['changed']
- except KeyError:
- pass
-
- has_changed = SCons.Node.Node.changed(self, node)
- if allowcache:
- self._memo['changed'] = has_changed
- return has_changed
-
- def changed_content(self, target, prev_ni):
- cur_csig = self.get_csig()
- try:
- return cur_csig != prev_ni.csig
- except AttributeError:
- return 1
-
- def changed_state(self, target, prev_ni):
- return self.state != SCons.Node.up_to_date
-
- def changed_timestamp_then_content(self, target, prev_ni):
- if not self.changed_timestamp_match(target, prev_ni):
- try:
- self.get_ninfo().csig = prev_ni.csig
- except AttributeError:
- pass
- return False
- return self.changed_content(target, prev_ni)
-
- def changed_timestamp_newer(self, target, prev_ni):
- try:
- return self.get_timestamp() > target.get_timestamp()
- except AttributeError:
- return 1
-
- def changed_timestamp_match(self, target, prev_ni):
- try:
- return self.get_timestamp() != prev_ni.timestamp
- except AttributeError:
- return 1
-
- def is_up_to_date(self):
- T = 0
- if T: Trace('is_up_to_date(%s):' % self)
- if not self.exists():
- if T: Trace(' not self.exists():')
- # The file doesn't exist locally...
- r = self.rfile()
- if r != self:
- # ...but there is one in a Repository...
- if not self.changed(r):
- if T: Trace(' changed(%s):' % r)
- # ...and it's even up-to-date...
- if self._local:
- # ...and they'd like a local copy.
- e = LocalCopy(self, r, None)
- if isinstance(e, SCons.Errors.BuildError):
- raise
- SCons.Node.store_info_map[self.store_info](self)
- if T: Trace(' 1\n')
- return 1
- self.changed()
- if T: Trace(' None\n')
- return None
- else:
- r = self.changed()
- if T: Trace(' self.exists(): %s\n' % r)
- return not r
-
- @SCons.Memoize.CountMethodCall
- def rfile(self):
- try:
- return self._memo['rfile']
- except KeyError:
- pass
- result = self
- if not self.exists():
- norm_name = _my_normcase(self.name)
- for dir in self.dir.get_all_rdirs():
- try: node = dir.entries[norm_name]
- except KeyError: node = dir.file_on_disk(self.name)
- if node and node.exists() and \
- (isinstance(node, File) or isinstance(node, Entry) \
- or not node.is_derived()):
- result = node
- # Copy over our local attributes to the repository
- # Node so we identify shared object files in the
- # repository and don't assume they're static.
- #
- # This isn't perfect; the attribute would ideally
- # be attached to the object in the repository in
- # case it was built statically in the repository
- # and we changed it to shared locally, but that's
- # rarely the case and would only occur if you
- # intentionally used the same suffix for both
- # shared and static objects anyway. So this
- # should work well in practice.
- result.attributes = self.attributes
- break
- self._memo['rfile'] = result
- return result
-
- def rstr(self):
- return str(self.rfile())
-
- def get_cachedir_csig(self):
- """
- Fetch a Node's content signature for purposes of computing
- another Node's cachesig.
-
- This is a wrapper around the normal get_csig() method that handles
- the somewhat obscure case of using CacheDir with the -n option.
- Any files that don't exist would normally be "built" by fetching
- them from the cache, but the normal get_csig() method will try
- to open up the local file, which doesn't exist because the -n
- option meant we didn't actually pull the file from cachedir.
- But since the file *does* actually exist in the cachedir, we
- can use its contents for the csig.
- """
- try:
- return self.cachedir_csig
- except AttributeError:
- pass
-
- cachedir, cachefile = self.get_build_env().get_CacheDir().cachepath(self)
- if not self.exists() and cachefile and os.path.exists(cachefile):
- self.cachedir_csig = SCons.Util.MD5filesignature(cachefile, \
- SCons.Node.FS.File.md5_chunksize * 1024)
- else:
- self.cachedir_csig = self.get_csig()
- return self.cachedir_csig
-
- def get_contents_sig(self):
- """
- A helper method for get_cachedir_bsig.
-
- It computes and returns the signature for this
- node's contents.
- """
-
- try:
- return self.contentsig
- except AttributeError:
- pass
-
- executor = self.get_executor()
-
- result = self.contentsig = SCons.Util.MD5signature(executor.get_contents())
- return result
-
- def get_cachedir_bsig(self):
- """
- Return the signature for a cached file, including
- its children.
-
- It adds the path of the cached file to the cache signature,
- because multiple targets built by the same action will all
- have the same build signature, and we have to differentiate
- them somehow.
- """
- try:
- return self.cachesig
- except AttributeError:
- pass
-
- # Collect signatures for all children
- children = self.children()
- sigs = [n.get_cachedir_csig() for n in children]
- # Append this node's signature...
- sigs.append(self.get_contents_sig())
- # ...and it's path
- sigs.append(self.get_internal_path())
- # Merge this all into a single signature
- result = self.cachesig = SCons.Util.MD5collect(sigs)
- return result
-
-default_fs = None
-
-def get_default_fs():
- global default_fs
- if not default_fs:
- default_fs = FS()
- return default_fs
-
-class FileFinder(object):
- """
- """
-
- def __init__(self):
- self._memo = {}
-
- def filedir_lookup(self, p, fd=None):
- """
- A helper method for find_file() that looks up a directory for
- a file we're trying to find. This only creates the Dir Node if
- it exists on-disk, since if the directory doesn't exist we know
- we won't find any files in it... :-)
-
- It would be more compact to just use this as a nested function
- with a default keyword argument (see the commented-out version
- below), but that doesn't work unless you have nested scopes,
- so we define it here just so this work under Python 1.5.2.
- """
- if fd is None:
- fd = self.default_filedir
- dir, name = os.path.split(fd)
- drive, d = _my_splitdrive(dir)
- if not name and d[:1] in ('/', OS_SEP):
- #return p.fs.get_root(drive).dir_on_disk(name)
- return p.fs.get_root(drive)
- if dir:
- p = self.filedir_lookup(p, dir)
- if not p:
- return None
- norm_name = _my_normcase(name)
- try:
- node = p.entries[norm_name]
- except KeyError:
- return p.dir_on_disk(name)
- if isinstance(node, Dir):
- return node
- if isinstance(node, Entry):
- node.must_be_same(Dir)
- return node
- return None
-
- def _find_file_key(self, filename, paths, verbose=None):
- return (filename, paths)
-
- @SCons.Memoize.CountDictCall(_find_file_key)
- def find_file(self, filename, paths, verbose=None):
- """
- find_file(str, [Dir()]) -> [nodes]
-
- filename - a filename to find
- paths - a list of directory path *nodes* to search in. Can be
- represented as a list, a tuple, or a callable that is
- called with no arguments and returns the list or tuple.
-
- returns - the node created from the found file.
-
- Find a node corresponding to either a derived file or a file
- that exists already.
-
- Only the first file found is returned, and none is returned
- if no file is found.
- """
- memo_key = self._find_file_key(filename, paths)
- try:
- memo_dict = self._memo['find_file']
- except KeyError:
- memo_dict = {}
- self._memo['find_file'] = memo_dict
- else:
- try:
- return memo_dict[memo_key]
- except KeyError:
- pass
-
- if verbose and not callable(verbose):
- if not SCons.Util.is_String(verbose):
- verbose = "find_file"
- _verbose = u' %s: ' % verbose
- verbose = lambda s: sys.stdout.write(_verbose + s)
-
- filedir, filename = os.path.split(filename)
- if filedir:
- # More compact code that we can't use until we drop
- # support for Python 1.5.2:
- #
- #def filedir_lookup(p, fd=filedir):
- # """
- # A helper function that looks up a directory for a file
- # we're trying to find. This only creates the Dir Node
- # if it exists on-disk, since if the directory doesn't
- # exist we know we won't find any files in it... :-)
- # """
- # dir, name = os.path.split(fd)
- # if dir:
- # p = filedir_lookup(p, dir)
- # if not p:
- # return None
- # norm_name = _my_normcase(name)
- # try:
- # node = p.entries[norm_name]
- # except KeyError:
- # return p.dir_on_disk(name)
- # if isinstance(node, Dir):
- # return node
- # if isinstance(node, Entry):
- # node.must_be_same(Dir)
- # return node
- # if isinstance(node, Dir) or isinstance(node, Entry):
- # return node
- # return None
- #paths = [_f for _f in map(filedir_lookup, paths) if _f]
-
- self.default_filedir = filedir
- paths = [_f for _f in map(self.filedir_lookup, paths) if _f]
-
- result = None
- for dir in paths:
- if verbose:
- verbose("looking for '%s' in '%s' ...\n" % (filename, dir))
- node, d = dir.srcdir_find_file(filename)
- if node:
- if verbose:
- verbose("... FOUND '%s' in '%s'\n" % (filename, d))
- result = node
- break
-
- memo_dict[memo_key] = result
-
- return result
-
-find_file = FileFinder().find_file
-
-
-def invalidate_node_memos(targets):
- """
- Invalidate the memoized values of all Nodes (files or directories)
- that are associated with the given entries. Has been added to
- clear the cache of nodes affected by a direct execution of an
- action (e.g. Delete/Copy/Chmod). Existing Node caches become
- inconsistent if the action is run through Execute(). The argument
- `targets` can be a single Node object or filename, or a sequence
- of Nodes/filenames.
- """
- from traceback import extract_stack
-
- # First check if the cache really needs to be flushed. Only
- # actions run in the SConscript with Execute() seem to be
- # affected. XXX The way to check if Execute() is in the stacktrace
- # is a very dirty hack and should be replaced by a more sensible
- # solution.
- for f in extract_stack():
- if f[2] == 'Execute' and f[0][-14:] == 'Environment.py':
- break
- else:
- # Dont have to invalidate, so return
- return
-
- if not SCons.Util.is_List(targets):
- targets = [targets]
-
- for entry in targets:
- # If the target is a Node object, clear the cache. If it is a
- # filename, look up potentially existing Node object first.
- try:
- entry.clear_memoized_values()
- except AttributeError:
- # Not a Node object, try to look up Node by filename. XXX
- # This creates Node objects even for those filenames which
- # do not correspond to an existing Node object.
- node = get_default_fs().Entry(entry)
- if node:
- node.clear_memoized_values()
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Node/Python.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Node/Python.py
deleted file mode 100644
index b247ff6..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Node/Python.py
+++ /dev/null
@@ -1,164 +0,0 @@
-"""scons.Node.Python
-
-Python nodes.
-
-"""
-
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-
-__revision__ = "src/engine/SCons/Node/Python.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-import SCons.Node
-
-class ValueNodeInfo(SCons.Node.NodeInfoBase):
- __slots__ = ('csig',)
- current_version_id = 2
-
- field_list = ['csig']
-
- def str_to_node(self, s):
- return Value(s)
-
- def __getstate__(self):
- """
- Return all fields that shall be pickled. Walk the slots in the class
- hierarchy and add those to the state dictionary. If a '__dict__' slot is
- available, copy all entries to the dictionary. Also include the version
- id, which is fixed for all instances of a class.
- """
- state = getattr(self, '__dict__', {}).copy()
- for obj in type(self).mro():
- for name in getattr(obj,'__slots__',()):
- if hasattr(self, name):
- state[name] = getattr(self, name)
-
- state['_version_id'] = self.current_version_id
- try:
- del state['__weakref__']
- except KeyError:
- pass
-
- return state
-
- def __setstate__(self, state):
- """
- Restore the attributes from a pickled state.
- """
- # TODO check or discard version
- del state['_version_id']
- for key, value in state.items():
- if key not in ('__weakref__',):
- setattr(self, key, value)
-
-
-class ValueBuildInfo(SCons.Node.BuildInfoBase):
- __slots__ = ()
- current_version_id = 2
-
-class Value(SCons.Node.Node):
- """A class for Python variables, typically passed on the command line
- or generated by a script, but not from a file or some other source.
- """
-
- NodeInfo = ValueNodeInfo
- BuildInfo = ValueBuildInfo
-
- def __init__(self, value, built_value=None):
- SCons.Node.Node.__init__(self)
- self.value = value
- self.changed_since_last_build = 6
- self.store_info = 0
- if built_value is not None:
- self.built_value = built_value
-
- def str_for_display(self):
- return repr(self.value)
-
- def __str__(self):
- return str(self.value)
-
- def make_ready(self):
- self.get_csig()
-
- def build(self, **kw):
- if not hasattr(self, 'built_value'):
- SCons.Node.Node.build(self, **kw)
-
- is_up_to_date = SCons.Node.Node.children_are_up_to_date
-
- def is_under(self, dir):
- # Make Value nodes get built regardless of
- # what directory scons was run from. Value nodes
- # are outside the filesystem:
- return 1
-
- def write(self, built_value):
- """Set the value of the node."""
- self.built_value = built_value
-
- def read(self):
- """Return the value. If necessary, the value is built."""
- self.build()
- if not hasattr(self, 'built_value'):
- self.built_value = self.value
- return self.built_value
-
- def get_text_contents(self):
- """By the assumption that the node.built_value is a
- deterministic product of the sources, the contents of a Value
- are the concatenation of all the contents of its sources. As
- the value need not be built when get_contents() is called, we
- cannot use the actual node.built_value."""
- ###TODO: something reasonable about universal newlines
- contents = str(self.value)
- for kid in self.children(None):
- contents = contents + kid.get_contents()
- return contents
-
- get_contents = get_text_contents ###TODO should return 'bytes' value
-
- def changed_since_last_build(self, target, prev_ni):
- cur_csig = self.get_csig()
- try:
- return cur_csig != prev_ni.csig
- except AttributeError:
- return 1
-
- def get_csig(self, calc=None):
- """Because we're a Python value node and don't have a real
- timestamp, we get to ignore the calculator and just use the
- value contents."""
- try:
- return self.ninfo.csig
- except AttributeError:
- pass
- contents = self.get_contents()
- self.get_ninfo().csig = contents
- return contents
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Node/__init__.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Node/__init__.py
deleted file mode 100644
index 79db894..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Node/__init__.py
+++ /dev/null
@@ -1,1718 +0,0 @@
-"""SCons.Node
-
-The Node package for the SCons software construction utility.
-
-This is, in many ways, the heart of SCons.
-
-A Node is where we encapsulate all of the dependency information about
-any thing that SCons can build, or about any thing which SCons can use
-to build some other thing. The canonical "thing," of course, is a file,
-but a Node can also represent something remote (like a web page) or
-something completely abstract (like an Alias).
-
-Each specific type of "thing" is specifically represented by a subclass
-of the Node base class: Node.FS.File for files, Node.Alias for aliases,
-etc. Dependency information is kept here in the base class, and
-information specific to files/aliases/etc. is in the subclass. The
-goal, if we've done this correctly, is that any type of "thing" should
-be able to depend on any other type of "thing."
-
-"""
-
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-__revision__ = "src/engine/SCons/Node/__init__.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-import collections
-import copy
-from itertools import chain
-
-import SCons.Debug
-from SCons.Debug import logInstanceCreation
-import SCons.Executor
-import SCons.Memoize
-import SCons.Util
-
-from SCons.Debug import Trace
-
-print_duplicate = 0
-
-def classname(obj):
- return str(obj.__class__).split('.')[-1]
-
-# Set to false if we're doing a dry run. There's more than one of these
-# little treats
-do_store_info = True
-
-# Node states
-#
-# These are in "priority" order, so that the maximum value for any
-# child/dependency of a node represents the state of that node if
-# it has no builder of its own. The canonical example is a file
-# system directory, which is only up to date if all of its children
-# were up to date.
-no_state = 0
-pending = 1
-executing = 2
-up_to_date = 3
-executed = 4
-failed = 5
-
-StateString = {
- 0 : "no_state",
- 1 : "pending",
- 2 : "executing",
- 3 : "up_to_date",
- 4 : "executed",
- 5 : "failed",
-}
-
-# controls whether implicit dependencies are cached:
-implicit_cache = 0
-
-# controls whether implicit dep changes are ignored:
-implicit_deps_unchanged = 0
-
-# controls whether the cached implicit deps are ignored:
-implicit_deps_changed = 0
-
-# A variable that can be set to an interface-specific function be called
-# to annotate a Node with information about its creation.
-def do_nothing(node): pass
-
-Annotate = do_nothing
-
-# Gets set to 'True' if we're running in interactive mode. Is
-# currently used to release parts of a target's info during
-# clean builds and update runs (see release_target_info).
-interactive = False
-
-def is_derived_none(node):
- raise NotImplementedError
-
-def is_derived_node(node):
- """
- Returns true if this node is derived (i.e. built).
- """
- return node.has_builder() or node.side_effect
-
-_is_derived_map = {0 : is_derived_none,
- 1 : is_derived_node}
-
-def exists_none(node):
- raise NotImplementedError
-
-def exists_always(node):
- return 1
-
-def exists_base(node):
- return node.stat() is not None
-
-def exists_entry(node):
- """Return if the Entry exists. Check the file system to see
- what we should turn into first. Assume a file if there's no
- directory."""
- node.disambiguate()
- return _exists_map[node._func_exists](node)
-
-def exists_file(node):
- # Duplicate from source path if we are set up to do this.
- if node.duplicate and not node.is_derived() and not node.linked:
- src = node.srcnode()
- if src is not node:
- # At this point, src is meant to be copied in a variant directory.
- src = src.rfile()
- if src.get_abspath() != node.get_abspath():
- if src.exists():
- node.do_duplicate(src)
- # Can't return 1 here because the duplication might
- # not actually occur if the -n option is being used.
- else:
- # The source file does not exist. Make sure no old
- # copy remains in the variant directory.
- if print_duplicate:
- print "dup: no src for %s, unlinking old variant copy"%self
- if exists_base(node) or node.islink():
- node.fs.unlink(node.get_internal_path())
- # Return None explicitly because the Base.exists() call
- # above will have cached its value if the file existed.
- return None
- return exists_base(node)
-
-_exists_map = {0 : exists_none,
- 1 : exists_always,
- 2 : exists_base,
- 3 : exists_entry,
- 4 : exists_file}
-
-
-def rexists_none(node):
- raise NotImplementedError
-
-def rexists_node(node):
- return node.exists()
-
-def rexists_base(node):
- return node.rfile().exists()
-
-_rexists_map = {0 : rexists_none,
- 1 : rexists_node,
- 2 : rexists_base}
-
-def get_contents_none(node):
- raise NotImplementedError
-
-def get_contents_entry(node):
- """Fetch the contents of the entry. Returns the exact binary
- contents of the file."""
- try:
- node = node.disambiguate(must_exist=1)
- except SCons.Errors.UserError:
- # There was nothing on disk with which to disambiguate
- # this entry. Leave it as an Entry, but return a null
- # string so calls to get_contents() in emitters and the
- # like (e.g. in qt.py) don't have to disambiguate by hand
- # or catch the exception.
- return ''
- else:
- return _get_contents_map[node._func_get_contents](node)
-
-def get_contents_dir(node):
- """Return content signatures and names of all our children
- separated by new-lines. Ensure that the nodes are sorted."""
- contents = []
- for n in sorted(node.children(), key=lambda t: t.name):
- contents.append('%s %s\n' % (n.get_csig(), n.name))
- return ''.join(contents)
-
-def get_contents_file(node):
- if not node.rexists():
- return ''
- fname = node.rfile().get_abspath()
- try:
- contents = open(fname, "rb").read()
- except EnvironmentError, e:
- if not e.filename:
- e.filename = fname
- raise
- return contents
-
-_get_contents_map = {0 : get_contents_none,
- 1 : get_contents_entry,
- 2 : get_contents_dir,
- 3 : get_contents_file}
-
-def target_from_source_none(node, prefix, suffix, splitext):
- raise NotImplementedError
-
-def target_from_source_base(node, prefix, suffix, splitext):
- return node.dir.Entry(prefix + splitext(node.name)[0] + suffix)
-
-_target_from_source_map = {0 : target_from_source_none,
- 1 : target_from_source_base}
-
-#
-# The new decider subsystem for Nodes
-#
-# We would set and overwrite the changed_since_last_build function
-# before, but for being able to use slots (less memory!) we now have
-# a dictionary of the different decider functions. Then in the Node
-# subclasses we simply store the index to the decider that should be
-# used by it.
-#
-
-#
-# First, the single decider functions
-#
-def changed_since_last_build_node(node, target, prev_ni):
- """
-
- Must be overridden in a specific subclass to return True if this
- Node (a dependency) has changed since the last time it was used
- to build the specified target. prev_ni is this Node's state (for
- example, its file timestamp, length, maybe content signature)
- as of the last time the target was built.
-
- Note that this method is called through the dependency, not the
- target, because a dependency Node must be able to use its own
- logic to decide if it changed. For example, File Nodes need to
- obey if we're configured to use timestamps, but Python Value Nodes
- never use timestamps and always use the content. If this method
- were called through the target, then each Node's implementation
- of this method would have to have more complicated logic to
- handle all the different Node types on which it might depend.
- """
- raise NotImplementedError
-
-def changed_since_last_build_alias(node, target, prev_ni):
- cur_csig = node.get_csig()
- try:
- return cur_csig != prev_ni.csig
- except AttributeError:
- return 1
-
-def changed_since_last_build_entry(node, target, prev_ni):
- node.disambiguate()
- return _decider_map[node.changed_since_last_build](node, target, prev_ni)
-
-def changed_since_last_build_state_changed(node, target, prev_ni):
- return (node.state != SCons.Node.up_to_date)
-
-def decide_source(node, target, prev_ni):
- return target.get_build_env().decide_source(node, target, prev_ni)
-
-def decide_target(node, target, prev_ni):
- return target.get_build_env().decide_target(node, target, prev_ni)
-
-def changed_since_last_build_python(node, target, prev_ni):
- cur_csig = node.get_csig()
- try:
- return cur_csig != prev_ni.csig
- except AttributeError:
- return 1
-
-
-#
-# Now, the mapping from indices to decider functions
-#
-_decider_map = {0 : changed_since_last_build_node,
- 1 : changed_since_last_build_alias,
- 2 : changed_since_last_build_entry,
- 3 : changed_since_last_build_state_changed,
- 4 : decide_source,
- 5 : decide_target,
- 6 : changed_since_last_build_python}
-
-do_store_info = True
-
-#
-# The new store_info subsystem for Nodes
-#
-# We would set and overwrite the store_info function
-# before, but for being able to use slots (less memory!) we now have
-# a dictionary of the different functions. Then in the Node
-# subclasses we simply store the index to the info method that should be
-# used by it.
-#
-
-#
-# First, the single info functions
-#
-
-def store_info_pass(node):
- pass
-
-def store_info_file(node):
- # Merge our build information into the already-stored entry.
- # This accommodates "chained builds" where a file that's a target
- # in one build (SConstruct file) is a source in a different build.
- # See test/chained-build.py for the use case.
- if do_store_info:
- node.dir.sconsign().store_info(node.name, node)
-
-
-store_info_map = {0 : store_info_pass,
- 1 : store_info_file}
-
-# Classes for signature info for Nodes.
-
-class NodeInfoBase(object):
- """
- The generic base class for signature information for a Node.
-
- Node subclasses should subclass NodeInfoBase to provide their own
- logic for dealing with their own Node-specific signature information.
- """
- __slots__ = ('__weakref__',)
- current_version_id = 2
- def update(self, node):
- try:
- field_list = self.field_list
- except AttributeError:
- return
- for f in field_list:
- try:
- delattr(self, f)
- except AttributeError:
- pass
- try:
- func = getattr(node, 'get_' + f)
- except AttributeError:
- pass
- else:
- setattr(self, f, func())
- def convert(self, node, val):
- pass
- def merge(self, other):
- """
- Merge the fields of another object into this object. Already existing
- information is overwritten by the other instance's data.
- WARNING: If a '__dict__' slot is added, it should be updated instead of
- replaced.
- """
- state = other.__getstate__()
- self.__setstate__(state)
- def format(self, field_list=None, names=0):
- if field_list is None:
- try:
- field_list = self.field_list
- except AttributeError:
- field_list = getattr(self, '__dict__', {}).keys()
- for obj in type(self).mro():
- for slot in getattr(obj, '__slots__', ()):
- if slot not in ('__weakref__', '__dict__'):
- field_list.append(slot)
- field_list.sort()
- fields = []
- for field in field_list:
- try:
- f = getattr(self, field)
- except AttributeError:
- f = None
- f = str(f)
- if names:
- f = field + ': ' + f
- fields.append(f)
- return fields
-
- def __getstate__(self):
- """
- Return all fields that shall be pickled. Walk the slots in the class
- hierarchy and add those to the state dictionary. If a '__dict__' slot is
- available, copy all entries to the dictionary. Also include the version
- id, which is fixed for all instances of a class.
- """
- state = getattr(self, '__dict__', {}).copy()
- for obj in type(self).mro():
- for name in getattr(obj,'__slots__',()):
- if hasattr(self, name):
- state[name] = getattr(self, name)
-
- state['_version_id'] = self.current_version_id
- try:
- del state['__weakref__']
- except KeyError:
- pass
- return state
-
- def __setstate__(self, state):
- """
- Restore the attributes from a pickled state. The version is discarded.
- """
- # TODO check or discard version
- del state['_version_id']
-
- for key, value in state.items():
- if key not in ('__weakref__',):
- setattr(self, key, value)
-
-
-class BuildInfoBase(object):
- """
- The generic base class for build information for a Node.
-
- This is what gets stored in a .sconsign file for each target file.
- It contains a NodeInfo instance for this node (signature information
- that's specific to the type of Node) and direct attributes for the
- generic build stuff we have to track: sources, explicit dependencies,
- implicit dependencies, and action information.
- """
- __slots__ = ("bsourcesigs", "bdependsigs", "bimplicitsigs", "bactsig",
- "bsources", "bdepends", "bact", "bimplicit", "__weakref__")
- current_version_id = 2
- def __init__(self):
- # Create an object attribute from the class attribute so it ends up
- # in the pickled data in the .sconsign file.
- self.bsourcesigs = []
- self.bdependsigs = []
- self.bimplicitsigs = []
- self.bactsig = None
- def merge(self, other):
- """
- Merge the fields of another object into this object. Already existing
- information is overwritten by the other instance's data.
- WARNING: If a '__dict__' slot is added, it should be updated instead of
- replaced.
- """
- state = other.__getstate__()
- self.__setstate__(state)
-
- def __getstate__(self):
- """
- Return all fields that shall be pickled. Walk the slots in the class
- hierarchy and add those to the state dictionary. If a '__dict__' slot is
- available, copy all entries to the dictionary. Also include the version
- id, which is fixed for all instances of a class.
- """
- state = getattr(self, '__dict__', {}).copy()
- for obj in type(self).mro():
- for name in getattr(obj,'__slots__',()):
- if hasattr(self, name):
- state[name] = getattr(self, name)
-
- state['_version_id'] = self.current_version_id
- try:
- del state['__weakref__']
- except KeyError:
- pass
- return state
-
- def __setstate__(self, state):
- """
- Restore the attributes from a pickled state.
- """
- # TODO check or discard version
- del state['_version_id']
- for key, value in state.items():
- if key not in ('__weakref__',):
- setattr(self, key, value)
-
-class Node(object):
- """The base Node class, for entities that we know how to
- build, or use to build other Nodes.
- """
-
- __slots__ = ['sources',
- 'sources_set',
- '_specific_sources',
- 'depends',
- 'depends_set',
- 'ignore',
- 'ignore_set',
- 'prerequisites',
- 'implicit',
- 'waiting_parents',
- 'waiting_s_e',
- 'ref_count',
- 'wkids',
- 'env',
- 'state',
- 'precious',
- 'noclean',
- 'nocache',
- 'cached',
- 'always_build',
- 'includes',
- 'attributes',
- 'side_effect',
- 'side_effects',
- 'linked',
- '_memo',
- 'executor',
- 'binfo',
- 'ninfo',
- 'builder',
- 'is_explicit',
- 'implicit_set',
- 'changed_since_last_build',
- 'store_info',
- 'pseudo',
- '_tags',
- '_func_is_derived',
- '_func_exists',
- '_func_rexists',
- '_func_get_contents',
- '_func_target_from_source']
-
- class Attrs(object):
- __slots__ = ('shared', '__dict__')
-
-
- def __init__(self):
- if SCons.Debug.track_instances: logInstanceCreation(self, 'Node.Node')
- # Note that we no longer explicitly initialize a self.builder
- # attribute to None here. That's because the self.builder
- # attribute may be created on-the-fly later by a subclass (the
- # canonical example being a builder to fetch a file from a
- # source code system like CVS or Subversion).
-
- # Each list of children that we maintain is accompanied by a
- # dictionary used to look up quickly whether a node is already
- # present in the list. Empirical tests showed that it was
- # fastest to maintain them as side-by-side Node attributes in
- # this way, instead of wrapping up each list+dictionary pair in
- # a class. (Of course, we could always still do that in the
- # future if we had a good reason to...).
- self.sources = [] # source files used to build node
- self.sources_set = set()
- self._specific_sources = False
- self.depends = [] # explicit dependencies (from Depends)
- self.depends_set = set()
- self.ignore = [] # dependencies to ignore
- self.ignore_set = set()
- self.prerequisites = None
- self.implicit = None # implicit (scanned) dependencies (None means not scanned yet)
- self.waiting_parents = set()
- self.waiting_s_e = set()
- self.ref_count = 0
- self.wkids = None # Kids yet to walk, when it's an array
-
- self.env = None
- self.state = no_state
- self.precious = None
- self.pseudo = False
- self.noclean = 0
- self.nocache = 0
- self.cached = 0 # is this node pulled from cache?
- self.always_build = None
- self.includes = None
- self.attributes = self.Attrs() # Generic place to stick information about the Node.
- self.side_effect = 0 # true iff this node is a side effect
- self.side_effects = [] # the side effects of building this target
- self.linked = 0 # is this node linked to the variant directory?
- self.changed_since_last_build = 0
- self.store_info = 0
- self._tags = None
- self._func_is_derived = 1
- self._func_exists = 1
- self._func_rexists = 1
- self._func_get_contents = 0
- self._func_target_from_source = 0
-
- self.clear_memoized_values()
-
- # Let the interface in which the build engine is embedded
- # annotate this Node with its own info (like a description of
- # what line in what file created the node, for example).
- Annotate(self)
-
- def disambiguate(self, must_exist=None):
- return self
-
- def get_suffix(self):
- return ''
-
- @SCons.Memoize.CountMethodCall
- def get_build_env(self):
- """Fetch the appropriate Environment to build this node.
- """
- try:
- return self._memo['get_build_env']
- except KeyError:
- pass
- result = self.get_executor().get_build_env()
- self._memo['get_build_env'] = result
- return result
-
- def get_build_scanner_path(self, scanner):
- """Fetch the appropriate scanner path for this node."""
- return self.get_executor().get_build_scanner_path(scanner)
-
- def set_executor(self, executor):
- """Set the action executor for this node."""
- self.executor = executor
-
- def get_executor(self, create=1):
- """Fetch the action executor for this node. Create one if
- there isn't already one, and requested to do so."""
- try:
- executor = self.executor
- except AttributeError:
- if not create:
- raise
- try:
- act = self.builder.action
- except AttributeError:
- executor = SCons.Executor.Null(targets=[self])
- else:
- executor = SCons.Executor.Executor(act,
- self.env or self.builder.env,
- [self.builder.overrides],
- [self],
- self.sources)
- self.executor = executor
- return executor
-
- def executor_cleanup(self):
- """Let the executor clean up any cached information."""
- try:
- executor = self.get_executor(create=None)
- except AttributeError:
- pass
- else:
- if executor is not None:
- executor.cleanup()
-
- def reset_executor(self):
- "Remove cached executor; forces recompute when needed."
- try:
- delattr(self, 'executor')
- except AttributeError:
- pass
-
- def push_to_cache(self):
- """Try to push a node into a cache
- """
- pass
-
- def retrieve_from_cache(self):
- """Try to retrieve the node's content from a cache
-
- This method is called from multiple threads in a parallel build,
- so only do thread safe stuff here. Do thread unsafe stuff in
- built().
-
- Returns true if the node was successfully retrieved.
- """
- return 0
-
- #
- # Taskmaster interface subsystem
- #
-
- def make_ready(self):
- """Get a Node ready for evaluation.
-
- This is called before the Taskmaster decides if the Node is
- up-to-date or not. Overriding this method allows for a Node
- subclass to be disambiguated if necessary, or for an implicit
- source builder to be attached.
- """
- pass
-
- def prepare(self):
- """Prepare for this Node to be built.
-
- This is called after the Taskmaster has decided that the Node
- is out-of-date and must be rebuilt, but before actually calling
- the method to build the Node.
-
- This default implementation checks that explicit or implicit
- dependencies either exist or are derived, and initializes the
- BuildInfo structure that will hold the information about how
- this node is, uh, built.
-
- (The existence of source files is checked separately by the
- Executor, which aggregates checks for all of the targets built
- by a specific action.)
-
- Overriding this method allows for for a Node subclass to remove
- the underlying file from the file system. Note that subclass
- methods should call this base class method to get the child
- check and the BuildInfo structure.
- """
- if self.depends is not None:
- for d in self.depends:
- if d.missing():
- msg = "Explicit dependency `%s' not found, needed by target `%s'."
- raise SCons.Errors.StopError(msg % (d, self))
- if self.implicit is not None:
- for i in self.implicit:
- if i.missing():
- msg = "Implicit dependency `%s' not found, needed by target `%s'."
- raise SCons.Errors.StopError(msg % (i, self))
- self.binfo = self.get_binfo()
-
- def build(self, **kw):
- """Actually build the node.
-
- This is called by the Taskmaster after it's decided that the
- Node is out-of-date and must be rebuilt, and after the prepare()
- method has gotten everything, uh, prepared.
-
- This method is called from multiple threads in a parallel build,
- so only do thread safe stuff here. Do thread unsafe stuff
- in built().
-
- """
- try:
- self.get_executor()(self, **kw)
- except SCons.Errors.BuildError, e:
- e.node = self
- raise
-
- def built(self):
- """Called just after this node is successfully built."""
-
- # Clear the implicit dependency caches of any Nodes
- # waiting for this Node to be built.
- for parent in self.waiting_parents:
- parent.implicit = None
-
- self.clear()
-
- if self.pseudo:
- if self.exists():
- raise SCons.Errors.UserError("Pseudo target " + str(self) + " must not exist")
- else:
- if not self.exists() and do_store_info:
- SCons.Warnings.warn(SCons.Warnings.TargetNotBuiltWarning,
- "Cannot find target " + str(self) + " after building")
- self.ninfo.update(self)
-
- def visited(self):
- """Called just after this node has been visited (with or
- without a build)."""
- try:
- binfo = self.binfo
- except AttributeError:
- # Apparently this node doesn't need build info, so
- # don't bother calculating or storing it.
- pass
- else:
- self.ninfo.update(self)
- SCons.Node.store_info_map[self.store_info](self)
-
- def release_target_info(self):
- """Called just after this node has been marked
- up-to-date or was built completely.
-
- This is where we try to release as many target node infos
- as possible for clean builds and update runs, in order
- to minimize the overall memory consumption.
-
- By purging attributes that aren't needed any longer after
- a Node (=File) got built, we don't have to care that much how
- many KBytes a Node actually requires...as long as we free
- the memory shortly afterwards.
-
- @see: built() and File.release_target_info()
- """
- pass
-
- #
- #
- #
-
- def add_to_waiting_s_e(self, node):
- self.waiting_s_e.add(node)
-
- def add_to_waiting_parents(self, node):
- """
- Returns the number of nodes added to our waiting parents list:
- 1 if we add a unique waiting parent, 0 if not. (Note that the
- returned values are intended to be used to increment a reference
- count, so don't think you can "clean up" this function by using
- True and False instead...)
- """
- wp = self.waiting_parents
- if node in wp:
- return 0
- wp.add(node)
- return 1
-
- def postprocess(self):
- """Clean up anything we don't need to hang onto after we've
- been built."""
- self.executor_cleanup()
- self.waiting_parents = set()
-
- def clear(self):
- """Completely clear a Node of all its cached state (so that it
- can be re-evaluated by interfaces that do continuous integration
- builds).
- """
- # The del_binfo() call here isn't necessary for normal execution,
- # but is for interactive mode, where we might rebuild the same
- # target and need to start from scratch.
- self.del_binfo()
- self.clear_memoized_values()
- self.ninfo = self.new_ninfo()
- self.executor_cleanup()
- try:
- delattr(self, '_calculated_sig')
- except AttributeError:
- pass
- self.includes = None
-
- def clear_memoized_values(self):
- self._memo = {}
-
- def builder_set(self, builder):
- self.builder = builder
- try:
- del self.executor
- except AttributeError:
- pass
-
- def has_builder(self):
- """Return whether this Node has a builder or not.
-
- In Boolean tests, this turns out to be a *lot* more efficient
- than simply examining the builder attribute directly ("if
- node.builder: ..."). When the builder attribute is examined
- directly, it ends up calling __getattr__ for both the __len__
- and __nonzero__ attributes on instances of our Builder Proxy
- class(es), generating a bazillion extra calls and slowing
- things down immensely.
- """
- try:
- b = self.builder
- except AttributeError:
- # There was no explicit builder for this Node, so initialize
- # the self.builder attribute to None now.
- b = self.builder = None
- return b is not None
-
- def set_explicit(self, is_explicit):
- self.is_explicit = is_explicit
-
- def has_explicit_builder(self):
- """Return whether this Node has an explicit builder
-
- This allows an internal Builder created by SCons to be marked
- non-explicit, so that it can be overridden by an explicit
- builder that the user supplies (the canonical example being
- directories)."""
- try:
- return self.is_explicit
- except AttributeError:
- self.is_explicit = None
- return self.is_explicit
-
- def get_builder(self, default_builder=None):
- """Return the set builder, or a specified default value"""
- try:
- return self.builder
- except AttributeError:
- return default_builder
-
- multiple_side_effect_has_builder = has_builder
-
- def is_derived(self):
- """
- Returns true if this node is derived (i.e. built).
-
- This should return true only for nodes whose path should be in
- the variant directory when duplicate=0 and should contribute their build
- signatures when they are used as source files to other derived files. For
- example: source with source builders are not derived in this sense,
- and hence should not return true.
- """
- return _is_derived_map[self._func_is_derived](self)
-
- def alter_targets(self):
- """Return a list of alternate targets for this Node.
- """
- return [], None
-
- def get_found_includes(self, env, scanner, path):
- """Return the scanned include lines (implicit dependencies)
- found in this node.
-
- The default is no implicit dependencies. We expect this method
- to be overridden by any subclass that can be scanned for
- implicit dependencies.
- """
- return []
-
- def get_implicit_deps(self, env, scanner, path):
- """Return a list of implicit dependencies for this node.
-
- This method exists to handle recursive invocation of the scanner
- on the implicit dependencies returned by the scanner, if the
- scanner's recursive flag says that we should.
- """
- if not scanner:
- return []
-
- # Give the scanner a chance to select a more specific scanner
- # for this Node.
- #scanner = scanner.select(self)
-
- nodes = [self]
- seen = {}
- seen[self] = 1
- deps = []
- while nodes:
- n = nodes.pop(0)
- d = [x for x in n.get_found_includes(env, scanner, path) if x not in seen]
- if d:
- deps.extend(d)
- for n in d:
- seen[n] = 1
- nodes.extend(scanner.recurse_nodes(d))
-
- return deps
-
- def get_env_scanner(self, env, kw={}):
- return env.get_scanner(self.scanner_key())
-
- def get_target_scanner(self):
- return self.builder.target_scanner
-
- def get_source_scanner(self, node):
- """Fetch the source scanner for the specified node
-
- NOTE: "self" is the target being built, "node" is
- the source file for which we want to fetch the scanner.
-
- Implies self.has_builder() is true; again, expect to only be
- called from locations where this is already verified.
-
- This function may be called very often; it attempts to cache
- the scanner found to improve performance.
- """
- scanner = None
- try:
- scanner = self.builder.source_scanner
- except AttributeError:
- pass
- if not scanner:
- # The builder didn't have an explicit scanner, so go look up
- # a scanner from env['SCANNERS'] based on the node's scanner
- # key (usually the file extension).
- scanner = self.get_env_scanner(self.get_build_env())
- if scanner:
- scanner = scanner.select(node)
- return scanner
-
- def add_to_implicit(self, deps):
- if not hasattr(self, 'implicit') or self.implicit is None:
- self.implicit = []
- self.implicit_set = set()
- self._children_reset()
- self._add_child(self.implicit, self.implicit_set, deps)
-
- def scan(self):
- """Scan this node's dependents for implicit dependencies."""
- # Don't bother scanning non-derived files, because we don't
- # care what their dependencies are.
- # Don't scan again, if we already have scanned.
- if self.implicit is not None:
- return
- self.implicit = []
- self.implicit_set = set()
- self._children_reset()
- if not self.has_builder():
- return
-
- build_env = self.get_build_env()
- executor = self.get_executor()
-
- # Here's where we implement --implicit-cache.
- if implicit_cache and not implicit_deps_changed:
- implicit = self.get_stored_implicit()
- if implicit is not None:
- # We now add the implicit dependencies returned from the
- # stored .sconsign entry to have already been converted
- # to Nodes for us. (We used to run them through a
- # source_factory function here.)
-
- # Update all of the targets with them. This
- # essentially short-circuits an N*M scan of the
- # sources for each individual target, which is a hell
- # of a lot more efficient.
- for tgt in executor.get_all_targets():
- tgt.add_to_implicit(implicit)
-
- if implicit_deps_unchanged or self.is_up_to_date():
- return
- # one of this node's sources has changed,
- # so we must recalculate the implicit deps for all targets
- for tgt in executor.get_all_targets():
- tgt.implicit = []
- tgt.implicit_set = set()
-
- # Have the executor scan the sources.
- executor.scan_sources(self.builder.source_scanner)
-
- # If there's a target scanner, have the executor scan the target
- # node itself and associated targets that might be built.
- scanner = self.get_target_scanner()
- if scanner:
- executor.scan_targets(scanner)
-
- def scanner_key(self):
- return None
-
- def select_scanner(self, scanner):
- """Selects a scanner for this Node.
-
- This is a separate method so it can be overridden by Node
- subclasses (specifically, Node.FS.Dir) that *must* use their
- own Scanner and don't select one the Scanner.Selector that's
- configured for the target.
- """
- return scanner.select(self)
-
- def env_set(self, env, safe=0):
- if safe and self.env:
- return
- self.env = env
-
- #
- # SIGNATURE SUBSYSTEM
- #
-
- NodeInfo = NodeInfoBase
- BuildInfo = BuildInfoBase
-
- def new_ninfo(self):
- ninfo = self.NodeInfo()
- return ninfo
-
- def get_ninfo(self):
- try:
- return self.ninfo
- except AttributeError:
- self.ninfo = self.new_ninfo()
- return self.ninfo
-
- def new_binfo(self):
- binfo = self.BuildInfo()
- return binfo
-
- def get_binfo(self):
- """
- Fetch a node's build information.
-
- node - the node whose sources will be collected
- cache - alternate node to use for the signature cache
- returns - the build signature
-
- This no longer handles the recursive descent of the
- node's children's signatures. We expect that they're
- already built and updated by someone else, if that's
- what's wanted.
- """
- try:
- return self.binfo
- except AttributeError:
- pass
-
- binfo = self.new_binfo()
- self.binfo = binfo
-
- executor = self.get_executor()
- ignore_set = self.ignore_set
-
- if self.has_builder():
- binfo.bact = str(executor)
- binfo.bactsig = SCons.Util.MD5signature(executor.get_contents())
-
- if self._specific_sources:
- sources = []
- for s in self.sources:
- if s not in ignore_set:
- sources.append(s)
- else:
- sources = executor.get_unignored_sources(self, self.ignore)
- seen = set()
- bsources = []
- bsourcesigs = []
- for s in sources:
- if not s in seen:
- seen.add(s)
- bsources.append(s)
- bsourcesigs.append(s.get_ninfo())
- binfo.bsources = bsources
- binfo.bsourcesigs = bsourcesigs
-
- depends = self.depends
- dependsigs = []
- for d in depends:
- if d not in ignore_set:
- dependsigs.append(d.get_ninfo())
- binfo.bdepends = depends
- binfo.bdependsigs = dependsigs
-
- implicit = self.implicit or []
- implicitsigs = []
- for i in implicit:
- if i not in ignore_set:
- implicitsigs.append(i.get_ninfo())
- binfo.bimplicit = implicit
- binfo.bimplicitsigs = implicitsigs
-
- return binfo
-
- def del_binfo(self):
- """Delete the build info from this node."""
- try:
- delattr(self, 'binfo')
- except AttributeError:
- pass
-
- def get_csig(self):
- try:
- return self.ninfo.csig
- except AttributeError:
- ninfo = self.get_ninfo()
- ninfo.csig = SCons.Util.MD5signature(self.get_contents())
- return self.ninfo.csig
-
- def get_cachedir_csig(self):
- return self.get_csig()
-
- def get_stored_info(self):
- return None
-
- def get_stored_implicit(self):
- """Fetch the stored implicit dependencies"""
- return None
-
- #
- #
- #
-
- def set_precious(self, precious = 1):
- """Set the Node's precious value."""
- self.precious = precious
-
- def set_pseudo(self, pseudo = True):
- """Set the Node's precious value."""
- self.pseudo = pseudo
-
- def set_noclean(self, noclean = 1):
- """Set the Node's noclean value."""
- # Make sure noclean is an integer so the --debug=stree
- # output in Util.py can use it as an index.
- self.noclean = noclean and 1 or 0
-
- def set_nocache(self, nocache = 1):
- """Set the Node's nocache value."""
- # Make sure nocache is an integer so the --debug=stree
- # output in Util.py can use it as an index.
- self.nocache = nocache and 1 or 0
-
- def set_always_build(self, always_build = 1):
- """Set the Node's always_build value."""
- self.always_build = always_build
-
- def exists(self):
- """Does this node exists?"""
- return _exists_map[self._func_exists](self)
-
- def rexists(self):
- """Does this node exist locally or in a repositiory?"""
- # There are no repositories by default:
- return _rexists_map[self._func_rexists](self)
-
- def get_contents(self):
- """Fetch the contents of the entry."""
- return _get_contents_map[self._func_get_contents](self)
-
- def missing(self):
- return not self.is_derived() and \
- not self.linked and \
- not self.rexists()
-
- def remove(self):
- """Remove this Node: no-op by default."""
- return None
-
- def add_dependency(self, depend):
- """Adds dependencies."""
- try:
- self._add_child(self.depends, self.depends_set, depend)
- except TypeError, e:
- e = e.args[0]
- if SCons.Util.is_List(e):
- s = list(map(str, e))
- else:
- s = str(e)
- raise SCons.Errors.UserError("attempted to add a non-Node dependency to %s:\n\t%s is a %s, not a Node" % (str(self), s, type(e)))
-
- def add_prerequisite(self, prerequisite):
- """Adds prerequisites"""
- if self.prerequisites is None:
- self.prerequisites = SCons.Util.UniqueList()
- self.prerequisites.extend(prerequisite)
- self._children_reset()
-
- def add_ignore(self, depend):
- """Adds dependencies to ignore."""
- try:
- self._add_child(self.ignore, self.ignore_set, depend)
- except TypeError, e:
- e = e.args[0]
- if SCons.Util.is_List(e):
- s = list(map(str, e))
- else:
- s = str(e)
- raise SCons.Errors.UserError("attempted to ignore a non-Node dependency of %s:\n\t%s is a %s, not a Node" % (str(self), s, type(e)))
-
- def add_source(self, source):
- """Adds sources."""
- if self._specific_sources:
- return
- try:
- self._add_child(self.sources, self.sources_set, source)
- except TypeError, e:
- e = e.args[0]
- if SCons.Util.is_List(e):
- s = list(map(str, e))
- else:
- s = str(e)
- raise SCons.Errors.UserError("attempted to add a non-Node as source of %s:\n\t%s is a %s, not a Node" % (str(self), s, type(e)))
-
- def _add_child(self, collection, set, child):
- """Adds 'child' to 'collection', first checking 'set' to see if it's
- already present."""
- #if type(child) is not type([]):
- # child = [child]
- #for c in child:
- # if not isinstance(c, Node):
- # raise TypeError, c
- added = None
- for c in child:
- if c not in set:
- set.add(c)
- collection.append(c)
- added = 1
- if added:
- self._children_reset()
-
- def set_specific_source(self, source):
- self.add_source(source)
- self._specific_sources = True
-
- def add_wkid(self, wkid):
- """Add a node to the list of kids waiting to be evaluated"""
- if self.wkids is not None:
- self.wkids.append(wkid)
-
- def _children_reset(self):
- self.clear_memoized_values()
- # We need to let the Executor clear out any calculated
- # build info that it's cached so we can re-calculate it.
- self.executor_cleanup()
-
- @SCons.Memoize.CountMethodCall
- def _children_get(self):
- try:
- return self._memo['_children_get']
- except KeyError:
- pass
-
- # The return list may contain duplicate Nodes, especially in
- # source trees where there are a lot of repeated #includes
- # of a tangle of .h files. Profiling shows, however, that
- # eliminating the duplicates with a brute-force approach that
- # preserves the order (that is, something like:
- #
- # u = []
- # for n in list:
- # if n not in u:
- # u.append(n)"
- #
- # takes more cycles than just letting the underlying methods
- # hand back cached values if a Node's information is requested
- # multiple times. (Other methods of removing duplicates, like
- # using dictionary keys, lose the order, and the only ordered
- # dictionary patterns I found all ended up using "not in"
- # internally anyway...)
- if self.ignore_set:
- iter = chain.from_iterable(filter(None, [self.sources, self.depends, self.implicit]))
-
- children = []
- for i in iter:
- if i not in self.ignore_set:
- children.append(i)
- else:
- children = self.all_children(scan=0)
-
- self._memo['_children_get'] = children
- return children
-
- def all_children(self, scan=1):
- """Return a list of all the node's direct children."""
- if scan:
- self.scan()
-
- # The return list may contain duplicate Nodes, especially in
- # source trees where there are a lot of repeated #includes
- # of a tangle of .h files. Profiling shows, however, that
- # eliminating the duplicates with a brute-force approach that
- # preserves the order (that is, something like:
- #
- # u = []
- # for n in list:
- # if n not in u:
- # u.append(n)"
- #
- # takes more cycles than just letting the underlying methods
- # hand back cached values if a Node's information is requested
- # multiple times. (Other methods of removing duplicates, like
- # using dictionary keys, lose the order, and the only ordered
- # dictionary patterns I found all ended up using "not in"
- # internally anyway...)
- return list(chain.from_iterable(filter(None, [self.sources, self.depends, self.implicit])))
-
- def children(self, scan=1):
- """Return a list of the node's direct children, minus those
- that are ignored by this node."""
- if scan:
- self.scan()
- return self._children_get()
-
- def set_state(self, state):
- self.state = state
-
- def get_state(self):
- return self.state
-
- def get_env(self):
- env = self.env
- if not env:
- import SCons.Defaults
- env = SCons.Defaults.DefaultEnvironment()
- return env
-
- def Decider(self, function):
- foundkey = None
- for k, v in _decider_map.iteritems():
- if v == function:
- foundkey = k
- break
- if not foundkey:
- foundkey = len(_decider_map)
- _decider_map[foundkey] = function
- self.changed_since_last_build = foundkey
-
- def Tag(self, key, value):
- """ Add a user-defined tag. """
- if not self._tags:
- self._tags = {}
- self._tags[key] = value
-
- def GetTag(self, key):
- """ Return a user-defined tag. """
- if not self._tags:
- return None
- return self._tags.get(key, None)
-
- def changed(self, node=None, allowcache=False):
- """
- Returns if the node is up-to-date with respect to the BuildInfo
- stored last time it was built. The default behavior is to compare
- it against our own previously stored BuildInfo, but the stored
- BuildInfo from another Node (typically one in a Repository)
- can be used instead.
-
- Note that we now *always* check every dependency. We used to
- short-circuit the check by returning as soon as we detected
- any difference, but we now rely on checking every dependency
- to make sure that any necessary Node information (for example,
- the content signature of an #included .h file) is updated.
-
- The allowcache option was added for supporting the early
- release of the executor/builder structures, right after
- a File target was built. When set to true, the return
- value of this changed method gets cached for File nodes.
- Like this, the executor isn't needed any longer for subsequent
- calls to changed().
-
- @see: FS.File.changed(), FS.File.release_target_info()
- """
- t = 0
- if t: Trace('changed(%s [%s], %s)' % (self, classname(self), node))
- if node is None:
- node = self
-
- result = False
-
- bi = node.get_stored_info().binfo
- then = bi.bsourcesigs + bi.bdependsigs + bi.bimplicitsigs
- children = self.children()
-
- diff = len(children) - len(then)
- if diff:
- # The old and new dependency lists are different lengths.
- # This always indicates that the Node must be rebuilt.
- # We also extend the old dependency list with enough None
- # entries to equal the new dependency list, for the benefit
- # of the loop below that updates node information.
- then.extend([None] * diff)
- if t: Trace(': old %s new %s' % (len(then), len(children)))
- result = True
-
- for child, prev_ni in zip(children, then):
- if _decider_map[child.changed_since_last_build](child, self, prev_ni):
- if t: Trace(': %s changed' % child)
- result = True
-
- contents = self.get_executor().get_contents()
- if self.has_builder():
- import SCons.Util
- newsig = SCons.Util.MD5signature(contents)
- if bi.bactsig != newsig:
- if t: Trace(': bactsig %s != newsig %s' % (bi.bactsig, newsig))
- result = True
-
- if not result:
- if t: Trace(': up to date')
-
- if t: Trace('\n')
-
- return result
-
- def is_up_to_date(self):
- """Default check for whether the Node is current: unknown Node
- subtypes are always out of date, so they will always get built."""
- return None
-
- def children_are_up_to_date(self):
- """Alternate check for whether the Node is current: If all of
- our children were up-to-date, then this Node was up-to-date, too.
-
- The SCons.Node.Alias and SCons.Node.Python.Value subclasses
- rebind their current() method to this method."""
- # Allow the children to calculate their signatures.
- self.binfo = self.get_binfo()
- if self.always_build:
- return None
- state = 0
- for kid in self.children(None):
- s = kid.get_state()
- if s and (not state or s > state):
- state = s
- return (state == 0 or state == SCons.Node.up_to_date)
-
- def is_literal(self):
- """Always pass the string representation of a Node to
- the command interpreter literally."""
- return 1
-
- def render_include_tree(self):
- """
- Return a text representation, suitable for displaying to the
- user, of the include tree for the sources of this node.
- """
- if self.is_derived():
- env = self.get_build_env()
- if env:
- for s in self.sources:
- scanner = self.get_source_scanner(s)
- if scanner:
- path = self.get_build_scanner_path(scanner)
- else:
- path = None
- def f(node, env=env, scanner=scanner, path=path):
- return node.get_found_includes(env, scanner, path)
- return SCons.Util.render_tree(s, f, 1)
- else:
- return None
-
- def get_abspath(self):
- """
- Return an absolute path to the Node. This will return simply
- str(Node) by default, but for Node types that have a concept of
- relative path, this might return something different.
- """
- return str(self)
-
- def for_signature(self):
- """
- Return a string representation of the Node that will always
- be the same for this particular Node, no matter what. This
- is by contrast to the __str__() method, which might, for
- instance, return a relative path for a file Node. The purpose
- of this method is to generate a value to be used in signature
- calculation for the command line used to build a target, and
- we use this method instead of str() to avoid unnecessary
- rebuilds. This method does not need to return something that
- would actually work in a command line; it can return any kind of
- nonsense, so long as it does not change.
- """
- return str(self)
-
- def get_string(self, for_signature):
- """This is a convenience function designed primarily to be
- used in command generators (i.e., CommandGeneratorActions or
- Environment variables that are callable), which are called
- with a for_signature argument that is nonzero if the command
- generator is being called to generate a signature for the
- command line, which determines if we should rebuild or not.
-
- Such command generators should use this method in preference
- to str(Node) when converting a Node to a string, passing
- in the for_signature parameter, such that we will call
- Node.for_signature() or str(Node) properly, depending on whether
- we are calculating a signature or actually constructing a
- command line."""
- if for_signature:
- return self.for_signature()
- return str(self)
-
- def get_subst_proxy(self):
- """
- This method is expected to return an object that will function
- exactly like this Node, except that it implements any additional
- special features that we would like to be in effect for
- Environment variable substitution. The principle use is that
- some Nodes would like to implement a __getattr__() method,
- but putting that in the Node type itself has a tendency to kill
- performance. We instead put it in a proxy and return it from
- this method. It is legal for this method to return self
- if no new functionality is needed for Environment substitution.
- """
- return self
-
- def explain(self):
- if not self.exists():
- return "building `%s' because it doesn't exist\n" % self
-
- if self.always_build:
- return "rebuilding `%s' because AlwaysBuild() is specified\n" % self
-
- old = self.get_stored_info()
- if old is None:
- return None
-
- old = old.binfo
- old.prepare_dependencies()
-
- try:
- old_bkids = old.bsources + old.bdepends + old.bimplicit
- old_bkidsigs = old.bsourcesigs + old.bdependsigs + old.bimplicitsigs
- except AttributeError:
- return "Cannot explain why `%s' is being rebuilt: No previous build information found\n" % self
-
- new = self.get_binfo()
-
- new_bkids = new.bsources + new.bdepends + new.bimplicit
- new_bkidsigs = new.bsourcesigs + new.bdependsigs + new.bimplicitsigs
-
- osig = dict(zip(old_bkids, old_bkidsigs))
- nsig = dict(zip(new_bkids, new_bkidsigs))
-
- # The sources and dependencies we'll want to report are all stored
- # as relative paths to this target's directory, but we want to
- # report them relative to the top-level SConstruct directory,
- # so we only print them after running them through this lambda
- # to turn them into the right relative Node and then return
- # its string.
- def stringify( s, E=self.dir.Entry ) :
- if hasattr( s, 'dir' ) :
- return str(E(s))
- return str(s)
-
- lines = []
-
- removed = [x for x in old_bkids if not x in new_bkids]
- if removed:
- removed = list(map(stringify, removed))
- fmt = "`%s' is no longer a dependency\n"
- lines.extend([fmt % s for s in removed])
-
- for k in new_bkids:
- if not k in old_bkids:
- lines.append("`%s' is a new dependency\n" % stringify(k))
- elif _decider_map[k.changed_since_last_build](k, self, osig[k]):
- lines.append("`%s' changed\n" % stringify(k))
-
- if len(lines) == 0 and old_bkids != new_bkids:
- lines.append("the dependency order changed:\n" +
- "%sold: %s\n" % (' '*15, list(map(stringify, old_bkids))) +
- "%snew: %s\n" % (' '*15, list(map(stringify, new_bkids))))
-
- if len(lines) == 0:
- def fmt_with_title(title, strlines):
- lines = strlines.split('\n')
- sep = '\n' + ' '*(15 + len(title))
- return ' '*15 + title + sep.join(lines) + '\n'
- if old.bactsig != new.bactsig:
- if old.bact == new.bact:
- lines.append("the contents of the build action changed\n" +
- fmt_with_title('action: ', new.bact))
- else:
- lines.append("the build action changed:\n" +
- fmt_with_title('old: ', old.bact) +
- fmt_with_title('new: ', new.bact))
-
- if len(lines) == 0:
- return "rebuilding `%s' for unknown reasons\n" % self
-
- preamble = "rebuilding `%s' because" % self
- if len(lines) == 1:
- return "%s %s" % (preamble, lines[0])
- else:
- lines = ["%s:\n" % preamble] + lines
- return ( ' '*11).join(lines)
-
-class NodeList(collections.UserList):
- def __str__(self):
- return str(list(map(str, self.data)))
-
-def get_children(node, parent): return node.children()
-def ignore_cycle(node, stack): pass
-def do_nothing(node, parent): pass
-
-class Walker(object):
- """An iterator for walking a Node tree.
-
- This is depth-first, children are visited before the parent.
- The Walker object can be initialized with any node, and
- returns the next node on the descent with each get_next() call.
- 'kids_func' is an optional function that will be called to
- get the children of a node instead of calling 'children'.
- 'cycle_func' is an optional function that will be called
- when a cycle is detected.
-
- This class does not get caught in node cycles caused, for example,
- by C header file include loops.
- """
- def __init__(self, node, kids_func=get_children,
- cycle_func=ignore_cycle,
- eval_func=do_nothing):
- self.kids_func = kids_func
- self.cycle_func = cycle_func
- self.eval_func = eval_func
- node.wkids = copy.copy(kids_func(node, None))
- self.stack = [node]
- self.history = {} # used to efficiently detect and avoid cycles
- self.history[node] = None
-
- def get_next(self):
- """Return the next node for this walk of the tree.
-
- This function is intentionally iterative, not recursive,
- to sidestep any issues of stack size limitations.
- """
-
- while self.stack:
- if self.stack[-1].wkids:
- node = self.stack[-1].wkids.pop(0)
- if not self.stack[-1].wkids:
- self.stack[-1].wkids = None
- if node in self.history:
- self.cycle_func(node, self.stack)
- else:
- node.wkids = copy.copy(self.kids_func(node, self.stack[-1]))
- self.stack.append(node)
- self.history[node] = None
- else:
- node = self.stack.pop()
- del self.history[node]
- if node:
- if self.stack:
- parent = self.stack[-1]
- else:
- parent = None
- self.eval_func(node, parent)
- return node
- return None
-
- def is_done(self):
- return not self.stack
-
-
-arg2nodes_lookups = []
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Options/BoolOption.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Options/BoolOption.py
deleted file mode 100644
index c8d901f..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Options/BoolOption.py
+++ /dev/null
@@ -1,50 +0,0 @@
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-
-__revision__ = "src/engine/SCons/Options/BoolOption.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-__doc__ = """Place-holder for the old SCons.Options module hierarchy
-
-This is for backwards compatibility. The new equivalent is the Variables/
-class hierarchy. These will have deprecation warnings added (some day),
-and will then be removed entirely (some day).
-"""
-
-import SCons.Variables
-import SCons.Warnings
-
-warned = False
-
-def BoolOption(*args, **kw):
- global warned
- if not warned:
- msg = "The BoolOption() function is deprecated; use the BoolVariable() function instead."
- SCons.Warnings.warn(SCons.Warnings.DeprecatedOptionsWarning, msg)
- warned = True
- return SCons.Variables.BoolVariable(*args, **kw)
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Options/EnumOption.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Options/EnumOption.py
deleted file mode 100644
index 58b99ef..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Options/EnumOption.py
+++ /dev/null
@@ -1,50 +0,0 @@
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-
-__revision__ = "src/engine/SCons/Options/EnumOption.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-__doc__ = """Place-holder for the old SCons.Options module hierarchy
-
-This is for backwards compatibility. The new equivalent is the Variables/
-class hierarchy. These will have deprecation warnings added (some day),
-and will then be removed entirely (some day).
-"""
-
-import SCons.Variables
-import SCons.Warnings
-
-warned = False
-
-def EnumOption(*args, **kw):
- global warned
- if not warned:
- msg = "The EnumOption() function is deprecated; use the EnumVariable() function instead."
- SCons.Warnings.warn(SCons.Warnings.DeprecatedOptionsWarning, msg)
- warned = True
- return SCons.Variables.EnumVariable(*args, **kw)
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Options/ListOption.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Options/ListOption.py
deleted file mode 100644
index 00c93d9..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Options/ListOption.py
+++ /dev/null
@@ -1,50 +0,0 @@
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-
-__revision__ = "src/engine/SCons/Options/ListOption.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-__doc__ = """Place-holder for the old SCons.Options module hierarchy
-
-This is for backwards compatibility. The new equivalent is the Variables/
-class hierarchy. These will have deprecation warnings added (some day),
-and will then be removed entirely (some day).
-"""
-
-import SCons.Variables
-import SCons.Warnings
-
-warned = False
-
-def ListOption(*args, **kw):
- global warned
- if not warned:
- msg = "The ListOption() function is deprecated; use the ListVariable() function instead."
- SCons.Warnings.warn(SCons.Warnings.DeprecatedOptionsWarning, msg)
- warned = True
- return SCons.Variables.ListVariable(*args, **kw)
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Options/PackageOption.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Options/PackageOption.py
deleted file mode 100644
index 56624f0..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Options/PackageOption.py
+++ /dev/null
@@ -1,50 +0,0 @@
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-
-__revision__ = "src/engine/SCons/Options/PackageOption.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-__doc__ = """Place-holder for the old SCons.Options module hierarchy
-
-This is for backwards compatibility. The new equivalent is the Variables/
-class hierarchy. These will have deprecation warnings added (some day),
-and will then be removed entirely (some day).
-"""
-
-import SCons.Variables
-import SCons.Warnings
-
-warned = False
-
-def PackageOption(*args, **kw):
- global warned
- if not warned:
- msg = "The PackageOption() function is deprecated; use the PackageVariable() function instead."
- SCons.Warnings.warn(SCons.Warnings.DeprecatedOptionsWarning, msg)
- warned = True
- return SCons.Variables.PackageVariable(*args, **kw)
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Options/PathOption.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Options/PathOption.py
deleted file mode 100644
index a4b81ec..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Options/PathOption.py
+++ /dev/null
@@ -1,76 +0,0 @@
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-
-__revision__ = "src/engine/SCons/Options/PathOption.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-__doc__ = """Place-holder for the old SCons.Options module hierarchy
-
-This is for backwards compatibility. The new equivalent is the Variables/
-class hierarchy. These will have deprecation warnings added (some day),
-and will then be removed entirely (some day).
-"""
-
-import SCons.Variables
-import SCons.Warnings
-
-warned = False
-
-class _PathOptionClass(object):
- def warn(self):
- global warned
- if not warned:
- msg = "The PathOption() function is deprecated; use the PathVariable() function instead."
- SCons.Warnings.warn(SCons.Warnings.DeprecatedOptionsWarning, msg)
- warned = True
-
- def __call__(self, *args, **kw):
- self.warn()
- return SCons.Variables.PathVariable(*args, **kw)
-
- def PathAccept(self, *args, **kw):
- self.warn()
- return SCons.Variables.PathVariable.PathAccept(*args, **kw)
-
- def PathIsDir(self, *args, **kw):
- self.warn()
- return SCons.Variables.PathVariable.PathIsDir(*args, **kw)
-
- def PathIsDirCreate(self, *args, **kw):
- self.warn()
- return SCons.Variables.PathVariable.PathIsDirCreate(*args, **kw)
-
- def PathIsFile(self, *args, **kw):
- self.warn()
- return SCons.Variables.PathVariable.PathIsFile(*args, **kw)
-
- def PathExists(self, *args, **kw):
- self.warn()
- return SCons.Variables.PathVariable.PathExists(*args, **kw)
-
-PathOption = _PathOptionClass()
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Options/__init__.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Options/__init__.py
deleted file mode 100644
index 5099712..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Options/__init__.py
+++ /dev/null
@@ -1,67 +0,0 @@
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-
-__revision__ = "src/engine/SCons/Options/__init__.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-__doc__ = """Place-holder for the old SCons.Options module hierarchy
-
-This is for backwards compatibility. The new equivalent is the Variables/
-class hierarchy. These will have deprecation warnings added (some day),
-and will then be removed entirely (some day).
-"""
-
-import SCons.Variables
-import SCons.Warnings
-
-from BoolOption import BoolOption # okay
-from EnumOption import EnumOption # okay
-from ListOption import ListOption # naja
-from PackageOption import PackageOption # naja
-from PathOption import PathOption # okay
-
-warned = False
-
-class Options(SCons.Variables.Variables):
- def __init__(self, *args, **kw):
- global warned
- if not warned:
- msg = "The Options class is deprecated; use the Variables class instead."
- SCons.Warnings.warn(SCons.Warnings.DeprecatedOptionsWarning, msg)
- warned = True
- SCons.Variables.Variables.__init__(self, *args, **kw)
-
- def AddOptions(self, *args, **kw):
- return SCons.Variables.Variables.AddVariables(self, *args, **kw)
-
- def UnknownOptions(self, *args, **kw):
- return SCons.Variables.Variables.UnknownVariables(self, *args, **kw)
-
- def FormatOptionHelpText(self, *args, **kw):
- return SCons.Variables.Variables.FormatVariableHelpText(self, *args,
- **kw)
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/PathList.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/PathList.py
deleted file mode 100644
index b359144..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/PathList.py
+++ /dev/null
@@ -1,227 +0,0 @@
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-
-__revision__ = "src/engine/SCons/PathList.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-__doc__ = """SCons.PathList
-
-A module for handling lists of directory paths (the sort of things
-that get set as CPPPATH, LIBPATH, etc.) with as much caching of data and
-efficiency as we can while still keeping the evaluation delayed so that we
-Do the Right Thing (almost) regardless of how the variable is specified.
-
-"""
-
-import os
-
-import SCons.Memoize
-import SCons.Node
-import SCons.Util
-
-#
-# Variables to specify the different types of entries in a PathList object:
-#
-
-TYPE_STRING_NO_SUBST = 0 # string with no '$'
-TYPE_STRING_SUBST = 1 # string containing '$'
-TYPE_OBJECT = 2 # other object
-
-def node_conv(obj):
- """
- This is the "string conversion" routine that we have our substitutions
- use to return Nodes, not strings. This relies on the fact that an
- EntryProxy object has a get() method that returns the underlying
- Node that it wraps, which is a bit of architectural dependence
- that we might need to break or modify in the future in response to
- additional requirements.
- """
- try:
- get = obj.get
- except AttributeError:
- if isinstance(obj, SCons.Node.Node) or SCons.Util.is_Sequence( obj ):
- result = obj
- else:
- result = str(obj)
- else:
- result = get()
- return result
-
-class _PathList(object):
- """
- An actual PathList object.
- """
- def __init__(self, pathlist):
- """
- Initializes a PathList object, canonicalizing the input and
- pre-processing it for quicker substitution later.
-
- The stored representation of the PathList is a list of tuples
- containing (type, value), where the "type" is one of the TYPE_*
- variables defined above. We distinguish between:
-
- strings that contain no '$' and therefore need no
- delayed-evaluation string substitution (we expect that there
- will be many of these and that we therefore get a pretty
- big win from avoiding string substitution)
-
- strings that contain '$' and therefore need substitution
- (the hard case is things like '${TARGET.dir}/include',
- which require re-evaluation for every target + source)
-
- other objects (which may be something like an EntryProxy
- that needs a method called to return a Node)
-
- Pre-identifying the type of each element in the PathList up-front
- and storing the type in the list of tuples is intended to reduce
- the amount of calculation when we actually do the substitution
- over and over for each target.
- """
- if SCons.Util.is_String(pathlist):
- pathlist = pathlist.split(os.pathsep)
- elif not SCons.Util.is_Sequence(pathlist):
- pathlist = [pathlist]
-
- pl = []
- for p in pathlist:
- try:
- index = p.find('$')
- except (AttributeError, TypeError):
- type = TYPE_OBJECT
- else:
- if index == -1:
- type = TYPE_STRING_NO_SUBST
- else:
- type = TYPE_STRING_SUBST
- pl.append((type, p))
-
- self.pathlist = tuple(pl)
-
- def __len__(self): return len(self.pathlist)
-
- def __getitem__(self, i): return self.pathlist[i]
-
- def subst_path(self, env, target, source):
- """
- Performs construction variable substitution on a pre-digested
- PathList for a specific target and source.
- """
- result = []
- for type, value in self.pathlist:
- if type == TYPE_STRING_SUBST:
- value = env.subst(value, target=target, source=source,
- conv=node_conv)
- if SCons.Util.is_Sequence(value):
- result.extend(SCons.Util.flatten(value))
- elif value:
- result.append(value)
- elif type == TYPE_OBJECT:
- value = node_conv(value)
- if value:
- result.append(value)
- elif value:
- result.append(value)
- return tuple(result)
-
-
-class PathListCache(object):
- """
- A class to handle caching of PathList lookups.
-
- This class gets instantiated once and then deleted from the namespace,
- so it's used as a Singleton (although we don't enforce that in the
- usual Pythonic ways). We could have just made the cache a dictionary
- in the module namespace, but putting it in this class allows us to
- use the same Memoizer pattern that we use elsewhere to count cache
- hits and misses, which is very valuable.
-
- Lookup keys in the cache are computed by the _PathList_key() method.
- Cache lookup should be quick, so we don't spend cycles canonicalizing
- all forms of the same lookup key. For example, 'x:y' and ['x',
- 'y'] logically represent the same list, but we don't bother to
- split string representations and treat those two equivalently.
- (Note, however, that we do, treat lists and tuples the same.)
-
- The main type of duplication we're trying to catch will come from
- looking up the same path list from two different clones of the
- same construction environment. That is, given
-
- env2 = env1.Clone()
-
- both env1 and env2 will have the same CPPPATH value, and we can
- cheaply avoid re-parsing both values of CPPPATH by using the
- common value from this cache.
- """
- def __init__(self):
- self._memo = {}
-
- def _PathList_key(self, pathlist):
- """
- Returns the key for memoization of PathLists.
-
- Note that we want this to be pretty quick, so we don't completely
- canonicalize all forms of the same list. For example,
- 'dir1:$ROOT/dir2' and ['$ROOT/dir1', 'dir'] may logically
- represent the same list if you're executing from $ROOT, but
- we're not going to bother splitting strings into path elements,
- or massaging strings into Nodes, to identify that equivalence.
- We just want to eliminate obvious redundancy from the normal
- case of re-using exactly the same cloned value for a path.
- """
- if SCons.Util.is_Sequence(pathlist):
- pathlist = tuple(SCons.Util.flatten(pathlist))
- return pathlist
-
- @SCons.Memoize.CountDictCall(_PathList_key)
- def PathList(self, pathlist):
- """
- Returns the cached _PathList object for the specified pathlist,
- creating and caching a new object as necessary.
- """
- pathlist = self._PathList_key(pathlist)
- try:
- memo_dict = self._memo['PathList']
- except KeyError:
- memo_dict = {}
- self._memo['PathList'] = memo_dict
- else:
- try:
- return memo_dict[pathlist]
- except KeyError:
- pass
-
- result = _PathList(pathlist)
-
- memo_dict[pathlist] = result
-
- return result
-
-PathList = PathListCache().PathList
-
-
-del PathListCache
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Platform/__init__.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Platform/__init__.py
deleted file mode 100644
index ca4bc9b..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Platform/__init__.py
+++ /dev/null
@@ -1,264 +0,0 @@
-"""SCons.Platform
-
-SCons platform selection.
-
-This looks for modules that define a callable object that can modify a
-construction environment as appropriate for a given platform.
-
-Note that we take a more simplistic view of "platform" than Python does.
-We're looking for a single string that determines a set of
-tool-independent variables with which to initialize a construction
-environment. Consequently, we'll examine both sys.platform and os.name
-(and anything else that might come in to play) in order to return some
-specification which is unique enough for our purposes.
-
-Note that because this subsysem just *selects* a callable that can
-modify a construction environment, it's possible for people to define
-their own "platform specification" in an arbitrary callable function.
-No one needs to use or tie in to this subsystem in order to roll
-their own platform definition.
-"""
-
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-
-__revision__ = "src/engine/SCons/Platform/__init__.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-import SCons.compat
-
-import imp
-import os
-import sys
-import tempfile
-
-import SCons.Errors
-import SCons.Subst
-import SCons.Tool
-
-def platform_default():
- """Return the platform string for our execution environment.
-
- The returned value should map to one of the SCons/Platform/*.py
- files. Since we're architecture independent, though, we don't
- care about the machine architecture.
- """
- osname = os.name
- if osname == 'java':
- osname = os._osType
- if osname == 'posix':
- if sys.platform == 'cygwin':
- return 'cygwin'
- elif sys.platform.find('irix') != -1:
- return 'irix'
- elif sys.platform.find('sunos') != -1:
- return 'sunos'
- elif sys.platform.find('hp-ux') != -1:
- return 'hpux'
- elif sys.platform.find('aix') != -1:
- return 'aix'
- elif sys.platform.find('darwin') != -1:
- return 'darwin'
- else:
- return 'posix'
- elif os.name == 'os2':
- return 'os2'
- else:
- return sys.platform
-
-def platform_module(name = platform_default()):
- """Return the imported module for the platform.
-
- This looks for a module name that matches the specified argument.
- If the name is unspecified, we fetch the appropriate default for
- our execution environment.
- """
- full_name = 'SCons.Platform.' + name
- if full_name not in sys.modules:
- if os.name == 'java':
- eval(full_name)
- else:
- try:
- file, path, desc = imp.find_module(name,
- sys.modules['SCons.Platform'].__path__)
- try:
- mod = imp.load_module(full_name, file, path, desc)
- finally:
- if file:
- file.close()
- except ImportError:
- try:
- import zipimport
- importer = zipimport.zipimporter( sys.modules['SCons.Platform'].__path__[0] )
- mod = importer.load_module(full_name)
- except ImportError:
- raise SCons.Errors.UserError("No platform named '%s'" % name)
- setattr(SCons.Platform, name, mod)
- return sys.modules[full_name]
-
-def DefaultToolList(platform, env):
- """Select a default tool list for the specified platform.
- """
- return SCons.Tool.tool_list(platform, env)
-
-class PlatformSpec(object):
- def __init__(self, name, generate):
- self.name = name
- self.generate = generate
-
- def __call__(self, *args, **kw):
- return self.generate(*args, **kw)
-
- def __str__(self):
- return self.name
-
-class TempFileMunge(object):
- """A callable class. You can set an Environment variable to this,
- then call it with a string argument, then it will perform temporary
- file substitution on it. This is used to circumvent the long command
- line limitation.
-
- Example usage:
- env["TEMPFILE"] = TempFileMunge
- env["LINKCOM"] = "${TEMPFILE('$LINK $TARGET $SOURCES','$LINKCOMSTR')}"
-
- By default, the name of the temporary file used begins with a
- prefix of '@'. This may be configred for other tool chains by
- setting '$TEMPFILEPREFIX'.
-
- env["TEMPFILEPREFIX"] = '-@' # diab compiler
- env["TEMPFILEPREFIX"] = '-via' # arm tool chain
- """
- def __init__(self, cmd, cmdstr = None):
- self.cmd = cmd
- self.cmdstr = cmdstr
-
- def __call__(self, target, source, env, for_signature):
- if for_signature:
- # If we're being called for signature calculation, it's
- # because we're being called by the string expansion in
- # Subst.py, which has the logic to strip any $( $) that
- # may be in the command line we squirreled away. So we
- # just return the raw command line and let the upper
- # string substitution layers do their thing.
- return self.cmd
-
- # Now we're actually being called because someone is actually
- # going to try to execute the command, so we have to do our
- # own expansion.
- cmd = env.subst_list(self.cmd, SCons.Subst.SUBST_CMD, target, source)[0]
- try:
- maxline = int(env.subst('$MAXLINELENGTH'))
- except ValueError:
- maxline = 2048
-
- length = 0
- for c in cmd:
- length += len(c)
- length += len(cmd) - 1
- if length <= maxline:
- return self.cmd
-
- # Check if we already created the temporary file for this target
- # It should have been previously done by Action.strfunction() call
- node = target[0] if SCons.Util.is_List(target) else target
- cmdlist = getattr(node.attributes, 'tempfile_cmdlist', None) \
- if node is not None else None
- if cmdlist is not None :
- return cmdlist
-
- # We do a normpath because mktemp() has what appears to be
- # a bug in Windows that will use a forward slash as a path
- # delimiter. Windows's link mistakes that for a command line
- # switch and barfs.
- #
- # We use the .lnk suffix for the benefit of the Phar Lap
- # linkloc linker, which likes to append an .lnk suffix if
- # none is given.
- (fd, tmp) = tempfile.mkstemp('.lnk', text=True)
- native_tmp = SCons.Util.get_native_path(os.path.normpath(tmp))
-
- if env.get('SHELL',None) == 'sh':
- # The sh shell will try to escape the backslashes in the
- # path, so unescape them.
- native_tmp = native_tmp.replace('\\', r'\\\\')
- # In Cygwin, we want to use rm to delete the temporary
- # file, because del does not exist in the sh shell.
- rm = env.Detect('rm') or 'del'
- else:
- # Don't use 'rm' if the shell is not sh, because rm won't
- # work with the Windows shells (cmd.exe or command.com) or
- # Windows path names.
- rm = 'del'
-
- prefix = env.subst('$TEMPFILEPREFIX')
- if not prefix:
- prefix = '@'
-
- args = list(map(SCons.Subst.quote_spaces, cmd[1:]))
- os.write(fd, " ".join(args) + "\n")
- os.close(fd)
- # XXX Using the SCons.Action.print_actions value directly
- # like this is bogus, but expedient. This class should
- # really be rewritten as an Action that defines the
- # __call__() and strfunction() methods and lets the
- # normal action-execution logic handle whether or not to
- # print/execute the action. The problem, though, is all
- # of that is decided before we execute this method as
- # part of expanding the $TEMPFILE construction variable.
- # Consequently, refactoring this will have to wait until
- # we get more flexible with allowing Actions to exist
- # independently and get strung together arbitrarily like
- # Ant tasks. In the meantime, it's going to be more
- # user-friendly to not let obsession with architectural
- # purity get in the way of just being helpful, so we'll
- # reach into SCons.Action directly.
- if SCons.Action.print_actions:
- cmdstr = env.subst(self.cmdstr, SCons.Subst.SUBST_RAW, target,
- source) if self.cmdstr is not None else ''
- # Print our message only if XXXCOMSTR returns an empty string
- if len(cmdstr) == 0 :
- print("Using tempfile "+native_tmp+" for command line:\n"+
- str(cmd[0]) + " " + " ".join(args))
-
- # Store the temporary file command list into the target Node.attributes
- # to avoid creating two temporary files one for print and one for execute.
- cmdlist = [ cmd[0], prefix + native_tmp + '\n' + rm, native_tmp ]
- if node is not None:
- try :
- setattr(node.attributes, 'tempfile_cmdlist', cmdlist)
- except AttributeError:
- pass
- return cmdlist
-
-def Platform(name = platform_default()):
- """Select a canned Platform specification.
- """
- module = platform_module(name)
- spec = PlatformSpec(name, module.generate)
- return spec
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Platform/aix.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Platform/aix.py
deleted file mode 100644
index 44bccd1..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Platform/aix.py
+++ /dev/null
@@ -1,85 +0,0 @@
-"""engine.SCons.Platform.aix
-
-Platform-specific initialization for IBM AIX systems.
-
-There normally shouldn't be any need to import this module directly. It
-will usually be imported through the generic SCons.Platform.Platform()
-selection method.
-"""
-
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-
-__revision__ = "src/engine/SCons/Platform/aix.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-import os
-import subprocess
-
-import posix
-
-import SCons.Util
-import SCons.Action
-
-def get_xlc(env, xlc=None, packages=[]):
- # Use the AIX package installer tool lslpp to figure out where a
- # given xl* compiler is installed and what version it is.
- xlcPath = None
- xlcVersion = None
-
- if xlc is None:
- xlc = env.get('CC', 'xlc')
- if SCons.Util.is_List(xlc):
- xlc = xlc[0]
- for package in packages:
- # find the installed filename, which may be a symlink as well
- pipe = SCons.Action._subproc(env, ['lslpp', '-fc', package],
- stdin = 'devnull',
- stderr = 'devnull',
- stdout = subprocess.PIPE)
- # output of lslpp is something like this:
- # #Path:Fileset:File
- # /usr/lib/objrepos:vac.C 6.0.0.0:/usr/vac/exe/xlCcpp
- # /usr/lib/objrepos:vac.C 6.0.0.0:/usr/vac/bin/xlc_r -> /usr/vac/bin/xlc
- for line in pipe.stdout:
- if xlcPath:
- continue # read everything to let lslpp terminate
- fileset, filename = line.split(':')[1:3]
- filename = filename.split()[0]
- if ('/' in xlc and filename == xlc) \
- or ('/' not in xlc and filename.endswith('/' + xlc)):
- xlcVersion = fileset.split()[1]
- xlcPath, sep, xlc = filename.rpartition('/')
- pass
- pass
- return (xlcPath, xlc, xlcVersion)
-
-def generate(env):
- posix.generate(env)
- #Based on AIX 5.2: ARG_MAX=24576 - 3000 for environment expansion
- env['MAXLINELENGTH'] = 21576
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Platform/cygwin.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Platform/cygwin.py
deleted file mode 100644
index d04bbe7..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Platform/cygwin.py
+++ /dev/null
@@ -1,55 +0,0 @@
-"""SCons.Platform.cygwin
-
-Platform-specific initialization for Cygwin systems.
-
-There normally shouldn't be any need to import this module directly. It
-will usually be imported through the generic SCons.Platform.Platform()
-selection method.
-"""
-
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-
-__revision__ = "src/engine/SCons/Platform/cygwin.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-import posix
-from SCons.Platform import TempFileMunge
-
-def generate(env):
- posix.generate(env)
-
- env['PROGPREFIX'] = ''
- env['PROGSUFFIX'] = '.exe'
- env['SHLIBPREFIX'] = ''
- env['SHLIBSUFFIX'] = '.dll'
- env['LIBPREFIXES'] = [ '$LIBPREFIX', '$SHLIBPREFIX' ]
- env['LIBSUFFIXES'] = [ '$LIBSUFFIX', '$SHLIBSUFFIX' ]
- env['TEMPFILE'] = TempFileMunge
- env['TEMPFILEPREFIX'] = '@'
- env['MAXLINELENGTH'] = 2048
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Platform/darwin.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Platform/darwin.py
deleted file mode 100644
index efd8ba4..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Platform/darwin.py
+++ /dev/null
@@ -1,70 +0,0 @@
-"""engine.SCons.Platform.darwin
-
-Platform-specific initialization for Mac OS X systems.
-
-There normally shouldn't be any need to import this module directly. It
-will usually be imported through the generic SCons.Platform.Platform()
-selection method.
-"""
-
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-
-__revision__ = "src/engine/SCons/Platform/darwin.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-import posix
-import os
-
-def generate(env):
- posix.generate(env)
- env['SHLIBSUFFIX'] = '.dylib'
- # put macports paths at front to override Apple's versions, fink path is after
- # For now let people who want Macports or Fink tools specify it!
- # env['ENV']['PATH'] = '/opt/local/bin:/opt/local/sbin:' + env['ENV']['PATH'] + ':/sw/bin'
-
- # Store extra system paths in env['ENV']['PATHOSX']
-
- filelist = ['/etc/paths',]
- # make sure this works on Macs with Tiger or earlier
- try:
- dirlist = os.listdir('/etc/paths.d')
- except:
- dirlist = []
-
- for file in dirlist:
- filelist.append('/etc/paths.d/'+file)
-
- for file in filelist:
- if os.path.isfile(file):
- f = open(file, 'r')
- lines = f.readlines()
- for line in lines:
- if line:
- env.AppendENVPath('PATHOSX', line.strip('\n'))
- f.close()
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Platform/hpux.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Platform/hpux.py
deleted file mode 100644
index 2e2fbca..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Platform/hpux.py
+++ /dev/null
@@ -1,46 +0,0 @@
-"""engine.SCons.Platform.hpux
-
-Platform-specific initialization for HP-UX systems.
-
-There normally shouldn't be any need to import this module directly. It
-will usually be imported through the generic SCons.Platform.Platform()
-selection method.
-"""
-
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-
-__revision__ = "src/engine/SCons/Platform/hpux.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-import posix
-
-def generate(env):
- posix.generate(env)
- #Based on HP-UX11i: ARG_MAX=2048000 - 3000 for environment expansion
- env['MAXLINELENGTH'] = 2045000
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Platform/irix.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Platform/irix.py
deleted file mode 100644
index 3bedbdf..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Platform/irix.py
+++ /dev/null
@@ -1,44 +0,0 @@
-"""SCons.Platform.irix
-
-Platform-specific initialization for SGI IRIX systems.
-
-There normally shouldn't be any need to import this module directly. It
-will usually be imported through the generic SCons.Platform.Platform()
-selection method.
-"""
-
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-
-__revision__ = "src/engine/SCons/Platform/irix.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-import posix
-
-def generate(env):
- posix.generate(env)
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Platform/os2.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Platform/os2.py
deleted file mode 100644
index 82eb163..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Platform/os2.py
+++ /dev/null
@@ -1,58 +0,0 @@
-"""SCons.Platform.os2
-
-Platform-specific initialization for OS/2 systems.
-
-There normally shouldn't be any need to import this module directly. It
-will usually be imported through the generic SCons.Platform.Platform()
-selection method.
-"""
-
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-
-__revision__ = "src/engine/SCons/Platform/os2.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-import win32
-
-def generate(env):
- if 'ENV' not in env:
- env['ENV'] = {}
- env['OBJPREFIX'] = ''
- env['OBJSUFFIX'] = '.obj'
- env['SHOBJPREFIX'] = '$OBJPREFIX'
- env['SHOBJSUFFIX'] = '$OBJSUFFIX'
- env['PROGPREFIX'] = ''
- env['PROGSUFFIX'] = '.exe'
- env['LIBPREFIX'] = ''
- env['LIBSUFFIX'] = '.lib'
- env['SHLIBPREFIX'] = ''
- env['SHLIBSUFFIX'] = '.dll'
- env['LIBPREFIXES'] = '$LIBPREFIX'
- env['LIBSUFFIXES'] = [ '$LIBSUFFIX', '$SHLIBSUFFIX' ]
- env['HOST_OS'] = 'os2'
- env['HOST_ARCH'] = win32.get_architecture().arch
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Platform/posix.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Platform/posix.py
deleted file mode 100644
index 8445863..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Platform/posix.py
+++ /dev/null
@@ -1,124 +0,0 @@
-"""SCons.Platform.posix
-
-Platform-specific initialization for POSIX (Linux, UNIX, etc.) systems.
-
-There normally shouldn't be any need to import this module directly. It
-will usually be imported through the generic SCons.Platform.Platform()
-selection method.
-"""
-
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-
-__revision__ = "src/engine/SCons/Platform/posix.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-import errno
-import os
-import os.path
-import subprocess
-import sys
-import select
-
-import SCons.Util
-from SCons.Platform import TempFileMunge
-
-exitvalmap = {
- 2 : 127,
- 13 : 126,
-}
-
-def escape(arg):
- "escape shell special characters"
- slash = '\\'
- special = '"$()'
-
- arg = arg.replace(slash, slash+slash)
- for c in special:
- arg = arg.replace(c, slash+c)
-
- return '"' + arg + '"'
-
-def exec_subprocess(l, env):
- proc = subprocess.Popen(l, env = env, close_fds = True)
- return proc.wait()
-
-def subprocess_spawn(sh, escape, cmd, args, env):
- return exec_subprocess([sh, '-c', ' '.join(args)], env)
-
-def exec_popen3(l, env, stdout, stderr):
- proc = subprocess.Popen(l, env = env, close_fds = True,
- stdout = stdout,
- stderr = stderr)
- return proc.wait()
-
-def piped_env_spawn(sh, escape, cmd, args, env, stdout, stderr):
- # spawn using Popen3 combined with the env command
- # the command name and the command's stdout is written to stdout
- # the command's stderr is written to stderr
- return exec_popen3([sh, '-c', ' '.join(args)],
- env, stdout, stderr)
-
-
-def generate(env):
- # Bearing in mind we have python 2.4 as a baseline, we can just do this:
- spawn = subprocess_spawn
- pspawn = piped_env_spawn
- # Note that this means that 'escape' is no longer used
-
- if 'ENV' not in env:
- env['ENV'] = {}
- env['ENV']['PATH'] = '/usr/local/bin:/opt/bin:/bin:/usr/bin'
- env['OBJPREFIX'] = ''
- env['OBJSUFFIX'] = '.o'
- env['SHOBJPREFIX'] = '$OBJPREFIX'
- env['SHOBJSUFFIX'] = '$OBJSUFFIX'
- env['PROGPREFIX'] = ''
- env['PROGSUFFIX'] = ''
- env['LIBPREFIX'] = 'lib'
- env['LIBSUFFIX'] = '.a'
- env['SHLIBPREFIX'] = '$LIBPREFIX'
- env['SHLIBSUFFIX'] = '.so'
- env['LIBPREFIXES'] = [ '$LIBPREFIX' ]
- env['LIBSUFFIXES'] = [ '$LIBSUFFIX', '$SHLIBSUFFIX' ]
- env['PSPAWN'] = pspawn
- env['SPAWN'] = spawn
- env['SHELL'] = 'sh'
- env['ESCAPE'] = escape
- env['TEMPFILE'] = TempFileMunge
- env['TEMPFILEPREFIX'] = '@'
- #Based on LINUX: ARG_MAX=ARG_MAX=131072 - 3000 for environment expansion
- #Note: specific platforms might rise or lower this value
- env['MAXLINELENGTH'] = 128072
-
- # This platform supports RPATH specifications.
- env['__RPATH'] = '$_RPATH'
-
- # GDC is GCC family, but DMD and LDC have different options.
- # Must be able to have GCC and DMD work in the same build, so:
- env['__DRPATH'] = '$_DRPATH'
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Platform/sunos.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Platform/sunos.py
deleted file mode 100644
index 1c1d797..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Platform/sunos.py
+++ /dev/null
@@ -1,50 +0,0 @@
-"""engine.SCons.Platform.sunos
-
-Platform-specific initialization for Sun systems.
-
-There normally shouldn't be any need to import this module directly. It
-will usually be imported through the generic SCons.Platform.Platform()
-selection method.
-"""
-
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-
-__revision__ = "src/engine/SCons/Platform/sunos.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-import posix
-
-def generate(env):
- posix.generate(env)
- # Based on sunSparc 8:32bit
- # ARG_MAX=1048320 - 3000 for environment expansion
- env['MAXLINELENGTH'] = 1045320
- env['PKGINFO'] = 'pkginfo'
- env['PKGCHK'] = '/usr/sbin/pkgchk'
- env['ENV']['PATH'] = env['ENV']['PATH'] + ':/opt/SUNWspro/bin:/usr/ccs/bin'
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Platform/win32.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Platform/win32.py
deleted file mode 100644
index 3bad86b..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Platform/win32.py
+++ /dev/null
@@ -1,415 +0,0 @@
-"""SCons.Platform.win32
-
-Platform-specific initialization for Win32 systems.
-
-There normally shouldn't be any need to import this module directly. It
-will usually be imported through the generic SCons.Platform.Platform()
-selection method.
-"""
-
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-
-__revision__ = "src/engine/SCons/Platform/win32.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-import os
-import os.path
-import sys
-import tempfile
-
-from SCons.Platform.posix import exitvalmap
-from SCons.Platform import TempFileMunge
-import SCons.Util
-
-try:
- import msvcrt
- import win32api
- import win32con
-
- msvcrt.get_osfhandle
- win32api.SetHandleInformation
- win32con.HANDLE_FLAG_INHERIT
-except ImportError:
- parallel_msg = \
- "you do not seem to have the pywin32 extensions installed;\n" + \
- "\tparallel (-j) builds may not work reliably with open Python files."
-except AttributeError:
- parallel_msg = \
- "your pywin32 extensions do not support file handle operations;\n" + \
- "\tparallel (-j) builds may not work reliably with open Python files."
-else:
- parallel_msg = None
-
- import builtins
-
- _builtin_file = builtins.file
- _builtin_open = builtins.open
-
- class _scons_file(_builtin_file):
- def __init__(self, *args, **kw):
- _builtin_file.__init__(self, *args, **kw)
- win32api.SetHandleInformation(msvcrt.get_osfhandle(self.fileno()),
- win32con.HANDLE_FLAG_INHERIT, 0)
-
- def _scons_open(*args, **kw):
- fp = _builtin_open(*args, **kw)
- win32api.SetHandleInformation(msvcrt.get_osfhandle(fp.fileno()),
- win32con.HANDLE_FLAG_INHERIT,
- 0)
- return fp
-
- builtins.file = _scons_file
- builtins.open = _scons_open
-
-try:
- import threading
- spawn_lock = threading.Lock()
-
- # This locked version of spawnve works around a Windows
- # MSVCRT bug, because its spawnve is not thread-safe.
- # Without this, python can randomly crash while using -jN.
- # See the python bug at http://bugs.python.org/issue6476
- # and SCons issue at
- # http://scons.tigris.org/issues/show_bug.cgi?id=2449
- def spawnve(mode, file, args, env):
- spawn_lock.acquire()
- try:
- if mode == os.P_WAIT:
- ret = os.spawnve(os.P_NOWAIT, file, args, env)
- else:
- ret = os.spawnve(mode, file, args, env)
- finally:
- spawn_lock.release()
- if mode == os.P_WAIT:
- pid, status = os.waitpid(ret, 0)
- ret = status >> 8
- return ret
-except ImportError:
- # Use the unsafe method of spawnve.
- # Please, don't try to optimize this try-except block
- # away by assuming that the threading module is always present.
- # In the test test/option-j.py we intentionally call SCons with
- # a fake threading.py that raises an import exception right away,
- # simulating a non-existent package.
- def spawnve(mode, file, args, env):
- return os.spawnve(mode, file, args, env)
-
-# The upshot of all this is that, if you are using Python 1.5.2,
-# you had better have cmd or command.com in your PATH when you run
-# scons.
-
-def piped_spawn(sh, escape, cmd, args, env, stdout, stderr):
- # There is no direct way to do that in python. What we do
- # here should work for most cases:
- # In case stdout (stderr) is not redirected to a file,
- # we redirect it into a temporary file tmpFileStdout
- # (tmpFileStderr) and copy the contents of this file
- # to stdout (stderr) given in the argument
- if not sh:
- sys.stderr.write("scons: Could not find command interpreter, is it in your PATH?\n")
- return 127
- else:
- # one temporary file for stdout and stderr
- tmpFileStdout = os.path.normpath(tempfile.mktemp())
- tmpFileStderr = os.path.normpath(tempfile.mktemp())
-
- # check if output is redirected
- stdoutRedirected = 0
- stderrRedirected = 0
- for arg in args:
- # are there more possibilities to redirect stdout ?
- if (arg.find( ">", 0, 1 ) != -1 or
- arg.find( "1>", 0, 2 ) != -1):
- stdoutRedirected = 1
- # are there more possibilities to redirect stderr ?
- if arg.find( "2>", 0, 2 ) != -1:
- stderrRedirected = 1
-
- # redirect output of non-redirected streams to our tempfiles
- if stdoutRedirected == 0:
- args.append(">" + str(tmpFileStdout))
- if stderrRedirected == 0:
- args.append("2>" + str(tmpFileStderr))
-
- # actually do the spawn
- try:
- args = [sh, '/C', escape(' '.join(args)) ]
- ret = spawnve(os.P_WAIT, sh, args, env)
- except OSError, e:
- # catch any error
- try:
- ret = exitvalmap[e[0]]
- except KeyError:
- sys.stderr.write("scons: unknown OSError exception code %d - %s: %s\n" % (e[0], cmd, e[1]))
- if stderr is not None:
- stderr.write("scons: %s: %s\n" % (cmd, e[1]))
- # copy child output from tempfiles to our streams
- # and do clean up stuff
- if stdout is not None and stdoutRedirected == 0:
- try:
- stdout.write(open( tmpFileStdout, "r" ).read())
- os.remove( tmpFileStdout )
- except (IOError, OSError):
- pass
-
- if stderr is not None and stderrRedirected == 0:
- try:
- stderr.write(open( tmpFileStderr, "r" ).read())
- os.remove( tmpFileStderr )
- except (IOError, OSError):
- pass
- return ret
-
-def exec_spawn(l, env):
- try:
- result = spawnve(os.P_WAIT, l[0], l, env)
- except OSError, e:
- try:
- result = exitvalmap[e[0]]
- sys.stderr.write("scons: %s: %s\n" % (l[0], e[1]))
- except KeyError:
- result = 127
- if len(l) > 2:
- if len(l[2]) < 1000:
- command = ' '.join(l[0:3])
- else:
- command = l[0]
- else:
- command = l[0]
- sys.stderr.write("scons: unknown OSError exception code %d - '%s': %s\n" % (e[0], command, e[1]))
- return result
-
-def spawn(sh, escape, cmd, args, env):
- if not sh:
- sys.stderr.write("scons: Could not find command interpreter, is it in your PATH?\n")
- return 127
- return exec_spawn([sh, '/C', escape(' '.join(args))], env)
-
-# Windows does not allow special characters in file names anyway, so no
-# need for a complex escape function, we will just quote the arg, except
-# that "cmd /c" requires that if an argument ends with a backslash it
-# needs to be escaped so as not to interfere with closing double quote
-# that we add.
-def escape(x):
- if x[-1] == '\\':
- x = x + '\\'
- return '"' + x + '"'
-
-# Get the windows system directory name
-_system_root = None
-
-def get_system_root():
- global _system_root
- if _system_root is not None:
- return _system_root
-
- # A resonable default if we can't read the registry
- val = os.environ.get('SystemRoot', "C:\\WINDOWS")
-
- if SCons.Util.can_read_reg:
- try:
- # Look for Windows NT system root
- k=SCons.Util.RegOpenKeyEx(SCons.Util.hkey_mod.HKEY_LOCAL_MACHINE,
- 'Software\\Microsoft\\Windows NT\\CurrentVersion')
- val, tok = SCons.Util.RegQueryValueEx(k, 'SystemRoot')
- except SCons.Util.RegError:
- try:
- # Okay, try the Windows 9x system root
- k=SCons.Util.RegOpenKeyEx(SCons.Util.hkey_mod.HKEY_LOCAL_MACHINE,
- 'Software\\Microsoft\\Windows\\CurrentVersion')
- val, tok = SCons.Util.RegQueryValueEx(k, 'SystemRoot')
- except KeyboardInterrupt:
- raise
- except:
- pass
- _system_root = val
- return val
-
-# Get the location of the program files directory
-def get_program_files_dir():
- # Now see if we can look in the registry...
- val = ''
- if SCons.Util.can_read_reg:
- try:
- # Look for Windows Program Files directory
- k=SCons.Util.RegOpenKeyEx(SCons.Util.hkey_mod.HKEY_LOCAL_MACHINE,
- 'Software\\Microsoft\\Windows\\CurrentVersion')
- val, tok = SCons.Util.RegQueryValueEx(k, 'ProgramFilesDir')
- except SCons.Util.RegError:
- val = ''
- pass
-
- if val == '':
- # A reasonable default if we can't read the registry
- # (Actually, it's pretty reasonable even if we can :-)
- val = os.path.join(os.path.dirname(get_system_root()),"Program Files")
-
- return val
-
-
-
-# Determine which windows CPU were running on.
-class ArchDefinition(object):
- """
- A class for defining architecture-specific settings and logic.
- """
- def __init__(self, arch, synonyms=[]):
- self.arch = arch
- self.synonyms = synonyms
-
-SupportedArchitectureList = [
- ArchDefinition(
- 'x86',
- ['i386', 'i486', 'i586', 'i686'],
- ),
-
- ArchDefinition(
- 'x86_64',
- ['AMD64', 'amd64', 'em64t', 'EM64T', 'x86_64'],
- ),
-
- ArchDefinition(
- 'ia64',
- ['IA64'],
- ),
-]
-
-SupportedArchitectureMap = {}
-for a in SupportedArchitectureList:
- SupportedArchitectureMap[a.arch] = a
- for s in a.synonyms:
- SupportedArchitectureMap[s] = a
-
-def get_architecture(arch=None):
- """Returns the definition for the specified architecture string.
-
- If no string is specified, the system default is returned (as defined
- by the PROCESSOR_ARCHITEW6432 or PROCESSOR_ARCHITECTURE environment
- variables).
- """
- if arch is None:
- arch = os.environ.get('PROCESSOR_ARCHITEW6432')
- if not arch:
- arch = os.environ.get('PROCESSOR_ARCHITECTURE')
- return SupportedArchitectureMap.get(arch, ArchDefinition('', ['']))
-
-def generate(env):
- # Attempt to find cmd.exe (for WinNT/2k/XP) or
- # command.com for Win9x
- cmd_interp = ''
- # First see if we can look in the registry...
- if SCons.Util.can_read_reg:
- try:
- # Look for Windows NT system root
- k=SCons.Util.RegOpenKeyEx(SCons.Util.hkey_mod.HKEY_LOCAL_MACHINE,
- 'Software\\Microsoft\\Windows NT\\CurrentVersion')
- val, tok = SCons.Util.RegQueryValueEx(k, 'SystemRoot')
- cmd_interp = os.path.join(val, 'System32\\cmd.exe')
- except SCons.Util.RegError:
- try:
- # Okay, try the Windows 9x system root
- k=SCons.Util.RegOpenKeyEx(SCons.Util.hkey_mod.HKEY_LOCAL_MACHINE,
- 'Software\\Microsoft\\Windows\\CurrentVersion')
- val, tok = SCons.Util.RegQueryValueEx(k, 'SystemRoot')
- cmd_interp = os.path.join(val, 'command.com')
- except KeyboardInterrupt:
- raise
- except:
- pass
-
- # For the special case of not having access to the registry, we
- # use a temporary path and pathext to attempt to find the command
- # interpreter. If we fail, we try to find the interpreter through
- # the env's PATH. The problem with that is that it might not
- # contain an ENV and a PATH.
- if not cmd_interp:
- systemroot = get_system_root()
- tmp_path = systemroot + os.pathsep + \
- os.path.join(systemroot,'System32')
- tmp_pathext = '.com;.exe;.bat;.cmd'
- if 'PATHEXT' in os.environ:
- tmp_pathext = os.environ['PATHEXT']
- cmd_interp = SCons.Util.WhereIs('cmd', tmp_path, tmp_pathext)
- if not cmd_interp:
- cmd_interp = SCons.Util.WhereIs('command', tmp_path, tmp_pathext)
-
- if not cmd_interp:
- cmd_interp = env.Detect('cmd')
- if not cmd_interp:
- cmd_interp = env.Detect('command')
-
-
- if 'ENV' not in env:
- env['ENV'] = {}
-
- # Import things from the external environment to the construction
- # environment's ENV. This is a potential slippery slope, because we
- # *don't* want to make builds dependent on the user's environment by
- # default. We're doing this for SystemRoot, though, because it's
- # needed for anything that uses sockets, and seldom changes, and
- # for SystemDrive because it's related.
- #
- # Weigh the impact carefully before adding other variables to this list.
- import_env = [ 'SystemDrive', 'SystemRoot', 'TEMP', 'TMP' ]
- for var in import_env:
- v = os.environ.get(var)
- if v:
- env['ENV'][var] = v
-
- if 'COMSPEC' not in env['ENV']:
- v = os.environ.get("COMSPEC")
- if v:
- env['ENV']['COMSPEC'] = v
-
- env.AppendENVPath('PATH', get_system_root() + '\System32')
-
- env['ENV']['PATHEXT'] = '.COM;.EXE;.BAT;.CMD'
- env['OBJPREFIX'] = ''
- env['OBJSUFFIX'] = '.obj'
- env['SHOBJPREFIX'] = '$OBJPREFIX'
- env['SHOBJSUFFIX'] = '$OBJSUFFIX'
- env['PROGPREFIX'] = ''
- env['PROGSUFFIX'] = '.exe'
- env['LIBPREFIX'] = ''
- env['LIBSUFFIX'] = '.lib'
- env['SHLIBPREFIX'] = ''
- env['SHLIBSUFFIX'] = '.dll'
- env['LIBPREFIXES'] = [ '$LIBPREFIX' ]
- env['LIBSUFFIXES'] = [ '$LIBSUFFIX' ]
- env['PSPAWN'] = piped_spawn
- env['SPAWN'] = spawn
- env['SHELL'] = cmd_interp
- env['TEMPFILE'] = TempFileMunge
- env['TEMPFILEPREFIX'] = '@'
- env['MAXLINELENGTH'] = 2048
- env['ESCAPE'] = escape
-
- env['HOST_OS'] = 'win32'
- env['HOST_ARCH'] = get_architecture().arch
-
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/SConf.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/SConf.py
deleted file mode 100644
index 2ef4003..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/SConf.py
+++ /dev/null
@@ -1,1054 +0,0 @@
-"""SCons.SConf
-
-Autoconf-like configuration support.
-
-In other words, SConf allows to run tests on the build machine to detect
-capabilities of system and do some things based on result: generate config
-files, header files for C/C++, update variables in environment.
-
-Tests on the build system can detect if compiler sees header files, if
-libraries are installed, if some command line options are supported etc.
-
-"""
-
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-
-__revision__ = "src/engine/SCons/SConf.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-import SCons.compat
-
-import io
-import os
-import re
-import sys
-import traceback
-
-import SCons.Action
-import SCons.Builder
-import SCons.Errors
-import SCons.Job
-import SCons.Node.FS
-import SCons.Taskmaster
-import SCons.Util
-import SCons.Warnings
-import SCons.Conftest
-
-from SCons.Debug import Trace
-
-# Turn off the Conftest error logging
-SCons.Conftest.LogInputFiles = 0
-SCons.Conftest.LogErrorMessages = 0
-
-# Set
-build_type = None
-build_types = ['clean', 'help']
-
-def SetBuildType(type):
- global build_type
- build_type = type
-
-# to be set, if we are in dry-run mode
-dryrun = 0
-
-AUTO=0 # use SCons dependency scanning for up-to-date checks
-FORCE=1 # force all tests to be rebuilt
-CACHE=2 # force all tests to be taken from cache (raise an error, if necessary)
-cache_mode = AUTO
-
-def SetCacheMode(mode):
- """Set the Configure cache mode. mode must be one of "auto", "force",
- or "cache"."""
- global cache_mode
- if mode == "auto":
- cache_mode = AUTO
- elif mode == "force":
- cache_mode = FORCE
- elif mode == "cache":
- cache_mode = CACHE
- else:
- raise ValueError("SCons.SConf.SetCacheMode: Unknown mode " + mode)
-
-progress_display = SCons.Util.display # will be overwritten by SCons.Script
-def SetProgressDisplay(display):
- """Set the progress display to use (called from SCons.Script)"""
- global progress_display
- progress_display = display
-
-SConfFS = None
-
-_ac_build_counter = 0 # incremented, whenever TryBuild is called
-_ac_config_logs = {} # all config.log files created in this build
-_ac_config_hs = {} # all config.h files created in this build
-sconf_global = None # current sconf object
-
-def _createConfigH(target, source, env):
- t = open(str(target[0]), "w")
- defname = re.sub('[^A-Za-z0-9_]', '_', str(target[0]).upper())
- t.write("""#ifndef %(DEFNAME)s_SEEN
-#define %(DEFNAME)s_SEEN
-
-""" % {'DEFNAME' : defname})
- t.write(source[0].get_contents())
- t.write("""
-#endif /* %(DEFNAME)s_SEEN */
-""" % {'DEFNAME' : defname})
- t.close()
-
-def _stringConfigH(target, source, env):
- return "scons: Configure: creating " + str(target[0])
-
-
-def NeedConfigHBuilder():
- if len(_ac_config_hs) == 0:
- return False
- else:
- return True
-
-def CreateConfigHBuilder(env):
- """Called if necessary just before the building targets phase begins."""
- action = SCons.Action.Action(_createConfigH,
- _stringConfigH)
- sconfigHBld = SCons.Builder.Builder(action=action)
- env.Append( BUILDERS={'SConfigHBuilder':sconfigHBld} )
- for k in _ac_config_hs.keys():
- env.SConfigHBuilder(k, env.Value(_ac_config_hs[k]))
-
-
-class SConfWarning(SCons.Warnings.Warning):
- pass
-SCons.Warnings.enableWarningClass(SConfWarning)
-
-# some error definitions
-class SConfError(SCons.Errors.UserError):
- def __init__(self,msg):
- SCons.Errors.UserError.__init__(self,msg)
-
-class ConfigureDryRunError(SConfError):
- """Raised when a file or directory needs to be updated during a Configure
- process, but the user requested a dry-run"""
- def __init__(self,target):
- if not isinstance(target, SCons.Node.FS.File):
- msg = 'Cannot create configure directory "%s" within a dry-run.' % str(target)
- else:
- msg = 'Cannot update configure test "%s" within a dry-run.' % str(target)
- SConfError.__init__(self,msg)
-
-class ConfigureCacheError(SConfError):
- """Raised when a use explicitely requested the cache feature, but the test
- is run the first time."""
- def __init__(self,target):
- SConfError.__init__(self, '"%s" is not yet built and cache is forced.' % str(target))
-
-# define actions for building text files
-def _createSource( target, source, env ):
- fd = open(str(target[0]), "w")
- fd.write(source[0].get_contents())
- fd.close()
-def _stringSource( target, source, env ):
- return (str(target[0]) + ' <-\n |' +
- source[0].get_contents().replace( '\n', "\n |" ) )
-
-class SConfBuildInfo(SCons.Node.FS.FileBuildInfo):
- """
- Special build info for targets of configure tests. Additional members
- are result (did the builder succeed last time?) and string, which
- contains messages of the original build phase.
- """
- __slots__ = ('result', 'string')
-
- def __init__(self):
- self.result = None # -> 0/None -> no error, != 0 error
- self.string = None # the stdout / stderr output when building the target
-
- def set_build_result(self, result, string):
- self.result = result
- self.string = string
-
-
-class Streamer(object):
- """
- 'Sniffer' for a file-like writable object. Similar to the unix tool tee.
- """
- def __init__(self, orig):
- self.orig = orig
- self.s = io.StringIO()
-
- def write(self, str):
- if self.orig:
- self.orig.write(str)
- try:
- self.s.write(str)
- except TypeError as e:
- # "unicode argument expected" bug in IOStream (python 2.x)
- self.s.write(str.decode())
-
- def writelines(self, lines):
- for l in lines:
- self.write(l + '\n')
-
- def getvalue(self):
- """
- Return everything written to orig since the Streamer was created.
- """
- return self.s.getvalue()
-
- def flush(self):
- if self.orig:
- self.orig.flush()
- self.s.flush()
-
-
-class SConfBuildTask(SCons.Taskmaster.AlwaysTask):
- """
- This is almost the same as SCons.Script.BuildTask. Handles SConfErrors
- correctly and knows about the current cache_mode.
- """
- def display(self, message):
- if sconf_global.logstream:
- sconf_global.logstream.write("scons: Configure: " + message + "\n")
-
- def display_cached_string(self, bi):
- """
- Logs the original builder messages, given the SConfBuildInfo instance
- bi.
- """
- if not isinstance(bi, SConfBuildInfo):
- SCons.Warnings.warn(SConfWarning,
- "The stored build information has an unexpected class: %s" % bi.__class__)
- else:
- self.display("The original builder output was:\n" +
- (" |" + str(bi.string)).replace("\n", "\n |"))
-
- def failed(self):
- # check, if the reason was a ConfigureDryRunError or a
- # ConfigureCacheError and if yes, reraise the exception
- exc_type = self.exc_info()[0]
- if issubclass(exc_type, SConfError):
- raise
- elif issubclass(exc_type, SCons.Errors.BuildError):
- # we ignore Build Errors (occurs, when a test doesn't pass)
- # Clear the exception to prevent the contained traceback
- # to build a reference cycle.
- self.exc_clear()
- else:
- self.display('Caught exception while building "%s":\n' %
- self.targets[0])
- try:
- excepthook = sys.excepthook
- except AttributeError:
- # Earlier versions of Python don't have sys.excepthook...
- def excepthook(type, value, tb):
- traceback.print_tb(tb)
- print type, value
- excepthook(*self.exc_info())
- return SCons.Taskmaster.Task.failed(self)
-
- def collect_node_states(self):
- # returns (is_up_to_date, cached_error, cachable)
- # where is_up_to_date is 1, if the node(s) are up_to_date
- # cached_error is 1, if the node(s) are up_to_date, but the
- # build will fail
- # cachable is 0, if some nodes are not in our cache
- T = 0
- changed = False
- cached_error = False
- cachable = True
- for t in self.targets:
- if T: Trace('%s' % (t))
- bi = t.get_stored_info().binfo
- if isinstance(bi, SConfBuildInfo):
- if T: Trace(': SConfBuildInfo')
- if cache_mode == CACHE:
- t.set_state(SCons.Node.up_to_date)
- if T: Trace(': set_state(up_to-date)')
- else:
- if T: Trace(': get_state() %s' % t.get_state())
- if T: Trace(': changed() %s' % t.changed())
- if (t.get_state() != SCons.Node.up_to_date and t.changed()):
- changed = True
- if T: Trace(': changed %s' % changed)
- cached_error = cached_error or bi.result
- else:
- if T: Trace(': else')
- # the node hasn't been built in a SConf context or doesn't
- # exist
- cachable = False
- changed = ( t.get_state() != SCons.Node.up_to_date )
- if T: Trace(': changed %s' % changed)
- if T: Trace('\n')
- return (not changed, cached_error, cachable)
-
- def execute(self):
- if not self.targets[0].has_builder():
- return
-
- sconf = sconf_global
-
- is_up_to_date, cached_error, cachable = self.collect_node_states()
-
- if cache_mode == CACHE and not cachable:
- raise ConfigureCacheError(self.targets[0])
- elif cache_mode == FORCE:
- is_up_to_date = 0
-
- if cached_error and is_up_to_date:
- self.display("Building \"%s\" failed in a previous run and all "
- "its sources are up to date." % str(self.targets[0]))
- binfo = self.targets[0].get_stored_info().binfo
- self.display_cached_string(binfo)
- raise SCons.Errors.BuildError # will be 'caught' in self.failed
- elif is_up_to_date:
- self.display("\"%s\" is up to date." % str(self.targets[0]))
- binfo = self.targets[0].get_stored_info().binfo
- self.display_cached_string(binfo)
- elif dryrun:
- raise ConfigureDryRunError(self.targets[0])
- else:
- # note stdout and stderr are the same here
- s = sys.stdout = sys.stderr = Streamer(sys.stdout)
- try:
- env = self.targets[0].get_build_env()
- if cache_mode == FORCE:
- # Set up the Decider() to force rebuilds by saying
- # that every source has changed. Note that we still
- # call the environment's underlying source decider so
- # that the correct .sconsign info will get calculated
- # and keep the build state consistent.
- def force_build(dependency, target, prev_ni,
- env_decider=env.decide_source):
- env_decider(dependency, target, prev_ni)
- return True
- if env.decide_source.func_code is not force_build.func_code:
- env.Decider(force_build)
- env['PSTDOUT'] = env['PSTDERR'] = s
- try:
- sconf.cached = 0
- self.targets[0].build()
- finally:
- sys.stdout = sys.stderr = env['PSTDOUT'] = \
- env['PSTDERR'] = sconf.logstream
- except KeyboardInterrupt:
- raise
- except SystemExit:
- exc_value = sys.exc_info()[1]
- raise SCons.Errors.ExplicitExit(self.targets[0],exc_value.code)
- except Exception, e:
- for t in self.targets:
- #binfo = t.get_binfo()
- #binfo.__class__ = SConfBuildInfo
- binfo = SConfBuildInfo()
- binfo.merge(t.get_binfo())
- binfo.set_build_result(1, s.getvalue())
- sconsign_entry = SCons.SConsign.SConsignEntry()
- sconsign_entry.binfo = binfo
- #sconsign_entry.ninfo = self.get_ninfo()
- # We'd like to do this as follows:
- # t.store_info(binfo)
- # However, we need to store it as an SConfBuildInfo
- # object, and store_info() will turn it into a
- # regular FileNodeInfo if the target is itself a
- # regular File.
- sconsign = t.dir.sconsign()
- sconsign.set_entry(t.name, sconsign_entry)
- sconsign.merge()
- raise e
- else:
- for t in self.targets:
- #binfo = t.get_binfo()
- #binfo.__class__ = SConfBuildInfo
- binfo = SConfBuildInfo()
- binfo.merge(t.get_binfo())
- binfo.set_build_result(0, s.getvalue())
- sconsign_entry = SCons.SConsign.SConsignEntry()
- sconsign_entry.binfo = binfo
- #sconsign_entry.ninfo = self.get_ninfo()
- # We'd like to do this as follows:
- # t.store_info(binfo)
- # However, we need to store it as an SConfBuildInfo
- # object, and store_info() will turn it into a
- # regular FileNodeInfo if the target is itself a
- # regular File.
- sconsign = t.dir.sconsign()
- sconsign.set_entry(t.name, sconsign_entry)
- sconsign.merge()
-
-class SConfBase(object):
- """This is simply a class to represent a configure context. After
- creating a SConf object, you can call any tests. After finished with your
- tests, be sure to call the Finish() method, which returns the modified
- environment.
- Some words about caching: In most cases, it is not necessary to cache
- Test results explicitely. Instead, we use the scons dependency checking
- mechanism. For example, if one wants to compile a test program
- (SConf.TryLink), the compiler is only called, if the program dependencies
- have changed. However, if the program could not be compiled in a former
- SConf run, we need to explicitely cache this error.
- """
-
- def __init__(self, env, custom_tests = {}, conf_dir='$CONFIGUREDIR',
- log_file='$CONFIGURELOG', config_h = None, _depth = 0):
- """Constructor. Pass additional tests in the custom_tests-dictinary,
- e.g. custom_tests={'CheckPrivate':MyPrivateTest}, where MyPrivateTest
- defines a custom test.
- Note also the conf_dir and log_file arguments (you may want to
- build tests in the VariantDir, not in the SourceDir)
- """
- global SConfFS
- if not SConfFS:
- SConfFS = SCons.Node.FS.default_fs or \
- SCons.Node.FS.FS(env.fs.pathTop)
- if sconf_global is not None:
- raise SCons.Errors.UserError
- self.env = env
- if log_file is not None:
- log_file = SConfFS.File(env.subst(log_file))
- self.logfile = log_file
- self.logstream = None
- self.lastTarget = None
- self.depth = _depth
- self.cached = 0 # will be set, if all test results are cached
-
- # add default tests
- default_tests = {
- 'CheckCC' : CheckCC,
- 'CheckCXX' : CheckCXX,
- 'CheckSHCC' : CheckSHCC,
- 'CheckSHCXX' : CheckSHCXX,
- 'CheckFunc' : CheckFunc,
- 'CheckType' : CheckType,
- 'CheckTypeSize' : CheckTypeSize,
- 'CheckDeclaration' : CheckDeclaration,
- 'CheckHeader' : CheckHeader,
- 'CheckCHeader' : CheckCHeader,
- 'CheckCXXHeader' : CheckCXXHeader,
- 'CheckLib' : CheckLib,
- 'CheckLibWithHeader' : CheckLibWithHeader,
- }
- self.AddTests(default_tests)
- self.AddTests(custom_tests)
- self.confdir = SConfFS.Dir(env.subst(conf_dir))
- if config_h is not None:
- config_h = SConfFS.File(config_h)
- self.config_h = config_h
- self._startup()
-
- def Finish(self):
- """Call this method after finished with your tests:
- env = sconf.Finish()
- """
- self._shutdown()
- return self.env
-
- def Define(self, name, value = None, comment = None):
- """
- Define a pre processor symbol name, with the optional given value in the
- current config header.
-
- If value is None (default), then #define name is written. If value is not
- none, then #define name value is written.
-
- comment is a string which will be put as a C comment in the
- header, to explain the meaning of the value (appropriate C comments /* and
- */ will be put automatically."""
- lines = []
- if comment:
- comment_str = "/* %s */" % comment
- lines.append(comment_str)
-
- if value is not None:
- define_str = "#define %s %s" % (name, value)
- else:
- define_str = "#define %s" % name
- lines.append(define_str)
- lines.append('')
-
- self.config_h_text = self.config_h_text + '\n'.join(lines)
-
- def BuildNodes(self, nodes):
- """
- Tries to build the given nodes immediately. Returns 1 on success,
- 0 on error.
- """
- if self.logstream is not None:
- # override stdout / stderr to write in log file
- oldStdout = sys.stdout
- sys.stdout = self.logstream
- oldStderr = sys.stderr
- sys.stderr = self.logstream
-
- # the engine assumes the current path is the SConstruct directory ...
- old_fs_dir = SConfFS.getcwd()
- old_os_dir = os.getcwd()
- SConfFS.chdir(SConfFS.Top, change_os_dir=1)
-
- # Because we take responsibility here for writing out our
- # own .sconsign info (see SConfBuildTask.execute(), above),
- # we override the store_info() method with a null place-holder
- # so we really control how it gets written.
- for n in nodes:
- n.store_info = 0
- if not hasattr(n, 'attributes'):
- n.attributes = SCons.Node.Node.Attrs()
- n.attributes.keep_targetinfo = 1
-
- ret = 1
-
- try:
- # ToDo: use user options for calc
- save_max_drift = SConfFS.get_max_drift()
- SConfFS.set_max_drift(0)
- tm = SCons.Taskmaster.Taskmaster(nodes, SConfBuildTask)
- # we don't want to build tests in parallel
- jobs = SCons.Job.Jobs(1, tm )
- jobs.run()
- for n in nodes:
- state = n.get_state()
- if (state != SCons.Node.executed and
- state != SCons.Node.up_to_date):
- # the node could not be built. we return 0 in this case
- ret = 0
- finally:
- SConfFS.set_max_drift(save_max_drift)
- os.chdir(old_os_dir)
- SConfFS.chdir(old_fs_dir, change_os_dir=0)
- if self.logstream is not None:
- # restore stdout / stderr
- sys.stdout = oldStdout
- sys.stderr = oldStderr
- return ret
-
- def pspawn_wrapper(self, sh, escape, cmd, args, env):
- """Wrapper function for handling piped spawns.
-
- This looks to the calling interface (in Action.py) like a "normal"
- spawn, but associates the call with the PSPAWN variable from
- the construction environment and with the streams to which we
- want the output logged. This gets slid into the construction
- environment as the SPAWN variable so Action.py doesn't have to
- know or care whether it's spawning a piped command or not.
- """
- return self.pspawn(sh, escape, cmd, args, env, self.logstream, self.logstream)
-
-
- def TryBuild(self, builder, text = None, extension = ""):
- """Low level TryBuild implementation. Normally you don't need to
- call that - you can use TryCompile / TryLink / TryRun instead
- """
- global _ac_build_counter
-
- # Make sure we have a PSPAWN value, and save the current
- # SPAWN value.
- try:
- self.pspawn = self.env['PSPAWN']
- except KeyError:
- raise SCons.Errors.UserError('Missing PSPAWN construction variable.')
- try:
- save_spawn = self.env['SPAWN']
- except KeyError:
- raise SCons.Errors.UserError('Missing SPAWN construction variable.')
-
- nodesToBeBuilt = []
-
- f = "conftest_" + str(_ac_build_counter)
- pref = self.env.subst( builder.builder.prefix )
- suff = self.env.subst( builder.builder.suffix )
- target = self.confdir.File(pref + f + suff)
-
- try:
- # Slide our wrapper into the construction environment as
- # the SPAWN function.
- self.env['SPAWN'] = self.pspawn_wrapper
- sourcetext = self.env.Value(text)
-
- if text is not None:
- textFile = self.confdir.File(f + extension)
- textFileNode = self.env.SConfSourceBuilder(target=textFile,
- source=sourcetext)
- nodesToBeBuilt.extend(textFileNode)
- source = textFileNode
- else:
- source = None
-
- nodes = builder(target = target, source = source)
- if not SCons.Util.is_List(nodes):
- nodes = [nodes]
- nodesToBeBuilt.extend(nodes)
- result = self.BuildNodes(nodesToBeBuilt)
-
- finally:
- self.env['SPAWN'] = save_spawn
-
- _ac_build_counter = _ac_build_counter + 1
- if result:
- self.lastTarget = nodes[0]
- else:
- self.lastTarget = None
-
- return result
-
- def TryAction(self, action, text = None, extension = ""):
- """Tries to execute the given action with optional source file
- contents <text> and optional source file extension <extension>,
- Returns the status (0 : failed, 1 : ok) and the contents of the
- output file.
- """
- builder = SCons.Builder.Builder(action=action)
- self.env.Append( BUILDERS = {'SConfActionBuilder' : builder} )
- ok = self.TryBuild(self.env.SConfActionBuilder, text, extension)
- del self.env['BUILDERS']['SConfActionBuilder']
- if ok:
- outputStr = self.lastTarget.get_contents()
- return (1, outputStr)
- return (0, "")
-
- def TryCompile( self, text, extension):
- """Compiles the program given in text to an env.Object, using extension
- as file extension (e.g. '.c'). Returns 1, if compilation was
- successful, 0 otherwise. The target is saved in self.lastTarget (for
- further processing).
- """
- return self.TryBuild(self.env.Object, text, extension)
-
- def TryLink( self, text, extension ):
- """Compiles the program given in text to an executable env.Program,
- using extension as file extension (e.g. '.c'). Returns 1, if
- compilation was successful, 0 otherwise. The target is saved in
- self.lastTarget (for further processing).
- """
- return self.TryBuild(self.env.Program, text, extension )
-
- def TryRun(self, text, extension ):
- """Compiles and runs the program given in text, using extension
- as file extension (e.g. '.c'). Returns (1, outputStr) on success,
- (0, '') otherwise. The target (a file containing the program's stdout)
- is saved in self.lastTarget (for further processing).
- """
- ok = self.TryLink(text, extension)
- if( ok ):
- prog = self.lastTarget
- pname = prog.get_internal_path()
- output = self.confdir.File(os.path.basename(pname)+'.out')
- node = self.env.Command(output, prog, [ [ pname, ">", "${TARGET}"] ])
- ok = self.BuildNodes(node)
- if ok:
- outputStr = output.get_contents()
- return( 1, outputStr)
- return (0, "")
-
- class TestWrapper(object):
- """A wrapper around Tests (to ensure sanity)"""
- def __init__(self, test, sconf):
- self.test = test
- self.sconf = sconf
- def __call__(self, *args, **kw):
- if not self.sconf.active:
- raise SCons.Errors.UserError
- context = CheckContext(self.sconf)
- ret = self.test(context, *args, **kw)
- if self.sconf.config_h is not None:
- self.sconf.config_h_text = self.sconf.config_h_text + context.config_h
- context.Result("error: no result")
- return ret
-
- def AddTest(self, test_name, test_instance):
- """Adds test_class to this SConf instance. It can be called with
- self.test_name(...)"""
- setattr(self, test_name, SConfBase.TestWrapper(test_instance, self))
-
- def AddTests(self, tests):
- """Adds all the tests given in the tests dictionary to this SConf
- instance
- """
- for name in tests.keys():
- self.AddTest(name, tests[name])
-
- def _createDir( self, node ):
- dirName = str(node)
- if dryrun:
- if not os.path.isdir( dirName ):
- raise ConfigureDryRunError(dirName)
- else:
- if not os.path.isdir( dirName ):
- os.makedirs( dirName )
-
- def _startup(self):
- """Private method. Set up logstream, and set the environment
- variables necessary for a piped build
- """
- global _ac_config_logs
- global sconf_global
- global SConfFS
-
- self.lastEnvFs = self.env.fs
- self.env.fs = SConfFS
- self._createDir(self.confdir)
- self.confdir.up().add_ignore( [self.confdir] )
-
- if self.logfile is not None and not dryrun:
- # truncate logfile, if SConf.Configure is called for the first time
- # in a build
- if self.logfile in _ac_config_logs:
- log_mode = "a"
- else:
- _ac_config_logs[self.logfile] = None
- log_mode = "w"
- fp = open(str(self.logfile), log_mode)
- self.logstream = SCons.Util.Unbuffered(fp)
- # logfile may stay in a build directory, so we tell
- # the build system not to override it with a eventually
- # existing file with the same name in the source directory
- self.logfile.dir.add_ignore( [self.logfile] )
-
- tb = traceback.extract_stack()[-3-self.depth]
- old_fs_dir = SConfFS.getcwd()
- SConfFS.chdir(SConfFS.Top, change_os_dir=0)
- self.logstream.write('file %s,line %d:\n\tConfigure(confdir = %s)\n' %
- (tb[0], tb[1], str(self.confdir)) )
- SConfFS.chdir(old_fs_dir)
- else:
- self.logstream = None
- # we use a special builder to create source files from TEXT
- action = SCons.Action.Action(_createSource,
- _stringSource)
- sconfSrcBld = SCons.Builder.Builder(action=action)
- self.env.Append( BUILDERS={'SConfSourceBuilder':sconfSrcBld} )
- self.config_h_text = _ac_config_hs.get(self.config_h, "")
- self.active = 1
- # only one SConf instance should be active at a time ...
- sconf_global = self
-
- def _shutdown(self):
- """Private method. Reset to non-piped spawn"""
- global sconf_global, _ac_config_hs
-
- if not self.active:
- raise SCons.Errors.UserError("Finish may be called only once!")
- if self.logstream is not None and not dryrun:
- self.logstream.write("\n")
- self.logstream.close()
- self.logstream = None
- # remove the SConfSourceBuilder from the environment
- blds = self.env['BUILDERS']
- del blds['SConfSourceBuilder']
- self.env.Replace( BUILDERS=blds )
- self.active = 0
- sconf_global = None
- if not self.config_h is None:
- _ac_config_hs[self.config_h] = self.config_h_text
- self.env.fs = self.lastEnvFs
-
-class CheckContext(object):
- """Provides a context for configure tests. Defines how a test writes to the
- screen and log file.
-
- A typical test is just a callable with an instance of CheckContext as
- first argument:
-
- def CheckCustom(context, ...)
- context.Message('Checking my weird test ... ')
- ret = myWeirdTestFunction(...)
- context.Result(ret)
-
- Often, myWeirdTestFunction will be one of
- context.TryCompile/context.TryLink/context.TryRun. The results of
- those are cached, for they are only rebuild, if the dependencies have
- changed.
- """
-
- def __init__(self, sconf):
- """Constructor. Pass the corresponding SConf instance."""
- self.sconf = sconf
- self.did_show_result = 0
-
- # for Conftest.py:
- self.vardict = {}
- self.havedict = {}
- self.headerfilename = None
- self.config_h = "" # config_h text will be stored here
- # we don't regenerate the config.h file after each test. That means,
- # that tests won't be able to include the config.h file, and so
- # they can't do an #ifdef HAVE_XXX_H. This shouldn't be a major
- # issue, though. If it turns out, that we need to include config.h
- # in tests, we must ensure, that the dependencies are worked out
- # correctly. Note that we can't use Conftest.py's support for config.h,
- # cause we will need to specify a builder for the config.h file ...
-
- def Message(self, text):
- """Inform about what we are doing right now, e.g.
- 'Checking for SOMETHING ... '
- """
- self.Display(text)
- self.sconf.cached = 1
- self.did_show_result = 0
-
- def Result(self, res):
- """Inform about the result of the test. If res is not a string, displays
- 'yes' or 'no' depending on whether res is evaluated as true or false.
- The result is only displayed when self.did_show_result is not set.
- """
- if isinstance(res, str):
- text = res
- elif res:
- text = "yes"
- else:
- text = "no"
-
- if self.did_show_result == 0:
- # Didn't show result yet, do it now.
- self.Display(text + "\n")
- self.did_show_result = 1
-
- def TryBuild(self, *args, **kw):
- return self.sconf.TryBuild(*args, **kw)
-
- def TryAction(self, *args, **kw):
- return self.sconf.TryAction(*args, **kw)
-
- def TryCompile(self, *args, **kw):
- return self.sconf.TryCompile(*args, **kw)
-
- def TryLink(self, *args, **kw):
- return self.sconf.TryLink(*args, **kw)
-
- def TryRun(self, *args, **kw):
- return self.sconf.TryRun(*args, **kw)
-
- def __getattr__( self, attr ):
- if( attr == 'env' ):
- return self.sconf.env
- elif( attr == 'lastTarget' ):
- return self.sconf.lastTarget
- else:
- raise AttributeError("CheckContext instance has no attribute '%s'" % attr)
-
- #### Stuff used by Conftest.py (look there for explanations).
-
- def BuildProg(self, text, ext):
- self.sconf.cached = 1
- # TODO: should use self.vardict for $CC, $CPPFLAGS, etc.
- return not self.TryBuild(self.env.Program, text, ext)
-
- def CompileProg(self, text, ext):
- self.sconf.cached = 1
- # TODO: should use self.vardict for $CC, $CPPFLAGS, etc.
- return not self.TryBuild(self.env.Object, text, ext)
-
- def CompileSharedObject(self, text, ext):
- self.sconf.cached = 1
- # TODO: should use self.vardict for $SHCC, $CPPFLAGS, etc.
- return not self.TryBuild(self.env.SharedObject, text, ext)
-
- def RunProg(self, text, ext):
- self.sconf.cached = 1
- # TODO: should use self.vardict for $CC, $CPPFLAGS, etc.
- st, out = self.TryRun(text, ext)
- return not st, out
-
- def AppendLIBS(self, lib_name_list):
- oldLIBS = self.env.get( 'LIBS', [] )
- self.env.Append(LIBS = lib_name_list)
- return oldLIBS
-
- def PrependLIBS(self, lib_name_list):
- oldLIBS = self.env.get( 'LIBS', [] )
- self.env.Prepend(LIBS = lib_name_list)
- return oldLIBS
-
- def SetLIBS(self, val):
- oldLIBS = self.env.get( 'LIBS', [] )
- self.env.Replace(LIBS = val)
- return oldLIBS
-
- def Display(self, msg):
- if self.sconf.cached:
- # We assume that Display is called twice for each test here
- # once for the Checking for ... message and once for the result.
- # The self.sconf.cached flag can only be set between those calls
- msg = "(cached) " + msg
- self.sconf.cached = 0
- progress_display(msg, append_newline=0)
- self.Log("scons: Configure: " + msg + "\n")
-
- def Log(self, msg):
- if self.sconf.logstream is not None:
- self.sconf.logstream.write(msg)
-
- #### End of stuff used by Conftest.py.
-
-
-def SConf(*args, **kw):
- if kw.get(build_type, True):
- kw['_depth'] = kw.get('_depth', 0) + 1
- for bt in build_types:
- try:
- del kw[bt]
- except KeyError:
- pass
- return SConfBase(*args, **kw)
- else:
- return SCons.Util.Null()
-
-
-def CheckFunc(context, function_name, header = None, language = None):
- res = SCons.Conftest.CheckFunc(context, function_name, header = header, language = language)
- context.did_show_result = 1
- return not res
-
-def CheckType(context, type_name, includes = "", language = None):
- res = SCons.Conftest.CheckType(context, type_name,
- header = includes, language = language)
- context.did_show_result = 1
- return not res
-
-def CheckTypeSize(context, type_name, includes = "", language = None, expect = None):
- res = SCons.Conftest.CheckTypeSize(context, type_name,
- header = includes, language = language,
- expect = expect)
- context.did_show_result = 1
- return res
-
-def CheckDeclaration(context, declaration, includes = "", language = None):
- res = SCons.Conftest.CheckDeclaration(context, declaration,
- includes = includes,
- language = language)
- context.did_show_result = 1
- return not res
-
-def createIncludesFromHeaders(headers, leaveLast, include_quotes = '""'):
- # used by CheckHeader and CheckLibWithHeader to produce C - #include
- # statements from the specified header (list)
- if not SCons.Util.is_List(headers):
- headers = [headers]
- l = []
- if leaveLast:
- lastHeader = headers[-1]
- headers = headers[:-1]
- else:
- lastHeader = None
- for s in headers:
- l.append("#include %s%s%s\n"
- % (include_quotes[0], s, include_quotes[1]))
- return ''.join(l), lastHeader
-
-def CheckHeader(context, header, include_quotes = '<>', language = None):
- """
- A test for a C or C++ header file.
- """
- prog_prefix, hdr_to_check = \
- createIncludesFromHeaders(header, 1, include_quotes)
- res = SCons.Conftest.CheckHeader(context, hdr_to_check, prog_prefix,
- language = language,
- include_quotes = include_quotes)
- context.did_show_result = 1
- return not res
-
-def CheckCC(context):
- res = SCons.Conftest.CheckCC(context)
- context.did_show_result = 1
- return not res
-
-def CheckCXX(context):
- res = SCons.Conftest.CheckCXX(context)
- context.did_show_result = 1
- return not res
-
-def CheckSHCC(context):
- res = SCons.Conftest.CheckSHCC(context)
- context.did_show_result = 1
- return not res
-
-def CheckSHCXX(context):
- res = SCons.Conftest.CheckSHCXX(context)
- context.did_show_result = 1
- return not res
-
-# Bram: Make this function obsolete? CheckHeader() is more generic.
-
-def CheckCHeader(context, header, include_quotes = '""'):
- """
- A test for a C header file.
- """
- return CheckHeader(context, header, include_quotes, language = "C")
-
-
-# Bram: Make this function obsolete? CheckHeader() is more generic.
-
-def CheckCXXHeader(context, header, include_quotes = '""'):
- """
- A test for a C++ header file.
- """
- return CheckHeader(context, header, include_quotes, language = "C++")
-
-
-def CheckLib(context, library = None, symbol = "main",
- header = None, language = None, autoadd = 1):
- """
- A test for a library. See also CheckLibWithHeader.
- Note that library may also be None to test whether the given symbol
- compiles without flags.
- """
-
- if library == []:
- library = [None]
-
- if not SCons.Util.is_List(library):
- library = [library]
-
- # ToDo: accept path for the library
- res = SCons.Conftest.CheckLib(context, library, symbol, header = header,
- language = language, autoadd = autoadd)
- context.did_show_result = 1
- return not res
-
-# XXX
-# Bram: Can only include one header and can't use #ifdef HAVE_HEADER_H.
-
-def CheckLibWithHeader(context, libs, header, language,
- call = None, autoadd = 1):
- # ToDo: accept path for library. Support system header files.
- """
- Another (more sophisticated) test for a library.
- Checks, if library and header is available for language (may be 'C'
- or 'CXX'). Call maybe be a valid expression _with_ a trailing ';'.
- As in CheckLib, we support library=None, to test if the call compiles
- without extra link flags.
- """
- prog_prefix, dummy = \
- createIncludesFromHeaders(header, 0)
- if libs == []:
- libs = [None]
-
- if not SCons.Util.is_List(libs):
- libs = [libs]
-
- res = SCons.Conftest.CheckLib(context, libs, None, prog_prefix,
- call = call, language = language, autoadd = autoadd)
- context.did_show_result = 1
- return not res
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/SConsign.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/SConsign.py
deleted file mode 100644
index e31a3eb..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/SConsign.py
+++ /dev/null
@@ -1,413 +0,0 @@
-"""SCons.SConsign
-
-Writing and reading information to the .sconsign file or files.
-
-"""
-
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-
-__revision__ = "src/engine/SCons/SConsign.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-import SCons.compat
-
-import os
-# compat layer imports "cPickle" for us if it's available.
-import pickle
-
-import SCons.dblite
-import SCons.Warnings
-
-def corrupt_dblite_warning(filename):
- SCons.Warnings.warn(SCons.Warnings.CorruptSConsignWarning,
- "Ignoring corrupt .sconsign file: %s"%filename)
-
-SCons.dblite.ignore_corrupt_dbfiles = 1
-SCons.dblite.corruption_warning = corrupt_dblite_warning
-
-#XXX Get rid of the global array so this becomes re-entrant.
-sig_files = []
-
-# Info for the database SConsign implementation (now the default):
-# "DataBase" is a dictionary that maps top-level SConstruct directories
-# to open database handles.
-# "DB_Module" is the Python database module to create the handles.
-# "DB_Name" is the base name of the database file (minus any
-# extension the underlying DB module will add).
-DataBase = {}
-DB_Module = SCons.dblite
-DB_Name = ".sconsign"
-DB_sync_list = []
-
-def Get_DataBase(dir):
- global DataBase, DB_Module, DB_Name
- top = dir.fs.Top
- if not os.path.isabs(DB_Name) and top.repositories:
- mode = "c"
- for d in [top] + top.repositories:
- if dir.is_under(d):
- try:
- return DataBase[d], mode
- except KeyError:
- path = d.entry_abspath(DB_Name)
- try: db = DataBase[d] = DB_Module.open(path, mode)
- except (IOError, OSError): pass
- else:
- if mode != "r":
- DB_sync_list.append(db)
- return db, mode
- mode = "r"
- try:
- return DataBase[top], "c"
- except KeyError:
- db = DataBase[top] = DB_Module.open(DB_Name, "c")
- DB_sync_list.append(db)
- return db, "c"
- except TypeError:
- print "DataBase =", DataBase
- raise
-
-def Reset():
- """Reset global state. Used by unit tests that end up using
- SConsign multiple times to get a clean slate for each test."""
- global sig_files, DB_sync_list
- sig_files = []
- DB_sync_list = []
-
-normcase = os.path.normcase
-
-def write():
- global sig_files
- for sig_file in sig_files:
- sig_file.write(sync=0)
- for db in DB_sync_list:
- try:
- syncmethod = db.sync
- except AttributeError:
- pass # Not all dbm modules have sync() methods.
- else:
- syncmethod()
- try:
- closemethod = db.close
- except AttributeError:
- pass # Not all dbm modules have close() methods.
- else:
- closemethod()
-
-class SConsignEntry(object):
- """
- Wrapper class for the generic entry in a .sconsign file.
- The Node subclass populates it with attributes as it pleases.
-
- XXX As coded below, we do expect a '.binfo' attribute to be added,
- but we'll probably generalize this in the next refactorings.
- """
- __slots__ = ("binfo", "ninfo", "__weakref__")
- current_version_id = 2
-
- def __init__(self):
- # Create an object attribute from the class attribute so it ends up
- # in the pickled data in the .sconsign file.
- #_version_id = self.current_version_id
- pass
-
- def convert_to_sconsign(self):
- self.binfo.convert_to_sconsign()
-
- def convert_from_sconsign(self, dir, name):
- self.binfo.convert_from_sconsign(dir, name)
-
- def __getstate__(self):
- state = getattr(self, '__dict__', {}).copy()
- for obj in type(self).mro():
- for name in getattr(obj,'__slots__',()):
- if hasattr(self, name):
- state[name] = getattr(self, name)
-
- state['_version_id'] = self.current_version_id
- try:
- del state['__weakref__']
- except KeyError:
- pass
- return state
-
- def __setstate__(self, state):
- for key, value in state.items():
- if key not in ('_version_id','__weakref__'):
- setattr(self, key, value)
-
-class Base(object):
- """
- This is the controlling class for the signatures for the collection of
- entries associated with a specific directory. The actual directory
- association will be maintained by a subclass that is specific to
- the underlying storage method. This class provides a common set of
- methods for fetching and storing the individual bits of information
- that make up signature entry.
- """
- def __init__(self):
- self.entries = {}
- self.dirty = False
- self.to_be_merged = {}
-
- def get_entry(self, filename):
- """
- Fetch the specified entry attribute.
- """
- return self.entries[filename]
-
- def set_entry(self, filename, obj):
- """
- Set the entry.
- """
- self.entries[filename] = obj
- self.dirty = True
-
- def do_not_set_entry(self, filename, obj):
- pass
-
- def store_info(self, filename, node):
- entry = node.get_stored_info()
- entry.binfo.merge(node.get_binfo())
- self.to_be_merged[filename] = node
- self.dirty = True
-
- def do_not_store_info(self, filename, node):
- pass
-
- def merge(self):
- for key, node in self.to_be_merged.items():
- entry = node.get_stored_info()
- try:
- ninfo = entry.ninfo
- except AttributeError:
- # This happens with SConf Nodes, because the configuration
- # subsystem takes direct control over how the build decision
- # is made and its information stored.
- pass
- else:
- ninfo.merge(node.get_ninfo())
- self.entries[key] = entry
- self.to_be_merged = {}
-
-class DB(Base):
- """
- A Base subclass that reads and writes signature information
- from a global .sconsign.db* file--the actual file suffix is
- determined by the database module.
- """
- def __init__(self, dir):
- Base.__init__(self)
-
- self.dir = dir
-
- db, mode = Get_DataBase(dir)
-
- # Read using the path relative to the top of the Repository
- # (self.dir.tpath) from which we're fetching the signature
- # information.
- path = normcase(dir.get_tpath())
- try:
- rawentries = db[path]
- except KeyError:
- pass
- else:
- try:
- self.entries = pickle.loads(rawentries)
- if not isinstance(self.entries, dict):
- self.entries = {}
- raise TypeError
- except KeyboardInterrupt:
- raise
- except Exception, e:
- SCons.Warnings.warn(SCons.Warnings.CorruptSConsignWarning,
- "Ignoring corrupt sconsign entry : %s (%s)\n"%(self.dir.get_tpath(), e))
- for key, entry in self.entries.items():
- entry.convert_from_sconsign(dir, key)
-
- if mode == "r":
- # This directory is actually under a repository, which means
- # likely they're reaching in directly for a dependency on
- # a file there. Don't actually set any entry info, so we
- # won't try to write to that .sconsign.dblite file.
- self.set_entry = self.do_not_set_entry
- self.store_info = self.do_not_store_info
-
- global sig_files
- sig_files.append(self)
-
- def write(self, sync=1):
- if not self.dirty:
- return
-
- self.merge()
-
- db, mode = Get_DataBase(self.dir)
-
- # Write using the path relative to the top of the SConstruct
- # directory (self.dir.path), not relative to the top of
- # the Repository; we only write to our own .sconsign file,
- # not to .sconsign files in Repositories.
- path = normcase(self.dir.get_internal_path())
- for key, entry in self.entries.items():
- entry.convert_to_sconsign()
- db[path] = pickle.dumps(self.entries, 1)
-
- if sync:
- try:
- syncmethod = db.sync
- except AttributeError:
- # Not all anydbm modules have sync() methods.
- pass
- else:
- syncmethod()
-
-class Dir(Base):
- def __init__(self, fp=None, dir=None):
- """
- fp - file pointer to read entries from
- """
- Base.__init__(self)
-
- if not fp:
- return
-
- self.entries = pickle.load(fp)
- if not isinstance(self.entries, dict):
- self.entries = {}
- raise TypeError
-
- if dir:
- for key, entry in self.entries.items():
- entry.convert_from_sconsign(dir, key)
-
-class DirFile(Dir):
- """
- Encapsulates reading and writing a per-directory .sconsign file.
- """
- def __init__(self, dir):
- """
- dir - the directory for the file
- """
-
- self.dir = dir
- self.sconsign = os.path.join(dir.get_internal_path(), '.sconsign')
-
- try:
- fp = open(self.sconsign, 'rb')
- except IOError:
- fp = None
-
- try:
- Dir.__init__(self, fp, dir)
- except KeyboardInterrupt:
- raise
- except:
- SCons.Warnings.warn(SCons.Warnings.CorruptSConsignWarning,
- "Ignoring corrupt .sconsign file: %s"%self.sconsign)
-
- global sig_files
- sig_files.append(self)
-
- def write(self, sync=1):
- """
- Write the .sconsign file to disk.
-
- Try to write to a temporary file first, and rename it if we
- succeed. If we can't write to the temporary file, it's
- probably because the directory isn't writable (and if so,
- how did we build anything in this directory, anyway?), so
- try to write directly to the .sconsign file as a backup.
- If we can't rename, try to copy the temporary contents back
- to the .sconsign file. Either way, always try to remove
- the temporary file at the end.
- """
- if not self.dirty:
- return
-
- self.merge()
-
- temp = os.path.join(self.dir.get_internal_path(), '.scons%d' % os.getpid())
- try:
- file = open(temp, 'wb')
- fname = temp
- except IOError:
- try:
- file = open(self.sconsign, 'wb')
- fname = self.sconsign
- except IOError:
- return
- for key, entry in self.entries.items():
- entry.convert_to_sconsign()
- pickle.dump(self.entries, file, 1)
- file.close()
- if fname != self.sconsign:
- try:
- mode = os.stat(self.sconsign)[0]
- os.chmod(self.sconsign, 0666)
- os.unlink(self.sconsign)
- except (IOError, OSError):
- # Try to carry on in the face of either OSError
- # (things like permission issues) or IOError (disk
- # or network issues). If there's a really dangerous
- # issue, it should get re-raised by the calls below.
- pass
- try:
- os.rename(fname, self.sconsign)
- except OSError:
- # An OSError failure to rename may indicate something
- # like the directory has no write permission, but
- # the .sconsign file itself might still be writable,
- # so try writing on top of it directly. An IOError
- # here, or in any of the following calls, would get
- # raised, indicating something like a potentially
- # serious disk or network issue.
- open(self.sconsign, 'wb').write(open(fname, 'rb').read())
- os.chmod(self.sconsign, mode)
- try:
- os.unlink(temp)
- except (IOError, OSError):
- pass
-
-ForDirectory = DB
-
-def File(name, dbm_module=None):
- """
- Arrange for all signatures to be stored in a global .sconsign.db*
- file.
- """
- global ForDirectory, DB_Name, DB_Module
- if name is None:
- ForDirectory = DirFile
- DB_Module = None
- else:
- ForDirectory = DB
- DB_Name = name
- if not dbm_module is None:
- DB_Module = dbm_module
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Scanner/C.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Scanner/C.py
deleted file mode 100644
index 33e1145..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Scanner/C.py
+++ /dev/null
@@ -1,132 +0,0 @@
-"""SCons.Scanner.C
-
-This module implements the depenency scanner for C/C++ code.
-
-"""
-
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-
-__revision__ = "src/engine/SCons/Scanner/C.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-import SCons.Node.FS
-import SCons.Scanner
-import SCons.Util
-
-import SCons.cpp
-
-class SConsCPPScanner(SCons.cpp.PreProcessor):
- """
- SCons-specific subclass of the cpp.py module's processing.
-
- We subclass this so that: 1) we can deal with files represented
- by Nodes, not strings; 2) we can keep track of the files that are
- missing.
- """
- def __init__(self, *args, **kw):
- SCons.cpp.PreProcessor.__init__(self, *args, **kw)
- self.missing = []
- def initialize_result(self, fname):
- self.result = SCons.Util.UniqueList([fname])
- def finalize_result(self, fname):
- return self.result[1:]
- def find_include_file(self, t):
- keyword, quote, fname = t
- result = SCons.Node.FS.find_file(fname, self.searchpath[quote])
- if not result:
- self.missing.append((fname, self.current_file))
- return result
- def read_file(self, file):
- try:
- fp = open(str(file.rfile()))
- except EnvironmentError, e:
- self.missing.append((file, self.current_file))
- return ''
- else:
- return fp.read()
-
-def dictify_CPPDEFINES(env):
- cppdefines = env.get('CPPDEFINES', {})
- if cppdefines is None:
- return {}
- if SCons.Util.is_Sequence(cppdefines):
- result = {}
- for c in cppdefines:
- if SCons.Util.is_Sequence(c):
- result[c[0]] = c[1]
- else:
- result[c] = None
- return result
- if not SCons.Util.is_Dict(cppdefines):
- return {cppdefines : None}
- return cppdefines
-
-class SConsCPPScannerWrapper(object):
- """
- The SCons wrapper around a cpp.py scanner.
-
- This is the actual glue between the calling conventions of generic
- SCons scanners, and the (subclass of) cpp.py class that knows how
- to look for #include lines with reasonably real C-preprocessor-like
- evaluation of #if/#ifdef/#else/#elif lines.
- """
- def __init__(self, name, variable):
- self.name = name
- self.path = SCons.Scanner.FindPathDirs(variable)
- def __call__(self, node, env, path = ()):
- cpp = SConsCPPScanner(current = node.get_dir(),
- cpppath = path,
- dict = dictify_CPPDEFINES(env))
- result = cpp(node)
- for included, includer in cpp.missing:
- fmt = "No dependency generated for file: %s (included from: %s) -- file not found"
- SCons.Warnings.warn(SCons.Warnings.DependencyWarning,
- fmt % (included, includer))
- return result
-
- def recurse_nodes(self, nodes):
- return nodes
- def select(self, node):
- return self
-
-def CScanner():
- """Return a prototype Scanner instance for scanning source files
- that use the C pre-processor"""
-
- # Here's how we would (or might) use the CPP scanner code above that
- # knows how to evaluate #if/#ifdef/#else/#elif lines when searching
- # for #includes. This is commented out for now until we add the
- # right configurability to let users pick between the scanners.
- #return SConsCPPScannerWrapper("CScanner", "CPPPATH")
-
- cs = SCons.Scanner.ClassicCPP("CScanner",
- "$CPPSUFFIXES",
- "CPPPATH",
- '^[ \t]*#[ \t]*(?:include|import)[ \t]*(<|")([^>"]+)(>|")')
- return cs
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Scanner/D.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Scanner/D.py
deleted file mode 100644
index 2c51a09..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Scanner/D.py
+++ /dev/null
@@ -1,73 +0,0 @@
-"""SCons.Scanner.D
-
-Scanner for the Digital Mars "D" programming language.
-
-Coded by Andy Friesen
-17 Nov 2003
-
-"""
-
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-
-__revision__ = "src/engine/SCons/Scanner/D.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-import re
-
-import SCons.Scanner
-
-def DScanner():
- """Return a prototype Scanner instance for scanning D source files"""
- ds = D()
- return ds
-
-class D(SCons.Scanner.Classic):
- def __init__ (self):
- SCons.Scanner.Classic.__init__ (self,
- name = "DScanner",
- suffixes = '$DSUFFIXES',
- path_variable = 'DPATH',
- regex = 'import\s+(?:[a-zA-Z0-9_.]+)\s*(?:,\s*(?:[a-zA-Z0-9_.]+)\s*)*;')
-
- self.cre2 = re.compile ('(?:import\s)?\s*([a-zA-Z0-9_.]+)\s*(?:,|;)', re.M)
-
- def find_include(self, include, source_dir, path):
- # translate dots (package separators) to slashes
- inc = include.replace('.', '/')
-
- i = SCons.Node.FS.find_file(inc + '.d', (source_dir,) + path)
- if i is None:
- i = SCons.Node.FS.find_file (inc + '.di', (source_dir,) + path)
- return i, include
-
- def find_include_names(self, node):
- includes = []
- for i in self.cre.findall(node.get_text_contents()):
- includes = includes + self.cre2.findall(i)
- return includes
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Scanner/Dir.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Scanner/Dir.py
deleted file mode 100644
index 7565423..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Scanner/Dir.py
+++ /dev/null
@@ -1,109 +0,0 @@
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-__revision__ = "src/engine/SCons/Scanner/Dir.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-import SCons.Node.FS
-import SCons.Scanner
-
-def only_dirs(nodes):
- is_Dir = lambda n: isinstance(n.disambiguate(), SCons.Node.FS.Dir)
- return list(filter(is_Dir, nodes))
-
-def DirScanner(**kw):
- """Return a prototype Scanner instance for scanning
- directories for on-disk files"""
- kw['node_factory'] = SCons.Node.FS.Entry
- kw['recursive'] = only_dirs
- return SCons.Scanner.Base(scan_on_disk, "DirScanner", **kw)
-
-def DirEntryScanner(**kw):
- """Return a prototype Scanner instance for "scanning"
- directory Nodes for their in-memory entries"""
- kw['node_factory'] = SCons.Node.FS.Entry
- kw['recursive'] = None
- return SCons.Scanner.Base(scan_in_memory, "DirEntryScanner", **kw)
-
-skip_entry = {}
-
-skip_entry_list = [
- '.',
- '..',
- '.sconsign',
- # Used by the native dblite.py module.
- '.sconsign.dblite',
- # Used by dbm and dumbdbm.
- '.sconsign.dir',
- # Used by dbm.
- '.sconsign.pag',
- # Used by dumbdbm.
- '.sconsign.dat',
- '.sconsign.bak',
- # Used by some dbm emulations using Berkeley DB.
- '.sconsign.db',
-]
-
-for skip in skip_entry_list:
- skip_entry[skip] = 1
- skip_entry[SCons.Node.FS._my_normcase(skip)] = 1
-
-do_not_scan = lambda k: k not in skip_entry
-
-def scan_on_disk(node, env, path=()):
- """
- Scans a directory for on-disk files and directories therein.
-
- Looking up the entries will add these to the in-memory Node tree
- representation of the file system, so all we have to do is just
- that and then call the in-memory scanning function.
- """
- try:
- flist = node.fs.listdir(node.get_abspath())
- except (IOError, OSError):
- return []
- e = node.Entry
- for f in filter(do_not_scan, flist):
- # Add ./ to the beginning of the file name so if it begins with a
- # '#' we don't look it up relative to the top-level directory.
- e('./' + f)
- return scan_in_memory(node, env, path)
-
-def scan_in_memory(node, env, path=()):
- """
- "Scans" a Node.FS.Dir for its in-memory entries.
- """
- try:
- entries = node.entries
- except AttributeError:
- # It's not a Node.FS.Dir (or doesn't look enough like one for
- # our purposes), which can happen if a target list containing
- # mixed Node types (Dirs and Files, for example) has a Dir as
- # the first entry.
- return []
- entry_list = sorted(filter(do_not_scan, list(entries.keys())))
- return [entries[n] for n in entry_list]
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Scanner/Fortran.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Scanner/Fortran.py
deleted file mode 100644
index a1f3927..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Scanner/Fortran.py
+++ /dev/null
@@ -1,316 +0,0 @@
-"""SCons.Scanner.Fortran
-
-This module implements the dependency scanner for Fortran code.
-
-"""
-
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-__revision__ = "src/engine/SCons/Scanner/Fortran.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-import re
-
-import SCons.Node
-import SCons.Node.FS
-import SCons.Scanner
-import SCons.Util
-import SCons.Warnings
-
-class F90Scanner(SCons.Scanner.Classic):
- """
- A Classic Scanner subclass for Fortran source files which takes
- into account both USE and INCLUDE statements. This scanner will
- work for both F77 and F90 (and beyond) compilers.
-
- Currently, this scanner assumes that the include files do not contain
- USE statements. To enable the ability to deal with USE statements
- in include files, add logic right after the module names are found
- to loop over each include file, search for and locate each USE
- statement, and append each module name to the list of dependencies.
- Caching the search results in a common dictionary somewhere so that
- the same include file is not searched multiple times would be a
- smart thing to do.
- """
-
- def __init__(self, name, suffixes, path_variable,
- use_regex, incl_regex, def_regex, *args, **kw):
-
- self.cre_use = re.compile(use_regex, re.M)
- self.cre_incl = re.compile(incl_regex, re.M)
- self.cre_def = re.compile(def_regex, re.M)
-
- def _scan(node, env, path, self=self):
- node = node.rfile()
-
- if not node.exists():
- return []
-
- return self.scan(node, env, path)
-
- kw['function'] = _scan
- kw['path_function'] = SCons.Scanner.FindPathDirs(path_variable)
- kw['recursive'] = 1
- kw['skeys'] = suffixes
- kw['name'] = name
-
- SCons.Scanner.Current.__init__(self, *args, **kw)
-
- def scan(self, node, env, path=()):
-
- # cache the includes list in node so we only scan it once:
- if node.includes != None:
- mods_and_includes = node.includes
- else:
- # retrieve all included filenames
- includes = self.cre_incl.findall(node.get_text_contents())
- # retrieve all USE'd module names
- modules = self.cre_use.findall(node.get_text_contents())
- # retrieve all defined module names
- defmodules = self.cre_def.findall(node.get_text_contents())
-
- # Remove all USE'd module names that are defined in the same file
- # (case-insensitively)
- d = {}
- for m in defmodules:
- d[m.lower()] = 1
- modules = [m for m in modules if m.lower() not in d]
-
- # Convert module name to a .mod filename
- suffix = env.subst('$FORTRANMODSUFFIX')
- modules = [x.lower() + suffix for x in modules]
- # Remove unique items from the list
- mods_and_includes = SCons.Util.unique(includes+modules)
- node.includes = mods_and_includes
-
- # This is a hand-coded DSU (decorate-sort-undecorate, or
- # Schwartzian transform) pattern. The sort key is the raw name
- # of the file as specifed on the USE or INCLUDE line, which lets
- # us keep the sort order constant regardless of whether the file
- # is actually found in a Repository or locally.
- nodes = []
- source_dir = node.get_dir()
- if callable(path):
- path = path()
- for dep in mods_and_includes:
- n, i = self.find_include(dep, source_dir, path)
-
- if n is None:
- SCons.Warnings.warn(SCons.Warnings.DependencyWarning,
- "No dependency generated for file: %s (referenced by: %s) -- file not found" % (i, node))
- else:
- sortkey = self.sort_key(dep)
- nodes.append((sortkey, n))
-
- return [pair[1] for pair in sorted(nodes)]
-
-def FortranScan(path_variable="FORTRANPATH"):
- """Return a prototype Scanner instance for scanning source files
- for Fortran USE & INCLUDE statements"""
-
-# The USE statement regex matches the following:
-#
-# USE module_name
-# USE :: module_name
-# USE, INTRINSIC :: module_name
-# USE, NON_INTRINSIC :: module_name
-#
-# Limitations
-#
-# -- While the regex can handle multiple USE statements on one line,
-# it cannot properly handle them if they are commented out.
-# In either of the following cases:
-#
-# ! USE mod_a ; USE mod_b [entire line is commented out]
-# USE mod_a ! ; USE mod_b [in-line comment of second USE statement]
-#
-# the second module name (mod_b) will be picked up as a dependency
-# even though it should be ignored. The only way I can see
-# to rectify this would be to modify the scanner to eliminate
-# the call to re.findall, read in the contents of the file,
-# treating the comment character as an end-of-line character
-# in addition to the normal linefeed, loop over each line,
-# weeding out the comments, and looking for the USE statements.
-# One advantage to this is that the regex passed to the scanner
-# would no longer need to match a semicolon.
-#
-# -- I question whether or not we need to detect dependencies to
-# INTRINSIC modules because these are built-in to the compiler.
-# If we consider them a dependency, will SCons look for them, not
-# find them, and kill the build? Or will we there be standard
-# compiler-specific directories we will need to point to so the
-# compiler and SCons can locate the proper object and mod files?
-
-# Here is a breakdown of the regex:
-#
-# (?i) : regex is case insensitive
-# ^ : start of line
-# (?: : group a collection of regex symbols without saving the match as a "group"
-# ^|; : matches either the start of the line or a semicolon - semicolon
-# ) : end the unsaved grouping
-# \s* : any amount of white space
-# USE : match the string USE, case insensitive
-# (?: : group a collection of regex symbols without saving the match as a "group"
-# \s+| : match one or more whitespace OR .... (the next entire grouped set of regex symbols)
-# (?: : group a collection of regex symbols without saving the match as a "group"
-# (?: : establish another unsaved grouping of regex symbols
-# \s* : any amount of white space
-# , : match a comma
-# \s* : any amount of white space
-# (?:NON_)? : optionally match the prefix NON_, case insensitive
-# INTRINSIC : match the string INTRINSIC, case insensitive
-# )? : optionally match the ", INTRINSIC/NON_INTRINSIC" grouped expression
-# \s* : any amount of white space
-# :: : match a double colon that must appear after the INTRINSIC/NON_INTRINSIC attribute
-# ) : end the unsaved grouping
-# ) : end the unsaved grouping
-# \s* : match any amount of white space
-# (\w+) : match the module name that is being USE'd
-#
-#
- use_regex = "(?i)(?:^|;)\s*USE(?:\s+|(?:(?:\s*,\s*(?:NON_)?INTRINSIC)?\s*::))\s*(\w+)"
-
-
-# The INCLUDE statement regex matches the following:
-#
-# INCLUDE 'some_Text'
-# INCLUDE "some_Text"
-# INCLUDE "some_Text" ; INCLUDE "some_Text"
-# INCLUDE kind_"some_Text"
-# INCLUDE kind_'some_Text"
-#
-# where some_Text can include any alphanumeric and/or special character
-# as defined by the Fortran 2003 standard.
-#
-# Limitations:
-#
-# -- The Fortran standard dictates that a " or ' in the INCLUDE'd
-# string must be represented as a "" or '', if the quotes that wrap
-# the entire string are either a ' or ", respectively. While the
-# regular expression below can detect the ' or " characters just fine,
-# the scanning logic, presently is unable to detect them and reduce
-# them to a single instance. This probably isn't an issue since,
-# in practice, ' or " are not generally used in filenames.
-#
-# -- This regex will not properly deal with multiple INCLUDE statements
-# when the entire line has been commented out, ala
-#
-# ! INCLUDE 'some_file' ; INCLUDE 'some_file'
-#
-# In such cases, it will properly ignore the first INCLUDE file,
-# but will actually still pick up the second. Interestingly enough,
-# the regex will properly deal with these cases:
-#
-# INCLUDE 'some_file'
-# INCLUDE 'some_file' !; INCLUDE 'some_file'
-#
-# To get around the above limitation, the FORTRAN programmer could
-# simply comment each INCLUDE statement separately, like this
-#
-# ! INCLUDE 'some_file' !; INCLUDE 'some_file'
-#
-# The way I see it, the only way to get around this limitation would
-# be to modify the scanning logic to replace the calls to re.findall
-# with a custom loop that processes each line separately, throwing
-# away fully commented out lines before attempting to match against
-# the INCLUDE syntax.
-#
-# Here is a breakdown of the regex:
-#
-# (?i) : regex is case insensitive
-# (?: : begin a non-saving group that matches the following:
-# ^ : either the start of the line
-# | : or
-# ['">]\s*; : a semicolon that follows a single quote,
-# double quote or greater than symbol (with any
-# amount of whitespace in between). This will
-# allow the regex to match multiple INCLUDE
-# statements per line (although it also requires
-# the positive lookahead assertion that is
-# used below). It will even properly deal with
-# (i.e. ignore) cases in which the additional
-# INCLUDES are part of an in-line comment, ala
-# " INCLUDE 'someFile' ! ; INCLUDE 'someFile2' "
-# ) : end of non-saving group
-# \s* : any amount of white space
-# INCLUDE : match the string INCLUDE, case insensitive
-# \s+ : match one or more white space characters
-# (?\w+_)? : match the optional "kind-param _" prefix allowed by the standard
-# [<"'] : match the include delimiter - an apostrophe, double quote, or less than symbol
-# (.+?) : match one or more characters that make up
-# the included path and file name and save it
-# in a group. The Fortran standard allows for
-# any non-control character to be used. The dot
-# operator will pick up any character, including
-# control codes, but I can't conceive of anyone
-# putting control codes in their file names.
-# The question mark indicates it is non-greedy so
-# that regex will match only up to the next quote,
-# double quote, or greater than symbol
-# (?=["'>]) : positive lookahead assertion to match the include
-# delimiter - an apostrophe, double quote, or
-# greater than symbol. This level of complexity
-# is required so that the include delimiter is
-# not consumed by the match, thus allowing the
-# sub-regex discussed above to uniquely match a
-# set of semicolon-separated INCLUDE statements
-# (as allowed by the F2003 standard)
-
- include_regex = """(?i)(?:^|['">]\s*;)\s*INCLUDE\s+(?:\w+_)?[<"'](.+?)(?=["'>])"""
-
-# The MODULE statement regex finds module definitions by matching
-# the following:
-#
-# MODULE module_name
-#
-# but *not* the following:
-#
-# MODULE PROCEDURE procedure_name
-#
-# Here is a breakdown of the regex:
-#
-# (?i) : regex is case insensitive
-# ^\s* : any amount of white space
-# MODULE : match the string MODULE, case insensitive
-# \s+ : match one or more white space characters
-# (?!PROCEDURE) : but *don't* match if the next word matches
-# PROCEDURE (negative lookahead assertion),
-# case insensitive
-# (\w+) : match one or more alphanumeric characters
-# that make up the defined module name and
-# save it in a group
-
- def_regex = """(?i)^\s*MODULE\s+(?!PROCEDURE)(\w+)"""
-
- scanner = F90Scanner("FortranScan",
- "$FORTRANSUFFIXES",
- path_variable,
- use_regex,
- include_regex,
- def_regex)
- return scanner
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Scanner/IDL.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Scanner/IDL.py
deleted file mode 100644
index 6758bd2..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Scanner/IDL.py
+++ /dev/null
@@ -1,48 +0,0 @@
-"""SCons.Scanner.IDL
-
-This module implements the depenency scanner for IDL (Interface
-Definition Language) files.
-
-"""
-
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-
-__revision__ = "src/engine/SCons/Scanner/IDL.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-import SCons.Node.FS
-import SCons.Scanner
-
-def IDLScan():
- """Return a prototype Scanner instance for scanning IDL source files"""
- cs = SCons.Scanner.ClassicCPP("IDLScan",
- "$IDLSUFFIXES",
- "CPPPATH",
- '^[ \t]*(?:#[ \t]*include|[ \t]*import)[ \t]+(<|")([^>"]+)(>|")')
- return cs
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Scanner/LaTeX.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Scanner/LaTeX.py
deleted file mode 100644
index aed074c..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Scanner/LaTeX.py
+++ /dev/null
@@ -1,390 +0,0 @@
-"""SCons.Scanner.LaTeX
-
-This module implements the dependency scanner for LaTeX code.
-
-"""
-
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-
-__revision__ = "src/engine/SCons/Scanner/LaTeX.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-import os.path
-import re
-
-import SCons.Scanner
-import SCons.Util
-
-# list of graphics file extensions for TeX and LaTeX
-TexGraphics = ['.eps', '.ps']
-LatexGraphics = ['.pdf', '.png', '.jpg', '.gif', '.tif']
-
-# Used as a return value of modify_env_var if the variable is not set.
-class _Null(object):
- pass
-_null = _Null
-
-# The user specifies the paths in env[variable], similar to other builders.
-# They may be relative and must be converted to absolute, as expected
-# by LaTeX and Co. The environment may already have some paths in
-# env['ENV'][var]. These paths are honored, but the env[var] paths have
-# higher precedence. All changes are un-done on exit.
-def modify_env_var(env, var, abspath):
- try:
- save = env['ENV'][var]
- except KeyError:
- save = _null
- env.PrependENVPath(var, abspath)
- try:
- if SCons.Util.is_List(env[var]):
- env.PrependENVPath(var, [os.path.abspath(str(p)) for p in env[var]])
- else:
- # Split at os.pathsep to convert into absolute path
- env.PrependENVPath(var, [os.path.abspath(p) for p in str(env[var]).split(os.pathsep)])
- except KeyError:
- pass
-
- # Convert into a string explicitly to append ":" (without which it won't search system
- # paths as well). The problem is that env.AppendENVPath(var, ":")
- # does not work, refuses to append ":" (os.pathsep).
-
- if SCons.Util.is_List(env['ENV'][var]):
- env['ENV'][var] = os.pathsep.join(env['ENV'][var])
- # Append the trailing os.pathsep character here to catch the case with no env[var]
- env['ENV'][var] = env['ENV'][var] + os.pathsep
-
- return save
-
-class FindENVPathDirs(object):
- """A class to bind a specific *PATH variable name to a function that
- will return all of the *path directories."""
- def __init__(self, variable):
- self.variable = variable
- def __call__(self, env, dir=None, target=None, source=None, argument=None):
- import SCons.PathList
- try:
- path = env['ENV'][self.variable]
- except KeyError:
- return ()
-
- dir = dir or env.fs._cwd
- path = SCons.PathList.PathList(path).subst_path(env, target, source)
- return tuple(dir.Rfindalldirs(path))
-
-
-
-def LaTeXScanner():
- """Return a prototype Scanner instance for scanning LaTeX source files
- when built with latex.
- """
- ds = LaTeX(name = "LaTeXScanner",
- suffixes = '$LATEXSUFFIXES',
- # in the search order, see below in LaTeX class docstring
- graphics_extensions = TexGraphics,
- recursive = 0)
- return ds
-
-def PDFLaTeXScanner():
- """Return a prototype Scanner instance for scanning LaTeX source files
- when built with pdflatex.
- """
- ds = LaTeX(name = "PDFLaTeXScanner",
- suffixes = '$LATEXSUFFIXES',
- # in the search order, see below in LaTeX class docstring
- graphics_extensions = LatexGraphics,
- recursive = 0)
- return ds
-
-class LaTeX(SCons.Scanner.Base):
- """Class for scanning LaTeX files for included files.
-
- Unlike most scanners, which use regular expressions that just
- return the included file name, this returns a tuple consisting
- of the keyword for the inclusion ("include", "includegraphics",
- "input", or "bibliography"), and then the file name itself.
- Based on a quick look at LaTeX documentation, it seems that we
- should append .tex suffix for the "include" keywords, append .tex if
- there is no extension for the "input" keyword, and need to add .bib
- for the "bibliography" keyword that does not accept extensions by itself.
-
- Finally, if there is no extension for an "includegraphics" keyword
- latex will append .ps or .eps to find the file, while pdftex may use .pdf,
- .jpg, .tif, .mps, or .png.
-
- The actual subset and search order may be altered by
- DeclareGraphicsExtensions command. This complication is ignored.
- The default order corresponds to experimentation with teTeX
- $ latex --version
- pdfeTeX 3.141592-1.21a-2.2 (Web2C 7.5.4)
- kpathsea version 3.5.4
- The order is:
- ['.eps', '.ps'] for latex
- ['.png', '.pdf', '.jpg', '.tif'].
-
- Another difference is that the search path is determined by the type
- of the file being searched:
- env['TEXINPUTS'] for "input" and "include" keywords
- env['TEXINPUTS'] for "includegraphics" keyword
- env['TEXINPUTS'] for "lstinputlisting" keyword
- env['BIBINPUTS'] for "bibliography" keyword
- env['BSTINPUTS'] for "bibliographystyle" keyword
- env['INDEXSTYLE'] for "makeindex" keyword, no scanning support needed
- just allows user to set it if needed.
-
- FIXME: also look for the class or style in document[class|style]{}
- FIXME: also look for the argument of bibliographystyle{}
- """
- keyword_paths = {'include': 'TEXINPUTS',
- 'input': 'TEXINPUTS',
- 'includegraphics': 'TEXINPUTS',
- 'bibliography': 'BIBINPUTS',
- 'bibliographystyle': 'BSTINPUTS',
- 'addbibresource': 'BIBINPUTS',
- 'addglobalbib': 'BIBINPUTS',
- 'addsectionbib': 'BIBINPUTS',
- 'makeindex': 'INDEXSTYLE',
- 'usepackage': 'TEXINPUTS',
- 'lstinputlisting': 'TEXINPUTS'}
- env_variables = SCons.Util.unique(list(keyword_paths.values()))
-
- def __init__(self, name, suffixes, graphics_extensions, *args, **kw):
-
- # We have to include \n with the % we exclude from the first part
- # part of the regex because the expression is compiled with re.M.
- # Without the \n, the ^ could match the beginning of a *previous*
- # line followed by one or more newline characters (i.e. blank
- # lines), interfering with a match on the next line.
- # add option for whitespace before the '[options]' or the '{filename}'
- regex = r'^[^%\n]*\\(include|includegraphics(?:\s*\[[^\]]+\])?|lstinputlisting(?:\[[^\]]+\])?|input|bibliography|addbibresource|addglobalbib|addsectionbib|usepackage)\s*{([^}]*)}'
- self.cre = re.compile(regex, re.M)
- self.comment_re = re.compile(r'^((?:(?:\\%)|[^%\n])*)(.*)$', re.M)
-
- self.graphics_extensions = graphics_extensions
-
- def _scan(node, env, path=(), self=self):
- node = node.rfile()
- if not node.exists():
- return []
- return self.scan_recurse(node, path)
-
- class FindMultiPathDirs(object):
- """The stock FindPathDirs function has the wrong granularity:
- it is called once per target, while we need the path that depends
- on what kind of included files is being searched. This wrapper
- hides multiple instances of FindPathDirs, one per the LaTeX path
- variable in the environment. When invoked, the function calculates
- and returns all the required paths as a dictionary (converted into
- a tuple to become hashable). Then the scan function converts it
- back and uses a dictionary of tuples rather than a single tuple
- of paths.
- """
- def __init__(self, dictionary):
- self.dictionary = {}
- for k,n in dictionary.items():
- self.dictionary[k] = ( SCons.Scanner.FindPathDirs(n),
- FindENVPathDirs(n) )
-
- def __call__(self, env, dir=None, target=None, source=None,
- argument=None):
- di = {}
- for k,(c,cENV) in self.dictionary.items():
- di[k] = ( c(env, dir=None, target=None, source=None,
- argument=None) ,
- cENV(env, dir=None, target=None, source=None,
- argument=None) )
- # To prevent "dict is not hashable error"
- return tuple(di.items())
-
- class LaTeXScanCheck(object):
- """Skip all but LaTeX source files, i.e., do not scan *.eps,
- *.pdf, *.jpg, etc.
- """
- def __init__(self, suffixes):
- self.suffixes = suffixes
- def __call__(self, node, env):
- current = not node.has_builder() or node.is_up_to_date()
- scannable = node.get_suffix() in env.subst_list(self.suffixes)[0]
- # Returning false means that the file is not scanned.
- return scannable and current
-
- kw['function'] = _scan
- kw['path_function'] = FindMultiPathDirs(LaTeX.keyword_paths)
- kw['recursive'] = 0
- kw['skeys'] = suffixes
- kw['scan_check'] = LaTeXScanCheck(suffixes)
- kw['name'] = name
-
- SCons.Scanner.Base.__init__(self, *args, **kw)
-
- def _latex_names(self, include):
- filename = include[1]
- if include[0] == 'input':
- base, ext = os.path.splitext( filename )
- if ext == "":
- return [filename + '.tex']
- if (include[0] == 'include'):
- return [filename + '.tex']
- if include[0] == 'bibliography':
- base, ext = os.path.splitext( filename )
- if ext == "":
- return [filename + '.bib']
- if include[0] == 'usepackage':
- base, ext = os.path.splitext( filename )
- if ext == "":
- return [filename + '.sty']
- if include[0] == 'includegraphics':
- base, ext = os.path.splitext( filename )
- if ext == "":
- #return [filename+e for e in self.graphics_extensions + TexGraphics]
- # use the line above to find dependencies for the PDF builder
- # when only an .eps figure is present. Since it will be found
- # if the user tells scons how to make the pdf figure, leave
- # it out for now.
- return [filename+e for e in self.graphics_extensions]
- return [filename]
-
- def sort_key(self, include):
- return SCons.Node.FS._my_normcase(str(include))
-
- def find_include(self, include, source_dir, path):
- try:
- sub_path = path[include[0]]
- except (IndexError, KeyError):
- sub_path = ()
- try_names = self._latex_names(include)
- for n in try_names:
- # see if we find it using the path in env[var]
- i = SCons.Node.FS.find_file(n, (source_dir,) + sub_path[0])
- if i:
- return i, include
- # see if we find it using the path in env['ENV'][var]
- i = SCons.Node.FS.find_file(n, (source_dir,) + sub_path[1])
- if i:
- return i, include
- return i, include
-
- def canonical_text(self, text):
- """Standardize an input TeX-file contents.
-
- Currently:
- * removes comments, unwrapping comment-wrapped lines.
- """
- out = []
- line_continues_a_comment = False
- for line in text.splitlines():
- line,comment = self.comment_re.findall(line)[0]
- if line_continues_a_comment == True:
- out[-1] = out[-1] + line.lstrip()
- else:
- out.append(line)
- line_continues_a_comment = len(comment) > 0
- return '\n'.join(out).rstrip()+'\n'
-
- def scan(self, node):
- # Modify the default scan function to allow for the regular
- # expression to return a comma separated list of file names
- # as can be the case with the bibliography keyword.
-
- # Cache the includes list in node so we only scan it once:
- # path_dict = dict(list(path))
- # add option for whitespace (\s) before the '['
- noopt_cre = re.compile('\s*\[.*$')
- if node.includes != None:
- includes = node.includes
- else:
- text = self.canonical_text(node.get_text_contents())
- includes = self.cre.findall(text)
- # 1. Split comma-separated lines, e.g.
- # ('bibliography', 'phys,comp')
- # should become two entries
- # ('bibliography', 'phys')
- # ('bibliography', 'comp')
- # 2. Remove the options, e.g., such as
- # ('includegraphics[clip,width=0.7\\linewidth]', 'picture.eps')
- # should become
- # ('includegraphics', 'picture.eps')
- split_includes = []
- for include in includes:
- inc_type = noopt_cre.sub('', include[0])
- inc_list = include[1].split(',')
- for j in range(len(inc_list)):
- split_includes.append( (inc_type, inc_list[j]) )
- #
- includes = split_includes
- node.includes = includes
-
- return includes
-
- def scan_recurse(self, node, path=()):
- """ do a recursive scan of the top level target file
- This lets us search for included files based on the
- directory of the main file just as latex does"""
-
- path_dict = dict(list(path))
-
- queue = []
- queue.extend( self.scan(node) )
- seen = {}
-
- # This is a hand-coded DSU (decorate-sort-undecorate, or
- # Schwartzian transform) pattern. The sort key is the raw name
- # of the file as specifed on the \include, \input, etc. line.
- # TODO: what about the comment in the original Classic scanner:
- # """which lets
- # us keep the sort order constant regardless of whether the file
- # is actually found in a Repository or locally."""
- nodes = []
- source_dir = node.get_dir()
- #for include in includes:
- while queue:
-
- include = queue.pop()
- try:
- if seen[include[1]] == 1:
- continue
- except KeyError:
- seen[include[1]] = 1
-
- #
- # Handle multiple filenames in include[1]
- #
- n, i = self.find_include(include, source_dir, path_dict)
- if n is None:
- # Do not bother with 'usepackage' warnings, as they most
- # likely refer to system-level files
- if include[0] != 'usepackage':
- SCons.Warnings.warn(SCons.Warnings.DependencyWarning,
- "No dependency generated for file: %s (included from: %s) -- file not found" % (i, node))
- else:
- sortkey = self.sort_key(n)
- nodes.append((sortkey, n))
- # recurse down
- queue.extend( self.scan(n) )
-
- return [pair[1] for pair in sorted(nodes)]
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Scanner/Prog.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Scanner/Prog.py
deleted file mode 100644
index c0511dc..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Scanner/Prog.py
+++ /dev/null
@@ -1,116 +0,0 @@
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-
-__revision__ = "src/engine/SCons/Scanner/Prog.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-import SCons.Node
-import SCons.Node.FS
-import SCons.Scanner
-import SCons.Util
-
-# global, set by --debug=findlibs
-print_find_libs = None
-
-def ProgramScanner(**kw):
- """Return a prototype Scanner instance for scanning executable
- files for static-lib dependencies"""
- kw['path_function'] = SCons.Scanner.FindPathDirs('LIBPATH')
- ps = SCons.Scanner.Base(scan, "ProgramScanner", **kw)
- return ps
-
-def _subst_libs(env, libs):
- """
- Substitute environment variables and split into list.
- """
- if SCons.Util.is_String(libs):
- libs = env.subst(libs)
- if SCons.Util.is_String(libs):
- libs = libs.split()
- elif SCons.Util.is_Sequence(libs):
- _libs = []
- for l in libs:
- _libs += _subst_libs(env, l)
- libs = _libs
- else:
- # libs is an object (Node, for example)
- libs = [libs]
- return libs
-
-def scan(node, env, libpath = ()):
- """
- This scanner scans program files for static-library
- dependencies. It will search the LIBPATH environment variable
- for libraries specified in the LIBS variable, returning any
- files it finds as dependencies.
- """
- try:
- libs = env['LIBS']
- except KeyError:
- # There are no LIBS in this environment, so just return a null list:
- return []
-
- libs = _subst_libs(env, libs)
-
- try:
- prefix = env['LIBPREFIXES']
- if not SCons.Util.is_List(prefix):
- prefix = [ prefix ]
- except KeyError:
- prefix = [ '' ]
-
- try:
- suffix = env['LIBSUFFIXES']
- if not SCons.Util.is_List(suffix):
- suffix = [ suffix ]
- except KeyError:
- suffix = [ '' ]
-
- pairs = []
- for suf in map(env.subst, suffix):
- for pref in map(env.subst, prefix):
- pairs.append((pref, suf))
-
- result = []
-
- if callable(libpath):
- libpath = libpath()
-
- find_file = SCons.Node.FS.find_file
- adjustixes = SCons.Util.adjustixes
- for lib in libs:
- if SCons.Util.is_String(lib):
- for pref, suf in pairs:
- l = adjustixes(lib, pref, suf)
- l = find_file(l, libpath, verbose=print_find_libs)
- if l:
- result.append(l)
- else:
- result.append(lib)
-
- return result
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Scanner/RC.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Scanner/RC.py
deleted file mode 100644
index f73b47e..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Scanner/RC.py
+++ /dev/null
@@ -1,55 +0,0 @@
-"""SCons.Scanner.RC
-
-This module implements the depenency scanner for RC (Interface
-Definition Language) files.
-
-"""
-
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-
-__revision__ = "src/engine/SCons/Scanner/RC.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-import SCons.Node.FS
-import SCons.Scanner
-import re
-
-def RCScan():
- """Return a prototype Scanner instance for scanning RC source files"""
-
- res_re= r'^(?:\s*#\s*(?:include)|' \
- '.*?\s+(?:ICON|BITMAP|CURSOR|HTML|FONT|MESSAGETABLE|TYPELIB|REGISTRY|D3DFX)' \
- '\s*.*?)' \
- '\s*(<|"| )([^>"\s]+)(?:[>"\s])*$'
- resScanner = SCons.Scanner.ClassicCPP( "ResourceScanner",
- "$RCSUFFIXES",
- "CPPPATH",
- res_re )
-
- return resScanner
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Scanner/__init__.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Scanner/__init__.py
deleted file mode 100644
index d51cb9e..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Scanner/__init__.py
+++ /dev/null
@@ -1,413 +0,0 @@
-"""SCons.Scanner
-
-The Scanner package for the SCons software construction utility.
-
-"""
-
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-
-__revision__ = "src/engine/SCons/Scanner/__init__.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-import re
-
-import SCons.Node.FS
-import SCons.Util
-
-
-class _Null(object):
- pass
-
-# This is used instead of None as a default argument value so None can be
-# used as an actual argument value.
-_null = _Null
-
-def Scanner(function, *args, **kw):
- """
- Public interface factory function for creating different types
- of Scanners based on the different types of "functions" that may
- be supplied.
-
- TODO: Deprecate this some day. We've moved the functionality
- inside the Base class and really don't need this factory function
- any more. It was, however, used by some of our Tool modules, so
- the call probably ended up in various people's custom modules
- patterned on SCons code.
- """
- if SCons.Util.is_Dict(function):
- return Selector(function, *args, **kw)
- else:
- return Base(function, *args, **kw)
-
-
-
-class FindPathDirs(object):
- """A class to bind a specific *PATH variable name to a function that
- will return all of the *path directories."""
- def __init__(self, variable):
- self.variable = variable
- def __call__(self, env, dir=None, target=None, source=None, argument=None):
- import SCons.PathList
- try:
- path = env[self.variable]
- except KeyError:
- return ()
-
- dir = dir or env.fs._cwd
- path = SCons.PathList.PathList(path).subst_path(env, target, source)
- return tuple(dir.Rfindalldirs(path))
-
-
-
-class Base(object):
- """
- The base class for dependency scanners. This implements
- straightforward, single-pass scanning of a single file.
- """
-
- def __init__(self,
- function,
- name = "NONE",
- argument = _null,
- skeys = _null,
- path_function = None,
- # Node.FS.Base so that, by default, it's okay for a
- # scanner to return a Dir, File or Entry.
- node_class = SCons.Node.FS.Base,
- node_factory = None,
- scan_check = None,
- recursive = None):
- """
- Construct a new scanner object given a scanner function.
-
- 'function' - a scanner function taking two or three
- arguments and returning a list of strings.
-
- 'name' - a name for identifying this scanner object.
-
- 'argument' - an optional argument that, if specified, will be
- passed to both the scanner function and the path_function.
-
- 'skeys' - an optional list argument that can be used to determine
- which scanner should be used for a given Node. In the case of File
- nodes, for example, the 'skeys' would be file suffixes.
-
- 'path_function' - a function that takes four or five arguments
- (a construction environment, Node for the directory containing
- the SConscript file that defined the primary target, list of
- target nodes, list of source nodes, and optional argument for
- this instance) and returns a tuple of the directories that can
- be searched for implicit dependency files. May also return a
- callable() which is called with no args and returns the tuple
- (supporting Bindable class).
-
- 'node_class' - the class of Nodes which this scan will return.
- If node_class is None, then this scanner will not enforce any
- Node conversion and will return the raw results from the
- underlying scanner function.
-
- 'node_factory' - the factory function to be called to translate
- the raw results returned by the scanner function into the
- expected node_class objects.
-
- 'scan_check' - a function to be called to first check whether
- this node really needs to be scanned.
-
- 'recursive' - specifies that this scanner should be invoked
- recursively on all of the implicit dependencies it returns
- (the canonical example being #include lines in C source files).
- May be a callable, which will be called to filter the list
- of nodes found to select a subset for recursive scanning
- (the canonical example being only recursively scanning
- subdirectories within a directory).
-
- The scanner function's first argument will be a Node that should
- be scanned for dependencies, the second argument will be an
- Environment object, the third argument will be the tuple of paths
- returned by the path_function, and the fourth argument will be
- the value passed into 'argument', and the returned list should
- contain the Nodes for all the direct dependencies of the file.
-
- Examples:
-
- s = Scanner(my_scanner_function)
-
- s = Scanner(function = my_scanner_function)
-
- s = Scanner(function = my_scanner_function, argument = 'foo')
-
- """
-
- # Note: this class could easily work with scanner functions that take
- # something other than a filename as an argument (e.g. a database
- # node) and a dependencies list that aren't file names. All that
- # would need to be changed is the documentation.
-
- self.function = function
- self.path_function = path_function
- self.name = name
- self.argument = argument
-
- if skeys is _null:
- if SCons.Util.is_Dict(function):
- skeys = list(function.keys())
- else:
- skeys = []
- self.skeys = skeys
-
- self.node_class = node_class
- self.node_factory = node_factory
- self.scan_check = scan_check
- if callable(recursive):
- self.recurse_nodes = recursive
- elif recursive:
- self.recurse_nodes = self._recurse_all_nodes
- else:
- self.recurse_nodes = self._recurse_no_nodes
-
- def path(self, env, dir=None, target=None, source=None):
- if not self.path_function:
- return ()
- if not self.argument is _null:
- return self.path_function(env, dir, target, source, self.argument)
- else:
- return self.path_function(env, dir, target, source)
-
- def __call__(self, node, env, path = ()):
- """
- This method scans a single object. 'node' is the node
- that will be passed to the scanner function, and 'env' is the
- environment that will be passed to the scanner function. A list of
- direct dependency nodes for the specified node will be returned.
- """
- if self.scan_check and not self.scan_check(node, env):
- return []
-
- self = self.select(node)
-
- if not self.argument is _null:
- list = self.function(node, env, path, self.argument)
- else:
- list = self.function(node, env, path)
-
- kw = {}
- if hasattr(node, 'dir'):
- kw['directory'] = node.dir
- node_factory = env.get_factory(self.node_factory)
- nodes = []
- for l in list:
- if self.node_class and not isinstance(l, self.node_class):
- l = node_factory(l, **kw)
- nodes.append(l)
- return nodes
-
- def __cmp__(self, other):
- try:
- return cmp(self.__dict__, other.__dict__)
- except AttributeError:
- # other probably doesn't have a __dict__
- return cmp(self.__dict__, other)
-
- def __hash__(self):
- return id(self)
-
- def __str__(self):
- return self.name
-
- def add_skey(self, skey):
- """Add a skey to the list of skeys"""
- self.skeys.append(skey)
-
- def get_skeys(self, env=None):
- if env and SCons.Util.is_String(self.skeys):
- return env.subst_list(self.skeys)[0]
- return self.skeys
-
- def select(self, node):
- if SCons.Util.is_Dict(self.function):
- key = node.scanner_key()
- try:
- return self.function[key]
- except KeyError:
- return None
- else:
- return self
-
- def _recurse_all_nodes(self, nodes):
- return nodes
-
- def _recurse_no_nodes(self, nodes):
- return []
-
- recurse_nodes = _recurse_no_nodes
-
- def add_scanner(self, skey, scanner):
- self.function[skey] = scanner
- self.add_skey(skey)
-
-
-class Selector(Base):
- """
- A class for selecting a more specific scanner based on the
- scanner_key() (suffix) for a specific Node.
-
- TODO: This functionality has been moved into the inner workings of
- the Base class, and this class will be deprecated at some point.
- (It was never exposed directly as part of the public interface,
- although it is used by the Scanner() factory function that was
- used by various Tool modules and therefore was likely a template
- for custom modules that may be out there.)
- """
- def __init__(self, dict, *args, **kw):
- Base.__init__(self, None, *args, **kw)
- self.dict = dict
- self.skeys = list(dict.keys())
-
- def __call__(self, node, env, path = ()):
- return self.select(node)(node, env, path)
-
- def select(self, node):
- try:
- return self.dict[node.scanner_key()]
- except KeyError:
- return None
-
- def add_scanner(self, skey, scanner):
- self.dict[skey] = scanner
- self.add_skey(skey)
-
-
-class Current(Base):
- """
- A class for scanning files that are source files (have no builder)
- or are derived files and are current (which implies that they exist,
- either locally or in a repository).
- """
-
- def __init__(self, *args, **kw):
- def current_check(node, env):
- return not node.has_builder() or node.is_up_to_date()
- kw['scan_check'] = current_check
- Base.__init__(self, *args, **kw)
-
-class Classic(Current):
- """
- A Scanner subclass to contain the common logic for classic CPP-style
- include scanning, but which can be customized to use different
- regular expressions to find the includes.
-
- Note that in order for this to work "out of the box" (without
- overriding the find_include() and sort_key() methods), the regular
- expression passed to the constructor must return the name of the
- include file in group 0.
- """
-
- def __init__(self, name, suffixes, path_variable, regex, *args, **kw):
-
- self.cre = re.compile(regex, re.M)
-
- def _scan(node, env, path=(), self=self):
- node = node.rfile()
- if not node.exists():
- return []
- return self.scan(node, path)
-
- kw['function'] = _scan
- kw['path_function'] = FindPathDirs(path_variable)
- kw['recursive'] = 1
- kw['skeys'] = suffixes
- kw['name'] = name
-
- Current.__init__(self, *args, **kw)
-
- def find_include(self, include, source_dir, path):
- n = SCons.Node.FS.find_file(include, (source_dir,) + tuple(path))
- return n, include
-
- def sort_key(self, include):
- return SCons.Node.FS._my_normcase(include)
-
- def find_include_names(self, node):
- return self.cre.findall(node.get_text_contents())
-
- def scan(self, node, path=()):
-
- # cache the includes list in node so we only scan it once:
- if node.includes is not None:
- includes = node.includes
- else:
- includes = self.find_include_names (node)
- # Intern the names of the include files. Saves some memory
- # if the same header is included many times.
- node.includes = list(map(SCons.Util.silent_intern, includes))
-
- # This is a hand-coded DSU (decorate-sort-undecorate, or
- # Schwartzian transform) pattern. The sort key is the raw name
- # of the file as specifed on the #include line (including the
- # " or <, since that may affect what file is found), which lets
- # us keep the sort order constant regardless of whether the file
- # is actually found in a Repository or locally.
- nodes = []
- source_dir = node.get_dir()
- if callable(path):
- path = path()
- for include in includes:
- n, i = self.find_include(include, source_dir, path)
-
- if n is None:
- SCons.Warnings.warn(SCons.Warnings.DependencyWarning,
- "No dependency generated for file: %s (included from: %s) -- file not found" % (i, node))
- else:
- nodes.append((self.sort_key(include), n))
-
- return [pair[1] for pair in sorted(nodes)]
-
-class ClassicCPP(Classic):
- """
- A Classic Scanner subclass which takes into account the type of
- bracketing used to include the file, and uses classic CPP rules
- for searching for the files based on the bracketing.
-
- Note that in order for this to work, the regular expression passed
- to the constructor must return the leading bracket in group 0, and
- the contained filename in group 1.
- """
- def find_include(self, include, source_dir, path):
- if include[0] == '"':
- paths = (source_dir,) + tuple(path)
- else:
- paths = tuple(path) + (source_dir,)
-
- n = SCons.Node.FS.find_file(include[1], paths)
-
- i = SCons.Util.silent_intern(include[1])
- return n, i
-
- def sort_key(self, include):
- return SCons.Node.FS._my_normcase(' '.join(include))
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Script/Interactive.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Script/Interactive.py
deleted file mode 100644
index afcde0c..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Script/Interactive.py
+++ /dev/null
@@ -1,384 +0,0 @@
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-__revision__ = "src/engine/SCons/Script/Interactive.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-__doc__ = """
-SCons interactive mode
-"""
-
-# TODO:
-#
-# This has the potential to grow into something with a really big life
-# of its own, which might or might not be a good thing. Nevertheless,
-# here are some enhancements that will probably be requested some day
-# and are worth keeping in mind (assuming this takes off):
-#
-# - A command to re-read / re-load the SConscript files. This may
-# involve allowing people to specify command-line options (e.g. -f,
-# -I, --no-site-dir) that affect how the SConscript files are read.
-#
-# - Additional command-line options on the "build" command.
-#
-# Of the supported options that seemed to make sense (after a quick
-# pass through the list), the ones that seemed likely enough to be
-# used are listed in the man page and have explicit test scripts.
-#
-# These had code changed in Script/Main.py to support them, but didn't
-# seem likely to be used regularly, so had no test scripts added:
-#
-# build --diskcheck=*
-# build --implicit-cache=*
-# build --implicit-deps-changed=*
-# build --implicit-deps-unchanged=*
-#
-# These look like they should "just work" with no changes to the
-# existing code, but like those above, look unlikely to be used and
-# therefore had no test scripts added:
-#
-# build --random
-#
-# These I'm not sure about. They might be useful for individual
-# "build" commands, and may even work, but they seem unlikely enough
-# that we'll wait until they're requested before spending any time on
-# writing test scripts for them, or investigating whether they work.
-#
-# build -q [??? is there a useful analog to the exit status?]
-# build --duplicate=
-# build --profile=
-# build --max-drift=
-# build --warn=*
-# build --Y
-#
-# - Most of the SCons command-line options that the "build" command
-# supports should be settable as default options that apply to all
-# subsequent "build" commands. Maybe a "set {option}" command that
-# maps to "SetOption('{option}')".
-#
-# - Need something in the 'help' command that prints the -h output.
-#
-# - A command to run the configure subsystem separately (must see how
-# this interacts with the new automake model).
-#
-# - Command-line completion of target names; maybe even of SCons options?
-# Completion is something that's supported by the Python cmd module,
-# so this should be doable without too much trouble.
-#
-
-import cmd
-import copy
-import os
-import re
-import shlex
-import sys
-
-try:
- import readline
-except ImportError:
- pass
-
-class SConsInteractiveCmd(cmd.Cmd):
- """\
- build [TARGETS] Build the specified TARGETS and their dependencies.
- 'b' is a synonym.
- clean [TARGETS] Clean (remove) the specified TARGETS and their
- dependencies. 'c' is a synonym.
- exit Exit SCons interactive mode.
- help [COMMAND] Prints help for the specified COMMAND. 'h' and
- '?' are synonyms.
- shell [COMMANDLINE] Execute COMMANDLINE in a subshell. 'sh' and '!'
- are synonyms.
- version Prints SCons version information.
- """
-
- synonyms = {
- 'b' : 'build',
- 'c' : 'clean',
- 'h' : 'help',
- 'scons' : 'build',
- 'sh' : 'shell',
- }
-
- def __init__(self, **kw):
- cmd.Cmd.__init__(self)
- for key, val in kw.items():
- setattr(self, key, val)
-
- if sys.platform == 'win32':
- self.shell_variable = 'COMSPEC'
- else:
- self.shell_variable = 'SHELL'
-
- def default(self, argv):
- print "*** Unknown command: %s" % argv[0]
-
- def onecmd(self, line):
- line = line.strip()
- if not line:
- print self.lastcmd
- return self.emptyline()
- self.lastcmd = line
- if line[0] == '!':
- line = 'shell ' + line[1:]
- elif line[0] == '?':
- line = 'help ' + line[1:]
- if os.sep == '\\':
- line = line.replace('\\', '\\\\')
- argv = shlex.split(line)
- argv[0] = self.synonyms.get(argv[0], argv[0])
- if not argv[0]:
- return self.default(line)
- else:
- try:
- func = getattr(self, 'do_' + argv[0])
- except AttributeError:
- return self.default(argv)
- return func(argv)
-
- def do_build(self, argv):
- """\
- build [TARGETS] Build the specified TARGETS and their
- dependencies. 'b' is a synonym.
- """
- import SCons.Node
- import SCons.SConsign
- import SCons.Script.Main
-
- options = copy.deepcopy(self.options)
-
- options, targets = self.parser.parse_args(argv[1:], values=options)
-
- SCons.Script.COMMAND_LINE_TARGETS = targets
-
- if targets:
- SCons.Script.BUILD_TARGETS = targets
- else:
- # If the user didn't specify any targets on the command line,
- # use the list of default targets.
- SCons.Script.BUILD_TARGETS = SCons.Script._build_plus_default
-
- nodes = SCons.Script.Main._build_targets(self.fs,
- options,
- targets,
- self.target_top)
-
- if not nodes:
- return
-
- # Call each of the Node's alter_targets() methods, which may
- # provide additional targets that ended up as part of the build
- # (the canonical example being a VariantDir() when we're building
- # from a source directory) and which we therefore need their
- # state cleared, too.
- x = []
- for n in nodes:
- x.extend(n.alter_targets()[0])
- nodes.extend(x)
-
- # Clean up so that we can perform the next build correctly.
- #
- # We do this by walking over all the children of the targets,
- # and clearing their state.
- #
- # We currently have to re-scan each node to find their
- # children, because built nodes have already been partially
- # cleared and don't remember their children. (In scons
- # 0.96.1 and earlier, this wasn't the case, and we didn't
- # have to re-scan the nodes.)
- #
- # Because we have to re-scan each node, we can't clear the
- # nodes as we walk over them, because we may end up rescanning
- # a cleared node as we scan a later node. Therefore, only
- # store the list of nodes that need to be cleared as we walk
- # the tree, and clear them in a separate pass.
- #
- # XXX: Someone more familiar with the inner workings of scons
- # may be able to point out a more efficient way to do this.
-
- SCons.Script.Main.progress_display("scons: Clearing cached node information ...")
-
- seen_nodes = {}
-
- def get_unseen_children(node, parent, seen_nodes=seen_nodes):
- def is_unseen(node, seen_nodes=seen_nodes):
- return node not in seen_nodes
- return list(filter(is_unseen, node.children(scan=1)))
-
- def add_to_seen_nodes(node, parent, seen_nodes=seen_nodes):
- seen_nodes[node] = 1
-
- # If this file is in a VariantDir and has a
- # corresponding source file in the source tree, remember the
- # node in the source tree, too. This is needed in
- # particular to clear cached implicit dependencies on the
- # source file, since the scanner will scan it if the
- # VariantDir was created with duplicate=0.
- try:
- rfile_method = node.rfile
- except AttributeError:
- return
- else:
- rfile = rfile_method()
- if rfile != node:
- seen_nodes[rfile] = 1
-
- for node in nodes:
- walker = SCons.Node.Walker(node,
- kids_func=get_unseen_children,
- eval_func=add_to_seen_nodes)
- n = walker.get_next()
- while n:
- n = walker.get_next()
-
- for node in seen_nodes.keys():
- # Call node.clear() to clear most of the state
- node.clear()
- # node.clear() doesn't reset node.state, so call
- # node.set_state() to reset it manually
- node.set_state(SCons.Node.no_state)
- node.implicit = None
-
- # Debug: Uncomment to verify that all Taskmaster reference
- # counts have been reset to zero.
- #if node.ref_count != 0:
- # from SCons.Debug import Trace
- # Trace('node %s, ref_count %s !!!\n' % (node, node.ref_count))
-
- SCons.SConsign.Reset()
- SCons.Script.Main.progress_display("scons: done clearing node information.")
-
- def do_clean(self, argv):
- """\
- clean [TARGETS] Clean (remove) the specified TARGETS
- and their dependencies. 'c' is a synonym.
- """
- return self.do_build(['build', '--clean'] + argv[1:])
-
- def do_EOF(self, argv):
- print
- self.do_exit(argv)
-
- def _do_one_help(self, arg):
- try:
- # If help_<arg>() exists, then call it.
- func = getattr(self, 'help_' + arg)
- except AttributeError:
- try:
- func = getattr(self, 'do_' + arg)
- except AttributeError:
- doc = None
- else:
- doc = self._doc_to_help(func)
- if doc:
- sys.stdout.write(doc + '\n')
- sys.stdout.flush()
- else:
- doc = self.strip_initial_spaces(func())
- if doc:
- sys.stdout.write(doc + '\n')
- sys.stdout.flush()
-
- def _doc_to_help(self, obj):
- doc = obj.__doc__
- if doc is None:
- return ''
- return self._strip_initial_spaces(doc)
-
- def _strip_initial_spaces(self, s):
- #lines = s.split('\n')
- lines = s.split('\n')
- spaces = re.match(' *', lines[0]).group(0)
- #def strip_spaces(l):
- # if l.startswith(spaces):
- # l = l[len(spaces):]
- # return l
- #return '\n'.join([ strip_spaces(l) for l in lines ])
- def strip_spaces(l, spaces=spaces):
- if l[:len(spaces)] == spaces:
- l = l[len(spaces):]
- return l
- lines = list(map(strip_spaces, lines))
- return '\n'.join(lines)
-
- def do_exit(self, argv):
- """\
- exit Exit SCons interactive mode.
- """
- sys.exit(0)
-
- def do_help(self, argv):
- """\
- help [COMMAND] Prints help for the specified COMMAND. 'h'
- and '?' are synonyms.
- """
- if argv[1:]:
- for arg in argv[1:]:
- if self._do_one_help(arg):
- break
- else:
- # If bare 'help' is called, print this class's doc
- # string (if it has one).
- doc = self._doc_to_help(self.__class__)
- if doc:
- sys.stdout.write(doc + '\n')
- sys.stdout.flush()
-
- def do_shell(self, argv):
- """\
- shell [COMMANDLINE] Execute COMMANDLINE in a subshell. 'sh' and
- '!' are synonyms.
- """
- import subprocess
- argv = argv[1:]
- if not argv:
- argv = os.environ[self.shell_variable]
- try:
- # Per "[Python-Dev] subprocess insufficiently platform-independent?"
- # http://mail.python.org/pipermail/python-dev/2008-August/081979.html "+
- # Doing the right thing with an argument list currently
- # requires different shell= values on Windows and Linux.
- p = subprocess.Popen(argv, shell=(sys.platform=='win32'))
- except EnvironmentError, e:
- sys.stderr.write('scons: %s: %s\n' % (argv[0], e.strerror))
- else:
- p.wait()
-
- def do_version(self, argv):
- """\
- version Prints SCons version information.
- """
- sys.stdout.write(self.parser.version + '\n')
-
-def interact(fs, parser, options, targets, target_top):
- c = SConsInteractiveCmd(prompt = 'scons>>> ',
- fs = fs,
- parser = parser,
- options = options,
- targets = targets,
- target_top = target_top)
- c.cmdloop()
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Script/Main.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Script/Main.py
deleted file mode 100644
index 6684fbd..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Script/Main.py
+++ /dev/null
@@ -1,1437 +0,0 @@
-"""SCons.Script
-
-This file implements the main() function used by the scons script.
-
-Architecturally, this *is* the scons script, and will likely only be
-called from the external "scons" wrapper. Consequently, anything here
-should not be, or be considered, part of the build engine. If it's
-something that we expect other software to want to use, it should go in
-some other module. If it's specific to the "scons" script invocation,
-it goes here.
-"""
-
-unsupported_python_version = (2, 3, 0)
-deprecated_python_version = (2, 7, 0)
-
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-__revision__ = "src/engine/SCons/Script/Main.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-import SCons.compat
-
-import os
-import sys
-import time
-import traceback
-
-# Strip the script directory from sys.path() so on case-insensitive
-# (Windows) systems Python doesn't think that the "scons" script is the
-# "SCons" package. Replace it with our own version directory so, if
-# if they're there, we pick up the right version of the build engine
-# modules.
-#sys.path = [os.path.join(sys.prefix,
-# 'lib',
-# 'scons-%d' % SCons.__version__)] + sys.path[1:]
-
-import SCons.CacheDir
-import SCons.Debug
-import SCons.Defaults
-import SCons.Environment
-import SCons.Errors
-import SCons.Job
-import SCons.Node
-import SCons.Node.FS
-import SCons.Platform
-import SCons.SConf
-import SCons.Script
-import SCons.Taskmaster
-import SCons.Util
-import SCons.Warnings
-
-import SCons.Script.Interactive
-
-def fetch_win32_parallel_msg():
- # A subsidiary function that exists solely to isolate this import
- # so we don't have to pull it in on all platforms, and so that an
- # in-line "import" statement in the _main() function below doesn't
- # cause warnings about local names shadowing use of the 'SCons'
- # globl in nest scopes and UnboundLocalErrors and the like in some
- # versions (2.1) of Python.
- import SCons.Platform.win32
- return SCons.Platform.win32.parallel_msg
-
-def revert_io():
- # This call is added to revert stderr and stdout to the original
- # ones just in case some build rule or something else in the system
- # has redirected them elsewhere.
- sys.stderr = sys.__stderr__
- sys.stdout = sys.__stdout__
-
-class SConsPrintHelpException(Exception):
- pass
-
-display = SCons.Util.display
-progress_display = SCons.Util.DisplayEngine()
-
-first_command_start = None
-last_command_end = None
-
-class Progressor(object):
- prev = ''
- count = 0
- target_string = '$TARGET'
-
- def __init__(self, obj, interval=1, file=None, overwrite=False):
- if file is None:
- file = sys.stdout
-
- self.obj = obj
- self.file = file
- self.interval = interval
- self.overwrite = overwrite
-
- if callable(obj):
- self.func = obj
- elif SCons.Util.is_List(obj):
- self.func = self.spinner
- elif obj.find(self.target_string) != -1:
- self.func = self.replace_string
- else:
- self.func = self.string
-
- def write(self, s):
- self.file.write(s)
- self.file.flush()
- self.prev = s
-
- def erase_previous(self):
- if self.prev:
- length = len(self.prev)
- if self.prev[-1] in ('\n', '\r'):
- length = length - 1
- self.write(' ' * length + '\r')
- self.prev = ''
-
- def spinner(self, node):
- self.write(self.obj[self.count % len(self.obj)])
-
- def string(self, node):
- self.write(self.obj)
-
- def replace_string(self, node):
- self.write(self.obj.replace(self.target_string, str(node)))
-
- def __call__(self, node):
- self.count = self.count + 1
- if (self.count % self.interval) == 0:
- if self.overwrite:
- self.erase_previous()
- self.func(node)
-
-ProgressObject = SCons.Util.Null()
-
-def Progress(*args, **kw):
- global ProgressObject
- ProgressObject = Progressor(*args, **kw)
-
-# Task control.
-#
-
-_BuildFailures = []
-
-def GetBuildFailures():
- return _BuildFailures
-
-class BuildTask(SCons.Taskmaster.OutOfDateTask):
- """An SCons build task."""
- progress = ProgressObject
-
- def display(self, message):
- display('scons: ' + message)
-
- def prepare(self):
- self.progress(self.targets[0])
- return SCons.Taskmaster.OutOfDateTask.prepare(self)
-
- def needs_execute(self):
- if SCons.Taskmaster.OutOfDateTask.needs_execute(self):
- return True
- if self.top and self.targets[0].has_builder():
- display("scons: `%s' is up to date." % str(self.node))
- return False
-
- def execute(self):
- if print_time:
- start_time = time.time()
- global first_command_start
- if first_command_start is None:
- first_command_start = start_time
- SCons.Taskmaster.OutOfDateTask.execute(self)
- if print_time:
- global cumulative_command_time
- global last_command_end
- finish_time = time.time()
- last_command_end = finish_time
- cumulative_command_time = cumulative_command_time+finish_time-start_time
- sys.stdout.write("Command execution time: %s: %f seconds\n"%(str(self.node), finish_time-start_time))
-
- def do_failed(self, status=2):
- _BuildFailures.append(self.exception[1])
- global exit_status
- global this_build_status
- if self.options.ignore_errors:
- SCons.Taskmaster.OutOfDateTask.executed(self)
- elif self.options.keep_going:
- SCons.Taskmaster.OutOfDateTask.fail_continue(self)
- exit_status = status
- this_build_status = status
- else:
- SCons.Taskmaster.OutOfDateTask.fail_stop(self)
- exit_status = status
- this_build_status = status
-
- def executed(self):
- t = self.targets[0]
- if self.top and not t.has_builder() and not t.side_effect:
- if not t.exists():
- if t.__class__.__name__ in ('File', 'Dir', 'Entry'):
- errstr="Do not know how to make %s target `%s' (%s)." % (t.__class__.__name__, t, t.get_abspath())
- else: # Alias or Python or ...
- errstr="Do not know how to make %s target `%s'." % (t.__class__.__name__, t)
- sys.stderr.write("scons: *** " + errstr)
- if not self.options.keep_going:
- sys.stderr.write(" Stop.")
- sys.stderr.write("\n")
- try:
- raise SCons.Errors.BuildError(t, errstr)
- except KeyboardInterrupt:
- raise
- except:
- self.exception_set()
- self.do_failed()
- else:
- print "scons: Nothing to be done for `%s'." % t
- SCons.Taskmaster.OutOfDateTask.executed(self)
- else:
- SCons.Taskmaster.OutOfDateTask.executed(self)
-
- def failed(self):
- # Handle the failure of a build task. The primary purpose here
- # is to display the various types of Errors and Exceptions
- # appropriately.
- exc_info = self.exc_info()
- try:
- t, e, tb = exc_info
- except ValueError:
- t, e = exc_info
- tb = None
-
- if t is None:
- # The Taskmaster didn't record an exception for this Task;
- # see if the sys module has one.
- try:
- t, e, tb = sys.exc_info()[:]
- except ValueError:
- t, e = exc_info
- tb = None
-
- # Deprecated string exceptions will have their string stored
- # in the first entry of the tuple.
- if e is None:
- e = t
-
- buildError = SCons.Errors.convert_to_BuildError(e)
- if not buildError.node:
- buildError.node = self.node
-
- node = buildError.node
- if not SCons.Util.is_List(node):
- node = [ node ]
- nodename = ', '.join(map(str, node))
-
- errfmt = "scons: *** [%s] %s\n"
- sys.stderr.write(errfmt % (nodename, buildError))
-
- if (buildError.exc_info[2] and buildError.exc_info[1] and
- not isinstance(
- buildError.exc_info[1],
- (EnvironmentError, SCons.Errors.StopError,
- SCons.Errors.UserError))):
- type, value, trace = buildError.exc_info
- if tb and print_stacktrace:
- sys.stderr.write("scons: internal stack trace:\n")
- traceback.print_tb(tb, file=sys.stderr)
- traceback.print_exception(type, value, trace)
- elif tb and print_stacktrace:
- sys.stderr.write("scons: internal stack trace:\n")
- traceback.print_tb(tb, file=sys.stderr)
-
- self.exception = (e, buildError, tb) # type, value, traceback
- self.do_failed(buildError.exitstatus)
-
- self.exc_clear()
-
- def postprocess(self):
- if self.top:
- t = self.targets[0]
- for tp in self.options.tree_printers:
- tp.display(t)
- if self.options.debug_includes:
- tree = t.render_include_tree()
- if tree:
- print
- print tree
- SCons.Taskmaster.OutOfDateTask.postprocess(self)
-
- def make_ready(self):
- """Make a task ready for execution"""
- SCons.Taskmaster.OutOfDateTask.make_ready(self)
- if self.out_of_date and self.options.debug_explain:
- explanation = self.out_of_date[0].explain()
- if explanation:
- sys.stdout.write("scons: " + explanation)
-
-class CleanTask(SCons.Taskmaster.AlwaysTask):
- """An SCons clean task."""
- def fs_delete(self, path, pathstr, remove=True):
- try:
- if os.path.lexists(path):
- if os.path.isfile(path) or os.path.islink(path):
- if remove: os.unlink(path)
- display("Removed " + pathstr)
- elif os.path.isdir(path) and not os.path.islink(path):
- # delete everything in the dir
- for e in sorted(os.listdir(path)):
- p = os.path.join(path, e)
- s = os.path.join(pathstr, e)
- if os.path.isfile(p):
- if remove: os.unlink(p)
- display("Removed " + s)
- else:
- self.fs_delete(p, s, remove)
- # then delete dir itself
- if remove: os.rmdir(path)
- display("Removed directory " + pathstr)
- else:
- errstr = "Path '%s' exists but isn't a file or directory."
- raise SCons.Errors.UserError(errstr % (pathstr))
- except SCons.Errors.UserError, e:
- print e
- except (IOError, OSError), e:
- print "scons: Could not remove '%s':" % pathstr, e.strerror
-
- def _get_files_to_clean(self):
- result = []
- target = self.targets[0]
- if target.has_builder() or target.side_effect:
- result = [t for t in self.targets if not t.noclean]
- return result
-
- def _clean_targets(self, remove=True):
- target = self.targets[0]
- if target in SCons.Environment.CleanTargets:
- files = SCons.Environment.CleanTargets[target]
- for f in files:
- self.fs_delete(f.get_abspath(), str(f), remove)
-
- def show(self):
- for t in self._get_files_to_clean():
- if not t.isdir():
- display("Removed " + str(t))
- self._clean_targets(remove=False)
-
- def remove(self):
- for t in self._get_files_to_clean():
- try:
- removed = t.remove()
- except OSError, e:
- # An OSError may indicate something like a permissions
- # issue, an IOError would indicate something like
- # the file not existing. In either case, print a
- # message and keep going to try to remove as many
- # targets aa possible.
- print "scons: Could not remove '%s':" % str(t), e.strerror
- else:
- if removed:
- display("Removed " + str(t))
- self._clean_targets(remove=True)
-
- execute = remove
-
- # We want the Taskmaster to update the Node states (and therefore
- # handle reference counts, etc.), but we don't want to call
- # back to the Node's post-build methods, which would do things
- # we don't want, like store .sconsign information.
- executed = SCons.Taskmaster.Task.executed_without_callbacks
-
- # Have the taskmaster arrange to "execute" all of the targets, because
- # we'll figure out ourselves (in remove() or show() above) whether
- # anything really needs to be done.
- make_ready = SCons.Taskmaster.Task.make_ready_all
-
- def prepare(self):
- pass
-
-class QuestionTask(SCons.Taskmaster.AlwaysTask):
- """An SCons task for the -q (question) option."""
- def prepare(self):
- pass
-
- def execute(self):
- if self.targets[0].get_state() != SCons.Node.up_to_date or \
- (self.top and not self.targets[0].exists()):
- global exit_status
- global this_build_status
- exit_status = 1
- this_build_status = 1
- self.tm.stop()
-
- def executed(self):
- pass
-
-
-class TreePrinter(object):
- def __init__(self, derived=False, prune=False, status=False):
- self.derived = derived
- self.prune = prune
- self.status = status
- def get_all_children(self, node):
- return node.all_children()
- def get_derived_children(self, node):
- children = node.all_children(None)
- return [x for x in children if x.has_builder()]
- def display(self, t):
- if self.derived:
- func = self.get_derived_children
- else:
- func = self.get_all_children
- s = self.status and 2 or 0
- SCons.Util.print_tree(t, func, prune=self.prune, showtags=s)
-
-
-def python_version_string():
- return sys.version.split()[0]
-
-def python_version_unsupported(version=sys.version_info):
- return version < unsupported_python_version
-
-def python_version_deprecated(version=sys.version_info):
- return version < deprecated_python_version
-
-
-# Global variables
-
-print_objects = 0
-print_memoizer = 0
-print_stacktrace = 0
-print_time = 0
-sconscript_time = 0
-cumulative_command_time = 0
-exit_status = 0 # final exit status, assume success by default
-this_build_status = 0 # "exit status" of an individual build
-num_jobs = None
-delayed_warnings = []
-
-class FakeOptionParser(object):
- """
- A do-nothing option parser, used for the initial OptionsParser variable.
-
- During normal SCons operation, the OptionsParser is created right
- away by the main() function. Certain tests scripts however, can
- introspect on different Tool modules, the initialization of which
- can try to add a new, local option to an otherwise uninitialized
- OptionsParser object. This allows that introspection to happen
- without blowing up.
-
- """
- class FakeOptionValues(object):
- def __getattr__(self, attr):
- return None
- values = FakeOptionValues()
- def add_local_option(self, *args, **kw):
- pass
-
-OptionsParser = FakeOptionParser()
-
-def AddOption(*args, **kw):
- if 'default' not in kw:
- kw['default'] = None
- result = OptionsParser.add_local_option(*args, **kw)
- return result
-
-def GetOption(name):
- return getattr(OptionsParser.values, name)
-
-def SetOption(name, value):
- return OptionsParser.values.set_option(name, value)
-
-#
-class Stats(object):
- def __init__(self):
- self.stats = []
- self.labels = []
- self.append = self.do_nothing
- self.print_stats = self.do_nothing
- def enable(self, outfp):
- self.outfp = outfp
- self.append = self.do_append
- self.print_stats = self.do_print
- def do_nothing(self, *args, **kw):
- pass
-
-class CountStats(Stats):
- def do_append(self, label):
- self.labels.append(label)
- self.stats.append(SCons.Debug.fetchLoggedInstances())
- def do_print(self):
- stats_table = {}
- for s in self.stats:
- for n in [t[0] for t in s]:
- stats_table[n] = [0, 0, 0, 0]
- i = 0
- for s in self.stats:
- for n, c in s:
- stats_table[n][i] = c
- i = i + 1
- self.outfp.write("Object counts:\n")
- pre = [" "]
- post = [" %s\n"]
- l = len(self.stats)
- fmt1 = ''.join(pre + [' %7s']*l + post)
- fmt2 = ''.join(pre + [' %7d']*l + post)
- labels = self.labels[:l]
- labels.append(("", "Class"))
- self.outfp.write(fmt1 % tuple([x[0] for x in labels]))
- self.outfp.write(fmt1 % tuple([x[1] for x in labels]))
- for k in sorted(stats_table.keys()):
- r = stats_table[k][:l] + [k]
- self.outfp.write(fmt2 % tuple(r))
-
-count_stats = CountStats()
-
-class MemStats(Stats):
- def do_append(self, label):
- self.labels.append(label)
- self.stats.append(SCons.Debug.memory())
- def do_print(self):
- fmt = 'Memory %-32s %12d\n'
- for label, stats in zip(self.labels, self.stats):
- self.outfp.write(fmt % (label, stats))
-
-memory_stats = MemStats()
-
-# utility functions
-
-def _scons_syntax_error(e):
- """Handle syntax errors. Print out a message and show where the error
- occurred.
- """
- etype, value, tb = sys.exc_info()
- lines = traceback.format_exception_only(etype, value)
- for line in lines:
- sys.stderr.write(line+'\n')
- sys.exit(2)
-
-def find_deepest_user_frame(tb):
- """
- Find the deepest stack frame that is not part of SCons.
-
- Input is a "pre-processed" stack trace in the form
- returned by traceback.extract_tb() or traceback.extract_stack()
- """
-
- tb.reverse()
-
- # find the deepest traceback frame that is not part
- # of SCons:
- for frame in tb:
- filename = frame[0]
- if filename.find(os.sep+'SCons'+os.sep) == -1:
- return frame
- return tb[0]
-
-def _scons_user_error(e):
- """Handle user errors. Print out a message and a description of the
- error, along with the line number and routine where it occured.
- The file and line number will be the deepest stack frame that is
- not part of SCons itself.
- """
- global print_stacktrace
- etype, value, tb = sys.exc_info()
- if print_stacktrace:
- traceback.print_exception(etype, value, tb)
- filename, lineno, routine, dummy = find_deepest_user_frame(traceback.extract_tb(tb))
- sys.stderr.write("\nscons: *** %s\n" % value)
- sys.stderr.write('File "%s", line %d, in %s\n' % (filename, lineno, routine))
- sys.exit(2)
-
-def _scons_user_warning(e):
- """Handle user warnings. Print out a message and a description of
- the warning, along with the line number and routine where it occured.
- The file and line number will be the deepest stack frame that is
- not part of SCons itself.
- """
- etype, value, tb = sys.exc_info()
- filename, lineno, routine, dummy = find_deepest_user_frame(traceback.extract_tb(tb))
- sys.stderr.write("\nscons: warning: %s\n" % e)
- sys.stderr.write('File "%s", line %d, in %s\n' % (filename, lineno, routine))
-
-def _scons_internal_warning(e):
- """Slightly different from _scons_user_warning in that we use the
- *current call stack* rather than sys.exc_info() to get our stack trace.
- This is used by the warnings framework to print warnings."""
- filename, lineno, routine, dummy = find_deepest_user_frame(traceback.extract_stack())
- sys.stderr.write("\nscons: warning: %s\n" % e.args[0])
- sys.stderr.write('File "%s", line %d, in %s\n' % (filename, lineno, routine))
-
-def _scons_internal_error():
- """Handle all errors but user errors. Print out a message telling
- the user what to do in this case and print a normal trace.
- """
- print 'internal error'
- traceback.print_exc()
- sys.exit(2)
-
-def _SConstruct_exists(dirname='', repositories=[], filelist=None):
- """This function checks that an SConstruct file exists in a directory.
- If so, it returns the path of the file. By default, it checks the
- current directory.
- """
- if not filelist:
- filelist = ['SConstruct', 'Sconstruct', 'sconstruct']
- for file in filelist:
- sfile = os.path.join(dirname, file)
- if os.path.isfile(sfile):
- return sfile
- if not os.path.isabs(sfile):
- for rep in repositories:
- if os.path.isfile(os.path.join(rep, sfile)):
- return sfile
- return None
-
-def _set_debug_values(options):
- global print_memoizer, print_objects, print_stacktrace, print_time
-
- debug_values = options.debug
-
- if "count" in debug_values:
- # All of the object counts are within "if track_instances:" blocks,
- # which get stripped when running optimized (with python -O or
- # from compiled *.pyo files). Provide a warning if __debug__ is
- # stripped, so it doesn't just look like --debug=count is broken.
- enable_count = False
- if __debug__: enable_count = True
- if enable_count:
- count_stats.enable(sys.stdout)
- SCons.Debug.track_instances = True
- else:
- msg = "--debug=count is not supported when running SCons\n" + \
- "\twith the python -O option or optimized (.pyo) modules."
- SCons.Warnings.warn(SCons.Warnings.NoObjectCountWarning, msg)
- if "dtree" in debug_values:
- options.tree_printers.append(TreePrinter(derived=True))
- options.debug_explain = ("explain" in debug_values)
- if "findlibs" in debug_values:
- SCons.Scanner.Prog.print_find_libs = "findlibs"
- options.debug_includes = ("includes" in debug_values)
- print_memoizer = ("memoizer" in debug_values)
- if "memory" in debug_values:
- memory_stats.enable(sys.stdout)
- print_objects = ("objects" in debug_values)
- if print_objects:
- SCons.Debug.track_instances = True
- if "presub" in debug_values:
- SCons.Action.print_actions_presub = 1
- if "stacktrace" in debug_values:
- print_stacktrace = 1
- if "stree" in debug_values:
- options.tree_printers.append(TreePrinter(status=True))
- if "time" in debug_values:
- print_time = 1
- if "tree" in debug_values:
- options.tree_printers.append(TreePrinter())
- if "prepare" in debug_values:
- SCons.Taskmaster.print_prepare = 1
- if "duplicate" in debug_values:
- SCons.Node.print_duplicate = 1
-
-def _create_path(plist):
- path = '.'
- for d in plist:
- if os.path.isabs(d):
- path = d
- else:
- path = path + '/' + d
- return path
-
-def _load_site_scons_dir(topdir, site_dir_name=None):
- """Load the site_scons dir under topdir.
- Prepends site_scons to sys.path, imports site_scons/site_init.py,
- and prepends site_scons/site_tools to default toolpath."""
- if site_dir_name:
- err_if_not_found = True # user specified: err if missing
- else:
- site_dir_name = "site_scons"
- err_if_not_found = False
-
- site_dir = os.path.join(topdir, site_dir_name)
- if not os.path.exists(site_dir):
- if err_if_not_found:
- raise SCons.Errors.UserError("site dir %s not found."%site_dir)
- return
-
- site_init_filename = "site_init.py"
- site_init_modname = "site_init"
- site_tools_dirname = "site_tools"
- # prepend to sys.path
- sys.path = [os.path.abspath(site_dir)] + sys.path
- site_init_file = os.path.join(site_dir, site_init_filename)
- site_tools_dir = os.path.join(site_dir, site_tools_dirname)
- if os.path.exists(site_init_file):
- import imp, re
- # TODO(2.4): turn this into try:-except:-finally:
- try:
- try:
- fp, pathname, description = imp.find_module(site_init_modname,
- [site_dir])
- # Load the file into SCons.Script namespace. This is
- # opaque and clever; m is the module object for the
- # SCons.Script module, and the exec ... in call executes a
- # file (or string containing code) in the context of the
- # module's dictionary, so anything that code defines ends
- # up adding to that module. This is really short, but all
- # the error checking makes it longer.
- try:
- m = sys.modules['SCons.Script']
- except Exception, e:
- fmt = 'cannot import site_init.py: missing SCons.Script module %s'
- raise SCons.Errors.InternalError(fmt % repr(e))
- try:
- sfx = description[0]
- modname = os.path.basename(pathname)[:-len(sfx)]
- site_m = {"__file__": pathname, "__name__": modname, "__doc__": None}
- re_special = re.compile("__[^_]+__")
- for k in m.__dict__.keys():
- if not re_special.match(k):
- site_m[k] = m.__dict__[k]
-
- # This is the magic.
- exec fp in site_m
- except KeyboardInterrupt:
- raise
- except Exception, e:
- fmt = '*** Error loading site_init file %s:\n'
- sys.stderr.write(fmt % repr(site_init_file))
- raise
- else:
- for k in site_m:
- if not re_special.match(k):
- m.__dict__[k] = site_m[k]
- except KeyboardInterrupt:
- raise
- except ImportError, e:
- fmt = '*** cannot import site init file %s:\n'
- sys.stderr.write(fmt % repr(site_init_file))
- raise
- finally:
- if fp:
- fp.close()
- if os.path.exists(site_tools_dir):
- # prepend to DefaultToolpath
- SCons.Tool.DefaultToolpath.insert(0, os.path.abspath(site_tools_dir))
-
-def _load_all_site_scons_dirs(topdir, verbose=None):
- """Load all of the predefined site_scons dir.
- Order is significant; we load them in order from most generic
- (machine-wide) to most specific (topdir).
- The verbose argument is only for testing.
- """
- platform = SCons.Platform.platform_default()
-
- def homedir(d):
- return os.path.expanduser('~/'+d)
-
- if platform == 'win32' or platform == 'cygwin':
- # Note we use $ here instead of %...% because older
- # pythons (prior to 2.6?) didn't expand %...% on Windows.
- # This set of dirs should work on XP, Vista, 7 and later.
- sysdirs=[
- os.path.expandvars('$ALLUSERSPROFILE\\Application Data\\scons'),
- os.path.expandvars('$USERPROFILE\\Local Settings\\Application Data\\scons')]
- appdatadir = os.path.expandvars('$APPDATA\\scons')
- if appdatadir not in sysdirs:
- sysdirs.append(appdatadir)
- sysdirs.append(homedir('.scons'))
-
- elif platform == 'darwin': # MacOS X
- sysdirs=['/Library/Application Support/SCons',
- '/opt/local/share/scons', # (for MacPorts)
- '/sw/share/scons', # (for Fink)
- homedir('Library/Application Support/SCons'),
- homedir('.scons')]
- elif platform == 'sunos': # Solaris
- sysdirs=['/opt/sfw/scons',
- '/usr/share/scons',
- homedir('.scons')]
- else: # Linux, HPUX, etc.
- # assume posix-like, i.e. platform == 'posix'
- sysdirs=['/usr/share/scons',
- homedir('.scons')]
-
- dirs=sysdirs + [topdir]
- for d in dirs:
- if verbose: # this is used by unit tests.
- print "Loading site dir ", d
- _load_site_scons_dir(d)
-
-def test_load_all_site_scons_dirs(d):
- _load_all_site_scons_dirs(d, True)
-
-def version_string(label, module):
- version = module.__version__
- build = module.__build__
- if build:
- if build[0] != '.':
- build = '.' + build
- version = version + build
- fmt = "\t%s: v%s, %s, by %s on %s\n"
- return fmt % (label,
- version,
- module.__date__,
- module.__developer__,
- module.__buildsys__)
-
-def path_string(label, module):
- path = module.__path__
- return "\t%s path: %s\n"%(label,path)
-
-def _main(parser):
- global exit_status
- global this_build_status
-
- options = parser.values
-
- # Here's where everything really happens.
-
- # First order of business: set up default warnings and then
- # handle the user's warning options, so that we can issue (or
- # suppress) appropriate warnings about anything that might happen,
- # as configured by the user.
-
- default_warnings = [ SCons.Warnings.WarningOnByDefault,
- SCons.Warnings.DeprecatedWarning,
- ]
-
- for warning in default_warnings:
- SCons.Warnings.enableWarningClass(warning)
- SCons.Warnings._warningOut = _scons_internal_warning
- SCons.Warnings.process_warn_strings(options.warn)
-
- # Now that we have the warnings configuration set up, we can actually
- # issue (or suppress) any warnings about warning-worthy things that
- # occurred while the command-line options were getting parsed.
- try:
- dw = options.delayed_warnings
- except AttributeError:
- pass
- else:
- delayed_warnings.extend(dw)
- for warning_type, message in delayed_warnings:
- SCons.Warnings.warn(warning_type, message)
-
- if options.diskcheck:
- SCons.Node.FS.set_diskcheck(options.diskcheck)
-
- # Next, we want to create the FS object that represents the outside
- # world's file system, as that's central to a lot of initialization.
- # To do this, however, we need to be in the directory from which we
- # want to start everything, which means first handling any relevant
- # options that might cause us to chdir somewhere (-C, -D, -U, -u).
- if options.directory:
- script_dir = os.path.abspath(_create_path(options.directory))
- else:
- script_dir = os.getcwd()
-
- target_top = None
- if options.climb_up:
- target_top = '.' # directory to prepend to targets
- while script_dir and not _SConstruct_exists(script_dir,
- options.repository,
- options.file):
- script_dir, last_part = os.path.split(script_dir)
- if last_part:
- target_top = os.path.join(last_part, target_top)
- else:
- script_dir = ''
-
- if script_dir and script_dir != os.getcwd():
- if not options.silent:
- display("scons: Entering directory `%s'" % script_dir)
- try:
- os.chdir(script_dir)
- except OSError:
- sys.stderr.write("Could not change directory to %s\n" % script_dir)
-
- # Now that we're in the top-level SConstruct directory, go ahead
- # and initialize the FS object that represents the file system,
- # and make it the build engine default.
- fs = SCons.Node.FS.get_default_fs()
-
- for rep in options.repository:
- fs.Repository(rep)
-
- # Now that we have the FS object, the next order of business is to
- # check for an SConstruct file (or other specified config file).
- # If there isn't one, we can bail before doing any more work.
- scripts = []
- if options.file:
- scripts.extend(options.file)
- if not scripts:
- sfile = _SConstruct_exists(repositories=options.repository,
- filelist=options.file)
- if sfile:
- scripts.append(sfile)
-
- if not scripts:
- if options.help:
- # There's no SConstruct, but they specified -h.
- # Give them the options usage now, before we fail
- # trying to read a non-existent SConstruct file.
- raise SConsPrintHelpException
- raise SCons.Errors.UserError("No SConstruct file found.")
-
- if scripts[0] == "-":
- d = fs.getcwd()
- else:
- d = fs.File(scripts[0]).dir
- fs.set_SConstruct_dir(d)
-
- _set_debug_values(options)
- SCons.Node.implicit_cache = options.implicit_cache
- SCons.Node.implicit_deps_changed = options.implicit_deps_changed
- SCons.Node.implicit_deps_unchanged = options.implicit_deps_unchanged
-
- if options.no_exec:
- SCons.SConf.dryrun = 1
- SCons.Action.execute_actions = None
- if options.question:
- SCons.SConf.dryrun = 1
- if options.clean:
- SCons.SConf.SetBuildType('clean')
- if options.help:
- SCons.SConf.SetBuildType('help')
- SCons.SConf.SetCacheMode(options.config)
- SCons.SConf.SetProgressDisplay(progress_display)
-
- if options.no_progress or options.silent:
- progress_display.set_mode(0)
-
- if options.site_dir:
- _load_site_scons_dir(d.get_internal_path(), options.site_dir)
- elif not options.no_site_dir:
- _load_all_site_scons_dirs(d.get_internal_path())
-
- if options.include_dir:
- sys.path = options.include_dir + sys.path
-
- # If we're about to start SCons in the interactive mode,
- # inform the FS about this right here. Else, the release_target_info
- # method could get called on some nodes, like the used "gcc" compiler,
- # when using the Configure methods within the SConscripts.
- # This would then cause subtle bugs, as already happened in #2971.
- if options.interactive:
- SCons.Node.interactive = True
-
- # That should cover (most of) the options. Next, set up the variables
- # that hold command-line arguments, so the SConscript files that we
- # read and execute have access to them.
- targets = []
- xmit_args = []
- for a in parser.largs:
- if a[:1] == '-':
- continue
- if '=' in a:
- xmit_args.append(a)
- else:
- targets.append(a)
- SCons.Script._Add_Targets(targets + parser.rargs)
- SCons.Script._Add_Arguments(xmit_args)
-
- # If stdout is not a tty, replace it with a wrapper object to call flush
- # after every write.
- #
- # Tty devices automatically flush after every newline, so the replacement
- # isn't necessary. Furthermore, if we replace sys.stdout, the readline
- # module will no longer work. This affects the behavior during
- # --interactive mode. --interactive should only be used when stdin and
- # stdout refer to a tty.
- if not hasattr(sys.stdout, 'isatty') or not sys.stdout.isatty():
- sys.stdout = SCons.Util.Unbuffered(sys.stdout)
- if not hasattr(sys.stderr, 'isatty') or not sys.stderr.isatty():
- sys.stderr = SCons.Util.Unbuffered(sys.stderr)
-
- memory_stats.append('before reading SConscript files:')
- count_stats.append(('pre-', 'read'))
-
- # And here's where we (finally) read the SConscript files.
-
- progress_display("scons: Reading SConscript files ...")
-
- start_time = time.time()
- try:
- for script in scripts:
- SCons.Script._SConscript._SConscript(fs, script)
- except SCons.Errors.StopError, e:
- # We had problems reading an SConscript file, such as it
- # couldn't be copied in to the VariantDir. Since we're just
- # reading SConscript files and haven't started building
- # things yet, stop regardless of whether they used -i or -k
- # or anything else.
- revert_io()
- sys.stderr.write("scons: *** %s Stop.\n" % e)
- sys.exit(2)
- global sconscript_time
- sconscript_time = time.time() - start_time
-
- progress_display("scons: done reading SConscript files.")
-
- memory_stats.append('after reading SConscript files:')
- count_stats.append(('post-', 'read'))
-
- # Re-{enable,disable} warnings in case they disabled some in
- # the SConscript file.
- #
- # We delay enabling the PythonVersionWarning class until here so that,
- # if they explicity disabled it in either in the command line or in
- # $SCONSFLAGS, or in the SConscript file, then the search through
- # the list of deprecated warning classes will find that disabling
- # first and not issue the warning.
- #SCons.Warnings.enableWarningClass(SCons.Warnings.PythonVersionWarning)
- SCons.Warnings.process_warn_strings(options.warn)
-
- # Now that we've read the SConscript files, we can check for the
- # warning about deprecated Python versions--delayed until here
- # in case they disabled the warning in the SConscript files.
- if python_version_deprecated():
- msg = "Support for pre-%s Python version (%s) is deprecated.\n" + \
- " If this will cause hardship, contact scons-dev@scons.org"
- deprecated_version_string = ".".join(map(str, deprecated_python_version))
- SCons.Warnings.warn(SCons.Warnings.PythonVersionWarning,
- msg % (deprecated_version_string, python_version_string()))
-
- if not options.help:
- # [ ] Clarify why we need to create Builder here at all, and
- # why it is created in DefaultEnvironment
- # https://bitbucket.org/scons/scons/commits/d27a548aeee8ad5e67ea75c2d19a7d305f784e30
- if SCons.SConf.NeedConfigHBuilder():
- SCons.SConf.CreateConfigHBuilder(SCons.Defaults.DefaultEnvironment())
-
- # Now re-parse the command-line options (any to the left of a '--'
- # argument, that is) with any user-defined command-line options that
- # the SConscript files may have added to the parser object. This will
- # emit the appropriate error message and exit if any unknown option
- # was specified on the command line.
-
- parser.preserve_unknown_options = False
- parser.parse_args(parser.largs, options)
-
- if options.help:
- help_text = SCons.Script.help_text
- if help_text is None:
- # They specified -h, but there was no Help() inside the
- # SConscript files. Give them the options usage.
- raise SConsPrintHelpException
- else:
- print help_text
- print "Use scons -H for help about command-line options."
- exit_status = 0
- return
-
- # Change directory to the top-level SConstruct directory, then tell
- # the Node.FS subsystem that we're all done reading the SConscript
- # files and calling Repository() and VariantDir() and changing
- # directories and the like, so it can go ahead and start memoizing
- # the string values of file system nodes.
-
- fs.chdir(fs.Top)
-
- SCons.Node.FS.save_strings(1)
-
- # Now that we've read the SConscripts we can set the options
- # that are SConscript settable:
- SCons.Node.implicit_cache = options.implicit_cache
- SCons.Node.FS.set_duplicate(options.duplicate)
- fs.set_max_drift(options.max_drift)
-
- SCons.Job.explicit_stack_size = options.stack_size
-
- if options.md5_chunksize:
- SCons.Node.FS.File.md5_chunksize = options.md5_chunksize
-
- platform = SCons.Platform.platform_module()
-
- if options.interactive:
- SCons.Script.Interactive.interact(fs, OptionsParser, options,
- targets, target_top)
-
- else:
-
- # Build the targets
- nodes = _build_targets(fs, options, targets, target_top)
- if not nodes:
- revert_io()
- print 'Found nothing to build'
- exit_status = 2
-
-def _build_targets(fs, options, targets, target_top):
-
- global this_build_status
- this_build_status = 0
-
- progress_display.set_mode(not (options.no_progress or options.silent))
- display.set_mode(not options.silent)
- SCons.Action.print_actions = not options.silent
- SCons.Action.execute_actions = not options.no_exec
- SCons.Node.do_store_info = not options.no_exec
- SCons.SConf.dryrun = options.no_exec
-
- if options.diskcheck:
- SCons.Node.FS.set_diskcheck(options.diskcheck)
-
- SCons.CacheDir.cache_enabled = not options.cache_disable
- SCons.CacheDir.cache_readonly = options.cache_readonly
- SCons.CacheDir.cache_debug = options.cache_debug
- SCons.CacheDir.cache_force = options.cache_force
- SCons.CacheDir.cache_show = options.cache_show
-
- if options.no_exec:
- CleanTask.execute = CleanTask.show
- else:
- CleanTask.execute = CleanTask.remove
-
- lookup_top = None
- if targets or SCons.Script.BUILD_TARGETS != SCons.Script._build_plus_default:
- # They specified targets on the command line or modified
- # BUILD_TARGETS in the SConscript file(s), so if they used -u,
- # -U or -D, we have to look up targets relative to the top,
- # but we build whatever they specified.
- if target_top:
- lookup_top = fs.Dir(target_top)
- target_top = None
-
- targets = SCons.Script.BUILD_TARGETS
- else:
- # There are no targets specified on the command line,
- # so if they used -u, -U or -D, we may have to restrict
- # what actually gets built.
- d = None
- if target_top:
- if options.climb_up == 1:
- # -u, local directory and below
- target_top = fs.Dir(target_top)
- lookup_top = target_top
- elif options.climb_up == 2:
- # -D, all Default() targets
- target_top = None
- lookup_top = None
- elif options.climb_up == 3:
- # -U, local SConscript Default() targets
- target_top = fs.Dir(target_top)
- def check_dir(x, target_top=target_top):
- if hasattr(x, 'cwd') and not x.cwd is None:
- cwd = x.cwd.srcnode()
- return cwd == target_top
- else:
- # x doesn't have a cwd, so it's either not a target,
- # or not a file, so go ahead and keep it as a default
- # target and let the engine sort it out:
- return 1
- d = list(filter(check_dir, SCons.Script.DEFAULT_TARGETS))
- SCons.Script.DEFAULT_TARGETS[:] = d
- target_top = None
- lookup_top = None
-
- targets = SCons.Script._Get_Default_Targets(d, fs)
-
- if not targets:
- sys.stderr.write("scons: *** No targets specified and no Default() targets found. Stop.\n")
- return None
-
- def Entry(x, ltop=lookup_top, ttop=target_top, fs=fs):
- if isinstance(x, SCons.Node.Node):
- node = x
- else:
- node = None
- # Why would ltop be None? Unfortunately this happens.
- if ltop is None: ltop = ''
- # Curdir becomes important when SCons is called with -u, -C,
- # or similar option that changes directory, and so the paths
- # of targets given on the command line need to be adjusted.
- curdir = os.path.join(os.getcwd(), str(ltop))
- for lookup in SCons.Node.arg2nodes_lookups:
- node = lookup(x, curdir=curdir)
- if node is not None:
- break
- if node is None:
- node = fs.Entry(x, directory=ltop, create=1)
- if ttop and not node.is_under(ttop):
- if isinstance(node, SCons.Node.FS.Dir) and ttop.is_under(node):
- node = ttop
- else:
- node = None
- return node
-
- nodes = [_f for _f in map(Entry, targets) if _f]
-
- task_class = BuildTask # default action is to build targets
- opening_message = "Building targets ..."
- closing_message = "done building targets."
- if options.keep_going:
- failure_message = "done building targets (errors occurred during build)."
- else:
- failure_message = "building terminated because of errors."
- if options.question:
- task_class = QuestionTask
- try:
- if options.clean:
- task_class = CleanTask
- opening_message = "Cleaning targets ..."
- closing_message = "done cleaning targets."
- if options.keep_going:
- failure_message = "done cleaning targets (errors occurred during clean)."
- else:
- failure_message = "cleaning terminated because of errors."
- except AttributeError:
- pass
-
- task_class.progress = ProgressObject
-
- if options.random:
- def order(dependencies):
- """Randomize the dependencies."""
- import random
- # This is cribbed from the implementation of
- # random.shuffle() in Python 2.X.
- d = dependencies
- for i in range(len(d)-1, 0, -1):
- j = int(random.random() * (i+1))
- d[i], d[j] = d[j], d[i]
- return d
- else:
- def order(dependencies):
- """Leave the order of dependencies alone."""
- return dependencies
-
- if options.taskmastertrace_file == '-':
- tmtrace = sys.stdout
- elif options.taskmastertrace_file:
- tmtrace = open(options.taskmastertrace_file, 'wb')
- else:
- tmtrace = None
- taskmaster = SCons.Taskmaster.Taskmaster(nodes, task_class, order, tmtrace)
-
- # Let the BuildTask objects get at the options to respond to the
- # various print_* settings, tree_printer list, etc.
- BuildTask.options = options
-
- global num_jobs
- num_jobs = options.num_jobs
- jobs = SCons.Job.Jobs(num_jobs, taskmaster)
- if num_jobs > 1:
- msg = None
- if jobs.num_jobs == 1:
- msg = "parallel builds are unsupported by this version of Python;\n" + \
- "\tignoring -j or num_jobs option.\n"
- elif sys.platform == 'win32':
- msg = fetch_win32_parallel_msg()
- if msg:
- SCons.Warnings.warn(SCons.Warnings.NoParallelSupportWarning, msg)
-
- memory_stats.append('before building targets:')
- count_stats.append(('pre-', 'build'))
-
- def jobs_postfunc(
- jobs=jobs,
- options=options,
- closing_message=closing_message,
- failure_message=failure_message
- ):
- if jobs.were_interrupted():
- if not options.no_progress and not options.silent:
- sys.stderr.write("scons: Build interrupted.\n")
- global exit_status
- global this_build_status
- exit_status = 2
- this_build_status = 2
-
- if this_build_status:
- progress_display("scons: " + failure_message)
- else:
- progress_display("scons: " + closing_message)
- if not options.no_exec:
- if jobs.were_interrupted():
- progress_display("scons: writing .sconsign file.")
- SCons.SConsign.write()
-
- progress_display("scons: " + opening_message)
- jobs.run(postfunc = jobs_postfunc)
-
- memory_stats.append('after building targets:')
- count_stats.append(('post-', 'build'))
-
- return nodes
-
-def _exec_main(parser, values):
- sconsflags = os.environ.get('SCONSFLAGS', '')
- all_args = sconsflags.split() + sys.argv[1:]
-
- options, args = parser.parse_args(all_args, values)
-
- if isinstance(options.debug, list) and "pdb" in options.debug:
- import pdb
- pdb.Pdb().runcall(_main, parser)
- elif options.profile_file:
- # compat layer imports "cProfile" for us if it's available.
- from profile import Profile
-
- # Some versions of Python 2.4 shipped a profiler that had the
- # wrong 'c_exception' entry in its dispatch table. Make sure
- # we have the right one. (This may put an unnecessary entry
- # in the table in earlier versions of Python, but its presence
- # shouldn't hurt anything).
- try:
- dispatch = Profile.dispatch
- except AttributeError:
- pass
- else:
- dispatch['c_exception'] = Profile.trace_dispatch_return
-
- prof = Profile()
- try:
- prof.runcall(_main, parser)
- finally:
- prof.dump_stats(options.profile_file)
- else:
- _main(parser)
-
-def main():
- global OptionsParser
- global exit_status
- global first_command_start
-
- # Check up front for a Python version we do not support. We
- # delay the check for deprecated Python versions until later,
- # after the SConscript files have been read, in case they
- # disable that warning.
- if python_version_unsupported():
- msg = "scons: *** SCons version %s does not run under Python version %s.\n"
- sys.stderr.write(msg % (SCons.__version__, python_version_string()))
- sys.exit(1)
-
- parts = ["SCons by Steven Knight et al.:\n"]
- try:
- import __main__
- parts.append(version_string("script", __main__))
- except (ImportError, AttributeError):
- # On Windows there is no scons.py, so there is no
- # __main__.__version__, hence there is no script version.
- pass
- parts.append(version_string("engine", SCons))
- parts.append(path_string("engine", SCons))
- parts.append("Copyright (c) 2001 - 2015 The SCons Foundation")
- version = ''.join(parts)
-
- import SConsOptions
- parser = SConsOptions.Parser(version)
- values = SConsOptions.SConsValues(parser.get_default_values())
-
- OptionsParser = parser
-
- try:
- try:
- _exec_main(parser, values)
- finally:
- revert_io()
- except SystemExit, s:
- if s:
- exit_status = s
- except KeyboardInterrupt:
- print("scons: Build interrupted.")
- sys.exit(2)
- except SyntaxError, e:
- _scons_syntax_error(e)
- except SCons.Errors.InternalError:
- _scons_internal_error()
- except SCons.Errors.UserError, e:
- _scons_user_error(e)
- except SConsPrintHelpException:
- parser.print_help()
- exit_status = 0
- except SCons.Errors.BuildError, e:
- print e
- exit_status = e.exitstatus
- except:
- # An exception here is likely a builtin Python exception Python
- # code in an SConscript file. Show them precisely what the
- # problem was and where it happened.
- SCons.Script._SConscript.SConscript_exception()
- sys.exit(2)
-
- memory_stats.print_stats()
- count_stats.print_stats()
-
- if print_objects:
- SCons.Debug.listLoggedInstances('*')
- #SCons.Debug.dumpLoggedInstances('*')
-
- if print_memoizer:
- SCons.Memoize.Dump("Memoizer (memory cache) hits and misses:")
-
- # Dump any development debug info that may have been enabled.
- # These are purely for internal debugging during development, so
- # there's no need to control them with --debug= options; they're
- # controlled by changing the source code.
- SCons.Debug.dump_caller_counts()
- SCons.Taskmaster.dump_stats()
-
- if print_time:
- total_time = time.time() - SCons.Script.start_time
- if num_jobs == 1:
- ct = cumulative_command_time
- else:
- if last_command_end is None or first_command_start is None:
- ct = 0.0
- else:
- ct = last_command_end - first_command_start
- scons_time = total_time - sconscript_time - ct
- print "Total build time: %f seconds"%total_time
- print "Total SConscript file execution time: %f seconds"%sconscript_time
- print "Total SCons execution time: %f seconds"%scons_time
- print "Total command execution time: %f seconds"%ct
-
- sys.exit(exit_status)
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Script/SConsOptions.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Script/SConsOptions.py
deleted file mode 100644
index 7e458aa..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Script/SConsOptions.py
+++ /dev/null
@@ -1,1020 +0,0 @@
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-
-__revision__ = "src/engine/SCons/Script/SConsOptions.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-import optparse
-import re
-import sys
-import textwrap
-
-no_hyphen_re = re.compile(r'(\s+|(?<=[\w\!\"\'\&\.\,\?])-{2,}(?=\w))')
-
-try:
- from gettext import gettext
-except ImportError:
- def gettext(message):
- return message
-_ = gettext
-
-import SCons.Node.FS
-import SCons.Warnings
-
-OptionValueError = optparse.OptionValueError
-SUPPRESS_HELP = optparse.SUPPRESS_HELP
-
-diskcheck_all = SCons.Node.FS.diskcheck_types()
-
-def diskcheck_convert(value):
- if value is None:
- return []
- if not SCons.Util.is_List(value):
- value = value.split(',')
- result = []
- for v in value:
- v = v.lower()
- if v == 'all':
- result = diskcheck_all
- elif v == 'none':
- result = []
- elif v in diskcheck_all:
- result.append(v)
- else:
- raise ValueError(v)
- return result
-
-class SConsValues(optparse.Values):
- """
- Holder class for uniform access to SCons options, regardless
- of whether or not they can be set on the command line or in the
- SConscript files (using the SetOption() function).
-
- A SCons option value can originate three different ways:
-
- 1) set on the command line;
- 2) set in an SConscript file;
- 3) the default setting (from the the op.add_option()
- calls in the Parser() function, below).
-
- The command line always overrides a value set in a SConscript file,
- which in turn always overrides default settings. Because we want
- to support user-specified options in the SConscript file itself,
- though, we may not know about all of the options when the command
- line is first parsed, so we can't make all the necessary precedence
- decisions at the time the option is configured.
-
- The solution implemented in this class is to keep these different sets
- of settings separate (command line, SConscript file, and default)
- and to override the __getattr__() method to check them in turn.
- This should allow the rest of the code to just fetch values as
- attributes of an instance of this class, without having to worry
- about where they came from.
-
- Note that not all command line options are settable from SConscript
- files, and the ones that are must be explicitly added to the
- "settable" list in this class, and optionally validated and coerced
- in the set_option() method.
- """
-
- def __init__(self, defaults):
- self.__dict__['__defaults__'] = defaults
- self.__dict__['__SConscript_settings__'] = {}
-
- def __getattr__(self, attr):
- """
- Fetches an options value, checking first for explicit settings
- from the command line (which are direct attributes), then the
- SConscript file settings, then the default values.
- """
- try:
- return self.__dict__[attr]
- except KeyError:
- try:
- return self.__dict__['__SConscript_settings__'][attr]
- except KeyError:
- return getattr(self.__dict__['__defaults__'], attr)
-
- settable = [
- 'clean',
- 'diskcheck',
- 'duplicate',
- 'help',
- 'implicit_cache',
- 'max_drift',
- 'md5_chunksize',
- 'no_exec',
- 'num_jobs',
- 'random',
- 'stack_size',
- 'warn',
- ]
-
- def set_option(self, name, value):
- """
- Sets an option from an SConscript file.
- """
- if not name in self.settable:
- raise SCons.Errors.UserError("This option is not settable from a SConscript file: %s"%name)
-
- if name == 'num_jobs':
- try:
- value = int(value)
- if value < 1:
- raise ValueError
- except ValueError:
- raise SCons.Errors.UserError("A positive integer is required: %s"%repr(value))
- elif name == 'max_drift':
- try:
- value = int(value)
- except ValueError:
- raise SCons.Errors.UserError("An integer is required: %s"%repr(value))
- elif name == 'duplicate':
- try:
- value = str(value)
- except ValueError:
- raise SCons.Errors.UserError("A string is required: %s"%repr(value))
- if not value in SCons.Node.FS.Valid_Duplicates:
- raise SCons.Errors.UserError("Not a valid duplication style: %s" % value)
- # Set the duplicate style right away so it can affect linking
- # of SConscript files.
- SCons.Node.FS.set_duplicate(value)
- elif name == 'diskcheck':
- try:
- value = diskcheck_convert(value)
- except ValueError, v:
- raise SCons.Errors.UserError("Not a valid diskcheck value: %s"%v)
- if 'diskcheck' not in self.__dict__:
- # No --diskcheck= option was specified on the command line.
- # Set this right away so it can affect the rest of the
- # file/Node lookups while processing the SConscript files.
- SCons.Node.FS.set_diskcheck(value)
- elif name == 'stack_size':
- try:
- value = int(value)
- except ValueError:
- raise SCons.Errors.UserError("An integer is required: %s"%repr(value))
- elif name == 'md5_chunksize':
- try:
- value = int(value)
- except ValueError:
- raise SCons.Errors.UserError("An integer is required: %s"%repr(value))
- elif name == 'warn':
- if SCons.Util.is_String(value):
- value = [value]
- value = self.__SConscript_settings__.get(name, []) + value
- SCons.Warnings.process_warn_strings(value)
-
- self.__SConscript_settings__[name] = value
-
-class SConsOption(optparse.Option):
- def convert_value(self, opt, value):
- if value is not None:
- if self.nargs in (1, '?'):
- return self.check_value(opt, value)
- else:
- return tuple([self.check_value(opt, v) for v in value])
-
- def process(self, opt, value, values, parser):
-
- # First, convert the value(s) to the right type. Howl if any
- # value(s) are bogus.
- value = self.convert_value(opt, value)
-
- # And then take whatever action is expected of us.
- # This is a separate method to make life easier for
- # subclasses to add new actions.
- return self.take_action(
- self.action, self.dest, opt, value, values, parser)
-
- def _check_nargs_optional(self):
- if self.nargs == '?' and self._short_opts:
- fmt = "option %s: nargs='?' is incompatible with short options"
- raise SCons.Errors.UserError(fmt % self._short_opts[0])
-
- try:
- _orig_CONST_ACTIONS = optparse.Option.CONST_ACTIONS
-
- _orig_CHECK_METHODS = optparse.Option.CHECK_METHODS
-
- except AttributeError:
- # optparse.Option had no CONST_ACTIONS before Python 2.5.
-
- _orig_CONST_ACTIONS = ("store_const",)
-
- def _check_const(self):
- if self.action not in self.CONST_ACTIONS and self.const is not None:
- raise OptionError(
- "'const' must not be supplied for action %r" % self.action,
- self)
-
- # optparse.Option collects its list of unbound check functions
- # up front. This sucks because it means we can't just override
- # the _check_const() function like a normal method, we have to
- # actually replace it in the list. This seems to be the most
- # straightforward way to do that.
-
- _orig_CHECK_METHODS = [optparse.Option._check_action,
- optparse.Option._check_type,
- optparse.Option._check_choice,
- optparse.Option._check_dest,
- _check_const,
- optparse.Option._check_nargs,
- optparse.Option._check_callback]
-
- CHECK_METHODS = _orig_CHECK_METHODS + [_check_nargs_optional]
-
- CONST_ACTIONS = _orig_CONST_ACTIONS + optparse.Option.TYPED_ACTIONS
-
-class SConsOptionGroup(optparse.OptionGroup):
- """
- A subclass for SCons-specific option groups.
-
- The only difference between this and the base class is that we print
- the group's help text flush left, underneath their own title but
- lined up with the normal "SCons Options".
- """
- def format_help(self, formatter):
- """
- Format an option group's help text, outdenting the title so it's
- flush with the "SCons Options" title we print at the top.
- """
- formatter.dedent()
- result = formatter.format_heading(self.title)
- formatter.indent()
- result = result + optparse.OptionContainer.format_help(self, formatter)
- return result
-
-class SConsOptionParser(optparse.OptionParser):
- preserve_unknown_options = False
-
- def error(self, msg):
- # overriden OptionValueError exception handler
- self.print_usage(sys.stderr)
- sys.stderr.write("SCons Error: %s\n" % msg)
- sys.exit(2)
-
- def _process_long_opt(self, rargs, values):
- """
- SCons-specific processing of long options.
-
- This is copied directly from the normal
- optparse._process_long_opt() method, except that, if configured
- to do so, we catch the exception thrown when an unknown option
- is encountered and just stick it back on the "leftover" arguments
- for later (re-)processing.
- """
- arg = rargs.pop(0)
-
- # Value explicitly attached to arg? Pretend it's the next
- # argument.
- if "=" in arg:
- (opt, next_arg) = arg.split("=", 1)
- rargs.insert(0, next_arg)
- had_explicit_value = True
- else:
- opt = arg
- had_explicit_value = False
-
- try:
- opt = self._match_long_opt(opt)
- except optparse.BadOptionError:
- if self.preserve_unknown_options:
- # SCons-specific: if requested, add unknown options to
- # the "leftover arguments" list for later processing.
- self.largs.append(arg)
- if had_explicit_value:
- # The unknown option will be re-processed later,
- # so undo the insertion of the explicit value.
- rargs.pop(0)
- return
- raise
-
- option = self._long_opt[opt]
- if option.takes_value():
- nargs = option.nargs
- if nargs == '?':
- if had_explicit_value:
- value = rargs.pop(0)
- else:
- value = option.const
- elif len(rargs) < nargs:
- if nargs == 1:
- if not option.choices:
- self.error(_("%s option requires an argument") % opt)
- else:
- msg = _("%s option requires an argument " % opt)
- msg += _("(choose from %s)"
- % ', '.join(option.choices))
- self.error(msg)
- else:
- self.error(_("%s option requires %d arguments")
- % (opt, nargs))
- elif nargs == 1:
- value = rargs.pop(0)
- else:
- value = tuple(rargs[0:nargs])
- del rargs[0:nargs]
-
- elif had_explicit_value:
- self.error(_("%s option does not take a value") % opt)
-
- else:
- value = None
-
- option.process(opt, value, values, self)
-
- def reparse_local_options(self):
- """
- Re-parse the leftover command-line options stored
- in self.largs, so that any value overridden on the
- command line is immediately available if the user turns
- around and does a GetOption() right away.
-
- We mimic the processing of the single args
- in the original OptionParser._process_args(), but here we
- allow exact matches for long-opts only (no partial
- argument names!).
-
- Else, this would lead to problems in add_local_option()
- below. When called from there, we try to reparse the
- command-line arguments that
- 1. haven't been processed so far (self.largs), but
- 2. are possibly not added to the list of options yet.
-
- So, when we only have a value for "--myargument" yet,
- a command-line argument of "--myarg=test" would set it.
- Responsible for this behaviour is the method
- _match_long_opt(), which allows for partial matches of
- the option name, as long as the common prefix appears to
- be unique.
- This would lead to further confusion, because we might want
- to add another option "--myarg" later on (see issue #2929).
-
- """
- rargs = []
- largs_restore = []
- # Loop over all remaining arguments
- skip = False
- for l in self.largs:
- if skip:
- # Accept all remaining arguments as they are
- largs_restore.append(l)
- else:
- if len(l) > 2 and l[0:2] == "--":
- # Check long option
- lopt = (l,)
- if "=" in l:
- # Split into option and value
- lopt = l.split("=", 1)
-
- if lopt[0] in self._long_opt:
- # Argument is already known
- rargs.append('='.join(lopt))
- else:
- # Not known yet, so reject for now
- largs_restore.append('='.join(lopt))
- else:
- if l == "--" or l == "-":
- # Stop normal processing and don't
- # process the rest of the command-line opts
- largs_restore.append(l)
- skip = True
- else:
- rargs.append(l)
-
- # Parse the filtered list
- self.parse_args(rargs, self.values)
- # Restore the list of remaining arguments for the
- # next call of AddOption/add_local_option...
- self.largs = self.largs + largs_restore
-
- def add_local_option(self, *args, **kw):
- """
- Adds a local option to the parser.
-
- This is initiated by a SetOption() call to add a user-defined
- command-line option. We add the option to a separate option
- group for the local options, creating the group if necessary.
- """
- try:
- group = self.local_option_group
- except AttributeError:
- group = SConsOptionGroup(self, 'Local Options')
- group = self.add_option_group(group)
- self.local_option_group = group
-
- result = group.add_option(*args, **kw)
-
- if result:
- # The option was added succesfully. We now have to add the
- # default value to our object that holds the default values
- # (so that an attempt to fetch the option's attribute will
- # yield the default value when not overridden) and then
- # we re-parse the leftover command-line options, so that
- # any value overridden on the command line is immediately
- # available if the user turns around and does a GetOption()
- # right away.
- setattr(self.values.__defaults__, result.dest, result.default)
- self.reparse_local_options()
-
- return result
-
-class SConsIndentedHelpFormatter(optparse.IndentedHelpFormatter):
- def format_usage(self, usage):
- return "usage: %s\n" % usage
-
- def format_heading(self, heading):
- """
- This translates any heading of "options" or "Options" into
- "SCons Options." Unfortunately, we have to do this here,
- because those titles are hard-coded in the optparse calls.
- """
- if heading == 'options':
- # The versions of optparse.py shipped with Pythons 2.3 and
- # 2.4 pass this in uncapitalized; override that so we get
- # consistent output on all versions.
- heading = "Options"
- if heading == 'Options':
- heading = "SCons Options"
- return optparse.IndentedHelpFormatter.format_heading(self, heading)
-
- def format_option(self, option):
- """
- A copy of the normal optparse.IndentedHelpFormatter.format_option()
- method. This has been snarfed so we can modify text wrapping to
- out liking:
-
- -- add our own regular expression that doesn't break on hyphens
- (so things like --no-print-directory don't get broken);
-
- -- wrap the list of options themselves when it's too long
- (the wrapper.fill(opts) call below);
-
- -- set the subsequent_indent when wrapping the help_text.
- """
- # The help for each option consists of two parts:
- # * the opt strings and metavars
- # eg. ("-x", or "-fFILENAME, --file=FILENAME")
- # * the user-supplied help string
- # eg. ("turn on expert mode", "read data from FILENAME")
- #
- # If possible, we write both of these on the same line:
- # -x turn on expert mode
- #
- # But if the opt string list is too long, we put the help
- # string on a second line, indented to the same column it would
- # start in if it fit on the first line.
- # -fFILENAME, --file=FILENAME
- # read data from FILENAME
- result = []
-
- try:
- opts = self.option_strings[option]
- except AttributeError:
- # The Python 2.3 version of optparse attaches this to
- # to the option argument, not to this object.
- opts = option.option_strings
-
- opt_width = self.help_position - self.current_indent - 2
- if len(opts) > opt_width:
- wrapper = textwrap.TextWrapper(width=self.width,
- initial_indent = ' ',
- subsequent_indent = ' ')
- wrapper.wordsep_re = no_hyphen_re
- opts = wrapper.fill(opts) + '\n'
- indent_first = self.help_position
- else: # start help on same line as opts
- opts = "%*s%-*s " % (self.current_indent, "", opt_width, opts)
- indent_first = 0
- result.append(opts)
- if option.help:
-
- try:
- expand_default = self.expand_default
- except AttributeError:
- # The HelpFormatter base class in the Python 2.3 version
- # of optparse has no expand_default() method.
- help_text = option.help
- else:
- help_text = expand_default(option)
-
- # SCons: indent every line of the help text but the first.
- wrapper = textwrap.TextWrapper(width=self.help_width,
- subsequent_indent = ' ')
- wrapper.wordsep_re = no_hyphen_re
- help_lines = wrapper.wrap(help_text)
- result.append("%*s%s\n" % (indent_first, "", help_lines[0]))
- for line in help_lines[1:]:
- result.append("%*s%s\n" % (self.help_position, "", line))
- elif opts[-1] != "\n":
- result.append("\n")
- return "".join(result)
-
- # For consistent help output across Python versions, we provide a
- # subclass copy of format_option_strings() and these two variables.
- # This is necessary (?) for Python2.3, which otherwise concatenates
- # a short option with its metavar.
- _short_opt_fmt = "%s %s"
- _long_opt_fmt = "%s=%s"
-
- def format_option_strings(self, option):
- """Return a comma-separated list of option strings & metavariables."""
- if option.takes_value():
- metavar = option.metavar or option.dest.upper()
- short_opts = []
- for sopt in option._short_opts:
- short_opts.append(self._short_opt_fmt % (sopt, metavar))
- long_opts = []
- for lopt in option._long_opts:
- long_opts.append(self._long_opt_fmt % (lopt, metavar))
- else:
- short_opts = option._short_opts
- long_opts = option._long_opts
-
- if self.short_first:
- opts = short_opts + long_opts
- else:
- opts = long_opts + short_opts
-
- return ", ".join(opts)
-
-def Parser(version):
- """
- Returns an options parser object initialized with the standard
- SCons options.
- """
-
- formatter = SConsIndentedHelpFormatter(max_help_position=30)
-
- op = SConsOptionParser(option_class=SConsOption,
- add_help_option=False,
- formatter=formatter,
- usage="usage: scons [OPTION] [TARGET] ...",)
-
- op.preserve_unknown_options = True
- op.version = version
-
- # Add the options to the parser we just created.
- #
- # These are in the order we want them to show up in the -H help
- # text, basically alphabetical. Each op.add_option() call below
- # should have a consistent format:
- #
- # op.add_option("-L", "--long-option-name",
- # nargs=1, type="string",
- # dest="long_option_name", default='foo',
- # action="callback", callback=opt_long_option,
- # help="help text goes here",
- # metavar="VAR")
- #
- # Even though the optparse module constructs reasonable default
- # destination names from the long option names, we're going to be
- # explicit about each one for easier readability and so this code
- # will at least show up when grepping the source for option attribute
- # names, or otherwise browsing the source code.
-
- # options ignored for compatibility
- def opt_ignore(option, opt, value, parser):
- sys.stderr.write("Warning: ignoring %s option\n" % opt)
- op.add_option("-b", "-d", "-e", "-m", "-S", "-t", "-w",
- "--environment-overrides",
- "--no-keep-going",
- "--no-print-directory",
- "--print-directory",
- "--stop",
- "--touch",
- action="callback", callback=opt_ignore,
- help="Ignored for compatibility.")
-
- op.add_option('-c', '--clean', '--remove',
- dest="clean", default=False,
- action="store_true",
- help="Remove specified targets and dependencies.")
-
- op.add_option('-C', '--directory',
- nargs=1, type="string",
- dest="directory", default=[],
- action="append",
- help="Change to DIR before doing anything.",
- metavar="DIR")
-
- op.add_option('--cache-debug',
- nargs=1,
- dest="cache_debug", default=None,
- action="store",
- help="Print CacheDir debug info to FILE.",
- metavar="FILE")
-
- op.add_option('--cache-disable', '--no-cache',
- dest='cache_disable', default=False,
- action="store_true",
- help="Do not retrieve built targets from CacheDir.")
-
- op.add_option('--cache-force', '--cache-populate',
- dest='cache_force', default=False,
- action="store_true",
- help="Copy already-built targets into the CacheDir.")
-
- op.add_option('--cache-readonly',
- dest='cache_readonly', default=False,
- action="store_true",
- help="Do not update CacheDir with built targets.")
-
- op.add_option('--cache-show',
- dest='cache_show', default=False,
- action="store_true",
- help="Print build actions for files from CacheDir.")
-
- def opt_invalid(group, value, options):
- errmsg = "`%s' is not a valid %s option type, try:\n" % (value, group)
- return errmsg + " %s" % ", ".join(options)
-
- config_options = ["auto", "force" ,"cache"]
-
- opt_config_help = "Controls Configure subsystem: %s." \
- % ", ".join(config_options)
-
- op.add_option('--config',
- nargs=1, choices=config_options,
- dest="config", default="auto",
- help = opt_config_help,
- metavar="MODE")
-
- op.add_option('-D',
- dest="climb_up", default=None,
- action="store_const", const=2,
- help="Search up directory tree for SConstruct, "
- "build all Default() targets.")
-
- deprecated_debug_options = {
- "dtree" : '; please use --tree=derived instead',
- "nomemoizer" : ' and has no effect',
- "stree" : '; please use --tree=all,status instead',
- "tree" : '; please use --tree=all instead',
- }
-
- debug_options = ["count", "duplicate", "explain", "findlibs",
- "includes", "memoizer", "memory", "objects",
- "pdb", "prepare", "presub", "stacktrace",
- "time"]
-
- def opt_debug(option, opt, value__, parser,
- debug_options=debug_options,
- deprecated_debug_options=deprecated_debug_options):
- for value in value__.split(','):
- if value in debug_options:
- parser.values.debug.append(value)
- elif value in deprecated_debug_options.keys():
- parser.values.debug.append(value)
- try:
- parser.values.delayed_warnings
- except AttributeError:
- parser.values.delayed_warnings = []
- msg = deprecated_debug_options[value]
- w = "The --debug=%s option is deprecated%s." % (value, msg)
- t = (SCons.Warnings.DeprecatedDebugOptionsWarning, w)
- parser.values.delayed_warnings.append(t)
- else:
- raise OptionValueError(opt_invalid('debug', value, debug_options))
-
- opt_debug_help = "Print various types of debugging information: %s." \
- % ", ".join(debug_options)
- op.add_option('--debug',
- nargs=1, type="string",
- dest="debug", default=[],
- action="callback", callback=opt_debug,
- help=opt_debug_help,
- metavar="TYPE")
-
- def opt_diskcheck(option, opt, value, parser):
- try:
- diskcheck_value = diskcheck_convert(value)
- except ValueError, e:
- raise OptionValueError("`%s' is not a valid diskcheck type" % e)
- setattr(parser.values, option.dest, diskcheck_value)
-
- op.add_option('--diskcheck',
- nargs=1, type="string",
- dest='diskcheck', default=None,
- action="callback", callback=opt_diskcheck,
- help="Enable specific on-disk checks.",
- metavar="TYPE")
-
- def opt_duplicate(option, opt, value, parser):
- if not value in SCons.Node.FS.Valid_Duplicates:
- raise OptionValueError(opt_invalid('duplication', value,
- SCons.Node.FS.Valid_Duplicates))
- setattr(parser.values, option.dest, value)
- # Set the duplicate style right away so it can affect linking
- # of SConscript files.
- SCons.Node.FS.set_duplicate(value)
-
- opt_duplicate_help = "Set the preferred duplication methods. Must be one of " \
- + ", ".join(SCons.Node.FS.Valid_Duplicates)
-
- op.add_option('--duplicate',
- nargs=1, type="string",
- dest="duplicate", default='hard-soft-copy',
- action="callback", callback=opt_duplicate,
- help=opt_duplicate_help)
-
- op.add_option('-f', '--file', '--makefile', '--sconstruct',
- nargs=1, type="string",
- dest="file", default=[],
- action="append",
- help="Read FILE as the top-level SConstruct file.")
-
- op.add_option('-h', '--help',
- dest="help", default=False,
- action="store_true",
- help="Print defined help message, or this one.")
-
- op.add_option("-H", "--help-options",
- action="help",
- help="Print this message and exit.")
-
- op.add_option('-i', '--ignore-errors',
- dest='ignore_errors', default=False,
- action="store_true",
- help="Ignore errors from build actions.")
-
- op.add_option('-I', '--include-dir',
- nargs=1,
- dest='include_dir', default=[],
- action="append",
- help="Search DIR for imported Python modules.",
- metavar="DIR")
-
- op.add_option('--implicit-cache',
- dest='implicit_cache', default=False,
- action="store_true",
- help="Cache implicit dependencies")
-
- def opt_implicit_deps(option, opt, value, parser):
- setattr(parser.values, 'implicit_cache', True)
- setattr(parser.values, option.dest, True)
-
- op.add_option('--implicit-deps-changed',
- dest="implicit_deps_changed", default=False,
- action="callback", callback=opt_implicit_deps,
- help="Ignore cached implicit dependencies.")
-
- op.add_option('--implicit-deps-unchanged',
- dest="implicit_deps_unchanged", default=False,
- action="callback", callback=opt_implicit_deps,
- help="Ignore changes in implicit dependencies.")
-
- op.add_option('--interact', '--interactive',
- dest='interactive', default=False,
- action="store_true",
- help="Run in interactive mode.")
-
- op.add_option('-j', '--jobs',
- nargs=1, type="int",
- dest="num_jobs", default=1,
- action="store",
- help="Allow N jobs at once.",
- metavar="N")
-
- op.add_option('-k', '--keep-going',
- dest='keep_going', default=False,
- action="store_true",
- help="Keep going when a target can't be made.")
-
- op.add_option('--max-drift',
- nargs=1, type="int",
- dest='max_drift', default=SCons.Node.FS.default_max_drift,
- action="store",
- help="Set maximum system clock drift to N seconds.",
- metavar="N")
-
- op.add_option('--md5-chunksize',
- nargs=1, type="int",
- dest='md5_chunksize', default=SCons.Node.FS.File.md5_chunksize,
- action="store",
- help="Set chunk-size for MD5 signature computation to N kilobytes.",
- metavar="N")
-
- op.add_option('-n', '--no-exec', '--just-print', '--dry-run', '--recon',
- dest='no_exec', default=False,
- action="store_true",
- help="Don't build; just print commands.")
-
- op.add_option('--no-site-dir',
- dest='no_site_dir', default=False,
- action="store_true",
- help="Don't search or use the usual site_scons dir.")
-
- op.add_option('--profile',
- nargs=1,
- dest="profile_file", default=None,
- action="store",
- help="Profile SCons and put results in FILE.",
- metavar="FILE")
-
- op.add_option('-q', '--question',
- dest="question", default=False,
- action="store_true",
- help="Don't build; exit status says if up to date.")
-
- op.add_option('-Q',
- dest='no_progress', default=False,
- action="store_true",
- help="Suppress \"Reading/Building\" progress messages.")
-
- op.add_option('--random',
- dest="random", default=False,
- action="store_true",
- help="Build dependencies in random order.")
-
- op.add_option('-s', '--silent', '--quiet',
- dest="silent", default=False,
- action="store_true",
- help="Don't print commands.")
-
- op.add_option('--site-dir',
- nargs=1,
- dest='site_dir', default=None,
- action="store",
- help="Use DIR instead of the usual site_scons dir.",
- metavar="DIR")
-
- op.add_option('--stack-size',
- nargs=1, type="int",
- dest='stack_size',
- action="store",
- help="Set the stack size of the threads used to run jobs to N kilobytes.",
- metavar="N")
-
- op.add_option('--taskmastertrace',
- nargs=1,
- dest="taskmastertrace_file", default=None,
- action="store",
- help="Trace Node evaluation to FILE.",
- metavar="FILE")
-
- tree_options = ["all", "derived", "prune", "status"]
-
- def opt_tree(option, opt, value, parser, tree_options=tree_options):
- import Main
- tp = Main.TreePrinter()
- for o in value.split(','):
- if o == 'all':
- tp.derived = False
- elif o == 'derived':
- tp.derived = True
- elif o == 'prune':
- tp.prune = True
- elif o == 'status':
- tp.status = True
- else:
- raise OptionValueError(opt_invalid('--tree', o, tree_options))
- parser.values.tree_printers.append(tp)
-
- opt_tree_help = "Print a dependency tree in various formats: %s." \
- % ", ".join(tree_options)
-
- op.add_option('--tree',
- nargs=1, type="string",
- dest="tree_printers", default=[],
- action="callback", callback=opt_tree,
- help=opt_tree_help,
- metavar="OPTIONS")
-
- op.add_option('-u', '--up', '--search-up',
- dest="climb_up", default=0,
- action="store_const", const=1,
- help="Search up directory tree for SConstruct, "
- "build targets at or below current directory.")
-
- op.add_option('-U',
- dest="climb_up", default=0,
- action="store_const", const=3,
- help="Search up directory tree for SConstruct, "
- "build Default() targets from local SConscript.")
-
- def opt_version(option, opt, value, parser):
- sys.stdout.write(parser.version + '\n')
- sys.exit(0)
- op.add_option("-v", "--version",
- action="callback", callback=opt_version,
- help="Print the SCons version number and exit.")
-
- def opt_warn(option, opt, value, parser, tree_options=tree_options):
- if SCons.Util.is_String(value):
- value = value.split(',')
- parser.values.warn.extend(value)
-
- op.add_option('--warn', '--warning',
- nargs=1, type="string",
- dest="warn", default=[],
- action="callback", callback=opt_warn,
- help="Enable or disable warnings.",
- metavar="WARNING-SPEC")
-
- op.add_option('-Y', '--repository', '--srcdir',
- nargs=1,
- dest="repository", default=[],
- action="append",
- help="Search REPOSITORY for source and target files.")
-
- # Options from Make and Cons classic that we do not yet support,
- # but which we may support someday and whose (potential) meanings
- # we don't want to change. These all get a "the -X option is not
- # yet implemented" message and don't show up in the help output.
-
- def opt_not_yet(option, opt, value, parser):
- msg = "Warning: the %s option is not yet implemented\n" % opt
- sys.stderr.write(msg)
-
- op.add_option('-l', '--load-average', '--max-load',
- nargs=1, type="float",
- dest="load_average", default=0,
- action="callback", callback=opt_not_yet,
- # action="store",
- # help="Don't start multiple jobs unless load is below "
- # "LOAD-AVERAGE."
- help=SUPPRESS_HELP)
- op.add_option('--list-actions',
- dest="list_actions",
- action="callback", callback=opt_not_yet,
- # help="Don't build; list files and build actions."
- help=SUPPRESS_HELP)
- op.add_option('--list-derived',
- dest="list_derived",
- action="callback", callback=opt_not_yet,
- # help="Don't build; list files that would be built."
- help=SUPPRESS_HELP)
- op.add_option('--list-where',
- dest="list_where",
- action="callback", callback=opt_not_yet,
- # help="Don't build; list files and where defined."
- help=SUPPRESS_HELP)
- op.add_option('-o', '--old-file', '--assume-old',
- nargs=1, type="string",
- dest="old_file", default=[],
- action="callback", callback=opt_not_yet,
- # action="append",
- # help = "Consider FILE to be old; don't rebuild it."
- help=SUPPRESS_HELP)
- op.add_option('--override',
- nargs=1, type="string",
- action="callback", callback=opt_not_yet,
- dest="override",
- # help="Override variables as specified in FILE."
- help=SUPPRESS_HELP)
- op.add_option('-p',
- action="callback", callback=opt_not_yet,
- dest="p",
- # help="Print internal environments/objects."
- help=SUPPRESS_HELP)
- op.add_option('-r', '-R', '--no-builtin-rules', '--no-builtin-variables',
- action="callback", callback=opt_not_yet,
- dest="no_builtin_rules",
- # help="Clear default environments and variables."
- help=SUPPRESS_HELP)
- op.add_option('--write-filenames',
- nargs=1, type="string",
- dest="write_filenames",
- action="callback", callback=opt_not_yet,
- # help="Write all filenames examined into FILE."
- help=SUPPRESS_HELP)
- op.add_option('-W', '--new-file', '--assume-new', '--what-if',
- nargs=1, type="string",
- dest="new_file",
- action="callback", callback=opt_not_yet,
- # help="Consider FILE to be changed."
- help=SUPPRESS_HELP)
- op.add_option('--warn-undefined-variables',
- dest="warn_undefined_variables",
- action="callback", callback=opt_not_yet,
- # help="Warn when an undefined variable is referenced."
- help=SUPPRESS_HELP)
-
- return op
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Script/SConscript.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Script/SConscript.py
deleted file mode 100644
index ead6f2e..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Script/SConscript.py
+++ /dev/null
@@ -1,640 +0,0 @@
-"""SCons.Script.SConscript
-
-This module defines the Python API provided to SConscript and SConstruct
-files.
-
-"""
-
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-from __future__ import division
-
-__revision__ = "src/engine/SCons/Script/SConscript.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-import SCons
-import SCons.Action
-import SCons.Builder
-import SCons.Defaults
-import SCons.Environment
-import SCons.Errors
-import SCons.Node
-import SCons.Node.Alias
-import SCons.Node.FS
-import SCons.Platform
-import SCons.SConf
-import SCons.Script.Main
-import SCons.Tool
-import SCons.Util
-
-import collections
-import os
-import os.path
-import re
-import sys
-import traceback
-
-# The following variables used to live in this module. Some
-# SConscript files out there may have referred to them directly as
-# SCons.Script.SConscript.*. This is now supported by some special
-# handling towards the bottom of the SConscript.__init__.py module.
-#Arguments = {}
-#ArgList = []
-#BuildTargets = TargetList()
-#CommandLineTargets = []
-#DefaultTargets = []
-
-class SConscriptReturn(Exception):
- pass
-
-launch_dir = os.path.abspath(os.curdir)
-
-GlobalDict = None
-
-# global exports set by Export():
-global_exports = {}
-
-# chdir flag
-sconscript_chdir = 1
-
-def get_calling_namespaces():
- """Return the locals and globals for the function that called
- into this module in the current call stack."""
- try: 1//0
- except ZeroDivisionError:
- # Don't start iterating with the current stack-frame to
- # prevent creating reference cycles (f_back is safe).
- frame = sys.exc_info()[2].tb_frame.f_back
-
- # Find the first frame that *isn't* from this file. This means
- # that we expect all of the SCons frames that implement an Export()
- # or SConscript() call to be in this file, so that we can identify
- # the first non-Script.SConscript frame as the user's local calling
- # environment, and the locals and globals dictionaries from that
- # frame as the calling namespaces. See the comment below preceding
- # the DefaultEnvironmentCall block for even more explanation.
- while frame.f_globals.get("__name__") == __name__:
- frame = frame.f_back
-
- return frame.f_locals, frame.f_globals
-
-
-def compute_exports(exports):
- """Compute a dictionary of exports given one of the parameters
- to the Export() function or the exports argument to SConscript()."""
-
- loc, glob = get_calling_namespaces()
-
- retval = {}
- try:
- for export in exports:
- if SCons.Util.is_Dict(export):
- retval.update(export)
- else:
- try:
- retval[export] = loc[export]
- except KeyError:
- retval[export] = glob[export]
- except KeyError, x:
- raise SCons.Errors.UserError("Export of non-existent variable '%s'"%x)
-
- return retval
-
-class Frame(object):
- """A frame on the SConstruct/SConscript call stack"""
- def __init__(self, fs, exports, sconscript):
- self.globals = BuildDefaultGlobals()
- self.retval = None
- self.prev_dir = fs.getcwd()
- self.exports = compute_exports(exports) # exports from the calling SConscript
- # make sure the sconscript attr is a Node.
- if isinstance(sconscript, SCons.Node.Node):
- self.sconscript = sconscript
- elif sconscript == '-':
- self.sconscript = None
- else:
- self.sconscript = fs.File(str(sconscript))
-
-# the SConstruct/SConscript call stack:
-call_stack = []
-
-# For documentation on the methods in this file, see the scons man-page
-
-def Return(*vars, **kw):
- retval = []
- try:
- fvars = SCons.Util.flatten(vars)
- for var in fvars:
- for v in var.split():
- retval.append(call_stack[-1].globals[v])
- except KeyError, x:
- raise SCons.Errors.UserError("Return of non-existent variable '%s'"%x)
-
- if len(retval) == 1:
- call_stack[-1].retval = retval[0]
- else:
- call_stack[-1].retval = tuple(retval)
-
- stop = kw.get('stop', True)
-
- if stop:
- raise SConscriptReturn
-
-
-stack_bottom = '% Stack boTTom %' # hard to define a variable w/this name :)
-
-def _SConscript(fs, *files, **kw):
- top = fs.Top
- sd = fs.SConstruct_dir.rdir()
- exports = kw.get('exports', [])
-
- # evaluate each SConscript file
- results = []
- for fn in files:
- call_stack.append(Frame(fs, exports, fn))
- old_sys_path = sys.path
- try:
- SCons.Script.sconscript_reading = SCons.Script.sconscript_reading + 1
- if fn == "-":
- exec sys.stdin in call_stack[-1].globals
- else:
- if isinstance(fn, SCons.Node.Node):
- f = fn
- else:
- f = fs.File(str(fn))
- _file_ = None
-
- # Change directory to the top of the source
- # tree to make sure the os's cwd and the cwd of
- # fs match so we can open the SConscript.
- fs.chdir(top, change_os_dir=1)
- if f.rexists():
- actual = f.rfile()
- _file_ = open(actual.get_abspath(), "r")
- elif f.srcnode().rexists():
- actual = f.srcnode().rfile()
- _file_ = open(actual.get_abspath(), "r")
- elif f.has_src_builder():
- # The SConscript file apparently exists in a source
- # code management system. Build it, but then clear
- # the builder so that it doesn't get built *again*
- # during the actual build phase.
- f.build()
- f.built()
- f.builder_set(None)
- if f.exists():
- _file_ = open(f.get_abspath(), "r")
- if _file_:
- # Chdir to the SConscript directory. Use a path
- # name relative to the SConstruct file so that if
- # we're using the -f option, we're essentially
- # creating a parallel SConscript directory structure
- # in our local directory tree.
- #
- # XXX This is broken for multiple-repository cases
- # where the SConstruct and SConscript files might be
- # in different Repositories. For now, cross that
- # bridge when someone comes to it.
- try:
- src_dir = kw['src_dir']
- except KeyError:
- ldir = fs.Dir(f.dir.get_path(sd))
- else:
- ldir = fs.Dir(src_dir)
- if not ldir.is_under(f.dir):
- # They specified a source directory, but
- # it's above the SConscript directory.
- # Do the sensible thing and just use the
- # SConcript directory.
- ldir = fs.Dir(f.dir.get_path(sd))
- try:
- fs.chdir(ldir, change_os_dir=sconscript_chdir)
- except OSError:
- # There was no local directory, so we should be
- # able to chdir to the Repository directory.
- # Note that we do this directly, not through
- # fs.chdir(), because we still need to
- # interpret the stuff within the SConscript file
- # relative to where we are logically.
- fs.chdir(ldir, change_os_dir=0)
- os.chdir(actual.dir.get_abspath())
-
- # Append the SConscript directory to the beginning
- # of sys.path so Python modules in the SConscript
- # directory can be easily imported.
- sys.path = [ f.dir.get_abspath() ] + sys.path
-
- # This is the magic line that actually reads up
- # and executes the stuff in the SConscript file.
- # The locals for this frame contain the special
- # bottom-of-the-stack marker so that any
- # exceptions that occur when processing this
- # SConscript can base the printed frames at this
- # level and not show SCons internals as well.
- call_stack[-1].globals.update({stack_bottom:1})
- old_file = call_stack[-1].globals.get('__file__')
- try:
- del call_stack[-1].globals['__file__']
- except KeyError:
- pass
- try:
- try:
- exec _file_ in call_stack[-1].globals
- except SConscriptReturn:
- pass
- finally:
- if old_file is not None:
- call_stack[-1].globals.update({__file__:old_file})
- else:
- SCons.Warnings.warn(SCons.Warnings.MissingSConscriptWarning,
- "Ignoring missing SConscript '%s'" % f.get_internal_path())
-
- finally:
- SCons.Script.sconscript_reading = SCons.Script.sconscript_reading - 1
- sys.path = old_sys_path
- frame = call_stack.pop()
- try:
- fs.chdir(frame.prev_dir, change_os_dir=sconscript_chdir)
- except OSError:
- # There was no local directory, so chdir to the
- # Repository directory. Like above, we do this
- # directly.
- fs.chdir(frame.prev_dir, change_os_dir=0)
- rdir = frame.prev_dir.rdir()
- rdir._create() # Make sure there's a directory there.
- try:
- os.chdir(rdir.get_abspath())
- except OSError, e:
- # We still couldn't chdir there, so raise the error,
- # but only if actions are being executed.
- #
- # If the -n option was used, the directory would *not*
- # have been created and we should just carry on and
- # let things muddle through. This isn't guaranteed
- # to work if the SConscript files are reading things
- # from disk (for example), but it should work well
- # enough for most configurations.
- if SCons.Action.execute_actions:
- raise e
-
- results.append(frame.retval)
-
- # if we only have one script, don't return a tuple
- if len(results) == 1:
- return results[0]
- else:
- return tuple(results)
-
-def SConscript_exception(file=sys.stderr):
- """Print an exception stack trace just for the SConscript file(s).
- This will show users who have Python errors where the problem is,
- without cluttering the output with all of the internal calls leading
- up to where we exec the SConscript."""
- exc_type, exc_value, exc_tb = sys.exc_info()
- tb = exc_tb
- while tb and stack_bottom not in tb.tb_frame.f_locals:
- tb = tb.tb_next
- if not tb:
- # We did not find our exec statement, so this was actually a bug
- # in SCons itself. Show the whole stack.
- tb = exc_tb
- stack = traceback.extract_tb(tb)
- try:
- type = exc_type.__name__
- except AttributeError:
- type = str(exc_type)
- if type[:11] == "exceptions.":
- type = type[11:]
- file.write('%s: %s:\n' % (type, exc_value))
- for fname, line, func, text in stack:
- file.write(' File "%s", line %d:\n' % (fname, line))
- file.write(' %s\n' % text)
-
-def annotate(node):
- """Annotate a node with the stack frame describing the
- SConscript file and line number that created it."""
- tb = sys.exc_info()[2]
- while tb and stack_bottom not in tb.tb_frame.f_locals:
- tb = tb.tb_next
- if not tb:
- # We did not find any exec of an SConscript file: what?!
- raise SCons.Errors.InternalError("could not find SConscript stack frame")
- node.creator = traceback.extract_stack(tb)[0]
-
-# The following line would cause each Node to be annotated using the
-# above function. Unfortunately, this is a *huge* performance hit, so
-# leave this disabled until we find a more efficient mechanism.
-#SCons.Node.Annotate = annotate
-
-class SConsEnvironment(SCons.Environment.Base):
- """An Environment subclass that contains all of the methods that
- are particular to the wrapper SCons interface and which aren't
- (or shouldn't be) part of the build engine itself.
-
- Note that not all of the methods of this class have corresponding
- global functions, there are some private methods.
- """
-
- #
- # Private methods of an SConsEnvironment.
- #
- def _exceeds_version(self, major, minor, v_major, v_minor):
- """Return 1 if 'major' and 'minor' are greater than the version
- in 'v_major' and 'v_minor', and 0 otherwise."""
- return (major > v_major or (major == v_major and minor > v_minor))
-
- def _get_major_minor_revision(self, version_string):
- """Split a version string into major, minor and (optionally)
- revision parts.
-
- This is complicated by the fact that a version string can be
- something like 3.2b1."""
- version = version_string.split(' ')[0].split('.')
- v_major = int(version[0])
- v_minor = int(re.match('\d+', version[1]).group())
- if len(version) >= 3:
- v_revision = int(re.match('\d+', version[2]).group())
- else:
- v_revision = 0
- return v_major, v_minor, v_revision
-
- def _get_SConscript_filenames(self, ls, kw):
- """
- Convert the parameters passed to SConscript() calls into a list
- of files and export variables. If the parameters are invalid,
- throws SCons.Errors.UserError. Returns a tuple (l, e) where l
- is a list of SConscript filenames and e is a list of exports.
- """
- exports = []
-
- if len(ls) == 0:
- try:
- dirs = kw["dirs"]
- except KeyError:
- raise SCons.Errors.UserError("Invalid SConscript usage - no parameters")
-
- if not SCons.Util.is_List(dirs):
- dirs = [ dirs ]
- dirs = list(map(str, dirs))
-
- name = kw.get('name', 'SConscript')
-
- files = [os.path.join(n, name) for n in dirs]
-
- elif len(ls) == 1:
-
- files = ls[0]
-
- elif len(ls) == 2:
-
- files = ls[0]
- exports = self.Split(ls[1])
-
- else:
-
- raise SCons.Errors.UserError("Invalid SConscript() usage - too many arguments")
-
- if not SCons.Util.is_List(files):
- files = [ files ]
-
- if kw.get('exports'):
- exports.extend(self.Split(kw['exports']))
-
- variant_dir = kw.get('variant_dir') or kw.get('build_dir')
- if variant_dir:
- if len(files) != 1:
- raise SCons.Errors.UserError("Invalid SConscript() usage - can only specify one SConscript with a variant_dir")
- duplicate = kw.get('duplicate', 1)
- src_dir = kw.get('src_dir')
- if not src_dir:
- src_dir, fname = os.path.split(str(files[0]))
- files = [os.path.join(str(variant_dir), fname)]
- else:
- if not isinstance(src_dir, SCons.Node.Node):
- src_dir = self.fs.Dir(src_dir)
- fn = files[0]
- if not isinstance(fn, SCons.Node.Node):
- fn = self.fs.File(fn)
- if fn.is_under(src_dir):
- # Get path relative to the source directory.
- fname = fn.get_path(src_dir)
- files = [os.path.join(str(variant_dir), fname)]
- else:
- files = [fn.get_abspath()]
- kw['src_dir'] = variant_dir
- self.fs.VariantDir(variant_dir, src_dir, duplicate)
-
- return (files, exports)
-
- #
- # Public methods of an SConsEnvironment. These get
- # entry points in the global name space so they can be called
- # as global functions.
- #
-
- def Configure(self, *args, **kw):
- if not SCons.Script.sconscript_reading:
- raise SCons.Errors.UserError("Calling Configure from Builders is not supported.")
- kw['_depth'] = kw.get('_depth', 0) + 1
- return SCons.Environment.Base.Configure(self, *args, **kw)
-
- def Default(self, *targets):
- SCons.Script._Set_Default_Targets(self, targets)
-
- def EnsureSConsVersion(self, major, minor, revision=0):
- """Exit abnormally if the SCons version is not late enough."""
- # split string to avoid replacement during build process
- if SCons.__version__ == '__' + 'VERSION__':
- SCons.Warnings.warn(SCons.Warnings.DevelopmentVersionWarning,
- "EnsureSConsVersion is ignored for development version")
- return
- scons_ver = self._get_major_minor_revision(SCons.__version__)
- if scons_ver < (major, minor, revision):
- if revision:
- scons_ver_string = '%d.%d.%d' % (major, minor, revision)
- else:
- scons_ver_string = '%d.%d' % (major, minor)
- print "SCons %s or greater required, but you have SCons %s" % \
- (scons_ver_string, SCons.__version__)
- sys.exit(2)
-
- def EnsurePythonVersion(self, major, minor):
- """Exit abnormally if the Python version is not late enough."""
- if sys.version_info < (major, minor):
- v = sys.version.split()[0]
- print "Python %d.%d or greater required, but you have Python %s" %(major,minor,v)
- sys.exit(2)
-
- def Exit(self, value=0):
- sys.exit(value)
-
- def Export(self, *vars, **kw):
- for var in vars:
- global_exports.update(compute_exports(self.Split(var)))
- global_exports.update(kw)
-
- def GetLaunchDir(self):
- global launch_dir
- return launch_dir
-
- def GetOption(self, name):
- name = self.subst(name)
- return SCons.Script.Main.GetOption(name)
-
- def Help(self, text):
- text = self.subst(text, raw=1)
- SCons.Script.HelpFunction(text)
-
- def Import(self, *vars):
- try:
- frame = call_stack[-1]
- globals = frame.globals
- exports = frame.exports
- for var in vars:
- var = self.Split(var)
- for v in var:
- if v == '*':
- globals.update(global_exports)
- globals.update(exports)
- else:
- if v in exports:
- globals[v] = exports[v]
- else:
- globals[v] = global_exports[v]
- except KeyError,x:
- raise SCons.Errors.UserError("Import of non-existent variable '%s'"%x)
-
- def SConscript(self, *ls, **kw):
- if 'build_dir' in kw:
- msg = """The build_dir keyword has been deprecated; use the variant_dir keyword instead."""
- SCons.Warnings.warn(SCons.Warnings.DeprecatedBuildDirWarning, msg)
- def subst_element(x, subst=self.subst):
- if SCons.Util.is_List(x):
- x = list(map(subst, x))
- else:
- x = subst(x)
- return x
- ls = list(map(subst_element, ls))
- subst_kw = {}
- for key, val in kw.items():
- if SCons.Util.is_String(val):
- val = self.subst(val)
- elif SCons.Util.is_List(val):
- result = []
- for v in val:
- if SCons.Util.is_String(v):
- v = self.subst(v)
- result.append(v)
- val = result
- subst_kw[key] = val
-
- files, exports = self._get_SConscript_filenames(ls, subst_kw)
- subst_kw['exports'] = exports
- return _SConscript(self.fs, *files, **subst_kw)
-
- def SConscriptChdir(self, flag):
- global sconscript_chdir
- sconscript_chdir = flag
-
- def SetOption(self, name, value):
- name = self.subst(name)
- SCons.Script.Main.SetOption(name, value)
-
-#
-#
-#
-SCons.Environment.Environment = SConsEnvironment
-
-def Configure(*args, **kw):
- if not SCons.Script.sconscript_reading:
- raise SCons.Errors.UserError("Calling Configure from Builders is not supported.")
- kw['_depth'] = 1
- return SCons.SConf.SConf(*args, **kw)
-
-# It's very important that the DefaultEnvironmentCall() class stay in this
-# file, with the get_calling_namespaces() function, the compute_exports()
-# function, the Frame class and the SConsEnvironment.Export() method.
-# These things make up the calling stack leading up to the actual global
-# Export() or SConscript() call that the user issued. We want to allow
-# users to export local variables that they define, like so:
-#
-# def func():
-# x = 1
-# Export('x')
-#
-# To support this, the get_calling_namespaces() function assumes that
-# the *first* stack frame that's not from this file is the local frame
-# for the Export() or SConscript() call.
-
-_DefaultEnvironmentProxy = None
-
-def get_DefaultEnvironmentProxy():
- global _DefaultEnvironmentProxy
- if not _DefaultEnvironmentProxy:
- default_env = SCons.Defaults.DefaultEnvironment()
- _DefaultEnvironmentProxy = SCons.Environment.NoSubstitutionProxy(default_env)
- return _DefaultEnvironmentProxy
-
-class DefaultEnvironmentCall(object):
- """A class that implements "global function" calls of
- Environment methods by fetching the specified method from the
- DefaultEnvironment's class. Note that this uses an intermediate
- proxy class instead of calling the DefaultEnvironment method
- directly so that the proxy can override the subst() method and
- thereby prevent expansion of construction variables (since from
- the user's point of view this was called as a global function,
- with no associated construction environment)."""
- def __init__(self, method_name, subst=0):
- self.method_name = method_name
- if subst:
- self.factory = SCons.Defaults.DefaultEnvironment
- else:
- self.factory = get_DefaultEnvironmentProxy
- def __call__(self, *args, **kw):
- env = self.factory()
- method = getattr(env, self.method_name)
- return method(*args, **kw)
-
-
-def BuildDefaultGlobals():
- """
- Create a dictionary containing all the default globals for
- SConstruct and SConscript files.
- """
-
- global GlobalDict
- if GlobalDict is None:
- GlobalDict = {}
-
- import SCons.Script
- d = SCons.Script.__dict__
- def not_a_module(m, d=d, mtype=type(SCons.Script)):
- return not isinstance(d[m], mtype)
- for m in filter(not_a_module, dir(SCons.Script)):
- GlobalDict[m] = d[m]
-
- return GlobalDict.copy()
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Script/__init__.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Script/__init__.py
deleted file mode 100644
index c21882f..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Script/__init__.py
+++ /dev/null
@@ -1,412 +0,0 @@
-"""SCons.Script
-
-This file implements the main() function used by the scons script.
-
-Architecturally, this *is* the scons script, and will likely only be
-called from the external "scons" wrapper. Consequently, anything here
-should not be, or be considered, part of the build engine. If it's
-something that we expect other software to want to use, it should go in
-some other module. If it's specific to the "scons" script invocation,
-it goes here.
-
-"""
-
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-
-__revision__ = "src/engine/SCons/Script/__init__.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-import time
-start_time = time.time()
-
-import collections
-import os
-import sys
-
-# Special chicken-and-egg handling of the "--debug=memoizer" flag:
-#
-# SCons.Memoize contains a metaclass implementation that affects how
-# the other classes are instantiated. The Memoizer may add shim methods
-# to classes that have methods that cache computed values in order to
-# count and report the hits and misses.
-#
-# If we wait to enable the Memoization until after we've parsed the
-# command line options normally, it will be too late, because the Memoizer
-# will have already analyzed the classes that it's Memoizing and decided
-# to not add the shims. So we use a special-case, up-front check for
-# the "--debug=memoizer" flag and enable Memoizer before we import any
-# of the other modules that use it.
-
-_args = sys.argv + os.environ.get('SCONSFLAGS', '').split()
-if "--debug=memoizer" in _args:
- import SCons.Memoize
- import SCons.Warnings
- try:
- SCons.Memoize.EnableMemoization()
- except SCons.Warnings.Warning:
- # Some warning was thrown. Arrange for it to be displayed
- # or not after warnings are configured.
- import Main
- exc_type, exc_value, tb = sys.exc_info()
- Main.delayed_warnings.append((exc_type, exc_value))
-del _args
-
-import SCons.Action
-import SCons.Builder
-import SCons.Environment
-import SCons.Node.FS
-import SCons.Options
-import SCons.Platform
-import SCons.Scanner
-import SCons.SConf
-import SCons.Subst
-import SCons.Tool
-import SCons.Util
-import SCons.Variables
-import SCons.Defaults
-
-import Main
-
-main = Main.main
-
-# The following are global class definitions and variables that used to
-# live directly in this module back before 0.96.90, when it contained
-# a lot of code. Some SConscript files in widely-distributed packages
-# (Blender is the specific example) actually reached into SCons.Script
-# directly to use some of these. Rather than break those SConscript
-# files, we're going to propagate these names into the SCons.Script
-# namespace here.
-#
-# Some of these are commented out because it's *really* unlikely anyone
-# used them, but we're going to leave the comment here to try to make
-# it obvious what to do if the situation arises.
-BuildTask = Main.BuildTask
-CleanTask = Main.CleanTask
-QuestionTask = Main.QuestionTask
-#PrintHelp = Main.PrintHelp
-#SConscriptSettableOptions = Main.SConscriptSettableOptions
-
-AddOption = Main.AddOption
-GetOption = Main.GetOption
-SetOption = Main.SetOption
-Progress = Main.Progress
-GetBuildFailures = Main.GetBuildFailures
-
-#keep_going_on_error = Main.keep_going_on_error
-#print_dtree = Main.print_dtree
-#print_explanations = Main.print_explanations
-#print_includes = Main.print_includes
-#print_objects = Main.print_objects
-#print_time = Main.print_time
-#print_tree = Main.print_tree
-#memory_stats = Main.memory_stats
-#ignore_errors = Main.ignore_errors
-#sconscript_time = Main.sconscript_time
-#command_time = Main.command_time
-#exit_status = Main.exit_status
-#profiling = Main.profiling
-#repositories = Main.repositories
-
-#
-import SConscript
-_SConscript = SConscript
-
-call_stack = _SConscript.call_stack
-
-#
-Action = SCons.Action.Action
-AddMethod = SCons.Util.AddMethod
-AllowSubstExceptions = SCons.Subst.SetAllowableExceptions
-Builder = SCons.Builder.Builder
-Configure = _SConscript.Configure
-Environment = SCons.Environment.Environment
-#OptParser = SCons.SConsOptions.OptParser
-FindPathDirs = SCons.Scanner.FindPathDirs
-Platform = SCons.Platform.Platform
-Return = _SConscript.Return
-Scanner = SCons.Scanner.Base
-Tool = SCons.Tool.Tool
-WhereIs = SCons.Util.WhereIs
-
-#
-BoolVariable = SCons.Variables.BoolVariable
-EnumVariable = SCons.Variables.EnumVariable
-ListVariable = SCons.Variables.ListVariable
-PackageVariable = SCons.Variables.PackageVariable
-PathVariable = SCons.Variables.PathVariable
-
-# Deprecated names that will go away some day.
-BoolOption = SCons.Options.BoolOption
-EnumOption = SCons.Options.EnumOption
-ListOption = SCons.Options.ListOption
-PackageOption = SCons.Options.PackageOption
-PathOption = SCons.Options.PathOption
-
-# Action factories.
-Chmod = SCons.Defaults.Chmod
-Copy = SCons.Defaults.Copy
-Delete = SCons.Defaults.Delete
-Mkdir = SCons.Defaults.Mkdir
-Move = SCons.Defaults.Move
-Touch = SCons.Defaults.Touch
-
-# Pre-made, public scanners.
-CScanner = SCons.Tool.CScanner
-DScanner = SCons.Tool.DScanner
-DirScanner = SCons.Defaults.DirScanner
-ProgramScanner = SCons.Tool.ProgramScanner
-SourceFileScanner = SCons.Tool.SourceFileScanner
-
-# Functions we might still convert to Environment methods.
-CScan = SCons.Defaults.CScan
-DefaultEnvironment = SCons.Defaults.DefaultEnvironment
-
-# Other variables we provide.
-class TargetList(collections.UserList):
- def _do_nothing(self, *args, **kw):
- pass
- def _add_Default(self, list):
- self.extend(list)
- def _clear(self):
- del self[:]
-
-ARGUMENTS = {}
-ARGLIST = []
-BUILD_TARGETS = TargetList()
-COMMAND_LINE_TARGETS = []
-DEFAULT_TARGETS = []
-
-# BUILD_TARGETS can be modified in the SConscript files. If so, we
-# want to treat the modified BUILD_TARGETS list as if they specified
-# targets on the command line. To do that, though, we need to know if
-# BUILD_TARGETS was modified through "official" APIs or by hand. We do
-# this by updating two lists in parallel, the documented BUILD_TARGETS
-# list, above, and this internal _build_plus_default targets list which
-# should only have "official" API changes. Then Script/Main.py can
-# compare these two afterwards to figure out if the user added their
-# own targets to BUILD_TARGETS.
-_build_plus_default = TargetList()
-
-def _Add_Arguments(alist):
- for arg in alist:
- a, b = arg.split('=', 1)
- ARGUMENTS[a] = b
- ARGLIST.append((a, b))
-
-def _Add_Targets(tlist):
- if tlist:
- COMMAND_LINE_TARGETS.extend(tlist)
- BUILD_TARGETS.extend(tlist)
- BUILD_TARGETS._add_Default = BUILD_TARGETS._do_nothing
- BUILD_TARGETS._clear = BUILD_TARGETS._do_nothing
- _build_plus_default.extend(tlist)
- _build_plus_default._add_Default = _build_plus_default._do_nothing
- _build_plus_default._clear = _build_plus_default._do_nothing
-
-def _Set_Default_Targets_Has_Been_Called(d, fs):
- return DEFAULT_TARGETS
-
-def _Set_Default_Targets_Has_Not_Been_Called(d, fs):
- if d is None:
- d = [fs.Dir('.')]
- return d
-
-_Get_Default_Targets = _Set_Default_Targets_Has_Not_Been_Called
-
-def _Set_Default_Targets(env, tlist):
- global DEFAULT_TARGETS
- global _Get_Default_Targets
- _Get_Default_Targets = _Set_Default_Targets_Has_Been_Called
- for t in tlist:
- if t is None:
- # Delete the elements from the list in-place, don't
- # reassign an empty list to DEFAULT_TARGETS, so that the
- # variables will still point to the same object we point to.
- del DEFAULT_TARGETS[:]
- BUILD_TARGETS._clear()
- _build_plus_default._clear()
- elif isinstance(t, SCons.Node.Node):
- DEFAULT_TARGETS.append(t)
- BUILD_TARGETS._add_Default([t])
- _build_plus_default._add_Default([t])
- else:
- nodes = env.arg2nodes(t, env.fs.Entry)
- DEFAULT_TARGETS.extend(nodes)
- BUILD_TARGETS._add_Default(nodes)
- _build_plus_default._add_Default(nodes)
-
-#
-help_text = None
-
-def HelpFunction(text):
- global help_text
- if SCons.Script.help_text is None:
- SCons.Script.help_text = text
- else:
- help_text = help_text + text
-
-#
-# Will be non-zero if we are reading an SConscript file.
-sconscript_reading = 0
-
-#
-def Variables(files=[], args=ARGUMENTS):
- return SCons.Variables.Variables(files, args)
-
-def Options(files=[], args=ARGUMENTS):
- return SCons.Options.Options(files, args)
-
-# The list of global functions to add to the SConscript name space
-# that end up calling corresponding methods or Builders in the
-# DefaultEnvironment().
-GlobalDefaultEnvironmentFunctions = [
- # Methods from the SConsEnvironment class, above.
- 'Default',
- 'EnsurePythonVersion',
- 'EnsureSConsVersion',
- 'Exit',
- 'Export',
- 'GetLaunchDir',
- 'Help',
- 'Import',
- #'SConscript', is handled separately, below.
- 'SConscriptChdir',
-
- # Methods from the Environment.Base class.
- 'AddPostAction',
- 'AddPreAction',
- 'Alias',
- 'AlwaysBuild',
- 'BuildDir',
- 'CacheDir',
- 'Clean',
- #The Command() method is handled separately, below.
- 'Decider',
- 'Depends',
- 'Dir',
- 'NoClean',
- 'NoCache',
- 'Entry',
- 'Execute',
- 'File',
- 'FindFile',
- 'FindInstalledFiles',
- 'FindSourceFiles',
- 'Flatten',
- 'GetBuildPath',
- 'Glob',
- 'Ignore',
- 'Install',
- 'InstallAs',
- 'Literal',
- 'Local',
- 'ParseDepends',
- 'Precious',
- 'Repository',
- 'Requires',
- 'SConsignFile',
- 'SideEffect',
- 'SourceCode',
- 'SourceSignatures',
- 'Split',
- 'Tag',
- 'TargetSignatures',
- 'Value',
- 'VariantDir',
-]
-
-GlobalDefaultBuilders = [
- # Supported builders.
- 'CFile',
- 'CXXFile',
- 'DVI',
- 'Jar',
- 'Java',
- 'JavaH',
- 'Library',
- 'M4',
- 'MSVSProject',
- 'Object',
- 'PCH',
- 'PDF',
- 'PostScript',
- 'Program',
- 'RES',
- 'RMIC',
- 'SharedLibrary',
- 'SharedObject',
- 'StaticLibrary',
- 'StaticObject',
- 'Tar',
- 'TypeLibrary',
- 'Zip',
- 'Package',
-]
-
-for name in GlobalDefaultEnvironmentFunctions + GlobalDefaultBuilders:
- exec "%s = _SConscript.DefaultEnvironmentCall(%s)" % (name, repr(name))
-del name
-
-# There are a handful of variables that used to live in the
-# Script/SConscript.py module that some SConscript files out there were
-# accessing directly as SCons.Script.SConscript.*. The problem is that
-# "SConscript" in this namespace is no longer a module, it's a global
-# function call--or more precisely, an object that implements a global
-# function call through the default Environment. Nevertheless, we can
-# maintain backwards compatibility for SConscripts that were reaching in
-# this way by hanging some attributes off the "SConscript" object here.
-SConscript = _SConscript.DefaultEnvironmentCall('SConscript')
-
-# Make SConscript look enough like the module it used to be so
-# that pychecker doesn't barf.
-SConscript.__name__ = 'SConscript'
-
-SConscript.Arguments = ARGUMENTS
-SConscript.ArgList = ARGLIST
-SConscript.BuildTargets = BUILD_TARGETS
-SConscript.CommandLineTargets = COMMAND_LINE_TARGETS
-SConscript.DefaultTargets = DEFAULT_TARGETS
-
-# The global Command() function must be handled differently than the
-# global functions for other construction environment methods because
-# we want people to be able to use Actions that must expand $TARGET
-# and $SOURCE later, when (and if) the Action is invoked to build
-# the target(s). We do this with the subst=1 argument, which creates
-# a DefaultEnvironmentCall instance that wraps up a normal default
-# construction environment that performs variable substitution, not a
-# proxy that doesn't.
-#
-# There's a flaw here, though, because any other $-variables on a command
-# line will *also* be expanded, each to a null string, but that should
-# only be a problem in the unusual case where someone was passing a '$'
-# on a command line and *expected* the $ to get through to the shell
-# because they were calling Command() and not env.Command()... This is
-# unlikely enough that we're going to leave this as is and cross that
-# bridge if someone actually comes to it.
-Command = _SConscript.DefaultEnvironmentCall('Command', subst=1)
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Sig.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Sig.py
deleted file mode 100644
index e949cfb..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Sig.py
+++ /dev/null
@@ -1,63 +0,0 @@
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-
-__revision__ = "src/engine/SCons/Sig.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-__doc__ = """Place-holder for the old SCons.Sig module hierarchy
-
-This is no longer used, but code out there (such as the NSIS module on
-the SCons wiki) may try to import SCons.Sig. If so, we generate a warning
-that points them to the line that caused the import, and don't die.
-
-If someone actually tried to use the sub-modules or functions within
-the package (for example, SCons.Sig.MD5.signature()), then they'll still
-get an AttributeError, but at least they'll know where to start looking.
-"""
-
-import SCons.Util
-import SCons.Warnings
-
-msg = 'The SCons.Sig module no longer exists.\n' \
- ' Remove the following "import SCons.Sig" line to eliminate this warning:'
-
-SCons.Warnings.warn(SCons.Warnings.DeprecatedSigModuleWarning, msg)
-
-default_calc = None
-default_module = None
-
-class MD5Null(SCons.Util.Null):
- def __repr__(self):
- return "MD5Null()"
-
-class TimeStampNull(SCons.Util.Null):
- def __repr__(self):
- return "TimeStampNull()"
-
-MD5 = MD5Null()
-TimeStamp = TimeStampNull()
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Subst.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Subst.py
deleted file mode 100644
index da0fa68..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Subst.py
+++ /dev/null
@@ -1,912 +0,0 @@
-"""SCons.Subst
-
-SCons string substitution.
-
-"""
-
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-__revision__ = "src/engine/SCons/Subst.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-import collections
-import re
-
-import SCons.Errors
-
-from SCons.Util import is_String, is_Sequence
-
-# Indexed by the SUBST_* constants below.
-_strconv = [SCons.Util.to_String_for_subst,
- SCons.Util.to_String_for_subst,
- SCons.Util.to_String_for_signature]
-
-
-
-AllowableExceptions = (IndexError, NameError)
-
-def SetAllowableExceptions(*excepts):
- global AllowableExceptions
- AllowableExceptions = [_f for _f in excepts if _f]
-
-def raise_exception(exception, target, s):
- name = exception.__class__.__name__
- msg = "%s `%s' trying to evaluate `%s'" % (name, exception, s)
- if target:
- raise SCons.Errors.BuildError(target[0], msg)
- else:
- raise SCons.Errors.UserError(msg)
-
-
-
-class Literal(object):
- """A wrapper for a string. If you use this object wrapped
- around a string, then it will be interpreted as literal.
- When passed to the command interpreter, all special
- characters will be escaped."""
- def __init__(self, lstr):
- self.lstr = lstr
-
- def __str__(self):
- return self.lstr
-
- def escape(self, escape_func):
- return escape_func(self.lstr)
-
- def for_signature(self):
- return self.lstr
-
- def is_literal(self):
- return 1
-
- def __eq__(self, other):
- if not isinstance(other, Literal):
- return False
- return self.lstr == other.lstr
-
- def __neq__(self, other):
- return not self.__eq__(other)
-
-class SpecialAttrWrapper(object):
- """This is a wrapper for what we call a 'Node special attribute.'
- This is any of the attributes of a Node that we can reference from
- Environment variable substitution, such as $TARGET.abspath or
- $SOURCES[1].filebase. We implement the same methods as Literal
- so we can handle special characters, plus a for_signature method,
- such that we can return some canonical string during signature
- calculation to avoid unnecessary rebuilds."""
-
- def __init__(self, lstr, for_signature=None):
- """The for_signature parameter, if supplied, will be the
- canonical string we return from for_signature(). Else
- we will simply return lstr."""
- self.lstr = lstr
- if for_signature:
- self.forsig = for_signature
- else:
- self.forsig = lstr
-
- def __str__(self):
- return self.lstr
-
- def escape(self, escape_func):
- return escape_func(self.lstr)
-
- def for_signature(self):
- return self.forsig
-
- def is_literal(self):
- return 1
-
-def quote_spaces(arg):
- """Generic function for putting double quotes around any string that
- has white space in it."""
- if ' ' in arg or '\t' in arg:
- return '"%s"' % arg
- else:
- return str(arg)
-
-class CmdStringHolder(collections.UserString):
- """This is a special class used to hold strings generated by
- scons_subst() and scons_subst_list(). It defines a special method
- escape(). When passed a function with an escape algorithm for a
- particular platform, it will return the contained string with the
- proper escape sequences inserted.
- """
- def __init__(self, cmd, literal=None):
- collections.UserString.__init__(self, cmd)
- self.literal = literal
-
- def is_literal(self):
- return self.literal
-
- def escape(self, escape_func, quote_func=quote_spaces):
- """Escape the string with the supplied function. The
- function is expected to take an arbitrary string, then
- return it with all special characters escaped and ready
- for passing to the command interpreter.
-
- After calling this function, the next call to str() will
- return the escaped string.
- """
-
- if self.is_literal():
- return escape_func(self.data)
- elif ' ' in self.data or '\t' in self.data:
- return quote_func(self.data)
- else:
- return self.data
-
-def escape_list(mylist, escape_func):
- """Escape a list of arguments by running the specified escape_func
- on every object in the list that has an escape() method."""
- def escape(obj, escape_func=escape_func):
- try:
- e = obj.escape
- except AttributeError:
- return obj
- else:
- return e(escape_func)
- return list(map(escape, mylist))
-
-class NLWrapper(object):
- """A wrapper class that delays turning a list of sources or targets
- into a NodeList until it's needed. The specified function supplied
- when the object is initialized is responsible for turning raw nodes
- into proxies that implement the special attributes like .abspath,
- .source, etc. This way, we avoid creating those proxies just
- "in case" someone is going to use $TARGET or the like, and only
- go through the trouble if we really have to.
-
- In practice, this might be a wash performance-wise, but it's a little
- cleaner conceptually...
- """
-
- def __init__(self, list, func):
- self.list = list
- self.func = func
- def _return_nodelist(self):
- return self.nodelist
- def _gen_nodelist(self):
- mylist = self.list
- if mylist is None:
- mylist = []
- elif not is_Sequence(mylist):
- mylist = [mylist]
- # The map(self.func) call is what actually turns
- # a list into appropriate proxies.
- self.nodelist = SCons.Util.NodeList(list(map(self.func, mylist)))
- self._create_nodelist = self._return_nodelist
- return self.nodelist
- _create_nodelist = _gen_nodelist
-
-
-class Targets_or_Sources(collections.UserList):
- """A class that implements $TARGETS or $SOURCES expansions by in turn
- wrapping a NLWrapper. This class handles the different methods used
- to access the list, calling the NLWrapper to create proxies on demand.
-
- Note that we subclass collections.UserList purely so that the
- is_Sequence() function will identify an object of this class as
- a list during variable expansion. We're not really using any
- collections.UserList methods in practice.
- """
- def __init__(self, nl):
- self.nl = nl
- def __getattr__(self, attr):
- nl = self.nl._create_nodelist()
- return getattr(nl, attr)
- def __getitem__(self, i):
- nl = self.nl._create_nodelist()
- return nl[i]
- def __getslice__(self, i, j):
- nl = self.nl._create_nodelist()
- i = max(i, 0); j = max(j, 0)
- return nl[i:j]
- def __str__(self):
- nl = self.nl._create_nodelist()
- return str(nl)
- def __repr__(self):
- nl = self.nl._create_nodelist()
- return repr(nl)
-
-class Target_or_Source(object):
- """A class that implements $TARGET or $SOURCE expansions by in turn
- wrapping a NLWrapper. This class handles the different methods used
- to access an individual proxy Node, calling the NLWrapper to create
- a proxy on demand.
- """
- def __init__(self, nl):
- self.nl = nl
- def __getattr__(self, attr):
- nl = self.nl._create_nodelist()
- try:
- nl0 = nl[0]
- except IndexError:
- # If there is nothing in the list, then we have no attributes to
- # pass through, so raise AttributeError for everything.
- raise AttributeError("NodeList has no attribute: %s" % attr)
- return getattr(nl0, attr)
- def __str__(self):
- nl = self.nl._create_nodelist()
- if nl:
- return str(nl[0])
- return ''
- def __repr__(self):
- nl = self.nl._create_nodelist()
- if nl:
- return repr(nl[0])
- return ''
-
-class NullNodeList(SCons.Util.NullSeq):
- def __call__(self, *args, **kwargs): return ''
- def __str__(self): return ''
-
-NullNodesList = NullNodeList()
-
-def subst_dict(target, source):
- """Create a dictionary for substitution of special
- construction variables.
-
- This translates the following special arguments:
-
- target - the target (object or array of objects),
- used to generate the TARGET and TARGETS
- construction variables
-
- source - the source (object or array of objects),
- used to generate the SOURCES and SOURCE
- construction variables
- """
- dict = {}
-
- if target:
- def get_tgt_subst_proxy(thing):
- try:
- subst_proxy = thing.get_subst_proxy()
- except AttributeError:
- subst_proxy = thing # probably a string, just return it
- return subst_proxy
- tnl = NLWrapper(target, get_tgt_subst_proxy)
- dict['TARGETS'] = Targets_or_Sources(tnl)
- dict['TARGET'] = Target_or_Source(tnl)
-
- # This is a total cheat, but hopefully this dictionary goes
- # away soon anyway. We just let these expand to $TARGETS
- # because that's "good enough" for the use of ToolSurrogates
- # (see test/ToolSurrogate.py) to generate documentation.
- dict['CHANGED_TARGETS'] = '$TARGETS'
- dict['UNCHANGED_TARGETS'] = '$TARGETS'
- else:
- dict['TARGETS'] = NullNodesList
- dict['TARGET'] = NullNodesList
-
- if source:
- def get_src_subst_proxy(node):
- try:
- rfile = node.rfile
- except AttributeError:
- pass
- else:
- node = rfile()
- try:
- return node.get_subst_proxy()
- except AttributeError:
- return node # probably a String, just return it
- snl = NLWrapper(source, get_src_subst_proxy)
- dict['SOURCES'] = Targets_or_Sources(snl)
- dict['SOURCE'] = Target_or_Source(snl)
-
- # This is a total cheat, but hopefully this dictionary goes
- # away soon anyway. We just let these expand to $TARGETS
- # because that's "good enough" for the use of ToolSurrogates
- # (see test/ToolSurrogate.py) to generate documentation.
- dict['CHANGED_SOURCES'] = '$SOURCES'
- dict['UNCHANGED_SOURCES'] = '$SOURCES'
- else:
- dict['SOURCES'] = NullNodesList
- dict['SOURCE'] = NullNodesList
-
- return dict
-
-# Constants for the "mode" parameter to scons_subst_list() and
-# scons_subst(). SUBST_RAW gives the raw command line. SUBST_CMD
-# gives a command line suitable for passing to a shell. SUBST_SIG
-# gives a command line appropriate for calculating the signature
-# of a command line...if this changes, we should rebuild.
-SUBST_CMD = 0
-SUBST_RAW = 1
-SUBST_SIG = 2
-
-_rm = re.compile(r'\$[()]')
-_remove = re.compile(r'\$\([^\$]*(\$[^\)][^\$]*)*\$\)')
-
-# Indexed by the SUBST_* constants above.
-_regex_remove = [ _rm, None, _remove ]
-
-def _rm_list(list):
- #return [ l for l in list if not l in ('$(', '$)') ]
- return [l for l in list if not l in ('$(', '$)')]
-
-def _remove_list(list):
- result = []
- do_append = result.append
- for l in list:
- if l == '$(':
- do_append = lambda x: None
- elif l == '$)':
- do_append = result.append
- else:
- do_append(l)
- return result
-
-# Indexed by the SUBST_* constants above.
-_list_remove = [ _rm_list, None, _remove_list ]
-
-# Regular expressions for splitting strings and handling substitutions,
-# for use by the scons_subst() and scons_subst_list() functions:
-#
-# The first expression compiled matches all of the $-introduced tokens
-# that we need to process in some way, and is used for substitutions.
-# The expressions it matches are:
-#
-# "$$"
-# "$("
-# "$)"
-# "$variable" [must begin with alphabetic or underscore]
-# "${any stuff}"
-#
-# The second expression compiled is used for splitting strings into tokens
-# to be processed, and it matches all of the tokens listed above, plus
-# the following that affect how arguments do or don't get joined together:
-#
-# " " [white space]
-# "non-white-space" [without any dollar signs]
-# "$" [single dollar sign]
-#
-_dollar_exps_str = r'\$[\$\(\)]|\$[_a-zA-Z][\.\w]*|\${[^}]*}'
-_dollar_exps = re.compile(r'(%s)' % _dollar_exps_str)
-_separate_args = re.compile(r'(%s|\s+|[^\s\$]+|\$)' % _dollar_exps_str)
-
-# This regular expression is used to replace strings of multiple white
-# space characters in the string result from the scons_subst() function.
-_space_sep = re.compile(r'[\t ]+(?![^{]*})')
-
-def scons_subst(strSubst, env, mode=SUBST_RAW, target=None, source=None, gvars={}, lvars={}, conv=None):
- """Expand a string or list containing construction variable
- substitutions.
-
- This is the work-horse function for substitutions in file names
- and the like. The companion scons_subst_list() function (below)
- handles separating command lines into lists of arguments, so see
- that function if that's what you're looking for.
- """
- if isinstance(strSubst, str) and strSubst.find('$') < 0:
- return strSubst
-
- class StringSubber(object):
- """A class to construct the results of a scons_subst() call.
-
- This binds a specific construction environment, mode, target and
- source with two methods (substitute() and expand()) that handle
- the expansion.
- """
- def __init__(self, env, mode, conv, gvars):
- self.env = env
- self.mode = mode
- self.conv = conv
- self.gvars = gvars
-
- def expand(self, s, lvars):
- """Expand a single "token" as necessary, returning an
- appropriate string containing the expansion.
-
- This handles expanding different types of things (strings,
- lists, callables) appropriately. It calls the wrapper
- substitute() method to re-expand things as necessary, so that
- the results of expansions of side-by-side strings still get
- re-evaluated separately, not smushed together.
- """
- if is_String(s):
- try:
- s0, s1 = s[:2]
- except (IndexError, ValueError):
- return s
- if s0 != '$':
- return s
- if s1 == '$':
- return '$'
- elif s1 in '()':
- return s
- else:
- key = s[1:]
- if key[0] == '{' or key.find('.') >= 0:
- if key[0] == '{':
- key = key[1:-1]
- try:
- s = eval(key, self.gvars, lvars)
- except KeyboardInterrupt:
- raise
- except Exception, e:
- if e.__class__ in AllowableExceptions:
- return ''
- raise_exception(e, lvars['TARGETS'], s)
- else:
- if key in lvars:
- s = lvars[key]
- elif key in self.gvars:
- s = self.gvars[key]
- elif not NameError in AllowableExceptions:
- raise_exception(NameError(key), lvars['TARGETS'], s)
- else:
- return ''
-
- # Before re-expanding the result, handle
- # recursive expansion by copying the local
- # variable dictionary and overwriting a null
- # string for the value of the variable name
- # we just expanded.
- #
- # This could potentially be optimized by only
- # copying lvars when s contains more expansions,
- # but lvars is usually supposed to be pretty
- # small, and deeply nested variable expansions
- # are probably more the exception than the norm,
- # so it should be tolerable for now.
- lv = lvars.copy()
- var = key.split('.')[0]
- lv[var] = ''
- return self.substitute(s, lv)
- elif is_Sequence(s):
- def func(l, conv=self.conv, substitute=self.substitute, lvars=lvars):
- return conv(substitute(l, lvars))
- return list(map(func, s))
- elif callable(s):
- try:
- s = s(target=lvars['TARGETS'],
- source=lvars['SOURCES'],
- env=self.env,
- for_signature=(self.mode != SUBST_CMD))
- except TypeError:
- # This probably indicates that it's a callable
- # object that doesn't match our calling arguments
- # (like an Action).
- if self.mode == SUBST_RAW:
- return s
- s = self.conv(s)
- return self.substitute(s, lvars)
- elif s is None:
- return ''
- else:
- return s
-
- def substitute(self, args, lvars):
- """Substitute expansions in an argument or list of arguments.
-
- This serves as a wrapper for splitting up a string into
- separate tokens.
- """
- if is_String(args) and not isinstance(args, CmdStringHolder):
- args = str(args) # In case it's a UserString.
- try:
- def sub_match(match):
- return self.conv(self.expand(match.group(1), lvars))
- result = _dollar_exps.sub(sub_match, args)
- except TypeError:
- # If the internal conversion routine doesn't return
- # strings (it could be overridden to return Nodes, for
- # example), then the 1.5.2 re module will throw this
- # exception. Back off to a slower, general-purpose
- # algorithm that works for all data types.
- args = _separate_args.findall(args)
- result = []
- for a in args:
- result.append(self.conv(self.expand(a, lvars)))
- if len(result) == 1:
- result = result[0]
- else:
- result = ''.join(map(str, result))
- return result
- else:
- return self.expand(args, lvars)
-
- if conv is None:
- conv = _strconv[mode]
-
- # Doing this every time is a bit of a waste, since the Executor
- # has typically already populated the OverrideEnvironment with
- # $TARGET/$SOURCE variables. We're keeping this (for now), though,
- # because it supports existing behavior that allows us to call
- # an Action directly with an arbitrary target+source pair, which
- # we use in Tool/tex.py to handle calling $BIBTEX when necessary.
- # If we dropped that behavior (or found another way to cover it),
- # we could get rid of this call completely and just rely on the
- # Executor setting the variables.
- if 'TARGET' not in lvars:
- d = subst_dict(target, source)
- if d:
- lvars = lvars.copy()
- lvars.update(d)
-
- # We're (most likely) going to eval() things. If Python doesn't
- # find a __builtins__ value in the global dictionary used for eval(),
- # it copies the current global values for you. Avoid this by
- # setting it explicitly and then deleting, so we don't pollute the
- # construction environment Dictionary(ies) that are typically used
- # for expansion.
- gvars['__builtins__'] = __builtins__
-
- ss = StringSubber(env, mode, conv, gvars)
- result = ss.substitute(strSubst, lvars)
-
- try:
- del gvars['__builtins__']
- except KeyError:
- pass
-
- if is_String(result):
- # Remove $(-$) pairs and any stuff in between,
- # if that's appropriate.
- remove = _regex_remove[mode]
- if remove:
- result = remove.sub('', result)
- if mode != SUBST_RAW:
- # Compress strings of white space characters into
- # a single space.
- result = _space_sep.sub(' ', result).strip()
- elif is_Sequence(result):
- remove = _list_remove[mode]
- if remove:
- result = remove(result)
-
- return result
-
-#Subst_List_Strings = {}
-
-def scons_subst_list(strSubst, env, mode=SUBST_RAW, target=None, source=None, gvars={}, lvars={}, conv=None):
- """Substitute construction variables in a string (or list or other
- object) and separate the arguments into a command list.
-
- The companion scons_subst() function (above) handles basic
- substitutions within strings, so see that function instead
- if that's what you're looking for.
- """
-# try:
-# Subst_List_Strings[strSubst] = Subst_List_Strings[strSubst] + 1
-# except KeyError:
-# Subst_List_Strings[strSubst] = 1
-# import SCons.Debug
-# SCons.Debug.caller_trace(1)
- class ListSubber(collections.UserList):
- """A class to construct the results of a scons_subst_list() call.
-
- Like StringSubber, this class binds a specific construction
- environment, mode, target and source with two methods
- (substitute() and expand()) that handle the expansion.
-
- In addition, however, this class is used to track the state of
- the result(s) we're gathering so we can do the appropriate thing
- whenever we have to append another word to the result--start a new
- line, start a new word, append to the current word, etc. We do
- this by setting the "append" attribute to the right method so
- that our wrapper methods only need ever call ListSubber.append(),
- and the rest of the object takes care of doing the right thing
- internally.
- """
- def __init__(self, env, mode, conv, gvars):
- collections.UserList.__init__(self, [])
- self.env = env
- self.mode = mode
- self.conv = conv
- self.gvars = gvars
-
- if self.mode == SUBST_RAW:
- self.add_strip = lambda x: self.append(x)
- else:
- self.add_strip = lambda x: None
- self.in_strip = None
- self.next_line()
-
- def expand(self, s, lvars, within_list):
- """Expand a single "token" as necessary, appending the
- expansion to the current result.
-
- This handles expanding different types of things (strings,
- lists, callables) appropriately. It calls the wrapper
- substitute() method to re-expand things as necessary, so that
- the results of expansions of side-by-side strings still get
- re-evaluated separately, not smushed together.
- """
-
- if is_String(s):
- try:
- s0, s1 = s[:2]
- except (IndexError, ValueError):
- self.append(s)
- return
- if s0 != '$':
- self.append(s)
- return
- if s1 == '$':
- self.append('$')
- elif s1 == '(':
- self.open_strip('$(')
- elif s1 == ')':
- self.close_strip('$)')
- else:
- key = s[1:]
- if key[0] == '{' or key.find('.') >= 0:
- if key[0] == '{':
- key = key[1:-1]
- try:
- s = eval(key, self.gvars, lvars)
- except KeyboardInterrupt:
- raise
- except Exception, e:
- if e.__class__ in AllowableExceptions:
- return
- raise_exception(e, lvars['TARGETS'], s)
- else:
- if key in lvars:
- s = lvars[key]
- elif key in self.gvars:
- s = self.gvars[key]
- elif not NameError in AllowableExceptions:
- raise_exception(NameError(), lvars['TARGETS'], s)
- else:
- return
-
- # Before re-expanding the result, handle
- # recursive expansion by copying the local
- # variable dictionary and overwriting a null
- # string for the value of the variable name
- # we just expanded.
- lv = lvars.copy()
- var = key.split('.')[0]
- lv[var] = ''
- self.substitute(s, lv, 0)
- self.this_word()
- elif is_Sequence(s):
- for a in s:
- self.substitute(a, lvars, 1)
- self.next_word()
- elif callable(s):
- try:
- s = s(target=lvars['TARGETS'],
- source=lvars['SOURCES'],
- env=self.env,
- for_signature=(self.mode != SUBST_CMD))
- except TypeError:
- # This probably indicates that it's a callable
- # object that doesn't match our calling arguments
- # (like an Action).
- if self.mode == SUBST_RAW:
- self.append(s)
- return
- s = self.conv(s)
- self.substitute(s, lvars, within_list)
- elif s is None:
- self.this_word()
- else:
- self.append(s)
-
- def substitute(self, args, lvars, within_list):
- """Substitute expansions in an argument or list of arguments.
-
- This serves as a wrapper for splitting up a string into
- separate tokens.
- """
-
- if is_String(args) and not isinstance(args, CmdStringHolder):
- args = str(args) # In case it's a UserString.
- args = _separate_args.findall(args)
- for a in args:
- if a[0] in ' \t\n\r\f\v':
- if '\n' in a:
- self.next_line()
- elif within_list:
- self.append(a)
- else:
- self.next_word()
- else:
- self.expand(a, lvars, within_list)
- else:
- self.expand(args, lvars, within_list)
-
- def next_line(self):
- """Arrange for the next word to start a new line. This
- is like starting a new word, except that we have to append
- another line to the result."""
- collections.UserList.append(self, [])
- self.next_word()
-
- def this_word(self):
- """Arrange for the next word to append to the end of the
- current last word in the result."""
- self.append = self.add_to_current_word
-
- def next_word(self):
- """Arrange for the next word to start a new word."""
- self.append = self.add_new_word
-
- def add_to_current_word(self, x):
- """Append the string x to the end of the current last word
- in the result. If that is not possible, then just add
- it as a new word. Make sure the entire concatenated string
- inherits the object attributes of x (in particular, the
- escape function) by wrapping it as CmdStringHolder."""
-
- if not self.in_strip or self.mode != SUBST_SIG:
- try:
- current_word = self[-1][-1]
- except IndexError:
- self.add_new_word(x)
- else:
- # All right, this is a hack and it should probably
- # be refactored out of existence in the future.
- # The issue is that we want to smoosh words together
- # and make one file name that gets escaped if
- # we're expanding something like foo$EXTENSION,
- # but we don't want to smoosh them together if
- # it's something like >$TARGET, because then we'll
- # treat the '>' like it's part of the file name.
- # So for now, just hard-code looking for the special
- # command-line redirection characters...
- try:
- last_char = str(current_word)[-1]
- except IndexError:
- last_char = '\0'
- if last_char in '<>|':
- self.add_new_word(x)
- else:
- y = current_word + x
-
- # We used to treat a word appended to a literal
- # as a literal itself, but this caused problems
- # with interpreting quotes around space-separated
- # targets on command lines. Removing this makes
- # none of the "substantive" end-to-end tests fail,
- # so we'll take this out but leave it commented
- # for now in case there's a problem not covered
- # by the test cases and we need to resurrect this.
- #literal1 = self.literal(self[-1][-1])
- #literal2 = self.literal(x)
- y = self.conv(y)
- if is_String(y):
- #y = CmdStringHolder(y, literal1 or literal2)
- y = CmdStringHolder(y, None)
- self[-1][-1] = y
-
- def add_new_word(self, x):
- if not self.in_strip or self.mode != SUBST_SIG:
- literal = self.literal(x)
- x = self.conv(x)
- if is_String(x):
- x = CmdStringHolder(x, literal)
- self[-1].append(x)
- self.append = self.add_to_current_word
-
- def literal(self, x):
- try:
- l = x.is_literal
- except AttributeError:
- return None
- else:
- return l()
-
- def open_strip(self, x):
- """Handle the "open strip" $( token."""
- self.add_strip(x)
- self.in_strip = 1
-
- def close_strip(self, x):
- """Handle the "close strip" $) token."""
- self.add_strip(x)
- self.in_strip = None
-
- if conv is None:
- conv = _strconv[mode]
-
- # Doing this every time is a bit of a waste, since the Executor
- # has typically already populated the OverrideEnvironment with
- # $TARGET/$SOURCE variables. We're keeping this (for now), though,
- # because it supports existing behavior that allows us to call
- # an Action directly with an arbitrary target+source pair, which
- # we use in Tool/tex.py to handle calling $BIBTEX when necessary.
- # If we dropped that behavior (or found another way to cover it),
- # we could get rid of this call completely and just rely on the
- # Executor setting the variables.
- if 'TARGET' not in lvars:
- d = subst_dict(target, source)
- if d:
- lvars = lvars.copy()
- lvars.update(d)
-
- # We're (most likely) going to eval() things. If Python doesn't
- # find a __builtins__ value in the global dictionary used for eval(),
- # it copies the current global values for you. Avoid this by
- # setting it explicitly and then deleting, so we don't pollute the
- # construction environment Dictionary(ies) that are typically used
- # for expansion.
- gvars['__builtins__'] = __builtins__
-
- ls = ListSubber(env, mode, conv, gvars)
- ls.substitute(strSubst, lvars, 0)
-
- try:
- del gvars['__builtins__']
- except KeyError:
- pass
-
- return ls.data
-
-def scons_subst_once(strSubst, env, key):
- """Perform single (non-recursive) substitution of a single
- construction variable keyword.
-
- This is used when setting a variable when copying or overriding values
- in an Environment. We want to capture (expand) the old value before
- we override it, so people can do things like:
-
- env2 = env.Clone(CCFLAGS = '$CCFLAGS -g')
-
- We do this with some straightforward, brute-force code here...
- """
- if isinstance(strSubst, str) and strSubst.find('$') < 0:
- return strSubst
-
- matchlist = ['$' + key, '${' + key + '}']
- val = env.get(key, '')
- def sub_match(match, val=val, matchlist=matchlist):
- a = match.group(1)
- if a in matchlist:
- a = val
- if is_Sequence(a):
- return ' '.join(map(str, a))
- else:
- return str(a)
-
- if is_Sequence(strSubst):
- result = []
- for arg in strSubst:
- if is_String(arg):
- if arg in matchlist:
- arg = val
- if is_Sequence(arg):
- result.extend(arg)
- else:
- result.append(arg)
- else:
- result.append(_dollar_exps.sub(sub_match, arg))
- else:
- result.append(arg)
- return result
- elif is_String(strSubst):
- return _dollar_exps.sub(sub_match, strSubst)
- else:
- return strSubst
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Taskmaster.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Taskmaster.py
deleted file mode 100644
index b303f79..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Taskmaster.py
+++ /dev/null
@@ -1,1049 +0,0 @@
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-__doc__ = """
-Generic Taskmaster module for the SCons build engine.
-
-This module contains the primary interface(s) between a wrapping user
-interface and the SCons build engine. There are two key classes here:
-
- Taskmaster
- This is the main engine for walking the dependency graph and
- calling things to decide what does or doesn't need to be built.
-
- Task
- This is the base class for allowing a wrapping interface to
- decide what does or doesn't actually need to be done. The
- intention is for a wrapping interface to subclass this as
- appropriate for different types of behavior it may need.
-
- The canonical example is the SCons native Python interface,
- which has Task subclasses that handle its specific behavior,
- like printing "`foo' is up to date" when a top-level target
- doesn't need to be built, and handling the -c option by removing
- targets as its "build" action. There is also a separate subclass
- for suppressing this output when the -q option is used.
-
- The Taskmaster instantiates a Task object for each (set of)
- target(s) that it decides need to be evaluated and/or built.
-"""
-
-__revision__ = "src/engine/SCons/Taskmaster.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-from itertools import chain
-import operator
-import sys
-import traceback
-
-import SCons.Errors
-import SCons.Node
-import SCons.Warnings
-
-StateString = SCons.Node.StateString
-NODE_NO_STATE = SCons.Node.no_state
-NODE_PENDING = SCons.Node.pending
-NODE_EXECUTING = SCons.Node.executing
-NODE_UP_TO_DATE = SCons.Node.up_to_date
-NODE_EXECUTED = SCons.Node.executed
-NODE_FAILED = SCons.Node.failed
-
-print_prepare = 0 # set by option --debug=prepare
-
-# A subsystem for recording stats about how different Nodes are handled by
-# the main Taskmaster loop. There's no external control here (no need for
-# a --debug= option); enable it by changing the value of CollectStats.
-
-CollectStats = None
-
-class Stats(object):
- """
- A simple class for holding statistics about the disposition of a
- Node by the Taskmaster. If we're collecting statistics, each Node
- processed by the Taskmaster gets one of these attached, in which case
- the Taskmaster records its decision each time it processes the Node.
- (Ideally, that's just once per Node.)
- """
- def __init__(self):
- """
- Instantiates a Taskmaster.Stats object, initializing all
- appropriate counters to zero.
- """
- self.considered = 0
- self.already_handled = 0
- self.problem = 0
- self.child_failed = 0
- self.not_built = 0
- self.side_effects = 0
- self.build = 0
-
-StatsNodes = []
-
-fmt = "%(considered)3d "\
- "%(already_handled)3d " \
- "%(problem)3d " \
- "%(child_failed)3d " \
- "%(not_built)3d " \
- "%(side_effects)3d " \
- "%(build)3d "
-
-def dump_stats():
- for n in sorted(StatsNodes, key=lambda a: str(a)):
- print (fmt % n.stats.__dict__) + str(n)
-
-
-
-class Task(object):
- """
- Default SCons build engine task.
-
- This controls the interaction of the actual building of node
- and the rest of the engine.
-
- This is expected to handle all of the normally-customizable
- aspects of controlling a build, so any given application
- *should* be able to do what it wants by sub-classing this
- class and overriding methods as appropriate. If an application
- needs to customze something by sub-classing Taskmaster (or
- some other build engine class), we should first try to migrate
- that functionality into this class.
-
- Note that it's generally a good idea for sub-classes to call
- these methods explicitly to update state, etc., rather than
- roll their own interaction with Taskmaster from scratch.
- """
- def __init__(self, tm, targets, top, node):
- self.tm = tm
- self.targets = targets
- self.top = top
- self.node = node
- self.exc_clear()
-
- def trace_message(self, method, node, description='node'):
- fmt = '%-20s %s %s\n'
- return fmt % (method + ':', description, self.tm.trace_node(node))
-
- def display(self, message):
- """
- Hook to allow the calling interface to display a message.
-
- This hook gets called as part of preparing a task for execution
- (that is, a Node to be built). As part of figuring out what Node
- should be built next, the actually target list may be altered,
- along with a message describing the alteration. The calling
- interface can subclass Task and provide a concrete implementation
- of this method to see those messages.
- """
- pass
-
- def prepare(self):
- """
- Called just before the task is executed.
-
- This is mainly intended to give the target Nodes a chance to
- unlink underlying files and make all necessary directories before
- the Action is actually called to build the targets.
- """
- global print_prepare
- T = self.tm.trace
- if T: T.write(self.trace_message(u'Task.prepare()', self.node))
-
- # Now that it's the appropriate time, give the TaskMaster a
- # chance to raise any exceptions it encountered while preparing
- # this task.
- self.exception_raise()
-
- if self.tm.message:
- self.display(self.tm.message)
- self.tm.message = None
-
- # Let the targets take care of any necessary preparations.
- # This includes verifying that all of the necessary sources
- # and dependencies exist, removing the target file(s), etc.
- #
- # As of April 2008, the get_executor().prepare() method makes
- # sure that all of the aggregate sources necessary to build this
- # Task's target(s) exist in one up-front check. The individual
- # target t.prepare() methods check that each target's explicit
- # or implicit dependencies exists, and also initialize the
- # .sconsign info.
- executor = self.targets[0].get_executor()
- if executor is None:
- return
- executor.prepare()
- for t in executor.get_action_targets():
- if print_prepare:
- print "Preparing target %s..."%t
- for s in t.side_effects:
- print "...with side-effect %s..."%s
- t.prepare()
- for s in t.side_effects:
- if print_prepare:
- print "...Preparing side-effect %s..."%s
- s.prepare()
-
- def get_target(self):
- """Fetch the target being built or updated by this task.
- """
- return self.node
-
- def needs_execute(self):
- # TODO(deprecate): "return True" is the old default behavior;
- # change it to NotImplementedError (after running through the
- # Deprecation Cycle) so the desired behavior is explicitly
- # determined by which concrete subclass is used.
- #raise NotImplementedError
- msg = ('Taskmaster.Task is an abstract base class; instead of\n'
- '\tusing it directly, '
- 'derive from it and override the abstract methods.')
- SCons.Warnings.warn(SCons.Warnings.TaskmasterNeedsExecuteWarning, msg)
- return True
-
- def execute(self):
- """
- Called to execute the task.
-
- This method is called from multiple threads in a parallel build,
- so only do thread safe stuff here. Do thread unsafe stuff in
- prepare(), executed() or failed().
- """
- T = self.tm.trace
- if T: T.write(self.trace_message(u'Task.execute()', self.node))
-
- try:
- cached_targets = []
- for t in self.targets:
- if not t.retrieve_from_cache():
- break
- cached_targets.append(t)
- if len(cached_targets) < len(self.targets):
- # Remove targets before building. It's possible that we
- # partially retrieved targets from the cache, leaving
- # them in read-only mode. That might cause the command
- # to fail.
- #
- for t in cached_targets:
- try:
- t.fs.unlink(t.get_internal_path())
- except (IOError, OSError):
- pass
- self.targets[0].build()
- else:
- for t in cached_targets:
- t.cached = 1
- except SystemExit:
- exc_value = sys.exc_info()[1]
- raise SCons.Errors.ExplicitExit(self.targets[0], exc_value.code)
- except SCons.Errors.UserError:
- raise
- except SCons.Errors.BuildError:
- raise
- except Exception, e:
- buildError = SCons.Errors.convert_to_BuildError(e)
- buildError.node = self.targets[0]
- buildError.exc_info = sys.exc_info()
- raise buildError
-
- def executed_without_callbacks(self):
- """
- Called when the task has been successfully executed
- and the Taskmaster instance doesn't want to call
- the Node's callback methods.
- """
- T = self.tm.trace
- if T: T.write(self.trace_message('Task.executed_without_callbacks()',
- self.node))
-
- for t in self.targets:
- if t.get_state() == NODE_EXECUTING:
- for side_effect in t.side_effects:
- side_effect.set_state(NODE_NO_STATE)
- t.set_state(NODE_EXECUTED)
-
- def executed_with_callbacks(self):
- """
- Called when the task has been successfully executed and
- the Taskmaster instance wants to call the Node's callback
- methods.
-
- This may have been a do-nothing operation (to preserve build
- order), so we must check the node's state before deciding whether
- it was "built", in which case we call the appropriate Node method.
- In any event, we always call "visited()", which will handle any
- post-visit actions that must take place regardless of whether
- or not the target was an actual built target or a source Node.
- """
- global print_prepare
- T = self.tm.trace
- if T: T.write(self.trace_message('Task.executed_with_callbacks()',
- self.node))
-
- for t in self.targets:
- if t.get_state() == NODE_EXECUTING:
- for side_effect in t.side_effects:
- side_effect.set_state(NODE_NO_STATE)
- t.set_state(NODE_EXECUTED)
- if not t.cached:
- t.push_to_cache()
- t.built()
- t.visited()
- if (not print_prepare and
- (not hasattr(self, 'options') or not self.options.debug_includes)):
- t.release_target_info()
- else:
- t.visited()
-
- executed = executed_with_callbacks
-
- def failed(self):
- """
- Default action when a task fails: stop the build.
-
- Note: Although this function is normally invoked on nodes in
- the executing state, it might also be invoked on up-to-date
- nodes when using Configure().
- """
- self.fail_stop()
-
- def fail_stop(self):
- """
- Explicit stop-the-build failure.
-
- This sets failure status on the target nodes and all of
- their dependent parent nodes.
-
- Note: Although this function is normally invoked on nodes in
- the executing state, it might also be invoked on up-to-date
- nodes when using Configure().
- """
- T = self.tm.trace
- if T: T.write(self.trace_message('Task.failed_stop()', self.node))
-
- # Invoke will_not_build() to clean-up the pending children
- # list.
- self.tm.will_not_build(self.targets, lambda n: n.set_state(NODE_FAILED))
-
- # Tell the taskmaster to not start any new tasks
- self.tm.stop()
-
- # We're stopping because of a build failure, but give the
- # calling Task class a chance to postprocess() the top-level
- # target under which the build failure occurred.
- self.targets = [self.tm.current_top]
- self.top = 1
-
- def fail_continue(self):
- """
- Explicit continue-the-build failure.
-
- This sets failure status on the target nodes and all of
- their dependent parent nodes.
-
- Note: Although this function is normally invoked on nodes in
- the executing state, it might also be invoked on up-to-date
- nodes when using Configure().
- """
- T = self.tm.trace
- if T: T.write(self.trace_message('Task.failed_continue()', self.node))
-
- self.tm.will_not_build(self.targets, lambda n: n.set_state(NODE_FAILED))
-
- def make_ready_all(self):
- """
- Marks all targets in a task ready for execution.
-
- This is used when the interface needs every target Node to be
- visited--the canonical example being the "scons -c" option.
- """
- T = self.tm.trace
- if T: T.write(self.trace_message('Task.make_ready_all()', self.node))
-
- self.out_of_date = self.targets[:]
- for t in self.targets:
- t.disambiguate().set_state(NODE_EXECUTING)
- for s in t.side_effects:
- # add disambiguate here to mirror the call on targets above
- s.disambiguate().set_state(NODE_EXECUTING)
-
- def make_ready_current(self):
- """
- Marks all targets in a task ready for execution if any target
- is not current.
-
- This is the default behavior for building only what's necessary.
- """
- global print_prepare
- T = self.tm.trace
- if T: T.write(self.trace_message(u'Task.make_ready_current()',
- self.node))
-
- self.out_of_date = []
- needs_executing = False
- for t in self.targets:
- try:
- t.disambiguate().make_ready()
- is_up_to_date = not t.has_builder() or \
- (not t.always_build and t.is_up_to_date())
- except EnvironmentError, e:
- raise SCons.Errors.BuildError(node=t, errstr=e.strerror, filename=e.filename)
-
- if not is_up_to_date:
- self.out_of_date.append(t)
- needs_executing = True
-
- if needs_executing:
- for t in self.targets:
- t.set_state(NODE_EXECUTING)
- for s in t.side_effects:
- # add disambiguate here to mirror the call on targets in first loop above
- s.disambiguate().set_state(NODE_EXECUTING)
- else:
- for t in self.targets:
- # We must invoke visited() to ensure that the node
- # information has been computed before allowing the
- # parent nodes to execute. (That could occur in a
- # parallel build...)
- t.visited()
- t.set_state(NODE_UP_TO_DATE)
- if (not print_prepare and
- (not hasattr(self, 'options') or not self.options.debug_includes)):
- t.release_target_info()
-
- make_ready = make_ready_current
-
- def postprocess(self):
- """
- Post-processes a task after it's been executed.
-
- This examines all the targets just built (or not, we don't care
- if the build was successful, or even if there was no build
- because everything was up-to-date) to see if they have any
- waiting parent Nodes, or Nodes waiting on a common side effect,
- that can be put back on the candidates list.
- """
- T = self.tm.trace
- if T: T.write(self.trace_message(u'Task.postprocess()', self.node))
-
- # We may have built multiple targets, some of which may have
- # common parents waiting for this build. Count up how many
- # targets each parent was waiting for so we can subtract the
- # values later, and so we *don't* put waiting side-effect Nodes
- # back on the candidates list if the Node is also a waiting
- # parent.
-
- targets = set(self.targets)
-
- pending_children = self.tm.pending_children
- parents = {}
- for t in targets:
- # A node can only be in the pending_children set if it has
- # some waiting_parents.
- if t.waiting_parents:
- if T: T.write(self.trace_message(u'Task.postprocess()',
- t,
- 'removing'))
- pending_children.discard(t)
- for p in t.waiting_parents:
- parents[p] = parents.get(p, 0) + 1
-
- for t in targets:
- if t.side_effects is not None:
- for s in t.side_effects:
- if s.get_state() == NODE_EXECUTING:
- s.set_state(NODE_NO_STATE)
- for p in s.waiting_parents:
- parents[p] = parents.get(p, 0) + 1
- for p in s.waiting_s_e:
- if p.ref_count == 0:
- self.tm.candidates.append(p)
-
- for p, subtract in parents.items():
- p.ref_count = p.ref_count - subtract
- if T: T.write(self.trace_message(u'Task.postprocess()',
- p,
- 'adjusted parent ref count'))
- if p.ref_count == 0:
- self.tm.candidates.append(p)
-
- for t in targets:
- t.postprocess()
-
- # Exception handling subsystem.
- #
- # Exceptions that occur while walking the DAG or examining Nodes
- # must be raised, but must be raised at an appropriate time and in
- # a controlled manner so we can, if necessary, recover gracefully,
- # possibly write out signature information for Nodes we've updated,
- # etc. This is done by having the Taskmaster tell us about the
- # exception, and letting
-
- def exc_info(self):
- """
- Returns info about a recorded exception.
- """
- return self.exception
-
- def exc_clear(self):
- """
- Clears any recorded exception.
-
- This also changes the "exception_raise" attribute to point
- to the appropriate do-nothing method.
- """
- self.exception = (None, None, None)
- self.exception_raise = self._no_exception_to_raise
-
- def exception_set(self, exception=None):
- """
- Records an exception to be raised at the appropriate time.
-
- This also changes the "exception_raise" attribute to point
- to the method that will, in fact
- """
- if not exception:
- exception = sys.exc_info()
- self.exception = exception
- self.exception_raise = self._exception_raise
-
- def _no_exception_to_raise(self):
- pass
-
- def _exception_raise(self):
- """
- Raises a pending exception that was recorded while getting a
- Task ready for execution.
- """
- exc = self.exc_info()[:]
- try:
- exc_type, exc_value, exc_traceback = exc
- except ValueError:
- exc_type, exc_value = exc
- exc_traceback = None
- raise exc_type, exc_value, exc_traceback
-
-class AlwaysTask(Task):
- def needs_execute(self):
- """
- Always returns True (indicating this Task should always
- be executed).
-
- Subclasses that need this behavior (as opposed to the default
- of only executing Nodes that are out of date w.r.t. their
- dependencies) can use this as follows:
-
- class MyTaskSubclass(SCons.Taskmaster.Task):
- needs_execute = SCons.Taskmaster.Task.execute_always
- """
- return True
-
-class OutOfDateTask(Task):
- def needs_execute(self):
- """
- Returns True (indicating this Task should be executed) if this
- Task's target state indicates it needs executing, which has
- already been determined by an earlier up-to-date check.
- """
- return self.targets[0].get_state() == SCons.Node.executing
-
-
-def find_cycle(stack, visited):
- if stack[-1] in visited:
- return None
- visited.add(stack[-1])
- for n in stack[-1].waiting_parents:
- stack.append(n)
- if stack[0] == stack[-1]:
- return stack
- if find_cycle(stack, visited):
- return stack
- stack.pop()
- return None
-
-
-class Taskmaster(object):
- """
- The Taskmaster for walking the dependency DAG.
- """
-
- def __init__(self, targets=[], tasker=None, order=None, trace=None):
- self.original_top = targets
- self.top_targets_left = targets[:]
- self.top_targets_left.reverse()
- self.candidates = []
- if tasker is None:
- tasker = OutOfDateTask
- self.tasker = tasker
- if not order:
- order = lambda l: l
- self.order = order
- self.message = None
- self.trace = trace
- self.next_candidate = self.find_next_candidate
- self.pending_children = set()
-
- def find_next_candidate(self):
- """
- Returns the next candidate Node for (potential) evaluation.
-
- The candidate list (really a stack) initially consists of all of
- the top-level (command line) targets provided when the Taskmaster
- was initialized. While we walk the DAG, visiting Nodes, all the
- children that haven't finished processing get pushed on to the
- candidate list. Each child can then be popped and examined in
- turn for whether *their* children are all up-to-date, in which
- case a Task will be created for their actual evaluation and
- potential building.
-
- Here is where we also allow candidate Nodes to alter the list of
- Nodes that should be examined. This is used, for example, when
- invoking SCons in a source directory. A source directory Node can
- return its corresponding build directory Node, essentially saying,
- "Hey, you really need to build this thing over here instead."
- """
- try:
- return self.candidates.pop()
- except IndexError:
- pass
- try:
- node = self.top_targets_left.pop()
- except IndexError:
- return None
- self.current_top = node
- alt, message = node.alter_targets()
- if alt:
- self.message = message
- self.candidates.append(node)
- self.candidates.extend(self.order(alt))
- node = self.candidates.pop()
- return node
-
- def no_next_candidate(self):
- """
- Stops Taskmaster processing by not returning a next candidate.
-
- Note that we have to clean-up the Taskmaster candidate list
- because the cycle detection depends on the fact all nodes have
- been processed somehow.
- """
- while self.candidates:
- candidates = self.candidates
- self.candidates = []
- self.will_not_build(candidates)
- return None
-
- def _validate_pending_children(self):
- """
- Validate the content of the pending_children set. Assert if an
- internal error is found.
-
- This function is used strictly for debugging the taskmaster by
- checking that no invariants are violated. It is not used in
- normal operation.
-
- The pending_children set is used to detect cycles in the
- dependency graph. We call a "pending child" a child that is
- found in the "pending" state when checking the dependencies of
- its parent node.
-
- A pending child can occur when the Taskmaster completes a loop
- through a cycle. For example, lets imagine a graph made of
- three node (A, B and C) making a cycle. The evaluation starts
- at node A. The taskmaster first consider whether node A's
- child B is up-to-date. Then, recursively, node B needs to
- check whether node C is up-to-date. This leaves us with a
- dependency graph looking like:
-
- Next candidate \
- \
- Node A (Pending) --> Node B(Pending) --> Node C (NoState)
- ^ |
- | |
- +-------------------------------------+
-
- Now, when the Taskmaster examines the Node C's child Node A,
- it finds that Node A is in the "pending" state. Therefore,
- Node A is a pending child of node C.
-
- Pending children indicate that the Taskmaster has potentially
- loop back through a cycle. We say potentially because it could
- also occur when a DAG is evaluated in parallel. For example,
- consider the following graph:
-
-
- Node A (Pending) --> Node B(Pending) --> Node C (Pending) --> ...
- | ^
- | |
- +----------> Node D (NoState) --------+
- /
- Next candidate /
-
- The Taskmaster first evaluates the nodes A, B, and C and
- starts building some children of node C. Assuming, that the
- maximum parallel level has not been reached, the Taskmaster
- will examine Node D. It will find that Node C is a pending
- child of Node D.
-
- In summary, evaluating a graph with a cycle will always
- involve a pending child at one point. A pending child might
- indicate either a cycle or a diamond-shaped DAG. Only a
- fraction of the nodes ends-up being a "pending child" of
- another node. This keeps the pending_children set small in
- practice.
-
- We can differentiate between the two cases if we wait until
- the end of the build. At this point, all the pending children
- nodes due to a diamond-shaped DAG will have been properly
- built (or will have failed to build). But, the pending
- children involved in a cycle will still be in the pending
- state.
-
- The taskmaster removes nodes from the pending_children set as
- soon as a pending_children node moves out of the pending
- state. This also helps to keep the pending_children set small.
- """
-
- for n in self.pending_children:
- assert n.state in (NODE_PENDING, NODE_EXECUTING), \
- (str(n), StateString[n.state])
- assert len(n.waiting_parents) != 0, (str(n), len(n.waiting_parents))
- for p in n.waiting_parents:
- assert p.ref_count > 0, (str(n), str(p), p.ref_count)
-
-
- def trace_message(self, message):
- return 'Taskmaster: %s\n' % message
-
- def trace_node(self, node):
- return '<%-10s %-3s %s>' % (StateString[node.get_state()],
- node.ref_count,
- repr(str(node)))
-
- def _find_next_ready_node(self):
- """
- Finds the next node that is ready to be built.
-
- This is *the* main guts of the DAG walk. We loop through the
- list of candidates, looking for something that has no un-built
- children (i.e., that is a leaf Node or has dependencies that are
- all leaf Nodes or up-to-date). Candidate Nodes are re-scanned
- (both the target Node itself and its sources, which are always
- scanned in the context of a given target) to discover implicit
- dependencies. A Node that must wait for some children to be
- built will be put back on the candidates list after the children
- have finished building. A Node that has been put back on the
- candidates list in this way may have itself (or its sources)
- re-scanned, in order to handle generated header files (e.g.) and
- the implicit dependencies therein.
-
- Note that this method does not do any signature calculation or
- up-to-date check itself. All of that is handled by the Task
- class. This is purely concerned with the dependency graph walk.
- """
-
- self.ready_exc = None
-
- T = self.trace
- if T: T.write(u'\n' + self.trace_message('Looking for a node to evaluate'))
-
- while True:
- node = self.next_candidate()
- if node is None:
- if T: T.write(self.trace_message('No candidate anymore.') + u'\n')
- return None
-
- node = node.disambiguate()
- state = node.get_state()
-
- # For debugging only:
- #
- # try:
- # self._validate_pending_children()
- # except:
- # self.ready_exc = sys.exc_info()
- # return node
-
- if CollectStats:
- if not hasattr(node, 'stats'):
- node.stats = Stats()
- StatsNodes.append(node)
- S = node.stats
- S.considered = S.considered + 1
- else:
- S = None
-
- if T: T.write(self.trace_message(u' Considering node %s and its children:' % self.trace_node(node)))
-
- if state == NODE_NO_STATE:
- # Mark this node as being on the execution stack:
- node.set_state(NODE_PENDING)
- elif state > NODE_PENDING:
- # Skip this node if it has already been evaluated:
- if S: S.already_handled = S.already_handled + 1
- if T: T.write(self.trace_message(u' already handled (executed)'))
- continue
-
- executor = node.get_executor()
-
- try:
- children = executor.get_all_children()
- except SystemExit:
- exc_value = sys.exc_info()[1]
- e = SCons.Errors.ExplicitExit(node, exc_value.code)
- self.ready_exc = (SCons.Errors.ExplicitExit, e)
- if T: T.write(self.trace_message(' SystemExit'))
- return node
- except Exception, e:
- # We had a problem just trying to figure out the
- # children (like a child couldn't be linked in to a
- # VariantDir, or a Scanner threw something). Arrange to
- # raise the exception when the Task is "executed."
- self.ready_exc = sys.exc_info()
- if S: S.problem = S.problem + 1
- if T: T.write(self.trace_message(' exception %s while scanning children.\n' % e))
- return node
-
- children_not_visited = []
- children_pending = set()
- children_not_ready = []
- children_failed = False
-
- for child in chain(executor.get_all_prerequisites(), children):
- childstate = child.get_state()
-
- if T: T.write(self.trace_message(u' ' + self.trace_node(child)))
-
- if childstate == NODE_NO_STATE:
- children_not_visited.append(child)
- elif childstate == NODE_PENDING:
- children_pending.add(child)
- elif childstate == NODE_FAILED:
- children_failed = True
-
- if childstate <= NODE_EXECUTING:
- children_not_ready.append(child)
-
-
- # These nodes have not even been visited yet. Add
- # them to the list so that on some next pass we can
- # take a stab at evaluating them (or their children).
- children_not_visited.reverse()
- self.candidates.extend(self.order(children_not_visited))
- #if T and children_not_visited:
- # T.write(self.trace_message(' adding to candidates: %s' % map(str, children_not_visited)))
- # T.write(self.trace_message(' candidates now: %s\n' % map(str, self.candidates)))
-
- # Skip this node if any of its children have failed.
- #
- # This catches the case where we're descending a top-level
- # target and one of our children failed while trying to be
- # built by a *previous* descent of an earlier top-level
- # target.
- #
- # It can also occur if a node is reused in multiple
- # targets. One first descends though the one of the
- # target, the next time occurs through the other target.
- #
- # Note that we can only have failed_children if the
- # --keep-going flag was used, because without it the build
- # will stop before diving in the other branch.
- #
- # Note that even if one of the children fails, we still
- # added the other children to the list of candidate nodes
- # to keep on building (--keep-going).
- if children_failed:
- for n in executor.get_action_targets():
- n.set_state(NODE_FAILED)
-
- if S: S.child_failed = S.child_failed + 1
- if T: T.write(self.trace_message('****** %s\n' % self.trace_node(node)))
- continue
-
- if children_not_ready:
- for child in children_not_ready:
- # We're waiting on one or more derived targets
- # that have not yet finished building.
- if S: S.not_built = S.not_built + 1
-
- # Add this node to the waiting parents lists of
- # anything we're waiting on, with a reference
- # count so we can be put back on the list for
- # re-evaluation when they've all finished.
- node.ref_count = node.ref_count + child.add_to_waiting_parents(node)
- if T: T.write(self.trace_message(u' adjusted ref count: %s, child %s' %
- (self.trace_node(node), repr(str(child)))))
-
- if T:
- for pc in children_pending:
- T.write(self.trace_message(' adding %s to the pending children set\n' %
- self.trace_node(pc)))
- self.pending_children = self.pending_children | children_pending
-
- continue
-
- # Skip this node if it has side-effects that are
- # currently being built:
- wait_side_effects = False
- for se in executor.get_action_side_effects():
- if se.get_state() == NODE_EXECUTING:
- se.add_to_waiting_s_e(node)
- wait_side_effects = True
-
- if wait_side_effects:
- if S: S.side_effects = S.side_effects + 1
- continue
-
- # The default when we've gotten through all of the checks above:
- # this node is ready to be built.
- if S: S.build = S.build + 1
- if T: T.write(self.trace_message(u'Evaluating %s\n' %
- self.trace_node(node)))
-
- # For debugging only:
- #
- # try:
- # self._validate_pending_children()
- # except:
- # self.ready_exc = sys.exc_info()
- # return node
-
- return node
-
- return None
-
- def next_task(self):
- """
- Returns the next task to be executed.
-
- This simply asks for the next Node to be evaluated, and then wraps
- it in the specific Task subclass with which we were initialized.
- """
- node = self._find_next_ready_node()
-
- if node is None:
- return None
-
- executor = node.get_executor()
- if executor is None:
- return None
-
- tlist = executor.get_all_targets()
-
- task = self.tasker(self, tlist, node in self.original_top, node)
- try:
- task.make_ready()
- except:
- # We had a problem just trying to get this task ready (like
- # a child couldn't be linked in to a VariantDir when deciding
- # whether this node is current). Arrange to raise the
- # exception when the Task is "executed."
- self.ready_exc = sys.exc_info()
-
- if self.ready_exc:
- task.exception_set(self.ready_exc)
-
- self.ready_exc = None
-
- return task
-
- def will_not_build(self, nodes, node_func=lambda n: None):
- """
- Perform clean-up about nodes that will never be built. Invokes
- a user defined function on all of these nodes (including all
- of their parents).
- """
-
- T = self.trace
-
- pending_children = self.pending_children
-
- to_visit = set(nodes)
- pending_children = pending_children - to_visit
-
- if T:
- for n in nodes:
- T.write(self.trace_message(' removing node %s from the pending children set\n' %
- self.trace_node(n)))
- try:
- while len(to_visit):
- node = to_visit.pop()
- node_func(node)
-
- # Prune recursion by flushing the waiting children
- # list immediately.
- parents = node.waiting_parents
- node.waiting_parents = set()
-
- to_visit = to_visit | parents
- pending_children = pending_children - parents
-
- for p in parents:
- p.ref_count = p.ref_count - 1
- if T: T.write(self.trace_message(' removing parent %s from the pending children set\n' %
- self.trace_node(p)))
- except KeyError:
- # The container to_visit has been emptied.
- pass
-
- # We have the stick back the pending_children list into the
- # taskmaster because the python 1.5.2 compatibility does not
- # allow us to use in-place updates
- self.pending_children = pending_children
-
- def stop(self):
- """
- Stops the current build completely.
- """
- self.next_candidate = self.no_next_candidate
-
- def cleanup(self):
- """
- Check for dependency cycles.
- """
- if not self.pending_children:
- return
-
- nclist = [(n, find_cycle([n], set())) for n in self.pending_children]
-
- genuine_cycles = [
- node for node,cycle in nclist
- if cycle or node.get_state() != NODE_EXECUTED
- ]
- if not genuine_cycles:
- # All of the "cycles" found were single nodes in EXECUTED state,
- # which is to say, they really weren't cycles. Just return.
- return
-
- desc = 'Found dependency cycle(s):\n'
- for node, cycle in nclist:
- if cycle:
- desc = desc + " " + " -> ".join(map(str, cycle)) + "\n"
- else:
- desc = desc + \
- " Internal Error: no cycle found for node %s (%s) in state %s\n" % \
- (node, repr(node), StateString[node.get_state()])
-
- raise SCons.Errors.UserError(desc)
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/386asm.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/386asm.py
deleted file mode 100644
index 06d271e..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/386asm.py
+++ /dev/null
@@ -1,61 +0,0 @@
-"""SCons.Tool.386asm
-
-Tool specification for the 386ASM assembler for the Phar Lap ETS embedded
-operating system.
-
-There normally shouldn't be any need to import this module directly.
-It will usually be imported through the generic SCons.Tool.Tool()
-selection method.
-
-"""
-
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-
-__revision__ = "src/engine/SCons/Tool/386asm.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-from SCons.Tool.PharLapCommon import addPharLapPaths
-import SCons.Util
-
-as_module = __import__('as', globals(), locals(), [])
-
-def generate(env):
- """Add Builders and construction variables for ar to an Environment."""
- as_module.generate(env)
-
- env['AS'] = '386asm'
- env['ASFLAGS'] = SCons.Util.CLVar('')
- env['ASPPFLAGS'] = '$ASFLAGS'
- env['ASCOM'] = '$AS $ASFLAGS $SOURCES -o $TARGET'
- env['ASPPCOM'] = '$CC $ASPPFLAGS $CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS $SOURCES -o $TARGET'
-
- addPharLapPaths(env)
-
-def exists(env):
- return env.Detect('386asm')
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/BitKeeper.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/BitKeeper.py
deleted file mode 100644
index 9df9f59..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/BitKeeper.py
+++ /dev/null
@@ -1,67 +0,0 @@
-"""SCons.Tool.BitKeeper.py
-
-Tool-specific initialization for the BitKeeper source code control
-system.
-
-There normally shouldn't be any need to import this module directly.
-It will usually be imported through the generic SCons.Tool.Tool()
-selection method.
-
-"""
-
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-
-__revision__ = "src/engine/SCons/Tool/BitKeeper.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-import SCons.Action
-import SCons.Builder
-import SCons.Util
-
-def generate(env):
- """Add a Builder factory function and construction variables for
- BitKeeper to an Environment."""
-
- def BitKeeperFactory(env=env):
- """ """
- import SCons.Warnings as W
- W.warn(W.DeprecatedSourceCodeWarning, """The BitKeeper() factory is deprecated and there is no replacement.""")
- act = SCons.Action.Action("$BITKEEPERCOM", "$BITKEEPERCOMSTR")
- return SCons.Builder.Builder(action = act, env = env)
-
- #setattr(env, 'BitKeeper', BitKeeperFactory)
- env.BitKeeper = BitKeeperFactory
-
- env['BITKEEPER'] = 'bk'
- env['BITKEEPERGET'] = '$BITKEEPER get'
- env['BITKEEPERGETFLAGS'] = SCons.Util.CLVar('')
- env['BITKEEPERCOM'] = '$BITKEEPERGET $BITKEEPERGETFLAGS $TARGET'
-
-def exists(env):
- return env.Detect('bk')
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/CVS.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/CVS.py
deleted file mode 100644
index 14bc18e..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/CVS.py
+++ /dev/null
@@ -1,73 +0,0 @@
-"""SCons.Tool.CVS.py
-
-Tool-specific initialization for CVS.
-
-There normally shouldn't be any need to import this module directly.
-It will usually be imported through the generic SCons.Tool.Tool()
-selection method.
-
-"""
-
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-__revision__ = "src/engine/SCons/Tool/CVS.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-import SCons.Action
-import SCons.Builder
-import SCons.Util
-
-def generate(env):
- """Add a Builder factory function and construction variables for
- CVS to an Environment."""
-
- def CVSFactory(repos, module='', env=env):
- """ """
- import SCons.Warnings as W
- W.warn(W.DeprecatedSourceCodeWarning, """The CVS() factory is deprecated and there is no replacement.""")
- # fail if repos is not an absolute path name?
- if module != '':
- # Don't use os.path.join() because the name we fetch might
- # be across a network and must use POSIX slashes as separators.
- module = module + '/'
- env['CVSCOM'] = '$CVS $CVSFLAGS co $CVSCOFLAGS -d ${TARGET.dir} $CVSMODULE${TARGET.posix}'
- act = SCons.Action.Action('$CVSCOM', '$CVSCOMSTR')
- return SCons.Builder.Builder(action = act,
- env = env,
- CVSREPOSITORY = repos,
- CVSMODULE = module)
-
- #setattr(env, 'CVS', CVSFactory)
- env.CVS = CVSFactory
-
- env['CVS'] = 'cvs'
- env['CVSFLAGS'] = SCons.Util.CLVar('-d $CVSREPOSITORY')
- env['CVSCOFLAGS'] = SCons.Util.CLVar('')
- env['CVSCOM'] = '$CVS $CVSFLAGS co $CVSCOFLAGS ${TARGET.posix}'
-
-def exists(env):
- return env.Detect('cvs')
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/DCommon.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/DCommon.py
deleted file mode 100644
index db03660..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/DCommon.py
+++ /dev/null
@@ -1,56 +0,0 @@
-"""SCons.Tool.DCommon
-
-Common code for the various D tools.
-
-Coded by Russel Winder (russel@winder.org.uk)
-2012-09-06
-"""
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-
-__revision__ = "src/engine/SCons/Tool/DCommon.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-import os.path
-
-def isD(env, source):
- if not source:
- return 0
- for s in source:
- if s.sources:
- ext = os.path.splitext(str(s.sources[0]))[1]
- if ext == '.d':
- return 1
- return 0
-
-def addDPATHToEnv(env, executable):
- dPath = env.WhereIs(executable)
- if dPath:
- phobosDir = dPath[:dPath.rindex(executable)] + '/../src/phobos'
- if os.path.isdir(phobosDir):
- env.Append(DPATH=[phobosDir])
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/FortranCommon.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/FortranCommon.py
deleted file mode 100644
index b8ff7d9..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/FortranCommon.py
+++ /dev/null
@@ -1,279 +0,0 @@
-"""SCons.Tool.FortranCommon
-
-Stuff for processing Fortran, common to all fortran dialects.
-
-"""
-
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-
-__revision__ = "src/engine/SCons/Tool/FortranCommon.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-import re
-import os.path
-
-import SCons.Action
-import SCons.Defaults
-import SCons.Scanner.Fortran
-import SCons.Tool
-import SCons.Util
-
-def isfortran(env, source):
- """Return 1 if any of code in source has fortran files in it, 0
- otherwise."""
- try:
- fsuffixes = env['FORTRANSUFFIXES']
- except KeyError:
- # If no FORTRANSUFFIXES, no fortran tool, so there is no need to look
- # for fortran sources.
- return 0
-
- if not source:
- # Source might be None for unusual cases like SConf.
- return 0
- for s in source:
- if s.sources:
- ext = os.path.splitext(str(s.sources[0]))[1]
- if ext in fsuffixes:
- return 1
- return 0
-
-def _fortranEmitter(target, source, env):
- node = source[0].rfile()
- if not node.exists() and not node.is_derived():
- print "Could not locate " + str(node.name)
- return ([], [])
- mod_regex = """(?i)^\s*MODULE\s+(?!PROCEDURE)(\w+)"""
- cre = re.compile(mod_regex,re.M)
- # Retrieve all USE'd module names
- modules = cre.findall(node.get_text_contents())
- # Remove unique items from the list
- modules = SCons.Util.unique(modules)
- # Convert module name to a .mod filename
- suffix = env.subst('$FORTRANMODSUFFIX', target=target, source=source)
- moddir = env.subst('$FORTRANMODDIR', target=target, source=source)
- modules = [x.lower() + suffix for x in modules]
- for m in modules:
- target.append(env.fs.File(m, moddir))
- return (target, source)
-
-def FortranEmitter(target, source, env):
- target, source = _fortranEmitter(target, source, env)
- return SCons.Defaults.StaticObjectEmitter(target, source, env)
-
-def ShFortranEmitter(target, source, env):
- target, source = _fortranEmitter(target, source, env)
- return SCons.Defaults.SharedObjectEmitter(target, source, env)
-
-def ComputeFortranSuffixes(suffixes, ppsuffixes):
- """suffixes are fortran source files, and ppsuffixes the ones to be
- pre-processed. Both should be sequences, not strings."""
- assert len(suffixes) > 0
- s = suffixes[0]
- sup = s.upper()
- upper_suffixes = [_.upper() for _ in suffixes]
- if SCons.Util.case_sensitive_suffixes(s, sup):
- ppsuffixes.extend(upper_suffixes)
- else:
- suffixes.extend(upper_suffixes)
-
-def CreateDialectActions(dialect):
- """Create dialect specific actions."""
- CompAction = SCons.Action.Action('$%sCOM ' % dialect, '$%sCOMSTR' % dialect)
- CompPPAction = SCons.Action.Action('$%sPPCOM ' % dialect, '$%sPPCOMSTR' % dialect)
- ShCompAction = SCons.Action.Action('$SH%sCOM ' % dialect, '$SH%sCOMSTR' % dialect)
- ShCompPPAction = SCons.Action.Action('$SH%sPPCOM ' % dialect, '$SH%sPPCOMSTR' % dialect)
-
- return CompAction, CompPPAction, ShCompAction, ShCompPPAction
-
-def DialectAddToEnv(env, dialect, suffixes, ppsuffixes, support_module = 0):
- """Add dialect specific construction variables."""
- ComputeFortranSuffixes(suffixes, ppsuffixes)
-
- fscan = SCons.Scanner.Fortran.FortranScan("%sPATH" % dialect)
-
- for suffix in suffixes + ppsuffixes:
- SCons.Tool.SourceFileScanner.add_scanner(suffix, fscan)
-
- env.AppendUnique(FORTRANSUFFIXES = suffixes + ppsuffixes)
-
- compaction, compppaction, shcompaction, shcompppaction = \
- CreateDialectActions(dialect)
-
- static_obj, shared_obj = SCons.Tool.createObjBuilders(env)
-
- for suffix in suffixes:
- static_obj.add_action(suffix, compaction)
- shared_obj.add_action(suffix, shcompaction)
- static_obj.add_emitter(suffix, FortranEmitter)
- shared_obj.add_emitter(suffix, ShFortranEmitter)
-
- for suffix in ppsuffixes:
- static_obj.add_action(suffix, compppaction)
- shared_obj.add_action(suffix, shcompppaction)
- static_obj.add_emitter(suffix, FortranEmitter)
- shared_obj.add_emitter(suffix, ShFortranEmitter)
-
- if '%sFLAGS' % dialect not in env:
- env['%sFLAGS' % dialect] = SCons.Util.CLVar('')
-
- if 'SH%sFLAGS' % dialect not in env:
- env['SH%sFLAGS' % dialect] = SCons.Util.CLVar('$%sFLAGS' % dialect)
-
- # If a tool does not define fortran prefix/suffix for include path, use C ones
- if 'INC%sPREFIX' % dialect not in env:
- env['INC%sPREFIX' % dialect] = '$INCPREFIX'
-
- if 'INC%sSUFFIX' % dialect not in env:
- env['INC%sSUFFIX' % dialect] = '$INCSUFFIX'
-
- env['_%sINCFLAGS' % dialect] = '$( ${_concat(INC%sPREFIX, %sPATH, INC%sSUFFIX, __env__, RDirs, TARGET, SOURCE)} $)' % (dialect, dialect, dialect)
-
- if support_module == 1:
- env['%sCOM' % dialect] = '$%s -o $TARGET -c $%sFLAGS $_%sINCFLAGS $_FORTRANMODFLAG $SOURCES' % (dialect, dialect, dialect)
- env['%sPPCOM' % dialect] = '$%s -o $TARGET -c $%sFLAGS $CPPFLAGS $_CPPDEFFLAGS $_%sINCFLAGS $_FORTRANMODFLAG $SOURCES' % (dialect, dialect, dialect)
- env['SH%sCOM' % dialect] = '$SH%s -o $TARGET -c $SH%sFLAGS $_%sINCFLAGS $_FORTRANMODFLAG $SOURCES' % (dialect, dialect, dialect)
- env['SH%sPPCOM' % dialect] = '$SH%s -o $TARGET -c $SH%sFLAGS $CPPFLAGS $_CPPDEFFLAGS $_%sINCFLAGS $_FORTRANMODFLAG $SOURCES' % (dialect, dialect, dialect)
- else:
- env['%sCOM' % dialect] = '$%s -o $TARGET -c $%sFLAGS $_%sINCFLAGS $SOURCES' % (dialect, dialect, dialect)
- env['%sPPCOM' % dialect] = '$%s -o $TARGET -c $%sFLAGS $CPPFLAGS $_CPPDEFFLAGS $_%sINCFLAGS $SOURCES' % (dialect, dialect, dialect)
- env['SH%sCOM' % dialect] = '$SH%s -o $TARGET -c $SH%sFLAGS $_%sINCFLAGS $SOURCES' % (dialect, dialect, dialect)
- env['SH%sPPCOM' % dialect] = '$SH%s -o $TARGET -c $SH%sFLAGS $CPPFLAGS $_CPPDEFFLAGS $_%sINCFLAGS $SOURCES' % (dialect, dialect, dialect)
-
-def add_fortran_to_env(env):
- """Add Builders and construction variables for Fortran to an Environment."""
- try:
- FortranSuffixes = env['FORTRANFILESUFFIXES']
- except KeyError:
- FortranSuffixes = ['.f', '.for', '.ftn']
-
- #print "Adding %s to fortran suffixes" % FortranSuffixes
- try:
- FortranPPSuffixes = env['FORTRANPPFILESUFFIXES']
- except KeyError:
- FortranPPSuffixes = ['.fpp', '.FPP']
-
- DialectAddToEnv(env, "FORTRAN", FortranSuffixes,
- FortranPPSuffixes, support_module = 1)
-
- env['FORTRANMODPREFIX'] = '' # like $LIBPREFIX
- env['FORTRANMODSUFFIX'] = '.mod' # like $LIBSUFFIX
-
- env['FORTRANMODDIR'] = '' # where the compiler should place .mod files
- env['FORTRANMODDIRPREFIX'] = '' # some prefix to $FORTRANMODDIR - similar to $INCPREFIX
- env['FORTRANMODDIRSUFFIX'] = '' # some suffix to $FORTRANMODDIR - similar to $INCSUFFIX
- env['_FORTRANMODFLAG'] = '$( ${_concat(FORTRANMODDIRPREFIX, FORTRANMODDIR, FORTRANMODDIRSUFFIX, __env__, RDirs, TARGET, SOURCE)} $)'
-
-def add_f77_to_env(env):
- """Add Builders and construction variables for f77 to an Environment."""
- try:
- F77Suffixes = env['F77FILESUFFIXES']
- except KeyError:
- F77Suffixes = ['.f77']
-
- #print "Adding %s to f77 suffixes" % F77Suffixes
- try:
- F77PPSuffixes = env['F77PPFILESUFFIXES']
- except KeyError:
- F77PPSuffixes = []
-
- DialectAddToEnv(env, "F77", F77Suffixes, F77PPSuffixes)
-
-def add_f90_to_env(env):
- """Add Builders and construction variables for f90 to an Environment."""
- try:
- F90Suffixes = env['F90FILESUFFIXES']
- except KeyError:
- F90Suffixes = ['.f90']
-
- #print "Adding %s to f90 suffixes" % F90Suffixes
- try:
- F90PPSuffixes = env['F90PPFILESUFFIXES']
- except KeyError:
- F90PPSuffixes = []
-
- DialectAddToEnv(env, "F90", F90Suffixes, F90PPSuffixes,
- support_module = 1)
-
-def add_f95_to_env(env):
- """Add Builders and construction variables for f95 to an Environment."""
- try:
- F95Suffixes = env['F95FILESUFFIXES']
- except KeyError:
- F95Suffixes = ['.f95']
-
- #print "Adding %s to f95 suffixes" % F95Suffixes
- try:
- F95PPSuffixes = env['F95PPFILESUFFIXES']
- except KeyError:
- F95PPSuffixes = []
-
- DialectAddToEnv(env, "F95", F95Suffixes, F95PPSuffixes,
- support_module = 1)
-
-def add_f03_to_env(env):
- """Add Builders and construction variables for f03 to an Environment."""
- try:
- F03Suffixes = env['F03FILESUFFIXES']
- except KeyError:
- F03Suffixes = ['.f03']
-
- #print "Adding %s to f95 suffixes" % F95Suffixes
- try:
- F03PPSuffixes = env['F03PPFILESUFFIXES']
- except KeyError:
- F03PPSuffixes = []
-
- DialectAddToEnv(env, "F03", F03Suffixes, F03PPSuffixes,
- support_module = 1)
-
-def add_f08_to_env(env):
- """Add Builders and construction variables for f08 to an Environment."""
- try:
- F08Suffixes = env['F08FILESUFFIXES']
- except KeyError:
- F08Suffixes = ['.f08']
-
- try:
- F08PPSuffixes = env['F08PPFILESUFFIXES']
- except KeyError:
- F08PPSuffixes = []
-
- DialectAddToEnv(env, "F08", F08Suffixes, F08PPSuffixes,
- support_module = 1)
-
-def add_all_to_env(env):
- """Add builders and construction variables for all supported fortran
- dialects."""
- add_fortran_to_env(env)
- add_f77_to_env(env)
- add_f90_to_env(env)
- add_f95_to_env(env)
- add_f03_to_env(env)
- add_f08_to_env(env)
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/GettextCommon.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/GettextCommon.py
deleted file mode 100644
index af9b074..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/GettextCommon.py
+++ /dev/null
@@ -1,430 +0,0 @@
-"""SCons.Tool.GettextCommon module
-
-Used by several tools of `gettext` toolset.
-"""
-
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-__revision__ = "src/engine/SCons/Tool/GettextCommon.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-import SCons.Warnings
-import re
-
-#############################################################################
-class XgettextToolWarning(SCons.Warnings.Warning): pass
-class XgettextNotFound(XgettextToolWarning): pass
-class MsginitToolWarning(SCons.Warnings.Warning): pass
-class MsginitNotFound(MsginitToolWarning): pass
-class MsgmergeToolWarning(SCons.Warnings.Warning): pass
-class MsgmergeNotFound(MsgmergeToolWarning): pass
-class MsgfmtToolWarning(SCons.Warnings.Warning): pass
-class MsgfmtNotFound(MsgfmtToolWarning): pass
-#############################################################################
-SCons.Warnings.enableWarningClass(XgettextToolWarning)
-SCons.Warnings.enableWarningClass(XgettextNotFound)
-SCons.Warnings.enableWarningClass(MsginitToolWarning)
-SCons.Warnings.enableWarningClass(MsginitNotFound)
-SCons.Warnings.enableWarningClass(MsgmergeToolWarning)
-SCons.Warnings.enableWarningClass(MsgmergeNotFound)
-SCons.Warnings.enableWarningClass(MsgfmtToolWarning)
-SCons.Warnings.enableWarningClass(MsgfmtNotFound)
-#############################################################################
-
-#############################################################################
-class _POTargetFactory(object):
- """ A factory of `PO` target files.
-
- Factory defaults differ from these of `SCons.Node.FS.FS`. We set `precious`
- (this is required by builders and actions gettext) and `noclean` flags by
- default for all produced nodes.
- """
- def __init__( self, env, nodefault = True, alias = None, precious = True
- , noclean = True ):
- """ Object constructor.
-
- **Arguments**
-
- - *env* (`SCons.Environment.Environment`)
- - *nodefault* (`boolean`) - if `True`, produced nodes will be ignored
- from default target `'.'`
- - *alias* (`string`) - if provided, produced nodes will be automatically
- added to this alias, and alias will be set as `AlwaysBuild`
- - *precious* (`boolean`) - if `True`, the produced nodes will be set as
- `Precious`.
- - *noclen* (`boolean`) - if `True`, the produced nodes will be excluded
- from `Clean`.
- """
- self.env = env
- self.alias = alias
- self.precious = precious
- self.noclean = noclean
- self.nodefault = nodefault
-
- def _create_node(self, name, factory, directory = None, create = 1):
- """ Create node, and set it up to factory settings. """
- import SCons.Util
- node = factory(name, directory, create)
- node.set_noclean(self.noclean)
- node.set_precious(self.precious)
- if self.nodefault:
- self.env.Ignore('.', node)
- if self.alias:
- self.env.AlwaysBuild(self.env.Alias(self.alias, node))
- return node
-
- def Entry(self, name, directory = None, create = 1):
- """ Create `SCons.Node.FS.Entry` """
- return self._create_node(name, self.env.fs.Entry, directory, create)
-
- def File(self, name, directory = None, create = 1):
- """ Create `SCons.Node.FS.File` """
- return self._create_node(name, self.env.fs.File, directory, create)
-#############################################################################
-
-#############################################################################
-_re_comment = re.compile(r'(#[^\n\r]+)$', re.M)
-_re_lang = re.compile(r'([a-zA-Z0-9_]+)', re.M)
-#############################################################################
-def _read_linguas_from_files(env, linguas_files = None):
- """ Parse `LINGUAS` file and return list of extracted languages """
- import SCons.Util
- import SCons.Environment
- global _re_comment
- global _re_lang
- if not SCons.Util.is_List(linguas_files) \
- and not SCons.Util.is_String(linguas_files) \
- and not isinstance(linguas_files, SCons.Node.FS.Base) \
- and linguas_files:
- # If, linguas_files==True or such, then read 'LINGUAS' file.
- linguas_files = [ 'LINGUAS' ]
- if linguas_files is None:
- return []
- fnodes = env.arg2nodes(linguas_files)
- linguas = []
- for fnode in fnodes:
- contents = _re_comment.sub("", fnode.get_text_contents())
- ls = [ l for l in _re_lang.findall(contents) if l ]
- linguas.extend(ls)
- return linguas
-#############################################################################
-
-#############################################################################
-from SCons.Builder import BuilderBase
-#############################################################################
-class _POFileBuilder(BuilderBase):
- """ `PO` file builder.
-
- This is multi-target single-source builder. In typical situation the source
- is single `POT` file, e.g. `messages.pot`, and there are multiple `PO`
- targets to be updated from this `POT`. We must run
- `SCons.Builder.BuilderBase._execute()` separatelly for each target to track
- dependencies separatelly for each target file.
-
- **NOTE**: if we call `SCons.Builder.BuilderBase._execute(.., target, ...)`
- with target being list of all targets, all targets would be rebuilt each time
- one of the targets from this list is missing. This would happen, for example,
- when new language `ll` enters `LINGUAS_FILE` (at this moment there is no
- `ll.po` file yet). To avoid this, we override
- `SCons.Builder.BuilerBase._execute()` and call it separatelly for each
- target. Here we also append to the target list the languages read from
- `LINGUAS_FILE`.
- """
- #
- #* The argument for overriding _execute(): We must use environment with
- # builder overrides applied (see BuilderBase.__init__(). Here it comes for
- # free.
- #* The argument against using 'emitter': The emitter is called too late
- # by BuilderBase._execute(). If user calls, for example:
- #
- # env.POUpdate(LINGUAS_FILE = 'LINGUAS')
- #
- # the builder throws error, because it is called with target=None,
- # source=None and is trying to "generate" sources or target list first.
- # If user calls
- #
- # env.POUpdate(['foo', 'baz'], LINGUAS_FILE = 'LINGUAS')
- #
- # the env.BuilderWrapper() calls our builder with target=None,
- # source=['foo', 'baz']. The BuilderBase._execute() then splits execution
- # and execute iterativelly (recursion) self._execute(None, source[i]).
- # After that it calls emitter (which is quite too late). The emitter is
- # also called in each iteration, what makes things yet worse.
- def __init__(self, env, **kw):
- if not 'suffix' in kw:
- kw['suffix'] = '$POSUFFIX'
- if not 'src_suffix' in kw:
- kw['src_suffix'] = '$POTSUFFIX'
- if not 'src_builder' in kw:
- kw['src_builder'] = '_POTUpdateBuilder'
- if not 'single_source' in kw:
- kw['single_source'] = True
- alias = None
- if 'target_alias' in kw:
- alias = kw['target_alias']
- del kw['target_alias']
- if not 'target_factory' in kw:
- kw['target_factory'] = _POTargetFactory(env, alias=alias).File
- BuilderBase.__init__(self, **kw)
-
- def _execute(self, env, target, source, *args, **kw):
- """ Execute builder's actions.
-
- Here we append to `target` the languages read from `$LINGUAS_FILE` and
- apply `SCons.Builder.BuilderBase._execute()` separatelly to each target.
- The arguments and return value are same as for
- `SCons.Builder.BuilderBase._execute()`.
- """
- import SCons.Util
- import SCons.Node
- linguas_files = None
- if env.has_key('LINGUAS_FILE') and env['LINGUAS_FILE']:
- linguas_files = env['LINGUAS_FILE']
- # This prevents endless recursion loop (we'll be invoked once for
- # each target appended here, we must not extend the list again).
- env['LINGUAS_FILE'] = None
- linguas = _read_linguas_from_files(env,linguas_files)
- if SCons.Util.is_List(target):
- target.extend(linguas)
- elif target is not None:
- target = [target] + linguas
- else:
- target = linguas
- if not target:
- # Let the SCons.BuilderBase to handle this patologic situation
- return BuilderBase._execute( self, env, target, source, *args, **kw)
- # The rest is ours
- if not SCons.Util.is_List(target):
- target = [ target ]
- result = []
- for tgt in target:
- r = BuilderBase._execute( self, env, [tgt], source, *args, **kw)
- result.extend(r)
- if linguas_files is not None:
- env['LINGUAS_FILE'] = linguas_files
- return SCons.Node.NodeList(result)
-#############################################################################
-
-import SCons.Environment
-#############################################################################
-def _translate(env, target=None, source=SCons.Environment._null, *args, **kw):
- """ Function for `Translate()` pseudo-builder """
- if target is None: target = []
- pot = env.POTUpdate(None, source, *args, **kw)
- po = env.POUpdate(target, pot, *args, **kw)
- return po
-#############################################################################
-
-#############################################################################
-class RPaths(object):
- """ Callable object, which returns pathnames relative to SCons current
- working directory.
-
- It seems like `SCons.Node.FS.Base.get_path()` returns absolute paths
- for nodes that are outside of current working directory (`env.fs.getcwd()`).
- Here, we often have `SConscript`, `POT` and `PO` files within `po/`
- directory and source files (e.g. `*.c`) outside of it. When generating `POT`
- template file, references to source files are written to `POT` template, so
- a translator may later quickly jump to appropriate source file and line from
- its `PO` editor (e.g. `poedit`). Relative paths in `PO` file are usually
- interpreted by `PO` editor as paths relative to the place, where `PO` file
- lives. The absolute paths would make resultant `POT` file nonportable, as
- the references would be correct only on the machine, where `POT` file was
- recently re-created. For such reason, we need a function, which always
- returns relative paths. This is the purpose of `RPaths` callable object.
-
- The `__call__` method returns paths relative to current woking directory, but
- we assume, that *xgettext(1)* is run from the directory, where target file is
- going to be created.
-
- Note, that this may not work for files distributed over several hosts or
- across different drives on windows. We assume here, that single local
- filesystem holds both source files and target `POT` templates.
-
- Intended use of `RPaths` - in `xgettext.py`::
-
- def generate(env):
- from GettextCommon import RPaths
- ...
- sources = '$( ${_concat( "", SOURCES, "", __env__, XgettextRPaths, TARGET, SOURCES)} $)'
- env.Append(
- ...
- XGETTEXTCOM = 'XGETTEXT ... ' + sources,
- ...
- XgettextRPaths = RPaths(env)
- )
- """
- # NOTE: This callable object returns pathnames of dirs/files relative to
- # current working directory. The pathname remains relative also for entries
- # that are outside of current working directory (node, that
- # SCons.Node.FS.File and siblings return absolute path in such case). For
- # simplicity we compute path relative to current working directory, this
- # seems be enough for our purposes (don't need TARGET variable and
- # SCons.Defaults.Variable_Caller stuff).
-
- def __init__(self, env):
- """ Initialize `RPaths` callable object.
-
- **Arguments**:
-
- - *env* - a `SCons.Environment.Environment` object, defines *current
- working dir*.
- """
- self.env = env
-
- # FIXME: I'm not sure, how it should be implemented (what the *args are in
- # general, what is **kw).
- def __call__(self, nodes, *args, **kw):
- """ Return nodes' paths (strings) relative to current working directory.
-
- **Arguments**:
-
- - *nodes* ([`SCons.Node.FS.Base`]) - list of nodes.
- - *args* - currently unused.
- - *kw* - currently unused.
-
- **Returns**:
-
- - Tuple of strings, which represent paths relative to current working
- directory (for given environment).
- """
- # os.path.relpath is available only on python >= 2.6. We use our own
- # implementation. It's taken from BareNecessities package:
- # http://jimmyg.org/work/code/barenecessities/index.html
- from posixpath import curdir
- def relpath(path, start=curdir):
- import posixpath
- """Return a relative version of a path"""
- if not path:
- raise ValueError("no path specified")
- start_list = posixpath.abspath(start).split(posixpath.sep)
- path_list = posixpath.abspath(path).split(posixpath.sep)
- # Work out how much of the filepath is shared by start and path.
- i = len(posixpath.commonprefix([start_list, path_list]))
- rel_list = [posixpath.pardir] * (len(start_list)-i) + path_list[i:]
- if not rel_list:
- return posixpath.curdir
- return posixpath.join(*rel_list)
- import os
- import SCons.Node.FS
- rpaths = ()
- cwd = self.env.fs.getcwd().get_abspath()
- for node in nodes:
- rpath = None
- if isinstance(node, SCons.Node.FS.Base):
- rpath = relpath(node.get_abspath(), cwd)
- # FIXME: Other types possible here?
- if rpath is not None:
- rpaths += (rpath,)
- return rpaths
-#############################################################################
-
-#############################################################################
-def _init_po_files(target, source, env):
- """ Action function for `POInit` builder. """
- nop = lambda target, source, env : 0
- if env.has_key('POAUTOINIT'):
- autoinit = env['POAUTOINIT']
- else:
- autoinit = False
- # Well, if everything outside works well, this loop should do single
- # iteration. Otherwise we are rebuilding all the targets even, if just
- # one has changed (but is this out fault?).
- for tgt in target:
- if not tgt.exists():
- if autoinit:
- action = SCons.Action.Action('$MSGINITCOM', '$MSGINITCOMSTR')
- else:
- msg = 'File ' + repr(str(tgt)) + ' does not exist. ' \
- + 'If you are a translator, you can create it through: \n' \
- + '$MSGINITCOM'
- action = SCons.Action.Action(nop, msg)
- status = action([tgt], source, env)
- if status: return status
- return 0
-#############################################################################
-
-#############################################################################
-def _detect_xgettext(env):
- """ Detects *xgettext(1)* binary """
- if env.has_key('XGETTEXT'):
- return env['XGETTEXT']
- xgettext = env.Detect('xgettext');
- if xgettext:
- return xgettext
- raise SCons.Errors.StopError(XgettextNotFound,"Could not detect xgettext")
- return None
-#############################################################################
-def _xgettext_exists(env):
- return _detect_xgettext(env)
-#############################################################################
-
-#############################################################################
-def _detect_msginit(env):
- """ Detects *msginit(1)* program. """
- if env.has_key('MSGINIT'):
- return env['MSGINIT']
- msginit = env.Detect('msginit');
- if msginit:
- return msginit
- raise SCons.Errors.StopError(MsginitNotFound, "Could not detect msginit")
- return None
-#############################################################################
-def _msginit_exists(env):
- return _detect_msginit(env)
-#############################################################################
-
-#############################################################################
-def _detect_msgmerge(env):
- """ Detects *msgmerge(1)* program. """
- if env.has_key('MSGMERGE'):
- return env['MSGMERGE']
- msgmerge = env.Detect('msgmerge');
- if msgmerge:
- return msgmerge
- raise SCons.Errors.StopError(MsgmergeNotFound, "Could not detect msgmerge")
- return None
-#############################################################################
-def _msgmerge_exists(env):
- return _detect_msgmerge(env)
-#############################################################################
-
-#############################################################################
-def _detect_msgfmt(env):
- """ Detects *msgmfmt(1)* program. """
- if env.has_key('MSGFMT'):
- return env['MSGFMT']
- msgfmt = env.Detect('msgfmt');
- if msgfmt:
- return msgfmt
- raise SCons.Errors.StopError(MsgfmtNotFound, "Could not detect msgfmt")
- return None
-#############################################################################
-def _msgfmt_exists(env):
- return _detect_msgfmt(env)
-#############################################################################
-
-#############################################################################
-def tool_list(platform, env):
- """ List tools that shall be generated by top-level `gettext` tool """
- return [ 'xgettext', 'msginit', 'msgmerge', 'msgfmt' ]
-#############################################################################
-
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/JavaCommon.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/JavaCommon.py
deleted file mode 100644
index 8b1e48e..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/JavaCommon.py
+++ /dev/null
@@ -1,324 +0,0 @@
-"""SCons.Tool.JavaCommon
-
-Stuff for processing Java.
-
-"""
-
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-
-__revision__ = "src/engine/SCons/Tool/JavaCommon.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-import os
-import os.path
-import re
-
-java_parsing = 1
-
-default_java_version = '1.4'
-
-if java_parsing:
- # Parse Java files for class names.
- #
- # This is a really cool parser from Charles Crain
- # that finds appropriate class names in Java source.
-
- # A regular expression that will find, in a java file:
- # newlines;
- # double-backslashes;
- # a single-line comment "//";
- # single or double quotes preceeded by a backslash;
- # single quotes, double quotes, open or close braces, semi-colons,
- # periods, open or close parentheses;
- # floating-point numbers;
- # any alphanumeric token (keyword, class name, specifier);
- # any alphanumeric token surrounded by angle brackets (generics);
- # the multi-line comment begin and end tokens /* and */;
- # array declarations "[]".
- _reToken = re.compile(r'(\n|\\\\|//|\\[\'"]|[\'"\{\}\;\.\(\)]|' +
- r'\d*\.\d*|[A-Za-z_][\w\$\.]*|<[A-Za-z_]\w+>|' +
- r'/\*|\*/|\[\])')
-
- class OuterState(object):
- """The initial state for parsing a Java file for classes,
- interfaces, and anonymous inner classes."""
- def __init__(self, version=default_java_version):
-
- if not version in ('1.1', '1.2', '1.3','1.4', '1.5', '1.6', '1.7',
- '1.8', '5', '6'):
- msg = "Java version %s not supported" % version
- raise NotImplementedError(msg)
-
- self.version = version
- self.listClasses = []
- self.listOutputs = []
- self.stackBrackets = []
- self.brackets = 0
- self.nextAnon = 1
- self.localClasses = []
- self.stackAnonClassBrackets = []
- self.anonStacksStack = [[0]]
- self.package = None
-
- def trace(self):
- pass
-
- def __getClassState(self):
- try:
- return self.classState
- except AttributeError:
- ret = ClassState(self)
- self.classState = ret
- return ret
-
- def __getPackageState(self):
- try:
- return self.packageState
- except AttributeError:
- ret = PackageState(self)
- self.packageState = ret
- return ret
-
- def __getAnonClassState(self):
- try:
- return self.anonState
- except AttributeError:
- self.outer_state = self
- ret = SkipState(1, AnonClassState(self))
- self.anonState = ret
- return ret
-
- def __getSkipState(self):
- try:
- return self.skipState
- except AttributeError:
- ret = SkipState(1, self)
- self.skipState = ret
- return ret
-
- def __getAnonStack(self):
- return self.anonStacksStack[-1]
-
- def openBracket(self):
- self.brackets = self.brackets + 1
-
- def closeBracket(self):
- self.brackets = self.brackets - 1
- if len(self.stackBrackets) and \
- self.brackets == self.stackBrackets[-1]:
- self.listOutputs.append('$'.join(self.listClasses))
- self.localClasses.pop()
- self.listClasses.pop()
- self.anonStacksStack.pop()
- self.stackBrackets.pop()
- if len(self.stackAnonClassBrackets) and \
- self.brackets == self.stackAnonClassBrackets[-1]:
- self.__getAnonStack().pop()
- self.stackAnonClassBrackets.pop()
-
- def parseToken(self, token):
- if token[:2] == '//':
- return IgnoreState('\n', self)
- elif token == '/*':
- return IgnoreState('*/', self)
- elif token == '{':
- self.openBracket()
- elif token == '}':
- self.closeBracket()
- elif token in [ '"', "'" ]:
- return IgnoreState(token, self)
- elif token == "new":
- # anonymous inner class
- if len(self.listClasses) > 0:
- return self.__getAnonClassState()
- return self.__getSkipState() # Skip the class name
- elif token in ['class', 'interface', 'enum']:
- if len(self.listClasses) == 0:
- self.nextAnon = 1
- self.stackBrackets.append(self.brackets)
- return self.__getClassState()
- elif token == 'package':
- return self.__getPackageState()
- elif token == '.':
- # Skip the attribute, it might be named "class", in which
- # case we don't want to treat the following token as
- # an inner class name...
- return self.__getSkipState()
- return self
-
- def addAnonClass(self):
- """Add an anonymous inner class"""
- if self.version in ('1.1', '1.2', '1.3', '1.4'):
- clazz = self.listClasses[0]
- self.listOutputs.append('%s$%d' % (clazz, self.nextAnon))
- elif self.version in ('1.5', '1.6', '1.7', '1.8', '5', '6'):
- self.stackAnonClassBrackets.append(self.brackets)
- className = []
- className.extend(self.listClasses)
- self.__getAnonStack()[-1] = self.__getAnonStack()[-1] + 1
- for anon in self.__getAnonStack():
- className.append(str(anon))
- self.listOutputs.append('$'.join(className))
-
- self.nextAnon = self.nextAnon + 1
- self.__getAnonStack().append(0)
-
- def setPackage(self, package):
- self.package = package
-
- class AnonClassState(object):
- """A state that looks for anonymous inner classes."""
- def __init__(self, old_state):
- # outer_state is always an instance of OuterState
- self.outer_state = old_state.outer_state
- self.old_state = old_state
- self.brace_level = 0
- def parseToken(self, token):
- # This is an anonymous class if and only if the next
- # non-whitespace token is a bracket. Everything between
- # braces should be parsed as normal java code.
- if token[:2] == '//':
- return IgnoreState('\n', self)
- elif token == '/*':
- return IgnoreState('*/', self)
- elif token == '\n':
- return self
- elif token[0] == '<' and token[-1] == '>':
- return self
- elif token == '(':
- self.brace_level = self.brace_level + 1
- return self
- if self.brace_level > 0:
- if token == 'new':
- # look further for anonymous inner class
- return SkipState(1, AnonClassState(self))
- elif token in [ '"', "'" ]:
- return IgnoreState(token, self)
- elif token == ')':
- self.brace_level = self.brace_level - 1
- return self
- if token == '{':
- self.outer_state.addAnonClass()
- return self.old_state.parseToken(token)
-
- class SkipState(object):
- """A state that will skip a specified number of tokens before
- reverting to the previous state."""
- def __init__(self, tokens_to_skip, old_state):
- self.tokens_to_skip = tokens_to_skip
- self.old_state = old_state
- def parseToken(self, token):
- self.tokens_to_skip = self.tokens_to_skip - 1
- if self.tokens_to_skip < 1:
- return self.old_state
- return self
-
- class ClassState(object):
- """A state we go into when we hit a class or interface keyword."""
- def __init__(self, outer_state):
- # outer_state is always an instance of OuterState
- self.outer_state = outer_state
- def parseToken(self, token):
- # the next non-whitespace token should be the name of the class
- if token == '\n':
- return self
- # If that's an inner class which is declared in a method, it
- # requires an index prepended to the class-name, e.g.
- # 'Foo$1Inner'
- # http://scons.tigris.org/issues/show_bug.cgi?id=2087
- if self.outer_state.localClasses and \
- self.outer_state.stackBrackets[-1] > \
- self.outer_state.stackBrackets[-2]+1:
- locals = self.outer_state.localClasses[-1]
- try:
- idx = locals[token]
- locals[token] = locals[token]+1
- except KeyError:
- locals[token] = 1
- token = str(locals[token]) + token
- self.outer_state.localClasses.append({})
- self.outer_state.listClasses.append(token)
- self.outer_state.anonStacksStack.append([0])
- return self.outer_state
-
- class IgnoreState(object):
- """A state that will ignore all tokens until it gets to a
- specified token."""
- def __init__(self, ignore_until, old_state):
- self.ignore_until = ignore_until
- self.old_state = old_state
- def parseToken(self, token):
- if self.ignore_until == token:
- return self.old_state
- return self
-
- class PackageState(object):
- """The state we enter when we encounter the package keyword.
- We assume the next token will be the package name."""
- def __init__(self, outer_state):
- # outer_state is always an instance of OuterState
- self.outer_state = outer_state
- def parseToken(self, token):
- self.outer_state.setPackage(token)
- return self.outer_state
-
- def parse_java_file(fn, version=default_java_version):
- return parse_java(open(fn, 'r').read(), version)
-
- def parse_java(contents, version=default_java_version, trace=None):
- """Parse a .java file and return a double of package directory,
- plus a list of .class files that compiling that .java file will
- produce"""
- package = None
- initial = OuterState(version)
- currstate = initial
- for token in _reToken.findall(contents):
- # The regex produces a bunch of groups, but only one will
- # have anything in it.
- currstate = currstate.parseToken(token)
- if trace: trace(token, currstate)
- if initial.package:
- package = initial.package.replace('.', os.sep)
- return (package, initial.listOutputs)
-
-else:
- # Don't actually parse Java files for class names.
- #
- # We might make this a configurable option in the future if
- # Java-file parsing takes too long (although it shouldn't relative
- # to how long the Java compiler itself seems to take...).
-
- def parse_java_file(fn):
- """ "Parse" a .java file.
-
- This actually just splits the file name, so the assumption here
- is that the file name matches the public class name, and that
- the path to the file is the same as the package name.
- """
- return os.path.split(file)
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/MSCommon/__init__.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/MSCommon/__init__.py
deleted file mode 100644
index 90cb0bc..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/MSCommon/__init__.py
+++ /dev/null
@@ -1,56 +0,0 @@
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-
-__revision__ = "src/engine/SCons/Tool/MSCommon/__init__.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-__doc__ = """
-Common functions for Microsoft Visual Studio and Visual C/C++.
-"""
-
-import copy
-import os
-import re
-import subprocess
-
-import SCons.Errors
-import SCons.Platform.win32
-import SCons.Util
-
-from SCons.Tool.MSCommon.sdk import mssdk_exists, \
- mssdk_setup_env
-
-from SCons.Tool.MSCommon.vc import msvc_exists, \
- msvc_setup_env, \
- msvc_setup_env_once
-
-from SCons.Tool.MSCommon.vs import get_default_version, \
- get_vs_by_version, \
- merge_default_version, \
- msvs_exists, \
- query_versions
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/MSCommon/arch.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/MSCommon/arch.py
deleted file mode 100644
index 5bc7ea5..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/MSCommon/arch.py
+++ /dev/null
@@ -1,67 +0,0 @@
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-
-__revision__ = "src/engine/SCons/Tool/MSCommon/arch.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-__doc__ = """Module to define supported Windows chip architectures.
-"""
-
-import os
-
-class ArchDefinition(object):
- """
- A class for defining architecture-specific settings and logic.
- """
- def __init__(self, arch, synonyms=[]):
- self.arch = arch
- self.synonyms = synonyms
-
-SupportedArchitectureList = [
- ArchitectureDefinition(
- 'x86',
- ['i386', 'i486', 'i586', 'i686'],
- ),
-
- ArchitectureDefinition(
- 'x86_64',
- ['AMD64', 'amd64', 'em64t', 'EM64T', 'x86_64'],
- ),
-
- ArchitectureDefinition(
- 'ia64',
- ['IA64'],
- ),
-
- ArchitectureDefinition(
- 'arm',
- ['ARM'],
- ),
-
-]
-
-SupportedArchitectureMap = {}
-for a in SupportedArchitectureList:
- SupportedArchitectureMap[a.arch] = a
- for s in a.synonyms:
- SupportedArchitectureMap[s] = a
-
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/MSCommon/common.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/MSCommon/common.py
deleted file mode 100644
index 60d7d40..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/MSCommon/common.py
+++ /dev/null
@@ -1,260 +0,0 @@
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-
-__revision__ = "src/engine/SCons/Tool/MSCommon/common.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-__doc__ = """
-Common helper functions for working with the Microsoft tool chain.
-"""
-
-import copy
-import os
-import subprocess
-import re
-
-import SCons.Util
-
-
-logfile = os.environ.get('SCONS_MSCOMMON_DEBUG')
-if logfile == '-':
- def debug(x):
- print x
-elif logfile:
- try:
- import logging
- except ImportError:
- debug = lambda x: open(logfile, 'a').write(x + '\n')
- else:
- logging.basicConfig(filename=logfile, level=logging.DEBUG)
- debug = logging.debug
-else:
- debug = lambda x: None
-
-
-_is_win64 = None
-
-def is_win64():
- """Return true if running on windows 64 bits.
-
- Works whether python itself runs in 64 bits or 32 bits."""
- # Unfortunately, python does not provide a useful way to determine
- # if the underlying Windows OS is 32-bit or 64-bit. Worse, whether
- # the Python itself is 32-bit or 64-bit affects what it returns,
- # so nothing in sys.* or os.* help.
-
- # Apparently the best solution is to use env vars that Windows
- # sets. If PROCESSOR_ARCHITECTURE is not x86, then the python
- # process is running in 64 bit mode (on a 64-bit OS, 64-bit
- # hardware, obviously).
- # If this python is 32-bit but the OS is 64, Windows will set
- # ProgramW6432 and PROCESSOR_ARCHITEW6432 to non-null.
- # (Checking for HKLM\Software\Wow6432Node in the registry doesn't
- # work, because some 32-bit installers create it.)
- global _is_win64
- if _is_win64 is None:
- # I structured these tests to make it easy to add new ones or
- # add exceptions in the future, because this is a bit fragile.
- _is_win64 = False
- if os.environ.get('PROCESSOR_ARCHITECTURE','x86') != 'x86':
- _is_win64 = True
- if os.environ.get('PROCESSOR_ARCHITEW6432'):
- _is_win64 = True
- if os.environ.get('ProgramW6432'):
- _is_win64 = True
- return _is_win64
-
-
-def read_reg(value):
- return SCons.Util.RegGetValue(SCons.Util.HKEY_LOCAL_MACHINE, value)[0]
-
-def has_reg(value):
- """Return True if the given key exists in HKEY_LOCAL_MACHINE, False
- otherwise."""
- try:
- SCons.Util.RegOpenKeyEx(SCons.Util.HKEY_LOCAL_MACHINE, value)
- ret = True
- except WindowsError:
- ret = False
- return ret
-
-# Functions for fetching environment variable settings from batch files.
-
-def normalize_env(env, keys, force=False):
- """Given a dictionary representing a shell environment, add the variables
- from os.environ needed for the processing of .bat files; the keys are
- controlled by the keys argument.
-
- It also makes sure the environment values are correctly encoded.
-
- If force=True, then all of the key values that exist are copied
- into the returned dictionary. If force=false, values are only
- copied if the key does not already exist in the copied dictionary.
-
- Note: the environment is copied."""
- normenv = {}
- if env:
- for k in env.keys():
- normenv[k] = copy.deepcopy(env[k]).encode('mbcs')
-
- for k in keys:
- if k in os.environ and (force or not k in normenv):
- normenv[k] = os.environ[k].encode('mbcs')
-
- # This shouldn't be necessary, since the default environment should include system32,
- # but keep this here to be safe, since it's needed to find reg.exe which the MSVC
- # bat scripts use.
- sys32_dir = os.path.join(os.environ.get("SystemRoot", os.environ.get("windir",r"C:\Windows\system32")),"System32")
-
- if sys32_dir not in normenv['PATH']:
- normenv['PATH'] = normenv['PATH'] + os.pathsep + sys32_dir
-
- debug("PATH: %s"%normenv['PATH'])
-
- return normenv
-
-def get_output(vcbat, args = None, env = None):
- """Parse the output of given bat file, with given args."""
-
- if env is None:
- # Create a blank environment, for use in launching the tools
- env = SCons.Environment.Environment(tools=[])
-
- # TODO: This is a hard-coded list of the variables that (may) need
- # to be imported from os.environ[] for v[sc]*vars*.bat file
- # execution to work. This list should really be either directly
- # controlled by vc.py, or else derived from the common_tools_var
- # settings in vs.py.
- vars = [
- 'COMSPEC',
-# VS100 and VS110: Still set, but modern MSVC setup scripts will
-# discard these if registry has values. However Intel compiler setup
-# script still requires these as of 2013/2014.
- 'VS110COMNTOOLS',
- 'VS100COMNTOOLS',
- 'VS90COMNTOOLS',
- 'VS80COMNTOOLS',
- 'VS71COMNTOOLS',
- 'VS70COMNTOOLS',
- 'VS60COMNTOOLS',
- ]
- env['ENV'] = normalize_env(env['ENV'], vars, force=False)
-
- if args:
- debug("Calling '%s %s'" % (vcbat, args))
- popen = SCons.Action._subproc(env,
- '"%s" %s & set' % (vcbat, args),
- stdin = 'devnull',
- stdout=subprocess.PIPE,
- stderr=subprocess.PIPE)
- else:
- debug("Calling '%s'" % vcbat)
- popen = SCons.Action._subproc(env,
- '"%s" & set' % vcbat,
- stdin = 'devnull',
- stdout=subprocess.PIPE,
- stderr=subprocess.PIPE)
-
- # Use the .stdout and .stderr attributes directly because the
- # .communicate() method uses the threading module on Windows
- # and won't work under Pythons not built with threading.
- stdout = popen.stdout.read()
- stderr = popen.stderr.read()
-
- # Extra debug logic, uncomment if necessar
-# debug('get_output():stdout:%s'%stdout)
-# debug('get_output():stderr:%s'%stderr)
-
- if stderr:
- # TODO: find something better to do with stderr;
- # this at least prevents errors from getting swallowed.
- import sys
- sys.stderr.write(stderr)
- if popen.wait() != 0:
- raise IOError(stderr.decode("mbcs"))
-
- output = stdout.decode("mbcs")
- return output
-
-def parse_output(output, keep = ("INCLUDE", "LIB", "LIBPATH", "PATH")):
- # dkeep is a dict associating key: path_list, where key is one item from
- # keep, and pat_list the associated list of paths
-
- dkeep = dict([(i, []) for i in keep])
-
- # rdk will keep the regex to match the .bat file output line starts
- rdk = {}
- for i in keep:
- rdk[i] = re.compile('%s=(.*)' % i, re.I)
-
- def add_env(rmatch, key, dkeep=dkeep):
- plist = rmatch.group(1).split(os.pathsep)
- for p in plist:
- # Do not add empty paths (when a var ends with ;)
- if p:
- p = p.encode('mbcs')
- # XXX: For some reason, VC98 .bat file adds "" around the PATH
- # values, and it screws up the environment later, so we strip
- # it.
- p = p.strip('"')
- dkeep[key].append(p)
-
- for line in output.splitlines():
- for k,v in rdk.items():
- m = v.match(line)
- if m:
- add_env(m, k)
-
- return dkeep
-
-# TODO(sgk): unused
-def output_to_dict(output):
- """Given an output string, parse it to find env variables.
-
- Return a dict where keys are variables names, and values their content"""
- envlinem = re.compile(r'^([a-zA-z0-9]+)=([\S\s]*)$')
- parsedenv = {}
- for line in output.splitlines():
- m = envlinem.match(line)
- if m:
- parsedenv[m.group(1)] = m.group(2)
- return parsedenv
-
-# TODO(sgk): unused
-def get_new(l1, l2):
- """Given two list l1 and l2, return the items in l2 which are not in l1.
- Order is maintained."""
-
- # We don't try to be smart: lists are small, and this is not the bottleneck
- # is any case
- new = []
- for i in l2:
- if i not in l1:
- new.append(i)
-
- return new
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/MSCommon/netframework.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/MSCommon/netframework.py
deleted file mode 100644
index 0606e27..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/MSCommon/netframework.py
+++ /dev/null
@@ -1,82 +0,0 @@
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-__revision__ = "src/engine/SCons/Tool/MSCommon/netframework.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-__doc__ = """
-"""
-
-import os
-import re
-
-from common import read_reg, debug
-
-# Original value recorded by dcournapeau
-_FRAMEWORKDIR_HKEY_ROOT = r'Software\Microsoft\.NETFramework\InstallRoot'
-# On SGK's system
-_FRAMEWORKDIR_HKEY_ROOT = r'Software\Microsoft\Microsoft SDKs\.NETFramework\v2.0\InstallationFolder'
-
-def find_framework_root():
- # XXX: find it from environment (FrameworkDir)
- try:
- froot = read_reg(_FRAMEWORKDIR_HKEY_ROOT)
- debug("Found framework install root in registry: %s" % froot)
- except WindowsError, e:
- debug("Could not read reg key %s" % _FRAMEWORKDIR_HKEY_ROOT)
- return None
-
- if not os.path.exists(froot):
- debug("%s not found on fs" % froot)
- return None
-
- return froot
-
-def query_versions():
- froot = find_framework_root()
- if froot:
- contents = os.listdir(froot)
-
- l = re.compile('v[0-9]+.*')
- versions = [e for e in contents if l.match(e)]
-
- def versrt(a,b):
- # since version numbers aren't really floats...
- aa = a[1:]
- bb = b[1:]
- aal = aa.split('.')
- bbl = bb.split('.')
- # sequence comparison in python is lexicographical
- # which is exactly what we want.
- # Note we sort backwards so the highest version is first.
- return cmp(bbl,aal)
-
- versions.sort(versrt)
- else:
- versions = []
-
- return versions
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/MSCommon/sdk.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/MSCommon/sdk.py
deleted file mode 100644
index 537f367..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/MSCommon/sdk.py
+++ /dev/null
@@ -1,414 +0,0 @@
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-
-__revision__ = "src/engine/SCons/Tool/MSCommon/sdk.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-__doc__ = """Module to detect the Platform/Windows SDK
-
-PSDK 2003 R1 is the earliest version detected.
-"""
-
-import os
-
-import SCons.Errors
-import SCons.Util
-
-import common
-
-debug = common.debug
-
-# SDK Checks. This is of course a mess as everything else on MS platforms. Here
-# is what we do to detect the SDK:
-#
-# For Windows SDK >= 6.0: just look into the registry entries:
-# HKLM\Software\Microsoft\Microsoft SDKs\Windows
-# All the keys in there are the available versions.
-#
-# For Platform SDK before 6.0 (2003 server R1 and R2, etc...), there does not
-# seem to be any sane registry key, so the precise location is hardcoded.
-#
-# For versions below 2003R1, it seems the PSDK is included with Visual Studio?
-#
-# Also, per the following:
-# http://benjamin.smedbergs.us/blog/tag/atl/
-# VC++ Professional comes with the SDK, VC++ Express does not.
-
-# Location of the SDK (checked for 6.1 only)
-_CURINSTALLED_SDK_HKEY_ROOT = \
- r"Software\Microsoft\Microsoft SDKs\Windows\CurrentInstallFolder"
-
-
-class SDKDefinition(object):
- """
- An abstract base class for trying to find installed SDK directories.
- """
- def __init__(self, version, **kw):
- self.version = version
- self.__dict__.update(kw)
-
- def find_sdk_dir(self):
- """Try to find the MS SDK from the registry.
-
- Return None if failed or the directory does not exist.
- """
- if not SCons.Util.can_read_reg:
- debug('find_sdk_dir(): can not read registry')
- return None
-
- hkey = self.HKEY_FMT % self.hkey_data
- debug('find_sdk_dir(): checking registry:%s'%hkey)
-
- try:
- sdk_dir = common.read_reg(hkey)
- except WindowsError, e:
- debug('find_sdk_dir(): no SDK registry key %s' % repr(hkey))
- return None
-
- debug('find_sdk_dir(): Trying SDK Dir: %s'%sdk_dir)
-
- if not os.path.exists(sdk_dir):
- debug('find_sdk_dir(): %s not on file system' % sdk_dir)
- return None
-
- ftc = os.path.join(sdk_dir, self.sanity_check_file)
- if not os.path.exists(ftc):
- debug("find_sdk_dir(): sanity check %s not found" % ftc)
- return None
-
- return sdk_dir
-
- def get_sdk_dir(self):
- """Return the MSSSDK given the version string."""
- try:
- return self._sdk_dir
- except AttributeError:
- sdk_dir = self.find_sdk_dir()
- self._sdk_dir = sdk_dir
- return sdk_dir
-
- def get_sdk_vc_script(self,host_arch, target_arch):
- """ Return the script to initialize the VC compiler installed by SDK
- """
-
- if (host_arch == 'amd64' and target_arch == 'x86'):
- # No cross tools needed compiling 32 bits on 64 bit machine
- host_arch=target_arch
-
- arch_string=target_arch
- if (host_arch != target_arch):
- arch_string='%s_%s'%(host_arch,target_arch)
-
- debug("sdk.py: get_sdk_vc_script():arch_string:%s host_arch:%s target_arch:%s"%(arch_string,
- host_arch,
- target_arch))
- file=self.vc_setup_scripts.get(arch_string,None)
- debug("sdk.py: get_sdk_vc_script():file:%s"%file)
- return file
-
-class WindowsSDK(SDKDefinition):
- """
- A subclass for trying to find installed Windows SDK directories.
- """
- HKEY_FMT = r'Software\Microsoft\Microsoft SDKs\Windows\v%s\InstallationFolder'
- def __init__(self, *args, **kw):
- SDKDefinition.__init__(self, *args, **kw)
- self.hkey_data = self.version
-
-class PlatformSDK(SDKDefinition):
- """
- A subclass for trying to find installed Platform SDK directories.
- """
- HKEY_FMT = r'Software\Microsoft\MicrosoftSDK\InstalledSDKS\%s\Install Dir'
- def __init__(self, *args, **kw):
- SDKDefinition.__init__(self, *args, **kw)
- self.hkey_data = self.uuid
-
-#
-# The list of VC initialization scripts installed by the SDK
-# These should be tried if the vcvarsall.bat TARGET_ARCH fails
-preSDK61VCSetupScripts = { 'x86' : r'bin\vcvars32.bat',
- 'amd64' : r'bin\vcvarsamd64.bat',
- 'x86_amd64': r'bin\vcvarsx86_amd64.bat',
- 'x86_ia64' : r'bin\vcvarsx86_ia64.bat',
- 'ia64' : r'bin\vcvarsia64.bat'}
-
-SDK61VCSetupScripts = {'x86' : r'bin\vcvars32.bat',
- 'amd64' : r'bin\amd64\vcvarsamd64.bat',
- 'x86_amd64': r'bin\x86_amd64\vcvarsx86_amd64.bat',
- 'x86_ia64' : r'bin\x86_ia64\vcvarsx86_ia64.bat',
- 'ia64' : r'bin\ia64\vcvarsia64.bat'}
-
-SDK70VCSetupScripts = { 'x86' : r'bin\vcvars32.bat',
- 'amd64' : r'bin\vcvars64.bat',
- 'x86_amd64': r'bin\vcvarsx86_amd64.bat',
- 'x86_ia64' : r'bin\vcvarsx86_ia64.bat',
- 'ia64' : r'bin\vcvarsia64.bat'}
-
-# The list of support SDKs which we know how to detect.
-#
-# The first SDK found in the list is the one used by default if there
-# are multiple SDKs installed. Barring good reasons to the contrary,
-# this means we should list SDKs with from most recent to oldest.
-#
-# If you update this list, update the documentation in Tool/mssdk.xml.
-SupportedSDKList = [
- WindowsSDK('7.1',
- sanity_check_file=r'bin\SetEnv.Cmd',
- include_subdir='include',
- lib_subdir={
- 'x86' : ['lib'],
- 'x86_64' : [r'lib\x64'],
- 'ia64' : [r'lib\ia64'],
- },
- vc_setup_scripts = SDK70VCSetupScripts,
- ),
- WindowsSDK('7.0A',
- sanity_check_file=r'bin\SetEnv.Cmd',
- include_subdir='include',
- lib_subdir={
- 'x86' : ['lib'],
- 'x86_64' : [r'lib\x64'],
- 'ia64' : [r'lib\ia64'],
- },
- vc_setup_scripts = SDK70VCSetupScripts,
- ),
- WindowsSDK('7.0',
- sanity_check_file=r'bin\SetEnv.Cmd',
- include_subdir='include',
- lib_subdir={
- 'x86' : ['lib'],
- 'x86_64' : [r'lib\x64'],
- 'ia64' : [r'lib\ia64'],
- },
- vc_setup_scripts = SDK70VCSetupScripts,
- ),
- WindowsSDK('6.1',
- sanity_check_file=r'bin\SetEnv.Cmd',
- include_subdir='include',
- lib_subdir={
- 'x86' : ['lib'],
- 'x86_64' : [r'lib\x64'],
- 'ia64' : [r'lib\ia64'],
- },
- vc_setup_scripts = SDK61VCSetupScripts,
- ),
-
- WindowsSDK('6.0A',
- sanity_check_file=r'include\windows.h',
- include_subdir='include',
- lib_subdir={
- 'x86' : ['lib'],
- 'x86_64' : [r'lib\x64'],
- 'ia64' : [r'lib\ia64'],
- },
- vc_setup_scripts = preSDK61VCSetupScripts,
- ),
-
- WindowsSDK('6.0',
- sanity_check_file=r'bin\gacutil.exe',
- include_subdir='include',
- lib_subdir='lib',
- vc_setup_scripts = preSDK61VCSetupScripts,
- ),
-
- PlatformSDK('2003R2',
- sanity_check_file=r'SetEnv.Cmd',
- uuid="D2FF9F89-8AA2-4373-8A31-C838BF4DBBE1",
- vc_setup_scripts = preSDK61VCSetupScripts,
- ),
-
- PlatformSDK('2003R1',
- sanity_check_file=r'SetEnv.Cmd',
- uuid="8F9E5EF3-A9A5-491B-A889-C58EFFECE8B3",
- vc_setup_scripts = preSDK61VCSetupScripts,
- ),
-]
-
-SupportedSDKMap = {}
-for sdk in SupportedSDKList:
- SupportedSDKMap[sdk.version] = sdk
-
-
-# Finding installed SDKs isn't cheap, because it goes not only to the
-# registry but also to the disk to sanity-check that there is, in fact,
-# an SDK installed there and that the registry entry isn't just stale.
-# Find this information once, when requested, and cache it.
-
-InstalledSDKList = None
-InstalledSDKMap = None
-
-def get_installed_sdks():
- global InstalledSDKList
- global InstalledSDKMap
- debug('sdk.py:get_installed_sdks()')
- if InstalledSDKList is None:
- InstalledSDKList = []
- InstalledSDKMap = {}
- for sdk in SupportedSDKList:
- debug('MSCommon/sdk.py: trying to find SDK %s' % sdk.version)
- if sdk.get_sdk_dir():
- debug('MSCommon/sdk.py:found SDK %s' % sdk.version)
- InstalledSDKList.append(sdk)
- InstalledSDKMap[sdk.version] = sdk
- return InstalledSDKList
-
-
-# We may be asked to update multiple construction environments with
-# SDK information. When doing this, we check on-disk for whether
-# the SDK has 'mfc' and 'atl' subdirectories. Since going to disk
-# is expensive, cache results by directory.
-
-SDKEnvironmentUpdates = {}
-
-def set_sdk_by_directory(env, sdk_dir):
- global SDKEnvironmentUpdates
- debug('set_sdk_by_directory: Using dir:%s'%sdk_dir)
- try:
- env_tuple_list = SDKEnvironmentUpdates[sdk_dir]
- except KeyError:
- env_tuple_list = []
- SDKEnvironmentUpdates[sdk_dir] = env_tuple_list
-
- include_path = os.path.join(sdk_dir, 'include')
- mfc_path = os.path.join(include_path, 'mfc')
- atl_path = os.path.join(include_path, 'atl')
-
- if os.path.exists(mfc_path):
- env_tuple_list.append(('INCLUDE', mfc_path))
- if os.path.exists(atl_path):
- env_tuple_list.append(('INCLUDE', atl_path))
- env_tuple_list.append(('INCLUDE', include_path))
-
- env_tuple_list.append(('LIB', os.path.join(sdk_dir, 'lib')))
- env_tuple_list.append(('LIBPATH', os.path.join(sdk_dir, 'lib')))
- env_tuple_list.append(('PATH', os.path.join(sdk_dir, 'bin')))
-
- for variable, directory in env_tuple_list:
- env.PrependENVPath(variable, directory)
-
-
-# TODO(sgk): currently unused; remove?
-def get_cur_sdk_dir_from_reg():
- """Try to find the platform sdk directory from the registry.
-
- Return None if failed or the directory does not exist"""
- if not SCons.Util.can_read_reg:
- debug('SCons cannot read registry')
- return None
-
- try:
- val = common.read_reg(_CURINSTALLED_SDK_HKEY_ROOT)
- debug("Found current sdk dir in registry: %s" % val)
- except WindowsError, e:
- debug("Did not find current sdk in registry")
- return None
-
- if not os.path.exists(val):
- debug("Current sdk dir %s not on fs" % val)
- return None
-
- return val
-
-def get_sdk_by_version(mssdk):
- if mssdk not in SupportedSDKMap:
- msg = "SDK version %s is not supported" % repr(mssdk)
- raise SCons.Errors.UserError(msg)
- get_installed_sdks()
- return InstalledSDKMap.get(mssdk)
-
-def get_default_sdk():
- """Set up the default Platform/Windows SDK."""
- get_installed_sdks()
- if not InstalledSDKList:
- return None
- return InstalledSDKList[0]
-
-
-
-
-def mssdk_setup_env(env):
- debug('sdk.py:mssdk_setup_env()')
- if 'MSSDK_DIR' in env:
- sdk_dir = env['MSSDK_DIR']
- if sdk_dir is None:
- return
- sdk_dir = env.subst(sdk_dir)
- debug('sdk.py:mssdk_setup_env: Using MSSDK_DIR:%s'%sdk_dir)
- elif 'MSSDK_VERSION' in env:
- sdk_version = env['MSSDK_VERSION']
- if sdk_version is None:
- msg = "SDK version is specified as None"
- raise SCons.Errors.UserError(msg)
- sdk_version = env.subst(sdk_version)
- mssdk = get_sdk_by_version(sdk_version)
- if mssdk is None:
- msg = "SDK version %s is not installed" % sdk_version
- raise SCons.Errors.UserError(msg)
- sdk_dir = mssdk.get_sdk_dir()
- debug('sdk.py:mssdk_setup_env: Using MSSDK_VERSION:%s'%sdk_dir)
- elif 'MSVS_VERSION' in env:
- msvs_version = env['MSVS_VERSION']
- debug('sdk.py:mssdk_setup_env:Getting MSVS_VERSION from env:%s'%msvs_version)
- if msvs_version is None:
- debug('sdk.py:mssdk_setup_env thinks msvs_version is None')
- return
- msvs_version = env.subst(msvs_version)
- import vs
- msvs = vs.get_vs_by_version(msvs_version)
- debug('sdk.py:mssdk_setup_env:msvs is :%s'%msvs)
- if not msvs:
- debug('sdk.py:mssdk_setup_env: no VS version detected, bailingout:%s'%msvs)
- return
- sdk_version = msvs.sdk_version
- debug('sdk.py:msvs.sdk_version is %s'%sdk_version)
- if not sdk_version:
- return
- mssdk = get_sdk_by_version(sdk_version)
- if not mssdk:
- mssdk = get_default_sdk()
- if not mssdk:
- return
- sdk_dir = mssdk.get_sdk_dir()
- debug('sdk.py:mssdk_setup_env: Using MSVS_VERSION:%s'%sdk_dir)
- else:
- mssdk = get_default_sdk()
- if not mssdk:
- return
- sdk_dir = mssdk.get_sdk_dir()
- debug('sdk.py:mssdk_setup_env: not using any env values. sdk_dir:%s'%sdk_dir)
-
- set_sdk_by_directory(env, sdk_dir)
-
- #print "No MSVS_VERSION: this is likely to be a bug"
-
-def mssdk_exists(version=None):
- sdks = get_installed_sdks()
- if version is None:
- return len(sdks) > 0
- return version in sdks
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/MSCommon/vc.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/MSCommon/vc.py
deleted file mode 100644
index 02a32a0..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/MSCommon/vc.py
+++ /dev/null
@@ -1,505 +0,0 @@
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-
-# TODO:
-# * supported arch for versions: for old versions of batch file without
-# argument, giving bogus argument cannot be detected, so we have to hardcode
-# this here
-# * print warning when msvc version specified but not found
-# * find out why warning do not print
-# * test on 64 bits XP + VS 2005 (and VS 6 if possible)
-# * SDK
-# * Assembly
-__revision__ = "src/engine/SCons/Tool/MSCommon/vc.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-__doc__ = """Module for Visual C/C++ detection and configuration.
-"""
-import SCons.compat
-
-import os
-import platform
-from string import digits as string_digits
-
-import SCons.Warnings
-
-import common
-
-debug = common.debug
-
-import sdk
-
-get_installed_sdks = sdk.get_installed_sdks
-
-
-class VisualCException(Exception):
- pass
-
-class UnsupportedVersion(VisualCException):
- pass
-
-class UnsupportedArch(VisualCException):
- pass
-
-class MissingConfiguration(VisualCException):
- pass
-
-class NoVersionFound(VisualCException):
- pass
-
-class BatchFileExecutionError(VisualCException):
- pass
-
-# Dict to 'canonalize' the arch
-_ARCH_TO_CANONICAL = {
- "amd64" : "amd64",
- "emt64" : "amd64",
- "i386" : "x86",
- "i486" : "x86",
- "i586" : "x86",
- "i686" : "x86",
- "ia64" : "ia64",
- "itanium" : "ia64",
- "x86" : "x86",
- "x86_64" : "amd64",
- "x86_amd64" : "x86_amd64", # Cross compile to 64 bit from 32bits
-}
-
-# Given a (host, target) tuple, return the argument for the bat file. Both host
-# and targets should be canonalized.
-_HOST_TARGET_ARCH_TO_BAT_ARCH = {
- ("x86", "x86"): "x86",
- ("x86", "amd64"): "x86_amd64",
- ("x86", "x86_amd64"): "x86_amd64",
- ("amd64", "x86_amd64"): "x86_amd64", # This is present in (at least) VS2012 express
- ("amd64", "amd64"): "amd64",
- ("amd64", "x86"): "x86",
- ("x86", "ia64"): "x86_ia64"
-}
-
-def get_host_target(env):
- debug('vc.py:get_host_target()')
-
- host_platform = env.get('HOST_ARCH')
- if not host_platform:
- host_platform = platform.machine()
- # TODO(2.5): the native Python platform.machine() function returns
- # '' on all Python versions before 2.6, after which it also uses
- # PROCESSOR_ARCHITECTURE.
- if not host_platform:
- host_platform = os.environ.get('PROCESSOR_ARCHITECTURE', '')
-
- # Retain user requested TARGET_ARCH
- req_target_platform = env.get('TARGET_ARCH')
- debug('vc.py:get_host_target() req_target_platform:%s'%req_target_platform)
-
- if req_target_platform:
- # If user requested a specific platform then only try that one.
- target_platform = req_target_platform
- else:
- target_platform = host_platform
-
- try:
- host = _ARCH_TO_CANONICAL[host_platform.lower()]
- except KeyError, e:
- msg = "Unrecognized host architecture %s"
- raise ValueError(msg % repr(host_platform))
-
- try:
- target = _ARCH_TO_CANONICAL[target_platform.lower()]
- except KeyError, e:
- all_archs = str(_ARCH_TO_CANONICAL.keys())
- raise ValueError("Unrecognized target architecture %s\n\tValid architectures: %s" % (target_platform, all_archs))
-
- return (host, target,req_target_platform)
-
-# If you update this, update SupportedVSList in Tool/MSCommon/vs.py, and the
-# MSVC_VERSION documentation in Tool/msvc.xml.
-_VCVER = ["14.0", "14.0Exp", "12.0", "12.0Exp", "11.0", "11.0Exp", "10.0", "10.0Exp", "9.0", "9.0Exp","8.0", "8.0Exp","7.1", "7.0", "6.0"]
-
-_VCVER_TO_PRODUCT_DIR = {
- '14.0' : [
- r'Microsoft\VisualStudio\14.0\Setup\VC\ProductDir'],
- '14.0Exp' : [
- r'Microsoft\VCExpress\14.0\Setup\VC\ProductDir'],
- '12.0' : [
- r'Microsoft\VisualStudio\12.0\Setup\VC\ProductDir'],
- '12.0Exp' : [
- r'Microsoft\VCExpress\12.0\Setup\VC\ProductDir'],
- '11.0': [
- r'Microsoft\VisualStudio\11.0\Setup\VC\ProductDir'],
- '11.0Exp' : [
- r'Microsoft\VCExpress\11.0\Setup\VC\ProductDir'],
- '10.0': [
- r'Microsoft\VisualStudio\10.0\Setup\VC\ProductDir'],
- '10.0Exp' : [
- r'Microsoft\VCExpress\10.0\Setup\VC\ProductDir'],
- '9.0': [
- r'Microsoft\VisualStudio\9.0\Setup\VC\ProductDir'],
- '9.0Exp' : [
- r'Microsoft\VCExpress\9.0\Setup\VC\ProductDir'],
- '8.0': [
- r'Microsoft\VisualStudio\8.0\Setup\VC\ProductDir'],
- '8.0Exp': [
- r'Microsoft\VCExpress\8.0\Setup\VC\ProductDir'],
- '7.1': [
- r'Microsoft\VisualStudio\7.1\Setup\VC\ProductDir'],
- '7.0': [
- r'Microsoft\VisualStudio\7.0\Setup\VC\ProductDir'],
- '6.0': [
- r'Microsoft\VisualStudio\6.0\Setup\Microsoft Visual C++\ProductDir']
-}
-
-def msvc_version_to_maj_min(msvc_version):
- msvc_version_numeric = ''.join([x for x in msvc_version if x in string_digits + '.'])
-
- t = msvc_version_numeric.split(".")
- if not len(t) == 2:
- raise ValueError("Unrecognized version %s (%s)" % (msvc_version,msvc_version_numeric))
- try:
- maj = int(t[0])
- min = int(t[1])
- return maj, min
- except ValueError, e:
- raise ValueError("Unrecognized version %s (%s)" % (msvc_version,msvc_version_numeric))
-
-def is_host_target_supported(host_target, msvc_version):
- """Return True if the given (host, target) tuple is supported given the
- msvc version.
-
- Parameters
- ----------
- host_target: tuple
- tuple of (canonalized) host-target, e.g. ("x86", "amd64") for cross
- compilation from 32 bits windows to 64 bits.
- msvc_version: str
- msvc version (major.minor, e.g. 10.0)
-
- Note
- ----
- This only check whether a given version *may* support the given (host,
- target), not that the toolchain is actually present on the machine.
- """
- # We assume that any Visual Studio version supports x86 as a target
- if host_target[1] != "x86":
- maj, min = msvc_version_to_maj_min(msvc_version)
- if maj < 8:
- return False
-
- return True
-
-def find_vc_pdir(msvc_version):
- """Try to find the product directory for the given
- version.
-
- Note
- ----
- If for some reason the requested version could not be found, an
- exception which inherits from VisualCException will be raised."""
- root = 'Software\\'
- if common.is_win64():
- root = root + 'Wow6432Node\\'
- try:
- hkeys = _VCVER_TO_PRODUCT_DIR[msvc_version]
- except KeyError:
- debug("Unknown version of MSVC: %s" % msvc_version)
- raise UnsupportedVersion("Unknown version %s" % msvc_version)
-
- for key in hkeys:
- key = root + key
- try:
- comps = common.read_reg(key)
- except WindowsError, e:
- debug('find_vc_dir(): no VC registry key %s' % repr(key))
- else:
- debug('find_vc_dir(): found VC in registry: %s' % comps)
- if os.path.exists(comps):
- return comps
- else:
- debug('find_vc_dir(): reg says dir is %s, but it does not exist. (ignoring)'\
- % comps)
- raise MissingConfiguration("registry dir %s not found on the filesystem" % comps)
- return None
-
-def find_batch_file(env,msvc_version,host_arch,target_arch):
- """
- Find the location of the batch script which should set up the compiler
- for any TARGET_ARCH whose compilers were installed by Visual Studio/VCExpress
- """
- pdir = find_vc_pdir(msvc_version)
- if pdir is None:
- raise NoVersionFound("No version of Visual Studio found")
-
- debug('vc.py: find_batch_file() pdir:%s'%pdir)
-
- # filter out e.g. "Exp" from the version name
- msvc_ver_numeric = ''.join([x for x in msvc_version if x in string_digits + "."])
- vernum = float(msvc_ver_numeric)
- if 7 <= vernum < 8:
- pdir = os.path.join(pdir, os.pardir, "Common7", "Tools")
- batfilename = os.path.join(pdir, "vsvars32.bat")
- elif vernum < 7:
- pdir = os.path.join(pdir, "Bin")
- batfilename = os.path.join(pdir, "vcvars32.bat")
- else: # >= 8
- batfilename = os.path.join(pdir, "vcvarsall.bat")
-
- if not os.path.exists(batfilename):
- debug("Not found: %s" % batfilename)
- batfilename = None
-
- installed_sdks=get_installed_sdks()
- for _sdk in installed_sdks:
- sdk_bat_file = _sdk.get_sdk_vc_script(host_arch,target_arch)
- if not sdk_bat_file:
- debug("vc.py:find_batch_file() not found:%s"%_sdk)
- else:
- sdk_bat_file_path = os.path.join(pdir,sdk_bat_file)
- if os.path.exists(sdk_bat_file_path):
- debug('vc.py:find_batch_file() sdk_bat_file_path:%s'%sdk_bat_file_path)
- return (batfilename,sdk_bat_file_path)
- return (batfilename,None)
-
-
-__INSTALLED_VCS_RUN = None
-
-def cached_get_installed_vcs():
- global __INSTALLED_VCS_RUN
-
- if __INSTALLED_VCS_RUN is None:
- ret = get_installed_vcs()
- __INSTALLED_VCS_RUN = ret
-
- return __INSTALLED_VCS_RUN
-
-def get_installed_vcs():
- installed_versions = []
- for ver in _VCVER:
- debug('trying to find VC %s' % ver)
- try:
- if find_vc_pdir(ver):
- debug('found VC %s' % ver)
- installed_versions.append(ver)
- else:
- debug('find_vc_pdir return None for ver %s' % ver)
- except VisualCException, e:
- debug('did not find VC %s: caught exception %s' % (ver, str(e)))
- return installed_versions
-
-def reset_installed_vcs():
- """Make it try again to find VC. This is just for the tests."""
- __INSTALLED_VCS_RUN = None
-
-# Running these batch files isn't cheap: most of the time spent in
-# msvs.generate() is due to vcvars*.bat. In a build that uses "tools='msvs'"
-# in multiple environments, for example:
-# env1 = Environment(tools='msvs')
-# env2 = Environment(tools='msvs')
-# we can greatly improve the speed of the second and subsequent Environment
-# (or Clone) calls by memoizing the environment variables set by vcvars*.bat.
-script_env_stdout_cache = {}
-def script_env(script, args=None):
- cache_key = (script, args)
- stdout = script_env_stdout_cache.get(cache_key, None)
- if stdout is None:
- stdout = common.get_output(script, args)
- script_env_stdout_cache[cache_key] = stdout
-
- # Stupid batch files do not set return code: we take a look at the
- # beginning of the output for an error message instead
- olines = stdout.splitlines()
- if olines[0].startswith("The specified configuration type is missing"):
- raise BatchFileExecutionError("\n".join(olines[:2]))
-
- return common.parse_output(stdout)
-
-def get_default_version(env):
- debug('get_default_version()')
-
- msvc_version = env.get('MSVC_VERSION')
- msvs_version = env.get('MSVS_VERSION')
-
- debug('get_default_version(): msvc_version:%s msvs_version:%s'%(msvc_version,msvs_version))
-
- if msvs_version and not msvc_version:
- SCons.Warnings.warn(
- SCons.Warnings.DeprecatedWarning,
- "MSVS_VERSION is deprecated: please use MSVC_VERSION instead ")
- return msvs_version
- elif msvc_version and msvs_version:
- if not msvc_version == msvs_version:
- SCons.Warnings.warn(
- SCons.Warnings.VisualVersionMismatch,
- "Requested msvc version (%s) and msvs version (%s) do " \
- "not match: please use MSVC_VERSION only to request a " \
- "visual studio version, MSVS_VERSION is deprecated" \
- % (msvc_version, msvs_version))
- return msvs_version
- if not msvc_version:
- installed_vcs = cached_get_installed_vcs()
- debug('installed_vcs:%s' % installed_vcs)
- if not installed_vcs:
- #msg = 'No installed VCs'
- #debug('msv %s\n' % repr(msg))
- #SCons.Warnings.warn(SCons.Warnings.VisualCMissingWarning, msg)
- debug('msvc_setup_env: No installed VCs')
- return None
- msvc_version = installed_vcs[0]
- debug('msvc_setup_env: using default installed MSVC version %s\n' % repr(msvc_version))
-
- return msvc_version
-
-def msvc_setup_env_once(env):
- try:
- has_run = env["MSVC_SETUP_RUN"]
- except KeyError:
- has_run = False
-
- if not has_run:
- msvc_setup_env(env)
- env["MSVC_SETUP_RUN"] = True
-
-def msvc_find_valid_batch_script(env,version):
- debug('vc.py:msvc_find_valid_batch_script()')
- # Find the host platform, target platform, and if present the requested
- # target platform
- (host_platform, target_platform,req_target_platform) = get_host_target(env)
-
- try_target_archs = [target_platform]
- debug("msvs_find_valid_batch_script(): req_target_platform %s target_platform:%s"%(req_target_platform,target_platform))
-
- # VS2012 has a "cross compile" environment to build 64 bit
- # with x86_amd64 as the argument to the batch setup script
- if req_target_platform in ('amd64','x86_64'):
- try_target_archs.append('x86_amd64')
- elif not req_target_platform and target_platform in ['amd64','x86_64']:
- # There may not be "native" amd64, but maybe "cross" x86_amd64 tools
- try_target_archs.append('x86_amd64')
- # If the user hasn't specifically requested a TARGET_ARCH, and
- # The TARGET_ARCH is amd64 then also try 32 bits if there are no viable
- # 64 bit tools installed
- try_target_archs.append('x86')
-
- debug("msvs_find_valid_batch_script(): host_platform: %s try_target_archs:%s"%(host_platform, try_target_archs))
-
- d = None
- for tp in try_target_archs:
- # Set to current arch.
- env['TARGET_ARCH']=tp
-
- debug("vc.py:msvc_find_valid_batch_script() trying target_platform:%s"%tp)
- host_target = (host_platform, tp)
- if not is_host_target_supported(host_target, version):
- warn_msg = "host, target = %s not supported for MSVC version %s" % \
- (host_target, version)
- SCons.Warnings.warn(SCons.Warnings.VisualCMissingWarning, warn_msg)
- arg = _HOST_TARGET_ARCH_TO_BAT_ARCH[host_target]
-
- # Try to locate a batch file for this host/target platform combo
- try:
- (vc_script,sdk_script) = find_batch_file(env,version,host_platform,tp)
- debug('vc.py:msvc_find_valid_batch_script() vc_script:%s sdk_script:%s'%(vc_script,sdk_script))
- except VisualCException, e:
- msg = str(e)
- debug('Caught exception while looking for batch file (%s)' % msg)
- warn_msg = "VC version %s not installed. " + \
- "C/C++ compilers are most likely not set correctly.\n" + \
- " Installed versions are: %s"
- warn_msg = warn_msg % (version, cached_get_installed_vcs())
- SCons.Warnings.warn(SCons.Warnings.VisualCMissingWarning, warn_msg)
- continue
-
- # Try to use the located batch file for this host/target platform combo
- debug('vc.py:msvc_find_valid_batch_script() use_script 2 %s, args:%s\n' % (repr(vc_script), arg))
- if vc_script:
- try:
- d = script_env(vc_script, args=arg)
- except BatchFileExecutionError, e:
- debug('vc.py:msvc_find_valid_batch_script() use_script 3: failed running VC script %s: %s: Error:%s'%(repr(vc_script),arg,e))
- vc_script=None
- continue
- if not vc_script and sdk_script:
- debug('vc.py:msvc_find_valid_batch_script() use_script 4: trying sdk script: %s'%(sdk_script))
- try:
- d = script_env(sdk_script)
- except BatchFileExecutionError,e:
- debug('vc.py:msvc_find_valid_batch_script() use_script 5: failed running SDK script %s: Error:%s'%(repr(sdk_script),e))
- continue
- elif not vc_script and not sdk_script:
- debug('vc.py:msvc_find_valid_batch_script() use_script 6: Neither VC script nor SDK script found')
- continue
-
- debug("vc.py:msvc_find_valid_batch_script() Found a working script/target: %s %s"%(repr(sdk_script),arg))
- break # We've found a working target_platform, so stop looking
-
- # If we cannot find a viable installed compiler, reset the TARGET_ARCH
- # To it's initial value
- if not d:
- env['TARGET_ARCH']=req_target_platform
-
- return d
-
-
-def msvc_setup_env(env):
- debug('msvc_setup_env()')
-
- version = get_default_version(env)
- if version is None:
- warn_msg = "No version of Visual Studio compiler found - C/C++ " \
- "compilers most likely not set correctly"
- SCons.Warnings.warn(SCons.Warnings.VisualCMissingWarning, warn_msg)
- return None
- debug('msvc_setup_env: using specified MSVC version %s\n' % repr(version))
-
- # XXX: we set-up both MSVS version for backward
- # compatibility with the msvs tool
- env['MSVC_VERSION'] = version
- env['MSVS_VERSION'] = version
- env['MSVS'] = {}
-
-
- use_script = env.get('MSVC_USE_SCRIPT', True)
- if SCons.Util.is_String(use_script):
- debug('vc.py:msvc_setup_env() use_script 1 %s\n' % repr(use_script))
- d = script_env(use_script)
- elif use_script:
- d = msvc_find_valid_batch_script(env,version)
- debug('vc.py:msvc_setup_env() use_script 2 %s\n' % d)
- if not d:
- return d
- else:
- debug('MSVC_USE_SCRIPT set to False')
- warn_msg = "MSVC_USE_SCRIPT set to False, assuming environment " \
- "set correctly."
- SCons.Warnings.warn(SCons.Warnings.VisualCMissingWarning, warn_msg)
- return None
-
- for k, v in d.items():
- debug('vc.py:msvc_setup_env() env:%s -> %s'%(k,v))
- env.PrependENVPath(k, v, delete_existing=True)
-
-def msvc_exists(version=None):
- vcs = cached_get_installed_vcs()
- if version is None:
- return len(vcs) > 0
- return version in vcs
-
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/MSCommon/vs.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/MSCommon/vs.py
deleted file mode 100644
index 619cbe5..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/MSCommon/vs.py
+++ /dev/null
@@ -1,566 +0,0 @@
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-
-__revision__ = "src/engine/SCons/Tool/MSCommon/vs.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-__doc__ = """Module to detect Visual Studio and/or Visual C/C++
-"""
-
-import os
-
-import SCons.Errors
-import SCons.Util
-
-from common import debug, \
- get_output, \
- is_win64, \
- normalize_env, \
- parse_output, \
- read_reg
-
-import SCons.Tool.MSCommon.vc
-
-class VisualStudio(object):
- """
- An abstract base class for trying to find installed versions of
- Visual Studio.
- """
- def __init__(self, version, **kw):
- self.version = version
- kw['vc_version'] = kw.get('vc_version', version)
- kw['sdk_version'] = kw.get('sdk_version', version)
- self.__dict__.update(kw)
- self._cache = {}
-
- #
-
- def find_batch_file(self):
- vs_dir = self.get_vs_dir()
- if not vs_dir:
- debug('find_executable(): no vs_dir')
- return None
- batch_file = os.path.join(vs_dir, self.batch_file_path)
- batch_file = os.path.normpath(batch_file)
- if not os.path.isfile(batch_file):
- debug('find_batch_file(): %s not on file system' % batch_file)
- return None
- return batch_file
-
- def find_vs_dir_by_vc(self):
- SCons.Tool.MSCommon.vc.get_installed_vcs()
- dir = SCons.Tool.MSCommon.vc.find_vc_pdir(self.vc_version)
- if not dir:
- debug('find_vs_dir(): no installed VC %s' % self.vc_version)
- return None
- return dir
-
- def find_vs_dir_by_reg(self):
- root = 'Software\\'
-
- if is_win64():
- root = root + 'Wow6432Node\\'
- for key in self.hkeys:
- if key=='use_dir':
- return self.find_vs_dir_by_vc()
- key = root + key
- try:
- comps = read_reg(key)
- except WindowsError, e:
- debug('find_vs_dir_by_reg(): no VS registry key %s' % repr(key))
- else:
- debug('find_vs_dir_by_reg(): found VS in registry: %s' % comps)
- return comps
- return None
-
- def find_vs_dir(self):
- """ Can use registry or location of VC to find vs dir
- First try to find by registry, and if that fails find via VC dir
- """
-
-
- if True:
- vs_dir=self.find_vs_dir_by_reg()
- return vs_dir
- else:
- return self.find_vs_dir_by_vc()
-
- def find_executable(self):
- vs_dir = self.get_vs_dir()
- if not vs_dir:
- debug('find_executable(): no vs_dir (%s)'%vs_dir)
- return None
- executable = os.path.join(vs_dir, self.executable_path)
- executable = os.path.normpath(executable)
- if not os.path.isfile(executable):
- debug('find_executable(): %s not on file system' % executable)
- return None
- return executable
-
- #
-
- def get_batch_file(self):
- try:
- return self._cache['batch_file']
- except KeyError:
- batch_file = self.find_batch_file()
- self._cache['batch_file'] = batch_file
- return batch_file
-
- def get_executable(self):
- try:
- debug('get_executable using cache:%s'%self._cache['executable'])
- return self._cache['executable']
- except KeyError:
- executable = self.find_executable()
- self._cache['executable'] = executable
- debug('get_executable not in cache:%s'%executable)
- return executable
-
- def get_vs_dir(self):
- try:
- return self._cache['vs_dir']
- except KeyError:
- vs_dir = self.find_vs_dir()
- self._cache['vs_dir'] = vs_dir
- return vs_dir
-
- def get_supported_arch(self):
- try:
- return self._cache['supported_arch']
- except KeyError:
- # RDEVE: for the time being use hardcoded lists
- # supported_arch = self.find_supported_arch()
- self._cache['supported_arch'] = self.supported_arch
- return self.supported_arch
-
- def reset(self):
- self._cache = {}
-
-# The list of supported Visual Studio versions we know how to detect.
-#
-# How to look for .bat file ?
-# - VS 2008 Express (x86):
-# * from registry key productdir, gives the full path to vsvarsall.bat. In
-# HKEY_LOCAL_MACHINE):
-# Software\Microsoft\VCEpress\9.0\Setup\VC\productdir
-# * from environmnent variable VS90COMNTOOLS: the path is then ..\..\VC
-# relatively to the path given by the variable.
-#
-# - VS 2008 Express (WoW6432: 32 bits on windows x64):
-# Software\Wow6432Node\Microsoft\VCEpress\9.0\Setup\VC\productdir
-#
-# - VS 2005 Express (x86):
-# * from registry key productdir, gives the full path to vsvarsall.bat. In
-# HKEY_LOCAL_MACHINE):
-# Software\Microsoft\VCEpress\8.0\Setup\VC\productdir
-# * from environmnent variable VS80COMNTOOLS: the path is then ..\..\VC
-# relatively to the path given by the variable.
-#
-# - VS 2005 Express (WoW6432: 32 bits on windows x64): does not seem to have a
-# productdir ?
-#
-# - VS 2003 .Net (pro edition ? x86):
-# * from registry key productdir. The path is then ..\Common7\Tools\
-# relatively to the key. The key is in HKEY_LOCAL_MACHINE):
-# Software\Microsoft\VisualStudio\7.1\Setup\VC\productdir
-# * from environmnent variable VS71COMNTOOLS: the path is the full path to
-# vsvars32.bat
-#
-# - VS 98 (VS 6):
-# * from registry key productdir. The path is then Bin
-# relatively to the key. The key is in HKEY_LOCAL_MACHINE):
-# Software\Microsoft\VisualStudio\6.0\Setup\VC98\productdir
-#
-# The first version found in the list is the one used by default if
-# there are multiple versions installed. Barring good reasons to
-# the contrary, this means we should list versions from most recent
-# to oldest. Pro versions get listed before Express versions on the
-# assumption that, by default, you'd rather use the version you paid
-# good money for in preference to whatever Microsoft makes available
-# for free.
-#
-# If you update this list, update _VCVER and _VCVER_TO_PRODUCT_DIR in
-# Tool/MSCommon/vc.py, and the MSVC_VERSION documentation in Tool/msvc.xml.
-
-SupportedVSList = [
- # Visual Studio 2015
- VisualStudio('14.0',
- vc_version='14.0',
- sdk_version='10.0A',
- hkeys=[r'Microsoft\VisualStudio\14.0\Setup\VS\ProductDir'],
- common_tools_var='VS140COMNTOOLS',
- executable_path=r'Common7\IDE\devenv.com',
- batch_file_path=r'Common7\Tools\vsvars32.bat',
- supported_arch=['x86', 'amd64', "arm"],
- ),
-
- # Visual C++ 2015 Express Edition (for Desktop)
- VisualStudio('14.0Exp',
- vc_version='14.0',
- sdk_version='10.0A',
- hkeys=[r'Microsoft\VisualStudio\14.0\Setup\VS\ProductDir'],
- common_tools_var='VS140COMNTOOLS',
- executable_path=r'Common7\IDE\WDExpress.exe',
- batch_file_path=r'Common7\Tools\vsvars32.bat',
- supported_arch=['x86', 'amd64', "arm"],
- ),
-
- # Visual Studio 2013
- VisualStudio('12.0',
- vc_version='12.0',
- sdk_version='8.1A',
- hkeys=[r'Microsoft\VisualStudio\12.0\Setup\VS\ProductDir'],
- common_tools_var='VS120COMNTOOLS',
- executable_path=r'Common7\IDE\devenv.com',
- batch_file_path=r'Common7\Tools\vsvars32.bat',
- supported_arch=['x86', 'amd64'],
- ),
-
- # Visual C++ 2013 Express Edition (for Desktop)
- VisualStudio('12.0Exp',
- vc_version='12.0',
- sdk_version='8.1A',
- hkeys=[r'Microsoft\VisualStudio\12.0\Setup\VS\ProductDir'],
- common_tools_var='VS120COMNTOOLS',
- executable_path=r'Common7\IDE\WDExpress.exe',
- batch_file_path=r'Common7\Tools\vsvars32.bat',
- supported_arch=['x86', 'amd64'],
- ),
-
- # Visual Studio 2012
- VisualStudio('11.0',
- sdk_version='8.0A',
- hkeys=[r'Microsoft\VisualStudio\11.0\Setup\VS\ProductDir'],
- common_tools_var='VS110COMNTOOLS',
- executable_path=r'Common7\IDE\devenv.com',
- batch_file_path=r'Common7\Tools\vsvars32.bat',
- supported_arch=['x86', 'amd64'],
- ),
-
- # Visual C++ 2012 Express Edition (for Desktop)
- VisualStudio('11.0Exp',
- vc_version='11.0',
- sdk_version='8.0A',
- hkeys=[r'Microsoft\VisualStudio\11.0\Setup\VS\ProductDir'],
- common_tools_var='VS110COMNTOOLS',
- executable_path=r'Common7\IDE\WDExpress.exe',
- batch_file_path=r'Common7\Tools\vsvars32.bat',
- supported_arch=['x86', 'amd64'],
- ),
-
- # Visual Studio 2010
- VisualStudio('10.0',
- sdk_version='7.0A',
- hkeys=[r'Microsoft\VisualStudio\10.0\Setup\VS\ProductDir'],
- common_tools_var='VS100COMNTOOLS',
- executable_path=r'Common7\IDE\devenv.com',
- batch_file_path=r'Common7\Tools\vsvars32.bat',
- supported_arch=['x86', 'amd64'],
- ),
-
- # Visual C++ 2010 Express Edition
- VisualStudio('10.0Exp',
- vc_version='10.0',
- sdk_version='7.0A',
- hkeys=[r'Microsoft\VCExpress\10.0\Setup\VS\ProductDir'],
- common_tools_var='VS100COMNTOOLS',
- executable_path=r'Common7\IDE\VCExpress.exe',
- batch_file_path=r'Common7\Tools\vsvars32.bat',
- supported_arch=['x86'],
- ),
-
- # Visual Studio 2008
- VisualStudio('9.0',
- sdk_version='6.0A',
- hkeys=[r'Microsoft\VisualStudio\9.0\Setup\VS\ProductDir'],
- common_tools_var='VS90COMNTOOLS',
- executable_path=r'Common7\IDE\devenv.com',
- batch_file_path=r'Common7\Tools\vsvars32.bat',
- supported_arch=['x86', 'amd64'],
- ),
-
- # Visual C++ 2008 Express Edition
- VisualStudio('9.0Exp',
- vc_version='9.0',
- sdk_version='6.0A',
- hkeys=[r'Microsoft\VCExpress\9.0\Setup\VS\ProductDir'],
- common_tools_var='VS90COMNTOOLS',
- executable_path=r'Common7\IDE\VCExpress.exe',
- batch_file_path=r'Common7\Tools\vsvars32.bat',
- supported_arch=['x86'],
- ),
-
- # Visual Studio 2005
- VisualStudio('8.0',
- sdk_version='6.0A',
- hkeys=[r'Microsoft\VisualStudio\8.0\Setup\VS\ProductDir'],
- common_tools_var='VS80COMNTOOLS',
- executable_path=r'Common7\IDE\devenv.com',
- batch_file_path=r'Common7\Tools\vsvars32.bat',
- default_dirname='Microsoft Visual Studio 8',
- supported_arch=['x86', 'amd64'],
- ),
-
- # Visual C++ 2005 Express Edition
- VisualStudio('8.0Exp',
- vc_version='8.0Exp',
- sdk_version='6.0A',
- hkeys=[r'Microsoft\VCExpress\8.0\Setup\VS\ProductDir'],
- common_tools_var='VS80COMNTOOLS',
- executable_path=r'Common7\IDE\VCExpress.exe',
- batch_file_path=r'Common7\Tools\vsvars32.bat',
- default_dirname='Microsoft Visual Studio 8',
- supported_arch=['x86'],
- ),
-
- # Visual Studio .NET 2003
- VisualStudio('7.1',
- sdk_version='6.0',
- hkeys=[r'Microsoft\VisualStudio\7.1\Setup\VS\ProductDir'],
- common_tools_var='VS71COMNTOOLS',
- executable_path=r'Common7\IDE\devenv.com',
- batch_file_path=r'Common7\Tools\vsvars32.bat',
- default_dirname='Microsoft Visual Studio .NET 2003',
- supported_arch=['x86'],
- ),
-
- # Visual Studio .NET
- VisualStudio('7.0',
- sdk_version='2003R2',
- hkeys=[r'Microsoft\VisualStudio\7.0\Setup\VS\ProductDir'],
- common_tools_var='VS70COMNTOOLS',
- executable_path=r'IDE\devenv.com',
- batch_file_path=r'Common7\Tools\vsvars32.bat',
- default_dirname='Microsoft Visual Studio .NET',
- supported_arch=['x86'],
- ),
-
- # Visual Studio 6.0
- VisualStudio('6.0',
- sdk_version='2003R1',
- hkeys=[r'Microsoft\VisualStudio\6.0\Setup\Microsoft Visual Studio\ProductDir',
- 'use_dir'],
- common_tools_var='VS60COMNTOOLS',
- executable_path=r'Common\MSDev98\Bin\MSDEV.COM',
- batch_file_path=r'Common7\Tools\vsvars32.bat',
- default_dirname='Microsoft Visual Studio',
- supported_arch=['x86'],
- ),
-]
-
-SupportedVSMap = {}
-for vs in SupportedVSList:
- SupportedVSMap[vs.version] = vs
-
-
-# Finding installed versions of Visual Studio isn't cheap, because it
-# goes not only to the registry but also to the disk to sanity-check
-# that there is, in fact, a Visual Studio directory there and that the
-# registry entry isn't just stale. Find this information once, when
-# requested, and cache it.
-
-InstalledVSList = None
-InstalledVSMap = None
-
-def get_installed_visual_studios():
- global InstalledVSList
- global InstalledVSMap
- if InstalledVSList is None:
- InstalledVSList = []
- InstalledVSMap = {}
- for vs in SupportedVSList:
- debug('trying to find VS %s' % vs.version)
- if vs.get_executable():
- debug('found VS %s' % vs.version)
- InstalledVSList.append(vs)
- InstalledVSMap[vs.version] = vs
- return InstalledVSList
-
-def reset_installed_visual_studios():
- global InstalledVSList
- global InstalledVSMap
- InstalledVSList = None
- InstalledVSMap = None
- for vs in SupportedVSList:
- vs.reset()
-
- # Need to clear installed VC's as well as they are used in finding
- # installed VS's
- SCons.Tool.MSCommon.vc.reset_installed_vcs()
-
-
-# We may be asked to update multiple construction environments with
-# SDK information. When doing this, we check on-disk for whether
-# the SDK has 'mfc' and 'atl' subdirectories. Since going to disk
-# is expensive, cache results by directory.
-
-#SDKEnvironmentUpdates = {}
-#
-#def set_sdk_by_directory(env, sdk_dir):
-# global SDKEnvironmentUpdates
-# try:
-# env_tuple_list = SDKEnvironmentUpdates[sdk_dir]
-# except KeyError:
-# env_tuple_list = []
-# SDKEnvironmentUpdates[sdk_dir] = env_tuple_list
-#
-# include_path = os.path.join(sdk_dir, 'include')
-# mfc_path = os.path.join(include_path, 'mfc')
-# atl_path = os.path.join(include_path, 'atl')
-#
-# if os.path.exists(mfc_path):
-# env_tuple_list.append(('INCLUDE', mfc_path))
-# if os.path.exists(atl_path):
-# env_tuple_list.append(('INCLUDE', atl_path))
-# env_tuple_list.append(('INCLUDE', include_path))
-#
-# env_tuple_list.append(('LIB', os.path.join(sdk_dir, 'lib')))
-# env_tuple_list.append(('LIBPATH', os.path.join(sdk_dir, 'lib')))
-# env_tuple_list.append(('PATH', os.path.join(sdk_dir, 'bin')))
-#
-# for variable, directory in env_tuple_list:
-# env.PrependENVPath(variable, directory)
-
-def msvs_exists():
- return (len(get_installed_visual_studios()) > 0)
-
-def get_vs_by_version(msvs):
- global InstalledVSMap
- global SupportedVSMap
-
- debug('vs.py:get_vs_by_version()')
- if msvs not in SupportedVSMap:
- msg = "Visual Studio version %s is not supported" % repr(msvs)
- raise SCons.Errors.UserError(msg)
- get_installed_visual_studios()
- vs = InstalledVSMap.get(msvs)
- debug('InstalledVSMap:%s'%InstalledVSMap)
- debug('vs.py:get_vs_by_version: found vs:%s'%vs)
- # Some check like this would let us provide a useful error message
- # if they try to set a Visual Studio version that's not installed.
- # However, we also want to be able to run tests (like the unit
- # tests) on systems that don't, or won't ever, have it installed.
- # It might be worth resurrecting this, with some configurable
- # setting that the tests can use to bypass the check.
- #if not vs:
- # msg = "Visual Studio version %s is not installed" % repr(msvs)
- # raise SCons.Errors.UserError, msg
- return vs
-
-def get_default_version(env):
- """Returns the default version string to use for MSVS.
-
- If no version was requested by the user through the MSVS environment
- variable, query all the available the visual studios through
- get_installed_visual_studios, and take the highest one.
-
- Return
- ------
- version: str
- the default version.
- """
- if 'MSVS' not in env or not SCons.Util.is_Dict(env['MSVS']):
- # get all versions, and remember them for speed later
- versions = [vs.version for vs in get_installed_visual_studios()]
- env['MSVS'] = {'VERSIONS' : versions}
- else:
- versions = env['MSVS'].get('VERSIONS', [])
-
- if 'MSVS_VERSION' not in env:
- if versions:
- env['MSVS_VERSION'] = versions[0] #use highest version by default
- else:
- debug('get_default_version: WARNING: no installed versions found, '
- 'using first in SupportedVSList (%s)'%SupportedVSList[0].version)
- env['MSVS_VERSION'] = SupportedVSList[0].version
-
- env['MSVS']['VERSION'] = env['MSVS_VERSION']
-
- return env['MSVS_VERSION']
-
-def get_default_arch(env):
- """Return the default arch to use for MSVS
-
- if no version was requested by the user through the MSVS_ARCH environment
- variable, select x86
-
- Return
- ------
- arch: str
- """
- arch = env.get('MSVS_ARCH', 'x86')
-
- msvs = InstalledVSMap.get(env['MSVS_VERSION'])
-
- if not msvs:
- arch = 'x86'
- elif not arch in msvs.get_supported_arch():
- fmt = "Visual Studio version %s does not support architecture %s"
- raise SCons.Errors.UserError(fmt % (env['MSVS_VERSION'], arch))
-
- return arch
-
-def merge_default_version(env):
- version = get_default_version(env)
- arch = get_default_arch(env)
-
-def msvs_setup_env(env):
- batfilename = msvs.get_batch_file()
- msvs = get_vs_by_version(version)
- if msvs is None:
- return
-
- # XXX: I think this is broken. This will silently set a bogus tool instead
- # of failing, but there is no other way with the current scons tool
- # framework
- if batfilename is not None:
-
- vars = ('LIB', 'LIBPATH', 'PATH', 'INCLUDE')
-
- msvs_list = get_installed_visual_studios()
- vscommonvarnames = [vs.common_tools_var for vs in msvs_list]
- save_ENV = env['ENV']
- nenv = normalize_env(env['ENV'],
- ['COMSPEC'] + vscommonvarnames,
- force=True)
- try:
- output = get_output(batfilename, arch, env=nenv)
- finally:
- env['ENV'] = save_ENV
- vars = parse_output(output, vars)
-
- for k, v in vars.items():
- env.PrependENVPath(k, v, delete_existing=1)
-
-def query_versions():
- """Query the system to get available versions of VS. A version is
- considered when a batfile is found."""
- msvs_list = get_installed_visual_studios()
- versions = [msvs.version for msvs in msvs_list]
- return versions
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/Perforce.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/Perforce.py
deleted file mode 100644
index ddff25f..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/Perforce.py
+++ /dev/null
@@ -1,103 +0,0 @@
-"""SCons.Tool.Perforce.py
-
-Tool-specific initialization for Perforce Source Code Management system.
-
-There normally shouldn't be any need to import this module directly.
-It will usually be imported through the generic SCons.Tool.Tool()
-selection method.
-
-"""
-
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-__revision__ = "src/engine/SCons/Tool/Perforce.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-import os
-
-import SCons.Action
-import SCons.Builder
-import SCons.Node.FS
-import SCons.Util
-
-# This function should maybe be moved to SCons.Util?
-from SCons.Tool.PharLapCommon import addPathIfNotExists
-
-
-# Variables that we want to import from the base OS environment.
-_import_env = [ 'P4PORT', 'P4CLIENT', 'P4USER', 'USER', 'USERNAME', 'P4PASSWD',
- 'P4CHARSET', 'P4LANGUAGE', 'SystemRoot' ]
-
-PerforceAction = SCons.Action.Action('$P4COM', '$P4COMSTR')
-
-def generate(env):
- """Add a Builder factory function and construction variables for
- Perforce to an Environment."""
-
- def PerforceFactory(env=env):
- """ """
- import SCons.Warnings as W
- W.warn(W.DeprecatedSourceCodeWarning, """The Perforce() factory is deprecated and there is no replacement.""")
- return SCons.Builder.Builder(action = PerforceAction, env = env)
-
- #setattr(env, 'Perforce', PerforceFactory)
- env.Perforce = PerforceFactory
-
- env['P4'] = 'p4'
- env['P4FLAGS'] = SCons.Util.CLVar('')
- env['P4COM'] = '$P4 $P4FLAGS sync $TARGET'
- try:
- environ = env['ENV']
- except KeyError:
- environ = {}
- env['ENV'] = environ
-
- # Perforce seems to use the PWD environment variable rather than
- # calling getcwd() for itself, which is odd. If no PWD variable
- # is present, p4 WILL call getcwd, but this seems to cause problems
- # with good ol' Windows's tilde-mangling for long file names.
- environ['PWD'] = env.Dir('#').get_abspath()
-
- for var in _import_env:
- v = os.environ.get(var)
- if v:
- environ[var] = v
-
- if SCons.Util.can_read_reg:
- # If we can read the registry, add the path to Perforce to our environment.
- try:
- k=SCons.Util.RegOpenKeyEx(SCons.Util.hkey_mod.HKEY_LOCAL_MACHINE,
- 'Software\\Perforce\\environment')
- val, tok = SCons.Util.RegQueryValueEx(k, 'P4INSTROOT')
- addPathIfNotExists(environ, 'PATH', val)
- except SCons.Util.RegError:
- # Can't detect where Perforce is, hope the user has it set in the
- # PATH.
- pass
-
-def exists(env):
- return env.Detect('p4')
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/PharLapCommon.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/PharLapCommon.py
deleted file mode 100644
index 576dea1..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/PharLapCommon.py
+++ /dev/null
@@ -1,137 +0,0 @@
-"""SCons.Tool.PharLapCommon
-
-This module contains common code used by all Tools for the
-Phar Lap ETS tool chain. Right now, this is linkloc and
-386asm.
-
-"""
-
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-
-__revision__ = "src/engine/SCons/Tool/PharLapCommon.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-import os
-import os.path
-import SCons.Errors
-import SCons.Util
-import re
-
-def getPharLapPath():
- """Reads the registry to find the installed path of the Phar Lap ETS
- development kit.
-
- Raises UserError if no installed version of Phar Lap can
- be found."""
-
- if not SCons.Util.can_read_reg:
- raise SCons.Errors.InternalError("No Windows registry module was found")
- try:
- k=SCons.Util.RegOpenKeyEx(SCons.Util.HKEY_LOCAL_MACHINE,
- 'SOFTWARE\\Pharlap\\ETS')
- val, type = SCons.Util.RegQueryValueEx(k, 'BaseDir')
-
- # The following is a hack...there is (not surprisingly)
- # an odd issue in the Phar Lap plug in that inserts
- # a bunch of junk data after the phar lap path in the
- # registry. We must trim it.
- idx=val.find('\0')
- if idx >= 0:
- val = val[:idx]
-
- return os.path.normpath(val)
- except SCons.Util.RegError:
- raise SCons.Errors.UserError("Cannot find Phar Lap ETS path in the registry. Is it installed properly?")
-
-REGEX_ETS_VER = re.compile(r'#define\s+ETS_VER\s+([0-9]+)')
-
-def getPharLapVersion():
- """Returns the version of the installed ETS Tool Suite as a
- decimal number. This version comes from the ETS_VER #define in
- the embkern.h header. For example, '#define ETS_VER 1010' (which
- is what Phar Lap 10.1 defines) would cause this method to return
- 1010. Phar Lap 9.1 does not have such a #define, but this method
- will return 910 as a default.
-
- Raises UserError if no installed version of Phar Lap can
- be found."""
-
- include_path = os.path.join(getPharLapPath(), os.path.normpath("include/embkern.h"))
- if not os.path.exists(include_path):
- raise SCons.Errors.UserError("Cannot find embkern.h in ETS include directory.\nIs Phar Lap ETS installed properly?")
- mo = REGEX_ETS_VER.search(open(include_path, 'r').read())
- if mo:
- return int(mo.group(1))
- # Default return for Phar Lap 9.1
- return 910
-
-def addPathIfNotExists(env_dict, key, path, sep=os.pathsep):
- """This function will take 'key' out of the dictionary
- 'env_dict', then add the path 'path' to that key if it is not
- already there. This treats the value of env_dict[key] as if it
- has a similar format to the PATH variable...a list of paths
- separated by tokens. The 'path' will get added to the list if it
- is not already there."""
- try:
- is_list = 1
- paths = env_dict[key]
- if not SCons.Util.is_List(env_dict[key]):
- paths = paths.split(sep)
- is_list = 0
- if os.path.normcase(path) not in list(map(os.path.normcase, paths)):
- paths = [ path ] + paths
- if is_list:
- env_dict[key] = paths
- else:
- env_dict[key] = sep.join(paths)
- except KeyError:
- env_dict[key] = path
-
-def addPharLapPaths(env):
- """This function adds the path to the Phar Lap binaries, includes,
- and libraries, if they are not already there."""
- ph_path = getPharLapPath()
-
- try:
- env_dict = env['ENV']
- except KeyError:
- env_dict = {}
- env['ENV'] = env_dict
- addPathIfNotExists(env_dict, 'PATH',
- os.path.join(ph_path, 'bin'))
- addPathIfNotExists(env_dict, 'INCLUDE',
- os.path.join(ph_path, 'include'))
- addPathIfNotExists(env_dict, 'LIB',
- os.path.join(ph_path, 'lib'))
- addPathIfNotExists(env_dict, 'LIB',
- os.path.join(ph_path, os.path.normpath('lib/vclib')))
-
- env['PHARLAP_PATH'] = getPharLapPath()
- env['PHARLAP_VERSION'] = str(getPharLapVersion())
-
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/RCS.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/RCS.py
deleted file mode 100644
index d63bcd4..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/RCS.py
+++ /dev/null
@@ -1,64 +0,0 @@
-"""SCons.Tool.RCS.py
-
-Tool-specific initialization for RCS.
-
-There normally shouldn't be any need to import this module directly.
-It will usually be imported through the generic SCons.Tool.Tool()
-selection method.
-
-"""
-
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-__revision__ = "src/engine/SCons/Tool/RCS.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-import SCons.Action
-import SCons.Builder
-import SCons.Util
-
-def generate(env):
- """Add a Builder factory function and construction variables for
- RCS to an Environment."""
-
- def RCSFactory(env=env):
- """ """
- import SCons.Warnings as W
- W.warn(W.DeprecatedSourceCodeWarning, """The RCS() factory is deprecated and there is no replacement.""")
- act = SCons.Action.Action('$RCS_COCOM', '$RCS_COCOMSTR')
- return SCons.Builder.Builder(action = act, env = env)
-
- #setattr(env, 'RCS', RCSFactory)
- env.RCS = RCSFactory
-
- env['RCS'] = 'rcs'
- env['RCS_CO'] = 'co'
- env['RCS_COFLAGS'] = SCons.Util.CLVar('')
- env['RCS_COCOM'] = '$RCS_CO $RCS_COFLAGS $TARGET'
-
-def exists(env):
- return env.Detect('rcs')
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/SCCS.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/SCCS.py
deleted file mode 100644
index 76f69e7..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/SCCS.py
+++ /dev/null
@@ -1,64 +0,0 @@
-"""SCons.Tool.SCCS.py
-
-Tool-specific initialization for SCCS.
-
-There normally shouldn't be any need to import this module directly.
-It will usually be imported through the generic SCons.Tool.Tool()
-selection method.
-
-"""
-
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-__revision__ = "src/engine/SCons/Tool/SCCS.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-import SCons.Action
-import SCons.Builder
-import SCons.Util
-
-def generate(env):
- """Add a Builder factory function and construction variables for
- SCCS to an Environment."""
-
- def SCCSFactory(env=env):
- """ """
- import SCons.Warnings as W
- W.warn(W.DeprecatedSourceCodeWarning, """The SCCS() factory is deprecated and there is no replacement.""")
- act = SCons.Action.Action('$SCCSCOM', '$SCCSCOMSTR')
- return SCons.Builder.Builder(action = act, env = env)
-
- #setattr(env, 'SCCS', SCCSFactory)
- env.SCCS = SCCSFactory
-
- env['SCCS'] = 'sccs'
- env['SCCSFLAGS'] = SCons.Util.CLVar('')
- env['SCCSGETFLAGS'] = SCons.Util.CLVar('')
- env['SCCSCOM'] = '$SCCS $SCCSFLAGS get $SCCSGETFLAGS $TARGET'
-
-def exists(env):
- return env.Detect('sccs')
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/Subversion.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/Subversion.py
deleted file mode 100644
index 85470b1..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/Subversion.py
+++ /dev/null
@@ -1,71 +0,0 @@
-"""SCons.Tool.Subversion.py
-
-Tool-specific initialization for Subversion.
-
-There normally shouldn't be any need to import this module directly.
-It will usually be imported through the generic SCons.Tool.Tool()
-selection method.
-
-"""
-
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-__revision__ = "src/engine/SCons/Tool/Subversion.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-import os.path
-
-import SCons.Action
-import SCons.Builder
-import SCons.Util
-
-def generate(env):
- """Add a Builder factory function and construction variables for
- Subversion to an Environment."""
-
- def SubversionFactory(repos, module='', env=env):
- """ """
- # fail if repos is not an absolute path name?
- import SCons.Warnings as W
- W.warn(W.DeprecatedSourceCodeWarning, """The Subversion() factory is deprecated and there is no replacement.""")
- if module != '':
- module = os.path.join(module, '')
- act = SCons.Action.Action('$SVNCOM', '$SVNCOMSTR')
- return SCons.Builder.Builder(action = act,
- env = env,
- SVNREPOSITORY = repos,
- SVNMODULE = module)
-
- #setattr(env, 'Subversion', SubversionFactory)
- env.Subversion = SubversionFactory
-
- env['SVN'] = 'svn'
- env['SVNFLAGS'] = SCons.Util.CLVar('')
- env['SVNCOM'] = '$SVN $SVNFLAGS cat $SVNREPOSITORY/$SVNMODULE$TARGET > $TARGET'
-
-def exists(env):
- return env.Detect('svn')
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/__init__.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/__init__.py
deleted file mode 100644
index bb9729a..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/__init__.py
+++ /dev/null
@@ -1,845 +0,0 @@
-"""SCons.Tool
-
-SCons tool selection.
-
-This looks for modules that define a callable object that can modify
-a construction environment as appropriate for a given tool (or tool
-chain).
-
-Note that because this subsystem just *selects* a callable that can
-modify a construction environment, it's possible for people to define
-their own "tool specification" in an arbitrary callable function. No
-one needs to use or tie in to this subsystem in order to roll their own
-tool definition.
-"""
-
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-__revision__ = "src/engine/SCons/Tool/__init__.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-import imp
-import sys
-import re
-import os
-import shutil
-
-import SCons.Builder
-import SCons.Errors
-import SCons.Node.FS
-import SCons.Scanner
-import SCons.Scanner.C
-import SCons.Scanner.D
-import SCons.Scanner.LaTeX
-import SCons.Scanner.Prog
-
-DefaultToolpath=[]
-
-CScanner = SCons.Scanner.C.CScanner()
-DScanner = SCons.Scanner.D.DScanner()
-LaTeXScanner = SCons.Scanner.LaTeX.LaTeXScanner()
-PDFLaTeXScanner = SCons.Scanner.LaTeX.PDFLaTeXScanner()
-ProgramScanner = SCons.Scanner.Prog.ProgramScanner()
-SourceFileScanner = SCons.Scanner.Base({}, name='SourceFileScanner')
-
-CSuffixes = [".c", ".C", ".cxx", ".cpp", ".c++", ".cc",
- ".h", ".H", ".hxx", ".hpp", ".hh",
- ".F", ".fpp", ".FPP",
- ".m", ".mm",
- ".S", ".spp", ".SPP", ".sx"]
-
-DSuffixes = ['.d']
-
-IDLSuffixes = [".idl", ".IDL"]
-
-LaTeXSuffixes = [".tex", ".ltx", ".latex"]
-
-for suffix in CSuffixes:
- SourceFileScanner.add_scanner(suffix, CScanner)
-
-for suffix in DSuffixes:
- SourceFileScanner.add_scanner(suffix, DScanner)
-
-# FIXME: what should be done here? Two scanners scan the same extensions,
-# but look for different files, e.g., "picture.eps" vs. "picture.pdf".
-# The builders for DVI and PDF explicitly reference their scanners
-# I think that means this is not needed???
-for suffix in LaTeXSuffixes:
- SourceFileScanner.add_scanner(suffix, LaTeXScanner)
- SourceFileScanner.add_scanner(suffix, PDFLaTeXScanner)
-
-class Tool(object):
- def __init__(self, name, toolpath=[], **kw):
- self.name = name
- self.toolpath = toolpath + DefaultToolpath
- # remember these so we can merge them into the call
- self.init_kw = kw
-
- module = self._tool_module()
- self.generate = module.generate
- self.exists = module.exists
- if hasattr(module, 'options'):
- self.options = module.options
-
- def _tool_module(self):
- # TODO: Interchange zipimport with normal initilization for better error reporting
- oldpythonpath = sys.path
- sys.path = self.toolpath + sys.path
-
- try:
- try:
- file, path, desc = imp.find_module(self.name, self.toolpath)
- try:
- return imp.load_module(self.name, file, path, desc)
- finally:
- if file:
- file.close()
- except ImportError, e:
- if str(e)!="No module named %s"%self.name:
- raise SCons.Errors.EnvironmentError(e)
- try:
- import zipimport
- except ImportError:
- pass
- else:
- for aPath in self.toolpath:
- try:
- importer = zipimport.zipimporter(aPath)
- return importer.load_module(self.name)
- except ImportError, e:
- pass
- finally:
- sys.path = oldpythonpath
-
- full_name = 'SCons.Tool.' + self.name
- try:
- return sys.modules[full_name]
- except KeyError:
- try:
- smpath = sys.modules['SCons.Tool'].__path__
- try:
- file, path, desc = imp.find_module(self.name, smpath)
- module = imp.load_module(full_name, file, path, desc)
- setattr(SCons.Tool, self.name, module)
- if file:
- file.close()
- return module
- except ImportError, e:
- if str(e)!="No module named %s"%self.name:
- raise SCons.Errors.EnvironmentError(e)
- try:
- import zipimport
- importer = zipimport.zipimporter( sys.modules['SCons.Tool'].__path__[0] )
- module = importer.load_module(full_name)
- setattr(SCons.Tool, self.name, module)
- return module
- except ImportError, e:
- m = "No tool named '%s': %s" % (self.name, e)
- raise SCons.Errors.EnvironmentError(m)
- except ImportError, e:
- m = "No tool named '%s': %s" % (self.name, e)
- raise SCons.Errors.EnvironmentError(m)
-
- def __call__(self, env, *args, **kw):
- if self.init_kw is not None:
- # Merge call kws into init kws;
- # but don't bash self.init_kw.
- if kw is not None:
- call_kw = kw
- kw = self.init_kw.copy()
- kw.update(call_kw)
- else:
- kw = self.init_kw
- env.Append(TOOLS = [ self.name ])
- if hasattr(self, 'options'):
- import SCons.Variables
- if 'options' not in env:
- from SCons.Script import ARGUMENTS
- env['options']=SCons.Variables.Variables(args=ARGUMENTS)
- opts=env['options']
-
- self.options(opts)
- opts.Update(env)
-
- self.generate(env, *args, **kw)
-
- def __str__(self):
- return self.name
-
-##########################################################################
-# Create common executable program / library / object builders
-
-def createProgBuilder(env):
- """This is a utility function that creates the Program
- Builder in an Environment if it is not there already.
-
- If it is already there, we return the existing one.
- """
-
- try:
- program = env['BUILDERS']['Program']
- except KeyError:
- import SCons.Defaults
- program = SCons.Builder.Builder(action = SCons.Defaults.LinkAction,
- emitter = '$PROGEMITTER',
- prefix = '$PROGPREFIX',
- suffix = '$PROGSUFFIX',
- src_suffix = '$OBJSUFFIX',
- src_builder = 'Object',
- target_scanner = ProgramScanner)
- env['BUILDERS']['Program'] = program
-
- return program
-
-def createStaticLibBuilder(env):
- """This is a utility function that creates the StaticLibrary
- Builder in an Environment if it is not there already.
-
- If it is already there, we return the existing one.
- """
-
- try:
- static_lib = env['BUILDERS']['StaticLibrary']
- except KeyError:
- action_list = [ SCons.Action.Action("$ARCOM", "$ARCOMSTR") ]
- if env.Detect('ranlib'):
- ranlib_action = SCons.Action.Action("$RANLIBCOM", "$RANLIBCOMSTR")
- action_list.append(ranlib_action)
-
- static_lib = SCons.Builder.Builder(action = action_list,
- emitter = '$LIBEMITTER',
- prefix = '$LIBPREFIX',
- suffix = '$LIBSUFFIX',
- src_suffix = '$OBJSUFFIX',
- src_builder = 'StaticObject')
- env['BUILDERS']['StaticLibrary'] = static_lib
- env['BUILDERS']['Library'] = static_lib
-
- return static_lib
-
-def VersionShLibLinkNames(version, libname, env):
- """Generate names of symlinks to the versioned shared library"""
- Verbose = False
- platform = env.subst('$PLATFORM')
- shlib_suffix = env.subst('$SHLIBSUFFIX')
- shlink_flags = SCons.Util.CLVar(env.subst('$SHLINKFLAGS'))
-
- linknames = []
- if version.count(".") != 2:
- # We need a version string of the form x.y.z to proceed
- # Several changes need to be made to support versions like x.y
- raise ValueError
-
- if platform == 'darwin':
- # For libfoo.x.y.z.dylib, linknames libfoo.so
- suffix_re = re.escape('.' + version + shlib_suffix)
- linkname = re.sub(suffix_re, shlib_suffix, libname)
- if Verbose:
- print "VersionShLibLinkNames: linkname = ",linkname
- linknames.append(linkname)
- elif platform == 'posix' or platform == 'sunos':
- if sys.platform.startswith('openbsd'):
- # OpenBSD uses x.y shared library versioning numbering convention
- # and doesn't use symlinks to backwards-compatible libraries
- return []
- # For libfoo.so.x.y.z, linknames libfoo.so libfoo.so.x.y libfoo.so.x
- suffix_re = re.escape(shlib_suffix + '.' + version)
- # First linkname has no version number
- linkname = re.sub(suffix_re, shlib_suffix, libname)
- if Verbose:
- print "VersionShLibLinkNames: linkname = ",linkname
- linknames.append(linkname)
- versionparts = version.split('.')
- major_name = linkname + "." + versionparts[0]
- minor_name = major_name + "." + versionparts[1]
- #Only add link for major_name
- #for linkname in [major_name, minor_name]:
- for linkname in [major_name, ]:
- if Verbose:
- print "VersionShLibLinkNames: linkname ",linkname, ", target ",libname
- linknames.append(linkname)
- # note: no Windows case here (win32 or cygwin);
- # MSVC doesn't support this type of versioned shared libs.
- # (could probably do something for MinGW though)
- return linknames
-
-def VersionedSharedLibrary(target = None, source= None, env=None):
- """Build a shared library. If the environment has SHLIBVERSION
-defined make a versioned shared library and create the appropriate
-symlinks for the platform we are on"""
- Verbose = False
- try:
- version = env.subst('$SHLIBVERSION')
- except KeyError:
- version = None
-
- # libname includes the version number if one was given
- libname = getattr(target[0].attributes, 'shlibname', target[0].name)
- platform = env.subst('$PLATFORM')
- shlib_suffix = env.subst('$SHLIBSUFFIX')
- shlink_flags = SCons.Util.CLVar(env.subst('$SHLINKFLAGS'))
- if Verbose:
- print "VersionShLib: libname = ",libname
- print "VersionShLib: platform = ",platform
- print "VersionShLib: shlib_suffix = ",shlib_suffix
- print "VersionShLib: target = ",str(target[0])
-
- if version:
- # set the shared library link flags
- if platform == 'posix':
- shlink_flags += [ '-Wl,-Bsymbolic' ]
- # OpenBSD doesn't usually use SONAME for libraries
- if not sys.platform.startswith('openbsd'):
- # continue setup of shlink flags for all other POSIX systems
- suffix_re = re.escape(shlib_suffix + '.' + version)
- (major, age, revision) = version.split(".")
- # soname will have only the major version number in it
- soname = re.sub(suffix_re, shlib_suffix, libname) + '.' + major
- shlink_flags += [ '-Wl,-soname=%s' % soname ]
- if Verbose:
- print " soname ",soname,", shlink_flags ",shlink_flags
- elif platform == 'sunos':
- suffix_re = re.escape(shlib_suffix + '.' + version)
- (major, age, revision) = version.split(".")
- soname = re.sub(suffix_re, shlib_suffix, libname) + '.' + major
- shlink_flags += [ '-h', soname ]
- elif platform == 'cygwin':
- shlink_flags += [ '-Wl,-Bsymbolic',
- '-Wl,--out-implib,${TARGET.base}.a' ]
- elif platform == 'darwin':
- shlink_flags += [ '-current_version', '%s' % version,
- '-compatibility_version', '%s' % version,
- '-undefined', 'dynamic_lookup' ]
- if Verbose:
- print "VersionShLib: shlink_flags = ",shlink_flags
- envlink = env.Clone()
- envlink['SHLINKFLAGS'] = shlink_flags
- else:
- envlink = env
-
- result = SCons.Defaults.ShLinkAction(target, source, envlink)
-
- if version:
- # here we need the full pathname so the links end up in the right directory
- libname = getattr(target[0].attributes, 'shlibpath', target[0].get_internal_path())
- if Verbose:
- print "VerShLib: target lib is = ", libname
- print "VerShLib: name is = ", target[0].name
- print "VerShLib: dir is = ", target[0].dir.path
- linknames = VersionShLibLinkNames(version, libname, env)
- if Verbose:
- print "VerShLib: linknames ",linknames
- # Here we just need the file name w/o path as the target of the link
- lib_ver = getattr(target[0].attributes, 'shlibname', target[0].name)
- # make symlink of adjacent names in linknames
- for count in range(len(linknames)):
- linkname = linknames[count]
- if count > 0:
- try:
- os.remove(lastlinkname)
- except:
- pass
- os.symlink(os.path.basename(linkname),lastlinkname)
- if Verbose:
- print "VerShLib: made sym link of %s -> %s" % (lastlinkname,linkname)
- lastlinkname = linkname
- # finish chain of sym links with link to the actual library
- if len(linknames)>0:
- try:
- os.remove(lastlinkname)
- except:
- pass
- os.symlink(lib_ver,lastlinkname)
- if Verbose:
- print "VerShLib: made sym link of %s -> %s" % (linkname, lib_ver)
- return result
-
-# Fix http://scons.tigris.org/issues/show_bug.cgi?id=2903 :
-# Ensure we still depend on SCons.Defaults.ShLinkAction command line which is $SHLINKCOM.
-# This was tricky because we don't want changing LIBPATH to cause a rebuild, but
-# changing other link args should. LIBPATH has $( ... $) around it but until this
-# fix, when the varlist was added to the build sig those ignored parts weren't getting
-# ignored.
-ShLibAction = SCons.Action.Action(VersionedSharedLibrary, None, varlist=['SHLINKCOM'])
-
-def createSharedLibBuilder(env):
- """This is a utility function that creates the SharedLibrary
- Builder in an Environment if it is not there already.
-
- If it is already there, we return the existing one.
- """
-
- try:
- shared_lib = env['BUILDERS']['SharedLibrary']
- except KeyError:
- import SCons.Defaults
- action_list = [ SCons.Defaults.SharedCheck,
- ShLibAction ]
- shared_lib = SCons.Builder.Builder(action = action_list,
- emitter = "$SHLIBEMITTER",
- prefix = '$SHLIBPREFIX',
- suffix = '$SHLIBSUFFIX',
- target_scanner = ProgramScanner,
- src_suffix = '$SHOBJSUFFIX',
- src_builder = 'SharedObject')
- env['BUILDERS']['SharedLibrary'] = shared_lib
-
- return shared_lib
-
-def createLoadableModuleBuilder(env):
- """This is a utility function that creates the LoadableModule
- Builder in an Environment if it is not there already.
-
- If it is already there, we return the existing one.
- """
-
- try:
- ld_module = env['BUILDERS']['LoadableModule']
- except KeyError:
- import SCons.Defaults
- action_list = [ SCons.Defaults.SharedCheck,
- SCons.Defaults.LdModuleLinkAction ]
- ld_module = SCons.Builder.Builder(action = action_list,
- emitter = "$LDMODULEEMITTER",
- prefix = '$LDMODULEPREFIX',
- suffix = '$LDMODULESUFFIX',
- target_scanner = ProgramScanner,
- src_suffix = '$SHOBJSUFFIX',
- src_builder = 'SharedObject')
- env['BUILDERS']['LoadableModule'] = ld_module
-
- return ld_module
-
-def createObjBuilders(env):
- """This is a utility function that creates the StaticObject
- and SharedObject Builders in an Environment if they
- are not there already.
-
- If they are there already, we return the existing ones.
-
- This is a separate function because soooo many Tools
- use this functionality.
-
- The return is a 2-tuple of (StaticObject, SharedObject)
- """
-
-
- try:
- static_obj = env['BUILDERS']['StaticObject']
- except KeyError:
- static_obj = SCons.Builder.Builder(action = {},
- emitter = {},
- prefix = '$OBJPREFIX',
- suffix = '$OBJSUFFIX',
- src_builder = ['CFile', 'CXXFile'],
- source_scanner = SourceFileScanner,
- single_source = 1)
- env['BUILDERS']['StaticObject'] = static_obj
- env['BUILDERS']['Object'] = static_obj
-
- try:
- shared_obj = env['BUILDERS']['SharedObject']
- except KeyError:
- shared_obj = SCons.Builder.Builder(action = {},
- emitter = {},
- prefix = '$SHOBJPREFIX',
- suffix = '$SHOBJSUFFIX',
- src_builder = ['CFile', 'CXXFile'],
- source_scanner = SourceFileScanner,
- single_source = 1)
- env['BUILDERS']['SharedObject'] = shared_obj
-
- return (static_obj, shared_obj)
-
-def createCFileBuilders(env):
- """This is a utility function that creates the CFile/CXXFile
- Builders in an Environment if they
- are not there already.
-
- If they are there already, we return the existing ones.
-
- This is a separate function because soooo many Tools
- use this functionality.
-
- The return is a 2-tuple of (CFile, CXXFile)
- """
-
- try:
- c_file = env['BUILDERS']['CFile']
- except KeyError:
- c_file = SCons.Builder.Builder(action = {},
- emitter = {},
- suffix = {None:'$CFILESUFFIX'})
- env['BUILDERS']['CFile'] = c_file
-
- env.SetDefault(CFILESUFFIX = '.c')
-
- try:
- cxx_file = env['BUILDERS']['CXXFile']
- except KeyError:
- cxx_file = SCons.Builder.Builder(action = {},
- emitter = {},
- suffix = {None:'$CXXFILESUFFIX'})
- env['BUILDERS']['CXXFile'] = cxx_file
- env.SetDefault(CXXFILESUFFIX = '.cc')
-
- return (c_file, cxx_file)
-
-##########################################################################
-# Create common Java builders
-
-def CreateJarBuilder(env):
- try:
- java_jar = env['BUILDERS']['Jar']
- except KeyError:
- fs = SCons.Node.FS.get_default_fs()
- jar_com = SCons.Action.Action('$JARCOM', '$JARCOMSTR')
- java_jar = SCons.Builder.Builder(action = jar_com,
- suffix = '$JARSUFFIX',
- src_suffix = '$JAVACLASSSUFIX',
- src_builder = 'JavaClassFile',
- source_factory = fs.Entry)
- env['BUILDERS']['Jar'] = java_jar
- return java_jar
-
-def CreateJavaHBuilder(env):
- try:
- java_javah = env['BUILDERS']['JavaH']
- except KeyError:
- fs = SCons.Node.FS.get_default_fs()
- java_javah_com = SCons.Action.Action('$JAVAHCOM', '$JAVAHCOMSTR')
- java_javah = SCons.Builder.Builder(action = java_javah_com,
- src_suffix = '$JAVACLASSSUFFIX',
- target_factory = fs.Entry,
- source_factory = fs.File,
- src_builder = 'JavaClassFile')
- env['BUILDERS']['JavaH'] = java_javah
- return java_javah
-
-def CreateJavaClassFileBuilder(env):
- try:
- java_class_file = env['BUILDERS']['JavaClassFile']
- except KeyError:
- fs = SCons.Node.FS.get_default_fs()
- javac_com = SCons.Action.Action('$JAVACCOM', '$JAVACCOMSTR')
- java_class_file = SCons.Builder.Builder(action = javac_com,
- emitter = {},
- #suffix = '$JAVACLASSSUFFIX',
- src_suffix = '$JAVASUFFIX',
- src_builder = ['JavaFile'],
- target_factory = fs.Entry,
- source_factory = fs.File)
- env['BUILDERS']['JavaClassFile'] = java_class_file
- return java_class_file
-
-def CreateJavaClassDirBuilder(env):
- try:
- java_class_dir = env['BUILDERS']['JavaClassDir']
- except KeyError:
- fs = SCons.Node.FS.get_default_fs()
- javac_com = SCons.Action.Action('$JAVACCOM', '$JAVACCOMSTR')
- java_class_dir = SCons.Builder.Builder(action = javac_com,
- emitter = {},
- target_factory = fs.Dir,
- source_factory = fs.Dir)
- env['BUILDERS']['JavaClassDir'] = java_class_dir
- return java_class_dir
-
-def CreateJavaFileBuilder(env):
- try:
- java_file = env['BUILDERS']['JavaFile']
- except KeyError:
- java_file = SCons.Builder.Builder(action = {},
- emitter = {},
- suffix = {None:'$JAVASUFFIX'})
- env['BUILDERS']['JavaFile'] = java_file
- env['JAVASUFFIX'] = '.java'
- return java_file
-
-class ToolInitializerMethod(object):
- """
- This is added to a construction environment in place of a
- method(s) normally called for a Builder (env.Object, env.StaticObject,
- etc.). When called, it has its associated ToolInitializer
- object search the specified list of tools and apply the first
- one that exists to the construction environment. It then calls
- whatever builder was (presumably) added to the construction
- environment in place of this particular instance.
- """
- def __init__(self, name, initializer):
- """
- Note: we store the tool name as __name__ so it can be used by
- the class that attaches this to a construction environment.
- """
- self.__name__ = name
- self.initializer = initializer
-
- def get_builder(self, env):
- """
- Returns the appropriate real Builder for this method name
- after having the associated ToolInitializer object apply
- the appropriate Tool module.
- """
- builder = getattr(env, self.__name__)
-
- self.initializer.apply_tools(env)
-
- builder = getattr(env, self.__name__)
- if builder is self:
- # There was no Builder added, which means no valid Tool
- # for this name was found (or possibly there's a mismatch
- # between the name we were called by and the Builder name
- # added by the Tool module).
- return None
-
- self.initializer.remove_methods(env)
-
- return builder
-
- def __call__(self, env, *args, **kw):
- """
- """
- builder = self.get_builder(env)
- if builder is None:
- return [], []
- return builder(*args, **kw)
-
-class ToolInitializer(object):
- """
- A class for delayed initialization of Tools modules.
-
- Instances of this class associate a list of Tool modules with
- a list of Builder method names that will be added by those Tool
- modules. As part of instantiating this object for a particular
- construction environment, we also add the appropriate
- ToolInitializerMethod objects for the various Builder methods
- that we want to use to delay Tool searches until necessary.
- """
- def __init__(self, env, tools, names):
- if not SCons.Util.is_List(tools):
- tools = [tools]
- if not SCons.Util.is_List(names):
- names = [names]
- self.env = env
- self.tools = tools
- self.names = names
- self.methods = {}
- for name in names:
- method = ToolInitializerMethod(name, self)
- self.methods[name] = method
- env.AddMethod(method)
-
- def remove_methods(self, env):
- """
- Removes the methods that were added by the tool initialization
- so we no longer copy and re-bind them when the construction
- environment gets cloned.
- """
- for method in self.methods.values():
- env.RemoveMethod(method)
-
- def apply_tools(self, env):
- """
- Searches the list of associated Tool modules for one that
- exists, and applies that to the construction environment.
- """
- for t in self.tools:
- tool = SCons.Tool.Tool(t)
- if tool.exists(env):
- env.Tool(tool)
- return
-
- # If we fall through here, there was no tool module found.
- # This is where we can put an informative error message
- # about the inability to find the tool. We'll start doing
- # this as we cut over more pre-defined Builder+Tools to use
- # the ToolInitializer class.
-
-def Initializers(env):
- ToolInitializer(env, ['install'], ['_InternalInstall', '_InternalInstallAs', '_InternalInstallVersionedLib'])
- def Install(self, *args, **kw):
- return self._InternalInstall(*args, **kw)
- def InstallAs(self, *args, **kw):
- return self._InternalInstallAs(*args, **kw)
- def InstallVersionedLib(self, *args, **kw):
- return self._InternalInstallVersionedLib(*args, **kw)
- env.AddMethod(Install)
- env.AddMethod(InstallAs)
- env.AddMethod(InstallVersionedLib)
-
-def FindTool(tools, env):
- for tool in tools:
- t = Tool(tool)
- if t.exists(env):
- return tool
- return None
-
-def FindAllTools(tools, env):
- def ToolExists(tool, env=env):
- return Tool(tool).exists(env)
- return list(filter (ToolExists, tools))
-
-def tool_list(platform, env):
-
- other_plat_tools=[]
- # XXX this logic about what tool to prefer on which platform
- # should be moved into either the platform files or
- # the tool files themselves.
- # The search orders here are described in the man page. If you
- # change these search orders, update the man page as well.
- if str(platform) == 'win32':
- "prefer Microsoft tools on Windows"
- linkers = ['mslink', 'gnulink', 'ilink', 'linkloc', 'ilink32' ]
- c_compilers = ['msvc', 'mingw', 'gcc', 'intelc', 'icl', 'icc', 'cc', 'bcc32' ]
- cxx_compilers = ['msvc', 'intelc', 'icc', 'g++', 'c++', 'bcc32' ]
- assemblers = ['masm', 'nasm', 'gas', '386asm' ]
- fortran_compilers = ['gfortran', 'g77', 'ifl', 'cvf', 'f95', 'f90', 'fortran']
- ars = ['mslib', 'ar', 'tlib']
- other_plat_tools = ['msvs', 'midl']
- elif str(platform) == 'os2':
- "prefer IBM tools on OS/2"
- linkers = ['ilink', 'gnulink', ]#'mslink']
- c_compilers = ['icc', 'gcc',]# 'msvc', 'cc']
- cxx_compilers = ['icc', 'g++',]# 'msvc', 'c++']
- assemblers = ['nasm',]# 'masm', 'gas']
- fortran_compilers = ['ifl', 'g77']
- ars = ['ar',]# 'mslib']
- elif str(platform) == 'irix':
- "prefer MIPSPro on IRIX"
- linkers = ['sgilink', 'gnulink']
- c_compilers = ['sgicc', 'gcc', 'cc']
- cxx_compilers = ['sgic++', 'g++', 'c++']
- assemblers = ['as', 'gas']
- fortran_compilers = ['f95', 'f90', 'f77', 'g77', 'fortran']
- ars = ['sgiar']
- elif str(platform) == 'sunos':
- "prefer Forte tools on SunOS"
- linkers = ['sunlink', 'gnulink']
- c_compilers = ['suncc', 'gcc', 'cc']
- cxx_compilers = ['sunc++', 'g++', 'c++']
- assemblers = ['as', 'gas']
- fortran_compilers = ['sunf95', 'sunf90', 'sunf77', 'f95', 'f90', 'f77',
- 'gfortran', 'g77', 'fortran']
- ars = ['sunar']
- elif str(platform) == 'hpux':
- "prefer aCC tools on HP-UX"
- linkers = ['hplink', 'gnulink']
- c_compilers = ['hpcc', 'gcc', 'cc']
- cxx_compilers = ['hpc++', 'g++', 'c++']
- assemblers = ['as', 'gas']
- fortran_compilers = ['f95', 'f90', 'f77', 'g77', 'fortran']
- ars = ['ar']
- elif str(platform) == 'aix':
- "prefer AIX Visual Age tools on AIX"
- linkers = ['aixlink', 'gnulink']
- c_compilers = ['aixcc', 'gcc', 'cc']
- cxx_compilers = ['aixc++', 'g++', 'c++']
- assemblers = ['as', 'gas']
- fortran_compilers = ['f95', 'f90', 'aixf77', 'g77', 'fortran']
- ars = ['ar']
- elif str(platform) == 'darwin':
- "prefer GNU tools on Mac OS X, except for some linkers and IBM tools"
- linkers = ['applelink', 'gnulink']
- c_compilers = ['gcc', 'cc']
- cxx_compilers = ['g++', 'c++']
- assemblers = ['as']
- fortran_compilers = ['gfortran', 'f95', 'f90', 'g77']
- ars = ['ar']
- elif str(platform) == 'cygwin':
- "prefer GNU tools on Cygwin, except for a platform-specific linker"
- linkers = ['cyglink', 'mslink', 'ilink']
- c_compilers = ['gcc', 'msvc', 'intelc', 'icc', 'cc']
- cxx_compilers = ['g++', 'msvc', 'intelc', 'icc', 'c++']
- assemblers = ['gas', 'nasm', 'masm']
- fortran_compilers = ['gfortran', 'g77', 'ifort', 'ifl', 'f95', 'f90', 'f77']
- ars = ['ar', 'mslib']
- else:
- "prefer GNU tools on all other platforms"
- linkers = ['gnulink', 'mslink', 'ilink']
- c_compilers = ['gcc', 'msvc', 'intelc', 'icc', 'cc']
- cxx_compilers = ['g++', 'msvc', 'intelc', 'icc', 'c++']
- assemblers = ['gas', 'nasm', 'masm']
- fortran_compilers = ['gfortran', 'g77', 'ifort', 'ifl', 'f95', 'f90', 'f77']
- ars = ['ar', 'mslib']
-
- if not str(platform) == 'win32':
- other_plat_tools += ['m4', 'rpm']
-
- c_compiler = FindTool(c_compilers, env) or c_compilers[0]
-
- # XXX this logic about what tool provides what should somehow be
- # moved into the tool files themselves.
- if c_compiler and c_compiler == 'mingw':
- # MinGW contains a linker, C compiler, C++ compiler,
- # Fortran compiler, archiver and assembler:
- cxx_compiler = None
- linker = None
- assembler = None
- fortran_compiler = None
- ar = None
- else:
- # Don't use g++ if the C compiler has built-in C++ support:
- if c_compiler in ('msvc', 'intelc', 'icc'):
- cxx_compiler = None
- else:
- cxx_compiler = FindTool(cxx_compilers, env) or cxx_compilers[0]
- linker = FindTool(linkers, env) or linkers[0]
- assembler = FindTool(assemblers, env) or assemblers[0]
- fortran_compiler = FindTool(fortran_compilers, env) or fortran_compilers[0]
- ar = FindTool(ars, env) or ars[0]
-
- d_compilers = ['dmd', 'gdc', 'ldc']
- d_compiler = FindTool(d_compilers, env) or d_compilers[0]
-
- other_tools = FindAllTools(other_plat_tools + [
- #TODO: merge 'install' into 'filesystem' and
- # make 'filesystem' the default
- 'filesystem',
- 'wix', #'midl', 'msvs',
- # Parser generators
- 'lex', 'yacc',
- # Foreign function interface
- 'rpcgen', 'swig',
- # Java
- 'jar', 'javac', 'javah', 'rmic',
- # TeX
- 'dvipdf', 'dvips', 'gs',
- 'tex', 'latex', 'pdflatex', 'pdftex',
- # Archivers
- 'tar', 'zip',
- # SourceCode factories
- 'BitKeeper', 'CVS', 'Perforce',
- 'RCS', 'SCCS', # 'Subversion',
- ], env)
-
- tools = ([linker, c_compiler, cxx_compiler,
- fortran_compiler, assembler, ar, d_compiler]
- + other_tools)
-
- return [x for x in tools if x]
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
-
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/aixc++.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/aixc++.py
deleted file mode 100644
index 864fcdf..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/aixc++.py
+++ /dev/null
@@ -1,75 +0,0 @@
-"""SCons.Tool.aixc++
-
-Tool-specific initialization for IBM xlC / Visual Age C++ compiler.
-
-There normally shouldn't be any need to import this module directly.
-It will usually be imported through the generic SCons.Tool.Tool()
-selection method.
-
-"""
-
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-
-__revision__ = "src/engine/SCons/Tool/aixc++.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-import os.path
-
-import SCons.Platform.aix
-
-cplusplus = __import__('c++', globals(), locals(), [])
-
-packages = ['vacpp.cmp.core', 'vacpp.cmp.batch', 'vacpp.cmp.C', 'ibmcxx.cmp']
-
-def get_xlc(env):
- xlc = env.get('CXX', 'xlC')
- return SCons.Platform.aix.get_xlc(env, xlc, packages)
-
-def generate(env):
- """Add Builders and construction variables for xlC / Visual Age
- suite to an Environment."""
- path, _cxx, version = get_xlc(env)
- if path and _cxx:
- _cxx = os.path.join(path, _cxx)
-
- if 'CXX' not in env:
- env['CXX'] = _cxx
-
- cplusplus.generate(env)
-
- if version:
- env['CXXVERSION'] = version
-
-def exists(env):
- path, _cxx, version = get_xlc(env)
- if path and _cxx:
- xlc = os.path.join(path, _cxx)
- if os.path.exists(xlc):
- return xlc
- return None
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/aixcc.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/aixcc.py
deleted file mode 100644
index 02e0649..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/aixcc.py
+++ /dev/null
@@ -1,74 +0,0 @@
-"""SCons.Tool.aixcc
-
-Tool-specific initialization for IBM xlc / Visual Age C compiler.
-
-There normally shouldn't be any need to import this module directly.
-It will usually be imported through the generic SCons.Tool.Tool()
-selection method.
-"""
-
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-
-__revision__ = "src/engine/SCons/Tool/aixcc.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-import os.path
-
-import SCons.Platform.aix
-
-import cc
-
-packages = ['vac.C', 'ibmcxx.cmp']
-
-def get_xlc(env):
- xlc = env.get('CC', 'xlc')
- return SCons.Platform.aix.get_xlc(env, xlc, packages)
-
-def generate(env):
- """Add Builders and construction variables for xlc / Visual Age
- suite to an Environment."""
- path, _cc, version = get_xlc(env)
- if path and _cc:
- _cc = os.path.join(path, _cc)
-
- if 'CC' not in env:
- env['CC'] = _cc
-
- cc.generate(env)
-
- if version:
- env['CCVERSION'] = version
-
-def exists(env):
- path, _cc, version = get_xlc(env)
- if path and _cc:
- xlc = os.path.join(path, _cc)
- if os.path.exists(xlc):
- return xlc
- return None
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/aixf77.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/aixf77.py
deleted file mode 100644
index 5327cf7..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/aixf77.py
+++ /dev/null
@@ -1,80 +0,0 @@
-"""engine.SCons.Tool.aixf77
-
-Tool-specific initialization for IBM Visual Age f77 Fortran compiler.
-
-There normally shouldn't be any need to import this module directly.
-It will usually be imported through the generic SCons.Tool.Tool()
-selection method.
-"""
-
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-
-__revision__ = "src/engine/SCons/Tool/aixf77.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-import os.path
-
-#import SCons.Platform.aix
-
-import f77
-
-# It would be good to look for the AIX F77 package the same way we're now
-# looking for the C and C++ packages. This should be as easy as supplying
-# the correct package names in the following list and uncommenting the
-# SCons.Platform.aix_get_xlc() call the in the function below.
-packages = []
-
-def get_xlf77(env):
- xlf77 = env.get('F77', 'xlf77')
- xlf77_r = env.get('SHF77', 'xlf77_r')
- #return SCons.Platform.aix.get_xlc(env, xlf77, xlf77_r, packages)
- return (None, xlf77, xlf77_r, None)
-
-def generate(env):
- """
- Add Builders and construction variables for the Visual Age FORTRAN
- compiler to an Environment.
- """
- path, _f77, _shf77, version = get_xlf77(env)
- if path:
- _f77 = os.path.join(path, _f77)
- _shf77 = os.path.join(path, _shf77)
-
- f77.generate(env)
-
- env['F77'] = _f77
- env['SHF77'] = _shf77
-
-def exists(env):
- path, _f77, _shf77, version = get_xlf77(env)
- if path and _f77:
- xlf77 = os.path.join(path, _f77)
- if os.path.exists(xlf77):
- return xlf77
- return None
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/aixlink.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/aixlink.py
deleted file mode 100644
index 7ad9cc6..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/aixlink.py
+++ /dev/null
@@ -1,77 +0,0 @@
-"""SCons.Tool.aixlink
-
-Tool-specific initialization for the IBM Visual Age linker.
-
-There normally shouldn't be any need to import this module directly.
-It will usually be imported through the generic SCons.Tool.Tool()
-selection method.
-"""
-
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-
-__revision__ = "src/engine/SCons/Tool/aixlink.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-import os
-import os.path
-
-import SCons.Util
-
-import link
-
-cplusplus = __import__('c++', globals(), locals(), [])
-
-def smart_linkflags(source, target, env, for_signature):
- if cplusplus.iscplusplus(source):
- build_dir = env.subst('$BUILDDIR', target=target, source=source)
- if build_dir:
- return '-qtempinc=' + os.path.join(build_dir, 'tempinc')
- return ''
-
-def generate(env):
- """
- Add Builders and construction variables for Visual Age linker to
- an Environment.
- """
- link.generate(env)
-
- env['SMARTLINKFLAGS'] = smart_linkflags
- env['LINKFLAGS'] = SCons.Util.CLVar('$SMARTLINKFLAGS')
- env['SHLINKFLAGS'] = SCons.Util.CLVar('$LINKFLAGS -qmkshrobj -qsuppress=1501-218')
- env['SHLIBSUFFIX'] = '.a'
-
-def exists(env):
- # TODO: sync with link.smart_link() to choose a linker
- linkers = { 'CXX': ['aixc++'], 'CC': ['aixcc'] }
- alltools = []
- for langvar, linktools in linkers.items():
- if langvar in env: # use CC over CXX when user specified CC but not CXX
- return SCons.Tool.FindTool(linktools, env)
- alltools.extend(linktools)
- return SCons.Tool.FindTool(alltools, env)
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/applelink.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/applelink.py
deleted file mode 100644
index 9ef1b75..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/applelink.py
+++ /dev/null
@@ -1,71 +0,0 @@
-"""SCons.Tool.applelink
-
-Tool-specific initialization for the Apple gnu-like linker.
-
-There normally shouldn't be any need to import this module directly.
-It will usually be imported through the generic SCons.Tool.Tool()
-selection method.
-
-"""
-
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-
-__revision__ = "src/engine/SCons/Tool/applelink.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-import SCons.Util
-
-# Even though the Mac is based on the GNU toolchain, it doesn't understand
-# the -rpath option, so we use the "link" tool instead of "gnulink".
-import link
-
-def generate(env):
- """Add Builders and construction variables for applelink to an
- Environment."""
- link.generate(env)
-
- env['FRAMEWORKPATHPREFIX'] = '-F'
- env['_FRAMEWORKPATH'] = '${_concat(FRAMEWORKPATHPREFIX, FRAMEWORKPATH, "", __env__)}'
- env['_FRAMEWORKS'] = '${_concat("-framework ", FRAMEWORKS, "", __env__)}'
- env['LINKCOM'] = env['LINKCOM'] + ' $_FRAMEWORKPATH $_FRAMEWORKS $FRAMEWORKSFLAGS'
- env['SHLINKFLAGS'] = SCons.Util.CLVar('$LINKFLAGS -dynamiclib')
- env['SHLINKCOM'] = env['SHLINKCOM'] + ' $_FRAMEWORKPATH $_FRAMEWORKS $FRAMEWORKSFLAGS'
-
- # override the default for loadable modules, which are different
- # on OS X than dynamic shared libs. echoing what XCode does for
- # pre/suffixes:
- env['LDMODULEPREFIX'] = ''
- env['LDMODULESUFFIX'] = ''
- env['LDMODULEFLAGS'] = SCons.Util.CLVar('$LINKFLAGS -bundle')
- env['LDMODULECOM'] = '$LDMODULE -o ${TARGET} $LDMODULEFLAGS $SOURCES $_LIBDIRFLAGS $_LIBFLAGS $_FRAMEWORKPATH $_FRAMEWORKS $FRAMEWORKSFLAGS'
-
-
-
-def exists(env):
- return env['PLATFORM'] == 'darwin'
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/ar.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/ar.py
deleted file mode 100644
index 2d7f7b9..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/ar.py
+++ /dev/null
@@ -1,63 +0,0 @@
-"""SCons.Tool.ar
-
-Tool-specific initialization for ar (library archive).
-
-There normally shouldn't be any need to import this module directly.
-It will usually be imported through the generic SCons.Tool.Tool()
-selection method.
-
-"""
-
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-
-__revision__ = "src/engine/SCons/Tool/ar.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-import SCons.Defaults
-import SCons.Tool
-import SCons.Util
-
-
-def generate(env):
- """Add Builders and construction variables for ar to an Environment."""
- SCons.Tool.createStaticLibBuilder(env)
-
- env['AR'] = 'ar'
- env['ARFLAGS'] = SCons.Util.CLVar('rc')
- env['ARCOM'] = '$AR $ARFLAGS $TARGET $SOURCES'
- env['LIBPREFIX'] = 'lib'
- env['LIBSUFFIX'] = '.a'
-
- if env.Detect('ranlib'):
- env['RANLIB'] = 'ranlib'
- env['RANLIBFLAGS'] = SCons.Util.CLVar('')
- env['RANLIBCOM'] = '$RANLIB $RANLIBFLAGS $TARGET'
-
-def exists(env):
- return env.Detect('ar')
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/as.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/as.py
deleted file mode 100644
index 6c7304f..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/as.py
+++ /dev/null
@@ -1,78 +0,0 @@
-"""SCons.Tool.as
-
-Tool-specific initialization for as, the generic Posix assembler.
-
-There normally shouldn't be any need to import this module directly.
-It will usually be imported through the generic SCons.Tool.Tool()
-selection method.
-
-"""
-
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-
-__revision__ = "src/engine/SCons/Tool/as.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-import SCons.Defaults
-import SCons.Tool
-import SCons.Util
-
-assemblers = ['as']
-
-ASSuffixes = ['.s', '.asm', '.ASM']
-ASPPSuffixes = ['.spp', '.SPP', '.sx']
-if SCons.Util.case_sensitive_suffixes('.s', '.S'):
- ASPPSuffixes.extend(['.S'])
-else:
- ASSuffixes.extend(['.S'])
-
-def generate(env):
- """Add Builders and construction variables for as to an Environment."""
- static_obj, shared_obj = SCons.Tool.createObjBuilders(env)
-
- for suffix in ASSuffixes:
- static_obj.add_action(suffix, SCons.Defaults.ASAction)
- shared_obj.add_action(suffix, SCons.Defaults.ASAction)
- static_obj.add_emitter(suffix, SCons.Defaults.StaticObjectEmitter)
- shared_obj.add_emitter(suffix, SCons.Defaults.SharedObjectEmitter)
-
- for suffix in ASPPSuffixes:
- static_obj.add_action(suffix, SCons.Defaults.ASPPAction)
- shared_obj.add_action(suffix, SCons.Defaults.ASPPAction)
- static_obj.add_emitter(suffix, SCons.Defaults.StaticObjectEmitter)
- shared_obj.add_emitter(suffix, SCons.Defaults.SharedObjectEmitter)
-
- env['AS'] = env.Detect(assemblers) or 'as'
- env['ASFLAGS'] = SCons.Util.CLVar('')
- env['ASCOM'] = '$AS $ASFLAGS -o $TARGET $SOURCES'
- env['ASPPFLAGS'] = '$ASFLAGS'
- env['ASPPCOM'] = '$CC $ASPPFLAGS $CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS -c -o $TARGET $SOURCES'
-
-def exists(env):
- return env.Detect(assemblers)
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/bcc32.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/bcc32.py
deleted file mode 100644
index a8295a3..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/bcc32.py
+++ /dev/null
@@ -1,81 +0,0 @@
-"""SCons.Tool.bcc32
-
-XXX
-
-"""
-
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-
-__revision__ = "src/engine/SCons/Tool/bcc32.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-import os
-import os.path
-
-import SCons.Defaults
-import SCons.Tool
-import SCons.Util
-
-def findIt(program, env):
- # First search in the SCons path and then the OS path:
- borwin = env.WhereIs(program) or SCons.Util.WhereIs(program)
- if borwin:
- dir = os.path.dirname(borwin)
- env.PrependENVPath('PATH', dir)
- return borwin
-
-def generate(env):
- findIt('bcc32', env)
- """Add Builders and construction variables for bcc to an
- Environment."""
- static_obj, shared_obj = SCons.Tool.createObjBuilders(env)
- for suffix in ['.c', '.cpp']:
- static_obj.add_action(suffix, SCons.Defaults.CAction)
- shared_obj.add_action(suffix, SCons.Defaults.ShCAction)
- static_obj.add_emitter(suffix, SCons.Defaults.StaticObjectEmitter)
- shared_obj.add_emitter(suffix, SCons.Defaults.SharedObjectEmitter)
-
- env['CC'] = 'bcc32'
- env['CCFLAGS'] = SCons.Util.CLVar('')
- env['CFLAGS'] = SCons.Util.CLVar('')
- env['CCCOM'] = '$CC -q $CFLAGS $CCFLAGS $CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS -c -o$TARGET $SOURCES'
- env['SHCC'] = '$CC'
- env['SHCCFLAGS'] = SCons.Util.CLVar('$CCFLAGS')
- env['SHCFLAGS'] = SCons.Util.CLVar('$CFLAGS')
- env['SHCCCOM'] = '$SHCC -WD $SHCFLAGS $SHCCFLAGS $CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS -c -o$TARGET $SOURCES'
- env['CPPDEFPREFIX'] = '-D'
- env['CPPDEFSUFFIX'] = ''
- env['INCPREFIX'] = '-I'
- env['INCSUFFIX'] = ''
- env['SHOBJSUFFIX'] = '.dll'
- env['STATIC_AND_SHARED_OBJECTS_ARE_THE_SAME'] = 0
- env['CFILESUFFIX'] = '.cpp'
-
-def exists(env):
- return findIt('bcc32', env)
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/c++.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/c++.py
deleted file mode 100644
index 580bf9c..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/c++.py
+++ /dev/null
@@ -1,100 +0,0 @@
-"""SCons.Tool.c++
-
-Tool-specific initialization for generic Posix C++ compilers.
-
-There normally shouldn't be any need to import this module directly.
-It will usually be imported through the generic SCons.Tool.Tool()
-selection method.
-"""
-
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-
-__revision__ = "src/engine/SCons/Tool/c++.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-import os.path
-
-import SCons.Tool
-import SCons.Defaults
-import SCons.Util
-
-compilers = ['CC', 'c++']
-
-CXXSuffixes = ['.cpp', '.cc', '.cxx', '.c++', '.C++', '.mm']
-if SCons.Util.case_sensitive_suffixes('.c', '.C'):
- CXXSuffixes.append('.C')
-
-def iscplusplus(source):
- if not source:
- # Source might be None for unusual cases like SConf.
- return 0
- for s in source:
- if s.sources:
- ext = os.path.splitext(str(s.sources[0]))[1]
- if ext in CXXSuffixes:
- return 1
- return 0
-
-def generate(env):
- """
- Add Builders and construction variables for Visual Age C++ compilers
- to an Environment.
- """
- import SCons.Tool
- import SCons.Tool.cc
- static_obj, shared_obj = SCons.Tool.createObjBuilders(env)
-
- for suffix in CXXSuffixes:
- static_obj.add_action(suffix, SCons.Defaults.CXXAction)
- shared_obj.add_action(suffix, SCons.Defaults.ShCXXAction)
- static_obj.add_emitter(suffix, SCons.Defaults.StaticObjectEmitter)
- shared_obj.add_emitter(suffix, SCons.Defaults.SharedObjectEmitter)
-
- SCons.Tool.cc.add_common_cc_variables(env)
-
- if 'CXX' not in env:
- env['CXX'] = env.Detect(compilers) or compilers[0]
- env['CXXFLAGS'] = SCons.Util.CLVar('')
- env['CXXCOM'] = '$CXX -o $TARGET -c $CXXFLAGS $CCFLAGS $_CCCOMCOM $SOURCES'
- env['SHCXX'] = '$CXX'
- env['SHCXXFLAGS'] = SCons.Util.CLVar('$CXXFLAGS')
- env['SHCXXCOM'] = '$SHCXX -o $TARGET -c $SHCXXFLAGS $SHCCFLAGS $_CCCOMCOM $SOURCES'
-
- env['CPPDEFPREFIX'] = '-D'
- env['CPPDEFSUFFIX'] = ''
- env['INCPREFIX'] = '-I'
- env['INCSUFFIX'] = ''
- env['SHOBJSUFFIX'] = '.os'
- env['OBJSUFFIX'] = '.o'
- env['STATIC_AND_SHARED_OBJECTS_ARE_THE_SAME'] = 0
-
- env['CXXFILESUFFIX'] = '.cc'
-
-def exists(env):
- return env.Detect(env.get('CXX', compilers))
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/cc.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/cc.py
deleted file mode 100644
index 7332ad0..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/cc.py
+++ /dev/null
@@ -1,105 +0,0 @@
-"""SCons.Tool.cc
-
-Tool-specific initialization for generic Posix C compilers.
-
-There normally shouldn't be any need to import this module directly.
-It will usually be imported through the generic SCons.Tool.Tool()
-selection method.
-"""
-
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-
-__revision__ = "src/engine/SCons/Tool/cc.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-import SCons.Tool
-import SCons.Defaults
-import SCons.Util
-
-CSuffixes = ['.c', '.m']
-if not SCons.Util.case_sensitive_suffixes('.c', '.C'):
- CSuffixes.append('.C')
-
-def add_common_cc_variables(env):
- """
- Add underlying common "C compiler" variables that
- are used by multiple tools (specifically, c++).
- """
- if '_CCCOMCOM' not in env:
- env['_CCCOMCOM'] = '$CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS'
- # It's a hack to test for darwin here, but the alternative
- # of creating an applecc.py to contain this seems overkill.
- # Maybe someday the Apple platform will require more setup and
- # this logic will be moved.
- env['FRAMEWORKS'] = SCons.Util.CLVar('')
- env['FRAMEWORKPATH'] = SCons.Util.CLVar('')
- if env['PLATFORM'] == 'darwin':
- env['_CCCOMCOM'] = env['_CCCOMCOM'] + ' $_FRAMEWORKPATH'
-
- if 'CCFLAGS' not in env:
- env['CCFLAGS'] = SCons.Util.CLVar('')
-
- if 'SHCCFLAGS' not in env:
- env['SHCCFLAGS'] = SCons.Util.CLVar('$CCFLAGS')
-
-compilers = ['cc']
-
-def generate(env):
- """
- Add Builders and construction variables for C compilers to an Environment.
- """
- static_obj, shared_obj = SCons.Tool.createObjBuilders(env)
-
- for suffix in CSuffixes:
- static_obj.add_action(suffix, SCons.Defaults.CAction)
- shared_obj.add_action(suffix, SCons.Defaults.ShCAction)
- static_obj.add_emitter(suffix, SCons.Defaults.StaticObjectEmitter)
- shared_obj.add_emitter(suffix, SCons.Defaults.SharedObjectEmitter)
-
- add_common_cc_variables(env)
-
- if 'CC' not in env:
- env['CC'] = env.Detect(compilers) or compilers[0]
- env['CFLAGS'] = SCons.Util.CLVar('')
- env['CCCOM'] = '$CC -o $TARGET -c $CFLAGS $CCFLAGS $_CCCOMCOM $SOURCES'
- env['SHCC'] = '$CC'
- env['SHCFLAGS'] = SCons.Util.CLVar('$CFLAGS')
- env['SHCCCOM'] = '$SHCC -o $TARGET -c $SHCFLAGS $SHCCFLAGS $_CCCOMCOM $SOURCES'
-
- env['CPPDEFPREFIX'] = '-D'
- env['CPPDEFSUFFIX'] = ''
- env['INCPREFIX'] = '-I'
- env['INCSUFFIX'] = ''
- env['SHOBJSUFFIX'] = '.os'
- env['STATIC_AND_SHARED_OBJECTS_ARE_THE_SAME'] = 0
-
- env['CFILESUFFIX'] = '.c'
-
-def exists(env):
- return env.Detect(env.get('CC', compilers))
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/cvf.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/cvf.py
deleted file mode 100644
index 89ac9fb..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/cvf.py
+++ /dev/null
@@ -1,58 +0,0 @@
-"""engine.SCons.Tool.cvf
-
-Tool-specific initialization for the Compaq Visual Fortran compiler.
-
-"""
-
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-
-__revision__ = "src/engine/SCons/Tool/cvf.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-import fortran
-
-compilers = ['f90']
-
-def generate(env):
- """Add Builders and construction variables for compaq visual fortran to an Environment."""
-
- fortran.generate(env)
-
- env['FORTRAN'] = 'f90'
- env['FORTRANCOM'] = '$FORTRAN $FORTRANFLAGS $_FORTRANMODFLAG $_FORTRANINCFLAGS /compile_only ${SOURCES.windows} /object:${TARGET.windows}'
- env['FORTRANPPCOM'] = '$FORTRAN $FORTRANFLAGS $CPPFLAGS $_CPPDEFFLAGS $_FORTRANMODFLAG $_FORTRANINCFLAGS /compile_only ${SOURCES.windows} /object:${TARGET.windows}'
- env['SHFORTRANCOM'] = '$SHFORTRAN $SHFORTRANFLAGS $_FORTRANMODFLAG $_FORTRANINCFLAGS /compile_only ${SOURCES.windows} /object:${TARGET.windows}'
- env['SHFORTRANPPCOM'] = '$SHFORTRAN $SHFORTRANFLAGS $CPPFLAGS $_CPPDEFFLAGS $_FORTRANMODFLAG $_FORTRANINCFLAGS /compile_only ${SOURCES.windows} /object:${TARGET.windows}'
- env['OBJSUFFIX'] = '.obj'
- env['FORTRANMODDIR'] = '${TARGET.dir}'
- env['FORTRANMODDIRPREFIX'] = '/module:'
- env['FORTRANMODDIRSUFFIX'] = ''
-
-def exists(env):
- return env.Detect(compilers)
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/cyglink.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/cyglink.py
deleted file mode 100644
index 87716cf..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/cyglink.py
+++ /dev/null
@@ -1,94 +0,0 @@
-"""SCons.Tool.cyglink
-
-Customization of gnulink for Cygwin (http://www.cygwin.com/)
-
-There normally shouldn't be any need to import this module directly.
-It will usually be imported through the generic SCons.Tool.Tool()
-selection method.
-
-"""
-
-import SCons.Action
-import SCons.Util
-
-import gnulink
-
-def shlib_generator(target, source, env, for_signature):
- cmd = SCons.Util.CLVar(['$SHLINK'])
-
- dll = env.FindIxes(target, 'SHLIBPREFIX', 'SHLIBSUFFIX')
- if dll: cmd.extend(['-o', dll])
-
- cmd.extend(['$SHLINKFLAGS', '$__RPATH'])
-
- implib = env.FindIxes(target, 'IMPLIBPREFIX', 'IMPLIBSUFFIX')
- if implib:
- cmd.extend([
- '-Wl,--out-implib='+implib.get_string(for_signature),
- '-Wl,--export-all-symbols',
- '-Wl,--enable-auto-import',
- '-Wl,--whole-archive', '$SOURCES',
- '-Wl,--no-whole-archive', '$_LIBDIRFLAGS', '$_LIBFLAGS'
- ])
- else:
- cmd.extend(['$SOURCES', '$_LIBDIRFLAGS', '$_LIBFLAGS'])
-
- return [cmd]
-
-def shlib_emitter(target, source, env):
- dll = env.FindIxes(target, 'SHLIBPREFIX', 'SHLIBSUFFIX')
- no_import_lib = env.get('no_import_lib', 0)
-
- if not dll or len(target) > 1:
- raise SCons.Errors.UserError("A shared library should have exactly one target with the suffix: %s" % env.subst("$SHLIBSUFFIX"))
-
- # Remove any "lib" after the prefix
- pre = env.subst('$SHLIBPREFIX')
- if dll.name[len(pre):len(pre)+3] == 'lib':
- dll.name = pre + dll.name[len(pre)+3:]
-
- orig_target = target
- target = [env.fs.File(dll)]
- target[0].attributes.shared = 1
-
- # Append an import lib target
- if not no_import_lib:
- # Create list of target libraries as strings
- target_strings = env.ReplaceIxes(orig_target[0],
- 'SHLIBPREFIX', 'SHLIBSUFFIX',
- 'IMPLIBPREFIX', 'IMPLIBSUFFIX')
-
- implib_target = env.fs.File(target_strings)
- implib_target.attributes.shared = 1
- target.append(implib_target)
-
- return (target, source)
-
-
-shlib_action = SCons.Action.Action(shlib_generator, generator=1)
-
-def generate(env):
- """Add Builders and construction variables for cyglink to an Environment."""
- gnulink.generate(env)
-
- env['LINKFLAGS'] = SCons.Util.CLVar('-Wl,-no-undefined')
-
- env['SHLINKCOM'] = shlib_action
- env['LDMODULECOM'] = shlib_action
- env.Append(SHLIBEMITTER = [shlib_emitter])
-
- env['SHLIBPREFIX'] = 'cyg'
- env['SHLIBSUFFIX'] = '.dll'
-
- env['IMPLIBPREFIX'] = 'lib'
- env['IMPLIBSUFFIX'] = '.dll.a'
-
-def exists(env):
- return gnulink.exists(env)
-
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/default.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/default.py
deleted file mode 100644
index 35e872c..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/default.py
+++ /dev/null
@@ -1,50 +0,0 @@
-"""SCons.Tool.default
-
-Initialization with a default tool list.
-
-There normally shouldn't be any need to import this module directly.
-It will usually be imported through the generic SCons.Tool.Tool()
-selection method.
-
-"""
-
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-
-__revision__ = "src/engine/SCons/Tool/default.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-import SCons.Tool
-
-def generate(env):
- """Add default tools."""
- for t in SCons.Tool.tool_list(env['PLATFORM'], env):
- SCons.Tool.Tool(t)(env)
-
-def exists(env):
- return 1
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/dmd.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/dmd.py
deleted file mode 100644
index 327da15..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/dmd.py
+++ /dev/null
@@ -1,152 +0,0 @@
-"""SCons.Tool.dmd
-
-Tool-specific initialization for the Digital Mars D compiler.
-(http://digitalmars.com/d)
-
-Originally coded by Andy Friesen (andy@ikagames.com)
-15 November 2003
-
-Evolved by Russel Winder (russel@winder.org.uk)
-2010-02-07 onwards
-
-There are a number of problems with this script at this point in time.
-The one that irritates the most is the Windows linker setup. The D
-linker doesn't have a way to add lib paths on the commandline, as far
-as I can see. You have to specify paths relative to the SConscript or
-use absolute paths. To hack around it, add '#/blah'. This will link
-blah.lib from the directory where SConstruct resides.
-
-Compiler variables:
- DC - The name of the D compiler to use. Defaults to dmd or gdmd,
- whichever is found.
- DPATH - List of paths to search for import modules.
- DVERSIONS - List of version tags to enable when compiling.
- DDEBUG - List of debug tags to enable when compiling.
-
-Linker related variables:
- LIBS - List of library files to link in.
- DLINK - Name of the linker to use. Defaults to dmd or gdmd,
- whichever is found.
- DLINKFLAGS - List of linker flags.
-
-Lib tool variables:
- DLIB - Name of the lib tool to use. Defaults to lib.
- DLIBFLAGS - List of flags to pass to the lib tool.
- LIBS - Same as for the linker. (libraries to pull into the .lib)
-"""
-
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-
-__revision__ = "src/engine/SCons/Tool/dmd.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-import os
-import subprocess
-
-import SCons.Action
-import SCons.Builder
-import SCons.Defaults
-import SCons.Scanner.D
-import SCons.Tool
-
-import SCons.Tool.DCommon
-
-
-def generate(env):
- static_obj, shared_obj = SCons.Tool.createObjBuilders(env)
-
- static_obj.add_action('.d', SCons.Defaults.DAction)
- shared_obj.add_action('.d', SCons.Defaults.ShDAction)
- static_obj.add_emitter('.d', SCons.Defaults.StaticObjectEmitter)
- shared_obj.add_emitter('.d', SCons.Defaults.SharedObjectEmitter)
-
- env['DC'] = env.Detect(['dmd', 'gdmd'])
- env['DCOM'] = '$DC $_DINCFLAGS $_DVERFLAGS $_DDEBUGFLAGS $_DFLAGS -c -of$TARGET $SOURCES'
- env['_DINCFLAGS'] = '${_concat(DINCPREFIX, DPATH, DINCSUFFIX, __env__, RDirs, TARGET, SOURCE)}'
- env['_DVERFLAGS'] = '${_concat(DVERPREFIX, DVERSIONS, DVERSUFFIX, __env__)}'
- env['_DDEBUGFLAGS'] = '${_concat(DDEBUGPREFIX, DDEBUG, DDEBUGSUFFIX, __env__)}'
- env['_DFLAGS'] = '${_concat(DFLAGPREFIX, DFLAGS, DFLAGSUFFIX, __env__)}'
-
- env['SHDC'] = '$DC'
- env['SHDCOM'] = '$DC $_DINCFLAGS $_DVERFLAGS $_DDEBUGFLAGS $_DFLAGS -c -fPIC -of$TARGET $SOURCES'
-
- env['DPATH'] = ['#/']
- env['DFLAGS'] = []
- env['DVERSIONS'] = []
- env['DDEBUG'] = []
-
- if env['DC']:
- SCons.Tool.DCommon.addDPATHToEnv(env, env['DC'])
-
- env['DINCPREFIX'] = '-I'
- env['DINCSUFFIX'] = ''
- env['DVERPREFIX'] = '-version='
- env['DVERSUFFIX'] = ''
- env['DDEBUGPREFIX'] = '-debug='
- env['DDEBUGSUFFIX'] = ''
- env['DFLAGPREFIX'] = '-'
- env['DFLAGSUFFIX'] = ''
- env['DFILESUFFIX'] = '.d'
-
- env['DLINK'] = '$DC'
- env['DLINKFLAGS'] = SCons.Util.CLVar('')
- env['DLINKCOM'] = '$DLINK -of$TARGET $DLINKFLAGS $__DRPATH $SOURCES $_DLIBDIRFLAGS $_DLIBFLAGS'
-
- env['DSHLINK'] = '$DC'
- env['DSHLINKFLAGS'] = SCons.Util.CLVar('$DLINKFLAGS -shared -defaultlib=libphobos2.so')
- env['SHDLINKCOM'] = '$DLINK -of$TARGET $DSHLINKFLAGS $__DRPATH $SOURCES $_DLIBDIRFLAGS $_DLIBFLAGS'
-
- env['DLIBLINKPREFIX'] = '' if env['PLATFORM'] == 'win32' else '-L-l'
- env['DLIBLINKSUFFIX'] = '.lib' if env['PLATFORM'] == 'win32' else ''
- env['_DLIBFLAGS'] = '${_stripixes(DLIBLINKPREFIX, LIBS, DLIBLINKSUFFIX, LIBPREFIXES, LIBSUFFIXES, __env__)}'
-
- env['DLIBDIRPREFIX'] = '-L-L'
- env['DLIBDIRSUFFIX'] = ''
- env['_DLIBDIRFLAGS'] = '${_concat(DLIBDIRPREFIX, LIBPATH, DLIBDIRSUFFIX, __env__, RDirs, TARGET, SOURCE)}'
-
-
- env['DLIB'] = 'lib' if env['PLATFORM'] == 'win32' else 'ar cr'
- env['DLIBCOM'] = '$DLIB $_DLIBFLAGS {0}$TARGET $SOURCES $_DLIBFLAGS'.format('-c ' if env['PLATFORM'] == 'win32' else '')
-
- #env['_DLIBFLAGS'] = '${_concat(DLIBFLAGPREFIX, DLIBFLAGS, DLIBFLAGSUFFIX, __env__)}'
-
- env['DLIBFLAGPREFIX'] = '-'
- env['DLIBFLAGSUFFIX'] = ''
-
- # __RPATH is set to $_RPATH in the platform specification if that
- # platform supports it.
- env['DRPATHPREFIX'] = '-L-rpath='
- env['DRPATHSUFFIX'] = ''
- env['_DRPATH'] = '${_concat(DRPATHPREFIX, RPATH, DRPATHSUFFIX, __env__)}'
-
- SCons.Tool.createStaticLibBuilder(env)
-
-
-def exists(env):
- return env.Detect(['dmd', 'gdmd'])
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/docbook/__init__.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/docbook/__init__.py
deleted file mode 100644
index aead43c..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/docbook/__init__.py
+++ /dev/null
@@ -1,882 +0,0 @@
-
-"""SCons.Tool.docbook
-
-Tool-specific initialization for Docbook.
-
-There normally shouldn't be any need to import this module directly.
-It will usually be imported through the generic SCons.Tool.Tool()
-selection method.
-
-"""
-
-#
-# Copyright (c) 2001-7,2010 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-
-import os
-import glob
-import re
-
-import SCons.Action
-import SCons.Builder
-import SCons.Defaults
-import SCons.Script
-import SCons.Tool
-import SCons.Util
-
-# Get full path to this script
-scriptpath = os.path.dirname(os.path.realpath(__file__))
-
-# Local folder for the collection of DocBook XSLs
-db_xsl_folder = 'docbook-xsl-1.76.1'
-
-# Do we have libxml2/libxslt/lxml?
-has_libxml2 = True
-has_lxml = True
-try:
- import libxml2
- import libxslt
-except:
- has_libxml2 = False
-try:
- import lxml
-except:
- has_lxml = False
-
-# Set this to True, to prefer xsltproc over libxml2 and lxml
-prefer_xsltproc = False
-
-# Regexs for parsing Docbook XML sources of MAN pages
-re_manvolnum = re.compile("<manvolnum>([^<]*)</manvolnum>")
-re_refname = re.compile("<refname>([^<]*)</refname>")
-
-#
-# Helper functions
-#
-def __extend_targets_sources(target, source):
- """ Prepare the lists of target and source files. """
- if not SCons.Util.is_List(target):
- target = [target]
- if not source:
- source = target[:]
- elif not SCons.Util.is_List(source):
- source = [source]
- if len(target) < len(source):
- target.extend(source[len(target):])
-
- return target, source
-
-def __init_xsl_stylesheet(kw, env, user_xsl_var, default_path):
- if kw.get('DOCBOOK_XSL','') == '':
- xsl_style = kw.get('xsl', env.subst(user_xsl_var))
- if xsl_style == '':
- path_args = [scriptpath, db_xsl_folder] + default_path
- xsl_style = os.path.join(*path_args)
- kw['DOCBOOK_XSL'] = xsl_style
-
-def __select_builder(lxml_builder, libxml2_builder, cmdline_builder):
- """ Selects a builder, based on which Python modules are present. """
- if prefer_xsltproc:
- return cmdline_builder
-
- if not has_libxml2:
- # At the moment we prefer libxml2 over lxml, the latter can lead
- # to conflicts when installed together with libxml2.
- if has_lxml:
- return lxml_builder
- else:
- return cmdline_builder
-
- return libxml2_builder
-
-def __ensure_suffix(t, suffix):
- """ Ensure that the target t has the given suffix. """
- tpath = str(t)
- if not tpath.endswith(suffix):
- return tpath+suffix
-
- return t
-
-def __ensure_suffix_stem(t, suffix):
- """ Ensure that the target t has the given suffix, and return the file's stem. """
- tpath = str(t)
- if not tpath.endswith(suffix):
- stem = tpath
- tpath += suffix
-
- return tpath, stem
- else:
- stem, ext = os.path.splitext(tpath)
-
- return t, stem
-
-def __get_xml_text(root):
- """ Return the text for the given root node (xml.dom.minidom). """
- txt = ""
- for e in root.childNodes:
- if (e.nodeType == e.TEXT_NODE):
- txt += e.data
- return txt
-
-def __create_output_dir(base_dir):
- """ Ensure that the output directory base_dir exists. """
- root, tail = os.path.split(base_dir)
- dir = None
- if tail:
- if base_dir.endswith('/'):
- dir = base_dir
- else:
- dir = root
- else:
- if base_dir.endswith('/'):
- dir = base_dir
-
- if dir and not os.path.isdir(dir):
- os.makedirs(dir)
-
-
-#
-# Supported command line tools and their call "signature"
-#
-xsltproc_com = {'xsltproc' : '$DOCBOOK_XSLTPROC $DOCBOOK_XSLTPROCFLAGS -o $TARGET $DOCBOOK_XSL $SOURCE',
- 'saxon' : '$DOCBOOK_XSLTPROC $DOCBOOK_XSLTPROCFLAGS -o $TARGET $DOCBOOK_XSL $SOURCE $DOCBOOK_XSLTPROCPARAMS',
- 'saxon-xslt' : '$DOCBOOK_XSLTPROC $DOCBOOK_XSLTPROCFLAGS -o $TARGET $DOCBOOK_XSL $SOURCE $DOCBOOK_XSLTPROCPARAMS',
- 'xalan' : '$DOCBOOK_XSLTPROC $DOCBOOK_XSLTPROCFLAGS -q -out $TARGET -xsl $DOCBOOK_XSL -in $SOURCE'}
-xmllint_com = {'xmllint' : '$DOCBOOK_XMLLINT $DOCBOOK_XMLLINTFLAGS --xinclude $SOURCE > $TARGET'}
-fop_com = {'fop' : '$DOCBOOK_FOP $DOCBOOK_FOPFLAGS -fo $SOURCE -pdf $TARGET',
- 'xep' : '$DOCBOOK_FOP $DOCBOOK_FOPFLAGS -valid -fo $SOURCE -pdf $TARGET',
- 'jw' : '$DOCBOOK_FOP $DOCBOOK_FOPFLAGS -f docbook -b pdf $SOURCE -o $TARGET'}
-
-def __detect_cl_tool(env, chainkey, cdict):
- """
- Helper function, picks a command line tool from the list
- and initializes its environment variables.
- """
- if env.get(chainkey,'') == '':
- clpath = ''
- for cltool in cdict:
- clpath = env.WhereIs(cltool)
- if clpath:
- env[chainkey] = clpath
- if not env[chainkey + 'COM']:
- env[chainkey + 'COM'] = cdict[cltool]
-
-def _detect(env):
- """
- Detect all the command line tools that we might need for creating
- the requested output formats.
- """
- global prefer_xsltproc
-
- if env.get('DOCBOOK_PREFER_XSLTPROC',''):
- prefer_xsltproc = True
-
- if ((not has_libxml2 and not has_lxml) or (prefer_xsltproc)):
- # Try to find the XSLT processors
- __detect_cl_tool(env, 'DOCBOOK_XSLTPROC', xsltproc_com)
- __detect_cl_tool(env, 'DOCBOOK_XMLLINT', xmllint_com)
-
- __detect_cl_tool(env, 'DOCBOOK_FOP', fop_com)
-
-#
-# Scanners
-#
-include_re = re.compile('fileref\\s*=\\s*["|\']([^\\n]*)["|\']')
-sentity_re = re.compile('<!ENTITY\\s+%*\\s*[^\\s]+\\s+SYSTEM\\s+["|\']([^\\n]*)["|\']>')
-
-def __xml_scan(node, env, path, arg):
- """ Simple XML file scanner, detecting local images and XIncludes as implicit dependencies. """
- # Does the node exist yet?
- if not os.path.isfile(str(node)):
- return []
-
- if env.get('DOCBOOK_SCANENT',''):
- # Use simple pattern matching for system entities..., no support
- # for recursion yet.
- contents = node.get_text_contents()
- return sentity_re.findall(contents)
-
- xsl_file = os.path.join(scriptpath,'utils','xmldepend.xsl')
- if not has_libxml2 or prefer_xsltproc:
- if has_lxml and not prefer_xsltproc:
-
- from lxml import etree
-
- xsl_tree = etree.parse(xsl_file)
- doc = etree.parse(str(node))
- result = doc.xslt(xsl_tree)
-
- depfiles = [x.strip() for x in str(result).splitlines() if x.strip() != "" and not x.startswith("<?xml ")]
- return depfiles
- else:
- # Try to call xsltproc
- xsltproc = env.subst("$DOCBOOK_XSLTPROC")
- if xsltproc and xsltproc.endswith('xsltproc'):
- result = env.backtick(' '.join([xsltproc, xsl_file, str(node)]))
- depfiles = [x.strip() for x in str(result).splitlines() if x.strip() != "" and not x.startswith("<?xml ")]
- return depfiles
- else:
- # Use simple pattern matching, there is currently no support
- # for xi:includes...
- contents = node.get_text_contents()
- return include_re.findall(contents)
-
- styledoc = libxml2.parseFile(xsl_file)
- style = libxslt.parseStylesheetDoc(styledoc)
- doc = libxml2.readFile(str(node), None, libxml2.XML_PARSE_NOENT)
- result = style.applyStylesheet(doc, None)
-
- depfiles = []
- for x in str(result).splitlines():
- if x.strip() != "" and not x.startswith("<?xml "):
- depfiles.extend(x.strip().split())
-
- style.freeStylesheet()
- doc.freeDoc()
- result.freeDoc()
-
- return depfiles
-
-# Creating the instance of our XML dependency scanner
-docbook_xml_scanner = SCons.Script.Scanner(function = __xml_scan,
- argument = None)
-
-
-#
-# Action generators
-#
-def __generate_xsltproc_action(source, target, env, for_signature):
- cmd = env['DOCBOOK_XSLTPROCCOM']
- # Does the environment have a base_dir defined?
- base_dir = env.subst('$base_dir')
- if base_dir:
- # Yes, so replace target path by its filename
- return cmd.replace('$TARGET','${TARGET.file}')
- return cmd
-
-
-#
-# Emitters
-#
-def __emit_xsl_basedir(target, source, env):
- # Does the environment have a base_dir defined?
- base_dir = env.subst('$base_dir')
- if base_dir:
- # Yes, so prepend it to each target
- return [os.path.join(base_dir, str(t)) for t in target], source
-
- # No, so simply pass target and source names through
- return target, source
-
-
-#
-# Builders
-#
-def __build_libxml2(target, source, env):
- """
- General XSLT builder (HTML/FO), using the libxml2 module.
- """
- xsl_style = env.subst('$DOCBOOK_XSL')
- styledoc = libxml2.parseFile(xsl_style)
- style = libxslt.parseStylesheetDoc(styledoc)
- doc = libxml2.readFile(str(source[0]),None,libxml2.XML_PARSE_NOENT)
- # Support for additional parameters
- parampass = {}
- if parampass:
- result = style.applyStylesheet(doc, parampass)
- else:
- result = style.applyStylesheet(doc, None)
- style.saveResultToFilename(str(target[0]), result, 0)
- style.freeStylesheet()
- doc.freeDoc()
- result.freeDoc()
-
- return None
-
-def __build_lxml(target, source, env):
- """
- General XSLT builder (HTML/FO), using the lxml module.
- """
- from lxml import etree
-
- xslt_ac = etree.XSLTAccessControl(read_file=True,
- write_file=True,
- create_dir=True,
- read_network=False,
- write_network=False)
- xsl_style = env.subst('$DOCBOOK_XSL')
- xsl_tree = etree.parse(xsl_style)
- transform = etree.XSLT(xsl_tree, access_control=xslt_ac)
- doc = etree.parse(str(source[0]))
- # Support for additional parameters
- parampass = {}
- if parampass:
- result = transform(doc, **parampass)
- else:
- result = transform(doc)
-
- try:
- of = open(str(target[0]), "w")
- of.write(of.write(etree.tostring(result, pretty_print=True)))
- of.close()
- except:
- pass
-
- return None
-
-def __xinclude_libxml2(target, source, env):
- """
- Resolving XIncludes, using the libxml2 module.
- """
- doc = libxml2.readFile(str(source[0]), None, libxml2.XML_PARSE_NOENT)
- doc.xincludeProcessFlags(libxml2.XML_PARSE_NOENT)
- doc.saveFile(str(target[0]))
- doc.freeDoc()
-
- return None
-
-def __xinclude_lxml(target, source, env):
- """
- Resolving XIncludes, using the lxml module.
- """
- from lxml import etree
-
- doc = etree.parse(str(source[0]))
- doc.xinclude()
- try:
- doc.write(str(target[0]), xml_declaration=True,
- encoding="UTF-8", pretty_print=True)
- except:
- pass
-
- return None
-
-__libxml2_builder = SCons.Builder.Builder(
- action = __build_libxml2,
- src_suffix = '.xml',
- source_scanner = docbook_xml_scanner,
- emitter = __emit_xsl_basedir)
-__lxml_builder = SCons.Builder.Builder(
- action = __build_lxml,
- src_suffix = '.xml',
- source_scanner = docbook_xml_scanner,
- emitter = __emit_xsl_basedir)
-
-__xinclude_libxml2_builder = SCons.Builder.Builder(
- action = __xinclude_libxml2,
- suffix = '.xml',
- src_suffix = '.xml',
- source_scanner = docbook_xml_scanner)
-__xinclude_lxml_builder = SCons.Builder.Builder(
- action = __xinclude_lxml,
- suffix = '.xml',
- src_suffix = '.xml',
- source_scanner = docbook_xml_scanner)
-
-__xsltproc_builder = SCons.Builder.Builder(
- action = SCons.Action.CommandGeneratorAction(__generate_xsltproc_action,
- {'cmdstr' : '$DOCBOOK_XSLTPROCCOMSTR'}),
- src_suffix = '.xml',
- source_scanner = docbook_xml_scanner,
- emitter = __emit_xsl_basedir)
-__xmllint_builder = SCons.Builder.Builder(
- action = SCons.Action.Action('$DOCBOOK_XMLLINTCOM','$DOCBOOK_XMLLINTCOMSTR'),
- suffix = '.xml',
- src_suffix = '.xml',
- source_scanner = docbook_xml_scanner)
-__fop_builder = SCons.Builder.Builder(
- action = SCons.Action.Action('$DOCBOOK_FOPCOM','$DOCBOOK_FOPCOMSTR'),
- suffix = '.pdf',
- src_suffix = '.fo',
- ensure_suffix=1)
-
-def DocbookEpub(env, target, source=None, *args, **kw):
- """
- A pseudo-Builder, providing a Docbook toolchain for ePub output.
- """
- import zipfile
- import shutil
-
- def build_open_container(target, source, env):
- """Generate the *.epub file from intermediate outputs
-
- Constructs the epub file according to the Open Container Format. This
- function could be replaced by a call to the SCons Zip builder if support
- was added for different compression formats for separate source nodes.
- """
- zf = zipfile.ZipFile(str(target[0]), 'w')
- mime_file = open('mimetype', 'w')
- mime_file.write('application/epub+zip')
- mime_file.close()
- zf.write(mime_file.name, compress_type = zipfile.ZIP_STORED)
- for s in source:
- if os.path.isfile(str(s)):
- head, tail = os.path.split(str(s))
- if not head:
- continue
- s = head
- for dirpath, dirnames, filenames in os.walk(str(s)):
- for fname in filenames:
- path = os.path.join(dirpath, fname)
- if os.path.isfile(path):
- zf.write(path, os.path.relpath(path, str(env.get('ZIPROOT', ''))),
- zipfile.ZIP_DEFLATED)
- zf.close()
-
- def add_resources(target, source, env):
- """Add missing resources to the OEBPS directory
-
- Ensure all the resources in the manifest are present in the OEBPS directory.
- """
- hrefs = []
- content_file = os.path.join(source[0].get_abspath(), 'content.opf')
- if not os.path.isfile(content_file):
- return
-
- hrefs = []
- if has_libxml2:
- nsmap = {'opf' : 'http://www.idpf.org/2007/opf'}
- # Read file and resolve entities
- doc = libxml2.readFile(content_file, None, 0)
- opf = doc.getRootElement()
- # Create xpath context
- xpath_context = doc.xpathNewContext()
- # Register namespaces
- for key, val in nsmap.iteritems():
- xpath_context.xpathRegisterNs(key, val)
-
- if hasattr(opf, 'xpathEval') and xpath_context:
- # Use the xpath context
- xpath_context.setContextNode(opf)
- items = xpath_context.xpathEval(".//opf:item")
- else:
- items = opf.findall(".//{'http://www.idpf.org/2007/opf'}item")
-
- for item in items:
- if hasattr(item, 'prop'):
- hrefs.append(item.prop('href'))
- else:
- hrefs.append(item.attrib['href'])
-
- doc.freeDoc()
- xpath_context.xpathFreeContext()
- elif has_lxml:
- from lxml import etree
-
- opf = etree.parse(content_file)
- # All the opf:item elements are resources
- for item in opf.xpath('//opf:item',
- namespaces= { 'opf': 'http://www.idpf.org/2007/opf' }):
- hrefs.append(item.attrib['href'])
-
- for href in hrefs:
- # If the resource was not already created by DocBook XSL itself,
- # copy it into the OEBPS folder
- referenced_file = os.path.join(source[0].get_abspath(), href)
- if not os.path.exists(referenced_file):
- shutil.copy(href, os.path.join(source[0].get_abspath(), href))
-
- # Init list of targets/sources
- target, source = __extend_targets_sources(target, source)
-
- # Init XSL stylesheet
- __init_xsl_stylesheet(kw, env, '$DOCBOOK_DEFAULT_XSL_EPUB', ['epub','docbook.xsl'])
-
- # Setup builder
- __builder = __select_builder(__lxml_builder, __libxml2_builder, __xsltproc_builder)
-
- # Create targets
- result = []
- if not env.GetOption('clean'):
- # Ensure that the folders OEBPS and META-INF exist
- __create_output_dir('OEBPS/')
- __create_output_dir('META-INF/')
- dirs = env.Dir(['OEBPS', 'META-INF'])
-
- # Set the fixed base_dir
- kw['base_dir'] = 'OEBPS/'
- tocncx = __builder.__call__(env, 'toc.ncx', source[0], **kw)
- cxml = env.File('META-INF/container.xml')
- env.SideEffect(cxml, tocncx)
-
- env.Depends(tocncx, kw['DOCBOOK_XSL'])
- result.extend(tocncx+[cxml])
-
- container = env.Command(__ensure_suffix(str(target[0]), '.epub'),
- tocncx+[cxml], [add_resources, build_open_container])
- mimetype = env.File('mimetype')
- env.SideEffect(mimetype, container)
-
- result.extend(container)
- # Add supporting files for cleanup
- env.Clean(tocncx, dirs)
-
- return result
-
-def DocbookHtml(env, target, source=None, *args, **kw):
- """
- A pseudo-Builder, providing a Docbook toolchain for HTML output.
- """
- # Init list of targets/sources
- target, source = __extend_targets_sources(target, source)
-
- # Init XSL stylesheet
- __init_xsl_stylesheet(kw, env, '$DOCBOOK_DEFAULT_XSL_HTML', ['html','docbook.xsl'])
-
- # Setup builder
- __builder = __select_builder(__lxml_builder, __libxml2_builder, __xsltproc_builder)
-
- # Create targets
- result = []
- for t,s in zip(target,source):
- r = __builder.__call__(env, __ensure_suffix(t,'.html'), s, **kw)
- env.Depends(r, kw['DOCBOOK_XSL'])
- result.extend(r)
-
- return result
-
-def DocbookHtmlChunked(env, target, source=None, *args, **kw):
- """
- A pseudo-Builder, providing a Docbook toolchain for chunked HTML output.
- """
- # Init target/source
- if not SCons.Util.is_List(target):
- target = [target]
- if not source:
- source = target
- target = ['index.html']
- elif not SCons.Util.is_List(source):
- source = [source]
-
- # Init XSL stylesheet
- __init_xsl_stylesheet(kw, env, '$DOCBOOK_DEFAULT_XSL_HTMLCHUNKED', ['html','chunkfast.xsl'])
-
- # Setup builder
- __builder = __select_builder(__lxml_builder, __libxml2_builder, __xsltproc_builder)
-
- # Detect base dir
- base_dir = kw.get('base_dir', '')
- if base_dir:
- __create_output_dir(base_dir)
-
- # Create targets
- result = []
- r = __builder.__call__(env, __ensure_suffix(str(target[0]), '.html'), source[0], **kw)
- env.Depends(r, kw['DOCBOOK_XSL'])
- result.extend(r)
- # Add supporting files for cleanup
- env.Clean(r, glob.glob(os.path.join(base_dir, '*.html')))
-
- return result
-
-
-def DocbookHtmlhelp(env, target, source=None, *args, **kw):
- """
- A pseudo-Builder, providing a Docbook toolchain for HTMLHELP output.
- """
- # Init target/source
- if not SCons.Util.is_List(target):
- target = [target]
- if not source:
- source = target
- target = ['index.html']
- elif not SCons.Util.is_List(source):
- source = [source]
-
- # Init XSL stylesheet
- __init_xsl_stylesheet(kw, env, '$DOCBOOK_DEFAULT_XSL_HTMLHELP', ['htmlhelp','htmlhelp.xsl'])
-
- # Setup builder
- __builder = __select_builder(__lxml_builder, __libxml2_builder, __xsltproc_builder)
-
- # Detect base dir
- base_dir = kw.get('base_dir', '')
- if base_dir:
- __create_output_dir(base_dir)
-
- # Create targets
- result = []
- r = __builder.__call__(env, __ensure_suffix(str(target[0]), '.html'), source[0], **kw)
- env.Depends(r, kw['DOCBOOK_XSL'])
- result.extend(r)
- # Add supporting files for cleanup
- env.Clean(r, ['toc.hhc', 'htmlhelp.hhp', 'index.hhk'] +
- glob.glob(os.path.join(base_dir, '[ar|bk|ch]*.html')))
-
- return result
-
-def DocbookPdf(env, target, source=None, *args, **kw):
- """
- A pseudo-Builder, providing a Docbook toolchain for PDF output.
- """
- # Init list of targets/sources
- target, source = __extend_targets_sources(target, source)
-
- # Init XSL stylesheet
- __init_xsl_stylesheet(kw, env, '$DOCBOOK_DEFAULT_XSL_PDF', ['fo','docbook.xsl'])
-
- # Setup builder
- __builder = __select_builder(__lxml_builder, __libxml2_builder, __xsltproc_builder)
-
- # Create targets
- result = []
- for t,s in zip(target,source):
- t, stem = __ensure_suffix_stem(t, '.pdf')
- xsl = __builder.__call__(env, stem+'.fo', s, **kw)
- result.extend(xsl)
- env.Depends(xsl, kw['DOCBOOK_XSL'])
- result.extend(__fop_builder.__call__(env, t, xsl, **kw))
-
- return result
-
-def DocbookMan(env, target, source=None, *args, **kw):
- """
- A pseudo-Builder, providing a Docbook toolchain for Man page output.
- """
- # Init list of targets/sources
- target, source = __extend_targets_sources(target, source)
-
- # Init XSL stylesheet
- __init_xsl_stylesheet(kw, env, '$DOCBOOK_DEFAULT_XSL_MAN', ['manpages','docbook.xsl'])
-
- # Setup builder
- __builder = __select_builder(__lxml_builder, __libxml2_builder, __xsltproc_builder)
-
- # Create targets
- result = []
- for t,s in zip(target,source):
- volnum = "1"
- outfiles = []
- srcfile = __ensure_suffix(str(s),'.xml')
- if os.path.isfile(srcfile):
- try:
- import xml.dom.minidom
-
- dom = xml.dom.minidom.parse(__ensure_suffix(str(s),'.xml'))
- # Extract volume number, default is 1
- for node in dom.getElementsByTagName('refmeta'):
- for vol in node.getElementsByTagName('manvolnum'):
- volnum = __get_xml_text(vol)
-
- # Extract output filenames
- for node in dom.getElementsByTagName('refnamediv'):
- for ref in node.getElementsByTagName('refname'):
- outfiles.append(__get_xml_text(ref)+'.'+volnum)
-
- except:
- # Use simple regex parsing
- f = open(__ensure_suffix(str(s),'.xml'), 'r')
- content = f.read()
- f.close()
-
- for m in re_manvolnum.finditer(content):
- volnum = m.group(1)
-
- for m in re_refname.finditer(content):
- outfiles.append(m.group(1)+'.'+volnum)
-
- if not outfiles:
- # Use stem of the source file
- spath = str(s)
- if not spath.endswith('.xml'):
- outfiles.append(spath+'.'+volnum)
- else:
- stem, ext = os.path.splitext(spath)
- outfiles.append(stem+'.'+volnum)
- else:
- # We have to completely rely on the given target name
- outfiles.append(t)
-
- __builder.__call__(env, outfiles[0], s, **kw)
- env.Depends(outfiles[0], kw['DOCBOOK_XSL'])
- result.append(outfiles[0])
- if len(outfiles) > 1:
- env.Clean(outfiles[0], outfiles[1:])
-
-
- return result
-
-def DocbookSlidesPdf(env, target, source=None, *args, **kw):
- """
- A pseudo-Builder, providing a Docbook toolchain for PDF slides output.
- """
- # Init list of targets/sources
- target, source = __extend_targets_sources(target, source)
-
- # Init XSL stylesheet
- __init_xsl_stylesheet(kw, env, '$DOCBOOK_DEFAULT_XSL_SLIDESPDF', ['slides','fo','plain.xsl'])
-
- # Setup builder
- __builder = __select_builder(__lxml_builder, __libxml2_builder, __xsltproc_builder)
-
- # Create targets
- result = []
- for t,s in zip(target,source):
- t, stem = __ensure_suffix_stem(t, '.pdf')
- xsl = __builder.__call__(env, stem+'.fo', s, **kw)
- env.Depends(xsl, kw['DOCBOOK_XSL'])
- result.extend(xsl)
- result.extend(__fop_builder.__call__(env, t, xsl, **kw))
-
- return result
-
-def DocbookSlidesHtml(env, target, source=None, *args, **kw):
- """
- A pseudo-Builder, providing a Docbook toolchain for HTML slides output.
- """
- # Init list of targets/sources
- if not SCons.Util.is_List(target):
- target = [target]
- if not source:
- source = target
- target = ['index.html']
- elif not SCons.Util.is_List(source):
- source = [source]
-
- # Init XSL stylesheet
- __init_xsl_stylesheet(kw, env, '$DOCBOOK_DEFAULT_XSL_SLIDESHTML', ['slides','html','plain.xsl'])
-
- # Setup builder
- __builder = __select_builder(__lxml_builder, __libxml2_builder, __xsltproc_builder)
-
- # Detect base dir
- base_dir = kw.get('base_dir', '')
- if base_dir:
- __create_output_dir(base_dir)
-
- # Create targets
- result = []
- r = __builder.__call__(env, __ensure_suffix(str(target[0]), '.html'), source[0], **kw)
- env.Depends(r, kw['DOCBOOK_XSL'])
- result.extend(r)
- # Add supporting files for cleanup
- env.Clean(r, [os.path.join(base_dir, 'toc.html')] +
- glob.glob(os.path.join(base_dir, 'foil*.html')))
-
- return result
-
-def DocbookXInclude(env, target, source, *args, **kw):
- """
- A pseudo-Builder, for resolving XIncludes in a separate processing step.
- """
- # Init list of targets/sources
- target, source = __extend_targets_sources(target, source)
-
- # Setup builder
- __builder = __select_builder(__xinclude_lxml_builder,__xinclude_libxml2_builder,__xmllint_builder)
-
- # Create targets
- result = []
- for t,s in zip(target,source):
- result.extend(__builder.__call__(env, t, s, **kw))
-
- return result
-
-def DocbookXslt(env, target, source=None, *args, **kw):
- """
- A pseudo-Builder, applying a simple XSL transformation to the input file.
- """
- # Init list of targets/sources
- target, source = __extend_targets_sources(target, source)
-
- # Init XSL stylesheet
- kw['DOCBOOK_XSL'] = kw.get('xsl', 'transform.xsl')
-
- # Setup builder
- __builder = __select_builder(__lxml_builder, __libxml2_builder, __xsltproc_builder)
-
- # Create targets
- result = []
- for t,s in zip(target,source):
- r = __builder.__call__(env, t, s, **kw)
- env.Depends(r, kw['DOCBOOK_XSL'])
- result.extend(r)
-
- return result
-
-
-def generate(env):
- """Add Builders and construction variables for docbook to an Environment."""
-
- env.SetDefault(
- # Default names for customized XSL stylesheets
- DOCBOOK_DEFAULT_XSL_EPUB = '',
- DOCBOOK_DEFAULT_XSL_HTML = '',
- DOCBOOK_DEFAULT_XSL_HTMLCHUNKED = '',
- DOCBOOK_DEFAULT_XSL_HTMLHELP = '',
- DOCBOOK_DEFAULT_XSL_PDF = '',
- DOCBOOK_DEFAULT_XSL_MAN = '',
- DOCBOOK_DEFAULT_XSL_SLIDESPDF = '',
- DOCBOOK_DEFAULT_XSL_SLIDESHTML = '',
-
- # Paths to the detected executables
- DOCBOOK_XSLTPROC = '',
- DOCBOOK_XMLLINT = '',
- DOCBOOK_FOP = '',
-
- # Additional flags for the text processors
- DOCBOOK_XSLTPROCFLAGS = SCons.Util.CLVar(''),
- DOCBOOK_XMLLINTFLAGS = SCons.Util.CLVar(''),
- DOCBOOK_FOPFLAGS = SCons.Util.CLVar(''),
- DOCBOOK_XSLTPROCPARAMS = SCons.Util.CLVar(''),
-
- # Default command lines for the detected executables
- DOCBOOK_XSLTPROCCOM = xsltproc_com['xsltproc'],
- DOCBOOK_XMLLINTCOM = xmllint_com['xmllint'],
- DOCBOOK_FOPCOM = fop_com['fop'],
-
- # Screen output for the text processors
- DOCBOOK_XSLTPROCCOMSTR = None,
- DOCBOOK_XMLLINTCOMSTR = None,
- DOCBOOK_FOPCOMSTR = None,
-
- )
- _detect(env)
-
- try:
- env.AddMethod(DocbookEpub, "DocbookEpub")
- env.AddMethod(DocbookHtml, "DocbookHtml")
- env.AddMethod(DocbookHtmlChunked, "DocbookHtmlChunked")
- env.AddMethod(DocbookHtmlhelp, "DocbookHtmlhelp")
- env.AddMethod(DocbookPdf, "DocbookPdf")
- env.AddMethod(DocbookMan, "DocbookMan")
- env.AddMethod(DocbookSlidesPdf, "DocbookSlidesPdf")
- env.AddMethod(DocbookSlidesHtml, "DocbookSlidesHtml")
- env.AddMethod(DocbookXInclude, "DocbookXInclude")
- env.AddMethod(DocbookXslt, "DocbookXslt")
- except AttributeError:
- # Looks like we use a pre-0.98 version of SCons...
- from SCons.Script.SConscript import SConsEnvironment
- SConsEnvironment.DocbookEpub = DocbookEpub
- SConsEnvironment.DocbookHtml = DocbookHtml
- SConsEnvironment.DocbookHtmlChunked = DocbookHtmlChunked
- SConsEnvironment.DocbookHtmlhelp = DocbookHtmlhelp
- SConsEnvironment.DocbookPdf = DocbookPdf
- SConsEnvironment.DocbookMan = DocbookMan
- SConsEnvironment.DocbookSlidesPdf = DocbookSlidesPdf
- SConsEnvironment.DocbookSlidesHtml = DocbookSlidesHtml
- SConsEnvironment.DocbookXInclude = DocbookXInclude
- SConsEnvironment.DocbookXslt = DocbookXslt
-
-
-def exists(env):
- return 1
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/dvi.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/dvi.py
deleted file mode 100644
index aba7168..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/dvi.py
+++ /dev/null
@@ -1,64 +0,0 @@
-"""SCons.Tool.dvi
-
-Common DVI Builder definition for various other Tool modules that use it.
-
-"""
-
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-
-__revision__ = "src/engine/SCons/Tool/dvi.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-import SCons.Builder
-import SCons.Tool
-
-DVIBuilder = None
-
-def generate(env):
- try:
- env['BUILDERS']['DVI']
- except KeyError:
- global DVIBuilder
-
- if DVIBuilder is None:
- # The suffix is hard-coded to '.dvi', not configurable via a
- # construction variable like $DVISUFFIX, because the output
- # file name is hard-coded within TeX.
- DVIBuilder = SCons.Builder.Builder(action = {},
- source_scanner = SCons.Tool.LaTeXScanner,
- suffix = '.dvi',
- emitter = {},
- source_ext_match = None)
-
- env['BUILDERS']['DVI'] = DVIBuilder
-
-def exists(env):
- # This only puts a skeleton Builder in place, so if someone
- # references this Tool directly, it's always "available."
- return 1
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/dvipdf.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/dvipdf.py
deleted file mode 100644
index 0a6dde7..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/dvipdf.py
+++ /dev/null
@@ -1,125 +0,0 @@
-"""SCons.Tool.dvipdf
-
-Tool-specific initialization for dvipdf.
-
-There normally shouldn't be any need to import this module directly.
-It will usually be imported through the generic SCons.Tool.Tool()
-selection method.
-
-"""
-
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-__revision__ = "src/engine/SCons/Tool/dvipdf.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-import SCons.Action
-import SCons.Defaults
-import SCons.Tool.pdf
-import SCons.Tool.tex
-import SCons.Util
-
-_null = SCons.Scanner.LaTeX._null
-
-def DviPdfPsFunction(XXXDviAction, target = None, source= None, env=None):
- """A builder for DVI files that sets the TEXPICTS environment
- variable before running dvi2ps or dvipdf."""
-
- try:
- abspath = source[0].attributes.path
- except AttributeError :
- abspath = ''
-
- saved_env = SCons.Scanner.LaTeX.modify_env_var(env, 'TEXPICTS', abspath)
-
- result = XXXDviAction(target, source, env)
-
- if saved_env is _null:
- try:
- del env['ENV']['TEXPICTS']
- except KeyError:
- pass # was never set
- else:
- env['ENV']['TEXPICTS'] = saved_env
-
- return result
-
-def DviPdfFunction(target = None, source= None, env=None):
- result = DviPdfPsFunction(PDFAction,target,source,env)
- return result
-
-def DviPdfStrFunction(target = None, source= None, env=None):
- """A strfunction for dvipdf that returns the appropriate
- command string for the no_exec options."""
- if env.GetOption("no_exec"):
- result = env.subst('$DVIPDFCOM',0,target,source)
- else:
- result = ''
- return result
-
-PDFAction = None
-DVIPDFAction = None
-
-def PDFEmitter(target, source, env):
- """Strips any .aux or .log files from the input source list.
- These are created by the TeX Builder that in all likelihood was
- used to generate the .dvi file we're using as input, and we only
- care about the .dvi file.
- """
- def strip_suffixes(n):
- return not SCons.Util.splitext(str(n))[1] in ['.aux', '.log']
- source = list(filter(strip_suffixes, source))
- return (target, source)
-
-def generate(env):
- """Add Builders and construction variables for dvipdf to an Environment."""
- global PDFAction
- if PDFAction is None:
- PDFAction = SCons.Action.Action('$DVIPDFCOM', '$DVIPDFCOMSTR')
-
- global DVIPDFAction
- if DVIPDFAction is None:
- DVIPDFAction = SCons.Action.Action(DviPdfFunction, strfunction = DviPdfStrFunction)
-
- import pdf
- pdf.generate(env)
-
- bld = env['BUILDERS']['PDF']
- bld.add_action('.dvi', DVIPDFAction)
- bld.add_emitter('.dvi', PDFEmitter)
-
- env['DVIPDF'] = 'dvipdf'
- env['DVIPDFFLAGS'] = SCons.Util.CLVar('')
- env['DVIPDFCOM'] = 'cd ${TARGET.dir} && $DVIPDF $DVIPDFFLAGS ${SOURCE.file} ${TARGET.file}'
-
- # Deprecated synonym.
- env['PDFCOM'] = ['$DVIPDFCOM']
-
-def exists(env):
- SCons.Tool.tex.generate_darwin(env)
- return env.Detect('dvipdf')
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/dvips.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/dvips.py
deleted file mode 100644
index f72f2fe..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/dvips.py
+++ /dev/null
@@ -1,95 +0,0 @@
-"""SCons.Tool.dvips
-
-Tool-specific initialization for dvips.
-
-There normally shouldn't be any need to import this module directly.
-It will usually be imported through the generic SCons.Tool.Tool()
-selection method.
-
-"""
-
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-
-__revision__ = "src/engine/SCons/Tool/dvips.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-import SCons.Action
-import SCons.Builder
-import SCons.Tool.dvipdf
-import SCons.Util
-
-def DviPsFunction(target = None, source= None, env=None):
- result = SCons.Tool.dvipdf.DviPdfPsFunction(PSAction,target,source,env)
- return result
-
-def DviPsStrFunction(target = None, source= None, env=None):
- """A strfunction for dvipdf that returns the appropriate
- command string for the no_exec options."""
- if env.GetOption("no_exec"):
- result = env.subst('$PSCOM',0,target,source)
- else:
- result = ''
- return result
-
-PSAction = None
-DVIPSAction = None
-PSBuilder = None
-
-def generate(env):
- """Add Builders and construction variables for dvips to an Environment."""
- global PSAction
- if PSAction is None:
- PSAction = SCons.Action.Action('$PSCOM', '$PSCOMSTR')
-
- global DVIPSAction
- if DVIPSAction is None:
- DVIPSAction = SCons.Action.Action(DviPsFunction, strfunction = DviPsStrFunction)
-
- global PSBuilder
- if PSBuilder is None:
- PSBuilder = SCons.Builder.Builder(action = PSAction,
- prefix = '$PSPREFIX',
- suffix = '$PSSUFFIX',
- src_suffix = '.dvi',
- src_builder = 'DVI',
- single_source=True)
-
- env['BUILDERS']['PostScript'] = PSBuilder
-
- env['DVIPS'] = 'dvips'
- env['DVIPSFLAGS'] = SCons.Util.CLVar('')
- # I'm not quite sure I got the directories and filenames right for variant_dir
- # We need to be in the correct directory for the sake of latex \includegraphics eps included files.
- env['PSCOM'] = 'cd ${TARGET.dir} && $DVIPS $DVIPSFLAGS -o ${TARGET.file} ${SOURCE.file}'
- env['PSPREFIX'] = ''
- env['PSSUFFIX'] = '.ps'
-
-def exists(env):
- SCons.Tool.tex.generate_darwin(env)
- return env.Detect('dvips')
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/f03.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/f03.py
deleted file mode 100644
index 77165ad..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/f03.py
+++ /dev/null
@@ -1,63 +0,0 @@
-"""engine.SCons.Tool.f03
-
-Tool-specific initialization for the generic Posix f03 Fortran compiler.
-
-There normally shouldn't be any need to import this module directly.
-It will usually be imported through the generic SCons.Tool.Tool()
-selection method.
-
-"""
-
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-
-__revision__ = "src/engine/SCons/Tool/f03.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-import SCons.Defaults
-import SCons.Tool
-import SCons.Util
-import fortran
-from SCons.Tool.FortranCommon import add_all_to_env, add_f03_to_env
-
-compilers = ['f03']
-
-def generate(env):
- add_all_to_env(env)
- add_f03_to_env(env)
-
- fcomp = env.Detect(compilers) or 'f03'
- env['F03'] = fcomp
- env['SHF03'] = fcomp
-
- env['FORTRAN'] = fcomp
- env['SHFORTRAN'] = fcomp
-
-
-def exists(env):
- return env.Detect(compilers)
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/f77.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/f77.py
deleted file mode 100644
index 593c517..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/f77.py
+++ /dev/null
@@ -1,62 +0,0 @@
-"""engine.SCons.Tool.f77
-
-Tool-specific initialization for the generic Posix f77 Fortran compiler.
-
-There normally shouldn't be any need to import this module directly.
-It will usually be imported through the generic SCons.Tool.Tool()
-selection method.
-
-"""
-
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-
-__revision__ = "src/engine/SCons/Tool/f77.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-import SCons.Defaults
-import SCons.Scanner.Fortran
-import SCons.Tool
-import SCons.Util
-from SCons.Tool.FortranCommon import add_all_to_env, add_f77_to_env
-
-compilers = ['f77']
-
-def generate(env):
- add_all_to_env(env)
- add_f77_to_env(env)
-
- fcomp = env.Detect(compilers) or 'f77'
- env['F77'] = fcomp
- env['SHF77'] = fcomp
-
- env['FORTRAN'] = fcomp
- env['SHFORTRAN'] = fcomp
-
-def exists(env):
- return env.Detect(compilers)
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/f90.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/f90.py
deleted file mode 100644
index c4a8df3..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/f90.py
+++ /dev/null
@@ -1,62 +0,0 @@
-"""engine.SCons.Tool.f90
-
-Tool-specific initialization for the generic Posix f90 Fortran compiler.
-
-There normally shouldn't be any need to import this module directly.
-It will usually be imported through the generic SCons.Tool.Tool()
-selection method.
-
-"""
-
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-
-__revision__ = "src/engine/SCons/Tool/f90.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-import SCons.Defaults
-import SCons.Scanner.Fortran
-import SCons.Tool
-import SCons.Util
-from SCons.Tool.FortranCommon import add_all_to_env, add_f90_to_env
-
-compilers = ['f90']
-
-def generate(env):
- add_all_to_env(env)
- add_f90_to_env(env)
-
- fc = env.Detect(compilers) or 'f90'
- env['F90'] = fc
- env['SHF90'] = fc
-
- env['FORTRAN'] = fc
- env['SHFORTRAN'] = fc
-
-def exists(env):
- return env.Detect(compilers)
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/f95.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/f95.py
deleted file mode 100644
index f361e1d..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/f95.py
+++ /dev/null
@@ -1,63 +0,0 @@
-"""engine.SCons.Tool.f95
-
-Tool-specific initialization for the generic Posix f95 Fortran compiler.
-
-There normally shouldn't be any need to import this module directly.
-It will usually be imported through the generic SCons.Tool.Tool()
-selection method.
-
-"""
-
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-
-__revision__ = "src/engine/SCons/Tool/f95.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-import SCons.Defaults
-import SCons.Tool
-import SCons.Util
-import fortran
-from SCons.Tool.FortranCommon import add_all_to_env, add_f95_to_env
-
-compilers = ['f95']
-
-def generate(env):
- add_all_to_env(env)
- add_f95_to_env(env)
-
- fcomp = env.Detect(compilers) or 'f95'
- env['F95'] = fcomp
- env['SHF95'] = fcomp
-
- env['FORTRAN'] = fcomp
- env['SHFORTRAN'] = fcomp
-
-
-def exists(env):
- return env.Detect(compilers)
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/filesystem.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/filesystem.py
deleted file mode 100644
index df57579..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/filesystem.py
+++ /dev/null
@@ -1,98 +0,0 @@
-"""SCons.Tool.filesystem
-
-Tool-specific initialization for the filesystem tools.
-
-There normally shouldn't be any need to import this module directly.
-It will usually be imported through the generic SCons.Tool.Tool()
-selection method.
-"""
-
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-
-__revision__ = "src/engine/SCons/Tool/filesystem.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-import SCons
-from SCons.Tool.install import copyFunc
-
-copyToBuilder, copyAsBuilder = None, None
-
-def copyto_emitter(target, source, env):
- """ changes the path of the source to be under the target (which
- are assumed to be directories.
- """
- n_target = []
-
- for t in target:
- n_target = n_target + [t.File( str( s ) ) for s in source]
-
- return (n_target, source)
-
-def copy_action_func(target, source, env):
- assert( len(target) == len(source) ), "\ntarget: %s\nsource: %s" %(list(map(str, target)),list(map(str, source)))
-
- for t, s in zip(target, source):
- if copyFunc(t.get_path(), s.get_path(), env):
- return 1
-
- return 0
-
-def copy_action_str(target, source, env):
- return env.subst_target_source(env['COPYSTR'], 0, target, source)
-
-copy_action = SCons.Action.Action( copy_action_func, copy_action_str )
-
-def generate(env):
- try:
- env['BUILDERS']['CopyTo']
- env['BUILDERS']['CopyAs']
- except KeyError, e:
- global copyToBuilder
- if copyToBuilder is None:
- copyToBuilder = SCons.Builder.Builder(
- action = copy_action,
- target_factory = env.fs.Dir,
- source_factory = env.fs.Entry,
- multi = 1,
- emitter = [ copyto_emitter, ] )
-
- global copyAsBuilder
- if copyAsBuilder is None:
- copyAsBuilder = SCons.Builder.Builder(
- action = copy_action,
- target_factory = env.fs.Entry,
- source_factory = env.fs.Entry )
-
- env['BUILDERS']['CopyTo'] = copyToBuilder
- env['BUILDERS']['CopyAs'] = copyAsBuilder
-
- env['COPYSTR'] = 'Copy file(s): "$SOURCES" to "$TARGETS"'
-
-def exists(env):
- return 1
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/fortran.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/fortran.py
deleted file mode 100644
index 7a51321..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/fortran.py
+++ /dev/null
@@ -1,62 +0,0 @@
-"""SCons.Tool.fortran
-
-Tool-specific initialization for a generic Posix f77/f90 Fortran compiler.
-
-There normally shouldn't be any need to import this module directly.
-It will usually be imported through the generic SCons.Tool.Tool()
-selection method.
-
-"""
-
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-
-__revision__ = "src/engine/SCons/Tool/fortran.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-import re
-
-import SCons.Action
-import SCons.Defaults
-import SCons.Scanner.Fortran
-import SCons.Tool
-import SCons.Util
-from SCons.Tool.FortranCommon import add_all_to_env, add_fortran_to_env
-
-compilers = ['f95', 'f90', 'f77']
-
-def generate(env):
- add_all_to_env(env)
- add_fortran_to_env(env)
-
- fc = env.Detect(compilers) or 'f77'
- env['SHFORTRAN'] = fc
- env['FORTRAN'] = fc
-
-def exists(env):
- return env.Detect(compilers)
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/g++.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/g++.py
deleted file mode 100644
index 8246862..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/g++.py
+++ /dev/null
@@ -1,80 +0,0 @@
-"""SCons.Tool.g++
-
-Tool-specific initialization for g++.
-
-There normally shouldn't be any need to import this module directly.
-It will usually be imported through the generic SCons.Tool.Tool()
-selection method.
-
-"""
-
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-
-__revision__ = "src/engine/SCons/Tool/g++.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-import os.path
-import re
-import subprocess
-
-import SCons.Tool
-import SCons.Util
-
-import gcc
-
-cplusplus = __import__('c++', globals(), locals(), [])
-
-compilers = ['g++']
-
-def generate(env):
- """Add Builders and construction variables for g++ to an Environment."""
- static_obj, shared_obj = SCons.Tool.createObjBuilders(env)
-
- if 'CXX' not in env:
- env['CXX'] = env.Detect(compilers) or compilers[0]
-
- cplusplus.generate(env)
-
- # platform specific settings
- if env['PLATFORM'] == 'aix':
- env['SHCXXFLAGS'] = SCons.Util.CLVar('$CXXFLAGS -mminimal-toc')
- env['STATIC_AND_SHARED_OBJECTS_ARE_THE_SAME'] = 1
- env['SHOBJSUFFIX'] = '$OBJSUFFIX'
- elif env['PLATFORM'] == 'hpux':
- env['SHOBJSUFFIX'] = '.pic.o'
- elif env['PLATFORM'] == 'sunos':
- env['SHOBJSUFFIX'] = '.pic.o'
- # determine compiler version
- version = gcc.detect_version(env, env['CXX'])
- if version:
- env['CXXVERSION'] = version
-
-def exists(env):
- # is executable, and is a GNU compiler (or accepts '--version' at least)
- return gcc.detect_version(env, env.Detect(env.get('CXX', compilers)))
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/g77.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/g77.py
deleted file mode 100644
index e09cf16..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/g77.py
+++ /dev/null
@@ -1,73 +0,0 @@
-"""engine.SCons.Tool.g77
-
-Tool-specific initialization for g77.
-
-There normally shouldn't be any need to import this module directly.
-It will usually be imported through the generic SCons.Tool.Tool()
-selection method.
-
-"""
-
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-
-__revision__ = "src/engine/SCons/Tool/g77.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-import SCons.Util
-from SCons.Tool.FortranCommon import add_all_to_env, add_f77_to_env
-
-compilers = ['g77', 'f77']
-
-def generate(env):
- """Add Builders and construction variables for g77 to an Environment."""
- add_all_to_env(env)
- add_f77_to_env(env)
-
- fcomp = env.Detect(compilers) or 'g77'
- if env['PLATFORM'] in ['cygwin', 'win32']:
- env['SHFORTRANFLAGS'] = SCons.Util.CLVar('$FORTRANFLAGS')
- env['SHF77FLAGS'] = SCons.Util.CLVar('$F77FLAGS')
- else:
- env['SHFORTRANFLAGS'] = SCons.Util.CLVar('$FORTRANFLAGS -fPIC')
- env['SHF77FLAGS'] = SCons.Util.CLVar('$F77FLAGS -fPIC')
-
- env['FORTRAN'] = fcomp
- env['SHFORTRAN'] = '$FORTRAN'
-
- env['F77'] = fcomp
- env['SHF77'] = '$F77'
-
- env['INCFORTRANPREFIX'] = "-I"
- env['INCFORTRANSUFFIX'] = ""
-
- env['INCF77PREFIX'] = "-I"
- env['INCF77SUFFIX'] = ""
-
-def exists(env):
- return env.Detect(compilers)
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/gas.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/gas.py
deleted file mode 100644
index f987b95..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/gas.py
+++ /dev/null
@@ -1,53 +0,0 @@
-"""SCons.Tool.gas
-
-Tool-specific initialization for as, the Gnu assembler.
-
-There normally shouldn't be any need to import this module directly.
-It will usually be imported through the generic SCons.Tool.Tool()
-selection method.
-
-"""
-
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-
-__revision__ = "src/engine/SCons/Tool/gas.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-as_module = __import__('as', globals(), locals(), [])
-
-assemblers = ['as', 'gas']
-
-def generate(env):
- """Add Builders and construction variables for as to an Environment."""
- as_module.generate(env)
-
- env['AS'] = env.Detect(assemblers) or 'as'
-
-def exists(env):
- return env.Detect(assemblers)
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/gcc.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/gcc.py
deleted file mode 100644
index d2375c6..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/gcc.py
+++ /dev/null
@@ -1,100 +0,0 @@
-"""SCons.Tool.gcc
-
-Tool-specific initialization for gcc.
-
-There normally shouldn't be any need to import this module directly.
-It will usually be imported through the generic SCons.Tool.Tool()
-selection method.
-
-"""
-
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-
-__revision__ = "src/engine/SCons/Tool/gcc.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-import cc
-import os
-import re
-import subprocess
-
-import SCons.Util
-
-compilers = ['gcc', 'cc']
-
-def generate(env):
- """Add Builders and construction variables for gcc to an Environment."""
-
- if 'CC' not in env:
- env['CC'] = env.Detect(compilers) or compilers[0]
-
- cc.generate(env)
-
- if env['PLATFORM'] in ['cygwin', 'win32']:
- env['SHCCFLAGS'] = SCons.Util.CLVar('$CCFLAGS')
- else:
- env['SHCCFLAGS'] = SCons.Util.CLVar('$CCFLAGS -fPIC')
- # determine compiler version
- version = detect_version(env, env['CC'])
- if version:
- env['CCVERSION'] = version
-
-def exists(env):
- # is executable, and is a GNU compiler (or accepts '--version' at least)
- return detect_version(env, env.Detect(env.get('CC', compilers)))
-
-def detect_version(env, cc):
- """Return the version of the GNU compiler, or None if it is not a GNU compiler."""
- cc = env.subst(cc)
- if not cc:
- return None
- version = None
- #pipe = SCons.Action._subproc(env, SCons.Util.CLVar(cc) + ['-dumpversion'],
- pipe = SCons.Action._subproc(env, SCons.Util.CLVar(cc) + ['--version'],
- stdin = 'devnull',
- stderr = 'devnull',
- stdout = subprocess.PIPE)
- # -dumpversion was added in GCC 3.0. As long as we're supporting
- # GCC versions older than that, we should use --version and a
- # regular expression.
- #line = pipe.stdout.read().strip()
- #if line:
- # version = line
- line = pipe.stdout.readline()
- match = re.search(r'[0-9]+(\.[0-9]+)+', line)
- if match:
- version = match.group(0)
- # Non-GNU compiler's output (like AIX xlc's) may exceed the stdout buffer:
- # So continue with reading to let the child process actually terminate.
- while pipe.stdout.readline():
- pass
- ret = pipe.wait()
- if ret != 0:
- return None
- return version
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/gdc.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/gdc.py
deleted file mode 100644
index 7a67501..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/gdc.py
+++ /dev/null
@@ -1,128 +0,0 @@
-"""SCons.Tool.gdc
-
-Tool-specific initialization for the GDC compiler.
-(https://github.com/D-Programming-GDC/GDC)
-
-Developed by Russel Winder (russel@winder.org.uk)
-2012-05-09 onwards
-
-Compiler variables:
- DC - The name of the D compiler to use. Defaults to gdc.
- DPATH - List of paths to search for import modules.
- DVERSIONS - List of version tags to enable when compiling.
- DDEBUG - List of debug tags to enable when compiling.
-
-Linker related variables:
- LIBS - List of library files to link in.
- DLINK - Name of the linker to use. Defaults to gdc.
- DLINKFLAGS - List of linker flags.
-
-Lib tool variables:
- DLIB - Name of the lib tool to use. Defaults to lib.
- DLIBFLAGS - List of flags to pass to the lib tool.
- LIBS - Same as for the linker. (libraries to pull into the .lib)
-"""
-
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-
-__revision__ = "src/engine/SCons/Tool/gdc.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-import SCons.Action
-import SCons.Defaults
-import SCons.Tool
-
-import SCons.Tool.DCommon
-
-
-def generate(env):
- static_obj, shared_obj = SCons.Tool.createObjBuilders(env)
-
- static_obj.add_action('.d', SCons.Defaults.DAction)
- shared_obj.add_action('.d', SCons.Defaults.ShDAction)
- static_obj.add_emitter('.d', SCons.Defaults.StaticObjectEmitter)
- shared_obj.add_emitter('.d', SCons.Defaults.SharedObjectEmitter)
-
- env['DC'] = env.Detect('gdc')
- env['DCOM'] = '$DC $_DINCFLAGS $_DVERFLAGS $_DDEBUGFLAGS $_DFLAGS -c -o $TARGET $SOURCES'
- env['_DINCFLAGS'] = '${_concat(DINCPREFIX, DPATH, DINCSUFFIX, __env__, RDirs, TARGET, SOURCE)}'
- env['_DVERFLAGS'] = '${_concat(DVERPREFIX, DVERSIONS, DVERSUFFIX, __env__)}'
- env['_DDEBUGFLAGS'] = '${_concat(DDEBUGPREFIX, DDEBUG, DDEBUGSUFFIX, __env__)}'
- env['_DFLAGS'] = '${_concat(DFLAGPREFIX, DFLAGS, DFLAGSUFFIX, __env__)}'
-
- env['SHDC'] = '$DC'
- env['SHDCOM'] = '$SHDC $_DINCFLAGS $_DVERFLAGS $_DDEBUGFLAGS $_DFLAGS -fPIC -c -o $TARGET $SOURCES'
-
- env['DPATH'] = ['#/']
- env['DFLAGS'] = []
- env['DVERSIONS'] = []
- env['DDEBUG'] = []
-
- if env['DC']:
- SCons.Tool.DCommon.addDPATHToEnv(env, env['DC'])
-
- env['DINCPREFIX'] = '-I'
- env['DINCSUFFIX'] = ''
- env['DVERPREFIX'] = '-version='
- env['DVERSUFFIX'] = ''
- env['DDEBUGPREFIX'] = '-debug='
- env['DDEBUGSUFFIX'] = ''
- env['DFLAGPREFIX'] = '-'
- env['DFLAGSUFFIX'] = ''
- env['DFILESUFFIX'] = '.d'
-
- env['DLINK'] = '$DC'
- env['DLINKFLAGS'] = SCons.Util.CLVar('')
- env['DLINKCOM'] = '$DLINK -o $TARGET $DLINKFLAGS $__RPATH $SOURCES $_LIBDIRFLAGS $_LIBFLAGS'
-
- env['DSHLINK'] = '$DC'
- env['DSHLINKFLAGS'] = SCons.Util.CLVar('$DLINKFLAGS -shared')
- env['SHDLINKCOM'] = '$DLINK -o $TARGET $DSHLINKFLAGS $__RPATH $SOURCES $_LIBDIRFLAGS $_LIBFLAGS'
-
- env['DLIB'] = 'lib' if env['PLATFORM'] == 'win32' else 'ar cr'
- env['DLIBCOM'] = '$DLIB $_DLIBFLAGS {0}$TARGET $SOURCES $_DLINKLIBFLAGS'.format('-c ' if env['PLATFORM'] == 'win32' else '')
-
- env['_DLIBFLAGS'] = '${_concat(DLIBFLAGPREFIX, DLIBFLAGS, DLIBFLAGSUFFIX, __env__)}'
-
- env['DLIBFLAGPREFIX'] = '-'
- env['DLIBFLAGSUFFIX'] = ''
- env['DLINKFLAGPREFIX'] = '-'
- env['DLINKFLAGSUFFIX'] = ''
-
- # __RPATH is set to $_RPATH in the platform specification if that
- # platform supports it.
- env['RPATHPREFIX'] = '-Wl,-rpath='
- env['RPATHSUFFIX'] = ''
- env['_RPATH'] = '${_concat(RPATHPREFIX, RPATH, RPATHSUFFIX, __env__)}'
-
- SCons.Tool.createStaticLibBuilder(env)
-
-
-def exists(env):
- return env.Detect('gdc')
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/gettext.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/gettext.py
deleted file mode 100644
index e53ebdb..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/gettext.py
+++ /dev/null
@@ -1,48 +0,0 @@
-"""gettext tool
-"""
-
-
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-__revision__ = "src/engine/SCons/Tool/gettext.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-#############################################################################
-def generate(env,**kw):
- import SCons.Tool
- from SCons.Tool.GettextCommon \
- import _translate, tool_list
- for t in tool_list(env['PLATFORM'], env):
- env.Tool(t)
- env.AddMethod(_translate, 'Translate')
-#############################################################################
-
-#############################################################################
-def exists(env):
- from SCons.Tool.GettextCommon \
- import _xgettext_exists, _msginit_exists, \
- _msgmerge_exists, _msgfmt_exists
- try:
- return _xgettext_exists(env) and _msginit_exists(env) \
- and _msgmerge_exists(env) and _msgfmt_exists(env)
- except:
- return False
-#############################################################################
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/gfortran.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/gfortran.py
deleted file mode 100644
index 02da302..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/gfortran.py
+++ /dev/null
@@ -1,64 +0,0 @@
-"""SCons.Tool.gfortran
-
-Tool-specific initialization for gfortran, the GNU Fortran 95/Fortran
-2003 compiler.
-
-There normally shouldn't be any need to import this module directly.
-It will usually be imported through the generic SCons.Tool.Tool()
-selection method.
-
-"""
-
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-
-__revision__ = "src/engine/SCons/Tool/gfortran.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-import SCons.Util
-
-import fortran
-
-def generate(env):
- """Add Builders and construction variables for gfortran to an
- Environment."""
- fortran.generate(env)
-
- for dialect in ['F77', 'F90', 'FORTRAN', 'F95', 'F03', 'F08']:
- env['%s' % dialect] = 'gfortran'
- env['SH%s' % dialect] = '$%s' % dialect
- if env['PLATFORM'] in ['cygwin', 'win32']:
- env['SH%sFLAGS' % dialect] = SCons.Util.CLVar('$%sFLAGS' % dialect)
- else:
- env['SH%sFLAGS' % dialect] = SCons.Util.CLVar('$%sFLAGS -fPIC' % dialect)
-
- env['INC%sPREFIX' % dialect] = "-I"
- env['INC%sSUFFIX' % dialect] = ""
-
-def exists(env):
- return env.Detect('gfortran')
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/gnulink.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/gnulink.py
deleted file mode 100644
index 81c0130..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/gnulink.py
+++ /dev/null
@@ -1,67 +0,0 @@
-"""SCons.Tool.gnulink
-
-Tool-specific initialization for the gnu linker.
-
-There normally shouldn't be any need to import this module directly.
-It will usually be imported through the generic SCons.Tool.Tool()
-selection method.
-
-"""
-
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-
-__revision__ = "src/engine/SCons/Tool/gnulink.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-import SCons.Util
-
-import link
-
-def generate(env):
- """Add Builders and construction variables for gnulink to an Environment."""
- link.generate(env)
-
- if env['PLATFORM'] == 'hpux':
- env['SHLINKFLAGS'] = SCons.Util.CLVar('$LINKFLAGS -shared -fPIC')
-
- # __RPATH is set to $_RPATH in the platform specification if that
- # platform supports it.
- env['RPATHPREFIX'] = '-Wl,-rpath='
- env['RPATHSUFFIX'] = ''
- env['_RPATH'] = '${_concat(RPATHPREFIX, RPATH, RPATHSUFFIX, __env__)}'
-
-def exists(env):
- # TODO: sync with link.smart_link() to choose a linker
- linkers = { 'CXX': ['g++'], 'CC': ['gcc'] }
- alltools = []
- for langvar, linktools in linkers.items():
- if langvar in env: # use CC over CXX when user specified CC but not CXX
- return SCons.Tool.FindTool(linktools, env)
- alltools.extend(linktools)
- return SCons.Tool.FindTool(alltools, env) # find CXX or CC
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/gs.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/gs.py
deleted file mode 100644
index 3e2eecc..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/gs.py
+++ /dev/null
@@ -1,91 +0,0 @@
-"""SCons.Tool.gs
-
-Tool-specific initialization for Ghostscript.
-
-There normally shouldn't be any need to import this module directly.
-It will usually be imported through the generic SCons.Tool.Tool()
-selection method.
-
-"""
-
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-
-__revision__ = "src/engine/SCons/Tool/gs.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-import SCons.Action
-import SCons.Builder
-import SCons.Platform
-import SCons.Util
-
-# Ghostscript goes by different names on different platforms...
-platform = SCons.Platform.platform_default()
-
-if platform == 'os2':
- gs = 'gsos2'
-elif platform == 'win32':
- gs = 'gswin32c'
-else:
- gs = 'gs'
-
-GhostscriptAction = None
-
-def generate(env):
- """Add Builders and construction variables for Ghostscript to an
- Environment."""
- global GhostscriptAction
- # The following try-except block enables us to use the Tool
- # in standalone mode (without the accompanying pdf.py),
- # whenever we need an explicit call of gs via the Gs()
- # Builder ...
- try:
- if GhostscriptAction is None:
- GhostscriptAction = SCons.Action.Action('$GSCOM', '$GSCOMSTR')
-
- import pdf
- pdf.generate(env)
-
- bld = env['BUILDERS']['PDF']
- bld.add_action('.ps', GhostscriptAction)
- except ImportError, e:
- pass
-
- gsbuilder = SCons.Builder.Builder(action = SCons.Action.Action('$GSCOM', '$GSCOMSTR'))
- env['BUILDERS']['Gs'] = gsbuilder
-
- env['GS'] = gs
- env['GSFLAGS'] = SCons.Util.CLVar('-dNOPAUSE -dBATCH -sDEVICE=pdfwrite')
- env['GSCOM'] = '$GS $GSFLAGS -sOutputFile=$TARGET $SOURCES'
-
-
-def exists(env):
- if 'PS2PDF' in env:
- return env.Detect(env['PS2PDF'])
- else:
- return env.Detect(gs) or SCons.Util.WhereIs(gs)
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/hpc++.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/hpc++.py
deleted file mode 100644
index eb23e94..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/hpc++.py
+++ /dev/null
@@ -1,84 +0,0 @@
-"""SCons.Tool.hpc++
-
-Tool-specific initialization for c++ on HP/UX.
-
-There normally shouldn't be any need to import this module directly.
-It will usually be imported through the generic SCons.Tool.Tool()
-selection method.
-
-"""
-
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-
-__revision__ = "src/engine/SCons/Tool/hpc++.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-import os.path
-
-import SCons.Util
-
-cplusplus = __import__('c++', globals(), locals(), [])
-
-acc = None
-
-# search for the acc compiler and linker front end
-
-try:
- dirs = os.listdir('/opt')
-except (IOError, OSError):
- # Not being able to read the directory because it doesn't exist
- # (IOError) or isn't readable (OSError) is okay.
- dirs = []
-
-for dir in dirs:
- cc = '/opt/' + dir + '/bin/aCC'
- if os.path.exists(cc):
- acc = cc
- break
-
-
-def generate(env):
- """Add Builders and construction variables for g++ to an Environment."""
- cplusplus.generate(env)
-
- if acc:
- env['CXX'] = acc or 'aCC'
- env['SHCXXFLAGS'] = SCons.Util.CLVar('$CXXFLAGS +Z')
- # determine version of aCC
- line = os.popen(acc + ' -V 2>&1').readline().rstrip()
- if line.find('aCC: HP ANSI C++') == 0:
- env['CXXVERSION'] = line.split()[-1]
-
- if env['PLATFORM'] == 'cygwin':
- env['SHCXXFLAGS'] = SCons.Util.CLVar('$CXXFLAGS')
- else:
- env['SHCXXFLAGS'] = SCons.Util.CLVar('$CXXFLAGS +Z')
-
-def exists(env):
- return acc
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/hpcc.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/hpcc.py
deleted file mode 100644
index 827460d..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/hpcc.py
+++ /dev/null
@@ -1,53 +0,0 @@
-"""SCons.Tool.hpcc
-
-Tool-specific initialization for HP aCC and cc.
-
-There normally shouldn't be any need to import this module directly.
-It will usually be imported through the generic SCons.Tool.Tool()
-selection method.
-"""
-
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-
-__revision__ = "src/engine/SCons/Tool/hpcc.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-import SCons.Util
-
-import cc
-
-def generate(env):
- """Add Builders and construction variables for aCC & cc to an Environment."""
- cc.generate(env)
-
- env['CXX'] = 'aCC'
- env['SHCCFLAGS'] = SCons.Util.CLVar('$CCFLAGS +Z')
-
-def exists(env):
- return env.Detect('aCC')
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/hplink.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/hplink.py
deleted file mode 100644
index e3512a2..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/hplink.py
+++ /dev/null
@@ -1,77 +0,0 @@
-"""SCons.Tool.hplink
-
-Tool-specific initialization for the HP linker.
-
-There normally shouldn't be any need to import this module directly.
-It will usually be imported through the generic SCons.Tool.Tool()
-selection method.
-"""
-
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-
-__revision__ = "src/engine/SCons/Tool/hplink.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-import os
-import os.path
-
-import SCons.Util
-
-import link
-
-ccLinker = None
-
-# search for the acc compiler and linker front end
-
-try:
- dirs = os.listdir('/opt')
-except (IOError, OSError):
- # Not being able to read the directory because it doesn't exist
- # (IOError) or isn't readable (OSError) is okay.
- dirs = []
-
-for dir in dirs:
- linker = '/opt/' + dir + '/bin/aCC'
- if os.path.exists(linker):
- ccLinker = linker
- break
-
-def generate(env):
- """
- Add Builders and construction variables for Visual Age linker to
- an Environment.
- """
- link.generate(env)
-
- env['LINKFLAGS'] = SCons.Util.CLVar('-Wl,+s -Wl,+vnocompatwarnings')
- env['SHLINKFLAGS'] = SCons.Util.CLVar('$LINKFLAGS -b')
- env['SHLIBSUFFIX'] = '.sl'
-
-def exists(env):
- return ccLinker
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/icc.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/icc.py
deleted file mode 100644
index d6e3663..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/icc.py
+++ /dev/null
@@ -1,59 +0,0 @@
-"""engine.SCons.Tool.icc
-
-Tool-specific initialization for the OS/2 icc compiler.
-
-There normally shouldn't be any need to import this module directly.
-It will usually be imported through the generic SCons.Tool.Tool()
-selection method.
-
-"""
-
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-
-__revision__ = "src/engine/SCons/Tool/icc.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-import cc
-
-def generate(env):
- """Add Builders and construction variables for the OS/2 to an Environment."""
- cc.generate(env)
-
- env['CC'] = 'icc'
- env['CCCOM'] = '$CC $CFLAGS $CCFLAGS $CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS /c $SOURCES /Fo$TARGET'
- env['CXXCOM'] = '$CXX $CXXFLAGS $CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS /c $SOURCES /Fo$TARGET'
- env['CPPDEFPREFIX'] = '/D'
- env['CPPDEFSUFFIX'] = ''
- env['INCPREFIX'] = '/I'
- env['INCSUFFIX'] = ''
- env['CFILESUFFIX'] = '.c'
- env['CXXFILESUFFIX'] = '.cc'
-
-def exists(env):
- return env.Detect('icc')
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/icl.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/icl.py
deleted file mode 100644
index 88c6881..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/icl.py
+++ /dev/null
@@ -1,52 +0,0 @@
-"""engine.SCons.Tool.icl
-
-Tool-specific initialization for the Intel C/C++ compiler.
-
-There normally shouldn't be any need to import this module directly.
-It will usually be imported through the generic SCons.Tool.Tool()
-selection method.
-
-"""
-
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-
-__revision__ = "src/engine/SCons/Tool/icl.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-import SCons.Tool.intelc
-
-# This has been completely superceded by intelc.py, which can
-# handle both Windows and Linux versions.
-
-def generate(*args, **kw):
- """Add Builders and construction variables for icl to an Environment."""
- return SCons.Tool.intelc.generate(*args, **kw)
-
-def exists(*args, **kw):
- return SCons.Tool.intelc.exists(*args, **kw)
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/ifl.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/ifl.py
deleted file mode 100644
index ef5bdd6..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/ifl.py
+++ /dev/null
@@ -1,72 +0,0 @@
-"""SCons.Tool.ifl
-
-Tool-specific initialization for the Intel Fortran compiler.
-
-There normally shouldn't be any need to import this module directly.
-It will usually be imported through the generic SCons.Tool.Tool()
-selection method.
-
-"""
-
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-
-__revision__ = "src/engine/SCons/Tool/ifl.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-import SCons.Defaults
-from SCons.Scanner.Fortran import FortranScan
-from FortranCommon import add_all_to_env
-
-def generate(env):
- """Add Builders and construction variables for ifl to an Environment."""
- fscan = FortranScan("FORTRANPATH")
- SCons.Tool.SourceFileScanner.add_scanner('.i', fscan)
- SCons.Tool.SourceFileScanner.add_scanner('.i90', fscan)
-
- if 'FORTRANFILESUFFIXES' not in env:
- env['FORTRANFILESUFFIXES'] = ['.i']
- else:
- env['FORTRANFILESUFFIXES'].append('.i')
-
- if 'F90FILESUFFIXES' not in env:
- env['F90FILESUFFIXES'] = ['.i90']
- else:
- env['F90FILESUFFIXES'].append('.i90')
-
- add_all_to_env(env)
-
- env['FORTRAN'] = 'ifl'
- env['SHFORTRAN'] = '$FORTRAN'
- env['FORTRANCOM'] = '$FORTRAN $FORTRANFLAGS $_FORTRANINCFLAGS /c $SOURCES /Fo$TARGET'
- env['FORTRANPPCOM'] = '$FORTRAN $FORTRANFLAGS $CPPFLAGS $_CPPDEFFLAGS $_FORTRANINCFLAGS /c $SOURCES /Fo$TARGET'
- env['SHFORTRANCOM'] = '$SHFORTRAN $SHFORTRANFLAGS $_FORTRANINCFLAGS /c $SOURCES /Fo$TARGET'
- env['SHFORTRANPPCOM'] = '$SHFORTRAN $SHFORTRANFLAGS $CPPFLAGS $_CPPDEFFLAGS $_FORTRANINCFLAGS /c $SOURCES /Fo$TARGET'
-
-def exists(env):
- return env.Detect('ifl')
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/ifort.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/ifort.py
deleted file mode 100644
index 275c5c8..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/ifort.py
+++ /dev/null
@@ -1,88 +0,0 @@
-"""SCons.Tool.ifort
-
-Tool-specific initialization for newer versions of the Intel Fortran Compiler
-for Linux/Windows (and possibly Mac OS X).
-
-There normally shouldn't be any need to import this module directly.
-It will usually be imported through the generic SCons.Tool.Tool()
-selection method.
-
-"""
-
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-
-__revision__ = "src/engine/SCons/Tool/ifort.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-import SCons.Defaults
-from SCons.Scanner.Fortran import FortranScan
-from FortranCommon import add_all_to_env
-
-def generate(env):
- """Add Builders and construction variables for ifort to an Environment."""
- # ifort supports Fortran 90 and Fortran 95
- # Additionally, ifort recognizes more file extensions.
- fscan = FortranScan("FORTRANPATH")
- SCons.Tool.SourceFileScanner.add_scanner('.i', fscan)
- SCons.Tool.SourceFileScanner.add_scanner('.i90', fscan)
-
- if 'FORTRANFILESUFFIXES' not in env:
- env['FORTRANFILESUFFIXES'] = ['.i']
- else:
- env['FORTRANFILESUFFIXES'].append('.i')
-
- if 'F90FILESUFFIXES' not in env:
- env['F90FILESUFFIXES'] = ['.i90']
- else:
- env['F90FILESUFFIXES'].append('.i90')
-
- add_all_to_env(env)
-
- fc = 'ifort'
-
- for dialect in ['F77', 'F90', 'FORTRAN', 'F95']:
- env['%s' % dialect] = fc
- env['SH%s' % dialect] = '$%s' % dialect
- if env['PLATFORM'] == 'posix':
- env['SH%sFLAGS' % dialect] = SCons.Util.CLVar('$%sFLAGS -fPIC' % dialect)
-
- if env['PLATFORM'] == 'win32':
- # On Windows, the ifort compiler specifies the object on the
- # command line with -object:, not -o. Massage the necessary
- # command-line construction variables.
- for dialect in ['F77', 'F90', 'FORTRAN', 'F95']:
- for var in ['%sCOM' % dialect, '%sPPCOM' % dialect,
- 'SH%sCOM' % dialect, 'SH%sPPCOM' % dialect]:
- env[var] = env[var].replace('-o $TARGET', '-object:$TARGET')
- env['FORTRANMODDIRPREFIX'] = "/module:"
- else:
- env['FORTRANMODDIRPREFIX'] = "-module "
-
-def exists(env):
- return env.Detect('ifort')
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/ilink.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/ilink.py
deleted file mode 100644
index b2c3513..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/ilink.py
+++ /dev/null
@@ -1,59 +0,0 @@
-"""SCons.Tool.ilink
-
-Tool-specific initialization for the OS/2 ilink linker.
-
-There normally shouldn't be any need to import this module directly.
-It will usually be imported through the generic SCons.Tool.Tool()
-selection method.
-
-"""
-
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-
-__revision__ = "src/engine/SCons/Tool/ilink.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-import SCons.Defaults
-import SCons.Tool
-import SCons.Util
-
-def generate(env):
- """Add Builders and construction variables for ilink to an Environment."""
- SCons.Tool.createProgBuilder(env)
-
- env['LINK'] = 'ilink'
- env['LINKFLAGS'] = SCons.Util.CLVar('')
- env['LINKCOM'] = '$LINK $LINKFLAGS /O:$TARGET $SOURCES $_LIBDIRFLAGS $_LIBFLAGS'
- env['LIBDIRPREFIX']='/LIBPATH:'
- env['LIBDIRSUFFIX']=''
- env['LIBLINKPREFIX']=''
- env['LIBLINKSUFFIX']='$LIBSUFFIX'
-
-def exists(env):
- return env.Detect('ilink')
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/ilink32.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/ilink32.py
deleted file mode 100644
index a2f1e67..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/ilink32.py
+++ /dev/null
@@ -1,60 +0,0 @@
-"""SCons.Tool.ilink32
-
-XXX
-
-"""
-
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-
-__revision__ = "src/engine/SCons/Tool/ilink32.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-import SCons.Tool
-import SCons.Tool.bcc32
-import SCons.Util
-
-def generate(env):
- """Add Builders and construction variables for Borland ilink to an
- Environment."""
- SCons.Tool.createSharedLibBuilder(env)
- SCons.Tool.createProgBuilder(env)
-
- env['LINK'] = '$CC'
- env['LINKFLAGS'] = SCons.Util.CLVar('')
- env['LINKCOM'] = '$LINK -q $LINKFLAGS -e$TARGET $SOURCES $LIBS'
- env['LIBDIRPREFIX']=''
- env['LIBDIRSUFFIX']=''
- env['LIBLINKPREFIX']=''
- env['LIBLINKSUFFIX']='$LIBSUFFIX'
-
-
-def exists(env):
- # Uses bcc32 to do linking as it generally knows where the standard
- # LIBS are and set up the linking correctly
- return SCons.Tool.bcc32.findIt('bcc32', env)
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/install.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/install.py
deleted file mode 100644
index 0b3642c..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/install.py
+++ /dev/null
@@ -1,501 +0,0 @@
-"""SCons.Tool.install
-
-Tool-specific initialization for the install tool.
-
-There normally shouldn't be any need to import this module directly.
-It will usually be imported through the generic SCons.Tool.Tool()
-selection method.
-"""
-
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-
-__revision__ = "src/engine/SCons/Tool/install.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-import os
-import re
-import shutil
-import stat
-
-import SCons.Action
-from SCons.Util import make_path_relative
-
-#
-# We keep track of *all* installed files.
-_INSTALLED_FILES = []
-_UNIQUE_INSTALLED_FILES = None
-
-class CopytreeError(EnvironmentError):
- pass
-
-# This is a patched version of shutil.copytree from python 2.5. It
-# doesn't fail if the dir exists, which regular copytree does
-# (annoyingly). Note the XXX comment in the docstring.
-def scons_copytree(src, dst, symlinks=False):
- """Recursively copy a directory tree using copy2().
-
- The destination directory must not already exist.
- If exception(s) occur, an CopytreeError is raised with a list of reasons.
-
- If the optional symlinks flag is true, symbolic links in the
- source tree result in symbolic links in the destination tree; if
- it is false, the contents of the files pointed to by symbolic
- links are copied.
-
- XXX Consider this example code rather than the ultimate tool.
-
- """
- names = os.listdir(src)
- # garyo@genarts.com fix: check for dir before making dirs.
- if not os.path.exists(dst):
- os.makedirs(dst)
- errors = []
- for name in names:
- srcname = os.path.join(src, name)
- dstname = os.path.join(dst, name)
- try:
- if symlinks and os.path.islink(srcname):
- linkto = os.readlink(srcname)
- os.symlink(linkto, dstname)
- elif os.path.isdir(srcname):
- scons_copytree(srcname, dstname, symlinks)
- else:
- shutil.copy2(srcname, dstname)
- # XXX What about devices, sockets etc.?
- except (IOError, os.error), why:
- errors.append((srcname, dstname, str(why)))
- # catch the CopytreeError from the recursive copytree so that we can
- # continue with other files
- except CopytreeError, err:
- errors.extend(err.args[0])
- try:
- shutil.copystat(src, dst)
- except WindowsError:
- # can't copy file access times on Windows
- pass
- except OSError, why:
- errors.extend((src, dst, str(why)))
- if errors:
- raise CopytreeError, errors
-
-
-#
-# Functions doing the actual work of the Install Builder.
-#
-def copyFunc(dest, source, env):
- """Install a source file or directory into a destination by copying,
- (including copying permission/mode bits)."""
-
- if os.path.isdir(source):
- if os.path.exists(dest):
- if not os.path.isdir(dest):
- raise SCons.Errors.UserError("cannot overwrite non-directory `%s' with a directory `%s'" % (str(dest), str(source)))
- else:
- parent = os.path.split(dest)[0]
- if not os.path.exists(parent):
- os.makedirs(parent)
- scons_copytree(source, dest)
- else:
- shutil.copy2(source, dest)
- st = os.stat(source)
- os.chmod(dest, stat.S_IMODE(st[stat.ST_MODE]) | stat.S_IWRITE)
-
- return 0
-
-#
-# Functions doing the actual work of the InstallVersionedLib Builder.
-#
-def copyFuncVersionedLib(dest, source, env):
- """Install a versioned library into a destination by copying,
- (including copying permission/mode bits) and then creating
- required symlinks."""
-
- if os.path.isdir(source):
- raise SCons.Errors.UserError("cannot install directory `%s' as a version library" % str(source) )
- else:
- # remove the link if it is already there
- try:
- os.remove(dest)
- except:
- pass
- shutil.copy2(source, dest)
- st = os.stat(source)
- os.chmod(dest, stat.S_IMODE(st[stat.ST_MODE]) | stat.S_IWRITE)
- versionedLibLinks(dest, source, env)
-
- return 0
-
-def versionedLibVersion(dest, source, env):
- """Check if dest is a version shared library name. Return version, libname, & install_dir if it is."""
- Verbose = False
- platform = env.subst('$PLATFORM')
- if not (platform == 'posix' or platform == 'darwin' or platform == 'sunos'):
- return (None, None, None)
-
- if (hasattr(source[0], 'attributes') and
- hasattr(source[0].attributes, 'shlibname')):
- libname = source[0].attributes.shlibname
- else:
- libname = os.path.basename(str(dest))
- install_dir = os.path.dirname(str(dest))
- shlib_suffix = env.subst('$SHLIBSUFFIX')
- # See if the source name is a versioned shared library, get the version number
- result = False
-
- version_re = re.compile("[0-9]+\\.[0-9]+\\.[0-9a-zA-Z]+")
- version_File = None
- if platform == 'posix' or platform == 'sunos':
- # handle unix names
- versioned_re = re.compile(re.escape(shlib_suffix + '.') + "[0-9]+\\.[0-9]+\\.[0-9a-zA-Z]+")
- result = versioned_re.findall(libname)
- if result:
- version_File = version_re.findall(versioned_re.findall(libname)[-1])[-1]
- elif platform == 'darwin':
- # handle OSX names
- versioned_re = re.compile("\\.[0-9]+\\.[0-9]+\\.[0-9a-zA-Z]+" + re.escape(shlib_suffix) )
- result = versioned_re.findall(libname)
- if result:
- version_File = version_re.findall(versioned_re.findall(libname)[-1])[-1]
-
- if Verbose:
- print "install: version_File ", version_File
- # result is False if we did not find a versioned shared library name, so return and empty list
- if not result:
- return (None, libname, install_dir)
-
- version = None
- # get version number from the environment
- try:
- version = env.subst('$SHLIBVERSION')
- except KeyError:
- version = None
-
- if version != version_File:
- #raise SCons.Errors.UserError("SHLIBVERSION '%s' does not match the version # '%s' in the filename" % (version, version_File) )
- print "SHLIBVERSION '%s' does not match the version # '%s' in the filename, proceeding based on file name" % (version, version_File)
- version = version_File
- return (version, libname, install_dir)
-
-def versionedLibLinks(dest, source, env):
- """If we are installing a versioned shared library create the required links."""
- Verbose = False
- linknames = []
- version, libname, install_dir = versionedLibVersion(dest, source, env)
-
- if version != None:
- # libname includes the version number if one was given
- linknames = SCons.Tool.VersionShLibLinkNames(version,libname,env)
- if Verbose:
- print "versionedLibLinks: linknames ",linknames
- # Here we just need the file name w/o path as the target of the link
- lib_ver = libname
- # make symlink of adjacent names in linknames
- for count in range(len(linknames)):
- linkname = linknames[count]
- fulllinkname = os.path.join(install_dir, linkname)
- if Verbose:
- print "full link name ",fulllinkname
- if count > 0:
- try:
- os.remove(lastlinkname)
- except:
- pass
- os.symlink(os.path.basename(fulllinkname),lastlinkname)
- if Verbose:
- print "versionedLibLinks: made sym link of %s -> %s" % (lastlinkname,os.path.basename(fulllinkname))
- lastlinkname = fulllinkname
- # finish chain of sym links with link to the actual library
- if len(linknames)>0:
- try:
- os.remove(lastlinkname)
- except:
- pass
- os.symlink(lib_ver,lastlinkname)
- if Verbose:
- print "versionedLibLinks: made sym link of %s -> %s" % (lib_ver,lastlinkname)
- return
-
-def installFunc(target, source, env):
- """Install a source file into a target using the function specified
- as the INSTALL construction variable."""
- try:
- install = env['INSTALL']
- except KeyError:
- raise SCons.Errors.UserError('Missing INSTALL construction variable.')
-
- assert len(target)==len(source), \
- "Installing source %s into target %s: target and source lists must have same length."%(list(map(str, source)), list(map(str, target)))
- for t,s in zip(target,source):
- if install(t.get_path(),s.get_path(),env):
- return 1
-
- return 0
-
-def installFuncVersionedLib(target, source, env):
- """Install a versioned library into a target using the function specified
- as the INSTALLVERSIONEDLIB construction variable."""
- try:
- install = env['INSTALLVERSIONEDLIB']
- except KeyError:
- raise SCons.Errors.UserError('Missing INSTALLVERSIONEDLIB construction variable.')
-
- assert len(target)==len(source), \
- "Installing source %s into target %s: target and source lists must have same length."%(list(map(str, source)), list(map(str, target)))
- for t,s in zip(target,source):
- if hasattr(t.attributes, 'shlibname'):
- tpath = os.path.join(t.get_dir(), t.attributes.shlibname)
- else:
- tpath = t.get_path()
- if install(tpath,s.get_path(),env):
- return 1
-
- return 0
-
-def stringFunc(target, source, env):
- installstr = env.get('INSTALLSTR')
- if installstr:
- return env.subst_target_source(installstr, 0, target, source)
- target = str(target[0])
- source = str(source[0])
- if os.path.isdir(source):
- type = 'directory'
- else:
- type = 'file'
- return 'Install %s: "%s" as "%s"' % (type, source, target)
-
-#
-# Emitter functions
-#
-def add_targets_to_INSTALLED_FILES(target, source, env):
- """ an emitter that adds all target files to the list stored in the
- _INSTALLED_FILES global variable. This way all installed files of one
- scons call will be collected.
- """
- global _INSTALLED_FILES, _UNIQUE_INSTALLED_FILES
- _INSTALLED_FILES.extend(target)
-
- _UNIQUE_INSTALLED_FILES = None
- return (target, source)
-
-def add_versioned_targets_to_INSTALLED_FILES(target, source, env):
- """ an emitter that adds all target files to the list stored in the
- _INSTALLED_FILES global variable. This way all installed files of one
- scons call will be collected.
- """
- global _INSTALLED_FILES, _UNIQUE_INSTALLED_FILES
- Verbose = False
- _INSTALLED_FILES.extend(target)
- if Verbose:
- print "ver lib emitter ",repr(target)
-
- # see if we have a versioned shared library, if so generate side effects
- version, libname, install_dir = versionedLibVersion(target[0], source, env)
- if version != None:
- # generate list of link names
- linknames = SCons.Tool.VersionShLibLinkNames(version,libname,env)
- for linkname in linknames:
- if Verbose:
- print "make side effect of %s" % os.path.join(install_dir, linkname)
- fulllinkname = os.path.join(install_dir, linkname)
- env.SideEffect(fulllinkname,target[0])
- env.Clean(target[0],fulllinkname)
- _INSTALLED_FILES.append(fulllinkname)
- if Verbose:
- print "installed list ", _INSTALLED_FILES
-
- _UNIQUE_INSTALLED_FILES = None
- return (target, source)
-
-class DESTDIR_factory(object):
- """ a node factory, where all files will be relative to the dir supplied
- in the constructor.
- """
- def __init__(self, env, dir):
- self.env = env
- self.dir = env.arg2nodes( dir, env.fs.Dir )[0]
-
- def Entry(self, name):
- name = make_path_relative(name)
- return self.dir.Entry(name)
-
- def Dir(self, name):
- name = make_path_relative(name)
- return self.dir.Dir(name)
-
-#
-# The Builder Definition
-#
-install_action = SCons.Action.Action(installFunc, stringFunc)
-installas_action = SCons.Action.Action(installFunc, stringFunc)
-installVerLib_action = SCons.Action.Action(installFuncVersionedLib, stringFunc)
-
-BaseInstallBuilder = None
-
-def InstallBuilderWrapper(env, target=None, source=None, dir=None, **kw):
- if target and dir:
- import SCons.Errors
- raise SCons.Errors.UserError("Both target and dir defined for Install(), only one may be defined.")
- if not dir:
- dir=target
-
- import SCons.Script
- install_sandbox = SCons.Script.GetOption('install_sandbox')
- if install_sandbox:
- target_factory = DESTDIR_factory(env, install_sandbox)
- else:
- target_factory = env.fs
-
- try:
- dnodes = env.arg2nodes(dir, target_factory.Dir)
- except TypeError:
- raise SCons.Errors.UserError("Target `%s' of Install() is a file, but should be a directory. Perhaps you have the Install() arguments backwards?" % str(dir))
- sources = env.arg2nodes(source, env.fs.Entry)
- tgt = []
- for dnode in dnodes:
- for src in sources:
- # Prepend './' so the lookup doesn't interpret an initial
- # '#' on the file name portion as meaning the Node should
- # be relative to the top-level SConstruct directory.
- target = env.fs.Entry('.'+os.sep+src.name, dnode)
- #tgt.extend(BaseInstallBuilder(env, target, src, **kw))
- tgt.extend(BaseInstallBuilder(env, target, src, **kw))
- return tgt
-
-def InstallAsBuilderWrapper(env, target=None, source=None, **kw):
- result = []
- for src, tgt in map(lambda x, y: (x, y), source, target):
- #result.extend(BaseInstallBuilder(env, tgt, src, **kw))
- result.extend(BaseInstallBuilder(env, tgt, src, **kw))
- return result
-
-BaseVersionedInstallBuilder = None
-
-def InstallVersionedBuilderWrapper(env, target=None, source=None, dir=None, **kw):
- if target and dir:
- import SCons.Errors
- raise SCons.Errors.UserError("Both target and dir defined for Install(), only one may be defined.")
- if not dir:
- dir=target
-
- import SCons.Script
- install_sandbox = SCons.Script.GetOption('install_sandbox')
- if install_sandbox:
- target_factory = DESTDIR_factory(env, install_sandbox)
- else:
- target_factory = env.fs
-
- try:
- dnodes = env.arg2nodes(dir, target_factory.Dir)
- except TypeError:
- raise SCons.Errors.UserError("Target `%s' of Install() is a file, but should be a directory. Perhaps you have the Install() arguments backwards?" % str(dir))
- sources = env.arg2nodes(source, env.fs.Entry)
- tgt = []
- for dnode in dnodes:
- for src in sources:
- # Prepend './' so the lookup doesn't interpret an initial
- # '#' on the file name portion as meaning the Node should
- # be relative to the top-level SConstruct directory.
- target = env.fs.Entry('.'+os.sep+src.name, dnode)
- tgt.extend(BaseVersionedInstallBuilder(env, target, src, **kw))
- return tgt
-
-added = None
-
-def generate(env):
-
- from SCons.Script import AddOption, GetOption
- global added
- if not added:
- added = 1
- AddOption('--install-sandbox',
- dest='install_sandbox',
- type="string",
- action="store",
- help='A directory under which all installed files will be placed.')
-
- global BaseInstallBuilder
- if BaseInstallBuilder is None:
- install_sandbox = GetOption('install_sandbox')
- if install_sandbox:
- target_factory = DESTDIR_factory(env, install_sandbox)
- else:
- target_factory = env.fs
-
- BaseInstallBuilder = SCons.Builder.Builder(
- action = install_action,
- target_factory = target_factory.Entry,
- source_factory = env.fs.Entry,
- multi = 1,
- emitter = [ add_targets_to_INSTALLED_FILES, ],
- name = 'InstallBuilder')
-
- global BaseVersionedInstallBuilder
- if BaseVersionedInstallBuilder is None:
- install_sandbox = GetOption('install_sandbox')
- if install_sandbox:
- target_factory = DESTDIR_factory(env, install_sandbox)
- else:
- target_factory = env.fs
-
- BaseVersionedInstallBuilder = SCons.Builder.Builder(
- action = installVerLib_action,
- target_factory = target_factory.Entry,
- source_factory = env.fs.Entry,
- multi = 1,
- emitter = [ add_versioned_targets_to_INSTALLED_FILES, ],
- name = 'InstallVersionedBuilder')
-
- env['BUILDERS']['_InternalInstall'] = InstallBuilderWrapper
- env['BUILDERS']['_InternalInstallAs'] = InstallAsBuilderWrapper
- env['BUILDERS']['_InternalInstallVersionedLib'] = InstallVersionedBuilderWrapper
-
- # We'd like to initialize this doing something like the following,
- # but there isn't yet support for a ${SOURCE.type} expansion that
- # will print "file" or "directory" depending on what's being
- # installed. For now we punt by not initializing it, and letting
- # the stringFunc() that we put in the action fall back to the
- # hand-crafted default string if it's not set.
- #
- #try:
- # env['INSTALLSTR']
- #except KeyError:
- # env['INSTALLSTR'] = 'Install ${SOURCE.type}: "$SOURCES" as "$TARGETS"'
-
- try:
- env['INSTALL']
- except KeyError:
- env['INSTALL'] = copyFunc
-
- try:
- env['INSTALLVERSIONEDLIB']
- except KeyError:
- env['INSTALLVERSIONEDLIB'] = copyFuncVersionedLib
-
-def exists(env):
- return 1
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/intelc.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/intelc.py
deleted file mode 100644
index 256f32e..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/intelc.py
+++ /dev/null
@@ -1,608 +0,0 @@
-"""SCons.Tool.icl
-
-Tool-specific initialization for the Intel C/C++ compiler.
-Supports Linux and Windows compilers, v7 and up.
-
-There normally shouldn't be any need to import this module directly.
-It will usually be imported through the generic SCons.Tool.Tool()
-selection method.
-
-"""
-
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-from __future__ import division
-
-__revision__ = "src/engine/SCons/Tool/intelc.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-import math, sys, os.path, glob, string, re
-
-is_windows = sys.platform == 'win32'
-is_win64 = is_windows and (os.environ['PROCESSOR_ARCHITECTURE'] == 'AMD64' or
- ('PROCESSOR_ARCHITEW6432' in os.environ and
- os.environ['PROCESSOR_ARCHITEW6432'] == 'AMD64'))
-is_linux = sys.platform.startswith('linux')
-is_mac = sys.platform == 'darwin'
-
-if is_windows:
- import SCons.Tool.msvc
-elif is_linux:
- import SCons.Tool.gcc
-elif is_mac:
- import SCons.Tool.gcc
-import SCons.Util
-import SCons.Warnings
-
-# Exceptions for this tool
-class IntelCError(SCons.Errors.InternalError):
- pass
-class MissingRegistryError(IntelCError): # missing registry entry
- pass
-class MissingDirError(IntelCError): # dir not found
- pass
-class NoRegistryModuleError(IntelCError): # can't read registry at all
- pass
-
-def uniquify(s):
- """Return a sequence containing only one copy of each unique element from input sequence s.
- Does not preserve order.
- Input sequence must be hashable (i.e. must be usable as a dictionary key)."""
- u = {}
- for x in s:
- u[x] = 1
- return list(u.keys())
-
-def linux_ver_normalize(vstr):
- """Normalize a Linux compiler version number.
- Intel changed from "80" to "9.0" in 2005, so we assume if the number
- is greater than 60 it's an old-style number and otherwise new-style.
- Always returns an old-style float like 80 or 90 for compatibility with Windows.
- Shades of Y2K!"""
- # Check for version number like 9.1.026: return 91.026
- # XXX needs to be updated for 2011+ versions (like 2011.11.344 which is compiler v12.1.5)
- m = re.match(r'([0-9]+)\.([0-9]+)\.([0-9]+)', vstr)
- if m:
- vmaj,vmin,build = m.groups()
- return float(vmaj) * 10. + float(vmin) + float(build) / 1000.;
- else:
- f = float(vstr)
- if is_windows:
- return f
- else:
- if f < 60: return f * 10.0
- else: return f
-
-def check_abi(abi):
- """Check for valid ABI (application binary interface) name,
- and map into canonical one"""
- if not abi:
- return None
- abi = abi.lower()
- # valid_abis maps input name to canonical name
- if is_windows:
- valid_abis = {'ia32' : 'ia32',
- 'x86' : 'ia32',
- 'ia64' : 'ia64',
- 'em64t' : 'em64t',
- 'amd64' : 'em64t'}
- if is_linux:
- valid_abis = {'ia32' : 'ia32',
- 'x86' : 'ia32',
- 'x86_64' : 'x86_64',
- 'em64t' : 'x86_64',
- 'amd64' : 'x86_64'}
- if is_mac:
- valid_abis = {'ia32' : 'ia32',
- 'x86' : 'ia32',
- 'x86_64' : 'x86_64',
- 'em64t' : 'x86_64'}
- try:
- abi = valid_abis[abi]
- except KeyError:
- raise SCons.Errors.UserError("Intel compiler: Invalid ABI %s, valid values are %s"% \
- (abi, list(valid_abis.keys())))
- return abi
-
-def vercmp(a, b):
- """Compare strings as floats,
- but Intel changed Linux naming convention at 9.0"""
- return cmp(linux_ver_normalize(b), linux_ver_normalize(a))
-
-def get_version_from_list(v, vlist):
- """See if we can match v (string) in vlist (list of strings)
- Linux has to match in a fuzzy way."""
- if is_windows:
- # Simple case, just find it in the list
- if v in vlist: return v
- else: return None
- else:
- # Fuzzy match: normalize version number first, but still return
- # original non-normalized form.
- fuzz = 0.001
- for vi in vlist:
- if math.fabs(linux_ver_normalize(vi) - linux_ver_normalize(v)) < fuzz:
- return vi
- # Not found
- return None
-
-def get_intel_registry_value(valuename, version=None, abi=None):
- """
- Return a value from the Intel compiler registry tree. (Windows only)
- """
- # Open the key:
- if is_win64:
- K = 'Software\\Wow6432Node\\Intel\\Compilers\\C++\\' + version + '\\'+abi.upper()
- else:
- K = 'Software\\Intel\\Compilers\\C++\\' + version + '\\'+abi.upper()
- try:
- k = SCons.Util.RegOpenKeyEx(SCons.Util.HKEY_LOCAL_MACHINE, K)
- except SCons.Util.RegError:
- # For version 13 and later, check UUID subkeys for valuename
- if is_win64:
- K = 'Software\\Wow6432Node\\Intel\\Suites\\' + version + "\\Defaults\\C++\\" + abi.upper()
- else:
- K = 'Software\\Intel\\Suites\\' + version + "\\Defaults\\C++\\" + abi.upper()
- try:
- k = SCons.Util.RegOpenKeyEx(SCons.Util.HKEY_LOCAL_MACHINE, K)
- uuid = SCons.Util.RegQueryValueEx(k, 'SubKey')[0]
-
- if is_win64:
- K = 'Software\\Wow6432Node\\Intel\\Suites\\' + version + "\\" + uuid + "\\C++"
- else:
- K = 'Software\\Intel\\Suites\\' + version + "\\" + uuid + "\\C++"
- k = SCons.Util.RegOpenKeyEx(SCons.Util.HKEY_LOCAL_MACHINE, K)
-
- try:
- v = SCons.Util.RegQueryValueEx(k, valuename)[0]
- return v # or v.encode('iso-8859-1', 'replace') to remove unicode?
- except SCons.Util.RegError:
- if abi.upper() == 'EM64T':
- abi = 'em64t_native'
- if is_win64:
- K = 'Software\\Wow6432Node\\Intel\\Suites\\' + version + "\\" + uuid + "\\C++\\" + abi.upper()
- else:
- K = 'Software\\Intel\\Suites\\' + version + "\\" + uuid + "\\C++\\" + abi.upper()
- k = SCons.Util.RegOpenKeyEx(SCons.Util.HKEY_LOCAL_MACHINE, K)
-
- try:
- v = SCons.Util.RegQueryValueEx(k, valuename)[0]
- return v # or v.encode('iso-8859-1', 'replace') to remove unicode?
- except SCons.Util.RegError:
- raise MissingRegistryError("%s was not found in the registry, for Intel compiler version %s, abi='%s'"%(K, version,abi))
-
- except SCons.Util.RegError:
- raise MissingRegistryError("%s was not found in the registry, for Intel compiler version %s, abi='%s'"%(K, version,abi))
- except WindowsError:
- raise MissingRegistryError("%s was not found in the registry, for Intel compiler version %s, abi='%s'"%(K, version,abi))
-
- # Get the value:
- try:
- v = SCons.Util.RegQueryValueEx(k, valuename)[0]
- return v # or v.encode('iso-8859-1', 'replace') to remove unicode?
- except SCons.Util.RegError:
- raise MissingRegistryError("%s\\%s was not found in the registry."%(K, valuename))
-
-
-def get_all_compiler_versions():
- """Returns a sorted list of strings, like "70" or "80" or "9.0"
- with most recent compiler version first.
- """
- versions=[]
- if is_windows:
- if is_win64:
- keyname = 'Software\\WoW6432Node\\Intel\\Compilers\\C++'
- else:
- keyname = 'Software\\Intel\\Compilers\\C++'
- try:
- k = SCons.Util.RegOpenKeyEx(SCons.Util.HKEY_LOCAL_MACHINE,
- keyname)
- except WindowsError:
- # For version 13 or later, check for default instance UUID
- if is_win64:
- keyname = 'Software\\WoW6432Node\\Intel\\Suites'
- else:
- keyname = 'Software\\Intel\\Suites'
- try:
- k = SCons.Util.RegOpenKeyEx(SCons.Util.HKEY_LOCAL_MACHINE,
- keyname)
- except WindowsError:
- return []
- i = 0
- versions = []
- try:
- while i < 100:
- subkey = SCons.Util.RegEnumKey(k, i) # raises EnvironmentError
- # Check that this refers to an existing dir.
- # This is not 100% perfect but should catch common
- # installation issues like when the compiler was installed
- # and then the install directory deleted or moved (rather
- # than uninstalling properly), so the registry values
- # are still there.
- if subkey == 'Defaults': # Ignore default instances
- i = i + 1
- continue
- ok = False
- for try_abi in ('IA32', 'IA32e', 'IA64', 'EM64T'):
- try:
- d = get_intel_registry_value('ProductDir', subkey, try_abi)
- except MissingRegistryError:
- continue # not found in reg, keep going
- if os.path.exists(d): ok = True
- if ok:
- versions.append(subkey)
- else:
- try:
- # Registry points to nonexistent dir. Ignore this
- # version.
- value = get_intel_registry_value('ProductDir', subkey, 'IA32')
- except MissingRegistryError, e:
-
- # Registry key is left dangling (potentially
- # after uninstalling).
-
- print \
- "scons: *** Ignoring the registry key for the Intel compiler version %s.\n" \
- "scons: *** It seems that the compiler was uninstalled and that the registry\n" \
- "scons: *** was not cleaned up properly.\n" % subkey
- else:
- print "scons: *** Ignoring "+str(value)
-
- i = i + 1
- except EnvironmentError:
- # no more subkeys
- pass
- elif is_linux or is_mac:
- for d in glob.glob('/opt/intel_cc_*'):
- # Typical dir here is /opt/intel_cc_80.
- m = re.search(r'cc_(.*)$', d)
- if m:
- versions.append(m.group(1))
- for d in glob.glob('/opt/intel/cc*/*'):
- # Typical dir here is /opt/intel/cc/9.0 for IA32,
- # /opt/intel/cce/9.0 for EMT64 (AMD64)
- m = re.search(r'([0-9][0-9.]*)$', d)
- if m:
- versions.append(m.group(1))
- for d in glob.glob('/opt/intel/Compiler/*'):
- # Typical dir here is /opt/intel/Compiler/11.1
- m = re.search(r'([0-9][0-9.]*)$', d)
- if m:
- versions.append(m.group(1))
- for d in glob.glob('/opt/intel/composerxe-*'):
- # Typical dir here is /opt/intel/composerxe-2011.4.184
- m = re.search(r'([0-9][0-9.]*)$', d)
- if m:
- versions.append(m.group(1))
- for d in glob.glob('/opt/intel/composer_xe_*'):
- # Typical dir here is /opt/intel/composer_xe_2011_sp1.11.344
- # The _sp1 is useless, the installers are named 2011.9.x, 2011.10.x, 2011.11.x
- m = re.search(r'([0-9]{0,4})(?:_sp\d*)?\.([0-9][0-9.]*)$', d)
- if m:
- versions.append("%s.%s"%(m.group(1), m.group(2)))
- def keyfunc(str):
- """Given a dot-separated version string, return a tuple of ints representing it."""
- return [int(x) for x in str.split('.')]
- # split into ints, sort, then remove dups
- return sorted(uniquify(versions), key=keyfunc, reverse=True)
-
-def get_intel_compiler_top(version, abi):
- """
- Return the main path to the top-level dir of the Intel compiler,
- using the given version.
- The compiler will be in <top>/bin/icl.exe (icc on linux),
- the include dir is <top>/include, etc.
- """
-
- if is_windows:
- if not SCons.Util.can_read_reg:
- raise NoRegistryModuleError("No Windows registry module was found")
- top = get_intel_registry_value('ProductDir', version, abi)
- archdir={'x86_64': 'intel64',
- 'amd64' : 'intel64',
- 'em64t' : 'intel64',
- 'x86' : 'ia32',
- 'i386' : 'ia32',
- 'ia32' : 'ia32'
- }[abi] # for v11 and greater
- # pre-11, icl was in Bin. 11 and later, it's in Bin/<abi> apparently.
- if not os.path.exists(os.path.join(top, "Bin", "icl.exe")) \
- and not os.path.exists(os.path.join(top, "Bin", abi, "icl.exe")) \
- and not os.path.exists(os.path.join(top, "Bin", archdir, "icl.exe")):
- raise MissingDirError("Can't find Intel compiler in %s"%(top))
- elif is_mac or is_linux:
- def find_in_2008style_dir(version):
- # first dir is new (>=9.0) style, second is old (8.0) style.
- dirs=('/opt/intel/cc/%s', '/opt/intel_cc_%s')
- if abi == 'x86_64':
- dirs=('/opt/intel/cce/%s',) # 'e' stands for 'em64t', aka x86_64 aka amd64
- top=None
- for d in dirs:
- if os.path.exists(os.path.join(d%version, "bin", "icc")):
- top = d%version
- break
- return top
- def find_in_2010style_dir(version):
- dirs=('/opt/intel/Compiler/%s/*'%version)
- # typically /opt/intel/Compiler/11.1/064 (then bin/intel64/icc)
- dirs=glob.glob(dirs)
- # find highest sub-version number by reverse sorting and picking first existing one.
- dirs.sort()
- dirs.reverse()
- top=None
- for d in dirs:
- if (os.path.exists(os.path.join(d, "bin", "ia32", "icc")) or
- os.path.exists(os.path.join(d, "bin", "intel64", "icc"))):
- top = d
- break
- return top
- def find_in_2011style_dir(version):
- # The 2011 (compiler v12) dirs are inconsistent, so just redo the search from
- # get_all_compiler_versions and look for a match (search the newest form first)
- top=None
- for d in glob.glob('/opt/intel/composer_xe_*'):
- # Typical dir here is /opt/intel/composer_xe_2011_sp1.11.344
- # The _sp1 is useless, the installers are named 2011.9.x, 2011.10.x, 2011.11.x
- m = re.search(r'([0-9]{0,4})(?:_sp\d*)?\.([0-9][0-9.]*)$', d)
- if m:
- cur_ver = "%s.%s"%(m.group(1), m.group(2))
- if cur_ver == version and \
- (os.path.exists(os.path.join(d, "bin", "ia32", "icc")) or
- os.path.exists(os.path.join(d, "bin", "intel64", "icc"))):
- top = d
- break
- if not top:
- for d in glob.glob('/opt/intel/composerxe-*'):
- # Typical dir here is /opt/intel/composerxe-2011.4.184
- m = re.search(r'([0-9][0-9.]*)$', d)
- if m and m.group(1) == version and \
- (os.path.exists(os.path.join(d, "bin", "ia32", "icc")) or
- os.path.exists(os.path.join(d, "bin", "intel64", "icc"))):
- top = d
- break
- return top
- top = find_in_2011style_dir(version) or find_in_2010style_dir(version) or find_in_2008style_dir(version)
- # print "INTELC: top=",top
- if not top:
- raise MissingDirError("Can't find version %s Intel compiler in %s (abi='%s')"%(version,top, abi))
- return top
-
-
-def generate(env, version=None, abi=None, topdir=None, verbose=0):
- """Add Builders and construction variables for Intel C/C++ compiler
- to an Environment.
- args:
- version: (string) compiler version to use, like "80"
- abi: (string) 'win32' or whatever Itanium version wants
- topdir: (string) compiler top dir, like
- "c:\Program Files\Intel\Compiler70"
- If topdir is used, version and abi are ignored.
- verbose: (int) if >0, prints compiler version used.
- """
- if not (is_mac or is_linux or is_windows):
- # can't handle this platform
- return
-
- if is_windows:
- SCons.Tool.msvc.generate(env)
- elif is_linux:
- SCons.Tool.gcc.generate(env)
- elif is_mac:
- SCons.Tool.gcc.generate(env)
-
- # if version is unspecified, use latest
- vlist = get_all_compiler_versions()
- if not version:
- if vlist:
- version = vlist[0]
- else:
- # User may have specified '90' but we need to get actual dirname '9.0'.
- # get_version_from_list does that mapping.
- v = get_version_from_list(version, vlist)
- if not v:
- raise SCons.Errors.UserError("Invalid Intel compiler version %s: "%version + \
- "installed versions are %s"%(', '.join(vlist)))
- version = v
-
- # if abi is unspecified, use ia32
- # alternatives are ia64 for Itanium, or amd64 or em64t or x86_64 (all synonyms here)
- abi = check_abi(abi)
- if abi is None:
- if is_mac or is_linux:
- # Check if we are on 64-bit linux, default to 64 then.
- uname_m = os.uname()[4]
- if uname_m == 'x86_64':
- abi = 'x86_64'
- else:
- abi = 'ia32'
- else:
- if is_win64:
- abi = 'em64t'
- else:
- abi = 'ia32'
-
- if version and not topdir:
- try:
- topdir = get_intel_compiler_top(version, abi)
- except (SCons.Util.RegError, IntelCError):
- topdir = None
-
- if not topdir:
- # Normally this is an error, but it might not be if the compiler is
- # on $PATH and the user is importing their env.
- class ICLTopDirWarning(SCons.Warnings.Warning):
- pass
- if (is_mac or is_linux) and not env.Detect('icc') or \
- is_windows and not env.Detect('icl'):
-
- SCons.Warnings.enableWarningClass(ICLTopDirWarning)
- SCons.Warnings.warn(ICLTopDirWarning,
- "Failed to find Intel compiler for version='%s', abi='%s'"%
- (str(version), str(abi)))
- else:
- # should be cleaned up to say what this other version is
- # since in this case we have some other Intel compiler installed
- SCons.Warnings.enableWarningClass(ICLTopDirWarning)
- SCons.Warnings.warn(ICLTopDirWarning,
- "Can't find Intel compiler top dir for version='%s', abi='%s'"%
- (str(version), str(abi)))
-
- if topdir:
- archdir={'x86_64': 'intel64',
- 'amd64' : 'intel64',
- 'em64t' : 'intel64',
- 'x86' : 'ia32',
- 'i386' : 'ia32',
- 'ia32' : 'ia32'
- }[abi] # for v11 and greater
- if os.path.exists(os.path.join(topdir, 'bin', archdir)):
- bindir="bin/%s"%archdir
- libdir="lib/%s"%archdir
- else:
- bindir="bin"
- libdir="lib"
- if verbose:
- print "Intel C compiler: using version %s (%g), abi %s, in '%s/%s'"%\
- (repr(version), linux_ver_normalize(version),abi,topdir,bindir)
- if is_linux:
- # Show the actual compiler version by running the compiler.
- os.system('%s/%s/icc --version'%(topdir,bindir))
- if is_mac:
- # Show the actual compiler version by running the compiler.
- os.system('%s/%s/icc --version'%(topdir,bindir))
-
- env['INTEL_C_COMPILER_TOP'] = topdir
- if is_linux:
- paths={'INCLUDE' : 'include',
- 'LIB' : libdir,
- 'PATH' : bindir,
- 'LD_LIBRARY_PATH' : libdir}
- for p in paths.keys():
- env.PrependENVPath(p, os.path.join(topdir, paths[p]))
- if is_mac:
- paths={'INCLUDE' : 'include',
- 'LIB' : libdir,
- 'PATH' : bindir,
- 'LD_LIBRARY_PATH' : libdir}
- for p in paths.keys():
- env.PrependENVPath(p, os.path.join(topdir, paths[p]))
- if is_windows:
- # env key reg valname default subdir of top
- paths=(('INCLUDE', 'IncludeDir', 'Include'),
- ('LIB' , 'LibDir', 'Lib'),
- ('PATH' , 'BinDir', 'Bin'))
- # We are supposed to ignore version if topdir is set, so set
- # it to the emptry string if it's not already set.
- if version is None:
- version = ''
- # Each path has a registry entry, use that or default to subdir
- for p in paths:
- try:
- path=get_intel_registry_value(p[1], version, abi)
- # These paths may have $(ICInstallDir)
- # which needs to be substituted with the topdir.
- path=path.replace('$(ICInstallDir)', topdir + os.sep)
- except IntelCError:
- # Couldn't get it from registry: use default subdir of topdir
- env.PrependENVPath(p[0], os.path.join(topdir, p[2]))
- else:
- env.PrependENVPath(p[0], path.split(os.pathsep))
- # print "ICL %s: %s, final=%s"%(p[0], path, str(env['ENV'][p[0]]))
-
- if is_windows:
- env['CC'] = 'icl'
- env['CXX'] = 'icl'
- env['LINK'] = 'xilink'
- else:
- env['CC'] = 'icc'
- env['CXX'] = 'icpc'
- # Don't reset LINK here;
- # use smart_link which should already be here from link.py.
- #env['LINK'] = '$CC'
- env['AR'] = 'xiar'
- env['LD'] = 'xild' # not used by default
-
- # This is not the exact (detailed) compiler version,
- # just the major version as determined above or specified
- # by the user. It is a float like 80 or 90, in normalized form for Linux
- # (i.e. even for Linux 9.0 compiler, still returns 90 rather than 9.0)
- if version:
- env['INTEL_C_COMPILER_VERSION']=linux_ver_normalize(version)
-
- if is_windows:
- # Look for license file dir
- # in system environment, registry, and default location.
- envlicdir = os.environ.get("INTEL_LICENSE_FILE", '')
- K = ('SOFTWARE\Intel\Licenses')
- try:
- k = SCons.Util.RegOpenKeyEx(SCons.Util.HKEY_LOCAL_MACHINE, K)
- reglicdir = SCons.Util.RegQueryValueEx(k, "w_cpp")[0]
- except (AttributeError, SCons.Util.RegError):
- reglicdir = ""
- defaultlicdir = r'C:\Program Files\Common Files\Intel\Licenses'
-
- licdir = None
- for ld in [envlicdir, reglicdir]:
- # If the string contains an '@', then assume it's a network
- # license (port@system) and good by definition.
- if ld and (ld.find('@') != -1 or os.path.exists(ld)):
- licdir = ld
- break
- if not licdir:
- licdir = defaultlicdir
- if not os.path.exists(licdir):
- class ICLLicenseDirWarning(SCons.Warnings.Warning):
- pass
- SCons.Warnings.enableWarningClass(ICLLicenseDirWarning)
- SCons.Warnings.warn(ICLLicenseDirWarning,
- "Intel license dir was not found."
- " Tried using the INTEL_LICENSE_FILE environment variable (%s), the registry (%s) and the default path (%s)."
- " Using the default path as a last resort."
- % (envlicdir, reglicdir, defaultlicdir))
- env['ENV']['INTEL_LICENSE_FILE'] = licdir
-
-def exists(env):
- if not (is_mac or is_linux or is_windows):
- # can't handle this platform
- return 0
-
- try:
- versions = get_all_compiler_versions()
- except (SCons.Util.RegError, IntelCError):
- versions = None
- detected = versions is not None and len(versions) > 0
- if not detected:
- # try env.Detect, maybe that will work
- if is_windows:
- return env.Detect('icl')
- elif is_linux:
- return env.Detect('icc')
- elif is_mac:
- return env.Detect('icc')
- return detected
-
-# end of file
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/ipkg.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/ipkg.py
deleted file mode 100644
index bf2b496..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/ipkg.py
+++ /dev/null
@@ -1,67 +0,0 @@
-"""SCons.Tool.ipkg
-
-Tool-specific initialization for ipkg.
-
-There normally shouldn't be any need to import this module directly.
-It will usually be imported through the generic SCons.Tool.Tool()
-selection method.
-
-The ipkg tool calls the ipkg-build. Its only argument should be the
-packages fake_root.
-"""
-
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-
-__revision__ = "src/engine/SCons/Tool/ipkg.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-import os
-
-import SCons.Builder
-
-def generate(env):
- """Add Builders and construction variables for ipkg to an Environment."""
- try:
- bld = env['BUILDERS']['Ipkg']
- except KeyError:
- bld = SCons.Builder.Builder( action = '$IPKGCOM',
- suffix = '$IPKGSUFFIX',
- source_scanner = None,
- target_scanner = None)
- env['BUILDERS']['Ipkg'] = bld
-
- env['IPKG'] = 'ipkg-build'
- env['IPKGCOM'] = '$IPKG $IPKGFLAGS ${SOURCE}'
- env['IPKGUSER'] = os.popen('id -un').read().strip()
- env['IPKGGROUP'] = os.popen('id -gn').read().strip()
- env['IPKGFLAGS'] = SCons.Util.CLVar('-o $IPKGUSER -g $IPKGGROUP')
- env['IPKGSUFFIX'] = '.ipk'
-
-def exists(env):
- return env.Detect('ipkg-build')
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/jar.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/jar.py
deleted file mode 100644
index 50d3fc0..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/jar.py
+++ /dev/null
@@ -1,116 +0,0 @@
-"""SCons.Tool.jar
-
-Tool-specific initialization for jar.
-
-There normally shouldn't be any need to import this module directly.
-It will usually be imported through the generic SCons.Tool.Tool()
-selection method.
-
-"""
-
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-
-__revision__ = "src/engine/SCons/Tool/jar.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-import SCons.Subst
-import SCons.Util
-
-def jarSources(target, source, env, for_signature):
- """Only include sources that are not a manifest file."""
- try:
- env['JARCHDIR']
- except KeyError:
- jarchdir_set = False
- else:
- jarchdir_set = True
- jarchdir = env.subst('$JARCHDIR', target=target, source=source)
- if jarchdir:
- jarchdir = env.fs.Dir(jarchdir)
- result = []
- for src in source:
- contents = src.get_text_contents()
- if contents[:16] != "Manifest-Version":
- if jarchdir_set:
- _chdir = jarchdir
- else:
- try:
- _chdir = src.attributes.java_classdir
- except AttributeError:
- _chdir = None
- if _chdir:
- # If we are changing the dir with -C, then sources should
- # be relative to that directory.
- src = SCons.Subst.Literal(src.get_path(_chdir))
- result.append('-C')
- result.append(_chdir)
- result.append(src)
- return result
-
-def jarManifest(target, source, env, for_signature):
- """Look in sources for a manifest file, if any."""
- for src in source:
- contents = src.get_text_contents()
- if contents[:16] == "Manifest-Version":
- return src
- return ''
-
-def jarFlags(target, source, env, for_signature):
- """If we have a manifest, make sure that the 'm'
- flag is specified."""
- jarflags = env.subst('$JARFLAGS', target=target, source=source)
- for src in source:
- contents = src.get_text_contents()
- if contents[:16] == "Manifest-Version":
- if not 'm' in jarflags:
- return jarflags + 'm'
- break
- return jarflags
-
-def generate(env):
- """Add Builders and construction variables for jar to an Environment."""
- SCons.Tool.CreateJarBuilder(env)
-
- env['JAR'] = 'jar'
- env['JARFLAGS'] = SCons.Util.CLVar('cf')
- env['_JARFLAGS'] = jarFlags
- env['_JARMANIFEST'] = jarManifest
- env['_JARSOURCES'] = jarSources
- env['_JARCOM'] = '$JAR $_JARFLAGS $TARGET $_JARMANIFEST $_JARSOURCES'
- env['JARCOM'] = "${TEMPFILE('$_JARCOM','$JARCOMSTR')}"
- env['JARSUFFIX'] = '.jar'
-
-def exists(env):
- # As reported by Jan Nijtmans in issue #2730, the simple
- # return env.Detect('jar')
- # doesn't always work during initialization. For now, we
- # stop trying to detect an executable (analogous to the
- # javac Builder).
- # TODO: Come up with a proper detect() routine...and enable it.
- return 1
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/javac.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/javac.py
deleted file mode 100644
index bb57208..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/javac.py
+++ /dev/null
@@ -1,232 +0,0 @@
-"""SCons.Tool.javac
-
-Tool-specific initialization for javac.
-
-There normally shouldn't be any need to import this module directly.
-It will usually be imported through the generic SCons.Tool.Tool()
-selection method.
-
-"""
-
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-__revision__ = "src/engine/SCons/Tool/javac.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-import os
-import os.path
-
-import SCons.Action
-import SCons.Builder
-from SCons.Node.FS import _my_normcase
-from SCons.Tool.JavaCommon import parse_java_file
-import SCons.Util
-
-def classname(path):
- """Turn a string (path name) into a Java class name."""
- return os.path.normpath(path).replace(os.sep, '.')
-
-def emit_java_classes(target, source, env):
- """Create and return lists of source java files
- and their corresponding target class files.
- """
- java_suffix = env.get('JAVASUFFIX', '.java')
- class_suffix = env.get('JAVACLASSSUFFIX', '.class')
-
- target[0].must_be_same(SCons.Node.FS.Dir)
- classdir = target[0]
-
- s = source[0].rentry().disambiguate()
- if isinstance(s, SCons.Node.FS.File):
- sourcedir = s.dir.rdir()
- elif isinstance(s, SCons.Node.FS.Dir):
- sourcedir = s.rdir()
- else:
- raise SCons.Errors.UserError("Java source must be File or Dir, not '%s'" % s.__class__)
-
- slist = []
- js = _my_normcase(java_suffix)
- for entry in source:
- entry = entry.rentry().disambiguate()
- if isinstance(entry, SCons.Node.FS.File):
- slist.append(entry)
- elif isinstance(entry, SCons.Node.FS.Dir):
- result = SCons.Util.OrderedDict()
- dirnode = entry.rdir()
- def find_java_files(arg, dirpath, filenames):
- java_files = sorted([n for n in filenames
- if _my_normcase(n).endswith(js)])
- mydir = dirnode.Dir(dirpath)
- java_paths = [mydir.File(f) for f in java_files]
- for jp in java_paths:
- arg[jp] = True
- for dirpath, dirnames, filenames in os.walk(dirnode.get_abspath()):
- find_java_files(result, dirpath, filenames)
- entry.walk(find_java_files, result)
-
- slist.extend(list(result.keys()))
- else:
- raise SCons.Errors.UserError("Java source must be File or Dir, not '%s'" % entry.__class__)
-
- version = env.get('JAVAVERSION', '1.4')
- full_tlist = []
- for f in slist:
- tlist = []
- source_file_based = True
- pkg_dir = None
- if not f.is_derived():
- pkg_dir, classes = parse_java_file(f.rfile().get_abspath(), version)
- if classes:
- source_file_based = False
- if pkg_dir:
- d = target[0].Dir(pkg_dir)
- p = pkg_dir + os.sep
- else:
- d = target[0]
- p = ''
- for c in classes:
- t = d.File(c + class_suffix)
- t.attributes.java_classdir = classdir
- t.attributes.java_sourcedir = sourcedir
- t.attributes.java_classname = classname(p + c)
- tlist.append(t)
-
- if source_file_based:
- base = f.name[:-len(java_suffix)]
- if pkg_dir:
- t = target[0].Dir(pkg_dir).File(base + class_suffix)
- else:
- t = target[0].File(base + class_suffix)
- t.attributes.java_classdir = classdir
- t.attributes.java_sourcedir = f.dir
- t.attributes.java_classname = classname(base)
- tlist.append(t)
-
- for t in tlist:
- t.set_specific_source([f])
-
- full_tlist.extend(tlist)
-
- return full_tlist, slist
-
-JavaAction = SCons.Action.Action('$JAVACCOM', '$JAVACCOMSTR')
-
-JavaBuilder = SCons.Builder.Builder(action = JavaAction,
- emitter = emit_java_classes,
- target_factory = SCons.Node.FS.Entry,
- source_factory = SCons.Node.FS.Entry)
-
-class pathopt(object):
- """
- Callable object for generating javac-style path options from
- a construction variable (e.g. -classpath, -sourcepath).
- """
- def __init__(self, opt, var, default=None):
- self.opt = opt
- self.var = var
- self.default = default
-
- def __call__(self, target, source, env, for_signature):
- path = env[self.var]
- if path and not SCons.Util.is_List(path):
- path = [path]
- if self.default:
- default = env[self.default]
- if default:
- if not SCons.Util.is_List(default):
- default = [default]
- path = path + default
- if path:
- return [self.opt, os.pathsep.join(map(str, path))]
- else:
- return []
-
-def Java(env, target, source, *args, **kw):
- """
- A pseudo-Builder wrapper around the separate JavaClass{File,Dir}
- Builders.
- """
- if not SCons.Util.is_List(target):
- target = [target]
- if not SCons.Util.is_List(source):
- source = [source]
-
- # Pad the target list with repetitions of the last element in the
- # list so we have a target for every source element.
- target = target + ([target[-1]] * (len(source) - len(target)))
-
- java_suffix = env.subst('$JAVASUFFIX')
- result = []
-
- for t, s in zip(target, source):
- if isinstance(s, SCons.Node.FS.Base):
- if isinstance(s, SCons.Node.FS.File):
- b = env.JavaClassFile
- else:
- b = env.JavaClassDir
- else:
- if os.path.isfile(s):
- b = env.JavaClassFile
- elif os.path.isdir(s):
- b = env.JavaClassDir
- elif s[-len(java_suffix):] == java_suffix:
- b = env.JavaClassFile
- else:
- b = env.JavaClassDir
- result.extend(b(t, s, *args, **kw))
-
- return result
-
-def generate(env):
- """Add Builders and construction variables for javac to an Environment."""
- java_file = SCons.Tool.CreateJavaFileBuilder(env)
- java_class = SCons.Tool.CreateJavaClassFileBuilder(env)
- java_class_dir = SCons.Tool.CreateJavaClassDirBuilder(env)
- java_class.add_emitter(None, emit_java_classes)
- java_class.add_emitter(env.subst('$JAVASUFFIX'), emit_java_classes)
- java_class_dir.emitter = emit_java_classes
-
- env.AddMethod(Java)
-
- env['JAVAC'] = 'javac'
- env['JAVACFLAGS'] = SCons.Util.CLVar('')
- env['JAVABOOTCLASSPATH'] = []
- env['JAVACLASSPATH'] = []
- env['JAVASOURCEPATH'] = []
- env['_javapathopt'] = pathopt
- env['_JAVABOOTCLASSPATH'] = '${_javapathopt("-bootclasspath", "JAVABOOTCLASSPATH")} '
- env['_JAVACLASSPATH'] = '${_javapathopt("-classpath", "JAVACLASSPATH")} '
- env['_JAVASOURCEPATH'] = '${_javapathopt("-sourcepath", "JAVASOURCEPATH", "_JAVASOURCEPATHDEFAULT")} '
- env['_JAVASOURCEPATHDEFAULT'] = '${TARGET.attributes.java_sourcedir}'
- env['_JAVACCOM'] = '$JAVAC $JAVACFLAGS $_JAVABOOTCLASSPATH $_JAVACLASSPATH -d ${TARGET.attributes.java_classdir} $_JAVASOURCEPATH $SOURCES'
- env['JAVACCOM'] = "${TEMPFILE('$_JAVACCOM','$JAVACCOMSTR')}"
- env['JAVACLASSSUFFIX'] = '.class'
- env['JAVASUFFIX'] = '.java'
-
-def exists(env):
- return 1
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/javah.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/javah.py
deleted file mode 100644
index 1d667b9..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/javah.py
+++ /dev/null
@@ -1,137 +0,0 @@
-"""SCons.Tool.javah
-
-Tool-specific initialization for javah.
-
-There normally shouldn't be any need to import this module directly.
-It will usually be imported through the generic SCons.Tool.Tool()
-selection method.
-
-"""
-
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-
-__revision__ = "src/engine/SCons/Tool/javah.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-import os.path
-
-import SCons.Action
-import SCons.Builder
-import SCons.Node.FS
-import SCons.Tool.javac
-import SCons.Util
-
-def emit_java_headers(target, source, env):
- """Create and return lists of Java stub header files that will
- be created from a set of class files.
- """
- class_suffix = env.get('JAVACLASSSUFFIX', '.class')
- classdir = env.get('JAVACLASSDIR')
-
- if not classdir:
- try:
- s = source[0]
- except IndexError:
- classdir = '.'
- else:
- try:
- classdir = s.attributes.java_classdir
- except AttributeError:
- classdir = '.'
- classdir = env.Dir(classdir).rdir()
-
- if str(classdir) == '.':
- c_ = None
- else:
- c_ = str(classdir) + os.sep
-
- slist = []
- for src in source:
- try:
- classname = src.attributes.java_classname
- except AttributeError:
- classname = str(src)
- if c_ and classname[:len(c_)] == c_:
- classname = classname[len(c_):]
- if class_suffix and classname[-len(class_suffix):] == class_suffix:
- classname = classname[:-len(class_suffix)]
- classname = SCons.Tool.javac.classname(classname)
- s = src.rfile()
- s.attributes.java_classname = classname
- slist.append(s)
-
- s = source[0].rfile()
- if not hasattr(s.attributes, 'java_classdir'):
- s.attributes.java_classdir = classdir
-
- if target[0].__class__ is SCons.Node.FS.File:
- tlist = target
- else:
- if not isinstance(target[0], SCons.Node.FS.Dir):
- target[0].__class__ = SCons.Node.FS.Dir
- target[0]._morph()
- tlist = []
- for s in source:
- fname = s.attributes.java_classname.replace('.', '_') + '.h'
- t = target[0].File(fname)
- t.attributes.java_lookupdir = target[0]
- tlist.append(t)
-
- return tlist, source
-
-def JavaHOutFlagGenerator(target, source, env, for_signature):
- try:
- t = target[0]
- except (AttributeError, IndexError, TypeError):
- t = target
- try:
- return '-d ' + str(t.attributes.java_lookupdir)
- except AttributeError:
- return '-o ' + str(t)
-
-def getJavaHClassPath(env,target, source, for_signature):
- path = "${SOURCE.attributes.java_classdir}"
- if 'JAVACLASSPATH' in env and env['JAVACLASSPATH']:
- path = SCons.Util.AppendPath(path, env['JAVACLASSPATH'])
- return "-classpath %s" % (path)
-
-def generate(env):
- """Add Builders and construction variables for javah to an Environment."""
- java_javah = SCons.Tool.CreateJavaHBuilder(env)
- java_javah.emitter = emit_java_headers
-
- env['_JAVAHOUTFLAG'] = JavaHOutFlagGenerator
- env['JAVAH'] = 'javah'
- env['JAVAHFLAGS'] = SCons.Util.CLVar('')
- env['_JAVAHCLASSPATH'] = getJavaHClassPath
- env['JAVAHCOM'] = '$JAVAH $JAVAHFLAGS $_JAVAHOUTFLAG $_JAVAHCLASSPATH ${SOURCES.attributes.java_classname}'
- env['JAVACLASSSUFFIX'] = '.class'
-
-def exists(env):
- return env.Detect('javah')
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/latex.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/latex.py
deleted file mode 100644
index 69413cc..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/latex.py
+++ /dev/null
@@ -1,80 +0,0 @@
-"""SCons.Tool.latex
-
-Tool-specific initialization for LaTeX.
-Generates .dvi files from .latex or .ltx files
-
-There normally shouldn't be any need to import this module directly.
-It will usually be imported through the generic SCons.Tool.Tool()
-selection method.
-
-"""
-
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-
-__revision__ = "src/engine/SCons/Tool/latex.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-import SCons.Action
-import SCons.Defaults
-import SCons.Scanner.LaTeX
-import SCons.Util
-import SCons.Tool
-import SCons.Tool.tex
-
-def LaTeXAuxFunction(target = None, source= None, env=None):
- result = SCons.Tool.tex.InternalLaTeXAuxAction( SCons.Tool.tex.LaTeXAction, target, source, env )
- if result != 0:
- SCons.Tool.tex.check_file_error_message(env['LATEX'])
- return result
-
-LaTeXAuxAction = SCons.Action.Action(LaTeXAuxFunction,
- strfunction=SCons.Tool.tex.TeXLaTeXStrFunction)
-
-def generate(env):
- """Add Builders and construction variables for LaTeX to an Environment."""
-
- env.AppendUnique(LATEXSUFFIXES=SCons.Tool.LaTeXSuffixes)
-
- import dvi
- dvi.generate(env)
-
- import pdf
- pdf.generate(env)
-
- bld = env['BUILDERS']['DVI']
- bld.add_action('.ltx', LaTeXAuxAction)
- bld.add_action('.latex', LaTeXAuxAction)
- bld.add_emitter('.ltx', SCons.Tool.tex.tex_eps_emitter)
- bld.add_emitter('.latex', SCons.Tool.tex.tex_eps_emitter)
-
- SCons.Tool.tex.generate_common(env)
-
-def exists(env):
- SCons.Tool.tex.generate_darwin(env)
- return env.Detect('latex')
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/ldc.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/ldc.py
deleted file mode 100644
index c1b558f..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/ldc.py
+++ /dev/null
@@ -1,144 +0,0 @@
-"""SCons.Tool.ldc
-
-Tool-specific initialization for the LDC compiler.
-(http://www.dsource.org/projects/ldc)
-
-Developed by Russel Winder (russel@winder.org.uk)
-2012-05-09 onwards
-
-Compiler variables:
- DC - The name of the D compiler to use. Defaults to ldc2.
- DPATH - List of paths to search for import modules.
- DVERSIONS - List of version tags to enable when compiling.
- DDEBUG - List of debug tags to enable when compiling.
-
-Linker related variables:
- LIBS - List of library files to link in.
- DLINK - Name of the linker to use. Defaults to ldc2.
- DLINKFLAGS - List of linker flags.
-
-Lib tool variables:
- DLIB - Name of the lib tool to use. Defaults to lib.
- DLIBFLAGS - List of flags to pass to the lib tool.
- LIBS - Same as for the linker. (libraries to pull into the .lib)
-"""
-
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-
-__revision__ = "src/engine/SCons/Tool/ldc.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-import os
-import subprocess
-
-import SCons.Action
-import SCons.Builder
-import SCons.Defaults
-import SCons.Scanner.D
-import SCons.Tool
-
-import SCons.Tool.DCommon
-
-
-def generate(env):
- static_obj, shared_obj = SCons.Tool.createObjBuilders(env)
-
- static_obj.add_action('.d', SCons.Defaults.DAction)
- shared_obj.add_action('.d', SCons.Defaults.ShDAction)
- static_obj.add_emitter('.d', SCons.Defaults.StaticObjectEmitter)
- shared_obj.add_emitter('.d', SCons.Defaults.SharedObjectEmitter)
-
- env['DC'] = env.Detect('ldc2')
- env['DCOM'] = '$DC $_DINCFLAGS $_DVERFLAGS $_DDEBUGFLAGS $_DFLAGS -c -of=$TARGET $SOURCES'
- env['_DINCFLAGS'] = '${_concat(DINCPREFIX, DPATH, DINCSUFFIX, __env__, RDirs, TARGET, SOURCE)}'
- env['_DVERFLAGS'] = '${_concat(DVERPREFIX, DVERSIONS, DVERSUFFIX, __env__)}'
- env['_DDEBUGFLAGS'] = '${_concat(DDEBUGPREFIX, DDEBUG, DDEBUGSUFFIX, __env__)}'
- env['_DFLAGS'] = '${_concat(DFLAGPREFIX, DFLAGS, DFLAGSUFFIX, __env__)}'
-
- env['SHDC'] = '$DC'
- env['SHDCOM'] = '$DC $_DINCFLAGS $_DVERFLAGS $_DDEBUGFLAGS $_DFLAGS -c -relocation-model=pic -of=$TARGET $SOURCES'
-
- env['DPATH'] = ['#/']
- env['DFLAGS'] = []
- env['DVERSIONS'] = []
- env['DDEBUG'] = []
-
- if env['DC']:
- SCons.Tool.DCommon.addDPATHToEnv(env, env['DC'])
-
- env['DINCPREFIX'] = '-I='
- env['DINCSUFFIX'] = ''
- env['DVERPREFIX'] = '-version='
- env['DVERSUFFIX'] = ''
- env['DDEBUGPREFIX'] = '-debug='
- env['DDEBUGSUFFIX'] = ''
- env['DFLAGPREFIX'] = '-'
- env['DFLAGSUFFIX'] = ''
- env['DFILESUFFIX'] = '.d'
-
- env['DLINK'] = '$DC'
- env['DLINKFLAGS'] = SCons.Util.CLVar('')
- env['DLINKCOM'] = '$DLINK -of=$TARGET $DLINKFLAGS $__DRPATH $SOURCES $_DLIBDIRFLAGS $_DLIBFLAGS'
-
- env['DSHLINK'] = '$DC'
- env['DSHLINKFLAGS'] = SCons.Util.CLVar('$DLINKFLAGS -shared -defaultlib=phobos2-ldc')
- # Hack for Fedora the packages of which use the wrong name :-(
- if os.path.exists('/usr/lib64/libphobos-ldc.so') or os.path.exists('/usr/lib32/libphobos-ldc.so') or os.path.exists('/usr/lib/libphobos-ldc.so') :
- env['DSHLINKFLAGS'] = SCons.Util.CLVar('$DLINKFLAGS -shared -defaultlib=phobos-ldc')
- env['SHDLINKCOM'] = '$DLINK -of=$TARGET $DSHLINKFLAGS $__DRPATH $SOURCES $_DLIBDIRFLAGS $_DLIBFLAGS'
-
- env['DLIBLINKPREFIX'] = '' if env['PLATFORM'] == 'win32' else '-L-l'
- env['DLIBLINKSUFFIX'] = '.lib' if env['PLATFORM'] == 'win32' else ''
- #env['_DLIBFLAGS'] = '${_concat(DLIBLINKPREFIX, LIBS, DLIBLINKSUFFIX, __env__, RDirs, TARGET, SOURCE)}'
- env['_DLIBFLAGS'] = '${_stripixes(DLIBLINKPREFIX, LIBS, DLIBLINKSUFFIX, LIBPREFIXES, LIBSUFFIXES, __env__)}'
-
- env['DLIBDIRPREFIX'] = '-L-L'
- env['DLIBDIRSUFFIX'] = ''
- env['_DLIBDIRFLAGS'] = '${_concat(DLIBDIRPREFIX, LIBPATH, DLIBDIRSUFFIX, __env__, RDirs, TARGET, SOURCE)}'
-
-
- env['DLIB'] = 'lib' if env['PLATFORM'] == 'win32' else 'ar cr'
- env['DLIBCOM'] = '$DLIB $_DLIBFLAGS {0}$TARGET $SOURCES $_DLIBFLAGS'.format('-c ' if env['PLATFORM'] == 'win32' else '')
-
- #env['_DLIBFLAGS'] = '${_concat(DLIBFLAGPREFIX, DLIBFLAGS, DLIBFLAGSUFFIX, __env__)}'
-
- env['DLIBFLAGPREFIX'] = '-'
- env['DLIBFLAGSUFFIX'] = ''
-
- # __RPATH is set to $_RPATH in the platform specification if that
- # platform supports it.
- env['DRPATHPREFIX'] = '-L-rpath='
- env['DRPATHSUFFIX'] = ''
- env['_DRPATH'] = '${_concat(DRPATHPREFIX, RPATH, DRPATHSUFFIX, __env__)}'
-
- SCons.Tool.createStaticLibBuilder(env)
-
-
-def exists(env):
- return env.Detect('ldc2')
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/lex.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/lex.py
deleted file mode 100644
index 9f6557d..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/lex.py
+++ /dev/null
@@ -1,97 +0,0 @@
-"""SCons.Tool.lex
-
-Tool-specific initialization for lex.
-
-There normally shouldn't be any need to import this module directly.
-It will usually be imported through the generic SCons.Tool.Tool()
-selection method.
-
-"""
-
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-
-__revision__ = "src/engine/SCons/Tool/lex.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-import os.path
-
-import SCons.Action
-import SCons.Tool
-import SCons.Util
-
-LexAction = SCons.Action.Action("$LEXCOM", "$LEXCOMSTR")
-
-def lexEmitter(target, source, env):
- sourceBase, sourceExt = os.path.splitext(SCons.Util.to_String(source[0]))
-
- if sourceExt == ".lm": # If using Objective-C
- target = [sourceBase + ".m"] # the extension is ".m".
-
- # This emitter essentially tries to add to the target all extra
- # files generated by flex.
-
- # Different options that are used to trigger the creation of extra files.
- fileGenOptions = ["--header-file=", "--tables-file="]
-
- lexflags = env.subst("$LEXFLAGS", target=target, source=source)
- for option in SCons.Util.CLVar(lexflags):
- for fileGenOption in fileGenOptions:
- l = len(fileGenOption)
- if option[:l] == fileGenOption:
- # A file generating option is present, so add the
- # file name to the target list.
- fileName = option[l:].strip()
- target.append(fileName)
- return (target, source)
-
-def generate(env):
- """Add Builders and construction variables for lex to an Environment."""
- c_file, cxx_file = SCons.Tool.createCFileBuilders(env)
-
- # C
- c_file.add_action(".l", LexAction)
- c_file.add_emitter(".l", lexEmitter)
-
- c_file.add_action(".lex", LexAction)
- c_file.add_emitter(".lex", lexEmitter)
-
- # Objective-C
- cxx_file.add_action(".lm", LexAction)
- cxx_file.add_emitter(".lm", lexEmitter)
-
- # C++
- cxx_file.add_action(".ll", LexAction)
- cxx_file.add_emitter(".ll", lexEmitter)
-
- env["LEX"] = env.Detect("flex") or "lex"
- env["LEXFLAGS"] = SCons.Util.CLVar("")
- env["LEXCOM"] = "$LEX $LEXFLAGS -t $SOURCES > $TARGET"
-
-def exists(env):
- return env.Detect(["flex", "lex"])
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/link.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/link.py
deleted file mode 100644
index 6874301..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/link.py
+++ /dev/null
@@ -1,218 +0,0 @@
-"""SCons.Tool.link
-
-Tool-specific initialization for the generic Posix linker.
-
-There normally shouldn't be any need to import this module directly.
-It will usually be imported through the generic SCons.Tool.Tool()
-selection method.
-
-"""
-
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-
-__revision__ = "src/engine/SCons/Tool/link.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-import re
-
-import SCons.Defaults
-import SCons.Tool
-import SCons.Util
-import SCons.Warnings
-
-from SCons.Tool.FortranCommon import isfortran
-
-from SCons.Tool.DCommon import isD
-
-cplusplus = __import__('c++', globals(), locals(), [])
-
-issued_mixed_link_warning = False
-
-def smart_link(source, target, env, for_signature):
- has_cplusplus = cplusplus.iscplusplus(source)
- has_fortran = isfortran(env, source)
- has_d = isD(env, source)
- if has_cplusplus and has_fortran and not has_d:
- global issued_mixed_link_warning
- if not issued_mixed_link_warning:
- msg = "Using $CXX to link Fortran and C++ code together.\n\t" + \
- "This may generate a buggy executable if the '%s'\n\t" + \
- "compiler does not know how to deal with Fortran runtimes."
- SCons.Warnings.warn(SCons.Warnings.FortranCxxMixWarning,
- msg % env.subst('$CXX'))
- issued_mixed_link_warning = True
- return '$CXX'
- elif has_d:
- env['LINKCOM'] = env['DLINKCOM']
- env['SHLINKCOM'] = env['SHDLINKCOM']
- return '$DC'
- elif has_fortran:
- return '$FORTRAN'
- elif has_cplusplus:
- return '$CXX'
- return '$CC'
-
-def shlib_emitter(target, source, env):
- Verbose = False
- platform = env.subst('$PLATFORM')
- for tgt in target:
- tgt.attributes.shared = 1
- try:
- # target[0] comes in as libtest.so. Add the version extensions
- version = env.subst('$SHLIBVERSION')
- if version:
- version_names = shlib_emitter_names(target, source, env)
- # mark the target with the shared libraries name, including
- # the version number
- target[0].attributes.shlibname = version_names[0]
- shlib = env.File(version_names[0], directory=target[0].get_dir())
- target[0].attributes.shlibpath = shlib.get_internal_path()
- for name in version_names[1:]:
- env.SideEffect(name, shlib)
- env.Clean(shlib, name)
- if Verbose:
- print "shlib_emitter: add side effect - ",name
- env.Clean(shlib, target[0])
- return ([shlib], source)
- except KeyError:
- version = None
- return (target, source)
-
-def shlib_emitter_names(target, source, env):
- """Return list of file names that are side effects for a versioned library build. The first name in the list is the new name for the target"""
- Verbose = False
- platform = env.subst('$PLATFORM')
- version_names = []
- try:
- # target[0] comes in as libtest.so. Add the version extensions
- version = env.subst('$SHLIBVERSION')
- if version.count(".") != 2:
- # We need a version of the form x.y.z to proceed
- raise ValueError
- if version:
- if platform == 'posix' or platform == 'sunos':
- versionparts = version.split('.')
- if hasattr(target[0].attributes, 'shlibname'):
- name = target[0].attributes.shlibname
- else:
- name = target[0].name
- # generate library name with the version number
- version_name = name + '.' + version
- if Verbose:
- print "shlib_emitter_names: target is ", version_name
- print "shlib_emitter_names: side effect: ", name
- # add version_name to list of names to be a Side effect
- version_names.append(version_name)
- if Verbose:
- print "shlib_emitter_names: versionparts ",versionparts
- for ver in versionparts[0:-1]:
- name = name + '.' + ver
- if Verbose:
- print "shlib_emitter_names: side effect: ", name
- # add name to list of names to be a Side effect
- version_names.append(name)
- elif platform == 'darwin':
- shlib_suffix = env.subst('$SHLIBSUFFIX')
- if hasattr(target[0].attributes, 'shlibname'):
- name = target[0].attributes.shlibname
- else:
- name = target[0].name
- # generate library name with the version number
- suffix_re = re.escape(shlib_suffix)
- version_name = re.sub(suffix_re, '.' + version + shlib_suffix, name)
- if Verbose:
- print "shlib_emitter_names: target is ", version_name
- print "shlib_emitter_names: side effect: ", name
- # add version_name to list of names to be a Side effect
- version_names.append(version_name)
- elif platform == 'cygwin':
- shlib_suffix = env.subst('$SHLIBSUFFIX')
- if hasattr(target[0].attributes, 'shlibname'):
- name = target[0].attributes.shlibname
- else:
- name = target[0].name
- # generate library name with the version number
- suffix_re = re.escape(shlib_suffix)
- version_name = re.sub(suffix_re, '-' + re.sub('\.', '-', version) + shlib_suffix, name)
- if Verbose:
- print "shlib_emitter_names: target is ", version_name
- print "shlib_emitter_names: side effect: ", name
- # add version_name to list of names to be a Side effect
- version_names.append(version_name)
-
- except KeyError:
- version = None
- return version_names
-
-def generate(env):
- """Add Builders and construction variables for gnulink to an Environment."""
- SCons.Tool.createSharedLibBuilder(env)
- SCons.Tool.createProgBuilder(env)
-
- env['SHLINK'] = '$LINK'
- env['SHLINKFLAGS'] = SCons.Util.CLVar('$LINKFLAGS -shared')
- env['SHLINKCOM'] = '$SHLINK -o $TARGET $SHLINKFLAGS $__RPATH $SOURCES $_LIBDIRFLAGS $_LIBFLAGS'
- # don't set up the emitter, cause AppendUnique will generate a list
- # starting with None :-(
- env.Append(SHLIBEMITTER = [shlib_emitter])
- env['SMARTLINK'] = smart_link
- env['LINK'] = "$SMARTLINK"
- env['LINKFLAGS'] = SCons.Util.CLVar('')
- # __RPATH is only set to something ($_RPATH typically) on platforms that support it.
- env['LINKCOM'] = '$LINK -o $TARGET $LINKFLAGS $__RPATH $SOURCES $_LIBDIRFLAGS $_LIBFLAGS'
- env['LIBDIRPREFIX']='-L'
- env['LIBDIRSUFFIX']=''
- env['_LIBFLAGS']='${_stripixes(LIBLINKPREFIX, LIBS, LIBLINKSUFFIX, LIBPREFIXES, LIBSUFFIXES, __env__)}'
- env['LIBLINKPREFIX']='-l'
- env['LIBLINKSUFFIX']=''
-
- if env['PLATFORM'] == 'hpux':
- env['SHLIBSUFFIX'] = '.sl'
- elif env['PLATFORM'] == 'aix':
- env['SHLIBSUFFIX'] = '.a'
-
- # For most platforms, a loadable module is the same as a shared
- # library. Platforms which are different can override these, but
- # setting them the same means that LoadableModule works everywhere.
- SCons.Tool.createLoadableModuleBuilder(env)
- env['LDMODULE'] = '$SHLINK'
- # don't set up the emitter, cause AppendUnique will generate a list
- # starting with None :-(
- env.Append(LDMODULEEMITTER='$SHLIBEMITTER')
- env['LDMODULEPREFIX'] = '$SHLIBPREFIX'
- env['LDMODULESUFFIX'] = '$SHLIBSUFFIX'
- env['LDMODULEFLAGS'] = '$SHLINKFLAGS'
- env['LDMODULECOM'] = '$LDMODULE -o $TARGET $LDMODULEFLAGS $__RPATH $SOURCES $_LIBDIRFLAGS $_LIBFLAGS'
-
-
-
-def exists(env):
- # This module isn't really a Tool on its own, it's common logic for
- # other linkers.
- return None
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/linkloc.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/linkloc.py
deleted file mode 100644
index d2c218f..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/linkloc.py
+++ /dev/null
@@ -1,112 +0,0 @@
-"""SCons.Tool.linkloc
-
-Tool specification for the LinkLoc linker for the Phar Lap ETS embedded
-operating system.
-
-There normally shouldn't be any need to import this module directly.
-It will usually be imported through the generic SCons.Tool.Tool()
-selection method.
-
-"""
-
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-
-__revision__ = "src/engine/SCons/Tool/linkloc.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-import os.path
-import re
-
-import SCons.Action
-import SCons.Defaults
-import SCons.Errors
-import SCons.Tool
-import SCons.Util
-
-from SCons.Tool.MSCommon import msvs_exists, merge_default_version
-from SCons.Tool.PharLapCommon import addPharLapPaths
-
-_re_linker_command = re.compile(r'(\s)@\s*([^\s]+)')
-
-def repl_linker_command(m):
- # Replaces any linker command file directives (e.g. "@foo.lnk") with
- # the actual contents of the file.
- try:
- f=open(m.group(2), "r")
- return m.group(1) + f.read()
- except IOError:
- # the linker should return an error if it can't
- # find the linker command file so we will remain quiet.
- # However, we will replace the @ with a # so we will not continue
- # to find it with recursive substitution
- return m.group(1) + '#' + m.group(2)
-
-class LinklocGenerator(object):
- def __init__(self, cmdline):
- self.cmdline = cmdline
-
- def __call__(self, env, target, source, for_signature):
- if for_signature:
- # Expand the contents of any linker command files recursively
- subs = 1
- strsub = env.subst(self.cmdline, target=target, source=source)
- while subs:
- strsub, subs = _re_linker_command.subn(repl_linker_command, strsub)
- return strsub
- else:
- return "${TEMPFILE('" + self.cmdline + "')}"
-
-def generate(env):
- """Add Builders and construction variables for ar to an Environment."""
- SCons.Tool.createSharedLibBuilder(env)
- SCons.Tool.createProgBuilder(env)
-
- env['SUBST_CMD_FILE'] = LinklocGenerator
- env['SHLINK'] = '$LINK'
- env['SHLINKFLAGS'] = SCons.Util.CLVar('$LINKFLAGS')
- env['SHLINKCOM'] = '${SUBST_CMD_FILE("$SHLINK $SHLINKFLAGS $_LIBDIRFLAGS $_LIBFLAGS -dll $TARGET $SOURCES")}'
- env['SHLIBEMITTER']= None
- env['LINK'] = "linkloc"
- env['LINKFLAGS'] = SCons.Util.CLVar('')
- env['LINKCOM'] = '${SUBST_CMD_FILE("$LINK $LINKFLAGS $_LIBDIRFLAGS $_LIBFLAGS -exe $TARGET $SOURCES")}'
- env['LIBDIRPREFIX']='-libpath '
- env['LIBDIRSUFFIX']=''
- env['LIBLINKPREFIX']='-lib '
- env['LIBLINKSUFFIX']='$LIBSUFFIX'
-
- # Set-up ms tools paths for default version
- merge_default_version(env)
-
- addPharLapPaths(env)
-
-def exists(env):
- if msvs_exists():
- return env.Detect('linkloc')
- else:
- return 0
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/m4.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/m4.py
deleted file mode 100644
index dfc4665..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/m4.py
+++ /dev/null
@@ -1,63 +0,0 @@
-"""SCons.Tool.m4
-
-Tool-specific initialization for m4.
-
-There normally shouldn't be any need to import this module directly.
-It will usually be imported through the generic SCons.Tool.Tool()
-selection method.
-
-"""
-
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-
-__revision__ = "src/engine/SCons/Tool/m4.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-import SCons.Action
-import SCons.Builder
-import SCons.Util
-
-def generate(env):
- """Add Builders and construction variables for m4 to an Environment."""
- M4Action = SCons.Action.Action('$M4COM', '$M4COMSTR')
- bld = SCons.Builder.Builder(action = M4Action, src_suffix = '.m4')
-
- env['BUILDERS']['M4'] = bld
-
- # .m4 files might include other files, and it would be pretty hard
- # to write a scanner for it, so let's just cd to the dir of the m4
- # file and run from there.
- # The src_suffix setup is like so: file.c.m4 -> file.c,
- # file.cpp.m4 -> file.cpp etc.
- env['M4'] = 'm4'
- env['M4FLAGS'] = SCons.Util.CLVar('-E')
- env['M4COM'] = 'cd ${SOURCE.rsrcdir} && $M4 $M4FLAGS < ${SOURCE.file} > ${TARGET.abspath}'
-
-def exists(env):
- return env.Detect('m4')
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/masm.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/masm.py
deleted file mode 100644
index 7036de6..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/masm.py
+++ /dev/null
@@ -1,77 +0,0 @@
-"""SCons.Tool.masm
-
-Tool-specific initialization for the Microsoft Assembler.
-
-There normally shouldn't be any need to import this module directly.
-It will usually be imported through the generic SCons.Tool.Tool()
-selection method.
-
-"""
-
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-
-__revision__ = "src/engine/SCons/Tool/masm.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-import SCons.Defaults
-import SCons.Tool
-import SCons.Util
-
-ASSuffixes = ['.s', '.asm', '.ASM']
-ASPPSuffixes = ['.spp', '.SPP', '.sx']
-if SCons.Util.case_sensitive_suffixes('.s', '.S'):
- ASPPSuffixes.extend(['.S'])
-else:
- ASSuffixes.extend(['.S'])
-
-def generate(env):
- """Add Builders and construction variables for masm to an Environment."""
- static_obj, shared_obj = SCons.Tool.createObjBuilders(env)
-
- for suffix in ASSuffixes:
- static_obj.add_action(suffix, SCons.Defaults.ASAction)
- shared_obj.add_action(suffix, SCons.Defaults.ASAction)
- static_obj.add_emitter(suffix, SCons.Defaults.StaticObjectEmitter)
- shared_obj.add_emitter(suffix, SCons.Defaults.SharedObjectEmitter)
-
- for suffix in ASPPSuffixes:
- static_obj.add_action(suffix, SCons.Defaults.ASPPAction)
- shared_obj.add_action(suffix, SCons.Defaults.ASPPAction)
- static_obj.add_emitter(suffix, SCons.Defaults.StaticObjectEmitter)
- shared_obj.add_emitter(suffix, SCons.Defaults.SharedObjectEmitter)
-
- env['AS'] = 'ml'
- env['ASFLAGS'] = SCons.Util.CLVar('/nologo')
- env['ASPPFLAGS'] = '$ASFLAGS'
- env['ASCOM'] = '$AS $ASFLAGS /c /Fo$TARGET $SOURCES'
- env['ASPPCOM'] = '$CC $ASPPFLAGS $CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS /c /Fo$TARGET $SOURCES'
- env['STATIC_AND_SHARED_OBJECTS_ARE_THE_SAME'] = 1
-
-def exists(env):
- return env.Detect('ml')
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/midl.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/midl.py
deleted file mode 100644
index 0d93073..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/midl.py
+++ /dev/null
@@ -1,88 +0,0 @@
-"""SCons.Tool.midl
-
-Tool-specific initialization for midl (Microsoft IDL compiler).
-
-There normally shouldn't be any need to import this module directly.
-It will usually be imported through the generic SCons.Tool.Tool()
-selection method.
-
-"""
-
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-
-__revision__ = "src/engine/SCons/Tool/midl.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-import SCons.Action
-import SCons.Builder
-import SCons.Defaults
-import SCons.Scanner.IDL
-import SCons.Util
-
-from MSCommon import msvc_exists
-
-def midl_emitter(target, source, env):
- """Produces a list of outputs from the MIDL compiler"""
- base, ext = SCons.Util.splitext(str(target[0]))
- tlb = target[0]
- incl = base + '.h'
- interface = base + '_i.c'
- t = [tlb, incl, interface]
-
- midlcom = env['MIDLCOM']
-
- if midlcom.find('/proxy') != -1:
- proxy = base + '_p.c'
- t.append(proxy)
- if midlcom.find('/dlldata') != -1:
- dlldata = base + '_data.c'
- t.append(dlldata)
-
- return (t,source)
-
-idl_scanner = SCons.Scanner.IDL.IDLScan()
-
-midl_action = SCons.Action.Action('$MIDLCOM', '$MIDLCOMSTR')
-
-midl_builder = SCons.Builder.Builder(action = midl_action,
- src_suffix = '.idl',
- suffix='.tlb',
- emitter = midl_emitter,
- source_scanner = idl_scanner)
-
-def generate(env):
- """Add Builders and construction variables for midl to an Environment."""
-
- env['MIDL'] = 'MIDL.EXE'
- env['MIDLFLAGS'] = SCons.Util.CLVar('/nologo')
- env['MIDLCOM'] = '$MIDL $MIDLFLAGS /tlb ${TARGETS[0]} /h ${TARGETS[1]} /iid ${TARGETS[2]} /proxy ${TARGETS[3]} /dlldata ${TARGETS[4]} $SOURCE 2> NUL'
- env['BUILDERS']['TypeLibrary'] = midl_builder
-
-def exists(env):
- return msvc_exists()
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/mingw.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/mingw.py
deleted file mode 100644
index 236ce32..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/mingw.py
+++ /dev/null
@@ -1,180 +0,0 @@
-"""SCons.Tool.gcc
-
-Tool-specific initialization for MinGW (http://www.mingw.org/)
-
-There normally shouldn't be any need to import this module directly.
-It will usually be imported through the generic SCons.Tool.Tool()
-selection method.
-
-"""
-
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-
-__revision__ = "src/engine/SCons/Tool/mingw.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-import os
-import os.path
-
-import SCons.Action
-import SCons.Builder
-import SCons.Defaults
-import SCons.Tool
-import SCons.Util
-
-# This is what we search for to find mingw:
-key_program = 'mingw32-gcc'
-
-def find(env):
- # First search in the SCons path
- path=env.WhereIs(key_program)
- if (path):
- return path
- # then the OS path:
- path=SCons.Util.WhereIs(key_program)
- if (path):
- return path
-
- # If that doesn't work try default location for mingw
- save_path=env['ENV']['PATH']
- env.AppendENVPath('PATH',r'c:\MinGW\bin')
- path =env.WhereIs(key_program)
- if not path:
- env['ENV']['PATH']=save_path
- return path
-
-def shlib_generator(target, source, env, for_signature):
- cmd = SCons.Util.CLVar(['$SHLINK', '$SHLINKFLAGS'])
-
- dll = env.FindIxes(target, 'SHLIBPREFIX', 'SHLIBSUFFIX')
- if dll: cmd.extend(['-o', dll])
-
- cmd.extend(['$SOURCES', '$_LIBDIRFLAGS', '$_LIBFLAGS'])
-
- implib = env.FindIxes(target, 'LIBPREFIX', 'LIBSUFFIX')
- if implib: cmd.append('-Wl,--out-implib,'+implib.get_string(for_signature))
-
- def_target = env.FindIxes(target, 'WINDOWSDEFPREFIX', 'WINDOWSDEFSUFFIX')
- insert_def = env.subst("$WINDOWS_INSERT_DEF")
- if not insert_def in ['', '0', 0] and def_target: \
- cmd.append('-Wl,--output-def,'+def_target.get_string(for_signature))
-
- return [cmd]
-
-def shlib_emitter(target, source, env):
- dll = env.FindIxes(target, 'SHLIBPREFIX', 'SHLIBSUFFIX')
- no_import_lib = env.get('no_import_lib', 0)
-
- if not dll:
- raise SCons.Errors.UserError("A shared library should have exactly one target with the suffix: %s" % env.subst("$SHLIBSUFFIX"))
-
- if not no_import_lib and \
- not env.FindIxes(target, 'LIBPREFIX', 'LIBSUFFIX'):
-
- # Create list of target libraries as strings
- targetStrings=env.ReplaceIxes(dll,
- 'SHLIBPREFIX', 'SHLIBSUFFIX',
- 'LIBPREFIX', 'LIBSUFFIX')
-
- # Now add file nodes to target list
- target.append(env.fs.File(targetStrings))
-
- # Append a def file target if there isn't already a def file target
- # or a def file source or the user has explicitly asked for the target
- # to be emitted.
- def_source = env.FindIxes(source, 'WINDOWSDEFPREFIX', 'WINDOWSDEFSUFFIX')
- def_target = env.FindIxes(target, 'WINDOWSDEFPREFIX', 'WINDOWSDEFSUFFIX')
- skip_def_insert = env.subst("$WINDOWS_INSERT_DEF") in ['', '0', 0]
- if not def_source and not def_target and not skip_def_insert:
- # Create list of target libraries and def files as strings
- targetStrings=env.ReplaceIxes(dll,
- 'SHLIBPREFIX', 'SHLIBSUFFIX',
- 'WINDOWSDEFPREFIX', 'WINDOWSDEFSUFFIX')
-
- # Now add file nodes to target list
- target.append(env.fs.File(targetStrings))
-
- return (target, source)
-
-
-shlib_action = SCons.Action.Action(shlib_generator, generator=1)
-
-res_action = SCons.Action.Action('$RCCOM', '$RCCOMSTR')
-
-res_builder = SCons.Builder.Builder(action=res_action, suffix='.o',
- source_scanner=SCons.Tool.SourceFileScanner)
-SCons.Tool.SourceFileScanner.add_scanner('.rc', SCons.Defaults.CScan)
-
-def generate(env):
- mingw = find(env)
- if mingw:
- dir = os.path.dirname(mingw)
- env.PrependENVPath('PATH', dir )
-
-
- # Most of mingw is the same as gcc and friends...
- gnu_tools = ['gcc', 'g++', 'gnulink', 'ar', 'gas', 'gfortran', 'm4']
- for tool in gnu_tools:
- SCons.Tool.Tool(tool)(env)
-
- #... but a few things differ:
- env['CC'] = 'gcc'
- env['SHCCFLAGS'] = SCons.Util.CLVar('$CCFLAGS')
- env['CXX'] = 'g++'
- env['SHCXXFLAGS'] = SCons.Util.CLVar('$CXXFLAGS')
- env['SHLINKFLAGS'] = SCons.Util.CLVar('$LINKFLAGS -shared')
- env['SHLINKCOM'] = shlib_action
- env['LDMODULECOM'] = shlib_action
- env.Append(SHLIBEMITTER = [shlib_emitter])
- env['AS'] = 'as'
-
- env['WIN32DEFPREFIX'] = ''
- env['WIN32DEFSUFFIX'] = '.def'
- env['WINDOWSDEFPREFIX'] = '${WIN32DEFPREFIX}'
- env['WINDOWSDEFSUFFIX'] = '${WIN32DEFSUFFIX}'
-
- env['SHOBJSUFFIX'] = '.o'
- env['STATIC_AND_SHARED_OBJECTS_ARE_THE_SAME'] = 1
-
- env['RC'] = 'windres'
- env['RCFLAGS'] = SCons.Util.CLVar('')
- env['RCINCFLAGS'] = '$( ${_concat(RCINCPREFIX, CPPPATH, RCINCSUFFIX, __env__, RDirs, TARGET, SOURCE)} $)'
- env['RCINCPREFIX'] = '--include-dir '
- env['RCINCSUFFIX'] = ''
- env['RCCOM'] = '$RC $_CPPDEFFLAGS $RCINCFLAGS ${RCINCPREFIX} ${SOURCE.dir} $RCFLAGS -i $SOURCE -o $TARGET'
- env['BUILDERS']['RES'] = res_builder
-
- # Some setting from the platform also have to be overridden:
- env['OBJSUFFIX'] = '.o'
- env['LIBPREFIX'] = 'lib'
- env['LIBSUFFIX'] = '.a'
- env['PROGSUFFIX'] = '.exe'
-
-def exists(env):
- return find(env)
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/msgfmt.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/msgfmt.py
deleted file mode 100644
index 4cfe686..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/msgfmt.py
+++ /dev/null
@@ -1,108 +0,0 @@
-""" msgfmt tool """
-
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-__revision__ = "src/engine/SCons/Tool/msgfmt.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-from SCons.Builder import BuilderBase
-#############################################################################
-class _MOFileBuilder(BuilderBase):
- """ The builder class for `MO` files.
-
- The reason for this builder to exists and its purpose is quite simillar
- as for `_POFileBuilder`. This time, we extend list of sources, not targets,
- and call `BuilderBase._execute()` only once (as we assume single-target
- here).
- """
-
- def _execute(self, env, target, source, *args, **kw):
- # Here we add support for 'LINGUAS_FILE' keyword. Emitter is not suitable
- # in this case, as it is called too late (after multiple sources
- # are handled single_source builder.
- import SCons.Util
- from SCons.Tool.GettextCommon import _read_linguas_from_files
- linguas_files = None
- if env.has_key('LINGUAS_FILE') and env['LINGUAS_FILE'] is not None:
- linguas_files = env['LINGUAS_FILE']
- # This should prevent from endless recursion.
- env['LINGUAS_FILE'] = None
- # We read only languages. Suffixes shall be added automatically.
- linguas = _read_linguas_from_files(env, linguas_files)
- if SCons.Util.is_List(source):
- source.extend(linguas)
- elif source is not None:
- source = [source] + linguas
- else:
- source = linguas
- result = BuilderBase._execute(self,env,target,source,*args, **kw)
- if linguas_files is not None:
- env['LINGUAS_FILE'] = linguas_files
- return result
-#############################################################################
-
-#############################################################################
-def _create_mo_file_builder(env, **kw):
- """ Create builder object for `MOFiles` builder """
- import SCons.Action
- # FIXME: What factory use for source? Ours or their?
- kw['action'] = SCons.Action.Action('$MSGFMTCOM','$MSGFMTCOMSTR')
- kw['suffix'] = '$MOSUFFIX'
- kw['src_suffix'] = '$POSUFFIX'
- kw['src_builder'] = '_POUpdateBuilder'
- kw['single_source'] = True
- return _MOFileBuilder(**kw)
-#############################################################################
-
-#############################################################################
-def generate(env,**kw):
- """ Generate `msgfmt` tool """
- import SCons.Util
- from SCons.Tool.GettextCommon import _detect_msgfmt
- try:
- env['MSGFMT'] = _detect_msgfmt(env)
- except:
- env['MSGFMT'] = 'msgfmt'
- env.SetDefault(
- MSGFMTFLAGS = [ SCons.Util.CLVar('-c') ],
- MSGFMTCOM = '$MSGFMT $MSGFMTFLAGS -o $TARGET $SOURCE',
- MSGFMTCOMSTR = '',
- MOSUFFIX = ['.mo'],
- POSUFFIX = ['.po']
- )
- env.Append( BUILDERS = { 'MOFiles' : _create_mo_file_builder(env) } )
-#############################################################################
-
-#############################################################################
-def exists(env):
- """ Check if the tool exists """
- from SCons.Tool.GettextCommon import _msgfmt_exists
- try:
- return _msgfmt_exists(env)
- except:
- return False
-#############################################################################
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/msginit.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/msginit.py
deleted file mode 100644
index 53046d6..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/msginit.py
+++ /dev/null
@@ -1,120 +0,0 @@
-""" msginit tool
-
-Tool specific initialization of msginit tool.
-"""
-
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-__revision__ = "src/engine/SCons/Tool/msginit.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-import SCons.Warnings
-import SCons.Builder
-import re
-
-#############################################################################
-def _optional_no_translator_flag(env):
- """ Return '--no-translator' flag if we run *msginit(1)* in non-interactive
- mode."""
- import SCons.Util
- if env.has_key('POAUTOINIT'):
- autoinit = env['POAUTOINIT']
- else:
- autoinit = False
- if autoinit:
- return [SCons.Util.CLVar('--no-translator')]
- else:
- return [SCons.Util.CLVar('')]
-#############################################################################
-
-#############################################################################
-def _POInitBuilder(env, **kw):
- """ Create builder object for `POInit` builder. """
- import SCons.Action
- from SCons.Tool.GettextCommon import _init_po_files, _POFileBuilder
- action = SCons.Action.Action(_init_po_files, None)
- return _POFileBuilder(env, action=action, target_alias='$POCREATE_ALIAS')
-#############################################################################
-
-#############################################################################
-from SCons.Environment import _null
-#############################################################################
-def _POInitBuilderWrapper(env, target=None, source=_null, **kw):
- """ Wrapper for _POFileBuilder. We use it to make user's life easier.
-
- This wrapper checks for `$POTDOMAIN` construction variable (or override in
- `**kw`) and treats it appropriatelly.
- """
- if source is _null:
- if 'POTDOMAIN' in kw:
- domain = kw['POTDOMAIN']
- elif env.has_key('POTDOMAIN'):
- domain = env['POTDOMAIN']
- else:
- domain = 'messages'
- source = [ domain ] # NOTE: Suffix shall be appended automatically
- return env._POInitBuilder(target, source, **kw)
-#############################################################################
-
-#############################################################################
-def generate(env,**kw):
- """ Generate the `msginit` tool """
- import SCons.Util
- from SCons.Tool.GettextCommon import _detect_msginit
- try:
- env['MSGINIT'] = _detect_msginit(env)
- except:
- env['MSGINIT'] = 'msginit'
- msginitcom = '$MSGINIT ${_MSGNoTranslator(__env__)} -l ${_MSGINITLOCALE}' \
- + ' $MSGINITFLAGS -i $SOURCE -o $TARGET'
- # NOTE: We set POTSUFFIX here, in case the 'xgettext' is not loaded
- # (sometimes we really don't need it)
- env.SetDefault(
- POSUFFIX = ['.po'],
- POTSUFFIX = ['.pot'],
- _MSGINITLOCALE = '${TARGET.filebase}',
- _MSGNoTranslator = _optional_no_translator_flag,
- MSGINITCOM = msginitcom,
- MSGINITCOMSTR = '',
- MSGINITFLAGS = [ ],
- POAUTOINIT = False,
- POCREATE_ALIAS = 'po-create'
- )
- env.Append( BUILDERS = { '_POInitBuilder' : _POInitBuilder(env) } )
- env.AddMethod(_POInitBuilderWrapper, 'POInit')
- env.AlwaysBuild(env.Alias('$POCREATE_ALIAS'))
-#############################################################################
-
-#############################################################################
-def exists(env):
- """ Check if the tool exists """
- from SCons.Tool.GettextCommon import _msginit_exists
- try:
- return _msginit_exists(env)
- except:
- return False
-#############################################################################
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/msgmerge.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/msgmerge.py
deleted file mode 100644
index e2d06f4..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/msgmerge.py
+++ /dev/null
@@ -1,104 +0,0 @@
-""" msgmerget tool
-
-Tool specific initialization for `msgmerge` tool.
-"""
-
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-__revision__ = "src/engine/SCons/Tool/msgmerge.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-#############################################################################
-def _update_or_init_po_files(target, source, env):
- """ Action function for `POUpdate` builder """
- import SCons.Action
- from SCons.Tool.GettextCommon import _init_po_files
- for tgt in target:
- if tgt.rexists():
- action = SCons.Action.Action('$MSGMERGECOM', '$MSGMERGECOMSTR')
- else:
- action = _init_po_files
- status = action([tgt], source, env)
- if status : return status
- return 0
-#############################################################################
-
-#############################################################################
-def _POUpdateBuilder(env, **kw):
- """ Create an object of `POUpdate` builder """
- import SCons.Action
- from SCons.Tool.GettextCommon import _POFileBuilder
- action = SCons.Action.Action(_update_or_init_po_files, None)
- return _POFileBuilder(env, action=action, target_alias='$POUPDATE_ALIAS')
-#############################################################################
-
-#############################################################################
-from SCons.Environment import _null
-#############################################################################
-def _POUpdateBuilderWrapper(env, target=None, source=_null, **kw):
- """ Wrapper for `POUpdate` builder - make user's life easier """
- if source is _null:
- if 'POTDOMAIN' in kw:
- domain = kw['POTDOMAIN']
- elif env.has_key('POTDOMAIN') and env['POTDOMAIN']:
- domain = env['POTDOMAIN']
- else:
- domain = 'messages'
- source = [ domain ] # NOTE: Suffix shall be appended automatically
- return env._POUpdateBuilder(target, source, **kw)
-#############################################################################
-
-#############################################################################
-def generate(env,**kw):
- """ Generate the `xgettext` tool """
- from SCons.Tool.GettextCommon import _detect_msgmerge
- try:
- env['MSGMERGE'] = _detect_msgmerge(env)
- except:
- env['MSGMERGE'] = 'msgmerge'
- env.SetDefault(
- POTSUFFIX = ['.pot'],
- POSUFFIX = ['.po'],
- MSGMERGECOM = '$MSGMERGE $MSGMERGEFLAGS --update $TARGET $SOURCE',
- MSGMERGECOMSTR = '',
- MSGMERGEFLAGS = [ ],
- POUPDATE_ALIAS = 'po-update'
- )
- env.Append(BUILDERS = { '_POUpdateBuilder':_POUpdateBuilder(env) })
- env.AddMethod(_POUpdateBuilderWrapper, 'POUpdate')
- env.AlwaysBuild(env.Alias('$POUPDATE_ALIAS'))
-#############################################################################
-
-#############################################################################
-def exists(env):
- """ Check if the tool exists """
- from SCons.Tool.GettextCommon import _msgmerge_exists
- try:
- return _msgmerge_exists(env)
- except:
- return False
-#############################################################################
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/mslib.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/mslib.py
deleted file mode 100644
index a82e88d..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/mslib.py
+++ /dev/null
@@ -1,64 +0,0 @@
-"""SCons.Tool.mslib
-
-Tool-specific initialization for lib (MicroSoft library archiver).
-
-There normally shouldn't be any need to import this module directly.
-It will usually be imported through the generic SCons.Tool.Tool()
-selection method.
-
-"""
-
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-
-__revision__ = "src/engine/SCons/Tool/mslib.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-import SCons.Defaults
-import SCons.Tool
-import SCons.Tool.msvs
-import SCons.Tool.msvc
-import SCons.Util
-
-from MSCommon import msvc_exists, msvc_setup_env_once
-
-def generate(env):
- """Add Builders and construction variables for lib to an Environment."""
- SCons.Tool.createStaticLibBuilder(env)
-
- # Set-up ms tools paths
- msvc_setup_env_once(env)
-
- env['AR'] = 'lib'
- env['ARFLAGS'] = SCons.Util.CLVar('/nologo')
- env['ARCOM'] = "${TEMPFILE('$AR $ARFLAGS /OUT:$TARGET $SOURCES','$ARCOMSTR')}"
- env['LIBPREFIX'] = ''
- env['LIBSUFFIX'] = '.lib'
-
-def exists(env):
- return msvc_exists()
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/mslink.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/mslink.py
deleted file mode 100644
index 6906303..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/mslink.py
+++ /dev/null
@@ -1,335 +0,0 @@
-"""SCons.Tool.mslink
-
-Tool-specific initialization for the Microsoft linker.
-
-There normally shouldn't be any need to import this module directly.
-It will usually be imported through the generic SCons.Tool.Tool()
-selection method.
-
-"""
-
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-
-__revision__ = "src/engine/SCons/Tool/mslink.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-import os.path
-
-import SCons.Action
-import SCons.Defaults
-import SCons.Errors
-import SCons.Platform.win32
-import SCons.Tool
-import SCons.Tool.msvc
-import SCons.Tool.msvs
-import SCons.Util
-
-from MSCommon import msvc_setup_env_once, msvc_exists
-
-def pdbGenerator(env, target, source, for_signature):
- try:
- return ['/PDB:%s' % target[0].attributes.pdb, '/DEBUG']
- except (AttributeError, IndexError):
- return None
-
-def _dllTargets(target, source, env, for_signature, paramtp):
- listCmd = []
- dll = env.FindIxes(target, '%sPREFIX' % paramtp, '%sSUFFIX' % paramtp)
- if dll: listCmd.append("/out:%s"%dll.get_string(for_signature))
-
- implib = env.FindIxes(target, 'LIBPREFIX', 'LIBSUFFIX')
- if implib: listCmd.append("/implib:%s"%implib.get_string(for_signature))
-
- return listCmd
-
-def _dllSources(target, source, env, for_signature, paramtp):
- listCmd = []
-
- deffile = env.FindIxes(source, "WINDOWSDEFPREFIX", "WINDOWSDEFSUFFIX")
- for src in source:
- # Check explicitly for a non-None deffile so that the __cmp__
- # method of the base SCons.Util.Proxy class used for some Node
- # proxies doesn't try to use a non-existent __dict__ attribute.
- if deffile and src == deffile:
- # Treat this source as a .def file.
- listCmd.append("/def:%s" % src.get_string(for_signature))
- else:
- # Just treat it as a generic source file.
- listCmd.append(src)
- return listCmd
-
-def windowsShlinkTargets(target, source, env, for_signature):
- return _dllTargets(target, source, env, for_signature, 'SHLIB')
-
-def windowsShlinkSources(target, source, env, for_signature):
- return _dllSources(target, source, env, for_signature, 'SHLIB')
-
-def _windowsLdmodTargets(target, source, env, for_signature):
- """Get targets for loadable modules."""
- return _dllTargets(target, source, env, for_signature, 'LDMODULE')
-
-def _windowsLdmodSources(target, source, env, for_signature):
- """Get sources for loadable modules."""
- return _dllSources(target, source, env, for_signature, 'LDMODULE')
-
-def _dllEmitter(target, source, env, paramtp):
- """Common implementation of dll emitter."""
- SCons.Tool.msvc.validate_vars(env)
-
- extratargets = []
- extrasources = []
-
- dll = env.FindIxes(target, '%sPREFIX' % paramtp, '%sSUFFIX' % paramtp)
- no_import_lib = env.get('no_import_lib', 0)
-
- if not dll:
- raise SCons.Errors.UserError('A shared library should have exactly one target with the suffix: %s' % env.subst('$%sSUFFIX' % paramtp))
-
- insert_def = env.subst("$WINDOWS_INSERT_DEF")
- if not insert_def in ['', '0', 0] and \
- not env.FindIxes(source, "WINDOWSDEFPREFIX", "WINDOWSDEFSUFFIX"):
-
- # append a def file to the list of sources
- extrasources.append(
- env.ReplaceIxes(dll,
- '%sPREFIX' % paramtp, '%sSUFFIX' % paramtp,
- "WINDOWSDEFPREFIX", "WINDOWSDEFSUFFIX"))
-
- version_num, suite = SCons.Tool.msvs.msvs_parse_version(env.get('MSVS_VERSION', '6.0'))
- if version_num >= 8.0 and \
- (env.get('WINDOWS_INSERT_MANIFEST', 0) or env.get('WINDOWS_EMBED_MANIFEST', 0)):
- # MSVC 8 and above automatically generate .manifest files that must be installed
- extratargets.append(
- env.ReplaceIxes(dll,
- '%sPREFIX' % paramtp, '%sSUFFIX' % paramtp,
- "WINDOWSSHLIBMANIFESTPREFIX", "WINDOWSSHLIBMANIFESTSUFFIX"))
-
- if 'PDB' in env and env['PDB']:
- pdb = env.arg2nodes('$PDB', target=target, source=source)[0]
- extratargets.append(pdb)
- target[0].attributes.pdb = pdb
-
- if version_num >= 11.0 and env.get('PCH', 0):
- # MSVC 11 and above need the PCH object file to be added to the link line,
- # otherwise you get link error LNK2011.
- pchobj = SCons.Util.splitext(str(env['PCH']))[0] + '.obj'
- # print "prog_emitter, version %s, appending pchobj %s"%(version_num, pchobj)
- if pchobj not in extrasources:
- extrasources.append(pchobj)
-
- if not no_import_lib and \
- not env.FindIxes(target, "LIBPREFIX", "LIBSUFFIX"):
- # Append an import library to the list of targets.
- extratargets.append(
- env.ReplaceIxes(dll,
- '%sPREFIX' % paramtp, '%sSUFFIX' % paramtp,
- "LIBPREFIX", "LIBSUFFIX"))
- # and .exp file is created if there are exports from a DLL
- extratargets.append(
- env.ReplaceIxes(dll,
- '%sPREFIX' % paramtp, '%sSUFFIX' % paramtp,
- "WINDOWSEXPPREFIX", "WINDOWSEXPSUFFIX"))
-
- return (target+extratargets, source+extrasources)
-
-def windowsLibEmitter(target, source, env):
- return _dllEmitter(target, source, env, 'SHLIB')
-
-def ldmodEmitter(target, source, env):
- """Emitter for loadable modules.
-
- Loadable modules are identical to shared libraries on Windows, but building
- them is subject to different parameters (LDMODULE*).
- """
- return _dllEmitter(target, source, env, 'LDMODULE')
-
-def prog_emitter(target, source, env):
- SCons.Tool.msvc.validate_vars(env)
-
- extratargets = []
- extrasources = []
-
- exe = env.FindIxes(target, "PROGPREFIX", "PROGSUFFIX")
- if not exe:
- raise SCons.Errors.UserError("An executable should have exactly one target with the suffix: %s" % env.subst("$PROGSUFFIX"))
-
- version_num, suite = SCons.Tool.msvs.msvs_parse_version(env.get('MSVS_VERSION', '6.0'))
- if version_num >= 8.0 and \
- (env.get('WINDOWS_INSERT_MANIFEST', 0) or env.get('WINDOWS_EMBED_MANIFEST', 0)):
- # MSVC 8 and above automatically generate .manifest files that have to be installed
- extratargets.append(
- env.ReplaceIxes(exe,
- "PROGPREFIX", "PROGSUFFIX",
- "WINDOWSPROGMANIFESTPREFIX", "WINDOWSPROGMANIFESTSUFFIX"))
-
- if 'PDB' in env and env['PDB']:
- pdb = env.arg2nodes('$PDB', target=target, source=source)[0]
- extratargets.append(pdb)
- target[0].attributes.pdb = pdb
-
- if version_num >= 11.0 and env.get('PCH', 0):
- # MSVC 11 and above need the PCH object file to be added to the link line,
- # otherwise you get link error LNK2011.
- pchobj = SCons.Util.splitext(str(env['PCH']))[0] + '.obj'
- # print "prog_emitter, version %s, appending pchobj %s"%(version_num, pchobj)
- if pchobj not in extrasources:
- extrasources.append(pchobj)
-
- return (target+extratargets,source+extrasources)
-
-def RegServerFunc(target, source, env):
- if 'register' in env and env['register']:
- ret = regServerAction([target[0]], [source[0]], env)
- if ret:
- raise SCons.Errors.UserError("Unable to register %s" % target[0])
- else:
- print "Registered %s sucessfully" % target[0]
- return ret
- return 0
-
-# These are the actual actions run to embed the manifest.
-# They are only called from the Check versions below.
-embedManifestExeAction = SCons.Action.Action('$MTEXECOM')
-embedManifestDllAction = SCons.Action.Action('$MTSHLIBCOM')
-
-def embedManifestDllCheck(target, source, env):
- """Function run by embedManifestDllCheckAction to check for existence of manifest
- and other conditions, and embed the manifest by calling embedManifestDllAction if so."""
- if env.get('WINDOWS_EMBED_MANIFEST', 0):
- manifestSrc = target[0].get_abspath() + '.manifest'
- if os.path.exists(manifestSrc):
- ret = (embedManifestDllAction) ([target[0]],None,env)
- if ret:
- raise SCons.Errors.UserError, "Unable to embed manifest into %s" % (target[0])
- return ret
- else:
- print '(embed: no %s.manifest found; not embedding.)'%str(target[0])
- return 0
-
-def embedManifestExeCheck(target, source, env):
- """Function run by embedManifestExeCheckAction to check for existence of manifest
- and other conditions, and embed the manifest by calling embedManifestExeAction if so."""
- if env.get('WINDOWS_EMBED_MANIFEST', 0):
- manifestSrc = target[0].get_abspath() + '.manifest'
- if os.path.exists(manifestSrc):
- ret = (embedManifestExeAction) ([target[0]],None,env)
- if ret:
- raise SCons.Errors.UserError, "Unable to embed manifest into %s" % (target[0])
- return ret
- else:
- print '(embed: no %s.manifest found; not embedding.)'%str(target[0])
- return 0
-
-embedManifestDllCheckAction = SCons.Action.Action(embedManifestDllCheck, None)
-embedManifestExeCheckAction = SCons.Action.Action(embedManifestExeCheck, None)
-
-regServerAction = SCons.Action.Action("$REGSVRCOM", "$REGSVRCOMSTR")
-regServerCheck = SCons.Action.Action(RegServerFunc, None)
-shlibLinkAction = SCons.Action.Action('${TEMPFILE("$SHLINK $SHLINKFLAGS $_SHLINK_TARGETS $_LIBDIRFLAGS $_LIBFLAGS $_PDB $_SHLINK_SOURCES", "$SHLINKCOMSTR")}', '$SHLINKCOMSTR')
-compositeShLinkAction = shlibLinkAction + regServerCheck + embedManifestDllCheckAction
-ldmodLinkAction = SCons.Action.Action('${TEMPFILE("$LDMODULE $LDMODULEFLAGS $_LDMODULE_TARGETS $_LIBDIRFLAGS $_LIBFLAGS $_PDB $_LDMODULE_SOURCES", "$LDMODULECOMSTR")}', '$LDMODULECOMSTR')
-compositeLdmodAction = ldmodLinkAction + regServerCheck + embedManifestDllCheckAction
-exeLinkAction = SCons.Action.Action('${TEMPFILE("$LINK $LINKFLAGS /OUT:$TARGET.windows $_LIBDIRFLAGS $_LIBFLAGS $_PDB $SOURCES.windows", "$LINKCOMSTR")}', '$LINKCOMSTR')
-compositeLinkAction = exeLinkAction + embedManifestExeCheckAction
-
-def generate(env):
- """Add Builders and construction variables for ar to an Environment."""
- SCons.Tool.createSharedLibBuilder(env)
- SCons.Tool.createProgBuilder(env)
-
- env['SHLINK'] = '$LINK'
- env['SHLINKFLAGS'] = SCons.Util.CLVar('$LINKFLAGS /dll')
- env['_SHLINK_TARGETS'] = windowsShlinkTargets
- env['_SHLINK_SOURCES'] = windowsShlinkSources
- env['SHLINKCOM'] = compositeShLinkAction
- env.Append(SHLIBEMITTER = [windowsLibEmitter])
- env['LINK'] = 'link'
- env['LINKFLAGS'] = SCons.Util.CLVar('/nologo')
- env['_PDB'] = pdbGenerator
- env['LINKCOM'] = compositeLinkAction
- env.Append(PROGEMITTER = [prog_emitter])
- env['LIBDIRPREFIX']='/LIBPATH:'
- env['LIBDIRSUFFIX']=''
- env['LIBLINKPREFIX']=''
- env['LIBLINKSUFFIX']='$LIBSUFFIX'
-
- env['WIN32DEFPREFIX'] = ''
- env['WIN32DEFSUFFIX'] = '.def'
- env['WIN32_INSERT_DEF'] = 0
- env['WINDOWSDEFPREFIX'] = '${WIN32DEFPREFIX}'
- env['WINDOWSDEFSUFFIX'] = '${WIN32DEFSUFFIX}'
- env['WINDOWS_INSERT_DEF'] = '${WIN32_INSERT_DEF}'
-
- env['WIN32EXPPREFIX'] = ''
- env['WIN32EXPSUFFIX'] = '.exp'
- env['WINDOWSEXPPREFIX'] = '${WIN32EXPPREFIX}'
- env['WINDOWSEXPSUFFIX'] = '${WIN32EXPSUFFIX}'
-
- env['WINDOWSSHLIBMANIFESTPREFIX'] = ''
- env['WINDOWSSHLIBMANIFESTSUFFIX'] = '${SHLIBSUFFIX}.manifest'
- env['WINDOWSPROGMANIFESTPREFIX'] = ''
- env['WINDOWSPROGMANIFESTSUFFIX'] = '${PROGSUFFIX}.manifest'
-
- env['REGSVRACTION'] = regServerCheck
- env['REGSVR'] = os.path.join(SCons.Platform.win32.get_system_root(),'System32','regsvr32')
- env['REGSVRFLAGS'] = '/s '
- env['REGSVRCOM'] = '$REGSVR $REGSVRFLAGS ${TARGET.windows}'
-
- env['WINDOWS_EMBED_MANIFEST'] = 0
- env['MT'] = 'mt'
- #env['MTFLAGS'] = ['-hashupdate']
- env['MTFLAGS'] = SCons.Util.CLVar('/nologo')
- # Note: use - here to prevent build failure if no manifest produced.
- # This seems much simpler than a fancy system using a function action to see
- # if the manifest actually exists before trying to run mt with it.
- env['MTEXECOM'] = '-$MT $MTFLAGS -manifest ${TARGET}.manifest $_MANIFEST_SOURCES -outputresource:$TARGET;1'
- env['MTSHLIBCOM'] = '-$MT $MTFLAGS -manifest ${TARGET}.manifest $_MANIFEST_SOURCES -outputresource:$TARGET;2'
- # Future work garyo 27-Feb-11
- env['_MANIFEST_SOURCES'] = None # _windowsManifestSources
-
- # Set-up ms tools paths
- msvc_setup_env_once(env)
-
-
- # Loadable modules are on Windows the same as shared libraries, but they
- # are subject to different build parameters (LDMODULE* variables).
- # Therefore LDMODULE* variables correspond as much as possible to
- # SHLINK*/SHLIB* ones.
- SCons.Tool.createLoadableModuleBuilder(env)
- env['LDMODULE'] = '$SHLINK'
- env['LDMODULEPREFIX'] = '$SHLIBPREFIX'
- env['LDMODULESUFFIX'] = '$SHLIBSUFFIX'
- env['LDMODULEFLAGS'] = '$SHLINKFLAGS'
- env['_LDMODULE_TARGETS'] = _windowsLdmodTargets
- env['_LDMODULE_SOURCES'] = _windowsLdmodSources
- env['LDMODULEEMITTER'] = [ldmodEmitter]
- env['LDMODULECOM'] = compositeLdmodAction
-
-def exists(env):
- return msvc_exists()
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/mssdk.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/mssdk.py
deleted file mode 100644
index 3836817..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/mssdk.py
+++ /dev/null
@@ -1,50 +0,0 @@
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-
-__revision__ = "src/engine/SCons/Tool/mssdk.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-"""engine.SCons.Tool.mssdk
-
-Tool-specific initialization for Microsoft SDKs, both Platform
-SDKs and Windows SDKs.
-
-There normally shouldn't be any need to import this module directly.
-It will usually be imported through the generic SCons.Tool.Tool()
-selection method.
-"""
-
-from MSCommon import mssdk_exists, \
- mssdk_setup_env
-
-def generate(env):
- """Add construction variables for an MS SDK to an Environment."""
- mssdk_setup_env(env)
-
-def exists(env):
- return mssdk_exists()
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/msvc.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/msvc.py
deleted file mode 100644
index 03d65ee..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/msvc.py
+++ /dev/null
@@ -1,278 +0,0 @@
-"""engine.SCons.Tool.msvc
-
-Tool-specific initialization for Microsoft Visual C/C++.
-
-There normally shouldn't be any need to import this module directly.
-It will usually be imported through the generic SCons.Tool.Tool()
-selection method.
-
-"""
-
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-
-__revision__ = "src/engine/SCons/Tool/msvc.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-import os.path
-import re
-import sys
-
-import SCons.Action
-import SCons.Builder
-import SCons.Errors
-import SCons.Platform.win32
-import SCons.Tool
-import SCons.Tool.msvs
-import SCons.Util
-import SCons.Warnings
-import SCons.Scanner.RC
-
-from MSCommon import msvc_exists, msvc_setup_env_once
-
-CSuffixes = ['.c', '.C']
-CXXSuffixes = ['.cc', '.cpp', '.cxx', '.c++', '.C++']
-
-def validate_vars(env):
- """Validate the PCH and PCHSTOP construction variables."""
- if 'PCH' in env and env['PCH']:
- if 'PCHSTOP' not in env:
- raise SCons.Errors.UserError("The PCHSTOP construction must be defined if PCH is defined.")
- if not SCons.Util.is_String(env['PCHSTOP']):
- raise SCons.Errors.UserError("The PCHSTOP construction variable must be a string: %r"%env['PCHSTOP'])
-
-def pch_emitter(target, source, env):
- """Adds the object file target."""
-
- validate_vars(env)
-
- pch = None
- obj = None
-
- for t in target:
- if SCons.Util.splitext(str(t))[1] == '.pch':
- pch = t
- if SCons.Util.splitext(str(t))[1] == '.obj':
- obj = t
-
- if not obj:
- obj = SCons.Util.splitext(str(pch))[0]+'.obj'
-
- target = [pch, obj] # pch must be first, and obj second for the PCHCOM to work
-
- return (target, source)
-
-def object_emitter(target, source, env, parent_emitter):
- """Sets up the PCH dependencies for an object file."""
-
- validate_vars(env)
-
- parent_emitter(target, source, env)
-
- # Add a dependency, but only if the target (e.g. 'Source1.obj')
- # doesn't correspond to the pre-compiled header ('Source1.pch').
- # If the basenames match, then this was most likely caused by
- # someone adding the source file to both the env.PCH() and the
- # env.Program() calls, and adding the explicit dependency would
- # cause a cycle on the .pch file itself.
- #
- # See issue #2505 for a discussion of what to do if it turns
- # out this assumption causes trouble in the wild:
- # http://scons.tigris.org/issues/show_bug.cgi?id=2505
- if 'PCH' in env:
- pch = env['PCH']
- if str(target[0]) != SCons.Util.splitext(str(pch))[0] + '.obj':
- env.Depends(target, pch)
-
- return (target, source)
-
-def static_object_emitter(target, source, env):
- return object_emitter(target, source, env,
- SCons.Defaults.StaticObjectEmitter)
-
-def shared_object_emitter(target, source, env):
- return object_emitter(target, source, env,
- SCons.Defaults.SharedObjectEmitter)
-
-pch_action = SCons.Action.Action('$PCHCOM', '$PCHCOMSTR')
-pch_builder = SCons.Builder.Builder(action=pch_action, suffix='.pch',
- emitter=pch_emitter,
- source_scanner=SCons.Tool.SourceFileScanner)
-
-
-# Logic to build .rc files into .res files (resource files)
-res_scanner = SCons.Scanner.RC.RCScan()
-res_action = SCons.Action.Action('$RCCOM', '$RCCOMSTR')
-res_builder = SCons.Builder.Builder(action=res_action,
- src_suffix='.rc',
- suffix='.res',
- src_builder=[],
- source_scanner=res_scanner)
-
-def msvc_batch_key(action, env, target, source):
- """
- Returns a key to identify unique batches of sources for compilation.
-
- If batching is enabled (via the $MSVC_BATCH setting), then all
- target+source pairs that use the same action, defined by the same
- environment, and have the same target and source directories, will
- be batched.
-
- Returning None specifies that the specified target+source should not
- be batched with other compilations.
- """
-
- # Fixing MSVC_BATCH mode. Previous if did not work when MSVC_BATCH
- # was set to False. This new version should work better.
- # Note we need to do the env.subst so $MSVC_BATCH can be a reference to
- # another construction variable, which is why we test for False and 0
- # as strings.
- if not 'MSVC_BATCH' in env or env.subst('$MSVC_BATCH') in ('0', 'False', '', None):
- # We're not using batching; return no key.
- return None
- t = target[0]
- s = source[0]
- if os.path.splitext(t.name)[0] != os.path.splitext(s.name)[0]:
- # The base names are different, so this *must* be compiled
- # separately; return no key.
- return None
- return (id(action), id(env), t.dir, s.dir)
-
-def msvc_output_flag(target, source, env, for_signature):
- """
- Returns the correct /Fo flag for batching.
-
- If batching is disabled or there's only one source file, then we
- return an /Fo string that specifies the target explicitly. Otherwise,
- we return an /Fo string that just specifies the first target's
- directory (where the Visual C/C++ compiler will put the .obj files).
- """
-
- # Fixing MSVC_BATCH mode. Previous if did not work when MSVC_BATCH
- # was set to False. This new version should work better. Removed
- # len(source)==1 as batch mode can compile only one file
- # (and it also fixed problem with compiling only one changed file
- # with batch mode enabled)
- if not 'MSVC_BATCH' in env or env.subst('$MSVC_BATCH') in ('0', 'False', '', None):
- return '/Fo$TARGET'
- else:
- # The Visual C/C++ compiler requires a \ at the end of the /Fo
- # option to indicate an output directory. We use os.sep here so
- # that the test(s) for this can be run on non-Windows systems
- # without having a hard-coded backslash mess up command-line
- # argument parsing.
- return '/Fo${TARGET.dir}' + os.sep
-
-CAction = SCons.Action.Action("$CCCOM", "$CCCOMSTR",
- batch_key=msvc_batch_key,
- targets='$CHANGED_TARGETS')
-ShCAction = SCons.Action.Action("$SHCCCOM", "$SHCCCOMSTR",
- batch_key=msvc_batch_key,
- targets='$CHANGED_TARGETS')
-CXXAction = SCons.Action.Action("$CXXCOM", "$CXXCOMSTR",
- batch_key=msvc_batch_key,
- targets='$CHANGED_TARGETS')
-ShCXXAction = SCons.Action.Action("$SHCXXCOM", "$SHCXXCOMSTR",
- batch_key=msvc_batch_key,
- targets='$CHANGED_TARGETS')
-
-def generate(env):
- """Add Builders and construction variables for MSVC++ to an Environment."""
- static_obj, shared_obj = SCons.Tool.createObjBuilders(env)
-
- # TODO(batch): shouldn't reach in to cmdgen this way; necessary
- # for now to bypass the checks in Builder.DictCmdGenerator.__call__()
- # and allow .cc and .cpp to be compiled in the same command line.
- static_obj.cmdgen.source_ext_match = False
- shared_obj.cmdgen.source_ext_match = False
-
- for suffix in CSuffixes:
- static_obj.add_action(suffix, CAction)
- shared_obj.add_action(suffix, ShCAction)
- static_obj.add_emitter(suffix, static_object_emitter)
- shared_obj.add_emitter(suffix, shared_object_emitter)
-
- for suffix in CXXSuffixes:
- static_obj.add_action(suffix, CXXAction)
- shared_obj.add_action(suffix, ShCXXAction)
- static_obj.add_emitter(suffix, static_object_emitter)
- shared_obj.add_emitter(suffix, shared_object_emitter)
-
- env['CCPDBFLAGS'] = SCons.Util.CLVar(['${(PDB and "/Z7") or ""}'])
- env['CCPCHFLAGS'] = SCons.Util.CLVar(['${(PCH and "/Yu%s \\\"/Fp%s\\\""%(PCHSTOP or "",File(PCH))) or ""}'])
- env['_MSVC_OUTPUT_FLAG'] = msvc_output_flag
- env['_CCCOMCOM'] = '$CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS $CCPCHFLAGS $CCPDBFLAGS'
- env['CC'] = 'cl'
- env['CCFLAGS'] = SCons.Util.CLVar('/nologo')
- env['CFLAGS'] = SCons.Util.CLVar('')
- env['CCCOM'] = '${TEMPFILE("$CC $_MSVC_OUTPUT_FLAG /c $CHANGED_SOURCES $CFLAGS $CCFLAGS $_CCCOMCOM","$CCCOMSTR")}'
- env['SHCC'] = '$CC'
- env['SHCCFLAGS'] = SCons.Util.CLVar('$CCFLAGS')
- env['SHCFLAGS'] = SCons.Util.CLVar('$CFLAGS')
- env['SHCCCOM'] = '${TEMPFILE("$SHCC $_MSVC_OUTPUT_FLAG /c $CHANGED_SOURCES $SHCFLAGS $SHCCFLAGS $_CCCOMCOM","$SHCCCOMSTR")}'
- env['CXX'] = '$CC'
- env['CXXFLAGS'] = SCons.Util.CLVar('$( /TP $)')
- env['CXXCOM'] = '${TEMPFILE("$CXX $_MSVC_OUTPUT_FLAG /c $CHANGED_SOURCES $CXXFLAGS $CCFLAGS $_CCCOMCOM","$CXXCOMSTR")}'
- env['SHCXX'] = '$CXX'
- env['SHCXXFLAGS'] = SCons.Util.CLVar('$CXXFLAGS')
- env['SHCXXCOM'] = '${TEMPFILE("$SHCXX $_MSVC_OUTPUT_FLAG /c $CHANGED_SOURCES $SHCXXFLAGS $SHCCFLAGS $_CCCOMCOM","$SHCXXCOMSTR")}'
- env['CPPDEFPREFIX'] = '/D'
- env['CPPDEFSUFFIX'] = ''
- env['INCPREFIX'] = '/I'
- env['INCSUFFIX'] = ''
-# env.Append(OBJEMITTER = [static_object_emitter])
-# env.Append(SHOBJEMITTER = [shared_object_emitter])
- env['STATIC_AND_SHARED_OBJECTS_ARE_THE_SAME'] = 1
-
- env['RC'] = 'rc'
- env['RCFLAGS'] = SCons.Util.CLVar('')
- env['RCSUFFIXES']=['.rc','.rc2']
- env['RCCOM'] = '$RC $_CPPDEFFLAGS $_CPPINCFLAGS $RCFLAGS /fo$TARGET $SOURCES'
- env['BUILDERS']['RES'] = res_builder
- env['OBJPREFIX'] = ''
- env['OBJSUFFIX'] = '.obj'
- env['SHOBJPREFIX'] = '$OBJPREFIX'
- env['SHOBJSUFFIX'] = '$OBJSUFFIX'
-
- # Set-up ms tools paths
- msvc_setup_env_once(env)
-
- env['CFILESUFFIX'] = '.c'
- env['CXXFILESUFFIX'] = '.cc'
-
- env['PCHPDBFLAGS'] = SCons.Util.CLVar(['${(PDB and "/Yd") or ""}'])
- env['PCHCOM'] = '$CXX /Fo${TARGETS[1]} $CXXFLAGS $CCFLAGS $CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS /c $SOURCES /Yc$PCHSTOP /Fp${TARGETS[0]} $CCPDBFLAGS $PCHPDBFLAGS'
- env['BUILDERS']['PCH'] = pch_builder
-
- if 'ENV' not in env:
- env['ENV'] = {}
- if 'SystemRoot' not in env['ENV']: # required for dlls in the winsxs folders
- env['ENV']['SystemRoot'] = SCons.Platform.win32.get_system_root()
-
-def exists(env):
- return msvc_exists()
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/msvs.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/msvs.py
deleted file mode 100644
index 0ad4c78..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/msvs.py
+++ /dev/null
@@ -1,2029 +0,0 @@
-"""SCons.Tool.msvs
-
-Tool-specific initialization for Microsoft Visual Studio project files.
-
-There normally shouldn't be any need to import this module directly.
-It will usually be imported through the generic SCons.Tool.Tool()
-selection method.
-
-"""
-
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-__revision__ = "src/engine/SCons/Tool/msvs.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-import SCons.compat
-
-import base64
-import hashlib
-import ntpath
-import os
-# compat layer imports "cPickle" for us if it's available.
-import pickle
-import re
-import sys
-
-import SCons.Builder
-import SCons.Node.FS
-import SCons.Platform.win32
-import SCons.Script.SConscript
-import SCons.PathList
-import SCons.Util
-import SCons.Warnings
-
-from MSCommon import msvc_exists, msvc_setup_env_once
-from SCons.Defaults import processDefines
-
-##############################################################################
-# Below here are the classes and functions for generation of
-# DSP/DSW/SLN/VCPROJ files.
-##############################################################################
-
-def xmlify(s):
- s = s.replace("&", "&amp;") # do this first
- s = s.replace("'", "&apos;")
- s = s.replace('"', "&quot;")
- s = s.replace('\n', '&#x0A;')
- return s
-
-# Process a CPPPATH list in includes, given the env, target and source.
-# Returns a tuple of nodes.
-def processIncludes(includes, env, target, source):
- return SCons.PathList.PathList(includes).subst_path(env, target, source)
-
-
-external_makefile_guid = '{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}'
-
-def _generateGUID(slnfile, name):
- """This generates a dummy GUID for the sln file to use. It is
- based on the MD5 signatures of the sln filename plus the name of
- the project. It basically just needs to be unique, and not
- change with each invocation."""
- m = hashlib.md5()
- # Normalize the slnfile path to a Windows path (\ separators) so
- # the generated file has a consistent GUID even if we generate
- # it on a non-Windows platform.
- m.update(ntpath.normpath(str(slnfile)) + str(name))
- solution = m.hexdigest().upper()
- # convert most of the signature to GUID form (discard the rest)
- solution = "{" + solution[:8] + "-" + solution[8:12] + "-" + solution[12:16] + "-" + solution[16:20] + "-" + solution[20:32] + "}"
- return solution
-
-version_re = re.compile(r'(\d+\.\d+)(.*)')
-
-def msvs_parse_version(s):
- """
- Split a Visual Studio version, which may in fact be something like
- '7.0Exp', into is version number (returned as a float) and trailing
- "suite" portion.
- """
- num, suite = version_re.match(s).groups()
- return float(num), suite
-
-# os.path.relpath has been introduced in Python 2.6
-# We define it locally for earlier versions of Python
-def relpath(path, start=os.path.curdir):
- """Return a relative version of a path"""
- import sys
- if not path:
- raise ValueError("no path specified")
- start_list = os.path.abspath(start).split(os.sep)
- path_list = os.path.abspath(path).split(os.sep)
- if 'posix' in sys.builtin_module_names:
- # Work out how much of the filepath is shared by start and path.
- i = len(os.path.commonprefix([start_list, path_list]))
- else:
- if start_list[0].lower() != path_list[0].lower():
- unc_path, rest = os.path.splitunc(path)
- unc_start, rest = os.path.splitunc(start)
- if bool(unc_path) ^ bool(unc_start):
- raise ValueError("Cannot mix UNC and non-UNC paths (%s and %s)"
- % (path, start))
- else:
- raise ValueError("path is on drive %s, start on drive %s"
- % (path_list[0], start_list[0]))
- # Work out how much of the filepath is shared by start and path.
- for i in range(min(len(start_list), len(path_list))):
- if start_list[i].lower() != path_list[i].lower():
- break
- else:
- i += 1
- rel_list = [os.pardir] * (len(start_list)-i) + path_list[i:]
- if not rel_list:
- return os.path.curdir
- return os.path.join(*rel_list)
-
-if not "relpath" in os.path.__all__:
- os.path.relpath = relpath
-
-# This is how we re-invoke SCons from inside MSVS Project files.
-# The problem is that we might have been invoked as either scons.bat
-# or scons.py. If we were invoked directly as scons.py, then we could
-# use sys.argv[0] to find the SCons "executable," but that doesn't work
-# if we were invoked as scons.bat, which uses "python -c" to execute
-# things and ends up with "-c" as sys.argv[0]. Consequently, we have
-# the MSVS Project file invoke SCons the same way that scons.bat does,
-# which works regardless of how we were invoked.
-def getExecScriptMain(env, xml=None):
- scons_home = env.get('SCONS_HOME')
- if not scons_home and 'SCONS_LIB_DIR' in os.environ:
- scons_home = os.environ['SCONS_LIB_DIR']
- if scons_home:
- exec_script_main = "from os.path import join; import sys; sys.path = [ r'%s' ] + sys.path; import SCons.Script; SCons.Script.main()" % scons_home
- else:
- version = SCons.__version__
- exec_script_main = "from os.path import join; import sys; sys.path = [ join(sys.prefix, 'Lib', 'site-packages', 'scons-%(version)s'), join(sys.prefix, 'scons-%(version)s'), join(sys.prefix, 'Lib', 'site-packages', 'scons'), join(sys.prefix, 'scons') ] + sys.path; import SCons.Script; SCons.Script.main()" % locals()
- if xml:
- exec_script_main = xmlify(exec_script_main)
- return exec_script_main
-
-# The string for the Python executable we tell the Project file to use
-# is either sys.executable or, if an external PYTHON_ROOT environment
-# variable exists, $(PYTHON)ROOT\\python.exe (generalized a little to
-# pluck the actual executable name from sys.executable).
-try:
- python_root = os.environ['PYTHON_ROOT']
-except KeyError:
- python_executable = sys.executable
-else:
- python_executable = os.path.join('$$(PYTHON_ROOT)',
- os.path.split(sys.executable)[1])
-
-class Config(object):
- pass
-
-def splitFully(path):
- dir, base = os.path.split(path)
- if dir and dir != '' and dir != path:
- return splitFully(dir)+[base]
- if base == '':
- return []
- return [base]
-
-def makeHierarchy(sources):
- '''Break a list of files into a hierarchy; for each value, if it is a string,
- then it is a file. If it is a dictionary, it is a folder. The string is
- the original path of the file.'''
-
- hierarchy = {}
- for file in sources:
- path = splitFully(file)
- if len(path):
- dict = hierarchy
- for part in path[:-1]:
- if part not in dict:
- dict[part] = {}
- dict = dict[part]
- dict[path[-1]] = file
- #else:
- # print 'Warning: failed to decompose path for '+str(file)
- return hierarchy
-
-class _UserGenerator(object):
- '''
- Base class for .dsp.user file generator
- '''
- # Default instance values.
- # Ok ... a bit defensive, but it does not seems reasonable to crash the
- # build for a workspace user file. :-)
- usrhead = None
- usrdebg = None
- usrconf = None
- createfile = False
- def __init__(self, dspfile, source, env):
- # DebugSettings should be a list of debug dictionary sorted in the same order
- # than the target list and variants
- if 'variant' not in env:
- raise SCons.Errors.InternalError("You must specify a 'variant' argument (i.e. 'Debug' or " +\
- "'Release') to create an MSVSProject.")
- elif SCons.Util.is_String(env['variant']):
- variants = [env['variant']]
- elif SCons.Util.is_List(env['variant']):
- variants = env['variant']
-
- if 'DebugSettings' not in env or env['DebugSettings'] == None:
- dbg_settings = []
- elif SCons.Util.is_Dict(env['DebugSettings']):
- dbg_settings = [env['DebugSettings']]
- elif SCons.Util.is_List(env['DebugSettings']):
- if len(env['DebugSettings']) != len(variants):
- raise SCons.Errors.InternalError("Sizes of 'DebugSettings' and 'variant' lists must be the same.")
- dbg_settings = []
- for ds in env['DebugSettings']:
- if SCons.Util.is_Dict(ds):
- dbg_settings.append(ds)
- else:
- dbg_settings.append({})
- else:
- dbg_settings = []
-
- if len(dbg_settings) == 1:
- dbg_settings = dbg_settings * len(variants)
-
- self.createfile = self.usrhead and self.usrdebg and self.usrconf and \
- dbg_settings and bool([ds for ds in dbg_settings if ds])
-
- if self.createfile:
- dbg_settings = dict(zip(variants, dbg_settings))
- for var, src in dbg_settings.items():
- # Update only expected keys
- trg = {}
- for key in [k for k in self.usrdebg.keys() if k in src]:
- trg[key] = str(src[key])
- self.configs[var].debug = trg
-
- def UserHeader(self):
- encoding = self.env.subst('$MSVSENCODING')
- versionstr = self.versionstr
- self.usrfile.write(self.usrhead % locals())
-
- def UserProject(self):
- pass
-
- def Build(self):
- if not self.createfile:
- return
- try:
- filename = self.dspabs +'.user'
- self.usrfile = open(filename, 'w')
- except IOError, detail:
- raise SCons.Errors.InternalError('Unable to open "' + filename + '" for writing:' + str(detail))
- else:
- self.UserHeader()
- self.UserProject()
- self.usrfile.close()
-
-V9UserHeader = """\
-<?xml version="1.0" encoding="%(encoding)s"?>
-<VisualStudioUserFile
-\tProjectType="Visual C++"
-\tVersion="%(versionstr)s"
-\tShowAllFiles="false"
-\t>
-\t<Configurations>
-"""
-
-V9UserConfiguration = """\
-\t\t<Configuration
-\t\t\tName="%(variant)s|%(platform)s"
-\t\t\t>
-\t\t\t<DebugSettings
-%(debug_settings)s
-\t\t\t/>
-\t\t</Configuration>
-"""
-
-V9DebugSettings = {
-'Command':'$(TargetPath)',
-'WorkingDirectory': None,
-'CommandArguments': None,
-'Attach':'false',
-'DebuggerType':'3',
-'Remote':'1',
-'RemoteMachine': None,
-'RemoteCommand': None,
-'HttpUrl': None,
-'PDBPath': None,
-'SQLDebugging': None,
-'Environment': None,
-'EnvironmentMerge':'true',
-'DebuggerFlavor': None,
-'MPIRunCommand': None,
-'MPIRunArguments': None,
-'MPIRunWorkingDirectory': None,
-'ApplicationCommand': None,
-'ApplicationArguments': None,
-'ShimCommand': None,
-'MPIAcceptMode': None,
-'MPIAcceptFilter': None,
-}
-
-class _GenerateV7User(_UserGenerator):
- """Generates a Project file for MSVS .NET"""
- def __init__(self, dspfile, source, env):
- if self.version_num >= 9.0:
- self.usrhead = V9UserHeader
- self.usrconf = V9UserConfiguration
- self.usrdebg = V9DebugSettings
- _UserGenerator.__init__(self, dspfile, source, env)
-
- def UserProject(self):
- confkeys = sorted(self.configs.keys())
- for kind in confkeys:
- variant = self.configs[kind].variant
- platform = self.configs[kind].platform
- debug = self.configs[kind].debug
- if debug:
- debug_settings = '\n'.join(['\t\t\t\t%s="%s"' % (key, xmlify(value))
- for key, value in debug.items()
- if value is not None])
- self.usrfile.write(self.usrconf % locals())
- self.usrfile.write('\t</Configurations>\n</VisualStudioUserFile>')
-
-V10UserHeader = """\
-<?xml version="1.0" encoding="%(encoding)s"?>
-<Project ToolsVersion="%(versionstr)s" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-"""
-
-V10UserConfiguration = """\
-\t<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='%(variant)s|%(platform)s'">
-%(debug_settings)s
-\t</PropertyGroup>
-"""
-
-V10DebugSettings = {
-'LocalDebuggerCommand': None,
-'LocalDebuggerCommandArguments': None,
-'LocalDebuggerEnvironment': None,
-'DebuggerFlavor': 'WindowsLocalDebugger',
-'LocalDebuggerWorkingDirectory': None,
-'LocalDebuggerAttach': None,
-'LocalDebuggerDebuggerType': None,
-'LocalDebuggerMergeEnvironment': None,
-'LocalDebuggerSQLDebugging': None,
-'RemoteDebuggerCommand': None,
-'RemoteDebuggerCommandArguments': None,
-'RemoteDebuggerWorkingDirectory': None,
-'RemoteDebuggerServerName': None,
-'RemoteDebuggerConnection': None,
-'RemoteDebuggerDebuggerType': None,
-'RemoteDebuggerAttach': None,
-'RemoteDebuggerSQLDebugging': None,
-'DeploymentDirectory': None,
-'AdditionalFiles': None,
-'RemoteDebuggerDeployDebugCppRuntime': None,
-'WebBrowserDebuggerHttpUrl': None,
-'WebBrowserDebuggerDebuggerType': None,
-'WebServiceDebuggerHttpUrl': None,
-'WebServiceDebuggerDebuggerType': None,
-'WebServiceDebuggerSQLDebugging': None,
-}
-
-class _GenerateV10User(_UserGenerator):
- """Generates a Project'user file for MSVS 2010"""
-
- def __init__(self, dspfile, source, env):
- self.versionstr = '4.0'
- self.usrhead = V10UserHeader
- self.usrconf = V10UserConfiguration
- self.usrdebg = V10DebugSettings
- _UserGenerator.__init__(self, dspfile, source, env)
-
- def UserProject(self):
- confkeys = sorted(self.configs.keys())
- for kind in confkeys:
- variant = self.configs[kind].variant
- platform = self.configs[kind].platform
- debug = self.configs[kind].debug
- if debug:
- debug_settings = '\n'.join(['\t\t<%s>%s</%s>' % (key, xmlify(value), key)
- for key, value in debug.items()
- if value is not None])
- self.usrfile.write(self.usrconf % locals())
- self.usrfile.write('</Project>')
-
-class _DSPGenerator(object):
- """ Base class for DSP generators """
-
- srcargs = [
- 'srcs',
- 'incs',
- 'localincs',
- 'resources',
- 'misc']
-
- def __init__(self, dspfile, source, env):
- self.dspfile = str(dspfile)
- try:
- get_abspath = dspfile.get_abspath
- except AttributeError:
- self.dspabs = os.path.abspath(dspfile)
- else:
- self.dspabs = get_abspath()
-
- if 'variant' not in env:
- raise SCons.Errors.InternalError("You must specify a 'variant' argument (i.e. 'Debug' or " +\
- "'Release') to create an MSVSProject.")
- elif SCons.Util.is_String(env['variant']):
- variants = [env['variant']]
- elif SCons.Util.is_List(env['variant']):
- variants = env['variant']
-
- if 'buildtarget' not in env or env['buildtarget'] == None:
- buildtarget = ['']
- elif SCons.Util.is_String(env['buildtarget']):
- buildtarget = [env['buildtarget']]
- elif SCons.Util.is_List(env['buildtarget']):
- if len(env['buildtarget']) != len(variants):
- raise SCons.Errors.InternalError("Sizes of 'buildtarget' and 'variant' lists must be the same.")
- buildtarget = []
- for bt in env['buildtarget']:
- if SCons.Util.is_String(bt):
- buildtarget.append(bt)
- else:
- buildtarget.append(bt.get_abspath())
- else:
- buildtarget = [env['buildtarget'].get_abspath()]
- if len(buildtarget) == 1:
- bt = buildtarget[0]
- buildtarget = []
- for _ in variants:
- buildtarget.append(bt)
-
- if 'outdir' not in env or env['outdir'] == None:
- outdir = ['']
- elif SCons.Util.is_String(env['outdir']):
- outdir = [env['outdir']]
- elif SCons.Util.is_List(env['outdir']):
- if len(env['outdir']) != len(variants):
- raise SCons.Errors.InternalError("Sizes of 'outdir' and 'variant' lists must be the same.")
- outdir = []
- for s in env['outdir']:
- if SCons.Util.is_String(s):
- outdir.append(s)
- else:
- outdir.append(s.get_abspath())
- else:
- outdir = [env['outdir'].get_abspath()]
- if len(outdir) == 1:
- s = outdir[0]
- outdir = []
- for v in variants:
- outdir.append(s)
-
- if 'runfile' not in env or env['runfile'] == None:
- runfile = buildtarget[-1:]
- elif SCons.Util.is_String(env['runfile']):
- runfile = [env['runfile']]
- elif SCons.Util.is_List(env['runfile']):
- if len(env['runfile']) != len(variants):
- raise SCons.Errors.InternalError("Sizes of 'runfile' and 'variant' lists must be the same.")
- runfile = []
- for s in env['runfile']:
- if SCons.Util.is_String(s):
- runfile.append(s)
- else:
- runfile.append(s.get_abspath())
- else:
- runfile = [env['runfile'].get_abspath()]
- if len(runfile) == 1:
- s = runfile[0]
- runfile = []
- for v in variants:
- runfile.append(s)
-
- self.sconscript = env['MSVSSCONSCRIPT']
-
- if 'cmdargs' not in env or env['cmdargs'] == None:
- cmdargs = [''] * len(variants)
- elif SCons.Util.is_String(env['cmdargs']):
- cmdargs = [env['cmdargs']] * len(variants)
- elif SCons.Util.is_List(env['cmdargs']):
- if len(env['cmdargs']) != len(variants):
- raise SCons.Errors.InternalError("Sizes of 'cmdargs' and 'variant' lists must be the same.")
- else:
- cmdargs = env['cmdargs']
-
- self.env = env
-
- if 'name' in self.env:
- self.name = self.env['name']
- else:
- self.name = os.path.basename(SCons.Util.splitext(self.dspfile)[0])
- self.name = self.env.subst(self.name)
-
- sourcenames = [
- 'Source Files',
- 'Header Files',
- 'Local Headers',
- 'Resource Files',
- 'Other Files']
-
- self.sources = {}
- for n in sourcenames:
- self.sources[n] = []
-
- self.configs = {}
-
- self.nokeep = 0
- if 'nokeep' in env and env['variant'] != 0:
- self.nokeep = 1
-
- if self.nokeep == 0 and os.path.exists(self.dspabs):
- self.Parse()
-
- for t in zip(sourcenames,self.srcargs):
- if t[1] in self.env:
- if SCons.Util.is_List(self.env[t[1]]):
- for i in self.env[t[1]]:
- if not i in self.sources[t[0]]:
- self.sources[t[0]].append(i)
- else:
- if not self.env[t[1]] in self.sources[t[0]]:
- self.sources[t[0]].append(self.env[t[1]])
-
- for n in sourcenames:
- #TODO 2.4: compat layer supports sorted(key=) but not sort(key=)
- #TODO 2.4: self.sources[n].sort(key=lambda a: a.lower())
- self.sources[n] = sorted(self.sources[n], key=lambda a: a.lower())
-
- def AddConfig(self, variant, buildtarget, outdir, runfile, cmdargs, dspfile=dspfile):
- config = Config()
- config.buildtarget = buildtarget
- config.outdir = outdir
- config.cmdargs = cmdargs
- config.runfile = runfile
-
- match = re.match('(.*)\|(.*)', variant)
- if match:
- config.variant = match.group(1)
- config.platform = match.group(2)
- else:
- config.variant = variant
- config.platform = 'Win32'
-
- self.configs[variant] = config
- print "Adding '" + self.name + ' - ' + config.variant + '|' + config.platform + "' to '" + str(dspfile) + "'"
-
- for i in range(len(variants)):
- AddConfig(self, variants[i], buildtarget[i], outdir[i], runfile[i], cmdargs[i])
-
- self.platforms = []
- for key in self.configs.keys():
- platform = self.configs[key].platform
- if not platform in self.platforms:
- self.platforms.append(platform)
-
- def Build(self):
- pass
-
-V6DSPHeader = """\
-# Microsoft Developer Studio Project File - Name="%(name)s" - Package Owner=<4>
-# Microsoft Developer Studio Generated Build File, Format Version 6.00
-# ** DO NOT EDIT **
-
-# TARGTYPE "Win32 (x86) External Target" 0x0106
-
-CFG=%(name)s - Win32 %(confkey)s
-!MESSAGE This is not a valid makefile. To build this project using NMAKE,
-!MESSAGE use the Export Makefile command and run
-!MESSAGE
-!MESSAGE NMAKE /f "%(name)s.mak".
-!MESSAGE
-!MESSAGE You can specify a configuration when running NMAKE
-!MESSAGE by defining the macro CFG on the command line. For example:
-!MESSAGE
-!MESSAGE NMAKE /f "%(name)s.mak" CFG="%(name)s - Win32 %(confkey)s"
-!MESSAGE
-!MESSAGE Possible choices for configuration are:
-!MESSAGE
-"""
-
-class _GenerateV6DSP(_DSPGenerator):
- """Generates a Project file for MSVS 6.0"""
-
- def PrintHeader(self):
- # pick a default config
- confkeys = sorted(self.configs.keys())
-
- name = self.name
- confkey = confkeys[0]
-
- self.file.write(V6DSPHeader % locals())
-
- for kind in confkeys:
- self.file.write('!MESSAGE "%s - Win32 %s" (based on "Win32 (x86) External Target")\n' % (name, kind))
-
- self.file.write('!MESSAGE \n\n')
-
- def PrintProject(self):
- name = self.name
- self.file.write('# Begin Project\n'
- '# PROP AllowPerConfigDependencies 0\n'
- '# PROP Scc_ProjName ""\n'
- '# PROP Scc_LocalPath ""\n\n')
-
- first = 1
- confkeys = sorted(self.configs.keys())
- for kind in confkeys:
- outdir = self.configs[kind].outdir
- buildtarget = self.configs[kind].buildtarget
- if first == 1:
- self.file.write('!IF "$(CFG)" == "%s - Win32 %s"\n\n' % (name, kind))
- first = 0
- else:
- self.file.write('\n!ELSEIF "$(CFG)" == "%s - Win32 %s"\n\n' % (name, kind))
-
- env_has_buildtarget = 'MSVSBUILDTARGET' in self.env
- if not env_has_buildtarget:
- self.env['MSVSBUILDTARGET'] = buildtarget
-
- # have to write this twice, once with the BASE settings, and once without
- for base in ("BASE ",""):
- self.file.write('# PROP %sUse_MFC 0\n'
- '# PROP %sUse_Debug_Libraries ' % (base, base))
- if kind.lower().find('debug') < 0:
- self.file.write('0\n')
- else:
- self.file.write('1\n')
- self.file.write('# PROP %sOutput_Dir "%s"\n'
- '# PROP %sIntermediate_Dir "%s"\n' % (base,outdir,base,outdir))
- cmd = 'echo Starting SCons && ' + self.env.subst('$MSVSBUILDCOM', 1)
- self.file.write('# PROP %sCmd_Line "%s"\n'
- '# PROP %sRebuild_Opt "-c && %s"\n'
- '# PROP %sTarget_File "%s"\n'
- '# PROP %sBsc_Name ""\n'
- '# PROP %sTarget_Dir ""\n'\
- %(base,cmd,base,cmd,base,buildtarget,base,base))
-
- if not env_has_buildtarget:
- del self.env['MSVSBUILDTARGET']
-
- self.file.write('\n!ENDIF\n\n'
- '# Begin Target\n\n')
- for kind in confkeys:
- self.file.write('# Name "%s - Win32 %s"\n' % (name,kind))
- self.file.write('\n')
- first = 0
- for kind in confkeys:
- if first == 0:
- self.file.write('!IF "$(CFG)" == "%s - Win32 %s"\n\n' % (name,kind))
- first = 1
- else:
- self.file.write('!ELSEIF "$(CFG)" == "%s - Win32 %s"\n\n' % (name,kind))
- self.file.write('!ENDIF \n\n')
- self.PrintSourceFiles()
- self.file.write('# End Target\n'
- '# End Project\n')
-
- if self.nokeep == 0:
- # now we pickle some data and add it to the file -- MSDEV will ignore it.
- pdata = pickle.dumps(self.configs,1)
- pdata = base64.encodestring(pdata)
- self.file.write(pdata + '\n')
- pdata = pickle.dumps(self.sources,1)
- pdata = base64.encodestring(pdata)
- self.file.write(pdata + '\n')
-
- def PrintSourceFiles(self):
- categories = {'Source Files': 'cpp|c|cxx|l|y|def|odl|idl|hpj|bat',
- 'Header Files': 'h|hpp|hxx|hm|inl',
- 'Local Headers': 'h|hpp|hxx|hm|inl',
- 'Resource Files': 'r|rc|ico|cur|bmp|dlg|rc2|rct|bin|cnt|rtf|gif|jpg|jpeg|jpe',
- 'Other Files': ''}
-
- for kind in sorted(categories.keys(), key=lambda a: a.lower()):
- if not self.sources[kind]:
- continue # skip empty groups
-
- self.file.write('# Begin Group "' + kind + '"\n\n')
- typelist = categories[kind].replace('|', ';')
- self.file.write('# PROP Default_Filter "' + typelist + '"\n')
-
- for file in self.sources[kind]:
- file = os.path.normpath(file)
- self.file.write('# Begin Source File\n\n'
- 'SOURCE="' + file + '"\n'
- '# End Source File\n')
- self.file.write('# End Group\n')
-
- # add the SConscript file outside of the groups
- self.file.write('# Begin Source File\n\n'
- 'SOURCE="' + str(self.sconscript) + '"\n'
- '# End Source File\n')
-
- def Parse(self):
- try:
- dspfile = open(self.dspabs,'r')
- except IOError:
- return # doesn't exist yet, so can't add anything to configs.
-
- line = dspfile.readline()
- while line:
- if line.find("# End Project") > -1:
- break
- line = dspfile.readline()
-
- line = dspfile.readline()
- datas = line
- while line and line != '\n':
- line = dspfile.readline()
- datas = datas + line
-
- # OK, we've found our little pickled cache of data.
- try:
- datas = base64.decodestring(datas)
- data = pickle.loads(datas)
- except KeyboardInterrupt:
- raise
- except:
- return # unable to unpickle any data for some reason
-
- self.configs.update(data)
-
- data = None
- line = dspfile.readline()
- datas = line
- while line and line != '\n':
- line = dspfile.readline()
- datas = datas + line
-
- # OK, we've found our little pickled cache of data.
- # it has a "# " in front of it, so we strip that.
- try:
- datas = base64.decodestring(datas)
- data = pickle.loads(datas)
- except KeyboardInterrupt:
- raise
- except:
- return # unable to unpickle any data for some reason
-
- self.sources.update(data)
-
- def Build(self):
- try:
- self.file = open(self.dspabs,'w')
- except IOError, detail:
- raise SCons.Errors.InternalError('Unable to open "' + self.dspabs + '" for writing:' + str(detail))
- else:
- self.PrintHeader()
- self.PrintProject()
- self.file.close()
-
-V7DSPHeader = """\
-<?xml version="1.0" encoding="%(encoding)s"?>
-<VisualStudioProject
-\tProjectType="Visual C++"
-\tVersion="%(versionstr)s"
-\tName="%(name)s"
-\tProjectGUID="%(project_guid)s"
-%(scc_attrs)s
-\tKeyword="MakeFileProj">
-"""
-
-V7DSPConfiguration = """\
-\t\t<Configuration
-\t\t\tName="%(variant)s|%(platform)s"
-\t\t\tOutputDirectory="%(outdir)s"
-\t\t\tIntermediateDirectory="%(outdir)s"
-\t\t\tConfigurationType="0"
-\t\t\tUseOfMFC="0"
-\t\t\tATLMinimizesCRunTimeLibraryUsage="FALSE">
-\t\t\t<Tool
-\t\t\t\tName="VCNMakeTool"
-\t\t\t\tBuildCommandLine="%(buildcmd)s"
-\t\t\t\tReBuildCommandLine="%(rebuildcmd)s"
-\t\t\t\tCleanCommandLine="%(cleancmd)s"
-\t\t\t\tOutput="%(runfile)s"/>
-\t\t</Configuration>
-"""
-
-V8DSPHeader = """\
-<?xml version="1.0" encoding="%(encoding)s"?>
-<VisualStudioProject
-\tProjectType="Visual C++"
-\tVersion="%(versionstr)s"
-\tName="%(name)s"
-\tProjectGUID="%(project_guid)s"
-\tRootNamespace="%(name)s"
-%(scc_attrs)s
-\tKeyword="MakeFileProj">
-"""
-
-V8DSPConfiguration = """\
-\t\t<Configuration
-\t\t\tName="%(variant)s|%(platform)s"
-\t\t\tConfigurationType="0"
-\t\t\tUseOfMFC="0"
-\t\t\tATLMinimizesCRunTimeLibraryUsage="false"
-\t\t\t>
-\t\t\t<Tool
-\t\t\t\tName="VCNMakeTool"
-\t\t\t\tBuildCommandLine="%(buildcmd)s"
-\t\t\t\tReBuildCommandLine="%(rebuildcmd)s"
-\t\t\t\tCleanCommandLine="%(cleancmd)s"
-\t\t\t\tOutput="%(runfile)s"
-\t\t\t\tPreprocessorDefinitions="%(preprocdefs)s"
-\t\t\t\tIncludeSearchPath="%(includepath)s"
-\t\t\t\tForcedIncludes=""
-\t\t\t\tAssemblySearchPath=""
-\t\t\t\tForcedUsingAssemblies=""
-\t\t\t\tCompileAsManaged=""
-\t\t\t/>
-\t\t</Configuration>
-"""
-class _GenerateV7DSP(_DSPGenerator, _GenerateV7User):
- """Generates a Project file for MSVS .NET"""
-
- def __init__(self, dspfile, source, env):
- _DSPGenerator.__init__(self, dspfile, source, env)
- self.version = env['MSVS_VERSION']
- self.version_num, self.suite = msvs_parse_version(self.version)
- if self.version_num >= 9.0:
- self.versionstr = '9.00'
- self.dspheader = V8DSPHeader
- self.dspconfiguration = V8DSPConfiguration
- elif self.version_num >= 8.0:
- self.versionstr = '8.00'
- self.dspheader = V8DSPHeader
- self.dspconfiguration = V8DSPConfiguration
- else:
- if self.version_num >= 7.1:
- self.versionstr = '7.10'
- else:
- self.versionstr = '7.00'
- self.dspheader = V7DSPHeader
- self.dspconfiguration = V7DSPConfiguration
- self.file = None
-
- _GenerateV7User.__init__(self, dspfile, source, env)
-
- def PrintHeader(self):
- env = self.env
- versionstr = self.versionstr
- name = self.name
- encoding = self.env.subst('$MSVSENCODING')
- scc_provider = env.get('MSVS_SCC_PROVIDER', '')
- scc_project_name = env.get('MSVS_SCC_PROJECT_NAME', '')
- scc_aux_path = env.get('MSVS_SCC_AUX_PATH', '')
- # MSVS_SCC_LOCAL_PATH is kept for backwards compatibility purpose and should
- # be deprecated as soon as possible.
- scc_local_path_legacy = env.get('MSVS_SCC_LOCAL_PATH', '')
- scc_connection_root = env.get('MSVS_SCC_CONNECTION_ROOT', os.curdir)
- scc_local_path = os.path.relpath(scc_connection_root, os.path.dirname(self.dspabs))
- project_guid = env.get('MSVS_PROJECT_GUID', '')
- if not project_guid:
- project_guid = _generateGUID(self.dspfile, '')
- if scc_provider != '':
- scc_attrs = '\tSccProjectName="%s"\n' % scc_project_name
- if scc_aux_path != '':
- scc_attrs += '\tSccAuxPath="%s"\n' % scc_aux_path
- scc_attrs += ('\tSccLocalPath="%s"\n'
- '\tSccProvider="%s"' % (scc_local_path, scc_provider))
- elif scc_local_path_legacy != '':
- # This case is kept for backwards compatibility purpose and should
- # be deprecated as soon as possible.
- scc_attrs = ('\tSccProjectName="%s"\n'
- '\tSccLocalPath="%s"' % (scc_project_name, scc_local_path_legacy))
- else:
- self.dspheader = self.dspheader.replace('%(scc_attrs)s\n', '')
-
- self.file.write(self.dspheader % locals())
-
- self.file.write('\t<Platforms>\n')
- for platform in self.platforms:
- self.file.write(
- '\t\t<Platform\n'
- '\t\t\tName="%s"/>\n' % platform)
- self.file.write('\t</Platforms>\n')
-
- if self.version_num >= 8.0:
- self.file.write('\t<ToolFiles>\n'
- '\t</ToolFiles>\n')
-
- def PrintProject(self):
- self.file.write('\t<Configurations>\n')
-
- confkeys = sorted(self.configs.keys())
- for kind in confkeys:
- variant = self.configs[kind].variant
- platform = self.configs[kind].platform
- outdir = self.configs[kind].outdir
- buildtarget = self.configs[kind].buildtarget
- runfile = self.configs[kind].runfile
- cmdargs = self.configs[kind].cmdargs
-
- env_has_buildtarget = 'MSVSBUILDTARGET' in self.env
- if not env_has_buildtarget:
- self.env['MSVSBUILDTARGET'] = buildtarget
-
- starting = 'echo Starting SCons && '
- if cmdargs:
- cmdargs = ' ' + cmdargs
- else:
- cmdargs = ''
- buildcmd = xmlify(starting + self.env.subst('$MSVSBUILDCOM', 1) + cmdargs)
- rebuildcmd = xmlify(starting + self.env.subst('$MSVSREBUILDCOM', 1) + cmdargs)
- cleancmd = xmlify(starting + self.env.subst('$MSVSCLEANCOM', 1) + cmdargs)
-
- # This isn't perfect; CPPDEFINES and CPPPATH can contain $TARGET and $SOURCE,
- # so they could vary depending on the command being generated. This code
- # assumes they don't.
- preprocdefs = xmlify(';'.join(processDefines(self.env.get('CPPDEFINES', []))))
- includepath_Dirs = processIncludes(self.env.get('CPPPATH', []), self.env, None, None)
- includepath = xmlify(';'.join([str(x) for x in includepath_Dirs]))
-
- if not env_has_buildtarget:
- del self.env['MSVSBUILDTARGET']
-
- self.file.write(self.dspconfiguration % locals())
-
- self.file.write('\t</Configurations>\n')
-
- if self.version_num >= 7.1:
- self.file.write('\t<References>\n'
- '\t</References>\n')
-
- self.PrintSourceFiles()
-
- self.file.write('</VisualStudioProject>\n')
-
- if self.nokeep == 0:
- # now we pickle some data and add it to the file -- MSDEV will ignore it.
- pdata = pickle.dumps(self.configs,1)
- pdata = base64.encodestring(pdata)
- self.file.write('<!-- SCons Data:\n' + pdata + '\n')
- pdata = pickle.dumps(self.sources,1)
- pdata = base64.encodestring(pdata)
- self.file.write(pdata + '-->\n')
-
- def printSources(self, hierarchy, commonprefix):
- sorteditems = sorted(hierarchy.items(), key=lambda a: a[0].lower())
-
- # First folders, then files
- for key, value in sorteditems:
- if SCons.Util.is_Dict(value):
- self.file.write('\t\t\t<Filter\n'
- '\t\t\t\tName="%s"\n'
- '\t\t\t\tFilter="">\n' % (key))
- self.printSources(value, commonprefix)
- self.file.write('\t\t\t</Filter>\n')
-
- for key, value in sorteditems:
- if SCons.Util.is_String(value):
- file = value
- if commonprefix:
- file = os.path.join(commonprefix, value)
- file = os.path.normpath(file)
- self.file.write('\t\t\t<File\n'
- '\t\t\t\tRelativePath="%s">\n'
- '\t\t\t</File>\n' % (file))
-
- def PrintSourceFiles(self):
- categories = {'Source Files': 'cpp;c;cxx;l;y;def;odl;idl;hpj;bat',
- 'Header Files': 'h;hpp;hxx;hm;inl',
- 'Local Headers': 'h;hpp;hxx;hm;inl',
- 'Resource Files': 'r;rc;ico;cur;bmp;dlg;rc2;rct;bin;cnt;rtf;gif;jpg;jpeg;jpe',
- 'Other Files': ''}
-
- self.file.write('\t<Files>\n')
-
- cats = sorted([k for k in categories.keys() if self.sources[k]],
- key=lambda a: a.lower())
- for kind in cats:
- if len(cats) > 1:
- self.file.write('\t\t<Filter\n'
- '\t\t\tName="%s"\n'
- '\t\t\tFilter="%s">\n' % (kind, categories[kind]))
-
- sources = self.sources[kind]
-
- # First remove any common prefix
- commonprefix = None
- s = list(map(os.path.normpath, sources))
- # take the dirname because the prefix may include parts
- # of the filenames (e.g. if you have 'dir\abcd' and
- # 'dir\acde' then the cp will be 'dir\a' )
- cp = os.path.dirname( os.path.commonprefix(s) )
- if cp and s[0][len(cp)] == os.sep:
- # +1 because the filename starts after the separator
- sources = [s[len(cp)+1:] for s in sources]
- commonprefix = cp
-
- hierarchy = makeHierarchy(sources)
- self.printSources(hierarchy, commonprefix=commonprefix)
-
- if len(cats)>1:
- self.file.write('\t\t</Filter>\n')
-
- # add the SConscript file outside of the groups
- self.file.write('\t\t<File\n'
- '\t\t\tRelativePath="%s">\n'
- '\t\t</File>\n' % str(self.sconscript))
-
- self.file.write('\t</Files>\n'
- '\t<Globals>\n'
- '\t</Globals>\n')
-
- def Parse(self):
- try:
- dspfile = open(self.dspabs,'r')
- except IOError:
- return # doesn't exist yet, so can't add anything to configs.
-
- line = dspfile.readline()
- while line:
- if line.find('<!-- SCons Data:') > -1:
- break
- line = dspfile.readline()
-
- line = dspfile.readline()
- datas = line
- while line and line != '\n':
- line = dspfile.readline()
- datas = datas + line
-
- # OK, we've found our little pickled cache of data.
- try:
- datas = base64.decodestring(datas)
- data = pickle.loads(datas)
- except KeyboardInterrupt:
- raise
- except:
- return # unable to unpickle any data for some reason
-
- self.configs.update(data)
-
- data = None
- line = dspfile.readline()
- datas = line
- while line and line != '\n':
- line = dspfile.readline()
- datas = datas + line
-
- # OK, we've found our little pickled cache of data.
- try:
- datas = base64.decodestring(datas)
- data = pickle.loads(datas)
- except KeyboardInterrupt:
- raise
- except:
- return # unable to unpickle any data for some reason
-
- self.sources.update(data)
-
- def Build(self):
- try:
- self.file = open(self.dspabs,'w')
- except IOError, detail:
- raise SCons.Errors.InternalError('Unable to open "' + self.dspabs + '" for writing:' + str(detail))
- else:
- self.PrintHeader()
- self.PrintProject()
- self.file.close()
-
- _GenerateV7User.Build(self)
-
-V10DSPHeader = """\
-<?xml version="1.0" encoding="%(encoding)s"?>
-<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-"""
-
-V10DSPProjectConfiguration = """\
-\t\t<ProjectConfiguration Include="%(variant)s|%(platform)s">
-\t\t\t<Configuration>%(variant)s</Configuration>
-\t\t\t<Platform>%(platform)s</Platform>
-\t\t</ProjectConfiguration>
-"""
-
-V10DSPGlobals = """\
-\t<PropertyGroup Label="Globals">
-\t\t<ProjectGuid>%(project_guid)s</ProjectGuid>
-%(scc_attrs)s\t\t<RootNamespace>%(name)s</RootNamespace>
-\t\t<Keyword>MakeFileProj</Keyword>
-\t</PropertyGroup>
-"""
-
-V10DSPPropertyGroupCondition = """\
-\t<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='%(variant)s|%(platform)s'" Label="Configuration">
-\t\t<ConfigurationType>Makefile</ConfigurationType>
-\t\t<UseOfMfc>false</UseOfMfc>
-\t\t<PlatformToolset>%(toolset)s</PlatformToolset>
-\t</PropertyGroup>
-"""
-
-V10DSPImportGroupCondition = """\
-\t<ImportGroup Condition="'$(Configuration)|$(Platform)'=='%(variant)s|%(platform)s'" Label="PropertySheets">
-\t\t<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
-\t</ImportGroup>
-"""
-
-V10DSPCommandLine = """\
-\t\t<NMakeBuildCommandLine Condition="'$(Configuration)|$(Platform)'=='%(variant)s|%(platform)s'">%(buildcmd)s</NMakeBuildCommandLine>
-\t\t<NMakeReBuildCommandLine Condition="'$(Configuration)|$(Platform)'=='%(variant)s|%(platform)s'">%(rebuildcmd)s</NMakeReBuildCommandLine>
-\t\t<NMakeCleanCommandLine Condition="'$(Configuration)|$(Platform)'=='%(variant)s|%(platform)s'">%(cleancmd)s</NMakeCleanCommandLine>
-\t\t<NMakeOutput Condition="'$(Configuration)|$(Platform)'=='%(variant)s|%(platform)s'">%(runfile)s</NMakeOutput>
-\t\t<NMakePreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='%(variant)s|%(platform)s'">%(preprocdefs)s</NMakePreprocessorDefinitions>
-\t\t<NMakeIncludeSearchPath Condition="'$(Configuration)|$(Platform)'=='%(variant)s|%(platform)s'">%(includepath)s</NMakeIncludeSearchPath>
-\t\t<NMakeForcedIncludes Condition="'$(Configuration)|$(Platform)'=='%(variant)s|%(platform)s'">$(NMakeForcedIncludes)</NMakeForcedIncludes>
-\t\t<NMakeAssemblySearchPath Condition="'$(Configuration)|$(Platform)'=='%(variant)s|%(platform)s'">$(NMakeAssemblySearchPath)</NMakeAssemblySearchPath>
-\t\t<NMakeForcedUsingAssemblies Condition="'$(Configuration)|$(Platform)'=='%(variant)s|%(platform)s'">$(NMakeForcedUsingAssemblies)</NMakeForcedUsingAssemblies>
-"""
-
-class _GenerateV10DSP(_DSPGenerator, _GenerateV10User):
- """Generates a Project file for MSVS 2010"""
-
- def __init__(self, dspfile, source, env):
- _DSPGenerator.__init__(self, dspfile, source, env)
- self.dspheader = V10DSPHeader
- self.dspconfiguration = V10DSPProjectConfiguration
- self.dspglobals = V10DSPGlobals
-
- _GenerateV10User.__init__(self, dspfile, source, env)
-
- def PrintHeader(self):
- env = self.env
- name = self.name
- encoding = env.subst('$MSVSENCODING')
- project_guid = env.get('MSVS_PROJECT_GUID', '')
- scc_provider = env.get('MSVS_SCC_PROVIDER', '')
- scc_project_name = env.get('MSVS_SCC_PROJECT_NAME', '')
- scc_aux_path = env.get('MSVS_SCC_AUX_PATH', '')
- # MSVS_SCC_LOCAL_PATH is kept for backwards compatibility purpose and should
- # be deprecated as soon as possible.
- scc_local_path_legacy = env.get('MSVS_SCC_LOCAL_PATH', '')
- scc_connection_root = env.get('MSVS_SCC_CONNECTION_ROOT', os.curdir)
- scc_local_path = os.path.relpath(scc_connection_root, os.path.dirname(self.dspabs))
- if not project_guid:
- project_guid = _generateGUID(self.dspfile, '')
- if scc_provider != '':
- scc_attrs = '\t\t<SccProjectName>%s</SccProjectName>\n' % scc_project_name
- if scc_aux_path != '':
- scc_attrs += '\t\t<SccAuxPath>%s</SccAuxPath>\n' % scc_aux_path
- scc_attrs += ('\t\t<SccLocalPath>%s</SccLocalPath>\n'
- '\t\t<SccProvider>%s</SccProvider>\n' % (scc_local_path, scc_provider))
- elif scc_local_path_legacy != '':
- # This case is kept for backwards compatibility purpose and should
- # be deprecated as soon as possible.
- scc_attrs = ('\t\t<SccProjectName>%s</SccProjectName>\n'
- '\t\t<SccLocalPath>%s</SccLocalPath>\n' % (scc_project_name, scc_local_path_legacy))
- else:
- self.dspglobals = self.dspglobals.replace('%(scc_attrs)s', '')
-
- self.file.write(self.dspheader % locals())
-
- self.file.write('\t<ItemGroup Label="ProjectConfigurations">\n')
-
- confkeys = sorted(self.configs.keys())
- for kind in confkeys:
- variant = self.configs[kind].variant
- platform = self.configs[kind].platform
- self.file.write(self.dspconfiguration % locals())
-
- self.file.write('\t</ItemGroup>\n')
-
- self.file.write(self.dspglobals % locals())
-
- def PrintProject(self):
- name = self.name
- confkeys = sorted(self.configs.keys())
-
- self.file.write('\t<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />\n')
-
- toolset = ''
- if 'MSVC_VERSION' in self.env:
- version_num, suite = msvs_parse_version(self.env['MSVC_VERSION'])
- toolset = 'v%d' % (version_num * 10)
- for kind in confkeys:
- variant = self.configs[kind].variant
- platform = self.configs[kind].platform
- self.file.write(V10DSPPropertyGroupCondition % locals())
-
- self.file.write('\t<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />\n')
- self.file.write('\t<ImportGroup Label="ExtensionSettings">\n')
- self.file.write('\t</ImportGroup>\n')
-
- for kind in confkeys:
- variant = self.configs[kind].variant
- platform = self.configs[kind].platform
- self.file.write(V10DSPImportGroupCondition % locals())
-
- self.file.write('\t<PropertyGroup Label="UserMacros" />\n')
- self.file.write('\t<PropertyGroup>\n')
- self.file.write('\t<_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>\n')
-
- for kind in confkeys:
- variant = self.configs[kind].variant
- platform = self.configs[kind].platform
- outdir = self.configs[kind].outdir
- buildtarget = self.configs[kind].buildtarget
- runfile = self.configs[kind].runfile
- cmdargs = self.configs[kind].cmdargs
-
- env_has_buildtarget = 'MSVSBUILDTARGET' in self.env
- if not env_has_buildtarget:
- self.env['MSVSBUILDTARGET'] = buildtarget
-
- starting = 'echo Starting SCons && '
- if cmdargs:
- cmdargs = ' ' + cmdargs
- else:
- cmdargs = ''
- buildcmd = xmlify(starting + self.env.subst('$MSVSBUILDCOM', 1) + cmdargs)
- rebuildcmd = xmlify(starting + self.env.subst('$MSVSREBUILDCOM', 1) + cmdargs)
- cleancmd = xmlify(starting + self.env.subst('$MSVSCLEANCOM', 1) + cmdargs)
-
- # This isn't perfect; CPPDEFINES and CPPPATH can contain $TARGET and $SOURCE,
- # so they could vary depending on the command being generated. This code
- # assumes they don't.
- preprocdefs = xmlify(';'.join(processDefines(self.env.get('CPPDEFINES', []))))
- includepath_Dirs = processIncludes(self.env.get('CPPPATH', []), self.env, None, None)
- includepath = xmlify(';'.join([str(x) for x in includepath_Dirs]))
-
- if not env_has_buildtarget:
- del self.env['MSVSBUILDTARGET']
-
- self.file.write(V10DSPCommandLine % locals())
-
- self.file.write('\t</PropertyGroup>\n')
-
- #filter settings in MSVS 2010 are stored in separate file
- self.filtersabs = self.dspabs + '.filters'
- try:
- self.filters_file = open(self.filtersabs, 'w')
- except IOError, detail:
- raise SCons.Errors.InternalError('Unable to open "' + self.filtersabs + '" for writing:' + str(detail))
-
- self.filters_file.write('<?xml version="1.0" encoding="utf-8"?>\n'
- '<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">\n')
-
- self.PrintSourceFiles()
-
- self.filters_file.write('</Project>')
- self.filters_file.close()
-
- self.file.write('\t<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />\n'
- '\t<ImportGroup Label="ExtensionTargets">\n'
- '\t</ImportGroup>\n'
- '</Project>\n')
-
- if self.nokeep == 0:
- # now we pickle some data and add it to the file -- MSDEV will ignore it.
- pdata = pickle.dumps(self.configs,1)
- pdata = base64.encodestring(pdata)
- self.file.write('<!-- SCons Data:\n' + pdata + '\n')
- pdata = pickle.dumps(self.sources,1)
- pdata = base64.encodestring(pdata)
- self.file.write(pdata + '-->\n')
-
- def printFilters(self, hierarchy, name):
- sorteditems = sorted(hierarchy.items(), key = lambda a: a[0].lower())
-
- for key, value in sorteditems:
- if SCons.Util.is_Dict(value):
- filter_name = name + '\\' + key
- self.filters_file.write('\t\t<Filter Include="%s">\n'
- '\t\t\t<UniqueIdentifier>%s</UniqueIdentifier>\n'
- '\t\t</Filter>\n' % (filter_name, _generateGUID(self.dspabs, filter_name)))
- self.printFilters(value, filter_name)
-
- def printSources(self, hierarchy, kind, commonprefix, filter_name):
- keywords = {'Source Files': 'ClCompile',
- 'Header Files': 'ClInclude',
- 'Local Headers': 'ClInclude',
- 'Resource Files': 'None',
- 'Other Files': 'None'}
-
- sorteditems = sorted(hierarchy.items(), key = lambda a: a[0].lower())
-
- # First folders, then files
- for key, value in sorteditems:
- if SCons.Util.is_Dict(value):
- self.printSources(value, kind, commonprefix, filter_name + '\\' + key)
-
- for key, value in sorteditems:
- if SCons.Util.is_String(value):
- file = value
- if commonprefix:
- file = os.path.join(commonprefix, value)
- file = os.path.normpath(file)
-
- self.file.write('\t\t<%s Include="%s" />\n' % (keywords[kind], file))
- self.filters_file.write('\t\t<%s Include="%s">\n'
- '\t\t\t<Filter>%s</Filter>\n'
- '\t\t</%s>\n' % (keywords[kind], file, filter_name, keywords[kind]))
-
- def PrintSourceFiles(self):
- categories = {'Source Files': 'cpp;c;cxx;l;y;def;odl;idl;hpj;bat',
- 'Header Files': 'h;hpp;hxx;hm;inl',
- 'Local Headers': 'h;hpp;hxx;hm;inl',
- 'Resource Files': 'r;rc;ico;cur;bmp;dlg;rc2;rct;bin;cnt;rtf;gif;jpg;jpeg;jpe',
- 'Other Files': ''}
-
- cats = sorted([k for k in categories.keys() if self.sources[k]],
- key = lambda a: a.lower())
-
- # print vcxproj.filters file first
- self.filters_file.write('\t<ItemGroup>\n')
- for kind in cats:
- self.filters_file.write('\t\t<Filter Include="%s">\n'
- '\t\t\t<UniqueIdentifier>{7b42d31d-d53c-4868-8b92-ca2bc9fc052f}</UniqueIdentifier>\n'
- '\t\t\t<Extensions>%s</Extensions>\n'
- '\t\t</Filter>\n' % (kind, categories[kind]))
-
- # First remove any common prefix
- sources = self.sources[kind]
- commonprefix = None
- s = list(map(os.path.normpath, sources))
- # take the dirname because the prefix may include parts
- # of the filenames (e.g. if you have 'dir\abcd' and
- # 'dir\acde' then the cp will be 'dir\a' )
- cp = os.path.dirname( os.path.commonprefix(s) )
- if cp and s[0][len(cp)] == os.sep:
- # +1 because the filename starts after the separator
- sources = [s[len(cp)+1:] for s in sources]
- commonprefix = cp
-
- hierarchy = makeHierarchy(sources)
- self.printFilters(hierarchy, kind)
-
- self.filters_file.write('\t</ItemGroup>\n')
-
- # then print files and filters
- for kind in cats:
- self.file.write('\t<ItemGroup>\n')
- self.filters_file.write('\t<ItemGroup>\n')
-
- # First remove any common prefix
- sources = self.sources[kind]
- commonprefix = None
- s = list(map(os.path.normpath, sources))
- # take the dirname because the prefix may include parts
- # of the filenames (e.g. if you have 'dir\abcd' and
- # 'dir\acde' then the cp will be 'dir\a' )
- cp = os.path.dirname( os.path.commonprefix(s) )
- if cp and s[0][len(cp)] == os.sep:
- # +1 because the filename starts after the separator
- sources = [s[len(cp)+1:] for s in sources]
- commonprefix = cp
-
- hierarchy = makeHierarchy(sources)
- self.printSources(hierarchy, kind, commonprefix, kind)
-
- self.file.write('\t</ItemGroup>\n')
- self.filters_file.write('\t</ItemGroup>\n')
-
- # add the SConscript file outside of the groups
- self.file.write('\t<ItemGroup>\n'
- '\t\t<None Include="%s" />\n'
- #'\t\t<None Include="SConstruct" />\n'
- '\t</ItemGroup>\n' % str(self.sconscript))
-
- def Parse(self):
- print "_GenerateV10DSP.Parse()"
-
- def Build(self):
- try:
- self.file = open(self.dspabs, 'w')
- except IOError, detail:
- raise SCons.Errors.InternalError('Unable to open "' + self.dspabs + '" for writing:' + str(detail))
- else:
- self.PrintHeader()
- self.PrintProject()
- self.file.close()
-
- _GenerateV10User.Build(self)
-
-class _DSWGenerator(object):
- """ Base class for DSW generators """
- def __init__(self, dswfile, source, env):
- self.dswfile = os.path.normpath(str(dswfile))
- self.dsw_folder_path = os.path.dirname(os.path.abspath(self.dswfile))
- self.env = env
-
- if 'projects' not in env:
- raise SCons.Errors.UserError("You must specify a 'projects' argument to create an MSVSSolution.")
- projects = env['projects']
- if not SCons.Util.is_List(projects):
- raise SCons.Errors.InternalError("The 'projects' argument must be a list of nodes.")
- projects = SCons.Util.flatten(projects)
- if len(projects) < 1:
- raise SCons.Errors.UserError("You must specify at least one project to create an MSVSSolution.")
- self.dspfiles = list(map(str, projects))
-
- if 'name' in self.env:
- self.name = self.env['name']
- else:
- self.name = os.path.basename(SCons.Util.splitext(self.dswfile)[0])
- self.name = self.env.subst(self.name)
-
- def Build(self):
- pass
-
-class _GenerateV7DSW(_DSWGenerator):
- """Generates a Solution file for MSVS .NET"""
- def __init__(self, dswfile, source, env):
- _DSWGenerator.__init__(self, dswfile, source, env)
-
- self.file = None
- self.version = self.env['MSVS_VERSION']
- self.version_num, self.suite = msvs_parse_version(self.version)
- self.versionstr = '7.00'
- if self.version_num >= 11.0:
- self.versionstr = '12.00'
- elif self.version_num >= 10.0:
- self.versionstr = '11.00'
- elif self.version_num >= 9.0:
- self.versionstr = '10.00'
- elif self.version_num >= 8.0:
- self.versionstr = '9.00'
- elif self.version_num >= 7.1:
- self.versionstr = '8.00'
-
- if 'slnguid' in env and env['slnguid']:
- self.slnguid = env['slnguid']
- else:
- self.slnguid = _generateGUID(dswfile, self.name)
-
- self.configs = {}
-
- self.nokeep = 0
- if 'nokeep' in env and env['variant'] != 0:
- self.nokeep = 1
-
- if self.nokeep == 0 and os.path.exists(self.dswfile):
- self.Parse()
-
- def AddConfig(self, variant, dswfile=dswfile):
- config = Config()
-
- match = re.match('(.*)\|(.*)', variant)
- if match:
- config.variant = match.group(1)
- config.platform = match.group(2)
- else:
- config.variant = variant
- config.platform = 'Win32'
-
- self.configs[variant] = config
- print "Adding '" + self.name + ' - ' + config.variant + '|' + config.platform + "' to '" + str(dswfile) + "'"
-
- if 'variant' not in env:
- raise SCons.Errors.InternalError("You must specify a 'variant' argument (i.e. 'Debug' or " +\
- "'Release') to create an MSVS Solution File.")
- elif SCons.Util.is_String(env['variant']):
- AddConfig(self, env['variant'])
- elif SCons.Util.is_List(env['variant']):
- for variant in env['variant']:
- AddConfig(self, variant)
-
- self.platforms = []
- for key in self.configs.keys():
- platform = self.configs[key].platform
- if not platform in self.platforms:
- self.platforms.append(platform)
-
- def GenerateProjectFilesInfo(self):
- for dspfile in self.dspfiles:
- dsp_folder_path, name = os.path.split(dspfile)
- dsp_folder_path = os.path.abspath(dsp_folder_path)
- dsp_relative_folder_path = os.path.relpath(dsp_folder_path, self.dsw_folder_path)
- if dsp_relative_folder_path == os.curdir:
- dsp_relative_file_path = name
- else:
- dsp_relative_file_path = os.path.join(dsp_relative_folder_path, name)
- dspfile_info = {'NAME': name,
- 'GUID': _generateGUID(dspfile, ''),
- 'FOLDER_PATH': dsp_folder_path,
- 'FILE_PATH': dspfile,
- 'SLN_RELATIVE_FOLDER_PATH': dsp_relative_folder_path,
- 'SLN_RELATIVE_FILE_PATH': dsp_relative_file_path}
- self.dspfiles_info.append(dspfile_info)
-
- self.dspfiles_info = []
- GenerateProjectFilesInfo(self)
-
- def Parse(self):
- try:
- dswfile = open(self.dswfile,'r')
- except IOError:
- return # doesn't exist yet, so can't add anything to configs.
-
- line = dswfile.readline()
- while line:
- if line[:9] == "EndGlobal":
- break
- line = dswfile.readline()
-
- line = dswfile.readline()
- datas = line
- while line:
- line = dswfile.readline()
- datas = datas + line
-
- # OK, we've found our little pickled cache of data.
- try:
- datas = base64.decodestring(datas)
- data = pickle.loads(datas)
- except KeyboardInterrupt:
- raise
- except:
- return # unable to unpickle any data for some reason
-
- self.configs.update(data)
-
- def PrintSolution(self):
- """Writes a solution file"""
- self.file.write('Microsoft Visual Studio Solution File, Format Version %s\n' % self.versionstr)
- if self.version_num >= 12.0:
- self.file.write('# Visual Studio 14\n')
- elif self.version_num >= 11.0:
- self.file.write('# Visual Studio 11\n')
- elif self.version_num >= 10.0:
- self.file.write('# Visual Studio 2010\n')
- elif self.version_num >= 9.0:
- self.file.write('# Visual Studio 2008\n')
- elif self.version_num >= 8.0:
- self.file.write('# Visual Studio 2005\n')
-
- for dspinfo in self.dspfiles_info:
- name = dspinfo['NAME']
- base, suffix = SCons.Util.splitext(name)
- if suffix == '.vcproj':
- name = base
- self.file.write('Project("%s") = "%s", "%s", "%s"\n'
- % (external_makefile_guid, name, dspinfo['SLN_RELATIVE_FILE_PATH'], dspinfo['GUID']))
- if self.version_num >= 7.1 and self.version_num < 8.0:
- self.file.write('\tProjectSection(ProjectDependencies) = postProject\n'
- '\tEndProjectSection\n')
- self.file.write('EndProject\n')
-
- self.file.write('Global\n')
-
- env = self.env
- if 'MSVS_SCC_PROVIDER' in env:
- scc_number_of_projects = len(self.dspfiles) + 1
- slnguid = self.slnguid
- scc_provider = env.get('MSVS_SCC_PROVIDER', '').replace(' ', r'\u0020')
- scc_project_name = env.get('MSVS_SCC_PROJECT_NAME', '').replace(' ', r'\u0020')
- scc_connection_root = env.get('MSVS_SCC_CONNECTION_ROOT', os.curdir)
- scc_local_path = os.path.relpath(scc_connection_root, self.dsw_folder_path).replace('\\', '\\\\')
- self.file.write('\tGlobalSection(SourceCodeControl) = preSolution\n'
- '\t\tSccNumberOfProjects = %(scc_number_of_projects)d\n'
- '\t\tSccProjectName0 = %(scc_project_name)s\n'
- '\t\tSccLocalPath0 = %(scc_local_path)s\n'
- '\t\tSccProvider0 = %(scc_provider)s\n'
- '\t\tCanCheckoutShared = true\n' % locals())
- sln_relative_path_from_scc = os.path.relpath(self.dsw_folder_path, scc_connection_root)
- if sln_relative_path_from_scc != os.curdir:
- self.file.write('\t\tSccProjectFilePathRelativizedFromConnection0 = %s\\\\\n'
- % sln_relative_path_from_scc.replace('\\', '\\\\'))
- if self.version_num < 8.0:
- # When present, SolutionUniqueID is automatically removed by VS 2005
- # TODO: check for Visual Studio versions newer than 2005
- self.file.write('\t\tSolutionUniqueID = %s\n' % slnguid)
- for dspinfo in self.dspfiles_info:
- i = self.dspfiles_info.index(dspinfo) + 1
- dsp_relative_file_path = dspinfo['SLN_RELATIVE_FILE_PATH'].replace('\\', '\\\\')
- dsp_scc_relative_folder_path = os.path.relpath(dspinfo['FOLDER_PATH'], scc_connection_root).replace('\\', '\\\\')
- self.file.write('\t\tSccProjectUniqueName%(i)s = %(dsp_relative_file_path)s\n'
- '\t\tSccLocalPath%(i)d = %(scc_local_path)s\n'
- '\t\tCanCheckoutShared = true\n'
- '\t\tSccProjectFilePathRelativizedFromConnection%(i)s = %(dsp_scc_relative_folder_path)s\\\\\n'
- % locals())
- self.file.write('\tEndGlobalSection\n')
- if self.version_num >= 8.0:
- self.file.write('\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n')
- else:
- self.file.write('\tGlobalSection(SolutionConfiguration) = preSolution\n')
-
- confkeys = sorted(self.configs.keys())
- cnt = 0
- for name in confkeys:
- variant = self.configs[name].variant
- platform = self.configs[name].platform
- if self.version_num >= 8.0:
- self.file.write('\t\t%s|%s = %s|%s\n' % (variant, platform, variant, platform))
- else:
- self.file.write('\t\tConfigName.%d = %s\n' % (cnt, variant))
- cnt = cnt + 1
- self.file.write('\tEndGlobalSection\n')
- if self.version_num <= 7.1:
- self.file.write('\tGlobalSection(ProjectDependencies) = postSolution\n'
- '\tEndGlobalSection\n')
- if self.version_num >= 8.0:
- self.file.write('\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n')
- else:
- self.file.write('\tGlobalSection(ProjectConfiguration) = postSolution\n')
-
- for name in confkeys:
- variant = self.configs[name].variant
- platform = self.configs[name].platform
- if self.version_num >= 8.0:
- for dspinfo in self.dspfiles_info:
- guid = dspinfo['GUID']
- self.file.write('\t\t%s.%s|%s.ActiveCfg = %s|%s\n'
- '\t\t%s.%s|%s.Build.0 = %s|%s\n' % (guid,variant,platform,variant,platform,guid,variant,platform,variant,platform))
- else:
- for dspinfo in self.dspfiles_info:
- guid = dspinfo['GUID']
- self.file.write('\t\t%s.%s.ActiveCfg = %s|%s\n'
- '\t\t%s.%s.Build.0 = %s|%s\n' %(guid,variant,variant,platform,guid,variant,variant,platform))
-
- self.file.write('\tEndGlobalSection\n')
-
- if self.version_num >= 8.0:
- self.file.write('\tGlobalSection(SolutionProperties) = preSolution\n'
- '\t\tHideSolutionNode = FALSE\n'
- '\tEndGlobalSection\n')
- else:
- self.file.write('\tGlobalSection(ExtensibilityGlobals) = postSolution\n'
- '\tEndGlobalSection\n'
- '\tGlobalSection(ExtensibilityAddIns) = postSolution\n'
- '\tEndGlobalSection\n')
- self.file.write('EndGlobal\n')
- if self.nokeep == 0:
- pdata = pickle.dumps(self.configs,1)
- pdata = base64.encodestring(pdata)
- self.file.write(pdata + '\n')
-
- def Build(self):
- try:
- self.file = open(self.dswfile,'w')
- except IOError, detail:
- raise SCons.Errors.InternalError('Unable to open "' + self.dswfile + '" for writing:' + str(detail))
- else:
- self.PrintSolution()
- self.file.close()
-
-V6DSWHeader = """\
-Microsoft Developer Studio Workspace File, Format Version 6.00
-# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
-
-###############################################################################
-
-Project: "%(name)s"="%(dspfile)s" - Package Owner=<4>
-
-Package=<5>
-{{{
-}}}
-
-Package=<4>
-{{{
-}}}
-
-###############################################################################
-
-Global:
-
-Package=<5>
-{{{
-}}}
-
-Package=<3>
-{{{
-}}}
-
-###############################################################################
-"""
-
-class _GenerateV6DSW(_DSWGenerator):
- """Generates a Workspace file for MSVS 6.0"""
-
- def PrintWorkspace(self):
- """ writes a DSW file """
- name = self.name
- dspfile = os.path.relpath(self.dspfiles[0], self.dsw_folder_path)
- self.file.write(V6DSWHeader % locals())
-
- def Build(self):
- try:
- self.file = open(self.dswfile,'w')
- except IOError, detail:
- raise SCons.Errors.InternalError('Unable to open "' + self.dswfile + '" for writing:' + str(detail))
- else:
- self.PrintWorkspace()
- self.file.close()
-
-
-def GenerateDSP(dspfile, source, env):
- """Generates a Project file based on the version of MSVS that is being used"""
-
- version_num = 6.0
- if 'MSVS_VERSION' in env:
- version_num, suite = msvs_parse_version(env['MSVS_VERSION'])
- if version_num >= 10.0:
- g = _GenerateV10DSP(dspfile, source, env)
- g.Build()
- elif version_num >= 7.0:
- g = _GenerateV7DSP(dspfile, source, env)
- g.Build()
- else:
- g = _GenerateV6DSP(dspfile, source, env)
- g.Build()
-
-def GenerateDSW(dswfile, source, env):
- """Generates a Solution/Workspace file based on the version of MSVS that is being used"""
-
- version_num = 6.0
- if 'MSVS_VERSION' in env:
- version_num, suite = msvs_parse_version(env['MSVS_VERSION'])
- if version_num >= 7.0:
- g = _GenerateV7DSW(dswfile, source, env)
- g.Build()
- else:
- g = _GenerateV6DSW(dswfile, source, env)
- g.Build()
-
-
-##############################################################################
-# Above here are the classes and functions for generation of
-# DSP/DSW/SLN/VCPROJ files.
-##############################################################################
-
-def GetMSVSProjectSuffix(target, source, env, for_signature):
- return env['MSVS']['PROJECTSUFFIX']
-
-def GetMSVSSolutionSuffix(target, source, env, for_signature):
- return env['MSVS']['SOLUTIONSUFFIX']
-
-def GenerateProject(target, source, env):
- # generate the dsp file, according to the version of MSVS.
- builddspfile = target[0]
- dspfile = builddspfile.srcnode()
-
- # this detects whether or not we're using a VariantDir
- if not dspfile is builddspfile:
- try:
- bdsp = open(str(builddspfile), "w+")
- except IOError, detail:
- print 'Unable to open "' + str(dspfile) + '" for writing:',detail,'\n'
- raise
-
- bdsp.write("This is just a placeholder file.\nThe real project file is here:\n%s\n" % dspfile.get_abspath())
-
- GenerateDSP(dspfile, source, env)
-
- if env.get('auto_build_solution', 1):
- builddswfile = target[1]
- dswfile = builddswfile.srcnode()
-
- if not dswfile is builddswfile:
-
- try:
- bdsw = open(str(builddswfile), "w+")
- except IOError, detail:
- print 'Unable to open "' + str(dspfile) + '" for writing:',detail,'\n'
- raise
-
- bdsw.write("This is just a placeholder file.\nThe real workspace file is here:\n%s\n" % dswfile.get_abspath())
-
- GenerateDSW(dswfile, source, env)
-
-def GenerateSolution(target, source, env):
- GenerateDSW(target[0], source, env)
-
-def projectEmitter(target, source, env):
- """Sets up the DSP dependencies."""
-
- # todo: Not sure what sets source to what user has passed as target,
- # but this is what happens. When that is fixed, we also won't have
- # to make the user always append env['MSVSPROJECTSUFFIX'] to target.
- if source[0] == target[0]:
- source = []
-
- # make sure the suffix is correct for the version of MSVS we're running.
- (base, suff) = SCons.Util.splitext(str(target[0]))
- suff = env.subst('$MSVSPROJECTSUFFIX')
- target[0] = base + suff
-
- if not source:
- source = 'prj_inputs:'
- source = source + env.subst('$MSVSSCONSCOM', 1)
- source = source + env.subst('$MSVSENCODING', 1)
-
- # Project file depends on CPPDEFINES and CPPPATH
- preprocdefs = xmlify(';'.join(processDefines(env.get('CPPDEFINES', []))))
- includepath_Dirs = processIncludes(env.get('CPPPATH', []), env, None, None)
- includepath = xmlify(';'.join([str(x) for x in includepath_Dirs]))
- source = source + "; ppdefs:%s incpath:%s"%(preprocdefs, includepath)
-
- if 'buildtarget' in env and env['buildtarget'] != None:
- if SCons.Util.is_String(env['buildtarget']):
- source = source + ' "%s"' % env['buildtarget']
- elif SCons.Util.is_List(env['buildtarget']):
- for bt in env['buildtarget']:
- if SCons.Util.is_String(bt):
- source = source + ' "%s"' % bt
- else:
- try: source = source + ' "%s"' % bt.get_abspath()
- except AttributeError: raise SCons.Errors.InternalError("buildtarget can be a string, a node, a list of strings or nodes, or None")
- else:
- try: source = source + ' "%s"' % env['buildtarget'].get_abspath()
- except AttributeError: raise SCons.Errors.InternalError("buildtarget can be a string, a node, a list of strings or nodes, or None")
-
- if 'outdir' in env and env['outdir'] != None:
- if SCons.Util.is_String(env['outdir']):
- source = source + ' "%s"' % env['outdir']
- elif SCons.Util.is_List(env['outdir']):
- for s in env['outdir']:
- if SCons.Util.is_String(s):
- source = source + ' "%s"' % s
- else:
- try: source = source + ' "%s"' % s.get_abspath()
- except AttributeError: raise SCons.Errors.InternalError("outdir can be a string, a node, a list of strings or nodes, or None")
- else:
- try: source = source + ' "%s"' % env['outdir'].get_abspath()
- except AttributeError: raise SCons.Errors.InternalError("outdir can be a string, a node, a list of strings or nodes, or None")
-
- if 'name' in env:
- if SCons.Util.is_String(env['name']):
- source = source + ' "%s"' % env['name']
- else:
- raise SCons.Errors.InternalError("name must be a string")
-
- if 'variant' in env:
- if SCons.Util.is_String(env['variant']):
- source = source + ' "%s"' % env['variant']
- elif SCons.Util.is_List(env['variant']):
- for variant in env['variant']:
- if SCons.Util.is_String(variant):
- source = source + ' "%s"' % variant
- else:
- raise SCons.Errors.InternalError("name must be a string or a list of strings")
- else:
- raise SCons.Errors.InternalError("variant must be a string or a list of strings")
- else:
- raise SCons.Errors.InternalError("variant must be specified")
-
- for s in _DSPGenerator.srcargs:
- if s in env:
- if SCons.Util.is_String(env[s]):
- source = source + ' "%s' % env[s]
- elif SCons.Util.is_List(env[s]):
- for t in env[s]:
- if SCons.Util.is_String(t):
- source = source + ' "%s"' % t
- else:
- raise SCons.Errors.InternalError(s + " must be a string or a list of strings")
- else:
- raise SCons.Errors.InternalError(s + " must be a string or a list of strings")
-
- source = source + ' "%s"' % str(target[0])
- source = [SCons.Node.Python.Value(source)]
-
- targetlist = [target[0]]
- sourcelist = source
-
- if env.get('auto_build_solution', 1):
- env['projects'] = [env.File(t).srcnode() for t in targetlist]
- t, s = solutionEmitter(target, target, env)
- targetlist = targetlist + t
-
- # Beginning with Visual Studio 2010 for each project file (.vcxproj) we have additional file (.vcxproj.filters)
- if float(env['MSVS_VERSION']) >= 10.0:
- targetlist.append(targetlist[0] + '.filters')
-
- return (targetlist, sourcelist)
-
-def solutionEmitter(target, source, env):
- """Sets up the DSW dependencies."""
-
- # todo: Not sure what sets source to what user has passed as target,
- # but this is what happens. When that is fixed, we also won't have
- # to make the user always append env['MSVSSOLUTIONSUFFIX'] to target.
- if source[0] == target[0]:
- source = []
-
- # make sure the suffix is correct for the version of MSVS we're running.
- (base, suff) = SCons.Util.splitext(str(target[0]))
- suff = env.subst('$MSVSSOLUTIONSUFFIX')
- target[0] = base + suff
-
- if not source:
- source = 'sln_inputs:'
-
- if 'name' in env:
- if SCons.Util.is_String(env['name']):
- source = source + ' "%s"' % env['name']
- else:
- raise SCons.Errors.InternalError("name must be a string")
-
- if 'variant' in env:
- if SCons.Util.is_String(env['variant']):
- source = source + ' "%s"' % env['variant']
- elif SCons.Util.is_List(env['variant']):
- for variant in env['variant']:
- if SCons.Util.is_String(variant):
- source = source + ' "%s"' % variant
- else:
- raise SCons.Errors.InternalError("name must be a string or a list of strings")
- else:
- raise SCons.Errors.InternalError("variant must be a string or a list of strings")
- else:
- raise SCons.Errors.InternalError("variant must be specified")
-
- if 'slnguid' in env:
- if SCons.Util.is_String(env['slnguid']):
- source = source + ' "%s"' % env['slnguid']
- else:
- raise SCons.Errors.InternalError("slnguid must be a string")
-
- if 'projects' in env:
- if SCons.Util.is_String(env['projects']):
- source = source + ' "%s"' % env['projects']
- elif SCons.Util.is_List(env['projects']):
- for t in env['projects']:
- if SCons.Util.is_String(t):
- source = source + ' "%s"' % t
-
- source = source + ' "%s"' % str(target[0])
- source = [SCons.Node.Python.Value(source)]
-
- return ([target[0]], source)
-
-projectAction = SCons.Action.Action(GenerateProject, None)
-
-solutionAction = SCons.Action.Action(GenerateSolution, None)
-
-projectBuilder = SCons.Builder.Builder(action = '$MSVSPROJECTCOM',
- suffix = '$MSVSPROJECTSUFFIX',
- emitter = projectEmitter)
-
-solutionBuilder = SCons.Builder.Builder(action = '$MSVSSOLUTIONCOM',
- suffix = '$MSVSSOLUTIONSUFFIX',
- emitter = solutionEmitter)
-
-default_MSVS_SConscript = None
-
-def generate(env):
- """Add Builders and construction variables for Microsoft Visual
- Studio project files to an Environment."""
- try:
- env['BUILDERS']['MSVSProject']
- except KeyError:
- env['BUILDERS']['MSVSProject'] = projectBuilder
-
- try:
- env['BUILDERS']['MSVSSolution']
- except KeyError:
- env['BUILDERS']['MSVSSolution'] = solutionBuilder
-
- env['MSVSPROJECTCOM'] = projectAction
- env['MSVSSOLUTIONCOM'] = solutionAction
-
- if SCons.Script.call_stack:
- # XXX Need to find a way to abstract this; the build engine
- # shouldn't depend on anything in SCons.Script.
- env['MSVSSCONSCRIPT'] = SCons.Script.call_stack[0].sconscript
- else:
- global default_MSVS_SConscript
- if default_MSVS_SConscript is None:
- default_MSVS_SConscript = env.File('SConstruct')
- env['MSVSSCONSCRIPT'] = default_MSVS_SConscript
-
- env['MSVSSCONS'] = '"%s" -c "%s"' % (python_executable, getExecScriptMain(env))
- env['MSVSSCONSFLAGS'] = '-C "${MSVSSCONSCRIPT.dir.get_abspath()}" -f ${MSVSSCONSCRIPT.name}'
- env['MSVSSCONSCOM'] = '$MSVSSCONS $MSVSSCONSFLAGS'
- env['MSVSBUILDCOM'] = '$MSVSSCONSCOM "$MSVSBUILDTARGET"'
- env['MSVSREBUILDCOM'] = '$MSVSSCONSCOM "$MSVSBUILDTARGET"'
- env['MSVSCLEANCOM'] = '$MSVSSCONSCOM -c "$MSVSBUILDTARGET"'
-
- # Set-up ms tools paths for default version
- msvc_setup_env_once(env)
-
- if 'MSVS_VERSION' in env:
- version_num, suite = msvs_parse_version(env['MSVS_VERSION'])
- else:
- (version_num, suite) = (7.0, None) # guess at a default
- if 'MSVS' not in env:
- env['MSVS'] = {}
- if (version_num < 7.0):
- env['MSVS']['PROJECTSUFFIX'] = '.dsp'
- env['MSVS']['SOLUTIONSUFFIX'] = '.dsw'
- elif (version_num < 10.0):
- env['MSVS']['PROJECTSUFFIX'] = '.vcproj'
- env['MSVS']['SOLUTIONSUFFIX'] = '.sln'
- else:
- env['MSVS']['PROJECTSUFFIX'] = '.vcxproj'
- env['MSVS']['SOLUTIONSUFFIX'] = '.sln'
-
- if (version_num >= 10.0):
- env['MSVSENCODING'] = 'utf-8'
- else:
- env['MSVSENCODING'] = 'Windows-1252'
-
- env['GET_MSVSPROJECTSUFFIX'] = GetMSVSProjectSuffix
- env['GET_MSVSSOLUTIONSUFFIX'] = GetMSVSSolutionSuffix
- env['MSVSPROJECTSUFFIX'] = '${GET_MSVSPROJECTSUFFIX}'
- env['MSVSSOLUTIONSUFFIX'] = '${GET_MSVSSOLUTIONSUFFIX}'
- env['SCONS_HOME'] = os.environ.get('SCONS_HOME')
-
-def exists(env):
- return msvc_exists()
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/mwcc.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/mwcc.py
deleted file mode 100644
index a130d0f..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/mwcc.py
+++ /dev/null
@@ -1,207 +0,0 @@
-"""SCons.Tool.mwcc
-
-Tool-specific initialization for the Metrowerks CodeWarrior compiler.
-
-There normally shouldn't be any need to import this module directly.
-It will usually be imported through the generic SCons.Tool.Tool()
-selection method.
-"""
-
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-
-__revision__ = "src/engine/SCons/Tool/mwcc.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-import os
-import os.path
-
-import SCons.Util
-
-def set_vars(env):
- """Set MWCW_VERSION, MWCW_VERSIONS, and some codewarrior environment vars
-
- MWCW_VERSIONS is set to a list of objects representing installed versions
-
- MWCW_VERSION is set to the version object that will be used for building.
- MWCW_VERSION can be set to a string during Environment
- construction to influence which version is chosen, otherwise
- the latest one from MWCW_VERSIONS is used.
-
- Returns true if at least one version is found, false otherwise
- """
- desired = env.get('MWCW_VERSION', '')
-
- # return right away if the variables are already set
- if isinstance(desired, MWVersion):
- return 1
- elif desired is None:
- return 0
-
- versions = find_versions()
- version = None
-
- if desired:
- for v in versions:
- if str(v) == desired:
- version = v
- elif versions:
- version = versions[-1]
-
- env['MWCW_VERSIONS'] = versions
- env['MWCW_VERSION'] = version
-
- if version is None:
- return 0
-
- env.PrependENVPath('PATH', version.clpath)
- env.PrependENVPath('PATH', version.dllpath)
- ENV = env['ENV']
- ENV['CWFolder'] = version.path
- ENV['LM_LICENSE_FILE'] = version.license
- plus = lambda x: '+%s' % x
- ENV['MWCIncludes'] = os.pathsep.join(map(plus, version.includes))
- ENV['MWLibraries'] = os.pathsep.join(map(plus, version.libs))
- return 1
-
-
-def find_versions():
- """Return a list of MWVersion objects representing installed versions"""
- versions = []
-
- ### This function finds CodeWarrior by reading from the registry on
- ### Windows. Some other method needs to be implemented for other
- ### platforms, maybe something that calls env.WhereIs('mwcc')
-
- if SCons.Util.can_read_reg:
- try:
- HLM = SCons.Util.HKEY_LOCAL_MACHINE
- product = 'SOFTWARE\\Metrowerks\\CodeWarrior\\Product Versions'
- product_key = SCons.Util.RegOpenKeyEx(HLM, product)
-
- i = 0
- while True:
- name = product + '\\' + SCons.Util.RegEnumKey(product_key, i)
- name_key = SCons.Util.RegOpenKeyEx(HLM, name)
-
- try:
- version = SCons.Util.RegQueryValueEx(name_key, 'VERSION')
- path = SCons.Util.RegQueryValueEx(name_key, 'PATH')
- mwv = MWVersion(version[0], path[0], 'Win32-X86')
- versions.append(mwv)
- except SCons.Util.RegError:
- pass
-
- i = i + 1
-
- except SCons.Util.RegError:
- pass
-
- return versions
-
-
-class MWVersion(object):
- def __init__(self, version, path, platform):
- self.version = version
- self.path = path
- self.platform = platform
- self.clpath = os.path.join(path, 'Other Metrowerks Tools',
- 'Command Line Tools')
- self.dllpath = os.path.join(path, 'Bin')
-
- # The Metrowerks tools don't store any configuration data so they
- # are totally dumb when it comes to locating standard headers,
- # libraries, and other files, expecting all the information
- # to be handed to them in environment variables. The members set
- # below control what information scons injects into the environment
-
- ### The paths below give a normal build environment in CodeWarrior for
- ### Windows, other versions of CodeWarrior might need different paths.
-
- msl = os.path.join(path, 'MSL')
- support = os.path.join(path, '%s Support' % platform)
-
- self.license = os.path.join(path, 'license.dat')
- self.includes = [msl, support]
- self.libs = [msl, support]
-
- def __str__(self):
- return self.version
-
-
-CSuffixes = ['.c', '.C']
-CXXSuffixes = ['.cc', '.cpp', '.cxx', '.c++', '.C++']
-
-
-def generate(env):
- """Add Builders and construction variables for the mwcc to an Environment."""
- import SCons.Defaults
- import SCons.Tool
-
- set_vars(env)
-
- static_obj, shared_obj = SCons.Tool.createObjBuilders(env)
-
- for suffix in CSuffixes:
- static_obj.add_action(suffix, SCons.Defaults.CAction)
- shared_obj.add_action(suffix, SCons.Defaults.ShCAction)
-
- for suffix in CXXSuffixes:
- static_obj.add_action(suffix, SCons.Defaults.CXXAction)
- shared_obj.add_action(suffix, SCons.Defaults.ShCXXAction)
-
- env['CCCOMFLAGS'] = '$CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS -nolink -o $TARGET $SOURCES'
-
- env['CC'] = 'mwcc'
- env['CCCOM'] = '$CC $CFLAGS $CCFLAGS $CCCOMFLAGS'
-
- env['CXX'] = 'mwcc'
- env['CXXCOM'] = '$CXX $CXXFLAGS $CCCOMFLAGS'
-
- env['SHCC'] = '$CC'
- env['SHCCFLAGS'] = '$CCFLAGS'
- env['SHCFLAGS'] = '$CFLAGS'
- env['SHCCCOM'] = '$SHCC $SHCFLAGS $SHCCFLAGS $CCCOMFLAGS'
-
- env['SHCXX'] = '$CXX'
- env['SHCXXFLAGS'] = '$CXXFLAGS'
- env['SHCXXCOM'] = '$SHCXX $SHCXXFLAGS $CCCOMFLAGS'
-
- env['CFILESUFFIX'] = '.c'
- env['CXXFILESUFFIX'] = '.cpp'
- env['CPPDEFPREFIX'] = '-D'
- env['CPPDEFSUFFIX'] = ''
- env['INCPREFIX'] = '-I'
- env['INCSUFFIX'] = ''
-
- #env['PCH'] = ?
- #env['PCHSTOP'] = ?
-
-
-def exists(env):
- return set_vars(env)
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/mwld.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/mwld.py
deleted file mode 100644
index 8f6f3a2..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/mwld.py
+++ /dev/null
@@ -1,107 +0,0 @@
-"""SCons.Tool.mwld
-
-Tool-specific initialization for the Metrowerks CodeWarrior linker.
-
-There normally shouldn't be any need to import this module directly.
-It will usually be imported through the generic SCons.Tool.Tool()
-selection method.
-"""
-
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-
-__revision__ = "src/engine/SCons/Tool/mwld.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-import SCons.Tool
-
-
-def generate(env):
- """Add Builders and construction variables for lib to an Environment."""
- SCons.Tool.createStaticLibBuilder(env)
- SCons.Tool.createSharedLibBuilder(env)
- SCons.Tool.createProgBuilder(env)
-
- env['AR'] = 'mwld'
- env['ARCOM'] = '$AR $ARFLAGS -library -o $TARGET $SOURCES'
-
- env['LIBDIRPREFIX'] = '-L'
- env['LIBDIRSUFFIX'] = ''
- env['LIBLINKPREFIX'] = '-l'
- env['LIBLINKSUFFIX'] = '.lib'
-
- env['LINK'] = 'mwld'
- env['LINKCOM'] = '$LINK $LINKFLAGS -o $TARGET $SOURCES $_LIBDIRFLAGS $_LIBFLAGS'
-
- env['SHLINK'] = '$LINK'
- env['SHLINKFLAGS'] = '$LINKFLAGS'
- env['SHLINKCOM'] = shlib_action
- env['SHLIBEMITTER']= shlib_emitter
-
-
-def exists(env):
- import SCons.Tool.mwcc
- return SCons.Tool.mwcc.set_vars(env)
-
-
-def shlib_generator(target, source, env, for_signature):
- cmd = ['$SHLINK', '$SHLINKFLAGS', '-shared']
-
- no_import_lib = env.get('no_import_lib', 0)
- if no_import_lib: cmd.extend('-noimplib')
-
- dll = env.FindIxes(target, 'SHLIBPREFIX', 'SHLIBSUFFIX')
- if dll: cmd.extend(['-o', dll])
-
- implib = env.FindIxes(target, 'LIBPREFIX', 'LIBSUFFIX')
- if implib: cmd.extend(['-implib', implib.get_string(for_signature)])
-
- cmd.extend(['$SOURCES', '$_LIBDIRFLAGS', '$_LIBFLAGS'])
-
- return [cmd]
-
-
-def shlib_emitter(target, source, env):
- dll = env.FindIxes(target, 'SHLIBPREFIX', 'SHLIBSUFFIX')
- no_import_lib = env.get('no_import_lib', 0)
-
- if not dll:
- raise SCons.Errors.UserError("A shared library should have exactly one target with the suffix: %s" % env.subst("$SHLIBSUFFIX"))
-
- if not no_import_lib and \
- not env.FindIxes(target, 'LIBPREFIX', 'LIBSUFFIX'):
-
- # Append an import library to the list of targets.
- target.append(env.ReplaceIxes(dll,
- 'SHLIBPREFIX', 'SHLIBSUFFIX',
- 'LIBPREFIX', 'LIBSUFFIX'))
-
- return target, source
-
-
-shlib_action = SCons.Action.Action(shlib_generator, generator=1)
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/nasm.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/nasm.py
deleted file mode 100644
index 86a7ef8..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/nasm.py
+++ /dev/null
@@ -1,72 +0,0 @@
-"""SCons.Tool.nasm
-
-Tool-specific initialization for nasm, the famous Netwide Assembler.
-
-There normally shouldn't be any need to import this module directly.
-It will usually be imported through the generic SCons.Tool.Tool()
-selection method.
-
-"""
-
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-
-__revision__ = "src/engine/SCons/Tool/nasm.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-import SCons.Defaults
-import SCons.Tool
-import SCons.Util
-
-ASSuffixes = ['.s', '.asm', '.ASM']
-ASPPSuffixes = ['.spp', '.SPP', '.sx']
-if SCons.Util.case_sensitive_suffixes('.s', '.S'):
- ASPPSuffixes.extend(['.S'])
-else:
- ASSuffixes.extend(['.S'])
-
-def generate(env):
- """Add Builders and construction variables for nasm to an Environment."""
- static_obj, shared_obj = SCons.Tool.createObjBuilders(env)
-
- for suffix in ASSuffixes:
- static_obj.add_action(suffix, SCons.Defaults.ASAction)
- static_obj.add_emitter(suffix, SCons.Defaults.StaticObjectEmitter)
-
- for suffix in ASPPSuffixes:
- static_obj.add_action(suffix, SCons.Defaults.ASPPAction)
- static_obj.add_emitter(suffix, SCons.Defaults.StaticObjectEmitter)
-
- env['AS'] = 'nasm'
- env['ASFLAGS'] = SCons.Util.CLVar('')
- env['ASPPFLAGS'] = '$ASFLAGS'
- env['ASCOM'] = '$AS $ASFLAGS -o $TARGET $SOURCES'
- env['ASPPCOM'] = '$CC $ASPPFLAGS $CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS -c -o $TARGET $SOURCES'
-
-def exists(env):
- return env.Detect('nasm')
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/packaging/__init__.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/packaging/__init__.py
deleted file mode 100644
index 2107d5f..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/packaging/__init__.py
+++ /dev/null
@@ -1,314 +0,0 @@
-"""SCons.Tool.Packaging
-
-SCons Packaging Tool.
-"""
-
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-__revision__ = "src/engine/SCons/Tool/packaging/__init__.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-import SCons.Environment
-from SCons.Variables import *
-from SCons.Errors import *
-from SCons.Util import is_List, make_path_relative
-from SCons.Warnings import warn, Warning
-
-import os, imp
-import SCons.Defaults
-
-__all__ = [ 'src_targz', 'src_tarbz2', 'src_zip', 'tarbz2', 'targz', 'zip', 'rpm', 'msi', 'ipk' ]
-
-#
-# Utility and Builder function
-#
-def Tag(env, target, source, *more_tags, **kw_tags):
- """ Tag a file with the given arguments, just sets the accordingly named
- attribute on the file object.
-
- TODO: FIXME
- """
- if not target:
- target=source
- first_tag=None
- else:
- first_tag=source
-
- if first_tag:
- kw_tags[first_tag[0]] = ''
-
- if len(kw_tags) == 0 and len(more_tags) == 0:
- raise UserError("No tags given.")
-
- # XXX: sanity checks
- for x in more_tags:
- kw_tags[x] = ''
-
- if not SCons.Util.is_List(target):
- target=[target]
- else:
- # hmm, sometimes the target list, is a list of a list
- # make sure it is flattened prior to processing.
- # TODO: perhaps some bug ?!?
- target=env.Flatten(target)
-
- for t in target:
- for (k,v) in kw_tags.items():
- # all file tags have to start with PACKAGING_, so we can later
- # differentiate between "normal" object attributes and the
- # packaging attributes. As the user should not be bothered with
- # that, the prefix will be added here if missing.
- #if not k.startswith('PACKAGING_'):
- if k[:10] != 'PACKAGING_':
- k='PACKAGING_'+k
- t.Tag(k, v)
-
-def Package(env, target=None, source=None, **kw):
- """ Entry point for the package tool.
- """
- # check if we need to find the source files ourself
- if not source:
- source = env.FindInstalledFiles()
-
- if len(source)==0:
- raise UserError("No source for Package() given")
-
- # decide which types of packages shall be built. Can be defined through
- # four mechanisms: command line argument, keyword argument,
- # environment argument and default selection( zip or tar.gz ) in that
- # order.
- try: kw['PACKAGETYPE']=env['PACKAGETYPE']
- except KeyError: pass
-
- if not kw.get('PACKAGETYPE'):
- from SCons.Script import GetOption
- kw['PACKAGETYPE'] = GetOption('package_type')
-
- if kw['PACKAGETYPE'] == None:
- if 'Tar' in env['BUILDERS']:
- kw['PACKAGETYPE']='targz'
- elif 'Zip' in env['BUILDERS']:
- kw['PACKAGETYPE']='zip'
- else:
- raise UserError("No type for Package() given")
-
- PACKAGETYPE=kw['PACKAGETYPE']
- if not is_List(PACKAGETYPE):
- PACKAGETYPE=PACKAGETYPE.split(',')
-
- # load the needed packagers.
- def load_packager(type):
- try:
- file,path,desc=imp.find_module(type, __path__)
- return imp.load_module(type, file, path, desc)
- except ImportError, e:
- raise EnvironmentError("packager %s not available: %s"%(type,str(e)))
-
- packagers=list(map(load_packager, PACKAGETYPE))
-
- # set up targets and the PACKAGEROOT
- try:
- # fill up the target list with a default target name until the PACKAGETYPE
- # list is of the same size as the target list.
- if not target: target = []
-
- size_diff = len(PACKAGETYPE)-len(target)
- default_name = "%(NAME)s-%(VERSION)s"
-
- if size_diff>0:
- default_target = default_name%kw
- target.extend( [default_target]*size_diff )
-
- if 'PACKAGEROOT' not in kw:
- kw['PACKAGEROOT'] = default_name%kw
-
- except KeyError, e:
- raise SCons.Errors.UserError( "Missing Packagetag '%s'"%e.args[0] )
-
- # setup the source files
- source=env.arg2nodes(source, env.fs.Entry)
-
- # call the packager to setup the dependencies.
- targets=[]
- try:
- for packager in packagers:
- t=[target.pop(0)]
- t=packager.package(env,t,source, **kw)
- targets.extend(t)
-
- assert( len(target) == 0 )
-
- except KeyError, e:
- raise SCons.Errors.UserError( "Missing Packagetag '%s' for %s packager"\
- % (e.args[0],packager.__name__) )
- except TypeError, e:
- # this exception means that a needed argument for the packager is
- # missing. As our packagers get their "tags" as named function
- # arguments we need to find out which one is missing.
- from inspect import getargspec
- args,varargs,varkw,defaults=getargspec(packager.package)
- if defaults!=None:
- args=args[:-len(defaults)] # throw away arguments with default values
- args.remove('env')
- args.remove('target')
- args.remove('source')
- # now remove any args for which we have a value in kw.
- args=[x for x in args if x not in kw]
-
- if len(args)==0:
- raise # must be a different error, so reraise
- elif len(args)==1:
- raise SCons.Errors.UserError( "Missing Packagetag '%s' for %s packager"\
- % (args[0],packager.__name__) )
- else:
- raise SCons.Errors.UserError( "Missing Packagetags '%s' for %s packager"\
- % (", ".join(args),packager.__name__) )
-
- target=env.arg2nodes(target, env.fs.Entry)
- targets.extend(env.Alias( 'package', targets ))
- return targets
-
-#
-# SCons tool initialization functions
-#
-
-added = None
-
-def generate(env):
- from SCons.Script import AddOption
- global added
- if not added:
- added = 1
- AddOption('--package-type',
- dest='package_type',
- default=None,
- type="string",
- action="store",
- help='The type of package to create.')
-
- try:
- env['BUILDERS']['Package']
- env['BUILDERS']['Tag']
- except KeyError:
- env['BUILDERS']['Package'] = Package
- env['BUILDERS']['Tag'] = Tag
-
-def exists(env):
- return 1
-
-# XXX
-def options(opts):
- opts.AddVariables(
- EnumVariable( 'PACKAGETYPE',
- 'the type of package to create.',
- None, allowed_values=list(map( str, __all__ )),
- ignorecase=2
- )
- )
-
-#
-# Internal utility functions
-#
-
-def copy_attr(f1, f2):
- """ copies the special packaging file attributes from f1 to f2.
- """
- #pattrs = [x for x in dir(f1) if not hasattr(f2, x) and\
- # x.startswith('PACKAGING_')]
- copyit = lambda x: not hasattr(f2, x) and x[:10] == 'PACKAGING_'
- if f1._tags:
- pattrs = list(filter(copyit, f1._tags))
- for attr in pattrs:
- f2.Tag(attr, f1.GetTag(attr))
-
-def putintopackageroot(target, source, env, pkgroot, honor_install_location=1):
- """ Uses the CopyAs builder to copy all source files to the directory given
- in pkgroot.
-
- If honor_install_location is set and the copied source file has an
- PACKAGING_INSTALL_LOCATION attribute, the PACKAGING_INSTALL_LOCATION is
- used as the new name of the source file under pkgroot.
-
- The source file will not be copied if it is already under the the pkgroot
- directory.
-
- All attributes of the source file will be copied to the new file.
- """
- # make sure the packageroot is a Dir object.
- if SCons.Util.is_String(pkgroot): pkgroot=env.Dir(pkgroot)
- if not SCons.Util.is_List(source): source=[source]
-
- new_source = []
- for file in source:
- if SCons.Util.is_String(file): file = env.File(file)
-
- if file.is_under(pkgroot):
- new_source.append(file)
- else:
- if file.GetTag('PACKAGING_INSTALL_LOCATION') and\
- honor_install_location:
- new_name=make_path_relative(file.GetTag('PACKAGING_INSTALL_LOCATION'))
- else:
- new_name=make_path_relative(file.get_path())
-
- new_file=pkgroot.File(new_name)
- new_file=env.CopyAs(new_file, file)[0]
- copy_attr(file, new_file)
- new_source.append(new_file)
-
- return (target, new_source)
-
-def stripinstallbuilder(target, source, env):
- """ strips the install builder action from the source list and stores
- the final installation location as the "PACKAGING_INSTALL_LOCATION" of
- the source of the source file. This effectively removes the final installed
- files from the source list while remembering the installation location.
-
- It also warns about files which have no install builder attached.
- """
- def has_no_install_location(file):
- return not (file.has_builder() and\
- hasattr(file.builder, 'name') and\
- (file.builder.name=="InstallBuilder" or\
- file.builder.name=="InstallAsBuilder"))
-
- if len(list(filter(has_no_install_location, source))):
- warn(Warning, "there are files to package which have no\
- InstallBuilder attached, this might lead to irreproducible packages")
-
- n_source=[]
- for s in source:
- if has_no_install_location(s):
- n_source.append(s)
- else:
- for ss in s.sources:
- n_source.append(ss)
- copy_attr(s, ss)
- ss.Tag('PACKAGING_INSTALL_LOCATION', s.get_path())
-
- return (target, n_source)
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/packaging/ipk.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/packaging/ipk.py
deleted file mode 100644
index 51c3381..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/packaging/ipk.py
+++ /dev/null
@@ -1,185 +0,0 @@
-"""SCons.Tool.Packaging.ipk
-"""
-
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-
-__revision__ = "src/engine/SCons/Tool/packaging/ipk.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-import SCons.Builder
-import SCons.Node.FS
-import os
-
-from SCons.Tool.packaging import stripinstallbuilder, putintopackageroot
-
-def package(env, target, source, PACKAGEROOT, NAME, VERSION, DESCRIPTION,
- SUMMARY, X_IPK_PRIORITY, X_IPK_SECTION, SOURCE_URL,
- X_IPK_MAINTAINER, X_IPK_DEPENDS, **kw):
- """ this function prepares the packageroot directory for packaging with the
- ipkg builder.
- """
- SCons.Tool.Tool('ipkg').generate(env)
-
- # setup the Ipkg builder
- bld = env['BUILDERS']['Ipkg']
- target, source = stripinstallbuilder(target, source, env)
- target, source = putintopackageroot(target, source, env, PACKAGEROOT)
-
- # This should be overridable from the construction environment,
- # which it is by using ARCHITECTURE=.
- # Guessing based on what os.uname() returns at least allows it
- # to work for both i386 and x86_64 Linux systems.
- archmap = {
- 'i686' : 'i386',
- 'i586' : 'i386',
- 'i486' : 'i386',
- }
-
- buildarchitecture = os.uname()[4]
- buildarchitecture = archmap.get(buildarchitecture, buildarchitecture)
-
- if 'ARCHITECTURE' in kw:
- buildarchitecture = kw['ARCHITECTURE']
-
- # setup the kw to contain the mandatory arguments to this fucntion.
- # do this before calling any builder or setup function
- loc=locals()
- del loc['kw']
- kw.update(loc)
- del kw['source'], kw['target'], kw['env']
-
- # generate the specfile
- specfile = gen_ipk_dir(PACKAGEROOT, source, env, kw)
-
- # override the default target.
- if str(target[0])=="%s-%s"%(NAME, VERSION):
- target=[ "%s_%s_%s.ipk"%(NAME, VERSION, buildarchitecture) ]
-
- # now apply the Ipkg builder
- return bld(env, target, specfile, **kw)
-
-def gen_ipk_dir(proot, source, env, kw):
- # make sure the packageroot is a Dir object.
- if SCons.Util.is_String(proot): proot=env.Dir(proot)
-
- # create the specfile builder
- s_bld=SCons.Builder.Builder(
- action = build_specfiles,
- )
-
- # create the specfile targets
- spec_target=[]
- control=proot.Dir('CONTROL')
- spec_target.append(control.File('control'))
- spec_target.append(control.File('conffiles'))
- spec_target.append(control.File('postrm'))
- spec_target.append(control.File('prerm'))
- spec_target.append(control.File('postinst'))
- spec_target.append(control.File('preinst'))
-
- # apply the builder to the specfile targets
- s_bld(env, spec_target, source, **kw)
-
- # the packageroot directory does now contain the specfiles.
- return proot
-
-def build_specfiles(source, target, env):
- """ filter the targets for the needed files and use the variables in env
- to create the specfile.
- """
- #
- # At first we care for the CONTROL/control file, which is the main file for ipk.
- #
- # For this we need to open multiple files in random order, so we store into
- # a dict so they can be easily accessed.
- #
- #
- opened_files={}
- def open_file(needle, haystack):
- try:
- return opened_files[needle]
- except KeyError:
- file=filter(lambda x: x.get_path().rfind(needle)!=-1, haystack)[0]
- opened_files[needle]=open(file.get_abspath(), 'w')
- return opened_files[needle]
-
- control_file=open_file('control', target)
-
- if 'X_IPK_DESCRIPTION' not in env:
- env['X_IPK_DESCRIPTION']="%s\n %s"%(env['SUMMARY'],
- env['DESCRIPTION'].replace('\n', '\n '))
-
-
- content = """
-Package: $NAME
-Version: $VERSION
-Priority: $X_IPK_PRIORITY
-Section: $X_IPK_SECTION
-Source: $SOURCE_URL
-Architecture: $ARCHITECTURE
-Maintainer: $X_IPK_MAINTAINER
-Depends: $X_IPK_DEPENDS
-Description: $X_IPK_DESCRIPTION
-"""
-
- control_file.write(env.subst(content))
-
- #
- # now handle the various other files, which purpose it is to set post-,
- # pre-scripts and mark files as config files.
- #
- # We do so by filtering the source files for files which are marked with
- # the "config" tag and afterwards we do the same for x_ipk_postrm,
- # x_ipk_prerm, x_ipk_postinst and x_ipk_preinst tags.
- #
- # The first one will write the name of the file into the file
- # CONTROL/configfiles, the latter add the content of the x_ipk_* variable
- # into the same named file.
- #
- for f in [x for x in source if 'PACKAGING_CONFIG' in dir(x)]:
- config=open_file('conffiles')
- config.write(f.PACKAGING_INSTALL_LOCATION)
- config.write('\n')
-
- for str in 'POSTRM PRERM POSTINST PREINST'.split():
- name="PACKAGING_X_IPK_%s"%str
- for f in [x for x in source if name in dir(x)]:
- file=open_file(name)
- file.write(env[str])
-
- #
- # close all opened files
- for f in opened_files.values():
- f.close()
-
- # call a user specified function
- if 'CHANGE_SPECFILE' in env:
- content += env['CHANGE_SPECFILE'](target)
-
- return 0
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/packaging/msi.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/packaging/msi.py
deleted file mode 100644
index 41b7c77..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/packaging/msi.py
+++ /dev/null
@@ -1,527 +0,0 @@
-"""SCons.Tool.packaging.msi
-
-The msi packager.
-"""
-
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-__revision__ = "src/engine/SCons/Tool/packaging/msi.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-import os
-import SCons
-from SCons.Action import Action
-from SCons.Builder import Builder
-
-from xml.dom.minidom import *
-from xml.sax.saxutils import escape
-
-from SCons.Tool.packaging import stripinstallbuilder
-
-#
-# Utility functions
-#
-def convert_to_id(s, id_set):
- """ Some parts of .wxs need an Id attribute (for example: The File and
- Directory directives. The charset is limited to A-Z, a-z, digits,
- underscores, periods. Each Id must begin with a letter or with a
- underscore. Google for "CNDL0015" for information about this.
-
- Requirements:
- * the string created must only contain chars from the target charset.
- * the string created must have a minimal editing distance from the
- original string.
- * the string created must be unique for the whole .wxs file.
-
- Observation:
- * There are 62 chars in the charset.
-
- Idea:
- * filter out forbidden characters. Check for a collision with the help
- of the id_set. Add the number of the number of the collision at the
- end of the created string. Furthermore care for a correct start of
- the string.
- """
- charset = 'ABCDEFGHIJKLMNOPQRSTUVWXYabcdefghijklmnopqrstuvwxyz0123456789_.'
- if s[0] in '0123456789.':
- s += '_'+s
- id = [c for c in s if c in charset]
-
- # did we already generate an id for this file?
- try:
- return id_set[id][s]
- except KeyError:
- # no we did not so initialize with the id
- if id not in id_set: id_set[id] = { s : id }
- # there is a collision, generate an id which is unique by appending
- # the collision number
- else: id_set[id][s] = id + str(len(id_set[id]))
-
- return id_set[id][s]
-
-def is_dos_short_file_name(file):
- """ examine if the given file is in the 8.3 form.
- """
- fname, ext = os.path.splitext(file)
- proper_ext = len(ext) == 0 or (2 <= len(ext) <= 4) # the ext contains the dot
- proper_fname = file.isupper() and len(fname) <= 8
-
- return proper_ext and proper_fname
-
-def gen_dos_short_file_name(file, filename_set):
- """ see http://support.microsoft.com/default.aspx?scid=kb;en-us;Q142982
-
- These are no complete 8.3 dos short names. The ~ char is missing and
- replaced with one character from the filename. WiX warns about such
- filenames, since a collision might occur. Google for "CNDL1014" for
- more information.
- """
- # guard this to not confuse the generation
- if is_dos_short_file_name(file):
- return file
-
- fname, ext = os.path.splitext(file) # ext contains the dot
-
- # first try if it suffices to convert to upper
- file = file.upper()
- if is_dos_short_file_name(file):
- return file
-
- # strip forbidden characters.
- forbidden = '."/[]:;=, '
- fname = [c for c in fname if c not in forbidden]
-
- # check if we already generated a filename with the same number:
- # thisis1.txt, thisis2.txt etc.
- duplicate, num = not None, 1
- while duplicate:
- shortname = "%s%s" % (fname[:8-len(str(num))].upper(),\
- str(num))
- if len(ext) >= 2:
- shortname = "%s%s" % (shortname, ext[:4].upper())
-
- duplicate, num = shortname in filename_set, num+1
-
- assert( is_dos_short_file_name(shortname) ), 'shortname is %s, longname is %s' % (shortname, file)
- filename_set.append(shortname)
- return shortname
-
-def create_feature_dict(files):
- """ X_MSI_FEATURE and doc FileTag's can be used to collect files in a
- hierarchy. This function collects the files into this hierarchy.
- """
- dict = {}
-
- def add_to_dict( feature, file ):
- if not SCons.Util.is_List( feature ):
- feature = [ feature ]
-
- for f in feature:
- if f not in dict:
- dict[ f ] = [ file ]
- else:
- dict[ f ].append( file )
-
- for file in files:
- if hasattr( file, 'PACKAGING_X_MSI_FEATURE' ):
- add_to_dict(file.PACKAGING_X_MSI_FEATURE, file)
- elif hasattr( file, 'PACKAGING_DOC' ):
- add_to_dict( 'PACKAGING_DOC', file )
- else:
- add_to_dict( 'default', file )
-
- return dict
-
-def generate_guids(root):
- """ generates globally unique identifiers for parts of the xml which need
- them.
-
- Component tags have a special requirement. Their UUID is only allowed to
- change if the list of their contained resources has changed. This allows
- for clean removal and proper updates.
-
- To handle this requirement, the uuid is generated with an md5 hashing the
- whole subtree of a xml node.
- """
- from hashlib import md5
-
- # specify which tags need a guid and in which attribute this should be stored.
- needs_id = { 'Product' : 'Id',
- 'Package' : 'Id',
- 'Component' : 'Guid',
- }
-
- # find all XMl nodes matching the key, retrieve their attribute, hash their
- # subtree, convert hash to string and add as a attribute to the xml node.
- for (key,value) in needs_id.items():
- node_list = root.getElementsByTagName(key)
- attribute = value
- for node in node_list:
- hash = md5(node.toxml()).hexdigest()
- hash_str = '%s-%s-%s-%s-%s' % ( hash[:8], hash[8:12], hash[12:16], hash[16:20], hash[20:] )
- node.attributes[attribute] = hash_str
-
-
-
-def string_wxsfile(target, source, env):
- return "building WiX file %s"%( target[0].path )
-
-def build_wxsfile(target, source, env):
- """ compiles a .wxs file from the keywords given in env['msi_spec'] and
- by analyzing the tree of source nodes and their tags.
- """
- file = open(target[0].get_abspath(), 'w')
-
- try:
- # Create a document with the Wix root tag
- doc = Document()
- root = doc.createElement( 'Wix' )
- root.attributes['xmlns']='http://schemas.microsoft.com/wix/2003/01/wi'
- doc.appendChild( root )
-
- filename_set = [] # this is to circumvent duplicates in the shortnames
- id_set = {} # this is to circumvent duplicates in the ids
-
- # Create the content
- build_wxsfile_header_section(root, env)
- build_wxsfile_file_section(root, source, env['NAME'], env['VERSION'], env['VENDOR'], filename_set, id_set)
- generate_guids(root)
- build_wxsfile_features_section(root, source, env['NAME'], env['VERSION'], env['SUMMARY'], id_set)
- build_wxsfile_default_gui(root)
- build_license_file(target[0].get_dir(), env)
-
- # write the xml to a file
- file.write( doc.toprettyxml() )
-
- # call a user specified function
- if 'CHANGE_SPECFILE' in env:
- env['CHANGE_SPECFILE'](target, source)
-
- except KeyError, e:
- raise SCons.Errors.UserError( '"%s" package field for MSI is missing.' % e.args[0] )
-
-#
-# setup function
-#
-def create_default_directory_layout(root, NAME, VERSION, VENDOR, filename_set):
- """ Create the wix default target directory layout and return the innermost
- directory.
-
- We assume that the XML tree delivered in the root argument already contains
- the Product tag.
-
- Everything is put under the PFiles directory property defined by WiX.
- After that a directory with the 'VENDOR' tag is placed and then a
- directory with the name of the project and its VERSION. This leads to the
- following TARGET Directory Layout:
- C:\<PFiles>\<Vendor>\<Projectname-Version>\
- Example: C:\Programme\Company\Product-1.2\
- """
- doc = Document()
- d1 = doc.createElement( 'Directory' )
- d1.attributes['Id'] = 'TARGETDIR'
- d1.attributes['Name'] = 'SourceDir'
-
- d2 = doc.createElement( 'Directory' )
- d2.attributes['Id'] = 'ProgramFilesFolder'
- d2.attributes['Name'] = 'PFiles'
-
- d3 = doc.createElement( 'Directory' )
- d3.attributes['Id'] = 'VENDOR_folder'
- d3.attributes['Name'] = escape( gen_dos_short_file_name( VENDOR, filename_set ) )
- d3.attributes['LongName'] = escape( VENDOR )
-
- d4 = doc.createElement( 'Directory' )
- project_folder = "%s-%s" % ( NAME, VERSION )
- d4.attributes['Id'] = 'MY_DEFAULT_FOLDER'
- d4.attributes['Name'] = escape( gen_dos_short_file_name( project_folder, filename_set ) )
- d4.attributes['LongName'] = escape( project_folder )
-
- d1.childNodes.append( d2 )
- d2.childNodes.append( d3 )
- d3.childNodes.append( d4 )
-
- root.getElementsByTagName('Product')[0].childNodes.append( d1 )
-
- return d4
-
-#
-# mandatory and optional file tags
-#
-def build_wxsfile_file_section(root, files, NAME, VERSION, VENDOR, filename_set, id_set):
- """ builds the Component sections of the wxs file with their included files.
-
- Files need to be specified in 8.3 format and in the long name format, long
- filenames will be converted automatically.
-
- Features are specficied with the 'X_MSI_FEATURE' or 'DOC' FileTag.
- """
- root = create_default_directory_layout( root, NAME, VERSION, VENDOR, filename_set )
- components = create_feature_dict( files )
- factory = Document()
-
- def get_directory( node, dir ):
- """ returns the node under the given node representing the directory.
-
- Returns the component node if dir is None or empty.
- """
- if dir == '' or not dir:
- return node
-
- Directory = node
- dir_parts = dir.split(os.path.sep)
-
- # to make sure that our directory ids are unique, the parent folders are
- # consecutively added to upper_dir
- upper_dir = ''
-
- # walk down the xml tree finding parts of the directory
- dir_parts = [d for d in dir_parts if d != '']
- for d in dir_parts[:]:
- already_created = [c for c in Directory.childNodes
- if c.nodeName == 'Directory'
- and c.attributes['LongName'].value == escape(d)]
-
- if already_created != []:
- Directory = already_created[0]
- dir_parts.remove(d)
- upper_dir += d
- else:
- break
-
- for d in dir_parts:
- nDirectory = factory.createElement( 'Directory' )
- nDirectory.attributes['LongName'] = escape( d )
- nDirectory.attributes['Name'] = escape( gen_dos_short_file_name( d, filename_set ) )
- upper_dir += d
- nDirectory.attributes['Id'] = convert_to_id( upper_dir, id_set )
-
- Directory.childNodes.append( nDirectory )
- Directory = nDirectory
-
- return Directory
-
- for file in files:
- drive, path = os.path.splitdrive( file.PACKAGING_INSTALL_LOCATION )
- filename = os.path.basename( path )
- dirname = os.path.dirname( path )
-
- h = {
- # tagname : default value
- 'PACKAGING_X_MSI_VITAL' : 'yes',
- 'PACKAGING_X_MSI_FILEID' : convert_to_id(filename, id_set),
- 'PACKAGING_X_MSI_LONGNAME' : filename,
- 'PACKAGING_X_MSI_SHORTNAME' : gen_dos_short_file_name(filename, filename_set),
- 'PACKAGING_X_MSI_SOURCE' : file.get_path(),
- }
-
- # fill in the default tags given above.
- for k,v in [ (k, v) for (k,v) in h.items() if not hasattr(file, k) ]:
- setattr( file, k, v )
-
- File = factory.createElement( 'File' )
- File.attributes['LongName'] = escape( file.PACKAGING_X_MSI_LONGNAME )
- File.attributes['Name'] = escape( file.PACKAGING_X_MSI_SHORTNAME )
- File.attributes['Source'] = escape( file.PACKAGING_X_MSI_SOURCE )
- File.attributes['Id'] = escape( file.PACKAGING_X_MSI_FILEID )
- File.attributes['Vital'] = escape( file.PACKAGING_X_MSI_VITAL )
-
- # create the <Component> Tag under which this file should appear
- Component = factory.createElement('Component')
- Component.attributes['DiskId'] = '1'
- Component.attributes['Id'] = convert_to_id( filename, id_set )
-
- # hang the component node under the root node and the file node
- # under the component node.
- Directory = get_directory( root, dirname )
- Directory.childNodes.append( Component )
- Component.childNodes.append( File )
-
-#
-# additional functions
-#
-def build_wxsfile_features_section(root, files, NAME, VERSION, SUMMARY, id_set):
- """ This function creates the <features> tag based on the supplied xml tree.
-
- This is achieved by finding all <component>s and adding them to a default target.
-
- It should be called after the tree has been built completly. We assume
- that a MY_DEFAULT_FOLDER Property is defined in the wxs file tree.
-
- Furthermore a top-level with the name and VERSION of the software will be created.
-
- An PACKAGING_X_MSI_FEATURE can either be a string, where the feature
- DESCRIPTION will be the same as its title or a Tuple, where the first
- part will be its title and the second its DESCRIPTION.
- """
- factory = Document()
- Feature = factory.createElement('Feature')
- Feature.attributes['Id'] = 'complete'
- Feature.attributes['ConfigurableDirectory'] = 'MY_DEFAULT_FOLDER'
- Feature.attributes['Level'] = '1'
- Feature.attributes['Title'] = escape( '%s %s' % (NAME, VERSION) )
- Feature.attributes['Description'] = escape( SUMMARY )
- Feature.attributes['Display'] = 'expand'
-
- for (feature, files) in create_feature_dict(files).items():
- SubFeature = factory.createElement('Feature')
- SubFeature.attributes['Level'] = '1'
-
- if SCons.Util.is_Tuple(feature):
- SubFeature.attributes['Id'] = convert_to_id( feature[0], id_set )
- SubFeature.attributes['Title'] = escape(feature[0])
- SubFeature.attributes['Description'] = escape(feature[1])
- else:
- SubFeature.attributes['Id'] = convert_to_id( feature, id_set )
- if feature=='default':
- SubFeature.attributes['Description'] = 'Main Part'
- SubFeature.attributes['Title'] = 'Main Part'
- elif feature=='PACKAGING_DOC':
- SubFeature.attributes['Description'] = 'Documentation'
- SubFeature.attributes['Title'] = 'Documentation'
- else:
- SubFeature.attributes['Description'] = escape(feature)
- SubFeature.attributes['Title'] = escape(feature)
-
- # build the componentrefs. As one of the design decision is that every
- # file is also a component we walk the list of files and create a
- # reference.
- for f in files:
- ComponentRef = factory.createElement('ComponentRef')
- ComponentRef.attributes['Id'] = convert_to_id( os.path.basename(f.get_path()), id_set )
- SubFeature.childNodes.append(ComponentRef)
-
- Feature.childNodes.append(SubFeature)
-
- root.getElementsByTagName('Product')[0].childNodes.append(Feature)
-
-def build_wxsfile_default_gui(root):
- """ this function adds a default GUI to the wxs file
- """
- factory = Document()
- Product = root.getElementsByTagName('Product')[0]
-
- UIRef = factory.createElement('UIRef')
- UIRef.attributes['Id'] = 'WixUI_Mondo'
- Product.childNodes.append(UIRef)
-
- UIRef = factory.createElement('UIRef')
- UIRef.attributes['Id'] = 'WixUI_ErrorProgressText'
- Product.childNodes.append(UIRef)
-
-def build_license_file(directory, spec):
- """ creates a License.rtf file with the content of "X_MSI_LICENSE_TEXT"
- in the given directory
- """
- name, text = '', ''
-
- try:
- name = spec['LICENSE']
- text = spec['X_MSI_LICENSE_TEXT']
- except KeyError:
- pass # ignore this as X_MSI_LICENSE_TEXT is optional
-
- if name!='' or text!='':
- file = open( os.path.join(directory.get_path(), 'License.rtf'), 'w' )
- file.write('{\\rtf')
- if text!='':
- file.write(text.replace('\n', '\\par '))
- else:
- file.write(name+'\\par\\par')
- file.write('}')
- file.close()
-
-#
-# mandatory and optional package tags
-#
-def build_wxsfile_header_section(root, spec):
- """ Adds the xml file node which define the package meta-data.
- """
- # Create the needed DOM nodes and add them at the correct position in the tree.
- factory = Document()
- Product = factory.createElement( 'Product' )
- Package = factory.createElement( 'Package' )
-
- root.childNodes.append( Product )
- Product.childNodes.append( Package )
-
- # set "mandatory" default values
- if 'X_MSI_LANGUAGE' not in spec:
- spec['X_MSI_LANGUAGE'] = '1033' # select english
-
- # mandatory sections, will throw a KeyError if the tag is not available
- Product.attributes['Name'] = escape( spec['NAME'] )
- Product.attributes['Version'] = escape( spec['VERSION'] )
- Product.attributes['Manufacturer'] = escape( spec['VENDOR'] )
- Product.attributes['Language'] = escape( spec['X_MSI_LANGUAGE'] )
- Package.attributes['Description'] = escape( spec['SUMMARY'] )
-
- # now the optional tags, for which we avoid the KeyErrror exception
- if 'DESCRIPTION' in spec:
- Package.attributes['Comments'] = escape( spec['DESCRIPTION'] )
-
- if 'X_MSI_UPGRADE_CODE' in spec:
- Package.attributes['X_MSI_UPGRADE_CODE'] = escape( spec['X_MSI_UPGRADE_CODE'] )
-
- # We hardcode the media tag as our current model cannot handle it.
- Media = factory.createElement('Media')
- Media.attributes['Id'] = '1'
- Media.attributes['Cabinet'] = 'default.cab'
- Media.attributes['EmbedCab'] = 'yes'
- root.getElementsByTagName('Product')[0].childNodes.append(Media)
-
-# this builder is the entry-point for .wxs file compiler.
-wxs_builder = Builder(
- action = Action( build_wxsfile, string_wxsfile ),
- ensure_suffix = '.wxs' )
-
-def package(env, target, source, PACKAGEROOT, NAME, VERSION,
- DESCRIPTION, SUMMARY, VENDOR, X_MSI_LANGUAGE, **kw):
- # make sure that the Wix Builder is in the environment
- SCons.Tool.Tool('wix').generate(env)
-
- # get put the keywords for the specfile compiler. These are the arguments
- # given to the package function and all optional ones stored in kw, minus
- # the the source, target and env one.
- loc = locals()
- del loc['kw']
- kw.update(loc)
- del kw['source'], kw['target'], kw['env']
-
- # strip the install builder from the source files
- target, source = stripinstallbuilder(target, source, env)
-
- # put the arguments into the env and call the specfile builder.
- env['msi_spec'] = kw
- specfile = wxs_builder(* [env, target, source], **kw)
-
- # now call the WiX Tool with the built specfile added as a source.
- msifile = env.WiX(target, specfile)
-
- # return the target and source tuple.
- return (msifile, source+[specfile])
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/packaging/rpm.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/packaging/rpm.py
deleted file mode 100644
index f7e2577..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/packaging/rpm.py
+++ /dev/null
@@ -1,358 +0,0 @@
-"""SCons.Tool.Packaging.rpm
-
-The rpm packager.
-"""
-
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-__revision__ = "src/engine/SCons/Tool/packaging/rpm.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-import os
-
-import SCons.Builder
-import SCons.Tool.rpmutils
-
-from SCons.Environment import OverrideEnvironment
-from SCons.Tool.packaging import stripinstallbuilder, src_targz
-from SCons.Errors import UserError
-
-def package(env, target, source, PACKAGEROOT, NAME, VERSION,
- PACKAGEVERSION, DESCRIPTION, SUMMARY, X_RPM_GROUP, LICENSE,
- **kw):
- # initialize the rpm tool
- SCons.Tool.Tool('rpm').generate(env)
-
- bld = env['BUILDERS']['Rpm']
-
- # Generate a UserError whenever the target name has been set explicitly,
- # since rpm does not allow for controlling it. This is detected by
- # checking if the target has been set to the default by the Package()
- # Environment function.
- if str(target[0])!="%s-%s"%(NAME, VERSION):
- raise UserError( "Setting target is not supported for rpm." )
- else:
- # This should be overridable from the construction environment,
- # which it is by using ARCHITECTURE=.
- buildarchitecture = SCons.Tool.rpmutils.defaultMachine()
-
- if 'ARCHITECTURE' in kw:
- buildarchitecture = kw['ARCHITECTURE']
-
- fmt = '%s-%s-%s.%s.rpm'
- srcrpm = fmt % (NAME, VERSION, PACKAGEVERSION, 'src')
- binrpm = fmt % (NAME, VERSION, PACKAGEVERSION, buildarchitecture)
-
- target = [ srcrpm, binrpm ]
-
- # get the correct arguments into the kw hash
- loc=locals()
- del loc['kw']
- kw.update(loc)
- del kw['source'], kw['target'], kw['env']
-
- # if no "SOURCE_URL" tag is given add a default one.
- if 'SOURCE_URL' not in kw:
- #kw['SOURCE_URL']=(str(target[0])+".tar.gz").replace('.rpm', '')
- kw['SOURCE_URL']=(str(target[0])+".tar.gz").replace('.rpm', '')
-
- # mangle the source and target list for the rpmbuild
- env = OverrideEnvironment(env, kw)
- target, source = stripinstallbuilder(target, source, env)
- target, source = addspecfile(target, source, env)
- target, source = collectintargz(target, source, env)
-
- # now call the rpm builder to actually build the packet.
- return bld(env, target, source, **kw)
-
-def collectintargz(target, source, env):
- """ Puts all source files into a tar.gz file. """
- # the rpm tool depends on a source package, until this is chagned
- # this hack needs to be here that tries to pack all sources in.
- sources = env.FindSourceFiles()
-
- # filter out the target we are building the source list for.
- #sources = [s for s in sources if not (s in target)]
- sources = [s for s in sources if s not in target]
-
- # find the .spec file for rpm and add it since it is not necessarily found
- # by the FindSourceFiles function.
- #sources.extend( [s for s in source if str(s).rfind('.spec')!=-1] )
- spec_file = lambda s: str(s).rfind('.spec') != -1
- sources.extend( list(filter(spec_file, source)) )
-
- # as the source contains the url of the source package this rpm package
- # is built from, we extract the target name
- #tarball = (str(target[0])+".tar.gz").replace('.rpm', '')
- tarball = (str(target[0])+".tar.gz").replace('.rpm', '')
- try:
- #tarball = env['SOURCE_URL'].split('/')[-1]
- tarball = env['SOURCE_URL'].split('/')[-1]
- except KeyError, e:
- raise SCons.Errors.UserError( "Missing PackageTag '%s' for RPM packager" % e.args[0] )
-
- tarball = src_targz.package(env, source=sources, target=tarball,
- PACKAGEROOT=env['PACKAGEROOT'], )
-
- return (target, tarball)
-
-def addspecfile(target, source, env):
- specfile = "%s-%s" % (env['NAME'], env['VERSION'])
-
- bld = SCons.Builder.Builder(action = build_specfile,
- suffix = '.spec',
- target_factory = SCons.Node.FS.File)
-
- source.extend(bld(env, specfile, source))
-
- return (target,source)
-
-def build_specfile(target, source, env):
- """ Builds a RPM specfile from a dictionary with string metadata and
- by analyzing a tree of nodes.
- """
- file = open(target[0].get_abspath(), 'w')
-
- try:
- file.write( build_specfile_header(env) )
- file.write( build_specfile_sections(env) )
- file.write( build_specfile_filesection(env, source) )
- file.close()
-
- # call a user specified function
- if 'CHANGE_SPECFILE' in env:
- env['CHANGE_SPECFILE'](target, source)
-
- except KeyError, e:
- raise SCons.Errors.UserError( '"%s" package field for RPM is missing.' % e.args[0] )
-
-
-#
-# mandatory and optional package tag section
-#
-def build_specfile_sections(spec):
- """ Builds the sections of a rpm specfile.
- """
- str = ""
-
- mandatory_sections = {
- 'DESCRIPTION' : '\n%%description\n%s\n\n', }
-
- str = str + SimpleTagCompiler(mandatory_sections).compile( spec )
-
- optional_sections = {
- 'DESCRIPTION_' : '%%description -l %s\n%s\n\n',
- 'CHANGELOG' : '%%changelog\n%s\n\n',
- 'X_RPM_PREINSTALL' : '%%pre\n%s\n\n',
- 'X_RPM_POSTINSTALL' : '%%post\n%s\n\n',
- 'X_RPM_PREUNINSTALL' : '%%preun\n%s\n\n',
- 'X_RPM_POSTUNINSTALL' : '%%postun\n%s\n\n',
- 'X_RPM_VERIFY' : '%%verify\n%s\n\n',
-
- # These are for internal use but could possibly be overriden
- 'X_RPM_PREP' : '%%prep\n%s\n\n',
- 'X_RPM_BUILD' : '%%build\n%s\n\n',
- 'X_RPM_INSTALL' : '%%install\n%s\n\n',
- 'X_RPM_CLEAN' : '%%clean\n%s\n\n',
- }
-
- # Default prep, build, install and clean rules
- # TODO: optimize those build steps, to not compile the project a second time
- if 'X_RPM_PREP' not in spec:
- spec['X_RPM_PREP'] = '[ -n "$RPM_BUILD_ROOT" -a "$RPM_BUILD_ROOT" != / ] && rm -rf "$RPM_BUILD_ROOT"' + '\n%setup -q'
-
- if 'X_RPM_BUILD' not in spec:
- spec['X_RPM_BUILD'] = '[ ! -e "$RPM_BUILD_ROOT" -a "$RPM_BUILD_ROOT" != / ] && mkdir "$RPM_BUILD_ROOT"'
-
- if 'X_RPM_INSTALL' not in spec:
- spec['X_RPM_INSTALL'] = 'scons --install-sandbox="$RPM_BUILD_ROOT" "$RPM_BUILD_ROOT"'
-
- if 'X_RPM_CLEAN' not in spec:
- spec['X_RPM_CLEAN'] = '[ -n "$RPM_BUILD_ROOT" -a "$RPM_BUILD_ROOT" != / ] && rm -rf "$RPM_BUILD_ROOT"'
-
- str = str + SimpleTagCompiler(optional_sections, mandatory=0).compile( spec )
-
- return str
-
-def build_specfile_header(spec):
- """ Builds all section but the %file of a rpm specfile
- """
- str = ""
-
- # first the mandatory sections
- mandatory_header_fields = {
- 'NAME' : '%%define name %s\nName: %%{name}\n',
- 'VERSION' : '%%define version %s\nVersion: %%{version}\n',
- 'PACKAGEVERSION' : '%%define release %s\nRelease: %%{release}\n',
- 'X_RPM_GROUP' : 'Group: %s\n',
- 'SUMMARY' : 'Summary: %s\n',
- 'LICENSE' : 'License: %s\n', }
-
- str = str + SimpleTagCompiler(mandatory_header_fields).compile( spec )
-
- # now the optional tags
- optional_header_fields = {
- 'VENDOR' : 'Vendor: %s\n',
- 'X_RPM_URL' : 'Url: %s\n',
- 'SOURCE_URL' : 'Source: %s\n',
- 'SUMMARY_' : 'Summary(%s): %s\n',
- 'X_RPM_DISTRIBUTION' : 'Distribution: %s\n',
- 'X_RPM_ICON' : 'Icon: %s\n',
- 'X_RPM_PACKAGER' : 'Packager: %s\n',
- 'X_RPM_GROUP_' : 'Group(%s): %s\n',
-
- 'X_RPM_REQUIRES' : 'Requires: %s\n',
- 'X_RPM_PROVIDES' : 'Provides: %s\n',
- 'X_RPM_CONFLICTS' : 'Conflicts: %s\n',
- 'X_RPM_BUILDREQUIRES' : 'BuildRequires: %s\n',
-
- 'X_RPM_SERIAL' : 'Serial: %s\n',
- 'X_RPM_EPOCH' : 'Epoch: %s\n',
- 'X_RPM_AUTOREQPROV' : 'AutoReqProv: %s\n',
- 'X_RPM_EXCLUDEARCH' : 'ExcludeArch: %s\n',
- 'X_RPM_EXCLUSIVEARCH' : 'ExclusiveArch: %s\n',
- 'X_RPM_PREFIX' : 'Prefix: %s\n',
- 'X_RPM_CONFLICTS' : 'Conflicts: %s\n',
-
- # internal use
- 'X_RPM_BUILDROOT' : 'BuildRoot: %s\n', }
-
- # fill in default values:
- # Adding a BuildRequires renders the .rpm unbuildable under System, which
- # are not managed by rpm, since the database to resolve this dependency is
- # missing (take Gentoo as an example)
-# if not s.has_key('x_rpm_BuildRequires'):
-# s['x_rpm_BuildRequires'] = 'scons'
-
- if 'X_RPM_BUILDROOT' not in spec:
- spec['X_RPM_BUILDROOT'] = '%{_tmppath}/%{name}-%{version}-%{release}'
-
- str = str + SimpleTagCompiler(optional_header_fields, mandatory=0).compile( spec )
- return str
-
-#
-# mandatory and optional file tags
-#
-def build_specfile_filesection(spec, files):
- """ builds the %file section of the specfile
- """
- str = '%files\n'
-
- if 'X_RPM_DEFATTR' not in spec:
- spec['X_RPM_DEFATTR'] = '(-,root,root)'
-
- str = str + '%%defattr %s\n' % spec['X_RPM_DEFATTR']
-
- supported_tags = {
- 'PACKAGING_CONFIG' : '%%config %s',
- 'PACKAGING_CONFIG_NOREPLACE' : '%%config(noreplace) %s',
- 'PACKAGING_DOC' : '%%doc %s',
- 'PACKAGING_UNIX_ATTR' : '%%attr %s',
- 'PACKAGING_LANG_' : '%%lang(%s) %s',
- 'PACKAGING_X_RPM_VERIFY' : '%%verify %s',
- 'PACKAGING_X_RPM_DIR' : '%%dir %s',
- 'PACKAGING_X_RPM_DOCDIR' : '%%docdir %s',
- 'PACKAGING_X_RPM_GHOST' : '%%ghost %s', }
-
- for file in files:
- # build the tagset
- tags = {}
- for k in supported_tags.keys():
- try:
- v = file.GetTag(k)
- if v:
- tags[k] = v
- except AttributeError:
- pass
-
- # compile the tagset
- str = str + SimpleTagCompiler(supported_tags, mandatory=0).compile( tags )
-
- str = str + ' '
- str = str + file.GetTag('PACKAGING_INSTALL_LOCATION')
- str = str + '\n\n'
-
- return str
-
-class SimpleTagCompiler(object):
- """ This class is a simple string substition utility:
- the replacement specfication is stored in the tagset dictionary, something
- like:
- { "abc" : "cdef %s ",
- "abc_" : "cdef %s %s" }
-
- the compile function gets a value dictionary, which may look like:
- { "abc" : "ghij",
- "abc_gh" : "ij" }
-
- The resulting string will be:
- "cdef ghij cdef gh ij"
- """
- def __init__(self, tagset, mandatory=1):
- self.tagset = tagset
- self.mandatory = mandatory
-
- def compile(self, values):
- """ compiles the tagset and returns a str containing the result
- """
- def is_international(tag):
- #return tag.endswith('_')
- return tag[-1:] == '_'
-
- def get_country_code(tag):
- return tag[-2:]
-
- def strip_country_code(tag):
- return tag[:-2]
-
- replacements = list(self.tagset.items())
-
- str = ""
- #domestic = [ (k,v) for k,v in replacements if not is_international(k) ]
- domestic = [t for t in replacements if not is_international(t[0])]
- for key, replacement in domestic:
- try:
- str = str + replacement % values[key]
- except KeyError, e:
- if self.mandatory:
- raise e
-
- #international = [ (k,v) for k,v in replacements if is_international(k) ]
- international = [t for t in replacements if is_international(t[0])]
- for key, replacement in international:
- try:
- #int_values_for_key = [ (get_country_code(k),v) for k,v in values.items() if strip_country_code(k) == key ]
- x = [t for t in values.items() if strip_country_code(t[0]) == key]
- int_values_for_key = [(get_country_code(t[0]),t[1]) for t in x]
- for v in int_values_for_key:
- str = str + replacement % v
- except KeyError, e:
- if self.mandatory:
- raise e
-
- return str
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/packaging/src_tarbz2.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/packaging/src_tarbz2.py
deleted file mode 100644
index 438fc20..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/packaging/src_tarbz2.py
+++ /dev/null
@@ -1,43 +0,0 @@
-"""SCons.Tool.Packaging.tarbz2
-
-The tarbz2 SRC packager.
-"""
-
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-
-__revision__ = "src/engine/SCons/Tool/packaging/src_tarbz2.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-from SCons.Tool.packaging import putintopackageroot
-
-def package(env, target, source, PACKAGEROOT, **kw):
- bld = env['BUILDERS']['Tar']
- bld.set_suffix('.tar.bz2')
- target, source = putintopackageroot(target, source, env, PACKAGEROOT, honor_install_location=0)
- return bld(env, target, source, TARFLAGS='-jc')
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/packaging/src_targz.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/packaging/src_targz.py
deleted file mode 100644
index 6a85869..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/packaging/src_targz.py
+++ /dev/null
@@ -1,43 +0,0 @@
-"""SCons.Tool.Packaging.targz
-
-The targz SRC packager.
-"""
-
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-
-__revision__ = "src/engine/SCons/Tool/packaging/src_targz.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-from SCons.Tool.packaging import putintopackageroot
-
-def package(env, target, source, PACKAGEROOT, **kw):
- bld = env['BUILDERS']['Tar']
- bld.set_suffix('.tar.gz')
- target, source = putintopackageroot(target, source, env, PACKAGEROOT, honor_install_location=0)
- return bld(env, target, source, TARFLAGS='-zc')
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/packaging/src_zip.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/packaging/src_zip.py
deleted file mode 100644
index e1a1d49..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/packaging/src_zip.py
+++ /dev/null
@@ -1,43 +0,0 @@
-"""SCons.Tool.Packaging.zip
-
-The zip SRC packager.
-"""
-
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-
-__revision__ = "src/engine/SCons/Tool/packaging/src_zip.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-from SCons.Tool.packaging import putintopackageroot
-
-def package(env, target, source, PACKAGEROOT, **kw):
- bld = env['BUILDERS']['Zip']
- bld.set_suffix('.zip')
- target, source = putintopackageroot(target, source, env, PACKAGEROOT, honor_install_location=0)
- return bld(env, target, source)
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/packaging/tarbz2.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/packaging/tarbz2.py
deleted file mode 100644
index 79f8219..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/packaging/tarbz2.py
+++ /dev/null
@@ -1,44 +0,0 @@
-"""SCons.Tool.Packaging.tarbz2
-
-The tarbz2 SRC packager.
-"""
-
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-
-__revision__ = "src/engine/SCons/Tool/packaging/tarbz2.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-from SCons.Tool.packaging import stripinstallbuilder, putintopackageroot
-
-def package(env, target, source, PACKAGEROOT, **kw):
- bld = env['BUILDERS']['Tar']
- bld.set_suffix('.tar.gz')
- target, source = putintopackageroot(target, source, env, PACKAGEROOT)
- target, source = stripinstallbuilder(target, source, env)
- return bld(env, target, source, TARFLAGS='-jc')
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/packaging/targz.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/packaging/targz.py
deleted file mode 100644
index eeb3d6a..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/packaging/targz.py
+++ /dev/null
@@ -1,44 +0,0 @@
-"""SCons.Tool.Packaging.targz
-
-The targz SRC packager.
-"""
-
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-
-__revision__ = "src/engine/SCons/Tool/packaging/targz.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-from SCons.Tool.packaging import stripinstallbuilder, putintopackageroot
-
-def package(env, target, source, PACKAGEROOT, **kw):
- bld = env['BUILDERS']['Tar']
- bld.set_suffix('.tar.gz')
- target, source = stripinstallbuilder(target, source, env)
- target, source = putintopackageroot(target, source, env, PACKAGEROOT)
- return bld(env, target, source, TARFLAGS='-zc')
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/packaging/zip.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/packaging/zip.py
deleted file mode 100644
index 6c4037d..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/packaging/zip.py
+++ /dev/null
@@ -1,44 +0,0 @@
-"""SCons.Tool.Packaging.zip
-
-The zip SRC packager.
-"""
-
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-
-__revision__ = "src/engine/SCons/Tool/packaging/zip.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-from SCons.Tool.packaging import stripinstallbuilder, putintopackageroot
-
-def package(env, target, source, PACKAGEROOT, **kw):
- bld = env['BUILDERS']['Zip']
- bld.set_suffix('.zip')
- target, source = stripinstallbuilder(target, source, env)
- target, source = putintopackageroot(target, source, env, PACKAGEROOT)
- return bld(env, target, source)
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/pdf.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/pdf.py
deleted file mode 100644
index 0ccb49b..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/pdf.py
+++ /dev/null
@@ -1,78 +0,0 @@
-"""SCons.Tool.pdf
-
-Common PDF Builder definition for various other Tool modules that use it.
-Add an explicit action to run epstopdf to convert .eps files to .pdf
-
-"""
-
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-
-__revision__ = "src/engine/SCons/Tool/pdf.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-import SCons.Builder
-import SCons.Tool
-
-PDFBuilder = None
-
-EpsPdfAction = SCons.Action.Action('$EPSTOPDFCOM', '$EPSTOPDFCOMSTR')
-
-def generate(env):
- try:
- env['BUILDERS']['PDF']
- except KeyError:
- global PDFBuilder
- if PDFBuilder is None:
- PDFBuilder = SCons.Builder.Builder(action = {},
- source_scanner = SCons.Tool.PDFLaTeXScanner,
- prefix = '$PDFPREFIX',
- suffix = '$PDFSUFFIX',
- emitter = {},
- source_ext_match = None,
- single_source=True)
- env['BUILDERS']['PDF'] = PDFBuilder
-
- env['PDFPREFIX'] = ''
- env['PDFSUFFIX'] = '.pdf'
-
-# put the epstopdf builder in this routine so we can add it after
-# the pdftex builder so that one is the default for no source suffix
-def generate2(env):
- bld = env['BUILDERS']['PDF']
- #bld.add_action('.ps', EpsPdfAction) # this is covered by direct Ghostcript action in gs.py
- bld.add_action('.eps', EpsPdfAction)
-
- env['EPSTOPDF'] = 'epstopdf'
- env['EPSTOPDFFLAGS'] = SCons.Util.CLVar('')
- env['EPSTOPDFCOM'] = '$EPSTOPDF $EPSTOPDFFLAGS ${SOURCE} --outfile=${TARGET}'
-
-def exists(env):
- # This only puts a skeleton Builder in place, so if someone
- # references this Tool directly, it's always "available."
- return 1
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/pdflatex.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/pdflatex.py
deleted file mode 100644
index 42188f4..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/pdflatex.py
+++ /dev/null
@@ -1,84 +0,0 @@
-"""SCons.Tool.pdflatex
-
-Tool-specific initialization for pdflatex.
-Generates .pdf files from .latex or .ltx files
-
-There normally shouldn't be any need to import this module directly.
-It will usually be imported through the generic SCons.Tool.Tool()
-selection method.
-
-"""
-
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-
-__revision__ = "src/engine/SCons/Tool/pdflatex.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-import SCons.Action
-import SCons.Util
-import SCons.Tool.pdf
-import SCons.Tool.tex
-
-PDFLaTeXAction = None
-
-def PDFLaTeXAuxFunction(target = None, source= None, env=None):
- result = SCons.Tool.tex.InternalLaTeXAuxAction( PDFLaTeXAction, target, source, env )
- if result != 0:
- SCons.Tool.tex.check_file_error_message(env['PDFLATEX'])
- return result
-
-PDFLaTeXAuxAction = None
-
-def generate(env):
- """Add Builders and construction variables for pdflatex to an Environment."""
- global PDFLaTeXAction
- if PDFLaTeXAction is None:
- PDFLaTeXAction = SCons.Action.Action('$PDFLATEXCOM', '$PDFLATEXCOMSTR')
-
- global PDFLaTeXAuxAction
- if PDFLaTeXAuxAction is None:
- PDFLaTeXAuxAction = SCons.Action.Action(PDFLaTeXAuxFunction,
- strfunction=SCons.Tool.tex.TeXLaTeXStrFunction)
-
- env.AppendUnique(LATEXSUFFIXES=SCons.Tool.LaTeXSuffixes)
-
- import pdf
- pdf.generate(env)
-
- bld = env['BUILDERS']['PDF']
- bld.add_action('.ltx', PDFLaTeXAuxAction)
- bld.add_action('.latex', PDFLaTeXAuxAction)
- bld.add_emitter('.ltx', SCons.Tool.tex.tex_pdf_emitter)
- bld.add_emitter('.latex', SCons.Tool.tex.tex_pdf_emitter)
-
- SCons.Tool.tex.generate_common(env)
-
-def exists(env):
- SCons.Tool.tex.generate_darwin(env)
- return env.Detect('pdflatex')
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/pdftex.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/pdftex.py
deleted file mode 100644
index e38a278..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/pdftex.py
+++ /dev/null
@@ -1,109 +0,0 @@
-"""SCons.Tool.pdftex
-
-Tool-specific initialization for pdftex.
-Generates .pdf files from .tex files
-
-There normally shouldn't be any need to import this module directly.
-It will usually be imported through the generic SCons.Tool.Tool()
-selection method.
-
-"""
-
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-
-__revision__ = "src/engine/SCons/Tool/pdftex.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-import os
-import SCons.Action
-import SCons.Util
-import SCons.Tool.tex
-
-PDFTeXAction = None
-
-# This action might be needed more than once if we are dealing with
-# labels and bibtex.
-PDFLaTeXAction = None
-
-def PDFLaTeXAuxAction(target = None, source= None, env=None):
- result = SCons.Tool.tex.InternalLaTeXAuxAction( PDFLaTeXAction, target, source, env )
- return result
-
-def PDFTeXLaTeXFunction(target = None, source= None, env=None):
- """A builder for TeX and LaTeX that scans the source file to
- decide the "flavor" of the source and then executes the appropriate
- program."""
- basedir = os.path.split(str(source[0]))[0]
- abspath = os.path.abspath(basedir)
-
- if SCons.Tool.tex.is_LaTeX(source,env,abspath):
- result = PDFLaTeXAuxAction(target,source,env)
- if result != 0:
- SCons.Tool.tex.check_file_error_message(env['PDFLATEX'])
- else:
- result = PDFTeXAction(target,source,env)
- if result != 0:
- SCons.Tool.tex.check_file_error_message(env['PDFTEX'])
- return result
-
-PDFTeXLaTeXAction = None
-
-def generate(env):
- """Add Builders and construction variables for pdftex to an Environment."""
- global PDFTeXAction
- if PDFTeXAction is None:
- PDFTeXAction = SCons.Action.Action('$PDFTEXCOM', '$PDFTEXCOMSTR')
-
- global PDFLaTeXAction
- if PDFLaTeXAction is None:
- PDFLaTeXAction = SCons.Action.Action("$PDFLATEXCOM", "$PDFLATEXCOMSTR")
-
- global PDFTeXLaTeXAction
- if PDFTeXLaTeXAction is None:
- PDFTeXLaTeXAction = SCons.Action.Action(PDFTeXLaTeXFunction,
- strfunction=SCons.Tool.tex.TeXLaTeXStrFunction)
-
- env.AppendUnique(LATEXSUFFIXES=SCons.Tool.LaTeXSuffixes)
-
- import pdf
- pdf.generate(env)
-
- bld = env['BUILDERS']['PDF']
- bld.add_action('.tex', PDFTeXLaTeXAction)
- bld.add_emitter('.tex', SCons.Tool.tex.tex_pdf_emitter)
-
- # Add the epstopdf builder after the pdftex builder
- # so pdftex is the default for no source suffix
- pdf.generate2(env)
-
- SCons.Tool.tex.generate_common(env)
-
-def exists(env):
- SCons.Tool.tex.generate_darwin(env)
- return env.Detect('pdftex')
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/qt.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/qt.py
deleted file mode 100644
index b8233c0..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/qt.py
+++ /dev/null
@@ -1,336 +0,0 @@
-
-"""SCons.Tool.qt
-
-Tool-specific initialization for Qt.
-
-There normally shouldn't be any need to import this module directly.
-It will usually be imported through the generic SCons.Tool.Tool()
-selection method.
-
-"""
-
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-
-__revision__ = "src/engine/SCons/Tool/qt.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-import os.path
-import re
-
-import SCons.Action
-import SCons.Builder
-import SCons.Defaults
-import SCons.Scanner
-import SCons.Tool
-import SCons.Util
-
-class ToolQtWarning(SCons.Warnings.Warning):
- pass
-
-class GeneratedMocFileNotIncluded(ToolQtWarning):
- pass
-
-class QtdirNotFound(ToolQtWarning):
- pass
-
-SCons.Warnings.enableWarningClass(ToolQtWarning)
-
-header_extensions = [".h", ".hxx", ".hpp", ".hh"]
-if SCons.Util.case_sensitive_suffixes('.h', '.H'):
- header_extensions.append('.H')
-cplusplus = __import__('c++', globals(), locals(), [])
-cxx_suffixes = cplusplus.CXXSuffixes
-
-def checkMocIncluded(target, source, env):
- moc = target[0]
- cpp = source[0]
- # looks like cpp.includes is cleared before the build stage :-(
- # not really sure about the path transformations (moc.cwd? cpp.cwd?) :-/
- path = SCons.Defaults.CScan.path(env, moc.cwd)
- includes = SCons.Defaults.CScan(cpp, env, path)
- if not moc in includes:
- SCons.Warnings.warn(
- GeneratedMocFileNotIncluded,
- "Generated moc file '%s' is not included by '%s'" %
- (str(moc), str(cpp)))
-
-def find_file(filename, paths, node_factory):
- for dir in paths:
- node = node_factory(filename, dir)
- if node.rexists():
- return node
- return None
-
-class _Automoc(object):
- """
- Callable class, which works as an emitter for Programs, SharedLibraries and
- StaticLibraries.
- """
-
- def __init__(self, objBuilderName):
- self.objBuilderName = objBuilderName
-
- def __call__(self, target, source, env):
- """
- Smart autoscan function. Gets the list of objects for the Program
- or Lib. Adds objects and builders for the special qt files.
- """
- try:
- if int(env.subst('$QT_AUTOSCAN')) == 0:
- return target, source
- except ValueError:
- pass
- try:
- debug = int(env.subst('$QT_DEBUG'))
- except ValueError:
- debug = 0
-
- # some shortcuts used in the scanner
- splitext = SCons.Util.splitext
- objBuilder = getattr(env, self.objBuilderName)
-
- # some regular expressions:
- # Q_OBJECT detection
- q_object_search = re.compile(r'[^A-Za-z0-9]Q_OBJECT[^A-Za-z0-9]')
- # cxx and c comment 'eater'
- #comment = re.compile(r'(//.*)|(/\*(([^*])|(\*[^/]))*\*/)')
- # CW: something must be wrong with the regexp. See also bug #998222
- # CURRENTLY THERE IS NO TEST CASE FOR THAT
-
- # The following is kind of hacky to get builders working properly (FIXME)
- objBuilderEnv = objBuilder.env
- objBuilder.env = env
- mocBuilderEnv = env.Moc.env
- env.Moc.env = env
-
- # make a deep copy for the result; MocH objects will be appended
- out_sources = source[:]
-
- for obj in source:
- if not obj.has_builder():
- # binary obj file provided
- if debug:
- print "scons: qt: '%s' seems to be a binary. Discarded." % str(obj)
- continue
- cpp = obj.sources[0]
- if not splitext(str(cpp))[1] in cxx_suffixes:
- if debug:
- print "scons: qt: '%s' is no cxx file. Discarded." % str(cpp)
- # c or fortran source
- continue
- #cpp_contents = comment.sub('', cpp.get_text_contents())
- cpp_contents = cpp.get_text_contents()
- h=None
- for h_ext in header_extensions:
- # try to find the header file in the corresponding source
- # directory
- hname = splitext(cpp.name)[0] + h_ext
- h = find_file(hname, (cpp.get_dir(),), env.File)
- if h:
- if debug:
- print "scons: qt: Scanning '%s' (header of '%s')" % (str(h), str(cpp))
- #h_contents = comment.sub('', h.get_text_contents())
- h_contents = h.get_text_contents()
- break
- if not h and debug:
- print "scons: qt: no header for '%s'." % (str(cpp))
- if h and q_object_search.search(h_contents):
- # h file with the Q_OBJECT macro found -> add moc_cpp
- moc_cpp = env.Moc(h)
- moc_o = objBuilder(moc_cpp)
- out_sources.append(moc_o)
- #moc_cpp.target_scanner = SCons.Defaults.CScan
- if debug:
- print "scons: qt: found Q_OBJECT macro in '%s', moc'ing to '%s'" % (str(h), str(moc_cpp))
- if cpp and q_object_search.search(cpp_contents):
- # cpp file with Q_OBJECT macro found -> add moc
- # (to be included in cpp)
- moc = env.Moc(cpp)
- env.Ignore(moc, moc)
- if debug:
- print "scons: qt: found Q_OBJECT macro in '%s', moc'ing to '%s'" % (str(cpp), str(moc))
- #moc.source_scanner = SCons.Defaults.CScan
- # restore the original env attributes (FIXME)
- objBuilder.env = objBuilderEnv
- env.Moc.env = mocBuilderEnv
-
- return (target, out_sources)
-
-AutomocShared = _Automoc('SharedObject')
-AutomocStatic = _Automoc('StaticObject')
-
-def _detect(env):
- """Not really safe, but fast method to detect the QT library"""
- QTDIR = None
- if not QTDIR:
- QTDIR = env.get('QTDIR',None)
- if not QTDIR:
- QTDIR = os.environ.get('QTDIR',None)
- if not QTDIR:
- moc = env.WhereIs('moc')
- if moc:
- QTDIR = os.path.dirname(os.path.dirname(moc))
- SCons.Warnings.warn(
- QtdirNotFound,
- "Could not detect qt, using moc executable as a hint (QTDIR=%s)" % QTDIR)
- else:
- QTDIR = None
- SCons.Warnings.warn(
- QtdirNotFound,
- "Could not detect qt, using empty QTDIR")
- return QTDIR
-
-def uicEmitter(target, source, env):
- adjustixes = SCons.Util.adjustixes
- bs = SCons.Util.splitext(str(source[0].name))[0]
- bs = os.path.join(str(target[0].get_dir()),bs)
- # first target (header) is automatically added by builder
- if len(target) < 2:
- # second target is implementation
- target.append(adjustixes(bs,
- env.subst('$QT_UICIMPLPREFIX'),
- env.subst('$QT_UICIMPLSUFFIX')))
- if len(target) < 3:
- # third target is moc file
- target.append(adjustixes(bs,
- env.subst('$QT_MOCHPREFIX'),
- env.subst('$QT_MOCHSUFFIX')))
- return target, source
-
-def uicScannerFunc(node, env, path):
- lookout = []
- lookout.extend(env['CPPPATH'])
- lookout.append(str(node.rfile().dir))
- includes = re.findall("<include.*?>(.*?)</include>", node.get_text_contents())
- result = []
- for incFile in includes:
- dep = env.FindFile(incFile,lookout)
- if dep:
- result.append(dep)
- return result
-
-uicScanner = SCons.Scanner.Base(uicScannerFunc,
- name = "UicScanner",
- node_class = SCons.Node.FS.File,
- node_factory = SCons.Node.FS.File,
- recursive = 0)
-
-def generate(env):
- """Add Builders and construction variables for qt to an Environment."""
- CLVar = SCons.Util.CLVar
- Action = SCons.Action.Action
- Builder = SCons.Builder.Builder
-
- env.SetDefault(QTDIR = _detect(env),
- QT_BINPATH = os.path.join('$QTDIR', 'bin'),
- QT_CPPPATH = os.path.join('$QTDIR', 'include'),
- QT_LIBPATH = os.path.join('$QTDIR', 'lib'),
- QT_MOC = os.path.join('$QT_BINPATH','moc'),
- QT_UIC = os.path.join('$QT_BINPATH','uic'),
- QT_LIB = 'qt', # may be set to qt-mt
-
- QT_AUTOSCAN = 1, # scan for moc'able sources
-
- # Some QT specific flags. I don't expect someone wants to
- # manipulate those ...
- QT_UICIMPLFLAGS = CLVar(''),
- QT_UICDECLFLAGS = CLVar(''),
- QT_MOCFROMHFLAGS = CLVar(''),
- QT_MOCFROMCXXFLAGS = CLVar('-i'),
-
- # suffixes/prefixes for the headers / sources to generate
- QT_UICDECLPREFIX = '',
- QT_UICDECLSUFFIX = '.h',
- QT_UICIMPLPREFIX = 'uic_',
- QT_UICIMPLSUFFIX = '$CXXFILESUFFIX',
- QT_MOCHPREFIX = 'moc_',
- QT_MOCHSUFFIX = '$CXXFILESUFFIX',
- QT_MOCCXXPREFIX = '',
- QT_MOCCXXSUFFIX = '.moc',
- QT_UISUFFIX = '.ui',
-
- # Commands for the qt support ...
- # command to generate header, implementation and moc-file
- # from a .ui file
- QT_UICCOM = [
- CLVar('$QT_UIC $QT_UICDECLFLAGS -o ${TARGETS[0]} $SOURCE'),
- CLVar('$QT_UIC $QT_UICIMPLFLAGS -impl ${TARGETS[0].file} '
- '-o ${TARGETS[1]} $SOURCE'),
- CLVar('$QT_MOC $QT_MOCFROMHFLAGS -o ${TARGETS[2]} ${TARGETS[0]}')],
- # command to generate meta object information for a class
- # declarated in a header
- QT_MOCFROMHCOM = (
- '$QT_MOC $QT_MOCFROMHFLAGS -o ${TARGETS[0]} $SOURCE'),
- # command to generate meta object information for a class
- # declarated in a cpp file
- QT_MOCFROMCXXCOM = [
- CLVar('$QT_MOC $QT_MOCFROMCXXFLAGS -o ${TARGETS[0]} $SOURCE'),
- Action(checkMocIncluded,None)])
-
- # ... and the corresponding builders
- uicBld = Builder(action=SCons.Action.Action('$QT_UICCOM', '$QT_UICCOMSTR'),
- emitter=uicEmitter,
- src_suffix='$QT_UISUFFIX',
- suffix='$QT_UICDECLSUFFIX',
- prefix='$QT_UICDECLPREFIX',
- source_scanner=uicScanner)
- mocBld = Builder(action={}, prefix={}, suffix={})
- for h in header_extensions:
- act = SCons.Action.Action('$QT_MOCFROMHCOM', '$QT_MOCFROMHCOMSTR')
- mocBld.add_action(h, act)
- mocBld.prefix[h] = '$QT_MOCHPREFIX'
- mocBld.suffix[h] = '$QT_MOCHSUFFIX'
- for cxx in cxx_suffixes:
- act = SCons.Action.Action('$QT_MOCFROMCXXCOM', '$QT_MOCFROMCXXCOMSTR')
- mocBld.add_action(cxx, act)
- mocBld.prefix[cxx] = '$QT_MOCCXXPREFIX'
- mocBld.suffix[cxx] = '$QT_MOCCXXSUFFIX'
-
- # register the builders
- env['BUILDERS']['Uic'] = uicBld
- env['BUILDERS']['Moc'] = mocBld
- static_obj, shared_obj = SCons.Tool.createObjBuilders(env)
- static_obj.add_src_builder('Uic')
- shared_obj.add_src_builder('Uic')
-
- # We use the emitters of Program / StaticLibrary / SharedLibrary
- # to scan for moc'able files
- # We can't refer to the builders directly, we have to fetch them
- # as Environment attributes because that sets them up to be called
- # correctly later by our emitter.
- env.AppendUnique(PROGEMITTER =[AutomocStatic],
- SHLIBEMITTER=[AutomocShared],
- LIBEMITTER =[AutomocStatic],
- # Of course, we need to link against the qt libraries
- CPPPATH=["$QT_CPPPATH"],
- LIBPATH=["$QT_LIBPATH"],
- LIBS=['$QT_LIB'])
-
-def exists(env):
- return _detect(env)
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/rmic.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/rmic.py
deleted file mode 100644
index 6045b7f..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/rmic.py
+++ /dev/null
@@ -1,126 +0,0 @@
-"""SCons.Tool.rmic
-
-Tool-specific initialization for rmic.
-
-There normally shouldn't be any need to import this module directly.
-It will usually be imported through the generic SCons.Tool.Tool()
-selection method.
-
-"""
-
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-
-__revision__ = "src/engine/SCons/Tool/rmic.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-import os.path
-
-import SCons.Action
-import SCons.Builder
-import SCons.Node.FS
-import SCons.Util
-
-def emit_rmic_classes(target, source, env):
- """Create and return lists of Java RMI stub and skeleton
- class files to be created from a set of class files.
- """
- class_suffix = env.get('JAVACLASSSUFFIX', '.class')
- classdir = env.get('JAVACLASSDIR')
-
- if not classdir:
- try:
- s = source[0]
- except IndexError:
- classdir = '.'
- else:
- try:
- classdir = s.attributes.java_classdir
- except AttributeError:
- classdir = '.'
- classdir = env.Dir(classdir).rdir()
- if str(classdir) == '.':
- c_ = None
- else:
- c_ = str(classdir) + os.sep
-
- slist = []
- for src in source:
- try:
- classname = src.attributes.java_classname
- except AttributeError:
- classname = str(src)
- if c_ and classname[:len(c_)] == c_:
- classname = classname[len(c_):]
- if class_suffix and classname[:-len(class_suffix)] == class_suffix:
- classname = classname[-len(class_suffix):]
- s = src.rfile()
- s.attributes.java_classdir = classdir
- s.attributes.java_classname = classname
- slist.append(s)
-
- stub_suffixes = ['_Stub']
- if env.get('JAVAVERSION') == '1.4':
- stub_suffixes.append('_Skel')
-
- tlist = []
- for s in source:
- for suff in stub_suffixes:
- fname = s.attributes.java_classname.replace('.', os.sep) + \
- suff + class_suffix
- t = target[0].File(fname)
- t.attributes.java_lookupdir = target[0]
- tlist.append(t)
-
- return tlist, source
-
-RMICAction = SCons.Action.Action('$RMICCOM', '$RMICCOMSTR')
-
-RMICBuilder = SCons.Builder.Builder(action = RMICAction,
- emitter = emit_rmic_classes,
- src_suffix = '$JAVACLASSSUFFIX',
- target_factory = SCons.Node.FS.Dir,
- source_factory = SCons.Node.FS.File)
-
-def generate(env):
- """Add Builders and construction variables for rmic to an Environment."""
- env['BUILDERS']['RMIC'] = RMICBuilder
-
- env['RMIC'] = 'rmic'
- env['RMICFLAGS'] = SCons.Util.CLVar('')
- env['RMICCOM'] = '$RMIC $RMICFLAGS -d ${TARGET.attributes.java_lookupdir} -classpath ${SOURCE.attributes.java_classdir} ${SOURCES.attributes.java_classname}'
- env['JAVACLASSSUFFIX'] = '.class'
-
-def exists(env):
- # As reported by Jan Nijtmans in issue #2730, the simple
- # return env.Detect('rmic')
- # doesn't always work during initialization. For now, we
- # stop trying to detect an executable (analogous to the
- # javac Builder).
- # TODO: Come up with a proper detect() routine...and enable it.
- return 1
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/rpcgen.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/rpcgen.py
deleted file mode 100644
index 1a3de76..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/rpcgen.py
+++ /dev/null
@@ -1,70 +0,0 @@
-"""SCons.Tool.rpcgen
-
-Tool-specific initialization for RPCGEN tools.
-
-Three normally shouldn't be any need to import this module directly.
-It will usually be imported through the generic SCons.Tool.Tool()
-selection method.
-"""
-
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-
-__revision__ = "src/engine/SCons/Tool/rpcgen.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-from SCons.Builder import Builder
-import SCons.Util
-
-cmd = "cd ${SOURCE.dir} && $RPCGEN -%s $RPCGENFLAGS %s -o ${TARGET.abspath} ${SOURCE.file}"
-
-rpcgen_client = cmd % ('l', '$RPCGENCLIENTFLAGS')
-rpcgen_header = cmd % ('h', '$RPCGENHEADERFLAGS')
-rpcgen_service = cmd % ('m', '$RPCGENSERVICEFLAGS')
-rpcgen_xdr = cmd % ('c', '$RPCGENXDRFLAGS')
-
-def generate(env):
- "Add RPCGEN Builders and construction variables for an Environment."
-
- client = Builder(action=rpcgen_client, suffix='_clnt.c', src_suffix='.x')
- header = Builder(action=rpcgen_header, suffix='.h', src_suffix='.x')
- service = Builder(action=rpcgen_service, suffix='_svc.c', src_suffix='.x')
- xdr = Builder(action=rpcgen_xdr, suffix='_xdr.c', src_suffix='.x')
- env.Append(BUILDERS={'RPCGenClient' : client,
- 'RPCGenHeader' : header,
- 'RPCGenService' : service,
- 'RPCGenXDR' : xdr})
- env['RPCGEN'] = 'rpcgen'
- env['RPCGENFLAGS'] = SCons.Util.CLVar('')
- env['RPCGENCLIENTFLAGS'] = SCons.Util.CLVar('')
- env['RPCGENHEADERFLAGS'] = SCons.Util.CLVar('')
- env['RPCGENSERVICEFLAGS'] = SCons.Util.CLVar('')
- env['RPCGENXDRFLAGS'] = SCons.Util.CLVar('')
-
-def exists(env):
- return env.Detect('rpcgen')
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/rpm.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/rpm.py
deleted file mode 100644
index 46b3112..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/rpm.py
+++ /dev/null
@@ -1,132 +0,0 @@
-"""SCons.Tool.rpm
-
-Tool-specific initialization for rpm.
-
-There normally shouldn't be any need to import this module directly.
-It will usually be imported through the generic SCons.Tool.Tool()
-selection method.
-
-The rpm tool calls the rpmbuild command. The first and only argument should a
-tar.gz consisting of the source file and a specfile.
-"""
-
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-
-__revision__ = "src/engine/SCons/Tool/rpm.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-import os
-import re
-import shutil
-import subprocess
-
-import SCons.Builder
-import SCons.Node.FS
-import SCons.Util
-import SCons.Action
-import SCons.Defaults
-
-def get_cmd(source, env):
- tar_file_with_included_specfile = source
- if SCons.Util.is_List(source):
- tar_file_with_included_specfile = source[0]
- return "%s %s %s"%(env['RPM'], env['RPMFLAGS'],
- tar_file_with_included_specfile.get_abspath() )
-
-def build_rpm(target, source, env):
- # create a temporary rpm build root.
- tmpdir = os.path.join( os.path.dirname( target[0].get_abspath() ), 'rpmtemp' )
- if os.path.exists(tmpdir):
- shutil.rmtree(tmpdir)
-
- # now create the mandatory rpm directory structure.
- for d in ['RPMS', 'SRPMS', 'SPECS', 'BUILD']:
- os.makedirs( os.path.join( tmpdir, d ) )
-
- # set the topdir as an rpmflag.
- env.Prepend( RPMFLAGS = '--define \'_topdir %s\'' % tmpdir )
-
- # now call rpmbuild to create the rpm package.
- handle = subprocess.Popen(get_cmd(source, env),
- stdout=subprocess.PIPE,
- stderr=subprocess.STDOUT,
- shell=True)
- output = handle.stdout.read()
- status = handle.wait()
-
- if status:
- raise SCons.Errors.BuildError( node=target[0],
- errstr=output,
- filename=str(target[0]) )
- else:
- # XXX: assume that LC_ALL=C is set while running rpmbuild
- output_files = re.compile( 'Wrote: (.*)' ).findall( output )
-
- for output, input in zip( output_files, target ):
- rpm_output = os.path.basename(output)
- expected = os.path.basename(input.get_path())
-
- assert expected == rpm_output, "got %s but expected %s" % (rpm_output, expected)
- shutil.copy( output, input.get_abspath() )
-
-
- # cleanup before leaving.
- shutil.rmtree(tmpdir)
-
- return status
-
-def string_rpm(target, source, env):
- try:
- return env['RPMCOMSTR']
- except KeyError:
- return get_cmd(source, env)
-
-rpmAction = SCons.Action.Action(build_rpm, string_rpm)
-
-RpmBuilder = SCons.Builder.Builder(action = SCons.Action.Action('$RPMCOM', '$RPMCOMSTR'),
- source_scanner = SCons.Defaults.DirScanner,
- suffix = '$RPMSUFFIX')
-
-
-
-def generate(env):
- """Add Builders and construction variables for rpm to an Environment."""
- try:
- bld = env['BUILDERS']['Rpm']
- except KeyError:
- bld = RpmBuilder
- env['BUILDERS']['Rpm'] = bld
-
- env.SetDefault(RPM = 'LC_ALL=C rpmbuild')
- env.SetDefault(RPMFLAGS = SCons.Util.CLVar('-ta'))
- env.SetDefault(RPMCOM = rpmAction)
- env.SetDefault(RPMSUFFIX = '.rpm')
-
-def exists(env):
- return env.Detect('rpmbuild')
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/rpmutils.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/rpmutils.py
deleted file mode 100644
index 10b5560..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/rpmutils.py
+++ /dev/null
@@ -1,543 +0,0 @@
-"""SCons.Tool.rpmutils.py
-
-RPM specific helper routines for general usage in the test framework
-and SCons core modules.
-
-Since we check for the RPM package target name in several places,
-we have to know which machine/system name RPM will use for the current
-hardware setup. The following dictionaries and functions try to
-mimic the exact naming rules of the RPM source code.
-They were directly derived from the file "rpmrc.in" of the version
-rpm-4.9.1.3. For updating to a more recent version of RPM, this Python
-script can be used standalone. The usage() function below shows the
-exact syntax.
-
-"""
-
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-__revision__ = "src/engine/SCons/Tool/rpmutils.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-
-import platform
-import subprocess
-
-# Start of rpmrc dictionaries (Marker, don't change or remove!)
-os_canon = {
- 'AIX' : ['AIX','5'],
- 'AmigaOS' : ['AmigaOS','5'],
- 'BSD_OS' : ['bsdi','12'],
- 'CYGWIN32_95' : ['cygwin32','15'],
- 'CYGWIN32_NT' : ['cygwin32','14'],
- 'Darwin' : ['darwin','21'],
- 'FreeBSD' : ['FreeBSD','8'],
- 'HP-UX' : ['hpux10','6'],
- 'IRIX' : ['Irix','2'],
- 'IRIX64' : ['Irix64','10'],
- 'Linux' : ['Linux','1'],
- 'Linux/390' : ['OS/390','20'],
- 'Linux/ESA' : ['VM/ESA','20'],
- 'MacOSX' : ['macosx','21'],
- 'MiNT' : ['FreeMiNT','17'],
- 'NEXTSTEP' : ['NextStep','11'],
- 'OS/390' : ['OS/390','18'],
- 'OSF1' : ['osf1','7'],
- 'SCO_SV' : ['SCO_SV3.2v5.0.2','9'],
- 'SunOS4' : ['SunOS','4'],
- 'SunOS5' : ['solaris','3'],
- 'UNIX_SV' : ['MP_RAS','16'],
- 'VM/ESA' : ['VM/ESA','19'],
- 'machten' : ['machten','13'],
- 'osf3.2' : ['osf1','7'],
- 'osf4.0' : ['osf1','7'],
-}
-
-buildarch_compat = {
- 'alpha' : ['noarch'],
- 'alphaev5' : ['alpha'],
- 'alphaev56' : ['alphaev5'],
- 'alphaev6' : ['alphapca56'],
- 'alphaev67' : ['alphaev6'],
- 'alphapca56' : ['alphaev56'],
- 'amd64' : ['x86_64'],
- 'armv3l' : ['noarch'],
- 'armv4b' : ['noarch'],
- 'armv4l' : ['armv3l'],
- 'armv4tl' : ['armv4l'],
- 'armv5tejl' : ['armv5tel'],
- 'armv5tel' : ['armv4tl'],
- 'armv6l' : ['armv5tejl'],
- 'armv7l' : ['armv6l'],
- 'atariclone' : ['m68kmint','noarch'],
- 'atarist' : ['m68kmint','noarch'],
- 'atariste' : ['m68kmint','noarch'],
- 'ataritt' : ['m68kmint','noarch'],
- 'athlon' : ['i686'],
- 'falcon' : ['m68kmint','noarch'],
- 'geode' : ['i586'],
- 'hades' : ['m68kmint','noarch'],
- 'hppa1.0' : ['parisc'],
- 'hppa1.1' : ['hppa1.0'],
- 'hppa1.2' : ['hppa1.1'],
- 'hppa2.0' : ['hppa1.2'],
- 'i386' : ['noarch','fat'],
- 'i486' : ['i386'],
- 'i586' : ['i486'],
- 'i686' : ['i586'],
- 'ia32e' : ['x86_64'],
- 'ia64' : ['noarch'],
- 'm68k' : ['noarch'],
- 'milan' : ['m68kmint','noarch'],
- 'mips' : ['noarch'],
- 'mipsel' : ['noarch'],
- 'parisc' : ['noarch'],
- 'pentium3' : ['i686'],
- 'pentium4' : ['pentium3'],
- 'ppc' : ['noarch','fat'],
- 'ppc32dy4' : ['noarch'],
- 'ppc64' : ['noarch','fat'],
- 'ppc64iseries' : ['ppc64'],
- 'ppc64pseries' : ['ppc64'],
- 'ppc8260' : ['noarch'],
- 'ppc8560' : ['noarch'],
- 'ppciseries' : ['noarch'],
- 'ppcpseries' : ['noarch'],
- 's390' : ['noarch'],
- 's390x' : ['noarch'],
- 'sh3' : ['noarch'],
- 'sh4' : ['noarch'],
- 'sh4a' : ['sh4'],
- 'sparc' : ['noarch'],
- 'sparc64' : ['sparcv9v'],
- 'sparc64v' : ['sparc64'],
- 'sparcv8' : ['sparc'],
- 'sparcv9' : ['sparcv8'],
- 'sparcv9v' : ['sparcv9'],
- 'sun4c' : ['noarch'],
- 'sun4d' : ['noarch'],
- 'sun4m' : ['noarch'],
- 'sun4u' : ['noarch'],
- 'x86_64' : ['noarch'],
-}
-
-os_compat = {
- 'BSD_OS' : ['bsdi'],
- 'Darwin' : ['MacOSX'],
- 'FreeMiNT' : ['mint','MiNT','TOS'],
- 'IRIX64' : ['IRIX'],
- 'MiNT' : ['FreeMiNT','mint','TOS'],
- 'TOS' : ['FreeMiNT','MiNT','mint'],
- 'bsdi4.0' : ['bsdi'],
- 'hpux10.00' : ['hpux9.07'],
- 'hpux10.01' : ['hpux10.00'],
- 'hpux10.10' : ['hpux10.01'],
- 'hpux10.20' : ['hpux10.10'],
- 'hpux10.30' : ['hpux10.20'],
- 'hpux11.00' : ['hpux10.30'],
- 'hpux9.05' : ['hpux9.04'],
- 'hpux9.07' : ['hpux9.05'],
- 'mint' : ['FreeMiNT','MiNT','TOS'],
- 'ncr-sysv4.3' : ['ncr-sysv4.2'],
- 'osf4.0' : ['osf3.2','osf1'],
- 'solaris2.4' : ['solaris2.3'],
- 'solaris2.5' : ['solaris2.3','solaris2.4'],
- 'solaris2.6' : ['solaris2.3','solaris2.4','solaris2.5'],
- 'solaris2.7' : ['solaris2.3','solaris2.4','solaris2.5','solaris2.6'],
-}
-
-arch_compat = {
- 'alpha' : ['axp','noarch'],
- 'alphaev5' : ['alpha'],
- 'alphaev56' : ['alphaev5'],
- 'alphaev6' : ['alphapca56'],
- 'alphaev67' : ['alphaev6'],
- 'alphapca56' : ['alphaev56'],
- 'amd64' : ['x86_64','athlon','noarch'],
- 'armv3l' : ['noarch'],
- 'armv4b' : ['noarch'],
- 'armv4l' : ['armv3l'],
- 'armv4tl' : ['armv4l'],
- 'armv5tejl' : ['armv5tel'],
- 'armv5tel' : ['armv4tl'],
- 'armv6l' : ['armv5tejl'],
- 'armv7l' : ['armv6l'],
- 'atariclone' : ['m68kmint','noarch'],
- 'atarist' : ['m68kmint','noarch'],
- 'atariste' : ['m68kmint','noarch'],
- 'ataritt' : ['m68kmint','noarch'],
- 'athlon' : ['i686'],
- 'falcon' : ['m68kmint','noarch'],
- 'geode' : ['i586'],
- 'hades' : ['m68kmint','noarch'],
- 'hppa1.0' : ['parisc'],
- 'hppa1.1' : ['hppa1.0'],
- 'hppa1.2' : ['hppa1.1'],
- 'hppa2.0' : ['hppa1.2'],
- 'i370' : ['noarch'],
- 'i386' : ['noarch','fat'],
- 'i486' : ['i386'],
- 'i586' : ['i486'],
- 'i686' : ['i586'],
- 'ia32e' : ['x86_64','athlon','noarch'],
- 'ia64' : ['noarch'],
- 'milan' : ['m68kmint','noarch'],
- 'mips' : ['noarch'],
- 'mipsel' : ['noarch'],
- 'osfmach3_i386' : ['i486'],
- 'osfmach3_i486' : ['i486','osfmach3_i386'],
- 'osfmach3_i586' : ['i586','osfmach3_i486'],
- 'osfmach3_i686' : ['i686','osfmach3_i586'],
- 'osfmach3_ppc' : ['ppc'],
- 'parisc' : ['noarch'],
- 'pentium3' : ['i686'],
- 'pentium4' : ['pentium3'],
- 'powerpc' : ['ppc'],
- 'powerppc' : ['ppc'],
- 'ppc' : ['rs6000'],
- 'ppc32dy4' : ['ppc'],
- 'ppc64' : ['ppc'],
- 'ppc64iseries' : ['ppc64'],
- 'ppc64pseries' : ['ppc64'],
- 'ppc8260' : ['ppc'],
- 'ppc8560' : ['ppc'],
- 'ppciseries' : ['ppc'],
- 'ppcpseries' : ['ppc'],
- 'rs6000' : ['noarch','fat'],
- 's390' : ['noarch'],
- 's390x' : ['s390','noarch'],
- 'sh3' : ['noarch'],
- 'sh4' : ['noarch'],
- 'sh4a' : ['sh4'],
- 'sparc' : ['noarch'],
- 'sparc64' : ['sparcv9'],
- 'sparc64v' : ['sparc64'],
- 'sparcv8' : ['sparc'],
- 'sparcv9' : ['sparcv8'],
- 'sparcv9v' : ['sparcv9'],
- 'sun4c' : ['sparc'],
- 'sun4d' : ['sparc'],
- 'sun4m' : ['sparc'],
- 'sun4u' : ['sparc64'],
- 'x86_64' : ['amd64','athlon','noarch'],
-}
-
-buildarchtranslate = {
- 'alphaev5' : ['alpha'],
- 'alphaev56' : ['alpha'],
- 'alphaev6' : ['alpha'],
- 'alphaev67' : ['alpha'],
- 'alphapca56' : ['alpha'],
- 'amd64' : ['x86_64'],
- 'armv3l' : ['armv3l'],
- 'armv4b' : ['armv4b'],
- 'armv4l' : ['armv4l'],
- 'armv4tl' : ['armv4tl'],
- 'armv5tejl' : ['armv5tejl'],
- 'armv5tel' : ['armv5tel'],
- 'armv6l' : ['armv6l'],
- 'armv7l' : ['armv7l'],
- 'atariclone' : ['m68kmint'],
- 'atarist' : ['m68kmint'],
- 'atariste' : ['m68kmint'],
- 'ataritt' : ['m68kmint'],
- 'athlon' : ['i386'],
- 'falcon' : ['m68kmint'],
- 'geode' : ['i386'],
- 'hades' : ['m68kmint'],
- 'i386' : ['i386'],
- 'i486' : ['i386'],
- 'i586' : ['i386'],
- 'i686' : ['i386'],
- 'ia32e' : ['x86_64'],
- 'ia64' : ['ia64'],
- 'milan' : ['m68kmint'],
- 'osfmach3_i386' : ['i386'],
- 'osfmach3_i486' : ['i386'],
- 'osfmach3_i586' : ['i386'],
- 'osfmach3_i686' : ['i386'],
- 'osfmach3_ppc' : ['ppc'],
- 'pentium3' : ['i386'],
- 'pentium4' : ['i386'],
- 'powerpc' : ['ppc'],
- 'powerppc' : ['ppc'],
- 'ppc32dy4' : ['ppc'],
- 'ppc64iseries' : ['ppc64'],
- 'ppc64pseries' : ['ppc64'],
- 'ppc8260' : ['ppc'],
- 'ppc8560' : ['ppc'],
- 'ppciseries' : ['ppc'],
- 'ppcpseries' : ['ppc'],
- 's390' : ['s390'],
- 's390x' : ['s390x'],
- 'sh3' : ['sh3'],
- 'sh4' : ['sh4'],
- 'sh4a' : ['sh4'],
- 'sparc64v' : ['sparc64'],
- 'sparcv8' : ['sparc'],
- 'sparcv9' : ['sparc'],
- 'sparcv9v' : ['sparc'],
- 'sun4c' : ['sparc'],
- 'sun4d' : ['sparc'],
- 'sun4m' : ['sparc'],
- 'sun4u' : ['sparc64'],
- 'x86_64' : ['x86_64'],
-}
-
-optflags = {
- 'alpha' : ['-O2','-g','-mieee'],
- 'alphaev5' : ['-O2','-g','-mieee','-mtune=ev5'],
- 'alphaev56' : ['-O2','-g','-mieee','-mtune=ev56'],
- 'alphaev6' : ['-O2','-g','-mieee','-mtune=ev6'],
- 'alphaev67' : ['-O2','-g','-mieee','-mtune=ev67'],
- 'alphapca56' : ['-O2','-g','-mieee','-mtune=pca56'],
- 'amd64' : ['-O2','-g'],
- 'armv3l' : ['-O2','-g','-march=armv3'],
- 'armv4b' : ['-O2','-g','-march=armv4'],
- 'armv4l' : ['-O2','-g','-march=armv4'],
- 'armv4tl' : ['-O2','-g','-march=armv4t'],
- 'armv5tejl' : ['-O2','-g','-march=armv5te'],
- 'armv5tel' : ['-O2','-g','-march=armv5te'],
- 'armv6l' : ['-O2','-g','-march=armv6'],
- 'armv7l' : ['-O2','-g','-march=armv7'],
- 'atariclone' : ['-O2','-g','-fomit-frame-pointer'],
- 'atarist' : ['-O2','-g','-fomit-frame-pointer'],
- 'atariste' : ['-O2','-g','-fomit-frame-pointer'],
- 'ataritt' : ['-O2','-g','-fomit-frame-pointer'],
- 'athlon' : ['-O2','-g','-march=athlon'],
- 'falcon' : ['-O2','-g','-fomit-frame-pointer'],
- 'fat' : ['-O2','-g','-arch','i386','-arch','ppc'],
- 'geode' : ['-Os','-g','-m32','-march=geode'],
- 'hades' : ['-O2','-g','-fomit-frame-pointer'],
- 'hppa1.0' : ['-O2','-g','-mpa-risc-1-0'],
- 'hppa1.1' : ['-O2','-g','-mpa-risc-1-0'],
- 'hppa1.2' : ['-O2','-g','-mpa-risc-1-0'],
- 'hppa2.0' : ['-O2','-g','-mpa-risc-1-0'],
- 'i386' : ['-O2','-g','-march=i386','-mtune=i686'],
- 'i486' : ['-O2','-g','-march=i486'],
- 'i586' : ['-O2','-g','-march=i586'],
- 'i686' : ['-O2','-g','-march=i686'],
- 'ia32e' : ['-O2','-g'],
- 'ia64' : ['-O2','-g'],
- 'm68k' : ['-O2','-g','-fomit-frame-pointer'],
- 'milan' : ['-O2','-g','-fomit-frame-pointer'],
- 'mips' : ['-O2','-g'],
- 'mipsel' : ['-O2','-g'],
- 'parisc' : ['-O2','-g','-mpa-risc-1-0'],
- 'pentium3' : ['-O2','-g','-march=pentium3'],
- 'pentium4' : ['-O2','-g','-march=pentium4'],
- 'ppc' : ['-O2','-g','-fsigned-char'],
- 'ppc32dy4' : ['-O2','-g','-fsigned-char'],
- 'ppc64' : ['-O2','-g','-fsigned-char'],
- 'ppc8260' : ['-O2','-g','-fsigned-char'],
- 'ppc8560' : ['-O2','-g','-fsigned-char'],
- 'ppciseries' : ['-O2','-g','-fsigned-char'],
- 'ppcpseries' : ['-O2','-g','-fsigned-char'],
- 's390' : ['-O2','-g'],
- 's390x' : ['-O2','-g'],
- 'sh3' : ['-O2','-g'],
- 'sh4' : ['-O2','-g','-mieee'],
- 'sh4a' : ['-O2','-g','-mieee'],
- 'sparc' : ['-O2','-g','-m32','-mtune=ultrasparc'],
- 'sparc64' : ['-O2','-g','-m64','-mtune=ultrasparc'],
- 'sparc64v' : ['-O2','-g','-m64','-mtune=niagara'],
- 'sparcv8' : ['-O2','-g','-m32','-mtune=ultrasparc','-mv8'],
- 'sparcv9' : ['-O2','-g','-m32','-mtune=ultrasparc'],
- 'sparcv9v' : ['-O2','-g','-m32','-mtune=niagara'],
- 'x86_64' : ['-O2','-g'],
-}
-
-arch_canon = {
- 'IP' : ['sgi','7'],
- 'alpha' : ['alpha','2'],
- 'alphaev5' : ['alphaev5','2'],
- 'alphaev56' : ['alphaev56','2'],
- 'alphaev6' : ['alphaev6','2'],
- 'alphaev67' : ['alphaev67','2'],
- 'alphapca56' : ['alphapca56','2'],
- 'amd64' : ['amd64','1'],
- 'armv3l' : ['armv3l','12'],
- 'armv4b' : ['armv4b','12'],
- 'armv4l' : ['armv4l','12'],
- 'armv5tejl' : ['armv5tejl','12'],
- 'armv5tel' : ['armv5tel','12'],
- 'armv6l' : ['armv6l','12'],
- 'armv7l' : ['armv7l','12'],
- 'atariclone' : ['m68kmint','13'],
- 'atarist' : ['m68kmint','13'],
- 'atariste' : ['m68kmint','13'],
- 'ataritt' : ['m68kmint','13'],
- 'athlon' : ['athlon','1'],
- 'falcon' : ['m68kmint','13'],
- 'geode' : ['geode','1'],
- 'hades' : ['m68kmint','13'],
- 'i370' : ['i370','14'],
- 'i386' : ['i386','1'],
- 'i486' : ['i486','1'],
- 'i586' : ['i586','1'],
- 'i686' : ['i686','1'],
- 'ia32e' : ['ia32e','1'],
- 'ia64' : ['ia64','9'],
- 'm68k' : ['m68k','6'],
- 'm68kmint' : ['m68kmint','13'],
- 'milan' : ['m68kmint','13'],
- 'mips' : ['mips','4'],
- 'mipsel' : ['mipsel','11'],
- 'pentium3' : ['pentium3','1'],
- 'pentium4' : ['pentium4','1'],
- 'ppc' : ['ppc','5'],
- 'ppc32dy4' : ['ppc32dy4','5'],
- 'ppc64' : ['ppc64','16'],
- 'ppc64iseries' : ['ppc64iseries','16'],
- 'ppc64pseries' : ['ppc64pseries','16'],
- 'ppc8260' : ['ppc8260','5'],
- 'ppc8560' : ['ppc8560','5'],
- 'ppciseries' : ['ppciseries','5'],
- 'ppcpseries' : ['ppcpseries','5'],
- 'rs6000' : ['rs6000','8'],
- 's390' : ['s390','14'],
- 's390x' : ['s390x','15'],
- 'sh' : ['sh','17'],
- 'sh3' : ['sh3','17'],
- 'sh4' : ['sh4','17'],
- 'sh4a' : ['sh4a','17'],
- 'sparc' : ['sparc','3'],
- 'sparc64' : ['sparc64','2'],
- 'sparc64v' : ['sparc64v','2'],
- 'sparcv8' : ['sparcv8','3'],
- 'sparcv9' : ['sparcv9','3'],
- 'sparcv9v' : ['sparcv9v','3'],
- 'sun4' : ['sparc','3'],
- 'sun4c' : ['sparc','3'],
- 'sun4d' : ['sparc','3'],
- 'sun4m' : ['sparc','3'],
- 'sun4u' : ['sparc64','2'],
- 'x86_64' : ['x86_64','1'],
- 'xtensa' : ['xtensa','18'],
-}
-
-# End of rpmrc dictionaries (Marker, don't change or remove!)
-
-def defaultMachine(use_rpm_default=True):
- """ Return the canonicalized machine name. """
-
- if use_rpm_default:
- try:
- # This should be the most reliable way to get the default arch
- rmachine = subprocess.check_output(['rpm', '--eval=%_target_cpu'], shell=False).rstrip()
- except Exception as e:
- # Something went wrong, try again by looking up platform.machine()
- return defaultMachine(False)
- else:
- rmachine = platform.machine()
-
- # Try to lookup the string in the canon table
- if rmachine in arch_canon:
- rmachine = arch_canon[rmachine][0]
-
- return rmachine
-
-def defaultSystem():
- """ Return the canonicalized system name. """
- rsystem = platform.system()
-
- # Try to lookup the string in the canon tables
- if rsystem in os_canon:
- rsystem = os_canon[rsystem][0]
-
- return rsystem
-
-def defaultNames():
- """ Return the canonicalized machine and system name. """
- return defaultMachine(), defaultSystem()
-
-def updateRpmDicts(rpmrc, pyfile):
- """ Read the given rpmrc file with RPM definitions and update the
- info dictionaries in the file pyfile with it.
- The arguments will usually be 'rpmrc.in' from a recent RPM source
- tree, and 'rpmutils.py' referring to this script itself.
- See also usage() below.
- """
- try:
- # Read old rpmutils.py file
- oldpy = open(pyfile,"r").readlines()
- # Read current rpmrc.in file
- rpm = open(rpmrc,"r").readlines()
- # Parse for data
- data = {}
- # Allowed section names that get parsed
- sections = ['optflags',
- 'arch_canon',
- 'os_canon',
- 'buildarchtranslate',
- 'arch_compat',
- 'os_compat',
- 'buildarch_compat']
- for l in rpm:
- l = l.rstrip('\n').replace(':',' ')
- # Skip comments
- if l.lstrip().startswith('#'):
- continue
- tokens = l.strip().split()
- if len(tokens):
- key = tokens[0]
- if key in sections:
- # Have we met this section before?
- if not data.has_key(tokens[0]):
- # No, so insert it
- data[key] = {}
- # Insert data
- data[key][tokens[1]] = tokens[2:]
- # Write new rpmutils.py file
- out = open(pyfile,"w")
- pm = 0
- for l in oldpy:
- if pm:
- if l.startswith('# End of rpmrc dictionaries'):
- pm = 0
- out.write(l)
- else:
- out.write(l)
- if l.startswith('# Start of rpmrc dictionaries'):
- pm = 1
- # Write data sections to single dictionaries
- for key, entries in data.iteritems():
- out.write("%s = {\n" % key)
- for arch in sorted(entries.keys()):
- out.write(" '%s' : ['%s'],\n" % (arch, "','".join(entries[arch])))
- out.write("}\n\n")
- out.close()
- except:
- pass
-
-def usage():
- print "rpmutils.py rpmrc.in rpmutils.py"
-
-def main():
- import sys
-
- if len(sys.argv) < 3:
- usage()
- sys.exit(0)
- updateRpmDicts(sys.argv[1], sys.argv[2])
-
-if __name__ == "__main__":
- main()
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/sgiar.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/sgiar.py
deleted file mode 100644
index 6be4c65..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/sgiar.py
+++ /dev/null
@@ -1,68 +0,0 @@
-"""SCons.Tool.sgiar
-
-Tool-specific initialization for SGI ar (library archive). If CC
-exists, static libraries should be built with it, so the prelinker has
-a chance to resolve C++ template instantiations.
-
-There normally shouldn't be any need to import this module directly.
-It will usually be imported through the generic SCons.Tool.Tool()
-selection method.
-
-"""
-
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-
-__revision__ = "src/engine/SCons/Tool/sgiar.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-import SCons.Defaults
-import SCons.Tool
-import SCons.Util
-
-def generate(env):
- """Add Builders and construction variables for ar to an Environment."""
- SCons.Tool.createStaticLibBuilder(env)
-
- if env.Detect('CC'):
- env['AR'] = 'CC'
- env['ARFLAGS'] = SCons.Util.CLVar('-ar')
- env['ARCOM'] = '$AR $ARFLAGS -o $TARGET $SOURCES'
- else:
- env['AR'] = 'ar'
- env['ARFLAGS'] = SCons.Util.CLVar('r')
- env['ARCOM'] = '$AR $ARFLAGS $TARGET $SOURCES'
-
- env['SHLINK'] = '$LINK'
- env['SHLINKFLAGS'] = SCons.Util.CLVar('$LINKFLAGS -shared')
- env['SHLINKCOM'] = '$SHLINK $SHLINKFLAGS -o $TARGET $SOURCES $_LIBDIRFLAGS $_LIBFLAGS'
- env['LIBPREFIX'] = 'lib'
- env['LIBSUFFIX'] = '.a'
-
-def exists(env):
- return env.Detect('CC') or env.Detect('ar')
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/sgic++.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/sgic++.py
deleted file mode 100644
index 8ae115a..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/sgic++.py
+++ /dev/null
@@ -1,58 +0,0 @@
-"""SCons.Tool.sgic++
-
-Tool-specific initialization for MIPSpro C++ on SGI.
-
-There normally shouldn't be any need to import this module directly.
-It will usually be imported through the generic SCons.Tool.Tool()
-selection method.
-
-"""
-
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-
-__revision__ = "src/engine/SCons/Tool/sgic++.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-import SCons.Util
-
-cplusplus = __import__('c++', globals(), locals(), [])
-
-def generate(env):
- """Add Builders and construction variables for SGI MIPS C++ to an Environment."""
-
- cplusplus.generate(env)
-
- env['CXX'] = 'CC'
- env['CXXFLAGS'] = SCons.Util.CLVar('-LANG:std')
- env['SHCXX'] = '$CXX'
- env['SHOBJSUFFIX'] = '.o'
- env['STATIC_AND_SHARED_OBJECTS_ARE_THE_SAME'] = 1
-
-def exists(env):
- return env.Detect('CC')
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/sgicc.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/sgicc.py
deleted file mode 100644
index ec26bf1..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/sgicc.py
+++ /dev/null
@@ -1,53 +0,0 @@
-"""SCons.Tool.sgicc
-
-Tool-specific initialization for MIPSPro cc on SGI.
-
-There normally shouldn't be any need to import this module directly.
-It will usually be imported through the generic SCons.Tool.Tool()
-selection method.
-
-"""
-
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-
-__revision__ = "src/engine/SCons/Tool/sgicc.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-import cc
-
-def generate(env):
- """Add Builders and construction variables for gcc to an Environment."""
- cc.generate(env)
-
- env['CXX'] = 'CC'
- env['SHOBJSUFFIX'] = '.o'
- env['STATIC_AND_SHARED_OBJECTS_ARE_THE_SAME'] = 1
-
-def exists(env):
- return env.Detect('cc')
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/sgilink.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/sgilink.py
deleted file mode 100644
index 828f6d0..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/sgilink.py
+++ /dev/null
@@ -1,62 +0,0 @@
-"""SCons.Tool.sgilink
-
-Tool-specific initialization for the SGI MIPSPro linker on SGI.
-
-There normally shouldn't be any need to import this module directly.
-It will usually be imported through the generic SCons.Tool.Tool()
-selection method.
-
-"""
-
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-
-__revision__ = "src/engine/SCons/Tool/sgilink.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-import SCons.Util
-
-import link
-
-linkers = ['CC', 'cc']
-
-def generate(env):
- """Add Builders and construction variables for MIPSPro to an Environment."""
- link.generate(env)
-
- env['LINK'] = env.Detect(linkers) or 'cc'
- env['SHLINKFLAGS'] = SCons.Util.CLVar('$LINKFLAGS -shared')
-
- # __RPATH is set to $_RPATH in the platform specification if that
- # platform supports it.
- env['RPATHPREFIX'] = '-rpath '
- env['RPATHSUFFIX'] = ''
- env['_RPATH'] = '${_concat(RPATHPREFIX, RPATH, RPATHSUFFIX, __env__)}'
-
-def exists(env):
- return env.Detect(linkers)
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/sunar.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/sunar.py
deleted file mode 100644
index 9c3e481..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/sunar.py
+++ /dev/null
@@ -1,67 +0,0 @@
-"""engine.SCons.Tool.sunar
-
-Tool-specific initialization for Solaris (Forte) ar (library archive). If CC
-exists, static libraries should be built with it, so that template
-instantians can be resolved.
-
-There normally shouldn't be any need to import this module directly.
-It will usually be imported through the generic SCons.Tool.Tool()
-selection method.
-"""
-
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-
-__revision__ = "src/engine/SCons/Tool/sunar.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-import SCons.Defaults
-import SCons.Tool
-import SCons.Util
-
-def generate(env):
- """Add Builders and construction variables for ar to an Environment."""
- SCons.Tool.createStaticLibBuilder(env)
-
- if env.Detect('CC'):
- env['AR'] = 'CC'
- env['ARFLAGS'] = SCons.Util.CLVar('-xar')
- env['ARCOM'] = '$AR $ARFLAGS -o $TARGET $SOURCES'
- else:
- env['AR'] = 'ar'
- env['ARFLAGS'] = SCons.Util.CLVar('r')
- env['ARCOM'] = '$AR $ARFLAGS $TARGET $SOURCES'
-
- env['SHLINK'] = '$LINK'
- env['SHLINKFLAGS'] = SCons.Util.CLVar('$LINKFLAGS -G')
- env['SHLINKCOM'] = '$SHLINK $SHLINKFLAGS -o $TARGET $SOURCES $_LIBDIRFLAGS $_LIBFLAGS'
- env['LIBPREFIX'] = 'lib'
- env['LIBSUFFIX'] = '.a'
-
-def exists(env):
- return env.Detect('CC') or env.Detect('ar')
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/sunc++.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/sunc++.py
deleted file mode 100644
index 75fe435..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/sunc++.py
+++ /dev/null
@@ -1,142 +0,0 @@
-"""SCons.Tool.sunc++
-
-Tool-specific initialization for C++ on SunOS / Solaris.
-
-There normally shouldn't be any need to import this module directly.
-It will usually be imported through the generic SCons.Tool.Tool()
-selection method.
-
-"""
-
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-
-__revision__ = "src/engine/SCons/Tool/sunc++.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-import SCons
-
-import os
-import re
-import subprocess
-
-cplusplus = __import__('c++', globals(), locals(), [])
-
-package_info = {}
-
-def get_package_info(package_name, pkginfo, pkgchk):
- try:
- return package_info[package_name]
- except KeyError:
- version = None
- pathname = None
- try:
- sadm_contents = open('/var/sadm/install/contents', 'r').read()
- except EnvironmentError:
- pass
- else:
- sadm_re = re.compile('^(\S*/bin/CC)(=\S*)? %s$' % package_name, re.M)
- sadm_match = sadm_re.search(sadm_contents)
- if sadm_match:
- pathname = os.path.dirname(sadm_match.group(1))
-
- try:
- p = subprocess.Popen([pkginfo, '-l', package_name],
- stdout=subprocess.PIPE,
- stderr=open('/dev/null', 'w'))
- except EnvironmentError:
- pass
- else:
- pkginfo_contents = p.communicate()[0]
- version_re = re.compile('^ *VERSION:\s*(.*)$', re.M)
- version_match = version_re.search(pkginfo_contents)
- if version_match:
- version = version_match.group(1)
-
- if pathname is None:
- try:
- p = subprocess.Popen([pkgchk, '-l', package_name],
- stdout=subprocess.PIPE,
- stderr=open('/dev/null', 'w'))
- except EnvironmentError:
- pass
- else:
- pkgchk_contents = p.communicate()[0]
- pathname_re = re.compile(r'^Pathname:\s*(.*/bin/CC)$', re.M)
- pathname_match = pathname_re.search(pkgchk_contents)
- if pathname_match:
- pathname = os.path.dirname(pathname_match.group(1))
-
- package_info[package_name] = (pathname, version)
- return package_info[package_name]
-
-# use the package installer tool lslpp to figure out where cppc and what
-# version of it is installed
-def get_cppc(env):
- cxx = env.subst('$CXX')
- if cxx:
- cppcPath = os.path.dirname(cxx)
- else:
- cppcPath = None
-
- cppcVersion = None
-
- pkginfo = env.subst('$PKGINFO')
- pkgchk = env.subst('$PKGCHK')
-
- for package in ['SPROcpl']:
- path, version = get_package_info(package, pkginfo, pkgchk)
- if path and version:
- cppcPath, cppcVersion = path, version
- break
-
- return (cppcPath, 'CC', 'CC', cppcVersion)
-
-def generate(env):
- """Add Builders and construction variables for SunPRO C++."""
- path, cxx, shcxx, version = get_cppc(env)
- if path:
- cxx = os.path.join(path, cxx)
- shcxx = os.path.join(path, shcxx)
-
- cplusplus.generate(env)
-
- env['CXX'] = cxx
- env['SHCXX'] = shcxx
- env['CXXVERSION'] = version
- env['SHCXXFLAGS'] = SCons.Util.CLVar('$CXXFLAGS -KPIC')
- env['SHOBJPREFIX'] = 'so_'
- env['SHOBJSUFFIX'] = '.o'
-
-def exists(env):
- path, cxx, shcxx, version = get_cppc(env)
- if path and cxx:
- cppc = os.path.join(path, cxx)
- if os.path.exists(cppc):
- return cppc
- return None
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/suncc.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/suncc.py
deleted file mode 100644
index b543b95..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/suncc.py
+++ /dev/null
@@ -1,58 +0,0 @@
-"""SCons.Tool.suncc
-
-Tool-specific initialization for Sun Solaris (Forte) CC and cc.
-
-There normally shouldn't be any need to import this module directly.
-It will usually be imported through the generic SCons.Tool.Tool()
-selection method.
-"""
-
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-
-__revision__ = "src/engine/SCons/Tool/suncc.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-import SCons.Util
-
-import cc
-
-def generate(env):
- """
- Add Builders and construction variables for Forte C and C++ compilers
- to an Environment.
- """
- cc.generate(env)
-
- env['CXX'] = 'CC'
- env['SHCCFLAGS'] = SCons.Util.CLVar('$CCFLAGS -KPIC')
- env['SHOBJPREFIX'] = 'so_'
- env['SHOBJSUFFIX'] = '.o'
-
-def exists(env):
- return env.Detect('CC')
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/sunf77.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/sunf77.py
deleted file mode 100644
index bff5c1a..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/sunf77.py
+++ /dev/null
@@ -1,63 +0,0 @@
-"""SCons.Tool.sunf77
-
-Tool-specific initialization for sunf77, the Sun Studio F77 compiler.
-
-There normally shouldn't be any need to import this module directly.
-It will usually be imported through the generic SCons.Tool.Tool()
-selection method.
-
-"""
-
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-
-__revision__ = "src/engine/SCons/Tool/sunf77.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-import SCons.Util
-
-from FortranCommon import add_all_to_env
-
-compilers = ['sunf77', 'f77']
-
-def generate(env):
- """Add Builders and construction variables for sunf77 to an Environment."""
- add_all_to_env(env)
-
- fcomp = env.Detect(compilers) or 'f77'
- env['FORTRAN'] = fcomp
- env['F77'] = fcomp
-
- env['SHFORTRAN'] = '$FORTRAN'
- env['SHF77'] = '$F77'
-
- env['SHFORTRANFLAGS'] = SCons.Util.CLVar('$FORTRANFLAGS -KPIC')
- env['SHF77FLAGS'] = SCons.Util.CLVar('$F77FLAGS -KPIC')
-
-def exists(env):
- return env.Detect(compilers)
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/sunf90.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/sunf90.py
deleted file mode 100644
index b0e31d1..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/sunf90.py
+++ /dev/null
@@ -1,64 +0,0 @@
-"""SCons.Tool.sunf90
-
-Tool-specific initialization for sunf90, the Sun Studio F90 compiler.
-
-There normally shouldn't be any need to import this module directly.
-It will usually be imported through the generic SCons.Tool.Tool()
-selection method.
-
-"""
-
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-
-__revision__ = "src/engine/SCons/Tool/sunf90.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-import SCons.Util
-
-from FortranCommon import add_all_to_env
-
-compilers = ['sunf90', 'f90']
-
-def generate(env):
- """Add Builders and construction variables for sun f90 compiler to an
- Environment."""
- add_all_to_env(env)
-
- fcomp = env.Detect(compilers) or 'f90'
- env['FORTRAN'] = fcomp
- env['F90'] = fcomp
-
- env['SHFORTRAN'] = '$FORTRAN'
- env['SHF90'] = '$F90'
-
- env['SHFORTRANFLAGS'] = SCons.Util.CLVar('$FORTRANFLAGS -KPIC')
- env['SHF90FLAGS'] = SCons.Util.CLVar('$F90FLAGS -KPIC')
-
-def exists(env):
- return env.Detect(compilers)
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/sunf95.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/sunf95.py
deleted file mode 100644
index 5263f5a..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/sunf95.py
+++ /dev/null
@@ -1,64 +0,0 @@
-"""SCons.Tool.sunf95
-
-Tool-specific initialization for sunf95, the Sun Studio F95 compiler.
-
-There normally shouldn't be any need to import this module directly.
-It will usually be imported through the generic SCons.Tool.Tool()
-selection method.
-
-"""
-
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-
-__revision__ = "src/engine/SCons/Tool/sunf95.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-import SCons.Util
-
-from FortranCommon import add_all_to_env
-
-compilers = ['sunf95', 'f95']
-
-def generate(env):
- """Add Builders and construction variables for sunf95 to an
- Environment."""
- add_all_to_env(env)
-
- fcomp = env.Detect(compilers) or 'f95'
- env['FORTRAN'] = fcomp
- env['F95'] = fcomp
-
- env['SHFORTRAN'] = '$FORTRAN'
- env['SHF95'] = '$F95'
-
- env['SHFORTRANFLAGS'] = SCons.Util.CLVar('$FORTRANFLAGS -KPIC')
- env['SHF95FLAGS'] = SCons.Util.CLVar('$F95FLAGS -KPIC')
-
-def exists(env):
- return env.Detect(compilers)
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/sunlink.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/sunlink.py
deleted file mode 100644
index d8a941f..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/sunlink.py
+++ /dev/null
@@ -1,76 +0,0 @@
-"""SCons.Tool.sunlink
-
-Tool-specific initialization for the Sun Solaris (Forte) linker.
-
-There normally shouldn't be any need to import this module directly.
-It will usually be imported through the generic SCons.Tool.Tool()
-selection method.
-"""
-
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-
-__revision__ = "src/engine/SCons/Tool/sunlink.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-import os
-import os.path
-
-import SCons.Util
-
-import link
-
-ccLinker = None
-
-# search for the acc compiler and linker front end
-
-try:
- dirs = os.listdir('/opt')
-except (IOError, OSError):
- # Not being able to read the directory because it doesn't exist
- # (IOError) or isn't readable (OSError) is okay.
- dirs = []
-
-for d in dirs:
- linker = '/opt/' + d + '/bin/CC'
- if os.path.exists(linker):
- ccLinker = linker
- break
-
-def generate(env):
- """Add Builders and construction variables for Forte to an Environment."""
- link.generate(env)
-
- env['SHLINKFLAGS'] = SCons.Util.CLVar('$LINKFLAGS -G')
-
- env['RPATHPREFIX'] = '-R'
- env['RPATHSUFFIX'] = ''
- env['_RPATH'] = '${_concat(RPATHPREFIX, RPATH, RPATHSUFFIX, __env__)}'
-
-def exists(env):
- return ccLinker
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/swig.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/swig.py
deleted file mode 100644
index 83cd315..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/swig.py
+++ /dev/null
@@ -1,189 +0,0 @@
-"""SCons.Tool.swig
-
-Tool-specific initialization for swig.
-
-There normally shouldn't be any need to import this module directly.
-It will usually be imported through the generic SCons.Tool.Tool()
-selection method.
-
-"""
-
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-
-__revision__ = "src/engine/SCons/Tool/swig.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-import os.path
-import re
-import subprocess
-
-import SCons.Action
-import SCons.Defaults
-import SCons.Scanner
-import SCons.Tool
-import SCons.Util
-import SCons.Node
-
-SwigAction = SCons.Action.Action('$SWIGCOM', '$SWIGCOMSTR')
-
-def swigSuffixEmitter(env, source):
- if '-c++' in SCons.Util.CLVar(env.subst("$SWIGFLAGS", source=source)):
- return '$SWIGCXXFILESUFFIX'
- else:
- return '$SWIGCFILESUFFIX'
-
-# Match '%module test', as well as '%module(directors="1") test'
-# Also allow for test to be quoted (SWIG permits double quotes, but not single)
-# Also allow for the line to have spaces after test if not quoted
-_reModule = re.compile(r'%module(\s*\(.*\))?\s+("?)(\S+)\2')
-
-def _find_modules(src):
- """Find all modules referenced by %module lines in `src`, a SWIG .i file.
- Returns a list of all modules, and a flag set if SWIG directors have
- been requested (SWIG will generate an additional header file in this
- case.)"""
- directors = 0
- mnames = []
- try:
- matches = _reModule.findall(open(src).read())
- except IOError:
- # If the file's not yet generated, guess the module name from the file stem
- matches = []
- mnames.append(os.path.splitext(os.path.basename(src))[0])
-
- for m in matches:
- mnames.append(m[2])
- directors = directors or m[0].find('directors') >= 0
- return mnames, directors
-
-def _add_director_header_targets(target, env):
- # Directors only work with C++ code, not C
- suffix = env.subst(env['SWIGCXXFILESUFFIX'])
- # For each file ending in SWIGCXXFILESUFFIX, add a new target director
- # header by replacing the ending with SWIGDIRECTORSUFFIX.
- for x in target[:]:
- n = x.name
- d = x.dir
- if n[-len(suffix):] == suffix:
- target.append(d.File(n[:-len(suffix)] + env['SWIGDIRECTORSUFFIX']))
-
-def _swigEmitter(target, source, env):
- swigflags = env.subst("$SWIGFLAGS", target=target, source=source)
- flags = SCons.Util.CLVar(swigflags)
- for src in source:
- src = str(src.rfile())
- mnames = None
- if "-python" in flags and "-noproxy" not in flags:
- if mnames is None:
- mnames, directors = _find_modules(src)
- if directors:
- _add_director_header_targets(target, env)
- python_files = [m + ".py" for m in mnames]
- outdir = env.subst('$SWIGOUTDIR', target=target, source=source)
- # .py files should be generated in SWIGOUTDIR if specified,
- # otherwise in the same directory as the target
- if outdir:
- python_files = [env.fs.File(os.path.join(outdir, j)) for j in python_files]
- else:
- python_files = [target[0].dir.File(m) for m in python_files]
- target.extend(python_files)
- if "-java" in flags:
- if mnames is None:
- mnames, directors = _find_modules(src)
- if directors:
- _add_director_header_targets(target, env)
- java_files = [[m + ".java", m + "JNI.java"] for m in mnames]
- java_files = SCons.Util.flatten(java_files)
- outdir = env.subst('$SWIGOUTDIR', target=target, source=source)
- if outdir:
- java_files = [os.path.join(outdir, j) for j in java_files]
- java_files = list(map(env.fs.File, java_files))
- def t_from_s(t, p, s, x):
- return t.dir
- tsm = SCons.Node._target_from_source_map
- tkey = len(tsm)
- tsm[tkey] = t_from_s
- for jf in java_files:
- jf._func_target_from_source = tkey
- target.extend(java_files)
- return (target, source)
-
-def _get_swig_version(env):
- """Run the SWIG command line tool to get and return the version number"""
- pipe = SCons.Action._subproc(env, [env['SWIG'], '-version'],
- stdin = 'devnull',
- stderr = 'devnull',
- stdout = subprocess.PIPE)
- if pipe.wait() != 0: return
-
- out = pipe.stdout.read()
- match = re.search(r'SWIG Version\s+(\S+)$', out, re.MULTILINE)
- if match:
- return match.group(1)
-
-def generate(env):
- """Add Builders and construction variables for swig to an Environment."""
- c_file, cxx_file = SCons.Tool.createCFileBuilders(env)
-
- c_file.suffix['.i'] = swigSuffixEmitter
- cxx_file.suffix['.i'] = swigSuffixEmitter
-
- c_file.add_action('.i', SwigAction)
- c_file.add_emitter('.i', _swigEmitter)
- cxx_file.add_action('.i', SwigAction)
- cxx_file.add_emitter('.i', _swigEmitter)
-
- java_file = SCons.Tool.CreateJavaFileBuilder(env)
-
- java_file.suffix['.i'] = swigSuffixEmitter
-
- java_file.add_action('.i', SwigAction)
- java_file.add_emitter('.i', _swigEmitter)
-
- env['SWIG'] = 'swig'
- env['SWIGVERSION'] = _get_swig_version(env)
- env['SWIGFLAGS'] = SCons.Util.CLVar('')
- env['SWIGDIRECTORSUFFIX'] = '_wrap.h'
- env['SWIGCFILESUFFIX'] = '_wrap$CFILESUFFIX'
- env['SWIGCXXFILESUFFIX'] = '_wrap$CXXFILESUFFIX'
- env['_SWIGOUTDIR'] = r'${"-outdir \"%s\"" % SWIGOUTDIR}'
- env['SWIGPATH'] = []
- env['SWIGINCPREFIX'] = '-I'
- env['SWIGINCSUFFIX'] = ''
- env['_SWIGINCFLAGS'] = '$( ${_concat(SWIGINCPREFIX, SWIGPATH, SWIGINCSUFFIX, __env__, RDirs, TARGET, SOURCE)} $)'
- env['SWIGCOM'] = '$SWIG -o $TARGET ${_SWIGOUTDIR} ${_SWIGINCFLAGS} $SWIGFLAGS $SOURCES'
-
- expr = '^[ \t]*%[ \t]*(?:include|import|extern)[ \t]*(<|"?)([^>\s"]+)(?:>|"?)'
- scanner = SCons.Scanner.ClassicCPP("SWIGScan", ".i", "SWIGPATH", expr)
-
- env.Append(SCANNERS = scanner)
-
-def exists(env):
- swig = env.get('SWIG') or env.Detect(['swig'])
- return swig
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/tar.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/tar.py
deleted file mode 100644
index 50afeae..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/tar.py
+++ /dev/null
@@ -1,73 +0,0 @@
-"""SCons.Tool.tar
-
-Tool-specific initialization for tar.
-
-There normally shouldn't be any need to import this module directly.
-It will usually be imported through the generic SCons.Tool.Tool()
-selection method.
-
-"""
-
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-
-__revision__ = "src/engine/SCons/Tool/tar.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-import SCons.Action
-import SCons.Builder
-import SCons.Defaults
-import SCons.Node.FS
-import SCons.Util
-
-tars = ['tar', 'gtar']
-
-TarAction = SCons.Action.Action('$TARCOM', '$TARCOMSTR')
-
-TarBuilder = SCons.Builder.Builder(action = TarAction,
- source_factory = SCons.Node.FS.Entry,
- source_scanner = SCons.Defaults.DirScanner,
- suffix = '$TARSUFFIX',
- multi = 1)
-
-
-def generate(env):
- """Add Builders and construction variables for tar to an Environment."""
- try:
- bld = env['BUILDERS']['Tar']
- except KeyError:
- bld = TarBuilder
- env['BUILDERS']['Tar'] = bld
-
- env['TAR'] = env.Detect(tars) or 'gtar'
- env['TARFLAGS'] = SCons.Util.CLVar('-c')
- env['TARCOM'] = '$TAR $TARFLAGS -f $TARGET $SOURCES'
- env['TARSUFFIX'] = '.tar'
-
-def exists(env):
- return env.Detect(tars)
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/tex.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/tex.py
deleted file mode 100644
index 9dd462e..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/tex.py
+++ /dev/null
@@ -1,992 +0,0 @@
-"""SCons.Tool.tex
-
-Tool-specific initialization for TeX.
-Generates .dvi files from .tex files
-
-There normally shouldn't be any need to import this module directly.
-It will usually be imported through the generic SCons.Tool.Tool()
-selection method.
-
-"""
-
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-
-__revision__ = "src/engine/SCons/Tool/tex.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-import os.path
-import re
-import shutil
-import sys
-import platform
-import glob
-
-import SCons.Action
-import SCons.Node
-import SCons.Node.FS
-import SCons.Util
-import SCons.Scanner.LaTeX
-
-Verbose = False
-
-must_rerun_latex = True
-
-# these are files that just need to be checked for changes and then rerun latex
-check_suffixes = ['.toc', '.lof', '.lot', '.out', '.nav', '.snm']
-
-# these are files that require bibtex or makeindex to be run when they change
-all_suffixes = check_suffixes + ['.bbl', '.idx', '.nlo', '.glo', '.acn', '.bcf']
-
-#
-# regular expressions used to search for Latex features
-# or outputs that require rerunning latex
-#
-# search for all .aux files opened by latex (recorded in the .fls file)
-openout_aux_re = re.compile(r"OUTPUT *(.*\.aux)")
-
-# search for all .bcf files opened by latex (recorded in the .fls file)
-# for use by biber
-openout_bcf_re = re.compile(r"OUTPUT *(.*\.bcf)")
-
-#printindex_re = re.compile(r"^[^%]*\\printindex", re.MULTILINE)
-#printnomenclature_re = re.compile(r"^[^%]*\\printnomenclature", re.MULTILINE)
-#printglossary_re = re.compile(r"^[^%]*\\printglossary", re.MULTILINE)
-
-# search to find rerun warnings
-warning_rerun_str = '(^LaTeX Warning:.*Rerun)|(^Package \w+ Warning:.*Rerun)'
-warning_rerun_re = re.compile(warning_rerun_str, re.MULTILINE)
-
-# search to find citation rerun warnings
-rerun_citations_str = "^LaTeX Warning:.*\n.*Rerun to get citations correct"
-rerun_citations_re = re.compile(rerun_citations_str, re.MULTILINE)
-
-# search to find undefined references or citations warnings
-undefined_references_str = '(^LaTeX Warning:.*undefined references)|(^Package \w+ Warning:.*undefined citations)'
-undefined_references_re = re.compile(undefined_references_str, re.MULTILINE)
-
-# used by the emitter
-auxfile_re = re.compile(r".", re.MULTILINE)
-tableofcontents_re = re.compile(r"^[^%\n]*\\tableofcontents", re.MULTILINE)
-makeindex_re = re.compile(r"^[^%\n]*\\makeindex", re.MULTILINE)
-bibliography_re = re.compile(r"^[^%\n]*\\bibliography", re.MULTILINE)
-bibunit_re = re.compile(r"^[^%\n]*\\begin\{bibunit\}", re.MULTILINE)
-multibib_re = re.compile(r"^[^%\n]*\\newcites\{([^\}]*)\}", re.MULTILINE)
-addbibresource_re = re.compile(r"^[^%\n]*\\(addbibresource|addglobalbib|addsectionbib)", re.MULTILINE)
-listoffigures_re = re.compile(r"^[^%\n]*\\listoffigures", re.MULTILINE)
-listoftables_re = re.compile(r"^[^%\n]*\\listoftables", re.MULTILINE)
-hyperref_re = re.compile(r"^[^%\n]*\\usepackage.*\{hyperref\}", re.MULTILINE)
-makenomenclature_re = re.compile(r"^[^%\n]*\\makenomenclature", re.MULTILINE)
-makeglossary_re = re.compile(r"^[^%\n]*\\makeglossary", re.MULTILINE)
-makeglossaries_re = re.compile(r"^[^%\n]*\\makeglossaries", re.MULTILINE)
-makeacronyms_re = re.compile(r"^[^%\n]*\\makeglossaries", re.MULTILINE)
-beamer_re = re.compile(r"^[^%\n]*\\documentclass\{beamer\}", re.MULTILINE)
-regex = r'^[^%\n]*\\newglossary\s*\[([^\]]+)\]?\s*\{([^}]*)\}\s*\{([^}]*)\}\s*\{([^}]*)\}\s*\{([^}]*)\}'
-newglossary_re = re.compile(regex, re.MULTILINE)
-biblatex_re = re.compile(r"^[^%\n]*\\usepackage.*\{biblatex\}", re.MULTILINE)
-
-newglossary_suffix = []
-
-# search to find all files included by Latex
-include_re = re.compile(r'^[^%\n]*\\(?:include|input){([^}]*)}', re.MULTILINE)
-includeOnly_re = re.compile(r'^[^%\n]*\\(?:include){([^}]*)}', re.MULTILINE)
-
-# search to find all graphics files included by Latex
-includegraphics_re = re.compile(r'^[^%\n]*\\(?:includegraphics(?:\[[^\]]+\])?){([^}]*)}', re.MULTILINE)
-
-# search to find all files opened by Latex (recorded in .log file)
-openout_re = re.compile(r"OUTPUT *(.*)")
-
-# list of graphics file extensions for TeX and LaTeX
-TexGraphics = SCons.Scanner.LaTeX.TexGraphics
-LatexGraphics = SCons.Scanner.LaTeX.LatexGraphics
-
-# An Action sufficient to build any generic tex file.
-TeXAction = None
-
-# An action to build a latex file. This action might be needed more
-# than once if we are dealing with labels and bibtex.
-LaTeXAction = None
-
-# An action to run BibTeX on a file.
-BibTeXAction = None
-
-# An action to run Biber on a file.
-BiberAction = None
-
-# An action to run MakeIndex on a file.
-MakeIndexAction = None
-
-# An action to run MakeIndex (for nomencl) on a file.
-MakeNclAction = None
-
-# An action to run MakeIndex (for glossary) on a file.
-MakeGlossaryAction = None
-
-# An action to run MakeIndex (for acronyms) on a file.
-MakeAcronymsAction = None
-
-# An action to run MakeIndex (for newglossary commands) on a file.
-MakeNewGlossaryAction = None
-
-# Used as a return value of modify_env_var if the variable is not set.
-_null = SCons.Scanner.LaTeX._null
-
-modify_env_var = SCons.Scanner.LaTeX.modify_env_var
-
-def check_file_error_message(utility, filename='log'):
- msg = '%s returned an error, check the %s file\n' % (utility, filename)
- sys.stdout.write(msg)
-
-def FindFile(name,suffixes,paths,env,requireExt=False):
- if requireExt:
- name,ext = SCons.Util.splitext(name)
- # if the user gave an extension use it.
- if ext:
- name = name + ext
- if Verbose:
- print " searching for '%s' with extensions: " % name,suffixes
-
- for path in paths:
- testName = os.path.join(path,name)
- if Verbose:
- print " look for '%s'" % testName
- if os.path.isfile(testName):
- if Verbose:
- print " found '%s'" % testName
- return env.fs.File(testName)
- else:
- name_ext = SCons.Util.splitext(testName)[1]
- if name_ext:
- continue
-
- # if no suffix try adding those passed in
- for suffix in suffixes:
- testNameExt = testName + suffix
- if Verbose:
- print " look for '%s'" % testNameExt
-
- if os.path.isfile(testNameExt):
- if Verbose:
- print " found '%s'" % testNameExt
- return env.fs.File(testNameExt)
- if Verbose:
- print " did not find '%s'" % name
- return None
-
-def InternalLaTeXAuxAction(XXXLaTeXAction, target = None, source= None, env=None):
- """A builder for LaTeX files that checks the output in the aux file
- and decides how many times to use LaTeXAction, and BibTeXAction."""
-
- global must_rerun_latex
-
- # This routine is called with two actions. In this file for DVI builds
- # with LaTeXAction and from the pdflatex.py with PDFLaTeXAction
- # set this up now for the case where the user requests a different extension
- # for the target filename
- if (XXXLaTeXAction == LaTeXAction):
- callerSuffix = ".dvi"
- else:
- callerSuffix = env['PDFSUFFIX']
-
- basename = SCons.Util.splitext(str(source[0]))[0]
- basedir = os.path.split(str(source[0]))[0]
- basefile = os.path.split(str(basename))[1]
- abspath = os.path.abspath(basedir)
-
- targetext = os.path.splitext(str(target[0]))[1]
- targetdir = os.path.split(str(target[0]))[0]
-
- saved_env = {}
- for var in SCons.Scanner.LaTeX.LaTeX.env_variables:
- saved_env[var] = modify_env_var(env, var, abspath)
-
- # Create base file names with the target directory since the auxiliary files
- # will be made there. That's because the *COM variables have the cd
- # command in the prolog. We check
- # for the existence of files before opening them--even ones like the
- # aux file that TeX always creates--to make it possible to write tests
- # with stubs that don't necessarily generate all of the same files.
-
- targetbase = os.path.join(targetdir, basefile)
-
- # if there is a \makeindex there will be a .idx and thus
- # we have to run makeindex at least once to keep the build
- # happy even if there is no index.
- # Same for glossaries, nomenclature, and acronyms
- src_content = source[0].get_text_contents()
- run_makeindex = makeindex_re.search(src_content) and not os.path.isfile(targetbase + '.idx')
- run_nomenclature = makenomenclature_re.search(src_content) and not os.path.isfile(targetbase + '.nlo')
- run_glossary = makeglossary_re.search(src_content) and not os.path.isfile(targetbase + '.glo')
- run_glossaries = makeglossaries_re.search(src_content) and not os.path.isfile(targetbase + '.glo')
- run_acronyms = makeacronyms_re.search(src_content) and not os.path.isfile(targetbase + '.acn')
-
- saved_hashes = {}
- suffix_nodes = {}
-
-
- for suffix in all_suffixes+sum(newglossary_suffix, []):
- theNode = env.fs.File(targetbase + suffix)
- suffix_nodes[suffix] = theNode
- saved_hashes[suffix] = theNode.get_csig()
-
- if Verbose:
- print "hashes: ",saved_hashes
-
- must_rerun_latex = True
-
- # .aux files already processed by BibTex
- already_bibtexed = []
-
- #
- # routine to update MD5 hash and compare
- #
- def check_MD5(filenode, suffix):
- global must_rerun_latex
- # two calls to clear old csig
- filenode.clear_memoized_values()
- filenode.ninfo = filenode.new_ninfo()
- new_md5 = filenode.get_csig()
-
- if saved_hashes[suffix] == new_md5:
- if Verbose:
- print "file %s not changed" % (targetbase+suffix)
- return False # unchanged
- saved_hashes[suffix] = new_md5
- must_rerun_latex = True
- if Verbose:
- print "file %s changed, rerunning Latex, new hash = " % (targetbase+suffix), new_md5
- return True # changed
-
- # generate the file name that latex will generate
- resultfilename = targetbase + callerSuffix
-
- count = 0
-
- while (must_rerun_latex and count < int(env.subst('$LATEXRETRIES'))) :
- result = XXXLaTeXAction(target, source, env)
- if result != 0:
- return result
-
- count = count + 1
-
- must_rerun_latex = False
- # Decide if various things need to be run, or run again.
-
- # Read the log file to find warnings/errors
- logfilename = targetbase + '.log'
- logContent = ''
- if os.path.isfile(logfilename):
- logContent = open(logfilename, "rb").read()
-
-
- # Read the fls file to find all .aux files
- flsfilename = targetbase + '.fls'
- flsContent = ''
- auxfiles = []
- if os.path.isfile(flsfilename):
- flsContent = open(flsfilename, "rb").read()
- auxfiles = openout_aux_re.findall(flsContent)
- # remove duplicates
- dups = {}
- for x in auxfiles:
- dups[x] = 1
- auxfiles = list(dups.keys())
-
- bcffiles = []
- if os.path.isfile(flsfilename):
- flsContent = open(flsfilename, "rb").read()
- bcffiles = openout_bcf_re.findall(flsContent)
- # remove duplicates
- dups = {}
- for x in bcffiles:
- dups[x] = 1
- bcffiles = list(dups.keys())
-
- if Verbose:
- print "auxfiles ",auxfiles
- print "bcffiles ",bcffiles
-
- # Now decide if bibtex will need to be run.
- # The information that bibtex reads from the .aux file is
- # pass-independent. If we find (below) that the .bbl file is unchanged,
- # then the last latex saw a correct bibliography.
- # Therefore only do this once
- # Go through all .aux files and remember the files already done.
- for auxfilename in auxfiles:
- if auxfilename not in already_bibtexed:
- already_bibtexed.append(auxfilename)
- target_aux = os.path.join(targetdir, auxfilename)
- if os.path.isfile(target_aux):
- content = open(target_aux, "rb").read()
- if content.find("bibdata") != -1:
- if Verbose:
- print "Need to run bibtex on ",auxfilename
- bibfile = env.fs.File(SCons.Util.splitext(target_aux)[0])
- result = BibTeXAction(bibfile, bibfile, env)
- if result != 0:
- check_file_error_message(env['BIBTEX'], 'blg')
- must_rerun_latex = True
-
- # Now decide if biber will need to be run.
- # When the backend for biblatex is biber (by choice or default) the
- # citation information is put in the .bcf file.
- # The information that biber reads from the .bcf file is
- # pass-independent. If we find (below) that the .bbl file is unchanged,
- # then the last latex saw a correct bibliography.
- # Therefore only do this once
- # Go through all .bcf files and remember the files already done.
- for bcffilename in bcffiles:
- if bcffilename not in already_bibtexed:
- already_bibtexed.append(bcffilename)
- target_bcf = os.path.join(targetdir, bcffilename)
- if os.path.isfile(target_bcf):
- content = open(target_bcf, "rb").read()
- if content.find("bibdata") != -1:
- if Verbose:
- print "Need to run biber on ",bcffilename
- bibfile = env.fs.File(SCons.Util.splitext(target_bcf)[0])
- result = BiberAction(bibfile, bibfile, env)
- if result != 0:
- check_file_error_message(env['BIBER'], 'blg')
- must_rerun_latex = True
-
- # Now decide if latex will need to be run again due to index.
- if check_MD5(suffix_nodes['.idx'],'.idx') or (count == 1 and run_makeindex):
- # We must run makeindex
- if Verbose:
- print "Need to run makeindex"
- idxfile = suffix_nodes['.idx']
- result = MakeIndexAction(idxfile, idxfile, env)
- if result != 0:
- check_file_error_message(env['MAKEINDEX'], 'ilg')
- return result
-
- # TO-DO: need to add a way for the user to extend this list for whatever
- # auxiliary files they create in other (or their own) packages
- # Harder is case is where an action needs to be called -- that should be rare (I hope?)
-
- for index in check_suffixes:
- check_MD5(suffix_nodes[index],index)
-
- # Now decide if latex will need to be run again due to nomenclature.
- if check_MD5(suffix_nodes['.nlo'],'.nlo') or (count == 1 and run_nomenclature):
- # We must run makeindex
- if Verbose:
- print "Need to run makeindex for nomenclature"
- nclfile = suffix_nodes['.nlo']
- result = MakeNclAction(nclfile, nclfile, env)
- if result != 0:
- check_file_error_message('%s (nomenclature)' % env['MAKENCL'],
- 'nlg')
- #return result
-
- # Now decide if latex will need to be run again due to glossary.
- if check_MD5(suffix_nodes['.glo'],'.glo') or (count == 1 and run_glossaries) or (count == 1 and run_glossary):
- # We must run makeindex
- if Verbose:
- print "Need to run makeindex for glossary"
- glofile = suffix_nodes['.glo']
- result = MakeGlossaryAction(glofile, glofile, env)
- if result != 0:
- check_file_error_message('%s (glossary)' % env['MAKEGLOSSARY'],
- 'glg')
- #return result
-
- # Now decide if latex will need to be run again due to acronyms.
- if check_MD5(suffix_nodes['.acn'],'.acn') or (count == 1 and run_acronyms):
- # We must run makeindex
- if Verbose:
- print "Need to run makeindex for acronyms"
- acrfile = suffix_nodes['.acn']
- result = MakeAcronymsAction(acrfile, acrfile, env)
- if result != 0:
- check_file_error_message('%s (acronyms)' % env['MAKEACRONYMS'],
- 'alg')
- return result
-
- # Now decide if latex will need to be run again due to newglossary command.
- for ig in range(len(newglossary_suffix)):
- if check_MD5(suffix_nodes[newglossary_suffix[ig][2]],newglossary_suffix[ig][2]) or (count == 1):
- # We must run makeindex
- if Verbose:
- print "Need to run makeindex for newglossary"
- newglfile = suffix_nodes[newglossary_suffix[ig][2]]
- MakeNewGlossaryAction = SCons.Action.Action("$MAKENEWGLOSSARYCOM ${SOURCE.filebase}%s -s ${SOURCE.filebase}.ist -t ${SOURCE.filebase}%s -o ${SOURCE.filebase}%s" % (newglossary_suffix[ig][2],newglossary_suffix[ig][0],newglossary_suffix[ig][1]), "$MAKENEWGLOSSARYCOMSTR")
-
- result = MakeNewGlossaryAction(newglfile, newglfile, env)
- if result != 0:
- check_file_error_message('%s (newglossary)' % env['MAKENEWGLOSSARY'],
- newglossary_suffix[ig][0])
- return result
-
- # Now decide if latex needs to be run yet again to resolve warnings.
- if warning_rerun_re.search(logContent):
- must_rerun_latex = True
- if Verbose:
- print "rerun Latex due to latex or package rerun warning"
-
- if rerun_citations_re.search(logContent):
- must_rerun_latex = True
- if Verbose:
- print "rerun Latex due to 'Rerun to get citations correct' warning"
-
- if undefined_references_re.search(logContent):
- must_rerun_latex = True
- if Verbose:
- print "rerun Latex due to undefined references or citations"
-
- if (count >= int(env.subst('$LATEXRETRIES')) and must_rerun_latex):
- print "reached max number of retries on Latex ,",int(env.subst('$LATEXRETRIES'))
-# end of while loop
-
- # rename Latex's output to what the target name is
- if not (str(target[0]) == resultfilename and os.path.isfile(resultfilename)):
- if os.path.isfile(resultfilename):
- print "move %s to %s" % (resultfilename, str(target[0]), )
- shutil.move(resultfilename,str(target[0]))
-
- # Original comment (when TEXPICTS was not restored):
- # The TEXPICTS enviroment variable is needed by a dvi -> pdf step
- # later on Mac OSX so leave it
- #
- # It is also used when searching for pictures (implicit dependencies).
- # Why not set the variable again in the respective builder instead
- # of leaving local modifications in the environment? What if multiple
- # latex builds in different directories need different TEXPICTS?
- for var in SCons.Scanner.LaTeX.LaTeX.env_variables:
- if var == 'TEXPICTS':
- continue
- if saved_env[var] is _null:
- try:
- del env['ENV'][var]
- except KeyError:
- pass # was never set
- else:
- env['ENV'][var] = saved_env[var]
-
- return result
-
-def LaTeXAuxAction(target = None, source= None, env=None):
- result = InternalLaTeXAuxAction( LaTeXAction, target, source, env )
- return result
-
-LaTeX_re = re.compile("\\\\document(style|class)")
-
-def is_LaTeX(flist,env,abspath):
- """Scan a file list to decide if it's TeX- or LaTeX-flavored."""
-
- # We need to scan files that are included in case the
- # \documentclass command is in them.
-
- # get path list from both env['TEXINPUTS'] and env['ENV']['TEXINPUTS']
- savedpath = modify_env_var(env, 'TEXINPUTS', abspath)
- paths = env['ENV']['TEXINPUTS']
- if SCons.Util.is_List(paths):
- pass
- else:
- # Split at os.pathsep to convert into absolute path
- paths = paths.split(os.pathsep)
-
- # now that we have the path list restore the env
- if savedpath is _null:
- try:
- del env['ENV']['TEXINPUTS']
- except KeyError:
- pass # was never set
- else:
- env['ENV']['TEXINPUTS'] = savedpath
- if Verbose:
- print "is_LaTeX search path ",paths
- print "files to search :",flist
-
- # Now that we have the search path and file list, check each one
- for f in flist:
- if Verbose:
- print " checking for Latex source ",str(f)
-
- content = f.get_text_contents()
- if LaTeX_re.search(content):
- if Verbose:
- print "file %s is a LaTeX file" % str(f)
- return 1
- if Verbose:
- print "file %s is not a LaTeX file" % str(f)
-
- # now find included files
- inc_files = [ ]
- inc_files.extend( include_re.findall(content) )
- if Verbose:
- print "files included by '%s': "%str(f),inc_files
- # inc_files is list of file names as given. need to find them
- # using TEXINPUTS paths.
-
- # search the included files
- for src in inc_files:
- srcNode = FindFile(src,['.tex','.ltx','.latex'],paths,env,requireExt=False)
- # make this a list since is_LaTeX takes a list.
- fileList = [srcNode,]
- if Verbose:
- print "FindFile found ",srcNode
- if srcNode is not None:
- file_test = is_LaTeX(fileList, env, abspath)
-
- # return on first file that finds latex is needed.
- if file_test:
- return file_test
-
- if Verbose:
- print " done scanning ",str(f)
-
- return 0
-
-def TeXLaTeXFunction(target = None, source= None, env=None):
- """A builder for TeX and LaTeX that scans the source file to
- decide the "flavor" of the source and then executes the appropriate
- program."""
-
- # find these paths for use in is_LaTeX to search for included files
- basedir = os.path.split(str(source[0]))[0]
- abspath = os.path.abspath(basedir)
-
- if is_LaTeX(source,env,abspath):
- result = LaTeXAuxAction(target,source,env)
- if result != 0:
- check_file_error_message(env['LATEX'])
- else:
- result = TeXAction(target,source,env)
- if result != 0:
- check_file_error_message(env['TEX'])
- return result
-
-def TeXLaTeXStrFunction(target = None, source= None, env=None):
- """A strfunction for TeX and LaTeX that scans the source file to
- decide the "flavor" of the source and then returns the appropriate
- command string."""
- if env.GetOption("no_exec"):
-
- # find these paths for use in is_LaTeX to search for included files
- basedir = os.path.split(str(source[0]))[0]
- abspath = os.path.abspath(basedir)
-
- if is_LaTeX(source,env,abspath):
- result = env.subst('$LATEXCOM',0,target,source)+" ..."
- else:
- result = env.subst("$TEXCOM",0,target,source)+" ..."
- else:
- result = ''
- return result
-
-def tex_eps_emitter(target, source, env):
- """An emitter for TeX and LaTeX sources when
- executing tex or latex. It will accept .ps and .eps
- graphics files
- """
- (target, source) = tex_emitter_core(target, source, env, TexGraphics)
-
- return (target, source)
-
-def tex_pdf_emitter(target, source, env):
- """An emitter for TeX and LaTeX sources when
- executing pdftex or pdflatex. It will accept graphics
- files of types .pdf, .jpg, .png, .gif, and .tif
- """
- (target, source) = tex_emitter_core(target, source, env, LatexGraphics)
-
- return (target, source)
-
-def ScanFiles(theFile, target, paths, file_tests, file_tests_search, env, graphics_extensions, targetdir, aux_files):
- """ For theFile (a Node) update any file_tests and search for graphics files
- then find all included files and call ScanFiles recursively for each of them"""
-
- content = theFile.get_text_contents()
- if Verbose:
- print " scanning ",str(theFile)
-
- for i in range(len(file_tests_search)):
- if file_tests[i][0] is None:
- if Verbose:
- print "scan i ",i," files_tests[i] ",file_tests[i], file_tests[i][1]
- file_tests[i][0] = file_tests_search[i].search(content)
- if Verbose and file_tests[i][0]:
- print " found match for ",file_tests[i][1][-1]
- # for newglossary insert the suffixes in file_tests[i]
- if file_tests[i][0] and file_tests[i][1][-1] == 'newglossary':
- findresult = file_tests_search[i].findall(content)
- for l in range(len(findresult)) :
- (file_tests[i][1]).insert(0,'.'+findresult[l][3])
- (file_tests[i][1]).insert(0,'.'+findresult[l][2])
- (file_tests[i][1]).insert(0,'.'+findresult[l][0])
- suffix_list = ['.'+findresult[l][0],'.'+findresult[l][2],'.'+findresult[l][3] ]
- newglossary_suffix.append(suffix_list)
- if Verbose:
- print " new suffixes for newglossary ",newglossary_suffix
-
-
- incResult = includeOnly_re.search(content)
- if incResult:
- aux_files.append(os.path.join(targetdir, incResult.group(1)))
- if Verbose:
- print "\include file names : ", aux_files
- # recursively call this on each of the included files
- inc_files = [ ]
- inc_files.extend( include_re.findall(content) )
- if Verbose:
- print "files included by '%s': "%str(theFile),inc_files
- # inc_files is list of file names as given. need to find them
- # using TEXINPUTS paths.
-
- for src in inc_files:
- srcNode = FindFile(src,['.tex','.ltx','.latex'],paths,env,requireExt=False)
- if srcNode is not None:
- file_tests = ScanFiles(srcNode, target, paths, file_tests, file_tests_search, env, graphics_extensions, targetdir, aux_files)
- if Verbose:
- print " done scanning ",str(theFile)
- return file_tests
-
-def tex_emitter_core(target, source, env, graphics_extensions):
- """An emitter for TeX and LaTeX sources.
- For LaTeX sources we try and find the common created files that
- are needed on subsequent runs of latex to finish tables of contents,
- bibliographies, indices, lists of figures, and hyperlink references.
- """
- basename = SCons.Util.splitext(str(source[0]))[0]
- basefile = os.path.split(str(basename))[1]
- targetdir = os.path.split(str(target[0]))[0]
- targetbase = os.path.join(targetdir, basefile)
-
- basedir = os.path.split(str(source[0]))[0]
- abspath = os.path.abspath(basedir)
- target[0].attributes.path = abspath
-
- #
- # file names we will make use of in searching the sources and log file
- #
- emit_suffixes = ['.aux', '.log', '.ilg', '.blg', '.nls', '.nlg', '.gls', '.glg', '.alg'] + all_suffixes
- auxfilename = targetbase + '.aux'
- logfilename = targetbase + '.log'
- flsfilename = targetbase + '.fls'
- syncfilename = targetbase + '.synctex.gz'
-
- env.SideEffect(auxfilename,target[0])
- env.SideEffect(logfilename,target[0])
- env.SideEffect(flsfilename,target[0])
- env.SideEffect(syncfilename,target[0])
- if Verbose:
- print "side effect :",auxfilename,logfilename,flsfilename,syncfilename
- env.Clean(target[0],auxfilename)
- env.Clean(target[0],logfilename)
- env.Clean(target[0],flsfilename)
- env.Clean(target[0],syncfilename)
-
- content = source[0].get_text_contents()
-
- # These variables are no longer used.
- #idx_exists = os.path.isfile(targetbase + '.idx')
- #nlo_exists = os.path.isfile(targetbase + '.nlo')
- #glo_exists = os.path.isfile(targetbase + '.glo')
- #acr_exists = os.path.isfile(targetbase + '.acn')
-
- # set up list with the regular expressions
- # we use to find features used
- file_tests_search = [auxfile_re,
- makeindex_re,
- bibliography_re,
- bibunit_re,
- multibib_re,
- addbibresource_re,
- tableofcontents_re,
- listoffigures_re,
- listoftables_re,
- hyperref_re,
- makenomenclature_re,
- makeglossary_re,
- makeglossaries_re,
- makeacronyms_re,
- beamer_re,
- newglossary_re,
- biblatex_re ]
- # set up list with the file suffixes that need emitting
- # when a feature is found
- file_tests_suff = [['.aux','aux_file'],
- ['.idx', '.ind', '.ilg','makeindex'],
- ['.bbl', '.blg','bibliography'],
- ['.bbl', '.blg','bibunit'],
- ['.bbl', '.blg','multibib'],
- ['.bbl', '.blg','.bcf','addbibresource'],
- ['.toc','contents'],
- ['.lof','figures'],
- ['.lot','tables'],
- ['.out','hyperref'],
- ['.nlo', '.nls', '.nlg','nomenclature'],
- ['.glo', '.gls', '.glg','glossary'],
- ['.glo', '.gls', '.glg','glossaries'],
- ['.acn', '.acr', '.alg','acronyms'],
- ['.nav', '.snm', '.out', '.toc','beamer'],
- ['newglossary',],
- ['.bcf', '.blg','biblatex'] ]
- # for newglossary the suffixes are added as we find the command
- # build the list of lists
- file_tests = []
- for i in range(len(file_tests_search)):
- file_tests.append( [None, file_tests_suff[i]] )
-
- # TO-DO: need to add a way for the user to extend this list for whatever
- # auxiliary files they create in other (or their own) packages
-
- # get path list from both env['TEXINPUTS'] and env['ENV']['TEXINPUTS']
- savedpath = modify_env_var(env, 'TEXINPUTS', abspath)
- paths = env['ENV']['TEXINPUTS']
- if SCons.Util.is_List(paths):
- pass
- else:
- # Split at os.pathsep to convert into absolute path
- paths = paths.split(os.pathsep)
-
- # now that we have the path list restore the env
- if savedpath is _null:
- try:
- del env['ENV']['TEXINPUTS']
- except KeyError:
- pass # was never set
- else:
- env['ENV']['TEXINPUTS'] = savedpath
- if Verbose:
- print "search path ",paths
-
- # scan all sources for side effect files
- aux_files = []
- file_tests = ScanFiles(source[0], target, paths, file_tests, file_tests_search, env, graphics_extensions, targetdir, aux_files)
-
- for (theSearch,suffix_list) in file_tests:
- # add side effects if feature is present.If file is to be generated,add all side effects
- if Verbose and theSearch:
- print "check side effects for ",suffix_list[-1]
- if (theSearch != None) or (not source[0].exists() ):
- file_list = [targetbase,]
- # for bibunit we need a list of files
- if suffix_list[-1] == 'bibunit':
- file_basename = os.path.join(targetdir, 'bu*.aux')
- file_list = glob.glob(file_basename)
- # remove the suffix '.aux'
- for i in range(len(file_list)):
- file_list.append(SCons.Util.splitext(file_list[i])[0])
- # for multibib we need a list of files
- if suffix_list[-1] == 'multibib':
- for multibibmatch in multibib_re.finditer(content):
- if Verbose:
- print "multibib match ",multibibmatch.group(1)
- if multibibmatch != None:
- baselist = multibibmatch.group(1).split(',')
- if Verbose:
- print "multibib list ", baselist
- for i in range(len(baselist)):
- file_list.append(os.path.join(targetdir, baselist[i]))
- # now define the side effects
- for file_name in file_list:
- for suffix in suffix_list[:-1]:
- env.SideEffect(file_name + suffix,target[0])
- if Verbose:
- print "side effect tst :",file_name + suffix, " target is ",str(target[0])
- env.Clean(target[0],file_name + suffix)
-
- for aFile in aux_files:
- aFile_base = SCons.Util.splitext(aFile)[0]
- env.SideEffect(aFile_base + '.aux',target[0])
- if Verbose:
- print "side effect aux :",aFile_base + '.aux'
- env.Clean(target[0],aFile_base + '.aux')
- # read fls file to get all other files that latex creates and will read on the next pass
- # remove files from list that we explicitly dealt with above
- if os.path.isfile(flsfilename):
- content = open(flsfilename, "rb").read()
- out_files = openout_re.findall(content)
- myfiles = [auxfilename, logfilename, flsfilename, targetbase+'.dvi',targetbase+'.pdf']
- for filename in out_files[:]:
- if filename in myfiles:
- out_files.remove(filename)
- env.SideEffect(out_files,target[0])
- if Verbose:
- print "side effect fls :",out_files
- env.Clean(target[0],out_files)
-
- return (target, source)
-
-
-TeXLaTeXAction = None
-
-def generate(env):
- """Add Builders and construction variables for TeX to an Environment."""
-
- global TeXLaTeXAction
- if TeXLaTeXAction is None:
- TeXLaTeXAction = SCons.Action.Action(TeXLaTeXFunction,
- strfunction=TeXLaTeXStrFunction)
-
- env.AppendUnique(LATEXSUFFIXES=SCons.Tool.LaTeXSuffixes)
-
- generate_common(env)
-
- import dvi
- dvi.generate(env)
-
- bld = env['BUILDERS']['DVI']
- bld.add_action('.tex', TeXLaTeXAction)
- bld.add_emitter('.tex', tex_eps_emitter)
-
-def generate_darwin(env):
- try:
- environ = env['ENV']
- except KeyError:
- environ = {}
- env['ENV'] = environ
-
- if (platform.system() == 'Darwin'):
- try:
- ospath = env['ENV']['PATHOSX']
- except:
- ospath = None
- if ospath:
- env.AppendENVPath('PATH', ospath)
-
-def generate_common(env):
- """Add internal Builders and construction variables for LaTeX to an Environment."""
-
- # Add OSX system paths so TeX tools can be found
- # when a list of tools is given the exists() method is not called
- generate_darwin(env)
-
- # A generic tex file Action, sufficient for all tex files.
- global TeXAction
- if TeXAction is None:
- TeXAction = SCons.Action.Action("$TEXCOM", "$TEXCOMSTR")
-
- # An Action to build a latex file. This might be needed more
- # than once if we are dealing with labels and bibtex.
- global LaTeXAction
- if LaTeXAction is None:
- LaTeXAction = SCons.Action.Action("$LATEXCOM", "$LATEXCOMSTR")
-
- # Define an action to run BibTeX on a file.
- global BibTeXAction
- if BibTeXAction is None:
- BibTeXAction = SCons.Action.Action("$BIBTEXCOM", "$BIBTEXCOMSTR")
-
- # Define an action to run Biber on a file.
- global BiberAction
- if BiberAction is None:
- BiberAction = SCons.Action.Action("$BIBERCOM", "$BIBERCOMSTR")
-
- # Define an action to run MakeIndex on a file.
- global MakeIndexAction
- if MakeIndexAction is None:
- MakeIndexAction = SCons.Action.Action("$MAKEINDEXCOM", "$MAKEINDEXCOMSTR")
-
- # Define an action to run MakeIndex on a file for nomenclatures.
- global MakeNclAction
- if MakeNclAction is None:
- MakeNclAction = SCons.Action.Action("$MAKENCLCOM", "$MAKENCLCOMSTR")
-
- # Define an action to run MakeIndex on a file for glossaries.
- global MakeGlossaryAction
- if MakeGlossaryAction is None:
- MakeGlossaryAction = SCons.Action.Action("$MAKEGLOSSARYCOM", "$MAKEGLOSSARYCOMSTR")
-
- # Define an action to run MakeIndex on a file for acronyms.
- global MakeAcronymsAction
- if MakeAcronymsAction is None:
- MakeAcronymsAction = SCons.Action.Action("$MAKEACRONYMSCOM", "$MAKEACRONYMSCOMSTR")
-
- try:
- environ = env['ENV']
- except KeyError:
- environ = {}
- env['ENV'] = environ
-
- # Some Linux platforms have pdflatex set up in a way
- # that requires that the HOME environment variable be set.
- # Add it here if defined.
- v = os.environ.get('HOME')
- if v:
- environ['HOME'] = v
-
- CDCOM = 'cd '
- if platform.system() == 'Windows':
- # allow cd command to change drives on Windows
- CDCOM = 'cd /D '
-
- env['TEX'] = 'tex'
- env['TEXFLAGS'] = SCons.Util.CLVar('-interaction=nonstopmode -recorder')
- env['TEXCOM'] = CDCOM + '${TARGET.dir} && $TEX $TEXFLAGS ${SOURCE.file}'
-
- env['PDFTEX'] = 'pdftex'
- env['PDFTEXFLAGS'] = SCons.Util.CLVar('-interaction=nonstopmode -recorder')
- env['PDFTEXCOM'] = CDCOM + '${TARGET.dir} && $PDFTEX $PDFTEXFLAGS ${SOURCE.file}'
-
- env['LATEX'] = 'latex'
- env['LATEXFLAGS'] = SCons.Util.CLVar('-interaction=nonstopmode -recorder')
- env['LATEXCOM'] = CDCOM + '${TARGET.dir} && $LATEX $LATEXFLAGS ${SOURCE.file}'
- env['LATEXRETRIES'] = 4
-
- env['PDFLATEX'] = 'pdflatex'
- env['PDFLATEXFLAGS'] = SCons.Util.CLVar('-interaction=nonstopmode -recorder')
- env['PDFLATEXCOM'] = CDCOM + '${TARGET.dir} && $PDFLATEX $PDFLATEXFLAGS ${SOURCE.file}'
-
- env['BIBTEX'] = 'bibtex'
- env['BIBTEXFLAGS'] = SCons.Util.CLVar('')
- env['BIBTEXCOM'] = CDCOM + '${TARGET.dir} && $BIBTEX $BIBTEXFLAGS ${SOURCE.filebase}'
-
- env['BIBER'] = 'biber'
- env['BIBERFLAGS'] = SCons.Util.CLVar('')
- env['BIBERCOM'] = CDCOM + '${TARGET.dir} && $BIBER $BIBERFLAGS ${SOURCE.filebase}'
-
- env['MAKEINDEX'] = 'makeindex'
- env['MAKEINDEXFLAGS'] = SCons.Util.CLVar('')
- env['MAKEINDEXCOM'] = CDCOM + '${TARGET.dir} && $MAKEINDEX $MAKEINDEXFLAGS ${SOURCE.file}'
-
- env['MAKEGLOSSARY'] = 'makeindex'
- env['MAKEGLOSSARYSTYLE'] = '${SOURCE.filebase}.ist'
- env['MAKEGLOSSARYFLAGS'] = SCons.Util.CLVar('-s ${MAKEGLOSSARYSTYLE} -t ${SOURCE.filebase}.glg')
- env['MAKEGLOSSARYCOM'] = CDCOM + '${TARGET.dir} && $MAKEGLOSSARY ${SOURCE.filebase}.glo $MAKEGLOSSARYFLAGS -o ${SOURCE.filebase}.gls'
-
- env['MAKEACRONYMS'] = 'makeindex'
- env['MAKEACRONYMSSTYLE'] = '${SOURCE.filebase}.ist'
- env['MAKEACRONYMSFLAGS'] = SCons.Util.CLVar('-s ${MAKEACRONYMSSTYLE} -t ${SOURCE.filebase}.alg')
- env['MAKEACRONYMSCOM'] = CDCOM + '${TARGET.dir} && $MAKEACRONYMS ${SOURCE.filebase}.acn $MAKEACRONYMSFLAGS -o ${SOURCE.filebase}.acr'
-
- env['MAKENCL'] = 'makeindex'
- env['MAKENCLSTYLE'] = 'nomencl.ist'
- env['MAKENCLFLAGS'] = '-s ${MAKENCLSTYLE} -t ${SOURCE.filebase}.nlg'
- env['MAKENCLCOM'] = CDCOM + '${TARGET.dir} && $MAKENCL ${SOURCE.filebase}.nlo $MAKENCLFLAGS -o ${SOURCE.filebase}.nls'
-
- env['MAKENEWGLOSSARY'] = 'makeindex'
- env['MAKENEWGLOSSARYCOM'] = CDCOM + '${TARGET.dir} && $MAKENEWGLOSSARY '
-
-def exists(env):
- generate_darwin(env)
- return env.Detect('tex')
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/textfile.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/textfile.py
deleted file mode 100644
index 9c2b3a1..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/textfile.py
+++ /dev/null
@@ -1,175 +0,0 @@
-# -*- python -*-
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-
-__doc__ = """
-Textfile/Substfile builder for SCons.
-
- Create file 'target' which typically is a textfile. The 'source'
- may be any combination of strings, Nodes, or lists of same. A
- 'linesep' will be put between any part written and defaults to
- os.linesep.
-
- The only difference between the Textfile builder and the Substfile
- builder is that strings are converted to Value() nodes for the
- former and File() nodes for the latter. To insert files in the
- former or strings in the latter, wrap them in a File() or Value(),
- respectively.
-
- The values of SUBST_DICT first have any construction variables
- expanded (its keys are not expanded). If a value of SUBST_DICT is
- a python callable function, it is called and the result is expanded
- as the value. Values are substituted in a "random" order; if any
- substitution could be further expanded by another subsitition, it
- is unpredictible whether the expansion will occur.
-"""
-
-__revision__ = "src/engine/SCons/Tool/textfile.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-import SCons
-
-import os
-import re
-
-from SCons.Node import Node
-from SCons.Node.Python import Value
-from SCons.Util import is_String, is_Sequence, is_Dict
-
-def _do_subst(node, subs):
- """
- Fetch the node contents and replace all instances of the keys with
- their values. For example, if subs is
- {'%VERSION%': '1.2345', '%BASE%': 'MyProg', '%prefix%': '/bin'},
- then all instances of %VERSION% in the file will be replaced with
- 1.2345 and so forth.
- """
- contents = node.get_text_contents()
- if not subs: return contents
- for (k,v) in subs:
- contents = re.sub(k, v, contents)
- return contents
-
-def _action(target, source, env):
- # prepare the line separator
- linesep = env['LINESEPARATOR']
- if linesep is None:
- linesep = os.linesep
- elif is_String(linesep):
- pass
- elif isinstance(linesep, Value):
- linesep = linesep.get_text_contents()
- else:
- raise SCons.Errors.UserError(
- 'unexpected type/class for LINESEPARATOR: %s'
- % repr(linesep), None)
-
- # create a dictionary to use for the substitutions
- if 'SUBST_DICT' not in env:
- subs = None # no substitutions
- else:
- d = env['SUBST_DICT']
- if is_Dict(d):
- d = list(d.items())
- elif is_Sequence(d):
- pass
- else:
- raise SCons.Errors.UserError('SUBST_DICT must be dict or sequence')
- subs = []
- for (k,v) in d:
- if callable(v):
- v = v()
- if is_String(v):
- v = env.subst(v)
- else:
- v = str(v)
- subs.append((k,v))
-
- # write the file
- try:
- fd = open(target[0].get_path(), "wb")
- except (OSError,IOError), e:
- raise SCons.Errors.UserError("Can't write target file %s" % target[0])
- # separate lines by 'linesep' only if linesep is not empty
- lsep = None
- for s in source:
- if lsep: fd.write(lsep)
- fd.write(_do_subst(s, subs))
- lsep = linesep
- fd.close()
-
-def _strfunc(target, source, env):
- return "Creating '%s'" % target[0]
-
-def _convert_list_R(newlist, sources):
- for elem in sources:
- if is_Sequence(elem):
- _convert_list_R(newlist, elem)
- elif isinstance(elem, Node):
- newlist.append(elem)
- else:
- newlist.append(Value(elem))
-def _convert_list(target, source, env):
- if len(target) != 1:
- raise SCons.Errors.UserError("Only one target file allowed")
- newlist = []
- _convert_list_R(newlist, source)
- return target, newlist
-
-_common_varlist = ['SUBST_DICT', 'LINESEPARATOR']
-
-_text_varlist = _common_varlist + ['TEXTFILEPREFIX', 'TEXTFILESUFFIX']
-_text_builder = SCons.Builder.Builder(
- action = SCons.Action.Action(_action, _strfunc, varlist = _text_varlist),
- source_factory = Value,
- emitter = _convert_list,
- prefix = '$TEXTFILEPREFIX',
- suffix = '$TEXTFILESUFFIX',
- )
-
-_subst_varlist = _common_varlist + ['SUBSTFILEPREFIX', 'TEXTFILESUFFIX']
-_subst_builder = SCons.Builder.Builder(
- action = SCons.Action.Action(_action, _strfunc, varlist = _subst_varlist),
- source_factory = SCons.Node.FS.File,
- emitter = _convert_list,
- prefix = '$SUBSTFILEPREFIX',
- suffix = '$SUBSTFILESUFFIX',
- src_suffix = ['.in'],
- )
-
-def generate(env):
- env['LINESEPARATOR'] = os.linesep
- env['BUILDERS']['Textfile'] = _text_builder
- env['TEXTFILEPREFIX'] = ''
- env['TEXTFILESUFFIX'] = '.txt'
- env['BUILDERS']['Substfile'] = _subst_builder
- env['SUBSTFILEPREFIX'] = ''
- env['SUBSTFILESUFFIX'] = ''
-
-def exists(env):
- return 1
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/tlib.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/tlib.py
deleted file mode 100644
index 9040439..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/tlib.py
+++ /dev/null
@@ -1,53 +0,0 @@
-"""SCons.Tool.tlib
-
-XXX
-
-"""
-
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-
-__revision__ = "src/engine/SCons/Tool/tlib.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-import SCons.Tool
-import SCons.Tool.bcc32
-import SCons.Util
-
-def generate(env):
- SCons.Tool.bcc32.findIt('tlib', env)
- """Add Builders and construction variables for ar to an Environment."""
- SCons.Tool.createStaticLibBuilder(env)
- env['AR'] = 'tlib'
- env['ARFLAGS'] = SCons.Util.CLVar('')
- env['ARCOM'] = '$AR $TARGET $ARFLAGS /a $SOURCES'
- env['LIBPREFIX'] = ''
- env['LIBSUFFIX'] = '.lib'
-
-def exists(env):
- return SCons.Tool.bcc32.findIt('tlib', env)
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/wix.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/wix.py
deleted file mode 100644
index 1291f18..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/wix.py
+++ /dev/null
@@ -1,104 +0,0 @@
-"""SCons.Tool.wix
-
-Tool-specific initialization for wix, the Windows Installer XML Tool.
-
-There normally shouldn't be any need to import this module directly.
-It will usually be imported through the generic SCons.Tool.Tool()
-selection method.
-"""
-
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-
-__revision__ = "src/engine/SCons/Tool/wix.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-import SCons.Builder
-import SCons.Action
-import os
-
-def generate(env):
- """Add Builders and construction variables for WiX to an Environment."""
- if not exists(env):
- return
-
- env['WIXCANDLEFLAGS'] = ['-nologo']
- env['WIXCANDLEINCLUDE'] = []
- env['WIXCANDLECOM'] = '$WIXCANDLE $WIXCANDLEFLAGS -I $WIXCANDLEINCLUDE -o ${TARGET} ${SOURCE}'
-
- env['WIXLIGHTFLAGS'].append( '-nologo' )
- env['WIXLIGHTCOM'] = "$WIXLIGHT $WIXLIGHTFLAGS -out ${TARGET} ${SOURCES}"
- env['WIXSRCSUF'] = '.wxs'
- env['WIXOBJSUF'] = '.wixobj'
-
- object_builder = SCons.Builder.Builder(
- action = '$WIXCANDLECOM',
- suffix = '$WIXOBJSUF',
- src_suffix = '$WIXSRCSUF')
-
- linker_builder = SCons.Builder.Builder(
- action = '$WIXLIGHTCOM',
- src_suffix = '$WIXOBJSUF',
- src_builder = object_builder)
-
- env['BUILDERS']['WiX'] = linker_builder
-
-def exists(env):
- env['WIXCANDLE'] = 'candle.exe'
- env['WIXLIGHT'] = 'light.exe'
-
- # try to find the candle.exe and light.exe tools and
- # add the install directory to light libpath.
- for path in os.environ['PATH'].split(os.pathsep):
- if not path:
- continue
-
- # workaround for some weird python win32 bug.
- if path[0] == '"' and path[-1:]=='"':
- path = path[1:-1]
-
- # normalize the path
- path = os.path.normpath(path)
-
- # search for the tools in the PATH environment variable
- try:
- files = os.listdir(path)
- if env['WIXCANDLE'] in files and env['WIXLIGHT'] in files:
- env.PrependENVPath('PATH', path)
- # include appropriate flags if running WiX 2.0
- if 'wixui.wixlib' in files and 'WixUI_en-us.wxl' in files:
- env['WIXLIGHTFLAGS'] = [ os.path.join( path, 'wixui.wixlib' ),
- '-loc',
- os.path.join( path, 'WixUI_en-us.wxl' ) ]
- else:
- env['WIXLIGHTFLAGS'] = []
- return 1
- except OSError:
- pass # ignore this, could be a stale PATH entry.
-
- return None
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/xgettext.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/xgettext.py
deleted file mode 100644
index ed6245d..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/xgettext.py
+++ /dev/null
@@ -1,339 +0,0 @@
-""" xgettext tool
-
-Tool specific initialization of `xgettext` tool.
-"""
-
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-__revision__ = "src/engine/SCons/Tool/xgettext.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-#############################################################################
-class _CmdRunner(object):
- """ Callabe object, which runs shell command storing its stdout and stderr to
- variables. It also provides `strfunction()` method, which shall be used by
- scons Action objects to print command string. """
-
- def __init__( self, command, commandstr = None):
- self.out = None
- self.err = None
- self.status = None
- self.command = command
- self.commandstr = commandstr
-
- def __call__(self, target, source, env):
- import SCons.Action
- import subprocess
- import os
- import sys
- kw = {
- 'stdin' : 'devnull',
- 'stdout' : subprocess.PIPE,
- 'stderr' : subprocess.PIPE,
- 'universal_newlines' : True,
- 'shell' : True
- }
- command = env.subst(self.command, target = target, source = source)
- proc = SCons.Action._subproc(env, command, **kw)
- self.out, self.err = proc.communicate()
- self.status = proc.wait()
- if self.err: sys.stderr.write(unicode(self.err))
- return self.status
-
- def strfunction(self, target, source, env):
- import os
- comstr = self.commandstr
- if env.subst(comstr, target = target, source = source) == "":
- comstr = self.command
- s = env.subst(comstr, target = target, source = source)
- return s
-#############################################################################
-
-#############################################################################
-def _update_pot_file(target, source, env):
- """ Action function for `POTUpdate` builder """
- import re
- import os
- import SCons.Action
- nop = lambda target, source, env : 0
-
- # Save scons cwd and os cwd (NOTE: they may be different. After the job, we
- # revert ech one to its original state).
- save_cwd = env.fs.getcwd()
- save_os_cwd = os.getcwd()
- chdir = target[0].dir
- chdir_str = repr(chdir.get_abspath())
- # Print chdir message (employ SCons.Action.Action for that. It knows better
- # than me how to to this correctly).
- env.Execute(SCons.Action.Action(nop, "Entering " + chdir_str))
- # Go to target's directory and do our job
- env.fs.chdir(chdir, 1) # Go into target's directory
- try:
- cmd = _CmdRunner('$XGETTEXTCOM', '$XGETTEXTCOMSTR')
- action = SCons.Action.Action(cmd, strfunction=cmd.strfunction)
- status = action([ target[0] ], source, env)
- except:
- # Something went wrong.
- env.Execute(SCons.Action.Action(nop, "Leaving " + chdir_str))
- # Revert working dirs to previous state and re-throw exception.
- env.fs.chdir(save_cwd, 0)
- os.chdir(save_os_cwd)
- raise
- # Print chdir message.
- env.Execute(SCons.Action.Action(nop, "Leaving " + chdir_str))
- # Revert working dirs to previous state.
- env.fs.chdir(save_cwd, 0)
- os.chdir(save_os_cwd)
- # If the command was not successfull, return error code.
- if status: return status
-
- new_content = cmd.out
-
- if not new_content:
- # When xgettext finds no internationalized messages, no *.pot is created
- # (because we don't want to bother translators with empty POT files).
- needs_update = False
- explain = "no internationalized messages encountered"
- else:
- if target[0].exists():
- # If the file already exists, it's left unaltered unless its messages
- # are outdated (w.r.t. to these recovered by xgettext from sources).
- old_content = target[0].get_text_contents()
- re_cdate = re.compile(r'^"POT-Creation-Date: .*"$[\r\n]?', re.M)
- old_content_nocdate = re.sub(re_cdate,"",old_content)
- new_content_nocdate = re.sub(re_cdate,"",new_content)
- if(old_content_nocdate == new_content_nocdate):
- # Messages are up-to-date
- needs_update = False
- explain = "messages in file found to be up-to-date"
- else:
- # Messages are outdated
- needs_update = True
- explain = "messages in file were outdated"
- else:
- # No POT file found, create new one
- needs_update = True
- explain = "new file"
- if needs_update:
- # Print message employing SCons.Action.Action for that.
- msg = "Writting " + repr(str(target[0])) + " (" + explain + ")"
- env.Execute(SCons.Action.Action(nop, msg))
- f = open(str(target[0]),"w")
- f.write(new_content)
- f.close()
- return 0
- else:
- # Print message employing SCons.Action.Action for that.
- msg = "Not writting " + repr(str(target[0])) + " (" + explain + ")"
- env.Execute(SCons.Action.Action(nop, msg))
- return 0
-#############################################################################
-
-#############################################################################
-from SCons.Builder import BuilderBase
-#############################################################################
-class _POTBuilder(BuilderBase):
- def _execute(self, env, target, source, *args):
- if not target:
- if env.has_key('POTDOMAIN') and env['POTDOMAIN']:
- domain = env['POTDOMAIN']
- else:
- domain = 'messages'
- target = [ domain ]
- return BuilderBase._execute(self, env, target, source, *args)
-#############################################################################
-
-#############################################################################
-def _scan_xgettext_from_files(target, source, env, files = None, path = None):
- """ Parses `POTFILES.in`-like file and returns list of extracted file names.
- """
- import re
- import SCons.Util
- import SCons.Node.FS
-
- if files is None:
- return 0
- if not SCons.Util.is_List(files):
- files = [ files ]
-
- if path is None:
- if env.has_key('XGETTEXTPATH'):
- path = env['XGETTEXTPATH']
- else:
- path = []
- if not SCons.Util.is_List(path):
- path = [ path ]
-
- path = SCons.Util.flatten(path)
-
- dirs = ()
- for p in path:
- if not isinstance(p, SCons.Node.FS.Base):
- if SCons.Util.is_String(p):
- p = env.subst(p, source = source, target = target)
- p = env.arg2nodes(p, env.fs.Dir)
- dirs += tuple(p)
- # cwd is the default search path (when no path is defined by user)
- if not dirs:
- dirs = (env.fs.getcwd(),)
-
- # Parse 'POTFILE.in' files.
- re_comment = re.compile(r'^#[^\n\r]*$\r?\n?', re.M)
- re_emptyln = re.compile(r'^[ \t\r]*$\r?\n?', re.M)
- re_trailws = re.compile(r'[ \t\r]+$')
- for f in files:
- # Find files in search path $XGETTEXTPATH
- if isinstance(f, SCons.Node.FS.Base) and f.rexists():
- contents = f.get_text_contents()
- contents = re_comment.sub("", contents)
- contents = re_emptyln.sub("", contents)
- contents = re_trailws.sub("", contents)
- depnames = contents.splitlines()
- for depname in depnames:
- depfile = SCons.Node.FS.find_file(depname, dirs)
- if not depfile:
- depfile = env.arg2nodes(depname, dirs[0].File)
- env.Depends(target, depfile)
- return 0
-#############################################################################
-
-#############################################################################
-def _pot_update_emitter(target, source, env):
- """ Emitter function for `POTUpdate` builder """
- from SCons.Tool.GettextCommon import _POTargetFactory
- import SCons.Util
- import SCons.Node.FS
-
- if env.has_key('XGETTEXTFROM'):
- xfrom = env['XGETTEXTFROM']
- else:
- return target, source
- if not SCons.Util.is_List(xfrom):
- xfrom = [ xfrom ]
-
- xfrom = SCons.Util.flatten(xfrom)
-
- # Prepare list of 'POTFILE.in' files.
- files = []
- for xf in xfrom:
- if not isinstance(xf, SCons.Node.FS.Base):
- if SCons.Util.is_String(xf):
- # Interpolate variables in strings
- xf = env.subst(xf, source = source, target = target)
- xf = env.arg2nodes(xf)
- files.extend(xf)
- if files:
- env.Depends(target, files)
- _scan_xgettext_from_files(target, source, env, files)
- return target, source
-#############################################################################
-
-#############################################################################
-from SCons.Environment import _null
-#############################################################################
-def _POTUpdateBuilderWrapper(env, target=None, source=_null, **kw):
- return env._POTUpdateBuilder(target, source, **kw)
-#############################################################################
-
-#############################################################################
-def _POTUpdateBuilder(env, **kw):
- """ Creates `POTUpdate` builder object """
- import SCons.Action
- from SCons.Tool.GettextCommon import _POTargetFactory
- kw['action'] = SCons.Action.Action(_update_pot_file, None)
- kw['suffix'] = '$POTSUFFIX'
- kw['target_factory'] = _POTargetFactory(env, alias='$POTUPDATE_ALIAS').File
- kw['emitter'] = _pot_update_emitter
- return _POTBuilder(**kw)
-#############################################################################
-
-#############################################################################
-def generate(env,**kw):
- """ Generate `xgettext` tool """
- import SCons.Util
- from SCons.Tool.GettextCommon import RPaths, _detect_xgettext
-
- try:
- env['XGETTEXT'] = _detect_xgettext(env)
- except:
- env['XGETTEXT'] = 'xgettext'
- # NOTE: sources="$SOURCES" would work as well. However, we use following
- # construction to convert absolute paths provided by scons onto paths
- # relative to current working dir. Note, that scons expands $SOURCE(S) to
- # absolute paths for sources $SOURCE(s) outside of current subtree (e.g. in
- # "../"). With source=$SOURCE these absolute paths would be written to the
- # resultant *.pot file (and its derived *.po files) as references to lines in
- # source code (e.g. referring lines in *.c files). Such references would be
- # correct (e.g. in poedit) only on machine on which *.pot was generated and
- # would be of no use on other hosts (having a copy of source code located
- # in different place in filesystem).
- sources = '$( ${_concat( "", SOURCES, "", __env__, XgettextRPaths, TARGET' \
- + ', SOURCES)} $)'
-
- # NOTE: the output from $XGETTEXTCOM command must go to stdout, not to a file.
- # This is required by the POTUpdate builder's action.
- xgettextcom = '$XGETTEXT $XGETTEXTFLAGS $_XGETTEXTPATHFLAGS' \
- + ' $_XGETTEXTFROMFLAGS -o - ' + sources
-
- xgettextpathflags = '$( ${_concat( XGETTEXTPATHPREFIX, XGETTEXTPATH' \
- + ', XGETTEXTPATHSUFFIX, __env__, RDirs, TARGET, SOURCES)} $)'
- xgettextfromflags = '$( ${_concat( XGETTEXTFROMPREFIX, XGETTEXTFROM' \
- + ', XGETTEXTFROMSUFFIX, __env__, target=TARGET, source=SOURCES)} $)'
-
- env.SetDefault(
- _XGETTEXTDOMAIN = '${TARGET.filebase}',
- XGETTEXTFLAGS = [ ],
- XGETTEXTCOM = xgettextcom,
- XGETTEXTCOMSTR = '',
- XGETTEXTPATH = [ ],
- XGETTEXTPATHPREFIX = '-D',
- XGETTEXTPATHSUFFIX = '',
- XGETTEXTFROM = None,
- XGETTEXTFROMPREFIX = '-f',
- XGETTEXTFROMSUFFIX = '',
- _XGETTEXTPATHFLAGS = xgettextpathflags,
- _XGETTEXTFROMFLAGS = xgettextfromflags,
- POTSUFFIX = ['.pot'],
- POTUPDATE_ALIAS = 'pot-update',
- XgettextRPaths = RPaths(env)
- )
- env.Append( BUILDERS = {
- '_POTUpdateBuilder' : _POTUpdateBuilder(env)
- } )
- env.AddMethod(_POTUpdateBuilderWrapper, 'POTUpdate')
- env.AlwaysBuild(env.Alias('$POTUPDATE_ALIAS'))
-#############################################################################
-
-#############################################################################
-def exists(env):
- """ Check, whether the tool exists """
- from SCons.Tool.GettextCommon import _xgettext_exists
- try:
- return _xgettext_exists(env)
- except:
- return False
-#############################################################################
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/yacc.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/yacc.py
deleted file mode 100644
index 4b8d938..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/yacc.py
+++ /dev/null
@@ -1,140 +0,0 @@
-"""SCons.Tool.yacc
-
-Tool-specific initialization for yacc.
-
-There normally shouldn't be any need to import this module directly.
-It will usually be imported through the generic SCons.Tool.Tool()
-selection method.
-
-"""
-
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-
-__revision__ = "src/engine/SCons/Tool/yacc.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-import os.path
-
-import SCons.Defaults
-import SCons.Tool
-import SCons.Util
-
-YaccAction = SCons.Action.Action("$YACCCOM", "$YACCCOMSTR")
-
-def _yaccEmitter(target, source, env, ysuf, hsuf):
- yaccflags = env.subst("$YACCFLAGS", target=target, source=source)
- flags = SCons.Util.CLVar(yaccflags)
- targetBase, targetExt = os.path.splitext(SCons.Util.to_String(target[0]))
-
- if '.ym' in ysuf: # If using Objective-C
- target = [targetBase + ".m"] # the extension is ".m".
-
-
- # If -d is specified on the command line, yacc will emit a .h
- # or .hpp file with the same name as the .c or .cpp output file.
- if '-d' in flags:
- target.append(targetBase + env.subst(hsuf, target=target, source=source))
-
- # If -g is specified on the command line, yacc will emit a .vcg
- # file with the same base name as the .y, .yacc, .ym or .yy file.
- if "-g" in flags:
- base, ext = os.path.splitext(SCons.Util.to_String(source[0]))
- target.append(base + env.subst("$YACCVCGFILESUFFIX"))
-
- # If -v is specirfied yacc will create the output debug file
- # which is not really source for any process, but should
- # be noted and also be cleaned
- # Bug #2558
- if "-v" in flags:
- env.SideEffect(targetBase+'.output',target[0])
- env.Clean(target[0],targetBase+'.output')
-
-
-
- # With --defines and --graph, the name of the file is totally defined
- # in the options.
- fileGenOptions = ["--defines=", "--graph="]
- for option in flags:
- for fileGenOption in fileGenOptions:
- l = len(fileGenOption)
- if option[:l] == fileGenOption:
- # A file generating option is present, so add the file
- # name to the list of targets.
- fileName = option[l:].strip()
- target.append(fileName)
-
- return (target, source)
-
-def yEmitter(target, source, env):
- return _yaccEmitter(target, source, env, ['.y', '.yacc'], '$YACCHFILESUFFIX')
-
-def ymEmitter(target, source, env):
- return _yaccEmitter(target, source, env, ['.ym'], '$YACCHFILESUFFIX')
-
-def yyEmitter(target, source, env):
- return _yaccEmitter(target, source, env, ['.yy'], '$YACCHXXFILESUFFIX')
-
-def generate(env):
- """Add Builders and construction variables for yacc to an Environment."""
- c_file, cxx_file = SCons.Tool.createCFileBuilders(env)
-
- # C
- c_file.add_action('.y', YaccAction)
- c_file.add_emitter('.y', yEmitter)
-
- c_file.add_action('.yacc', YaccAction)
- c_file.add_emitter('.yacc', yEmitter)
-
- # Objective-C
- c_file.add_action('.ym', YaccAction)
- c_file.add_emitter('.ym', ymEmitter)
-
- # C++
- cxx_file.add_action('.yy', YaccAction)
- cxx_file.add_emitter('.yy', yyEmitter)
-
- env['YACC'] = env.Detect('bison') or 'yacc'
- env['YACCFLAGS'] = SCons.Util.CLVar('')
- env['YACCCOM'] = '$YACC $YACCFLAGS -o $TARGET $SOURCES'
- env['YACCHFILESUFFIX'] = '.h'
-
- # Apparently, OS X now creates file.hpp like everybody else
- # I have no idea when it changed; it was fixed in 10.4
- #if env['PLATFORM'] == 'darwin':
- # # Bison on Mac OS X just appends ".h" to the generated target .cc
- # # or .cpp file name. Hooray for delayed expansion of variables.
- # env['YACCHXXFILESUFFIX'] = '${TARGET.suffix}.h'
- #else:
- # env['YACCHXXFILESUFFIX'] = '.hpp'
- env['YACCHXXFILESUFFIX'] = '.hpp'
-
- env['YACCVCGFILESUFFIX'] = '.vcg'
-
-def exists(env):
- return env.Detect(['bison', 'yacc'])
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/zip.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/zip.py
deleted file mode 100644
index 750769a..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Tool/zip.py
+++ /dev/null
@@ -1,100 +0,0 @@
-"""SCons.Tool.zip
-
-Tool-specific initialization for zip.
-
-There normally shouldn't be any need to import this module directly.
-It will usually be imported through the generic SCons.Tool.Tool()
-selection method.
-
-"""
-
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-
-__revision__ = "src/engine/SCons/Tool/zip.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-import os.path
-
-import SCons.Builder
-import SCons.Defaults
-import SCons.Node.FS
-import SCons.Util
-
-try:
- import zipfile
- internal_zip = 1
-except ImportError:
- internal_zip = 0
-
-if internal_zip:
- zipcompression = zipfile.ZIP_DEFLATED
- def zip(target, source, env):
- compression = env.get('ZIPCOMPRESSION', 0)
- zf = zipfile.ZipFile(str(target[0]), 'w', compression)
- for s in source:
- if s.isdir():
- for dirpath, dirnames, filenames in os.walk(str(s)):
- for fname in filenames:
- path = os.path.join(dirpath, fname)
- if os.path.isfile(path):
- zf.write(path, os.path.relpath(path, str(env.get('ZIPROOT', ''))))
- else:
- zf.write(str(s), os.path.relpath(str(s), str(env.get('ZIPROOT', ''))))
- zf.close()
-else:
- zipcompression = 0
- zip = "$ZIP $ZIPFLAGS ${TARGET.abspath} $SOURCES"
-
-
-zipAction = SCons.Action.Action(zip, varlist=['ZIPCOMPRESSION'])
-
-ZipBuilder = SCons.Builder.Builder(action = SCons.Action.Action('$ZIPCOM', '$ZIPCOMSTR'),
- source_factory = SCons.Node.FS.Entry,
- source_scanner = SCons.Defaults.DirScanner,
- suffix = '$ZIPSUFFIX',
- multi = 1)
-
-
-def generate(env):
- """Add Builders and construction variables for zip to an Environment."""
- try:
- bld = env['BUILDERS']['Zip']
- except KeyError:
- bld = ZipBuilder
- env['BUILDERS']['Zip'] = bld
-
- env['ZIP'] = 'zip'
- env['ZIPFLAGS'] = SCons.Util.CLVar('')
- env['ZIPCOM'] = zipAction
- env['ZIPCOMPRESSION'] = zipcompression
- env['ZIPSUFFIX'] = '.zip'
- env['ZIPROOT'] = SCons.Util.CLVar('')
-
-def exists(env):
- return internal_zip or env.Detect('zip')
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Util.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Util.py
deleted file mode 100644
index 343f0a7..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Util.py
+++ /dev/null
@@ -1,1492 +0,0 @@
-"""SCons.Util
-
-Various utility functions go here.
-"""
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-__revision__ = "src/engine/SCons/Util.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-import os
-import sys
-import copy
-import re
-import types
-
-from collections import UserDict, UserList, UserString
-
-# Don't "from types import ..." these because we need to get at the
-# types module later to look for UnicodeType.
-InstanceType = types.InstanceType
-MethodType = types.MethodType
-FunctionType = types.FunctionType
-try: unicode
-except NameError: UnicodeType = None
-else: UnicodeType = unicode
-
-def dictify(keys, values, result={}):
- for k, v in zip(keys, values):
- result[k] = v
- return result
-
-_altsep = os.altsep
-if _altsep is None and sys.platform == 'win32':
- # My ActivePython 2.0.1 doesn't set os.altsep! What gives?
- _altsep = '/'
-if _altsep:
- def rightmost_separator(path, sep):
- return max(path.rfind(sep), path.rfind(_altsep))
-else:
- def rightmost_separator(path, sep):
- return path.rfind(sep)
-
-# First two from the Python Cookbook, just for completeness.
-# (Yeah, yeah, YAGNI...)
-def containsAny(str, set):
- """Check whether sequence str contains ANY of the items in set."""
- for c in set:
- if c in str: return 1
- return 0
-
-def containsAll(str, set):
- """Check whether sequence str contains ALL of the items in set."""
- for c in set:
- if c not in str: return 0
- return 1
-
-def containsOnly(str, set):
- """Check whether sequence str contains ONLY items in set."""
- for c in str:
- if c not in set: return 0
- return 1
-
-def splitext(path):
- "Same as os.path.splitext() but faster."
- sep = rightmost_separator(path, os.sep)
- dot = path.rfind('.')
- # An ext is only real if it has at least one non-digit char
- if dot > sep and not containsOnly(path[dot:], "0123456789."):
- return path[:dot],path[dot:]
- else:
- return path,""
-
-def updrive(path):
- """
- Make the drive letter (if any) upper case.
- This is useful because Windows is inconsitent on the case
- of the drive letter, which can cause inconsistencies when
- calculating command signatures.
- """
- drive, rest = os.path.splitdrive(path)
- if drive:
- path = drive.upper() + rest
- return path
-
-class NodeList(UserList):
- """This class is almost exactly like a regular list of Nodes
- (actually it can hold any object), with one important difference.
- If you try to get an attribute from this list, it will return that
- attribute from every item in the list. For example:
-
- >>> someList = NodeList([ ' foo ', ' bar ' ])
- >>> someList.strip()
- [ 'foo', 'bar' ]
- """
- def __nonzero__(self):
- return len(self.data) != 0
-
- def __str__(self):
- return ' '.join(map(str, self.data))
-
- def __iter__(self):
- return iter(self.data)
-
- def __call__(self, *args, **kwargs):
- result = [x(*args, **kwargs) for x in self.data]
- return self.__class__(result)
-
- def __getattr__(self, name):
- result = [getattr(x, name) for x in self.data]
- return self.__class__(result)
-
-
-_get_env_var = re.compile(r'^\$([_a-zA-Z]\w*|{[_a-zA-Z]\w*})$')
-
-def get_environment_var(varstr):
- """Given a string, first determine if it looks like a reference
- to a single environment variable, like "$FOO" or "${FOO}".
- If so, return that variable with no decorations ("FOO").
- If not, return None."""
- mo=_get_env_var.match(to_String(varstr))
- if mo:
- var = mo.group(1)
- if var[0] == '{':
- return var[1:-1]
- else:
- return var
- else:
- return None
-
-class DisplayEngine(object):
- print_it = True
- def __call__(self, text, append_newline=1):
- if not self.print_it:
- return
- if append_newline: text = text + '\n'
- try:
- sys.stdout.write(unicode(text))
- except IOError:
- # Stdout might be connected to a pipe that has been closed
- # by now. The most likely reason for the pipe being closed
- # is that the user has press ctrl-c. It this is the case,
- # then SCons is currently shutdown. We therefore ignore
- # IOError's here so that SCons can continue and shutdown
- # properly so that the .sconsign is correctly written
- # before SCons exits.
- pass
-
- def set_mode(self, mode):
- self.print_it = mode
-
-def render_tree(root, child_func, prune=0, margin=[0], visited={}):
- """
- Render a tree of nodes into an ASCII tree view.
- root - the root node of the tree
- child_func - the function called to get the children of a node
- prune - don't visit the same node twice
- margin - the format of the left margin to use for children of root.
- 1 results in a pipe, and 0 results in no pipe.
- visited - a dictionary of visited nodes in the current branch if not prune,
- or in the whole tree if prune.
- """
-
- rname = str(root)
-
- children = child_func(root)
- retval = ""
- for pipe in margin[:-1]:
- if pipe:
- retval = retval + "| "
- else:
- retval = retval + " "
-
- if rname in visited:
- return retval + "+-[" + rname + "]\n"
-
- retval = retval + "+-" + rname + "\n"
- if not prune:
- visited = copy.copy(visited)
- visited[rname] = 1
-
- for i in range(len(children)):
- margin.append(i<len(children)-1)
- retval = retval + render_tree(children[i], child_func, prune, margin, visited
-)
- margin.pop()
-
- return retval
-
-IDX = lambda N: N and 1 or 0
-
-def print_tree(root, child_func, prune=0, showtags=0, margin=[0], visited={}):
- """
- Print a tree of nodes. This is like render_tree, except it prints
- lines directly instead of creating a string representation in memory,
- so that huge trees can be printed.
-
- root - the root node of the tree
- child_func - the function called to get the children of a node
- prune - don't visit the same node twice
- showtags - print status information to the left of each node line
- margin - the format of the left margin to use for children of root.
- 1 results in a pipe, and 0 results in no pipe.
- visited - a dictionary of visited nodes in the current branch if not prune,
- or in the whole tree if prune.
- """
-
- rname = str(root)
-
- if showtags:
-
- if showtags == 2:
- legend = (' E = exists\n' +
- ' R = exists in repository only\n' +
- ' b = implicit builder\n' +
- ' B = explicit builder\n' +
- ' S = side effect\n' +
- ' P = precious\n' +
- ' A = always build\n' +
- ' C = current\n' +
- ' N = no clean\n' +
- ' H = no cache\n' +
- '\n')
- sys.stdout.write(unicode(legend))
-
- tags = ['[']
- tags.append(' E'[IDX(root.exists())])
- tags.append(' R'[IDX(root.rexists() and not root.exists())])
- tags.append(' BbB'[[0,1][IDX(root.has_explicit_builder())] +
- [0,2][IDX(root.has_builder())]])
- tags.append(' S'[IDX(root.side_effect)])
- tags.append(' P'[IDX(root.precious)])
- tags.append(' A'[IDX(root.always_build)])
- tags.append(' C'[IDX(root.is_up_to_date())])
- tags.append(' N'[IDX(root.noclean)])
- tags.append(' H'[IDX(root.nocache)])
- tags.append(']')
-
- else:
- tags = []
-
- def MMM(m):
- return [" ","| "][m]
- margins = list(map(MMM, margin[:-1]))
-
- children = child_func(root)
-
- if prune and rname in visited and children:
- sys.stdout.write(''.join(tags + margins + ['+-[', rname, ']']) + u'\n')
- return
-
- sys.stdout.write(''.join(tags + margins + ['+-', rname]) + u'\n')
-
- visited[rname] = 1
-
- if children:
- margin.append(1)
- idx = IDX(showtags)
- for C in children[:-1]:
- print_tree(C, child_func, prune, idx, margin, visited)
- margin[-1] = 0
- print_tree(children[-1], child_func, prune, idx, margin, visited)
- margin.pop()
-
-
-
-# Functions for deciding if things are like various types, mainly to
-# handle UserDict, UserList and UserString like their underlying types.
-#
-# Yes, all of this manual testing breaks polymorphism, and the real
-# Pythonic way to do all of this would be to just try it and handle the
-# exception, but handling the exception when it's not the right type is
-# often too slow.
-
-# We are using the following trick to speed up these
-# functions. Default arguments are used to take a snapshot of the
-# the global functions and constants used by these functions. This
-# transforms accesses to global variable into local variables
-# accesses (i.e. LOAD_FAST instead of LOAD_GLOBAL).
-
-DictTypes = (dict, UserDict)
-ListTypes = (list, UserList)
-SequenceTypes = (list, tuple, UserList)
-
-# Note that profiling data shows a speed-up when comparing
-# explicitely with str and unicode instead of simply comparing
-# with basestring. (at least on Python 2.5.1)
-StringTypes = (str, unicode, UserString)
-
-# Empirically, it is faster to check explicitely for str and
-# unicode than for basestring.
-BaseStringTypes = (str, unicode)
-
-def is_Dict(obj, isinstance=isinstance, DictTypes=DictTypes):
- return isinstance(obj, DictTypes)
-
-def is_List(obj, isinstance=isinstance, ListTypes=ListTypes):
- return isinstance(obj, ListTypes)
-
-def is_Sequence(obj, isinstance=isinstance, SequenceTypes=SequenceTypes):
- return isinstance(obj, SequenceTypes)
-
-def is_Tuple(obj, isinstance=isinstance, tuple=tuple):
- return isinstance(obj, tuple)
-
-def is_String(obj, isinstance=isinstance, StringTypes=StringTypes):
- return isinstance(obj, StringTypes)
-
-def is_Scalar(obj, isinstance=isinstance, StringTypes=StringTypes, SequenceTypes=SequenceTypes):
- # Profiling shows that there is an impressive speed-up of 2x
- # when explicitely checking for strings instead of just not
- # sequence when the argument (i.e. obj) is already a string.
- # But, if obj is a not string then it is twice as fast to
- # check only for 'not sequence'. The following code therefore
- # assumes that the obj argument is a string must of the time.
- return isinstance(obj, StringTypes) or not isinstance(obj, SequenceTypes)
-
-def do_flatten(sequence, result, isinstance=isinstance,
- StringTypes=StringTypes, SequenceTypes=SequenceTypes):
- for item in sequence:
- if isinstance(item, StringTypes) or not isinstance(item, SequenceTypes):
- result.append(item)
- else:
- do_flatten(item, result)
-
-def flatten(obj, isinstance=isinstance, StringTypes=StringTypes,
- SequenceTypes=SequenceTypes, do_flatten=do_flatten):
- """Flatten a sequence to a non-nested list.
-
- Flatten() converts either a single scalar or a nested sequence
- to a non-nested list. Note that flatten() considers strings
- to be scalars instead of sequences like Python would.
- """
- if isinstance(obj, StringTypes) or not isinstance(obj, SequenceTypes):
- return [obj]
- result = []
- for item in obj:
- if isinstance(item, StringTypes) or not isinstance(item, SequenceTypes):
- result.append(item)
- else:
- do_flatten(item, result)
- return result
-
-def flatten_sequence(sequence, isinstance=isinstance, StringTypes=StringTypes,
- SequenceTypes=SequenceTypes, do_flatten=do_flatten):
- """Flatten a sequence to a non-nested list.
-
- Same as flatten(), but it does not handle the single scalar
- case. This is slightly more efficient when one knows that
- the sequence to flatten can not be a scalar.
- """
- result = []
- for item in sequence:
- if isinstance(item, StringTypes) or not isinstance(item, SequenceTypes):
- result.append(item)
- else:
- do_flatten(item, result)
- return result
-
-# Generic convert-to-string functions that abstract away whether or
-# not the Python we're executing has Unicode support. The wrapper
-# to_String_for_signature() will use a for_signature() method if the
-# specified object has one.
-#
-def to_String(s,
- isinstance=isinstance, str=str,
- UserString=UserString, BaseStringTypes=BaseStringTypes):
- if isinstance(s,BaseStringTypes):
- # Early out when already a string!
- return s
- elif isinstance(s, UserString):
- # s.data can only be either a unicode or a regular
- # string. Please see the UserString initializer.
- return s.data
- else:
- return str(s)
-
-def to_String_for_subst(s,
- isinstance=isinstance, str=str, to_String=to_String,
- BaseStringTypes=BaseStringTypes, SequenceTypes=SequenceTypes,
- UserString=UserString):
-
- # Note that the test cases are sorted by order of probability.
- if isinstance(s, BaseStringTypes):
- return s
- elif isinstance(s, SequenceTypes):
- l = []
- for e in s:
- l.append(to_String_for_subst(e))
- return ' '.join( s )
- elif isinstance(s, UserString):
- # s.data can only be either a unicode or a regular
- # string. Please see the UserString initializer.
- return s.data
- else:
- return str(s)
-
-def to_String_for_signature(obj, to_String_for_subst=to_String_for_subst,
- AttributeError=AttributeError):
- try:
- f = obj.for_signature
- except AttributeError:
- return to_String_for_subst(obj)
- else:
- return f()
-
-
-# The SCons "semi-deep" copy.
-#
-# This makes separate copies of lists (including UserList objects)
-# dictionaries (including UserDict objects) and tuples, but just copies
-# references to anything else it finds.
-#
-# A special case is any object that has a __semi_deepcopy__() method,
-# which we invoke to create the copy. Currently only used by
-# BuilderDict to actually prevent the copy operation (as invalid on that object)
-#
-# The dispatch table approach used here is a direct rip-off from the
-# normal Python copy module.
-
-_semi_deepcopy_dispatch = d = {}
-
-def semi_deepcopy_dict(x, exclude = [] ):
- copy = {}
- for key, val in x.items():
- # The regular Python copy.deepcopy() also deepcopies the key,
- # as follows:
- #
- # copy[semi_deepcopy(key)] = semi_deepcopy(val)
- #
- # Doesn't seem like we need to, but we'll comment it just in case.
- if key not in exclude:
- copy[key] = semi_deepcopy(val)
- return copy
-d[dict] = semi_deepcopy_dict
-
-def _semi_deepcopy_list(x):
- return list(map(semi_deepcopy, x))
-d[list] = _semi_deepcopy_list
-
-def _semi_deepcopy_tuple(x):
- return tuple(map(semi_deepcopy, x))
-d[tuple] = _semi_deepcopy_tuple
-
-def semi_deepcopy(x):
- copier = _semi_deepcopy_dispatch.get(type(x))
- if copier:
- return copier(x)
- else:
- if hasattr(x, '__semi_deepcopy__') and callable(x.__semi_deepcopy__):
- return x.__semi_deepcopy__()
- elif isinstance(x, UserDict):
- return x.__class__(semi_deepcopy_dict(x))
- elif isinstance(x, UserList):
- return x.__class__(_semi_deepcopy_list(x))
-
- return x
-
-
-class Proxy(object):
- """A simple generic Proxy class, forwarding all calls to
- subject. So, for the benefit of the python newbie, what does
- this really mean? Well, it means that you can take an object, let's
- call it 'objA', and wrap it in this Proxy class, with a statement
- like this
-
- proxyObj = Proxy(objA),
-
- Then, if in the future, you do something like this
-
- x = proxyObj.var1,
-
- since Proxy does not have a 'var1' attribute (but presumably objA does),
- the request actually is equivalent to saying
-
- x = objA.var1
-
- Inherit from this class to create a Proxy.
-
- Note that, with new-style classes, this does *not* work transparently
- for Proxy subclasses that use special .__*__() method names, because
- those names are now bound to the class, not the individual instances.
- You now need to know in advance which .__*__() method names you want
- to pass on to the underlying Proxy object, and specifically delegate
- their calls like this:
-
- class Foo(Proxy):
- __str__ = Delegate('__str__')
- """
-
- def __init__(self, subject):
- """Wrap an object as a Proxy object"""
- self._subject = subject
-
- def __getattr__(self, name):
- """Retrieve an attribute from the wrapped object. If the named
- attribute doesn't exist, AttributeError is raised"""
- return getattr(self._subject, name)
-
- def get(self):
- """Retrieve the entire wrapped object"""
- return self._subject
-
- def __cmp__(self, other):
- if issubclass(other.__class__, self._subject.__class__):
- return cmp(self._subject, other)
- return cmp(self.__dict__, other.__dict__)
-
-class Delegate(object):
- """A Python Descriptor class that delegates attribute fetches
- to an underlying wrapped subject of a Proxy. Typical use:
-
- class Foo(Proxy):
- __str__ = Delegate('__str__')
- """
- def __init__(self, attribute):
- self.attribute = attribute
- def __get__(self, obj, cls):
- if isinstance(obj, cls):
- return getattr(obj._subject, self.attribute)
- else:
- return self
-
-# attempt to load the windows registry module:
-can_read_reg = 0
-try:
- import winreg
-
- can_read_reg = 1
- hkey_mod = winreg
-
- RegOpenKeyEx = winreg.OpenKeyEx
- RegEnumKey = winreg.EnumKey
- RegEnumValue = winreg.EnumValue
- RegQueryValueEx = winreg.QueryValueEx
- RegError = winreg.error
-
-except ImportError:
- try:
- import win32api
- import win32con
- can_read_reg = 1
- hkey_mod = win32con
-
- RegOpenKeyEx = win32api.RegOpenKeyEx
- RegEnumKey = win32api.RegEnumKey
- RegEnumValue = win32api.RegEnumValue
- RegQueryValueEx = win32api.RegQueryValueEx
- RegError = win32api.error
-
- except ImportError:
- class _NoError(Exception):
- pass
- RegError = _NoError
-
-if can_read_reg:
- HKEY_CLASSES_ROOT = hkey_mod.HKEY_CLASSES_ROOT
- HKEY_LOCAL_MACHINE = hkey_mod.HKEY_LOCAL_MACHINE
- HKEY_CURRENT_USER = hkey_mod.HKEY_CURRENT_USER
- HKEY_USERS = hkey_mod.HKEY_USERS
-
- def RegGetValue(root, key):
- """This utility function returns a value in the registry
- without having to open the key first. Only available on
- Windows platforms with a version of Python that can read the
- registry. Returns the same thing as
- SCons.Util.RegQueryValueEx, except you just specify the entire
- path to the value, and don't have to bother opening the key
- first. So:
-
- Instead of:
- k = SCons.Util.RegOpenKeyEx(SCons.Util.HKEY_LOCAL_MACHINE,
- r'SOFTWARE\Microsoft\Windows\CurrentVersion')
- out = SCons.Util.RegQueryValueEx(k,
- 'ProgramFilesDir')
-
- You can write:
- out = SCons.Util.RegGetValue(SCons.Util.HKEY_LOCAL_MACHINE,
- r'SOFTWARE\Microsoft\Windows\CurrentVersion\ProgramFilesDir')
- """
- # I would use os.path.split here, but it's not a filesystem
- # path...
- p = key.rfind('\\') + 1
- keyp = key[:p-1] # -1 to omit trailing slash
- val = key[p:]
- k = RegOpenKeyEx(root, keyp)
- return RegQueryValueEx(k,val)
-else:
- try:
- e = WindowsError
- except NameError:
- # Make sure we have a definition of WindowsError so we can
- # run platform-independent tests of Windows functionality on
- # platforms other than Windows. (WindowsError is, in fact, an
- # OSError subclass on Windows.)
- class WindowsError(OSError):
- pass
- import builtins
- builtins.WindowsError = WindowsError
- else:
- del e
-
- HKEY_CLASSES_ROOT = None
- HKEY_LOCAL_MACHINE = None
- HKEY_CURRENT_USER = None
- HKEY_USERS = None
-
- def RegGetValue(root, key):
- raise WindowsError
-
- def RegOpenKeyEx(root, key):
- raise WindowsError
-
-if sys.platform == 'win32':
-
- def WhereIs(file, path=None, pathext=None, reject=[]):
- if path is None:
- try:
- path = os.environ['PATH']
- except KeyError:
- return None
- if is_String(path):
- path = path.split(os.pathsep)
- if pathext is None:
- try:
- pathext = os.environ['PATHEXT']
- except KeyError:
- pathext = '.COM;.EXE;.BAT;.CMD'
- if is_String(pathext):
- pathext = pathext.split(os.pathsep)
- for ext in pathext:
- if ext.lower() == file[-len(ext):].lower():
- pathext = ['']
- break
- if not is_List(reject) and not is_Tuple(reject):
- reject = [reject]
- for dir in path:
- f = os.path.join(dir, file)
- for ext in pathext:
- fext = f + ext
- if os.path.isfile(fext):
- try:
- reject.index(fext)
- except ValueError:
- return os.path.normpath(fext)
- continue
- return None
-
-elif os.name == 'os2':
-
- def WhereIs(file, path=None, pathext=None, reject=[]):
- if path is None:
- try:
- path = os.environ['PATH']
- except KeyError:
- return None
- if is_String(path):
- path = path.split(os.pathsep)
- if pathext is None:
- pathext = ['.exe', '.cmd']
- for ext in pathext:
- if ext.lower() == file[-len(ext):].lower():
- pathext = ['']
- break
- if not is_List(reject) and not is_Tuple(reject):
- reject = [reject]
- for dir in path:
- f = os.path.join(dir, file)
- for ext in pathext:
- fext = f + ext
- if os.path.isfile(fext):
- try:
- reject.index(fext)
- except ValueError:
- return os.path.normpath(fext)
- continue
- return None
-
-else:
-
- def WhereIs(file, path=None, pathext=None, reject=[]):
- import stat
- if path is None:
- try:
- path = os.environ['PATH']
- except KeyError:
- return None
- if is_String(path):
- path = path.split(os.pathsep)
- if not is_List(reject) and not is_Tuple(reject):
- reject = [reject]
- for d in path:
- f = os.path.join(d, file)
- if os.path.isfile(f):
- try:
- st = os.stat(f)
- except OSError:
- # os.stat() raises OSError, not IOError if the file
- # doesn't exist, so in this case we let IOError get
- # raised so as to not mask possibly serious disk or
- # network issues.
- continue
- if stat.S_IMODE(st[stat.ST_MODE]) & 0111:
- try:
- reject.index(f)
- except ValueError:
- return os.path.normpath(f)
- continue
- return None
-
-def PrependPath(oldpath, newpath, sep = os.pathsep,
- delete_existing=1, canonicalize=None):
- """This prepends newpath elements to the given oldpath. Will only
- add any particular path once (leaving the first one it encounters
- and ignoring the rest, to preserve path order), and will
- os.path.normpath and os.path.normcase all paths to help assure
- this. This can also handle the case where the given old path
- variable is a list instead of a string, in which case a list will
- be returned instead of a string.
-
- Example:
- Old Path: "/foo/bar:/foo"
- New Path: "/biz/boom:/foo"
- Result: "/biz/boom:/foo:/foo/bar"
-
- If delete_existing is 0, then adding a path that exists will
- not move it to the beginning; it will stay where it is in the
- list.
-
- If canonicalize is not None, it is applied to each element of
- newpath before use.
- """
-
- orig = oldpath
- is_list = 1
- paths = orig
- if not is_List(orig) and not is_Tuple(orig):
- paths = paths.split(sep)
- is_list = 0
-
- if is_String(newpath):
- newpaths = newpath.split(sep)
- elif not is_List(newpath) and not is_Tuple(newpath):
- newpaths = [ newpath ] # might be a Dir
- else:
- newpaths = newpath
-
- if canonicalize:
- newpaths=list(map(canonicalize, newpaths))
-
- if not delete_existing:
- # First uniquify the old paths, making sure to
- # preserve the first instance (in Unix/Linux,
- # the first one wins), and remembering them in normpaths.
- # Then insert the new paths at the head of the list
- # if they're not already in the normpaths list.
- result = []
- normpaths = []
- for path in paths:
- if not path:
- continue
- normpath = os.path.normpath(os.path.normcase(path))
- if normpath not in normpaths:
- result.append(path)
- normpaths.append(normpath)
- newpaths.reverse() # since we're inserting at the head
- for path in newpaths:
- if not path:
- continue
- normpath = os.path.normpath(os.path.normcase(path))
- if normpath not in normpaths:
- result.insert(0, path)
- normpaths.append(normpath)
- paths = result
-
- else:
- newpaths = newpaths + paths # prepend new paths
-
- normpaths = []
- paths = []
- # now we add them only if they are unique
- for path in newpaths:
- normpath = os.path.normpath(os.path.normcase(path))
- if path and not normpath in normpaths:
- paths.append(path)
- normpaths.append(normpath)
-
- if is_list:
- return paths
- else:
- return sep.join(paths)
-
-def AppendPath(oldpath, newpath, sep = os.pathsep,
- delete_existing=1, canonicalize=None):
- """This appends new path elements to the given old path. Will
- only add any particular path once (leaving the last one it
- encounters and ignoring the rest, to preserve path order), and
- will os.path.normpath and os.path.normcase all paths to help
- assure this. This can also handle the case where the given old
- path variable is a list instead of a string, in which case a list
- will be returned instead of a string.
-
- Example:
- Old Path: "/foo/bar:/foo"
- New Path: "/biz/boom:/foo"
- Result: "/foo/bar:/biz/boom:/foo"
-
- If delete_existing is 0, then adding a path that exists
- will not move it to the end; it will stay where it is in the list.
-
- If canonicalize is not None, it is applied to each element of
- newpath before use.
- """
-
- orig = oldpath
- is_list = 1
- paths = orig
- if not is_List(orig) and not is_Tuple(orig):
- paths = paths.split(sep)
- is_list = 0
-
- if is_String(newpath):
- newpaths = newpath.split(sep)
- elif not is_List(newpath) and not is_Tuple(newpath):
- newpaths = [ newpath ] # might be a Dir
- else:
- newpaths = newpath
-
- if canonicalize:
- newpaths=list(map(canonicalize, newpaths))
-
- if not delete_existing:
- # add old paths to result, then
- # add new paths if not already present
- # (I thought about using a dict for normpaths for speed,
- # but it's not clear hashing the strings would be faster
- # than linear searching these typically short lists.)
- result = []
- normpaths = []
- for path in paths:
- if not path:
- continue
- result.append(path)
- normpaths.append(os.path.normpath(os.path.normcase(path)))
- for path in newpaths:
- if not path:
- continue
- normpath = os.path.normpath(os.path.normcase(path))
- if normpath not in normpaths:
- result.append(path)
- normpaths.append(normpath)
- paths = result
- else:
- # start w/ new paths, add old ones if not present,
- # then reverse.
- newpaths = paths + newpaths # append new paths
- newpaths.reverse()
-
- normpaths = []
- paths = []
- # now we add them only if they are unique
- for path in newpaths:
- normpath = os.path.normpath(os.path.normcase(path))
- if path and not normpath in normpaths:
- paths.append(path)
- normpaths.append(normpath)
- paths.reverse()
-
- if is_list:
- return paths
- else:
- return sep.join(paths)
-
-if sys.platform == 'cygwin':
- def get_native_path(path):
- """Transforms an absolute path into a native path for the system. In
- Cygwin, this converts from a Cygwin path to a Windows one."""
- return os.popen('cygpath -w ' + path).read().replace('\n', '')
-else:
- def get_native_path(path):
- """Transforms an absolute path into a native path for the system.
- Non-Cygwin version, just leave the path alone."""
- return path
-
-display = DisplayEngine()
-
-def Split(arg):
- if is_List(arg) or is_Tuple(arg):
- return arg
- elif is_String(arg):
- return arg.split()
- else:
- return [arg]
-
-class CLVar(UserList):
- """A class for command-line construction variables.
-
- This is a list that uses Split() to split an initial string along
- white-space arguments, and similarly to split any strings that get
- added. This allows us to Do the Right Thing with Append() and
- Prepend() (as well as straight Python foo = env['VAR'] + 'arg1
- arg2') regardless of whether a user adds a list or a string to a
- command-line construction variable.
- """
- def __init__(self, seq = []):
- UserList.__init__(self, Split(seq))
- def __add__(self, other):
- return UserList.__add__(self, CLVar(other))
- def __radd__(self, other):
- return UserList.__radd__(self, CLVar(other))
- def __coerce__(self, other):
- return (self, CLVar(other))
- def __str__(self):
- return ' '.join(self.data)
-
-# A dictionary that preserves the order in which items are added.
-# Submitted by David Benjamin to ActiveState's Python Cookbook web site:
-# http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/107747
-# Including fixes/enhancements from the follow-on discussions.
-class OrderedDict(UserDict):
- def __init__(self, dict = None):
- self._keys = []
- UserDict.__init__(self, dict)
-
- def __delitem__(self, key):
- UserDict.__delitem__(self, key)
- self._keys.remove(key)
-
- def __setitem__(self, key, item):
- UserDict.__setitem__(self, key, item)
- if key not in self._keys: self._keys.append(key)
-
- def clear(self):
- UserDict.clear(self)
- self._keys = []
-
- def copy(self):
- dict = OrderedDict()
- dict.update(self)
- return dict
-
- def items(self):
- return list(zip(self._keys, list(self.values())))
-
- def keys(self):
- return self._keys[:]
-
- def popitem(self):
- try:
- key = self._keys[-1]
- except IndexError:
- raise KeyError('dictionary is empty')
-
- val = self[key]
- del self[key]
-
- return (key, val)
-
- def setdefault(self, key, failobj = None):
- UserDict.setdefault(self, key, failobj)
- if key not in self._keys: self._keys.append(key)
-
- def update(self, dict):
- for (key, val) in dict.items():
- self.__setitem__(key, val)
-
- def values(self):
- return list(map(self.get, self._keys))
-
-class Selector(OrderedDict):
- """A callable ordered dictionary that maps file suffixes to
- dictionary values. We preserve the order in which items are added
- so that get_suffix() calls always return the first suffix added."""
- def __call__(self, env, source, ext=None):
- if ext is None:
- try:
- ext = source[0].get_suffix()
- except IndexError:
- ext = ""
- try:
- return self[ext]
- except KeyError:
- # Try to perform Environment substitution on the keys of
- # the dictionary before giving up.
- s_dict = {}
- for (k,v) in self.items():
- if k is not None:
- s_k = env.subst(k)
- if s_k in s_dict:
- # We only raise an error when variables point
- # to the same suffix. If one suffix is literal
- # and a variable suffix contains this literal,
- # the literal wins and we don't raise an error.
- raise KeyError(s_dict[s_k][0], k, s_k)
- s_dict[s_k] = (k,v)
- try:
- return s_dict[ext][1]
- except KeyError:
- try:
- return self[None]
- except KeyError:
- return None
-
-
-if sys.platform == 'cygwin':
- # On Cygwin, os.path.normcase() lies, so just report back the
- # fact that the underlying Windows OS is case-insensitive.
- def case_sensitive_suffixes(s1, s2):
- return 0
-else:
- def case_sensitive_suffixes(s1, s2):
- return (os.path.normcase(s1) != os.path.normcase(s2))
-
-def adjustixes(fname, pre, suf, ensure_suffix=False):
- if pre:
- path, fn = os.path.split(os.path.normpath(fname))
- if fn[:len(pre)] != pre:
- fname = os.path.join(path, pre + fn)
- # Only append a suffix if the suffix we're going to add isn't already
- # there, and if either we've been asked to ensure the specific suffix
- # is present or there's no suffix on it at all.
- if suf and fname[-len(suf):] != suf and \
- (ensure_suffix or not splitext(fname)[1]):
- fname = fname + suf
- return fname
-
-
-
-# From Tim Peters,
-# http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/52560
-# ASPN: Python Cookbook: Remove duplicates from a sequence
-# (Also in the printed Python Cookbook.)
-
-def unique(s):
- """Return a list of the elements in s, but without duplicates.
-
- For example, unique([1,2,3,1,2,3]) is some permutation of [1,2,3],
- unique("abcabc") some permutation of ["a", "b", "c"], and
- unique(([1, 2], [2, 3], [1, 2])) some permutation of
- [[2, 3], [1, 2]].
-
- For best speed, all sequence elements should be hashable. Then
- unique() will usually work in linear time.
-
- If not possible, the sequence elements should enjoy a total
- ordering, and if list(s).sort() doesn't raise TypeError it's
- assumed that they do enjoy a total ordering. Then unique() will
- usually work in O(N*log2(N)) time.
-
- If that's not possible either, the sequence elements must support
- equality-testing. Then unique() will usually work in quadratic
- time.
- """
-
- n = len(s)
- if n == 0:
- return []
-
- # Try using a dict first, as that's the fastest and will usually
- # work. If it doesn't work, it will usually fail quickly, so it
- # usually doesn't cost much to *try* it. It requires that all the
- # sequence elements be hashable, and support equality comparison.
- u = {}
- try:
- for x in s:
- u[x] = 1
- except TypeError:
- pass # move on to the next method
- else:
- return list(u.keys())
- del u
-
- # We can't hash all the elements. Second fastest is to sort,
- # which brings the equal elements together; then duplicates are
- # easy to weed out in a single pass.
- # NOTE: Python's list.sort() was designed to be efficient in the
- # presence of many duplicate elements. This isn't true of all
- # sort functions in all languages or libraries, so this approach
- # is more effective in Python than it may be elsewhere.
- try:
- t = sorted(s)
- except TypeError:
- pass # move on to the next method
- else:
- assert n > 0
- last = t[0]
- lasti = i = 1
- while i < n:
- if t[i] != last:
- t[lasti] = last = t[i]
- lasti = lasti + 1
- i = i + 1
- return t[:lasti]
- del t
-
- # Brute force is all that's left.
- u = []
- for x in s:
- if x not in u:
- u.append(x)
- return u
-
-
-
-# From Alex Martelli,
-# http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/52560
-# ASPN: Python Cookbook: Remove duplicates from a sequence
-# First comment, dated 2001/10/13.
-# (Also in the printed Python Cookbook.)
-
-def uniquer(seq, idfun=None):
- if idfun is None:
- def idfun(x): return x
- seen = {}
- result = []
- for item in seq:
- marker = idfun(item)
- # in old Python versions:
- # if seen.has_key(marker)
- # but in new ones:
- if marker in seen: continue
- seen[marker] = 1
- result.append(item)
- return result
-
-# A more efficient implementation of Alex's uniquer(), this avoids the
-# idfun() argument and function-call overhead by assuming that all
-# items in the sequence are hashable.
-
-def uniquer_hashables(seq):
- seen = {}
- result = []
- for item in seq:
- #if not item in seen:
- if item not in seen:
- seen[item] = 1
- result.append(item)
- return result
-
-
-
-# Much of the logic here was originally based on recipe 4.9 from the
-# Python CookBook, but we had to dumb it way down for Python 1.5.2.
-class LogicalLines(object):
-
- def __init__(self, fileobj):
- self.fileobj = fileobj
-
- def readline(self):
- result = []
- while True:
- line = self.fileobj.readline()
- if not line:
- break
- if line[-2:] == '\\\n':
- result.append(line[:-2])
- else:
- result.append(line)
- break
- return ''.join(result)
-
- def readlines(self):
- result = []
- while True:
- line = self.readline()
- if not line:
- break
- result.append(line)
- return result
-
-
-
-class UniqueList(UserList):
- def __init__(self, seq = []):
- UserList.__init__(self, seq)
- self.unique = True
- def __make_unique(self):
- if not self.unique:
- self.data = uniquer_hashables(self.data)
- self.unique = True
- def __lt__(self, other):
- self.__make_unique()
- return UserList.__lt__(self, other)
- def __le__(self, other):
- self.__make_unique()
- return UserList.__le__(self, other)
- def __eq__(self, other):
- self.__make_unique()
- return UserList.__eq__(self, other)
- def __ne__(self, other):
- self.__make_unique()
- return UserList.__ne__(self, other)
- def __gt__(self, other):
- self.__make_unique()
- return UserList.__gt__(self, other)
- def __ge__(self, other):
- self.__make_unique()
- return UserList.__ge__(self, other)
- def __cmp__(self, other):
- self.__make_unique()
- return UserList.__cmp__(self, other)
- def __len__(self):
- self.__make_unique()
- return UserList.__len__(self)
- def __getitem__(self, i):
- self.__make_unique()
- return UserList.__getitem__(self, i)
- def __setitem__(self, i, item):
- UserList.__setitem__(self, i, item)
- self.unique = False
- def __getslice__(self, i, j):
- self.__make_unique()
- return UserList.__getslice__(self, i, j)
- def __setslice__(self, i, j, other):
- UserList.__setslice__(self, i, j, other)
- self.unique = False
- def __add__(self, other):
- result = UserList.__add__(self, other)
- result.unique = False
- return result
- def __radd__(self, other):
- result = UserList.__radd__(self, other)
- result.unique = False
- return result
- def __iadd__(self, other):
- result = UserList.__iadd__(self, other)
- result.unique = False
- return result
- def __mul__(self, other):
- result = UserList.__mul__(self, other)
- result.unique = False
- return result
- def __rmul__(self, other):
- result = UserList.__rmul__(self, other)
- result.unique = False
- return result
- def __imul__(self, other):
- result = UserList.__imul__(self, other)
- result.unique = False
- return result
- def append(self, item):
- UserList.append(self, item)
- self.unique = False
- def insert(self, i):
- UserList.insert(self, i)
- self.unique = False
- def count(self, item):
- self.__make_unique()
- return UserList.count(self, item)
- def index(self, item):
- self.__make_unique()
- return UserList.index(self, item)
- def reverse(self):
- self.__make_unique()
- UserList.reverse(self)
- def sort(self, *args, **kwds):
- self.__make_unique()
- return UserList.sort(self, *args, **kwds)
- def extend(self, other):
- UserList.extend(self, other)
- self.unique = False
-
-
-class Unbuffered(object):
- """
- A proxy class that wraps a file object, flushing after every write,
- and delegating everything else to the wrapped object.
- """
- def __init__(self, file):
- self.file = file
- self.softspace = 0 ## backward compatibility; not supported in Py3k
- def write(self, arg):
- try:
- self.file.write(arg)
- self.file.flush()
- except IOError:
- # Stdout might be connected to a pipe that has been closed
- # by now. The most likely reason for the pipe being closed
- # is that the user has press ctrl-c. It this is the case,
- # then SCons is currently shutdown. We therefore ignore
- # IOError's here so that SCons can continue and shutdown
- # properly so that the .sconsign is correctly written
- # before SCons exits.
- pass
- def __getattr__(self, attr):
- return getattr(self.file, attr)
-
-def make_path_relative(path):
- """ makes an absolute path name to a relative pathname.
- """
- if os.path.isabs(path):
- drive_s,path = os.path.splitdrive(path)
-
- import re
- if not drive_s:
- path=re.compile("/*(.*)").findall(path)[0]
- else:
- path=path[1:]
-
- assert( not os.path.isabs( path ) ), path
- return path
-
-
-
-# The original idea for AddMethod() and RenameFunction() come from the
-# following post to the ActiveState Python Cookbook:
-#
-# ASPN: Python Cookbook : Install bound methods in an instance
-# http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/223613
-#
-# That code was a little fragile, though, so the following changes
-# have been wrung on it:
-#
-# * Switched the installmethod() "object" and "function" arguments,
-# so the order reflects that the left-hand side is the thing being
-# "assigned to" and the right-hand side is the value being assigned.
-#
-# * Changed explicit type-checking to the "try: klass = object.__class__"
-# block in installmethod() below so that it still works with the
-# old-style classes that SCons uses.
-#
-# * Replaced the by-hand creation of methods and functions with use of
-# the "new" module, as alluded to in Alex Martelli's response to the
-# following Cookbook post:
-#
-# ASPN: Python Cookbook : Dynamically added methods to a class
-# http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/81732
-
-def AddMethod(obj, function, name=None):
- """
- Adds either a bound method to an instance or an unbound method to
- a class. If name is ommited the name of the specified function
- is used by default.
- Example:
- a = A()
- def f(self, x, y):
- self.z = x + y
- AddMethod(f, A, "add")
- a.add(2, 4)
- print a.z
- AddMethod(lambda self, i: self.l[i], a, "listIndex")
- print a.listIndex(5)
- """
- if name is None:
- name = function.func_name
- else:
- function = RenameFunction(function, name)
-
- if hasattr(obj, '__class__') and obj.__class__ is not type:
- # "obj" is an instance, so it gets a bound method.
- setattr(obj, name, MethodType(function, obj, obj.__class__))
- else:
- # "obj" is a class, so it gets an unbound method.
- setattr(obj, name, MethodType(function, None, obj))
-
-def RenameFunction(function, name):
- """
- Returns a function identical to the specified function, but with
- the specified name.
- """
- return FunctionType(function.func_code,
- function.func_globals,
- name,
- function.func_defaults)
-
-
-md5 = False
-def MD5signature(s):
- return str(s)
-
-def MD5filesignature(fname, chunksize=65536):
- f = open(fname, "rb")
- result = f.read()
- f.close()
- return result
-
-try:
- import hashlib
-except ImportError:
- pass
-else:
- if hasattr(hashlib, 'md5'):
- md5 = True
- def MD5signature(s):
- m = hashlib.md5()
- m.update(str(s))
- return m.hexdigest()
-
- def MD5filesignature(fname, chunksize=65536):
- m = hashlib.md5()
- f = open(fname, "rb")
- while True:
- blck = f.read(chunksize)
- if not blck:
- break
- m.update(str(blck))
- f.close()
- return m.hexdigest()
-
-def MD5collect(signatures):
- """
- Collects a list of signatures into an aggregate signature.
-
- signatures - a list of signatures
- returns - the aggregate signature
- """
- if len(signatures) == 1:
- return signatures[0]
- else:
- return MD5signature(', '.join(signatures))
-
-
-
-def silent_intern(x):
- """
- Perform sys.intern() on the passed argument and return the result.
- If the input is ineligible (e.g. a unicode string) the original argument is
- returned and no exception is thrown.
- """
- try:
- return sys.intern(x)
- except TypeError:
- return x
-
-
-
-# From Dinu C. Gherman,
-# Python Cookbook, second edition, recipe 6.17, p. 277.
-# Also:
-# http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/68205
-# ASPN: Python Cookbook: Null Object Design Pattern
-
-#TODO??? class Null(object):
-class Null(object):
- """ Null objects always and reliably "do nothing." """
- def __new__(cls, *args, **kwargs):
- if not '_instance' in vars(cls):
- cls._instance = super(Null, cls).__new__(cls, *args, **kwargs)
- return cls._instance
- def __init__(self, *args, **kwargs):
- pass
- def __call__(self, *args, **kwargs):
- return self
- def __repr__(self):
- return "Null(0x%08X)" % id(self)
- def __nonzero__(self):
- return False
- def __getattr__(self, name):
- return self
- def __setattr__(self, name, value):
- return self
- def __delattr__(self, name):
- return self
-
-class NullSeq(Null):
- def __len__(self):
- return 0
- def __iter__(self):
- return iter(())
- def __getitem__(self, i):
- return self
- def __delitem__(self, i):
- return self
- def __setitem__(self, i, v):
- return self
-
-
-del __revision__
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Variables/BoolVariable.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Variables/BoolVariable.py
deleted file mode 100644
index 1594559..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Variables/BoolVariable.py
+++ /dev/null
@@ -1,89 +0,0 @@
-"""engine.SCons.Variables.BoolVariable
-
-This file defines the option type for SCons implementing true/false values.
-
-Usage example:
-
- opts = Variables()
- opts.Add(BoolVariable('embedded', 'build for an embedded system', 0))
- ...
- if env['embedded'] == 1:
- ...
-"""
-
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-
-__revision__ = "src/engine/SCons/Variables/BoolVariable.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-__all__ = ['BoolVariable',]
-
-import SCons.Errors
-
-__true_strings = ('y', 'yes', 'true', 't', '1', 'on' , 'all' )
-__false_strings = ('n', 'no', 'false', 'f', '0', 'off', 'none')
-
-
-def _text2bool(val):
- """
- Converts strings to True/False depending on the 'truth' expressed by
- the string. If the string can't be converted, the original value
- will be returned.
-
- See '__true_strings' and '__false_strings' for values considered
- 'true' or 'false respectivly.
-
- This is usable as 'converter' for SCons' Variables.
- """
- lval = val.lower()
- if lval in __true_strings: return True
- if lval in __false_strings: return False
- raise ValueError("Invalid value for boolean option: %s" % val)
-
-
-def _validator(key, val, env):
- """
- Validates the given value to be either '0' or '1'.
-
- This is usable as 'validator' for SCons' Variables.
- """
- if not env[key] in (True, False):
- raise SCons.Errors.UserError(
- 'Invalid value for boolean option %s: %s' % (key, env[key]))
-
-
-def BoolVariable(key, help, default):
- """
- The input parameters describe a boolen option, thus they are
- returned with the correct converter and validator appended. The
- 'help' text will by appended by '(yes|no) to show the valid
- valued. The result is usable for input to opts.Add().
- """
- return (key, '%s (yes|no)' % help, default,
- _validator, _text2bool)
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Variables/EnumVariable.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Variables/EnumVariable.py
deleted file mode 100644
index bc95cf6..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Variables/EnumVariable.py
+++ /dev/null
@@ -1,103 +0,0 @@
-"""engine.SCons.Variables.EnumVariable
-
-This file defines the option type for SCons allowing only specified
-input-values.
-
-Usage example:
-
- opts = Variables()
- opts.Add(EnumVariable('debug', 'debug output and symbols', 'no',
- allowed_values=('yes', 'no', 'full'),
- map={}, ignorecase=2))
- ...
- if env['debug'] == 'full':
- ...
-"""
-
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-
-__revision__ = "src/engine/SCons/Variables/EnumVariable.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-__all__ = ['EnumVariable',]
-
-
-import SCons.Errors
-
-def _validator(key, val, env, vals):
- if not val in vals:
- raise SCons.Errors.UserError(
- 'Invalid value for option %s: %s. Valid values are: %s' % (key, val, vals))
-
-
-def EnumVariable(key, help, default, allowed_values, map={}, ignorecase=0):
- """
- The input parameters describe a option with only certain values
- allowed. They are returned with an appropriate converter and
- validator appended. The result is usable for input to
- Variables.Add().
-
- 'key' and 'default' are the values to be passed on to Variables.Add().
-
- 'help' will be appended by the allowed values automatically
-
- 'allowed_values' is a list of strings, which are allowed as values
- for this option.
-
- The 'map'-dictionary may be used for converting the input value
- into canonical values (eg. for aliases).
-
- 'ignorecase' defines the behaviour of the validator:
-
- If ignorecase == 0, the validator/converter are case-sensitive.
- If ignorecase == 1, the validator/converter are case-insensitive.
- If ignorecase == 2, the validator/converter is case-insensitive and
- the converted value will always be lower-case.
-
- The 'validator' tests whether the value is in the list of allowed
- values. The 'converter' converts input values according to the
- given 'map'-dictionary (unmapped input values are returned
- unchanged).
- """
- help = '%s (%s)' % (help, '|'.join(allowed_values))
- # define validator
- if ignorecase >= 1:
- validator = lambda key, val, env: \
- _validator(key, val.lower(), env, allowed_values)
- else:
- validator = lambda key, val, env: \
- _validator(key, val, env, allowed_values)
- # define converter
- if ignorecase == 2:
- converter = lambda val: map.get(val.lower(), val).lower()
- elif ignorecase == 1:
- converter = lambda val: map.get(val.lower(), val)
- else:
- converter = lambda val: map.get(val, val)
- return (key, help, default, validator, converter)
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Variables/ListVariable.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Variables/ListVariable.py
deleted file mode 100644
index 1faee72..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Variables/ListVariable.py
+++ /dev/null
@@ -1,135 +0,0 @@
-"""engine.SCons.Variables.ListVariable
-
-This file defines the option type for SCons implementing 'lists'.
-
-A 'list' option may either be 'all', 'none' or a list of names
-separated by comma. After the option has been processed, the option
-value holds either the named list elements, all list elemens or no
-list elements at all.
-
-Usage example:
-
- list_of_libs = Split('x11 gl qt ical')
-
- opts = Variables()
- opts.Add(ListVariable('shared',
- 'libraries to build as shared libraries',
- 'all',
- elems = list_of_libs))
- ...
- for lib in list_of_libs:
- if lib in env['shared']:
- env.SharedObject(...)
- else:
- env.Object(...)
-"""
-
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-__revision__ = "src/engine/SCons/Variables/ListVariable.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-# Know Bug: This should behave like a Set-Type, but does not really,
-# since elements can occur twice.
-
-__all__ = ['ListVariable',]
-
-import collections
-
-import SCons.Util
-
-
-class _ListVariable(collections.UserList):
- def __init__(self, initlist=[], allowedElems=[]):
- collections.UserList.__init__(self, [_f for _f in initlist if _f])
- self.allowedElems = sorted(allowedElems)
-
- def __cmp__(self, other):
- raise NotImplementedError
- def __eq__(self, other):
- raise NotImplementedError
- def __ge__(self, other):
- raise NotImplementedError
- def __gt__(self, other):
- raise NotImplementedError
- def __le__(self, other):
- raise NotImplementedError
- def __lt__(self, other):
- raise NotImplementedError
- def __str__(self):
- if len(self) == 0:
- return 'none'
- self.data.sort()
- if self.data == self.allowedElems:
- return 'all'
- else:
- return ','.join(self)
- def prepare_to_store(self):
- return self.__str__()
-
-def _converter(val, allowedElems, mapdict):
- """
- """
- if val == 'none':
- val = []
- elif val == 'all':
- val = allowedElems
- else:
- val = [_f for _f in val.split(',') if _f]
- val = [mapdict.get(v, v) for v in val]
- notAllowed = [v for v in val if not v in allowedElems]
- if notAllowed:
- raise ValueError("Invalid value(s) for option: %s" %
- ','.join(notAllowed))
- return _ListVariable(val, allowedElems)
-
-
-## def _validator(key, val, env):
-## """
-## """
-## # todo: write validater for pgk list
-## return 1
-
-
-def ListVariable(key, help, default, names, map={}):
- """
- The input parameters describe a 'package list' option, thus they
- are returned with the correct converter and validater appended. The
- result is usable for input to opts.Add() .
-
- A 'package list' option may either be 'all', 'none' or a list of
- package names (separated by space).
- """
- names_str = 'allowed names: %s' % ' '.join(names)
- if SCons.Util.is_List(default):
- default = ','.join(default)
- help = '\n '.join(
- (help, '(all|none|comma-separated list of names)', names_str))
- return (key, help, default,
- None, #_validator,
- lambda val: _converter(val, names, map))
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Variables/PackageVariable.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Variables/PackageVariable.py
deleted file mode 100644
index b7a59fe..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Variables/PackageVariable.py
+++ /dev/null
@@ -1,106 +0,0 @@
-"""engine.SCons.Variables.PackageVariable
-
-This file defines the option type for SCons implementing 'package
-activation'.
-
-To be used whenever a 'package' may be enabled/disabled and the
-package path may be specified.
-
-Usage example:
-
- Examples:
- x11=no (disables X11 support)
- x11=yes (will search for the package installation dir)
- x11=/usr/local/X11 (will check this path for existance)
-
- To replace autoconf's --with-xxx=yyy
-
- opts = Variables()
- opts.Add(PackageVariable('x11',
- 'use X11 installed here (yes = search some places',
- 'yes'))
- ...
- if env['x11'] == True:
- dir = ... search X11 in some standard places ...
- env['x11'] = dir
- if env['x11']:
- ... build with x11 ...
-"""
-
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-
-__revision__ = "src/engine/SCons/Variables/PackageVariable.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-__all__ = ['PackageVariable',]
-
-import SCons.Errors
-
-__enable_strings = ('1', 'yes', 'true', 'on', 'enable', 'search')
-__disable_strings = ('0', 'no', 'false', 'off', 'disable')
-
-def _converter(val):
- """
- """
- lval = val.lower()
- if lval in __enable_strings: return True
- if lval in __disable_strings: return False
- #raise ValueError("Invalid value for boolean option: %s" % val)
- return val
-
-
-def _validator(key, val, env, searchfunc):
- # NB: searchfunc is currenty undocumented and unsupported
- """
- """
- # todo: write validator, check for path
- import os
- if env[key] is True:
- if searchfunc:
- env[key] = searchfunc(key, val)
- elif env[key] and not os.path.exists(val):
- raise SCons.Errors.UserError(
- 'Path does not exist for option %s: %s' % (key, val))
-
-
-def PackageVariable(key, help, default, searchfunc=None):
- # NB: searchfunc is currenty undocumented and unsupported
- """
- The input parameters describe a 'package list' option, thus they
- are returned with the correct converter and validator appended. The
- result is usable for input to opts.Add() .
-
- A 'package list' option may either be 'all', 'none' or a list of
- package names (seperated by space).
- """
- help = '\n '.join(
- (help, '( yes | no | /path/to/%s )' % key))
- return (key, help, default,
- lambda k, v, e: _validator(k,v,e,searchfunc),
- _converter)
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Variables/PathVariable.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Variables/PathVariable.py
deleted file mode 100644
index b095cbc..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Variables/PathVariable.py
+++ /dev/null
@@ -1,147 +0,0 @@
-"""SCons.Variables.PathVariable
-
-This file defines an option type for SCons implementing path settings.
-
-To be used whenever a a user-specified path override should be allowed.
-
-Arguments to PathVariable are:
- option-name = name of this option on the command line (e.g. "prefix")
- option-help = help string for option
- option-dflt = default value for this option
- validator = [optional] validator for option value. Predefined
- validators are:
-
- PathAccept -- accepts any path setting; no validation
- PathIsDir -- path must be an existing directory
- PathIsDirCreate -- path must be a dir; will create
- PathIsFile -- path must be a file
- PathExists -- path must exist (any type) [default]
-
- The validator is a function that is called and which
- should return True or False to indicate if the path
- is valid. The arguments to the validator function
- are: (key, val, env). The key is the name of the
- option, the val is the path specified for the option,
- and the env is the env to which the Otions have been
- added.
-
-Usage example:
-
- Examples:
- prefix=/usr/local
-
- opts = Variables()
-
- opts = Variables()
- opts.Add(PathVariable('qtdir',
- 'where the root of Qt is installed',
- qtdir, PathIsDir))
- opts.Add(PathVariable('qt_includes',
- 'where the Qt includes are installed',
- '$qtdir/includes', PathIsDirCreate))
- opts.Add(PathVariable('qt_libraries',
- 'where the Qt library is installed',
- '$qtdir/lib'))
-
-"""
-
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-
-__revision__ = "src/engine/SCons/Variables/PathVariable.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-__all__ = ['PathVariable',]
-
-import os
-import os.path
-
-import SCons.Errors
-
-class _PathVariableClass(object):
-
- def PathAccept(self, key, val, env):
- """Accepts any path, no checking done."""
- pass
-
- def PathIsDir(self, key, val, env):
- """Validator to check if Path is a directory."""
- if not os.path.isdir(val):
- if os.path.isfile(val):
- m = 'Directory path for option %s is a file: %s'
- else:
- m = 'Directory path for option %s does not exist: %s'
- raise SCons.Errors.UserError(m % (key, val))
-
- def PathIsDirCreate(self, key, val, env):
- """Validator to check if Path is a directory,
- creating it if it does not exist."""
- if os.path.isfile(val):
- m = 'Path for option %s is a file, not a directory: %s'
- raise SCons.Errors.UserError(m % (key, val))
- if not os.path.isdir(val):
- os.makedirs(val)
-
- def PathIsFile(self, key, val, env):
- """validator to check if Path is a file"""
- if not os.path.isfile(val):
- if os.path.isdir(val):
- m = 'File path for option %s is a directory: %s'
- else:
- m = 'File path for option %s does not exist: %s'
- raise SCons.Errors.UserError(m % (key, val))
-
- def PathExists(self, key, val, env):
- """validator to check if Path exists"""
- if not os.path.exists(val):
- m = 'Path for option %s does not exist: %s'
- raise SCons.Errors.UserError(m % (key, val))
-
- def __call__(self, key, help, default, validator=None):
- # NB: searchfunc is currenty undocumented and unsupported
- """
- The input parameters describe a 'path list' option, thus they
- are returned with the correct converter and validator appended. The
- result is usable for input to opts.Add() .
-
- The 'default' option specifies the default path to use if the
- user does not specify an override with this option.
-
- validator is a validator, see this file for examples
- """
- if validator is None:
- validator = self.PathExists
-
- if SCons.Util.is_List(key) or SCons.Util.is_Tuple(key):
- return (key, '%s ( /path/to/%s )' % (help, key[0]), default,
- validator, None)
- else:
- return (key, '%s ( /path/to/%s )' % (help, key), default,
- validator, None)
-
-PathVariable = _PathVariableClass()
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Variables/__init__.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Variables/__init__.py
deleted file mode 100644
index a00d4f8..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Variables/__init__.py
+++ /dev/null
@@ -1,312 +0,0 @@
-"""engine.SCons.Variables
-
-This file defines the Variables class that is used to add user-friendly
-customizable variables to an SCons build.
-"""
-
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-__revision__ = "src/engine/SCons/Variables/__init__.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-import os.path
-import sys
-
-import SCons.Environment
-import SCons.Errors
-import SCons.Util
-import SCons.Warnings
-
-from BoolVariable import BoolVariable # okay
-from EnumVariable import EnumVariable # okay
-from ListVariable import ListVariable # naja
-from PackageVariable import PackageVariable # naja
-from PathVariable import PathVariable # okay
-
-
-class Variables(object):
- instance=None
-
- """
- Holds all the options, updates the environment with the variables,
- and renders the help text.
- """
- def __init__(self, files=[], args={}, is_global=1):
- """
- files - [optional] List of option configuration files to load
- (backward compatibility) If a single string is passed it is
- automatically placed in a file list
- """
- self.options = []
- self.args = args
- if not SCons.Util.is_List(files):
- if files:
- files = [ files ]
- else:
- files = []
- self.files = files
- self.unknown = {}
-
- # create the singleton instance
- if is_global:
- self=Variables.instance
-
- if not Variables.instance:
- Variables.instance=self
-
- def _do_add(self, key, help="", default=None, validator=None, converter=None):
- class Variable(object):
- pass
-
- option = Variable()
-
- # if we get a list or a tuple, we take the first element as the
- # option key and store the remaining in aliases.
- if SCons.Util.is_List(key) or SCons.Util.is_Tuple(key):
- option.key = key[0]
- option.aliases = key[1:]
- else:
- option.key = key
- option.aliases = [ key ]
- option.help = help
- option.default = default
- option.validator = validator
- option.converter = converter
-
- self.options.append(option)
-
- # options might be added after the 'unknown' dict has been set up,
- # so we remove the key and all its aliases from that dict
- for alias in list(option.aliases) + [ option.key ]:
- if alias in self.unknown:
- del self.unknown[alias]
-
- def keys(self):
- """
- Returns the keywords for the options
- """
- return [o.key for o in self.options]
-
- def Add(self, key, help="", default=None, validator=None, converter=None, **kw):
- """
- Add an option.
-
- key - the name of the variable, or a list or tuple of arguments
- help - optional help text for the options
- default - optional default value
- validator - optional function that is called to validate the option's value
- Called with (key, value, environment)
- converter - optional function that is called to convert the option's value before
- putting it in the environment.
- """
-
- if SCons.Util.is_List(key) or isinstance(key, tuple):
- self._do_add(*key)
- return
-
- if not SCons.Util.is_String(key) or \
- not SCons.Environment.is_valid_construction_var(key):
- raise SCons.Errors.UserError("Illegal Variables.Add() key `%s'" % str(key))
-
- self._do_add(key, help, default, validator, converter)
-
- def AddVariables(self, *optlist):
- """
- Add a list of options.
-
- Each list element is a tuple/list of arguments to be passed on
- to the underlying method for adding options.
-
- Example:
- opt.AddVariables(
- ('debug', '', 0),
- ('CC', 'The C compiler'),
- ('VALIDATE', 'An option for testing validation', 'notset',
- validator, None),
- )
- """
- for o in optlist:
- self._do_add(*o)
-
-
- def Update(self, env, args=None):
- """
- Update an environment with the option variables.
-
- env - the environment to update.
- """
-
- values = {}
-
- # first set the defaults:
- for option in self.options:
- if not option.default is None:
- values[option.key] = option.default
-
- # next set the value specified in the options file
- for filename in self.files:
- if os.path.exists(filename):
- dir = os.path.split(os.path.abspath(filename))[0]
- if dir:
- sys.path.insert(0, dir)
- try:
- values['__name__'] = filename
- exec open(filename, 'rU').read() in {}, values
- finally:
- if dir:
- del sys.path[0]
- del values['__name__']
-
- # set the values specified on the command line
- if args is None:
- args = self.args
-
- for arg, value in args.items():
- added = False
- for option in self.options:
- if arg in list(option.aliases) + [ option.key ]:
- values[option.key] = value
- added = True
- if not added:
- self.unknown[arg] = value
-
- # put the variables in the environment:
- # (don't copy over variables that are not declared as options)
- for option in self.options:
- try:
- env[option.key] = values[option.key]
- except KeyError:
- pass
-
- # Call the convert functions:
- for option in self.options:
- if option.converter and option.key in values:
- value = env.subst('${%s}'%option.key)
- try:
- try:
- env[option.key] = option.converter(value)
- except TypeError:
- env[option.key] = option.converter(value, env)
- except ValueError, x:
- raise SCons.Errors.UserError('Error converting option: %s\n%s'%(option.key, x))
-
-
- # Finally validate the values:
- for option in self.options:
- if option.validator and option.key in values:
- option.validator(option.key, env.subst('${%s}'%option.key), env)
-
- def UnknownVariables(self):
- """
- Returns any options in the specified arguments lists that
- were not known, declared options in this object.
- """
- return self.unknown
-
- def Save(self, filename, env):
- """
- Saves all the options in the given file. This file can
- then be used to load the options next run. This can be used
- to create an option cache file.
-
- filename - Name of the file to save into
- env - the environment get the option values from
- """
-
- # Create the file and write out the header
- try:
- fh = open(filename, 'w')
-
- try:
- # Make an assignment in the file for each option
- # within the environment that was assigned a value
- # other than the default.
- for option in self.options:
- try:
- value = env[option.key]
- try:
- prepare = value.prepare_to_store
- except AttributeError:
- try:
- eval(repr(value))
- except KeyboardInterrupt:
- raise
- except:
- # Convert stuff that has a repr() that
- # cannot be evaluated into a string
- value = SCons.Util.to_String(value)
- else:
- value = prepare()
-
- defaultVal = env.subst(SCons.Util.to_String(option.default))
- if option.converter:
- defaultVal = option.converter(defaultVal)
-
- if str(env.subst('${%s}' % option.key)) != str(defaultVal):
- fh.write('%s = %s\n' % (option.key, repr(value)))
- except KeyError:
- pass
- finally:
- fh.close()
-
- except IOError, x:
- raise SCons.Errors.UserError('Error writing options to file: %s\n%s' % (filename, x))
-
- def GenerateHelpText(self, env, sort=None):
- """
- Generate the help text for the options.
-
- env - an environment that is used to get the current values
- of the options.
- """
-
- if sort:
- options = sorted(self.options, key=lambda x: x.key)
- else:
- options = self.options
-
- def format(opt, self=self, env=env):
- if opt.key in env:
- actual = env.subst('${%s}' % opt.key)
- else:
- actual = None
- return self.FormatVariableHelpText(env, opt.key, opt.help, opt.default, actual, opt.aliases)
- lines = [_f for _f in map(format, options) if _f]
-
- return ''.join(lines)
-
- format = '\n%s: %s\n default: %s\n actual: %s\n'
- format_ = '\n%s: %s\n default: %s\n actual: %s\n aliases: %s\n'
-
- def FormatVariableHelpText(self, env, key, help, default, actual, aliases=[]):
- # Don't display the key name itself as an alias.
- aliases = [a for a in aliases if a != key]
- if len(aliases)==0:
- return self.format % (key, help, default, actual)
- else:
- return self.format_ % (key, help, default, actual, aliases)
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/Warnings.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/Warnings.py
deleted file mode 100644
index 615bc45..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/Warnings.py
+++ /dev/null
@@ -1,252 +0,0 @@
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-
-"""SCons.Warnings
-
-This file implements the warnings framework for SCons.
-
-"""
-
-__revision__ = "src/engine/SCons/Warnings.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-import sys
-
-import SCons.Errors
-
-class Warning(SCons.Errors.UserError):
- pass
-
-class WarningOnByDefault(Warning):
- pass
-
-
-# NOTE: If you add a new warning class, add it to the man page, too!
-
-class TargetNotBuiltWarning(Warning): # Should go to OnByDefault
- pass
-
-class CacheWriteErrorWarning(Warning):
- pass
-
-class CorruptSConsignWarning(WarningOnByDefault):
- pass
-
-class DependencyWarning(Warning):
- pass
-
-class DevelopmentVersionWarning(WarningOnByDefault):
- pass
-
-class DuplicateEnvironmentWarning(WarningOnByDefault):
- pass
-
-class FutureReservedVariableWarning(WarningOnByDefault):
- pass
-
-class LinkWarning(WarningOnByDefault):
- pass
-
-class MisleadingKeywordsWarning(WarningOnByDefault):
- pass
-
-class MissingSConscriptWarning(WarningOnByDefault):
- pass
-
-class NoMD5ModuleWarning(WarningOnByDefault):
- pass
-
-class NoMetaclassSupportWarning(WarningOnByDefault):
- pass
-
-class NoObjectCountWarning(WarningOnByDefault):
- pass
-
-class NoParallelSupportWarning(WarningOnByDefault):
- pass
-
-class ReservedVariableWarning(WarningOnByDefault):
- pass
-
-class StackSizeWarning(WarningOnByDefault):
- pass
-
-class VisualCMissingWarning(WarningOnByDefault):
- pass
-
-# Used when MSVC_VERSION and MSVS_VERSION do not point to the
-# same version (MSVS_VERSION is deprecated)
-class VisualVersionMismatch(WarningOnByDefault):
- pass
-
-class VisualStudioMissingWarning(Warning):
- pass
-
-class FortranCxxMixWarning(LinkWarning):
- pass
-
-
-# Deprecation warnings
-
-class FutureDeprecatedWarning(Warning):
- pass
-
-class DeprecatedWarning(Warning):
- pass
-
-class MandatoryDeprecatedWarning(DeprecatedWarning):
- pass
-
-
-# Special case; base always stays DeprecatedWarning
-class PythonVersionWarning(DeprecatedWarning):
- pass
-
-class DeprecatedSourceCodeWarning(FutureDeprecatedWarning):
- pass
-
-class DeprecatedBuildDirWarning(DeprecatedWarning):
- pass
-
-class TaskmasterNeedsExecuteWarning(DeprecatedWarning):
- pass
-
-class DeprecatedCopyWarning(MandatoryDeprecatedWarning):
- pass
-
-class DeprecatedOptionsWarning(MandatoryDeprecatedWarning):
- pass
-
-class DeprecatedSourceSignaturesWarning(MandatoryDeprecatedWarning):
- pass
-
-class DeprecatedTargetSignaturesWarning(MandatoryDeprecatedWarning):
- pass
-
-class DeprecatedDebugOptionsWarning(MandatoryDeprecatedWarning):
- pass
-
-class DeprecatedSigModuleWarning(MandatoryDeprecatedWarning):
- pass
-
-class DeprecatedBuilderKeywordsWarning(MandatoryDeprecatedWarning):
- pass
-
-
-# The below is a list of 2-tuples. The first element is a class object.
-# The second element is true if that class is enabled, false if it is disabled.
-_enabled = []
-
-# If set, raise the warning as an exception
-_warningAsException = 0
-
-# If not None, a function to call with the warning
-_warningOut = None
-
-def suppressWarningClass(clazz):
- """Suppresses all warnings that are of type clazz or
- derived from clazz."""
- _enabled.insert(0, (clazz, 0))
-
-def enableWarningClass(clazz):
- """Enables all warnings that are of type clazz or
- derived from clazz."""
- _enabled.insert(0, (clazz, 1))
-
-def warningAsException(flag=1):
- """Turn warnings into exceptions. Returns the old value of the flag."""
- global _warningAsException
- old = _warningAsException
- _warningAsException = flag
- return old
-
-def warn(clazz, *args):
- global _enabled, _warningAsException, _warningOut
-
- warning = clazz(args)
- for clazz, flag in _enabled:
- if isinstance(warning, clazz):
- if flag:
- if _warningAsException:
- raise warning
-
- if _warningOut:
- _warningOut(warning)
- break
-
-def process_warn_strings(arguments):
- """Process string specifications of enabling/disabling warnings,
- as passed to the --warn option or the SetOption('warn') function.
-
-
- An argument to this option should be of the form <warning-class>
- or no-<warning-class>. The warning class is munged in order
- to get an actual class name from the classes above, which we
- need to pass to the {enable,disable}WarningClass() functions.
- The supplied <warning-class> is split on hyphens, each element
- is capitalized, then smushed back together. Then the string
- "Warning" is appended to get the class name.
-
- For example, 'deprecated' will enable the DeprecatedWarning
- class. 'no-dependency' will disable the DependencyWarning class.
-
- As a special case, --warn=all and --warn=no-all will enable or
- disable (respectively) the base Warning class of all warnings.
-
- """
-
- def _capitalize(s):
- if s[:5] == "scons":
- return "SCons" + s[5:]
- else:
- return s.capitalize()
-
- for arg in arguments:
-
- elems = arg.lower().split('-')
- enable = 1
- if elems[0] == 'no':
- enable = 0
- del elems[0]
-
- if len(elems) == 1 and elems[0] == 'all':
- class_name = "Warning"
- else:
- class_name = ''.join(map(_capitalize, elems)) + "Warning"
- try:
- clazz = globals()[class_name]
- except KeyError:
- sys.stderr.write("No warning type: '%s'\n" % arg)
- else:
- if enable:
- enableWarningClass(clazz)
- elif issubclass(clazz, MandatoryDeprecatedWarning):
- fmt = "Can not disable mandataory warning: '%s'\n"
- sys.stderr.write(fmt % arg)
- else:
- suppressWarningClass(clazz)
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/__init__.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/__init__.py
deleted file mode 100644
index 019cbf9..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/__init__.py
+++ /dev/null
@@ -1,49 +0,0 @@
-"""SCons
-
-The main package for the SCons software construction utility.
-
-"""
-
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-
-__revision__ = "src/engine/SCons/__init__.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-__version__ = "2.4.0"
-
-__build__ = "rel_2.4.0:3365:9259ea1c13d7"
-
-__buildsys__ = "hpmicrodog"
-
-__date__ = "2015/09/21 14:03:43"
-
-__developer__ = "bdbaddog"
-
-# make sure compatibility is always in place
-import SCons.compat
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/compat/__init__.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/compat/__init__.py
deleted file mode 100644
index 2352d4c..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/compat/__init__.py
+++ /dev/null
@@ -1,237 +0,0 @@
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-
-__doc__ = """
-SCons compatibility package for old Python versions
-
-This subpackage holds modules that provide backwards-compatible
-implementations of various things that we'd like to use in SCons but which
-only show up in later versions of Python than the early, old version(s)
-we still support.
-
-Other code will not generally reference things in this package through
-the SCons.compat namespace. The modules included here add things to
-the builtins namespace or the global module list so that the rest
-of our code can use the objects and names imported here regardless of
-Python version.
-
-Simply enough, things that go in the builtins name space come from
-our _scons_builtins module.
-
-The rest of the things here will be in individual compatibility modules
-that are either: 1) suitably modified copies of the future modules that
-we want to use; or 2) backwards compatible re-implementations of the
-specific portions of a future module's API that we want to use.
-
-GENERAL WARNINGS: Implementations of functions in the SCons.compat
-modules are *NOT* guaranteed to be fully compliant with these functions in
-later versions of Python. We are only concerned with adding functionality
-that we actually use in SCons, so be wary if you lift this code for
-other uses. (That said, making these more nearly the same as later,
-official versions is still a desirable goal, we just don't need to be
-obsessive about it.)
-
-We name the compatibility modules with an initial '_scons_' (for example,
-_scons_subprocess.py is our compatibility module for subprocess) so
-that we can still try to import the real module name and fall back to
-our compatibility module if we get an ImportError. The import_as()
-function defined below loads the module as the "real" name (without the
-'_scons'), after which all of the "import {module}" statements in the
-rest of our code will find our pre-loaded compatibility module.
-"""
-
-__revision__ = "src/engine/SCons/compat/__init__.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-import os
-import sys
-import imp # Use the "imp" module to protect imports from fixers.
-
-def import_as(module, name):
- """
- Imports the specified module (from our local directory) as the
- specified name, returning the loaded module object.
- """
- dir = os.path.split(__file__)[0]
- return imp.load_module(name, *imp.find_module(module, [dir]))
-
-def rename_module(new, old):
- """
- Attempts to import the old module and load it under the new name.
- Used for purely cosmetic name changes in Python 3.x.
- """
- try:
- sys.modules[new] = imp.load_module(old, *imp.find_module(old))
- return True
- except ImportError:
- return False
-
-
-rename_module('builtins', '__builtin__')
-import _scons_builtins
-
-
-try:
- import hashlib
-except ImportError:
- # Pre-2.5 Python has no hashlib module.
- try:
- import_as('_scons_hashlib', 'hashlib')
- except ImportError:
- # If we failed importing our compatibility module, it probably
- # means this version of Python has no md5 module. Don't do
- # anything and let the higher layer discover this fact, so it
- # can fall back to using timestamp.
- pass
-
-try:
- set
-except NameError:
- # Pre-2.4 Python has no native set type
- import_as('_scons_sets', 'sets')
- import builtins, sets
- builtins.set = sets.Set
-
-
-try:
- import collections
-except ImportError:
- # Pre-2.4 Python has no collections module.
- import_as('_scons_collections', 'collections')
-else:
- try:
- collections.UserDict
- except AttributeError:
- exec('from UserDict import UserDict as _UserDict')
- collections.UserDict = _UserDict
- del _UserDict
- try:
- collections.UserList
- except AttributeError:
- exec('from UserList import UserList as _UserList')
- collections.UserList = _UserList
- del _UserList
- try:
- collections.UserString
- except AttributeError:
- exec('from UserString import UserString as _UserString')
- collections.UserString = _UserString
- del _UserString
-
-
-try:
- import io
-except ImportError:
- # Pre-2.6 Python has no io module.
- import_as('_scons_io', 'io')
-
-
-try:
- os.devnull
-except AttributeError:
- # Pre-2.4 Python has no os.devnull attribute
- _names = sys.builtin_module_names
- if 'posix' in _names:
- os.devnull = '/dev/null'
- elif 'nt' in _names:
- os.devnull = 'nul'
- os.path.devnull = os.devnull
-try:
- os.path.lexists
-except AttributeError:
- # Pre-2.4 Python has no os.path.lexists function
- def lexists(path):
- return os.path.exists(path) or os.path.islink(path)
- os.path.lexists = lexists
-
-
-# When we're using the '-3' option during regression tests, importing
-# cPickle gives a warning no matter how it's done, so always use the
-# real profile module, whether it's fast or not.
-if os.environ.get('SCONS_HORRIBLE_REGRESSION_TEST_HACK') is None:
- # Not a regression test with '-3', so try to use faster version.
- # In 3.x, 'pickle' automatically loads the fast version if available.
- rename_module('pickle', 'cPickle')
-
-
-# In 3.x, 'profile' automatically loads the fast version if available.
-rename_module('profile', 'cProfile')
-
-
-# Before Python 3.0, the 'queue' module was named 'Queue'.
-rename_module('queue', 'Queue')
-
-
-# Before Python 3.0, the 'winreg' module was named '_winreg'
-rename_module('winreg', '_winreg')
-
-
-try:
- import subprocess
-except ImportError:
- # Pre-2.4 Python has no subprocess module.
- import_as('_scons_subprocess', 'subprocess')
-
-try:
- sys.intern
-except AttributeError:
- # Pre-2.6 Python has no sys.intern() function.
- import builtins
- try:
- sys.intern = builtins.intern
- except AttributeError:
- # Pre-2.x Python has no builtin intern() function.
- def intern(x):
- return x
- sys.intern = intern
- del intern
-try:
- sys.maxsize
-except AttributeError:
- # Pre-2.6 Python has no sys.maxsize attribute
- # Wrapping sys in () is silly, but protects it from 2to3 renames fixer
- sys.maxsize = (sys).maxint
-
-
-if os.environ.get('SCONS_HORRIBLE_REGRESSION_TEST_HACK') is not None:
- # We can't apply the 'callable' fixer until the floor is 2.6, but the
- # '-3' option to Python 2.6 and 2.7 generates almost ten thousand
- # warnings. This hack allows us to run regression tests with the '-3'
- # option by replacing the callable() built-in function with a hack
- # that performs the same function but doesn't generate the warning.
- # Note that this hack is ONLY intended to be used for regression
- # testing, and should NEVER be used for real runs.
- from types import ClassType
- def callable(obj):
- if hasattr(obj, '__call__'): return True
- if isinstance(obj, (ClassType, type)): return True
- return False
- import builtins
- builtins.callable = callable
- del callable
-
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/compat/_scons_builtins.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/compat/_scons_builtins.py
deleted file mode 100644
index bf2005f..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/compat/_scons_builtins.py
+++ /dev/null
@@ -1,107 +0,0 @@
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-
-# Portions of the following are derived from the compat.py file in
-# Twisted, under the following copyright:
-#
-# Copyright (c) 2001-2004 Twisted Matrix Laboratories
-
-__doc__ = """
-Compatibility idioms for builtins names
-
-This module adds names to the builtins module for things that we want
-to use in SCons but which don't show up until later Python versions than
-the earliest ones we support.
-
-This module checks for the following builtins names:
-
- all()
- any()
- memoryview()
-
-Implementations of functions are *NOT* guaranteed to be fully compliant
-with these functions in later versions of Python. We are only concerned
-with adding functionality that we actually use in SCons, so be wary
-if you lift this code for other uses. (That said, making these more
-nearly the same as later, official versions is still a desirable goal,
-we just don't need to be obsessive about it.)
-
-If you're looking at this with pydoc and various names don't show up in
-the FUNCTIONS or DATA output, that means those names are already built in
-to this version of Python and we don't need to add them from this module.
-"""
-
-__revision__ = "src/engine/SCons/compat/_scons_builtins.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-import builtins
-
-try:
- all
-except NameError:
- # Pre-2.5 Python has no all() function.
- def all(iterable):
- """
- Returns True if all elements of the iterable are true.
- """
- for element in iterable:
- if not element:
- return False
- return True
- builtins.all = all
- all = all
-
-try:
- any
-except NameError:
- # Pre-2.5 Python has no any() function.
- def any(iterable):
- """
- Returns True if any element of the iterable is true.
- """
- for element in iterable:
- if element:
- return True
- return False
- builtins.any = any
- any = any
-
-try:
- memoryview
-except NameError:
- # Pre-2.7 doesn't have the memoryview() built-in.
- class memoryview(object):
- def __init__(self, obj):
- # wrapping buffer in () keeps the fixer from changing it
- self.obj = (buffer)(obj)
- def __getitem__(self, indx):
- if isinstance(indx, slice):
- return self.obj[indx.start:indx.stop]
- else:
- return self.obj[indx]
- builtins.memoryview = memoryview
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/compat/_scons_collections.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/compat/_scons_collections.py
deleted file mode 100644
index 1f13065..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/compat/_scons_collections.py
+++ /dev/null
@@ -1,45 +0,0 @@
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-
-__doc__ = """
-collections compatibility module for older (pre-2.4) Python versions
-
-This does not not NOT (repeat, *NOT*) provide complete collections
-functionality. It only wraps the portions of collections functionality
-used by SCons, in an interface that looks enough like collections for
-our purposes.
-"""
-
-__revision__ = "src/engine/SCons/compat/_scons_collections.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-# Use exec to hide old names from fixers.
-exec("""if True:
- from UserDict import UserDict
- from UserList import UserList
- from UserString import UserString""")
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/compat/_scons_dbm.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/compat/_scons_dbm.py
deleted file mode 100644
index 3bc0768..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/compat/_scons_dbm.py
+++ /dev/null
@@ -1,45 +0,0 @@
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-
-__doc__ = """
-dbm compatibility module for Python versions that don't have dbm.
-
-This does not not NOT (repeat, *NOT*) provide complete dbm functionality.
-It's just a stub on which to hang just enough pieces of dbm functionality
-that the whichdb.whichdb() implementstation in the various 2.X versions of
-Python won't blow up even if dbm wasn't compiled in.
-"""
-
-__revision__ = "src/engine/SCons/compat/_scons_dbm.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-class error(Exception):
- pass
-
-def open(*args, **kw):
- raise error()
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/compat/_scons_hashlib.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/compat/_scons_hashlib.py
deleted file mode 100644
index de93e4b..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/compat/_scons_hashlib.py
+++ /dev/null
@@ -1,76 +0,0 @@
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-
-__doc__ = """
-hashlib backwards-compatibility module for older (pre-2.5) Python versions
-
-This does not not NOT (repeat, *NOT*) provide complete hashlib
-functionality. It only wraps the portions of MD5 functionality used
-by SCons, in an interface that looks like hashlib (or enough for our
-purposes, anyway). In fact, this module will raise an ImportError if
-the underlying md5 module isn't available.
-"""
-
-__revision__ = "src/engine/SCons/compat/_scons_hashlib.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-import md5
-from string import hexdigits
-
-class md5obj(object):
-
- md5_module = md5
-
- def __init__(self, name, string=''):
- if not name in ('MD5', 'md5'):
- raise ValueError("unsupported hash type")
- self.name = 'md5'
- self.m = self.md5_module.md5()
-
- def __repr__(self):
- return '<%s HASH object @ %#x>' % (self.name, id(self))
-
- def copy(self):
- import copy
- result = copy.copy(self)
- result.m = self.m.copy()
- return result
-
- def digest(self):
- return self.m.digest()
-
- def update(self, arg):
- return self.m.update(arg)
-
- def hexdigest(self):
- return self.m.hexdigest()
-
-new = md5obj
-
-def md5(string=''):
- return md5obj('md5', string)
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/compat/_scons_io.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/compat/_scons_io.py
deleted file mode 100644
index 72cd3b6..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/compat/_scons_io.py
+++ /dev/null
@@ -1,45 +0,0 @@
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-
-__doc__ = """
-io compatibility module for older (pre-2.6) Python versions
-
-This does not not NOT (repeat, *NOT*) provide complete io
-functionality. It only wraps the portions of io functionality used
-by SCons, in an interface that looks enough like io for our purposes.
-"""
-
-__revision__ = "src/engine/SCons/compat/_scons_io.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-# Use the "imp" module to protect the imports below from fixers.
-import imp
-
-_cStringIO = imp.load_module('cStringIO', *imp.find_module('cStringIO'))
-StringIO = _cStringIO.StringIO
-del _cStringIO
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/compat/_scons_sets.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/compat/_scons_sets.py
deleted file mode 100644
index 0fde994..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/compat/_scons_sets.py
+++ /dev/null
@@ -1,563 +0,0 @@
-"""Classes to represent arbitrary sets (including sets of sets).
-
-This module implements sets using dictionaries whose values are
-ignored. The usual operations (union, intersection, deletion, etc.)
-are provided as both methods and operators.
-
-Important: sets are not sequences! While they support 'x in s',
-'len(s)', and 'for x in s', none of those operations are unique for
-sequences; for example, mappings support all three as well. The
-characteristic operation for sequences is subscripting with small
-integers: s[i], for i in range(len(s)). Sets don't support
-subscripting at all. Also, sequences allow multiple occurrences and
-their elements have a definite order; sets on the other hand don't
-record multiple occurrences and don't remember the order of element
-insertion (which is why they don't support s[i]).
-
-The following classes are provided:
-
-BaseSet -- All the operations common to both mutable and immutable
- sets. This is an abstract class, not meant to be directly
- instantiated.
-
-Set -- Mutable sets, subclass of BaseSet; not hashable.
-
-ImmutableSet -- Immutable sets, subclass of BaseSet; hashable.
- An iterable argument is mandatory to create an ImmutableSet.
-
-_TemporarilyImmutableSet -- A wrapper around a Set, hashable,
- giving the same hash value as the immutable set equivalent
- would have. Do not use this class directly.
-
-Only hashable objects can be added to a Set. In particular, you cannot
-really add a Set as an element to another Set; if you try, what is
-actually added is an ImmutableSet built from it (it compares equal to
-the one you tried adding).
-
-When you ask if `x in y' where x is a Set and y is a Set or
-ImmutableSet, x is wrapped into a _TemporarilyImmutableSet z, and
-what's tested is actually `z in y'.
-
-"""
-
-# Code history:
-#
-# - Greg V. Wilson wrote the first version, using a different approach
-# to the mutable/immutable problem, and inheriting from dict.
-#
-# - Alex Martelli modified Greg's version to implement the current
-# Set/ImmutableSet approach, and make the data an attribute.
-#
-# - Guido van Rossum rewrote much of the code, made some API changes,
-# and cleaned up the docstrings.
-#
-# - Raymond Hettinger added a number of speedups and other
-# improvements.
-
-# protect this import from the fixers...
-exec('from itertools import ifilterfalse as filterfalse')
-
-__all__ = ['BaseSet', 'Set', 'ImmutableSet']
-
-class BaseSet(object):
- """Common base class for mutable and immutable sets."""
-
- __slots__ = ['_data']
-
- # Constructor
-
- def __init__(self):
- """This is an abstract class."""
- # Don't call this from a concrete subclass!
- if self.__class__ is BaseSet:
- raise TypeError("BaseSet is an abstract class. "
- "Use Set or ImmutableSet.")
-
- # Standard protocols: __len__, __repr__, __str__, __iter__
-
- def __len__(self):
- """Return the number of elements of a set."""
- return len(self._data)
-
- def __repr__(self):
- """Return string representation of a set.
-
- This looks like 'Set([<list of elements>])'.
- """
- return self._repr()
-
- # __str__ is the same as __repr__
- __str__ = __repr__
-
- def _repr(self, sort_them=False):
- elements = list(self._data.keys())
- if sort_them:
- elements.sort()
- return '%s(%r)' % (self.__class__.__name__, elements)
-
- def __iter__(self):
- """Return an iterator over the elements or a set.
-
- This is the keys iterator for the underlying dict.
- """
- # Wrapping name in () prevents fixer from "fixing" this
- return (self._data.iterkeys)()
-
- # Three-way comparison is not supported. However, because __eq__ is
- # tried before __cmp__, if Set x == Set y, x.__eq__(y) returns True and
- # then cmp(x, y) returns 0 (Python doesn't actually call __cmp__ in this
- # case).
-
- def __cmp__(self, other):
- raise TypeError("can't compare sets using cmp()")
-
- # Equality comparisons using the underlying dicts. Mixed-type comparisons
- # are allowed here, where Set == z for non-Set z always returns False,
- # and Set != z always True. This allows expressions like "x in y" to
- # give the expected result when y is a sequence of mixed types, not
- # raising a pointless TypeError just because y contains a Set, or x is
- # a Set and y contain's a non-set ("in" invokes only __eq__).
- # Subtle: it would be nicer if __eq__ and __ne__ could return
- # NotImplemented instead of True or False. Then the other comparand
- # would get a chance to determine the result, and if the other comparand
- # also returned NotImplemented then it would fall back to object address
- # comparison (which would always return False for __eq__ and always
- # True for __ne__). However, that doesn't work, because this type
- # *also* implements __cmp__: if, e.g., __eq__ returns NotImplemented,
- # Python tries __cmp__ next, and the __cmp__ here then raises TypeError.
-
- def __eq__(self, other):
- if isinstance(other, BaseSet):
- return self._data == other._data
- else:
- return False
-
- def __ne__(self, other):
- if isinstance(other, BaseSet):
- return self._data != other._data
- else:
- return True
-
- # Copying operations
-
- def copy(self):
- """Return a shallow copy of a set."""
- result = self.__class__()
- result._data.update(self._data)
- return result
-
- __copy__ = copy # For the copy module
-
- def __deepcopy__(self, memo):
- """Return a deep copy of a set; used by copy module."""
- # This pre-creates the result and inserts it in the memo
- # early, in case the deep copy recurses into another reference
- # to this same set. A set can't be an element of itself, but
- # it can certainly contain an object that has a reference to
- # itself.
- from copy import deepcopy
- result = self.__class__()
- memo[id(self)] = result
- data = result._data
- value = True
- for elt in self:
- data[deepcopy(elt, memo)] = value
- return result
-
- # Standard set operations: union, intersection, both differences.
- # Each has an operator version (e.g. __or__, invoked with |) and a
- # method version (e.g. union).
- # Subtle: Each pair requires distinct code so that the outcome is
- # correct when the type of other isn't suitable. For example, if
- # we did "union = __or__" instead, then Set().union(3) would return
- # NotImplemented instead of raising TypeError (albeit that *why* it
- # raises TypeError as-is is also a bit subtle).
-
- def __or__(self, other):
- """Return the union of two sets as a new set.
-
- (I.e. all elements that are in either set.)
- """
- if not isinstance(other, BaseSet):
- return NotImplemented
- return self.union(other)
-
- def union(self, other):
- """Return the union of two sets as a new set.
-
- (I.e. all elements that are in either set.)
- """
- result = self.__class__(self)
- result._update(other)
- return result
-
- def __and__(self, other):
- """Return the intersection of two sets as a new set.
-
- (I.e. all elements that are in both sets.)
- """
- if not isinstance(other, BaseSet):
- return NotImplemented
- return self.intersection(other)
-
- def intersection(self, other):
- """Return the intersection of two sets as a new set.
-
- (I.e. all elements that are in both sets.)
- """
- if not isinstance(other, BaseSet):
- other = Set(other)
- if len(self) <= len(other):
- little, big = self, other
- else:
- little, big = other, self
- common = iter(filter(big._data.has_key, little))
- return self.__class__(common)
-
- def __xor__(self, other):
- """Return the symmetric difference of two sets as a new set.
-
- (I.e. all elements that are in exactly one of the sets.)
- """
- if not isinstance(other, BaseSet):
- return NotImplemented
- return self.symmetric_difference(other)
-
- def symmetric_difference(self, other):
- """Return the symmetric difference of two sets as a new set.
-
- (I.e. all elements that are in exactly one of the sets.)
- """
- result = self.__class__()
- data = result._data
- value = True
- selfdata = self._data
- try:
- otherdata = other._data
- except AttributeError:
- otherdata = Set(other)._data
- for elt in filterfalse(otherdata.has_key, selfdata):
- data[elt] = value
- for elt in filterfalse(selfdata.has_key, otherdata):
- data[elt] = value
- return result
-
- def __sub__(self, other):
- """Return the difference of two sets as a new Set.
-
- (I.e. all elements that are in this set and not in the other.)
- """
- if not isinstance(other, BaseSet):
- return NotImplemented
- return self.difference(other)
-
- def difference(self, other):
- """Return the difference of two sets as a new Set.
-
- (I.e. all elements that are in this set and not in the other.)
- """
- result = self.__class__()
- data = result._data
- try:
- otherdata = other._data
- except AttributeError:
- otherdata = Set(other)._data
- value = True
- for elt in filterfalse(otherdata.has_key, self):
- data[elt] = value
- return result
-
- # Membership test
-
- def __contains__(self, element):
- """Report whether an element is a member of a set.
-
- (Called in response to the expression `element in self'.)
- """
- try:
- return element in self._data
- except TypeError:
- transform = getattr(element, "__as_temporarily_immutable__", None)
- if transform is None:
- raise # re-raise the TypeError exception we caught
- return transform() in self._data
-
- # Subset and superset test
-
- def issubset(self, other):
- """Report whether another set contains this set."""
- self._binary_sanity_check(other)
- if len(self) > len(other): # Fast check for obvious cases
- return False
- for elt in filterfalse(other._data.has_key, self):
- return False
- return True
-
- def issuperset(self, other):
- """Report whether this set contains another set."""
- self._binary_sanity_check(other)
- if len(self) < len(other): # Fast check for obvious cases
- return False
- for elt in filterfalse(self._data.has_key, other):
- return False
- return True
-
- # Inequality comparisons using the is-subset relation.
- __le__ = issubset
- __ge__ = issuperset
-
- def __lt__(self, other):
- self._binary_sanity_check(other)
- return len(self) < len(other) and self.issubset(other)
-
- def __gt__(self, other):
- self._binary_sanity_check(other)
- return len(self) > len(other) and self.issuperset(other)
-
- # Assorted helpers
-
- def _binary_sanity_check(self, other):
- # Check that the other argument to a binary operation is also
- # a set, raising a TypeError otherwise.
- if not isinstance(other, BaseSet):
- raise TypeError("Binary operation only permitted between sets")
-
- def _compute_hash(self):
- # Calculate hash code for a set by xor'ing the hash codes of
- # the elements. This ensures that the hash code does not depend
- # on the order in which elements are added to the set. This is
- # not called __hash__ because a BaseSet should not be hashable;
- # only an ImmutableSet is hashable.
- result = 0
- for elt in self:
- result ^= hash(elt)
- return result
-
- def _update(self, iterable):
- # The main loop for update() and the subclass __init__() methods.
- data = self._data
-
- # Use the fast update() method when a dictionary is available.
- if isinstance(iterable, BaseSet):
- data.update(iterable._data)
- return
-
- value = True
-
- if type(iterable) in (list, tuple, xrange):
- # Optimized: we know that __iter__() and next() can't
- # raise TypeError, so we can move 'try:' out of the loop.
- it = iter(iterable)
- while True:
- try:
- for element in it:
- data[element] = value
- return
- except TypeError:
- transform = getattr(element, "__as_immutable__", None)
- if transform is None:
- raise # re-raise the TypeError exception we caught
- data[transform()] = value
- else:
- # Safe: only catch TypeError where intended
- for element in iterable:
- try:
- data[element] = value
- except TypeError:
- transform = getattr(element, "__as_immutable__", None)
- if transform is None:
- raise # re-raise the TypeError exception we caught
- data[transform()] = value
-
-
-class ImmutableSet(BaseSet):
- """Immutable set class."""
-
- __slots__ = ['_hashcode']
-
- # BaseSet + hashing
-
- def __init__(self, iterable=None):
- """Construct an immutable set from an optional iterable."""
- self._hashcode = None
- self._data = {}
- if iterable is not None:
- self._update(iterable)
-
- def __hash__(self):
- if self._hashcode is None:
- self._hashcode = self._compute_hash()
- return self._hashcode
-
- def __getstate__(self):
- return self._data, self._hashcode
-
- def __setstate__(self, state):
- self._data, self._hashcode = state
-
-class Set(BaseSet):
- """ Mutable set class."""
-
- __slots__ = []
-
- # BaseSet + operations requiring mutability; no hashing
-
- def __init__(self, iterable=None):
- """Construct a set from an optional iterable."""
- self._data = {}
- if iterable is not None:
- self._update(iterable)
-
- def __getstate__(self):
- # getstate's results are ignored if it is not
- return self._data,
-
- def __setstate__(self, data):
- self._data, = data
-
- def __hash__(self):
- """A Set cannot be hashed."""
- # We inherit object.__hash__, so we must deny this explicitly
- raise TypeError("Can't hash a Set, only an ImmutableSet.")
-
- # In-place union, intersection, differences.
- # Subtle: The xyz_update() functions deliberately return None,
- # as do all mutating operations on built-in container types.
- # The __xyz__ spellings have to return self, though.
-
- def __ior__(self, other):
- """Update a set with the union of itself and another."""
- self._binary_sanity_check(other)
- self._data.update(other._data)
- return self
-
- def union_update(self, other):
- """Update a set with the union of itself and another."""
- self._update(other)
-
- def __iand__(self, other):
- """Update a set with the intersection of itself and another."""
- self._binary_sanity_check(other)
- self._data = (self & other)._data
- return self
-
- def intersection_update(self, other):
- """Update a set with the intersection of itself and another."""
- if isinstance(other, BaseSet):
- self &= other
- else:
- self._data = (self.intersection(other))._data
-
- def __ixor__(self, other):
- """Update a set with the symmetric difference of itself and another."""
- self._binary_sanity_check(other)
- self.symmetric_difference_update(other)
- return self
-
- def symmetric_difference_update(self, other):
- """Update a set with the symmetric difference of itself and another."""
- data = self._data
- value = True
- if not isinstance(other, BaseSet):
- other = Set(other)
- if self is other:
- self.clear()
- for elt in other:
- if elt in data:
- del data[elt]
- else:
- data[elt] = value
-
- def __isub__(self, other):
- """Remove all elements of another set from this set."""
- self._binary_sanity_check(other)
- self.difference_update(other)
- return self
-
- def difference_update(self, other):
- """Remove all elements of another set from this set."""
- data = self._data
- if not isinstance(other, BaseSet):
- other = Set(other)
- if self is other:
- self.clear()
- for elt in filter(data.has_key, other):
- del data[elt]
-
- # Python dict-like mass mutations: update, clear
-
- def update(self, iterable):
- """Add all values from an iterable (such as a list or file)."""
- self._update(iterable)
-
- def clear(self):
- """Remove all elements from this set."""
- self._data.clear()
-
- # Single-element mutations: add, remove, discard
-
- def add(self, element):
- """Add an element to a set.
-
- This has no effect if the element is already present.
- """
- try:
- self._data[element] = True
- except TypeError:
- transform = getattr(element, "__as_immutable__", None)
- if transform is None:
- raise # re-raise the TypeError exception we caught
- self._data[transform()] = True
-
- def remove(self, element):
- """Remove an element from a set; it must be a member.
-
- If the element is not a member, raise a KeyError.
- """
- try:
- del self._data[element]
- except TypeError:
- transform = getattr(element, "__as_temporarily_immutable__", None)
- if transform is None:
- raise # re-raise the TypeError exception we caught
- del self._data[transform()]
-
- def discard(self, element):
- """Remove an element from a set if it is a member.
-
- If the element is not a member, do nothing.
- """
- try:
- self.remove(element)
- except KeyError:
- pass
-
- def pop(self):
- """Remove and return an arbitrary set element."""
- return self._data.popitem()[0]
-
- def __as_immutable__(self):
- # Return a copy of self as an immutable set
- return ImmutableSet(self)
-
- def __as_temporarily_immutable__(self):
- # Return self wrapped in a temporarily immutable set
- return _TemporarilyImmutableSet(self)
-
-
-class _TemporarilyImmutableSet(BaseSet):
- # Wrap a mutable set as if it was temporarily immutable.
- # This only supplies hashing and equality comparisons.
-
- def __init__(self, set):
- self._set = set
- self._data = set._data # Needed by ImmutableSet.__eq__()
-
- def __hash__(self):
- return self._set._compute_hash()
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/compat/_scons_subprocess.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/compat/_scons_subprocess.py
deleted file mode 100644
index eebe53d..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/compat/_scons_subprocess.py
+++ /dev/null
@@ -1,1281 +0,0 @@
-# subprocess - Subprocesses with accessible I/O streams
-#
-# For more information about this module, see PEP 324.
-#
-# This module should remain compatible with Python 2.2, see PEP 291.
-#
-# Copyright (c) 2003-2005 by Peter Astrand <astrand@lysator.liu.se>
-#
-# Licensed to PSF under a Contributor Agreement.
-# See http://www.python.org/2.4/license for licensing details.
-
-r"""subprocess - Subprocesses with accessible I/O streams
-
-This module allows you to spawn processes, connect to their
-input/output/error pipes, and obtain their return codes. This module
-intends to replace several other, older modules and functions, like:
-
-os.system
-os.spawn*
-os.popen*
-popen2.*
-commands.*
-
-Information about how the subprocess module can be used to replace these
-modules and functions can be found below.
-
-
-
-Using the subprocess module
-===========================
-This module defines one class called Popen:
-
-class Popen(args, bufsize=0, executable=None,
- stdin=None, stdout=None, stderr=None,
- preexec_fn=None, close_fds=False, shell=False,
- cwd=None, env=None, universal_newlines=False,
- startupinfo=None, creationflags=0):
-
-
-Arguments are:
-
-args should be a string, or a sequence of program arguments. The
-program to execute is normally the first item in the args sequence or
-string, but can be explicitly set by using the executable argument.
-
-On UNIX, with shell=False (default): In this case, the Popen class
-uses os.execvp() to execute the child program. args should normally
-be a sequence. A string will be treated as a sequence with the string
-as the only item (the program to execute).
-
-On UNIX, with shell=True: If args is a string, it specifies the
-command string to execute through the shell. If args is a sequence,
-the first item specifies the command string, and any additional items
-will be treated as additional shell arguments.
-
-On Windows: the Popen class uses CreateProcess() to execute the child
-program, which operates on strings. If args is a sequence, it will be
-converted to a string using the list2cmdline method. Please note that
-not all MS Windows applications interpret the command line the same
-way: The list2cmdline is designed for applications using the same
-rules as the MS C runtime.
-
-bufsize, if given, has the same meaning as the corresponding argument
-to the built-in open() function: 0 means unbuffered, 1 means line
-buffered, any other positive value means use a buffer of
-(approximately) that size. A negative bufsize means to use the system
-default, which usually means fully buffered. The default value for
-bufsize is 0 (unbuffered).
-
-stdin, stdout and stderr specify the executed programs' standard
-input, standard output and standard error file handles, respectively.
-Valid values are PIPE, an existing file descriptor (a positive
-integer), an existing file object, and None. PIPE indicates that a
-new pipe to the child should be created. With None, no redirection
-will occur; the child's file handles will be inherited from the
-parent. Additionally, stderr can be STDOUT, which indicates that the
-stderr data from the applications should be captured into the same
-file handle as for stdout.
-
-If preexec_fn is set to a callable object, this object will be called
-in the child process just before the child is executed.
-
-If close_fds is true, all file descriptors except 0, 1 and 2 will be
-closed before the child process is executed.
-
-if shell is true, the specified command will be executed through the
-shell.
-
-If cwd is not None, the current directory will be changed to cwd
-before the child is executed.
-
-If env is not None, it defines the environment variables for the new
-process.
-
-If universal_newlines is true, the file objects stdout and stderr are
-opened as a text files, but lines may be terminated by any of '\n',
-the Unix end-of-line convention, '\r', the Macintosh convention or
-'\r\n', the Windows convention. All of these external representations
-are seen as '\n' by the Python program. Note: This feature is only
-available if Python is built with universal newline support (the
-default). Also, the newlines attribute of the file objects stdout,
-stdin and stderr are not updated by the communicate() method.
-
-The startupinfo and creationflags, if given, will be passed to the
-underlying CreateProcess() function. They can specify things such as
-appearance of the main window and priority for the new process.
-(Windows only)
-
-
-This module also defines two shortcut functions:
-
-call(*popenargs, **kwargs):
- Run command with arguments. Wait for command to complete, then
- return the returncode attribute.
-
- The arguments are the same as for the Popen constructor. Example:
-
- retcode = call(["ls", "-l"])
-
-check_call(*popenargs, **kwargs):
- Run command with arguments. Wait for command to complete. If the
- exit code was zero then return, otherwise raise
- CalledProcessError. The CalledProcessError object will have the
- return code in the returncode attribute.
-
- The arguments are the same as for the Popen constructor. Example:
-
- check_call(["ls", "-l"])
-
-Exceptions
-----------
-Exceptions raised in the child process, before the new program has
-started to execute, will be re-raised in the parent. Additionally,
-the exception object will have one extra attribute called
-'child_traceback', which is a string containing traceback information
-from the childs point of view.
-
-The most common exception raised is OSError. This occurs, for
-example, when trying to execute a non-existent file. Applications
-should prepare for OSErrors.
-
-A ValueError will be raised if Popen is called with invalid arguments.
-
-check_call() will raise CalledProcessError, if the called process
-returns a non-zero return code.
-
-
-Security
---------
-Unlike some other popen functions, this implementation will never call
-/bin/sh implicitly. This means that all characters, including shell
-metacharacters, can safely be passed to child processes.
-
-
-Popen objects
-=============
-Instances of the Popen class have the following methods:
-
-poll()
- Check if child process has terminated. Returns returncode
- attribute.
-
-wait()
- Wait for child process to terminate. Returns returncode attribute.
-
-communicate(input=None)
- Interact with process: Send data to stdin. Read data from stdout
- and stderr, until end-of-file is reached. Wait for process to
- terminate. The optional stdin argument should be a string to be
- sent to the child process, or None, if no data should be sent to
- the child.
-
- communicate() returns a tuple (stdout, stderr).
-
- Note: The data read is buffered in memory, so do not use this
- method if the data size is large or unlimited.
-
-The following attributes are also available:
-
-stdin
- If the stdin argument is PIPE, this attribute is a file object
- that provides input to the child process. Otherwise, it is None.
-
-stdout
- If the stdout argument is PIPE, this attribute is a file object
- that provides output from the child process. Otherwise, it is
- None.
-
-stderr
- If the stderr argument is PIPE, this attribute is file object that
- provides error output from the child process. Otherwise, it is
- None.
-
-pid
- The process ID of the child process.
-
-returncode
- The child return code. A None value indicates that the process
- hasn't terminated yet. A negative value -N indicates that the
- child was terminated by signal N (UNIX only).
-
-
-Replacing older functions with the subprocess module
-====================================================
-In this section, "a ==> b" means that b can be used as a replacement
-for a.
-
-Note: All functions in this section fail (more or less) silently if
-the executed program cannot be found; this module raises an OSError
-exception.
-
-In the following examples, we assume that the subprocess module is
-imported with "from subprocess import *".
-
-
-Replacing /bin/sh shell backquote
----------------------------------
-output=`mycmd myarg`
-==>
-output = Popen(["mycmd", "myarg"], stdout=PIPE).communicate()[0]
-
-
-Replacing shell pipe line
--------------------------
-output=`dmesg | grep hda`
-==>
-p1 = Popen(["dmesg"], stdout=PIPE)
-p2 = Popen(["grep", "hda"], stdin=p1.stdout, stdout=PIPE)
-output = p2.communicate()[0]
-
-
-Replacing os.system()
----------------------
-sts = os.system("mycmd" + " myarg")
-==>
-p = Popen("mycmd" + " myarg", shell=True)
-pid, sts = os.waitpid(p.pid, 0)
-
-Note:
-
-* Calling the program through the shell is usually not required.
-
-* It's easier to look at the returncode attribute than the
- exitstatus.
-
-A more real-world example would look like this:
-
-try:
- retcode = call("mycmd" + " myarg", shell=True)
- if retcode < 0:
- print >>sys.stderr, "Child was terminated by signal", -retcode
- else:
- print >>sys.stderr, "Child returned", retcode
-except OSError, e:
- print >>sys.stderr, "Execution failed:", e
-
-
-Replacing os.spawn*
--------------------
-P_NOWAIT example:
-
-pid = os.spawnlp(os.P_NOWAIT, "/bin/mycmd", "mycmd", "myarg")
-==>
-pid = Popen(["/bin/mycmd", "myarg"]).pid
-
-
-P_WAIT example:
-
-retcode = os.spawnlp(os.P_WAIT, "/bin/mycmd", "mycmd", "myarg")
-==>
-retcode = call(["/bin/mycmd", "myarg"])
-
-
-Vector example:
-
-os.spawnvp(os.P_NOWAIT, path, args)
-==>
-Popen([path] + args[1:])
-
-
-Environment example:
-
-os.spawnlpe(os.P_NOWAIT, "/bin/mycmd", "mycmd", "myarg", env)
-==>
-Popen(["/bin/mycmd", "myarg"], env={"PATH": "/usr/bin"})
-
-
-Replacing os.popen*
--------------------
-pipe = os.popen(cmd, mode='r', bufsize)
-==>
-pipe = Popen(cmd, shell=True, bufsize=bufsize, stdout=PIPE).stdout
-
-pipe = os.popen(cmd, mode='w', bufsize)
-==>
-pipe = Popen(cmd, shell=True, bufsize=bufsize, stdin=PIPE).stdin
-
-
-(child_stdin, child_stdout) = os.popen2(cmd, mode, bufsize)
-==>
-p = Popen(cmd, shell=True, bufsize=bufsize,
- stdin=PIPE, stdout=PIPE, close_fds=True)
-(child_stdin, child_stdout) = (p.stdin, p.stdout)
-
-
-(child_stdin,
- child_stdout,
- child_stderr) = os.popen3(cmd, mode, bufsize)
-==>
-p = Popen(cmd, shell=True, bufsize=bufsize,
- stdin=PIPE, stdout=PIPE, stderr=PIPE, close_fds=True)
-(child_stdin,
- child_stdout,
- child_stderr) = (p.stdin, p.stdout, p.stderr)
-
-
-(child_stdin, child_stdout_and_stderr) = os.popen4(cmd, mode, bufsize)
-==>
-p = Popen(cmd, shell=True, bufsize=bufsize,
- stdin=PIPE, stdout=PIPE, stderr=STDOUT, close_fds=True)
-(child_stdin, child_stdout_and_stderr) = (p.stdin, p.stdout)
-
-
-Replacing popen2.*
-------------------
-Note: If the cmd argument to popen2 functions is a string, the command
-is executed through /bin/sh. If it is a list, the command is directly
-executed.
-
-(child_stdout, child_stdin) = popen2.popen2("somestring", bufsize, mode)
-==>
-p = Popen(["somestring"], shell=True, bufsize=bufsize
- stdin=PIPE, stdout=PIPE, close_fds=True)
-(child_stdout, child_stdin) = (p.stdout, p.stdin)
-
-
-(child_stdout, child_stdin) = popen2.popen2(["mycmd", "myarg"], bufsize, mode)
-==>
-p = Popen(["mycmd", "myarg"], bufsize=bufsize,
- stdin=PIPE, stdout=PIPE, close_fds=True)
-(child_stdout, child_stdin) = (p.stdout, p.stdin)
-
-The popen2.Popen3 and popen3.Popen4 basically works as subprocess.Popen,
-except that:
-
-* subprocess.Popen raises an exception if the execution fails
-* the capturestderr argument is replaced with the stderr argument.
-* stdin=PIPE and stdout=PIPE must be specified.
-* popen2 closes all filedescriptors by default, but you have to specify
- close_fds=True with subprocess.Popen.
-
-
-"""
-
-import sys
-mswindows = (sys.platform == "win32")
-
-import os
-import types
-import traceback
-
-# Exception classes used by this module.
-class CalledProcessError(Exception):
- """This exception is raised when a process run by check_call() returns
- a non-zero exit status. The exit status will be stored in the
- returncode attribute."""
- def __init__(self, returncode, cmd):
- self.returncode = returncode
- self.cmd = cmd
- def __str__(self):
- return "Command '%s' returned non-zero exit status %d" % (self.cmd, self.returncode)
-
-
-if mswindows:
- try:
- import threading
- except ImportError:
- # SCons: the threading module is only used by the communicate()
- # method, which we don't actually use, so don't worry if we
- # can't import it.
- pass
- import msvcrt
- try:
- # Try to get _subprocess
- from _subprocess import *
- class STARTUPINFO(object):
- dwFlags = 0
- hStdInput = None
- hStdOutput = None
- hStdError = None
- wShowWindow = 0
- class pywintypes(object):
- error = IOError
- except ImportError:
- # If not there, then drop back to requiring pywin32
- # TODO: Should this be wrapped in try as well? To notify user to install
- # pywin32 ? With URL to it?
- import pywintypes
- from win32api import GetStdHandle, STD_INPUT_HANDLE, \
- STD_OUTPUT_HANDLE, STD_ERROR_HANDLE
- from win32api import GetCurrentProcess, DuplicateHandle, \
- GetModuleFileName, GetVersion
- from win32con import DUPLICATE_SAME_ACCESS, SW_HIDE
- from win32pipe import CreatePipe
- from win32process import CreateProcess, STARTUPINFO, \
- GetExitCodeProcess, STARTF_USESTDHANDLES, \
- STARTF_USESHOWWINDOW, CREATE_NEW_CONSOLE
- from win32event import WaitForSingleObject, INFINITE, WAIT_OBJECT_0
-
-
-else:
- import select
- import errno
- import fcntl
- import pickle
-
- try:
- fcntl.F_GETFD
- except AttributeError:
- fcntl.F_GETFD = 1
-
- try:
- fcntl.F_SETFD
- except AttributeError:
- fcntl.F_SETFD = 2
-
-__all__ = ["Popen", "PIPE", "STDOUT", "call", "check_call", "CalledProcessError"]
-
-try:
- MAXFD = os.sysconf("SC_OPEN_MAX")
-except KeyboardInterrupt:
- raise # SCons: don't swallow keyboard interrupts
-except:
- MAXFD = 256
-
-try:
- isinstance(1, int)
-except TypeError:
- def is_int(obj):
- return isinstance(obj, type(1))
- def is_int_or_long(obj):
- return type(obj) in (type(1), type(1L))
-else:
- def is_int(obj):
- return isinstance(obj, int)
- def is_int_or_long(obj):
- return isinstance(obj, (int, long))
-
-try:
- types.StringTypes
-except AttributeError:
- try:
- types.StringTypes = (str, unicode)
- except NameError:
- types.StringTypes = (str,)
-def is_string(obj):
- return isinstance(obj, types.StringTypes)
-
-_active = []
-
-def _cleanup():
- for inst in _active[:]:
- if inst.poll(_deadstate=sys.maxsize) >= 0:
- try:
- _active.remove(inst)
- except ValueError:
- # This can happen if two threads create a new Popen instance.
- # It's harmless that it was already removed, so ignore.
- pass
-
-PIPE = -1
-STDOUT = -2
-
-
-def call(*popenargs, **kwargs):
- """Run command with arguments. Wait for command to complete, then
- return the returncode attribute.
-
- The arguments are the same as for the Popen constructor. Example:
-
- retcode = call(["ls", "-l"])
- """
- return apply(Popen, popenargs, kwargs).wait()
-
-
-def check_call(*popenargs, **kwargs):
- """Run command with arguments. Wait for command to complete. If
- the exit code was zero then return, otherwise raise
- CalledProcessError. The CalledProcessError object will have the
- return code in the returncode attribute.
-
- The arguments are the same as for the Popen constructor. Example:
-
- check_call(["ls", "-l"])
- """
- retcode = call(*popenargs, **kwargs)
- cmd = kwargs.get("args")
- if cmd is None:
- cmd = popenargs[0]
- if retcode:
- raise CalledProcessError(retcode, cmd)
- return retcode
-
-
-def list2cmdline(seq):
- """
- Translate a sequence of arguments into a command line
- string, using the same rules as the MS C runtime:
-
- 1) Arguments are delimited by white space, which is either a
- space or a tab.
-
- 2) A string surrounded by double quotation marks is
- interpreted as a single argument, regardless of white space
- contained within. A quoted string can be embedded in an
- argument.
-
- 3) A double quotation mark preceded by a backslash is
- interpreted as a literal double quotation mark.
-
- 4) Backslashes are interpreted literally, unless they
- immediately precede a double quotation mark.
-
- 5) If backslashes immediately precede a double quotation mark,
- every pair of backslashes is interpreted as a literal
- backslash. If the number of backslashes is odd, the last
- backslash escapes the next double quotation mark as
- described in rule 3.
- """
-
- # See
- # http://msdn.microsoft.com/library/en-us/vccelng/htm/progs_12.asp
- result = []
- needquote = False
- for arg in seq:
- bs_buf = []
-
- # Add a space to separate this argument from the others
- if result:
- result.append(' ')
-
- needquote = (" " in arg) or ("\t" in arg)
- if needquote:
- result.append('"')
-
- for c in arg:
- if c == '\\':
- # Don't know if we need to double yet.
- bs_buf.append(c)
- elif c == '"':
- # Double backspaces.
- result.append('\\' * len(bs_buf)*2)
- bs_buf = []
- result.append('\\"')
- else:
- # Normal char
- if bs_buf:
- result.extend(bs_buf)
- bs_buf = []
- result.append(c)
-
- # Add remaining backspaces, if any.
- if bs_buf:
- result.extend(bs_buf)
-
- if needquote:
- result.extend(bs_buf)
- result.append('"')
-
- return ''.join(result)
-
-class Popen(object):
- def __init__(self, args, bufsize=0, executable=None,
- stdin=None, stdout=None, stderr=None,
- preexec_fn=None, close_fds=False, shell=False,
- cwd=None, env=None, universal_newlines=False,
- startupinfo=None, creationflags=0):
- """Create new Popen instance."""
- _cleanup()
-
- self._child_created = False
- if not is_int_or_long(bufsize):
- raise TypeError("bufsize must be an integer")
-
- if mswindows:
- if preexec_fn is not None:
- raise ValueError("preexec_fn is not supported on Windows "
- "platforms")
- if close_fds:
- raise ValueError("close_fds is not supported on Windows "
- "platforms")
- else:
- # POSIX
- if startupinfo is not None:
- raise ValueError("startupinfo is only supported on Windows "
- "platforms")
- if creationflags != 0:
- raise ValueError("creationflags is only supported on Windows "
- "platforms")
-
- self.stdin = None
- self.stdout = None
- self.stderr = None
- self.pid = None
- self.returncode = None
- self.universal_newlines = universal_newlines
-
- # Input and output objects. The general principle is like
- # this:
- #
- # Parent Child
- # ------ -----
- # p2cwrite ---stdin---> p2cread
- # c2pread <--stdout--- c2pwrite
- # errread <--stderr--- errwrite
- #
- # On POSIX, the child objects are file descriptors. On
- # Windows, these are Windows file handles. The parent objects
- # are file descriptors on both platforms. The parent objects
- # are None when not using PIPEs. The child objects are None
- # when not redirecting.
-
- (p2cread, p2cwrite,
- c2pread, c2pwrite,
- errread, errwrite) = self._get_handles(stdin, stdout, stderr)
-
- self._execute_child(args, executable, preexec_fn, close_fds,
- cwd, env, universal_newlines,
- startupinfo, creationflags, shell,
- p2cread, p2cwrite,
- c2pread, c2pwrite,
- errread, errwrite)
-
- if p2cwrite:
- self.stdin = os.fdopen(p2cwrite, 'wb', bufsize)
- if c2pread:
- if universal_newlines:
- self.stdout = os.fdopen(c2pread, 'rU', bufsize)
- else:
- self.stdout = os.fdopen(c2pread, 'rb', bufsize)
- if errread:
- if universal_newlines:
- self.stderr = os.fdopen(errread, 'rU', bufsize)
- else:
- self.stderr = os.fdopen(errread, 'rb', bufsize)
-
-
- def _translate_newlines(self, data):
- data = data.replace("\r\n", "\n")
- data = data.replace("\r", "\n")
- return data
-
-
- def __del__(self):
- if not self._child_created:
- # We didn't get to successfully create a child process.
- return
- # In case the child hasn't been waited on, check if it's done.
- self.poll(_deadstate=sys.maxsize)
- if self.returncode is None and _active is not None:
- # Child is still running, keep us alive until we can wait on it.
- _active.append(self)
-
-
- def communicate(self, input=None):
- """Interact with process: Send data to stdin. Read data from
- stdout and stderr, until end-of-file is reached. Wait for
- process to terminate. The optional input argument should be a
- string to be sent to the child process, or None, if no data
- should be sent to the child.
-
- communicate() returns a tuple (stdout, stderr)."""
-
- # Optimization: If we are only using one pipe, or no pipe at
- # all, using select() or threads is unnecessary.
- if [self.stdin, self.stdout, self.stderr].count(None) >= 2:
- stdout = None
- stderr = None
- if self.stdin:
- if input:
- self.stdin.write(input)
- self.stdin.close()
- elif self.stdout:
- stdout = self.stdout.read()
- elif self.stderr:
- stderr = self.stderr.read()
- self.wait()
- return (stdout, stderr)
-
- return self._communicate(input)
-
-
- if mswindows:
- #
- # Windows methods
- #
- def _get_handles(self, stdin, stdout, stderr):
- """Construct and return tupel with IO objects:
- p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite
- """
- if stdin is None and stdout is None and stderr is None:
- return (None, None, None, None, None, None)
-
- p2cread, p2cwrite = None, None
- c2pread, c2pwrite = None, None
- errread, errwrite = None, None
-
- if stdin is None:
- p2cread = GetStdHandle(STD_INPUT_HANDLE)
- elif stdin == PIPE:
- p2cread, p2cwrite = CreatePipe(None, 0)
- # Detach and turn into fd
- p2cwrite = p2cwrite.Detach()
- p2cwrite = msvcrt.open_osfhandle(p2cwrite, 0)
- elif is_int(stdin):
- p2cread = msvcrt.get_osfhandle(stdin)
- else:
- # Assuming file-like object
- p2cread = msvcrt.get_osfhandle(stdin.fileno())
- p2cread = self._make_inheritable(p2cread)
-
- if stdout is None:
- c2pwrite = GetStdHandle(STD_OUTPUT_HANDLE)
- elif stdout == PIPE:
- c2pread, c2pwrite = CreatePipe(None, 0)
- # Detach and turn into fd
- c2pread = c2pread.Detach()
- c2pread = msvcrt.open_osfhandle(c2pread, 0)
- elif is_int(stdout):
- c2pwrite = msvcrt.get_osfhandle(stdout)
- else:
- # Assuming file-like object
- c2pwrite = msvcrt.get_osfhandle(stdout.fileno())
- c2pwrite = self._make_inheritable(c2pwrite)
-
- if stderr is None:
- errwrite = GetStdHandle(STD_ERROR_HANDLE)
- elif stderr == PIPE:
- errread, errwrite = CreatePipe(None, 0)
- # Detach and turn into fd
- errread = errread.Detach()
- errread = msvcrt.open_osfhandle(errread, 0)
- elif stderr == STDOUT:
- errwrite = c2pwrite
- elif is_int(stderr):
- errwrite = msvcrt.get_osfhandle(stderr)
- else:
- # Assuming file-like object
- errwrite = msvcrt.get_osfhandle(stderr.fileno())
- errwrite = self._make_inheritable(errwrite)
-
- return (p2cread, p2cwrite,
- c2pread, c2pwrite,
- errread, errwrite)
-
-
- def _make_inheritable(self, handle):
- """Return a duplicate of handle, which is inheritable"""
- return DuplicateHandle(GetCurrentProcess(), handle,
- GetCurrentProcess(), 0, 1,
- DUPLICATE_SAME_ACCESS)
-
-
- def _find_w9xpopen(self):
- """Find and return absolut path to w9xpopen.exe"""
- w9xpopen = os.path.join(os.path.dirname(GetModuleFileName(0)),
- "w9xpopen.exe")
- if not os.path.exists(w9xpopen):
- # Eeek - file-not-found - possibly an embedding
- # situation - see if we can locate it in sys.exec_prefix
- w9xpopen = os.path.join(os.path.dirname(sys.exec_prefix),
- "w9xpopen.exe")
- if not os.path.exists(w9xpopen):
- raise RuntimeError("Cannot locate w9xpopen.exe, which is "
- "needed for Popen to work with your "
- "shell or platform.")
- return w9xpopen
-
-
- def _execute_child(self, args, executable, preexec_fn, close_fds,
- cwd, env, universal_newlines,
- startupinfo, creationflags, shell,
- p2cread, p2cwrite,
- c2pread, c2pwrite,
- errread, errwrite):
- """Execute program (MS Windows version)"""
-
- if not isinstance(args, types.StringTypes):
- args = list2cmdline(args)
-
- # Process startup details
- if startupinfo is None:
- startupinfo = STARTUPINFO()
- if None not in (p2cread, c2pwrite, errwrite):
- startupinfo.dwFlags = startupinfo.dwFlags | STARTF_USESTDHANDLES
- startupinfo.hStdInput = p2cread
- startupinfo.hStdOutput = c2pwrite
- startupinfo.hStdError = errwrite
-
- if shell:
- startupinfo.dwFlags = startupinfo.dwFlags | STARTF_USESHOWWINDOW
- startupinfo.wShowWindow = SW_HIDE
- comspec = os.environ.get("COMSPEC", "cmd.exe")
- args = comspec + " /c " + args
- if (GetVersion() >= 0x80000000L or
- os.path.basename(comspec).lower() == "command.com"):
- # Win9x, or using command.com on NT. We need to
- # use the w9xpopen intermediate program. For more
- # information, see KB Q150956
- # (http://web.archive.org/web/20011105084002/http://support.microsoft.com/support/kb/articles/Q150/9/56.asp)
- w9xpopen = self._find_w9xpopen()
- args = '"%s" %s' % (w9xpopen, args)
- # Not passing CREATE_NEW_CONSOLE has been known to
- # cause random failures on win9x. Specifically a
- # dialog: "Your program accessed mem currently in
- # use at xxx" and a hopeful warning about the
- # stability of your system. Cost is Ctrl+C wont
- # kill children.
- creationflags = creationflags | CREATE_NEW_CONSOLE
-
- # Start the process
- try:
- hp, ht, pid, tid = CreateProcess(executable, args,
- # no special security
- None, None,
- # must inherit handles to pass std
- # handles
- 1,
- creationflags,
- env,
- cwd,
- startupinfo)
- except pywintypes.error, e:
- # Translate pywintypes.error to WindowsError, which is
- # a subclass of OSError. FIXME: We should really
- # translate errno using _sys_errlist (or simliar), but
- # how can this be done from Python?
- raise WindowsError(*e.args)
-
- # Retain the process handle, but close the thread handle
- self._child_created = True
- self._handle = hp
- self.pid = pid
- ht.Close()
-
- # Child is launched. Close the parent's copy of those pipe
- # handles that only the child should have open. You need
- # to make sure that no handles to the write end of the
- # output pipe are maintained in this process or else the
- # pipe will not close when the child process exits and the
- # ReadFile will hang.
- if p2cread is not None:
- p2cread.Close()
- if c2pwrite is not None:
- c2pwrite.Close()
- if errwrite is not None:
- errwrite.Close()
-
-
- def poll(self, _deadstate=None):
- """Check if child process has terminated. Returns returncode
- attribute."""
- if self.returncode is None:
- if WaitForSingleObject(self._handle, 0) == WAIT_OBJECT_0:
- self.returncode = GetExitCodeProcess(self._handle)
- return self.returncode
-
-
- def wait(self):
- """Wait for child process to terminate. Returns returncode
- attribute."""
- if self.returncode is None:
- obj = WaitForSingleObject(self._handle, INFINITE)
- self.returncode = GetExitCodeProcess(self._handle)
- return self.returncode
-
-
- def _readerthread(self, fh, buffer):
- buffer.append(fh.read())
-
-
- def _communicate(self, input):
- stdout = None # Return
- stderr = None # Return
-
- if self.stdout:
- stdout = []
- stdout_thread = threading.Thread(target=self._readerthread,
- args=(self.stdout, stdout))
- stdout_thread.setDaemon(True)
- stdout_thread.start()
- if self.stderr:
- stderr = []
- stderr_thread = threading.Thread(target=self._readerthread,
- args=(self.stderr, stderr))
- stderr_thread.setDaemon(True)
- stderr_thread.start()
-
- if self.stdin:
- if input is not None:
- self.stdin.write(input)
- self.stdin.close()
-
- if self.stdout:
- stdout_thread.join()
- if self.stderr:
- stderr_thread.join()
-
- # All data exchanged. Translate lists into strings.
- if stdout is not None:
- stdout = stdout[0]
- if stderr is not None:
- stderr = stderr[0]
-
- # Translate newlines, if requested. We cannot let the file
- # object do the translation: It is based on stdio, which is
- # impossible to combine with select (unless forcing no
- # buffering).
- if self.universal_newlines and hasattr(file, 'newlines'):
- if stdout:
- stdout = self._translate_newlines(stdout)
- if stderr:
- stderr = self._translate_newlines(stderr)
-
- self.wait()
- return (stdout, stderr)
-
- else:
- #
- # POSIX methods
- #
- def _get_handles(self, stdin, stdout, stderr):
- """Construct and return tupel with IO objects:
- p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite
- """
- p2cread, p2cwrite = None, None
- c2pread, c2pwrite = None, None
- errread, errwrite = None, None
-
- if stdin is None:
- pass
- elif stdin == PIPE:
- p2cread, p2cwrite = os.pipe()
- elif is_int(stdin):
- p2cread = stdin
- else:
- # Assuming file-like object
- p2cread = stdin.fileno()
-
- if stdout is None:
- pass
- elif stdout == PIPE:
- c2pread, c2pwrite = os.pipe()
- elif is_int(stdout):
- c2pwrite = stdout
- else:
- # Assuming file-like object
- c2pwrite = stdout.fileno()
-
- if stderr is None:
- pass
- elif stderr == PIPE:
- errread, errwrite = os.pipe()
- elif stderr == STDOUT:
- errwrite = c2pwrite
- elif is_int(stderr):
- errwrite = stderr
- else:
- # Assuming file-like object
- errwrite = stderr.fileno()
-
- return (p2cread, p2cwrite,
- c2pread, c2pwrite,
- errread, errwrite)
-
-
- def _set_cloexec_flag(self, fd):
- try:
- cloexec_flag = fcntl.FD_CLOEXEC
- except AttributeError:
- cloexec_flag = 1
-
- old = fcntl.fcntl(fd, fcntl.F_GETFD)
- fcntl.fcntl(fd, fcntl.F_SETFD, old | cloexec_flag)
-
-
- def _close_fds(self, but):
- for i in range(3, MAXFD):
- if i == but:
- continue
- try:
- os.close(i)
- except KeyboardInterrupt:
- raise # SCons: don't swallow keyboard interrupts
- except:
- pass
-
-
- def _execute_child(self, args, executable, preexec_fn, close_fds,
- cwd, env, universal_newlines,
- startupinfo, creationflags, shell,
- p2cread, p2cwrite,
- c2pread, c2pwrite,
- errread, errwrite):
- """Execute program (POSIX version)"""
-
- if is_string(args):
- args = [args]
-
- if shell:
- args = ["/bin/sh", "-c"] + args
-
- if executable is None:
- executable = args[0]
-
- # For transferring possible exec failure from child to parent
- # The first char specifies the exception type: 0 means
- # OSError, 1 means some other error.
- errpipe_read, errpipe_write = os.pipe()
- self._set_cloexec_flag(errpipe_write)
-
- self.pid = os.fork()
- self._child_created = True
- if self.pid == 0:
- # Child
- try:
- # Close parent's pipe ends
- if p2cwrite:
- os.close(p2cwrite)
- if c2pread:
- os.close(c2pread)
- if errread:
- os.close(errread)
- os.close(errpipe_read)
-
- # Dup fds for child
- if p2cread:
- os.dup2(p2cread, 0)
- if c2pwrite:
- os.dup2(c2pwrite, 1)
- if errwrite:
- os.dup2(errwrite, 2)
-
- # Close pipe fds. Make sure we don't close the same
- # fd more than once, or standard fds.
- try:
- set
- except NameError:
- # Fall-back for earlier Python versions, so epydoc
- # can use this module directly to execute things.
- if p2cread:
- os.close(p2cread)
- if c2pwrite and c2pwrite not in (p2cread,):
- os.close(c2pwrite)
- if errwrite and errwrite not in (p2cread, c2pwrite):
- os.close(errwrite)
- else:
- for fd in set((p2cread, c2pwrite, errwrite))-set((0,1,2)):
- if fd: os.close(fd)
-
- # Close all other fds, if asked for
- if close_fds:
- self._close_fds(but=errpipe_write)
-
- if cwd is not None:
- os.chdir(cwd)
-
- if preexec_fn:
- apply(preexec_fn)
-
- if env is None:
- os.execvp(executable, args)
- else:
- os.execvpe(executable, args, env)
-
- except KeyboardInterrupt:
- raise # SCons: don't swallow keyboard interrupts
-
- except:
- exc_type, exc_value, tb = sys.exc_info()
- # Save the traceback and attach it to the exception object
- exc_lines = traceback.format_exception(exc_type,
- exc_value,
- tb)
- exc_value.child_traceback = ''.join(exc_lines)
- os.write(errpipe_write, pickle.dumps(exc_value))
-
- # This exitcode won't be reported to applications, so it
- # really doesn't matter what we return.
- os._exit(255)
-
- # Parent
- os.close(errpipe_write)
- if p2cread and p2cwrite:
- os.close(p2cread)
- if c2pwrite and c2pread:
- os.close(c2pwrite)
- if errwrite and errread:
- os.close(errwrite)
-
- # Wait for exec to fail or succeed; possibly raising exception
- data = os.read(errpipe_read, 1048576) # Exceptions limited to 1 MB
- os.close(errpipe_read)
- if data != "":
- os.waitpid(self.pid, 0)
- child_exception = pickle.loads(data)
- raise child_exception
-
-
- def _handle_exitstatus(self, sts):
- if os.WIFSIGNALED(sts):
- self.returncode = -os.WTERMSIG(sts)
- elif os.WIFEXITED(sts):
- self.returncode = os.WEXITSTATUS(sts)
- else:
- # Should never happen
- raise RuntimeError("Unknown child exit status!")
-
-
- def poll(self, _deadstate=None):
- """Check if child process has terminated. Returns returncode
- attribute."""
- if self.returncode is None:
- try:
- pid, sts = os.waitpid(self.pid, os.WNOHANG)
- if pid == self.pid:
- self._handle_exitstatus(sts)
- except os.error:
- if _deadstate is not None:
- self.returncode = _deadstate
- return self.returncode
-
-
- def wait(self):
- """Wait for child process to terminate. Returns returncode
- attribute."""
- if self.returncode is None:
- pid, sts = os.waitpid(self.pid, 0)
- self._handle_exitstatus(sts)
- return self.returncode
-
-
- def _communicate(self, input):
- read_set = []
- write_set = []
- stdout = None # Return
- stderr = None # Return
-
- if self.stdin:
- # Flush stdio buffer. This might block, if the user has
- # been writing to .stdin in an uncontrolled fashion.
- self.stdin.flush()
- if input:
- write_set.append(self.stdin)
- else:
- self.stdin.close()
- if self.stdout:
- read_set.append(self.stdout)
- stdout = []
- if self.stderr:
- read_set.append(self.stderr)
- stderr = []
-
- input_offset = 0
- while read_set or write_set:
- rlist, wlist, xlist = select.select(read_set, write_set, [])
-
- if self.stdin in wlist:
- # When select has indicated that the file is writable,
- # we can write up to PIPE_BUF bytes without risk
- # blocking. POSIX defines PIPE_BUF >= 512
- m = memoryview(input)[input_offset:input_offset+512]
- bytes_written = os.write(self.stdin.fileno(), m)
- input_offset = input_offset + bytes_written
- if input_offset >= len(input):
- self.stdin.close()
- write_set.remove(self.stdin)
-
- if self.stdout in rlist:
- data = os.read(self.stdout.fileno(), 1024)
- if data == "":
- self.stdout.close()
- read_set.remove(self.stdout)
- stdout.append(data)
-
- if self.stderr in rlist:
- data = os.read(self.stderr.fileno(), 1024)
- if data == "":
- self.stderr.close()
- read_set.remove(self.stderr)
- stderr.append(data)
-
- # All data exchanged. Translate lists into strings.
- if stdout is not None:
- stdout = ''.join(stdout)
- if stderr is not None:
- stderr = ''.join(stderr)
-
- # Translate newlines, if requested. We cannot let the file
- # object do the translation: It is based on stdio, which is
- # impossible to combine with select (unless forcing no
- # buffering).
- if self.universal_newlines and hasattr(file, 'newlines'):
- if stdout:
- stdout = self._translate_newlines(stdout)
- if stderr:
- stderr = self._translate_newlines(stderr)
-
- self.wait()
- return (stdout, stderr)
-
-
-def _demo_posix():
- #
- # Example 1: Simple redirection: Get process list
- #
- plist = Popen(["ps"], stdout=PIPE).communicate()[0]
- print "Process list:"
- print plist
-
- #
- # Example 2: Change uid before executing child
- #
- if os.getuid() == 0:
- p = Popen(["id"], preexec_fn=lambda: os.setuid(100))
- p.wait()
-
- #
- # Example 3: Connecting several subprocesses
- #
- print "Looking for 'hda'..."
- p1 = Popen(["dmesg"], stdout=PIPE)
- p2 = Popen(["grep", "hda"], stdin=p1.stdout, stdout=PIPE)
- print repr(p2.communicate()[0])
-
- #
- # Example 4: Catch execution error
- #
- print
- print "Trying a weird file..."
- try:
- print Popen(["/this/path/does/not/exist"]).communicate()
- except OSError, e:
- if e.errno == errno.ENOENT:
- print "The file didn't exist. I thought so..."
- print "Child traceback:"
- print e.child_traceback
- else:
- print "Error", e.errno
- else:
- sys.stderr.write( "Gosh. No error.\n" )
-
-
-def _demo_windows():
- #
- # Example 1: Connecting several subprocesses
- #
- print "Looking for 'PROMPT' in set output..."
- p1 = Popen("set", stdout=PIPE, shell=True)
- p2 = Popen('find "PROMPT"', stdin=p1.stdout, stdout=PIPE)
- print repr(p2.communicate()[0])
-
- #
- # Example 2: Simple execution of program
- #
- print "Executing calc..."
- p = Popen("calc")
- p.wait()
-
-
-if __name__ == "__main__":
- if mswindows:
- _demo_windows()
- else:
- _demo_posix()
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/cpp.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/cpp.py
deleted file mode 100644
index cf80a4b..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/cpp.py
+++ /dev/null
@@ -1,590 +0,0 @@
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-
-__revision__ = "src/engine/SCons/cpp.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-__doc__ = """
-SCons C Pre-Processor module
-"""
-#TODO 2.3 and before has no sorted()
-import SCons.compat
-
-import os
-import re
-
-#
-# First "subsystem" of regular expressions that we set up:
-#
-# Stuff to turn the C preprocessor directives in a file's contents into
-# a list of tuples that we can process easily.
-#
-
-# A table of regular expressions that fetch the arguments from the rest of
-# a C preprocessor line. Different directives have different arguments
-# that we want to fetch, using the regular expressions to which the lists
-# of preprocessor directives map.
-cpp_lines_dict = {
- # Fetch the rest of a #if/#elif/#ifdef/#ifndef as one argument,
- # separated from the keyword by white space.
- ('if', 'elif', 'ifdef', 'ifndef',)
- : '\s+(.+)',
-
- # Fetch the rest of a #import/#include/#include_next line as one
- # argument, with white space optional.
- ('import', 'include', 'include_next',)
- : '\s*(.+)',
-
- # We don't care what comes after a #else or #endif line.
- ('else', 'endif',) : '',
-
- # Fetch three arguments from a #define line:
- # 1) The #defined keyword.
- # 2) The optional parentheses and arguments (if it's a function-like
- # macro, '' if it's not).
- # 3) The expansion value.
- ('define',) : '\s+([_A-Za-z][_A-Za-z0-9_]*)(\([^)]*\))?\s*(.*)',
-
- # Fetch the #undefed keyword from a #undef line.
- ('undef',) : '\s+([_A-Za-z][A-Za-z0-9_]*)',
-}
-
-# Create a table that maps each individual C preprocessor directive to
-# the corresponding compiled regular expression that fetches the arguments
-# we care about.
-Table = {}
-for op_list, expr in cpp_lines_dict.items():
- e = re.compile(expr)
- for op in op_list:
- Table[op] = e
-del e
-del op
-del op_list
-
-# Create a list of the expressions we'll use to match all of the
-# preprocessor directives. These are the same as the directives
-# themselves *except* that we must use a negative lookahead assertion
-# when matching "if" so it doesn't match the "if" in "ifdef."
-override = {
- 'if' : 'if(?!def)',
-}
-l = [override.get(x, x) for x in Table.keys()]
-
-
-# Turn the list of expressions into one big honkin' regular expression
-# that will match all the preprocessor lines at once. This will return
-# a list of tuples, one for each preprocessor line. The preprocessor
-# directive will be the first element in each tuple, and the rest of
-# the line will be the second element.
-e = '^\s*#\s*(' + '|'.join(l) + ')(.*)$'
-
-# And last but not least, compile the expression.
-CPP_Expression = re.compile(e, re.M)
-
-
-
-
-#
-# Second "subsystem" of regular expressions that we set up:
-#
-# Stuff to translate a C preprocessor expression (as found on a #if or
-# #elif line) into an equivalent Python expression that we can eval().
-#
-
-# A dictionary that maps the C representation of Boolean operators
-# to their Python equivalents.
-CPP_to_Python_Ops_Dict = {
- '!' : ' not ',
- '!=' : ' != ',
- '&&' : ' and ',
- '||' : ' or ',
- '?' : ' and ',
- ':' : ' or ',
- '\r' : '',
-}
-
-CPP_to_Python_Ops_Sub = lambda m: CPP_to_Python_Ops_Dict[m.group(0)]
-
-# We have to sort the keys by length so that longer expressions
-# come *before* shorter expressions--in particular, "!=" must
-# come before "!" in the alternation. Without this, the Python
-# re module, as late as version 2.2.2, empirically matches the
-# "!" in "!=" first, instead of finding the longest match.
-# What's up with that?
-l = sorted(CPP_to_Python_Ops_Dict.keys(), key=lambda a: len(a), reverse=True)
-
-# Turn the list of keys into one regular expression that will allow us
-# to substitute all of the operators at once.
-expr = '|'.join(map(re.escape, l))
-
-# ...and compile the expression.
-CPP_to_Python_Ops_Expression = re.compile(expr)
-
-# A separate list of expressions to be evaluated and substituted
-# sequentially, not all at once.
-CPP_to_Python_Eval_List = [
- ['defined\s+(\w+)', '"\\1" in __dict__'],
- ['defined\s*\((\w+)\)', '"\\1" in __dict__'],
- ['/\*.*\*/', ''],
- ['/\*.*', ''],
- ['//.*', ''],
- ['(0x[0-9A-Fa-f]*)[UL]+', '\\1'],
-]
-
-# Replace the string representations of the regular expressions in the
-# list with compiled versions.
-for l in CPP_to_Python_Eval_List:
- l[0] = re.compile(l[0])
-
-# Wrap up all of the above into a handy function.
-def CPP_to_Python(s):
- """
- Converts a C pre-processor expression into an equivalent
- Python expression that can be evaluated.
- """
- s = CPP_to_Python_Ops_Expression.sub(CPP_to_Python_Ops_Sub, s)
- for expr, repl in CPP_to_Python_Eval_List:
- s = expr.sub(repl, s)
- return s
-
-
-
-del expr
-del l
-del override
-
-
-
-class FunctionEvaluator(object):
- """
- Handles delayed evaluation of a #define function call.
- """
- def __init__(self, name, args, expansion):
- """
- Squirrels away the arguments and expansion value of a #define
- macro function for later evaluation when we must actually expand
- a value that uses it.
- """
- self.name = name
- self.args = function_arg_separator.split(args)
- try:
- expansion = expansion.split('##')
- except AttributeError:
- pass
- self.expansion = expansion
- def __call__(self, *values):
- """
- Evaluates the expansion of a #define macro function called
- with the specified values.
- """
- if len(self.args) != len(values):
- raise ValueError("Incorrect number of arguments to `%s'" % self.name)
- # Create a dictionary that maps the macro arguments to the
- # corresponding values in this "call." We'll use this when we
- # eval() the expansion so that arguments will get expanded to
- # the right values.
- locals = {}
- for k, v in zip(self.args, values):
- locals[k] = v
-
- parts = []
- for s in self.expansion:
- if not s in self.args:
- s = repr(s)
- parts.append(s)
- statement = ' + '.join(parts)
-
- return eval(statement, globals(), locals)
-
-
-
-# Find line continuations.
-line_continuations = re.compile('\\\\\r?\n')
-
-# Search for a "function call" macro on an expansion. Returns the
-# two-tuple of the "function" name itself, and a string containing the
-# arguments within the call parentheses.
-function_name = re.compile('(\S+)\(([^)]*)\)')
-
-# Split a string containing comma-separated function call arguments into
-# the separate arguments.
-function_arg_separator = re.compile(',\s*')
-
-
-
-class PreProcessor(object):
- """
- The main workhorse class for handling C pre-processing.
- """
- def __init__(self, current=os.curdir, cpppath=(), dict={}, all=0):
- global Table
-
- cpppath = tuple(cpppath)
-
- self.searchpath = {
- '"' : (current,) + cpppath,
- '<' : cpppath + (current,),
- }
-
- # Initialize our C preprocessor namespace for tracking the
- # values of #defined keywords. We use this namespace to look
- # for keywords on #ifdef/#ifndef lines, and to eval() the
- # expressions on #if/#elif lines (after massaging them from C to
- # Python).
- self.cpp_namespace = dict.copy()
- self.cpp_namespace['__dict__'] = self.cpp_namespace
-
- if all:
- self.do_include = self.all_include
-
- # For efficiency, a dispatch table maps each C preprocessor
- # directive (#if, #define, etc.) to the method that should be
- # called when we see it. We accomodate state changes (#if,
- # #ifdef, #ifndef) by pushing the current dispatch table on a
- # stack and changing what method gets called for each relevant
- # directive we might see next at this level (#else, #elif).
- # #endif will simply pop the stack.
- d = {
- 'scons_current_file' : self.scons_current_file
- }
- for op in Table.keys():
- d[op] = getattr(self, 'do_' + op)
- self.default_table = d
-
- # Controlling methods.
-
- def tupleize(self, contents):
- """
- Turns the contents of a file into a list of easily-processed
- tuples describing the CPP lines in the file.
-
- The first element of each tuple is the line's preprocessor
- directive (#if, #include, #define, etc., minus the initial '#').
- The remaining elements are specific to the type of directive, as
- pulled apart by the regular expression.
- """
- global CPP_Expression, Table
- contents = line_continuations.sub('', contents)
- cpp_tuples = CPP_Expression.findall(contents)
- return [(m[0],) + Table[m[0]].match(m[1]).groups() for m in cpp_tuples]
-
- def __call__(self, file):
- """
- Pre-processes a file.
-
- This is the main public entry point.
- """
- self.current_file = file
- return self.process_contents(self.read_file(file), file)
-
- def process_contents(self, contents, fname=None):
- """
- Pre-processes a file contents.
-
- This is the main internal entry point.
- """
- self.stack = []
- self.dispatch_table = self.default_table.copy()
- self.current_file = fname
- self.tuples = self.tupleize(contents)
-
- self.initialize_result(fname)
- while self.tuples:
- t = self.tuples.pop(0)
- # Uncomment to see the list of tuples being processed (e.g.,
- # to validate the CPP lines are being translated correctly).
- #print t
- self.dispatch_table[t[0]](t)
- return self.finalize_result(fname)
-
- # Dispatch table stack manipulation methods.
-
- def save(self):
- """
- Pushes the current dispatch table on the stack and re-initializes
- the current dispatch table to the default.
- """
- self.stack.append(self.dispatch_table)
- self.dispatch_table = self.default_table.copy()
-
- def restore(self):
- """
- Pops the previous dispatch table off the stack and makes it the
- current one.
- """
- try: self.dispatch_table = self.stack.pop()
- except IndexError: pass
-
- # Utility methods.
-
- def do_nothing(self, t):
- """
- Null method for when we explicitly want the action for a
- specific preprocessor directive to do nothing.
- """
- pass
-
- def scons_current_file(self, t):
- self.current_file = t[1]
-
- def eval_expression(self, t):
- """
- Evaluates a C preprocessor expression.
-
- This is done by converting it to a Python equivalent and
- eval()ing it in the C preprocessor namespace we use to
- track #define values.
- """
- t = CPP_to_Python(' '.join(t[1:]))
- try: return eval(t, self.cpp_namespace)
- except (NameError, TypeError): return 0
-
- def initialize_result(self, fname):
- self.result = [fname]
-
- def finalize_result(self, fname):
- return self.result[1:]
-
- def find_include_file(self, t):
- """
- Finds the #include file for a given preprocessor tuple.
- """
- fname = t[2]
- for d in self.searchpath[t[1]]:
- if d == os.curdir:
- f = fname
- else:
- f = os.path.join(d, fname)
- if os.path.isfile(f):
- return f
- return None
-
- def read_file(self, file):
- return open(file).read()
-
- # Start and stop processing include lines.
-
- def start_handling_includes(self, t=None):
- """
- Causes the PreProcessor object to start processing #import,
- #include and #include_next lines.
-
- This method will be called when a #if, #ifdef, #ifndef or #elif
- evaluates True, or when we reach the #else in a #if, #ifdef,
- #ifndef or #elif block where a condition already evaluated
- False.
-
- """
- d = self.dispatch_table
- p = self.stack[-1] if self.stack else self.default_table
-
- for k in ('import', 'include', 'include_next'):
- d[k] = p[k]
-
- def stop_handling_includes(self, t=None):
- """
- Causes the PreProcessor object to stop processing #import,
- #include and #include_next lines.
-
- This method will be called when a #if, #ifdef, #ifndef or #elif
- evaluates False, or when we reach the #else in a #if, #ifdef,
- #ifndef or #elif block where a condition already evaluated True.
- """
- d = self.dispatch_table
- d['import'] = self.do_nothing
- d['include'] = self.do_nothing
- d['include_next'] = self.do_nothing
-
- # Default methods for handling all of the preprocessor directives.
- # (Note that what actually gets called for a given directive at any
- # point in time is really controlled by the dispatch_table.)
-
- def _do_if_else_condition(self, condition):
- """
- Common logic for evaluating the conditions on #if, #ifdef and
- #ifndef lines.
- """
- self.save()
- d = self.dispatch_table
- if condition:
- self.start_handling_includes()
- d['elif'] = self.stop_handling_includes
- d['else'] = self.stop_handling_includes
- else:
- self.stop_handling_includes()
- d['elif'] = self.do_elif
- d['else'] = self.start_handling_includes
-
- def do_ifdef(self, t):
- """
- Default handling of a #ifdef line.
- """
- self._do_if_else_condition(t[1] in self.cpp_namespace)
-
- def do_ifndef(self, t):
- """
- Default handling of a #ifndef line.
- """
- self._do_if_else_condition(t[1] not in self.cpp_namespace)
-
- def do_if(self, t):
- """
- Default handling of a #if line.
- """
- self._do_if_else_condition(self.eval_expression(t))
-
- def do_elif(self, t):
- """
- Default handling of a #elif line.
- """
- d = self.dispatch_table
- if self.eval_expression(t):
- self.start_handling_includes()
- d['elif'] = self.stop_handling_includes
- d['else'] = self.stop_handling_includes
-
- def do_else(self, t):
- """
- Default handling of a #else line.
- """
- pass
-
- def do_endif(self, t):
- """
- Default handling of a #endif line.
- """
- self.restore()
-
- def do_define(self, t):
- """
- Default handling of a #define line.
- """
- _, name, args, expansion = t
- try:
- expansion = int(expansion)
- except (TypeError, ValueError):
- pass
- if args:
- evaluator = FunctionEvaluator(name, args[1:-1], expansion)
- self.cpp_namespace[name] = evaluator
- else:
- self.cpp_namespace[name] = expansion
-
- def do_undef(self, t):
- """
- Default handling of a #undef line.
- """
- try: del self.cpp_namespace[t[1]]
- except KeyError: pass
-
- def do_import(self, t):
- """
- Default handling of a #import line.
- """
- # XXX finish this -- maybe borrow/share logic from do_include()...?
- pass
-
- def do_include(self, t):
- """
- Default handling of a #include line.
- """
- t = self.resolve_include(t)
- include_file = self.find_include_file(t)
- if include_file:
- #print "include_file =", include_file
- self.result.append(include_file)
- contents = self.read_file(include_file)
- new_tuples = [('scons_current_file', include_file)] + \
- self.tupleize(contents) + \
- [('scons_current_file', self.current_file)]
- self.tuples[:] = new_tuples + self.tuples
-
- # Date: Tue, 22 Nov 2005 20:26:09 -0500
- # From: Stefan Seefeld <seefeld@sympatico.ca>
- #
- # By the way, #include_next is not the same as #include. The difference
- # being that #include_next starts its search in the path following the
- # path that let to the including file. In other words, if your system
- # include paths are ['/foo', '/bar'], and you are looking at a header
- # '/foo/baz.h', it might issue an '#include_next <baz.h>' which would
- # correctly resolve to '/bar/baz.h' (if that exists), but *not* see
- # '/foo/baz.h' again. See http://www.delorie.com/gnu/docs/gcc/cpp_11.html
- # for more reasoning.
- #
- # I have no idea in what context 'import' might be used.
-
- # XXX is #include_next really the same as #include ?
- do_include_next = do_include
-
- # Utility methods for handling resolution of include files.
-
- def resolve_include(self, t):
- """Resolve a tuple-ized #include line.
-
- This handles recursive expansion of values without "" or <>
- surrounding the name until an initial " or < is found, to handle
- #include FILE
- where FILE is a #define somewhere else.
- """
- s = t[1]
- while not s[0] in '<"':
- #print "s =", s
- try:
- s = self.cpp_namespace[s]
- except KeyError:
- m = function_name.search(s)
- s = self.cpp_namespace[m.group(1)]
- if callable(s):
- args = function_arg_separator.split(m.group(2))
- s = s(*args)
- if not s:
- return None
- return (t[0], s[0], s[1:-1])
-
- def all_include(self, t):
- """
- """
- self.result.append(self.resolve_include(t))
-
-class DumbPreProcessor(PreProcessor):
- """A preprocessor that ignores all #if/#elif/#else/#endif directives
- and just reports back *all* of the #include files (like the classic
- SCons scanner did).
-
- This is functionally equivalent to using a regular expression to
- find all of the #include lines, only slower. It exists mainly as
- an example of how the main PreProcessor class can be sub-classed
- to tailor its behavior.
- """
- def __init__(self, *args, **kw):
- PreProcessor.__init__(self, *args, **kw)
- d = self.default_table
- for func in ['if', 'elif', 'else', 'endif', 'ifdef', 'ifndef']:
- d[func] = d[func] = self.do_nothing
-
-del __revision__
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/dblite.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/dblite.py
deleted file mode 100644
index f4ba90a..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/dblite.py
+++ /dev/null
@@ -1,254 +0,0 @@
-# dblite.py module contributed by Ralf W. Grosse-Kunstleve.
-# Extended for Unicode by Steven Knight.
-
-import SCons.compat
-
-import builtins
-import os
-# compat layer imports "cPickle" for us if it's available.
-import pickle
-import shutil
-import time
-
-keep_all_files = 00000
-ignore_corrupt_dbfiles = 0
-
-def corruption_warning(filename):
- print "Warning: Discarding corrupt database:", filename
-
-try: unicode
-except NameError:
- def is_string(s):
- return isinstance(s, str)
-else:
- def is_string(s):
- return type(s) in (str, unicode)
-
-try:
- unicode('a')
-except NameError:
- def unicode(s): return s
-
-dblite_suffix = '.dblite'
-tmp_suffix = '.tmp'
-
-class dblite(object):
-
- # Squirrel away references to the functions in various modules
- # that we'll use when our __del__() method calls our sync() method
- # during shutdown. We might get destroyed when Python is in the midst
- # of tearing down the different modules we import in an essentially
- # arbitrary order, and some of the various modules's global attributes
- # may already be wiped out from under us.
- #
- # See the discussion at:
- # http://mail.python.org/pipermail/python-bugs-list/2003-March/016877.html
-
- _open = builtins.open
- _pickle_dump = staticmethod(pickle.dump)
- _os_chmod = os.chmod
- try:
- _os_chown = os.chown
- except AttributeError:
- _os_chown = None
- _os_rename = os.rename
- _os_unlink = os.unlink
- _shutil_copyfile = shutil.copyfile
- _time_time = time.time
-
- def __init__(self, file_base_name, flag, mode):
- assert flag in (None, "r", "w", "c", "n")
- if (flag is None): flag = "r"
- base, ext = os.path.splitext(file_base_name)
- if ext == dblite_suffix:
- # There's already a suffix on the file name, don't add one.
- self._file_name = file_base_name
- self._tmp_name = base + tmp_suffix
- else:
- self._file_name = file_base_name + dblite_suffix
- self._tmp_name = file_base_name + tmp_suffix
- self._flag = flag
- self._mode = mode
- self._dict = {}
- self._needs_sync = 00000
- if self._os_chown is not None and (os.geteuid()==0 or os.getuid()==0):
- # running as root; chown back to current owner/group when done
- try:
- statinfo = os.stat(self._file_name)
- self._chown_to = statinfo.st_uid
- self._chgrp_to = statinfo.st_gid
- except OSError, e:
- # db file doesn't exist yet.
- # Check os.environ for SUDO_UID, use if set
- self._chown_to = int(os.environ.get('SUDO_UID', -1))
- self._chgrp_to = int(os.environ.get('SUDO_GID', -1))
- else:
- self._chown_to = -1 # don't chown
- self._chgrp_to = -1 # don't chgrp
- if (self._flag == "n"):
- self._open(self._file_name, "wb", self._mode)
- else:
- try:
- f = self._open(self._file_name, "rb")
- except IOError, e:
- if (self._flag != "c"):
- raise e
- self._open(self._file_name, "wb", self._mode)
- else:
- p = f.read()
- if (len(p) > 0):
- try:
- self._dict = pickle.loads(p)
- except (pickle.UnpicklingError, EOFError):
- if (ignore_corrupt_dbfiles == 0): raise
- if (ignore_corrupt_dbfiles == 1):
- corruption_warning(self._file_name)
-
- def close(self):
- if (self._needs_sync):
- self.sync()
-
- def __del__(self):
- self.close()
-
- def sync(self):
- self._check_writable()
- f = self._open(self._tmp_name, "wb", self._mode)
- self._pickle_dump(self._dict, f, 1)
- f.close()
- # Windows doesn't allow renaming if the file exists, so unlink
- # it first, chmod'ing it to make sure we can do so. On UNIX, we
- # may not be able to chmod the file if it's owned by someone else
- # (e.g. from a previous run as root). We should still be able to
- # unlink() the file if the directory's writable, though, so ignore
- # any OSError exception thrown by the chmod() call.
- try: self._os_chmod(self._file_name, 0777)
- except OSError: pass
- self._os_unlink(self._file_name)
- self._os_rename(self._tmp_name, self._file_name)
- if self._os_chown is not None and self._chown_to > 0: # don't chown to root or -1
- try:
- self._os_chown(self._file_name, self._chown_to, self._chgrp_to)
- except OSError:
- pass
- self._needs_sync = 00000
- if (keep_all_files):
- self._shutil_copyfile(
- self._file_name,
- self._file_name + "_" + str(int(self._time_time())))
-
- def _check_writable(self):
- if (self._flag == "r"):
- raise IOError("Read-only database: %s" % self._file_name)
-
- def __getitem__(self, key):
- return self._dict[key]
-
- def __setitem__(self, key, value):
- self._check_writable()
- if (not is_string(key)):
- raise TypeError("key `%s' must be a string but is %s" % (key, type(key)))
- if (not is_string(value)):
- raise TypeError("value `%s' must be a string but is %s" % (value, type(value)))
- self._dict[key] = value
- self._needs_sync = 0001
-
- def keys(self):
- return list(self._dict.keys())
-
- def has_key(self, key):
- return key in self._dict
-
- def __contains__(self, key):
- return key in self._dict
-
- def iterkeys(self):
- # Wrapping name in () prevents fixer from "fixing" this
- return (self._dict.iterkeys)()
-
- __iter__ = iterkeys
-
- def __len__(self):
- return len(self._dict)
-
-def open(file, flag=None, mode=0666):
- return dblite(file, flag, mode)
-
-def _exercise():
- db = open("tmp", "n")
- assert len(db) == 0
- db["foo"] = "bar"
- assert db["foo"] == "bar"
- db[unicode("ufoo")] = unicode("ubar")
- assert db[unicode("ufoo")] == unicode("ubar")
- db.sync()
- db = open("tmp", "c")
- assert len(db) == 2, len(db)
- assert db["foo"] == "bar"
- db["bar"] = "foo"
- assert db["bar"] == "foo"
- db[unicode("ubar")] = unicode("ufoo")
- assert db[unicode("ubar")] == unicode("ufoo")
- db.sync()
- db = open("tmp", "r")
- assert len(db) == 4, len(db)
- assert db["foo"] == "bar"
- assert db["bar"] == "foo"
- assert db[unicode("ufoo")] == unicode("ubar")
- assert db[unicode("ubar")] == unicode("ufoo")
- try:
- db.sync()
- except IOError, e:
- assert str(e) == "Read-only database: tmp.dblite"
- else:
- raise RuntimeError("IOError expected.")
- db = open("tmp", "w")
- assert len(db) == 4
- db["ping"] = "pong"
- db.sync()
- try:
- db[(1,2)] = "tuple"
- except TypeError, e:
- assert str(e) == "key `(1, 2)' must be a string but is <type 'tuple'>", str(e)
- else:
- raise RuntimeError("TypeError exception expected")
- try:
- db["list"] = [1,2]
- except TypeError, e:
- assert str(e) == "value `[1, 2]' must be a string but is <type 'list'>", str(e)
- else:
- raise RuntimeError("TypeError exception expected")
- db = open("tmp", "r")
- assert len(db) == 5
- db = open("tmp", "n")
- assert len(db) == 0
- dblite._open("tmp.dblite", "w")
- db = open("tmp", "r")
- dblite._open("tmp.dblite", "w").write("x")
- try:
- db = open("tmp", "r")
- except pickle.UnpicklingError:
- pass
- else:
- raise RuntimeError("pickle exception expected.")
- global ignore_corrupt_dbfiles
- ignore_corrupt_dbfiles = 2
- db = open("tmp", "r")
- assert len(db) == 0
- os.unlink("tmp.dblite")
- try:
- db = open("tmp", "w")
- except IOError, e:
- assert str(e) == "[Errno 2] No such file or directory: 'tmp.dblite'", str(e)
- else:
- raise RuntimeError("IOError expected.")
- print "OK"
-
-if (__name__ == "__main__"):
- _exercise()
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/engine/SCons/exitfuncs.py b/3rdParty/SCons/scons-2.4.0/engine/SCons/exitfuncs.py
deleted file mode 100644
index 19c8e8e..0000000
--- a/3rdParty/SCons/scons-2.4.0/engine/SCons/exitfuncs.py
+++ /dev/null
@@ -1,64 +0,0 @@
-"""SCons.exitfuncs
-
-Register functions which are executed when SCons exits for any reason.
-
-"""
-
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-
-__revision__ = "src/engine/SCons/exitfuncs.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-
-import atexit
-
-_exithandlers = []
-def _run_exitfuncs():
- """run any registered exit functions
-
- _exithandlers is traversed in reverse order so functions are executed
- last in, first out.
- """
-
- while _exithandlers:
- func, targs, kargs = _exithandlers.pop()
- func(*targs, **kargs)
-
-def register(func, *targs, **kargs):
- """register a function to be executed upon normal program termination
-
- func - function to be called at exit
- targs - optional arguments to pass to func
- kargs - optional keyword arguments to pass to func
- """
- _exithandlers.append((func, targs, kargs))
-
-
-# make our exit function get run by python when it exits
-atexit.register(_run_exitfuncs)
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/scons-time.1 b/3rdParty/SCons/scons-2.4.0/scons-time.1
deleted file mode 100644
index fa4b01d..0000000
--- a/3rdParty/SCons/scons-2.4.0/scons-time.1
+++ /dev/null
@@ -1,795 +0,0 @@
-'\" t
-.\" Title: SCONS-TIME
-.\" Author: [see the "AUTHORS" section]
-.\" Generator: DocBook XSL Stylesheets v1.76.1 <http://docbook.sf.net/>
-.\" Date: 09/21/2015
-.\" Manual: SCons 2.4.0
-.\" Source: SCons 2.4.0
-.\" Language: English
-.\"
-.TH "SCONS\-TIME" "1" "09/21/2015" "SCons 2\&.4\&.0" "SCons 2\&.4\&.0"
-.\" -----------------------------------------------------------------
-.\" * Define some portability stuff
-.\" -----------------------------------------------------------------
-.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-.\" http://bugs.debian.org/507673
-.\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html
-.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-.ie \n(.g .ds Aq \(aq
-.el .ds Aq '
-.\" -----------------------------------------------------------------
-.\" * set default formatting
-.\" -----------------------------------------------------------------
-.\" disable hyphenation
-.nh
-.\" disable justification (adjust text to left margin only)
-.ad l
-.\" -----------------------------------------------------------------
-.\" * MAIN CONTENT STARTS HERE *
-.\" -----------------------------------------------------------------
-.SH "NAME"
-scons-time \- generate and display SCons timing information
-.SH "SYNOPSIS"
-.HP \w'\fBscons\-time\fR\ 'u
-\fBscons\-time\fR \fIsubcommand\fR [\fIoptions\fR...] [\fIarguments\fR...]
-.SH "GENERATING TIMING INFORMATION"
-.PP
-\fBscons\-time run\fR
-[\fB\-hnqv\fR] [\fB\-\-aegis=\fR\fIPROJECT\fR] [\fB\-f \fR\fIFILE\fR] [\fB\-\-number=\fR\fINUMBER\fR] [\fB\-\-outdir=\fR\fIOUTDIR\fR] [\fB\-p \fR\fISTRING\fR] [\fB\-\-python=\fR\fIPYTHON\fR] [\fB\-s \fR\fIDIR\fR] [\fB\-\-scons=\fR\fISCONS\fR] [\fB\-\-svn=\fR\fIURL\fR] [\fIARGUMENTS\fR]
-.SS "Extracting Function Timings"
-.PP
-\fBscons\-time func\fR
-[\fB\-h\fR] [\fB\-\-chdir=\fR\fIDIR\fR] [\fB\-f \fR\fIFILE\fR] [\fB\-\-fmt=\fR\fIFORMAT\fR] [\fB\-\-func=\fR\fINAME\fR] [\fB\-p \fR\fISTRING\fR] [\fB\-t \fR\fINUMBER\fR] [\fB\-\-title= TITLE\fR] [\fIARGUMENTS\fR]
-.SS "Extracting Memory Statistics"
-.PP
-\fBscons\-time mem\fR
-[\fB\-h\fR] [\fB\-\-chdir=\fR\fIDIR\fR] [\fB\-f \fR\fIFILE\fR] [\fB\-\-fmt=\fR\fIFORMAT\fR] [\fB\-p \fR\fISTRING\fR] [\fB\-\-stage=\fR\fISTAGE\fR] [\fB\-t \fR\fINUMBER\fR] [\fB\-\-title=\fR\fITITLE\fR] [\fIARGUMENTS\fR]
-.SS "Extracting Object Counts"
-.PP
-\fBscons\-time obj\fR
-[\fB\-h\fR] [\fB\-\-chdir=\fR\fIDIR\fR] [\fB\-f \fR\fIFILE\fR] [\fB\-\-fmt=\fR\fIFORMAT\fR] [\fB\-p \fR\fISTRING\fR] [\fB\-\-stage=\fR\fISTAGE\fR] [\fB\-t \fR\fINUMBER\fR] [\fB\-\-title=\fR\fITITLE\fR] [\fIARGUMENTS\fR]
-.SS "Extracting Execution Times"
-.PP
-\fBscons\-time time\fR
-[\fB\-h\fR] [\fB\-\-chdir=\fR\fIDIR\fR] [\fB\-f \fR\fIFILE\fR] [\fB\-\-fmt=\fR\fIFORMAT\fR] [\fB\-p \fR\fISTRING\fR] [\fB\-t \fR\fINUMBER\fR] [\fB\-\-title=\fR\fITITLE\fR] [\fB\-\-which=\fR\fIWHICH\fR] [\fIARGUMENTS\fR]
-.SS "Help Text"
-.PP
-\fBscons\-time help\fR
-\fISUBCOMMAND\fR
-[\&.\&.\&.]
-.SH "DESCRIPTION"
-.PP
-The
-\fBscons\-time\fR
-command runs an SCons configuration through a standard set of profiled timings and can extract and graph information from the resulting profiles and log files of those timings\&. The action to be performed by the
-\fBscons\-time\fR
-script is specified by a subcommand, the first argument on the command line\&. See the
-SUBCOMMANDS
-section below for information about the operation of specific subcommands\&.
-.PP
-The basic way to use
-\fBscons\-time\fR
-is to run the
-\fBscons\-time run\fR
-subcommand (possibly multiple times) to generate profile and log file output, and then use one of the other subcommands to display the results captured in the profiles and log files for a particular kind of information: function timings (the
-\fBscons\-time func\fR
-subcommand), total memory used (the
-\fBscons\-time mem\fR
-subcommand), object counts (the
-\fBscons\-time obj\fR
-subcommand) and overall execution time (the
-\fBscons\-time time\fR
-subcommand)\&. Options exist to place and find the profiles and log files in separate directories, to generate the output in a format suitable for graphing with the
-\fBgnuplot\fR(1)
-program, and so on\&.
-.PP
-There are two basic ways the
-\fBscons\-time run\fR
-subcommand is intended to be used to gather timing statistics for a configuration\&. One is to use the
-\fB\-\-svn=\fR
-option to test a configuration against a list of revisions from the SCons Subversion repository\&. This will generate a profile and timing log file for every revision listed with the
-\fB\-\-number=\fR
-option, and can be used to look at the impact of committed changes to the SCons code base on a particular configuration over time\&.
-.PP
-The other way is to profile incremental changes to a local SCons code base during a development cycle\-\-that is, to look at the performance impact of changes you\*(Aqre making in the local tree\&. In this mode, you run the
-\fBscons\-time run\fR
-subcommand
-\fIwithout\fR
-the
-\fB\-\-svn=\fR
-option, in which case it simply looks in the profile/log file output directory (the current directory by default) and automatically figures out the
-\fInext\fR
-run number for the output profile and log file\&. Used in this way, the development cycle goes something like: make a change to SCons; run
-\fBscons\-time run\fR
-to profile it against a specific configuration; make another change to SCons; run
-\fBscons\-time run\fR
-again to profile it; etc\&.
-.SH "OPTIONS"
-.PP
-The
-\fBscons\-time\fR
-command only supports a few global options:
-.PP
-\-h, \-\-help
-.RS 4
-Displays the global help text and exits, identical to the
-\fBscons\-time help\fR
-subcommand\&.
-.RE
-.PP
-\-V, \-\-version
-.RS 4
-Displays the
-\fBscons\-time\fR
-version and exits\&.
-.RE
-.PP
-Most functionality is controlled by options to the individual subcommands\&. See the next section for information about individual subcommand options\&.
-.SH "SUBCOMMANDS"
-.PP
-The
-\fBscons\-time\fR
-command supports the following individual subcommands\&.
-.SS "The func Subcommand"
-.PP
-\fBscons\-time func\fR
-[\fB\-h\fR] [\fB\-\-chdir=\fR\fIDIR\fR] [\fB\-f \fR\fIFILE\fR] [\fB\-\-fmt=\fR\fIFORMAT\fR] [\fB\-\-func=\fR\fINAME\fR] [\fB\-p \fR\fISTRING\fR] [\fB\-t \fR\fINUMBER\fR] [\fB\-\-title= TITLE\fR] [\fIARGUMENTS\fR]
-.PP
-The
-\fBscons\-time func\fR
-subcommand displays timing information for a specific Python function within SCons\&. By default, it extracts information about the
-\fB_main\fR() function, which includes the Python profiler timing for all of SCons\&.
-.PP
-The
-\fBscons\-time func\fR
-subcommand extracts function timing information from all the specified file arguments, which should be Python profiler output files\&. (Normally, these would be
-\fB*\&.prof\fR
-files generated by the
-\fBscons\-time run\fR
-subcommand, but they can actually be generated by any Python profiler invocation\&.) All file name arguments will be globbed for on\-disk files\&.
-.PP
-If no arguments are specified, then function timing information will be extracted from all
-\fB*\&.prof\fR
-files, or the subset of them with a prefix specified by the
-\fB\-p\fR
-option\&.
-.PP
-Options include:
-.PP
-\-C DIRECTORY, \-\-chdir=DIRECTORY
-.RS 4
-Changes to the specified
-\fIDIRECTORY\fR
-before looking for the specified files (or files that match the specified patterns)\&.
-.RE
-.PP
-\-f FILE, \-\-file=FILE
-.RS 4
-Reads configuration information from the specified
-\fIFILE\fR\&.
-.RE
-.PP
-\-fmt=FORMAT, \-\-format=FORMAT
-.RS 4
-Reports the output in the specified
-\fIFORMAT\fR\&. The formats currently supported are
-\fBascii\fR
-(the default) and
-\fBgnuplot\fR\&.
-.RE
-.PP
-\-\-func=NAME
-.RS 4
-Extracts timings for the specified function
-\fINAME\fR\&. The default is to report cumulative timings for the
-\fB_main\fR() function, which contains the entire SCons run\&.
-.RE
-.PP
-\-h, \-\-help
-.RS 4
-Displays help text for the
-\fBscons\-time func\fR
-subcommand\&.
-.RE
-.PP
-\-p STRING, \-\-prefix=STRING
-.RS 4
-Specifies the prefix string for profiles from which to extract function timing information\&. This will be used to search for profiles if no arguments are specified on the command line\&.
-.RE
-.PP
-\-t NUMBER, \-\-tail=NUMBER
-.RS 4
-Only extracts function timings from the last
-\fINUMBER\fR
-files\&.
-.RE
-.SS "The help Subcommand"
-.PP
-\fBscons\-time help\fR
-\fISUBCOMMAND\fR
-[\&.\&.\&.] The
-\fBhelp\fR
-subcommand prints help text for any other subcommands listed as later arguments on the command line\&.
-.SS "The mem Subcommand"
-.PP
-\fBscons\-time mem\fR
-[\fB\-h\fR] [\fB\-\-chdir=\fR\fIDIR\fR] [\fB\-f \fR\fIFILE\fR] [\fB\-\-fmt=\fR\fIFORMAT\fR] [\fB\-p \fR\fISTRING\fR] [\fB\-\-stage=\fR\fISTAGE\fR] [\fB\-t \fR\fINUMBER\fR] [\fB\-\-title=\fR\fITITLE\fR] [\fIARGUMENTS\fR]
-.PP
-The
-\fBscons\-time mem\fR
-subcommand displays how much memory SCons uses\&.
-.PP
-The
-\fBscons\-time mem\fR
-subcommand extracts memory use information from all the specified file arguments, which should be files containing output from running SCons with the
-\fB\-\-debug=memory\fR
-option\&. (Normally, these would be
-\fB*\&.log\fR
-files generated by the
-\fBscons\-time run\fR
-subcommand\&.) All file name arguments will be globbed for on\-disk files\&.
-.PP
-If no arguments are specified, then memory information will be extracted from all
-\fB*\&.log\fR
-files, or the subset of them with a prefix specified by the
-\fB\-p\fR
-option\&.
-.PP
-\-C DIR, \-\-chdir=DIR
-.RS 4
-Changes to the specified
-\fIDIRECTORY\fR
-before looking for the specified files (or files that match the specified patterns)\&.
-.RE
-.PP
-\-f FILE, \-\-file=FILE
-.RS 4
-Reads configuration information from the specified
-\fIFILE\fR\&.
-.RE
-.PP
-\-fmt=FORMAT, \-\-format=FORMAT
-.RS 4
-Reports the output in the specified
-\fIFORMAT\fR\&. The formats currently supported are
-\fBascii\fR
-(the default) and
-\fBgnuplot\fR\&.
-.RE
-.PP
-\-h, \-\-help
-.RS 4
-Displays help text for the
-\fBscons\-time mem\fR
-subcommand\&.
-.RE
-.PP
-\-p STRING, \-\-prefix=STRING
-.RS 4
-Specifies the prefix string for log files from which to extract memory usage information\&. This will be used to search for log files if no arguments are specified on the command line\&.
-.RE
-.PP
-\-\-stage=STAGE
-.RS 4
-Prints the memory used at the end of the specified
-\fISTAGE\fR:
-\fBpre\-read\fR
-(before the SConscript files are read),
-\fBpost\-read ,\fR
-(after the SConscript files are read),
-\fBpre\-build\fR
-(before any targets are built) or
-\fBpost\-build\fR
-(after any targets are built)\&. If no
-\fB\-\-stage\fR
-option is specified, the default behavior is
-\fBpost\-build\fR, which reports the final amount of memory used by SCons during each run\&.
-.RE
-.PP
-\-t NUMBER, \-\-tail=NUMBER
-.RS 4
-Only reports memory statistics from the last
-\fINUMBER\fR
-files\&.
-.RE
-.SS "The obj Subcommand"
-.PP
-\fBscons\-time obj\fR
-[\fB\-h\fR] [\fB\-\-chdir=\fR\fIDIR\fR] [\fB\-f \fR\fIFILE\fR] [\fB\-\-fmt=\fR\fIFORMAT\fR] [\fB\-p \fR\fISTRING\fR] [\fB\-\-stage=\fR\fISTAGE\fR] [\fB\-t \fR\fINUMBER\fR] [\fB\-\-title=\fR\fITITLE\fR] [\fIARGUMENTS\fR]
-.PP
-The
-\fBscons\-time obj\fR
-subcommand displays how many objects of a specific named type are created by SCons\&.
-.PP
-The
-\fBscons\-time obj\fR
-subcommand extracts object counts from all the specified file arguments, which should be files containing output from running SCons with the
-\fB\-\-debug=count\fR
-option\&. (Normally, these would be
-\fB*\&.log\fR
-files generated by the
-\fBscons\-time run\fR
-subcommand\&.) All file name arguments will be globbed for on\-disk files\&.
-.PP
-If no arguments are specified, then object counts will be extracted from all
-\fB*\&.log\fR
-files, or the subset of them with a prefix specified by the
-\fB\-p\fR
-option\&.
-.PP
-\-C DIR, \-\-chdir=DIR
-.RS 4
-Changes to the specified
-\fIDIRECTORY\fR
-before looking for the specified files (or files that match the specified patterns)\&.
-.RE
-.PP
-\-f FILE, \-\-file=FILE
-.RS 4
-Reads configuration information from the specified
-\fIFILE\fR\&.
-.RE
-.PP
-\-fmt=FORMAT, \-\-format=FORMAT
-.RS 4
-Reports the output in the specified
-\fIFORMAT\fR\&. The formats currently supported are
-\fBascii\fR
-(the default) and
-\fBgnuplot\fR\&.
-.RE
-.PP
-\-h, \-\-help
-.RS 4
-Displays help text for the
-\fBscons\-time obj\fR
-subcommand\&.
-.RE
-.PP
-\-p STRING, \-\-prefix=STRING
-.RS 4
-Specifies the prefix string for log files from which to extract object counts\&. This will be used to search for log files if no arguments are specified on the command line\&.
-.RE
-.PP
-\-\-stage=STAGE
-.RS 4
-Prints the object count at the end of the specified
-\fISTAGE\fR:
-\fBpre\-read\fR
-(before the SConscript files are read),
-\fBpost\-read ,\fR
-(after the SConscript files are read),
-\fBpre\-build\fR
-(before any targets are built) or
-\fBpost\-build\fR
-(after any targets are built)\&. If no
-\fB\-\-stage\fR
-option is specified, the default behavior is
-\fBpost\-build\fR, which reports the final object count during each run\&.
-.RE
-.PP
-\-t NUMBER, \-\-tail=NUMBER
-.RS 4
-Only reports object counts from the last
-\fINUMBER\fR
-files\&.
-.RE
-.SS "The run Subcommand"
-.PP
-\fBscons\-time run\fR
-[\fB\-hnqv\fR] [\fB\-\-aegis=\fR\fIPROJECT\fR] [\fB\-f \fR\fIFILE\fR] [\fB\-\-number=\fR\fINUMBER\fR] [\fB\-\-outdir=\fR\fIOUTDIR\fR] [\fB\-p \fR\fISTRING\fR] [\fB\-\-python=\fR\fIPYTHON\fR] [\fB\-s \fR\fIDIR\fR] [\fB\-\-scons=\fR\fISCONS\fR] [\fB\-\-svn=\fR\fIURL\fR] [\fIARGUMENTS\fR] The
-\fBscons\-time run\fR
-subcommand is the basic subcommand for profiling a specific configuration against a version of SCons\&.
-.PP
-The configuration to be tested is specified as a list of files or directories that will be unpacked or copied into a temporary directory in which SCons will be invoked\&. The
-\fBscons\-time run\fR
-subcommand understands file suffixes like
-\fB\&.tar\fR,
-\fB\&.tar\&.gz\fR,
-\fB\&.tgz\fR
-and
-\fB\&.zip\fR
-and will unpack their contents into a temporary directory\&. If more than one argument is specified, each one will be unpacked or copied into the temporary directory "on top of" the previous archives or directories, so the expectation is that multiple specified archives share the same directory layout\&.
-.PP
-Once the file or directory arguments are unpacked or copied to the temporary directory, the
-\fBscons\-time run\fR
-subcommand runs the requested version of SCons against the configuration three times:
-.PP
-Startup
-.RS 4
-SCons is run with the
-\fB\-\-help\fR
-option so that just the SConscript files are read, and then the default help text is printed\&. This profiles just the perceived "overhead" of starting up SCons and processing the SConscript files\&.
-.RE
-.PP
-Full build
-.RS 4
-SCons is run to build everything specified in the configuration\&. Specific targets to be passed in on the command l ine may be specified by the
-\fBtargets\fR
-keyword in a configuration file; see below for details\&.
-.RE
-.PP
-Rebuild
-.RS 4
-SCons is run again on the same just\-built directory\&. If the dependencies in the SCons configuration are correct, this should be an up\-to\-date, "do nothing" rebuild\&.
-.RE
-.PP
-Each invocation captures the output log file and a profile\&.
-.PP
-The
-\fBscons\-time run\fR
-subcommand supports the following options:
-.PP
-\-\-aegis=PROJECT
-.RS 4
-Specifies the Aegis
-\fIPROJECT\fR
-from which the version(s) of
-\fBscons\fR
-being timed will be extracted\&. When
-\fB\-\-aegis\fR
-is specified, the
-\fB\-\-number=\fR\fINUMBER\fR
-option specifies delta numbers that will be tested\&. Output from each invocation run will be placed in file names that match the Aegis delta numbers\&. If the
-\fB\-\-number=\fR
-option is not specified, then the default behavior is to time the tip of the specified
-\fIPROJECT\fR\&.
-.RE
-.PP
-\-f FILE, \-\-file=FILE
-.RS 4
-Reads configuration information from the specified
-\fIFILE\fR\&. This often provides a more convenient way to specify and collect parameters associated with a specific timing configuration than specifying them on the command line\&. See the
-CONFIGURATION FILE
-section below for information about the configuration file parameters\&.
-.RE
-.PP
-\-h, \-\-help
-.RS 4
-Displays help text for the
-\fBscons\-time run\fR
-subcommand\&.
-.RE
-.PP
-\-n, \-\-no\-exec
-.RS 4
-Do not execute commands, just printing the command\-line equivalents of what would be executed\&. Note that the
-\fBscons\-time\fR
-script actually executes its actions in Python, where possible, for portability\&. The commands displayed are UNIX
-\fIequivalents\fR
-of what it\*(Aqs doing\&.
-.RE
-.PP
-\-\-number=NUMBER
-.RS 4
-Specifies the run number to be used in the names of the log files and profile outputs generated by this run\&.
-.RE
-.PP
-When used in conjunction with the
-\fB\-\-aegis=\fR\fIPROJECT\fR
-option,
-\fINUMBER\fR
-specifies one or more comma\-separated Aegis delta numbers that will be retrieved automatically from the specified Aegis
-\fIPROJECT\fR\&.
-.PP
-When used in conjunction with the
-\fB\-\-svn=\fR\fIURL\fR
-option,
-\fINUMBER\fR
-specifies one or more comma\-separated Subversion revision numbers that will be retrieved automatically from the Subversion repository at the specified
-\fIURL\fR\&. Ranges of delta or revision numbers may be specified be separating two numbers with a hyphen (\fB\-\fR)\&.
-.PP
-Example:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-% scons\-time run \-\-svn=\m[blue]\fBhttp://scons\&.tigris\&.org/svn/trunk\fR\m[] \-\-num=1247,1249\-1252 \&.
-.fi
-.if n \{\
-.RE
-.\}
-.PP
-\-p STRING, \-\-prefix=STRING
-.RS 4
-Specifies the prefix string to be used for all of the log files and profiles generated by this run\&. The default is derived from the first specified argument: if the first argument is a directory, the default prefix is the name of the directory; if the first argument is an archive (tar or zip file), the default prefix is the the base name of the archive, that is, what remains after stripping the archive suffix (\fB\&.tgz\fR,
-\fB\&.tar\&.gz\fR
-or
-\fB\&.zip\fR)\&.
-.RE
-.PP
-\-\-python=PYTHON
-.RS 4
-Specifies a path to the Python executable to be used for the timing runs\&. The default is to use the same Python executable that is running the
-\fBscons\-time\fR
-command itself\&.
-.RE
-.PP
-\-q, \-\-quiet
-.RS 4
-Suppresses display of the command lines being executed\&.
-.RE
-.PP
-\-s DIR, \-\-subdir=DIR
-.RS 4
-Specifies the name of directory or subdirectory from which the commands should be executed\&. The default is XXX
-.RE
-.PP
-\-\-scons=SCONS
-.RS 4
-Specifies a path to the SCons script to be used for the timing runs\&. The default is XXX
-.RE
-.PP
-\-\-svn=URL, \-\-subversion=URL
-.RS 4
-Specifies the
-\fIURL\fR
-of the Subversion repository from which the version(s) of
-\fBscons\fR
-being timed will be extracted\&. When
-\fB\-\-svn\fR
-is specified, the
-\fB\-\-number=\fR\fINUMBER\fR
-option specifies revision numbers that will be tested\&. Output from each invocation run will be placed in file names that match the Subversion revision numbers\&. If the
-\fB\-\-number=\fR
-option is not specified, then the default behavior is to time the
-\fBHEAD\fR
-of the specified
-\fIURL\fR\&.
-.RE
-.PP
-\-v, \-\-verbose
-.RS 4
-Displays the output from individual commands to the screen (in addition to capturing the output in log files)\&.
-.RE
-.SS "The time Subcommand"
-.PP
-\fBscons\-time time\fR
-[\fB\-h\fR] [\fB\-\-chdir=\fR\fIDIR\fR] [\fB\-f \fR\fIFILE\fR] [\fB\-\-fmt=\fR\fIFORMAT\fR] [\fB\-p \fR\fISTRING\fR] [\fB\-t \fR\fINUMBER\fR] [\fB\-\-title=\fR\fITITLE\fR] [\fB\-\-which=\fR\fIWHICH\fR] [\fIARGUMENTS\fR]
-.PP
-The
-\fBscons\-time time\fR
-subcommand displays SCons execution times as reported by the
-\fBscons \-\-debug=time\fR
-option\&.
-.PP
-The
-\fBscons\-time time\fR
-subcommand extracts SCons timing from all the specified file arguments, which should be files containing output from running SCons with the
-\fB\-\-debug=time\fR
-option\&. (Normally, these would be
-\fB*\&.log\fR
-files generated by the
-\fBscons\-time run\fR
-subcommand\&.) All file name arguments will be globbed for on\-disk files\&.
-.PP
-If no arguments are specified, then execution timings will be extracted from all
-\fB*\&.log\fR
-files, or the subset of them with a prefix specified by the
-\fB\-p\fR
-option\&.
-.PP
-\-C DIR, \-\-chdir=DIR
-.RS 4
-Changes to the specified
-\fIDIRECTORY\fR
-before looking for the specified files (or files that match the specified patterns)\&.
-.RE
-.PP
-\-f FILE, \-\-file=FILE
-.RS 4
-Reads configuration information from the specified
-\fIFILE\fR\&.
-.RE
-.PP
-\-fmt=FORMAT, \-\-format=FORMAT
-.RS 4
-Reports the output in the specified
-\fIFORMAT\fR\&. The formats currently supported are
-\fBascii\fR
-(the default) and
-\fBgnuplot\fR\&.
-.RE
-.PP
-\-h, \-\-help
-.RS 4
-Displays help text for the
-\fBscons\-time time\fR
-subcommand\&.
-.RE
-.PP
-\-p STRING, \-\-prefix=STRING
-.RS 4
-Specifies the prefix string for log files from which to extract execution timings\&. This will be used to search for log files if no arguments are specified on the command line\&.
-.RE
-.PP
-\-t NUMBER, \-\-tail=NUMBER
-.RS 4
-Only reports object counts from the last
-\fINUMBER\fR
-files\&.
-.RE
-.PP
-\-\-which=WHICH
-.RS 4
-Prints the execution time for the specified
-\fIWHICH\fR
-value:
-\fBtotal\fR
-(the total execution time),
-\fBSConscripts\fR
-(total execution time for the SConscript files themselves),
-\fBSCons\fR
-(exectuion time in SCons code itself) or
-\fBcommands\fR
-(execution time of the commands and other actions used to build targets)\&. If no
-\fB\-\-which\fR
-option is specified, the default behavior is
-\fBtotal\fR, which reports the total execution time for each run\&.
-.RE
-.SH "CONFIGURATION FILE"
-.PP
-Various
-\fBscons\-time\fR
-subcommands can read information from a specified configuration file when passed the
-\fB\-f\fR
-or
-\fB\-\-file\fR
-options\&. The configuration file is actually executed as a Python script\&. Setting Python variables in the configuration file controls the behavior of the
-\fBscons\-time\fR
-script more conveniently than having to specify command\-line options or arguments for every run, and provides a handy way to "shrink\-wrap" the necessary information for producing (and reporting) consistent timing runs for a given configuration\&.
-.PP
-\fBaegis\fR
-.RS 4
-The Aegis executable for extracting deltas\&. The default is simply
-\fBaegis\fR\&.
-.RE
-.PP
-\fBaegis_project\fR
-.RS 4
-The Aegis project from which deltas should be extracted\&. The default is whatever is specified with the
-\fB\-\-aegis=\fR
-command\-line option\&.
-.RE
-.PP
-\fBarchive_list\fR
-.RS 4
-A list of archives (files or directories) that will be copied to the temporary directory in which SCons will be invoked\&.
-\fB\&.tar\fR,
-\fB\&.tar\&.gz\fR,
-\fB\&.tgz\fR
-and
-\fB\&.zip\fR
-files will have their contents unpacked in the temporary directory\&. Directory trees and files will be copied as\-is\&.
-.RE
-.PP
-\fBinitial_commands\fR
-.RS 4
-A list of commands that will be executed before the actual timed
-\fBscons\fR
-runs\&. This can be used for commands that are necessary to prepare the source tree\-for example, creating a configuration file that should not be part of the timed run\&.
-.RE
-.PP
-\fBkey_location\fR
-.RS 4
-The location of the key on Gnuplot graphing information generated with the
-\fB\-\-format=gnuplot\fR
-option\&. The default is
-\fBbottom left\fR\&.
-.RE
-.PP
-\fBprefix\fR
-.RS 4
-The file name prefix to be used when running or extracting timing for this configuration\&.
-.RE
-.PP
-\fBpython\fR
-.RS 4
-The path name of the Python executable to be used when running or extracting information for this configuration\&. The default is the same version of Python used to run the SCons
-.RE
-.PP
-\fBscons\fR
-.RS 4
-The path name of the SCons script to be used when running or extracting information for this configuration\&. The default is simply
-\fBscons\fR\&.
-.RE
-.PP
-\fBscons_flags\fR
-.RS 4
-The
-\fBscons\fR
-flags used when running SCons to collect timing information\&. The default value is
-\fB\-\-debug=count \-\-debug=memory \-\-debug=time \-\-debug=memoizer\fR\&.
-.RE
-.PP
-\fBscons_lib_dir\fR, \fBscons_wrapper\fR, \fBstartup_targets\fR, \fBsubdir\fR
-.RS 4
-The subdirectory of the project into which the
-\fBscons\-time\fR
-script should change before executing the SCons commands to time\&.
-.RE
-.PP
-\fBsubversion_url\fR
-.RS 4
-The Subversion URL from
-.RE
-.PP
-\fBsvn\fR
-.RS 4
-The subversion executable used to check out revisions of SCons to be timed\&. The default is simple
-\fBsvn\fR\&.
-.RE
-.PP
-\fBsvn_co_flag\fR, \fBtar\fR, \fBtargets\fR
-.RS 4
-A string containing the targets that should be added to the command line of every timed
-\fBscons\fR
-run\&. This can be used to restrict what\*(Aqs being timed to a subset of the full build for the configuration\&.
-.RE
-.PP
-\fBtargets0\fR, \fBtargets1\fR, \fBtargets2\fR, \fBtitle\fR, \fBunzip\fR, \fBverbose\fR, \fBvertical_bars\fR
-.RS 4
-.RE
-.SS "Example"
-.PP
-Here is an example
-\fBscons\-time\fR
-configuration file for a hypothetical sample project:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-# The project doesn\*(Aqt use SCons natively (yet), so we\*(Aqre
-# timing a separate set of SConscript files that we lay
-# on top of the vanilla unpacked project tarball\&.
-arguments = [\*(Aqproject\-1\&.2\&.tgz\*(Aq, \*(Aqproject\-SConscripts\&.tar\*(Aq]
-
-# The subdirectory name contains the project version number,
-# so tell scons\-time to chdir there before building\&.
-subdir = \*(Aqproject\-1\&.2\*(Aq
-
-# Set the prefix so output log files and profiles are named:
-# project\-000\-[012]\&.{log,prof}
-# project\-001\-[012]\&.{log,prof}
-# etc\&.
-prefix = \*(Aqproject\*(Aq
-
-# The SConscript files being tested don\*(Aqt do any SConf
-# configuration, so run their normal \&./configure script
-# before we invoke SCons\&.
-initial_commands = [
- \*(Aq\&./configure\*(Aq,
-]
-
-# Only time building the bin/project executable\&.
-targets = \*(Aqbin/project\*(Aq
-
-# Time against SCons revisions of the branches/core branch
-subversion_url = \*(Aq\m[blue]\fBhttp://scons\&.tigris\&.org/svn/scons/branches/core\fR\m[]\*(Aq
-.fi
-.if n \{\
-.RE
-.\}
-.SH "ENVIRONMENT"
-.PP
-The
-\fBscons\-time\fR
-script uses the following environment variables:
-.PP
-\fBPRESERVE\fR
-.RS 4
-If this value is set, the
-\fBscons\-time\fR
-script will
-\fInot\fR
-remove the temporary directory or directories in which it builds the specified configuration or downloads a specific version of SCons\&.
-.RE
-.SH "SEE ALSO"
-.PP
-\fBgnuplot\fR(1),
-\fBscons\fR(1)
-.SH "AUTHORS"
-.PP
-Steven Knight <knight at baldmt dot com>
diff --git a/3rdParty/SCons/scons-2.4.0/scons.1 b/3rdParty/SCons/scons-2.4.0/scons.1
deleted file mode 100644
index bf22dac..0000000
--- a/3rdParty/SCons/scons-2.4.0/scons.1
+++ /dev/null
@@ -1,19588 +0,0 @@
-'\" t
-.\" Title: SCONS
-.\" Author: Steven Knight
-.\" Generator: DocBook XSL Stylesheets v1.76.1 <http://docbook.sf.net/>
-.\" Date: <pubdate>2004 - 2015</pubdate>
-.\" Manual: SCons 2.4.0
-.\" Source: SCons 2.4.0 version 2.4.0
-.\" Language: English
-.\"
-.TH "SCONS" "1" "<pubdate>2004 - 2015</pubdate>" "SCons 2\&.4\&.0 version 2.4.0" "SCons 2\&.4\&.0"
-.\" -----------------------------------------------------------------
-.\" * Define some portability stuff
-.\" -----------------------------------------------------------------
-.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-.\" http://bugs.debian.org/507673
-.\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html
-.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-.ie \n(.g .ds Aq \(aq
-.el .ds Aq '
-.\" -----------------------------------------------------------------
-.\" * set default formatting
-.\" -----------------------------------------------------------------
-.\" disable hyphenation
-.nh
-.\" disable justification (adjust text to left margin only)
-.ad l
-.\" -----------------------------------------------------------------
-.\" * MAIN CONTENT STARTS HERE *
-.\" -----------------------------------------------------------------
-.SH "NAME"
-scons \- a software construction tool
-.SH "SYNOPSIS"
-.HP \w'\fBscons\fR\ 'u
-\fBscons\fR [\fIoptions\fR...] [\fIname=val\fR...] [\fItargets\fR...]
-.SH "DESCRIPTION"
-.PP
-The
-\fBscons\fR
-utility builds software (or other files) by determining which component pieces must be rebuilt and executing the necessary commands to rebuild them\&.
-.PP
-By default,
-\fBscons\fR
-searches for a file named
-\fISConstruct\fR,
-\fISconstruct\fR, or
-\fIsconstruct\fR
-(in that order) in the current directory and reads its configuration from the first file found\&. An alternate file name may be specified via the
-\fB\-f\fR
-option\&.
-.PP
-The
-\fISConstruct\fR
-file can specify subsidiary configuration files using the
-\fBSConscript\fR() function\&. By convention, these subsidiary files are named
-\fISConscript\fR, although any name may be used\&. (Because of this naming convention, the term "SConscript files" is sometimes used to refer generically to all
-\fBscons\fR
-configuration files, regardless of actual file name\&.)
-.PP
-The configuration files specify the target files to be built, and (optionally) the rules to build those targets\&. Reasonable default rules exist for building common software components (executable programs, object files, libraries), so that for most software projects, only the target and input files need be specified\&.
-.PP
-Before reading the
-\fISConstruct\fR
-file,
-\fBscons\fR
-looks for a directory named
-\fIsite_scons\fR
-in various system directories (see below) and the directory containing the
-\fISConstruct\fR
-file; for each of those dirs which exists,
-\fIsite_scons\fR
-is prepended to sys\&.path, the file
-\fIsite_scons/site_init\&.py\fR, is evaluated if it exists, and the directory
-\fIsite_scons/site_tools\fR
-is prepended to the default toolpath if it exists\&. See the
-\fB\-\-no\-site\-dir\fR
-and
-\fB\-\-site\-dir\fR
-options for more details\&.
-.PP
-\fBscons\fR
-reads and executes the SConscript files as Python scripts, so you may use normal Python scripting capabilities (such as flow control, data manipulation, and imported Python libraries) to handle complicated build situations\&.
-\fBscons\fR, however, reads and executes all of the SConscript files
-\fIbefore\fR
-it begins building any targets\&. To make this obvious,
-\fBscons\fR
-prints the following messages about what it is doing:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-$ scons foo\&.out
-scons: Reading SConscript files \&.\&.\&.
-scons: done reading SConscript files\&.
-scons: Building targets \&.\&.\&.
-cp foo\&.in foo\&.out
-scons: done building targets\&.
-$
-.fi
-.if n \{\
-.RE
-.\}
-.PP
-The status messages (everything except the line that reads "cp foo\&.in foo\&.out") may be suppressed using the
-\fB\-Q\fR
-option\&.
-.PP
-\fBscons\fR
-does not automatically propagate the external environment used to execute
-\fBscons\fR
-to the commands used to build target files\&. This is so that builds will be guaranteed repeatable regardless of the environment variables set at the time
-\fBscons\fR
-is invoked\&. This also means that if the compiler or other commands that you want to use to build your target files are not in standard system locations,
-\fBscons\fR
-will not find them unless you explicitly set the PATH to include those locations\&. Whenever you create an
-\fBscons\fR
-construction environment, you can propagate the value of PATH from your external environment as follows:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-import os
-env = Environment(ENV = {\*(AqPATH\*(Aq : os\&.environ[\*(AqPATH\*(Aq]})
-.fi
-.if n \{\
-.RE
-.\}
-.PP
-Similarly, if the commands use external environment variables like $PATH, $HOME, $JAVA_HOME, $LANG, $SHELL, $TERM, etc\&., these variables can also be explicitly propagated:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-import os
-env = Environment(ENV = {\*(AqPATH\*(Aq : os\&.environ[\*(AqPATH\*(Aq],
- \*(AqHOME\*(Aq : os\&.environ[\*(AqHOME\*(Aq]})
-.fi
-.if n \{\
-.RE
-.\}
-.PP
-Or you may explicitly propagate the invoking user\*(Aqs complete external environment:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-import os
-env = Environment(ENV = os\&.environ)
-.fi
-.if n \{\
-.RE
-.\}
-.PP
-This comes at the expense of making your build dependent on the user\*(Aqs environment being set correctly, but it may be more convenient for many configurations\&.
-.PP
-\fBscons\fR
-can scan known input files automatically for dependency information (for example, #include statements in C or C++ files) and will rebuild dependent files appropriately whenever any "included" input file changes\&.
-\fBscons\fR
-supports the ability to define new scanners for unknown input file types\&.
-.PP
-\fBscons\fR
-knows how to fetch files automatically from SCCS or RCS subdirectories using SCCS, RCS or BitKeeper\&.
-.PP
-\fBscons\fR
-is normally executed in a top\-level directory containing a
-\fISConstruct\fR
-file, optionally specifying as command\-line arguments the target file or files to be built\&.
-.PP
-By default, the command
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-scons
-.fi
-.if n \{\
-.RE
-.\}
-.PP
-will build all target files in or below the current directory\&. Explicit default targets (to be built when no targets are specified on the command line) may be defined the SConscript file(s) using the
-\fBDefault()\fR
-function, described below\&.
-.PP
-Even when
-\fBDefault()\fR
-targets are specified in the SConscript file(s), all target files in or below the current directory may be built by explicitly specifying the current directory (\&.) as a command\-line target:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-scons \&.
-.fi
-.if n \{\
-.RE
-.\}
-.PP
-Building all target files, including any files outside of the current directory, may be specified by supplying a command\-line target of the root directory (on POSIX systems):
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-scons /
-.fi
-.if n \{\
-.RE
-.\}
-.PP
-or the path name(s) of the volume(s) in which all the targets should be built (on Windows systems):
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-scons C:\e D:\e
-.fi
-.if n \{\
-.RE
-.\}
-.PP
-To build only specific targets, supply them as command\-line arguments:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-scons foo bar
-.fi
-.if n \{\
-.RE
-.\}
-.PP
-in which case only the specified targets will be built (along with any derived files on which they depend)\&.
-.PP
-Specifying "cleanup" targets in SConscript files is not usually necessary\&. The
-\fB\-c\fR
-flag removes all files necessary to build the specified target:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-scons \-c \&.
-.fi
-.if n \{\
-.RE
-.\}
-.PP
-to remove all target files, or:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-scons \-c build export
-.fi
-.if n \{\
-.RE
-.\}
-.PP
-to remove target files under build and export\&. Additional files or directories to remove can be specified using the
-\fBClean()\fR
-function\&. Conversely, targets that would normally be removed by the
-\fB\-c\fR
-invocation can be prevented from being removed by using the
-\fBNoClean\fR() function\&.
-.PP
-A subset of a hierarchical tree may be built by remaining at the top\-level directory (where the
-\fISConstruct\fR
-file lives) and specifying the subdirectory as the target to be built:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-scons src/subdir
-.fi
-.if n \{\
-.RE
-.\}
-.PP
-or by changing directory and invoking scons with the
-\fB\-u\fR
-option, which traverses up the directory hierarchy until it finds the
-\fISConstruct\fR
-file, and then builds targets relatively to the current subdirectory:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-cd src/subdir
-scons \-u \&.
-.fi
-.if n \{\
-.RE
-.\}
-.PP
-\fBscons\fR
-supports building multiple targets in parallel via a
-\fB\-j\fR
-option that takes, as its argument, the number of simultaneous tasks that may be spawned:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-scons \-j 4
-.fi
-.if n \{\
-.RE
-.\}
-.PP
-builds four targets in parallel, for example\&.
-.PP
-\fBscons\fR
-can maintain a cache of target (derived) files that can be shared between multiple builds\&. When caching is enabled in a SConscript file, any target files built by
-\fBscons\fR
-will be copied to the cache\&. If an up\-to\-date target file is found in the cache, it will be retrieved from the cache instead of being rebuilt locally\&. Caching behavior may be disabled and controlled in other ways by the
-\fB\-\-cache\-force\fR,
-\fB\-\-cache\-disable\fR,
-\fB\-\-cache\-readonly\fR, and
-\fB\-\-cache\-show\fR
-command\-line options\&. The
-\fB\-\-random\fR
-option is useful to prevent multiple builds from trying to update the cache simultaneously\&.
-.PP
-Values of variables to be passed to the SConscript file(s) may be specified on the command line:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-scons debug=1 \&.
-.fi
-.if n \{\
-.RE
-.\}
-.PP
-These variables are available in SConscript files through the ARGUMENTS dictionary, and can be used in the SConscript file(s) to modify the build in any way:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-if ARGUMENTS\&.get(\*(Aqdebug\*(Aq, 0):
- env = Environment(CCFLAGS = \*(Aq\-g\*(Aq)
-else:
- env = Environment()
-.fi
-.if n \{\
-.RE
-.\}
-.PP
-The command\-line variable arguments are also available in the ARGLIST list, indexed by their order on the command line\&. This allows you to process them in order rather than by name, if necessary\&. ARGLIST[0] returns a tuple containing (argname, argvalue)\&. A Python exception is thrown if you try to access a list member that does not exist\&.
-.PP
-\fBscons\fR
-requires Python version 2\&.7 or later\&. There should be no other dependencies or requirements to run
-\fBscons\&.\fR
-.PP
-By default,
-\fBscons\fR
-knows how to search for available programming tools on various systems\&. On Windows systems,
-\fBscons\fR
-searches in order for the Microsoft Visual C++ tools, the MinGW tool chain, the Intel compiler tools, and the PharLap ETS compiler\&. On OS/2 systems,
-\fBscons\fR
-searches in order for the OS/2 compiler, the GCC tool chain, and the Microsoft Visual C++ tools, On SGI IRIX, IBM AIX, Hewlett Packard HP\-UX, and Sun Solaris systems,
-\fBscons\fR
-searches for the native compiler tools (MIPSpro, Visual Age, aCC, and Forte tools respectively) and the GCC tool chain\&. On all other platforms, including POSIX (Linux and UNIX) platforms,
-\fBscons\fR
-searches in order for the GCC tool chain, the Microsoft Visual C++ tools, and the Intel compiler tools\&. You may, of course, override these default values by appropriate configuration of Environment construction variables\&.
-.SH "OPTIONS"
-.PP
-In general,
-\fBscons\fR
-supports the same command\-line options as GNU
-\fBmake\fR, and many of those supported by
-\fBcons\fR\&.
-.PP
-\-b
-.RS 4
-Ignored for compatibility with non\-GNU versions of
-\fBmake\&.\fR
-.RE
-.PP
-\-c, \-\-clean, \-\-remove
-.RS 4
-Clean up by removing all target files for which a construction command is specified\&. Also remove any files or directories associated to the construction command using the
-\fBClean\fR() function\&. Will not remove any targets specified by the
-\fBNoClean\fR() function\&.
-.RE
-.PP
-\-\-cache\-debug=\fIfile\fR
-.RS 4
-Print debug information about the
-\fBCacheDir\fR() derived\-file caching to the specified
-\fIfile\fR\&. If
-\fIfile\fR
-is
-\fB\-\fR
-(a hyphen), the debug information are printed to the standard output\&. The printed messages describe what signature file names are being looked for in, retrieved from, or written to the
-\fBCacheDir\fR() directory tree\&.
-.RE
-.PP
-\-\-cache\-disable, \-\-no\-cache
-.RS 4
-Disable the derived\-file caching specified by
-\fBCacheDir\fR()\&.
-\fBscons\fR
-will neither retrieve files from the cache nor copy files to the cache\&.
-.RE
-.PP
-\-\-cache\-force, \-\-cache\-populate
-.RS 4
-When using
-\fBCacheDir\fR(), populate a cache by copying any already\-existing, up\-to\-date derived files to the cache, in addition to files built by this invocation\&. This is useful to populate a new cache with all the current derived files, or to add to the cache any derived files recently built with caching disabled via the
-\fB\-\-cache\-disable\fR
-option\&.
-.RE
-.PP
-\-\-cache\-readonly
-.RS 4
-Use the cache (if enabled) for reading, but do not not update the cache with changed files\&.
-.RE
-.PP
-\-\-cache\-show
-.RS 4
-When using
-\fBCacheDir\fR() and retrieving a derived file from the cache, show the command that would have been executed to build the file, instead of the usual report, "Retrieved `file\*(Aq from cache\&." This will produce consistent output for build logs, regardless of whether a target file was rebuilt or retrieved from the cache\&.
-.RE
-.PP
-\-\-config=\fImode\fR
-.RS 4
-This specifies how the
-\fBConfigure\fR
-call should use or generate the results of configuration tests\&. The option should be specified from among the following choices:
-.RE
-.PP
-\-\-config=auto
-.RS 4
-scons will use its normal dependency mechanisms to decide if a test must be rebuilt or not\&. This saves time by not running the same configuration tests every time you invoke scons, but will overlook changes in system header files or external commands (such as compilers) if you don\*(Aqt specify those dependecies explicitly\&. This is the default behavior\&.
-.RE
-.PP
-\-\-config=force
-.RS 4
-If this option is specified, all configuration tests will be re\-run regardless of whether the cached results are out of date\&. This can be used to explicitly force the configuration tests to be updated in response to an otherwise unconfigured change in a system header file or compiler\&.
-.RE
-.PP
-\-\-config=cache
-.RS 4
-If this option is specified, no configuration tests will be rerun and all results will be taken from cache\&. Note that scons will still consider it an error if \-\-config=cache is specified and a necessary test does not yet have any results in the cache\&.
-.RE
-.PP
-\-C\fI directory\fR, \-\-directory=\fIdirectory\fR
-.RS 4
-Change to the specified
-\fIdirectory\fR
-before searching for the
-\fISConstruct\fR,
-\fISconstruct\fR, or
-\fIsconstruct\fR
-file, or doing anything else\&. Multiple
-\fB\-C\fR
-options are interpreted relative to the previous one, and the right\-most
-\fB\-C\fR
-option wins\&. (This option is nearly equivalent to
-\fB\-f directory/SConstruct\fR, except that it will search for
-\fISConstruct\fR,
-\fISconstruct\fR, or
-\fIsconstruct\fR
-in the specified directory\&.)
-.RE
-.PP
-\-D
-.RS 4
-Works exactly the same way as the
-\fB\-u\fR
-option except for the way default targets are handled\&. When this option is used and no targets are specified on the command line, all default targets are built, whether or not they are below the current directory\&.
-.RE
-.PP
-\-\-debug=\fItype\fR
-.RS 4
-Debug the build process\&.
-\fItype[,type\&.\&.\&.]\fR
-specifies what type of debugging\&. Multiple types may be specified, separated by commas\&. The following types are valid:
-.RE
-.PP
-\-\-debug=count
-.RS 4
-Print how many objects are created of the various classes used internally by SCons before and after reading the SConscript files and before and after building targets\&. This is not supported when SCons is executed with the Python
-\fB\-O\fR
-(optimized) option or when the SCons modules have been compiled with optimization (that is, when executing from
-\fB*\&.pyo\fR
-files)\&.
-.RE
-.PP
-\-\-debug=duplicate
-.RS 4
-Print a line for each unlink/relink (or copy) of a variant file from its source file\&. Includes debugging info for unlinking stale variant files, as well as unlinking old targets before building them\&.
-.RE
-.PP
-\-\-debug=dtree
-.RS 4
-A synonym for the newer
-\fB\-\-tree=derived\fR
-option\&. This will be deprecated in some future release and ultimately removed\&.
-.RE
-.PP
-\-\-debug=explain
-.RS 4
-Print an explanation of precisely why
-\fBscons\fR
-is deciding to (re\-)build any targets\&. (Note: this does not print anything for targets that are
-\fInot\fR
-rebuilt\&.)
-.RE
-.PP
-\-\-debug=findlibs
-.RS 4
-Instruct the scanner that searches for libraries to print a message about each potential library name it is searching for, and about the actual libraries it finds\&.
-.RE
-.PP
-\-\-debug=includes
-.RS 4
-Print the include tree after each top\-level target is built\&. This is generally used to find out what files are included by the sources of a given derived file:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-$ scons \-\-debug=includes foo\&.o
-.fi
-.if n \{\
-.RE
-.\}
-.RE
-.PP
-\-\-debug=memoizer
-.RS 4
-Prints a summary of hits and misses using the Memoizer, an internal subsystem that counts how often SCons uses cached values in memory instead of recomputing them each time they\*(Aqre needed\&.
-.RE
-.PP
-\-\-debug=memory
-.RS 4
-Prints how much memory SCons uses before and after reading the SConscript files and before and after building targets\&.
-.RE
-.PP
-\-\-debug=nomemoizer
-.RS 4
-A deprecated option preserved for backwards compatibility\&.
-.RE
-.PP
-\-\-debug=objects
-.RS 4
-Prints a list of the various objects of the various classes used internally by SCons\&.
-.RE
-.PP
-\-\-debug=pdb
-.RS 4
-Re\-run SCons under the control of the pdb Python debugger\&.
-.RE
-.PP
-\-\-debug=prepare
-.RS 4
-Print a line each time any target (internal or external) is prepared for building\&.
-\fBscons\fR
-prints this for each target it considers, even if that target is up to date (see also \-\-debug=explain)\&. This can help debug problems with targets that aren\*(Aqt being built; it shows whether
-\fBscons\fR
-is at least considering them or not\&.
-.RE
-.PP
-\-\-debug=presub
-.RS 4
-Print the raw command line used to build each target before the construction environment variables are substituted\&. Also shows which targets are being built by this command\&. Output looks something like this:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-$ scons \-\-debug=presub
-Building myprog\&.o with action(s):
- $SHCC $SHCFLAGS $SHCCFLAGS $CPPFLAGS $_CPPINCFLAGS \-c \-o $TARGET $SOURCES
-\&.\&.\&.
-.fi
-.if n \{\
-.RE
-.\}
-.RE
-.PP
-\-\-debug=stacktrace
-.RS 4
-Prints an internal Python stack trace when encountering an otherwise unexplained error\&.
-.RE
-.PP
-\-\-debug=stree
-.RS 4
-A synonym for the newer
-\fB\-\-tree=all,status\fR
-option\&. This will be deprecated in some future release and ultimately removed\&.
-.RE
-.PP
-\-\-debug=time
-.RS 4
-Prints various time profiling information: the time spent executing each individual build command; the total build time (time SCons ran from beginning to end); the total time spent reading and executing SConscript files; the total time spent SCons itself spend running (that is, not counting reading and executing SConscript files); and both the total time spent executing all build commands and the elapsed wall\-clock time spent executing those build commands\&. (When
-\fBscons\fR
-is executed without the
-\fB\-j\fR
-option, the elapsed wall\-clock time will typically be slightly longer than the total time spent executing all the build commands, due to the SCons processing that takes place in between executing each command\&. When
-\fBscons\fR
-is executed
-\fIwith\fR
-the
-\fB\-j\fR
-option, and your build configuration allows good parallelization, the elapsed wall\-clock time should be significantly smaller than the total time spent executing all the build commands, since multiple build commands and intervening SCons processing should take place in parallel\&.)
-.RE
-.PP
-\-\-debug=tree
-.RS 4
-A synonym for the newer
-\fB\-\-tree=all\fR
-option\&. This will be deprecated in some future release and ultimately removed\&.
-.RE
-.PP
-\-\-diskcheck=\fItypes\fR
-.RS 4
-Enable specific checks for whether or not there is a file on disk where the SCons configuration expects a directory (or vice versa), and whether or not RCS or SCCS sources exist when searching for source and include files\&. The
-\fItypes\fR
-argument can be set to:
-\fBall\fR, to enable all checks explicitly (the default behavior);
-\fBnone\fR, to disable all such checks;
-\fBmatch\fR, to check that files and directories on disk match SCons\*(Aq expected configuration;
-\fBrcs\fR, to check for the existence of an RCS source for any missing source or include files;
-\fBsccs\fR, to check for the existence of an SCCS source for any missing source or include files\&. Multiple checks can be specified separated by commas; for example,
-\fB\-\-diskcheck=sccs,rcs\fR
-would still check for SCCS and RCS sources, but disable the check for on\-disk matches of files and directories\&. Disabling some or all of these checks can provide a performance boost for large configurations, or when the configuration will check for files and/or directories across networked or shared file systems, at the slight increased risk of an incorrect build or of not handling errors gracefully (if include files really should be found in SCCS or RCS, for example, or if a file really does exist where the SCons configuration expects a directory)\&.
-.RE
-.PP
-\-\-duplicate=\fIORDER\fR
-.RS 4
-There are three ways to duplicate files in a build tree: hard links, soft (symbolic) links and copies\&. The default behaviour of SCons is to prefer hard links to soft links to copies\&. You can specify different behaviours with this option\&.
-\fIORDER\fR
-must be one of
-\fIhard\-soft\-copy\fR
-(the default),
-\fIsoft\-hard\-copy\fR,
-\fIhard\-copy\fR,
-\fIsoft\-copy\fR
-or
-\fIcopy\fR\&. SCons will attempt to duplicate files using the mechanisms in the specified order\&.
-.RE
-.PP
-\-f\fI file\fR, \-\-file=\fIfile\fR, \-\-makefile=\fIfile\fR, \-\-sconstruct=\fIfile\fR
-.RS 4
-Use
-\fIfile\fR
-as the initial SConscript file\&. Multiple
-\fB\-f\fR
-options may be specified, in which case
-\fBscons\fR
-will read all of the specified files\&.
-.RE
-.PP
-\-h, \-\-help
-.RS 4
-Print a local help message for this build, if one is defined in the SConscript file(s), plus a line that describes the
-\fB\-H\fR
-option for command\-line option help\&. If no local help message is defined, prints the standard help message about command\-line options\&. Exits after displaying the appropriate message\&.
-.RE
-.PP
-\-H, \-\-help\-options
-.RS 4
-Print the standard help message about command\-line options and exit\&.
-.RE
-.PP
-\-i, \-\-ignore\-errors
-.RS 4
-Ignore all errors from commands executed to rebuild files\&.
-.RE
-.PP
-\-I\fI directory\fR, \-\-include\-dir=\fIdirectory\fR
-.RS 4
-Specifies a
-\fIdirectory\fR
-to search for imported Python modules\&. If several
-\fB\-I\fR
-options are used, the directories are searched in the order specified\&.
-.RE
-.PP
-\-\-implicit\-cache
-.RS 4
-Cache implicit dependencies\&. This causes
-\fBscons\fR
-to use the implicit (scanned) dependencies from the last time it was run instead of scanning the files for implicit dependencies\&. This can significantly speed up SCons, but with the following limitations:
-.RE
-.PP
-\fBscons\fR
-will not detect changes to implicit dependency search paths (e\&.g\&.
-\fBCPPPATH\fR,
-\fBLIBPATH\fR) that would ordinarily cause different versions of same\-named files to be used\&.
-.PP
-\fBscons\fR
-will miss changes in the implicit dependencies in cases where a new implicit dependency is added earlier in the implicit dependency search path (e\&.g\&.
-\fBCPPPATH\fR,
-\fBLIBPATH\fR) than a current implicit dependency with the same name\&.
-.PP
-\-\-implicit\-deps\-changed
-.RS 4
-Forces SCons to ignore the cached implicit dependencies\&. This causes the implicit dependencies to be rescanned and recached\&. This implies
-\fB\-\-implicit\-cache\fR\&.
-.RE
-.PP
-\-\-implicit\-deps\-unchanged
-.RS 4
-Force SCons to ignore changes in the implicit dependencies\&. This causes cached implicit dependencies to always be used\&. This implies
-\fB\-\-implicit\-cache\fR\&.
-.RE
-.PP
-\-\-interactive
-.RS 4
-Starts SCons in interactive mode\&. The SConscript files are read once and a
-\fBscons>>>\fR
-prompt is printed\&. Targets may now be rebuilt by typing commands at interactive prompt without having to re\-read the SConscript files and re\-initialize the dependency graph from scratch\&.
-.sp
-SCons interactive mode supports the following commands:
-.PP
-\fBbuild\fR\fI[OPTIONS] [TARGETS] \&.\&.\&.\fR
-.RS 4
-Builds the specified
-\fITARGETS\fR
-(and their dependencies) with the specified SCons command\-line
-\fIOPTIONS\fR\&.
-\fBb\fR
-and
-\fBscons\fR
-are synonyms\&.
-.sp
-The following SCons command\-line options affect the
-\fBbuild\fR
-command:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-\-\-cache\-debug=FILE
-\-\-cache\-disable, \-\-no\-cache
-\-\-cache\-force, \-\-cache\-populate
-\-\-cache\-readonly
-\-\-cache\-show
-\-\-debug=TYPE
-\-i, \-\-ignore\-errors
-\-j N, \-\-jobs=N
-\-k, \-\-keep\-going
-\-n, \-\-no\-exec, \-\-just\-print, \-\-dry\-run, \-\-recon
-\-Q
-\-s, \-\-silent, \-\-quiet
-\-\-taskmastertrace=FILE
-\-\-tree=OPTIONS
-.fi
-.if n \{\
-.RE
-.\}
-.RE
-.sp
-Any other SCons command\-line options that are specified do not cause errors but have no effect on the
-\fBbuild\fR
-command (mainly because they affect how the SConscript files are read, which only happens once at the beginning of interactive mode)\&.
-.PP
-\fBclean\fR\fI[OPTIONS] [TARGETS] \&.\&.\&.\fR
-.RS 4
-Cleans the specified
-\fITARGETS\fR
-(and their dependencies) with the specified options\&.
-\fBc\fR
-is a synonym\&. This command is itself a synonym for
-\fBbuild \-\-clean\fR
-.RE
-.PP
-\fBexit\fR
-.RS 4
-Exits SCons interactive mode\&. You can also exit by terminating input (CTRL+D on UNIX or Linux systems, CTRL+Z on Windows systems)\&.
-.RE
-.PP
-\fBhelp\fR\fI[COMMAND]\fR
-.RS 4
-Provides a help message about the commands available in SCons interactive mode\&. If
-\fICOMMAND\fR
-is specified,
-\fBh\fR
-and
-\fB?\fR
-are synonyms\&.
-.RE
-.PP
-\fBshell\fR\fI[COMMANDLINE]\fR
-.RS 4
-Executes the specified
-\fICOMMANDLINE\fR
-in a subshell\&. If no
-\fICOMMANDLINE\fR
-is specified, executes the interactive command interpreter specified in the
-\fBSHELL\fR
-environment variable (on UNIX and Linux systems) or the
-\fBCOMSPEC\fR
-environment variable (on Windows systems)\&.
-\fBsh\fR
-and
-\fB!\fR
-are synonyms\&.
-.RE
-.PP
-\fBversion\fR
-.RS 4
-Prints SCons version information\&.
-.RE
-.RE
-.PP
-An empty line repeats the last typed command\&. Command\-line editing can be used if the
-\fBreadline\fR
-module is available\&.
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-$ scons \-\-interactive
-scons: Reading SConscript files \&.\&.\&.
-scons: done reading SConscript files\&.
-scons>>> build \-n prog
-scons>>> exit
-.fi
-.if n \{\
-.RE
-.\}
-.PP
-\-j\fI N\fR, \-\-jobs=\fIN\fR
-.RS 4
-Specifies the number of jobs (commands) to run simultaneously\&. If there is more than one
-\fB\-j\fR
-option, the last one is effective\&.
-.RE
-.PP
-\-k, \-\-keep\-going
-.RS 4
-Continue as much as possible after an error\&. The target that failed and those that depend on it will not be remade, but other targets specified on the command line will still be processed\&.
-.RE
-.PP
-\-m
-.RS 4
-Ignored for compatibility with non\-GNU versions of
-\fBmake\fR\&.
-.RE
-.PP
-\-\-max\-drift=\fISECONDS\fR
-.RS 4
-Set the maximum expected drift in the modification time of files to
-\fISECONDS\fR\&. This value determines how long a file must be unmodified before its cached content signature will be used instead of calculating a new content signature (MD5 checksum) of the file\*(Aqs contents\&. The default value is 2 days, which means a file must have a modification time of at least two days ago in order to have its cached content signature used\&. A negative value means to never cache the content signature and to ignore the cached value if there already is one\&. A value of 0 means to always use the cached signature, no matter how old the file is\&.
-.RE
-.PP
-\-\-md5\-chunksize=\fIKILOBYTES\fR
-.RS 4
-Set the block size used to compute MD5 signatures to
-\fIKILOBYTES\fR\&. This value determines the size of the chunks which are read in at once when computing MD5 signatures\&. Files below that size are fully stored in memory before performing the signature computation while bigger files are read in block\-by\-block\&. A huge block\-size leads to high memory consumption while a very small block\-size slows down the build considerably\&.
-.sp
-The default value is to use a chunk size of 64 kilobytes, which should be appropriate for most uses\&.
-.RE
-.PP
-\-n, \-\-just\-print, \-\-dry\-run, \-\-recon
-.RS 4
-No execute\&. Print the commands that would be executed to build any out\-of\-date target files, but do not execute the commands\&.
-.RE
-.PP
-\-\-no\-site\-dir
-.RS 4
-Prevents the automatic addition of the standard
-\fIsite_scons\fR
-dirs to
-\fIsys\&.path\fR\&. Also prevents loading the
-\fIsite_scons/site_init\&.py\fR
-modules if they exist, and prevents adding their
-\fIsite_scons/site_tools\fR
-dirs to the toolpath\&.
-.RE
-.PP
-\-\-profile=\fIfile\fR
-.RS 4
-Run SCons under the Python profiler and save the results in the specified
-\fIfile\fR\&. The results may be analyzed using the Python pstats module\&.
-.RE
-.PP
-\-q, \-\-question
-.RS 4
-Do not run any commands, or print anything\&. Just return an exit status that is zero if the specified targets are already up to date, non\-zero otherwise\&.
-.RE
-.PP
-\-Q
-.RS 4
-Quiets SCons status messages about reading SConscript files, building targets and entering directories\&. Commands that are executed to rebuild target files are still printed\&.
-.RE
-.PP
-\-\-random
-.RS 4
-Build dependencies in a random order\&. This is useful when building multiple trees simultaneously with caching enabled, to prevent multiple builds from simultaneously trying to build or retrieve the same target files\&.
-.RE
-.PP
-\-s, \-\-silent, \-\-quiet
-.RS 4
-Silent\&. Do not print commands that are executed to rebuild target files\&. Also suppresses SCons status messages\&.
-.RE
-.PP
-\-S, \-\-no\-keep\-going, \-\-stop
-.RS 4
-Ignored for compatibility with GNU
-\fBmake\fR\&.
-.RE
-.PP
-\-\-site\-dir=\fIdir\fR
-.RS 4
-Uses the named dir as the site dir rather than the default
-\fIsite_scons\fR
-dirs\&. This dir will get prepended to
-\fIsys\&.path\fR, the module
-\fIdir\fR/site_init\&.py will get loaded if it exists, and
-\fIdir\fR/site_tools will get added to the default toolpath\&.
-.sp
-The default set of
-\fIsite_scons\fR
-dirs used when
-\fB\-\-site\-dir\fR
-is not specified depends on the system platform, as follows\&. Note that the directories are examined in the order given, from most generic to most specific, so the last\-executed site_init\&.py file is the most specific one (which gives it the chance to override everything else), and the dirs are prepended to the paths, again so the last dir examined comes first in the resulting path\&.
-.RE
-.PP
-Windows:
-.RS 4
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-%ALLUSERSPROFILE/Application Data/scons/site_scons
-%USERPROFILE%/Local Settings/Application Data/scons/site_scons
-%APPDATA%/scons/site_scons
-%HOME%/\&.scons/site_scons
-\&./site_scons
-.fi
-.if n \{\
-.RE
-.\}
-.RE
-.PP
-Mac OS X:
-.RS 4
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-/Library/Application Support/SCons/site_scons
-/opt/local/share/scons/site_scons (for MacPorts)
-/sw/share/scons/site_scons (for Fink)
-$HOME/Library/Application Support/SCons/site_scons
-$HOME/\&.scons/site_scons
-\&./site_scons
-.fi
-.if n \{\
-.RE
-.\}
-.RE
-.PP
-Solaris:
-.RS 4
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-/opt/sfw/scons/site_scons
-/usr/share/scons/site_scons
-$HOME/\&.scons/site_scons
-\&./site_scons
-.fi
-.if n \{\
-.RE
-.\}
-.RE
-.PP
-Linux, HPUX, and other Posix\-like systems:
-.RS 4
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-/usr/share/scons/site_scons
-$HOME/\&.scons/site_scons
-\&./site_scons
-.fi
-.if n \{\
-.RE
-.\}
-.RE
-.PP
-\-\-stack\-size=\fIKILOBYTES\fR
-.RS 4
-Set the size stack used to run threads to
-\fIKILOBYTES\fR\&. This value determines the stack size of the threads used to run jobs\&. These are the threads that execute the actions of the builders for the nodes that are out\-of\-date\&. Note that this option has no effect unless the
-\fBnum_jobs\fR
-option, which corresponds to \-j and \-\-jobs, is larger than one\&. Using a stack size that is too small may cause stack overflow errors\&. This usually shows up as segmentation faults that cause scons to abort before building anything\&. Using a stack size that is too large will cause scons to use more memory than required and may slow down the entire build process\&.
-.sp
-The default value is to use a stack size of 256 kilobytes, which should be appropriate for most uses\&. You should not need to increase this value unless you encounter stack overflow errors\&.
-.RE
-.PP
-\-t, \-\-touch
-.RS 4
-Ignored for compatibility with GNU
-\fBmake\fR\&. (Touching a file to make it appear up\-to\-date is unnecessary when using
-\fBscons\fR\&.)
-.RE
-.PP
-\-\-taskmastertrace=\fIfile\fR
-.RS 4
-Prints trace information to the specified
-\fIfile\fR
-about how the internal Taskmaster object evaluates and controls the order in which Nodes are built\&. A file name of
-\fB\-\fR
-may be used to specify the standard output\&.
-.RE
-.PP
-\-tree=\fIoptions\fR
-.RS 4
-Prints a tree of the dependencies after each top\-level target is built\&. This prints out some or all of the tree, in various formats, depending on the
-\fIoptions\fR
-specified:
-.RE
-.PP
-\-\-tree=all
-.RS 4
-Print the entire dependency tree after each top\-level target is built\&. This prints out the complete dependency tree, including implicit dependencies and ignored dependencies\&.
-.RE
-.PP
-\-\-tree=derived
-.RS 4
-Restricts the tree output to only derived (target) files, not source files\&.
-.RE
-.PP
-\-\-tree=status
-.RS 4
-Prints status information for each displayed node\&.
-.RE
-.PP
-\-\-tree=prune
-.RS 4
-Prunes the tree to avoid repeating dependency information for nodes that have already been displayed\&. Any node that has already been displayed will have its name printed in
-\fB[square brackets]\fR, as an indication that the dependencies for that node can be found by searching for the relevant output higher up in the tree\&.
-.RE
-.PP
-Multiple options may be specified, separated by commas:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-# Prints only derived files, with status information:
-scons \-\-tree=derived,status
-
-# Prints all dependencies of target, with status information
-# and pruning dependencies of already\-visited Nodes:
-scons \-\-tree=all,prune,status target
-.fi
-.if n \{\
-.RE
-.\}
-.PP
-\-u, \-\-up, \-\-search\-up
-.RS 4
-Walks up the directory structure until an
-\fISConstruct ,\fR
-\fISconstruct\fR
-or
-\fIsconstruct\fR
-file is found, and uses that as the top of the directory tree\&. If no targets are specified on the command line, only targets at or below the current directory will be built\&.
-.RE
-.PP
-\-U
-.RS 4
-Works exactly the same way as the
-\fB\-u\fR
-option except for the way default targets are handled\&. When this option is used and no targets are specified on the command line, all default targets that are defined in the SConscript(s) in the current directory are built, regardless of what directory the resultant targets end up in\&.
-.RE
-.PP
-\-v, \-\-version
-.RS 4
-Print the
-\fBscons\fR
-version, copyright information, list of authors, and any other relevant information\&. Then exit\&.
-.RE
-.PP
-\-w, \-\-print\-directory
-.RS 4
-Print a message containing the working directory before and after other processing\&.
-.RE
-.PP
-\-\-no\-print\-directory
-.RS 4
-Turn off \-w, even if it was turned on implicitly\&.
-.RE
-.PP
-\-\-warn=\fItype\fR, \-\-warn=no\-\fItype\fR
-.RS 4
-Enable or disable warnings\&.
-\fItype\fR
-specifies the type of warnings to be enabled or disabled:
-.RE
-.PP
-\-\-warn=all, \-\-warn=no\-all
-.RS 4
-Enables or disables all warnings\&.
-.RE
-.PP
-\-\-warn=cache\-write\-error, \-\-warn=no\-cache\-write\-error
-.RS 4
-Enables or disables warnings about errors trying to write a copy of a built file to a specified
-\fBCacheDir\fR()\&. These warnings are disabled by default\&.
-.RE
-.PP
-\-\-warn=corrupt\-sconsign, \-\-warn=no\-corrupt\-sconsign
-.RS 4
-Enables or disables warnings about unfamiliar signature data in
-\fB\&.sconsign\fR
-files\&. These warnings are enabled by default\&.
-.RE
-.PP
-\-\-warn=dependency, \-\-warn=no\-dependency
-.RS 4
-Enables or disables warnings about dependencies\&. These warnings are disabled by default\&.
-.RE
-.PP
-\-\-warn=deprecated, \-\-warn=no\-deprecated
-.RS 4
-Enables or disables all warnings about use of currently deprecated features\&. These warnings are enabled by default\&. Note that the
-\fB\-\-warn=no\-deprecated\fR
-option does not disable warnings about absolutely all deprecated features\&. Warnings for some deprecated features that have already been through several releases with deprecation warnings may be mandatory for a release or two before they are officially no longer supported by SCons\&. Warnings for some specific deprecated features may be enabled or disabled individually; see below\&.
-.PP
-\-\-warn=deprecated\-copy, \-\-warn=no\-deprecated\-copy
-.RS 4
-Enables or disables warnings about use of the deprecated
-\fBenv\&.Copy()\fR
-method\&.
-.RE
-.PP
-\-\-warn=deprecated\-source\-signatures, \-\-warn=no\-deprecated\-source\-signatures
-.RS 4
-Enables or disables warnings about use of the deprecated
-\fBSourceSignatures()\fR
-function or
-\fBenv\&.SourceSignatures()\fR
-method\&.
-.RE
-.PP
-\-\-warn=deprecated\-target\-signatures, \-\-warn=no\-deprecated\-target\-signatures
-.RS 4
-Enables or disables warnings about use of the deprecated
-\fBTargetSignatures()\fR
-function or
-\fBenv\&.TargetSignatures()\fR
-method\&.
-.RE
-.RE
-.PP
-\-\-warn=duplicate\-environment, \-\-warn=no\-duplicate\-environment
-.RS 4
-Enables or disables warnings about attempts to specify a build of a target with two different construction environments that use the same action\&. These warnings are enabled by default\&.
-.RE
-.PP
-\-\-warn=fortran\-cxx\-mix, \-\-warn=no\-fortran\-cxx\-mix
-.RS 4
-Enables or disables the specific warning about linking Fortran and C++ object files in a single executable, which can yield unpredictable behavior with some compilers\&.
-.RE
-.PP
-\-\-warn=future\-deprecated, \-\-warn=no\-future\-deprecated
-.RS 4
-Enables or disables warnings about features that will be deprecated in the future\&. These warnings are disabled by default\&. Enabling this warning is especially recommended for projects that redistribute SCons configurations for other users to build, so that the project can be warned as soon as possible about to\-be\-deprecated features that may require changes to the configuration\&.
-.RE
-.PP
-\-\-warn=link, \-\-warn=no\-link
-.RS 4
-Enables or disables warnings about link steps\&.
-.RE
-.PP
-\-\-warn=misleading\-keywords, \-\-warn=no\-misleading\-keywords
-.RS 4
-Enables or disables warnings about use of the misspelled keywords
-\fBtargets\fR
-and
-\fBsources\fR
-when calling Builders\&. (Note the last
-\fBs\fR
-characters, the correct spellings are
-\fBtarget\fR
-and
-\fBsource\&.)\fR
-These warnings are enabled by default\&.
-.RE
-.PP
-\-\-warn=missing\-sconscript, \-\-warn=no\-missing\-sconscript
-.RS 4
-Enables or disables warnings about missing SConscript files\&. These warnings are enabled by default\&.
-.RE
-.PP
-\-\-warn=no\-md5\-module, \-\-warn=no\-no\-md5\-module
-.RS 4
-Enables or disables warnings about the version of Python not having an MD5 checksum module available\&. These warnings are enabled by default\&.
-.RE
-.PP
-\-\-warn=no\-metaclass\-support, \-\-warn=no\-no\-metaclass\-support
-.RS 4
-Enables or disables warnings about the version of Python not supporting metaclasses when the
-\fB\-\-debug=memoizer\fR
-option is used\&. These warnings are enabled by default\&.
-.RE
-.PP
-\-\-warn=no\-object\-count, \-\-warn=no\-no\-object\-count
-.RS 4
-Enables or disables warnings about the
-\fB\-\-debug=object\fR
-feature not working when
-\fBscons\fR
-is run with the python
-\fB\-O\fR
-option or from optimized Python (\&.pyo) modules\&.
-.RE
-.PP
-\-\-warn=no\-parallel\-support, \-\-warn=no\-no\-parallel\-support
-.RS 4
-Enables or disables warnings about the version of Python not being able to support parallel builds when the
-\fB\-j\fR
-option is used\&. These warnings are enabled by default\&.
-.RE
-.PP
-\-\-warn=python\-version, \-\-warn=no\-python\-version
-.RS 4
-Enables or disables the warning about running SCons with a deprecated version of Python\&. These warnings are enabled by default\&.
-.RE
-.PP
-\-\-warn=reserved\-variable, \-\-warn=no\-reserved\-variable
-.RS 4
-Enables or disables warnings about attempts to set the reserved construction variable names
-\fBCHANGED_SOURCES\fR,
-\fBCHANGED_TARGETS\fR,
-\fBTARGET\fR,
-\fBTARGETS\fR,
-\fBSOURCE\fR,
-\fBSOURCES\fR,
-\fBUNCHANGED_SOURCES\fR
-or
-\fBUNCHANGED_TARGETS\fR\&. These warnings are disabled by default\&.
-.RE
-.PP
-\-\-warn=stack\-size, \-\-warn=no\-stack\-size
-.RS 4
-Enables or disables warnings about requests to set the stack size that could not be honored\&. These warnings are enabled by default\&.
-.RE
-.PP
-\-\-warn=target_not_build, \-\-warn=no\-target_not_built
-.RS 4
-Enables or disables warnings about a build rule not building the expected targets\&. These warnings are not currently enabled by default\&.
-.RE
-.PP
-\-Y\fI repository\fR, \-\-repository=\fIrepository\fR, \-\-srcdir=\fIrepository\fR
-.RS 4
-Search the specified repository for any input and target files not found in the local directory hierarchy\&. Multiple
-\fB\-Y\fR
-options may be specified, in which case the repositories are searched in the order specified\&.
-.RE
-.SH "CONFIGURATION FILE REFERENCE"
-.SS "Construction Environments"
-.PP
-A construction environment is the basic means by which the SConscript files communicate build information to
-\fBscons\fR\&. A new construction environment is created using the
-\fBEnvironment\fR
-function:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-env = Environment()
-.fi
-.if n \{\
-.RE
-.\}
-.PP
-Variables, called
-\fIconstruction\fR
-\fIvariables\fR, may be set in a construction environment either by specifying them as keywords when the object is created or by assigning them a value after the object is created:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-env = Environment(FOO = \*(Aqfoo\*(Aq)
-env[\*(AqBAR\*(Aq] = \*(Aqbar\*(Aq
-.fi
-.if n \{\
-.RE
-.\}
-.PP
-As a convenience, construction variables may also be set or modified by the
-\fIparse_flags\fR
-keyword argument, which applies the
-\fBParseFlags\fR
-method (described below) to the argument value after all other processing is completed\&. This is useful either if the exact content of the flags is unknown (for example, read from a control file) or if the flags are distributed to a number of construction variables\&.
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-env = Environment(parse_flags = \*(Aq\-Iinclude \-DEBUG \-lm\*(Aq)
-.fi
-.if n \{\
-.RE
-.\}
-.PP
-This example adds \*(Aqinclude\*(Aq to
-\fBCPPPATH\fR, \*(AqEBUG\*(Aq to
-\fBCPPDEFINES\fR, and \*(Aqm\*(Aq to
-\fBLIBS\fR\&.
-.PP
-By default, a new construction environment is initialized with a set of builder methods and construction variables that are appropriate for the current platform\&. An optional platform keyword argument may be used to specify that an environment should be initialized for a different platform:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-env = Environment(platform = \*(Aqcygwin\*(Aq)
-env = Environment(platform = \*(Aqos2\*(Aq)
-env = Environment(platform = \*(Aqposix\*(Aq)
-env = Environment(platform = \*(Aqwin32\*(Aq)
-.fi
-.if n \{\
-.RE
-.\}
-.PP
-Specifying a platform initializes the appropriate construction variables in the environment to use and generate file names with prefixes and suffixes appropriate for the platform\&.
-.PP
-Note that the
-\fBwin32\fR
-platform adds the
-\fBSystemDrive\fR
-and
-\fBSystemRoot\fR
-variables from the user\*(Aqs external environment to the construction environment\*(Aqs
-\fBENV\fR
-dictionary\&. This is so that any executed commands that use sockets to connect with other systems (such as fetching source files from external CVS repository specifications like
-\fB:pserver:anonymous@cvs\&.sourceforge\&.net:/cvsroot/scons\fR) will work on Windows systems\&.
-.PP
-The platform argument may be function or callable object, in which case the Environment() method will call the specified argument to update the new construction environment:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-def my_platform(env):
- env[\*(AqVAR\*(Aq] = \*(Aqxyzzy\*(Aq
-
-env = Environment(platform = my_platform)
-.fi
-.if n \{\
-.RE
-.\}
-.PP
-Additionally, a specific set of tools with which to initialize the environment may be specified as an optional keyword argument:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-env = Environment(tools = [\*(Aqmsvc\*(Aq, \*(Aqlex\*(Aq])
-.fi
-.if n \{\
-.RE
-.\}
-.PP
-Non\-built\-in tools may be specified using the toolpath argument:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-env = Environment(tools = [\*(Aqdefault\*(Aq, \*(Aqfoo\*(Aq], toolpath = [\*(Aqtools\*(Aq])
-.fi
-.if n \{\
-.RE
-.\}
-.PP
-This looks for a tool specification in tools/foo\&.py (as well as using the ordinary default tools for the platform)\&. foo\&.py should have two functions: generate(env, **kw) and exists(env)\&. The
-\fBgenerate()\fR
-function modifies the passed\-in environment to set up variables so that the tool can be executed; it may use any keyword arguments that the user supplies (see below) to vary its initialization\&. The
-\fBexists()\fR
-function should return a true value if the tool is available\&. Tools in the toolpath are used before any of the built\-in ones\&. For example, adding gcc\&.py to the toolpath would override the built\-in gcc tool\&. Also note that the toolpath is stored in the environment for use by later calls to
-\fBClone\fR() and
-\fBTool\fR() methods:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-base = Environment(toolpath=[\*(Aqcustom_path\*(Aq])
-derived = base\&.Clone(tools=[\*(Aqcustom_tool\*(Aq])
-derived\&.CustomBuilder()
-.fi
-.if n \{\
-.RE
-.\}
-.PP
-The elements of the tools list may also be functions or callable objects, in which case the Environment() method will call the specified elements to update the new construction environment:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-def my_tool(env):
- env[\*(AqXYZZY\*(Aq] = \*(Aqxyzzy\*(Aq
-
-env = Environment(tools = [my_tool])
-.fi
-.if n \{\
-.RE
-.\}
-.PP
-The individual elements of the tools list may also themselves be two\-element lists of the form (\fItoolname\fR,
-\fIkw_dict\fR)\&. SCons searches for the
-\fItoolname\fR
-specification file as described above, and passes
-\fIkw_dict\fR, which must be a dictionary, as keyword arguments to the tool\*(Aqs
-\fBgenerate\fR
-function\&. The
-\fBgenerate\fR
-function can use the arguments to modify the tool\*(Aqs behavior by setting up the environment in different ways or otherwise changing its initialization\&.
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-# in tools/my_tool\&.py:
-def generate(env, **kw):
- # Sets MY_TOOL to the value of keyword argument \*(Aqarg1\*(Aq or 1\&.
- env[\*(AqMY_TOOL\*(Aq] = kw\&.get(\*(Aqarg1\*(Aq, \*(Aq1\*(Aq)
-def exists(env):
- return 1
-
-# in SConstruct:
-env = Environment(tools = [\*(Aqdefault\*(Aq, (\*(Aqmy_tool\*(Aq, {\*(Aqarg1\*(Aq: \*(Aqabc\*(Aq})],
- toolpath=[\*(Aqtools\*(Aq])
-.fi
-.if n \{\
-.RE
-.\}
-.PP
-The tool definition (i\&.e\&. my_tool()) can use the PLATFORM variable from the environment it receives to customize the tool for different platforms\&.
-.PP
-If no tool list is specified, then SCons will auto\-detect the installed tools using the PATH variable in the ENV construction variable and the platform name when the Environment is constructed\&. Changing the PATH variable after the Environment is constructed will not cause the tools to be redetected\&.
-.PP
-SCons supports the following tool specifications out of the box:
-.PP
-386asm
-.RS 4
-Sets construction variables for the 386ASM assembler for the Phar Lap ETS embedded operating system\&.
-.sp
-Sets:
-\fB$AS\fR,
-\fB$ASCOM\fR,
-\fB$ASFLAGS\fR,
-\fB$ASPPCOM\fR,
-\fB$ASPPFLAGS\fR\&.
-.sp
-Uses:
-\fB$CC\fR,
-\fB$CPPFLAGS\fR,
-\fB$_CPPDEFFLAGS\fR,
-\fB$_CPPINCFLAGS\fR\&.
-.RE
-.PP
-aixc++
-.RS 4
-Sets construction variables for the IMB xlc / Visual Age C++ compiler\&.
-.sp
-Sets:
-\fB$CXX\fR,
-\fB$CXXVERSION\fR,
-\fB$SHCXX\fR,
-\fB$SHOBJSUFFIX\fR\&.
-.RE
-.PP
-aixcc
-.RS 4
-Sets construction variables for the IBM xlc / Visual Age C compiler\&.
-.sp
-Sets:
-\fB$CC\fR,
-\fB$CCVERSION\fR,
-\fB$SHCC\fR\&.
-.RE
-.PP
-aixf77
-.RS 4
-Sets construction variables for the IBM Visual Age f77 Fortran compiler\&.
-.sp
-Sets:
-\fB$F77\fR,
-\fB$SHF77\fR\&.
-.RE
-.PP
-aixlink
-.RS 4
-Sets construction variables for the IBM Visual Age linker\&.
-.sp
-Sets:
-\fB$LINKFLAGS\fR,
-\fB$SHLIBSUFFIX\fR,
-\fB$SHLINKFLAGS\fR\&.
-.RE
-.PP
-applelink
-.RS 4
-Sets construction variables for the Apple linker (similar to the GNU linker)\&.
-.sp
-Sets:
-\fB$FRAMEWORKPATHPREFIX\fR,
-\fB$LDMODULECOM\fR,
-\fB$LDMODULEFLAGS\fR,
-\fB$LDMODULEPREFIX\fR,
-\fB$LDMODULESUFFIX\fR,
-\fB$LINKCOM\fR,
-\fB$SHLINKCOM\fR,
-\fB$SHLINKFLAGS\fR,
-\fB$_FRAMEWORKPATH\fR,
-\fB$_FRAMEWORKS\fR\&.
-.sp
-Uses:
-\fB$FRAMEWORKSFLAGS\fR\&.
-.RE
-.PP
-ar
-.RS 4
-Sets construction variables for the
-ar
-library archiver\&.
-.sp
-Sets:
-\fB$AR\fR,
-\fB$ARCOM\fR,
-\fB$ARFLAGS\fR,
-\fB$LIBPREFIX\fR,
-\fB$LIBSUFFIX\fR,
-\fB$RANLIB\fR,
-\fB$RANLIBCOM\fR,
-\fB$RANLIBFLAGS\fR\&.
-.RE
-.PP
-as
-.RS 4
-Sets construction variables for the
-as
-assembler\&.
-.sp
-Sets:
-\fB$AS\fR,
-\fB$ASCOM\fR,
-\fB$ASFLAGS\fR,
-\fB$ASPPCOM\fR,
-\fB$ASPPFLAGS\fR\&.
-.sp
-Uses:
-\fB$CC\fR,
-\fB$CPPFLAGS\fR,
-\fB$_CPPDEFFLAGS\fR,
-\fB$_CPPINCFLAGS\fR\&.
-.RE
-.PP
-bcc32
-.RS 4
-Sets construction variables for the bcc32 compiler\&.
-.sp
-Sets:
-\fB$CC\fR,
-\fB$CCCOM\fR,
-\fB$CCFLAGS\fR,
-\fB$CFILESUFFIX\fR,
-\fB$CFLAGS\fR,
-\fB$CPPDEFPREFIX\fR,
-\fB$CPPDEFSUFFIX\fR,
-\fB$INCPREFIX\fR,
-\fB$INCSUFFIX\fR,
-\fB$SHCC\fR,
-\fB$SHCCCOM\fR,
-\fB$SHCCFLAGS\fR,
-\fB$SHCFLAGS\fR,
-\fB$SHOBJSUFFIX\fR\&.
-.sp
-Uses:
-\fB$_CPPDEFFLAGS\fR,
-\fB$_CPPINCFLAGS\fR\&.
-.RE
-.PP
-BitKeeper
-.RS 4
-Sets construction variables for the BitKeeper source code control system\&.
-.sp
-Sets:
-\fB$BITKEEPER\fR,
-\fB$BITKEEPERCOM\fR,
-\fB$BITKEEPERGET\fR,
-\fB$BITKEEPERGETFLAGS\fR\&.
-.sp
-Uses:
-\fB$BITKEEPERCOMSTR\fR\&.
-.RE
-.PP
-cc
-.RS 4
-Sets construction variables for generic POSIX C copmilers\&.
-.sp
-Sets:
-\fB$CC\fR,
-\fB$CCCOM\fR,
-\fB$CCFLAGS\fR,
-\fB$CFILESUFFIX\fR,
-\fB$CFLAGS\fR,
-\fB$CPPDEFPREFIX\fR,
-\fB$CPPDEFSUFFIX\fR,
-\fB$FRAMEWORKPATH\fR,
-\fB$FRAMEWORKS\fR,
-\fB$INCPREFIX\fR,
-\fB$INCSUFFIX\fR,
-\fB$SHCC\fR,
-\fB$SHCCCOM\fR,
-\fB$SHCCFLAGS\fR,
-\fB$SHCFLAGS\fR,
-\fB$SHOBJSUFFIX\fR\&.
-.sp
-Uses:
-\fB$PLATFORM\fR\&.
-.RE
-.PP
-cvf
-.RS 4
-Sets construction variables for the Compaq Visual Fortran compiler\&.
-.sp
-Sets:
-\fB$FORTRAN\fR,
-\fB$FORTRANCOM\fR,
-\fB$FORTRANMODDIR\fR,
-\fB$FORTRANMODDIRPREFIX\fR,
-\fB$FORTRANMODDIRSUFFIX\fR,
-\fB$FORTRANPPCOM\fR,
-\fB$OBJSUFFIX\fR,
-\fB$SHFORTRANCOM\fR,
-\fB$SHFORTRANPPCOM\fR\&.
-.sp
-Uses:
-\fB$CPPFLAGS\fR,
-\fB$FORTRANFLAGS\fR,
-\fB$SHFORTRANFLAGS\fR,
-\fB$_CPPDEFFLAGS\fR,
-\fB$_FORTRANINCFLAGS\fR,
-\fB$_FORTRANMODFLAG\fR\&.
-.RE
-.PP
-CVS
-.RS 4
-Sets construction variables for the CVS source code management system\&.
-.sp
-Sets:
-\fB$CVS\fR,
-\fB$CVSCOFLAGS\fR,
-\fB$CVSCOM\fR,
-\fB$CVSFLAGS\fR\&.
-.sp
-Uses:
-\fB$CVSCOMSTR\fR\&.
-.RE
-.PP
-cXX
-.RS 4
-Sets construction variables for generic POSIX C++ compilers\&.
-.sp
-Sets:
-\fB$CPPDEFPREFIX\fR,
-\fB$CPPDEFSUFFIX\fR,
-\fB$CXX\fR,
-\fB$CXXCOM\fR,
-\fB$CXXFILESUFFIX\fR,
-\fB$CXXFLAGS\fR,
-\fB$INCPREFIX\fR,
-\fB$INCSUFFIX\fR,
-\fB$OBJSUFFIX\fR,
-\fB$SHCXX\fR,
-\fB$SHCXXCOM\fR,
-\fB$SHCXXFLAGS\fR,
-\fB$SHOBJSUFFIX\fR\&.
-.sp
-Uses:
-\fB$CXXCOMSTR\fR\&.
-.RE
-.PP
-default
-.RS 4
-Sets variables by calling a default list of Tool modules for the platform on which SCons is running\&.
-.RE
-.PP
-dmd
-.RS 4
-Sets construction variables for D language compiler DMD\&.
-.sp
-Sets:
-\fB$DC\fR,
-\fB$DCOM\fR,
-\fB$DDEBUG\fR,
-\fB$DDEBUGPREFIX\fR,
-\fB$DDEBUGSUFFIX\fR,
-\fB$DFILESUFFIX\fR,
-\fB$DFLAGPREFIX\fR,
-\fB$DFLAGS\fR,
-\fB$DFLAGSUFFIX\fR,
-\fB$DINCPREFIX\fR,
-\fB$DINCSUFFIX\fR,
-\fB$DLIB\fR,
-\fB$DLIBCOM\fR,
-\fB$DLIBDIRPREFIX\fR,
-\fB$DLIBDIRSUFFIX\fR,
-\fB$DLIBFLAGPREFIX\fR,
-\fB$DLIBFLAGSUFFIX\fR,
-\fB$DLIBLINKPREFIX\fR,
-\fB$DLIBLINKSUFFIX\fR,
-\fB$DLINK\fR,
-\fB$DLINKCOM\fR,
-\fB$DLINKFLAGS\fR,
-\fB$DPATH\fR,
-\fB$DVERPREFIX\fR,
-\fB$DVERSIONS\fR,
-\fB$DVERSUFFIX\fR,
-\fB$RPATHPREFIX\fR,
-\fB$RPATHSUFFIX\fR,
-\fB$SHDC\fR,
-\fB$SHDCOM\fR,
-\fB$SHDLINK\fR,
-\fB$SHDLINKCOM\fR,
-\fB$SHDLINKFLAGS\fR,
-\fB$_DDEBUGFLAGS\fR,
-\fB$_DFLAGS\fR,
-\fB$_DINCFLAGS\fR,
-\fB$_DLIBDIRFLAGS\fR,
-\fB$_DLIBFLAGS\fR,
-\fB$_DLIBFLAGS\fR,
-\fB$_DVERFLAGS\fR,
-\fB$_RPATH\fR\&.
-.RE
-.PP
-docbook
-.RS 4
-This tool tries to make working with Docbook in SCons a little easier\&. It provides several toolchains for creating different output formats, like HTML or PDF\&. Contained in the package is a distribution of the Docbook XSL stylesheets as of version 1\&.76\&.1\&. As long as you don\*(Aqt specify your own stylesheets for customization, these official versions are picked as default\&.\&.\&.which should reduce the inevitable setup hassles for you\&.
-.sp
-Implicit dependencies to images and XIncludes are detected automatically if you meet the HTML requirements\&. The additional stylesheet
-utils/xmldepend\&.xsl
-by Paul DuBois is used for this purpose\&.
-.sp
-Note, that there is no support for XML catalog resolving offered! This tool calls the XSLT processors and PDF renderers with the stylesheets you specified, that\*(Aqs it\&. The rest lies in your hands and you still have to know what you\*(Aqre doing when resolving names via a catalog\&.
-.sp
-For activating the tool "docbook", you have to add its name to the Environment constructor, like this
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-env = Environment(tools=[\*(Aqdocbook\*(Aq])
-.fi
-.if n \{\
-.RE
-.\}
-.sp
-On its startup, the Docbook tool tries to find a required
-xsltproc
-processor, and a PDF renderer, e\&.g\&.
-fop\&. So make sure that these are added to your system\*(Aqs environment
-PATH
-and can be called directly, without specifying their full path\&.
-.sp
-For the most basic processing of Docbook to HTML, you need to have installed
-.sp
-.RS 4
-.ie n \{\
-\h'-04'\(bu\h'+03'\c
-.\}
-.el \{\
-.sp -1
-.IP \(bu 2.3
-.\}
-the Python
-lxml
-binding to
-libxml2, or
-.RE
-.sp
-.RS 4
-.ie n \{\
-\h'-04'\(bu\h'+03'\c
-.\}
-.el \{\
-.sp -1
-.IP \(bu 2.3
-.\}
-the direct Python bindings for
-libxml2/libxslt, or
-.RE
-.sp
-.RS 4
-.ie n \{\
-\h'-04'\(bu\h'+03'\c
-.\}
-.el \{\
-.sp -1
-.IP \(bu 2.3
-.\}
-a standalone XSLT processor, currently detected are
-xsltproc,
-saxon,
-saxon\-xslt
-and
-xalan\&.
-.RE
-.sp
-Rendering to PDF requires you to have one of the applications
-fop
-or
-xep
-installed\&.
-.sp
-Creating a HTML or PDF document is very simple and straightforward\&. Say
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-env = Environment(tools=[\*(Aqdocbook\*(Aq])
-env\&.DocbookHtml(\*(Aqmanual\&.html\*(Aq, \*(Aqmanual\&.xml\*(Aq)
-env\&.DocbookPdf(\*(Aqmanual\&.pdf\*(Aq, \*(Aqmanual\&.xml\*(Aq)
-.fi
-.if n \{\
-.RE
-.\}
-.sp
-to get both outputs from your XML source
-manual\&.xml\&. As a shortcut, you can give the stem of the filenames alone, like this:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-env = Environment(tools=[\*(Aqdocbook\*(Aq])
-env\&.DocbookHtml(\*(Aqmanual\*(Aq)
-env\&.DocbookPdf(\*(Aqmanual\*(Aq)
-.fi
-.if n \{\
-.RE
-.\}
-.sp
-and get the same result\&. Target and source lists are also supported:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-env = Environment(tools=[\*(Aqdocbook\*(Aq])
-env\&.DocbookHtml([\*(Aqmanual\&.html\*(Aq,\*(Aqreference\&.html\*(Aq], [\*(Aqmanual\&.xml\*(Aq,\*(Aqreference\&.xml\*(Aq])
-.fi
-.if n \{\
-.RE
-.\}
-.sp
-or even
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-env = Environment(tools=[\*(Aqdocbook\*(Aq])
-env\&.DocbookHtml([\*(Aqmanual\*(Aq,\*(Aqreference\*(Aq])
-.fi
-.if n \{\
-.RE
-.\}
-.sp
-.if n \{\
-.sp
-.\}
-.RS 4
-.it 1 an-trap
-.nr an-no-space-flag 1
-.nr an-break-flag 1
-.br
-.ps +1
-\fBImportant\fR
-.ps -1
-.br
-Whenever you leave out the list of sources, you may not specify a file extension! The Tool uses the given names as file stems, and adds the suffixes for target and source files accordingly\&.
-.sp .5v
-.RE
-The rules given above are valid for the Builders
-\fBDocbookHtml\fR,
-\fBDocbookPdf\fR,
-\fBDocbookEpub\fR,
-\fBDocbookSlidesPdf\fR
-and
-\fBDocbookXInclude\fR\&. For the
-\fBDocbookMan\fR
-transformation you can specify a target name, but the actual output names are automatically set from the
-refname
-entries in your XML source\&.
-.sp
-The Builders
-\fBDocbookHtmlChunked\fR,
-\fBDocbookHtmlhelp\fR
-and
-\fBDocbookSlidesHtml\fR
-are special, in that:
-.sp
-.RS 4
-.ie n \{\
-\h'-04' 1.\h'+01'\c
-.\}
-.el \{\
-.sp -1
-.IP " 1." 4.2
-.\}
-they create a large set of files, where the exact names and their number depend on the content of the source file, and
-.RE
-.sp
-.RS 4
-.ie n \{\
-\h'-04' 2.\h'+01'\c
-.\}
-.el \{\
-.sp -1
-.IP " 2." 4.2
-.\}
-the main target is always named
-index\&.html, i\&.e\&. the output name for the XSL transformation is not picked up by the stylesheets\&.
-.RE
-.sp
-As a result, there is simply no use in specifying a target HTML name\&. So the basic syntax for these builders is always:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-env = Environment(tools=[\*(Aqdocbook\*(Aq])
-env\&.DocbookHtmlhelp(\*(Aqmanual\*(Aq)
-.fi
-.if n \{\
-.RE
-.\}
-.sp
-If you want to use a specific XSL file, you can set the additional
-xsl
-parameter to your Builder call as follows:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-env\&.DocbookHtml(\*(Aqother\&.html\*(Aq, \*(Aqmanual\&.xml\*(Aq, xsl=\*(Aqhtml\&.xsl\*(Aq)
-.fi
-.if n \{\
-.RE
-.\}
-.sp
-Since this may get tedious if you always use the same local naming for your customized XSL files, e\&.g\&.
-html\&.xsl
-for HTML and
-pdf\&.xsl
-for PDF output, a set of variables for setting the default XSL name is provided\&. These are:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-DOCBOOK_DEFAULT_XSL_HTML
-DOCBOOK_DEFAULT_XSL_HTMLCHUNKED
-DOCBOOK_DEFAULT_XSL_HTMLHELP
-DOCBOOK_DEFAULT_XSL_PDF
-DOCBOOK_DEFAULT_XSL_EPUB
-DOCBOOK_DEFAULT_XSL_MAN
-DOCBOOK_DEFAULT_XSL_SLIDESPDF
-DOCBOOK_DEFAULT_XSL_SLIDESHTML
-.fi
-.if n \{\
-.RE
-.\}
-.sp
-and you can set them when constructing your environment:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-env = Environment(tools=[\*(Aqdocbook\*(Aq],
- DOCBOOK_DEFAULT_XSL_HTML=\*(Aqhtml\&.xsl\*(Aq,
- DOCBOOK_DEFAULT_XSL_PDF=\*(Aqpdf\&.xsl\*(Aq)
-env\&.DocbookHtml(\*(Aqmanual\*(Aq) # now uses html\&.xsl
-.fi
-.if n \{\
-.RE
-.\}
-.sp
-Sets:
-\fB$DOCBOOK_DEFAULT_XSL_EPUB\fR,
-\fB$DOCBOOK_DEFAULT_XSL_HTML\fR,
-\fB$DOCBOOK_DEFAULT_XSL_HTMLCHUNKED\fR,
-\fB$DOCBOOK_DEFAULT_XSL_HTMLHELP\fR,
-\fB$DOCBOOK_DEFAULT_XSL_MAN\fR,
-\fB$DOCBOOK_DEFAULT_XSL_PDF\fR,
-\fB$DOCBOOK_DEFAULT_XSL_SLIDESHTML\fR,
-\fB$DOCBOOK_DEFAULT_XSL_SLIDESPDF\fR,
-\fB$DOCBOOK_FOP\fR,
-\fB$DOCBOOK_FOPCOM\fR,
-\fB$DOCBOOK_FOPFLAGS\fR,
-\fB$DOCBOOK_XMLLINT\fR,
-\fB$DOCBOOK_XMLLINTCOM\fR,
-\fB$DOCBOOK_XMLLINTFLAGS\fR,
-\fB$DOCBOOK_XSLTPROC\fR,
-\fB$DOCBOOK_XSLTPROCCOM\fR,
-\fB$DOCBOOK_XSLTPROCFLAGS\fR,
-\fB$DOCBOOK_XSLTPROCPARAMS\fR\&.
-.sp
-Uses:
-\fB$DOCBOOK_FOPCOMSTR\fR,
-\fB$DOCBOOK_XMLLINTCOMSTR\fR,
-\fB$DOCBOOK_XSLTPROCCOMSTR\fR\&.
-.RE
-.PP
-dvi
-.RS 4
-Attaches the
-\fBDVI\fR
-builder to the construction environment\&.
-.RE
-.PP
-dvipdf
-.RS 4
-Sets construction variables for the dvipdf utility\&.
-.sp
-Sets:
-\fB$DVIPDF\fR,
-\fB$DVIPDFCOM\fR,
-\fB$DVIPDFFLAGS\fR\&.
-.sp
-Uses:
-\fB$DVIPDFCOMSTR\fR\&.
-.RE
-.PP
-dvips
-.RS 4
-Sets construction variables for the dvips utility\&.
-.sp
-Sets:
-\fB$DVIPS\fR,
-\fB$DVIPSFLAGS\fR,
-\fB$PSCOM\fR,
-\fB$PSPREFIX\fR,
-\fB$PSSUFFIX\fR\&.
-.sp
-Uses:
-\fB$PSCOMSTR\fR\&.
-.RE
-.PP
-f03
-.RS 4
-Set construction variables for generic POSIX Fortran 03 compilers\&.
-.sp
-Sets:
-\fB$F03\fR,
-\fB$F03COM\fR,
-\fB$F03FLAGS\fR,
-\fB$F03PPCOM\fR,
-\fB$SHF03\fR,
-\fB$SHF03COM\fR,
-\fB$SHF03FLAGS\fR,
-\fB$SHF03PPCOM\fR,
-\fB$_F03INCFLAGS\fR\&.
-.sp
-Uses:
-\fB$F03COMSTR\fR,
-\fB$F03PPCOMSTR\fR,
-\fB$SHF03COMSTR\fR,
-\fB$SHF03PPCOMSTR\fR\&.
-.RE
-.PP
-f08
-.RS 4
-Set construction variables for generic POSIX Fortran 08 compilers\&.
-.sp
-Sets:
-\fB$F08\fR,
-\fB$F08COM\fR,
-\fB$F08FLAGS\fR,
-\fB$F08PPCOM\fR,
-\fB$SHF08\fR,
-\fB$SHF08COM\fR,
-\fB$SHF08FLAGS\fR,
-\fB$SHF08PPCOM\fR,
-\fB$_F08INCFLAGS\fR\&.
-.sp
-Uses:
-\fB$F08COMSTR\fR,
-\fB$F08PPCOMSTR\fR,
-\fB$SHF08COMSTR\fR,
-\fB$SHF08PPCOMSTR\fR\&.
-.RE
-.PP
-f77
-.RS 4
-Set construction variables for generic POSIX Fortran 77 compilers\&.
-.sp
-Sets:
-\fB$F77\fR,
-\fB$F77COM\fR,
-\fB$F77FILESUFFIXES\fR,
-\fB$F77FLAGS\fR,
-\fB$F77PPCOM\fR,
-\fB$F77PPFILESUFFIXES\fR,
-\fB$FORTRAN\fR,
-\fB$FORTRANCOM\fR,
-\fB$FORTRANFLAGS\fR,
-\fB$SHF77\fR,
-\fB$SHF77COM\fR,
-\fB$SHF77FLAGS\fR,
-\fB$SHF77PPCOM\fR,
-\fB$SHFORTRAN\fR,
-\fB$SHFORTRANCOM\fR,
-\fB$SHFORTRANFLAGS\fR,
-\fB$SHFORTRANPPCOM\fR,
-\fB$_F77INCFLAGS\fR\&.
-.sp
-Uses:
-\fB$F77COMSTR\fR,
-\fB$F77PPCOMSTR\fR,
-\fB$FORTRANCOMSTR\fR,
-\fB$FORTRANPPCOMSTR\fR,
-\fB$SHF77COMSTR\fR,
-\fB$SHF77PPCOMSTR\fR,
-\fB$SHFORTRANCOMSTR\fR,
-\fB$SHFORTRANPPCOMSTR\fR\&.
-.RE
-.PP
-f90
-.RS 4
-Set construction variables for generic POSIX Fortran 90 compilers\&.
-.sp
-Sets:
-\fB$F90\fR,
-\fB$F90COM\fR,
-\fB$F90FLAGS\fR,
-\fB$F90PPCOM\fR,
-\fB$SHF90\fR,
-\fB$SHF90COM\fR,
-\fB$SHF90FLAGS\fR,
-\fB$SHF90PPCOM\fR,
-\fB$_F90INCFLAGS\fR\&.
-.sp
-Uses:
-\fB$F90COMSTR\fR,
-\fB$F90PPCOMSTR\fR,
-\fB$SHF90COMSTR\fR,
-\fB$SHF90PPCOMSTR\fR\&.
-.RE
-.PP
-f95
-.RS 4
-Set construction variables for generic POSIX Fortran 95 compilers\&.
-.sp
-Sets:
-\fB$F95\fR,
-\fB$F95COM\fR,
-\fB$F95FLAGS\fR,
-\fB$F95PPCOM\fR,
-\fB$SHF95\fR,
-\fB$SHF95COM\fR,
-\fB$SHF95FLAGS\fR,
-\fB$SHF95PPCOM\fR,
-\fB$_F95INCFLAGS\fR\&.
-.sp
-Uses:
-\fB$F95COMSTR\fR,
-\fB$F95PPCOMSTR\fR,
-\fB$SHF95COMSTR\fR,
-\fB$SHF95PPCOMSTR\fR\&.
-.RE
-.PP
-fortran
-.RS 4
-Set construction variables for generic POSIX Fortran compilers\&.
-.sp
-Sets:
-\fB$FORTRAN\fR,
-\fB$FORTRANCOM\fR,
-\fB$FORTRANFLAGS\fR,
-\fB$SHFORTRAN\fR,
-\fB$SHFORTRANCOM\fR,
-\fB$SHFORTRANFLAGS\fR,
-\fB$SHFORTRANPPCOM\fR\&.
-.sp
-Uses:
-\fB$FORTRANCOMSTR\fR,
-\fB$FORTRANPPCOMSTR\fR,
-\fB$SHFORTRANCOMSTR\fR,
-\fB$SHFORTRANPPCOMSTR\fR\&.
-.RE
-.PP
-g++
-.RS 4
-Set construction variables for the
-gXX
-C++ compiler\&.
-.sp
-Sets:
-\fB$CXX\fR,
-\fB$CXXVERSION\fR,
-\fB$SHCXXFLAGS\fR,
-\fB$SHOBJSUFFIX\fR\&.
-.RE
-.PP
-g77
-.RS 4
-Set construction variables for the
-g77
-Fortran compiler\&. Calls the
-f77
-Tool module to set variables\&.
-.RE
-.PP
-gas
-.RS 4
-Sets construction variables for the
-gas
-assembler\&. Calls the
-as
-module\&.
-.sp
-Sets:
-\fB$AS\fR\&.
-.RE
-.PP
-gcc
-.RS 4
-Set construction variables for the
-gcc
-C compiler\&.
-.sp
-Sets:
-\fB$CC\fR,
-\fB$CCVERSION\fR,
-\fB$SHCCFLAGS\fR\&.
-.RE
-.PP
-gdc
-.RS 4
-Sets construction variables for the D language compiler GDC\&.
-.sp
-Sets:
-\fB$DC\fR,
-\fB$DCOM\fR,
-\fB$DDEBUG\fR,
-\fB$DDEBUGPREFIX\fR,
-\fB$DDEBUGSUFFIX\fR,
-\fB$DFILESUFFIX\fR,
-\fB$DFLAGPREFIX\fR,
-\fB$DFLAGS\fR,
-\fB$DFLAGSUFFIX\fR,
-\fB$DINCPREFIX\fR,
-\fB$DINCSUFFIX\fR,
-\fB$DLIB\fR,
-\fB$DLIBCOM\fR,
-\fB$DLIBFLAGPREFIX\fR,
-\fB$DLIBFLAGSUFFIX\fR,
-\fB$DLINK\fR,
-\fB$DLINKCOM\fR,
-\fB$DLINKFLAGPREFIX\fR,
-\fB$DLINKFLAGS\fR,
-\fB$DLINKFLAGSUFFIX\fR,
-\fB$DPATH\fR,
-\fB$DVERPREFIX\fR,
-\fB$DVERSIONS\fR,
-\fB$DVERSUFFIX\fR,
-\fB$RPATHPREFIX\fR,
-\fB$RPATHSUFFIX\fR,
-\fB$SHDC\fR,
-\fB$SHDCOM\fR,
-\fB$SHDLINK\fR,
-\fB$SHDLINKCOM\fR,
-\fB$SHDLINKFLAGS\fR,
-\fB$_DDEBUGFLAGS\fR,
-\fB$_DFLAGS\fR,
-\fB$_DINCFLAGS\fR,
-\fB$_DLIBFLAGS\fR,
-\fB$_DVERFLAGS\fR,
-\fB$_RPATH\fR\&.
-.RE
-.PP
-gettext
-.RS 4
-This is actually a toolset, which supports internationalization and localization of sofware being constructed with SCons\&. The toolset loads following tools:
-.sp
-
-.sp
-.RS 4
-.ie n \{\
-\h'-04'\(bu\h'+03'\c
-.\}
-.el \{\
-.sp -1
-.IP \(bu 2.3
-.\}
-
-xgettext
-\- to extract internationalized messages from source code to
-POT
-file(s),
-.RE
-.sp
-.RS 4
-.ie n \{\
-\h'-04'\(bu\h'+03'\c
-.\}
-.el \{\
-.sp -1
-.IP \(bu 2.3
-.\}
-
-msginit
-\- may be optionally used to initialize
-PO
-files,
-.RE
-.sp
-.RS 4
-.ie n \{\
-\h'-04'\(bu\h'+03'\c
-.\}
-.el \{\
-.sp -1
-.IP \(bu 2.3
-.\}
-
-msgmerge
-\- to update
-PO
-files, that already contain translated messages,
-.RE
-.sp
-.RS 4
-.ie n \{\
-\h'-04'\(bu\h'+03'\c
-.\}
-.el \{\
-.sp -1
-.IP \(bu 2.3
-.\}
-
-msgfmt
-\- to compile textual
-PO
-file to binary installable
-MO
-file\&.
-.RE
-.sp
-When you enable
-gettext, it internally loads all abovementioned tools, so you\*(Aqre encouraged to see their individual documentation\&.
-.sp
-Each of the above tools provides its own builder(s) which may be used to perform particular activities related to software internationalization\&. You may be however interested in
-\fItop\-level\fR
-builder
-\fBTranslate\fR
-described few paragraphs later\&.
-.sp
-To use
-gettext
-tools add
-\*(Aqgettext\*(Aq
-tool to your environment:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
- env = Environment( tools = [\*(Aqdefault\*(Aq, \*(Aqgettext\*(Aq] )
-.fi
-.if n \{\
-.RE
-.\}
-.RE
-.PP
-gfortran
-.RS 4
-Sets construction variables for the GNU F95/F2003 GNU compiler\&.
-.sp
-Sets:
-\fB$F77\fR,
-\fB$F90\fR,
-\fB$F95\fR,
-\fB$FORTRAN\fR,
-\fB$SHF77\fR,
-\fB$SHF77FLAGS\fR,
-\fB$SHF90\fR,
-\fB$SHF90FLAGS\fR,
-\fB$SHF95\fR,
-\fB$SHF95FLAGS\fR,
-\fB$SHFORTRAN\fR,
-\fB$SHFORTRANFLAGS\fR\&.
-.RE
-.PP
-gnulink
-.RS 4
-Set construction variables for GNU linker/loader\&.
-.sp
-Sets:
-\fB$RPATHPREFIX\fR,
-\fB$RPATHSUFFIX\fR,
-\fB$SHLINKFLAGS\fR\&.
-.RE
-.PP
-gs
-.RS 4
-This Tool sets the required construction variables for working with the Ghostscript command\&. It also registers an appropriate Action with the PDF Builder (\fBPDF\fR), such that the conversion from PS/EPS to PDF happens automatically for the TeX/LaTeX toolchain\&. Finally, it adds an explicit Ghostscript Builder (\fBGs\fR) to the environment\&.
-.sp
-Sets:
-\fB$GS\fR,
-\fB$GSCOM\fR,
-\fB$GSFLAGS\fR\&.
-.sp
-Uses:
-\fB$GSCOMSTR\fR\&.
-.RE
-.PP
-hpc++
-.RS 4
-Set construction variables for the compilers aCC on HP/UX systems\&.
-.RE
-.PP
-hpcc
-.RS 4
-Set construction variables for the
-aCC
-on HP/UX systems\&. Calls the
-cXX
-tool for additional variables\&.
-.sp
-Sets:
-\fB$CXX\fR,
-\fB$CXXVERSION\fR,
-\fB$SHCXXFLAGS\fR\&.
-.RE
-.PP
-hplink
-.RS 4
-Sets construction variables for the linker on HP/UX systems\&.
-.sp
-Sets:
-\fB$LINKFLAGS\fR,
-\fB$SHLIBSUFFIX\fR,
-\fB$SHLINKFLAGS\fR\&.
-.RE
-.PP
-icc
-.RS 4
-Sets construction variables for the
-icc
-compiler on OS/2 systems\&.
-.sp
-Sets:
-\fB$CC\fR,
-\fB$CCCOM\fR,
-\fB$CFILESUFFIX\fR,
-\fB$CPPDEFPREFIX\fR,
-\fB$CPPDEFSUFFIX\fR,
-\fB$CXXCOM\fR,
-\fB$CXXFILESUFFIX\fR,
-\fB$INCPREFIX\fR,
-\fB$INCSUFFIX\fR\&.
-.sp
-Uses:
-\fB$CCFLAGS\fR,
-\fB$CFLAGS\fR,
-\fB$CPPFLAGS\fR,
-\fB$_CPPDEFFLAGS\fR,
-\fB$_CPPINCFLAGS\fR\&.
-.RE
-.PP
-icl
-.RS 4
-Sets construction variables for the Intel C/C++ compiler\&. Calls the
-intelc
-Tool module to set its variables\&.
-.RE
-.PP
-ifl
-.RS 4
-Sets construction variables for the Intel Fortran compiler\&.
-.sp
-Sets:
-\fB$FORTRAN\fR,
-\fB$FORTRANCOM\fR,
-\fB$FORTRANPPCOM\fR,
-\fB$SHFORTRANCOM\fR,
-\fB$SHFORTRANPPCOM\fR\&.
-.sp
-Uses:
-\fB$CPPFLAGS\fR,
-\fB$FORTRANFLAGS\fR,
-\fB$_CPPDEFFLAGS\fR,
-\fB$_FORTRANINCFLAGS\fR\&.
-.RE
-.PP
-ifort
-.RS 4
-Sets construction variables for newer versions of the Intel Fortran compiler for Linux\&.
-.sp
-Sets:
-\fB$F77\fR,
-\fB$F90\fR,
-\fB$F95\fR,
-\fB$FORTRAN\fR,
-\fB$SHF77\fR,
-\fB$SHF77FLAGS\fR,
-\fB$SHF90\fR,
-\fB$SHF90FLAGS\fR,
-\fB$SHF95\fR,
-\fB$SHF95FLAGS\fR,
-\fB$SHFORTRAN\fR,
-\fB$SHFORTRANFLAGS\fR\&.
-.RE
-.PP
-ilink
-.RS 4
-Sets construction variables for the
-ilink
-linker on OS/2 systems\&.
-.sp
-Sets:
-\fB$LIBDIRPREFIX\fR,
-\fB$LIBDIRSUFFIX\fR,
-\fB$LIBLINKPREFIX\fR,
-\fB$LIBLINKSUFFIX\fR,
-\fB$LINK\fR,
-\fB$LINKCOM\fR,
-\fB$LINKFLAGS\fR\&.
-.RE
-.PP
-ilink32
-.RS 4
-Sets construction variables for the Borland
-ilink32
-linker\&.
-.sp
-Sets:
-\fB$LIBDIRPREFIX\fR,
-\fB$LIBDIRSUFFIX\fR,
-\fB$LIBLINKPREFIX\fR,
-\fB$LIBLINKSUFFIX\fR,
-\fB$LINK\fR,
-\fB$LINKCOM\fR,
-\fB$LINKFLAGS\fR\&.
-.RE
-.PP
-install
-.RS 4
-Sets construction variables for file and directory installation\&.
-.sp
-Sets:
-\fB$INSTALL\fR,
-\fB$INSTALLSTR\fR\&.
-.RE
-.PP
-intelc
-.RS 4
-Sets construction variables for the Intel C/C++ compiler (Linux and Windows, version 7 and later)\&. Calls the
-gcc
-or
-msvc
-(on Linux and Windows, respectively) to set underlying variables\&.
-.sp
-Sets:
-\fB$AR\fR,
-\fB$CC\fR,
-\fB$CXX\fR,
-\fB$INTEL_C_COMPILER_VERSION\fR,
-\fB$LINK\fR\&.
-.RE
-.PP
-jar
-.RS 4
-Sets construction variables for the
-jar
-utility\&.
-.sp
-Sets:
-\fB$JAR\fR,
-\fB$JARCOM\fR,
-\fB$JARFLAGS\fR,
-\fB$JARSUFFIX\fR\&.
-.sp
-Uses:
-\fB$JARCOMSTR\fR\&.
-.RE
-.PP
-javac
-.RS 4
-Sets construction variables for the
-javac
-compiler\&.
-.sp
-Sets:
-\fB$JAVABOOTCLASSPATH\fR,
-\fB$JAVAC\fR,
-\fB$JAVACCOM\fR,
-\fB$JAVACFLAGS\fR,
-\fB$JAVACLASSPATH\fR,
-\fB$JAVACLASSSUFFIX\fR,
-\fB$JAVASOURCEPATH\fR,
-\fB$JAVASUFFIX\fR\&.
-.sp
-Uses:
-\fB$JAVACCOMSTR\fR\&.
-.RE
-.PP
-javah
-.RS 4
-Sets construction variables for the
-javah
-tool\&.
-.sp
-Sets:
-\fB$JAVACLASSSUFFIX\fR,
-\fB$JAVAH\fR,
-\fB$JAVAHCOM\fR,
-\fB$JAVAHFLAGS\fR\&.
-.sp
-Uses:
-\fB$JAVACLASSPATH\fR,
-\fB$JAVAHCOMSTR\fR\&.
-.RE
-.PP
-latex
-.RS 4
-Sets construction variables for the
-latex
-utility\&.
-.sp
-Sets:
-\fB$LATEX\fR,
-\fB$LATEXCOM\fR,
-\fB$LATEXFLAGS\fR\&.
-.sp
-Uses:
-\fB$LATEXCOMSTR\fR\&.
-.RE
-.PP
-ldc
-.RS 4
-Sets construction variables for the D language compiler LDC2\&.
-.sp
-Sets:
-\fB$DC\fR,
-\fB$DCOM\fR,
-\fB$DDEBUG\fR,
-\fB$DDEBUGPREFIX\fR,
-\fB$DDEBUGSUFFIX\fR,
-\fB$DFILESUFFIX\fR,
-\fB$DFLAGPREFIX\fR,
-\fB$DFLAGS\fR,
-\fB$DFLAGSUFFIX\fR,
-\fB$DINCPREFIX\fR,
-\fB$DINCSUFFIX\fR,
-\fB$DLIB\fR,
-\fB$DLIBCOM\fR,
-\fB$DLIBDIRPREFIX\fR,
-\fB$DLIBDIRSUFFIX\fR,
-\fB$DLIBFLAGPREFIX\fR,
-\fB$DLIBFLAGSUFFIX\fR,
-\fB$DLIBLINKPREFIX\fR,
-\fB$DLIBLINKSUFFIX\fR,
-\fB$DLINK\fR,
-\fB$DLINKCOM\fR,
-\fB$DLINKFLAGPREFIX\fR,
-\fB$DLINKFLAGS\fR,
-\fB$DLINKFLAGSUFFIX\fR,
-\fB$DPATH\fR,
-\fB$DVERPREFIX\fR,
-\fB$DVERSIONS\fR,
-\fB$DVERSUFFIX\fR,
-\fB$RPATHPREFIX\fR,
-\fB$RPATHSUFFIX\fR,
-\fB$SHDC\fR,
-\fB$SHDCOM\fR,
-\fB$SHDLINK\fR,
-\fB$SHDLINKCOM\fR,
-\fB$SHDLINKFLAGS\fR,
-\fB$_DDEBUGFLAGS\fR,
-\fB$_DFLAGS\fR,
-\fB$_DINCFLAGS\fR,
-\fB$_DLIBDIRFLAGS\fR,
-\fB$_DLIBFLAGS\fR,
-\fB$_DLIBFLAGS\fR,
-\fB$_DVERFLAGS\fR,
-\fB$_RPATH\fR\&.
-.RE
-.PP
-lex
-.RS 4
-Sets construction variables for the
-lex
-lexical analyser\&.
-.sp
-Sets:
-\fB$LEX\fR,
-\fB$LEXCOM\fR,
-\fB$LEXFLAGS\fR\&.
-.sp
-Uses:
-\fB$LEXCOMSTR\fR\&.
-.RE
-.PP
-link
-.RS 4
-Sets construction variables for generic POSIX linkers\&.
-.sp
-Sets:
-\fB$LDMODULE\fR,
-\fB$LDMODULECOM\fR,
-\fB$LDMODULEFLAGS\fR,
-\fB$LDMODULEPREFIX\fR,
-\fB$LDMODULESUFFIX\fR,
-\fB$LIBDIRPREFIX\fR,
-\fB$LIBDIRSUFFIX\fR,
-\fB$LIBLINKPREFIX\fR,
-\fB$LIBLINKSUFFIX\fR,
-\fB$LINK\fR,
-\fB$LINKCOM\fR,
-\fB$LINKFLAGS\fR,
-\fB$SHLIBSUFFIX\fR,
-\fB$SHLINK\fR,
-\fB$SHLINKCOM\fR,
-\fB$SHLINKFLAGS\fR\&.
-.sp
-Uses:
-\fB$LDMODULECOMSTR\fR,
-\fB$LINKCOMSTR\fR,
-\fB$SHLINKCOMSTR\fR\&.
-.RE
-.PP
-linkloc
-.RS 4
-Sets construction variables for the
-LinkLoc
-linker for the Phar Lap ETS embedded operating system\&.
-.sp
-Sets:
-\fB$LIBDIRPREFIX\fR,
-\fB$LIBDIRSUFFIX\fR,
-\fB$LIBLINKPREFIX\fR,
-\fB$LIBLINKSUFFIX\fR,
-\fB$LINK\fR,
-\fB$LINKCOM\fR,
-\fB$LINKFLAGS\fR,
-\fB$SHLINK\fR,
-\fB$SHLINKCOM\fR,
-\fB$SHLINKFLAGS\fR\&.
-.sp
-Uses:
-\fB$LINKCOMSTR\fR,
-\fB$SHLINKCOMSTR\fR\&.
-.RE
-.PP
-m4
-.RS 4
-Sets construction variables for the
-m4
-macro processor\&.
-.sp
-Sets:
-\fB$M4\fR,
-\fB$M4COM\fR,
-\fB$M4FLAGS\fR\&.
-.sp
-Uses:
-\fB$M4COMSTR\fR\&.
-.RE
-.PP
-masm
-.RS 4
-Sets construction variables for the Microsoft assembler\&.
-.sp
-Sets:
-\fB$AS\fR,
-\fB$ASCOM\fR,
-\fB$ASFLAGS\fR,
-\fB$ASPPCOM\fR,
-\fB$ASPPFLAGS\fR\&.
-.sp
-Uses:
-\fB$ASCOMSTR\fR,
-\fB$ASPPCOMSTR\fR,
-\fB$CPPFLAGS\fR,
-\fB$_CPPDEFFLAGS\fR,
-\fB$_CPPINCFLAGS\fR\&.
-.RE
-.PP
-midl
-.RS 4
-Sets construction variables for the Microsoft IDL compiler\&.
-.sp
-Sets:
-\fB$MIDL\fR,
-\fB$MIDLCOM\fR,
-\fB$MIDLFLAGS\fR\&.
-.sp
-Uses:
-\fB$MIDLCOMSTR\fR\&.
-.RE
-.PP
-mingw
-.RS 4
-Sets construction variables for MinGW (Minimal Gnu on Windows)\&.
-.sp
-Sets:
-\fB$AS\fR,
-\fB$CC\fR,
-\fB$CXX\fR,
-\fB$LDMODULECOM\fR,
-\fB$LIBPREFIX\fR,
-\fB$LIBSUFFIX\fR,
-\fB$OBJSUFFIX\fR,
-\fB$RC\fR,
-\fB$RCCOM\fR,
-\fB$RCFLAGS\fR,
-\fB$RCINCFLAGS\fR,
-\fB$RCINCPREFIX\fR,
-\fB$RCINCSUFFIX\fR,
-\fB$SHCCFLAGS\fR,
-\fB$SHCXXFLAGS\fR,
-\fB$SHLINKCOM\fR,
-\fB$SHLINKFLAGS\fR,
-\fB$SHOBJSUFFIX\fR,
-\fB$WINDOWSDEFPREFIX\fR,
-\fB$WINDOWSDEFSUFFIX\fR\&.
-.sp
-Uses:
-\fB$RCCOMSTR\fR,
-\fB$SHLINKCOMSTR\fR\&.
-.RE
-.PP
-msgfmt
-.RS 4
-This scons tool is a part of scons
-gettext
-toolset\&. It provides scons interface to
-\fBmsgfmt(1)\fR
-command, which generates binary message catalog (MO) from a textual translation description (PO)\&.
-.sp
-Sets:
-\fB$MOSUFFIX\fR,
-\fB$MSGFMT\fR,
-\fB$MSGFMTCOM\fR,
-\fB$MSGFMTCOMSTR\fR,
-\fB$MSGFMTFLAGS\fR,
-\fB$POSUFFIX\fR\&.
-.sp
-Uses:
-\fB$LINGUAS_FILE\fR\&.
-.RE
-.PP
-msginit
-.RS 4
-This scons tool is a part of scons
-gettext
-toolset\&. It provides scons interface to
-\fBmsginit(1)\fR
-program, which creates new
-PO
-file, initializing the meta information with values from user\*(Aqs environment (or options)\&.
-.sp
-Sets:
-\fB$MSGINIT\fR,
-\fB$MSGINITCOM\fR,
-\fB$MSGINITCOMSTR\fR,
-\fB$MSGINITFLAGS\fR,
-\fB$POAUTOINIT\fR,
-\fB$POCREATE_ALIAS\fR,
-\fB$POSUFFIX\fR,
-\fB$POTSUFFIX\fR,
-\fB$_MSGINITLOCALE\fR\&.
-.sp
-Uses:
-\fB$LINGUAS_FILE\fR,
-\fB$POAUTOINIT\fR,
-\fB$POTDOMAIN\fR\&.
-.RE
-.PP
-msgmerge
-.RS 4
-This scons tool is a part of scons
-gettext
-toolset\&. It provides scons interface to
-\fBmsgmerge(1)\fR
-command, which merges two Uniform style
-\&.po
-files together\&.
-.sp
-Sets:
-\fB$MSGMERGE\fR,
-\fB$MSGMERGECOM\fR,
-\fB$MSGMERGECOMSTR\fR,
-\fB$MSGMERGEFLAGS\fR,
-\fB$POSUFFIX\fR,
-\fB$POTSUFFIX\fR,
-\fB$POUPDATE_ALIAS\fR\&.
-.sp
-Uses:
-\fB$LINGUAS_FILE\fR,
-\fB$POAUTOINIT\fR,
-\fB$POTDOMAIN\fR\&.
-.RE
-.PP
-mslib
-.RS 4
-Sets construction variables for the Microsoft
-mslib
-library archiver\&.
-.sp
-Sets:
-\fB$AR\fR,
-\fB$ARCOM\fR,
-\fB$ARFLAGS\fR,
-\fB$LIBPREFIX\fR,
-\fB$LIBSUFFIX\fR\&.
-.sp
-Uses:
-\fB$ARCOMSTR\fR\&.
-.RE
-.PP
-mslink
-.RS 4
-Sets construction variables for the Microsoft linker\&.
-.sp
-Sets:
-\fB$LDMODULE\fR,
-\fB$LDMODULECOM\fR,
-\fB$LDMODULEFLAGS\fR,
-\fB$LDMODULEPREFIX\fR,
-\fB$LDMODULESUFFIX\fR,
-\fB$LIBDIRPREFIX\fR,
-\fB$LIBDIRSUFFIX\fR,
-\fB$LIBLINKPREFIX\fR,
-\fB$LIBLINKSUFFIX\fR,
-\fB$LINK\fR,
-\fB$LINKCOM\fR,
-\fB$LINKFLAGS\fR,
-\fB$REGSVR\fR,
-\fB$REGSVRCOM\fR,
-\fB$REGSVRFLAGS\fR,
-\fB$SHLINK\fR,
-\fB$SHLINKCOM\fR,
-\fB$SHLINKFLAGS\fR,
-\fB$WIN32DEFPREFIX\fR,
-\fB$WIN32DEFSUFFIX\fR,
-\fB$WIN32EXPPREFIX\fR,
-\fB$WIN32EXPSUFFIX\fR,
-\fB$WINDOWSDEFPREFIX\fR,
-\fB$WINDOWSDEFSUFFIX\fR,
-\fB$WINDOWSEXPPREFIX\fR,
-\fB$WINDOWSEXPSUFFIX\fR,
-\fB$WINDOWSPROGMANIFESTPREFIX\fR,
-\fB$WINDOWSPROGMANIFESTSUFFIX\fR,
-\fB$WINDOWSSHLIBMANIFESTPREFIX\fR,
-\fB$WINDOWSSHLIBMANIFESTSUFFIX\fR,
-\fB$WINDOWS_INSERT_DEF\fR\&.
-.sp
-Uses:
-\fB$LDMODULECOMSTR\fR,
-\fB$LINKCOMSTR\fR,
-\fB$REGSVRCOMSTR\fR,
-\fB$SHLINKCOMSTR\fR\&.
-.RE
-.PP
-mssdk
-.RS 4
-Sets variables for Microsoft Platform SDK and/or Windows SDK\&. Note that unlike most other Tool modules, mssdk does not set construction variables, but sets the
-\fIenvironment variables\fR
-in the environment
-SCons
-uses to execute the Microsoft toolchain:
-%INCLUDE%,
-%LIB%,
-%LIBPATH%
-and
-%PATH%\&.
-.sp
-Uses:
-\fB$MSSDK_DIR\fR,
-\fB$MSSDK_VERSION\fR,
-\fB$MSVS_VERSION\fR\&.
-.RE
-.PP
-msvc
-.RS 4
-Sets construction variables for the Microsoft Visual C/C++ compiler\&.
-.sp
-Sets:
-\fB$BUILDERS\fR,
-\fB$CC\fR,
-\fB$CCCOM\fR,
-\fB$CCFLAGS\fR,
-\fB$CCPCHFLAGS\fR,
-\fB$CCPDBFLAGS\fR,
-\fB$CFILESUFFIX\fR,
-\fB$CFLAGS\fR,
-\fB$CPPDEFPREFIX\fR,
-\fB$CPPDEFSUFFIX\fR,
-\fB$CXX\fR,
-\fB$CXXCOM\fR,
-\fB$CXXFILESUFFIX\fR,
-\fB$CXXFLAGS\fR,
-\fB$INCPREFIX\fR,
-\fB$INCSUFFIX\fR,
-\fB$OBJPREFIX\fR,
-\fB$OBJSUFFIX\fR,
-\fB$PCHCOM\fR,
-\fB$PCHPDBFLAGS\fR,
-\fB$RC\fR,
-\fB$RCCOM\fR,
-\fB$RCFLAGS\fR,
-\fB$SHCC\fR,
-\fB$SHCCCOM\fR,
-\fB$SHCCFLAGS\fR,
-\fB$SHCFLAGS\fR,
-\fB$SHCXX\fR,
-\fB$SHCXXCOM\fR,
-\fB$SHCXXFLAGS\fR,
-\fB$SHOBJPREFIX\fR,
-\fB$SHOBJSUFFIX\fR\&.
-.sp
-Uses:
-\fB$CCCOMSTR\fR,
-\fB$CXXCOMSTR\fR,
-\fB$PCH\fR,
-\fB$PCHSTOP\fR,
-\fB$PDB\fR,
-\fB$SHCCCOMSTR\fR,
-\fB$SHCXXCOMSTR\fR\&.
-.RE
-.PP
-msvs
-.RS 4
-Sets construction variables for Microsoft Visual Studio\&.
-.sp
-Sets:
-\fB$MSVSBUILDCOM\fR,
-\fB$MSVSCLEANCOM\fR,
-\fB$MSVSENCODING\fR,
-\fB$MSVSPROJECTCOM\fR,
-\fB$MSVSREBUILDCOM\fR,
-\fB$MSVSSCONS\fR,
-\fB$MSVSSCONSCOM\fR,
-\fB$MSVSSCONSCRIPT\fR,
-\fB$MSVSSCONSFLAGS\fR,
-\fB$MSVSSOLUTIONCOM\fR\&.
-.RE
-.PP
-mwcc
-.RS 4
-Sets construction variables for the Metrowerks CodeWarrior compiler\&.
-.sp
-Sets:
-\fB$CC\fR,
-\fB$CCCOM\fR,
-\fB$CFILESUFFIX\fR,
-\fB$CPPDEFPREFIX\fR,
-\fB$CPPDEFSUFFIX\fR,
-\fB$CXX\fR,
-\fB$CXXCOM\fR,
-\fB$CXXFILESUFFIX\fR,
-\fB$INCPREFIX\fR,
-\fB$INCSUFFIX\fR,
-\fB$MWCW_VERSION\fR,
-\fB$MWCW_VERSIONS\fR,
-\fB$SHCC\fR,
-\fB$SHCCCOM\fR,
-\fB$SHCCFLAGS\fR,
-\fB$SHCFLAGS\fR,
-\fB$SHCXX\fR,
-\fB$SHCXXCOM\fR,
-\fB$SHCXXFLAGS\fR\&.
-.sp
-Uses:
-\fB$CCCOMSTR\fR,
-\fB$CXXCOMSTR\fR,
-\fB$SHCCCOMSTR\fR,
-\fB$SHCXXCOMSTR\fR\&.
-.RE
-.PP
-mwld
-.RS 4
-Sets construction variables for the Metrowerks CodeWarrior linker\&.
-.sp
-Sets:
-\fB$AR\fR,
-\fB$ARCOM\fR,
-\fB$LIBDIRPREFIX\fR,
-\fB$LIBDIRSUFFIX\fR,
-\fB$LIBLINKPREFIX\fR,
-\fB$LIBLINKSUFFIX\fR,
-\fB$LINK\fR,
-\fB$LINKCOM\fR,
-\fB$SHLINK\fR,
-\fB$SHLINKCOM\fR,
-\fB$SHLINKFLAGS\fR\&.
-.RE
-.PP
-nasm
-.RS 4
-Sets construction variables for the
-nasm
-Netwide Assembler\&.
-.sp
-Sets:
-\fB$AS\fR,
-\fB$ASCOM\fR,
-\fB$ASFLAGS\fR,
-\fB$ASPPCOM\fR,
-\fB$ASPPFLAGS\fR\&.
-.sp
-Uses:
-\fB$ASCOMSTR\fR,
-\fB$ASPPCOMSTR\fR\&.
-.RE
-.PP
-packaging
-.RS 4
-A framework for building binary and source packages\&.
-.RE
-.PP
-Packaging
-.RS 4
-Sets construction variables for the
-\fBPackage\fR
-Builder\&.
-.RE
-.PP
-pdf
-.RS 4
-Sets construction variables for the Portable Document Format builder\&.
-.sp
-Sets:
-\fB$PDFPREFIX\fR,
-\fB$PDFSUFFIX\fR\&.
-.RE
-.PP
-pdflatex
-.RS 4
-Sets construction variables for the
-pdflatex
-utility\&.
-.sp
-Sets:
-\fB$LATEXRETRIES\fR,
-\fB$PDFLATEX\fR,
-\fB$PDFLATEXCOM\fR,
-\fB$PDFLATEXFLAGS\fR\&.
-.sp
-Uses:
-\fB$PDFLATEXCOMSTR\fR\&.
-.RE
-.PP
-pdftex
-.RS 4
-Sets construction variables for the
-pdftex
-utility\&.
-.sp
-Sets:
-\fB$LATEXRETRIES\fR,
-\fB$PDFLATEX\fR,
-\fB$PDFLATEXCOM\fR,
-\fB$PDFLATEXFLAGS\fR,
-\fB$PDFTEX\fR,
-\fB$PDFTEXCOM\fR,
-\fB$PDFTEXFLAGS\fR\&.
-.sp
-Uses:
-\fB$PDFLATEXCOMSTR\fR,
-\fB$PDFTEXCOMSTR\fR\&.
-.RE
-.PP
-Perforce
-.RS 4
-Sets construction variables for interacting with the Perforce source code management system\&.
-.sp
-Sets:
-\fB$P4\fR,
-\fB$P4COM\fR,
-\fB$P4FLAGS\fR\&.
-.sp
-Uses:
-\fB$P4COMSTR\fR\&.
-.RE
-.PP
-qt
-.RS 4
-Sets construction variables for building Qt applications\&.
-.sp
-Sets:
-\fB$QTDIR\fR,
-\fB$QT_AUTOSCAN\fR,
-\fB$QT_BINPATH\fR,
-\fB$QT_CPPPATH\fR,
-\fB$QT_LIB\fR,
-\fB$QT_LIBPATH\fR,
-\fB$QT_MOC\fR,
-\fB$QT_MOCCXXPREFIX\fR,
-\fB$QT_MOCCXXSUFFIX\fR,
-\fB$QT_MOCFROMCXXCOM\fR,
-\fB$QT_MOCFROMCXXFLAGS\fR,
-\fB$QT_MOCFROMHCOM\fR,
-\fB$QT_MOCFROMHFLAGS\fR,
-\fB$QT_MOCHPREFIX\fR,
-\fB$QT_MOCHSUFFIX\fR,
-\fB$QT_UIC\fR,
-\fB$QT_UICCOM\fR,
-\fB$QT_UICDECLFLAGS\fR,
-\fB$QT_UICDECLPREFIX\fR,
-\fB$QT_UICDECLSUFFIX\fR,
-\fB$QT_UICIMPLFLAGS\fR,
-\fB$QT_UICIMPLPREFIX\fR,
-\fB$QT_UICIMPLSUFFIX\fR,
-\fB$QT_UISUFFIX\fR\&.
-.RE
-.PP
-RCS
-.RS 4
-Sets construction variables for the interaction with the Revision Control System\&.
-.sp
-Sets:
-\fB$RCS\fR,
-\fB$RCS_CO\fR,
-\fB$RCS_COCOM\fR,
-\fB$RCS_COFLAGS\fR\&.
-.sp
-Uses:
-\fB$RCS_COCOMSTR\fR\&.
-.RE
-.PP
-rmic
-.RS 4
-Sets construction variables for the
-rmic
-utility\&.
-.sp
-Sets:
-\fB$JAVACLASSSUFFIX\fR,
-\fB$RMIC\fR,
-\fB$RMICCOM\fR,
-\fB$RMICFLAGS\fR\&.
-.sp
-Uses:
-\fB$RMICCOMSTR\fR\&.
-.RE
-.PP
-rpcgen
-.RS 4
-Sets construction variables for building with RPCGEN\&.
-.sp
-Sets:
-\fB$RPCGEN\fR,
-\fB$RPCGENCLIENTFLAGS\fR,
-\fB$RPCGENFLAGS\fR,
-\fB$RPCGENHEADERFLAGS\fR,
-\fB$RPCGENSERVICEFLAGS\fR,
-\fB$RPCGENXDRFLAGS\fR\&.
-.RE
-.PP
-SCCS
-.RS 4
-Sets construction variables for interacting with the Source Code Control System\&.
-.sp
-Sets:
-\fB$SCCS\fR,
-\fB$SCCSCOM\fR,
-\fB$SCCSFLAGS\fR,
-\fB$SCCSGETFLAGS\fR\&.
-.sp
-Uses:
-\fB$SCCSCOMSTR\fR\&.
-.RE
-.PP
-sgiar
-.RS 4
-Sets construction variables for the SGI library archiver\&.
-.sp
-Sets:
-\fB$AR\fR,
-\fB$ARCOMSTR\fR,
-\fB$ARFLAGS\fR,
-\fB$LIBPREFIX\fR,
-\fB$LIBSUFFIX\fR,
-\fB$SHLINK\fR,
-\fB$SHLINKFLAGS\fR\&.
-.sp
-Uses:
-\fB$ARCOMSTR\fR,
-\fB$SHLINKCOMSTR\fR\&.
-.RE
-.PP
-sgic++
-.RS 4
-Sets construction variables for the SGI C++ compiler\&.
-.sp
-Sets:
-\fB$CXX\fR,
-\fB$CXXFLAGS\fR,
-\fB$SHCXX\fR,
-\fB$SHOBJSUFFIX\fR\&.
-.RE
-.PP
-sgicc
-.RS 4
-Sets construction variables for the SGI C compiler\&.
-.sp
-Sets:
-\fB$CXX\fR,
-\fB$SHOBJSUFFIX\fR\&.
-.RE
-.PP
-sgilink
-.RS 4
-Sets construction variables for the SGI linker\&.
-.sp
-Sets:
-\fB$LINK\fR,
-\fB$RPATHPREFIX\fR,
-\fB$RPATHSUFFIX\fR,
-\fB$SHLINKFLAGS\fR\&.
-.RE
-.PP
-sunar
-.RS 4
-Sets construction variables for the Sun library archiver\&.
-.sp
-Sets:
-\fB$AR\fR,
-\fB$ARCOM\fR,
-\fB$ARFLAGS\fR,
-\fB$LIBPREFIX\fR,
-\fB$LIBSUFFIX\fR,
-\fB$SHLINK\fR,
-\fB$SHLINKCOM\fR,
-\fB$SHLINKFLAGS\fR\&.
-.sp
-Uses:
-\fB$ARCOMSTR\fR,
-\fB$SHLINKCOMSTR\fR\&.
-.RE
-.PP
-sunc++
-.RS 4
-Sets construction variables for the Sun C++ compiler\&.
-.sp
-Sets:
-\fB$CXX\fR,
-\fB$CXXVERSION\fR,
-\fB$SHCXX\fR,
-\fB$SHCXXFLAGS\fR,
-\fB$SHOBJPREFIX\fR,
-\fB$SHOBJSUFFIX\fR\&.
-.RE
-.PP
-suncc
-.RS 4
-Sets construction variables for the Sun C compiler\&.
-.sp
-Sets:
-\fB$CXX\fR,
-\fB$SHCCFLAGS\fR,
-\fB$SHOBJPREFIX\fR,
-\fB$SHOBJSUFFIX\fR\&.
-.RE
-.PP
-sunf77
-.RS 4
-Set construction variables for the Sun
-f77
-Fortran compiler\&.
-.sp
-Sets:
-\fB$F77\fR,
-\fB$FORTRAN\fR,
-\fB$SHF77\fR,
-\fB$SHF77FLAGS\fR,
-\fB$SHFORTRAN\fR,
-\fB$SHFORTRANFLAGS\fR\&.
-.RE
-.PP
-sunf90
-.RS 4
-Set construction variables for the Sun
-f90
-Fortran compiler\&.
-.sp
-Sets:
-\fB$F90\fR,
-\fB$FORTRAN\fR,
-\fB$SHF90\fR,
-\fB$SHF90FLAGS\fR,
-\fB$SHFORTRAN\fR,
-\fB$SHFORTRANFLAGS\fR\&.
-.RE
-.PP
-sunf95
-.RS 4
-Set construction variables for the Sun
-f95
-Fortran compiler\&.
-.sp
-Sets:
-\fB$F95\fR,
-\fB$FORTRAN\fR,
-\fB$SHF95\fR,
-\fB$SHF95FLAGS\fR,
-\fB$SHFORTRAN\fR,
-\fB$SHFORTRANFLAGS\fR\&.
-.RE
-.PP
-sunlink
-.RS 4
-Sets construction variables for the Sun linker\&.
-.sp
-Sets:
-\fB$RPATHPREFIX\fR,
-\fB$RPATHSUFFIX\fR,
-\fB$SHLINKFLAGS\fR\&.
-.RE
-.PP
-swig
-.RS 4
-Sets construction variables for the SWIG interface generator\&.
-.sp
-Sets:
-\fB$SWIG\fR,
-\fB$SWIGCFILESUFFIX\fR,
-\fB$SWIGCOM\fR,
-\fB$SWIGCXXFILESUFFIX\fR,
-\fB$SWIGDIRECTORSUFFIX\fR,
-\fB$SWIGFLAGS\fR,
-\fB$SWIGINCPREFIX\fR,
-\fB$SWIGINCSUFFIX\fR,
-\fB$SWIGPATH\fR,
-\fB$SWIGVERSION\fR,
-\fB$_SWIGINCFLAGS\fR\&.
-.sp
-Uses:
-\fB$SWIGCOMSTR\fR\&.
-.RE
-.PP
-tar
-.RS 4
-Sets construction variables for the
-tar
-archiver\&.
-.sp
-Sets:
-\fB$TAR\fR,
-\fB$TARCOM\fR,
-\fB$TARFLAGS\fR,
-\fB$TARSUFFIX\fR\&.
-.sp
-Uses:
-\fB$TARCOMSTR\fR\&.
-.RE
-.PP
-tex
-.RS 4
-Sets construction variables for the TeX formatter and typesetter\&.
-.sp
-Sets:
-\fB$BIBTEX\fR,
-\fB$BIBTEXCOM\fR,
-\fB$BIBTEXFLAGS\fR,
-\fB$LATEX\fR,
-\fB$LATEXCOM\fR,
-\fB$LATEXFLAGS\fR,
-\fB$MAKEINDEX\fR,
-\fB$MAKEINDEXCOM\fR,
-\fB$MAKEINDEXFLAGS\fR,
-\fB$TEX\fR,
-\fB$TEXCOM\fR,
-\fB$TEXFLAGS\fR\&.
-.sp
-Uses:
-\fB$BIBTEXCOMSTR\fR,
-\fB$LATEXCOMSTR\fR,
-\fB$MAKEINDEXCOMSTR\fR,
-\fB$TEXCOMSTR\fR\&.
-.RE
-.PP
-textfile
-.RS 4
-Set construction variables for the
-\fBTextfile\fR
-and
-\fBSubstfile\fR
-builders\&.
-.sp
-Sets:
-\fB$LINESEPARATOR\fR,
-\fB$SUBSTFILEPREFIX\fR,
-\fB$SUBSTFILESUFFIX\fR,
-\fB$TEXTFILEPREFIX\fR,
-\fB$TEXTFILESUFFIX\fR\&.
-.sp
-Uses:
-\fB$SUBST_DICT\fR\&.
-.RE
-.PP
-tlib
-.RS 4
-Sets construction variables for the Borlan
-tib
-library archiver\&.
-.sp
-Sets:
-\fB$AR\fR,
-\fB$ARCOM\fR,
-\fB$ARFLAGS\fR,
-\fB$LIBPREFIX\fR,
-\fB$LIBSUFFIX\fR\&.
-.sp
-Uses:
-\fB$ARCOMSTR\fR\&.
-.RE
-.PP
-xgettext
-.RS 4
-This scons tool is a part of scons
-gettext
-toolset\&. It provides scons interface to
-\fBxgettext(1)\fR
-program, which extracts internationalized messages from source code\&. The tool provides
-\fBPOTUpdate\fR
-builder to make
-PO
-\fITemplate\fR
-files\&.
-.sp
-Sets:
-\fB$POTSUFFIX\fR,
-\fB$POTUPDATE_ALIAS\fR,
-\fB$XGETTEXTCOM\fR,
-\fB$XGETTEXTCOMSTR\fR,
-\fB$XGETTEXTFLAGS\fR,
-\fB$XGETTEXTFROM\fR,
-\fB$XGETTEXTFROMPREFIX\fR,
-\fB$XGETTEXTFROMSUFFIX\fR,
-\fB$XGETTEXTPATH\fR,
-\fB$XGETTEXTPATHPREFIX\fR,
-\fB$XGETTEXTPATHSUFFIX\fR,
-\fB$_XGETTEXTDOMAIN\fR,
-\fB$_XGETTEXTFROMFLAGS\fR,
-\fB$_XGETTEXTPATHFLAGS\fR\&.
-.sp
-Uses:
-\fB$POTDOMAIN\fR\&.
-.RE
-.PP
-yacc
-.RS 4
-Sets construction variables for the
-yacc
-parse generator\&.
-.sp
-Sets:
-\fB$YACC\fR,
-\fB$YACCCOM\fR,
-\fB$YACCFLAGS\fR,
-\fB$YACCHFILESUFFIX\fR,
-\fB$YACCHXXFILESUFFIX\fR,
-\fB$YACCVCGFILESUFFIX\fR\&.
-.sp
-Uses:
-\fB$YACCCOMSTR\fR\&.
-.RE
-.PP
-zip
-.RS 4
-Sets construction variables for the
-zip
-archiver\&.
-.sp
-Sets:
-\fB$ZIP\fR,
-\fB$ZIPCOM\fR,
-\fB$ZIPCOMPRESSION\fR,
-\fB$ZIPFLAGS\fR,
-\fB$ZIPSUFFIX\fR\&.
-.sp
-Uses:
-\fB$ZIPCOMSTR\fR\&.
-.RE
-.PP
-Additionally, there is a "tool" named
-\fBdefault\fR
-which configures the environment with a default set of tools for the current platform\&.
-.PP
-On posix and cygwin platforms the GNU tools (e\&.g\&. gcc) are preferred by SCons, on Windows the Microsoft tools (e\&.g\&. msvc) followed by MinGW are preferred by SCons, and in OS/2 the IBM tools (e\&.g\&. icc) are preferred by SCons\&.
-.SS "Builder Methods"
-.PP
-Build rules are specified by calling a construction environment\*(Aqs builder methods\&. The arguments to the builder methods are
-\fBtarget\fR
-(a list of targets to be built, usually file names) and
-\fBsource\fR
-(a list of sources to be built, usually file names)\&.
-.PP
-Because long lists of file names can lead to a lot of quoting,
-\fBscons\fR
-supplies a
-\fBSplit()\fR
-global function and a same\-named environment method that split a single string into a list, separated on strings of white\-space characters\&. (These are similar to the split() member function of Python strings but work even if the input isn\*(Aqt a string\&.)
-.PP
-Like all Python arguments, the target and source arguments to a builder method can be specified either with or without the "target" and "source" keywords\&. When the keywords are omitted, the target is first, followed by the source\&. The following are equivalent examples of calling the Program builder method:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-env\&.Program(\*(Aqbar\*(Aq, [\*(Aqbar\&.c\*(Aq, \*(Aqfoo\&.c\*(Aq])
-env\&.Program(\*(Aqbar\*(Aq, Split(\*(Aqbar\&.c foo\&.c\*(Aq))
-env\&.Program(\*(Aqbar\*(Aq, env\&.Split(\*(Aqbar\&.c foo\&.c\*(Aq))
-env\&.Program(source = [\*(Aqbar\&.c\*(Aq, \*(Aqfoo\&.c\*(Aq], target = \*(Aqbar\*(Aq)
-env\&.Program(target = \*(Aqbar\*(Aq, Split(\*(Aqbar\&.c foo\&.c\*(Aq))
-env\&.Program(target = \*(Aqbar\*(Aq, env\&.Split(\*(Aqbar\&.c foo\&.c\*(Aq))
-env\&.Program(\*(Aqbar\*(Aq, source = \*(Aqbar\&.c foo\&.c\*(Aq\&.split())
-.fi
-.if n \{\
-.RE
-.\}
-.PP
-Target and source file names that are not absolute path names (that is, do not begin with
-\fB/\fR
-on POSIX systems or
-\fB\efR on Windows systems, with or without an optional drive letter) are interpreted relative to the directory containing the SConscript\fR
-file being read\&. An initial
-\fB#\fR
-(hash mark) on a path name means that the rest of the file name is interpreted relative to the directory containing the top\-level
-\fBSConstruct\fR
-file, even if the
-\fB#\fR
-is followed by a directory separator character (slash or backslash)\&.
-.PP
-Examples:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-# The comments describing the targets that will be built
-# assume these calls are in a SConscript file in the
-# a subdirectory named "subdir"\&.
-
-# Builds the program "subdir/foo" from "subdir/foo\&.c":
-env\&.Program(\*(Aqfoo\*(Aq, \*(Aqfoo\&.c\*(Aq)
-
-# Builds the program "/tmp/bar" from "subdir/bar\&.c":
-env\&.Program(\*(Aq/tmp/bar\*(Aq, \*(Aqbar\&.c\*(Aq)
-
-# An initial \*(Aq#\*(Aq or \*(Aq#/\*(Aq are equivalent; the following
-# calls build the programs "foo" and "bar" (in the
-# top\-level SConstruct directory) from "subdir/foo\&.c" and
-# "subdir/bar\&.c", respectively:
-env\&.Program(\*(Aq#foo\*(Aq, \*(Aqfoo\&.c\*(Aq)
-env\&.Program(\*(Aq#/bar\*(Aq, \*(Aqbar\&.c\*(Aq)
-
-# Builds the program "other/foo" (relative to the top\-level
-# SConstruct directory) from "subdir/foo\&.c":
-env\&.Program(\*(Aq#other/foo\*(Aq, \*(Aqfoo\&.c\*(Aq)
-.fi
-.if n \{\
-.RE
-.\}
-.PP
-When the target shares the same base name as the source and only the suffix varies, and if the builder method has a suffix defined for the target file type, then the target argument may be omitted completely, and
-\fBscons\fR
-will deduce the target file name from the source file name\&. The following examples all build the executable program
-\fBbar\fR
-(on POSIX systems) or
-\fBbar\&.exe\fR
-(on Windows systems) from the bar\&.c source file:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-env\&.Program(target = \*(Aqbar\*(Aq, source = \*(Aqbar\&.c\*(Aq)
-env\&.Program(\*(Aqbar\*(Aq, source = \*(Aqbar\&.c\*(Aq)
-env\&.Program(source = \*(Aqbar\&.c\*(Aq)
-env\&.Program(\*(Aqbar\&.c\*(Aq)
-.fi
-.if n \{\
-.RE
-.\}
-.PP
-As a convenience, a
-\fBsrcdir\fR
-keyword argument may be specified when calling a Builder\&. When specified, all source file strings that are not absolute paths will be interpreted relative to the specified
-\fBsrcdir\fR\&. The following example will build the
-\fBbuild/prog\fR
-(or
-\fBbuild/prog\&.exe\fR
-on Windows) program from the files
-\fBsrc/f1\&.c\fR
-and
-\fBsrc/f2\&.c\fR:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-env\&.Program(\*(Aqbuild/prog\*(Aq, [\*(Aqf1\&.c\*(Aq, \*(Aqf2\&.c\*(Aq], srcdir=\*(Aqsrc\*(Aq)
-.fi
-.if n \{\
-.RE
-.\}
-.PP
-It is possible to override or add construction variables when calling a builder method by passing additional keyword arguments\&. These overridden or added variables will only be in effect when building the target, so they will not affect other parts of the build\&. For example, if you want to add additional libraries for just one program:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-env\&.Program(\*(Aqhello\*(Aq, \*(Aqhello\&.c\*(Aq, LIBS=[\*(Aqgl\*(Aq, \*(Aqglut\*(Aq])
-.fi
-.if n \{\
-.RE
-.\}
-.PP
-or generate a shared library with a non\-standard suffix:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-env\&.SharedLibrary(\*(Aqword\*(Aq, \*(Aqword\&.cpp\*(Aq,
- SHLIBSUFFIX=\*(Aq\&.ocx\*(Aq,
- LIBSUFFIXES=[\*(Aq\&.ocx\*(Aq])
-.fi
-.if n \{\
-.RE
-.\}
-.PP
-(Note that both the $SHLIBSUFFIX and $LIBSUFFIXES variables must be set if you want SCons to search automatically for dependencies on the non\-standard library names; see the descriptions of these variables, below, for more information\&.)
-.PP
-It is also possible to use the
-\fIparse_flags\fR
-keyword argument in an override:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-env = Program(\*(Aqhello\*(Aq, \*(Aqhello\&.c\*(Aq, parse_flags = \*(Aq\-Iinclude \-DEBUG \-lm\*(Aq)
-.fi
-.if n \{\
-.RE
-.\}
-.PP
-This example adds \*(Aqinclude\*(Aq to
-\fBCPPPATH\fR, \*(AqEBUG\*(Aq to
-\fBCPPDEFINES\fR, and \*(Aqm\*(Aq to
-\fBLIBS\fR\&.
-.PP
-Although the builder methods defined by
-\fBscons\fR
-are, in fact, methods of a construction environment object, they may also be called without an explicit environment:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-Program(\*(Aqhello\*(Aq, \*(Aqhello\&.c\*(Aq)
-SharedLibrary(\*(Aqword\*(Aq, \*(Aqword\&.cpp\*(Aq)
-.fi
-.if n \{\
-.RE
-.\}
-.PP
-In this case, the methods are called internally using a default construction environment that consists of the tools and values that
-\fBscons\fR
-has determined are appropriate for the local system\&.
-.PP
-Builder methods that can be called without an explicit environment may be called from custom Python modules that you import into an SConscript file by adding the following to the Python module:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-from SCons\&.Script import *
-.fi
-.if n \{\
-.RE
-.\}
-.PP
-All builder methods return a list\-like object containing Nodes that represent the target or targets that will be built\&. A
-\fINode\fR
-is an internal SCons object which represents build targets or sources\&.
-.PP
-The returned Node\-list object can be passed to other builder methods as source(s) or passed to any SCons function or method where a filename would normally be accepted\&. For example, if it were necessary to add a specific
-\fB\-D\fR
-flag when compiling one specific object file:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-bar_obj_list = env\&.StaticObject(\*(Aqbar\&.c\*(Aq, CPPDEFINES=\*(Aq\-DBAR\*(Aq)
-env\&.Program(source = [\*(Aqfoo\&.c\*(Aq, bar_obj_list, \*(Aqmain\&.c\*(Aq])
-.fi
-.if n \{\
-.RE
-.\}
-.PP
-Using a Node in this way makes for a more portable build by avoiding having to specify a platform\-specific object suffix when calling the Program() builder method\&.
-.PP
-Note that Builder calls will automatically "flatten" the source and target file lists, so it\*(Aqs all right to have the bar_obj list return by the StaticObject() call in the middle of the source file list\&. If you need to manipulate a list of lists returned by Builders directly using Python, you can either build the list by hand:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-foo = Object(\*(Aqfoo\&.c\*(Aq)
-bar = Object(\*(Aqbar\&.c\*(Aq)
-objects = [\*(Aqbegin\&.o\*(Aq] + foo + [\*(Aqmiddle\&.o\*(Aq] + bar + [\*(Aqend\&.o\*(Aq]
-for object in objects:
- print str(object)
-.fi
-.if n \{\
-.RE
-.\}
-.PP
-Or you can use the
-\fBFlatten\fR() function supplied by scons to create a list containing just the Nodes, which may be more convenient:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-foo = Object(\*(Aqfoo\&.c\*(Aq)
-bar = Object(\*(Aqbar\&.c\*(Aq)
-objects = Flatten([\*(Aqbegin\&.o\*(Aq, foo, \*(Aqmiddle\&.o\*(Aq, bar, \*(Aqend\&.o\*(Aq])
-for object in objects:
- print str(object)
-.fi
-.if n \{\
-.RE
-.\}
-.PP
-Note also that because Builder calls return a list\-like object, not an actual Python list, you should
-\fInot\fR
-use the Python
-\fB+=\fR
-operator to append Builder results to a Python list\&. Because the list and the object are different types, Python will not update the original list in place, but will instead create a new Node\-list object containing the concatenation of the list elements and the Builder results\&. This will cause problems for any other Python variables in your SCons configuration that still hold on to a reference to the original list\&. Instead, use the Python
-\fB\&.extend()\fR
-method to make sure the list is updated in\-place\&. Example:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-object_files = []
-
-# Do NOT use += as follows:
-#
-# object_files += Object(\*(Aqbar\&.c\*(Aq)
-#
-# It will not update the object_files list in place\&.
-#
-# Instead, use the \&.extend() method:
-object_files\&.extend(Object(\*(Aqbar\&.c\*(Aq))
-
-.fi
-.if n \{\
-.RE
-.\}
-.PP
-The path name for a Node\*(Aqs file may be used by passing the Node to the Python\-builtin
-\fBstr()\fR
-function:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-bar_obj_list = env\&.StaticObject(\*(Aqbar\&.c\*(Aq, CPPDEFINES=\*(Aq\-DBAR\*(Aq)
-print "The path to bar_obj is:", str(bar_obj_list[0])
-.fi
-.if n \{\
-.RE
-.\}
-.PP
-Note again that because the Builder call returns a list, we have to access the first element in the list
-\fB(bar_obj_list[0])\fR
-to get at the Node that actually represents the object file\&.
-.PP
-Builder calls support a
-\fBchdir\fR
-keyword argument that specifies that the Builder\*(Aqs action(s) should be executed after changing directory\&. If the
-\fBchdir\fR
-argument is a string or a directory Node, scons will change to the specified directory\&. If the
-\fBchdir\fR
-is not a string or Node and is non\-zero, then scons will change to the target file\*(Aqs directory\&.
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-# scons will change to the "sub" subdirectory
-# before executing the "cp" command\&.
-env\&.Command(\*(Aqsub/dir/foo\&.out\*(Aq, \*(Aqsub/dir/foo\&.in\*(Aq,
- "cp dir/foo\&.in dir/foo\&.out",
- chdir=\*(Aqsub\*(Aq)
-
-# Because chdir is not a string, scons will change to the
-# target\*(Aqs directory ("sub/dir") before executing the
-# "cp" command\&.
-env\&.Command(\*(Aqsub/dir/foo\&.out\*(Aq, \*(Aqsub/dir/foo\&.in\*(Aq,
- "cp foo\&.in foo\&.out",
- chdir=1)
-.fi
-.if n \{\
-.RE
-.\}
-.PP
-Note that scons will
-\fInot\fR
-automatically modify its expansion of construction variables like
-\fB$TARGET\fR
-and
-\fB$SOURCE\fR
-when using the chdir keyword argument\-\-that is, the expanded file names will still be relative to the top\-level SConstruct directory, and consequently incorrect relative to the chdir directory\&. If you use the chdir keyword argument, you will typically need to supply a different command line using expansions like
-\fB${TARGET\&.file}\fR
-and
-\fB${SOURCE\&.file}\fR
-to use just the filename portion of the targets and source\&.
-.PP
-\fBscons\fR
-provides the following builder methods:
-.PP
-\fBCFile()\fR, \fBenv\&.CFile()\fR
-.RS 4
-Builds a C source file given a lex (\&.l) or yacc (\&.y) input file\&. The suffix specified by the
-\fB$CFILESUFFIX\fR
-construction variable (\&.c
-by default) is automatically added to the target if it is not already present\&. Example:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-# builds foo\&.c
-env\&.CFile(target = \*(Aqfoo\&.c\*(Aq, source = \*(Aqfoo\&.l\*(Aq)
-# builds bar\&.c
-env\&.CFile(target = \*(Aqbar\*(Aq, source = \*(Aqbar\&.y\*(Aq)
-.fi
-.if n \{\
-.RE
-.\}
-.RE
-.PP
-\fBCommand()\fR, \fBenv\&.Command()\fR
-.RS 4
-The
-\fBCommand\fR
-"Builder" is actually implemented as a function that looks like a Builder, but actually takes an additional argument of the action from which the Builder should be made\&. See the
-\fBCommand\fR
-function description for the calling syntax and details\&.
-.RE
-.PP
-\fBCXXFile()\fR, \fBenv\&.CXXFile()\fR
-.RS 4
-Builds a C++ source file given a lex (\&.ll) or yacc (\&.yy) input file\&. The suffix specified by the
-\fB$CXXFILESUFFIX\fR
-construction variable (\&.cc
-by default) is automatically added to the target if it is not already present\&. Example:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-# builds foo\&.cc
-env\&.CXXFile(target = \*(Aqfoo\&.cc\*(Aq, source = \*(Aqfoo\&.ll\*(Aq)
-# builds bar\&.cc
-env\&.CXXFile(target = \*(Aqbar\*(Aq, source = \*(Aqbar\&.yy\*(Aq)
-.fi
-.if n \{\
-.RE
-.\}
-.RE
-.PP
-\fBDocbookEpub()\fR, \fBenv\&.DocbookEpub()\fR
-.RS 4
-A pseudo\-Builder, providing a Docbook toolchain for EPUB output\&.
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-env = Environment(tools=[\*(Aqdocbook\*(Aq])
-env\&.DocbookEpub(\*(Aqmanual\&.epub\*(Aq, \*(Aqmanual\&.xml\*(Aq)
-.fi
-.if n \{\
-.RE
-.\}
-.sp
-or simply
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-env = Environment(tools=[\*(Aqdocbook\*(Aq])
-env\&.DocbookEpub(\*(Aqmanual\*(Aq)
-.fi
-.if n \{\
-.RE
-.\}
-.RE
-.PP
-\fBDocbookHtml()\fR, \fBenv\&.DocbookHtml()\fR
-.RS 4
-A pseudo\-Builder, providing a Docbook toolchain for HTML output\&.
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-env = Environment(tools=[\*(Aqdocbook\*(Aq])
-env\&.DocbookHtml(\*(Aqmanual\&.html\*(Aq, \*(Aqmanual\&.xml\*(Aq)
-.fi
-.if n \{\
-.RE
-.\}
-.sp
-or simply
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-env = Environment(tools=[\*(Aqdocbook\*(Aq])
-env\&.DocbookHtml(\*(Aqmanual\*(Aq)
-.fi
-.if n \{\
-.RE
-.\}
-.RE
-.PP
-\fBDocbookHtmlChunked()\fR, \fBenv\&.DocbookHtmlChunked()\fR
-.RS 4
-A pseudo\-Builder, providing a Docbook toolchain for chunked HTML output\&. It supports the
-base\&.dir
-parameter\&. The
-chunkfast\&.xsl
-file (requires "EXSLT") is used as the default stylesheet\&. Basic syntax:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-env = Environment(tools=[\*(Aqdocbook\*(Aq])
-env\&.DocbookHtmlChunked(\*(Aqmanual\*(Aq)
-.fi
-.if n \{\
-.RE
-.\}
-.sp
-where
-manual\&.xml
-is the input file\&.
-.sp
-If you use the
-root\&.filename
-parameter in your own stylesheets you have to specify the new target name\&. This ensures that the dependencies get correct, especially for the cleanup via
-\(lqscons \-c\(rq:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-env = Environment(tools=[\*(Aqdocbook\*(Aq])
-env\&.DocbookHtmlChunked(\*(Aqmymanual\&.html\*(Aq, \*(Aqmanual\*(Aq, xsl=\*(Aqhtmlchunk\&.xsl\*(Aq)
-.fi
-.if n \{\
-.RE
-.\}
-.sp
-Some basic support for the
-base\&.dir
-is provided\&. You can add the
-base_dir
-keyword to your Builder call, and the given prefix gets prepended to all the created filenames:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-env = Environment(tools=[\*(Aqdocbook\*(Aq])
-env\&.DocbookHtmlChunked(\*(Aqmanual\*(Aq, xsl=\*(Aqhtmlchunk\&.xsl\*(Aq, base_dir=\*(Aqoutput/\*(Aq)
-.fi
-.if n \{\
-.RE
-.\}
-.sp
-Make sure that you don\*(Aqt forget the trailing slash for the base folder, else your files get renamed only!
-.RE
-.PP
-\fBDocbookHtmlhelp()\fR, \fBenv\&.DocbookHtmlhelp()\fR
-.RS 4
-A pseudo\-Builder, providing a Docbook toolchain for HTMLHELP output\&. Its basic syntax is:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-env = Environment(tools=[\*(Aqdocbook\*(Aq])
-env\&.DocbookHtmlhelp(\*(Aqmanual\*(Aq)
-.fi
-.if n \{\
-.RE
-.\}
-.sp
-where
-manual\&.xml
-is the input file\&.
-.sp
-If you use the
-root\&.filename
-parameter in your own stylesheets you have to specify the new target name\&. This ensures that the dependencies get correct, especially for the cleanup via
-\(lqscons \-c\(rq:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-env = Environment(tools=[\*(Aqdocbook\*(Aq])
-env\&.DocbookHtmlhelp(\*(Aqmymanual\&.html\*(Aq, \*(Aqmanual\*(Aq, xsl=\*(Aqhtmlhelp\&.xsl\*(Aq)
-.fi
-.if n \{\
-.RE
-.\}
-.sp
-Some basic support for the
-base\&.dir
-parameter is provided\&. You can add the
-base_dir
-keyword to your Builder call, and the given prefix gets prepended to all the created filenames:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-env = Environment(tools=[\*(Aqdocbook\*(Aq])
-env\&.DocbookHtmlhelp(\*(Aqmanual\*(Aq, xsl=\*(Aqhtmlhelp\&.xsl\*(Aq, base_dir=\*(Aqoutput/\*(Aq)
-.fi
-.if n \{\
-.RE
-.\}
-.sp
-Make sure that you don\*(Aqt forget the trailing slash for the base folder, else your files get renamed only!
-.RE
-.PP
-\fBDocbookMan()\fR, \fBenv\&.DocbookMan()\fR
-.RS 4
-A pseudo\-Builder, providing a Docbook toolchain for Man page output\&. Its basic syntax is:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-env = Environment(tools=[\*(Aqdocbook\*(Aq])
-env\&.DocbookMan(\*(Aqmanual\*(Aq)
-.fi
-.if n \{\
-.RE
-.\}
-.sp
-where
-manual\&.xml
-is the input file\&. Note, that you can specify a target name, but the actual output names are automatically set from the
-refname
-entries in your XML source\&.
-.RE
-.PP
-\fBDocbookPdf()\fR, \fBenv\&.DocbookPdf()\fR
-.RS 4
-A pseudo\-Builder, providing a Docbook toolchain for PDF output\&.
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-env = Environment(tools=[\*(Aqdocbook\*(Aq])
-env\&.DocbookPdf(\*(Aqmanual\&.pdf\*(Aq, \*(Aqmanual\&.xml\*(Aq)
-.fi
-.if n \{\
-.RE
-.\}
-.sp
-or simply
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-env = Environment(tools=[\*(Aqdocbook\*(Aq])
-env\&.DocbookPdf(\*(Aqmanual\*(Aq)
-.fi
-.if n \{\
-.RE
-.\}
-.RE
-.PP
-\fBDocbookSlidesHtml()\fR, \fBenv\&.DocbookSlidesHtml()\fR
-.RS 4
-A pseudo\-Builder, providing a Docbook toolchain for HTML slides output\&.
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-env = Environment(tools=[\*(Aqdocbook\*(Aq])
-env\&.DocbookSlidesHtml(\*(Aqmanual\*(Aq)
-.fi
-.if n \{\
-.RE
-.\}
-.sp
-If you use the
-titlefoil\&.html
-parameter in your own stylesheets you have to give the new target name\&. This ensures that the dependencies get correct, especially for the cleanup via
-\(lqscons \-c\(rq:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-env = Environment(tools=[\*(Aqdocbook\*(Aq])
-env\&.DocbookSlidesHtml(\*(Aqmymanual\&.html\*(Aq,\*(Aqmanual\*(Aq, xsl=\*(Aqslideshtml\&.xsl\*(Aq)
-.fi
-.if n \{\
-.RE
-.\}
-.sp
-Some basic support for the
-base\&.dir
-parameter is provided\&. You can add the
-base_dir
-keyword to your Builder call, and the given prefix gets prepended to all the created filenames:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-env = Environment(tools=[\*(Aqdocbook\*(Aq])
-env\&.DocbookSlidesHtml(\*(Aqmanual\*(Aq, xsl=\*(Aqslideshtml\&.xsl\*(Aq, base_dir=\*(Aqoutput/\*(Aq)
-.fi
-.if n \{\
-.RE
-.\}
-.sp
-Make sure that you don\*(Aqt forget the trailing slash for the base folder, else your files get renamed only!
-.RE
-.PP
-\fBDocbookSlidesPdf()\fR, \fBenv\&.DocbookSlidesPdf()\fR
-.RS 4
-A pseudo\-Builder, providing a Docbook toolchain for PDF slides output\&.
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-env = Environment(tools=[\*(Aqdocbook\*(Aq])
-env\&.DocbookSlidesPdf(\*(Aqmanual\&.pdf\*(Aq, \*(Aqmanual\&.xml\*(Aq)
-.fi
-.if n \{\
-.RE
-.\}
-.sp
-or simply
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-env = Environment(tools=[\*(Aqdocbook\*(Aq])
-env\&.DocbookSlidesPdf(\*(Aqmanual\*(Aq)
-.fi
-.if n \{\
-.RE
-.\}
-.RE
-.PP
-\fBDocbookXInclude()\fR, \fBenv\&.DocbookXInclude()\fR
-.RS 4
-A pseudo\-Builder, for resolving XIncludes in a separate processing step\&.
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-env = Environment(tools=[\*(Aqdocbook\*(Aq])
-env\&.DocbookXInclude(\*(Aqmanual_xincluded\&.xml\*(Aq, \*(Aqmanual\&.xml\*(Aq)
-.fi
-.if n \{\
-.RE
-.\}
-.RE
-.PP
-\fBDocbookXslt()\fR, \fBenv\&.DocbookXslt()\fR
-.RS 4
-A pseudo\-Builder, applying a given XSL transformation to the input file\&.
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-env = Environment(tools=[\*(Aqdocbook\*(Aq])
-env\&.DocbookXslt(\*(Aqmanual_transformed\&.xml\*(Aq, \*(Aqmanual\&.xml\*(Aq, xsl=\*(Aqtransform\&.xslt\*(Aq)
-.fi
-.if n \{\
-.RE
-.\}
-.sp
-Note, that this builder requires the
-xsl
-parameter to be set\&.
-.RE
-.PP
-\fBDVI()\fR, \fBenv\&.DVI()\fR
-.RS 4
-Builds a
-\&.dvi
-file from a
-\&.tex,
-\&.ltx
-or
-\&.latex
-input file\&. If the source file suffix is
-\&.tex,
-scons
-will examine the contents of the file; if the string
-\edocumentclass
-or
-\edocumentstyle
-is found, the file is assumed to be a LaTeX file and the target is built by invoking the
-\fB$LATEXCOM\fR
-command line; otherwise, the
-\fB$TEXCOM\fR
-command line is used\&. If the file is a LaTeX file, the
-\fBDVI\fR
-builder method will also examine the contents of the
-\&.aux
-file and invoke the
-\fB$BIBTEX\fR
-command line if the string
-bibdata
-is found, start
-\fB$MAKEINDEX\fR
-to generate an index if a
-\&.ind
-file is found and will examine the contents
-\&.log
-file and re\-run the
-\fB$LATEXCOM\fR
-command if the log file says it is necessary\&.
-.sp
-The suffix
-\&.dvi
-(hard\-coded within TeX itself) is automatically added to the target if it is not already present\&. Examples:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-# builds from aaa\&.tex
-env\&.DVI(target = \*(Aqaaa\&.dvi\*(Aq, source = \*(Aqaaa\&.tex\*(Aq)
-# builds bbb\&.dvi
-env\&.DVI(target = \*(Aqbbb\*(Aq, source = \*(Aqbbb\&.ltx\*(Aq)
-# builds from ccc\&.latex
-env\&.DVI(target = \*(Aqccc\&.dvi\*(Aq, source = \*(Aqccc\&.latex\*(Aq)
-.fi
-.if n \{\
-.RE
-.\}
-.RE
-.PP
-\fBGs()\fR, \fBenv\&.Gs()\fR
-.RS 4
-A Builder for explicitly calling the
-gs
-executable\&. Depending on the underlying OS, the different names
-gs,
-gsos2
-and
-gswin32c
-are tried\&.
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-env = Environment(tools=[\*(Aqgs\*(Aq])
-env\&.Gs(\*(Aqcover\&.jpg\*(Aq,\*(Aqscons\-scons\&.pdf\*(Aq,
- GSFLAGS=\*(Aq\-dNOPAUSE \-dBATCH \-sDEVICE=jpeg \-dFirstPage=1 \-dLastPage=1 \-q\*(Aq)
- )
-.fi
-.if n \{\
-.RE
-.\}
-.RE
-.PP
-\fBInstall()\fR, \fBenv\&.Install()\fR
-.RS 4
-Installs one or more source files or directories in the specified target, which must be a directory\&. The names of the specified source files or directories remain the same within the destination directory\&. The sources may be given as a string or as a node returned by a builder\&.
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-env\&.Install(\*(Aq/usr/local/bin\*(Aq, source = [\*(Aqfoo\*(Aq, \*(Aqbar\*(Aq])
-.fi
-.if n \{\
-.RE
-.\}
-.RE
-.PP
-\fBInstallAs()\fR, \fBenv\&.InstallAs()\fR
-.RS 4
-Installs one or more source files or directories to specific names, allowing changing a file or directory name as part of the installation\&. It is an error if the target and source arguments list different numbers of files or directories\&.
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-env\&.InstallAs(target = \*(Aq/usr/local/bin/foo\*(Aq,
- source = \*(Aqfoo_debug\*(Aq)
-env\&.InstallAs(target = [\*(Aq\&.\&./lib/libfoo\&.a\*(Aq, \*(Aq\&.\&./lib/libbar\&.a\*(Aq],
- source = [\*(AqlibFOO\&.a\*(Aq, \*(AqlibBAR\&.a\*(Aq])
-.fi
-.if n \{\
-.RE
-.\}
-.RE
-.PP
-\fBInstallVersionedLib()\fR, \fBenv\&.InstallVersionedLib()\fR
-.RS 4
-Installs a versioned shared library\&. The
-\fB$SHLIBVERSION\fR
-construction variable should be defined in the environment to confirm the version number in the library name\&. If
-\fB$SHLIBVERSION\fR
-is not defined a warning will be issued and the name of the library will be parsed to derive the version\&. The symlinks appropriate to the architecture will be generated\&.
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-env\&.InstallVersionedLib(target = \*(Aq/usr/local/bin/foo\*(Aq,
- source = \*(Aqlibxyz\&.1\&.5\&.2\&.so\*(Aq)
-env\&.InstallVersionedLib(target = \*(Aq/usr/local/bin/foo\*(Aq,
- source = \*(Aqlibxyz\&.1\&.5\&.2\&.so\*(Aq,
- SHLIBVERSION=\*(Aq1\&.5\&.2\*(Aq)
-.fi
-.if n \{\
-.RE
-.\}
-.RE
-.PP
-\fBJar()\fR, \fBenv\&.Jar()\fR
-.RS 4
-Builds a Java archive (\&.jar) file from the specified list of sources\&. Any directories in the source list will be searched for
-\&.class
-files)\&. Any
-\&.java
-files in the source list will be compiled to
-\&.class
-files by calling the
-\fBJava\fR
-Builder\&.
-.sp
-If the
-\fB$JARCHDIR\fR
-value is set, the
-jar
-command will change to the specified directory using the
-\fB\-C\fR
-option\&. If
-\fB$JARCHDIR\fR
-is not set explicitly,
-SCons
-will use the top of any subdirectory tree in which Java
-\&.class
-were built by the
-\fBJava\fR
-Builder\&.
-.sp
-If the contents any of the source files begin with the string
-Manifest\-Version, the file is assumed to be a manifest and is passed to the
-jar
-command with the
-\fBm\fR
-option set\&.
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-env\&.Jar(target = \*(Aqfoo\&.jar\*(Aq, source = \*(Aqclasses\*(Aq)
-
-env\&.Jar(target = \*(Aqbar\&.jar\*(Aq,
- source = [\*(Aqbar1\&.java\*(Aq, \*(Aqbar2\&.java\*(Aq])
-.fi
-.if n \{\
-.RE
-.\}
-.RE
-.PP
-\fBJava()\fR, \fBenv\&.Java()\fR
-.RS 4
-Builds one or more Java class files\&. The sources may be any combination of explicit
-\&.java
-files, or directory trees which will be scanned for
-\&.java
-files\&.
-.sp
-SCons will parse each source
-\&.java
-file to find the classes (including inner classes) defined within that file, and from that figure out the target
-\&.class
-files that will be created\&. The class files will be placed underneath the specified target directory\&.
-.sp
-SCons will also search each Java file for the Java package name, which it assumes can be found on a line beginning with the string
-package
-in the first column; the resulting
-\&.class
-files will be placed in a directory reflecting the specified package name\&. For example, the file
-Foo\&.java
-defining a single public
-Foo
-class and containing a package name of
-sub\&.dir
-will generate a corresponding
-sub/dir/Foo\&.class
-class file\&.
-.sp
-Examples:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-env\&.Java(target = \*(Aqclasses\*(Aq, source = \*(Aqsrc\*(Aq)
-env\&.Java(target = \*(Aqclasses\*(Aq, source = [\*(Aqsrc1\*(Aq, \*(Aqsrc2\*(Aq])
-env\&.Java(target = \*(Aqclasses\*(Aq, source = [\*(AqFile1\&.java\*(Aq, \*(AqFile2\&.java\*(Aq])
-.fi
-.if n \{\
-.RE
-.\}
-.sp
-Java source files can use the native encoding for the underlying OS\&. Since SCons compiles in simple ASCII mode by default, the compiler will generate warnings about unmappable characters, which may lead to errors as the file is processed further\&. In this case, the user must specify the
-LANG
-environment variable to tell the compiler what encoding is used\&. For portibility, it\*(Aqs best if the encoding is hard\-coded so that the compile will work if it is done on a system with a different encoding\&.
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-env = Environment()
-env[\*(AqENV\*(Aq][\*(AqLANG\*(Aq] = \*(Aqen_GB\&.UTF\-8\*(Aq
-.fi
-.if n \{\
-.RE
-.\}
-.RE
-.PP
-\fBJavaH()\fR, \fBenv\&.JavaH()\fR
-.RS 4
-Builds C header and source files for implementing Java native methods\&. The target can be either a directory in which the header files will be written, or a header file name which will contain all of the definitions\&. The source can be the names of
-\&.class
-files, the names of
-\&.java
-files to be compiled into
-\&.class
-files by calling the
-\fBJava\fR
-builder method, or the objects returned from the
-\fBJava\fR
-builder method\&.
-.sp
-If the construction variable
-\fB$JAVACLASSDIR\fR
-is set, either in the environment or in the call to the
-\fBJavaH\fR
-builder method itself, then the value of the variable will be stripped from the beginning of any
-\&.class
-file names\&.
-.sp
-Examples:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-# builds java_native\&.h
-classes = env\&.Java(target = \*(Aqclassdir\*(Aq, source = \*(Aqsrc\*(Aq)
-env\&.JavaH(target = \*(Aqjava_native\&.h\*(Aq, source = classes)
-
-# builds include/package_foo\&.h and include/package_bar\&.h
-env\&.JavaH(target = \*(Aqinclude\*(Aq,
- source = [\*(Aqpackage/foo\&.class\*(Aq, \*(Aqpackage/bar\&.class\*(Aq])
-
-# builds export/foo\&.h and export/bar\&.h
-env\&.JavaH(target = \*(Aqexport\*(Aq,
- source = [\*(Aqclasses/foo\&.class\*(Aq, \*(Aqclasses/bar\&.class\*(Aq],
- JAVACLASSDIR = \*(Aqclasses\*(Aq)
-.fi
-.if n \{\
-.RE
-.\}
-.RE
-.PP
-\fBLibrary()\fR, \fBenv\&.Library()\fR
-.RS 4
-A synonym for the
-\fBStaticLibrary\fR
-builder method\&.
-.RE
-.PP
-\fBLoadableModule()\fR, \fBenv\&.LoadableModule()\fR
-.RS 4
-On most systems, this is the same as
-\fBSharedLibrary\fR\&. On Mac OS X (Darwin) platforms, this creates a loadable module bundle\&.
-.RE
-.PP
-\fBM4()\fR, \fBenv\&.M4()\fR
-.RS 4
-Builds an output file from an M4 input file\&. This uses a default
-\fB$M4FLAGS\fR
-value of
-\fB\-E\fR, which considers all warnings to be fatal and stops on the first warning when using the GNU version of m4\&. Example:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-env\&.M4(target = \*(Aqfoo\&.c\*(Aq, source = \*(Aqfoo\&.c\&.m4\*(Aq)
-.fi
-.if n \{\
-.RE
-.\}
-.RE
-.PP
-\fBMoc()\fR, \fBenv\&.Moc()\fR
-.RS 4
-Builds an output file from a moc input file\&. Moc input files are either header files or cxx files\&. This builder is only available after using the tool \*(Aqqt\*(Aq\&. See the
-\fB$QTDIR\fR
-variable for more information\&. Example:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-env\&.Moc(\*(Aqfoo\&.h\*(Aq) # generates moc_foo\&.cc
-env\&.Moc(\*(Aqfoo\&.cpp\*(Aq) # generates foo\&.moc
-.fi
-.if n \{\
-.RE
-.\}
-.RE
-.PP
-\fBMOFiles()\fR, \fBenv\&.MOFiles()\fR
-.RS 4
-This builder belongs to
-msgfmt
-tool\&. The builder compiles
-PO
-files to
-MO
-files\&.
-.sp
-
-\fIExample 1\fR\&. Create
-pl\&.mo
-and
-en\&.mo
-by compiling
-pl\&.po
-and
-en\&.po:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
- # \&.\&.\&.
- env\&.MOFiles([\*(Aqpl\*(Aq, \*(Aqen\*(Aq])
-.fi
-.if n \{\
-.RE
-.\}
-.sp
-
-\fIExample 2\fR\&. Compile files for languages defined in
-LINGUAS
-file:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
- # \&.\&.\&.
- env\&.MOFiles(LINGUAS_FILE = 1)
-.fi
-.if n \{\
-.RE
-.\}
-.sp
-
-\fIExample 3\fR\&. Create
-pl\&.mo
-and
-en\&.mo
-by compiling
-pl\&.po
-and
-en\&.po
-plus files for languages defined in
-LINGUAS
-file:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
- # \&.\&.\&.
- env\&.MOFiles([\*(Aqpl\*(Aq, \*(Aqen\*(Aq], LINGUAS_FILE = 1)
-.fi
-.if n \{\
-.RE
-.\}
-.sp
-
-\fIExample 4\fR\&. Compile files for languages defined in
-LINGUAS
-file (another version):
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
- # \&.\&.\&.
- env[\*(AqLINGUAS_FILE\*(Aq] = 1
- env\&.MOFiles()
-.fi
-.if n \{\
-.RE
-.\}
-.RE
-.PP
-\fBMSVSProject()\fR, \fBenv\&.MSVSProject()\fR
-.RS 4
-Builds a Microsoft Visual Studio project file, and by default builds a solution file as well\&.
-.sp
-This builds a Visual Studio project file, based on the version of Visual Studio that is configured (either the latest installed version, or the version specified by
-\fB$MSVS_VERSION\fR
-in the Environment constructor)\&. For Visual Studio 6, it will generate a
-\&.dsp
-file\&. For Visual Studio 7 (\&.NET) and later versions, it will generate a
-\&.vcproj
-file\&.
-.sp
-By default, this also generates a solution file for the specified project, a
-\&.dsw
-file for Visual Studio 6 or a
-\&.sln
-file for Visual Studio 7 (\&.NET)\&. This behavior may be disabled by specifying
-auto_build_solution=0
-when you call
-\fBMSVSProject\fR, in which case you presumably want to build the solution file(s) by calling the
-\fBMSVSSolution\fR
-Builder (see below)\&.
-.sp
-The
-\fBMSVSProject\fR
-builder takes several lists of filenames to be placed into the project file\&. These are currently limited to
-srcs,
-incs,
-localincs,
-resources, and
-misc\&. These are pretty self\-explanatory, but it should be noted that these lists are added to the
-\fB$SOURCES\fR
-construction variable as strings, NOT as SCons File Nodes\&. This is because they represent file names to be added to the project file, not the source files used to build the project file\&.
-.sp
-The above filename lists are all optional, although at least one must be specified for the resulting project file to be non\-empty\&.
-.sp
-In addition to the above lists of values, the following values may be specified:
-.PP
-target
-.RS 4
-The name of the target
-\&.dsp
-or
-\&.vcproj
-file\&. The correct suffix for the version of Visual Studio must be used, but the
-\fB$MSVSPROJECTSUFFIX\fR
-construction variable will be defined to the correct value (see example below)\&.
-.RE
-.PP
-variant
-.RS 4
-The name of this particular variant\&. For Visual Studio 7 projects, this can also be a list of variant names\&. These are typically things like "Debug" or "Release", but really can be anything you want\&. For Visual Studio 7 projects, they may also specify a target platform separated from the variant name by a
-|
-(vertical pipe) character:
-Debug|Xbox\&. The default target platform is Win32\&. Multiple calls to
-\fBMSVSProject\fR
-with different variants are allowed; all variants will be added to the project file with their appropriate build targets and sources\&.
-.RE
-.PP
-cmdargs
-.RS 4
-Additional command line arguments for the different variants\&. The number of
-cmdargs
-entries must match the number of
-variant
-entries, or be empty (not specified)\&. If you give only one, it will automatically be propagated to all variants\&.
-.RE
-.PP
-buildtarget
-.RS 4
-An optional string, node, or list of strings or nodes (one per build variant), to tell the Visual Studio debugger what output target to use in what build variant\&. The number of
-buildtarget
-entries must match the number of
-variant
-entries\&.
-.RE
-.PP
-runfile
-.RS 4
-The name of the file that Visual Studio 7 and later will run and debug\&. This appears as the value of the
-Output
-field in the resulting Visual Studio project file\&. If this is not specified, the default is the same as the specified
-buildtarget
-value\&.
-.RE
-.sp
-Note that because
-SCons
-always executes its build commands from the directory in which the
-SConstruct
-file is located, if you generate a project file in a different directory than the
-SConstruct
-directory, users will not be able to double\-click on the file name in compilation error messages displayed in the Visual Studio console output window\&. This can be remedied by adding the Visual C/C++
-/FC
-compiler option to the
-\fB$CCFLAGS\fR
-variable so that the compiler will print the full path name of any files that cause compilation errors\&.
-.sp
-Example usage:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-barsrcs = [\*(Aqbar\&.cpp\*(Aq],
-barincs = [\*(Aqbar\&.h\*(Aq],
-barlocalincs = [\*(AqStdAfx\&.h\*(Aq]
-barresources = [\*(Aqbar\&.rc\*(Aq,\*(Aqresource\&.h\*(Aq]
-barmisc = [\*(Aqbar_readme\&.txt\*(Aq]
-
-dll = env\&.SharedLibrary(target = \*(Aqbar\&.dll\*(Aq,
- source = barsrcs)
-
-env\&.MSVSProject(target = \*(AqBar\*(Aq + env[\*(AqMSVSPROJECTSUFFIX\*(Aq],
- srcs = barsrcs,
- incs = barincs,
- localincs = barlocalincs,
- resources = barresources,
- misc = barmisc,
- buildtarget = dll,
- variant = \*(AqRelease\*(Aq)
-.fi
-.if n \{\
-.RE
-.\}
-.sp
-Starting with version 2\&.4 of SCons it\*(Aqs also possible to specify the optional argument
-\fIDebugSettings\fR, which creates files for debugging under Visual Studio:
-.PP
-DebugSettings
-.RS 4
-A dictionary of debug settings that get written to the
-\&.vcproj\&.user
-or the
-\&.vcxproj\&.user
-file, depending on the version installed\&. As it is done for cmdargs (see above), you can specify a
-\fIDebugSettings\fR
-dictionary per variant\&. If you give only one, it will be propagated to all variants\&.
-.RE
-.sp
-Currently, only Visual Studio v9\&.0 and Visual Studio version v11 are implemented, for other versions no file is generated\&. To generate the user file, you just need to add a
-\fIDebugSettings\fR
-dictionary to the environment with the right parameters for your MSVS version\&. If the dictionary is empty, or does not contain any good value, no file will be generated\&.
-.sp
-Following is a more contrived example, involving the setup of a project for variants and DebugSettings:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-# Assuming you store your defaults in a file
-vars = Variables(\*(Aqvariables\&.py\*(Aq)
-msvcver = vars\&.args\&.get(\*(Aqvc\*(Aq, \*(Aq9\*(Aq)
-
-# Check command args to force one Microsoft Visual Studio version
-if msvcver == \*(Aq9\*(Aq or msvcver == \*(Aq11\*(Aq:
- env = Environment(MSVC_VERSION=msvcver+\*(Aq\&.0\*(Aq, MSVC_BATCH=False)
-else:
- env = Environment()
-
-AddOption(\*(Aq\-\-userfile\*(Aq, action=\*(Aqstore_true\*(Aq, dest=\*(Aquserfile\*(Aq, default=False,
- help="Create Visual Studio Project user file")
-
-#
-# 1\&. Configure your Debug Setting dictionary with options you want in the list
-# of allowed options, for instance if you want to create a user file to launch
-# a specific application for testing your dll with Microsoft Visual Studio 2008 (v9):
-#
-V9DebugSettings = {
- \*(AqCommand\*(Aq:\*(Aqc:\e\emyapp\e\eusing\e\ethisdll\&.exe\*(Aq,
- \*(AqWorkingDirectory\*(Aq: \*(Aqc:\e\emyapp\e\eusing\e\e\*(Aq,
- \*(AqCommandArguments\*(Aq: \*(Aq\-p password\*(Aq,
-# \*(AqAttach\*(Aq:\*(Aqfalse\*(Aq,
-# \*(AqDebuggerType\*(Aq:\*(Aq3\*(Aq,
-# \*(AqRemote\*(Aq:\*(Aq1\*(Aq,
-# \*(AqRemoteMachine\*(Aq: None,
-# \*(AqRemoteCommand\*(Aq: None,
-# \*(AqHttpUrl\*(Aq: None,
-# \*(AqPDBPath\*(Aq: None,
-# \*(AqSQLDebugging\*(Aq: None,
-# \*(AqEnvironment\*(Aq: \*(Aq\*(Aq,
-# \*(AqEnvironmentMerge\*(Aq:\*(Aqtrue\*(Aq,
-# \*(AqDebuggerFlavor\*(Aq: None,
-# \*(AqMPIRunCommand\*(Aq: None,
-# \*(AqMPIRunArguments\*(Aq: None,
-# \*(AqMPIRunWorkingDirectory\*(Aq: None,
-# \*(AqApplicationCommand\*(Aq: None,
-# \*(AqApplicationArguments\*(Aq: None,
-# \*(AqShimCommand\*(Aq: None,
-# \*(AqMPIAcceptMode\*(Aq: None,
-# \*(AqMPIAcceptFilter\*(Aq: None,
-}
-
-#
-# 2\&. Because there are a lot of different options depending on the Microsoft
-# Visual Studio version, if you use more than one version you have to
-# define a dictionary per version, for instance if you want to create a user
-# file to launch a specific application for testing your dll with Microsoft
-# Visual Studio 2012 (v11):
-#
-V10DebugSettings = {
- \*(AqLocalDebuggerCommand\*(Aq: \*(Aqc:\e\emyapp\e\eusing\e\ethisdll\&.exe\*(Aq,
- \*(AqLocalDebuggerWorkingDirectory\*(Aq: \*(Aqc:\e\emyapp\e\eusing\e\e\*(Aq,
- \*(AqLocalDebuggerCommandArguments\*(Aq: \*(Aq\-p password\*(Aq,
-# \*(AqLocalDebuggerEnvironment\*(Aq: None,
-# \*(AqDebuggerFlavor\*(Aq: \*(AqWindowsLocalDebugger\*(Aq,
-# \*(AqLocalDebuggerAttach\*(Aq: None,
-# \*(AqLocalDebuggerDebuggerType\*(Aq: None,
-# \*(AqLocalDebuggerMergeEnvironment\*(Aq: None,
-# \*(AqLocalDebuggerSQLDebugging\*(Aq: None,
-# \*(AqRemoteDebuggerCommand\*(Aq: None,
-# \*(AqRemoteDebuggerCommandArguments\*(Aq: None,
-# \*(AqRemoteDebuggerWorkingDirectory\*(Aq: None,
-# \*(AqRemoteDebuggerServerName\*(Aq: None,
-# \*(AqRemoteDebuggerConnection\*(Aq: None,
-# \*(AqRemoteDebuggerDebuggerType\*(Aq: None,
-# \*(AqRemoteDebuggerAttach\*(Aq: None,
-# \*(AqRemoteDebuggerSQLDebugging\*(Aq: None,
-# \*(AqDeploymentDirectory\*(Aq: None,
-# \*(AqAdditionalFiles\*(Aq: None,
-# \*(AqRemoteDebuggerDeployDebugCppRuntime\*(Aq: None,
-# \*(AqWebBrowserDebuggerHttpUrl\*(Aq: None,
-# \*(AqWebBrowserDebuggerDebuggerType\*(Aq: None,
-# \*(AqWebServiceDebuggerHttpUrl\*(Aq: None,
-# \*(AqWebServiceDebuggerDebuggerType\*(Aq: None,
-# \*(AqWebServiceDebuggerSQLDebugging\*(Aq: None,
-}
-
-#
-# 3\&. Select the dictionary you want depending on the version of visual Studio
-# Files you want to generate\&.
-#
-if not env\&.GetOption(\*(Aquserfile\*(Aq):
- dbgSettings = None
-elif env\&.get(\*(AqMSVC_VERSION\*(Aq, None) == \*(Aq9\&.0\*(Aq:
- dbgSettings = V9DebugSettings
-elif env\&.get(\*(AqMSVC_VERSION\*(Aq, None) == \*(Aq11\&.0\*(Aq:
- dbgSettings = V10DebugSettings
-else:
- dbgSettings = None
-
-#
-# 4\&. Add the dictionary to the DebugSettings keyword\&.
-#
-barsrcs = [\*(Aqbar\&.cpp\*(Aq, \*(Aqdllmain\&.cpp\*(Aq, \*(Aqstdafx\&.cpp\*(Aq]
-barincs = [\*(Aqtargetver\&.h\*(Aq]
-barlocalincs = [\*(AqStdAfx\&.h\*(Aq]
-barresources = [\*(Aqbar\&.rc\*(Aq,\*(Aqresource\&.h\*(Aq]
-barmisc = [\*(AqReadMe\&.txt\*(Aq]
-
-dll = env\&.SharedLibrary(target = \*(Aqbar\&.dll\*(Aq,
- source = barsrcs)
-
-env\&.MSVSProject(target = \*(AqBar\*(Aq + env[\*(AqMSVSPROJECTSUFFIX\*(Aq],
- srcs = barsrcs,
- incs = barincs,
- localincs = barlocalincs,
- resources = barresources,
- misc = barmisc,
- buildtarget = [dll[0]] * 2,
- variant = (\*(AqDebug|Win32\*(Aq, \*(AqRelease|Win32\*(Aq),
- cmdargs = \*(Aqvc=%s\*(Aq % msvcver,
- DebugSettings = (dbgSettings, {}))
-.fi
-.if n \{\
-.RE
-.\}
-.RE
-.PP
-\fBMSVSSolution()\fR, \fBenv\&.MSVSSolution()\fR
-.RS 4
-Builds a Microsoft Visual Studio solution file\&.
-.sp
-This builds a Visual Studio solution file, based on the version of Visual Studio that is configured (either the latest installed version, or the version specified by
-\fB$MSVS_VERSION\fR
-in the construction environment)\&. For Visual Studio 6, it will generate a
-\&.dsw
-file\&. For Visual Studio 7 (\&.NET), it will generate a
-\&.sln
-file\&.
-.sp
-The following values must be specified:
-.PP
-target
-.RS 4
-The name of the target \&.dsw or \&.sln file\&. The correct suffix for the version of Visual Studio must be used, but the value
-\fB$MSVSSOLUTIONSUFFIX\fR
-will be defined to the correct value (see example below)\&.
-.RE
-.PP
-variant
-.RS 4
-The name of this particular variant, or a list of variant names (the latter is only supported for MSVS 7 solutions)\&. These are typically things like "Debug" or "Release", but really can be anything you want\&. For MSVS 7 they may also specify target platform, like this "Debug|Xbox"\&. Default platform is Win32\&.
-.RE
-.PP
-projects
-.RS 4
-A list of project file names, or Project nodes returned by calls to the
-\fBMSVSProject\fR
-Builder, to be placed into the solution file\&. It should be noted that these file names are NOT added to the $SOURCES environment variable in form of files, but rather as strings\&. This is because they represent file names to be added to the solution file, not the source files used to build the solution file\&.
-.RE
-.sp
-Example Usage:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-env\&.MSVSSolution(target = \*(AqBar\*(Aq + env[\*(AqMSVSSOLUTIONSUFFIX\*(Aq], projects = [\*(Aqbar\*(Aq
-+ env[\*(AqMSVSPROJECTSUFFIX\*(Aq]], variant = \*(AqRelease\*(Aq)
-.fi
-.if n \{\
-.RE
-.\}
-.RE
-.PP
-\fBObject()\fR, \fBenv\&.Object()\fR
-.RS 4
-A synonym for the
-\fBStaticObject\fR
-builder method\&.
-.RE
-.PP
-\fBPackage()\fR, \fBenv\&.Package()\fR
-.RS 4
-Builds a Binary Package of the given source files\&.
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-env\&.Package(source = FindInstalledFiles())
-.fi
-.if n \{\
-.RE
-.\}
-.sp
-Builds software distribution packages\&. Packages consist of files to install and packaging information\&. The former may be specified with the
-\fIsource\fR
-parameter and may be left out, in which case the
-\fBFindInstalledFiles\fR
-function will collect all files that have an
-\fBInstall\fR
-or
-\fBInstallAs\fR
-Builder attached\&. If the
-\fItarget\fR
-is not specified it will be deduced from additional information given to this Builder\&.
-.sp
-The packaging information is specified with the help of construction variables documented below\&. This information is called a tag to stress that some of them can also be attached to files with the
-\fBTag\fR
-function\&. The mandatory ones will complain if they were not specified\&. They vary depending on chosen target packager\&.
-.sp
-The target packager may be selected with the "PACKAGETYPE" command line option or with the
-\fB$PACKAGETYPE\fR
-construction variable\&. Currently the following packagers available:
-.sp
-* msi \- Microsoft Installer * rpm \- Redhat Package Manger * ipkg \- Itsy Package Management System * tarbz2 \- compressed tar * targz \- compressed tar * zip \- zip file * src_tarbz2 \- compressed tar source * src_targz \- compressed tar source * src_zip \- zip file source
-.sp
-An updated list is always available under the "package_type" option when running "scons \-\-help" on a project that has packaging activated\&.
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-env = Environment(tools=[\*(Aqdefault\*(Aq, \*(Aqpackaging\*(Aq])
-env\&.Install(\*(Aq/bin/\*(Aq, \*(Aqmy_program\*(Aq)
-env\&.Package( NAME = \*(Aqfoo\*(Aq,
- VERSION = \*(Aq1\&.2\&.3\*(Aq,
- PACKAGEVERSION = 0,
- PACKAGETYPE = \*(Aqrpm\*(Aq,
- LICENSE = \*(Aqgpl\*(Aq,
- SUMMARY = \*(Aqbalalalalal\*(Aq,
- DESCRIPTION = \*(Aqthis should be really really long\*(Aq,
- X_RPM_GROUP = \*(AqApplication/fu\*(Aq,
- SOURCE_URL = \*(Aqhttp://foo\&.org/foo\-1\&.2\&.3\&.tar\&.gz\*(Aq
- )
-.fi
-.if n \{\
-.RE
-.\}
-.RE
-.PP
-\fBPCH()\fR, \fBenv\&.PCH()\fR
-.RS 4
-Builds a Microsoft Visual C++ precompiled header\&. Calling this builder method returns a list of two targets: the PCH as the first element, and the object file as the second element\&. Normally the object file is ignored\&. This builder method is only provided when Microsoft Visual C++ is being used as the compiler\&. The PCH builder method is generally used in conjuction with the PCH construction variable to force object files to use the precompiled header:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-env[\*(AqPCH\*(Aq] = env\&.PCH(\*(AqStdAfx\&.cpp\*(Aq)[0]
-.fi
-.if n \{\
-.RE
-.\}
-.RE
-.PP
-\fBPDF()\fR, \fBenv\&.PDF()\fR
-.RS 4
-Builds a
-\&.pdf
-file from a
-\&.dvi
-input file (or, by extension, a
-\&.tex,
-\&.ltx, or
-\&.latex
-input file)\&. The suffix specified by the
-\fB$PDFSUFFIX\fR
-construction variable (\&.pdf
-by default) is added automatically to the target if it is not already present\&. Example:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-# builds from aaa\&.tex
-env\&.PDF(target = \*(Aqaaa\&.pdf\*(Aq, source = \*(Aqaaa\&.tex\*(Aq)
-# builds bbb\&.pdf from bbb\&.dvi
-env\&.PDF(target = \*(Aqbbb\*(Aq, source = \*(Aqbbb\&.dvi\*(Aq)
-.fi
-.if n \{\
-.RE
-.\}
-.RE
-.PP
-\fBPOInit()\fR, \fBenv\&.POInit()\fR
-.RS 4
-This builder belongs to
-msginit
-tool\&. The builder initializes missing
-PO
-file(s) if
-\fB$POAUTOINIT\fR
-is set\&. If
-\fB$POAUTOINIT\fR
-is not set (default),
-\fBPOInit\fR
-prints instruction for user (that is supposed to be a translator), telling how the
-PO
-file should be initialized\&. In normal projects
-\fIyou should not use \fR\fI\fBPOInit\fR\fR\fI and use \fR\fI\fBPOUpdate\fR\fR\fI instead\fR\&.
-\fBPOUpdate\fR
-chooses intelligently between
-\fBmsgmerge(1)\fR
-and
-\fBmsginit(1)\fR\&.
-\fBPOInit\fR
-always uses
-\fBmsginit(1)\fR
-and should be regarded as builder for special purposes or for temporary use (e\&.g\&. for quick, one time initialization of a bunch of
-PO
-files) or for tests\&.
-.sp
-Target nodes defined through
-\fBPOInit\fR
-are not built by default (they\*(Aqre
-Ignored from
-\*(Aq\&.\*(Aq
-node) but are added to special
-Alias
-(\*(Aqpo\-create\*(Aq
-by default)\&. The alias name may be changed through the
-\fB$POCREATE_ALIAS\fR
-construction variable\&. All
-PO
-files defined through
-\fBPOInit\fR
-may be easily initialized by
-\fBscons po\-create\fR\&.
-.sp
-
-\fIExample 1\fR\&. Initialize
-en\&.po
-and
-pl\&.po
-from
-messages\&.pot:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
- # \&.\&.\&.
- env\&.POInit([\*(Aqen\*(Aq, \*(Aqpl\*(Aq]) # messages\&.pot \-\-> [en\&.po, pl\&.po]
-.fi
-.if n \{\
-.RE
-.\}
-.sp
-
-\fIExample 2\fR\&. Initialize
-en\&.po
-and
-pl\&.po
-from
-foo\&.pot:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
- # \&.\&.\&.
- env\&.POInit([\*(Aqen\*(Aq, \*(Aqpl\*(Aq], [\*(Aqfoo\*(Aq]) # foo\&.pot \-\-> [en\&.po, pl\&.po]
-.fi
-.if n \{\
-.RE
-.\}
-.sp
-
-\fIExample 3\fR\&. Initialize
-en\&.po
-and
-pl\&.po
-from
-foo\&.pot
-but using
-\fB$POTDOMAIN\fR
-construction variable:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
- # \&.\&.\&.
- env\&.POInit([\*(Aqen\*(Aq, \*(Aqpl\*(Aq], POTDOMAIN=\*(Aqfoo\*(Aq) # foo\&.pot \-\-> [en\&.po, pl\&.po]
-.fi
-.if n \{\
-.RE
-.\}
-.sp
-
-\fIExample 4\fR\&. Initialize
-PO
-files for languages defined in
-LINGUAS
-file\&. The files will be initialized from template
-messages\&.pot:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
- # \&.\&.\&.
- env\&.POInit(LINGUAS_FILE = 1) # needs \*(AqLINGUAS\*(Aq file
-.fi
-.if n \{\
-.RE
-.\}
-.sp
-
-\fIExample 5\fR\&. Initialize
-en\&.po
-and
-pl\&.pl
-PO
-files plus files for languages defined in
-LINGUAS
-file\&. The files will be initialized from template
-messages\&.pot:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
- # \&.\&.\&.
- env\&.POInit([\*(Aqen\*(Aq, \*(Aqpl\*(Aq], LINGUAS_FILE = 1)
-.fi
-.if n \{\
-.RE
-.\}
-.sp
-
-\fIExample 6\fR\&. You may preconfigure your environment first, and then initialize
-PO
-files:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
- # \&.\&.\&.
- env[\*(AqPOAUTOINIT\*(Aq] = 1
- env[\*(AqLINGUAS_FILE\*(Aq] = 1
- env[\*(AqPOTDOMAIN\*(Aq] = \*(Aqfoo\*(Aq
- env\&.POInit()
-.fi
-.if n \{\
-.RE
-.\}
-.sp
-which has same efect as:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
- # \&.\&.\&.
- env\&.POInit(POAUTOINIT = 1, LINGUAS_FILE = 1, POTDOMAIN = \*(Aqfoo\*(Aq)
-.fi
-.if n \{\
-.RE
-.\}
-.RE
-.PP
-\fBPostScript()\fR, \fBenv\&.PostScript()\fR
-.RS 4
-Builds a
-\&.ps
-file from a
-\&.dvi
-input file (or, by extension, a
-\&.tex,
-\&.ltx, or
-\&.latex
-input file)\&. The suffix specified by the
-\fB$PSSUFFIX\fR
-construction variable (\&.ps
-by default) is added automatically to the target if it is not already present\&. Example:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-# builds from aaa\&.tex
-env\&.PostScript(target = \*(Aqaaa\&.ps\*(Aq, source = \*(Aqaaa\&.tex\*(Aq)
-# builds bbb\&.ps from bbb\&.dvi
-env\&.PostScript(target = \*(Aqbbb\*(Aq, source = \*(Aqbbb\&.dvi\*(Aq)
-.fi
-.if n \{\
-.RE
-.\}
-.RE
-.PP
-\fBPOTUpdate()\fR, \fBenv\&.POTUpdate()\fR
-.RS 4
-The builder belongs to
-xgettext
-tool\&. The builder updates target
-POT
-file if exists or creates one if it doesn\*(Aqt\&. The node is not built by default (i\&.e\&. it is
-Ignored from
-\*(Aq\&.\*(Aq), but only on demand (i\&.e\&. when given
-POT
-file is required or when special alias is invoked)\&. This builder adds its targe node (messages\&.pot, say) to a special alias (pot\-update
-by default, see
-\fB$POTUPDATE_ALIAS\fR) so you can update/create them easily with
-\fBscons pot\-update\fR\&. The file is not written until there is no real change in internationalized messages (or in comments that enter
-POT
-file)\&.
-.sp
-.if n \{\
-.sp
-.\}
-.RS 4
-.it 1 an-trap
-.nr an-no-space-flag 1
-.nr an-break-flag 1
-.br
-.ps +1
-\fBNote\fR
-.ps -1
-.br
-You may see
-\fBxgettext(1)\fR
-being invoked by the
-xgettext
-tool even if there is no real change in internationalized messages (so the
-POT
-file is not being updated)\&. This happens every time a source file has changed\&. In such case we invoke
-\fBxgettext(1)\fR
-and compare its output with the content of
-POT
-file to decide whether the file should be updated or not\&.
-.sp .5v
-.RE
-.sp
-
-\fIExample 1\&.\fR
-Let\*(Aqs create
-po/
-directory and place following
-SConstruct
-script there:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
- # SConstruct in \*(Aqpo/\*(Aq subdir
- env = Environment( tools = [\*(Aqdefault\*(Aq, \*(Aqxgettext\*(Aq] )
- env\&.POTUpdate([\*(Aqfoo\*(Aq], [\*(Aq\&.\&./a\&.cpp\*(Aq, \*(Aq\&.\&./b\&.cpp\*(Aq])
- env\&.POTUpdate([\*(Aqbar\*(Aq], [\*(Aq\&.\&./c\&.cpp\*(Aq, \*(Aq\&.\&./d\&.cpp\*(Aq])
-.fi
-.if n \{\
-.RE
-.\}
-.sp
-Then invoke scons few times:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
- user@host:$ scons # Does not create foo\&.pot nor bar\&.pot
- user@host:$ scons foo\&.pot # Updates or creates foo\&.pot
- user@host:$ scons pot\-update # Updates or creates foo\&.pot and bar\&.pot
- user@host:$ scons \-c # Does not clean foo\&.pot nor bar\&.pot\&.
-.fi
-.if n \{\
-.RE
-.\}
-.sp
-the results shall be as the comments above say\&.
-.sp
-
-\fIExample 2\&.\fR
-The
-\fBPOTUpdate\fR
-builder may be used with no target specified, in which case default target
-messages\&.pot
-will be used\&. The default target may also be overriden by setting
-\fB$POTDOMAIN\fR
-construction variable or providing it as an override to
-\fBPOTUpdate\fR
-builder:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-
- # SConstruct script
- env = Environment( tools = [\*(Aqdefault\*(Aq, \*(Aqxgettext\*(Aq] )
- env[\*(AqPOTDOMAIN\*(Aq] = "foo"
- env\&.POTUpdate(source = ["a\&.cpp", "b\&.cpp"]) # Creates foo\&.pot \&.\&.\&.
- env\&.POTUpdate(POTDOMAIN = "bar", source = ["c\&.cpp", "d\&.cpp"]) # and bar\&.pot
-.fi
-.if n \{\
-.RE
-.\}
-.sp
-
-\fIExample 3\&.\fR
-The sources may be specified within separate file, for example
-POTFILES\&.in:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-
- # POTFILES\&.in in \*(Aqpo/\*(Aq subdirectory
- \&.\&./a\&.cpp
- \&.\&./b\&.cpp
- # end of file
-.fi
-.if n \{\
-.RE
-.\}
-.sp
-The name of the file (POTFILES\&.in) containing the list of sources is provided via
-\fB$XGETTEXTFROM\fR:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-
- # SConstruct file in \*(Aqpo/\*(Aq subdirectory
- env = Environment( tools = [\*(Aqdefault\*(Aq, \*(Aqxgettext\*(Aq] )
- env\&.POTUpdate(XGETTEXTFROM = \*(AqPOTFILES\&.in\*(Aq)
-.fi
-.if n \{\
-.RE
-.\}
-.sp
-
-\fIExample 4\&.\fR
-You may use
-\fB$XGETTEXTPATH\fR
-to define source search path\&. Assume, for example, that you have files
-a\&.cpp,
-b\&.cpp,
-po/SConstruct,
-po/POTFILES\&.in\&. Then your
-POT\-related files could look as below:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
- # POTFILES\&.in in \*(Aqpo/\*(Aq subdirectory
- a\&.cpp
- b\&.cpp
- # end of file
-.fi
-.if n \{\
-.RE
-.\}
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
- # SConstruct file in \*(Aqpo/\*(Aq subdirectory
- env = Environment( tools = [\*(Aqdefault\*(Aq, \*(Aqxgettext\*(Aq] )
- env\&.POTUpdate(XGETTEXTFROM = \*(AqPOTFILES\&.in\*(Aq, XGETTEXTPATH=\*(Aq\&.\&./\*(Aq)
-.fi
-.if n \{\
-.RE
-.\}
-.sp
-
-\fIExample 5\&.\fR
-Multiple search directories may be defined within a list, i\&.e\&.
-XGETTEXTPATH = [\*(Aqdir1\*(Aq, \*(Aqdir2\*(Aq, \&.\&.\&.]\&. The order in the list determines the search order of source files\&. The path to the first file found is used\&.
-.sp
-Let\*(Aqs create
-0/1/po/SConstruct
-script:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
- # SConstruct file in \*(Aq0/1/po/\*(Aq subdirectory
- env = Environment( tools = [\*(Aqdefault\*(Aq, \*(Aqxgettext\*(Aq] )
- env\&.POTUpdate(XGETTEXTFROM = \*(AqPOTFILES\&.in\*(Aq, XGETTEXTPATH=[\*(Aq\&.\&./\*(Aq, \*(Aq\&.\&./\&.\&./\*(Aq])
-.fi
-.if n \{\
-.RE
-.\}
-.sp
-and
-0/1/po/POTFILES\&.in:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
- # POTFILES\&.in in \*(Aq0/1/po/\*(Aq subdirectory
- a\&.cpp
- # end of file
-.fi
-.if n \{\
-.RE
-.\}
-.sp
-Write two
-*\&.cpp
-files, the first one is
-0/a\&.cpp:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
- /* 0/a\&.cpp */
- gettext("Hello from \&.\&./\&.\&./a\&.cpp")
-.fi
-.if n \{\
-.RE
-.\}
-.sp
-and the second is
-0/1/a\&.cpp:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
- /* 0/1/a\&.cpp */
- gettext("Hello from \&.\&./a\&.cpp")
-.fi
-.if n \{\
-.RE
-.\}
-.sp
-then run scons\&. You\*(Aqll obtain
-0/1/po/messages\&.pot
-with the message
-"Hello from \&.\&./a\&.cpp"\&. When you reverse order in
-\fI$XGETTEXTFOM\fR, i\&.e\&. when you write SConscript as
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
- # SConstruct file in \*(Aq0/1/po/\*(Aq subdirectory
- env = Environment( tools = [\*(Aqdefault\*(Aq, \*(Aqxgettext\*(Aq] )
- env\&.POTUpdate(XGETTEXTFROM = \*(AqPOTFILES\&.in\*(Aq, XGETTEXTPATH=[\*(Aq\&.\&./\&.\&./\*(Aq, \*(Aq\&.\&./\*(Aq])
-.fi
-.if n \{\
-.RE
-.\}
-.sp
-then the
-messages\&.pot
-will contain
-msgid "Hello from \&.\&./\&.\&./a\&.cpp"
-line and not
-msgid "Hello from \&.\&./a\&.cpp"\&.
-.RE
-.PP
-\fBPOUpdate()\fR, \fBenv\&.POUpdate()\fR
-.RS 4
-The builder belongs to
-msgmerge
-tool\&. The builder updates
-PO
-files with
-\fBmsgmerge(1)\fR, or initializes missing
-PO
-files as described in documentation of
-msginit
-tool and
-\fBPOInit\fR
-builder (see also
-\fB$POAUTOINIT\fR)\&. Note, that
-\fBPOUpdate\fR
-\fIdoes not add its targets to \fR\fIpo\-create\fR\fI alias\fR
-as
-\fBPOInit\fR
-does\&.
-.sp
-Target nodes defined through
-\fBPOUpdate\fR
-are not built by default (they\*(Aqre
-Ignored from
-\*(Aq\&.\*(Aq
-node)\&. Instead, they are added automatically to special
-Alias
-(\*(Aqpo\-update\*(Aq
-by default)\&. The alias name may be changed through the
-\fB$POUPDATE_ALIAS\fR
-construction variable\&. You can easilly update
-PO
-files in your project by
-\fBscons po\-update\fR\&.
-.sp
-
-\fIExample 1\&.\fR
-Update
-en\&.po
-and
-pl\&.po
-from
-messages\&.pot
-template (see also
-\fB$POTDOMAIN\fR), assuming that the later one exists or there is rule to build it (see
-\fBPOTUpdate\fR):
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
- # \&.\&.\&.
- env\&.POUpdate([\*(Aqen\*(Aq,\*(Aqpl\*(Aq]) # messages\&.pot \-\-> [en\&.po, pl\&.po]
-.fi
-.if n \{\
-.RE
-.\}
-.sp
-
-\fIExample 2\&.\fR
-Update
-en\&.po
-and
-pl\&.po
-from
-foo\&.pot
-template:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
- # \&.\&.\&.
- env\&.POUpdate([\*(Aqen\*(Aq, \*(Aqpl\*(Aq], [\*(Aqfoo\*(Aq]) # foo\&.pot \-\-> [en\&.po, pl\&.pl]
-.fi
-.if n \{\
-.RE
-.\}
-.sp
-
-\fIExample 3\&.\fR
-Update
-en\&.po
-and
-pl\&.po
-from
-foo\&.pot
-(another version):
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
- # \&.\&.\&.
- env\&.POUpdate([\*(Aqen\*(Aq, \*(Aqpl\*(Aq], POTDOMAIN=\*(Aqfoo\*(Aq) # foo\&.pot \-\- > [en\&.po, pl\&.pl]
-.fi
-.if n \{\
-.RE
-.\}
-.sp
-
-\fIExample 4\&.\fR
-Update files for languages defined in
-LINGUAS
-file\&. The files are updated from
-messages\&.pot
-template:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
- # \&.\&.\&.
- env\&.POUpdate(LINGUAS_FILE = 1) # needs \*(AqLINGUAS\*(Aq file
-.fi
-.if n \{\
-.RE
-.\}
-.sp
-
-\fIExample 5\&.\fR
-Same as above, but update from
-foo\&.pot
-template:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
- # \&.\&.\&.
- env\&.POUpdate(LINGUAS_FILE = 1, source = [\*(Aqfoo\*(Aq])
-.fi
-.if n \{\
-.RE
-.\}
-.sp
-
-\fIExample 6\&.\fR
-Update
-en\&.po
-and
-pl\&.po
-plus files for languages defined in
-LINGUAS
-file\&. The files are updated from
-messages\&.pot
-template:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
- # produce \*(Aqen\&.po\*(Aq, \*(Aqpl\&.po\*(Aq + files defined in \*(AqLINGUAS\*(Aq:
- env\&.POUpdate([\*(Aqen\*(Aq, \*(Aqpl\*(Aq ], LINGUAS_FILE = 1)
-.fi
-.if n \{\
-.RE
-.\}
-.sp
-
-\fIExample 7\&.\fR
-Use
-\fB$POAUTOINIT\fR
-to automatically initialize
-PO
-file if it doesn\*(Aqt exist:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
- # \&.\&.\&.
- env\&.POUpdate(LINGUAS_FILE = 1, POAUTOINIT = 1)
-.fi
-.if n \{\
-.RE
-.\}
-.sp
-
-\fIExample 8\&.\fR
-Update
-PO
-files for languages defined in
-LINGUAS
-file\&. The files are updated from
-foo\&.pot
-template\&. All necessary settings are pre\-configured via environment\&.
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
- # \&.\&.\&.
- env[\*(AqPOAUTOINIT\*(Aq] = 1
- env[\*(AqLINGUAS_FILE\*(Aq] = 1
- env[\*(AqPOTDOMAIN\*(Aq] = \*(Aqfoo\*(Aq
- env\&.POUpdate()
-.fi
-.if n \{\
-.RE
-.\}
-.RE
-.PP
-\fBProgram()\fR, \fBenv\&.Program()\fR
-.RS 4
-Builds an executable given one or more object files or C, C++, D, or Fortran source files\&. If any C, C++, D or Fortran source files are specified, then they will be automatically compiled to object files using the
-\fBObject\fR
-builder method; see that builder method\*(Aqs description for a list of legal source file suffixes and how they are interpreted\&. The target executable file prefix (specified by the
-\fB$PROGPREFIX\fR
-construction variable; nothing by default) and suffix (specified by the
-\fB$PROGSUFFIX\fR
-construction variable; by default,
-\&.exe
-on Windows systems, nothing on POSIX systems) are automatically added to the target if not already present\&. Example:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-env\&.Program(target = \*(Aqfoo\*(Aq, source = [\*(Aqfoo\&.o\*(Aq, \*(Aqbar\&.c\*(Aq, \*(Aqbaz\&.f\*(Aq])
-.fi
-.if n \{\
-.RE
-.\}
-.RE
-.PP
-\fBRES()\fR, \fBenv\&.RES()\fR
-.RS 4
-Builds a Microsoft Visual C++ resource file\&. This builder method is only provided when Microsoft Visual C++ or MinGW is being used as the compiler\&. The
-\&.res
-(or
-\&.o
-for MinGW) suffix is added to the target name if no other suffix is given\&. The source file is scanned for implicit dependencies as though it were a C file\&. Example:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-env\&.RES(\*(Aqresource\&.rc\*(Aq)
-.fi
-.if n \{\
-.RE
-.\}
-.RE
-.PP
-\fBRMIC()\fR, \fBenv\&.RMIC()\fR
-.RS 4
-Builds stub and skeleton class files for remote objects from Java
-\&.class
-files\&. The target is a directory relative to which the stub and skeleton class files will be written\&. The source can be the names of
-\&.class
-files, or the objects return from the
-\fBJava\fR
-builder method\&.
-.sp
-If the construction variable
-\fB$JAVACLASSDIR\fR
-is set, either in the environment or in the call to the
-\fBRMIC\fR
-builder method itself, then the value of the variable will be stripped from the beginning of any
-\&.class
-file names\&.
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-classes = env\&.Java(target = \*(Aqclassdir\*(Aq, source = \*(Aqsrc\*(Aq)
-env\&.RMIC(target = \*(Aqoutdir1\*(Aq, source = classes)
-
-env\&.RMIC(target = \*(Aqoutdir2\*(Aq,
- source = [\*(Aqpackage/foo\&.class\*(Aq, \*(Aqpackage/bar\&.class\*(Aq])
-
-env\&.RMIC(target = \*(Aqoutdir3\*(Aq,
- source = [\*(Aqclasses/foo\&.class\*(Aq, \*(Aqclasses/bar\&.class\*(Aq],
- JAVACLASSDIR = \*(Aqclasses\*(Aq)
-.fi
-.if n \{\
-.RE
-.\}
-.RE
-.PP
-\fBRPCGenClient()\fR, \fBenv\&.RPCGenClient()\fR
-.RS 4
-Generates an RPC client stub (_clnt\&.c) file from a specified RPC (\&.x) source file\&. Because rpcgen only builds output files in the local directory, the command will be executed in the source file\*(Aqs directory by default\&.
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-# Builds src/rpcif_clnt\&.c
-env\&.RPCGenClient(\*(Aqsrc/rpcif\&.x\*(Aq)
-.fi
-.if n \{\
-.RE
-.\}
-.RE
-.PP
-\fBRPCGenHeader()\fR, \fBenv\&.RPCGenHeader()\fR
-.RS 4
-Generates an RPC header (\&.h) file from a specified RPC (\&.x) source file\&. Because rpcgen only builds output files in the local directory, the command will be executed in the source file\*(Aqs directory by default\&.
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-# Builds src/rpcif\&.h
-env\&.RPCGenHeader(\*(Aqsrc/rpcif\&.x\*(Aq)
-.fi
-.if n \{\
-.RE
-.\}
-.RE
-.PP
-\fBRPCGenService()\fR, \fBenv\&.RPCGenService()\fR
-.RS 4
-Generates an RPC server\-skeleton (_svc\&.c) file from a specified RPC (\&.x) source file\&. Because rpcgen only builds output files in the local directory, the command will be executed in the source file\*(Aqs directory by default\&.
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-# Builds src/rpcif_svc\&.c
-env\&.RPCGenClient(\*(Aqsrc/rpcif\&.x\*(Aq)
-.fi
-.if n \{\
-.RE
-.\}
-.RE
-.PP
-\fBRPCGenXDR()\fR, \fBenv\&.RPCGenXDR()\fR
-.RS 4
-Generates an RPC XDR routine (_xdr\&.c) file from a specified RPC (\&.x) source file\&. Because rpcgen only builds output files in the local directory, the command will be executed in the source file\*(Aqs directory by default\&.
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-# Builds src/rpcif_xdr\&.c
-env\&.RPCGenClient(\*(Aqsrc/rpcif\&.x\*(Aq)
-.fi
-.if n \{\
-.RE
-.\}
-.RE
-.PP
-\fBSharedLibrary()\fR, \fBenv\&.SharedLibrary()\fR
-.RS 4
-Builds a shared library (\&.so
-on a POSIX system,
-\&.dll
-on Windows) given one or more object files or C, C++, D or Fortran source files\&. If any source files are given, then they will be automatically compiled to object files\&. The static library prefix and suffix (if any) are automatically added to the target\&. The target library file prefix (specified by the
-\fB$SHLIBPREFIX\fR
-construction variable; by default,
-lib
-on POSIX systems, nothing on Windows systems) and suffix (specified by the
-\fB$SHLIBSUFFIX\fR
-construction variable; by default,
-\&.dll
-on Windows systems,
-\&.so
-on POSIX systems) are automatically added to the target if not already present\&. Example:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-env\&.SharedLibrary(target = \*(Aqbar\*(Aq, source = [\*(Aqbar\&.c\*(Aq, \*(Aqfoo\&.o\*(Aq])
-.fi
-.if n \{\
-.RE
-.\}
-.sp
-On Windows systems, the
-\fBSharedLibrary\fR
-builder method will always build an import (\&.lib) library in addition to the shared (\&.dll) library, adding a
-\&.lib
-library with the same basename if there is not already a
-\&.lib
-file explicitly listed in the targets\&.
-.sp
-On Cygwin systems, the
-\fBSharedLibrary\fR
-builder method will always build an import (\&.dll\&.a) library in addition to the shared (\&.dll) library, adding a
-\&.dll\&.a
-library with the same basename if there is not already a
-\&.dll\&.a
-file explicitly listed in the targets\&.
-.sp
-Any object files listed in the
-source
-must have been built for a shared library (that is, using the
-\fBSharedObject\fR
-builder method)\&.
-scons
-will raise an error if there is any mismatch\&.
-.sp
-On some platforms, there is a distinction between a shared library (loaded automatically by the system to resolve external references) and a loadable module (explicitly loaded by user action)\&. For maximum portability, use the
-\fBLoadableModule\fR
-builder for the latter\&.
-.sp
-When the
-\fB$SHLIBVERSION\fR
-construction variable is defined a versioned shared library is created\&. This modifies the
-\fB$SHLINKFLAGS\fR
-as required, adds the version number to the library name, and creates the symlinks that are needed\&.
-\fB$SHLIBVERSION\fR
-needs to be of the form X\&.Y\&.Z, where X and Y are numbers, and Z is a number but can also contain letters to designate alpha, beta, or release candidate patch levels\&.
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-env\&.SharedLibrary(target = \*(Aqbar\*(Aq, source = [\*(Aqbar\&.c\*(Aq, \*(Aqfoo\&.o\*(Aq], SHLIBVERSION=\*(Aq1\&.5\&.2\*(Aq)
-.fi
-.if n \{\
-.RE
-.\}
-.sp
-This builder may create multiple links to the library\&. On a POSIX system, for the shared library libbar\&.so\&.2\&.3\&.1, the links created would be libbar\&.so and libbar\&.so\&.2; on a Darwin (OSX) system the library would be libbar\&.2\&.3\&.1\&.dylib and the link would be libbar\&.dylib\&.
-.sp
-On Windows systems, specifying
-register=1
-will cause the
-\&.dll
-to be registered after it is built using REGSVR32\&. The command that is run ("regsvr32" by default) is determined by
-\fB$REGSVR\fR
-construction variable, and the flags passed are determined by
-\fB$REGSVRFLAGS\fR\&. By default,
-\fB$REGSVRFLAGS\fR
-includes the
-\fB/s\fR
-option, to prevent dialogs from popping up and requiring user attention when it is run\&. If you change
-\fB$REGSVRFLAGS\fR, be sure to include the
-\fB/s\fR
-option\&. For example,
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-env\&.SharedLibrary(target = \*(Aqbar\*(Aq,
- source = [\*(Aqbar\&.cxx\*(Aq, \*(Aqfoo\&.obj\*(Aq],
- register=1)
-.fi
-.if n \{\
-.RE
-.\}
-.sp
-will register
-bar\&.dll
-as a COM object when it is done linking it\&.
-.RE
-.PP
-\fBSharedObject()\fR, \fBenv\&.SharedObject()\fR
-.RS 4
-Builds an object file for inclusion in a shared library\&. Source files must have one of the same set of extensions specified above for the
-\fBStaticObject\fR
-builder method\&. On some platforms building a shared object requires additional compiler option (e\&.g\&.
-\fB\-fPIC\fR
-for gcc) in addition to those needed to build a normal (static) object, but on some platforms there is no difference between a shared object and a normal (static) one\&. When there is a difference, SCons will only allow shared objects to be linked into a shared library, and will use a different suffix for shared objects\&. On platforms where there is no difference, SCons will allow both normal (static) and shared objects to be linked into a shared library, and will use the same suffix for shared and normal (static) objects\&. The target object file prefix (specified by the
-\fB$SHOBJPREFIX\fR
-construction variable; by default, the same as
-\fB$OBJPREFIX\fR) and suffix (specified by the
-\fB$SHOBJSUFFIX\fR
-construction variable) are automatically added to the target if not already present\&. Examples:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-env\&.SharedObject(target = \*(Aqddd\*(Aq, source = \*(Aqddd\&.c\*(Aq)
-env\&.SharedObject(target = \*(Aqeee\&.o\*(Aq, source = \*(Aqeee\&.cpp\*(Aq)
-env\&.SharedObject(target = \*(Aqfff\&.obj\*(Aq, source = \*(Aqfff\&.for\*(Aq)
-.fi
-.if n \{\
-.RE
-.\}
-.sp
-Note that the source files will be scanned according to the suffix mappings in the
-SourceFileScanner
-object\&. See the section "Scanner Objects," below, for more information\&.
-.RE
-.PP
-\fBStaticLibrary()\fR, \fBenv\&.StaticLibrary()\fR
-.RS 4
-Builds a static library given one or more object files or C, C++, D or Fortran source files\&. If any source files are given, then they will be automatically compiled to object files\&. The static library prefix and suffix (if any) are automatically added to the target\&. The target library file prefix (specified by the
-\fB$LIBPREFIX\fR
-construction variable; by default,
-lib
-on POSIX systems, nothing on Windows systems) and suffix (specified by the
-\fB$LIBSUFFIX\fR
-construction variable; by default,
-\&.lib
-on Windows systems,
-\&.a
-on POSIX systems) are automatically added to the target if not already present\&. Example:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-env\&.StaticLibrary(target = \*(Aqbar\*(Aq, source = [\*(Aqbar\&.c\*(Aq, \*(Aqfoo\&.o\*(Aq])
-.fi
-.if n \{\
-.RE
-.\}
-.sp
-Any object files listed in the
-source
-must have been built for a static library (that is, using the
-\fBStaticObject\fR
-builder method)\&.
-scons
-will raise an error if there is any mismatch\&.
-.RE
-.PP
-\fBStaticObject()\fR, \fBenv\&.StaticObject()\fR
-.RS 4
-Builds a static object file from one or more C, C++, D, or Fortran source files\&. Source files must have one of the following extensions:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
- \&.asm assembly language file
- \&.ASM assembly language file
- \&.c C file
- \&.C Windows: C file
- POSIX: C++ file
- \&.cc C++ file
- \&.cpp C++ file
- \&.cxx C++ file
- \&.cxx C++ file
- \&.c++ C++ file
- \&.C++ C++ file
- \&.d D file
- \&.f Fortran file
- \&.F Windows: Fortran file
- POSIX: Fortran file + C pre\-processor
- \&.for Fortran file
- \&.FOR Fortran file
- \&.fpp Fortran file + C pre\-processor
- \&.FPP Fortran file + C pre\-processor
- \&.m Object C file
- \&.mm Object C++ file
- \&.s assembly language file
- \&.S Windows: assembly language file
- ARM: CodeSourcery Sourcery Lite
- \&.sx assembly language file + C pre\-processor
- POSIX: assembly language file + C pre\-processor
- \&.spp assembly language file + C pre\-processor
- \&.SPP assembly language file + C pre\-processor
-.fi
-.if n \{\
-.RE
-.\}
-.sp
-The target object file prefix (specified by the
-\fB$OBJPREFIX\fR
-construction variable; nothing by default) and suffix (specified by the
-\fB$OBJSUFFIX\fR
-construction variable;
-\&.obj
-on Windows systems,
-\&.o
-on POSIX systems) are automatically added to the target if not already present\&. Examples:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-env\&.StaticObject(target = \*(Aqaaa\*(Aq, source = \*(Aqaaa\&.c\*(Aq)
-env\&.StaticObject(target = \*(Aqbbb\&.o\*(Aq, source = \*(Aqbbb\&.c++\*(Aq)
-env\&.StaticObject(target = \*(Aqccc\&.obj\*(Aq, source = \*(Aqccc\&.f\*(Aq)
-.fi
-.if n \{\
-.RE
-.\}
-.sp
-Note that the source files will be scanned according to the suffix mappings in
-SourceFileScanner
-object\&. See the section "Scanner Objects," below, for more information\&.
-.RE
-.PP
-\fBSubstfile()\fR, \fBenv\&.Substfile()\fR
-.RS 4
-The
-\fBSubstfile\fR
-builder creates a single text file from another file or set of files by concatenating them with
-\fB$LINESEPARATOR\fR
-and replacing text using the
-\fB$SUBST_DICT\fR
-construction variable\&. Nested lists of source files are flattened\&. See also
-\fBTextfile\fR\&.
-.sp
-If a single source file is present with an
-\&.in
-suffix, the suffix is stripped and the remainder is used as the default target name\&.
-.sp
-The prefix and suffix specified by the
-\fB$SUBSTFILEPREFIX\fR
-and
-\fB$SUBSTFILESUFFIX\fR
-construction variables (the null string by default in both cases) are automatically added to the target if they are not already present\&.
-.sp
-If a construction variable named
-\fB$SUBST_DICT\fR
-is present, it may be either a Python dictionary or a sequence of (key,value) tuples\&. If it is a dictionary it is converted into a list of tuples in an arbitrary order, so if one key is a prefix of another key or if one substitution could be further expanded by another subsitition, it is unpredictable whether the expansion will occur\&.
-.sp
-Any occurrences of a key in the source are replaced by the corresponding value, which may be a Python callable function or a string\&. If the value is a callable, it is called with no arguments to get a string\&. Strings are
-\fIsubst\fR\-expanded and the result replaces the key\&.
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-env = Environment(tools = [\*(Aqdefault\*(Aq, \*(Aqtextfile\*(Aq])
-
-env[\*(Aqprefix\*(Aq] = \*(Aq/usr/bin\*(Aq
-script_dict = {\*(Aq@prefix@\*(Aq: \*(Aq/bin\*(Aq, @exec_prefix@: \*(Aq$prefix\*(Aq}
-env\&.Substfile(\*(Aqscript\&.in\*(Aq, SUBST_DICT = script_dict)
-
-conf_dict = {\*(Aq%VERSION%\*(Aq: \*(Aq1\&.2\&.3\*(Aq, \*(Aq%BASE%\*(Aq: \*(AqMyProg\*(Aq}
-env\&.Substfile(\*(Aqconfig\&.h\&.in\*(Aq, conf_dict, SUBST_DICT = conf_dict)
-
-# UNPREDICTABLE \- one key is a prefix of another
-bad_foo = {\*(Aq$foo\*(Aq: \*(Aq$foo\*(Aq, \*(Aq$foobar\*(Aq: \*(Aq$foobar\*(Aq}
-env\&.Substfile(\*(Aqfoo\&.in\*(Aq, SUBST_DICT = bad_foo)
-
-# PREDICTABLE \- keys are applied longest first
-good_foo = [(\*(Aq$foobar\*(Aq, \*(Aq$foobar\*(Aq), (\*(Aq$foo\*(Aq, \*(Aq$foo\*(Aq)]
-env\&.Substfile(\*(Aqfoo\&.in\*(Aq, SUBST_DICT = good_foo)
-
-# UNPREDICTABLE \- one substitution could be futher expanded
-bad_bar = {\*(Aq@bar@\*(Aq: \*(Aq@soap@\*(Aq, \*(Aq@soap@\*(Aq: \*(Aqlye\*(Aq}
-env\&.Substfile(\*(Aqbar\&.in\*(Aq, SUBST_DICT = bad_bar)
-
-# PREDICTABLE \- substitutions are expanded in order
-good_bar = ((\*(Aq@bar@\*(Aq, \*(Aq@soap@\*(Aq), (\*(Aq@soap@\*(Aq, \*(Aqlye\*(Aq))
-env\&.Substfile(\*(Aqbar\&.in\*(Aq, SUBST_DICT = good_bar)
-
-# the SUBST_DICT may be in common (and not an override)
-substutions = {}
-subst = Environment(tools = [\*(Aqtextfile\*(Aq], SUBST_DICT = substitutions)
-substitutions[\*(Aq@foo@\*(Aq] = \*(Aqfoo\*(Aq
-subst[\*(AqSUBST_DICT\*(Aq][\*(Aq@bar@\*(Aq] = \*(Aqbar\*(Aq
-subst\&.Substfile(\*(Aqpgm1\&.c\*(Aq, [Value(\*(Aq#include "@foo@\&.h"\*(Aq),
- Value(\*(Aq#include "@bar@\&.h"\*(Aq),
- "common\&.in",
- "pgm1\&.in"
- ])
-subst\&.Substfile(\*(Aqpgm2\&.c\*(Aq, [Value(\*(Aq#include "@foo@\&.h"\*(Aq),
- Value(\*(Aq#include "@bar@\&.h"\*(Aq),
- "common\&.in",
- "pgm2\&.in"
- ])
-
-.fi
-.if n \{\
-.RE
-.\}
-.RE
-.PP
-\fBTar()\fR, \fBenv\&.Tar()\fR
-.RS 4
-Builds a tar archive of the specified files and/or directories\&. Unlike most builder methods, the
-\fBTar\fR
-builder method may be called multiple times for a given target; each additional call adds to the list of entries that will be built into the archive\&. Any source directories will be scanned for changes to any on\-disk files, regardless of whether or not
-scons
-knows about them from other Builder or function calls\&.
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-env\&.Tar(\*(Aqsrc\&.tar\*(Aq, \*(Aqsrc\*(Aq)
-
-# Create the stuff\&.tar file\&.
-env\&.Tar(\*(Aqstuff\*(Aq, [\*(Aqsubdir1\*(Aq, \*(Aqsubdir2\*(Aq])
-# Also add "another" to the stuff\&.tar file\&.
-env\&.Tar(\*(Aqstuff\*(Aq, \*(Aqanother\*(Aq)
-
-# Set TARFLAGS to create a gzip\-filtered archive\&.
-env = Environment(TARFLAGS = \*(Aq\-c \-z\*(Aq)
-env\&.Tar(\*(Aqfoo\&.tar\&.gz\*(Aq, \*(Aqfoo\*(Aq)
-
-# Also set the suffix to \&.tgz\&.
-env = Environment(TARFLAGS = \*(Aq\-c \-z\*(Aq,
- TARSUFFIX = \*(Aq\&.tgz\*(Aq)
-env\&.Tar(\*(Aqfoo\*(Aq)
-.fi
-.if n \{\
-.RE
-.\}
-.RE
-.PP
-\fBTextfile()\fR, \fBenv\&.Textfile()\fR
-.RS 4
-The
-\fBTextfile\fR
-builder generates a single text file\&. The source strings constitute the lines; nested lists of sources are flattened\&.
-\fB$LINESEPARATOR\fR
-is used to separate the strings\&.
-.sp
-If present, the
-\fB$SUBST_DICT\fR
-construction variable is used to modify the strings before they are written; see the
-\fBSubstfile\fR
-description for details\&.
-.sp
-The prefix and suffix specified by the
-\fB$TEXTFILEPREFIX\fR
-and
-\fB$TEXTFILESUFFIX\fR
-construction variables (the null string and
-\&.txt
-by default, respectively) are automatically added to the target if they are not already present\&. Examples:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-# builds/writes foo\&.txt
-env\&.Textfile(target = \*(Aqfoo\&.txt\*(Aq, source = [\*(AqGoethe\*(Aq, 42, \*(AqSchiller\*(Aq])
-
-# builds/writes bar\&.txt
-env\&.Textfile(target = \*(Aqbar\*(Aq,
- source = [\*(Aqlalala\*(Aq, \*(Aqtanteratei\*(Aq],
- LINESEPARATOR=\*(Aq|*\*(Aq)
-
-# nested lists are flattened automatically
-env\&.Textfile(target = \*(Aqblob\*(Aq,
- source = [\*(Aqlalala\*(Aq, [\*(AqGoethe\*(Aq, 42 \*(AqSchiller\*(Aq], \*(Aqtanteratei\*(Aq])
-
-# files may be used as input by wraping them in File()
-env\&.Textfile(target = \*(Aqconcat\*(Aq, # concatenate files with a marker between
- source = [File(\*(Aqconcat1\*(Aq), File(\*(Aqconcat2\*(Aq)],
- LINESEPARATOR = \*(Aq====================\en\*(Aq)
-
-Results are:
-foo\&.txt
- \&.\&.\&.\&.8<\-\-\-\-
- Goethe
- 42
- Schiller
- \&.\&.\&.\&.8<\-\-\-\- (no linefeed at the end)
-
-bar\&.txt:
- \&.\&.\&.\&.8<\-\-\-\-
- lalala|*tanteratei
- \&.\&.\&.\&.8<\-\-\-\- (no linefeed at the end)
-
-blob\&.txt
- \&.\&.\&.\&.8<\-\-\-\-
- lalala
- Goethe
- 42
- Schiller
- tanteratei
- \&.\&.\&.\&.8<\-\-\-\- (no linefeed at the end)
-.fi
-.if n \{\
-.RE
-.\}
-.RE
-.PP
-\fBTranslate()\fR, \fBenv\&.Translate()\fR
-.RS 4
-This pseudo\-builder belongs to
-gettext
-toolset\&. The builder extracts internationalized messages from source files, updates
-POT
-template (if necessary) and then updates
-PO
-translations (if necessary)\&. If
-\fB$POAUTOINIT\fR
-is set, missing
-PO
-files will be automatically created (i\&.e\&. without translator person intervention)\&. The variables
-\fB$LINGUAS_FILE\fR
-and
-\fB$POTDOMAIN\fR
-are taken into acount too\&. All other construction variables used by
-\fBPOTUpdate\fR, and
-\fBPOUpdate\fR
-work here too\&.
-.sp
-
-\fIExample 1\fR\&. The simplest way is to specify input files and output languages inline in a SCons script when invoking
-\fBTranslate\fR
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-# SConscript in \*(Aqpo/\*(Aq directory
-env = Environment( tools = ["default", "gettext"] )
-env[\*(AqPOAUTOINIT\*(Aq] = 1
-env\&.Translate([\*(Aqen\*(Aq,\*(Aqpl\*(Aq], [\*(Aq\&.\&./a\&.cpp\*(Aq,\*(Aq\&.\&./b\&.cpp\*(Aq])
-.fi
-.if n \{\
-.RE
-.\}
-.sp
-
-\fIExample 2\fR\&. If you wish, you may also stick to conventional style known from
-autotools, i\&.e\&. using
-POTFILES\&.in
-and
-LINGUAS
-files
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-# LINGUAS
-en pl
-#end
-.fi
-.if n \{\
-.RE
-.\}
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-# POTFILES\&.in
-a\&.cpp
-b\&.cpp
-# end
-.fi
-.if n \{\
-.RE
-.\}
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-# SConscript
-env = Environment( tools = ["default", "gettext"] )
-env[\*(AqPOAUTOINIT\*(Aq] = 1
-env[\*(AqXGETTEXTPATH\*(Aq] = [\*(Aq\&.\&./\*(Aq]
-env\&.Translate(LINGUAS_FILE = 1, XGETTEXTFROM = \*(AqPOTFILES\&.in\*(Aq)
-.fi
-.if n \{\
-.RE
-.\}
-.sp
-The last approach is perhaps the recommended one\&. It allows easily split internationalization/localization onto separate SCons scripts, where a script in source tree is responsible for translations (from sources to
-PO
-files) and script(s) under variant directories are responsible for compilation of
-PO
-to
-MO
-files to and for installation of
-MO
-files\&. The "gluing factor" synchronizing these two scripts is then the content of
-LINGUAS
-file\&. Note, that the updated
-POT
-and
-PO
-files are usually going to be committed back to the repository, so they must be updated within the source directory (and not in variant directories)\&. Additionaly, the file listing of
-po/
-directory contains
-LINGUAS
-file, so the source tree looks familiar to translators, and they may work with the project in their usual way\&.
-.sp
-
-\fIExample 3\fR\&. Let\*(Aqs prepare a development tree as below
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
- project/
- + SConstruct
- + build/
- + src/
- + po/
- + SConscript
- + SConscript\&.i18n
- + POTFILES\&.in
- + LINGUAS
-.fi
-.if n \{\
-.RE
-.\}
-.sp
-with
-build
-being variant directory\&. Write the top\-level
-SConstruct
-script as follows
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
- # SConstruct
- env = Environment( tools = ["default", "gettext"] )
- VariantDir(\*(Aqbuild\*(Aq, \*(Aqsrc\*(Aq, duplicate = 0)
- env[\*(AqPOAUTOINIT\*(Aq] = 1
- SConscript(\*(Aqsrc/po/SConscript\&.i18n\*(Aq, exports = \*(Aqenv\*(Aq)
- SConscript(\*(Aqbuild/po/SConscript\*(Aq, exports = \*(Aqenv\*(Aq)
-.fi
-.if n \{\
-.RE
-.\}
-.sp
-the
-src/po/SConscript\&.i18n
-as
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
- # src/po/SConscript\&.i18n
- Import(\*(Aqenv\*(Aq)
- env\&.Translate(LINGUAS_FILE=1, XGETTEXTFROM=\*(AqPOTFILES\&.in\*(Aq, XGETTEXTPATH=[\*(Aq\&.\&./\*(Aq])
-.fi
-.if n \{\
-.RE
-.\}
-.sp
-and the
-src/po/SConscript
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
- # src/po/SConscript
- Import(\*(Aqenv\*(Aq)
- env\&.MOFiles(LINGUAS_FILE = 1)
-.fi
-.if n \{\
-.RE
-.\}
-.sp
-Such setup produces
-POT
-and
-PO
-files under source tree in
-src/po/
-and binary
-MO
-files under variant tree in
-build/po/\&. This way the
-POT
-and
-PO
-files are separated from other output files, which must not be committed back to source repositories (e\&.g\&.
-MO
-files)\&.
-.sp
-.if n \{\
-.sp
-.\}
-.RS 4
-.it 1 an-trap
-.nr an-no-space-flag 1
-.nr an-break-flag 1
-.br
-.ps +1
-\fBNote\fR
-.ps -1
-.br
-In above example, the
-PO
-files are not updated, nor created automatically when you issue
-\fBscons \*(Aq\&.\*(Aq\fR
-command\&. The files must be updated (created) by hand via
-\fBscons po\-update\fR
-and then
-MO
-files can be compiled by running
-\fBscons \*(Aq\&.\*(Aq\fR\&.
-.sp .5v
-.RE
-.RE
-.PP
-\fBTypeLibrary()\fR, \fBenv\&.TypeLibrary()\fR
-.RS 4
-Builds a Windows type library (\&.tlb) file from an input IDL file (\&.idl)\&. In addition, it will build the associated inteface stub and proxy source files, naming them according to the base name of the
-\&.idl
-file\&. For example,
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-env\&.TypeLibrary(source="foo\&.idl")
-.fi
-.if n \{\
-.RE
-.\}
-.sp
-Will create
-foo\&.tlb,
-foo\&.h,
-foo_i\&.c,
-foo_p\&.c
-and
-foo_data\&.c
-files\&.
-.RE
-.PP
-\fBUic()\fR, \fBenv\&.Uic()\fR
-.RS 4
-Builds a header file, an implementation file and a moc file from an ui file\&. and returns the corresponding nodes in the above order\&. This builder is only available after using the tool \*(Aqqt\*(Aq\&. Note: you can specify
-\&.ui
-files directly as source files to the
-\fBProgram\fR,
-\fBLibrary\fR
-and
-\fBSharedLibrary\fR
-builders without using this builder\&. Using this builder lets you override the standard naming conventions (be careful: prefixes are always prepended to names of built files; if you don\*(Aqt want prefixes, you may set them to ``)\&. See the
-\fB$QTDIR\fR
-variable for more information\&. Example:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-env\&.Uic(\*(Aqfoo\&.ui\*(Aq) # \-> [\*(Aqfoo\&.h\*(Aq, \*(Aquic_foo\&.cc\*(Aq, \*(Aqmoc_foo\&.cc\*(Aq]
-env\&.Uic(target = Split(\*(Aqinclude/foo\&.h gen/uicfoo\&.cc gen/mocfoo\&.cc\*(Aq),
- source = \*(Aqfoo\&.ui\*(Aq) # \-> [\*(Aqinclude/foo\&.h\*(Aq, \*(Aqgen/uicfoo\&.cc\*(Aq, \*(Aqgen/mocfoo\&.cc\*(Aq]
-.fi
-.if n \{\
-.RE
-.\}
-.RE
-.PP
-\fBZip()\fR, \fBenv\&.Zip()\fR
-.RS 4
-Builds a zip archive of the specified files and/or directories\&. Unlike most builder methods, the
-\fBZip\fR
-builder method may be called multiple times for a given target; each additional call adds to the list of entries that will be built into the archive\&. Any source directories will be scanned for changes to any on\-disk files, regardless of whether or not
-scons
-knows about them from other Builder or function calls\&.
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-env\&.Zip(\*(Aqsrc\&.zip\*(Aq, \*(Aqsrc\*(Aq)
-
-# Create the stuff\&.zip file\&.
-env\&.Zip(\*(Aqstuff\*(Aq, [\*(Aqsubdir1\*(Aq, \*(Aqsubdir2\*(Aq])
-# Also add "another" to the stuff\&.tar file\&.
-env\&.Zip(\*(Aqstuff\*(Aq, \*(Aqanother\*(Aq)
-.fi
-.if n \{\
-.RE
-.\}
-.RE
-.PP
-All targets of builder methods automatically depend on their sources\&. An explicit dependency can be specified using the
-\fBDepends\fR
-method of a construction environment (see below)\&.
-.PP
-In addition,
-\fBscons\fR
-automatically scans source files for various programming languages, so the dependencies do not need to be specified explicitly\&. By default, SCons can C source files, C++ source files, Fortran source files with
-\fB\&.F\fR
-(POSIX systems only),
-\fB\&.fpp,\fR
-or
-\fB\&.FPP\fR
-file extensions, and assembly language files with
-\fB\&.S\fR
-(POSIX systems only),
-\fB\&.spp,\fR
-or
-\fB\&.SPP\fR
-files extensions for C preprocessor dependencies\&. SCons also has default support for scanning D source files, You can also write your own Scanners to add support for additional source file types\&. These can be added to the default Scanner object used by the
-\fBObject\fR(),
-\fBStaticObject\fR(), and
-\fBSharedObject\fR() Builders by adding them to the
-\fBSourceFileScanner\fR
-object\&. See the section "Scanner Objects" below, for more information about defining your own Scanner objects and using the
-\fBSourceFileScanner\fR
-object\&.
-.SS "Methods and Functions to Do Things"
-.PP
-In addition to Builder methods,
-\fBscons\fR
-provides a number of other construction environment methods and global functions to manipulate the build configuration\&.
-.PP
-Usually, a construction environment method and global function with the same name both exist so that you don\*(Aqt have to remember whether to a specific bit of functionality must be called with or without a construction environment\&. In the following list, if you call something as a global function it looks like:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-Function(\fIarguments\fR)
-.fi
-.if n \{\
-.RE
-.\}
-.PP
-and if you call something through a construction environment it looks like:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-env\&.Function(\fIarguments\fR)
-.fi
-.if n \{\
-.RE
-.\}
-.PP
-If you can call the functionality in both ways, then both forms are listed\&.
-.PP
-Global functions may be called from custom Python modules that you import into an SConscript file by adding the following to the Python module:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-from SCons\&.Script import *
-.fi
-.if n \{\
-.RE
-.\}
-.PP
-Except where otherwise noted, the same\-named construction environment method and global function provide the exact same functionality\&. The only difference is that, where appropriate, calling the functionality through a construction environment will substitute construction variables into any supplied strings\&. For example:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-env = Environment(FOO = \*(Aqfoo\*(Aq)
-Default(\*(Aq$FOO\*(Aq)
-env\&.Default(\*(Aq$FOO\*(Aq)
-.fi
-.if n \{\
-.RE
-.\}
-.PP
-In the above example, the first call to the global
-\fBDefault()\fR
-function will actually add a target named
-\fB$FOO\fR
-to the list of default targets, while the second call to the
-\fBenv\&.Default()\fR
-construction environment method will expand the value and add a target named
-\fBfoo\fR
-to the list of default targets\&. For more on construction variable expansion, see the next section on construction variables\&.
-.PP
-Construction environment methods and global functions supported by
-\fBscons\fR
-include:
-.PP
-Action(action, [cmd/str/fun, [var, \&.\&.\&.]] [option=value, \&.\&.\&.]), env\&.Action(action, [cmd/str/fun, [var, \&.\&.\&.]] [option=value, \&.\&.\&.])
-.RS 4
-Creates an Action object for the specified
-\fIaction\fR\&. See the section "Action Objects," below, for a complete explanation of the arguments and behavior\&.
-.sp
-Note that the
-\fBenv\&.Action\fR() form of the invocation will expand construction variables in any argument strings, including the
-\fIaction\fR
-argument, at the time it is called using the construction variables in the
-\fIenv\fR
-construction environment through which
-\fBenv\&.Action\fR() was called\&. The
-\fBAction\fR() form delays all variable expansion until the Action object is actually used\&.
-.RE
-.PP
-AddMethod(object, function, [name]), env\&.AddMethod(function, [name])
-.RS 4
-When called with the
-\fBAddMethod\fR() form, adds the specified
-\fIfunction\fR
-to the specified
-\fIobject\fR
-as the specified method
-\fIname\fR\&. When called with the
-\fBenv\&.AddMethod\fR() form, adds the specified
-\fIfunction\fR
-to the construction environment
-\fIenv\fR
-as the specified method
-\fIname\fR\&. In both cases, if
-\fIname\fR
-is omitted or
-None, the name of the specified
-\fIfunction\fR
-itself is used for the method name\&.
-.sp
-Examples:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-# Note that the first argument to the function to
-# be attached as a method must be the object through
-# which the method will be called; the Python
-# convention is to call it \*(Aqself\*(Aq\&.
-def my_method(self, arg):
- print "my_method() got", arg
-
-# Use the global AddMethod() function to add a method
-# to the Environment class\&. This
-AddMethod(Environment, my_method)
-env = Environment()
-env\&.my_method(\*(Aqarg\*(Aq)
-
-# Add the function as a method, using the function
-# name for the method call\&.
-env = Environment()
-env\&.AddMethod(my_method, \*(Aqother_method_name\*(Aq)
-env\&.other_method_name(\*(Aqanother arg\*(Aq)
-.fi
-.if n \{\
-.RE
-.\}
-.RE
-.PP
-AddOption(arguments)
-.RS 4
-This function adds a new command\-line option to be recognized\&. The specified
-\fIarguments\fR
-are the same as supported by the standard Python
-\fBoptparse\&.add_option\fR() method (with a few additional capabilities noted below); see the documentation for
-optparse
-for a thorough discussion of its option\-processing capabities\&.
-.sp
-In addition to the arguments and values supported by the
-\fBoptparse\&.add_option\fR() method, the SCons
-\fBAddOption\fR
-function allows you to set the
-nargs
-keyword value to
-\*(Aq?\*(Aq
-(a string with just the question mark) to indicate that the specified long option(s) take(s) an
-\fIoptional\fR
-argument\&. When
-nargs = \*(Aq?\*(Aq
-is passed to the
-\fBAddOption\fR
-function, the
-const
-keyword argument may be used to supply the "default" value that should be used when the option is specified on the command line without an explicit argument\&.
-.sp
-If no
-default=
-keyword argument is supplied when calling
-\fBAddOption\fR, the option will have a default value of
-None\&.
-.sp
-Once a new command\-line option has been added with
-\fBAddOption\fR, the option value may be accessed using
-\fBGetOption\fR
-or
-\fBenv\&.GetOption\fR()\&. The value may also be set, using
-\fBSetOption\fR
-or
-\fBenv\&.SetOption\fR(), if conditions in a
-SConscript
-require overriding any default value\&. Note, however, that a value specified on the command line will
-\fIalways\fR
-override a value set by any SConscript file\&.
-.sp
-Any specified
-help=
-strings for the new option(s) will be displayed by the
-\fB\-H\fR
-or
-\fB\-h\fR
-options (the latter only if no other help text is specified in the SConscript files)\&. The help text for the local options specified by
-\fBAddOption\fR
-will appear below the SCons options themselves, under a separate
-Local Options
-heading\&. The options will appear in the help text in the order in which the
-\fBAddOption\fR
-calls occur\&.
-.sp
-Example:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-AddOption(\*(Aq\-\-prefix\*(Aq,
- dest=\*(Aqprefix\*(Aq,
- nargs=1, type=\*(Aqstring\*(Aq,
- action=\*(Aqstore\*(Aq,
- metavar=\*(AqDIR\*(Aq,
- help=\*(Aqinstallation prefix\*(Aq)
-env = Environment(PREFIX = GetOption(\*(Aqprefix\*(Aq))
-.fi
-.if n \{\
-.RE
-.\}
-.RE
-.PP
-AddPostAction(target, action), env\&.AddPostAction(target, action)
-.RS 4
-Arranges for the specified
-\fIaction\fR
-to be performed after the specified
-\fItarget\fR
-has been built\&. The specified action(s) may be an Action object, or anything that can be converted into an Action object (see below)\&.
-.sp
-When multiple targets are supplied, the action may be called multiple times, once after each action that generates one or more targets in the list\&.
-.RE
-.PP
-AddPreAction(target, action), env\&.AddPreAction(target, action)
-.RS 4
-Arranges for the specified
-\fIaction\fR
-to be performed before the specified
-\fItarget\fR
-is built\&. The specified action(s) may be an Action object, or anything that can be converted into an Action object (see below)\&.
-.sp
-When multiple targets are specified, the action(s) may be called multiple times, once before each action that generates one or more targets in the list\&.
-.sp
-Note that if any of the targets are built in multiple steps, the action will be invoked just before the "final" action that specifically generates the specified target(s)\&. For example, when building an executable program from a specified source
-\&.c
-file via an intermediate object file:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-foo = Program(\*(Aqfoo\&.c\*(Aq)
-AddPreAction(foo, \*(Aqpre_action\*(Aq)
-.fi
-.if n \{\
-.RE
-.\}
-.sp
-The specified
-pre_action
-would be executed before
-scons
-calls the link command that actually generates the executable program binary
-foo, not before compiling the
-foo\&.c
-file into an object file\&.
-.RE
-.PP
-Alias(alias, [targets, [action]]), env\&.Alias(alias, [targets, [action]])
-.RS 4
-Creates one or more phony targets that expand to one or more other targets\&. An optional
-\fIaction\fR
-(command) or list of actions can be specified that will be executed whenever the any of the alias targets are out\-of\-date\&. Returns the Node object representing the alias, which exists outside of any file system\&. This Node object, or the alias name, may be used as a dependency of any other target, including another alias\&.
-\fBAlias\fR
-can be called multiple times for the same alias to add additional targets to the alias, or additional actions to the list for this alias\&.
-.sp
-Examples:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-Alias(\*(Aqinstall\*(Aq)
-Alias(\*(Aqinstall\*(Aq, \*(Aq/usr/bin\*(Aq)
-Alias([\*(Aqinstall\*(Aq, \*(Aqinstall\-lib\*(Aq], \*(Aq/usr/local/lib\*(Aq)
-
-env\&.Alias(\*(Aqinstall\*(Aq, [\*(Aq/usr/local/bin\*(Aq, \*(Aq/usr/local/lib\*(Aq])
-env\&.Alias(\*(Aqinstall\*(Aq, [\*(Aq/usr/local/man\*(Aq])
-
-env\&.Alias(\*(Aqupdate\*(Aq, [\*(Aqfile1\*(Aq, \*(Aqfile2\*(Aq], "update_database $SOURCES")
-.fi
-.if n \{\
-.RE
-.\}
-.RE
-.PP
-AllowSubstExceptions([exception, \&.\&.\&.])
-.RS 4
-Specifies the exceptions that will be allowed when expanding construction variables\&. By default, any construction variable expansions that generate a
-NameError
-or
-IndexError
-exception will expand to a
-\*(Aq\*(Aq
-(a null string) and not cause scons to fail\&. All exceptions not in the specified list will generate an error message and terminate processing\&.
-.sp
-If
-\fBAllowSubstExceptions\fR
-is called multiple times, each call completely overwrites the previous list of allowed exceptions\&.
-.sp
-Example:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-# Requires that all construction variable names exist\&.
-# (You may wish to do this if you want to enforce strictly
-# that all construction variables must be defined before use\&.)
-AllowSubstExceptions()
-
-# Also allow a string containing a zero\-division expansion
-# like \*(Aq${1 / 0}\*(Aq to evalute to \*(Aq\*(Aq\&.
-AllowSubstExceptions(IndexError, NameError, ZeroDivisionError)
-.fi
-.if n \{\
-.RE
-.\}
-.RE
-.PP
-AlwaysBuild(target, \&.\&.\&.), env\&.AlwaysBuild(target, \&.\&.\&.)
-.RS 4
-Marks each given
-\fItarget\fR
-so that it is always assumed to be out of date, and will always be rebuilt if needed\&. Note, however, that
-\fBAlwaysBuild\fR
-does not add its target(s) to the default target list, so the targets will only be built if they are specified on the command line, or are a dependent of a target specified on the command line\-\-but they will
-\fIalways\fR
-be built if so specified\&. Multiple targets can be passed in to a single call to
-\fBAlwaysBuild\fR\&.
-.RE
-.PP
-env\&.Append(key=val, [\&.\&.\&.])
-.RS 4
-Appends the specified keyword arguments to the end of construction variables in the environment\&. If the Environment does not have the specified construction variable, it is simply added to the environment\&. If the values of the construction variable and the keyword argument are the same type, then the two values will be simply added together\&. Otherwise, the construction variable and the value of the keyword argument are both coerced to lists, and the lists are added together\&. (See also the Prepend method, below\&.)
-.sp
-Example:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-env\&.Append(CCFLAGS = \*(Aq \-g\*(Aq, FOO = [\*(Aqfoo\&.yyy\*(Aq])
-.fi
-.if n \{\
-.RE
-.\}
-.RE
-.PP
-env\&.AppendENVPath(name, newpath, [envname, sep, delete_existing])
-.RS 4
-This appends new path elements to the given path in the specified external environment (ENV
-by default)\&. This will only add any particular path once (leaving the last one it encounters and ignoring the rest, to preserve path order), and to help assure this, will normalize all paths (using
-\fBos\&.path\&.normpath\fR
-and
-\fBos\&.path\&.normcase\fR)\&. This can also handle the case where the given old path variable is a list instead of a string, in which case a list will be returned instead of a string\&.
-.sp
-If
-\fIdelete_existing\fR
-is 0, then adding a path that already exists will not move it to the end; it will stay where it is in the list\&.
-.sp
-Example:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-print \*(Aqbefore:\*(Aq,env[\*(AqENV\*(Aq][\*(AqINCLUDE\*(Aq]
-include_path = \*(Aq/foo/bar:/foo\*(Aq
-env\&.AppendENVPath(\*(AqINCLUDE\*(Aq, include_path)
-print \*(Aqafter:\*(Aq,env[\*(AqENV\*(Aq][\*(AqINCLUDE\*(Aq]
-
-yields:
-before: /foo:/biz
-after: /biz:/foo/bar:/foo
-.fi
-.if n \{\
-.RE
-.\}
-.RE
-.PP
-env\&.AppendUnique(key=val, [\&.\&.\&.], delete_existing=0)
-.RS 4
-Appends the specified keyword arguments to the end of construction variables in the environment\&. If the Environment does not have the specified construction variable, it is simply added to the environment\&. If the construction variable being appended to is a list, then any value(s) that already exist in the construction variable will
-\fInot\fR
-be added again to the list\&. However, if delete_existing is 1, existing matching values are removed first, so existing values in the arg list move to the end of the list\&.
-.sp
-Example:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-env\&.AppendUnique(CCFLAGS = \*(Aq\-g\*(Aq, FOO = [\*(Aqfoo\&.yyy\*(Aq])
-.fi
-.if n \{\
-.RE
-.\}
-.RE
-.PP
-env\&.BitKeeper()
-.RS 4
-A factory function that returns a Builder object to be used to fetch source files using BitKeeper\&. The returned Builder is intended to be passed to the
-\fBSourceCode\fR
-function\&.
-.sp
-This function is deprecated\&. For details, see the entry for the
-\fBSourceCode\fR
-function\&.
-.sp
-Example:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-env\&.SourceCode(\*(Aq\&.\*(Aq, env\&.BitKeeper())
-.fi
-.if n \{\
-.RE
-.\}
-.RE
-.PP
-BuildDir(build_dir, src_dir, [duplicate]), env\&.BuildDir(build_dir, src_dir, [duplicate])
-.RS 4
-Deprecated synonyms for
-\fBVariantDir\fR
-and
-\fBenv\&.VariantDir\fR()\&. The
-\fIbuild_dir\fR
-argument becomes the
-\fIvariant_dir\fR
-argument of
-\fBVariantDir\fR
-or
-\fBenv\&.VariantDir\fR()\&.
-.RE
-.PP
-Builder(action, [arguments]), env\&.Builder(action, [arguments])
-.RS 4
-Creates a Builder object for the specified
-\fIaction\fR\&. See the section "Builder Objects," below, for a complete explanation of the arguments and behavior\&.
-.sp
-Note that the
-\fBenv\&.Builder\fR() form of the invocation will expand construction variables in any arguments strings, including the
-\fIaction\fR
-argument, at the time it is called using the construction variables in the
-\fIenv\fR
-construction environment through which
-\fBenv\&.Builder\fR() was called\&. The
-\fBBuilder\fR
-form delays all variable expansion until after the Builder object is actually called\&.
-.RE
-.PP
-CacheDir(cache_dir), env\&.CacheDir(cache_dir)
-.RS 4
-Specifies that
-scons
-will maintain a cache of derived files in
-\fIcache_dir\fR\&. The derived files in the cache will be shared among all the builds using the same
-\fBCacheDir\fR
-call\&. Specifying a
-\fIcache_dir\fR
-of
-None
-disables derived file caching\&.
-.sp
-Calling
-\fBenv\&.CacheDir\fR() will only affect targets built through the specified construction environment\&. Calling
-\fBCacheDir\fR
-sets a global default that will be used by all targets built through construction environments that do
-\fInot\fR
-have an
-\fBenv\&.CacheDir\fR() specified\&.
-.sp
-When a
-\fBCacheDir\fR() is being used and
-scons
-finds a derived file that needs to be rebuilt, it will first look in the cache to see if a derived file has already been built from identical input files and an identical build action (as incorporated into the MD5 build signature)\&. If so,
-scons
-will retrieve the file from the cache\&. If the derived file is not present in the cache,
-scons
-will rebuild it and then place a copy of the built file in the cache (identified by its MD5 build signature), so that it may be retrieved by other builds that need to build the same derived file from identical inputs\&.
-.sp
-Use of a specified
-\fBCacheDir\fR
-may be disabled for any invocation by using the
-\fB\-\-cache\-disable\fR
-option\&.
-.sp
-If the
-\fB\-\-cache\-force\fR
-option is used,
-scons
-will place a copy of
-\fIall\fR
-derived files in the cache, even if they already existed and were not built by this invocation\&. This is useful to populate a cache the first time
-\fBCacheDir\fR
-is added to a build, or after using the
-\fB\-\-cache\-disable\fR
-option\&.
-.sp
-When using
-\fBCacheDir\fR,
-scons
-will report, "Retrieved `file\*(Aq from cache," unless the
-\fB\-\-cache\-show\fR
-option is being used\&. When the
-\fB\-\-cache\-show\fR
-option is used,
-scons
-will print the action that
-\fIwould\fR
-have been used to build the file, without any indication that the file was actually retrieved from the cache\&. This is useful to generate build logs that are equivalent regardless of whether a given derived file has been built in\-place or retrieved from the cache\&.
-.sp
-The
-\fBNoCache\fR
-method can be used to disable caching of specific files\&. This can be useful if inputs and/or outputs of some tool are impossible to predict or prohibitively large\&.
-.RE
-.PP
-Clean(targets, files_or_dirs), env\&.Clean(targets, files_or_dirs)
-.RS 4
-This specifies a list of files or directories which should be removed whenever the targets are specified with the
-\fB\-c\fR
-command line option\&. The specified targets may be a list or an individual target\&. Multiple calls to
-\fBClean\fR
-are legal, and create new targets or add files and directories to the clean list for the specified targets\&.
-.sp
-Multiple files or directories should be specified either as separate arguments to the
-\fBClean\fR
-method, or as a list\&.
-\fBClean\fR
-will also accept the return value of any of the construction environment Builder methods\&. Examples:
-.sp
-The related
-\fBNoClean\fR
-function overrides calling
-\fBClean\fR
-for the same target, and any targets passed to both functions will
-\fInot\fR
-be removed by the
-\fB\-c\fR
-option\&.
-.sp
-Examples:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-Clean(\*(Aqfoo\*(Aq, [\*(Aqbar\*(Aq, \*(Aqbaz\*(Aq])
-Clean(\*(Aqdist\*(Aq, env\&.Program(\*(Aqhello\*(Aq, \*(Aqhello\&.c\*(Aq))
-Clean([\*(Aqfoo\*(Aq, \*(Aqbar\*(Aq], \*(Aqsomething_else_to_clean\*(Aq)
-.fi
-.if n \{\
-.RE
-.\}
-.sp
-In this example, installing the project creates a subdirectory for the documentation\&. This statement causes the subdirectory to be removed if the project is deinstalled\&.
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-Clean(docdir, os\&.path\&.join(docdir, projectname))
-.fi
-.if n \{\
-.RE
-.\}
-.RE
-.PP
-env\&.Clone([key=val, \&.\&.\&.])
-.RS 4
-Returns a separate copy of a construction environment\&. If there are any keyword arguments specified, they are added to the returned copy, overwriting any existing values for the keywords\&.
-.sp
-Example:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-env2 = env\&.Clone()
-env3 = env\&.Clone(CCFLAGS = \*(Aq\-g\*(Aq)
-.fi
-.if n \{\
-.RE
-.\}
-.sp
-Additionally, a list of tools and a toolpath may be specified, as in the Environment constructor:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-def MyTool(env): env[\*(AqFOO\*(Aq] = \*(Aqbar\*(Aq
-env4 = env\&.Clone(tools = [\*(Aqmsvc\*(Aq, MyTool])
-.fi
-.if n \{\
-.RE
-.\}
-.sp
-The
-\fIparse_flags\fR
-keyword argument is also recognized:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-# create an environment for compiling programs that use wxWidgets
-wx_env = env\&.Clone(parse_flags = \*(Aq!wx\-config \-\-cflags \-\-cxxflags\*(Aq)
-.fi
-.if n \{\
-.RE
-.\}
-.RE
-.PP
-Command(target, source, action, [key=val, \&.\&.\&.]), env\&.Command(target, source, action, [key=val, \&.\&.\&.])
-.RS 4
-Executes a specific action (or list of actions) to build a target file or files\&. This is more convenient than defining a separate Builder object for a single special\-case build\&.
-.sp
-As a special case, the
-\fIsource_scanner\fR
-keyword argument can be used to specify a Scanner object that will be used to scan the sources\&. (The global
-DirScanner
-object can be used if any of the sources will be directories that must be scanned on\-disk for changes to files that aren\*(Aqt already specified in other Builder of function calls\&.)
-.sp
-Any other keyword arguments specified override any same\-named existing construction variables\&.
-.sp
-An action can be an external command, specified as a string, or a callable Python object; see "Action Objects," below, for more complete information\&. Also note that a string specifying an external command may be preceded by an
-@
-(at\-sign) to suppress printing the command in question, or by a
-\-
-(hyphen) to ignore the exit status of the external command\&.
-.sp
-Examples:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-env\&.Command(\*(Aqfoo\&.out\*(Aq, \*(Aqfoo\&.in\*(Aq,
- "$FOO_BUILD < $SOURCES > $TARGET")
-
-env\&.Command(\*(Aqbar\&.out\*(Aq, \*(Aqbar\&.in\*(Aq,
- ["rm \-f $TARGET",
- "$BAR_BUILD < $SOURCES > $TARGET"],
- ENV = {\*(AqPATH\*(Aq : \*(Aq/usr/local/bin/\*(Aq})
-
-def rename(env, target, source):
- import os
- os\&.rename(\*(Aq\&.tmp\*(Aq, str(target[0]))
-
-env\&.Command(\*(Aqbaz\&.out\*(Aq, \*(Aqbaz\&.in\*(Aq,
- ["$BAZ_BUILD < $SOURCES > \&.tmp",
- rename ])
-.fi
-.if n \{\
-.RE
-.\}
-.sp
-Note that the
-\fBCommand\fR
-function will usually assume, by default, that the specified targets and/or sources are Files, if no other part of the configuration identifies what type of entry it is\&. If necessary, you can explicitly specify that targets or source nodes should be treated as directoriese by using the
-\fBDir\fR
-or
-\fBenv\&.Dir\fR() functions\&.
-.sp
-Examples:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-env\&.Command(\*(Aqddd\&.list\*(Aq, Dir(\*(Aqddd\*(Aq), \*(Aqls \-l $SOURCE > $TARGET\*(Aq)
-
-env[\*(AqDISTDIR\*(Aq] = \*(Aqdestination/directory\*(Aq
-env\&.Command(env\&.Dir(\*(Aq$DISTDIR\*(Aq)), None, make_distdir)
-.fi
-.if n \{\
-.RE
-.\}
-.sp
-(Also note that SCons will usually automatically create any directory necessary to hold a target file, so you normally don\*(Aqt need to create directories by hand\&.)
-.RE
-.PP
-Configure(env, [custom_tests, conf_dir, log_file, config_h]), env\&.Configure([custom_tests, conf_dir, log_file, config_h])
-.RS 4
-Creates a Configure object for integrated functionality similar to GNU autoconf\&. See the section "Configure Contexts," below, for a complete explanation of the arguments and behavior\&.
-.RE
-.PP
-env\&.Copy([key=val, \&.\&.\&.])
-.RS 4
-A now\-deprecated synonym for
-\fBenv\&.Clone\fR()\&.
-.RE
-.PP
-env\&.CVS(repository, module)
-.RS 4
-A factory function that returns a Builder object to be used to fetch source files from the specified CVS
-\fIrepository\fR\&. The returned Builder is intended to be passed to the
-\fBSourceCode\fR
-function\&.
-.sp
-This function is deprecated\&. For details, see the entry for the
-\fBSourceCode\fR
-function\&.
-.sp
-The optional specified
-\fImodule\fR
-will be added to the beginning of all repository path names; this can be used, in essence, to strip initial directory names from the repository path names, so that you only have to replicate part of the repository directory hierarchy in your local build directory\&.
-.sp
-Examples:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-# Will fetch foo/bar/src\&.c
-# from /usr/local/CVSROOT/foo/bar/src\&.c\&.
-env\&.SourceCode(\*(Aq\&.\*(Aq, env\&.CVS(\*(Aq/usr/local/CVSROOT\*(Aq))
-
-# Will fetch bar/src\&.c
-# from /usr/local/CVSROOT/foo/bar/src\&.c\&.
-env\&.SourceCode(\*(Aq\&.\*(Aq, env\&.CVS(\*(Aq/usr/local/CVSROOT\*(Aq, \*(Aqfoo\*(Aq))
-
-# Will fetch src\&.c
-# from /usr/local/CVSROOT/foo/bar/src\&.c\&.
-env\&.SourceCode(\*(Aq\&.\*(Aq, env\&.CVS(\*(Aq/usr/local/CVSROOT\*(Aq, \*(Aqfoo/bar\*(Aq))
-.fi
-.if n \{\
-.RE
-.\}
-.RE
-.PP
-Decider(function), env\&.Decider(function)
-.RS 4
-Specifies that all up\-to\-date decisions for targets built through this construction environment will be handled by the specified
-\fIfunction\fR\&. The
-\fIfunction\fR
-can be one of the following strings that specify the type of decision function to be performed:
-.PP
-timestamp\-newer
-.RS 4
-Specifies that a target shall be considered out of date and rebuilt if the dependency\*(Aqs timestamp is newer than the target file\*(Aqs timestamp\&. This is the behavior of the classic Make utility, and
-make
-can be used a synonym for
-timestamp\-newer\&.
-.RE
-.PP
-timestamp\-match
-.RS 4
-Specifies that a target shall be considered out of date and rebuilt if the dependency\*(Aqs timestamp is different than the timestamp recorded the last time the target was built\&. This provides behavior very similar to the classic Make utility (in particular, files are not opened up so that their contents can be checksummed) except that the target will also be rebuilt if a dependency file has been restored to a version with an
-\fIearlier\fR
-timestamp, such as can happen when restoring files from backup archives\&.
-.RE
-.PP
-MD5
-.RS 4
-Specifies that a target shall be considered out of date and rebuilt if the dependency\*(Aqs content has changed sine the last time the target was built, as determined be performing an MD5 checksum on the dependency\*(Aqs contents and comparing it to the checksum recorded the last time the target was built\&.
-content
-can be used as a synonym for
-MD5\&.
-.RE
-.PP
-MD5\-timestamp
-.RS 4
-Specifies that a target shall be considered out of date and rebuilt if the dependency\*(Aqs content has changed sine the last time the target was built, except that dependencies with a timestamp that matches the last time the target was rebuilt will be assumed to be up\-to\-date and
-\fInot\fR
-rebuilt\&. This provides behavior very similar to the
-MD5
-behavior of always checksumming file contents, with an optimization of not checking the contents of files whose timestamps haven\*(Aqt changed\&. The drawback is that SCons will
-\fInot\fR
-detect if a file\*(Aqs content has changed but its timestamp is the same, as might happen in an automated script that runs a build, updates a file, and runs the build again, all within a single second\&.
-.RE
-.sp
-Examples:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-# Use exact timestamp matches by default\&.
-Decider(\*(Aqtimestamp\-match\*(Aq)
-
-# Use MD5 content signatures for any targets built
-# with the attached construction environment\&.
-env\&.Decider(\*(Aqcontent\*(Aq)
-.fi
-.if n \{\
-.RE
-.\}
-.sp
-In addition to the above already\-available functions, the
-\fIfunction\fR
-argument may be an actual Python function that takes the following three arguments:
-.PP
-\fIdependency\fR
-.RS 4
-The Node (file) which should cause the
-\fItarget\fR
-to be rebuilt if it has "changed" since the last tme
-\fItarget\fR
-was built\&.
-.RE
-.PP
-\fItarget\fR
-.RS 4
-The Node (file) being built\&. In the normal case, this is what should get rebuilt if the
-\fIdependency\fR
-has "changed\&."
-.RE
-.PP
-\fIprev_ni\fR
-.RS 4
-Stored information about the state of the
-\fIdependency\fR
-the last time the
-\fItarget\fR
-was built\&. This can be consulted to match various file characteristics such as the timestamp, size, or content signature\&.
-.RE
-.sp
-The
-\fIfunction\fR
-should return a
-True
-(non\-zero) value if the
-\fIdependency\fR
-has "changed" since the last time the
-\fItarget\fR
-was built (indicating that the target
-\fIshould\fR
-be rebuilt), and
-False
-(zero) otherwise (indicating that the target should
-\fInot\fR
-be rebuilt)\&. Note that the decision can be made using whatever criteria are appopriate\&. Ignoring some or all of the function arguments is perfectly normal\&.
-.sp
-Example:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-def my_decider(dependency, target, prev_ni):
- return not os\&.path\&.exists(str(target))
-
-env\&.Decider(my_decider)
-.fi
-.if n \{\
-.RE
-.\}
-.RE
-.PP
-Default(targets), env\&.Default(targets)
-.RS 4
-This specifies a list of default targets, which will be built by
-scons
-if no explicit targets are given on the command line\&. Multiple calls to
-\fBDefault\fR
-are legal, and add to the list of default targets\&.
-.sp
-Multiple targets should be specified as separate arguments to the
-\fBDefault\fR
-method, or as a list\&.
-\fBDefault\fR
-will also accept the Node returned by any of a construction environment\*(Aqs builder methods\&.
-.sp
-Examples:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-Default(\*(Aqfoo\*(Aq, \*(Aqbar\*(Aq, \*(Aqbaz\*(Aq)
-env\&.Default([\*(Aqa\*(Aq, \*(Aqb\*(Aq, \*(Aqc\*(Aq])
-hello = env\&.Program(\*(Aqhello\*(Aq, \*(Aqhello\&.c\*(Aq)
-env\&.Default(hello)
-.fi
-.if n \{\
-.RE
-.\}
-.sp
-An argument to
-\fBDefault\fR
-of
-None
-will clear all default targets\&. Later calls to
-\fBDefault\fR
-will add to the (now empty) default\-target list like normal\&.
-.sp
-The current list of targets added using the
-\fBDefault\fR
-function or method is available in the
-DEFAULT_TARGETS
-list; see below\&.
-.RE
-.PP
-DefaultEnvironment([args])
-.RS 4
-Creates and returns a default construction environment object\&. This construction environment is used internally by SCons in order to execute many of the global functions in this list, and to fetch source files transparently from source code management systems\&.
-.RE
-.PP
-Depends(target, dependency), env\&.Depends(target, dependency)
-.RS 4
-Specifies an explicit dependency; the
-\fItarget\fR
-will be rebuilt whenever the
-\fIdependency\fR
-has changed\&. Both the specified
-\fItarget\fR
-and
-\fIdependency\fR
-can be a string (usually the path name of a file or directory) or Node objects, or a list of strings or Node objects (such as returned by a Builder call)\&. This should only be necessary for cases where the dependency is not caught by a Scanner for the file\&.
-.sp
-Example:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-env\&.Depends(\*(Aqfoo\*(Aq, \*(Aqother\-input\-file\-for\-foo\*(Aq)
-
-mylib = env\&.Library(\*(Aqmylib\&.c\*(Aq)
-installed_lib = env\&.Install(\*(Aqlib\*(Aq, mylib)
-bar = env\&.Program(\*(Aqbar\&.c\*(Aq)
-
-# Arrange for the library to be copied into the installation
-# directory before trying to build the "bar" program\&.
-# (Note that this is for example only\&. A "real" library
-# dependency would normally be configured through the $LIBS
-# and $LIBPATH variables, not using an env\&.Depends() call\&.)
-
-env\&.Depends(bar, installed_lib)
-.fi
-.if n \{\
-.RE
-.\}
-.RE
-.PP
-env\&.Dictionary([vars])
-.RS 4
-Returns a dictionary object containing copies of all of the construction variables in the environment\&. If there are any variable names specified, only the specified construction variables are returned in the dictionary\&.
-.sp
-Example:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-dict = env\&.Dictionary()
-cc_dict = env\&.Dictionary(\*(AqCC\*(Aq, \*(AqCCFLAGS\*(Aq, \*(AqCCCOM\*(Aq)
-.fi
-.if n \{\
-.RE
-.\}
-.RE
-.PP
-Dir(name, [directory]), env\&.Dir(name, [directory])
-.RS 4
-This returns a Directory Node, an object that represents the specified directory
-\fIname\fR\&.
-\fIname\fR
-can be a relative or absolute path\&.
-\fIdirectory\fR
-is an optional directory that will be used as the parent directory\&. If no
-\fIdirectory\fR
-is specified, the current script\*(Aqs directory is used as the parent\&.
-.sp
-If
-\fIname\fR
-is a list, SCons returns a list of Dir nodes\&. Construction variables are expanded in
-\fIname\fR\&.
-.sp
-Directory Nodes can be used anywhere you would supply a string as a directory name to a Builder method or function\&. Directory Nodes have attributes and methods that are useful in many situations; see "File and Directory Nodes," below\&.
-.RE
-.PP
-env\&.Dump([key])
-.RS 4
-Returns a pretty printable representation of the environment\&.
-\fIkey\fR, if not
-None, should be a string containing the name of the variable of interest\&.
-.sp
-This SConstruct:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-env=Environment()
-print env\&.Dump(\*(AqCCCOM\*(Aq)
-.fi
-.if n \{\
-.RE
-.\}
-.sp
-will print:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-\*(Aq$CC \-c \-o $TARGET $CCFLAGS $CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS $SOURCES\*(Aq
-.fi
-.if n \{\
-.RE
-.\}
-.sp
-While this SConstruct:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-env=Environment()
-print env\&.Dump()
-.fi
-.if n \{\
-.RE
-.\}
-.sp
-will print:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-{ \*(AqAR\*(Aq: \*(Aqar\*(Aq,
- \*(AqARCOM\*(Aq: \*(Aq$AR $ARFLAGS $TARGET $SOURCES\en$RANLIB $RANLIBFLAGS $TARGET\*(Aq,
- \*(AqARFLAGS\*(Aq: [\*(Aqr\*(Aq],
- \*(AqAS\*(Aq: \*(Aqas\*(Aq,
- \*(AqASCOM\*(Aq: \*(Aq$AS $ASFLAGS \-o $TARGET $SOURCES\*(Aq,
- \*(AqASFLAGS\*(Aq: [],
- \&.\&.\&.
-.fi
-.if n \{\
-.RE
-.\}
-.RE
-.PP
-EnsurePythonVersion(major, minor), env\&.EnsurePythonVersion(major, minor)
-.RS 4
-Ensure that the Python version is at least
-\fImajor\fR\&.\fIminor\fR\&. This function will print out an error message and exit SCons with a non\-zero exit code if the actual Python version is not late enough\&.
-.sp
-Example:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-EnsurePythonVersion(2,2)
-.fi
-.if n \{\
-.RE
-.\}
-.RE
-.PP
-EnsureSConsVersion(major, minor, [revision]), env\&.EnsureSConsVersion(major, minor, [revision])
-.RS 4
-Ensure that the SCons version is at least
-\fImajor\&.minor\fR, or
-\fImajor\&.minor\&.revision\fR\&. if
-\fIrevision\fR
-is specified\&. This function will print out an error message and exit SCons with a non\-zero exit code if the actual SCons version is not late enough\&.
-.sp
-Examples:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-EnsureSConsVersion(0,14)
-
-EnsureSConsVersion(0,96,90)
-.fi
-.if n \{\
-.RE
-.\}
-.RE
-.PP
-Environment([key=value, \&.\&.\&.]), env\&.Environment([key=value, \&.\&.\&.])
-.RS 4
-Return a new construction environment initialized with the specified
-\fIkey\fR=\fIvalue\fR
-pairs\&.
-.RE
-.PP
-Execute(action, [strfunction, varlist]), env\&.Execute(action, [strfunction, varlist])
-.RS 4
-Executes an Action object\&. The specified
-\fIaction\fR
-may be an Action object (see the section "Action Objects," below, for a complete explanation of the arguments and behavior), or it may be a command\-line string, list of commands, or executable Python function, each of which will be converted into an Action object and then executed\&. The exit value of the command or return value of the Python function will be returned\&.
-.sp
-Note that
-scons
-will print an error message if the executed
-\fIaction\fR
-fails\-\-that is, exits with or returns a non\-zero value\&.
-scons
-will
-\fInot\fR, however, automatically terminate the build if the specified
-\fIaction\fR
-fails\&. If you want the build to stop in response to a failed
-\fBExecute\fR
-call, you must explicitly check for a non\-zero return value:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-Execute(Copy(\*(Aqfile\&.out\*(Aq, \*(Aqfile\&.in\*(Aq))
-
-if Execute("mkdir sub/dir/ectory"):
- # The mkdir failed, don\*(Aqt try to build\&.
- Exit(1)
-.fi
-.if n \{\
-.RE
-.\}
-.RE
-.PP
-Exit([value]), env\&.Exit([value])
-.RS 4
-This tells
-scons
-to exit immediately with the specified
-\fIvalue\fR\&. A default exit value of
-0
-(zero) is used if no value is specified\&.
-.RE
-.PP
-Export(vars), env\&.Export(vars)
-.RS 4
-This tells
-scons
-to export a list of variables from the current SConscript file to all other SConscript files\&. The exported variables are kept in a global collection, so subsequent calls to
-\fBExport\fR
-will over\-write previous exports that have the same name\&. Multiple variable names can be passed to
-\fBExport\fR
-as separate arguments or as a list\&. Keyword arguments can be used to provide names and their values\&. A dictionary can be used to map variables to a different name when exported\&. Both local variables and global variables can be exported\&.
-.sp
-Examples:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-env = Environment()
-# Make env available for all SConscript files to Import()\&.
-Export("env")
-
-package = \*(Aqmy_name\*(Aq
-# Make env and package available for all SConscript files:\&.
-Export("env", "package")
-
-# Make env and package available for all SConscript files:
-Export(["env", "package"])
-
-# Make env available using the name debug:
-Export(debug = env)
-
-# Make env available using the name debug:
-Export({"debug":env})
-.fi
-.if n \{\
-.RE
-.\}
-.sp
-Note that the
-\fBSConscript\fR
-function supports an
-\fIexports\fR
-argument that makes it easier to to export a variable or set of variables to a single SConscript file\&. See the description of the
-\fBSConscript\fR
-function, below\&.
-.RE
-.PP
-File(name, [directory]), env\&.File(name, [directory])
-.RS 4
-This returns a File Node, an object that represents the specified file
-\fIname\fR\&.
-\fIname\fR
-can be a relative or absolute path\&.
-\fIdirectory\fR
-is an optional directory that will be used as the parent directory\&.
-.sp
-If
-\fIname\fR
-is a list, SCons returns a list of File nodes\&. Construction variables are expanded in
-\fIname\fR\&.
-.sp
-File Nodes can be used anywhere you would supply a string as a file name to a Builder method or function\&. File Nodes have attributes and methods that are useful in many situations; see "File and Directory Nodes," below\&.
-.RE
-.PP
-FindFile(file, dirs), env\&.FindFile(file, dirs)
-.RS 4
-Search for
-\fIfile\fR
-in the path specified by
-\fIdirs\fR\&.
-\fIdirs\fR
-may be a list of directory names or a single directory name\&. In addition to searching for files that exist in the filesystem, this function also searches for derived files that have not yet been built\&.
-.sp
-Example:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-foo = env\&.FindFile(\*(Aqfoo\*(Aq, [\*(Aqdir1\*(Aq, \*(Aqdir2\*(Aq])
-.fi
-.if n \{\
-.RE
-.\}
-.RE
-.PP
-FindInstalledFiles(), env\&.FindInstalledFiles()
-.RS 4
-Returns the list of targets set up by the
-\fBInstall\fR
-or
-\fBInstallAs\fR
-builders\&.
-.sp
-This function serves as a convenient method to select the contents of a binary package\&.
-.sp
-Example:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-Install( \*(Aq/bin\*(Aq, [ \*(Aqexecutable_a\*(Aq, \*(Aqexecutable_b\*(Aq ] )
-
-# will return the file node list
-# [ \*(Aq/bin/executable_a\*(Aq, \*(Aq/bin/executable_b\*(Aq ]
-FindInstalledFiles()
-
-Install( \*(Aq/lib\*(Aq, [ \*(Aqsome_library\*(Aq ] )
-
-# will return the file node list
-# [ \*(Aq/bin/executable_a\*(Aq, \*(Aq/bin/executable_b\*(Aq, \*(Aq/lib/some_library\*(Aq ]
-FindInstalledFiles()
-.fi
-.if n \{\
-.RE
-.\}
-.RE
-.PP
-FindPathDirs(variable)
-.RS 4
-Returns a function (actually a callable Python object) intended to be used as the
-\fIpath_function\fR
-of a Scanner object\&. The returned object will look up the specified
-\fIvariable\fR
-in a construction environment and treat the construction variable\*(Aqs value as a list of directory paths that should be searched (like
-\fB$CPPPATH\fR,
-\fB$LIBPATH\fR, etc\&.)\&.
-.sp
-Note that use of
-\fBFindPathDirs\fR
-is generally preferable to writing your own
-\fIpath_function\fR
-for the following reasons: 1) The returned list will contain all appropriate directories found in source trees (when
-\fBVariantDir\fR
-is used) or in code repositories (when
-\fBRepository\fR
-or the
-\fB\-Y\fR
-option are used)\&. 2) scons will identify expansions of
-\fIvariable\fR
-that evaluate to the same list of directories as, in fact, the same list, and avoid re\-scanning the directories for files, when possible\&.
-.sp
-Example:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-def my_scan(node, env, path, arg):
- # Code to scan file contents goes here\&.\&.\&.
- return include_files
-
-scanner = Scanner(name = \*(Aqmyscanner\*(Aq,
- function = my_scan,
- path_function = FindPathDirs(\*(AqMYPATH\*(Aq))
-.fi
-.if n \{\
-.RE
-.\}
-.RE
-.PP
-FindSourceFiles(node=\*(Aq"\&."\*(Aq), env\&.FindSourceFiles(node=\*(Aq"\&."\*(Aq)
-.RS 4
-Returns the list of nodes which serve as the source of the built files\&. It does so by inspecting the dependency tree starting at the optional argument
-\fInode\fR
-which defaults to the \*(Aq"\&."\*(Aq\-node\&. It will then return all leaves of
-\fInode\fR\&. These are all children which have no further children\&.
-.sp
-This function is a convenient method to select the contents of a Source Package\&.
-.sp
-Example:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-Program( \*(Aqsrc/main_a\&.c\*(Aq )
-Program( \*(Aqsrc/main_b\&.c\*(Aq )
-Program( \*(Aqmain_c\&.c\*(Aq )
-
-# returns [\*(Aqmain_c\&.c\*(Aq, \*(Aqsrc/main_a\&.c\*(Aq, \*(AqSConstruct\*(Aq, \*(Aqsrc/main_b\&.c\*(Aq]
-FindSourceFiles()
-
-# returns [\*(Aqsrc/main_b\&.c\*(Aq, \*(Aqsrc/main_a\&.c\*(Aq ]
-FindSourceFiles( \*(Aqsrc\*(Aq )
-.fi
-.if n \{\
-.RE
-.\}
-.sp
-As you can see build support files (SConstruct in the above example) will also be returned by this function\&.
-.RE
-.PP
-Flatten(sequence), env\&.Flatten(sequence)
-.RS 4
-Takes a sequence (that is, a Python list or tuple) that may contain nested sequences and returns a flattened list containing all of the individual elements in any sequence\&. This can be helpful for collecting the lists returned by calls to Builders; other Builders will automatically flatten lists specified as input, but direct Python manipulation of these lists does not\&.
-.sp
-Examples:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-foo = Object(\*(Aqfoo\&.c\*(Aq)
-bar = Object(\*(Aqbar\&.c\*(Aq)
-
-# Because `foo\*(Aq and `bar\*(Aq are lists returned by the Object() Builder,
-# `objects\*(Aq will be a list containing nested lists:
-objects = [\*(Aqf1\&.o\*(Aq, foo, \*(Aqf2\&.o\*(Aq, bar, \*(Aqf3\&.o\*(Aq]
-
-# Passing such a list to another Builder is all right because
-# the Builder will flatten the list automatically:
-Program(source = objects)
-
-# If you need to manipulate the list directly using Python, you need to
-# call Flatten() yourself, or otherwise handle nested lists:
-for object in Flatten(objects):
- print str(object)
-.fi
-.if n \{\
-.RE
-.\}
-.RE
-.PP
-GetBuildFailures()
-.RS 4
-Returns a list of exceptions for the actions that failed while attempting to build targets\&. Each element in the returned list is a
-BuildError
-object with the following attributes that record various aspects of the build failure:
-.sp
-
-\&.node
-The node that was being built when the build failure occurred\&.
-.sp
-
-\&.status
-The numeric exit status returned by the command or Python function that failed when trying to build the specified Node\&.
-.sp
-
-\&.errstr
-The SCons error string describing the build failure\&. (This is often a generic message like "Error 2" to indicate that an executed command exited with a status of 2\&.)
-.sp
-
-\&.filename
-The name of the file or directory that actually caused the failure\&. This may be different from the
-\&.node
-attribute\&. For example, if an attempt to build a target named
-sub/dir/target
-fails because the
-sub/dir
-directory could not be created, then the
-\&.node
-attribute will be
-sub/dir/target
-but the
-\&.filename
-attribute will be
-sub/dir\&.
-.sp
-
-\&.executor
-The SCons Executor object for the target Node being built\&. This can be used to retrieve the construction environment used for the failed action\&.
-.sp
-
-\&.action
-The actual SCons Action object that failed\&. This will be one specific action out of the possible list of actions that would have been executed to build the target\&.
-.sp
-
-\&.command
-The actual expanded command that was executed and failed, after expansion of
-\fB$TARGET\fR,
-\fB$SOURCE\fR, and other construction variables\&.
-.sp
-Note that the
-\fBGetBuildFailures\fR
-function will always return an empty list until any build failure has occurred, which means that
-\fBGetBuildFailures\fR
-will always return an empty list while the
-SConscript
-files are being read\&. Its primary intended use is for functions that will be executed before SCons exits by passing them to the standard Python
-\fBatexit\&.register\fR() function\&. Example:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-import atexit
-
-def print_build_failures():
- from SCons\&.Script import GetBuildFailures
- for bf in GetBuildFailures():
- print "%s failed: %s" % (bf\&.node, bf\&.errstr)
-
-atexit\&.register(print_build_failures)
-.fi
-.if n \{\
-.RE
-.\}
-.RE
-.PP
-GetBuildPath(file, [\&.\&.\&.]), env\&.GetBuildPath(file, [\&.\&.\&.])
-.RS 4
-Returns the
-scons
-path name (or names) for the specified
-\fIfile\fR
-(or files)\&. The specified
-\fIfile\fR
-or files may be
-scons
-Nodes or strings representing path names\&.
-.RE
-.PP
-GetLaunchDir(), env\&.GetLaunchDir()
-.RS 4
-Returns the absolute path name of the directory from which
-scons
-was initially invoked\&. This can be useful when using the
-\fB\-u\fR,
-\fB\-U\fR
-or
-\fB\-D\fR
-options, which internally change to the directory in which the
-SConstruct
-file is found\&.
-.RE
-.PP
-GetOption(name), env\&.GetOption(name)
-.RS 4
-This function provides a way to query the value of SCons options set on scons command line (or set using the
-\fBSetOption\fR
-function)\&. The options supported are:
-.PP
-cache_debug
-.RS 4
-which corresponds to \-\-cache\-debug;
-.RE
-.PP
-cache_disable
-.RS 4
-which corresponds to \-\-cache\-disable;
-.RE
-.PP
-cache_force
-.RS 4
-which corresponds to \-\-cache\-force;
-.RE
-.PP
-cache_show
-.RS 4
-which corresponds to \-\-cache\-show;
-.RE
-.PP
-clean
-.RS 4
-which corresponds to \-c, \-\-clean and \-\-remove;
-.RE
-.PP
-config
-.RS 4
-which corresponds to \-\-config;
-.RE
-.PP
-directory
-.RS 4
-which corresponds to \-C and \-\-directory;
-.RE
-.PP
-diskcheck
-.RS 4
-which corresponds to \-\-diskcheck
-.RE
-.PP
-duplicate
-.RS 4
-which corresponds to \-\-duplicate;
-.RE
-.PP
-file
-.RS 4
-which corresponds to \-f, \-\-file, \-\-makefile and \-\-sconstruct;
-.RE
-.PP
-help
-.RS 4
-which corresponds to \-h and \-\-help;
-.RE
-.PP
-ignore_errors
-.RS 4
-which corresponds to \-\-ignore\-errors;
-.RE
-.PP
-implicit_cache
-.RS 4
-which corresponds to \-\-implicit\-cache;
-.RE
-.PP
-implicit_deps_changed
-.RS 4
-which corresponds to \-\-implicit\-deps\-changed;
-.RE
-.PP
-implicit_deps_unchanged
-.RS 4
-which corresponds to \-\-implicit\-deps\-unchanged;
-.RE
-.PP
-interactive
-.RS 4
-which corresponds to \-\-interact and \-\-interactive;
-.RE
-.PP
-keep_going
-.RS 4
-which corresponds to \-k and \-\-keep\-going;
-.RE
-.PP
-max_drift
-.RS 4
-which corresponds to \-\-max\-drift;
-.RE
-.PP
-no_exec
-.RS 4
-which corresponds to \-n, \-\-no\-exec, \-\-just\-print, \-\-dry\-run and \-\-recon;
-.RE
-.PP
-no_site_dir
-.RS 4
-which corresponds to \-\-no\-site\-dir;
-.RE
-.PP
-num_jobs
-.RS 4
-which corresponds to \-j and \-\-jobs;
-.RE
-.PP
-profile_file
-.RS 4
-which corresponds to \-\-profile;
-.RE
-.PP
-question
-.RS 4
-which corresponds to \-q and \-\-question;
-.RE
-.PP
-random
-.RS 4
-which corresponds to \-\-random;
-.RE
-.PP
-repository
-.RS 4
-which corresponds to \-Y, \-\-repository and \-\-srcdir;
-.RE
-.PP
-silent
-.RS 4
-which corresponds to \-s, \-\-silent and \-\-quiet;
-.RE
-.PP
-site_dir
-.RS 4
-which corresponds to \-\-site\-dir;
-.RE
-.PP
-stack_size
-.RS 4
-which corresponds to \-\-stack\-size;
-.RE
-.PP
-taskmastertrace_file
-.RS 4
-which corresponds to \-\-taskmastertrace; and
-.RE
-.PP
-warn
-.RS 4
-which corresponds to \-\-warn and \-\-warning\&.
-.RE
-.sp
-See the documentation for the corresponding command line object for information about each specific option\&.
-.RE
-.PP
-Glob(pattern, [ondisk, source, strings, exclude]), env\&.Glob(pattern, [ondisk, source, strings, exclude])
-.RS 4
-Returns Nodes (or strings) that match the specified
-\fIpattern\fR, relative to the directory of the current
-SConscript
-file\&. The
-\fBenv\&.Glob\fR() form performs string substition on
-\fIpattern\fR
-and returns whatever matches the resulting expanded pattern\&.
-.sp
-The specified
-\fIpattern\fR
-uses Unix shell style metacharacters for matching:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
- * matches everything
- ? matches any single character
- [seq] matches any character in seq
- [!seq] matches any char not in seq
-.fi
-.if n \{\
-.RE
-.\}
-.sp
-If the first character of a filename is a dot, it must be matched explicitly\&. Character matches do
-\fInot\fR
-span directory separators\&.
-.sp
-The
-\fBGlob\fR
-knows about repositories (see the
-\fBRepository\fR
-function) and source directories (see the
-\fBVariantDir\fR
-function) and returns a Node (or string, if so configured) in the local (SConscript) directory if matching Node is found anywhere in a corresponding repository or source directory\&.
-.sp
-The
-\fIondisk\fR
-argument may be set to
-False
-(or any other non\-true value) to disable the search for matches on disk, thereby only returning matches among already\-configured File or Dir Nodes\&. The default behavior is to return corresponding Nodes for any on\-disk matches found\&.
-.sp
-The
-\fIsource\fR
-argument may be set to
-True
-(or any equivalent value) to specify that, when the local directory is a
-\fBVariantDir\fR, the returned Nodes should be from the corresponding source directory, not the local directory\&.
-.sp
-The
-\fIstrings\fR
-argument may be set to
-True
-(or any equivalent value) to have the
-\fBGlob\fR
-function return strings, not Nodes, that represent the matched files or directories\&. The returned strings will be relative to the local (SConscript) directory\&. (Note that This may make it easier to perform arbitrary manipulation of file names, but if the returned strings are passed to a different
-SConscript
-file, any Node translation will be relative to the other
-SConscript
-directory, not the original
-SConscript
-directory\&.)
-.sp
-The
-\fIexclude\fR
-argument may be set to a pattern or a list of patterns (following the same Unix shell semantics) which must be filtered out of returned elements\&. Elements matching a least one pattern of this list will be excluded\&.
-.sp
-Examples:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-Program(\*(Aqfoo\*(Aq, Glob(\*(Aq*\&.c\*(Aq))
-Zip(\*(Aq/tmp/everything\*(Aq, Glob(\*(Aq\&.??*\*(Aq) + Glob(\*(Aq*\*(Aq))
-sources = Glob(\*(Aq*\&.cpp\*(Aq, exclude=[\*(Aqos_*_specific_*\&.cpp\*(Aq]) + Glob(\*(Aqos_%s_specific_*\&.cpp\*(Aq%currentOS)
-.fi
-.if n \{\
-.RE
-.\}
-.RE
-.PP
-Help(text), env\&.Help(text)
-.RS 4
-This specifies help text to be printed if the
-\fB\-h\fR
-argument is given to
-scons\&. If
-\fBHelp\fR
-is called multiple times, the text is appended together in the order that
-\fBHelp\fR
-is called\&.
-.RE
-.PP
-Ignore(target, dependency), env\&.Ignore(target, dependency)
-.RS 4
-The specified dependency file(s) will be ignored when deciding if the target file(s) need to be rebuilt\&.
-.sp
-You can also use
-\fBIgnore\fR
-to remove a target from the default build\&. In order to do this you must specify the directory the target will be built in as the target, and the file you want to skip building as the dependency\&.
-.sp
-Note that this will only remove the dependencies listed from the files built by default\&. It will still be built if that dependency is needed by another object being built\&. See the third and forth examples below\&.
-.sp
-Examples:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-env\&.Ignore(\*(Aqfoo\*(Aq, \*(Aqfoo\&.c\*(Aq)
-env\&.Ignore(\*(Aqbar\*(Aq, [\*(Aqbar1\&.h\*(Aq, \*(Aqbar2\&.h\*(Aq])
-env\&.Ignore(\*(Aq\&.\*(Aq,\*(Aqfoobar\&.obj\*(Aq)
-env\&.Ignore(\*(Aqbar\*(Aq,\*(Aqbar/foobar\&.obj\*(Aq)
-.fi
-.if n \{\
-.RE
-.\}
-.RE
-.PP
-Import(vars), env\&.Import(vars)
-.RS 4
-This tells
-scons
-to import a list of variables into the current SConscript file\&. This will import variables that were exported with
-\fBExport\fR
-or in the
-\fIexports\fR
-argument to
-\fBSConscript\fR\&. Variables exported by
-\fBSConscript\fR
-have precedence\&. Multiple variable names can be passed to
-\fBImport\fR
-as separate arguments or as a list\&. The variable "*" can be used to import all variables\&.
-.sp
-Examples:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-Import("env")
-Import("env", "variable")
-Import(["env", "variable"])
-Import("*")
-.fi
-.if n \{\
-.RE
-.\}
-.RE
-.PP
-Literal(string), env\&.Literal(string)
-.RS 4
-The specified
-\fIstring\fR
-will be preserved as\-is and not have construction variables expanded\&.
-.RE
-.PP
-Local(targets), env\&.Local(targets)
-.RS 4
-The specified
-\fItargets\fR
-will have copies made in the local tree, even if an already up\-to\-date copy exists in a repository\&. Returns a list of the target Node or Nodes\&.
-.RE
-.PP
-env\&.MergeFlags(arg, [unique])
-.RS 4
-Merges the specified
-\fIarg\fR
-values to the construction environment\*(Aqs construction variables\&. If the
-\fIarg\fR
-argument is not a dictionary, it is converted to one by calling
-\fBenv\&.ParseFlags\fR
-on the argument before the values are merged\&. Note that
-\fIarg\fR
-must be a single value, so multiple strings must be passed in as a list, not as separate arguments to
-\fBenv\&.MergeFlags\fR\&.
-.sp
-By default, duplicate values are eliminated; you can, however, specify
-unique=0
-to allow duplicate values to be added\&. When eliminating duplicate values, any construction variables that end with the string
-PATH
-keep the left\-most unique value\&. All other construction variables keep the right\-most unique value\&.
-.sp
-Examples:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-# Add an optimization flag to $CCFLAGS\&.
-env\&.MergeFlags(\*(Aq\-O3\*(Aq)
-
-# Combine the flags returned from running pkg\-config with an optimization
-# flag and merge the result into the construction variables\&.
-env\&.MergeFlags([\*(Aq!pkg\-config gtk+\-2\&.0 \-\-cflags\*(Aq, \*(Aq\-O3\*(Aq])
-
-# Combine an optimization flag with the flags returned from running pkg\-config
-# twice and merge the result into the construction variables\&.
-env\&.MergeFlags([\*(Aq\-O3\*(Aq,
- \*(Aq!pkg\-config gtk+\-2\&.0 \-\-cflags \-\-libs\*(Aq,
- \*(Aq!pkg\-config libpng12 \-\-cflags \-\-libs\*(Aq])
-.fi
-.if n \{\
-.RE
-.\}
-.RE
-.PP
-NoCache(target, \&.\&.\&.), env\&.NoCache(target, \&.\&.\&.)
-.RS 4
-Specifies a list of files which should
-\fInot\fR
-be cached whenever the
-\fBCacheDir\fR
-method has been activated\&. The specified targets may be a list or an individual target\&.
-.sp
-Multiple files should be specified either as separate arguments to the
-\fBNoCache\fR
-method, or as a list\&.
-\fBNoCache\fR
-will also accept the return value of any of the construction environment Builder methods\&.
-.sp
-Calling
-\fBNoCache\fR
-on directories and other non\-File Node types has no effect because only File Nodes are cached\&.
-.sp
-Examples:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-NoCache(\*(Aqfoo\&.elf\*(Aq)
-NoCache(env\&.Program(\*(Aqhello\*(Aq, \*(Aqhello\&.c\*(Aq))
-.fi
-.if n \{\
-.RE
-.\}
-.RE
-.PP
-NoClean(target, \&.\&.\&.), env\&.NoClean(target, \&.\&.\&.)
-.RS 4
-Specifies a list of files or directories which should
-\fInot\fR
-be removed whenever the targets (or their dependencies) are specified with the
-\fB\-c\fR
-command line option\&. The specified targets may be a list or an individual target\&. Multiple calls to
-\fBNoClean\fR
-are legal, and prevent each specified target from being removed by calls to the
-\fB\-c\fR
-option\&.
-.sp
-Multiple files or directories should be specified either as separate arguments to the
-\fBNoClean\fR
-method, or as a list\&.
-\fBNoClean\fR
-will also accept the return value of any of the construction environment Builder methods\&.
-.sp
-Calling
-\fBNoClean\fR
-for a target overrides calling
-\fBClean\fR
-for the same target, and any targets passed to both functions will
-\fInot\fR
-be removed by the
-\fB\-c\fR
-option\&.
-.sp
-Examples:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-NoClean(\*(Aqfoo\&.elf\*(Aq)
-NoClean(env\&.Program(\*(Aqhello\*(Aq, \*(Aqhello\&.c\*(Aq))
-.fi
-.if n \{\
-.RE
-.\}
-.RE
-.PP
-env\&.ParseConfig(command, [function, unique])
-.RS 4
-Calls the specified
-\fIfunction\fR
-to modify the environment as specified by the output of
-\fIcommand\fR\&. The default
-\fIfunction\fR
-is
-\fBenv\&.MergeFlags\fR, which expects the output of a typical
-*\-config
-command (for example,
-gtk\-config) and adds the options to the appropriate construction variables\&. By default, duplicate values are not added to any construction variables; you can specify
-unique=0
-to allow duplicate values to be added\&.
-.sp
-Interpreted options and the construction variables they affect are as specified for the
-\fBenv\&.ParseFlags\fR
-method (which this method calls)\&. See that method\*(Aqs description, below, for a table of options and construction variables\&.
-.RE
-.PP
-ParseDepends(filename, [must_exist, only_one]), env\&.ParseDepends(filename, [must_exist, only_one])
-.RS 4
-Parses the contents of the specified
-\fIfilename\fR
-as a list of dependencies in the style of
-Make
-or
-mkdep, and explicitly establishes all of the listed dependencies\&.
-.sp
-By default, it is not an error if the specified
-\fIfilename\fR
-does not exist\&. The optional
-\fImust_exist\fR
-argument may be set to a non\-zero value to have scons throw an exception and generate an error if the file does not exist, or is otherwise inaccessible\&.
-.sp
-The optional
-\fIonly_one\fR
-argument may be set to a non\-zero value to have scons thrown an exception and generate an error if the file contains dependency information for more than one target\&. This can provide a small sanity check for files intended to be generated by, for example, the
-gcc \-M
-flag, which should typically only write dependency information for one output file into a corresponding
-\&.d
-file\&.
-.sp
-The
-\fIfilename\fR
-and all of the files listed therein will be interpreted relative to the directory of the
-SConscript
-file which calls the
-\fBParseDepends\fR
-function\&.
-.RE
-.PP
-env\&.ParseFlags(flags, \&.\&.\&.)
-.RS 4
-Parses one or more strings containing typical command\-line flags for GCC tool chains and returns a dictionary with the flag values separated into the appropriate SCons construction variables\&. This is intended as a companion to the
-\fBenv\&.MergeFlags\fR
-method, but allows for the values in the returned dictionary to be modified, if necessary, before merging them into the construction environment\&. (Note that
-\fBenv\&.MergeFlags\fR
-will call this method if its argument is not a dictionary, so it is usually not necessary to call
-\fBenv\&.ParseFlags\fR
-directly unless you want to manipulate the values\&.)
-.sp
-If the first character in any string is an exclamation mark (!), the rest of the string is executed as a command, and the output from the command is parsed as GCC tool chain command\-line flags and added to the resulting dictionary\&.
-.sp
-Flag values are translated accordig to the prefix found, and added to the following construction variables:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-\-arch CCFLAGS, LINKFLAGS
-\-D CPPDEFINES
-\-framework FRAMEWORKS
-\-frameworkdir= FRAMEWORKPATH
-\-include CCFLAGS
-\-isysroot CCFLAGS, LINKFLAGS
-\-I CPPPATH
-\-l LIBS
-\-L LIBPATH
-\-mno\-cygwin CCFLAGS, LINKFLAGS
-\-mwindows LINKFLAGS
-\-pthread CCFLAGS, LINKFLAGS
-\-std= CFLAGS
-\-Wa, ASFLAGS, CCFLAGS
-\-Wl,\-rpath= RPATH
-\-Wl,\-R, RPATH
-\-Wl,\-R RPATH
-\-Wl, LINKFLAGS
-\-Wp, CPPFLAGS
-\- CCFLAGS
-+ CCFLAGS, LINKFLAGS
-.fi
-.if n \{\
-.RE
-.\}
-.sp
-Any other strings not associated with options are assumed to be the names of libraries and added to the
-\fB$LIBS\fR
-construction variable\&.
-.sp
-Examples (all of which produce the same result):
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-dict = env\&.ParseFlags(\*(Aq\-O2 \-Dfoo \-Dbar=1\*(Aq)
-dict = env\&.ParseFlags(\*(Aq\-O2\*(Aq, \*(Aq\-Dfoo\*(Aq, \*(Aq\-Dbar=1\*(Aq)
-dict = env\&.ParseFlags([\*(Aq\-O2\*(Aq, \*(Aq\-Dfoo \-Dbar=1\*(Aq])
-dict = env\&.ParseFlags(\*(Aq\-O2\*(Aq, \*(Aq!echo \-Dfoo \-Dbar=1\*(Aq)
-.fi
-.if n \{\
-.RE
-.\}
-.RE
-.PP
-env\&.Perforce()
-.RS 4
-A factory function that returns a Builder object to be used to fetch source files from the Perforce source code management system\&. The returned Builder is intended to be passed to the
-\fBSourceCode\fR
-function\&.
-.sp
-This function is deprecated\&. For details, see the entry for the
-\fBSourceCode\fR
-function\&.
-.sp
-Example:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-env\&.SourceCode(\*(Aq\&.\*(Aq, env\&.Perforce())
-.fi
-.if n \{\
-.RE
-.\}
-.sp
-Perforce uses a number of external environment variables for its operation\&. Consequently, this function adds the following variables from the user\*(Aqs external environment to the construction environment\*(Aqs ENV dictionary: P4CHARSET, P4CLIENT, P4LANGUAGE, P4PASSWD, P4PORT, P4USER, SystemRoot, USER, and USERNAME\&.
-.RE
-.PP
-Platform(string)
-.RS 4
-The
-\fBPlatform\fR
-form returns a callable object that can be used to initialize a construction environment using the platform keyword of the
-\fBEnvironment\fR
-function\&.
-.sp
-Example:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-env = Environment(platform = Platform(\*(Aqwin32\*(Aq))
-.fi
-.if n \{\
-.RE
-.\}
-.sp
-The
-\fBenv\&.Platform\fR
-form applies the callable object for the specified platform
-\fIstring\fR
-to the environment through which the method was called\&.
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-env\&.Platform(\*(Aqposix\*(Aq)
-.fi
-.if n \{\
-.RE
-.\}
-.sp
-Note that the
-win32
-platform adds the
-SystemDrive
-and
-SystemRoot
-variables from the user\*(Aqs external environment to the construction environment\*(Aqs
-\fB$ENV\fR
-dictionary\&. This is so that any executed commands that use sockets to connect with other systems (such as fetching source files from external CVS repository specifications like
-:pserver:anonymous@cvs\&.sourceforge\&.net:/cvsroot/scons) will work on Windows systems\&.
-.RE
-.PP
-Precious(target, \&.\&.\&.), env\&.Precious(target, \&.\&.\&.)
-.RS 4
-Marks each given
-\fItarget\fR
-as precious so it is not deleted before it is rebuilt\&. Normally
-scons
-deletes a target before building it\&. Multiple targets can be passed in to a single call to
-\fBPrecious\fR\&.
-.RE
-.PP
-env\&.Prepend(key=val, [\&.\&.\&.])
-.RS 4
-Appends the specified keyword arguments to the beginning of construction variables in the environment\&. If the Environment does not have the specified construction variable, it is simply added to the environment\&. If the values of the construction variable and the keyword argument are the same type, then the two values will be simply added together\&. Otherwise, the construction variable and the value of the keyword argument are both coerced to lists, and the lists are added together\&. (See also the Append method, above\&.)
-.sp
-Example:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-env\&.Prepend(CCFLAGS = \*(Aq\-g \*(Aq, FOO = [\*(Aqfoo\&.yyy\*(Aq])
-.fi
-.if n \{\
-.RE
-.\}
-.RE
-.PP
-env\&.PrependENVPath(name, newpath, [envname, sep, delete_existing])
-.RS 4
-This appends new path elements to the given path in the specified external environment (\fB$ENV\fR
-by default)\&. This will only add any particular path once (leaving the first one it encounters and ignoring the rest, to preserve path order), and to help assure this, will normalize all paths (using
-os\&.path\&.normpath
-and
-os\&.path\&.normcase)\&. This can also handle the case where the given old path variable is a list instead of a string, in which case a list will be returned instead of a string\&.
-.sp
-If
-\fIdelete_existing\fR
-is 0, then adding a path that already exists will not move it to the beginning; it will stay where it is in the list\&.
-.sp
-Example:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-print \*(Aqbefore:\*(Aq,env[\*(AqENV\*(Aq][\*(AqINCLUDE\*(Aq]
-include_path = \*(Aq/foo/bar:/foo\*(Aq
-env\&.PrependENVPath(\*(AqINCLUDE\*(Aq, include_path)
-print \*(Aqafter:\*(Aq,env[\*(AqENV\*(Aq][\*(AqINCLUDE\*(Aq]
-.fi
-.if n \{\
-.RE
-.\}
-.sp
-The above example will print:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-before: /biz:/foo
-after: /foo/bar:/foo:/biz
-.fi
-.if n \{\
-.RE
-.\}
-.RE
-.PP
-env\&.PrependUnique(key=val, delete_existing=0, [\&.\&.\&.])
-.RS 4
-Appends the specified keyword arguments to the beginning of construction variables in the environment\&. If the Environment does not have the specified construction variable, it is simply added to the environment\&. If the construction variable being appended to is a list, then any value(s) that already exist in the construction variable will
-\fInot\fR
-be added again to the list\&. However, if delete_existing is 1, existing matching values are removed first, so existing values in the arg list move to the front of the list\&.
-.sp
-Example:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-env\&.PrependUnique(CCFLAGS = \*(Aq\-g\*(Aq, FOO = [\*(Aqfoo\&.yyy\*(Aq])
-.fi
-.if n \{\
-.RE
-.\}
-.RE
-.PP
-Progress(callable, [interval]), Progress(string, [interval, file, overwrite]), Progress(list_of_strings, [interval, file, overwrite])
-.RS 4
-Allows SCons to show progress made during the build by displaying a string or calling a function while evaluating Nodes (e\&.g\&. files)\&.
-.sp
-If the first specified argument is a Python callable (a function or an object that has a
-\fB__call__\fR() method), the function will be called once every
-\fIinterval\fR
-times a Node is evaluated\&. The callable will be passed the evaluated Node as its only argument\&. (For future compatibility, it\*(Aqs a good idea to also add
-*args
-and
-**kw
-as arguments to your function or method\&. This will prevent the code from breaking if SCons ever changes the interface to call the function with additional arguments in the future\&.)
-.sp
-An example of a simple custom progress function that prints a string containing the Node name every 10 Nodes:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-def my_progress_function(node, *args, **kw):
- print \*(AqEvaluating node %s!\*(Aq % node
-Progress(my_progress_function, interval=10)
-.fi
-.if n \{\
-.RE
-.\}
-.sp
-A more complicated example of a custom progress display object that prints a string containing a count every 100 evaluated Nodes\&. Note the use of
-\er
-(a carriage return) at the end so that the string will overwrite itself on a display:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-import sys
-class ProgressCounter(object):
- count = 0
- def __call__(self, node, *args, **kw):
- self\&.count += 100
- sys\&.stderr\&.write(\*(AqEvaluated %s nodes\er\*(Aq % self\&.count)
-Progress(ProgressCounter(), interval=100)
-.fi
-.if n \{\
-.RE
-.\}
-.sp
-If the first argument
-\fBProgress\fR
-is a string, the string will be displayed every
-\fIinterval\fR
-evaluated Nodes\&. The default is to print the string on standard output; an alternate output stream may be specified with the
-file=
-argument\&. The following will print a series of dots on the error output, one dot for every 100 evaluated Nodes:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-import sys
-Progress(\*(Aq\&.\*(Aq, interval=100, file=sys\&.stderr)
-.fi
-.if n \{\
-.RE
-.\}
-.sp
-If the string contains the verbatim substring
-\fB$TARGET\fR, it will be replaced with the Node\&. Note that, for performance reasons, this is
-\fInot\fR
-a regular SCons variable substition, so you can not use other variables or use curly braces\&. The following example will print the name of every evaluated Node, using a
-\er
-(carriage return) to cause each line to overwritten by the next line, and the
-overwrite=
-keyword argument to make sure the previously\-printed file name is overwritten with blank spaces:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-import sys
-Progress(\*(Aq$TARGET\er\*(Aq, overwrite=True)
-.fi
-.if n \{\
-.RE
-.\}
-.sp
-If the first argument to
-\fBProgress\fR
-is a list of strings, then each string in the list will be displayed in rotating fashion every
-\fIinterval\fR
-evaluated Nodes\&. This can be used to implement a "spinner" on the user\*(Aqs screen as follows:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-Progress([\*(Aq\-\er\*(Aq, \*(Aq\e\e\er\*(Aq, \*(Aq|\er\*(Aq, \*(Aq/\er\*(Aq], interval=5)
-.fi
-.if n \{\
-.RE
-.\}
-.RE
-.PP
-Pseudo(target, \&.\&.\&.), env\&.Pseudo(target, \&.\&.\&.)
-.RS 4
-This indicates that each given
-\fItarget\fR
-should not be created by the build rule, and if the target is created, an error will be generated\&. This is similar to the gnu make \&.PHONY target\&. However, in the vast majority of cases, an
-\fBAlias\fR
-is more appropriate\&. Multiple targets can be passed in to a single call to
-\fBPseudo\fR\&.
-.RE
-.PP
-env\&.RCS()
-.RS 4
-A factory function that returns a Builder object to be used to fetch source files from RCS\&. The returned Builder is intended to be passed to the
-\fBSourceCode\fR
-function:
-.sp
-This function is deprecated\&. For details, see the entry for the
-\fBSourceCode\fR
-function\&.
-.sp
-Examples:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-env\&.SourceCode(\*(Aq\&.\*(Aq, env\&.RCS())
-.fi
-.if n \{\
-.RE
-.\}
-.sp
-Note that
-scons
-will fetch source files from RCS subdirectories automatically, so configuring RCS as demonstrated in the above example should only be necessary if you are fetching from RCS,v files in the same directory as the source files, or if you need to explicitly specify RCS for a specific subdirectory\&.
-.RE
-.PP
-env\&.Replace(key=val, [\&.\&.\&.])
-.RS 4
-Replaces construction variables in the Environment with the specified keyword arguments\&.
-.sp
-Example:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-env\&.Replace(CCFLAGS = \*(Aq\-g\*(Aq, FOO = \*(Aqfoo\&.xxx\*(Aq)
-.fi
-.if n \{\
-.RE
-.\}
-.RE
-.PP
-Repository(directory), env\&.Repository(directory)
-.RS 4
-Specifies that
-\fIdirectory\fR
-is a repository to be searched for files\&. Multiple calls to
-\fBRepository\fR
-are legal, and each one adds to the list of repositories that will be searched\&.
-.sp
-To
-scons, a repository is a copy of the source tree, from the top\-level directory on down, which may contain both source files and derived files that can be used to build targets in the local source tree\&. The canonical example would be an official source tree maintained by an integrator\&. If the repository contains derived files, then the derived files should have been built using
-scons, so that the repository contains the necessary signature information to allow
-scons
-to figure out when it is appropriate to use the repository copy of a derived file, instead of building one locally\&.
-.sp
-Note that if an up\-to\-date derived file already exists in a repository,
-scons
-will
-\fInot\fR
-make a copy in the local directory tree\&. In order to guarantee that a local copy will be made, use the
-\fBLocal\fR
-method\&.
-.RE
-.PP
-Requires(target, prerequisite), env\&.Requires(target, prerequisite)
-.RS 4
-Specifies an order\-only relationship between the specified target file(s) and the specified prerequisite file(s)\&. The prerequisite file(s) will be (re)built, if necessary,
-\fIbefore\fR
-the target file(s), but the target file(s) do not actually depend on the prerequisites and will not be rebuilt simply because the prerequisite file(s) change\&.
-.sp
-Example:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-env\&.Requires(\*(Aqfoo\*(Aq, \*(Aqfile\-that\-must\-be\-built\-before\-foo\*(Aq)
-.fi
-.if n \{\
-.RE
-.\}
-.RE
-.PP
-Return([vars\&.\&.\&., stop=])
-.RS 4
-By default, this stops processing the current SConscript file and returns to the calling SConscript file the values of the variables named in the
-\fIvars\fR
-string arguments\&. Multiple strings contaning variable names may be passed to
-\fBReturn\fR\&. Any strings that contain white space
-.sp
-The optional
-stop=
-keyword argument may be set to a false value to continue processing the rest of the SConscript file after the
-\fBReturn\fR
-call\&. This was the default behavior prior to SCons 0\&.98\&. However, the values returned are still the values of the variables in the named
-\fIvars\fR
-at the point
-\fBReturn\fR
-is called\&.
-.sp
-Examples:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-# Returns without returning a value\&.
-Return()
-
-# Returns the value of the \*(Aqfoo\*(Aq Python variable\&.
-Return("foo")
-
-# Returns the values of the Python variables \*(Aqfoo\*(Aq and \*(Aqbar\*(Aq\&.
-Return("foo", "bar")
-
-# Returns the values of Python variables \*(Aqval1\*(Aq and \*(Aqval2\*(Aq\&.
-Return(\*(Aqval1 val2\*(Aq)
-.fi
-.if n \{\
-.RE
-.\}
-.RE
-.PP
-Scanner(function, [argument, keys, path_function, node_class, node_factory, scan_check, recursive]), env\&.Scanner(function, [argument, keys, path_function, node_class, node_factory, scan_check, recursive])
-.RS 4
-Creates a Scanner object for the specified
-\fIfunction\fR\&. See the section "Scanner Objects," below, for a complete explanation of the arguments and behavior\&.
-.RE
-.PP
-env\&.SCCS()
-.RS 4
-A factory function that returns a Builder object to be used to fetch source files from SCCS\&. The returned Builder is intended to be passed to the
-\fBSourceCode\fR
-function\&.
-.sp
-Example:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-env\&.SourceCode(\*(Aq\&.\*(Aq, env\&.SCCS())
-.fi
-.if n \{\
-.RE
-.\}
-.sp
-Note that
-scons
-will fetch source files from SCCS subdirectories automatically, so configuring SCCS as demonstrated in the above example should only be necessary if you are fetching from
-s\&.SCCS
-files in the same directory as the source files, or if you need to explicitly specify SCCS for a specific subdirectory\&.
-.RE
-.PP
-SConscript(scripts, [exports, variant_dir, duplicate]), env\&.SConscript(scripts, [exports, variant_dir, duplicate]), SConscript(dirs=subdirs, [name=script, exports, variant_dir, duplicate]), env\&.SConscript(dirs=subdirs, [name=script, exports, variant_dir, duplicate])
-.RS 4
-This tells
-scons
-to execute one or more subsidiary SConscript (configuration) files\&. Any variables returned by a called script using
-\fBReturn\fR
-will be returned by the call to
-\fBSConscript\fR\&. There are two ways to call the
-\fBSConscript\fR
-function\&.
-.sp
-The first way you can call
-\fBSConscript\fR
-is to explicitly specify one or more
-\fIscripts\fR
-as the first argument\&. A single script may be specified as a string; multiple scripts must be specified as a list (either explicitly or as created by a function like
-\fBSplit\fR)\&. Examples:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-SConscript(\*(AqSConscript\*(Aq) # run SConscript in the current directory
-SConscript(\*(Aqsrc/SConscript\*(Aq) # run SConscript in the src directory
-SConscript([\*(Aqsrc/SConscript\*(Aq, \*(Aqdoc/SConscript\*(Aq])
-config = SConscript(\*(AqMyConfig\&.py\*(Aq)
-.fi
-.if n \{\
-.RE
-.\}
-.sp
-The second way you can call
-\fBSConscript\fR
-is to specify a list of (sub)directory names as a
-dirs=\fIsubdirs\fR
-keyword argument\&. In this case,
-scons
-will, by default, execute a subsidiary configuration file named
-SConscript
-in each of the specified directories\&. You may specify a name other than
-SConscript
-by supplying an optional
-name=\fIscript\fR
-keyword argument\&. The first three examples below have the same effect as the first three examples above:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-SConscript(dirs=\*(Aq\&.\*(Aq) # run SConscript in the current directory
-SConscript(dirs=\*(Aqsrc\*(Aq) # run SConscript in the src directory
-SConscript(dirs=[\*(Aqsrc\*(Aq, \*(Aqdoc\*(Aq])
-SConscript(dirs=[\*(Aqsub1\*(Aq, \*(Aqsub2\*(Aq], name=\*(AqMySConscript\*(Aq)
-.fi
-.if n \{\
-.RE
-.\}
-.sp
-The optional
-\fIexports\fR
-argument provides a list of variable names or a dictionary of named values to export to the
-\fIscript(s)\fR\&. These variables are locally exported only to the specified
-\fIscript(s)\fR, and do not affect the global pool of variables used by the
-\fBExport\fR
-function\&.
-The subsidiary
-\fIscript(s)\fR
-must use the
-\fBImport\fR
-function to import the variables\&. Examples:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-foo = SConscript(\*(Aqsub/SConscript\*(Aq, exports=\*(Aqenv\*(Aq)
-SConscript(\*(Aqdir/SConscript\*(Aq, exports=[\*(Aqenv\*(Aq, \*(Aqvariable\*(Aq])
-SConscript(dirs=\*(Aqsubdir\*(Aq, exports=\*(Aqenv variable\*(Aq)
-SConscript(dirs=[\*(Aqone\*(Aq, \*(Aqtwo\*(Aq, \*(Aqthree\*(Aq], exports=\*(Aqshared_info\*(Aq)
-.fi
-.if n \{\
-.RE
-.\}
-.sp
-If the optional
-\fIvariant_dir\fR
-argument is present, it causes an effect equivalent to the
-\fBVariantDir\fR
-method described below\&. (If
-\fIvariant_dir\fR
-is not present, the
-
-\fIduplicate\fR
-argument is ignored\&.) The
-\fIvariant_dir\fR
-argument is interpreted relative to the directory of the calling
-SConscript
-file\&. See the description of the
-\fBVariantDir\fR
-function below for additional details and restrictions\&.
-.sp
-If
-\fIvariant_dir\fR
-is present,
-the source directory is the directory in which the
-SConscript
-file resides and the
-SConscript
-file is evaluated as if it were in the
-\fIvariant_dir\fR
-directory:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-SConscript(\*(Aqsrc/SConscript\*(Aq, variant_dir = \*(Aqbuild\*(Aq)
-.fi
-.if n \{\
-.RE
-.\}
-.sp
-is equivalent to
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-VariantDir(\*(Aqbuild\*(Aq, \*(Aqsrc\*(Aq)
-SConscript(\*(Aqbuild/SConscript\*(Aq)
-.fi
-.if n \{\
-.RE
-.\}
-.sp
-This later paradigm is often used when the sources are in the same directory as the
-SConstruct:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-SConscript(\*(AqSConscript\*(Aq, variant_dir = \*(Aqbuild\*(Aq)
-.fi
-.if n \{\
-.RE
-.\}
-.sp
-is equivalent to
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-VariantDir(\*(Aqbuild\*(Aq, \*(Aq\&.\*(Aq)
-SConscript(\*(Aqbuild/SConscript\*(Aq)
-.fi
-.if n \{\
-.RE
-.\}
-.sp
-
-.sp
-Here are some composite examples:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-# collect the configuration information and use it to build src and doc
-shared_info = SConscript(\*(AqMyConfig\&.py\*(Aq)
-SConscript(\*(Aqsrc/SConscript\*(Aq, exports=\*(Aqshared_info\*(Aq)
-SConscript(\*(Aqdoc/SConscript\*(Aq, exports=\*(Aqshared_info\*(Aq)
-.fi
-.if n \{\
-.RE
-.\}
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-# build debugging and production versions\&. SConscript
-# can use Dir(\*(Aq\&.\*(Aq)\&.path to determine variant\&.
-SConscript(\*(AqSConscript\*(Aq, variant_dir=\*(Aqdebug\*(Aq, duplicate=0)
-SConscript(\*(AqSConscript\*(Aq, variant_dir=\*(Aqprod\*(Aq, duplicate=0)
-.fi
-.if n \{\
-.RE
-.\}
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-# build debugging and production versions\&. SConscript
-# is passed flags to use\&.
-opts = { \*(AqCPPDEFINES\*(Aq : [\*(AqDEBUG\*(Aq], \*(AqCCFLAGS\*(Aq : \*(Aq\-pgdb\*(Aq }
-SConscript(\*(AqSConscript\*(Aq, variant_dir=\*(Aqdebug\*(Aq, duplicate=0, exports=opts)
-opts = { \*(AqCPPDEFINES\*(Aq : [\*(AqNODEBUG\*(Aq], \*(AqCCFLAGS\*(Aq : \*(Aq\-O\*(Aq }
-SConscript(\*(AqSConscript\*(Aq, variant_dir=\*(Aqprod\*(Aq, duplicate=0, exports=opts)
-.fi
-.if n \{\
-.RE
-.\}
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-# build common documentation and compile for different architectures
-SConscript(\*(Aqdoc/SConscript\*(Aq, variant_dir=\*(Aqbuild/doc\*(Aq, duplicate=0)
-SConscript(\*(Aqsrc/SConscript\*(Aq, variant_dir=\*(Aqbuild/x86\*(Aq, duplicate=0)
-SConscript(\*(Aqsrc/SConscript\*(Aq, variant_dir=\*(Aqbuild/ppc\*(Aq, duplicate=0)
-.fi
-.if n \{\
-.RE
-.\}
-.RE
-.PP
-SConscriptChdir(value), env\&.SConscriptChdir(value)
-.RS 4
-By default,
-scons
-changes its working directory to the directory in which each subsidiary SConscript file lives\&. This behavior may be disabled by specifying either:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-SConscriptChdir(0)
-env\&.SConscriptChdir(0)
-.fi
-.if n \{\
-.RE
-.\}
-.sp
-in which case
-scons
-will stay in the top\-level directory while reading all SConscript files\&. (This may be necessary when building from repositories, when all the directories in which SConscript files may be found don\*(Aqt necessarily exist locally\&.) You may enable and disable this ability by calling SConscriptChdir() multiple times\&.
-.sp
-Example:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-env = Environment()
-SConscriptChdir(0)
-SConscript(\*(Aqfoo/SConscript\*(Aq) # will not chdir to foo
-env\&.SConscriptChdir(1)
-SConscript(\*(Aqbar/SConscript\*(Aq) # will chdir to bar
-.fi
-.if n \{\
-.RE
-.\}
-.RE
-.PP
-SConsignFile([file, dbm_module]), env\&.SConsignFile([file, dbm_module])
-.RS 4
-This tells
-scons
-to store all file signatures in the specified database
-\fIfile\fR\&. If the
-\fIfile\fR
-name is omitted,
-\&.sconsign
-is used by default\&. (The actual file name(s) stored on disk may have an appropriated suffix appended by the
-\fI dbm_module\fR\&.) If
-\fIfile\fR
-is not an absolute path name, the file is placed in the same directory as the top\-level
-SConstruct
-file\&.
-.sp
-If
-\fIfile\fR
-is
-None, then
-scons
-will store file signatures in a separate
-\&.sconsign
-file in each directory, not in one global database file\&. (This was the default behavior prior to SCons 0\&.96\&.91 and 0\&.97\&.)
-.sp
-The optional
-\fIdbm_module\fR
-argument can be used to specify which Python database module The default is to use a custom
-SCons\&.dblite
-module that uses pickled Python data structures, and which works on all Python versions\&.
-.sp
-Examples:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-# Explicitly stores signatures in "\&.sconsign\&.dblite"
-# in the top\-level SConstruct directory (the
-# default behavior)\&.
-SConsignFile()
-
-# Stores signatures in the file "etc/scons\-signatures"
-# relative to the top\-level SConstruct directory\&.
-SConsignFile("etc/scons\-signatures")
-
-# Stores signatures in the specified absolute file name\&.
-SConsignFile("/home/me/SCons/signatures")
-
-# Stores signatures in a separate \&.sconsign file
-# in each directory\&.
-SConsignFile(None)
-.fi
-.if n \{\
-.RE
-.\}
-.RE
-.PP
-env\&.SetDefault(key=val, [\&.\&.\&.])
-.RS 4
-Sets construction variables to default values specified with the keyword arguments if (and only if) the variables are not already set\&. The following statements are equivalent:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-env\&.SetDefault(FOO = \*(Aqfoo\*(Aq)
-
-if \*(AqFOO\*(Aq not in env: env[\*(AqFOO\*(Aq] = \*(Aqfoo\*(Aq
-.fi
-.if n \{\
-.RE
-.\}
-.RE
-.PP
-SetOption(name, value), env\&.SetOption(name, value)
-.RS 4
-This function provides a way to set a select subset of the scons command line options from a SConscript file\&. The options supported are:
-.PP
-clean
-.RS 4
-which corresponds to \-c, \-\-clean and \-\-remove;
-.RE
-.PP
-duplicate
-.RS 4
-which corresponds to \-\-duplicate;
-.RE
-.PP
-help
-.RS 4
-which corresponds to \-h and \-\-help;
-.RE
-.PP
-implicit_cache
-.RS 4
-which corresponds to \-\-implicit\-cache;
-.RE
-.PP
-max_drift
-.RS 4
-which corresponds to \-\-max\-drift;
-.RE
-.PP
-no_exec
-.RS 4
-which corresponds to \-n, \-\-no\-exec, \-\-just\-print, \-\-dry\-run and \-\-recon;
-.RE
-.PP
-num_jobs
-.RS 4
-which corresponds to \-j and \-\-jobs;
-.RE
-.PP
-random
-.RS 4
-which corresponds to \-\-random; and
-.RE
-.PP
-stack_size
-.RS 4
-which corresponds to \-\-stack\-size\&.
-.RE
-.sp
-See the documentation for the corresponding command line object for information about each specific option\&.
-.sp
-Example:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-SetOption(\*(Aqmax_drift\*(Aq, 1)
-.fi
-.if n \{\
-.RE
-.\}
-.RE
-.PP
-SideEffect(side_effect, target), env\&.SideEffect(side_effect, target)
-.RS 4
-Declares
-\fIside_effect\fR
-as a side effect of building
-\fItarget\fR\&. Both
-\fIside_effect\fR
-and
-\fItarget\fR
-can be a list, a file name, or a node\&. A side effect is a target file that is created or updated as a side effect of building other targets\&. For example, a Windows PDB file is created as a side effect of building the \&.obj files for a static library, and various log files are created updated as side effects of various TeX commands\&. If a target is a side effect of multiple build commands,
-scons
-will ensure that only one set of commands is executed at a time\&. Consequently, you only need to use this method for side\-effect targets that are built as a result of multiple build commands\&.
-.sp
-Because multiple build commands may update the same side effect file, by default the
-\fIside_effect\fR
-target is
-\fInot\fR
-automatically removed when the
-\fItarget\fR
-is removed by the
-\fB\-c\fR
-option\&. (Note, however, that the
-\fIside_effect\fR
-might be removed as part of cleaning the directory in which it lives\&.) If you want to make sure the
-\fIside_effect\fR
-is cleaned whenever a specific
-\fItarget\fR
-is cleaned, you must specify this explicitly with the
-\fBClean\fR
-or
-\fBenv\&.Clean\fR
-function\&.
-.RE
-.PP
-SourceCode(entries, builder), env\&.SourceCode(entries, builder)
-.RS 4
-This function and its associate factory functions are deprecated\&. There is no replacement\&. The intended use was to keep a local tree in sync with an archive, but in actuality the function only causes the archive to be fetched on the first run\&. Synchronizing with the archive is best done external to
-SCons\&.
-.sp
-Arrange for non\-existent source files to be fetched from a source code management system using the specified
-\fIbuilder\fR\&. The specified
-\fIentries\fR
-may be a Node, string or list of both, and may represent either individual source files or directories in which source files can be found\&.
-.sp
-For any non\-existent source files,
-scons
-will search up the directory tree and use the first
-\fBSourceCode\fR
-builder it finds\&. The specified
-\fIbuilder\fR
-may be
-None, in which case
-scons
-will not use a builder to fetch source files for the specified
-\fIentries\fR, even if a
-\fBSourceCode\fR
-builder has been specified for a directory higher up the tree\&.
-.sp
-
-scons
-will, by default, fetch files from SCCS or RCS subdirectories without explicit configuration\&. This takes some extra processing time to search for the necessary source code management files on disk\&. You can avoid these extra searches and speed up your build a little by disabling these searches as follows:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-env\&.SourceCode(\*(Aq\&.\*(Aq, None)
-.fi
-.if n \{\
-.RE
-.\}
-.sp
-Note that if the specified
-\fIbuilder\fR
-is one you create by hand, it must have an associated construction environment to use when fetching a source file\&.
-.sp
-
-scons
-provides a set of canned factory functions that return appropriate Builders for various popular source code management systems\&. Canonical examples of invocation include:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-env\&.SourceCode(\*(Aq\&.\*(Aq, env\&.BitKeeper(\*(Aq/usr/local/BKsources\*(Aq))
-env\&.SourceCode(\*(Aqsrc\*(Aq, env\&.CVS(\*(Aq/usr/local/CVSROOT\*(Aq))
-env\&.SourceCode(\*(Aq/\*(Aq, env\&.RCS())
-env\&.SourceCode([\*(Aqf1\&.c\*(Aq, \*(Aqf2\&.c\*(Aq], env\&.SCCS())
-env\&.SourceCode(\*(Aqno_source\&.c\*(Aq, None)
-.fi
-.if n \{\
-.RE
-.\}
-.sp
-
-.RE
-.PP
-SourceSignatures(type), env\&.SourceSignatures(type)
-.RS 4
-Note: Although it is not yet officially deprecated, use of this function is discouraged\&. See the
-\fBDecider\fR
-function for a more flexible and straightforward way to configure SCons\*(Aq decision\-making\&.
-.sp
-The
-\fBSourceSignatures\fR
-function tells
-scons
-how to decide if a source file (a file that is not built from any other files) has changed since the last time it was used to build a particular target file\&. Legal values are
-MD5
-or
-timestamp\&.
-.sp
-If the environment method is used, the specified type of source signature is only used when deciding whether targets built with that environment are up\-to\-date or must be rebuilt\&. If the global function is used, the specified type of source signature becomes the default used for all decisions about whether targets are up\-to\-date\&.
-.sp
-
-MD5
-means
-scons
-decides that a source file has changed if the MD5 checksum of its contents has changed since the last time it was used to rebuild a particular target file\&.
-.sp
-
-timestamp
-means
-scons
-decides that a source file has changed if its timestamp (modification time) has changed since the last time it was used to rebuild a particular target file\&. (Note that although this is similar to the behavior of Make, by default it will also rebuild if the dependency is
-\fIolder\fR
-than the last time it was used to rebuild the target file\&.)
-.sp
-There is no different between the two behaviors for Python
-\fBValue\fR
-node objects\&.
-.sp
-
-MD5
-signatures take longer to compute, but are more accurate than
-timestamp
-signatures\&. The default value is
-MD5\&.
-.sp
-Note that the default
-\fBTargetSignatures\fR
-setting (see below) is to use this
-\fBSourceSignatures\fR
-setting for any target files that are used to build other target files\&. Consequently, changing the value of
-\fBSourceSignatures\fR
-will, by default, affect the up\-to\-date decision for all files in the build (or all files built with a specific construction environment when
-\fBenv\&.SourceSignatures\fR
-is used)\&.
-.RE
-.PP
-Split(arg), env\&.Split(arg)
-.RS 4
-Returns a list of file names or other objects\&. If arg is a string, it will be split on strings of white\-space characters within the string, making it easier to write long lists of file names\&. If arg is already a list, the list will be returned untouched\&. If arg is any other type of object, it will be returned as a list containing just the object\&.
-.sp
-Example:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-files = Split("f1\&.c f2\&.c f3\&.c")
-files = env\&.Split("f4\&.c f5\&.c f6\&.c")
-files = Split("""
- f7\&.c
- f8\&.c
- f9\&.c
-""")
-.fi
-.if n \{\
-.RE
-.\}
-.RE
-.PP
-env\&.subst(input, [raw, target, source, conv])
-.RS 4
-Performs construction variable interpolation on the specified string or sequence argument
-\fIinput\fR\&.
-.sp
-By default, leading or trailing white space will be removed from the result\&. and all sequences of white space will be compressed to a single space character\&. Additionally, any
-$(
-and
-$)
-character sequences will be stripped from the returned string, The optional
-\fIraw\fR
-argument may be set to
-1
-if you want to preserve white space and
-$(\-$)
-sequences\&. The
-\fIraw\fR
-argument may be set to
-2
-if you want to strip all characters between any
-$(
-and
-$)
-pairs (as is done for signature calculation)\&.
-.sp
-If the input is a sequence (list or tuple), the individual elements of the sequence will be expanded, and the results will be returned as a list\&.
-.sp
-The optional
-\fItarget\fR
-and
-\fIsource\fR
-keyword arguments must be set to lists of target and source nodes, respectively, if you want the
-\fB$TARGET\fR,
-\fB$TARGETS\fR,
-\fB$SOURCE\fR
-and
-\fB$SOURCES\fR
-to be available for expansion\&. This is usually necessary if you are calling
-\fBenv\&.subst\fR
-from within a Python function used as an SCons action\&.
-.sp
-Returned string values or sequence elements are converted to their string representation by default\&. The optional
-\fIconv\fR
-argument may specify a conversion function that will be used in place of the default\&. For example, if you want Python objects (including SCons Nodes) to be returned as Python objects, you can use the Python Λ idiom to pass in an unnamed function that simply returns its unconverted argument\&.
-.sp
-Example:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-print env\&.subst("The C compiler is: $CC")
-
-def compile(target, source, env):
- sourceDir = env\&.subst("${SOURCE\&.srcdir}",
- target=target,
- source=source)
-
-source_nodes = env\&.subst(\*(Aq$EXPAND_TO_NODELIST\*(Aq,
- conv=lambda x: x)
-.fi
-.if n \{\
-.RE
-.\}
-.RE
-.PP
-Tag(node, tags)
-.RS 4
-Annotates file or directory Nodes with information about how the
-\fBPackage\fR
-Builder should package those files or directories\&. All tags are optional\&.
-.sp
-Examples:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-# makes sure the built library will be installed with 0644 file
-# access mode
-Tag( Library( \*(Aqlib\&.c\*(Aq ), UNIX_ATTR="0644" )
-
-# marks file2\&.txt to be a documentation file
-Tag( \*(Aqfile2\&.txt\*(Aq, DOC )
-.fi
-.if n \{\
-.RE
-.\}
-.RE
-.PP
-TargetSignatures(type), env\&.TargetSignatures(type)
-.RS 4
-Note: Although it is not yet officially deprecated, use of this function is discouraged\&. See the
-\fBDecider\fR
-function for a more flexible and straightforward way to configure SCons\*(Aq decision\-making\&.
-.sp
-The
-\fBTargetSignatures\fR
-function tells
-scons
-how to decide if a target file (a file that
-\fIis\fR
-built from any other files) has changed since the last time it was used to build some other target file\&. Legal values are
-"build";
-"content"
-(or its synonym
-"MD5");
-"timestamp"; or
-"source"\&.
-.sp
-If the environment method is used, the specified type of target signature is only used for targets built with that environment\&. If the global function is used, the specified type of signature becomes the default used for all target files that don\*(Aqt have an explicit target signature type specified for their environments\&.
-.sp
-
-"content"
-(or its synonym
-"MD5") means
-scons
-decides that a target file has changed if the MD5 checksum of its contents has changed since the last time it was used to rebuild some other target file\&. This means
-scons
-will open up MD5 sum the contents of target files after they\*(Aqre built, and may decide that it does not need to rebuild "downstream" target files if a file was rebuilt with exactly the same contents as the last time\&.
-.sp
-
-"timestamp"
-means
-scons
-decides that a target file has changed if its timestamp (modification time) has changed since the last time it was used to rebuild some other target file\&. (Note that although this is similar to the behavior of Make, by default it will also rebuild if the dependency is
-\fIolder\fR
-than the last time it was used to rebuild the target file\&.)
-.sp
-
-"source"
-means
-scons
-decides that a target file has changed as specified by the corresponding
-\fBSourceSignatures\fR
-setting ("MD5"
-or
-"timestamp")\&. This means that
-scons
-will treat all input files to a target the same way, regardless of whether they are source files or have been built from other files\&.
-.sp
-
-"build"
-means
-scons
-decides that a target file has changed if it has been rebuilt in this invocation or if its content or timestamp have changed as specified by the corresponding
-\fBSourceSignatures\fR
-setting\&. This "propagates" the status of a rebuilt file so that other "downstream" target files will always be rebuilt, even if the contents or the timestamp have not changed\&.
-.sp
-
-"build"
-signatures are fastest because
-"content"
-(or
-"MD5") signatures take longer to compute, but are more accurate than
-"timestamp"
-signatures, and can prevent unnecessary "downstream" rebuilds when a target file is rebuilt to the exact same contents as the previous build\&. The
-"source"
-setting provides the most consistent behavior when other target files may be rebuilt from both source and target input files\&. The default value is
-"source"\&.
-.sp
-Because the default setting is
-"source", using
-\fBSourceSignatures\fR
-is generally preferable to
-\fBTargetSignatures\fR, so that the up\-to\-date decision will be consistent for all files (or all files built with a specific construction environment)\&. Use of
-\fBTargetSignatures\fR
-provides specific control for how built target files affect their "downstream" dependencies\&.
-.RE
-.PP
-Tool(string, [toolpath, **kw]), env\&.Tool(string, [toolpath, **kw])
-.RS 4
-The
-\fBTool\fR
-form of the function returns a callable object that can be used to initialize a construction environment using the tools keyword of the Environment() method\&. The object may be called with a construction environment as an argument, in which case the object will add the necessary variables to the construction environment and the name of the tool will be added to the
-\fB$TOOLS\fR
-construction variable\&.
-.sp
-Additional keyword arguments are passed to the tool\*(Aqs
-\fBgenerate\fR() method\&.
-.sp
-Examples:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-env = Environment(tools = [ Tool(\*(Aqmsvc\*(Aq) ])
-
-env = Environment()
-t = Tool(\*(Aqmsvc\*(Aq)
-t(env) # adds \*(Aqmsvc\*(Aq to the TOOLS variable
-u = Tool(\*(Aqopengl\*(Aq, toolpath = [\*(Aqtools\*(Aq])
-u(env) # adds \*(Aqopengl\*(Aq to the TOOLS variable
-.fi
-.if n \{\
-.RE
-.\}
-.sp
-The
-\fBenv\&.Tool\fR
-form of the function applies the callable object for the specified tool
-\fIstring\fR
-to the environment through which the method was called\&.
-.sp
-Additional keyword arguments are passed to the tool\*(Aqs
-\fBgenerate\fR() method\&.
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-env\&.Tool(\*(Aqgcc\*(Aq)
-env\&.Tool(\*(Aqopengl\*(Aq, toolpath = [\*(Aqbuild/tools\*(Aq])
-.fi
-.if n \{\
-.RE
-.\}
-.RE
-.PP
-Value(value, [built_value]), env\&.Value(value, [built_value])
-.RS 4
-Returns a Node object representing the specified Python value\&. Value Nodes can be used as dependencies of targets\&. If the result of calling
-\fBstr\fR(\fIvalue\fR) changes between SCons runs, any targets depending on
-\fBValue\fR(\fIvalue\fR) will be rebuilt\&. (This is true even when using timestamps to decide if files are up\-to\-date\&.) When using timestamp source signatures, Value Nodes\*(Aq timestamps are equal to the system time when the Node is created\&.
-.sp
-The returned Value Node object has a
-\fBwrite\fR() method that can be used to "build" a Value Node by setting a new value\&. The optional
-\fIbuilt_value\fR
-argument can be specified when the Value Node is created to indicate the Node should already be considered "built\&." There is a corresponding
-\fBread\fR() method that will return the built value of the Node\&.
-.sp
-Examples:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-env = Environment()
-
-def create(target, source, env):
- # A function that will write a \*(Aqprefix=$SOURCE\*(Aq
- # string into the file name specified as the
- # $TARGET\&.
- f = open(str(target[0]), \*(Aqwb\*(Aq)
- f\&.write(\*(Aqprefix=\*(Aq + source[0]\&.get_contents())
-
-# Fetch the prefix= argument, if any, from the command
-# line, and use /usr/local as the default\&.
-prefix = ARGUMENTS\&.get(\*(Aqprefix\*(Aq, \*(Aq/usr/local\*(Aq)
-
-# Attach a \&.Config() builder for the above function action
-# to the construction environment\&.
-env[\*(AqBUILDERS\*(Aq][\*(AqConfig\*(Aq] = Builder(action = create)
-env\&.Config(target = \*(Aqpackage\-config\*(Aq, source = Value(prefix))
-
-def build_value(target, source, env):
- # A function that "builds" a Python Value by updating
- # the the Python value with the contents of the file
- # specified as the source of the Builder call ($SOURCE)\&.
- target[0]\&.write(source[0]\&.get_contents())
-
-output = env\&.Value(\*(Aqbefore\*(Aq)
-input = env\&.Value(\*(Aqafter\*(Aq)
-
-# Attach a \&.UpdateValue() builder for the above function
-# action to the construction environment\&.
-env[\*(AqBUILDERS\*(Aq][\*(AqUpdateValue\*(Aq] = Builder(action = build_value)
-env\&.UpdateValue(target = Value(output), source = Value(input))
-.fi
-.if n \{\
-.RE
-.\}
-.RE
-.PP
-VariantDir(variant_dir, src_dir, [duplicate]), env\&.VariantDir(variant_dir, src_dir, [duplicate])
-.RS 4
-Use the
-\fBVariantDir\fR
-function to create a copy of your sources in another location: if a name under
-\fIvariant_dir\fR
-is not found but exists under
-\fIsrc_dir\fR, the file or directory is copied to
-\fIvariant_dir\fR\&. Target files can be built in a different directory than the original sources by simply refering to the sources (and targets) within the variant tree\&.
-.sp
-
-\fBVariantDir\fR
-can be called multiple times with the same
-\fIsrc_dir\fR
-to set up multiple builds with different options (\fIvariants\fR)\&. The
-\fIsrc_dir\fR
-location must be in or underneath the SConstruct file\*(Aqs directory, and
-\fIvariant_dir\fR
-may not be underneath
-\fIsrc_dir\fR\&.
-.sp
-The default behavior is for
-scons
-to physically duplicate the source files in the variant tree\&. Thus, a build performed in the variant tree is guaranteed to be identical to a build performed in the source tree even if intermediate source files are generated during the build, or preprocessors or other scanners search for included files relative to the source file, or individual compilers or other invoked tools are hard\-coded to put derived files in the same directory as source files\&.
-.sp
-If possible on the platform, the duplication is performed by linking rather than copying; see also the
-\fB\-\-duplicate\fR
-command\-line option\&. Moreover, only the files needed for the build are duplicated; files and directories that are not used are not present in
-\fIvariant_dir\fR\&.
-.sp
-Duplicating the source tree may be disabled by setting the
-duplicate
-argument to
-0
-(zero)\&. This will cause
-scons
-to invoke Builders using the path names of source files in
-\fIsrc_dir\fR
-and the path names of derived files within
-\fIvariant_dir\fR\&. This is always more efficient than
-duplicate=1, and is usually safe for most builds (but see above for cases that may cause problems)\&.
-.sp
-Note that
-\fBVariantDir\fR
-works most naturally with a subsidiary SConscript file\&. However, you would then call the subsidiary SConscript file not in the source directory, but in the
-\fIvariant_dir\fR, regardless of the value of
-duplicate\&. This is how you tell
-scons
-which variant of a source tree to build:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-# run src/SConscript in two variant directories
-VariantDir(\*(Aqbuild/variant1\*(Aq, \*(Aqsrc\*(Aq)
-SConscript(\*(Aqbuild/variant1/SConscript\*(Aq)
-VariantDir(\*(Aqbuild/variant2\*(Aq, \*(Aqsrc\*(Aq)
-SConscript(\*(Aqbuild/variant2/SConscript\*(Aq)
-.fi
-.if n \{\
-.RE
-.\}
-.sp
-See also the
-\fBSConscript\fR
-function, described above, for another way to specify a variant directory in conjunction with calling a subsidiary SConscript file\&.
-.sp
-Examples:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-# use names in the build directory, not the source directory
-VariantDir(\*(Aqbuild\*(Aq, \*(Aqsrc\*(Aq, duplicate=0)
-Program(\*(Aqbuild/prog\*(Aq, \*(Aqbuild/source\&.c\*(Aq)
-.fi
-.if n \{\
-.RE
-.\}
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-# this builds both the source and docs in a separate subtree
-VariantDir(\*(Aqbuild\*(Aq, \*(Aq\&.\*(Aq, duplicate=0)
-SConscript(dirs=[\*(Aqbuild/src\*(Aq,\*(Aqbuild/doc\*(Aq])
-.fi
-.if n \{\
-.RE
-.\}
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-# same as previous example, but only uses SConscript
-SConscript(dirs=\*(Aqsrc\*(Aq, variant_dir=\*(Aqbuild/src\*(Aq, duplicate=0)
-SConscript(dirs=\*(Aqdoc\*(Aq, variant_dir=\*(Aqbuild/doc\*(Aq, duplicate=0)
-.fi
-.if n \{\
-.RE
-.\}
-.RE
-.PP
-WhereIs(program, [path, pathext, reject]), env\&.WhereIs(program, [path, pathext, reject])
-.RS 4
-Searches for the specified executable
-\fIprogram\fR, returning the full path name to the program if it is found, and returning None if not\&. Searches the specified
-\fIpath\fR, the value of the calling environment\*(Aqs PATH (env[\*(AqENV\*(Aq][\*(AqPATH\*(Aq]), or the user\*(Aqs current external PATH (os\&.environ[\*(AqPATH\*(Aq]) by default\&. On Windows systems, searches for executable programs with any of the file extensions listed in the specified
-\fIpathext\fR, the calling environment\*(Aqs PATHEXT (env[\*(AqENV\*(Aq][\*(AqPATHEXT\*(Aq]) or the user\*(Aqs current PATHEXT (os\&.environ[\*(AqPATHEXT\*(Aq]) by default\&. Will not select any path name or names in the specified
-\fIreject\fR
-list, if any\&.
-.RE
-.SS "SConscript Variables"
-.PP
-In addition to the global functions and methods,
-\fBscons\fR
-supports a number of Python variables that can be used in SConscript files to affect how you want the build to be performed\&. These variables may be accessed from custom Python modules that you import into an SConscript file by adding the following to the Python module:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-from SCons\&.Script import *
-.fi
-.if n \{\
-.RE
-.\}
-.PP
-ARGLIST
-.RS 4
-A list
-\fIkeyword\fR=\fIvalue\fR
-arguments specified on the command line\&. Each element in the list is a tuple containing the (\fIkeyword\fR,\fIvalue\fR) of the argument\&. The separate
-\fIkeyword\fR
-and
-\fIvalue\fR
-elements of the tuple can be accessed by subscripting for element
-\fB[0]\fR
-and
-\fB[1]\fR
-of the tuple, respectively\&.
-.sp
-Example:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-print "first keyword, value =", ARGLIST[0][0], ARGLIST[0][1]
-print "second keyword, value =", ARGLIST[1][0], ARGLIST[1][1]
-third_tuple = ARGLIST[2]
-print "third keyword, value =", third_tuple[0], third_tuple[1]
-for key, value in ARGLIST:
- # process key and value
-.fi
-.if n \{\
-.RE
-.\}
-.RE
-.PP
-ARGUMENTS
-.RS 4
-A dictionary of all the
-\fIkeyword\fR=\fIvalue\fR
-arguments specified on the command line\&. The dictionary is not in order, and if a given keyword has more than one value assigned to it on the command line, the last (right\-most) value is the one in the
-\fBARGUMENTS\fR
-dictionary\&.
-.sp
-Example:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-if ARGUMENTS\&.get(\*(Aqdebug\*(Aq, 0):
- env = Environment(CCFLAGS = \*(Aq\-g\*(Aq)
-else:
- env = Environment()
-.fi
-.if n \{\
-.RE
-.\}
-.RE
-.PP
-BUILD_TARGETS
-.RS 4
-A list of the targets which
-\fBscons\fR
-will actually try to build, regardless of whether they were specified on the command line or via the
-\fBDefault\fR() function or method\&. The elements of this list may be strings
-\fIor\fR
-nodes, so you should run the list through the Python
-\fBstr\fR
-function to make sure any Node path names are converted to strings\&.
-.sp
-Because this list may be taken from the list of targets specified using the
-\fBDefault\fR() function or method, the contents of the list may change on each successive call to
-\fBDefault\fR()\&. See the
-\fBDEFAULT_TARGETS\fR
-list, below, for additional information\&.
-.sp
-Example:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-if \*(Aqfoo\*(Aq in BUILD_TARGETS:
- print "Don\*(Aqt forget to test the `foo\*(Aq program!"
-if \*(Aqspecial/program\*(Aq in BUILD_TARGETS:
- SConscript(\*(Aqspecial\*(Aq)
-.fi
-.if n \{\
-.RE
-.\}
-.RE
-.PP
-Note that the
-\fBBUILD_TARGETS\fR
-list only contains targets expected listed on the command line or via calls to the
-\fBDefault\fR() function or method\&. It does
-\fInot\fR
-contain all dependent targets that will be built as a result of making the sure the explicitly\-specified targets are up to date\&.
-.PP
-COMMAND_LINE_TARGETS
-.RS 4
-A list of the targets explicitly specified on the command line\&. If there are no targets specified on the command line, the list is empty\&. This can be used, for example, to take specific actions only when a certain target or targets is explicitly being built\&.
-.sp
-Example:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-if \*(Aqfoo\*(Aq in COMMAND_LINE_TARGETS:
- print "Don\*(Aqt forget to test the `foo\*(Aq program!"
-if \*(Aqspecial/program\*(Aq in COMMAND_LINE_TARGETS:
- SConscript(\*(Aqspecial\*(Aq)
-.fi
-.if n \{\
-.RE
-.\}
-.RE
-.PP
-DEFAULT_TARGETS
-.RS 4
-A list of the target
-\fInodes\fR
-that have been specified using the
-\fBDefault\fR() function or method\&. The elements of the list are nodes, so you need to run them through the Python
-\fBstr\fR
-function to get at the path name for each Node\&.
-.sp
-Example:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-print str(DEFAULT_TARGETS[0])
-if \*(Aqfoo\*(Aq in map(str, DEFAULT_TARGETS):
- print "Don\*(Aqt forget to test the `foo\*(Aq program!"
-.fi
-.if n \{\
-.RE
-.\}
-.RE
-.PP
-The contents of the
-\fBDEFAULT_TARGETS\fR
-list change on on each successive call to the
-\fBDefault\fR() function:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-print map(str, DEFAULT_TARGETS) # originally []
-Default(\*(Aqfoo\*(Aq)
-print map(str, DEFAULT_TARGETS) # now a node [\*(Aqfoo\*(Aq]
-Default(\*(Aqbar\*(Aq)
-print map(str, DEFAULT_TARGETS) # now a node [\*(Aqfoo\*(Aq, \*(Aqbar\*(Aq]
-Default(None)
-print map(str, DEFAULT_TARGETS) # back to []
-.fi
-.if n \{\
-.RE
-.\}
-.PP
-Consequently, be sure to use
-\fBDEFAULT_TARGETS\fR
-only after you\*(Aqve made all of your
-\fBDefault\fR() calls, or else simply be careful of the order of these statements in your SConscript files so that you don\*(Aqt look for a specific default target before it\*(Aqs actually been added to the list\&.
-.SS "Construction Variables"
-.PP
-A construction environment has an associated dictionary of
-\fIconstruction variables\fR
-that are used by built\-in or user\-supplied build rules\&. Construction variables must follow the same rules for Python identifiers: the initial character must be an underscore or letter, followed by any number of underscores, letters, or digits\&.
-.PP
-A number of useful construction variables are automatically defined by scons for each supported platform, and additional construction variables can be defined by the user\&. The following is a list of the automatically defined construction variables:
-.PP
-AR
-.RS 4
-The static library archiver\&.
-.RE
-.PP
-ARCHITECTURE
-.RS 4
-Specifies the system architecture for which the package is being built\&. The default is the system architecture of the machine on which SCons is running\&. This is used to fill in the
-Architecture:
-field in an Ipkg
-control
-file, and as part of the name of a generated RPM file\&.
-.RE
-.PP
-ARCOM
-.RS 4
-The command line used to generate a static library from object files\&.
-.RE
-.PP
-ARCOMSTR
-.RS 4
-The string displayed when an object file is generated from an assembly\-language source file\&. If this is not set, then
-\fB$ARCOM\fR
-(the command line) is displayed\&.
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-env = Environment(ARCOMSTR = "Archiving $TARGET")
-.fi
-.if n \{\
-.RE
-.\}
-.RE
-.PP
-ARFLAGS
-.RS 4
-General options passed to the static library archiver\&.
-.RE
-.PP
-AS
-.RS 4
-The assembler\&.
-.RE
-.PP
-ASCOM
-.RS 4
-The command line used to generate an object file from an assembly\-language source file\&.
-.RE
-.PP
-ASCOMSTR
-.RS 4
-The string displayed when an object file is generated from an assembly\-language source file\&. If this is not set, then
-\fB$ASCOM\fR
-(the command line) is displayed\&.
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-env = Environment(ASCOMSTR = "Assembling $TARGET")
-.fi
-.if n \{\
-.RE
-.\}
-.RE
-.PP
-ASFLAGS
-.RS 4
-General options passed to the assembler\&.
-.RE
-.PP
-ASPPCOM
-.RS 4
-The command line used to assemble an assembly\-language source file into an object file after first running the file through the C preprocessor\&. Any options specified in the
-\fB$ASFLAGS\fR
-and
-\fB$CPPFLAGS\fR
-construction variables are included on this command line\&.
-.RE
-.PP
-ASPPCOMSTR
-.RS 4
-The string displayed when an object file is generated from an assembly\-language source file after first running the file through the C preprocessor\&. If this is not set, then
-\fB$ASPPCOM\fR
-(the command line) is displayed\&.
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-env = Environment(ASPPCOMSTR = "Assembling $TARGET")
-.fi
-.if n \{\
-.RE
-.\}
-.RE
-.PP
-ASPPFLAGS
-.RS 4
-General options when an assembling an assembly\-language source file into an object file after first running the file through the C preprocessor\&. The default is to use the value of
-\fB$ASFLAGS\fR\&.
-.RE
-.PP
-BIBTEX
-.RS 4
-The bibliography generator for the TeX formatter and typesetter and the LaTeX structured formatter and typesetter\&.
-.RE
-.PP
-BIBTEXCOM
-.RS 4
-The command line used to call the bibliography generator for the TeX formatter and typesetter and the LaTeX structured formatter and typesetter\&.
-.RE
-.PP
-BIBTEXCOMSTR
-.RS 4
-The string displayed when generating a bibliography for TeX or LaTeX\&. If this is not set, then
-\fB$BIBTEXCOM\fR
-(the command line) is displayed\&.
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-env = Environment(BIBTEXCOMSTR = "Generating bibliography $TARGET")
-.fi
-.if n \{\
-.RE
-.\}
-.RE
-.PP
-BIBTEXFLAGS
-.RS 4
-General options passed to the bibliography generator for the TeX formatter and typesetter and the LaTeX structured formatter and typesetter\&.
-.RE
-.PP
-BITKEEPER
-.RS 4
-The BitKeeper executable\&.
-.RE
-.PP
-BITKEEPERCOM
-.RS 4
-The command line for fetching source files using BitKeeper\&.
-.RE
-.PP
-BITKEEPERCOMSTR
-.RS 4
-The string displayed when fetching a source file using BitKeeper\&. If this is not set, then
-\fB$BITKEEPERCOM\fR
-(the command line) is displayed\&.
-.RE
-.PP
-BITKEEPERGET
-.RS 4
-The command (\fB$BITKEEPER\fR) and subcommand for fetching source files using BitKeeper\&.
-.RE
-.PP
-BITKEEPERGETFLAGS
-.RS 4
-Options that are passed to the BitKeeper
-\fBget\fR
-subcommand\&.
-.RE
-.PP
-BUILDERS
-.RS 4
-A dictionary mapping the names of the builders available through this environment to underlying Builder objects\&. Builders named Alias, CFile, CXXFile, DVI, Library, Object, PDF, PostScript, and Program are available by default\&. If you initialize this variable when an Environment is created:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-env = Environment(BUILDERS = {\*(AqNewBuilder\*(Aq : foo})
-.fi
-.if n \{\
-.RE
-.\}
-.sp
-the default Builders will no longer be available\&. To use a new Builder object in addition to the default Builders, add your new Builder object like this:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-env = Environment()
-env\&.Append(BUILDERS = {\*(AqNewBuilder\*(Aq : foo})
-.fi
-.if n \{\
-.RE
-.\}
-.sp
-or this:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-env = Environment()
-env[\*(AqBUILDERS][\*(AqNewBuilder\*(Aq] = foo
-.fi
-.if n \{\
-.RE
-.\}
-.RE
-.PP
-CC
-.RS 4
-The C compiler\&.
-.RE
-.PP
-CCCOM
-.RS 4
-The command line used to compile a C source file to a (static) object file\&. Any options specified in the
-\fB$CFLAGS\fR,
-\fB$CCFLAGS\fR
-and
-\fB$CPPFLAGS\fR
-construction variables are included on this command line\&.
-.RE
-.PP
-CCCOMSTR
-.RS 4
-The string displayed when a C source file is compiled to a (static) object file\&. If this is not set, then
-\fB$CCCOM\fR
-(the command line) is displayed\&.
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-env = Environment(CCCOMSTR = "Compiling static object $TARGET")
-.fi
-.if n \{\
-.RE
-.\}
-.RE
-.PP
-CCFLAGS
-.RS 4
-General options that are passed to the C and C++ compilers\&.
-.RE
-.PP
-CCPCHFLAGS
-.RS 4
-Options added to the compiler command line to support building with precompiled headers\&. The default value expands expands to the appropriate Microsoft Visual C++ command\-line options when the
-\fB$PCH\fR
-construction variable is set\&.
-.RE
-.PP
-CCPDBFLAGS
-.RS 4
-Options added to the compiler command line to support storing debugging information in a Microsoft Visual C++ PDB file\&. The default value expands expands to appropriate Microsoft Visual C++ command\-line options when the
-\fB$PDB\fR
-construction variable is set\&.
-.sp
-The Visual C++ compiler option that SCons uses by default to generate PDB information is
-\fB/Z7\fR\&. This works correctly with parallel (\fB\-j\fR) builds because it embeds the debug information in the intermediate object files, as opposed to sharing a single PDB file between multiple object files\&. This is also the only way to get debug information embedded into a static library\&. Using the
-\fB/Zi\fR
-instead may yield improved link\-time performance, although parallel builds will no longer work\&.
-.sp
-You can generate PDB files with the
-\fB/Zi\fR
-switch by overriding the default
-\fB$CCPDBFLAGS\fR
-variable as follows:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-env[\*(AqCCPDBFLAGS\*(Aq] = [\*(Aq${(PDB and "/Zi /Fd%s" % File(PDB)) or ""}\*(Aq]
-.fi
-.if n \{\
-.RE
-.\}
-.sp
-An alternative would be to use the
-\fB/Zi\fR
-to put the debugging information in a separate
-\&.pdb
-file for each object file by overriding the
-\fB$CCPDBFLAGS\fR
-variable as follows:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-env[\*(AqCCPDBFLAGS\*(Aq] = \*(Aq/Zi /Fd${TARGET}\&.pdb\*(Aq
-.fi
-.if n \{\
-.RE
-.\}
-.RE
-.PP
-CCVERSION
-.RS 4
-The version number of the C compiler\&. This may or may not be set, depending on the specific C compiler being used\&.
-.RE
-.PP
-CFILESUFFIX
-.RS 4
-The suffix for C source files\&. This is used by the internal CFile builder when generating C files from Lex (\&.l) or YACC (\&.y) input files\&. The default suffix, of course, is
-\&.c
-(lower case)\&. On case\-insensitive systems (like Windows), SCons also treats
-\&.C
-(upper case) files as C files\&.
-.RE
-.PP
-CFLAGS
-.RS 4
-General options that are passed to the C compiler (C only; not C++)\&.
-.RE
-.PP
-CHANGE_SPECFILE
-.RS 4
-A hook for modifying the file that controls the packaging build (the
-\&.spec
-for RPM, the
-control
-for Ipkg, the
-\&.wxs
-for MSI)\&. If set, the function will be called after the SCons template for the file has been written\&. XXX
-.RE
-.PP
-CHANGED_SOURCES
-.RS 4
-A reserved variable name that may not be set or used in a construction environment\&. (See "Variable Substitution," below\&.)
-.RE
-.PP
-CHANGED_TARGETS
-.RS 4
-A reserved variable name that may not be set or used in a construction environment\&. (See "Variable Substitution," below\&.)
-.RE
-.PP
-CHANGELOG
-.RS 4
-The name of a file containing the change log text to be included in the package\&. This is included as the
-%changelog
-section of the RPM
-\&.spec
-file\&.
-.RE
-.PP
-_concat
-.RS 4
-A function used to produce variables like
-\fB$_CPPINCFLAGS\fR\&. It takes four or five arguments: a prefix to concatenate onto each element, a list of elements, a suffix to concatenate onto each element, an environment for variable interpolation, and an optional function that will be called to transform the list before concatenation\&.
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-env[\*(Aq_CPPINCFLAGS\*(Aq] = \*(Aq$( ${_concat(INCPREFIX, CPPPATH, INCSUFFIX, __env__, RDirs)} $)\*(Aq,
-.fi
-.if n \{\
-.RE
-.\}
-.RE
-.PP
-CONFIGUREDIR
-.RS 4
-The name of the directory in which Configure context test files are written\&. The default is
-\&.sconf_temp
-in the top\-level directory containing the
-SConstruct
-file\&.
-.RE
-.PP
-CONFIGURELOG
-.RS 4
-The name of the Configure context log file\&. The default is
-config\&.log
-in the top\-level directory containing the
-SConstruct
-file\&.
-.RE
-.PP
-_CPPDEFFLAGS
-.RS 4
-An automatically\-generated construction variable containing the C preprocessor command\-line options to define values\&. The value of
-\fB$_CPPDEFFLAGS\fR
-is created by appending
-\fB$CPPDEFPREFIX\fR
-and
-\fB$CPPDEFSUFFIX\fR
-to the beginning and end of each definition in
-\fB$CPPDEFINES\fR\&.
-.RE
-.PP
-CPPDEFINES
-.RS 4
-A platform independent specification of C preprocessor definitions\&. The definitions will be added to command lines through the automatically\-generated
-\fB$_CPPDEFFLAGS\fR
-construction variable (see above), which is constructed according to the type of value of
-\fB$CPPDEFINES\fR:
-.sp
-If
-\fB$CPPDEFINES\fR
-is a string, the values of the
-\fB$CPPDEFPREFIX\fR
-and
-\fB$CPPDEFSUFFIX\fR
-construction variables will be added to the beginning and end\&.
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-# Will add \-Dxyz to POSIX compiler command lines,
-# and /Dxyz to Microsoft Visual C++ command lines\&.
-env = Environment(CPPDEFINES=\*(Aqxyz\*(Aq)
-.fi
-.if n \{\
-.RE
-.\}
-.sp
-If
-\fB$CPPDEFINES\fR
-is a list, the values of the
-\fB$CPPDEFPREFIX\fR
-and
-\fB$CPPDEFSUFFIX\fR
-construction variables will be appended to the beginning and end of each element in the list\&. If any element is a list or tuple, then the first item is the name being defined and the second item is its value:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-# Will add \-DB=2 \-DA to POSIX compiler command lines,
-# and /DB=2 /DA to Microsoft Visual C++ command lines\&.
-env = Environment(CPPDEFINES=[(\*(AqB\*(Aq, 2), \*(AqA\*(Aq])
-.fi
-.if n \{\
-.RE
-.\}
-.sp
-If
-\fB$CPPDEFINES\fR
-is a dictionary, the values of the
-\fB$CPPDEFPREFIX\fR
-and
-\fB$CPPDEFSUFFIX\fR
-construction variables will be appended to the beginning and end of each item from the dictionary\&. The key of each dictionary item is a name being defined to the dictionary item\*(Aqs corresponding value; if the value is
-None, then the name is defined without an explicit value\&. Note that the resulting flags are sorted by keyword to ensure that the order of the options on the command line is consistent each time
-scons
-is run\&.
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-# Will add \-DA \-DB=2 to POSIX compiler command lines,
-# and /DA /DB=2 to Microsoft Visual C++ command lines\&.
-env = Environment(CPPDEFINES={\*(AqB\*(Aq:2, \*(AqA\*(Aq:None})
-.fi
-.if n \{\
-.RE
-.\}
-.RE
-.PP
-CPPDEFPREFIX
-.RS 4
-The prefix used to specify preprocessor definitions on the C compiler command line\&. This will be appended to the beginning of each definition in the
-\fB$CPPDEFINES\fR
-construction variable when the
-\fB$_CPPDEFFLAGS\fR
-variable is automatically generated\&.
-.RE
-.PP
-CPPDEFSUFFIX
-.RS 4
-The suffix used to specify preprocessor definitions on the C compiler command line\&. This will be appended to the end of each definition in the
-\fB$CPPDEFINES\fR
-construction variable when the
-\fB$_CPPDEFFLAGS\fR
-variable is automatically generated\&.
-.RE
-.PP
-CPPFLAGS
-.RS 4
-User\-specified C preprocessor options\&. These will be included in any command that uses the C preprocessor, including not just compilation of C and C++ source files via the
-\fB$CCCOM\fR,
-\fB$SHCCCOM\fR,
-\fB$CXXCOM\fR
-and
-\fB$SHCXXCOM\fR
-command lines, but also the
-\fB$FORTRANPPCOM\fR,
-\fB$SHFORTRANPPCOM\fR,
-\fB$F77PPCOM\fR
-and
-\fB$SHF77PPCOM\fR
-command lines used to compile a Fortran source file, and the
-\fB$ASPPCOM\fR
-command line used to assemble an assembly language source file, after first running each file through the C preprocessor\&. Note that this variable does
-\fInot\fR
-contain
-\fB\-I\fR
-(or similar) include search path options that scons generates automatically from
-\fB$CPPPATH\fR\&. See
-\fB$_CPPINCFLAGS\fR, below, for the variable that expands to those options\&.
-.RE
-.PP
-_CPPINCFLAGS
-.RS 4
-An automatically\-generated construction variable containing the C preprocessor command\-line options for specifying directories to be searched for include files\&. The value of
-\fB$_CPPINCFLAGS\fR
-is created by appending
-\fB$INCPREFIX\fR
-and
-\fB$INCSUFFIX\fR
-to the beginning and end of each directory in
-\fB$CPPPATH\fR\&.
-.RE
-.PP
-CPPPATH
-.RS 4
-The list of directories that the C preprocessor will search for include directories\&. The C/C++ implicit dependency scanner will search these directories for include files\&. Don\*(Aqt explicitly put include directory arguments in CCFLAGS or CXXFLAGS because the result will be non\-portable and the directories will not be searched by the dependency scanner\&. Note: directory names in CPPPATH will be looked\-up relative to the SConscript directory when they are used in a command\&. To force
-scons
-to look\-up a directory relative to the root of the source tree use #:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-env = Environment(CPPPATH=\*(Aq#/include\*(Aq)
-.fi
-.if n \{\
-.RE
-.\}
-.sp
-The directory look\-up can also be forced using the
-\fBDir\fR() function:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-include = Dir(\*(Aqinclude\*(Aq)
-env = Environment(CPPPATH=include)
-.fi
-.if n \{\
-.RE
-.\}
-.sp
-The directory list will be added to command lines through the automatically\-generated
-\fB$_CPPINCFLAGS\fR
-construction variable, which is constructed by appending the values of the
-\fB$INCPREFIX\fR
-and
-\fB$INCSUFFIX\fR
-construction variables to the beginning and end of each directory in
-\fB$CPPPATH\fR\&. Any command lines you define that need the CPPPATH directory list should include
-\fB$_CPPINCFLAGS\fR:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-env = Environment(CCCOM="my_compiler $_CPPINCFLAGS \-c \-o $TARGET $SOURCE")
-.fi
-.if n \{\
-.RE
-.\}
-.RE
-.PP
-CPPSUFFIXES
-.RS 4
-The list of suffixes of files that will be scanned for C preprocessor implicit dependencies (#include lines)\&. The default list is:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-["\&.c", "\&.C", "\&.cxx", "\&.cpp", "\&.c++", "\&.cc",
- "\&.h", "\&.H", "\&.hxx", "\&.hpp", "\&.hh",
- "\&.F", "\&.fpp", "\&.FPP",
- "\&.m", "\&.mm",
- "\&.S", "\&.spp", "\&.SPP"]
-.fi
-.if n \{\
-.RE
-.\}
-.RE
-.PP
-CVS
-.RS 4
-The CVS executable\&.
-.RE
-.PP
-CVSCOFLAGS
-.RS 4
-Options that are passed to the CVS checkout subcommand\&.
-.RE
-.PP
-CVSCOM
-.RS 4
-The command line used to fetch source files from a CVS repository\&.
-.RE
-.PP
-CVSCOMSTR
-.RS 4
-The string displayed when fetching a source file from a CVS repository\&. If this is not set, then
-\fB$CVSCOM\fR
-(the command line) is displayed\&.
-.RE
-.PP
-CVSFLAGS
-.RS 4
-General options that are passed to CVS\&. By default, this is set to
-\-d $CVSREPOSITORY
-to specify from where the files must be fetched\&.
-.RE
-.PP
-CVSREPOSITORY
-.RS 4
-The path to the CVS repository\&. This is referenced in the default
-\fB$CVSFLAGS\fR
-value\&.
-.RE
-.PP
-CXX
-.RS 4
-The C++ compiler\&.
-.RE
-.PP
-CXXCOM
-.RS 4
-The command line used to compile a C++ source file to an object file\&. Any options specified in the
-\fB$CXXFLAGS\fR
-and
-\fB$CPPFLAGS\fR
-construction variables are included on this command line\&.
-.RE
-.PP
-CXXCOMSTR
-.RS 4
-The string displayed when a C++ source file is compiled to a (static) object file\&. If this is not set, then
-\fB$CXXCOM\fR
-(the command line) is displayed\&.
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-env = Environment(CXXCOMSTR = "Compiling static object $TARGET")
-.fi
-.if n \{\
-.RE
-.\}
-.RE
-.PP
-CXXFILESUFFIX
-.RS 4
-The suffix for C++ source files\&. This is used by the internal CXXFile builder when generating C++ files from Lex (\&.ll) or YACC (\&.yy) input files\&. The default suffix is
-\&.cc\&. SCons also treats files with the suffixes
-\&.cpp,
-\&.cxx,
-\&.c++, and
-\&.C++
-as C++ files, and files with
-\&.mm
-suffixes as Objective C++ files\&. On case\-sensitive systems (Linux, UNIX, and other POSIX\-alikes), SCons also treats
-\&.C
-(upper case) files as C++ files\&.
-.RE
-.PP
-CXXFLAGS
-.RS 4
-General options that are passed to the C++ compiler\&. By default, this includes the value of
-\fB$CCFLAGS\fR, so that setting
-\fB$CCFLAGS\fR
-affects both C and C++ compilation\&. If you want to add C++\-specific flags, you must set or override the value of
-\fB$CXXFLAGS\fR\&.
-.RE
-.PP
-CXXVERSION
-.RS 4
-The version number of the C++ compiler\&. This may or may not be set, depending on the specific C++ compiler being used\&.
-.RE
-.PP
-DC
-.RS 4
-DC\&.
-.RE
-.PP
-DCOM
-.RS 4
-DCOM\&.
-.RE
-.PP
-DDEBUG
-.RS 4
-DDEBUG\&.
-.RE
-.PP
-_DDEBUGFLAGS
-.RS 4
-_DDEBUGFLAGS\&.
-.RE
-.PP
-DDEBUGPREFIX
-.RS 4
-DDEBUGPREFIX\&.
-.RE
-.PP
-DDEBUGSUFFIX
-.RS 4
-DDEBUGSUFFIX\&.
-.RE
-.PP
-DESCRIPTION
-.RS 4
-A long description of the project being packaged\&. This is included in the relevant section of the file that controls the packaging build\&.
-.RE
-.PP
-DESCRIPTION_lang
-.RS 4
-A language\-specific long description for the specified
-\fIlang\fR\&. This is used to populate a
-%description \-l
-section of an RPM
-\&.spec
-file\&.
-.RE
-.PP
-DFILESUFFIX
-.RS 4
-DFILESUFFIX\&.
-.RE
-.PP
-DFLAGPREFIX
-.RS 4
-DFLAGPREFIX\&.
-.RE
-.PP
-_DFLAGS
-.RS 4
-_DFLAGS\&.
-.RE
-.PP
-DFLAGS
-.RS 4
-DFLAGS\&.
-.RE
-.PP
-DFLAGSUFFIX
-.RS 4
-DFLAGSUFFIX\&.
-.RE
-.PP
-_DINCFLAGS
-.RS 4
-_DINCFLAGS\&.
-.RE
-.PP
-DINCPREFIX
-.RS 4
-DINCPREFIX\&.
-.RE
-.PP
-DINCSUFFIX
-.RS 4
-DINCSUFFIX\&.
-.RE
-.PP
-Dir
-.RS 4
-A function that converts a string into a Dir instance relative to the target being built\&.
-.sp
-A function that converts a string into a Dir instance relative to the target being built\&.
-.RE
-.PP
-Dirs
-.RS 4
-A function that converts a list of strings into a list of Dir instances relative to the target being built\&.
-.RE
-.PP
-DLIB
-.RS 4
-DLIB\&.
-.RE
-.PP
-DLIBCOM
-.RS 4
-DLIBCOM\&.
-.RE
-.PP
-_DLIBDIRFLAGS
-.RS 4
-_DLIBDIRFLAGS\&.
-.RE
-.PP
-DLIBDIRPREFIX
-.RS 4
-DLIBDIRPREFIX\&.
-.RE
-.PP
-DLIBDIRSUFFIX
-.RS 4
-DLIBDIRSUFFIX\&.
-.RE
-.PP
-DLIBFLAGPREFIX
-.RS 4
-DLIBFLAGPREFIX\&.
-.RE
-.PP
-_DLIBFLAGS
-.RS 4
-_DLIBFLAGS\&.
-.RE
-.PP
-DLIBFLAGSUFFIX
-.RS 4
-DLIBFLAGSUFFIX\&.
-.RE
-.PP
-DLIBLINKPREFIX
-.RS 4
-DLIBLINKPREFIX\&.
-.RE
-.PP
-DLIBLINKSUFFIX
-.RS 4
-DLIBLINKSUFFIX\&.
-.RE
-.PP
-DLINK
-.RS 4
-DLINK\&.
-.RE
-.PP
-DLINKCOM
-.RS 4
-DLINKCOM\&.
-.RE
-.PP
-DLINKFLAGPREFIX
-.RS 4
-DLINKFLAGPREFIX\&.
-.RE
-.PP
-DLINKFLAGS
-.RS 4
-DLINKFLAGS\&.
-.RE
-.PP
-DLINKFLAGSUFFIX
-.RS 4
-DLINKFLAGSUFFIX\&.
-.RE
-.PP
-DOCBOOK_DEFAULT_XSL_EPUB
-.RS 4
-The default XSLT file for the
-\fBDocbookEpub\fR
-builder within the current environment, if no other XSLT gets specified via keyword\&.
-.RE
-.PP
-DOCBOOK_DEFAULT_XSL_HTML
-.RS 4
-The default XSLT file for the
-\fBDocbookHtml\fR
-builder within the current environment, if no other XSLT gets specified via keyword\&.
-.RE
-.PP
-DOCBOOK_DEFAULT_XSL_HTMLCHUNKED
-.RS 4
-The default XSLT file for the
-\fBDocbookHtmlChunked\fR
-builder within the current environment, if no other XSLT gets specified via keyword\&.
-.RE
-.PP
-DOCBOOK_DEFAULT_XSL_HTMLHELP
-.RS 4
-The default XSLT file for the
-\fBDocbookHtmlhelp\fR
-builder within the current environment, if no other XSLT gets specified via keyword\&.
-.RE
-.PP
-DOCBOOK_DEFAULT_XSL_MAN
-.RS 4
-The default XSLT file for the
-\fBDocbookMan\fR
-builder within the current environment, if no other XSLT gets specified via keyword\&.
-.RE
-.PP
-DOCBOOK_DEFAULT_XSL_PDF
-.RS 4
-The default XSLT file for the
-\fBDocbookPdf\fR
-builder within the current environment, if no other XSLT gets specified via keyword\&.
-.RE
-.PP
-DOCBOOK_DEFAULT_XSL_SLIDESHTML
-.RS 4
-The default XSLT file for the
-\fBDocbookSlidesHtml\fR
-builder within the current environment, if no other XSLT gets specified via keyword\&.
-.RE
-.PP
-DOCBOOK_DEFAULT_XSL_SLIDESPDF
-.RS 4
-The default XSLT file for the
-\fBDocbookSlidesPdf\fR
-builder within the current environment, if no other XSLT gets specified via keyword\&.
-.RE
-.PP
-DOCBOOK_FOP
-.RS 4
-The path to the PDF renderer
-fop
-or
-xep, if one of them is installed (fop
-gets checked first)\&.
-.RE
-.PP
-DOCBOOK_FOPCOM
-.RS 4
-The full command\-line for the PDF renderer
-fop
-or
-xep\&.
-.RE
-.PP
-DOCBOOK_FOPCOMSTR
-.RS 4
-The string displayed when a renderer like
-fop
-or
-xep
-is used to create PDF output from an XML file\&.
-.RE
-.PP
-DOCBOOK_FOPFLAGS
-.RS 4
-Additonal command\-line flags for the PDF renderer
-fop
-or
-xep\&.
-.RE
-.PP
-DOCBOOK_XMLLINT
-.RS 4
-The path to the external executable
-xmllint, if it\*(Aqs installed\&. Note, that this is only used as last fallback for resolving XIncludes, if no libxml2 or lxml Python binding can be imported in the current system\&.
-.RE
-.PP
-DOCBOOK_XMLLINTCOM
-.RS 4
-The full command\-line for the external executable
-xmllint\&.
-.RE
-.PP
-DOCBOOK_XMLLINTCOMSTR
-.RS 4
-The string displayed when
-xmllint
-is used to resolve XIncludes for a given XML file\&.
-.RE
-.PP
-DOCBOOK_XMLLINTFLAGS
-.RS 4
-Additonal command\-line flags for the external executable
-xmllint\&.
-.RE
-.PP
-DOCBOOK_XSLTPROC
-.RS 4
-The path to the external executable
-xsltproc
-(or
-saxon,
-xalan), if one of them is installed\&. Note, that this is only used as last fallback for XSL transformations, if no libxml2 or lxml Python binding can be imported in the current system\&.
-.RE
-.PP
-DOCBOOK_XSLTPROCCOM
-.RS 4
-The full command\-line for the external executable
-xsltproc
-(or
-saxon,
-xalan)\&.
-.RE
-.PP
-DOCBOOK_XSLTPROCCOMSTR
-.RS 4
-The string displayed when
-xsltproc
-is used to transform an XML file via a given XSLT stylesheet\&.
-.RE
-.PP
-DOCBOOK_XSLTPROCFLAGS
-.RS 4
-Additonal command\-line flags for the external executable
-xsltproc
-(or
-saxon,
-xalan)\&.
-.RE
-.PP
-DOCBOOK_XSLTPROCPARAMS
-.RS 4
-Additonal parameters that are not intended for the XSLT processor executable, but the XSL processing itself\&. By default, they get appended at the end of the command line for
-saxon
-and
-saxon\-xslt, respectively\&.
-.RE
-.PP
-DPATH
-.RS 4
-DPATH\&.
-.RE
-.PP
-DSUFFIXES
-.RS 4
-The list of suffixes of files that will be scanned for imported D package files\&. The default list is:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-[\*(Aq\&.d\*(Aq]
-.fi
-.if n \{\
-.RE
-.\}
-.RE
-.PP
-_DVERFLAGS
-.RS 4
-_DVERFLAGS\&.
-.RE
-.PP
-DVERPREFIX
-.RS 4
-DVERPREFIX\&.
-.RE
-.PP
-DVERSIONS
-.RS 4
-DVERSIONS\&.
-.RE
-.PP
-DVERSUFFIX
-.RS 4
-DVERSUFFIX\&.
-.RE
-.PP
-DVIPDF
-.RS 4
-The TeX DVI file to PDF file converter\&.
-.RE
-.PP
-DVIPDFCOM
-.RS 4
-The command line used to convert TeX DVI files into a PDF file\&.
-.RE
-.PP
-DVIPDFCOMSTR
-.RS 4
-The string displayed when a TeX DVI file is converted into a PDF file\&. If this is not set, then
-\fB$DVIPDFCOM\fR
-(the command line) is displayed\&.
-.RE
-.PP
-DVIPDFFLAGS
-.RS 4
-General options passed to the TeX DVI file to PDF file converter\&.
-.RE
-.PP
-DVIPS
-.RS 4
-The TeX DVI file to PostScript converter\&.
-.RE
-.PP
-DVIPSFLAGS
-.RS 4
-General options passed to the TeX DVI file to PostScript converter\&.
-.RE
-.PP
-ENV
-.RS 4
-A dictionary of environment variables to use when invoking commands\&. When
-\fB$ENV\fR
-is used in a command all list values will be joined using the path separator and any other non\-string values will simply be coerced to a string\&. Note that, by default,
-scons
-does
-\fInot\fR
-propagate the environment in force when you execute
-scons
-to the commands used to build target files\&. This is so that builds will be guaranteed repeatable regardless of the environment variables set at the time
-scons
-is invoked\&.
-.sp
-If you want to propagate your environment variables to the commands executed to build target files, you must do so explicitly:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-import os
-env = Environment(ENV = os\&.environ)
-.fi
-.if n \{\
-.RE
-.\}
-.sp
-Note that you can choose only to propagate certain environment variables\&. A common example is the system
-\fBPATH\fR
-environment variable, so that
-scons
-uses the same utilities as the invoking shell (or other process):
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-import os
-env = Environment(ENV = {\*(AqPATH\*(Aq : os\&.environ[\*(AqPATH\*(Aq]})
-.fi
-.if n \{\
-.RE
-.\}
-.RE
-.PP
-ESCAPE
-.RS 4
-A function that will be called to escape shell special characters in command lines\&. The function should take one argument: the command line string to escape; and should return the escaped command line\&.
-.RE
-.PP
-F03
-.RS 4
-The Fortran 03 compiler\&. You should normally set the
-\fB$FORTRAN\fR
-variable, which specifies the default Fortran compiler for all Fortran versions\&. You only need to set
-\fB$F03\fR
-if you need to use a specific compiler or compiler version for Fortran 03 files\&.
-.RE
-.PP
-F03COM
-.RS 4
-The command line used to compile a Fortran 03 source file to an object file\&. You only need to set
-\fB$F03COM\fR
-if you need to use a specific command line for Fortran 03 files\&. You should normally set the
-\fB$FORTRANCOM\fR
-variable, which specifies the default command line for all Fortran versions\&.
-.RE
-.PP
-F03COMSTR
-.RS 4
-The string displayed when a Fortran 03 source file is compiled to an object file\&. If this is not set, then
-\fB$F03COM\fR
-or
-\fB$FORTRANCOM\fR
-(the command line) is displayed\&.
-.RE
-.PP
-F03FILESUFFIXES
-.RS 4
-The list of file extensions for which the F03 dialect will be used\&. By default, this is [\*(Aq\&.f03\*(Aq]
-.RE
-.PP
-F03FLAGS
-.RS 4
-General user\-specified options that are passed to the Fortran 03 compiler\&. Note that this variable does
-\fInot\fR
-contain
-\fB\-I\fR
-(or similar) include search path options that scons generates automatically from
-\fB$F03PATH\fR\&. See
-\fB$_F03INCFLAGS\fR
-below, for the variable that expands to those options\&. You only need to set
-\fB$F03FLAGS\fR
-if you need to define specific user options for Fortran 03 files\&. You should normally set the
-\fB$FORTRANFLAGS\fR
-variable, which specifies the user\-specified options passed to the default Fortran compiler for all Fortran versions\&.
-.RE
-.PP
-_F03INCFLAGS
-.RS 4
-An automatically\-generated construction variable containing the Fortran 03 compiler command\-line options for specifying directories to be searched for include files\&. The value of
-\fB$_F03INCFLAGS\fR
-is created by appending
-\fB$INCPREFIX\fR
-and
-\fB$INCSUFFIX\fR
-to the beginning and end of each directory in
-\fB$F03PATH\fR\&.
-.RE
-.PP
-F03PATH
-.RS 4
-The list of directories that the Fortran 03 compiler will search for include directories\&. The implicit dependency scanner will search these directories for include files\&. Don\*(Aqt explicitly put include directory arguments in
-\fB$F03FLAGS\fR
-because the result will be non\-portable and the directories will not be searched by the dependency scanner\&. Note: directory names in
-\fB$F03PATH\fR
-will be looked\-up relative to the SConscript directory when they are used in a command\&. To force
-scons
-to look\-up a directory relative to the root of the source tree use #: You only need to set
-\fB$F03PATH\fR
-if you need to define a specific include path for Fortran 03 files\&. You should normally set the
-\fB$FORTRANPATH\fR
-variable, which specifies the include path for the default Fortran compiler for all Fortran versions\&.
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-env = Environment(F03PATH=\*(Aq#/include\*(Aq)
-.fi
-.if n \{\
-.RE
-.\}
-.sp
-The directory look\-up can also be forced using the
-\fBDir\fR() function:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-include = Dir(\*(Aqinclude\*(Aq)
-env = Environment(F03PATH=include)
-.fi
-.if n \{\
-.RE
-.\}
-.sp
-The directory list will be added to command lines through the automatically\-generated
-\fB$_F03INCFLAGS\fR
-construction variable, which is constructed by appending the values of the
-\fB$INCPREFIX\fR
-and
-\fB$INCSUFFIX\fR
-construction variables to the beginning and end of each directory in
-\fB$F03PATH\fR\&. Any command lines you define that need the F03PATH directory list should include
-\fB$_F03INCFLAGS\fR:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-env = Environment(F03COM="my_compiler $_F03INCFLAGS \-c \-o $TARGET $SOURCE")
-.fi
-.if n \{\
-.RE
-.\}
-.RE
-.PP
-F03PPCOM
-.RS 4
-The command line used to compile a Fortran 03 source file to an object file after first running the file through the C preprocessor\&. Any options specified in the
-\fB$F03FLAGS\fR
-and
-\fB$CPPFLAGS\fR
-construction variables are included on this command line\&. You only need to set
-\fB$F03PPCOM\fR
-if you need to use a specific C\-preprocessor command line for Fortran 03 files\&. You should normally set the
-\fB$FORTRANPPCOM\fR
-variable, which specifies the default C\-preprocessor command line for all Fortran versions\&.
-.RE
-.PP
-F03PPCOMSTR
-.RS 4
-The string displayed when a Fortran 03 source file is compiled to an object file after first running the file through the C preprocessor\&. If this is not set, then
-\fB$F03PPCOM\fR
-or
-\fB$FORTRANPPCOM\fR
-(the command line) is displayed\&.
-.RE
-.PP
-F03PPFILESUFFIXES
-.RS 4
-The list of file extensions for which the compilation + preprocessor pass for F03 dialect will be used\&. By default, this is empty
-.RE
-.PP
-F08
-.RS 4
-The Fortran 08 compiler\&. You should normally set the
-\fB$FORTRAN\fR
-variable, which specifies the default Fortran compiler for all Fortran versions\&. You only need to set
-\fB$F08\fR
-if you need to use a specific compiler or compiler version for Fortran 08 files\&.
-.RE
-.PP
-F08COM
-.RS 4
-The command line used to compile a Fortran 08 source file to an object file\&. You only need to set
-\fB$F08COM\fR
-if you need to use a specific command line for Fortran 08 files\&. You should normally set the
-\fB$FORTRANCOM\fR
-variable, which specifies the default command line for all Fortran versions\&.
-.RE
-.PP
-F08COMSTR
-.RS 4
-The string displayed when a Fortran 08 source file is compiled to an object file\&. If this is not set, then
-\fB$F08COM\fR
-or
-\fB$FORTRANCOM\fR
-(the command line) is displayed\&.
-.RE
-.PP
-F08FILESUFFIXES
-.RS 4
-The list of file extensions for which the F08 dialect will be used\&. By default, this is [\*(Aq\&.f08\*(Aq]
-.RE
-.PP
-F08FLAGS
-.RS 4
-General user\-specified options that are passed to the Fortran 08 compiler\&. Note that this variable does
-\fInot\fR
-contain
-\fB\-I\fR
-(or similar) include search path options that scons generates automatically from
-\fB$F08PATH\fR\&. See
-\fB$_F08INCFLAGS\fR
-below, for the variable that expands to those options\&. You only need to set
-\fB$F08FLAGS\fR
-if you need to define specific user options for Fortran 08 files\&. You should normally set the
-\fB$FORTRANFLAGS\fR
-variable, which specifies the user\-specified options passed to the default Fortran compiler for all Fortran versions\&.
-.RE
-.PP
-_F08INCFLAGS
-.RS 4
-An automatically\-generated construction variable containing the Fortran 08 compiler command\-line options for specifying directories to be searched for include files\&. The value of
-\fB$_F08INCFLAGS\fR
-is created by appending
-\fB$INCPREFIX\fR
-and
-\fB$INCSUFFIX\fR
-to the beginning and end of each directory in
-\fB$F08PATH\fR\&.
-.RE
-.PP
-F08PATH
-.RS 4
-The list of directories that the Fortran 08 compiler will search for include directories\&. The implicit dependency scanner will search these directories for include files\&. Don\*(Aqt explicitly put include directory arguments in
-\fB$F08FLAGS\fR
-because the result will be non\-portable and the directories will not be searched by the dependency scanner\&. Note: directory names in
-\fB$F08PATH\fR
-will be looked\-up relative to the SConscript directory when they are used in a command\&. To force
-scons
-to look\-up a directory relative to the root of the source tree use #: You only need to set
-\fB$F08PATH\fR
-if you need to define a specific include path for Fortran 08 files\&. You should normally set the
-\fB$FORTRANPATH\fR
-variable, which specifies the include path for the default Fortran compiler for all Fortran versions\&.
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-env = Environment(F08PATH=\*(Aq#/include\*(Aq)
-.fi
-.if n \{\
-.RE
-.\}
-.sp
-The directory look\-up can also be forced using the
-\fBDir\fR() function:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-include = Dir(\*(Aqinclude\*(Aq)
-env = Environment(F08PATH=include)
-.fi
-.if n \{\
-.RE
-.\}
-.sp
-The directory list will be added to command lines through the automatically\-generated
-\fB$_F08INCFLAGS\fR
-construction variable, which is constructed by appending the values of the
-\fB$INCPREFIX\fR
-and
-\fB$INCSUFFIX\fR
-construction variables to the beginning and end of each directory in
-\fB$F08PATH\fR\&. Any command lines you define that need the F08PATH directory list should include
-\fB$_F08INCFLAGS\fR:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-env = Environment(F08COM="my_compiler $_F08INCFLAGS \-c \-o $TARGET $SOURCE")
-.fi
-.if n \{\
-.RE
-.\}
-.RE
-.PP
-F08PPCOM
-.RS 4
-The command line used to compile a Fortran 08 source file to an object file after first running the file through the C preprocessor\&. Any options specified in the
-\fB$F08FLAGS\fR
-and
-\fB$CPPFLAGS\fR
-construction variables are included on this command line\&. You only need to set
-\fB$F08PPCOM\fR
-if you need to use a specific C\-preprocessor command line for Fortran 08 files\&. You should normally set the
-\fB$FORTRANPPCOM\fR
-variable, which specifies the default C\-preprocessor command line for all Fortran versions\&.
-.RE
-.PP
-F08PPCOMSTR
-.RS 4
-The string displayed when a Fortran 08 source file is compiled to an object file after first running the file through the C preprocessor\&. If this is not set, then
-\fB$F08PPCOM\fR
-or
-\fB$FORTRANPPCOM\fR
-(the command line) is displayed\&.
-.RE
-.PP
-F08PPFILESUFFIXES
-.RS 4
-The list of file extensions for which the compilation + preprocessor pass for F08 dialect will be used\&. By default, this is empty
-.RE
-.PP
-F77
-.RS 4
-The Fortran 77 compiler\&. You should normally set the
-\fB$FORTRAN\fR
-variable, which specifies the default Fortran compiler for all Fortran versions\&. You only need to set
-\fB$F77\fR
-if you need to use a specific compiler or compiler version for Fortran 77 files\&.
-.RE
-.PP
-F77COM
-.RS 4
-The command line used to compile a Fortran 77 source file to an object file\&. You only need to set
-\fB$F77COM\fR
-if you need to use a specific command line for Fortran 77 files\&. You should normally set the
-\fB$FORTRANCOM\fR
-variable, which specifies the default command line for all Fortran versions\&.
-.RE
-.PP
-F77COMSTR
-.RS 4
-The string displayed when a Fortran 77 source file is compiled to an object file\&. If this is not set, then
-\fB$F77COM\fR
-or
-\fB$FORTRANCOM\fR
-(the command line) is displayed\&.
-.RE
-.PP
-F77FILESUFFIXES
-.RS 4
-The list of file extensions for which the F77 dialect will be used\&. By default, this is [\*(Aq\&.f77\*(Aq]
-.RE
-.PP
-F77FLAGS
-.RS 4
-General user\-specified options that are passed to the Fortran 77 compiler\&. Note that this variable does
-\fInot\fR
-contain
-\fB\-I\fR
-(or similar) include search path options that scons generates automatically from
-\fB$F77PATH\fR\&. See
-\fB$_F77INCFLAGS\fR
-below, for the variable that expands to those options\&. You only need to set
-\fB$F77FLAGS\fR
-if you need to define specific user options for Fortran 77 files\&. You should normally set the
-\fB$FORTRANFLAGS\fR
-variable, which specifies the user\-specified options passed to the default Fortran compiler for all Fortran versions\&.
-.RE
-.PP
-_F77INCFLAGS
-.RS 4
-An automatically\-generated construction variable containing the Fortran 77 compiler command\-line options for specifying directories to be searched for include files\&. The value of
-\fB$_F77INCFLAGS\fR
-is created by appending
-\fB$INCPREFIX\fR
-and
-\fB$INCSUFFIX\fR
-to the beginning and end of each directory in
-\fB$F77PATH\fR\&.
-.RE
-.PP
-F77PATH
-.RS 4
-The list of directories that the Fortran 77 compiler will search for include directories\&. The implicit dependency scanner will search these directories for include files\&. Don\*(Aqt explicitly put include directory arguments in
-\fB$F77FLAGS\fR
-because the result will be non\-portable and the directories will not be searched by the dependency scanner\&. Note: directory names in
-\fB$F77PATH\fR
-will be looked\-up relative to the SConscript directory when they are used in a command\&. To force
-scons
-to look\-up a directory relative to the root of the source tree use #: You only need to set
-\fB$F77PATH\fR
-if you need to define a specific include path for Fortran 77 files\&. You should normally set the
-\fB$FORTRANPATH\fR
-variable, which specifies the include path for the default Fortran compiler for all Fortran versions\&.
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-env = Environment(F77PATH=\*(Aq#/include\*(Aq)
-.fi
-.if n \{\
-.RE
-.\}
-.sp
-The directory look\-up can also be forced using the
-\fBDir\fR() function:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-include = Dir(\*(Aqinclude\*(Aq)
-env = Environment(F77PATH=include)
-.fi
-.if n \{\
-.RE
-.\}
-.sp
-The directory list will be added to command lines through the automatically\-generated
-\fB$_F77INCFLAGS\fR
-construction variable, which is constructed by appending the values of the
-\fB$INCPREFIX\fR
-and
-\fB$INCSUFFIX\fR
-construction variables to the beginning and end of each directory in
-\fB$F77PATH\fR\&. Any command lines you define that need the F77PATH directory list should include
-\fB$_F77INCFLAGS\fR:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-env = Environment(F77COM="my_compiler $_F77INCFLAGS \-c \-o $TARGET $SOURCE")
-.fi
-.if n \{\
-.RE
-.\}
-.RE
-.PP
-F77PPCOM
-.RS 4
-The command line used to compile a Fortran 77 source file to an object file after first running the file through the C preprocessor\&. Any options specified in the
-\fB$F77FLAGS\fR
-and
-\fB$CPPFLAGS\fR
-construction variables are included on this command line\&. You only need to set
-\fB$F77PPCOM\fR
-if you need to use a specific C\-preprocessor command line for Fortran 77 files\&. You should normally set the
-\fB$FORTRANPPCOM\fR
-variable, which specifies the default C\-preprocessor command line for all Fortran versions\&.
-.RE
-.PP
-F77PPCOMSTR
-.RS 4
-The string displayed when a Fortran 77 source file is compiled to an object file after first running the file through the C preprocessor\&. If this is not set, then
-\fB$F77PPCOM\fR
-or
-\fB$FORTRANPPCOM\fR
-(the command line) is displayed\&.
-.RE
-.PP
-F77PPFILESUFFIXES
-.RS 4
-The list of file extensions for which the compilation + preprocessor pass for F77 dialect will be used\&. By default, this is empty
-.RE
-.PP
-F90
-.RS 4
-The Fortran 90 compiler\&. You should normally set the
-\fB$FORTRAN\fR
-variable, which specifies the default Fortran compiler for all Fortran versions\&. You only need to set
-\fB$F90\fR
-if you need to use a specific compiler or compiler version for Fortran 90 files\&.
-.RE
-.PP
-F90COM
-.RS 4
-The command line used to compile a Fortran 90 source file to an object file\&. You only need to set
-\fB$F90COM\fR
-if you need to use a specific command line for Fortran 90 files\&. You should normally set the
-\fB$FORTRANCOM\fR
-variable, which specifies the default command line for all Fortran versions\&.
-.RE
-.PP
-F90COMSTR
-.RS 4
-The string displayed when a Fortran 90 source file is compiled to an object file\&. If this is not set, then
-\fB$F90COM\fR
-or
-\fB$FORTRANCOM\fR
-(the command line) is displayed\&.
-.RE
-.PP
-F90FILESUFFIXES
-.RS 4
-The list of file extensions for which the F90 dialect will be used\&. By default, this is [\*(Aq\&.f90\*(Aq]
-.RE
-.PP
-F90FLAGS
-.RS 4
-General user\-specified options that are passed to the Fortran 90 compiler\&. Note that this variable does
-\fInot\fR
-contain
-\fB\-I\fR
-(or similar) include search path options that scons generates automatically from
-\fB$F90PATH\fR\&. See
-\fB$_F90INCFLAGS\fR
-below, for the variable that expands to those options\&. You only need to set
-\fB$F90FLAGS\fR
-if you need to define specific user options for Fortran 90 files\&. You should normally set the
-\fB$FORTRANFLAGS\fR
-variable, which specifies the user\-specified options passed to the default Fortran compiler for all Fortran versions\&.
-.RE
-.PP
-_F90INCFLAGS
-.RS 4
-An automatically\-generated construction variable containing the Fortran 90 compiler command\-line options for specifying directories to be searched for include files\&. The value of
-\fB$_F90INCFLAGS\fR
-is created by appending
-\fB$INCPREFIX\fR
-and
-\fB$INCSUFFIX\fR
-to the beginning and end of each directory in
-\fB$F90PATH\fR\&.
-.RE
-.PP
-F90PATH
-.RS 4
-The list of directories that the Fortran 90 compiler will search for include directories\&. The implicit dependency scanner will search these directories for include files\&. Don\*(Aqt explicitly put include directory arguments in
-\fB$F90FLAGS\fR
-because the result will be non\-portable and the directories will not be searched by the dependency scanner\&. Note: directory names in
-\fB$F90PATH\fR
-will be looked\-up relative to the SConscript directory when they are used in a command\&. To force
-scons
-to look\-up a directory relative to the root of the source tree use #: You only need to set
-\fB$F90PATH\fR
-if you need to define a specific include path for Fortran 90 files\&. You should normally set the
-\fB$FORTRANPATH\fR
-variable, which specifies the include path for the default Fortran compiler for all Fortran versions\&.
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-env = Environment(F90PATH=\*(Aq#/include\*(Aq)
-.fi
-.if n \{\
-.RE
-.\}
-.sp
-The directory look\-up can also be forced using the
-\fBDir\fR() function:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-include = Dir(\*(Aqinclude\*(Aq)
-env = Environment(F90PATH=include)
-.fi
-.if n \{\
-.RE
-.\}
-.sp
-The directory list will be added to command lines through the automatically\-generated
-\fB$_F90INCFLAGS\fR
-construction variable, which is constructed by appending the values of the
-\fB$INCPREFIX\fR
-and
-\fB$INCSUFFIX\fR
-construction variables to the beginning and end of each directory in
-\fB$F90PATH\fR\&. Any command lines you define that need the F90PATH directory list should include
-\fB$_F90INCFLAGS\fR:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-env = Environment(F90COM="my_compiler $_F90INCFLAGS \-c \-o $TARGET $SOURCE")
-.fi
-.if n \{\
-.RE
-.\}
-.RE
-.PP
-F90PPCOM
-.RS 4
-The command line used to compile a Fortran 90 source file to an object file after first running the file through the C preprocessor\&. Any options specified in the
-\fB$F90FLAGS\fR
-and
-\fB$CPPFLAGS\fR
-construction variables are included on this command line\&. You only need to set
-\fB$F90PPCOM\fR
-if you need to use a specific C\-preprocessor command line for Fortran 90 files\&. You should normally set the
-\fB$FORTRANPPCOM\fR
-variable, which specifies the default C\-preprocessor command line for all Fortran versions\&.
-.RE
-.PP
-F90PPCOMSTR
-.RS 4
-The string displayed when a Fortran 90 source file is compiled after first running the file through the C preprocessor\&. If this is not set, then
-\fB$F90PPCOM\fR
-or
-\fB$FORTRANPPCOM\fR
-(the command line) is displayed\&.
-.RE
-.PP
-F90PPFILESUFFIXES
-.RS 4
-The list of file extensions for which the compilation + preprocessor pass for F90 dialect will be used\&. By default, this is empty
-.RE
-.PP
-F95
-.RS 4
-The Fortran 95 compiler\&. You should normally set the
-\fB$FORTRAN\fR
-variable, which specifies the default Fortran compiler for all Fortran versions\&. You only need to set
-\fB$F95\fR
-if you need to use a specific compiler or compiler version for Fortran 95 files\&.
-.RE
-.PP
-F95COM
-.RS 4
-The command line used to compile a Fortran 95 source file to an object file\&. You only need to set
-\fB$F95COM\fR
-if you need to use a specific command line for Fortran 95 files\&. You should normally set the
-\fB$FORTRANCOM\fR
-variable, which specifies the default command line for all Fortran versions\&.
-.RE
-.PP
-F95COMSTR
-.RS 4
-The string displayed when a Fortran 95 source file is compiled to an object file\&. If this is not set, then
-\fB$F95COM\fR
-or
-\fB$FORTRANCOM\fR
-(the command line) is displayed\&.
-.RE
-.PP
-F95FILESUFFIXES
-.RS 4
-The list of file extensions for which the F95 dialect will be used\&. By default, this is [\*(Aq\&.f95\*(Aq]
-.RE
-.PP
-F95FLAGS
-.RS 4
-General user\-specified options that are passed to the Fortran 95 compiler\&. Note that this variable does
-\fInot\fR
-contain
-\fB\-I\fR
-(or similar) include search path options that scons generates automatically from
-\fB$F95PATH\fR\&. See
-\fB$_F95INCFLAGS\fR
-below, for the variable that expands to those options\&. You only need to set
-\fB$F95FLAGS\fR
-if you need to define specific user options for Fortran 95 files\&. You should normally set the
-\fB$FORTRANFLAGS\fR
-variable, which specifies the user\-specified options passed to the default Fortran compiler for all Fortran versions\&.
-.RE
-.PP
-_F95INCFLAGS
-.RS 4
-An automatically\-generated construction variable containing the Fortran 95 compiler command\-line options for specifying directories to be searched for include files\&. The value of
-\fB$_F95INCFLAGS\fR
-is created by appending
-\fB$INCPREFIX\fR
-and
-\fB$INCSUFFIX\fR
-to the beginning and end of each directory in
-\fB$F95PATH\fR\&.
-.RE
-.PP
-F95PATH
-.RS 4
-The list of directories that the Fortran 95 compiler will search for include directories\&. The implicit dependency scanner will search these directories for include files\&. Don\*(Aqt explicitly put include directory arguments in
-\fB$F95FLAGS\fR
-because the result will be non\-portable and the directories will not be searched by the dependency scanner\&. Note: directory names in
-\fB$F95PATH\fR
-will be looked\-up relative to the SConscript directory when they are used in a command\&. To force
-scons
-to look\-up a directory relative to the root of the source tree use #: You only need to set
-\fB$F95PATH\fR
-if you need to define a specific include path for Fortran 95 files\&. You should normally set the
-\fB$FORTRANPATH\fR
-variable, which specifies the include path for the default Fortran compiler for all Fortran versions\&.
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-env = Environment(F95PATH=\*(Aq#/include\*(Aq)
-.fi
-.if n \{\
-.RE
-.\}
-.sp
-The directory look\-up can also be forced using the
-\fBDir\fR() function:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-include = Dir(\*(Aqinclude\*(Aq)
-env = Environment(F95PATH=include)
-.fi
-.if n \{\
-.RE
-.\}
-.sp
-The directory list will be added to command lines through the automatically\-generated
-\fB$_F95INCFLAGS\fR
-construction variable, which is constructed by appending the values of the
-\fB$INCPREFIX\fR
-and
-\fB$INCSUFFIX\fR
-construction variables to the beginning and end of each directory in
-\fB$F95PATH\fR\&. Any command lines you define that need the F95PATH directory list should include
-\fB$_F95INCFLAGS\fR:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-env = Environment(F95COM="my_compiler $_F95INCFLAGS \-c \-o $TARGET $SOURCE")
-.fi
-.if n \{\
-.RE
-.\}
-.RE
-.PP
-F95PPCOM
-.RS 4
-The command line used to compile a Fortran 95 source file to an object file after first running the file through the C preprocessor\&. Any options specified in the
-\fB$F95FLAGS\fR
-and
-\fB$CPPFLAGS\fR
-construction variables are included on this command line\&. You only need to set
-\fB$F95PPCOM\fR
-if you need to use a specific C\-preprocessor command line for Fortran 95 files\&. You should normally set the
-\fB$FORTRANPPCOM\fR
-variable, which specifies the default C\-preprocessor command line for all Fortran versions\&.
-.RE
-.PP
-F95PPCOMSTR
-.RS 4
-The string displayed when a Fortran 95 source file is compiled to an object file after first running the file through the C preprocessor\&. If this is not set, then
-\fB$F95PPCOM\fR
-or
-\fB$FORTRANPPCOM\fR
-(the command line) is displayed\&.
-.RE
-.PP
-F95PPFILESUFFIXES
-.RS 4
-The list of file extensions for which the compilation + preprocessor pass for F95 dialect will be used\&. By default, this is empty
-.RE
-.PP
-File
-.RS 4
-A function that converts a string into a File instance relative to the target being built\&.
-.sp
-A function that converts a string into a File instance relative to the target being built\&.
-.RE
-.PP
-FORTRAN
-.RS 4
-The default Fortran compiler for all versions of Fortran\&.
-.RE
-.PP
-FORTRANCOM
-.RS 4
-The command line used to compile a Fortran source file to an object file\&. By default, any options specified in the
-\fB$FORTRANFLAGS\fR,
-\fB$CPPFLAGS\fR,
-\fB$_CPPDEFFLAGS\fR,
-\fB$_FORTRANMODFLAG\fR, and
-\fB$_FORTRANINCFLAGS\fR
-construction variables are included on this command line\&.
-.RE
-.PP
-FORTRANCOMSTR
-.RS 4
-The string displayed when a Fortran source file is compiled to an object file\&. If this is not set, then
-\fB$FORTRANCOM\fR
-(the command line) is displayed\&.
-.RE
-.PP
-FORTRANFILESUFFIXES
-.RS 4
-The list of file extensions for which the FORTRAN dialect will be used\&. By default, this is [\*(Aq\&.f\*(Aq, \*(Aq\&.for\*(Aq, \*(Aq\&.ftn\*(Aq]
-.RE
-.PP
-FORTRANFLAGS
-.RS 4
-General user\-specified options that are passed to the Fortran compiler\&. Note that this variable does
-\fInot\fR
-contain
-\fB\-I\fR
-(or similar) include or module search path options that scons generates automatically from
-\fB$FORTRANPATH\fR\&. See
-\fB$_FORTRANINCFLAGS\fR
-and
-\fB$_FORTRANMODFLAG\fR, below, for the variables that expand those options\&.
-.RE
-.PP
-_FORTRANINCFLAGS
-.RS 4
-An automatically\-generated construction variable containing the Fortran compiler command\-line options for specifying directories to be searched for include files and module files\&. The value of
-\fB$_FORTRANINCFLAGS\fR
-is created by prepending/appending
-\fB$INCPREFIX\fR
-and
-\fB$INCSUFFIX\fR
-to the beginning and end of each directory in
-\fB$FORTRANPATH\fR\&.
-.RE
-.PP
-FORTRANMODDIR
-.RS 4
-Directory location where the Fortran compiler should place any module files it generates\&. This variable is empty, by default\&. Some Fortran compilers will internally append this directory in the search path for module files, as well\&.
-.RE
-.PP
-FORTRANMODDIRPREFIX
-.RS 4
-The prefix used to specify a module directory on the Fortran compiler command line\&. This will be appended to the beginning of the directory in the
-\fB$FORTRANMODDIR\fR
-construction variables when the
-\fB$_FORTRANMODFLAG\fR
-variables is automatically generated\&.
-.RE
-.PP
-FORTRANMODDIRSUFFIX
-.RS 4
-The suffix used to specify a module directory on the Fortran compiler command line\&. This will be appended to the beginning of the directory in the
-\fB$FORTRANMODDIR\fR
-construction variables when the
-\fB$_FORTRANMODFLAG\fR
-variables is automatically generated\&.
-.RE
-.PP
-_FORTRANMODFLAG
-.RS 4
-An automatically\-generated construction variable containing the Fortran compiler command\-line option for specifying the directory location where the Fortran compiler should place any module files that happen to get generated during compilation\&. The value of
-\fB$_FORTRANMODFLAG\fR
-is created by prepending/appending
-\fB$FORTRANMODDIRPREFIX\fR
-and
-\fB$FORTRANMODDIRSUFFIX\fR
-to the beginning and end of the directory in
-\fB$FORTRANMODDIR\fR\&.
-.RE
-.PP
-FORTRANMODPREFIX
-.RS 4
-The module file prefix used by the Fortran compiler\&. SCons assumes that the Fortran compiler follows the quasi\-standard naming convention for module files of
-module_name\&.mod\&. As a result, this variable is left empty, by default\&. For situations in which the compiler does not necessarily follow the normal convention, the user may use this variable\&. Its value will be appended to every module file name as scons attempts to resolve dependencies\&.
-.RE
-.PP
-FORTRANMODSUFFIX
-.RS 4
-The module file suffix used by the Fortran compiler\&. SCons assumes that the Fortran compiler follows the quasi\-standard naming convention for module files of
-module_name\&.mod\&. As a result, this variable is set to "\&.mod", by default\&. For situations in which the compiler does not necessarily follow the normal convention, the user may use this variable\&. Its value will be appended to every module file name as scons attempts to resolve dependencies\&.
-.RE
-.PP
-FORTRANPATH
-.RS 4
-The list of directories that the Fortran compiler will search for include files and (for some compilers) module files\&. The Fortran implicit dependency scanner will search these directories for include files (but not module files since they are autogenerated and, as such, may not actually exist at the time the scan takes place)\&. Don\*(Aqt explicitly put include directory arguments in FORTRANFLAGS because the result will be non\-portable and the directories will not be searched by the dependency scanner\&. Note: directory names in FORTRANPATH will be looked\-up relative to the SConscript directory when they are used in a command\&. To force
-scons
-to look\-up a directory relative to the root of the source tree use #:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-env = Environment(FORTRANPATH=\*(Aq#/include\*(Aq)
-.fi
-.if n \{\
-.RE
-.\}
-.sp
-The directory look\-up can also be forced using the
-\fBDir\fR() function:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-include = Dir(\*(Aqinclude\*(Aq)
-env = Environment(FORTRANPATH=include)
-.fi
-.if n \{\
-.RE
-.\}
-.sp
-The directory list will be added to command lines through the automatically\-generated
-\fB$_FORTRANINCFLAGS\fR
-construction variable, which is constructed by appending the values of the
-\fB$INCPREFIX\fR
-and
-\fB$INCSUFFIX\fR
-construction variables to the beginning and end of each directory in
-\fB$FORTRANPATH\fR\&. Any command lines you define that need the FORTRANPATH directory list should include
-\fB$_FORTRANINCFLAGS\fR:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-env = Environment(FORTRANCOM="my_compiler $_FORTRANINCFLAGS \-c \-o $TARGET $SOURCE")
-.fi
-.if n \{\
-.RE
-.\}
-.RE
-.PP
-FORTRANPPCOM
-.RS 4
-The command line used to compile a Fortran source file to an object file after first running the file through the C preprocessor\&. By default, any options specified in the
-\fB$FORTRANFLAGS\fR,
-\fB$CPPFLAGS\fR,
-\fB$_CPPDEFFLAGS\fR,
-\fB$_FORTRANMODFLAG\fR, and
-\fB$_FORTRANINCFLAGS\fR
-construction variables are included on this command line\&.
-.RE
-.PP
-FORTRANPPCOMSTR
-.RS 4
-The string displayed when a Fortran source file is compiled to an object file after first running the file through the C preprocessor\&. If this is not set, then
-\fB$FORTRANPPCOM\fR
-(the command line) is displayed\&.
-.RE
-.PP
-FORTRANPPFILESUFFIXES
-.RS 4
-The list of file extensions for which the compilation + preprocessor pass for FORTRAN dialect will be used\&. By default, this is [\*(Aq\&.fpp\*(Aq, \*(Aq\&.FPP\*(Aq]
-.RE
-.PP
-FORTRANSUFFIXES
-.RS 4
-The list of suffixes of files that will be scanned for Fortran implicit dependencies (INCLUDE lines and USE statements)\&. The default list is:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-["\&.f", "\&.F", "\&.for", "\&.FOR", "\&.ftn", "\&.FTN", "\&.fpp", "\&.FPP",
-"\&.f77", "\&.F77", "\&.f90", "\&.F90", "\&.f95", "\&.F95"]
-.fi
-.if n \{\
-.RE
-.\}
-.RE
-.PP
-FRAMEWORKPATH
-.RS 4
-On Mac OS X with gcc, a list containing the paths to search for frameworks\&. Used by the compiler to find framework\-style includes like #include <Fmwk/Header\&.h>\&. Used by the linker to find user\-specified frameworks when linking (see
-\fB$FRAMEWORKS\fR)\&. For example:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
- env\&.AppendUnique(FRAMEWORKPATH=\*(Aq#myframeworkdir\*(Aq)
-.fi
-.if n \{\
-.RE
-.\}
-.sp
-will add
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
- \&.\&.\&. \-Fmyframeworkdir
-.fi
-.if n \{\
-.RE
-.\}
-.sp
-to the compiler and linker command lines\&.
-.RE
-.PP
-_FRAMEWORKPATH
-.RS 4
-On Mac OS X with gcc, an automatically\-generated construction variable containing the linker command\-line options corresponding to
-\fB$FRAMEWORKPATH\fR\&.
-.RE
-.PP
-FRAMEWORKPATHPREFIX
-.RS 4
-On Mac OS X with gcc, the prefix to be used for the FRAMEWORKPATH entries\&. (see
-\fB$FRAMEWORKPATH\fR)\&. The default value is
-\fB\-F\fR\&.
-.RE
-.PP
-FRAMEWORKPREFIX
-.RS 4
-On Mac OS X with gcc, the prefix to be used for linking in frameworks (see
-\fB$FRAMEWORKS\fR)\&. The default value is
-\fB\-framework\fR\&.
-.RE
-.PP
-_FRAMEWORKS
-.RS 4
-On Mac OS X with gcc, an automatically\-generated construction variable containing the linker command\-line options for linking with FRAMEWORKS\&.
-.RE
-.PP
-FRAMEWORKS
-.RS 4
-On Mac OS X with gcc, a list of the framework names to be linked into a program or shared library or bundle\&. The default value is the empty list\&. For example:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
- env\&.AppendUnique(FRAMEWORKS=Split(\*(AqSystem Cocoa SystemConfiguration\*(Aq))
-.fi
-.if n \{\
-.RE
-.\}
-.RE
-.PP
-FRAMEWORKSFLAGS
-.RS 4
-On Mac OS X with gcc, general user\-supplied frameworks options to be added at the end of a command line building a loadable module\&. (This has been largely superseded by the
-\fB$FRAMEWORKPATH\fR,
-\fB$FRAMEWORKPATHPREFIX\fR,
-\fB$FRAMEWORKPREFIX\fR
-and
-\fB$FRAMEWORKS\fR
-variables described above\&.)
-.RE
-.PP
-GS
-.RS 4
-The Ghostscript program used, e\&.g\&. to convert PostScript to PDF files\&.
-.RE
-.PP
-GSCOM
-.RS 4
-The full Ghostscript command line used for the conversion process\&. Its default value is
-\(lq$GS $GSFLAGS \-sOutputFile=$TARGET $SOURCES\(rq\&.
-.RE
-.PP
-GSCOMSTR
-.RS 4
-The string displayed when Ghostscript is called for the conversion process\&. If this is not set (the default), then
-\fB$GSCOM\fR
-(the command line) is displayed\&.
-.RE
-.PP
-GSFLAGS
-.RS 4
-General options passed to the Ghostscript program, when converting PostScript to PDF files for example\&. Its default value is
-\(lq\-dNOPAUSE \-dBATCH \-sDEVICE=pdfwrite\(rq
-.RE
-.PP
-HOST_ARCH
-.RS 4
-The name of the host hardware architecture used to create the Environment\&. If a platform is specified when creating the Environment, then that Platform\*(Aqs logic will handle setting this value\&. This value is immutable, and should not be changed by the user after the Environment is initialized\&. Currently only set for Win32\&.
-.sp
-Sets the host architecture for Visual Studio compiler\&. If not set, default to the detected host architecture: note that this may depend on the python you are using\&. This variable must be passed as an argument to the Environment() constructor; setting it later has no effect\&.
-.sp
-Valid values are the same as for
-\fB$TARGET_ARCH\fR\&.
-.sp
-This is currently only used on Windows, but in the future it will be used on other OSes as well\&.
-.RE
-.PP
-HOST_OS
-.RS 4
-The name of the host operating system used to create the Environment\&. If a platform is specified when creating the Environment, then that Platform\*(Aqs logic will handle setting this value\&. This value is immutable, and should not be changed by the user after the Environment is initialized\&. Currently only set for Win32\&.
-.RE
-.PP
-IDLSUFFIXES
-.RS 4
-The list of suffixes of files that will be scanned for IDL implicit dependencies (#include or import lines)\&. The default list is:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-["\&.idl", "\&.IDL"]
-.fi
-.if n \{\
-.RE
-.\}
-.RE
-.PP
-IMPLICIT_COMMAND_DEPENDENCIES
-.RS 4
-Controls whether or not SCons will add implicit dependencies for the commands executed to build targets\&.
-.sp
-By default, SCons will add to each target an implicit dependency on the command represented by the first argument on any command line it executes\&. The specific file for the dependency is found by searching the
-\fIPATH\fR
-variable in the
-\fIENV\fR
-environment used to execute the command\&.
-.sp
-If the construction variable
-\fB$IMPLICIT_COMMAND_DEPENDENCIES\fR
-is set to a false value (None,
-False,
-0, etc\&.), then the implicit dependency will not be added to the targets built with that construction environment\&.
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-env = Environment(IMPLICIT_COMMAND_DEPENDENCIES = 0)
-.fi
-.if n \{\
-.RE
-.\}
-.RE
-.PP
-INCPREFIX
-.RS 4
-The prefix used to specify an include directory on the C compiler command line\&. This will be appended to the beginning of each directory in the
-\fB$CPPPATH\fR
-and
-\fB$FORTRANPATH\fR
-construction variables when the
-\fB$_CPPINCFLAGS\fR
-and
-\fB$_FORTRANINCFLAGS\fR
-variables are automatically generated\&.
-.RE
-.PP
-INCSUFFIX
-.RS 4
-The suffix used to specify an include directory on the C compiler command line\&. This will be appended to the end of each directory in the
-\fB$CPPPATH\fR
-and
-\fB$FORTRANPATH\fR
-construction variables when the
-\fB$_CPPINCFLAGS\fR
-and
-\fB$_FORTRANINCFLAGS\fR
-variables are automatically generated\&.
-.RE
-.PP
-INSTALL
-.RS 4
-A function to be called to install a file into a destination file name\&. The default function copies the file into the destination (and sets the destination file\*(Aqs mode and permission bits to match the source file\*(Aqs)\&. The function takes the following arguments:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-def install(dest, source, env):
-.fi
-.if n \{\
-.RE
-.\}
-.sp
-
-\fIdest\fR
-is the path name of the destination file\&.
-\fIsource\fR
-is the path name of the source file\&.
-\fIenv\fR
-is the construction environment (a dictionary of construction values) in force for this file installation\&.
-.RE
-.PP
-INSTALLSTR
-.RS 4
-The string displayed when a file is installed into a destination file name\&. The default is:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-Install file: "$SOURCE" as "$TARGET"
-.fi
-.if n \{\
-.RE
-.\}
-.RE
-.PP
-INTEL_C_COMPILER_VERSION
-.RS 4
-Set by the "intelc" Tool to the major version number of the Intel C compiler selected for use\&.
-.RE
-.PP
-JAR
-.RS 4
-The Java archive tool\&.
-.sp
-The Java archive tool\&.
-.RE
-.PP
-JARCHDIR
-.RS 4
-The directory to which the Java archive tool should change (using the
-\fB\-C\fR
-option)\&.
-.sp
-The directory to which the Java archive tool should change (using the
-\fB\-C\fR
-option)\&.
-.RE
-.PP
-JARCOM
-.RS 4
-The command line used to call the Java archive tool\&.
-.sp
-The command line used to call the Java archive tool\&.
-.RE
-.PP
-JARCOMSTR
-.RS 4
-The string displayed when the Java archive tool is called If this is not set, then
-\fB$JARCOM\fR
-(the command line) is displayed\&.
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-env = Environment(JARCOMSTR = "JARchiving $SOURCES into $TARGET")
-.fi
-.if n \{\
-.RE
-.\}
-.sp
-The string displayed when the Java archive tool is called If this is not set, then
-\fB$JARCOM\fR
-(the command line) is displayed\&.
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-env = Environment(JARCOMSTR = "JARchiving $SOURCES into $TARGET")
-.fi
-.if n \{\
-.RE
-.\}
-.RE
-.PP
-JARFLAGS
-.RS 4
-General options passed to the Java archive tool\&. By default this is set to
-\fBcf\fR
-to create the necessary
-\fBjar\fR
-file\&.
-.sp
-General options passed to the Java archive tool\&. By default this is set to
-\fBcf\fR
-to create the necessary
-\fBjar\fR
-file\&.
-.RE
-.PP
-JARSUFFIX
-.RS 4
-The suffix for Java archives:
-\&.jar
-by default\&.
-.sp
-The suffix for Java archives:
-\&.jar
-by default\&.
-.RE
-.PP
-JAVABOOTCLASSPATH
-.RS 4
-Specifies the list of directories that will be added to the
-javac
-command line via the
-\fB\-bootclasspath\fR
-option\&. The individual directory names will be separated by the operating system\*(Aqs path separate character (:
-on UNIX/Linux/POSIX,
-;
-on Windows)\&.
-.RE
-.PP
-JAVAC
-.RS 4
-The Java compiler\&.
-.RE
-.PP
-JAVACCOM
-.RS 4
-The command line used to compile a directory tree containing Java source files to corresponding Java class files\&. Any options specified in the
-\fB$JAVACFLAGS\fR
-construction variable are included on this command line\&.
-.RE
-.PP
-JAVACCOMSTR
-.RS 4
-The string displayed when compiling a directory tree of Java source files to corresponding Java class files\&. If this is not set, then
-\fB$JAVACCOM\fR
-(the command line) is displayed\&.
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-env = Environment(JAVACCOMSTR = "Compiling class files $TARGETS from $SOURCES")
-.fi
-.if n \{\
-.RE
-.\}
-.RE
-.PP
-JAVACFLAGS
-.RS 4
-General options that are passed to the Java compiler\&.
-.RE
-.PP
-JAVACLASSDIR
-.RS 4
-The directory in which Java class files may be found\&. This is stripped from the beginning of any Java \&.class file names supplied to the
-JavaH
-builder\&.
-.RE
-.PP
-JAVACLASSPATH
-.RS 4
-Specifies the list of directories that will be searched for Java
-\&.class
-file\&. The directories in this list will be added to the
-javac
-and
-javah
-command lines via the
-\fB\-classpath\fR
-option\&. The individual directory names will be separated by the operating system\*(Aqs path separate character (:
-on UNIX/Linux/POSIX,
-;
-on Windows)\&.
-.sp
-Note that this currently just adds the specified directory via the
-\fB\-classpath\fR
-option\&.
-SCons
-does not currently search the
-\fB$JAVACLASSPATH\fR
-directories for dependency
-\&.class
-files\&.
-.RE
-.PP
-JAVACLASSSUFFIX
-.RS 4
-The suffix for Java class files;
-\&.class
-by default\&.
-.RE
-.PP
-JAVAH
-.RS 4
-The Java generator for C header and stub files\&.
-.RE
-.PP
-JAVAHCOM
-.RS 4
-The command line used to generate C header and stub files from Java classes\&. Any options specified in the
-\fB$JAVAHFLAGS\fR
-construction variable are included on this command line\&.
-.RE
-.PP
-JAVAHCOMSTR
-.RS 4
-The string displayed when C header and stub files are generated from Java classes\&. If this is not set, then
-\fB$JAVAHCOM\fR
-(the command line) is displayed\&.
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-env = Environment(JAVAHCOMSTR = "Generating header/stub file(s) $TARGETS from $SOURCES")
-.fi
-.if n \{\
-.RE
-.\}
-.RE
-.PP
-JAVAHFLAGS
-.RS 4
-General options passed to the C header and stub file generator for Java classes\&.
-.RE
-.PP
-JAVASOURCEPATH
-.RS 4
-Specifies the list of directories that will be searched for input
-\&.java
-file\&. The directories in this list will be added to the
-javac
-command line via the
-\fB\-sourcepath\fR
-option\&. The individual directory names will be separated by the operating system\*(Aqs path separate character (:
-on UNIX/Linux/POSIX,
-;
-on Windows)\&.
-.sp
-Note that this currently just adds the specified directory via the
-\fB\-sourcepath\fR
-option\&.
-SCons
-does not currently search the
-\fB$JAVASOURCEPATH\fR
-directories for dependency
-\&.java
-files\&.
-.RE
-.PP
-JAVASUFFIX
-.RS 4
-The suffix for Java files;
-\&.java
-by default\&.
-.RE
-.PP
-JAVAVERSION
-.RS 4
-Specifies the Java version being used by the
-\fBJava\fR
-builder\&. This is
-\fInot\fR
-currently used to select one version of the Java compiler vs\&. another\&. Instead, you should set this to specify the version of Java supported by your
-javac
-compiler\&. The default is
-1\&.4\&.
-.sp
-This is sometimes necessary because Java 1\&.5 changed the file names that are created for nested anonymous inner classes, which can cause a mismatch with the files that
-SCons
-expects will be generated by the
-javac
-compiler\&. Setting
-\fB$JAVAVERSION\fR
-to
-1\&.5
-(or
-1\&.6, as appropriate) can make
-SCons
-realize that a Java 1\&.5 or 1\&.6 build is actually up to date\&.
-.RE
-.PP
-LATEX
-.RS 4
-The LaTeX structured formatter and typesetter\&.
-.RE
-.PP
-LATEXCOM
-.RS 4
-The command line used to call the LaTeX structured formatter and typesetter\&.
-.RE
-.PP
-LATEXCOMSTR
-.RS 4
-The string displayed when calling the LaTeX structured formatter and typesetter\&. If this is not set, then
-\fB$LATEXCOM\fR
-(the command line) is displayed\&.
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-env = Environment(LATEXCOMSTR = "Building $TARGET from LaTeX input $SOURCES")
-.fi
-.if n \{\
-.RE
-.\}
-.RE
-.PP
-LATEXFLAGS
-.RS 4
-General options passed to the LaTeX structured formatter and typesetter\&.
-.RE
-.PP
-LATEXRETRIES
-.RS 4
-The maximum number of times that LaTeX will be re\-run if the
-\&.log
-generated by the
-\fB$LATEXCOM\fR
-command indicates that there are undefined references\&. The default is to try to resolve undefined references by re\-running LaTeX up to three times\&.
-.RE
-.PP
-LATEXSUFFIXES
-.RS 4
-The list of suffixes of files that will be scanned for LaTeX implicit dependencies (\einclude
-or
-\eimport
-files)\&. The default list is:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-["\&.tex", "\&.ltx", "\&.latex"]
-.fi
-.if n \{\
-.RE
-.\}
-.RE
-.PP
-LDMODULE
-.RS 4
-The linker for building loadable modules\&. By default, this is the same as
-\fB$SHLINK\fR\&.
-.RE
-.PP
-LDMODULECOM
-.RS 4
-The command line for building loadable modules\&. On Mac OS X, this uses the
-\fB$LDMODULE\fR,
-\fB$LDMODULEFLAGS\fR
-and
-\fB$FRAMEWORKSFLAGS\fR
-variables\&. On other systems, this is the same as
-\fB$SHLINK\fR\&.
-.RE
-.PP
-LDMODULECOMSTR
-.RS 4
-The string displayed when building loadable modules\&. If this is not set, then
-\fB$LDMODULECOM\fR
-(the command line) is displayed\&.
-.RE
-.PP
-LDMODULEFLAGS
-.RS 4
-General user options passed to the linker for building loadable modules\&.
-.RE
-.PP
-LDMODULEPREFIX
-.RS 4
-The prefix used for loadable module file names\&. On Mac OS X, this is null; on other systems, this is the same as
-\fB$SHLIBPREFIX\fR\&.
-.RE
-.PP
-LDMODULESUFFIX
-.RS 4
-The suffix used for loadable module file names\&. On Mac OS X, this is null; on other systems, this is the same as $SHLIBSUFFIX\&.
-.RE
-.PP
-LEX
-.RS 4
-The lexical analyzer generator\&.
-.RE
-.PP
-LEXCOM
-.RS 4
-The command line used to call the lexical analyzer generator to generate a source file\&.
-.RE
-.PP
-LEXCOMSTR
-.RS 4
-The string displayed when generating a source file using the lexical analyzer generator\&. If this is not set, then
-\fB$LEXCOM\fR
-(the command line) is displayed\&.
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-env = Environment(LEXCOMSTR = "Lex\*(Aqing $TARGET from $SOURCES")
-.fi
-.if n \{\
-.RE
-.\}
-.RE
-.PP
-LEXFLAGS
-.RS 4
-General options passed to the lexical analyzer generator\&.
-.RE
-.PP
-_LIBDIRFLAGS
-.RS 4
-An automatically\-generated construction variable containing the linker command\-line options for specifying directories to be searched for library\&. The value of
-\fB$_LIBDIRFLAGS\fR
-is created by appending
-\fB$LIBDIRPREFIX\fR
-and
-\fB$LIBDIRSUFFIX\fR
-to the beginning and end of each directory in
-\fB$LIBPATH\fR\&.
-.RE
-.PP
-LIBDIRPREFIX
-.RS 4
-The prefix used to specify a library directory on the linker command line\&. This will be appended to the beginning of each directory in the
-\fB$LIBPATH\fR
-construction variable when the
-\fB$_LIBDIRFLAGS\fR
-variable is automatically generated\&.
-.RE
-.PP
-LIBDIRSUFFIX
-.RS 4
-The suffix used to specify a library directory on the linker command line\&. This will be appended to the end of each directory in the
-\fB$LIBPATH\fR
-construction variable when the
-\fB$_LIBDIRFLAGS\fR
-variable is automatically generated\&.
-.RE
-.PP
-LIBEMITTER
-.RS 4
-TODO
-.RE
-.PP
-_LIBFLAGS
-.RS 4
-An automatically\-generated construction variable containing the linker command\-line options for specifying libraries to be linked with the resulting target\&. The value of
-\fB$_LIBFLAGS\fR
-is created by appending
-\fB$LIBLINKPREFIX\fR
-and
-\fB$LIBLINKSUFFIX\fR
-to the beginning and end of each filename in
-\fB$LIBS\fR\&.
-.RE
-.PP
-LIBLINKPREFIX
-.RS 4
-The prefix used to specify a library to link on the linker command line\&. This will be appended to the beginning of each library in the
-\fB$LIBS\fR
-construction variable when the
-\fB$_LIBFLAGS\fR
-variable is automatically generated\&.
-.RE
-.PP
-LIBLINKSUFFIX
-.RS 4
-The suffix used to specify a library to link on the linker command line\&. This will be appended to the end of each library in the
-\fB$LIBS\fR
-construction variable when the
-\fB$_LIBFLAGS\fR
-variable is automatically generated\&.
-.RE
-.PP
-LIBPATH
-.RS 4
-The list of directories that will be searched for libraries\&. The implicit dependency scanner will search these directories for include files\&. Don\*(Aqt explicitly put include directory arguments in
-\fB$LINKFLAGS\fR
-or
-\fB$SHLINKFLAGS\fR
-because the result will be non\-portable and the directories will not be searched by the dependency scanner\&. Note: directory names in LIBPATH will be looked\-up relative to the SConscript directory when they are used in a command\&. To force
-scons
-to look\-up a directory relative to the root of the source tree use #:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-env = Environment(LIBPATH=\*(Aq#/libs\*(Aq)
-.fi
-.if n \{\
-.RE
-.\}
-.sp
-The directory look\-up can also be forced using the
-\fBDir\fR() function:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-libs = Dir(\*(Aqlibs\*(Aq)
-env = Environment(LIBPATH=libs)
-.fi
-.if n \{\
-.RE
-.\}
-.sp
-The directory list will be added to command lines through the automatically\-generated
-\fB$_LIBDIRFLAGS\fR
-construction variable, which is constructed by appending the values of the
-\fB$LIBDIRPREFIX\fR
-and
-\fB$LIBDIRSUFFIX\fR
-construction variables to the beginning and end of each directory in
-\fB$LIBPATH\fR\&. Any command lines you define that need the LIBPATH directory list should include
-\fB$_LIBDIRFLAGS\fR:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-env = Environment(LINKCOM="my_linker $_LIBDIRFLAGS $_LIBFLAGS \-o $TARGET $SOURCE")
-.fi
-.if n \{\
-.RE
-.\}
-.RE
-.PP
-LIBPREFIX
-.RS 4
-The prefix used for (static) library file names\&. A default value is set for each platform (posix, win32, os2, etc\&.), but the value is overridden by individual tools (ar, mslib, sgiar, sunar, tlib, etc\&.) to reflect the names of the libraries they create\&.
-.RE
-.PP
-LIBPREFIXES
-.RS 4
-A list of all legal prefixes for library file names\&. When searching for library dependencies, SCons will look for files with these prefixes, the base library name, and suffixes in the
-\fB$LIBSUFFIXES\fR
-list\&.
-.RE
-.PP
-LIBS
-.RS 4
-A list of one or more libraries that will be linked with any executable programs created by this environment\&.
-.sp
-The library list will be added to command lines through the automatically\-generated
-\fB$_LIBFLAGS\fR
-construction variable, which is constructed by appending the values of the
-\fB$LIBLINKPREFIX\fR
-and
-\fB$LIBLINKSUFFIX\fR
-construction variables to the beginning and end of each filename in
-\fB$LIBS\fR\&. Any command lines you define that need the LIBS library list should include
-\fB$_LIBFLAGS\fR:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-env = Environment(LINKCOM="my_linker $_LIBDIRFLAGS $_LIBFLAGS \-o $TARGET $SOURCE")
-.fi
-.if n \{\
-.RE
-.\}
-.sp
-If you add a File object to the
-\fB$LIBS\fR
-list, the name of that file will be added to
-\fB$_LIBFLAGS\fR, and thus the link line, as is, without
-\fB$LIBLINKPREFIX\fR
-or
-\fB$LIBLINKSUFFIX\fR\&. For example:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-env\&.Append(LIBS=File(\*(Aq/tmp/mylib\&.so\*(Aq))
-.fi
-.if n \{\
-.RE
-.\}
-.sp
-In all cases, scons will add dependencies from the executable program to all the libraries in this list\&.
-.RE
-.PP
-LIBSUFFIX
-.RS 4
-The suffix used for (static) library file names\&. A default value is set for each platform (posix, win32, os2, etc\&.), but the value is overridden by individual tools (ar, mslib, sgiar, sunar, tlib, etc\&.) to reflect the names of the libraries they create\&.
-.RE
-.PP
-LIBSUFFIXES
-.RS 4
-A list of all legal suffixes for library file names\&. When searching for library dependencies, SCons will look for files with prefixes, in the
-\fB$LIBPREFIXES\fR
-list, the base library name, and these suffixes\&.
-.RE
-.PP
-LICENSE
-.RS 4
-The abbreviated name of the license under which this project is released (gpl, lpgl, bsd etc\&.)\&. See http://www\&.opensource\&.org/licenses/alphabetical for a list of license names\&.
-.RE
-.PP
-LINESEPARATOR
-.RS 4
-The separator used by the
-\fBSubstfile\fR
-and
-\fBTextfile\fR
-builders\&. This value is used between sources when constructing the target\&. It defaults to the current system line separator\&.
-.RE
-.PP
-LINGUAS_FILE
-.RS 4
-The
-\fB$LINGUAS_FILE\fR
-defines file(s) containing list of additional linguas to be processed by
-\fBPOInit\fR,
-\fBPOUpdate\fR
-or
-\fBMOFiles\fR
-builders\&. It also affects
-\fBTranslate\fR
-builder\&. If the variable contains a string, it defines name of the list file\&. The
-\fB$LINGUAS_FILE\fR
-may be a list of file names as well\&. If
-\fB$LINGUAS_FILE\fR
-is set to
-True
-(or non\-zero numeric value), the list will be read from default file named
-LINGUAS\&.
-.RE
-.PP
-LINK
-.RS 4
-The linker\&.
-.RE
-.PP
-LINKCOM
-.RS 4
-The command line used to link object files into an executable\&.
-.RE
-.PP
-LINKCOMSTR
-.RS 4
-The string displayed when object files are linked into an executable\&. If this is not set, then
-\fB$LINKCOM\fR
-(the command line) is displayed\&.
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-env = Environment(LINKCOMSTR = "Linking $TARGET")
-.fi
-.if n \{\
-.RE
-.\}
-.RE
-.PP
-LINKFLAGS
-.RS 4
-General user options passed to the linker\&. Note that this variable should
-\fInot\fR
-contain
-\fB\-l\fR
-(or similar) options for linking with the libraries listed in
-\fB$LIBS\fR, nor
-\fB\-L\fR
-(or similar) library search path options that scons generates automatically from
-\fB$LIBPATH\fR\&. See
-\fB$_LIBFLAGS\fR
-above, for the variable that expands to library\-link options, and
-\fB$_LIBDIRFLAGS\fR
-above, for the variable that expands to library search path options\&.
-.RE
-.PP
-M4
-.RS 4
-The M4 macro preprocessor\&.
-.RE
-.PP
-M4COM
-.RS 4
-The command line used to pass files through the M4 macro preprocessor\&.
-.RE
-.PP
-M4COMSTR
-.RS 4
-The string displayed when a file is passed through the M4 macro preprocessor\&. If this is not set, then
-\fB$M4COM\fR
-(the command line) is displayed\&.
-.RE
-.PP
-M4FLAGS
-.RS 4
-General options passed to the M4 macro preprocessor\&.
-.RE
-.PP
-MAKEINDEX
-.RS 4
-The makeindex generator for the TeX formatter and typesetter and the LaTeX structured formatter and typesetter\&.
-.RE
-.PP
-MAKEINDEXCOM
-.RS 4
-The command line used to call the makeindex generator for the TeX formatter and typesetter and the LaTeX structured formatter and typesetter\&.
-.RE
-.PP
-MAKEINDEXCOMSTR
-.RS 4
-The string displayed when calling the makeindex generator for the TeX formatter and typesetter and the LaTeX structured formatter and typesetter\&. If this is not set, then
-\fB$MAKEINDEXCOM\fR
-(the command line) is displayed\&.
-.RE
-.PP
-MAKEINDEXFLAGS
-.RS 4
-General options passed to the makeindex generator for the TeX formatter and typesetter and the LaTeX structured formatter and typesetter\&.
-.RE
-.PP
-MAXLINELENGTH
-.RS 4
-The maximum number of characters allowed on an external command line\&. On Win32 systems, link lines longer than this many characters are linked via a temporary file name\&.
-.RE
-.PP
-MIDL
-.RS 4
-The Microsoft IDL compiler\&.
-.RE
-.PP
-MIDLCOM
-.RS 4
-The command line used to pass files to the Microsoft IDL compiler\&.
-.RE
-.PP
-MIDLCOMSTR
-.RS 4
-The string displayed when the Microsoft IDL copmiler is called\&. If this is not set, then
-\fB$MIDLCOM\fR
-(the command line) is displayed\&.
-.RE
-.PP
-MIDLFLAGS
-.RS 4
-General options passed to the Microsoft IDL compiler\&.
-.RE
-.PP
-MOSUFFIX
-.RS 4
-Suffix used for
-MO
-files (default:
-\*(Aq\&.mo\*(Aq)\&. See
-msgfmt
-tool and
-\fBMOFiles\fR
-builder\&.
-.RE
-.PP
-MSGFMT
-.RS 4
-Absolute path to
-\fBmsgfmt(1)\fR
-binary, found by
-\fBDetect()\fR\&. See
-msgfmt
-tool and
-\fBMOFiles\fR
-builder\&.
-.RE
-.PP
-MSGFMTCOM
-.RS 4
-Complete command line to run
-\fBmsgfmt(1)\fR
-program\&. See
-msgfmt
-tool and
-\fBMOFiles\fR
-builder\&.
-.RE
-.PP
-MSGFMTCOMSTR
-.RS 4
-String to display when
-\fBmsgfmt(1)\fR
-is invoked (default:
-\*(Aq\*(Aq, which means ``print
-\fB$MSGFMTCOM\fR\*(Aq\*(Aq)\&. See
-msgfmt
-tool and
-\fBMOFiles\fR
-builder\&.
-.RE
-.PP
-MSGFMTFLAGS
-.RS 4
-Additional flags to
-\fBmsgfmt(1)\fR\&. See
-msgfmt
-tool and
-\fBMOFiles\fR
-builder\&.
-.RE
-.PP
-MSGINIT
-.RS 4
-Path to
-\fBmsginit(1)\fR
-program (found via
-Detect())\&. See
-msginit
-tool and
-\fBPOInit\fR
-builder\&.
-.RE
-.PP
-MSGINITCOM
-.RS 4
-Complete command line to run
-\fBmsginit(1)\fR
-program\&. See
-msginit
-tool and
-\fBPOInit\fR
-builder\&.
-.RE
-.PP
-MSGINITCOMSTR
-.RS 4
-String to display when
-\fBmsginit(1)\fR
-is invoked (default:
-\*(Aq\*(Aq, which means ``print
-\fB$MSGINITCOM\fR\*(Aq\*(Aq)\&. See
-msginit
-tool and
-\fBPOInit\fR
-builder\&.
-.RE
-.PP
-MSGINITFLAGS
-.RS 4
-List of additional flags to
-\fBmsginit(1)\fR
-(default:
-[])\&. See
-msginit
-tool and
-\fBPOInit\fR
-builder\&.
-.RE
-.PP
-_MSGINITLOCALE
-.RS 4
-Internal ``macro\*(Aq\*(Aq\&. Computes locale (language) name based on target filename (default:
-\*(Aq${TARGET\&.filebase}\*(Aq)\&.
-.sp
-See
-msginit
-tool and
-\fBPOInit\fR
-builder\&.
-.RE
-.PP
-MSGMERGE
-.RS 4
-Absolute path to
-\fBmsgmerge(1)\fR
-binary as found by
-\fBDetect()\fR\&. See
-msgmerge
-tool and
-\fBPOUpdate\fR
-builder\&.
-.RE
-.PP
-MSGMERGECOM
-.RS 4
-Complete command line to run
-\fBmsgmerge(1)\fR
-command\&. See
-msgmerge
-tool and
-\fBPOUpdate\fR
-builder\&.
-.RE
-.PP
-MSGMERGECOMSTR
-.RS 4
-String to be displayed when
-\fBmsgmerge(1)\fR
-is invoked (default:
-\*(Aq\*(Aq, which means ``print
-\fB$MSGMERGECOM\fR\*(Aq\*(Aq)\&. See
-msgmerge
-tool and
-\fBPOUpdate\fR
-builder\&.
-.RE
-.PP
-MSGMERGEFLAGS
-.RS 4
-Additional flags to
-\fBmsgmerge(1)\fR
-command\&. See
-msgmerge
-tool and
-\fBPOUpdate\fR
-builder\&.
-.RE
-.PP
-MSSDK_DIR
-.RS 4
-The directory containing the Microsoft SDK (either Platform SDK or Windows SDK) to be used for compilation\&.
-.RE
-.PP
-MSSDK_VERSION
-.RS 4
-The version string of the Microsoft SDK (either Platform SDK or Windows SDK) to be used for compilation\&. Supported versions include
-6\&.1,
-6\&.0A,
-6\&.0,
-2003R2
-and
-2003R1\&.
-.RE
-.PP
-MSVC_BATCH
-.RS 4
-When set to any true value, specifies that SCons should batch compilation of object files when calling the Microsoft Visual C/C++ compiler\&. All compilations of source files from the same source directory that generate target files in a same output directory and were configured in SCons using the same construction environment will be built in a single call to the compiler\&. Only source files that have changed since their object files were built will be passed to each compiler invocation (via the
-\fB$CHANGED_SOURCES\fR
-construction variable)\&. Any compilations where the object (target) file base name (minus the
-\&.obj) does not match the source file base name will be compiled separately\&.
-.RE
-.PP
-MSVC_USE_SCRIPT
-.RS 4
-Use a batch script to set up Microsoft Visual Studio compiler
-.sp
-
-\fB$MSVC_USE_SCRIPT\fR
-overrides
-\fB$MSVC_VERSION\fR
-and
-\fB$TARGET_ARCH\fR\&. If set to the name of a Visual Studio \&.bat file (e\&.g\&. vcvars\&.bat), SCons will run that bat file and extract the relevant variables from the result (typically %INCLUDE%, %LIB%, and %PATH%)\&. Setting MSVC_USE_SCRIPT to None bypasses the Visual Studio autodetection entirely; use this if you are running SCons in a Visual Studio cmd window and importing the shell\*(Aqs environment variables\&.
-.RE
-.PP
-MSVC_VERSION
-.RS 4
-Sets the preferred version of Microsoft Visual C/C++ to use\&.
-.sp
-If
-\fB$MSVC_VERSION\fR
-is not set, SCons will (by default) select the latest version of Visual C/C++ installed on your system\&. If the specified version isn\*(Aqt installed, tool initialization will fail\&. This variable must be passed as an argument to the Environment() constructor; setting it later has no effect\&.
-.sp
-Valid values for Windows are
-12\&.0,
-12\&.0Exp,
-11\&.0,
-11\&.0Exp,
-10\&.0,
-10\&.0Exp,
-9\&.0,
-9\&.0Exp,
-8\&.0,
-8\&.0Exp,
-7\&.1,
-7\&.0, and
-6\&.0\&. Versions ending in
-Exp
-refer to "Express" or "Express for Desktop" editions\&.
-.RE
-.PP
-MSVS
-.RS 4
-When the Microsoft Visual Studio tools are initialized, they set up this dictionary with the following keys:
-.PP
-VERSION
-.RS 4
-the version of MSVS being used (can be set via
-\fB$MSVS_VERSION\fR)
-.RE
-.PP
-VERSIONS
-.RS 4
-the available versions of MSVS installed
-.RE
-.PP
-VCINSTALLDIR
-.RS 4
-installed directory of Visual C++
-.RE
-.PP
-VSINSTALLDIR
-.RS 4
-installed directory of Visual Studio
-.RE
-.PP
-FRAMEWORKDIR
-.RS 4
-installed directory of the \&.NET framework
-.RE
-.PP
-FRAMEWORKVERSIONS
-.RS 4
-list of installed versions of the \&.NET framework, sorted latest to oldest\&.
-.RE
-.PP
-FRAMEWORKVERSION
-.RS 4
-latest installed version of the \&.NET framework
-.RE
-.PP
-FRAMEWORKSDKDIR
-.RS 4
-installed location of the \&.NET SDK\&.
-.RE
-.PP
-PLATFORMSDKDIR
-.RS 4
-installed location of the Platform SDK\&.
-.RE
-.PP
-PLATFORMSDK_MODULES
-.RS 4
-dictionary of installed Platform SDK modules, where the dictionary keys are keywords for the various modules, and the values are 2\-tuples where the first is the release date, and the second is the version number\&.
-.RE
-.sp
-If a value isn\*(Aqt set, it wasn\*(Aqt available in the registry\&.
-.RE
-.PP
-MSVS_ARCH
-.RS 4
-Sets the architecture for which the generated project(s) should build\&.
-.sp
-The default value is
-x86\&.
-amd64
-is also supported by
-SCons
-for some Visual Studio versions\&. Trying to set
-\fB$MSVS_ARCH\fR
-to an architecture that\*(Aqs not supported for a given Visual Studio version will generate an error\&.
-.RE
-.PP
-MSVS_PROJECT_GUID
-.RS 4
-The string placed in a generated Microsoft Visual Studio project file as the value of the
-ProjectGUID
-attribute\&. There is no default value\&. If not defined, a new GUID is generated\&.
-.RE
-.PP
-MSVS_SCC_AUX_PATH
-.RS 4
-The path name placed in a generated Microsoft Visual Studio project file as the value of the
-SccAuxPath
-attribute if the
-\fBMSVS_SCC_PROVIDER\fR
-construction variable is also set\&. There is no default value\&.
-.RE
-.PP
-MSVS_SCC_CONNECTION_ROOT
-.RS 4
-The root path of projects in your SCC workspace, i\&.e the path under which all project and solution files will be generated\&. It is used as a reference path from which the relative paths of the generated Microsoft Visual Studio project and solution files are computed\&. The relative project file path is placed as the value of the
-SccLocalPath
-attribute of the project file and as the values of the
-SccProjectFilePathRelativizedFromConnection[i]
-(where [i] ranges from 0 to the number of projects in the solution) attributes of the
-GlobalSection(SourceCodeControl)
-section of the Microsoft Visual Studio solution file\&. Similarly the relative solution file path is placed as the values of the
-SccLocalPath[i]
-(where [i] ranges from 0 to the number of projects in the solution) attributes of the
-GlobalSection(SourceCodeControl)
-section of the Microsoft Visual Studio solution file\&. This is used only if the
-\fBMSVS_SCC_PROVIDER\fR
-construction variable is also set\&. The default value is the current working directory\&.
-.RE
-.PP
-MSVS_SCC_PROJECT_NAME
-.RS 4
-The project name placed in a generated Microsoft Visual Studio project file as the value of the
-SccProjectName
-attribute if the
-\fBMSVS_SCC_PROVIDER\fR
-construction variable is also set\&. In this case the string is also placed in the
-SccProjectName0
-attribute of the
-GlobalSection(SourceCodeControl)
-section of the Microsoft Visual Studio solution file\&. There is no default value\&.
-.RE
-.PP
-MSVS_SCC_PROVIDER
-.RS 4
-The string placed in a generated Microsoft Visual Studio project file as the value of the
-SccProvider
-attribute\&. The string is also placed in the
-SccProvider0
-attribute of the
-GlobalSection(SourceCodeControl)
-section of the Microsoft Visual Studio solution file\&. There is no default value\&.
-.RE
-.PP
-MSVS_VERSION
-.RS 4
-Sets the preferred version of Microsoft Visual Studio to use\&.
-.sp
-If
-\fB$MSVS_VERSION\fR
-is not set,
-SCons
-will (by default) select the latest version of Visual Studio installed on your system\&. So, if you have version 6 and version 7 (MSVS \&.NET) installed, it will prefer version 7\&. You can override this by specifying the
-\fBMSVS_VERSION\fR
-variable in the Environment initialization, setting it to the appropriate version (\*(Aq6\&.0\*(Aq or \*(Aq7\&.0\*(Aq, for example)\&. If the specified version isn\*(Aqt installed, tool initialization will fail\&.
-.sp
-This is obsolete: use
-\fB$MSVC_VERSION\fR
-instead\&. If
-\fB$MSVS_VERSION\fR
-is set and
-\fB$MSVC_VERSION\fR
-is not,
-\fB$MSVC_VERSION\fR
-will be set automatically to
-\fB$MSVS_VERSION\fR\&. If both are set to different values, scons will raise an error\&.
-.RE
-.PP
-MSVSBUILDCOM
-.RS 4
-The build command line placed in a generated Microsoft Visual Studio project file\&. The default is to have Visual Studio invoke SCons with any specified build targets\&.
-.RE
-.PP
-MSVSCLEANCOM
-.RS 4
-The clean command line placed in a generated Microsoft Visual Studio project file\&. The default is to have Visual Studio invoke SCons with the \-c option to remove any specified targets\&.
-.RE
-.PP
-MSVSENCODING
-.RS 4
-The encoding string placed in a generated Microsoft Visual Studio project file\&. The default is encoding
-Windows\-1252\&.
-.RE
-.PP
-MSVSPROJECTCOM
-.RS 4
-The action used to generate Microsoft Visual Studio project files\&.
-.RE
-.PP
-MSVSPROJECTSUFFIX
-.RS 4
-The suffix used for Microsoft Visual Studio project (DSP) files\&. The default value is
-\&.vcproj
-when using Visual Studio version 7\&.x (\&.NET) or later version, and
-\&.dsp
-when using earlier versions of Visual Studio\&.
-.RE
-.PP
-MSVSREBUILDCOM
-.RS 4
-The rebuild command line placed in a generated Microsoft Visual Studio project file\&. The default is to have Visual Studio invoke SCons with any specified rebuild targets\&.
-.RE
-.PP
-MSVSSCONS
-.RS 4
-The SCons used in generated Microsoft Visual Studio project files\&. The default is the version of SCons being used to generate the project file\&.
-.RE
-.PP
-MSVSSCONSCOM
-.RS 4
-The default SCons command used in generated Microsoft Visual Studio project files\&.
-.RE
-.PP
-MSVSSCONSCRIPT
-.RS 4
-The sconscript file (that is,
-SConstruct
-or
-SConscript
-file) that will be invoked by Visual Studio project files (through the
-\fB$MSVSSCONSCOM\fR
-variable)\&. The default is the same sconscript file that contains the call to
-\fBMSVSProject\fR
-to build the project file\&.
-.RE
-.PP
-MSVSSCONSFLAGS
-.RS 4
-The SCons flags used in generated Microsoft Visual Studio project files\&.
-.RE
-.PP
-MSVSSOLUTIONCOM
-.RS 4
-The action used to generate Microsoft Visual Studio solution files\&.
-.RE
-.PP
-MSVSSOLUTIONSUFFIX
-.RS 4
-The suffix used for Microsoft Visual Studio solution (DSW) files\&. The default value is
-\&.sln
-when using Visual Studio version 7\&.x (\&.NET), and
-\&.dsw
-when using earlier versions of Visual Studio\&.
-.RE
-.PP
-MT
-.RS 4
-The program used on Windows systems to embed manifests into DLLs and EXEs\&. See also
-\fB$WINDOWS_EMBED_MANIFEST\fR\&.
-.RE
-.PP
-MTEXECOM
-.RS 4
-The Windows command line used to embed manifests into executables\&. See also
-\fB$MTSHLIBCOM\fR\&.
-.RE
-.PP
-MTFLAGS
-.RS 4
-Flags passed to the
-\fB$MT\fR
-manifest embedding program (Windows only)\&.
-.RE
-.PP
-MTSHLIBCOM
-.RS 4
-The Windows command line used to embed manifests into shared libraries (DLLs)\&. See also
-\fB$MTEXECOM\fR\&.
-.RE
-.PP
-MWCW_VERSION
-.RS 4
-The version number of the MetroWerks CodeWarrior C compiler to be used\&.
-.RE
-.PP
-MWCW_VERSIONS
-.RS 4
-A list of installed versions of the MetroWerks CodeWarrior C compiler on this system\&.
-.RE
-.PP
-NAME
-.RS 4
-Specfies the name of the project to package\&.
-.RE
-.PP
-no_import_lib
-.RS 4
-When set to non\-zero, suppresses creation of a corresponding Windows static import lib by the
-SharedLibrary
-builder when used with MinGW, Microsoft Visual Studio or Metrowerks\&. This also suppresses creation of an export (\&.exp) file when using Microsoft Visual Studio\&.
-.RE
-.PP
-OBJPREFIX
-.RS 4
-The prefix used for (static) object file names\&.
-.RE
-.PP
-OBJSUFFIX
-.RS 4
-The suffix used for (static) object file names\&.
-.RE
-.PP
-P4
-.RS 4
-The Perforce executable\&.
-.RE
-.PP
-P4COM
-.RS 4
-The command line used to fetch source files from Perforce\&.
-.RE
-.PP
-P4COMSTR
-.RS 4
-The string displayed when fetching a source file from Perforce\&. If this is not set, then
-\fB$P4COM\fR
-(the command line) is displayed\&.
-.RE
-.PP
-P4FLAGS
-.RS 4
-General options that are passed to Perforce\&.
-.RE
-.PP
-PACKAGEROOT
-.RS 4
-Specifies the directory where all files in resulting archive will be placed if applicable\&. The default value is "$NAME\-$VERSION"\&.
-.RE
-.PP
-PACKAGETYPE
-.RS 4
-Selects the package type to build\&. Currently these are available:
-.sp
-* msi \- Microsoft Installer * rpm \- Redhat Package Manger * ipkg \- Itsy Package Management System * tarbz2 \- compressed tar * targz \- compressed tar * zip \- zip file * src_tarbz2 \- compressed tar source * src_targz \- compressed tar source * src_zip \- zip file source
-.sp
-This may be overridden with the "package_type" command line option\&.
-.RE
-.PP
-PACKAGEVERSION
-.RS 4
-The version of the package (not the underlying project)\&. This is currently only used by the rpm packager and should reflect changes in the packaging, not the underlying project code itself\&.
-.RE
-.PP
-PCH
-.RS 4
-The Microsoft Visual C++ precompiled header that will be used when compiling object files\&. This variable is ignored by tools other than Microsoft Visual C++\&. When this variable is defined SCons will add options to the compiler command line to cause it to use the precompiled header, and will also set up the dependencies for the PCH file\&. Example:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-env[\*(AqPCH\*(Aq] = \*(AqStdAfx\&.pch\*(Aq
-.fi
-.if n \{\
-.RE
-.\}
-.RE
-.PP
-PCHCOM
-.RS 4
-The command line used by the
-\fBPCH\fR
-builder to generated a precompiled header\&.
-.RE
-.PP
-PCHCOMSTR
-.RS 4
-The string displayed when generating a precompiled header\&. If this is not set, then
-\fB$PCHCOM\fR
-(the command line) is displayed\&.
-.RE
-.PP
-PCHPDBFLAGS
-.RS 4
-A construction variable that, when expanded, adds the
-/yD
-flag to the command line only if the
-\fB$PDB\fR
-construction variable is set\&.
-.RE
-.PP
-PCHSTOP
-.RS 4
-This variable specifies how much of a source file is precompiled\&. This variable is ignored by tools other than Microsoft Visual C++, or when the PCH variable is not being used\&. When this variable is define it must be a string that is the name of the header that is included at the end of the precompiled portion of the source files, or the empty string if the "#pragma hrdstop" construct is being used:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-env[\*(AqPCHSTOP\*(Aq] = \*(AqStdAfx\&.h\*(Aq
-.fi
-.if n \{\
-.RE
-.\}
-.RE
-.PP
-PDB
-.RS 4
-The Microsoft Visual C++ PDB file that will store debugging information for object files, shared libraries, and programs\&. This variable is ignored by tools other than Microsoft Visual C++\&. When this variable is defined SCons will add options to the compiler and linker command line to cause them to generate external debugging information, and will also set up the dependencies for the PDB file\&. Example:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-env[\*(AqPDB\*(Aq] = \*(Aqhello\&.pdb\*(Aq
-.fi
-.if n \{\
-.RE
-.\}
-.sp
-The Visual C++ compiler switch that SCons uses by default to generate PDB information is
-\fB/Z7\fR\&. This works correctly with parallel (\fB\-j\fR) builds because it embeds the debug information in the intermediate object files, as opposed to sharing a single PDB file between multiple object files\&. This is also the only way to get debug information embedded into a static library\&. Using the
-\fB/Zi\fR
-instead may yield improved link\-time performance, although parallel builds will no longer work\&. You can generate PDB files with the
-\fB/Zi\fR
-switch by overriding the default
-\fB$CCPDBFLAGS\fR
-variable; see the entry for that variable for specific examples\&.
-.RE
-.PP
-PDFCOM
-.RS 4
-A deprecated synonym for
-\fB$DVIPDFCOM\fR\&.
-.RE
-.PP
-PDFLATEX
-.RS 4
-The
-pdflatex
-utility\&.
-.RE
-.PP
-PDFLATEXCOM
-.RS 4
-The command line used to call the
-pdflatex
-utility\&.
-.RE
-.PP
-PDFLATEXCOMSTR
-.RS 4
-The string displayed when calling the
-pdflatex
-utility\&. If this is not set, then
-\fB$PDFLATEXCOM\fR
-(the command line) is displayed\&.
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-env = Environment(PDFLATEX;COMSTR = "Building $TARGET from LaTeX input $SOURCES")
-.fi
-.if n \{\
-.RE
-.\}
-.RE
-.PP
-PDFLATEXFLAGS
-.RS 4
-General options passed to the
-pdflatex
-utility\&.
-.RE
-.PP
-PDFPREFIX
-.RS 4
-The prefix used for PDF file names\&.
-.RE
-.PP
-PDFSUFFIX
-.RS 4
-The suffix used for PDF file names\&.
-.RE
-.PP
-PDFTEX
-.RS 4
-The
-pdftex
-utility\&.
-.RE
-.PP
-PDFTEXCOM
-.RS 4
-The command line used to call the
-pdftex
-utility\&.
-.RE
-.PP
-PDFTEXCOMSTR
-.RS 4
-The string displayed when calling the
-pdftex
-utility\&. If this is not set, then
-\fB$PDFTEXCOM\fR
-(the command line) is displayed\&.
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-env = Environment(PDFTEXCOMSTR = "Building $TARGET from TeX input $SOURCES")
-.fi
-.if n \{\
-.RE
-.\}
-.RE
-.PP
-PDFTEXFLAGS
-.RS 4
-General options passed to the
-pdftex
-utility\&.
-.RE
-.PP
-PKGCHK
-.RS 4
-On Solaris systems, the package\-checking program that will be used (along with
-\fB$PKGINFO\fR) to look for installed versions of the Sun PRO C++ compiler\&. The default is
-/usr/sbin/pgkchk\&.
-.RE
-.PP
-PKGINFO
-.RS 4
-On Solaris systems, the package information program that will be used (along with
-\fB$PKGCHK\fR) to look for installed versions of the Sun PRO C++ compiler\&. The default is
-pkginfo\&.
-.RE
-.PP
-PLATFORM
-.RS 4
-The name of the platform used to create the Environment\&. If no platform is specified when the Environment is created,
-scons
-autodetects the platform\&.
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-env = Environment(tools = [])
-if env[\*(AqPLATFORM\*(Aq] == \*(Aqcygwin\*(Aq:
- Tool(\*(Aqmingw\*(Aq)(env)
-else:
- Tool(\*(Aqmsvc\*(Aq)(env)
-.fi
-.if n \{\
-.RE
-.\}
-.RE
-.PP
-POAUTOINIT
-.RS 4
-The
-\fB$POAUTOINIT\fR
-variable, if set to
-True
-(on non\-zero numeric value), let the
-msginit
-tool to automatically initialize
-\fImissing\fR
-PO
-files with
-\fBmsginit(1)\fR\&. This applies to both,
-\fBPOInit\fR
-and
-\fBPOUpdate\fR
-builders (and others that use any of them)\&.
-.RE
-.PP
-POCREATE_ALIAS
-.RS 4
-Common alias for all
-PO
-files created with
-\fBPOInit\fR
-builder (default:
-\*(Aqpo\-create\*(Aq)\&. See
-msginit
-tool and
-\fBPOInit\fR
-builder\&.
-.RE
-.PP
-POSUFFIX
-.RS 4
-Suffix used for
-PO
-files (default:
-\*(Aq\&.po\*(Aq) See
-msginit
-tool and
-\fBPOInit\fR
-builder\&.
-.RE
-.PP
-POTDOMAIN
-.RS 4
-The
-\fB$POTDOMAIN\fR
-defines default domain, used to generate
-POT
-filename as
-\fB$POTDOMAIN\fR\&.pot
-when no
-POT
-file name is provided by the user\&. This applies to
-\fBPOTUpdate\fR,
-\fBPOInit\fR
-and
-\fBPOUpdate\fR
-builders (and builders, that use them, e\&.g\&.
-\fBTranslate\fR)\&. Normally (if
-\fB$POTDOMAIN\fR
-is not defined), the builders use
-messages\&.pot
-as default
-POT
-file name\&.
-.RE
-.PP
-POTSUFFIX
-.RS 4
-Suffix used for PO Template files (default:
-\*(Aq\&.pot\*(Aq)\&. See
-xgettext
-tool and
-\fBPOTUpdate\fR
-builder\&.
-.RE
-.PP
-POTUPDATE_ALIAS
-.RS 4
-Name of the common phony target for all PO Templates created with
-\fBPOUpdate\fR
-(default:
-\*(Aqpot\-update\*(Aq)\&. See
-xgettext
-tool and
-\fBPOTUpdate\fR
-builder\&.
-.RE
-.PP
-POUPDATE_ALIAS
-.RS 4
-Common alias for all
-PO
-files being defined with
-\fBPOUpdate\fR
-builder (default:
-\*(Aqpo\-update\*(Aq)\&. See
-msgmerge
-tool and
-\fBPOUpdate\fR
-builder\&.
-.RE
-.PP
-PRINT_CMD_LINE_FUNC
-.RS 4
-A Python function used to print the command lines as they are executed (assuming command printing is not disabled by the
-\fB\-q\fR
-or
-\fB\-s\fR
-options or their equivalents)\&. The function should take four arguments:
-\fIs\fR, the command being executed (a string),
-\fItarget\fR, the target being built (file node, list, or string name(s)),
-\fIsource\fR, the source(s) used (file node, list, or string name(s)), and
-\fIenv\fR, the environment being used\&.
-.sp
-The function must do the printing itself\&. The default implementation, used if this variable is not set or is None, is:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-def print_cmd_line(s, target, source, env):
- sys\&.stdout\&.write(s + "\en")
-.fi
-.if n \{\
-.RE
-.\}
-.sp
-Here\*(Aqs an example of a more interesting function:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-def print_cmd_line(s, target, source, env):
- sys\&.stdout\&.write("Building %s \-> %s\&.\&.\&.\en" %
- (\*(Aq and \*(Aq\&.join([str(x) for x in source]),
- \*(Aq and \*(Aq\&.join([str(x) for x in target])))
-env=Environment(PRINT_CMD_LINE_FUNC=print_cmd_line)
-env\&.Program(\*(Aqfoo\*(Aq, \*(Aqfoo\&.c\*(Aq)
-.fi
-.if n \{\
-.RE
-.\}
-.sp
-This just prints "Building
-\fItargetname\fR
-from
-\fIsourcename\fR\&.\&.\&." instead of the actual commands\&. Such a function could also log the actual commands to a log file, for example\&.
-.RE
-.PP
-PROGEMITTER
-.RS 4
-TODO
-.RE
-.PP
-PROGPREFIX
-.RS 4
-The prefix used for executable file names\&.
-.RE
-.PP
-PROGSUFFIX
-.RS 4
-The suffix used for executable file names\&.
-.RE
-.PP
-PSCOM
-.RS 4
-The command line used to convert TeX DVI files into a PostScript file\&.
-.RE
-.PP
-PSCOMSTR
-.RS 4
-The string displayed when a TeX DVI file is converted into a PostScript file\&. If this is not set, then
-\fB$PSCOM\fR
-(the command line) is displayed\&.
-.RE
-.PP
-PSPREFIX
-.RS 4
-The prefix used for PostScript file names\&.
-.RE
-.PP
-PSSUFFIX
-.RS 4
-The prefix used for PostScript file names\&.
-.RE
-.PP
-QT_AUTOSCAN
-.RS 4
-Turn off scanning for mocable files\&. Use the Moc Builder to explicitly specify files to run moc on\&.
-.RE
-.PP
-QT_BINPATH
-.RS 4
-The path where the qt binaries are installed\&. The default value is \*(Aq\fB$QTDIR\fR/bin\*(Aq\&.
-.RE
-.PP
-QT_CPPPATH
-.RS 4
-The path where the qt header files are installed\&. The default value is \*(Aq\fB$QTDIR\fR/include\*(Aq\&. Note: If you set this variable to None, the tool won\*(Aqt change the
-\fB$CPPPATH\fR
-construction variable\&.
-.RE
-.PP
-QT_DEBUG
-.RS 4
-Prints lots of debugging information while scanning for moc files\&.
-.RE
-.PP
-QT_LIB
-.RS 4
-Default value is \*(Aqqt\*(Aq\&. You may want to set this to \*(Aqqt\-mt\*(Aq\&. Note: If you set this variable to None, the tool won\*(Aqt change the
-\fB$LIBS\fR
-variable\&.
-.RE
-.PP
-QT_LIBPATH
-.RS 4
-The path where the qt libraries are installed\&. The default value is \*(Aq\fB$QTDIR\fR/lib\*(Aq\&. Note: If you set this variable to None, the tool won\*(Aqt change the
-\fB$LIBPATH\fR
-construction variable\&.
-.RE
-.PP
-QT_MOC
-.RS 4
-Default value is \*(Aq\fB$QT_BINPATH\fR/moc\*(Aq\&.
-.RE
-.PP
-QT_MOCCXXPREFIX
-.RS 4
-Default value is \*(Aq\*(Aq\&. Prefix for moc output files, when source is a cxx file\&.
-.RE
-.PP
-QT_MOCCXXSUFFIX
-.RS 4
-Default value is \*(Aq\&.moc\*(Aq\&. Suffix for moc output files, when source is a cxx file\&.
-.RE
-.PP
-QT_MOCFROMCXXCOM
-.RS 4
-Command to generate a moc file from a cpp file\&.
-.RE
-.PP
-QT_MOCFROMCXXCOMSTR
-.RS 4
-The string displayed when generating a moc file from a cpp file\&. If this is not set, then
-\fB$QT_MOCFROMCXXCOM\fR
-(the command line) is displayed\&.
-.RE
-.PP
-QT_MOCFROMCXXFLAGS
-.RS 4
-Default value is \*(Aq\-i\*(Aq\&. These flags are passed to moc, when moccing a C++ file\&.
-.RE
-.PP
-QT_MOCFROMHCOM
-.RS 4
-Command to generate a moc file from a header\&.
-.RE
-.PP
-QT_MOCFROMHCOMSTR
-.RS 4
-The string displayed when generating a moc file from a cpp file\&. If this is not set, then
-\fB$QT_MOCFROMHCOM\fR
-(the command line) is displayed\&.
-.RE
-.PP
-QT_MOCFROMHFLAGS
-.RS 4
-Default value is \*(Aq\*(Aq\&. These flags are passed to moc, when moccing a header file\&.
-.RE
-.PP
-QT_MOCHPREFIX
-.RS 4
-Default value is \*(Aqmoc_\*(Aq\&. Prefix for moc output files, when source is a header\&.
-.RE
-.PP
-QT_MOCHSUFFIX
-.RS 4
-Default value is \*(Aq\fB$CXXFILESUFFIX\fR\*(Aq\&. Suffix for moc output files, when source is a header\&.
-.RE
-.PP
-QT_UIC
-.RS 4
-Default value is \*(Aq\fB$QT_BINPATH\fR/uic\*(Aq\&.
-.RE
-.PP
-QT_UICCOM
-.RS 4
-Command to generate header files from \&.ui files\&.
-.RE
-.PP
-QT_UICCOMSTR
-.RS 4
-The string displayed when generating header files from \&.ui files\&. If this is not set, then
-\fB$QT_UICCOM\fR
-(the command line) is displayed\&.
-.RE
-.PP
-QT_UICDECLFLAGS
-.RS 4
-Default value is \*(Aq\*(Aq\&. These flags are passed to uic, when creating a a h file from a \&.ui file\&.
-.RE
-.PP
-QT_UICDECLPREFIX
-.RS 4
-Default value is \*(Aq\*(Aq\&. Prefix for uic generated header files\&.
-.RE
-.PP
-QT_UICDECLSUFFIX
-.RS 4
-Default value is \*(Aq\&.h\*(Aq\&. Suffix for uic generated header files\&.
-.RE
-.PP
-QT_UICIMPLFLAGS
-.RS 4
-Default value is \*(Aq\*(Aq\&. These flags are passed to uic, when creating a cxx file from a \&.ui file\&.
-.RE
-.PP
-QT_UICIMPLPREFIX
-.RS 4
-Default value is \*(Aquic_\*(Aq\&. Prefix for uic generated implementation files\&.
-.RE
-.PP
-QT_UICIMPLSUFFIX
-.RS 4
-Default value is \*(Aq\fB$CXXFILESUFFIX\fR\*(Aq\&. Suffix for uic generated implementation files\&.
-.RE
-.PP
-QT_UISUFFIX
-.RS 4
-Default value is \*(Aq\&.ui\*(Aq\&. Suffix of designer input files\&.
-.RE
-.PP
-QTDIR
-.RS 4
-The qt tool tries to take this from os\&.environ\&. It also initializes all QT_* construction variables listed below\&. (Note that all paths are constructed with python\*(Aqs os\&.path\&.join() method, but are listed here with the \*(Aq/\*(Aq separator for easier reading\&.) In addition, the construction environment variables
-\fB$CPPPATH\fR,
-\fB$LIBPATH\fR
-and
-\fB$LIBS\fR
-may be modified and the variables
-\fB$PROGEMITTER\fR,
-\fB$SHLIBEMITTER\fR
-and
-\fB$LIBEMITTER\fR
-are modified\&. Because the build\-performance is affected when using this tool, you have to explicitly specify it at Environment creation:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-Environment(tools=[\*(Aqdefault\*(Aq,\*(Aqqt\*(Aq])
-.fi
-.if n \{\
-.RE
-.\}
-.sp
-The qt tool supports the following operations:
-.sp
-
-\fBAutomatic moc file generation from header files\&.\fR
-You do not have to specify moc files explicitly, the tool does it for you\&. However, there are a few preconditions to do so: Your header file must have the same filebase as your implementation file and must stay in the same directory\&. It must have one of the suffixes \&.h, \&.hpp, \&.H, \&.hxx, \&.hh\&. You can turn off automatic moc file generation by setting QT_AUTOSCAN to 0\&. See also the corresponding
-\fBMoc\fR() builder method\&.
-.sp
-
-\fBAutomatic moc file generation from cxx files\&.\fR
-As stated in the qt documentation, include the moc file at the end of the cxx file\&. Note that you have to include the file, which is generated by the transformation ${QT_MOCCXXPREFIX}<basename>${QT_MOCCXXSUFFIX}, by default <basename>\&.moc\&. A warning is generated after building the moc file, if you do not include the correct file\&. If you are using VariantDir, you may need to specify duplicate=1\&. You can turn off automatic moc file generation by setting QT_AUTOSCAN to 0\&. See also the corresponding
-\fBMoc\fR
-builder method\&.
-.sp
-
-\fBAutomatic handling of \&.ui files\&.\fR
-The implementation files generated from \&.ui files are handled much the same as yacc or lex files\&. Each \&.ui file given as a source of Program, Library or SharedLibrary will generate three files, the declaration file, the implementation file and a moc file\&. Because there are also generated headers, you may need to specify duplicate=1 in calls to VariantDir\&. See also the corresponding
-\fBUic\fR
-builder method\&.
-.RE
-.PP
-RANLIB
-.RS 4
-The archive indexer\&.
-.RE
-.PP
-RANLIBCOM
-.RS 4
-The command line used to index a static library archive\&.
-.RE
-.PP
-RANLIBCOMSTR
-.RS 4
-The string displayed when a static library archive is indexed\&. If this is not set, then
-\fB$RANLIBCOM\fR
-(the command line) is displayed\&.
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-env = Environment(RANLIBCOMSTR = "Indexing $TARGET")
-.fi
-.if n \{\
-.RE
-.\}
-.RE
-.PP
-RANLIBFLAGS
-.RS 4
-General options passed to the archive indexer\&.
-.RE
-.PP
-RC
-.RS 4
-The resource compiler used to build a Microsoft Visual C++ resource file\&.
-.RE
-.PP
-RCCOM
-.RS 4
-The command line used to build a Microsoft Visual C++ resource file\&.
-.RE
-.PP
-RCCOMSTR
-.RS 4
-The string displayed when invoking the resource compiler to build a Microsoft Visual C++ resource file\&. If this is not set, then
-\fB$RCCOM\fR
-(the command line) is displayed\&.
-.RE
-.PP
-RCFLAGS
-.RS 4
-The flags passed to the resource compiler by the RES builder\&.
-.RE
-.PP
-RCINCFLAGS
-.RS 4
-An automatically\-generated construction variable containing the command\-line options for specifying directories to be searched by the resource compiler\&. The value of
-\fB$RCINCFLAGS\fR
-is created by appending
-\fB$RCINCPREFIX\fR
-and
-\fB$RCINCSUFFIX\fR
-to the beginning and end of each directory in
-\fB$CPPPATH\fR\&.
-.RE
-.PP
-RCINCPREFIX
-.RS 4
-The prefix (flag) used to specify an include directory on the resource compiler command line\&. This will be appended to the beginning of each directory in the
-\fB$CPPPATH\fR
-construction variable when the
-\fB$RCINCFLAGS\fR
-variable is expanded\&.
-.RE
-.PP
-RCINCSUFFIX
-.RS 4
-The suffix used to specify an include directory on the resource compiler command line\&. This will be appended to the end of each directory in the
-\fB$CPPPATH\fR
-construction variable when the
-\fB$RCINCFLAGS\fR
-variable is expanded\&.
-.RE
-.PP
-RCS
-.RS 4
-The RCS executable\&. Note that this variable is not actually used for the command to fetch source files from RCS; see the
-\fB$RCS_CO\fR
-construction variable, below\&.
-.RE
-.PP
-RCS_CO
-.RS 4
-The RCS "checkout" executable, used to fetch source files from RCS\&.
-.RE
-.PP
-RCS_COCOM
-.RS 4
-The command line used to fetch (checkout) source files from RCS\&.
-.RE
-.PP
-RCS_COCOMSTR
-.RS 4
-The string displayed when fetching a source file from RCS\&. If this is not set, then
-\fB$RCS_COCOM\fR
-(the command line) is displayed\&.
-.RE
-.PP
-RCS_COFLAGS
-.RS 4
-Options that are passed to the
-\fB$RCS_CO\fR
-command\&.
-.RE
-.PP
-RDirs
-.RS 4
-A function that converts a string into a list of Dir instances by searching the repositories\&.
-.RE
-.PP
-REGSVR
-.RS 4
-The program used on Windows systems to register a newly\-built DLL library whenever the
-\fBSharedLibrary\fR
-builder is passed a keyword argument of
-register=1\&.
-.RE
-.PP
-REGSVRCOM
-.RS 4
-The command line used on Windows systems to register a newly\-built DLL library whenever the
-\fBSharedLibrary\fR
-builder is passed a keyword argument of
-register=1\&.
-.RE
-.PP
-REGSVRCOMSTR
-.RS 4
-The string displayed when registering a newly\-built DLL file\&. If this is not set, then
-\fB$REGSVRCOM\fR
-(the command line) is displayed\&.
-.RE
-.PP
-REGSVRFLAGS
-.RS 4
-Flags passed to the DLL registration program on Windows systems when a newly\-built DLL library is registered\&. By default, this includes the
-\fB/s\fR
-that prevents dialog boxes from popping up and requiring user attention\&.
-.RE
-.PP
-RMIC
-.RS 4
-The Java RMI stub compiler\&.
-.RE
-.PP
-RMICCOM
-.RS 4
-The command line used to compile stub and skeleton class files from Java classes that contain RMI implementations\&. Any options specified in the
-\fB$RMICFLAGS\fR
-construction variable are included on this command line\&.
-.RE
-.PP
-RMICCOMSTR
-.RS 4
-The string displayed when compiling stub and skeleton class files from Java classes that contain RMI implementations\&. If this is not set, then
-\fB$RMICCOM\fR
-(the command line) is displayed\&.
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-env = Environment(RMICCOMSTR = "Generating stub/skeleton class files $TARGETS from $SOURCES")
-.fi
-.if n \{\
-.RE
-.\}
-.RE
-.PP
-RMICFLAGS
-.RS 4
-General options passed to the Java RMI stub compiler\&.
-.RE
-.PP
-_RPATH
-.RS 4
-An automatically\-generated construction variable containing the rpath flags to be used when linking a program with shared libraries\&. The value of
-\fB$_RPATH\fR
-is created by appending
-\fB$RPATHPREFIX\fR
-and
-\fB$RPATHSUFFIX\fR
-to the beginning and end of each directory in
-\fB$RPATH\fR\&.
-.RE
-.PP
-RPATH
-.RS 4
-A list of paths to search for shared libraries when running programs\&. Currently only used in the GNU (gnulink), IRIX (sgilink) and Sun (sunlink) linkers\&. Ignored on platforms and toolchains that don\*(Aqt support it\&. Note that the paths added to RPATH are not transformed by
-scons
-in any way: if you want an absolute path, you must make it absolute yourself\&.
-.RE
-.PP
-RPATHPREFIX
-.RS 4
-The prefix used to specify a directory to be searched for shared libraries when running programs\&. This will be appended to the beginning of each directory in the
-\fB$RPATH\fR
-construction variable when the
-\fB$_RPATH\fR
-variable is automatically generated\&.
-.RE
-.PP
-RPATHSUFFIX
-.RS 4
-The suffix used to specify a directory to be searched for shared libraries when running programs\&. This will be appended to the end of each directory in the
-\fB$RPATH\fR
-construction variable when the
-\fB$_RPATH\fR
-variable is automatically generated\&.
-.RE
-.PP
-RPCGEN
-.RS 4
-The RPC protocol compiler\&.
-.RE
-.PP
-RPCGENCLIENTFLAGS
-.RS 4
-Options passed to the RPC protocol compiler when generating client side stubs\&. These are in addition to any flags specified in the
-\fB$RPCGENFLAGS\fR
-construction variable\&.
-.RE
-.PP
-RPCGENFLAGS
-.RS 4
-General options passed to the RPC protocol compiler\&.
-.RE
-.PP
-RPCGENHEADERFLAGS
-.RS 4
-Options passed to the RPC protocol compiler when generating a header file\&. These are in addition to any flags specified in the
-\fB$RPCGENFLAGS\fR
-construction variable\&.
-.RE
-.PP
-RPCGENSERVICEFLAGS
-.RS 4
-Options passed to the RPC protocol compiler when generating server side stubs\&. These are in addition to any flags specified in the
-\fB$RPCGENFLAGS\fR
-construction variable\&.
-.RE
-.PP
-RPCGENXDRFLAGS
-.RS 4
-Options passed to the RPC protocol compiler when generating XDR routines\&. These are in addition to any flags specified in the
-\fB$RPCGENFLAGS\fR
-construction variable\&.
-.RE
-.PP
-SCANNERS
-.RS 4
-A list of the available implicit dependency scanners\&. New file scanners may be added by appending to this list, although the more flexible approach is to associate scanners with a specific Builder\&. See the sections "Builder Objects" and "Scanner Objects," below, for more information\&.
-.RE
-.PP
-SCCS
-.RS 4
-The SCCS executable\&.
-.RE
-.PP
-SCCSCOM
-.RS 4
-The command line used to fetch source files from SCCS\&.
-.RE
-.PP
-SCCSCOMSTR
-.RS 4
-The string displayed when fetching a source file from a CVS repository\&. If this is not set, then
-\fB$SCCSCOM\fR
-(the command line) is displayed\&.
-.RE
-.PP
-SCCSFLAGS
-.RS 4
-General options that are passed to SCCS\&.
-.RE
-.PP
-SCCSGETFLAGS
-.RS 4
-Options that are passed specifically to the SCCS "get" subcommand\&. This can be set, for example, to
-\fB\-e\fR
-to check out editable files from SCCS\&.
-.RE
-.PP
-SCONS_HOME
-.RS 4
-The (optional) path to the SCons library directory, initialized from the external environment\&. If set, this is used to construct a shorter and more efficient search path in the
-\fB$MSVSSCONS\fR
-command line executed from Microsoft Visual Studio project files\&.
-.RE
-.PP
-SHCC
-.RS 4
-The C compiler used for generating shared\-library objects\&.
-.RE
-.PP
-SHCCCOM
-.RS 4
-The command line used to compile a C source file to a shared\-library object file\&. Any options specified in the
-\fB$SHCFLAGS\fR,
-\fB$SHCCFLAGS\fR
-and
-\fB$CPPFLAGS\fR
-construction variables are included on this command line\&.
-.RE
-.PP
-SHCCCOMSTR
-.RS 4
-The string displayed when a C source file is compiled to a shared object file\&. If this is not set, then
-\fB$SHCCCOM\fR
-(the command line) is displayed\&.
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-env = Environment(SHCCCOMSTR = "Compiling shared object $TARGET")
-.fi
-.if n \{\
-.RE
-.\}
-.RE
-.PP
-SHCCFLAGS
-.RS 4
-Options that are passed to the C and C++ compilers to generate shared\-library objects\&.
-.RE
-.PP
-SHCFLAGS
-.RS 4
-Options that are passed to the C compiler (only; not C++) to generate shared\-library objects\&.
-.RE
-.PP
-SHCXX
-.RS 4
-The C++ compiler used for generating shared\-library objects\&.
-.RE
-.PP
-SHCXXCOM
-.RS 4
-The command line used to compile a C++ source file to a shared\-library object file\&. Any options specified in the
-\fB$SHCXXFLAGS\fR
-and
-\fB$CPPFLAGS\fR
-construction variables are included on this command line\&.
-.RE
-.PP
-SHCXXCOMSTR
-.RS 4
-The string displayed when a C++ source file is compiled to a shared object file\&. If this is not set, then
-\fB$SHCXXCOM\fR
-(the command line) is displayed\&.
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-env = Environment(SHCXXCOMSTR = "Compiling shared object $TARGET")
-.fi
-.if n \{\
-.RE
-.\}
-.RE
-.PP
-SHCXXFLAGS
-.RS 4
-Options that are passed to the C++ compiler to generate shared\-library objects\&.
-.RE
-.PP
-SHDC
-.RS 4
-SHDC\&.
-.RE
-.PP
-SHDCOM
-.RS 4
-SHDCOM\&.
-.RE
-.PP
-SHDLINK
-.RS 4
-SHDLINK\&.
-.RE
-.PP
-SHDLINKCOM
-.RS 4
-SHDLINKCOM\&.
-.RE
-.PP
-SHDLINKFLAGS
-.RS 4
-SHDLINKFLAGS\&.
-.RE
-.PP
-SHELL
-.RS 4
-A string naming the shell program that will be passed to the
-\fB$SPAWN\fR
-function\&. See the
-\fB$SPAWN\fR
-construction variable for more information\&.
-.RE
-.PP
-SHF03
-.RS 4
-The Fortran 03 compiler used for generating shared\-library objects\&. You should normally set the
-\fB$SHFORTRAN\fR
-variable, which specifies the default Fortran compiler for all Fortran versions\&. You only need to set
-\fB$SHF03\fR
-if you need to use a specific compiler or compiler version for Fortran 03 files\&.
-.RE
-.PP
-SHF03COM
-.RS 4
-The command line used to compile a Fortran 03 source file to a shared\-library object file\&. You only need to set
-\fB$SHF03COM\fR
-if you need to use a specific command line for Fortran 03 files\&. You should normally set the
-\fB$SHFORTRANCOM\fR
-variable, which specifies the default command line for all Fortran versions\&.
-.RE
-.PP
-SHF03COMSTR
-.RS 4
-The string displayed when a Fortran 03 source file is compiled to a shared\-library object file\&. If this is not set, then
-\fB$SHF03COM\fR
-or
-\fB$SHFORTRANCOM\fR
-(the command line) is displayed\&.
-.RE
-.PP
-SHF03FLAGS
-.RS 4
-Options that are passed to the Fortran 03 compiler to generated shared\-library objects\&. You only need to set
-\fB$SHF03FLAGS\fR
-if you need to define specific user options for Fortran 03 files\&. You should normally set the
-\fB$SHFORTRANFLAGS\fR
-variable, which specifies the user\-specified options passed to the default Fortran compiler for all Fortran versions\&.
-.RE
-.PP
-SHF03PPCOM
-.RS 4
-The command line used to compile a Fortran 03 source file to a shared\-library object file after first running the file through the C preprocessor\&. Any options specified in the
-\fB$SHF03FLAGS\fR
-and
-\fB$CPPFLAGS\fR
-construction variables are included on this command line\&. You only need to set
-\fB$SHF03PPCOM\fR
-if you need to use a specific C\-preprocessor command line for Fortran 03 files\&. You should normally set the
-\fB$SHFORTRANPPCOM\fR
-variable, which specifies the default C\-preprocessor command line for all Fortran versions\&.
-.RE
-.PP
-SHF03PPCOMSTR
-.RS 4
-The string displayed when a Fortran 03 source file is compiled to a shared\-library object file after first running the file through the C preprocessor\&. If this is not set, then
-\fB$SHF03PPCOM\fR
-or
-\fB$SHFORTRANPPCOM\fR
-(the command line) is displayed\&.
-.RE
-.PP
-SHF08
-.RS 4
-The Fortran 08 compiler used for generating shared\-library objects\&. You should normally set the
-\fB$SHFORTRAN\fR
-variable, which specifies the default Fortran compiler for all Fortran versions\&. You only need to set
-\fB$SHF08\fR
-if you need to use a specific compiler or compiler version for Fortran 08 files\&.
-.RE
-.PP
-SHF08COM
-.RS 4
-The command line used to compile a Fortran 08 source file to a shared\-library object file\&. You only need to set
-\fB$SHF08COM\fR
-if you need to use a specific command line for Fortran 08 files\&. You should normally set the
-\fB$SHFORTRANCOM\fR
-variable, which specifies the default command line for all Fortran versions\&.
-.RE
-.PP
-SHF08COMSTR
-.RS 4
-The string displayed when a Fortran 08 source file is compiled to a shared\-library object file\&. If this is not set, then
-\fB$SHF08COM\fR
-or
-\fB$SHFORTRANCOM\fR
-(the command line) is displayed\&.
-.RE
-.PP
-SHF08FLAGS
-.RS 4
-Options that are passed to the Fortran 08 compiler to generated shared\-library objects\&. You only need to set
-\fB$SHF08FLAGS\fR
-if you need to define specific user options for Fortran 08 files\&. You should normally set the
-\fB$SHFORTRANFLAGS\fR
-variable, which specifies the user\-specified options passed to the default Fortran compiler for all Fortran versions\&.
-.RE
-.PP
-SHF08PPCOM
-.RS 4
-The command line used to compile a Fortran 08 source file to a shared\-library object file after first running the file through the C preprocessor\&. Any options specified in the
-\fB$SHF08FLAGS\fR
-and
-\fB$CPPFLAGS\fR
-construction variables are included on this command line\&. You only need to set
-\fB$SHF08PPCOM\fR
-if you need to use a specific C\-preprocessor command line for Fortran 08 files\&. You should normally set the
-\fB$SHFORTRANPPCOM\fR
-variable, which specifies the default C\-preprocessor command line for all Fortran versions\&.
-.RE
-.PP
-SHF08PPCOMSTR
-.RS 4
-The string displayed when a Fortran 08 source file is compiled to a shared\-library object file after first running the file through the C preprocessor\&. If this is not set, then
-\fB$SHF08PPCOM\fR
-or
-\fB$SHFORTRANPPCOM\fR
-(the command line) is displayed\&.
-.RE
-.PP
-SHF77
-.RS 4
-The Fortran 77 compiler used for generating shared\-library objects\&. You should normally set the
-\fB$SHFORTRAN\fR
-variable, which specifies the default Fortran compiler for all Fortran versions\&. You only need to set
-\fB$SHF77\fR
-if you need to use a specific compiler or compiler version for Fortran 77 files\&.
-.RE
-.PP
-SHF77COM
-.RS 4
-The command line used to compile a Fortran 77 source file to a shared\-library object file\&. You only need to set
-\fB$SHF77COM\fR
-if you need to use a specific command line for Fortran 77 files\&. You should normally set the
-\fB$SHFORTRANCOM\fR
-variable, which specifies the default command line for all Fortran versions\&.
-.RE
-.PP
-SHF77COMSTR
-.RS 4
-The string displayed when a Fortran 77 source file is compiled to a shared\-library object file\&. If this is not set, then
-\fB$SHF77COM\fR
-or
-\fB$SHFORTRANCOM\fR
-(the command line) is displayed\&.
-.RE
-.PP
-SHF77FLAGS
-.RS 4
-Options that are passed to the Fortran 77 compiler to generated shared\-library objects\&. You only need to set
-\fB$SHF77FLAGS\fR
-if you need to define specific user options for Fortran 77 files\&. You should normally set the
-\fB$SHFORTRANFLAGS\fR
-variable, which specifies the user\-specified options passed to the default Fortran compiler for all Fortran versions\&.
-.RE
-.PP
-SHF77PPCOM
-.RS 4
-The command line used to compile a Fortran 77 source file to a shared\-library object file after first running the file through the C preprocessor\&. Any options specified in the
-\fB$SHF77FLAGS\fR
-and
-\fB$CPPFLAGS\fR
-construction variables are included on this command line\&. You only need to set
-\fB$SHF77PPCOM\fR
-if you need to use a specific C\-preprocessor command line for Fortran 77 files\&. You should normally set the
-\fB$SHFORTRANPPCOM\fR
-variable, which specifies the default C\-preprocessor command line for all Fortran versions\&.
-.RE
-.PP
-SHF77PPCOMSTR
-.RS 4
-The string displayed when a Fortran 77 source file is compiled to a shared\-library object file after first running the file through the C preprocessor\&. If this is not set, then
-\fB$SHF77PPCOM\fR
-or
-\fB$SHFORTRANPPCOM\fR
-(the command line) is displayed\&.
-.RE
-.PP
-SHF90
-.RS 4
-The Fortran 90 compiler used for generating shared\-library objects\&. You should normally set the
-\fB$SHFORTRAN\fR
-variable, which specifies the default Fortran compiler for all Fortran versions\&. You only need to set
-\fB$SHF90\fR
-if you need to use a specific compiler or compiler version for Fortran 90 files\&.
-.RE
-.PP
-SHF90COM
-.RS 4
-The command line used to compile a Fortran 90 source file to a shared\-library object file\&. You only need to set
-\fB$SHF90COM\fR
-if you need to use a specific command line for Fortran 90 files\&. You should normally set the
-\fB$SHFORTRANCOM\fR
-variable, which specifies the default command line for all Fortran versions\&.
-.RE
-.PP
-SHF90COMSTR
-.RS 4
-The string displayed when a Fortran 90 source file is compiled to a shared\-library object file\&. If this is not set, then
-\fB$SHF90COM\fR
-or
-\fB$SHFORTRANCOM\fR
-(the command line) is displayed\&.
-.RE
-.PP
-SHF90FLAGS
-.RS 4
-Options that are passed to the Fortran 90 compiler to generated shared\-library objects\&. You only need to set
-\fB$SHF90FLAGS\fR
-if you need to define specific user options for Fortran 90 files\&. You should normally set the
-\fB$SHFORTRANFLAGS\fR
-variable, which specifies the user\-specified options passed to the default Fortran compiler for all Fortran versions\&.
-.RE
-.PP
-SHF90PPCOM
-.RS 4
-The command line used to compile a Fortran 90 source file to a shared\-library object file after first running the file through the C preprocessor\&. Any options specified in the
-\fB$SHF90FLAGS\fR
-and
-\fB$CPPFLAGS\fR
-construction variables are included on this command line\&. You only need to set
-\fB$SHF90PPCOM\fR
-if you need to use a specific C\-preprocessor command line for Fortran 90 files\&. You should normally set the
-\fB$SHFORTRANPPCOM\fR
-variable, which specifies the default C\-preprocessor command line for all Fortran versions\&.
-.RE
-.PP
-SHF90PPCOMSTR
-.RS 4
-The string displayed when a Fortran 90 source file is compiled to a shared\-library object file after first running the file through the C preprocessor\&. If this is not set, then
-\fB$SHF90PPCOM\fR
-or
-\fB$SHFORTRANPPCOM\fR
-(the command line) is displayed\&.
-.RE
-.PP
-SHF95
-.RS 4
-The Fortran 95 compiler used for generating shared\-library objects\&. You should normally set the
-\fB$SHFORTRAN\fR
-variable, which specifies the default Fortran compiler for all Fortran versions\&. You only need to set
-\fB$SHF95\fR
-if you need to use a specific compiler or compiler version for Fortran 95 files\&.
-.RE
-.PP
-SHF95COM
-.RS 4
-The command line used to compile a Fortran 95 source file to a shared\-library object file\&. You only need to set
-\fB$SHF95COM\fR
-if you need to use a specific command line for Fortran 95 files\&. You should normally set the
-\fB$SHFORTRANCOM\fR
-variable, which specifies the default command line for all Fortran versions\&.
-.RE
-.PP
-SHF95COMSTR
-.RS 4
-The string displayed when a Fortran 95 source file is compiled to a shared\-library object file\&. If this is not set, then
-\fB$SHF95COM\fR
-or
-\fB$SHFORTRANCOM\fR
-(the command line) is displayed\&.
-.RE
-.PP
-SHF95FLAGS
-.RS 4
-Options that are passed to the Fortran 95 compiler to generated shared\-library objects\&. You only need to set
-\fB$SHF95FLAGS\fR
-if you need to define specific user options for Fortran 95 files\&. You should normally set the
-\fB$SHFORTRANFLAGS\fR
-variable, which specifies the user\-specified options passed to the default Fortran compiler for all Fortran versions\&.
-.RE
-.PP
-SHF95PPCOM
-.RS 4
-The command line used to compile a Fortran 95 source file to a shared\-library object file after first running the file through the C preprocessor\&. Any options specified in the
-\fB$SHF95FLAGS\fR
-and
-\fB$CPPFLAGS\fR
-construction variables are included on this command line\&. You only need to set
-\fB$SHF95PPCOM\fR
-if you need to use a specific C\-preprocessor command line for Fortran 95 files\&. You should normally set the
-\fB$SHFORTRANPPCOM\fR
-variable, which specifies the default C\-preprocessor command line for all Fortran versions\&.
-.RE
-.PP
-SHF95PPCOMSTR
-.RS 4
-The string displayed when a Fortran 95 source file is compiled to a shared\-library object file after first running the file through the C preprocessor\&. If this is not set, then
-\fB$SHF95PPCOM\fR
-or
-\fB$SHFORTRANPPCOM\fR
-(the command line) is displayed\&.
-.RE
-.PP
-SHFORTRAN
-.RS 4
-The default Fortran compiler used for generating shared\-library objects\&.
-.RE
-.PP
-SHFORTRANCOM
-.RS 4
-The command line used to compile a Fortran source file to a shared\-library object file\&.
-.RE
-.PP
-SHFORTRANCOMSTR
-.RS 4
-The string displayed when a Fortran source file is compiled to a shared\-library object file\&. If this is not set, then
-\fB$SHFORTRANCOM\fR
-(the command line) is displayed\&.
-.RE
-.PP
-SHFORTRANFLAGS
-.RS 4
-Options that are passed to the Fortran compiler to generate shared\-library objects\&.
-.RE
-.PP
-SHFORTRANPPCOM
-.RS 4
-The command line used to compile a Fortran source file to a shared\-library object file after first running the file through the C preprocessor\&. Any options specified in the
-\fB$SHFORTRANFLAGS\fR
-and
-\fB$CPPFLAGS\fR
-construction variables are included on this command line\&.
-.RE
-.PP
-SHFORTRANPPCOMSTR
-.RS 4
-The string displayed when a Fortran source file is compiled to a shared\-library object file after first running the file through the C preprocessor\&. If this is not set, then
-\fB$SHFORTRANPPCOM\fR
-(the command line) is displayed\&.
-.RE
-.PP
-SHLIBEMITTER
-.RS 4
-TODO
-.RE
-.PP
-SHLIBPREFIX
-.RS 4
-The prefix used for shared library file names\&.
-.RE
-.PP
-SHLIBSUFFIX
-.RS 4
-The suffix used for shared library file names\&.
-.RE
-.PP
-SHLIBVERSION
-.RS 4
-When this construction variable is defined, a versioned shared library is created\&. This modifies the
-\fB$SHLINKFLAGS\fR
-as required, adds the version number to the library name, and creates the symlinks that are needed\&.
-\fB$SHLIBVERSION\fR
-needs to be of the form X\&.Y\&.Z, where X and Y are numbers, and Z is a number but can also contain letters to designate alpha, beta, or release candidate patch levels\&.
-.RE
-.PP
-SHLINK
-.RS 4
-The linker for programs that use shared libraries\&.
-.RE
-.PP
-SHLINKCOM
-.RS 4
-The command line used to link programs using shared libraries\&.
-.RE
-.PP
-SHLINKCOMSTR
-.RS 4
-The string displayed when programs using shared libraries are linked\&. If this is not set, then
-\fB$SHLINKCOM\fR
-(the command line) is displayed\&.
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-env = Environment(SHLINKCOMSTR = "Linking shared $TARGET")
-.fi
-.if n \{\
-.RE
-.\}
-.RE
-.PP
-SHLINKFLAGS
-.RS 4
-General user options passed to the linker for programs using shared libraries\&. Note that this variable should
-\fInot\fR
-contain
-\fB\-l\fR
-(or similar) options for linking with the libraries listed in
-\fB$LIBS\fR, nor
-\fB\-L\fR
-(or similar) include search path options that scons generates automatically from
-\fB$LIBPATH\fR\&. See
-\fB$_LIBFLAGS\fR
-above, for the variable that expands to library\-link options, and
-\fB$_LIBDIRFLAGS\fR
-above, for the variable that expands to library search path options\&.
-.RE
-.PP
-SHOBJPREFIX
-.RS 4
-The prefix used for shared object file names\&.
-.RE
-.PP
-SHOBJSUFFIX
-.RS 4
-The suffix used for shared object file names\&.
-.RE
-.PP
-SOURCE
-.RS 4
-A reserved variable name that may not be set or used in a construction environment\&. (See "Variable Substitution," below\&.)
-.RE
-.PP
-SOURCE_URL
-.RS 4
-The URL (web address) of the location from which the project was retrieved\&. This is used to fill in the
-Source:
-field in the controlling information for Ipkg and RPM packages\&.
-.RE
-.PP
-SOURCES
-.RS 4
-A reserved variable name that may not be set or used in a construction environment\&. (See "Variable Substitution," below\&.)
-.RE
-.PP
-SPAWN
-.RS 4
-A command interpreter function that will be called to execute command line strings\&. The function must expect the following arguments:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-def spawn(shell, escape, cmd, args, env):
-.fi
-.if n \{\
-.RE
-.\}
-.sp
-
-\fIsh\fR
-is a string naming the shell program to use\&.
-\fIescape\fR
-is a function that can be called to escape shell special characters in the command line\&.
-\fIcmd\fR
-is the path to the command to be executed\&.
-\fIargs\fR
-is the arguments to the command\&.
-\fIenv\fR
-is a dictionary of the environment variables in which the command should be executed\&.
-.RE
-.PP
-STATIC_AND_SHARED_OBJECTS_ARE_THE_SAME
-.RS 4
-When this variable is true, static objects and shared objects are assumed to be the same; that is, SCons does not check for linking static objects into a shared library\&.
-.RE
-.PP
-SUBST_DICT
-.RS 4
-The dictionary used by the
-\fBSubstfile\fR
-or
-\fBTextfile\fR
-builders for substitution values\&. It can be anything acceptable to the dict() constructor, so in addition to a dictionary, lists of tuples are also acceptable\&.
-.RE
-.PP
-SUBSTFILEPREFIX
-.RS 4
-The prefix used for
-\fBSubstfile\fR
-file names, the null string by default\&.
-.RE
-.PP
-SUBSTFILESUFFIX
-.RS 4
-The suffix used for
-\fBSubstfile\fR
-file names, the null string by default\&.
-.RE
-.PP
-SUMMARY
-.RS 4
-A short summary of what the project is about\&. This is used to fill in the
-Summary:
-field in the controlling information for Ipkg and RPM packages, and as the
-Description:
-field in MSI packages\&.
-.RE
-.PP
-SWIG
-.RS 4
-The scripting language wrapper and interface generator\&.
-.RE
-.PP
-SWIGCFILESUFFIX
-.RS 4
-The suffix that will be used for intermediate C source files generated by the scripting language wrapper and interface generator\&. The default value is
-_wrap\fB$CFILESUFFIX\fR\&. By default, this value is used whenever the
-\fB\-c++\fR
-option is
-\fInot\fR
-specified as part of the
-\fB$SWIGFLAGS\fR
-construction variable\&.
-.RE
-.PP
-SWIGCOM
-.RS 4
-The command line used to call the scripting language wrapper and interface generator\&.
-.RE
-.PP
-SWIGCOMSTR
-.RS 4
-The string displayed when calling the scripting language wrapper and interface generator\&. If this is not set, then
-\fB$SWIGCOM\fR
-(the command line) is displayed\&.
-.RE
-.PP
-SWIGCXXFILESUFFIX
-.RS 4
-The suffix that will be used for intermediate C++ source files generated by the scripting language wrapper and interface generator\&. The default value is
-_wrap\fB$CFILESUFFIX\fR\&. By default, this value is used whenever the
-\-c++
-option is specified as part of the
-\fB$SWIGFLAGS\fR
-construction variable\&.
-.RE
-.PP
-SWIGDIRECTORSUFFIX
-.RS 4
-The suffix that will be used for intermediate C++ header files generated by the scripting language wrapper and interface generator\&. These are only generated for C++ code when the SWIG \*(Aqdirectors\*(Aq feature is turned on\&. The default value is
-_wrap\&.h\&.
-.RE
-.PP
-SWIGFLAGS
-.RS 4
-General options passed to the scripting language wrapper and interface generator\&. This is where you should set
-\fB\-python\fR,
-\fB\-perl5\fR,
-\fB\-tcl\fR, or whatever other options you want to specify to SWIG\&. If you set the
-\fB\-c++\fR
-option in this variable,
-scons
-will, by default, generate a C++ intermediate source file with the extension that is specified as the
-\fB$CXXFILESUFFIX\fR
-variable\&.
-.RE
-.PP
-_SWIGINCFLAGS
-.RS 4
-An automatically\-generated construction variable containing the SWIG command\-line options for specifying directories to be searched for included files\&. The value of
-\fB$_SWIGINCFLAGS\fR
-is created by appending
-\fB$SWIGINCPREFIX\fR
-and
-\fB$SWIGINCSUFFIX\fR
-to the beginning and end of each directory in
-\fB$SWIGPATH\fR\&.
-.RE
-.PP
-SWIGINCPREFIX
-.RS 4
-The prefix used to specify an include directory on the SWIG command line\&. This will be appended to the beginning of each directory in the
-\fB$SWIGPATH\fR
-construction variable when the
-\fB$_SWIGINCFLAGS\fR
-variable is automatically generated\&.
-.RE
-.PP
-SWIGINCSUFFIX
-.RS 4
-The suffix used to specify an include directory on the SWIG command line\&. This will be appended to the end of each directory in the
-\fB$SWIGPATH\fR
-construction variable when the
-\fB$_SWIGINCFLAGS\fR
-variable is automatically generated\&.
-.RE
-.PP
-SWIGOUTDIR
-.RS 4
-Specifies the output directory in which the scripting language wrapper and interface generator should place generated language\-specific files\&. This will be used by SCons to identify the files that will be generated by the
-swig
-call, and translated into the
-swig \-outdir
-option on the command line\&.
-.RE
-.PP
-SWIGPATH
-.RS 4
-The list of directories that the scripting language wrapper and interface generate will search for included files\&. The SWIG implicit dependency scanner will search these directories for include files\&. The default value is an empty list\&.
-.sp
-Don\*(Aqt explicitly put include directory arguments in SWIGFLAGS; the result will be non\-portable and the directories will not be searched by the dependency scanner\&. Note: directory names in SWIGPATH will be looked\-up relative to the SConscript directory when they are used in a command\&. To force
-scons
-to look\-up a directory relative to the root of the source tree use #:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-env = Environment(SWIGPATH=\*(Aq#/include\*(Aq)
-.fi
-.if n \{\
-.RE
-.\}
-.sp
-The directory look\-up can also be forced using the
-\fBDir\fR() function:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-include = Dir(\*(Aqinclude\*(Aq)
-env = Environment(SWIGPATH=include)
-.fi
-.if n \{\
-.RE
-.\}
-.sp
-The directory list will be added to command lines through the automatically\-generated
-\fB$_SWIGINCFLAGS\fR
-construction variable, which is constructed by appending the values of the
-\fB$SWIGINCPREFIX\fR
-and
-\fB$SWIGINCSUFFIX\fR
-construction variables to the beginning and end of each directory in
-\fB$SWIGPATH\fR\&. Any command lines you define that need the SWIGPATH directory list should include
-\fB$_SWIGINCFLAGS\fR:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-env = Environment(SWIGCOM="my_swig \-o $TARGET $_SWIGINCFLAGS $SOURCES")
-.fi
-.if n \{\
-.RE
-.\}
-.RE
-.PP
-SWIGVERSION
-.RS 4
-The version number of the SWIG tool\&.
-.RE
-.PP
-TAR
-.RS 4
-The tar archiver\&.
-.RE
-.PP
-TARCOM
-.RS 4
-The command line used to call the tar archiver\&.
-.RE
-.PP
-TARCOMSTR
-.RS 4
-The string displayed when archiving files using the tar archiver\&. If this is not set, then
-\fB$TARCOM\fR
-(the command line) is displayed\&.
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-env = Environment(TARCOMSTR = "Archiving $TARGET")
-.fi
-.if n \{\
-.RE
-.\}
-.RE
-.PP
-TARFLAGS
-.RS 4
-General options passed to the tar archiver\&.
-.RE
-.PP
-TARGET
-.RS 4
-A reserved variable name that may not be set or used in a construction environment\&. (See "Variable Substitution," below\&.)
-.RE
-.PP
-TARGET_ARCH
-.RS 4
-The name of the target hardware architecture for the compiled objects created by this Environment\&. This defaults to the value of HOST_ARCH, and the user can override it\&. Currently only set for Win32\&.
-.sp
-Sets the target architecture for Visual Studio compiler (i\&.e\&. the arch of the binaries generated by the compiler)\&. If not set, default to
-\fB$HOST_ARCH\fR, or, if that is unset, to the architecture of the running machine\*(Aqs OS (note that the python build or architecture has no effect)\&. This variable must be passed as an argument to the Environment() constructor; setting it later has no effect\&. This is currently only used on Windows, but in the future it will be used on other OSes as well\&.
-.sp
-Valid values for Windows are
-x86,
-i386
-(for 32 bits);
-amd64,
-emt64,
-x86_64
-(for 64 bits); and
-ia64
-(Itanium)\&. For example, if you want to compile 64\-bit binaries, you would set
-TARGET_ARCH=\*(Aqx86_64\*(Aq
-in your SCons environment\&.
-.RE
-.PP
-TARGET_OS
-.RS 4
-The name of the target operating system for the compiled objects created by this Environment\&. This defaults to the value of HOST_OS, and the user can override it\&. Currently only set for Win32\&.
-.RE
-.PP
-TARGETS
-.RS 4
-A reserved variable name that may not be set or used in a construction environment\&. (See "Variable Substitution," below\&.)
-.RE
-.PP
-TARSUFFIX
-.RS 4
-The suffix used for tar file names\&.
-.RE
-.PP
-TEMPFILEPREFIX
-.RS 4
-The prefix for a temporary file used to execute lines longer than $MAXLINELENGTH\&. The default is \*(Aq@\*(Aq\&. This may be set for toolchains that use other values, such as \*(Aq\-@\*(Aq for the diab compiler or \*(Aq\-via\*(Aq for ARM toolchain\&.
-.RE
-.PP
-TEX
-.RS 4
-The TeX formatter and typesetter\&.
-.RE
-.PP
-TEXCOM
-.RS 4
-The command line used to call the TeX formatter and typesetter\&.
-.RE
-.PP
-TEXCOMSTR
-.RS 4
-The string displayed when calling the TeX formatter and typesetter\&. If this is not set, then
-\fB$TEXCOM\fR
-(the command line) is displayed\&.
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-env = Environment(TEXCOMSTR = "Building $TARGET from TeX input $SOURCES")
-.fi
-.if n \{\
-.RE
-.\}
-.RE
-.PP
-TEXFLAGS
-.RS 4
-General options passed to the TeX formatter and typesetter\&.
-.RE
-.PP
-TEXINPUTS
-.RS 4
-List of directories that the LaTeX program will search for include directories\&. The LaTeX implicit dependency scanner will search these directories for \einclude and \eimport files\&.
-.RE
-.PP
-TEXTFILEPREFIX
-.RS 4
-The prefix used for
-\fBTextfile\fR
-file names, the null string by default\&.
-.RE
-.PP
-TEXTFILESUFFIX
-.RS 4
-The suffix used for
-\fBTextfile\fR
-file names;
-\&.txt
-by default\&.
-.RE
-.PP
-TOOLS
-.RS 4
-A list of the names of the Tool specifications that are part of this construction environment\&.
-.RE
-.PP
-UNCHANGED_SOURCES
-.RS 4
-A reserved variable name that may not be set or used in a construction environment\&. (See "Variable Substitution," below\&.)
-.RE
-.PP
-UNCHANGED_TARGETS
-.RS 4
-A reserved variable name that may not be set or used in a construction environment\&. (See "Variable Substitution," below\&.)
-.RE
-.PP
-VENDOR
-.RS 4
-The person or organization who supply the packaged software\&. This is used to fill in the
-Vendor:
-field in the controlling information for RPM packages, and the
-Manufacturer:
-field in the controlling information for MSI packages\&.
-.RE
-.PP
-VERSION
-.RS 4
-The version of the project, specified as a string\&.
-.RE
-.PP
-WIN32_INSERT_DEF
-.RS 4
-A deprecated synonym for
-\fB$WINDOWS_INSERT_DEF\fR\&.
-.RE
-.PP
-WIN32DEFPREFIX
-.RS 4
-A deprecated synonym for
-\fB$WINDOWSDEFPREFIX\fR\&.
-.RE
-.PP
-WIN32DEFSUFFIX
-.RS 4
-A deprecated synonym for
-\fB$WINDOWSDEFSUFFIX\fR\&.
-.RE
-.PP
-WIN32EXPPREFIX
-.RS 4
-A deprecated synonym for
-\fB$WINDOWSEXPSUFFIX\fR\&.
-.RE
-.PP
-WIN32EXPSUFFIX
-.RS 4
-A deprecated synonym for
-\fB$WINDOWSEXPSUFFIX\fR\&.
-.RE
-.PP
-WINDOWS_EMBED_MANIFEST
-.RS 4
-Set this variable to True or 1 to embed the compiler\-generated manifest (normally
-${TARGET}\&.manifest) into all Windows exes and DLLs built with this environment, as a resource during their link step\&. This is done using
-\fB$MT\fR
-and
-\fB$MTEXECOM\fR
-and
-\fB$MTSHLIBCOM\fR\&.
-.RE
-.PP
-WINDOWS_INSERT_DEF
-.RS 4
-When this is set to true, a library build of a Windows shared library (\&.dll
-file) will also build a corresponding
-\&.def
-file at the same time, if a
-\&.def
-file is not already listed as a build target\&. The default is 0 (do not build a
-\&.def
-file)\&.
-.RE
-.PP
-WINDOWS_INSERT_MANIFEST
-.RS 4
-When this is set to true,
-scons
-will be aware of the
-\&.manifest
-files generated by Microsoft Visua C/C++ 8\&.
-.RE
-.PP
-WINDOWSDEFPREFIX
-.RS 4
-The prefix used for Windows
-\&.def
-file names\&.
-.RE
-.PP
-WINDOWSDEFSUFFIX
-.RS 4
-The suffix used for Windows
-\&.def
-file names\&.
-.RE
-.PP
-WINDOWSEXPPREFIX
-.RS 4
-The prefix used for Windows
-\&.exp
-file names\&.
-.RE
-.PP
-WINDOWSEXPSUFFIX
-.RS 4
-The suffix used for Windows
-\&.exp
-file names\&.
-.RE
-.PP
-WINDOWSPROGMANIFESTPREFIX
-.RS 4
-The prefix used for executable program
-\&.manifest
-files generated by Microsoft Visual C/C++\&.
-.RE
-.PP
-WINDOWSPROGMANIFESTSUFFIX
-.RS 4
-The suffix used for executable program
-\&.manifest
-files generated by Microsoft Visual C/C++\&.
-.RE
-.PP
-WINDOWSSHLIBMANIFESTPREFIX
-.RS 4
-The prefix used for shared library
-\&.manifest
-files generated by Microsoft Visual C/C++\&.
-.RE
-.PP
-WINDOWSSHLIBMANIFESTSUFFIX
-.RS 4
-The suffix used for shared library
-\&.manifest
-files generated by Microsoft Visual C/C++\&.
-.RE
-.PP
-X_IPK_DEPENDS
-.RS 4
-This is used to fill in the
-Depends:
-field in the controlling information for Ipkg packages\&.
-.RE
-.PP
-X_IPK_DESCRIPTION
-.RS 4
-This is used to fill in the
-Description:
-field in the controlling information for Ipkg packages\&. The default value is
-$SUMMARY\en$DESCRIPTION
-.RE
-.PP
-X_IPK_MAINTAINER
-.RS 4
-This is used to fill in the
-Maintainer:
-field in the controlling information for Ipkg packages\&.
-.RE
-.PP
-X_IPK_PRIORITY
-.RS 4
-This is used to fill in the
-Priority:
-field in the controlling information for Ipkg packages\&.
-.RE
-.PP
-X_IPK_SECTION
-.RS 4
-This is used to fill in the
-Section:
-field in the controlling information for Ipkg packages\&.
-.RE
-.PP
-X_MSI_LANGUAGE
-.RS 4
-This is used to fill in the
-Language:
-attribute in the controlling information for MSI packages\&.
-.RE
-.PP
-X_MSI_LICENSE_TEXT
-.RS 4
-The text of the software license in RTF format\&. Carriage return characters will be replaced with the RTF equivalent \e\epar\&.
-.RE
-.PP
-X_MSI_UPGRADE_CODE
-.RS 4
-TODO
-.RE
-.PP
-X_RPM_AUTOREQPROV
-.RS 4
-This is used to fill in the
-AutoReqProv:
-field in the RPM
-\&.spec
-file\&.
-.RE
-.PP
-X_RPM_BUILD
-.RS 4
-internal, but overridable
-.RE
-.PP
-X_RPM_BUILDREQUIRES
-.RS 4
-This is used to fill in the
-BuildRequires:
-field in the RPM
-\&.spec
-file\&.
-.RE
-.PP
-X_RPM_BUILDROOT
-.RS 4
-internal, but overridable
-.RE
-.PP
-X_RPM_CLEAN
-.RS 4
-internal, but overridable
-.RE
-.PP
-X_RPM_CONFLICTS
-.RS 4
-This is used to fill in the
-Conflicts:
-field in the RPM
-\&.spec
-file\&.
-.RE
-.PP
-X_RPM_DEFATTR
-.RS 4
-This value is used as the default attributes for the files in the RPM package\&. The default value is
-(\-,root,root)\&.
-.RE
-.PP
-X_RPM_DISTRIBUTION
-.RS 4
-This is used to fill in the
-Distribution:
-field in the RPM
-\&.spec
-file\&.
-.RE
-.PP
-X_RPM_EPOCH
-.RS 4
-This is used to fill in the
-Epoch:
-field in the controlling information for RPM packages\&.
-.RE
-.PP
-X_RPM_EXCLUDEARCH
-.RS 4
-This is used to fill in the
-ExcludeArch:
-field in the RPM
-\&.spec
-file\&.
-.RE
-.PP
-X_RPM_EXLUSIVEARCH
-.RS 4
-This is used to fill in the
-ExclusiveArch:
-field in the RPM
-\&.spec
-file\&.
-.RE
-.PP
-X_RPM_GROUP
-.RS 4
-This is used to fill in the
-Group:
-field in the RPM
-\&.spec
-file\&.
-.RE
-.PP
-X_RPM_GROUP_lang
-.RS 4
-This is used to fill in the
-Group(lang):
-field in the RPM
-\&.spec
-file\&. Note that
-\fIlang\fR
-is not literal and should be replaced by the appropriate language code\&.
-.RE
-.PP
-X_RPM_ICON
-.RS 4
-This is used to fill in the
-Icon:
-field in the RPM
-\&.spec
-file\&.
-.RE
-.PP
-X_RPM_INSTALL
-.RS 4
-internal, but overridable
-.RE
-.PP
-X_RPM_PACKAGER
-.RS 4
-This is used to fill in the
-Packager:
-field in the RPM
-\&.spec
-file\&.
-.RE
-.PP
-X_RPM_POSTINSTALL
-.RS 4
-This is used to fill in the
-%post:
-section in the RPM
-\&.spec
-file\&.
-.RE
-.PP
-X_RPM_POSTUNINSTALL
-.RS 4
-This is used to fill in the
-%postun:
-section in the RPM
-\&.spec
-file\&.
-.RE
-.PP
-X_RPM_PREFIX
-.RS 4
-This is used to fill in the
-Prefix:
-field in the RPM
-\&.spec
-file\&.
-.RE
-.PP
-X_RPM_PREINSTALL
-.RS 4
-This is used to fill in the
-%pre:
-section in the RPM
-\&.spec
-file\&.
-.RE
-.PP
-X_RPM_PREP
-.RS 4
-internal, but overridable
-.RE
-.PP
-X_RPM_PREUNINSTALL
-.RS 4
-This is used to fill in the
-%preun:
-section in the RPM
-\&.spec
-file\&.
-.RE
-.PP
-X_RPM_PROVIDES
-.RS 4
-This is used to fill in the
-Provides:
-field in the RPM
-\&.spec
-file\&.
-.RE
-.PP
-X_RPM_REQUIRES
-.RS 4
-This is used to fill in the
-Requires:
-field in the RPM
-\&.spec
-file\&.
-.RE
-.PP
-X_RPM_SERIAL
-.RS 4
-This is used to fill in the
-Serial:
-field in the RPM
-\&.spec
-file\&.
-.RE
-.PP
-X_RPM_URL
-.RS 4
-This is used to fill in the
-Url:
-field in the RPM
-\&.spec
-file\&.
-.RE
-.PP
-XGETTEXT
-.RS 4
-Path to
-\fBxgettext(1)\fR
-program (found via
-\fBDetect()\fR)\&. See
-xgettext
-tool and
-\fBPOTUpdate\fR
-builder\&.
-.RE
-.PP
-XGETTEXTCOM
-.RS 4
-Complete xgettext command line\&. See
-xgettext
-tool and
-\fBPOTUpdate\fR
-builder\&.
-.RE
-.PP
-XGETTEXTCOMSTR
-.RS 4
-A string that is shown when
-\fBxgettext(1)\fR
-command is invoked (default:
-\*(Aq\*(Aq, which means "print
-\fB$XGETTEXTCOM\fR")\&. See
-xgettext
-tool and
-\fBPOTUpdate\fR
-builder\&.
-.RE
-.PP
-_XGETTEXTDOMAIN
-.RS 4
-Internal "macro"\&. Generates
-\fBxgettext\fR
-domain name form source and target (default:
-\*(Aq${TARGET\&.filebase}\*(Aq)\&.
-.RE
-.PP
-XGETTEXTFLAGS
-.RS 4
-Additional flags to
-\fBxgettext(1)\fR\&. See
-xgettext
-tool and
-\fBPOTUpdate\fR
-builder\&.
-.RE
-.PP
-XGETTEXTFROM
-.RS 4
-Name of file containing list of
-\fBxgettext(1)\fR\*(Aqs source files\&. Autotools\*(Aq users know this as
-POTFILES\&.in
-so they will in most cases set
-XGETTEXTFROM="POTFILES\&.in"
-here\&. The
-\fB$XGETTEXTFROM\fR
-files have same syntax and semantics as the well known GNU
-POTFILES\&.in\&. See
-xgettext
-tool and
-\fBPOTUpdate\fR
-builder\&.
-.RE
-.PP
-_XGETTEXTFROMFLAGS
-.RS 4
-Internal "macro"\&. Genrates list of
-\-D<dir>
-flags from the
-\fB$XGETTEXTPATH\fR
-list\&.
-.RE
-.PP
-XGETTEXTFROMPREFIX
-.RS 4
-This flag is used to add single
-\fB$XGETTEXTFROM\fR
-file to
-\fBxgettext(1)\fR\*(Aqs commandline (default:
-\*(Aq\-f\*(Aq)\&.
-.RE
-.PP
-XGETTEXTFROMSUFFIX
-.RS 4
-(default:
-\*(Aq\*(Aq)
-.RE
-.PP
-XGETTEXTPATH
-.RS 4
-List of directories, there
-\fBxgettext(1)\fR
-will look for source files (default:
-[])\&.
-.if n \{\
-.sp
-.\}
-.RS 4
-.it 1 an-trap
-.nr an-no-space-flag 1
-.nr an-break-flag 1
-.br
-.ps +1
-\fBNote\fR
-.ps -1
-.br
-This variable works only together with
-\fB$XGETTEXTFROM\fR
-.sp .5v
-.RE
-See also
-xgettext
-tool and
-\fBPOTUpdate\fR
-builder\&.
-.RE
-.PP
-_XGETTEXTPATHFLAGS
-.RS 4
-Internal "macro"\&. Generates list of
-\-f<file>
-flags from
-\fB$XGETTEXTFROM\fR\&.
-.RE
-.PP
-XGETTEXTPATHPREFIX
-.RS 4
-This flag is used to add single search path to
-\fBxgettext(1)\fR\*(Aqs commandline (default:
-\*(Aq\-D\*(Aq)\&.
-.RE
-.PP
-XGETTEXTPATHSUFFIX
-.RS 4
-(default:
-\*(Aq\*(Aq)
-.RE
-.PP
-YACC
-.RS 4
-The parser generator\&.
-.RE
-.PP
-YACCCOM
-.RS 4
-The command line used to call the parser generator to generate a source file\&.
-.RE
-.PP
-YACCCOMSTR
-.RS 4
-The string displayed when generating a source file using the parser generator\&. If this is not set, then
-\fB$YACCCOM\fR
-(the command line) is displayed\&.
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-env = Environment(YACCCOMSTR = "Yacc\*(Aqing $TARGET from $SOURCES")
-.fi
-.if n \{\
-.RE
-.\}
-.RE
-.PP
-YACCFLAGS
-.RS 4
-General options passed to the parser generator\&. If
-\fB$YACCFLAGS\fR
-contains a
-\fB\-d\fR
-option, SCons assumes that the call will also create a \&.h file (if the yacc source file ends in a \&.y suffix) or a \&.hpp file (if the yacc source file ends in a \&.yy suffix)
-.RE
-.PP
-YACCHFILESUFFIX
-.RS 4
-The suffix of the C header file generated by the parser generator when the
-\fB\-d\fR
-option is used\&. Note that setting this variable does not cause the parser generator to generate a header file with the specified suffix, it exists to allow you to specify what suffix the parser generator will use of its own accord\&. The default value is
-\&.h\&.
-.RE
-.PP
-YACCHXXFILESUFFIX
-.RS 4
-The suffix of the C++ header file generated by the parser generator when the
-\fB\-d\fR
-option is used\&. Note that setting this variable does not cause the parser generator to generate a header file with the specified suffix, it exists to allow you to specify what suffix the parser generator will use of its own accord\&. The default value is
-\&.hpp, except on Mac OS X, where the default is
-${TARGET\&.suffix}\&.h\&. because the default
-bison
-parser generator just appends
-\&.h
-to the name of the generated C++ file\&.
-.RE
-.PP
-YACCVCGFILESUFFIX
-.RS 4
-The suffix of the file containing the VCG grammar automaton definition when the
-\fB\-\-graph=\fR
-option is used\&. Note that setting this variable does not cause the parser generator to generate a VCG file with the specified suffix, it exists to allow you to specify what suffix the parser generator will use of its own accord\&. The default value is
-\&.vcg\&.
-.RE
-.PP
-ZIP
-.RS 4
-The zip compression and file packaging utility\&.
-.RE
-.PP
-ZIPCOM
-.RS 4
-The command line used to call the zip utility, or the internal Python function used to create a zip archive\&.
-.RE
-.PP
-ZIPCOMPRESSION
-.RS 4
-The
-\fIcompression\fR
-flag from the Python
-zipfile
-module used by the internal Python function to control whether the zip archive is compressed or not\&. The default value is
-zipfile\&.ZIP_DEFLATED, which creates a compressed zip archive\&. This value has no effect if the
-zipfile
-module is unavailable\&.
-.RE
-.PP
-ZIPCOMSTR
-.RS 4
-The string displayed when archiving files using the zip utility\&. If this is not set, then
-\fB$ZIPCOM\fR
-(the command line or internal Python function) is displayed\&.
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-env = Environment(ZIPCOMSTR = "Zipping $TARGET")
-.fi
-.if n \{\
-.RE
-.\}
-.RE
-.PP
-ZIPFLAGS
-.RS 4
-General options passed to the zip utility\&.
-.RE
-.PP
-ZIPROOT
-.RS 4
-An optional zip root directory (default empty)\&. The filenames stored in the zip file will be relative to this directory, if given\&. Otherwise the filenames are relative to the current directory of the command\&. For instance:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-env = Environment()
-env\&.Zip(\*(Aqfoo\&.zip\*(Aq, \*(Aqsubdir1/subdir2/file1\*(Aq, ZIPROOT=\*(Aqsubdir1\*(Aq)
-.fi
-.if n \{\
-.RE
-.\}
-.sp
-will produce a zip file
-foo\&.zip
-containing a file with the name
-subdir2/file1
-rather than
-subdir1/subdir2/file1\&.
-.RE
-.PP
-ZIPSUFFIX
-.RS 4
-The suffix used for zip file names\&.
-.RE
-.PP
-Construction variables can be retrieved and set using the
-\fBDictionary\fR
-method of the construction environment:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-dict = env\&.Dictionary()
-dict["CC"] = "cc"
-.fi
-.if n \{\
-.RE
-.\}
-.PP
-or using the [] operator:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-env["CC"] = "cc"
-.fi
-.if n \{\
-.RE
-.\}
-.PP
-Construction variables can also be passed to the construction environment constructor:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-env = Environment(CC="cc")
-.fi
-.if n \{\
-.RE
-.\}
-.PP
-or when copying a construction environment using the
-\fBClone\fR
-method:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-env2 = env\&.Clone(CC="cl\&.exe")
-.fi
-.if n \{\
-.RE
-.\}
-.SS "Configure Contexts"
-.PP
-\fBscons\fR
-supports
-\fIconfigure contexts,\fR
-an integrated mechanism similar to the various AC_CHECK macros in GNU autoconf for testing for the existence of C header files, libraries, etc\&. In contrast to autoconf,
-\fBscons\fR
-does not maintain an explicit cache of the tested values, but uses its normal dependency tracking to keep the checked values up to date\&. However, users may override this behaviour with the
-\fB\-\-config\fR
-command line option\&.
-.PP
-The following methods can be used to perform checks:
-.PP
-Configure(\fIenv\fR, [\fIcustom_tests\fR, \fIconf_dir\fR, \fIlog_file\fR, \fIconfig_h\fR, \fIclean\fR, \fIhelp])\fR, env\&.Configure([\fIcustom_tests\fR, \fIconf_dir\fR, \fIlog_file\fR, \fIconfig_h\fR, \fIclean\fR, \fIhelp])\fR
-.RS 4
-This creates a configure context, which can be used to perform checks\&.
-\fIenv\fR
-specifies the environment for building the tests\&. This environment may be modified when performing checks\&.
-\fIcustom_tests\fR
-is a dictionary containing custom tests\&. See also the section about custom tests below\&. By default, no custom tests are added to the configure context\&.
-\fIconf_dir\fR
-specifies a directory where the test cases are built\&. Note that this directory is not used for building normal targets\&. The default value is the directory #/\&.sconf_temp\&.
-\fIlog_file\fR
-specifies a file which collects the output from commands that are executed to check for the existence of header files, libraries, etc\&. The default is the file #/config\&.log\&. If you are using the
-\fBVariantDir\fR() method, you may want to specify a subdirectory under your variant directory\&.
-\fIconfig_h\fR
-specifies a C header file where the results of tests will be written, e\&.g\&. #define HAVE_STDIO_H, #define HAVE_LIBM, etc\&. The default is to not write a
-\fBconfig\&.h\fR
-file\&. You can specify the same
-\fBconfig\&.h\fR
-file in multiple calls to Configure, in which case
-\fBscons\fR
-will concatenate all results in the specified file\&. Note that SCons uses its normal dependency checking to decide if it\*(Aqs necessary to rebuild the specified
-\fIconfig_h\fR
-file\&. This means that the file is not necessarily re\-built each time scons is run, but is only rebuilt if its contents will have changed and some target that depends on the
-\fIconfig_h\fR
-file is being built\&.
-.sp
-The optional
-\fBclean\fR
-and
-\fBhelp\fR
-arguments can be used to suppress execution of the configuration tests when the
-\fB\-c/\-\-clean\fR
-or
-\fB\-H/\-h/\-\-help\fR
-options are used, respectively\&. The default behavior is always to execute configure context tests, since the results of the tests may affect the list of targets to be cleaned or the help text\&. If the configure tests do not affect these, then you may add the
-\fBclean=False\fR
-or
-\fBhelp=False\fR
-arguments (or both) to avoid unnecessary test execution\&.
-.RE
-.PP
-A created
-\fBConfigure\fR
-instance has the following associated methods:
-.PP
-SConf\&.Finish(\fIcontext\fR), \fIsconf\fR\&.Finish()
-.RS 4
-This method should be called after configuration is done\&. It returns the environment as modified by the configuration checks performed\&. After this method is called, no further checks can be performed with this configuration context\&. However, you can create a new Configure context to perform additional checks\&. Only one context should be active at a time\&.
-.sp
-The following Checks are predefined\&. (This list will likely grow larger as time goes by and developers contribute new useful tests\&.)
-.RE
-.PP
-SConf\&.CheckHeader(\fIcontext\fR, \fIheader\fR, [\fIinclude_quotes\fR, \fIlanguage\fR]), \fIsconf\fR\&.CheckHeader(\fIheader\fR, [\fIinclude_quotes\fR, \fIlanguage\fR])
-.RS 4
-Checks if
-\fIheader\fR
-is usable in the specified language\&.
-\fIheader\fR
-may be a list, in which case the last item in the list is the header file to be checked, and the previous list items are header files whose
-\fB#include\fR
-lines should precede the header line being checked for\&. The optional argument
-\fIinclude_quotes\fR
-must be a two character string, where the first character denotes the opening quote and the second character denotes the closing quote\&. By default, both characters are " (double quote)\&. The optional argument
-\fIlanguage\fR
-should be either
-\fBC\fR
-or
-\fBC++\fR
-and selects the compiler to be used for the check\&. Returns 1 on success and 0 on failure\&.
-.RE
-.PP
-SConf\&.CheckCHeader(\fIcontext\fR, \fIheader\fR, [\fIinclude_quotes\fR]), \fIsconf\fR\&.CheckCHeader(\fIheader\fR, [\fIinclude_quotes\fR])
-.RS 4
-This is a wrapper around
-\fBSConf\&.CheckHeader\fR
-which checks if
-\fIheader\fR
-is usable in the C language\&.
-\fIheader\fR
-may be a list, in which case the last item in the list is the header file to be checked, and the previous list items are header files whose
-\fB#include\fR
-lines should precede the header line being checked for\&. The optional argument
-\fIinclude_quotes\fR
-must be a two character string, where the first character denotes the opening quote and the second character denotes the closing quote (both default to \eN\*(Aq34\*(Aq)\&. Returns 1 on success and 0 on failure\&.
-.RE
-.PP
-SConf\&.CheckCXXHeader(\fIcontext\fR, \fIheader\fR, [\fIinclude_quotes\fR]), \fIsconf\fR\&.CheckCXXHeader(\fIheader\fR, [\fIinclude_quotes\fR])
-.RS 4
-This is a wrapper around
-\fBSConf\&.CheckHeader\fR
-which checks if
-\fIheader\fR
-is usable in the C++ language\&.
-\fIheader\fR
-may be a list, in which case the last item in the list is the header file to be checked, and the previous list items are header files whose
-\fB#include\fR
-lines should precede the header line being checked for\&. The optional argument
-\fIinclude_quotes\fR
-must be a two character string, where the first character denotes the opening quote and the second character denotes the closing quote (both default to \eN\*(Aq34\*(Aq)\&. Returns 1 on success and 0 on failure\&.
-.RE
-.PP
-SConf\&.CheckFunc(\fIcontext,\fR, \fIfunction_name\fR, [\fIheader\fR, \fIlanguage\fR]), \fIsconf\fR\&.CheckFunc(\fIfunction_name\fR, [\fIheader\fR, \fIlanguage\fR])
-.RS 4
-Checks if the specified C or C++ function is available\&.
-\fIfunction_name\fR
-is the name of the function to check for\&. The optional
-\fIheader\fR
-argument is a string that will be placed at the top of the test file that will be compiled to check if the function exists; the default is:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-#ifdef __cplusplus
-extern "C"
-#endif
-char function_name();
-.fi
-.if n \{\
-.RE
-.\}
-.sp
-The optional
-\fIlanguage\fR
-argument should be
-\fBC\fR
-or
-\fBC++\fR
-and selects the compiler to be used for the check; the default is "C"\&.
-.RE
-.PP
-SConf\&.CheckLib(\fIcontext\fR, [\fIlibrary\fR, \fIsymbol\fR, \fIheader\fR, \fIlanguage\fR, \fIautoadd=1\fR]), \fIsconf\fR\&.CheckLib([\fIlibrary\fR, \fIsymbol\fR, \fIheader\fR, \fIlanguage\fR, \fIautoadd=1\fR])
-.RS 4
-Checks if
-\fIlibrary\fR
-provides
-\fIsymbol\fR\&. If the value of
-\fIautoadd\fR
-is 1 and the library provides the specified
-\fIsymbol\fR, appends the library to the LIBS construction environment variable\&.
-\fIlibrary\fR
-may also be None (the default), in which case
-\fIsymbol\fR
-is checked with the current LIBS variable, or a list of library names, in which case each library in the list will be checked for
-\fIsymbol\fR\&. If
-\fIsymbol\fR
-is not set or is
-\fBNone\fR, then
-\fBSConf\&.CheckLib\fR() just checks if you can link against the specified
-\fIlibrary\fR\&. The optional
-\fIlanguage\fR
-argument should be
-\fBC\fR
-or
-\fBC++\fR
-and selects the compiler to be used for the check; the default is "C"\&. The default value for
-\fIautoadd\fR
-is 1\&. This method returns 1 on success and 0 on error\&.
-.RE
-.PP
-SConf\&.CheckLibWithHeader(\fIcontext\fR, \fIlibrary\fR, \fIheader\fR, \fIlanguage\fR, [\fIcall\fR, \fIautoadd\fR]), \fIsconf\fR\&.CheckLibWithHeader(\fIlibrary\fR, \fIheader\fR, \fIlanguage\fR, [\fIcall\fR, \fIautoadd\fR])
-.RS 4
-In contrast to the SConf\&.CheckLib call, this call provides a more sophisticated way to check against libraries\&. Again,
-\fIlibrary\fR
-specifies the library or a list of libraries to check\&.
-\fIheader\fR
-specifies a header to check for\&.
-\fIheader\fR
-may be a list, in which case the last item in the list is the header file to be checked, and the previous list items are header files whose
-\fB#include\fR
-lines should precede the header line being checked for\&.
-\fIlanguage\fR
-may be one of \*(AqC\*(Aq,\*(Aqc\*(Aq,\*(AqCXX\*(Aq,\*(Aqcxx\*(Aq,\*(AqC++\*(Aq and \*(Aqc++\*(Aq\&.
-\fIcall\fR
-can be any valid expression (with a trailing \*(Aq;\*(Aq)\&. If
-\fIcall\fR
-is not set, the default simply checks that you can link against the specified
-\fIlibrary\fR\&.
-\fIautoadd\fR
-specifies whether to add the library to the environment (only if the check succeeds)\&. This method returns 1 on success and 0 on error\&.
-.RE
-.PP
-SConf\&.CheckType(\fIcontext\fR, \fItype_name\fR, [\fIincludes\fR, \fIlanguage\fR]), \fIsconf\fR\&.CheckType(\fItype_name\fR, [\fIincludes\fR, \fIlanguage\fR])
-.RS 4
-Checks for the existence of a type defined by
-\fBtypedef\fR\&.
-\fItype_name\fR
-specifies the typedef name to check for\&.
-\fIincludes\fR
-is a string containing one or more
-\fB#include\fR
-lines that will be inserted into the program that will be run to test for the existence of the type\&. The optional
-\fIlanguage\fR
-argument should be
-\fBC\fR
-or
-\fBC++\fR
-and selects the compiler to be used for the check; the default is "C"\&. Example:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-sconf\&.CheckType(\*(Aqfoo_type\*(Aq, \*(Aq#include "my_types\&.h"\*(Aq, \*(AqC++\*(Aq)
-.fi
-.if n \{\
-.RE
-.\}
-.RE
-.PP
-Configure\&.CheckCC(\fIself\fR)
-.RS 4
-Checks whether the C compiler (as defined by the CC construction variable) works by trying to compile a small source file\&.
-.sp
-By default, SCons only detects if there is a program with the correct name, not if it is a functioning compiler\&.
-.sp
-This uses the exact same command than the one used by the object builder for C source file, so it can be used to detect if a particular compiler flag works or not\&.
-.RE
-.PP
-Configure\&.CheckCXX(\fIself\fR)
-.RS 4
-Checks whether the C++ compiler (as defined by the CXX construction variable) works by trying to compile a small source file\&. By default, SCons only detects if there is a program with the correct name, not if it is a functioning compiler\&.
-.sp
-This uses the exact same command than the one used by the object builder for CXX source files, so it can be used to detect if a particular compiler flag works or not\&.
-.RE
-.PP
-Configure\&.CheckSHCC(\fIself\fR)
-.RS 4
-Checks whether the C compiler (as defined by the SHCC construction variable) works by trying to compile a small source file\&. By default, SCons only detects if there is a program with the correct name, not if it is a functioning compiler\&.
-.sp
-This uses the exact same command than the one used by the object builder for C source file, so it can be used to detect if a particular compiler flag works or not\&. This does not check whether the object code can be used to build a shared library, only that the compilation (not link) succeeds\&.
-.RE
-.PP
-Configure\&.CheckSHCXX(\fIself\fR)
-.RS 4
-Checks whether the C++ compiler (as defined by the SHCXX construction variable) works by trying to compile a small source file\&. By default, SCons only detects if there is a program with the correct name, not if it is a functioning compiler\&.
-.sp
-This uses the exact same command than the one used by the object builder for CXX source files, so it can be used to detect if a particular compiler flag works or not\&. This does not check whether the object code can be used to build a shared library, only that the compilation (not link) succeeds\&.
-.RE
-.PP
-Example of a typical Configure usage:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-env = Environment()
-conf = Configure( env )
-if not conf\&.CheckCHeader( \*(Aqmath\&.h\*(Aq ):
- print \*(AqWe really need math\&.h!\*(Aq
- Exit(1)
-if conf\&.CheckLibWithHeader( \*(Aqqt\*(Aq, \*(Aqqapp\&.h\*(Aq, \*(Aqc++\*(Aq,
- \*(AqQApplication qapp(0,0);\*(Aq ):
- # do stuff for qt \- usage, e\&.g\&.
- conf\&.env\&.Append( CPPFLAGS = \*(Aq\-DWITH_QT\*(Aq )
-env = conf\&.Finish()
-.fi
-.if n \{\
-.RE
-.\}
-.PP
-SConf\&.CheckTypeSize(\fIcontext\fR, \fItype_name\fR, [\fIheader\fR, \fIlanguage\fR, \fIexpect\fR]), \fIsconf\fR\&.CheckTypeSize(\fItype_name\fR, [\fIheader\fR, \fIlanguage\fR, \fIexpect\fR])
-.RS 4
-Checks for the size of a type defined by
-\fBtypedef\fR\&.
-\fItype_name\fR
-specifies the typedef name to check for\&. The optional
-\fIheader\fR
-argument is a string that will be placed at the top of the test file that will be compiled to check if the function exists; the default is empty\&. The optional
-\fIlanguage\fR
-argument should be
-\fBC\fR
-or
-\fBC++\fR
-and selects the compiler to be used for the check; the default is "C"\&. The optional
-\fIexpect\fR
-argument should be an integer\&. If this argument is used, the function will only check whether the type given in type_name has the expected size (in bytes)\&. For example,
-\fBCheckTypeSize(\*(Aqshort\*(Aq, expect = 2)\fR
-will return success only if short is two bytes\&.
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-.fi
-.if n \{\
-.RE
-.\}
-.RE
-.PP
-SConf\&.CheckDeclaration(\fIcontext\fR, \fIsymbol\fR, [\fIincludes\fR, \fIlanguage\fR]), \fIsconf\fR\&.CheckDeclaration(\fIsymbol\fR, [\fIincludes\fR, \fIlanguage\fR])
-.RS 4
-Checks if the specified
-\fIsymbol\fR
-is declared\&.
-\fIincludes\fR
-is a string containing one or more
-\fB#include\fR
-lines that will be inserted into the program that will be run to test for the existence of the type\&. The optional
-\fIlanguage\fR
-argument should be
-\fBC\fR
-or
-\fBC++\fR
-and selects the compiler to be used for the check; the default is "C"\&.
-.RE
-.PP
-SConf\&.Define(\fIcontext\fR, \fIsymbol\fR, [\fIvalue\fR, \fIcomment\fR]), \fIsconf\fR\&.Define(\fIsymbol\fR, [\fIvalue\fR, \fIcomment\fR])
-.RS 4
-This function does not check for anything, but defines a preprocessor symbol that will be added to the configuration header file\&. It is the equivalent of AC_DEFINE, and defines the symbol
-\fIname\fR
-with the optional
-\fBvalue\fR
-and the optional comment
-\fBcomment\fR\&.
-.RE
-.PP
-Examples:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-env = Environment()
-conf = Configure( env )
-
-# Puts the following line in the config header file:
-# #define A_SYMBOL
-conf\&.Define(\*(AqA_SYMBOL\*(Aq)
-
-# Puts the following line in the config header file:
-# #define A_SYMBOL 1
-conf\&.Define(\*(AqA_SYMBOL\*(Aq, 1)
-.fi
-.if n \{\
-.RE
-.\}
-.PP
-Be careful about quoting string values, though:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-env = Environment()
-conf = Configure( env )
-
-# Puts the following line in the config header file:
-# #define A_SYMBOL YA
-conf\&.Define(\*(AqA_SYMBOL\*(Aq, "YA")
-
-# Puts the following line in the config header file:
-# #define A_SYMBOL "YA"
-conf\&.Define(\*(AqA_SYMBOL\*(Aq, \*(Aq"YA"\*(Aq)
-.fi
-.if n \{\
-.RE
-.\}
-.PP
-For comment:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-env = Environment()
-conf = Configure( env )
-
-# Puts the following lines in the config header file:
-# /* Set to 1 if you have a symbol */
-# #define A_SYMBOL 1
-conf\&.Define(\*(AqA_SYMBOL\*(Aq, 1, \*(AqSet to 1 if you have a symbol\*(Aq)
-.fi
-.if n \{\
-.RE
-.\}
-.PP
-You can define your own custom checks\&. in addition to the predefined checks\&. These are passed in a dictionary to the Configure function\&. This dictionary maps the names of the checks to user defined Python callables (either Python functions or class instances implementing the
-\fI__call__\fR
-method)\&. The first argument of the call is always a
-\fICheckContext\fR
-instance followed by the arguments, which must be supplied by the user of the check\&. These CheckContext instances define the following methods:
-.PP
-CheckContext\&.Message(\fIself\fR, \fItext\fR)
-.RS 4
-Usually called before the check is started\&.
-\fItext\fR
-will be displayed to the user, e\&.g\&. \*(AqChecking for library X\&.\&.\&.\*(Aq
-.RE
-.PP
-CheckContext\&.Result(\fIself,\fR, \fIres\fR)
-.RS 4
-Usually called after the check is done\&.
-\fIres\fR
-can be either an integer or a string\&. In the former case, \*(Aqyes\*(Aq (res != 0) or \*(Aqno\*(Aq (res == 0) is displayed to the user, in the latter case the given string is displayed\&.
-.RE
-.PP
-CheckContext\&.TryCompile(\fIself\fR, \fItext\fR, \fIextension\fR)
-.RS 4
-Checks if a file with the specified
-\fIextension\fR
-(e\&.g\&. \*(Aq\&.c\*(Aq) containing
-\fItext\fR
-can be compiled using the environment\*(Aqs
-\fBObject\fR
-builder\&. Returns 1 on success and 0 on failure\&.
-.RE
-.PP
-CheckContext\&.TryLink(\fIself\fR, \fItext\fR, \fIextension\fR)
-.RS 4
-Checks, if a file with the specified
-\fIextension\fR
-(e\&.g\&. \*(Aq\&.c\*(Aq) containing
-\fItext\fR
-can be compiled using the environment\*(Aqs
-\fBProgram\fR
-builder\&. Returns 1 on success and 0 on failure\&.
-.RE
-.PP
-CheckContext\&.TryRun(\fIself\fR, \fItext\fR, \fIextension\fR)
-.RS 4
-Checks, if a file with the specified
-\fIextension\fR
-(e\&.g\&. \*(Aq\&.c\*(Aq) containing
-\fItext\fR
-can be compiled using the environment\*(Aqs
-\fBProgram\fR
-builder\&. On success, the program is run\&. If the program executes successfully (that is, its return status is 0), a tuple
-\fI(1, outputStr)\fR
-is returned, where
-\fIoutputStr\fR
-is the standard output of the program\&. If the program fails execution (its return status is non\-zero), then (0, \*(Aq\*(Aq) is returned\&.
-.RE
-.PP
-CheckContext\&.TryAction(\fIself\fR, \fIaction\fR, [\fItext\fR, \fIextension\fR])
-.RS 4
-Checks if the specified
-\fIaction\fR
-with an optional source file (contents
-\fItext\fR
-, extension
-\fIextension\fR
-= \*(Aq\*(Aq ) can be executed\&.
-\fIaction\fR
-may be anything which can be converted to a
-\fBscons\fR
-Action\&. On success,
-\fI(1, outputStr)\fR
-is returned, where
-\fIoutputStr\fR
-is the content of the target file\&. On failure
-\fI(0, \*(Aq\*(Aq)\fR
-is returned\&.
-.RE
-.PP
-CheckContext\&.TryBuild(\fIself\fR, \fIbuilder\fR, [\fItext\fR, \fIextension\fR])
-.RS 4
-Low level implementation for testing specific builds; the methods above are based on this method\&. Given the Builder instance
-\fIbuilder\fR
-and the optional
-\fItext\fR
-of a source file with optional
-\fIextension\fR, this method returns 1 on success and 0 on failure\&. In addition,
-\fIself\&.lastTarget\fR
-is set to the build target node, if the build was successful\&.
-.RE
-.PP
-Example for implementing and using custom tests:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-def CheckQt(context, qtdir):
- context\&.Message( \*(AqChecking for qt \&.\&.\&.\*(Aq )
- lastLIBS = context\&.env[\*(AqLIBS\*(Aq]
- lastLIBPATH = context\&.env[\*(AqLIBPATH\*(Aq]
- lastCPPPATH= context\&.env[\*(AqCPPPATH\*(Aq]
- context\&.env\&.Append(LIBS = \*(Aqqt\*(Aq, LIBPATH = qtdir + \*(Aq/lib\*(Aq, CPPPATH = qtdir + \*(Aq/include\*(Aq )
- ret = context\&.TryLink("""
-#include <qapp\&.h>
-int main(int argc, char **argv) {
- QApplication qapp(argc, argv);
- return 0;
-}
-""")
- if not ret:
- context\&.env\&.Replace(LIBS = lastLIBS, LIBPATH=lastLIBPATH, CPPPATH=lastCPPPATH)
- context\&.Result( ret )
- return ret
-
-env = Environment()
-conf = Configure( env, custom_tests = { \*(AqCheckQt\*(Aq : CheckQt } )
-if not conf\&.CheckQt(\*(Aq/usr/lib/qt\*(Aq):
- print \*(AqWe really need qt!\*(Aq
- Exit(1)
-env = conf\&.Finish()
-.fi
-.if n \{\
-.RE
-.\}
-.SS "Command\-Line Construction Variables"
-.PP
-Often when building software, some variables must be specified at build time\&. For example, libraries needed for the build may be in non\-standard locations, or site\-specific compiler options may need to be passed to the compiler\&.
-\fBscons\fR
-provides a
-\fBVariables\fR
-object to support overriding construction variables on the command line:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-$ scons VARIABLE=foo
-.fi
-.if n \{\
-.RE
-.\}
-.PP
-The variable values can also be specified in a text\-based SConscript file\&. To create a Variables object, call the Variables() function:
-.PP
-Variables([\fIfiles\fR], [\fIargs\fR])
-.RS 4
-This creates a Variables object that will read construction variables from the file or list of filenames specified in
-\fIfiles\fR\&. If no files are specified, or the
-\fIfiles\fR
-argument is
-\fBNone\fR, then no files will be read\&. The optional argument
-\fIargs\fR
-is a dictionary of values that will override anything read from the specified files; it is primarily intended to be passed the
-\fBARGUMENTS\fR
-dictionary that holds variables specified on the command line\&. Example:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-vars = Variables(\*(Aqcustom\&.py\*(Aq)
-vars = Variables(\*(Aqoverrides\&.py\*(Aq, ARGUMENTS)
-vars = Variables(None, {FOO:\*(Aqexpansion\*(Aq, BAR:7})
-.fi
-.if n \{\
-.RE
-.\}
-.sp
-Variables objects have the following methods:
-.RE
-.PP
-Add(\fIkey\fR, [\fIhelp\fR, \fIdefault\fR, \fIvalidator\fR, \fIconverter\fR])
-.RS 4
-This adds a customizable construction variable to the Variables object\&.
-\fIkey\fR
-is the name of the variable\&.
-\fIhelp\fR
-is the help text for the variable\&.
-\fIdefault\fR
-is the default value of the variable; if the default value is
-\fBNone\fR
-and there is no explicit value specified, the construction variable will
-\fInot\fR
-be added to the construction environment\&.
-\fIvalidator\fR
-is called to validate the value of the variable, and should take three arguments: key, value, and environment\&. The recommended way to handle an invalid value is to raise an exception (see example below)\&.
-\fIconverter\fR
-is called to convert the value before putting it in the environment, and should take either a value, or the value and environment, as parameters\&. The
-\fIconverter\fR
-must return a value, which will be converted into a string before being validated by the
-\fIvalidator\fR
-(if any) and then added to the environment\&.
-.sp
-Examples:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-vars\&.Add(\*(AqCC\*(Aq, \*(AqThe C compiler\*(Aq)
-
-def validate_color(key, val, env):
- if not val in [\*(Aqred\*(Aq, \*(Aqblue\*(Aq, \*(Aqyellow\*(Aq]:
- raise Exception("Invalid color value \*(Aq%s\*(Aq" % val)
-vars\&.Add(\*(AqCOLOR\*(Aq, validator=valid_color)
-.fi
-.if n \{\
-.RE
-.\}
-.RE
-.PP
-AddVariables(\fIlist\fR)
-.RS 4
-A wrapper script that adds multiple customizable construction variables to a Variables object\&.
-\fIlist\fR
-is a list of tuple or list objects that contain the arguments for an individual call to the
-\fBAdd\fR
-method\&.
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-opt\&.AddVariables(
- (\*(Aqdebug\*(Aq, \*(Aq\*(Aq, 0),
- (\*(AqCC\*(Aq, \*(AqThe C compiler\*(Aq),
- (\*(AqVALIDATE\*(Aq, \*(AqAn option for testing validation\*(Aq,
- \*(Aqnotset\*(Aq, validator, None),
- )
-.fi
-.if n \{\
-.RE
-.\}
-.RE
-.PP
-Update(\fIenv\fR, [\fIargs\fR])
-.RS 4
-This updates a construction environment
-\fIenv\fR
-with the customized construction variables\&. Any specified variables that are
-\fInot\fR
-configured for the Variables object will be saved and may be retrieved with the
-\fBUnknownVariables\fR() method, below\&.
-.sp
-Normally this method is not called directly, but is called indirectly by passing the Variables object to the Environment() function:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-env = Environment(variables=vars)
-.fi
-.if n \{\
-.RE
-.\}
-.RE
-.PP
-The text file(s) that were specified when the Variables object was created are executed as Python scripts, and the values of (global) Python variables set in the file are added to the construction environment\&.
-.PP
-Example:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-CC = \*(Aqmy_cc\*(Aq
-.fi
-.if n \{\
-.RE
-.\}
-.PP
-UnknownVariables(\fI)\fR
-.RS 4
-Returns a dictionary containing any variables that were specified either in the files or the dictionary with which the Variables object was initialized, but for which the Variables object was not configured\&.
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-env = Environment(variables=vars)
-for key, value in vars\&.UnknownVariables():
- print "unknown variable: %s=%s" % (key, value)
-.fi
-.if n \{\
-.RE
-.\}
-.RE
-.PP
-Save(\fIfilename\fR, \fIenv\fR)
-.RS 4
-This saves the currently set variables into a script file named
-\fIfilename\fR
-that can be used on the next invocation to automatically load the current settings\&. This method combined with the Variables method can be used to support caching of variables between runs\&.
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-env = Environment()
-vars = Variables([\*(Aqvariables\&.cache\*(Aq, \*(Aqcustom\&.py\*(Aq])
-vars\&.Add(\&.\&.\&.)
-vars\&.Update(env)
-vars\&.Save(\*(Aqvariables\&.cache\*(Aq, env)
-.fi
-.if n \{\
-.RE
-.\}
-.RE
-.PP
-GenerateHelpText(\fIenv\fR, [\fIsort\fR])
-.RS 4
-This generates help text documenting the customizable construction variables suitable to passing in to the Help() function\&.
-\fIenv\fR
-is the construction environment that will be used to get the actual values of customizable variables\&. Calling with an optional
-\fIsort\fR
-function will cause the output to be sorted by the specified argument\&. The specific
-\fIsort\fR
-function should take two arguments and return \-1, 0 or 1 (like the standard Python
-\fIcmp\fR
-function)\&.
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-Help(vars\&.GenerateHelpText(env))
-Help(vars\&.GenerateHelpText(env, sort=cmp))
-.fi
-.if n \{\
-.RE
-.\}
-.RE
-.PP
-FormatVariableHelpText(\fIenv\fR, \fIopt\fR, \fIhelp\fR, \fIdefault\fR, \fIactual\fR)
-.RS 4
-This method returns a formatted string containing the printable help text for one option\&. It is normally not called directly, but is called by the
-\fIGenerateHelpText\fR() method to create the returned help text\&. It may be overridden with your own function that takes the arguments specified above and returns a string of help text formatted to your liking\&. Note that the
-\fIGenerateHelpText\fR() will not put any blank lines or extra characters in between the entries, so you must add those characters to the returned string if you want the entries separated\&.
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-def my_format(env, opt, help, default, actual):
- fmt = "\en%s: default=%s actual=%s (%s)\en"
- return fmt % (opt, default\&. actual, help)
-vars\&.FormatVariableHelpText = my_format
-.fi
-.if n \{\
-.RE
-.\}
-.sp
-To make it more convenient to work with customizable Variables,
-\fBscons\fR
-provides a number of functions that make it easy to set up various types of Variables:
-.RE
-.PP
-BoolVariable(\fIkey\fR, \fIhelp\fR, \fIdefault\fR)
-.RS 4
-Return a tuple of arguments to set up a Boolean option\&. The option will use the specified name
-\fIkey\fR, have a default value of
-\fIdefault\fR, and display the specified
-\fIhelp\fR
-text\&. The option will interpret the values
-\fBy\fR,
-\fByes\fR,
-\fBt\fR,
-\fBtrue\fR,
-1,
-\fBon\fR
-and
-\fBall\fR
-as true, and the values
-\fBn\fR,
-\fBno\fR,
-\fBf\fR,
-\fBfalse\fR,
-0,
-\fBoff\fR
-and
-\fBnone\fR
-as false\&.
-.RE
-.PP
-EnumVariable(\fIkey\fR, \fIhelp\fR, \fIdefault\fR, \fIallowed_values\fR, [\fImap\fR, \fIignorecase\fR])
-.RS 4
-Return a tuple of arguments to set up an option whose value may be one of a specified list of legal enumerated values\&. The option will use the specified name
-\fIkey\fR, have a default value of
-\fIdefault\fR, and display the specified
-\fIhelp\fR
-text\&. The option will only support those values in the
-\fIallowed_values\fR
-list\&. The optional
-\fImap\fR
-argument is a dictionary that can be used to convert input values into specific legal values in the
-\fIallowed_values\fR
-list\&. If the value of
-\fIignore_case\fR
-is
-0
-(the default), then the values are case\-sensitive\&. If the value of
-\fIignore_case\fR
-is
-1, then values will be matched case\-insensitive\&. If the value of
-\fIignore_case\fR
-is
-2, then values will be matched case\-insensitive, and all input values will be converted to lower case\&.
-.RE
-.PP
-ListVariable(\fIkey\fR, \fIhelp\fR, \fIdefault\fR, \fInames\fR, [\fI,\fRmap\fI])\fR
-.RS 4
-Return a tuple of arguments to set up an option whose value may be one or more of a specified list of legal enumerated values\&. The option will use the specified name
-\fIkey\fR, have a default value of
-\fIdefault\fR, and display the specified
-\fIhelp\fR
-text\&. The option will only support the values
-\fBall\fR,
-\fBnone\fR, or the values in the
-\fInames\fR
-list\&. More than one value may be specified, with all values separated by commas\&. The default may be a string of comma\-separated default values, or a list of the default values\&. The optional
-\fImap\fR
-argument is a dictionary that can be used to convert input values into specific legal values in the
-\fInames\fR
-list\&.
-.RE
-.PP
-PackageVariable(\fIkey\fR, \fIhelp\fR, \fIdefault\fR)
-.RS 4
-Return a tuple of arguments to set up an option whose value is a path name of a package that may be enabled, disabled or given an explicit path name\&. The option will use the specified name
-\fIkey\fR, have a default value of
-\fIdefault\fR, and display the specified
-\fIhelp\fR
-text\&. The option will support the values
-\fByes\fR,
-\fBtrue\fR,
-\fBon\fR,
-\fBenable\fR
-or
-\fBsearch\fR, in which case the specified
-\fIdefault\fR
-will be used, or the option may be set to an arbitrary string (typically the path name to a package that is being enabled)\&. The option will also support the values
-\fBno\fR,
-\fBfalse\fR,
-\fBoff\fR
-or
-\fBdisable\fR
-to disable use of the specified option\&.
-.RE
-.PP
-PathVariable(\fIkey\fR, \fIhelp\fR, \fIdefault\fR, [\fIvalidator\fR])
-.RS 4
-Return a tuple of arguments to set up an option whose value is expected to be a path name\&. The option will use the specified name
-\fIkey\fR, have a default value of
-\fIdefault\fR, and display the specified
-\fIhelp\fR
-text\&. An additional
-\fIvalidator\fR
-may be specified that will be called to verify that the specified path is acceptable\&. SCons supplies the following ready\-made validators:
-\fBPathVariable\&.PathExists\fR
-(the default), which verifies that the specified path exists;
-\fBPathVariable\&.PathIsFile\fR, which verifies that the specified path is an existing file;
-\fBPathVariable\&.PathIsDir\fR, which verifies that the specified path is an existing directory;
-\fBPathVariable\&.PathIsDirCreate\fR, which verifies that the specified path is a directory and will create the specified directory if the path does not exist; and
-\fBPathVariable\&.PathAccept\fR, which simply accepts the specific path name argument without validation, and which is suitable if you want your users to be able to specify a directory path that will be created as part of the build process, for example\&. You may supply your own
-\fIvalidator\fR
-function, which must take three arguments (\fIkey\fR, the name of the variable to be set;
-\fIval\fR, the specified value being checked; and
-\fIenv\fR, the construction environment) and should raise an exception if the specified value is not acceptable\&.
-.RE
-.PP
-These functions make it convenient to create a number of variables with consistent behavior in a single call to the
-\fBAddVariables\fR
-method:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-vars\&.AddVariables(
- BoolVariable(\*(Aqwarnings\*(Aq, \*(Aqcompilation with \-Wall and similiar\*(Aq, 1),
- EnumVariable(\*(Aqdebug\*(Aq, \*(Aqdebug output and symbols\*(Aq, \*(Aqno\*(Aq
- allowed_values=(\*(Aqyes\*(Aq, \*(Aqno\*(Aq, \*(Aqfull\*(Aq),
- map={}, ignorecase=0), # case sensitive
- ListVariable(\*(Aqshared\*(Aq,
- \*(Aqlibraries to build as shared libraries\*(Aq,
- \*(Aqall\*(Aq,
- names = list_of_libs),
- PackageVariable(\*(Aqx11\*(Aq,
- \*(Aquse X11 installed here (yes = search some places)\*(Aq,
- \*(Aqyes\*(Aq),
- PathVariable(\*(Aqqtdir\*(Aq, \*(Aqwhere the root of Qt is installed\*(Aq, qtdir),
- PathVariable(\*(Aqfoopath\*(Aq, \*(Aqwhere the foo library is installed\*(Aq, foopath,
- PathVariable\&.PathIsDir),
-
-)
-.fi
-.if n \{\
-.RE
-.\}
-.SS "File and Directory Nodes"
-.PP
-The
-\fIFile\fR() and
-\fIDir\fR() functions return
-\fIFile\fR
-and
-\fIDir\fR
-Nodes, respectively\&. python objects, respectively\&. Those objects have several user\-visible attributes and methods that are often useful:
-.PP
-path
-.RS 4
-The build path of the given file or directory\&. This path is relative to the top\-level directory (where the
-\fBSConstruct\fR
-file is found)\&. The build path is the same as the source path if
-\fIvariant_dir\fR
-is not being used\&.
-.RE
-.PP
-abspath
-.RS 4
-The absolute build path of the given file or directory\&.
-.RE
-.PP
-srcnode()
-.RS 4
-The
-\fIsrcnode\fR() method returns another
-\fIFile\fR
-or
-\fIDir\fR
-object representing the
-\fIsource\fR
-path of the given
-\fIFile\fR
-or
-\fIDir\fR\&. The
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-# Get the current build dir\*(Aqs path, relative to top\&.
-Dir(\*(Aq\&.\*(Aq)\&.path
-# Current dir\*(Aqs absolute path
-Dir(\*(Aq\&.\*(Aq)\&.abspath
-# Next line is always \*(Aq\&.\*(Aq, because it is the top dir\*(Aqs path relative to itself\&.
-Dir(\*(Aq#\&.\*(Aq)\&.path
-File(\*(Aqfoo\&.c\*(Aq)\&.srcnode()\&.path # source path of the given source file\&.
-
-# Builders also return File objects:
-foo = env\&.Program(\*(Aqfoo\&.c\*(Aq)
-print "foo will be built in %s"%foo\&.path
-.fi
-.if n \{\
-.RE
-.\}
-.sp
-A
-\fIDir\fR
-Node or
-\fIFile\fR
-Node can also be used to create file and subdirectory Nodes relative to the generating Node\&. A
-\fIDir\fR
-Node will place the new Nodes within the directory it represents\&. A
-\fIFile\fR
-node will place the new Nodes within its parent directory (that is, "beside" the file in question)\&. If
-\fId\fR
-is a
-\fIDir\fR
-(directory) Node and
-\fIf\fR
-is a
-\fIFile\fR
-(file) Node, then these methods are available:
-.RE
-.PP
-\fId\fR\&.Dir(\fIname\fR)
-.RS 4
-Returns a directory Node for a subdirectory of
-\fId\fR
-named
-\fIname\fR\&.
-.RE
-.PP
-\fId\fR\&.File(\fIname\fR)
-.RS 4
-Returns a file Node for a file within
-\fId\fR
-named
-\fIname\fR\&.
-.RE
-.PP
-\fId\fR\&.Entry(\fIname\fR)
-.RS 4
-Returns an unresolved Node within
-\fId\fR
-named
-\fIname\fR\&.
-.RE
-.PP
-\fIf\fR\&.Dir(\fIname\fR)
-.RS 4
-Returns a directory named
-\fIname\fR
-within the parent directory of
-\fIf\fR\&.
-.RE
-.PP
-\fIf\fR\&.File(\fIname\fR)
-.RS 4
-Returns a file named
-\fIname\fR
-within the parent directory of
-\fIf\fR\&.
-.RE
-.PP
-\fIf\fR\&.Entry(\fIname\fR)
-.RS 4
-Returns an unresolved Node named
-\fIname\fR
-within the parent directory of
-\fIf\fR\&.
-.RE
-.PP
-For example:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-# Get a Node for a file within a directory
-incl = Dir(\*(Aqinclude\*(Aq)
-f = incl\&.File(\*(Aqheader\&.h\*(Aq)
-
-# Get a Node for a subdirectory within a directory
-dist = Dir(\*(Aqproject\-3\&.2\&.1)
-src = dist\&.Dir(\*(Aqsrc\*(Aq)
-
-# Get a Node for a file in the same directory
-cfile = File(\*(Aqsample\&.c\*(Aq)
-hfile = cfile\&.File(\*(Aqsample\&.h\*(Aq)
-
-# Combined example
-docs = Dir(\*(Aqdocs\*(Aq)
-html = docs\&.Dir(\*(Aqhtml\*(Aq)
-index = html\&.File(\*(Aqindex\&.html\*(Aq)
-css = index\&.File(\*(Aqapp\&.css\*(Aq)
-.fi
-.if n \{\
-.RE
-.\}
-.SH "EXTENDING SCONS"
-.SS "Builder Objects"
-.PP
-\fBscons\fR
-can be extended to build different types of targets by adding new Builder objects to a construction environment\&.
-\fIIn general\fR, you should only need to add a new Builder object when you want to build a new type of file or other external target\&. If you just want to invoke a different compiler or other tool to build a Program, Object, Library, or any other type of output file for which
-\fBscons\fR
-already has an existing Builder, it is generally much easier to use those existing Builders in a construction environment that sets the appropriate construction variables (CC, LINK, etc\&.)\&.
-.PP
-Builder objects are created using the
-\fBBuilder\fR
-function\&. The
-\fBBuilder\fR
-function accepts the following arguments:
-.PP
-action
-.RS 4
-The command line string used to build the target from the source\&.
-\fBaction\fR
-can also be: a list of strings representing the command to be executed and its arguments (suitable for enclosing white space in an argument), a dictionary mapping source file name suffixes to any combination of command line strings (if the builder should accept multiple source file extensions), a Python function; an Action object (see the next section); or a list of any of the above\&.
-.sp
-An action function takes three arguments:
-\fIsource\fR
-\- a list of source nodes,
-\fItarget\fR
-\- a list of target nodes,
-\fIenv\fR
-\- the construction environment\&.
-.RE
-.PP
-prefix
-.RS 4
-The prefix that will be prepended to the target file name\&. This may be specified as a:
-*
-\fIstring\fR,
-.sp
-*
-\fIcallable object\fR
-\- a function or other callable that takes two arguments (a construction environment and a list of sources) and returns a prefix,
-.sp
-*
-\fIdictionary\fR
-\- specifies a mapping from a specific source suffix (of the first source specified) to a corresponding target prefix\&. Both the source suffix and target prefix specifications may use environment variable substitution, and the target prefix (the \*(Aqvalue\*(Aq entries in the dictionary) may also be a callable object\&. The default target prefix may be indicated by a dictionary entry with a key value of None\&.
-.RE
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-b = Builder("build_it < $SOURCE > $TARGET",
- prefix = "file\-")
-
-def gen_prefix(env, sources):
- return "file\-" + env[\*(AqPLATFORM\*(Aq] + \*(Aq\-\*(Aq
-b = Builder("build_it < $SOURCE > $TARGET",
- prefix = gen_prefix)
-
-b = Builder("build_it < $SOURCE > $TARGET",
- suffix = { None: "file\-",
- "$SRC_SFX_A": gen_prefix })
-.fi
-.if n \{\
-.RE
-.\}
-.PP
-suffix
-.RS 4
-The suffix that will be appended to the target file name\&. This may be specified in the same manner as the prefix above\&. If the suffix is a string, then
-\fBscons\fR
-will append a \*(Aq\&.\*(Aq to the beginning of the suffix if it\*(Aqs not already there\&. The string returned by callable object (or obtained from the dictionary) is untouched and must append its own \*(Aq\&.\*(Aq to the beginning if one is desired\&.
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-b = Builder("build_it < $SOURCE > $TARGET"
- suffix = "\-file")
-
-def gen_suffix(env, sources):
- return "\&." + env[\*(AqPLATFORM\*(Aq] + "\-file"
-b = Builder("build_it < $SOURCE > $TARGET",
- suffix = gen_suffix)
-
-b = Builder("build_it < $SOURCE > $TARGET",
- suffix = { None: "\&.sfx1",
- "$SRC_SFX_A": gen_suffix })
-.fi
-.if n \{\
-.RE
-.\}
-.RE
-.PP
-ensure_suffix
-.RS 4
-When set to any true value, causes
-\fBscons\fR
-to add the target suffix specified by the
-\fIsuffix\fR
-keyword to any target strings that have a different suffix\&. (The default behavior is to leave untouched any target file name that looks like it already has any suffix\&.)
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-b1 = Builder("build_it < $SOURCE > $TARGET"
- suffix = "\&.out")
-b2 = Builder("build_it < $SOURCE > $TARGET"
- suffix = "\&.out",
- ensure_suffix)
-env = Environment()
-env[\*(AqBUILDERS\*(Aq][\*(AqB1\*(Aq] = b1
-env[\*(AqBUILDERS\*(Aq][\*(AqB2\*(Aq] = b2
-
-# Builds "foo\&.txt" because ensure_suffix is not set\&.
-env\&.B1(\*(Aqfoo\&.txt\*(Aq, \*(Aqfoo\&.in\*(Aq)
-
-# Builds "bar\&.txt\&.out" because ensure_suffix is set\&.
-env\&.B2(\*(Aqbar\&.txt\*(Aq, \*(Aqbar\&.in\*(Aq)
-.fi
-.if n \{\
-.RE
-.\}
-.RE
-.PP
-src_suffix
-.RS 4
-The expected source file name suffix\&. This may be a string or a list of strings\&.
-.RE
-.PP
-target_scanner
-.RS 4
-A Scanner object that will be invoked to find implicit dependencies for this target file\&. This keyword argument should be used for Scanner objects that find implicit dependencies based only on the target file and the construction environment,
-\fInot\fR
-for implicit dependencies based on source files\&. (See the section "Scanner Objects" below, for information about creating Scanner objects\&.)
-.RE
-.PP
-source_scanner
-.RS 4
-A Scanner object that will be invoked to find implicit dependencies in any source files used to build this target file\&. This is where you would specify a scanner to find things like
-\fB#include\fR
-lines in source files\&. The pre\-built
-\fBDirScanner\fR
-Scanner object may be used to indicate that this Builder should scan directory trees for on\-disk changes to files that
-\fBscons\fR
-does not know about from other Builder or function calls\&. (See the section "Scanner Objects" below, for information about creating your own Scanner objects\&.)
-.RE
-.PP
-target_factory
-.RS 4
-A factory function that the Builder will use to turn any targets specified as strings into SCons Nodes\&. By default, SCons assumes that all targets are files\&. Other useful target_factory values include
-\fBDir\fR, for when a Builder creates a directory target, and
-\fBEntry\fR, for when a Builder can create either a file or directory target\&.
-.sp
-Example:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-MakeDirectoryBuilder = Builder(action=my_mkdir, target_factory=Dir)
-env = Environment()
-env\&.Append(BUILDERS = {\*(AqMakeDirectory\*(Aq:MakeDirectoryBuilder})
-env\&.MakeDirectory(\*(Aqnew_directory\*(Aq, [])
-.fi
-.if n \{\
-.RE
-.\}
-.sp
-Note that the call to the MakeDirectory Builder needs to specify an empty source list to make the string represent the builder\*(Aqs target; without that, it would assume the argument is the source, and would try to deduce the target name from it, which in the absence of an automatically\-added prefix or suffix would lead to a matching target and source name and a circular dependency\&.
-.RE
-.PP
-source_factory
-.RS 4
-A factory function that the Builder will use to turn any sources specified as strings into SCons Nodes\&. By default, SCons assumes that all source are files\&. Other useful source_factory values include
-\fBDir\fR, for when a Builder uses a directory as a source, and
-\fBEntry\fR, for when a Builder can use files or directories (or both) as sources\&.
-.sp
-Example:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-CollectBuilder = Builder(action=my_mkdir, source_factory=Entry)
-env = Environment()
-env\&.Append(BUILDERS = {\*(AqCollect\*(Aq:CollectBuilder})
-env\&.Collect(\*(Aqarchive\*(Aq, [\*(Aqdirectory_name\*(Aq, \*(Aqfile_name\*(Aq])
-.fi
-.if n \{\
-.RE
-.\}
-.RE
-.PP
-emitter
-.RS 4
-A function or list of functions to manipulate the target and source lists before dependencies are established and the target(s) are actually built\&.
-\fBemitter\fR
-can also be a string containing a construction variable to expand to an emitter function or list of functions, or a dictionary mapping source file suffixes to emitter functions\&. (Only the suffix of the first source file is used to select the actual emitter function from an emitter dictionary\&.)
-.sp
-An emitter function takes three arguments:
-\fIsource\fR
-\- a list of source nodes,
-\fItarget\fR
-\- a list of target nodes,
-\fIenv\fR
-\- the construction environment\&. An emitter must return a tuple containing two lists, the list of targets to be built by this builder, and the list of sources for this builder\&.
-.sp
-Example:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-def e(target, source, env):
- return (target + [\*(Aqfoo\&.foo\*(Aq], source + [\*(Aqfoo\&.src\*(Aq])
-
-# Simple association of an emitter function with a Builder\&.
-b = Builder("my_build < $TARGET > $SOURCE",
- emitter = e)
-
-def e2(target, source, env):
- return (target + [\*(Aqbar\&.foo\*(Aq], source + [\*(Aqbar\&.src\*(Aq])
-
-# Simple association of a list of emitter functions with a Builder\&.
-b = Builder("my_build < $TARGET > $SOURCE",
- emitter = [e, e2])
-
-# Calling an emitter function through a construction variable\&.
-env = Environment(MY_EMITTER = e)
-b = Builder("my_build < $TARGET > $SOURCE",
- emitter = \*(Aq$MY_EMITTER\*(Aq)
-
-# Calling a list of emitter functions through a construction variable\&.
-env = Environment(EMITTER_LIST = [e, e2])
-b = Builder("my_build < $TARGET > $SOURCE",
- emitter = \*(Aq$EMITTER_LIST\*(Aq)
-
-# Associating multiple emitters with different file
-# suffixes using a dictionary\&.
-def e_suf1(target, source, env):
- return (target + [\*(Aqanother_target_file\*(Aq], source)
-def e_suf2(target, source, env):
- return (target, source + [\*(Aqanother_source_file\*(Aq])
-b = Builder("my_build < $TARGET > $SOURCE",
- emitter = {\*(Aq\&.suf1\*(Aq : e_suf1,
- \*(Aq\&.suf2\*(Aq : e_suf2})
-.fi
-.if n \{\
-.RE
-.\}
-.RE
-.PP
-multi
-.RS 4
-Specifies whether this builder is allowed to be called multiple times for the same target file(s)\&. The default is 0, which means the builder can not be called multiple times for the same target file(s)\&. Calling a builder multiple times for the same target simply adds additional source files to the target; it is not allowed to change the environment associated with the target, specify addition environment overrides, or associate a different builder with the target\&.
-.RE
-.PP
-env
-.RS 4
-A construction environment that can be used to fetch source code using this Builder\&. (Note that this environment is
-\fInot\fR
-used for normal builds of normal target files, which use the environment that was used to call the Builder for the target file\&.)
-.RE
-.PP
-generator
-.RS 4
-A function that returns a list of actions that will be executed to build the target(s) from the source(s)\&. The returned action(s) may be an Action object, or anything that can be converted into an Action object (see the next section)\&.
-.sp
-The generator function takes four arguments:
-\fIsource\fR
-\- a list of source nodes,
-\fItarget\fR
-\- a list of target nodes,
-\fIenv\fR
-\- the construction environment,
-\fIfor_signature\fR
-\- a Boolean value that specifies whether the generator is being called for generating a build signature (as opposed to actually executing the command)\&. Example:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-def g(source, target, env, for_signature):
- return [["gcc", "\-c", "\-o"] + target + source]
-
-b = Builder(generator=g)
-.fi
-.if n \{\
-.RE
-.\}
-.sp
-The
-\fIgenerator\fR
-and
-\fIaction\fR
-arguments must not both be used for the same Builder\&.
-.RE
-.PP
-src_builder
-.RS 4
-Specifies a builder to use when a source file name suffix does not match any of the suffixes of the builder\&. Using this argument produces a multi\-stage builder\&.
-.RE
-.PP
-single_source
-.RS 4
-Specifies that this builder expects exactly one source file per call\&. Giving more than one source file without target files results in implicitly calling the builder multiple times (once for each source given)\&. Giving multiple source files together with target files results in a UserError exception\&.
-.RE
-.PP
-The
-\fIgenerator\fR
-and
-\fIaction\fR
-arguments must not both be used for the same Builder\&.
-.PP
-source_ext_match
-.RS 4
-When the specified
-\fIaction\fR
-argument is a dictionary, the default behavior when a builder is passed multiple source files is to make sure that the extensions of all the source files match\&. If it is legal for this builder to be called with a list of source files with different extensions, this check can be suppressed by setting
-\fBsource_ext_match\fR
-to
-\fBNone\fR
-or some other non\-true value\&. When
-\fBsource_ext_match\fR
-is disable,
-\fBscons\fR
-will use the suffix of the first specified source file to select the appropriate action from the
-\fIaction\fR
-dictionary\&.
-.sp
-In the following example, the setting of
-\fBsource_ext_match\fR
-prevents
-\fBscons\fR
-from exiting with an error due to the mismatched suffixes of
-\fBfoo\&.in\fR
-and
-\fBfoo\&.extra\fR\&.
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-b = Builder(action={\*(Aq\&.in\*(Aq : \*(Aqbuild $SOURCES > $TARGET\*(Aq},
- source_ext_match = None)
-
-env = Environment(BUILDERS = {\*(AqMyBuild\*(Aq:b})
-env\&.MyBuild(\*(Aqfoo\&.out\*(Aq, [\*(Aqfoo\&.in\*(Aq, \*(Aqfoo\&.extra\*(Aq])
-.fi
-.if n \{\
-.RE
-.\}
-.RE
-.PP
-env
-.RS 4
-A construction environment that can be used to fetch source code using this Builder\&. (Note that this environment is
-\fInot\fR
-used for normal builds of normal target files, which use the environment that was used to call the Builder for the target file\&.)
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-b = Builder(action="build < $SOURCE > $TARGET")
-env = Environment(BUILDERS = {\*(AqMyBuild\*(Aq : b})
-env\&.MyBuild(\*(Aqfoo\&.out\*(Aq, \*(Aqfoo\&.in\*(Aq, my_arg = \*(Aqxyzzy\*(Aq)
-.fi
-.if n \{\
-.RE
-.\}
-.RE
-.PP
-chdir
-.RS 4
-A directory from which scons will execute the action(s) specified for this Builder\&. If the
-\fBchdir\fR
-argument is a string or a directory Node, scons will change to the specified directory\&. If the
-\fBchdir\fR
-is not a string or Node and is non\-zero, then scons will change to the target file\*(Aqs directory\&.
-.sp
-Note that scons will
-\fInot\fR
-automatically modify its expansion of construction variables like
-\fB$TARGET\fR
-and
-\fB$SOURCE\fR
-when using the chdir keyword argument\-\-that is, the expanded file names will still be relative to the top\-level SConstruct directory, and consequently incorrect relative to the chdir directory\&. Builders created using chdir keyword argument, will need to use construction variable expansions like
-\fB${TARGET\&.file}\fR
-and
-\fB${SOURCE\&.file}\fR
-to use just the filename portion of the targets and source\&.
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-b = Builder(action="build < ${SOURCE\&.file} > ${TARGET\&.file}",
- chdir=1)
-env = Environment(BUILDERS = {\*(AqMyBuild\*(Aq : b})
-env\&.MyBuild(\*(Aqsub/dir/foo\&.out\*(Aq, \*(Aqsub/dir/foo\&.in\*(Aq)
-.fi
-.if n \{\
-.RE
-.\}
-.sp
-\fBWARNING:\fR
-Python only keeps one current directory location for all of the threads\&. This means that use of the
-\fBchdir\fR
-argument will
-\fInot\fR
-work with the SCons
-\fB\-j\fR
-option, because individual worker threads spawned by SCons interfere with each other when they start changing directory\&.
-.RE
-.PP
-Any additional keyword arguments supplied when a Builder object is created (that is, when the Builder() function is called) will be set in the executing construction environment when the Builder object is called\&. The canonical example here would be to set a construction variable to the repository of a source code system\&.
-.PP
-Any additional keyword arguments supplied when a Builder
-\fIobject\fR
-is called will only be associated with the target created by that particular Builder call (and any other files built as a result of the call)\&.
-.PP
-These extra keyword arguments are passed to the following functions: command generator functions, function Actions, and emitter functions\&.
-.SS "Action Objects"
-.PP
-The
-\fBBuilder\fR() function will turn its
-\fBaction\fR
-keyword argument into an appropriate internal Action object\&. You can also explicitly create Action objects using the
-\fBAction\fR() global function, which can then be passed to the
-\fBBuilder\fR() function\&. This can be used to configure an Action object more flexibly, or it may simply be more efficient than letting each separate Builder object create a separate Action when multiple Builder objects need to do the same thing\&.
-.PP
-The
-\fBAction\fR() global function returns an appropriate object for the action represented by the type of the first argument:
-.PP
-Action
-.RS 4
-If the first argument is already an Action object, the object is simply returned\&.
-.RE
-.PP
-String
-.RS 4
-If the first argument is a string, a command\-line Action is returned\&. Note that the command\-line string may be preceded by an
-\fB@\fR
-(at\-sign) to suppress printing of the specified command line, or by a
-\fB\-\fR
-(hyphen) to ignore the exit status from the specified command:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-Action(\*(Aq$CC \-c \-o $TARGET $SOURCES\*(Aq)
-
-# Doesn\*(Aqt print the line being executed\&.
-Action(\*(Aq@build $TARGET $SOURCES\*(Aq)
-
-# Ignores return value
-Action(\*(Aq\-build $TARGET $SOURCES\*(Aq)
-.fi
-.if n \{\
-.RE
-.\}
-.RE
-.PP
-List
-.RS 4
-If the first argument is a list, then a list of Action objects is returned\&. An Action object is created as necessary for each element in the list\&. If an element
-\fIwithin\fR
-the list is itself a list, the internal list is the command and arguments to be executed via the command line\&. This allows white space to be enclosed in an argument by defining a command in a list within a list:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-Action([[\*(Aqcc\*(Aq, \*(Aq\-c\*(Aq, \*(Aq\-DWHITE SPACE\*(Aq, \*(Aq\-o\*(Aq, \*(Aq$TARGET\*(Aq, \*(Aq$SOURCES\*(Aq]])
-.fi
-.if n \{\
-.RE
-.\}
-.RE
-.PP
-Function
-.RS 4
-If the first argument is a Python function, a function Action is returned\&. The Python function must take three keyword arguments,
-\fBtarget\fR
-(a Node object representing the target file),
-\fBsource\fR
-(a Node object representing the source file) and
-\fBenv\fR
-(the construction environment used for building the target file)\&. The
-\fBtarget\fR
-and
-\fBsource\fR
-arguments may be lists of Node objects if there is more than one target file or source file\&. The actual target and source file name(s) may be retrieved from their Node objects via the built\-in Python str() function:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-target_file_name = str(target)
-source_file_names = map(lambda x: str(x), source)
-.fi
-.if n \{\
-.RE
-.\}
-.sp
-The function should return
-0
-or
-\fBNone\fR
-to indicate a successful build of the target file(s)\&. The function may raise an exception or return a non\-zero exit status to indicate an unsuccessful build\&.
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-def build_it(target = None, source = None, env = None):
- # build the target from the source
- return 0
-
-a = Action(build_it)
-.fi
-.if n \{\
-.RE
-.\}
-.sp
-If the action argument is not one of the above, None is returned\&.
-.RE
-.PP
-The second argument is optional and is used to define the output which is printed when the Action is actually performed\&. In the absence of this parameter, or if it\*(Aqs an empty string, a default output depending on the type of the action is used\&. For example, a command\-line action will print the executed command\&. The argument must be either a Python function or a string\&.
-.PP
-In the first case, it\*(Aqs a function that returns a string to be printed to describe the action being executed\&. The function may also be specified by the
-\fIstrfunction\fR= keyword argument\&. Like a function to build a file, this function must take three keyword arguments:
-\fBtarget\fR
-(a Node object representing the target file),
-\fBsource\fR
-(a Node object representing the source file) and
-\fBenv\fR
-(a construction environment)\&. The
-\fBtarget\fR
-and
-\fBsource\fR
-arguments may be lists of Node objects if there is more than one target file or source file\&.
-.PP
-In the second case, you provide the string itself\&. The string may also be specified by the
-\fIcmdstr\fR= keyword argument\&. The string typically contains variables, notably $TARGET(S) and $SOURCE(S), or consists of just a single variable, which is optionally defined somewhere else\&. SCons itself heavily uses the latter variant\&.
-.PP
-Examples:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-def build_it(target, source, env):
- # build the target from the source
- return 0
-
-def string_it(target, source, env):
- return "building \*(Aq%s\*(Aq from \*(Aq%s\*(Aq" % (target[0], source[0])
-
-# Use a positional argument\&.
-f = Action(build_it, string_it)
-s = Action(build_it, "building \*(Aq$TARGET\*(Aq from \*(Aq$SOURCE\*(Aq")
-
-# Alternatively, use a keyword argument\&.
-f = Action(build_it, strfunction=string_it)
-s = Action(build_it, cmdstr="building \*(Aq$TARGET\*(Aq from \*(Aq$SOURCE\*(Aq")
-
-# You can provide a configurable variable\&.
-l = Action(build_it, \*(Aq$STRINGIT\*(Aq)
-.fi
-.if n \{\
-.RE
-.\}
-.PP
-The third and succeeding arguments, if present, may either be a construction variable or a list of construction variables whose values will be included in the signature of the Action when deciding whether a target should be rebuilt because the action changed\&. The variables may also be specified by a
-\fIvarlist\fR= keyword parameter; if both are present, they are combined\&. This is necessary whenever you want a target to be rebuilt when a specific construction variable changes\&. This is not often needed for a string action, as the expanded variables will normally be part of the command line, but may be needed if a Python function action uses the value of a construction variable when generating the command line\&.
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-def build_it(target, source, env):
- # build the target from the \*(AqXXX\*(Aq construction variable
- open(target[0], \*(Aqw\*(Aq)\&.write(env[\*(AqXXX\*(Aq])
- return 0
-
-# Use positional arguments\&.
-a = Action(build_it, \*(Aq$STRINGIT\*(Aq, [\*(AqXXX\*(Aq])
-
-# Alternatively, use a keyword argument\&.
-a = Action(build_it, varlist=[\*(AqXXX\*(Aq])
-.fi
-.if n \{\
-.RE
-.\}
-.PP
-The
-\fBAction\fR() global function can be passed the following optional keyword arguments to modify the Action object\*(Aqs behavior:
-.PP
-\fBchdir\fR
-The
-\fBchdir\fR
-keyword argument specifies that scons will execute the action after changing to the specified directory\&. If the
-\fBchdir\fR
-argument is a string or a directory Node, scons will change to the specified directory\&. If the
-\fBchdir\fR
-argument is not a string or Node and is non\-zero, then scons will change to the target file\*(Aqs directory\&.
-.PP
-Note that scons will
-\fInot\fR
-automatically modify its expansion of construction variables like
-\fB$TARGET\fR
-and
-\fB$SOURCE\fR
-when using the chdir keyword argument\-\-that is, the expanded file names will still be relative to the top\-level SConstruct directory, and consequently incorrect relative to the chdir directory\&. Builders created using chdir keyword argument, will need to use construction variable expansions like
-\fB${TARGET\&.file}\fR
-and
-\fB${SOURCE\&.file}\fR
-to use just the filename portion of the targets and source\&.
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-a = Action("build < ${SOURCE\&.file} > ${TARGET\&.file}",
- chdir=1)
-.fi
-.if n \{\
-.RE
-.\}
-.PP
-\fBexitstatfunc\fR
-The
-\fBAction\fR() global function also takes an
-\fBexitstatfunc\fR
-keyword argument which specifies a function that is passed the exit status (or return value) from the specified action and can return an arbitrary or modified value\&. This can be used, for example, to specify that an Action object\*(Aqs return value should be ignored under special conditions and SCons should, therefore, consider that the action always suceeds:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-def always_succeed(s):
- # Always return 0, which indicates success\&.
- return 0
-a = Action("build < ${SOURCE\&.file} > ${TARGET\&.file}",
- exitstatfunc=always_succeed)
-.fi
-.if n \{\
-.RE
-.\}
-.PP
-\fBbatch_key\fR
-The
-\fBbatch_key\fR
-keyword argument can be used to specify that the Action can create multiple target files by processing multiple independent source files simultaneously\&. (The canonical example is "batch compilation" of multiple object files by passing multiple source files to a single invocation of a compiler such as Microsoft\*(Aqs Visual C / C++ compiler\&.) If the
-\fBbatch_key\fR
-argument is any non\-False, non\-callable Python value, the configured Action object will cause
-\fBscons\fR
-to collect all targets built with the Action object and configured with the same construction environment into single invocations of the Action object\*(Aqs command line or function\&. Command lines will typically want to use the
-\fBCHANGED_SOURCES\fR
-construction variable (and possibly
-\fBCHANGED_TARGETS\fR
-as well) to only pass to the command line those sources that have actually changed since their targets were built\&.
-.PP
-Example:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-a = Action(\*(Aqbuild $CHANGED_SOURCES\*(Aq, batch_key=True)
-.fi
-.if n \{\
-.RE
-.\}
-.PP
-The
-\fBbatch_key\fR
-argument may also be a callable function that returns a key that will be used to identify different "batches" of target files to be collected for batch building\&. A
-\fBbatch_key\fR
-function must take the following arguments:
-.PP
-action
-.RS 4
-The action object\&.
-.RE
-.PP
-env
-.RS 4
-The construction environment configured for the target\&.
-.RE
-.PP
-target
-.RS 4
-The list of targets for a particular configured action\&.
-.RE
-.PP
-source
-.RS 4
-The list of source for a particular configured action\&.
-.sp
-The returned key should typically be a tuple of values derived from the arguments, using any appropriate logic to decide how multiple invocations should be batched\&. For example, a
-\fBbatch_key\fR
-function may decide to return the value of a specific construction variable from the
-\fBenv\fR
-argument which will cause
-\fBscons\fR
-to batch\-build targets with matching values of that variable, or perhaps return the
-\fBid\fR() of the entire construction environment, in which case
-\fBscons\fR
-will batch\-build all targets configured with the same construction environment\&. Returning
-\fBNone\fR
-indicates that the particular target should
-\fInot\fR
-be part of any batched build, but instead will be built by a separate invocation of action\*(Aqs command or function\&. Example:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-def batch_key(action, env, target, source):
- tdir = target[0]\&.dir
- if tdir\&.name == \*(Aqspecial\*(Aq:
- # Don\*(Aqt batch\-build any target
- # in the special/ subdirectory\&.
- return None
- return (id(action), id(env), tdir)
-a = Action(\*(Aqbuild $CHANGED_SOURCES\*(Aq, batch_key=batch_key)
-.fi
-.if n \{\
-.RE
-.\}
-.RE
-.SS "Miscellaneous Action Functions"
-.PP
-\fBscons\fR
-supplies a number of functions that arrange for various common file and directory manipulations to be performed\&. These are similar in concept to "tasks" in the Ant build tool, although the implementation is slightly different\&. These functions do not actually perform the specified action at the time the function is called, but instead return an Action object that can be executed at the appropriate time\&. (In Object\-Oriented terminology, these are actually Action
-\fIFactory\fR
-functions that return Action objects\&.)
-.PP
-In practice, there are two natural ways that these Action Functions are intended to be used\&.
-.PP
-First, if you need to perform the action at the time the SConscript file is being read, you can use the
-\fBExecute\fR
-global function to do so:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-Execute(Touch(\*(Aqfile\*(Aq))
-.fi
-.if n \{\
-.RE
-.\}
-.PP
-Second, you can use these functions to supply Actions in a list for use by the
-\fBCommand\fR
-method\&. This can allow you to perform more complicated sequences of file manipulation without relying on platform\-specific external commands: that
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-env = Environment(TMPBUILD = \*(Aq/tmp/builddir\*(Aq)
-env\&.Command(\*(Aqfoo\&.out\*(Aq, \*(Aqfoo\&.in\*(Aq,
- [Mkdir(\*(Aq$TMPBUILD\*(Aq),
- Copy(\*(Aq$TMPBUILD\*(Aq, \*(Aq${SOURCE\&.dir}\*(Aq),
- "cd $TMPBUILD && make",
- Delete(\*(Aq$TMPBUILD\*(Aq)])
-.fi
-.if n \{\
-.RE
-.\}
-.PP
-Chmod(\fIdest\fR, \fImode\fR)
-.RS 4
-Returns an Action object that changes the permissions on the specified
-\fIdest\fR
-file or directory to the specified
-\fImode\fR\&. Examples:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-Execute(Chmod(\*(Aqfile\*(Aq, 0755))
-
-env\&.Command(\*(Aqfoo\&.out\*(Aq, \*(Aqfoo\&.in\*(Aq,
- [Copy(\*(Aq$TARGET\*(Aq, \*(Aq$SOURCE\*(Aq),
- Chmod(\*(Aq$TARGET\*(Aq, 0755)])
-.fi
-.if n \{\
-.RE
-.\}
-.RE
-.PP
-Copy(\fIdest\fR, \fIsrc\fR)
-.RS 4
-Returns an Action object that will copy the
-\fIsrc\fR
-source file or directory to the
-\fIdest\fR
-destination file or directory\&. Examples:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-Execute(Copy(\*(Aqfoo\&.output\*(Aq, \*(Aqfoo\&.input\*(Aq))
-
-env\&.Command(\*(Aqbar\&.out\*(Aq, \*(Aqbar\&.in\*(Aq,
- Copy(\*(Aq$TARGET\*(Aq, \*(Aq$SOURCE\*(Aq))
-.fi
-.if n \{\
-.RE
-.\}
-.RE
-.PP
-Delete(\fIentry\fR, [\fImust_exist\fR])
-.RS 4
-Returns an Action that deletes the specified
-\fIentry\fR, which may be a file or a directory tree\&. If a directory is specified, the entire directory tree will be removed\&. If the
-\fImust_exist\fR
-flag is set, then a Python error will be thrown if the specified entry does not exist; the default is
-\fBmust_exist=0\fR, that is, the Action will silently do nothing if the entry does not exist\&. Examples:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-Execute(Delete(\*(Aq/tmp/buildroot\*(Aq))
-
-env\&.Command(\*(Aqfoo\&.out\*(Aq, \*(Aqfoo\&.in\*(Aq,
- [Delete(\*(Aq${TARGET\&.dir}\*(Aq),
- MyBuildAction])
-
-Execute(Delete(\*(Aqfile_that_must_exist\*(Aq, must_exist=1))
-.fi
-.if n \{\
-.RE
-.\}
-.RE
-.PP
-Mkdir(\fIdir\fR)
-.RS 4
-Returns an Action that creates the specified directory
-\fIdir \&.\fR
-Examples:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-Execute(Mkdir(\*(Aq/tmp/outputdir\*(Aq))
-
-env\&.Command(\*(Aqfoo\&.out\*(Aq, \*(Aqfoo\&.in\*(Aq,
- [Mkdir(\*(Aq/tmp/builddir\*(Aq),
- Copy(\*(Aq/tmp/builddir/foo\&.in\*(Aq, \*(Aq$SOURCE\*(Aq),
- "cd /tmp/builddir && make",
- Copy(\*(Aq$TARGET\*(Aq, \*(Aq/tmp/builddir/foo\&.out\*(Aq)])
-.fi
-.if n \{\
-.RE
-.\}
-.RE
-.PP
-Move(\fIdest\fR, \fIsrc\fR)
-.RS 4
-Returns an Action that moves the specified
-\fIsrc\fR
-file or directory to the specified
-\fIdest\fR
-file or directory\&. Examples:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-Execute(Move(\*(Aqfile\&.destination\*(Aq, \*(Aqfile\&.source\*(Aq))
-
-env\&.Command(\*(Aqoutput_file\*(Aq, \*(Aqinput_file\*(Aq,
- [MyBuildAction,
- Move(\*(Aq$TARGET\*(Aq, \*(Aqfile_created_by_MyBuildAction\*(Aq)])
-.fi
-.if n \{\
-.RE
-.\}
-.RE
-.PP
-Touch(\fIfile\fR)
-.RS 4
-Returns an Action that updates the modification time on the specified
-\fIfile\fR\&. Examples:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-Execute(Touch(\*(Aqfile_to_be_touched\*(Aq))
-
-env\&.Command(\*(Aqmarker\*(Aq, \*(Aqinput_file\*(Aq,
- [MyBuildAction,
- Touch(\*(Aq$TARGET\*(Aq)])
-.fi
-.if n \{\
-.RE
-.\}
-.RE
-.SS "Variable Substitution"
-.PP
-Before executing a command,
-\fBscons\fR
-performs construction variable interpolation on the strings that make up the command line of builders\&. Variables are introduced by a
-\fB$\fR
-prefix\&. Besides construction variables, scons provides the following variables for each command execution:
-.PP
-CHANGED_SOURCES
-.RS 4
-The file names of all sources of the build command that have changed since the target was last built\&.
-.RE
-.PP
-CHANGED_TARGETS
-.RS 4
-The file names of all targets that would be built from sources that have changed since the target was last built\&.
-.RE
-.PP
-SOURCE
-.RS 4
-The file name of the source of the build command, or the file name of the first source if multiple sources are being built\&.
-.RE
-.PP
-SOURCES
-.RS 4
-The file names of the sources of the build command\&.
-.RE
-.PP
-TARGET
-.RS 4
-The file name of the target being built, or the file name of the first target if multiple targets are being built\&.
-.RE
-.PP
-TARGETS
-.RS 4
-The file names of all targets being built\&.
-.RE
-.PP
-UNCHANGED_SOURCES
-.RS 4
-The file names of all sources of the build command that have
-\fInot\fR
-changed since the target was last built\&.
-.RE
-.PP
-UNCHANGED_TARGETS
-.RS 4
-The file names of all targets that would be built from sources that have
-\fInot\fR
-changed since the target was last built\&.
-.sp
-(Note that the above variables are reserved and may not be set in a construction environment\&.)
-.RE
-.PP
-For example, given the construction variable CC=\*(Aqcc\*(Aq, targets=[\*(Aqfoo\*(Aq], and sources=[\*(Aqfoo\&.c\*(Aq, \*(Aqbar\&.c\*(Aq]:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-action=\*(Aq$CC \-c \-o $TARGET $SOURCES\*(Aq
-.fi
-.if n \{\
-.RE
-.\}
-.PP
-would produce the command line:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-cc \-c \-o foo foo\&.c bar\&.c
-.fi
-.if n \{\
-.RE
-.\}
-.PP
-Variable names may be surrounded by curly braces ({}) to separate the name from the trailing characters\&. Within the curly braces, a variable name may have a Python slice subscript appended to select one or more items from a list\&. In the previous example, the string:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-${SOURCES[1]}
-.fi
-.if n \{\
-.RE
-.\}
-.PP
-would produce:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-bar\&.c
-.fi
-.if n \{\
-.RE
-.\}
-.PP
-Additionally, a variable name may have the following special modifiers appended within the enclosing curly braces to modify the interpolated string:
-.PP
-base
-.RS 4
-The base path of the file name, including the directory path but excluding any suffix\&.
-.RE
-.PP
-dir
-.RS 4
-The name of the directory in which the file exists\&.
-.RE
-.PP
-file
-.RS 4
-The file name, minus any directory portion\&.
-.RE
-.PP
-filebase
-.RS 4
-Just the basename of the file, minus any suffix and minus the directory\&.
-.RE
-.PP
-suffix
-.RS 4
-Just the file suffix\&.
-.RE
-.PP
-abspath
-.RS 4
-The absolute path name of the file\&.
-.RE
-.PP
-posix
-.RS 4
-The POSIX form of the path, with directories separated by
-\fB/\fR
-(forward slashes) not backslashes\&. This is sometimes necessary on Windows systems when a path references a file on other (POSIX) systems\&.
-.RE
-.PP
-srcpath
-.RS 4
-The directory and file name to the source file linked to this file through
-\fBVariantDir\fR()\&. If this file isn\*(Aqt linked, it just returns the directory and filename unchanged\&.
-.RE
-.PP
-srcdir
-.RS 4
-The directory containing the source file linked to this file through
-\fBVariantDir\fR()\&. If this file isn\*(Aqt linked, it just returns the directory part of the filename\&.
-.RE
-.PP
-rsrcpath
-.RS 4
-The directory and file name to the source file linked to this file through
-\fBVariantDir\fR()\&. If the file does not exist locally but exists in a Repository, the path in the Repository is returned\&. If this file isn\*(Aqt linked, it just returns the directory and filename unchanged\&.
-.RE
-.PP
-rsrcdir
-.RS 4
-The Repository directory containing the source file linked to this file through
-\fBVariantDir\fR()\&. If this file isn\*(Aqt linked, it just returns the directory part of the filename\&.
-.RE
-.PP
-For example, the specified target will expand as follows for the corresponding modifiers:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-$TARGET => sub/dir/file\&.x
-${TARGET\&.base} => sub/dir/file
-${TARGET\&.dir} => sub/dir
-${TARGET\&.file} => file\&.x
-${TARGET\&.filebase} => file
-${TARGET\&.suffix} => \&.x
-${TARGET\&.abspath} => /top/dir/sub/dir/file\&.x
-
-SConscript(\*(Aqsrc/SConscript\*(Aq, variant_dir=\*(Aqsub/dir\*(Aq)
-$SOURCE => sub/dir/file\&.x
-${SOURCE\&.srcpath} => src/file\&.x
-${SOURCE\&.srcdir} => src
-
-Repository(\*(Aq/usr/repository\*(Aq)
-$SOURCE => sub/dir/file\&.x
-${SOURCE\&.rsrcpath} => /usr/repository/src/file\&.x
-${SOURCE\&.rsrcdir} => /usr/repository/src
-.fi
-.if n \{\
-.RE
-.\}
-.PP
-Note that curly braces braces may also be used to enclose arbitrary Python code to be evaluated\&. (In fact, this is how the above modifiers are substituted, they are simply attributes of the Python objects that represent TARGET, SOURCES, etc\&.) See the section "Python Code Substitution" below, for more thorough examples of how this can be used\&.
-.PP
-Lastly, a variable name may be a callable Python function associated with a construction variable in the environment\&. The function should take four arguments:
-\fItarget\fR
-\- a list of target nodes,
-\fIsource\fR
-\- a list of source nodes,
-\fIenv\fR
-\- the construction environment,
-\fIfor_signature\fR
-\- a Boolean value that specifies whether the function is being called for generating a build signature\&. SCons will insert whatever the called function returns into the expanded string:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-def foo(target, source, env, for_signature):
- return "bar"
-
-# Will expand $BAR to "bar baz"
-env=Environment(FOO=foo, BAR="$FOO baz")
-.fi
-.if n \{\
-.RE
-.\}
-.PP
-You can use this feature to pass arguments to a Python function by creating a callable class that stores one or more arguments in an object, and then uses them when the
-\fB__call__()\fR
-method is called\&. Note that in this case, the entire variable expansion must be enclosed by curly braces so that the arguments will be associated with the instantiation of the class:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-class foo(object):
- def __init__(self, arg):
- self\&.arg = arg
-
- def __call__(self, target, source, env, for_signature):
- return self\&.arg + " bar"
-
-# Will expand $BAR to "my argument bar baz"
-env=Environment(FOO=foo, BAR="${FOO(\*(Aqmy argument\*(Aq)} baz")
-.fi
-.if n \{\
-.RE
-.\}
-.PP
-The special pseudo\-variables
-\fB$(\fR
-and
-\fB$)\fR
-may be used to surround parts of a command line that may change
-\fIwithout\fR
-causing a rebuild\-\-that is, which are not included in the signature of target files built with this command\&. All text between
-\fB$(\fR
-and
-\fB$)\fR
-will be removed from the command line before it is added to file signatures, and the
-\fB$(\fR
-and
-\fB$)\fR
-will be removed before the command is executed\&. For example, the command line:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-echo Last build occurred $( $TODAY $)\&. > $TARGET
-.fi
-.if n \{\
-.RE
-.\}
-.PP
-would execute the command:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-echo Last build occurred $TODAY\&. > $TARGET
-.fi
-.if n \{\
-.RE
-.\}
-.PP
-but the command signature added to any target files would be:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-echo Last build occurred \&. > $TARGET
-.fi
-.if n \{\
-.RE
-.\}
-.SS "Python Code Substitution"
-.PP
-Any python code within
-\fB${\fR\-\fB}\fR
-pairs gets evaluated by python \*(Aqeval\*(Aq, with the python globals set to the current environment\*(Aqs set of construction variables\&. So in the following case:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-env[\*(AqCOND\*(Aq] = 0
-env\&.Command(\*(Aqfoo\&.out\*(Aq, \*(Aqfoo\&.in\*(Aq,
- \*(Aq\*(Aq\*(Aqecho ${COND==1 and \*(AqFOO\*(Aq or \*(AqBAR\*(Aq} > $TARGET\*(Aq\*(Aq\*(Aq)
-.fi
-.if n \{\
-.RE
-.\}
-.PP
-the command executed will be either
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-echo FOO > foo\&.out
-.fi
-.if n \{\
-.RE
-.\}
-.PP
-or
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-echo BAR > foo\&.out
-.fi
-.if n \{\
-.RE
-.\}
-.PP
-according to the current value of env[\*(AqCOND\*(Aq] when the command is executed\&. The evaluation occurs when the target is being built, not when the SConscript is being read\&. So if env[\*(AqCOND\*(Aq] is changed later in the SConscript, the final value will be used\&.
-.PP
-Here\*(Aqs a more interesting example\&. Note that all of COND, FOO, and BAR are environment variables, and their values are substituted into the final command\&. FOO is a list, so its elements are interpolated separated by spaces\&.
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-env=Environment()
-env[\*(AqCOND\*(Aq] = 0
-env[\*(AqFOO\*(Aq] = [\*(Aqfoo1\*(Aq, \*(Aqfoo2\*(Aq]
-env[\*(AqBAR\*(Aq] = \*(Aqbarbar\*(Aq
-env\&.Command(\*(Aqfoo\&.out\*(Aq, \*(Aqfoo\&.in\*(Aq,
- \*(Aqecho ${COND==1 and FOO or BAR} > $TARGET\*(Aq)
-
-# Will execute this:
-# echo foo1 foo2 > foo\&.out
-.fi
-.if n \{\
-.RE
-.\}
-.PP
-SCons uses the following rules when converting construction variables into command lines:
-.PP
-String
-.RS 4
-When the value is a string it is interpreted as a space delimited list of command line arguments\&.
-.RE
-.PP
-List
-.RS 4
-When the value is a list it is interpreted as a list of command line arguments\&. Each element of the list is converted to a string\&.
-.RE
-.PP
-Other
-.RS 4
-Anything that is not a list or string is converted to a string and interpreted as a single command line argument\&.
-.RE
-.PP
-Newline
-.RS 4
-Newline characters (\en) delimit lines\&. The newline parsing is done after all other parsing, so it is not possible for arguments (e\&.g\&. file names) to contain embedded newline characters\&. This limitation will likely go away in a future version of SCons\&.
-.RE
-.SS "Scanner Objects"
-.PP
-You can use the
-\fBScanner\fR
-function to define objects to scan new file types for implicit dependencies\&. The
-\fBScanner\fR
-function accepts the following arguments:
-.PP
-function
-.RS 4
-This can be either: 1) a Python function that will process the Node (file) and return a list of File Nodes representing the implicit dependencies (file names) found in the contents; or: 2) a dictionary that maps keys (typically the file suffix, but see below for more discussion) to other Scanners that should be called\&.
-.sp
-If the argument is actually a Python function, the function must take three or four arguments:
-.sp
-def scanner_function(node, env, path):
-.sp
-def scanner_function(node, env, path, arg=None):
-.sp
-The
-\fBnode\fR
-argument is the internal SCons node representing the file\&. Use
-\fBstr(node)\fR
-to fetch the name of the file, and
-\fBnode\&.get_contents()\fR
-to fetch contents of the file\&. Note that the file is
-\fInot\fR
-guaranteed to exist before the scanner is called, so the scanner function should check that if there\*(Aqs any chance that the scanned file might not exist (for example, if it\*(Aqs built from other files)\&.
-.sp
-The
-\fBenv\fR
-argument is the construction environment for the scan\&. Fetch values from it using the
-\fBenv\&.Dictionary()\fR
-method\&.
-.sp
-The
-\fBpath\fR
-argument is a tuple (or list) of directories that can be searched for files\&. This will usually be the tuple returned by the
-\fBpath_function\fR
-argument (see below)\&.
-.sp
-The
-\fBarg\fR
-argument is the argument supplied when the scanner was created, if any\&.
-.RE
-.PP
-name
-.RS 4
-The name of the Scanner\&. This is mainly used to identify the Scanner internally\&.
-.RE
-.PP
-argument
-.RS 4
-An optional argument that, if specified, will be passed to the scanner function (described above) and the path function (specified below)\&.
-.RE
-.PP
-skeys
-.RS 4
-An optional list that can be used to determine which scanner should be used for a given Node\&. In the usual case of scanning for file names, this argument will be a list of suffixes for the different file types that this Scanner knows how to scan\&. If the argument is a string, then it will be expanded into a list by the current environment\&.
-.RE
-.PP
-path_function
-.RS 4
-A Python function that takes four or five arguments: a construction environment, a Node for the directory containing the SConscript file in which the first target was defined, a list of target nodes, a list of source nodes, and an optional argument supplied when the scanner was created\&. The
-\fBpath_function\fR
-returns a tuple of directories that can be searched for files to be returned by this Scanner object\&. (Note that the
-\fBFindPathDirs\fR() function can be used to return a ready\-made
-\fBpath_function\fR
-for a given construction variable name, instead of having to write your own function from scratch\&.)
-.RE
-.PP
-node_class
-.RS 4
-The class of Node that should be returned by this Scanner object\&. Any strings or other objects returned by the scanner function that are not of this class will be run through the
-\fBnode_factory\fR
-function\&.
-.RE
-.PP
-node_factory
-.RS 4
-A Python function that will take a string or other object and turn it into the appropriate class of Node to be returned by this Scanner object\&.
-.RE
-.PP
-scan_check
-.RS 4
-An optional Python function that takes two arguments, a Node (file) and a construction environment, and returns whether the Node should, in fact, be scanned for dependencies\&. This check can be used to eliminate unnecessary calls to the scanner function when, for example, the underlying file represented by a Node does not yet exist\&.
-.RE
-.PP
-recursive
-.RS 4
-An optional flag that specifies whether this scanner should be re\-invoked on the dependency files returned by the scanner\&. When this flag is not set, the Node subsystem will only invoke the scanner on the file being scanned, and not (for example) also on the files specified by the #include lines in the file being scanned\&.
-\fIrecursive\fR
-may be a callable function, in which case it will be called with a list of Nodes found and should return a list of Nodes that should be scanned recursively; this can be used to select a specific subset of Nodes for additional scanning\&.
-.RE
-.PP
-Note that
-\fBscons\fR
-has a global
-\fBSourceFileScanner\fR
-object that is used by the
-\fBObject\fR(),
-\fBSharedObject\fR(), and
-\fBStaticObject\fR() builders to decide which scanner should be used for different file extensions\&. You can using the
-\fBSourceFileScanner\&.add_scanner\fR() method to add your own Scanner object to the
-\fBscons\fR
-infrastructure that builds target programs or libraries from a list of source files of different types:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-def xyz_scan(node, env, path):
- contents = node\&.get_text_contents()
- # Scan the contents and return the included files\&.
-
-XYZScanner = Scanner(xyz_scan)
-
-SourceFileScanner\&.add_scanner(\*(Aq\&.xyz\*(Aq, XYZScanner)
-
-env\&.Program(\*(Aqmy_prog\*(Aq, [\*(Aqfile1\&.c\*(Aq, \*(Aqfile2\&.f\*(Aq, \*(Aqfile3\&.xyz\*(Aq])
-.fi
-.if n \{\
-.RE
-.\}
-.SH "SYSTEM-SPECIFIC BEHAVIOR"
-.PP
-SCons and its configuration files are very portable, due largely to its implementation in Python\&. There are, however, a few portability issues waiting to trap the unwary\&.
-.SS "\&.C file suffix"
-.PP
-SCons handles the upper\-case
-\fB\&.C\fR
-file suffix differently, depending on the capabilities of the underlying system\&. On a case\-sensitive system such as Linux or UNIX, SCons treats a file with a
-\fB\&.C\fR
-suffix as a C++ source file\&. On a case\-insensitive system such as Windows, SCons treats a file with a
-\fB\&.C\fR
-suffix as a C source file\&.
-.SS "\&.F file suffix"
-.PP
-SCons handles the upper\-case
-\fB\&.F\fR
-file suffix differently, depending on the capabilities of the underlying system\&. On a case\-sensitive system such as Linux or UNIX, SCons treats a file with a
-\fB\&.F\fR
-suffix as a Fortran source file that is to be first run through the standard C preprocessor\&. On a case\-insensitive system such as Windows, SCons treats a file with a
-\fB\&.F\fR
-suffix as a Fortran source file that should
-\fInot\fR
-be run through the C preprocessor\&.
-.SS "Windows: Cygwin Tools and Cygwin Python vs\&. Windows Pythons"
-.PP
-Cygwin supplies a set of tools and utilities that let users work on a Windows system using a more POSIX\-like environment\&. The Cygwin tools, including Cygwin Python, do this, in part, by sharing an ability to interpret UNIX\-like path names\&. For example, the Cygwin tools will internally translate a Cygwin path name like /cygdrive/c/mydir to an equivalent Windows pathname of C:/mydir (equivalent to C:\emydir)\&.
-.PP
-Versions of Python that are built for native Windows execution, such as the python\&.org and ActiveState versions, do not have the Cygwin path name semantics\&. This means that using a native Windows version of Python to build compiled programs using Cygwin tools (such as gcc, bison, and flex) may yield unpredictable results\&. "Mixing and matching" in this way can be made to work, but it requires careful attention to the use of path names in your SConscript files\&.
-.PP
-In practice, users can sidestep the issue by adopting the following rules: When using gcc, use the Cygwin\-supplied Python interpreter to run SCons; when using Microsoft Visual C/C++ (or some other Windows compiler) use the python\&.org or ActiveState version of Python to run SCons\&.
-.SS "Windows: scons\&.bat file"
-.PP
-On Windows systems, SCons is executed via a wrapper
-\fBscons\&.bat\fR
-file\&. This has (at least) two ramifications:
-.PP
-First, Windows command\-line users that want to use variable assignment on the command line may have to put double quotes around the assignments:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-scons "FOO=BAR" "BAZ=BLEH"
-.fi
-.if n \{\
-.RE
-.\}
-.PP
-Second, the Cygwin shell does not recognize this file as being the same as an
-\fBscons\fR
-command issued at the command\-line prompt\&. You can work around this either by executing
-\fBscons\&.bat\fR
-from the Cygwin command line, or by creating a wrapper shell script named
-\fBscons \&.\fR
-.SS "MinGW"
-.PP
-The MinGW bin directory must be in your PATH environment variable or the PATH variable under the ENV construction variable for SCons to detect and use the MinGW tools\&. When running under the native Windows Python interpreter, SCons will prefer the MinGW tools over the Cygwin tools, if they are both installed, regardless of the order of the bin directories in the PATH variable\&. If you have both MSVC and MinGW installed and you want to use MinGW instead of MSVC, then you must explicitly tell SCons to use MinGW by passing
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-tools=[\*(Aqmingw\*(Aq]
-.fi
-.if n \{\
-.RE
-.\}
-.PP
-to the Environment() function, because SCons will prefer the MSVC tools over the MinGW tools\&.
-.SH "EXAMPLES"
-.PP
-To help you get started using SCons, this section contains a brief overview of some common tasks\&.
-.SS "Basic Compilation From a Single Source File"
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-env = Environment()
-env\&.Program(target = \*(Aqfoo\*(Aq, source = \*(Aqfoo\&.c\*(Aq)
-.fi
-.if n \{\
-.RE
-.\}
-.PP
-Note: Build the file by specifying the target as an argument ("scons foo" or "scons foo\&.exe")\&. or by specifying a dot ("scons \&.")\&.
-.SS "Basic Compilation From Multiple Source Files"
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-env = Environment()
-env\&.Program(target = \*(Aqfoo\*(Aq, source = Split(\*(Aqf1\&.c f2\&.c f3\&.c\*(Aq))
-.fi
-.if n \{\
-.RE
-.\}
-.SS "Setting a Compilation Flag"
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-env = Environment(CCFLAGS = \*(Aq\-g\*(Aq)
-env\&.Program(target = \*(Aqfoo\*(Aq, source = \*(Aqfoo\&.c\*(Aq)
-.fi
-.if n \{\
-.RE
-.\}
-.SS "Search The Local Directory For \&.h Files"
-.PP
-Note: You do
-\fInot\fR
-need to set CCFLAGS to specify \-I options by hand\&. SCons will construct the right \-I options from CPPPATH\&.
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-env = Environment(CPPPATH = [\*(Aq\&.\*(Aq])
-env\&.Program(target = \*(Aqfoo\*(Aq, source = \*(Aqfoo\&.c\*(Aq)
-.fi
-.if n \{\
-.RE
-.\}
-.SS "Search Multiple Directories For \&.h Files"
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-env = Environment(CPPPATH = [\*(Aqinclude1\*(Aq, \*(Aqinclude2\*(Aq])
-env\&.Program(target = \*(Aqfoo\*(Aq, source = \*(Aqfoo\&.c\*(Aq)
-.fi
-.if n \{\
-.RE
-.\}
-.SS "Building a Static Library"
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-env = Environment()
-env\&.StaticLibrary(target = \*(Aqfoo\*(Aq, source = Split(\*(Aql1\&.c l2\&.c\*(Aq))
-env\&.StaticLibrary(target = \*(Aqbar\*(Aq, source = [\*(Aql3\&.c\*(Aq, \*(Aql4\&.c\*(Aq])
-.fi
-.if n \{\
-.RE
-.\}
-.SS "Building a Shared Library"
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-env = Environment()
-env\&.SharedLibrary(target = \*(Aqfoo\*(Aq, source = [\*(Aql5\&.c\*(Aq, \*(Aql6\&.c\*(Aq])
-env\&.SharedLibrary(target = \*(Aqbar\*(Aq, source = Split(\*(Aql7\&.c l8\&.c\*(Aq))
-.fi
-.if n \{\
-.RE
-.\}
-.SS "Linking a Local Library Into a Program"
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-env = Environment(LIBS = \*(Aqmylib\*(Aq, LIBPATH = [\*(Aq\&.\*(Aq])
-env\&.Library(target = \*(Aqmylib\*(Aq, source = Split(\*(Aql1\&.c l2\&.c\*(Aq))
-env\&.Program(target = \*(Aqprog\*(Aq, source = [\*(Aqp1\&.c\*(Aq, \*(Aqp2\&.c\*(Aq])
-.fi
-.if n \{\
-.RE
-.\}
-.SS "Defining Your Own Builder Object"
-.PP
-Notice that when you invoke the Builder, you can leave off the target file suffix, and SCons will add it automatically\&.
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-bld = Builder(action = \*(Aqpdftex < $SOURCES > $TARGET\*(Aq
- suffix = \*(Aq\&.pdf\*(Aq,
- src_suffix = \*(Aq\&.tex\*(Aq)
-env = Environment(BUILDERS = {\*(AqPDFBuilder\*(Aq : bld})
-env\&.PDFBuilder(target = \*(Aqfoo\&.pdf\*(Aq, source = \*(Aqfoo\&.tex\*(Aq)
-
-# The following creates "bar\&.pdf" from "bar\&.tex"
-env\&.PDFBuilder(target = \*(Aqbar\*(Aq, source = \*(Aqbar\*(Aq)
-.fi
-.if n \{\
-.RE
-.\}
-.PP
-Note also that the above initialization overwrites the default Builder objects, so the Environment created above can not be used call Builders like env\&.Program(), env\&.Object(), env\&.StaticLibrary(), etc\&.
-.SS "Adding Your Own Builder Object to an Environment"
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-bld = Builder(action = \*(Aqpdftex < $SOURCES > $TARGET\*(Aq
- suffix = \*(Aq\&.pdf\*(Aq,
- src_suffix = \*(Aq\&.tex\*(Aq)
-env = Environment()
-env\&.Append(BUILDERS = {\*(AqPDFBuilder\*(Aq : bld})
-env\&.PDFBuilder(target = \*(Aqfoo\&.pdf\*(Aq, source = \*(Aqfoo\&.tex\*(Aq)
-env\&.Program(target = \*(Aqbar\*(Aq, source = \*(Aqbar\&.c\*(Aq)
-.fi
-.if n \{\
-.RE
-.\}
-.PP
-You also can use other Pythonic techniques to add to the BUILDERS construction variable, such as:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-env = Environment()
-env[\*(AqBUILDERS][\*(AqPDFBuilder\*(Aq] = bld
-.fi
-.if n \{\
-.RE
-.\}
-.SS "Defining Your Own Scanner Object"
-.PP
-The following example shows an extremely simple scanner (the
-\fBkfile_scan\fR() function) that doesn\*(Aqt use a search path at all and simply returns the file names present on any
-\fBinclude\fR
-lines in the scanned file\&. This would implicitly assume that all included files live in the top\-level directory:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-import re
-
-include_re = re\&.compile(r\*(Aq^include\es+(\eS+)$\*(Aq, re\&.M)
-
-def kfile_scan(node, env, path, arg):
- contents = node\&.get_text_contents()
- includes = include_re\&.findall(contents)
- return env\&.File(includes)
-
-kscan = Scanner(name = \*(Aqkfile\*(Aq,
- function = kfile_scan,
- argument = None,
- skeys = [\*(Aq\&.k\*(Aq])
-scanners = Environment()\&.Dictionary(\*(AqSCANNERS\*(Aq)
-env = Environment(SCANNERS = scanners + [kscan])
-
-env\&.Command(\*(Aqfoo\*(Aq, \*(Aqfoo\&.k\*(Aq, \*(Aqkprocess < $SOURCES > $TARGET\*(Aq)
-
-bar_in = File(\*(Aqbar\&.in\*(Aq)
-env\&.Command(\*(Aqbar\*(Aq, bar_in, \*(Aqkprocess $SOURCES > $TARGET\*(Aq)
-bar_in\&.target_scanner = kscan
-.fi
-.if n \{\
-.RE
-.\}
-.PP
-It is important to note that you have to return a list of File nodes from the scan function, simple strings for the file names won\*(Aqt do\&. As in the examples we are showing here, you can use the
-\fBFile()\fR
-function of your current Environment in order to create nodes on the fly from a sequence of file names with relative paths\&.
-.PP
-Here is a similar but more complete example that searches a path of directories (specified as the
-\fBMYPATH\fR
-construction variable) for files that actually exist:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-import re
-import os
-include_re = re\&.compile(r\*(Aq^include\es+(\eS+)$\*(Aq, re\&.M)
-
-def my_scan(node, env, path, arg):
- contents = node\&.get_text_contents()
- includes = include_re\&.findall(contents)
- if includes == []:
- return []
- results = []
- for inc in includes:
- for dir in path:
- file = str(dir) + os\&.sep + inc
- if os\&.path\&.exists(file):
- results\&.append(file)
- break
- return env\&.File(results)
-
-scanner = Scanner(name = \*(Aqmyscanner\*(Aq,
- function = my_scan,
- argument = None,
- skeys = [\*(Aq\&.x\*(Aq],
- path_function = FindPathDirs(\*(AqMYPATH\*(Aq)
- )
-scanners = Environment()\&.Dictionary(\*(AqSCANNERS\*(Aq)
-env = Environment(SCANNERS = scanners + [scanner],
- MYPATH = [\*(Aqincs\*(Aq])
-
-env\&.Command(\*(Aqfoo\*(Aq, \*(Aqfoo\&.x\*(Aq, \*(Aqxprocess < $SOURCES > $TARGET\*(Aq)
-.fi
-.if n \{\
-.RE
-.\}
-.PP
-The
-\fBFindPathDirs\fR() function used in the previous example returns a function (actually a callable Python object) that will return a list of directories specified in the
-\fB$MYPATH\fR
-construction variable\&. It lets SCons detect the file
-\fBincs/foo\&.inc\fR
-, even if
-\fBfoo\&.x\fR
-contains the line
-\fBinclude foo\&.inc\fR
-only\&. If you need to customize how the search path is derived, you would provide your own
-\fBpath_function\fR
-argument when creating the Scanner object, as follows:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-# MYPATH is a list of directories to search for files in
-def pf(env, dir, target, source, arg):
- top_dir = Dir(\*(Aq#\*(Aq)\&.abspath
- results = []
- if \*(AqMYPATH\*(Aq in env:
- for p in env[\*(AqMYPATH\*(Aq]:
- results\&.append(top_dir + os\&.sep + p)
- return results
-
-scanner = Scanner(name = \*(Aqmyscanner\*(Aq,
- function = my_scan,
- argument = None,
- skeys = [\*(Aq\&.x\*(Aq],
- path_function = pf
- )
-.fi
-.if n \{\
-.RE
-.\}
-.SS "Creating a Hierarchical Build"
-.PP
-Notice that the file names specified in a subdirectory\*(Aqs SConscript file are relative to that subdirectory\&.
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-SConstruct:
-
- env = Environment()
- env\&.Program(target = \*(Aqfoo\*(Aq, source = \*(Aqfoo\&.c\*(Aq)
-
- SConscript(\*(Aqsub/SConscript\*(Aq)
-
-sub/SConscript:
-
- env = Environment()
- # Builds sub/foo from sub/foo\&.c
- env\&.Program(target = \*(Aqfoo\*(Aq, source = \*(Aqfoo\&.c\*(Aq)
-
- SConscript(\*(Aqdir/SConscript\*(Aq)
-
-sub/dir/SConscript:
-
- env = Environment()
- # Builds sub/dir/foo from sub/dir/foo\&.c
- env\&.Program(target = \*(Aqfoo\*(Aq, source = \*(Aqfoo\&.c\*(Aq)
-.fi
-.if n \{\
-.RE
-.\}
-.SS "Sharing Variables Between SConscript Files"
-.PP
-You must explicitly Export() and Import() variables that you want to share between SConscript files\&.
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-SConstruct:
-
- env = Environment()
- env\&.Program(target = \*(Aqfoo\*(Aq, source = \*(Aqfoo\&.c\*(Aq)
-
- Export("env")
- SConscript(\*(Aqsubdirectory/SConscript\*(Aq)
-
-subdirectory/SConscript:
-
- Import("env")
- env\&.Program(target = \*(Aqfoo\*(Aq, source = \*(Aqfoo\&.c\*(Aq)
-.fi
-.if n \{\
-.RE
-.\}
-.SS "Building Multiple Variants From the Same Source"
-.PP
-Use the variant_dir keyword argument to the SConscript function to establish one or more separate variant build directory trees for a given source directory:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-SConstruct:
-
- cppdefines = [\*(AqFOO\*(Aq]
- Export("cppdefines")
- SConscript(\*(Aqsrc/SConscript\*(Aq, variant_dir=\*(Aqfoo\*(Aq)
-
- cppdefines = [\*(AqBAR\*(Aq]
- Export("cppdefines")
- SConscript(\*(Aqsrc/SConscript\*(Aq, variant_dir=\*(Aqbar\*(Aq)
-
-src/SConscript:
-
- Import("cppdefines")
- env = Environment(CPPDEFINES = cppdefines)
- env\&.Program(target = \*(Aqsrc\*(Aq, source = \*(Aqsrc\&.c\*(Aq)
-.fi
-.if n \{\
-.RE
-.\}
-.PP
-Note the use of the Export() method to set the "cppdefines" variable to a different value each time we call the SConscript function\&.
-.SS "Hierarchical Build of Two Libraries Linked With a Program"
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-SConstruct:
-
- env = Environment(LIBPATH = [\*(Aq#libA\*(Aq, \*(Aq#libB\*(Aq])
- Export(\*(Aqenv\*(Aq)
- SConscript(\*(AqlibA/SConscript\*(Aq)
- SConscript(\*(AqlibB/SConscript\*(Aq)
- SConscript(\*(AqMain/SConscript\*(Aq)
-
-libA/SConscript:
-
- Import(\*(Aqenv\*(Aq)
- env\&.Library(\*(Aqa\*(Aq, Split(\*(Aqa1\&.c a2\&.c a3\&.c\*(Aq))
-
-libB/SConscript:
-
- Import(\*(Aqenv\*(Aq)
- env\&.Library(\*(Aqb\*(Aq, Split(\*(Aqb1\&.c b2\&.c b3\&.c\*(Aq))
-
-Main/SConscript:
-
- Import(\*(Aqenv\*(Aq)
- e = env\&.Copy(LIBS = [\*(Aqa\*(Aq, \*(Aqb\*(Aq])
- e\&.Program(\*(Aqfoo\*(Aq, Split(\*(Aqm1\&.c m2\&.c m3\&.c\*(Aq))
-.fi
-.if n \{\
-.RE
-.\}
-.PP
-The \*(Aq#\*(Aq in the LIBPATH directories specify that they\*(Aqre relative to the top\-level directory, so they don\*(Aqt turn into "Main/libA" when they\*(Aqre used in Main/SConscript\&.
-.PP
-Specifying only \*(Aqa\*(Aq and \*(Aqb\*(Aq for the library names allows SCons to append the appropriate library prefix and suffix for the current platform (for example, \*(Aqliba\&.a\*(Aq on POSIX systems, \*(Aqa\&.lib\*(Aq on Windows)\&.
-.SS "Customizing construction variables from the command line\&."
-.PP
-The following would allow the C compiler to be specified on the command line or in the file custom\&.py\&.
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-vars = Variables(\*(Aqcustom\&.py\*(Aq)
-vars\&.Add(\*(AqCC\*(Aq, \*(AqThe C compiler\&.\*(Aq)
-env = Environment(variables=vars)
-Help(vars\&.GenerateHelpText(env))
-.fi
-.if n \{\
-.RE
-.\}
-.PP
-The user could specify the C compiler on the command line:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-scons "CC=my_cc"
-.fi
-.if n \{\
-.RE
-.\}
-.PP
-or in the custom\&.py file:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-CC = \*(Aqmy_cc\*(Aq
-.fi
-.if n \{\
-.RE
-.\}
-.PP
-or get documentation on the options:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-$ scons \-h
-
-CC: The C compiler\&.
- default: None
- actual: cc
-
-.fi
-.if n \{\
-.RE
-.\}
-.SS "Using Microsoft Visual C++ precompiled headers"
-.PP
-Since windows\&.h includes everything and the kitchen sink, it can take quite some time to compile it over and over again for a bunch of object files, so Microsoft provides a mechanism to compile a set of headers once and then include the previously compiled headers in any object file\&. This technology is called precompiled headers\&. The general recipe is to create a file named "StdAfx\&.cpp" that includes a single header named "StdAfx\&.h", and then include every header you want to precompile in "StdAfx\&.h", and finally include "StdAfx\&.h" as the first header in all the source files you are compiling to object files\&. For example:
-.PP
-StdAfx\&.h:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-#include <windows\&.h>
-#include <my_big_header\&.h>
-.fi
-.if n \{\
-.RE
-.\}
-.PP
-StdAfx\&.cpp:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-#include <StdAfx\&.h>
-.fi
-.if n \{\
-.RE
-.\}
-.PP
-Foo\&.cpp:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-#include <StdAfx\&.h>
-
-/* do some stuff */
-.fi
-.if n \{\
-.RE
-.\}
-.PP
-Bar\&.cpp:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-#include <StdAfx\&.h>
-
-/* do some other stuff */
-.fi
-.if n \{\
-.RE
-.\}
-.PP
-SConstruct:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-env=Environment()
-env[\*(AqPCHSTOP\*(Aq] = \*(AqStdAfx\&.h\*(Aq
-env[\*(AqPCH\*(Aq] = env\&.PCH(\*(AqStdAfx\&.cpp\*(Aq)[0]
-env\&.Program(\*(AqMyApp\*(Aq, [\*(AqFoo\&.cpp\*(Aq, \*(AqBar\&.cpp\*(Aq])
-.fi
-.if n \{\
-.RE
-.\}
-.PP
-For more information see the document for the PCH builder, and the PCH and PCHSTOP construction variables\&. To learn about the details of precompiled headers consult the MSDN documention for /Yc, /Yu, and /Yp\&.
-.SS "Using Microsoft Visual C++ external debugging information"
-.PP
-Since including debugging information in programs and shared libraries can cause their size to increase significantly, Microsoft provides a mechanism for including the debugging information in an external file called a PDB file\&. SCons supports PDB files through the PDB construction variable\&.
-.PP
-SConstruct:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-env=Environment()
-env[\*(AqPDB\*(Aq] = \*(AqMyApp\&.pdb\*(Aq
-env\&.Program(\*(AqMyApp\*(Aq, [\*(AqFoo\&.cpp\*(Aq, \*(AqBar\&.cpp\*(Aq])
-.fi
-.if n \{\
-.RE
-.\}
-.PP
-For more information see the document for the PDB construction variable\&.
-.SH "ENVIRONMENT"
-.PP
-SCONS_LIB_DIR
-.RS 4
-Specifies the directory that contains the SCons Python module directory (e\&.g\&. /home/aroach/scons\-src\-0\&.01/src/engine)\&.
-.RE
-.PP
-SCONSFLAGS
-.RS 4
-A string of options that will be used by scons in addition to those passed on the command line\&.
-.RE
-.SH "SEE ALSO"
-.PP
-\fBscons\fR
-User Manual,
-\fBscons\fR
-Design Document,
-\fBscons\fR
-source code\&.
-.SH "AUTHORS"
-.PP
-Originally: Steven Knight <knight@baldmt\&.com> and Anthony Roach <aroach@electriceyeball\&.com> Since 2010: The SCons Development Team <scons\-dev@scons\&.org>
-.SH "AUTHORS"
-.PP
-\fBSteven Knight\fR
-.RS 4
-Author.
-.RE
-.PP
-\fBSteven Knight and the SCons Development Team\fR
-.SH "COPYRIGHT"
-.br
-Copyright \(co 2004 - 2015 The SCons Foundation
-.br
diff --git a/3rdParty/SCons/scons-2.4.0/sconsign.1 b/3rdParty/SCons/scons-2.4.0/sconsign.1
deleted file mode 100644
index ea9335c..0000000
--- a/3rdParty/SCons/scons-2.4.0/sconsign.1
+++ /dev/null
@@ -1,164 +0,0 @@
-'\" t
-.\" Title: SCONSIGN
-.\" Author: [see the "AUTHORS" section]
-.\" Generator: DocBook XSL Stylesheets v1.76.1 <http://docbook.sf.net/>
-.\" Date: 09/21/2015
-.\" Manual: SCons 2.4.0
-.\" Source: SCons 2.4.0
-.\" Language: English
-.\"
-.TH "SCONSIGN" "1" "09/21/2015" "SCons 2\&.4\&.0" "SCons 2\&.4\&.0"
-.\" -----------------------------------------------------------------
-.\" * Define some portability stuff
-.\" -----------------------------------------------------------------
-.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-.\" http://bugs.debian.org/507673
-.\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html
-.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-.ie \n(.g .ds Aq \(aq
-.el .ds Aq '
-.\" -----------------------------------------------------------------
-.\" * set default formatting
-.\" -----------------------------------------------------------------
-.\" disable hyphenation
-.nh
-.\" disable justification (adjust text to left margin only)
-.ad l
-.\" -----------------------------------------------------------------
-.\" * MAIN CONTENT STARTS HERE *
-.\" -----------------------------------------------------------------
-.SH "NAME"
-sconsign \- print SCons \&.sconsign file information
-.SH "SYNOPSIS"
-.HP \w'\fBsconsign\fR\ 'u
-\fBsconsign\fR [\fIoptions\fR...] \fIfile\fR [\fI\&.\&.\&.\fR]
-.SH "DESCRIPTION"
-.PP
-The
-\fBsconsign\fR
-command displays the contents of one or more
-\fB\&.sconsign\fR
-files specified by the user\&.
-.PP
-By default,
-\fBsconsign\fR
-dumps the entire contents of the specified file(s)\&. Each entry is printed in the following format:
-.PP
-file: signature timestamp length implicit_dependency_1: signature timestamp length implicit_dependency_2: signature timestamp length action_signature [action string]
-.PP
-\fBNone\fR
-is printed in place of any missing timestamp, bsig, or csig values for any entry or any of its dependencies\&. If the entry has no implicit dependencies, or no build action, the lines are simply omitted\&.
-.PP
-By default,
-\fBsconsign\fR
-assumes that any
-\fIfile\fR
-arguments that end with a
-\fB\&.dbm\fR
-suffix contains signature entries for more than one directory (that is, was specified by the
-\fBSConsignFile ()\fR
-function)\&. Any
-\fIfile\fR
-argument that does not end in
-\fB\&.dbm\fR
-is assumed to be a traditional
-\fB\&.sconsign\fR
-file containing the signature entries for a single directory\&. An explicit format may be specified using the
-\fB\-f\fR
-or
-\fB\-\-file=\fR
-options\&.
-.SH "OPTIONS"
-.PP
-Various options control what information is printed and the format:
-.PP
-\-a, \-\-act, \-\-action
-.RS 4
-Prints the build action information for all entries or the specified entries\&.
-.RE
-.PP
-\-c, \-\-csig
-.RS 4
-Prints the content signature (csig) information for all entries or the specified entries\&.
-.RE
-.PP
-\-d DIRECTORY, \-\-dir=DIRECTORY
-.RS 4
-When the signatures are being read from a
-\fB\&.dbm\fR
-file, or the
-\fB\-f dbm\fR
-or
-\fB\-\-format=dbm\fR
-options are used, prints information about only the signatures for entries in the specified
-\fIDIRECTORY\fR\&.
-.RE
-.PP
-\-e ENTRY, \-\-entry=ENTRY
-.RS 4
-Prints information about only the specified
-\fIENTRY\fR\&. Multiple \-e options may be used, in which case information about each
-\fIENTRY\fR
-is printed in the order in which the options are specified on the command line\&.
-.RE
-.PP
-\-f FORMAT, \-\-format=FORMAT
-.RS 4
-The file(s) to be printed are in the specified
-\fIFORMAT\fR\&. Legal values are
-\fBdbm\fR
-(the DBM format used when the
-\fBSConsignFile\fR() function is used) or
-\fBsconsign\fR
-(the default format used for an individual
-\fB\&.sconsign\fR
-file in each directory)\&.
-.RE
-.PP
-\-h, \-\-help
-.RS 4
-Prints a help message and exits\&.
-.RE
-.PP
-\-i, \-\-implicit
-.RS 4
-Prints the list of cached implicit dependencies for all entries or the the specified entries\&.
-.RE
-.PP
-\-\-raw
-.RS 4
-Prints a pretty\-printed representation of the raw Python dictionary that holds build information about individual entry (both the entry itself or its implicit dependencies)\&. An entry\*(Aqs build action is still printed in its usual format\&.
-.RE
-.PP
-\-r, \-\-readable
-.RS 4
-Prints timestamps in a human\-readable string, enclosed in single quotes\&.
-.RE
-.PP
-\-t, \-\-timestamp
-.RS 4
-Prints the timestamp information for all entries or the specified entries\&.
-.RE
-.PP
-\-v, \-\-verbose
-.RS 4
-Prints labels identifying each field being printed\&.
-.RE
-.SH "ENVIRONMENT"
-.PP
-SCONS_LIB_DIR
-.RS 4
-Specifies the directory that contains the SCons Python module directory (e\&.g\&. /home/aroach/scons\-src\-0\&.01/src/engine)\&. on the command line\&.
-.RE
-.SH "SEE ALSO"
-.PP
-\fBscons\fR,
-\fBscons\fR
-User Manual,
-\fBscons\fR
-Design Document,
-\fBscons\fR
-source code\&.
-.SH "AUTHORS"
-.PP
-Steven Knight <knight at baldmt dot com>
diff --git a/3rdParty/SCons/scons-2.4.0/script/scons b/3rdParty/SCons/scons-2.4.0/script/scons
deleted file mode 100644
index 0e59647..0000000
--- a/3rdParty/SCons/scons-2.4.0/script/scons
+++ /dev/null
@@ -1,205 +0,0 @@
-#! /usr/bin/env python
-#
-# SCons - a Software Constructor
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-__revision__ = "src/script/scons.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-__version__ = "2.4.0"
-
-__build__ = "rel_2.4.0:3365:9259ea1c13d7"
-
-__buildsys__ = "hpmicrodog"
-
-__date__ = "2015/09/21 14:03:43"
-
-__developer__ = "bdbaddog"
-
-import os
-import sys
-
-
-##############################################################################
-# BEGIN STANDARD SCons SCRIPT HEADER
-#
-# This is the cut-and-paste logic so that a self-contained script can
-# interoperate correctly with different SCons versions and installation
-# locations for the engine. If you modify anything in this section, you
-# should also change other scripts that use this same header.
-##############################################################################
-
-# Strip the script directory from sys.path() so on case-insensitive
-# (WIN32) systems Python doesn't think that the "scons" script is the
-# "SCons" package. Replace it with our own library directories
-# (version-specific first, in case they installed by hand there,
-# followed by generic) so we pick up the right version of the build
-# engine modules if they're in either directory.
-
-
-if sys.version_info >= (3,0,0):
- msg = "scons: *** SCons version %s does not run under Python version %s.\n\
-Python 3 is not yet supported.\n"
- sys.stderr.write(msg % (__version__, sys.version.split()[0]))
- sys.exit(1)
-
-
-script_dir = sys.path[0]
-
-if script_dir in sys.path:
- sys.path.remove(script_dir)
-
-libs = []
-
-if "SCONS_LIB_DIR" in os.environ:
- libs.append(os.environ["SCONS_LIB_DIR"])
-
-# - running from source takes priority (since 2.3.2), excluding SCONS_LIB_DIR settings
-script_path = os.path.abspath(os.path.dirname(__file__))
-source_path = os.path.join(script_path, '..', 'engine')
-libs.append(source_path)
-
-local_version = 'scons-local-' + __version__
-local = 'scons-local'
-if script_dir:
- local_version = os.path.join(script_dir, local_version)
- local = os.path.join(script_dir, local)
-libs.append(os.path.abspath(local_version))
-libs.append(os.path.abspath(local))
-
-scons_version = 'scons-%s' % __version__
-
-# preferred order of scons lookup paths
-prefs = []
-
-
-# - running from egg check
-try:
- import pkg_resources
-except ImportError:
- pass
-else:
- # when running from an egg add the egg's directory
- try:
- d = pkg_resources.get_distribution('scons')
- except pkg_resources.DistributionNotFound:
- pass
- else:
- prefs.append(d.location)
-
-if sys.platform == 'win32':
- # sys.prefix is (likely) C:\Python*;
- # check only C:\Python*.
- prefs.append(sys.prefix)
- prefs.append(os.path.join(sys.prefix, 'Lib', 'site-packages'))
-else:
- # On other (POSIX) platforms, things are more complicated due to
- # the variety of path names and library locations. Try to be smart
- # about it.
- if script_dir == 'bin':
- # script_dir is `pwd`/bin;
- # check `pwd`/lib/scons*.
- prefs.append(os.getcwd())
- else:
- if script_dir == '.' or script_dir == '':
- script_dir = os.getcwd()
- head, tail = os.path.split(script_dir)
- if tail == "bin":
- # script_dir is /foo/bin;
- # check /foo/lib/scons*.
- prefs.append(head)
-
- head, tail = os.path.split(sys.prefix)
- if tail == "usr":
- # sys.prefix is /foo/usr;
- # check /foo/usr/lib/scons* first,
- # then /foo/usr/local/lib/scons*.
- prefs.append(sys.prefix)
- prefs.append(os.path.join(sys.prefix, "local"))
- elif tail == "local":
- h, t = os.path.split(head)
- if t == "usr":
- # sys.prefix is /foo/usr/local;
- # check /foo/usr/local/lib/scons* first,
- # then /foo/usr/lib/scons*.
- prefs.append(sys.prefix)
- prefs.append(head)
- else:
- # sys.prefix is /foo/local;
- # check only /foo/local/lib/scons*.
- prefs.append(sys.prefix)
- else:
- # sys.prefix is /foo (ends in neither /usr or /local);
- # check only /foo/lib/scons*.
- prefs.append(sys.prefix)
-
- temp = [os.path.join(x, 'lib') for x in prefs]
- temp.extend([os.path.join(x,
- 'lib',
- 'python' + sys.version[:3],
- 'site-packages') for x in prefs])
- prefs = temp
-
- # Add the parent directory of the current python's library to the
- # preferences. On SuSE-91/AMD64, for example, this is /usr/lib64,
- # not /usr/lib.
- try:
- libpath = os.__file__
- except AttributeError:
- pass
- else:
- # Split /usr/libfoo/python*/os.py to /usr/libfoo/python*.
- libpath, tail = os.path.split(libpath)
- # Split /usr/libfoo/python* to /usr/libfoo
- libpath, tail = os.path.split(libpath)
- # Check /usr/libfoo/scons*.
- prefs.append(libpath)
-
-# Look first for 'scons-__version__' in all of our preference libs,
-# then for 'scons'.
-libs.extend([os.path.join(x, scons_version) for x in prefs])
-libs.extend([os.path.join(x, 'scons') for x in prefs])
-
-sys.path = libs + sys.path
-
-##############################################################################
-# END STANDARD SCons SCRIPT HEADER
-##############################################################################
-
-if __name__ == "__main__":
- try:
- import SCons.Script
- except:
- print("Import failed. Unable to find SCons files in:")
- for path in libs:
- print(" %s" % path)
- raise
-
- # this does all the work, and calls sys.exit
- # with the proper exit status when done.
- SCons.Script.main()
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/script/scons-time b/3rdParty/SCons/scons-2.4.0/script/scons-time
deleted file mode 100644
index f37d906..0000000
--- a/3rdParty/SCons/scons-2.4.0/script/scons-time
+++ /dev/null
@@ -1,1544 +0,0 @@
-#!/usr/bin/env python
-#
-# scons-time - run SCons timings and collect statistics
-#
-# A script for running a configuration through SCons with a standard
-# set of invocations to collect timing and memory statistics and to
-# capture the results in a consistent set of output files for display
-# and analysis.
-#
-
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-from __future__ import division
-from __future__ import nested_scopes
-
-__revision__ = "src/script/scons-time.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-import getopt
-import glob
-import os
-import re
-import shutil
-import sys
-import tempfile
-import time
-
-try:
- sorted
-except NameError:
- # Pre-2.4 Python has no sorted() function.
- #
- # The pre-2.4 Python list.sort() method does not support
- # list.sort(key=) nor list.sort(reverse=) keyword arguments, so
- # we must implement the functionality of those keyword arguments
- # by hand instead of passing them to list.sort().
- def sorted(iterable, cmp=None, key=None, reverse=False):
- if key is not None:
- result = [(key(x), x) for x in iterable]
- else:
- result = iterable[:]
- if cmp is None:
- # Pre-2.3 Python does not support list.sort(None).
- result.sort()
- else:
- result.sort(cmp)
- if key is not None:
- result = [t1 for t0,t1 in result]
- if reverse:
- result.reverse()
- return result
-
-if os.environ.get('SCONS_HORRIBLE_REGRESSION_TEST_HACK') is not None:
- # We can't apply the 'callable' fixer until the floor is 2.6, but the
- # '-3' option to Python 2.6 and 2.7 generates almost ten thousand
- # warnings. This hack allows us to run regression tests with the '-3'
- # option by replacing the callable() built-in function with a hack
- # that performs the same function but doesn't generate the warning.
- # Note that this hack is ONLY intended to be used for regression
- # testing, and should NEVER be used for real runs.
- from types import ClassType
- def callable(obj):
- if hasattr(obj, '__call__'): return True
- if isinstance(obj, (ClassType, type)): return True
- return False
-
-def make_temp_file(**kw):
- try:
- result = tempfile.mktemp(**kw)
- try:
- result = os.path.realpath(result)
- except AttributeError:
- # Python 2.1 has no os.path.realpath() method.
- pass
- except TypeError:
- try:
- save_template = tempfile.template
- prefix = kw['prefix']
- del kw['prefix']
- tempfile.template = prefix
- result = tempfile.mktemp(**kw)
- finally:
- tempfile.template = save_template
- return result
-
-def HACK_for_exec(cmd, *args):
- '''
- For some reason, Python won't allow an exec() within a function
- that also declares an internal function (including lambda functions).
- This function is a hack that calls exec() in a function with no
- internal functions.
- '''
- if not args: exec(cmd)
- elif len(args) == 1: exec cmd in args[0]
- else: exec cmd in args[0], args[1]
-
-class Plotter(object):
- def increment_size(self, largest):
- """
- Return the size of each horizontal increment line for a specified
- maximum value. This returns a value that will provide somewhere
- between 5 and 9 horizontal lines on the graph, on some set of
- boundaries that are multiples of 10/100/1000/etc.
- """
- i = largest // 5
- if not i:
- return largest
- multiplier = 1
- while i >= 10:
- i = i // 10
- multiplier = multiplier * 10
- return i * multiplier
-
- def max_graph_value(self, largest):
- # Round up to next integer.
- largest = int(largest) + 1
- increment = self.increment_size(largest)
- return ((largest + increment - 1) // increment) * increment
-
-class Line(object):
- def __init__(self, points, type, title, label, comment, fmt="%s %s"):
- self.points = points
- self.type = type
- self.title = title
- self.label = label
- self.comment = comment
- self.fmt = fmt
-
- def print_label(self, inx, x, y):
- if self.label:
- print 'set label %s "%s" at %s,%s right' % (inx, self.label, x, y)
-
- def plot_string(self):
- if self.title:
- title_string = 'title "%s"' % self.title
- else:
- title_string = 'notitle'
- return "'-' %s with lines lt %s" % (title_string, self.type)
-
- def print_points(self, fmt=None):
- if fmt is None:
- fmt = self.fmt
- if self.comment:
- print '# %s' % self.comment
- for x, y in self.points:
- # If y is None, it usually represents some kind of break
- # in the line's index number. We might want to represent
- # this some way rather than just drawing the line straight
- # between the two points on either side.
- if not y is None:
- print fmt % (x, y)
- print 'e'
-
- def get_x_values(self):
- return [ p[0] for p in self.points ]
-
- def get_y_values(self):
- return [ p[1] for p in self.points ]
-
-class Gnuplotter(Plotter):
-
- def __init__(self, title, key_location):
- self.lines = []
- self.title = title
- self.key_location = key_location
-
- def line(self, points, type, title=None, label=None, comment=None, fmt='%s %s'):
- if points:
- line = Line(points, type, title, label, comment, fmt)
- self.lines.append(line)
-
- def plot_string(self, line):
- return line.plot_string()
-
- def vertical_bar(self, x, type, label, comment):
- if self.get_min_x() <= x and x <= self.get_max_x():
- points = [(x, 0), (x, self.max_graph_value(self.get_max_y()))]
- self.line(points, type, label, comment)
-
- def get_all_x_values(self):
- result = []
- for line in self.lines:
- result.extend(line.get_x_values())
- return [r for r in result if not r is None]
-
- def get_all_y_values(self):
- result = []
- for line in self.lines:
- result.extend(line.get_y_values())
- return [r for r in result if not r is None]
-
- def get_min_x(self):
- try:
- return self.min_x
- except AttributeError:
- try:
- self.min_x = min(self.get_all_x_values())
- except ValueError:
- self.min_x = 0
- return self.min_x
-
- def get_max_x(self):
- try:
- return self.max_x
- except AttributeError:
- try:
- self.max_x = max(self.get_all_x_values())
- except ValueError:
- self.max_x = 0
- return self.max_x
-
- def get_min_y(self):
- try:
- return self.min_y
- except AttributeError:
- try:
- self.min_y = min(self.get_all_y_values())
- except ValueError:
- self.min_y = 0
- return self.min_y
-
- def get_max_y(self):
- try:
- return self.max_y
- except AttributeError:
- try:
- self.max_y = max(self.get_all_y_values())
- except ValueError:
- self.max_y = 0
- return self.max_y
-
- def draw(self):
-
- if not self.lines:
- return
-
- if self.title:
- print 'set title "%s"' % self.title
- print 'set key %s' % self.key_location
-
- min_y = self.get_min_y()
- max_y = self.max_graph_value(self.get_max_y())
- incr = (max_y - min_y) / 10.0
- start = min_y + (max_y / 2.0) + (2.0 * incr)
- position = [ start - (i * incr) for i in range(5) ]
-
- inx = 1
- for line in self.lines:
- line.print_label(inx, line.points[0][0]-1,
- position[(inx-1) % len(position)])
- inx += 1
-
- plot_strings = [ self.plot_string(l) for l in self.lines ]
- print 'plot ' + ', \\\n '.join(plot_strings)
-
- for line in self.lines:
- line.print_points()
-
-
-
-def untar(fname):
- import tarfile
- tar = tarfile.open(name=fname, mode='r')
- for tarinfo in tar:
- tar.extract(tarinfo)
- tar.close()
-
-def unzip(fname):
- import zipfile
- zf = zipfile.ZipFile(fname, 'r')
- for name in zf.namelist():
- dir = os.path.dirname(name)
- try:
- os.makedirs(dir)
- except:
- pass
- open(name, 'w').write(zf.read(name))
-
-def read_tree(dir):
- for dirpath, dirnames, filenames in os.walk(dir):
- for fn in filenames:
- fn = os.path.join(dirpath, fn)
- if os.path.isfile(fn):
- open(fn, 'rb').read()
-
-def redirect_to_file(command, log):
- return '%s > %s 2>&1' % (command, log)
-
-def tee_to_file(command, log):
- return '%s 2>&1 | tee %s' % (command, log)
-
-
-
-class SConsTimer(object):
- """
- Usage: scons-time SUBCOMMAND [ARGUMENTS]
- Type "scons-time help SUBCOMMAND" for help on a specific subcommand.
-
- Available subcommands:
- func Extract test-run data for a function
- help Provides help
- mem Extract --debug=memory data from test runs
- obj Extract --debug=count data from test runs
- time Extract --debug=time data from test runs
- run Runs a test configuration
- """
-
- name = 'scons-time'
- name_spaces = ' '*len(name)
-
- def makedict(**kw):
- return kw
-
- default_settings = makedict(
- aegis = 'aegis',
- aegis_project = None,
- chdir = None,
- config_file = None,
- initial_commands = [],
- key_location = 'bottom left',
- orig_cwd = os.getcwd(),
- outdir = None,
- prefix = '',
- python = '"%s"' % sys.executable,
- redirect = redirect_to_file,
- scons = None,
- scons_flags = '--debug=count --debug=memory --debug=time --debug=memoizer',
- scons_lib_dir = None,
- scons_wrapper = None,
- startup_targets = '--help',
- subdir = None,
- subversion_url = None,
- svn = 'svn',
- svn_co_flag = '-q',
- tar = 'tar',
- targets = '',
- targets0 = None,
- targets1 = None,
- targets2 = None,
- title = None,
- unzip = 'unzip',
- verbose = False,
- vertical_bars = [],
-
- unpack_map = {
- '.tar.gz' : (untar, '%(tar)s xzf %%s'),
- '.tgz' : (untar, '%(tar)s xzf %%s'),
- '.tar' : (untar, '%(tar)s xf %%s'),
- '.zip' : (unzip, '%(unzip)s %%s'),
- },
- )
-
- run_titles = [
- 'Startup',
- 'Full build',
- 'Up-to-date build',
- ]
-
- run_commands = [
- '%(python)s %(scons_wrapper)s %(scons_flags)s --profile=%(prof0)s %(targets0)s',
- '%(python)s %(scons_wrapper)s %(scons_flags)s --profile=%(prof1)s %(targets1)s',
- '%(python)s %(scons_wrapper)s %(scons_flags)s --profile=%(prof2)s %(targets2)s',
- ]
-
- stages = [
- 'pre-read',
- 'post-read',
- 'pre-build',
- 'post-build',
- ]
-
- stage_strings = {
- 'pre-read' : 'Memory before reading SConscript files:',
- 'post-read' : 'Memory after reading SConscript files:',
- 'pre-build' : 'Memory before building targets:',
- 'post-build' : 'Memory after building targets:',
- }
-
- memory_string_all = 'Memory '
-
- default_stage = stages[-1]
-
- time_strings = {
- 'total' : 'Total build time',
- 'SConscripts' : 'Total SConscript file execution time',
- 'SCons' : 'Total SCons execution time',
- 'commands' : 'Total command execution time',
- }
-
- time_string_all = 'Total .* time'
-
- #
-
- def __init__(self):
- self.__dict__.update(self.default_settings)
-
- # Functions for displaying and executing commands.
-
- def subst(self, x, dictionary):
- try:
- return x % dictionary
- except TypeError:
- # x isn't a string (it's probably a Python function),
- # so just return it.
- return x
-
- def subst_variables(self, command, dictionary):
- """
- Substitutes (via the format operator) the values in the specified
- dictionary into the specified command.
-
- The command can be an (action, string) tuple. In all cases, we
- perform substitution on strings and don't worry if something isn't
- a string. (It's probably a Python function to be executed.)
- """
- try:
- command + ''
- except TypeError:
- action = command[0]
- string = command[1]
- args = command[2:]
- else:
- action = command
- string = action
- args = (())
- action = self.subst(action, dictionary)
- string = self.subst(string, dictionary)
- return (action, string, args)
-
- def _do_not_display(self, msg, *args):
- pass
-
- def display(self, msg, *args):
- """
- Displays the specified message.
-
- Each message is prepended with a standard prefix of our name
- plus the time.
- """
- if callable(msg):
- msg = msg(*args)
- else:
- msg = msg % args
- if msg is None:
- return
- fmt = '%s[%s]: %s\n'
- sys.stdout.write(fmt % (self.name, time.strftime('%H:%M:%S'), msg))
-
- def _do_not_execute(self, action, *args):
- pass
-
- def execute(self, action, *args):
- """
- Executes the specified action.
-
- The action is called if it's a callable Python function, and
- otherwise passed to os.system().
- """
- if callable(action):
- action(*args)
- else:
- os.system(action % args)
-
- def run_command_list(self, commands, dict):
- """
- Executes a list of commands, substituting values from the
- specified dictionary.
- """
- commands = [ self.subst_variables(c, dict) for c in commands ]
- for action, string, args in commands:
- self.display(string, *args)
- sys.stdout.flush()
- status = self.execute(action, *args)
- if status:
- sys.exit(status)
-
- def log_display(self, command, log):
- command = self.subst(command, self.__dict__)
- if log:
- command = self.redirect(command, log)
- return command
-
- def log_execute(self, command, log):
- command = self.subst(command, self.__dict__)
- output = os.popen(command).read()
- if self.verbose:
- sys.stdout.write(output)
- open(log, 'wb').write(output)
-
- #
-
- def archive_splitext(self, path):
- """
- Splits an archive name into a filename base and extension.
-
- This is like os.path.splitext() (which it calls) except that it
- also looks for '.tar.gz' and treats it as an atomic extensions.
- """
- if path.endswith('.tar.gz'):
- return path[:-7], path[-7:]
- else:
- return os.path.splitext(path)
-
- def args_to_files(self, args, tail=None):
- """
- Takes a list of arguments, expands any glob patterns, and
- returns the last "tail" files from the list.
- """
- files = []
- for a in args:
- files.extend(sorted(glob.glob(a)))
-
- if tail:
- files = files[-tail:]
-
- return files
-
- def ascii_table(self, files, columns,
- line_function, file_function=lambda x: x,
- *args, **kw):
-
- header_fmt = ' '.join(['%12s'] * len(columns))
- line_fmt = header_fmt + ' %s'
-
- print header_fmt % columns
-
- for file in files:
- t = line_function(file, *args, **kw)
- if t is None:
- t = []
- diff = len(columns) - len(t)
- if diff > 0:
- t += [''] * diff
- t.append(file_function(file))
- print line_fmt % tuple(t)
-
- def collect_results(self, files, function, *args, **kw):
- results = {}
-
- for file in files:
- base = os.path.splitext(file)[0]
- run, index = base.split('-')[-2:]
-
- run = int(run)
- index = int(index)
-
- value = function(file, *args, **kw)
-
- try:
- r = results[index]
- except KeyError:
- r = []
- results[index] = r
- r.append((run, value))
-
- return results
-
- def doc_to_help(self, obj):
- """
- Translates an object's __doc__ string into help text.
-
- This strips a consistent number of spaces from each line in the
- help text, essentially "outdenting" the text to the left-most
- column.
- """
- doc = obj.__doc__
- if doc is None:
- return ''
- return self.outdent(doc)
-
- def find_next_run_number(self, dir, prefix):
- """
- Returns the next run number in a directory for the specified prefix.
-
- Examines the contents the specified directory for files with the
- specified prefix, extracts the run numbers from each file name,
- and returns the next run number after the largest it finds.
- """
- x = re.compile(re.escape(prefix) + '-([0-9]+).*')
- matches = [x.match(e) for e in os.listdir(dir)]
- matches = [_f for _f in matches if _f]
- if not matches:
- return 0
- run_numbers = [int(m.group(1)) for m in matches]
- return int(max(run_numbers)) + 1
-
- def gnuplot_results(self, results, fmt='%s %.3f'):
- """
- Prints out a set of results in Gnuplot format.
- """
- gp = Gnuplotter(self.title, self.key_location)
-
- for i in sorted(results.keys()):
- try:
- t = self.run_titles[i]
- except IndexError:
- t = '??? %s ???' % i
- results[i].sort()
- gp.line(results[i], i+1, t, None, t, fmt=fmt)
-
- for bar_tuple in self.vertical_bars:
- try:
- x, type, label, comment = bar_tuple
- except ValueError:
- x, type, label = bar_tuple
- comment = label
- gp.vertical_bar(x, type, label, comment)
-
- gp.draw()
-
- def logfile_name(self, invocation):
- """
- Returns the absolute path of a log file for the specificed
- invocation number.
- """
- name = self.prefix_run + '-%d.log' % invocation
- return os.path.join(self.outdir, name)
-
- def outdent(self, s):
- """
- Strip as many spaces from each line as are found at the beginning
- of the first line in the list.
- """
- lines = s.split('\n')
- if lines[0] == '':
- lines = lines[1:]
- spaces = re.match(' *', lines[0]).group(0)
- def strip_initial_spaces(l, s=spaces):
- if l.startswith(spaces):
- l = l[len(spaces):]
- return l
- return '\n'.join([ strip_initial_spaces(l) for l in lines ]) + '\n'
-
- def profile_name(self, invocation):
- """
- Returns the absolute path of a profile file for the specified
- invocation number.
- """
- name = self.prefix_run + '-%d.prof' % invocation
- return os.path.join(self.outdir, name)
-
- def set_env(self, key, value):
- os.environ[key] = value
-
- #
-
- def get_debug_times(self, file, time_string=None):
- """
- Fetch times from the --debug=time strings in the specified file.
- """
- if time_string is None:
- search_string = self.time_string_all
- else:
- search_string = time_string
- contents = open(file).read()
- if not contents:
- sys.stderr.write('file %s has no contents!\n' % repr(file))
- return None
- result = re.findall(r'%s: ([\d\.]*)' % search_string, contents)[-4:]
- result = [ float(r) for r in result ]
- if not time_string is None:
- try:
- result = result[0]
- except IndexError:
- sys.stderr.write('file %s has no results!\n' % repr(file))
- return None
- return result
-
- def get_function_profile(self, file, function):
- """
- Returns the file, line number, function name, and cumulative time.
- """
- try:
- import pstats
- except ImportError, e:
- sys.stderr.write('%s: func: %s\n' % (self.name, e))
- sys.stderr.write('%s This version of Python is missing the profiler.\n' % self.name_spaces)
- sys.stderr.write('%s Cannot use the "func" subcommand.\n' % self.name_spaces)
- sys.exit(1)
- statistics = pstats.Stats(file).stats
- matches = [ e for e in statistics.items() if e[0][2] == function ]
- r = matches[0]
- return r[0][0], r[0][1], r[0][2], r[1][3]
-
- def get_function_time(self, file, function):
- """
- Returns just the cumulative time for the specified function.
- """
- return self.get_function_profile(file, function)[3]
-
- def get_memory(self, file, memory_string=None):
- """
- Returns a list of integers of the amount of memory used. The
- default behavior is to return all the stages.
- """
- if memory_string is None:
- search_string = self.memory_string_all
- else:
- search_string = memory_string
- lines = open(file).readlines()
- lines = [ l for l in lines if l.startswith(search_string) ][-4:]
- result = [ int(l.split()[-1]) for l in lines[-4:] ]
- if len(result) == 1:
- result = result[0]
- return result
-
- def get_object_counts(self, file, object_name, index=None):
- """
- Returns the counts of the specified object_name.
- """
- object_string = ' ' + object_name + '\n'
- lines = open(file).readlines()
- line = [ l for l in lines if l.endswith(object_string) ][0]
- result = [ int(field) for field in line.split()[:4] ]
- if index is not None:
- result = result[index]
- return result
-
- #
-
- command_alias = {}
-
- def execute_subcommand(self, argv):
- """
- Executes the do_*() function for the specified subcommand (argv[0]).
- """
- if not argv:
- return
- cmdName = self.command_alias.get(argv[0], argv[0])
- try:
- func = getattr(self, 'do_' + cmdName)
- except AttributeError:
- return self.default(argv)
- try:
- return func(argv)
- except TypeError, e:
- sys.stderr.write("%s %s: %s\n" % (self.name, cmdName, e))
- import traceback
- traceback.print_exc(file=sys.stderr)
- sys.stderr.write("Try '%s help %s'\n" % (self.name, cmdName))
-
- def default(self, argv):
- """
- The default behavior for an unknown subcommand. Prints an
- error message and exits.
- """
- sys.stderr.write('%s: Unknown subcommand "%s".\n' % (self.name, argv[0]))
- sys.stderr.write('Type "%s help" for usage.\n' % self.name)
- sys.exit(1)
-
- #
-
- def do_help(self, argv):
- """
- """
- if argv[1:]:
- for arg in argv[1:]:
- try:
- func = getattr(self, 'do_' + arg)
- except AttributeError:
- sys.stderr.write('%s: No help for "%s"\n' % (self.name, arg))
- else:
- try:
- help = getattr(self, 'help_' + arg)
- except AttributeError:
- sys.stdout.write(self.doc_to_help(func))
- sys.stdout.flush()
- else:
- help()
- else:
- doc = self.doc_to_help(self.__class__)
- if doc:
- sys.stdout.write(doc)
- sys.stdout.flush()
- return None
-
- #
-
- def help_func(self):
- help = """\
- Usage: scons-time func [OPTIONS] FILE [...]
-
- -C DIR, --chdir=DIR Change to DIR before looking for files
- -f FILE, --file=FILE Read configuration from specified FILE
- --fmt=FORMAT, --format=FORMAT Print data in specified FORMAT
- --func=NAME, --function=NAME Report time for function NAME
- -h, --help Print this help and exit
- -p STRING, --prefix=STRING Use STRING as log file/profile prefix
- -t NUMBER, --tail=NUMBER Only report the last NUMBER files
- --title=TITLE Specify the output plot TITLE
- """
- sys.stdout.write(self.outdent(help))
- sys.stdout.flush()
-
- def do_func(self, argv):
- """
- """
- format = 'ascii'
- function_name = '_main'
- tail = None
-
- short_opts = '?C:f:hp:t:'
-
- long_opts = [
- 'chdir=',
- 'file=',
- 'fmt=',
- 'format=',
- 'func=',
- 'function=',
- 'help',
- 'prefix=',
- 'tail=',
- 'title=',
- ]
-
- opts, args = getopt.getopt(argv[1:], short_opts, long_opts)
-
- for o, a in opts:
- if o in ('-C', '--chdir'):
- self.chdir = a
- elif o in ('-f', '--file'):
- self.config_file = a
- elif o in ('--fmt', '--format'):
- format = a
- elif o in ('--func', '--function'):
- function_name = a
- elif o in ('-?', '-h', '--help'):
- self.do_help(['help', 'func'])
- sys.exit(0)
- elif o in ('--max',):
- max_time = int(a)
- elif o in ('-p', '--prefix'):
- self.prefix = a
- elif o in ('-t', '--tail'):
- tail = int(a)
- elif o in ('--title',):
- self.title = a
-
- if self.config_file:
- exec open(self.config_file, 'rU').read() in self.__dict__
-
- if self.chdir:
- os.chdir(self.chdir)
-
- if not args:
-
- pattern = '%s*.prof' % self.prefix
- args = self.args_to_files([pattern], tail)
-
- if not args:
- if self.chdir:
- directory = self.chdir
- else:
- directory = os.getcwd()
-
- sys.stderr.write('%s: func: No arguments specified.\n' % self.name)
- sys.stderr.write('%s No %s*.prof files found in "%s".\n' % (self.name_spaces, self.prefix, directory))
- sys.stderr.write('%s Type "%s help func" for help.\n' % (self.name_spaces, self.name))
- sys.exit(1)
-
- else:
-
- args = self.args_to_files(args, tail)
-
- cwd_ = os.getcwd() + os.sep
-
- if format == 'ascii':
-
- for file in args:
- try:
- f, line, func, time = \
- self.get_function_profile(file, function_name)
- except ValueError, e:
- sys.stderr.write("%s: func: %s: %s\n" %
- (self.name, file, e))
- else:
- if f.startswith(cwd_):
- f = f[len(cwd_):]
- print "%.3f %s:%d(%s)" % (time, f, line, func)
-
- elif format == 'gnuplot':
-
- results = self.collect_results(args, self.get_function_time,
- function_name)
-
- self.gnuplot_results(results)
-
- else:
-
- sys.stderr.write('%s: func: Unknown format "%s".\n' % (self.name, format))
- sys.exit(1)
-
- #
-
- def help_mem(self):
- help = """\
- Usage: scons-time mem [OPTIONS] FILE [...]
-
- -C DIR, --chdir=DIR Change to DIR before looking for files
- -f FILE, --file=FILE Read configuration from specified FILE
- --fmt=FORMAT, --format=FORMAT Print data in specified FORMAT
- -h, --help Print this help and exit
- -p STRING, --prefix=STRING Use STRING as log file/profile prefix
- --stage=STAGE Plot memory at the specified stage:
- pre-read, post-read, pre-build,
- post-build (default: post-build)
- -t NUMBER, --tail=NUMBER Only report the last NUMBER files
- --title=TITLE Specify the output plot TITLE
- """
- sys.stdout.write(self.outdent(help))
- sys.stdout.flush()
-
- def do_mem(self, argv):
-
- format = 'ascii'
- logfile_path = lambda x: x
- stage = self.default_stage
- tail = None
-
- short_opts = '?C:f:hp:t:'
-
- long_opts = [
- 'chdir=',
- 'file=',
- 'fmt=',
- 'format=',
- 'help',
- 'prefix=',
- 'stage=',
- 'tail=',
- 'title=',
- ]
-
- opts, args = getopt.getopt(argv[1:], short_opts, long_opts)
-
- for o, a in opts:
- if o in ('-C', '--chdir'):
- self.chdir = a
- elif o in ('-f', '--file'):
- self.config_file = a
- elif o in ('--fmt', '--format'):
- format = a
- elif o in ('-?', '-h', '--help'):
- self.do_help(['help', 'mem'])
- sys.exit(0)
- elif o in ('-p', '--prefix'):
- self.prefix = a
- elif o in ('--stage',):
- if not a in self.stages:
- sys.stderr.write('%s: mem: Unrecognized stage "%s".\n' % (self.name, a))
- sys.exit(1)
- stage = a
- elif o in ('-t', '--tail'):
- tail = int(a)
- elif o in ('--title',):
- self.title = a
-
- if self.config_file:
- HACK_for_exec(open(self.config_file, 'rU').read(), self.__dict__)
-
- if self.chdir:
- os.chdir(self.chdir)
- logfile_path = lambda x: os.path.join(self.chdir, x)
-
- if not args:
-
- pattern = '%s*.log' % self.prefix
- args = self.args_to_files([pattern], tail)
-
- if not args:
- if self.chdir:
- directory = self.chdir
- else:
- directory = os.getcwd()
-
- sys.stderr.write('%s: mem: No arguments specified.\n' % self.name)
- sys.stderr.write('%s No %s*.log files found in "%s".\n' % (self.name_spaces, self.prefix, directory))
- sys.stderr.write('%s Type "%s help mem" for help.\n' % (self.name_spaces, self.name))
- sys.exit(1)
-
- else:
-
- args = self.args_to_files(args, tail)
-
- cwd_ = os.getcwd() + os.sep
-
- if format == 'ascii':
-
- self.ascii_table(args, tuple(self.stages), self.get_memory, logfile_path)
-
- elif format == 'gnuplot':
-
- results = self.collect_results(args, self.get_memory,
- self.stage_strings[stage])
-
- self.gnuplot_results(results)
-
- else:
-
- sys.stderr.write('%s: mem: Unknown format "%s".\n' % (self.name, format))
- sys.exit(1)
-
- return 0
-
- #
-
- def help_obj(self):
- help = """\
- Usage: scons-time obj [OPTIONS] OBJECT FILE [...]
-
- -C DIR, --chdir=DIR Change to DIR before looking for files
- -f FILE, --file=FILE Read configuration from specified FILE
- --fmt=FORMAT, --format=FORMAT Print data in specified FORMAT
- -h, --help Print this help and exit
- -p STRING, --prefix=STRING Use STRING as log file/profile prefix
- --stage=STAGE Plot memory at the specified stage:
- pre-read, post-read, pre-build,
- post-build (default: post-build)
- -t NUMBER, --tail=NUMBER Only report the last NUMBER files
- --title=TITLE Specify the output plot TITLE
- """
- sys.stdout.write(self.outdent(help))
- sys.stdout.flush()
-
- def do_obj(self, argv):
-
- format = 'ascii'
- logfile_path = lambda x: x
- stage = self.default_stage
- tail = None
-
- short_opts = '?C:f:hp:t:'
-
- long_opts = [
- 'chdir=',
- 'file=',
- 'fmt=',
- 'format=',
- 'help',
- 'prefix=',
- 'stage=',
- 'tail=',
- 'title=',
- ]
-
- opts, args = getopt.getopt(argv[1:], short_opts, long_opts)
-
- for o, a in opts:
- if o in ('-C', '--chdir'):
- self.chdir = a
- elif o in ('-f', '--file'):
- self.config_file = a
- elif o in ('--fmt', '--format'):
- format = a
- elif o in ('-?', '-h', '--help'):
- self.do_help(['help', 'obj'])
- sys.exit(0)
- elif o in ('-p', '--prefix'):
- self.prefix = a
- elif o in ('--stage',):
- if not a in self.stages:
- sys.stderr.write('%s: obj: Unrecognized stage "%s".\n' % (self.name, a))
- sys.stderr.write('%s Type "%s help obj" for help.\n' % (self.name_spaces, self.name))
- sys.exit(1)
- stage = a
- elif o in ('-t', '--tail'):
- tail = int(a)
- elif o in ('--title',):
- self.title = a
-
- if not args:
- sys.stderr.write('%s: obj: Must specify an object name.\n' % self.name)
- sys.stderr.write('%s Type "%s help obj" for help.\n' % (self.name_spaces, self.name))
- sys.exit(1)
-
- object_name = args.pop(0)
-
- if self.config_file:
- HACK_for_exec(open(self.config_file, 'rU').read(), self.__dict__)
-
- if self.chdir:
- os.chdir(self.chdir)
- logfile_path = lambda x: os.path.join(self.chdir, x)
-
- if not args:
-
- pattern = '%s*.log' % self.prefix
- args = self.args_to_files([pattern], tail)
-
- if not args:
- if self.chdir:
- directory = self.chdir
- else:
- directory = os.getcwd()
-
- sys.stderr.write('%s: obj: No arguments specified.\n' % self.name)
- sys.stderr.write('%s No %s*.log files found in "%s".\n' % (self.name_spaces, self.prefix, directory))
- sys.stderr.write('%s Type "%s help obj" for help.\n' % (self.name_spaces, self.name))
- sys.exit(1)
-
- else:
-
- args = self.args_to_files(args, tail)
-
- cwd_ = os.getcwd() + os.sep
-
- if format == 'ascii':
-
- self.ascii_table(args, tuple(self.stages), self.get_object_counts, logfile_path, object_name)
-
- elif format == 'gnuplot':
-
- stage_index = 0
- for s in self.stages:
- if stage == s:
- break
- stage_index = stage_index + 1
-
- results = self.collect_results(args, self.get_object_counts,
- object_name, stage_index)
-
- self.gnuplot_results(results)
-
- else:
-
- sys.stderr.write('%s: obj: Unknown format "%s".\n' % (self.name, format))
- sys.exit(1)
-
- return 0
-
- #
-
- def help_run(self):
- help = """\
- Usage: scons-time run [OPTIONS] [FILE ...]
-
- --aegis=PROJECT Use SCons from the Aegis PROJECT
- --chdir=DIR Name of unpacked directory for chdir
- -f FILE, --file=FILE Read configuration from specified FILE
- -h, --help Print this help and exit
- -n, --no-exec No execute, just print command lines
- --number=NUMBER Put output in files for run NUMBER
- --outdir=OUTDIR Put output files in OUTDIR
- -p STRING, --prefix=STRING Use STRING as log file/profile prefix
- --python=PYTHON Time using the specified PYTHON
- -q, --quiet Don't print command lines
- --scons=SCONS Time using the specified SCONS
- --svn=URL, --subversion=URL Use SCons from Subversion URL
- -v, --verbose Display output of commands
- """
- sys.stdout.write(self.outdent(help))
- sys.stdout.flush()
-
- def do_run(self, argv):
- """
- """
- run_number_list = [None]
-
- short_opts = '?f:hnp:qs:v'
-
- long_opts = [
- 'aegis=',
- 'file=',
- 'help',
- 'no-exec',
- 'number=',
- 'outdir=',
- 'prefix=',
- 'python=',
- 'quiet',
- 'scons=',
- 'svn=',
- 'subdir=',
- 'subversion=',
- 'verbose',
- ]
-
- opts, args = getopt.getopt(argv[1:], short_opts, long_opts)
-
- for o, a in opts:
- if o in ('--aegis',):
- self.aegis_project = a
- elif o in ('-f', '--file'):
- self.config_file = a
- elif o in ('-?', '-h', '--help'):
- self.do_help(['help', 'run'])
- sys.exit(0)
- elif o in ('-n', '--no-exec'):
- self.execute = self._do_not_execute
- elif o in ('--number',):
- run_number_list = self.split_run_numbers(a)
- elif o in ('--outdir',):
- self.outdir = a
- elif o in ('-p', '--prefix'):
- self.prefix = a
- elif o in ('--python',):
- self.python = a
- elif o in ('-q', '--quiet'):
- self.display = self._do_not_display
- elif o in ('-s', '--subdir'):
- self.subdir = a
- elif o in ('--scons',):
- self.scons = a
- elif o in ('--svn', '--subversion'):
- self.subversion_url = a
- elif o in ('-v', '--verbose'):
- self.redirect = tee_to_file
- self.verbose = True
- self.svn_co_flag = ''
-
- if not args and not self.config_file:
- sys.stderr.write('%s: run: No arguments or -f config file specified.\n' % self.name)
- sys.stderr.write('%s Type "%s help run" for help.\n' % (self.name_spaces, self.name))
- sys.exit(1)
-
- if self.config_file:
- exec open(self.config_file, 'rU').read() in self.__dict__
-
- if args:
- self.archive_list = args
-
- archive_file_name = os.path.split(self.archive_list[0])[1]
-
- if not self.subdir:
- self.subdir = self.archive_splitext(archive_file_name)[0]
-
- if not self.prefix:
- self.prefix = self.archive_splitext(archive_file_name)[0]
-
- prepare = None
- if self.subversion_url:
- prepare = self.prep_subversion_run
- elif self.aegis_project:
- prepare = self.prep_aegis_run
-
- for run_number in run_number_list:
- self.individual_run(run_number, self.archive_list, prepare)
-
- def split_run_numbers(self, s):
- result = []
- for n in s.split(','):
- try:
- x, y = n.split('-')
- except ValueError:
- result.append(int(n))
- else:
- result.extend(list(range(int(x), int(y)+1)))
- return result
-
- def scons_path(self, dir):
- return os.path.join(dir, 'src', 'script', 'scons.py')
-
- def scons_lib_dir_path(self, dir):
- return os.path.join(dir, 'src', 'engine')
-
- def prep_aegis_run(self, commands, removals):
- self.aegis_tmpdir = make_temp_file(prefix = self.name + '-aegis-')
- removals.append((shutil.rmtree, 'rm -rf %%s', self.aegis_tmpdir))
-
- self.aegis_parent_project = os.path.splitext(self.aegis_project)[0]
- self.scons = self.scons_path(self.aegis_tmpdir)
- self.scons_lib_dir = self.scons_lib_dir_path(self.aegis_tmpdir)
-
- commands.extend([
- 'mkdir %(aegis_tmpdir)s',
- (lambda: os.chdir(self.aegis_tmpdir), 'cd %(aegis_tmpdir)s'),
- '%(aegis)s -cp -ind -p %(aegis_parent_project)s .',
- '%(aegis)s -cp -ind -p %(aegis_project)s -delta %(run_number)s .',
- ])
-
- def prep_subversion_run(self, commands, removals):
- self.svn_tmpdir = make_temp_file(prefix = self.name + '-svn-')
- removals.append((shutil.rmtree, 'rm -rf %%s', self.svn_tmpdir))
-
- self.scons = self.scons_path(self.svn_tmpdir)
- self.scons_lib_dir = self.scons_lib_dir_path(self.svn_tmpdir)
-
- commands.extend([
- 'mkdir %(svn_tmpdir)s',
- '%(svn)s co %(svn_co_flag)s -r %(run_number)s %(subversion_url)s %(svn_tmpdir)s',
- ])
-
- def individual_run(self, run_number, archive_list, prepare=None):
- """
- Performs an individual run of the default SCons invocations.
- """
-
- commands = []
- removals = []
-
- if prepare:
- prepare(commands, removals)
-
- save_scons = self.scons
- save_scons_wrapper = self.scons_wrapper
- save_scons_lib_dir = self.scons_lib_dir
-
- if self.outdir is None:
- self.outdir = self.orig_cwd
- elif not os.path.isabs(self.outdir):
- self.outdir = os.path.join(self.orig_cwd, self.outdir)
-
- if self.scons is None:
- self.scons = self.scons_path(self.orig_cwd)
-
- if self.scons_lib_dir is None:
- self.scons_lib_dir = self.scons_lib_dir_path(self.orig_cwd)
-
- if self.scons_wrapper is None:
- self.scons_wrapper = self.scons
-
- if not run_number:
- run_number = self.find_next_run_number(self.outdir, self.prefix)
-
- self.run_number = str(run_number)
-
- self.prefix_run = self.prefix + '-%03d' % run_number
-
- if self.targets0 is None:
- self.targets0 = self.startup_targets
- if self.targets1 is None:
- self.targets1 = self.targets
- if self.targets2 is None:
- self.targets2 = self.targets
-
- self.tmpdir = make_temp_file(prefix = self.name + '-')
-
- commands.extend([
- 'mkdir %(tmpdir)s',
-
- (os.chdir, 'cd %%s', self.tmpdir),
- ])
-
- for archive in archive_list:
- if not os.path.isabs(archive):
- archive = os.path.join(self.orig_cwd, archive)
- if os.path.isdir(archive):
- dest = os.path.split(archive)[1]
- commands.append((shutil.copytree, 'cp -r %%s %%s', archive, dest))
- else:
- suffix = self.archive_splitext(archive)[1]
- unpack_command = self.unpack_map.get(suffix)
- if not unpack_command:
- dest = os.path.split(archive)[1]
- commands.append((shutil.copyfile, 'cp %%s %%s', archive, dest))
- else:
- commands.append(unpack_command + (archive,))
-
- commands.extend([
- (os.chdir, 'cd %%s', self.subdir),
- ])
-
- commands.extend(self.initial_commands)
-
- commands.extend([
- (lambda: read_tree('.'),
- 'find * -type f | xargs cat > /dev/null'),
-
- (self.set_env, 'export %%s=%%s',
- 'SCONS_LIB_DIR', self.scons_lib_dir),
-
- '%(python)s %(scons_wrapper)s --version',
- ])
-
- index = 0
- for run_command in self.run_commands:
- setattr(self, 'prof%d' % index, self.profile_name(index))
- c = (
- self.log_execute,
- self.log_display,
- run_command,
- self.logfile_name(index),
- )
- commands.append(c)
- index = index + 1
-
- commands.extend([
- (os.chdir, 'cd %%s', self.orig_cwd),
- ])
-
- if not os.environ.get('PRESERVE'):
- commands.extend(removals)
-
- commands.append((shutil.rmtree, 'rm -rf %%s', self.tmpdir))
-
- self.run_command_list(commands, self.__dict__)
-
- self.scons = save_scons
- self.scons_lib_dir = save_scons_lib_dir
- self.scons_wrapper = save_scons_wrapper
-
- #
-
- def help_time(self):
- help = """\
- Usage: scons-time time [OPTIONS] FILE [...]
-
- -C DIR, --chdir=DIR Change to DIR before looking for files
- -f FILE, --file=FILE Read configuration from specified FILE
- --fmt=FORMAT, --format=FORMAT Print data in specified FORMAT
- -h, --help Print this help and exit
- -p STRING, --prefix=STRING Use STRING as log file/profile prefix
- -t NUMBER, --tail=NUMBER Only report the last NUMBER files
- --which=TIMER Plot timings for TIMER: total,
- SConscripts, SCons, commands.
- """
- sys.stdout.write(self.outdent(help))
- sys.stdout.flush()
-
- def do_time(self, argv):
-
- format = 'ascii'
- logfile_path = lambda x: x
- tail = None
- which = 'total'
-
- short_opts = '?C:f:hp:t:'
-
- long_opts = [
- 'chdir=',
- 'file=',
- 'fmt=',
- 'format=',
- 'help',
- 'prefix=',
- 'tail=',
- 'title=',
- 'which=',
- ]
-
- opts, args = getopt.getopt(argv[1:], short_opts, long_opts)
-
- for o, a in opts:
- if o in ('-C', '--chdir'):
- self.chdir = a
- elif o in ('-f', '--file'):
- self.config_file = a
- elif o in ('--fmt', '--format'):
- format = a
- elif o in ('-?', '-h', '--help'):
- self.do_help(['help', 'time'])
- sys.exit(0)
- elif o in ('-p', '--prefix'):
- self.prefix = a
- elif o in ('-t', '--tail'):
- tail = int(a)
- elif o in ('--title',):
- self.title = a
- elif o in ('--which',):
- if not a in self.time_strings.keys():
- sys.stderr.write('%s: time: Unrecognized timer "%s".\n' % (self.name, a))
- sys.stderr.write('%s Type "%s help time" for help.\n' % (self.name_spaces, self.name))
- sys.exit(1)
- which = a
-
- if self.config_file:
- HACK_for_exec(open(self.config_file, 'rU').read(), self.__dict__)
-
- if self.chdir:
- os.chdir(self.chdir)
- logfile_path = lambda x: os.path.join(self.chdir, x)
-
- if not args:
-
- pattern = '%s*.log' % self.prefix
- args = self.args_to_files([pattern], tail)
-
- if not args:
- if self.chdir:
- directory = self.chdir
- else:
- directory = os.getcwd()
-
- sys.stderr.write('%s: time: No arguments specified.\n' % self.name)
- sys.stderr.write('%s No %s*.log files found in "%s".\n' % (self.name_spaces, self.prefix, directory))
- sys.stderr.write('%s Type "%s help time" for help.\n' % (self.name_spaces, self.name))
- sys.exit(1)
-
- else:
-
- args = self.args_to_files(args, tail)
-
- cwd_ = os.getcwd() + os.sep
-
- if format == 'ascii':
-
- columns = ("Total", "SConscripts", "SCons", "commands")
- self.ascii_table(args, columns, self.get_debug_times, logfile_path)
-
- elif format == 'gnuplot':
-
- results = self.collect_results(args, self.get_debug_times,
- self.time_strings[which])
-
- self.gnuplot_results(results, fmt='%s %.6f')
-
- else:
-
- sys.stderr.write('%s: time: Unknown format "%s".\n' % (self.name, format))
- sys.exit(1)
-
-if __name__ == '__main__':
- opts, args = getopt.getopt(sys.argv[1:], 'h?V', ['help', 'version'])
-
- ST = SConsTimer()
-
- for o, a in opts:
- if o in ('-?', '-h', '--help'):
- ST.do_help(['help'])
- sys.exit(0)
- elif o in ('-V', '--version'):
- sys.stdout.write('scons-time version\n')
- sys.exit(0)
-
- if not args:
- sys.stderr.write('Type "%s help" for usage.\n' % ST.name)
- sys.exit(1)
-
- ST.execute_subcommand(args)
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/script/scons.bat b/3rdParty/SCons/scons-2.4.0/script/scons.bat
deleted file mode 100644
index bda2baa..0000000
--- a/3rdParty/SCons/scons-2.4.0/script/scons.bat
+++ /dev/null
@@ -1,34 +0,0 @@
-@REM Copyright (c) 2001 - 2015 The SCons Foundation
-@REM src/script/scons.bat rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog
-@echo off
-set SCONS_ERRORLEVEL=
-if "%OS%" == "Windows_NT" goto WinNT
-
-@REM for 9x/Me you better not have more than 9 args
-python -c "from os.path import join; import sys; sys.path = [ join(sys.prefix, 'Lib', 'site-packages', 'scons-2.4.0'), join(sys.prefix, 'Lib', 'site-packages', 'scons'), join(sys.prefix, 'scons-2.4.0'), join(sys.prefix, 'scons')] + sys.path; import SCons.Script; SCons.Script.main()" %1 %2 %3 %4 %5 %6 %7 %8 %9
-@REM no way to set exit status of this script for 9x/Me
-goto endscons
-
-@REM Credit where credit is due: we return the exit code despite our
-@REM use of setlocal+endlocal using a technique from Bear's Journal:
-@REM http://code-bear.com/bearlog/2007/06/01/getting-the-exit-code-from-a-batch-file-that-is-run-from-a-python-program/
-
-:WinNT
-setlocal
-@REM ensure the script will be executed with the Python it was installed for
-set path=%~dp0;%~dp0..;%path%
-@REM try the script named as the .bat file in current dir, then in Scripts subdir
-set scriptname=%~dp0%~n0.py
-if not exist "%scriptname%" set scriptname=%~dp0Scripts\%~n0.py
-python "%scriptname%" %*
-endlocal & set SCONS_ERRORLEVEL=%ERRORLEVEL%
-
-if NOT "%COMSPEC%" == "%SystemRoot%\system32\cmd.exe" goto returncode
-if errorlevel 9009 echo you do not have python in your PATH
-goto endscons
-
-:returncode
-exit /B %SCONS_ERRORLEVEL%
-
-:endscons
-call :returncode %SCONS_ERRORLEVEL%
diff --git a/3rdParty/SCons/scons-2.4.0/script/sconsign b/3rdParty/SCons/scons-2.4.0/script/sconsign
deleted file mode 100644
index 35dad8a..0000000
--- a/3rdParty/SCons/scons-2.4.0/script/sconsign
+++ /dev/null
@@ -1,514 +0,0 @@
-#! /usr/bin/env python
-#
-# SCons - a Software Constructor
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-__revision__ = "src/script/sconsign.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-__version__ = "2.4.0"
-
-__build__ = "rel_2.4.0:3365:9259ea1c13d7"
-
-__buildsys__ = "hpmicrodog"
-
-__date__ = "2015/09/21 14:03:43"
-
-__developer__ = "bdbaddog"
-
-import os
-import sys
-
-##############################################################################
-# BEGIN STANDARD SCons SCRIPT HEADER
-#
-# This is the cut-and-paste logic so that a self-contained script can
-# interoperate correctly with different SCons versions and installation
-# locations for the engine. If you modify anything in this section, you
-# should also change other scripts that use this same header.
-##############################################################################
-
-# Strip the script directory from sys.path() so on case-insensitive
-# (WIN32) systems Python doesn't think that the "scons" script is the
-# "SCons" package. Replace it with our own library directories
-# (version-specific first, in case they installed by hand there,
-# followed by generic) so we pick up the right version of the build
-# engine modules if they're in either directory.
-
-script_dir = sys.path[0]
-
-if script_dir in sys.path:
- sys.path.remove(script_dir)
-
-libs = []
-
-if "SCONS_LIB_DIR" in os.environ:
- libs.append(os.environ["SCONS_LIB_DIR"])
-
-local_version = 'scons-local-' + __version__
-local = 'scons-local'
-if script_dir:
- local_version = os.path.join(script_dir, local_version)
- local = os.path.join(script_dir, local)
-libs.append(os.path.abspath(local_version))
-libs.append(os.path.abspath(local))
-
-scons_version = 'scons-%s' % __version__
-
-# preferred order of scons lookup paths
-prefs = []
-
-try:
- import pkg_resources
-except ImportError:
- pass
-else:
- # when running from an egg add the egg's directory
- try:
- d = pkg_resources.get_distribution('scons')
- except pkg_resources.DistributionNotFound:
- pass
- else:
- prefs.append(d.location)
-
-if sys.platform == 'win32':
- # sys.prefix is (likely) C:\Python*;
- # check only C:\Python*.
- prefs.append(sys.prefix)
- prefs.append(os.path.join(sys.prefix, 'Lib', 'site-packages'))
-else:
- # On other (POSIX) platforms, things are more complicated due to
- # the variety of path names and library locations. Try to be smart
- # about it.
- if script_dir == 'bin':
- # script_dir is `pwd`/bin;
- # check `pwd`/lib/scons*.
- prefs.append(os.getcwd())
- else:
- if script_dir == '.' or script_dir == '':
- script_dir = os.getcwd()
- head, tail = os.path.split(script_dir)
- if tail == "bin":
- # script_dir is /foo/bin;
- # check /foo/lib/scons*.
- prefs.append(head)
-
- head, tail = os.path.split(sys.prefix)
- if tail == "usr":
- # sys.prefix is /foo/usr;
- # check /foo/usr/lib/scons* first,
- # then /foo/usr/local/lib/scons*.
- prefs.append(sys.prefix)
- prefs.append(os.path.join(sys.prefix, "local"))
- elif tail == "local":
- h, t = os.path.split(head)
- if t == "usr":
- # sys.prefix is /foo/usr/local;
- # check /foo/usr/local/lib/scons* first,
- # then /foo/usr/lib/scons*.
- prefs.append(sys.prefix)
- prefs.append(head)
- else:
- # sys.prefix is /foo/local;
- # check only /foo/local/lib/scons*.
- prefs.append(sys.prefix)
- else:
- # sys.prefix is /foo (ends in neither /usr or /local);
- # check only /foo/lib/scons*.
- prefs.append(sys.prefix)
-
- temp = [os.path.join(x, 'lib') for x in prefs]
- temp.extend([os.path.join(x,
- 'lib',
- 'python' + sys.version[:3],
- 'site-packages') for x in prefs])
- prefs = temp
-
- # Add the parent directory of the current python's library to the
- # preferences. On SuSE-91/AMD64, for example, this is /usr/lib64,
- # not /usr/lib.
- try:
- libpath = os.__file__
- except AttributeError:
- pass
- else:
- # Split /usr/libfoo/python*/os.py to /usr/libfoo/python*.
- libpath, tail = os.path.split(libpath)
- # Split /usr/libfoo/python* to /usr/libfoo
- libpath, tail = os.path.split(libpath)
- # Check /usr/libfoo/scons*.
- prefs.append(libpath)
-
-# Look first for 'scons-__version__' in all of our preference libs,
-# then for 'scons'.
-libs.extend([os.path.join(x, scons_version) for x in prefs])
-libs.extend([os.path.join(x, 'scons') for x in prefs])
-
-sys.path = libs + sys.path
-
-##############################################################################
-# END STANDARD SCons SCRIPT HEADER
-##############################################################################
-
-import SCons.compat # so pickle will import cPickle instead
-
-import whichdb
-import time
-import pickle
-import imp
-
-import SCons.SConsign
-
-def my_whichdb(filename):
- if filename[-7:] == ".dblite":
- return "SCons.dblite"
- try:
- f = open(filename + ".dblite", "rb")
- f.close()
- return "SCons.dblite"
- except IOError:
- pass
- return _orig_whichdb(filename)
-
-_orig_whichdb = whichdb.whichdb
-whichdb.whichdb = my_whichdb
-
-def my_import(mname):
- if '.' in mname:
- i = mname.rfind('.')
- parent = my_import(mname[:i])
- fp, pathname, description = imp.find_module(mname[i+1:],
- parent.__path__)
- else:
- fp, pathname, description = imp.find_module(mname)
- return imp.load_module(mname, fp, pathname, description)
-
-class Flagger(object):
- default_value = 1
- def __setitem__(self, item, value):
- self.__dict__[item] = value
- self.default_value = 0
- def __getitem__(self, item):
- return self.__dict__.get(item, self.default_value)
-
-Do_Call = None
-Print_Directories = []
-Print_Entries = []
-Print_Flags = Flagger()
-Verbose = 0
-Readable = 0
-
-def default_mapper(entry, name):
- try:
- val = eval("entry."+name)
- except:
- val = None
- return str(val)
-
-def map_action(entry, name):
- try:
- bact = entry.bact
- bactsig = entry.bactsig
- except AttributeError:
- return None
- return '%s [%s]' % (bactsig, bact)
-
-def map_timestamp(entry, name):
- try:
- timestamp = entry.timestamp
- except AttributeError:
- timestamp = None
- if Readable and timestamp:
- return "'" + time.ctime(timestamp) + "'"
- else:
- return str(timestamp)
-
-def map_bkids(entry, name):
- try:
- bkids = entry.bsources + entry.bdepends + entry.bimplicit
- bkidsigs = entry.bsourcesigs + entry.bdependsigs + entry.bimplicitsigs
- except AttributeError:
- return None
- result = []
- for i in range(len(bkids)):
- result.append(nodeinfo_string(bkids[i], bkidsigs[i], " "))
- if result == []:
- return None
- return "\n ".join(result)
-
-map_field = {
- 'action' : map_action,
- 'timestamp' : map_timestamp,
- 'bkids' : map_bkids,
-}
-
-map_name = {
- 'implicit' : 'bkids',
-}
-
-def field(name, entry, verbose=Verbose):
- if not Print_Flags[name]:
- return None
- fieldname = map_name.get(name, name)
- mapper = map_field.get(fieldname, default_mapper)
- val = mapper(entry, name)
- if verbose:
- val = name + ": " + val
- return val
-
-def nodeinfo_raw(name, ninfo, prefix=""):
- # This just formats the dictionary, which we would normally use str()
- # to do, except that we want the keys sorted for deterministic output.
- d = ninfo.__getstate__()
- try:
- keys = ninfo.field_list + ['_version_id']
- except AttributeError:
- keys = sorted(d.keys())
- l = []
- for k in keys:
- l.append('%s: %s' % (repr(k), repr(d.get(k))))
- if '\n' in name:
- name = repr(name)
- return name + ': {' + ', '.join(l) + '}'
-
-def nodeinfo_cooked(name, ninfo, prefix=""):
- try:
- field_list = ninfo.field_list
- except AttributeError:
- field_list = []
- if '\n' in name:
- name = repr(name)
- outlist = [name+':'] + [_f for _f in [field(x, ninfo, Verbose) for x in field_list] if _f]
- if Verbose:
- sep = '\n ' + prefix
- else:
- sep = ' '
- return sep.join(outlist)
-
-nodeinfo_string = nodeinfo_cooked
-
-def printfield(name, entry, prefix=""):
- outlist = field("implicit", entry, 0)
- if outlist:
- if Verbose:
- print " implicit:"
- print " " + outlist
- outact = field("action", entry, 0)
- if outact:
- if Verbose:
- print " action: " + outact
- else:
- print " " + outact
-
-def printentries(entries, location):
- if Print_Entries:
- for name in Print_Entries:
- try:
- entry = entries[name]
- except KeyError:
- sys.stderr.write("sconsign: no entry `%s' in `%s'\n" % (name, location))
- else:
- try:
- ninfo = entry.ninfo
- except AttributeError:
- print name + ":"
- else:
- print nodeinfo_string(name, entry.ninfo)
- printfield(name, entry.binfo)
- else:
- for name in sorted(entries.keys()):
- entry = entries[name]
- try:
- ninfo = entry.ninfo
- except AttributeError:
- print name + ":"
- else:
- print nodeinfo_string(name, entry.ninfo)
- printfield(name, entry.binfo)
-
-class Do_SConsignDB(object):
- def __init__(self, dbm_name, dbm):
- self.dbm_name = dbm_name
- self.dbm = dbm
-
- def __call__(self, fname):
- # The *dbm modules stick their own file suffixes on the names
- # that are passed in. This is causes us to jump through some
- # hoops here to be able to allow the user
- try:
- # Try opening the specified file name. Example:
- # SPECIFIED OPENED BY self.dbm.open()
- # --------- -------------------------
- # .sconsign => .sconsign.dblite
- # .sconsign.dblite => .sconsign.dblite.dblite
- db = self.dbm.open(fname, "r")
- except (IOError, OSError), e:
- print_e = e
- try:
- # That didn't work, so try opening the base name,
- # so that if the actually passed in 'sconsign.dblite'
- # (for example), the dbm module will put the suffix back
- # on for us and open it anyway.
- db = self.dbm.open(os.path.splitext(fname)[0], "r")
- except (IOError, OSError):
- # That didn't work either. See if the file name
- # they specified just exists (independent of the dbm
- # suffix-mangling).
- try:
- open(fname, "r")
- except (IOError, OSError), e:
- # Nope, that file doesn't even exist, so report that
- # fact back.
- print_e = e
- sys.stderr.write("sconsign: %s\n" % (print_e))
- return
- except KeyboardInterrupt:
- raise
- except pickle.UnpicklingError:
- sys.stderr.write("sconsign: ignoring invalid `%s' file `%s'\n" % (self.dbm_name, fname))
- return
- except Exception, e:
- sys.stderr.write("sconsign: ignoring invalid `%s' file `%s': %s\n" % (self.dbm_name, fname, e))
- return
-
- if Print_Directories:
- for dir in Print_Directories:
- try:
- val = db[dir]
- except KeyError:
- sys.stderr.write("sconsign: no dir `%s' in `%s'\n" % (dir, args[0]))
- else:
- self.printentries(dir, val)
- else:
- for dir in sorted(db.keys()):
- self.printentries(dir, db[dir])
-
- def printentries(self, dir, val):
- print '=== ' + dir + ':'
- printentries(pickle.loads(val), dir)
-
-def Do_SConsignDir(name):
- try:
- fp = open(name, 'rb')
- except (IOError, OSError), e:
- sys.stderr.write("sconsign: %s\n" % (e))
- return
- try:
- sconsign = SCons.SConsign.Dir(fp)
- except KeyboardInterrupt:
- raise
- except pickle.UnpicklingError:
- sys.stderr.write("sconsign: ignoring invalid .sconsign file `%s'\n" % (name))
- return
- except Exception, e:
- sys.stderr.write("sconsign: ignoring invalid .sconsign file `%s': %s\n" % (name, e))
- return
- printentries(sconsign.entries, args[0])
-
-##############################################################################
-
-import getopt
-
-helpstr = """\
-Usage: sconsign [OPTIONS] FILE [...]
-Options:
- -a, --act, --action Print build action information.
- -c, --csig Print content signature information.
- -d DIR, --dir=DIR Print only info about DIR.
- -e ENTRY, --entry=ENTRY Print only info about ENTRY.
- -f FORMAT, --format=FORMAT FILE is in the specified FORMAT.
- -h, --help Print this message and exit.
- -i, --implicit Print implicit dependency information.
- -r, --readable Print timestamps in human-readable form.
- --raw Print raw Python object representations.
- -s, --size Print file sizes.
- -t, --timestamp Print timestamp information.
- -v, --verbose Verbose, describe each field.
-"""
-
-opts, args = getopt.getopt(sys.argv[1:], "acd:e:f:hirstv",
- ['act', 'action',
- 'csig', 'dir=', 'entry=',
- 'format=', 'help', 'implicit',
- 'raw', 'readable',
- 'size', 'timestamp', 'verbose'])
-
-
-for o, a in opts:
- if o in ('-a', '--act', '--action'):
- Print_Flags['action'] = 1
- elif o in ('-c', '--csig'):
- Print_Flags['csig'] = 1
- elif o in ('-d', '--dir'):
- Print_Directories.append(a)
- elif o in ('-e', '--entry'):
- Print_Entries.append(a)
- elif o in ('-f', '--format'):
- Module_Map = {'dblite' : 'SCons.dblite',
- 'sconsign' : None}
- dbm_name = Module_Map.get(a, a)
- if dbm_name:
- try:
- dbm = my_import(dbm_name)
- except:
- sys.stderr.write("sconsign: illegal file format `%s'\n" % a)
- print helpstr
- sys.exit(2)
- Do_Call = Do_SConsignDB(a, dbm)
- else:
- Do_Call = Do_SConsignDir
- elif o in ('-h', '--help'):
- print helpstr
- sys.exit(0)
- elif o in ('-i', '--implicit'):
- Print_Flags['implicit'] = 1
- elif o in ('--raw',):
- nodeinfo_string = nodeinfo_raw
- elif o in ('-r', '--readable'):
- Readable = 1
- elif o in ('-s', '--size'):
- Print_Flags['size'] = 1
- elif o in ('-t', '--timestamp'):
- Print_Flags['timestamp'] = 1
- elif o in ('-v', '--verbose'):
- Verbose = 1
-
-if Do_Call:
- for a in args:
- Do_Call(a)
-else:
- for a in args:
- dbm_name = whichdb.whichdb(a)
- if dbm_name:
- Map_Module = {'SCons.dblite' : 'dblite'}
- dbm = my_import(dbm_name)
- Do_SConsignDB(Map_Module.get(dbm_name, dbm_name), dbm)(a)
- else:
- Do_SConsignDir(a)
-
-sys.exit(0)
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-2.4.0/setup.cfg b/3rdParty/SCons/scons-2.4.0/setup.cfg
deleted file mode 100644
index f04ca1b..0000000
--- a/3rdParty/SCons/scons-2.4.0/setup.cfg
+++ /dev/null
@@ -1,5 +0,0 @@
-[bdist_rpm]
-group = Development/Tools
-
-[bdist_wininst]
-title = SCons - a software construction tool
diff --git a/3rdParty/SCons/scons-2.4.0/setup.py b/3rdParty/SCons/scons-2.4.0/setup.py
deleted file mode 100644
index d5bcc10..0000000
--- a/3rdParty/SCons/scons-2.4.0/setup.py
+++ /dev/null
@@ -1,515 +0,0 @@
-#
-# Copyright (c) 2001 - 2015 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-"""
-NOTE: Installed SCons is not importable like usual Python packages. It is
- executed explicitly with command line scripts. This allows multiple
- SCons versions to coexist within single Python installation, which
- is critical for enterprise build cases. Explicit invokation is
- necessary to avoid confusion over which version of SCons is active.
-
- By default SCons is installed into versioned directory, e.g.
- site-packages/scons-2.1.0.alpha.20101125 and much of the stuff
- below is dedicated to make it happen on various platforms.
-"""
-
-__revision__ = "src/setup.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"
-
-import os
-import stat
-import sys
-
-Version = "2.4.0"
-
-man_pages = [
- 'scons.1',
- 'sconsign.1',
- 'scons-time.1',
-]
-
-# Exit with error if trying to install with Python >= 3.0
-if sys.version_info >= (3,0,0):
- msg = "scons: *** SCons does not run under Python version %s.\n\
-Python 3 and above are not yet supported.\n"
- sys.stderr.write(msg % (sys.version.split()[0]))
- sys.exit(1)
-
-
-# change to setup.py directory if it was executed from other dir
-(head, tail) = os.path.split(sys.argv[0])
-if head:
- os.chdir(head)
- sys.argv[0] = tail
-
-
-# flag if setup.py is run on win32 or _for_ win32 platform,
-# (when building windows installer on linux, for example)
-is_win32 = 0
-if not sys.platform == 'win32':
- try:
- if sys.argv[1] == 'bdist_wininst':
- is_win32 = 1
- except IndexError:
- pass
-else:
- is_win32 = 1
-
-
-import distutils
-import distutils.core
-import distutils.command.install
-import distutils.command.install_data
-import distutils.command.install_lib
-import distutils.command.install_scripts
-import distutils.command.build_scripts
-import distutils.msvccompiler
-
-def get_build_version():
- """ monkey patch distutils msvc version if we're not on windows.
- We need to use vc version 9 for python 2.7.x and it defaults to 6
- for non-windows platforms and there is no way to override it besides
- monkey patching"""
- return 9
-
-distutils.msvccompiler.get_build_version = get_build_version
-
-_install = distutils.command.install.install
-_install_data = distutils.command.install_data.install_data
-_install_lib = distutils.command.install_lib.install_lib
-_install_scripts = distutils.command.install_scripts.install_scripts
-_build_scripts = distutils.command.build_scripts.build_scripts
-
-class _options(object):
- pass
-
-Options = _options()
-
-Installed = []
-
-def set_explicitly(name, args):
- """
- Return if the installation directory was set explicitly by the
- user on the command line. This is complicated by the fact that
- "install --install-lib=/foo" gets turned into "install_lib
- --install-dir=/foo" internally.
- """
- if args[0] == "install_" + name:
- s = "--install-dir="
- else:
- # The command is something else (usually "install")
- s = "--install-%s=" % name
- set = 0
- length = len(s)
- for a in args[1:]:
- if a[:length] == s:
- set = 1
- break
- return set
-
-class install(_install):
- user_options = _install.user_options + [
- ('no-scons-script', None,
- "don't install 'scons', only install 'scons-%s'" % Version),
- ('no-version-script', None,
- "don't install 'scons-%s', only install 'scons'" % Version),
- ('install-bat', None,
- "install 'scons.bat' script"),
- ('no-install-bat', None,
- "do not install 'scons.bat' script"),
- ('install-man', None,
- "install SCons man pages"),
- ('no-install-man', None,
- "do not install SCons man pages"),
- ('standard-lib', None,
- "install SCons library in standard Python location"),
- ('standalone-lib', None,
- "install SCons library in separate standalone directory"),
- ('version-lib', None,
- "install SCons library in version-numbered directory"),
- ]
- boolean_options = _install.boolean_options + [
- 'no-scons-script',
- 'no-version-script',
- 'install-bat',
- 'no-install-bat',
- 'install-man',
- 'no-install-man',
- 'standard-lib',
- 'standalone-lib',
- 'version-lib'
- ]
-
- if hasattr(os, 'link'):
- user_options.append(
- ('hardlink-scons', None,
- "hard link 'scons' to the version-numbered script, don't make a separate 'scons' copy"),
- )
- boolean_options.append('hardlink-script')
-
- if hasattr(os, 'symlink'):
- user_options.append(
- ('symlink-scons', None,
- "make 'scons' a symbolic link to the version-numbered script, don't make a separate 'scons' copy"),
- )
- boolean_options.append('symlink-script')
-
- def initialize_options(self):
- _install.initialize_options(self)
- self.no_scons_script = 0
- self.no_version_script = 0
- self.install_bat = 0
- self.no_install_bat = not is_win32
- self.install_man = 0
- self.no_install_man = is_win32
- self.standard_lib = 0
- self.standalone_lib = 0
- self.version_lib = 0
- self.hardlink_scons = 0
- self.symlink_scons = 0
- # Don't warn about having to put the library directory in the
- # search path.
- self.warn_dir = 0
-
- def finalize_options(self):
- _install.finalize_options(self)
- if self.install_bat:
- Options.install_bat = 1
- else:
- Options.install_bat = not self.no_install_bat
- if self.install_man:
- Options.install_man = 1
- else:
- Options.install_man = not self.no_install_man
- Options.standard_lib = self.standard_lib
- Options.standalone_lib = self.standalone_lib
- Options.version_lib = self.version_lib
- Options.install_scons_script = not self.no_scons_script
- Options.install_version_script = not self.no_version_script
- Options.hardlink_scons = self.hardlink_scons
- Options.symlink_scons = self.symlink_scons
-
-def get_scons_prefix(libdir, is_win32):
- """
- Return the right prefix for SCons library installation. Find
- this by starting with the library installation directory
- (.../site-packages, most likely) and crawling back up until we reach
- a directory name beginning with "python" (or "Python").
- """
- drive, head = os.path.splitdrive(libdir)
- while head:
- if head == os.sep:
- break
- head, tail = os.path.split(head)
- if tail.lower()[:6] == "python":
- # Found the Python library directory...
- if is_win32:
- # ...on Win32 systems, "scons" goes in the directory:
- # C:\PythonXX => C:\PythonXX\scons
- return os.path.join(drive + head, tail)
- else:
- # ...on other systems, "scons" goes above the directory:
- # /usr/lib/pythonX.X => /usr/lib/scons
- return os.path.join(drive + head)
- return libdir
-
-def force_to_usr_local(self):
- """
- A hack to decide if we need to "force" the installation directories
- to be under /usr/local. This is because Mac Os X Tiger and
- Leopard, by default, put the libraries and scripts in their own
- directories under /Library or /System/Library.
- """
- return (sys.platform[:6] == 'darwin' and
- (self.install_dir[:9] == '/Library/' or
- self.install_dir[:16] == '/System/Library/'))
-
-class install_lib(_install_lib):
- def finalize_options(self):
- _install_lib.finalize_options(self)
- if force_to_usr_local(self):
- self.install_dir = '/usr/local/lib'
- args = self.distribution.script_args
- if not set_explicitly("lib", args):
- # They didn't explicitly specify the installation
- # directory for libraries...
- is_win32 = sys.platform == "win32" or args[0] == 'bdist_wininst'
- prefix = get_scons_prefix(self.install_dir, is_win32)
- if Options.standalone_lib:
- # ...but they asked for a standalone directory.
- self.install_dir = os.path.join(prefix, "scons")
- elif Options.version_lib or not Options.standard_lib:
- # ...they asked for a version-specific directory,
- # or they get it by default.
- self.install_dir = os.path.join(prefix, "scons-%s" % Version)
-
- msg = "Installed SCons library modules into %s" % self.install_dir
- Installed.append(msg)
-
-class install_scripts(_install_scripts):
- def finalize_options(self):
- _install_scripts.finalize_options(self)
- if force_to_usr_local(self):
- self.install_dir = '/usr/local/bin'
- self.build_dir = os.path.join('build', 'scripts')
- msg = "Installed SCons scripts into %s" % self.install_dir
- Installed.append(msg)
-
- def do_nothing(self, *args, **kw):
- pass
-
- def hardlink_scons(self, src, dst, ver):
- try: os.unlink(dst)
- except OSError: pass
- os.link(ver, dst)
-
- def symlink_scons(self, src, dst, ver):
- try: os.unlink(dst)
- except OSError: pass
- os.symlink(os.path.split(ver)[1], dst)
-
- def copy_scons(self, src, dst, *args):
- try: os.unlink(dst)
- except OSError: pass
- self.copy_file(src, dst)
- self.outfiles.append(dst)
-
- def run(self):
- # --- distutils copy/paste ---
- if not self.skip_build:
- self.run_command('build_scripts')
- # --- /distutils copy/paste ---
-
- # Custom SCons installation stuff.
- if Options.hardlink_scons:
- create_basename_script = self.hardlink_scons
- elif Options.symlink_scons:
- create_basename_script = self.symlink_scons
- elif Options.install_scons_script:
- create_basename_script = self.copy_scons
- else:
- create_basename_script = self.do_nothing
-
- if Options.install_version_script:
- create_version_script = self.copy_scons
- else:
- create_version_script = self.do_nothing
-
- inputs = self.get_inputs()
- bat_scripts = [x for x in inputs if x[-4:] == '.bat']
- non_bat_scripts = [x for x in inputs if x[-4:] != '.bat']
-
- self.outfiles = []
- self.mkpath(self.install_dir)
-
- for src in non_bat_scripts:
- base = os.path.basename(src)
- scons = os.path.join(self.install_dir, base)
- scons_ver = scons + '-' + Version
- if is_win32:
- scons += '.py'
- scons_ver += '.py'
- create_version_script(src, scons_ver)
- create_basename_script(src, scons, scons_ver)
-
- if Options.install_bat:
- if is_win32:
- bat_install_dir = get_scons_prefix(self.install_dir, is_win32)
- else:
- bat_install_dir = self.install_dir
- for src in bat_scripts:
- scons_bat = os.path.join(bat_install_dir, 'scons.bat')
- scons_version_bat = os.path.join(bat_install_dir,
- 'scons-' + Version + '.bat')
- self.copy_scons(src, scons_bat)
- self.copy_scons(src, scons_version_bat)
-
- # --- distutils copy/paste ---
- if os.name == 'posix':
- # Set the executable bits (owner, group, and world) on
- # all the scripts we just installed.
- for file in self.get_outputs():
- if self.dry_run:
- # log.info("changing mode of %s", file)
- pass
- else:
- # Use symbolic versions of permissions so this script doesn't fail to parse under python3.x
- exec_and_read_permission = stat.S_IXOTH | stat.S_IXUSR | stat.S_IXGRP | stat.S_IROTH | stat.S_IRUSR | stat.S_IRGRP
- mode_mask = 4095 # Octal 07777 used because python3 has different octal syntax than python 2
- mode = ((os.stat(file)[stat.ST_MODE]) | exec_and_read_permission) & mode_mask
- # log.info("changing mode of %s to %o", file, mode)
- os.chmod(file, mode)
- # --- /distutils copy/paste ---
-
-class build_scripts(_build_scripts):
- def finalize_options(self):
- _build_scripts.finalize_options(self)
- self.build_dir = os.path.join('build', 'scripts')
-
-class install_data(_install_data):
- def initialize_options(self):
- _install_data.initialize_options(self)
- def finalize_options(self):
- _install_data.finalize_options(self)
- if force_to_usr_local(self):
- self.install_dir = '/usr/local'
- if Options.install_man:
- if is_win32:
- dir = 'Doc'
- else:
- dir = os.path.join('man', 'man1')
- self.data_files = [(dir, man_pages)]
- man_dir = os.path.join(self.install_dir, dir)
- msg = "Installed SCons man pages into %s" % man_dir
- Installed.append(msg)
- else:
- self.data_files = []
-
-description = "Open Source next-generation build tool."
-
-long_description = """Open Source next-generation build tool.
-Improved, cross-platform substitute for the classic Make
-utility. In short, SCons is an easier, more reliable
-and faster way to build software."""
-
-scripts = [
- 'script/scons',
- 'script/sconsign',
- 'script/scons-time',
-
- # We include scons.bat in the list of scripts, even on UNIX systems,
- # because we provide an option to allow it be installed explicitly,
- # for example if you're installing from UNIX on a share that's
- # accessible to Windows and you want the scons.bat.
- 'script/scons.bat',
-]
-
-arguments = {
- 'name' : "scons",
- 'version' : Version,
- 'description' : description,
- 'long_description' : long_description,
- 'author' : 'Steven Knight',
- 'author_email' : 'knight@baldmt.com',
- 'url' : "http://www.scons.org/",
- 'packages' : ["SCons",
- "SCons.compat",
- "SCons.Node",
- "SCons.Options",
- "SCons.Platform",
- "SCons.Scanner",
- "SCons.Script",
- "SCons.Tool",
- "SCons.Tool.docbook",
- "SCons.Tool.MSCommon",
- "SCons.Tool.packaging",
- "SCons.Variables",
- ],
- 'package_dir' : {'' : 'engine',
- 'SCons.Tool.docbook' : 'engine/SCons/Tool/docbook'},
- 'package_data' : {'SCons.Tool.docbook' : ['docbook-xsl-1.76.1/*',
- 'docbook-xsl-1.76.1/common/*',
- 'docbook-xsl-1.76.1/docsrc/*',
- 'docbook-xsl-1.76.1/eclipse/*',
- 'docbook-xsl-1.76.1/epub/*',
- 'docbook-xsl-1.76.1/epub/bin/*',
- 'docbook-xsl-1.76.1/epub/bin/lib/*',
- 'docbook-xsl-1.76.1/epub/bin/xslt/*',
- 'docbook-xsl-1.76.1/extensions/*',
- 'docbook-xsl-1.76.1/fo/*',
- 'docbook-xsl-1.76.1/highlighting/*',
- 'docbook-xsl-1.76.1/html/*',
- 'docbook-xsl-1.76.1/htmlhelp/*',
- 'docbook-xsl-1.76.1/images/*',
- 'docbook-xsl-1.76.1/images/callouts/*',
- 'docbook-xsl-1.76.1/images/colorsvg/*',
- 'docbook-xsl-1.76.1/javahelp/*',
- 'docbook-xsl-1.76.1/lib/*',
- 'docbook-xsl-1.76.1/manpages/*',
- 'docbook-xsl-1.76.1/params/*',
- 'docbook-xsl-1.76.1/profiling/*',
- 'docbook-xsl-1.76.1/roundtrip/*',
- 'docbook-xsl-1.76.1/slides/browser/*',
- 'docbook-xsl-1.76.1/slides/fo/*',
- 'docbook-xsl-1.76.1/slides/graphics/*',
- 'docbook-xsl-1.76.1/slides/graphics/active/*',
- 'docbook-xsl-1.76.1/slides/graphics/inactive/*',
- 'docbook-xsl-1.76.1/slides/graphics/toc/*',
- 'docbook-xsl-1.76.1/slides/html/*',
- 'docbook-xsl-1.76.1/slides/htmlhelp/*',
- 'docbook-xsl-1.76.1/slides/keynote/*',
- 'docbook-xsl-1.76.1/slides/keynote/xsltsl/*',
- 'docbook-xsl-1.76.1/slides/svg/*',
- 'docbook-xsl-1.76.1/slides/xhtml/*',
- 'docbook-xsl-1.76.1/template/*',
- 'docbook-xsl-1.76.1/tests/*',
- 'docbook-xsl-1.76.1/tools/bin/*',
- 'docbook-xsl-1.76.1/tools/make/*',
- 'docbook-xsl-1.76.1/webhelp/*',
- 'docbook-xsl-1.76.1/webhelp/docs/*',
- 'docbook-xsl-1.76.1/webhelp/docs/common/*',
- 'docbook-xsl-1.76.1/webhelp/docs/common/css/*',
- 'docbook-xsl-1.76.1/webhelp/docs/common/images/*',
- 'docbook-xsl-1.76.1/webhelp/docs/common/jquery/*',
- 'docbook-xsl-1.76.1/webhelp/docs/common/jquery/theme-redmond/*',
- 'docbook-xsl-1.76.1/webhelp/docs/common/jquery/theme-redmond/images/*',
- 'docbook-xsl-1.76.1/webhelp/docs/common/jquery/treeview/*',
- 'docbook-xsl-1.76.1/webhelp/docs/common/jquery/treeview/images/*',
- 'docbook-xsl-1.76.1/webhelp/docs/content/*',
- 'docbook-xsl-1.76.1/webhelp/docs/content/search/*',
- 'docbook-xsl-1.76.1/webhelp/docs/content/search/stemmers/*',
- 'docbook-xsl-1.76.1/webhelp/docsrc/*',
- 'docbook-xsl-1.76.1/webhelp/template/*',
- 'docbook-xsl-1.76.1/webhelp/template/common/*',
- 'docbook-xsl-1.76.1/webhelp/template/common/css/*',
- 'docbook-xsl-1.76.1/webhelp/template/common/images/*',
- 'docbook-xsl-1.76.1/webhelp/template/common/jquery/*',
- 'docbook-xsl-1.76.1/webhelp/template/common/jquery/theme-redmond/*',
- 'docbook-xsl-1.76.1/webhelp/template/common/jquery/theme-redmond/images/*',
- 'docbook-xsl-1.76.1/webhelp/template/common/jquery/treeview/*',
- 'docbook-xsl-1.76.1/webhelp/template/common/jquery/treeview/images/*',
- 'docbook-xsl-1.76.1/webhelp/template/content/search/*',
- 'docbook-xsl-1.76.1/webhelp/template/content/search/stemmers/*',
- 'docbook-xsl-1.76.1/webhelp/xsl/*',
- 'docbook-xsl-1.76.1/website/*',
- 'docbook-xsl-1.76.1/xhtml/*',
- 'docbook-xsl-1.76.1/xhtml-1_1/*',
- 'utils/*']},
- 'data_files' : [('man/man1', man_pages)],
- 'scripts' : scripts,
- 'cmdclass' : {'install' : install,
- 'install_lib' : install_lib,
- 'install_data' : install_data,
- 'install_scripts' : install_scripts,
- 'build_scripts' : build_scripts}
-}
-
-distutils.core.setup(**arguments)
-
-if Installed:
- for i in Installed:
- print(i)
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/Announce.txt b/3rdParty/SCons/scons-3.0.1/Announce.txt
new file mode 100644
index 0000000..b5c6636
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/Announce.txt
@@ -0,0 +1,1270 @@
+
+
+ SCons - a software construction tool
+
+ Release Notes
+
+
+This is SCons, a tool for building software (and other files). SCons is
+implemented in Python, and its "configuration files" are actually Python
+scripts, allowing you to use the full power of a real scripting language
+to solve build problems. You do not, however, need to know Python to
+use SCons effectively.
+
+Please go to http://scons.org/pages/download.html to get the latest production
+release of SCons.
+
+So that everyone using SCons can help each other learn how to use it more
+effectively, please go to http://scons.org/lists.html#users to sign up for
+the scons-users mailing list.
+
+RELEASE 3.0.1 - Mon, 12 Nov 2017 15:31:33 -0700
+
+ Please consult the RELEASE.txt file for a summary of changes since the last
+ release and consult the CHANGES.txt file for complete a list of changes
+ since last release. This announcement highlights only the important
+ changes.
+ Please note the following important changes since release 2.5.1:
+
+ This is the initial release supporting both python 3.5+ and 2.7.x and pypy
+ There are some important changes:
+
+ - Any print statements must now use python 3 syntax of "print()"
+ - All node content should be in bytes. This is the default in python 2.7.x,
+ in Python 3 all strings are by default unicode. byte and/or bytearray
+ should be used if you construct content for return by a custom node type's
+ get_content() method.
+ - There are some (as yet unresolved issue) using Literal()'s in some context with
+ Python 3
+ - pypy should be supported, please report any issues to the user's mailing list.
+ - Currently if you switch back and forth between python 2.7.x and 3.5+ you will
+ need to remove your sconsign file. This should be resolves shortly, but
+ regardless switching between python 2.7.x and 3.5+ will not use compatible
+ sconsigns and as such incremental builds should be expected to rebuild
+ anything changed since the previous scons run with the same version of python.
+ - It is likely that migrating from 2.5.1 -> 3.0.0 alpha will cause rebuilds due
+ to the significant number of changes in the codebase.
+
+ - Removed deprecated tools CVS, Perforce, BitKeeper, RCS, SCCS, Subversion.
+ - Removed deprecated module SCons.Sig
+ - See CHANGES.txt for more details on other changes
+ - 3.0.0 should be slightly faster than 2.5.1. Changes yielded a 15% speed up for
+ null incremental builds.
+ - Updated D language scanner support to latest: 2.071.1.
+ - python -m SCons should now run SCons if it's installed PYTHONPATH
+
+
+ Please note the following important changes since release 2.4.1:
+ We're enhancing implicit language scanning functionality to improve
+ correctness. SCons now honors scanner keys for implicit dependencies
+ and correctly changes scanner type (if necessary) when traversing
+ implicit dependency trees.
+
+ This enhancement resolves missing dependencies
+ with built-in scanners including SWIG (#2264) and QT:
+ * http://scons.tigris.org/issues/show_bug.cgi?id=2264
+
+ - This enhancement broadens the horizon for handling heterogeneous
+ data flow environments (E.G. software builds):
+ - http://article.gmane.org/gmane.comp.programming.tools.scons.user/26596
+
+ - SCons may find new (and correct) dependencies in cross-langauge contexts.
+ - Update may cause rebuilds, especially in heterogeneous data environments.
+ - Update may find previously missed dependencies errors (E.G. cycles).
+ - Discovered in some QT test cases.
+ - SCons handles the SCANNERS variable differently.
+ - Previously, the Install builder would scan implicit dependencies for
+ a scanner found in SCANNERS (but not for built-in scanners), but now
+ the Install builder will not scan recursively regardless in order
+ to optimize Install behaviour and bring orthogonality to previous behaviour.
+
+ - SCons handles cache directories a bit differently/
+ - Cache files are now stored in 256 subdirectories in the cache directory by
+ default (this stresses NFS less). Existing cache directories will remain as
+ current, but SCons will prompt you to run scons-configure-cache which will
+ allow you to migrate to the new layout, or confirm you want to use the
+ existing layout.
+
+ - New external tool scons-configurecache which allows some configuration of
+ how files in the cache are controlled.
+
+ Please note the following important changes since release 2.4.0:
+ - Fix to swig tool - pick-up 'swig', 'swig3.0' and 'swig2.0' (in order).
+ - Fix to swig tool - respect env['SWIG'] provided by user.
+ - Fix for Bug # 2791 - Setup.py fails unnecessarily under Jython.
+ - Fixed license of SVG titlepage files in the context of Debian
+ packaging, such that they allow for commercial use too (#2985).
+ - InstallVersionedLib now available in the DefaultEnvironment context.
+ - Improves orthogonality of use cases between different Install functions.
+ - Added new configure check, CheckProg, to check for
+ existence of a program.
+ - Fix for issue #2840 - Fix for two environments specifying same target with different
+ actions not throwing hard error. Instead SCons was incorrectly issuing a warning
+ and continuing.
+ - Add support `Microsoft Visual C++ Compiler for Python 2.7'
+ Compiler can be obtained at: https://www.microsoft.com/en-us/download/details.aspx?id=44266
+ - Fixed tigris issue #3011: Glob() excludes didn't work when used with VariantDir(duplicate=0)
+ - Fix bug 2831 and allow Help() text to be appended to AddOption() help.
+ - Reimplemented versioning for shared libraries, with the following effects
+ - Fixed tigris issues #3001, #3006.
+ - Fixed several other issues not reported to tigris, including:
+ issues with versioned libraries in subdirectories with tricky names,
+ issues with versioned libraries and variant directories,
+ issue with soname not being injected to library when using D linkers,
+ - Switched to direct symlinks instead of daisy-chained ones -- soname and
+ development symlinks point directly to the versioned shared library now),
+ for rationale see:
+ https://www.debian.org/doc/debian-policy/ch-sharedlibs.html
+ https://fedoraproject.org/wiki/Packaging:Guidelines#Devel_Packages
+ https://bitbucket.org/scons/scons/pull-requests/247/new-versioned-libraries-gnulink-cyglink/diff#comment-10063929
+ - New construction variables to allow override default behavior: SONAME,
+ SHLIBVERSIONFLAGS, _SHLIBVERSIONFLAGS, SHLIBNOVERSIONSYMLINKS,
+ LDMODULEVERSION, LDMODULEVERSIONFLAGS, _LDMODULEVERSIONFLAGS,
+ LDMODULENOVERSIONSYMLINKS.
+ - Changed logic used to configure the versioning machinery from
+ platform-centric to linker-oriented.
+ - The SHLIBVERSION/LDMODULEVERSION variables are no longer validated by
+ SCons (more freedom to users).
+ - InstallVersionedLib() doesn't use SHLIBVERSION anymore.
+ - Enchanced docs for the library versioning stuff.
+ - New tests for versioned libraries.
+ - Library versioning is currently implemented for the following linker
+ tools: 'cyglink', 'gnulink', 'sunlink'.
+
+ Please note the following important changes since release 2.3.6:
+ - Switch several core classes to use "slots" to reduce memory
+ usage. (PR #2180, #2178, #2198)
+
+ Please note the following important changes since release 2.3.5:
+ - Support for Visual Studio 2015
+
+ Please note the following important changes since release 2.3.4:
+ - Documentation fixes for libraries.xml and
+ builders-writing.xml (#2989 and #2990)
+ - Extended docs for InstallVersionedLib/SharedLibrary,
+ and added SKIP_WIN_PACKAGES argument to build script
+ bootstrap.py (PR #230, #3002).
+ - Fixed symlink support (PR #227, #2395).
+ - Updated debug-count test case (PR #229).
+ - Fixed incomplete LIBS flattening and substitution in
+ Program scanner(PR #205, #2954).
+ - Added new method rentry_exists_on_disk to Node.FS (PR #193).
+ - Fixed several D tests under the different OS.
+ - Add support for f08 file extensions for Fortran 2008 code.
+ - Show --config choices if no argument is specified (PR #202).
+ - Fixed build crash when XML toolchain isn't installed, and
+ activated compression for ZIP archives.
+ - Fix for VersionedSharedLibrary under 'sunos' platform.
+ - Fixed dll link with precompiled headers on MSVC 2012
+ - Added an 'exclude' parameter to Glob()
+ - Support for multiple cmdargs (one per variant) in VS project files.
+ - Various improvements for TempFileMunge class.
+ - Added an implementation for Visual Studio users files (PR #209).
+ - Added support for the 'PlatformToolset' tag in VS project files (#2978).
+ - Added support for '-isystem' to ParseFlags.
+
+
+ Please note the following important changes since release 2.3.3:
+
+ -- Fix for EnsureSConsVersion regression in 2.3.3.
+
+ -- Fix for interactive mode with Configure contexts
+
+ Please note the following important changes since release 2.3.2:
+
+ -- On Windows, .def files did not work as sources to shared
+ libraries or executables, due to a regression which is
+ corrected in 2.3.3.
+
+ Please note the following important changes since release 2.3.0:
+
+ -- BitKeeper, CVS, Perforce, RCS, SCCS are deprecated from the
+ default toolset and will be removed from the default toolset
+ in future SCons versions to speed up SCons initialization.
+ The tools themselves continue to be supported.
+
+ -- Support for Visual Studio 12.0Exp and 2013
+
+ -- Revamp of D language support, focusing on D v2.
+ D v1 is now deprecated.
+
+ -- Fixed NoClean() for multi-target builders.
+
+ -- RPM and m4 are no longer in the default toolset on Windows.
+ Should improve startup speed.
+
+ -- TeX fixes: -synctex=1 and cleaning auxiliary files.
+
+ -- Fixes to the Docbook tool.
+
+ Please note the following important changes since release 2.3.0:
+
+ -- Fix failure to relink when LINKCOM or libs change, introduced in
+ 2.3.0.
+
+ -- Fix MSVC defaulting TARGET_ARCH to HOST_ARCH and other MSVC
+ issues.
+
+ -- Reduced memory consumption in large builds, which should speed
+ them up as well.
+
+ -- Add new cyglink linker for use with cygwin.
+
+ -- Fix leaking file handles to subprocesses
+
+ -- Support read-only cache (--cache-readonly)
+
+ -- Add Pseudo command to mark targets that shouldn't exist after building
+
+ Please note the following important changes since release 2.2.0:
+
+ -- SUPPORT FOR PYTHON VERSIONS BEFORE 2.7 IS NOW DEPRECATED
+
+ ***IMPORTANT***: This release is the last version of SCons to support
+ Python versions older than 2.7. This release will warn if you are
+ running on Python 2.6 or older; future releases will probably not
+ work at all, as we are moving toward supporting Python 3.
+ Use --warn=no-python-version to suppress the warning if needed.
+
+ -- A lot of python pre-2.4 compatibility code was removed
+ in this release. 2.4 is the official floor for SCons,
+ but this release will likely enforce it more rigidly.
+
+ -- Spawning subprocesses on Windows should now be more reliable with -jN
+
+ -- MSVC10 and MSVC11 support improved, and fixed MSVS11 solution generation.
+
+ -- Various TeX/LaTeX builder improvements
+
+ -- Support for versioned shared libs on Linux and Mac, via
+ SHLIBVERSION and InstallVersionedLib.
+
+ -- WiX builder updates
+
+ Please note the following important changes since release 2.1.0:
+
+ -- New gettext toolset for internationalization
+
+ -- Support for Visual Studio 11
+
+ -- Support for Intel C/C++ compiler v12 on Linux and Mac
+
+ -- LaTeX support for multibib, biblatex and biber
+
+ Please note the following important changes since release 2.0.0:
+
+ -- Support for Windows manifest generation
+
+ -- SCons now searches sitewide dirs for site_scons
+
+ -- Support for Latex bibunits package has been added along with
+ support for tex files generated by other builders
+
+
+ Please note the following important changes since release 1.3.0:
+
+ -- SUPPORT FOR PYTHON VERSIONS PRIOR TO 2.4 HAS BEEN REMOVED
+
+ Although SCons is still tested with Python 2.3, use of Python
+ versions prior to 2.4 is deprecated.
+
+ -- DEPRECATED FEATURES WILL GENERATE MANDATORY WARNINGS IN 2.0.0
+
+ In keeping with our deprecation cycle, the following deprecated
+ features will still be supported in 2.0.0 but will generate
+ mandatory, non-disableable warnings:
+
+ -- The overrides= keyword argument to the Builder() call.
+ -- The scanner= keyword argument to the Builder() call.
+ -- The BuildDir() function and env.BuildDir() method.
+ -- The env.Copy() method.
+ -- The SourceSignatures() function and
+ env.SourceSignatures() method.
+ -- The TargetSignatures() function and
+ env.TargetSignatures() method.
+ -- The Sig module (now an unnused stub).
+ -- The --debug=dtree, --debug=stree and --debug=tree options.
+ -- The --debug=nomemoizer option.
+ -- The Options object and the related BoolOption(),
+ EnumOption(), ListOption(), PackageOption() and
+ PathOption() functions.
+
+ The mandatory warnings will be issued in order to make sure
+ users of 1.3.0 notice *prior* to the release of SCons 2.0.0, that
+ these features will be removed. In SCons 2.0.0 these features
+ will no longer work at all, and will instead generate specific
+ fatal errors when anyone tries to use them.
+
+ Please note the following important changes since release 1.2.0:
+
+ -- MICROSOFT VISUAL STUDIO VERSION/ARCH DETECTION HAS CHANGED
+
+ The way SCons detects Visual Studio on Windows has changed in
+ 1.3. By default, it should now use the latest installed
+ Visual Studio version on your machine, and compile for 32 or
+ 64 bits according to whether your OS is 32 or 64 bits (32/64
+ bit Python makes no difference).
+
+ Two new variables control Visual Studio: MSVC_VERSION and
+ TARGET_ARCH. These variables ONLY take effect when passed to
+ the Environment() constructor; setting them later has no
+ effect. To use a non-default Visual Studio version, set
+ MSVC_VERSION to e.g. "8.0" or "7.1". Setting it to "xxx" (or
+ any nonexistent value) will make it print out the valid
+ versions on your system. To use a non-default architecture,
+ set TARGET_ARCH to "x86" or "x86_64" (various synonyms are
+ accepted).
+
+ Note that if you use MSVS_VERSION to build Visual Studio
+ projects from your SConstructs, MSVS_VERSION must be set to
+ the same version as MSVC_VERSION.
+
+ Support for HOST_OS,HOST_ARCH,TARGET_OS, TARGET_ARCH has been
+ added to allow specifying different target arch than the host
+ system. This is only supported for Visual Studio/Visual C++
+ at this time.
+
+ -- Support for Latex glossaries and acronyms has been added
+
+ -- VISUAL C/C++ PRECOMPILED HEADERS WILL BE REBUILT
+
+ Precompiled header files built with Visual C/C++ will be
+ rebuilt after upgrading from 1.2.0 to a later release.
+
+ This rebuild is normal and will occur because the command line
+ defined by the $PCHCOM construction variable has had the $CCFLAGS
+ variable added, and has been rearranged to put the "/Fo" output
+ flag towards the beginning of the line, consistent with the
+ related command lines for $CCCOM, $CXXCOM, etc.
+
+ -- CHANGES TO SOME LINKER COMMAND LINES WILL CAUSE RELINKING
+
+ Changes to the command line definitions for the Microsoft link.exe
+ linker, the OS/2 ilink linker and the Phar Lap linkloc linker
+ will cause targets built with those tools be to be rebuilt after
+ upgrading from 1.2.0 to a later release.
+
+ This relink is normal and will occur because the command lines for
+ these tools have been redefined to remove unnecessary nested $(
+ and $) character strings.
+
+ -- MSVS_USE_MFC_DIRS and MSVS_IGNORE_IDE_PATHS are obsoleted and
+ have no effect.
+
+ Please note the following important changes since release 1.1.0:
+
+ -- THE $CHANGED_SOURCES, $CHANGED_TARGETS, $UNCHANGED_SOURCES
+ AND $UNCHANGED_TARGETS VARIABLES WILL BECOME RESERVED
+
+ A future release (probably 1.3.0) will make the construction
+ variable names $CHANGED_SOURCES, $CHANGED_TARGETS,
+ $UNCHANGED_SOURCES and $UNCHANGED_TARGETS into reserved
+ construction variable names controlled by SCons itself (like
+ the current $SOURCE, $TARGETS, etc.).
+
+ Setting these variable names in the current release will generate
+ a warning but still set the variables. When they become reserved
+ variable names, they will generate a different warning message
+ and attempts to set these variables will be ignored.
+
+ SCons configurations that happen to use these variable names
+ should be changed to use different variable names, in order
+ to ensure that the configuration continues to work with future
+ versions of SCons.
+
+ -- THE Options OBJECT AND RELATED FUNCTIONS NOW GENERATE WARNINGS
+
+ Use of the Options object, and related functions BoolOption(),
+ EnumOption(), ListOption(), PackageOption() and PathOption()
+ were announced as deprecated in release 0.98.1. Since then,
+ however, no warning messages were ever implemented for the
+ use of these deprecated functions.
+
+ By default, release 1.2.0 prints warning messages when these
+ deprecated features are used. Warnings about all deprecated
+ features may be suppressed by using the --warn=no-deprecated
+ command-line option:
+
+ $ scons --warn=no-deprecated
+
+ Or by using the appropriate SetOption() call in any SConscript
+ file:
+
+ SetOption('warn', 'no-deprecated')
+
+ You may optionally disable just warnings about the deprecation
+ of the Options object and its related functions as follows:
+
+ SetOption('warn', 'no-deprecated-options')
+
+ The current plan is for these warnings to become mandatory
+ (non-suppressible) in release 1.3.0, and for the use of Options
+ and its related functions to generate errors in release 2.0.
+
+ Please note the following important changes since release 0.98.4:
+
+ -- scons.bat NOW RETURNS THE REAL SCONS EXIT STATUS
+
+ The scons.bat script shipped with SCons used to exit with
+ a status of 1 when it detected any failed (non-zero) exit
+ status from the underlying Python execution of SCons itself.
+ The scons.bat script now exits with the actual status
+ returned by SCons.
+
+ -- SCONS NOW WARNS WHEN TRYING TO LINK C++ AND FORTRAN OBJECT FILES
+
+ Some C++ toolchains do not understand Fortran runtimes and create
+ unpredictable executables when linking C++ and Fortran object
+ files together. SCons now issues a warning if you try to link
+ C++ and Fortran object files into the same executable:
+
+ scons: warning: Using $CXX to link Fortran and C++ code together.
+ This may generate a buggy executable if the '/usr/bin/gcc'
+ compiler does not know how to deal with Fortran runtimes.
+
+ The warning may be suppressed with either the --warning=no-link
+ or --warning=no-fortran-cxx-mix command line options, or by
+ adding either of the following lines to a SConscript file:
+
+ SetOption('warn', 'no-link')
+ SetOption('warn', 'no-fortran-cxx-mix')
+
+ Please note the following important changes since release 0.98:
+
+ -- SCONS NO LONGER SETS THE GNU TOOLCHAIN -fPIC FLAG IN $SHCXXFLAGS
+
+ The GNU toolchain support in previous versions of SCons would
+ add the -fPIC flag to the $SHCXXFLAGS construction variable.
+ The -fPIC flag has now been removed from the default
+ $SHCXXFLAGS setting. Instead, the $SHCXXCOM construction variable
+ (the default SCons command line for compiling shared objects
+ from C++ source files) has been changed to add the $SHCCFLAGS
+ variable, which contains the -fPIC flag.
+
+ This change was made in order to make the behavior of the default
+ C++ compilation line including $SHCCFLAGS consistent with the
+ default C compilation line including $CCFLAGS.
+
+ This change should have no impact on configurations that use
+ the default $SHCXXCOM command line. It may have an impact on
+ configurations that were using the default $SHCXXFLAGS value
+ *without* the $SHCCFLAGS variable to get the -fPIC flag into a
+ custom command line. You can fix these by adding the $SHCCFLAGS
+ to the custom command line.
+
+ Adding $SHCCFLAGS is backwards compatible with older SCons
+ releases, although it might cause the -fPIC flag to be repeated
+ on the command line if you execute it on an older version of
+ SCons that sets -fPIC in both the $SHCCLAFGS and $SHCXXFLAGS
+ variables. Duplicating the -fPIC flag on the g++ command line
+ will not cause any compilation problems, but the change to the
+ command line may cause SCons to rebuild object files.
+
+ -- FORTRAN NOW COMPILES .f FILES WITH gfortran BY DEFAULT
+
+ The Fortran Tool modules have had a major overhaul with the intent
+ of making them work as-is for most configurations. In general,
+ most configurations that use default settings should not see
+ any noticeable difference.
+
+ One configuration that has changed is if you have both a gfortran
+ and g77 compiler installed. In this case, previous versions of
+ SCons would, by default, use g77 by default to compile files with
+ a .f suffix, while SCons 0.98.1 will use the gfortran compiler
+ by default. The old behavior may be preserved by explicitly
+ initializing construction environments with the 'g77' Tool module:
+
+ env = Environment(tools = ['g77', 'default'])
+
+ The above code is backwards compatible to older versions of SCons.
+
+ If you notice any other changes in the behavior of default
+ Fortran support, please let us know so we can document them in
+ these release notes for other users.
+
+ Please note the following important changes since release 0.97.0d20071212:
+
+ -- SUPPORT FOR PYTHON VERSIONS BEFORE 2.2 IS NOW DEPRECATED
+
+ SCons now prints the following warning when it is run by any
+ Python 1.5, 2.0 or 2.1 release or sub-release:
+
+ scons: warning: Support for pre-2.2 Python (VERSION) is deprecated.
+ If this will cause hardship, contact scons-dev@scons.org
+
+ You may disable all warnings about deprecated features by adding
+ the option "--warn=no-deprecated" to the command line or to the
+ $SCONSFLAGS environment variable:
+
+ $ scons --warn=no-deprecated
+
+ Using '--warn=no-deprecated' is compatible with earlier versions
+ of SCons.
+
+ You may also, as of this version of SCons, disable all warnings
+ about deprecated features by adding the following to any
+ SConscript file:
+
+ SetOption('warn', 'no-deprecated')
+
+ You may disable only the specific warning about running under
+ a deprecated Python version by adding the following to any
+ SConscript file:
+
+ SetOption('warn', 'no-python-version')
+
+ The warning may also be suppressed on the command line:
+
+ $ scons --warn=no-python-version
+
+ Or by specifying the --warn=no-python-version option in the
+ $SCONSFLAGS environment variable.
+
+ Using SetOption('warn', ...), and the 'no-python-version'
+ command-line option for suppressing this specific warning,
+ are *not* backwards-compatible to earlier versions of SCons.
+
+ -- THE env.Copy() METHOD IS NOW OFFICIALLY DEPRECATED
+
+ The env.Copy() method is now officially deprecated and will
+ be removed in a future release. Using the env.Copy() method
+ now generates the following message:
+
+ scons: warning: The env.Copy() method is deprecated; use the env.Clone() method instead.
+
+ You may disable all warnings about deprecated features by adding
+ the option "--warn=no-deprecated" to the command line or to the
+ $SCONSFLAGS environment variable:
+
+ $ scons --warn=no-deprecated
+
+ Using '--warn=no-deprecated' is compatible with earlier versions
+ of SCons.
+
+ You may also, as of this version of SCons, disable all warnings
+ about deprecated features by adding the following to any
+ SConscript file:
+
+ SetOption('warn', 'no-deprecated')
+
+ You may disable only the specific warning about the deprecated
+ env.Copy() method by adding the following to any SConscript
+ file:
+
+ SetOption('warn', 'no-deprecated-copy')
+
+ The warning may also be suppressed on the command line:
+
+ $ scons --warn=no-deprecated-copy
+
+ Or by specifying the --warn=no-deprecated-copy option in the
+ $SCONSFLAGS environment variable.
+
+ Using SetOption('warn', ...), and the 'no-deprecated-copy'
+ command-line option for suppressing this specific warning,
+ are *not* backwards-compatible to earlier versions of SCons.
+
+ -- THE --debug=dtree, --debug=stree AND --debug=tree OPTIONS ARE DEPRECATED
+
+ The --debug=dtree, --debug=stree and --debug=tree methods
+ are now officially deprecated and will be removed in a
+ future release. Using these options now generate a warning
+ message recommending use of the --tree=derived, --tree=all,status
+ and --tree=all options, respectively.
+
+ You may disable these warnings, and all warnings about
+ deprecated features, by adding the option "--warn=no-deprecated"
+ to the command line or to the $SCONSFLAGS environment
+ variable:
+
+ $ scons --warn=no-deprecated
+
+ Using '--warn=no-deprecated' is compatible with earlier versions
+ of SCons.
+
+ -- THE TargetSignatures() AND SourceSignatures() FUNCTIONS ARE DEPRECATED
+
+ The TargetSignatures() and SourceSignatures() functions,
+ and their corresponding env.TargetSignatures() and
+ env.SourceSignatures() methods, are now officially deprecated
+ and will be be removed in a future release. Using ahy of
+ these functions or methods now generates a message
+ similar to the following:
+
+ scons: warning: The env.TargetSignatures() method is deprecated;
+ convert your build to use the env.Decider() method instead.
+
+ You may disable all warnings about deprecated features by adding
+ the option "--warn=no-deprecated" to the command line or to the
+ $SCONSFLAGS environment variable:
+
+ $ scons --warn=no-deprecated
+
+ Using '--warn=no-deprecated' is compatible with earlier versions
+ of SCons.
+
+ You may also, as of this version of SCons, disable all warnings
+ about deprecated features by adding the following to any
+ SConscript file:
+
+ SetOption('warn', 'no-deprecated')
+
+ You may disable only the specific warning about the use of
+ TargetSignatures() or SourceSignatures() by adding the
+ following to any SConscript file:
+
+ SetOption('warn', 'no-deprecated-target-signatures')
+ SetOption('warn', 'no-deprecated-source-signatures')
+
+ The warnings may also be suppressed on the command line:
+
+ $ scons --warn=no-deprecated-target-signatures --warn=no-deprecated-source-signatures
+
+ Or by specifying these options in the $SCONSFLAGS environment
+ variable.
+
+ Using SetOption('warn', ...), or the command-line options
+ for suppressing these warnings, is *not* backwards-compatible
+ to earlier versions of SCons.
+
+ -- File(), Dir() and Entry() NOW RETURN A LIST WHEN THE INPUT IS A SEQUENCE
+
+ Previously, if these methods were passed a list, the list was
+ substituted and stringified, then passed as a single string to
+ create a File/Dir/Entry Node. This rarely if ever worked with
+ more than one element in the list. They now return a list of
+ Nodes when passed a list.
+
+ One case that works differently now is a passing in a
+ single-element sequence; that formerly was stringified
+ (returning its only element) and then a single Node would be
+ returned. Now a single-element list containing the Node will
+ be returned, for consistency.
+
+ -- THE env.subst() METHOD NOW RETURNS A LIST WHEN THE INPUT IS A SEQUENCE
+
+ The env.subst() method now returns a list with the elements
+ expanded when given a list as input. Previously, the env.subst()
+ method would always turn its result into a string.
+
+ This behavior was changed because it interfered with being able
+ to include things like lists within the expansion of variables
+ like $CPPPATH and then have SCons understand that the elements
+ of the "internal" lists still needed to be treated separately.
+ This would cause a $CPPPATH list like ['subdir1', 'subdir']
+ to show up in a command line as "-Isubdir1 subdir".
+
+ -- THE Jar() BUILDER NOW USES THE Java() BUILDER CLASSDIR BY DEFAULT
+
+ By default, the Jar() Builder will now use the class directory
+ specified when the Java() builder is called. So the following
+ input:
+
+ classes = env.Java('classes', 'src')
+ env.Jar('out.jar', classes)
+
+ Will cause "-C classes" to be passed the "jar" command invocation,
+ and the Java classes in the "out.jar" file will not be prefixed
+ "classes/".
+
+ Explicitly setting the $JARCHDIR variable overrides this default
+ behavior. The old behavior of not passing any -C option to the
+ "jar" command can be preserved by explicitly setting $JARCHDIR
+ to None:
+
+ env = Environment(JARCHDIR = None)
+
+ The above setting is compatible with older versions of SCons.
+
+ Please note the following important changes since release 0.97.0d20070918:
+
+ -- SCons REDEFINES PYTHON open() AND file() ON Windows TO NOT PASS
+ ON OPEN FILE HANDLES TO CREATED PROCESSES
+
+ On Windows systems, SCons now redefines the Python open()
+ and file() functions so that, if the Python Win32 extensions
+ are available, the file handles for any opened files will *not*
+ be inherited by subprocesses, such as the spawned compilers and
+ other tools invoked to build the software.
+
+ This prevents certain race conditions where a file handle for
+ a file opened by Python (either in a Python function action,
+ or directly in a SConscript file) could be inherited and help
+ open by a subprocess, interfering with the ability of other
+ processes to create or modify the file.
+
+ In general, this should not cause problems for the vast majority
+ of configurations. The only time this would be a problem would be
+ in the unlikely event that a process spawned by SCons specifically
+ *expected* to use an inherited file handle opened by SCons.
+
+ If the Python Win32 extensions are not installed or are an
+ earlier version that does not have the ability to disable file
+ handle inheritance, SCons will print a warning message when the
+ -j option is used. The warning message may be suppressed by
+ specifying --warn=no-parallel-support.
+
+ Please note the following important changes since release 0.97.0d20070809:
+
+ -- "content" SIGNATURES ARE NOW THE DEFAULT BEHAVIOR
+
+ The default behavior of SCons is now to use the MD5 checksum of
+ all file contents to decide if any files have changed and should
+ cause rebuilds of their source files. This means that SCons may
+ decide not to rebuild "downstream" targets if a a given input
+ file is rebuilt to the exact same contents as the last time.
+ The old behavior may preserved by explicity specifying:
+
+ TargetSignatures("build")
+
+ In any of your SConscript files.
+
+ -- TARGETS NOW IMPLICITLY DEPEND ON THE COMMAND THAT BUILDS THEM
+
+ For all targets built by calling external commands (such as a
+ compiler or other utility), SCons now adds an implicit dependency
+ on the command(s) used to build the target.
+
+ This will cause rebuilds of all targets built by external commands
+ when running SCons in a tree built by previous version of SCons,
+ in order to update the recorded signatures.
+
+ The old behavior of not having targets depend on the external
+ commands that build them can be preserved by setting a new
+ $IMPLICIT_COMMAND_DEPENDENCIES construction variable to a
+ non-True value:
+
+ env = Environment(IMPLICIT_COMMAND_DEPENDENCIES = 0)
+
+ or by adding Ignore() calls for any targets where the behavior
+ is desired:
+
+ Ignore('/usr/bin/gcc', 'foo.o')
+
+ Both of these settings are compatible with older versions
+ of SCons.
+
+ -- CHANGING SourceSignature() MAY CAUSE "UNECESSARY" REBUILDS
+
+ If you change the SourceSignature() value from 'timestamp' to
+ 'MD5', SCons will now rebuild targets that were already up-to-date
+ with respect to their source files.
+
+ This will happen because SCons did not record the content
+ signatures of the input source files when the target was last
+ built--it only recorded the timestamps--and it must record them
+ to make sure the signature information is correct. However,
+ the content of source files may have changed since the last
+ timestamp build was performed, and SCons would not have any way to
+ verify that. (It would have had to open up the file and record
+ a content signature, which is one of the things you're trying to
+ avoid by specifying use of timestamps....) So in order to make
+ sure the built targets reflect the contents of the source files,
+ the targets must be rebuilt.
+
+ Change the SourceSignature() value from 'MD5' to 'timestamp'
+ should correctly not rebuild target files, because the timestamp
+ of the files is always recorded.
+
+ In previous versions of SCons, changing the SourceSignature()
+ value would lead to unpredictable behavior, usually including
+ rebuilding targets.
+
+ -- THE Return() FUNCTION NOW ACTUALLY RETURNS IMMEDIATELY
+
+ The Return() function now immediately stops processing the
+ SConscript file in which it appears and returns the values of the
+ variables named in its arguments. It used to continue processing
+ the rest of the SConscript file, and then return the values of the
+ specified variables at the point the Return() function was called.
+
+ The old behavior may be requested by adding a "stop=False"
+ keyword argument to the Return() call:
+
+ Return('value', stop=False)
+
+ The "stop=" keyword argument is *not* compatible with SCons
+ versions 0.97.0d20070809 or earlier.
+
+ Please note the following important changes since release 0.97:
+
+ -- env.CacheDir() NOW ONLY AFFECTS CONSTRUCTION ENVIRONMENT TARGETS
+
+ The env.CacheDir() method now only causes derived files to be
+ retrieved from the specified cache directory for targets built
+ with the specified specified construction environment ("env").
+
+ Previously, any call to env.CacheDir() or CacheDir() would modify
+ a global setting and cause all built targets to be retrieved
+ from the specified cache directory. This behavior was changed so
+ that env.CacheDir() would be consistent with other construction
+ environment methods, which only affect targets built with the
+ specified construction environment.
+
+ The old behavior of changing the global behavior may be preserved
+ by changing any env.CacheDir() calls to:
+
+ CacheDir('/path/to/cache/directory')
+
+ The above change is backwards-compatible and works in all earlier
+ versions of SCons that support CacheDir().
+
+ -- INTERPRETATION OF SUFFIX-LESS SOURCE ARGUMENTS HAS CHANGED
+
+ The interpretation of source arguments (files) without suffixes
+ has changed in one specific configuration.
+
+ Previously, if a Builder had a src_suffix specified (indicating
+ that source files without suffixes should have that suffix
+ appended), the suffix would only be applied to suffix-less source
+ arguments if the Builder did *not* have one or more attached
+ source Builders (that is, the Builder was not a "multi-stage"
+ Builder). So in the following configuration:
+
+ build_foo = Builder(src_suffix = '.foo')
+ build_bar = Builder(src_suffix = '.bar',
+ src_builder = build_bar)
+
+ env = Environment(BUILDERS = {
+ 'Foo' : build_foo,
+ 'Boo' : build_bar,
+ })
+
+ env.Foo('tgt1', 'src1')
+ env.Bar('tgt2', 'src2')
+
+ SCons would have expected to find a source file 'src1.foo' for the
+ env.Foo() call, but a source file 'src2' for the env.Bar() call.
+
+ This behavior has now been made consistent, so that the two
+ above calls would expect source files named 'src1.foo' and
+ 'src2.bar', respectively.
+
+ Note that, if genuinely desired, the old behavior of building
+ from a source file without a suffix at all (when the Builder has
+ a src_suffix *and* a src_builder) can be specified explicity by
+ turning the string into a File Node directly:
+
+ env.Bar('tgt2', File('src2'))
+
+ The above use of File() is backwards-compatible and will work
+ on earlier versions of SCons.
+
+ -- THE DEFAULT EXECUTION PATH FOR Solaris HAS CHANGED
+
+ On Solaris systems, SCons now adds the "/opt/SUNWspro/bin"
+ directory to the default execution $PATH variable before the
+ "/usr/ccs/bin" directory. This was done to reflect the fact
+ that /opt/SUNWspro/ is the default for SUN tools, but it may
+ cause a different compiler to be used if you have compilers
+ installed in both directories.
+
+ -- GENERATED config.h FILES NOW SAY "#define HAVE_{FEATURE} 1"
+
+ When generating a "config.h" file, SCons now defines values that
+ record the existence of a feature with a "1" value:
+
+ #define HAVE_FEATURE 1
+
+ Instead of printing the line without a "1", as it used to:
+
+ #define HAVE_FEATURE
+
+ This should not cause any problems in the normal use of "#ifdef
+ HAVE_{FEATURE}" statements interpreted by a C preprocessor, but
+ might cause a compatibility issue if a script or other utility
+ looks for an exact match of the previous text.
+
+ Please note the following planned, future changes:
+
+ -- THE Options OBJECT AND RELATED FUNCTIONS WILL BE DEPRECATED
+
+ The Options object is being replaced by a new Variables
+ object, which uses a new Variables.AddVariable() method
+ where the previous interface used Options.AddOptions().
+
+ Similarly, the following utility functions are being replaced
+ by the following similarly-named functions:
+
+ BoolOption() BoolVariable()
+ EnumOption() EnumVariable()
+ ListOption() ListVariable()
+ PackageOption() PackageVariable()
+ PathOption() PathVariable()
+
+ And also related, the options= keyword argument when creating
+ construction environments with the Environment() functions is
+ being replaced with a variables= keyword argument.
+
+ In some future release a deprecation warning will be added to
+ existing uses of the Options object, its methods, the above
+ utility functions, and the options= keyword argument of the
+ Environment() function. At some point after the deprecation
+ warning is added, the Options object, related functions and
+ options= keyword argument will be removed entirely.
+
+ You can prepare for this by changing all your uses of the Options
+ object and related functions to the Variables object and the new
+ function names, and changing any uses of the options= keyword
+ argument to variables=.
+
+ NOTE: CONVERTING TO USING THE NEW Variables OBJECT OR THE
+ RELATED *Variable() FUNCTIONS, OR USING THE NEW variable=
+ KEYWORD ARGUMENT, IS NOT BACKWARDS COMPATIBLE TO VERSIONS OF
+ SCons BEFORE 0.98. YOUR SConscript FILES WILL NOT WORK ON
+ EARLIER VERSIONS OF SCons AFTER MAKING THIS CHANGE.
+
+ If you change SConscript files in software that you make available
+ for download or otherwise distribute, other users may try to
+ build your software with an earlier version of SCons that does
+ not have the Variables object or related *Variable() functions.
+ We recommend preparing for this in one of two ways:
+
+ -- Make your SConscript files backwards-compatible by
+ modifying your calls with Python try:-except: blocks
+ as follows:
+
+ try:
+ vars = Variables('custom.py', ARGUMENTS)
+ vars.AddVariables(
+ BoolVariable('WARNINGS', 'cmopile with -Wall', 1),
+ EnumVariable('DEBUG', 'debug version', 'no'
+ allowed_values=('yes', 'no', 'full'),
+ map={}, ignorecase=0),
+ ListVariable('SHAREDLIBS',
+ 'libraries to build shared',
+ 'all',
+ names = list_of_libs),
+ PackageVariable('X11',
+ 'use X11 from here',
+ '/usr/bin/X11'),
+ PathVariable('QTDIR', 'root of Qt', qtdir),
+ )
+ except NameError:
+ vars = Options('custom.py', ARGUMENTS)
+ vars.AddOptions(
+ BoolOption('WARNINGS', 'cmopile with -Wall', 1),
+ EnumOption('DEBUG', 'debug version', 'no'
+ allowed_values=('yes', 'no', 'full'),
+ map={}, ignorecase=0),
+ ListOption('SHAREDLIBS',
+ 'libraries to build shared',
+ 'all',
+ names = list_of_libs),
+ PackageOption('X11',
+ 'use X11 from here',
+ '/usr/bin/X11'),
+ PathOption('QTDIR', 'root of Qt', qtdir),
+ )
+
+ Additionally, you can check for availability of the new
+ variables= keyword argument as follows:
+
+ try:
+ env = Environment(variables=vars)
+ except TypeError:
+ env = Environment(options=vars)
+
+ (Note that we plan to maintain the existing Options object
+ name for some time, to ensure backwards compatibility,
+ so in practice it may be easier to just continue to use
+ the old name until you're reasonably sure you won't have
+ people trying to build your software with versions of
+ SCons earlier than 0.98.1.)
+
+ -- Use the EnsureSConsVersion() function to provide a
+ descriptive error message if your SConscript files
+ are executed by an earlier version of SCons:
+
+ EnsureSConsVersion(0, 98, 1)
+
+ -- THE BuildDir() METHOD AND FUNCTION WILL BE DEPRECATED
+
+ The env.BuildDir() method and BuildDir() function are being
+ replaced by the new env.VariantDir() method and VariantDir()
+ function.
+
+ In some future release a deprecation warning will be added
+ to existing uses of the env.BuildDir() method and BuildDir()
+ function. At some point after the deprecation warning, the
+ env.Builder() method and BuildDir() function will either
+ be removed entirely or have their behavior changed.
+
+ You can prepare for this by changing all your uses of the
+ env.BuildDir() method to env.VariantDir() and uses of the
+ global BuildDir() function to VariantDir(). If you use a
+ named keyword argument of "build_dir" when calling
+ env.BuildDir() or BuildDir():
+
+ env.BuildDir(build_dir='opt', src_dir='src')
+
+ The keyword must be changed to "variant_dir":
+
+ env.VariantDir(variant_dir='opt', src_dir='src')
+
+ NOTE: CHANGING USES OF env.BuildDir() AND BuildDir() to
+ env.VariantDir() AND VariantDir() IS NOT BACKWARDS COMPATIBLE
+ TO VERSIONS OF SCons BEFORE 0.98. YOUR SConscript FILES
+ WILL NOT WORK ON EARLIER VERSIONS OF SCons AFTER MAKING
+ THIS CHANGE.
+
+ If you change SConscript files in software that you make
+ available for download or otherwise distribute, other users
+ may try to build your software with an earlier version of
+ SCons that does not have the env.VariantDir() method or
+ VariantDir() fnction. We recommend preparing for this in
+ one of two ways:
+
+ -- Make your SConscript files backwards-compatible by
+ including the following code near the beginning of your
+ top-level SConstruct file:
+
+ import SCons.Environment
+ try:
+ SCons.Environment.Environment.VariantDir
+ except AttributeError:
+ SCons.Environment.Environment.VariantDir = \
+ SCons.Environment.Environment.BuildDir
+
+ -- Use the EnsureSConsVersion() function to provide a
+ descriptive error message if your SConscript files
+ are executed by an earlier version of SCons:
+
+ EnsureSConsVersion(0, 98)
+
+ -- THE SConscript() "build_dir" KEYWORD ARGUMENT WILL BE DEPRECATED
+
+ The "build_dir" keyword argument of the SConscript function
+ and env.SConscript() method are being replaced by a new
+ "variant_dir" keyword argument.
+
+ In some future release a deprecation warning will be added
+ to existing uses of the SConscript()/env.SConscript()
+ "build_dir" keyword argument. At some point after the
+ deprecation warning, support for this keyword argument will
+ be removed entirely.
+
+ You can prepare for this by changing all your uses of the
+ SConscript()/env.SConscript() 'build_dir" keyword argument:
+
+ SConscript('src/SConscript', build_dir='opt')
+
+ To use the new "variant_dir" keyword argument:
+
+ SConscript('src/SConscript', variant_dir='opt')
+
+ NOTE: USING THE NEW "variant_dir" KEYWORD IS NOT BACKWARDS
+ COMPATIBLE TO VERSIONS OF SCons BEFORE 0.98. YOUR SConscript
+ FILES WILL NOT WORK ON EARLIER VERSIONS OF SCons AFTER
+ MAKING THIS CHANGE.
+
+ If you change SConscript files in software that you make
+ available for download or otherwise distribute, other users
+ may try to build your software with an earlier version of
+ SCons that does not support the "variant_dir" keyword.
+
+ If you can insist that users use a recent version of SCons
+ that supports "variant_dir", we recommend using the
+ EnsureSConsVersion() function to provide a descriptive error
+ message if your SConscript files are executed by an earlier
+ version of SCons:
+
+ EnsureSConsVersion(0, 98)
+
+ If you want to make sure that your SConscript files will
+ still work with earlier versions of SCons, then your best
+ bet is to continue to use the "build_dir" keyword until the
+ support is removed (which, in all likelihood, won't happen
+ for quite some time).
+
+ -- SCANNER NAMES HAVE BEEN DEPRECATED AND WILL BE REMOVED
+
+ Several internal variable names in SCons.Defaults for various
+ pre-made default Scanner objects have been deprecated and will
+ be removed in a future revision. In their place are several new
+ global variable names that are now part of the publicly-supported
+ interface:
+
+ NEW NAME DEPRECATED NAME
+ -------- ----------------------------
+ CScanner SCons.Defaults.CScan
+ DSCanner SCons.Defaults.DScan
+ SourceFileScanner SCons.Defaults.ObjSourceScan
+ ProgramScanner SCons.Defaults.ProgScan
+
+ Of these, only ObjSourceScan was probably used at all, to add
+ new mappings of file suffixes to other scanners for use by the
+ Object() Builder. This should now be done as follows:
+
+ SourceFileScanner.add_scanner('.x', XScanner)
+
+ -- THE env.Copy() METHOD WILL CHANGE OR GO AWAY ENTIRELY
+
+ The env.Copy() method (to make a copy of a construction
+ environment) is being replaced by the env.Clone() method.
+
+ As of SCons 0.98, a deprecation warning has been added to
+ current uses of the env.Copy() method. At some point in
+ the future, the env.Copy() method will either be removed
+ entirely or have its behavior changed.
+
+ You can prepare for this by changing all your uses of env.Copy()
+ to env.Clone(), which has the exact same calling arguments.
+
+ NOTE: CHANGING USES OF env.Copy() TO env.Clone() WILL MAKE
+ YOUR SConscript FILES NOT WORK ON VERSIONS OF SCons BEFORE
+ 0.96.93.
+
+ If you change SConscript files in software that you make
+ available for download or otherwise distribute, other users
+ may try to build your software with an earlier version of
+ SCons that does not have the env.Clone() method. We recommend
+ preparing for this in one of two ways:
+
+ -- Make your SConscript files backwards-compatible by
+ including the following code near the beginning of your
+ top-level SConstruct file:
+
+ import SCons.Environment
+ try:
+ SCons.Environment.Environment.Clone
+ except AttributeError:
+ SCons.Environment.Environment.Clone = \
+ SCons.Environment.Environment.Copy
+
+ -- Use the EnsureSConsVersion() function to provide a
+ descriptive error message if your SConscript files
+ are executed by an earlier version of SCons:
+
+ EnsureSConsVersion(0, 96, 93)
+
+ -- THE CheckLib Configure TEST WILL CHANGE BEHAVIOR
+
+ The CheckLib() Configure test appends the lib(s) to the
+ Environment's LIBS list in 1.3 and earlier. In 1.3 there is a
+ new CheckLib argument, append, which defaults to True to
+ preserve the old behavior. In a future release, append will
+ be changed to default to False, to conform with autoconf and
+ user expectations, since it is usually used to build up
+ library lists in a right-to-left way.
+
+
+
+ SCons is developed with an extensive regression test suite, and a
+ rigorous development methodology for continually improving that suite.
+ Because of this, SCons is of sufficient quality that you can use it
+ for real work.
+
+ The interfaces in release 1.0 will *not* be knowingly changed in
+ any new, future 1.x release. If an interface change should ever
+ become necessary due to extraordinary circumstances, the change
+ and an appropriate transition strategy will be documented in these
+ RELEASE notes.
+
+ As you use SCons, please heed the following:
+
+ - Please report any bugs or other problems that you find to our bug
+ tracker at our SourceForge project page:
+
+ http://sourceforge.net/tracker/?func=add&group_id=30337&atid=398971
+
+ We have a reliable bug-fixing methodology already in place and
+ strive to respond to problems relatively quickly.
+
+ - Documentation is spottier than we'd like. You may need to dive
+ into the source code to figure out how to do something. Asking
+ questions on the scons-users mailing list is also welcome. We
+ will be addressing the documentation in upcoming releases, but
+ would be more than glad to have your assistance in correcting this
+ problem... :-)
+
+ - The "SCons Design" documentation on the SCons web site is very
+ out of date, as we made significant changes to portions of the
+ interface as we figured out what worked and what didn't during the
+ extensive beta implementation. The "SCons Design" document should
+ be used only for historical purposes, or for just an extremely
+ general understanding of SCons' architectural goals.
+
+ - There may be performance issues. Improving SCons performance
+ is an ongoing priority. If you still find the performance
+ unacceptable, we would very much like to hear from you and learn
+ more about your configuration so we can optimize the right things.
+
+ - Error messages don't always exist where they'd be helpful.
+ Please let us know about any errors you ran into that would
+ have benefitted from a (more) descriptive message.
+
+ KNOWN PROBLEMS IN THIS RELEASE:
+
+ For a complete list of known problems, consult the SCons Issue Tracker
+ at tigris.org:
+
+ http://scons.tigris.org/project_issues.html
+
+ - Support for parallel builds (-j) does not work on WIN32 systems
+ prior to *official* Python release 2.2 (not 2.2 pre-releases).
+
+ Prior to Python 2.2, there is a bug in Python's Win32
+ implementation such that when a thread spawns an external command,
+ it blocks all threads from running. This breaks the SCons
+ multithreading architecture used to support -j builds.
+
+ We have included a patch file, os_spawnv_fix.diff, that you can
+ use if you you want to fix your version of Python to support
+ parallel builds in SCons.
+
+ - Again, the "SCons Design" documentation on the SCons web site is
+ out of date. Take what you read there with a grain of salt.
+
+ - On Win32 systems, you must put a space between the redirection
+ characters < and >, and the specified files (or construction
+ variable expansions):
+
+ command < $SOURCE > $TARGET
+
+ If you don't supply a space (for example, "<$SOURCE"), SCons will
+ not recognize the redirection.
+
+ - MSVC .res files are not rebuilt when icons change.
+
+ - The -c option does not clean up .sconsign files or directories
+ created as part of the build, and also does not clean up
+ SideEffect files (for example, Visual Studio .pdb files).
+
+ - When using multiple Repositories, changing the name of an include
+ file can cause an old version of the file to be used.
+
+ - There is currently no way to force use of a relative path (../*)
+ for directories outside the top-level SConstruct file.
+
+ - The Jar() Builder will, on its second or subsequent invocation,
+ package up the .sconsign files that SCons uses to track signatures.
+ You can work around this by using the SConsignFile() function
+ to collect all of the .sconsign information into a single file
+ outside of the directory being packaged by Jar().
+
+ - SCons does not currently have a way to detect that an intermediate
+ file has been corrupted from outside and should be rebuilt.
+
+ - Unicode characters in path names do not work in all circumstances.
+
+ - SCons does not currently automatically check out SConstruct or
+ SConscript files from SCCS, RCS or BitKeeper.
+
+ - No support yet for the following planned command-line options:
+
+ -d -e -l --list-actions --list-derived --list-where
+ -o --override -p -r -R -w --write-filenames
+ -W --warn-undefined-variables
+
+
+
+Thank you for your interest, and please let us know how we can help
+improve SCons for your needs.
+
+-- The SCons Development Team
+ Gary Oberbrunner and Bill Deegan, maintainers
+ Thanks to all the contributors for all your help!
+
+__COPYRIGHT__
+__FILE__ __REVISION__ __DATE__ __DEVELOPER__
diff --git a/3rdParty/SCons/scons-3.0.1/CHANGES.txt b/3rdParty/SCons/scons-3.0.1/CHANGES.txt
new file mode 100644
index 0000000..5c0b733
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/CHANGES.txt
@@ -0,0 +1,6183 @@
+
+
+ SCons - a software construction tool
+
+ Change Log
+
+
+RELEASE 3.0.1 - Mon, 12 Nov 2017 15:31:33 -0700
+
+ From Daniel Moody:
+ - Jar can take multiple targets, and will make a duplicate jar from the sources for each target
+ - Added some warnings in case the Jar builder makes an implicit target
+ - Added Jar method and changed jar build to be more specific. Jar method will take in
+ directories or classes as source. Added more tests to JAR to ensure the jar was
+ packaged with the correct compiled class files.
+ - Added a No result test case to handle bug which seems unrelated to java in the
+ swig-dependencies.py test, more info here: http://scons.tigris.org/issues/show_bug.cgi?id=2907
+ - Added a travis script to test on ubuntu trusty now that the project is on github
+ so that Continuus Integration tests can be run automatically. It tests most case and considers
+ no result a pass as well. Improving this script can install more dependincies allowing for more
+ tests to be run.
+
+ From Daniel Moody:
+ - Updated the Jar Builder tool in Tool/__init__.py so that is doesn't force class files as
+ sources, allowing directories to be passed, which was causing test/Java/JAR.py to fail.
+
+ From William Deegan:
+ - Fix issue where code in utility routine to_String_for_subst() had code whose result was never
+ properly returned.
+ (Found by: James Rinkevich https://pairlist4.pair.net/pipermail/scons-users/2017-October/006358.html )
+ - Fixed Variables.GenerateHelpText() to now use the sort parameter. Due to incorrect 2to3 fixer changes
+ 8 years ago it was being used as a boolean parameter. Now you can specify sort to be a callable, or boolean
+ value. (True = normal sort). Manpage also updated.
+ - Fixed Tool loading logic from exploding sys.path with many site_scons/site_tools prepended on py3.
+ - Added additional output with time to process each SConscript file when using --debug=time.
+
+ From Thomas Berg:
+ - Fixed a regression in scons-3.0.0 where "from __future__ import print_function" was imposed
+ on the scope where SConstruct is executed, breaking existing builds using PY 2.7.
+
+ From William Deegan:
+ - Fix broken subst logic where a string with "$$(abc)" was being treated as "$(abc) and the
+ logic for removing the signature escapes was then failing because there was no closing "$)".
+ This was introduced by a pull request to allow recursive variable evaluations to yield a string
+ such as "$( $( some stuff $) $)".
+
+ From Zachary Tessler:
+ - Fix incorrect warning for repeated identical builder calls that use overrides
+
+RELEASE 3.0.0 - Mon, 18 Sep 2017 08:32:04 -0700
+
+NOTE: This is a major release. You should expect that some targets may rebuild when upgrading.
+Significant changes in some python action signatures. Also switching between PY 2.7 and PY 3.5, 3.6
+will cause rebuilds.
+
+
+ From William Blevins:
+ - Updated D language scanner support to latest: 2.071.1. (PR #1924)
+ https://dlang.org/spec/module.html accessed 11 August 2016
+ - Enhancements:
+ - Added support for selective imports: "import A : B, C;" -> A
+ - Added support for renamed imports. "import B = A;" -> A
+ - Supports valid combinations: "import A, B, CCC = C, DDD = D : EEE = FFF;" -> A, B, C, D
+ - Notes:
+ - May find new (previously missed) Dlang dependencies.
+ - May cause rebuild after upgrade due to dependency changes.
+ - Updated Fortran-related tests to pass under GCC 5/6.
+ - Fixed SCons.Tool.Packaging.rpm.package source nondeterminism across builds.
+
+ From William Deegan:
+ - Removed deprecated tools CVS, Perforce, BitKeeper, RCS, SCCS, Subversion.
+ - Removed deprecated module SCons.Sig
+ - Added prioritized list of xsltproc tools to docbook. The order will now be as
+ follows: xsltproc, saxon, saxon-xslt, xalan (with first being highest priority, first
+ tool found is used)
+ - Fixed MSVSProject example code (http://scons.tigris.org/issues/show_bug.cgi?id=2979)
+ - Defined MS SDK 10.0 and Changed VS 2015 to use SDK 10.0
+ - Changes to Action Function and Action Class signiture creation. NOTE: This will cause rebuilds
+ for many builds when upgrading to SCons 3.0
+ - Fixed Bug #3027 - "Cross Compiling issue: cannot override ranlib"
+ - Fixed Bug #3020 - "Download link in user guide wrong. python setup.py install --version-lib broken"
+ - Fixed Bug #2486 - Added SetOption('silent',True) - Previously this value was not allowed to be set.
+ - Fixed Bug #3040 - Non-unicode character in CHANGES.txt
+ - Fixed Bug #2622 - AlwaysBuild + MSVC regression.
+ - Fixed Bug #3025 - (Credit to Florian : User flow86 on tigris) - Fix typo JAVACLASSSUFIX should have been
+ JAVACLASSSUFFIX
+
+
+ From Ibrahim Esmat:
+ - Added the capability to build Windows Store Compatible libraries that can be used
+ with Universal Windows Platform (UWP) Apps and published to the store
+
+ From Daniel Holth:
+ - Add basic support for PyPy (by deleting __slots__ from Node with a
+ metaclass on PyPy); wrap most-used open() calls in 'with' statements to
+ avoid too many open files.
+ - Add __main__.py for `python -m SCons` in case it is on PYTHONPATH.
+ - Always use highest available pickle protocol for efficiency.
+ - Remove unused command line fallback for the zip tool.
+
+ From Gaurav Juvekar:
+ - Fix issue #2832: Expand construction variables in 'chdir' argument of builders. (PR #463)
+ - Fix issue #2910: Make --tree=all handle Unicode. (PR #427)
+ - Fix issue #2788: Fix typo in documentation example for sconf. (PR #388)
+
+ From Alexey Klimkin:
+ - Use memoization to optimize PATH evaluation across all dependencies per
+ node. (PR #345)
+ - Use set() where it is applicable (PR #344)
+
+ From M. Limber:
+ - Fixed msvs.py for Visual Studio Express editions that would report
+ "Error : ValueError: invalid literal for float(): 10.0Exp".
+
+ From Rick Lupton:
+ - Update LaTeX scanner to understand \import and related commands
+
+ From Steve Robinson:
+ - Add support for Visual Studio 2017. This support requires vswhere.exe a helper
+ tool installed with newer installs of 2017. SCons expects it to be located at
+ "C:\Program Files (x86)\Microsoft Visual Studio\Installer\vswhere.exe"
+ It can be downloaded separately at
+ https://github.com/Microsoft/vswhere
+
+ From Tom Tanner:
+ - Allow nested $( ... $) sections
+
+ From Paweł Tomulik:
+ - Fixed the issue with LDMODULEVERSIONFLAGS reported by Tim Jenness
+ (https://pairlist4.pair.net/pipermail/scons-users/2016-May/004893.html).
+ An error was causing "-Wl,Bsymbolic" being added to linker's command-line
+ even when there was no specified value in LDMODULEVERSION and thus no
+ need for the flags to be specified.
+ - Added LoadableModule to the list of global functions (DefaultEnvironment
+ builders).
+
+ From Manish Vachharajani:
+ - Update debian rules, compat, and control to not use features
+ deprecated or obsolete in later versions of debhelpers
+ - Update python version to 2.7 in debian/control
+
+ From Richard Viney:
+ - Fixed PCHPDBFLAGS causing a deprecation warning on MSVC v8 and later when
+ using PCHs and PDBs together.
+
+
+ From Richard West:
+ - Added nested / namespace tool support
+ - Added a small fix to the python3 tool loader when loading a tool as a package
+ - Added additional documentation to the user manual on using toolpaths with the environment
+ This includes the use of sys.path to search for tools installed via pip or package managers
+ - Added support for a PyPackageDir function for use with the toolpath
+
+ From Russel Winder:
+ - Reordered the default D tools from "dmd, gdc, ldc" to "dmd, ldc, gdc".
+ - Add a ProgramAllAtOnce builder to the dmd, ldc, and gdc tools. (PR #448)
+ - Remove a file name exception for very old Fedora LDC installation.
+ - gdc can now handle building shared objects (tested for version 6.3.0).
+ - Remove establishing the SharedLibrary builder in the dmd, ldc, and gdc
+ tools, must now include the ar tool to get this builder as is required for
+ other compiler tools.
+ - Add clang and clang++ tools based on Paweł Tomulik's work.
+
+RELEASE 2.5.1 - Mon, 03 Nov 2016 13:37:42 -0400
+
+ From William Deegan:
+ - Add scons-configure-cache.py to packaging. It was omitted
+
+ From Alexey Klimkin:
+ - Use memoization to optimize PATH evaluation across all dependencies per
+ node. (PR #345)
+
+RELEASE 2.5.0 - Mon, 09 Apr 2016 11:27:42 -0700
+
+ From Dirk Baechle:
+ - Removed a lot of compatibility methods and workarounds
+ for Python versions < 2.7, in order to prepare the work
+ towards a combined 2.7/3.x version. (PR #284)
+ Also fixed the default arguments for the print_tree and
+ render_tree methods. (PR #284, too)
+
+ From William Blevins:
+ - Added support for cross-language dependency scanning;
+ SCons now respects scanner keys for implicit dependencies.
+ - Notes for SCons users with heterogeneous systems.
+ - May find new (previously missed) dependencies.
+ - May cause rebuild after upgrade due to dependency changes.
+ - May find new dependency errors (EG. cycles).
+ - Discovered in some of the SCons QT tests.
+ - Resolved missing cross-language dependencies for
+ SWIG bindings (fixes #2264).
+ - Corrected typo in User Guide for Scanner keyword. (PR #2959)
+ - Install builder interacts with scanner found in SCANNERS differently.
+ - Previous: Install builder recursively scanned implicit dependencies
+ for scanners from SCANNER, but not for built-in (default) scanners.
+ - Current: Install builder will not scan for implicit dependencies via
+ either scanner source. This optimizes some Install builder behavior
+ and brings orthogonality to Install builder scanning behavior.
+
+ From William Deegan:
+ - Add better messaging when two environments have
+ different actions for the same target (Bug #2024)
+ - Fix issue only with MSVC and Always build where targets
+ marked AlwaysBuild wouldn't make it into CHANGED_SOURCES
+ and thus yield an empty compile command line. (Bug #2622)
+ - Fix posix platform escaping logic to properly handle paths
+ with parens in them "()". (Bug #2225)
+
+ From Jakub Pola:
+ - Intel Compiler 2016 (Linux/Mac) update for tool directories.
+
+ From Adarsh Sanjeev:
+ - Fix for issue #2494: Added string support for Chmod function.
+
+ From Tom Tanner:
+ - change cache to use 2 character subdirectories, rather than one character,
+ so as not to give huge directories for large caches, a situation which
+ causes issues for NFS.
+ For existing caches, you will need to run the scons-configure-cache.py
+ script to update them to the new format. You will get a warning every time
+ you build until you co this.
+ - Fix a bunch of unit tests on windows
+
+RELEASE 2.4.1 - Mon, 07 Nov 2015 10:37:21 -0700
+
+ From Arfrever Frehtes Taifersar Arahesis:
+ - Fix for Bug # 2791 - Setup.py fails unnecessarily under Jython.
+
+ From Dirk Baechle:
+ - Fixed license of SVG titlepage files in the context of Debian
+ packaging, such that they allow for commercial use too (#2985).
+
+ From William Blevins:
+ - InstallVersionedLib now available in the DefaultEnvironment context.
+ - Improves orthogonality of use cases between different Install functions.
+
+ From Carnë Draug:
+ - Added new configure check, CheckProg, to check for
+ existence of a program.
+
+ From Andrew Featherstone:
+ - Fix for issue #2840 - Fix for two environments specifying same target with different
+ actions not throwing hard error. Instead SCons was incorrectly issuing a warning
+ and continuing.
+
+ From Hiroaki Itoh :
+ - Add support `Microsoft Visual C++ Compiler for Python 2.7'
+ Compiler can be obtained at: https://www.microsoft.com/en-us/download/details.aspx?id=44266
+
+ From Florian Miedniak:
+ - Fixed tigris issue #3011: Glob() excludes didn't work when used with VariantDir(duplicate=0)
+
+ From William Roberts:
+ - Fix bug 2831 and allow Help() text to be appended to AddOption() help.
+
+ From Paweł Tomulik:
+ - Reimplemented versioning for shared libraries, with the following effects
+ - Fixed tigris issues #3001, #3006.
+ - Fixed several other issues not reported to tigris, including:
+ issues with versioned libraries in subdirectories with tricky names,
+ issues with versioned libraries and variant directories,
+ issue with soname not being injected to library when using D linkers,
+ - Switched to direct symlinks instead of daisy-chained ones -- soname and
+ development symlinks point directly to the versioned shared library now),
+ for rationale see:
+ https://www.debian.org/doc/debian-policy/ch-sharedlibs.html
+ https://fedoraproject.org/wiki/Packaging:Guidelines#Devel_Packages
+ https://bitbucket.org/scons/scons/pull-requests/247/new-versioned-libraries-gnulink-cyglink/diff#comment-10063929
+ - New construction variables to allow override default behavior: SONAME,
+ SHLIBVERSIONFLAGS, _SHLIBVERSIONFLAGS, SHLIBNOVERSIONSYMLINKS,
+ LDMODULEVERSION, LDMODULEVERSIONFLAGS, _LDMODULEVERSIONFLAGS,
+ LDMODULENOVERSIONSYMLINKS.
+ - Changed logic used to configure the versioning machinery from
+ platform-centric to linker-oriented.
+ - The SHLIBVERSION/LDMODULEVERSION variables are no longer validated by
+ SCons (more freedom to users).
+ - InstallVersionedLib() doesn't use SHLIBVERSION anymore.
+ - Enchanced docs for the library versioning stuff.
+ - New tests for versioned libraries.
+ - Library versioning is currently implemented for the following linker
+ tools: 'cyglink', 'gnulink', 'sunlink'.
+ - Fix to swig tool - pick-up 'swig', 'swig3.0' and 'swig2.0' (in order).
+ - Fix to swig tool - respect env['SWIG'] provided by user.
+
+
+
+RELEASE 2.4.0 - Mon, 21 Sep 2015 08:56:00 -0700
+
+ From Dirk Baechle:
+ - Switched several core classes to use "slots", to
+ reduce the overall memory consumption in large
+ projects (fixes #2180, #2178, #2198)
+ - Memoizer counting uses decorators now, instead of
+ the old metaclasses approach.
+
+ From Andrew Featherstone
+ - Fixed typo in SWIGPATH description
+
+RELEASE 2.3.6 - Mon, 31 Jul 2015 14:35:03 -0700
+
+ From Rob Smith:
+ - Added support for Visual Studio 2015
+
+RELEASE 2.3.5 - Mon, 17 Jun 2015 21:07:32 -0700
+
+ From Stephen Pollard:
+ - Documentation fixes for libraries.xml and
+ builders-writing.xml (#2989 and #2990)
+
+ From William Deegan:
+ - Extended docs for InstallVersionedLib/SharedLibrary,
+ and added SKIP_WIN_PACKAGES argument to build script
+ bootstrap.py (PR #230, #3002).
+
+ From William Blevins:
+ - Fixed symlink support (PR #227, #2395).
+ - Updated debug-count test case (PR #229).
+
+ From Alexey Klimkin:
+ - Fixed incomplete LIBS flattening and substitution in
+ Program scanner(PR #205, #2954).
+
+ From Dirk Baechle:
+ - Added new method rentry_exists_on_disk to Node.FS (PR #193).
+
+ From Russel Winder:
+ - Fixed several D tests under the different OS.
+ - Add support for f08 file extensions for Fortran 2008 code.
+
+ From Anatoly Techtonik:
+ - Show --config choices if no argument is specified (PR #202).
+ - Fixed build crash when XML toolchain isn't installed, and
+ activated compression for ZIP archives.
+
+ From Alexandre Feblot:
+ - Fix for VersionedSharedLibrary under 'sunos' platform.
+ - Fixed dll link with precompiled headers on MSVC 2012
+ - Added an 'exclude' parameter to Glob()
+
+ From Laurent Marchelli:
+ - Support for multiple cmdargs (one per variant) in VS project files.
+ - Various improvements for TempFileMunge class.
+ - Added an implementation for Visual Studio users files (PR #209).
+
+ From Dan Pidcock:
+ - Added support for the 'PlatformToolset' tag in VS project files (#2978).
+
+ From James McCoy:
+ - Added support for '-isystem' to ParseFlags.
+
+RELEASE 2.3.4 - Mon, 27 Sep 2014 12:50:35 -0400
+
+ From Bernhard Walle and Dirk Baechle:
+ - Fixed the interactive mode, in connection with
+ Configure contexts (#2971).
+
+ From Anatoly Techtonik:
+ - Fix EnsureSConsVersion warning when running packaged version
+
+ From Russel Winder:
+ - Fix D tools for building shared libraries
+
+RELEASE 2.3.3 - Sun, 24 Aug 2014 21:08:33 -0400
+
+ From Roland Stark:
+ - Fixed false line length calculation in the TempFileMunge class (#2970).
+
+ From Gary Oberbrunner:
+ - Improve SWIG detection
+
+ From Russel Winder:
+ - Fix regression on Windows in D language update
+
+ From Neal Becker and Stefan Zimmermann:
+ - Python 3 port and compatibility
+
+ From Anatoly Techtonik:
+ - Do not fail on EnsureSConsVersion when running from checkout
+
+ From Kendrick Boyd and Rob Managan:
+ - Fixed the newglossary action to work with VariantDir (LaTeX).
+
+ From Manuel Francisco Naranjo:
+ - Added a default for the BUILDERS environment variable,
+ to prevent not defined exception on a Clone().
+
+ From Andrew Featherstone:
+ - Added description of CheckTypeSize method (#1991).
+ - Fixed handling of CPPDEFINE var in Append()
+ for several list-dict combinations (#2900).
+
+ From William Blevins:
+ - Added test for Java derived-source dependency tree generation.
+ - Added Copy Action symlink soft-copy support (#2395).
+ - Various contributions to the documentation (UserGuide).
+
+RELEASE 2.3.2
+
+ From Dirk Baechle:
+ - Update XML doc editor configuration
+ - Fix: Allow varlist to be specified as list of strings for Actions (#2754)
+
+ From veon on bitbucket:
+ - Fixed handling of nested ifs in CPP scanner PreProcessor class.
+
+ From Shane Gannon:
+ - Support for Visual Studio 2013 (12.0)
+
+ From Michael Haubenwallner:
+ - Respect user's CC/CXX values; don't always overwrite in generate()
+ - Delegate linker Tool.exists() to CC/CXX Tool.exists().
+
+ From Rob Managan:
+ - Updated the TeX builder to support use of the -synctex=1
+ option and the files it creates.
+ - Updated the TeX builder to correctly clean auxiliary files when
+ the biblatex package is used.
+
+ From Gary Oberbrunner:
+ - get default RPM architecture more robustly when building RPMs
+
+ From Amir Szekely:
+ - Fixed NoClean() for multi-target builders (#2353).
+
+ From Paweł Tomulik:
+ - Fix SConf tests that write output
+
+ From Russel Winder:
+ - Revamp of the D language support. Tools for DMD, GDC and LDC provided
+ and integrated with the C and C++ linking. NOTE: This is only tested
+ with D v2. Support for D v1 is now deprecated.
+
+ From Anatoly Techtonik:
+ - Several improvements for running scons.py from source:
+ * engine files form source directory take priority over all other
+ importable versions
+ * message about scons.py running from source is removed to fix tests
+ that were failing because of this extra line in the output
+ * error message when SCons import fails now lists lookup paths
+ - Remove support for QMTest harness from runtest.py
+ - Remove RPM and m4 from default tools on Windows
+ - BitKeeper, CVS, Perforce, RCS, SCCS are deprecated from default
+ tools and will be removed in future SCons versions to speed up
+ SCons initialization (it will still be possible to use these tools
+ explicitly)
+
+ From Sye van der Veen:
+ - Support for Visual Studio 12.0Exp, and fixes for earlier MSVS
+ versions.
+
+
+RELEASE 2.3.1
+
+ From Andrew Featherstone:
+ - Added support for EPUB output format to the DocBook tool.
+
+ From Tom Tanner:
+ - Stop leaking file handles to subprocesses by switching to using subprocess
+ always.
+ - Allow multiple options to be specified with --debug=a,b,c
+ - Add support for a readonly cache (--cache-readonly)
+ - Always print stats if requested
+ - Generally try harder to print out a message on build errors
+ - Adds a switch to warn on missing targets
+ - Add Pseudo command to mark targets which should not exist after
+ they are built.
+
+ From Bogdan Tenea:
+ - Check for 8.3 filenames on cygwin as well as win32 to make variant_dir work properly.
+
+ From Alexandre Feblot:
+ - Make sure SharedLibrary depends on all dependent libs (by depending on SHLINKCOM)
+
+ From Stefan Sperling:
+ - Fixed the setup of linker flags for a versioned SharedLibrary
+ under OpenBSD (#2916).
+
+ From Antonio Cavallo:
+ - Improve error if Visual Studio bat file not found.
+
+ From Manuel Francisco Naranjo:
+ - Allow Subst.Literal string objects to be compared with each other,
+ so they work better in AddUnique() and Remove().
+
+ From David Rothenberger:
+ - Added cyglink linker that uses Cygwin naming conventions for
+ shared libraries and automatically generates import libraries.
+
+ From Dirk Baechle:
+ - Update bootstrap.py so it can be used from any dir, to run
+ SCons from a source (non-installed) dir.
+ - Count statistics of instances are now collected only when
+ the --debug=count command-line option is used (#2922).
+ - Added release_target_info() to File nodes, which helps to
+ reduce memory consumption in clean builds and update runs
+ of large projects.
+ - Fixed the handling of long options in the command-line
+ parsing (#2929).
+ - Fixed misspelled variable in intelc.py (#2928).
+
+ From Gary Oberbrunner:
+ - Test harness: fail_test() can now print a message to help debugging.
+
+ From Anatoly Techtonik:
+ - Require rpmbuild when building SCons package.
+ - Print full stack on certain errors, for debugging.
+ - Improve documentation for Textfile builder.
+
+ From William Deegan:
+ - VS2012 & VS2010 Resolve initialization issues by adding path to reg.exe
+ in shell used to run batch files.
+ - MSVC Support fixed defaulting TARGET_ARCH to HOST_ARCH. It should be
+ None if not explicitly set.
+ - MSVC Fixed issue where if more than one Architectures compilers are
+ detected, it would take the last one found, and not the first.
+
+ From Philipp Kraus:
+ - Added optional ZIPROOT to Zip tool.
+
+ From Dirk Baechle:
+ - Replaced old SGML-based documentation toolchain with a more modern
+ approach, that also requires less external dependencies (programs and
+ Python packages). Added a customized Docbook XSD for strict validation of
+ all input XML files.
+
+ From Luca Falavigna:
+ - Fixed spelling errors in MAN pages (#2897).
+
+ From Michael McDougall:
+ - Fixed description of ignore_case for EnumVariable in the
+ MAN page (#2774).
+
+RELEASE 2.3.0 - Mon, 02 Mar 2013 13:22:29 -0400
+
+ From Anatoly Techtonik:
+ - Added ability to run scripts/scons.py directly from source checkout
+ - Hide deprecated --debug={dtree,stree,tree} from --help output
+ - Error messages from option parser now include hints about valid choices
+ - Cleaned up some Python 1.5 and pre-2.3 code, so don't expect SCons
+ to run on anything less than Python 2.4 anymore
+ - Several fixes for runtest.py:
+ * exit with an error if no tests were found
+ * removed --noqmtest option - this behavior is by default
+ * replaced `-o FILE --xml` combination with `--xml FILE`
+ * changed `-o, --output FILE` option to capture stdout/stderr output
+ from runtest.py
+ - Remove os_spawnv_fix.diff patch required to enable parallel builds
+ support prior to Python 2.2
+
+ From Juan Lang:
+ - Fix WiX Tool to use .wixobj rather than .wxiobj for compiler output
+ - Support building with WiX releases after 2.0
+
+ From Alexey Klimkin:
+ - Fix nested LIBPATH expansion by flattening sequences in subst_path.
+
+ From eyan on Bitbucket:
+ - Print target name with command execution time with --debug=time
+
+ From Thomas Berg and Evgeny Podjachev:
+ - Fix subprocess spawning on Windows. Work around a Windows
+ bug that can crash python occasionally when using -jN. (#2449)
+
+ From Dirk Baechle:
+ - Updated test framework to support dir and file fixtures and
+ added ability to test external (out-of-tree) tools (#2862).
+ See doc in QMTest/test-framework.rst.
+ - Fixed several errors in the test suite (Java paths, MSVS version
+ detection, Tool import), additionally
+ * provided MinGW command-line support for the CXX, AS and
+ Fortran tests,
+ * refactored the detection of the gcc version and the according
+ Fortran startup library,
+ * provided a new module rpmutils.py, wrapping the RPM naming rules
+ for target files and further hardware-dependent info (compatibility,
+ compiler flags, ...),
+ * added new test methods must_exist_one_of() and
+ must_not_exist_any_of() and
+ * removed Aegis support from runtest.py. (#2872)
+
+ From Gary Oberbrunner:
+ - Add -jN support to runtest.py to run tests in parallel
+ - Add MSVC10 and MSVC11 support to get_output low-level bat script runner.
+ - Fix MSVS solution generation for VS11, and fixed tests.
+
+ From Rob Managan:
+ - Updated the TeX builder to support the \newglossary command
+ in LaTeX's glossaries package and the files it creates.
+ - Improve support for new versions of biblatex in the TeX builder
+ so biber is called automatically if biblatex requires it.
+ - Add SHLIBVERSION as an option that tells SharedLibrary to build
+ a versioned shared library and create the required symlinks.
+ Add builder InstallVersionedLib to create the required symlinks
+ installing a versioned shared library.
+
+RELEASE 2.2.0 - Mon, 05 Aug 2012 15:37:48 +0000
+
+ From dubcanada on Bitbucket:
+ - Fix 32-bit Visual Express C++ on 64-bit Windows (generate 32-bit code)
+
+ From Paweł Tomulik:
+ - Added gettext toolset
+ - Fixed FindSourceFiles to find final sources (leaf nodes).
+
+ From Greg Ward:
+ - Allow Node objects in Java path (#2825)
+
+ From Joshua Hughes:
+ - Make Windows not redefine builtin file as un-inheritable (#2857)
+ - Fix WINDOWS_INSERT_DEF on MinGW (Windows) (#2856)
+
+ From smallbub on Bitbucket:
+ - Fix LINKCOMSTR, SHLINKCOMSTR, and LDMODULECOMSTR on Windows (#2833).
+
+ From Mortoray:
+ - Make -s (silent mode) be silent about entering subdirs (#2976).
+ - Fix cloning of builders when cloning environment (#2821).
+
+ From Gary Oberbrunner:
+ - Show valid Visual Studio architectures in error message
+ when user passes invalid arch.
+
+ From Alexey Petruchik:
+ - Support for Microsoft Visual Studio 11 (both using it
+ and generating MSVS11 solution files).
+
+ From Alexey Klimkin:
+ - Fixed the Taskmaster, curing spurious build failures in
+ multi-threaded runs (#2720).
+
+ From Dirk Baechle:
+ - Improved documentation of command-line variables (#2809).
+ - Fixed scons-doc.py to properly convert main XML files (#2812).
+
+ From Rob Managan:
+ - Updated the TeX builder to support LaTeX's multibib package.
+ - Updated the TeX builder to support LaTeX's biblatex package.
+ - Added support for using biber instead of bibtex by setting
+ env['BIBTEX'] = 'biber'
+
+ From Arve Knudsen:
+ - Test for FORTRANPPFILESUFFIXES (#2129).
+
+
+RELEASE 2.1.0 - Mon, 09 Sep 2011 20:54:57 -0700
+
+ From Anton Lazarev:
+ - Fix Windows resource compiler scanner to accept DOS line endings.
+
+ From Matthias:
+ - Update MSVS documents to remove note indicating that only one
+ project is currently supported per solution file.
+
+ From Grzegorz Bizoń:
+ - Fix long compile lines in batch mode by using TEMPFILE
+ - Fix MSVC_BATCH=False (was treating it as true)
+
+ From Justin Gullingsrud:
+ - support -std=c++0x and related CXXFLAGS in pkgconfig (ParseFlags)
+
+ From Vincent Beffara:
+ - Support -dylib_file in pkgconfig (ParseFlags)
+
+ From Gary Oberbrunner and Sohail Somani:
+ - new construction variable WINDOWS_EMBED_MANIFEST to automatically
+ embed manifests in Windows EXEs and DLLs.
+
+ From Gary Oberbrunner:
+ - Fix Visual Studio project generation when CPPPATH contains Dir nodes
+ - Ensure Visual Studio project is regenerated when CPPPATH or CPPDEFINES change
+ - Fix unicode error when using non-ASCII filenames with Copy or Install
+ - Put RPATH in LINKCOM rather than LINKFLAGS so resetting
+ LINKFLAGS doesn't kill RPATH
+ - Fix precompiled headers on Windows when variant dir name has spaces.
+ - Adding None to an Action no longer fails (just returns original action)
+ - New --debug=prepare option to show each target as it's being
+ prepared, whether or not anything needs to be done for it.
+ - New debug option --debug=duplicate to print a line for each
+ unlink/relink (or copy) of a variant file from its source file.
+ - Improve error message for EnumVariables to show legal values.
+ - Fix Intel compiler to sort versions >9 correctly (esp. on Linux)
+ - Fix Install() when the source and target are directories and the
+ target directory exists.
+
+ From David Garcia Garzon:
+ - Fix Delete to be able to delete broken symlinks and dir
+ symlinks.
+
+ From Imran Fanaswala and Robert Lehr:
+ - Handle .output file generated by bison/yacc properly. Cleaning it
+ when necessary.
+
+ From Antoine Dechaume:
+ - Handle SWIG file where there is whitespace after the module name
+ properly. Previously the generated files would include
+ the whitespace.
+
+ From Dmitry R.:
+ - Handle Environment in case __semi_deepcopy is None
+
+ From Benoit Belley:
+
+ - Much improved support for Windows UNC paths (\\SERVERNAME).
+
+ From Jean-Baptiste Lab:
+
+ - Fix problems with appending CPPDEFINES that contain
+ dictionaries, and related issues with Parse/MergeFlags and
+ CPPDEFINES.
+
+ From Allen Weeks:
+
+ - Fix for an issue with implicit-cache with multiple targets
+ when dependencies are removed on disk.
+
+ From Evgeny Podjachev and Alexey Petruchick:
+
+ - Support generation of Microsoft Visual Studio 2008 (9.0)
+ and 2010 (10.0) project and solution files.
+
+ From Ken Deeter:
+
+ - Fix a problem when FS Entries which are actually Dirs have builders.
+
+ From Luca Falavigna:
+
+ - Support Fortran 03
+
+ From Gary Oberbrunner:
+
+ - Print the path to the SCons package in scons --version
+
+ From Jean-Fran�ois Colson:
+
+ - Improve Microsoft Visual Studio Solution generation, and fix
+ various errors in the generated solutions especially when using
+ MSVS_SCC_PROVIDER, and when generating multiple projects. The
+ construction variable MSVS_SCC_PROJECT_BASE_PATH, which never
+ worked properly, is removed. Users can use the new variable
+ MSVS_SCC_CONNECTION_ROOT instead if desired.
+
+ From Anatoly Techtonik:
+
+ - Use subprocess in bootstrap.py instead of os.execve to avoid
+ losing output control on Windows (http://bugs.python.org/issue9148)
+
+ - Revert patch for adding SCons to App Paths, because standard cmd
+ shell doesn't search there. This is confusing, because `scons` can
+ be executed from explorer, but fail to start from console.
+
+ - Fix broken installation with easy_install on Windows (issue #2051)
+ SCons traditionally installed in a way that allowed to run multiple
+ versions side by side. This custom logic was incompatible with
+ easy_install way of doing things.
+
+ - Use epydoc module for generating API docs in HTML if command line
+ utility is not found in PATH. Actual for Windows.
+
+ From Alexander Goomenyuk:
+
+ - Add .sx to assembly source scanner list so .sx files
+ get their header file dependencies detected.
+
+ From Arve Knudsen:
+
+ - Set module metadata when loading site_scons/site_init.py
+ so it is treated as a proper module; __doc__, __file__ and
+ __name__ now refer to the site_init.py file.
+
+ From Russel Winder:
+
+ - Users Guide updates explaining that Tools can be packages as
+ well as python modules.
+
+ From Gary Oberbrunner:
+
+ - New systemwide and per-user site_scons dirs.
+
+ From Dirk Baechle:
+
+ - XML fixes in User's Guide.
+ - Fixed the detection of 'jar' and 'rmic' during
+ the initialization of the respective Tools (#2730).
+ - Improved docs for custom Decider functions and
+ custom Scanner objects (#2711, #2713).
+ - Corrected SWIG module names for generated *.i files (#2707).
+
+ From Joe Zuntz:
+
+ - Fixed a case-sensitivity problem with Fortran modules.
+
+ From Bauke Conijn:
+
+ - Added Users Guide example for auto-generated source code
+
+ From Steven Knight:
+
+ - Fix explicit dependencies (Depends()) on Nodes that don't have
+ attached Builders.
+
+ - Fix use of the global Alias() function with command actions.
+
+ From Matt Hughes:
+
+ - Fix the ability to append to default $*FLAGS values (which are
+ implemented as CLVar instances) in a copied construction environment
+ without affecting the original construction environment's value.
+
+ From Rob Managan:
+
+ - Updated the TeX command strings to include a /D on Windows in
+ case the new directory is on a different drive letter.
+
+ - Fixed the LaTeX scanner so dependencies are found in commands that
+ are broken across lines with a comment or have embedded spaces.
+
+ - The TeX builders should now work with tex files that are generated
+ by another program. Thanks to Hans-Martin von Gaudecker for
+ isolating the cause of this bug.
+
+ - Added support for INDEXSTYLE environment variable so makeindex can
+ find style files.
+
+ - Added support for the bibunits package so we call bibtex on all
+ the bu*.aux files.
+
+ - Add support of finding path information on OSX for TeX applications
+ MacPorts and Fink paths need to be added by the user
+
+ From Russel Winder:
+
+ - Add support for DMD version 2 (the phobos2 library).
+
+ From William Deegan:
+
+ - Add initial support for VS/VC 2010 (express and non-express versions)
+ - Remove warning for not finding MS VC/VS install.
+ "scons: warning: No version of Visual Studio compiler found
+ - C/C++ compilers most likely not set correctly"
+ - Add support for Linux 3.0
+
+
+RELEASE 2.0.1 - Mon, 15 Aug 2010 15:46:32 -0700
+
+ From Dirk Baechle:
+
+ - Fix XML in documentation.
+
+ From Joe Zuntz:
+
+ - Fixed a case-sensitivity problem with Fortran modules.
+
+ From Bauke Conijn:
+
+ - Added Users Guide example for auto-generated source code
+
+ From Steven Knight:
+
+ - Fix explicit dependencies (Depends()) on Nodes that don't have
+ attached Builders.
+
+ From Matt Hughes:
+
+ - Fix the ability to append to default $*FLAGS values (which are
+ implemented as CLVar instances) in a copied construction environment
+ without affecting the original construction environment's value.
+
+ From Rob Managan:
+
+ - Updated the TeX command strings to include a /D on Windows in
+ case the new directory is on a different drive letter.
+
+ - Fixed the LaTeX scanner so dependencies are found in commands that
+ are broken across lines with a comment or have embedded spaces.
+
+
+RELEASE 2.0.0.final.0 - Mon, 14 Jun 2010 22:01:37 -0700
+
+ From Dirk Baechle:
+
+ - Fix XML in documentation.
+
+ From Steven Knight:
+
+ - Provide forward compatibility for the 'profile' module.
+
+ - Provide forward compatibility for the 'pickle' module.
+
+ - Provide forward compatibility for the 'io' module.
+
+ - Provide forward compatibility for the 'queue' module.
+
+ - Provide forward compatibility for the 'collections' module.
+
+ - Provide forward compatibility for the 'builtins' module.
+
+ - Provide forward compatibility for 'sys.intern()'.
+
+ - Convert to os.walk() from of os.path.walk().
+
+ - Remove compatibility logic no longer needed.
+
+ - Add a '-3' option to runtest to print 3.x incompatibility warnings.
+
+ - Convert old-style classes into new-style classes.
+
+ - Fix "Ignoring corrupt sconsign entry" warnings when building
+ in a tree with a pre-2.0 .sconsign file.
+
+ - Fix propagation from environment of VS*COMNTOOLS to resolve issues
+ initializing MSVC/MSVS/SDK issues.
+
+ - Handle detecting Visual C++ on Python verions with upper-case
+ platform architectures like 'AMD64'.
+
+ From W. Trevor King:
+
+ - Revisions to README.
+
+ From Greg Noel:
+
+ - Apply numerous Python fixers to update code to more modern idioms.
+ Find where fixers should be applied to code in test strings and
+ apply the fixers there, too.
+
+ - Write a fixer to convert string functions to string methods.
+
+ - Modify the 'dict' fixer to be less conservative.
+
+ - Modify the 'apply' fixer to handle more cases.
+
+ - Create a modified 'types' fixer that converts types to 2.x
+ equivalents rather than 3.x equivalents.
+
+ - Write a 'division' fixer to highlight uses of the old-style
+ division operator. Correct usage where needed.
+
+ - Add forward compatibility for the new 'memoryview' function
+ (which replaces the 'buffer' function).
+
+ - Add forward compatibility for the 'winreg' module.
+
+ - Remove no-longer-needed 'platform' module.
+
+ - Run tests with the '-3' option to Python 2.6 and clear up
+ various reported incompatibilities.
+
+ - Comb out code paths specialized to Pythons older than 2.4.
+
+ - Update deprecation warnings; most now become mandatory.
+
+ - Start deprecation cycle for BuildDir() and build_dir.
+
+ - Start deprecation cycle for SourceCode() and related factories
+
+ - Fixed a problem with is_Dict() not identifying some objects derived
+ from UserDict.
+
+ From Jim Randall:
+
+ - Document the AllowSubstExceptions() function in the User's Guide.
+
+ From William Deegan:
+
+ - Migrate MSVC/MSVS/SDK improvements from 1.3 branch.
+
+
+RELEASE 1.3.0 - Tue, 23 Mar 2010 21:44:19 -0400
+
+ From Steven Knight:
+
+ - Update man page and documentation.
+
+ From William Deegan (plus minor patch from Gary Oberbrunner):
+
+ - Support Visual Studio 8.0 Express
+
+RELEASE 1.2.0.d20100306 - Sat, 06 Mar 2010 16:18:33 -0800
+
+ From Luca Falavigna:
+
+ - Fix typos in the man page.
+
+ From Gottfried Ganssauge:
+
+ - Support execution when SCons is installed via easy_install.
+
+ From Steven Knight:
+
+ - Make the messages for Configure checks of compilers consistent.
+
+ - Issue an error message if a BUILDERS entry is not a Builder
+ object or a callable wrapper.
+
+ From Rob Managan:
+
+ - Update tex builder to handle the case where a \input{foo}
+ command tries to work with a directory named foo instead of the
+ file foo.tex. The builder now ignores a directory and continues
+ searching to find the correct file. Thanks to Lennart Sauerbeck
+ for the test case and initial patch
+
+ Also allow the \include of files in subdirectories when variantDir
+ is used with duplicate=0. Previously latex would crash since
+ the directory in which the .aux file is written was not created.
+ Thanks to Stefan Hepp for finding this and part of the solution.
+
+ From James Teh:
+ - Patches to fix some issues using MS SDK V7.0
+
+ From William Deegan:
+ - Lots of testing and minor patches to handle mixed MS VC and SDK
+ installations, as well as having only the SDK installed.
+
+
+RELEASE 1.2.0.d20100117 - Sun, 17 Jan 2010 14:26:59 -0800
+
+ From Jim Randall:
+ - Fixed temp filename race condition on Windows with long cmd lines.
+
+ From David Cournapeau:
+ - Fixed tryRun when sconf directory is in a variant dir.
+ - Do not add -fPIC for ifort tool on non-posix platforms (darwin and
+ windows).
+ - Fix bug 2294 (spurious CheckCC failures).
+ - Fix scons bootstrap process on windows 64 (wrong wininst name)
+
+ From William Deegan:
+ - Final merge from vs_revamp branch to main
+
+ - Added definition and usage of HOST_OS, HOST_ARCH, TARGET_OS,
+ TARGET_ARCH, currently only defined/used by Visual Studio
+ Compilers. This will be rolled out to other platforms/tools
+ in the future.
+
+ - Add check for python >= 3.0.0 and exit gracefully.
+ For 1.3 python >= 1.5.2 and < 3.0.0 are supported
+
+ - Fix bug 1944 - Handle non-existent .i file in swig emitter, previously
+ it would crash with an IOError exception. Now it will try to make an
+ educated guess on the module name based on the filename.
+
+ From Lukas Erlinghagen:
+
+ - Have AddOption() remove variables from the list of
+ seen-but-unknown variables (which are reported later).
+
+ - An option name and aliases can now be specified as a tuple.
+
+ From Hartmut Goebel:
+
+ - Textfile builder.
+
+ From Jared Grubb:
+
+ - use "is/is not" in comparisons with None instead of "==" or "!=".
+
+ From Jim Hunziker:
+
+ - Avoid adding -gphobos to a command line multiple times
+ when initializing use of the DMD compiler.
+
+ From Jason Kenney:
+
+ - Sugguested HOST/TARGET OS/ARCH separation.
+
+ From Steven Knight:
+
+ - Fix the -n option when used with VariantDir(duplicate=1)
+ and the variant directory doesn't already exist.
+
+ - Fix scanning of Unicode files for both UTF-16 endian flavors.
+
+ - Fix a TypeError on #include of file names with Unicode characters.
+
+ - Fix an exception if a null command-line argument is passed in.
+
+ - Evaluate Requires() prerequisites before a Node's direct children
+ (sources and dependencies).
+
+ From Greg Noel:
+
+ - Remove redundant __metaclass__ initializations in Environment.py.
+
+ - Correct the documentation of text returned by sconf.Result().
+
+ - Document that filenames with '.' as the first character are
+ ignored by Glob() by default (matching UNIX glob semantics).
+
+ - Fix SWIG testing infrastructure to work on Mac OS X.
+
+ - Restructure a test that occasionally hung so that the test would
+ detect when it was stuck and fail instead.
+
+ - Substfile builder.
+
+ From Gary Oberbrunner:
+
+ - When reporting a target that SCons doesn't know how to make,
+ specify whether it's a File, Dir, etc.
+
+ From Ben Webb:
+
+ - Fix use of $SWIGOUTDIR when generating Python wrappers.
+
+ - Add $SWIGDIRECTORSUFFIX and $SWIGVERSION construction variables.
+
+ From Rob Managan:
+
+ - Add -recorder flag to Latex commands and updated internals to
+ use the output to find files TeX creates. This allows the MiKTeX
+ installations to find the created files
+
+ - Notify user of Latex errors that would get buried in the
+ Latex output
+
+ - Remove LATEXSUFFIXES from environments that don't initialize Tex.
+
+ - Add support for the glossaries package for glossaries and acronyms
+
+ - Fix problem that pdftex, latex, and pdflatex tools by themselves did
+ not create the actions for bibtex, makeindex,... by creating them
+ and other environment settings in one routine called by all four
+ tex tools.
+
+ - Fix problem with filenames of sideeffects when the user changes
+ the name of the output file from the latex default
+
+ - Add scanning of files included in Latex by means of \lstinputlisting{}
+ Patch from Stefan Hepp.
+
+ - Change command line for epstopdf to use --outfile= instead of -o
+ since this works on all platforms.
+ Patch from Stefan Hepp.
+
+ - Change scanner to properly search for included file from the
+ directory of the main file instead of the file it is included from.
+ Also update the emitter to add the .aux file associated with
+ \include{filename} commands. This makes sure the required directories
+ if any are created for variantdir cases.
+ Half of the patch from Stefan Hepp.
+
+RELEASE 1.2.0.d20090223 - Mon, 23 Feb 2009 08:41:06 -0800
+
+ From Stanislav Baranov:
+
+ - Make suffix-matching for scanners case-insensitive on Windows.
+
+ From David Cournapeau:
+
+ - Change the way SCons finds versions of Visual C/C++ and Visual
+ Studio to find and use the Microsoft v*vars.bat files.
+
+ From Robert P. J. Day:
+
+ - User's Guide updates.
+
+ From Dan Eaton:
+
+ - Fix generation of Visual Studio 8 project files on x64 platforms.
+
+ From Allan Erskine:
+
+ - Set IncludeSearchPath and PreprocessorDefinitions in generated
+ Visual Studio 8 project files, to help IntelliSense work.
+
+ From Mateusz Gruca:
+
+ - Fix deletion of broken symlinks by the --clean option.
+
+ From Steven Knight:
+
+ - Fix the error message when use of a non-existent drive on Windows
+ is detected.
+
+ - Add sources for files whose targets don't exist in $CHANGED_SOURCES.
+
+ - Detect implicit dependencies on commands even when the command is
+ quoted.
+
+ - Fix interaction of $CHANGED_SOURCES with the --config=force option.
+
+ - Fix finding #include files when the string contains escaped
+ backslashes like "C:\\some\\include.h".
+
+ - Pass $CCFLAGS to Visual C/C++ precompiled header compilation.
+
+ - Remove unnecessary nested $( $) around $_LIBDIRFLAGS on link lines
+ for the Microsoft linker, the OS/2 ilink linker and the Phar Lap
+ linkloc linker.
+
+ - Spell the Windows environment variables consistently "SystemDrive"
+ and "SystemRoot" instead of "SYSTEMDRIVE" and "SYSTEMROOT".
+
+
+
+RELEASE 1.2.0.d20090113 - Tue, 13 Jan 2009 02:50:30 -0800
+
+ From Stanislav Baranov, Ted Johnson and Steven Knight:
+
+ - Add support for batch compilation of Visual Studio C/C++ source
+ files, controlled by a new $MSVC_BATCH construction variable.
+
+ From Steven Knight:
+
+ - Print the message, "scons: Build interrupted." on error output,
+ not standard output.
+
+ - Add a --warn=future-deprecated option for advance warnings about
+ deprecated features that still have warnings hidden by default.
+
+ - Fix use of $SOURCE and $SOURCES attributes when there are no
+ sources specified in the Builder call.
+
+ - Add support for new $CHANGED_SOURCES, $CHANGED_TARGETS,
+ $UNCHANGED_SOURCES and $UNCHANGED_TARGETS variables.
+
+ - Add general support for batch builds through new batch_key= and
+ targets= keywords to Action object creation.
+
+ From Arve Knudsen:
+
+ - Make linker tools differentiate properly between SharedLibrary
+ and LoadableModule.
+
+ - Document TestCommon.shobj_prefix variable.
+
+ - Support $SWIGOUTDIR values with spaces.
+
+ From Rob Managan:
+
+ - Don't automatically try to build .pdf graphics files for
+ .eps files in \includegraphics{} calls in TeX/LaTeX files
+ when building with the PDF builder (and thus using pdflatex).
+
+ From Gary Oberbrunner:
+
+ - Allow AppendENVPath() and PrependENVPath() to interpret '#'
+ for paths relative to the top-level SConstruct directory.
+
+ - Use the Borland ilink -e option to specify the output file name.
+
+ - Document that the msvc Tool module uses $PCH, $PCHSTOP and $PDB.
+
+ - Allow WINDOWS_INSERT_DEF=0 to disable --output-def when linking
+ under MinGW.
+
+ From Zia Sobhani:
+
+ - Fix typos in the User's Guide.
+
+ From Greg Spencer:
+
+ - Support implicit dependency scanning of files encoded in utf-8
+ and utf-16.
+
+ From Roberto de Vecchi:
+
+ - Remove $CCFLAGS from the the default definitions of $CXXFLAGS for
+ Visual C/C++ and MIPSpro C++ on SGI so, they match other tools
+ and avoid flag duplication on C++ command lines.
+
+ From Ben Webb:
+
+ - Handle quoted module names in SWIG source files.
+
+ - Emit *_wrap.h when SWIG generates header file for directors
+
+ From Matthew Wesley:
+
+ - Copy file attributes so we identify, and can link a shared library
+ from, shared object files in a Repository.
+
+
+
+RELEASE 1.2.0 - Sat, 20 Dec 2008 22:47:29 -0800
+
+ From Steven Knight:
+
+ - Don't fail if can't import a _subprocess module on Windows.
+
+ - Add warnings for use of the deprecated Options object.
+
+
+
+RELEASE 1.1.0.d20081207 - Sun, 07 Dec 2008 19:17:23 -0800
+
+ From Benoit Belley:
+
+ - Improve the robustness of GetBuildFailures() by refactoring
+ SCons exception handling (especially BuildError exceptions).
+
+ - Have the --taskmastertrace= option print information about
+ individual Task methods, not just the Taskmaster control flow.
+
+ - Eliminate some spurious dependency cycles by being more aggressive
+ about pruning pending children from the Taskmaster walk.
+
+ - Suppress mistaken reports of a dependency cycle when a child
+ left on the pending list is a single Node in EXECUTED state.
+
+ From David Cournapeau:
+
+ - Fix $FORTRANMODDIRPREFIX for the ifort (Intel Fortran) tool.
+
+ From Brad Fitzpatrick:
+
+ - Don't pre-generate an exception message (which will likely be
+ ignored anyway) when an EntryProxy re-raises an AttributeError.
+
+ From Jared Grubb:
+
+ - Clean up coding style and white space in Node/FS.py.
+
+ - Fix a typo in the documentation for $_CPPDEFFLAGS.
+
+ - Issue 2401: Fix usage of comparisons with None.
+
+ From Ludwig H�hne:
+
+ - Handle Java inner classes declared within a method.
+
+ From Steven Knight:
+
+ - Fix label placement by the "scons-time.py func" subcommand
+ when a profile value was close to (or equal to) 0.0.
+
+ - Fix env.Append() and env.Prepend()'s ability to add a string to
+ list-like variables like $CCFLAGS under Python 2.6.
+
+ - Other Python2.6 portability: don't use "as" (a Python 2.6 keyword).
+ Don't use the deprecated Exception.message attribute.
+
+ - Support using the -f option to search for a different top-level
+ file name when walking up with the -D, -U or -u options.
+
+ - Fix use of VariantDir when the -n option is used and doesn't,
+ therefore, actually create the variant directory.
+
+ - Fix a stack trace from the --debug=includes option when passed a
+ static or shared library as an argument.
+
+ - Speed up the internal find_file() function (used for searching
+ CPPPATH, LIBPATH, etc.).
+
+ - Add support for using the Python "in" keyword on construction
+ environments (for example, if "CPPPATH" in env: ...).
+
+ - Fix use of Glob() when a repository or source directory contains
+ an in-memory Node without a corresponding on-disk file or directory.
+
+ - Add a warning about future reservation of $CHANGED_SOURCES,
+ $CHANGED_TARGETS, $UNCHANGED_SOURCES and $UNCHANGED_TARGETS.
+
+ - Enable by default the existing warnings about setting the resource
+ $SOURCE, $SOURCES, $TARGET and $TARGETS variable.
+
+ From Rob Managan:
+
+ - Scan for TeX files in the paths specified in the $TEXINPUTS
+ construction variable and the $TEXINPUTS environment variable.
+
+ - Configure the PDF() and PostScript() Builders as single_source so
+ they know each source file generates a separate target file.
+
+ - Add $EPSTOPDF, $EPSTOPDFFLAGS and $EPSTOPDFCOM
+
+ - Add .tex as a valid extension for the PDF() builder.
+
+ - Add regular expressions to find \input, \include and
+ \includegraphics.
+
+ - Support generating a .pdf file from a .eps source.
+
+ - Recursive scan included input TeX files.
+
+ - Handle requiring searched-for TeX input graphics files to have
+ extensions (to avoid trying to build a .eps from itself, e.g.).
+
+ From Greg Noel:
+
+ - Make the Action() function handle positional parameters consistently.
+
+ - Clarify use of Configure.CheckType().
+
+ - Make the File.{Dir,Entry,File}() methods create their entries
+ relative to the calling File's directory, not the SConscript
+ directory.
+
+ - Use the Python os.devnull variable to discard error output when
+ looking for the $CC or $CXX version.
+
+ - Mention LoadableModule() in the SharedLibrary() documentation.
+
+ From Gary Oberbrunner:
+
+ - Update the User's Guide to clarify use of the site_scons/
+ directory and the site_init.py module.
+
+ - Make env.AppendUnique() and env.PrependUnique remove duplicates
+ within a passed-in list being added, too.
+
+ From Randall Spangler:
+
+ - Fix Glob() so an on-disk file or directory beginning with '#'
+ doesn't throw an exception.
+
+
+
+RELEASE 1.1.0 - Thu, 09 Oct 2008 08:33:47 -0700
+
+ From Chris AtLee
+
+ - Use the specified environment when checking for the GCC compiler
+ version.
+
+ From Ian P. Cardenas:
+
+ - Fix Glob() polluting LIBPATH by returning copy of list
+
+ From David Cournapeau:
+
+ - Add CheckCC, CheckCXX, CheckSHCC and CheckSHCXX tests to
+ configuration contexts.
+
+ - Have the --profile= argument use the much faster cProfile module
+ (if it's available in the running Python version).
+
+ - Reorder MSVC compilation arguments so the /Fo is first.
+
+ From Bill Deegan:
+
+ - Add scanning Windows resource (.rc) files for implicit dependencies.
+
+ From John Gozde:
+
+ - When scanning for a #include file, don't use a directory that
+ has the same name as the file.
+
+ From Ralf W. Grosse-Kunstleve
+
+ - Suppress error output when checking for the GCC compiler version.
+
+ From Jared Grubb:
+
+ - Fix VariantDir duplication of #included files in subdirectories.
+
+ From Ludwig H�hne:
+
+ - Reduce memory usage when a directory is used as a dependency of
+ another Node (such as an Alias) by returning a concatenation
+ of the children's signatures + names, not the children's contents,
+ as the directory contents.
+
+ - Raise AttributeError, not KeyError, when a Builder can't be found.
+
+ - Invalidate cached Node information (such as the contenst returned
+ by the get_contents() method) when calling actions with Execute().
+
+ - Avoid object reference cycles from frame objects.
+
+ - Reduce memory usage from Null Executor objects.
+
+ - Compute MD5 checksums of large files without reading the entire
+ file contents into memory. Add a new --md5-chunksize option to
+ control the size of each chunk read into memory.
+
+ From Steven Knight:
+
+ - Fix the ability of the add_src_builder() method to add a new
+ source builder to any other builder.
+
+ - Avoid an infinite loop on non-Windows systems trying to find the
+ SCons library directory if the Python library directory does not
+ begin with the string "python".
+
+ - Search for the SCons library directory in "scons-local" (with
+ no version number) after "scons-local-{VERSION}".
+
+ From Rob Managan:
+
+ - Fix the user's ability to interrupt the TeX build chain.
+
+ - Fix the TeX builder's allowing the user to specify the target name,
+ instead of always using its default output name based on the source.
+
+ - Iterate building TeX output files until all warning are gone
+ and the auxiliary files stop changing, or until we reach the
+ (configurable) maximum number of retries.
+
+ - Add TeX scanner support for: glossaries, nomenclatures, lists of
+ figures, lists of tables, hyperref and beamer.
+
+ - Use the $BIBINPUTS, $BSTINPUTS, $TEXINPUTS and $TEXPICTS construction
+ variables as search paths for the relevant types of input file.
+
+ - Fix building TeX with VariantDir(duplicate=0) in effect.
+
+ - Fix the LaTeX scanner to search for graphics on the TEXINPUTS path.
+
+ - Have the PDFLaTeX scanner search for .gif files as well.
+
+ From Greg Noel:
+
+ - Fix typos and format bugs in the man page.
+
+ - Add a first draft of a wrapper module for Python's subprocess
+ module.
+
+ - Refactor use of the SCons.compat module so other modules don't
+ have to import it individually.
+
+ - Add .sx as a suffix for assembly language files that use the
+ C preprocessor.
+
+ From Gary Oberbrunner:
+
+ - Make Glob() sort the returned list of Files or Nodes
+ to prevent spurious rebuilds.
+
+ - Add a delete_existing keyword argument to the AppendENVPath()
+ and PrependENVPath() Environment methods.
+
+ - Add ability to use "$SOURCE" when specifying a target to a builder
+
+ From Damyan Pepper:
+
+ - Add a test case to verify that SConsignFile() files can be
+ created in previously non-existent subdirectories.
+
+ From Jim Randall:
+
+ - Make the subdirectory in which the SConsignFile() file will
+ live, if the subdirectory doesn't already exist.
+
+ From Ali Tofigh:
+
+ - Add a test to verify duplication of files in VariantDir subdirectories.
+
+
+
+RELEASE 1.0.1 - Sat, 06 Sep 2008 07:29:34 -0700
+
+ From Greg Noel:
+
+ - Add a FindFile() section to the User's Guide.
+
+ - Fix the FindFile() documentation in the man page.
+
+ - Fix formatting errors in the Package() description in the man page.
+
+ - Escape parentheses that appear within variable names when spawning
+ command lines using os.system().
+
+
+
+RELEASE 1.0.0 - XXX
+
+ From Jared Grubb:
+
+ - Clear the Node state when turning a generic Entry into a Dir.
+
+ From Ludwig H�hne:
+
+ - Fix sporadic output-order failures in test/GetBuildFailures/parallel.py.
+
+ - Document the ParseDepends() function in the User's Guide.
+
+ From khomenko:
+
+ - Create a separate description and long_description for RPM packages.
+
+ From Steven Knight:
+
+ - Document the GetLaunchDir() function in the User's Guide.
+
+ - Have the env.Execute() method print an error message if the
+ executed command fails.
+
+ - Add a script for creating a standard SCons development system on
+ Ubuntu Hardy. Rewrite subsidiary scripts for install Python and
+ SCons versions in Python (from shell).
+
+ From Greg Noel:
+
+ - Handle yacc/bison on newer Mac OS X versions creating file.hpp,
+ not file.cpp.h.
+
+ - In RPCGEN tests, ignore stderr messages from older versions of
+ rpcgen on some versions of Mac OS X.
+
+ - Fix typos in man page descriptions of Tag() and Package(), and in
+ the scons-time man page.
+
+ - Fix documentation of SConf.CheckLibWithHeader and other SConf methods.
+
+ - Update documentation of SConscript(variant_dir) usage.
+
+ - Fix SWIG tests for (some versions of) Mac OS X.
+
+ From Jonas Olsson:
+
+ - Print the warning about -j on Windows being potentially unreliable if
+ the pywin32 extensions are unavailable or lack file handle operations.
+
+ From Jim Randall:
+
+ - Fix the env.WhereIs() method to expand construction variables.
+
+ From Rogier Schouten:
+
+ - Enable building of shared libraries with the Bordand ilink32 linker.
+
+
+
+RELEASE 1.0.0 - Sat, 09 Aug 2008 12:19:44 -0700
+
+ From Luca Falavigna:
+
+ - Fix SCons man page indentation under Debian's man page macros.
+
+ From Steven Knight:
+
+ - Clarify the man page description of the SConscript(src_dir) argument.
+
+ - User's Guide updates:
+
+ - Document the BUILD_TARGETS, COMMAND_LINE_TARGETS and
+ DEFAULT_TARGETS variables.
+
+ - Document the AddOption(), GetOption() and SetOption() functions.
+
+ - Document the Requires() function; convert to the Variables
+ object, its UnknownOptions() method, and its associated
+ BoolVariable(), EnumVariable(), ListVariable(), PackageVariable()
+ and PathVariable() functions.
+
+ - Document the Progress() function.
+
+ - Reorganize the chapter and sections describing the different
+ types of environments and how they interact. Document the
+ SetDefault() method. Document the PrependENVPath() and
+ AppendENVPath() functions.
+
+ - Reorganize the command-line arguments chapter. Document the
+ ARGLIST variable.
+
+ - Collect some miscellaneous sections into a chapter about
+ configuring build output.
+
+ - Man page updates:
+
+ - Document suggested use of the Visual C/C++ /FC option to fix
+ the ability to double-click on file names in compilation error
+ messages.
+
+ - Document the need to use Clean() for any SideEffect() files that
+ must be explicitly removed when their targets are removed.
+
+ - Explicitly document use of Node lists as input to Dependency().
+
+ From Greg Noel:
+
+ - Document MergeFlags(), ParseConfig(), ParseFlags() and SideEffect()
+ in the User's Guide.
+
+ From Gary Oberbrunner:
+
+ - Document use of the GetBuildFailures() function in the User's Guide.
+
+ From Adam Simpkins:
+
+ - Add man page text clarifying the behavior of AddPreAction() and
+ AddPostAction() when called with multiple targets.
+
+ From Alexey Zezukin:
+
+ - Fix incorrectly swapped man page descriptions of the --warn= options
+ for duplicate-environment and missing-sconscript.
+
+
+
+RELEASE 0.98.5 - Sat, 07 Jun 2008 08:20:35 -0700
+
+ From Benoit Belley:
+
+ - Fix the Intel C++ compiler ABI specification for EMT64 processors.
+
+ From David Cournapeau:
+
+ - Issue a (suppressable) warning, not an error, when trying to link
+ C++ and Fortran object files into the same executable.
+
+ From Steven Knight:
+
+ - Update the scons.bat file so that it returns the real exit status
+ from SCons, even though it uses setlocal + endlocal.
+
+ - Fix the --interactive post-build messages so it doesn't get stuck
+ mistakenly reporting failures after any individual build fails.
+
+ - Fix calling File() as a File object method in some circumstances.
+
+ - Fix setup.py installation on Mac OS X so SCons gets installed
+ under /usr/lcoal by default, not in the Mac OS X Python framework.
+
+
+
+RELEASE 0.98.4 - Sat, 17 May 2008 22:14:46 -0700
+
+ From Benoit Belley:
+
+ - Fix calculation of signatures for Python function actions with
+ closures in Python versions before 2.5.
+
+ From David Cournapeau:
+
+ - Fix the initialization of $SHF77FLAGS so it includes $F77FLAGS.
+
+ From Jonas Olsson:
+
+ - Fix a syntax error in the Intel C compiler support on Windows.
+
+ From Steven Knight:
+
+ - Change how we represent Python Value Nodes when printing and when
+ stored in .sconsign files (to avoid blowing out memory by storing
+ huge strings in .sconsign files after multiple runs using Configure
+ contexts cause the Value strings to be re-escaped each time).
+
+ - Fix a regression in not executing configuration checks after failure
+ of any configuration check that used the same compiler or other tool.
+
+ - Handle multiple destinations in Visual Studio 8 settings for the
+ analogues to the INCLUDE, LIBRARY and PATH variables.
+
+ From Greg Noel:
+
+ - Update man page text for VariantDir().
+
+
+
+RELEASE 0.98.3 - Tue, 29 Apr 2008 22:40:12 -0700
+
+ From Greg Noel:
+
+ - Fix use of $CXXFLAGS when building C++ shared object files.
+
+ From Steven Knight:
+
+ - Fix a regression when a Builder's source_scanner doesn't select
+ a more specific scanner for the suffix of a specified source file.
+
+ - Fix the Options object backwards compatibility so people can still
+ "import SCons.Options.{Bool,Enum,List,Package,Path}Option" submodules.
+
+ - Fix searching for implicit dependencies when an Entry Node shows up
+ in the search path list.
+
+ From Stefano:
+
+ - Fix expansion of $FORTRANMODDIR in the default Fortran command line(s)
+ when it's set to something like ${TARGET.dir}.
+
+
+
+RELEASE 0.98.2 - Sun, 20 Apr 2008 23:38:56 -0700
+
+ From Steven Knight:
+
+ - Fix a bug in Fortran suffix computation that would cause SCons to
+ run out of memory on Windows systems.
+
+ - Fix being able to specify --interactive mode command lines with
+ \ (backslash) path name separators on Windows.
+
+ From Gary Oberbrunner:
+
+ - Document Glob() in the User's Guide.
+
+
+
+RELEASE 0.98.1 - Fri, 18 Apr 2008 19:11:58 -0700
+
+ From Benoit Belley:
+
+ - Speed up the SCons.Util.to_string*() functions.
+
+ - Optimize various Node intialization and calculations.
+
+ - Optimize Executor scanning code.
+
+ - Optimize Taskmaster execution, including dependency-cycle checking.
+
+ - Fix the --debug=stree option so it prints its tree once, not twice.
+
+ From Johan Boul�:
+
+ - Fix the ability to use LoadableModule() under MinGW.
+
+ From David Cournapeau:
+
+ - Various missing Fortran-related construction variables have been added.
+
+ - SCons now uses the program specified in the $FORTRAN construction
+ variable to link Fortran object files.
+
+ - Fortran compilers on Linux (Intel, g77 and gfortran) now add the -fPIC
+ option by default when compilling shared objects.
+
+ - New 'sunf77', 'sunf90' and 'sunf95' Tool modules have been added to
+ support Sun Fortran compilers. On Solaris, the Sun Fortran compilers
+ are used in preference to other compilers by default.
+
+ - Fortran support now uses gfortran in preference to g77.
+
+ - Fortran file suffixes are now configurable through the
+ $F77FILESUFFIXES, $F90FILESUFFIXES, $F95FILESUFFIXES and
+ $FORTRANFILESUFFIXES variables.
+
+ From Steven Knight:
+
+ - Make the -d, -e, -w and --no-print-directory options "Ignored for
+ compatibility." (We're not going to implement them.)
+
+ - Fix a serious inefficiency in how SCons checks for whether any source
+ files are missing when a Builder call creates many targets from many
+ input source files.
+
+ - In Java projects, make the target .class files depend only on the
+ specific source .java files where the individual classes are defined.
+
+ - Don't store duplicate source file entries in the .sconsign file so
+ we don't endlessly rebuild the target(s) for no reason.
+
+ - Add a Variables object as the first step towards deprecating the
+ Options object name. Similarly, add BoolVariable(), EnumVariable(),
+ ListVariable(), PackageVariable() and PathVariable() functions
+ as first steps towards replacing BoolOption(), EnumOption(),
+ ListOption(), PackageOption() and PathOption().
+
+ - Change the options= keyword argument to the Environment() function
+ to variables=, to avoid confusion with SCons command-line options.
+ Continue supporting the options= keyword for backwards compatibility.
+
+ - When $SWIGFLAGS contains the -python flag, expect the generated .py
+ file to be in the same (sub)directory as the target.
+
+ - When compiling C++ files, allow $CCFLAGS settings to show up on the
+ command line even when $CXXFLAGS has been redefined.
+
+ - Fix --interactive with -u/-U/-D when a VariantDir() is used.
+
+ From Anatoly Techtonik:
+
+ - Have the scons.bat file add the script execution directory to its
+ local %PATH% on Windows, so the Python executable can be found.
+
+ From Mike Wake:
+
+ - Fix passing variable names as a list to the Return() function.
+
+ From Matthew Wesley:
+
+ - Add support for the GDC 'D' language compiler.
+
+
+
+RELEASE 0.98 - Sun, 30 Mar 2008 23:33:05 -0700
+
+ From Benoit Belley:
+
+ - Fix the --keep-going flag so it builds all possible targets even when
+ a later top-level target depends on a child that failed its build.
+
+ - Fix being able to use $PDB and $WINDWOWS_INSERT_MANIFEST together.
+
+ - Don't crash if un-installing the Intel C compiler leaves left-over,
+ dangling entries in the Windows registry.
+
+ - Improve support for non-standard library prefixes and suffixes by
+ stripping all prefixes/suffixes from file name string as appropriate.
+
+ - Reduce the default stack size for -j worker threads to 256 Kbytes.
+ Provide user control over this value by adding --stack-size and
+ --warn=stack-size options, and a SetOption('stack_size') function.
+
+ - Fix a crash on Linux systems when trying to use the Intel C compiler
+ and no /opt/intel_cc_* directories are found.
+
+ - Improve using Python functions as actions by incorporating into
+ a FunctionAction's signature:
+ - literal values referenced by the byte code.
+ - values of default arguments
+ - code of nested functions
+ - values of variables captured by closures
+ - names of referenced global variables and functions
+
+ - Fix the closing message when --clean and --keep-going are both
+ used and no errors occur.
+
+ - Add support for the Intel C compiler on Mac OS X.
+
+ - Speed up reading SConscript files by about 20% (for some
+ configurations) by: 1) optimizing the SCons.Util.is_*() and
+ SCons.Util.flatten() functions; 2) avoiding unnecessary os.stat()
+ calls by using a File's .suffix attribute directly instead of
+ stringifying it.
+
+ From Jérôme Berger:
+
+ - Have the D language scanner search for .di files as well as .d files.
+
+ - Add a find_include_names() method to the Scanner.Classic class to
+ abstract out how included names can be generated by subclasses.
+
+ - Allow the D language scanner to detect multiple modules imported by
+ a single statement.
+
+ From Konstantin Bozhikov:
+
+ - Support expansion of construction variables that contain or refer
+ to lists of other variables or Nodes within expansions like $CPPPATH.
+
+ - Change variable substitution (the env.subst() method) so that an
+ input sequence (list or tuple) is preserved as a list in the output.
+
+ From David Cournapeau:
+
+ - Add a CheckDeclaration() call to configure contexts.
+
+ - Improve the CheckTypeSize() code.
+
+ - Add a Define() call to configure contexts, to add arbitrary #define
+ lines to a generated configure header file.
+
+ - Add a "gfortran" Tool module for the GNU F95/F2003 compiler.
+
+ - Avoid use of -rpath with the Mac OS X linker.
+
+ - Add comment lines to the generated config.h file to describe what
+ the various #define/#undef lines are doing.
+
+ From Steven Knight:
+
+ - Support the ability to subclass the new-style "str" class as input
+ to Builders.
+
+ - Improve the performance of our type-checking by using isinstance()
+ with new-style classes.
+
+ - Fix #include (and other $*PATH variables searches) of files with
+ absolute path names. Don't die if they don't exist (due to being
+ #ifdef'ed out or the like).
+
+ - Fix --interactive mode when Default(None) is used.
+
+ - Fix --debug=memoizer to work around a bug in base Python 2.2 metaclass
+ initialization (by just not allowing Memoization in Python versions
+ that have the bug).
+
+ - Have the "scons-time time" subcommand handle empty log files, and
+ log files that contain no results specified by the --which option.
+
+ - Fix the max Y of vertical bars drawn by "scons-time --fmt=gnuplot".
+
+ - On Mac OS X, account for the fact that the header file generated
+ from a C++ file will be named (e.g.) file.cpp.h, not file.hpp.
+
+ - Fix floating-point numbers confusing the Java parser about
+ generated .class file names in some configurations.
+
+ - Document (nearly) all the values you can now fetch with GetOption().
+
+ - Fix use of file names containing strings of multiple spaces when
+ using ActionFactory instances like the Copy() or Move() function.
+
+ - Fix a 0.97 regression when using a variable expansion (like
+ $OBJSUFFIX) in a source file name to a builder with attached source
+ builders that match suffix (like Program()+Object()).
+
+ - Have the Java parser recognize generics (surrounded by angle brackets)
+ so they don't interfere with identifying anonymous inner classes.
+
+ - Avoid an infinite loop when trying to use saved copies of the
+ env.Install() or env.InstallAs() after replacing the method
+ attributes.
+
+ - Improve the performance of setting construction variables.
+
+ - When cloning a construction environment, avoid over-writing an
+ attribute for an added method if the user explicitly replaced it.
+
+ - Add a warning about deprecated support for Python 1.5, 2.0 and 2.1.
+
+ - Fix being able to SetOption('warn', ...) in SConscript files.
+
+ - Add a warning about env.Copy() being deprecated.
+
+ - Add warnings about the --debug={dtree,stree,tree} options
+ being deprecated.
+
+ - Add VariantDir() as the first step towards deprecating BuildDir().
+ Add the keyword argument "variant_dir" as the replacement for
+ "build_dir".
+
+ - Add warnings about the {Target,Source}Signatures() methods and
+ functions being deprecated.
+
+ From Rob Managan:
+
+ - Enhance TeX and LaTeX support to work with BuildDir(duplicate=0).
+
+ - Re-run LaTeX when it issues a package warning that it must be re-run.
+
+ From Leanid Nazdrynau:
+
+ - Have the Copy() action factory preserve file modes and times
+ when copying individual files.
+
+ From Jan Nijtmans:
+
+ - If $JARCHDIR isn't set explicitly, use the .java_classdir attribute
+ that was set when the Java() Builder built the .class files.
+
+ From Greg Noel:
+
+ - Document the Dir(), File() and Entry() methods of Dir and File Nodes.
+
+ - Add the parse_flags option when creating Environments
+
+ From Gary Oberbrunner:
+
+ - Make File(), Dir() and Entry() return a list of Nodes when passed
+ a list of names, instead of trying to make a string from the name
+ list and making a Node from that string.
+
+ - Fix the ability to build an Alias in --interactive mode.
+
+ - Fix the ability to hash the contents of actions for nested Python
+ functions on Python versions where the inability to pickle them
+ returns a TypeError (instead of the documented PicklingError).
+
+ From Jonas Olsson:
+
+ - Fix use of the Intel C compiler when the top compiler directory,
+ but not the compiler version, is specified.
+
+ - Handle Intel C compiler network license files (port@system).
+
+ From Jim Randall:
+
+ - Fix how Python Value Nodes are printed in --debug=explain output.
+
+ From Adam Simpkins:
+
+ - Add a --interactive option that starts a session for building (or
+ cleaning) targets without re-reading the SConscript files every time.
+
+ - Fix use of readline command-line editing in --interactive mode.
+
+ - Have the --interactive mode "build" command with no arguments
+ build the specified Default() targets.
+
+ - Fix the Chmod(), Delete(), Mkdir() and Touch() Action factories to
+ take a list (of Nodes or strings) as arguments.
+
+ From Vaclav Smilauer:
+
+ - Fix saving and restoring an Options value of 'all' on Python
+ versions where all() is a builtin function.
+
+ From Daniel Svensson:
+
+ - Code correction in SCons.Util.is_List().
+
+ From Ben Webb:
+
+ - Support the SWIG %module statement with following modifiers in
+ parenthese (e.g., '%module(directors="1")').
+
+
+
+RELEASE 0.97.0d20071212 - Wed, 12 Dec 2007 09:29:32 -0600
+
+ From Benoit Belley:
+
+ - Fix occasional spurious rebuilds and inefficiency when using
+ --implicit-cache and Builders that produce multiple targets.
+
+ - Allow SCons to not have to know about the builders of generated
+ files when BuildDir(duplicate=0) is used, potentially allowing some
+ SConscript files to be ignored for smaller builds.
+
+ From David Cournapeau:
+
+ - Add a CheckTypeSize() call to configure contexts.
+
+ From Ken Deeter:
+
+ - Make the "contents" of Alias Nodes a concatenation of the children's
+ content signatures (MD5 checksums), not a concatenation of the
+ children's contents, to avoid using large amounts of memory during
+ signature calculation.
+
+ From Malte Helmert:
+
+ - Fix a lot of typos in the man page and User's Guide.
+
+ From Geoffrey Irving:
+
+ - Speed up conversion of paths in .sconsign files to File or Dir Nodes.
+
+ From Steven Knight:
+
+ - Add an Options.UnknownOptions() method that returns any settings
+ (from the command line, or whatever dictionary was passed in)
+ that aren't known to the Options object.
+
+ - Add a Glob() function.
+
+ - When removing targets with the -c option, use the absolute path (to
+ avoid problems interpreting BuildDir() when the top-level directory
+ is the source directory).
+
+ - Fix problems with Install() and InstallAs() when called through a
+ clone (of a clone, ...) of a cloned construction environment.
+
+ - When executing a file containing Options() settings, add the file's
+ directory to sys.path (so modules can be imported from there) and
+ explicity set __name__ to the name of the file so the statement's
+ in the file can deduce the location if they need to.
+
+ - Fix an O(n^2) performance problem when adding sources to a target
+ through calls to a multi Builder (including Aliases).
+
+ - Redefine the $WINDOWSPROGMANIFESTSUFFIX and
+ $WINDOWSSHLIBMANIFESTSUFFIX variables so they pick up changes to
+ the underlying $SHLIBSUFFIX and $PROGSUFFIX variables.
+
+ - Add a GetBuildFailures() function that can be called from functions
+ registered with the Python atexit module to print summary information
+ about any failures encountered while building.
+
+ - Return a NodeList object, not a Python list, when a single_source
+ Builder like Object() is called with more than one file.
+
+ - When searching for implicit dependency files in the directories
+ in a $*PATH list, don't create Dir Nodes for directories that
+ don't actually exist on-disk.
+
+ - Add a Requires() function to allow the specification of order-only
+ prerequisites, which will be updated before specified "downstream"
+ targets but which don't actually cause the target to be rebuilt.
+
+ - Restore the FS.{Dir,File,Entry}.rel_path() method.
+
+ - Make the default behavior of {Source,Target}Signatures('timestamp')
+ be equivalent to 'timestamp-match', not 'timestamp-newer'.
+
+ - Fix use of CacheDir with Decider('timestamp-newer') by updating
+ the modification time when copying files from the cache.
+
+ - Fix random issues with parallel (-j) builds on Windows when Python
+ holds open file handles (especially for SCons temporary files,
+ or targets built by Python function actions) across process creation.
+
+ From Maxim Kartashev:
+
+ - Fix test scripts when run on Solaris.
+
+ From Gary Oberbrunner:
+
+ - Fix Glob() when a pattern is in an explicitly-named subdirectory.
+
+ From Philipp Scholl:
+
+ - Fix setting up targets if multiple Package builders are specified
+ at once.
+
+
+
+RELEASE 0.97.0d20070918 - Tue, 18 Sep 2007 10:51:27 -0500
+
+ From Steven Knight:
+
+ - Fix the wix Tool module to handle null entries in $PATH variables.
+
+ - Move the documentation of Install() and InstallAs() from the list
+ of functions to the list of Builders (now that they're implemented
+ as such).
+
+ - Allow env.CacheDir() to be set per construction environment. The
+ global CacheDir() function now sets an overridable global default.
+
+ - Add an env.Decider() method and a Node.Decider() method that allow
+ flexible specification of an arbitrary function to decide if a given
+ dependency has changed since the last time a target was built.
+
+ - Don't execute Configure actions (while reading SConscript files)
+ when cleaning (-c) or getting help (-h or -H).
+
+ - Add to each target an implicit dependency on the external command(s)
+ used to build the target, as found by searching env['ENV']['PATH']
+ for the first argument on each executed command line.
+
+ - Add support for a $IMPLICIT_COMMAND_DEPENDENCIES construction
+ variabe that can be used to disable the automatic implicit
+ dependency on executed commands.
+
+ - Add an "ensure_suffix" keyword to Builder() definitions that, when
+ true, will add the configured suffix to the targets even if it looks
+ like they already have a different suffix.
+
+ - Add a Progress() function that allows for calling a function or string
+ (or list of strings) to display progress while walking the DAG.
+
+ - Allow ParseConfig(), MergeFlags() and ParseFlags() to handle output
+ from a *config command with quoted path names that contain spaces.
+
+ - Make the Return() function stop processing the SConscript file and
+ return immediately. Add a "stop=" keyword argument that can be set
+ to False to preserve the old behavior.
+
+ - Fix use of exitstatfunc on an Action.
+
+ - Introduce all man page function examples with "Example:" or "Examples:".
+
+ - When a file gets added to a directory, make sure the directory gets
+ re-scanned for the new implicit dependency.
+
+ - Fix handling a file that's specified multiple times in a target
+ list so that it doesn't cause dependent Nodes to "disappear" from
+ the dependency graph walk.
+
+ From Carsten Koch:
+
+ - Avoid race conditions with same-named files and directory creation
+ when pushing copies of files to CacheDir().
+
+ From Tzvetan Mikov:
+
+ - Handle $ in Java class names.
+
+ From Gary Oberbrunner:
+
+ - Add support for the Intel C compiler on Windows64.
+
+ - On SGI IRIX, have $SHCXX use $CXX by default (like other platforms).
+
+ From Sohail Somani:
+
+ - When Cloning a construction environment, set any variables before
+ applying tools (so the tool module can access the configured settings)
+ and re-set them after (so they end up matching what the user set).
+
+ From Matthias Troffaes:
+
+ - Make sure extra auxiliary files generated by some LaTeX packages
+ and not ending in .aux also get deleted by scons -c.
+
+ From Greg Ward:
+
+ - Add a $JAVABOOTCLASSPATH variable for directories to be passed to the
+ javac -bootclasspath option.
+
+ From Christoph Wiedemann:
+
+ - Add implicit dependencies on the commands used to build a target.
+
+
+
+
+RELEASE 0.97.0d20070809 - Fri, 10 Aug 2007 10:51:27 -0500
+
+ From Lars Albertsson:
+
+ - Don't error if a #include line happens to match a directory
+ somewhere on a path (like $CPPPATH, $FORTRANPATH, etc.).
+
+ From Mark Bertoglio:
+
+ - Fix listing multiple projects in Visual Studio 7.[01] solution files,
+ including generating individual project GUIDs instead of re-using
+ the solution GUID.
+
+ From Jean Brouwers:
+
+ - Add /opt/SUNWspro/bin to the default execution PATH on Solaris.
+
+ From Allan Erskine:
+
+ - Only expect the Microsoft IDL compiler to emit *_p.c and *_data.c
+ files if the /proxy and /dlldata switches are used (respectively).
+
+ From Steven Knight:
+
+ - Have --debug=explain report if a target is being rebuilt because
+ AlwaysBuild() is specified (instead of "unknown reasons").
+
+ - Support {Get,Set}Option('help') to make it easier for SConscript
+ files to tell if a help option (-h, --help, etc.) has been specified.
+
+ - Support {Get,Set}Option('random') so random-dependency interaction
+ with CacheDir() is controllable from SConscript files.
+
+ - Add a new AddOption() function to support user-defined command-
+ line flags (like --prefix=, --force, etc.).
+
+ - Replace modified Optik version with new optparse compatibility module
+ for command line processing in Scripts/SConsOptions.py
+
+ - Push and retrieve built symlinks to/from a CacheDir() as actual
+ symlinks, not by copying the file contents.
+
+ - Fix how the Action module handles stringifying the shared library
+ generator in the Tool/mingw.py module.
+
+ - When generating a config.h file, print "#define HAVE_{FEATURE} 1"
+ instad of just "#define HAVE_{FEATURE}", for more compatibility
+ with Autoconf-style projects.
+
+ - Fix expansion of $TARGET, $TARGETS, $SOURCE and $SOURCES keywords in
+ Visual C/C++ PDB file names.
+
+ - Fix locating Visual C/C++ PDB files in build directories.
+
+ - Support an env.AddMethod() method and an AddMethod() global function
+ for adding a new method, respectively, to a construction environment
+ or an arbitrary object (such as a class).
+
+ - Fix the --debug=time option when the -j option is specified and all
+ files are up to date.
+
+ - Add a $SWIGOUTDIR variable to allow setting the swig -outdir option,
+ and use it to identify files created by the swig -java option.
+
+ - Add a $SWIGPATH variable that specifies the path to be searched
+ for included SWIG files, Also add related $SWIGINCPREFIX and
+ $SWIGINCSUFFIX variables that specify the prefix and suffix to
+ be be added to each $SWIGPATH directory when expanded on the SWIG
+ command line.
+
+ - More efficient copying of construction environments (mostly borrowed
+ from copy.deepcopy() in the standard Python library).
+
+ - When printing --tree=prune output, don't print [brackets] around
+ source files, only do so for built targets with children.
+
+ - Fix interpretation of Builder source arguments when the Builder has
+ a src_suffix *and* a source_builder and the argument has no suffix.
+
+ - Fix use of expansions like ${TARGET.dir} or ${SOURCE.dir} in the
+ following construction variables: $FORTRANMODDIR, $JARCHDIR,
+ $JARFLAGS, $LEXFLAGS, $SWIGFLAGS, $SWIGOUTDIR and $YACCFLAGS.
+
+ - Fix dependencies on Java files generated by SWIG so they can be
+ detected and built in one pass.
+
+ - Fix SWIG when used with a BuildDir().
+
+ From Leanid Nazdrynau:
+
+ - When applying Tool modules after a construction environment has
+ already been created, don't overwrite existing $CFILESUFFIX and
+ $CXXFILESUFFIX value.
+
+ - Support passing the Java() builder a list of explicit .java files
+ (not only a list of directories to be scanned for .java files).
+
+ - Support passing .java files to the Jar() and JavaH() builders, which
+ then use the builder underlying the Java() builder to turn them into
+ .class files. (That is, the Jar()-Java() chain of builders become
+ multi-step, like the Program()-Object()-CFile() builders.)
+
+ - Support passing SWIG .i files to the Java builders (Java(),
+ Jar(), JavaH()), to cause intermediate .java files to be created
+ automatically.
+
+ - Add $JAVACLASSPATH and $JAVASOURCEPATH variables, that get added to
+ the javac "-classpath" and "-sourcepath" options. (Note that SCons
+ does *not* currently search these paths for implicit dependencies.)
+
+ - Commonize initialization of Java-related builders.
+
+ From Jan Nijtmans:
+
+ - Find Java anonymous classes when the next token after the name is
+ an open parenthesis.
+
+ From Gary Oberbrunner:
+
+ - Fix a code example in the man page.
+
+ From Tilo Prutz:
+
+ - Add support for the file names that Java 1.5 (and 1.6) generates for
+ nested anonymous inner classes, which are different from Java 1.4.
+
+ From Adam Simpkins:
+
+ - Allow worker threads to terminate gracefully when all jobs are
+ finished.
+
+ From Sohail Somani:
+
+ - Add LaTeX scanner support for finding dependencies specified with
+ the \usepackage{} directive.
+
+
+
+RELEASE 0.97 - Thu, 17 May 2007 08:59:41 -0500
+
+ From Steven Knight:
+
+ - Fix a bug that would make parallel builds stop in their tracks if
+ Nodes that depended on lists that contained some Nodes built together
+ caused the reference count to drop below 0 if the Nodes were visited
+ and commands finished in the wrong order.
+
+ - Make sure the DirEntryScanner doesn't choke if it's handed something
+ that's not a directory (Node.FS.Dir) Node.
+
+
+
+RELEASE 0.96.96 - Thu, 12 Apr 2007 12:36:25 -0500
+
+ NOTE: This is (Yet) a(nother) pre-release of 0.97 for testing purposes.
+
+ From Joe Bloggs:
+
+ - Man page fix: remove cut-and-paste sentence in NoCache() description.
+
+ From Dmitry Grigorenko and Gary Oberbrunner:
+
+ - Use the Intel C++ compiler, not $CC, to link C++ source.
+
+ From Helmut Grohne:
+
+ - Fix the man page example of propagating a user's external environment.
+
+ From Steven Knight:
+
+ - Back out (most of) the Windows registry installer patch, which
+ seems to not work on some versions of Windows.
+
+ - Don't treat Java ".class" attributes as defining an inner class.
+
+ - Fix detecting an erroneous Java anonymous class when the first
+ non-skipped token after a "new" keyword is a closing brace.
+
+ - Fix a regression when a CPPDEFINES list contains a tuple, the second
+ item of which (the option value) is a construction variable expansion
+ (e.g. $VALUE) and the value of the variable isn't a string.
+
+ - Improve the error message if an IOError (like trying to read a
+ directory as a file) occurs while deciding if a node is up-to-date.
+
+ - Fix "maximum recursion" / "unhashable type" errors in $CPPPATH
+ PathList expansion if a subsidiary expansion yields a stringable,
+ non-Node object.
+
+ - Generate API documentation from the docstrings (using epydoc).
+
+ - Fix use of --debug=presub with Actions for out-of-the-box Builders.
+
+ - Fix handling nested lists within $CPPPATH, $LIBPATH, etc.
+
+ - Fix a "builders_used" AttributeError that real-world Qt initialization
+ triggered in the refactored suffix handling for Builders.
+
+ - Make the reported --debug=time timings meaningful when used with -j.
+ Better documentation of what the times mean.
+
+ - User Guide updates: --random, AlwaysBuild(), --tree=,
+ --debug=findlibs, --debug=presub, --debug=stacktrace,
+ --taskmastertrace.
+
+ - Document (in both man page and User's Guide) that --implicit-cache
+ ignores changes in $CPPPATH, $LIBPATH, etc.
+
+ From Jean-Baptiste Lab:
+
+ - Remove hard-coded dependency on Python 2.2 from Debian packaging files.
+
+ From Jeff Mahovsky:
+
+ - Handle spaces in the build target name in Visual Studio project files.
+
+ From Rob Managan:
+
+ - Re-run LaTeX after BibTeX has been re-run in response to a changed
+ .bib file.
+
+ From Joel B. Mohler:
+
+ - Make additional TeX auxiliary files (.toc, .idx and .bbl files)
+ Precious so their removal doesn't affect whether the necessary
+ sections are included in output PDF or PostScript files.
+
+ From Gary Oberbrunner:
+
+ - Fix the ability to import modules in the site_scons directory from
+ a subdirectory.
+
+ From Adam Simpkins:
+
+ - Make sure parallel (-j) builds all targets even if they show up
+ multiple times in the child list (as a source and a dependency).
+
+ From Matthias Troffaes:
+
+ - Don't re-run TeX if the triggering strings (\makeindex, \bibliography
+ \tableofcontents) are commented out.
+
+ From Richard Viney:
+
+ - Fix use of custom include and lib paths with Visual Studio 8.
+
+ - Select the default .NET Framework SDK Dir based on the version of
+ Visual Studio being used.
+
+
+
+RELEASE 0.96.95 - Mon, 12 Feb 2007 20:25:16 -0600
+
+ From Anatoly Techtonik:
+
+ - Add the scons.org URL and a package description to the setup.py
+ arguments.
+
+ - Have the Windows installer add a registry entry for scons.bat in the
+ "App Paths" key, so scons.bat can be executed without adding the
+ directory to the %PATH%. (Python itself works this way.)
+
+ From Anonymous:
+
+ - Fix looking for default paths in Visual Studio 8.0 (and later).
+
+ - Add -lm to the list of default D libraries for linking.
+
+ From Matt Doar:
+
+ - Provide a more complete write-your-own-Scanner example in the man page.
+
+ From Ralf W. Grosse-Kunstleve:
+
+ - Contributed upstream Python change to our copied subprocess.py module
+ for more efficient standard input processing.
+
+ From Steven Knight:
+
+ - Fix the Node.FS.Base.rel_path() method when the two nodes are on
+ different drive letters. (This caused an infinite loop when
+ trying to write .sconsign files.)
+
+ - Fully support Scanners that use a dictionary to map file suffixes
+ to other scanners.
+
+ - Support delayed evaluation of the $SPAWN variable to allow selection
+ of a function via ${} string expansions.
+
+ - Add --srcdir as a synonym for -Y/--repository.
+
+ - Document limitations of #include "file.h" with Repository().
+
+ - Fix use of a toolpath under the source directory of a BuildDir().
+
+ - Fix env.Install() with a file name portion that begins with '#'.
+
+ - Fix ParseConfig()'s handling of multiple options in a string that's
+ replaced a *FLAGS construction variable.
+
+ - Have the C++ tools initialize common C compilation variables ($CCFLAGS,
+ $SHCCFLAGS and $_CCCOMCOM) even if the 'cc' Tool isn't loaded.
+
+ From Leanid Nazdrynau:
+
+ - Fix detection of Java anonymous classes if a newline precedes the
+ opening brace.
+
+ From Gary Oberbrunner:
+
+ - Document use of ${} to execute arbitrary Python code.
+
+ - Add support for:
+ 1) automatically adding a site_scons subdirectory (in the top-level
+ SConstruct directory) to sys.path (PYTHONPATH);
+ 2) automatically importing site_scons/site_init.py;
+ 3) automatically adding site_scons/site_tools to the toolpath.
+
+ From John Pye:
+
+ - Change ParseConfig() to preserve white space in arguments passed in
+ as a list.
+
+ From a smith:
+
+ - Fix adding explicitly-named Java inner class files (and any
+ other file names that may contain a '$') to Jar files.
+
+ From David Vitek:
+
+ - Add a NoCache() function to mark targets as unsuitable for propagating
+ to (or retrieving from) a CacheDir().
+
+ From Ben Webb:
+
+ - If the swig -noproxy option is used, it won't generate a .py file,
+ so don't emit it as a target that we expect to be built.
+
+
+
+RELEASE 0.96.94 - Sun, 07 Jan 2007 18:36:20 -0600
+
+ NOTE: This is a pre-release of 0.97 for testing purposes.
+
+ From Anonymous:
+
+ - Allow arbitrary white space after a SWIG %module declaration.
+
+ From Paul:
+
+ - When compiling resources under MinGW, make sure there's a space
+ between the --include-dir option and its argument.
+
+ From Jay Kint:
+
+ - Alleviate long command line issues on Windows by executing command
+ lines directly via os.spawnv() if the command line doesn't need
+ shell interpretation (has no pipes, redirection, etc.).
+
+ From Walter Franzini:
+
+ - Exclude additional Debian packaging files from the copyright check.
+
+ From Fawad Halim:
+
+ - Handle the conflict between the impending Python 2.6 'as' keyword
+ and our Tool/as.py module name.
+
+ From Steven Knight:
+
+ - Speed up the Node.FS.Dir.rel_path() method used to generate path names
+ that get put into the .sconsign* file(s).
+
+ - Optimize Node.FS.Base.get_suffix() by computing the suffix once, up
+ front, when we set the Node's name. (Duh...)
+
+ - Reduce the Memoizer's responsibilities to simply counting hits and
+ misses when the --debug=memoizer option is used, not to actually
+ handling the key calculation and memoization itself. This speeds
+ up some configurations significantly, and should cause no functional
+ differences.
+
+ - Add a new scons-time script with subcommands for generating
+ consistent timing output from SCons configurations, extracting
+ various information from those timings, and displaying them in
+ different formats.
+
+ - Reduce some unnecessary stat() calls from on-disk entry type checks.
+
+ - Fix SideEffect() when used with -j, which was badly broken in 0.96.93.
+
+ - Propagate TypeError exceptions when evaluating construction variable
+ expansions up the stack, so users can see what's going on.
+
+ - When disambiguating a Node.FS.Entry into a Dir or File, don't look
+ in the on-disk source directory until we've confirmed there's no
+ on-disk entry locally and there *is* one in the srcdir. This avoids
+ creating a phantom Node that can interfere with dependencies on
+ directory contents.
+
+ - Add an AllowSubstExceptions() function that gives the SConscript
+ files control over what exceptions cause a string to expand to ''
+ vs. terminating processing with an error.
+
+ - Allow the f90.py and f95.py Tool modules to compile earlier source
+ source files of earlier Fortran version.
+
+ - Fix storing signatures of files retrieved from CacheDir() so they're
+ correctly identified as up-to-date next invocation.
+
+ - Make sure lists of computed source suffixes cached by Builder objects
+ don't persist across changes to the list of source Builders (so the
+ addition of suffixes like .ui by the qt.py Tool module take effect).
+
+ - Enhance the bootstrap.py script to allow it to be used to execute
+ SCons more easily from a checked-out source tree.
+
+ From Ben Leslie:
+
+ - Fix post-Memoizer value caching misspellings in Node.FS._doLookup().
+
+ From Rob Managan, Dmitry Mikhin and Joel B. Mohler:
+
+ - Handle TeX/LaTeX files in subdirectories by changing directory
+ before invoking TeX/LaTeX.
+
+ - Scan LaTeX files for \bibliography lines.
+
+ - Support multiple file names in a "\bibliography{file1,file2}" string.
+
+ - Handle TeX warnings about undefined citations.
+
+ - Support re-running LaTeX if necessary due to a Table of Contents.
+
+ From Dmitry Mikhin:
+
+ - Return LaTeX if "Rerun to get citations correct" shows up on the next
+ line after the "Warning:" string.
+
+ From Gary Oberbrunner:
+
+ - Add #include lines to fix portability issues in two tests.
+
+ - Eliminate some unnecessary os.path.normpath() calls.
+
+ - Add a $CFLAGS variable for C-specific options, leaving $CCFLAGS
+ for options common to C and C++.
+
+ From Tom Parker:
+
+ - Have the error message print the missing file that Qt can't find.
+
+ From John Pye:
+
+ - Fix env.MergeFlags() appending to construction variable value of None.
+
+ From Steve Robbins:
+
+ - Fix the "sconsign" script when the .sconsign.dblite file is explicitly
+ specified on the command line (and not intuited from the old way of
+ calling it with just ".sconsign").
+
+ From Jose Pablo Ezequiel "Pupeno" Fernandez Silva:
+
+ - Give the 'lex' tool knowledge of the additional target files produced
+ by the flex "--header-file=" and "--tables-file=" options.
+
+ - Give the 'yacc' tool knowledge of the additional target files produced
+ by the bison "-g", "--defines=" and "--graph=" options.
+
+ - Generate intermediate files with Objective C file suffixes (.m) when
+ the lex and yacc source files have appropriate suffixes (.lm and .ym).
+
+ From Sohail Somain:
+
+ - Have the mslink.py Tool only look for a 'link' executable on Windows
+ systems.
+
+ From Vaclav Smilauer:
+
+ - Add support for a "srcdir" keyword argument when calling a Builder,
+ which will add a srcdir prefix to all non-relative string sources.
+
+ From Jonathan Ultis:
+
+ - Allow Options converters to take the construction environment as
+ an optional argument.
+
+
+
+RELEASE 0.96.93 - Mon, 06 Nov 2006 00:44:11 -0600
+
+ NOTE: This is a pre-release of 0.97 for testing purposes.
+
+ From Anonymous:
+
+ - Allow Python Value Nodes to be Builder targets.
+
+ From Matthias:
+
+ - Only filter Visual Studio common filename prefixes on complete
+ directory names.
+
+ From Chad Austin:
+
+ - Fix the build of the SCons documentation on systems that don't
+ have "python" in the $PATH.
+
+ From Ken Boortz:
+
+ - Enhance ParseConfig() to recognize options that begin with '+'.
+
+ From John Calcote, Elliot Murphy:
+
+ - Document ways to override the CCPDBFLAGS variable to use the
+ Microsoft linker's /Zi option instead of the default /Z7.
+
+ From Christopher Drexler:
+
+ - Make SCons aware bibtex must be called if any \include files
+ cause creation of a bibliography.
+
+ - Make SCons aware that "\bilbiography" in TeX source files means
+ that related .bbl and .blg bibliography files will be created.
+ (NOTE: This still needs to search for the string in \include files.)
+
+ From David Gruener:
+
+ - Fix inconsistent handling of Action strfunction arguments.
+
+ - Preserve white space in display Action strfunction strings.
+
+ From James Y. Knight and Gerard Patel:
+
+ - Support creation of shared object files from assembly language.
+
+ From Steven Knight:
+
+ - Speed up the Taskmaster significantly by avoiding unnecessary
+ re-scans of Nodes to find out if there's work to be done, having it
+ track the currently-executed top-level target directly and not
+ through its presence on the target list, and eliminating some other
+ minor list(s), method(s) and manipulation.
+
+ - Fix the expansion of $TARGET and $SOURCE in the expansion of
+ $INSTALLSTR displayed for non-environment calls to InstallAs().
+
+ - Fix the ability to have an Alias() call refer to a directory
+ name that's not identified as a directory until later.
+
+ - Enhance runtest.py with an option to use QMTest as the harness.
+ This will become the default behavior as we add more functionality
+ to the QMTest side.
+
+ - Let linking on mingw use the default function that chooses $CC (gcc)
+ or $CXX (g++) depending on whether there are any C++ source files.
+
+ - Work around a bug in early versions of the Python 2.4 profile module
+ that caused the --profile= option to fail.
+
+ - Only call Options validators and converters once when initializing a
+ construction environment.
+
+ - Fix the ability of env.Append() and env.Prepend(), in all known Python
+ versions, to handle different input value types when the construction
+ variable being updated is a dictionary.
+
+ - Add a --cache-debug option for information about what files it's
+ looking for in a CacheDir().
+
+ - Document the difference in construction variable expansion between
+ {Action,Builder}() and env.{Action,Builder}().
+
+ - Change the name of env.Copy() to env.Clone(), keeping the old name
+ around for backwards compatibility (with the intention of eventually
+ phasing it out to avoid confusion with the Copy() Action factory).
+
+ From Arve Knudsen:
+
+ - Support cleaning and scanning SWIG-generated files.
+
+ From Carsten Koch:
+
+ - Allow selection of Visual Studio version by setting $MSVS_VERSION
+ after construction environment initialization.
+
+ From Jean-Baptiste Lab:
+
+ - Try using zipimport if we can't import Tool or Platform modules
+ using the normal "imp" module. This allows SCons to be packaged
+ using py2exe's all-in-one-zip-file approach.
+
+ From Ben Liblit:
+
+ - Do not re-scan files if the scanner returns no implicit dependencies.
+
+ From Sanjoy Mahajan:
+
+ - Change use of $SOURCES to $SOURCE in all TeX-related Tool modules.
+
+ From Joel B. Mohler:
+
+ - Make SCons aware that "\makeindex" in TeX source files means that
+ related .ilg, .ind and .idx index files will be created.
+ (NOTE: This still needs to search for the string in \include files.)
+
+ - Prevent scanning the TeX .aux file for additional files from
+ trying to remove it twice when the -c option is used.
+
+ From Leanid Nazdrynau:
+
+ - Give the MSVC RES (resource) Builder a src_builder list and a .rc
+ src_suffix so other builders can generate .rc files.
+
+ From Matthew A. Nicholson:
+
+ - Enhance Install() and InstallAs() to handle directory trees as sources.
+
+ From Jan Nijtmans:
+
+ - Don't use the -fPIC flag when using gcc on Windows (e.g. MinGW).
+
+ From Greg Noel:
+
+ - Add an env.ParseFlags() method that provides separate logic for
+ parsing GNU tool chain flags into a dictionary.
+
+ - Add an env.MergeFlags() method to apply an arbitrary dictionary
+ of flags to a construction environment's variables.
+
+ From Gary Oberbrunner:
+
+ - Fix parsing tripartite Intel C compiler version numbers on Linux.
+
+ - Extend the ParseConfig() function to recognize -arch and
+ -isysroot options.
+
+ - Have the error message list the known suffixes when a Builder call
+ can't build a source file with an unknown suffix.
+
+ From Karol Pietrzak:
+
+ - Avoid recursive calls to main() in the program snippet used by the
+ SConf subsystem to test linking against libraries. This changes the
+ default behavior of CheckLib() and CheckLibWithHeader() to print
+ "Checking for C library foo..." instead of "Checking for main()
+ in C library foo...".
+
+ From John Pye:
+
+ - Throw an exception if a command called by ParseConfig() or
+ ParseFlags() returns an error.
+
+ From Stefan Seefeld:
+
+ - Initial infrastructure for running SCons tests under QMTest.
+
+ From Sohail Somani:
+
+ - Fix tests that fail due to gcc warnings.
+
+ From Dobes Vandermeer:
+
+ - In stack traces, print the full paths of SConscript files.
+
+ From Atul Varma:
+
+ - Fix detection of Visual C++ Express Edition.
+
+ From Dobes Vandermeer:
+
+ - Let the src_dir option to the SConscript() function affect all the
+ the source file paths, instead of treating all source files paths
+ as relative to the SConscript directory itself.
+
+ From Nicolas Vigier:
+
+ - Fix finding Fortran modules in build directories.
+
+ - Fix use of BuildDir() when the source file in the source directory
+ is a symlink with a relative path.
+
+ From Edward Wang:
+
+ - Fix the Memoizer when the SCons Python modules are executed from
+ .pyo files at different locations from where they were compiled.
+
+ From Johan Zander:
+
+ - Fix missing os.path.join() when constructing the $FRAMEWORKSDKDIR/bin.
+
+
+
+RELEASE 0.96.92 - Mon, 10 Apr 2006 21:08:22 -0400
+
+ NOTE: This was a pre-release of 0.97 for testing purposes.
+
+ From Anonymous:
+
+ - Fix the intelc.py Tool module to not throw an exception if the
+ only installed version is something other than ia32.
+
+ - Set $CCVERSION when using gcc.
+
+ From Matthias:
+
+ - Support generating project and solution files for Microsoft
+ Visual Studio version 8.
+
+ - Support generating more than one project file for a Microsoft
+ Visual Studio solution file.
+
+ - Add support for a support "runfile" parameter to Microsoft
+ Visual Studio project file creation.
+
+ - Put the project GUID, not the solution GUID, in the right spot
+ in the solution file.
+
+ From Erling Andersen:
+
+ - Fix interpretation of Node.FS objects wrapped in Proxy instances,
+ allowing expansion of things like ${File(TARGET)} in command lines.
+
+ From Stanislav Baranov:
+
+ - Add a separate MSVSSolution() Builder, with support for the
+ following new construction variables: $MSVSBUILDCOM, $MSVSCLEANCOM,
+ $MSVSENCODING, $MSVSREBUILDCOM, $MSVSSCONS, $MSVSSCONSCOM,
+ $MSVSSCONSFLAGS, $MSVSSCONSCRIPT and $MSVSSOLUTIONCOM.
+
+ From Ralph W. Grosse-Kunstleve and Patrick Mezard:
+
+ - Remove unneceesary (and incorrect) SCons.Util strings on some function
+ calls in SCons.Util.
+
+ From Bob Halley:
+
+ - Fix C/C++ compiler selection on AIX to not always use the external $CC
+ environment variable.
+
+ From August Hörandl:
+
+ - Add a scanner for \include and \import files, with support for
+ searching a directory list in $TEXINPUTS (imported from the external
+ environment).
+
+ - Support $MAKEINDEX, $MAKEINDEXCOM, $MAKEINDEXCOMSTR and
+ $MAKEINDEXFLAGS for generating indices from .idx files.
+
+ From Steven Johnson:
+
+ - Add a NoClean() Environment method and function to override removal
+ of targets during a -c clean, including documentation and tests.
+
+ From Steven Knight:
+
+ - Check for whether files exist on disk by listing the directory
+ contents, not calling os.path.exists() file by file. This is
+ somewhat more efficient in general, and may be significantly
+ more efficient on Windows.
+
+ - Minor speedups in the internal is_Dict(), is_List() and is_String()
+ functions.
+
+ - Fix a signature refactoring bug that caused Qt header files to
+ get re-generated every time.
+
+ - Don't fail when writing signatures if the .sconsign.dblite file is
+ owned by a different user (e.g. root) from a previous run.
+
+ - When deleting variables from stacked OverrideEnvironments, don't
+ throw a KeyError if we were able to delte the variable from any
+ Environment in the stack.
+
+ - Get rid of the last indentation tabs in the SCons source files and
+ add -tt to the Python invocations in the packaging build and the
+ tests so they don't creep back in.
+
+ - In Visual Studio project files, put quotes around the -C directory
+ so everything works even if the path has spaces in it.
+
+ - The Intel Fortran compiler uses -object:$TARGET, not "-o $TARGET",
+ when building object files on Windows. Have the the ifort Tool
+ modify the default command lines appropriately.
+
+ - Document the --debug=explain option in the man page. (How did we
+ miss this?)
+
+ - Add a $LATEXRETRIES variable to allow configuration of the number of
+ times LaTex can be re-called to try to resolve undefined references.
+
+ - Change the order of the arguments to Configure.Checklib() to match
+ the documentation.
+
+ - Handle signature calculation properly when the Python function used
+ for a FunctionAction is an object method.
+
+ - On Windows, assume that absolute path names without a drive letter
+ refer to the drive on which the SConstruct file lives.
+
+ - Add /usr/ccs/bin to the end of the the default external execution
+ PATH on Solaris.
+
+ - Add $PKGCHK and $PKGINFO variables for use on Solaris when searching
+ for the SunPRO C++ compiler. Make the default value for $PKGCHK
+ be /usr/sbin/pgkchk (since /usr/sbin isn't usually on the external
+ execution $PATH).
+
+ - Fix a man page example of overriding variables when calling
+ SharedLibrary() to also set the $LIBSUFFIXES variable.
+
+ - Add a --taskmastertrace=FILE option to give some insight on how
+ the taskmaster decides what Node to build next.
+
+ - Changed the names of the old $WIN32DEFPREFIX, $WIN32DEFSUFFIX,
+ $WIN32DLLPREFIX and $WIN32IMPLIBPREFIX construction variables to
+ new $WINDOWSDEFPREFIX, $WINDOWSDEFSUFFIX, $WINDOWSDLLPREFIX and
+ $WINDOWSIMPLIBPREFIX construction variables. The old names are now
+ deprecated, but preserved for backwards compatibility.
+
+ - Fix (?) a runtest.py hang on Windows when the --xml option is used.
+
+ - Change the message when an error occurs trying to interact with the
+ file system to report the target(s) in square brackets (as before) and
+ the actual file or directory that encountered the error afterwards.
+
+ From Chen Lee:
+
+ - Add x64 support for Microsoft Visual Studio 8.
+
+ From Baptiste Lepilleur:
+
+ - Support the --debug=memory option on Windows when the Python version
+ has the win32process and win32api modules.
+
+ - Add support for Visual Studio 2005 Pro.
+
+ - Fix portability issues in various tests: test/Case.py,
+ Test/Java/{JAR,JARCHDIR,JARFLAGS,JAVAC,JAVACFLAGS,JAVAH,RMIC}.py,
+ test/MSVS/vs-{6.0,7.0,7.1,8.0}-exec.py,
+ test/Repository/{Java,JavaH,RMIC}.py,
+ test/QT/{generated-ui,installed,up-to-date,warnings}.py,
+ test/ZIP/ZIP.py.
+
+ - Ignore pkgchk errors on Solaris when searching for the C++ compiler.
+
+ - Speed up the SCons/EnvironmentTests.py unit tests.
+
+ - Add a --verbose= option to runtest.py to print executed commands
+ and their output at various levels.
+
+ From Christian Maaser:
+
+ - Add support for Visual Studio Express Editions.
+
+ - Add support for Visual Studio 8 *.manifest files, includng
+ new $WINDOWS_INSERT_MANIFEST, $WINDOWSPROGMANIFESTSUFFIX,
+ $WINDOWSPROGMANIFESTPREFIX, $WINDOWSPROGMANIFESTSUFFIX,
+ $WINDOWSSHLIBMANIFESTPREFIX and $WINDOWSSHLIBMANIFESTSUFFIX
+ construction variables.
+
+ From Adam MacBeth:
+
+ - Fix detection of additional Java inner classes following use of a
+ "new" keyword inside an inner class.
+
+ From Sanjoy Mahajan:
+
+ - Correct TeX-related command lines to just $SOURCE, not $SOURCES
+
+ From Patrick Mezard:
+
+ - Execute build commands for a command-line target if any of the
+ files built along with the target is out of date or non-existent,
+ not just if the command-line target itself is out of date.
+
+ - Fix the -n option when used with -c to print all of the targets
+ that will be removed for a multi-target Builder call.
+
+ - If there's no file in the source directory, make sure there isn't
+ one in the build directory, too, to avoid dangling files left
+ over from previous runs when a source file is removed.
+
+ - Allow AppendUnique() and PrependUnique() to append strings (and
+ other atomic objects) to lists.
+
+ From Joel B. Mohler:
+
+ - Extend latex.py, pdflatex.py, pdftex.py and tex.py so that building
+ from both TeX and LaTeX files uses the same logic to call $BIBTEX
+ when it's necessary, to call $MAKEINDEX when it's necessary, and to
+ call $TEX or $LATEX multiple times to handle undefined references.
+
+ - Add an emitter to the various TeX builders so that the generated
+ .aux and .log files also get deleted by the -c option.
+
+ From Leanid Nazdrynau:
+
+ - Fix the Qt UIC scanner to work with generated .ui files (by using
+ the FindFile() function instead of checking by-hand for the file).
+
+ From Jan Nieuwenhuizen:
+
+ - Fix a problem with interpreting quoted argument lists on command lines.
+
+ From Greg Noel:
+
+ - Add /sw/bin to the default execution PATH on Mac OS X.
+
+ From Kian Win Ong:
+
+ - When building a .jar file and there is a $JARCHDIR, put the -C
+ in front of each .class file on the command line.
+
+ - Recognize the Java 1.5 enum keyword.
+
+ From Asfand Yar Qazi:
+
+ - Add /opt/bin to the default execution PATH on all POSIX platforms
+ (between /usr/local/bin and /bin).
+
+ From Jon Rafkind:
+
+ - Fix the use of Configure() contexts from nested subsidiary
+ SConscript files.
+
+ From Christoph Schulz:
+
+ - Add support for $CONFIGUREDIR and $CONFIGURELOG variables to control
+ the directory and logs for configuration tests.
+
+ - Add support for a $INSTALLSTR variable.
+
+ - Add support for $RANLIBCOM and $RANLIBCOMSTR variables (which fixes
+ a bug when setting $ARCOMSTR).
+
+ From Amir Szekely:
+
+ - Add use of $CPPDEFINES to $RCCOM (resource file compilation) on MinGW.
+
+ From Erick Tryzelaar:
+
+ - Fix the error message when trying to report that a given option is
+ not gettable/settable from an SConscript file.
+
+ From Dobes Vandermeer:
+
+ - Add support for SCC and other settings in Microsoft Visual
+ Studio project and solution files: $MSVS_PROJECT_BASE_PATH,
+ $MSVS_PROJECT_GUID, $MSVS_SCC_AUX_PATH, $MSVS_SCC_LOCAL_PATH,
+ $MSVS_SCC_PROJECT_NAME, $MSVS_SCC_PROVIDER,
+
+ - Add support for using a $SCONS_HOME variable (imported from the
+ external environment, or settable internally) to put a shortened
+ SCons execution line in the Visual Studio project file.
+
+ From David J. Van Maren:
+
+ - Only filter common prefixes from source files names in Visual Studio
+ project files if the prefix is a complete (sub)directory name.
+
+ From Thad Ward:
+
+ - If $MSVSVERSIONS is already set, don't overwrite it with
+ information from the registry.
+
+
+
+RELEASE 0.96.91 - Thu, 08 Sep 2005 07:18:23 -0400
+
+ NOTE: This was a pre-release of 0.97 for testing purposes.
+
+ From Chad Austin:
+
+ - Have the environment store the toolpath and re-use it to find Tools
+ modules during later Copy() or Tool() calls (unless overridden).
+
+ - Normalize the directory path names in SConsignFile() database
+ files so the same signature file can interoperate on Windows and
+ non-Windows systems.
+
+ - Make --debug=stacktrace print a stacktrace when a UserError is thrown.
+
+ - Remove an old, erroneous cut-and-paste comment in Scanner/Dir.py.
+
+ From Stanislav Baranov:
+
+ - Make it possible to support with custom Alias (sub-)classes.
+
+ - Allow Builders to take empty source lists when called.
+
+ - Allow access to both TARGET and SOURCE in $*PATH expansions.
+
+ - Allow SConscript files to modify BUILD_TARGETS.
+
+ From Timothee Besset:
+
+ - Add support for Objective C/C++ .m and .mm file suffixes (for
+ Mac OS X).
+
+ From Charles Crain
+
+ - Fix the PharLap linkloc.py module to use target+source arguments
+ when calling env.subst().
+
+ From Bjorn Eriksson:
+
+ - Fix an incorrect Command() keyword argument in the man page.
+
+ - Add a $TEMPFILEPREFIX variable to control the prefix or flag used
+ to pass a long-command-line-execution tempfile to a command.
+
+ From Steven Knight:
+
+ - Enhanced the SCons setup.py script to install man pages on
+ UNIX/Linux systems.
+
+ - Add support for an Options.FormatOptionHelpText() method that can
+ be overridden to customize the format of Options help text.
+
+ - Add a global name for the Entry class (which had already been
+ documented).
+
+ - Fix re-scanning of generated source files for implicit dependencies
+ when the -j option is used.
+
+ - Fix a dependency problem that caused $LIBS scans to not be added
+ to all of the targets in a multiple-target builder call, which
+ could cause out-of-order builds when the -j option is used.
+
+ - Store the paths of source files and dependencies in the .sconsign*
+ file(s) relative to the target's directory, not relative to the
+ top-level SConstruct directory. This starts to make it possible to
+ subdivide the dependency tree arbitrarily by putting an SConstruct
+ file in every directory and using content signatures.
+
+ - Add support for $YACCHFILESUFFIX and $YACCHXXFILESUFFIX variables
+ that accomodate parser generators that write header files to a
+ different suffix than the hard-coded .hpp when the -d option is used.
+
+ - The default behavior is now to store signature information in a
+ single .sconsign.dblite file in the top-level SConstruct directory.
+ The old behavior of a separate .sconsign file in each directory can
+ be specified by calling SConsignFile(None).
+
+ - Remove line number byte codes within the signature calculation
+ of Python function actions, so that changing the location of an
+ otherwise unmodified Python function doesn't cause rebuilds.
+
+ - Fix AddPreAction() and AddPostAction() when an action has more than
+ one target file: attach the actions to the Executor, not the Node.
+
+ - Allow the source directory of a BuildDir / build_dir to be outside
+ of the top-level SConstruct directory tree.
+
+ - Add a --debug=nomemoizer option that disables the Memoizer for clearer
+ looks at the counts and profiles of the underlying function calls,
+ not the Memoizer wrappers.
+
+ - Print various --debug= stats even if we exit early (e.g. using -h).
+
+ - Really only use the cached content signature value if the file
+ is older than --max-drift, not just if --max-drift is set.
+
+ - Remove support for conversion from old (pre 0.96) .sconsign formats.
+
+ - Add support for a --diskcheck option to enable or disable various
+ on-disk checks: that File and Dir nodes match on-disk entries;
+ whether an RCS file exists for a missing source file; whether an
+ SCCS file exists for a missing source file.
+
+ - Add a --raw argument to the sconsign script, so it can print a
+ raw representation of each entry's NodeInfo dictionary.
+
+ - Add the 'f90' and 'f95' tools to the list of Fortran compilers
+ searched for by default.
+
+ - Add the +Z option by default when compiling shared objects on
+ HP-UX.
+
+ From Chen Lee:
+
+ - Handle Visual Studio project and solution files in Unicode.
+
+ From Sanjoy Mahajan:
+
+ - Fix a bad use of Copy() in an example in the man page, and a
+ bad regular expression example in the man page and User's Guide.
+
+ From Shannon Mann:
+
+ - Have the Visual Studio project file(s) echo "Starting SCons" before
+ executing SCons, mainly to work around a quote-stripping bug in
+ (some versions of?) the Windows cmd command executor.
+
+ From Georg Mischler:
+
+ - Remove the space after the -o option when invoking the Borland
+ BCC compiler; some versions apparently require that the file name
+ argument be concatenated with the option.
+
+ From Leanid Nazdrynau:
+
+ - Fix the Java parser's handling of backslashes in strings.
+
+ From Greg Noel:
+
+ - Add construction variables to support frameworks on Mac OS X:
+ $FRAMEWORKS, $FRAMEWORKPREFIX, $FRAMEWORKPATH, $FRAMEWORKPATHPREFIX.
+
+ - Re-order link lines so the -o option always comes right after the
+ command name.
+
+ From Gary Oberbrunner:
+
+ - Add support for Intel C++ beta 9.0 (both 32 and 64 bit versions).
+
+ - Document the new $FRAMEWORK* variables for Mac OS X.
+
+ From Karol Pietrzak:
+
+ - Add $RPATH (-R) support to the Sun linker Tool (sunlink).
+
+ - Add a description of env.subst() to the man page.
+
+ From Chris Prince:
+
+ - Look in the right directory, not always the local directory, for a
+ same-named file or directory conflict on disk.
+
+ - On Windows, preserve the external environment's %SYSTEMDRIVE%
+ variable, too.
+
+ From Craig Scott:
+
+ - Have the Fortran module emitter look for Fortan modules to be created
+ relative to $FORTRANMODDIR, not the top-level directory.
+
+ - When saving Options to a file, run default values through the
+ converter before comparing them with the set values. This correctly
+ suppresses Boolean Option values from getting written to the saved
+ file when they're one of the many synonyms for a default True or
+ False value.
+
+ - Fix the Fortran Scanner's ability to handle a module being used
+ in the same file in which it is defined.
+
+ From Steve-o:
+
+ - Add the -KPIC option by default when compiling shared objects on
+ Solaris.
+
+ - Change the default suffix for Solaris objects to .o, to conform to
+ Sun WorkShop's expectations. Change the profix to so_ so they can
+ still be differentiated from static objects in the same directory.
+
+ From Amir Szekely:
+
+ - When calling the resource compiler on MinGW, add --include-dir and
+ the source directory so it finds the source file.
+
+ - Update EnsureSConsVersion() to support revision numbers.
+
+ From Greg Ward:
+
+ - Fix a misplaced line in the man page.
+
+
+
+RELEASE 0.96.90 - Tue, 15 Feb 2005 21:21:12 +0000
+
+ NOTE: This was a pre-release of 0.97 for testing purposes.
+
+ From Anonymous:
+
+ - Fix Java parsing to avoid erroneously identifying a new array
+ of class instances as an anonymous inner class.
+
+ - Fix a typo in the man page description of PathIsDirCreate.
+
+ From Chad Austin:
+
+ - Allow Help() to be called multiple times, appending to the help
+ text each call.
+
+ - Allow Tools found on a toolpath to import Python modules from
+ their local directory.
+
+ From Steve Christensen:
+
+ - Handle exceptions from Python functions as build actions.
+
+ - Add a set of canned PathOption validators: PathExists (the default),
+ PathIsFile, PathIsDir and PathIsDirCreate.
+
+ From Matthew Doar:
+
+ - Add support for .lex and .yacc file suffixes for Lex and Yacc files.
+
+ From Eric Frias:
+
+ - Huge performance improvement: wrap the tuples representing an
+ include path in an object, so that the time it takes to hash the
+ path doesn't grow porportionally to the length of the path.
+
+ From Gottfried Ganssauge:
+
+ - Fix SCons on SuSE/AMD-64 Linux by having the wrapper script also
+ check for the build engine in the parent directory of the Python
+ library directory (/usr/lib64 instead of /usr/lib).
+
+ From Stephen Kennedy:
+
+ - Speed up writing the .sconsign file at the end of a run by only
+ calling sync() once at the end, not after every entry.
+
+ From Steven Knight:
+
+ - When compiling with Microsoft Visual Studio, don't include the ATL and
+ MFC directories in the default INCLUDE and LIB environment variables.
+
+ - Remove the following deprecated features: the ParseConfig()
+ global function (deprecated in 0.93); the misspelled "validater"
+ keyword to the Options.Add() method (deprecated in 0.91); the
+ SetBuildSignatureType(), SetContentSignatureType(), SetJobs() and
+ GetJobs() global functions (deprecated in 0.14).
+
+ - Fix problems with corrupting the .sconsign.dblite file when
+ interrupting builds by writing to a temporary file and renaming,
+ not writing the file directly.
+
+ - Fix a 0.96 regression where when running with -k, targets built from
+ walking dependencies later on the command line would not realize
+ that a dependency had failed an earlier build attempt, and would
+ try to rebuild the dependent targets.
+
+ - Change the final messages when using -k and errors occur from
+ "{building,cleaning} terminated because of errors" to "done
+ {building,cleaning} targets (errors occurred during {build,clean})."
+
+ - Allow Configure.CheckFunc() to take an optional header argument
+ (already supported by Conftest.py) to specify text at the top of
+ the compiled test file.
+
+ - Fix the --debug=explain output when a Python function action changed
+ so it prints a meaningful string, not the binary representation of
+ the function contents.
+
+ - Allow a ListOption's default value(s) to be a Python list of specified
+ values, not just a string containing a comma-separated list of names.
+
+ - Add a ParseDepends() function that will parse up a list of explicit
+ dependencies from a "make depend" style file.
+
+ - Support the ability to change directory when executing an Action
+ through "chdir" keyword arguments to Action and Builder creation
+ and calls.
+
+ - Fix handling of Action ojects (and other callables that don't match
+ our calling arguments) in construction variable expansions.
+
+ - On Win32, install scons.bat in the Python directory when installing
+ from setup.py. (The bdist_wininst installer was already doing this.)
+
+ - Fix env.SConscript() when called with a list of SConscipt files.
+ (The SConscript() global function already worked properly.)
+
+ - Add a missing newline to the end of the --debug=explain "unknown
+ reasons" message.
+
+ - Enhance ParseConfig() to work properly for spaces in between the -I,
+ -L and -l options and their arguments.
+
+ - Packaging build fix: Rebuild the files that are use to report the
+ --version of SCons whenever the development version number changes.
+
+ - Fix the ability to specify a target_factory of Dir() to a Builder,
+ which the default create-a-directory Builder was interfering with.
+
+ - Mark a directory as built if it's created as part of the preparation
+ for another target, to avoid trying to build it again when it comes
+ up in the target list.
+
+ - Allow a function with the right calling signature to be put directly
+ in an Environment's BUILDERS dictionary, making for easier creation
+ and use of wrappers (pseudo-Builders) that call other Builders.
+
+ - On Python 2.x, wrap lists of Nodes returned by Builders in a UserList
+ object that adds a method that makes str() object return a string
+ with all of the Nodes expanded to their path names. (Builders under
+ Python 1.5.2 still return lists to avoid TypeErrors when trying
+ to extend() list, so Python 1.5.2 doesn't get pretty-printing of Node
+ lists, but everything should still function.)
+
+ - Allow Aliases to have actions that will be executed whenever
+ any of the expanded Alias targets are out of date.
+
+ - Fix expansion of env.Command() overrides within target and
+ source file names.
+
+ - Support easier customization of what's displayed by various default
+ actions by adding lots of new construction variables: $ARCOMSTR,
+ $ASCOMSTR, $ASPPCOMSTR, $BIBTEXCOMSTR, $BITKEEPERCOMSTR, $CCCOMSTR,
+ $CVSCOMSTR, $CXXCOMSTR, $DCOMSTR, $DVIPDFCOMSTR, $F77COMSTR,
+ $F90COMSTR, $F95COMSTR, $FORTRANCOMSTR, $GSCOMSTR, $JARCOMSTR,
+ $JAVACCOMSTR, $JAVAHCOMSTR, $LATEXCOMSTR, $LEXCOMSTR, $LINKCOMSTR,
+ $M4COMSTR, $MIDLCOMSTR, $P4COMSTR, $PCHCOMSTR, $PDFLATEXCOMSTR,
+ $PDFTEXCOMSTR, $PSCOMSTR, $QT_MOCFROMCXXCOMSTR, $QT_MOCFROMHCOMSTR,
+ $QT_UICCOMSTR, $RCCOMSTR, $REGSVRCOMSTR, $RCS_COCOMSTR, $RMICCOMSTR,
+ $SCCSCOMSTR, $SHCCCOMSTR, $SHCXXCOMSTR, $SHF77COMSTR, $SHF90COMSTR,
+ $SHF95COMSTR, $SHFORTRANCOMSTR, $SHLINKCOMSTR, $SWIGCOMSTR,
+ $TARCOMSTR, $TEXCOMSTR, $YACCCOMSTR and $ZIPCOMSTR.
+
+ - Add an optional "map" keyword argument to ListOption() that takes a
+ dictionary to map user-specified values to legal values from the list
+ (like EnumOption() already doee).
+
+ - Add specific exceptions to try:-except: blocks without any listed,
+ so that they won't catch and mask keyboard interrupts.
+
+ - Make --debug={tree,dtree,stree} print something even when there's
+ a build failure.
+
+ - Fix how Scanners sort the found dependencies so that it doesn't
+ matter whether the dependency file is in a Repository or not.
+ This may cause recompilations upon upgrade to this version.
+
+ - Make AlwaysBuild() work with Alias and Python value Nodes (making
+ it much simpler to support aliases like "clean" that just invoke
+ an arbitrary action).
+
+ - Have env.ParseConfig() use AppendUnique() by default to suppress
+ duplicate entries from multiple calls. Add a "unique" keyword
+ argument to allow the old behavior to be specified.
+
+ - Allow the library modules imported by an SConscript file to get at
+ all of the normally-available global functions and variables by saying
+ "from SCons.Script import *".
+
+ - Add a --debug=memoizer option to print Memoizer hit/mass statistics.
+
+ - Allow more than one --debug= option to be set at a time.
+
+ - Change --debug=count to report object counts before and after
+ reading SConscript files and before and after building targets.
+
+ - Change --debug=memory output to line up the numbers and to better
+ match (more or less) the headers on the --debug=count columns.
+
+ - Speed things up when there are lists of targets and/or sources by
+ getting rid of some N^2 walks of the lists involved.
+
+ - Cache evaluation of LazyActions so we don't create a new object
+ for each invocation.
+
+ - When scanning, don't create Nodes for include files that don't
+ actually exist on disk.
+
+ - Make supported global variables CScanner, DScanner, ProgramScanner and
+ SourceFileScanner. Make SourceFileScanner.add_scanner() a supported
+ part of the public interface. Keep the old SCons.Defaults.*Scan names
+ around for a while longer since some people were already using them.
+
+ - By default, don't scan directories for on-disk files. Add a
+ DirScanner global scanner that can be used in Builders or Command()
+ calls that want source directory trees scanned for on-disk changes.
+ Have the Tar() and Zip() Builders use the new DirScanner to preserve
+ the behavior of rebuilding a .tar or .zip file if any file or
+ directory under a source tree changes. Add Command() support for
+ a source_scanner keyword argument to Command() that can be set to
+ DirScanner to get this behavior.
+
+ - Documentation changes: Explain that $CXXFLAGS contains $CCFLAGS
+ by default. Fix a bad target_factory example in the man page.
+ Add appendices to the User's Guide to cover the available Tools,
+ Builders and construction variables. Comment out the build of
+ the old Python 10 paper, which doesn't build on all systems and
+ is old enough at this point that it probably isn't worth the
+ effort to make it do so.
+
+ From Wayne Lee:
+
+ - Avoid "maximum recursion limit" errors when removing $(-$) pairs
+ from long command lines.
+
+ From Clive Levinson:
+
+ - Make ParseConfig() recognize and add -mno-cygwin to $LINKFLAGS and
+ $CCFLAGS, and -mwindows to $LINKFLAGS.
+
+ From Michael McCracken:
+
+ - Add a new "applelink" tool to handle the things like Frameworks and
+ bundles that Apple has added to gcc for linking.
+
+ - Use more appropriate default search lists of linkers, compilers and
+ and other tools for the 'darwin' platform.
+
+ - Add a LoadableModule Builder that builds a bundle on Mac OS X (Darwin)
+ and a shared library on other systems.
+
+ - Improve SWIG tests for use on Mac OS X (Darwin).
+
+ From Elliot Murphy:
+
+ - Enhance the tests to guarantee persistence of ListOption
+ values in saved options files.
+
+ - Supply the help text when -h is used with the -u, -U or -D options.
+
+ From Christian Neeb:
+
+ - Fix the Java parser's handling of string definitions to avoid ignoring
+ subsequent code.
+
+ From Han-Wen Nienhuys:
+
+ - Optimize variable expansion by: using the re.sub() method (when
+ possible); not using "eval" for variables for which we can fetch the
+ value directory; avoiding slowing substitution logic when there's no
+ '$' in the string.
+
+ From Gary Oberbrunner:
+
+ - Add an Environment.Dump() method to print the contents of a
+ construction environment.
+
+ - Allow $LIBS (and similar variables) to contain explicit File Nodes.
+
+ - Change ParseConfig to add the found library names directly to the
+ $LIBS variable, instead of returning them.
+
+ - Add ParseConfig() support for the -framework GNU linker option.
+
+ - Add a PRINT_CMD_LINE_FUNC construction variable to allow people
+ to filter (or log) command-line output.
+
+ - Print an internal Python stack trace in response to an otherwise
+ unexplained error when --debug=stacktrace is specified.
+
+ - Add a --debug=findlibs option to print what's happening when
+ the scanner is searching for libraries.
+
+ - Allow Tool specifications to be passed a dictionary of keyword
+ arguments.
+
+ - Support an Options default value of None, in which case the variable
+ will not be added to the construction environment unless it's set
+ explicitly by the user or from an Options file.
+
+ - Avoid copying __builtin__ values into a construction environment's
+ dictionary when evaluating construction variables.
+
+ - Add a new cross-platform intelc.py Tool that can detect and
+ configure the Intel C++ v8 compiler on both Windows, where it's
+ named icl, and Linux, where it's named icc. It also checks that
+ the directory specified in the Windows registry exists, and sets a
+ new $INTEL_C_COMPILER_VERSION construction variable to identify the
+ version being used. (Niall Douglas contributed an early prototype
+ of parts of this module.)
+
+ - Fix the private Conftest._Have() function so it doesn't change
+ non-alphanumeric characters to underscores.
+
+ - Supply a better error message when a construction variable expansion
+ has an unknown attribute.
+
+ - Documentation changes: Update the man page to describe use of
+ filenames or Nodes in $LIBS.
+
+ From Chris Pawling:
+
+ - Have the linkloc tool use $MSVS_VERSION to select the Microsoft
+ Visual Studio version to use.
+
+ From Kevin Quick:
+
+ - Fix the Builder name returned from ListBuilders and other instances
+ of subclasses of the BuilderBase class.
+
+ - Add Builders and construction variables to support rpcgen:
+ RPCGenClient(), RPCGenHeader(), RPCGenService(), RPCGenXDR(),
+ $RPCGEN, $RPCGENFLAGS, $RPCGENCLIENTFLAGS, $RPCGENHEADERFLAGS,
+ $RPCGENSERVICEFLAGS, $RPCGENXDRFLAGS.
+
+ - Update the man page to document that prefix and suffix Builder
+ keyword arguments can be strings, callables or dictionaries.
+
+ - Provide more info in the error message when a user tries to build
+ a target multiple ways.
+
+ - Fix Delete() when a file doesn't exist and must_exist=1. (We were
+ unintentionally dependent on a bug in versions of the Python shutil.py
+ module prior to Python 2.3, which would generate an exception for
+ a nonexistent file even when ignore_errors was set.)
+
+ - Only replace a Node's builder with a non-null source builder.
+
+ - Fix a stack trace when a suffix selection dictionary is passed
+ an empty source file list.
+
+ - Allow optional names to be attached to Builders, for default
+ Builders that don't get attached to construction environments.
+
+ - Fix problems with Parallel Task Exception handling.
+
+ - Build targets in an associated BuildDir even if there are targets
+ or subdirectories locally in the source directory.
+
+ - If a FunctionAction has a callable class as its underlying Python
+ function, use its strfunction() method (if any) to display the
+ action.
+
+ - Fix handling when BuildDir() exists but is unwriteable. Add
+ "Stop." to those error messages for consistency.
+
+ - Catch incidents of bad builder creation (without an action) and
+ supply meaningful error messages.
+
+ - Fix handling of src_suffix values that aren't extensions (don't
+ begin with a '.').
+
+ - Don't retrieve files from a CacheDir, but report what would happen,
+ when the -n option is used.
+
+ - Use the source_scanner from the target Node, not the source node
+ itself.
+
+ - Internal Scanners fixes: Make sure Scanners are only passed Nodes.
+ Fix how a Scanner.Selector called its base class initialization.
+ Make comparisons of Scanner objects more robust. Add a name to
+ an internal default ObjSourceScanner.
+
+ - Add a deprecated warning for use of the old "scanner" keyword argument
+ to Builder creation.
+
+ - Improve the --debug=explain message when the build action changes.
+
+ - Test enhancements in SourceCode.py, option-n.py, midl.py. Better
+ Command() and Scanner test coverage. Improved test infrastructure
+ for -c output.
+
+ - Refactor the interface between Action and Executor objects to treat
+ Actions atomically.
+
+ - The --debug=presub option will now report the pre-substitution
+ each action seprately, instead of reporting the entire list before
+ executing the actions one by one.
+
+ - The --debug=explain option explaining a changed action will now
+ (more correctly) show pre-substitution action strings, instead of
+ the commands with substituted file names.
+
+ - A Node (file) will now be rebuilt if its PreAction or PostAction
+ actions change.
+
+ - Python Function actions now have their calling signature (target,
+ source, env) reported correctly when displayed.
+
+ - Fix BuildDir()/build_dir handling when the build_dir is underneath
+ the source directory and trying to use entries from the build_dir
+ as sources for other targets in the build-dir.
+
+ - Fix hard-coding of JDK path names in various Java tests.
+
+ - Handle Python stack traces consistently (stop at the SConscript stack
+ frame, by default) even if the Python source code isn't available.
+
+ - Improve the performance of the --debug={tree,dtree} options.
+
+ - Add --debug=objects logging of creation of OverrideWarner,
+ EnvironmentCopy and EnvironmentOverride objects.
+
+ - Fix command-line expansion of Python Value Nodes.
+
+ - Internal cleanups: Remove an unnecessary scan argument. Associate
+ Scanners only with Builders, not nodes. Apply overrides once when
+ a Builder is called, not in multiple places. Cache results from the
+ Node.FS.get_suffix() and Node.get_build_env() methods. Use the Python
+ md5 modules' hexdigest() method, if there is one. Have Taskmaster
+ call get_stat() once for each Node and re-use the value instead of
+ calling it each time it needs the value. Have Node.depends_on()
+ re-use the list from the children() method instead of calling it
+ multiple times.
+
+ - Use the correct scanner if the same source file is used for targets in
+ two different environments with the same path but different scanners.
+
+ - Collect logic for caching values in memory in a Memoizer class,
+ which cleans up a lot of special-case code in various methods and
+ caches additional values to speed up most configurations.
+
+ - Add a PathAccept validator to the list of new canned PathOption
+ validators.
+
+ From Jeff Squyres:
+
+ - Documentation changes: Use $CPPDEFINES instead of $CCFLAGS in man
+ page examples.
+
+ From Levi Stephen:
+
+ - Allow $JARCHDIR to be expanded to other construction variables.
+
+ From Christoph Wiedemann:
+
+ - Add an Environment.SetDefault() method that only sets values if
+ they aren't already set.
+
+ - Have the qt.py Tool not override variables already set by the user.
+
+ - Add separate $QT_BINPATH, $QT_CPPPATH and $QT_LIBPATH variables
+ so these can be set individually, instead of being hard-wired
+ relative to $QTDIR.
+
+ - The %TEMP% and %TMP% external environment variables are now propagated
+ automatically to the command execution environment on Windows systems.
+
+ - A new --config= command-line option allows explicit control of
+ of when the Configure() tests are run: --config=force forces all
+ checks to be run, --config=cache uses all previously cached values,
+ --config=auto (the default) runs tests only when dependency analysis
+ determines it's necessary.
+
+ - The Configure() subsystem can now write a config.h file with values
+ like HAVE_STDIO_H, HAVE_LIBM, etc.
+
+ - The Configure() subsystem now executes its checks silently when the
+ -Q option is specified.
+
+ - The Configure() subsystem now reports if a test result is being
+ taken from cache, and prints the standard output and error output
+ of tests even when cached.
+
+ - Configure() test results are now reported as "yes" or "no" instead of
+ "ok" or "failed."
+
+ - Fixed traceback printing when calling the env.Configure() method
+ instead of the Configure() global function.
+
+ - The Configure() subsystem now caches build failures in a .sconsign
+ file in the subdirectory, not a .cache file. This may cause
+ tests to be re-executed the first time after you install 0.97.
+
+ - Additional significant internal cleanups in the Configure() subsystem
+ and its tests.
+
+ - Have the Qt Builder make uic-generated files dependent on the .ui.h
+ file, if one exists.
+
+ - Add a test to make sure that SCons source code does not contain
+ try:-except: blocks that catch all errors, which potentially catch
+ and mask keyboard interrupts.
+
+ - Fix us of TargetSignatures('content') with the SConf subsystem.
+
+ From Russell Yanofsky:
+
+ - Add support for the Metrowerks Codewarrior compiler and linker
+ (mwcc and mwld).
+
+
+
+RELEASE 0.96.1 - Mon, 23 Aug 2004 12:55:50 +0000
+
+ From Craig Bachelor:
+
+ - Handle white space in the executable Python path name within in MSVS
+ project files by quoting the path.
+
+ - Correct the format of a GUID string in a solution (.dsw) file so
+ MSVS can correctly "build enable" a project.
+
+ From Steven Knight:
+
+ - Add a must_exist flag to Delete() to let the user control whether
+ it's an error if the specified entry doesn't exist. The default
+ behavior is now to silently do nothing if it doesn't exist.
+
+ - Package up the new Platform/darwin.py, mistakenly left out of 0.96.
+
+ - Make the scons.bat REM statements into @REM so they aren't printed.
+
+ - Make the SCons packaging SConscript files platform independent.
+
+ From Anthony Roach:
+
+ - Fix scanning of pre-compiled header (.pch) files for #includes,
+ broken in 0.96.
+
+
+
+RELEASE 0.96 - Wed, 18 Aug 2004 13:36:40 +0000
+
+ From Chad Austin:
+
+ - Make the CacheDir() directory if it doesn't already exist.
+
+ - Allow construction variable substitutions in $LIBS specifications.
+
+ - Allow the emitter argument to a Builder() to be or expand to a list
+ of emitter functions, which will be called in sequence.
+
+ - Suppress null values in construction variables like $LIBS that use
+ the internal _concat() function.
+
+ - Remove .dll files from the construction variables searched for
+ libraries that can be fed to Win32 compilers.
+
+ From Chad Austin and Christoph Wiedemann:
+
+ - Add support for a $RPATH variable to supply a list of directories
+ to search for shared libraries when linking a program. Used by
+ the GNU and IRIX linkers (gnulink and sgilink).
+
+ From Charles Crain:
+
+ - Restore the ability to do construction variable substitutions in all
+ kinds of *PATH variables, even when the substitution returns a Node
+ or other object.
+
+ From Tom Epperly:
+
+ - Allow the Java() Builder to take more than one source directory.
+
+ From Ralf W. Grosse-Kunstleve:
+
+ - Have SConsignFile() use, by default, a custom "dblite.py" that we can
+ control and guarantee to work on all Python versions (or nearly so).
+
+ From Jonathan Gurley:
+
+ - Add support for the newer "ifort" versions of the Intel Fortran
+ Compiler for Linux.
+
+ From Bob Halley:
+
+ - Make the new *FLAGS variable type work with copied Environments.
+
+ From Chris Hoeppler:
+
+ - Initialize the name of a Scanner.Classic scanner correctly.
+
+ From James Juhasz:
+
+ - Add support for the .dylib shared library suffix and the -dynamiclib
+ linker option on Mac OS X.
+
+ From Steven Knight:
+
+ - Add an Execute() method for executing actions directly.
+
+ - Support passing environment override keyword arguments to Command().
+
+ - Fix use of $MSVS_IGNORE_IDE_PATHS, which was broken when we added
+ support for $MSVS_USE_MFC_DIRS last release.
+
+ - Make env.Append() and env.Prepend() act like the underlying Python
+ behavior when the variable being appended to is a UserList object.
+
+ - Fix a regression that prevented the Command() global function in
+ 0.95 from working with command-line strings as actions.
+
+ - Fix checking out a file from a source code management system when
+ the env.SourceCode() method was called with an individual file name
+ or node, not a directory name or node.
+
+ - Enhance the Task.make_ready() method to create a list of the
+ out-of-date Nodes for the task for use by the wrapping interface.
+
+ - Allow Scanners to pull the list of suffixes from the construction
+ environment when the "skeys" keyword argument is a string containing
+ a construction variable to be expanded.
+
+ - Support new $CPPSUFFIXES, $DSUFFIXES $FORTRANSUFFIXES, and
+ $IDLSUFFIXES. construction variables that contain the default list
+ of suffixes to be scanned by a given type of scanner, allowing these
+ suffix lists to be easily added to or overridden.
+
+ - Speed up Node creation when calling a Builder by comparing whether two
+ Environments are the same object, not if their underlying dictionaries
+ are equivalent.
+
+ - Add a --debug=explain option that reports the reason(s) why SCons
+ thinks it must rebuild something.
+
+ - Add support for functions that return platform-independent Actions
+ to Chmod(), Copy(), Delete(), Mkdir(), Move() and Touch() files
+ and/or directories. Like any other Actions, the returned Action
+ object may be executed directly using the Execute() global function
+ or env.Execute() environment method, or may be used as a Builder
+ action or in an env.Command() action list.
+
+ - Add support for the strfunction argument to all types of Actions:
+ CommandAction, ListAction, and CommandGeneratorAction.
+
+ - Speed up turning file system Nodes into strings by caching the
+ values after we're finished reading the SConscript files.
+
+ - Have ParseConfig() recognize and supporting adding the -Wa, -Wl,
+ and -Wp, flags to ASFLAGS, LINKFLAGS and CPPFLAGS, respectively.
+
+ - Change the .sconsign format and the checks for whether a Node is
+ up-to-date to make dependency checks more efficient and correct.
+
+ - Add wrapper Actions to SCons.Defaults for $ASCOM, $ASPPCOM, $LINKCOM,
+ $SHLINKCOM, $ARCOM, $LEXCOM and $YACCCOM. This makes it possible
+ to replace the default print behavior with a custom strfunction()
+ for each of these.
+
+ - When a Node has been built, don't walk the whole tree back to delete
+ the parents's implicit dependencies, let returning up the normal
+ Taskmaster descent take care of it for us.
+
+ - Add documented support for separate target_scanner and source_scanner
+ arguments to Builder creation, which allows different scanners to
+ be applied to source files
+
+ - Don't re-install or (re-generate) .h files when a subsidiary #included
+ .h file changes. This eliminates incorrect circular dependencies
+ with .h files generated from other source files.
+
+ - Slim down the internal Sig.Calculator class by eliminating methods
+ whose functionality is now covered by Node methods.
+
+ - Document use of the target_factory and source_factory keyword
+ arguments when creating Builder objects. Enhance Dir Nodes so that
+ they can be created with user-specified Builder objects.
+
+ - Don't blow up with stack trace when the external $PATH environment
+ variable isn't set.
+
+ - Make Builder calls return lists all the time, even if there's only
+ one target. This keeps things consistent and easier to program to
+ across platforms.
+
+ - Add a Flatten() function to make it easier to deal with the Builders
+ all returning lists of targets, not individual targets.
+
+ - Performance optimizations in Node.FS.__doLookup().
+
+ - Man page fixes: formatting typos, misspellings, bad example.
+
+ - User's Guide fixes: Fix the signatures of the various example
+ *Options() calls. Triple-quote properly a multi-line Split example.
+
+ - User's Guide additions: Chapter describing File and Directory
+ Nodes. Section describing declarative nature of SCons functions in
+ SConscript files. Better organization and clarification of points
+ raised by Robert P. J. Day. Chapter describing SConf (Autoconf-like)
+ functionality. Chapter describing how to install Python and
+ SCons. Chapter describing Java builds.
+
+ From Chris Murray:
+
+ - Add a .win32 attribute to force file names to expand with
+ Windows backslash path separators.
+
+ - Fix escaping file names on command lines when the expansion is
+ concatenated with another string.
+
+ - Add support for Fortran 90 and Fortran 95. This adds $FORTRAN*
+ variables that specify a default compiler, command-line, flags,
+ etc. for all Fortran versions, plus separate $F90* and $F95*
+ variables for when different compilers/flags/etc. must be specified
+ for different Fortran versions.
+
+ - Have individual tools that create libraries override the default
+ $LIBPREFIX and $LIBSUFFIX values set by the platform. This makes
+ it easier to use Microsoft Visual Studio tools on a CygWin platform.
+
+ From Gary Oberbrunner:
+
+ - Add a --debug=presub option to print actions prior to substitution.
+
+ - Add a warning upon use of the override keywords "targets" and
+ "sources" when calling Builders. These are usually mistakes which
+ are otherwise silently (and confusingly) turned into construction
+ variable overrides.
+
+ - Try to find the ICL license file path name in the external environment
+ and the registry before resorting to the hard-coded path name.
+
+ - Add support for fetching command-line keyword=value arguments in
+ order from an ARGLIST list.
+
+ - Avoid stack traces when trying to read dangling symlinks.
+
+ - Treat file "extensions" that only contain digits as part of the
+ file basename. This supports version numbers as part of shared
+ library names, for example.
+
+ - Avoid problems when there are null entries (None or '') in tool
+ lists or CPPPATH.
+
+ - Add an example and explanation of how to use "tools = ['default', ..."
+ when creating a construction environment.
+
+ - Add a section describing File and Directory Nodes and some of their
+ attributes and methods.
+
+ - Have ParseConfig() add a returned -pthread flag to both $CCFLAGS
+ and $LINKFLAGS.
+
+ - Fix some test portability issues on Mac OS X (darwin).
+
+ From Simon Perkins:
+
+ - Fix a bug introduced in building shared libraries under MinGW.
+
+ From Kevin Quick:
+
+ - Handling SCons exceptions according to Pythonic standards.
+
+ - Fix test/chained-build.py on systems that execute within one second.
+
+ - Fix tests on systems where 'ar' warns about archive creation.
+
+ From Anthony Roach:
+
+ - Fix use of the --implicit-cache option with timestamp signatures.
+
+ - If Visual Studio is installed, assume the C/C++ compiler, the linker
+ and the MIDL compiler that comes with it are available, too.
+
+ - Better error messages when evaluating a construction variable
+ expansion yields a Python syntax error.
+
+ - Change the generation of PDB files when using Visual Studio from
+ compile time to link time.
+
+ From sam th:
+
+ - Allow SConf.CheckLib() to search a list of libraries, like the
+ Autoconf AC_SEARCH_LIBS macro.
+
+ - Allow the env.WhereIs() method to take a "reject" argument to
+ let it weed out specific path names.
+
+ From Christoph Wiedemann:
+
+ - Add new Moc() and Uic() Builders for more explicit control over
+ Qt builds, plus new construction variables to control them:
+ $QT_AUTOSCAN, $QT_DEBUG, $QT_MOCCXXPREFIX, $QT_MOCCXXSUFFIX,
+ $QT_MOCHPREFIX, $QT_MOCHSUFFIX, $QT_UICDECLPREFIX, $QT_UICDECLSUFFIX,
+ $QT_UICIMPLPREFIX, $QT_UICIMPLSUFFIX and $QT_UISUFFIX.
+
+ - Add a new single_source keyword argument for Builders that enforces
+ a single source file on calls to the Builder.
+
+
+
+RELEASE 0.95 - Mon, 08 Mar 2004 06:43:20 -0600
+
+ From Chad Austin:
+
+ - Replace print statements with calls to sys.stdout.write() so output
+ lines stay together when -j is used.
+
+ - Add portability fixes for a number of tests.
+
+ - Accomodate the fact that Cygwin's os.path.normcase() lies about
+ the underlying system being case-sensitive.
+
+ - Fix an incorrect _concat() call in the $RCINCFLAGS definition for
+ the mingw Tool.
+
+ - Fix a problem with the msvc tool with Python versions prior to 2.3.
+
+ - Add support for a "toolpath" Tool() and Environment keyword that
+ allows Tool modules to be found in specified local directories.
+
+ - Work around Cygwin Python's silly fiction that it's using a
+ case-sensitive file system.
+
+ - More robust handling of data in VCComponents.dat.
+
+ - If the "env" command is available, spawn commands with the more
+ general "env -" instead of "env -i".
+
+ From Kerim Borchaev:
+
+ - Fix a typo in a msvc.py's registry lookup: "VCComponents.dat", not
+ "VSComponents.dat".
+
+ From Chris Burghart:
+
+ - Fix the ability to save/restore a PackageOption to a file.
+
+ From Steve Christensen:
+
+ - Update the MSVS .NET and MSVC 6.0/7.0 path detection.
+
+ From David M. Cooke:
+
+ - Make the Fortran scanner case-insensitive for the INCLUDE string.
+
+ From Charles Crain:
+
+ - If no version of MSVC is detected but the tool is specified,
+ use the MSVC 6.0 paths by default.
+
+ - Ignore any "6.1" version of MSVC found in the registry; this is a
+ phony version number (created by later service packs?) and would
+ throw off the logic if the user had any non-default paths configure.
+
+ - Correctly detect if the user has independently configured the MSVC
+ "include," "lib" or "path" in the registry and use the appropriate
+ values. Previously, SCons would only use the values if all three
+ were set in the registry.
+
+ - Make sure side-effect nodes are prepare()d before building their
+ corresponding target.
+
+ - Preserve the ability to call BuildDir() multiple times with the
+ same target and source directory arguments.
+
+ From Andy Friesen:
+
+ - Add support for the Digital Mars "D" programming language.
+
+ From Scott Lystig Fritchie:
+
+ - Fix the ability to use a custom _concat() function in the
+ construction environment when calling _stripixes().
+
+ - Make the message about ignoring a missing SConscript file into a
+ suppressable Warning, not a hard-coded sys.stderr.write().
+
+ - If a builder can be called multiple times for a target (because
+ the sources and overrides are identical, or it's a builder with the
+ "multi" flag set), allow the builder to be called through multiple
+ environments so long as the builders have the same signature for
+ the environments in questions (that is, they're the same action).
+
+ From Bob Halley:
+
+ - When multiple targets are built by a single action, retrieve all
+ of them from cache, not just the first target, and exec the build
+ command if any of the targets isn't present in the cache.
+
+ From Zephaniah Hull:
+
+ - Fix command-line ARGUMENTS with multiple = in them.
+
+ From Steven Knight:
+
+ - Fix EnsureSConsVersion() so it checks against the SCons version,
+ not the Python version, on Pythons with sys.version_info.
+
+ - Don't swallow the AttributeError when someone uses an expansion like
+ $TARGET.bak, so we can supply a more informative error message.
+
+ - Fix an odd double-quote escape sequence in the man page.
+
+ - Fix looking up a naked drive letter as a directory (Dir('C:')).
+
+ - Support using File nodes in the LIBS construction variable.
+
+ - Allow the LIBS construction variable to be a single string or File
+ node, not a list, when only one library is needed.
+
+ - Fix typos in the man page: JAVACHDIR => JARCHDIR; add "for_signature"
+ to the __call__() example in the "Variable Substitution" section.
+
+ - Correct error message spellings of "non-existant" to "non-existent."
+
+ - When scanning for libraries to link with, don't append $LIBPREFIXES
+ or $LIBSUFFIXES values to the $LIBS values if they're already present.
+
+ - Add a ZIPCOMPRESSION construction variable to control whether the
+ internal Python action for the Zip Builder compresses the file or
+ not. The default value is zipfile.ZIP_DEFLATED, which generates
+ a compressed file.
+
+ - Refactor construction variable expansion to support recursive
+ expansion of variables (e.g. CCFLAGS = "$CCFLAGS -g") without going
+ into an infinite loop. Support this in all construction variable
+ overrides, as well as when copying Environments.
+
+ - Fix calling Configure() from more than one subsidiary SConscript file.
+
+ - Fix the env.Action() method so it returns the correct type of
+ Action for its argument(s).
+
+ - Fix specifying .class files as input to JavaH with the .class suffix
+ when they weren't generated using the Java Builder.
+
+ - Make the check for whether all of the objects going into a
+ SharedLibrary() are shared work even if the object was built in a
+ previous run.
+
+ - Supply meaningful error messages, not stack traces, if we try to add
+ a non-Node as a source, dependency, or ignored dependency of a Node.
+
+ - Generate MSVS Project files that re-invoke SCons properly regardless
+ of whether the file was built via scons.bat or scons.py.
+ (Thanks to Niall Douglas for contributing code and testing.)
+
+ - Fix TestCmd.py, runtest.py and specific tests to accomodate being
+ run from directories whose paths include white space.
+
+ - Provide a more useful error message if a construction variable
+ expansion contains a syntax error during evaluation.
+
+ - Fix transparent checkout of implicit dependency files from SCCS
+ and RCS.
+
+ - Added new --debug=count, --debug=memory and --debug=objects options.
+ --debug=count and --debug=objects only print anything when run
+ under Python 2.1 or later.
+
+ - Deprecate the "overrides" keyword argument to Builder() creation
+ in favor of using keyword argument values directly (like we do
+ for builder execution and the like).
+
+ - Always use the Builder overrides in substitutions, not just if
+ there isn't a target-specific environment.
+
+ - Add new "rsrcpath" and "rsrcdir" and attributes to $TARGET/$SOURCE,
+ so Builder command lines can find things in Repository source
+ directories when using BuildDir.
+
+ - Fix the M4 Builder so that it chdirs to the Repository directory
+ when the input file is in the source directory of a BuildDir.
+
+ - Save memory at build time by allowing Nodes to delete their build
+ environments after they've been built.
+
+ - Add AppendUnique() and PrependUnique() Environment methods, which
+ add values to construction variables like Append() and Prepend()
+ do, but suppress any duplicate elements in the list.
+
+ - Allow the 'qt' tool to still be used successfully from a copied
+ Environment. The include and library directories previously ended up
+ having the same string re-appended to the end, yielding an incorrect
+ path name.
+
+ - Supply a more descriptive error message when the source for a target
+ can't be found.
+
+ - Initialize all *FLAGS variables with objects do the right thing with
+ appending flags as strings or lists.
+
+ - Make things like ${TARGET.dir} work in *PATH construction variables.
+
+ - Allow a $MSVS_USE_MFC_DIRS construction variable to control whether
+ ATL and MFC directories are included in the default INCLUDE and
+ LIB paths.
+
+ - Document the dbm_module argument to the SConsignFile() function.
+
+ From Vincent Risi:
+
+ - Add support for the bcc32, ilink32 and tlib Borland tools.
+
+ From Anthony Roach:
+
+ - Supply an error message if the user tries to configure a BuildDir
+ for a directory that already has one.
+
+ - Remove documentation of the still-unimplemented -e option.
+
+ - Add -H help text listing the legal --debug values.
+
+ - Don't choke if a construction variable is a non-string value.
+
+ - Build Type Libraries in the target directory, not the source
+ directory.
+
+ - Add an appendix to the User's Guide showing how to accomplish
+ various common tasks in Python.
+
+ From Greg Spencer:
+
+ - Add support for Microsoft Visual Studio 2003 (version 7.1).
+
+ - Evaluate $MSVSPROJECTSUFFIX and $MSVSSOLUTIONSUFFIX when the Builder
+ is invoked, not when the tool is initialized.
+
+ From Christoph Wiedemann:
+
+ - When compiling Qt, make sure the moc_*.cc files are compiled using
+ the flags from the environment used to specify the target, not
+ the environment that first has the Qt Builders attached.
+
+
+
+RELEASE 0.94 - Fri, 07 Nov 2003 05:29:48 -0600
+
+ From Hartmut Goebel:
+
+ - Add several new types of canned functions to help create options:
+ BoolOption(), EnumOption(), ListOption(), PackageOption(),
+ PathOption().
+
+ From Steven Knight:
+
+ - Fix use of CPPDEFINES with C++ source files.
+
+ - Fix env.Append() when the operand is an object with a __cmp__()
+ method (like a Scanner instance).
+
+ - Fix subclassing the Environment and Scanner classes.
+
+ - Add BUILD_TARGETS, COMMAND_LINE_TARGETS and DEFAULT_TARGETS variables.
+
+ From Steve Leblanc:
+
+ - SGI fixes: Fix C++ compilation, add a separate Tool/sgic++.py module.
+
+ From Gary Oberbrunner:
+
+ - Fix how the man page un-indents after examples in some browsers.
+
+ From Vincent Risi:
+
+ - Fix the C and C++ tool specifications for AIX.
+
+
+
+RELEASE 0.93 - Thu, 23 Oct 2003 07:26:55 -0500
+
+ From J.T. Conklin:
+
+ - On POSIX, execute commands with the more modern os.spawnvpe()
+ function, if it's available.
+
+ - Scan .S, .spp and .SPP files for C preprocessor dependencies.
+
+ - Refactor the Job.Parallel() class to use a thread pool without a
+ condition variable. This improves parallel build performance and
+ handles keyboard interrupts properly when -j is used.
+
+ From Charles Crain:
+
+ - Add support for a JARCHDIR variable to control changing to a
+ directory using the jar -C option.
+
+ - Add support for detecting Java manifest files when using jar,
+ and specifying them using the jar m flag.
+
+ - Fix some Python 2.2 specific things in various tool modules.
+
+ - Support directories as build sources, so that a rebuild of a target
+ can be triggered if anything underneath the directory changes.
+
+ - Have the scons.bat and scons.py files look for the SCons modules
+ in site-packages as well.
+
+ From Christian Engel:
+
+ - Support more flexible inclusion of separate C and C++ compilers.
+
+ - Use package management tools on AIX and Solaris to find where
+ the comilers are installed, and what version they are.
+
+ - Add support for CCVERSION and CXXVERSION variables for a number
+ of C and C++ compilers.
+
+ From Sergey Fogel:
+
+ - Add test cases for the new capabilities to run bibtex and to rerun
+ latex as needed.
+
+ From Ralf W. Grosse-Kunstleve:
+
+ - Accomodate anydbm modules that don't have a sync() method.
+
+ - Allow SConsignFile() to take an argument specifying the DBM
+ module to be used.
+
+ From Stephen Kennedy:
+
+ - Add support for a configurable global .sconsign.dbm file which
+ can be used to avoid cluttering each directory with an individual
+ .sconsign file.
+
+ From John Johnson:
+
+ - Fix (re-)scanning of dependencies in generated or installed
+ header files.
+
+ From Steven Knight:
+
+ - The -Q option suppressed too many messages; fix it so that it only
+ suppresses the Reading/Building messages.
+
+ - Support #include when there's no space before the opening quote
+ or angle bracket.
+
+ - Accomodate alphanumeric version strings in EnsurePythonVersion().
+
+ - Support arbitrary expansion of construction variables within
+ file and directory arguments to Builder calls and Environment methods.
+
+ - Add Environment-method versions of the following global functions:
+ Action(), AddPostAction(), AddPreAction(), Alias(), Builder(),
+ BuildDir(), CacheDir(), Clean(), Configure(), Default(),
+ EnsurePythonVersion(), EnsureSConsVersion(), Environment(),
+ Exit(), Export(), FindFile(), GetBuildPath(), GetOption(), Help(),
+ Import(), Literal(), Local(), Platform(), Repository(), Scanner(),
+ SConscriptChdir(), SConsignFile(), SetOption(), SourceSignatures(),
+ Split(), TargetSignatures(), Tool(), Value().
+
+ - Add the following global functions that correspond to the same-named
+ Environment methods: AlwaysBuild(), Command(), Depends(), Ignore(),
+ Install(), InstallAs(), Precious(), SideEffect() and SourceCode().
+
+ - Add the following global functions that correspond to the default
+ Builder methods supported by SCons: CFile(), CXXFile(), DVI(), Jar(),
+ Java(), JavaH(), Library(), M4(), MSVSProject(), Object(), PCH(),
+ PDF(), PostScript(), Program(), RES(), RMIC(), SharedLibrary(),
+ SharedObject(), StaticLibrary(), StaticObject(), Tar(), TypeLibrary()
+ and Zip().
+
+ - Rearrange the man page to show construction environment methods and
+ global functions in the same list, and to explain the difference.
+
+ - Alphabetize the explanations of the builder methods in the man page.
+
+ - Rename the Environment.Environment class to Enviroment.Base.
+ Allow the wrapping interface to extend an Environment by using its own
+ subclass of Environment.Base and setting a new Environment.Environment
+ variable as the calling entry point.
+
+ - Deprecate the ParseConfig() global function in favor of a same-named
+ construction environment method.
+
+ - Allow the Environment.WhereIs() method to take explicit path and
+ pathext arguments (like the underlying SCons.Util.WhereIs() function).
+
+ - Remove the long-obsolete {Get,Set}CommandHandler() functions.
+
+ - Enhance env.Append() to suppress null values when appropriate.
+
+ - Fix ParseConfig() so it works regardless of initial construction
+ variable values.
+
+ Extend CheckHeader(), CheckCHeader(), CheckCXXHeader() and
+ CheckLibWithHeader() to accept a list of header files that will be
+ #included in the test. The last one in the list is assumed to be
+ the one being checked for. (Prototype code contributed by Gerard
+ Patel and Niall Douglas).
+
+ - Supply a warning when -j is used and threading isn't built in to
+ the current version of Python.
+
+ - First release of the User's Guide (finally, and despite a lot
+ of things still missing from it...).
+
+ From Clark McGrew:
+
+ - Generalize the action for .tex files so that it will decide whether
+ a file is TeX or LaTeX, check the .aux output to decide if it should
+ run bibtex, and check the .log output to re-run LaTeX if needed.
+
+ From Bram Moolenaar:
+
+ - Split the non-SCons-specific functionality from SConf.py to a new,
+ re-usable Conftest.py module.
+
+ From Gary Oberbrunner:
+
+ - Allow a directory to be the target or source or dependency of a
+ Depends(), Ignore(), Precious() or SideEffect() call.
+
+ From Gerard Patel:
+
+ - Use the %{_mandir} macro when building our RPM package.
+
+ From Marko Rauhamaa:
+
+ - Have the closing message say "...terminated because of errors" if
+ there were any.
+
+ From Anthony Roach:
+
+ - On Win32 systems, only use "rm" to delete files if Cygwin is being
+ used. ("rm" doesn't understand Win32-format path names.)
+
+ From Christoph Wiedemann:
+
+ - Fix test/SWIG.py to find the Python include directory in all cases.
+
+ - Fix a bug in detection of Qt installed on the local system.
+
+ - Support returning Python 2.3 BooleanType values from Configure checks.
+
+ - Provide an error message if someone mistakenly tries to call a
+ Configure check from within a Builder function.
+
+ - Support calling a Builder when a Configure context is still open.
+
+ - Handle interrupts better by eliminating all try:-except: blocks
+ which caught any and all exceptions, including KeyboardInterrupt.
+
+ - Add a --duplicate= option to control how files are duplicated.
+
+
+
+RELEASE 0.92 - Wed, 20 Aug 2003 03:45:28 -0500
+
+ From Charles Crain and Gary Oberbrunner:
+
+ - Fix Tool import problems with the Intel and PharLap linkers.
+
+ From Steven Knight
+
+ - Refactor the DictCmdGenerator class to be a Selector subclass.
+
+ - Allow the DefaultEnvironment() function to take arguments and pass
+ them to instantiation of the default construction environment.
+
+ - Update the Debian package so it uses Python 2.2 and more closely
+ resembles the currently official Debian packaging info.
+
+ From Gerard Patel
+
+ - When the yacc -d flag is used, take the .h file base name from the
+ target .c file, not the source (matching what yacc does).
+
+
+
+RELEASE 0.91 - Thu, 14 Aug 2003 13:00:44 -0500
+
+ From Chad Austin:
+
+ - Support specifying a list of tools when calling Environment.Copy().
+
+ - Give a Value Nodes a timestamp of the system time when they're
+ created, so they'll work when using timestamp-based signatures.
+
+ - Add a DefaultEnvironment() function that only creates a default
+ environment on-demand (for fetching source files, e.g.).
+
+ - Portability fix for test/M4.py.
+
+ From Steven Knight:
+
+ - Tighten up the scons -H help output.
+
+ - When the input yacc file ends in .yy and the -d flag is specified,
+ recognize that a .hpp file (not a .h file) will be created.
+
+ - Make builder prefixes work correctly when deducing a target
+ from a source file name in another directory.
+
+ - Documentation fixes: typo in the man page; explain up-front about
+ not propagating the external environment.
+
+ - Use "cvs co -d" instead of "cvs co -p >" when checking out something
+ from CVS with a specified module name. This avoids zero-length
+ files when there is a checkout error.
+
+ - Add an "sconsign" script to print the contents of .sconsign files.
+
+ - Speed up maintaining the various lists of Node children by using
+ dictionaries to avoid "x in list" searches.
+
+ - Cache the computed list of Node children minus those being Ignored
+ so it's only calculated once.
+
+ - Fix use of the --cache-show option when building a Program()
+ (or using any other arbitrary action) by making sure all Action
+ instances have strfunction() methods.
+
+ - Allow the source of Command() to be a directory.
+
+ - Better error handling of things like raw TypeErrors in SConscripts.
+
+ - When installing using "setup.py install --prefix=", suppress the
+ distutils warning message about adding the (incorrect) library
+ directory to your search path.
+
+ - Correct the spelling of the "validater" option to "validator."
+ Add a DeprecatedWarning when the old spelling is used.
+
+ - Allow a Builder's emitter to be a dictionary that maps source file
+ suffixes to emitter functions, using the suffix of the first file
+ in the source list to pick the right one.
+
+ - Refactor the creation of the Program, *Object and *Library Builders
+ so that they're moved out of SCons.Defaults and created on demand.
+
+ - Don't split SConscript file names on white space.
+
+ - Document the SConscript function's "dirs" and "name" keywords.
+
+ - Remove the internal (and superfluous) SCons.Util.argmunge() function.
+
+ - Add /TP to the default CXXFLAGS for msvc, so it can compile all
+ of the suffixes we use as C++ files.
+
+ - Allow the "prefix" and "suffix" attributes of a Builder to be
+ callable objects that return generated strings, or dictionaries
+ that map a source file suffix to the right prefix/suffix.
+
+ - Support a MAXLINELINELENGTH construction variable on Win32 systems
+ to control when a temporary file is used for long command lines.
+
+ - Make how we build .rpm packages not depend on the installation
+ locations from the distutils being used.
+
+ - When deducing a target Node, create it directly from the first
+ source Node, not by trying to create the right string to pass to
+ arg2nodes().
+
+ - Add support for SWIG.
+
+ From Bram Moolenaar:
+
+ - Test portability fixes for FreeBSD.
+
+ From Gary Oberbrunner:
+
+ - Report the target being built in error messages when building
+ multiple sources from different extensions, or when the target file
+ extension can't be deduced, or when we don't have an action for a
+ file suffix.
+
+ - Provide helpful error messages when the arguments to env.Install()
+ are incorrect.
+
+ - Fix the value returned by the Node.prevsiginfo() method to conform
+ to a previous change when checking whether a node is current.
+
+ - Supply a stack trace if the Taskmaster catches an exception.
+
+ - When using a temporary file for a long link line on Win32 systems,
+ (also) print the command line that is being executed through the
+ temporary file.
+
+ - Initialize the LIB environment variable when using the Intel
+ compiler (icl).
+
+ - Documentation fixes: better explain the AlwaysBuild() function.
+
+ From Laurent Pelecq:
+
+ - When the -debug=pdb option is specified, use pdb.Pdb().runcall() to
+ call pdb directly, don't call Python recursively.
+
+ From Ben Scott:
+
+ - Add support for a platform-independent CPPDEFINES variable.
+
+ From Christoph Wiedemann:
+
+ - Have the g++ Tool actually use g++ in preference to c++.
+
+ - Have the gcc Tool actually use gcc in preference to cc.
+
+ - Add a gnutools.py test of the GNU tool chain.
+
+ - Be smarter about linking: use $CC by default and $CXX only if we're
+ linking with any C++ objects.
+
+ - Avoid SCons hanging when a piped command has a lot of output to read.
+
+ - Add QT support for preprocessing .ui files into .c files.
+
+
+
+RELEASE 0.90 - Wed, 25 Jun 2003 14:24:52 -0500
+
+ From Chad Austin:
+
+ - Fix the _concat() documentation, and add a test for it.
+
+ - Portability fixes for non-GNU versions of lex and yacc.
+
+ From Matt Balvin:
+
+ - Fix handling of library prefixes when the subdirectory matches
+ the prefix.
+
+ From Timothee Bessett:
+
+ - Add an M4 Builder.
+
+ From Charles Crain:
+
+ - Use '.lnk' as the suffix on the temporary file for linking long
+ command lines (necessary for the Phar Lap linkloc linker).
+
+ - Save non-string Options values as their actual type.
+
+ - Save Options string values that contain a single quote correctly.
+
+ - Save any Options values that are changed from the default
+ Environment values, not just ones changed on the command line or in
+ an Options file.
+
+ - Make closing the Options file descriptor exception-safe.
+
+ From Steven Knight:
+
+ - SCons now enforces (with an error) that construction variables
+ must have the same form as valid Python identifiers.
+
+ - Fix man page bugs: remove duplicate AddPostAction() description;
+ document no_import_lib; mention that CPPFLAGS does not contain
+ $_CPPINCFLAGS; mention that F77FLAGS does not contain $_F77INCFLAGS;
+ mention that LINKFLAGS and SHLINKFLAGS contains neither $_LIBFLAGS
+ nor $_LIBDIRFLAGS.
+
+ - Eliminate a dependency on the distutils.fancy_getopt module by
+ copying and pasting its wrap_text() function directly.
+
+ - Make the Script.Options() subclass match the underlying base class
+ implementation.
+
+ - When reporting a target is up to date, quote the target like make
+ (backquote-quote) instead of with double quotes.
+
+ - Fix handling of ../* targets when using -U, -D or -u.
+
+ From Steve Leblanc:
+
+ - Don't update the .sconsign files when run with -n.
+
+ From Gary Oberbrunner:
+
+ - Add support for the Intel C Compiler (icl.exe).
+
+ From Anthony Roach
+
+ - Fix Import('*').
+
+ From David Snopek
+
+ - Fix use of SConf in paths with white space in them.
+
+ - Add CheckFunc and CheckType functionality to SConf.
+
+ - Fix use of SConf with Builders that return a list of nodes.
+
+ From David Snopek and Christoph Wiedemann
+
+ - Fix use of the SConf subsystem with SConscriptChdir().
+
+ From Greg Spencer
+
+ - Check for the existence of MS Visual Studio on disk before using it,
+ to avoid getting fooled by leftover junk in the registry.
+
+ - Add support for MSVC++ .NET.
+
+ - Add support for MS Visual Studio project files (DSP, DSW,
+ SLN and VCPROJ files).
+
+ From Christoph Wiedemann
+
+ - SConf now works correctly when the -n and -q options are used.
+
+
+
+RELEASE 0.14 - Wed, 21 May 2003 05:16:32 -0500
+
+ From Chad Austin:
+
+ - Use .dll (not .so) for shared libraries on Cygwin; use -fPIC
+ when compiling them.
+
+ - Use 'rm' to remove files under Cygwin.
+
+ - Add a PLATFORM variable to construction environments.
+
+ - Remove the "platform" argument from tool specifications.
+
+ - Propogate PYTHONPATH when running the regression tests so distutils
+ can be found in non-standard locations.
+
+ - Using MSVC long command-line linking when running Cygwin.
+
+ - Portability fixes for a lot of tests.
+
+ - Add a Value Node class for dependencies on in-core Python values.
+
+ From Allen Bierbaum:
+
+ - Pass an Environment to the Options validator method, and
+ add an Options.Save() method.
+
+ From Steve Christensen:
+
+ - Add an optional sort function argument to the GenerateHelpText()
+ Options function.
+
+ - Evaluate the "varlist" variables when computing the signature of a
+ function action.
+
+ From Charles Crain:
+
+ - Parse the source .java files for class names (including inner class
+ names) to figure out the target .class files that will be created.
+
+ - Make Java support work with Repositories and SConscriptChdir(0).
+
+ - Pass Nodes, not strings, to Builder emitter functions.
+
+ - Refactor command-line interpolation and signature calculation
+ so we can use real Node attributes.
+
+ From Steven Knight:
+
+ - Add Java support (javac, javah, jar and rmic).
+
+ - Propagate the external SYSTEMROOT environment variable into ENV on
+ Win32 systems, so external commands that use sockets will work.
+
+ - Add a .posix attribute to PathList expansions.
+
+ - Check out CVS source files using POSIX path names (forward slashes
+ as separators) even on Win32.
+
+ - Add Node.clear() and Node.FS.Entry.clear() methods to wipe out a
+ Node's state, allowing it to be re-evaluated by continuous
+ integration build interfaces.
+
+ - Change the name of the Set{Build,Content}SignatureType() functions
+ to {Target,Source}Signatures(). Deprecate the old names but support
+ them for backwards compatibility.
+
+ - Add internal SCons.Node.FS.{Dir,File}.Entry() methods.
+
+ - Interpolate the null string if an out-of-range subscript is used
+ for a construction variable.
+
+ - Fix the internal Link function so that it properly links or copies
+ files in subsidiary BuildDir directories.
+
+ - Refactor the internal representation of a single execution instance
+ of an action to eliminate redundant signature calculations.
+
+ - Eliminate redundant signature calculations for Nodes.
+
+ - Optimize out calling hasattr() before accessing attributes.
+
+ - Say "Cleaning targets" (not "Building...") when the -c option is
+ used.
+
+ From Damyan Pepper:
+
+ - Quote the "Entering directory" message like Make.
+
+ From Stefan Reichor:
+
+ - Add support for using Ghostscript to convert Postscript to PDF files.
+
+ From Anthony Roach:
+
+ - Add a standalone "Alias" function (separate from an Environment).
+
+ - Make Export() work for local variables.
+
+ - Support passing a dictionary to Export().
+
+ - Support Import('*') to import everything that's been Export()ed.
+
+ - Fix an undefined exitvalmap on Win32 systems.
+
+ - Support new SetOption() and GetOption() functions for setting
+ various command-line options from with an SConscript file.
+
+ - Deprecate the old SetJobs() and GetJobs() functions in favor of
+ using the new generic {Set,Get}Option() functions.
+
+ - Fix a number of tests that searched for a Fortran compiler using the
+ external PATH instead of what SCons would use.
+
+ - Fix the interaction of SideEffect() and BuildDir() so that (for
+ example) PDB files get put correctly in a BuildDir().
+
+ From David Snopek:
+
+ - Contribute the "Autoscons" code for Autoconf-like checking for
+ the existence of libraries, header files and the like.
+
+ - Have the Tool() function add the tool name to the $TOOLS
+ construction variable.
+
+ From Greg Spencer:
+
+ - Support the C preprocessor #import statement.
+
+ - Allow the SharedLibrary() Builder on Win32 systems to be able to
+ register a newly-built dll using regsvr32.
+
+ - Add a Builder for Windows type library (.tlb) files from IDL files.
+
+ - Add an IDL scanner.
+
+ - Refactor the Fortran, C and IDL scanners to share common logic.
+
+ - Add .srcpath and .srcdir attributes to $TARGET and $SOURCE.
+
+ From Christoph Wiedemann:
+
+ - Integrate David Snopek's "Autoscons" code as the new SConf
+ configuration subsystem, including caching of values between
+ runs (using normal SCons dependency mechanisms), tests, and
+ documentation.
+
+
+
+RELEASE 0.13 - Mon, 31 Mar 2003 20:22:00 -0600
+
+ From Charles Crain:
+
+ - Fix a bug when BuildDir(duplicate=0) is used and SConscript
+ files are called from within other SConscript files.
+
+ - Support (older) versions of Perforce which don't set the Windows
+ registry.
+
+
+
+RELEASE 0.12 - Thu, 27 Mar 2003 23:52:09 -0600
+
+ From Charles Crain:
+
+ - Added support for the Perforce source code management system.
+
+ - Fix str(Node.FS) so that it returns a path relative to the calling
+ SConscript file's directory, not the top-level directory.
+
+ - Added support for a separate src_dir argument to SConscript()
+ that allows explicit specification of where the source files
+ for an SConscript file can be found.
+
+ - Support more easily re-usable flavors of command generators by
+ calling callable variables when strings are expanded.
+
+ From Steven Knight:
+
+ - Added an INSTALL construction variable that can be set to a function
+ to control how the Install() and InstallAs() Builders install files.
+ The default INSTALL function now copies, not links, files.
+
+ - Remove deprecated features: the "name" argument to Builder objects,
+ and the Environment.Update() method.
+
+ - Add an Environment.SourceCode() method to support fetching files
+ from source code systems. Add factory methods that create Builders
+ to support BitKeeper, CVS, RCS, and SCCS. Add support for fetching
+ files from RCS or SCCS transparently (like GNU Make).
+
+ - Make the internal to_String() function more efficient.
+
+ - Make the error message the same as other build errors when there's a
+ problem unlinking a target file in preparation for it being built.
+
+ - Make TARGET, TARGETS, SOURCE and SOURCES reserved variable names and
+ warn if the user tries to set them in a construction environment.
+
+ - Add support for Tar and Zip files.
+
+ - Better documentation of the different ways to export variables to a
+ subsidiary SConscript file. Fix documentation bugs in a tools
+ example, places that still assumed SCons split strings on white
+ space, and typos.
+
+ - Support fetching arbitrary files from the TARGETS or SOURCES lists
+ (e.g. ${SOURCES[2]}) when calculating the build signature of a
+ command.
+
+ - Don't silently swallow exceptions thrown by Scanners (or other
+ exceptions while finding a node's dependent children).
+
+ - Push files to CacheDir() before calling the superclass built()
+ method (which may clear the build signature as part of clearing
+ cached implicit dependencies, if the file has a source scanner).
+ (Bug reported by Jeff Petkau.)
+
+ - Raise an internal error if we attempt to push a file to CacheDir()
+ with a build signature of None.
+
+ - Add an explicit Exit() function for terminating early.
+
+ - Change the documentation to correctly describe that the -f option
+ doesn't change to the directory in which the specified file lives.
+
+ - Support changing directories locally with SConscript directory
+ path names relative to any SConstruct file specified with -f.
+ This allows you to build in another directory by simply changing
+ there and pointing at the SConstruct file in another directory.
+
+ - Change the default SConscriptChdir() behavior to change to the
+ SConscript directory while it's being read.
+
+ - Fix an exception thrown when the -U option was used with no
+ Default() target specified.
+
+ - Fix -u so that it builds things in corresponding build directories
+ when used in a source directory.
+
+ From Lachlan O'Dea:
+
+ - Add SharedObject() support to the masm tool.
+
+ - Fix WhereIs() to return normalized paths.
+
+ From Jeff Petkau:
+
+ - Don't copy a built file to a CacheDir() if it's already there.
+
+ - Avoid partial copies of built files in a CacheDir() by copying
+ to a temporary file and renaming.
+
+ From Anthony Roach:
+
+ - Fix incorrect dependency-cycle errors when an Aliased source doesn't
+ exist.
+
+
+
+RELEASE 0.11 - Tue, 11 Feb 2003 05:24:33 -0600
+
+ From Chad Austin:
+
+ - Add support for IRIX and the SGI MIPSPro tool chain.
+
+ - Support using the MSVC tool chain when running Cygwin Python.
+
+ From Michael Cook:
+
+ - Avoid losing signal bits in the exit status from a command,
+ helping terminate builds on interrupt (CTRL+C).
+
+ From Charles Crain:
+
+ - Added new AddPreAction() and AddPostAction() functions that support
+ taking additional actions before or after building specific targets.
+
+ - Add support for the PharLap ETS tool chain.
+
+ From Steven Knight:
+
+ - Allow Python function Actions to specify a list of construction
+ variables that should be included in the Action's signature.
+
+ - Allow libraries in the LIBS variable to explicitly include the prefix
+ and suffix, even when using the GNU linker.
+ (Bug reported by Neal Becker.)
+
+ - Use DOS-standard CR-LF line endings in the scons.bat file.
+ (Bug reported by Gary Ruben.)
+
+ - Doc changes: Eliminate description of deprecated "name" keyword
+ argument from Builder definition (reported by Gary Ruben).
+
+ - Support using env.Append() on BUILDERS (and other dictionaries).
+ (Bug reported by Bj=F6rn Bylander.)
+
+ - Setting the BUILDERS construction variable now properly clears
+ the previous Builder attributes from the construction Environment.
+ (Bug reported by Bj=F6rn Bylander.)
+
+ - Fix adding a prefix to a file when the target isn't specified.
+ (Bug reported by Esa Ilari Vuokko.)
+
+ - Clean up error messages from problems duplicating into read-only
+ BuildDir directories or into read-only files.
+
+ - Add a CommandAction.strfunction() method, and add an "env" argument
+ to the FunctionAction.strfunction() method, so that all Action
+ objects have strfunction() methods, and the functions for building
+ and returning a string both take the same arguments.
+
+ - Add support for new CacheDir() functionality to share derived files
+ between builds, with related options --cache-disable, --cache-force,
+ and --cache-show.
+
+ - Change the default behavior when no targets are specified to build
+ everything in the current directory and below (like Make). This
+ can be disabled by specifying Default(None) in an SConscript.
+
+ - Revamp SCons installation to fix a case-sensitive installation
+ on Win32 systems, and to add SCons-specific --standard-lib,
+ --standalone-lib, and --version-lib options for easier user
+ control of where the libraries get installed.
+
+ - Fix the ability to directly import and use Platform and Tool modules
+ that have been implicitly imported into an Environment().
+
+ - Add support for allowing an embedding interface to annotate a node
+ when it's created.
+
+ - Extend the SConscript() function to accept build_dir and duplicate
+ keyword arguments that function like a BuildDir() call.
+
+ From Steve Leblanc:
+
+ - Fix the output of -c -n when directories are involved, so it
+ matches -c.
+
+ From Anthony Roach:
+
+ - Use a different shared object suffix (.os) when using gcc so shared
+ and static objects can exist side-by-side in the same directory.
+
+ - Allow the same object files on Win32 to be linked into either
+ shared or static libraries.
+
+ - Cache implicit cache values when using --implicit-cache.
+
+
+
+RELEASE 0.10 - Thu, 16 Jan 2003 04:11:46 -0600
+
+ From Derrick 'dman' Hudson:
+
+ - Support Repositories on other file systems by symlinking or
+ copying files when hard linking won't work.
+
+ From Steven Knight:
+
+ - Remove Python bytecode (*.pyc) files from the scons-local packages.
+
+ - Have FunctionActions print a description of what they're doing
+ (a representation of the Python call).
+
+ - Fix the Install() method so that, like other actions, it prints
+ what would have happened when the -n option is used.
+
+ - Don't create duplicate source files in a BuildDir when the -n
+ option is used.
+
+ - Refactor the Scanner interface to eliminate unnecessary Scanner
+ calls and make it easier to write efficient scanners.
+
+ - Added a "recursive" flag to Scanner creation that specifies the
+ Scanner should be invoked recursively on dependency files returned
+ by the scanner.
+
+ - Significant performance improvement from using a more efficient
+ check, throughout the code, for whether a Node has a Builder.
+
+ - Fix specifying only the source file to MultiStepBuilders such as
+ the Program Builder. (Bug reported by Dean Bair.)
+
+ - Fix an exception when building from a file with the same basename as
+ the subdirectory in which it lives. (Bug reported by Gerard Patel.)
+
+ - Fix automatic deduction of a target file name when there are
+ multiple source files specified; the target is now deduced from just
+ the first source file in the list.
+
+ - Documentation fixes: better initial explanation of SConscript files;
+ fix a misformatted "table" in the StaticObject explanation.
+
+ From Steven Knight and Steve Leblanc:
+
+ - Fix the -c option so it will remove symlinks.
+
+ From Steve Leblanc:
+
+ - Add a Clean() method to support removing user-specified targets
+ when using the -c option.
+
+ - Add a development script for running SCons through PyChecker.
+
+ - Clean up things found by PyChecker (mostly unnecessary imports).
+
+ - Add a script to use HappyDoc to create HTML class documentation.
+
+ From Lachlan O'Dea:
+
+ - Make the Environment.get() method return None by default.
+
+ From Anthony Roach:
+
+ - Add SetJobs() and GetJobs() methods to allow configuration of the
+ number of default jobs (still overridden by -j).
+
+ - Convert the .sconsign file format from ASCII to a pickled Python
+ data structure.
+
+ - Error message cleanups: Made consistent the format of error
+ messages (now all start with "scons: ***") and warning messages (now
+ all start with "scons: warning:"). Caught more cases with the "Do
+ not know how to build" error message.
+
+ - Added support for the MinGW tool chain.
+
+ - Added a --debug=includes option.
+
+
+
+RELEASE 0.09 - Thu, 5 Dec 2002 04:48:25 -0600
+
+ From Chad Austin:
+
+ - Add a Prepend() method to Environments, to append values to
+ the beginning of construction variables.
+
+ From Matt Balvin:
+
+ - Add long command-line support to the "lib" Tool (Microsoft library
+ archiver), too.
+
+ From Charles Crain:
+
+ - Allow $$ in a string to be passed through as $.
+
+ - Support file names with odd characters in them.
+
+ - Add support for construction variable substition on scanner
+ directories (in CPPPATH, F77PATH, LIBPATH, etc.).
+
+ From Charles Crain and Steven Knight:
+
+ - Add Repository() functionality, including the -Y option.
+
+ From Steven Knight:
+
+ - Fix auto-deduction of target names so that deduced targets end
+ up in the same subdirectory as the source.
+
+ - Don't remove source files specified on the command line!
+
+ - Suport the Intel Fortran Compiler (ifl.exe).
+
+ - Supply an error message if there are no command-line or
+ Default() targets specified.
+
+ - Fix the ASPPCOM values for the GNU assembler.
+ (Bug reported by Brett Polivka.)
+
+ - Fix an exception thrown when a Default() directory was specified
+ when using the -U option.
+
+ - Issue a warning when -c can't remove a target.
+
+ - Eliminate unnecessary Scanner calls by checking for the
+ existence of a file before scanning it. (This adds a generic
+ hook to check an arbitrary condition before scanning.)
+
+ - Add explicit messages to tell when we're "Reading SConscript files
+ ...," "done reading SConscript files," "Building targets," and
+ "done building targets." Add a -Q option to supress these.
+
+ - Add separate $SHOBJPREFIX and $SHOBJSUFFIX construction variables
+ (by default, the same as $OBJPREFIX and $OBJSUFFIX).
+
+ - Add Make-like error messages when asked to build a source file,
+ and before trying to build a file that doesn't have all its source
+ files (including when an invalid drive letter is used on WIN32).
+
+ - Add an scons-local-{version} package (in both .tar.gz and .zip
+ flavors) to help people who want to ship SCons as a stand-alone
+ build tool in their software packages.
+
+ - Prevent SCons from unlinking files in certain situations when
+ the -n option is used.
+
+ - Change the name of Tool/lib.py to Tool/mslib.py.
+
+ From Steven Knight and Anthony Roach:
+
+ - Man page: document the fact that Builder calls return Node objects.
+
+ From Steve LeBlanc:
+
+ - Refactor option processing to use our own version of Greg Ward's
+ Optik module, modified to run under Python 1.5.2.
+
+ - Add a ParseConfig() command to modify an environment based on
+ parsing output from a *-config command.
+
+ From Jeff Petkau:
+
+ - Fix interpretation of '#/../foo' on Win32 systems.
+
+ From Anthony Roach:
+
+ - Fixed use of command lines with spaces in their arguments,
+ and use of Nodes with spaces in their string representation.
+
+ - Make access and modification times of files in a BuildDir match
+ the source file, even when hard linking isn't available.
+
+ - Make -U be case insensitive on Win32 systems.
+
+ - Issue a warning and continue when finding a corrupt .sconsign file.
+
+ - Fix using an alias as a dependency of a target so that if one of the
+ alias' dependencies gets rebuilt, the resulting target will, too.
+
+ - Fix differently ordered targets causing unnecessary rebuilds
+ on case insensitive systems.
+
+ - Use os.system() to execute external commands whenever the "env"
+ utility is available, which is much faster than fork()/exec(),
+ and fixes the -j option on several platforms.
+
+ - Fix use of -j with multiple targets.
+
+ - Add an Options() object for friendlier accomodation of command-
+ line arguments.
+
+ - Add support for Microsoft VC++ precompiled header (.pch) files,
+ debugger (.pdb) files, and resource (.rc) files.
+
+ - Don't compute the $_CPPINCFLAGS, $_F77INCFLAGS, $_LIBFLAGS and
+ $_LIBDIRFLAGS variables each time a command is executed, define
+ them so they're computed only as needed. Add a new _concat
+ function to the Environment that allows people to define their
+ own similar variables.
+
+ - Fix dependency scans when $LIBS is overridden.
+
+ - Add EnsurePythonVersion() and EnsureSConsVersion() functions.
+
+ - Fix the overly-verbose stack trace on ListBuilder build errors.
+
+ - Add a SetContentSignatureType() function, allowing use of file
+ timestamps instead of MD5 signatures.
+
+ - Make -U and Default('source') fail gracefully.
+
+ - Allow the File() and Dir() methods to take a path-name string as
+ the starting directory, in addition to a Dir object.
+
+ - Allow the command handler to be selected via the SPAWN, SHELL
+ and ESCAPE construction variables.
+
+ - Allow construction variables to be overridden when a Builder
+ is called.
+
+ From sam th:
+
+ - Dynamically check for the existence of utilities with which to
+ initialize Environments by default.
+
+
+
+RELEASE 0.08 - Mon, 15 Jul 2002 12:08:51 -0500
+
+ From Charles Crain:
+
+ - Fixed a bug with relative CPPPATH dirs when using BuildDir().
+ (Bug reported by Bob Summerwill.)
+
+ - Added a warnings framework and a --warn option to enable or
+ disable warnings.
+
+ - Make the C scanner warn users if files referenced by #include
+ directives cannot be found and --warn=dependency is specified.
+
+ - The BUILDERS construction variable should now be a dictionary
+ that maps builder names to actions. Existing uses of lists,
+ and the Builder name= keyword argument, generate warnings
+ about use of deprecated features.
+
+ - Removed the "shared" keyword argument from the Object and
+ Library builders.
+
+ - Added separated StaticObject, SharedObject, StaticLibrary and
+ SharedLibrary builders. Made Object and Library synonyms for
+ StaticObject and StaticLibrary, respectively.
+
+ - Add LIBS and LIBPATH dependencies for shared libraries.
+
+ - Removed support for the prefix, suffix and src_suffix arguments
+ to Builder() to be callable functions.
+
+ - Fix handling file names with multiple dots.
+
+ - Allow a build directory to be outside of the SConstruct tree.
+
+ - Add a FindFile() function that searches for a file node with a
+ specified name.
+
+ - Add $CPPFLAGS to the shared-object command lines for g++ and gcc.
+
+ From Charles Crain and Steven Knight:
+
+ - Add a "tools=" keyword argument to Environment instantiation,
+ and a separate Tools() method, for more flexible specification
+ of tool-specific environment changes.
+
+ From Steven Knight:
+
+ - Add a "platform=" keyword argument to Environment instantiation,
+ and a separate Platform() method, for more flexible specification
+ of platform-specific environment changes.
+
+ - Updated README instructions and setup.py code to catch an
+ installation failure from not having distutils installed.
+
+ - Add descriptions to the -H help text for -D, -u and -U so
+ people can tell them apart.
+
+ - Remove the old feature of automatically splitting strings
+ of file names on white space.
+
+ - Add a dependency Scanner for native Fortran "include" statements,
+ using a new "F77PATH" construction variable.
+
+ - Fix C #include scanning to detect file names with characters like
+ '-' in them.
+
+ - Add more specific version / build output to the -v option.
+
+ - Add support for the GNU as, Microsoft masm, and nasm assemblers.
+
+ - Allow the "target" argument to a Builder call to be omitted, in
+ which case the target(s) are deduced from the source file(s) and the
+ Builder's specified suffix.
+
+ - Add a tar archive builder.
+
+ - Add preliminary support for the OS/2 Platform, including the icc
+ and ilink Tools.
+
+ From Jeff Petkau:
+
+ - Fix --implicit-cache if the scanner returns an empty list.
+
+ From Anthony Roach:
+
+ - Add a "multi" keyword argument to Builder creation that specifies
+ it's okay to call the builder multiple times for a target.
+
+ - Set a "multi" on Aliases so multiple calls will append to an Alias.
+
+ - Fix emitter functions' use of path names when using BuildDir or
+ in subdirectories.
+
+ - Fix --implicit-cache causing redundant rebuilds when the header
+ file list changed.
+
+ - Fix --implicit-cache when a file has no implicit dependencies and
+ its source is generated.
+
+ - Make the drive letters on Windows always be the same case, so that
+ changes in the case of drive letters don't cause a rebuild.
+
+ - Fall back to importing the SCons.TimeStamp module if the SCons.MD5
+ module can't be imported.
+
+ - Fix interrupt handling to guarantee that a single interrupt will
+ halt SCons both when using -j and not.
+
+ - Fix .sconsign signature storage so that output files of one build
+ can be safely used as input files to another build.
+
+ - Added a --debug=time option to print SCons execution times.
+
+ - Print an error message if a file can't be unlinked before being
+ built, rather than just silently terminating the build.
+
+ - Add a SideEffect() method that can be used to tell the build
+ engine that a given file is created as a side effect of building
+ a target. A file can be specified as a side effect of more than
+ one build comand, in which case the commands will not be executed
+ simultaneously.
+
+ - Significant performance gains from not using our own version of
+ the inefficient stock os.path.splitext() method, caching source
+ suffix computation, code cleanup in MultiStepBuilder.__call__(),
+ and replicating some logic in scons_subst().
+
+ - Add --implicit-deps-changed and --implicit-deps-unchanged options.
+
+ - Add a GetLaunchDir() function.
+
+ - Add a SetBuildSignatureType() function.
+
+ From Zed Shaw:
+
+ - Add an Append() method to Environments, to append values to
+ construction variables.
+
+ - Change the name of Update() to Replace(). Keep Update() as a
+ deprecated synonym, at least for now.
+
+ From Terrel Shumway:
+
+ - Use a $PYTHON construction variable, initialized to sys.executable,
+ when using Python to build parts of the SCons packages.
+
+ - Use sys.prefix, not sys.exec_prefix, to find pdb.py.
+
+
+
+RELEASE 0.07 - Thu, 2 May 2002 13:37:16 -0500
+
+ From Chad Austin:
+
+ - Changes to build SCons packages on IRIX (and other *NIces).
+
+ - Don't create a directory Node when a file already exists there,
+ and vice versa.
+
+ - Add 'dirs' and 'names' keyword arguments to SConscript for
+ easier specification of subsidiary SConscript files.
+
+ From Charles Crain:
+
+ - Internal cleanup of environment passing to function Actions.
+
+ - Builders can now take arbitrary keyword arguments to create
+ attributes to be passed to: command generator functions,
+ FunctionAction functions, Builder emitter functions (below),
+ and prefix/suffix generator functions (below).
+
+ - Command generator functions can now return ANYTHING that can be
+ converted into an Action (a function, a string, a CommandGenerator
+ instance, even an ActionBase instance).
+
+ - Actions now call get_contents() with the actual target and source
+ nodes used for the build.
+
+ - A new DictCmdGenerator class replaces CompositeBuilder to support
+ more flexible Builder behavior internally.
+
+ - Builders can now take an emitter= keyword argument. An emitter
+ is a function that takes target, source, and env argument, then
+ return a 2-tuple of (new sources, new targets). The emitter is
+ called when the Builder is __call__'ed, allowing a user to modify
+ source and target lists.
+
+ - The prefix, suffix and src_suffix Builder arguments now take a
+ callable as well a string. The callable is passed the Environment
+ and any extra Builder keyword arguments and is expected to return
+ the appropriate prefix or suffix.
+
+ - CommandActions can now be a string, a list of command + argument
+ strings, or a list of commands (strings or lists).
+
+ - Added shared library support. The Object and Library Builders now
+ take a "shared=1" keyword argument to specify that a shared object
+ or shared library should be built. It is an error to try to build
+ static objects into a shared library or vice versa.
+
+ - Win32 support for .def files has been added. Added the Win32-specific
+ construction variables $WIN32DEFPREFIX, $WIN32DEFSUFFIX,
+ $WIN32DLLPREFIX and $WIN32IMPLIBPREFIX. When building a .dll,
+ the new construction variable $WIN32_INSERT_DEF, controls whether
+ the appropriately-named .def file is inserted into the target
+ list (if not already present). A .lib file is always added to
+ a Library build if not present in the list of targets.
+
+ - ListBuilder now passes all targets to the action, not just the first.
+
+ - Fix so that -c now deletes generated yacc .h files.
+
+ - Builder actions and emitter functions can now be initialized, through
+ construction variables, to things other than strings.
+
+ - Make top-relative '#/dir' lookups work like '#dir'.
+
+ - Fix for relative CPPPATH directories in subsidiary SConscript files
+ (broken in 0.06).
+
+ - Add a for_signature argument to command generators, so that
+ generators that need to can return distinct values for the
+ command signature and for executing the command.
+
+ From Alex Jacques:
+
+ - Create a better scons.bat file from a py2bat.py script on the Python
+ mailing list two years ago (modeled after pl2bat.pl).
+
+ From Steven Knight:
+
+ - Fix so that -c -n does *not* remove the targets!
+
+ - Man page: Add a hierarchical libraries + Program example.
+
+ - Support long MSVC linker command lines through a builder action
+ that writes to a temporary file and uses the magic MSVC "link @file"
+ argument syntax if the line is longer than 2K characters.
+
+ - Fix F77 command-line options on Win32 (use /Fo instead of -o).
+
+ - Use the same action to build from .c (lower case) and .C (upper
+ case) files on case-insensitive systems like Win32.
+
+ - Support building a PDF file directly from a TeX or LaTeX file
+ using pdftex or pdflatex.
+
+ - Add a -x option to runtest.py to specify the script being tested.
+ A -X option indicates it's an executable, not a script to feed
+ to the Python interpreter.
+
+ - Add a Split() function (identical to SCons.Util.argmunge()) for use
+ in the next release, when Builders will no longer automatically split
+ strings on white space.
+
+ From Steve Leblanc:
+
+ - Add the SConscriptChdir() method.
+
+ From Anthony Roach:
+
+ - Fix --debug=tree when used with directory targets.
+
+ - Significant internal restructuring of Scanners and Taskmaster.
+
+ - Added new --debug=dtree option.
+
+ - Fixes for --profile option.
+
+ - Performance improvement in construction variable substitution.
+
+ - Implemented caching of content signatures, plus added --max-drift
+ option to control caching.
+
+ - Implemented caching of dependency signatures, enabled by new
+ --implicit-cache option.
+
+ - Added abspath construction variable modifier.
+
+ - Added $SOURCE variable as a synonym for $SOURCES[0].
+
+ - Write out .sconsign files on error or interrupt so intermediate
+ build results are saved.
+
+ - Change the -U option to -D. Make a new -U that builds just the
+ targets from the local SConscript file.
+
+ - Fixed use of sys.path so Python modules can be imported from
+ the SConscript directory.
+
+ - Fix for using Aliases with the -u, -U and -D options.
+
+ - Fix so that Nodes can be passed to SConscript files.
+
+ From Moshe Zadka:
+
+ - Changes for official Debian packaging.
+
+
+
+RELEASE 0.06 - Thu, 28 Mar 2002 01:24:29 -0600
+
+ From Charles Crain:
+
+ - Fix command generators to expand construction variables.
+
+ - Make FunctionAction arguments be Nodes, not strings.
+
+ From Stephen Kennedy:
+
+ - Performance: Use a dictionary, not a list, for a Node's parents.
+
+ From Steven Knight:
+
+ - Add .zip files to the packages we build.
+
+ - Man page: document LIBS, fix a typo, document ARGUMENTS.
+
+ - Added RANLIB and RANLIBFLAGS construction variables. Only use them
+ in ARCOM if there's a "ranlib" program on the system.
+
+ - Add a configurable CFILESUFFIX for the Builder of .l and .y files
+ into C files.
+
+ - Add a CXXFile Builder that turns .ll and .yy files into .cc files
+ (configurable via a CXXFILESUFFIX construction variable).
+
+ - Use the POSIX-standard lex -t flag, not the GNU-specific -o flag.
+ (Bug reported by Russell Christensen.)
+
+ - Fixed an exception when CPPPATH or LIBPATH is a null string.
+ (Bug reported by Richard Kiss.)
+
+ - Add a --profile=FILE option to make profiling SCons easier.
+
+ - Modify the new DVI builder to create .dvi files from LaTeX (.ltx
+ and .latex) files.
+
+ - Add support for Aliases (phony targets).
+
+ - Add a WhereIs() method for searching for path names to executables.
+
+ - Add PDF and PostScript document builders.
+
+ - Add support for compiling Fortran programs from a variety of
+ suffixes (a la GNU Make): .f, .F, .for, .FOR, .fpp and .FPP
+
+ - Support a CPPFLAGS variable on all default commands that use the
+ C preprocessor.
+
+ From Steve Leblanc:
+
+ - Add support for the -U option.
+
+ - Allow CPPPATH, LIBPATH and LIBS to be specified as white-space
+ separated strings.
+
+ - Add a document builder to create .dvi files from TeX (.tex) files.
+
+ From Anthony Roach:
+
+ - Fix: Construction variables with values of 0 were incorrectly
+ interpolated as ''.
+
+ - Support env['VAR'] to fetch construction variable values.
+
+ - Man page: document Precious().
+
+
+
+RELEASE 0.05 - Thu, 21 Feb 2002 16:50:03 -0600
+
+ From Chad Austin:
+
+ - Set PROGSUFFIX to .exe under Cygwin.
+
+ From Charles Crain:
+
+ - Allow a library to specified as a command-line source file, not just
+ in the LIBS construction variable.
+
+ - Compensate for a bug in os.path.normpath() that returns '' for './'
+ on WIN32.
+
+ - More performance optimizations: cache #include lines from files,
+ eliminate unnecessary calls.
+
+ - If a prefix or suffix contains white space, treat the resulting
+ concatenation as separate arguments.
+
+ - Fix irregularities in the way we fetch DevStudio information from
+ the Windows registry, and in our registry error handling.
+
+ From Steven Knight:
+
+ - Flush stdout after print so it intermixes correctly with stderr
+ when redirected.
+
+ - Allow Scanners to return a list of strings, and document how to
+ write your own Scanners.
+
+ - Look up implicit (scanned) dependencies relative to the directory
+ of file being scanned.
+
+ - Make writing .sconsign files more robust by first trying to write
+ to a temp file that gets renamed.
+
+ - Create all of the directories for a list of targets before trying
+ to build any of the targets.
+
+ - WIN32 portability fixes in tests.
+
+ - Allow the list of variables exported to an SConscript file to be
+ a UserList, too.
+
+ - Document the overlooked LIBPATH construction variable.
+ (Bug reported by Eicke Godehardt.)
+
+ - Fix so that Ignore() ignores indirect, implicit dependencies
+ (included files), not just direct dependencies.
+
+ - Put the man page in the Debian distribution.
+
+ - Run HTML docs through tidy to clean up the HTML (for Konqueror).
+
+ - Add preliminary support for Unicode strings.
+
+ - Efficiency: don't scan dependencies more than once during the
+ walk of a tree.
+
+ - Fix the -c option so it doesn't stop removing targets if one doesn't
+ already exist.
+ (Bug reported by Paul Connell.)
+
+ - Fix the --debug=pdb option when run on Windows NT.
+ (Bug reported by Paul Connell.)
+
+ - Add support for the -q option.
+
+ From Steve Leblanc:
+
+ - Add support for the -u option.
+
+ - Add .cc and .hh file suffixes to the C Scanner.
+
+ From Anthony Roach:
+
+ - Make the scons script return an error code on failures.
+
+ - Add support for using code to generate a command to build a target.
+
+
+
+RELEASE 0.04 - Wed, 30 Jan 2002 11:09:42 -0600
+
+ From Charles Crain:
+
+ - Significant performance improvements in the Node.FS and
+ Scanner subsystems.
+
+ - Fix signatures of binary files on Win32 systems.
+
+ - Allow LIBS and LIBPATH to be strings, not just arrays.
+
+ - Print a traceback if a Python-function builder throws an exception.
+
+ From Steven Knight:
+
+ - Fix using a directory as a Default(), and allow Default() to
+ support white space in file names for strings in arrays.
+
+ - Man page updates: corrected some mistakes, documented various
+ missing Environment methods, alphabetized the construction
+ variables and other functions, defined begin and end macros for
+ the example sections, regularized white space separation, fixed
+ the use of Export() in the Multiple Variants example.
+
+ - Function action fixes: None is now a successful return value.
+ Exceptions are now reported. Document function actions.
+
+ - Add 'Action' and 'Scanner' to the global keywords so SConscript
+ files can use them too.
+
+ - Removed the Wrapper class between Nodes and Walkers.
+
+ - Add examples using Library, LIBS, and LIBPATH.
+
+ - The C Scanner now always returns a sorted list of dependencies
+ so order changes don't cause unnecessary rebuilds.
+
+ - Strip $(-$) bracketed text from command lines. Use this to
+ surround $_INCDIRS and $_LIBDIRS so we don't rebuild in response
+ to changes to -I or -L options.
+
+ - Add the Ignore() method to ignore dependencies.
+
+ - Provide an error message when a nonexistent target is specified
+ on the command line.
+
+ - Remove targets before building them, and add an Environment
+ Precious() method to override that.
+
+ - Eliminate redundant calls to the same builder when the target is a
+ list of targets: Add a ListBuilder class that wraps Builders to
+ handle lists atomically. Extend the Task class to support building
+ and updating multiple targets in a single Task. Simplify the
+ interface between Task and Taskmaster.
+
+ - Add a --debug=pdb option to re-run SCons under the Python debugger.
+
+ - Only compute a build signature once for each node.
+
+ - Changes to our sys.path[] manipulation to support installation into
+ an arbitrary --prefix value.
+
+ From Steve Leblanc:
+
+ - Add var=value command-line arguments.
+
+
+
+RELEASE 0.03 - Fri, 11 Jan 2002 01:09:30 -0600
+
+ From Charles Crain:
+
+ - Performance improvements in the Node.FS and Sig.Calculator classes.
+
+ - Add the InstallAs() method.
+
+ - Execute commands through an external interpreter (sh, cmd.exe, or
+ command.com) to handle redirection metacharacters.
+
+ - Allow the user to supply a command handler.
+
+ From Steven Knight:
+
+ - Search both /usr/lib and /usr/local/lib for scons directories by
+ adding them both to sys.path, with whichever is in sys.prefix first.
+
+ - Fix interpreting strings of multiple white-space separated file names
+ as separate file names, allowing prefixes and suffixes to be appended
+ to each individually.
+
+ - Refactor to move CompositeBuilder initialization logic from the
+ factory wrapper to the __init__() method, and allow a Builder to
+ have both an action and a src_builder (or array of them).
+
+ - Refactor BuilderBase.__call__() to separate Node creation/lookup
+ from initialization of the Node's builder information.
+
+ - Add a CFile Builder object that supports turning lex (.l) and
+ yacc (.y) files into .c files.
+
+ - Document: variable interpretation attributes; how to propogate
+ the user's environment variables to executed commands; how to
+ build variants in multiple BuildDirs.
+
+ - Collect String, Dict, and List type-checking in common utility
+ routines so we can accept User{String,Dict,List}s all over.
+
+ - Put the Action factory and classes into their own module.
+
+ - Use one CPlusPlusAction in the Object Builder's action dictionary,
+ instead of letting it create multiple identical instances.
+
+ - Document the Install() and InstallAs() methods.
+
+ From Steve Leblanc:
+
+ - Require that a Builder be given a name argument, supplying a
+ useful error message when it isn't.
+
+ From Anthony Roach:
+
+ - Add a "duplicate" keyword argument to BuildDir() that can be set
+ to prevent linking/copying source files into build directories.
+
+ - Add a "--debug=tree" option to print an ASCII dependency tree.
+
+ - Fetch the location of the Microsoft Visual C++ compiler(s) from
+ the Registry, instead of hard-coding the location.
+
+ - Made Scanner objects take Nodes, not path names.
+
+ - Have the C Scanner cache the #include file names instead of
+ (re-)scanning the file each time it's called.
+
+ - Created a separate class for parent "nodes" of file system roots,
+ eliminating the need for separate is-parent-null checks everywhere.
+
+ - Removed defined __hash__() and __cmp() methods from FS.Entry, in
+ favor of Python's more efficient built-in identity comparisons.
+
+
+
+RELEASE 0.02 - Sun, 23 Dec 2001 19:05:09 -0600
+
+ From Charles Crain:
+
+ - Added the Install(), BuildDir(), and Export() methods.
+
+ - Fix the -C option by delaying setting the top of the FS tree.
+
+ - Avoid putting the directory path on the libraries in the LIBS
+ construction variable.
+
+ - Added a GetBuildPath() method to return the full path to the
+ Node for a specified string.
+
+ - Fixed variable substitution in CPPPATH and LIBPATH.
+
+ From Steven Knight:
+
+ - Fixed the version comment in the scons.bat (the UNIX geek used
+ # instead of @rem).
+
+ - Fix to setup.py so it doesn't require a sys.argv[1] argument.
+
+ - Provide make-like warning message for "command not found" and
+ similar errors.
+
+ - Added an EXAMPLES section to the man page.
+
+ - Make Default() targets properly relative to their SConscript
+ file's subdirectory.
+
+ From Anthony Roach:
+
+ - Documented CXXFLAGS, CXXCOM, and CPPPATH.
+
+ - Fixed SCONS_LIB_DIR to work as documented.
+
+ - Made Default() accept Nodes as arguments.
+
+ - Changed Export() to make it easier to use.
+
+ - Added the Import() and Return() methods.
+
+
+
+RELEASE 0.01 - Thu Dec 13 19:25:23 CST 2001
+
+A brief overview of important functionality available in release 0.01:
+
+ - C and C++ compilation on POSIX and Windows NT.
+
+ - Automatic scanning of C/C++ source files for #include dependencies.
+
+ - Support for building libraries; setting construction variables
+ allows creation of shared libraries.
+
+ - Library and C preprocessor search paths.
+
+ - File changes detected using MD5 signatures.
+
+ - User-definable Builder objects for building files.
+
+ - User-definable Scanner objects for scanning for dependencies.
+
+ - Parallel build (-j) support.
+
+ - Dependency cycles detected.
+
+ - Linux packages available in RPM and Debian format.
+
+ - Windows installer available.
+
+
+
+__COPYRIGHT__
+__FILE__ __REVISION__ __DATE__ __DEVELOPER__
diff --git a/3rdParty/SCons/scons-3.0.1/LICENSE.txt b/3rdParty/SCons/scons-3.0.1/LICENSE.txt
new file mode 100644
index 0000000..7aa2a09
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/LICENSE.txt
@@ -0,0 +1,20 @@
+__COPYRIGHT__
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be included
+in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/3rdParty/SCons/scons-3.0.1/MANIFEST.in b/3rdParty/SCons/scons-3.0.1/MANIFEST.in
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/MANIFEST.in
diff --git a/3rdParty/SCons/scons-3.0.1/README.txt b/3rdParty/SCons/scons-3.0.1/README.txt
new file mode 100644
index 0000000..d80460a
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/README.txt
@@ -0,0 +1,250 @@
+
+
+ SCons - a software construction tool
+
+ Version __VERSION__
+
+
+This is SCons, a tool for building software (and other files). SCons is
+implemented in Python, and its "configuration files" are actually Python
+scripts, allowing you to use the full power of a real scripting language
+to solve build problems. You do not, however, need to know Python to
+use SCons effectively.
+
+See the RELEASE.txt file for notes about this specific release,
+including known problems. See the CHANGES.txt file for a list of
+changes since the previous release.
+
+
+LATEST VERSION
+==============
+
+Before going further, you can check that this package you have is
+the latest version by checking the SCons download page at:
+
+ http://www.scons.org/download.html
+
+
+EXECUTION REQUIREMENTS
+======================
+
+Running SCons requires Python version 2.7.*. Currently it does not
+run on the Python 3.x release. There should be
+no other dependencies or requirements to run SCons. (There is, however,
+an additional requirement to *install* SCons from this particular
+package; see the next section.)
+
+By default, SCons knows how to search for available programming tools
+on various systems--see the SCons man page for details. You may,
+of course, override the default SCons choices made by appropriate
+configuration of Environment construction variables.
+
+
+INSTALLATION REQUIREMENTS
+=========================
+
+Nothing special.
+
+
+INSTALLATION
+============
+
+Assuming your system satisfies the installation requirements in the
+previous section, install SCons from this package simply by running the
+provided Python-standard setup script as follows:
+
+ # python setup.py install
+
+By default, the above command will do the following:
+
+ -- Install the version-numbered "scons-__VERSION__" and "sconsign-__VERSION__"
+ scripts in the default system script directory (/usr/bin or
+ C:\Python*\Scripts, for example). This can be disabled by
+ specifying the "--no-version-script" option on the command
+ line.
+
+ -- Install scripts named "scons" and "sconsign" scripts in the
+ default system script directory (/usr/bin or C:\Python*\Scripts,
+ for example). This can be disabled by specifying the
+ "--no-scons-script" option on the command line, which is useful
+ if you want to install and experiment with a new version before
+ making it the default on your system.
+
+ On UNIX or Linux systems, you can have the "scons" and "sconsign"
+ scripts be hard links or symbolic links to the "scons-__VERSION__" and
+ "sconsign-__VERSION__" scripts by specifying the "--hardlink-scons"
+ or "--symlink-scons" options on the command line.
+
+ -- Install "scons-__VERSION__.bat" and "scons.bat" wrapper scripts in the
+ Python prefix directory on Windows (C:\Python*, for example).
+ This can be disabled by specifying the "--no-install-bat" option
+ on the command line.
+
+ On UNIX or Linux systems, the "--install-bat" option may be
+ specified to have "scons-__VERSION__.bat" and "scons.bat" files
+ installed in the default system script directory, which is useful
+ if you want to install SCons in a shared file system directory
+ that can be used to execute SCons from both UNIX/Linux and
+ Windows systems.
+
+ -- Install the SCons build engine (a Python module) in an
+ appropriate version-numbered SCons library directory
+ (/usr/lib/scons-__VERSION__ or C:\Python*\scons-__VERSION__, for example).
+ See below for more options related to installing the build
+ engine library.
+
+ -- Install the troff-format man pages in an appropriate directory
+ on UNIX or Linux systems (/usr/share/man/man1 or /usr/man/man1,
+ for example). This can be disabled by specifying the
+ "--no-install-man" option on the command line. The man pages
+ can be installed on Windows systems by specifying the
+ "--install-man" option on the command line.
+
+Note that, by default, SCons does not install its build engine library
+in the standard Python library directories. If you want to be able to
+use the SCons library modules (the build engine) in other Python
+scripts, specify the "--standard-lib" option on the command line, as
+follows:
+
+ # python setup.py install --standard-lib
+
+This will install the build engine in the standard Python library
+directory (/usr/lib/python*/site-packages or
+C:\Python*\Lib\site-packages).
+
+Alternatively, you can have SCons install its build engine library in a
+hard-coded standalone library directory, instead of the default
+version-numbered directory, by specifying the "--standalone-lib" option
+on the command line, as follows:
+
+ # python setup.py install --standalone-lib
+
+This is usually not recommended, however.
+
+Note that, to install SCons in any of the above system directories,
+you should have system installation privileges (that is, "root" or
+"Administrator") when running the setup.py script. If you don't have
+system installation privileges, you can use the --prefix option to
+specify an alternate installation location, such as your home directory:
+
+ $ python setup.py install --prefix=$HOME
+
+This will install SCons in the appropriate locations relative to
+$HOME--that is, the scons script itself $HOME/bin and the associated
+library in $HOME/lib/scons, for example.
+
+
+DOCUMENTATION
+=============
+
+See the RELEASE.txt file for notes about this specific release,
+including known problems. See the CHANGES.txt file for a list of
+changes since the previous release.
+
+The scons.1 man page is included in this package, and contains a section
+of small examples for getting started using SCons.
+
+Additional documentation for SCons is available at:
+
+ http://www.scons.org/doc.html
+
+
+LICENSING
+=========
+
+SCons is distributed under the MIT license, a full copy of which is
+available in the LICENSE.txt file. The MIT license is an approved Open
+Source license, which means:
+
+ This software is OSI Certified Open Source Software. OSI
+ Certified is a certification mark of the Open Source Initiative.
+
+More information about OSI certifications and Open Source software is
+available at:
+
+ http://www.opensource.org/
+
+
+REPORTING BUGS
+==============
+
+Please report bugs by following the detailed instructions on our Bug
+Submission page:
+
+ http://scons.tigris.org/bug-submission.html
+
+You can also send mail to the SCons developers' mailing list:
+
+ scons-dev@scons.org
+
+But even if you send email to the mailing list please make sure that you
+ALSO submit a bug report to the project page bug tracker, because bug
+reports in email often get overlooked in the general flood of messages.
+
+
+MAILING LISTS
+=============
+
+An active mailing list for users of SCons is available. You may send
+questions or comments to the list at:
+
+ scons-users@scons.org
+
+You may subscribe to the mailing list by sending email to:
+
+ scons-users-join@scons.org
+
+There is also a low-volume mailing list available for announcements
+about SCons. Subscribe by sending email to:
+
+ announce-subscribe@scons.tigris.org
+
+There are other mailing lists available for SCons developers, for
+notification of SCons code changes, and for notification of updated
+bug reports and project documents. Please see our mailing lists page
+for details.
+
+
+DONATIONS
+=========
+
+If you find SCons helpful, please consider making a donation (of cash,
+software, or hardware) to support continued work on the project.
+Information is available at:
+
+ http://www.scons.org/donate.html
+
+
+FOR MORE INFORMATION
+====================
+
+Check the SCons web site at:
+
+ http://www.scons.org/
+
+
+AUTHOR INFO
+===========
+SCons was originally written by Steven Knight, knight at baldmt dot com.
+Since around 2010 it has been maintained by the SCons
+development team, co-managed by Bill Deegan and Gary Oberbrunner, with
+many contributors, including but not at all limited to:
+
+- Chad Austin
+- Dirk Baechle
+- Charles Crain
+- William Deegan
+- Steve Leblanc
+- Rob Managan
+- Greg Noel
+- Gary Oberbrunner
+- Anthony Roach
+- Greg Spencer
+- Tom Tanner
+- Anatoly Techtonik
+- Christoph Wiedemann
+- Russel Winder
+
+\... and many others.
+
+Copyright (c) 2001 - 2015 The SCons Foundation
diff --git a/3rdParty/SCons/scons-3.0.1/RELEASE.txt b/3rdParty/SCons/scons-3.0.1/RELEASE.txt
new file mode 100644
index 0000000..1334aa3
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/RELEASE.txt
@@ -0,0 +1,73 @@
+ A new SCons checkpoint release, 3.0.1, is now available
+ on the SCons download page:
+
+ http://www.scons.org/download.php
+
+ XXX The primary purpose of this release ... XXX
+
+ A SCons "checkpoint release" is intended to provide early access to
+ new features so they can be tested in the field before being released
+ for adoption by other software distributions.
+
+ Note that a checkpoint release is developed using the same test-driven
+ development methodology as all SCons releases. Existing SCons
+ functionality should all work as it does in previous releases (except
+ for any changes identified in the release notes) and early adopters
+ should be able to use a checkpoint release safely for production work
+ with existing SConscript files. If not, it represents not only a bug
+ in SCons but also a hole in the regression test suite, and we want to
+ hear about it.
+
+ New features may be more lightly tested than in past releases,
+ especially as concerns their interaction with all of the other
+ functionality in SCons. We are especially interested in hearing bug
+ reports about new functionality.
+
+ We do not recommend that downstream distributions (Debian, Fedora,
+ etc.) package a checkpoint release, mainly to avoid confusing the
+ "public" release numbering with the long checkpoint release names.
+
+ Here is a summary of the changes since 1.3.0:
+
+ NEW FUNCTIONALITY
+
+ - List new features (presumably why a checkpoint is being released)
+
+ DEPRECATED FUNCTIONALITY
+
+ - List anything that's been deprecated since the last release
+
+ CHANGED/ENHANCED EXISTING FUNCTIONALITY
+
+ - List modifications to existing features, where the previous behavior
+ wouldn't actually be considered a bug
+
+ FIXES
+
+ - List fixes of outright bugs
+
+ IMPROVEMENTS
+
+ - List improvements that wouldn't be visible to the user in the
+ documentation: performance improvements (describe the circumstances
+ under which they would be observed), or major code cleanups
+
+ PACKAGING
+
+ - List changes in the way SCons is packaged and/or released
+
+ DOCUMENTATION
+
+ - List any significant changes to the documentation (not individual
+ typo fixes, even if they're mentioned in src/CHANGES.txt to give
+ the contributor credit)
+
+ DEVELOPMENT
+
+ - List visible changes in the way SCons is developed
+
+ Thanks to CURLY, LARRY, and MOE for their contributions to this release.
+ Contributors are listed alphabetically by their last name.
+
+__COPYRIGHT__
+__FILE__ __REVISION__ __DATE__ __DEVELOPER__
diff --git a/3rdParty/SCons/scons-3.0.1/engine/MANIFEST-xml.in b/3rdParty/SCons/scons-3.0.1/engine/MANIFEST-xml.in
new file mode 100644
index 0000000..cfbfd3a
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/MANIFEST-xml.in
@@ -0,0 +1,8 @@
+SCons/*.xml
+SCons/Platform/*.xml
+SCons/Scanner/__init__.xml
+SCons/Script/*.xml
+SCons/Tool/*.xml
+SCons/Tool/docbook/__init__.xml
+SCons/Tool/docbook/utils/xmldepend.xsl
+SCons/Tool/packaging/__init__.xml
diff --git a/3rdParty/SCons/scons-3.0.1/engine/MANIFEST.in b/3rdParty/SCons/scons-3.0.1/engine/MANIFEST.in
new file mode 100644
index 0000000..2df278e
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/MANIFEST.in
@@ -0,0 +1,179 @@
+SCons/__init__.py
+SCons/Action.py
+SCons/Builder.py
+SCons/compat/*.py
+SCons/CacheDir.py
+SCons/Conftest.py
+SCons/cpp.py
+SCons/dblite.py
+SCons/Debug.py
+SCons/Defaults.py
+SCons/Environment.py
+SCons/Errors.py
+SCons/Executor.py
+SCons/Job.py
+SCons/exitfuncs.py
+SCons/Memoize.py
+SCons/Node/__init__.py
+SCons/Node/Alias.py
+SCons/Node/FS.py
+SCons/Node/Python.py
+SCons/Options/*.py
+SCons/PathList.py
+SCons/Platform/__init__.py
+SCons/Platform/aix.py
+SCons/Platform/cygwin.py
+SCons/Platform/darwin.py
+SCons/Platform/hpux.py
+SCons/Platform/irix.py
+SCons/Platform/os2.py
+SCons/Platform/posix.py
+SCons/Platform/sunos.py
+SCons/Platform/win32.py
+SCons/Scanner/__init__.py
+SCons/Scanner/C.py
+SCons/Scanner/D.py
+SCons/Scanner/Dir.py
+SCons/Scanner/Fortran.py
+SCons/Scanner/IDL.py
+SCons/Scanner/LaTeX.py
+SCons/Scanner/Prog.py
+SCons/Scanner/RC.py
+SCons/Scanner/SWIG.py
+SCons/SConf.py
+SCons/SConsign.py
+SCons/Script/__init__.py
+SCons/Script/Interactive.py
+SCons/Script/Main.py
+SCons/Script/SConscript.py
+SCons/Script/SConsOptions.py
+SCons/Subst.py
+SCons/Taskmaster.py
+SCons/Tool/__init__.py
+SCons/Tool/386asm.py
+SCons/Tool/aixc++.py
+SCons/Tool/aixcxx.py
+SCons/Tool/aixcc.py
+SCons/Tool/aixf77.py
+SCons/Tool/aixlink.py
+SCons/Tool/applelink.py
+SCons/Tool/ar.py
+SCons/Tool/as.py
+SCons/Tool/bcc32.py
+SCons/Tool/c++.py
+SCons/Tool/cxx.py
+SCons/Tool/cc.py
+SCons/Tool/cyglink.py
+SCons/Tool/clang.py
+SCons/Tool/clangxx.py
+SCons/Tool/cvf.py
+SCons/Tool/DCommon.py
+SCons/Tool/default.py
+SCons/Tool/dmd.py
+SCons/Tool/docbook/__init__.py
+SCons/Tool/dvi.py
+SCons/Tool/dvipdf.py
+SCons/Tool/dvips.py
+SCons/Tool/f03.py
+SCons/Tool/f08.py
+SCons/Tool/f77.py
+SCons/Tool/f90.py
+SCons/Tool/f95.py
+SCons/Tool/filesystem.py
+SCons/Tool/fortran.py
+SCons/Tool/FortranCommon.py
+SCons/Tool/g++.py
+SCons/Tool/gxx.py
+SCons/Tool/g77.py
+SCons/Tool/gas.py
+SCons/Tool/gcc.py
+SCons/Tool/gdc.py
+SCons/Tool/gfortran.py
+SCons/Tool/gnulink.py
+SCons/Tool/gs.py
+SCons/Tool/hpc++.py
+SCons/Tool/hpcxx.py
+SCons/Tool/hpcc.py
+SCons/Tool/hplink.py
+SCons/Tool/icc.py
+SCons/Tool/icl.py
+SCons/Tool/ifl.py
+SCons/Tool/ifort.py
+SCons/Tool/ilink.py
+SCons/Tool/ilink32.py
+SCons/Tool/install.py
+SCons/Tool/intelc.py
+SCons/Tool/ipkg.py
+SCons/Tool/jar.py
+SCons/Tool/JavaCommon.py
+SCons/Tool/javac.py
+SCons/Tool/javah.py
+SCons/Tool/latex.py
+SCons/Tool/ldc.py
+SCons/Tool/lex.py
+SCons/Tool/link.py
+SCons/Tool/linkloc.py
+SCons/Tool/MSCommon/__init__.py
+SCons/Tool/MSCommon/arch.py
+SCons/Tool/MSCommon/common.py
+SCons/Tool/MSCommon/netframework.py
+SCons/Tool/MSCommon/sdk.py
+SCons/Tool/MSCommon/vs.py
+SCons/Tool/MSCommon/vc.py
+SCons/Tool/m4.py
+SCons/Tool/masm.py
+SCons/Tool/midl.py
+SCons/Tool/mingw.py
+SCons/Tool/mslib.py
+SCons/Tool/mslink.py
+SCons/Tool/mssdk.py
+SCons/Tool/msvc.py
+SCons/Tool/msvs.py
+SCons/Tool/mwcc.py
+SCons/Tool/mwld.py
+SCons/Tool/nasm.py
+SCons/Tool/packaging/*.py
+SCons/Tool/pdf.py
+SCons/Tool/pdflatex.py
+SCons/Tool/pdftex.py
+SCons/Tool/PharLapCommon.py
+SCons/Tool/qt.py
+SCons/Tool/rmic.py
+SCons/Tool/rpcgen.py
+SCons/Tool/rpm.py
+SCons/Tool/rpmutils.py
+SCons/Tool/sgiar.py
+SCons/Tool/sgic++.py
+SCons/Tool/sgicxx.py
+SCons/Tool/sgicc.py
+SCons/Tool/sgilink.py
+SCons/Tool/sunar.py
+SCons/Tool/sunc++.py
+SCons/Tool/suncxx.py
+SCons/Tool/suncc.py
+SCons/Tool/sunf77.py
+SCons/Tool/sunf90.py
+SCons/Tool/sunf95.py
+SCons/Tool/sunlink.py
+SCons/Tool/swig.py
+SCons/Tool/tar.py
+SCons/Tool/tex.py
+SCons/Tool/textfile.py
+SCons/Tool/tlib.py
+SCons/Tool/wix.py
+SCons/Tool/yacc.py
+SCons/Tool/zip.py
+SCons/Util.py
+SCons/Variables/__init__.py
+SCons/Variables/BoolVariable.py
+SCons/Variables/EnumVariable.py
+SCons/Variables/ListVariable.py
+SCons/Variables/PackageVariable.py
+SCons/Variables/PathVariable.py
+SCons/Warnings.py
+SCons/Tool/GettextCommon.py
+SCons/Tool/gettext_tool.py
+SCons/Tool/msgfmt.py
+SCons/Tool/msginit.py
+SCons/Tool/msgmerge.py
+SCons/Tool/xgettext.py
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Action.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Action.py
new file mode 100644
index 0000000..b44088b
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Action.py
@@ -0,0 +1,1393 @@
+"""SCons.Action
+
+This encapsulates information about executing any sort of action that
+can build one or more target Nodes (typically files) from one or more
+source Nodes (also typically files) given a specific Environment.
+
+The base class here is ActionBase. The base class supplies just a few
+OO utility methods and some generic methods for displaying information
+about an Action in response to the various commands that control printing.
+
+A second-level base class is _ActionAction. This extends ActionBase
+by providing the methods that can be used to show and perform an
+action. True Action objects will subclass _ActionAction; Action
+factory class objects will subclass ActionBase.
+
+The heavy lifting is handled by subclasses for the different types of
+actions we might execute:
+
+ CommandAction
+ CommandGeneratorAction
+ FunctionAction
+ ListAction
+
+The subclasses supply the following public interface methods used by
+other modules:
+
+ __call__()
+ THE public interface, "calling" an Action object executes the
+ command or Python function. This also takes care of printing
+ a pre-substitution command for debugging purposes.
+
+ get_contents()
+ Fetches the "contents" of an Action for signature calculation
+ plus the varlist. This is what gets MD5 checksummed to decide
+ if a target needs to be rebuilt because its action changed.
+
+ genstring()
+ Returns a string representation of the Action *without*
+ command substitution, but allows a CommandGeneratorAction to
+ generate the right action based on the specified target,
+ source and env. This is used by the Signature subsystem
+ (through the Executor) to obtain an (imprecise) representation
+ of the Action operation for informative purposes.
+
+
+Subclasses also supply the following methods for internal use within
+this module:
+
+ __str__()
+ Returns a string approximation of the Action; no variable
+ substitution is performed.
+
+ execute()
+ The internal method that really, truly, actually handles the
+ execution of a command or Python function. This is used so
+ that the __call__() methods can take care of displaying any
+ pre-substitution representations, and *then* execute an action
+ without worrying about the specific Actions involved.
+
+ get_presig()
+ Fetches the "contents" of a subclass for signature calculation.
+ The varlist is added to this to produce the Action's contents.
+ TODO(?): Change this to always return ascii/bytes and not unicode (or py3 strings)
+
+ strfunction()
+ Returns a substituted string representation of the Action.
+ This is used by the _ActionAction.show() command to display the
+ command/function that will be executed to generate the target(s).
+
+There is a related independent ActionCaller class that looks like a
+regular Action, and which serves as a wrapper for arbitrary functions
+that we want to let the user specify the arguments to now, but actually
+execute later (when an out-of-date check determines that it's needed to
+be executed, for example). Objects of this class are returned by an
+ActionFactory class that provides a __call__() method as a convenient
+way for wrapping up the functions.
+
+"""
+
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import os
+import pickle
+import re
+import sys
+import subprocess
+import itertools
+import inspect
+
+import SCons.Debug
+from SCons.Debug import logInstanceCreation
+import SCons.Errors
+import SCons.Util
+import SCons.Subst
+
+# we use these a lot, so try to optimize them
+is_String = SCons.Util.is_String
+is_List = SCons.Util.is_List
+
+class _null(object):
+ pass
+
+print_actions = 1
+execute_actions = 1
+print_actions_presub = 0
+
+# Use pickle protocol 1 when pickling functions for signature
+# otherwise python3 and python2 will yield different pickles
+# for the same object.
+# This is due to default being 1 for python 2.7, and 3 for 3.x
+# TODO: We can roll this forward to 2 (if it has value), but not
+# before a deprecation cycle as the sconsigns will change
+ACTION_SIGNATURE_PICKLE_PROTOCOL = 1
+
+
+def rfile(n):
+ try:
+ return n.rfile()
+ except AttributeError:
+ return n
+
+
+def default_exitstatfunc(s):
+ return s
+
+strip_quotes = re.compile('^[\'"](.*)[\'"]$')
+
+
+def _callable_contents(obj):
+ """Return the signature contents of a callable Python object.
+ """
+ try:
+ # Test if obj is a method.
+ return _function_contents(obj.__func__)
+
+ except AttributeError:
+ try:
+ # Test if obj is a callable object.
+ return _function_contents(obj.__call__.__func__)
+
+ except AttributeError:
+ try:
+ # Test if obj is a code object.
+ return _code_contents(obj)
+
+ except AttributeError:
+ # Test if obj is a function object.
+ return _function_contents(obj)
+
+
+def _object_contents(obj):
+ """Return the signature contents of any Python object.
+
+ We have to handle the case where object contains a code object
+ since it can be pickled directly.
+ """
+ try:
+ # Test if obj is a method.
+ return _function_contents(obj.__func__)
+
+ except AttributeError:
+ try:
+ # Test if obj is a callable object.
+ return _function_contents(obj.__call__.__func__)
+
+ except AttributeError:
+ try:
+ # Test if obj is a code object.
+ return _code_contents(obj)
+
+ except AttributeError:
+ try:
+ # Test if obj is a function object.
+ return _function_contents(obj)
+
+ except AttributeError as ae:
+ # Should be a pickle-able Python object.
+ try:
+ return _object_instance_content(obj)
+ # pickling an Action instance or object doesn't yield a stable
+ # content as instance property may be dumped in different orders
+ # return pickle.dumps(obj, ACTION_SIGNATURE_PICKLE_PROTOCOL)
+ except (pickle.PicklingError, TypeError, AttributeError) as ex:
+ # This is weird, but it seems that nested classes
+ # are unpickable. The Python docs say it should
+ # always be a PicklingError, but some Python
+ # versions seem to return TypeError. Just do
+ # the best we can.
+ return bytearray(repr(obj), 'utf-8')
+
+
+def _code_contents(code, docstring=None):
+ """Return the signature contents of a code object.
+
+ By providing direct access to the code object of the
+ function, Python makes this extremely easy. Hooray!
+
+ Unfortunately, older versions of Python include line
+ number indications in the compiled byte code. Boo!
+ So we remove the line number byte codes to prevent
+ recompilations from moving a Python function.
+
+ See:
+ - https://docs.python.org/2/library/inspect.html
+ - http://python-reference.readthedocs.io/en/latest/docs/code/index.html
+
+ For info on what each co\_ variable provides
+
+ The signature is as follows (should be byte/chars):
+ co_argcount, len(co_varnames), len(co_cellvars), len(co_freevars),
+ ( comma separated signature for each object in co_consts ),
+ ( comma separated signature for each object in co_names ),
+ ( The bytecode with line number bytecodes removed from co_code )
+
+ co_argcount - Returns the number of positional arguments (including arguments with default values).
+ co_varnames - Returns a tuple containing the names of the local variables (starting with the argument names).
+ co_cellvars - Returns a tuple containing the names of local variables that are referenced by nested functions.
+ co_freevars - Returns a tuple containing the names of free variables. (?)
+ co_consts - Returns a tuple containing the literals used by the bytecode.
+ co_names - Returns a tuple containing the names used by the bytecode.
+ co_code - Returns a string representing the sequence of bytecode instructions.
+
+ """
+
+ # contents = []
+
+ # The code contents depends on the number of local variables
+ # but not their actual names.
+ contents = bytearray("{}, {}".format(code.co_argcount, len(code.co_varnames)), 'utf-8')
+
+ contents.extend(b", ")
+ contents.extend(bytearray(str(len(code.co_cellvars)), 'utf-8'))
+ contents.extend(b", ")
+ contents.extend(bytearray(str(len(code.co_freevars)), 'utf-8'))
+
+ # The code contents depends on any constants accessed by the
+ # function. Note that we have to call _object_contents on each
+ # constants because the code object of nested functions can
+ # show-up among the constants.
+
+ z = [_object_contents(cc) for cc in code.co_consts[1:]]
+ contents.extend(b',(')
+ contents.extend(bytearray(',', 'utf-8').join(z))
+ contents.extend(b')')
+
+ # The code contents depends on the variable names used to
+ # accessed global variable, as changing the variable name changes
+ # the variable actually accessed and therefore changes the
+ # function result.
+ z= [bytearray(_object_contents(cc)) for cc in code.co_names]
+ contents.extend(b',(')
+ contents.extend(bytearray(',','utf-8').join(z))
+ contents.extend(b')')
+
+ # The code contents depends on its actual code!!!
+ contents.extend(b',(')
+ contents.extend(code.co_code)
+ contents.extend(b')')
+
+ return contents
+
+
+def _function_contents(func):
+ """
+ The signature is as follows (should be byte/chars):
+ < _code_contents (see above) from func.__code__ >
+ ,( comma separated _object_contents for function argument defaults)
+ ,( comma separated _object_contents for any closure contents )
+
+
+ See also: https://docs.python.org/3/reference/datamodel.html
+ - func.__code__ - The code object representing the compiled function body.
+ - func.__defaults__ - A tuple containing default argument values for those arguments that have defaults, or None if no arguments have a default value
+ - func.__closure__ - None or a tuple of cells that contain bindings for the function's free variables.
+
+ :Returns:
+ Signature contents of a function. (in bytes)
+ """
+
+ contents = [_code_contents(func.__code__, func.__doc__)]
+
+ # The function contents depends on the value of defaults arguments
+ if func.__defaults__:
+
+ function_defaults_contents = [_object_contents(cc) for cc in func.__defaults__]
+
+ defaults = bytearray(b',(')
+ defaults.extend(bytearray(b',').join(function_defaults_contents))
+ defaults.extend(b')')
+
+ contents.append(defaults)
+ else:
+ contents.append(b',()')
+
+ # The function contents depends on the closure captured cell values.
+ closure = func.__closure__ or []
+
+ try:
+ closure_contents = [_object_contents(x.cell_contents) for x in closure]
+ except AttributeError:
+ closure_contents = []
+
+ contents.append(b',(')
+ contents.append(bytearray(b',').join(closure_contents))
+ contents.append(b')')
+
+ retval = bytearray(b'').join(contents)
+ return retval
+
+
+def _object_instance_content(obj):
+ """
+ Returns consistant content for a action class or an instance thereof
+
+ :Parameters:
+ - `obj` Should be either and action class or an instance thereof
+
+ :Returns:
+ bytearray or bytes representing the obj suitable for generating a signature from.
+ """
+ retval = bytearray()
+
+ if obj is None:
+ return b'N.'
+
+ if isinstance(obj, SCons.Util.BaseStringTypes):
+ return SCons.Util.to_bytes(obj)
+
+ inst_class = obj.__class__
+ inst_class_name = bytearray(obj.__class__.__name__,'utf-8')
+ inst_class_module = bytearray(obj.__class__.__module__,'utf-8')
+ inst_class_hierarchy = bytearray(repr(inspect.getclasstree([obj.__class__,])),'utf-8')
+ # print("ICH:%s : %s"%(inst_class_hierarchy, repr(obj)))
+
+ properties = [(p, getattr(obj, p, "None")) for p in dir(obj) if not (p[:2] == '__' or inspect.ismethod(getattr(obj, p)) or inspect.isbuiltin(getattr(obj,p))) ]
+ properties.sort()
+ properties_str = ','.join(["%s=%s"%(p[0],p[1]) for p in properties])
+ properties_bytes = bytearray(properties_str,'utf-8')
+
+ methods = [p for p in dir(obj) if inspect.ismethod(getattr(obj, p))]
+ methods.sort()
+
+ method_contents = []
+ for m in methods:
+ # print("Method:%s"%m)
+ v = _function_contents(getattr(obj, m))
+ # print("[%s->]V:%s [%s]"%(m,v,type(v)))
+ method_contents.append(v)
+
+ retval = bytearray(b'{')
+ retval.extend(inst_class_name)
+ retval.extend(b":")
+ retval.extend(inst_class_module)
+ retval.extend(b'}[[')
+ retval.extend(inst_class_hierarchy)
+ retval.extend(b']]{{')
+ retval.extend(bytearray(b",").join(method_contents))
+ retval.extend(b"}}{{{")
+ retval.extend(properties_bytes)
+ retval.extend(b'}}}')
+ return retval
+
+ # print("class :%s"%inst_class)
+ # print("class_name :%s"%inst_class_name)
+ # print("class_module :%s"%inst_class_module)
+ # print("Class hier :\n%s"%pp.pformat(inst_class_hierarchy))
+ # print("Inst Properties:\n%s"%pp.pformat(properties))
+ # print("Inst Methods :\n%s"%pp.pformat(methods))
+
+def _actionAppend(act1, act2):
+ # This function knows how to slap two actions together.
+ # Mainly, it handles ListActions by concatenating into
+ # a single ListAction.
+ a1 = Action(act1)
+ a2 = Action(act2)
+ if a1 is None:
+ return a2
+ if a2 is None:
+ return a1
+ if isinstance(a1, ListAction):
+ if isinstance(a2, ListAction):
+ return ListAction(a1.list + a2.list)
+ else:
+ return ListAction(a1.list + [ a2 ])
+ else:
+ if isinstance(a2, ListAction):
+ return ListAction([ a1 ] + a2.list)
+ else:
+ return ListAction([ a1, a2 ])
+
+
+def _do_create_keywords(args, kw):
+ """This converts any arguments after the action argument into
+ their equivalent keywords and adds them to the kw argument.
+ """
+ v = kw.get('varlist', ())
+ # prevent varlist="FOO" from being interpreted as ['F', 'O', 'O']
+ if is_String(v): v = (v,)
+ kw['varlist'] = tuple(v)
+ if args:
+ # turn positional args into equivalent keywords
+ cmdstrfunc = args[0]
+ if cmdstrfunc is None or is_String(cmdstrfunc):
+ kw['cmdstr'] = cmdstrfunc
+ elif callable(cmdstrfunc):
+ kw['strfunction'] = cmdstrfunc
+ else:
+ raise SCons.Errors.UserError(
+ 'Invalid command display variable type. '
+ 'You must either pass a string or a callback which '
+ 'accepts (target, source, env) as parameters.')
+ if len(args) > 1:
+ kw['varlist'] = tuple(SCons.Util.flatten(args[1:])) + kw['varlist']
+ if kw.get('strfunction', _null) is not _null \
+ and kw.get('cmdstr', _null) is not _null:
+ raise SCons.Errors.UserError(
+ 'Cannot have both strfunction and cmdstr args to Action()')
+
+
+def _do_create_action(act, kw):
+ """This is the actual "implementation" for the
+ Action factory method, below. This handles the
+ fact that passing lists to Action() itself has
+ different semantics than passing lists as elements
+ of lists.
+
+ The former will create a ListAction, the latter
+ will create a CommandAction by converting the inner
+ list elements to strings."""
+
+ if isinstance(act, ActionBase):
+ return act
+
+ if is_String(act):
+ var=SCons.Util.get_environment_var(act)
+ if var:
+ # This looks like a string that is purely an Environment
+ # variable reference, like "$FOO" or "${FOO}". We do
+ # something special here...we lazily evaluate the contents
+ # of that Environment variable, so a user could put something
+ # like a function or a CommandGenerator in that variable
+ # instead of a string.
+ return LazyAction(var, kw)
+ commands = str(act).split('\n')
+ if len(commands) == 1:
+ return CommandAction(commands[0], **kw)
+ # The list of string commands may include a LazyAction, so we
+ # reprocess them via _do_create_list_action.
+ return _do_create_list_action(commands, kw)
+
+ if is_List(act):
+ return CommandAction(act, **kw)
+
+ if callable(act):
+ try:
+ gen = kw['generator']
+ del kw['generator']
+ except KeyError:
+ gen = 0
+ if gen:
+ action_type = CommandGeneratorAction
+ else:
+ action_type = FunctionAction
+ return action_type(act, kw)
+
+ # Catch a common error case with a nice message:
+ if isinstance(act, int) or isinstance(act, float):
+ raise TypeError("Don't know how to create an Action from a number (%s)"%act)
+ # Else fail silently (???)
+ return None
+
+
+def _do_create_list_action(act, kw):
+ """A factory for list actions. Convert the input list into Actions
+ and then wrap them in a ListAction."""
+ acts = []
+ for a in act:
+ aa = _do_create_action(a, kw)
+ if aa is not None: acts.append(aa)
+ if not acts:
+ return ListAction([])
+ elif len(acts) == 1:
+ return acts[0]
+ else:
+ return ListAction(acts)
+
+
+def Action(act, *args, **kw):
+ """A factory for action objects."""
+ # Really simple: the _do_create_* routines do the heavy lifting.
+ _do_create_keywords(args, kw)
+ if is_List(act):
+ return _do_create_list_action(act, kw)
+ return _do_create_action(act, kw)
+
+
+class ActionBase(object):
+ """Base class for all types of action objects that can be held by
+ other objects (Builders, Executors, etc.) This provides the
+ common methods for manipulating and combining those actions."""
+
+ def __eq__(self, other):
+ return self.__dict__ == other
+
+ def no_batch_key(self, env, target, source):
+ return None
+
+ batch_key = no_batch_key
+
+ def genstring(self, target, source, env):
+ return str(self)
+
+ def get_contents(self, target, source, env):
+ result = self.get_presig(target, source, env)
+
+ if not isinstance(result,(bytes, bytearray)):
+ result = bytearray("",'utf-8').join([ SCons.Util.to_bytes(r) for r in result ])
+ else:
+ # Make a copy and put in bytearray, without this the contents returned by get_presig
+ # can be changed by the logic below, appending with each call and causing very
+ # hard to track down issues...
+ result = bytearray(result)
+
+ # At this point everything should be a bytearray
+
+ # This should never happen, as the Action() factory should wrap
+ # the varlist, but just in case an action is created directly,
+ # we duplicate this check here.
+ vl = self.get_varlist(target, source, env)
+ if is_String(vl): vl = (vl,)
+ for v in vl:
+ # do the subst this way to ignore $(...$) parts:
+ if isinstance(result, bytearray):
+ result.extend(SCons.Util.to_bytes(env.subst_target_source('${'+v+'}', SCons.Subst.SUBST_SIG, target, source)))
+ else:
+ raise Exception("WE SHOULD NEVER GET HERE result should be bytearray not:%s"%type(result))
+ # result.append(SCons.Util.to_bytes(env.subst_target_source('${'+v+'}', SCons.Subst.SUBST_SIG, target, source)))
+
+
+ if isinstance(result, (bytes,bytearray)):
+ return result
+ else:
+ raise Exception("WE SHOULD NEVER GET HERE - #2 result should be bytearray not:%s" % type(result))
+ # return b''.join(result)
+
+ def __add__(self, other):
+ return _actionAppend(self, other)
+
+ def __radd__(self, other):
+ return _actionAppend(other, self)
+
+ def presub_lines(self, env):
+ # CommandGeneratorAction needs a real environment
+ # in order to return the proper string here, since
+ # it may call LazyAction, which looks up a key
+ # in that env. So we temporarily remember the env here,
+ # and CommandGeneratorAction will use this env
+ # when it calls its _generate method.
+ self.presub_env = env
+ lines = str(self).split('\n')
+ self.presub_env = None # don't need this any more
+ return lines
+
+ def get_varlist(self, target, source, env, executor=None):
+ return self.varlist
+
+ def get_targets(self, env, executor):
+ """
+ Returns the type of targets ($TARGETS, $CHANGED_TARGETS) used
+ by this action.
+ """
+ return self.targets
+
+
+class _ActionAction(ActionBase):
+ """Base class for actions that create output objects."""
+ def __init__(self, cmdstr=_null, strfunction=_null, varlist=(),
+ presub=_null, chdir=None, exitstatfunc=None,
+ batch_key=None, targets='$TARGETS',
+ **kw):
+ self.cmdstr = cmdstr
+ if strfunction is not _null:
+ if strfunction is None:
+ self.cmdstr = None
+ else:
+ self.strfunction = strfunction
+ self.varlist = varlist
+ self.presub = presub
+ self.chdir = chdir
+ if not exitstatfunc:
+ exitstatfunc = default_exitstatfunc
+ self.exitstatfunc = exitstatfunc
+
+ self.targets = targets
+
+ if batch_key:
+ if not callable(batch_key):
+ # They have set batch_key, but not to their own
+ # callable. The default behavior here will batch
+ # *all* targets+sources using this action, separated
+ # for each construction environment.
+ def default_batch_key(self, env, target, source):
+ return (id(self), id(env))
+ batch_key = default_batch_key
+ SCons.Util.AddMethod(self, batch_key, 'batch_key')
+
+ def print_cmd_line(self, s, target, source, env):
+ """
+ In python 3, and in some of our tests, sys.stdout is
+ a String io object, and it takes unicode strings only
+ In other cases it's a regular Python 2.x file object
+ which takes strings (bytes), and if you pass those a
+ unicode object they try to decode with 'ascii' codec
+ which fails if the cmd line has any hi-bit-set chars.
+ This code assumes s is a regular string, but should
+ work if it's unicode too.
+ """
+ try:
+ sys.stdout.write(s + u"\n")
+ except UnicodeDecodeError:
+ sys.stdout.write(s + "\n")
+
+ def __call__(self, target, source, env,
+ exitstatfunc=_null,
+ presub=_null,
+ show=_null,
+ execute=_null,
+ chdir=_null,
+ executor=None):
+ if not is_List(target):
+ target = [target]
+ if not is_List(source):
+ source = [source]
+
+ if presub is _null:
+ presub = self.presub
+ if presub is _null:
+ presub = print_actions_presub
+ if exitstatfunc is _null: exitstatfunc = self.exitstatfunc
+ if show is _null: show = print_actions
+ if execute is _null: execute = execute_actions
+ if chdir is _null: chdir = self.chdir
+ save_cwd = None
+ if chdir:
+ save_cwd = os.getcwd()
+ try:
+ chdir = str(chdir.get_abspath())
+ except AttributeError:
+ if not is_String(chdir):
+ if executor:
+ chdir = str(executor.batches[0].targets[0].dir)
+ else:
+ chdir = str(target[0].dir)
+ if presub:
+ if executor:
+ target = executor.get_all_targets()
+ source = executor.get_all_sources()
+ t = ' and '.join(map(str, target))
+ l = '\n '.join(self.presub_lines(env))
+ out = u"Building %s with action:\n %s\n" % (t, l)
+ sys.stdout.write(out)
+ cmd = None
+ if show and self.strfunction:
+ if executor:
+ target = executor.get_all_targets()
+ source = executor.get_all_sources()
+ try:
+ cmd = self.strfunction(target, source, env, executor)
+ except TypeError:
+ cmd = self.strfunction(target, source, env)
+ if cmd:
+ if chdir:
+ cmd = ('os.chdir(%s)\n' % repr(chdir)) + cmd
+ try:
+ get = env.get
+ except AttributeError:
+ print_func = self.print_cmd_line
+ else:
+ print_func = get('PRINT_CMD_LINE_FUNC')
+ if not print_func:
+ print_func = self.print_cmd_line
+ print_func(cmd, target, source, env)
+ stat = 0
+ if execute:
+ if chdir:
+ os.chdir(chdir)
+ try:
+ stat = self.execute(target, source, env, executor=executor)
+ if isinstance(stat, SCons.Errors.BuildError):
+ s = exitstatfunc(stat.status)
+ if s:
+ stat.status = s
+ else:
+ stat = s
+ else:
+ stat = exitstatfunc(stat)
+ finally:
+ if save_cwd:
+ os.chdir(save_cwd)
+ if cmd and save_cwd:
+ print_func('os.chdir(%s)' % repr(save_cwd), target, source, env)
+
+ return stat
+
+
+def _string_from_cmd_list(cmd_list):
+ """Takes a list of command line arguments and returns a pretty
+ representation for printing."""
+ cl = []
+ for arg in map(str, cmd_list):
+ if ' ' in arg or '\t' in arg:
+ arg = '"' + arg + '"'
+ cl.append(arg)
+ return ' '.join(cl)
+
+default_ENV = None
+
+
+def get_default_ENV(env):
+ """
+ A fiddlin' little function that has an 'import SCons.Environment' which
+ can't be moved to the top level without creating an import loop. Since
+ this import creates a local variable named 'SCons', it blocks access to
+ the global variable, so we move it here to prevent complaints about local
+ variables being used uninitialized.
+ """
+ global default_ENV
+ try:
+ return env['ENV']
+ except KeyError:
+ if not default_ENV:
+ import SCons.Environment
+ # This is a hideously expensive way to get a default shell
+ # environment. What it really should do is run the platform
+ # setup to get the default ENV. Fortunately, it's incredibly
+ # rare for an Environment not to have a shell environment, so
+ # we're not going to worry about it overmuch.
+ default_ENV = SCons.Environment.Environment()['ENV']
+ return default_ENV
+
+
+def _subproc(scons_env, cmd, error = 'ignore', **kw):
+ """Do common setup for a subprocess.Popen() call
+
+ This function is still in draft mode. We're going to need something like
+ it in the long run as more and more places use subprocess, but I'm sure
+ it'll have to be tweaked to get the full desired functionality.
+ one special arg (so far?), 'error', to tell what to do with exceptions.
+ """
+ # allow std{in,out,err} to be "'devnull'"
+ io = kw.get('stdin')
+ if is_String(io) and io == 'devnull':
+ kw['stdin'] = open(os.devnull)
+ io = kw.get('stdout')
+ if is_String(io) and io == 'devnull':
+ kw['stdout'] = open(os.devnull, 'w')
+ io = kw.get('stderr')
+ if is_String(io) and io == 'devnull':
+ kw['stderr'] = open(os.devnull, 'w')
+
+ # Figure out what shell environment to use
+ ENV = kw.get('env', None)
+ if ENV is None: ENV = get_default_ENV(scons_env)
+
+ # Ensure that the ENV values are all strings:
+ new_env = {}
+ for key, value in ENV.items():
+ if is_List(value):
+ # If the value is a list, then we assume it is a path list,
+ # because that's a pretty common list-like value to stick
+ # in an environment variable:
+ value = SCons.Util.flatten_sequence(value)
+ new_env[key] = os.pathsep.join(map(str, value))
+ else:
+ # It's either a string or something else. If it's a string,
+ # we still want to call str() because it might be a *Unicode*
+ # string, which makes subprocess.Popen() gag. If it isn't a
+ # string or a list, then we just coerce it to a string, which
+ # is the proper way to handle Dir and File instances and will
+ # produce something reasonable for just about everything else:
+ new_env[key] = str(value)
+ kw['env'] = new_env
+
+ try:
+ return subprocess.Popen(cmd, **kw)
+ except EnvironmentError as e:
+ if error == 'raise': raise
+ # return a dummy Popen instance that only returns error
+ class dummyPopen(object):
+ def __init__(self, e): self.exception = e
+ def communicate(self, input=None): return ('', '')
+ def wait(self): return -self.exception.errno
+ stdin = None
+ class f(object):
+ def read(self): return ''
+ def readline(self): return ''
+ def __iter__(self): return iter(())
+ stdout = stderr = f()
+ return dummyPopen(e)
+
+
+class CommandAction(_ActionAction):
+ """Class for command-execution actions."""
+ def __init__(self, cmd, **kw):
+ # Cmd can actually be a list or a single item; if it's a
+ # single item it should be the command string to execute; if a
+ # list then it should be the words of the command string to
+ # execute. Only a single command should be executed by this
+ # object; lists of commands should be handled by embedding
+ # these objects in a ListAction object (which the Action()
+ # factory above does). cmd will be passed to
+ # Environment.subst_list() for substituting environment
+ # variables.
+ if SCons.Debug.track_instances: logInstanceCreation(self, 'Action.CommandAction')
+
+ _ActionAction.__init__(self, **kw)
+ if is_List(cmd):
+ if [c for c in cmd if is_List(c)]:
+ raise TypeError("CommandAction should be given only " \
+ "a single command")
+ self.cmd_list = cmd
+
+ def __str__(self):
+ if is_List(self.cmd_list):
+ return ' '.join(map(str, self.cmd_list))
+ return str(self.cmd_list)
+
+ def process(self, target, source, env, executor=None):
+ if executor:
+ result = env.subst_list(self.cmd_list, 0, executor=executor)
+ else:
+ result = env.subst_list(self.cmd_list, 0, target, source)
+ silent = None
+ ignore = None
+ while True:
+ try: c = result[0][0][0]
+ except IndexError: c = None
+ if c == '@': silent = 1
+ elif c == '-': ignore = 1
+ else: break
+ result[0][0] = result[0][0][1:]
+ try:
+ if not result[0][0]:
+ result[0] = result[0][1:]
+ except IndexError:
+ pass
+ return result, ignore, silent
+
+ def strfunction(self, target, source, env, executor=None):
+ if self.cmdstr is None:
+ return None
+ if self.cmdstr is not _null:
+ from SCons.Subst import SUBST_RAW
+ if executor:
+ c = env.subst(self.cmdstr, SUBST_RAW, executor=executor)
+ else:
+ c = env.subst(self.cmdstr, SUBST_RAW, target, source)
+ if c:
+ return c
+ cmd_list, ignore, silent = self.process(target, source, env, executor)
+ if silent:
+ return ''
+ return _string_from_cmd_list(cmd_list[0])
+
+ def execute(self, target, source, env, executor=None):
+ """Execute a command action.
+
+ This will handle lists of commands as well as individual commands,
+ because construction variable substitution may turn a single
+ "command" into a list. This means that this class can actually
+ handle lists of commands, even though that's not how we use it
+ externally.
+ """
+ escape_list = SCons.Subst.escape_list
+ flatten_sequence = SCons.Util.flatten_sequence
+
+ try:
+ shell = env['SHELL']
+ except KeyError:
+ raise SCons.Errors.UserError('Missing SHELL construction variable.')
+
+ try:
+ spawn = env['SPAWN']
+ except KeyError:
+ raise SCons.Errors.UserError('Missing SPAWN construction variable.')
+ else:
+ if is_String(spawn):
+ spawn = env.subst(spawn, raw=1, conv=lambda x: x)
+
+ escape = env.get('ESCAPE', lambda x: x)
+
+ ENV = get_default_ENV(env)
+
+ # Ensure that the ENV values are all strings:
+ for key, value in ENV.items():
+ if not is_String(value):
+ if is_List(value):
+ # If the value is a list, then we assume it is a
+ # path list, because that's a pretty common list-like
+ # value to stick in an environment variable:
+ value = flatten_sequence(value)
+ ENV[key] = os.pathsep.join(map(str, value))
+ else:
+ # If it isn't a string or a list, then we just coerce
+ # it to a string, which is the proper way to handle
+ # Dir and File instances and will produce something
+ # reasonable for just about everything else:
+ ENV[key] = str(value)
+
+ if executor:
+ target = executor.get_all_targets()
+ source = executor.get_all_sources()
+ cmd_list, ignore, silent = self.process(target, list(map(rfile, source)), env, executor)
+
+ # Use len() to filter out any "command" that's zero-length.
+ for cmd_line in filter(len, cmd_list):
+ # Escape the command line for the interpreter we are using.
+ cmd_line = escape_list(cmd_line, escape)
+ result = spawn(shell, escape, cmd_line[0], cmd_line, ENV)
+ if not ignore and result:
+ msg = "Error %s" % result
+ return SCons.Errors.BuildError(errstr=msg,
+ status=result,
+ action=self,
+ command=cmd_line)
+ return 0
+
+ def get_presig(self, target, source, env, executor=None):
+ """Return the signature contents of this action's command line.
+
+ This strips $(-$) and everything in between the string,
+ since those parts don't affect signatures.
+ """
+ from SCons.Subst import SUBST_SIG
+ cmd = self.cmd_list
+ if is_List(cmd):
+ cmd = ' '.join(map(str, cmd))
+ else:
+ cmd = str(cmd)
+ if executor:
+ return env.subst_target_source(cmd, SUBST_SIG, executor=executor)
+ else:
+ return env.subst_target_source(cmd, SUBST_SIG, target, source)
+
+ def get_implicit_deps(self, target, source, env, executor=None):
+ icd = env.get('IMPLICIT_COMMAND_DEPENDENCIES', True)
+ if is_String(icd) and icd[:1] == '$':
+ icd = env.subst(icd)
+ if not icd or icd in ('0', 'None'):
+ return []
+ from SCons.Subst import SUBST_SIG
+ if executor:
+ cmd_list = env.subst_list(self.cmd_list, SUBST_SIG, executor=executor)
+ else:
+ cmd_list = env.subst_list(self.cmd_list, SUBST_SIG, target, source)
+ res = []
+ for cmd_line in cmd_list:
+ if cmd_line:
+ d = str(cmd_line[0])
+ m = strip_quotes.match(d)
+ if m:
+ d = m.group(1)
+ d = env.WhereIs(d)
+ if d:
+ res.append(env.fs.File(d))
+ return res
+
+
+class CommandGeneratorAction(ActionBase):
+ """Class for command-generator actions."""
+ def __init__(self, generator, kw):
+ if SCons.Debug.track_instances: logInstanceCreation(self, 'Action.CommandGeneratorAction')
+ self.generator = generator
+ self.gen_kw = kw
+ self.varlist = kw.get('varlist', ())
+ self.targets = kw.get('targets', '$TARGETS')
+
+ def _generate(self, target, source, env, for_signature, executor=None):
+ # ensure that target is a list, to make it easier to write
+ # generator functions:
+ if not is_List(target):
+ target = [target]
+
+ if executor:
+ target = executor.get_all_targets()
+ source = executor.get_all_sources()
+ ret = self.generator(target=target,
+ source=source,
+ env=env,
+ for_signature=for_signature)
+ gen_cmd = Action(ret, **self.gen_kw)
+ if not gen_cmd:
+ raise SCons.Errors.UserError("Object returned from command generator: %s cannot be used to create an Action." % repr(ret))
+ return gen_cmd
+
+ def __str__(self):
+ try:
+ env = self.presub_env
+ except AttributeError:
+ env = None
+ if env is None:
+ env = SCons.Defaults.DefaultEnvironment()
+ act = self._generate([], [], env, 1)
+ return str(act)
+
+ def batch_key(self, env, target, source):
+ return self._generate(target, source, env, 1).batch_key(env, target, source)
+
+ def genstring(self, target, source, env, executor=None):
+ return self._generate(target, source, env, 1, executor).genstring(target, source, env)
+
+ def __call__(self, target, source, env, exitstatfunc=_null, presub=_null,
+ show=_null, execute=_null, chdir=_null, executor=None):
+ act = self._generate(target, source, env, 0, executor)
+ if act is None:
+ raise SCons.Errors.UserError("While building `%s': "
+ "Cannot deduce file extension from source files: %s"
+ % (repr(list(map(str, target))), repr(list(map(str, source)))))
+ return act(target, source, env, exitstatfunc, presub,
+ show, execute, chdir, executor)
+
+ def get_presig(self, target, source, env, executor=None):
+ """Return the signature contents of this action's command line.
+
+ This strips $(-$) and everything in between the string,
+ since those parts don't affect signatures.
+ """
+ return self._generate(target, source, env, 1, executor).get_presig(target, source, env)
+
+ def get_implicit_deps(self, target, source, env, executor=None):
+ return self._generate(target, source, env, 1, executor).get_implicit_deps(target, source, env)
+
+ def get_varlist(self, target, source, env, executor=None):
+ return self._generate(target, source, env, 1, executor).get_varlist(target, source, env, executor)
+
+ def get_targets(self, env, executor):
+ return self._generate(None, None, env, 1, executor).get_targets(env, executor)
+
+
+class LazyAction(CommandGeneratorAction, CommandAction):
+ """
+ A LazyAction is a kind of hybrid generator and command action for
+ strings of the form "$VAR". These strings normally expand to other
+ strings (think "$CCCOM" to "$CC -c -o $TARGET $SOURCE"), but we also
+ want to be able to replace them with functions in the construction
+ environment. Consequently, we want lazy evaluation and creation of
+ an Action in the case of the function, but that's overkill in the more
+ normal case of expansion to other strings.
+
+ So we do this with a subclass that's both a generator *and*
+ a command action. The overridden methods all do a quick check
+ of the construction variable, and if it's a string we just call
+ the corresponding CommandAction method to do the heavy lifting.
+ If not, then we call the same-named CommandGeneratorAction method.
+ The CommandGeneratorAction methods work by using the overridden
+ _generate() method, that is, our own way of handling "generation" of
+ an action based on what's in the construction variable.
+ """
+
+ def __init__(self, var, kw):
+ if SCons.Debug.track_instances: logInstanceCreation(self, 'Action.LazyAction')
+ CommandAction.__init__(self, '${'+var+'}', **kw)
+ self.var = SCons.Util.to_String(var)
+ self.gen_kw = kw
+
+ def get_parent_class(self, env):
+ c = env.get(self.var)
+ if is_String(c) and not '\n' in c:
+ return CommandAction
+ return CommandGeneratorAction
+
+ def _generate_cache(self, env):
+ if env:
+ c = env.get(self.var, '')
+ else:
+ c = ''
+ gen_cmd = Action(c, **self.gen_kw)
+ if not gen_cmd:
+ raise SCons.Errors.UserError("$%s value %s cannot be used to create an Action." % (self.var, repr(c)))
+ return gen_cmd
+
+ def _generate(self, target, source, env, for_signature, executor=None):
+ return self._generate_cache(env)
+
+ def __call__(self, target, source, env, *args, **kw):
+ c = self.get_parent_class(env)
+ return c.__call__(self, target, source, env, *args, **kw)
+
+ def get_presig(self, target, source, env):
+ c = self.get_parent_class(env)
+ return c.get_presig(self, target, source, env)
+
+ def get_varlist(self, target, source, env, executor=None):
+ c = self.get_parent_class(env)
+ return c.get_varlist(self, target, source, env, executor)
+
+
+class FunctionAction(_ActionAction):
+ """Class for Python function actions."""
+
+ def __init__(self, execfunction, kw):
+ if SCons.Debug.track_instances: logInstanceCreation(self, 'Action.FunctionAction')
+
+ self.execfunction = execfunction
+ try:
+ self.funccontents = _callable_contents(execfunction)
+ except AttributeError:
+ try:
+ # See if execfunction will do the heavy lifting for us.
+ self.gc = execfunction.get_contents
+ except AttributeError:
+ # This is weird, just do the best we can.
+ self.funccontents = _object_contents(execfunction)
+
+ _ActionAction.__init__(self, **kw)
+
+ def function_name(self):
+ try:
+ return self.execfunction.__name__
+ except AttributeError:
+ try:
+ return self.execfunction.__class__.__name__
+ except AttributeError:
+ return "unknown_python_function"
+
+ def strfunction(self, target, source, env, executor=None):
+ if self.cmdstr is None:
+ return None
+ if self.cmdstr is not _null:
+ from SCons.Subst import SUBST_RAW
+ if executor:
+ c = env.subst(self.cmdstr, SUBST_RAW, executor=executor)
+ else:
+ c = env.subst(self.cmdstr, SUBST_RAW, target, source)
+ if c:
+ return c
+
+ def array(a):
+ def quote(s):
+ try:
+ str_for_display = s.str_for_display
+ except AttributeError:
+ s = repr(s)
+ else:
+ s = str_for_display()
+ return s
+ return '[' + ", ".join(map(quote, a)) + ']'
+ try:
+ strfunc = self.execfunction.strfunction
+ except AttributeError:
+ pass
+ else:
+ if strfunc is None:
+ return None
+ if callable(strfunc):
+ return strfunc(target, source, env)
+ name = self.function_name()
+ tstr = array(target)
+ sstr = array(source)
+ return "%s(%s, %s)" % (name, tstr, sstr)
+
+ def __str__(self):
+ name = self.function_name()
+ if name == 'ActionCaller':
+ return str(self.execfunction)
+ return "%s(target, source, env)" % name
+
+ def execute(self, target, source, env, executor=None):
+ exc_info = (None,None,None)
+ try:
+ if executor:
+ target = executor.get_all_targets()
+ source = executor.get_all_sources()
+ rsources = list(map(rfile, source))
+ try:
+ result = self.execfunction(target=target, source=rsources, env=env)
+ except KeyboardInterrupt as e:
+ raise
+ except SystemExit as e:
+ raise
+ except Exception as e:
+ result = e
+ exc_info = sys.exc_info()
+
+ if result:
+ result = SCons.Errors.convert_to_BuildError(result, exc_info)
+ result.node=target
+ result.action=self
+ try:
+ result.command=self.strfunction(target, source, env, executor)
+ except TypeError:
+ result.command=self.strfunction(target, source, env)
+
+ # FIXME: This maintains backward compatibility with respect to
+ # which type of exceptions were returned by raising an
+ # exception and which ones were returned by value. It would
+ # probably be best to always return them by value here, but
+ # some codes do not check the return value of Actions and I do
+ # not have the time to modify them at this point.
+ if (exc_info[1] and
+ not isinstance(exc_info[1],EnvironmentError)):
+ raise result
+
+ return result
+ finally:
+ # Break the cycle between the traceback object and this
+ # function stack frame. See the sys.exc_info() doc info for
+ # more information about this issue.
+ del exc_info
+
+ def get_presig(self, target, source, env):
+ """Return the signature contents of this callable action."""
+ try:
+ return self.gc(target, source, env)
+ except AttributeError:
+ return self.funccontents
+
+ def get_implicit_deps(self, target, source, env):
+ return []
+
+class ListAction(ActionBase):
+ """Class for lists of other actions."""
+ def __init__(self, actionlist):
+ if SCons.Debug.track_instances: logInstanceCreation(self, 'Action.ListAction')
+ def list_of_actions(x):
+ if isinstance(x, ActionBase):
+ return x
+ return Action(x)
+ self.list = list(map(list_of_actions, actionlist))
+ # our children will have had any varlist
+ # applied; we don't need to do it again
+ self.varlist = ()
+ self.targets = '$TARGETS'
+
+ def genstring(self, target, source, env):
+ return '\n'.join([a.genstring(target, source, env) for a in self.list])
+
+ def __str__(self):
+ return '\n'.join(map(str, self.list))
+
+ def presub_lines(self, env):
+ return SCons.Util.flatten_sequence(
+ [a.presub_lines(env) for a in self.list])
+
+ def get_presig(self, target, source, env):
+ """Return the signature contents of this action list.
+
+ Simple concatenation of the signatures of the elements.
+ """
+ return b"".join([bytes(x.get_contents(target, source, env)) for x in self.list])
+
+ def __call__(self, target, source, env, exitstatfunc=_null, presub=_null,
+ show=_null, execute=_null, chdir=_null, executor=None):
+ if executor:
+ target = executor.get_all_targets()
+ source = executor.get_all_sources()
+ for act in self.list:
+ stat = act(target, source, env, exitstatfunc, presub,
+ show, execute, chdir, executor)
+ if stat:
+ return stat
+ return 0
+
+ def get_implicit_deps(self, target, source, env):
+ result = []
+ for act in self.list:
+ result.extend(act.get_implicit_deps(target, source, env))
+ return result
+
+ def get_varlist(self, target, source, env, executor=None):
+ result = SCons.Util.OrderedDict()
+ for act in self.list:
+ for var in act.get_varlist(target, source, env, executor):
+ result[var] = True
+ return list(result.keys())
+
+
+class ActionCaller(object):
+ """A class for delaying calling an Action function with specific
+ (positional and keyword) arguments until the Action is actually
+ executed.
+
+ This class looks to the rest of the world like a normal Action object,
+ but what it's really doing is hanging on to the arguments until we
+ have a target, source and env to use for the expansion.
+ """
+ def __init__(self, parent, args, kw):
+ self.parent = parent
+ self.args = args
+ self.kw = kw
+
+ def get_contents(self, target, source, env):
+ actfunc = self.parent.actfunc
+ try:
+ # "self.actfunc" is a function.
+ contents = actfunc.__code__.co_code
+ except AttributeError:
+ # "self.actfunc" is a callable object.
+ try:
+ contents = actfunc.__call__.__func__.__code__.co_code
+ except AttributeError:
+ # No __call__() method, so it might be a builtin
+ # or something like that. Do the best we can.
+ contents = repr(actfunc)
+
+ return contents
+
+ def subst(self, s, target, source, env):
+ # If s is a list, recursively apply subst()
+ # to every element in the list
+ if is_List(s):
+ result = []
+ for elem in s:
+ result.append(self.subst(elem, target, source, env))
+ return self.parent.convert(result)
+
+ # Special-case hack: Let a custom function wrapped in an
+ # ActionCaller get at the environment through which the action
+ # was called by using this hard-coded value as a special return.
+ if s == '$__env__':
+ return env
+ elif is_String(s):
+ return env.subst(s, 1, target, source)
+ return self.parent.convert(s)
+
+ def subst_args(self, target, source, env):
+ return [self.subst(x, target, source, env) for x in self.args]
+
+ def subst_kw(self, target, source, env):
+ kw = {}
+ for key in list(self.kw.keys()):
+ kw[key] = self.subst(self.kw[key], target, source, env)
+ return kw
+
+ def __call__(self, target, source, env, executor=None):
+ args = self.subst_args(target, source, env)
+ kw = self.subst_kw(target, source, env)
+ return self.parent.actfunc(*args, **kw)
+
+ def strfunction(self, target, source, env):
+ args = self.subst_args(target, source, env)
+ kw = self.subst_kw(target, source, env)
+ return self.parent.strfunc(*args, **kw)
+
+ def __str__(self):
+ return self.parent.strfunc(*self.args, **self.kw)
+
+
+class ActionFactory(object):
+ """A factory class that will wrap up an arbitrary function
+ as an SCons-executable Action object.
+
+ The real heavy lifting here is done by the ActionCaller class.
+ We just collect the (positional and keyword) arguments that we're
+ called with and give them to the ActionCaller object we create,
+ so it can hang onto them until it needs them.
+ """
+ def __init__(self, actfunc, strfunc, convert=lambda x: x):
+ self.actfunc = actfunc
+ self.strfunc = strfunc
+ self.convert = convert
+
+ def __call__(self, *args, **kw):
+ ac = ActionCaller(self, args, kw)
+ action = Action(ac, strfunction=ac.strfunction)
+ return action
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Action.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Action.xml
new file mode 100644
index 0000000..ab42958
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Action.xml
@@ -0,0 +1,146 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+__COPYRIGHT__
+
+This file is processed by the bin/SConsDoc.py module.
+See its __doc__ string for a discussion of the format.
+-->
+
+<!DOCTYPE sconsdoc [
+<!ENTITY % scons SYSTEM '../../../doc/scons.mod'>
+%scons;
+<!ENTITY % builders-mod SYSTEM '../../../doc/generated/builders.mod'>
+%builders-mod;
+<!ENTITY % functions-mod SYSTEM '../../../doc/generated/functions.mod'>
+%functions-mod;
+<!ENTITY % tools-mod SYSTEM '../../../doc/generated/tools.mod'>
+%tools-mod;
+<!ENTITY % variables-mod SYSTEM '../../../doc/generated/variables.mod'>
+%variables-mod;
+]>
+
+<sconsdoc xmlns="http://www.scons.org/dbxsd/v1.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://www.scons.org/dbxsd/v1.0 http://www.scons.org/dbxsd/v1.0/scons.xsd">
+
+<cvar name="IMPLICIT_COMMAND_DEPENDENCIES">
+<summary>
+<para>
+Controls whether or not SCons will
+add implicit dependencies for the commands
+executed to build targets.
+</para>
+
+<para>
+By default, SCons will add
+to each target
+an implicit dependency on the command
+represented by the first argument on any
+command line it executes.
+The specific file for the dependency is
+found by searching the
+<varname>PATH</varname>
+variable in the
+<varname>ENV</varname>
+environment used to execute the command.
+</para>
+
+<para>
+If the construction variable
+&cv-IMPLICIT_COMMAND_DEPENDENCIES;
+is set to a false value
+(<literal>None</literal>,
+<literal>False</literal>,
+<literal>0</literal>,
+etc.),
+then the implicit dependency will
+not be added to the targets
+built with that construction environment.
+</para>
+
+<example_commands>
+env = Environment(IMPLICIT_COMMAND_DEPENDENCIES = 0)
+</example_commands>
+</summary>
+</cvar>
+
+<cvar name="PRINT_CMD_LINE_FUNC">
+<summary>
+<para>
+A Python function used to print the command lines as they are executed
+(assuming command printing is not disabled by the
+<option>-q</option>
+or
+<option>-s</option>
+options or their equivalents).
+The function should take four arguments:
+<varname>s</varname>,
+the command being executed (a string),
+<varname>target</varname>,
+the target being built (file node, list, or string name(s)),
+<varname>source</varname>,
+the source(s) used (file node, list, or string name(s)), and
+<varname>env</varname>,
+the environment being used.
+</para>
+
+<para>
+The function must do the printing itself. The default implementation,
+used if this variable is not set or is None, is:
+</para>
+<example_commands>
+def print_cmd_line(s, target, source, env):
+ sys.stdout.write(s + "\n")
+</example_commands>
+
+<para>
+Here's an example of a more interesting function:
+</para>
+
+<example_commands>
+def print_cmd_line(s, target, source, env):
+ sys.stdout.write("Building %s -> %s...\n" %
+ (' and '.join([str(x) for x in source]),
+ ' and '.join([str(x) for x in target])))
+env=Environment(PRINT_CMD_LINE_FUNC=print_cmd_line)
+env.Program('foo', 'foo.c')
+</example_commands>
+
+<para>
+This just prints "Building <varname>targetname</varname> from <varname>sourcename</varname>..." instead
+of the actual commands.
+Such a function could also log the actual commands to a log file,
+for example.
+</para>
+</summary>
+</cvar>
+
+<cvar name="SPAWN">
+<summary>
+<para>
+A command interpreter function that will be called to execute command line
+strings. The function must expect the following arguments:
+</para>
+
+<example_commands>
+def spawn(shell, escape, cmd, args, env):
+</example_commands>
+
+<para>
+<varname>sh</varname>
+is a string naming the shell program to use.
+<varname>escape</varname>
+is a function that can be called to escape shell special characters in
+the command line.
+<varname>cmd</varname>
+is the path to the command to be executed.
+<varname>args</varname>
+is the arguments to the command.
+<varname>env</varname>
+is a dictionary of the environment variables
+in which the command should be executed.
+</para>
+</summary>
+</cvar>
+
+</sconsdoc>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/ActionTests.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/ActionTests.py
new file mode 100644
index 0000000..2398c10
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/ActionTests.py
@@ -0,0 +1,2131 @@
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+# Define a null function and a null class for use as builder actions.
+# Where these are defined in the file seems to affect their byte-code
+# contents, so try to minimize changes by defining them here, before we
+# even import anything.
+def GlobalFunc():
+ pass
+
+class GlobalActFunc(object):
+ def __call__(self):
+ pass
+
+import collections
+import io
+import os
+import re
+import sys
+import types
+import unittest
+
+import SCons.Action
+import SCons.Environment
+import SCons.Errors
+
+import TestCmd
+import TestUnit
+
+# Initial setup of the common environment for all tests,
+# a temporary working directory containing a
+# script for writing arguments to an output file.
+#
+# We don't do this as a setUp() method because it's
+# unnecessary to create a separate directory and script
+# for each test, they can just use the one.
+test = TestCmd.TestCmd(workdir = '')
+
+test.write('act.py', """\
+import os, string, sys
+f = open(sys.argv[1], 'w')
+f.write("act.py: '" + "' '".join(sys.argv[2:]) + "'\\n")
+try:
+ if sys.argv[3]:
+ f.write("act.py: '" + os.environ[sys.argv[3]] + "'\\n")
+except:
+ pass
+f.close()
+if 'ACTPY_PIPE' in os.environ:
+ if 'PIPE_STDOUT_FILE' in os.environ:
+ stdout_msg = open(os.environ['PIPE_STDOUT_FILE'], 'r').read()
+ else:
+ stdout_msg = "act.py: stdout: executed act.py %s\\n" % ' '.join(sys.argv[1:])
+ sys.stdout.write( stdout_msg )
+ if 'PIPE_STDERR_FILE' in os.environ:
+ stderr_msg = open(os.environ['PIPE_STDERR_FILE'], 'r').read()
+ else:
+ stderr_msg = "act.py: stderr: executed act.py %s\\n" % ' '.join(sys.argv[1:])
+ sys.stderr.write( stderr_msg )
+sys.exit(0)
+""")
+
+test.write('exit.py', """\
+import sys
+sys.exit(int(sys.argv[1]))
+""")
+
+act_py = test.workpath('act.py')
+exit_py = test.workpath('exit.py')
+
+outfile = test.workpath('outfile')
+outfile2 = test.workpath('outfile2')
+pipe_file = test.workpath('pipe.out')
+
+scons_env = SCons.Environment.Environment()
+
+# Capture all the stuff the Actions will print,
+# so it doesn't clutter the output.
+sys.stdout = io.StringIO()
+
+class CmdStringHolder(object):
+ def __init__(self, cmd, literal=None):
+ self.data = str(cmd)
+ self.literal = literal
+
+ def is_literal(self):
+ return self.literal
+
+ def escape(self, escape_func):
+ """Escape the string with the supplied function. The
+ function is expected to take an arbitrary string, then
+ return it with all special characters escaped and ready
+ for passing to the command interpreter.
+
+ After calling this function, the next call to str() will
+ return the escaped string.
+ """
+
+ if self.is_literal():
+ return escape_func(self.data)
+ elif ' ' in self.data or '\t' in self.data:
+ return '"%s"' % self.data
+ else:
+ return self.data
+
+class Environment(object):
+ def __init__(self, **kw):
+ self.d = {}
+ self.d['SHELL'] = scons_env['SHELL']
+ self.d['SPAWN'] = scons_env['SPAWN']
+ self.d['PSPAWN'] = scons_env['PSPAWN']
+ self.d['ESCAPE'] = scons_env['ESCAPE']
+ for k, v in kw.items():
+ self.d[k] = v
+ # Just use the underlying scons_subst*() utility methods.
+ def subst(self, strSubst, raw=0, target=[], source=[], conv=None):
+ return SCons.Subst.scons_subst(strSubst, self, raw,
+ target, source, self.d, conv=conv)
+ subst_target_source = subst
+ def subst_list(self, strSubst, raw=0, target=[], source=[], conv=None):
+ return SCons.Subst.scons_subst_list(strSubst, self, raw,
+ target, source, self.d, conv=conv)
+ def __getitem__(self, item):
+ return self.d[item]
+ def __setitem__(self, item, value):
+ self.d[item] = value
+ def has_key(self, item):
+ return item in self.d
+ def get(self, key, value=None):
+ return self.d.get(key, value)
+ def items(self):
+ return list(self.d.items())
+ def Dictionary(self):
+ return self.d
+ def Clone(self, **kw):
+ res = Environment()
+ res.d = SCons.Util.semi_deepcopy(self.d)
+ for k, v in kw.items():
+ res.d[k] = v
+ return res
+ def sig_dict(self):
+ d = {}
+ for k,v in self.items(): d[k] = v
+ d['TARGETS'] = ['__t1__', '__t2__', '__t3__', '__t4__', '__t5__', '__t6__']
+ d['TARGET'] = d['TARGETS'][0]
+ d['SOURCES'] = ['__s1__', '__s2__', '__s3__', '__s4__', '__s5__', '__s6__']
+ d['SOURCE'] = d['SOURCES'][0]
+ return d
+
+class DummyNode(object):
+ def __init__(self, name):
+ self.name = name
+ def str_for_display(self):
+ return '"' + self.name + '"'
+ def __str__(self):
+ return self.name
+ def rfile(self):
+ return self
+ def get_subst_proxy(self):
+ return self
+
+if os.name == 'java':
+ python = os.path.join(sys.prefix, 'jython')
+else:
+ python = os.environ.get('python_executable', sys.executable)
+_python_ = test.escape(python)
+
+_null = SCons.Action._null
+
+def test_varlist(pos_call, str_call, cmd, cmdstrfunc, **kw):
+ def call_action(a, pos_call=pos_call, str_call=str_call, kw=kw):
+ a = SCons.Action.Action(*a, **kw)
+ # returned object must provide these entry points
+ assert hasattr(a, '__call__')
+ assert hasattr(a, 'get_contents')
+ assert hasattr(a, 'genstring')
+ pos_call(a)
+ str_call(a)
+ return a
+
+ a = call_action((cmd, cmdstrfunc))
+ assert a.varlist == (), a.varlist
+
+ a = call_action((cmd, cmdstrfunc, 'foo'))
+ assert a.varlist == ('foo',), a.varlist
+
+ a = call_action((cmd, cmdstrfunc, 'a', 'b', 'c'))
+ assert a.varlist == ('a', 'b', 'c'), a.varlist
+
+ a = call_action((cmd, cmdstrfunc, ['a', 'b', 'c']))
+ assert a.varlist == ('a', 'b', 'c'), a.varlist
+
+ kw['varlist'] = 'foo'
+ a = call_action((cmd, cmdstrfunc))
+ assert a.varlist == ('foo',), a.varlist
+
+ kw['varlist'] = ['x', 'y', 'z']
+ a = call_action((cmd, cmdstrfunc))
+ assert a.varlist == ('x', 'y', 'z'), a.varlist
+
+ a = call_action((cmd, cmdstrfunc, 'foo'))
+ assert a.varlist == ('foo', 'x', 'y', 'z'), a.varlist
+
+ a = call_action((cmd, cmdstrfunc, 'a', 'b', 'c'))
+ assert a.varlist == ('a', 'b', 'c', 'x', 'y', 'z'), a.varlist
+
+def test_positional_args(pos_callback, cmd, **kw):
+ """Test that Action() returns the expected type and that positional args work.
+ """
+ act = SCons.Action.Action(cmd, **kw)
+ pos_callback(act)
+ assert act.varlist == (), act.varlist
+
+ if not isinstance(act, SCons.Action._ActionAction):
+ # only valid cmdstrfunc is None
+ def none(a): pass
+ test_varlist(pos_callback, none, cmd, None, **kw)
+ else:
+ # _ActionAction should have set these
+ assert hasattr(act, 'strfunction')
+ assert act.cmdstr is _null, act.cmdstr
+ assert act.presub is _null, act.presub
+ assert act.chdir is None, act.chdir
+ assert act.exitstatfunc is SCons.Action.default_exitstatfunc, \
+ act.exitstatfunc
+
+ def cmdstr(a):
+ assert hasattr(a, 'strfunction')
+ assert a.cmdstr == 'cmdstr', a.cmdstr
+ test_varlist(pos_callback, cmdstr, cmd, 'cmdstr', **kw)
+
+ def fun(): pass
+ def strfun(a, fun=fun):
+ assert a.strfunction is fun, a.strfunction
+ assert a.cmdstr == _null, a.cmdstr
+ test_varlist(pos_callback, strfun, cmd, fun, **kw)
+
+ def none(a):
+ assert hasattr(a, 'strfunction')
+ assert a.cmdstr is None, a.cmdstr
+ test_varlist(pos_callback, none, cmd, None, **kw)
+
+ """Test handling of bad cmdstrfunc arguments """
+ try:
+ a = SCons.Action.Action(cmd, [], **kw)
+ except SCons.Errors.UserError as e:
+ s = str(e)
+ m = 'Invalid command display variable'
+ assert s.find(m) != -1, 'Unexpected string: %s' % s
+ else:
+ raise Exception("did not catch expected UserError")
+
+ return act
+
+class ActionTestCase(unittest.TestCase):
+ """Test the Action() factory function"""
+
+ def test_FunctionAction(self):
+ """Test the Action() factory's creation of FunctionAction objects
+ """
+ def foo():
+ pass
+
+ def func_action(a, foo=foo):
+ assert isinstance(a, SCons.Action.FunctionAction), a
+ assert a.execfunction == foo, a.execfunction
+ test_positional_args(func_action, foo)
+ # a singleton list returns the contained action
+ test_positional_args(func_action, [foo])
+
+ def test_CommandAction(self):
+ """Test the Action() factory's creation of CommandAction objects
+ """
+ def cmd_action(a):
+ assert isinstance(a, SCons.Action.CommandAction), a
+ assert a.cmd_list == "string", a.cmd_list
+ test_positional_args(cmd_action, "string")
+ # a singleton list returns the contained action
+ test_positional_args(cmd_action, ["string"])
+
+ try: unicode
+ except NameError: pass
+ else:
+ a2 = eval("SCons.Action.Action(u'string')")
+ assert isinstance(a2, SCons.Action.CommandAction), a2
+
+ def line_action(a):
+ assert isinstance(a, SCons.Action.CommandAction), a
+ assert a.cmd_list == [ "explicit", "command", "line" ], a.cmd_list
+ test_positional_args(line_action, [[ "explicit", "command", "line" ]])
+
+ def test_ListAction(self):
+ """Test the Action() factory's creation of ListAction objects
+ """
+ a1 = SCons.Action.Action(["x", "y", "z", [ "a", "b", "c"]])
+ assert isinstance(a1, SCons.Action.ListAction), a1
+ assert a1.varlist == (), a1.varlist
+ assert isinstance(a1.list[0], SCons.Action.CommandAction), a1.list[0]
+ assert a1.list[0].cmd_list == "x", a1.list[0].cmd_list
+ assert isinstance(a1.list[1], SCons.Action.CommandAction), a1.list[1]
+ assert a1.list[1].cmd_list == "y", a1.list[1].cmd_list
+ assert isinstance(a1.list[2], SCons.Action.CommandAction), a1.list[2]
+ assert a1.list[2].cmd_list == "z", a1.list[2].cmd_list
+ assert isinstance(a1.list[3], SCons.Action.CommandAction), a1.list[3]
+ assert a1.list[3].cmd_list == [ "a", "b", "c" ], a1.list[3].cmd_list
+
+ a2 = SCons.Action.Action("x\ny\nz")
+ assert isinstance(a2, SCons.Action.ListAction), a2
+ assert a2.varlist == (), a2.varlist
+ assert isinstance(a2.list[0], SCons.Action.CommandAction), a2.list[0]
+ assert a2.list[0].cmd_list == "x", a2.list[0].cmd_list
+ assert isinstance(a2.list[1], SCons.Action.CommandAction), a2.list[1]
+ assert a2.list[1].cmd_list == "y", a2.list[1].cmd_list
+ assert isinstance(a2.list[2], SCons.Action.CommandAction), a2.list[2]
+ assert a2.list[2].cmd_list == "z", a2.list[2].cmd_list
+
+ def foo():
+ pass
+
+ a3 = SCons.Action.Action(["x", foo, "z"])
+ assert isinstance(a3, SCons.Action.ListAction), a3
+ assert a3.varlist == (), a3.varlist
+ assert isinstance(a3.list[0], SCons.Action.CommandAction), a3.list[0]
+ assert a3.list[0].cmd_list == "x", a3.list[0].cmd_list
+ assert isinstance(a3.list[1], SCons.Action.FunctionAction), a3.list[1]
+ assert a3.list[1].execfunction == foo, a3.list[1].execfunction
+ assert isinstance(a3.list[2], SCons.Action.CommandAction), a3.list[2]
+ assert a3.list[2].cmd_list == "z", a3.list[2].cmd_list
+
+ a4 = SCons.Action.Action(["x", "y"], strfunction=foo)
+ assert isinstance(a4, SCons.Action.ListAction), a4
+ assert a4.varlist == (), a4.varlist
+ assert isinstance(a4.list[0], SCons.Action.CommandAction), a4.list[0]
+ assert a4.list[0].cmd_list == "x", a4.list[0].cmd_list
+ assert a4.list[0].strfunction == foo, a4.list[0].strfunction
+ assert isinstance(a4.list[1], SCons.Action.CommandAction), a4.list[1]
+ assert a4.list[1].cmd_list == "y", a4.list[1].cmd_list
+ assert a4.list[1].strfunction == foo, a4.list[1].strfunction
+
+ a5 = SCons.Action.Action("x\ny", strfunction=foo)
+ assert isinstance(a5, SCons.Action.ListAction), a5
+ assert a5.varlist == (), a5.varlist
+ assert isinstance(a5.list[0], SCons.Action.CommandAction), a5.list[0]
+ assert a5.list[0].cmd_list == "x", a5.list[0].cmd_list
+ assert a5.list[0].strfunction == foo, a5.list[0].strfunction
+ assert isinstance(a5.list[1], SCons.Action.CommandAction), a5.list[1]
+ assert a5.list[1].cmd_list == "y", a5.list[1].cmd_list
+ assert a5.list[1].strfunction == foo, a5.list[1].strfunction
+
+ def test_CommandGeneratorAction(self):
+ """Test the Action() factory's creation of CommandGeneratorAction objects
+ """
+ def foo(): pass
+
+ def gen_action(a, foo=foo):
+ assert isinstance(a, SCons.Action.CommandGeneratorAction), a
+ assert a.generator is foo, a.generator
+ test_positional_args(gen_action, foo, generator=1)
+
+ def test_LazyCmdGeneratorAction(self):
+ """Test the Action() factory's creation of lazy CommandGeneratorAction objects
+ """
+ def lazy_action(a):
+ assert isinstance(a, SCons.Action.LazyAction), a
+ assert a.var == "FOO", a.var
+ assert a.cmd_list == "${FOO}", a.cmd_list
+ test_positional_args(lazy_action, "$FOO")
+ test_positional_args(lazy_action, "${FOO}")
+
+ def test_no_action(self):
+ """Test when the Action() factory can't create an action object
+ """
+ try:
+ a5 = SCons.Action.Action(1)
+ except TypeError:
+ pass
+ else:
+ assert 0, "Should have thrown a TypeError creating Action from an int."
+
+ def test_reentrance(self):
+ """Test the Action() factory when the action is already an Action object
+ """
+ a1 = SCons.Action.Action("foo")
+ a2 = SCons.Action.Action(a1)
+ assert a2 is a1, a2
+
+class _ActionActionTestCase(unittest.TestCase):
+
+ def test__init__(self):
+ """Test creation of _ActionAction objects
+ """
+
+ def func1():
+ pass
+
+ def func2():
+ pass
+
+ def func3():
+ pass
+
+ a = SCons.Action._ActionAction()
+ assert not hasattr(a, 'strfunction')
+ assert a.cmdstr is _null, a.cmdstr
+ assert a.varlist == (), a.varlist
+ assert a.presub is _null, a.presub
+ assert a.chdir is None, a.chdir
+ assert a.exitstatfunc is SCons.Action.default_exitstatfunc, a.exitstatfunc
+
+ assert SCons.Action._ActionAction(kwarg = 1)
+ assert not hasattr(a, 'kwarg')
+ assert not hasattr(a, 'strfunction')
+ assert a.cmdstr is _null, a.cmdstr
+ assert a.varlist == (), a.varlist
+ assert a.presub is _null, a.presub
+ assert a.chdir is None, a.chdir
+ assert a.exitstatfunc is SCons.Action.default_exitstatfunc, a.exitstatfunc
+
+ a = SCons.Action._ActionAction(strfunction=func1)
+ assert a.strfunction is func1, a.strfunction
+
+ a = SCons.Action._ActionAction(strfunction=None)
+ assert not hasattr(a, 'strfunction')
+ assert a.cmdstr is None, a.cmdstr
+
+ a = SCons.Action._ActionAction(cmdstr='cmdstr')
+ assert not hasattr(a, 'strfunction')
+ assert a.cmdstr is 'cmdstr', a.cmdstr
+
+ a = SCons.Action._ActionAction(cmdstr=None)
+ assert not hasattr(a, 'strfunction')
+ assert a.cmdstr is None, a.cmdstr
+
+ t = ('a','b','c')
+ a = SCons.Action._ActionAction(varlist=t)
+ assert a.varlist == t, a.varlist
+
+ a = SCons.Action._ActionAction(presub=func1)
+ assert a.presub is func1, a.presub
+
+ a = SCons.Action._ActionAction(chdir=1)
+ assert a.chdir is 1, a.chdir
+
+ a = SCons.Action._ActionAction(exitstatfunc=func1)
+ assert a.exitstatfunc is func1, a.exitstatfunc
+
+ a = SCons.Action._ActionAction(
+ # alphabetical order ...
+ chdir='x',
+ cmdstr='cmdstr',
+ exitstatfunc=func3,
+ presub=func2,
+ strfunction=func1,
+ varlist=t,
+ )
+ assert a.chdir is 'x', a.chdir
+ assert a.cmdstr is 'cmdstr', a.cmdstr
+ assert a.exitstatfunc is func3, a.exitstatfunc
+ assert a.presub is func2, a.presub
+ assert a.strfunction is func1, a.strfunction
+ assert a.varlist is t, a.varlist
+
+ def test_dup_keywords(self):
+ """Test handling of both cmdstr and strfunction arguments
+ """
+ def func(): pass
+ try:
+ a = SCons.Action.Action('foo', cmdstr='string', strfunction=func)
+ except SCons.Errors.UserError as e:
+ s = str(e)
+ m = 'Cannot have both strfunction and cmdstr args to Action()'
+ assert s.find(m) != -1, 'Unexpected string: %s' % s
+ else:
+ raise Exception("did not catch expected UserError")
+
+ def test___cmp__(self):
+ """Test Action comparison
+ """
+ a1 = SCons.Action.Action("x")
+ a2 = SCons.Action.Action("x")
+ assert a1 == a2
+ a3 = SCons.Action.Action("y")
+ assert a1 != a3
+ assert a2 != a3
+
+ def test_print_cmd_lines(self):
+ """Test the print_cmd_lines() method
+ """
+ save_stdout = sys.stdout
+
+ try:
+ def execfunc(target, source, env):
+ pass
+ a = SCons.Action.Action(execfunc)
+
+ sio = io.StringIO()
+ sys.stdout = sio
+ a.print_cmd_line("foo bar", None, None, None)
+ s = sio.getvalue()
+ assert s == "foo bar\n", s
+
+ finally:
+ sys.stdout = save_stdout
+
+ def test___call__(self):
+ """Test calling an Action
+ """
+ save_stdout = sys.stdout
+
+ save_print_actions = SCons.Action.print_actions
+ save_print_actions_presub = SCons.Action.print_actions_presub
+ save_execute_actions = SCons.Action.execute_actions
+ #SCons.Action.print_actions = 0
+
+ test = TestCmd.TestCmd(workdir = '')
+ test.subdir('sub', 'xyz')
+ os.chdir(test.workpath())
+
+ try:
+ env = Environment()
+
+ def execfunc(target, source, env):
+ assert isinstance(target, list), type(target)
+ assert isinstance(source, list), type(source)
+ return 7
+ a = SCons.Action.Action(execfunc)
+
+ def firstfunc(target, source, env):
+ assert isinstance(target, list), type(target)
+ assert isinstance(source, list), type(source)
+ return 0
+ def lastfunc(target, source, env):
+ assert isinstance(target, list), type(target)
+ assert isinstance(source, list), type(source)
+ return 9
+ b = SCons.Action.Action([firstfunc, execfunc, lastfunc])
+
+ sio = io.StringIO()
+ sys.stdout = sio
+ result = a("out", "in", env)
+ assert result.status == 7, result
+ s = sio.getvalue()
+ assert s == "execfunc(['out'], ['in'])\n", s
+
+ a.chdir = 'xyz'
+ expect = "os.chdir(%s)\nexecfunc(['out'], ['in'])\nos.chdir(%s)\n"
+
+ sio = io.StringIO()
+ sys.stdout = sio
+ result = a("out", "in", env)
+ assert result.status == 7, result.status
+ s = sio.getvalue()
+ assert s == expect % (repr('xyz'), repr(test.workpath())), s
+
+ sio = io.StringIO()
+ sys.stdout = sio
+ result = a("out", "in", env, chdir='sub')
+ assert result.status == 7, result.status
+ s = sio.getvalue()
+ assert s == expect % (repr('sub'), repr(test.workpath())), s
+
+ a.chdir = None
+
+ sio = io.StringIO()
+ sys.stdout = sio
+ result = b("out", "in", env)
+ assert result.status == 7, result.status
+ s = sio.getvalue()
+ assert s == "firstfunc(['out'], ['in'])\nexecfunc(['out'], ['in'])\n", s
+
+ SCons.Action.execute_actions = 0
+
+ sio = io.StringIO()
+ sys.stdout = sio
+ result = a("out", "in", env)
+ assert result == 0, result
+ s = sio.getvalue()
+ assert s == "execfunc(['out'], ['in'])\n", s
+
+ sio = io.StringIO()
+ sys.stdout = sio
+ result = b("out", "in", env)
+ assert result == 0, result
+ s = sio.getvalue()
+ assert s == "firstfunc(['out'], ['in'])\nexecfunc(['out'], ['in'])\nlastfunc(['out'], ['in'])\n", s
+
+ SCons.Action.print_actions_presub = 1
+ SCons.Action.execute_actions = 1
+
+ sio = io.StringIO()
+ sys.stdout = sio
+ result = a("out", "in", env)
+ assert result.status == 7, result.status
+ s = sio.getvalue()
+ assert s == "Building out with action:\n execfunc(target, source, env)\nexecfunc(['out'], ['in'])\n", s
+
+ sio = io.StringIO()
+ sys.stdout = sio
+ result = a("out", "in", env, presub=0)
+ assert result.status == 7, result.status
+ s = sio.getvalue()
+ assert s == "execfunc(['out'], ['in'])\n", s
+
+ sio = io.StringIO()
+ sys.stdout = sio
+ result = a("out", "in", env, presub=1)
+ assert result.status == 7, result.status
+ s = sio.getvalue()
+ assert s == "Building out with action:\n execfunc(target, source, env)\nexecfunc(['out'], ['in'])\n", s
+
+ sio = io.StringIO()
+ sys.stdout = sio
+ result = b(["out"], "in", env, presub=1)
+ assert result.status == 7, result.status
+ s = sio.getvalue()
+ assert s == "Building out with action:\n firstfunc(target, source, env)\nfirstfunc(['out'], ['in'])\nBuilding out with action:\n execfunc(target, source, env)\nexecfunc(['out'], ['in'])\n", s
+
+ sio = io.StringIO()
+ sys.stdout = sio
+ result = b(["out", "list"], "in", env, presub=1)
+ assert result.status == 7, result.status
+ s = sio.getvalue()
+ assert s == "Building out and list with action:\n firstfunc(target, source, env)\nfirstfunc(['out', 'list'], ['in'])\nBuilding out and list with action:\n execfunc(target, source, env)\nexecfunc(['out', 'list'], ['in'])\n", s
+
+ a2 = SCons.Action.Action(execfunc)
+
+ sio = io.StringIO()
+ sys.stdout = sio
+ result = a2("out", "in", env)
+ assert result.status == 7, result.status
+ s = sio.getvalue()
+ assert s == "Building out with action:\n execfunc(target, source, env)\nexecfunc(['out'], ['in'])\n", s
+
+ sio = io.StringIO()
+ sys.stdout = sio
+ result = a2("out", "in", env, presub=0)
+ assert result.status == 7, result.status
+ s = sio.getvalue()
+ assert s == "execfunc(['out'], ['in'])\n", s
+
+ SCons.Action.execute_actions = 0
+
+ sio = io.StringIO()
+ sys.stdout = sio
+ result = a2("out", "in", env, presub=0)
+ assert result == 0, result
+ s = sio.getvalue()
+ assert s == "execfunc(['out'], ['in'])\n", s
+
+ sio = io.StringIO()
+ sys.stdout = sio
+ result = a("out", "in", env, presub=0, execute=1, show=0)
+ assert result.status == 7, result.status
+ s = sio.getvalue()
+ assert s == '', s
+
+ sys.stdout = save_stdout
+ exitstatfunc_result = []
+
+ def exitstatfunc(stat, result=exitstatfunc_result):
+ result.append(stat)
+ return stat
+
+ result = a("out", "in", env, exitstatfunc=exitstatfunc)
+ assert result == 0, result
+ assert exitstatfunc_result == [], exitstatfunc_result
+
+ result = a("out", "in", env, execute=1, exitstatfunc=exitstatfunc)
+ assert result.status == 7, result.status
+ assert exitstatfunc_result == [7], exitstatfunc_result
+
+ SCons.Action.execute_actions = 1
+
+ result = []
+ def my_print_cmd_line(s, target, source, env, result=result):
+ result.append(s)
+ env['PRINT_CMD_LINE_FUNC'] = my_print_cmd_line
+ a("output", "input", env)
+ assert result == ["execfunc(['output'], ['input'])"], result
+
+
+ finally:
+ sys.stdout = save_stdout
+ SCons.Action.print_actions = save_print_actions
+ SCons.Action.print_actions_presub = save_print_actions_presub
+ SCons.Action.execute_actions = save_execute_actions
+
+ def test_presub_lines(self):
+ """Test the presub_lines() method
+ """
+ env = Environment()
+ a = SCons.Action.Action("x")
+ s = a.presub_lines(env)
+ assert s == ['x'], s
+
+ a = SCons.Action.Action(["y", "z"])
+ s = a.presub_lines(env)
+ assert s == ['y', 'z'], s
+
+ def func():
+ pass
+ a = SCons.Action.Action(func)
+ s = a.presub_lines(env)
+ assert s == ["func(target, source, env)"], s
+
+ def gen(target, source, env, for_signature):
+ return 'generat' + env.get('GEN', 'or')
+ a = SCons.Action.Action(gen, generator=1)
+ s = a.presub_lines(env)
+ assert s == ["generator"], s
+ s = a.presub_lines(Environment(GEN = 'ed'))
+ assert s == ["generated"], s
+
+ a = SCons.Action.Action("$ACT")
+ s = a.presub_lines(env)
+ assert s == [''], s
+ s = a.presub_lines(Environment(ACT = 'expanded action'))
+ assert s == ['expanded action'], s
+
+ def test_add(self):
+ """Test adding Actions to stuff."""
+ # Adding actions to other Actions or to stuff that can
+ # be converted into an Action should produce a ListAction
+ # containing all the Actions.
+ def bar():
+ return None
+ baz = SCons.Action.Action(bar, generator=1)
+ act1 = SCons.Action.Action('foo bar')
+ act2 = SCons.Action.Action([ 'foo', bar ])
+
+ sum = act1 + act2
+ assert isinstance(sum, SCons.Action.ListAction), str(sum)
+ assert len(sum.list) == 3, len(sum.list)
+ assert [isinstance(x, SCons.Action.ActionBase) for x in sum.list] == [ 1, 1, 1 ]
+
+ sum = act1 + act1
+ assert isinstance(sum, SCons.Action.ListAction), str(sum)
+ assert len(sum.list) == 2, len(sum.list)
+
+ sum = act2 + act2
+ assert isinstance(sum, SCons.Action.ListAction), str(sum)
+ assert len(sum.list) == 4, len(sum.list)
+
+ # Should also be able to add command generators to each other
+ # or to actions
+ sum = baz + baz
+ assert isinstance(sum, SCons.Action.ListAction), str(sum)
+ assert len(sum.list) == 2, len(sum.list)
+
+ sum = baz + act1
+ assert isinstance(sum, SCons.Action.ListAction), str(sum)
+ assert len(sum.list) == 2, len(sum.list)
+
+ sum = act2 + baz
+ assert isinstance(sum, SCons.Action.ListAction), str(sum)
+ assert len(sum.list) == 3, len(sum.list)
+
+ # Also should be able to add Actions to anything that can
+ # be converted into an action.
+ sum = act1 + bar
+ assert isinstance(sum, SCons.Action.ListAction), str(sum)
+ assert len(sum.list) == 2, len(sum.list)
+ assert isinstance(sum.list[1], SCons.Action.FunctionAction)
+
+ sum = 'foo bar' + act2
+ assert isinstance(sum, SCons.Action.ListAction), str(sum)
+ assert len(sum.list) == 3, len(sum.list)
+ assert isinstance(sum.list[0], SCons.Action.CommandAction)
+
+ sum = [ 'foo', 'bar' ] + act1
+ assert isinstance(sum, SCons.Action.ListAction), str(sum)
+ assert len(sum.list) == 3, sum.list
+ assert isinstance(sum.list[0], SCons.Action.CommandAction)
+ assert isinstance(sum.list[1], SCons.Action.CommandAction)
+
+ sum = act2 + [ baz, bar ]
+ assert isinstance(sum, SCons.Action.ListAction), str(sum)
+ assert len(sum.list) == 4, len(sum.list)
+ assert isinstance(sum.list[2], SCons.Action.CommandGeneratorAction)
+ assert isinstance(sum.list[3], SCons.Action.FunctionAction)
+
+ # OK to add None on either side (should be ignored)
+ sum = act1 + None
+ assert sum == act1
+
+ sum = None + act1
+ assert sum == act1
+
+ try:
+ sum = act2 + 1
+ except TypeError:
+ pass
+ else:
+ assert 0, "Should have thrown a TypeError adding to an int."
+
+ try:
+ sum = 1 + act2
+ except TypeError:
+ pass
+ else:
+ assert 0, "Should have thrown a TypeError adding to an int."
+
+class CommandActionTestCase(unittest.TestCase):
+
+ def test___init__(self):
+ """Test creation of a command Action
+ """
+ a = SCons.Action.CommandAction(["xyzzy"])
+ assert a.cmd_list == [ "xyzzy" ], a.cmd_list
+ assert a.cmdstr is _null, a.cmdstr
+
+ a = SCons.Action.CommandAction(["abra"], cmdstr="cadabra")
+ assert a.cmd_list == [ "abra" ], a.cmd_list
+ assert a.cmdstr == "cadabra", a.cmdstr
+
+ def test___str__(self):
+ """Test fetching the pre-substitution string for command Actions
+ """
+ env = Environment()
+ act = SCons.Action.CommandAction('xyzzy $TARGET $SOURCE')
+ s = str(act)
+ assert s == 'xyzzy $TARGET $SOURCE', s
+
+ act = SCons.Action.CommandAction(['xyzzy',
+ '$TARGET', '$SOURCE',
+ '$TARGETS', '$SOURCES'])
+ s = str(act)
+ assert s == "xyzzy $TARGET $SOURCE $TARGETS $SOURCES", s
+
+ def test_genstring(self):
+ """Test the genstring() method for command Actions
+ """
+
+ env = Environment()
+ t1 = DummyNode('t1')
+ t2 = DummyNode('t2')
+ s1 = DummyNode('s1')
+ s2 = DummyNode('s2')
+ act = SCons.Action.CommandAction('xyzzy $TARGET $SOURCE')
+ expect = 'xyzzy $TARGET $SOURCE'
+ s = act.genstring([], [], env)
+ assert s == expect, s
+ s = act.genstring([t1], [s1], env)
+ assert s == expect, s
+ s = act.genstring([t1, t2], [s1, s2], env)
+ assert s == expect, s
+
+ act = SCons.Action.CommandAction('xyzzy $TARGETS $SOURCES')
+ expect = 'xyzzy $TARGETS $SOURCES'
+ s = act.genstring([], [], env)
+ assert s == expect, s
+ s = act.genstring([t1], [s1], env)
+ assert s == expect, s
+ s = act.genstring([t1, t2], [s1, s2], env)
+ assert s == expect, s
+
+ act = SCons.Action.CommandAction(['xyzzy',
+ '$TARGET', '$SOURCE',
+ '$TARGETS', '$SOURCES'])
+ expect = "xyzzy $TARGET $SOURCE $TARGETS $SOURCES"
+ s = act.genstring([], [], env)
+ assert s == expect, s
+ s = act.genstring([t1], [s1], env)
+ assert s == expect, s
+ s = act.genstring([t1, t2], [s1, s2], env)
+ assert s == expect, s
+
+ def test_strfunction(self):
+ """Test fetching the string representation of command Actions
+ """
+
+ env = Environment()
+ t1 = DummyNode('t1')
+ t2 = DummyNode('t2')
+ s1 = DummyNode('s1')
+ s2 = DummyNode('s2')
+ act = SCons.Action.CommandAction('xyzzy $TARGET $SOURCE')
+ s = act.strfunction([], [], env)
+ assert s == 'xyzzy', s
+ s = act.strfunction([t1], [s1], env)
+ assert s == 'xyzzy t1 s1', s
+ s = act.strfunction([t1, t2], [s1, s2], env)
+ assert s == 'xyzzy t1 s1', s
+
+ act = SCons.Action.CommandAction('xyzzy $TARGET $SOURCE',
+ cmdstr='cmdstr - $SOURCE - $TARGET -')
+ s = act.strfunction([], [], env)
+ assert s == 'cmdstr - - -', s
+ s = act.strfunction([t1], [s1], env)
+ assert s == 'cmdstr - s1 - t1 -', s
+ s = act.strfunction([t1, t2], [s1, s2], env)
+ assert s == 'cmdstr - s1 - t1 -', s
+
+ act = SCons.Action.CommandAction('xyzzy $TARGETS $SOURCES')
+ s = act.strfunction([], [], env)
+ assert s == 'xyzzy', s
+ s = act.strfunction([t1], [s1], env)
+ assert s == 'xyzzy t1 s1', s
+ s = act.strfunction([t1, t2], [s1, s2], env)
+ assert s == 'xyzzy t1 t2 s1 s2', s
+
+ act = SCons.Action.CommandAction('xyzzy $TARGETS $SOURCES',
+ cmdstr='cmdstr = $SOURCES = $TARGETS =')
+ s = act.strfunction([], [], env)
+ assert s == 'cmdstr = = =', s
+ s = act.strfunction([t1], [s1], env)
+ assert s == 'cmdstr = s1 = t1 =', s
+ s = act.strfunction([t1, t2], [s1, s2], env)
+ assert s == 'cmdstr = s1 s2 = t1 t2 =', s
+
+ act = SCons.Action.CommandAction(['xyzzy',
+ '$TARGET', '$SOURCE',
+ '$TARGETS', '$SOURCES'])
+ s = act.strfunction([], [], env)
+ assert s == 'xyzzy', s
+ s = act.strfunction([t1], [s1], env)
+ assert s == 'xyzzy t1 s1 t1 s1', s
+ s = act.strfunction([t1, t2], [s1, s2], env)
+ assert s == 'xyzzy t1 s1 t1 t2 s1 s2', s
+
+ act = SCons.Action.CommandAction('xyzzy $TARGETS $SOURCES',
+ cmdstr='cmdstr\t$TARGETS\n$SOURCES ')
+
+ s = act.strfunction([], [], env)
+ assert s == 'cmdstr\t\n ', s
+ s = act.strfunction([t1], [s1], env)
+ assert s == 'cmdstr\tt1\ns1 ', s
+ s = act.strfunction([t1, t2], [s1, s2], env)
+ assert s == 'cmdstr\tt1 t2\ns1 s2 ', s
+
+ def sf(target, source, env):
+ return "sf was called"
+ act = SCons.Action.CommandAction('foo', strfunction=sf)
+ s = act.strfunction([], [], env)
+ assert s == "sf was called", s
+
+ class actclass1(object):
+ def __init__(self, targets, sources, env):
+ pass
+ def __call__(self):
+ return 1
+ class actclass2(object):
+ def __init__(self, targets, sources, env):
+ self.strfunction = 5
+ def __call__(self):
+ return 2
+ class actclass3(object):
+ def __init__(self, targets, sources, env):
+ pass
+ def __call__(self):
+ return 3
+ def strfunction(self, targets, sources, env):
+ return 'actclass3 on %s to get %s'%(str(sources[0]),
+ str(targets[0]))
+ class actclass4(object):
+ def __init__(self, targets, sources, env):
+ pass
+ def __call__(self):
+ return 4
+ strfunction = None
+
+ act1 = SCons.Action.Action(actclass1([t1], [s1], env))
+ s = act1.strfunction([t1], [s1], env)
+ assert s == 'actclass1(["t1"], ["s1"])', s
+
+ act2 = SCons.Action.Action(actclass2([t1], [s1], env))
+ s = act2.strfunction([t1], [s1], env)
+ assert s == 'actclass2(["t1"], ["s1"])', s
+
+ act3 = SCons.Action.Action(actclass3([t1], [s1], env))
+ s = act3.strfunction([t1], [s1], env)
+ assert s == 'actclass3 on s1 to get t1', s
+
+ act4 = SCons.Action.Action(actclass4([t1], [s1], env))
+ s = act4.strfunction([t1], [s1], env)
+ assert s is None, s
+
+ act = SCons.Action.CommandAction("@foo bar")
+ s = act.strfunction([], [], env)
+ assert s == "", s
+
+ act = SCons.Action.CommandAction("@-foo bar")
+ s = act.strfunction([], [], env)
+ assert s == "", s
+
+ act = SCons.Action.CommandAction("-@foo bar")
+ s = act.strfunction([], [], env)
+ assert s == "", s
+
+ act = SCons.Action.CommandAction("-foo bar")
+ s = act.strfunction([], [], env)
+ assert s == "foo bar", s
+
+ act = SCons.Action.CommandAction("@ foo bar")
+ s = act.strfunction([], [], env)
+ assert s == "", s
+
+ act = SCons.Action.CommandAction("@- foo bar")
+ s = act.strfunction([], [], env)
+ assert s == "", s
+
+ act = SCons.Action.CommandAction("-@ foo bar")
+ s = act.strfunction([], [], env)
+ assert s == "", s
+
+ act = SCons.Action.CommandAction("- foo bar")
+ s = act.strfunction([], [], env)
+ assert s == "foo bar", s
+
+ def test_execute(self):
+ """Test execution of command Actions
+
+ """
+ try:
+ env = self.env
+ except AttributeError:
+ env = Environment()
+
+ cmd1 = r'%s %s %s xyzzy' % (_python_, act_py, outfile)
+
+ act = SCons.Action.CommandAction(cmd1)
+ r = act([], [], env.Clone())
+ assert r == 0
+ c = test.read(outfile, 'r')
+ assert c == "act.py: 'xyzzy'\n", c
+
+ cmd2 = r'%s %s %s $TARGET' % (_python_, act_py, outfile)
+
+ act = SCons.Action.CommandAction(cmd2)
+ r = act(DummyNode('foo'), [], env.Clone())
+ assert r == 0
+ c = test.read(outfile, 'r')
+ assert c == "act.py: 'foo'\n", c
+
+ cmd3 = r'%s %s %s ${TARGETS}' % (_python_, act_py, outfile)
+
+ act = SCons.Action.CommandAction(cmd3)
+ r = act(list(map(DummyNode, ['aaa', 'bbb'])), [], env.Clone())
+ assert r == 0
+ c = test.read(outfile, 'r')
+ assert c == "act.py: 'aaa' 'bbb'\n", c
+
+ cmd4 = r'%s %s %s $SOURCES' % (_python_, act_py, outfile)
+
+ act = SCons.Action.CommandAction(cmd4)
+ r = act([], [DummyNode('one'), DummyNode('two')], env.Clone())
+ assert r == 0
+ c = test.read(outfile, 'r')
+ assert c == "act.py: 'one' 'two'\n", c
+
+ cmd4 = r'%s %s %s ${SOURCES[:2]}' % (_python_, act_py, outfile)
+
+ act = SCons.Action.CommandAction(cmd4)
+ sources = [DummyNode('three'), DummyNode('four'), DummyNode('five')]
+ env2 = env.Clone()
+ r = act([], source = sources, env = env2)
+ assert r == 0
+ c = test.read(outfile, 'r')
+ assert c == "act.py: 'three' 'four'\n", c
+
+ cmd5 = r'%s %s %s $TARGET XYZZY' % (_python_, act_py, outfile)
+
+ act = SCons.Action.CommandAction(cmd5)
+ env5 = Environment()
+ if 'ENV' in scons_env:
+ env5['ENV'] = scons_env['ENV']
+ PATH = scons_env['ENV'].get('PATH', '')
+ else:
+ env5['ENV'] = {}
+ PATH = ''
+
+ env5['ENV']['XYZZY'] = 'xyzzy'
+ r = act(target = DummyNode('out5'), source = [], env = env5)
+
+ act = SCons.Action.CommandAction(cmd5)
+ r = act(target = DummyNode('out5'),
+ source = [],
+ env = env.Clone(ENV = {'XYZZY' : 'xyzzy5',
+ 'PATH' : PATH}))
+ assert r == 0
+ c = test.read(outfile, 'r')
+ assert c == "act.py: 'out5' 'XYZZY'\nact.py: 'xyzzy5'\n", c
+
+ class Obj(object):
+ def __init__(self, str):
+ self._str = str
+ def __str__(self):
+ return self._str
+ def rfile(self):
+ return self
+ def get_subst_proxy(self):
+ return self
+
+ cmd6 = r'%s %s %s ${TARGETS[1]} $TARGET ${SOURCES[:2]}' % (_python_, act_py, outfile)
+
+ act = SCons.Action.CommandAction(cmd6)
+ r = act(target = [Obj('111'), Obj('222')],
+ source = [Obj('333'), Obj('444'), Obj('555')],
+ env = env.Clone())
+ assert r == 0
+ c = test.read(outfile, 'r')
+ assert c == "act.py: '222' '111' '333' '444'\n", c
+
+ if os.name == 'nt':
+ # NT treats execs of directories and non-executable files
+ # as "file not found" errors
+ expect_nonexistent = 1
+ expect_nonexecutable_file = 1
+ expect_nonexecutable_dir = 1
+ elif sys.platform == 'cygwin':
+ expect_nonexistent = 127
+ # Newer cygwin seems to return 126 for following
+ expect_nonexecutable_file = 126
+ expect_nonexecutable_dir = 127
+ elif sys.platform.find('sunos') != -1:
+ expect_nonexistent = 1
+ expect_nonexecutable_file = 1
+ expect_nonexecutable_dir = 1
+ else:
+ expect_nonexistent = 127
+ expect_nonexecutable_file = 126
+ expect_nonexecutable_dir = 126
+
+ # Test that a nonexistent command returns 127
+ act = SCons.Action.CommandAction(python + "_no_such_command_")
+ r = act([], [], env.Clone(out = outfile))
+ assert r.status == expect_nonexistent, r.status
+
+ # Test that trying to execute a directory returns 126
+ dir, tail = os.path.split(python)
+ act = SCons.Action.CommandAction(dir)
+ r = act([], [], env.Clone(out = outfile))
+ assert r.status == expect_nonexecutable_file, r.status
+
+ # Test that trying to execute a non-executable file returns 126
+ act = SCons.Action.CommandAction(outfile)
+ r = act([], [], env.Clone(out = outfile))
+ assert r.status == expect_nonexecutable_dir, r.status
+
+ act = SCons.Action.CommandAction('%s %s 1' % (_python_, exit_py))
+ r = act([], [], env)
+ assert r.status == 1, r.status
+
+ act = SCons.Action.CommandAction('@%s %s 1' % (_python_, exit_py))
+ r = act([], [], env)
+ assert r.status == 1, r.status
+
+ act = SCons.Action.CommandAction('@-%s %s 1' % (_python_, exit_py))
+ r = act([], [], env)
+ assert r == 0, r
+
+ act = SCons.Action.CommandAction('-%s %s 1' % (_python_, exit_py))
+ r = act([], [], env)
+ assert r == 0, r
+
+ act = SCons.Action.CommandAction('@ %s %s 1' % (_python_, exit_py))
+ r = act([], [], env)
+ assert r.status == 1, r.status
+
+ act = SCons.Action.CommandAction('@- %s %s 1' % (_python_, exit_py))
+ r = act([], [], env)
+ assert r == 0, r
+
+ act = SCons.Action.CommandAction('- %s %s 1' % (_python_, exit_py))
+ r = act([], [], env)
+ assert r == 0, r
+
+ def test_set_handler(self):
+ """Test setting the command handler...
+ """
+ class Test(object):
+ def __init__(self):
+ self.executed = 0
+ t=Test()
+ def func(sh, escape, cmd, args, env, test=t):
+ test.executed = args
+ test.shell = sh
+ return 0
+ def escape_func(cmd):
+ return '**' + cmd + '**'
+
+ class LiteralStr(object):
+ def __init__(self, x):
+ self.data = x
+ def __str__(self):
+ return self.data
+ def escape(self, escape_func):
+ return escape_func(self.data)
+ def is_literal(self):
+ return 1
+
+ a = SCons.Action.CommandAction(["xyzzy"])
+ e = Environment(SPAWN = func)
+ a([], [], e)
+ assert t.executed == [ 'xyzzy' ], t.executed
+
+ a = SCons.Action.CommandAction(["xyzzy"])
+ e = Environment(SPAWN = '$FUNC', FUNC = func)
+ a([], [], e)
+ assert t.executed == [ 'xyzzy' ], t.executed
+
+ a = SCons.Action.CommandAction(["xyzzy"])
+ e = Environment(SPAWN = func, SHELL = 'fake shell')
+ a([], [], e)
+ assert t.executed == [ 'xyzzy' ], t.executed
+ assert t.shell == 'fake shell', t.shell
+
+ a = SCons.Action.CommandAction([ LiteralStr("xyzzy") ])
+ e = Environment(SPAWN = func, ESCAPE = escape_func)
+ a([], [], e)
+ assert t.executed == [ '**xyzzy**' ], t.executed
+
+ def test_get_contents(self):
+ """Test fetching the contents of a command Action
+ """
+ def CmdGen(target, source, env, for_signature):
+ assert for_signature
+ return "%s %s" % \
+ (env["foo"], env["bar"])
+
+ # The number 1 is there to make sure all args get converted to strings.
+ a = SCons.Action.CommandAction(["|", "$(", "$foo", "|", "$(", "$bar",
+ "$)", "stuff", "$)", "|", "$baz", 1])
+ c = a.get_contents(target=[], source=[],
+ env=Environment(foo = 'FFF', bar = 'BBB',
+ baz = CmdGen))
+ assert c == b"| | FFF BBB 1", c
+
+ # Make sure that CommandActions use an Environment's
+ # subst_target_source() method for substitution.
+ class SpecialEnvironment(Environment):
+ def subst_target_source(self, strSubst, raw=0, target=[], source=[]):
+ return 'subst_target_source: ' + strSubst
+
+ c = a.get_contents(target=DummyNode('ttt'), source = DummyNode('sss'),
+ env=SpecialEnvironment(foo = 'GGG', bar = 'CCC',
+ baz = 'ZZZ'))
+ assert c == b'subst_target_source: | $( $foo | $( $bar $) stuff $) | $baz 1', c
+
+ # We've discussed using the real target and source names in a
+ # CommandAction's signature contents. This would have have the
+ # advantage of recompiling when a file's name changes (keeping
+ # debug info current), but it would currently break repository
+ # logic that will change the file name based on whether the
+ # files come from a repository or locally. If we ever move to
+ # that scheme, then all of the '__t1__' and '__s6__' file names
+ # in the asserts below would change to 't1' and 's6' and the
+ # like.
+ t = list(map(DummyNode, ['t1', 't2', 't3', 't4', 't5', 't6']))
+ s = list(map(DummyNode, ['s1', 's2', 's3', 's4', 's5', 's6']))
+ env = Environment()
+
+ a = SCons.Action.CommandAction(["$TARGET"])
+ c = a.get_contents(target=t, source=s, env=env)
+ assert c == b"t1", c
+
+ a = SCons.Action.CommandAction(["$TARGETS"])
+ c = a.get_contents(target=t, source=s, env=env)
+ assert c == b"t1 t2 t3 t4 t5 t6", c
+
+ a = SCons.Action.CommandAction(["${TARGETS[2]}"])
+ c = a.get_contents(target=t, source=s, env=env)
+ assert c == b"t3", c
+
+ a = SCons.Action.CommandAction(["${TARGETS[3:5]}"])
+ c = a.get_contents(target=t, source=s, env=env)
+ assert c == b"t4 t5", c
+
+ a = SCons.Action.CommandAction(["$SOURCE"])
+ c = a.get_contents(target=t, source=s, env=env)
+ assert c == b"s1", c
+
+ a = SCons.Action.CommandAction(["$SOURCES"])
+ c = a.get_contents(target=t, source=s, env=env)
+ assert c == b"s1 s2 s3 s4 s5 s6", c
+
+ a = SCons.Action.CommandAction(["${SOURCES[2]}"])
+ c = a.get_contents(target=t, source=s, env=env)
+ assert c == b"s3", c
+
+ a = SCons.Action.CommandAction(["${SOURCES[3:5]}"])
+ c = a.get_contents(target=t, source=s, env=env)
+ assert c == b"s4 s5", c
+
+class CommandGeneratorActionTestCase(unittest.TestCase):
+
+ def factory(self, act, **kw):
+ """Pass any keywords as a dict"""
+ return SCons.Action.CommandGeneratorAction(act, kw)
+
+ def test___init__(self):
+ """Test creation of a command generator Action
+ """
+ def f(target, source, env):
+ pass
+ a = self.factory(f)
+ assert a.generator == f
+
+ def test___str__(self):
+ """Test the pre-substitution strings for command generator Actions
+ """
+ def f(target, source, env, for_signature, self=self):
+
+ # See if "env" is really a construction environment (or
+ # looks like one) by accessing the FindIxes attribute.
+ # (The Tool/mingw.py module has a generator that uses this,
+ # and the __str__() method used to cause problems by passing
+ # us a regular dictionary as a fallback.)
+
+ env.FindIxes
+ return "FOO"
+ a = self.factory(f)
+ s = str(a)
+ assert s == 'FOO', s
+
+ def test_genstring(self):
+ """Test the command generator Action genstring() method
+ """
+ def f(target, source, env, for_signature, self=self):
+ dummy = env['dummy']
+ self.dummy = dummy
+ return "$FOO $TARGET $SOURCE $TARGETS $SOURCES"
+ a = self.factory(f)
+ self.dummy = 0
+ s = a.genstring([], [], env=Environment(FOO='xyzzy', dummy=1))
+ assert self.dummy == 1, self.dummy
+ assert s == "$FOO $TARGET $SOURCE $TARGETS $SOURCES", s
+
+ def test_execute(self):
+ """Test executing a command generator Action
+ """
+
+ def f(target, source, env, for_signature, self=self):
+ dummy = env['dummy']
+ self.dummy = dummy
+ s = env.subst("$FOO")
+ assert s == 'foo baz\nbar ack', s
+ return "$FOO"
+ def func_action(target, source, env, self=self):
+ dummy=env['dummy']
+ s = env.subst('$foo')
+ assert s == 'bar', s
+ self.dummy=dummy
+ def f2(target, source, env, for_signature, f=func_action):
+ return f
+ def ch(sh, escape, cmd, args, env, self=self):
+ self.cmd.append(cmd)
+ self.args.append(args)
+
+ a = self.factory(f)
+ self.dummy = 0
+ self.cmd = []
+ self.args = []
+ a([], [], env=Environment(FOO = 'foo baz\nbar ack',
+ dummy = 1,
+ SPAWN = ch))
+ assert self.dummy == 1, self.dummy
+ assert self.cmd == ['foo', 'bar'], self.cmd
+ assert self.args == [[ 'foo', 'baz' ], [ 'bar', 'ack' ]], self.args
+
+ b = self.factory(f2)
+ self.dummy = 0
+ b(target=[], source=[], env=Environment(foo = 'bar',
+ dummy = 2 ))
+ assert self.dummy==2, self.dummy
+ del self.dummy
+
+ class DummyFile(object):
+ def __init__(self, t):
+ self.t = t
+ def rfile(self):
+ self.t.rfile_called = 1
+ return self
+ def get_subst_proxy(self):
+ return self
+ def f3(target, source, env, for_signature):
+ return ''
+ c = self.factory(f3)
+ c(target=[], source=DummyFile(self), env=Environment())
+ assert self.rfile_called
+
+ def test_get_contents(self):
+ """Test fetching the contents of a command generator Action
+ """
+ def f(target, source, env, for_signature):
+ foo = env['foo']
+ bar = env['bar']
+ assert for_signature, for_signature
+ return [["guux", foo, "$(", "$ignore", "$)", bar,
+ '${test("$( foo $bar $)")}' ]]
+
+ def test(mystr):
+ assert mystr == "$( foo $bar $)", mystr
+ return "test"
+
+ env = Environment(foo = 'FFF', bar = 'BBB',
+ ignore = 'foo', test=test)
+ a = self.factory(f)
+ c = a.get_contents(target=[], source=[], env=env)
+ assert c == b"guux FFF BBB test", c
+
+ def test_get_contents_of_function_action(self):
+ """Test contents of a CommandGeneratorAction-generated FunctionAction
+ """
+
+ def LocalFunc():
+ pass
+
+ # Since the python bytecode has per version differences, we need different expected results per version
+ func_matches = {
+ (2,7) : bytearray(b'0, 0, 0, 0,(),(),(d\x00\x00S),(),()'),
+ (3,5) : bytearray(b'0, 0, 0, 0,(),(),(d\x00\x00S),(),()'),
+ (3,6) : bytearray(b'0, 0, 0, 0,(),(),(d\x00S\x00),(),()'),
+ }
+
+ meth_matches = [
+ b"1, 1, 0, 0,(),(),(d\000\000S),(),()",
+ b"1, 1, 0, 0,(),(),(d\x00\x00S),(),()",
+ ]
+
+ def f_global(target, source, env, for_signature):
+ return SCons.Action.Action(GlobalFunc)
+
+ def f_local(target, source, env, for_signature):
+ return SCons.Action.Action(LocalFunc)
+
+ env = Environment(XYZ = 'foo')
+
+ a = self.factory(f_global)
+ c = a.get_contents(target=[], source=[], env=env)
+ assert c == func_matches[sys.version_info[:2]], "Got\n"+repr(c)+"\nExpected \n"+repr(func_matches[sys.version_info[:2]])
+
+ a = self.factory(f_local)
+ c = a.get_contents(target=[], source=[], env=env)
+ assert c == func_matches[sys.version_info[:2]], "Got\n"+repr(c)+"\nExpected \n"+repr(func_matches[sys.version_info[:2]])
+
+ def f_global(target, source, env, for_signature):
+ return SCons.Action.Action(GlobalFunc, varlist=['XYZ'])
+
+ def f_local(target, source, env, for_signature):
+ return SCons.Action.Action(LocalFunc, varlist=['XYZ'])
+
+ matches_foo = func_matches[sys.version_info[:2]] + b'foo'
+
+ a = self.factory(f_global)
+ c = a.get_contents(target=[], source=[], env=env)
+ assert c in matches_foo, repr(c)
+
+ a = self.factory(f_local)
+ c = a.get_contents(target=[], source=[], env=env)
+ assert c in matches_foo, repr(c)
+
+
+class FunctionActionTestCase(unittest.TestCase):
+
+ def test___init__(self):
+ """Test creation of a function Action
+ """
+ def func1():
+ pass
+ def func2():
+ pass
+ def func3():
+ pass
+ def func4():
+ pass
+
+ a = SCons.Action.FunctionAction(func1, {})
+ assert a.execfunction == func1, a.execfunction
+ assert isinstance(a.strfunction, types.MethodType), type(a.strfunction)
+
+ a = SCons.Action.FunctionAction(func2, { 'strfunction' : func3 })
+ assert a.execfunction == func2, a.execfunction
+ assert a.strfunction == func3, a.strfunction
+
+ def test___str__(self):
+ """Test the __str__() method for function Actions
+ """
+ def func1():
+ pass
+ a = SCons.Action.FunctionAction(func1, {})
+ s = str(a)
+ assert s == "func1(target, source, env)", s
+
+ class class1(object):
+ def __call__(self):
+ pass
+ a = SCons.Action.FunctionAction(class1(), {})
+ s = str(a)
+ assert s == "class1(target, source, env)", s
+
+ def test_execute(self):
+ """Test executing a function Action
+ """
+ self.inc = 0
+ def f(target, source, env):
+ s = env['s']
+ s.inc = s.inc + 1
+ s.target = target
+ s.source=source
+ assert env.subst("$BAR") == 'foo bar', env.subst("$BAR")
+ return 0
+ a = SCons.Action.FunctionAction(f, {})
+ a(target=1, source=2, env=Environment(BAR = 'foo bar',
+ s = self))
+ assert self.inc == 1, self.inc
+ assert self.source == [2], self.source
+ assert self.target == [1], self.target
+
+ global count
+ count = 0
+ def function1(target, source, env):
+ global count
+ count = count + 1
+ for t in target:
+ with open(t, 'w') as f:
+ f.write("function1\n")
+ return 1
+
+ act = SCons.Action.FunctionAction(function1, {})
+ r = act(target = [outfile, outfile2], source=[], env=Environment())
+ assert r.status == 1, r.status
+
+ assert count == 1, count
+ c = test.read(outfile, 'r')
+ assert c == "function1\n", c
+ c = test.read(outfile2, 'r')
+ assert c == "function1\n", c
+
+ class class1a(object):
+ def __init__(self, target, source, env):
+ with open(env['out'], 'w') as f:
+ f.write("class1a\n")
+
+ act = SCons.Action.FunctionAction(class1a, {})
+ r = act([], [], Environment(out = outfile))
+ assert isinstance(r.status, class1a), r.status
+ c = test.read(outfile, 'r')
+ assert c == "class1a\n", c
+
+ class class1b(object):
+ def __call__(self, target, source, env):
+ with open(env['out'], 'w') as f:
+ f.write("class1b\n")
+ return 2
+
+ act = SCons.Action.FunctionAction(class1b(), {})
+ r = act([], [], Environment(out = outfile))
+ assert r.status == 2, r.status
+ c = test.read(outfile, 'r')
+ assert c == "class1b\n", c
+
+ def build_it(target, source, env, executor=None, self=self):
+ self.build_it = 1
+ return 0
+ def string_it(target, source, env, executor=None, self=self):
+ self.string_it = 1
+ return None
+ act = SCons.Action.FunctionAction(build_it,
+ { 'strfunction' : string_it })
+ r = act([], [], Environment())
+ assert r == 0, r
+ assert self.build_it
+ assert self.string_it
+
+ def test_get_contents(self):
+ """Test fetching the contents of a function Action
+ """
+
+ def LocalFunc():
+ pass
+
+ func_matches = {
+ (2,7) : bytearray(b'0, 0, 0, 0,(),(),(d\x00\x00S),(),()'),
+ (3,5) : bytearray(b'0, 0, 0, 0,(),(),(d\x00\x00S),(),()'),
+ (3,6) : bytearray(b'0, 0, 0, 0,(),(),(d\x00S\x00),(),()'),
+ }
+
+ meth_matches = {
+ (2,7) : bytearray(b'1, 1, 0, 0,(),(),(d\x00\x00S),(),()'),
+ (3,5) : bytearray(b'1, 1, 0, 0,(),(),(d\x00\x00S),(),()'),
+ (3,6) : bytearray(b'1, 1, 0, 0,(),(),(d\x00S\x00),(),()'),
+ }
+
+ def factory(act, **kw):
+ return SCons.Action.FunctionAction(act, kw)
+
+ a = factory(GlobalFunc)
+ c = a.get_contents(target=[], source=[], env=Environment())
+ assert c == func_matches[sys.version_info[:2]], "Got\n"+repr(c)+"\nExpected one of \n"+repr(func_matches[sys.version_info[:2]])
+
+
+ a = factory(LocalFunc)
+ c = a.get_contents(target=[], source=[], env=Environment())
+ assert c == func_matches[sys.version_info[:2]], "Got\n"+repr(c)+"\nExpected one of \n"+repr(func_matches[sys.version_info[:2]])
+
+ matches_foo = func_matches[sys.version_info[:2]] + b'foo'
+
+ a = factory(GlobalFunc, varlist=['XYZ'])
+ c = a.get_contents(target=[], source=[], env=Environment())
+ assert c == func_matches[sys.version_info[:2]], "Got\n"+repr(c)+"\nExpected one of \n"+repr(func_matches[sys.version_info[:2]])
+ # assert c in func_matches, repr(c)
+
+ c = a.get_contents(target=[], source=[], env=Environment(XYZ='foo'))
+ assert c == matches_foo, repr(c)
+
+ ##TODO: is this set of tests still needed?
+ # Make sure a bare string varlist works
+ a = factory(GlobalFunc, varlist='XYZ')
+ c = a.get_contents(target=[], source=[], env=Environment())
+ # assert c in func_matches, repr(c)
+ assert c == func_matches[sys.version_info[:2]], "Got\n"+repr(c)+"\nExpected one of \n"+repr(func_matches[sys.version_info[:2]])
+
+
+ c = a.get_contents(target=[], source=[], env=Environment(XYZ='foo'))
+ assert c in matches_foo, repr(c)
+
+ class Foo(object):
+ def get_contents(self, target, source, env):
+ return b'xyzzy'
+ a = factory(Foo())
+ c = a.get_contents(target=[], source=[], env=Environment())
+ assert c == b'xyzzy', repr(c)
+
+ class LocalClass(object):
+ def LocalMethod(self):
+ pass
+ lc = LocalClass()
+ a = factory(lc.LocalMethod)
+ c = a.get_contents(target=[], source=[], env=Environment())
+ assert c == meth_matches[sys.version_info[:2]], "Got\n"+repr(c)+"\nExpected one of \n"+repr(meth_matches[sys.version_info[:2]])
+
+ def test_strfunction(self):
+ """Test the FunctionAction.strfunction() method
+ """
+ def func():
+ pass
+
+ def factory(act, **kw):
+ return SCons.Action.FunctionAction(act, kw)
+
+ a = factory(func)
+ s = a.strfunction(target=[], source=[], env=Environment())
+ assert s == 'func([], [])', s
+
+ a = factory(func, strfunction=None)
+ s = a.strfunction(target=[], source=[], env=Environment())
+ assert s is None, s
+
+ a = factory(func, cmdstr='function')
+ s = a.strfunction(target=[], source=[], env=Environment())
+ assert s == 'function', s
+
+class ListActionTestCase(unittest.TestCase):
+
+ def test___init__(self):
+ """Test creation of a list of subsidiary Actions
+ """
+ def func():
+ pass
+ a = SCons.Action.ListAction(["x", func, ["y", "z"]])
+ assert isinstance(a.list[0], SCons.Action.CommandAction)
+ assert isinstance(a.list[1], SCons.Action.FunctionAction)
+ assert isinstance(a.list[2], SCons.Action.ListAction)
+ assert a.list[2].list[0].cmd_list == 'y'
+
+ def test___str__(self):
+ """Test the __str__() method for a list of subsidiary Actions
+ """
+ def f(target,source,env):
+ pass
+ def g(target,source,env):
+ pass
+ a = SCons.Action.ListAction([f, g, "XXX", f])
+ s = str(a)
+ assert s == "f(target, source, env)\ng(target, source, env)\nXXX\nf(target, source, env)", s
+
+ def test_genstring(self):
+ """Test the genstring() method for a list of subsidiary Actions
+ """
+ def f(target,source,env):
+ pass
+ def g(target,source,env,for_signature):
+ return 'generated %s %s' % (target[0], source[0])
+ g = SCons.Action.Action(g, generator=1)
+ a = SCons.Action.ListAction([f, g, "XXX", f])
+ s = a.genstring(['foo.x'], ['bar.y'], Environment())
+ assert s == "f(target, source, env)\ngenerated foo.x bar.y\nXXX\nf(target, source, env)", s
+
+ def test_execute(self):
+ """Test executing a list of subsidiary Actions
+ """
+ self.inc = 0
+ def f(target,source,env):
+ s = env['s']
+ s.inc = s.inc + 1
+ a = SCons.Action.ListAction([f, f, f])
+ a([], [], Environment(s = self))
+ assert self.inc == 3, self.inc
+
+ cmd2 = r'%s %s %s syzygy' % (_python_, act_py, outfile)
+
+ def function2(target, source, env):
+ with open(env['out'], 'a') as f:
+ f.write("function2\n")
+ return 0
+
+ class class2a(object):
+ def __call__(self, target, source, env):
+ with open(env['out'], 'a') as f:
+ f.write("class2a\n")
+ return 0
+
+ class class2b(object):
+ def __init__(self, target, source, env):
+ with open(env['out'], 'a') as f:
+ f.write("class2b\n")
+ act = SCons.Action.ListAction([cmd2, function2, class2a(), class2b])
+ r = act([], [], Environment(out = outfile))
+ assert isinstance(r.status, class2b), r.status
+ c = test.read(outfile, 'r')
+ assert c == "act.py: 'syzygy'\nfunction2\nclass2a\nclass2b\n", c
+
+ def test_get_contents(self):
+ """Test fetching the contents of a list of subsidiary Actions
+ """
+ self.foo=0
+ def gen(target, source, env, for_signature):
+ s = env['s']
+ s.foo=1
+ return "y"
+ a = SCons.Action.ListAction(["x",
+ SCons.Action.Action(gen, generator=1),
+ "z"])
+ c = a.get_contents(target=[], source=[], env=Environment(s = self))
+ assert self.foo==1, self.foo
+ assert c == b"xyz", c
+
+class LazyActionTestCase(unittest.TestCase):
+ def test___init__(self):
+ """Test creation of a lazy-evaluation Action
+ """
+ # Environment variable references should create a special type
+ # of LazyAction that lazily evaluates the variable for whether
+ # it's a string or something else before doing anything.
+ a9 = SCons.Action.Action('$FOO')
+ assert isinstance(a9, SCons.Action.LazyAction), a9
+ assert a9.var == 'FOO', a9.var
+
+ a10 = SCons.Action.Action('${FOO}')
+ assert isinstance(a10, SCons.Action.LazyAction), a10
+ assert a10.var == 'FOO', a10.var
+
+ def test_genstring(self):
+ """Test the lazy-evaluation Action genstring() method
+ """
+ def f(target, source, env):
+ pass
+ a = SCons.Action.Action('$BAR')
+ env1 = Environment(BAR=f, s=self)
+ env2 = Environment(BAR='xxx', s=self)
+ s = a.genstring([], [], env=env1)
+ assert s == "f(target, source, env)", s
+ s = a.genstring([], [], env=env2)
+ assert s == 'xxx', s
+
+ def test_execute(self):
+ """Test executing a lazy-evaluation Action
+ """
+ def f(target, source, env):
+ s = env['s']
+ s.test=1
+ return 0
+ a = SCons.Action.Action('$BAR')
+ a([], [], env=Environment(BAR = f, s = self))
+ assert self.test == 1, self.test
+ cmd = r'%s %s %s lazy' % (_python_, act_py, outfile)
+ a([], [], env=Environment(BAR = cmd, s = self))
+ c = test.read(outfile, 'r')
+ assert c == "act.py: 'lazy'\n", c
+
+ def test_get_contents(self):
+ """Test fetching the contents of a lazy-evaluation Action
+ """
+ a = SCons.Action.Action("${FOO}")
+ env = Environment(FOO = [["This", "is", "a", "test"]])
+ c = a.get_contents(target=[], source=[], env=env)
+ assert c == b"This is a test", c
+
+ def test_get_contents_of_function_action(self):
+ """Test fetching the contents of a lazy-evaluation FunctionAction
+ """
+
+ def LocalFunc():
+ pass
+
+
+ func_matches = {
+ (2,7) : bytearray(b'0, 0, 0, 0,(),(),(d\x00\x00S),(),()'),
+ (3,5) : bytearray(b'0, 0, 0, 0,(),(),(d\x00\x00S),(),()'),
+ (3,6) : bytearray(b'0, 0, 0, 0,(),(),(d\x00S\x00),(),()'),
+ }
+
+ meth_matches = [
+ b"1, 1, 0, 0,(),(),(d\000\000S),(),()",
+ b"1, 1, 0, 0,(),(),(d\x00\x00S),(),()",
+ ]
+
+ def factory(act, **kw):
+ return SCons.Action.FunctionAction(act, kw)
+
+
+ a = SCons.Action.Action("${FOO}")
+
+ env = Environment(FOO = factory(GlobalFunc))
+ c = a.get_contents(target=[], source=[], env=env)
+ # assert c in func_matches, "Got\n"+repr(c)+"\nExpected one of \n"+"\n".join([repr(f) for f in func_matches])
+ assert c == func_matches[sys.version_info[:2]], "Got\n"+repr(c)+"\nExpected one of \n"+repr(func_matches[sys.version_info[:2]])
+
+
+
+ env = Environment(FOO = factory(LocalFunc))
+ c = a.get_contents(target=[], source=[], env=env)
+ assert c == func_matches[sys.version_info[:2]], "Got\n"+repr(c)+"\nExpected one of \n"+repr(func_matches[sys.version_info[:2]])
+
+ # matches_foo = [x + b"foo" for x in func_matches]
+ matches_foo = func_matches[sys.version_info[:2]] + b'foo'
+
+
+ env = Environment(FOO = factory(GlobalFunc, varlist=['XYZ']))
+ c = a.get_contents(target=[], source=[], env=env)
+ assert c == func_matches[sys.version_info[:2]], "Got\n"+repr(c)+"\nExpected one of \n"+repr(func_matches[sys.version_info[:2]])
+
+ env['XYZ'] = 'foo'
+ c = a.get_contents(target=[], source=[], env=env)
+ assert c in matches_foo, repr(c)
+
+
+class ActionCallerTestCase(unittest.TestCase):
+ def test___init__(self):
+ """Test creation of an ActionCaller"""
+ ac = SCons.Action.ActionCaller(1, [2, 3], {'FOO' : 4, 'BAR' : 5})
+ assert ac.parent == 1, ac.parent
+ assert ac.args == [2, 3], ac.args
+ assert ac.kw == {'FOO' : 4, 'BAR' : 5}, ac.kw
+
+ def test_get_contents(self):
+ """Test fetching the contents of an ActionCaller"""
+ def strfunc():
+ pass
+
+ def LocalFunc():
+ pass
+
+
+ matches = {
+ (2,7) : b'd\x00\x00S',
+ (3,5) : b'd\x00\x00S',
+ (3,6) : b'd\x00S\x00',
+ }
+
+
+ af = SCons.Action.ActionFactory(GlobalFunc, strfunc)
+ ac = SCons.Action.ActionCaller(af, [], {})
+ c = ac.get_contents([], [], Environment())
+ assert c == matches[sys.version_info[:2]], "Got\n"+repr(c)+"\nExpected one of \n"+repr(matches[sys.version_info[:2]])
+
+ af = SCons.Action.ActionFactory(LocalFunc, strfunc)
+ ac = SCons.Action.ActionCaller(af, [], {})
+ c = ac.get_contents([], [], Environment())
+ assert c == matches[sys.version_info[:2]], "Got\n"+repr(c)+"\nExpected one of \n"+repr(matches[sys.version_info[:2]])
+
+ class LocalActFunc(object):
+ def __call__(self):
+ pass
+
+ af = SCons.Action.ActionFactory(GlobalActFunc(), strfunc)
+ ac = SCons.Action.ActionCaller(af, [], {})
+ c = ac.get_contents([], [], Environment())
+ assert c == matches[sys.version_info[:2]], "Got\n"+repr(c)+"\nExpected one of \n"+repr(matches[sys.version_info[:2]])
+
+ af = SCons.Action.ActionFactory(LocalActFunc(), strfunc)
+ ac = SCons.Action.ActionCaller(af, [], {})
+ c = ac.get_contents([], [], Environment())
+ assert c == matches[sys.version_info[:2]], "Got\n"+repr(c)+"\nExpected one of \n"+repr(matches[sys.version_info[:2]])
+
+ matches = [
+ b"<built-in function str>",
+ b"<type 'str'>",
+ ]
+
+ af = SCons.Action.ActionFactory(str, strfunc)
+ ac = SCons.Action.ActionCaller(af, [], {})
+ c = ac.get_contents([], [], Environment())
+ assert c == "<built-in function str>" or \
+ c == "<type 'str'>" or \
+ c == "<class 'str'>", repr(c)
+ # ^^ class str for python3
+
+ def test___call__(self):
+ """Test calling an ActionCaller"""
+ actfunc_args = []
+ def actfunc(a1, a2, a3, args=actfunc_args):
+ args.extend([a1, a2, a3])
+ def strfunc(a1, a2, a3):
+ pass
+
+ e = Environment(FOO = 2, BAR = 5)
+
+ af = SCons.Action.ActionFactory(actfunc, strfunc)
+ ac = SCons.Action.ActionCaller(af, ['$__env__', '$FOO', 3], {})
+ ac([], [], e)
+ assert actfunc_args[0] is e, actfunc_args
+ assert actfunc_args[1] == '2', actfunc_args
+ assert actfunc_args[2] == 3, actfunc_args
+ del actfunc_args[:]
+
+ ac = SCons.Action.ActionCaller(af, [], {'a3' : '$__env__', 'a2' : '$BAR', 'a1' : 4})
+ ac([], [], e)
+ assert actfunc_args[0] == 4, actfunc_args
+ assert actfunc_args[1] == '5', actfunc_args
+ assert actfunc_args[2] is e, actfunc_args
+ del actfunc_args[:]
+
+ def test_strfunction(self):
+ """Test calling the ActionCaller strfunction() method"""
+ strfunc_args = []
+ def actfunc(a1, a2, a3, a4):
+ pass
+ def strfunc(a1, a2, a3, a4, args=strfunc_args):
+ args.extend([a1, a2, a3, a4])
+
+ af = SCons.Action.ActionFactory(actfunc, strfunc)
+ ac = SCons.Action.ActionCaller(af, [1, '$FOO', 3, '$WS'], {})
+ ac.strfunction([], [], Environment(FOO = 2, WS='white space'))
+ assert strfunc_args == [1, '2', 3, 'white space'], strfunc_args
+
+ del strfunc_args[:]
+ d = {'a3' : 6, 'a2' : '$BAR', 'a1' : 4, 'a4' : '$WS'}
+ ac = SCons.Action.ActionCaller(af, [], d)
+ ac.strfunction([], [], Environment(BAR = 5, WS='w s'))
+ assert strfunc_args == [4, '5', 6, 'w s'], strfunc_args
+
+class ActionFactoryTestCase(unittest.TestCase):
+ def test___init__(self):
+ """Test creation of an ActionFactory"""
+ def actfunc():
+ pass
+ def strfunc():
+ pass
+ ac = SCons.Action.ActionFactory(actfunc, strfunc)
+ assert ac.actfunc is actfunc, ac.actfunc
+ assert ac.strfunc is strfunc, ac.strfunc
+
+ def test___call__(self):
+ """Test calling whatever's returned from an ActionFactory"""
+ actfunc_args = []
+ strfunc_args = []
+ def actfunc(a1, a2, a3, args=actfunc_args):
+ args.extend([a1, a2, a3])
+ def strfunc(a1, a2, a3, args=strfunc_args):
+ args.extend([a1, a2, a3])
+ af = SCons.Action.ActionFactory(actfunc, strfunc)
+ af(3, 6, 9)([], [], Environment())
+ assert actfunc_args == [3, 6, 9], actfunc_args
+ assert strfunc_args == [3, 6, 9], strfunc_args
+
+
+class ActionCompareTestCase(unittest.TestCase):
+
+ def test_1_solo_name(self):
+ """Test Lazy Cmd Generator Action get_name alone.
+
+ Basically ensures we can locate the builder, comparing it to
+ itself along the way."""
+ bar = SCons.Builder.Builder(action = {})
+ env = Environment( BUILDERS = {'BAR' : bar} )
+ name = bar.get_name(env)
+ assert name == 'BAR', name
+
+ def test_2_multi_name(self):
+ """Test LazyCmdGenerator Action get_name multi builders.
+
+ Ensure that we can compare builders (and thereby actions) to
+ each other safely."""
+ foo = SCons.Builder.Builder(action = '$FOO', suffix = '.foo')
+ bar = SCons.Builder.Builder(action = {})
+ assert foo != bar
+ assert foo.action != bar.action
+ env = Environment( BUILDERS = {'FOO' : foo,
+ 'BAR' : bar} )
+ name = foo.get_name(env)
+ assert name == 'FOO', name
+ name = bar.get_name(env)
+ assert name == 'BAR', name
+
+ def test_3_dict_names(self):
+ """Test Action/Suffix dicts with get_name.
+
+ Verifies that Action/Suffix dictionaries work correctly,
+ especially two builders that can generate the same suffix,
+ where one of the builders has a suffix dictionary with a None
+ key."""
+
+ foo = SCons.Builder.Builder(action = '$FOO', suffix = '.foo')
+ bar = SCons.Builder.Builder(action = {}, suffix={None:'.bar'})
+ bar.add_action('.cow', "$MOO")
+ dog = SCons.Builder.Builder(suffix = '.bar')
+
+ env = Environment( BUILDERS = {'FOO' : foo,
+ 'BAR' : bar,
+ 'DOG' : dog} )
+
+ assert foo.get_name(env) == 'FOO', foo.get_name(env)
+ assert bar.get_name(env) == 'BAR', bar.get_name(env)
+ assert dog.get_name(env) == 'DOG', dog.get_name(env)
+
+
+class TestClass(object):
+ """A test class used by ObjectContentsTestCase.test_object_contents"""
+ def __init__(self):
+ self.a = "a"
+ self.b = "b"
+ def method(self, arg):
+ pass
+
+
+class ObjectContentsTestCase(unittest.TestCase):
+
+ def test_function_contents(self):
+ """Test that Action._function_contents works"""
+
+ def func1(a, b, c):
+ """A test function"""
+ return a
+
+ # Since the python bytecode has per version differences, we need different expected results per version
+ expected = {
+ (2,7) : bytearray(b'3, 3, 0, 0,(),(),(|\x00\x00S),(),()'),
+ (3,5) : bytearray(b'3, 3, 0, 0,(),(),(|\x00\x00S),(),()'),
+ (3,6) : bytearray(b'3, 3, 0, 0,(),(),(|\x00S\x00),(),()'),
+ }
+
+ c = SCons.Action._function_contents(func1)
+ assert c == expected[sys.version_info[:2]], "Got\n"+repr(c)+"\nExpected \n"+"\n"+repr(expected[sys.version_info[:2]])
+
+
+ def test_object_contents(self):
+ """Test that Action._object_contents works"""
+
+ # See definition above
+ o = TestClass()
+ c = SCons.Action._object_contents(o)
+
+ # c = SCons.Action._object_instance_content(o)
+
+ # Since the python bytecode has per version differences, we need different expected results per version
+ expected = {
+ (2,7): bytearray(b"{TestClass:__main__}[[[(<type \'object\'>, ()), [(<class \'__main__.TestClass\'>, (<type \'object\'>,))]]]]{{1, 1, 0, 0,(a,b),(a,b),(d\x01\x00|\x00\x00_\x00\x00d\x02\x00|\x00\x00_\x01\x00d\x00\x00S),(),(),2, 2, 0, 0,(),(),(d\x00\x00S),(),()}}{{{a=a,b=b}}}"),
+ (3,5): bytearray(b"{TestClass:__main__}[[[(<class \'object\'>, ()), [(<class \'__main__.TestClass\'>, (<class \'object\'>,))]]]]{{1, 1, 0, 0,(a,b),(a,b),(d\x01\x00|\x00\x00_\x00\x00d\x02\x00|\x00\x00_\x01\x00d\x00\x00S),(),(),2, 2, 0, 0,(),(),(d\x00\x00S),(),()}}{{{a=a,b=b}}}"),
+ (3,6): bytearray(b"{TestClass:__main__}[[[(<class \'object\'>, ()), [(<class \'__main__.TestClass\'>, (<class \'object\'>,))]]]]{{1, 1, 0, 0,(a,b),(a,b),(d\x01|\x00_\x00d\x02|\x00_\x01d\x00S\x00),(),(),2, 2, 0, 0,(),(),(d\x00S\x00),(),()}}{{{a=a,b=b}}}"),
+ }
+
+ assert c == expected[sys.version_info[:2]], "Got\n"+repr(c)+"\nExpected \n"+"\n"+repr(expected[sys.version_info[:2]])
+
+ def test_code_contents(self):
+ """Test that Action._code_contents works"""
+
+ code = compile("print('Hello, World!')", '<string>', 'exec')
+ c = SCons.Action._code_contents(code)
+
+ # Since the python bytecode has per version differences, we need different expected results per version
+ expected = {
+ (2,7) : bytearray(b'0, 0, 0, 0,(N.),(),(d\x00\x00GHd\x01\x00S)'),
+ (3,5) : bytearray(b'0, 0, 0, 0,(N.),(print),(e\x00\x00d\x00\x00\x83\x01\x00\x01d\x01\x00S)'),
+ (3,6) : bytearray(b'0, 0, 0, 0,(N.),(print),(e\x00d\x00\x83\x01\x01\x00d\x01S\x00)'),
+ }
+
+ assert c == expected[sys.version_info[:2]], "Got\n"+repr(c)+"\nExpected \n"+"\n"+expected[sys.version_info[:2]]
+
+
+
+if __name__ == "__main__":
+ suite = unittest.TestSuite()
+ tclasses = [ _ActionActionTestCase,
+ ActionTestCase,
+ CommandActionTestCase,
+ CommandGeneratorActionTestCase,
+ FunctionActionTestCase,
+ ListActionTestCase,
+ LazyActionTestCase,
+ ActionCallerTestCase,
+ ActionFactoryTestCase,
+ ActionCompareTestCase,
+ ObjectContentsTestCase ]
+ for tclass in tclasses:
+ names = unittest.getTestCaseNames(tclass, 'test_')
+ suite.addTests(list(map(tclass, names)))
+
+ TestUnit.run(suite)
+
+ # Swap this for above to debug otherwise you can't run individual tests as TestUnit is swallowing arguments
+ # unittest.main()
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Builder.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Builder.py
new file mode 100644
index 0000000..010d5ff
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Builder.py
@@ -0,0 +1,888 @@
+"""
+SCons.Builder
+
+Builder object subsystem.
+
+A Builder object is a callable that encapsulates information about how
+to execute actions to create a target Node (file) from source Nodes
+(files), and how to create those dependencies for tracking.
+
+The main entry point here is the Builder() factory method. This provides
+a procedural interface that creates the right underlying Builder object
+based on the keyword arguments supplied and the types of the arguments.
+
+The goal is for this external interface to be simple enough that the
+vast majority of users can create new Builders as necessary to support
+building new types of files in their configurations, without having to
+dive any deeper into this subsystem.
+
+The base class here is BuilderBase. This is a concrete base class which
+does, in fact, represent the Builder objects that we (or users) create.
+
+There is also a proxy that looks like a Builder:
+
+ CompositeBuilder
+
+ This proxies for a Builder with an action that is actually a
+ dictionary that knows how to map file suffixes to a specific
+ action. This is so that we can invoke different actions
+ (compilers, compile options) for different flavors of source
+ files.
+
+Builders and their proxies have the following public interface methods
+used by other modules:
+
+ - __call__()
+ THE public interface. Calling a Builder object (with the
+ use of internal helper methods) sets up the target and source
+ dependencies, appropriate mapping to a specific action, and the
+ environment manipulation necessary for overridden construction
+ variable. This also takes care of warning about possible mistakes
+ in keyword arguments.
+
+ - add_emitter()
+ Adds an emitter for a specific file suffix, used by some Tool
+ modules to specify that (for example) a yacc invocation on a .y
+ can create a .h *and* a .c file.
+
+ - add_action()
+ Adds an action for a specific file suffix, heavily used by
+ Tool modules to add their specific action(s) for turning
+ a source file into an object file to the global static
+ and shared object file Builders.
+
+There are the following methods for internal use within this module:
+
+ - _execute()
+ The internal method that handles the heavily lifting when a
+ Builder is called. This is used so that the __call__() methods
+ can set up warning about possible mistakes in keyword-argument
+ overrides, and *then* execute all of the steps necessary so that
+ the warnings only occur once.
+
+ - get_name()
+ Returns the Builder's name within a specific Environment,
+ primarily used to try to return helpful information in error
+ messages.
+
+ - adjust_suffix()
+ - get_prefix()
+ - get_suffix()
+ - get_src_suffix()
+ - set_src_suffix()
+ Miscellaneous stuff for handling the prefix and suffix
+ manipulation we use in turning source file names into target
+ file names.
+
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import collections
+
+import SCons.Action
+import SCons.Debug
+from SCons.Debug import logInstanceCreation
+from SCons.Errors import InternalError, UserError
+import SCons.Executor
+import SCons.Memoize
+import SCons.Util
+import SCons.Warnings
+
+class _Null(object):
+ pass
+
+_null = _Null
+
+def match_splitext(path, suffixes = []):
+ if suffixes:
+ matchsuf = [S for S in suffixes if path[-len(S):] == S]
+ if matchsuf:
+ suf = max([(len(_f),_f) for _f in matchsuf])[1]
+ return [path[:-len(suf)], path[-len(suf):]]
+ return SCons.Util.splitext(path)
+
+class DictCmdGenerator(SCons.Util.Selector):
+ """This is a callable class that can be used as a
+ command generator function. It holds on to a dictionary
+ mapping file suffixes to Actions. It uses that dictionary
+ to return the proper action based on the file suffix of
+ the source file."""
+
+ def __init__(self, dict=None, source_ext_match=1):
+ SCons.Util.Selector.__init__(self, dict)
+ self.source_ext_match = source_ext_match
+
+ def src_suffixes(self):
+ return list(self.keys())
+
+ def add_action(self, suffix, action):
+ """Add a suffix-action pair to the mapping.
+ """
+ self[suffix] = action
+
+ def __call__(self, target, source, env, for_signature):
+ if not source:
+ return []
+
+ if self.source_ext_match:
+ suffixes = self.src_suffixes()
+ ext = None
+ for src in map(str, source):
+ my_ext = match_splitext(src, suffixes)[1]
+ if ext and my_ext != ext:
+ raise UserError("While building `%s' from `%s': Cannot build multiple sources with different extensions: %s, %s"
+ % (repr(list(map(str, target))), src, ext, my_ext))
+ ext = my_ext
+ else:
+ ext = match_splitext(str(source[0]), self.src_suffixes())[1]
+
+ if not ext:
+ #return ext
+ raise UserError("While building `%s': "
+ "Cannot deduce file extension from source files: %s"
+ % (repr(list(map(str, target))), repr(list(map(str, source)))))
+
+ try:
+ ret = SCons.Util.Selector.__call__(self, env, source, ext)
+ except KeyError as e:
+ raise UserError("Ambiguous suffixes after environment substitution: %s == %s == %s" % (e.args[0], e.args[1], e.args[2]))
+ if ret is None:
+ raise UserError("While building `%s' from `%s': Don't know how to build from a source file with suffix `%s'. Expected a suffix in this list: %s." % \
+ (repr(list(map(str, target))), repr(list(map(str, source))), ext, repr(list(self.keys()))))
+ return ret
+
+class CallableSelector(SCons.Util.Selector):
+ """A callable dictionary that will, in turn, call the value it
+ finds if it can."""
+ def __call__(self, env, source):
+ value = SCons.Util.Selector.__call__(self, env, source)
+ if callable(value):
+ value = value(env, source)
+ return value
+
+class DictEmitter(SCons.Util.Selector):
+ """A callable dictionary that maps file suffixes to emitters.
+ When called, it finds the right emitter in its dictionary for the
+ suffix of the first source file, and calls that emitter to get the
+ right lists of targets and sources to return. If there's no emitter
+ for the suffix in its dictionary, the original target and source are
+ returned.
+ """
+ def __call__(self, target, source, env):
+ emitter = SCons.Util.Selector.__call__(self, env, source)
+ if emitter:
+ target, source = emitter(target, source, env)
+ return (target, source)
+
+class ListEmitter(collections.UserList):
+ """A callable list of emitters that calls each in sequence,
+ returning the result.
+ """
+ def __call__(self, target, source, env):
+ for e in self.data:
+ target, source = e(target, source, env)
+ return (target, source)
+
+# These are a common errors when calling a Builder;
+# they are similar to the 'target' and 'source' keyword args to builders,
+# so we issue warnings when we see them. The warnings can, of course,
+# be disabled.
+misleading_keywords = {
+ 'targets' : 'target',
+ 'sources' : 'source',
+}
+
+class OverrideWarner(collections.UserDict):
+ """A class for warning about keyword arguments that we use as
+ overrides in a Builder call.
+
+ This class exists to handle the fact that a single Builder call
+ can actually invoke multiple builders. This class only emits the
+ warnings once, no matter how many Builders are invoked.
+ """
+ def __init__(self, dict):
+ collections.UserDict.__init__(self, dict)
+ if SCons.Debug.track_instances: logInstanceCreation(self, 'Builder.OverrideWarner')
+ self.already_warned = None
+ def warn(self):
+ if self.already_warned:
+ return
+ for k in list(self.keys()):
+ if k in misleading_keywords:
+ alt = misleading_keywords[k]
+ msg = "Did you mean to use `%s' instead of `%s'?" % (alt, k)
+ SCons.Warnings.warn(SCons.Warnings.MisleadingKeywordsWarning, msg)
+ self.already_warned = 1
+
+def Builder(**kw):
+ """A factory for builder objects."""
+ composite = None
+ if 'generator' in kw:
+ if 'action' in kw:
+ raise UserError("You must not specify both an action and a generator.")
+ kw['action'] = SCons.Action.CommandGeneratorAction(kw['generator'], {})
+ del kw['generator']
+ elif 'action' in kw:
+ source_ext_match = kw.get('source_ext_match', 1)
+ if 'source_ext_match' in kw:
+ del kw['source_ext_match']
+ if SCons.Util.is_Dict(kw['action']):
+ composite = DictCmdGenerator(kw['action'], source_ext_match)
+ kw['action'] = SCons.Action.CommandGeneratorAction(composite, {})
+ kw['src_suffix'] = composite.src_suffixes()
+ else:
+ kw['action'] = SCons.Action.Action(kw['action'])
+
+ if 'emitter' in kw:
+ emitter = kw['emitter']
+ if SCons.Util.is_String(emitter):
+ # This allows users to pass in an Environment
+ # variable reference (like "$FOO") as an emitter.
+ # We will look in that Environment variable for
+ # a callable to use as the actual emitter.
+ var = SCons.Util.get_environment_var(emitter)
+ if not var:
+ raise UserError("Supplied emitter '%s' does not appear to refer to an Environment variable" % emitter)
+ kw['emitter'] = EmitterProxy(var)
+ elif SCons.Util.is_Dict(emitter):
+ kw['emitter'] = DictEmitter(emitter)
+ elif SCons.Util.is_List(emitter):
+ kw['emitter'] = ListEmitter(emitter)
+
+ result = BuilderBase(**kw)
+
+ if not composite is None:
+ result = CompositeBuilder(result, composite)
+
+ return result
+
+def _node_errors(builder, env, tlist, slist):
+ """Validate that the lists of target and source nodes are
+ legal for this builder and environment. Raise errors or
+ issue warnings as appropriate.
+ """
+
+ # First, figure out if there are any errors in the way the targets
+ # were specified.
+ for t in tlist:
+ if t.side_effect:
+ raise UserError("Multiple ways to build the same target were specified for: %s" % t)
+ if t.has_explicit_builder():
+ # Check for errors when the environments are different
+ # No error if environments are the same Environment instance
+ if (not t.env is None and not t.env is env and
+ # Check OverrideEnvironment case - no error if wrapped Environments
+ # are the same instance, and overrides lists match
+ not (getattr(t.env, '__subject', 0) is getattr(env, '__subject', 1) and
+ getattr(t.env, 'overrides', 0) == getattr(env, 'overrides', 1) and
+ not builder.multi)):
+ action = t.builder.action
+ t_contents = t.builder.action.get_contents(tlist, slist, t.env)
+ contents = builder.action.get_contents(tlist, slist, env)
+
+ if t_contents == contents:
+ msg = "Two different environments were specified for target %s,\n\tbut they appear to have the same action: %s" % (t, action.genstring(tlist, slist, t.env))
+ SCons.Warnings.warn(SCons.Warnings.DuplicateEnvironmentWarning, msg)
+ else:
+ try:
+ msg = "Two environments with different actions were specified for the same target: %s\n(action 1: %s)\n(action 2: %s)" % (t,t_contents.decode('utf-8'),contents.decode('utf-8'))
+ except UnicodeDecodeError as e:
+ msg = "Two environments with different actions were specified for the same target: %s"%t
+ raise UserError(msg)
+ if builder.multi:
+ if t.builder != builder:
+ msg = "Two different builders (%s and %s) were specified for the same target: %s" % (t.builder.get_name(env), builder.get_name(env), t)
+ raise UserError(msg)
+ # TODO(batch): list constructed each time!
+ if t.get_executor().get_all_targets() != tlist:
+ msg = "Two different target lists have a target in common: %s (from %s and from %s)" % (t, list(map(str, t.get_executor().get_all_targets())), list(map(str, tlist)))
+ raise UserError(msg)
+ elif t.sources != slist:
+ msg = "Multiple ways to build the same target were specified for: %s (from %s and from %s)" % (t, list(map(str, t.sources)), list(map(str, slist)))
+ raise UserError(msg)
+
+ if builder.single_source:
+ if len(slist) > 1:
+ raise UserError("More than one source given for single-source builder: targets=%s sources=%s" % (list(map(str,tlist)), list(map(str,slist))))
+
+class EmitterProxy(object):
+ """This is a callable class that can act as a
+ Builder emitter. It holds on to a string that
+ is a key into an Environment dictionary, and will
+ look there at actual build time to see if it holds
+ a callable. If so, we will call that as the actual
+ emitter."""
+ def __init__(self, var):
+ self.var = SCons.Util.to_String(var)
+
+ def __call__(self, target, source, env):
+ emitter = self.var
+
+ # Recursively substitute the variable.
+ # We can't use env.subst() because it deals only
+ # in strings. Maybe we should change that?
+ while SCons.Util.is_String(emitter) and emitter in env:
+ emitter = env[emitter]
+ if callable(emitter):
+ target, source = emitter(target, source, env)
+ elif SCons.Util.is_List(emitter):
+ for e in emitter:
+ target, source = e(target, source, env)
+
+ return (target, source)
+
+
+ def __eq__(self, other):
+ return self.var == other.var
+
+ def __lt__(self, other):
+ return self.var < other.var
+
+class BuilderBase(object):
+ """Base class for Builders, objects that create output
+ nodes (files) from input nodes (files).
+ """
+
+ def __init__(self, action = None,
+ prefix = '',
+ suffix = '',
+ src_suffix = '',
+ target_factory = None,
+ source_factory = None,
+ target_scanner = None,
+ source_scanner = None,
+ emitter = None,
+ multi = 0,
+ env = None,
+ single_source = 0,
+ name = None,
+ chdir = _null,
+ is_explicit = 1,
+ src_builder = None,
+ ensure_suffix = False,
+ **overrides):
+ if SCons.Debug.track_instances: logInstanceCreation(self, 'Builder.BuilderBase')
+ self._memo = {}
+ self.action = action
+ self.multi = multi
+ if SCons.Util.is_Dict(prefix):
+ prefix = CallableSelector(prefix)
+ self.prefix = prefix
+ if SCons.Util.is_Dict(suffix):
+ suffix = CallableSelector(suffix)
+ self.env = env
+ self.single_source = single_source
+ if 'overrides' in overrides:
+ SCons.Warnings.warn(SCons.Warnings.DeprecatedBuilderKeywordsWarning,
+ "The \"overrides\" keyword to Builder() creation has been deprecated;\n" +\
+ "\tspecify the items as keyword arguments to the Builder() call instead.")
+ overrides.update(overrides['overrides'])
+ del overrides['overrides']
+ if 'scanner' in overrides:
+ SCons.Warnings.warn(SCons.Warnings.DeprecatedBuilderKeywordsWarning,
+ "The \"scanner\" keyword to Builder() creation has been deprecated;\n"
+ "\tuse: source_scanner or target_scanner as appropriate.")
+ del overrides['scanner']
+ self.overrides = overrides
+
+ self.set_suffix(suffix)
+ self.set_src_suffix(src_suffix)
+ self.ensure_suffix = ensure_suffix
+
+ self.target_factory = target_factory
+ self.source_factory = source_factory
+ self.target_scanner = target_scanner
+ self.source_scanner = source_scanner
+
+ self.emitter = emitter
+
+ # Optional Builder name should only be used for Builders
+ # that don't get attached to construction environments.
+ if name:
+ self.name = name
+ self.executor_kw = {}
+ if not chdir is _null:
+ self.executor_kw['chdir'] = chdir
+ self.is_explicit = is_explicit
+
+ if src_builder is None:
+ src_builder = []
+ elif not SCons.Util.is_List(src_builder):
+ src_builder = [ src_builder ]
+ self.src_builder = src_builder
+
+ def __nonzero__(self):
+ raise InternalError("Do not test for the Node.builder attribute directly; use Node.has_builder() instead")
+
+ def __bool__(self):
+ return self.__nonzero__()
+
+ def get_name(self, env):
+ """Attempts to get the name of the Builder.
+
+ Look at the BUILDERS variable of env, expecting it to be a
+ dictionary containing this Builder, and return the key of the
+ dictionary. If there's no key, then return a directly-configured
+ name (if there is one) or the name of the class (by default)."""
+
+ try:
+ index = list(env['BUILDERS'].values()).index(self)
+ return list(env['BUILDERS'].keys())[index]
+ except (AttributeError, KeyError, TypeError, ValueError):
+ try:
+ return self.name
+ except AttributeError:
+ return str(self.__class__)
+
+ def __eq__(self, other):
+ return self.__dict__ == other.__dict__
+
+ def splitext(self, path, env=None):
+ if not env:
+ env = self.env
+ if env:
+ suffixes = self.src_suffixes(env)
+ else:
+ suffixes = []
+ return match_splitext(path, suffixes)
+
+ def _adjustixes(self, files, pre, suf, ensure_suffix=False):
+ if not files:
+ return []
+ result = []
+ if not SCons.Util.is_List(files):
+ files = [files]
+
+ for f in files:
+ if SCons.Util.is_String(f):
+ f = SCons.Util.adjustixes(f, pre, suf, ensure_suffix)
+ result.append(f)
+ return result
+
+ def _create_nodes(self, env, target = None, source = None):
+ """Create and return lists of target and source nodes.
+ """
+ src_suf = self.get_src_suffix(env)
+
+ target_factory = env.get_factory(self.target_factory)
+ source_factory = env.get_factory(self.source_factory)
+
+ source = self._adjustixes(source, None, src_suf)
+ slist = env.arg2nodes(source, source_factory)
+
+ pre = self.get_prefix(env, slist)
+ suf = self.get_suffix(env, slist)
+
+ if target is None:
+ try:
+ t_from_s = slist[0].target_from_source
+ except AttributeError:
+ raise UserError("Do not know how to create a target from source `%s'" % slist[0])
+ except IndexError:
+ tlist = []
+ else:
+ splitext = lambda S: self.splitext(S,env)
+ tlist = [ t_from_s(pre, suf, splitext) ]
+ else:
+ target = self._adjustixes(target, pre, suf, self.ensure_suffix)
+ tlist = env.arg2nodes(target, target_factory, target=target, source=source)
+
+ if self.emitter:
+ # The emitter is going to do str(node), but because we're
+ # being called *from* a builder invocation, the new targets
+ # don't yet have a builder set on them and will look like
+ # source files. Fool the emitter's str() calls by setting
+ # up a temporary builder on the new targets.
+ new_targets = []
+ for t in tlist:
+ if not t.is_derived():
+ t.builder_set(self)
+ new_targets.append(t)
+
+ orig_tlist = tlist[:]
+ orig_slist = slist[:]
+
+ target, source = self.emitter(target=tlist, source=slist, env=env)
+
+ # Now delete the temporary builders that we attached to any
+ # new targets, so that _node_errors() doesn't do weird stuff
+ # to them because it thinks they already have builders.
+ for t in new_targets:
+ if t.builder is self:
+ # Only delete the temporary builder if the emitter
+ # didn't change it on us.
+ t.builder_set(None)
+
+ # Have to call arg2nodes yet again, since it is legal for
+ # emitters to spit out strings as well as Node instances.
+ tlist = env.arg2nodes(target, target_factory,
+ target=orig_tlist, source=orig_slist)
+ slist = env.arg2nodes(source, source_factory,
+ target=orig_tlist, source=orig_slist)
+
+ return tlist, slist
+
+ def _execute(self, env, target, source, overwarn={}, executor_kw={}):
+ # We now assume that target and source are lists or None.
+ if self.src_builder:
+ source = self.src_builder_sources(env, source, overwarn)
+
+ if self.single_source and len(source) > 1 and target is None:
+ result = []
+ if target is None: target = [None]*len(source)
+ for tgt, src in zip(target, source):
+ if not tgt is None: tgt = [tgt]
+ if not src is None: src = [src]
+ result.extend(self._execute(env, tgt, src, overwarn))
+ return SCons.Node.NodeList(result)
+
+ overwarn.warn()
+
+ tlist, slist = self._create_nodes(env, target, source)
+
+ # Check for errors with the specified target/source lists.
+ _node_errors(self, env, tlist, slist)
+
+ # The targets are fine, so find or make the appropriate Executor to
+ # build this particular list of targets from this particular list of
+ # sources.
+
+ executor = None
+ key = None
+
+ if self.multi:
+ try:
+ executor = tlist[0].get_executor(create = 0)
+ except (AttributeError, IndexError):
+ pass
+ else:
+ executor.add_sources(slist)
+
+ if executor is None:
+ if not self.action:
+ fmt = "Builder %s must have an action to build %s."
+ raise UserError(fmt % (self.get_name(env or self.env),
+ list(map(str,tlist))))
+ key = self.action.batch_key(env or self.env, tlist, slist)
+ if key:
+ try:
+ executor = SCons.Executor.GetBatchExecutor(key)
+ except KeyError:
+ pass
+ else:
+ executor.add_batch(tlist, slist)
+
+ if executor is None:
+ executor = SCons.Executor.Executor(self.action, env, [],
+ tlist, slist, executor_kw)
+ if key:
+ SCons.Executor.AddBatchExecutor(key, executor)
+
+ # Now set up the relevant information in the target Nodes themselves.
+ for t in tlist:
+ t.cwd = env.fs.getcwd()
+ t.builder_set(self)
+ t.env_set(env)
+ t.add_source(slist)
+ t.set_executor(executor)
+ t.set_explicit(self.is_explicit)
+
+ return SCons.Node.NodeList(tlist)
+
+ def __call__(self, env, target=None, source=None, chdir=_null, **kw):
+ # We now assume that target and source are lists or None.
+ # The caller (typically Environment.BuilderWrapper) is
+ # responsible for converting any scalar values to lists.
+ if chdir is _null:
+ ekw = self.executor_kw
+ else:
+ ekw = self.executor_kw.copy()
+ ekw['chdir'] = chdir
+ if 'chdir' in ekw and SCons.Util.is_String(ekw['chdir']):
+ ekw['chdir'] = env.subst(ekw['chdir'])
+ if kw:
+ if 'srcdir' in kw:
+ def prependDirIfRelative(f, srcdir=kw['srcdir']):
+ import os.path
+ if SCons.Util.is_String(f) and not os.path.isabs(f):
+ f = os.path.join(srcdir, f)
+ return f
+ if not SCons.Util.is_List(source):
+ source = [source]
+ source = list(map(prependDirIfRelative, source))
+ del kw['srcdir']
+ if self.overrides:
+ env_kw = self.overrides.copy()
+ env_kw.update(kw)
+ else:
+ env_kw = kw
+ else:
+ env_kw = self.overrides
+ env = env.Override(env_kw)
+ return self._execute(env, target, source, OverrideWarner(kw), ekw)
+
+ def adjust_suffix(self, suff):
+ if suff and not suff[0] in [ '.', '_', '$' ]:
+ return '.' + suff
+ return suff
+
+ def get_prefix(self, env, sources=[]):
+ prefix = self.prefix
+ if callable(prefix):
+ prefix = prefix(env, sources)
+ return env.subst(prefix)
+
+ def set_suffix(self, suffix):
+ if not callable(suffix):
+ suffix = self.adjust_suffix(suffix)
+ self.suffix = suffix
+
+ def get_suffix(self, env, sources=[]):
+ suffix = self.suffix
+ if callable(suffix):
+ suffix = suffix(env, sources)
+ return env.subst(suffix)
+
+ def set_src_suffix(self, src_suffix):
+ if not src_suffix:
+ src_suffix = []
+ elif not SCons.Util.is_List(src_suffix):
+ src_suffix = [ src_suffix ]
+ self.src_suffix = [callable(suf) and suf or self.adjust_suffix(suf) for suf in src_suffix]
+
+ def get_src_suffix(self, env):
+ """Get the first src_suffix in the list of src_suffixes."""
+ ret = self.src_suffixes(env)
+ if not ret:
+ return ''
+ return ret[0]
+
+ def add_emitter(self, suffix, emitter):
+ """Add a suffix-emitter mapping to this Builder.
+
+ This assumes that emitter has been initialized with an
+ appropriate dictionary type, and will throw a TypeError if
+ not, so the caller is responsible for knowing that this is an
+ appropriate method to call for the Builder in question.
+ """
+ self.emitter[suffix] = emitter
+
+ def add_src_builder(self, builder):
+ """
+ Add a new Builder to the list of src_builders.
+
+ This requires wiping out cached values so that the computed
+ lists of source suffixes get re-calculated.
+ """
+ self._memo = {}
+ self.src_builder.append(builder)
+
+ def _get_sdict(self, env):
+ """
+ Returns a dictionary mapping all of the source suffixes of all
+ src_builders of this Builder to the underlying Builder that
+ should be called first.
+
+ This dictionary is used for each target specified, so we save a
+ lot of extra computation by memoizing it for each construction
+ environment.
+
+ Note that this is re-computed each time, not cached, because there
+ might be changes to one of our source Builders (or one of their
+ source Builders, and so on, and so on...) that we can't "see."
+
+ The underlying methods we call cache their computed values,
+ though, so we hope repeatedly aggregating them into a dictionary
+ like this won't be too big a hit. We may need to look for a
+ better way to do this if performance data show this has turned
+ into a significant bottleneck.
+ """
+ sdict = {}
+ for bld in self.get_src_builders(env):
+ for suf in bld.src_suffixes(env):
+ sdict[suf] = bld
+ return sdict
+
+ def src_builder_sources(self, env, source, overwarn={}):
+ sdict = self._get_sdict(env)
+
+ src_suffixes = self.src_suffixes(env)
+
+ lengths = list(set(map(len, src_suffixes)))
+
+ def match_src_suffix(name, src_suffixes=src_suffixes, lengths=lengths):
+ node_suffixes = [name[-l:] for l in lengths]
+ for suf in src_suffixes:
+ if suf in node_suffixes:
+ return suf
+ return None
+
+ result = []
+ for s in SCons.Util.flatten(source):
+ if SCons.Util.is_String(s):
+ match_suffix = match_src_suffix(env.subst(s))
+ if not match_suffix and not '.' in s:
+ src_suf = self.get_src_suffix(env)
+ s = self._adjustixes(s, None, src_suf)[0]
+ else:
+ match_suffix = match_src_suffix(s.name)
+ if match_suffix:
+ try:
+ bld = sdict[match_suffix]
+ except KeyError:
+ result.append(s)
+ else:
+ tlist = bld._execute(env, None, [s], overwarn)
+ # If the subsidiary Builder returned more than one
+ # target, then filter out any sources that this
+ # Builder isn't capable of building.
+ if len(tlist) > 1:
+ tlist = [t for t in tlist if match_src_suffix(t.name)]
+ result.extend(tlist)
+ else:
+ result.append(s)
+
+ source_factory = env.get_factory(self.source_factory)
+
+ return env.arg2nodes(result, source_factory)
+
+ def _get_src_builders_key(self, env):
+ return id(env)
+
+ @SCons.Memoize.CountDictCall(_get_src_builders_key)
+ def get_src_builders(self, env):
+ """
+ Returns the list of source Builders for this Builder.
+
+ This exists mainly to look up Builders referenced as
+ strings in the 'BUILDER' variable of the construction
+ environment and cache the result.
+ """
+ memo_key = id(env)
+ try:
+ memo_dict = self._memo['get_src_builders']
+ except KeyError:
+ memo_dict = {}
+ self._memo['get_src_builders'] = memo_dict
+ else:
+ try:
+ return memo_dict[memo_key]
+ except KeyError:
+ pass
+
+ builders = []
+ for bld in self.src_builder:
+ if SCons.Util.is_String(bld):
+ try:
+ bld = env['BUILDERS'][bld]
+ except KeyError:
+ continue
+ builders.append(bld)
+
+ memo_dict[memo_key] = builders
+ return builders
+
+ def _subst_src_suffixes_key(self, env):
+ return id(env)
+
+ @SCons.Memoize.CountDictCall(_subst_src_suffixes_key)
+ def subst_src_suffixes(self, env):
+ """
+ The suffix list may contain construction variable expansions,
+ so we have to evaluate the individual strings. To avoid doing
+ this over and over, we memoize the results for each construction
+ environment.
+ """
+ memo_key = id(env)
+ try:
+ memo_dict = self._memo['subst_src_suffixes']
+ except KeyError:
+ memo_dict = {}
+ self._memo['subst_src_suffixes'] = memo_dict
+ else:
+ try:
+ return memo_dict[memo_key]
+ except KeyError:
+ pass
+ suffixes = [env.subst(x) for x in self.src_suffix]
+ memo_dict[memo_key] = suffixes
+ return suffixes
+
+ def src_suffixes(self, env):
+ """
+ Returns the list of source suffixes for all src_builders of this
+ Builder.
+
+ This is essentially a recursive descent of the src_builder "tree."
+ (This value isn't cached because there may be changes in a
+ src_builder many levels deep that we can't see.)
+ """
+ sdict = {}
+ suffixes = self.subst_src_suffixes(env)
+ for s in suffixes:
+ sdict[s] = 1
+ for builder in self.get_src_builders(env):
+ for s in builder.src_suffixes(env):
+ if s not in sdict:
+ sdict[s] = 1
+ suffixes.append(s)
+ return suffixes
+
+class CompositeBuilder(SCons.Util.Proxy):
+ """A Builder Proxy whose main purpose is to always have
+ a DictCmdGenerator as its action, and to provide access
+ to the DictCmdGenerator's add_action() method.
+ """
+
+ def __init__(self, builder, cmdgen):
+ if SCons.Debug.track_instances: logInstanceCreation(self, 'Builder.CompositeBuilder')
+ SCons.Util.Proxy.__init__(self, builder)
+
+ # cmdgen should always be an instance of DictCmdGenerator.
+ self.cmdgen = cmdgen
+ self.builder = builder
+
+ __call__ = SCons.Util.Delegate('__call__')
+
+ def add_action(self, suffix, action):
+ self.cmdgen.add_action(suffix, action)
+ self.set_src_suffix(self.cmdgen.src_suffixes())
+
+def is_a_Builder(obj):
+ """"Returns True if the specified obj is one of our Builder classes.
+
+ The test is complicated a bit by the fact that CompositeBuilder
+ is a proxy, not a subclass of BuilderBase.
+ """
+ return (isinstance(obj, BuilderBase)
+ or isinstance(obj, CompositeBuilder)
+ or callable(obj))
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/BuilderTests.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/BuilderTests.py
new file mode 100644
index 0000000..1e544a1
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/BuilderTests.py
@@ -0,0 +1,1651 @@
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+from __future__ import print_function
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import SCons.compat
+
+# Define a null function for use as a builder action.
+# Where this is defined in the file seems to affect its
+# byte-code contents, so try to minimize changes by
+# defining it here, before we even import anything.
+def Func():
+ pass
+
+import collections
+import io
+import os.path
+import re
+import sys
+import unittest
+
+import TestCmd
+import TestUnit
+
+import SCons.Action
+import SCons.Builder
+import SCons.Environment
+import SCons.Errors
+import SCons.Subst
+import SCons.Util
+
+sys.stdout = io.StringIO()
+
+# Initial setup of the common environment for all tests,
+# a temporary working directory containing a
+# script for writing arguments to an output file.
+#
+# We don't do this as a setUp() method because it's
+# unnecessary to create a separate directory and script
+# for each test, they can just use the one.
+test = TestCmd.TestCmd(workdir = '')
+
+outfile = test.workpath('outfile')
+outfile2 = test.workpath('outfile2')
+
+infile = test.workpath('infile')
+test.write(infile, "infile\n")
+
+show_string = None
+
+scons_env = SCons.Environment.Environment()
+
+env_arg2nodes_called = None
+
+class Environment(object):
+ def __init__(self, **kw):
+ self.d = {}
+ self.d['SHELL'] = scons_env['SHELL']
+ self.d['SPAWN'] = scons_env['SPAWN']
+ self.d['ESCAPE'] = scons_env['ESCAPE']
+ for k, v in kw.items():
+ self.d[k] = v
+ global env_arg2nodes_called
+ env_arg2nodes_called = None
+ self.scanner = None
+ self.fs = SCons.Node.FS.FS()
+ def subst(self, s):
+ if not SCons.Util.is_String(s):
+ return s
+ def substitute(m, d=self.d):
+ return d.get(m.group(1), '')
+ return re.sub(r'\$(\w+)', substitute, s)
+ def subst_target_source(self, string, raw=0, target=None,
+ source=None, dict=None, conv=None):
+ return SCons.Subst.scons_subst(string, self, raw, target,
+ source, dict, conv)
+ def subst_list(self, string, raw=0, target=None, source=None, conv=None):
+ return SCons.Subst.scons_subst_list(string, self, raw, target,
+ source, {}, {}, conv)
+ def arg2nodes(self, args, factory, **kw):
+ global env_arg2nodes_called
+ env_arg2nodes_called = 1
+ if not SCons.Util.is_List(args):
+ args = [args]
+ list = []
+ for a in args:
+ if SCons.Util.is_String(a):
+ a = factory(self.subst(a))
+ list.append(a)
+ return list
+ def get_factory(self, factory):
+ return factory or self.fs.File
+ def get_scanner(self, ext):
+ return self.scanner
+ def Dictionary(self):
+ return {}
+ def autogenerate(self, dir=''):
+ return {}
+ def __setitem__(self, item, var):
+ self.d[item] = var
+ def __getitem__(self, item):
+ return self.d[item]
+ def __contains__(self, item):
+ return self.d.__contains__(item)
+ def has_key(self, item):
+ return item in self.d
+ def keys(self):
+ return list(self.d.keys())
+ def get(self, key, value=None):
+ return self.d.get(key, value)
+ def Override(self, overrides):
+ env = Environment(**self.d)
+ env.d.update(overrides)
+ env.scanner = self.scanner
+ return env
+ def _update(self, dict):
+ self.d.update(dict)
+ def items(self):
+ return list(self.d.items())
+ def sig_dict(self):
+ d = {}
+ for k,v in self.items(): d[k] = v
+ d['TARGETS'] = ['__t1__', '__t2__', '__t3__', '__t4__', '__t5__', '__t6__']
+ d['TARGET'] = d['TARGETS'][0]
+ d['SOURCES'] = ['__s1__', '__s2__', '__s3__', '__s4__', '__s5__', '__s6__']
+ d['SOURCE'] = d['SOURCES'][0]
+ return d
+ def __eq__(self, other):
+ return self.scanner == other.scanner or self.d == other.d
+
+class MyAction(object):
+ def __init__(self, action):
+ self.action = action
+ def __call__(self, *args, **kw):
+ pass
+ def get_executor(self, env, overrides, tlist, slist, executor_kw):
+ return ['executor'] + [self.action]
+
+class MyNode_without_target_from_source(object):
+ def __init__(self, name):
+ self.name = name
+ self.sources = []
+ self.builder = None
+ self.is_explicit = None
+ self.side_effect = 0
+ def get_suffix(self):
+ return os.path.splitext(self.name)[1]
+ def disambiguate(self):
+ return self
+ def __str__(self):
+ return self.name
+ def builder_set(self, builder):
+ self.builder = builder
+ def has_builder(self):
+ return not self.builder is None
+ def set_explicit(self, is_explicit):
+ self.is_explicit = is_explicit
+ def has_explicit_builder(self):
+ return self.is_explicit
+ def env_set(self, env, safe=0):
+ self.env = env
+ def add_source(self, source):
+ self.sources.extend(source)
+ def scanner_key(self):
+ return self.name
+ def is_derived(self):
+ return self.has_builder()
+ def generate_build_env(self, env):
+ return env
+ def get_build_env(self):
+ return self.executor.get_build_env()
+ def set_executor(self, executor):
+ self.executor = executor
+ def get_executor(self, create=1):
+ return self.executor
+
+class MyNode(MyNode_without_target_from_source):
+ def target_from_source(self, prefix, suffix, stripext):
+ return MyNode(prefix + stripext(str(self))[0] + suffix)
+
+class BuilderTestCase(unittest.TestCase):
+
+ def test__init__(self):
+ """Test simple Builder creation
+ """
+ builder = SCons.Builder.Builder(action="foo")
+ assert not builder is None, builder
+ builder = SCons.Builder.Builder(action="foo", OVERRIDE='x')
+ x = builder.overrides['OVERRIDE']
+ assert x == 'x', x
+
+ def test__nonzero__(self):
+ """Test a builder raising an exception when __nonzero__ is called
+ """
+ builder = SCons.Builder.Builder(action="foo")
+ exc_caught = None
+ try:
+ builder.__nonzero__()
+ except SCons.Errors.InternalError:
+ exc_caught = 1
+ assert exc_caught, "did not catch expected InternalError exception"
+
+ class Node(object):
+ pass
+
+ n = Node()
+ n.builder = builder
+ exc_caught = None
+ try:
+ if n.builder:
+ pass
+ except SCons.Errors.InternalError:
+ exc_caught = 1
+ assert exc_caught, "did not catch expected InternalError exception"
+
+ def test__call__(self):
+ """Test calling a builder to establish source dependencies
+ """
+ env = Environment()
+ builder = SCons.Builder.Builder(action="foo",
+ target_factory=MyNode,
+ source_factory=MyNode)
+
+ tgt = builder(env, source=[])
+ assert tgt == [], tgt
+
+ n1 = MyNode("n1")
+ n2 = MyNode("n2")
+ builder(env, target = n1, source = n2)
+ assert env_arg2nodes_called
+ assert n1.env == env, n1.env
+ assert n1.builder == builder, n1.builder
+ assert n1.sources == [n2], n1.sources
+ assert n1.executor, "no executor found"
+ assert not hasattr(n2, 'env')
+
+ l = [1]
+ ul = collections.UserList([2])
+ try:
+ l.extend(ul)
+ except TypeError:
+ def mystr(l):
+ return str(list(map(str, l)))
+ else:
+ mystr = str
+
+ nnn1 = MyNode("nnn1")
+ nnn2 = MyNode("nnn2")
+ tlist = builder(env, target = [nnn1, nnn2], source = [])
+ s = mystr(tlist)
+ assert s == "['nnn1', 'nnn2']", s
+ l = list(map(str, tlist))
+ assert l == ['nnn1', 'nnn2'], l
+
+ tlist = builder(env, target = 'n3', source = 'n4')
+ s = mystr(tlist)
+ assert s == "['n3']", s
+ target = tlist[0]
+ l = list(map(str, tlist))
+ assert l == ['n3'], l
+ assert target.name == 'n3'
+ assert target.sources[0].name == 'n4'
+
+ tlist = builder(env, target = 'n4 n5', source = ['n6 n7'])
+ s = mystr(tlist)
+ assert s == "['n4 n5']", s
+ l = list(map(str, tlist))
+ assert l == ['n4 n5'], l
+ target = tlist[0]
+ assert target.name == 'n4 n5'
+ assert target.sources[0].name == 'n6 n7'
+
+ tlist = builder(env, target = ['n8 n9'], source = 'n10 n11')
+ s = mystr(tlist)
+ assert s == "['n8 n9']", s
+ l = list(map(str, tlist))
+ assert l == ['n8 n9'], l
+ target = tlist[0]
+ assert target.name == 'n8 n9'
+ assert target.sources[0].name == 'n10 n11'
+
+ # A test to be uncommented when we freeze the environment
+ # as part of calling the builder.
+ #env1 = Environment(VAR='foo')
+ #target = builder(env1, target = 'n12', source = 'n13')
+ #env1['VAR'] = 'bar'
+ #be = target.get_build_env()
+ #assert be['VAR'] == 'foo', be['VAR']
+
+ try: unicode
+ except NameError:
+ uni = str
+ else:
+ uni = unicode
+
+ target = builder(env, target = uni('n12 n13'),
+ source = [uni('n14 n15')])[0]
+ assert target.name == uni('n12 n13')
+ assert target.sources[0].name == uni('n14 n15')
+
+ target = builder(env, target = [uni('n16 n17')],
+ source = uni('n18 n19'))[0]
+ assert target.name == uni('n16 n17')
+ assert target.sources[0].name == uni('n18 n19')
+
+ n20 = MyNode_without_target_from_source('n20')
+ flag = 0
+ try:
+ target = builder(env, None, source=n20)
+ except SCons.Errors.UserError as e:
+ flag = 1
+ assert flag, "UserError should be thrown if a source node can't create a target."
+
+ builder = SCons.Builder.Builder(action="foo",
+ target_factory=MyNode,
+ source_factory=MyNode,
+ prefix='p-',
+ suffix='.s')
+ target = builder(env, None, source='n21')[0]
+ assert target.name == 'p-n21.s', target
+
+ builder = SCons.Builder.Builder(misspelled_action="foo",
+ suffix = '.s')
+ try:
+ builder(env, target = 'n22', source = 'n22')
+ except SCons.Errors.UserError as e:
+ pass
+ else:
+ raise Exception("Did not catch expected UserError.")
+
+ builder = SCons.Builder.Builder(action="foo")
+ target = builder(env, None, source='n22', srcdir='src_dir')[0]
+ p = target.sources[0].get_internal_path()
+ assert p == os.path.join('src_dir', 'n22'), p
+
+ def test_mistaken_variables(self):
+ """Test keyword arguments that are often mistakes
+ """
+ import SCons.Warnings
+ env = Environment()
+ builder = SCons.Builder.Builder(action="foo")
+
+ save_warn = SCons.Warnings.warn
+ warned = []
+ def my_warn(exception, warning, warned=warned):
+ warned.append(warning)
+ SCons.Warnings.warn = my_warn
+
+ try:
+ target = builder(env, 'mistaken1', sources='mistaken1.c')
+ assert warned == ["Did you mean to use `source' instead of `sources'?"], warned
+ del warned[:]
+
+ target = builder(env, 'mistaken2', targets='mistaken2.c')
+ assert warned == ["Did you mean to use `target' instead of `targets'?"], warned
+ del warned[:]
+
+ target = builder(env, 'mistaken3', targets='mistaken3', sources='mistaken3.c')
+ assert "Did you mean to use `source' instead of `sources'?" in warned, warned
+ assert "Did you mean to use `target' instead of `targets'?" in warned, warned
+ del warned[:]
+ finally:
+ SCons.Warnings.warn = save_warn
+
+ def test_action(self):
+ """Test Builder creation
+
+ Verify that we can retrieve the supplied action attribute.
+ """
+ builder = SCons.Builder.Builder(action="foo")
+ assert builder.action.cmd_list == "foo"
+
+ def func():
+ pass
+ builder = SCons.Builder.Builder(action=func)
+ assert isinstance(builder.action, SCons.Action.FunctionAction)
+ # Preserve the following so that the baseline test will fail.
+ # Remove it in favor of the previous test at some convenient
+ # point in the future.
+ assert builder.action.execfunction == func
+
+ def test_generator(self):
+ """Test Builder creation given a generator function."""
+
+ def generator():
+ pass
+
+ builder = SCons.Builder.Builder(generator=generator)
+ assert builder.action.generator == generator
+
+ def test_get_name(self):
+ """Test the get_name() method
+ """
+
+ def test_cmp(self):
+ """Test simple comparisons of Builder objects
+ """
+ b1 = SCons.Builder.Builder(src_suffix = '.o')
+ b2 = SCons.Builder.Builder(src_suffix = '.o')
+ assert b1 == b2
+ b3 = SCons.Builder.Builder(src_suffix = '.x')
+ assert b1 != b3
+ assert b2 != b3
+
+ def test_target_factory(self):
+ """Test a Builder that creates target nodes of a specified class
+ """
+ class Foo(object):
+ pass
+ def FooFactory(target):
+ global Foo
+ return Foo(target)
+ builder = SCons.Builder.Builder(target_factory = FooFactory)
+ assert builder.target_factory is FooFactory
+ assert not builder.source_factory is FooFactory
+
+ def test_source_factory(self):
+ """Test a Builder that creates source nodes of a specified class
+ """
+ class Foo(object):
+ pass
+ def FooFactory(source):
+ global Foo
+ return Foo(source)
+ builder = SCons.Builder.Builder(source_factory = FooFactory)
+ assert not builder.target_factory is FooFactory
+ assert builder.source_factory is FooFactory
+
+ def test_splitext(self):
+ """Test the splitext() method attached to a Builder."""
+ b = SCons.Builder.Builder()
+ assert b.splitext('foo') == ('foo','')
+ assert b.splitext('foo.bar') == ('foo','.bar')
+ assert b.splitext(os.path.join('foo.bar', 'blat')) == (os.path.join('foo.bar', 'blat'),'')
+
+ class MyBuilder(SCons.Builder.BuilderBase):
+ def splitext(self, path):
+ return "called splitext()"
+
+ b = MyBuilder()
+ ret = b.splitext('xyz.c')
+ assert ret == "called splitext()", ret
+
+ def test_adjust_suffix(self):
+ """Test how a Builder adjusts file suffixes
+ """
+ b = SCons.Builder.Builder()
+ assert b.adjust_suffix('.foo') == '.foo'
+ assert b.adjust_suffix('foo') == '.foo'
+ assert b.adjust_suffix('$foo') == '$foo'
+
+ class MyBuilder(SCons.Builder.BuilderBase):
+ def adjust_suffix(self, suff):
+ return "called adjust_suffix()"
+
+ b = MyBuilder()
+ ret = b.adjust_suffix('.foo')
+ assert ret == "called adjust_suffix()", ret
+
+ def test_prefix(self):
+ """Test Builder creation with a specified target prefix
+
+ Make sure that there is no '.' separator appended.
+ """
+ env = Environment()
+ builder = SCons.Builder.Builder(prefix = 'lib.')
+ assert builder.get_prefix(env) == 'lib.'
+ builder = SCons.Builder.Builder(prefix = 'lib', action='')
+ assert builder.get_prefix(env) == 'lib'
+ tgt = builder(env, target = 'tgt1', source = 'src1')[0]
+ assert tgt.get_internal_path() == 'libtgt1', \
+ "Target has unexpected name: %s" % tgt.get_internal_path()
+ tgt = builder(env, target = 'tgt2a tgt2b', source = 'src2')[0]
+ assert tgt.get_internal_path() == 'libtgt2a tgt2b', \
+ "Target has unexpected name: %s" % tgt.get_internal_path()
+ tgt = builder(env, target = None, source = 'src3')[0]
+ assert tgt.get_internal_path() == 'libsrc3', \
+ "Target has unexpected name: %s" % tgt.get_internal_path()
+ tgt = builder(env, target = None, source = 'lib/src4')[0]
+ assert tgt.get_internal_path() == os.path.join('lib', 'libsrc4'), \
+ "Target has unexpected name: %s" % tgt.get_internal_path()
+ tgt = builder(env, target = 'lib/tgt5', source = 'lib/src5')[0]
+ assert tgt.get_internal_path() == os.path.join('lib', 'libtgt5'), \
+ "Target has unexpected name: %s" % tgt.get_internal_path()
+
+ def gen_prefix(env, sources):
+ return "gen_prefix() says " + env['FOO']
+ my_env = Environment(FOO = 'xyzzy')
+ builder = SCons.Builder.Builder(prefix = gen_prefix)
+ assert builder.get_prefix(my_env) == "gen_prefix() says xyzzy"
+ my_env['FOO'] = 'abracadabra'
+ assert builder.get_prefix(my_env) == "gen_prefix() says abracadabra"
+
+ def my_emit(env, sources):
+ return env.subst('$EMIT')
+ my_env = Environment(FOO = '.foo', EMIT = 'emit-')
+ builder = SCons.Builder.Builder(prefix = {None : 'default-',
+ '.in' : 'out-',
+ '.x' : 'y-',
+ '$FOO' : 'foo-',
+ '.zzz' : my_emit},
+ action = '')
+ tgt = builder(my_env, target = None, source = 'f1')[0]
+ assert tgt.get_internal_path() == 'default-f1', tgt.get_internal_path()
+ tgt = builder(my_env, target = None, source = 'f2.c')[0]
+ assert tgt.get_internal_path() == 'default-f2', tgt.get_internal_path()
+ tgt = builder(my_env, target = None, source = 'f3.in')[0]
+ assert tgt.get_internal_path() == 'out-f3', tgt.get_internal_path()
+ tgt = builder(my_env, target = None, source = 'f4.x')[0]
+ assert tgt.get_internal_path() == 'y-f4', tgt.get_internal_path()
+ tgt = builder(my_env, target = None, source = 'f5.foo')[0]
+ assert tgt.get_internal_path() == 'foo-f5', tgt.get_internal_path()
+ tgt = builder(my_env, target = None, source = 'f6.zzz')[0]
+ assert tgt.get_internal_path() == 'emit-f6', tgt.get_internal_path()
+
+ def test_set_suffix(self):
+ """Test the set_suffix() method"""
+ b = SCons.Builder.Builder(action='')
+ env = Environment(XSUFFIX = '.x')
+
+ s = b.get_suffix(env)
+ assert s == '', s
+
+ b.set_suffix('.foo')
+ s = b.get_suffix(env)
+ assert s == '.foo', s
+
+ b.set_suffix('$XSUFFIX')
+ s = b.get_suffix(env)
+ assert s == '.x', s
+
+ def test_src_suffix(self):
+ """Test Builder creation with a specified source file suffix
+
+ Make sure that the '.' separator is appended to the
+ beginning if it isn't already present.
+ """
+ env = Environment(XSUFFIX = '.x', YSUFFIX = '.y')
+
+ b1 = SCons.Builder.Builder(src_suffix = '.c', action='')
+ assert b1.src_suffixes(env) == ['.c'], b1.src_suffixes(env)
+
+ tgt = b1(env, target = 'tgt2', source = 'src2')[0]
+ assert tgt.sources[0].get_internal_path() == 'src2.c', \
+ "Source has unexpected name: %s" % tgt.sources[0].get_internal_path()
+
+ tgt = b1(env, target = 'tgt3', source = 'src3a src3b')[0]
+ assert len(tgt.sources) == 1
+ assert tgt.sources[0].get_internal_path() == 'src3a src3b.c', \
+ "Unexpected tgt.sources[0] name: %s" % tgt.sources[0].get_internal_path()
+
+ b2 = SCons.Builder.Builder(src_suffix = '.2', src_builder = b1)
+ r = sorted(b2.src_suffixes(env))
+ assert r == ['.2', '.c'], r
+
+ b3 = SCons.Builder.Builder(action = {'.3a' : '', '.3b' : ''})
+ s = sorted(b3.src_suffixes(env))
+ assert s == ['.3a', '.3b'], s
+
+ b4 = SCons.Builder.Builder(src_suffix = '$XSUFFIX')
+ assert b4.src_suffixes(env) == ['.x'], b4.src_suffixes(env)
+
+ b5 = SCons.Builder.Builder(action = { '.y' : ''})
+ assert b5.src_suffixes(env) == ['.y'], b5.src_suffixes(env)
+
+ def test_srcsuffix_nonext(self):
+ "Test target generation from non-extension source suffixes"
+ env = Environment()
+ b6 = SCons.Builder.Builder(action = '',
+ src_suffix='_src.a',
+ suffix='.b')
+ tgt = b6(env, target=None, source='foo_src.a')
+ assert str(tgt[0]) == 'foo.b', str(tgt[0])
+
+ b7 = SCons.Builder.Builder(action = '',
+ src_suffix='_source.a',
+ suffix='_obj.b')
+ b8 = SCons.Builder.Builder(action = '',
+ src_builder=b7,
+ suffix='.c')
+ tgt = b8(env, target=None, source='foo_source.a')
+ assert str(tgt[0]) == 'foo_obj.c', str(tgt[0])
+ src = env.fs.File('foo_source.a')
+ tgt = b8(env, target=None, source=src)
+ assert str(tgt[0]) == 'foo_obj.c', str(tgt[0])
+
+ b9 = SCons.Builder.Builder(action={'_src.a' : 'srcaction'},
+ suffix='.c')
+ b9.add_action('_altsrc.b', 'altaction')
+ tgt = b9(env, target=None, source='foo_altsrc.b')
+ assert str(tgt[0]) == 'foo.c', str(tgt[0])
+
+ def test_src_suffix_expansion(self):
+ """Test handling source suffixes when an expansion is involved"""
+ env = Environment(OBJSUFFIX = '.obj')
+
+ b1 = SCons.Builder.Builder(action = '',
+ src_suffix='.c',
+ suffix='.obj')
+ b2 = SCons.Builder.Builder(action = '',
+ src_builder=b1,
+ src_suffix='.obj',
+ suffix='.exe')
+ tgt = b2(env, target=None, source=['foo$OBJSUFFIX'])
+ s = list(map(str, tgt[0].sources))
+ assert s == ['foo.obj'], s
+
+ def test_suffix(self):
+ """Test Builder creation with a specified target suffix
+
+ Make sure that the '.' separator is appended to the
+ beginning if it isn't already present.
+ """
+ env = Environment()
+ builder = SCons.Builder.Builder(suffix = '.o')
+ assert builder.get_suffix(env) == '.o', builder.get_suffix(env)
+ builder = SCons.Builder.Builder(suffix = 'o', action='')
+ assert builder.get_suffix(env) == '.o', builder.get_suffix(env)
+ tgt = builder(env, target = 'tgt3', source = 'src3')[0]
+ assert tgt.get_internal_path() == 'tgt3.o', \
+ "Target has unexpected name: %s" % tgt.get_internal_path()
+ tgt = builder(env, target = 'tgt4a tgt4b', source = 'src4')[0]
+ assert tgt.get_internal_path() == 'tgt4a tgt4b.o', \
+ "Target has unexpected name: %s" % tgt.get_internal_path()
+ tgt = builder(env, target = None, source = 'src5')[0]
+ assert tgt.get_internal_path() == 'src5.o', \
+ "Target has unexpected name: %s" % tgt.get_internal_path()
+
+ def gen_suffix(env, sources):
+ return "gen_suffix() says " + env['BAR']
+ my_env = Environment(BAR = 'hocus pocus')
+ builder = SCons.Builder.Builder(suffix = gen_suffix)
+ assert builder.get_suffix(my_env) == "gen_suffix() says hocus pocus", builder.get_suffix(my_env)
+ my_env['BAR'] = 'presto chango'
+ assert builder.get_suffix(my_env) == "gen_suffix() says presto chango"
+
+ def my_emit(env, sources):
+ return env.subst('$EMIT')
+ my_env = Environment(BAR = '.bar', EMIT = '.emit')
+ builder = SCons.Builder.Builder(suffix = {None : '.default',
+ '.in' : '.out',
+ '.x' : '.y',
+ '$BAR' : '.new',
+ '.zzz' : my_emit},
+ action='')
+ tgt = builder(my_env, target = None, source = 'f1')[0]
+ assert tgt.get_internal_path() == 'f1.default', tgt.get_internal_path()
+ tgt = builder(my_env, target = None, source = 'f2.c')[0]
+ assert tgt.get_internal_path() == 'f2.default', tgt.get_internal_path()
+ tgt = builder(my_env, target = None, source = 'f3.in')[0]
+ assert tgt.get_internal_path() == 'f3.out', tgt.get_internal_path()
+ tgt = builder(my_env, target = None, source = 'f4.x')[0]
+ assert tgt.get_internal_path() == 'f4.y', tgt.get_internal_path()
+ tgt = builder(my_env, target = None, source = 'f5.bar')[0]
+ assert tgt.get_internal_path() == 'f5.new', tgt.get_internal_path()
+ tgt = builder(my_env, target = None, source = 'f6.zzz')[0]
+ assert tgt.get_internal_path() == 'f6.emit', tgt.get_internal_path()
+
+ def test_single_source(self):
+ """Test Builder with single_source flag set"""
+ def func(target, source, env):
+ open(str(target[0]), "w")
+ if (len(source) == 1 and len(target) == 1):
+ env['CNT'][0] = env['CNT'][0] + 1
+
+ env = Environment()
+ infiles = []
+ outfiles = []
+ for i in range(10):
+ infiles.append(test.workpath('%d.in' % i))
+ outfiles.append(test.workpath('%d.out' % i))
+ test.write(infiles[-1], "\n")
+ builder = SCons.Builder.Builder(action=SCons.Action.Action(func,None),
+ single_source = 1, suffix='.out')
+ env['CNT'] = [0]
+ tgt = builder(env, target=outfiles[0], source=infiles[0])[0]
+ s = str(tgt)
+ t = os.path.normcase(test.workpath('0.out'))
+ assert os.path.normcase(s) == t, s
+ tgt.prepare()
+ tgt.build()
+ assert env['CNT'][0] == 1, env['CNT'][0]
+ tgt = builder(env, outfiles[1], infiles[1])[0]
+ s = str(tgt)
+ t = os.path.normcase(test.workpath('1.out'))
+ assert os.path.normcase(s) == t, s
+ tgt.prepare()
+ tgt.build()
+ assert env['CNT'][0] == 2
+ tgts = builder(env, None, infiles[2:4])
+ s = list(map(str, tgts))
+ expect = [test.workpath('2.out'), test.workpath('3.out')]
+ expect = list(map(os.path.normcase, expect))
+ assert list(map(os.path.normcase, s)) == expect, s
+ for t in tgts: t.prepare()
+ tgts[0].build()
+ tgts[1].build()
+ assert env['CNT'][0] == 4
+ try:
+ tgt = builder(env, outfiles[4], infiles[4:6])
+ except SCons.Errors.UserError:
+ pass
+ else:
+ assert 0
+ try:
+ # The builder may output more than one target per input file.
+ tgt = builder(env, outfiles[4:6], infiles[4:6])
+ except SCons.Errors.UserError:
+ pass
+ else:
+ assert 0
+
+
+ def test_lists(self):
+ """Testing handling lists of targets and source"""
+ def function2(target, source, env, tlist = [outfile, outfile2], **kw):
+ for t in target:
+ open(str(t), 'w').write("function2\n")
+ for t in tlist:
+ if not t in list(map(str, target)):
+ open(t, 'w').write("function2\n")
+ return 1
+
+ env = Environment()
+ builder = SCons.Builder.Builder(action = function2)
+
+ tgts = builder(env, source=[])
+ assert tgts == [], tgts
+
+ tgts = builder(env, target = [outfile, outfile2], source = infile)
+ for t in tgts:
+ t.prepare()
+ try:
+ tgts[0].build()
+ except SCons.Errors.BuildError:
+ pass
+ c = test.read(outfile, 'r')
+ assert c == "function2\n", c
+ c = test.read(outfile2, 'r')
+ assert c == "function2\n", c
+
+ sub1_out = test.workpath('sub1', 'out')
+ sub2_out = test.workpath('sub2', 'out')
+
+ def function3(target, source, env, tlist = [sub1_out, sub2_out]):
+ for t in target:
+ open(str(t), 'w').write("function3\n")
+ for t in tlist:
+ if not t in list(map(str, target)):
+ open(t, 'w').write("function3\n")
+ return 1
+
+ builder = SCons.Builder.Builder(action = function3)
+ tgts = builder(env, target = [sub1_out, sub2_out], source = infile)
+ for t in tgts:
+ t.prepare()
+ try:
+ tgts[0].build()
+ except SCons.Errors.BuildError:
+ pass
+ c = test.read(sub1_out, 'r')
+ assert c == "function3\n", c
+ c = test.read(sub2_out, 'r')
+ assert c == "function3\n", c
+ assert os.path.exists(test.workpath('sub1'))
+ assert os.path.exists(test.workpath('sub2'))
+
+ def test_src_builder(self):
+ """Testing Builders with src_builder"""
+ # These used to be MultiStepBuilder objects until we
+ # eliminated it as a separate class
+ env = Environment()
+ builder1 = SCons.Builder.Builder(action='foo',
+ src_suffix='.bar',
+ suffix='.foo')
+ builder2 = SCons.Builder.Builder(action=MyAction('act'),
+ src_builder = builder1,
+ src_suffix = '.foo')
+
+ tgt = builder2(env, source=[])
+ assert tgt == [], tgt
+
+ sources = ['test.bar', 'test2.foo', 'test3.txt', 'test4']
+ tgt = builder2(env, target='baz', source=sources)[0]
+ s = str(tgt)
+ assert s == 'baz', s
+ s = list(map(str, tgt.sources))
+ assert s == ['test.foo', 'test2.foo', 'test3.txt', 'test4.foo'], s
+ s = list(map(str, tgt.sources[0].sources))
+ assert s == ['test.bar'], s
+
+ tgt = builder2(env, None, 'aaa.bar')[0]
+ s = str(tgt)
+ assert s == 'aaa', s
+ s = list(map(str, tgt.sources))
+ assert s == ['aaa.foo'], s
+ s = list(map(str, tgt.sources[0].sources))
+ assert s == ['aaa.bar'], s
+
+ builder3 = SCons.Builder.Builder(action='bld3')
+ assert not builder3.src_builder is builder1.src_builder
+
+ builder4 = SCons.Builder.Builder(action='bld4',
+ src_suffix='.i',
+ suffix='_wrap.c')
+ builder5 = SCons.Builder.Builder(action=MyAction('act'),
+ src_builder=builder4,
+ suffix='.obj',
+ src_suffix='.c')
+ builder6 = SCons.Builder.Builder(action=MyAction('act'),
+ src_builder=builder5,
+ suffix='.exe',
+ src_suffix='.obj')
+ tgt = builder6(env, 'test', 'test.i')[0]
+ s = str(tgt)
+ assert s == 'test.exe', s
+ s = list(map(str, tgt.sources))
+ assert s == ['test_wrap.obj'], s
+ s = list(map(str, tgt.sources[0].sources))
+ assert s == ['test_wrap.c'], s
+ s = list(map(str, tgt.sources[0].sources[0].sources))
+ assert s == ['test.i'], s
+
+ def test_target_scanner(self):
+ """Testing ability to set target and source scanners through a builder."""
+ global instanced
+ class TestScanner(object):
+ pass
+ tscan = TestScanner()
+ sscan = TestScanner()
+ env = Environment()
+ builder = SCons.Builder.Builder(target_scanner=tscan,
+ source_scanner=sscan,
+ action='')
+ tgt = builder(env, target='foo2', source='bar')[0]
+ assert tgt.builder.target_scanner == tscan, tgt.builder.target_scanner
+ assert tgt.builder.source_scanner == sscan, tgt.builder.source_scanner
+
+ builder1 = SCons.Builder.Builder(action='foo',
+ src_suffix='.bar',
+ suffix='.foo')
+ builder2 = SCons.Builder.Builder(action='foo',
+ src_builder = builder1,
+ target_scanner = tscan,
+ source_scanner = tscan)
+ tgt = builder2(env, target='baz2', source='test.bar test2.foo test3.txt')[0]
+ assert tgt.builder.target_scanner == tscan, tgt.builder.target_scanner
+ assert tgt.builder.source_scanner == tscan, tgt.builder.source_scanner
+
+ def test_actual_scanner(self):
+ """Test usage of actual Scanner objects."""
+
+ import SCons.Scanner
+
+ def func(self):
+ pass
+
+ scanner = SCons.Scanner.Base(func, name='fooscan')
+
+ b1 = SCons.Builder.Builder(action='bld', target_scanner=scanner)
+ b2 = SCons.Builder.Builder(action='bld', target_scanner=scanner)
+ b3 = SCons.Builder.Builder(action='bld')
+
+ assert b1 == b2
+ assert b1 != b3
+
+ def test_src_scanner(slf):
+ """Testing ability to set a source file scanner through a builder."""
+ class TestScanner(object):
+ def key(self, env):
+ return 'TestScannerkey'
+ def instance(self, env):
+ return self
+ def select(self, node):
+ return self
+ name = 'TestScanner'
+ def __str__(self):
+ return self.name
+
+ scanner = TestScanner()
+ builder = SCons.Builder.Builder(action='action')
+
+ # With no scanner specified, source_scanner and
+ # backup_source_scanner are None.
+ bar_y = MyNode('bar.y')
+ env1 = Environment()
+ tgt = builder(env1, target='foo1.x', source='bar.y')[0]
+ src = tgt.sources[0]
+ assert tgt.builder.target_scanner != scanner, tgt.builder.target_scanner
+ assert tgt.builder.source_scanner is None, tgt.builder.source_scanner
+ assert tgt.get_source_scanner(bar_y) is None, tgt.get_source_scanner(bar_y)
+ assert not src.has_builder(), src.has_builder()
+ s = src.get_source_scanner(bar_y)
+ assert isinstance(s, SCons.Util.Null), repr(s)
+
+ # An Environment that has suffix-specified SCANNERS should
+ # provide a source scanner to the target.
+ class EnvTestScanner(object):
+ def key(self, env):
+ return '.y'
+ def instance(self, env):
+ return self
+ name = 'EnvTestScanner'
+ def __str__(self):
+ return self.name
+ def select(self, node):
+ return self
+ def path(self, env, dir=None):
+ return ()
+ def __call__(self, node, env, path):
+ return []
+ env3 = Environment(SCANNERS = [EnvTestScanner()])
+ env3.scanner = EnvTestScanner() # test env's version of SCANNERS
+ tgt = builder(env3, target='foo2.x', source='bar.y')[0]
+ src = tgt.sources[0]
+ assert tgt.builder.target_scanner != scanner, tgt.builder.target_scanner
+ assert not tgt.builder.source_scanner, tgt.builder.source_scanner
+ assert tgt.get_source_scanner(bar_y), tgt.get_source_scanner(bar_y)
+ assert str(tgt.get_source_scanner(bar_y)) == 'EnvTestScanner', tgt.get_source_scanner(bar_y)
+ assert not src.has_builder(), src.has_builder()
+ s = src.get_source_scanner(bar_y)
+ assert isinstance(s, SCons.Util.Null), repr(s)
+
+ # Can't simply specify the scanner as a builder argument; it's
+ # global to all invocations of this builder.
+ tgt = builder(env3, target='foo3.x', source='bar.y', source_scanner = scanner)[0]
+ src = tgt.sources[0]
+ assert tgt.builder.target_scanner != scanner, tgt.builder.target_scanner
+ assert not tgt.builder.source_scanner, tgt.builder.source_scanner
+ assert tgt.get_source_scanner(bar_y), tgt.get_source_scanner(bar_y)
+ assert str(tgt.get_source_scanner(bar_y)) == 'EnvTestScanner', tgt.get_source_scanner(bar_y)
+ assert not src.has_builder(), src.has_builder()
+ s = src.get_source_scanner(bar_y)
+ assert isinstance(s, SCons.Util.Null), s
+
+ # Now use a builder that actually has scanners and ensure that
+ # the target is set accordingly (using the specified scanner
+ # instead of the Environment's scanner)
+ builder = SCons.Builder.Builder(action='action',
+ source_scanner=scanner,
+ target_scanner=scanner)
+ tgt = builder(env3, target='foo4.x', source='bar.y')[0]
+ src = tgt.sources[0]
+ assert tgt.builder.target_scanner == scanner, tgt.builder.target_scanner
+ assert tgt.builder.source_scanner, tgt.builder.source_scanner
+ assert tgt.builder.source_scanner == scanner, tgt.builder.source_scanner
+ assert str(tgt.builder.source_scanner) == 'TestScanner', str(tgt.builder.source_scanner)
+ assert tgt.get_source_scanner(bar_y), tgt.get_source_scanner(bar_y)
+ assert tgt.get_source_scanner(bar_y) == scanner, tgt.get_source_scanner(bar_y)
+ assert str(tgt.get_source_scanner(bar_y)) == 'TestScanner', tgt.get_source_scanner(bar_y)
+ assert not src.has_builder(), src.has_builder()
+ s = src.get_source_scanner(bar_y)
+ assert isinstance(s, SCons.Util.Null), s
+
+
+
+ def test_Builder_API(self):
+ """Test Builder interface.
+
+ Some of this is tested elsewhere in this file, but this is a
+ quick collection of common operations on builders with various
+ forms of component specifications."""
+
+ builder = SCons.Builder.Builder()
+ env = Environment(BUILDERS={'Bld':builder})
+
+ r = builder.get_name(env)
+ assert r == 'Bld', r
+ r = builder.get_prefix(env)
+ assert r == '', r
+ r = builder.get_suffix(env)
+ assert r == '', r
+ r = builder.get_src_suffix(env)
+ assert r == '', r
+ r = builder.src_suffixes(env)
+ assert r == [], r
+
+ # src_suffix can be a single string or a list of strings
+ # src_suffixes() caches its return value, so we use a new
+ # Builder each time we do any of these tests
+
+ bld = SCons.Builder.Builder()
+ env = Environment(BUILDERS={'Bld':bld})
+
+ bld.set_src_suffix('.foo')
+ r = bld.get_src_suffix(env)
+ assert r == '.foo', r
+ r = bld.src_suffixes(env)
+ assert r == ['.foo'], r
+
+ bld = SCons.Builder.Builder()
+ env = Environment(BUILDERS={'Bld':bld})
+
+ bld.set_src_suffix(['.foo', '.bar'])
+ r = bld.get_src_suffix(env)
+ assert r == '.foo', r
+ r = bld.src_suffixes(env)
+ assert r == ['.foo', '.bar'], r
+
+ bld = SCons.Builder.Builder()
+ env = Environment(BUILDERS={'Bld':bld})
+
+ bld.set_src_suffix(['.bar', '.foo'])
+ r = bld.get_src_suffix(env)
+ assert r == '.bar', r
+ r = sorted(bld.src_suffixes(env))
+ assert r == ['.bar', '.foo'], r
+
+ # adjust_suffix normalizes the suffix, adding a `.' if needed
+
+ r = builder.adjust_suffix('.foo')
+ assert r == '.foo', r
+ r = builder.adjust_suffix('_foo')
+ assert r == '_foo', r
+ r = builder.adjust_suffix('$foo')
+ assert r == '$foo', r
+ r = builder.adjust_suffix('foo')
+ assert r == '.foo', r
+ r = builder.adjust_suffix('f._$oo')
+ assert r == '.f._$oo', r
+
+ # prefix and suffix can be one of:
+ # 1. a string (adjusted and env variables substituted),
+ # 2. a function (passed (env,sources), returns suffix string)
+ # 3. a dict of src_suffix:suffix settings, key==None is
+ # default suffix (special case of #2, so adjust_suffix
+ # not applied)
+
+ builder = SCons.Builder.Builder(prefix='lib', suffix='foo')
+
+ env = Environment(BUILDERS={'Bld':builder})
+ r = builder.get_name(env)
+ assert r == 'Bld', r
+ r = builder.get_prefix(env)
+ assert r == 'lib', r
+ r = builder.get_suffix(env)
+ assert r == '.foo', r
+
+ mkpref = lambda env,sources: 'Lib'
+ mksuff = lambda env,sources: '.Foo'
+ builder = SCons.Builder.Builder(prefix=mkpref, suffix=mksuff)
+
+ env = Environment(BUILDERS={'Bld':builder})
+ r = builder.get_name(env)
+ assert r == 'Bld', r
+ r = builder.get_prefix(env)
+ assert r == 'Lib', r
+ r = builder.get_suffix(env)
+ assert r == '.Foo', r
+
+ builder = SCons.Builder.Builder(prefix='$PREF', suffix='$SUFF')
+
+ env = Environment(BUILDERS={'Bld':builder},PREF="LIB",SUFF=".FOO")
+ r = builder.get_name(env)
+ assert r == 'Bld', r
+ r = builder.get_prefix(env)
+ assert r == 'LIB', r
+ r = builder.get_suffix(env)
+ assert r == '.FOO', r
+
+ builder = SCons.Builder.Builder(prefix={None:'A_',
+ '.C':'E_'},
+ suffix={None:'.B',
+ '.C':'.D'})
+
+ env = Environment(BUILDERS={'Bld':builder})
+ r = builder.get_name(env)
+ assert r == 'Bld', r
+ r = builder.get_prefix(env)
+ assert r == 'A_', r
+ r = builder.get_suffix(env)
+ assert r == '.B', r
+ r = builder.get_prefix(env, [MyNode('X.C')])
+ assert r == 'E_', r
+ r = builder.get_suffix(env, [MyNode('X.C')])
+ assert r == '.D', r
+
+ builder = SCons.Builder.Builder(prefix='A_', suffix={}, action={})
+ env = Environment(BUILDERS={'Bld':builder})
+
+ r = builder.get_name(env)
+ assert r == 'Bld', r
+ r = builder.get_prefix(env)
+ assert r == 'A_', r
+ r = builder.get_suffix(env)
+ assert r is None, r
+ r = builder.get_src_suffix(env)
+ assert r == '', r
+ r = builder.src_suffixes(env)
+ assert r == [], r
+
+ # Builder actions can be a string, a list, or a dictionary
+ # whose keys are the source suffix. The add_action()
+ # specifies a new source suffix/action binding.
+
+ builder = SCons.Builder.Builder(prefix='A_', suffix={}, action={})
+ env = Environment(BUILDERS={'Bld':builder})
+ builder.add_action('.src_sfx1', 'FOO')
+
+ r = builder.get_name(env)
+ assert r == 'Bld', r
+ r = builder.get_prefix(env)
+ assert r == 'A_', r
+ r = builder.get_suffix(env)
+ assert r is None, r
+ r = builder.get_suffix(env, [MyNode('X.src_sfx1')])
+ assert r is None, r
+ r = builder.get_src_suffix(env)
+ assert r == '.src_sfx1', r
+ r = builder.src_suffixes(env)
+ assert r == ['.src_sfx1'], r
+
+ builder = SCons.Builder.Builder(prefix='A_', suffix={}, action={})
+ env = Environment(BUILDERS={'Bld':builder})
+ builder.add_action('.src_sfx1', 'FOO')
+ builder.add_action('.src_sfx2', 'BAR')
+
+ r = builder.get_name(env)
+ assert r == 'Bld', r
+ r = builder.get_prefix(env)
+ assert r == 'A_', r
+ r = builder.get_suffix(env)
+ assert r is None, r
+ r = builder.get_src_suffix(env)
+ assert r == '.src_sfx1', r
+ r = sorted(builder.src_suffixes(env))
+ assert r == ['.src_sfx1', '.src_sfx2'], r
+
+
+ def test_Builder_Args(self):
+ """Testing passing extra args to a builder."""
+ def buildFunc(target, source, env, s=self):
+ s.foo=env['foo']
+ s.bar=env['bar']
+ assert env['CC'] == 'mycc'
+
+ env=Environment(CC='cc')
+
+ builder = SCons.Builder.Builder(action=buildFunc)
+ tgt = builder(env, target='foo', source='bar', foo=1, bar=2, CC='mycc')[0]
+ tgt.build()
+ assert self.foo == 1, self.foo
+ assert self.bar == 2, self.bar
+
+ def test_emitter(self):
+ """Test emitter functions."""
+ def emit(target, source, env):
+ foo = env.get('foo', 0)
+ bar = env.get('bar', 0)
+ for t in target:
+ assert isinstance(t, MyNode)
+ assert t.has_builder()
+ for s in source:
+ assert isinstance(s, MyNode)
+ if foo:
+ target.append("bar%d"%foo)
+ if bar:
+ source.append("baz")
+ return ( target, source )
+
+ env = Environment()
+ builder = SCons.Builder.Builder(action='foo',
+ emitter=emit,
+ target_factory=MyNode,
+ source_factory=MyNode)
+ tgt = builder(env, target='foo2', source='bar')[0]
+ assert str(tgt) == 'foo2', str(tgt)
+ assert str(tgt.sources[0]) == 'bar', str(tgt.sources[0])
+
+ tgt = builder(env, target='foo3', source='bar', foo=1)
+ assert len(tgt) == 2, len(tgt)
+ assert 'foo3' in list(map(str, tgt)), list(map(str, tgt))
+ assert 'bar1' in list(map(str, tgt)), list(map(str, tgt))
+
+ tgt = builder(env, target='foo4', source='bar', bar=1)[0]
+ assert str(tgt) == 'foo4', str(tgt)
+ assert len(tgt.sources) == 2, len(tgt.sources)
+ assert 'baz' in list(map(str, tgt.sources)), list(map(str, tgt.sources))
+ assert 'bar' in list(map(str, tgt.sources)), list(map(str, tgt.sources))
+
+ env2=Environment(FOO=emit)
+ builder2=SCons.Builder.Builder(action='foo',
+ emitter="$FOO",
+ target_factory=MyNode,
+ source_factory=MyNode)
+
+ builder2a=SCons.Builder.Builder(action='foo',
+ emitter="$FOO",
+ target_factory=MyNode,
+ source_factory=MyNode)
+
+ assert builder2 == builder2a, repr(builder2.__dict__) + "\n" + repr(builder2a.__dict__)
+
+ tgt = builder2(env2, target='foo5', source='bar')[0]
+ assert str(tgt) == 'foo5', str(tgt)
+ assert str(tgt.sources[0]) == 'bar', str(tgt.sources[0])
+
+ tgt = builder2(env2, target='foo6', source='bar', foo=2)
+ assert len(tgt) == 2, len(tgt)
+ assert 'foo6' in list(map(str, tgt)), list(map(str, tgt))
+ assert 'bar2' in list(map(str, tgt)), list(map(str, tgt))
+
+ tgt = builder2(env2, target='foo7', source='bar', bar=1)[0]
+ assert str(tgt) == 'foo7', str(tgt)
+ assert len(tgt.sources) == 2, len(tgt.sources)
+ assert 'baz' in list(map(str, tgt.sources)), list(map(str, tgt.sources))
+ assert 'bar' in list(map(str, tgt.sources)), list(map(str, tgt.sources))
+
+ def test_emitter_preserve_builder(self):
+ """Test an emitter not overwriting a newly-set builder"""
+ env = Environment()
+
+ new_builder = SCons.Builder.Builder(action='new')
+ node = MyNode('foo8')
+ new_node = MyNode('foo8.new')
+
+ def emit(target, source, env, nb=new_builder, nn=new_node):
+ for t in target:
+ t.builder = nb
+ return [nn], source
+
+ builder=SCons.Builder.Builder(action='foo',
+ emitter=emit,
+ target_factory=MyNode,
+ source_factory=MyNode)
+ tgt = builder(env, target=node, source='bar')[0]
+ assert tgt is new_node, tgt
+ assert tgt.builder is builder, tgt.builder
+ assert node.builder is new_builder, node.builder
+
+ def test_emitter_suffix_map(self):
+ """Test mapping file suffixes to emitter functions"""
+ env = Environment()
+
+ def emit4a(target, source, env):
+ source = list(map(str, source))
+ target = ['emit4a-' + x[:-3] for x in source]
+ return (target, source)
+ def emit4b(target, source, env):
+ source = list(map(str, source))
+ target = ['emit4b-' + x[:-3] for x in source]
+ return (target, source)
+
+ builder = SCons.Builder.Builder(action='foo',
+ emitter={'.4a':emit4a,
+ '.4b':emit4b},
+ target_factory=MyNode,
+ source_factory=MyNode)
+ tgt = builder(env, None, source='aaa.4a')[0]
+ assert str(tgt) == 'emit4a-aaa', str(tgt)
+ tgt = builder(env, None, source='bbb.4b')[0]
+ assert str(tgt) == 'emit4b-bbb', str(tgt)
+ tgt = builder(env, None, source='ccc.4c')[0]
+ assert str(tgt) == 'ccc', str(tgt)
+
+ def emit4c(target, source, env):
+ source = list(map(str, source))
+ target = ['emit4c-' + x[:-3] for x in source]
+ return (target, source)
+
+ builder.add_emitter('.4c', emit4c)
+ tgt = builder(env, None, source='ccc.4c')[0]
+ assert str(tgt) == 'emit4c-ccc', str(tgt)
+
+ def test_emitter_function_list(self):
+ """Test lists of emitter functions"""
+ env = Environment()
+
+ def emit1a(target, source, env):
+ source = list(map(str, source))
+ target = target + ['emit1a-' + x[:-2] for x in source]
+ return (target, source)
+ def emit1b(target, source, env):
+ source = list(map(str, source))
+ target = target + ['emit1b-' + x[:-2] for x in source]
+ return (target, source)
+ builder1 = SCons.Builder.Builder(action='foo',
+ emitter=[emit1a, emit1b],
+ node_factory=MyNode)
+
+ tgts = builder1(env, target='target-1', source='aaa.1')
+ tgts = list(map(str, tgts))
+ assert tgts == ['target-1', 'emit1a-aaa', 'emit1b-aaa'], tgts
+
+ # Test a list of emitter functions through the environment.
+ def emit2a(target, source, env):
+ source = list(map(str, source))
+ target = target + ['emit2a-' + x[:-2] for x in source]
+ return (target, source)
+ def emit2b(target, source, env):
+ source = list(map(str, source))
+ target = target + ['emit2b-' + x[:-2] for x in source]
+ return (target, source)
+ builder2 = SCons.Builder.Builder(action='foo',
+ emitter='$EMITTERLIST',
+ node_factory=MyNode)
+
+ env = Environment(EMITTERLIST = [emit2a, emit2b])
+
+ tgts = builder2(env, target='target-2', source='aaa.2')
+ tgts = list(map(str, tgts))
+ assert tgts == ['target-2', 'emit2a-aaa', 'emit2b-aaa'], tgts
+
+ def test_emitter_TARGET_SOURCE(self):
+ """Test use of $TARGET and $SOURCE in emitter results"""
+
+ env = SCons.Environment.Environment()
+
+ def emit(target, source, env):
+ return (target + ['${SOURCE}.s1', '${TARGET}.t1'],
+ source + ['${TARGET}.t2', '${SOURCE}.s2'])
+
+ builder = SCons.Builder.Builder(action='foo',
+ emitter = emit,
+ node_factory = MyNode)
+
+ targets = builder(env, target = 'TTT', source ='SSS')
+ sources = targets[0].sources
+ targets = list(map(str, targets))
+ sources = list(map(str, sources))
+ assert targets == ['TTT', 'SSS.s1', 'TTT.t1'], targets
+ assert sources == ['SSS', 'TTT.t2', 'SSS.s2'], targets
+
+ def test_no_target(self):
+ """Test deducing the target from the source."""
+
+ env = Environment()
+ b = SCons.Builder.Builder(action='foo', suffix='.o')
+
+ tgt = b(env, None, 'aaa')[0]
+ assert str(tgt) == 'aaa.o', str(tgt)
+ assert len(tgt.sources) == 1, list(map(str, tgt.sources))
+ assert str(tgt.sources[0]) == 'aaa', list(map(str, tgt.sources))
+
+ tgt = b(env, None, 'bbb.c')[0]
+ assert str(tgt) == 'bbb.o', str(tgt)
+ assert len(tgt.sources) == 1, list(map(str, tgt.sources))
+ assert str(tgt.sources[0]) == 'bbb.c', list(map(str, tgt.sources))
+
+ tgt = b(env, None, 'ccc.x.c')[0]
+ assert str(tgt) == 'ccc.x.o', str(tgt)
+ assert len(tgt.sources) == 1, list(map(str, tgt.sources))
+ assert str(tgt.sources[0]) == 'ccc.x.c', list(map(str, tgt.sources))
+
+ tgt = b(env, None, ['d0.c', 'd1.c'])[0]
+ assert str(tgt) == 'd0.o', str(tgt)
+ assert len(tgt.sources) == 2, list(map(str, tgt.sources))
+ assert str(tgt.sources[0]) == 'd0.c', list(map(str, tgt.sources))
+ assert str(tgt.sources[1]) == 'd1.c', list(map(str, tgt.sources))
+
+ tgt = b(env, target = None, source='eee')[0]
+ assert str(tgt) == 'eee.o', str(tgt)
+ assert len(tgt.sources) == 1, list(map(str, tgt.sources))
+ assert str(tgt.sources[0]) == 'eee', list(map(str, tgt.sources))
+
+ tgt = b(env, target = None, source='fff.c')[0]
+ assert str(tgt) == 'fff.o', str(tgt)
+ assert len(tgt.sources) == 1, list(map(str, tgt.sources))
+ assert str(tgt.sources[0]) == 'fff.c', list(map(str, tgt.sources))
+
+ tgt = b(env, target = None, source='ggg.x.c')[0]
+ assert str(tgt) == 'ggg.x.o', str(tgt)
+ assert len(tgt.sources) == 1, list(map(str, tgt.sources))
+ assert str(tgt.sources[0]) == 'ggg.x.c', list(map(str, tgt.sources))
+
+ tgt = b(env, target = None, source=['h0.c', 'h1.c'])[0]
+ assert str(tgt) == 'h0.o', str(tgt)
+ assert len(tgt.sources) == 2, list(map(str, tgt.sources))
+ assert str(tgt.sources[0]) == 'h0.c', list(map(str, tgt.sources))
+ assert str(tgt.sources[1]) == 'h1.c', list(map(str, tgt.sources))
+
+ w = b(env, target='i0.w', source=['i0.x'])[0]
+ y = b(env, target='i1.y', source=['i1.z'])[0]
+ tgt = b(env, None, source=[w, y])[0]
+ assert str(tgt) == 'i0.o', str(tgt)
+ assert len(tgt.sources) == 2, list(map(str, tgt.sources))
+ assert str(tgt.sources[0]) == 'i0.w', list(map(str, tgt.sources))
+ assert str(tgt.sources[1]) == 'i1.y', list(map(str, tgt.sources))
+
+ def test_get_name(self):
+ """Test getting name of builder.
+
+ Each type of builder should return its environment-specific
+ name when queried appropriately. """
+
+ b1 = SCons.Builder.Builder(action='foo', suffix='.o')
+ b2 = SCons.Builder.Builder(action='foo', suffix='.c')
+ b3 = SCons.Builder.Builder(action='bar', src_suffix = '.foo',
+ src_builder = b1)
+ b4 = SCons.Builder.Builder(action={})
+ b5 = SCons.Builder.Builder(action='foo', name='builder5')
+ b6 = SCons.Builder.Builder(action='foo')
+ assert isinstance(b4, SCons.Builder.CompositeBuilder)
+ assert isinstance(b4.action, SCons.Action.CommandGeneratorAction)
+
+ env = Environment(BUILDERS={'bldr1': b1,
+ 'bldr2': b2,
+ 'bldr3': b3,
+ 'bldr4': b4})
+ env2 = Environment(BUILDERS={'B1': b1,
+ 'B2': b2,
+ 'B3': b3,
+ 'B4': b4})
+ # With no name, get_name will return the class. Allow
+ # for caching...
+ b6_names = [
+ 'SCons.Builder.BuilderBase',
+ "<class 'SCons.Builder.BuilderBase'>",
+ 'SCons.Memoize.BuilderBase',
+ "<class 'SCons.Memoize.BuilderBase'>",
+ ]
+
+ assert b1.get_name(env) == 'bldr1', b1.get_name(env)
+ assert b2.get_name(env) == 'bldr2', b2.get_name(env)
+ assert b3.get_name(env) == 'bldr3', b3.get_name(env)
+ assert b4.get_name(env) == 'bldr4', b4.get_name(env)
+ assert b5.get_name(env) == 'builder5', b5.get_name(env)
+ assert b6.get_name(env) in b6_names, b6.get_name(env)
+
+ assert b1.get_name(env2) == 'B1', b1.get_name(env2)
+ assert b2.get_name(env2) == 'B2', b2.get_name(env2)
+ assert b3.get_name(env2) == 'B3', b3.get_name(env2)
+ assert b4.get_name(env2) == 'B4', b4.get_name(env2)
+ assert b5.get_name(env2) == 'builder5', b5.get_name(env2)
+ assert b6.get_name(env2) in b6_names, b6.get_name(env2)
+
+ assert b5.get_name(None) == 'builder5', b5.get_name(None)
+ assert b6.get_name(None) in b6_names, b6.get_name(None)
+
+ # This test worked before adding batch builders, but we must now
+ # be able to disambiguate a CompositeAction into a more specific
+ # action based on file suffix at call time. Leave this commented
+ # out (for now) in case this reflects a real-world use case that
+ # we must accomodate and we want to resurrect this test.
+ #tgt = b4(env, target = 'moo', source='cow')
+ #assert tgt[0].builder.get_name(env) == 'bldr4'
+
+class CompositeBuilderTestCase(unittest.TestCase):
+
+ def setUp(self):
+ def func_action(target, source, env):
+ return 0
+
+ builder = SCons.Builder.Builder(action={ '.foo' : func_action,
+ '.bar' : func_action})
+
+ self.func_action = func_action
+ self.builder = builder
+
+ def test___init__(self):
+ """Test CompositeBuilder creation"""
+ env = Environment()
+ builder = SCons.Builder.Builder(action={})
+
+ tgt = builder(env, source=[])
+ assert tgt == [], tgt
+
+ assert isinstance(builder, SCons.Builder.CompositeBuilder)
+ assert isinstance(builder.action, SCons.Action.CommandGeneratorAction)
+
+ def test_target_action(self):
+ """Test CompositeBuilder setting of target builder actions"""
+ env = Environment()
+ builder = self.builder
+
+ tgt = builder(env, target='test1', source='test1.foo')[0]
+ assert isinstance(tgt.builder, SCons.Builder.BuilderBase)
+ assert tgt.builder.action is builder.action
+
+ tgt = builder(env, target='test2', source='test1.bar')[0]
+ assert isinstance(tgt.builder, SCons.Builder.BuilderBase)
+ assert tgt.builder.action is builder.action
+
+ def test_multiple_suffix_error(self):
+ """Test the CompositeBuilder multiple-source-suffix error"""
+ env = Environment()
+ builder = self.builder
+
+ flag = 0
+ try:
+ builder(env, target='test3', source=['test2.bar', 'test1.foo'])[0]
+ except SCons.Errors.UserError as e:
+ flag = 1
+ err = e
+ assert flag, "UserError should be thrown when we call a builder with files of different suffixes."
+ expect = "While building `['test3']' from `test1.foo': Cannot build multiple sources with different extensions: .bar, .foo"
+ assert str(err) == expect, err
+
+ def test_source_ext_match(self):
+ """Test the CompositeBuilder source_ext_match argument"""
+ env = Environment()
+ func_action = self.func_action
+ builder = SCons.Builder.Builder(action={ '.foo' : func_action,
+ '.bar' : func_action},
+ source_ext_match = None)
+
+ tgt = builder(env, target='test3', source=['test2.bar', 'test1.foo'])[0]
+ tgt.build()
+
+ def test_suffix_variable(self):
+ """Test CompositeBuilder defining action suffixes through a variable"""
+ env = Environment(BAR_SUFFIX = '.BAR2', FOO_SUFFIX = '.FOO2')
+ func_action = self.func_action
+ builder = SCons.Builder.Builder(action={ '.foo' : func_action,
+ '.bar' : func_action,
+ '$BAR_SUFFIX' : func_action,
+ '$FOO_SUFFIX' : func_action })
+
+ tgt = builder(env, target='test4', source=['test4.BAR2'])[0]
+ assert isinstance(tgt.builder, SCons.Builder.BuilderBase)
+ try:
+ tgt.build()
+ flag = 1
+ except SCons.Errors.UserError as e:
+ print(e)
+ flag = 0
+ assert flag, "It should be possible to define actions in composite builders using variables."
+ env['FOO_SUFFIX'] = '.BAR2'
+ builder.add_action('$NEW_SUFFIX', func_action)
+ flag = 0
+ try:
+ builder(env, target='test5', source=['test5.BAR2'])[0]
+ except SCons.Errors.UserError:
+ flag = 1
+ assert flag, "UserError should be thrown when we call a builder with ambigous suffixes."
+
+ def test_src_builder(self):
+ """Test CompositeBuilder's use of a src_builder"""
+ env = Environment()
+
+ foo_bld = SCons.Builder.Builder(action = 'a-foo',
+ src_suffix = '.ina',
+ suffix = '.foo')
+ assert isinstance(foo_bld, SCons.Builder.BuilderBase)
+ builder = SCons.Builder.Builder(action = { '.foo' : 'foo',
+ '.bar' : 'bar' },
+ src_builder = foo_bld)
+ assert isinstance(builder, SCons.Builder.CompositeBuilder)
+ assert isinstance(builder.action, SCons.Action.CommandGeneratorAction)
+
+ tgt = builder(env, target='t1', source='t1a.ina t1b.ina')[0]
+ assert isinstance(tgt.builder, SCons.Builder.BuilderBase)
+
+ tgt = builder(env, target='t2', source='t2a.foo t2b.ina')[0]
+ assert isinstance(tgt.builder, SCons.Builder.BuilderBase), tgt.builder.__dict__
+
+ bar_bld = SCons.Builder.Builder(action = 'a-bar',
+ src_suffix = '.inb',
+ suffix = '.bar')
+ assert isinstance(bar_bld, SCons.Builder.BuilderBase)
+ builder = SCons.Builder.Builder(action = { '.foo' : 'foo'},
+ src_builder = [foo_bld, bar_bld])
+ assert isinstance(builder, SCons.Builder.CompositeBuilder)
+ assert isinstance(builder.action, SCons.Action.CommandGeneratorAction)
+
+ builder.add_action('.bar', 'bar')
+
+ tgt = builder(env, target='t3-foo', source='t3a.foo t3b.ina')[0]
+ assert isinstance(tgt.builder, SCons.Builder.BuilderBase)
+
+ tgt = builder(env, target='t3-bar', source='t3a.bar t3b.inb')[0]
+ assert isinstance(tgt.builder, SCons.Builder.BuilderBase)
+
+ flag = 0
+ try:
+ builder(env, target='t5', source=['test5a.foo', 'test5b.inb'])[0]
+ except SCons.Errors.UserError as e:
+ flag = 1
+ err = e
+ assert flag, "UserError should be thrown when we call a builder with files of different suffixes."
+ expect = "While building `['t5']' from `test5b.bar': Cannot build multiple sources with different extensions: .foo, .bar"
+ assert str(err) == expect, err
+
+ flag = 0
+ try:
+ builder(env, target='t6', source=['test6a.bar', 'test6b.ina'])[0]
+ except SCons.Errors.UserError as e:
+ flag = 1
+ err = e
+ assert flag, "UserError should be thrown when we call a builder with files of different suffixes."
+ expect = "While building `['t6']' from `test6b.foo': Cannot build multiple sources with different extensions: .bar, .foo"
+ assert str(err) == expect, err
+
+ flag = 0
+ try:
+ builder(env, target='t4', source=['test4a.ina', 'test4b.inb'])[0]
+ except SCons.Errors.UserError as e:
+ flag = 1
+ err = e
+ assert flag, "UserError should be thrown when we call a builder with files of different suffixes."
+ expect = "While building `['t4']' from `test4b.bar': Cannot build multiple sources with different extensions: .foo, .bar"
+ assert str(err) == expect, err
+
+ flag = 0
+ try:
+ builder(env, target='t7', source=[env.fs.File('test7')])[0]
+ except SCons.Errors.UserError as e:
+ flag = 1
+ err = e
+ assert flag, "UserError should be thrown when we call a builder with files of different suffixes."
+ expect = "While building `['t7']': Cannot deduce file extension from source files: ['test7']"
+ assert str(err) == expect, err
+
+ flag = 0
+ try:
+ builder(env, target='t8', source=['test8.unknown'])[0]
+ except SCons.Errors.UserError as e:
+ flag = 1
+ err = e
+ assert flag, "UserError should be thrown when we call a builder target with an unknown suffix."
+ expect = "While building `['t8']' from `['test8.unknown']': Don't know how to build from a source file with suffix `.unknown'. Expected a suffix in this list: ['.foo', '.bar']."
+ assert str(err) == expect, err
+
+if __name__ == "__main__":
+ suite = unittest.TestSuite()
+ tclasses = [
+ BuilderTestCase,
+ CompositeBuilderTestCase
+ ]
+ for tclass in tclasses:
+ names = unittest.getTestCaseNames(tclass, 'test_')
+ suite.addTests(list(map(tclass, names)))
+
+ TestUnit.run(suite)
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/CacheDir.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/CacheDir.py
new file mode 100644
index 0000000..1690674
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/CacheDir.py
@@ -0,0 +1,281 @@
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+__doc__ = """
+CacheDir support
+"""
+
+import json
+import os
+import stat
+import sys
+
+import SCons.Action
+import SCons.Warnings
+
+cache_enabled = True
+cache_debug = False
+cache_force = False
+cache_show = False
+cache_readonly = False
+
+def CacheRetrieveFunc(target, source, env):
+ t = target[0]
+ fs = t.fs
+ cd = env.get_CacheDir()
+ cachedir, cachefile = cd.cachepath(t)
+ if not fs.exists(cachefile):
+ cd.CacheDebug('CacheRetrieve(%s): %s not in cache\n', t, cachefile)
+ return 1
+ cd.CacheDebug('CacheRetrieve(%s): retrieving from %s\n', t, cachefile)
+ if SCons.Action.execute_actions:
+ if fs.islink(cachefile):
+ fs.symlink(fs.readlink(cachefile), t.get_internal_path())
+ else:
+ env.copy_from_cache(cachefile, t.get_internal_path())
+ st = fs.stat(cachefile)
+ fs.chmod(t.get_internal_path(), stat.S_IMODE(st[stat.ST_MODE]) | stat.S_IWRITE)
+ return 0
+
+def CacheRetrieveString(target, source, env):
+ t = target[0]
+ fs = t.fs
+ cd = env.get_CacheDir()
+ cachedir, cachefile = cd.cachepath(t)
+ if t.fs.exists(cachefile):
+ return "Retrieved `%s' from cache" % t.get_internal_path()
+ return None
+
+CacheRetrieve = SCons.Action.Action(CacheRetrieveFunc, CacheRetrieveString)
+
+CacheRetrieveSilent = SCons.Action.Action(CacheRetrieveFunc, None)
+
+def CachePushFunc(target, source, env):
+ if cache_readonly:
+ return
+
+ t = target[0]
+ if t.nocache:
+ return
+ fs = t.fs
+ cd = env.get_CacheDir()
+ cachedir, cachefile = cd.cachepath(t)
+ if fs.exists(cachefile):
+ # Don't bother copying it if it's already there. Note that
+ # usually this "shouldn't happen" because if the file already
+ # existed in cache, we'd have retrieved the file from there,
+ # not built it. This can happen, though, in a race, if some
+ # other person running the same build pushes their copy to
+ # the cache after we decide we need to build it but before our
+ # build completes.
+ cd.CacheDebug('CachePush(%s): %s already exists in cache\n', t, cachefile)
+ return
+
+ cd.CacheDebug('CachePush(%s): pushing to %s\n', t, cachefile)
+
+ tempfile = cachefile+'.tmp'+str(os.getpid())
+ errfmt = "Unable to copy %s to cache. Cache file is %s"
+
+ if not fs.isdir(cachedir):
+ try:
+ fs.makedirs(cachedir)
+ except EnvironmentError:
+ # We may have received an exception because another process
+ # has beaten us creating the directory.
+ if not fs.isdir(cachedir):
+ msg = errfmt % (str(target), cachefile)
+ raise SCons.Errors.EnvironmentError(msg)
+
+ try:
+ if fs.islink(t.get_internal_path()):
+ fs.symlink(fs.readlink(t.get_internal_path()), tempfile)
+ else:
+ fs.copy2(t.get_internal_path(), tempfile)
+ fs.rename(tempfile, cachefile)
+ st = fs.stat(t.get_internal_path())
+ fs.chmod(cachefile, stat.S_IMODE(st[stat.ST_MODE]) | stat.S_IWRITE)
+ except EnvironmentError:
+ # It's possible someone else tried writing the file at the
+ # same time we did, or else that there was some problem like
+ # the CacheDir being on a separate file system that's full.
+ # In any case, inability to push a file to cache doesn't affect
+ # the correctness of the build, so just print a warning.
+ msg = errfmt % (str(target), cachefile)
+ SCons.Warnings.warn(SCons.Warnings.CacheWriteErrorWarning, msg)
+
+CachePush = SCons.Action.Action(CachePushFunc, None)
+
+# Nasty hack to cut down to one warning for each cachedir path that needs
+# upgrading.
+warned = dict()
+
+class CacheDir(object):
+
+ def __init__(self, path):
+ try:
+ import hashlib
+ except ImportError:
+ msg = "No hashlib or MD5 module available, CacheDir() not supported"
+ SCons.Warnings.warn(SCons.Warnings.NoMD5ModuleWarning, msg)
+ path = None
+ self.path = path
+ self.current_cache_debug = None
+ self.debugFP = None
+ self.config = dict()
+ if path is None:
+ return
+ # See if there's a config file in the cache directory. If there is,
+ # use it. If there isn't, and the directory exists and isn't empty,
+ # produce a warning. If the directory doesn't exist or is empty,
+ # write a config file.
+ config_file = os.path.join(path, 'config')
+ if not os.path.exists(config_file):
+ # A note: There is a race hazard here, if two processes start and
+ # attempt to create the cache directory at the same time. However,
+ # python doesn't really give you the option to do exclusive file
+ # creation (it doesn't even give you the option to error on opening
+ # an existing file for writing...). The ordering of events here
+ # as an attempt to alleviate this, on the basis that it's a pretty
+ # unlikely occurence (it'd require two builds with a brand new cache
+ # directory)
+ if os.path.isdir(path) and len(os.listdir(path)) != 0:
+ self.config['prefix_len'] = 1
+ # When building the project I was testing this on, the warning
+ # was output over 20 times. That seems excessive
+ global warned
+ if self.path not in warned:
+ msg = "Please upgrade your cache by running " +\
+ " scons-configure-cache.py " + self.path
+ SCons.Warnings.warn(SCons.Warnings.CacheVersionWarning, msg)
+ warned[self.path] = True
+ else:
+ if not os.path.isdir(path):
+ try:
+ os.makedirs(path)
+ except OSError:
+ # If someone else is trying to create the directory at
+ # the same time as me, bad things will happen
+ msg = "Failed to create cache directory " + path
+ raise SCons.Errors.EnvironmentError(msg)
+
+ self.config['prefix_len'] = 2
+ if not os.path.exists(config_file):
+ try:
+ with open(config_file, 'w') as config:
+ json.dump(self.config, config)
+ except:
+ msg = "Failed to write cache configuration for " + path
+ raise SCons.Errors.EnvironmentError(msg)
+ else:
+ try:
+ with open(config_file) as config:
+ self.config = json.load(config)
+ except ValueError:
+ msg = "Failed to read cache configuration for " + path
+ raise SCons.Errors.EnvironmentError(msg)
+
+
+ def CacheDebug(self, fmt, target, cachefile):
+ if cache_debug != self.current_cache_debug:
+ if cache_debug == '-':
+ self.debugFP = sys.stdout
+ elif cache_debug:
+ self.debugFP = open(cache_debug, 'w')
+ else:
+ self.debugFP = None
+ self.current_cache_debug = cache_debug
+ if self.debugFP:
+ self.debugFP.write(fmt % (target, os.path.split(cachefile)[1]))
+
+ def is_enabled(self):
+ return cache_enabled and not self.path is None
+
+ def is_readonly(self):
+ return cache_readonly
+
+ def cachepath(self, node):
+ """
+ """
+ if not self.is_enabled():
+ return None, None
+
+ sig = node.get_cachedir_bsig()
+ subdir = sig[:self.config['prefix_len']].upper()
+ dir = os.path.join(self.path, subdir)
+ return dir, os.path.join(dir, sig)
+
+ def retrieve(self, node):
+ """
+ This method is called from multiple threads in a parallel build,
+ so only do thread safe stuff here. Do thread unsafe stuff in
+ built().
+
+ Note that there's a special trick here with the execute flag
+ (one that's not normally done for other actions). Basically
+ if the user requested a no_exec (-n) build, then
+ SCons.Action.execute_actions is set to 0 and when any action
+ is called, it does its showing but then just returns zero
+ instead of actually calling the action execution operation.
+ The problem for caching is that if the file does NOT exist in
+ cache then the CacheRetrieveString won't return anything to
+ show for the task, but the Action.__call__ won't call
+ CacheRetrieveFunc; instead it just returns zero, which makes
+ the code below think that the file *was* successfully
+ retrieved from the cache, therefore it doesn't do any
+ subsequent building. However, the CacheRetrieveString didn't
+ print anything because it didn't actually exist in the cache,
+ and no more build actions will be performed, so the user just
+ sees nothing. The fix is to tell Action.__call__ to always
+ execute the CacheRetrieveFunc and then have the latter
+ explicitly check SCons.Action.execute_actions itself.
+ """
+ if not self.is_enabled():
+ return False
+
+ env = node.get_build_env()
+ if cache_show:
+ if CacheRetrieveSilent(node, [], env, execute=1) == 0:
+ node.build(presub=0, execute=0)
+ return True
+ else:
+ if CacheRetrieve(node, [], env, execute=1) == 0:
+ return True
+
+ return False
+
+ def push(self, node):
+ if self.is_readonly() or not self.is_enabled():
+ return
+ return CachePush(node, [], node.get_build_env())
+
+ def push_if_forced(self, node):
+ if cache_force:
+ return self.push(node)
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/CacheDirTests.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/CacheDirTests.py
new file mode 100644
index 0000000..494db98
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/CacheDirTests.py
@@ -0,0 +1,304 @@
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import os.path
+import shutil
+import sys
+import unittest
+
+from TestCmd import TestCmd
+import TestUnit
+
+import SCons.CacheDir
+
+built_it = None
+
+class Action(object):
+ def __call__(self, targets, sources, env, **kw):
+ global built_it
+ if kw.get('execute', 1):
+ built_it = 1
+ return 0
+ def genstring(self, target, source, env):
+ return str(self)
+ def get_contents(self, target, source, env):
+ return bytearray('','utf-8')
+
+class Builder(object):
+ def __init__(self, environment, action):
+ self.env = environment
+ self.action = action
+ self.overrides = {}
+ self.source_scanner = None
+ self.target_scanner = None
+
+class Environment(object):
+ def __init__(self, cachedir):
+ self.cachedir = cachedir
+ def Override(self, overrides):
+ return self
+ def get_CacheDir(self):
+ return self.cachedir
+
+class BaseTestCase(unittest.TestCase):
+ """
+ Base fixtures common to our other unittest classes.
+ """
+ def setUp(self):
+ self.test = TestCmd(workdir='')
+
+ import SCons.Node.FS
+ self.fs = SCons.Node.FS.FS()
+
+ self._CacheDir = SCons.CacheDir.CacheDir('cache')
+
+ def File(self, name, bsig=None, action=Action()):
+ node = self.fs.File(name)
+ node.builder_set(Builder(Environment(self._CacheDir), action))
+ if bsig:
+ node.cachesig = bsig
+ #node.binfo = node.BuildInfo(node)
+ #node.binfo.ninfo.bsig = bsig
+ return node
+
+ def tearDown(self):
+ os.remove(os.path.join(self._CacheDir.path, 'config'))
+ os.rmdir(self._CacheDir.path)
+ # Should that be shutil.rmtree?
+
+class CacheDirTestCase(BaseTestCase):
+ """
+ Test calling CacheDir code directly.
+ """
+ def test_cachepath(self):
+ """Test the cachepath() method"""
+
+ # Verify how the cachepath() method determines the name
+ # of the file in cache.
+ def my_collect(list):
+ return list[0]
+ save_collect = SCons.Util.MD5collect
+ SCons.Util.MD5collect = my_collect
+
+ try:
+ name = 'a_fake_bsig'
+ f5 = self.File("cd.f5", name)
+ result = self._CacheDir.cachepath(f5)
+ len = self._CacheDir.config['prefix_len']
+ dirname = os.path.join('cache', name.upper()[:len])
+ filename = os.path.join(dirname, name)
+ assert result == (dirname, filename), result
+ finally:
+ SCons.Util.MD5collect = save_collect
+
+class FileTestCase(BaseTestCase):
+ """
+ Test calling CacheDir code through Node.FS.File interfaces.
+ """
+ # These tests were originally in Nodes/FSTests.py and got moved
+ # when the CacheDir support was refactored into its own module.
+ # Look in the history for Node/FSTests.py if any of this needs
+ # to be re-examined.
+ def retrieve_succeed(self, target, source, env, execute=1):
+ self.retrieved.append(target)
+ return 0
+
+ def retrieve_fail(self, target, source, env, execute=1):
+ self.retrieved.append(target)
+ return 1
+
+ def push(self, target, source, env):
+ self.pushed.append(target)
+ return 0
+
+ def test_CacheRetrieve(self):
+ """Test the CacheRetrieve() function"""
+
+ save_CacheRetrieve = SCons.CacheDir.CacheRetrieve
+ self.retrieved = []
+
+ f1 = self.File("cd.f1")
+ try:
+ SCons.CacheDir.CacheRetrieve = self.retrieve_succeed
+ self.retrieved = []
+ built_it = None
+
+ r = f1.retrieve_from_cache()
+ assert r == 1, r
+ assert self.retrieved == [f1], self.retrieved
+ assert built_it is None, built_it
+
+ SCons.CacheDir.CacheRetrieve = self.retrieve_fail
+ self.retrieved = []
+ built_it = None
+
+ r = f1.retrieve_from_cache()
+ assert not r, r
+ assert self.retrieved == [f1], self.retrieved
+ assert built_it is None, built_it
+ finally:
+ SCons.CacheDir.CacheRetrieve = save_CacheRetrieve
+
+ def test_CacheRetrieveSilent(self):
+ """Test the CacheRetrieveSilent() function"""
+
+ save_CacheRetrieveSilent = SCons.CacheDir.CacheRetrieveSilent
+
+ SCons.CacheDir.cache_show = 1
+
+ f2 = self.File("cd.f2", 'f2_bsig')
+ try:
+ SCons.CacheDir.CacheRetrieveSilent = self.retrieve_succeed
+ self.retrieved = []
+ built_it = None
+
+ r = f2.retrieve_from_cache()
+ assert r == 1, r
+ assert self.retrieved == [f2], self.retrieved
+ assert built_it is None, built_it
+
+ SCons.CacheDir.CacheRetrieveSilent = self.retrieve_fail
+ self.retrieved = []
+ built_it = None
+
+ r = f2.retrieve_from_cache()
+ assert r is False, r
+ assert self.retrieved == [f2], self.retrieved
+ assert built_it is None, built_it
+ finally:
+ SCons.CacheDir.CacheRetrieveSilent = save_CacheRetrieveSilent
+
+ def test_CachePush(self):
+ """Test the CachePush() function"""
+
+ save_CachePush = SCons.CacheDir.CachePush
+
+ SCons.CacheDir.CachePush = self.push
+
+ try:
+ self.pushed = []
+
+ cd_f3 = self.test.workpath("cd.f3")
+ f3 = self.File(cd_f3)
+ f3.push_to_cache()
+ assert self.pushed == [], self.pushed
+ self.test.write(cd_f3, "cd.f3\n")
+ f3.push_to_cache()
+ assert self.pushed == [f3], self.pushed
+
+ self.pushed = []
+
+ cd_f4 = self.test.workpath("cd.f4")
+ f4 = self.File(cd_f4)
+ f4.visited()
+ assert self.pushed == [], self.pushed
+ self.test.write(cd_f4, "cd.f4\n")
+ f4.clear()
+ f4.visited()
+ assert self.pushed == [], self.pushed
+ SCons.CacheDir.cache_force = 1
+ f4.clear()
+ f4.visited()
+ assert self.pushed == [f4], self.pushed
+ finally:
+ SCons.CacheDir.CachePush = save_CachePush
+
+ def test_warning(self):
+ """Test raising a warning if we can't copy a file to cache."""
+
+ test = TestCmd(workdir='')
+
+ save_copy2 = shutil.copy2
+ def copy2(src, dst):
+ raise OSError
+ shutil.copy2 = copy2
+ save_mkdir = os.mkdir
+ def mkdir(dir, mode=0):
+ pass
+ os.mkdir = mkdir
+ old_warn_exceptions = SCons.Warnings.warningAsException(1)
+ SCons.Warnings.enableWarningClass(SCons.Warnings.CacheWriteErrorWarning)
+
+ try:
+ cd_f7 = self.test.workpath("cd.f7")
+ self.test.write(cd_f7, "cd.f7\n")
+ f7 = self.File(cd_f7, 'f7_bsig')
+
+ warn_caught = 0
+ try:
+ f7.push_to_cache()
+ except SCons.Errors.BuildError as e:
+ assert e.exc_info[0] == SCons.Warnings.CacheWriteErrorWarning
+ warn_caught = 1
+ assert warn_caught
+ finally:
+ shutil.copy2 = save_copy2
+ os.mkdir = save_mkdir
+ SCons.Warnings.warningAsException(old_warn_exceptions)
+ SCons.Warnings.suppressWarningClass(SCons.Warnings.CacheWriteErrorWarning)
+
+ def test_no_strfunction(self):
+ """Test handling no strfunction() for an action."""
+
+ save_CacheRetrieveSilent = SCons.CacheDir.CacheRetrieveSilent
+
+ f8 = self.File("cd.f8", 'f8_bsig')
+ try:
+ SCons.CacheDir.CacheRetrieveSilent = self.retrieve_succeed
+ self.retrieved = []
+ built_it = None
+
+ r = f8.retrieve_from_cache()
+ assert r == 1, r
+ assert self.retrieved == [f8], self.retrieved
+ assert built_it is None, built_it
+
+ SCons.CacheDir.CacheRetrieveSilent = self.retrieve_fail
+ self.retrieved = []
+ built_it = None
+
+ r = f8.retrieve_from_cache()
+ assert r is False, r
+ assert self.retrieved == [f8], self.retrieved
+ assert built_it is None, built_it
+ finally:
+ SCons.CacheDir.CacheRetrieveSilent = save_CacheRetrieveSilent
+
+if __name__ == "__main__":
+ suite = unittest.TestSuite()
+ tclasses = [
+ CacheDirTestCase,
+ FileTestCase,
+ ]
+ for tclass in tclasses:
+ names = unittest.getTestCaseNames(tclass, 'test_')
+ suite.addTests(list(map(tclass, names)))
+ TestUnit.run(suite)
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Conftest.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Conftest.py
new file mode 100644
index 0000000..abaf00d
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Conftest.py
@@ -0,0 +1,812 @@
+"""SCons.Conftest
+
+Autoconf-like configuration support; low level implementation of tests.
+"""
+
+#
+# Copyright (c) 2003 Stichting NLnet Labs
+# Copyright (c) 2001, 2002, 2003 Steven Knight
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+#
+# The purpose of this module is to define how a check is to be performed.
+# Use one of the Check...() functions below.
+#
+
+#
+# A context class is used that defines functions for carrying out the tests,
+# logging and messages. The following methods and members must be present:
+#
+# context.Display(msg) Function called to print messages that are normally
+# displayed for the user. Newlines are explicitly used.
+# The text should also be written to the logfile!
+#
+# context.Log(msg) Function called to write to a log file.
+#
+# context.BuildProg(text, ext)
+# Function called to build a program, using "ext" for the
+# file extention. Must return an empty string for
+# success, an error message for failure.
+# For reliable test results building should be done just
+# like an actual program would be build, using the same
+# command and arguments (including configure results so
+# far).
+#
+# context.CompileProg(text, ext)
+# Function called to compile a program, using "ext" for
+# the file extention. Must return an empty string for
+# success, an error message for failure.
+# For reliable test results compiling should be done just
+# like an actual source file would be compiled, using the
+# same command and arguments (including configure results
+# so far).
+#
+# context.AppendLIBS(lib_name_list)
+# Append "lib_name_list" to the value of LIBS.
+# "lib_namelist" is a list of strings.
+# Return the value of LIBS before changing it (any type
+# can be used, it is passed to SetLIBS() later.)
+#
+# context.PrependLIBS(lib_name_list)
+# Prepend "lib_name_list" to the value of LIBS.
+# "lib_namelist" is a list of strings.
+# Return the value of LIBS before changing it (any type
+# can be used, it is passed to SetLIBS() later.)
+#
+# context.SetLIBS(value)
+# Set LIBS to "value". The type of "value" is what
+# AppendLIBS() returned.
+# Return the value of LIBS before changing it (any type
+# can be used, it is passed to SetLIBS() later.)
+#
+# context.headerfilename
+# Name of file to append configure results to, usually
+# "confdefs.h".
+# The file must not exist or be empty when starting.
+# Empty or None to skip this (some tests will not work!).
+#
+# context.config_h (may be missing). If present, must be a string, which
+# will be filled with the contents of a config_h file.
+#
+# context.vardict Dictionary holding variables used for the tests and
+# stores results from the tests, used for the build
+# commands.
+# Normally contains "CC", "LIBS", "CPPFLAGS", etc.
+#
+# context.havedict Dictionary holding results from the tests that are to
+# be used inside a program.
+# Names often start with "HAVE_". These are zero
+# (feature not present) or one (feature present). Other
+# variables may have any value, e.g., "PERLVERSION" can
+# be a number and "SYSTEMNAME" a string.
+#
+
+import re
+
+#
+# PUBLIC VARIABLES
+#
+
+LogInputFiles = 1 # Set that to log the input files in case of a failed test
+LogErrorMessages = 1 # Set that to log Conftest-generated error messages
+
+#
+# PUBLIC FUNCTIONS
+#
+
+# Generic remarks:
+# - When a language is specified which is not supported the test fails. The
+# message is a bit different, because not all the arguments for the normal
+# message are available yet (chicken-egg problem).
+
+
+def CheckBuilder(context, text = None, language = None):
+ """
+ Configure check to see if the compiler works.
+ Note that this uses the current value of compiler and linker flags, make
+ sure $CFLAGS, $CPPFLAGS and $LIBS are set correctly.
+ "language" should be "C" or "C++" and is used to select the compiler.
+ Default is "C".
+ "text" may be used to specify the code to be build.
+ Returns an empty string for success, an error message for failure.
+ """
+ lang, suffix, msg = _lang2suffix(language)
+ if msg:
+ context.Display("%s\n" % msg)
+ return msg
+
+ if not text:
+ text = """
+int main() {
+ return 0;
+}
+"""
+
+ context.Display("Checking if building a %s file works... " % lang)
+ ret = context.BuildProg(text, suffix)
+ _YesNoResult(context, ret, None, text)
+ return ret
+
+def CheckCC(context):
+ """
+ Configure check for a working C compiler.
+
+ This checks whether the C compiler, as defined in the $CC construction
+ variable, can compile a C source file. It uses the current $CCCOM value
+ too, so that it can test against non working flags.
+
+ """
+ context.Display("Checking whether the C compiler works... ")
+ text = """
+int main()
+{
+ return 0;
+}
+"""
+ ret = _check_empty_program(context, 'CC', text, 'C')
+ _YesNoResult(context, ret, None, text)
+ return ret
+
+def CheckSHCC(context):
+ """
+ Configure check for a working shared C compiler.
+
+ This checks whether the C compiler, as defined in the $SHCC construction
+ variable, can compile a C source file. It uses the current $SHCCCOM value
+ too, so that it can test against non working flags.
+
+ """
+ context.Display("Checking whether the (shared) C compiler works... ")
+ text = """
+int foo()
+{
+ return 0;
+}
+"""
+ ret = _check_empty_program(context, 'SHCC', text, 'C', use_shared = True)
+ _YesNoResult(context, ret, None, text)
+ return ret
+
+def CheckCXX(context):
+ """
+ Configure check for a working CXX compiler.
+
+ This checks whether the CXX compiler, as defined in the $CXX construction
+ variable, can compile a CXX source file. It uses the current $CXXCOM value
+ too, so that it can test against non working flags.
+
+ """
+ context.Display("Checking whether the C++ compiler works... ")
+ text = """
+int main()
+{
+ return 0;
+}
+"""
+ ret = _check_empty_program(context, 'CXX', text, 'C++')
+ _YesNoResult(context, ret, None, text)
+ return ret
+
+def CheckSHCXX(context):
+ """
+ Configure check for a working shared CXX compiler.
+
+ This checks whether the CXX compiler, as defined in the $SHCXX construction
+ variable, can compile a CXX source file. It uses the current $SHCXXCOM value
+ too, so that it can test against non working flags.
+
+ """
+ context.Display("Checking whether the (shared) C++ compiler works... ")
+ text = """
+int main()
+{
+ return 0;
+}
+"""
+ ret = _check_empty_program(context, 'SHCXX', text, 'C++', use_shared = True)
+ _YesNoResult(context, ret, None, text)
+ return ret
+
+def _check_empty_program(context, comp, text, language, use_shared = False):
+ """Return 0 on success, 1 otherwise."""
+ if comp not in context.env or not context.env[comp]:
+ # The compiler construction variable is not set or empty
+ return 1
+
+ lang, suffix, msg = _lang2suffix(language)
+ if msg:
+ return 1
+
+ if use_shared:
+ return context.CompileSharedObject(text, suffix)
+ else:
+ return context.CompileProg(text, suffix)
+
+
+def CheckFunc(context, function_name, header = None, language = None):
+ """
+ Configure check for a function "function_name".
+ "language" should be "C" or "C++" and is used to select the compiler.
+ Default is "C".
+ Optional "header" can be defined to define a function prototype, include a
+ header file or anything else that comes before main().
+ Sets HAVE_function_name in context.havedict according to the result.
+ Note that this uses the current value of compiler and linker flags, make
+ sure $CFLAGS, $CPPFLAGS and $LIBS are set correctly.
+ Returns an empty string for success, an error message for failure.
+ """
+
+ # Remarks from autoconf:
+ # - Don't include <ctype.h> because on OSF/1 3.0 it includes <sys/types.h>
+ # which includes <sys/select.h> which contains a prototype for select.
+ # Similarly for bzero.
+ # - assert.h is included to define __stub macros and hopefully few
+ # prototypes, which can conflict with char $1(); below.
+ # - Override any gcc2 internal prototype to avoid an error.
+ # - We use char for the function declaration because int might match the
+ # return type of a gcc2 builtin and then its argument prototype would
+ # still apply.
+ # - The GNU C library defines this for functions which it implements to
+ # always fail with ENOSYS. Some functions are actually named something
+ # starting with __ and the normal name is an alias.
+
+ if context.headerfilename:
+ includetext = '#include "%s"' % context.headerfilename
+ else:
+ includetext = ''
+ if not header:
+ header = """
+#ifdef __cplusplus
+extern "C"
+#endif
+char %s();""" % function_name
+
+ lang, suffix, msg = _lang2suffix(language)
+ if msg:
+ context.Display("Cannot check for %s(): %s\n" % (function_name, msg))
+ return msg
+
+ text = """
+%(include)s
+#include <assert.h>
+%(hdr)s
+
+int main() {
+#if defined (__stub_%(name)s) || defined (__stub___%(name)s)
+ fail fail fail
+#else
+ %(name)s();
+#endif
+
+ return 0;
+}
+""" % { 'name': function_name,
+ 'include': includetext,
+ 'hdr': header }
+
+ context.Display("Checking for %s function %s()... " % (lang, function_name))
+ ret = context.BuildProg(text, suffix)
+ _YesNoResult(context, ret, "HAVE_" + function_name, text,
+ "Define to 1 if the system has the function `%s'." %\
+ function_name)
+ return ret
+
+
+def CheckHeader(context, header_name, header = None, language = None,
+ include_quotes = None):
+ """
+ Configure check for a C or C++ header file "header_name".
+ Optional "header" can be defined to do something before including the
+ header file (unusual, supported for consistency).
+ "language" should be "C" or "C++" and is used to select the compiler.
+ Default is "C".
+ Sets HAVE_header_name in context.havedict according to the result.
+ Note that this uses the current value of compiler and linker flags, make
+ sure $CFLAGS and $CPPFLAGS are set correctly.
+ Returns an empty string for success, an error message for failure.
+ """
+ # Why compile the program instead of just running the preprocessor?
+ # It is possible that the header file exists, but actually using it may
+ # fail (e.g., because it depends on other header files). Thus this test is
+ # more strict. It may require using the "header" argument.
+ #
+ # Use <> by default, because the check is normally used for system header
+ # files. SCons passes '""' to overrule this.
+
+ # Include "confdefs.h" first, so that the header can use HAVE_HEADER_H.
+ if context.headerfilename:
+ includetext = '#include "%s"\n' % context.headerfilename
+ else:
+ includetext = ''
+ if not header:
+ header = ""
+
+ lang, suffix, msg = _lang2suffix(language)
+ if msg:
+ context.Display("Cannot check for header file %s: %s\n"
+ % (header_name, msg))
+ return msg
+
+ if not include_quotes:
+ include_quotes = "<>"
+
+ text = "%s%s\n#include %s%s%s\n\n" % (includetext, header,
+ include_quotes[0], header_name, include_quotes[1])
+
+ context.Display("Checking for %s header file %s... " % (lang, header_name))
+ ret = context.CompileProg(text, suffix)
+ _YesNoResult(context, ret, "HAVE_" + header_name, text,
+ "Define to 1 if you have the <%s> header file." % header_name)
+ return ret
+
+
+def CheckType(context, type_name, fallback = None,
+ header = None, language = None):
+ """
+ Configure check for a C or C++ type "type_name".
+ Optional "header" can be defined to include a header file.
+ "language" should be "C" or "C++" and is used to select the compiler.
+ Default is "C".
+ Sets HAVE_type_name in context.havedict according to the result.
+ Note that this uses the current value of compiler and linker flags, make
+ sure $CFLAGS, $CPPFLAGS and $LIBS are set correctly.
+ Returns an empty string for success, an error message for failure.
+ """
+
+ # Include "confdefs.h" first, so that the header can use HAVE_HEADER_H.
+ if context.headerfilename:
+ includetext = '#include "%s"' % context.headerfilename
+ else:
+ includetext = ''
+ if not header:
+ header = ""
+
+ lang, suffix, msg = _lang2suffix(language)
+ if msg:
+ context.Display("Cannot check for %s type: %s\n" % (type_name, msg))
+ return msg
+
+ # Remarks from autoconf about this test:
+ # - Grepping for the type in include files is not reliable (grep isn't
+ # portable anyway).
+ # - Using "TYPE my_var;" doesn't work for const qualified types in C++.
+ # Adding an initializer is not valid for some C++ classes.
+ # - Using the type as parameter to a function either fails for K&$ C or for
+ # C++.
+ # - Using "TYPE *my_var;" is valid in C for some types that are not
+ # declared (struct something).
+ # - Using "sizeof(TYPE)" is valid when TYPE is actually a variable.
+ # - Using the previous two together works reliably.
+ text = """
+%(include)s
+%(header)s
+
+int main() {
+ if ((%(name)s *) 0)
+ return 0;
+ if (sizeof (%(name)s))
+ return 0;
+}
+""" % { 'include': includetext,
+ 'header': header,
+ 'name': type_name }
+
+ context.Display("Checking for %s type %s... " % (lang, type_name))
+ ret = context.BuildProg(text, suffix)
+ _YesNoResult(context, ret, "HAVE_" + type_name, text,
+ "Define to 1 if the system has the type `%s'." % type_name)
+ if ret and fallback and context.headerfilename:
+ f = open(context.headerfilename, "a")
+ f.write("typedef %s %s;\n" % (fallback, type_name))
+ f.close()
+
+ return ret
+
+def CheckTypeSize(context, type_name, header = None, language = None, expect = None):
+ """This check can be used to get the size of a given type, or to check whether
+ the type is of expected size.
+
+ Arguments:
+ - type : str
+ the type to check
+ - includes : sequence
+ list of headers to include in the test code before testing the type
+ - language : str
+ 'C' or 'C++'
+ - expect : int
+ if given, will test wether the type has the given number of bytes.
+ If not given, will automatically find the size.
+
+ Returns:
+ status : int
+ 0 if the check failed, or the found size of the type if the check succeeded."""
+
+ # Include "confdefs.h" first, so that the header can use HAVE_HEADER_H.
+ if context.headerfilename:
+ includetext = '#include "%s"' % context.headerfilename
+ else:
+ includetext = ''
+
+ if not header:
+ header = ""
+
+ lang, suffix, msg = _lang2suffix(language)
+ if msg:
+ context.Display("Cannot check for %s type: %s\n" % (type_name, msg))
+ return msg
+
+ src = includetext + header
+ if not expect is None:
+ # Only check if the given size is the right one
+ context.Display('Checking %s is %d bytes... ' % (type_name, expect))
+
+ # test code taken from autoconf: this is a pretty clever hack to find that
+ # a type is of a given size using only compilation. This speeds things up
+ # quite a bit compared to straightforward code using TryRun
+ src = src + r"""
+typedef %s scons_check_type;
+
+int main()
+{
+ static int test_array[1 - 2 * !(((long int) (sizeof(scons_check_type))) == %d)];
+ test_array[0] = 0;
+
+ return 0;
+}
+"""
+
+ st = context.CompileProg(src % (type_name, expect), suffix)
+ if not st:
+ context.Display("yes\n")
+ _Have(context, "SIZEOF_%s" % type_name, expect,
+ "The size of `%s', as computed by sizeof." % type_name)
+ return expect
+ else:
+ context.Display("no\n")
+ _LogFailed(context, src, st)
+ return 0
+ else:
+ # Only check if the given size is the right one
+ context.Message('Checking size of %s ... ' % type_name)
+
+ # We have to be careful with the program we wish to test here since
+ # compilation will be attempted using the current environment's flags.
+ # So make sure that the program will compile without any warning. For
+ # example using: 'int main(int argc, char** argv)' will fail with the
+ # '-Wall -Werror' flags since the variables argc and argv would not be
+ # used in the program...
+ #
+ src = src + """
+#include <stdlib.h>
+#include <stdio.h>
+int main() {
+ printf("%d", (int)sizeof(""" + type_name + """));
+ return 0;
+}
+ """
+ st, out = context.RunProg(src, suffix)
+ try:
+ size = int(out)
+ except ValueError:
+ # If cannot convert output of test prog to an integer (the size),
+ # something went wront, so just fail
+ st = 1
+ size = 0
+
+ if not st:
+ context.Display("yes\n")
+ _Have(context, "SIZEOF_%s" % type_name, size,
+ "The size of `%s', as computed by sizeof." % type_name)
+ return size
+ else:
+ context.Display("no\n")
+ _LogFailed(context, src, st)
+ return 0
+
+ return 0
+
+def CheckDeclaration(context, symbol, includes = None, language = None):
+ """Checks whether symbol is declared.
+
+ Use the same test as autoconf, that is test whether the symbol is defined
+ as a macro or can be used as an r-value.
+
+ Arguments:
+ symbol : str
+ the symbol to check
+ includes : str
+ Optional "header" can be defined to include a header file.
+ language : str
+ only C and C++ supported.
+
+ Returns:
+ status : bool
+ True if the check failed, False if succeeded."""
+
+ # Include "confdefs.h" first, so that the header can use HAVE_HEADER_H.
+ if context.headerfilename:
+ includetext = '#include "%s"' % context.headerfilename
+ else:
+ includetext = ''
+
+ if not includes:
+ includes = ""
+
+ lang, suffix, msg = _lang2suffix(language)
+ if msg:
+ context.Display("Cannot check for declaration %s: %s\n" % (symbol, msg))
+ return msg
+
+ src = includetext + includes
+ context.Display('Checking whether %s is declared... ' % symbol)
+
+ src = src + r"""
+int main()
+{
+#ifndef %s
+ (void) %s;
+#endif
+ ;
+ return 0;
+}
+""" % (symbol, symbol)
+
+ st = context.CompileProg(src, suffix)
+ _YesNoResult(context, st, "HAVE_DECL_" + symbol, src,
+ "Set to 1 if %s is defined." % symbol)
+ return st
+
+def CheckLib(context, libs, func_name = None, header = None,
+ extra_libs = None, call = None, language = None, autoadd = 1,
+ append = True):
+ """
+ Configure check for a C or C++ libraries "libs". Searches through
+ the list of libraries, until one is found where the test succeeds.
+ Tests if "func_name" or "call" exists in the library. Note: if it exists
+ in another library the test succeeds anyway!
+ Optional "header" can be defined to include a header file. If not given a
+ default prototype for "func_name" is added.
+ Optional "extra_libs" is a list of library names to be added after
+ "lib_name" in the build command. To be used for libraries that "lib_name"
+ depends on.
+ Optional "call" replaces the call to "func_name" in the test code. It must
+ consist of complete C statements, including a trailing ";".
+ Both "func_name" and "call" arguments are optional, and in that case, just
+ linking against the libs is tested.
+ "language" should be "C" or "C++" and is used to select the compiler.
+ Default is "C".
+ Note that this uses the current value of compiler and linker flags, make
+ sure $CFLAGS, $CPPFLAGS and $LIBS are set correctly.
+ Returns an empty string for success, an error message for failure.
+ """
+ # Include "confdefs.h" first, so that the header can use HAVE_HEADER_H.
+ if context.headerfilename:
+ includetext = '#include "%s"' % context.headerfilename
+ else:
+ includetext = ''
+ if not header:
+ header = ""
+
+ text = """
+%s
+%s""" % (includetext, header)
+
+ # Add a function declaration if needed.
+ if func_name and func_name != "main":
+ if not header:
+ text = text + """
+#ifdef __cplusplus
+extern "C"
+#endif
+char %s();
+""" % func_name
+
+ # The actual test code.
+ if not call:
+ call = "%s();" % func_name
+
+ # if no function to test, leave main() blank
+ text = text + """
+int
+main() {
+ %s
+return 0;
+}
+""" % (call or "")
+
+ if call:
+ i = call.find("\n")
+ if i > 0:
+ calltext = call[:i] + ".."
+ elif call[-1] == ';':
+ calltext = call[:-1]
+ else:
+ calltext = call
+
+ for lib_name in libs:
+
+ lang, suffix, msg = _lang2suffix(language)
+ if msg:
+ context.Display("Cannot check for library %s: %s\n" % (lib_name, msg))
+ return msg
+
+ # if a function was specified to run in main(), say it
+ if call:
+ context.Display("Checking for %s in %s library %s... "
+ % (calltext, lang, lib_name))
+ # otherwise, just say the name of library and language
+ else:
+ context.Display("Checking for %s library %s... "
+ % (lang, lib_name))
+
+ if lib_name:
+ l = [ lib_name ]
+ if extra_libs:
+ l.extend(extra_libs)
+ if append:
+ oldLIBS = context.AppendLIBS(l)
+ else:
+ oldLIBS = context.PrependLIBS(l)
+ sym = "HAVE_LIB" + lib_name
+ else:
+ oldLIBS = -1
+ sym = None
+
+ ret = context.BuildProg(text, suffix)
+
+ _YesNoResult(context, ret, sym, text,
+ "Define to 1 if you have the `%s' library." % lib_name)
+ if oldLIBS != -1 and (ret or not autoadd):
+ context.SetLIBS(oldLIBS)
+
+ if not ret:
+ return ret
+
+ return ret
+
+def CheckProg(context, prog_name):
+ """
+ Configure check for a specific program.
+
+ Check whether program prog_name exists in path. If it is found,
+ returns the path for it, otherwise returns None.
+ """
+ context.Display("Checking whether %s program exists..." % prog_name)
+ path = context.env.WhereIs(prog_name)
+ if path:
+ context.Display(path + "\n")
+ else:
+ context.Display("no\n")
+ return path
+
+
+#
+# END OF PUBLIC FUNCTIONS
+#
+
+def _YesNoResult(context, ret, key, text, comment = None):
+ """
+ Handle the result of a test with a "yes" or "no" result.
+
+ :Parameters:
+ - `ret` is the return value: empty if OK, error message when not.
+ - `key` is the name of the symbol to be defined (HAVE_foo).
+ - `text` is the source code of the program used for testing.
+ - `comment` is the C comment to add above the line defining the symbol (the comment is automatically put inside a /\* \*/). If None, no comment is added.
+ """
+ if key:
+ _Have(context, key, not ret, comment)
+ if ret:
+ context.Display("no\n")
+ _LogFailed(context, text, ret)
+ else:
+ context.Display("yes\n")
+
+
+def _Have(context, key, have, comment = None):
+ """
+ Store result of a test in context.havedict and context.headerfilename.
+
+ :Parameters:
+ - `key` - is a "HAVE_abc" name. It is turned into all CAPITALS and non-alphanumerics are replaced by an underscore.
+ - `have` - value as it should appear in the header file, include quotes when desired and escape special characters!
+ - `comment` is the C comment to add above the line defining the symbol (the comment is automatically put inside a /\* \*/). If None, no comment is added.
+
+
+ The value of "have" can be:
+ - 1 - Feature is defined, add "#define key".
+ - 0 - Feature is not defined, add "/\* #undef key \*/". Adding "undef" is what autoconf does. Not useful for the compiler, but it shows that the test was done.
+ - number - Feature is defined to this number "#define key have". Doesn't work for 0 or 1, use a string then.
+ - string - Feature is defined to this string "#define key have".
+
+
+ """
+ key_up = key.upper()
+ key_up = re.sub('[^A-Z0-9_]', '_', key_up)
+ context.havedict[key_up] = have
+ if have == 1:
+ line = "#define %s 1\n" % key_up
+ elif have == 0:
+ line = "/* #undef %s */\n" % key_up
+ elif isinstance(have, int):
+ line = "#define %s %d\n" % (key_up, have)
+ else:
+ line = "#define %s %s\n" % (key_up, str(have))
+
+ if comment is not None:
+ lines = "\n/* %s */\n" % comment + line
+ else:
+ lines = "\n" + line
+
+ if context.headerfilename:
+ f = open(context.headerfilename, "a")
+ f.write(lines)
+ f.close()
+ elif hasattr(context,'config_h'):
+ context.config_h = context.config_h + lines
+
+
+def _LogFailed(context, text, msg):
+ """
+ Write to the log about a failed program.
+ Add line numbers, so that error messages can be understood.
+ """
+ if LogInputFiles:
+ context.Log("Failed program was:\n")
+ lines = text.split('\n')
+ if len(lines) and lines[-1] == '':
+ lines = lines[:-1] # remove trailing empty line
+ n = 1
+ for line in lines:
+ context.Log("%d: %s\n" % (n, line))
+ n = n + 1
+ if LogErrorMessages:
+ context.Log("Error message: %s\n" % msg)
+
+
+def _lang2suffix(lang):
+ """
+ Convert a language name to a suffix.
+ When "lang" is empty or None C is assumed.
+ Returns a tuple (lang, suffix, None) when it works.
+ For an unrecognized language returns (None, None, msg).
+
+ Where:
+ - lang = the unified language name
+ - suffix = the suffix, including the leading dot
+ - msg = an error message
+ """
+ if not lang or lang in ["C", "c"]:
+ return ("C", ".c", None)
+ if lang in ["c++", "C++", "cpp", "CXX", "cxx"]:
+ return ("C++", ".cpp", None)
+
+ return None, None, "Unsupported language: %s" % lang
+
+
+# vim: set sw=4 et sts=4 tw=79 fo+=l:
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Debug.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Debug.py
new file mode 100644
index 0000000..706b4c4
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Debug.py
@@ -0,0 +1,243 @@
+"""SCons.Debug
+
+Code for debugging SCons internal things. Shouldn't be
+needed by most users. Quick shortcuts:
+
+from SCons.Debug import caller_trace
+caller_trace()
+
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import os
+import sys
+import time
+import weakref
+import inspect
+
+# Global variable that gets set to 'True' by the Main script,
+# when the creation of class instances should get tracked.
+track_instances = False
+# List of currently tracked classes
+tracked_classes = {}
+
+def logInstanceCreation(instance, name=None):
+ if name is None:
+ name = instance.__class__.__name__
+ if name not in tracked_classes:
+ tracked_classes[name] = []
+ if hasattr(instance, '__dict__'):
+ tracked_classes[name].append(weakref.ref(instance))
+ else:
+ # weakref doesn't seem to work when the instance
+ # contains only slots...
+ tracked_classes[name].append(instance)
+
+def string_to_classes(s):
+ if s == '*':
+ return sorted(tracked_classes.keys())
+ else:
+ return s.split()
+
+def fetchLoggedInstances(classes="*"):
+ classnames = string_to_classes(classes)
+ return [(cn, len(tracked_classes[cn])) for cn in classnames]
+
+def countLoggedInstances(classes, file=sys.stdout):
+ for classname in string_to_classes(classes):
+ file.write("%s: %d\n" % (classname, len(tracked_classes[classname])))
+
+def listLoggedInstances(classes, file=sys.stdout):
+ for classname in string_to_classes(classes):
+ file.write('\n%s:\n' % classname)
+ for ref in tracked_classes[classname]:
+ if inspect.isclass(ref):
+ obj = ref()
+ else:
+ obj = ref
+ if obj is not None:
+ file.write(' %s\n' % repr(obj))
+
+def dumpLoggedInstances(classes, file=sys.stdout):
+ for classname in string_to_classes(classes):
+ file.write('\n%s:\n' % classname)
+ for ref in tracked_classes[classname]:
+ obj = ref()
+ if obj is not None:
+ file.write(' %s:\n' % obj)
+ for key, value in obj.__dict__.items():
+ file.write(' %20s : %s\n' % (key, value))
+
+
+
+if sys.platform[:5] == "linux":
+ # Linux doesn't actually support memory usage stats from getrusage().
+ def memory():
+ with open('/proc/self/stat') as f:
+ mstr = f.read()
+ mstr = mstr.split()[22]
+ return int(mstr)
+elif sys.platform[:6] == 'darwin':
+ #TODO really get memory stats for OS X
+ def memory():
+ return 0
+else:
+ try:
+ import resource
+ except ImportError:
+ try:
+ import win32process
+ import win32api
+ except ImportError:
+ def memory():
+ return 0
+ else:
+ def memory():
+ process_handle = win32api.GetCurrentProcess()
+ memory_info = win32process.GetProcessMemoryInfo( process_handle )
+ return memory_info['PeakWorkingSetSize']
+ else:
+ def memory():
+ res = resource.getrusage(resource.RUSAGE_SELF)
+ return res[4]
+
+# returns caller's stack
+def caller_stack():
+ import traceback
+ tb = traceback.extract_stack()
+ # strip itself and the caller from the output
+ tb = tb[:-2]
+ result = []
+ for back in tb:
+ # (filename, line number, function name, text)
+ key = back[:3]
+ result.append('%s:%d(%s)' % func_shorten(key))
+ return result
+
+caller_bases = {}
+caller_dicts = {}
+
+def caller_trace(back=0):
+ """
+ Trace caller stack and save info into global dicts, which
+ are printed automatically at the end of SCons execution.
+ """
+ global caller_bases, caller_dicts
+ import traceback
+ tb = traceback.extract_stack(limit=3+back)
+ tb.reverse()
+ callee = tb[1][:3]
+ caller_bases[callee] = caller_bases.get(callee, 0) + 1
+ for caller in tb[2:]:
+ caller = callee + caller[:3]
+ try:
+ entry = caller_dicts[callee]
+ except KeyError:
+ caller_dicts[callee] = entry = {}
+ entry[caller] = entry.get(caller, 0) + 1
+ callee = caller
+
+# print a single caller and its callers, if any
+def _dump_one_caller(key, file, level=0):
+ leader = ' '*level
+ for v,c in sorted([(-v,c) for c,v in caller_dicts[key].items()]):
+ file.write("%s %6d %s:%d(%s)\n" % ((leader,-v) + func_shorten(c[-3:])))
+ if c in caller_dicts:
+ _dump_one_caller(c, file, level+1)
+
+# print each call tree
+def dump_caller_counts(file=sys.stdout):
+ for k in sorted(caller_bases.keys()):
+ file.write("Callers of %s:%d(%s), %d calls:\n"
+ % (func_shorten(k) + (caller_bases[k],)))
+ _dump_one_caller(k, file)
+
+shorten_list = [
+ ( '/scons/SCons/', 1),
+ ( '/src/engine/SCons/', 1),
+ ( '/usr/lib/python', 0),
+]
+
+if os.sep != '/':
+ shorten_list = [(t[0].replace('/', os.sep), t[1]) for t in shorten_list]
+
+def func_shorten(func_tuple):
+ f = func_tuple[0]
+ for t in shorten_list:
+ i = f.find(t[0])
+ if i >= 0:
+ if t[1]:
+ i = i + len(t[0])
+ return (f[i:],)+func_tuple[1:]
+ return func_tuple
+
+
+TraceFP = {}
+if sys.platform == 'win32':
+ TraceDefault = 'con'
+else:
+ TraceDefault = '/dev/tty'
+
+TimeStampDefault = None
+StartTime = time.time()
+PreviousTime = StartTime
+
+def Trace(msg, file=None, mode='w', tstamp=None):
+ """Write a trace message to a file. Whenever a file is specified,
+ it becomes the default for the next call to Trace()."""
+ global TraceDefault
+ global TimeStampDefault
+ global PreviousTime
+ if file is None:
+ file = TraceDefault
+ else:
+ TraceDefault = file
+ if tstamp is None:
+ tstamp = TimeStampDefault
+ else:
+ TimeStampDefault = tstamp
+ try:
+ fp = TraceFP[file]
+ except KeyError:
+ try:
+ fp = TraceFP[file] = open(file, mode)
+ except TypeError:
+ # Assume we were passed an open file pointer.
+ fp = file
+ if tstamp:
+ now = time.time()
+ fp.write('%8.4f %8.4f: ' % (now - StartTime, now - PreviousTime))
+ PreviousTime = now
+ fp.write(msg)
+ fp.flush()
+ fp.close()
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Defaults.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Defaults.py
new file mode 100644
index 0000000..69d5c94
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Defaults.py
@@ -0,0 +1,593 @@
+"""SCons.Defaults
+
+Builders and other things for the local site. Here's where we'll
+duplicate the functionality of autoconf until we move it into the
+installation procedure or use something like qmconf.
+
+The code that reads the registry to find MSVC components was borrowed
+from distutils.msvccompiler.
+
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+from __future__ import division
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+
+import os
+import errno
+import shutil
+import stat
+import time
+import sys
+
+import SCons.Action
+import SCons.Builder
+import SCons.CacheDir
+import SCons.Environment
+import SCons.PathList
+import SCons.Subst
+import SCons.Tool
+
+# A placeholder for a default Environment (for fetching source files
+# from source code management systems and the like). This must be
+# initialized later, after the top-level directory is set by the calling
+# interface.
+_default_env = None
+
+# Lazily instantiate the default environment so the overhead of creating
+# it doesn't apply when it's not needed.
+def _fetch_DefaultEnvironment(*args, **kw):
+ """
+ Returns the already-created default construction environment.
+ """
+ global _default_env
+ return _default_env
+
+def DefaultEnvironment(*args, **kw):
+ """
+ Initial public entry point for creating the default construction
+ Environment.
+
+ After creating the environment, we overwrite our name
+ (DefaultEnvironment) with the _fetch_DefaultEnvironment() function,
+ which more efficiently returns the initialized default construction
+ environment without checking for its existence.
+
+ (This function still exists with its _default_check because someone
+ else (*cough* Script/__init__.py *cough*) may keep a reference
+ to this function. So we can't use the fully functional idiom of
+ having the name originally be a something that *only* creates the
+ construction environment and then overwrites the name.)
+ """
+ global _default_env
+ if not _default_env:
+ import SCons.Util
+ _default_env = SCons.Environment.Environment(*args, **kw)
+ if SCons.Util.md5:
+ _default_env.Decider('MD5')
+ else:
+ _default_env.Decider('timestamp-match')
+ global DefaultEnvironment
+ DefaultEnvironment = _fetch_DefaultEnvironment
+ _default_env._CacheDir_path = None
+ return _default_env
+
+# Emitters for setting the shared attribute on object files,
+# and an action for checking that all of the source files
+# going into a shared library are, in fact, shared.
+def StaticObjectEmitter(target, source, env):
+ for tgt in target:
+ tgt.attributes.shared = None
+ return (target, source)
+
+def SharedObjectEmitter(target, source, env):
+ for tgt in target:
+ tgt.attributes.shared = 1
+ return (target, source)
+
+def SharedFlagChecker(source, target, env):
+ same = env.subst('$STATIC_AND_SHARED_OBJECTS_ARE_THE_SAME')
+ if same == '0' or same == '' or same == 'False':
+ for src in source:
+ try:
+ shared = src.attributes.shared
+ except AttributeError:
+ shared = None
+ if not shared:
+ raise SCons.Errors.UserError("Source file: %s is static and is not compatible with shared target: %s" % (src, target[0]))
+
+SharedCheck = SCons.Action.Action(SharedFlagChecker, None)
+
+# Some people were using these variable name before we made
+# SourceFileScanner part of the public interface. Don't break their
+# SConscript files until we've given them some fair warning and a
+# transition period.
+CScan = SCons.Tool.CScanner
+DScan = SCons.Tool.DScanner
+LaTeXScan = SCons.Tool.LaTeXScanner
+ObjSourceScan = SCons.Tool.SourceFileScanner
+ProgScan = SCons.Tool.ProgramScanner
+
+# These aren't really tool scanners, so they don't quite belong with
+# the rest of those in Tool/__init__.py, but I'm not sure where else
+# they should go. Leave them here for now.
+import SCons.Scanner.Dir
+DirScanner = SCons.Scanner.Dir.DirScanner()
+DirEntryScanner = SCons.Scanner.Dir.DirEntryScanner()
+
+# Actions for common languages.
+CAction = SCons.Action.Action("$CCCOM", "$CCCOMSTR")
+ShCAction = SCons.Action.Action("$SHCCCOM", "$SHCCCOMSTR")
+CXXAction = SCons.Action.Action("$CXXCOM", "$CXXCOMSTR")
+ShCXXAction = SCons.Action.Action("$SHCXXCOM", "$SHCXXCOMSTR")
+
+DAction = SCons.Action.Action("$DCOM", "$DCOMSTR")
+ShDAction = SCons.Action.Action("$SHDCOM", "$SHDCOMSTR")
+
+ASAction = SCons.Action.Action("$ASCOM", "$ASCOMSTR")
+ASPPAction = SCons.Action.Action("$ASPPCOM", "$ASPPCOMSTR")
+
+LinkAction = SCons.Action.Action("$LINKCOM", "$LINKCOMSTR")
+ShLinkAction = SCons.Action.Action("$SHLINKCOM", "$SHLINKCOMSTR")
+
+LdModuleLinkAction = SCons.Action.Action("$LDMODULECOM", "$LDMODULECOMSTR")
+
+# Common tasks that we allow users to perform in platform-independent
+# ways by creating ActionFactory instances.
+ActionFactory = SCons.Action.ActionFactory
+
+def get_paths_str(dest):
+ # If dest is a list, we need to manually call str() on each element
+ if SCons.Util.is_List(dest):
+ elem_strs = []
+ for element in dest:
+ elem_strs.append('"' + str(element) + '"')
+ return '[' + ', '.join(elem_strs) + ']'
+ else:
+ return '"' + str(dest) + '"'
+
+permission_dic = {
+ 'u':{
+ 'r':stat.S_IRUSR,
+ 'w':stat.S_IWUSR,
+ 'x':stat.S_IXUSR
+ },
+ 'g':{
+ 'r':stat.S_IRGRP,
+ 'w':stat.S_IWGRP,
+ 'x':stat.S_IXGRP
+ },
+ 'o':{
+ 'r':stat.S_IROTH,
+ 'w':stat.S_IWOTH,
+ 'x':stat.S_IXOTH
+ }
+}
+
+def chmod_func(dest, mode):
+ import SCons.Util
+ from string import digits
+ SCons.Node.FS.invalidate_node_memos(dest)
+ if not SCons.Util.is_List(dest):
+ dest = [dest]
+ if SCons.Util.is_String(mode) and not 0 in [i in digits for i in mode]:
+ mode = int(mode, 8)
+ if not SCons.Util.is_String(mode):
+ for element in dest:
+ os.chmod(str(element), mode)
+ else:
+ mode = str(mode)
+ for operation in mode.split(","):
+ if "=" in operation:
+ operator = "="
+ elif "+" in operation:
+ operator = "+"
+ elif "-" in operation:
+ operator = "-"
+ else:
+ raise SyntaxError("Could not find +, - or =")
+ operation_list = operation.split(operator)
+ if len(operation_list) is not 2:
+ raise SyntaxError("More than one operator found")
+ user = operation_list[0].strip().replace("a", "ugo")
+ permission = operation_list[1].strip()
+ new_perm = 0
+ for u in user:
+ for p in permission:
+ try:
+ new_perm = new_perm | permission_dic[u][p]
+ except KeyError:
+ raise SyntaxError("Unrecognized user or permission format")
+ for element in dest:
+ curr_perm = os.stat(str(element)).st_mode
+ if operator == "=":
+ os.chmod(str(element), new_perm)
+ elif operator == "+":
+ os.chmod(str(element), curr_perm | new_perm)
+ elif operator == "-":
+ os.chmod(str(element), curr_perm & ~new_perm)
+
+def chmod_strfunc(dest, mode):
+ import SCons.Util
+ if not SCons.Util.is_String(mode):
+ return 'Chmod(%s, 0%o)' % (get_paths_str(dest), mode)
+ else:
+ return 'Chmod(%s, "%s")' % (get_paths_str(dest), str(mode))
+
+Chmod = ActionFactory(chmod_func, chmod_strfunc)
+
+def copy_func(dest, src, symlinks=True):
+ """
+ If symlinks (is true), then a symbolic link will be
+ shallow copied and recreated as a symbolic link; otherwise, copying
+ a symbolic link will be equivalent to copying the symbolic link's
+ final target regardless of symbolic link depth.
+ """
+
+ dest = str(dest)
+ src = str(src)
+
+ SCons.Node.FS.invalidate_node_memos(dest)
+ if SCons.Util.is_List(src) and os.path.isdir(dest):
+ for file in src:
+ shutil.copy2(file, dest)
+ return 0
+ elif os.path.islink(src):
+ if symlinks:
+ return os.symlink(os.readlink(src), dest)
+ else:
+ return copy_func(dest, os.path.realpath(src))
+ elif os.path.isfile(src):
+ shutil.copy2(src, dest)
+ return 0
+ else:
+ shutil.copytree(src, dest, symlinks)
+ # copytree returns None in python2 and destination string in python3
+ # A error is raised in both cases, so we can just return 0 for success
+ return 0
+
+Copy = ActionFactory(
+ copy_func,
+ lambda dest, src, symlinks=True: 'Copy("%s", "%s")' % (dest, src)
+)
+
+def delete_func(dest, must_exist=0):
+ SCons.Node.FS.invalidate_node_memos(dest)
+ if not SCons.Util.is_List(dest):
+ dest = [dest]
+ for entry in dest:
+ entry = str(entry)
+ # os.path.exists returns False with broken links that exist
+ entry_exists = os.path.exists(entry) or os.path.islink(entry)
+ if not entry_exists and not must_exist:
+ continue
+ # os.path.isdir returns True when entry is a link to a dir
+ if os.path.isdir(entry) and not os.path.islink(entry):
+ shutil.rmtree(entry, 1)
+ continue
+ os.unlink(entry)
+
+def delete_strfunc(dest, must_exist=0):
+ return 'Delete(%s)' % get_paths_str(dest)
+
+Delete = ActionFactory(delete_func, delete_strfunc)
+
+def mkdir_func(dest):
+ SCons.Node.FS.invalidate_node_memos(dest)
+ if not SCons.Util.is_List(dest):
+ dest = [dest]
+ for entry in dest:
+ try:
+ os.makedirs(str(entry))
+ except os.error as e:
+ p = str(entry)
+ if (e.args[0] == errno.EEXIST or
+ (sys.platform=='win32' and e.args[0]==183)) \
+ and os.path.isdir(str(entry)):
+ pass # not an error if already exists
+ else:
+ raise
+
+Mkdir = ActionFactory(mkdir_func,
+ lambda dir: 'Mkdir(%s)' % get_paths_str(dir))
+
+def move_func(dest, src):
+ SCons.Node.FS.invalidate_node_memos(dest)
+ SCons.Node.FS.invalidate_node_memos(src)
+ shutil.move(src, dest)
+
+Move = ActionFactory(move_func,
+ lambda dest, src: 'Move("%s", "%s")' % (dest, src),
+ convert=str)
+
+def touch_func(dest):
+ SCons.Node.FS.invalidate_node_memos(dest)
+ if not SCons.Util.is_List(dest):
+ dest = [dest]
+ for file in dest:
+ file = str(file)
+ mtime = int(time.time())
+ if os.path.exists(file):
+ atime = os.path.getatime(file)
+ else:
+ open(file, 'w')
+ atime = mtime
+ os.utime(file, (atime, mtime))
+
+Touch = ActionFactory(touch_func,
+ lambda file: 'Touch(%s)' % get_paths_str(file))
+
+# Internal utility functions
+
+def _concat(prefix, list, suffix, env, f=lambda x: x, target=None, source=None):
+ """
+ Creates a new list from 'list' by first interpolating each element
+ in the list using the 'env' dictionary and then calling f on the
+ list, and finally calling _concat_ixes to concatenate 'prefix' and
+ 'suffix' onto each element of the list.
+ """
+ if not list:
+ return list
+
+ l = f(SCons.PathList.PathList(list).subst_path(env, target, source))
+ if l is not None:
+ list = l
+
+ return _concat_ixes(prefix, list, suffix, env)
+
+def _concat_ixes(prefix, list, suffix, env):
+ """
+ Creates a new list from 'list' by concatenating the 'prefix' and
+ 'suffix' arguments onto each element of the list. A trailing space
+ on 'prefix' or leading space on 'suffix' will cause them to be put
+ into separate list elements rather than being concatenated.
+ """
+
+ result = []
+
+ # ensure that prefix and suffix are strings
+ prefix = str(env.subst(prefix, SCons.Subst.SUBST_RAW))
+ suffix = str(env.subst(suffix, SCons.Subst.SUBST_RAW))
+
+ for x in list:
+ if isinstance(x, SCons.Node.FS.File):
+ result.append(x)
+ continue
+ x = str(x)
+ if x:
+
+ if prefix:
+ if prefix[-1] == ' ':
+ result.append(prefix[:-1])
+ elif x[:len(prefix)] != prefix:
+ x = prefix + x
+
+ result.append(x)
+
+ if suffix:
+ if suffix[0] == ' ':
+ result.append(suffix[1:])
+ elif x[-len(suffix):] != suffix:
+ result[-1] = result[-1]+suffix
+
+ return result
+
+def _stripixes(prefix, itms, suffix, stripprefixes, stripsuffixes, env, c=None):
+ """
+ This is a wrapper around _concat()/_concat_ixes() that checks for
+ the existence of prefixes or suffixes on list items and strips them
+ where it finds them. This is used by tools (like the GNU linker)
+ that need to turn something like 'libfoo.a' into '-lfoo'.
+ """
+
+ if not itms:
+ return itms
+
+ if not callable(c):
+ env_c = env['_concat']
+ if env_c != _concat and callable(env_c):
+ # There's a custom _concat() method in the construction
+ # environment, and we've allowed people to set that in
+ # the past (see test/custom-concat.py), so preserve the
+ # backwards compatibility.
+ c = env_c
+ else:
+ c = _concat_ixes
+
+ stripprefixes = list(map(env.subst, SCons.Util.flatten(stripprefixes)))
+ stripsuffixes = list(map(env.subst, SCons.Util.flatten(stripsuffixes)))
+
+ stripped = []
+ for l in SCons.PathList.PathList(itms).subst_path(env, None, None):
+ if isinstance(l, SCons.Node.FS.File):
+ stripped.append(l)
+ continue
+
+ if not SCons.Util.is_String(l):
+ l = str(l)
+
+ for stripprefix in stripprefixes:
+ lsp = len(stripprefix)
+ if l[:lsp] == stripprefix:
+ l = l[lsp:]
+ # Do not strip more than one prefix
+ break
+
+ for stripsuffix in stripsuffixes:
+ lss = len(stripsuffix)
+ if l[-lss:] == stripsuffix:
+ l = l[:-lss]
+ # Do not strip more than one suffix
+ break
+
+ stripped.append(l)
+
+ return c(prefix, stripped, suffix, env)
+
+def processDefines(defs):
+ """process defines, resolving strings, lists, dictionaries, into a list of
+ strings
+ """
+ if SCons.Util.is_List(defs):
+ l = []
+ for d in defs:
+ if d is None:
+ continue
+ elif SCons.Util.is_List(d) or isinstance(d, tuple):
+ if len(d) >= 2:
+ l.append(str(d[0]) + '=' + str(d[1]))
+ else:
+ l.append(str(d[0]))
+ elif SCons.Util.is_Dict(d):
+ for macro,value in d.items():
+ if value is not None:
+ l.append(str(macro) + '=' + str(value))
+ else:
+ l.append(str(macro))
+ elif SCons.Util.is_String(d):
+ l.append(str(d))
+ else:
+ raise SCons.Errors.UserError("DEFINE %s is not a list, dict, string or None."%repr(d))
+ elif SCons.Util.is_Dict(defs):
+ # The items in a dictionary are stored in random order, but
+ # if the order of the command-line options changes from
+ # invocation to invocation, then the signature of the command
+ # line will change and we'll get random unnecessary rebuilds.
+ # Consequently, we have to sort the keys to ensure a
+ # consistent order...
+ l = []
+ for k,v in sorted(defs.items()):
+ if v is None:
+ l.append(str(k))
+ else:
+ l.append(str(k) + '=' + str(v))
+ else:
+ l = [str(defs)]
+ return l
+
+
+def _defines(prefix, defs, suffix, env, c=_concat_ixes):
+ """A wrapper around _concat_ixes that turns a list or string
+ into a list of C preprocessor command-line definitions.
+ """
+
+ return c(prefix, env.subst_path(processDefines(defs)), suffix, env)
+
+
+class NullCmdGenerator(object):
+ """This is a callable class that can be used in place of other
+ command generators if you don't want them to do anything.
+
+ The __call__ method for this class simply returns the thing
+ you instantiated it with.
+
+ Example usage:
+ env["DO_NOTHING"] = NullCmdGenerator
+ env["LINKCOM"] = "${DO_NOTHING('$LINK $SOURCES $TARGET')}"
+ """
+
+ def __init__(self, cmd):
+ self.cmd = cmd
+
+ def __call__(self, target, source, env, for_signature=None):
+ return self.cmd
+
+
+class Variable_Method_Caller(object):
+ """A class for finding a construction variable on the stack and
+ calling one of its methods.
+
+ We use this to support "construction variables" in our string
+ eval()s that actually stand in for methods--specifically, use
+ of "RDirs" in call to _concat that should actually execute the
+ "TARGET.RDirs" method. (We used to support this by creating a little
+ "build dictionary" that mapped RDirs to the method, but this got in
+ the way of Memoizing construction environments, because we had to
+ create new environment objects to hold the variables.)
+ """
+ def __init__(self, variable, method):
+ self.variable = variable
+ self.method = method
+ def __call__(self, *args, **kw):
+ try: 1//0
+ except ZeroDivisionError:
+ # Don't start iterating with the current stack-frame to
+ # prevent creating reference cycles (f_back is safe).
+ frame = sys.exc_info()[2].tb_frame.f_back
+ variable = self.variable
+ while frame:
+ if variable in frame.f_locals:
+ v = frame.f_locals[variable]
+ if v:
+ method = getattr(v, self.method)
+ return method(*args, **kw)
+ frame = frame.f_back
+ return None
+
+# if $version_var is not empty, returns env[flags_var], otherwise returns None
+def __libversionflags(env, version_var, flags_var):
+ try:
+ if env.subst('$'+version_var):
+ return env[flags_var]
+ except KeyError:
+ pass
+ return None
+
+ConstructionEnvironment = {
+ 'BUILDERS' : {},
+ 'SCANNERS' : [ SCons.Tool.SourceFileScanner ],
+ 'CONFIGUREDIR' : '#/.sconf_temp',
+ 'CONFIGURELOG' : '#/config.log',
+ 'CPPSUFFIXES' : SCons.Tool.CSuffixes,
+ 'DSUFFIXES' : SCons.Tool.DSuffixes,
+ 'ENV' : {},
+ 'IDLSUFFIXES' : SCons.Tool.IDLSuffixes,
+# 'LATEXSUFFIXES' : SCons.Tool.LaTeXSuffixes, # moved to the TeX tools generate functions
+ '_concat' : _concat,
+ '_defines' : _defines,
+ '_stripixes' : _stripixes,
+ '_LIBFLAGS' : '${_concat(LIBLINKPREFIX, LIBS, LIBLINKSUFFIX, __env__)}',
+ '_LIBDIRFLAGS' : '$( ${_concat(LIBDIRPREFIX, LIBPATH, LIBDIRSUFFIX, __env__, RDirs, TARGET, SOURCE)} $)',
+ '_CPPINCFLAGS' : '$( ${_concat(INCPREFIX, CPPPATH, INCSUFFIX, __env__, RDirs, TARGET, SOURCE)} $)',
+ '_CPPDEFFLAGS' : '${_defines(CPPDEFPREFIX, CPPDEFINES, CPPDEFSUFFIX, __env__)}',
+
+ '__libversionflags' : __libversionflags,
+ '__SHLIBVERSIONFLAGS' : '${__libversionflags(__env__,"SHLIBVERSION","_SHLIBVERSIONFLAGS")}',
+ '__LDMODULEVERSIONFLAGS' : '${__libversionflags(__env__,"LDMODULEVERSION","_LDMODULEVERSIONFLAGS")}',
+ '__DSHLIBVERSIONFLAGS' : '${__libversionflags(__env__,"DSHLIBVERSION","_DSHLIBVERSIONFLAGS")}',
+
+ 'TEMPFILE' : NullCmdGenerator,
+ 'Dir' : Variable_Method_Caller('TARGET', 'Dir'),
+ 'Dirs' : Variable_Method_Caller('TARGET', 'Dirs'),
+ 'File' : Variable_Method_Caller('TARGET', 'File'),
+ 'RDirs' : Variable_Method_Caller('TARGET', 'RDirs'),
+}
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Defaults.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Defaults.xml
new file mode 100644
index 0000000..23a68dc
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Defaults.xml
@@ -0,0 +1,586 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+__COPYRIGHT__
+
+This file is processed by the bin/SConsDoc.py module.
+See its __doc__ string for a discussion of the format.
+-->
+
+<!DOCTYPE sconsdoc [
+<!ENTITY % scons SYSTEM '../../../doc/scons.mod'>
+%scons;
+<!ENTITY % builders-mod SYSTEM '../../../doc/generated/builders.mod'>
+%builders-mod;
+<!ENTITY % functions-mod SYSTEM '../../../doc/generated/functions.mod'>
+%functions-mod;
+<!ENTITY % tools-mod SYSTEM '../../../doc/generated/tools.mod'>
+%tools-mod;
+<!ENTITY % variables-mod SYSTEM '../../../doc/generated/variables.mod'>
+%variables-mod;
+]>
+
+<sconsdoc xmlns="http://www.scons.org/dbxsd/v1.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://www.scons.org/dbxsd/v1.0 http://www.scons.org/dbxsd/v1.0/scons.xsd">
+
+<cvar name ="_concat">
+<summary>
+<para>
+A function used to produce variables like &cv-_CPPINCFLAGS;. It takes
+four or five
+arguments: a prefix to concatenate onto each element, a list of
+elements, a suffix to concatenate onto each element, an environment
+for variable interpolation, and an optional function that will be
+called to transform the list before concatenation.
+</para>
+
+<example_commands>
+env['_CPPINCFLAGS'] = '$( ${_concat(INCPREFIX, CPPPATH, INCSUFFIX, __env__, RDirs)} $)',
+</example_commands>
+</summary>
+</cvar>
+
+<cvar name="CONFIGUREDIR">
+<summary>
+<para>
+The name of the directory in which
+Configure context test files are written.
+The default is
+<filename>.sconf_temp</filename>
+in the top-level directory
+containing the
+<filename>SConstruct</filename>
+file.
+</para>
+</summary>
+</cvar>
+
+<cvar name="CONFIGURELOG">
+<summary>
+<para>
+The name of the Configure context log file.
+The default is
+<filename>config.log</filename>
+in the top-level directory
+containing the
+<filename>SConstruct</filename>
+file.
+</para>
+</summary>
+</cvar>
+
+<cvar name="_CPPDEFFLAGS">
+<summary>
+<para>
+An automatically-generated construction variable
+containing the C preprocessor command-line options
+to define values.
+The value of &cv-_CPPDEFFLAGS; is created
+by appending &cv-CPPDEFPREFIX; and &cv-CPPDEFSUFFIX;
+to the beginning and end
+of each definition in &cv-CPPDEFINES;.
+</para>
+</summary>
+</cvar>
+
+<cvar name="CPPDEFINES">
+<summary>
+<para>
+A platform independent specification of C preprocessor definitions.
+The definitions will be added to command lines
+through the automatically-generated
+&cv-_CPPDEFFLAGS; construction variable (see above),
+which is constructed according to
+the type of value of &cv-CPPDEFINES;:
+</para>
+
+<para>
+If &cv-CPPDEFINES; is a string,
+the values of the
+&cv-CPPDEFPREFIX; and &cv-CPPDEFSUFFIX;
+construction variables
+will be added to the beginning and end.
+</para>
+
+<example_commands>
+# Will add -Dxyz to POSIX compiler command lines,
+# and /Dxyz to Microsoft Visual C++ command lines.
+env = Environment(CPPDEFINES='xyz')
+</example_commands>
+
+<para>
+If &cv-CPPDEFINES; is a list,
+the values of the
+&cv-CPPDEFPREFIX; and &cv-CPPDEFSUFFIX;
+construction variables
+will be appended to the beginning and end
+of each element in the list.
+If any element is a list or tuple,
+then the first item is the name being
+defined and the second item is its value:
+</para>
+
+<example_commands>
+# Will add -DB=2 -DA to POSIX compiler command lines,
+# and /DB=2 /DA to Microsoft Visual C++ command lines.
+env = Environment(CPPDEFINES=[('B', 2), 'A'])
+</example_commands>
+
+<para>
+If &cv-CPPDEFINES; is a dictionary,
+the values of the
+&cv-CPPDEFPREFIX; and &cv-CPPDEFSUFFIX;
+construction variables
+will be appended to the beginning and end
+of each item from the dictionary.
+The key of each dictionary item
+is a name being defined
+to the dictionary item's corresponding value;
+if the value is
+<literal>None</literal>,
+then the name is defined without an explicit value.
+Note that the resulting flags are sorted by keyword
+to ensure that the order of the options on the
+command line is consistent each time
+&scons;
+is run.
+</para>
+
+<example_commands>
+# Will add -DA -DB=2 to POSIX compiler command lines,
+# and /DA /DB=2 to Microsoft Visual C++ command lines.
+env = Environment(CPPDEFINES={'B':2, 'A':None})
+</example_commands>
+</summary>
+</cvar>
+
+<cvar name="CPPDEFPREFIX">
+<summary>
+<para>
+The prefix used to specify preprocessor definitions
+on the C compiler command line.
+This will be appended to the beginning of each definition
+in the &cv-CPPDEFINES; construction variable
+when the &cv-_CPPDEFFLAGS; variable is automatically generated.
+</para>
+</summary>
+</cvar>
+
+<cvar name="CPPDEFSUFFIX">
+<summary>
+<para>
+The suffix used to specify preprocessor definitions
+on the C compiler command line.
+This will be appended to the end of each definition
+in the &cv-CPPDEFINES; construction variable
+when the &cv-_CPPDEFFLAGS; variable is automatically generated.
+</para>
+</summary>
+</cvar>
+
+<cvar name="_CPPINCFLAGS">
+<summary>
+<para>
+An automatically-generated construction variable
+containing the C preprocessor command-line options
+for specifying directories to be searched for include files.
+The value of &cv-_CPPINCFLAGS; is created
+by appending &cv-INCPREFIX; and &cv-INCSUFFIX;
+to the beginning and end
+of each directory in &cv-CPPPATH;.
+</para>
+</summary>
+</cvar>
+
+<cvar name="CPPPATH">
+<summary>
+<para>
+The list of directories that the C preprocessor will search for include
+directories. The C/C++ implicit dependency scanner will search these
+directories for include files. Don't explicitly put include directory
+arguments in CCFLAGS or CXXFLAGS because the result will be non-portable
+and the directories will not be searched by the dependency scanner. Note:
+directory names in CPPPATH will be looked-up relative to the SConscript
+directory when they are used in a command. To force
+&scons;
+to look-up a directory relative to the root of the source tree use #:
+</para>
+
+<example_commands>
+env = Environment(CPPPATH='#/include')
+</example_commands>
+
+<para>
+The directory look-up can also be forced using the
+&Dir;()
+function:
+</para>
+
+<example_commands>
+include = Dir('include')
+env = Environment(CPPPATH=include)
+</example_commands>
+
+<para>
+The directory list will be added to command lines
+through the automatically-generated
+&cv-_CPPINCFLAGS;
+construction variable,
+which is constructed by
+appending the values of the
+&cv-INCPREFIX; and &cv-INCSUFFIX;
+construction variables
+to the beginning and end
+of each directory in &cv-CPPPATH;.
+Any command lines you define that need
+the CPPPATH directory list should
+include &cv-_CPPINCFLAGS;:
+</para>
+
+<example_commands>
+env = Environment(CCCOM="my_compiler $_CPPINCFLAGS -c -o $TARGET $SOURCE")
+</example_commands>
+</summary>
+</cvar>
+
+<cvar name="Dir">
+<summary>
+<para>
+A function that converts a string
+into a Dir instance relative to the target being built.
+</para>
+</summary>
+</cvar>
+
+<cvar name="Dirs">
+<summary>
+<para>
+A function that converts a list of strings
+into a list of Dir instances relative to the target being built.
+</para>
+</summary>
+</cvar>
+
+<cvar name="DSUFFIXES">
+<summary>
+<para>
+The list of suffixes of files that will be scanned
+for imported D package files.
+The default list is:
+</para>
+
+<example_commands>
+['.d']
+</example_commands>
+</summary>
+</cvar>
+
+<cvar name="File">
+<summary>
+<para>
+A function that converts a string into a File instance relative to the
+target being built.
+</para>
+</summary>
+</cvar>
+
+<cvar name="IDLSUFFIXES">
+<summary>
+<para>
+The list of suffixes of files that will be scanned
+for IDL implicit dependencies
+(#include or import lines).
+The default list is:
+</para>
+
+<example_commands>
+[".idl", ".IDL"]
+</example_commands>
+</summary>
+</cvar>
+
+<cvar name="INCPREFIX">
+<summary>
+<para>
+The prefix used to specify an include directory on the C compiler command
+line.
+This will be appended to the beginning of each directory
+in the &cv-CPPPATH; and &cv-FORTRANPATH; construction variables
+when the &cv-_CPPINCFLAGS; and &cv-_FORTRANINCFLAGS;
+variables are automatically generated.
+</para>
+</summary>
+</cvar>
+
+<cvar name="INCSUFFIX">
+<summary>
+<para>
+The suffix used to specify an include directory on the C compiler command
+line.
+This will be appended to the end of each directory
+in the &cv-CPPPATH; and &cv-FORTRANPATH; construction variables
+when the &cv-_CPPINCFLAGS; and &cv-_FORTRANINCFLAGS;
+variables are automatically generated.
+</para>
+</summary>
+</cvar>
+
+<cvar name="INSTALL">
+<summary>
+<para>
+A function to be called to install a file into a
+destination file name.
+The default function copies the file into the destination
+(and sets the destination file's mode and permission bits
+to match the source file's).
+The function takes the following arguments:
+</para>
+
+<example_commands>
+def install(dest, source, env):
+</example_commands>
+
+<para>
+<varname>dest</varname>
+is the path name of the destination file.
+<varname>source</varname>
+is the path name of the source file.
+<varname>env</varname>
+is the construction environment
+(a dictionary of construction values)
+in force for this file installation.
+</para>
+</summary>
+</cvar>
+
+<cvar name="INSTALLSTR">
+<summary>
+<para>
+The string displayed when a file is
+installed into a destination file name.
+The default is:
+</para>
+<example_commands>
+Install file: "$SOURCE" as "$TARGET"
+</example_commands>
+</summary>
+</cvar>
+
+<cvar name="LATEXSUFFIXES">
+<summary>
+<para>
+The list of suffixes of files that will be scanned
+for LaTeX implicit dependencies
+(<literal>\include</literal> or <literal>\import</literal> files).
+The default list is:
+</para>
+
+<example_commands>
+[".tex", ".ltx", ".latex"]
+</example_commands>
+</summary>
+</cvar>
+
+<cvar name="_LIBDIRFLAGS">
+<summary>
+<para>
+An automatically-generated construction variable
+containing the linker command-line options
+for specifying directories to be searched for library.
+The value of &cv-_LIBDIRFLAGS; is created
+by appending &cv-LIBDIRPREFIX; and &cv-LIBDIRSUFFIX;
+to the beginning and end
+of each directory in &cv-LIBPATH;.
+</para>
+</summary>
+</cvar>
+
+<cvar name="LIBDIRPREFIX">
+<summary>
+<para>
+The prefix used to specify a library directory on the linker command line.
+This will be appended to the beginning of each directory
+in the &cv-LIBPATH; construction variable
+when the &cv-_LIBDIRFLAGS; variable is automatically generated.
+</para>
+</summary>
+</cvar>
+
+<cvar name="LIBDIRSUFFIX">
+<summary>
+<para>
+The suffix used to specify a library directory on the linker command line.
+This will be appended to the end of each directory
+in the &cv-LIBPATH; construction variable
+when the &cv-_LIBDIRFLAGS; variable is automatically generated.
+</para>
+</summary>
+</cvar>
+
+<cvar name="_LIBFLAGS">
+<summary>
+<para>
+An automatically-generated construction variable
+containing the linker command-line options
+for specifying libraries to be linked with the resulting target.
+The value of &cv-_LIBFLAGS; is created
+by appending &cv-LIBLINKPREFIX; and &cv-LIBLINKSUFFIX;
+to the beginning and end
+of each filename in &cv-LIBS;.
+</para>
+</summary>
+</cvar>
+
+<cvar name="LIBLINKPREFIX">
+<summary>
+<para>
+The prefix used to specify a library to link on the linker command line.
+This will be appended to the beginning of each library
+in the &cv-LIBS; construction variable
+when the &cv-_LIBFLAGS; variable is automatically generated.
+</para>
+</summary>
+</cvar>
+
+<cvar name="LIBLINKSUFFIX">
+<summary>
+<para>
+The suffix used to specify a library to link on the linker command line.
+This will be appended to the end of each library
+in the &cv-LIBS; construction variable
+when the &cv-_LIBFLAGS; variable is automatically generated.
+</para>
+</summary>
+</cvar>
+
+<cvar name="LIBPATH">
+<summary>
+<para>
+The list of directories that will be searched for libraries.
+The implicit dependency scanner will search these
+directories for include files. Don't explicitly put include directory
+arguments in &cv-LINKFLAGS; or &cv-SHLINKFLAGS;
+because the result will be non-portable
+and the directories will not be searched by the dependency scanner. Note:
+directory names in LIBPATH will be looked-up relative to the SConscript
+directory when they are used in a command. To force
+&scons;
+to look-up a directory relative to the root of the source tree use #:
+</para>
+
+<example_commands>
+env = Environment(LIBPATH='#/libs')
+</example_commands>
+
+<para>
+The directory look-up can also be forced using the
+&Dir;()
+function:
+</para>
+
+<example_commands>
+libs = Dir('libs')
+env = Environment(LIBPATH=libs)
+</example_commands>
+
+<para>
+The directory list will be added to command lines
+through the automatically-generated
+&cv-_LIBDIRFLAGS;
+construction variable,
+which is constructed by
+appending the values of the
+&cv-LIBDIRPREFIX; and &cv-LIBDIRSUFFIX;
+construction variables
+to the beginning and end
+of each directory in &cv-LIBPATH;.
+Any command lines you define that need
+the LIBPATH directory list should
+include &cv-_LIBDIRFLAGS;:
+</para>
+
+<example_commands>
+env = Environment(LINKCOM="my_linker $_LIBDIRFLAGS $_LIBFLAGS -o $TARGET $SOURCE")
+</example_commands>
+</summary>
+</cvar>
+
+<cvar name="LIBS">
+<summary>
+<para>
+A list of one or more libraries
+that will be linked with
+any executable programs
+created by this environment.
+</para>
+
+<para>
+The library list will be added to command lines
+through the automatically-generated
+&cv-_LIBFLAGS;
+construction variable,
+which is constructed by
+appending the values of the
+&cv-LIBLINKPREFIX; and &cv-LIBLINKSUFFIX;
+construction variables
+to the beginning and end
+of each filename in &cv-LIBS;.
+Any command lines you define that need
+the LIBS library list should
+include &cv-_LIBFLAGS;:
+</para>
+
+<example_commands>
+env = Environment(LINKCOM="my_linker $_LIBDIRFLAGS $_LIBFLAGS -o $TARGET $SOURCE")
+</example_commands>
+
+<para>
+If you add a
+File
+object to the
+&cv-LIBS;
+list, the name of that file will be added to
+&cv-_LIBFLAGS;,
+and thus the link line, as is, without
+&cv-LIBLINKPREFIX;
+or
+&cv-LIBLINKSUFFIX;.
+For example:
+</para>
+
+<example_commands>
+env.Append(LIBS=File('/tmp/mylib.so'))
+</example_commands>
+
+<para>
+In all cases, scons will add dependencies from the executable program to
+all the libraries in this list.
+</para>
+</summary>
+</cvar>
+
+<cvar name="RDirs">
+<summary>
+<para>
+A function that converts a string into a list of Dir instances by
+searching the repositories.
+</para>
+</summary>
+</cvar>
+
+<scons_function name="DefaultEnvironment">
+<arguments signature="global">
+([args])
+</arguments>
+<summary>
+<para>
+Creates and returns a default construction environment object.
+This construction environment is used internally by SCons
+in order to execute many of the global functions in this list,
+and to fetch source files transparently
+from source code management systems.
+</para>
+</summary>
+</scons_function>
+
+</sconsdoc>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/DefaultsTests.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/DefaultsTests.py
new file mode 100644
index 0000000..141243b
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/DefaultsTests.py
@@ -0,0 +1,92 @@
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import SCons.compat
+
+import os
+import sys
+import unittest
+
+from collections import UserDict
+
+import TestCmd
+import TestUnit
+
+import SCons.Errors
+
+from SCons.Defaults import *
+
+class DefaultsTestCase(unittest.TestCase):
+ def test_mkdir_func0(self):
+ test = TestCmd.TestCmd(workdir = '')
+ test.subdir('sub')
+ subdir2 = test.workpath('sub', 'dir1', 'dir2')
+ # Simple smoke test
+ mkdir_func(subdir2)
+ mkdir_func(subdir2) # 2nd time should be OK too
+
+ def test_mkdir_func1(self):
+ test = TestCmd.TestCmd(workdir = '')
+ test.subdir('sub')
+ subdir1 = test.workpath('sub', 'dir1')
+ subdir2 = test.workpath('sub', 'dir1', 'dir2')
+ # No error if asked to create existing dir
+ os.makedirs(subdir2)
+ mkdir_func(subdir2)
+ mkdir_func(subdir1)
+
+ def test_mkdir_func2(self):
+ test = TestCmd.TestCmd(workdir = '')
+ test.subdir('sub')
+ subdir1 = test.workpath('sub', 'dir1')
+ subdir2 = test.workpath('sub', 'dir1', 'dir2')
+ file = test.workpath('sub', 'dir1', 'dir2', 'file')
+
+ # make sure it does error if asked to create a dir
+ # where there's already a file
+ os.makedirs(subdir2)
+ test.write(file, "test\n")
+ try:
+ mkdir_func(file)
+ except os.error as e:
+ pass
+ else:
+ fail("expected os.error")
+
+
+if __name__ == "__main__":
+ suite = unittest.TestSuite()
+ tclasses = [ DefaultsTestCase,
+ ]
+ for tclass in tclasses:
+ names = unittest.getTestCaseNames(tclass, 'test_')
+ suite.addTests(list(map(tclass, names)))
+ TestUnit.run(suite)
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Environment.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Environment.py
new file mode 100644
index 0000000..42b28e6
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Environment.py
@@ -0,0 +1,2443 @@
+"""SCons.Environment
+
+Base class for construction Environments. These are
+the primary objects used to communicate dependency and
+construction information to the build engine.
+
+Keyword arguments supplied when the construction Environment
+is created are construction variables used to initialize the
+Environment
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+
+import copy
+import os
+import sys
+import re
+import shlex
+from collections import UserDict
+
+import SCons.Action
+import SCons.Builder
+import SCons.Debug
+from SCons.Debug import logInstanceCreation
+import SCons.Defaults
+import SCons.Errors
+import SCons.Memoize
+import SCons.Node
+import SCons.Node.Alias
+import SCons.Node.FS
+import SCons.Node.Python
+import SCons.Platform
+import SCons.SConf
+import SCons.SConsign
+import SCons.Subst
+import SCons.Tool
+import SCons.Util
+import SCons.Warnings
+
+class _Null(object):
+ pass
+
+_null = _Null
+
+_warn_copy_deprecated = True
+_warn_source_signatures_deprecated = True
+_warn_target_signatures_deprecated = True
+
+CleanTargets = {}
+CalculatorArgs = {}
+
+semi_deepcopy = SCons.Util.semi_deepcopy
+semi_deepcopy_dict = SCons.Util.semi_deepcopy_dict
+
+# Pull UserError into the global name space for the benefit of
+# Environment().SourceSignatures(), which has some import statements
+# which seem to mess up its ability to reference SCons directly.
+UserError = SCons.Errors.UserError
+
+def alias_builder(env, target, source):
+ pass
+
+AliasBuilder = SCons.Builder.Builder(action = alias_builder,
+ target_factory = SCons.Node.Alias.default_ans.Alias,
+ source_factory = SCons.Node.FS.Entry,
+ multi = 1,
+ is_explicit = None,
+ name='AliasBuilder')
+
+def apply_tools(env, tools, toolpath):
+ # Store the toolpath in the Environment.
+ if toolpath is not None:
+ env['toolpath'] = toolpath
+
+ if not tools:
+ return
+ # Filter out null tools from the list.
+ for tool in [_f for _f in tools if _f]:
+ if SCons.Util.is_List(tool) or isinstance(tool, tuple):
+ toolname = tool[0]
+ toolargs = tool[1] # should be a dict of kw args
+ tool = env.Tool(toolname, **toolargs)
+ else:
+ env.Tool(tool)
+
+# These names are (or will be) controlled by SCons; users should never
+# set or override them. This warning can optionally be turned off,
+# but scons will still ignore the illegal variable names even if it's off.
+reserved_construction_var_names = [
+ 'CHANGED_SOURCES',
+ 'CHANGED_TARGETS',
+ 'SOURCE',
+ 'SOURCES',
+ 'TARGET',
+ 'TARGETS',
+ 'UNCHANGED_SOURCES',
+ 'UNCHANGED_TARGETS',
+]
+
+future_reserved_construction_var_names = [
+ #'HOST_OS',
+ #'HOST_ARCH',
+ #'HOST_CPU',
+ ]
+
+def copy_non_reserved_keywords(dict):
+ result = semi_deepcopy(dict)
+ for k in list(result.keys()):
+ if k in reserved_construction_var_names:
+ msg = "Ignoring attempt to set reserved variable `$%s'"
+ SCons.Warnings.warn(SCons.Warnings.ReservedVariableWarning, msg % k)
+ del result[k]
+ return result
+
+def _set_reserved(env, key, value):
+ msg = "Ignoring attempt to set reserved variable `$%s'"
+ SCons.Warnings.warn(SCons.Warnings.ReservedVariableWarning, msg % key)
+
+def _set_future_reserved(env, key, value):
+ env._dict[key] = value
+ msg = "`$%s' will be reserved in a future release and setting it will become ignored"
+ SCons.Warnings.warn(SCons.Warnings.FutureReservedVariableWarning, msg % key)
+
+def _set_BUILDERS(env, key, value):
+ try:
+ bd = env._dict[key]
+ for k in list(bd.keys()):
+ del bd[k]
+ except KeyError:
+ bd = BuilderDict(kwbd, env)
+ env._dict[key] = bd
+ for k, v in value.items():
+ if not SCons.Builder.is_a_Builder(v):
+ raise SCons.Errors.UserError('%s is not a Builder.' % repr(v))
+ bd.update(value)
+
+def _del_SCANNERS(env, key):
+ del env._dict[key]
+ env.scanner_map_delete()
+
+def _set_SCANNERS(env, key, value):
+ env._dict[key] = value
+ env.scanner_map_delete()
+
+def _delete_duplicates(l, keep_last):
+ """Delete duplicates from a sequence, keeping the first or last."""
+ seen=set()
+ result=[]
+ if keep_last: # reverse in & out, then keep first
+ l.reverse()
+ for i in l:
+ try:
+ if i not in seen:
+ result.append(i)
+ seen.add(i)
+ except TypeError:
+ # probably unhashable. Just keep it.
+ result.append(i)
+ if keep_last:
+ result.reverse()
+ return result
+
+
+
+# The following is partly based on code in a comment added by Peter
+# Shannon at the following page (there called the "transplant" class):
+#
+# ASPN : Python Cookbook : Dynamically added methods to a class
+# http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/81732
+#
+# We had independently been using the idiom as BuilderWrapper, but
+# factoring out the common parts into this base class, and making
+# BuilderWrapper a subclass that overrides __call__() to enforce specific
+# Builder calling conventions, simplified some of our higher-layer code.
+
+class MethodWrapper(object):
+ """
+ A generic Wrapper class that associates a method (which can
+ actually be any callable) with an object. As part of creating this
+ MethodWrapper object an attribute with the specified (by default,
+ the name of the supplied method) is added to the underlying object.
+ When that new "method" is called, our __call__() method adds the
+ object as the first argument, simulating the Python behavior of
+ supplying "self" on method calls.
+
+ We hang on to the name by which the method was added to the underlying
+ base class so that we can provide a method to "clone" ourselves onto
+ a new underlying object being copied (without which we wouldn't need
+ to save that info).
+ """
+ def __init__(self, object, method, name=None):
+ if name is None:
+ name = method.__name__
+ self.object = object
+ self.method = method
+ self.name = name
+ setattr(self.object, name, self)
+
+ def __call__(self, *args, **kwargs):
+ nargs = (self.object,) + args
+ return self.method(*nargs, **kwargs)
+
+ def clone(self, new_object):
+ """
+ Returns an object that re-binds the underlying "method" to
+ the specified new object.
+ """
+ return self.__class__(new_object, self.method, self.name)
+
+class BuilderWrapper(MethodWrapper):
+ """
+ A MethodWrapper subclass that that associates an environment with
+ a Builder.
+
+ This mainly exists to wrap the __call__() function so that all calls
+ to Builders can have their argument lists massaged in the same way
+ (treat a lone argument as the source, treat two arguments as target
+ then source, make sure both target and source are lists) without
+ having to have cut-and-paste code to do it.
+
+ As a bit of obsessive backwards compatibility, we also intercept
+ attempts to get or set the "env" or "builder" attributes, which were
+ the names we used before we put the common functionality into the
+ MethodWrapper base class. We'll keep this around for a while in case
+ people shipped Tool modules that reached into the wrapper (like the
+ Tool/qt.py module does, or did). There shouldn't be a lot attribute
+ fetching or setting on these, so a little extra work shouldn't hurt.
+ """
+ def __call__(self, target=None, source=_null, *args, **kw):
+ if source is _null:
+ source = target
+ target = None
+ if target is not None and not SCons.Util.is_List(target):
+ target = [target]
+ if source is not None and not SCons.Util.is_List(source):
+ source = [source]
+ return MethodWrapper.__call__(self, target, source, *args, **kw)
+
+ def __repr__(self):
+ return '<BuilderWrapper %s>' % repr(self.name)
+
+ def __str__(self):
+ return self.__repr__()
+
+ def __getattr__(self, name):
+ if name == 'env':
+ return self.object
+ elif name == 'builder':
+ return self.method
+ else:
+ raise AttributeError(name)
+
+ def __setattr__(self, name, value):
+ if name == 'env':
+ self.object = value
+ elif name == 'builder':
+ self.method = value
+ else:
+ self.__dict__[name] = value
+
+ # This allows a Builder to be executed directly
+ # through the Environment to which it's attached.
+ # In practice, we shouldn't need this, because
+ # builders actually get executed through a Node.
+ # But we do have a unit test for this, and can't
+ # yet rule out that it would be useful in the
+ # future, so leave it for now.
+ #def execute(self, **kw):
+ # kw['env'] = self.env
+ # self.builder.execute(**kw)
+
+class BuilderDict(UserDict):
+ """This is a dictionary-like class used by an Environment to hold
+ the Builders. We need to do this because every time someone changes
+ the Builders in the Environment's BUILDERS dictionary, we must
+ update the Environment's attributes."""
+ def __init__(self, dict, env):
+ # Set self.env before calling the superclass initialization,
+ # because it will end up calling our other methods, which will
+ # need to point the values in this dictionary to self.env.
+ self.env = env
+ UserDict.__init__(self, dict)
+
+ def __semi_deepcopy__(self):
+ # These cannot be copied since they would both modify the same builder object, and indeed
+ # just copying would modify the original builder
+ raise TypeError( 'cannot semi_deepcopy a BuilderDict' )
+
+ def __setitem__(self, item, val):
+ try:
+ method = getattr(self.env, item).method
+ except AttributeError:
+ pass
+ else:
+ self.env.RemoveMethod(method)
+ UserDict.__setitem__(self, item, val)
+ BuilderWrapper(self.env, val, item)
+
+ def __delitem__(self, item):
+ UserDict.__delitem__(self, item)
+ delattr(self.env, item)
+
+ def update(self, dict):
+ for i, v in dict.items():
+ self.__setitem__(i, v)
+
+
+
+_is_valid_var = re.compile(r'[_a-zA-Z]\w*$')
+
+def is_valid_construction_var(varstr):
+ """Return if the specified string is a legitimate construction
+ variable.
+ """
+ return _is_valid_var.match(varstr)
+
+
+
+class SubstitutionEnvironment(object):
+ """Base class for different flavors of construction environments.
+
+ This class contains a minimal set of methods that handle construction
+ variable expansion and conversion of strings to Nodes, which may or
+ may not be actually useful as a stand-alone class. Which methods
+ ended up in this class is pretty arbitrary right now. They're
+ basically the ones which we've empirically determined are common to
+ the different construction environment subclasses, and most of the
+ others that use or touch the underlying dictionary of construction
+ variables.
+
+ Eventually, this class should contain all the methods that we
+ determine are necessary for a "minimal" interface to the build engine.
+ A full "native Python" SCons environment has gotten pretty heavyweight
+ with all of the methods and Tools and construction variables we've
+ jammed in there, so it would be nice to have a lighter weight
+ alternative for interfaces that don't need all of the bells and
+ whistles. (At some point, we'll also probably rename this class
+ "Base," since that more reflects what we want this class to become,
+ but because we've released comments that tell people to subclass
+ Environment.Base to create their own flavors of construction
+ environment, we'll save that for a future refactoring when this
+ class actually becomes useful.)
+ """
+
+ def __init__(self, **kw):
+ """Initialization of an underlying SubstitutionEnvironment class.
+ """
+ if SCons.Debug.track_instances: logInstanceCreation(self, 'Environment.SubstitutionEnvironment')
+ self.fs = SCons.Node.FS.get_default_fs()
+ self.ans = SCons.Node.Alias.default_ans
+ self.lookup_list = SCons.Node.arg2nodes_lookups
+ self._dict = kw.copy()
+ self._init_special()
+ self.added_methods = []
+ #self._memo = {}
+
+ def _init_special(self):
+ """Initial the dispatch tables for special handling of
+ special construction variables."""
+ self._special_del = {}
+ self._special_del['SCANNERS'] = _del_SCANNERS
+
+ self._special_set = {}
+ for key in reserved_construction_var_names:
+ self._special_set[key] = _set_reserved
+ for key in future_reserved_construction_var_names:
+ self._special_set[key] = _set_future_reserved
+ self._special_set['BUILDERS'] = _set_BUILDERS
+ self._special_set['SCANNERS'] = _set_SCANNERS
+
+ # Freeze the keys of self._special_set in a list for use by
+ # methods that need to check. (Empirically, list scanning has
+ # gotten better than dict.has_key() in Python 2.5.)
+ self._special_set_keys = list(self._special_set.keys())
+
+ def __eq__(self, other):
+ return self._dict == other._dict
+
+ def __delitem__(self, key):
+ special = self._special_del.get(key)
+ if special:
+ special(self, key)
+ else:
+ del self._dict[key]
+
+ def __getitem__(self, key):
+ return self._dict[key]
+
+ def __setitem__(self, key, value):
+ # This is heavily used. This implementation is the best we have
+ # according to the timings in bench/env.__setitem__.py.
+ #
+ # The "key in self._special_set_keys" test here seems to perform
+ # pretty well for the number of keys we have. A hard-coded
+ # list works a little better in Python 2.5, but that has the
+ # disadvantage of maybe getting out of sync if we ever add more
+ # variable names. Using self._special_set.has_key() works a
+ # little better in Python 2.4, but is worse than this test.
+ # So right now it seems like a good trade-off, but feel free to
+ # revisit this with bench/env.__setitem__.py as needed (and
+ # as newer versions of Python come out).
+ if key in self._special_set_keys:
+ self._special_set[key](self, key, value)
+ else:
+ # If we already have the entry, then it's obviously a valid
+ # key and we don't need to check. If we do check, using a
+ # global, pre-compiled regular expression directly is more
+ # efficient than calling another function or a method.
+ if key not in self._dict \
+ and not _is_valid_var.match(key):
+ raise SCons.Errors.UserError("Illegal construction variable `%s'" % key)
+ self._dict[key] = value
+
+ def get(self, key, default=None):
+ """Emulates the get() method of dictionaries."""
+ return self._dict.get(key, default)
+
+ def has_key(self, key):
+ return key in self._dict
+
+ def __contains__(self, key):
+ return self._dict.__contains__(key)
+
+ def items(self):
+ return list(self._dict.items())
+
+ def arg2nodes(self, args, node_factory=_null, lookup_list=_null, **kw):
+ if node_factory is _null:
+ node_factory = self.fs.File
+ if lookup_list is _null:
+ lookup_list = self.lookup_list
+
+ if not args:
+ return []
+
+ args = SCons.Util.flatten(args)
+
+ nodes = []
+ for v in args:
+ if SCons.Util.is_String(v):
+ n = None
+ for l in lookup_list:
+ n = l(v)
+ if n is not None:
+ break
+ if n is not None:
+ if SCons.Util.is_String(n):
+ # n = self.subst(n, raw=1, **kw)
+ kw['raw'] = 1
+ n = self.subst(n, **kw)
+ if node_factory:
+ n = node_factory(n)
+ if SCons.Util.is_List(n):
+ nodes.extend(n)
+ else:
+ nodes.append(n)
+ elif node_factory:
+ # v = node_factory(self.subst(v, raw=1, **kw))
+ kw['raw'] = 1
+ v = node_factory(self.subst(v, **kw))
+ if SCons.Util.is_List(v):
+ nodes.extend(v)
+ else:
+ nodes.append(v)
+ else:
+ nodes.append(v)
+
+ return nodes
+
+ def gvars(self):
+ return self._dict
+
+ def lvars(self):
+ return {}
+
+ def subst(self, string, raw=0, target=None, source=None, conv=None, executor=None):
+ """Recursively interpolates construction variables from the
+ Environment into the specified string, returning the expanded
+ result. Construction variables are specified by a $ prefix
+ in the string and begin with an initial underscore or
+ alphabetic character followed by any number of underscores
+ or alphanumeric characters. The construction variable names
+ may be surrounded by curly braces to separate the name from
+ trailing characters.
+ """
+ gvars = self.gvars()
+ lvars = self.lvars()
+ lvars['__env__'] = self
+ if executor:
+ lvars.update(executor.get_lvars())
+ return SCons.Subst.scons_subst(string, self, raw, target, source, gvars, lvars, conv)
+
+ def subst_kw(self, kw, raw=0, target=None, source=None):
+ nkw = {}
+ for k, v in kw.items():
+ k = self.subst(k, raw, target, source)
+ if SCons.Util.is_String(v):
+ v = self.subst(v, raw, target, source)
+ nkw[k] = v
+ return nkw
+
+ def subst_list(self, string, raw=0, target=None, source=None, conv=None, executor=None):
+ """Calls through to SCons.Subst.scons_subst_list(). See
+ the documentation for that function."""
+ gvars = self.gvars()
+ lvars = self.lvars()
+ lvars['__env__'] = self
+ if executor:
+ lvars.update(executor.get_lvars())
+ return SCons.Subst.scons_subst_list(string, self, raw, target, source, gvars, lvars, conv)
+
+ def subst_path(self, path, target=None, source=None):
+ """Substitute a path list, turning EntryProxies into Nodes
+ and leaving Nodes (and other objects) as-is."""
+
+ if not SCons.Util.is_List(path):
+ path = [path]
+
+ def s(obj):
+ """This is the "string conversion" routine that we have our
+ substitutions use to return Nodes, not strings. This relies
+ on the fact that an EntryProxy object has a get() method that
+ returns the underlying Node that it wraps, which is a bit of
+ architectural dependence that we might need to break or modify
+ in the future in response to additional requirements."""
+ try:
+ get = obj.get
+ except AttributeError:
+ obj = SCons.Util.to_String_for_subst(obj)
+ else:
+ obj = get()
+ return obj
+
+ r = []
+ for p in path:
+ if SCons.Util.is_String(p):
+ p = self.subst(p, target=target, source=source, conv=s)
+ if SCons.Util.is_List(p):
+ if len(p) == 1:
+ p = p[0]
+ else:
+ # We have an object plus a string, or multiple
+ # objects that we need to smush together. No choice
+ # but to make them into a string.
+ p = ''.join(map(SCons.Util.to_String_for_subst, p))
+ else:
+ p = s(p)
+ r.append(p)
+ return r
+
+ subst_target_source = subst
+
+ def backtick(self, command):
+ import subprocess
+ # common arguments
+ kw = { 'stdin' : 'devnull',
+ 'stdout' : subprocess.PIPE,
+ 'stderr' : subprocess.PIPE,
+ 'universal_newlines' : True,
+ }
+ # if the command is a list, assume it's been quoted
+ # othewise force a shell
+ if not SCons.Util.is_List(command): kw['shell'] = True
+ # run constructed command
+ p = SCons.Action._subproc(self, command, **kw)
+ out,err = p.communicate()
+ status = p.wait()
+ if err:
+ sys.stderr.write(u"" + err)
+ if status:
+ raise OSError("'%s' exited %d" % (command, status))
+ return out
+
+ def AddMethod(self, function, name=None):
+ """
+ Adds the specified function as a method of this construction
+ environment with the specified name. If the name is omitted,
+ the default name is the name of the function itself.
+ """
+ method = MethodWrapper(self, function, name)
+ self.added_methods.append(method)
+
+ def RemoveMethod(self, function):
+ """
+ Removes the specified function's MethodWrapper from the
+ added_methods list, so we don't re-bind it when making a clone.
+ """
+ self.added_methods = [dm for dm in self.added_methods if not dm.method is function]
+
+ def Override(self, overrides):
+ """
+ Produce a modified environment whose variables are overridden by
+ the overrides dictionaries. "overrides" is a dictionary that
+ will override the variables of this environment.
+
+ This function is much more efficient than Clone() or creating
+ a new Environment because it doesn't copy the construction
+ environment dictionary, it just wraps the underlying construction
+ environment, and doesn't even create a wrapper object if there
+ are no overrides.
+ """
+ if not overrides: return self
+ o = copy_non_reserved_keywords(overrides)
+ if not o: return self
+ overrides = {}
+ merges = None
+ for key, value in o.items():
+ if key == 'parse_flags':
+ merges = value
+ else:
+ overrides[key] = SCons.Subst.scons_subst_once(value, self, key)
+ env = OverrideEnvironment(self, overrides)
+ if merges: env.MergeFlags(merges)
+ return env
+
+ def ParseFlags(self, *flags):
+ """
+ Parse the set of flags and return a dict with the flags placed
+ in the appropriate entry. The flags are treated as a typical
+ set of command-line flags for a GNU-like toolchain and used to
+ populate the entries in the dict immediately below. If one of
+ the flag strings begins with a bang (exclamation mark), it is
+ assumed to be a command and the rest of the string is executed;
+ the result of that evaluation is then added to the dict.
+ """
+ dict = {
+ 'ASFLAGS' : SCons.Util.CLVar(''),
+ 'CFLAGS' : SCons.Util.CLVar(''),
+ 'CCFLAGS' : SCons.Util.CLVar(''),
+ 'CXXFLAGS' : SCons.Util.CLVar(''),
+ 'CPPDEFINES' : [],
+ 'CPPFLAGS' : SCons.Util.CLVar(''),
+ 'CPPPATH' : [],
+ 'FRAMEWORKPATH' : SCons.Util.CLVar(''),
+ 'FRAMEWORKS' : SCons.Util.CLVar(''),
+ 'LIBPATH' : [],
+ 'LIBS' : [],
+ 'LINKFLAGS' : SCons.Util.CLVar(''),
+ 'RPATH' : [],
+ }
+
+ def do_parse(arg):
+ # if arg is a sequence, recurse with each element
+ if not arg:
+ return
+
+ if not SCons.Util.is_String(arg):
+ for t in arg: do_parse(t)
+ return
+
+ # if arg is a command, execute it
+ if arg[0] == '!':
+ arg = self.backtick(arg[1:])
+
+ # utility function to deal with -D option
+ def append_define(name, dict = dict):
+ t = name.split('=')
+ if len(t) == 1:
+ dict['CPPDEFINES'].append(name)
+ else:
+ dict['CPPDEFINES'].append([t[0], '='.join(t[1:])])
+
+ # Loop through the flags and add them to the appropriate option.
+ # This tries to strike a balance between checking for all possible
+ # flags and keeping the logic to a finite size, so it doesn't
+ # check for some that don't occur often. It particular, if the
+ # flag is not known to occur in a config script and there's a way
+ # of passing the flag to the right place (by wrapping it in a -W
+ # flag, for example) we don't check for it. Note that most
+ # preprocessor options are not handled, since unhandled options
+ # are placed in CCFLAGS, so unless the preprocessor is invoked
+ # separately, these flags will still get to the preprocessor.
+ # Other options not currently handled:
+ # -iqoutedir (preprocessor search path)
+ # -u symbol (linker undefined symbol)
+ # -s (linker strip files)
+ # -static* (linker static binding)
+ # -shared* (linker dynamic binding)
+ # -symbolic (linker global binding)
+ # -R dir (deprecated linker rpath)
+ # IBM compilers may also accept -qframeworkdir=foo
+
+ params = shlex.split(arg)
+ append_next_arg_to = None # for multi-word args
+ for arg in params:
+ if append_next_arg_to:
+ if append_next_arg_to == 'CPPDEFINES':
+ append_define(arg)
+ elif append_next_arg_to == '-include':
+ t = ('-include', self.fs.File(arg))
+ dict['CCFLAGS'].append(t)
+ elif append_next_arg_to == '-isysroot':
+ t = ('-isysroot', arg)
+ dict['CCFLAGS'].append(t)
+ dict['LINKFLAGS'].append(t)
+ elif append_next_arg_to == '-isystem':
+ t = ('-isystem', arg)
+ dict['CCFLAGS'].append(t)
+ elif append_next_arg_to == '-arch':
+ t = ('-arch', arg)
+ dict['CCFLAGS'].append(t)
+ dict['LINKFLAGS'].append(t)
+ else:
+ dict[append_next_arg_to].append(arg)
+ append_next_arg_to = None
+ elif not arg[0] in ['-', '+']:
+ dict['LIBS'].append(self.fs.File(arg))
+ elif arg == '-dylib_file':
+ dict['LINKFLAGS'].append(arg)
+ append_next_arg_to = 'LINKFLAGS'
+ elif arg[:2] == '-L':
+ if arg[2:]:
+ dict['LIBPATH'].append(arg[2:])
+ else:
+ append_next_arg_to = 'LIBPATH'
+ elif arg[:2] == '-l':
+ if arg[2:]:
+ dict['LIBS'].append(arg[2:])
+ else:
+ append_next_arg_to = 'LIBS'
+ elif arg[:2] == '-I':
+ if arg[2:]:
+ dict['CPPPATH'].append(arg[2:])
+ else:
+ append_next_arg_to = 'CPPPATH'
+ elif arg[:4] == '-Wa,':
+ dict['ASFLAGS'].append(arg[4:])
+ dict['CCFLAGS'].append(arg)
+ elif arg[:4] == '-Wl,':
+ if arg[:11] == '-Wl,-rpath=':
+ dict['RPATH'].append(arg[11:])
+ elif arg[:7] == '-Wl,-R,':
+ dict['RPATH'].append(arg[7:])
+ elif arg[:6] == '-Wl,-R':
+ dict['RPATH'].append(arg[6:])
+ else:
+ dict['LINKFLAGS'].append(arg)
+ elif arg[:4] == '-Wp,':
+ dict['CPPFLAGS'].append(arg)
+ elif arg[:2] == '-D':
+ if arg[2:]:
+ append_define(arg[2:])
+ else:
+ append_next_arg_to = 'CPPDEFINES'
+ elif arg == '-framework':
+ append_next_arg_to = 'FRAMEWORKS'
+ elif arg[:14] == '-frameworkdir=':
+ dict['FRAMEWORKPATH'].append(arg[14:])
+ elif arg[:2] == '-F':
+ if arg[2:]:
+ dict['FRAMEWORKPATH'].append(arg[2:])
+ else:
+ append_next_arg_to = 'FRAMEWORKPATH'
+ elif arg in ['-mno-cygwin',
+ '-pthread',
+ '-openmp',
+ '-fopenmp']:
+ dict['CCFLAGS'].append(arg)
+ dict['LINKFLAGS'].append(arg)
+ elif arg == '-mwindows':
+ dict['LINKFLAGS'].append(arg)
+ elif arg[:5] == '-std=':
+ if arg[5:].find('++')!=-1:
+ key='CXXFLAGS'
+ else:
+ key='CFLAGS'
+ dict[key].append(arg)
+ elif arg[0] == '+':
+ dict['CCFLAGS'].append(arg)
+ dict['LINKFLAGS'].append(arg)
+ elif arg in ['-include', '-isysroot', '-isystem', '-arch']:
+ append_next_arg_to = arg
+ else:
+ dict['CCFLAGS'].append(arg)
+
+ for arg in flags:
+ do_parse(arg)
+ return dict
+
+ def MergeFlags(self, args, unique=1, dict=None):
+ """
+ Merge the dict in args into the construction variables of this
+ env, or the passed-in dict. If args is not a dict, it is
+ converted into a dict using ParseFlags. If unique is not set,
+ the flags are appended rather than merged.
+ """
+
+ if dict is None:
+ dict = self
+ if not SCons.Util.is_Dict(args):
+ args = self.ParseFlags(args)
+ if not unique:
+ self.Append(**args)
+ return self
+ for key, value in args.items():
+ if not value:
+ continue
+ try:
+ orig = self[key]
+ except KeyError:
+ orig = value
+ else:
+ if not orig:
+ orig = value
+ elif value:
+ # Add orig and value. The logic here was lifted from
+ # part of env.Append() (see there for a lot of comments
+ # about the order in which things are tried) and is
+ # used mainly to handle coercion of strings to CLVar to
+ # "do the right thing" given (e.g.) an original CCFLAGS
+ # string variable like '-pipe -Wall'.
+ try:
+ orig = orig + value
+ except (KeyError, TypeError):
+ try:
+ add_to_orig = orig.append
+ except AttributeError:
+ value.insert(0, orig)
+ orig = value
+ else:
+ add_to_orig(value)
+ t = []
+ if key[-4:] == 'PATH':
+ ### keep left-most occurence
+ for v in orig:
+ if v not in t:
+ t.append(v)
+ else:
+ ### keep right-most occurence
+ orig.reverse()
+ for v in orig:
+ if v not in t:
+ t.insert(0, v)
+ self[key] = t
+ return self
+
+
+def default_decide_source(dependency, target, prev_ni):
+ f = SCons.Defaults.DefaultEnvironment().decide_source
+ return f(dependency, target, prev_ni)
+
+def default_decide_target(dependency, target, prev_ni):
+ f = SCons.Defaults.DefaultEnvironment().decide_target
+ return f(dependency, target, prev_ni)
+
+def default_copy_from_cache(src, dst):
+ f = SCons.Defaults.DefaultEnvironment().copy_from_cache
+ return f(src, dst)
+
+class Base(SubstitutionEnvironment):
+ """Base class for "real" construction Environments. These are the
+ primary objects used to communicate dependency and construction
+ information to the build engine.
+
+ Keyword arguments supplied when the construction Environment
+ is created are construction variables used to initialize the
+ Environment.
+ """
+
+ #######################################################################
+ # This is THE class for interacting with the SCons build engine,
+ # and it contains a lot of stuff, so we're going to try to keep this
+ # a little organized by grouping the methods.
+ #######################################################################
+
+ #######################################################################
+ # Methods that make an Environment act like a dictionary. These have
+ # the expected standard names for Python mapping objects. Note that
+ # we don't actually make an Environment a subclass of UserDict for
+ # performance reasons. Note also that we only supply methods for
+ # dictionary functionality that we actually need and use.
+ #######################################################################
+
+ def __init__(self,
+ platform=None,
+ tools=None,
+ toolpath=None,
+ variables=None,
+ parse_flags = None,
+ **kw):
+ """
+ Initialization of a basic SCons construction environment,
+ including setting up special construction variables like BUILDER,
+ PLATFORM, etc., and searching for and applying available Tools.
+
+ Note that we do *not* call the underlying base class
+ (SubsitutionEnvironment) initialization, because we need to
+ initialize things in a very specific order that doesn't work
+ with the much simpler base class initialization.
+ """
+ if SCons.Debug.track_instances: logInstanceCreation(self, 'Environment.Base')
+ self._memo = {}
+ self.fs = SCons.Node.FS.get_default_fs()
+ self.ans = SCons.Node.Alias.default_ans
+ self.lookup_list = SCons.Node.arg2nodes_lookups
+ self._dict = semi_deepcopy(SCons.Defaults.ConstructionEnvironment)
+ self._init_special()
+ self.added_methods = []
+
+ # We don't use AddMethod, or define these as methods in this
+ # class, because we *don't* want these functions to be bound
+ # methods. They need to operate independently so that the
+ # settings will work properly regardless of whether a given
+ # target ends up being built with a Base environment or an
+ # OverrideEnvironment or what have you.
+ self.decide_target = default_decide_target
+ self.decide_source = default_decide_source
+
+ self.copy_from_cache = default_copy_from_cache
+
+ self._dict['BUILDERS'] = BuilderDict(self._dict['BUILDERS'], self)
+
+ if platform is None:
+ platform = self._dict.get('PLATFORM', None)
+ if platform is None:
+ platform = SCons.Platform.Platform()
+ if SCons.Util.is_String(platform):
+ platform = SCons.Platform.Platform(platform)
+ self._dict['PLATFORM'] = str(platform)
+ platform(self)
+
+ self._dict['HOST_OS'] = self._dict.get('HOST_OS',None)
+ self._dict['HOST_ARCH'] = self._dict.get('HOST_ARCH',None)
+
+ # Now set defaults for TARGET_{OS|ARCH}
+ self._dict['TARGET_OS'] = self._dict.get('TARGET_OS',None)
+ self._dict['TARGET_ARCH'] = self._dict.get('TARGET_ARCH',None)
+
+
+ # Apply the passed-in and customizable variables to the
+ # environment before calling the tools, because they may use
+ # some of them during initialization.
+ if 'options' in kw:
+ # Backwards compatibility: they may stll be using the
+ # old "options" keyword.
+ variables = kw['options']
+ del kw['options']
+ self.Replace(**kw)
+ keys = list(kw.keys())
+ if variables:
+ keys = keys + list(variables.keys())
+ variables.Update(self)
+
+ save = {}
+ for k in keys:
+ try:
+ save[k] = self._dict[k]
+ except KeyError:
+ # No value may have been set if they tried to pass in a
+ # reserved variable name like TARGETS.
+ pass
+
+ SCons.Tool.Initializers(self)
+
+ if tools is None:
+ tools = self._dict.get('TOOLS', None)
+ if tools is None:
+ tools = ['default']
+ apply_tools(self, tools, toolpath)
+
+ # Now restore the passed-in and customized variables
+ # to the environment, since the values the user set explicitly
+ # should override any values set by the tools.
+ for key, val in save.items():
+ self._dict[key] = val
+
+ # Finally, apply any flags to be merged in
+ if parse_flags: self.MergeFlags(parse_flags)
+
+ #######################################################################
+ # Utility methods that are primarily for internal use by SCons.
+ # These begin with lower-case letters.
+ #######################################################################
+
+ def get_builder(self, name):
+ """Fetch the builder with the specified name from the environment.
+ """
+ try:
+ return self._dict['BUILDERS'][name]
+ except KeyError:
+ return None
+
+ def get_CacheDir(self):
+ try:
+ path = self._CacheDir_path
+ except AttributeError:
+ path = SCons.Defaults.DefaultEnvironment()._CacheDir_path
+ try:
+ if path == self._last_CacheDir_path:
+ return self._last_CacheDir
+ except AttributeError:
+ pass
+ cd = SCons.CacheDir.CacheDir(path)
+ self._last_CacheDir_path = path
+ self._last_CacheDir = cd
+ return cd
+
+ def get_factory(self, factory, default='File'):
+ """Return a factory function for creating Nodes for this
+ construction environment.
+ """
+ name = default
+ try:
+ is_node = issubclass(factory, SCons.Node.FS.Base)
+ except TypeError:
+ # The specified factory isn't a Node itself--it's
+ # most likely None, or possibly a callable.
+ pass
+ else:
+ if is_node:
+ # The specified factory is a Node (sub)class. Try to
+ # return the FS method that corresponds to the Node's
+ # name--that is, we return self.fs.Dir if they want a Dir,
+ # self.fs.File for a File, etc.
+ try: name = factory.__name__
+ except AttributeError: pass
+ else: factory = None
+ if not factory:
+ # They passed us None, or we picked up a name from a specified
+ # class, so return the FS method. (Note that we *don't*
+ # use our own self.{Dir,File} methods because that would
+ # cause env.subst() to be called twice on the file name,
+ # interfering with files that have $$ in them.)
+ factory = getattr(self.fs, name)
+ return factory
+
+ @SCons.Memoize.CountMethodCall
+ def _gsm(self):
+ try:
+ return self._memo['_gsm']
+ except KeyError:
+ pass
+
+ result = {}
+
+ try:
+ scanners = self._dict['SCANNERS']
+ except KeyError:
+ pass
+ else:
+ # Reverse the scanner list so that, if multiple scanners
+ # claim they can scan the same suffix, earlier scanners
+ # in the list will overwrite later scanners, so that
+ # the result looks like a "first match" to the user.
+ if not SCons.Util.is_List(scanners):
+ scanners = [scanners]
+ else:
+ scanners = scanners[:] # copy so reverse() doesn't mod original
+ scanners.reverse()
+ for scanner in scanners:
+ for k in scanner.get_skeys(self):
+ if k and self['PLATFORM'] == 'win32':
+ k = k.lower()
+ result[k] = scanner
+
+ self._memo['_gsm'] = result
+
+ return result
+
+ def get_scanner(self, skey):
+ """Find the appropriate scanner given a key (usually a file suffix).
+ """
+ if skey and self['PLATFORM'] == 'win32':
+ skey = skey.lower()
+ return self._gsm().get(skey)
+
+ def scanner_map_delete(self, kw=None):
+ """Delete the cached scanner map (if we need to).
+ """
+ try:
+ del self._memo['_gsm']
+ except KeyError:
+ pass
+
+ def _update(self, dict):
+ """Update an environment's values directly, bypassing the normal
+ checks that occur when users try to set items.
+ """
+ self._dict.update(dict)
+
+ def get_src_sig_type(self):
+ try:
+ return self.src_sig_type
+ except AttributeError:
+ t = SCons.Defaults.DefaultEnvironment().src_sig_type
+ self.src_sig_type = t
+ return t
+
+ def get_tgt_sig_type(self):
+ try:
+ return self.tgt_sig_type
+ except AttributeError:
+ t = SCons.Defaults.DefaultEnvironment().tgt_sig_type
+ self.tgt_sig_type = t
+ return t
+
+ #######################################################################
+ # Public methods for manipulating an Environment. These begin with
+ # upper-case letters. The essential characteristic of methods in
+ # this section is that they do *not* have corresponding same-named
+ # global functions. For example, a stand-alone Append() function
+ # makes no sense, because Append() is all about appending values to
+ # an Environment's construction variables.
+ #######################################################################
+
+ def Append(self, **kw):
+ """Append values to existing construction variables
+ in an Environment.
+ """
+ kw = copy_non_reserved_keywords(kw)
+ for key, val in kw.items():
+ # It would be easier on the eyes to write this using
+ # "continue" statements whenever we finish processing an item,
+ # but Python 1.5.2 apparently doesn't let you use "continue"
+ # within try:-except: blocks, so we have to nest our code.
+ try:
+ if key == 'CPPDEFINES' and SCons.Util.is_String(self._dict[key]):
+ self._dict[key] = [self._dict[key]]
+ orig = self._dict[key]
+ except KeyError:
+ # No existing variable in the environment, so just set
+ # it to the new value.
+ if key == 'CPPDEFINES' and SCons.Util.is_String(val):
+ self._dict[key] = [val]
+ else:
+ self._dict[key] = val
+ else:
+ try:
+ # Check if the original looks like a dictionary.
+ # If it is, we can't just try adding the value because
+ # dictionaries don't have __add__() methods, and
+ # things like UserList will incorrectly coerce the
+ # original dict to a list (which we don't want).
+ update_dict = orig.update
+ except AttributeError:
+ try:
+ # Most straightforward: just try to add them
+ # together. This will work in most cases, when the
+ # original and new values are of compatible types.
+ self._dict[key] = orig + val
+ except (KeyError, TypeError):
+ try:
+ # Check if the original is a list.
+ add_to_orig = orig.append
+ except AttributeError:
+ # The original isn't a list, but the new
+ # value is (by process of elimination),
+ # so insert the original in the new value
+ # (if there's one to insert) and replace
+ # the variable with it.
+ if orig:
+ val.insert(0, orig)
+ self._dict[key] = val
+ else:
+ # The original is a list, so append the new
+ # value to it (if there's a value to append).
+ if val:
+ add_to_orig(val)
+ else:
+ # The original looks like a dictionary, so update it
+ # based on what we think the value looks like.
+ if SCons.Util.is_List(val):
+ if key == 'CPPDEFINES':
+ tmp = []
+ for (k, v) in orig.items():
+ if v is not None:
+ tmp.append((k, v))
+ else:
+ tmp.append((k,))
+ orig = tmp
+ orig += val
+ self._dict[key] = orig
+ else:
+ for v in val:
+ orig[v] = None
+ else:
+ try:
+ update_dict(val)
+ except (AttributeError, TypeError, ValueError):
+ if SCons.Util.is_Dict(val):
+ for k, v in val.items():
+ orig[k] = v
+ else:
+ orig[val] = None
+ self.scanner_map_delete(kw)
+
+ # allow Dirs and strings beginning with # for top-relative
+ # Note this uses the current env's fs (in self).
+ def _canonicalize(self, path):
+ if not SCons.Util.is_String(path): # typically a Dir
+ path = str(path)
+ if path and path[0] == '#':
+ path = str(self.fs.Dir(path))
+ return path
+
+ def AppendENVPath(self, name, newpath, envname = 'ENV',
+ sep = os.pathsep, delete_existing=1):
+ """Append path elements to the path 'name' in the 'ENV'
+ dictionary for this environment. Will only add any particular
+ path once, and will normpath and normcase all paths to help
+ assure this. This can also handle the case where the env
+ variable is a list instead of a string.
+
+ If delete_existing is 0, a newpath which is already in the path
+ will not be moved to the end (it will be left where it is).
+ """
+
+ orig = ''
+ if envname in self._dict and name in self._dict[envname]:
+ orig = self._dict[envname][name]
+
+ nv = SCons.Util.AppendPath(orig, newpath, sep, delete_existing,
+ canonicalize=self._canonicalize)
+
+ if envname not in self._dict:
+ self._dict[envname] = {}
+
+ self._dict[envname][name] = nv
+
+ def AppendUnique(self, delete_existing=0, **kw):
+ """Append values to existing construction variables
+ in an Environment, if they're not already there.
+ If delete_existing is 1, removes existing values first, so
+ values move to end.
+ """
+ kw = copy_non_reserved_keywords(kw)
+ for key, val in kw.items():
+ if SCons.Util.is_List(val):
+ val = _delete_duplicates(val, delete_existing)
+ if key not in self._dict or self._dict[key] in ('', None):
+ self._dict[key] = val
+ elif SCons.Util.is_Dict(self._dict[key]) and \
+ SCons.Util.is_Dict(val):
+ self._dict[key].update(val)
+ elif SCons.Util.is_List(val):
+ dk = self._dict[key]
+ if key == 'CPPDEFINES':
+ tmp = []
+ for i in val:
+ if SCons.Util.is_List(i):
+ if len(i) >= 2:
+ tmp.append((i[0], i[1]))
+ else:
+ tmp.append((i[0],))
+ elif SCons.Util.is_Tuple(i):
+ tmp.append(i)
+ else:
+ tmp.append((i,))
+ val = tmp
+ # Construct a list of (key, value) tuples.
+ if SCons.Util.is_Dict(dk):
+ tmp = []
+ for (k, v) in dk.items():
+ if v is not None:
+ tmp.append((k, v))
+ else:
+ tmp.append((k,))
+ dk = tmp
+ elif SCons.Util.is_String(dk):
+ dk = [(dk,)]
+ else:
+ tmp = []
+ for i in dk:
+ if SCons.Util.is_List(i):
+ if len(i) >= 2:
+ tmp.append((i[0], i[1]))
+ else:
+ tmp.append((i[0],))
+ elif SCons.Util.is_Tuple(i):
+ tmp.append(i)
+ else:
+ tmp.append((i,))
+ dk = tmp
+ else:
+ if not SCons.Util.is_List(dk):
+ dk = [dk]
+ if delete_existing:
+ dk = [x for x in dk if x not in val]
+ else:
+ val = [x for x in val if x not in dk]
+ self._dict[key] = dk + val
+ else:
+ dk = self._dict[key]
+ if SCons.Util.is_List(dk):
+ if key == 'CPPDEFINES':
+ tmp = []
+ for i in dk:
+ if SCons.Util.is_List(i):
+ if len(i) >= 2:
+ tmp.append((i[0], i[1]))
+ else:
+ tmp.append((i[0],))
+ elif SCons.Util.is_Tuple(i):
+ tmp.append(i)
+ else:
+ tmp.append((i,))
+ dk = tmp
+ # Construct a list of (key, value) tuples.
+ if SCons.Util.is_Dict(val):
+ tmp = []
+ for (k, v) in val.items():
+ if v is not None:
+ tmp.append((k, v))
+ else:
+ tmp.append((k,))
+ val = tmp
+ elif SCons.Util.is_String(val):
+ val = [(val,)]
+ if delete_existing:
+ dk = list(filter(lambda x, val=val: x not in val, dk))
+ self._dict[key] = dk + val
+ else:
+ dk = [x for x in dk if x not in val]
+ self._dict[key] = dk + val
+ else:
+ # By elimination, val is not a list. Since dk is a
+ # list, wrap val in a list first.
+ if delete_existing:
+ dk = list(filter(lambda x, val=val: x not in val, dk))
+ self._dict[key] = dk + [val]
+ else:
+ if not val in dk:
+ self._dict[key] = dk + [val]
+ else:
+ if key == 'CPPDEFINES':
+ if SCons.Util.is_String(dk):
+ dk = [dk]
+ elif SCons.Util.is_Dict(dk):
+ tmp = []
+ for (k, v) in dk.items():
+ if v is not None:
+ tmp.append((k, v))
+ else:
+ tmp.append((k,))
+ dk = tmp
+ if SCons.Util.is_String(val):
+ if val in dk:
+ val = []
+ else:
+ val = [val]
+ elif SCons.Util.is_Dict(val):
+ tmp = []
+ for i,j in val.items():
+ if j is not None:
+ tmp.append((i,j))
+ else:
+ tmp.append(i)
+ val = tmp
+ if delete_existing:
+ dk = [x for x in dk if x not in val]
+ self._dict[key] = dk + val
+ self.scanner_map_delete(kw)
+
+ def Clone(self, tools=[], toolpath=None, parse_flags = None, **kw):
+ """Return a copy of a construction Environment. The
+ copy is like a Python "deep copy"--that is, independent
+ copies are made recursively of each objects--except that
+ a reference is copied when an object is not deep-copyable
+ (like a function). There are no references to any mutable
+ objects in the original Environment.
+ """
+
+ builders = self._dict.get('BUILDERS', {})
+
+ clone = copy.copy(self)
+ # BUILDERS is not safe to do a simple copy
+ clone._dict = semi_deepcopy_dict(self._dict, ['BUILDERS'])
+ clone._dict['BUILDERS'] = BuilderDict(builders, clone)
+
+ # Check the methods added via AddMethod() and re-bind them to
+ # the cloned environment. Only do this if the attribute hasn't
+ # been overwritten by the user explicitly and still points to
+ # the added method.
+ clone.added_methods = []
+ for mw in self.added_methods:
+ if mw == getattr(self, mw.name):
+ clone.added_methods.append(mw.clone(clone))
+
+ clone._memo = {}
+
+ # Apply passed-in variables before the tools
+ # so the tools can use the new variables
+ kw = copy_non_reserved_keywords(kw)
+ new = {}
+ for key, value in kw.items():
+ new[key] = SCons.Subst.scons_subst_once(value, self, key)
+ clone.Replace(**new)
+
+ apply_tools(clone, tools, toolpath)
+
+ # apply them again in case the tools overwrote them
+ clone.Replace(**new)
+
+ # Finally, apply any flags to be merged in
+ if parse_flags: clone.MergeFlags(parse_flags)
+
+ if SCons.Debug.track_instances: logInstanceCreation(self, 'Environment.EnvironmentClone')
+ return clone
+
+ def Copy(self, *args, **kw):
+ global _warn_copy_deprecated
+ if _warn_copy_deprecated:
+ msg = "The env.Copy() method is deprecated; use the env.Clone() method instead."
+ SCons.Warnings.warn(SCons.Warnings.DeprecatedCopyWarning, msg)
+ _warn_copy_deprecated = False
+ return self.Clone(*args, **kw)
+
+ def _changed_build(self, dependency, target, prev_ni):
+ if dependency.changed_state(target, prev_ni):
+ return 1
+ return self.decide_source(dependency, target, prev_ni)
+
+ def _changed_content(self, dependency, target, prev_ni):
+ return dependency.changed_content(target, prev_ni)
+
+ def _changed_source(self, dependency, target, prev_ni):
+ target_env = dependency.get_build_env()
+ type = target_env.get_tgt_sig_type()
+ if type == 'source':
+ return target_env.decide_source(dependency, target, prev_ni)
+ else:
+ return target_env.decide_target(dependency, target, prev_ni)
+
+ def _changed_timestamp_then_content(self, dependency, target, prev_ni):
+ return dependency.changed_timestamp_then_content(target, prev_ni)
+
+ def _changed_timestamp_newer(self, dependency, target, prev_ni):
+ return dependency.changed_timestamp_newer(target, prev_ni)
+
+ def _changed_timestamp_match(self, dependency, target, prev_ni):
+ return dependency.changed_timestamp_match(target, prev_ni)
+
+ def _copy_from_cache(self, src, dst):
+ return self.fs.copy(src, dst)
+
+ def _copy2_from_cache(self, src, dst):
+ return self.fs.copy2(src, dst)
+
+ def Decider(self, function):
+ copy_function = self._copy2_from_cache
+ if function in ('MD5', 'content'):
+ if not SCons.Util.md5:
+ raise UserError("MD5 signatures are not available in this version of Python.")
+ function = self._changed_content
+ elif function == 'MD5-timestamp':
+ function = self._changed_timestamp_then_content
+ elif function in ('timestamp-newer', 'make'):
+ function = self._changed_timestamp_newer
+ copy_function = self._copy_from_cache
+ elif function == 'timestamp-match':
+ function = self._changed_timestamp_match
+ elif not callable(function):
+ raise UserError("Unknown Decider value %s" % repr(function))
+
+ # We don't use AddMethod because we don't want to turn the
+ # function, which only expects three arguments, into a bound
+ # method, which would add self as an initial, fourth argument.
+ self.decide_target = function
+ self.decide_source = function
+
+ self.copy_from_cache = copy_function
+
+ def Detect(self, progs):
+ """Return the first available program in progs.
+ """
+ if not SCons.Util.is_List(progs):
+ progs = [ progs ]
+ for prog in progs:
+ path = self.WhereIs(prog)
+ if path: return prog
+ return None
+
+ def Dictionary(self, *args):
+ if not args:
+ return self._dict
+ dlist = [self._dict[x] for x in args]
+ if len(dlist) == 1:
+ dlist = dlist[0]
+ return dlist
+
+ def Dump(self, key = None):
+ """
+ Using the standard Python pretty printer, return the contents of the
+ scons build environment as a string.
+
+ If the key passed in is anything other than None, then that will
+ be used as an index into the build environment dictionary and
+ whatever is found there will be fed into the pretty printer. Note
+ that this key is case sensitive.
+ """
+ import pprint
+ pp = pprint.PrettyPrinter(indent=2)
+ if key:
+ dict = self.Dictionary(key)
+ else:
+ dict = self.Dictionary()
+ return pp.pformat(dict)
+
+ def FindIxes(self, paths, prefix, suffix):
+ """
+ Search a list of paths for something that matches the prefix and suffix.
+
+ paths - the list of paths or nodes.
+ prefix - construction variable for the prefix.
+ suffix - construction variable for the suffix.
+ """
+
+ suffix = self.subst('$'+suffix)
+ prefix = self.subst('$'+prefix)
+
+ for path in paths:
+ dir,name = os.path.split(str(path))
+ if name[:len(prefix)] == prefix and name[-len(suffix):] == suffix:
+ return path
+
+ def ParseConfig(self, command, function=None, unique=1):
+ """
+ Use the specified function to parse the output of the command
+ in order to modify the current environment. The 'command' can
+ be a string or a list of strings representing a command and
+ its arguments. 'Function' is an optional argument that takes
+ the environment, the output of the command, and the unique flag.
+ If no function is specified, MergeFlags, which treats the output
+ as the result of a typical 'X-config' command (i.e. gtk-config),
+ will merge the output into the appropriate variables.
+ """
+ if function is None:
+ def parse_conf(env, cmd, unique=unique):
+ return env.MergeFlags(cmd, unique)
+ function = parse_conf
+ if SCons.Util.is_List(command):
+ command = ' '.join(command)
+ command = self.subst(command)
+ return function(self, self.backtick(command))
+
+ def ParseDepends(self, filename, must_exist=None, only_one=0):
+ """
+ Parse a mkdep-style file for explicit dependencies. This is
+ completely abusable, and should be unnecessary in the "normal"
+ case of proper SCons configuration, but it may help make
+ the transition from a Make hierarchy easier for some people
+ to swallow. It can also be genuinely useful when using a tool
+ that can write a .d file, but for which writing a scanner would
+ be too complicated.
+ """
+ filename = self.subst(filename)
+ try:
+ fp = open(filename, 'r')
+ except IOError:
+ if must_exist:
+ raise
+ return
+ lines = SCons.Util.LogicalLines(fp).readlines()
+ lines = [l for l in lines if l[0] != '#']
+ tdlist = []
+ for line in lines:
+ try:
+ target, depends = line.split(':', 1)
+ except (AttributeError, ValueError):
+ # Throws AttributeError if line isn't a string. Can throw
+ # ValueError if line doesn't split into two or more elements.
+ pass
+ else:
+ tdlist.append((target.split(), depends.split()))
+ if only_one:
+ targets = []
+ for td in tdlist:
+ targets.extend(td[0])
+ if len(targets) > 1:
+ raise SCons.Errors.UserError(
+ "More than one dependency target found in `%s': %s"
+ % (filename, targets))
+ for target, depends in tdlist:
+ self.Depends(target, depends)
+
+ def Platform(self, platform):
+ platform = self.subst(platform)
+ return SCons.Platform.Platform(platform)(self)
+
+ def Prepend(self, **kw):
+ """Prepend values to existing construction variables
+ in an Environment.
+ """
+ kw = copy_non_reserved_keywords(kw)
+ for key, val in kw.items():
+ # It would be easier on the eyes to write this using
+ # "continue" statements whenever we finish processing an item,
+ # but Python 1.5.2 apparently doesn't let you use "continue"
+ # within try:-except: blocks, so we have to nest our code.
+ try:
+ orig = self._dict[key]
+ except KeyError:
+ # No existing variable in the environment, so just set
+ # it to the new value.
+ self._dict[key] = val
+ else:
+ try:
+ # Check if the original looks like a dictionary.
+ # If it is, we can't just try adding the value because
+ # dictionaries don't have __add__() methods, and
+ # things like UserList will incorrectly coerce the
+ # original dict to a list (which we don't want).
+ update_dict = orig.update
+ except AttributeError:
+ try:
+ # Most straightforward: just try to add them
+ # together. This will work in most cases, when the
+ # original and new values are of compatible types.
+ self._dict[key] = val + orig
+ except (KeyError, TypeError):
+ try:
+ # Check if the added value is a list.
+ add_to_val = val.append
+ except AttributeError:
+ # The added value isn't a list, but the
+ # original is (by process of elimination),
+ # so insert the the new value in the original
+ # (if there's one to insert).
+ if val:
+ orig.insert(0, val)
+ else:
+ # The added value is a list, so append
+ # the original to it (if there's a value
+ # to append).
+ if orig:
+ add_to_val(orig)
+ self._dict[key] = val
+ else:
+ # The original looks like a dictionary, so update it
+ # based on what we think the value looks like.
+ if SCons.Util.is_List(val):
+ for v in val:
+ orig[v] = None
+ else:
+ try:
+ update_dict(val)
+ except (AttributeError, TypeError, ValueError):
+ if SCons.Util.is_Dict(val):
+ for k, v in val.items():
+ orig[k] = v
+ else:
+ orig[val] = None
+ self.scanner_map_delete(kw)
+
+ def PrependENVPath(self, name, newpath, envname = 'ENV', sep = os.pathsep,
+ delete_existing=1):
+ """Prepend path elements to the path 'name' in the 'ENV'
+ dictionary for this environment. Will only add any particular
+ path once, and will normpath and normcase all paths to help
+ assure this. This can also handle the case where the env
+ variable is a list instead of a string.
+
+ If delete_existing is 0, a newpath which is already in the path
+ will not be moved to the front (it will be left where it is).
+ """
+
+ orig = ''
+ if envname in self._dict and name in self._dict[envname]:
+ orig = self._dict[envname][name]
+
+ nv = SCons.Util.PrependPath(orig, newpath, sep, delete_existing,
+ canonicalize=self._canonicalize)
+
+ if envname not in self._dict:
+ self._dict[envname] = {}
+
+ self._dict[envname][name] = nv
+
+ def PrependUnique(self, delete_existing=0, **kw):
+ """Prepend values to existing construction variables
+ in an Environment, if they're not already there.
+ If delete_existing is 1, removes existing values first, so
+ values move to front.
+ """
+ kw = copy_non_reserved_keywords(kw)
+ for key, val in kw.items():
+ if SCons.Util.is_List(val):
+ val = _delete_duplicates(val, not delete_existing)
+ if key not in self._dict or self._dict[key] in ('', None):
+ self._dict[key] = val
+ elif SCons.Util.is_Dict(self._dict[key]) and \
+ SCons.Util.is_Dict(val):
+ self._dict[key].update(val)
+ elif SCons.Util.is_List(val):
+ dk = self._dict[key]
+ if not SCons.Util.is_List(dk):
+ dk = [dk]
+ if delete_existing:
+ dk = [x for x in dk if x not in val]
+ else:
+ val = [x for x in val if x not in dk]
+ self._dict[key] = val + dk
+ else:
+ dk = self._dict[key]
+ if SCons.Util.is_List(dk):
+ # By elimination, val is not a list. Since dk is a
+ # list, wrap val in a list first.
+ if delete_existing:
+ dk = [x for x in dk if x not in val]
+ self._dict[key] = [val] + dk
+ else:
+ if not val in dk:
+ self._dict[key] = [val] + dk
+ else:
+ if delete_existing:
+ dk = [x for x in dk if x not in val]
+ self._dict[key] = val + dk
+ self.scanner_map_delete(kw)
+
+ def Replace(self, **kw):
+ """Replace existing construction variables in an Environment
+ with new construction variables and/or values.
+ """
+ try:
+ kwbd = kw['BUILDERS']
+ except KeyError:
+ pass
+ else:
+ kwbd = BuilderDict(kwbd,self)
+ del kw['BUILDERS']
+ self.__setitem__('BUILDERS', kwbd)
+ kw = copy_non_reserved_keywords(kw)
+ self._update(semi_deepcopy(kw))
+ self.scanner_map_delete(kw)
+
+ def ReplaceIxes(self, path, old_prefix, old_suffix, new_prefix, new_suffix):
+ """
+ Replace old_prefix with new_prefix and old_suffix with new_suffix.
+
+ env - Environment used to interpolate variables.
+ path - the path that will be modified.
+ old_prefix - construction variable for the old prefix.
+ old_suffix - construction variable for the old suffix.
+ new_prefix - construction variable for the new prefix.
+ new_suffix - construction variable for the new suffix.
+ """
+ old_prefix = self.subst('$'+old_prefix)
+ old_suffix = self.subst('$'+old_suffix)
+
+ new_prefix = self.subst('$'+new_prefix)
+ new_suffix = self.subst('$'+new_suffix)
+
+ dir,name = os.path.split(str(path))
+ if name[:len(old_prefix)] == old_prefix:
+ name = name[len(old_prefix):]
+ if name[-len(old_suffix):] == old_suffix:
+ name = name[:-len(old_suffix)]
+ return os.path.join(dir, new_prefix+name+new_suffix)
+
+ def SetDefault(self, **kw):
+ for k in list(kw.keys()):
+ if k in self._dict:
+ del kw[k]
+ self.Replace(**kw)
+
+ def _find_toolpath_dir(self, tp):
+ return self.fs.Dir(self.subst(tp)).srcnode().get_abspath()
+
+ def Tool(self, tool, toolpath=None, **kw):
+ if SCons.Util.is_String(tool):
+ tool = self.subst(tool)
+ if toolpath is None:
+ toolpath = self.get('toolpath', [])
+ toolpath = list(map(self._find_toolpath_dir, toolpath))
+ tool = SCons.Tool.Tool(tool, toolpath, **kw)
+ tool(self)
+
+ def WhereIs(self, prog, path=None, pathext=None, reject=[]):
+ """Find prog in the path.
+ """
+ if path is None:
+ try:
+ path = self['ENV']['PATH']
+ except KeyError:
+ pass
+ elif SCons.Util.is_String(path):
+ path = self.subst(path)
+ if pathext is None:
+ try:
+ pathext = self['ENV']['PATHEXT']
+ except KeyError:
+ pass
+ elif SCons.Util.is_String(pathext):
+ pathext = self.subst(pathext)
+ prog = SCons.Util.CLVar(self.subst(prog)) # support "program --with-args"
+ path = SCons.Util.WhereIs(prog[0], path, pathext, reject)
+ if path: return path
+ return None
+
+ #######################################################################
+ # Public methods for doing real "SCons stuff" (manipulating
+ # dependencies, setting attributes on targets, etc.). These begin
+ # with upper-case letters. The essential characteristic of methods
+ # in this section is that they all *should* have corresponding
+ # same-named global functions.
+ #######################################################################
+
+ def Action(self, *args, **kw):
+ def subst_string(a, self=self):
+ if SCons.Util.is_String(a):
+ a = self.subst(a)
+ return a
+ nargs = list(map(subst_string, args))
+ nkw = self.subst_kw(kw)
+ return SCons.Action.Action(*nargs, **nkw)
+
+ def AddPreAction(self, files, action):
+ nodes = self.arg2nodes(files, self.fs.Entry)
+ action = SCons.Action.Action(action)
+ uniq = {}
+ for executor in [n.get_executor() for n in nodes]:
+ uniq[executor] = 1
+ for executor in list(uniq.keys()):
+ executor.add_pre_action(action)
+ return nodes
+
+ def AddPostAction(self, files, action):
+ nodes = self.arg2nodes(files, self.fs.Entry)
+ action = SCons.Action.Action(action)
+ uniq = {}
+ for executor in [n.get_executor() for n in nodes]:
+ uniq[executor] = 1
+ for executor in list(uniq.keys()):
+ executor.add_post_action(action)
+ return nodes
+
+ def Alias(self, target, source=[], action=None, **kw):
+ tlist = self.arg2nodes(target, self.ans.Alias)
+ if not SCons.Util.is_List(source):
+ source = [source]
+ source = [_f for _f in source if _f]
+
+ if not action:
+ if not source:
+ # There are no source files and no action, so just
+ # return a target list of classic Alias Nodes, without
+ # any builder. The externally visible effect is that
+ # this will make the wrapping Script.BuildTask class
+ # say that there's "Nothing to be done" for this Alias,
+ # instead of that it's "up to date."
+ return tlist
+
+ # No action, but there are sources. Re-call all the target
+ # builders to add the sources to each target.
+ result = []
+ for t in tlist:
+ bld = t.get_builder(AliasBuilder)
+ result.extend(bld(self, t, source))
+ return result
+
+ nkw = self.subst_kw(kw)
+ nkw.update({
+ 'action' : SCons.Action.Action(action),
+ 'source_factory' : self.fs.Entry,
+ 'multi' : 1,
+ 'is_explicit' : None,
+ })
+ bld = SCons.Builder.Builder(**nkw)
+
+ # Apply the Builder separately to each target so that the Aliases
+ # stay separate. If we did one "normal" Builder call with the
+ # whole target list, then all of the target Aliases would be
+ # associated under a single Executor.
+ result = []
+ for t in tlist:
+ # Calling the convert() method will cause a new Executor to be
+ # created from scratch, so we have to explicitly initialize
+ # it with the target's existing sources, plus our new ones,
+ # so nothing gets lost.
+ b = t.get_builder()
+ if b is None or b is AliasBuilder:
+ b = bld
+ else:
+ nkw['action'] = b.action + action
+ b = SCons.Builder.Builder(**nkw)
+ t.convert()
+ result.extend(b(self, t, t.sources + source))
+ return result
+
+ def AlwaysBuild(self, *targets):
+ tlist = []
+ for t in targets:
+ tlist.extend(self.arg2nodes(t, self.fs.Entry))
+ for t in tlist:
+ t.set_always_build()
+ return tlist
+
+ def BuildDir(self, *args, **kw):
+ msg = """BuildDir() and the build_dir keyword have been deprecated;\n\tuse VariantDir() and the variant_dir keyword instead."""
+ SCons.Warnings.warn(SCons.Warnings.DeprecatedBuildDirWarning, msg)
+ if 'build_dir' in kw:
+ kw['variant_dir'] = kw['build_dir']
+ del kw['build_dir']
+ return self.VariantDir(*args, **kw)
+
+ def Builder(self, **kw):
+ nkw = self.subst_kw(kw)
+ return SCons.Builder.Builder(**nkw)
+
+ def CacheDir(self, path):
+ import SCons.CacheDir
+ if path is not None:
+ path = self.subst(path)
+ self._CacheDir_path = path
+
+ def Clean(self, targets, files):
+ global CleanTargets
+ tlist = self.arg2nodes(targets, self.fs.Entry)
+ flist = self.arg2nodes(files, self.fs.Entry)
+ for t in tlist:
+ try:
+ CleanTargets[t].extend(flist)
+ except KeyError:
+ CleanTargets[t] = flist
+
+ def Configure(self, *args, **kw):
+ nargs = [self]
+ if args:
+ nargs = nargs + self.subst_list(args)[0]
+ nkw = self.subst_kw(kw)
+ nkw['_depth'] = kw.get('_depth', 0) + 1
+ try:
+ nkw['custom_tests'] = self.subst_kw(nkw['custom_tests'])
+ except KeyError:
+ pass
+ return SCons.SConf.SConf(*nargs, **nkw)
+
+ def Command(self, target, source, action, **kw):
+ """Builds the supplied target files from the supplied
+ source files using the supplied action. Action may
+ be any type that the Builder constructor will accept
+ for an action."""
+ bkw = {
+ 'action' : action,
+ 'target_factory' : self.fs.Entry,
+ 'source_factory' : self.fs.Entry,
+ }
+ try: bkw['source_scanner'] = kw['source_scanner']
+ except KeyError: pass
+ else: del kw['source_scanner']
+ bld = SCons.Builder.Builder(**bkw)
+ return bld(self, target, source, **kw)
+
+ def Depends(self, target, dependency):
+ """Explicity specify that 'target's depend on 'dependency'."""
+ tlist = self.arg2nodes(target, self.fs.Entry)
+ dlist = self.arg2nodes(dependency, self.fs.Entry)
+ for t in tlist:
+ t.add_dependency(dlist)
+ return tlist
+
+ def Dir(self, name, *args, **kw):
+ """
+ """
+ s = self.subst(name)
+ if SCons.Util.is_Sequence(s):
+ result=[]
+ for e in s:
+ result.append(self.fs.Dir(e, *args, **kw))
+ return result
+ return self.fs.Dir(s, *args, **kw)
+
+ def PyPackageDir(self, modulename):
+ s = self.subst(modulename)
+ if SCons.Util.is_Sequence(s):
+ result=[]
+ for e in s:
+ result.append(self.fs.PyPackageDir(e))
+ return result
+ return self.fs.PyPackageDir(s)
+
+ def NoClean(self, *targets):
+ """Tags a target so that it will not be cleaned by -c"""
+ tlist = []
+ for t in targets:
+ tlist.extend(self.arg2nodes(t, self.fs.Entry))
+ for t in tlist:
+ t.set_noclean()
+ return tlist
+
+ def NoCache(self, *targets):
+ """Tags a target so that it will not be cached"""
+ tlist = []
+ for t in targets:
+ tlist.extend(self.arg2nodes(t, self.fs.Entry))
+ for t in tlist:
+ t.set_nocache()
+ return tlist
+
+ def Entry(self, name, *args, **kw):
+ """
+ """
+ s = self.subst(name)
+ if SCons.Util.is_Sequence(s):
+ result=[]
+ for e in s:
+ result.append(self.fs.Entry(e, *args, **kw))
+ return result
+ return self.fs.Entry(s, *args, **kw)
+
+ def Environment(self, **kw):
+ return SCons.Environment.Environment(**self.subst_kw(kw))
+
+ def Execute(self, action, *args, **kw):
+ """Directly execute an action through an Environment
+ """
+ action = self.Action(action, *args, **kw)
+ result = action([], [], self)
+ if isinstance(result, SCons.Errors.BuildError):
+ errstr = result.errstr
+ if result.filename:
+ errstr = result.filename + ': ' + errstr
+ sys.stderr.write("scons: *** %s\n" % errstr)
+ return result.status
+ else:
+ return result
+
+ def File(self, name, *args, **kw):
+ """
+ """
+ s = self.subst(name)
+ if SCons.Util.is_Sequence(s):
+ result=[]
+ for e in s:
+ result.append(self.fs.File(e, *args, **kw))
+ return result
+ return self.fs.File(s, *args, **kw)
+
+ def FindFile(self, file, dirs):
+ file = self.subst(file)
+ nodes = self.arg2nodes(dirs, self.fs.Dir)
+ return SCons.Node.FS.find_file(file, tuple(nodes))
+
+ def Flatten(self, sequence):
+ return SCons.Util.flatten(sequence)
+
+ def GetBuildPath(self, files):
+ result = list(map(str, self.arg2nodes(files, self.fs.Entry)))
+ if SCons.Util.is_List(files):
+ return result
+ else:
+ return result[0]
+
+ def Glob(self, pattern, ondisk=True, source=False, strings=False, exclude=None):
+ return self.fs.Glob(self.subst(pattern), ondisk, source, strings, exclude)
+
+ def Ignore(self, target, dependency):
+ """Ignore a dependency."""
+ tlist = self.arg2nodes(target, self.fs.Entry)
+ dlist = self.arg2nodes(dependency, self.fs.Entry)
+ for t in tlist:
+ t.add_ignore(dlist)
+ return tlist
+
+ def Literal(self, string):
+ return SCons.Subst.Literal(string)
+
+ def Local(self, *targets):
+ ret = []
+ for targ in targets:
+ if isinstance(targ, SCons.Node.Node):
+ targ.set_local()
+ ret.append(targ)
+ else:
+ for t in self.arg2nodes(targ, self.fs.Entry):
+ t.set_local()
+ ret.append(t)
+ return ret
+
+ def Precious(self, *targets):
+ tlist = []
+ for t in targets:
+ tlist.extend(self.arg2nodes(t, self.fs.Entry))
+ for t in tlist:
+ t.set_precious()
+ return tlist
+
+ def Pseudo(self, *targets):
+ tlist = []
+ for t in targets:
+ tlist.extend(self.arg2nodes(t, self.fs.Entry))
+ for t in tlist:
+ t.set_pseudo()
+ return tlist
+
+ def Repository(self, *dirs, **kw):
+ dirs = self.arg2nodes(list(dirs), self.fs.Dir)
+ self.fs.Repository(*dirs, **kw)
+
+ def Requires(self, target, prerequisite):
+ """Specify that 'prerequisite' must be built before 'target',
+ (but 'target' does not actually depend on 'prerequisite'
+ and need not be rebuilt if it changes)."""
+ tlist = self.arg2nodes(target, self.fs.Entry)
+ plist = self.arg2nodes(prerequisite, self.fs.Entry)
+ for t in tlist:
+ t.add_prerequisite(plist)
+ return tlist
+
+ def Scanner(self, *args, **kw):
+ nargs = []
+ for arg in args:
+ if SCons.Util.is_String(arg):
+ arg = self.subst(arg)
+ nargs.append(arg)
+ nkw = self.subst_kw(kw)
+ return SCons.Scanner.Base(*nargs, **nkw)
+
+ def SConsignFile(self, name=".sconsign", dbm_module=None):
+ if name is not None:
+ name = self.subst(name)
+ if not os.path.isabs(name):
+ name = os.path.join(str(self.fs.SConstruct_dir), name)
+ if name:
+ name = os.path.normpath(name)
+ sconsign_dir = os.path.dirname(name)
+ if sconsign_dir and not os.path.exists(sconsign_dir):
+ self.Execute(SCons.Defaults.Mkdir(sconsign_dir))
+ SCons.SConsign.File(name, dbm_module)
+
+ def SideEffect(self, side_effect, target):
+ """Tell scons that side_effects are built as side
+ effects of building targets."""
+ side_effects = self.arg2nodes(side_effect, self.fs.Entry)
+ targets = self.arg2nodes(target, self.fs.Entry)
+
+ for side_effect in side_effects:
+ if side_effect.multiple_side_effect_has_builder():
+ raise SCons.Errors.UserError("Multiple ways to build the same target were specified for: %s" % str(side_effect))
+ side_effect.add_source(targets)
+ side_effect.side_effect = 1
+ self.Precious(side_effect)
+ for target in targets:
+ target.side_effects.append(side_effect)
+ return side_effects
+
+ def SourceCode(self, entry, builder):
+ """Arrange for a source code builder for (part of) a tree."""
+ msg = """SourceCode() has been deprecated and there is no replacement.
+\tIf you need this function, please contact scons-dev@scons.org"""
+ SCons.Warnings.warn(SCons.Warnings.DeprecatedSourceCodeWarning, msg)
+ entries = self.arg2nodes(entry, self.fs.Entry)
+ for entry in entries:
+ entry.set_src_builder(builder)
+ return entries
+
+ def SourceSignatures(self, type):
+ global _warn_source_signatures_deprecated
+ if _warn_source_signatures_deprecated:
+ msg = "The env.SourceSignatures() method is deprecated;\n" + \
+ "\tconvert your build to use the env.Decider() method instead."
+ SCons.Warnings.warn(SCons.Warnings.DeprecatedSourceSignaturesWarning, msg)
+ _warn_source_signatures_deprecated = False
+ type = self.subst(type)
+ self.src_sig_type = type
+ if type == 'MD5':
+ if not SCons.Util.md5:
+ raise UserError("MD5 signatures are not available in this version of Python.")
+ self.decide_source = self._changed_content
+ elif type == 'timestamp':
+ self.decide_source = self._changed_timestamp_match
+ else:
+ raise UserError("Unknown source signature type '%s'" % type)
+
+ def Split(self, arg):
+ """This function converts a string or list into a list of strings
+ or Nodes. This makes things easier for users by allowing files to
+ be specified as a white-space separated list to be split.
+
+ The input rules are:
+ - A single string containing names separated by spaces. These will be
+ split apart at the spaces.
+ - A single Node instance
+ - A list containing either strings or Node instances. Any strings
+ in the list are not split at spaces.
+
+ In all cases, the function returns a list of Nodes and strings."""
+
+ if SCons.Util.is_List(arg):
+ return list(map(self.subst, arg))
+ elif SCons.Util.is_String(arg):
+ return self.subst(arg).split()
+ else:
+ return [self.subst(arg)]
+
+ def TargetSignatures(self, type):
+ global _warn_target_signatures_deprecated
+ if _warn_target_signatures_deprecated:
+ msg = "The env.TargetSignatures() method is deprecated;\n" + \
+ "\tconvert your build to use the env.Decider() method instead."
+ SCons.Warnings.warn(SCons.Warnings.DeprecatedTargetSignaturesWarning, msg)
+ _warn_target_signatures_deprecated = False
+ type = self.subst(type)
+ self.tgt_sig_type = type
+ if type in ('MD5', 'content'):
+ if not SCons.Util.md5:
+ raise UserError("MD5 signatures are not available in this version of Python.")
+ self.decide_target = self._changed_content
+ elif type == 'timestamp':
+ self.decide_target = self._changed_timestamp_match
+ elif type == 'build':
+ self.decide_target = self._changed_build
+ elif type == 'source':
+ self.decide_target = self._changed_source
+ else:
+ raise UserError("Unknown target signature type '%s'"%type)
+
+ def Value(self, value, built_value=None):
+ """
+ """
+ return SCons.Node.Python.Value(value, built_value)
+
+ def VariantDir(self, variant_dir, src_dir, duplicate=1):
+ variant_dir = self.arg2nodes(variant_dir, self.fs.Dir)[0]
+ src_dir = self.arg2nodes(src_dir, self.fs.Dir)[0]
+ self.fs.VariantDir(variant_dir, src_dir, duplicate)
+
+ def FindSourceFiles(self, node='.'):
+ """ returns a list of all source files.
+ """
+ node = self.arg2nodes(node, self.fs.Entry)[0]
+
+ sources = []
+ def build_source(ss):
+ for s in ss:
+ if isinstance(s, SCons.Node.FS.Dir):
+ build_source(s.all_children())
+ elif s.has_builder():
+ build_source(s.sources)
+ elif isinstance(s.disambiguate(), SCons.Node.FS.File):
+ sources.append(s)
+ build_source(node.all_children())
+
+ def final_source(node):
+ while (node != node.srcnode()):
+ node = node.srcnode()
+ return node
+ sources = list(map( final_source, sources ));
+ # remove duplicates
+ return list(set(sources))
+
+ def FindInstalledFiles(self):
+ """ returns the list of all targets of the Install and InstallAs Builder.
+ """
+ from SCons.Tool import install
+ if install._UNIQUE_INSTALLED_FILES is None:
+ install._UNIQUE_INSTALLED_FILES = SCons.Util.uniquer_hashables(install._INSTALLED_FILES)
+ return install._UNIQUE_INSTALLED_FILES
+
+
+class OverrideEnvironment(Base):
+ """A proxy that overrides variables in a wrapped construction
+ environment by returning values from an overrides dictionary in
+ preference to values from the underlying subject environment.
+
+ This is a lightweight (I hope) proxy that passes through most use of
+ attributes to the underlying Environment.Base class, but has just
+ enough additional methods defined to act like a real construction
+ environment with overridden values. It can wrap either a Base
+ construction environment, or another OverrideEnvironment, which
+ can in turn nest arbitrary OverrideEnvironments...
+
+ Note that we do *not* call the underlying base class
+ (SubsitutionEnvironment) initialization, because we get most of those
+ from proxying the attributes of the subject construction environment.
+ But because we subclass SubstitutionEnvironment, this class also
+ has inherited arg2nodes() and subst*() methods; those methods can't
+ be proxied because they need *this* object's methods to fetch the
+ values from the overrides dictionary.
+ """
+
+ def __init__(self, subject, overrides={}):
+ if SCons.Debug.track_instances: logInstanceCreation(self, 'Environment.OverrideEnvironment')
+ self.__dict__['__subject'] = subject
+ self.__dict__['overrides'] = overrides
+
+ # Methods that make this class act like a proxy.
+ def __getattr__(self, name):
+ return getattr(self.__dict__['__subject'], name)
+ def __setattr__(self, name, value):
+ setattr(self.__dict__['__subject'], name, value)
+
+ # Methods that make this class act like a dictionary.
+ def __getitem__(self, key):
+ try:
+ return self.__dict__['overrides'][key]
+ except KeyError:
+ return self.__dict__['__subject'].__getitem__(key)
+ def __setitem__(self, key, value):
+ if not is_valid_construction_var(key):
+ raise SCons.Errors.UserError("Illegal construction variable `%s'" % key)
+ self.__dict__['overrides'][key] = value
+ def __delitem__(self, key):
+ try:
+ del self.__dict__['overrides'][key]
+ except KeyError:
+ deleted = 0
+ else:
+ deleted = 1
+ try:
+ result = self.__dict__['__subject'].__delitem__(key)
+ except KeyError:
+ if not deleted:
+ raise
+ result = None
+ return result
+ def get(self, key, default=None):
+ """Emulates the get() method of dictionaries."""
+ try:
+ return self.__dict__['overrides'][key]
+ except KeyError:
+ return self.__dict__['__subject'].get(key, default)
+ def has_key(self, key):
+ try:
+ self.__dict__['overrides'][key]
+ return 1
+ except KeyError:
+ return key in self.__dict__['__subject']
+ def __contains__(self, key):
+ if self.__dict__['overrides'].__contains__(key):
+ return 1
+ return self.__dict__['__subject'].__contains__(key)
+ def Dictionary(self):
+ """Emulates the items() method of dictionaries."""
+ d = self.__dict__['__subject'].Dictionary().copy()
+ d.update(self.__dict__['overrides'])
+ return d
+ def items(self):
+ """Emulates the items() method of dictionaries."""
+ return list(self.Dictionary().items())
+
+ # Overridden private construction environment methods.
+ def _update(self, dict):
+ """Update an environment's values directly, bypassing the normal
+ checks that occur when users try to set items.
+ """
+ self.__dict__['overrides'].update(dict)
+
+ def gvars(self):
+ return self.__dict__['__subject'].gvars()
+
+ def lvars(self):
+ lvars = self.__dict__['__subject'].lvars()
+ lvars.update(self.__dict__['overrides'])
+ return lvars
+
+ # Overridden public construction environment methods.
+ def Replace(self, **kw):
+ kw = copy_non_reserved_keywords(kw)
+ self.__dict__['overrides'].update(semi_deepcopy(kw))
+
+# The entry point that will be used by the external world
+# to refer to a construction environment. This allows the wrapper
+# interface to extend a construction environment for its own purposes
+# by subclassing SCons.Environment.Base and then assigning the
+# class to SCons.Environment.Environment.
+
+Environment = Base
+
+
+def NoSubstitutionProxy(subject):
+ """
+ An entry point for returning a proxy subclass instance that overrides
+ the subst*() methods so they don't actually perform construction
+ variable substitution. This is specifically intended to be the shim
+ layer in between global function calls (which don't want construction
+ variable substitution) and the DefaultEnvironment() (which would
+ substitute variables if left to its own devices).
+
+ We have to wrap this in a function that allows us to delay definition of
+ the class until it's necessary, so that when it subclasses Environment
+ it will pick up whatever Environment subclass the wrapper interface
+ might have assigned to SCons.Environment.Environment.
+ """
+ class _NoSubstitutionProxy(Environment):
+ def __init__(self, subject):
+ self.__dict__['__subject'] = subject
+ def __getattr__(self, name):
+ return getattr(self.__dict__['__subject'], name)
+ def __setattr__(self, name, value):
+ return setattr(self.__dict__['__subject'], name, value)
+ def executor_to_lvars(self, kwdict):
+ if 'executor' in kwdict:
+ kwdict['lvars'] = kwdict['executor'].get_lvars()
+ del kwdict['executor']
+ else:
+ kwdict['lvars'] = {}
+ def raw_to_mode(self, dict):
+ try:
+ raw = dict['raw']
+ except KeyError:
+ pass
+ else:
+ del dict['raw']
+ dict['mode'] = raw
+ def subst(self, string, *args, **kwargs):
+ return string
+ def subst_kw(self, kw, *args, **kwargs):
+ return kw
+ def subst_list(self, string, *args, **kwargs):
+ nargs = (string, self,) + args
+ nkw = kwargs.copy()
+ nkw['gvars'] = {}
+ self.executor_to_lvars(nkw)
+ self.raw_to_mode(nkw)
+ return SCons.Subst.scons_subst_list(*nargs, **nkw)
+ def subst_target_source(self, string, *args, **kwargs):
+ nargs = (string, self,) + args
+ nkw = kwargs.copy()
+ nkw['gvars'] = {}
+ self.executor_to_lvars(nkw)
+ self.raw_to_mode(nkw)
+ return SCons.Subst.scons_subst(*nargs, **nkw)
+ return _NoSubstitutionProxy(subject)
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Environment.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Environment.xml
new file mode 100644
index 0000000..ccee68d
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Environment.xml
@@ -0,0 +1,3661 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+__COPYRIGHT__
+
+This file is processed by the bin/SConsDoc.py module.
+See its __doc__ string for a discussion of the format.
+-->
+
+<!DOCTYPE sconsdoc [
+<!ENTITY % scons SYSTEM '../../../doc/scons.mod'>
+%scons;
+<!ENTITY % builders-mod SYSTEM '../../../doc/generated/builders.mod'>
+%builders-mod;
+<!ENTITY % functions-mod SYSTEM '../../../doc/generated/functions.mod'>
+%functions-mod;
+<!ENTITY % tools-mod SYSTEM '../../../doc/generated/tools.mod'>
+%tools-mod;
+<!ENTITY % variables-mod SYSTEM '../../../doc/generated/variables.mod'>
+%variables-mod;
+]>
+
+<sconsdoc xmlns="http://www.scons.org/dbxsd/v1.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://www.scons.org/dbxsd/v1.0 http://www.scons.org/dbxsd/v1.0/scons.xsd">
+
+
+<!-- Construction variables -->
+
+<cvar name="BUILDERS">
+<summary>
+<para>
+A dictionary mapping the names of the builders
+available through this environment
+to underlying Builder objects.
+Builders named
+Alias, CFile, CXXFile, DVI, Library, Object, PDF, PostScript, and Program
+are available by default.
+If you initialize this variable when an
+Environment is created:
+</para>
+
+<example_commands>
+env = Environment(BUILDERS = {'NewBuilder' : foo})
+</example_commands>
+
+<para>
+the default Builders will no longer be available.
+To use a new Builder object in addition to the default Builders,
+add your new Builder object like this:
+</para>
+
+<example_commands>
+env = Environment()
+env.Append(BUILDERS = {'NewBuilder' : foo})
+</example_commands>
+
+<para>
+or this:
+</para>
+
+<example_commands>
+env = Environment()
+env['BUILDERS]['NewBuilder'] = foo
+</example_commands>
+</summary>
+</cvar>
+
+<cvar name="Dir">
+<summary>
+<para>
+A function that converts a string
+into a Dir instance relative to the target being built.
+</para>
+</summary>
+</cvar>
+
+<cvar name="ENV">
+<summary>
+<para>
+A dictionary of environment variables
+to use when invoking commands. When
+&cv-ENV; is used in a command all list
+values will be joined using the path separator and any other non-string
+values will simply be coerced to a string.
+Note that, by default,
+&scons;
+does
+<emphasis>not</emphasis>
+propagate the environment in force when you
+execute
+&scons;
+to the commands used to build target files.
+This is so that builds will be guaranteed
+repeatable regardless of the environment
+variables set at the time
+&scons;
+is invoked.
+</para>
+
+<para>
+If you want to propagate your
+environment variables
+to the commands executed
+to build target files,
+you must do so explicitly:
+</para>
+
+<example_commands>
+import os
+env = Environment(ENV = os.environ)
+</example_commands>
+
+<para>
+Note that you can choose only to propagate
+certain environment variables.
+A common example is
+the system
+<envar>PATH</envar>
+environment variable,
+so that
+&scons;
+uses the same utilities
+as the invoking shell (or other process):
+</para>
+
+<example_commands>
+import os
+env = Environment(ENV = {'PATH' : os.environ['PATH']})
+</example_commands>
+</summary>
+</cvar>
+
+<cvar name="File">
+<summary>
+<para>
+A function that converts a string into a File instance relative to the
+target being built.
+</para>
+</summary>
+</cvar>
+
+<cvar name="SCANNERS">
+<summary>
+<para>
+A list of the available implicit dependency scanners.
+New file scanners may be added by
+appending to this list,
+although the more flexible approach
+is to associate scanners
+with a specific Builder.
+See the sections "Builder Objects"
+and "Scanner Objects,"
+below, for more information.
+</para>
+</summary>
+</cvar>
+
+<cvar name="CHANGED_SOURCES">
+<summary>
+<para>
+A reserved variable name
+that may not be set or used in a construction environment.
+(See "Variable Substitution," below.)
+</para>
+</summary>
+</cvar>
+
+<cvar name="CHANGED_TARGETS">
+<summary>
+<para>
+A reserved variable name
+that may not be set or used in a construction environment.
+(See "Variable Substitution," below.)
+</para>
+</summary>
+</cvar>
+
+<cvar name="SOURCE">
+<summary>
+<para>
+A reserved variable name
+that may not be set or used in a construction environment.
+(See "Variable Substitution," below.)
+</para>
+</summary>
+</cvar>
+
+<cvar name="SOURCES">
+<summary>
+<para>
+A reserved variable name
+that may not be set or used in a construction environment.
+(See "Variable Substitution," below.)
+</para>
+</summary>
+</cvar>
+
+<cvar name="TARGET">
+<summary>
+<para>
+A reserved variable name
+that may not be set or used in a construction environment.
+(See "Variable Substitution," below.)
+</para>
+</summary>
+</cvar>
+
+<cvar name="TARGETS">
+<summary>
+<para>
+A reserved variable name
+that may not be set or used in a construction environment.
+(See "Variable Substitution," below.)
+</para>
+</summary>
+</cvar>
+
+<cvar name="UNCHANGED_SOURCES">
+<summary>
+<para>
+A reserved variable name
+that may not be set or used in a construction environment.
+(See "Variable Substitution," below.)
+</para>
+</summary>
+</cvar>
+
+<cvar name="UNCHANGED_TARGETS">
+<summary>
+<para>
+A reserved variable name
+that may not be set or used in a construction environment.
+(See "Variable Substitution," below.)
+</para>
+</summary>
+</cvar>
+
+<cvar name="TOOLS">
+<summary>
+<para>
+A list of the names of the Tool specifications
+that are part of this construction environment.
+</para>
+</summary>
+</cvar>
+
+<!-- Functions / Construction environment methods -->
+
+<scons_function name="Action">
+<arguments>
+(action, [cmd/str/fun, [var, ...]] [option=value, ...])
+</arguments>
+<summary>
+<para>
+Creates an Action object for
+the specified
+<varname>action</varname>.
+See the section "Action Objects,"
+below, for a complete explanation of the arguments and behavior.
+</para>
+
+<para>
+Note that the
+<function>env.Action</function>()
+form of the invocation will expand
+construction variables in any argument strings,
+including the
+<varname>action</varname>
+argument, at the time it is called
+using the construction variables in the
+<varname>env</varname>
+construction environment through which
+<function>env.Action</function>()
+was called.
+The
+<function>Action</function>()
+form delays all variable expansion
+until the Action object is actually used.
+</para>
+</summary>
+</scons_function>
+
+<scons_function name="AddMethod">
+<arguments signature="global">
+(object, function, [name])
+</arguments>
+<arguments signature="env">
+(function, [name])
+</arguments>
+<summary>
+<para>
+When called with the
+<function>AddMethod</function>()
+form,
+adds the specified
+<varname>function</varname>
+to the specified
+<varname>object</varname>
+as the specified method
+<varname>name</varname>.
+When called with the
+<function>env.AddMethod</function>()
+form,
+adds the specified
+<varname>function</varname>
+to the construction environment
+<varname>env</varname>
+as the specified method
+<varname>name</varname>.
+In both cases, if
+<varname>name</varname>
+is omitted or
+<literal>None</literal>,
+the name of the
+specified
+<varname>function</varname>
+itself is used for the method name.
+</para>
+
+<para>
+Examples:
+</para>
+
+<example_commands>
+# Note that the first argument to the function to
+# be attached as a method must be the object through
+# which the method will be called; the Python
+# convention is to call it 'self'.
+def my_method(self, arg):
+ print("my_method() got", arg)
+
+# Use the global AddMethod() function to add a method
+# to the Environment class. This
+AddMethod(Environment, my_method)
+env = Environment()
+env.my_method('arg')
+
+# Add the function as a method, using the function
+# name for the method call.
+env = Environment()
+env.AddMethod(my_method, 'other_method_name')
+env.other_method_name('another arg')
+</example_commands>
+</summary>
+</scons_function>
+
+<scons_function name="AddPostAction">
+<arguments>
+(target, action)
+</arguments>
+<summary>
+<para>
+Arranges for the specified
+<varname>action</varname>
+to be performed
+after the specified
+<varname>target</varname>
+has been built.
+The specified action(s) may be
+an Action object, or anything that
+can be converted into an Action object
+(see below).
+</para>
+
+<para>
+When multiple targets are supplied,
+the action may be called multiple times,
+once after each action that generates
+one or more targets in the list.
+</para>
+</summary>
+</scons_function>
+
+<scons_function name="AddPreAction">
+<arguments>
+(target, action)
+</arguments>
+<summary>
+<para>
+Arranges for the specified
+<varname>action</varname>
+to be performed
+before the specified
+<varname>target</varname>
+is built.
+The specified action(s) may be
+an Action object, or anything that
+can be converted into an Action object
+(see below).
+</para>
+
+<para>
+When multiple targets are specified,
+the action(s) may be called multiple times,
+once before each action that generates
+one or more targets in the list.
+</para>
+
+<para>
+Note that if any of the targets are built in multiple steps,
+the action will be invoked just
+before the "final" action that specifically
+generates the specified target(s).
+For example, when building an executable program
+from a specified source
+<filename>.c</filename>
+file via an intermediate object file:
+</para>
+
+<example_commands>
+foo = Program('foo.c')
+AddPreAction(foo, 'pre_action')
+</example_commands>
+
+<para>
+The specified
+<literal>pre_action</literal>
+would be executed before
+&scons;
+calls the link command that actually
+generates the executable program binary
+<filename>foo</filename>,
+not before compiling the
+<filename>foo.c</filename>
+file into an object file.
+</para>
+</summary>
+</scons_function>
+
+<scons_function name="Alias">
+<arguments>
+(alias, [targets, [action]])
+</arguments>
+<summary>
+<para>
+Creates one or more phony targets that
+expand to one or more other targets.
+An optional
+<varname>action</varname>
+(command)
+or list of actions
+can be specified that will be executed
+whenever the any of the alias targets are out-of-date.
+Returns the Node object representing the alias,
+which exists outside of any file system.
+This Node object, or the alias name,
+may be used as a dependency of any other target,
+including another alias.
+&f-Alias;
+can be called multiple times for the same
+alias to add additional targets to the alias,
+or additional actions to the list for this alias.
+</para>
+
+<para>
+Examples:
+</para>
+
+<example_commands>
+Alias('install')
+Alias('install', '/usr/bin')
+Alias(['install', 'install-lib'], '/usr/local/lib')
+
+env.Alias('install', ['/usr/local/bin', '/usr/local/lib'])
+env.Alias('install', ['/usr/local/man'])
+
+env.Alias('update', ['file1', 'file2'], "update_database $SOURCES")
+</example_commands>
+</summary>
+</scons_function>
+
+<scons_function name="AlwaysBuild">
+<arguments>
+(target, ...)
+</arguments>
+<summary>
+<para>
+Marks each given
+<varname>target</varname>
+so that it is always assumed to be out of date,
+and will always be rebuilt if needed.
+Note, however, that
+&f-AlwaysBuild;
+does not add its target(s) to the default target list,
+so the targets will only be built
+if they are specified on the command line,
+or are a dependent of a target specified on the command line--but
+they will
+<emphasis>always</emphasis>
+be built if so specified.
+Multiple targets can be passed in to a single call to
+&f-AlwaysBuild;.
+</para>
+</summary>
+</scons_function>
+
+<scons_function name="Append">
+<arguments signature="env">
+(key=val, [...])
+</arguments>
+<summary>
+<para>
+Appends the specified keyword arguments
+to the end of construction variables in the environment.
+If the Environment does not have
+the specified construction variable,
+it is simply added to the environment.
+If the values of the construction variable
+and the keyword argument are the same type,
+then the two values will be simply added together.
+Otherwise, the construction variable
+and the value of the keyword argument
+are both coerced to lists,
+and the lists are added together.
+(See also the Prepend method, below.)
+</para>
+
+<para>
+Example:
+</para>
+
+<example_commands>
+env.Append(CCFLAGS = ' -g', FOO = ['foo.yyy'])
+</example_commands>
+</summary>
+</scons_function>
+
+<scons_function name="AppendENVPath">
+<arguments signature="env">
+(name, newpath, [envname, sep, delete_existing])
+</arguments>
+<summary>
+<para>
+This appends new path elements to the given path in the
+specified external environment
+(<literal>ENV</literal>
+by default).
+This will only add
+any particular path once (leaving the last one it encounters and
+ignoring the rest, to preserve path order),
+and to help assure this,
+will normalize all paths (using
+<function>os.path.normpath</function>
+and
+<function>os.path.normcase</function>).
+This can also handle the
+case where the given old path variable is a list instead of a
+string, in which case a list will be returned instead of a string.
+</para>
+
+<para>
+If
+<varname>delete_existing</varname>
+is 0, then adding a path that already exists
+will not move it to the end; it will stay where it is in the list.
+</para>
+
+<para>
+Example:
+</para>
+
+<example_commands>
+print 'before:',env['ENV']['INCLUDE']
+include_path = '/foo/bar:/foo'
+env.AppendENVPath('INCLUDE', include_path)
+print 'after:',env['ENV']['INCLUDE']
+
+yields:
+before: /foo:/biz
+after: /biz:/foo/bar:/foo
+</example_commands>
+</summary>
+</scons_function>
+
+<scons_function name="AppendUnique">
+<arguments signature="env">
+(key=val, [...], delete_existing=0)
+</arguments>
+<summary>
+<para>
+Appends the specified keyword arguments
+to the end of construction variables in the environment.
+If the Environment does not have
+the specified construction variable,
+it is simply added to the environment.
+If the construction variable being appended to is a list,
+then any value(s) that already exist in the
+construction variable will
+<emphasis>not</emphasis>
+be added again to the list.
+However, if delete_existing is 1,
+existing matching values are removed first, so
+existing values in the arg list move to the end of the list.
+</para>
+
+<para>
+Example:
+</para>
+
+<example_commands>
+env.AppendUnique(CCFLAGS = '-g', FOO = ['foo.yyy'])
+</example_commands>
+</summary>
+</scons_function>
+
+<scons_function name="BuildDir">
+<arguments>
+(build_dir, src_dir, [duplicate])
+</arguments>
+<summary>
+<para>
+Deprecated synonyms for
+&f-VariantDir;
+and
+<function>env.VariantDir</function>().
+The
+<varname>build_dir</varname>
+argument becomes the
+<varname>variant_dir</varname>
+argument of
+&f-VariantDir;
+or
+<function>env.VariantDir</function>().
+</para>
+</summary>
+</scons_function>
+
+<scons_function name="Builder">
+<arguments>
+(action, [arguments])
+</arguments>
+<summary>
+<para>
+Creates a Builder object for
+the specified
+<varname>action</varname>.
+See the section "Builder Objects,"
+below, for a complete explanation of the arguments and behavior.
+</para>
+
+<para>
+Note that the
+<function>env.Builder</function>()
+form of the invocation will expand
+construction variables in any arguments strings,
+including the
+<varname>action</varname>
+argument,
+at the time it is called
+using the construction variables in the
+<varname>env</varname>
+construction environment through which
+<function>env.Builder</function>()
+was called.
+The
+&f-Builder;
+form delays all variable expansion
+until after the Builder object is actually called.
+</para>
+</summary>
+</scons_function>
+
+<scons_function name="CacheDir">
+<arguments>
+(cache_dir)
+</arguments>
+<summary>
+<para>
+Specifies that
+&scons;
+will maintain a cache of derived files in
+<varname>cache_dir</varname>.
+The derived files in the cache will be shared
+among all the builds using the same
+&f-CacheDir;
+call.
+Specifying a
+<varname>cache_dir</varname>
+of
+<literal>None</literal>
+disables derived file caching.
+</para>
+
+<para>
+Calling
+<function>env.CacheDir</function>()
+will only affect targets built
+through the specified construction environment.
+Calling
+&f-CacheDir;
+sets a global default
+that will be used by all targets built
+through construction environments
+that do
+<emphasis>not</emphasis>
+have an
+<function>env.CacheDir</function>()
+specified.
+</para>
+
+<para>
+When a
+<function>CacheDir</function>()
+is being used and
+&scons;
+finds a derived file that needs to be rebuilt,
+it will first look in the cache to see if a
+derived file has already been built
+from identical input files and an identical build action
+(as incorporated into the MD5 build signature).
+If so,
+&scons;
+will retrieve the file from the cache.
+If the derived file is not present in the cache,
+&scons;
+will rebuild it and
+then place a copy of the built file in the cache
+(identified by its MD5 build signature),
+so that it may be retrieved by other
+builds that need to build the same derived file
+from identical inputs.
+</para>
+
+<para>
+Use of a specified
+&f-CacheDir;
+may be disabled for any invocation
+by using the
+<option>--cache-disable</option>
+option.
+</para>
+
+<para>
+If the
+<option>--cache-force</option>
+option is used,
+&scons;
+will place a copy of
+<emphasis>all</emphasis>
+derived files in the cache,
+even if they already existed
+and were not built by this invocation.
+This is useful to populate a cache
+the first time
+&f-CacheDir;
+is added to a build,
+or after using the
+<option>--cache-disable</option>
+option.
+</para>
+
+<para>
+When using
+&f-CacheDir;,
+&scons;
+will report,
+"Retrieved `file' from cache,"
+unless the
+<option>--cache-show</option>
+option is being used.
+When the
+<option>--cache-show</option>
+option is used,
+&scons;
+will print the action that
+<emphasis>would</emphasis>
+have been used to build the file,
+without any indication that
+the file was actually retrieved from the cache.
+This is useful to generate build logs
+that are equivalent regardless of whether
+a given derived file has been built in-place
+or retrieved from the cache.
+</para>
+
+<para>
+The
+&f-link-NoCache;
+method can be used to disable caching of specific files. This can be
+useful if inputs and/or outputs of some tool are impossible to
+predict or prohibitively large.
+</para>
+</summary>
+</scons_function>
+
+<scons_function name="Clean">
+<arguments>
+(targets, files_or_dirs)
+</arguments>
+<summary>
+<para>
+This specifies a list of files or directories which should be removed
+whenever the targets are specified with the
+<option>-c</option>
+command line option.
+The specified targets may be a list
+or an individual target.
+Multiple calls to
+&f-Clean;
+are legal,
+and create new targets or add files and directories to the
+clean list for the specified targets.
+</para>
+
+<para>
+Multiple files or directories should be specified
+either as separate arguments to the
+&f-Clean;
+method, or as a list.
+&f-Clean;
+will also accept the return value of any of the construction environment
+Builder methods.
+Examples:
+</para>
+
+<para>
+The related
+&f-link-NoClean;
+function overrides calling
+&f-Clean;
+for the same target,
+and any targets passed to both functions will
+<emphasis>not</emphasis>
+be removed by the
+<option>-c</option>
+option.
+</para>
+
+<para>
+Examples:
+</para>
+
+<example_commands>
+Clean('foo', ['bar', 'baz'])
+Clean('dist', env.Program('hello', 'hello.c'))
+Clean(['foo', 'bar'], 'something_else_to_clean')
+</example_commands>
+
+<para>
+In this example,
+installing the project creates a subdirectory for the documentation.
+This statement causes the subdirectory to be removed
+if the project is deinstalled.
+</para>
+<example_commands>
+Clean(docdir, os.path.join(docdir, projectname))
+</example_commands>
+</summary>
+</scons_function>
+
+<scons_function name="Clone">
+<arguments signature="env">
+([key=val, ...])
+</arguments>
+<summary>
+<para>
+Returns a separate copy of a construction environment.
+If there are any keyword arguments specified,
+they are added to the returned copy,
+overwriting any existing values
+for the keywords.
+</para>
+
+<para>
+Example:
+</para>
+
+<example_commands>
+env2 = env.Clone()
+env3 = env.Clone(CCFLAGS = '-g')
+</example_commands>
+
+<para>
+Additionally, a list of tools and a toolpath may be specified, as in
+the Environment constructor:
+</para>
+
+<example_commands>
+def MyTool(env): env['FOO'] = 'bar'
+env4 = env.Clone(tools = ['msvc', MyTool])
+</example_commands>
+
+<para>
+The
+<varname>parse_flags</varname>
+keyword argument is also recognized:
+</para>
+
+<example_commands>
+# create an environment for compiling programs that use wxWidgets
+wx_env = env.Clone(parse_flags = '!wx-config --cflags --cxxflags')
+</example_commands>
+</summary>
+</scons_function>
+
+<builder name="Command">
+<summary>
+<para>
+The &b-Command; "Builder" is actually implemented
+as a function that looks like a Builder,
+but actually takes an additional argument of the action
+from which the Builder should be made.
+See the &f-link-Command; function description
+for the calling syntax and details.
+</para>
+</summary>
+</builder>
+
+<scons_function name="Command">
+<arguments>
+(target, source, action, [key=val, ...])
+</arguments>
+<summary>
+<para>
+Executes a specific action
+(or list of actions)
+to build a target file or files.
+This is more convenient
+than defining a separate Builder object
+for a single special-case build.
+</para>
+
+<para>
+As a special case, the
+<varname>source_scanner</varname>
+keyword argument can
+be used to specify
+a Scanner object
+that will be used to scan the sources.
+(The global
+<literal>DirScanner</literal>
+object can be used
+if any of the sources will be directories
+that must be scanned on-disk for
+changes to files that aren't
+already specified in other Builder of function calls.)
+</para>
+
+<para>
+Any other keyword arguments specified override any
+same-named existing construction variables.
+</para>
+
+<para>
+An action can be an external command,
+specified as a string,
+or a callable Python object;
+see "Action Objects," below,
+for more complete information.
+Also note that a string specifying an external command
+may be preceded by an
+<literal>@</literal>
+(at-sign)
+to suppress printing the command in question,
+or by a
+<literal>-</literal>
+(hyphen)
+to ignore the exit status of the external command.
+</para>
+
+<para>
+Examples:
+</para>
+
+<example_commands>
+env.Command('foo.out', 'foo.in',
+ "$FOO_BUILD &lt; $SOURCES &gt; $TARGET")
+
+env.Command('bar.out', 'bar.in',
+ ["rm -f $TARGET",
+ "$BAR_BUILD &lt; $SOURCES &gt; $TARGET"],
+ ENV = {'PATH' : '/usr/local/bin/'})
+
+def rename(env, target, source):
+ import os
+ os.rename('.tmp', str(target[0]))
+
+env.Command('baz.out', 'baz.in',
+ ["$BAZ_BUILD &lt; $SOURCES &gt; .tmp",
+ rename ])
+</example_commands>
+
+<para>
+Note that the
+&f-Command;
+function will usually assume, by default,
+that the specified targets and/or sources are Files,
+if no other part of the configuration
+identifies what type of entry it is.
+If necessary, you can explicitly specify
+that targets or source nodes should
+be treated as directoriese
+by using the
+&f-link-Dir;
+or
+<function>env.Dir</function>()
+functions.
+</para>
+
+<para>
+Examples:
+</para>
+
+<example_commands>
+env.Command('ddd.list', Dir('ddd'), 'ls -l $SOURCE > $TARGET')
+
+env['DISTDIR'] = 'destination/directory'
+env.Command(env.Dir('$DISTDIR')), None, make_distdir)
+</example_commands>
+
+<para>
+(Also note that SCons will usually
+automatically create any directory necessary to hold a target file,
+so you normally don't need to create directories by hand.)
+</para>
+</summary>
+</scons_function>
+
+<scons_function name="Configure">
+<arguments signature="global">
+(env, [custom_tests, conf_dir, log_file, config_h])
+</arguments>
+<arguments signature="env">
+([custom_tests, conf_dir, log_file, config_h])
+</arguments>
+<summary>
+<para>
+Creates a Configure object for integrated
+functionality similar to GNU autoconf.
+See the section "Configure Contexts,"
+below, for a complete explanation of the arguments and behavior.
+</para>
+</summary>
+</scons_function>
+
+<scons_function name="Copy">
+<arguments signature="env">
+([key=val, ...])
+</arguments>
+<summary>
+<para>
+A now-deprecated synonym for
+<function>env.Clone</function>().
+</para>
+</summary>
+</scons_function>
+
+<scons_function name="Decider">
+<arguments>
+(function)
+</arguments>
+<summary>
+<para>
+Specifies that all up-to-date decisions for
+targets built through this construction environment
+will be handled by the specified
+<varname>function</varname>.
+The
+<varname>function</varname>
+can be one of the following strings
+that specify the type of decision function
+to be performed:
+</para>
+
+<para>
+<variablelist>
+<varlistentry>
+<term><literal>timestamp-newer</literal></term>
+<listitem>
+<para>
+Specifies that a target shall be considered out of date and rebuilt
+if the dependency's timestamp is newer than the target file's timestamp.
+This is the behavior of the classic Make utility,
+and
+<literal>make</literal>
+can be used a synonym for
+<literal>timestamp-newer</literal>.
+</para>
+</listitem>
+</varlistentry>
+<varlistentry>
+<term><literal>timestamp-match</literal></term>
+<listitem>
+<para>
+Specifies that a target shall be considered out of date and rebuilt
+if the dependency's timestamp is different than the
+timestamp recorded the last time the target was built.
+This provides behavior very similar to the classic Make utility
+(in particular, files are not opened up so that their
+contents can be checksummed)
+except that the target will also be rebuilt if a
+dependency file has been restored to a version with an
+<emphasis>earlier</emphasis>
+timestamp, such as can happen when restoring files from backup archives.
+</para>
+</listitem>
+</varlistentry>
+<varlistentry>
+<term><literal>MD5</literal></term>
+<listitem>
+<para>
+Specifies that a target shall be considered out of date and rebuilt
+if the dependency's content has changed since the last time
+the target was built,
+as determined be performing an MD5 checksum
+on the dependency's contents
+and comparing it to the checksum recorded the
+last time the target was built.
+<literal>content</literal>
+can be used as a synonym for
+<literal>MD5</literal>.
+</para>
+</listitem>
+</varlistentry>
+<varlistentry>
+<term><literal>MD5-timestamp</literal></term>
+<listitem>
+<para>
+Specifies that a target shall be considered out of date and rebuilt
+if the dependency's content has changed since the last time
+the target was built,
+except that dependencies with a timestamp that matches
+the last time the target was rebuilt will be
+assumed to be up-to-date and
+<emphasis>not</emphasis>
+rebuilt.
+This provides behavior very similar
+to the
+<literal>MD5</literal>
+behavior of always checksumming file contents,
+with an optimization of not checking
+the contents of files whose timestamps haven't changed.
+The drawback is that SCons will
+<emphasis>not</emphasis>
+detect if a file's content has changed
+but its timestamp is the same,
+as might happen in an automated script
+that runs a build,
+updates a file,
+and runs the build again,
+all within a single second.
+</para>
+</listitem>
+</varlistentry>
+</variablelist>
+</para>
+
+<para>
+Examples:
+</para>
+
+<example_commands>
+# Use exact timestamp matches by default.
+Decider('timestamp-match')
+
+# Use MD5 content signatures for any targets built
+# with the attached construction environment.
+env.Decider('content')
+</example_commands>
+
+<para>
+In addition to the above already-available functions,
+the
+<varname>function</varname>
+argument may be an actual Python function
+that takes the following three arguments:
+</para>
+
+<para>
+<variablelist>
+<varlistentry>
+<term><parameter>dependency</parameter></term>
+<listitem>
+<para>
+The Node (file) which
+should cause the
+<varname>target</varname>
+to be rebuilt
+if it has "changed" since the last tme
+<varname>target</varname>
+was built.
+</para>
+</listitem>
+</varlistentry>
+<varlistentry>
+<term><parameter>target</parameter></term>
+<listitem>
+<para>
+The Node (file) being built.
+In the normal case,
+this is what should get rebuilt
+if the
+<varname>dependency</varname>
+has "changed."
+</para>
+</listitem>
+</varlistentry>
+<varlistentry>
+<term><parameter>prev_ni</parameter></term>
+<listitem>
+<para>
+Stored information about the state of the
+<varname>dependency</varname>
+the last time the
+<varname>target</varname>
+was built.
+This can be consulted to match various
+file characteristics
+such as the timestamp,
+size, or content signature.
+</para>
+</listitem>
+</varlistentry>
+</variablelist>
+</para>
+
+<para>
+The
+<varname>function</varname>
+should return a
+<literal>True</literal>
+(non-zero)
+value if the
+<varname>dependency</varname>
+has "changed" since the last time
+the
+<varname>target</varname>
+was built
+(indicating that the target
+<emphasis>should</emphasis>
+be rebuilt),
+and
+<literal>False</literal>
+(zero)
+otherwise
+(indicating that the target should
+<emphasis>not</emphasis>
+be rebuilt).
+Note that the decision can be made
+using whatever criteria are appopriate.
+Ignoring some or all of the function arguments
+is perfectly normal.
+</para>
+
+<para>
+Example:
+</para>
+
+<example_commands>
+def my_decider(dependency, target, prev_ni):
+ return not os.path.exists(str(target))
+
+env.Decider(my_decider)
+</example_commands>
+</summary>
+</scons_function>
+
+<scons_function name="Depends">
+<arguments>
+(target, dependency)
+</arguments>
+<summary>
+<para>
+Specifies an explicit dependency;
+the
+<varname>target</varname>
+will be rebuilt
+whenever the
+<varname>dependency</varname>
+has changed.
+Both the specified
+<varname>target</varname>
+and
+<varname>dependency</varname>
+can be a string
+(usually the path name of a file or directory)
+or Node objects,
+or a list of strings or Node objects
+(such as returned by a Builder call).
+This should only be necessary
+for cases where the dependency
+is not caught by a Scanner
+for the file.
+</para>
+
+<para>
+Example:
+</para>
+
+<example_commands>
+env.Depends('foo', 'other-input-file-for-foo')
+
+mylib = env.Library('mylib.c')
+installed_lib = env.Install('lib', mylib)
+bar = env.Program('bar.c')
+
+# Arrange for the library to be copied into the installation
+# directory before trying to build the "bar" program.
+# (Note that this is for example only. A "real" library
+# dependency would normally be configured through the $LIBS
+# and $LIBPATH variables, not using an env.Depends() call.)
+
+env.Depends(bar, installed_lib)
+</example_commands>
+</summary>
+</scons_function>
+
+<scons_function name="Dictionary">
+<arguments signature="env">
+([vars])
+</arguments>
+<summary>
+<para>
+Returns a dictionary object
+containing copies of all of the
+construction variables in the environment.
+If there are any variable names specified,
+only the specified construction
+variables are returned in the dictionary.
+</para>
+
+<para>
+Example:
+</para>
+
+<example_commands>
+dict = env.Dictionary()
+cc_dict = env.Dictionary('CC', 'CCFLAGS', 'CCCOM')
+</example_commands>
+</summary>
+</scons_function>
+
+<scons_function name="Dir">
+<arguments>
+(name, [directory])
+</arguments>
+<summary>
+<para>
+This returns a Directory Node,
+an object that represents the specified directory
+<varname>name</varname>.
+<varname>name</varname>
+can be a relative or absolute path.
+<varname>directory</varname>
+is an optional directory that will be used as the parent directory.
+If no
+<varname>directory</varname>
+is specified, the current script's directory is used as the parent.
+</para>
+
+<para>
+If
+<varname>name</varname>
+is a list, SCons returns a list of Dir nodes.
+Construction variables are expanded in
+<varname>name</varname>.
+</para>
+
+<para>
+Directory Nodes can be used anywhere you
+would supply a string as a directory name
+to a Builder method or function.
+Directory Nodes have attributes and methods
+that are useful in many situations;
+see "File and Directory Nodes," below.
+</para>
+</summary>
+</scons_function>
+
+<scons_function name="Dump">
+<arguments signature="env">
+([key])
+</arguments>
+<summary>
+<para>
+Returns a pretty printable representation of the environment.
+<varname>key</varname>,
+if not
+<literal>None</literal>,
+should be a string containing the name of the variable of interest.
+</para>
+
+<para>
+This SConstruct:
+</para>
+
+<example_commands>
+env=Environment()
+print env.Dump('CCCOM')
+</example_commands>
+
+<para>
+will print:
+</para>
+
+<example_commands>
+'$CC -c -o $TARGET $CCFLAGS $CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS $SOURCES'
+</example_commands>
+
+<para>
+While this SConstruct:
+</para>
+
+<example_commands>
+env=Environment()
+print env.Dump()
+</example_commands>
+
+<para>
+will print:
+</para>
+<example_commands>
+{ 'AR': 'ar',
+ 'ARCOM': '$AR $ARFLAGS $TARGET $SOURCES\n$RANLIB $RANLIBFLAGS $TARGET',
+ 'ARFLAGS': ['r'],
+ 'AS': 'as',
+ 'ASCOM': '$AS $ASFLAGS -o $TARGET $SOURCES',
+ 'ASFLAGS': [],
+ ...
+</example_commands>
+</summary>
+</scons_function>
+
+<scons_function name="Environment">
+<arguments>
+([key=value, ...])
+</arguments>
+<summary>
+<para>
+Return a new construction environment
+initialized with the specified
+<varname>key</varname><literal>=</literal><varname>value</varname>
+pairs.
+</para>
+</summary>
+</scons_function>
+
+<scons_function name="Execute">
+<arguments>
+(action, [strfunction, varlist])
+</arguments>
+<summary>
+<para>
+Executes an Action object.
+The specified
+<varname>action</varname>
+may be an Action object
+(see the section "Action Objects,"
+below, for a complete explanation of the arguments and behavior),
+or it may be a command-line string,
+list of commands,
+or executable Python function,
+each of which will be converted
+into an Action object
+and then executed.
+The exit value of the command
+or return value of the Python function
+will be returned.
+</para>
+
+<para>
+Note that
+&scons;
+will print an error message if the executed
+<varname>action</varname>
+fails--that is,
+exits with or returns a non-zero value.
+&scons;
+will
+<emphasis>not</emphasis>,
+however,
+automatically terminate the build
+if the specified
+<varname>action</varname>
+fails.
+If you want the build to stop in response to a failed
+&f-Execute;
+call,
+you must explicitly check for a non-zero return value:
+</para>
+
+<example_commands>
+Execute(Copy('file.out', 'file.in'))
+
+if Execute("mkdir sub/dir/ectory"):
+ # The mkdir failed, don't try to build.
+ Exit(1)
+</example_commands>
+</summary>
+</scons_function>
+
+<scons_function name="File">
+<arguments>
+(name, [directory])
+</arguments>
+<summary>
+<para>
+This returns a
+File Node,
+an object that represents the specified file
+<varname>name</varname>.
+<varname>name</varname>
+can be a relative or absolute path.
+<varname>directory</varname>
+is an optional directory that will be used as the parent directory.
+</para>
+
+<para>
+If
+<varname>name</varname>
+is a list, SCons returns a list of File nodes.
+Construction variables are expanded in
+<varname>name</varname>.
+</para>
+
+<para>
+File Nodes can be used anywhere you
+would supply a string as a file name
+to a Builder method or function.
+File Nodes have attributes and methods
+that are useful in many situations;
+see "File and Directory Nodes," below.
+</para>
+</summary>
+</scons_function>
+
+<scons_function name="FindFile">
+<arguments>
+(file, dirs)
+</arguments>
+<summary>
+<para>
+Search for
+<varname>file</varname>
+in the path specified by
+<varname>dirs</varname>.
+<varname>dirs</varname>
+may be a list of directory names or a single directory name.
+In addition to searching for files that exist in the filesystem,
+this function also searches for derived files
+that have not yet been built.
+</para>
+
+<para>
+Example:
+</para>
+
+<example_commands>
+foo = env.FindFile('foo', ['dir1', 'dir2'])
+</example_commands>
+</summary>
+</scons_function>
+
+<scons_function name="FindInstalledFiles">
+<arguments>
+()
+</arguments>
+<summary>
+<para>
+Returns the list of targets set up by the
+&b-link-Install;
+or
+&b-link-InstallAs;
+builders.
+</para>
+
+<para>
+This function serves as a convenient method to select the contents of
+a binary package.
+</para>
+
+<para>
+Example:
+</para>
+
+<example_commands>
+Install( '/bin', [ 'executable_a', 'executable_b' ] )
+
+# will return the file node list
+# [ '/bin/executable_a', '/bin/executable_b' ]
+FindInstalledFiles()
+
+Install( '/lib', [ 'some_library' ] )
+
+# will return the file node list
+# [ '/bin/executable_a', '/bin/executable_b', '/lib/some_library' ]
+FindInstalledFiles()
+</example_commands>
+</summary>
+</scons_function>
+
+<scons_function name="FindSourceFiles">
+<arguments>
+(node='"."')
+</arguments>
+<summary>
+<para>
+Returns the list of nodes which serve as the source of the built files.
+It does so by inspecting the dependency tree starting at the optional
+argument
+<varname>node</varname>
+which defaults to the '"."'-node. It will then return all leaves of
+<varname>node</varname>.
+These are all children which have no further children.
+</para>
+
+<para>
+This function is a convenient method to select the contents of a Source
+Package.
+</para>
+
+<para>
+Example:
+</para>
+
+<example_commands>
+Program( 'src/main_a.c' )
+Program( 'src/main_b.c' )
+Program( 'main_c.c' )
+
+# returns ['main_c.c', 'src/main_a.c', 'SConstruct', 'src/main_b.c']
+FindSourceFiles()
+
+# returns ['src/main_b.c', 'src/main_a.c' ]
+FindSourceFiles( 'src' )
+</example_commands>
+
+<para>
+As you can see build support files (SConstruct in the above example)
+will also be returned by this function.
+</para>
+</summary>
+</scons_function>
+
+<scons_function name="Flatten">
+<arguments>
+(sequence)
+</arguments>
+<summary>
+<para>
+Takes a sequence (that is, a Python list or tuple)
+that may contain nested sequences
+and returns a flattened list containing
+all of the individual elements in any sequence.
+This can be helpful for collecting
+the lists returned by calls to Builders;
+other Builders will automatically
+flatten lists specified as input,
+but direct Python manipulation of
+these lists does not.
+</para>
+
+<para>
+Examples:
+</para>
+
+<example_commands>
+foo = Object('foo.c')
+bar = Object('bar.c')
+
+# Because `foo' and `bar' are lists returned by the Object() Builder,
+# `objects' will be a list containing nested lists:
+objects = ['f1.o', foo, 'f2.o', bar, 'f3.o']
+
+# Passing such a list to another Builder is all right because
+# the Builder will flatten the list automatically:
+Program(source = objects)
+
+# If you need to manipulate the list directly using Python, you need to
+# call Flatten() yourself, or otherwise handle nested lists:
+for object in Flatten(objects):
+ print str(object)
+</example_commands>
+</summary>
+</scons_function>
+
+<scons_function name="GetBuildPath">
+<arguments>
+(file, [...])
+</arguments>
+<summary>
+<para>
+Returns the
+&scons;
+path name (or names) for the specified
+<varname>file</varname>
+(or files).
+The specified
+<varname>file</varname>
+or files
+may be
+&scons;
+Nodes or strings representing path names.
+</para>
+</summary>
+</scons_function>
+
+<scons_function name="Glob">
+<arguments>
+(pattern, [ondisk, source, strings, exclude])
+</arguments>
+<summary>
+<para>
+Returns Nodes (or strings) that match the specified
+<varname>pattern</varname>,
+relative to the directory of the current
+&SConscript;
+file.
+The
+<function>env.Glob</function>()
+form performs string substition on
+<varname>pattern</varname>
+and returns whatever matches
+the resulting expanded pattern.
+</para>
+
+<para>
+The specified
+<varname>pattern</varname>
+uses Unix shell style metacharacters for matching:
+</para>
+
+<example_commands>
+ * matches everything
+ ? matches any single character
+ [seq] matches any character in seq
+ [!seq] matches any char not in seq
+</example_commands>
+
+<para>
+If the first character of a filename is a dot,
+it must be matched explicitly.
+Character matches do
+<emphasis>not</emphasis>
+span directory separators.
+</para>
+
+<para>
+The
+&f-Glob;
+knows about
+repositories
+(see the
+&f-link-Repository;
+function)
+and source directories
+(see the
+&f-link-VariantDir;
+function)
+and
+returns a Node (or string, if so configured)
+in the local (SConscript) directory
+if matching Node is found
+anywhere in a corresponding
+repository or source directory.
+</para>
+
+<para>
+The
+<varname>ondisk</varname>
+argument may be set to
+<literal>False</literal>
+(or any other non-true value)
+to disable the search for matches on disk,
+thereby only returning matches among
+already-configured File or Dir Nodes.
+The default behavior is to
+return corresponding Nodes
+for any on-disk matches found.
+</para>
+
+<para>
+The
+<varname>source</varname>
+argument may be set to
+<literal>True</literal>
+(or any equivalent value)
+to specify that,
+when the local directory is a
+&f-VariantDir;,
+the returned Nodes should be from the
+corresponding source directory,
+not the local directory.
+</para>
+
+<para>
+The
+<varname>strings</varname>
+argument may be set to
+<literal>True</literal>
+(or any equivalent value)
+to have the
+&f-Glob;
+function return strings, not Nodes,
+that represent the matched files or directories.
+The returned strings will be relative to
+the local (SConscript) directory.
+(Note that This may make it easier to perform
+arbitrary manipulation of file names,
+but if the returned strings are
+passed to a different
+&SConscript;
+file,
+any Node translation will be relative
+to the other
+&SConscript;
+directory,
+not the original
+&SConscript;
+directory.)
+</para>
+
+<para>
+The
+<varname>exclude</varname>
+argument may be set to a pattern or a list of patterns
+(following the same Unix shell semantics)
+which must be filtered out of returned elements.
+Elements matching a least one pattern of
+this list will be excluded.
+</para>
+
+<para>
+Examples:
+</para>
+
+<example_commands>
+Program('foo', Glob('*.c'))
+Zip('/tmp/everything', Glob('.??*') + Glob('*'))
+sources = Glob('*.cpp', exclude=['os_*_specific_*.cpp']) + Glob('os_%s_specific_*.cpp'%currentOS)
+</example_commands>
+</summary>
+</scons_function>
+
+<!--
+<scons_function name="GlobalBuilders">
+<arguments signature="global">
+(flag)
+</arguments>
+<summary>
+<para>
+When
+<varname>flag</varname>
+is non-zero,
+adds the names of the default builders
+(Program, Library, etc.)
+to the global name space
+so they can be called without an explicit construction environment.
+(This is the default.)
+When
+<varname>flag</varname>
+is zero,
+the names of the default builders are removed
+from the global name space
+so that an explicit construction environment is required
+to call all builders.
+</para>
+</summary>
+</scons_function>
+-->
+
+<scons_function name="Ignore">
+<arguments>
+(target, dependency)
+</arguments>
+<summary>
+<para>
+The specified dependency file(s)
+will be ignored when deciding if
+the target file(s) need to be rebuilt.
+</para>
+
+<para>
+You can also use
+&f-Ignore;
+to remove a target from the default build.
+In order to do this you must specify the directory the target will
+be built in as the target, and the file you want to skip building
+as the dependency.
+</para>
+
+<para>
+Note that this will only remove the dependencies listed from
+the files built by default. It will still be built if that
+dependency is needed by another object being built.
+See the third and forth examples below.
+</para>
+
+<para>
+Examples:
+</para>
+
+<example_commands>
+env.Ignore('foo', 'foo.c')
+env.Ignore('bar', ['bar1.h', 'bar2.h'])
+env.Ignore('.','foobar.obj')
+env.Ignore('bar','bar/foobar.obj')
+</example_commands>
+</summary>
+</scons_function>
+
+<scons_function name="Literal">
+<arguments>
+(string)
+</arguments>
+<summary>
+<para>
+The specified
+<varname>string</varname>
+will be preserved as-is
+and not have construction variables expanded.
+</para>
+</summary>
+</scons_function>
+
+<scons_function name="Local">
+<arguments>
+(targets)
+</arguments>
+<summary>
+<para>
+The specified
+<varname>targets</varname>
+will have copies made in the local tree,
+even if an already up-to-date copy
+exists in a repository.
+Returns a list of the target Node or Nodes.
+</para>
+</summary>
+</scons_function>
+
+<!--
+<scons_function name="MergeShellPaths">
+<arguments signature="env">
+( arg ", [" prepend ])
+</arguments>
+<summary>
+<para>
+Merges the elements of the specified
+<varname>arg</varname>,
+which must be a dictionary, to the construction
+environment's copy of the shell environment
+in env['ENV'].
+(This is the environment which is passed
+to subshells spawned by SCons.)
+Note that
+<varname>arg</varname>
+must be a single value,
+so multiple strings must
+be passed in as a list,
+not as separate arguments to
+&f-MergeShellPaths;.
+</para>
+
+<para>
+New values are prepended to the environment variable by default,
+unless prepend=0 is specified.
+Duplicate values are always eliminated,
+since this function calls
+&f-link-AppendENVPath;
+or
+&f-link-PrependENVPath;
+depending on the
+<varname>prepend</varname>
+argument. See those functions for more details.
+</para>
+
+<para>
+Examples:
+</para>
+
+<example_commands>
+# Prepend a path to the shell PATH.
+env.MergeShellPaths({'PATH':'/usr/local/bin'} )
+# Append two dirs to the shell INCLUDE.
+env.MergeShellPaths({'INCLUDE':['c:/inc1', 'c:/inc2']}, prepend=0 )
+</example_commands>
+</summary>
+</scons_function>
+-->
+
+<scons_function name="MergeFlags">
+<arguments signature="env">
+(arg, [unique])
+</arguments>
+<summary>
+<para>
+Merges the specified
+<varname>arg</varname>
+values to the construction environment's construction variables.
+If the
+<varname>arg</varname>
+argument is not a dictionary,
+it is converted to one by calling
+&f-link-env-ParseFlags;
+on the argument
+before the values are merged.
+Note that
+<varname>arg</varname>
+must be a single value,
+so multiple strings must
+be passed in as a list,
+not as separate arguments to
+&f-env-MergeFlags;.
+</para>
+
+<para>
+By default,
+duplicate values are eliminated;
+you can, however, specify
+<literal>unique=0</literal>
+to allow duplicate
+values to be added.
+When eliminating duplicate values,
+any construction variables that end with
+the string
+<literal>PATH</literal>
+keep the left-most unique value.
+All other construction variables keep
+the right-most unique value.
+</para>
+
+<para>
+Examples:
+</para>
+
+<example_commands>
+# Add an optimization flag to $CCFLAGS.
+env.MergeFlags('-O3')
+
+# Combine the flags returned from running pkg-config with an optimization
+# flag and merge the result into the construction variables.
+env.MergeFlags(['!pkg-config gtk+-2.0 --cflags', '-O3'])
+
+# Combine an optimization flag with the flags returned from running pkg-config
+# twice and merge the result into the construction variables.
+env.MergeFlags(['-O3',
+ '!pkg-config gtk+-2.0 --cflags --libs',
+ '!pkg-config libpng12 --cflags --libs'])
+</example_commands>
+</summary>
+</scons_function>
+
+<scons_function name="NoCache">
+<arguments>
+(target, ...)
+</arguments>
+<summary>
+<para>
+Specifies a list of files which should
+<emphasis>not</emphasis>
+be cached whenever the
+&f-link-CacheDir;
+method has been activated.
+The specified targets may be a list
+or an individual target.
+</para>
+
+<para>
+Multiple files should be specified
+either as separate arguments to the
+&f-NoCache;
+method, or as a list.
+&f-NoCache;
+will also accept the return value of any of the construction environment
+Builder methods.
+</para>
+
+<para>
+Calling
+&f-NoCache;
+on directories and other non-File Node types has no effect because
+only File Nodes are cached.
+</para>
+
+<para>
+Examples:
+</para>
+
+<example_commands>
+NoCache('foo.elf')
+NoCache(env.Program('hello', 'hello.c'))
+</example_commands>
+</summary>
+</scons_function>
+
+<scons_function name="NoClean">
+<arguments>
+(target, ...)
+</arguments>
+<summary>
+<para>
+Specifies a list of files or directories which should
+<emphasis>not</emphasis>
+be removed whenever the targets (or their dependencies)
+are specified with the
+<option>-c</option>
+command line option.
+The specified targets may be a list
+or an individual target.
+Multiple calls to
+&f-NoClean;
+are legal,
+and prevent each specified target
+from being removed by calls to the
+<option>-c</option>
+option.
+</para>
+
+<para>
+Multiple files or directories should be specified
+either as separate arguments to the
+&f-NoClean;
+method, or as a list.
+&f-NoClean;
+will also accept the return value of any of the construction environment
+Builder methods.
+</para>
+
+<para>
+Calling
+&f-NoClean;
+for a target overrides calling
+&f-link-Clean;
+for the same target,
+and any targets passed to both functions will
+<emphasis>not</emphasis>
+be removed by the
+<option>-c</option>
+option.
+</para>
+
+<para>
+Examples:
+</para>
+
+<example_commands>
+NoClean('foo.elf')
+NoClean(env.Program('hello', 'hello.c'))
+</example_commands>
+</summary>
+</scons_function>
+
+<scons_function name="ParseConfig">
+<arguments signature="env">
+(command, [function, unique])
+</arguments>
+<summary>
+<para>
+Calls the specified
+<varname>function</varname>
+to modify the environment as specified by the output of
+<varname>command</varname>.
+The default
+<varname>function</varname>
+is
+&f-link-env-MergeFlags;,
+which expects the output of a typical
+<application>*-config</application>
+command
+(for example,
+<application>gtk-config</application>)
+and adds the options
+to the appropriate construction variables.
+By default,
+duplicate values are not
+added to any construction variables;
+you can specify
+<literal>unique=0</literal>
+to allow duplicate
+values to be added.
+</para>
+
+<para>
+Interpreted options
+and the construction variables they affect
+are as specified for the
+&f-link-env-ParseFlags;
+method (which this method calls).
+See that method's description, below,
+for a table of options and construction variables.
+</para>
+</summary>
+</scons_function>
+
+<scons_function name="ParseDepends">
+<arguments>
+(filename, [must_exist, only_one])
+</arguments>
+<summary>
+<para>
+Parses the contents of the specified
+<varname>filename</varname>
+as a list of dependencies in the style of
+&Make;
+or
+<application>mkdep</application>,
+and explicitly establishes all of the listed dependencies.
+</para>
+
+<para>
+By default,
+it is not an error
+if the specified
+<varname>filename</varname>
+does not exist.
+The optional
+<varname>must_exist</varname>
+argument may be set to a non-zero
+value to have
+scons
+throw an exception and
+generate an error if the file does not exist,
+or is otherwise inaccessible.
+</para>
+
+<para>
+The optional
+<varname>only_one</varname>
+argument may be set to a non-zero
+value to have
+scons
+thrown an exception and
+generate an error
+if the file contains dependency
+information for more than one target.
+This can provide a small sanity check
+for files intended to be generated
+by, for example, the
+<literal>gcc -M</literal>
+flag,
+which should typically only
+write dependency information for
+one output file into a corresponding
+<filename>.d</filename>
+file.
+</para>
+
+<para>
+The
+<varname>filename</varname>
+and all of the files listed therein
+will be interpreted relative to
+the directory of the
+&SConscript;
+file which calls the
+&f-ParseDepends;
+function.
+</para>
+</summary>
+</scons_function>
+
+<scons_function name="ParseFlags">
+<arguments signature="env">
+(flags, ...)
+</arguments>
+<summary>
+<para>
+Parses one or more strings containing
+typical command-line flags for GCC tool chains
+and returns a dictionary with the flag values
+separated into the appropriate SCons construction variables.
+This is intended as a companion to the
+&f-link-env-MergeFlags;
+method, but allows for the values in the returned dictionary
+to be modified, if necessary,
+before merging them into the construction environment.
+(Note that
+&f-env-MergeFlags;
+will call this method if its argument is not a dictionary,
+so it is usually not necessary to call
+&f-link-env-ParseFlags;
+directly unless you want to manipulate the values.)
+</para>
+
+<para>
+If the first character in any string is
+an exclamation mark (!),
+the rest of the string is executed as a command,
+and the output from the command is
+parsed as GCC tool chain command-line flags
+and added to the resulting dictionary.
+</para>
+
+<para>
+Flag values are translated accordig to the prefix found,
+and added to the following construction variables:
+</para>
+
+<example_commands>
+-arch CCFLAGS, LINKFLAGS
+-D CPPDEFINES
+-framework FRAMEWORKS
+-frameworkdir= FRAMEWORKPATH
+-include CCFLAGS
+-isysroot CCFLAGS, LINKFLAGS
+-I CPPPATH
+-l LIBS
+-L LIBPATH
+-mno-cygwin CCFLAGS, LINKFLAGS
+-mwindows LINKFLAGS
+-pthread CCFLAGS, LINKFLAGS
+-std= CFLAGS
+-Wa, ASFLAGS, CCFLAGS
+-Wl,-rpath= RPATH
+-Wl,-R, RPATH
+-Wl,-R RPATH
+-Wl, LINKFLAGS
+-Wp, CPPFLAGS
+- CCFLAGS
++ CCFLAGS, LINKFLAGS
+</example_commands>
+
+<para>
+Any other strings not associated with options
+are assumed to be the names of libraries
+and added to the
+&cv-LIBS;
+construction variable.
+</para>
+
+<para>
+Examples (all of which produce the same result):
+</para>
+
+<example_commands>
+dict = env.ParseFlags('-O2 -Dfoo -Dbar=1')
+dict = env.ParseFlags('-O2', '-Dfoo', '-Dbar=1')
+dict = env.ParseFlags(['-O2', '-Dfoo -Dbar=1'])
+dict = env.ParseFlags('-O2', '!echo -Dfoo -Dbar=1')
+</example_commands>
+</summary>
+</scons_function>
+
+<scons_function name="Platform">
+<arguments signature="global">
+(string)
+</arguments>
+<summary>
+<para>
+The
+&f-Platform;
+form returns a callable object
+that can be used to initialize
+a construction environment using the
+platform keyword of the
+&f-Environment;
+function.
+</para>
+
+<para>
+Example:
+</para>
+
+<example_commands>
+env = Environment(platform = Platform('win32'))
+</example_commands>
+
+<para>
+The
+&f-env-Platform;
+form applies the callable object for the specified platform
+<varname>string</varname>
+to the environment through which the method was called.
+</para>
+
+<example_commands>
+env.Platform('posix')
+</example_commands>
+
+<para>
+Note that the
+<literal>win32</literal>
+platform adds the
+<literal>SystemDrive</literal>
+and
+<literal>SystemRoot</literal>
+variables from the user's external environment
+to the construction environment's
+&cv-link-ENV;
+dictionary.
+This is so that any executed commands
+that use sockets to connect with other systems
+(such as fetching source files from
+external CVS repository specifications like
+<literal>:pserver:anonymous@cvs.sourceforge.net:/cvsroot/scons</literal>)
+will work on Windows systems.
+</para>
+</summary>
+</scons_function>
+
+<scons_function name="Prepend">
+<arguments signature="env">
+(key=val, [...])
+</arguments>
+<summary>
+<para>
+Appends the specified keyword arguments
+to the beginning of construction variables in the environment.
+If the Environment does not have
+the specified construction variable,
+it is simply added to the environment.
+If the values of the construction variable
+and the keyword argument are the same type,
+then the two values will be simply added together.
+Otherwise, the construction variable
+and the value of the keyword argument
+are both coerced to lists,
+and the lists are added together.
+(See also the Append method, above.)
+</para>
+
+<para>
+Example:
+</para>
+
+<example_commands>
+env.Prepend(CCFLAGS = '-g ', FOO = ['foo.yyy'])
+</example_commands>
+</summary>
+</scons_function>
+
+<scons_function name="PrependENVPath">
+<arguments signature="env">
+(name, newpath, [envname, sep, delete_existing])
+</arguments>
+<summary>
+<para>
+This appends new path elements to the given path in the
+specified external environment
+(&cv-ENV;
+by default).
+This will only add
+any particular path once (leaving the first one it encounters and
+ignoring the rest, to preserve path order),
+and to help assure this,
+will normalize all paths (using
+<literal>os.path.normpath</literal>
+and
+<literal>os.path.normcase</literal>).
+This can also handle the
+case where the given old path variable is a list instead of a
+string, in which case a list will be returned instead of a string.
+</para>
+
+<para>
+If
+<varname>delete_existing</varname>
+is 0, then adding a path that already exists
+will not move it to the beginning;
+it will stay where it is in the list.
+</para>
+
+<para>
+Example:
+</para>
+
+<example_commands>
+print 'before:',env['ENV']['INCLUDE']
+include_path = '/foo/bar:/foo'
+env.PrependENVPath('INCLUDE', include_path)
+print 'after:',env['ENV']['INCLUDE']
+</example_commands>
+
+<para>
+The above example will print:
+</para>
+
+<example_commands>
+before: /biz:/foo
+after: /foo/bar:/foo:/biz
+</example_commands>
+</summary>
+</scons_function>
+
+<scons_function name="PrependUnique">
+<arguments signature="env">
+(key=val, delete_existing=0, [...])
+</arguments>
+<summary>
+<para>
+Appends the specified keyword arguments
+to the beginning of construction variables in the environment.
+If the Environment does not have
+the specified construction variable,
+it is simply added to the environment.
+If the construction variable being appended to is a list,
+then any value(s) that already exist in the
+construction variable will
+<emphasis>not</emphasis>
+be added again to the list.
+However, if delete_existing is 1,
+existing matching values are removed first, so
+existing values in the arg list move to the front of the list.
+</para>
+
+<para>
+Example:
+</para>
+
+<example_commands>
+env.PrependUnique(CCFLAGS = '-g', FOO = ['foo.yyy'])
+</example_commands>
+</summary>
+</scons_function>
+
+<scons_function name="PyPackageDir">
+<arguments>
+(modulename)
+</arguments>
+<summary>
+<para>
+This returns a Directory Node similar to Dir.
+The python module / package is looked up and if located
+the directory is returned for the location.
+<varname>modulename</varname>
+Is a named python package / module to
+lookup the directory for it's location.
+</para>
+<para>
+If
+<varname>modulename</varname>
+is a list, SCons returns a list of Dir nodes.
+Construction variables are expanded in
+<varname>modulename</varname>.
+</para>
+</summary>
+</scons_function>
+
+<scons_function name="Replace">
+<arguments signature="env">
+(key=val, [...])
+</arguments>
+<summary>
+<para>
+Replaces construction variables in the Environment
+with the specified keyword arguments.
+</para>
+
+<para>
+Example:
+</para>
+
+<example_commands>
+env.Replace(CCFLAGS = '-g', FOO = 'foo.xxx')
+</example_commands>
+</summary>
+</scons_function>
+
+<scons_function name="Repository">
+<arguments>
+(directory)
+</arguments>
+<summary>
+<para>
+Specifies that
+<varname>directory</varname>
+is a repository to be searched for files.
+Multiple calls to
+&f-Repository;
+are legal,
+and each one adds to the list of
+repositories that will be searched.
+</para>
+
+<para>
+To
+&scons;,
+a repository is a copy of the source tree,
+from the top-level directory on down,
+which may contain
+both source files and derived files
+that can be used to build targets in
+the local source tree.
+The canonical example would be an
+official source tree maintained by an integrator.
+If the repository contains derived files,
+then the derived files should have been built using
+&scons;,
+so that the repository contains the necessary
+signature information to allow
+&scons;
+to figure out when it is appropriate to
+use the repository copy of a derived file,
+instead of building one locally.
+</para>
+
+<para>
+Note that if an up-to-date derived file
+already exists in a repository,
+&scons;
+will
+<emphasis>not</emphasis>
+make a copy in the local directory tree.
+In order to guarantee that a local copy
+will be made,
+use the
+&f-link-Local;
+method.
+</para>
+</summary>
+</scons_function>
+
+<scons_function name="Requires">
+<arguments>
+(target, prerequisite)
+</arguments>
+<summary>
+<para>
+Specifies an order-only relationship
+between the specified target file(s)
+and the specified prerequisite file(s).
+The prerequisite file(s)
+will be (re)built, if necessary,
+<emphasis>before</emphasis>
+the target file(s),
+but the target file(s) do not actually
+depend on the prerequisites
+and will not be rebuilt simply because
+the prerequisite file(s) change.
+</para>
+
+<para>
+Example:
+</para>
+
+<example_commands>
+env.Requires('foo', 'file-that-must-be-built-before-foo')
+</example_commands>
+</summary>
+</scons_function>
+
+<scons_function name="Scanner">
+<arguments>
+(function, [argument, keys, path_function, node_class, node_factory, scan_check, recursive])
+</arguments>
+<summary>
+<para>
+Creates a Scanner object for
+the specified
+<varname>function</varname>.
+See the section "Scanner Objects,"
+below, for a complete explanation of the arguments and behavior.
+</para>
+</summary>
+</scons_function>
+
+<scons_function name="SConscriptChdir">
+<arguments>
+(value)
+</arguments>
+<summary>
+<para>
+By default,
+&scons;
+changes its working directory
+to the directory in which each
+subsidiary SConscript file lives.
+This behavior may be disabled
+by specifying either:
+</para>
+
+<example_commands>
+SConscriptChdir(0)
+env.SConscriptChdir(0)
+</example_commands>
+
+<para>
+in which case
+&scons;
+will stay in the top-level directory
+while reading all SConscript files.
+(This may be necessary when building from repositories,
+when all the directories in which SConscript files may be found
+don't necessarily exist locally.)
+You may enable and disable
+this ability by calling
+SConscriptChdir()
+multiple times.
+</para>
+
+<para>
+Example:
+</para>
+
+<example_commands>
+env = Environment()
+SConscriptChdir(0)
+SConscript('foo/SConscript') # will not chdir to foo
+env.SConscriptChdir(1)
+SConscript('bar/SConscript') # will chdir to bar
+</example_commands>
+</summary>
+</scons_function>
+
+<scons_function name="SConsignFile">
+<arguments>
+([file, dbm_module])
+</arguments>
+<summary>
+<para>
+This tells
+&scons;
+to store all file signatures
+in the specified database
+<varname>file</varname>.
+If the
+<varname>file</varname>
+name is omitted,
+<filename>.sconsign</filename>
+is used by default.
+(The actual file name(s) stored on disk
+may have an appropriated suffix appended
+by the
+<varname> dbm_module</varname>.)
+If
+<varname>file</varname>
+is not an absolute path name,
+the file is placed in the same directory as the top-level
+&SConstruct;
+file.
+</para>
+
+<para>
+If
+<varname>file</varname>
+is
+<literal>None</literal>,
+then
+&scons;
+will store file signatures
+in a separate
+<filename>.sconsign</filename>
+file in each directory,
+not in one global database file.
+(This was the default behavior
+prior to SCons 0.96.91 and 0.97.)
+</para>
+
+<para>
+The optional
+<varname>dbm_module</varname>
+argument can be used to specify
+which Python database module
+The default is to use a custom
+<filename>SCons.dblite</filename>
+module that uses pickled
+Python data structures,
+and which works on all Python versions.
+</para>
+
+<para>
+Examples:
+</para>
+
+<example_commands>
+# Explicitly stores signatures in ".sconsign.dblite"
+# in the top-level SConstruct directory (the
+# default behavior).
+SConsignFile()
+
+# Stores signatures in the file "etc/scons-signatures"
+# relative to the top-level SConstruct directory.
+SConsignFile("etc/scons-signatures")
+
+# Stores signatures in the specified absolute file name.
+SConsignFile("/home/me/SCons/signatures")
+
+# Stores signatures in a separate .sconsign file
+# in each directory.
+SConsignFile(None)
+</example_commands>
+</summary>
+</scons_function>
+
+<scons_function name="SetDefault">
+<arguments signature="env">
+(key=val, [...])
+</arguments>
+<summary>
+<para>
+Sets construction variables to default values specified with the keyword
+arguments if (and only if) the variables are not already set.
+The following statements are equivalent:
+</para>
+
+<example_commands>
+env.SetDefault(FOO = 'foo')
+
+if 'FOO' not in env: env['FOO'] = 'foo'
+</example_commands>
+</summary>
+</scons_function>
+
+<scons_function name="SideEffect">
+<arguments>
+(side_effect, target)
+</arguments>
+<summary>
+<para>
+Declares
+<varname>side_effect</varname>
+as a side effect of building
+<varname>target</varname>.
+Both
+<varname>side_effect</varname>
+and
+<varname>target</varname>
+can be a list, a file name, or a node.
+A side effect is a target file that is created or updated
+as a side effect of building other targets.
+For example, a Windows PDB
+file is created as a side effect of building the .obj
+files for a static library,
+and various log files are created updated
+as side effects of various TeX commands.
+If a target is a side effect of multiple build commands,
+&scons;
+will ensure that only one set of commands
+is executed at a time.
+Consequently, you only need to use this method
+for side-effect targets that are built as a result of
+multiple build commands.
+</para>
+
+<para>
+Because multiple build commands may update
+the same side effect file,
+by default the
+<varname>side_effect</varname>
+target is
+<emphasis>not</emphasis>
+automatically removed
+when the
+<varname>target</varname>
+is removed by the
+<option>-c</option>
+option.
+(Note, however, that the
+<varname>side_effect</varname>
+might be removed as part of
+cleaning the directory in which it lives.)
+If you want to make sure the
+<varname>side_effect</varname>
+is cleaned whenever a specific
+<varname>target</varname>
+is cleaned,
+you must specify this explicitly
+with the
+&f-link-Clean;
+or
+&f-env-Clean;
+function.
+</para>
+</summary>
+</scons_function>
+
+<scons_function name="SourceCode">
+<arguments>
+(entries, builder)
+</arguments>
+<summary>
+<para>
+This function and its associate factory functions are deprecated.
+There is no replacement.
+The intended use was to keep a local tree in sync with an archive,
+but in actuality the function only causes the archive
+to be fetched on the first run.
+Synchronizing with the archive is best done external to &SCons;.
+</para>
+
+<para>
+Arrange for non-existent source files to
+be fetched from a source code management system
+using the specified
+<varname>builder</varname>.
+The specified
+<varname>entries</varname>
+may be a Node, string or list of both,
+and may represent either individual
+source files or directories in which
+source files can be found.
+</para>
+
+<para>
+For any non-existent source files,
+&scons;
+will search up the directory tree
+and use the first
+&f-SourceCode;
+builder it finds.
+The specified
+<varname>builder</varname>
+may be
+<literal>None</literal>,
+in which case
+&scons;
+will not use a builder to fetch
+source files for the specified
+<varname>entries</varname>,
+even if a
+&f-SourceCode;
+builder has been specified
+for a directory higher up the tree.
+</para>
+
+<para>
+&scons;
+will, by default,
+fetch files from SCCS or RCS subdirectories
+without explicit configuration.
+This takes some extra processing time
+to search for the necessary
+source code management files on disk.
+You can avoid these extra searches
+and speed up your build a little
+by disabling these searches as follows:
+</para>
+
+<example_commands>
+env.SourceCode('.', None)
+</example_commands>
+
+<para>
+Note that if the specified
+<varname>builder</varname>
+is one you create by hand,
+it must have an associated
+construction environment to use
+when fetching a source file.
+</para>
+
+<para>
+&scons;
+provides a set of canned factory
+functions that return appropriate
+Builders for various popular
+source code management systems.
+Canonical examples of invocation include:
+</para>
+
+<example_commands>
+env.SourceCode('.', env.BitKeeper('/usr/local/BKsources'))
+env.SourceCode('src', env.CVS('/usr/local/CVSROOT'))
+env.SourceCode('/', env.RCS())
+env.SourceCode(['f1.c', 'f2.c'], env.SCCS())
+env.SourceCode('no_source.c', None)
+</example_commands>
+<para>
+<!-- env.SourceCode('.', env.Subversion('file:///usr/local/Subversion')) -->
+</para>
+</summary>
+</scons_function>
+
+<scons_function name="SourceSignatures">
+<arguments>
+(type)
+</arguments>
+<summary>
+<para>
+Note: Although it is not yet officially deprecated,
+use of this function is discouraged.
+See the
+&f-link-Decider;
+function for a more flexible and straightforward way
+to configure SCons' decision-making.
+</para>
+
+<para>
+The
+&f-SourceSignatures;
+function tells
+&scons;
+how to decide if a source file
+(a file that is not built from any other files)
+has changed since the last time it
+was used to build a particular target file.
+Legal values are
+<literal>MD5</literal>
+or
+<literal>timestamp</literal>.
+</para>
+
+<para>
+If the environment method is used,
+the specified type of source signature
+is only used when deciding whether targets
+built with that environment are up-to-date or must be rebuilt.
+If the global function is used,
+the specified type of source signature becomes the default
+used for all decisions
+about whether targets are up-to-date.
+</para>
+
+<para>
+<literal>MD5</literal>
+means
+&scons;
+decides that a source file has changed
+if the MD5 checksum of its contents has changed since
+the last time it was used to rebuild a particular target file.
+</para>
+
+<para>
+<literal>timestamp</literal>
+means
+&scons;
+decides that a source file has changed
+if its timestamp (modification time) has changed since
+the last time it was used to rebuild a particular target file.
+(Note that although this is similar to the behavior of Make,
+by default it will also rebuild if the dependency is
+<emphasis>older</emphasis>
+than the last time it was used to rebuild the target file.)
+</para>
+
+<para>
+There is no different between the two behaviors
+for Python
+&f-Value;
+node objects.
+</para>
+
+<para>
+<literal>MD5</literal>
+signatures take longer to compute,
+but are more accurate than
+<literal>timestamp</literal>
+signatures.
+The default value is
+<literal>MD5</literal>.
+</para>
+
+<para>
+Note that the default
+&f-link-TargetSignatures;
+setting (see below)
+is to use this
+&f-SourceSignatures;
+setting for any target files that are used
+to build other target files.
+Consequently, changing the value of
+&f-SourceSignatures;
+will, by default,
+affect the up-to-date decision for all files in the build
+(or all files built with a specific construction environment
+when
+&f-env-SourceSignatures;
+is used).
+</para>
+</summary>
+</scons_function>
+
+<scons_function name="Split">
+<arguments>
+(arg)
+</arguments>
+<summary>
+<para>
+Returns a list of file names or other objects.
+If arg is a string,
+it will be split on strings of white-space characters
+within the string,
+making it easier to write long lists of file names.
+If arg is already a list,
+the list will be returned untouched.
+If arg is any other type of object,
+it will be returned as a list
+containing just the object.
+</para>
+
+<para>
+Example:
+</para>
+
+<example_commands>
+files = Split("f1.c f2.c f3.c")
+files = env.Split("f4.c f5.c f6.c")
+files = Split("""
+ f7.c
+ f8.c
+ f9.c
+""")
+</example_commands>
+</summary>
+</scons_function>
+
+<scons_function name="subst">
+<arguments signature="env">
+(input, [raw, target, source, conv])
+</arguments>
+<summary>
+<para>
+Performs construction variable interpolation
+on the specified string or sequence argument
+<varname>input</varname>.
+</para>
+
+<para>
+By default,
+leading or trailing white space will
+be removed from the result.
+and all sequences of white space
+will be compressed to a single space character.
+Additionally, any
+<literal>$(</literal>
+and
+<literal>$)</literal>
+character sequences will be stripped from the returned string,
+The optional
+<varname>raw</varname>
+argument may be set to
+<literal>1</literal>
+if you want to preserve white space and
+<literal>$(</literal>-<literal>$)</literal>
+sequences.
+The
+<varname>raw</varname>
+argument may be set to
+<literal>2</literal>
+if you want to strip
+all characters between
+any
+<literal>$(</literal>
+and
+<literal>$)</literal>
+pairs
+(as is done for signature calculation).
+</para>
+
+<para>
+If the input is a sequence
+(list or tuple),
+the individual elements of
+the sequence will be expanded,
+and the results will be returned as a list.
+</para>
+
+<para>
+The optional
+<varname>target</varname>
+and
+<varname>source</varname>
+keyword arguments
+must be set to lists of
+target and source nodes, respectively,
+if you want the
+&cv-TARGET;,
+&cv-TARGETS;,
+&cv-SOURCE;
+and
+&cv-SOURCES;
+to be available for expansion.
+This is usually necessary if you are
+calling
+&f-env-subst;
+from within a Python function used
+as an SCons action.
+</para>
+
+<para>
+Returned string values or sequence elements
+are converted to their string representation by default.
+The optional
+<varname>conv</varname>
+argument
+may specify a conversion function
+that will be used in place of
+the default.
+For example, if you want Python objects
+(including SCons Nodes)
+to be returned as Python objects,
+you can use the Python
+&lambda;
+idiom to pass in an unnamed function
+that simply returns its unconverted argument.
+</para>
+
+<para>
+Example:
+</para>
+
+<example_commands>
+print env.subst("The C compiler is: $CC")
+
+def compile(target, source, env):
+ sourceDir = env.subst("${SOURCE.srcdir}",
+ target=target,
+ source=source)
+
+source_nodes = env.subst('$EXPAND_TO_NODELIST',
+ conv=lambda x: x)
+</example_commands>
+</summary>
+</scons_function>
+
+<scons_function name="TargetSignatures">
+<arguments>
+(type)
+</arguments>
+<summary>
+<para>
+Note: Although it is not yet officially deprecated,
+use of this function is discouraged.
+See the
+&f-link-Decider;
+function for a more flexible and straightforward way
+to configure SCons' decision-making.
+</para>
+
+<para>
+The
+&f-TargetSignatures;
+function tells
+&scons;
+how to decide if a target file
+(a file that
+<emphasis>is</emphasis>
+built from any other files)
+has changed since the last time it
+was used to build some other target file.
+Legal values are
+<literal>"build"</literal>;
+<literal>"content"</literal>
+(or its synonym
+<literal>"MD5"</literal>);
+<literal>"timestamp"</literal>;
+or
+<literal>"source"</literal>.
+</para>
+
+<para>
+If the environment method is used,
+the specified type of target signature is only used
+for targets built with that environment.
+If the global function is used,
+the specified type of signature becomes the default
+used for all target files that
+don't have an explicit target signature type
+specified for their environments.
+</para>
+
+<para>
+<literal>"content"</literal>
+(or its synonym
+<literal>"MD5"</literal>)
+means
+&scons;
+decides that a target file has changed
+if the MD5 checksum of its contents has changed since
+the last time it was used to rebuild some other target file.
+This means
+&scons;
+will open up
+MD5 sum the contents
+of target files after they're built,
+and may decide that it does not need to rebuild
+"downstream" target files if a file was
+rebuilt with exactly the same contents as the last time.
+</para>
+
+<para>
+<literal>"timestamp"</literal>
+means
+&scons;
+decides that a target file has changed
+if its timestamp (modification time) has changed since
+the last time it was used to rebuild some other target file.
+(Note that although this is similar to the behavior of Make,
+by default it will also rebuild if the dependency is
+<emphasis>older</emphasis>
+than the last time it was used to rebuild the target file.)
+</para>
+
+<para>
+<literal>"source"</literal>
+means
+&scons;
+decides that a target file has changed
+as specified by the corresponding
+&f-SourceSignatures;
+setting
+(<literal>"MD5"</literal>
+or
+<literal>"timestamp"</literal>).
+This means that
+&scons;
+will treat all input files to a target the same way,
+regardless of whether they are source files
+or have been built from other files.
+</para>
+
+<para>
+<literal>"build"</literal>
+means
+&scons;
+decides that a target file has changed
+if it has been rebuilt in this invocation
+or if its content or timestamp have changed
+as specified by the corresponding
+&f-SourceSignatures;
+setting.
+This "propagates" the status of a rebuilt file
+so that other "downstream" target files
+will always be rebuilt,
+even if the contents or the timestamp
+have not changed.
+</para>
+
+<para>
+<literal>"build"</literal>
+signatures are fastest because
+<literal>"content"</literal>
+(or
+<literal>"MD5"</literal>)
+signatures take longer to compute,
+but are more accurate than
+<literal>"timestamp"</literal>
+signatures,
+and can prevent unnecessary "downstream" rebuilds
+when a target file is rebuilt to the exact same contents
+as the previous build.
+The
+<literal>"source"</literal>
+setting provides the most consistent behavior
+when other target files may be rebuilt from
+both source and target input files.
+The default value is
+<literal>"source"</literal>.
+</para>
+
+<para>
+Because the default setting is
+<literal>"source"</literal>,
+using
+&f-SourceSignatures;
+is generally preferable to
+&f-TargetSignatures;,
+so that the up-to-date decision
+will be consistent for all files
+(or all files built with a specific construction environment).
+Use of
+&f-TargetSignatures;
+provides specific control for how built target files
+affect their "downstream" dependencies.
+</para>
+</summary>
+</scons_function>
+
+<scons_function name="Tool">
+<arguments>
+(string, [toolpath, **kw])
+</arguments>
+<summary>
+<para>
+The
+&f-Tool;
+form of the function
+returns a callable object
+that can be used to initialize
+a construction environment using the
+tools keyword of the Environment() method.
+The object may be called with a construction
+environment as an argument,
+in which case the object will
+add the necessary variables
+to the construction environment
+and the name of the tool will be added to the
+&cv-link-TOOLS;
+construction variable.
+</para>
+
+<para>
+Additional keyword arguments are passed to the tool's
+<function>generate</function>()
+method.
+</para>
+
+<para>
+Examples:
+</para>
+
+<example_commands>
+env = Environment(tools = [ Tool('msvc') ])
+
+env = Environment()
+t = Tool('msvc')
+t(env) # adds 'msvc' to the TOOLS variable
+u = Tool('opengl', toolpath = ['tools'])
+u(env) # adds 'opengl' to the TOOLS variable
+</example_commands>
+
+<para>
+The
+&f-env-Tool;
+form of the function
+applies the callable object for the specified tool
+<varname>string</varname>
+to the environment through which the method was called.
+</para>
+
+<para>
+Additional keyword arguments are passed to the tool's
+<function>generate</function>()
+method.
+</para>
+
+<example_commands>
+env.Tool('gcc')
+env.Tool('opengl', toolpath = ['build/tools'])
+</example_commands>
+</summary>
+</scons_function>
+
+<scons_function name="Value">
+<arguments>
+(value, [built_value])
+</arguments>
+<summary>
+<para>
+Returns a Node object representing the specified Python value. Value
+Nodes can be used as dependencies of targets. If the result of
+calling
+<function>str</function>(<varname>value</varname>)
+changes between SCons runs, any targets depending on
+<function>Value</function>(<varname>value</varname>)
+will be rebuilt.
+(This is true even when using timestamps to decide if
+files are up-to-date.)
+When using timestamp source signatures, Value Nodes'
+timestamps are equal to the system time when the Node is created.
+</para>
+
+<para>
+The returned Value Node object has a
+<function>write</function>()
+method that can be used to "build" a Value Node
+by setting a new value.
+The optional
+<varname>built_value</varname>
+argument can be specified
+when the Value Node is created
+to indicate the Node should already be considered
+"built."
+There is a corresponding
+<function>read</function>()
+method that will return the built value of the Node.
+</para>
+
+<para>
+Examples:
+</para>
+
+<example_commands>
+env = Environment()
+
+def create(target, source, env):
+ # A function that will write a 'prefix=$SOURCE'
+ # string into the file name specified as the
+ # $TARGET.
+ f = open(str(target[0]), 'wb')
+ f.write('prefix=' + source[0].get_contents())
+
+# Fetch the prefix= argument, if any, from the command
+# line, and use /usr/local as the default.
+prefix = ARGUMENTS.get('prefix', '/usr/local')
+
+# Attach a .Config() builder for the above function action
+# to the construction environment.
+env['BUILDERS']['Config'] = Builder(action = create)
+env.Config(target = 'package-config', source = Value(prefix))
+
+def build_value(target, source, env):
+ # A function that "builds" a Python Value by updating
+ # the the Python value with the contents of the file
+ # specified as the source of the Builder call ($SOURCE).
+ target[0].write(source[0].get_contents())
+
+output = env.Value('before')
+input = env.Value('after')
+
+# Attach a .UpdateValue() builder for the above function
+# action to the construction environment.
+env['BUILDERS']['UpdateValue'] = Builder(action = build_value)
+env.UpdateValue(target = Value(output), source = Value(input))
+</example_commands>
+</summary>
+</scons_function>
+
+<scons_function name="VariantDir">
+<arguments>
+(variant_dir, src_dir, [duplicate])
+</arguments>
+<summary>
+<para>
+Use the
+&f-VariantDir;
+function to create a copy of your sources in another location:
+if a name under
+<varname>variant_dir</varname>
+is not found but exists under
+<varname>src_dir</varname>,
+the file or directory is copied to
+<varname>variant_dir</varname>.
+Target files can be built in a different directory
+than the original sources by simply refering to the sources (and targets)
+within the variant tree.
+</para>
+
+<para>
+&f-VariantDir;
+can be called multiple times with the same
+<varname>src_dir</varname>
+to set up multiple builds with different options
+(<varname>variants</varname>).
+The
+<varname>src_dir</varname>
+location must be in or underneath the SConstruct file's directory, and
+<varname>variant_dir</varname>
+may not be underneath
+<varname>src_dir</varname>.
+<!--
+TODO: Can the above restrictions be clarified or relaxed?
+TODO: The latter restriction is clearly not completely right;
+TODO: src_dir = '.' works fine with a build dir under it.
+-->
+</para>
+
+<para>
+The default behavior is for
+&scons;
+to physically duplicate the source files in the variant tree.
+Thus, a build performed in the variant tree is guaranteed to be identical
+to a build performed in the source tree even if
+intermediate source files are generated during the build,
+or preprocessors or other scanners search for included files
+relative to the source file,
+or individual compilers or other invoked tools are hard-coded
+to put derived files in the same directory as source files.
+</para>
+
+<para>
+If possible on the platform,
+the duplication is performed by linking rather than copying;
+see also the
+<option>--duplicate</option>
+command-line option.
+Moreover, only the files needed for the build are duplicated;
+files and directories that are not used are not present in
+<varname>variant_dir</varname>.
+</para>
+
+<para>
+Duplicating the source tree may be disabled by setting the
+<literal>duplicate</literal>
+argument to
+<literal>0</literal>
+(zero).
+This will cause
+&scons;
+to invoke Builders using the path names of source files in
+<varname>src_dir</varname>
+and the path names of derived files within
+<varname>variant_dir</varname>.
+This is always more efficient than
+<literal>duplicate=1</literal>,
+and is usually safe for most builds
+(but see above for cases that may cause problems).
+</para>
+
+<para>
+Note that
+&f-VariantDir;
+works most naturally with a subsidiary SConscript file.
+However, you would then call the subsidiary SConscript file
+not in the source directory, but in the
+<varname>variant_dir</varname>,
+regardless of the value of
+<literal>duplicate</literal>.
+This is how you tell
+&scons;
+which variant of a source tree to build:
+</para>
+
+<example_commands>
+# run src/SConscript in two variant directories
+VariantDir('build/variant1', 'src')
+SConscript('build/variant1/SConscript')
+VariantDir('build/variant2', 'src')
+SConscript('build/variant2/SConscript')
+</example_commands>
+
+<para>
+See also the
+&f-link-SConscript;
+function, described above,
+for another way to specify a variant directory
+in conjunction with calling a subsidiary SConscript file.
+</para>
+
+<para>
+Examples:
+</para>
+
+<example_commands>
+# use names in the build directory, not the source directory
+VariantDir('build', 'src', duplicate=0)
+Program('build/prog', 'build/source.c')
+</example_commands>
+
+<example_commands>
+# this builds both the source and docs in a separate subtree
+VariantDir('build', '.', duplicate=0)
+SConscript(dirs=['build/src','build/doc'])
+</example_commands>
+
+<example_commands>
+# same as previous example, but only uses SConscript
+SConscript(dirs='src', variant_dir='build/src', duplicate=0)
+SConscript(dirs='doc', variant_dir='build/doc', duplicate=0)
+</example_commands>
+</summary>
+</scons_function>
+
+<scons_function name="WhereIs">
+<arguments>
+(program, [path, pathext, reject])
+</arguments>
+<summary>
+<para>
+Searches for the specified executable
+<varname>program</varname>,
+returning the full path name to the program
+if it is found,
+and returning None if not.
+Searches the specified
+<varname>path</varname>,
+the value of the calling environment's PATH
+(<literal>env['ENV']['PATH']</literal>),
+or the user's current external PATH
+(<literal>os.environ['PATH']</literal>)
+by default.
+On Windows systems, searches for executable
+programs with any of the file extensions
+listed in the specified
+<varname>pathext</varname>,
+the calling environment's PATHEXT
+(<literal>env['ENV']['PATHEXT']</literal>)
+or the user's current PATHEXT
+(<literal>os.environ['PATHEXT']</literal>)
+by default.
+Will not select any
+path name or names
+in the specified
+<varname>reject</varname>
+list, if any.
+</para>
+</summary>
+</scons_function>
+
+</sconsdoc>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/EnvironmentTests.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/EnvironmentTests.py
new file mode 100644
index 0000000..229858f
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/EnvironmentTests.py
@@ -0,0 +1,3992 @@
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+from __future__ import print_function
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import SCons.compat
+
+import copy
+import io
+import os
+import sys
+import unittest
+from collections import UserDict as UD, UserList as UL
+
+import TestCmd
+import TestUnit
+
+from SCons.Environment import *
+import SCons.Warnings
+
+def diff_env(env1, env2):
+ s1 = "env1 = {\n"
+ s2 = "env2 = {\n"
+ d = {}
+ for k in list(env1._dict.keys()) + list(env2._dict.keys()):
+ d[k] = None
+ for k in sorted(d.keys()):
+ if k in env1:
+ if k in env2:
+ if env1[k] != env2[k]:
+ s1 = s1 + " " + repr(k) + " : " + repr(env1[k]) + "\n"
+ s2 = s2 + " " + repr(k) + " : " + repr(env2[k]) + "\n"
+ else:
+ s1 = s1 + " " + repr(k) + " : " + repr(env1[k]) + "\n"
+ elif k in env2:
+ s2 = s2 + " " + repr(k) + " : " + repr(env2[k]) + "\n"
+ s1 = s1 + "}\n"
+ s2 = s2 + "}\n"
+ return s1 + s2
+
+def diff_dict(d1, d2):
+ s1 = "d1 = {\n"
+ s2 = "d2 = {\n"
+ d = {}
+ for k in list(d1.keys()) + list(d2.keys()):
+ d[k] = None
+ for k in sorted(d.keys()):
+ if k in d1:
+ if k in d2:
+ if d1[k] != d2[k]:
+ s1 = s1 + " " + repr(k) + " : " + repr(d1[k]) + "\n"
+ s2 = s2 + " " + repr(k) + " : " + repr(d2[k]) + "\n"
+ else:
+ s1 = s1 + " " + repr(k) + " : " + repr(d1[k]) + "\n"
+ elif k in env2:
+ s2 = s2 + " " + repr(k) + " : " + repr(d2[k]) + "\n"
+ s1 = s1 + "}\n"
+ s2 = s2 + "}\n"
+ return s1 + s2
+
+called_it = {}
+built_it = {}
+
+class Builder(SCons.Builder.BuilderBase):
+ """A dummy Builder class for testing purposes. "Building"
+ a target is simply setting a value in the dictionary.
+ """
+ def __init__(self, name = None):
+ self.name = name
+
+ def __call__(self, env, target=None, source=None, **kw):
+ global called_it
+ called_it['target'] = target
+ called_it['source'] = source
+ called_it.update(kw)
+
+ def execute(self, target = None, **kw):
+ global built_it
+ built_it[target] = 1
+
+
+
+scanned_it = {}
+
+class Scanner(object):
+ """A dummy Scanner class for testing purposes. "Scanning"
+ a target is simply setting a value in the dictionary.
+ """
+ def __init__(self, name, skeys=[]):
+ self.name = name
+ self.skeys = skeys
+
+ def __call__(self, filename):
+ global scanned_it
+ scanned_it[filename] = 1
+
+ def __eq__(self, other):
+ try:
+ return self.__dict__ == other.__dict__
+ except AttributeError:
+ return False
+
+ def get_skeys(self, env):
+ return self.skeys
+
+ def __str__(self):
+ return self.name
+
+
+
+class CLVar(UL):
+ def __init__(self, seq):
+ if isinstance(seq, str):
+ seq = seq.split()
+ UL.__init__(self, seq)
+ def __add__(self, other):
+ return UL.__add__(self, CLVar(other))
+ def __radd__(self, other):
+ return UL.__radd__(self, CLVar(other))
+ def __coerce__(self, other):
+ return (self, CLVar(other))
+
+
+
+class DummyNode(object):
+ def __init__(self, name):
+ self.name = name
+ def __str__(self):
+ return self.name
+ def rfile(self):
+ return self
+ def get_subst_proxy(self):
+ return self
+
+def test_tool( env ):
+ env['_F77INCFLAGS'] = '$( ${_concat(INCPREFIX, F77PATH, INCSUFFIX, __env__, RDirs, TARGET, SOURCE)} $)'
+
+class TestEnvironmentFixture(object):
+ def TestEnvironment(self, *args, **kw):
+ if not kw or 'tools' not in kw:
+ kw['tools'] = [test_tool]
+ default_keys = { 'CC' : 'cc',
+ 'CCFLAGS' : '-DNDEBUG',
+ 'ENV' : { 'TMP' : '/tmp' } }
+ for key, value in default_keys.items():
+ if key not in kw:
+ kw[key] = value
+ if 'BUILDERS' not in kw:
+ static_obj = SCons.Builder.Builder(action = {},
+ emitter = {},
+ suffix = '.o',
+ single_source = 1)
+ kw['BUILDERS'] = {'Object' : static_obj}
+ static_obj.add_action('.cpp', 'fake action')
+
+ env = Environment(*args, **kw)
+ return env
+
+class SubstitutionTestCase(unittest.TestCase):
+
+ def test___init__(self):
+ """Test initializing a SubstitutionEnvironment
+ """
+ env = SubstitutionEnvironment()
+ assert '__env__' not in env
+
+ def test___cmp__(self):
+ """Test comparing SubstitutionEnvironments
+ """
+
+ env1 = SubstitutionEnvironment(XXX = 'x')
+ env2 = SubstitutionEnvironment(XXX = 'x')
+ env3 = SubstitutionEnvironment(XXX = 'xxx')
+ env4 = SubstitutionEnvironment(XXX = 'x', YYY = 'x')
+
+ assert env1 == env2
+ assert env1 != env3
+ assert env1 != env4
+
+ def test___delitem__(self):
+ """Test deleting a variable from a SubstitutionEnvironment
+ """
+ env1 = SubstitutionEnvironment(XXX = 'x', YYY = 'y')
+ env2 = SubstitutionEnvironment(XXX = 'x')
+ del env1['YYY']
+ assert env1 == env2
+
+ def test___getitem__(self):
+ """Test fetching a variable from a SubstitutionEnvironment
+ """
+ env = SubstitutionEnvironment(XXX = 'x')
+ assert env['XXX'] == 'x', env['XXX']
+
+ def test___setitem__(self):
+ """Test setting a variable in a SubstitutionEnvironment
+ """
+ env1 = SubstitutionEnvironment(XXX = 'x')
+ env2 = SubstitutionEnvironment(XXX = 'x', YYY = 'y')
+ env1['YYY'] = 'y'
+ assert env1 == env2
+
+ def test_get(self):
+ """Test the SubstitutionEnvironment get() method
+ """
+ env = SubstitutionEnvironment(XXX = 'x')
+ assert env.get('XXX') == 'x', env.get('XXX')
+ assert env.get('YYY') is None, env.get('YYY')
+
+ def test_has_key(self):
+ """Test the SubstitutionEnvironment has_key() method
+ """
+ env = SubstitutionEnvironment(XXX = 'x')
+ assert 'XXX' in env
+ assert 'YYY' not in env
+
+ def test_contains(self):
+ """Test the SubstitutionEnvironment __contains__() method
+ """
+ env = SubstitutionEnvironment(XXX = 'x')
+ assert 'XXX' in env
+ assert not 'YYY' in env
+
+ def test_items(self):
+ """Test the SubstitutionEnvironment items() method
+ """
+ env = SubstitutionEnvironment(XXX = 'x', YYY = 'y')
+ items = list(env.items())
+ assert len(items) == 2 and ('XXX','x') in items and ('YYY','y') in items, items
+ # Was. This fails under py3 as order changes
+ # assert items == [('XXX','x'), ('YYY','y')], items
+
+ def test_arg2nodes(self):
+ """Test the arg2nodes method
+ """
+ env = SubstitutionEnvironment()
+ dict = {}
+ class X(SCons.Node.Node):
+ pass
+ def Factory(name, directory = None, create = 1, dict=dict, X=X):
+ if name not in dict:
+ dict[name] = X()
+ dict[name].name = name
+ return dict[name]
+
+ nodes = env.arg2nodes("Util.py UtilTests.py", Factory)
+ assert len(nodes) == 1, nodes
+ assert isinstance(nodes[0], X)
+ assert nodes[0].name == "Util.py UtilTests.py"
+
+ nodes = env.arg2nodes(u"Util.py UtilTests.py", Factory)
+ assert len(nodes) == 1, nodes
+ assert isinstance(nodes[0], X)
+ assert nodes[0].name == u"Util.py UtilTests.py"
+
+ nodes = env.arg2nodes(["Util.py", "UtilTests.py"], Factory)
+ assert len(nodes) == 2, nodes
+ assert isinstance(nodes[0], X)
+ assert isinstance(nodes[1], X)
+ assert nodes[0].name == "Util.py"
+ assert nodes[1].name == "UtilTests.py"
+
+ n1 = Factory("Util.py")
+ nodes = env.arg2nodes([n1, "UtilTests.py"], Factory)
+ assert len(nodes) == 2, nodes
+ assert isinstance(nodes[0], X)
+ assert isinstance(nodes[1], X)
+ assert nodes[0].name == "Util.py"
+ assert nodes[1].name == "UtilTests.py"
+
+ class SConsNode(SCons.Node.Node):
+ pass
+ nodes = env.arg2nodes(SConsNode())
+ assert len(nodes) == 1, nodes
+ assert isinstance(nodes[0], SConsNode), node
+
+ class OtherNode(object):
+ pass
+ nodes = env.arg2nodes(OtherNode())
+ assert len(nodes) == 1, nodes
+ assert isinstance(nodes[0], OtherNode), node
+
+ def lookup_a(str, F=Factory):
+ if str[0] == 'a':
+ n = F(str)
+ n.a = 1
+ return n
+ else:
+ return None
+
+ def lookup_b(str, F=Factory):
+ if str[0] == 'b':
+ n = F(str)
+ n.b = 1
+ return n
+ else:
+ return None
+
+ env_ll = SubstitutionEnvironment()
+ env_ll.lookup_list = [lookup_a, lookup_b]
+
+ nodes = env_ll.arg2nodes(['aaa', 'bbb', 'ccc'], Factory)
+ assert len(nodes) == 3, nodes
+
+ assert nodes[0].name == 'aaa', nodes[0]
+ assert nodes[0].a == 1, nodes[0]
+ assert not hasattr(nodes[0], 'b'), nodes[0]
+
+ assert nodes[1].name == 'bbb'
+ assert not hasattr(nodes[1], 'a'), nodes[1]
+ assert nodes[1].b == 1, nodes[1]
+
+ assert nodes[2].name == 'ccc'
+ assert not hasattr(nodes[2], 'a'), nodes[1]
+ assert not hasattr(nodes[2], 'b'), nodes[1]
+
+ def lookup_bbbb(str, F=Factory):
+ if str == 'bbbb':
+ n = F(str)
+ n.bbbb = 1
+ return n
+ else:
+ return None
+
+ def lookup_c(str, F=Factory):
+ if str[0] == 'c':
+ n = F(str)
+ n.c = 1
+ return n
+ else:
+ return None
+
+ nodes = env.arg2nodes(['bbbb', 'ccc'], Factory,
+ [lookup_c, lookup_bbbb, lookup_b])
+ assert len(nodes) == 2, nodes
+
+ assert nodes[0].name == 'bbbb'
+ assert not hasattr(nodes[0], 'a'), nodes[1]
+ assert not hasattr(nodes[0], 'b'), nodes[1]
+ assert nodes[0].bbbb == 1, nodes[1]
+ assert not hasattr(nodes[0], 'c'), nodes[0]
+
+ assert nodes[1].name == 'ccc'
+ assert not hasattr(nodes[1], 'a'), nodes[1]
+ assert not hasattr(nodes[1], 'b'), nodes[1]
+ assert not hasattr(nodes[1], 'bbbb'), nodes[0]
+ assert nodes[1].c == 1, nodes[1]
+
+ def test_arg2nodes_target_source(self):
+ """Test the arg2nodes method with target= and source= keywords
+ """
+ targets = [DummyNode('t1'), DummyNode('t2')]
+ sources = [DummyNode('s1'), DummyNode('s2')]
+ env = SubstitutionEnvironment()
+ nodes = env.arg2nodes(['${TARGET}-a',
+ '${SOURCE}-b',
+ '${TARGETS[1]}-c',
+ '${SOURCES[1]}-d'],
+ DummyNode,
+ target=targets,
+ source=sources)
+ names = [n.name for n in nodes]
+ assert names == ['t1-a', 's1-b', 't2-c', 's2-d'], names
+
+ def test_gvars(self):
+ """Test the base class gvars() method"""
+ env = SubstitutionEnvironment()
+ gvars = env.gvars()
+ assert gvars == {}, gvars
+
+ def test_lvars(self):
+ """Test the base class lvars() method"""
+ env = SubstitutionEnvironment()
+ lvars = env.lvars()
+ assert lvars == {}, lvars
+
+ def test_subst(self):
+ """Test substituting construction variables within strings
+
+ Check various combinations, including recursive expansion
+ of variables into other variables.
+ """
+ env = SubstitutionEnvironment(AAA = 'a', BBB = 'b')
+ mystr = env.subst("$AAA ${AAA}A $BBBB $BBB")
+ assert mystr == "a aA b", mystr
+
+ # Changed the tests below to reflect a bug fix in
+ # subst()
+ env = SubstitutionEnvironment(AAA = '$BBB', BBB = 'b', BBBA = 'foo')
+ mystr = env.subst("$AAA ${AAA}A ${AAA}B $BBB")
+ assert mystr == "b bA bB b", mystr
+
+ env = SubstitutionEnvironment(AAA = '$BBB', BBB = '$CCC', CCC = 'c')
+ mystr = env.subst("$AAA ${AAA}A ${AAA}B $BBB")
+ assert mystr == "c cA cB c", mystr
+
+ # Lists:
+ env = SubstitutionEnvironment(AAA = ['a', 'aa', 'aaa'])
+ mystr = env.subst("$AAA")
+ assert mystr == "a aa aaa", mystr
+
+ # Tuples:
+ env = SubstitutionEnvironment(AAA = ('a', 'aa', 'aaa'))
+ mystr = env.subst("$AAA")
+ assert mystr == "a aa aaa", mystr
+
+ t1 = DummyNode('t1')
+ t2 = DummyNode('t2')
+ s1 = DummyNode('s1')
+ s2 = DummyNode('s2')
+
+ env = SubstitutionEnvironment(AAA = 'aaa')
+ s = env.subst('$AAA $TARGET $SOURCES', target=[t1, t2], source=[s1, s2])
+ assert s == "aaa t1 s1 s2", s
+ s = env.subst('$AAA $TARGETS $SOURCE', target=[t1, t2], source=[s1, s2])
+ assert s == "aaa t1 t2 s1", s
+
+ # Test callables in the SubstitutionEnvironment
+ def foo(target, source, env, for_signature):
+ assert str(target) == 't', target
+ assert str(source) == 's', source
+ return env["FOO"]
+
+ env = SubstitutionEnvironment(BAR=foo, FOO='baz')
+ t = DummyNode('t')
+ s = DummyNode('s')
+
+ subst = env.subst('test $BAR', target=t, source=s)
+ assert subst == 'test baz', subst
+
+ # Test not calling callables in the SubstitutionEnvironment
+ if 0:
+ # This will take some serious surgery to subst() and
+ # subst_list(), so just leave these tests out until we can
+ # do that.
+ def bar(arg):
+ pass
+
+ env = SubstitutionEnvironment(BAR=bar, FOO='$BAR')
+
+ subst = env.subst('$BAR', call=None)
+ assert subst is bar, subst
+
+ subst = env.subst('$FOO', call=None)
+ assert subst is bar, subst
+
+ def test_subst_kw(self):
+ """Test substituting construction variables within dictionaries"""
+ env = SubstitutionEnvironment(AAA = 'a', BBB = 'b')
+ kw = env.subst_kw({'$AAA' : 'aaa', 'bbb' : '$BBB'})
+ assert len(kw) == 2, kw
+ assert kw['a'] == 'aaa', kw['a']
+ assert kw['bbb'] == 'b', kw['bbb']
+
+ def test_subst_list(self):
+ """Test substituting construction variables in command lists
+ """
+ env = SubstitutionEnvironment(AAA = 'a', BBB = 'b')
+ l = env.subst_list("$AAA ${AAA}A $BBBB $BBB")
+ assert l == [["a", "aA", "b"]], l
+
+ # Changed the tests below to reflect a bug fix in
+ # subst()
+ env = SubstitutionEnvironment(AAA = '$BBB', BBB = 'b', BBBA = 'foo')
+ l = env.subst_list("$AAA ${AAA}A ${AAA}B $BBB")
+ assert l == [["b", "bA", "bB", "b"]], l
+
+ env = SubstitutionEnvironment(AAA = '$BBB', BBB = '$CCC', CCC = 'c')
+ l = env.subst_list("$AAA ${AAA}A ${AAA}B $BBB")
+ assert l == [["c", "cA", "cB", "c"]], mystr
+
+ env = SubstitutionEnvironment(AAA = '$BBB', BBB = '$CCC', CCC = [ 'a', 'b\nc' ])
+ lst = env.subst_list([ "$AAA", "B $CCC" ])
+ assert lst == [[ "a", "b"], ["c", "B a", "b"], ["c"]], lst
+
+ t1 = DummyNode('t1')
+ t2 = DummyNode('t2')
+ s1 = DummyNode('s1')
+ s2 = DummyNode('s2')
+
+ env = SubstitutionEnvironment(AAA = 'aaa')
+ s = env.subst_list('$AAA $TARGET $SOURCES', target=[t1, t2], source=[s1, s2])
+ assert s == [["aaa", "t1", "s1", "s2"]], s
+ s = env.subst_list('$AAA $TARGETS $SOURCE', target=[t1, t2], source=[s1, s2])
+ assert s == [["aaa", "t1", "t2", "s1"]], s
+
+ # Test callables in the SubstitutionEnvironment
+ def foo(target, source, env, for_signature):
+ assert str(target) == 't', target
+ assert str(source) == 's', source
+ return env["FOO"]
+
+ env = SubstitutionEnvironment(BAR=foo, FOO='baz')
+ t = DummyNode('t')
+ s = DummyNode('s')
+
+ lst = env.subst_list('test $BAR', target=t, source=s)
+ assert lst == [['test', 'baz']], lst
+
+ # Test not calling callables in the SubstitutionEnvironment
+ if 0:
+ # This will take some serious surgery to subst() and
+ # subst_list(), so just leave these tests out until we can
+ # do that.
+ def bar(arg):
+ pass
+
+ env = SubstitutionEnvironment(BAR=bar, FOO='$BAR')
+
+ subst = env.subst_list('$BAR', call=None)
+ assert subst is bar, subst
+
+ subst = env.subst_list('$FOO', call=None)
+ assert subst is bar, subst
+
+ def test_subst_path(self):
+ """Test substituting a path list
+ """
+ class MyProxy(object):
+ def __init__(self, val):
+ self.val = val
+ def get(self):
+ return self.val + '-proxy'
+
+ class MyNode(object):
+ def __init__(self, val):
+ self.val = val
+ def get_subst_proxy(self):
+ return self
+ def __str__(self):
+ return self.val
+
+ class MyObj(object):
+ def get(self):
+ return self
+
+ env = SubstitutionEnvironment(FOO='foo',
+ BAR='bar',
+ LIST=['one', 'two'],
+ PROXY=MyProxy('my1'))
+
+ r = env.subst_path('$FOO')
+ assert r == ['foo'], r
+
+ r = env.subst_path(['$FOO', 'xxx', '$BAR'])
+ assert r == ['foo', 'xxx', 'bar'], r
+
+ r = env.subst_path(['$FOO', '$LIST', '$BAR'])
+ assert list(map(str, r)) == ['foo', 'one two', 'bar'], r
+
+ r = env.subst_path(['$FOO', '$TARGET', '$SOURCE', '$BAR'])
+ assert r == ['foo', '', '', 'bar'], r
+
+ r = env.subst_path(['$FOO', '$TARGET', '$BAR'], target=MyNode('ttt'))
+ assert list(map(str, r)) == ['foo', 'ttt', 'bar'], r
+
+ r = env.subst_path(['$FOO', '$SOURCE', '$BAR'], source=MyNode('sss'))
+ assert list(map(str, r)) == ['foo', 'sss', 'bar'], r
+
+ n = MyObj()
+
+ r = env.subst_path(['$PROXY', MyProxy('my2'), n])
+ assert r == ['my1-proxy', 'my2-proxy', n], r
+
+ class StringableObj(object):
+ def __init__(self, s):
+ self.s = s
+ def __str__(self):
+ return self.s
+
+ env = SubstitutionEnvironment(FOO=StringableObj("foo"),
+ BAR=StringableObj("bar"))
+
+ r = env.subst_path([ "${FOO}/bar", "${BAR}/baz" ])
+ assert r == [ "foo/bar", "bar/baz" ], r
+
+ r = env.subst_path([ "bar/${FOO}", "baz/${BAR}" ])
+ assert r == [ "bar/foo", "baz/bar" ], r
+
+ r = env.subst_path([ "bar/${FOO}/bar", "baz/${BAR}/baz" ])
+ assert r == [ "bar/foo/bar", "baz/bar/baz" ], r
+
+ def test_subst_target_source(self):
+ """Test the base environment subst_target_source() method"""
+ env = SubstitutionEnvironment(AAA = 'a', BBB = 'b')
+ mystr = env.subst_target_source("$AAA ${AAA}A $BBBB $BBB")
+ assert mystr == "a aA b", mystr
+
+ def test_backtick(self):
+ """Test the backtick() method for capturing command output"""
+ env = SubstitutionEnvironment()
+
+ test = TestCmd.TestCmd(workdir = '')
+ test.write('stdout.py', """\
+import sys
+sys.stdout.write('this came from stdout.py\\n')
+sys.exit(0)
+""")
+ test.write('stderr.py', """\
+import sys
+sys.stderr.write('this came from stderr.py\\n')
+sys.exit(0)
+""")
+ test.write('fail.py', """\
+import sys
+sys.exit(1)
+""")
+ test.write('echo.py', """\
+import os, sys
+sys.stdout.write(os.environ['ECHO'] + '\\n')
+sys.exit(0)
+""")
+
+ save_stderr = sys.stderr
+
+ python = '"' + sys.executable + '"'
+
+ try:
+ sys.stderr = io.StringIO()
+ cmd = '%s %s' % (python, test.workpath('stdout.py'))
+ output = env.backtick(cmd)
+ errout = sys.stderr.getvalue()
+ assert output == 'this came from stdout.py\n', output
+ assert errout == '', errout
+
+ sys.stderr = io.StringIO()
+ cmd = '%s %s' % (python, test.workpath('stderr.py'))
+ output = env.backtick(cmd)
+ errout = sys.stderr.getvalue()
+ assert output == '', output
+ assert errout == 'this came from stderr.py\n', errout
+
+ sys.stderr = io.StringIO()
+ cmd = '%s %s' % (python, test.workpath('fail.py'))
+ try:
+ env.backtick(cmd)
+ except OSError as e:
+ assert str(e) == "'%s' exited 1" % cmd, str(e)
+ else:
+ self.fail("did not catch expected OSError")
+
+ sys.stderr = io.StringIO()
+ cmd = '%s %s' % (python, test.workpath('echo.py'))
+ env['ENV'] = os.environ.copy()
+ env['ENV']['ECHO'] = 'this came from ECHO'
+ output = env.backtick(cmd)
+ errout = sys.stderr.getvalue()
+ assert output == 'this came from ECHO\n', output
+ assert errout == '', errout
+
+ finally:
+ sys.stderr = save_stderr
+
+ def test_AddMethod(self):
+ """Test the AddMethod() method"""
+ env = SubstitutionEnvironment(FOO = 'foo')
+
+ def func(self):
+ return 'func-' + self['FOO']
+
+ assert not hasattr(env, 'func')
+ env.AddMethod(func)
+ r = env.func()
+ assert r == 'func-foo', r
+
+ assert not hasattr(env, 'bar')
+ env.AddMethod(func, 'bar')
+ r = env.bar()
+ assert r == 'func-foo', r
+
+ def func2(self, arg=''):
+ return 'func2-' + self['FOO'] + arg
+
+ env.AddMethod(func2)
+ r = env.func2()
+ assert r == 'func2-foo', r
+ r = env.func2('-xxx')
+ assert r == 'func2-foo-xxx', r
+
+ env.AddMethod(func2, 'func')
+ r = env.func()
+ assert r == 'func2-foo', r
+ r = env.func('-yyy')
+ assert r == 'func2-foo-yyy', r
+
+ # Test that clones of clones correctly re-bind added methods.
+ env1 = Environment(FOO = '1')
+ env1.AddMethod(func2)
+ env2 = env1.Clone(FOO = '2')
+ env3 = env2.Clone(FOO = '3')
+ env4 = env3.Clone(FOO = '4')
+ r = env1.func2()
+ assert r == 'func2-1', r
+ r = env2.func2()
+ assert r == 'func2-2', r
+ r = env3.func2()
+ assert r == 'func2-3', r
+ r = env4.func2()
+ assert r == 'func2-4', r
+
+ # Test that clones don't re-bind an attribute that the user
+ env1 = Environment(FOO = '1')
+ env1.AddMethod(func2)
+ def replace_func2():
+ return 'replace_func2'
+ env1.func2 = replace_func2
+ env2 = env1.Clone(FOO = '2')
+ r = env2.func2()
+ assert r == 'replace_func2', r
+
+ def test_Override(self):
+ "Test overriding construction variables"
+ env = SubstitutionEnvironment(ONE=1, TWO=2, THREE=3, FOUR=4)
+ assert env['ONE'] == 1, env['ONE']
+ assert env['TWO'] == 2, env['TWO']
+ assert env['THREE'] == 3, env['THREE']
+ assert env['FOUR'] == 4, env['FOUR']
+
+ env2 = env.Override({'TWO' : '10',
+ 'THREE' :'x $THREE y',
+ 'FOUR' : ['x', '$FOUR', 'y']})
+ assert env2['ONE'] == 1, env2['ONE']
+ assert env2['TWO'] == '10', env2['TWO']
+ assert env2['THREE'] == 'x 3 y', env2['THREE']
+ assert env2['FOUR'] == ['x', 4, 'y'], env2['FOUR']
+
+ assert env['ONE'] == 1, env['ONE']
+ assert env['TWO'] == 2, env['TWO']
+ assert env['THREE'] == 3, env['THREE']
+ assert env['FOUR'] == 4, env['FOUR']
+
+ env2.Replace(ONE = "won")
+ assert env2['ONE'] == "won", env2['ONE']
+ assert env['ONE'] == 1, env['ONE']
+
+ def test_ParseFlags(self):
+ """Test the ParseFlags() method
+ """
+ env = SubstitutionEnvironment()
+
+ empty = {
+ 'ASFLAGS' : [],
+ 'CFLAGS' : [],
+ 'CCFLAGS' : [],
+ 'CXXFLAGS' : [],
+ 'CPPDEFINES' : [],
+ 'CPPFLAGS' : [],
+ 'CPPPATH' : [],
+ 'FRAMEWORKPATH' : [],
+ 'FRAMEWORKS' : [],
+ 'LIBPATH' : [],
+ 'LIBS' : [],
+ 'LINKFLAGS' : [],
+ 'RPATH' : [],
+ }
+
+ d = env.ParseFlags(None)
+ assert d == empty, d
+
+ d = env.ParseFlags('')
+ assert d == empty, d
+
+ d = env.ParseFlags([])
+ assert d == empty, d
+
+ s = "-I/usr/include/fum -I bar -X\n" + \
+ '-I"C:\\Program Files\\ASCEND\\include" ' + \
+ "-L/usr/fax -L foo -lxxx -l yyy " + \
+ '-L"C:\\Program Files\\ASCEND" -lascend ' + \
+ "-Wa,-as -Wl,-link " + \
+ "-Wl,-rpath=rpath1 " + \
+ "-Wl,-R,rpath2 " + \
+ "-Wl,-Rrpath3 " + \
+ "-Wp,-cpp " + \
+ "-std=c99 " + \
+ "-std=c++0x " + \
+ "-framework Carbon " + \
+ "-frameworkdir=fwd1 " + \
+ "-Ffwd2 " + \
+ "-F fwd3 " + \
+ "-dylib_file foo-dylib " + \
+ "-pthread " + \
+ "-fopenmp " + \
+ "-mno-cygwin -mwindows " + \
+ "-arch i386 -isysroot /tmp " + \
+ "-isystem /usr/include/foo " + \
+ "+DD64 " + \
+ "-DFOO -DBAR=value -D BAZ "
+
+ d = env.ParseFlags(s)
+
+ assert d['ASFLAGS'] == ['-as'], d['ASFLAGS']
+ assert d['CFLAGS'] == ['-std=c99']
+ assert d['CCFLAGS'] == ['-X', '-Wa,-as',
+ '-pthread', '-fopenmp', '-mno-cygwin',
+ ('-arch', 'i386'), ('-isysroot', '/tmp'),
+ ('-isystem', '/usr/include/foo'),
+ '+DD64'], repr(d['CCFLAGS'])
+ assert d['CXXFLAGS'] == ['-std=c++0x'], repr(d['CXXFLAGS'])
+ assert d['CPPDEFINES'] == ['FOO', ['BAR', 'value'], 'BAZ'], d['CPPDEFINES']
+ assert d['CPPFLAGS'] == ['-Wp,-cpp'], d['CPPFLAGS']
+ assert d['CPPPATH'] == ['/usr/include/fum',
+ 'bar',
+ 'C:\\Program Files\\ASCEND\\include'], d['CPPPATH']
+ assert d['FRAMEWORKPATH'] == ['fwd1', 'fwd2', 'fwd3'], d['FRAMEWORKPATH']
+ assert d['FRAMEWORKS'] == ['Carbon'], d['FRAMEWORKS']
+ assert d['LIBPATH'] == ['/usr/fax',
+ 'foo',
+ 'C:\\Program Files\\ASCEND'], d['LIBPATH']
+ LIBS = list(map(str, d['LIBS']))
+ assert LIBS == ['xxx', 'yyy', 'ascend'], (d['LIBS'], LIBS)
+ assert d['LINKFLAGS'] == ['-Wl,-link',
+ '-dylib_file', 'foo-dylib',
+ '-pthread', '-fopenmp',
+ '-mno-cygwin', '-mwindows',
+ ('-arch', 'i386'),
+ ('-isysroot', '/tmp'),
+ '+DD64'], repr(d['LINKFLAGS'])
+ assert d['RPATH'] == ['rpath1', 'rpath2', 'rpath3'], d['RPATH']
+
+
+ def test_MergeFlags(self):
+ """Test the MergeFlags() method
+ """
+ env = SubstitutionEnvironment()
+ env.MergeFlags('')
+ assert 'CCFLAGS' not in env, env['CCFLAGS']
+ env.MergeFlags('-X')
+ assert env['CCFLAGS'] == ['-X'], env['CCFLAGS']
+ env.MergeFlags('-X')
+ assert env['CCFLAGS'] == ['-X'], env['CCFLAGS']
+
+ env = SubstitutionEnvironment(CCFLAGS=None)
+ env.MergeFlags('-Y')
+ assert env['CCFLAGS'] == ['-Y'], env['CCFLAGS']
+
+ env = SubstitutionEnvironment()
+ env.MergeFlags({'A':['aaa'], 'B':['bbb']})
+ assert env['A'] == ['aaa'], env['A']
+ assert env['B'] == ['bbb'], env['B']
+
+
+class BaseTestCase(unittest.TestCase,TestEnvironmentFixture):
+
+ reserved_variables = [
+ 'CHANGED_SOURCES',
+ 'CHANGED_TARGETS',
+ 'SOURCE',
+ 'SOURCES',
+ 'TARGET',
+ 'TARGETS',
+ 'UNCHANGED_SOURCES',
+ 'UNCHANGED_TARGETS',
+ ]
+
+ def test___init__(self):
+ """Test construction Environment creation
+
+ Create two with identical arguments and check that
+ they compare the same.
+ """
+ env1 = self.TestEnvironment(XXX = 'x', YYY = 'y')
+ env2 = self.TestEnvironment(XXX = 'x', YYY = 'y')
+ assert env1 == env2, diff_env(env1, env2)
+
+ assert '__env__' not in env1
+ assert '__env__' not in env2
+
+ def test_variables(self):
+ """Test that variables only get applied once."""
+ class FakeOptions(object):
+ def __init__(self, key, val):
+ self.calls = 0
+ self.key = key
+ self.val = val
+ def keys(self):
+ return [self.key]
+ def Update(self, env):
+ env[self.key] = self.val
+ self.calls = self.calls + 1
+
+ o = FakeOptions('AAA', 'fake_opt')
+ env = Environment(variables=o, AAA='keyword_arg')
+ assert o.calls == 1, o.calls
+ assert env['AAA'] == 'fake_opt', env['AAA']
+
+ def test_get(self):
+ """Test the get() method."""
+ env = self.TestEnvironment(aaa = 'AAA')
+
+ x = env.get('aaa')
+ assert x == 'AAA', x
+ x = env.get('aaa', 'XXX')
+ assert x == 'AAA', x
+ x = env.get('bbb')
+ assert x is None, x
+ x = env.get('bbb', 'XXX')
+ assert x == 'XXX', x
+
+ def test_Builder_calls(self):
+ """Test Builder calls through different environments
+ """
+ global called_it
+
+ b1 = Builder()
+ b2 = Builder()
+
+ env = Environment()
+ env.Replace(BUILDERS = { 'builder1' : b1,
+ 'builder2' : b2 })
+ called_it = {}
+ env.builder1('in1')
+ assert called_it['target'] is None, called_it
+ assert called_it['source'] == ['in1'], called_it
+
+ called_it = {}
+ env.builder2(source = 'in2', xyzzy = 1)
+ assert called_it['target'] is None, called_it
+ assert called_it['source'] == ['in2'], called_it
+ assert called_it['xyzzy'] == 1, called_it
+
+ called_it = {}
+ env.builder1(foo = 'bar')
+ assert called_it['foo'] == 'bar', called_it
+ assert called_it['target'] is None, called_it
+ assert called_it['source'] is None, called_it
+
+ def test_BuilderWrapper_attributes(self):
+ """Test getting and setting of BuilderWrapper attributes
+ """
+ b1 = Builder()
+ b2 = Builder()
+ e1 = Environment()
+ e2 = Environment()
+
+ e1.Replace(BUILDERS = {'b' : b1})
+ bw = e1.b
+
+ assert bw.env is e1
+ bw.env = e2
+ assert bw.env is e2
+
+ assert bw.builder is b1
+ bw.builder = b2
+ assert bw.builder is b2
+
+ self.assertRaises(AttributeError, getattr, bw, 'foobar')
+ bw.foobar = 42
+ assert bw.foobar is 42
+
+ # This unit test is currently disabled because we don't think the
+ # underlying method it tests (Environment.BuilderWrapper.execute())
+ # is necessary, but we're leaving the code here for now in case
+ # that's mistaken.
+ def _DO_NOT_test_Builder_execs(self):
+ """Test Builder execution through different environments
+
+ One environment is initialized with a single
+ Builder object, one with a list of a single Builder
+ object, and one with a list of two Builder objects.
+ """
+ global built_it
+
+ b1 = Builder()
+ b2 = Builder()
+
+ built_it = {}
+ env3 = Environment()
+ env3.Replace(BUILDERS = { 'builder1' : b1,
+ 'builder2' : b2 })
+ env3.builder1.execute(target = 'out1')
+ env3.builder2.execute(target = 'out2')
+ env3.builder1.execute(target = 'out3')
+ assert built_it['out1']
+ assert built_it['out2']
+ assert built_it['out3']
+
+ env4 = env3.Clone()
+ assert env4.builder1.env is env4, "builder1.env (%s) == env3 (%s)?" % (
+env4.builder1.env, env3)
+ assert env4.builder2.env is env4, "builder2.env (%s) == env3 (%s)?" % (
+env4.builder1.env, env3)
+
+ # Now test BUILDERS as a dictionary.
+ built_it = {}
+ env5 = self.TestEnvironment(BUILDERS={ 'foo' : b1 })
+ env5['BUILDERS']['bar'] = b2
+ env5.foo.execute(target='out1')
+ env5.bar.execute(target='out2')
+ assert built_it['out1']
+ assert built_it['out2']
+
+ built_it = {}
+ env6 = Environment()
+ env6['BUILDERS'] = { 'foo' : b1,
+ 'bar' : b2 }
+ env6.foo.execute(target='out1')
+ env6.bar.execute(target='out2')
+ assert built_it['out1']
+ assert built_it['out2']
+
+
+
+ def test_Scanners(self):
+ """Test setting SCANNERS in various ways
+
+ One environment is initialized with a single
+ Scanner object, one with a list of a single Scanner
+ object, and one with a list of two Scanner objects.
+ """
+ global scanned_it
+
+ s1 = Scanner(name = 'scanner1', skeys = [".c", ".cc"])
+ s2 = Scanner(name = 'scanner2', skeys = [".m4"])
+ s3 = Scanner(name = 'scanner3', skeys = [".m4", ".m5"])
+ s4 = Scanner(name = 'scanner4', skeys = [None])
+
+# XXX Tests for scanner execution through different environments,
+# XXX if we ever want to do that some day
+# scanned_it = {}
+# env1 = self.TestEnvironment(SCANNERS = s1)
+# env1.scanner1(filename = 'out1')
+# assert scanned_it['out1']
+#
+# scanned_it = {}
+# env2 = self.TestEnvironment(SCANNERS = [s1])
+# env1.scanner1(filename = 'out1')
+# assert scanned_it['out1']
+#
+# scanned_it = {}
+# env3 = Environment()
+# env3.Replace(SCANNERS = [s1])
+# env3.scanner1(filename = 'out1')
+# env3.scanner2(filename = 'out2')
+# env3.scanner1(filename = 'out3')
+# assert scanned_it['out1']
+# assert scanned_it['out2']
+# assert scanned_it['out3']
+
+ suffixes = [".c", ".cc", ".cxx", ".m4", ".m5"]
+
+ env = Environment()
+ try: del env['SCANNERS']
+ except KeyError: pass
+ s = list(map(env.get_scanner, suffixes))
+ assert s == [None, None, None, None, None], s
+
+ env = self.TestEnvironment(SCANNERS = [])
+ s = list(map(env.get_scanner, suffixes))
+ assert s == [None, None, None, None, None], s
+
+ env.Replace(SCANNERS = [s1])
+ s = list(map(env.get_scanner, suffixes))
+ assert s == [s1, s1, None, None, None], s
+
+ env.Append(SCANNERS = [s2])
+ s = list(map(env.get_scanner, suffixes))
+ assert s == [s1, s1, None, s2, None], s
+
+ env.AppendUnique(SCANNERS = [s3])
+ s = list(map(env.get_scanner, suffixes))
+ assert s == [s1, s1, None, s2, s3], s
+
+ env = env.Clone(SCANNERS = [s2])
+ s = list(map(env.get_scanner, suffixes))
+ assert s == [None, None, None, s2, None], s
+
+ env['SCANNERS'] = [s1]
+ s = list(map(env.get_scanner, suffixes))
+ assert s == [s1, s1, None, None, None], s
+
+ env.PrependUnique(SCANNERS = [s2, s1])
+ s = list(map(env.get_scanner, suffixes))
+ assert s == [s1, s1, None, s2, None], s
+
+ env.Prepend(SCANNERS = [s3])
+ s = list(map(env.get_scanner, suffixes))
+ assert s == [s1, s1, None, s3, s3], s
+
+ # Verify behavior of case-insensitive suffix matches on Windows.
+ uc_suffixes = [_.upper() for _ in suffixes]
+
+ env = Environment(SCANNERS = [s1, s2, s3],
+ PLATFORM = 'linux')
+
+ s = list(map(env.get_scanner, suffixes))
+ assert s == [s1, s1, None, s2, s3], s
+
+ s = list(map(env.get_scanner, uc_suffixes))
+ assert s == [None, None, None, None, None], s
+
+ env['PLATFORM'] = 'win32'
+
+ s = list(map(env.get_scanner, uc_suffixes))
+ assert s == [s1, s1, None, s2, s3], s
+
+ # Verify behavior for a scanner returning None (on Windows
+ # where we might try to perform case manipulation on None).
+ env.Replace(SCANNERS = [s4])
+ s = list(map(env.get_scanner, suffixes))
+ assert s == [None, None, None, None, None], s
+
+ def test_ENV(self):
+ """Test setting the external ENV in Environments
+ """
+ env = Environment()
+ assert 'ENV' in env.Dictionary()
+
+ env = self.TestEnvironment(ENV = { 'PATH' : '/foo:/bar' })
+ assert env.Dictionary('ENV')['PATH'] == '/foo:/bar'
+
+ def test_ReservedVariables(self):
+ """Test warning generation when reserved variable names are set"""
+
+ reserved_variables = [
+ 'CHANGED_SOURCES',
+ 'CHANGED_TARGETS',
+ 'SOURCE',
+ 'SOURCES',
+ 'TARGET',
+ 'TARGETS',
+ 'UNCHANGED_SOURCES',
+ 'UNCHANGED_TARGETS',
+ ]
+
+ warning = SCons.Warnings.ReservedVariableWarning
+ SCons.Warnings.enableWarningClass(warning)
+ old = SCons.Warnings.warningAsException(1)
+
+ try:
+ env4 = Environment()
+ for kw in self.reserved_variables:
+ exc_caught = None
+ try:
+ env4[kw] = 'xyzzy'
+ except warning:
+ exc_caught = 1
+ assert exc_caught, "Did not catch ReservedVariableWarning for `%s'" % kw
+ assert kw not in env4, "`%s' variable was incorrectly set" % kw
+ finally:
+ SCons.Warnings.warningAsException(old)
+
+ def test_FutureReservedVariables(self):
+ """Test warning generation when future reserved variable names are set"""
+
+ future_reserved_variables = []
+
+ warning = SCons.Warnings.FutureReservedVariableWarning
+ SCons.Warnings.enableWarningClass(warning)
+ old = SCons.Warnings.warningAsException(1)
+
+ try:
+ env4 = Environment()
+ for kw in future_reserved_variables:
+ exc_caught = None
+ try:
+ env4[kw] = 'xyzzy'
+ except warning:
+ exc_caught = 1
+ assert exc_caught, "Did not catch FutureReservedVariableWarning for `%s'" % kw
+ assert kw in env4, "`%s' variable was not set" % kw
+ finally:
+ SCons.Warnings.warningAsException(old)
+
+ def test_IllegalVariables(self):
+ """Test that use of illegal variables raises an exception"""
+ env = Environment()
+ def test_it(var, env=env):
+ exc_caught = None
+ try:
+ env[var] = 1
+ except SCons.Errors.UserError:
+ exc_caught = 1
+ assert exc_caught, "did not catch UserError for '%s'" % var
+ env['aaa'] = 1
+ assert env['aaa'] == 1, env['aaa']
+ test_it('foo/bar')
+ test_it('foo.bar')
+ test_it('foo-bar')
+
+ def test_autogenerate(dict):
+ """Test autogenerating variables in a dictionary."""
+
+ drive, p = os.path.splitdrive(os.getcwd())
+ def normalize_path(path, drive=drive):
+ if path[0] in '\\/':
+ path = drive + path
+ path = os.path.normpath(path)
+ drive, path = os.path.splitdrive(path)
+ return drive.lower() + path
+
+ env = dict.TestEnvironment(LIBS = [ 'foo', 'bar', 'baz' ],
+ LIBLINKPREFIX = 'foo',
+ LIBLINKSUFFIX = 'bar')
+
+ def RDirs(pathlist, fs=env.fs):
+ return fs.Dir('xx').Rfindalldirs(pathlist)
+
+ env['RDirs'] = RDirs
+ flags = env.subst_list('$_LIBFLAGS', 1)[0]
+ assert flags == ['foobar', 'foobar', 'foobazbar'], flags
+
+ blat = env.fs.Dir('blat')
+
+ env.Replace(CPPPATH = [ 'foo', '$FOO/bar', blat ],
+ INCPREFIX = 'foo ',
+ INCSUFFIX = 'bar',
+ FOO = 'baz')
+ flags = env.subst_list('$_CPPINCFLAGS', 1)[0]
+ expect = [ '$(',
+ normalize_path('foo'),
+ normalize_path('xx/foobar'),
+ normalize_path('foo'),
+ normalize_path('xx/baz/bar'),
+ normalize_path('foo'),
+ normalize_path('blatbar'),
+ '$)',
+ ]
+ assert flags == expect, flags
+
+ env.Replace(F77PATH = [ 'foo', '$FOO/bar', blat ],
+ INCPREFIX = 'foo ',
+ INCSUFFIX = 'bar',
+ FOO = 'baz')
+ flags = env.subst_list('$_F77INCFLAGS', 1)[0]
+ expect = [ '$(',
+ normalize_path('foo'),
+ normalize_path('xx/foobar'),
+ normalize_path('foo'),
+ normalize_path('xx/baz/bar'),
+ normalize_path('foo'),
+ normalize_path('blatbar'),
+ '$)',
+ ]
+ assert flags == expect, flags
+
+ env.Replace(CPPPATH = '', F77PATH = '', LIBPATH = '')
+ l = env.subst_list('$_CPPINCFLAGS')
+ assert l == [[]], l
+ l = env.subst_list('$_F77INCFLAGS')
+ assert l == [[]], l
+ l = env.subst_list('$_LIBDIRFLAGS')
+ assert l == [[]], l
+
+ env.fs.Repository('/rep1')
+ env.fs.Repository('/rep2')
+ env.Replace(CPPPATH = [ 'foo', '/__a__/b', '$FOO/bar', blat],
+ INCPREFIX = '-I ',
+ INCSUFFIX = 'XXX',
+ FOO = 'baz')
+ flags = env.subst_list('$_CPPINCFLAGS', 1)[0]
+ expect = [ '$(',
+ '-I', normalize_path('xx/fooXXX'),
+ '-I', normalize_path('/rep1/xx/fooXXX'),
+ '-I', normalize_path('/rep2/xx/fooXXX'),
+ '-I', normalize_path('/__a__/bXXX'),
+ '-I', normalize_path('xx/baz/barXXX'),
+ '-I', normalize_path('/rep1/xx/baz/barXXX'),
+ '-I', normalize_path('/rep2/xx/baz/barXXX'),
+ '-I', normalize_path('blatXXX'),
+ '$)'
+ ]
+ def normalize_if_path(arg, np=normalize_path):
+ if arg not in ('$(','$)','-I'):
+ return np(str(arg))
+ return arg
+ flags = list(map(normalize_if_path, flags))
+ assert flags == expect, flags
+
+ def test_platform(self):
+ """Test specifying a platform callable when instantiating."""
+ class platform(object):
+ def __str__(self): return "TestPlatform"
+ def __call__(self, env): env['XYZZY'] = 777
+
+ def tool(env):
+ env['SET_TOOL'] = 'initialized'
+ assert env['PLATFORM'] == "TestPlatform"
+
+ env = self.TestEnvironment(platform = platform(), tools = [tool])
+ assert env['XYZZY'] == 777, env
+ assert env['PLATFORM'] == "TestPlatform"
+ assert env['SET_TOOL'] == "initialized"
+
+ def test_Default_PLATFORM(self):
+ """Test overriding the default PLATFORM variable"""
+ class platform(object):
+ def __str__(self): return "DefaultTestPlatform"
+ def __call__(self, env): env['XYZZY'] = 888
+
+ def tool(env):
+ env['SET_TOOL'] = 'abcde'
+ assert env['PLATFORM'] == "DefaultTestPlatform"
+
+ import SCons.Defaults
+ save = SCons.Defaults.ConstructionEnvironment.copy()
+ try:
+ import SCons.Defaults
+ SCons.Defaults.ConstructionEnvironment.update({
+ 'PLATFORM' : platform(),
+ })
+ env = self.TestEnvironment(tools = [tool])
+ assert env['XYZZY'] == 888, env
+ assert env['PLATFORM'] == "DefaultTestPlatform"
+ assert env['SET_TOOL'] == "abcde"
+ finally:
+ SCons.Defaults.ConstructionEnvironment = save
+
+ def test_tools(self):
+ """Test specifying a tool callable when instantiating."""
+ def t1(env):
+ env['TOOL1'] = 111
+ def t2(env):
+ env['TOOL2'] = 222
+ def t3(env):
+ env['AAA'] = env['XYZ']
+ def t4(env):
+ env['TOOL4'] = 444
+ env = self.TestEnvironment(tools = [t1, t2, t3], XYZ = 'aaa')
+ assert env['TOOL1'] == 111, env['TOOL1']
+ assert env['TOOL2'] == 222, env
+ assert env['AAA'] == 'aaa', env
+ t4(env)
+ assert env['TOOL4'] == 444, env
+
+ test = TestCmd.TestCmd(workdir = '')
+ test.write('faketool.py', """\
+def generate(env, **kw):
+ for k, v in kw.items():
+ env[k] = v
+
+def exists(env):
+ return 1
+""")
+
+ env = self.TestEnvironment(tools = [('faketool', {'a':1, 'b':2, 'c':3})],
+ toolpath = [test.workpath('')])
+ assert env['a'] == 1, env['a']
+ assert env['b'] == 2, env['b']
+ assert env['c'] == 3, env['c']
+
+ def test_Default_TOOLS(self):
+ """Test overriding the default TOOLS variable"""
+ def t5(env):
+ env['TOOL5'] = 555
+ def t6(env):
+ env['TOOL6'] = 666
+ def t7(env):
+ env['BBB'] = env['XYZ']
+ def t8(env):
+ env['TOOL8'] = 888
+
+ import SCons.Defaults
+ save = SCons.Defaults.ConstructionEnvironment.copy()
+ try:
+ SCons.Defaults.ConstructionEnvironment.update({
+ 'TOOLS' : [t5, t6, t7],
+ })
+ env = Environment(XYZ = 'bbb')
+ assert env['TOOL5'] == 555, env['TOOL5']
+ assert env['TOOL6'] == 666, env
+ assert env['BBB'] == 'bbb', env
+ t8(env)
+ assert env['TOOL8'] == 888, env
+ finally:
+ SCons.Defaults.ConstructionEnvironment = save
+
+ def test_null_tools(self):
+ """Test specifying a tool of None is OK."""
+ def t1(env):
+ env['TOOL1'] = 111
+ def t2(env):
+ env['TOOL2'] = 222
+ env = self.TestEnvironment(tools = [t1, None, t2], XYZ = 'aaa')
+ assert env['TOOL1'] == 111, env['TOOL1']
+ assert env['TOOL2'] == 222, env
+ assert env['XYZ'] == 'aaa', env
+ env = self.TestEnvironment(tools = [None], XYZ = 'xyz')
+ assert env['XYZ'] == 'xyz', env
+ env = self.TestEnvironment(tools = [t1, '', t2], XYZ = 'ddd')
+ assert env['TOOL1'] == 111, env['TOOL1']
+ assert env['TOOL2'] == 222, env
+ assert env['XYZ'] == 'ddd', env
+
+ def test_concat(self):
+ "Test _concat()"
+ e1 = self.TestEnvironment(PRE='pre', SUF='suf', STR='a b', LIST=['a', 'b'])
+ s = e1.subst
+ x = s("${_concat('', '', '', __env__)}")
+ assert x == '', x
+ x = s("${_concat('', [], '', __env__)}")
+ assert x == '', x
+ x = s("${_concat(PRE, '', SUF, __env__)}")
+ assert x == '', x
+ x = s("${_concat(PRE, STR, SUF, __env__)}")
+ assert x == 'prea bsuf', x
+ x = s("${_concat(PRE, LIST, SUF, __env__)}")
+ assert x == 'preasuf prebsuf', x
+
+ def test_concat_nested(self):
+ "Test _concat() on a nested substitution strings."
+ e = self.TestEnvironment(PRE='pre', SUF='suf',
+ L1=['a', 'b'],
+ L2=['c', 'd'],
+ L3=['$L2'])
+ x = e.subst('$( ${_concat(PRE, L1, SUF, __env__)} $)')
+ assert x == 'preasuf prebsuf', x
+ e.AppendUnique(L1 = ['$L2'])
+ x = e.subst('$( ${_concat(PRE, L1, SUF, __env__)} $)')
+ assert x == 'preasuf prebsuf precsuf predsuf', x
+ e.AppendUnique(L1 = ['$L3'])
+ x = e.subst('$( ${_concat(PRE, L1, SUF, __env__)} $)')
+ assert x == 'preasuf prebsuf precsuf predsuf precsuf predsuf', x
+
+ def test_gvars(self):
+ """Test the Environment gvars() method"""
+ env = self.TestEnvironment(XXX = 'x', YYY = 'y', ZZZ = 'z')
+ gvars = env.gvars()
+ assert gvars['XXX'] == 'x', gvars['XXX']
+ assert gvars['YYY'] == 'y', gvars['YYY']
+ assert gvars['ZZZ'] == 'z', gvars['ZZZ']
+
+ def test__update(self):
+ """Test the _update() method"""
+ env = self.TestEnvironment(X = 'x', Y = 'y', Z = 'z')
+ assert env['X'] == 'x', env['X']
+ assert env['Y'] == 'y', env['Y']
+ assert env['Z'] == 'z', env['Z']
+ env._update({'X' : 'xxx',
+ 'TARGET' : 't',
+ 'TARGETS' : 'ttt',
+ 'SOURCE' : 's',
+ 'SOURCES' : 'sss',
+ 'Z' : 'zzz'})
+ assert env['X'] == 'xxx', env['X']
+ assert env['Y'] == 'y', env['Y']
+ assert env['Z'] == 'zzz', env['Z']
+ assert env['TARGET'] == 't', env['TARGET']
+ assert env['TARGETS'] == 'ttt', env['TARGETS']
+ assert env['SOURCE'] == 's', env['SOURCE']
+ assert env['SOURCES'] == 'sss', env['SOURCES']
+
+ def test_Append(self):
+ """Test appending to construction variables in an Environment
+ """
+
+ b1 = Environment()['BUILDERS']
+ b2 = Environment()['BUILDERS']
+ assert b1 == b2, diff_dict(b1, b2)
+
+ cases = [
+ 'a1', 'A1', 'a1A1',
+ 'a2', ['A2'], ['a2', 'A2'],
+ 'a3', UL(['A3']), UL(['a', '3', 'A3']),
+ 'a4', '', 'a4',
+ 'a5', [], ['a5'],
+ 'a6', UL([]), UL(['a', '6']),
+ 'a7', [''], ['a7', ''],
+ 'a8', UL(['']), UL(['a', '8', '']),
+
+ ['e1'], 'E1', ['e1', 'E1'],
+ ['e2'], ['E2'], ['e2', 'E2'],
+ ['e3'], UL(['E3']), UL(['e3', 'E3']),
+ ['e4'], '', ['e4'],
+ ['e5'], [], ['e5'],
+ ['e6'], UL([]), UL(['e6']),
+ ['e7'], [''], ['e7', ''],
+ ['e8'], UL(['']), UL(['e8', '']),
+
+ UL(['i1']), 'I1', UL(['i1', 'I', '1']),
+ UL(['i2']), ['I2'], UL(['i2', 'I2']),
+ UL(['i3']), UL(['I3']), UL(['i3', 'I3']),
+ UL(['i4']), '', UL(['i4']),
+ UL(['i5']), [], UL(['i5']),
+ UL(['i6']), UL([]), UL(['i6']),
+ UL(['i7']), [''], UL(['i7', '']),
+ UL(['i8']), UL(['']), UL(['i8', '']),
+
+ {'d1':1}, 'D1', {'d1':1, 'D1':None},
+ {'d2':1}, ['D2'], {'d2':1, 'D2':None},
+ {'d3':1}, UL(['D3']), {'d3':1, 'D3':None},
+ {'d4':1}, {'D4':1}, {'d4':1, 'D4':1},
+ {'d5':1}, UD({'D5':1}), UD({'d5':1, 'D5':1}),
+
+ UD({'u1':1}), 'U1', UD({'u1':1, 'U1':None}),
+ UD({'u2':1}), ['U2'], UD({'u2':1, 'U2':None}),
+ UD({'u3':1}), UL(['U3']), UD({'u3':1, 'U3':None}),
+ UD({'u4':1}), {'U4':1}, UD({'u4':1, 'U4':1}),
+ UD({'u5':1}), UD({'U5':1}), UD({'u5':1, 'U5':1}),
+
+ '', 'M1', 'M1',
+ '', ['M2'], ['M2'],
+ '', UL(['M3']), UL(['M3']),
+ '', '', '',
+ '', [], [],
+ '', UL([]), UL([]),
+ '', [''], [''],
+ '', UL(['']), UL(['']),
+
+ [], 'N1', ['N1'],
+ [], ['N2'], ['N2'],
+ [], UL(['N3']), UL(['N3']),
+ [], '', [],
+ [], [], [],
+ [], UL([]), UL([]),
+ [], [''], [''],
+ [], UL(['']), UL(['']),
+
+ UL([]), 'O1', ['O', '1'],
+ UL([]), ['O2'], ['O2'],
+ UL([]), UL(['O3']), UL(['O3']),
+ UL([]), '', UL([]),
+ UL([]), [], UL([]),
+ UL([]), UL([]), UL([]),
+ UL([]), [''], UL(['']),
+ UL([]), UL(['']), UL(['']),
+
+ [''], 'P1', ['', 'P1'],
+ [''], ['P2'], ['', 'P2'],
+ [''], UL(['P3']), UL(['', 'P3']),
+ [''], '', [''],
+ [''], [], [''],
+ [''], UL([]), UL(['']),
+ [''], [''], ['', ''],
+ [''], UL(['']), UL(['', '']),
+
+ UL(['']), 'Q1', ['', 'Q', '1'],
+ UL(['']), ['Q2'], ['', 'Q2'],
+ UL(['']), UL(['Q3']), UL(['', 'Q3']),
+ UL(['']), '', UL(['']),
+ UL(['']), [], UL(['']),
+ UL(['']), UL([]), UL(['']),
+ UL(['']), [''], UL(['', '']),
+ UL(['']), UL(['']), UL(['', '']),
+ ]
+
+ env = Environment()
+ failed = 0
+ while cases:
+ input, append, expect = cases[:3]
+ env['XXX'] = copy.copy(input)
+ try:
+ env.Append(XXX = append)
+ except Exception as e:
+ if failed == 0: print()
+ print(" %s Append %s exception: %s" % \
+ (repr(input), repr(append), e))
+ failed = failed + 1
+ else:
+ result = env['XXX']
+ if result != expect:
+ if failed == 0: print()
+ print(" %s Append %s => %s did not match %s" % \
+ (repr(input), repr(append), repr(result), repr(expect)))
+ failed = failed + 1
+ del cases[:3]
+ assert failed == 0, "%d Append() cases failed" % failed
+
+ env['UL'] = UL(['foo'])
+ env.Append(UL = 'bar')
+ result = env['UL']
+ assert isinstance(result, UL), repr(result)
+ assert result == ['foo', 'b', 'a', 'r'], result
+
+ env['CLVar'] = CLVar(['foo'])
+ env.Append(CLVar = 'bar')
+ result = env['CLVar']
+ assert isinstance(result, CLVar), repr(result)
+ assert result == ['foo', 'bar'], result
+
+ class C(object):
+ def __init__(self, name):
+ self.name = name
+ def __str__(self):
+ return self.name
+ def __eq__(self, other):
+ raise Exception("should not compare")
+
+ ccc = C('ccc')
+
+ env2 = self.TestEnvironment(CCC1 = ['c1'], CCC2 = ccc)
+ env2.Append(CCC1 = ccc, CCC2 = ['c2'])
+ assert env2['CCC1'][0] == 'c1', env2['CCC1']
+ assert env2['CCC1'][1] is ccc, env2['CCC1']
+ assert env2['CCC2'][0] is ccc, env2['CCC2']
+ assert env2['CCC2'][1] == 'c2', env2['CCC2']
+
+ env3 = self.TestEnvironment(X = {'x1' : 7})
+ env3.Append(X = {'x1' : 8, 'x2' : 9}, Y = {'y1' : 10})
+ assert env3['X'] == {'x1': 8, 'x2': 9}, env3['X']
+ assert env3['Y'] == {'y1': 10}, env3['Y']
+
+ z1 = Builder()
+ z2 = Builder()
+ env4 = self.TestEnvironment(BUILDERS = {'z1' : z1})
+ env4.Append(BUILDERS = {'z2' : z2})
+ assert env4['BUILDERS'] == {'z1' : z1, 'z2' : z2}, env4['BUILDERS']
+ assert hasattr(env4, 'z1')
+ assert hasattr(env4, 'z2')
+
+ def test_AppendENVPath(self):
+ """Test appending to an ENV path."""
+ env1 = self.TestEnvironment(ENV = {'PATH': r'C:\dir\num\one;C:\dir\num\two'},
+ MYENV = {'MYPATH': r'C:\mydir\num\one;C:\mydir\num\two'})
+ # have to include the pathsep here so that the test will work on UNIX too.
+ env1.AppendENVPath('PATH',r'C:\dir\num\two', sep = ';')
+ env1.AppendENVPath('PATH',r'C:\dir\num\three', sep = ';')
+ env1.AppendENVPath('MYPATH',r'C:\mydir\num\three','MYENV', sep = ';')
+ env1.AppendENVPath('MYPATH',r'C:\mydir\num\one','MYENV', sep = ';')
+ # this should do nothing since delete_existing is 0
+ env1.AppendENVPath('MYPATH',r'C:\mydir\num\three','MYENV', sep = ';', delete_existing=0)
+ assert(env1['ENV']['PATH'] == r'C:\dir\num\one;C:\dir\num\two;C:\dir\num\three')
+ assert(env1['MYENV']['MYPATH'] == r'C:\mydir\num\two;C:\mydir\num\three;C:\mydir\num\one')
+
+ test = TestCmd.TestCmd(workdir = '')
+ test.subdir('sub1', 'sub2')
+ p=env1['ENV']['PATH']
+ env1.AppendENVPath('PATH','#sub1', sep = ';')
+ env1.AppendENVPath('PATH',env1.fs.Dir('sub2'), sep = ';')
+ assert env1['ENV']['PATH'] == p + ';sub1;sub2', env1['ENV']['PATH']
+
+ def test_AppendUnique(self):
+ """Test appending to unique values to construction variables
+
+ This strips values that are already present when lists are
+ involved."""
+ env = self.TestEnvironment(AAA1 = 'a1',
+ AAA2 = 'a2',
+ AAA3 = 'a3',
+ AAA4 = 'a4',
+ AAA5 = 'a5',
+ BBB1 = ['b1'],
+ BBB2 = ['b2'],
+ BBB3 = ['b3'],
+ BBB4 = ['b4'],
+ BBB5 = ['b5'],
+ CCC1 = '',
+ CCC2 = '',
+ DDD1 = ['a', 'b', 'c'])
+ env['LL1'] = [env.Literal('a literal'), env.Literal('b literal')]
+ env['LL2'] = [env.Literal('c literal'), env.Literal('b literal')]
+ env.AppendUnique(AAA1 = 'a1',
+ AAA2 = ['a2'],
+ AAA3 = ['a3', 'b', 'c', 'c', 'b', 'a3'], # ignore dups
+ AAA4 = 'a4.new',
+ AAA5 = ['a5.new'],
+ BBB1 = 'b1',
+ BBB2 = ['b2'],
+ BBB3 = ['b3', 'c', 'd', 'c', 'b3'],
+ BBB4 = 'b4.new',
+ BBB5 = ['b5.new'],
+ CCC1 = 'c1',
+ CCC2 = ['c2'],
+ DDD1 = 'b',
+ LL1 = env.Literal('a literal'),
+ LL2 = env.Literal('a literal'))
+
+ assert env['AAA1'] == 'a1a1', env['AAA1']
+ assert env['AAA2'] == ['a2'], env['AAA2']
+ assert env['AAA3'] == ['a3', 'b', 'c'], env['AAA3']
+ assert env['AAA4'] == 'a4a4.new', env['AAA4']
+ assert env['AAA5'] == ['a5', 'a5.new'], env['AAA5']
+ assert env['BBB1'] == ['b1'], env['BBB1']
+ assert env['BBB2'] == ['b2'], env['BBB2']
+ assert env['BBB3'] == ['b3', 'c', 'd'], env['BBB3']
+ assert env['BBB4'] == ['b4', 'b4.new'], env['BBB4']
+ assert env['BBB5'] == ['b5', 'b5.new'], env['BBB5']
+ assert env['CCC1'] == 'c1', env['CCC1']
+ assert env['CCC2'] == ['c2'], env['CCC2']
+ assert env['DDD1'] == ['a', 'b', 'c'], env['DDD1']
+ assert env['LL1'] == [env.Literal('a literal'), env.Literal('b literal')], env['LL1']
+ assert env['LL2'] == [env.Literal('c literal'), env.Literal('b literal'), env.Literal('a literal')], [str(x) for x in env['LL2']]
+
+ env.AppendUnique(DDD1 = 'b', delete_existing=1)
+ assert env['DDD1'] == ['a', 'c', 'b'], env['DDD1'] # b moves to end
+ env.AppendUnique(DDD1 = ['a','b'], delete_existing=1)
+ assert env['DDD1'] == ['c', 'a', 'b'], env['DDD1'] # a & b move to end
+ env.AppendUnique(DDD1 = ['e','f', 'e'], delete_existing=1)
+ assert env['DDD1'] == ['c', 'a', 'b', 'f', 'e'], env['DDD1'] # add last
+
+ env['CLVar'] = CLVar([])
+ env.AppendUnique(CLVar = 'bar')
+ result = env['CLVar']
+ assert isinstance(result, CLVar), repr(result)
+ assert result == ['bar'], result
+
+ env['CLVar'] = CLVar(['abc'])
+ env.AppendUnique(CLVar = 'bar')
+ result = env['CLVar']
+ assert isinstance(result, CLVar), repr(result)
+ assert result == ['abc', 'bar'], result
+
+ env['CLVar'] = CLVar(['bar'])
+ env.AppendUnique(CLVar = 'bar')
+ result = env['CLVar']
+ assert isinstance(result, CLVar), repr(result)
+ assert result == ['bar'], result
+
+ def test_Clone(self):
+ """Test construction environment copying
+
+ Update the copy independently afterwards and check that
+ the original remains intact (that is, no dangling
+ references point to objects in the copied environment).
+ Clone the original with some construction variable
+ updates and check that the original remains intact
+ and the copy has the updated values.
+ """
+ env1 = self.TestEnvironment(XXX = 'x', YYY = 'y')
+ env2 = env1.Clone()
+ env1copy = env1.Clone()
+ assert env1copy == env1copy
+ assert env2 == env2
+ env2.Replace(YYY = 'yyy')
+ assert env2 == env2
+ assert env1 != env2
+ assert env1 == env1copy
+
+ env3 = env1.Clone(XXX = 'x3', ZZZ = 'z3')
+ assert env3 == env3
+ assert env3.Dictionary('XXX') == 'x3'
+ assert env3.Dictionary('YYY') == 'y'
+ assert env3.Dictionary('ZZZ') == 'z3'
+ assert env1 == env1copy
+
+ # Ensure that lists and dictionaries are
+ # deep copied, but not instances.
+ class TestA(object):
+ pass
+ env1 = self.TestEnvironment(XXX=TestA(), YYY = [ 1, 2, 3 ],
+ ZZZ = { 1:2, 3:4 })
+ env2=env1.Clone()
+ env2.Dictionary('YYY').append(4)
+ env2.Dictionary('ZZZ')[5] = 6
+ assert env1.Dictionary('XXX') is env2.Dictionary('XXX')
+ assert 4 in env2.Dictionary('YYY')
+ assert not 4 in env1.Dictionary('YYY')
+ assert 5 in env2.Dictionary('ZZZ')
+ assert 5 not in env1.Dictionary('ZZZ')
+
+ #
+ env1 = self.TestEnvironment(BUILDERS = {'b1' : Builder()})
+ assert hasattr(env1, 'b1'), "env1.b1 was not set"
+ assert env1.b1.object == env1, "b1.object doesn't point to env1"
+ env2 = env1.Clone(BUILDERS = {'b2' : Builder()})
+ assert env2 is env2
+ assert env2 == env2
+ assert hasattr(env1, 'b1'), "b1 was mistakenly cleared from env1"
+ assert env1.b1.object == env1, "b1.object was changed"
+ assert not hasattr(env2, 'b1'), "b1 was not cleared from env2"
+ assert hasattr(env2, 'b2'), "env2.b2 was not set"
+ assert env2.b2.object == env2, "b2.object doesn't point to env2"
+
+ # Ensure that specifying new tools in a copied environment
+ # works.
+ def foo(env): env['FOO'] = 1
+ def bar(env): env['BAR'] = 2
+ def baz(env): env['BAZ'] = 3
+ env1 = self.TestEnvironment(tools=[foo])
+ env2 = env1.Clone()
+ env3 = env1.Clone(tools=[bar, baz])
+
+ assert env1.get('FOO') is 1
+ assert env1.get('BAR') is None
+ assert env1.get('BAZ') is None
+ assert env2.get('FOO') is 1
+ assert env2.get('BAR') is None
+ assert env2.get('BAZ') is None
+ assert env3.get('FOO') is 1
+ assert env3.get('BAR') is 2
+ assert env3.get('BAZ') is 3
+
+ # Ensure that recursive variable substitution when copying
+ # environments works properly.
+ env1 = self.TestEnvironment(CCFLAGS = '-DFOO', XYZ = '-DXYZ')
+ env2 = env1.Clone(CCFLAGS = '$CCFLAGS -DBAR',
+ XYZ = ['-DABC', 'x $XYZ y', '-DDEF'])
+ x = env2.get('CCFLAGS')
+ assert x == '-DFOO -DBAR', x
+ x = env2.get('XYZ')
+ assert x == ['-DABC', 'x -DXYZ y', '-DDEF'], x
+
+ # Ensure that special properties of a class don't get
+ # lost on copying.
+ env1 = self.TestEnvironment(FLAGS = CLVar('flag1 flag2'))
+ x = env1.get('FLAGS')
+ assert x == ['flag1', 'flag2'], x
+ env2 = env1.Clone()
+ env2.Append(FLAGS = 'flag3 flag4')
+ x = env2.get('FLAGS')
+ assert x == ['flag1', 'flag2', 'flag3', 'flag4'], x
+ x = env1.get('FLAGS')
+ assert x == ['flag1', 'flag2'], x
+
+ # Ensure that appending directly to a copied CLVar
+ # doesn't modify the original.
+ env1 = self.TestEnvironment(FLAGS = CLVar('flag1 flag2'))
+ x = env1.get('FLAGS')
+ assert x == ['flag1', 'flag2'], x
+ env2 = env1.Clone()
+ env2['FLAGS'] += ['flag3', 'flag4']
+ x = env2.get('FLAGS')
+ assert x == ['flag1', 'flag2', 'flag3', 'flag4'], x
+ x = env1.get('FLAGS')
+ assert x == ['flag1', 'flag2'], x
+
+ # Test that the environment stores the toolpath and
+ # re-uses it for copies.
+ test = TestCmd.TestCmd(workdir = '')
+
+ test.write('xxx.py', """\
+def exists(env):
+ 1
+def generate(env):
+ env['XXX'] = 'one'
+""")
+
+ test.write('yyy.py', """\
+def exists(env):
+ 1
+def generate(env):
+ env['YYY'] = 'two'
+""")
+
+ env = self.TestEnvironment(tools=['xxx'], toolpath=[test.workpath('')])
+ assert env['XXX'] == 'one', env['XXX']
+ env = env.Clone(tools=['yyy'])
+ assert env['YYY'] == 'two', env['YYY']
+
+
+ # Test that
+ real_value = [4]
+
+ def my_tool(env, rv=real_value):
+ assert env['KEY_THAT_I_WANT'] == rv[0]
+ env['KEY_THAT_I_WANT'] = rv[0] + 1
+
+ env = self.TestEnvironment()
+
+ real_value[0] = 5
+ env = env.Clone(KEY_THAT_I_WANT=5, tools=[my_tool])
+ assert env['KEY_THAT_I_WANT'] == real_value[0], env['KEY_THAT_I_WANT']
+
+ real_value[0] = 6
+ env = env.Clone(KEY_THAT_I_WANT=6, tools=[my_tool])
+ assert env['KEY_THAT_I_WANT'] == real_value[0], env['KEY_THAT_I_WANT']
+
+ # test for pull request #150
+ env = self.TestEnvironment()
+ env._dict.pop('BUILDERS')
+ assert ('BUILDERS' in env) is False
+ env2 = env.Clone()
+
+ def test_Copy(self):
+ """Test copying using the old env.Copy() method"""
+ env1 = self.TestEnvironment(XXX = 'x', YYY = 'y')
+ env2 = env1.Copy()
+ env1copy = env1.Copy()
+ assert env1copy == env1copy
+ assert env2 == env2
+ env2.Replace(YYY = 'yyy')
+ assert env2 == env2
+ assert env1 != env2
+ assert env1 == env1copy
+
+ def test_Detect(self):
+ """Test Detect()ing tools"""
+ test = TestCmd.TestCmd(workdir = '')
+ test.subdir('sub1', 'sub2')
+ sub1 = test.workpath('sub1')
+ sub2 = test.workpath('sub2')
+
+ if sys.platform == 'win32':
+ test.write(['sub1', 'xxx'], "sub1/xxx\n")
+ test.write(['sub2', 'xxx'], "sub2/xxx\n")
+
+ env = self.TestEnvironment(ENV = { 'PATH' : [sub1, sub2] })
+
+ x = env.Detect('xxx.exe')
+ assert x is None, x
+
+ test.write(['sub2', 'xxx.exe'], "sub2/xxx.exe\n")
+
+ env = self.TestEnvironment(ENV = { 'PATH' : [sub1, sub2] })
+
+ x = env.Detect('xxx.exe')
+ assert x == 'xxx.exe', x
+
+ test.write(['sub1', 'xxx.exe'], "sub1/xxx.exe\n")
+
+ x = env.Detect('xxx.exe')
+ assert x == 'xxx.exe', x
+
+ else:
+ test.write(['sub1', 'xxx.exe'], "sub1/xxx.exe\n")
+ test.write(['sub2', 'xxx.exe'], "sub2/xxx.exe\n")
+
+ env = self.TestEnvironment(ENV = { 'PATH' : [sub1, sub2] })
+
+ x = env.Detect('xxx.exe')
+ assert x is None, x
+
+ sub2_xxx_exe = test.workpath('sub2', 'xxx.exe')
+ os.chmod(sub2_xxx_exe, 0o755)
+
+ env = self.TestEnvironment(ENV = { 'PATH' : [sub1, sub2] })
+
+ x = env.Detect('xxx.exe')
+ assert x == 'xxx.exe', x
+
+ sub1_xxx_exe = test.workpath('sub1', 'xxx.exe')
+ os.chmod(sub1_xxx_exe, 0o755)
+
+ x = env.Detect('xxx.exe')
+ assert x == 'xxx.exe', x
+
+ env = self.TestEnvironment(ENV = { 'PATH' : [] })
+ x = env.Detect('xxx.exe')
+ assert x is None, x
+
+ def test_Dictionary(self):
+ """Test retrieval of known construction variables
+
+ Fetch them from the Dictionary and check for well-known
+ defaults that get inserted.
+ """
+ env = self.TestEnvironment(XXX = 'x', YYY = 'y', ZZZ = 'z')
+ assert env.Dictionary('XXX') == 'x'
+ assert env.Dictionary('YYY') == 'y'
+ assert env.Dictionary('XXX', 'ZZZ') == ['x', 'z']
+ xxx, zzz = env.Dictionary('XXX', 'ZZZ')
+ assert xxx == 'x'
+ assert zzz == 'z'
+ assert 'BUILDERS' in env.Dictionary()
+ assert 'CC' in env.Dictionary()
+ assert 'CCFLAGS' in env.Dictionary()
+ assert 'ENV' in env.Dictionary()
+
+ assert env['XXX'] == 'x'
+ env['XXX'] = 'foo'
+ assert env.Dictionary('XXX') == 'foo'
+ del env['XXX']
+ assert 'XXX' not in env.Dictionary()
+
+ def test_FindIxes(self):
+ "Test FindIxes()"
+ env = self.TestEnvironment(LIBPREFIX='lib',
+ LIBSUFFIX='.a',
+ SHLIBPREFIX='lib',
+ SHLIBSUFFIX='.so',
+ PREFIX='pre',
+ SUFFIX='post')
+
+ paths = [os.path.join('dir', 'libfoo.a'),
+ os.path.join('dir', 'libfoo.so')]
+
+ assert paths[0] == env.FindIxes(paths, 'LIBPREFIX', 'LIBSUFFIX')
+ assert paths[1] == env.FindIxes(paths, 'SHLIBPREFIX', 'SHLIBSUFFIX')
+ assert None is env.FindIxes(paths, 'PREFIX', 'POST')
+
+ paths = ['libfoo.a', 'prefoopost']
+
+ assert paths[0] == env.FindIxes(paths, 'LIBPREFIX', 'LIBSUFFIX')
+ assert None is env.FindIxes(paths, 'SHLIBPREFIX', 'SHLIBSUFFIX')
+ assert paths[1] == env.FindIxes(paths, 'PREFIX', 'SUFFIX')
+
+ def test_ParseConfig(self):
+ """Test the ParseConfig() method"""
+ env = self.TestEnvironment(COMMAND='command',
+ ASFLAGS='assembler',
+ CCFLAGS=[''],
+ CPPDEFINES=[],
+ CPPFLAGS=[''],
+ CPPPATH='string',
+ FRAMEWORKPATH=[],
+ FRAMEWORKS=[],
+ LIBPATH=['list'],
+ LIBS='',
+ LINKFLAGS=[''],
+ RPATH=[])
+
+ orig_backtick = env.backtick
+ class my_backtick(object):
+ def __init__(self, save_command, output):
+ self.save_command = save_command
+ self.output = output
+ def __call__(self, command):
+ self.save_command.append(command)
+ return self.output
+
+ try:
+ save_command = []
+ env.backtick = my_backtick(save_command,
+ "-I/usr/include/fum -I bar -X\n" + \
+ "-L/usr/fax -L foo -lxxx -l yyy " + \
+ "-Wa,-as -Wl,-link " + \
+ "-Wl,-rpath=rpath1 " + \
+ "-Wl,-R,rpath2 " + \
+ "-Wl,-Rrpath3 " + \
+ "-Wp,-cpp abc " + \
+ "-framework Carbon " + \
+ "-frameworkdir=fwd1 " + \
+ "-Ffwd2 " + \
+ "-F fwd3 " + \
+ "-pthread " + \
+ "-mno-cygwin -mwindows " + \
+ "-arch i386 -isysroot /tmp " + \
+ "-isystem /usr/include/foo " + \
+ "+DD64 " + \
+ "-DFOO -DBAR=value")
+ env.ParseConfig("fake $COMMAND")
+ assert save_command == ['fake command'], save_command
+ assert env['ASFLAGS'] == ['assembler', '-as'], env['ASFLAGS']
+ assert env['CCFLAGS'] == ['', '-X', '-Wa,-as',
+ '-pthread', '-mno-cygwin',
+ ('-arch', 'i386'), ('-isysroot', '/tmp'),
+ ('-isystem', '/usr/include/foo'),
+ '+DD64'], env['CCFLAGS']
+ assert env['CPPDEFINES'] == ['FOO', ['BAR', 'value']], env['CPPDEFINES']
+ assert env['CPPFLAGS'] == ['', '-Wp,-cpp'], env['CPPFLAGS']
+ assert env['CPPPATH'] == ['string', '/usr/include/fum', 'bar'], env['CPPPATH']
+ assert env['FRAMEWORKPATH'] == ['fwd1', 'fwd2', 'fwd3'], env['FRAMEWORKPATH']
+ assert env['FRAMEWORKS'] == ['Carbon'], env['FRAMEWORKS']
+ assert env['LIBPATH'] == ['list', '/usr/fax', 'foo'], env['LIBPATH']
+ assert env['LIBS'] == ['xxx', 'yyy', env.File('abc')], env['LIBS']
+ assert env['LINKFLAGS'] == ['', '-Wl,-link', '-pthread',
+ '-mno-cygwin', '-mwindows',
+ ('-arch', 'i386'),
+ ('-isysroot', '/tmp'),
+ '+DD64'], env['LINKFLAGS']
+ assert env['RPATH'] == ['rpath1', 'rpath2', 'rpath3'], env['RPATH']
+
+ env.backtick = my_backtick([], "-Ibar")
+ env.ParseConfig("fake2")
+ assert env['CPPPATH'] == ['string', '/usr/include/fum', 'bar'], env['CPPPATH']
+ env.ParseConfig("fake2", unique=0)
+ assert env['CPPPATH'] == ['string', '/usr/include/fum', 'bar', 'bar'], env['CPPPATH']
+ finally:
+ env.backtick = orig_backtick
+
+ def test_ParseDepends(self):
+ """Test the ParseDepends() method"""
+ test = TestCmd.TestCmd(workdir = '')
+
+ test.write('single', """
+#file: dependency
+
+f0: \
+ d1 \
+ d2 \
+ d3 \
+
+""")
+
+ test.write('multiple', """
+f1: foo
+f2 f3: bar
+f4: abc def
+#file: dependency
+f5: \
+ ghi \
+ jkl \
+ mno \
+""")
+
+ env = self.TestEnvironment(SINGLE = test.workpath('single'))
+
+ tlist = []
+ dlist = []
+ def my_depends(target, dependency, tlist=tlist, dlist=dlist):
+ tlist.extend(target)
+ dlist.extend(dependency)
+
+ env.Depends = my_depends
+
+ env.ParseDepends(test.workpath('does_not_exist'))
+
+ exc_caught = None
+ try:
+ env.ParseDepends(test.workpath('does_not_exist'), must_exist=1)
+ except IOError:
+ exc_caught = 1
+ assert exc_caught, "did not catch expected IOError"
+
+ del tlist[:]
+ del dlist[:]
+
+ env.ParseDepends('$SINGLE', only_one=1)
+ t = list(map(str, tlist))
+ d = list(map(str, dlist))
+ assert t == ['f0'], t
+ assert d == ['d1', 'd2', 'd3'], d
+
+ del tlist[:]
+ del dlist[:]
+
+ env.ParseDepends(test.workpath('multiple'))
+ t = list(map(str, tlist))
+ d = list(map(str, dlist))
+ assert t == ['f1', 'f2', 'f3', 'f4', 'f5'], t
+ assert d == ['foo', 'bar', 'abc', 'def', 'ghi', 'jkl', 'mno'], d
+
+ exc_caught = None
+ try:
+ env.ParseDepends(test.workpath('multiple'), only_one=1)
+ except SCons.Errors.UserError:
+ exc_caught = 1
+ assert exc_caught, "did not catch expected UserError"
+
+ def test_Platform(self):
+ """Test the Platform() method"""
+ env = self.TestEnvironment(WIN32='win32', NONE='no-such-platform')
+
+ exc_caught = None
+ try:
+ env.Platform('does_not_exist')
+ except SCons.Errors.UserError:
+ exc_caught = 1
+ assert exc_caught, "did not catch expected UserError"
+
+ exc_caught = None
+ try:
+ env.Platform('$NONE')
+ except SCons.Errors.UserError:
+ exc_caught = 1
+ assert exc_caught, "did not catch expected UserError"
+
+ env.Platform('posix')
+ assert env['OBJSUFFIX'] == '.o', env['OBJSUFFIX']
+
+ env.Platform('$WIN32')
+ assert env['OBJSUFFIX'] == '.obj', env['OBJSUFFIX']
+
+ def test_Prepend(self):
+ """Test prepending to construction variables in an Environment
+ """
+ cases = [
+ 'a1', 'A1', 'A1a1',
+ 'a2', ['A2'], ['A2', 'a2'],
+ 'a3', UL(['A3']), UL(['A3', 'a', '3']),
+ 'a4', '', 'a4',
+ 'a5', [], ['a5'],
+ 'a6', UL([]), UL(['a', '6']),
+ 'a7', [''], ['', 'a7'],
+ 'a8', UL(['']), UL(['', 'a', '8']),
+
+ ['e1'], 'E1', ['E1', 'e1'],
+ ['e2'], ['E2'], ['E2', 'e2'],
+ ['e3'], UL(['E3']), UL(['E3', 'e3']),
+ ['e4'], '', ['e4'],
+ ['e5'], [], ['e5'],
+ ['e6'], UL([]), UL(['e6']),
+ ['e7'], [''], ['', 'e7'],
+ ['e8'], UL(['']), UL(['', 'e8']),
+
+ UL(['i1']), 'I1', UL(['I', '1', 'i1']),
+ UL(['i2']), ['I2'], UL(['I2', 'i2']),
+ UL(['i3']), UL(['I3']), UL(['I3', 'i3']),
+ UL(['i4']), '', UL(['i4']),
+ UL(['i5']), [], UL(['i5']),
+ UL(['i6']), UL([]), UL(['i6']),
+ UL(['i7']), [''], UL(['', 'i7']),
+ UL(['i8']), UL(['']), UL(['', 'i8']),
+
+ {'d1':1}, 'D1', {'d1':1, 'D1':None},
+ {'d2':1}, ['D2'], {'d2':1, 'D2':None},
+ {'d3':1}, UL(['D3']), {'d3':1, 'D3':None},
+ {'d4':1}, {'D4':1}, {'d4':1, 'D4':1},
+ {'d5':1}, UD({'D5':1}), UD({'d5':1, 'D5':1}),
+
+ UD({'u1':1}), 'U1', UD({'u1':1, 'U1':None}),
+ UD({'u2':1}), ['U2'], UD({'u2':1, 'U2':None}),
+ UD({'u3':1}), UL(['U3']), UD({'u3':1, 'U3':None}),
+ UD({'u4':1}), {'U4':1}, UD({'u4':1, 'U4':1}),
+ UD({'u5':1}), UD({'U5':1}), UD({'u5':1, 'U5':1}),
+
+ '', 'M1', 'M1',
+ '', ['M2'], ['M2'],
+ '', UL(['M3']), UL(['M3']),
+ '', '', '',
+ '', [], [],
+ '', UL([]), UL([]),
+ '', [''], [''],
+ '', UL(['']), UL(['']),
+
+ [], 'N1', ['N1'],
+ [], ['N2'], ['N2'],
+ [], UL(['N3']), UL(['N3']),
+ [], '', [],
+ [], [], [],
+ [], UL([]), UL([]),
+ [], [''], [''],
+ [], UL(['']), UL(['']),
+
+ UL([]), 'O1', UL(['O', '1']),
+ UL([]), ['O2'], UL(['O2']),
+ UL([]), UL(['O3']), UL(['O3']),
+ UL([]), '', UL([]),
+ UL([]), [], UL([]),
+ UL([]), UL([]), UL([]),
+ UL([]), [''], UL(['']),
+ UL([]), UL(['']), UL(['']),
+
+ [''], 'P1', ['P1', ''],
+ [''], ['P2'], ['P2', ''],
+ [''], UL(['P3']), UL(['P3', '']),
+ [''], '', [''],
+ [''], [], [''],
+ [''], UL([]), UL(['']),
+ [''], [''], ['', ''],
+ [''], UL(['']), UL(['', '']),
+
+ UL(['']), 'Q1', UL(['Q', '1', '']),
+ UL(['']), ['Q2'], UL(['Q2', '']),
+ UL(['']), UL(['Q3']), UL(['Q3', '']),
+ UL(['']), '', UL(['']),
+ UL(['']), [], UL(['']),
+ UL(['']), UL([]), UL(['']),
+ UL(['']), [''], UL(['', '']),
+ UL(['']), UL(['']), UL(['', '']),
+ ]
+
+ env = Environment()
+ failed = 0
+ while cases:
+ input, prepend, expect = cases[:3]
+ env['XXX'] = copy.copy(input)
+ try:
+ env.Prepend(XXX = prepend)
+ except Exception as e:
+ if failed == 0: print()
+ print(" %s Prepend %s exception: %s" % \
+ (repr(input), repr(prepend), e))
+ failed = failed + 1
+ else:
+ result = env['XXX']
+ if result != expect:
+ if failed == 0: print()
+ print(" %s Prepend %s => %s did not match %s" % \
+ (repr(input), repr(prepend), repr(result), repr(expect)))
+ failed = failed + 1
+ del cases[:3]
+ assert failed == 0, "%d Prepend() cases failed" % failed
+
+ env['UL'] = UL(['foo'])
+ env.Prepend(UL = 'bar')
+ result = env['UL']
+ assert isinstance(result, UL), repr(result)
+ assert result == ['b', 'a', 'r', 'foo'], result
+
+ env['CLVar'] = CLVar(['foo'])
+ env.Prepend(CLVar = 'bar')
+ result = env['CLVar']
+ assert isinstance(result, CLVar), repr(result)
+ assert result == ['bar', 'foo'], result
+
+ env3 = self.TestEnvironment(X = {'x1' : 7})
+ env3.Prepend(X = {'x1' : 8, 'x2' : 9}, Y = {'y1' : 10})
+ assert env3['X'] == {'x1': 8, 'x2' : 9}, env3['X']
+ assert env3['Y'] == {'y1': 10}, env3['Y']
+
+ z1 = Builder()
+ z2 = Builder()
+ env4 = self.TestEnvironment(BUILDERS = {'z1' : z1})
+ env4.Prepend(BUILDERS = {'z2' : z2})
+ assert env4['BUILDERS'] == {'z1' : z1, 'z2' : z2}, env4['BUILDERS']
+ assert hasattr(env4, 'z1')
+ assert hasattr(env4, 'z2')
+
+ def test_PrependENVPath(self):
+ """Test prepending to an ENV path."""
+ env1 = self.TestEnvironment(ENV = {'PATH': r'C:\dir\num\one;C:\dir\num\two'},
+ MYENV = {'MYPATH': r'C:\mydir\num\one;C:\mydir\num\two'})
+ # have to include the pathsep here so that the test will work on UNIX too.
+ env1.PrependENVPath('PATH',r'C:\dir\num\two',sep = ';')
+ env1.PrependENVPath('PATH',r'C:\dir\num\three',sep = ';')
+ env1.PrependENVPath('MYPATH',r'C:\mydir\num\three','MYENV',sep = ';')
+ env1.PrependENVPath('MYPATH',r'C:\mydir\num\one','MYENV',sep = ';')
+ # this should do nothing since delete_existing is 0
+ env1.PrependENVPath('MYPATH',r'C:\mydir\num\three','MYENV', sep = ';', delete_existing=0)
+ assert(env1['ENV']['PATH'] == r'C:\dir\num\three;C:\dir\num\two;C:\dir\num\one')
+ assert(env1['MYENV']['MYPATH'] == r'C:\mydir\num\one;C:\mydir\num\three;C:\mydir\num\two')
+
+ test = TestCmd.TestCmd(workdir = '')
+ test.subdir('sub1', 'sub2')
+ p=env1['ENV']['PATH']
+ env1.PrependENVPath('PATH','#sub1', sep = ';')
+ env1.PrependENVPath('PATH',env1.fs.Dir('sub2'), sep = ';')
+ assert env1['ENV']['PATH'] == 'sub2;sub1;' + p, env1['ENV']['PATH']
+
+ def test_PrependUnique(self):
+ """Test prepending unique values to construction variables
+
+ This strips values that are already present when lists are
+ involved."""
+ env = self.TestEnvironment(AAA1 = 'a1',
+ AAA2 = 'a2',
+ AAA3 = 'a3',
+ AAA4 = 'a4',
+ AAA5 = 'a5',
+ BBB1 = ['b1'],
+ BBB2 = ['b2'],
+ BBB3 = ['b3'],
+ BBB4 = ['b4'],
+ BBB5 = ['b5'],
+ CCC1 = '',
+ CCC2 = '',
+ DDD1 = ['a', 'b', 'c'])
+ env.PrependUnique(AAA1 = 'a1',
+ AAA2 = ['a2'],
+ AAA3 = ['a3', 'b', 'c', 'b', 'a3'], # ignore dups
+ AAA4 = 'a4.new',
+ AAA5 = ['a5.new'],
+ BBB1 = 'b1',
+ BBB2 = ['b2'],
+ BBB3 = ['b3', 'b', 'c', 'b3'],
+ BBB4 = 'b4.new',
+ BBB5 = ['b5.new'],
+ CCC1 = 'c1',
+ CCC2 = ['c2'],
+ DDD1 = 'b')
+ assert env['AAA1'] == 'a1a1', env['AAA1']
+ assert env['AAA2'] == ['a2'], env['AAA2']
+ assert env['AAA3'] == ['c', 'b', 'a3'], env['AAA3']
+ assert env['AAA4'] == 'a4.newa4', env['AAA4']
+ assert env['AAA5'] == ['a5.new', 'a5'], env['AAA5']
+ assert env['BBB1'] == ['b1'], env['BBB1']
+ assert env['BBB2'] == ['b2'], env['BBB2']
+ assert env['BBB3'] == ['b', 'c', 'b3'], env['BBB3']
+ assert env['BBB4'] == ['b4.new', 'b4'], env['BBB4']
+ assert env['BBB5'] == ['b5.new', 'b5'], env['BBB5']
+ assert env['CCC1'] == 'c1', env['CCC1']
+ assert env['CCC2'] == ['c2'], env['CCC2']
+ assert env['DDD1'] == ['a', 'b', 'c'], env['DDD1']
+
+ env.PrependUnique(DDD1 = 'b', delete_existing=1)
+ assert env['DDD1'] == ['b', 'a', 'c'], env['DDD1'] # b moves to front
+ env.PrependUnique(DDD1 = ['a','c'], delete_existing=1)
+ assert env['DDD1'] == ['a', 'c', 'b'], env['DDD1'] # a & c move to front
+ env.PrependUnique(DDD1 = ['d','e','d'], delete_existing=1)
+ assert env['DDD1'] == ['d', 'e', 'a', 'c', 'b'], env['DDD1']
+
+
+ env['CLVar'] = CLVar([])
+ env.PrependUnique(CLVar = 'bar')
+ result = env['CLVar']
+ assert isinstance(result, CLVar), repr(result)
+ assert result == ['bar'], result
+
+ env['CLVar'] = CLVar(['abc'])
+ env.PrependUnique(CLVar = 'bar')
+ result = env['CLVar']
+ assert isinstance(result, CLVar), repr(result)
+ assert result == ['bar', 'abc'], result
+
+ env['CLVar'] = CLVar(['bar'])
+ env.PrependUnique(CLVar = 'bar')
+ result = env['CLVar']
+ assert isinstance(result, CLVar), repr(result)
+ assert result == ['bar'], result
+
+ def test_Replace(self):
+ """Test replacing construction variables in an Environment
+
+ After creation of the Environment, of course.
+ """
+ env1 = self.TestEnvironment(AAA = 'a', BBB = 'b')
+ env1.Replace(BBB = 'bbb', CCC = 'ccc')
+
+ env2 = self.TestEnvironment(AAA = 'a', BBB = 'bbb', CCC = 'ccc')
+ assert env1 == env2, diff_env(env1, env2)
+
+ b1 = Builder()
+ b2 = Builder()
+ env3 = self.TestEnvironment(BUILDERS = {'b1' : b1})
+ assert hasattr(env3, 'b1'), "b1 was not set"
+ env3.Replace(BUILDERS = {'b2' : b2})
+ assert not hasattr(env3, 'b1'), "b1 was not cleared"
+ assert hasattr(env3, 'b2'), "b2 was not set"
+
+ def test_ReplaceIxes(self):
+ "Test ReplaceIxes()"
+ env = self.TestEnvironment(LIBPREFIX='lib',
+ LIBSUFFIX='.a',
+ SHLIBPREFIX='lib',
+ SHLIBSUFFIX='.so',
+ PREFIX='pre',
+ SUFFIX='post')
+
+ assert 'libfoo.a' == env.ReplaceIxes('libfoo.so',
+ 'SHLIBPREFIX', 'SHLIBSUFFIX',
+ 'LIBPREFIX', 'LIBSUFFIX')
+
+ assert os.path.join('dir', 'libfoo.a') == env.ReplaceIxes(os.path.join('dir', 'libfoo.so'),
+ 'SHLIBPREFIX', 'SHLIBSUFFIX',
+ 'LIBPREFIX', 'LIBSUFFIX')
+
+ assert 'libfoo.a' == env.ReplaceIxes('prefoopost',
+ 'PREFIX', 'SUFFIX',
+ 'LIBPREFIX', 'LIBSUFFIX')
+
+ def test_SetDefault(self):
+ """Test the SetDefault method"""
+ env = self.TestEnvironment(tools = [])
+ env.SetDefault(V1 = 1)
+ env.SetDefault(V1 = 2)
+ assert env['V1'] == 1
+ env['V2'] = 2
+ env.SetDefault(V2 = 1)
+ assert env['V2'] == 2
+
+ def test_Tool(self):
+ """Test the Tool() method"""
+ env = self.TestEnvironment(LINK='link', NONE='no-such-tool')
+
+ exc_caught = None
+ try:
+ env.Tool('does_not_exist')
+ except SCons.Errors.EnvironmentError:
+ exc_caught = 1
+ assert exc_caught, "did not catch expected EnvironmentError"
+
+ exc_caught = None
+ try:
+ env.Tool('$NONE')
+ except SCons.Errors.EnvironmentError:
+ exc_caught = 1
+ assert exc_caught, "did not catch expected EnvironmentError"
+
+ # Use a non-existent toolpath directory just to make sure we
+ # can call Tool() with the keyword argument.
+ env.Tool('cc', toolpath=['/no/such/directory'])
+ assert env['CC'] == 'cc', env['CC']
+
+ env.Tool('$LINK')
+ assert env['LINK'] == '$SMARTLINK', env['LINK']
+
+ # Test that the environment stores the toolpath and
+ # re-uses it for later calls.
+ test = TestCmd.TestCmd(workdir = '')
+
+ test.write('xxx.py', """\
+def exists(env):
+ 1
+def generate(env):
+ env['XXX'] = 'one'
+""")
+
+ test.write('yyy.py', """\
+def exists(env):
+ 1
+def generate(env):
+ env['YYY'] = 'two'
+""")
+
+ env = self.TestEnvironment(tools=['xxx'], toolpath=[test.workpath('')])
+ assert env['XXX'] == 'one', env['XXX']
+ env.Tool('yyy')
+ assert env['YYY'] == 'two', env['YYY']
+
+ def test_WhereIs(self):
+ """Test the WhereIs() method"""
+ test = TestCmd.TestCmd(workdir = '')
+
+ sub1_xxx_exe = test.workpath('sub1', 'xxx.exe')
+ sub2_xxx_exe = test.workpath('sub2', 'xxx.exe')
+ sub3_xxx_exe = test.workpath('sub3', 'xxx.exe')
+ sub4_xxx_exe = test.workpath('sub4', 'xxx.exe')
+
+ test.subdir('subdir', 'sub1', 'sub2', 'sub3', 'sub4')
+
+ if sys.platform != 'win32':
+ test.write(sub1_xxx_exe, "\n")
+
+ os.mkdir(sub2_xxx_exe)
+
+ test.write(sub3_xxx_exe, "\n")
+ os.chmod(sub3_xxx_exe, 0o777)
+
+ test.write(sub4_xxx_exe, "\n")
+ os.chmod(sub4_xxx_exe, 0o777)
+
+ env_path = os.environ['PATH']
+
+ pathdirs_1234 = [ test.workpath('sub1'),
+ test.workpath('sub2'),
+ test.workpath('sub3'),
+ test.workpath('sub4'),
+ ] + env_path.split(os.pathsep)
+
+ pathdirs_1243 = [ test.workpath('sub1'),
+ test.workpath('sub2'),
+ test.workpath('sub4'),
+ test.workpath('sub3'),
+ ] + env_path.split(os.pathsep)
+
+ path = os.pathsep.join(pathdirs_1234)
+ env = self.TestEnvironment(ENV = {'PATH' : path})
+ wi = env.WhereIs('xxx.exe')
+ assert wi == test.workpath(sub3_xxx_exe), wi
+ wi = env.WhereIs('xxx.exe', pathdirs_1243)
+ assert wi == test.workpath(sub4_xxx_exe), wi
+ wi = env.WhereIs('xxx.exe', os.pathsep.join(pathdirs_1243))
+ assert wi == test.workpath(sub4_xxx_exe), wi
+
+ wi = env.WhereIs('xxx.exe', reject = sub3_xxx_exe)
+ assert wi == test.workpath(sub4_xxx_exe), wi
+ wi = env.WhereIs('xxx.exe', pathdirs_1243, reject = sub3_xxx_exe)
+ assert wi == test.workpath(sub4_xxx_exe), wi
+
+ path = os.pathsep.join(pathdirs_1243)
+ env = self.TestEnvironment(ENV = {'PATH' : path})
+ wi = env.WhereIs('xxx.exe')
+ assert wi == test.workpath(sub4_xxx_exe), wi
+ wi = env.WhereIs('xxx.exe', pathdirs_1234)
+ assert wi == test.workpath(sub3_xxx_exe), wi
+ wi = env.WhereIs('xxx.exe', os.pathsep.join(pathdirs_1234))
+ assert wi == test.workpath(sub3_xxx_exe), wi
+
+ if sys.platform == 'win32':
+ wi = env.WhereIs('xxx', pathext = '')
+ assert wi is None, wi
+
+ wi = env.WhereIs('xxx', pathext = '.exe')
+ assert wi == test.workpath(sub4_xxx_exe), wi
+
+ wi = env.WhereIs('xxx', path = pathdirs_1234, pathext = '.BAT;.EXE')
+ assert wi.lower() == test.workpath(sub3_xxx_exe).lower(), wi
+
+ # Test that we return a normalized path even when
+ # the path contains forward slashes.
+ forward_slash = test.workpath('') + '/sub3'
+ wi = env.WhereIs('xxx', path = forward_slash, pathext = '.EXE')
+ assert wi.lower() == test.workpath(sub3_xxx_exe).lower(), wi
+
+
+
+ def test_Action(self):
+ """Test the Action() method"""
+ import SCons.Action
+
+ env = self.TestEnvironment(FOO = 'xyzzy')
+
+ a = env.Action('foo')
+ assert a, a
+ assert a.__class__ is SCons.Action.CommandAction, a.__class__
+
+ a = env.Action('$FOO')
+ assert a, a
+ assert a.__class__ is SCons.Action.CommandAction, a.__class__
+
+ a = env.Action('$$FOO')
+ assert a, a
+ assert a.__class__ is SCons.Action.LazyAction, a.__class__
+
+ a = env.Action(['$FOO', 'foo'])
+ assert a, a
+ assert a.__class__ is SCons.Action.ListAction, a.__class__
+
+ def func(arg):
+ pass
+ a = env.Action(func)
+ assert a, a
+ assert a.__class__ is SCons.Action.FunctionAction, a.__class__
+
+ def test_AddPostAction(self):
+ """Test the AddPostAction() method"""
+ env = self.TestEnvironment(FOO='fff', BAR='bbb')
+
+ n = env.AddPostAction('$FOO', lambda x: x)
+ assert str(n[0]) == 'fff', n[0]
+
+ n = env.AddPostAction(['ggg', '$BAR'], lambda x: x)
+ assert str(n[0]) == 'ggg', n[0]
+ assert str(n[1]) == 'bbb', n[1]
+
+ def test_AddPreAction(self):
+ """Test the AddPreAction() method"""
+ env = self.TestEnvironment(FOO='fff', BAR='bbb')
+
+ n = env.AddPreAction('$FOO', lambda x: x)
+ assert str(n[0]) == 'fff', n[0]
+
+ n = env.AddPreAction(['ggg', '$BAR'], lambda x: x)
+ assert str(n[0]) == 'ggg', n[0]
+ assert str(n[1]) == 'bbb', n[1]
+
+ def test_Alias(self):
+ """Test the Alias() method"""
+ env = self.TestEnvironment(FOO='kkk', BAR='lll', EA='export_alias')
+
+ tgt = env.Alias('new_alias')[0]
+ assert str(tgt) == 'new_alias', tgt
+ assert tgt.sources == [], tgt.sources
+ assert not hasattr(tgt, 'builder'), tgt.builder
+
+ tgt = env.Alias('None_alias', None)[0]
+ assert str(tgt) == 'None_alias', tgt
+ assert tgt.sources == [], tgt.sources
+
+ tgt = env.Alias('empty_list', [])[0]
+ assert str(tgt) == 'empty_list', tgt
+ assert tgt.sources == [], tgt.sources
+
+ tgt = env.Alias('export_alias', [ 'asrc1', '$FOO' ])[0]
+ assert str(tgt) == 'export_alias', tgt
+ assert len(tgt.sources) == 2, list(map(str, tgt.sources))
+ assert str(tgt.sources[0]) == 'asrc1', list(map(str, tgt.sources))
+ assert str(tgt.sources[1]) == 'kkk', list(map(str, tgt.sources))
+
+ n = env.Alias(tgt, source = ['$BAR', 'asrc4'])[0]
+ assert n is tgt, n
+ assert len(tgt.sources) == 4, list(map(str, tgt.sources))
+ assert str(tgt.sources[2]) == 'lll', list(map(str, tgt.sources))
+ assert str(tgt.sources[3]) == 'asrc4', list(map(str, tgt.sources))
+
+ n = env.Alias('$EA', 'asrc5')[0]
+ assert n is tgt, n
+ assert len(tgt.sources) == 5, list(map(str, tgt.sources))
+ assert str(tgt.sources[4]) == 'asrc5', list(map(str, tgt.sources))
+
+ t1, t2 = env.Alias(['t1', 't2'], ['asrc6', 'asrc7'])
+ assert str(t1) == 't1', t1
+ assert str(t2) == 't2', t2
+ assert len(t1.sources) == 2, list(map(str, t1.sources))
+ assert str(t1.sources[0]) == 'asrc6', list(map(str, t1.sources))
+ assert str(t1.sources[1]) == 'asrc7', list(map(str, t1.sources))
+ assert len(t2.sources) == 2, list(map(str, t2.sources))
+ assert str(t2.sources[0]) == 'asrc6', list(map(str, t2.sources))
+ assert str(t2.sources[1]) == 'asrc7', list(map(str, t2.sources))
+
+ tgt = env.Alias('add', 's1')
+ tgt = env.Alias('add', 's2')[0]
+ s = list(map(str, tgt.sources))
+ assert s == ['s1', 's2'], s
+ tgt = env.Alias(tgt, 's3')[0]
+ s = list(map(str, tgt.sources))
+ assert s == ['s1', 's2', 's3'], s
+
+ tgt = env.Alias('act', None, "action1")[0]
+ s = str(tgt.builder.action)
+ assert s == "action1", s
+ tgt = env.Alias('act', None, "action2")[0]
+ s = str(tgt.builder.action)
+ assert s == "action1\naction2", s
+ tgt = env.Alias(tgt, None, "action3")[0]
+ s = str(tgt.builder.action)
+ assert s == "action1\naction2\naction3", s
+
+ def test_AlwaysBuild(self):
+ """Test the AlwaysBuild() method"""
+ env = self.TestEnvironment(FOO='fff', BAR='bbb')
+ t = env.AlwaysBuild('a', 'b$FOO', ['c', 'd'], '$BAR',
+ env.fs.Dir('dir'), env.fs.File('file'))
+ assert t[0].__class__.__name__ == 'Entry'
+ assert t[0].get_internal_path() == 'a'
+ assert t[0].always_build
+ assert t[1].__class__.__name__ == 'Entry'
+ assert t[1].get_internal_path() == 'bfff'
+ assert t[1].always_build
+ assert t[2].__class__.__name__ == 'Entry'
+ assert t[2].get_internal_path() == 'c'
+ assert t[2].always_build
+ assert t[3].__class__.__name__ == 'Entry'
+ assert t[3].get_internal_path() == 'd'
+ assert t[3].always_build
+ assert t[4].__class__.__name__ == 'Entry'
+ assert t[4].get_internal_path() == 'bbb'
+ assert t[4].always_build
+ assert t[5].__class__.__name__ == 'Dir'
+ assert t[5].get_internal_path() == 'dir'
+ assert t[5].always_build
+ assert t[6].__class__.__name__ == 'File'
+ assert t[6].get_internal_path() == 'file'
+ assert t[6].always_build
+
+ def test_VariantDir(self):
+ """Test the VariantDir() method"""
+ class MyFS(object):
+ def Dir(self, name):
+ return name
+ def VariantDir(self, variant_dir, src_dir, duplicate):
+ self.variant_dir = variant_dir
+ self.src_dir = src_dir
+ self.duplicate = duplicate
+
+ env = self.TestEnvironment(FOO = 'fff', BAR = 'bbb')
+ env.fs = MyFS()
+
+ env.VariantDir('build', 'src')
+ assert env.fs.variant_dir == 'build', env.fs.variant_dir
+ assert env.fs.src_dir == 'src', env.fs.src_dir
+ assert env.fs.duplicate == 1, env.fs.duplicate
+
+ env.VariantDir('build${FOO}', '${BAR}src', 0)
+ assert env.fs.variant_dir == 'buildfff', env.fs.variant_dir
+ assert env.fs.src_dir == 'bbbsrc', env.fs.src_dir
+ assert env.fs.duplicate == 0, env.fs.duplicate
+
+ def test_Builder(self):
+ """Test the Builder() method"""
+ env = self.TestEnvironment(FOO = 'xyzzy')
+
+ b = env.Builder(action = 'foo')
+ assert b is not None, b
+
+ b = env.Builder(action = '$FOO')
+ assert b is not None, b
+
+ b = env.Builder(action = ['$FOO', 'foo'])
+ assert b is not None, b
+
+ def func(arg):
+ pass
+ b = env.Builder(action = func)
+ assert b is not None, b
+ b = env.Builder(generator = func)
+ assert b is not None, b
+
+ def test_CacheDir(self):
+ """Test the CacheDir() method"""
+ env = self.TestEnvironment(CD = 'CacheDir')
+
+ env.CacheDir('foo')
+ assert env._CacheDir_path == 'foo', env._CacheDir_path
+
+ env.CacheDir('$CD')
+ assert env._CacheDir_path == 'CacheDir', env._CacheDir_path
+
+ def test_Clean(self):
+ """Test the Clean() method"""
+ env = self.TestEnvironment(FOO = 'fff', BAR = 'bbb')
+
+ CT = SCons.Environment.CleanTargets
+
+ foo = env.arg2nodes('foo')[0]
+ fff = env.arg2nodes('fff')[0]
+
+ t = env.Clean('foo', 'aaa')
+ l = list(map(str, CT[foo]))
+ assert l == ['aaa'], l
+
+ t = env.Clean(foo, ['$BAR', 'ccc'])
+ l = list(map(str, CT[foo]))
+ assert l == ['aaa', 'bbb', 'ccc'], l
+
+ eee = env.arg2nodes('eee')[0]
+
+ t = env.Clean('$FOO', 'ddd')
+ l = list(map(str, CT[fff]))
+ assert l == ['ddd'], l
+ t = env.Clean(fff, [eee, 'fff'])
+ l = list(map(str, CT[fff]))
+ assert l == ['ddd', 'eee', 'fff'], l
+
+ def test_Command(self):
+ """Test the Command() method."""
+ env = Environment()
+ t = env.Command(target='foo.out', source=['foo1.in', 'foo2.in'],
+ action='buildfoo $target $source')[0]
+ assert t.builder is not None
+ assert t.builder.action.__class__.__name__ == 'CommandAction'
+ assert t.builder.action.cmd_list == 'buildfoo $target $source'
+ assert 'foo1.in' in [x.get_internal_path() for x in t.sources]
+ assert 'foo2.in' in [x.get_internal_path() for x in t.sources]
+
+ sub = env.fs.Dir('sub')
+ t = env.Command(target='bar.out', source='sub',
+ action='buildbar $target $source')[0]
+ assert 'sub' in [x.get_internal_path() for x in t.sources]
+
+ def testFunc(env, target, source):
+ assert str(target[0]) == 'foo.out'
+ assert 'foo1.in' in list(map(str, source)) and 'foo2.in' in list(map(str, source)), list(map(str, source))
+ return 0
+ t = env.Command(target='foo.out', source=['foo1.in','foo2.in'],
+ action=testFunc)[0]
+ assert t.builder is not None
+ assert t.builder.action.__class__.__name__ == 'FunctionAction'
+ t.build()
+ assert 'foo1.in' in [x.get_internal_path() for x in t.sources]
+ assert 'foo2.in' in [x.get_internal_path() for x in t.sources]
+
+ x = []
+ def test2(baz, x=x):
+ x.append(baz)
+ env = self.TestEnvironment(TEST2 = test2)
+ t = env.Command(target='baz.out', source='baz.in',
+ action='${TEST2(XYZ)}',
+ XYZ='magic word')[0]
+ assert t.builder is not None
+ t.build()
+ assert x[0] == 'magic word', x
+
+ t = env.Command(target='${X}.out', source='${X}.in',
+ action = 'foo',
+ X = 'xxx')[0]
+ assert str(t) == 'xxx.out', str(t)
+ assert 'xxx.in' in [x.get_internal_path() for x in t.sources]
+
+ env = self.TestEnvironment(source_scanner = 'should_not_find_this')
+ t = env.Command(target='file.out', source='file.in',
+ action = 'foo',
+ source_scanner = 'fake')[0]
+ assert t.builder.source_scanner == 'fake', t.builder.source_scanner
+
+ def test_Configure(self):
+ """Test the Configure() method"""
+ # Configure() will write to a local temporary file.
+ test = TestCmd.TestCmd(workdir = '')
+ save = os.getcwd()
+
+ try:
+ os.chdir(test.workpath())
+
+ env = self.TestEnvironment(FOO = 'xyzzy')
+
+ def func(arg):
+ pass
+
+ c = env.Configure()
+ assert c is not None, c
+ c.Finish()
+
+ c = env.Configure(custom_tests = {'foo' : func, '$FOO' : func})
+ assert c is not None, c
+ assert hasattr(c, 'foo')
+ assert hasattr(c, 'xyzzy')
+ c.Finish()
+ finally:
+ os.chdir(save)
+
+ def test_Depends(self):
+ """Test the explicit Depends method."""
+ env = self.TestEnvironment(FOO = 'xxx', BAR='yyy')
+ env.Dir('dir1')
+ env.Dir('dir2')
+ env.File('xxx.py')
+ env.File('yyy.py')
+ t = env.Depends(target='EnvironmentTest.py',
+ dependency='Environment.py')[0]
+ assert t.__class__.__name__ == 'Entry', t.__class__.__name__
+ assert t.get_internal_path() == 'EnvironmentTest.py'
+ assert len(t.depends) == 1
+ d = t.depends[0]
+ assert d.__class__.__name__ == 'Entry', d.__class__.__name__
+ assert d.get_internal_path() == 'Environment.py'
+
+ t = env.Depends(target='${FOO}.py', dependency='${BAR}.py')[0]
+ assert t.__class__.__name__ == 'File', t.__class__.__name__
+ assert t.get_internal_path() == 'xxx.py'
+ assert len(t.depends) == 1
+ d = t.depends[0]
+ assert d.__class__.__name__ == 'File', d.__class__.__name__
+ assert d.get_internal_path() == 'yyy.py'
+
+ t = env.Depends(target='dir1', dependency='dir2')[0]
+ assert t.__class__.__name__ == 'Dir', t.__class__.__name__
+ assert t.get_internal_path() == 'dir1'
+ assert len(t.depends) == 1
+ d = t.depends[0]
+ assert d.__class__.__name__ == 'Dir', d.__class__.__name__
+ assert d.get_internal_path() == 'dir2'
+
+ def test_Dir(self):
+ """Test the Dir() method"""
+ class MyFS(object):
+ def Dir(self, name):
+ return 'Dir(%s)' % name
+
+ env = self.TestEnvironment(FOO = 'foodir', BAR = 'bardir')
+ env.fs = MyFS()
+
+ d = env.Dir('d')
+ assert d == 'Dir(d)', d
+
+ d = env.Dir('$FOO')
+ assert d == 'Dir(foodir)', d
+
+ d = env.Dir('${BAR}_$BAR')
+ assert d == 'Dir(bardir_bardir)', d
+
+ d = env.Dir(['dir1'])
+ assert d == ['Dir(dir1)'], d
+
+ d = env.Dir(['dir1', 'dir2'])
+ assert d == ['Dir(dir1)', 'Dir(dir2)'], d
+
+ def test_NoClean(self):
+ """Test the NoClean() method"""
+ env = self.TestEnvironment(FOO='ggg', BAR='hhh')
+ env.Dir('p_hhhb')
+ env.File('p_d')
+ t = env.NoClean('p_a', 'p_${BAR}b', ['p_c', 'p_d'], 'p_$FOO')
+
+ assert t[0].__class__.__name__ == 'Entry', t[0].__class__.__name__
+ assert t[0].get_internal_path() == 'p_a'
+ assert t[0].noclean
+ assert t[1].__class__.__name__ == 'Dir', t[1].__class__.__name__
+ assert t[1].get_internal_path() == 'p_hhhb'
+ assert t[1].noclean
+ assert t[2].__class__.__name__ == 'Entry', t[2].__class__.__name__
+ assert t[2].get_internal_path() == 'p_c'
+ assert t[2].noclean
+ assert t[3].__class__.__name__ == 'File', t[3].__class__.__name__
+ assert t[3].get_internal_path() == 'p_d'
+ assert t[3].noclean
+ assert t[4].__class__.__name__ == 'Entry', t[4].__class__.__name__
+ assert t[4].get_internal_path() == 'p_ggg'
+ assert t[4].noclean
+
+ def test_Dump(self):
+ """Test the Dump() method"""
+
+ env = self.TestEnvironment(FOO = 'foo')
+ assert env.Dump('FOO') == "'foo'", env.Dump('FOO')
+ assert len(env.Dump()) > 200, env.Dump() # no args version
+
+ def test_Environment(self):
+ """Test the Environment() method"""
+ env = self.TestEnvironment(FOO = 'xxx', BAR = 'yyy')
+
+ e2 = env.Environment(X = '$FOO', Y = '$BAR')
+ assert e2['X'] == 'xxx', e2['X']
+ assert e2['Y'] == 'yyy', e2['Y']
+
+ def test_Execute(self):
+ """Test the Execute() method"""
+
+ class MyAction(object):
+ def __init__(self, *args, **kw):
+ self.args = args
+ def __call__(self, target, source, env):
+ return "%s executed" % self.args
+
+ env = Environment()
+ env.Action = MyAction
+
+ result = env.Execute("foo")
+ assert result == "foo executed", result
+
+ def test_Entry(self):
+ """Test the Entry() method"""
+ class MyFS(object):
+ def Entry(self, name):
+ return 'Entry(%s)' % name
+
+ env = self.TestEnvironment(FOO = 'fooentry', BAR = 'barentry')
+ env.fs = MyFS()
+
+ e = env.Entry('e')
+ assert e == 'Entry(e)', e
+
+ e = env.Entry('$FOO')
+ assert e == 'Entry(fooentry)', e
+
+ e = env.Entry('${BAR}_$BAR')
+ assert e == 'Entry(barentry_barentry)', e
+
+ e = env.Entry(['entry1'])
+ assert e == ['Entry(entry1)'], e
+
+ e = env.Entry(['entry1', 'entry2'])
+ assert e == ['Entry(entry1)', 'Entry(entry2)'], e
+
+ def test_File(self):
+ """Test the File() method"""
+ class MyFS(object):
+ def File(self, name):
+ return 'File(%s)' % name
+
+ env = self.TestEnvironment(FOO = 'foofile', BAR = 'barfile')
+ env.fs = MyFS()
+
+ f = env.File('f')
+ assert f == 'File(f)', f
+
+ f = env.File('$FOO')
+ assert f == 'File(foofile)', f
+
+ f = env.File('${BAR}_$BAR')
+ assert f == 'File(barfile_barfile)', f
+
+ f = env.File(['file1'])
+ assert f == ['File(file1)'], f
+
+ f = env.File(['file1', 'file2'])
+ assert f == ['File(file1)', 'File(file2)'], f
+
+ def test_FindFile(self):
+ """Test the FindFile() method"""
+ env = self.TestEnvironment(FOO = 'fff', BAR = 'bbb')
+
+ r = env.FindFile('foo', ['no_such_directory'])
+ assert r is None, r
+
+ # XXX
+
+ def test_Flatten(self):
+ """Test the Flatten() method"""
+ env = Environment()
+ l = env.Flatten([1])
+ assert l == [1]
+ l = env.Flatten([1, [2, [3, [4]]]])
+ assert l == [1, 2, 3, 4], l
+
+ def test_GetBuildPath(self):
+ """Test the GetBuildPath() method."""
+ env = self.TestEnvironment(MAGIC = 'xyzzy')
+
+ p = env.GetBuildPath('foo')
+ assert p == 'foo', p
+
+ p = env.GetBuildPath('$MAGIC')
+ assert p == 'xyzzy', p
+
+ def test_Ignore(self):
+ """Test the explicit Ignore method."""
+ env = self.TestEnvironment(FOO='yyy', BAR='zzz')
+ env.Dir('dir1')
+ env.Dir('dir2')
+ env.File('yyyzzz')
+ env.File('zzzyyy')
+
+ t = env.Ignore(target='targ.py', dependency='dep.py')[0]
+ assert t.__class__.__name__ == 'Entry', t.__class__.__name__
+ assert t.get_internal_path() == 'targ.py'
+ assert len(t.ignore) == 1
+ i = t.ignore[0]
+ assert i.__class__.__name__ == 'Entry', i.__class__.__name__
+ assert i.get_internal_path() == 'dep.py'
+
+ t = env.Ignore(target='$FOO$BAR', dependency='$BAR$FOO')[0]
+ assert t.__class__.__name__ == 'File', t.__class__.__name__
+ assert t.get_internal_path() == 'yyyzzz'
+ assert len(t.ignore) == 1
+ i = t.ignore[0]
+ assert i.__class__.__name__ == 'File', i.__class__.__name__
+ assert i.get_internal_path() == 'zzzyyy'
+
+ t = env.Ignore(target='dir1', dependency='dir2')[0]
+ assert t.__class__.__name__ == 'Dir', t.__class__.__name__
+ assert t.get_internal_path() == 'dir1'
+ assert len(t.ignore) == 1
+ i = t.ignore[0]
+ assert i.__class__.__name__ == 'Dir', i.__class__.__name__
+ assert i.get_internal_path() == 'dir2'
+
+ def test_Literal(self):
+ """Test the Literal() method"""
+ env = self.TestEnvironment(FOO='fff', BAR='bbb')
+ list = env.subst_list([env.Literal('$FOO'), '$BAR'])[0]
+ assert list == ['$FOO', 'bbb'], list
+ list = env.subst_list(['$FOO', env.Literal('$BAR')])[0]
+ assert list == ['fff', '$BAR'], list
+
+ def test_Local(self):
+ """Test the Local() method."""
+ env = self.TestEnvironment(FOO='lll')
+
+ l = env.Local(env.fs.File('fff'))
+ assert str(l[0]) == 'fff', l[0]
+
+ l = env.Local('ggg', '$FOO')
+ assert str(l[0]) == 'ggg', l[0]
+ assert str(l[1]) == 'lll', l[1]
+
+ def test_Precious(self):
+ """Test the Precious() method"""
+ env = self.TestEnvironment(FOO='ggg', BAR='hhh')
+ env.Dir('p_hhhb')
+ env.File('p_d')
+ t = env.Precious('p_a', 'p_${BAR}b', ['p_c', 'p_d'], 'p_$FOO')
+
+ assert t[0].__class__.__name__ == 'Entry', t[0].__class__.__name__
+ assert t[0].get_internal_path() == 'p_a'
+ assert t[0].precious
+ assert t[1].__class__.__name__ == 'Dir', t[1].__class__.__name__
+ assert t[1].get_internal_path() == 'p_hhhb'
+ assert t[1].precious
+ assert t[2].__class__.__name__ == 'Entry', t[2].__class__.__name__
+ assert t[2].get_internal_path() == 'p_c'
+ assert t[2].precious
+ assert t[3].__class__.__name__ == 'File', t[3].__class__.__name__
+ assert t[3].get_internal_path() == 'p_d'
+ assert t[3].precious
+ assert t[4].__class__.__name__ == 'Entry', t[4].__class__.__name__
+ assert t[4].get_internal_path() == 'p_ggg'
+ assert t[4].precious
+
+ def test_Pseudo(self):
+ """Test the Pseudo() method"""
+ env = self.TestEnvironment(FOO='ggg', BAR='hhh')
+ env.Dir('p_hhhb')
+ env.File('p_d')
+ t = env.Pseudo('p_a', 'p_${BAR}b', ['p_c', 'p_d'], 'p_$FOO')
+
+ assert t[0].__class__.__name__ == 'Entry', t[0].__class__.__name__
+ assert t[0].get_internal_path() == 'p_a'
+ assert t[0].pseudo
+ assert t[1].__class__.__name__ == 'Dir', t[1].__class__.__name__
+ assert t[1].get_internal_path() == 'p_hhhb'
+ assert t[1].pseudo
+ assert t[2].__class__.__name__ == 'Entry', t[2].__class__.__name__
+ assert t[2].get_internal_path() == 'p_c'
+ assert t[2].pseudo
+ assert t[3].__class__.__name__ == 'File', t[3].__class__.__name__
+ assert t[3].get_internal_path() == 'p_d'
+ assert t[3].pseudo
+ assert t[4].__class__.__name__ == 'Entry', t[4].__class__.__name__
+ assert t[4].get_internal_path() == 'p_ggg'
+ assert t[4].pseudo
+
+ def test_Repository(self):
+ """Test the Repository() method."""
+ class MyFS(object):
+ def __init__(self):
+ self.list = []
+ def Repository(self, *dirs):
+ self.list.extend(list(dirs))
+ def Dir(self, name):
+ return name
+ env = self.TestEnvironment(FOO='rrr', BAR='sss')
+ env.fs = MyFS()
+ env.Repository('/tmp/foo')
+ env.Repository('/tmp/$FOO', '/tmp/$BAR/foo')
+ expect = ['/tmp/foo', '/tmp/rrr', '/tmp/sss/foo']
+ assert env.fs.list == expect, env.fs.list
+
+ def test_Scanner(self):
+ """Test the Scanner() method"""
+ def scan(node, env, target, arg):
+ pass
+
+ env = self.TestEnvironment(FOO = scan)
+
+ s = env.Scanner('foo')
+ assert s is not None, s
+
+ s = env.Scanner(function = 'foo')
+ assert s is not None, s
+
+ if 0:
+ s = env.Scanner('$FOO')
+ assert s is not None, s
+
+ s = env.Scanner(function = '$FOO')
+ assert s is not None, s
+
+ def test_SConsignFile(self):
+ """Test the SConsignFile() method"""
+ import SCons.SConsign
+
+ class MyFS(object):
+ SConstruct_dir = os.sep + 'dir'
+
+ env = self.TestEnvironment(FOO = 'SConsign',
+ BAR = os.path.join(os.sep, 'File'))
+ env.fs = MyFS()
+ env.Execute = lambda action: None
+
+ try:
+ fnames = []
+ dbms = []
+ def capture(name, dbm_module, fnames=fnames, dbms=dbms):
+ fnames.append(name)
+ dbms.append(dbm_module)
+
+ save_SConsign_File = SCons.SConsign.File
+ SCons.SConsign.File = capture
+
+ env.SConsignFile('foo')
+ assert fnames[-1] == os.path.join(os.sep, 'dir', 'foo'), fnames
+ assert dbms[-1] is None, dbms
+
+ env.SConsignFile('$FOO')
+ assert fnames[-1] == os.path.join(os.sep, 'dir', 'SConsign'), fnames
+ assert dbms[-1] is None, dbms
+
+ env.SConsignFile('/$FOO')
+ assert fnames[-1] == os.sep + 'SConsign', fnames
+ assert dbms[-1] is None, dbms
+
+ env.SConsignFile(os.sep + '$FOO')
+ assert fnames[-1] == os.sep + 'SConsign', fnames
+ assert dbms[-1] is None, dbms
+
+ env.SConsignFile('$BAR', 'x')
+ assert fnames[-1] == os.path.join(os.sep, 'File'), fnames
+ assert dbms[-1] == 'x', dbms
+
+ env.SConsignFile('__$BAR', 7)
+ assert fnames[-1] == os.path.join(os.sep, 'dir', '__', 'File'), fnames
+ assert dbms[-1] == 7, dbms
+
+ env.SConsignFile()
+ assert fnames[-1] == os.path.join(os.sep, 'dir', '.sconsign'), fnames
+ assert dbms[-1] is None, dbms
+
+ env.SConsignFile(None)
+ assert fnames[-1] is None, fnames
+ assert dbms[-1] is None, dbms
+ finally:
+ SCons.SConsign.File = save_SConsign_File
+
+ def test_SideEffect(self):
+ """Test the SideEffect() method"""
+ env = self.TestEnvironment(LIB='lll', FOO='fff', BAR='bbb')
+ env.File('mylll.pdb')
+ env.Dir('mymmm.pdb')
+
+ foo = env.Object('foo.obj', 'foo.cpp')[0]
+ bar = env.Object('bar.obj', 'bar.cpp')[0]
+ s = env.SideEffect('mylib.pdb', ['foo.obj', 'bar.obj'])[0]
+ assert s.__class__.__name__ == 'Entry', s.__class__.__name__
+ assert s.get_internal_path() == 'mylib.pdb'
+ assert s.side_effect
+ assert foo.side_effects == [s]
+ assert bar.side_effects == [s]
+
+ fff = env.Object('fff.obj', 'fff.cpp')[0]
+ bbb = env.Object('bbb.obj', 'bbb.cpp')[0]
+ s = env.SideEffect('my${LIB}.pdb', ['${FOO}.obj', '${BAR}.obj'])[0]
+ assert s.__class__.__name__ == 'File', s.__class__.__name__
+ assert s.get_internal_path() == 'mylll.pdb'
+ assert s.side_effect
+ assert fff.side_effects == [s], fff.side_effects
+ assert bbb.side_effects == [s], bbb.side_effects
+
+ ggg = env.Object('ggg.obj', 'ggg.cpp')[0]
+ ccc = env.Object('ccc.obj', 'ccc.cpp')[0]
+ s = env.SideEffect('mymmm.pdb', ['ggg.obj', 'ccc.obj'])[0]
+ assert s.__class__.__name__ == 'Dir', s.__class__.__name__
+ assert s.get_internal_path() == 'mymmm.pdb'
+ assert s.side_effect
+ assert ggg.side_effects == [s], ggg.side_effects
+ assert ccc.side_effects == [s], ccc.side_effects
+
+ def test_SourceCode(self):
+ """Test the SourceCode() method."""
+ env = self.TestEnvironment(FOO='mmm', BAR='nnn')
+ e = env.SourceCode('foo', None)[0]
+ assert e.get_internal_path() == 'foo'
+ s = e.src_builder()
+ assert s is None, s
+
+ b = Builder()
+ e = env.SourceCode(e, b)[0]
+ assert e.get_internal_path() == 'foo'
+ s = e.src_builder()
+ assert s is b, s
+
+ e = env.SourceCode('$BAR$FOO', None)[0]
+ assert e.get_internal_path() == 'nnnmmm'
+ s = e.src_builder()
+ assert s is None, s
+
+ def test_SourceSignatures(type):
+ """Test the SourceSignatures() method"""
+ import SCons.Errors
+
+ env = type.TestEnvironment(M = 'MD5', T = 'timestamp')
+
+ exc_caught = None
+ try:
+ env.SourceSignatures('invalid_type')
+ except SCons.Errors.UserError:
+ exc_caught = 1
+ assert exc_caught, "did not catch expected UserError"
+
+ env.SourceSignatures('MD5')
+ assert env.src_sig_type == 'MD5', env.src_sig_type
+
+ env.SourceSignatures('$M')
+ assert env.src_sig_type == 'MD5', env.src_sig_type
+
+ env.SourceSignatures('timestamp')
+ assert env.src_sig_type == 'timestamp', env.src_sig_type
+
+ env.SourceSignatures('$T')
+ assert env.src_sig_type == 'timestamp', env.src_sig_type
+
+ try:
+ import SCons.Util
+ save_md5 = SCons.Util.md5
+ SCons.Util.md5 = None
+ try:
+ env.SourceSignatures('MD5')
+ except SCons.Errors.UserError:
+ pass
+ else:
+ self.fail('Did not catch expected UserError')
+ finally:
+ SCons.Util.md5 = save_md5
+
+ def test_Split(self):
+ """Test the Split() method"""
+ env = self.TestEnvironment(FOO='fff', BAR='bbb')
+ s = env.Split("foo bar")
+ assert s == ["foo", "bar"], s
+ s = env.Split("$FOO bar")
+ assert s == ["fff", "bar"], s
+ s = env.Split(["foo", "bar"])
+ assert s == ["foo", "bar"], s
+ s = env.Split(["foo", "${BAR}-bbb"])
+ assert s == ["foo", "bbb-bbb"], s
+ s = env.Split("foo")
+ assert s == ["foo"], s
+ s = env.Split("$FOO$BAR")
+ assert s == ["fffbbb"], s
+
+ def test_TargetSignatures(type):
+ """Test the TargetSignatures() method"""
+ import SCons.Errors
+
+ env = type.TestEnvironment(B = 'build', C = 'content')
+
+ exc_caught = None
+ try:
+ env.TargetSignatures('invalid_type')
+ except SCons.Errors.UserError:
+ exc_caught = 1
+ assert exc_caught, "did not catch expected UserError"
+ assert not hasattr(env, '_build_signature')
+
+ env.TargetSignatures('build')
+ assert env.tgt_sig_type == 'build', env.tgt_sig_type
+
+ env.TargetSignatures('$B')
+ assert env.tgt_sig_type == 'build', env.tgt_sig_type
+
+ env.TargetSignatures('content')
+ assert env.tgt_sig_type == 'content', env.tgt_sig_type
+
+ env.TargetSignatures('$C')
+ assert env.tgt_sig_type == 'content', env.tgt_sig_type
+
+ env.TargetSignatures('MD5')
+ assert env.tgt_sig_type == 'MD5', env.tgt_sig_type
+
+ env.TargetSignatures('timestamp')
+ assert env.tgt_sig_type == 'timestamp', env.tgt_sig_type
+
+ try:
+ import SCons.Util
+ save_md5 = SCons.Util.md5
+ SCons.Util.md5 = None
+ try:
+ env.TargetSignatures('MD5')
+ except SCons.Errors.UserError:
+ pass
+ else:
+ self.fail('Did not catch expected UserError')
+ try:
+ env.TargetSignatures('content')
+ except SCons.Errors.UserError:
+ pass
+ else:
+ self.fail('Did not catch expected UserError')
+ finally:
+ SCons.Util.md5 = save_md5
+
+ def test_Value(self):
+ """Test creating a Value() object
+ """
+ env = Environment()
+ v1 = env.Value('a')
+ assert v1.value == 'a', v1.value
+
+ value2 = 'a'
+ v2 = env.Value(value2)
+ assert v2.value == value2, v2.value
+ assert v2.value is value2, v2.value
+
+ assert not v1 is v2
+ assert v1.value == v2.value
+
+ v3 = env.Value('c', 'build-c')
+ assert v3.value == 'c', v3.value
+
+
+
+ def test_Environment_global_variable(type):
+ """Test setting Environment variable to an Environment.Base subclass"""
+ class MyEnv(SCons.Environment.Base):
+ def xxx(self, string):
+ return self.subst(string)
+
+ SCons.Environment.Environment = MyEnv
+
+ env = SCons.Environment.Environment(FOO = 'foo')
+
+ f = env.subst('$FOO')
+ assert f == 'foo', f
+
+ f = env.xxx('$FOO')
+ assert f == 'foo', f
+
+ def test_bad_keywords(self):
+ """Test trying to use reserved keywords in an Environment"""
+ added = []
+
+ env = self.TestEnvironment(TARGETS = 'targets',
+ SOURCES = 'sources',
+ SOURCE = 'source',
+ TARGET = 'target',
+ CHANGED_SOURCES = 'changed_sources',
+ CHANGED_TARGETS = 'changed_targets',
+ UNCHANGED_SOURCES = 'unchanged_sources',
+ UNCHANGED_TARGETS = 'unchanged_targets',
+ INIT = 'init')
+ bad_msg = '%s is not reserved, but got omitted; see Environment.construction_var_name_ok'
+ added.append('INIT')
+ for x in self.reserved_variables:
+ assert x not in env, env[x]
+ for x in added:
+ assert x in env, bad_msg % x
+
+ env.Append(TARGETS = 'targets',
+ SOURCES = 'sources',
+ SOURCE = 'source',
+ TARGET = 'target',
+ CHANGED_SOURCES = 'changed_sources',
+ CHANGED_TARGETS = 'changed_targets',
+ UNCHANGED_SOURCES = 'unchanged_sources',
+ UNCHANGED_TARGETS = 'unchanged_targets',
+ APPEND = 'append')
+ added.append('APPEND')
+ for x in self.reserved_variables:
+ assert x not in env, env[x]
+ for x in added:
+ assert x in env, bad_msg % x
+
+ env.AppendUnique(TARGETS = 'targets',
+ SOURCES = 'sources',
+ SOURCE = 'source',
+ TARGET = 'target',
+ CHANGED_SOURCES = 'changed_sources',
+ CHANGED_TARGETS = 'changed_targets',
+ UNCHANGED_SOURCES = 'unchanged_sources',
+ UNCHANGED_TARGETS = 'unchanged_targets',
+ APPENDUNIQUE = 'appendunique')
+ added.append('APPENDUNIQUE')
+ for x in self.reserved_variables:
+ assert x not in env, env[x]
+ for x in added:
+ assert x in env, bad_msg % x
+
+ env.Prepend(TARGETS = 'targets',
+ SOURCES = 'sources',
+ SOURCE = 'source',
+ TARGET = 'target',
+ CHANGED_SOURCES = 'changed_sources',
+ CHANGED_TARGETS = 'changed_targets',
+ UNCHANGED_SOURCES = 'unchanged_sources',
+ UNCHANGED_TARGETS = 'unchanged_targets',
+ PREPEND = 'prepend')
+ added.append('PREPEND')
+ for x in self.reserved_variables:
+ assert x not in env, env[x]
+ for x in added:
+ assert x in env, bad_msg % x
+
+ env.Prepend(TARGETS = 'targets',
+ SOURCES = 'sources',
+ SOURCE = 'source',
+ TARGET = 'target',
+ CHANGED_SOURCES = 'changed_sources',
+ CHANGED_TARGETS = 'changed_targets',
+ UNCHANGED_SOURCES = 'unchanged_sources',
+ UNCHANGED_TARGETS = 'unchanged_targets',
+ PREPENDUNIQUE = 'prependunique')
+ added.append('PREPENDUNIQUE')
+ for x in self.reserved_variables:
+ assert x not in env, env[x]
+ for x in added:
+ assert x in env, bad_msg % x
+
+ env.Replace(TARGETS = 'targets',
+ SOURCES = 'sources',
+ SOURCE = 'source',
+ TARGET = 'target',
+ CHANGED_SOURCES = 'changed_sources',
+ CHANGED_TARGETS = 'changed_targets',
+ UNCHANGED_SOURCES = 'unchanged_sources',
+ UNCHANGED_TARGETS = 'unchanged_targets',
+ REPLACE = 'replace')
+ added.append('REPLACE')
+ for x in self.reserved_variables:
+ assert x not in env, env[x]
+ for x in added:
+ assert x in env, bad_msg % x
+
+ copy = env.Clone(TARGETS = 'targets',
+ SOURCES = 'sources',
+ SOURCE = 'source',
+ TARGET = 'target',
+ CHANGED_SOURCES = 'changed_sources',
+ CHANGED_TARGETS = 'changed_targets',
+ UNCHANGED_SOURCES = 'unchanged_sources',
+ UNCHANGED_TARGETS = 'unchanged_targets',
+ COPY = 'copy')
+ for x in self.reserved_variables:
+ assert x not in copy, env[x]
+ for x in added + ['COPY']:
+ assert x in copy, bad_msg % x
+
+ over = env.Override({'TARGETS' : 'targets',
+ 'SOURCES' : 'sources',
+ 'SOURCE' : 'source',
+ 'TARGET' : 'target',
+ 'CHANGED_SOURCES' : 'changed_sources',
+ 'CHANGED_TARGETS' : 'changed_targets',
+ 'UNCHANGED_SOURCES' : 'unchanged_sources',
+ 'UNCHANGED_TARGETS' : 'unchanged_targets',
+ 'OVERRIDE' : 'override'})
+ for x in self.reserved_variables:
+ assert x not in over, over[x]
+ for x in added + ['OVERRIDE']:
+ assert x in over, bad_msg % x
+
+ def test_parse_flags(self):
+ '''Test the Base class parse_flags argument'''
+ # all we have to show is that it gets to MergeFlags internally
+ env = Environment(tools=[], parse_flags = '-X')
+ assert env['CCFLAGS'] == ['-X'], env['CCFLAGS']
+
+ env = Environment(tools=[], CCFLAGS=None, parse_flags = '-Y')
+ assert env['CCFLAGS'] == ['-Y'], env['CCFLAGS']
+
+ env = Environment(tools=[], CPPDEFINES = 'FOO', parse_flags = '-std=c99 -X -DBAR')
+ assert env['CFLAGS'] == ['-std=c99'], env['CFLAGS']
+ assert env['CCFLAGS'] == ['-X'], env['CCFLAGS']
+ assert env['CPPDEFINES'] == ['FOO', 'BAR'], env['CPPDEFINES']
+
+ def test_clone_parse_flags(self):
+ '''Test the env.Clone() parse_flags argument'''
+ # all we have to show is that it gets to MergeFlags internally
+ env = Environment(tools = [])
+ env2 = env.Clone(parse_flags = '-X')
+ assert 'CCFLAGS' not in env
+ assert env2['CCFLAGS'] == ['-X'], env2['CCFLAGS']
+
+ env = Environment(tools = [], CCFLAGS=None)
+ env2 = env.Clone(parse_flags = '-Y')
+ assert env['CCFLAGS'] is None, env['CCFLAGS']
+ assert env2['CCFLAGS'] == ['-Y'], env2['CCFLAGS']
+
+ env = Environment(tools = [], CPPDEFINES = 'FOO')
+ env2 = env.Clone(parse_flags = '-std=c99 -X -DBAR')
+ assert 'CFLAGS' not in env
+ assert env2['CFLAGS'] == ['-std=c99'], env2['CFLAGS']
+ assert 'CCFLAGS' not in env
+ assert env2['CCFLAGS'] == ['-X'], env2['CCFLAGS']
+ assert env['CPPDEFINES'] == 'FOO', env['CPPDEFINES']
+ assert env2['CPPDEFINES'] == ['FOO','BAR'], env2['CPPDEFINES']
+
+
+
+class OverrideEnvironmentTestCase(unittest.TestCase,TestEnvironmentFixture):
+
+ def setUp(self):
+ env = Environment()
+ env._dict = {'XXX' : 'x', 'YYY' : 'y'}
+ env2 = OverrideEnvironment(env, {'XXX' : 'x2'})
+ env3 = OverrideEnvironment(env2, {'XXX' : 'x3', 'YYY' : 'y3', 'ZZZ' : 'z3'})
+ self.envs = [ env, env2, env3 ]
+
+ def checkpath(self, node, expect):
+ return str(node) == os.path.normpath(expect)
+
+ def test___init__(self):
+ """Test OverrideEnvironment initialization"""
+ env, env2, env3 = self.envs
+ assert env['XXX'] == 'x', env['XXX']
+ assert env2['XXX'] == 'x2', env2['XXX']
+ assert env3['XXX'] == 'x3', env3['XXX']
+ assert env['YYY'] == 'y', env['YYY']
+ assert env2['YYY'] == 'y', env2['YYY']
+ assert env3['YYY'] == 'y3', env3['YYY']
+
+ def test___delitem__(self):
+ """Test deleting variables from an OverrideEnvironment"""
+ env, env2, env3 = self.envs
+
+ del env3['XXX']
+ assert 'XXX' not in env, "env has XXX?"
+ assert 'XXX' not in env2, "env2 has XXX?"
+ assert 'XXX' not in env3, "env3 has XXX?"
+
+ del env3['YYY']
+ assert 'YYY' not in env, "env has YYY?"
+ assert 'YYY' not in env2, "env2 has YYY?"
+ assert 'YYY' not in env3, "env3 has YYY?"
+
+ del env3['ZZZ']
+ assert 'ZZZ' not in env, "env has ZZZ?"
+ assert 'ZZZ' not in env2, "env2 has ZZZ?"
+ assert 'ZZZ' not in env3, "env3 has ZZZ?"
+
+ def test_get(self):
+ """Test the OverrideEnvironment get() method"""
+ env, env2, env3 = self.envs
+ assert env.get('XXX') == 'x', env.get('XXX')
+ assert env2.get('XXX') == 'x2', env2.get('XXX')
+ assert env3.get('XXX') == 'x3', env3.get('XXX')
+ assert env.get('YYY') == 'y', env.get('YYY')
+ assert env2.get('YYY') == 'y', env2.get('YYY')
+ assert env3.get('YYY') == 'y3', env3.get('YYY')
+ assert env.get('ZZZ') is None, env.get('ZZZ')
+ assert env2.get('ZZZ') is None, env2.get('ZZZ')
+ assert env3.get('ZZZ') == 'z3', env3.get('ZZZ')
+
+ def test_has_key(self):
+ """Test the OverrideEnvironment has_key() method"""
+ env, env2, env3 = self.envs
+ assert 'XXX' in env, 'XXX' in env
+ assert 'XXX' in env2, 'XXX' in env2
+ assert 'XXX' in env3, 'XXX' in env3
+ assert 'YYY' in env, 'YYY' in env
+ assert 'YYY' in env2, 'YYY' in env2
+ assert 'YYY' in env3, 'YYY' in env3
+ assert 'ZZZ' not in env, 'ZZZ' in env
+ assert 'ZZZ' not in env2, 'ZZZ' in env2
+ assert 'ZZZ' in env3, 'ZZZ' in env3
+
+ def test_contains(self):
+ """Test the OverrideEnvironment __contains__() method"""
+ env, env2, env3 = self.envs
+ assert 'XXX' in env
+ assert 'XXX' in env2
+ assert 'XXX' in env3
+ assert 'YYY' in env
+ assert 'YYY' in env2
+ assert 'YYY' in env3
+ assert not 'ZZZ' in env
+ assert not 'ZZZ' in env2
+ assert 'ZZZ' in env3
+
+ def test_items(self):
+ """Test the OverrideEnvironment Dictionary() method"""
+ env, env2, env3 = self.envs
+ items = env.Dictionary()
+ assert items == {'XXX' : 'x', 'YYY' : 'y'}, items
+ items = env2.Dictionary()
+ assert items == {'XXX' : 'x2', 'YYY' : 'y'}, items
+ items = env3.Dictionary()
+ assert items == {'XXX' : 'x3', 'YYY' : 'y3', 'ZZZ' : 'z3'}, items
+
+ def test_items(self):
+ """Test the OverrideEnvironment items() method"""
+ env, env2, env3 = self.envs
+ items = sorted(env.items())
+ assert items == [('XXX', 'x'), ('YYY', 'y')], items
+ items = sorted(env2.items())
+ assert items == [('XXX', 'x2'), ('YYY', 'y')], items
+ items = sorted(env3.items())
+ assert items == [('XXX', 'x3'), ('YYY', 'y3'), ('ZZZ', 'z3')], items
+
+ def test_gvars(self):
+ """Test the OverrideEnvironment gvars() method"""
+ env, env2, env3 = self.envs
+ gvars = env.gvars()
+ assert gvars == {'XXX' : 'x', 'YYY' : 'y'}, gvars
+ gvars = env2.gvars()
+ assert gvars == {'XXX' : 'x', 'YYY' : 'y'}, gvars
+ gvars = env3.gvars()
+ assert gvars == {'XXX' : 'x', 'YYY' : 'y'}, gvars
+
+ def test_lvars(self):
+ """Test the OverrideEnvironment lvars() method"""
+ env, env2, env3 = self.envs
+ lvars = env.lvars()
+ assert lvars == {}, lvars
+ lvars = env2.lvars()
+ assert lvars == {'XXX' : 'x2'}, lvars
+ lvars = env3.lvars()
+ assert lvars == {'XXX' : 'x3', 'YYY' : 'y3', 'ZZZ' : 'z3'}, lvars
+
+ def test_Replace(self):
+ """Test the OverrideEnvironment Replace() method"""
+ env, env2, env3 = self.envs
+ assert env['XXX'] == 'x', env['XXX']
+ assert env2['XXX'] == 'x2', env2['XXX']
+ assert env3['XXX'] == 'x3', env3['XXX']
+ assert env['YYY'] == 'y', env['YYY']
+ assert env2['YYY'] == 'y', env2['YYY']
+ assert env3['YYY'] == 'y3', env3['YYY']
+
+ env.Replace(YYY = 'y4')
+
+ assert env['XXX'] == 'x', env['XXX']
+ assert env2['XXX'] == 'x2', env2['XXX']
+ assert env3['XXX'] == 'x3', env3['XXX']
+ assert env['YYY'] == 'y4', env['YYY']
+ assert env2['YYY'] == 'y4', env2['YYY']
+ assert env3['YYY'] == 'y3', env3['YYY']
+
+ # Tests a number of Base methods through an OverrideEnvironment to
+ # make sure they handle overridden constructionv variables properly.
+ #
+ # The following Base methods also call self.subst(), and so could
+ # theoretically be subject to problems with evaluating overridden
+ # variables, but they're never really called that way in the rest
+ # of our code, so we won't worry about them (at least for now):
+ #
+ # ParseConfig()
+ # ParseDepends()
+ # Platform()
+ # Tool()
+ #
+ # Action()
+ # Alias()
+ # Builder()
+ # CacheDir()
+ # Configure()
+ # Environment()
+ # FindFile()
+ # Scanner()
+ # SourceSignatures()
+ # TargetSignatures()
+
+ # It's unlikely Clone() will ever be called this way, so let the
+ # other methods test that handling overridden values works.
+ #def test_Clone(self):
+ # """Test the OverrideEnvironment Clone() method"""
+ # pass
+
+ def test_FindIxes(self):
+ """Test the OverrideEnvironment FindIxes() method"""
+ env, env2, env3 = self.envs
+ x = env.FindIxes(['xaaay'], 'XXX', 'YYY')
+ assert x == 'xaaay', x
+ x = env2.FindIxes(['x2aaay'], 'XXX', 'YYY')
+ assert x == 'x2aaay', x
+ x = env3.FindIxes(['x3aaay3'], 'XXX', 'YYY')
+ assert x == 'x3aaay3', x
+
+ def test_ReplaceIxes(self):
+ """Test the OverrideEnvironment ReplaceIxes() method"""
+ env, env2, env3 = self.envs
+ x = env.ReplaceIxes('xaaay', 'XXX', 'YYY', 'YYY', 'XXX')
+ assert x == 'yaaax', x
+ x = env2.ReplaceIxes('x2aaay', 'XXX', 'YYY', 'YYY', 'XXX')
+ assert x == 'yaaax2', x
+ x = env3.ReplaceIxes('x3aaay3', 'XXX', 'YYY', 'YYY', 'XXX')
+ assert x == 'y3aaax3', x
+
+ # It's unlikely WhereIs() will ever be called this way, so let the
+ # other methods test that handling overridden values works.
+ #def test_WhereIs(self):
+ # """Test the OverrideEnvironment WhereIs() method"""
+ # pass
+
+ def test_Dir(self):
+ """Test the OverrideEnvironment Dir() method"""
+ env, env2, env3 = self.envs
+ x = env.Dir('ddir/$XXX')
+ assert self.checkpath(x, 'ddir/x'), str(x)
+ x = env2.Dir('ddir/$XXX')
+ assert self.checkpath(x, 'ddir/x2'), str(x)
+ x = env3.Dir('ddir/$XXX')
+ assert self.checkpath(x, 'ddir/x3'), str(x)
+
+ def test_Entry(self):
+ """Test the OverrideEnvironment Entry() method"""
+ env, env2, env3 = self.envs
+ x = env.Entry('edir/$XXX')
+ assert self.checkpath(x, 'edir/x'), str(x)
+ x = env2.Entry('edir/$XXX')
+ assert self.checkpath(x, 'edir/x2'), str(x)
+ x = env3.Entry('edir/$XXX')
+ assert self.checkpath(x, 'edir/x3'), str(x)
+
+ def test_File(self):
+ """Test the OverrideEnvironment File() method"""
+ env, env2, env3 = self.envs
+ x = env.File('fdir/$XXX')
+ assert self.checkpath(x, 'fdir/x'), str(x)
+ x = env2.File('fdir/$XXX')
+ assert self.checkpath(x, 'fdir/x2'), str(x)
+ x = env3.File('fdir/$XXX')
+ assert self.checkpath(x, 'fdir/x3'), str(x)
+
+ def test_Split(self):
+ """Test the OverrideEnvironment Split() method"""
+ env, env2, env3 = self.envs
+ env['AAA'] = '$XXX $YYY $ZZZ'
+ x = env.Split('$AAA')
+ assert x == ['x', 'y'], x
+ x = env2.Split('$AAA')
+ assert x == ['x2', 'y'], x
+ x = env3.Split('$AAA')
+ assert x == ['x3', 'y3', 'z3'], x
+
+ def test_parse_flags(self):
+ '''Test the OverrideEnvironment parse_flags argument'''
+ # all we have to show is that it gets to MergeFlags internally
+ env = SubstitutionEnvironment()
+ env2 = env.Override({'parse_flags' : '-X'})
+ assert 'CCFLAGS' not in env
+ assert env2['CCFLAGS'] == ['-X'], env2['CCFLAGS']
+
+ env = SubstitutionEnvironment(CCFLAGS=None)
+ env2 = env.Override({'parse_flags' : '-Y'})
+ assert env['CCFLAGS'] is None, env['CCFLAGS']
+ assert env2['CCFLAGS'] == ['-Y'], env2['CCFLAGS']
+
+ env = SubstitutionEnvironment(CPPDEFINES = 'FOO')
+ env2 = env.Override({'parse_flags' : '-std=c99 -X -DBAR'})
+ assert 'CFLAGS' not in env
+ assert env2['CFLAGS'] == ['-std=c99'], env2['CFLAGS']
+ assert 'CCFLAGS' not in env
+ assert env2['CCFLAGS'] == ['-X'], env2['CCFLAGS']
+ assert env['CPPDEFINES'] == 'FOO', env['CPPDEFINES']
+ assert env2['CPPDEFINES'] == ['FOO','BAR'], env2['CPPDEFINES']
+
+
+
+class NoSubstitutionProxyTestCase(unittest.TestCase,TestEnvironmentFixture):
+
+ def test___init__(self):
+ """Test NoSubstitutionProxy initialization"""
+ env = self.TestEnvironment(XXX = 'x', YYY = 'y')
+ assert env['XXX'] == 'x', env['XXX']
+ assert env['YYY'] == 'y', env['YYY']
+
+ proxy = NoSubstitutionProxy(env)
+ assert proxy['XXX'] == 'x', proxy['XXX']
+ assert proxy['YYY'] == 'y', proxy['YYY']
+
+ def test_attributes(self):
+ """Test getting and setting NoSubstitutionProxy attributes"""
+ env = Environment()
+ setattr(env, 'env_attr', 'value1')
+
+ proxy = NoSubstitutionProxy(env)
+ setattr(proxy, 'proxy_attr', 'value2')
+
+ x = getattr(env, 'env_attr')
+ assert x == 'value1', x
+ x = getattr(proxy, 'env_attr')
+ assert x == 'value1', x
+
+ x = getattr(env, 'proxy_attr')
+ assert x == 'value2', x
+ x = getattr(proxy, 'proxy_attr')
+ assert x == 'value2', x
+
+ def test_subst(self):
+ """Test the NoSubstitutionProxy.subst() method"""
+ env = self.TestEnvironment(XXX = 'x', YYY = 'y')
+ assert env['XXX'] == 'x', env['XXX']
+ assert env['YYY'] == 'y', env['YYY']
+
+ proxy = NoSubstitutionProxy(env)
+ assert proxy['XXX'] == 'x', proxy['XXX']
+ assert proxy['YYY'] == 'y', proxy['YYY']
+
+ x = env.subst('$XXX')
+ assert x == 'x', x
+ x = proxy.subst('$XXX')
+ assert x == '$XXX', x
+
+ x = proxy.subst('$YYY', raw=7, target=None, source=None,
+ conv=None,
+ extra_meaningless_keyword_argument=None)
+ assert x == '$YYY', x
+
+ def test_subst_kw(self):
+ """Test the NoSubstitutionProxy.subst_kw() method"""
+ env = self.TestEnvironment(XXX = 'x', YYY = 'y')
+ assert env['XXX'] == 'x', env['XXX']
+ assert env['YYY'] == 'y', env['YYY']
+
+ proxy = NoSubstitutionProxy(env)
+ assert proxy['XXX'] == 'x', proxy['XXX']
+ assert proxy['YYY'] == 'y', proxy['YYY']
+
+ x = env.subst_kw({'$XXX':'$YYY'})
+ assert x == {'x':'y'}, x
+ x = proxy.subst_kw({'$XXX':'$YYY'})
+ assert x == {'$XXX':'$YYY'}, x
+
+ def test_subst_list(self):
+ """Test the NoSubstitutionProxy.subst_list() method"""
+ env = self.TestEnvironment(XXX = 'x', YYY = 'y')
+ assert env['XXX'] == 'x', env['XXX']
+ assert env['YYY'] == 'y', env['YYY']
+
+ proxy = NoSubstitutionProxy(env)
+ assert proxy['XXX'] == 'x', proxy['XXX']
+ assert proxy['YYY'] == 'y', proxy['YYY']
+
+ x = env.subst_list('$XXX')
+ assert x == [['x']], x
+ x = proxy.subst_list('$XXX')
+ assert x == [[]], x
+
+ x = proxy.subst_list('$YYY', raw=0, target=None, source=None, conv=None)
+ assert x == [[]], x
+
+ def test_subst_target_source(self):
+ """Test the NoSubstitutionProxy.subst_target_source() method"""
+ env = self.TestEnvironment(XXX = 'x', YYY = 'y')
+ assert env['XXX'] == 'x', env['XXX']
+ assert env['YYY'] == 'y', env['YYY']
+
+ proxy = NoSubstitutionProxy(env)
+ assert proxy['XXX'] == 'x', proxy['XXX']
+ assert proxy['YYY'] == 'y', proxy['YYY']
+
+ args = ('$XXX $TARGET $SOURCE $YYY',)
+ kw = {'target' : DummyNode('ttt'), 'source' : DummyNode('sss')}
+ x = env.subst_target_source(*args, **kw)
+ assert x == 'x ttt sss y', x
+ x = proxy.subst_target_source(*args, **kw)
+ assert x == ' ttt sss ', x
+
+class EnvironmentVariableTestCase(unittest.TestCase):
+
+ def test_is_valid_construction_var(self):
+ """Testing is_valid_construction_var()"""
+ r = is_valid_construction_var("_a")
+ assert r is not None, r
+ r = is_valid_construction_var("z_")
+ assert r is not None, r
+ r = is_valid_construction_var("X_")
+ assert r is not None, r
+ r = is_valid_construction_var("2a")
+ assert r is None, r
+ r = is_valid_construction_var("a2_")
+ assert r is not None, r
+ r = is_valid_construction_var("/")
+ assert r is None, r
+ r = is_valid_construction_var("_/")
+ assert r is None, r
+ r = is_valid_construction_var("a/")
+ assert r is None, r
+ r = is_valid_construction_var(".b")
+ assert r is None, r
+ r = is_valid_construction_var("_.b")
+ assert r is None, r
+ r = is_valid_construction_var("b1._")
+ assert r is None, r
+ r = is_valid_construction_var("-b")
+ assert r is None, r
+ r = is_valid_construction_var("_-b")
+ assert r is None, r
+ r = is_valid_construction_var("b1-_")
+ assert r is None, r
+
+
+
+if __name__ == "__main__":
+ suite = unittest.TestSuite()
+ tclasses = [ SubstitutionTestCase,
+ BaseTestCase,
+ OverrideEnvironmentTestCase,
+ NoSubstitutionProxyTestCase,
+ EnvironmentVariableTestCase ]
+ for tclass in tclasses:
+ names = unittest.getTestCaseNames(tclass, 'test_')
+ suite.addTests(list(map(tclass, names)))
+ TestUnit.run(suite)
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/EnvironmentValues.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/EnvironmentValues.py
new file mode 100644
index 0000000..d94bf3a
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/EnvironmentValues.py
@@ -0,0 +1,98 @@
+import re
+
+_is_valid_var = re.compile(r'[_a-zA-Z]\w*$')
+
+_rm = re.compile(r'\$[()]')
+_remove = re.compile(r'\$\([^\$]*(\$[^\)][^\$]*)*\$\)')
+
+# Regular expressions for splitting strings and handling substitutions,
+# for use by the scons_subst() and scons_subst_list() functions:
+#
+# The first expression compiled matches all of the $-introduced tokens
+# that we need to process in some way, and is used for substitutions.
+# The expressions it matches are:
+#
+# "$$"
+# "$("
+# "$)"
+# "$variable" [must begin with alphabetic or underscore]
+# "${any stuff}"
+#
+# The second expression compiled is used for splitting strings into tokens
+# to be processed, and it matches all of the tokens listed above, plus
+# the following that affect how arguments do or don't get joined together:
+#
+# " " [white space]
+# "non-white-space" [without any dollar signs]
+# "$" [single dollar sign]
+#
+_dollar_exps_str = r'\$[\$\(\)]|\$[_a-zA-Z][\.\w]*|\${[^}]*}'
+_dollar_exps = re.compile(r'(%s)' % _dollar_exps_str)
+_separate_args = re.compile(r'(%s|\s+|[^\s\$]+|\$)' % _dollar_exps_str)
+
+# This regular expression is used to replace strings of multiple white
+# space characters in the string result from the scons_subst() function.
+_space_sep = re.compile(r'[\t ]+(?![^{]*})')
+
+class ValueTypes(object):
+ """
+ Enum to store what type of value the variable holds.
+ """
+ UNKNOWN = 0
+ STRING = 1
+ CALLABLE = 2
+ VARIABLE = 3
+
+
+class EnvironmentValue(object):
+ """
+ Hold a single value. We're going to cache parsed version of the file
+ We're going to keep track of variables which feed into this values evaluation
+ """
+ def __init__(self, value):
+ self.value = value
+ self.var_type = ValueTypes.UNKNOWN
+
+ if callable(self.value):
+ self.var_type = ValueTypes.CALLABLE
+ else:
+ self.parse_value()
+
+
+ def parse_value(self):
+ """
+ Scan the string and break into component values
+ """
+
+ try:
+ if '$' not in self.value:
+ self._parsed = self.value
+ self.var_type = ValueTypes.STRING
+ else:
+ # Now we need to parse the specified string
+ result = _dollar_exps.sub(sub_match, args)
+ print(result)
+ pass
+ except TypeError:
+ # likely callable? either way we don't parse
+ self._parsed = self.value
+
+ def parse_trial(self):
+ """
+ Try alternate parsing methods.
+ :return:
+ """
+ parts = []
+ for c in self.value:
+ pass
+
+
+
+class EnvironmentValues(object):
+ """
+ A class to hold all the environment variables
+ """
+ def __init__(self, **kw):
+ self._dict = {}
+ for k in kw:
+ self._dict[k] = EnvironmentValue(kw[k])
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/EnvironmentValuesTest.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/EnvironmentValuesTest.py
new file mode 100644
index 0000000..58ee9cf
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/EnvironmentValuesTest.py
@@ -0,0 +1,16 @@
+import unittest
+
+from SCons.EnvironmentValues import EnvironmentValues
+
+class MyTestCase(unittest.TestCase):
+ def test_simple_environmentValues(self):
+ """Test comparing SubstitutionEnvironments
+ """
+
+ env1 = EnvironmentValues(XXX='x')
+ env2 = EnvironmentValues(XXX='x',XX="$X", X1="${X}", X2="$($X$)")
+
+
+
+if __name__ == '__main__':
+ unittest.main()
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Errors.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Errors.py
new file mode 100644
index 0000000..2ba007c
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Errors.py
@@ -0,0 +1,229 @@
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+"""SCons.Errors
+
+This file contains the exception classes used to handle internal
+and user errors in SCons.
+
+"""
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import shutil
+import SCons.Util
+
+
+class BuildError(Exception):
+ """ Errors occurring while building.
+
+ BuildError have the following attributes:
+ =========================================
+
+ Information about the cause of the build error:
+ -----------------------------------------------
+
+ errstr : a description of the error message
+
+ status : the return code of the action that caused the build error.
+ Must be set to a non-zero value even if the build error is not due
+ to an action returning a non-zero returned code.
+
+ exitstatus : SCons exit status due to this build error.
+ Must be nonzero unless due to an explicit Exit()
+ call. Not always the same as status, since
+ actions return a status code that should be
+ respected, but SCons typically exits with 2
+ irrespective of the return value of the failed
+ action.
+
+ filename : The name of the file or directory that caused the
+ build error. Set to None if no files are associated with
+ this error. This might be different from the target
+ being built. For example, failure to create the
+ directory in which the target file will appear. It
+ can be None if the error is not due to a particular
+ filename.
+
+ exc_info : Info about exception that caused the build
+ error. Set to (None, None, None) if this build
+ error is not due to an exception.
+
+
+ Information about the cause of the location of the error:
+ ---------------------------------------------------------
+
+ node : the error occured while building this target node(s)
+
+ executor : the executor that caused the build to fail (might
+ be None if the build failures is not due to the
+ executor failing)
+
+ action : the action that caused the build to fail (might be
+ None if the build failures is not due to the an
+ action failure)
+
+ command : the command line for the action that caused the
+ build to fail (might be None if the build failures
+ is not due to the an action failure)
+ """
+
+ def __init__(self,
+ node=None, errstr="Unknown error", status=2, exitstatus=2,
+ filename=None, executor=None, action=None, command=None,
+ exc_info=(None, None, None)):
+
+ # py3: errstr should be string and not bytes.
+
+ self.errstr = SCons.Util.to_str(errstr)
+ self.status = status
+ self.exitstatus = exitstatus
+ self.filename = filename
+ self.exc_info = exc_info
+
+ self.node = node
+ self.executor = executor
+ self.action = action
+ self.command = command
+
+ Exception.__init__(self, node, errstr, status, exitstatus, filename,
+ executor, action, command, exc_info)
+
+ def __str__(self):
+ if self.filename:
+ return self.filename + ': ' + self.errstr
+ else:
+ return self.errstr
+
+class InternalError(Exception):
+ pass
+
+class UserError(Exception):
+ pass
+
+class StopError(Exception):
+ pass
+
+class EnvironmentError(Exception):
+ pass
+
+class MSVCError(IOError):
+ pass
+
+class ExplicitExit(Exception):
+ def __init__(self, node=None, status=None, *args):
+ self.node = node
+ self.status = status
+ self.exitstatus = status
+ Exception.__init__(self, *args)
+
+def convert_to_BuildError(status, exc_info=None):
+ """
+ Convert any return code a BuildError Exception.
+
+ :Parameters:
+ - `status`: can either be a return code or an Exception.
+
+ The buildError.status we set here will normally be
+ used as the exit status of the "scons" process.
+ """
+
+ if not exc_info and isinstance(status, Exception):
+ exc_info = (status.__class__, status, None)
+
+
+ if isinstance(status, BuildError):
+ buildError = status
+ buildError.exitstatus = 2 # always exit with 2 on build errors
+ elif isinstance(status, ExplicitExit):
+ status = status.status
+ errstr = 'Explicit exit, status %s' % status
+ buildError = BuildError(
+ errstr=errstr,
+ status=status, # might be 0, OK here
+ exitstatus=status, # might be 0, OK here
+ exc_info=exc_info)
+ elif isinstance(status, (StopError, UserError)):
+ buildError = BuildError(
+ errstr=str(status),
+ status=2,
+ exitstatus=2,
+ exc_info=exc_info)
+ elif isinstance(status, shutil.SameFileError):
+ # PY3 has a exception for when copying file to itself
+ # It's object provides info differently than below
+ try:
+ filename = status.filename
+ except AttributeError:
+ filename = None
+
+ buildError = BuildError(
+ errstr=status.args[0],
+ status=status.errno,
+ exitstatus=2,
+ filename=filename,
+ exc_info=exc_info)
+
+ elif isinstance(status, (EnvironmentError, OSError, IOError)):
+ # If an IOError/OSError happens, raise a BuildError.
+ # Report the name of the file or directory that caused the
+ # error, which might be different from the target being built
+ # (for example, failure to create the directory in which the
+ # target file will appear).
+ try:
+ filename = status.filename
+ except AttributeError:
+ filename = None
+
+ buildError = BuildError(
+ errstr=status.strerror,
+ status=status.errno,
+ exitstatus=2,
+ filename=filename,
+ exc_info=exc_info)
+ elif isinstance(status, Exception):
+ buildError = BuildError(
+ errstr='%s : %s' % (status.__class__.__name__, status),
+ status=2,
+ exitstatus=2,
+ exc_info=exc_info)
+ elif SCons.Util.is_String(status):
+ buildError = BuildError(
+ errstr=status,
+ status=2,
+ exitstatus=2)
+ else:
+ buildError = BuildError(
+ errstr="Error %s" % status,
+ status=status,
+ exitstatus=2)
+
+ #import sys
+ #sys.stderr.write("convert_to_BuildError: status %s => (errstr %s, status %s)\n"%(status,buildError.errstr, buildError.status))
+ return buildError
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/ErrorsTests.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/ErrorsTests.py
new file mode 100644
index 0000000..c38158d
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/ErrorsTests.py
@@ -0,0 +1,111 @@
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import sys
+import unittest
+
+import TestUnit
+
+import SCons.Errors
+
+
+class ErrorsTestCase(unittest.TestCase):
+ def test_BuildError(self):
+ """Test the BuildError exception."""
+ try:
+ raise SCons.Errors.BuildError(
+ errstr = "foo", status=57, filename="file", exc_info=(1,2,3),
+ node = "n", executor="e", action="a", command="c")
+ except SCons.Errors.BuildError as e:
+ assert e.errstr == "foo"
+ assert e.status == 57
+ assert e.exitstatus == 2, e.exitstatus
+ assert e.filename == "file"
+ assert e.exc_info == (1,2,3)
+
+ assert e.node == "n"
+ assert e.executor == "e"
+ assert e.action == "a"
+ assert e.command == "c"
+
+ try:
+ raise SCons.Errors.BuildError("n", "foo", 57, 3, "file",
+ "e", "a", "c", (1,2,3))
+ except SCons.Errors.BuildError as e:
+ assert e.errstr == "foo", e.errstr
+ assert e.status == 57, e.status
+ assert e.exitstatus == 3, e.exitstatus
+ assert e.filename == "file", e.filename
+ assert e.exc_info == (1,2,3), e.exc_info
+
+ assert e.node == "n"
+ assert e.executor == "e"
+ assert e.action == "a"
+ assert e.command == "c"
+
+ try:
+ raise SCons.Errors.BuildError()
+ except SCons.Errors.BuildError as e:
+ assert e.errstr == "Unknown error"
+ assert e.status == 2
+ assert e.exitstatus == 2
+ assert e.filename is None
+ assert e.exc_info == (None, None, None)
+
+ assert e.node is None
+ assert e.executor is None
+ assert e.action is None
+ assert e.command is None
+
+ def test_InternalError(self):
+ """Test the InternalError exception."""
+ try:
+ raise SCons.Errors.InternalError("test internal error")
+ except SCons.Errors.InternalError as e:
+ assert e.args == ("test internal error",)
+
+ def test_UserError(self):
+ """Test the UserError exception."""
+ try:
+ raise SCons.Errors.UserError("test user error")
+ except SCons.Errors.UserError as e:
+ assert e.args == ("test user error",)
+
+ def test_ExplicitExit(self):
+ """Test the ExplicitExit exception."""
+ try:
+ raise SCons.Errors.ExplicitExit("node")
+ except SCons.Errors.ExplicitExit as e:
+ assert e.node == "node"
+
+if __name__ == "__main__":
+ suite = unittest.makeSuite(ErrorsTestCase, 'test_')
+ TestUnit.run(suite)
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Executor.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Executor.py
new file mode 100644
index 0000000..bce1549
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Executor.py
@@ -0,0 +1,670 @@
+"""SCons.Executor
+
+A module for executing actions with specific lists of target and source
+Nodes.
+
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+from __future__ import print_function
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import collections
+
+import SCons.Debug
+from SCons.Debug import logInstanceCreation
+import SCons.Errors
+import SCons.Memoize
+from SCons.compat import with_metaclass, NoSlotsPyPy
+
+class Batch(object):
+ """Remembers exact association between targets
+ and sources of executor."""
+
+ __slots__ = ('targets',
+ 'sources')
+
+ def __init__(self, targets=[], sources=[]):
+ self.targets = targets
+ self.sources = sources
+
+
+
+class TSList(collections.UserList):
+ """A class that implements $TARGETS or $SOURCES expansions by wrapping
+ an executor Method. This class is used in the Executor.lvars()
+ to delay creation of NodeList objects until they're needed.
+
+ Note that we subclass collections.UserList purely so that the
+ is_Sequence() function will identify an object of this class as
+ a list during variable expansion. We're not really using any
+ collections.UserList methods in practice.
+ """
+ def __init__(self, func):
+ self.func = func
+ def __getattr__(self, attr):
+ nl = self.func()
+ return getattr(nl, attr)
+ def __getitem__(self, i):
+ nl = self.func()
+ return nl[i]
+ def __getslice__(self, i, j):
+ nl = self.func()
+ i = max(i, 0); j = max(j, 0)
+ return nl[i:j]
+ def __str__(self):
+ nl = self.func()
+ return str(nl)
+ def __repr__(self):
+ nl = self.func()
+ return repr(nl)
+
+class TSObject(object):
+ """A class that implements $TARGET or $SOURCE expansions by wrapping
+ an Executor method.
+ """
+ def __init__(self, func):
+ self.func = func
+ def __getattr__(self, attr):
+ n = self.func()
+ return getattr(n, attr)
+ def __str__(self):
+ n = self.func()
+ if n:
+ return str(n)
+ return ''
+ def __repr__(self):
+ n = self.func()
+ if n:
+ return repr(n)
+ return ''
+
+def rfile(node):
+ """
+ A function to return the results of a Node's rfile() method,
+ if it exists, and the Node itself otherwise (if it's a Value
+ Node, e.g.).
+ """
+ try:
+ rfile = node.rfile
+ except AttributeError:
+ return node
+ else:
+ return rfile()
+
+
+def execute_nothing(obj, target, kw):
+ return 0
+
+def execute_action_list(obj, target, kw):
+ """Actually execute the action list."""
+ env = obj.get_build_env()
+ kw = obj.get_kw(kw)
+ status = 0
+ for act in obj.get_action_list():
+ args = ([], [], env)
+ status = act(*args, **kw)
+ if isinstance(status, SCons.Errors.BuildError):
+ status.executor = obj
+ raise status
+ elif status:
+ msg = "Error %s" % status
+ raise SCons.Errors.BuildError(
+ errstr=msg,
+ node=obj.batches[0].targets,
+ executor=obj,
+ action=act)
+ return status
+
+_do_execute_map = {0 : execute_nothing,
+ 1 : execute_action_list}
+
+
+def execute_actions_str(obj):
+ env = obj.get_build_env()
+ return "\n".join([action.genstring(obj.get_all_targets(),
+ obj.get_all_sources(),
+ env)
+ for action in obj.get_action_list()])
+
+def execute_null_str(obj):
+ return ''
+
+_execute_str_map = {0 : execute_null_str,
+ 1 : execute_actions_str}
+
+
+class Executor(object, with_metaclass(NoSlotsPyPy)):
+ """A class for controlling instances of executing an action.
+
+ This largely exists to hold a single association of an action,
+ environment, list of environment override dictionaries, targets
+ and sources for later processing as needed.
+ """
+
+ __slots__ = ('pre_actions',
+ 'post_actions',
+ 'env',
+ 'overridelist',
+ 'batches',
+ 'builder_kw',
+ '_memo',
+ 'lvars',
+ '_changed_sources_list',
+ '_changed_targets_list',
+ '_unchanged_sources_list',
+ '_unchanged_targets_list',
+ 'action_list',
+ '_do_execute',
+ '_execute_str')
+
+ def __init__(self, action, env=None, overridelist=[{}],
+ targets=[], sources=[], builder_kw={}):
+ if SCons.Debug.track_instances: logInstanceCreation(self, 'Executor.Executor')
+ self.set_action_list(action)
+ self.pre_actions = []
+ self.post_actions = []
+ self.env = env
+ self.overridelist = overridelist
+ if targets or sources:
+ self.batches = [Batch(targets[:], sources[:])]
+ else:
+ self.batches = []
+ self.builder_kw = builder_kw
+ self._do_execute = 1
+ self._execute_str = 1
+ self._memo = {}
+
+ def get_lvars(self):
+ try:
+ return self.lvars
+ except AttributeError:
+ self.lvars = {
+ 'CHANGED_SOURCES' : TSList(self._get_changed_sources),
+ 'CHANGED_TARGETS' : TSList(self._get_changed_targets),
+ 'SOURCE' : TSObject(self._get_source),
+ 'SOURCES' : TSList(self._get_sources),
+ 'TARGET' : TSObject(self._get_target),
+ 'TARGETS' : TSList(self._get_targets),
+ 'UNCHANGED_SOURCES' : TSList(self._get_unchanged_sources),
+ 'UNCHANGED_TARGETS' : TSList(self._get_unchanged_targets),
+ }
+ return self.lvars
+
+ def _get_changes(self):
+ cs = []
+ ct = []
+ us = []
+ ut = []
+ for b in self.batches:
+ # don't add targets marked always build to unchanged lists
+ # add to changed list as they always need to build
+ if not b.targets[0].always_build and b.targets[0].is_up_to_date():
+ us.extend(list(map(rfile, b.sources)))
+ ut.extend(b.targets)
+ else:
+ cs.extend(list(map(rfile, b.sources)))
+ ct.extend(b.targets)
+ self._changed_sources_list = SCons.Util.NodeList(cs)
+ self._changed_targets_list = SCons.Util.NodeList(ct)
+ self._unchanged_sources_list = SCons.Util.NodeList(us)
+ self._unchanged_targets_list = SCons.Util.NodeList(ut)
+
+ def _get_changed_sources(self, *args, **kw):
+ try:
+ return self._changed_sources_list
+ except AttributeError:
+ self._get_changes()
+ return self._changed_sources_list
+
+ def _get_changed_targets(self, *args, **kw):
+ try:
+ return self._changed_targets_list
+ except AttributeError:
+ self._get_changes()
+ return self._changed_targets_list
+
+ def _get_source(self, *args, **kw):
+ return rfile(self.batches[0].sources[0]).get_subst_proxy()
+
+ def _get_sources(self, *args, **kw):
+ return SCons.Util.NodeList([rfile(n).get_subst_proxy() for n in self.get_all_sources()])
+
+ def _get_target(self, *args, **kw):
+ return self.batches[0].targets[0].get_subst_proxy()
+
+ def _get_targets(self, *args, **kw):
+ return SCons.Util.NodeList([n.get_subst_proxy() for n in self.get_all_targets()])
+
+ def _get_unchanged_sources(self, *args, **kw):
+ try:
+ return self._unchanged_sources_list
+ except AttributeError:
+ self._get_changes()
+ return self._unchanged_sources_list
+
+ def _get_unchanged_targets(self, *args, **kw):
+ try:
+ return self._unchanged_targets_list
+ except AttributeError:
+ self._get_changes()
+ return self._unchanged_targets_list
+
+ def get_action_targets(self):
+ if not self.action_list:
+ return []
+ targets_string = self.action_list[0].get_targets(self.env, self)
+ if targets_string[0] == '$':
+ targets_string = targets_string[1:]
+ return self.get_lvars()[targets_string]
+
+ def set_action_list(self, action):
+ import SCons.Util
+ if not SCons.Util.is_List(action):
+ if not action:
+ import SCons.Errors
+ raise SCons.Errors.UserError("Executor must have an action.")
+ action = [action]
+ self.action_list = action
+
+ def get_action_list(self):
+ if self.action_list is None:
+ return []
+ return self.pre_actions + self.action_list + self.post_actions
+
+ def get_all_targets(self):
+ """Returns all targets for all batches of this Executor."""
+ result = []
+ for batch in self.batches:
+ result.extend(batch.targets)
+ return result
+
+ def get_all_sources(self):
+ """Returns all sources for all batches of this Executor."""
+ result = []
+ for batch in self.batches:
+ result.extend(batch.sources)
+ return result
+
+ def get_all_children(self):
+ """Returns all unique children (dependencies) for all batches
+ of this Executor.
+
+ The Taskmaster can recognize when it's already evaluated a
+ Node, so we don't have to make this list unique for its intended
+ canonical use case, but we expect there to be a lot of redundancy
+ (long lists of batched .cc files #including the same .h files
+ over and over), so removing the duplicates once up front should
+ save the Taskmaster a lot of work.
+ """
+ result = SCons.Util.UniqueList([])
+ for target in self.get_all_targets():
+ result.extend(target.children())
+ return result
+
+ def get_all_prerequisites(self):
+ """Returns all unique (order-only) prerequisites for all batches
+ of this Executor.
+ """
+ result = SCons.Util.UniqueList([])
+ for target in self.get_all_targets():
+ if target.prerequisites is not None:
+ result.extend(target.prerequisites)
+ return result
+
+ def get_action_side_effects(self):
+
+ """Returns all side effects for all batches of this
+ Executor used by the underlying Action.
+ """
+ result = SCons.Util.UniqueList([])
+ for target in self.get_action_targets():
+ result.extend(target.side_effects)
+ return result
+
+ @SCons.Memoize.CountMethodCall
+ def get_build_env(self):
+ """Fetch or create the appropriate build Environment
+ for this Executor.
+ """
+ try:
+ return self._memo['get_build_env']
+ except KeyError:
+ pass
+
+ # Create the build environment instance with appropriate
+ # overrides. These get evaluated against the current
+ # environment's construction variables so that users can
+ # add to existing values by referencing the variable in
+ # the expansion.
+ overrides = {}
+ for odict in self.overridelist:
+ overrides.update(odict)
+
+ import SCons.Defaults
+ env = self.env or SCons.Defaults.DefaultEnvironment()
+ build_env = env.Override(overrides)
+
+ self._memo['get_build_env'] = build_env
+
+ return build_env
+
+ def get_build_scanner_path(self, scanner):
+ """Fetch the scanner path for this executor's targets and sources.
+ """
+ env = self.get_build_env()
+ try:
+ cwd = self.batches[0].targets[0].cwd
+ except (IndexError, AttributeError):
+ cwd = None
+ return scanner.path(env, cwd,
+ self.get_all_targets(),
+ self.get_all_sources())
+
+ def get_kw(self, kw={}):
+ result = self.builder_kw.copy()
+ result.update(kw)
+ result['executor'] = self
+ return result
+
+ # use extra indirection because with new-style objects (Python 2.2
+ # and above) we can't override special methods, and nullify() needs
+ # to be able to do this.
+
+ def __call__(self, target, **kw):
+ return _do_execute_map[self._do_execute](self, target, kw)
+
+ def cleanup(self):
+ self._memo = {}
+
+ def add_sources(self, sources):
+ """Add source files to this Executor's list. This is necessary
+ for "multi" Builders that can be called repeatedly to build up
+ a source file list for a given target."""
+ # TODO(batch): extend to multiple batches
+ assert (len(self.batches) == 1)
+ # TODO(batch): remove duplicates?
+ sources = [x for x in sources if x not in self.batches[0].sources]
+ self.batches[0].sources.extend(sources)
+
+ def get_sources(self):
+ return self.batches[0].sources
+
+ def add_batch(self, targets, sources):
+ """Add pair of associated target and source to this Executor's list.
+ This is necessary for "batch" Builders that can be called repeatedly
+ to build up a list of matching target and source files that will be
+ used in order to update multiple target files at once from multiple
+ corresponding source files, for tools like MSVC that support it."""
+ self.batches.append(Batch(targets, sources))
+
+ def prepare(self):
+ """
+ Preparatory checks for whether this Executor can go ahead
+ and (try to) build its targets.
+ """
+ for s in self.get_all_sources():
+ if s.missing():
+ msg = "Source `%s' not found, needed by target `%s'."
+ raise SCons.Errors.StopError(msg % (s, self.batches[0].targets[0]))
+
+ def add_pre_action(self, action):
+ self.pre_actions.append(action)
+
+ def add_post_action(self, action):
+ self.post_actions.append(action)
+
+ # another extra indirection for new-style objects and nullify...
+
+ def __str__(self):
+ return _execute_str_map[self._execute_str](self)
+
+ def nullify(self):
+ self.cleanup()
+ self._do_execute = 0
+ self._execute_str = 0
+
+ @SCons.Memoize.CountMethodCall
+ def get_contents(self):
+ """Fetch the signature contents. This is the main reason this
+ class exists, so we can compute this once and cache it regardless
+ of how many target or source Nodes there are.
+ """
+ try:
+ return self._memo['get_contents']
+ except KeyError:
+ pass
+ env = self.get_build_env()
+
+ action_list = self.get_action_list()
+ all_targets = self.get_all_targets()
+ all_sources = self.get_all_sources()
+
+ result = bytearray("",'utf-8').join([action.get_contents(all_targets,
+ all_sources,
+ env)
+ for action in action_list])
+
+ self._memo['get_contents'] = result
+ return result
+
+ def get_timestamp(self):
+ """Fetch a time stamp for this Executor. We don't have one, of
+ course (only files do), but this is the interface used by the
+ timestamp module.
+ """
+ return 0
+
+ def scan_targets(self, scanner):
+ # TODO(batch): scan by batches
+ self.scan(scanner, self.get_all_targets())
+
+ def scan_sources(self, scanner):
+ # TODO(batch): scan by batches
+ if self.batches[0].sources:
+ self.scan(scanner, self.get_all_sources())
+
+ def scan(self, scanner, node_list):
+ """Scan a list of this Executor's files (targets or sources) for
+ implicit dependencies and update all of the targets with them.
+ This essentially short-circuits an N*M scan of the sources for
+ each individual target, which is a hell of a lot more efficient.
+ """
+ env = self.get_build_env()
+ path = self.get_build_scanner_path
+ kw = self.get_kw()
+
+ # TODO(batch): scan by batches)
+ deps = []
+
+ for node in node_list:
+ node.disambiguate()
+ deps.extend(node.get_implicit_deps(env, scanner, path, kw))
+
+ deps.extend(self.get_implicit_deps())
+
+ for tgt in self.get_all_targets():
+ tgt.add_to_implicit(deps)
+
+ def _get_unignored_sources_key(self, node, ignore=()):
+ return (node,) + tuple(ignore)
+
+ @SCons.Memoize.CountDictCall(_get_unignored_sources_key)
+ def get_unignored_sources(self, node, ignore=()):
+ key = (node,) + tuple(ignore)
+ try:
+ memo_dict = self._memo['get_unignored_sources']
+ except KeyError:
+ memo_dict = {}
+ self._memo['get_unignored_sources'] = memo_dict
+ else:
+ try:
+ return memo_dict[key]
+ except KeyError:
+ pass
+
+ if node:
+ # TODO: better way to do this (it's a linear search,
+ # but it may not be critical path)?
+ sourcelist = []
+ for b in self.batches:
+ if node in b.targets:
+ sourcelist = b.sources
+ break
+ else:
+ sourcelist = self.get_all_sources()
+ if ignore:
+ idict = {}
+ for i in ignore:
+ idict[i] = 1
+ sourcelist = [s for s in sourcelist if s not in idict]
+
+ memo_dict[key] = sourcelist
+
+ return sourcelist
+
+ def get_implicit_deps(self):
+ """Return the executor's implicit dependencies, i.e. the nodes of
+ the commands to be executed."""
+ result = []
+ build_env = self.get_build_env()
+ for act in self.get_action_list():
+ deps = act.get_implicit_deps(self.get_all_targets(),
+ self.get_all_sources(),
+ build_env)
+ result.extend(deps)
+ return result
+
+
+
+_batch_executors = {}
+
+def GetBatchExecutor(key):
+ return _batch_executors[key]
+
+def AddBatchExecutor(key, executor):
+ assert key not in _batch_executors
+ _batch_executors[key] = executor
+
+nullenv = None
+
+
+import SCons.Util
+class NullEnvironment(SCons.Util.Null):
+ import SCons.CacheDir
+ _CacheDir_path = None
+ _CacheDir = SCons.CacheDir.CacheDir(None)
+ def get_CacheDir(self):
+ return self._CacheDir
+
+
+def get_NullEnvironment():
+ """Use singleton pattern for Null Environments."""
+ global nullenv
+
+ if nullenv is None:
+ nullenv = NullEnvironment()
+ return nullenv
+
+class Null(object, with_metaclass(NoSlotsPyPy)):
+ """A null Executor, with a null build Environment, that does
+ nothing when the rest of the methods call it.
+
+ This might be able to disappear when we refactor things to
+ disassociate Builders from Nodes entirely, so we're not
+ going to worry about unit tests for this--at least for now.
+ """
+
+ __slots__ = ('pre_actions',
+ 'post_actions',
+ 'env',
+ 'overridelist',
+ 'batches',
+ 'builder_kw',
+ '_memo',
+ 'lvars',
+ '_changed_sources_list',
+ '_changed_targets_list',
+ '_unchanged_sources_list',
+ '_unchanged_targets_list',
+ 'action_list',
+ '_do_execute',
+ '_execute_str')
+
+ def __init__(self, *args, **kw):
+ if SCons.Debug.track_instances: logInstanceCreation(self, 'Executor.Null')
+ self.batches = [Batch(kw['targets'][:], [])]
+ def get_build_env(self):
+ return get_NullEnvironment()
+ def get_build_scanner_path(self):
+ return None
+ def cleanup(self):
+ pass
+ def prepare(self):
+ pass
+ def get_unignored_sources(self, *args, **kw):
+ return tuple(())
+ def get_action_targets(self):
+ return []
+ def get_action_list(self):
+ return []
+ def get_all_targets(self):
+ return self.batches[0].targets
+ def get_all_sources(self):
+ return self.batches[0].targets[0].sources
+ def get_all_children(self):
+ return self.batches[0].targets[0].children()
+ def get_all_prerequisites(self):
+ return []
+ def get_action_side_effects(self):
+ return []
+ def __call__(self, *args, **kw):
+ return 0
+ def get_contents(self):
+ return ''
+ def _morph(self):
+ """Morph this Null executor to a real Executor object."""
+ batches = self.batches
+ self.__class__ = Executor
+ self.__init__([])
+ self.batches = batches
+
+ # The following methods require morphing this Null Executor to a
+ # real Executor object.
+
+ def add_pre_action(self, action):
+ self._morph()
+ self.add_pre_action(action)
+ def add_post_action(self, action):
+ self._morph()
+ self.add_post_action(action)
+ def set_action_list(self, action):
+ self._morph()
+ self.set_action_list(action)
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/ExecutorTests.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/ExecutorTests.py
new file mode 100644
index 0000000..eeab3ad
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/ExecutorTests.py
@@ -0,0 +1,497 @@
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import sys
+import unittest
+
+import TestUnit
+
+import SCons.Executor
+
+
+class MyEnvironment(object):
+ def __init__(self, **kw):
+ self._dict = {}
+ self._dict.update(kw)
+ def __getitem__(self, key):
+ return self._dict[key]
+ def Override(self, overrides):
+ d = self._dict.copy()
+ d.update(overrides)
+ return MyEnvironment(**d)
+ def _update(self, dict):
+ self._dict.update(dict)
+
+class MyAction(object):
+ def __init__(self, actions=['action1', 'action2']):
+ self.actions = actions
+ def __call__(self, target, source, env, **kw):
+ for action in self.actions:
+ action(target, source, env, **kw)
+ def genstring(self, target, source, env):
+ return ' '.join(['GENSTRING'] + list(map(str, self.actions)) + target + source)
+ def get_contents(self, target, source, env):
+ return b' '.join(
+ [SCons.Util.to_bytes(aa) for aa in self.actions] +
+ [SCons.Util.to_bytes(tt) for tt in target] +
+ [SCons.Util.to_bytes(ss) for ss in source]
+ )
+ def get_implicit_deps(self, target, source, env):
+ return []
+
+class MyBuilder(object):
+ def __init__(self, env, overrides):
+ self.env = env
+ self.overrides = overrides
+ self.action = MyAction()
+
+class MyNode(object):
+ def __init__(self, name=None, pre=[], post=[]):
+ self.name = name
+ self.implicit = []
+ self.pre_actions = pre
+ self.post_actions = post
+ self.missing_val = None
+ self.always_build = False
+ self.up_to_date = False
+
+ def __str__(self):
+ return self.name
+
+ def build(self):
+ executor = SCons.Executor.Executor(MyAction(self.pre_actions +
+ [self.builder.action] +
+ self.post_actions),
+ self.builder.env,
+ [],
+ [self],
+ ['s1', 's2'])
+ executor(self)
+ def get_env_scanner(self, env, kw):
+ return MyScanner('dep-')
+ def get_implicit_deps(self, env, scanner, path, kw={}):
+ if not scanner:
+ scanner = self.get_env_scanner(env, kw)
+ return [scanner.prefix + str(self)]
+ def add_to_implicit(self, deps):
+ self.implicit.extend(deps)
+ def missing(self):
+ return self.missing_val
+ def calc_signature(self, calc):
+ return 'cs-'+calc+'-'+self.name
+ def disambiguate(self):
+ return self
+
+ def is_up_to_date(self):
+ return self.up_to_date
+
+class MyScanner(object):
+ def __init__(self, prefix):
+ self.prefix = prefix
+ def path(self, env, cwd, target, source):
+ return ()
+ def select(self, node):
+ return self
+
+class ExecutorTestCase(unittest.TestCase):
+
+ def test__init__(self):
+ """Test creating an Executor"""
+ source_list = ['s1', 's2']
+ x = SCons.Executor.Executor('a', 'e', ['o'], 't', source_list)
+ assert x.action_list == ['a'], x.action_list
+ assert x.env == 'e', x.env
+ assert x.overridelist == ['o'], x.overridelist
+ targets = x.get_all_targets()
+ assert targets == ['t'], targets
+ source_list.append('s3')
+ sources = x.get_all_sources()
+ assert sources == ['s1', 's2'], sources
+ try:
+ x = SCons.Executor.Executor(None, 'e', ['o'], 't', source_list)
+ except SCons.Errors.UserError:
+ pass
+ else:
+ raise Exception("Did not catch expected UserError")
+
+ def test__action_list(self):
+ """Test the {get,set}_action_list() methods"""
+ x = SCons.Executor.Executor('a', 'e', 'o', 't', ['s1', 's2'])
+
+ l = x.get_action_list()
+ assert l == ['a'], l
+
+ x.add_pre_action('pre')
+ x.add_post_action('post')
+ l = x.get_action_list()
+ assert l == ['pre', 'a', 'post'], l
+
+ x.set_action_list('b')
+ l = x.get_action_list()
+ assert l == ['pre', 'b', 'post'], l
+
+ x.set_action_list(['c'])
+ l = x.get_action_list()
+ assert l == ['pre', 'c', 'post'], l
+
+ def test_get_build_env(self):
+ """Test fetching and generating a build environment"""
+ x = SCons.Executor.Executor(MyAction(), MyEnvironment(e=1), [],
+ 't', ['s1', 's2'])
+ x.env = MyEnvironment(eee=1)
+ be = x.get_build_env()
+ assert be['eee'] == 1, be
+
+ env = MyEnvironment(X='xxx')
+ x = SCons.Executor.Executor(MyAction(),
+ env,
+ [{'O':'o2'}],
+ 't',
+ ['s1', 's2'])
+ be = x.get_build_env()
+ assert be['O'] == 'o2', be['O']
+ assert be['X'] == 'xxx', be['X']
+
+ env = MyEnvironment(Y='yyy')
+ overrides = [{'O':'ob3'}, {'O':'oo3'}]
+ x = SCons.Executor.Executor(MyAction(), env, overrides, ['t'], ['s'])
+ be = x.get_build_env()
+ assert be['O'] == 'oo3', be['O']
+ assert be['Y'] == 'yyy', be['Y']
+ overrides = [{'O':'ob3'}]
+ x = SCons.Executor.Executor(MyAction(), env, overrides, ['t'], ['s'])
+ be = x.get_build_env()
+ assert be['O'] == 'ob3', be['O']
+ assert be['Y'] == 'yyy', be['Y']
+
+ def test_get_build_scanner_path(self):
+ """Test fetching the path for the specified scanner."""
+ t = MyNode('t')
+ t.cwd = 'here'
+ x = SCons.Executor.Executor(MyAction(),
+ MyEnvironment(SCANNERVAL='sss'),
+ [],
+ [t],
+ ['s1', 's2'])
+
+ class LocalScanner(object):
+ def path(self, env, dir, target, source):
+ target = list(map(str, target))
+ source = list(map(str, source))
+ return "scanner: %s, %s, %s, %s" % (env['SCANNERVAL'], dir, target, source)
+ s = LocalScanner()
+
+ p = x.get_build_scanner_path(s)
+ assert p == "scanner: sss, here, ['t'], ['s1', 's2']", p
+
+ def test_get_kw(self):
+ """Test the get_kw() method"""
+ t = MyNode('t')
+ x = SCons.Executor.Executor(MyAction(),
+ MyEnvironment(),
+ [],
+ [t],
+ ['s1', 's2'],
+ builder_kw={'X':1, 'Y':2})
+ kw = x.get_kw()
+ assert kw == {'X':1, 'Y':2, 'executor':x}, kw
+ kw = x.get_kw({'Z':3})
+ assert kw == {'X':1, 'Y':2, 'Z':3, 'executor':x}, kw
+ kw = x.get_kw({'X':4})
+ assert kw == {'X':4, 'Y':2, 'executor':x}, kw
+
+ def test__call__(self):
+ """Test calling an Executor"""
+ result = []
+ def pre(target, source, env, result=result, **kw):
+ result.append('pre')
+ def action1(target, source, env, result=result, **kw):
+ result.append('action1')
+ def action2(target, source, env, result=result, **kw):
+ result.append('action2')
+ def post(target, source, env, result=result, **kw):
+ result.append('post')
+
+ env = MyEnvironment()
+ a = MyAction([action1, action2])
+ t = MyNode('t')
+
+ x = SCons.Executor.Executor(a, env, [], [t], ['s1', 's2'])
+ x.add_pre_action(pre)
+ x.add_post_action(post)
+ x(t)
+ assert result == ['pre', 'action1', 'action2', 'post'], result
+ del result[:]
+
+ def pre_err(target, source, env, result=result, **kw):
+ result.append('pre_err')
+ return 1
+
+ x = SCons.Executor.Executor(a, env, [], [t], ['s1', 's2'])
+ x.add_pre_action(pre_err)
+ x.add_post_action(post)
+ try:
+ x(t)
+ except SCons.Errors.BuildError:
+ pass
+ else:
+ raise Exception("Did not catch expected BuildError")
+ assert result == ['pre_err'], result
+ del result[:]
+
+ def test_cleanup(self):
+ """Test cleaning up an Executor"""
+ orig_env = MyEnvironment(e=1)
+ x = SCons.Executor.Executor('b', orig_env, [{'o':1}],
+ 't', ['s1', 's2'])
+
+ be = x.get_build_env()
+ assert be['e'] == 1, be['e']
+
+ x.cleanup()
+
+ x.env = MyEnvironment(eee=1)
+ be = x.get_build_env()
+ assert be['eee'] == 1, be['eee']
+
+ x.cleanup()
+
+ be = x.get_build_env()
+ assert be['eee'] == 1, be['eee']
+
+ def test_add_sources(self):
+ """Test adding sources to an Executor"""
+ x = SCons.Executor.Executor('b', 'e', 'o', 't', ['s1', 's2'])
+ sources = x.get_all_sources()
+ assert sources == ['s1', 's2'], sources
+
+ x.add_sources(['s1', 's2'])
+ sources = x.get_all_sources()
+ assert sources == ['s1', 's2'], sources
+
+ x.add_sources(['s3', 's1', 's4'])
+ sources = x.get_all_sources()
+ assert sources == ['s1', 's2', 's3', 's4'], sources
+
+ def test_get_sources(self):
+ """Test getting sources from an Executor"""
+ x = SCons.Executor.Executor('b', 'e', 'o', 't', ['s1', 's2'])
+ sources = x.get_sources()
+ assert sources == ['s1', 's2'], sources
+
+ x.add_sources(['s1', 's2'])
+ sources = x.get_sources()
+ assert sources == ['s1', 's2'], sources
+
+ x.add_sources(['s3', 's1', 's4'])
+ sources = x.get_sources()
+ assert sources == ['s1', 's2', 's3', 's4'], sources
+
+ def test_prepare(self):
+ """Test the Executor's prepare() method"""
+ env = MyEnvironment()
+ t1 = MyNode('t1')
+ s1 = MyNode('s1')
+ s2 = MyNode('s2')
+ s3 = MyNode('s3')
+ x = SCons.Executor.Executor('b', env, [{}], [t1], [s1, s2, s3])
+
+ s2.missing_val = True
+
+ try:
+ r = x.prepare()
+ except SCons.Errors.StopError as e:
+ assert str(e) == "Source `s2' not found, needed by target `t1'.", e
+ else:
+ raise AssertionError("did not catch expected StopError: %s" % r)
+
+ def test_add_pre_action(self):
+ """Test adding pre-actions to an Executor"""
+ x = SCons.Executor.Executor('b', 'e', 'o', 't', ['s1', 's2'])
+ x.add_pre_action('a1')
+ assert x.pre_actions == ['a1']
+ x.add_pre_action('a2')
+ assert x.pre_actions == ['a1', 'a2']
+
+ def test_add_post_action(self):
+ """Test adding post-actions to an Executor"""
+ x = SCons.Executor.Executor('b', 'e', 'o', 't', ['s1', 's2'])
+ x.add_post_action('a1')
+ assert x.post_actions == ['a1']
+ x.add_post_action('a2')
+ assert x.post_actions == ['a1', 'a2']
+
+ def test___str__(self):
+ """Test the __str__() method"""
+ env = MyEnvironment(S='string')
+
+ x = SCons.Executor.Executor(MyAction(), env, [], ['t'], ['s'])
+ c = str(x)
+ assert c == 'GENSTRING action1 action2 t s', c
+
+ x = SCons.Executor.Executor(MyAction(), env, [], ['t'], ['s'])
+ x.add_pre_action(MyAction(['pre']))
+ x.add_post_action(MyAction(['post']))
+ c = str(x)
+ expect = 'GENSTRING pre t s\n' + \
+ 'GENSTRING action1 action2 t s\n' + \
+ 'GENSTRING post t s'
+ assert c == expect, c
+
+ def test_nullify(self):
+ """Test the nullify() method"""
+ env = MyEnvironment(S='string')
+
+ result = []
+ def action1(target, source, env, result=result, **kw):
+ result.append('action1')
+
+ env = MyEnvironment()
+ a = MyAction([action1])
+ x = SCons.Executor.Executor(a, env, [], ['t1', 't2'], ['s1', 's2'])
+
+ x(MyNode('', [], []))
+ assert result == ['action1'], result
+ s = str(x)
+ assert s[:10] == 'GENSTRING ', s
+
+ del result[:]
+ x.nullify()
+
+ assert result == [], result
+ x(MyNode('', [], []))
+ assert result == [], result
+ s = str(x)
+ assert s == '', s
+
+ def test_get_contents(self):
+ """Test fetching the signatures contents"""
+ env = MyEnvironment(C='contents')
+
+ x = SCons.Executor.Executor(MyAction(), env, [], ['t'], ['s'])
+ c = x.get_contents()
+ assert c == b'action1 action2 t s', c
+
+ x = SCons.Executor.Executor(MyAction(actions=['grow']), env, [],
+ ['t'], ['s'])
+ x.add_pre_action(MyAction(['pre']))
+ x.add_post_action(MyAction(['post']))
+ c = x.get_contents()
+ assert c == b'pre t sgrow t spost t s', c
+
+ def test_get_timestamp(self):
+ """Test fetching the "timestamp" """
+ x = SCons.Executor.Executor('b', 'e', 'o', 't', ['s1', 's2'])
+ ts = x.get_timestamp()
+ assert ts == 0, ts
+
+ def test_scan_targets(self):
+ """Test scanning the targets for implicit dependencies"""
+ env = MyEnvironment(S='string')
+ t1 = MyNode('t1')
+ t2 = MyNode('t2')
+ sources = [MyNode('s1'), MyNode('s2')]
+ x = SCons.Executor.Executor(MyAction(), env, [{}], [t1, t2], sources)
+
+ deps = x.scan_targets(None)
+ assert t1.implicit == ['dep-t1', 'dep-t2'], t1.implicit
+ assert t2.implicit == ['dep-t1', 'dep-t2'], t2.implicit
+
+ t1.implicit = []
+ t2.implicit = []
+
+ deps = x.scan_targets(MyScanner('scanner-'))
+ assert t1.implicit == ['scanner-t1', 'scanner-t2'], t1.implicit
+ assert t2.implicit == ['scanner-t1', 'scanner-t2'], t2.implicit
+
+ def test_scan_sources(self):
+ """Test scanning the sources for implicit dependencies"""
+ env = MyEnvironment(S='string')
+ t1 = MyNode('t1')
+ t2 = MyNode('t2')
+ sources = [MyNode('s1'), MyNode('s2')]
+ x = SCons.Executor.Executor(MyAction(), env, [{}], [t1, t2], sources)
+
+ deps = x.scan_sources(None)
+ assert t1.implicit == ['dep-s1', 'dep-s2'], t1.implicit
+ assert t2.implicit == ['dep-s1', 'dep-s2'], t2.implicit
+
+ t1.implicit = []
+ t2.implicit = []
+
+ deps = x.scan_sources(MyScanner('scanner-'))
+ assert t1.implicit == ['scanner-s1', 'scanner-s2'], t1.implicit
+ assert t2.implicit == ['scanner-s1', 'scanner-s2'], t2.implicit
+
+ def test_get_unignored_sources(self):
+ """Test fetching the unignored source list"""
+ env = MyEnvironment()
+ s1 = MyNode('s1')
+ s2 = MyNode('s2')
+ s3 = MyNode('s3')
+ x = SCons.Executor.Executor('b', env, [{}], [], [s1, s2, s3])
+
+ r = x.get_unignored_sources(None, [])
+ assert r == [s1, s2, s3], list(map(str, r))
+
+ r = x.get_unignored_sources(None, [s2])
+ assert r == [s1, s3], list(map(str, r))
+
+ r = x.get_unignored_sources(None, [s1, s3])
+ assert r == [s2], list(map(str, r))
+
+ def test_changed_sources_for_alwaysBuild(self):
+ """
+ Ensure if a target is marked always build that the sources are always marked changed sources
+ :return:
+ """
+ env = MyEnvironment()
+ s1 = MyNode('s1')
+ s2 = MyNode('s2')
+ t1 = MyNode('t1')
+ t1.up_to_date = True
+ t1.always_build = True
+
+ x = SCons.Executor.Executor('b', env, [{}], [t1], [s1, s2])
+
+ changed_sources = x._get_changed_sources()
+ assert changed_sources == [s1, s2], "If target marked AlwaysBuild sources should always be marked changed"
+
+
+
+
+if __name__ == "__main__":
+ suite = unittest.TestSuite()
+ tclasses = [ ExecutorTestCase ]
+ for tclass in tclasses:
+ names = unittest.getTestCaseNames(tclass, 'test_')
+ suite.addTests(list(map(tclass, names)))
+ TestUnit.run(suite)
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Job.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Job.py
new file mode 100644
index 0000000..c0e80b1
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Job.py
@@ -0,0 +1,435 @@
+"""SCons.Job
+
+This module defines the Serial and Parallel classes that execute tasks to
+complete a build. The Jobs class provides a higher level interface to start,
+stop, and wait on jobs.
+
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import SCons.compat
+
+import os
+import signal
+
+import SCons.Errors
+
+# The default stack size (in kilobytes) of the threads used to execute
+# jobs in parallel.
+#
+# We use a stack size of 256 kilobytes. The default on some platforms
+# is too large and prevents us from creating enough threads to fully
+# parallelized the build. For example, the default stack size on linux
+# is 8 MBytes.
+
+explicit_stack_size = None
+default_stack_size = 256
+
+interrupt_msg = 'Build interrupted.'
+
+
+class InterruptState(object):
+ def __init__(self):
+ self.interrupted = False
+
+ def set(self):
+ self.interrupted = True
+
+ def __call__(self):
+ return self.interrupted
+
+
+class Jobs(object):
+ """An instance of this class initializes N jobs, and provides
+ methods for starting, stopping, and waiting on all N jobs.
+ """
+
+ def __init__(self, num, taskmaster):
+ """
+ Create 'num' jobs using the given taskmaster.
+
+ If 'num' is 1 or less, then a serial job will be used,
+ otherwise a parallel job with 'num' worker threads will
+ be used.
+
+ The 'num_jobs' attribute will be set to the actual number of jobs
+ allocated. If more than one job is requested but the Parallel
+ class can't do it, it gets reset to 1. Wrapping interfaces that
+ care should check the value of 'num_jobs' after initialization.
+ """
+
+ self.job = None
+ if num > 1:
+ stack_size = explicit_stack_size
+ if stack_size is None:
+ stack_size = default_stack_size
+
+ try:
+ self.job = Parallel(taskmaster, num, stack_size)
+ self.num_jobs = num
+ except NameError:
+ pass
+ if self.job is None:
+ self.job = Serial(taskmaster)
+ self.num_jobs = 1
+
+ def run(self, postfunc=lambda: None):
+ """Run the jobs.
+
+ postfunc() will be invoked after the jobs has run. It will be
+ invoked even if the jobs are interrupted by a keyboard
+ interrupt (well, in fact by a signal such as either SIGINT,
+ SIGTERM or SIGHUP). The execution of postfunc() is protected
+ against keyboard interrupts and is guaranteed to run to
+ completion."""
+ self._setup_sig_handler()
+ try:
+ self.job.start()
+ finally:
+ postfunc()
+ self._reset_sig_handler()
+
+ def were_interrupted(self):
+ """Returns whether the jobs were interrupted by a signal."""
+ return self.job.interrupted()
+
+ def _setup_sig_handler(self):
+ """Setup an interrupt handler so that SCons can shutdown cleanly in
+ various conditions:
+
+ a) SIGINT: Keyboard interrupt
+ b) SIGTERM: kill or system shutdown
+ c) SIGHUP: Controlling shell exiting
+
+ We handle all of these cases by stopping the taskmaster. It
+ turns out that it's very difficult to stop the build process
+ by throwing asynchronously an exception such as
+ KeyboardInterrupt. For example, the python Condition
+ variables (threading.Condition) and queues do not seem to be
+ asynchronous-exception-safe. It would require adding a whole
+ bunch of try/finally block and except KeyboardInterrupt all
+ over the place.
+
+ Note also that we have to be careful to handle the case when
+ SCons forks before executing another process. In that case, we
+ want the child to exit immediately.
+ """
+ def handler(signum, stack, self=self, parentpid=os.getpid()):
+ if os.getpid() == parentpid:
+ self.job.taskmaster.stop()
+ self.job.interrupted.set()
+ else:
+ os._exit(2)
+
+ self.old_sigint = signal.signal(signal.SIGINT, handler)
+ self.old_sigterm = signal.signal(signal.SIGTERM, handler)
+ try:
+ self.old_sighup = signal.signal(signal.SIGHUP, handler)
+ except AttributeError:
+ pass
+
+ def _reset_sig_handler(self):
+ """Restore the signal handlers to their previous state (before the
+ call to _setup_sig_handler()."""
+
+ signal.signal(signal.SIGINT, self.old_sigint)
+ signal.signal(signal.SIGTERM, self.old_sigterm)
+ try:
+ signal.signal(signal.SIGHUP, self.old_sighup)
+ except AttributeError:
+ pass
+
+class Serial(object):
+ """This class is used to execute tasks in series, and is more efficient
+ than Parallel, but is only appropriate for non-parallel builds. Only
+ one instance of this class should be in existence at a time.
+
+ This class is not thread safe.
+ """
+
+ def __init__(self, taskmaster):
+ """Create a new serial job given a taskmaster.
+
+ The taskmaster's next_task() method should return the next task
+ that needs to be executed, or None if there are no more tasks. The
+ taskmaster's executed() method will be called for each task when it
+ is successfully executed, or failed() will be called if it failed to
+ execute (e.g. execute() raised an exception)."""
+
+ self.taskmaster = taskmaster
+ self.interrupted = InterruptState()
+
+ def start(self):
+ """Start the job. This will begin pulling tasks from the taskmaster
+ and executing them, and return when there are no more tasks. If a task
+ fails to execute (i.e. execute() raises an exception), then the job will
+ stop."""
+
+ while True:
+ task = self.taskmaster.next_task()
+
+ if task is None:
+ break
+
+ try:
+ task.prepare()
+ if task.needs_execute():
+ task.execute()
+ except:
+ if self.interrupted():
+ try:
+ raise SCons.Errors.BuildError(
+ task.targets[0], errstr=interrupt_msg)
+ except:
+ task.exception_set()
+ else:
+ task.exception_set()
+
+ # Let the failed() callback function arrange for the
+ # build to stop if that's appropriate.
+ task.failed()
+ else:
+ task.executed()
+
+ task.postprocess()
+ self.taskmaster.cleanup()
+
+
+# Trap import failure so that everything in the Job module but the
+# Parallel class (and its dependent classes) will work if the interpreter
+# doesn't support threads.
+try:
+ import queue
+ import threading
+except ImportError:
+ pass
+else:
+ class Worker(threading.Thread):
+ """A worker thread waits on a task to be posted to its request queue,
+ dequeues the task, executes it, and posts a tuple including the task
+ and a boolean indicating whether the task executed successfully. """
+
+ def __init__(self, requestQueue, resultsQueue, interrupted):
+ threading.Thread.__init__(self)
+ self.setDaemon(1)
+ self.requestQueue = requestQueue
+ self.resultsQueue = resultsQueue
+ self.interrupted = interrupted
+ self.start()
+
+ def run(self):
+ while True:
+ task = self.requestQueue.get()
+
+ if task is None:
+ # The "None" value is used as a sentinel by
+ # ThreadPool.cleanup(). This indicates that there
+ # are no more tasks, so we should quit.
+ break
+
+ try:
+ if self.interrupted():
+ raise SCons.Errors.BuildError(
+ task.targets[0], errstr=interrupt_msg)
+ task.execute()
+ except:
+ task.exception_set()
+ ok = False
+ else:
+ ok = True
+
+ self.resultsQueue.put((task, ok))
+
+ class ThreadPool(object):
+ """This class is responsible for spawning and managing worker threads."""
+
+ def __init__(self, num, stack_size, interrupted):
+ """Create the request and reply queues, and 'num' worker threads.
+
+ One must specify the stack size of the worker threads. The
+ stack size is specified in kilobytes.
+ """
+ self.requestQueue = queue.Queue(0)
+ self.resultsQueue = queue.Queue(0)
+
+ try:
+ prev_size = threading.stack_size(stack_size*1024)
+ except AttributeError as e:
+ # Only print a warning if the stack size has been
+ # explicitly set.
+ if not explicit_stack_size is None:
+ msg = "Setting stack size is unsupported by this version of Python:\n " + \
+ e.args[0]
+ SCons.Warnings.warn(SCons.Warnings.StackSizeWarning, msg)
+ except ValueError as e:
+ msg = "Setting stack size failed:\n " + str(e)
+ SCons.Warnings.warn(SCons.Warnings.StackSizeWarning, msg)
+
+ # Create worker threads
+ self.workers = []
+ for _ in range(num):
+ worker = Worker(self.requestQueue, self.resultsQueue, interrupted)
+ self.workers.append(worker)
+
+ if 'prev_size' in locals():
+ threading.stack_size(prev_size)
+
+ def put(self, task):
+ """Put task into request queue."""
+ self.requestQueue.put(task)
+
+ def get(self):
+ """Remove and return a result tuple from the results queue."""
+ return self.resultsQueue.get()
+
+ def preparation_failed(self, task):
+ self.resultsQueue.put((task, False))
+
+ def cleanup(self):
+ """
+ Shuts down the thread pool, giving each worker thread a
+ chance to shut down gracefully.
+ """
+ # For each worker thread, put a sentinel "None" value
+ # on the requestQueue (indicating that there's no work
+ # to be done) so that each worker thread will get one and
+ # terminate gracefully.
+ for _ in self.workers:
+ self.requestQueue.put(None)
+
+ # Wait for all of the workers to terminate.
+ #
+ # If we don't do this, later Python versions (2.4, 2.5) often
+ # seem to raise exceptions during shutdown. This happens
+ # in requestQueue.get(), as an assertion failure that
+ # requestQueue.not_full is notified while not acquired,
+ # seemingly because the main thread has shut down (or is
+ # in the process of doing so) while the workers are still
+ # trying to pull sentinels off the requestQueue.
+ #
+ # Normally these terminations should happen fairly quickly,
+ # but we'll stick a one-second timeout on here just in case
+ # someone gets hung.
+ for worker in self.workers:
+ worker.join(1.0)
+ self.workers = []
+
+ class Parallel(object):
+ """This class is used to execute tasks in parallel, and is somewhat
+ less efficient than Serial, but is appropriate for parallel builds.
+
+ This class is thread safe.
+ """
+
+ def __init__(self, taskmaster, num, stack_size):
+ """Create a new parallel job given a taskmaster.
+
+ The taskmaster's next_task() method should return the next
+ task that needs to be executed, or None if there are no more
+ tasks. The taskmaster's executed() method will be called
+ for each task when it is successfully executed, or failed()
+ will be called if the task failed to execute (i.e. execute()
+ raised an exception).
+
+ Note: calls to taskmaster are serialized, but calls to
+ execute() on distinct tasks are not serialized, because
+ that is the whole point of parallel jobs: they can execute
+ multiple tasks simultaneously. """
+
+ self.taskmaster = taskmaster
+ self.interrupted = InterruptState()
+ self.tp = ThreadPool(num, stack_size, self.interrupted)
+
+ self.maxjobs = num
+
+ def start(self):
+ """Start the job. This will begin pulling tasks from the
+ taskmaster and executing them, and return when there are no
+ more tasks. If a task fails to execute (i.e. execute() raises
+ an exception), then the job will stop."""
+
+ jobs = 0
+
+ while True:
+ # Start up as many available tasks as we're
+ # allowed to.
+ while jobs < self.maxjobs:
+ task = self.taskmaster.next_task()
+ if task is None:
+ break
+
+ try:
+ # prepare task for execution
+ task.prepare()
+ except:
+ task.exception_set()
+ task.failed()
+ task.postprocess()
+ else:
+ if task.needs_execute():
+ # dispatch task
+ self.tp.put(task)
+ jobs = jobs + 1
+ else:
+ task.executed()
+ task.postprocess()
+
+ if not task and not jobs: break
+
+ # Let any/all completed tasks finish up before we go
+ # back and put the next batch of tasks on the queue.
+ while True:
+ task, ok = self.tp.get()
+ jobs = jobs - 1
+
+ if ok:
+ task.executed()
+ else:
+ if self.interrupted():
+ try:
+ raise SCons.Errors.BuildError(
+ task.targets[0], errstr=interrupt_msg)
+ except:
+ task.exception_set()
+
+ # Let the failed() callback function arrange
+ # for the build to stop if that's appropriate.
+ task.failed()
+
+ task.postprocess()
+
+ if self.tp.resultsQueue.empty():
+ break
+
+ self.tp.cleanup()
+ self.taskmaster.cleanup()
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/JobTests.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/JobTests.py
new file mode 100644
index 0000000..dd2c7aa
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/JobTests.py
@@ -0,0 +1,542 @@
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import unittest
+import random
+import math
+import sys
+import time
+
+import TestUnit
+
+import SCons.Job
+
+
+# a large number
+num_sines = 10000
+
+# how many parallel jobs to perform for the test
+num_jobs = 11
+
+# how many tasks to perform for the test
+num_tasks = num_jobs*5
+
+class DummyLock(object):
+ "fake lock class to use if threads are not supported"
+ def acquire(self):
+ pass
+
+ def release(self):
+ pass
+
+class NoThreadsException(object):
+ "raised by the ParallelTestCase if threads are not supported"
+
+ def __str__(self):
+ return "the interpreter doesn't support threads"
+
+class Task(object):
+ """A dummy task class for testing purposes."""
+
+ def __init__(self, i, taskmaster):
+ self.i = i
+ self.taskmaster = taskmaster
+ self.was_executed = 0
+ self.was_prepared = 0
+
+ def prepare(self):
+ self.was_prepared = 1
+
+ def _do_something(self):
+ pass
+
+ def needs_execute(self):
+ return True
+
+ def execute(self):
+ self.taskmaster.test_case.failUnless(self.was_prepared,
+ "the task wasn't prepared")
+
+ self.taskmaster.guard.acquire()
+ self.taskmaster.begin_list.append(self.i)
+ self.taskmaster.guard.release()
+
+ self._do_something()
+
+ self.was_executed = 1
+
+ self.taskmaster.guard.acquire()
+ self.taskmaster.end_list.append(self.i)
+ self.taskmaster.guard.release()
+
+ def executed(self):
+ self.taskmaster.num_executed = self.taskmaster.num_executed + 1
+
+ self.taskmaster.test_case.failUnless(self.was_prepared,
+ "the task wasn't prepared")
+ self.taskmaster.test_case.failUnless(self.was_executed,
+ "the task wasn't really executed")
+ self.taskmaster.test_case.failUnless(isinstance(self, Task),
+ "the task wasn't really a Task instance")
+
+ def failed(self):
+ self.taskmaster.num_failed = self.taskmaster.num_failed + 1
+ self.taskmaster.stop = 1
+ self.taskmaster.test_case.failUnless(self.was_prepared,
+ "the task wasn't prepared")
+
+ def postprocess(self):
+ self.taskmaster.num_postprocessed = self.taskmaster.num_postprocessed + 1
+
+class RandomTask(Task):
+ def _do_something(self):
+ # do something that will take some random amount of time:
+ for i in range(random.randrange(0, num_sines, 1)):
+ x = math.sin(i)
+ time.sleep(0.01)
+
+class ExceptionTask(object):
+ """A dummy task class for testing purposes."""
+
+ def __init__(self, i, taskmaster):
+ self.taskmaster = taskmaster
+ self.was_prepared = 0
+
+ def prepare(self):
+ self.was_prepared = 1
+
+ def needs_execute(self):
+ return True
+
+ def execute(self):
+ raise Exception
+
+ def executed(self):
+ self.taskmaster.num_executed = self.taskmaster.num_executed + 1
+
+ self.taskmaster.test_case.failUnless(self.was_prepared,
+ "the task wasn't prepared")
+ self.taskmaster.test_case.failUnless(self.was_executed,
+ "the task wasn't really executed")
+ self.taskmaster.test_case.failUnless(self.__class__ is Task,
+ "the task wasn't really a Task instance")
+
+ def failed(self):
+ self.taskmaster.num_failed = self.taskmaster.num_failed + 1
+ self.taskmaster.stop = 1
+ self.taskmaster.test_case.failUnless(self.was_prepared,
+ "the task wasn't prepared")
+
+ def postprocess(self):
+ self.taskmaster.num_postprocessed = self.taskmaster.num_postprocessed + 1
+
+ def exception_set(self):
+ self.taskmaster.exception_set()
+
+class Taskmaster(object):
+ """A dummy taskmaster class for testing the job classes."""
+
+ def __init__(self, n, test_case, Task):
+ """n is the number of dummy tasks to perform."""
+
+ self.test_case = test_case
+ self.stop = None
+ self.num_tasks = n
+ self.num_iterated = 0
+ self.num_executed = 0
+ self.num_failed = 0
+ self.num_postprocessed = 0
+ self.Task = Task
+ # 'guard' guards 'task_begin_list' and 'task_end_list'
+ try:
+ import threading
+ self.guard = threading.Lock()
+ except:
+ self.guard = DummyLock()
+
+ # keep track of the order tasks are begun in
+ self.begin_list = []
+
+ # keep track of the order tasks are completed in
+ self.end_list = []
+
+ def next_task(self):
+ if self.stop or self.all_tasks_are_iterated():
+ return None
+ else:
+ self.num_iterated = self.num_iterated + 1
+ return self.Task(self.num_iterated, self)
+
+ def all_tasks_are_executed(self):
+ return self.num_executed == self.num_tasks
+
+ def all_tasks_are_iterated(self):
+ return self.num_iterated == self.num_tasks
+
+ def all_tasks_are_postprocessed(self):
+ return self.num_postprocessed == self.num_tasks
+
+ def tasks_were_serial(self):
+ "analyze the task order to see if they were serial"
+ serial = 1 # assume the tasks were serial
+ for i in range(num_tasks):
+ serial = serial and (self.begin_list[i]
+ == self.end_list[i]
+ == (i + 1))
+ return serial
+
+ def exception_set(self):
+ pass
+
+ def cleanup(self):
+ pass
+
+SaveThreadPool = None
+ThreadPoolCallList = []
+
+class ParallelTestCase(unittest.TestCase):
+ def runTest(self):
+ "test parallel jobs"
+
+ try:
+ import threading
+ except:
+ raise NoThreadsException()
+
+ taskmaster = Taskmaster(num_tasks, self, RandomTask)
+ jobs = SCons.Job.Jobs(num_jobs, taskmaster)
+ jobs.run()
+
+ self.failUnless(not taskmaster.tasks_were_serial(),
+ "the tasks were not executed in parallel")
+ self.failUnless(taskmaster.all_tasks_are_executed(),
+ "all the tests were not executed")
+ self.failUnless(taskmaster.all_tasks_are_iterated(),
+ "all the tests were not iterated over")
+ self.failUnless(taskmaster.all_tasks_are_postprocessed(),
+ "all the tests were not postprocessed")
+ self.failIf(taskmaster.num_failed,
+ "some task(s) failed to execute")
+
+ # Verify that parallel jobs will pull all of the completed tasks
+ # out of the queue at once, instead of one by one. We do this by
+ # replacing the default ThreadPool class with one that records the
+ # order in which tasks are put() and get() to/from the pool, and
+ # which sleeps a little bit before call get() to let the initial
+ # tasks complete and get their notifications on the resultsQueue.
+
+ class SleepTask(Task):
+ def _do_something(self):
+ time.sleep(0.1)
+
+ global SaveThreadPool
+ SaveThreadPool = SCons.Job.ThreadPool
+
+ class WaitThreadPool(SaveThreadPool):
+ def put(self, task):
+ ThreadPoolCallList.append('put(%s)' % task.i)
+ return SaveThreadPool.put(self, task)
+ def get(self):
+ time.sleep(0.5)
+ result = SaveThreadPool.get(self)
+ ThreadPoolCallList.append('get(%s)' % result[0].i)
+ return result
+
+ SCons.Job.ThreadPool = WaitThreadPool
+
+ try:
+ taskmaster = Taskmaster(3, self, SleepTask)
+ jobs = SCons.Job.Jobs(2, taskmaster)
+ jobs.run()
+
+ # The key here is that we get(1) and get(2) from the
+ # resultsQueue before we put(3), but get(1) and get(2) can
+ # be in either order depending on how the first two parallel
+ # tasks get scheduled by the operating system.
+ expect = [
+ ['put(1)', 'put(2)', 'get(1)', 'get(2)', 'put(3)', 'get(3)'],
+ ['put(1)', 'put(2)', 'get(2)', 'get(1)', 'put(3)', 'get(3)'],
+ ]
+ assert ThreadPoolCallList in expect, ThreadPoolCallList
+
+ finally:
+ SCons.Job.ThreadPool = SaveThreadPool
+
+class SerialTestCase(unittest.TestCase):
+ def runTest(self):
+ "test a serial job"
+
+ taskmaster = Taskmaster(num_tasks, self, RandomTask)
+ jobs = SCons.Job.Jobs(1, taskmaster)
+ jobs.run()
+
+ self.failUnless(taskmaster.tasks_were_serial(),
+ "the tasks were not executed in series")
+ self.failUnless(taskmaster.all_tasks_are_executed(),
+ "all the tests were not executed")
+ self.failUnless(taskmaster.all_tasks_are_iterated(),
+ "all the tests were not iterated over")
+ self.failUnless(taskmaster.all_tasks_are_postprocessed(),
+ "all the tests were not postprocessed")
+ self.failIf(taskmaster.num_failed,
+ "some task(s) failed to execute")
+
+class NoParallelTestCase(unittest.TestCase):
+ def runTest(self):
+ "test handling lack of parallel support"
+ def NoParallel(tm, num, stack_size):
+ raise NameError
+ save_Parallel = SCons.Job.Parallel
+ SCons.Job.Parallel = NoParallel
+ try:
+ taskmaster = Taskmaster(num_tasks, self, RandomTask)
+ jobs = SCons.Job.Jobs(2, taskmaster)
+ self.failUnless(jobs.num_jobs == 1,
+ "unexpected number of jobs %d" % jobs.num_jobs)
+ jobs.run()
+ self.failUnless(taskmaster.tasks_were_serial(),
+ "the tasks were not executed in series")
+ self.failUnless(taskmaster.all_tasks_are_executed(),
+ "all the tests were not executed")
+ self.failUnless(taskmaster.all_tasks_are_iterated(),
+ "all the tests were not iterated over")
+ self.failUnless(taskmaster.all_tasks_are_postprocessed(),
+ "all the tests were not postprocessed")
+ self.failIf(taskmaster.num_failed,
+ "some task(s) failed to execute")
+ finally:
+ SCons.Job.Parallel = save_Parallel
+
+
+class SerialExceptionTestCase(unittest.TestCase):
+ def runTest(self):
+ "test a serial job with tasks that raise exceptions"
+
+ taskmaster = Taskmaster(num_tasks, self, ExceptionTask)
+ jobs = SCons.Job.Jobs(1, taskmaster)
+ jobs.run()
+
+ self.failIf(taskmaster.num_executed,
+ "a task was executed")
+ self.failUnless(taskmaster.num_iterated == 1,
+ "exactly one task should have been iterated")
+ self.failUnless(taskmaster.num_failed == 1,
+ "exactly one task should have failed")
+ self.failUnless(taskmaster.num_postprocessed == 1,
+ "exactly one task should have been postprocessed")
+
+class ParallelExceptionTestCase(unittest.TestCase):
+ def runTest(self):
+ "test parallel jobs with tasks that raise exceptions"
+
+ taskmaster = Taskmaster(num_tasks, self, ExceptionTask)
+ jobs = SCons.Job.Jobs(num_jobs, taskmaster)
+ jobs.run()
+
+ self.failIf(taskmaster.num_executed,
+ "a task was executed")
+ self.failUnless(taskmaster.num_iterated >= 1,
+ "one or more task should have been iterated")
+ self.failUnless(taskmaster.num_failed >= 1,
+ "one or more tasks should have failed")
+ self.failUnless(taskmaster.num_postprocessed >= 1,
+ "one or more tasks should have been postprocessed")
+
+#---------------------------------------------------------------------
+# Above tested Job object with contrived Task and Taskmaster objects.
+# Now test Job object with actual Task and Taskmaster objects.
+
+import SCons.Taskmaster
+import SCons.Node
+import time
+
+class DummyNodeInfo(object):
+ def update(self, obj):
+ pass
+
+class testnode (SCons.Node.Node):
+ def __init__(self):
+ SCons.Node.Node.__init__(self)
+ self.expect_to_be = SCons.Node.executed
+ self.ninfo = DummyNodeInfo()
+
+class goodnode (testnode):
+ def __init__(self):
+ SCons.Node.Node.__init__(self)
+ self.expect_to_be = SCons.Node.up_to_date
+ self.ninfo = DummyNodeInfo()
+
+class slowgoodnode (goodnode):
+ def prepare(self):
+ # Delay to allow scheduled Jobs to run while the dispatcher
+ # sleeps. Keep this short because it affects the time taken
+ # by this test.
+ time.sleep(0.15)
+ goodnode.prepare(self)
+
+class badnode (goodnode):
+ def __init__(self):
+ goodnode.__init__(self)
+ self.expect_to_be = SCons.Node.failed
+ def build(self, **kw):
+ raise Exception('badnode exception')
+
+class slowbadnode (badnode):
+ def build(self, **kw):
+ # Appears to take a while to build, allowing faster builds to
+ # overlap. Time duration is not especially important, but if
+ # it is faster than slowgoodnode then these could complete
+ # while the scheduler is sleeping.
+ time.sleep(0.05)
+ raise Exception('slowbadnode exception')
+
+class badpreparenode (badnode):
+ def prepare(self):
+ raise Exception('badpreparenode exception')
+
+class _SConsTaskTest(unittest.TestCase):
+
+ def _test_seq(self, num_jobs):
+ for node_seq in [
+ [goodnode],
+ [badnode],
+ [slowbadnode],
+ [slowgoodnode],
+ [badpreparenode],
+ [goodnode, badnode],
+ [slowgoodnode, badnode],
+ [goodnode, slowbadnode],
+ [goodnode, goodnode, goodnode, slowbadnode],
+ [goodnode, slowbadnode, badpreparenode, slowgoodnode],
+ [goodnode, slowbadnode, slowgoodnode, badnode]
+ ]:
+
+ self._do_test(num_jobs, node_seq)
+
+ def _do_test(self, num_jobs, node_seq):
+
+ testnodes = []
+ for tnum in range(num_tasks):
+ testnodes.append(node_seq[tnum % len(node_seq)]())
+
+ taskmaster = SCons.Taskmaster.Taskmaster(testnodes,
+ tasker=SCons.Taskmaster.AlwaysTask)
+
+ jobs = SCons.Job.Jobs(num_jobs, taskmaster)
+
+ # Exceptions thrown by tasks are not actually propagated to
+ # this level, but are instead stored in the Taskmaster.
+
+ jobs.run()
+
+ # Now figure out if tests proceeded correctly. The first test
+ # that fails will shutdown the initiation of subsequent tests,
+ # but any tests currently queued for execution will still be
+ # processed, and any tests that completed before the failure
+ # would have resulted in new tests being queued for execution.
+
+ # Apply the following operational heuristics of Job.py:
+ # 0) An initial jobset of tasks will be queued before any
+ # good/bad results are obtained (from "execute" of task in
+ # thread).
+ # 1) A goodnode will complete immediately on its thread and
+ # allow another node to be queued for execution.
+ # 2) A badnode will complete immediately and suppress any
+ # subsequent execution queuing, but all currently queued
+ # tasks will still be processed.
+ # 3) A slowbadnode will fail later. It will block slots in
+ # the job queue. Nodes that complete immediately will
+ # allow other nodes to be queued in their place, and this
+ # will continue until either (#2) above or until all job
+ # slots are filled with slowbadnode entries.
+
+ # One approach to validating this test would be to try to
+ # determine exactly how many nodes executed, how many didn't,
+ # and the results of each, and then to assert failure on any
+ # mismatch (including the total number of built nodes).
+ # However, while this is possible to do for a single-processor
+ # system, it is nearly impossible to predict correctly for a
+ # multi-processor system and still test the characteristics of
+ # delayed execution nodes. Stated another way, multithreading
+ # is inherently non-deterministic unless you can completely
+ # characterize the entire system, and since that's not
+ # possible here, we shouldn't try.
+
+ # Therefore, this test will simply scan the set of nodes to
+ # see if the node was executed or not and if it was executed
+ # that it obtained the expected value for that node
+ # (i.e. verifying we don't get failure crossovers or
+ # mislabelling of results).
+
+ for N in testnodes:
+ state = N.get_state()
+ self.failUnless(state in [SCons.Node.no_state, N.expect_to_be],
+ "Node %s got unexpected result: %s" % (N, state))
+
+ self.failUnless([N for N in testnodes if N.get_state()],
+ "no nodes ran at all.")
+
+
+class SerialTaskTest(_SConsTaskTest):
+ def runTest(self):
+ "test serial jobs with actual Taskmaster and Task"
+ self._test_seq(1)
+
+
+class ParallelTaskTest(_SConsTaskTest):
+ def runTest(self):
+ "test parallel jobs with actual Taskmaster and Task"
+ self._test_seq(num_jobs)
+
+
+
+#---------------------------------------------------------------------
+
+def suite():
+ suite = unittest.TestSuite()
+ suite.addTest(ParallelTestCase())
+ suite.addTest(SerialTestCase())
+ suite.addTest(NoParallelTestCase())
+ suite.addTest(SerialExceptionTestCase())
+ suite.addTest(ParallelExceptionTestCase())
+ suite.addTest(SerialTaskTest())
+ suite.addTest(ParallelTaskTest())
+ return suite
+
+if __name__ == "__main__":
+ runner = TestUnit.cli.get_runner()
+ result = runner().run(suite())
+ if (len(result.failures) == 0
+ and len(result.errors) == 1
+ and isinstance(result.errors[0][0], SerialTestCase)
+ and isinstance(result.errors[0][1][0], NoThreadsException)):
+ sys.exit(2)
+ elif not result.wasSuccessful():
+ sys.exit(1)
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Memoize.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Memoize.py
new file mode 100644
index 0000000..5bdcf42
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Memoize.py
@@ -0,0 +1,245 @@
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+from __future__ import print_function
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+__doc__ = """Memoizer
+
+A decorator-based implementation to count hits and misses of the computed
+values that various methods cache in memory.
+
+Use of this modules assumes that wrapped methods be coded to cache their
+values in a consistent way. In particular, it requires that the class uses a
+dictionary named "_memo" to store the cached values.
+
+Here is an example of wrapping a method that returns a computed value,
+with no input parameters::
+
+ @SCons.Memoize.CountMethodCall
+ def foo(self):
+
+ try: # Memoization
+ return self._memo['foo'] # Memoization
+ except KeyError: # Memoization
+ pass # Memoization
+
+ result = self.compute_foo_value()
+
+ self._memo['foo'] = result # Memoization
+
+ return result
+
+Here is an example of wrapping a method that will return different values
+based on one or more input arguments::
+
+ def _bar_key(self, argument): # Memoization
+ return argument # Memoization
+
+ @SCons.Memoize.CountDictCall(_bar_key)
+ def bar(self, argument):
+
+ memo_key = argument # Memoization
+ try: # Memoization
+ memo_dict = self._memo['bar'] # Memoization
+ except KeyError: # Memoization
+ memo_dict = {} # Memoization
+ self._memo['dict'] = memo_dict # Memoization
+ else: # Memoization
+ try: # Memoization
+ return memo_dict[memo_key] # Memoization
+ except KeyError: # Memoization
+ pass # Memoization
+
+ result = self.compute_bar_value(argument)
+
+ memo_dict[memo_key] = result # Memoization
+
+ return result
+
+Deciding what to cache is tricky, because different configurations
+can have radically different performance tradeoffs, and because the
+tradeoffs involved are often so non-obvious. Consequently, deciding
+whether or not to cache a given method will likely be more of an art than
+a science, but should still be based on available data from this module.
+Here are some VERY GENERAL guidelines about deciding whether or not to
+cache return values from a method that's being called a lot:
+
+ -- The first question to ask is, "Can we change the calling code
+ so this method isn't called so often?" Sometimes this can be
+ done by changing the algorithm. Sometimes the *caller* should
+ be memoized, not the method you're looking at.
+
+ -- The memoized function should be timed with multiple configurations
+ to make sure it doesn't inadvertently slow down some other
+ configuration.
+
+ -- When memoizing values based on a dictionary key composed of
+ input arguments, you don't need to use all of the arguments
+ if some of them don't affect the return values.
+
+"""
+
+# A flag controlling whether or not we actually use memoization.
+use_memoizer = None
+
+# Global list of counter objects
+CounterList = {}
+
+class Counter(object):
+ """
+ Base class for counting memoization hits and misses.
+
+ We expect that the initialization in a matching decorator will
+ fill in the correct class name and method name that represents
+ the name of the function being counted.
+ """
+ def __init__(self, cls_name, method_name):
+ """
+ """
+ self.cls_name = cls_name
+ self.method_name = method_name
+ self.hit = 0
+ self.miss = 0
+ def key(self):
+ return self.cls_name+'.'+self.method_name
+ def display(self):
+ print(" {:7d} hits {:7d} misses {}()".format(self.hit, self.miss, self.key()))
+ def __eq__(self, other):
+ try:
+ return self.key() == other.key()
+ except AttributeError:
+ return True
+
+class CountValue(Counter):
+ """
+ A counter class for simple, atomic memoized values.
+
+ A CountValue object should be instantiated in a decorator for each of
+ the class's methods that memoizes its return value by simply storing
+ the return value in its _memo dictionary.
+ """
+ def count(self, *args, **kw):
+ """ Counts whether the memoized value has already been
+ set (a hit) or not (a miss).
+ """
+ obj = args[0]
+ if self.method_name in obj._memo:
+ self.hit = self.hit + 1
+ else:
+ self.miss = self.miss + 1
+
+class CountDict(Counter):
+ """
+ A counter class for memoized values stored in a dictionary, with
+ keys based on the method's input arguments.
+
+ A CountDict object is instantiated in a decorator for each of the
+ class's methods that memoizes its return value in a dictionary,
+ indexed by some key that can be computed from one or more of
+ its input arguments.
+ """
+ def __init__(self, cls_name, method_name, keymaker):
+ """
+ """
+ Counter.__init__(self, cls_name, method_name)
+ self.keymaker = keymaker
+ def count(self, *args, **kw):
+ """ Counts whether the computed key value is already present
+ in the memoization dictionary (a hit) or not (a miss).
+ """
+ obj = args[0]
+ try:
+ memo_dict = obj._memo[self.method_name]
+ except KeyError:
+ self.miss = self.miss + 1
+ else:
+ key = self.keymaker(*args, **kw)
+ if key in memo_dict:
+ self.hit = self.hit + 1
+ else:
+ self.miss = self.miss + 1
+
+def Dump(title=None):
+ """ Dump the hit/miss count for all the counters
+ collected so far.
+ """
+ if title:
+ print(title)
+ for counter in sorted(CounterList):
+ CounterList[counter].display()
+
+def EnableMemoization():
+ global use_memoizer
+ use_memoizer = 1
+
+def CountMethodCall(fn):
+ """ Decorator for counting memoizer hits/misses while retrieving
+ a simple value in a class method. It wraps the given method
+ fn and uses a CountValue object to keep track of the
+ caching statistics.
+ Wrapping gets enabled by calling EnableMemoization().
+ """
+ if use_memoizer:
+ def wrapper(self, *args, **kwargs):
+ global CounterList
+ key = self.__class__.__name__+'.'+fn.__name__
+ if key not in CounterList:
+ CounterList[key] = CountValue(self.__class__.__name__, fn.__name__)
+ CounterList[key].count(self, *args, **kwargs)
+ return fn(self, *args, **kwargs)
+ wrapper.__name__= fn.__name__
+ return wrapper
+ else:
+ return fn
+
+def CountDictCall(keyfunc):
+ """ Decorator for counting memoizer hits/misses while accessing
+ dictionary values with a key-generating function. Like
+ CountMethodCall above, it wraps the given method
+ fn and uses a CountDict object to keep track of the
+ caching statistics. The dict-key function keyfunc has to
+ get passed in the decorator call and gets stored in the
+ CountDict instance.
+ Wrapping gets enabled by calling EnableMemoization().
+ """
+ def decorator(fn):
+ if use_memoizer:
+ def wrapper(self, *args, **kwargs):
+ global CounterList
+ key = self.__class__.__name__+'.'+fn.__name__
+ if key not in CounterList:
+ CounterList[key] = CountDict(self.__class__.__name__, fn.__name__, keyfunc)
+ CounterList[key].count(self, *args, **kwargs)
+ return fn(self, *args, **kwargs)
+ wrapper.__name__= fn.__name__
+ return wrapper
+ else:
+ return fn
+ return decorator
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/MemoizeTests.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/MemoizeTests.py
new file mode 100644
index 0000000..3ce9a11
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/MemoizeTests.py
@@ -0,0 +1,182 @@
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import sys
+import unittest
+
+import TestUnit
+
+import SCons.Memoize
+
+# Enable memoization counting
+SCons.Memoize.EnableMemoization()
+
+class FakeObject(object):
+ def __init__(self):
+ self._memo = {}
+
+ def _dict_key(self, argument):
+ return argument
+
+ @SCons.Memoize.CountDictCall(_dict_key)
+ def dict(self, argument):
+
+ memo_key = argument
+ try:
+ memo_dict = self._memo['dict']
+ except KeyError:
+ memo_dict = {}
+ self._memo['dict'] = memo_dict
+ else:
+ try:
+ return memo_dict[memo_key]
+ except KeyError:
+ pass
+
+ result = self.compute_dict(argument)
+
+ memo_dict[memo_key] = result
+
+ return result
+
+ @SCons.Memoize.CountMethodCall
+ def value(self):
+
+ try:
+ return self._memo['value']
+ except KeyError:
+ pass
+
+ result = self.compute_value()
+
+ self._memo['value'] = result
+
+ return result
+
+ def get_memoizer_counter(self, name):
+ return SCons.Memoize.CounterList.get(self.__class__.__name__+'.'+name, None)
+
+class Returner(object):
+ def __init__(self, result):
+ self.result = result
+ self.calls = 0
+ def __call__(self, *args, **kw):
+ self.calls = self.calls + 1
+ return self.result
+
+
+class CountDictTestCase(unittest.TestCase):
+
+ def test___call__(self):
+ """Calling a Memoized dict method
+ """
+ obj = FakeObject()
+
+ called = []
+
+ fd1 = Returner(1)
+ fd2 = Returner(2)
+
+ obj.compute_dict = fd1
+
+ r = obj.dict(11)
+ assert r == 1, r
+
+ obj.compute_dict = fd2
+
+ r = obj.dict(12)
+ assert r == 2, r
+
+ r = obj.dict(11)
+ assert r == 1, r
+
+ obj.compute_dict = fd1
+
+ r = obj.dict(11)
+ assert r == 1, r
+
+ r = obj.dict(12)
+ assert r == 2, r
+
+ assert fd1.calls == 1, fd1.calls
+ assert fd2.calls == 1, fd2.calls
+
+ c = obj.get_memoizer_counter('dict')
+
+ assert c.hit == 3, c.hit
+ assert c.miss == 2, c.miss
+
+
+class CountValueTestCase(unittest.TestCase):
+
+ def test___call__(self):
+ """Calling a Memoized value method
+ """
+ obj = FakeObject()
+
+ called = []
+
+ fv1 = Returner(1)
+ fv2 = Returner(2)
+
+ obj.compute_value = fv1
+
+ r = obj.value()
+ assert r == 1, r
+ r = obj.value()
+ assert r == 1, r
+
+ obj.compute_value = fv2
+
+ r = obj.value()
+ assert r == 1, r
+ r = obj.value()
+ assert r == 1, r
+
+ assert fv1.calls == 1, fv1.calls
+ assert fv2.calls == 0, fv2.calls
+
+ c = obj.get_memoizer_counter('value')
+
+ assert c.hit == 3, c.hit
+ assert c.miss == 1, c.miss
+
+
+if __name__ == "__main__":
+ suite = unittest.TestSuite()
+ tclasses = [
+ CountDictTestCase,
+ CountValueTestCase,
+ ]
+ for tclass in tclasses:
+ names = unittest.getTestCaseNames(tclass, 'test_')
+ suite.addTests(list(map(tclass, names)))
+ TestUnit.run(suite)
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Node/Alias.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Node/Alias.py
new file mode 100644
index 0000000..a035816
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Node/Alias.py
@@ -0,0 +1,181 @@
+
+"""scons.Node.Alias
+
+Alias nodes.
+
+This creates a hash of global Aliases (dummy targets).
+
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import collections
+
+import SCons.Errors
+import SCons.Node
+import SCons.Util
+
+class AliasNameSpace(collections.UserDict):
+ def Alias(self, name, **kw):
+ if isinstance(name, SCons.Node.Alias.Alias):
+ return name
+ try:
+ a = self[name]
+ except KeyError:
+ a = SCons.Node.Alias.Alias(name, **kw)
+ self[name] = a
+ return a
+
+ def lookup(self, name, **kw):
+ try:
+ return self[name]
+ except KeyError:
+ return None
+
+class AliasNodeInfo(SCons.Node.NodeInfoBase):
+ __slots__ = ('csig',)
+ current_version_id = 2
+ field_list = ['csig']
+ def str_to_node(self, s):
+ return default_ans.Alias(s)
+
+ def __getstate__(self):
+ """
+ Return all fields that shall be pickled. Walk the slots in the class
+ hierarchy and add those to the state dictionary. If a '__dict__' slot is
+ available, copy all entries to the dictionary. Also include the version
+ id, which is fixed for all instances of a class.
+ """
+ state = getattr(self, '__dict__', {}).copy()
+ for obj in type(self).mro():
+ for name in getattr(obj,'__slots__',()):
+ if hasattr(self, name):
+ state[name] = getattr(self, name)
+
+ state['_version_id'] = self.current_version_id
+ try:
+ del state['__weakref__']
+ except KeyError:
+ pass
+
+ return state
+
+ def __setstate__(self, state):
+ """
+ Restore the attributes from a pickled state.
+ """
+ # TODO check or discard version
+ del state['_version_id']
+ for key, value in state.items():
+ if key not in ('__weakref__',):
+ setattr(self, key, value)
+
+
+class AliasBuildInfo(SCons.Node.BuildInfoBase):
+ __slots__ = ()
+ current_version_id = 2
+
+class Alias(SCons.Node.Node):
+
+ NodeInfo = AliasNodeInfo
+ BuildInfo = AliasBuildInfo
+
+ def __init__(self, name):
+ SCons.Node.Node.__init__(self)
+ self.name = name
+ self.changed_since_last_build = 1
+ self.store_info = 0
+
+ def str_for_display(self):
+ return '"' + self.__str__() + '"'
+
+ def __str__(self):
+ return self.name
+
+ def make_ready(self):
+ self.get_csig()
+
+ really_build = SCons.Node.Node.build
+ is_up_to_date = SCons.Node.Node.children_are_up_to_date
+
+ def is_under(self, dir):
+ # Make Alias nodes get built regardless of
+ # what directory scons was run from. Alias nodes
+ # are outside the filesystem:
+ return 1
+
+ def get_contents(self):
+ """The contents of an alias is the concatenation
+ of the content signatures of all its sources."""
+ childsigs = [n.get_csig() for n in self.children()]
+ return ''.join(childsigs)
+
+ def sconsign(self):
+ """An Alias is not recorded in .sconsign files"""
+ pass
+
+ #
+ #
+ #
+
+ def build(self):
+ """A "builder" for aliases."""
+ pass
+
+ def convert(self):
+ try: del self.builder
+ except AttributeError: pass
+ self.reset_executor()
+ self.build = self.really_build
+
+ def get_csig(self):
+ """
+ Generate a node's content signature, the digested signature
+ of its content.
+
+ node - the node
+ cache - alternate node to use for the signature cache
+ returns - the content signature
+ """
+ try:
+ return self.ninfo.csig
+ except AttributeError:
+ pass
+
+ contents = self.get_contents()
+ csig = SCons.Util.MD5signature(contents)
+ self.get_ninfo().csig = csig
+ return csig
+
+default_ans = AliasNameSpace()
+
+SCons.Node.arg2nodes_lookups.append(default_ans.lookup)
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Node/AliasTests.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Node/AliasTests.py
new file mode 100644
index 0000000..8e31875
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Node/AliasTests.py
@@ -0,0 +1,131 @@
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import sys
+import unittest
+
+import TestUnit
+
+import SCons.Errors
+import SCons.Node.Alias
+
+class AliasTestCase(unittest.TestCase):
+
+ def test_AliasNameSpace(self):
+ """Test creating an Alias name space
+ """
+ ans = SCons.Node.Alias.AliasNameSpace()
+ assert ans is not None, ans
+
+ def test_ANS_Alias(self):
+ """Test the Alias() factory
+ """
+ ans = SCons.Node.Alias.AliasNameSpace()
+
+ a1 = ans.Alias('a1')
+ assert a1.name == 'a1', a1.name
+
+ a2 = ans.Alias('a1')
+ assert a1 is a2, (a1, a2)
+
+ def test_get_contents(self):
+ """Test the get_contents() method
+ """
+ class DummyNode(object):
+ def __init__(self, contents):
+ self.contents = contents
+ def get_csig(self):
+ return self.contents
+ def get_contents(self):
+ return self.contents
+
+ ans = SCons.Node.Alias.AliasNameSpace()
+
+ ans.Alias('a1')
+ a = ans.lookup('a1')
+
+ a.sources = [ DummyNode('one'), DummyNode('two'), DummyNode('three') ]
+
+ c = a.get_contents()
+ assert c == 'onetwothree', c
+
+ def test_lookup(self):
+ """Test the lookup() method
+ """
+ ans = SCons.Node.Alias.AliasNameSpace()
+
+ ans.Alias('a1')
+ a = ans.lookup('a1')
+ assert a.name == 'a1', a.name
+
+ a1 = ans.lookup('a1')
+ assert a is a1, a1
+
+ a = ans.lookup('a2')
+ assert a is None, a
+
+ def test_Alias(self):
+ """Test creating an Alias() object
+ """
+ a1 = SCons.Node.Alias.Alias('a')
+ assert a1.name == 'a', a1.name
+
+ a2 = SCons.Node.Alias.Alias('a')
+ assert a2.name == 'a', a2.name
+
+ assert not a1 is a2
+ assert a1.name == a2.name
+
+class AliasNodeInfoTestCase(unittest.TestCase):
+ def test___init__(self):
+ """Test AliasNodeInfo initialization"""
+ ans = SCons.Node.Alias.AliasNameSpace()
+ aaa = ans.Alias('aaa')
+ ni = SCons.Node.Alias.AliasNodeInfo()
+
+class AliasBuildInfoTestCase(unittest.TestCase):
+ def test___init__(self):
+ """Test AliasBuildInfo initialization"""
+ ans = SCons.Node.Alias.AliasNameSpace()
+ aaa = ans.Alias('aaa')
+ bi = SCons.Node.Alias.AliasBuildInfo()
+
+if __name__ == "__main__":
+ suite = unittest.TestSuite()
+ tclasses = [
+ AliasTestCase,
+ AliasBuildInfoTestCase,
+ AliasNodeInfoTestCase,
+ ]
+ for tclass in tclasses:
+ names = unittest.getTestCaseNames(tclass, 'test_')
+ suite.addTests(list(map(tclass, names)))
+ TestUnit.run(suite)
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Node/FS.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Node/FS.py
new file mode 100644
index 0000000..684f0d1
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Node/FS.py
@@ -0,0 +1,3545 @@
+"""scons.Node.FS
+
+File system nodes.
+
+These Nodes represent the canonical external objects that people think
+of when they think of building software: files and directories.
+
+This holds a "default_fs" variable that should be initialized with an FS
+that can be used by scripts or modules looking for the canonical default.
+
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+from __future__ import print_function
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import fnmatch
+import os
+import re
+import shutil
+import stat
+import sys
+import time
+import codecs
+
+import SCons.Action
+import SCons.Debug
+from SCons.Debug import logInstanceCreation
+import SCons.Errors
+import SCons.Memoize
+import SCons.Node
+import SCons.Node.Alias
+import SCons.Subst
+import SCons.Util
+import SCons.Warnings
+
+from SCons.Debug import Trace
+
+print_duplicate = 0
+
+
+def sconsign_none(node):
+ raise NotImplementedError
+
+def sconsign_dir(node):
+ """Return the .sconsign file info for this directory,
+ creating it first if necessary."""
+ if not node._sconsign:
+ import SCons.SConsign
+ node._sconsign = SCons.SConsign.ForDirectory(node)
+ return node._sconsign
+
+_sconsign_map = {0 : sconsign_none,
+ 1 : sconsign_dir}
+
+class EntryProxyAttributeError(AttributeError):
+ """
+ An AttributeError subclass for recording and displaying the name
+ of the underlying Entry involved in an AttributeError exception.
+ """
+ def __init__(self, entry_proxy, attribute):
+ AttributeError.__init__(self)
+ self.entry_proxy = entry_proxy
+ self.attribute = attribute
+ def __str__(self):
+ entry = self.entry_proxy.get()
+ fmt = "%s instance %s has no attribute %s"
+ return fmt % (entry.__class__.__name__,
+ repr(entry.name),
+ repr(self.attribute))
+
+# The max_drift value: by default, use a cached signature value for
+# any file that's been untouched for more than two days.
+default_max_drift = 2*24*60*60
+
+#
+# We stringify these file system Nodes a lot. Turning a file system Node
+# into a string is non-trivial, because the final string representation
+# can depend on a lot of factors: whether it's a derived target or not,
+# whether it's linked to a repository or source directory, and whether
+# there's duplication going on. The normal technique for optimizing
+# calculations like this is to memoize (cache) the string value, so you
+# only have to do the calculation once.
+#
+# A number of the above factors, however, can be set after we've already
+# been asked to return a string for a Node, because a Repository() or
+# VariantDir() call or the like may not occur until later in SConscript
+# files. So this variable controls whether we bother trying to save
+# string values for Nodes. The wrapper interface can set this whenever
+# they're done mucking with Repository and VariantDir and the other stuff,
+# to let this module know it can start returning saved string values
+# for Nodes.
+#
+Save_Strings = None
+
+def save_strings(val):
+ global Save_Strings
+ Save_Strings = val
+
+#
+# Avoid unnecessary function calls by recording a Boolean value that
+# tells us whether or not os.path.splitdrive() actually does anything
+# on this system, and therefore whether we need to bother calling it
+# when looking up path names in various methods below.
+#
+
+do_splitdrive = None
+_my_splitdrive =None
+
+def initialize_do_splitdrive():
+ global do_splitdrive
+ global has_unc
+ drive, path = os.path.splitdrive('X:/foo')
+ has_unc = hasattr(os.path, 'splitunc')
+
+ do_splitdrive = not not drive or has_unc
+
+ global _my_splitdrive
+ if has_unc:
+ def splitdrive(p):
+ if p[1:2] == ':':
+ return p[:2], p[2:]
+ if p[0:2] == '//':
+ # Note that we leave a leading slash in the path
+ # because UNC paths are always absolute.
+ return '//', p[1:]
+ return '', p
+ else:
+ def splitdrive(p):
+ if p[1:2] == ':':
+ return p[:2], p[2:]
+ return '', p
+ _my_splitdrive = splitdrive
+
+ # Keep some commonly used values in global variables to skip to
+ # module look-up costs.
+ global OS_SEP
+ global UNC_PREFIX
+ global os_sep_is_slash
+
+ OS_SEP = os.sep
+ UNC_PREFIX = OS_SEP + OS_SEP
+ os_sep_is_slash = OS_SEP == '/'
+
+initialize_do_splitdrive()
+
+# Used to avoid invoking os.path.normpath if not necessary.
+needs_normpath_check = re.compile(
+ r'''
+ # We need to renormalize the path if it contains any consecutive
+ # '/' characters.
+ .*// |
+
+ # We need to renormalize the path if it contains a '..' directory.
+ # Note that we check for all the following cases:
+ #
+ # a) The path is a single '..'
+ # b) The path starts with '..'. E.g. '../' or '../moredirs'
+ # but we not match '..abc/'.
+ # c) The path ends with '..'. E.g. '/..' or 'dirs/..'
+ # d) The path contains a '..' in the middle.
+ # E.g. dirs/../moredirs
+
+ (.*/)?\.\.(?:/|$) |
+
+ # We need to renormalize the path if it contains a '.'
+ # directory, but NOT if it is a single '.' '/' characters. We
+ # do not want to match a single '.' because this case is checked
+ # for explicitly since this is common enough case.
+ #
+ # Note that we check for all the following cases:
+ #
+ # a) We don't match a single '.'
+ # b) We match if the path starts with '.'. E.g. './' or
+ # './moredirs' but we not match '.abc/'.
+ # c) We match if the path ends with '.'. E.g. '/.' or
+ # 'dirs/.'
+ # d) We match if the path contains a '.' in the middle.
+ # E.g. dirs/./moredirs
+
+ \./|.*/\.(?:/|$)
+
+ ''',
+ re.VERBOSE
+ )
+needs_normpath_match = needs_normpath_check.match
+
+#
+# SCons.Action objects for interacting with the outside world.
+#
+# The Node.FS methods in this module should use these actions to
+# create and/or remove files and directories; they should *not* use
+# os.{link,symlink,unlink,mkdir}(), etc., directly.
+#
+# Using these SCons.Action objects ensures that descriptions of these
+# external activities are properly displayed, that the displays are
+# suppressed when the -s (silent) option is used, and (most importantly)
+# the actions are disabled when the the -n option is used, in which case
+# there should be *no* changes to the external file system(s)...
+#
+
+# For Now disable hard & softlinks for win32
+# PY3 supports them, but the rest of SCons is not ready for this
+# in some cases user permissions may be required.
+# TODO: See if theres a reasonable way to enable using links on win32/64
+
+if hasattr(os, 'link') and sys.platform != 'win32':
+ def _hardlink_func(fs, src, dst):
+ # If the source is a symlink, we can't just hard-link to it
+ # because a relative symlink may point somewhere completely
+ # different. We must disambiguate the symlink and then
+ # hard-link the final destination file.
+ while fs.islink(src):
+ link = fs.readlink(src)
+ if not os.path.isabs(link):
+ src = link
+ else:
+ src = os.path.join(os.path.dirname(src), link)
+ fs.link(src, dst)
+else:
+ _hardlink_func = None
+
+if hasattr(os, 'symlink') and sys.platform != 'win32':
+ def _softlink_func(fs, src, dst):
+ fs.symlink(src, dst)
+else:
+ _softlink_func = None
+
+def _copy_func(fs, src, dest):
+ shutil.copy2(src, dest)
+ st = fs.stat(src)
+ fs.chmod(dest, stat.S_IMODE(st[stat.ST_MODE]) | stat.S_IWRITE)
+
+
+Valid_Duplicates = ['hard-soft-copy', 'soft-hard-copy',
+ 'hard-copy', 'soft-copy', 'copy']
+
+Link_Funcs = [] # contains the callables of the specified duplication style
+
+def set_duplicate(duplicate):
+ # Fill in the Link_Funcs list according to the argument
+ # (discarding those not available on the platform).
+
+ # Set up the dictionary that maps the argument names to the
+ # underlying implementations. We do this inside this function,
+ # not in the top-level module code, so that we can remap os.link
+ # and os.symlink for testing purposes.
+ link_dict = {
+ 'hard' : _hardlink_func,
+ 'soft' : _softlink_func,
+ 'copy' : _copy_func
+ }
+
+ if not duplicate in Valid_Duplicates:
+ raise SCons.Errors.InternalError("The argument of set_duplicate "
+ "should be in Valid_Duplicates")
+ global Link_Funcs
+ Link_Funcs = []
+ for func in duplicate.split('-'):
+ if link_dict[func]:
+ Link_Funcs.append(link_dict[func])
+
+def LinkFunc(target, source, env):
+ # Relative paths cause problems with symbolic links, so
+ # we use absolute paths, which may be a problem for people
+ # who want to move their soft-linked src-trees around. Those
+ # people should use the 'hard-copy' mode, softlinks cannot be
+ # used for that; at least I have no idea how ...
+ src = source[0].get_abspath()
+ dest = target[0].get_abspath()
+ dir, file = os.path.split(dest)
+ if dir and not target[0].fs.isdir(dir):
+ os.makedirs(dir)
+ if not Link_Funcs:
+ # Set a default order of link functions.
+ set_duplicate('hard-soft-copy')
+ fs = source[0].fs
+ # Now link the files with the previously specified order.
+ for func in Link_Funcs:
+ try:
+ func(fs, src, dest)
+ break
+ except (IOError, OSError):
+ # An OSError indicates something happened like a permissions
+ # problem or an attempt to symlink across file-system
+ # boundaries. An IOError indicates something like the file
+ # not existing. In either case, keeping trying additional
+ # functions in the list and only raise an error if the last
+ # one failed.
+ if func == Link_Funcs[-1]:
+ # exception of the last link method (copy) are fatal
+ raise
+ return 0
+
+Link = SCons.Action.Action(LinkFunc, None)
+def LocalString(target, source, env):
+ return 'Local copy of %s from %s' % (target[0], source[0])
+
+LocalCopy = SCons.Action.Action(LinkFunc, LocalString)
+
+def UnlinkFunc(target, source, env):
+ t = target[0]
+ t.fs.unlink(t.get_abspath())
+ return 0
+
+Unlink = SCons.Action.Action(UnlinkFunc, None)
+
+def MkdirFunc(target, source, env):
+ t = target[0]
+ if not t.exists():
+ t.fs.mkdir(t.get_abspath())
+ return 0
+
+Mkdir = SCons.Action.Action(MkdirFunc, None, presub=None)
+
+MkdirBuilder = None
+
+def get_MkdirBuilder():
+ global MkdirBuilder
+ if MkdirBuilder is None:
+ import SCons.Builder
+ import SCons.Defaults
+ # "env" will get filled in by Executor.get_build_env()
+ # calling SCons.Defaults.DefaultEnvironment() when necessary.
+ MkdirBuilder = SCons.Builder.Builder(action = Mkdir,
+ env = None,
+ explain = None,
+ is_explicit = None,
+ target_scanner = SCons.Defaults.DirEntryScanner,
+ name = "MkdirBuilder")
+ return MkdirBuilder
+
+class _Null(object):
+ pass
+
+_null = _Null()
+
+# Cygwin's os.path.normcase pretends it's on a case-sensitive filesystem.
+_is_cygwin = sys.platform == "cygwin"
+if os.path.normcase("TeSt") == os.path.normpath("TeSt") and not _is_cygwin:
+ def _my_normcase(x):
+ return x
+else:
+ def _my_normcase(x):
+ return x.upper()
+
+
+
+class DiskChecker(object):
+ def __init__(self, type, do, ignore):
+ self.type = type
+ self.do = do
+ self.ignore = ignore
+ self.func = do
+ def __call__(self, *args, **kw):
+ return self.func(*args, **kw)
+ def set(self, list):
+ if self.type in list:
+ self.func = self.do
+ else:
+ self.func = self.ignore
+
+def do_diskcheck_match(node, predicate, errorfmt):
+ result = predicate()
+ try:
+ # If calling the predicate() cached a None value from stat(),
+ # remove it so it doesn't interfere with later attempts to
+ # build this Node as we walk the DAG. (This isn't a great way
+ # to do this, we're reaching into an interface that doesn't
+ # really belong to us, but it's all about performance, so
+ # for now we'll just document the dependency...)
+ if node._memo['stat'] is None:
+ del node._memo['stat']
+ except (AttributeError, KeyError):
+ pass
+ if result:
+ raise TypeError(errorfmt % node.get_abspath())
+
+def ignore_diskcheck_match(node, predicate, errorfmt):
+ pass
+
+
+
+diskcheck_match = DiskChecker('match', do_diskcheck_match, ignore_diskcheck_match)
+
+diskcheckers = [
+ diskcheck_match,
+]
+
+def set_diskcheck(list):
+ for dc in diskcheckers:
+ dc.set(list)
+
+def diskcheck_types():
+ return [dc.type for dc in diskcheckers]
+
+
+
+class EntryProxy(SCons.Util.Proxy):
+
+ __str__ = SCons.Util.Delegate('__str__')
+
+ # In PY3 if a class defines __eq__, then it must explicitly provide
+ # __hash__. Since SCons.Util.Proxy provides __eq__ we need the following
+ # see: https://docs.python.org/3.1/reference/datamodel.html#object.__hash__
+ __hash__ = SCons.Util.Delegate('__hash__')
+
+ def __get_abspath(self):
+ entry = self.get()
+ return SCons.Subst.SpecialAttrWrapper(entry.get_abspath(),
+ entry.name + "_abspath")
+
+ def __get_filebase(self):
+ name = self.get().name
+ return SCons.Subst.SpecialAttrWrapper(SCons.Util.splitext(name)[0],
+ name + "_filebase")
+
+ def __get_suffix(self):
+ name = self.get().name
+ return SCons.Subst.SpecialAttrWrapper(SCons.Util.splitext(name)[1],
+ name + "_suffix")
+
+ def __get_file(self):
+ name = self.get().name
+ return SCons.Subst.SpecialAttrWrapper(name, name + "_file")
+
+ def __get_base_path(self):
+ """Return the file's directory and file name, with the
+ suffix stripped."""
+ entry = self.get()
+ return SCons.Subst.SpecialAttrWrapper(SCons.Util.splitext(entry.get_path())[0],
+ entry.name + "_base")
+
+ def __get_posix_path(self):
+ """Return the path with / as the path separator,
+ regardless of platform."""
+ if os_sep_is_slash:
+ return self
+ else:
+ entry = self.get()
+ r = entry.get_path().replace(OS_SEP, '/')
+ return SCons.Subst.SpecialAttrWrapper(r, entry.name + "_posix")
+
+ def __get_windows_path(self):
+ """Return the path with \ as the path separator,
+ regardless of platform."""
+ if OS_SEP == '\\':
+ return self
+ else:
+ entry = self.get()
+ r = entry.get_path().replace(OS_SEP, '\\')
+ return SCons.Subst.SpecialAttrWrapper(r, entry.name + "_windows")
+
+ def __get_srcnode(self):
+ return EntryProxy(self.get().srcnode())
+
+ def __get_srcdir(self):
+ """Returns the directory containing the source node linked to this
+ node via VariantDir(), or the directory of this node if not linked."""
+ return EntryProxy(self.get().srcnode().dir)
+
+ def __get_rsrcnode(self):
+ return EntryProxy(self.get().srcnode().rfile())
+
+ def __get_rsrcdir(self):
+ """Returns the directory containing the source node linked to this
+ node via VariantDir(), or the directory of this node if not linked."""
+ return EntryProxy(self.get().srcnode().rfile().dir)
+
+ def __get_dir(self):
+ return EntryProxy(self.get().dir)
+
+ dictSpecialAttrs = { "base" : __get_base_path,
+ "posix" : __get_posix_path,
+ "windows" : __get_windows_path,
+ "win32" : __get_windows_path,
+ "srcpath" : __get_srcnode,
+ "srcdir" : __get_srcdir,
+ "dir" : __get_dir,
+ "abspath" : __get_abspath,
+ "filebase" : __get_filebase,
+ "suffix" : __get_suffix,
+ "file" : __get_file,
+ "rsrcpath" : __get_rsrcnode,
+ "rsrcdir" : __get_rsrcdir,
+ }
+
+ def __getattr__(self, name):
+ # This is how we implement the "special" attributes
+ # such as base, posix, srcdir, etc.
+ try:
+ attr_function = self.dictSpecialAttrs[name]
+ except KeyError:
+ try:
+ attr = SCons.Util.Proxy.__getattr__(self, name)
+ except AttributeError as e:
+ # Raise our own AttributeError subclass with an
+ # overridden __str__() method that identifies the
+ # name of the entry that caused the exception.
+ raise EntryProxyAttributeError(self, name)
+ return attr
+ else:
+ return attr_function(self)
+
+
+class Base(SCons.Node.Node):
+ """A generic class for file system entries. This class is for
+ when we don't know yet whether the entry being looked up is a file
+ or a directory. Instances of this class can morph into either
+ Dir or File objects by a later, more precise lookup.
+
+ Note: this class does not define __cmp__ and __hash__ for
+ efficiency reasons. SCons does a lot of comparing of
+ Node.FS.{Base,Entry,File,Dir} objects, so those operations must be
+ as fast as possible, which means we want to use Python's built-in
+ object identity comparisons.
+ """
+
+ __slots__ = ['name',
+ 'fs',
+ '_abspath',
+ '_labspath',
+ '_path',
+ '_tpath',
+ '_path_elements',
+ 'dir',
+ 'cwd',
+ 'duplicate',
+ '_local',
+ 'sbuilder',
+ '_proxy',
+ '_func_sconsign']
+
+ def __init__(self, name, directory, fs):
+ """Initialize a generic Node.FS.Base object.
+
+ Call the superclass initialization, take care of setting up
+ our relative and absolute paths, identify our parent
+ directory, and indicate that this node should use
+ signatures."""
+
+ if SCons.Debug.track_instances: logInstanceCreation(self, 'Node.FS.Base')
+ SCons.Node.Node.__init__(self)
+
+ # Filenames and paths are probably reused and are intern'ed to save some memory.
+ # Filename with extension as it was specified when the object was
+ # created; to obtain filesystem path, use Python str() function
+ self.name = SCons.Util.silent_intern(name)
+ self.fs = fs #: Reference to parent Node.FS object
+
+ assert directory, "A directory must be provided"
+
+ self._abspath = None
+ self._labspath = None
+ self._path = None
+ self._tpath = None
+ self._path_elements = None
+
+ self.dir = directory
+ self.cwd = None # will hold the SConscript directory for target nodes
+ self.duplicate = directory.duplicate
+ self.changed_since_last_build = 2
+ self._func_sconsign = 0
+ self._func_exists = 2
+ self._func_rexists = 2
+ self._func_get_contents = 0
+ self._func_target_from_source = 1
+ self.store_info = 1
+
+ def str_for_display(self):
+ return '"' + self.__str__() + '"'
+
+ def must_be_same(self, klass):
+ """
+ This node, which already existed, is being looked up as the
+ specified klass. Raise an exception if it isn't.
+ """
+ if isinstance(self, klass) or klass is Entry:
+ return
+ raise TypeError("Tried to lookup %s '%s' as a %s." %\
+ (self.__class__.__name__, self.get_internal_path(), klass.__name__))
+
+ def get_dir(self):
+ return self.dir
+
+ def get_suffix(self):
+ return SCons.Util.splitext(self.name)[1]
+
+ def rfile(self):
+ return self
+
+ def __getattr__(self, attr):
+ """ Together with the node_bwcomp dict defined below,
+ this method provides a simple backward compatibility
+ layer for the Node attributes 'abspath', 'labspath',
+ 'path', 'tpath', 'suffix' and 'path_elements'. These Node
+ attributes used to be directly available in v2.3 and earlier, but
+ have been replaced by getter methods that initialize the
+ single variables lazily when required, in order to save memory.
+ The redirection to the getters lets older Tools and
+ SConstruct continue to work without any additional changes,
+ fully transparent to the user.
+ Note, that __getattr__ is only called as fallback when the
+ requested attribute can't be found, so there should be no
+ speed performance penalty involved for standard builds.
+ """
+ if attr in node_bwcomp:
+ return node_bwcomp[attr](self)
+
+ raise AttributeError("%r object has no attribute %r" %
+ (self.__class__, attr))
+
+ def __str__(self):
+ """A Node.FS.Base object's string representation is its path
+ name."""
+ global Save_Strings
+ if Save_Strings:
+ return self._save_str()
+ return self._get_str()
+
+ def __lt__(self, other):
+ """ less than operator used by sorting on py3"""
+ return str(self) < str(other)
+
+ @SCons.Memoize.CountMethodCall
+ def _save_str(self):
+ try:
+ return self._memo['_save_str']
+ except KeyError:
+ pass
+ result = SCons.Util.silent_intern(self._get_str())
+ self._memo['_save_str'] = result
+ return result
+
+ def _get_str(self):
+ global Save_Strings
+ if self.duplicate or self.is_derived():
+ return self.get_path()
+ srcnode = self.srcnode()
+ if srcnode.stat() is None and self.stat() is not None:
+ result = self.get_path()
+ else:
+ result = srcnode.get_path()
+ if not Save_Strings:
+ # We're not at the point where we're saving the string
+ # representations of FS Nodes (because we haven't finished
+ # reading the SConscript files and need to have str() return
+ # things relative to them). That also means we can't yet
+ # cache values returned (or not returned) by stat(), since
+ # Python code in the SConscript files might still create
+ # or otherwise affect the on-disk file. So get rid of the
+ # values that the underlying stat() method saved.
+ try: del self._memo['stat']
+ except KeyError: pass
+ if self is not srcnode:
+ try: del srcnode._memo['stat']
+ except KeyError: pass
+ return result
+
+ rstr = __str__
+
+ @SCons.Memoize.CountMethodCall
+ def stat(self):
+ try: return self._memo['stat']
+ except KeyError: pass
+ try: result = self.fs.stat(self.get_abspath())
+ except os.error: result = None
+ self._memo['stat'] = result
+ return result
+
+ def exists(self):
+ return SCons.Node._exists_map[self._func_exists](self)
+
+ def rexists(self):
+ return SCons.Node._rexists_map[self._func_rexists](self)
+
+ def getmtime(self):
+ st = self.stat()
+ if st: return st[stat.ST_MTIME]
+ else: return None
+
+ def getsize(self):
+ st = self.stat()
+ if st: return st[stat.ST_SIZE]
+ else: return None
+
+ def isdir(self):
+ st = self.stat()
+ return st is not None and stat.S_ISDIR(st[stat.ST_MODE])
+
+ def isfile(self):
+ st = self.stat()
+ return st is not None and stat.S_ISREG(st[stat.ST_MODE])
+
+ if hasattr(os, 'symlink'):
+ def islink(self):
+ try: st = self.fs.lstat(self.get_abspath())
+ except os.error: return 0
+ return stat.S_ISLNK(st[stat.ST_MODE])
+ else:
+ def islink(self):
+ return 0 # no symlinks
+
+ def is_under(self, dir):
+ if self is dir:
+ return 1
+ else:
+ return self.dir.is_under(dir)
+
+ def set_local(self):
+ self._local = 1
+
+ def srcnode(self):
+ """If this node is in a build path, return the node
+ corresponding to its source file. Otherwise, return
+ ourself.
+ """
+ srcdir_list = self.dir.srcdir_list()
+ if srcdir_list:
+ srcnode = srcdir_list[0].Entry(self.name)
+ srcnode.must_be_same(self.__class__)
+ return srcnode
+ return self
+
+ def get_path(self, dir=None):
+ """Return path relative to the current working directory of the
+ Node.FS.Base object that owns us."""
+ if not dir:
+ dir = self.fs.getcwd()
+ if self == dir:
+ return '.'
+ path_elems = self.get_path_elements()
+ pathname = ''
+ try: i = path_elems.index(dir)
+ except ValueError:
+ for p in path_elems[:-1]:
+ pathname += p.dirname
+ else:
+ for p in path_elems[i+1:-1]:
+ pathname += p.dirname
+ return pathname + path_elems[-1].name
+
+ def set_src_builder(self, builder):
+ """Set the source code builder for this node."""
+ self.sbuilder = builder
+ if not self.has_builder():
+ self.builder_set(builder)
+
+ def src_builder(self):
+ """Fetch the source code builder for this node.
+
+ If there isn't one, we cache the source code builder specified
+ for the directory (which in turn will cache the value from its
+ parent directory, and so on up to the file system root).
+ """
+ try:
+ scb = self.sbuilder
+ except AttributeError:
+ scb = self.dir.src_builder()
+ self.sbuilder = scb
+ return scb
+
+ def get_abspath(self):
+ """Get the absolute path of the file."""
+ return self.dir.entry_abspath(self.name)
+
+ def get_labspath(self):
+ """Get the absolute path of the file."""
+ return self.dir.entry_labspath(self.name)
+
+ def get_internal_path(self):
+ if self.dir._path == '.':
+ return self.name
+ else:
+ return self.dir.entry_path(self.name)
+
+ def get_tpath(self):
+ if self.dir._tpath == '.':
+ return self.name
+ else:
+ return self.dir.entry_tpath(self.name)
+
+ def get_path_elements(self):
+ return self.dir._path_elements + [self]
+
+ def for_signature(self):
+ # Return just our name. Even an absolute path would not work,
+ # because that can change thanks to symlinks or remapped network
+ # paths.
+ return self.name
+
+ def get_subst_proxy(self):
+ try:
+ return self._proxy
+ except AttributeError:
+ ret = EntryProxy(self)
+ self._proxy = ret
+ return ret
+
+ def target_from_source(self, prefix, suffix, splitext=SCons.Util.splitext):
+ """
+
+ Generates a target entry that corresponds to this entry (usually
+ a source file) with the specified prefix and suffix.
+
+ Note that this method can be overridden dynamically for generated
+ files that need different behavior. See Tool/swig.py for
+ an example.
+ """
+ return SCons.Node._target_from_source_map[self._func_target_from_source](self, prefix, suffix, splitext)
+
+ def _Rfindalldirs_key(self, pathlist):
+ return pathlist
+
+ @SCons.Memoize.CountDictCall(_Rfindalldirs_key)
+ def Rfindalldirs(self, pathlist):
+ """
+ Return all of the directories for a given path list, including
+ corresponding "backing" directories in any repositories.
+
+ The Node lookups are relative to this Node (typically a
+ directory), so memoizing result saves cycles from looking
+ up the same path for each target in a given directory.
+ """
+ try:
+ memo_dict = self._memo['Rfindalldirs']
+ except KeyError:
+ memo_dict = {}
+ self._memo['Rfindalldirs'] = memo_dict
+ else:
+ try:
+ return memo_dict[pathlist]
+ except KeyError:
+ pass
+
+ create_dir_relative_to_self = self.Dir
+ result = []
+ for path in pathlist:
+ if isinstance(path, SCons.Node.Node):
+ result.append(path)
+ else:
+ dir = create_dir_relative_to_self(path)
+ result.extend(dir.get_all_rdirs())
+
+ memo_dict[pathlist] = result
+
+ return result
+
+ def RDirs(self, pathlist):
+ """Search for a list of directories in the Repository list."""
+ cwd = self.cwd or self.fs._cwd
+ return cwd.Rfindalldirs(pathlist)
+
+ @SCons.Memoize.CountMethodCall
+ def rentry(self):
+ try:
+ return self._memo['rentry']
+ except KeyError:
+ pass
+ result = self
+ if not self.exists():
+ norm_name = _my_normcase(self.name)
+ for dir in self.dir.get_all_rdirs():
+ try:
+ node = dir.entries[norm_name]
+ except KeyError:
+ if dir.entry_exists_on_disk(self.name):
+ result = dir.Entry(self.name)
+ break
+ self._memo['rentry'] = result
+ return result
+
+ def _glob1(self, pattern, ondisk=True, source=False, strings=False):
+ return []
+
+# Dict that provides a simple backward compatibility
+# layer for the Node attributes 'abspath', 'labspath',
+# 'path', 'tpath' and 'path_elements'.
+# @see Base.__getattr__ above
+node_bwcomp = {'abspath' : Base.get_abspath,
+ 'labspath' : Base.get_labspath,
+ 'path' : Base.get_internal_path,
+ 'tpath' : Base.get_tpath,
+ 'path_elements' : Base.get_path_elements,
+ 'suffix' : Base.get_suffix}
+
+class Entry(Base):
+ """This is the class for generic Node.FS entries--that is, things
+ that could be a File or a Dir, but we're just not sure yet.
+ Consequently, the methods in this class really exist just to
+ transform their associated object into the right class when the
+ time comes, and then call the same-named method in the transformed
+ class."""
+
+ __slots__ = ['scanner_paths',
+ 'cachedir_csig',
+ 'cachesig',
+ 'repositories',
+ 'srcdir',
+ 'entries',
+ 'searched',
+ '_sconsign',
+ 'variant_dirs',
+ 'root',
+ 'dirname',
+ 'on_disk_entries',
+ 'released_target_info',
+ 'contentsig']
+
+ def __init__(self, name, directory, fs):
+ Base.__init__(self, name, directory, fs)
+ self._func_exists = 3
+ self._func_get_contents = 1
+
+ def diskcheck_match(self):
+ pass
+
+ def disambiguate(self, must_exist=None):
+ """
+ """
+ if self.isdir():
+ self.__class__ = Dir
+ self._morph()
+ elif self.isfile():
+ self.__class__ = File
+ self._morph()
+ self.clear()
+ else:
+ # There was nothing on-disk at this location, so look in
+ # the src directory.
+ #
+ # We can't just use self.srcnode() straight away because
+ # that would create an actual Node for this file in the src
+ # directory, and there might not be one. Instead, use the
+ # dir_on_disk() method to see if there's something on-disk
+ # with that name, in which case we can go ahead and call
+ # self.srcnode() to create the right type of entry.
+ srcdir = self.dir.srcnode()
+ if srcdir != self.dir and \
+ srcdir.entry_exists_on_disk(self.name) and \
+ self.srcnode().isdir():
+ self.__class__ = Dir
+ self._morph()
+ elif must_exist:
+ msg = "No such file or directory: '%s'" % self.get_abspath()
+ raise SCons.Errors.UserError(msg)
+ else:
+ self.__class__ = File
+ self._morph()
+ self.clear()
+ return self
+
+ def rfile(self):
+ """We're a generic Entry, but the caller is actually looking for
+ a File at this point, so morph into one."""
+ self.__class__ = File
+ self._morph()
+ self.clear()
+ return File.rfile(self)
+
+ def scanner_key(self):
+ return self.get_suffix()
+
+ def get_contents(self):
+ """Fetch the contents of the entry. Returns the exact binary
+ contents of the file."""
+ return SCons.Node._get_contents_map[self._func_get_contents](self)
+
+ def get_text_contents(self):
+ """Fetch the decoded text contents of a Unicode encoded Entry.
+
+ Since this should return the text contents from the file
+ system, we check to see into what sort of subclass we should
+ morph this Entry."""
+ try:
+ self = self.disambiguate(must_exist=1)
+ except SCons.Errors.UserError:
+ # There was nothing on disk with which to disambiguate
+ # this entry. Leave it as an Entry, but return a null
+ # string so calls to get_text_contents() in emitters and
+ # the like (e.g. in qt.py) don't have to disambiguate by
+ # hand or catch the exception.
+ return ''
+ else:
+ return self.get_text_contents()
+
+ def must_be_same(self, klass):
+ """Called to make sure a Node is a Dir. Since we're an
+ Entry, we can morph into one."""
+ if self.__class__ is not klass:
+ self.__class__ = klass
+ self._morph()
+ self.clear()
+
+ # The following methods can get called before the Taskmaster has
+ # had a chance to call disambiguate() directly to see if this Entry
+ # should really be a Dir or a File. We therefore use these to call
+ # disambiguate() transparently (from our caller's point of view).
+ #
+ # Right now, this minimal set of methods has been derived by just
+ # looking at some of the methods that will obviously be called early
+ # in any of the various Taskmasters' calling sequences, and then
+ # empirically figuring out which additional methods are necessary
+ # to make various tests pass.
+
+ def exists(self):
+ return SCons.Node._exists_map[self._func_exists](self)
+
+ def rel_path(self, other):
+ d = self.disambiguate()
+ if d.__class__ is Entry:
+ raise Exception("rel_path() could not disambiguate File/Dir")
+ return d.rel_path(other)
+
+ def new_ninfo(self):
+ return self.disambiguate().new_ninfo()
+
+ def _glob1(self, pattern, ondisk=True, source=False, strings=False):
+ return self.disambiguate()._glob1(pattern, ondisk, source, strings)
+
+ def get_subst_proxy(self):
+ return self.disambiguate().get_subst_proxy()
+
+# This is for later so we can differentiate between Entry the class and Entry
+# the method of the FS class.
+_classEntry = Entry
+
+
+class LocalFS(object):
+
+ # This class implements an abstraction layer for operations involving
+ # a local file system. Essentially, this wraps any function in
+ # the os, os.path or shutil modules that we use to actually go do
+ # anything with or to the local file system.
+ #
+ # Note that there's a very good chance we'll refactor this part of
+ # the architecture in some way as we really implement the interface(s)
+ # for remote file system Nodes. For example, the right architecture
+ # might be to have this be a subclass instead of a base class.
+ # Nevertheless, we're using this as a first step in that direction.
+ #
+ # We're not using chdir() yet because the calling subclass method
+ # needs to use os.chdir() directly to avoid recursion. Will we
+ # really need this one?
+ #def chdir(self, path):
+ # return os.chdir(path)
+ def chmod(self, path, mode):
+ return os.chmod(path, mode)
+ def copy(self, src, dst):
+ return shutil.copy(src, dst)
+ def copy2(self, src, dst):
+ return shutil.copy2(src, dst)
+ def exists(self, path):
+ return os.path.exists(path)
+ def getmtime(self, path):
+ return os.path.getmtime(path)
+ def getsize(self, path):
+ return os.path.getsize(path)
+ def isdir(self, path):
+ return os.path.isdir(path)
+ def isfile(self, path):
+ return os.path.isfile(path)
+ def link(self, src, dst):
+ return os.link(src, dst)
+ def lstat(self, path):
+ return os.lstat(path)
+ def listdir(self, path):
+ return os.listdir(path)
+ def makedirs(self, path):
+ return os.makedirs(path)
+ def mkdir(self, path):
+ return os.mkdir(path)
+ def rename(self, old, new):
+ return os.rename(old, new)
+ def stat(self, path):
+ return os.stat(path)
+ def symlink(self, src, dst):
+ return os.symlink(src, dst)
+ def open(self, path):
+ return open(path)
+ def unlink(self, path):
+ return os.unlink(path)
+
+ if hasattr(os, 'symlink'):
+ def islink(self, path):
+ return os.path.islink(path)
+ else:
+ def islink(self, path):
+ return 0 # no symlinks
+
+ if hasattr(os, 'readlink'):
+ def readlink(self, file):
+ return os.readlink(file)
+ else:
+ def readlink(self, file):
+ return ''
+
+
+class FS(LocalFS):
+
+ def __init__(self, path = None):
+ """Initialize the Node.FS subsystem.
+
+ The supplied path is the top of the source tree, where we
+ expect to find the top-level build file. If no path is
+ supplied, the current directory is the default.
+
+ The path argument must be a valid absolute path.
+ """
+ if SCons.Debug.track_instances: logInstanceCreation(self, 'Node.FS')
+
+ self._memo = {}
+
+ self.Root = {}
+ self.SConstruct_dir = None
+ self.max_drift = default_max_drift
+
+ self.Top = None
+ if path is None:
+ self.pathTop = os.getcwd()
+ else:
+ self.pathTop = path
+ self.defaultDrive = _my_normcase(_my_splitdrive(self.pathTop)[0])
+
+ self.Top = self.Dir(self.pathTop)
+ self.Top._path = '.'
+ self.Top._tpath = '.'
+ self._cwd = self.Top
+
+ DirNodeInfo.fs = self
+ FileNodeInfo.fs = self
+
+ def set_SConstruct_dir(self, dir):
+ self.SConstruct_dir = dir
+
+ def get_max_drift(self):
+ return self.max_drift
+
+ def set_max_drift(self, max_drift):
+ self.max_drift = max_drift
+
+ def getcwd(self):
+ if hasattr(self, "_cwd"):
+ return self._cwd
+ else:
+ return "<no cwd>"
+
+ def chdir(self, dir, change_os_dir=0):
+ """Change the current working directory for lookups.
+ If change_os_dir is true, we will also change the "real" cwd
+ to match.
+ """
+ curr=self._cwd
+ try:
+ if dir is not None:
+ self._cwd = dir
+ if change_os_dir:
+ os.chdir(dir.get_abspath())
+ except OSError:
+ self._cwd = curr
+ raise
+
+ def get_root(self, drive):
+ """
+ Returns the root directory for the specified drive, creating
+ it if necessary.
+ """
+ drive = _my_normcase(drive)
+ try:
+ return self.Root[drive]
+ except KeyError:
+ root = RootDir(drive, self)
+ self.Root[drive] = root
+ if not drive:
+ self.Root[self.defaultDrive] = root
+ elif drive == self.defaultDrive:
+ self.Root[''] = root
+ return root
+
+ def _lookup(self, p, directory, fsclass, create=1):
+ """
+ The generic entry point for Node lookup with user-supplied data.
+
+ This translates arbitrary input into a canonical Node.FS object
+ of the specified fsclass. The general approach for strings is
+ to turn it into a fully normalized absolute path and then call
+ the root directory's lookup_abs() method for the heavy lifting.
+
+ If the path name begins with '#', it is unconditionally
+ interpreted relative to the top-level directory of this FS. '#'
+ is treated as a synonym for the top-level SConstruct directory,
+ much like '~' is treated as a synonym for the user's home
+ directory in a UNIX shell. So both '#foo' and '#/foo' refer
+ to the 'foo' subdirectory underneath the top-level SConstruct
+ directory.
+
+ If the path name is relative, then the path is looked up relative
+ to the specified directory, or the current directory (self._cwd,
+ typically the SConscript directory) if the specified directory
+ is None.
+ """
+ if isinstance(p, Base):
+ # It's already a Node.FS object. Make sure it's the right
+ # class and return.
+ p.must_be_same(fsclass)
+ return p
+ # str(p) in case it's something like a proxy object
+ p = str(p)
+
+ if not os_sep_is_slash:
+ p = p.replace(OS_SEP, '/')
+
+ if p[0:1] == '#':
+ # There was an initial '#', so we strip it and override
+ # whatever directory they may have specified with the
+ # top-level SConstruct directory.
+ p = p[1:]
+ directory = self.Top
+
+ # There might be a drive letter following the
+ # '#'. Although it is not described in the SCons man page,
+ # the regression test suite explicitly tests for that
+ # syntax. It seems to mean the following thing:
+ #
+ # Assuming the the SCons top dir is in C:/xxx/yyy,
+ # '#X:/toto' means X:/xxx/yyy/toto.
+ #
+ # i.e. it assumes that the X: drive has a directory
+ # structure similar to the one found on drive C:.
+ if do_splitdrive:
+ drive, p = _my_splitdrive(p)
+ if drive:
+ root = self.get_root(drive)
+ else:
+ root = directory.root
+ else:
+ root = directory.root
+
+ # We can only strip trailing after splitting the drive
+ # since the drive might the UNC '//' prefix.
+ p = p.strip('/')
+
+ needs_normpath = needs_normpath_match(p)
+
+ # The path is relative to the top-level SCons directory.
+ if p in ('', '.'):
+ p = directory.get_labspath()
+ else:
+ p = directory.get_labspath() + '/' + p
+ else:
+ if do_splitdrive:
+ drive, p = _my_splitdrive(p)
+ if drive and not p:
+ # This causes a naked drive letter to be treated
+ # as a synonym for the root directory on that
+ # drive.
+ p = '/'
+ else:
+ drive = ''
+
+ # We can only strip trailing '/' since the drive might the
+ # UNC '//' prefix.
+ if p != '/':
+ p = p.rstrip('/')
+
+ needs_normpath = needs_normpath_match(p)
+
+ if p[0:1] == '/':
+ # Absolute path
+ root = self.get_root(drive)
+ else:
+ # This is a relative lookup or to the current directory
+ # (the path name is not absolute). Add the string to the
+ # appropriate directory lookup path, after which the whole
+ # thing gets normalized.
+ if directory:
+ if not isinstance(directory, Dir):
+ directory = self.Dir(directory)
+ else:
+ directory = self._cwd
+
+ if p in ('', '.'):
+ p = directory.get_labspath()
+ else:
+ p = directory.get_labspath() + '/' + p
+
+ if drive:
+ root = self.get_root(drive)
+ else:
+ root = directory.root
+
+ if needs_normpath is not None:
+ # Normalize a pathname. Will return the same result for
+ # equivalent paths.
+ #
+ # We take advantage of the fact that we have an absolute
+ # path here for sure. In addition, we know that the
+ # components of lookup path are separated by slashes at
+ # this point. Because of this, this code is about 2X
+ # faster than calling os.path.normpath() followed by
+ # replacing os.sep with '/' again.
+ ins = p.split('/')[1:]
+ outs = []
+ for d in ins:
+ if d == '..':
+ try:
+ outs.pop()
+ except IndexError:
+ pass
+ elif d not in ('', '.'):
+ outs.append(d)
+ p = '/' + '/'.join(outs)
+
+ return root._lookup_abs(p, fsclass, create)
+
+ def Entry(self, name, directory = None, create = 1):
+ """Look up or create a generic Entry node with the specified name.
+ If the name is a relative path (begins with ./, ../, or a file
+ name), then it is looked up relative to the supplied directory
+ node, or to the top level directory of the FS (supplied at
+ construction time) if no directory is supplied.
+ """
+ return self._lookup(name, directory, Entry, create)
+
+ def File(self, name, directory = None, create = 1):
+ """Look up or create a File node with the specified name. If
+ the name is a relative path (begins with ./, ../, or a file name),
+ then it is looked up relative to the supplied directory node,
+ or to the top level directory of the FS (supplied at construction
+ time) if no directory is supplied.
+
+ This method will raise TypeError if a directory is found at the
+ specified path.
+ """
+ return self._lookup(name, directory, File, create)
+
+ def Dir(self, name, directory = None, create = True):
+ """Look up or create a Dir node with the specified name. If
+ the name is a relative path (begins with ./, ../, or a file name),
+ then it is looked up relative to the supplied directory node,
+ or to the top level directory of the FS (supplied at construction
+ time) if no directory is supplied.
+
+ This method will raise TypeError if a normal file is found at the
+ specified path.
+ """
+ return self._lookup(name, directory, Dir, create)
+
+ def VariantDir(self, variant_dir, src_dir, duplicate=1):
+ """Link the supplied variant directory to the source directory
+ for purposes of building files."""
+
+ if not isinstance(src_dir, SCons.Node.Node):
+ src_dir = self.Dir(src_dir)
+ if not isinstance(variant_dir, SCons.Node.Node):
+ variant_dir = self.Dir(variant_dir)
+ if src_dir.is_under(variant_dir):
+ raise SCons.Errors.UserError("Source directory cannot be under variant directory.")
+ if variant_dir.srcdir:
+ if variant_dir.srcdir == src_dir:
+ return # We already did this.
+ raise SCons.Errors.UserError("'%s' already has a source directory: '%s'."%(variant_dir, variant_dir.srcdir))
+ variant_dir.link(src_dir, duplicate)
+
+ def Repository(self, *dirs):
+ """Specify Repository directories to search."""
+ for d in dirs:
+ if not isinstance(d, SCons.Node.Node):
+ d = self.Dir(d)
+ self.Top.addRepository(d)
+
+ def PyPackageDir(self, modulename):
+ """Locate the directory of a given python module name
+
+ For example scons might resolve to
+ Windows: C:\Python27\Lib\site-packages\scons-2.5.1
+ Linux: /usr/lib/scons
+
+ This can be useful when we want to determine a toolpath based on a python module name"""
+
+ dirpath = ''
+ if sys.version_info[0] < 3 or (sys.version_info[0] == 3 and sys.version_info[1] in (0,1,2,3,4)):
+ # Python2 Code
+ import imp
+ splitname = modulename.split('.')
+ srchpths = sys.path
+ for item in splitname:
+ file, path, desc = imp.find_module(item, srchpths)
+ if file is not None:
+ path = os.path.dirname(path)
+ srchpths = [path]
+ dirpath = path
+ else:
+ # Python3 Code
+ import importlib.util
+ modspec = importlib.util.find_spec(modulename)
+ dirpath = os.path.dirname(modspec.origin)
+ return self._lookup(dirpath, None, Dir, True)
+
+
+ def variant_dir_target_climb(self, orig, dir, tail):
+ """Create targets in corresponding variant directories
+
+ Climb the directory tree, and look up path names
+ relative to any linked variant directories we find.
+
+ Even though this loops and walks up the tree, we don't memoize
+ the return value because this is really only used to process
+ the command-line targets.
+ """
+ targets = []
+ message = None
+ fmt = "building associated VariantDir targets: %s"
+ start_dir = dir
+ while dir:
+ for bd in dir.variant_dirs:
+ if start_dir.is_under(bd):
+ # If already in the build-dir location, don't reflect
+ return [orig], fmt % str(orig)
+ p = os.path.join(bd._path, *tail)
+ targets.append(self.Entry(p))
+ tail = [dir.name] + tail
+ dir = dir.up()
+ if targets:
+ message = fmt % ' '.join(map(str, targets))
+ return targets, message
+
+ def Glob(self, pathname, ondisk=True, source=True, strings=False, exclude=None, cwd=None):
+ """
+ Globs
+
+ This is mainly a shim layer
+ """
+ if cwd is None:
+ cwd = self.getcwd()
+ return cwd.glob(pathname, ondisk, source, strings, exclude)
+
+class DirNodeInfo(SCons.Node.NodeInfoBase):
+ __slots__ = ()
+ # This should get reset by the FS initialization.
+ current_version_id = 2
+
+ fs = None
+
+ def str_to_node(self, s):
+ top = self.fs.Top
+ root = top.root
+ if do_splitdrive:
+ drive, s = _my_splitdrive(s)
+ if drive:
+ root = self.fs.get_root(drive)
+ if not os.path.isabs(s):
+ s = top.get_labspath() + '/' + s
+ return root._lookup_abs(s, Entry)
+
+class DirBuildInfo(SCons.Node.BuildInfoBase):
+ __slots__ = ()
+ current_version_id = 2
+
+glob_magic_check = re.compile('[*?[]')
+
+def has_glob_magic(s):
+ return glob_magic_check.search(s) is not None
+
+class Dir(Base):
+ """A class for directories in a file system.
+ """
+
+ __slots__ = ['scanner_paths',
+ 'cachedir_csig',
+ 'cachesig',
+ 'repositories',
+ 'srcdir',
+ 'entries',
+ 'searched',
+ '_sconsign',
+ 'variant_dirs',
+ 'root',
+ 'dirname',
+ 'on_disk_entries',
+ 'released_target_info',
+ 'contentsig']
+
+ NodeInfo = DirNodeInfo
+ BuildInfo = DirBuildInfo
+
+ def __init__(self, name, directory, fs):
+ if SCons.Debug.track_instances: logInstanceCreation(self, 'Node.FS.Dir')
+ Base.__init__(self, name, directory, fs)
+ self._morph()
+
+ def _morph(self):
+ """Turn a file system Node (either a freshly initialized directory
+ object or a separate Entry object) into a proper directory object.
+
+ Set up this directory's entries and hook it into the file
+ system tree. Specify that directories (this Node) don't use
+ signatures for calculating whether they're current.
+ """
+
+ self.repositories = []
+ self.srcdir = None
+
+ self.entries = {}
+ self.entries['.'] = self
+ self.entries['..'] = self.dir
+ self.cwd = self
+ self.searched = 0
+ self._sconsign = None
+ self.variant_dirs = []
+ self.root = self.dir.root
+ self.changed_since_last_build = 3
+ self._func_sconsign = 1
+ self._func_exists = 2
+ self._func_get_contents = 2
+
+ self._abspath = SCons.Util.silent_intern(self.dir.entry_abspath(self.name))
+ self._labspath = SCons.Util.silent_intern(self.dir.entry_labspath(self.name))
+ if self.dir._path == '.':
+ self._path = SCons.Util.silent_intern(self.name)
+ else:
+ self._path = SCons.Util.silent_intern(self.dir.entry_path(self.name))
+ if self.dir._tpath == '.':
+ self._tpath = SCons.Util.silent_intern(self.name)
+ else:
+ self._tpath = SCons.Util.silent_intern(self.dir.entry_tpath(self.name))
+ self._path_elements = self.dir._path_elements + [self]
+
+ # For directories, we make a difference between the directory
+ # 'name' and the directory 'dirname'. The 'name' attribute is
+ # used when we need to print the 'name' of the directory or
+ # when we it is used as the last part of a path. The 'dirname'
+ # is used when the directory is not the last element of the
+ # path. The main reason for making that distinction is that
+ # for RoorDir's the dirname can not be easily inferred from
+ # the name. For example, we have to add a '/' after a drive
+ # letter but not after a UNC path prefix ('//').
+ self.dirname = self.name + OS_SEP
+
+ # Don't just reset the executor, replace its action list,
+ # because it might have some pre-or post-actions that need to
+ # be preserved.
+ #
+ # But don't reset the executor if there is a non-null executor
+ # attached already. The existing executor might have other
+ # targets, in which case replacing the action list with a
+ # Mkdir action is a big mistake.
+ if not hasattr(self, 'executor'):
+ self.builder = get_MkdirBuilder()
+ self.get_executor().set_action_list(self.builder.action)
+ else:
+ # Prepend MkdirBuilder action to existing action list
+ l = self.get_executor().action_list
+ a = get_MkdirBuilder().action
+ l.insert(0, a)
+ self.get_executor().set_action_list(l)
+
+ def diskcheck_match(self):
+ diskcheck_match(self, self.isfile,
+ "File %s found where directory expected.")
+
+ def __clearRepositoryCache(self, duplicate=None):
+ """Called when we change the repository(ies) for a directory.
+ This clears any cached information that is invalidated by changing
+ the repository."""
+
+ for node in list(self.entries.values()):
+ if node != self.dir:
+ if node != self and isinstance(node, Dir):
+ node.__clearRepositoryCache(duplicate)
+ else:
+ node.clear()
+ try:
+ del node._srcreps
+ except AttributeError:
+ pass
+ if duplicate is not None:
+ node.duplicate=duplicate
+
+ def __resetDuplicate(self, node):
+ if node != self:
+ node.duplicate = node.get_dir().duplicate
+
+ def Entry(self, name):
+ """
+ Looks up or creates an entry node named 'name' relative to
+ this directory.
+ """
+ return self.fs.Entry(name, self)
+
+ def Dir(self, name, create=True):
+ """
+ Looks up or creates a directory node named 'name' relative to
+ this directory.
+ """
+ return self.fs.Dir(name, self, create)
+
+ def File(self, name):
+ """
+ Looks up or creates a file node named 'name' relative to
+ this directory.
+ """
+ return self.fs.File(name, self)
+
+ def link(self, srcdir, duplicate):
+ """Set this directory as the variant directory for the
+ supplied source directory."""
+ self.srcdir = srcdir
+ self.duplicate = duplicate
+ self.__clearRepositoryCache(duplicate)
+ srcdir.variant_dirs.append(self)
+
+ def getRepositories(self):
+ """Returns a list of repositories for this directory.
+ """
+ if self.srcdir and not self.duplicate:
+ return self.srcdir.get_all_rdirs() + self.repositories
+ return self.repositories
+
+ @SCons.Memoize.CountMethodCall
+ def get_all_rdirs(self):
+ try:
+ return list(self._memo['get_all_rdirs'])
+ except KeyError:
+ pass
+
+ result = [self]
+ fname = '.'
+ dir = self
+ while dir:
+ for rep in dir.getRepositories():
+ result.append(rep.Dir(fname))
+ if fname == '.':
+ fname = dir.name
+ else:
+ fname = dir.name + OS_SEP + fname
+ dir = dir.up()
+
+ self._memo['get_all_rdirs'] = list(result)
+
+ return result
+
+ def addRepository(self, dir):
+ if dir != self and not dir in self.repositories:
+ self.repositories.append(dir)
+ dir._tpath = '.'
+ self.__clearRepositoryCache()
+
+ def up(self):
+ return self.dir
+
+ def _rel_path_key(self, other):
+ return str(other)
+
+ @SCons.Memoize.CountDictCall(_rel_path_key)
+ def rel_path(self, other):
+ """Return a path to "other" relative to this directory.
+ """
+
+ # This complicated and expensive method, which constructs relative
+ # paths between arbitrary Node.FS objects, is no longer used
+ # by SCons itself. It was introduced to store dependency paths
+ # in .sconsign files relative to the target, but that ended up
+ # being significantly inefficient.
+ #
+ # We're continuing to support the method because some SConstruct
+ # files out there started using it when it was available, and
+ # we're all about backwards compatibility..
+
+ try:
+ memo_dict = self._memo['rel_path']
+ except KeyError:
+ memo_dict = {}
+ self._memo['rel_path'] = memo_dict
+ else:
+ try:
+ return memo_dict[other]
+ except KeyError:
+ pass
+
+ if self is other:
+ result = '.'
+
+ elif not other in self._path_elements:
+ try:
+ other_dir = other.get_dir()
+ except AttributeError:
+ result = str(other)
+ else:
+ if other_dir is None:
+ result = other.name
+ else:
+ dir_rel_path = self.rel_path(other_dir)
+ if dir_rel_path == '.':
+ result = other.name
+ else:
+ result = dir_rel_path + OS_SEP + other.name
+ else:
+ i = self._path_elements.index(other) + 1
+
+ path_elems = ['..'] * (len(self._path_elements) - i) \
+ + [n.name for n in other._path_elements[i:]]
+
+ result = OS_SEP.join(path_elems)
+
+ memo_dict[other] = result
+
+ return result
+
+ def get_env_scanner(self, env, kw={}):
+ import SCons.Defaults
+ return SCons.Defaults.DirEntryScanner
+
+ def get_target_scanner(self):
+ import SCons.Defaults
+ return SCons.Defaults.DirEntryScanner
+
+ def get_found_includes(self, env, scanner, path):
+ """Return this directory's implicit dependencies.
+
+ We don't bother caching the results because the scan typically
+ shouldn't be requested more than once (as opposed to scanning
+ .h file contents, which can be requested as many times as the
+ files is #included by other files).
+ """
+ if not scanner:
+ return []
+ # Clear cached info for this Dir. If we already visited this
+ # directory on our walk down the tree (because we didn't know at
+ # that point it was being used as the source for another Node)
+ # then we may have calculated build signature before realizing
+ # we had to scan the disk. Now that we have to, though, we need
+ # to invalidate the old calculated signature so that any node
+ # dependent on our directory structure gets one that includes
+ # info about everything on disk.
+ self.clear()
+ return scanner(self, env, path)
+
+ #
+ # Taskmaster interface subsystem
+ #
+
+ def prepare(self):
+ pass
+
+ def build(self, **kw):
+ """A null "builder" for directories."""
+ global MkdirBuilder
+ if self.builder is not MkdirBuilder:
+ SCons.Node.Node.build(self, **kw)
+
+ #
+ #
+ #
+
+ def _create(self):
+ """Create this directory, silently and without worrying about
+ whether the builder is the default or not."""
+ listDirs = []
+ parent = self
+ while parent:
+ if parent.exists():
+ break
+ listDirs.append(parent)
+ p = parent.up()
+ if p is None:
+ # Don't use while: - else: for this condition because
+ # if so, then parent is None and has no .path attribute.
+ raise SCons.Errors.StopError(parent._path)
+ parent = p
+ listDirs.reverse()
+ for dirnode in listDirs:
+ try:
+ # Don't call dirnode.build(), call the base Node method
+ # directly because we definitely *must* create this
+ # directory. The dirnode.build() method will suppress
+ # the build if it's the default builder.
+ SCons.Node.Node.build(dirnode)
+ dirnode.get_executor().nullify()
+ # The build() action may or may not have actually
+ # created the directory, depending on whether the -n
+ # option was used or not. Delete the _exists and
+ # _rexists attributes so they can be reevaluated.
+ dirnode.clear()
+ except OSError:
+ pass
+
+ def multiple_side_effect_has_builder(self):
+ global MkdirBuilder
+ return self.builder is not MkdirBuilder and self.has_builder()
+
+ def alter_targets(self):
+ """Return any corresponding targets in a variant directory.
+ """
+ return self.fs.variant_dir_target_climb(self, self, [])
+
+ def scanner_key(self):
+ """A directory does not get scanned."""
+ return None
+
+ def get_text_contents(self):
+ """We already emit things in text, so just return the binary
+ version."""
+ return self.get_contents()
+
+ def get_contents(self):
+ """Return content signatures and names of all our children
+ separated by new-lines. Ensure that the nodes are sorted."""
+ return SCons.Node._get_contents_map[self._func_get_contents](self)
+
+ def get_csig(self):
+ """Compute the content signature for Directory nodes. In
+ general, this is not needed and the content signature is not
+ stored in the DirNodeInfo. However, if get_contents on a Dir
+ node is called which has a child directory, the child
+ directory should return the hash of its contents."""
+ contents = self.get_contents()
+ return SCons.Util.MD5signature(contents)
+
+ def do_duplicate(self, src):
+ pass
+
+ def is_up_to_date(self):
+ """If any child is not up-to-date, then this directory isn't,
+ either."""
+ if self.builder is not MkdirBuilder and not self.exists():
+ return 0
+ up_to_date = SCons.Node.up_to_date
+ for kid in self.children():
+ if kid.get_state() > up_to_date:
+ return 0
+ return 1
+
+ def rdir(self):
+ if not self.exists():
+ norm_name = _my_normcase(self.name)
+ for dir in self.dir.get_all_rdirs():
+ try: node = dir.entries[norm_name]
+ except KeyError: node = dir.dir_on_disk(self.name)
+ if node and node.exists() and \
+ (isinstance(dir, Dir) or isinstance(dir, Entry)):
+ return node
+ return self
+
+ def sconsign(self):
+ """Return the .sconsign file info for this directory. """
+ return _sconsign_map[self._func_sconsign](self)
+
+ def srcnode(self):
+ """Dir has a special need for srcnode()...if we
+ have a srcdir attribute set, then that *is* our srcnode."""
+ if self.srcdir:
+ return self.srcdir
+ return Base.srcnode(self)
+
+ def get_timestamp(self):
+ """Return the latest timestamp from among our children"""
+ stamp = 0
+ for kid in self.children():
+ if kid.get_timestamp() > stamp:
+ stamp = kid.get_timestamp()
+ return stamp
+
+ def get_abspath(self):
+ """Get the absolute path of the file."""
+ return self._abspath
+
+ def get_labspath(self):
+ """Get the absolute path of the file."""
+ return self._labspath
+
+ def get_internal_path(self):
+ return self._path
+
+ def get_tpath(self):
+ return self._tpath
+
+ def get_path_elements(self):
+ return self._path_elements
+
+ def entry_abspath(self, name):
+ return self._abspath + OS_SEP + name
+
+ def entry_labspath(self, name):
+ return self._labspath + '/' + name
+
+ def entry_path(self, name):
+ return self._path + OS_SEP + name
+
+ def entry_tpath(self, name):
+ return self._tpath + OS_SEP + name
+
+ def entry_exists_on_disk(self, name):
+ """ Searches through the file/dir entries of the current
+ directory, and returns True if a physical entry with the given
+ name could be found.
+
+ @see rentry_exists_on_disk
+ """
+ try:
+ d = self.on_disk_entries
+ except AttributeError:
+ d = {}
+ try:
+ entries = os.listdir(self._abspath)
+ except OSError:
+ pass
+ else:
+ for entry in map(_my_normcase, entries):
+ d[entry] = True
+ self.on_disk_entries = d
+ if sys.platform == 'win32' or sys.platform == 'cygwin':
+ name = _my_normcase(name)
+ result = d.get(name)
+ if result is None:
+ # Belt-and-suspenders for Windows: check directly for
+ # 8.3 file names that don't show up in os.listdir().
+ result = os.path.exists(self._abspath + OS_SEP + name)
+ d[name] = result
+ return result
+ else:
+ return name in d
+
+ def rentry_exists_on_disk(self, name):
+ """ Searches through the file/dir entries of the current
+ *and* all its remote directories (repos), and returns
+ True if a physical entry with the given name could be found.
+ The local directory (self) gets searched first, so
+ repositories take a lower precedence regarding the
+ searching order.
+
+ @see entry_exists_on_disk
+ """
+
+ rentry_exists = self.entry_exists_on_disk(name)
+ if not rentry_exists:
+ # Search through the repository folders
+ norm_name = _my_normcase(name)
+ for rdir in self.get_all_rdirs():
+ try:
+ node = rdir.entries[norm_name]
+ if node:
+ rentry_exists = True
+ break
+ except KeyError:
+ if rdir.entry_exists_on_disk(name):
+ rentry_exists = True
+ break
+ return rentry_exists
+
+ @SCons.Memoize.CountMethodCall
+ def srcdir_list(self):
+ try:
+ return self._memo['srcdir_list']
+ except KeyError:
+ pass
+
+ result = []
+
+ dirname = '.'
+ dir = self
+ while dir:
+ if dir.srcdir:
+ result.append(dir.srcdir.Dir(dirname))
+ dirname = dir.name + OS_SEP + dirname
+ dir = dir.up()
+
+ self._memo['srcdir_list'] = result
+
+ return result
+
+ def srcdir_duplicate(self, name):
+ for dir in self.srcdir_list():
+ if self.is_under(dir):
+ # We shouldn't source from something in the build path;
+ # variant_dir is probably under src_dir, in which case
+ # we are reflecting.
+ break
+ if dir.entry_exists_on_disk(name):
+ srcnode = dir.Entry(name).disambiguate()
+ if self.duplicate:
+ node = self.Entry(name).disambiguate()
+ node.do_duplicate(srcnode)
+ return node
+ else:
+ return srcnode
+ return None
+
+ def _srcdir_find_file_key(self, filename):
+ return filename
+
+ @SCons.Memoize.CountDictCall(_srcdir_find_file_key)
+ def srcdir_find_file(self, filename):
+ try:
+ memo_dict = self._memo['srcdir_find_file']
+ except KeyError:
+ memo_dict = {}
+ self._memo['srcdir_find_file'] = memo_dict
+ else:
+ try:
+ return memo_dict[filename]
+ except KeyError:
+ pass
+
+ def func(node):
+ if (isinstance(node, File) or isinstance(node, Entry)) and \
+ (node.is_derived() or node.exists()):
+ return node
+ return None
+
+ norm_name = _my_normcase(filename)
+
+ for rdir in self.get_all_rdirs():
+ try: node = rdir.entries[norm_name]
+ except KeyError: node = rdir.file_on_disk(filename)
+ else: node = func(node)
+ if node:
+ result = (node, self)
+ memo_dict[filename] = result
+ return result
+
+ for srcdir in self.srcdir_list():
+ for rdir in srcdir.get_all_rdirs():
+ try: node = rdir.entries[norm_name]
+ except KeyError: node = rdir.file_on_disk(filename)
+ else: node = func(node)
+ if node:
+ result = (File(filename, self, self.fs), srcdir)
+ memo_dict[filename] = result
+ return result
+
+ result = (None, None)
+ memo_dict[filename] = result
+ return result
+
+ def dir_on_disk(self, name):
+ if self.entry_exists_on_disk(name):
+ try: return self.Dir(name)
+ except TypeError: pass
+ node = self.srcdir_duplicate(name)
+ if isinstance(node, File):
+ return None
+ return node
+
+ def file_on_disk(self, name):
+ if self.entry_exists_on_disk(name):
+ try: return self.File(name)
+ except TypeError: pass
+ node = self.srcdir_duplicate(name)
+ if isinstance(node, Dir):
+ return None
+ return node
+
+ def walk(self, func, arg):
+ """
+ Walk this directory tree by calling the specified function
+ for each directory in the tree.
+
+ This behaves like the os.path.walk() function, but for in-memory
+ Node.FS.Dir objects. The function takes the same arguments as
+ the functions passed to os.path.walk():
+
+ func(arg, dirname, fnames)
+
+ Except that "dirname" will actually be the directory *Node*,
+ not the string. The '.' and '..' entries are excluded from
+ fnames. The fnames list may be modified in-place to filter the
+ subdirectories visited or otherwise impose a specific order.
+ The "arg" argument is always passed to func() and may be used
+ in any way (or ignored, passing None is common).
+ """
+ entries = self.entries
+ names = list(entries.keys())
+ names.remove('.')
+ names.remove('..')
+ func(arg, self, names)
+ for dirname in [n for n in names if isinstance(entries[n], Dir)]:
+ entries[dirname].walk(func, arg)
+
+ def glob(self, pathname, ondisk=True, source=False, strings=False, exclude=None):
+ """
+ Returns a list of Nodes (or strings) matching a specified
+ pathname pattern.
+
+ Pathname patterns follow UNIX shell semantics: * matches
+ any-length strings of any characters, ? matches any character,
+ and [] can enclose lists or ranges of characters. Matches do
+ not span directory separators.
+
+ The matches take into account Repositories, returning local
+ Nodes if a corresponding entry exists in a Repository (either
+ an in-memory Node or something on disk).
+
+ By defafult, the glob() function matches entries that exist
+ on-disk, in addition to in-memory Nodes. Setting the "ondisk"
+ argument to False (or some other non-true value) causes the glob()
+ function to only match in-memory Nodes. The default behavior is
+ to return both the on-disk and in-memory Nodes.
+
+ The "source" argument, when true, specifies that corresponding
+ source Nodes must be returned if you're globbing in a build
+ directory (initialized with VariantDir()). The default behavior
+ is to return Nodes local to the VariantDir().
+
+ The "strings" argument, when true, returns the matches as strings,
+ not Nodes. The strings are path names relative to this directory.
+
+ The "exclude" argument, if not None, must be a pattern or a list
+ of patterns following the same UNIX shell semantics.
+ Elements matching a least one pattern of this list will be excluded
+ from the result.
+
+ The underlying algorithm is adapted from the glob.glob() function
+ in the Python library (but heavily modified), and uses fnmatch()
+ under the covers.
+ """
+ dirname, basename = os.path.split(pathname)
+ if not dirname:
+ result = self._glob1(basename, ondisk, source, strings)
+ else:
+ if has_glob_magic(dirname):
+ list = self.glob(dirname, ondisk, source, False, exclude)
+ else:
+ list = [self.Dir(dirname, create=True)]
+ result = []
+ for dir in list:
+ r = dir._glob1(basename, ondisk, source, strings)
+ if strings:
+ r = [os.path.join(str(dir), x) for x in r]
+ result.extend(r)
+ if exclude:
+ excludes = []
+ excludeList = SCons.Util.flatten(exclude)
+ for x in excludeList:
+ r = self.glob(x, ondisk, source, strings)
+ excludes.extend(r)
+ result = [x for x in result if not any(fnmatch.fnmatch(str(x), str(e)) for e in SCons.Util.flatten(excludes))]
+ return sorted(result, key=lambda a: str(a))
+
+ def _glob1(self, pattern, ondisk=True, source=False, strings=False):
+ """
+ Globs for and returns a list of entry names matching a single
+ pattern in this directory.
+
+ This searches any repositories and source directories for
+ corresponding entries and returns a Node (or string) relative
+ to the current directory if an entry is found anywhere.
+
+ TODO: handle pattern with no wildcard
+ """
+ search_dir_list = self.get_all_rdirs()
+ for srcdir in self.srcdir_list():
+ search_dir_list.extend(srcdir.get_all_rdirs())
+
+ selfEntry = self.Entry
+ names = []
+ for dir in search_dir_list:
+ # We use the .name attribute from the Node because the keys of
+ # the dir.entries dictionary are normalized (that is, all upper
+ # case) on case-insensitive systems like Windows.
+ node_names = [ v.name for k, v in dir.entries.items()
+ if k not in ('.', '..') ]
+ names.extend(node_names)
+ if not strings:
+ # Make sure the working directory (self) actually has
+ # entries for all Nodes in repositories or variant dirs.
+ for name in node_names: selfEntry(name)
+ if ondisk:
+ try:
+ disk_names = os.listdir(dir._abspath)
+ except os.error:
+ continue
+ names.extend(disk_names)
+ if not strings:
+ # We're going to return corresponding Nodes in
+ # the local directory, so we need to make sure
+ # those Nodes exist. We only want to create
+ # Nodes for the entries that will match the
+ # specified pattern, though, which means we
+ # need to filter the list here, even though
+ # the overall list will also be filtered later,
+ # after we exit this loop.
+ if pattern[0] != '.':
+ disk_names = [x for x in disk_names if x[0] != '.']
+ disk_names = fnmatch.filter(disk_names, pattern)
+ dirEntry = dir.Entry
+ for name in disk_names:
+ # Add './' before disk filename so that '#' at
+ # beginning of filename isn't interpreted.
+ name = './' + name
+ node = dirEntry(name).disambiguate()
+ n = selfEntry(name)
+ if n.__class__ != node.__class__:
+ n.__class__ = node.__class__
+ n._morph()
+
+ names = set(names)
+ if pattern[0] != '.':
+ names = [x for x in names if x[0] != '.']
+ names = fnmatch.filter(names, pattern)
+
+ if strings:
+ return names
+
+ return [self.entries[_my_normcase(n)] for n in names]
+
+class RootDir(Dir):
+ """A class for the root directory of a file system.
+
+ This is the same as a Dir class, except that the path separator
+ ('/' or '\\') is actually part of the name, so we don't need to
+ add a separator when creating the path names of entries within
+ this directory.
+ """
+
+ __slots__ = ['_lookupDict']
+
+ def __init__(self, drive, fs):
+ if SCons.Debug.track_instances: logInstanceCreation(self, 'Node.FS.RootDir')
+ SCons.Node.Node.__init__(self)
+
+ # Handle all the types of drives:
+ if drive == '':
+ # No drive, regular UNIX root or Windows default drive.
+ name = OS_SEP
+ dirname = OS_SEP
+ elif drive == '//':
+ # UNC path
+ name = UNC_PREFIX
+ dirname = UNC_PREFIX
+ else:
+ # Windows drive letter
+ name = drive
+ dirname = drive + OS_SEP
+
+ # Filename with extension as it was specified when the object was
+ # created; to obtain filesystem path, use Python str() function
+ self.name = SCons.Util.silent_intern(name)
+ self.fs = fs #: Reference to parent Node.FS object
+
+ self._path_elements = [self]
+ self.dir = self
+ self._func_rexists = 2
+ self._func_target_from_source = 1
+ self.store_info = 1
+
+ # Now set our paths to what we really want them to be. The
+ # name should already contain any necessary separators, such
+ # as the initial drive letter (the name) plus the directory
+ # separator, except for the "lookup abspath," which does not
+ # have the drive letter.
+ self._abspath = dirname
+ self._labspath = ''
+ self._path = dirname
+ self._tpath = dirname
+ self.dirname = dirname
+
+ self._morph()
+
+ self.duplicate = 0
+ self._lookupDict = {}
+
+ self._lookupDict[''] = self
+ self._lookupDict['/'] = self
+ self.root = self
+ # The // entry is necessary because os.path.normpath()
+ # preserves double slashes at the beginning of a path on Posix
+ # platforms.
+ if not has_unc:
+ self._lookupDict['//'] = self
+
+ def _morph(self):
+ """Turn a file system Node (either a freshly initialized directory
+ object or a separate Entry object) into a proper directory object.
+
+ Set up this directory's entries and hook it into the file
+ system tree. Specify that directories (this Node) don't use
+ signatures for calculating whether they're current.
+ """
+
+ self.repositories = []
+ self.srcdir = None
+
+ self.entries = {}
+ self.entries['.'] = self
+ self.entries['..'] = self.dir
+ self.cwd = self
+ self.searched = 0
+ self._sconsign = None
+ self.variant_dirs = []
+ self.changed_since_last_build = 3
+ self._func_sconsign = 1
+ self._func_exists = 2
+ self._func_get_contents = 2
+
+ # Don't just reset the executor, replace its action list,
+ # because it might have some pre-or post-actions that need to
+ # be preserved.
+ #
+ # But don't reset the executor if there is a non-null executor
+ # attached already. The existing executor might have other
+ # targets, in which case replacing the action list with a
+ # Mkdir action is a big mistake.
+ if not hasattr(self, 'executor'):
+ self.builder = get_MkdirBuilder()
+ self.get_executor().set_action_list(self.builder.action)
+ else:
+ # Prepend MkdirBuilder action to existing action list
+ l = self.get_executor().action_list
+ a = get_MkdirBuilder().action
+ l.insert(0, a)
+ self.get_executor().set_action_list(l)
+
+
+ def must_be_same(self, klass):
+ if klass is Dir:
+ return
+ Base.must_be_same(self, klass)
+
+ def _lookup_abs(self, p, klass, create=1):
+ """
+ Fast (?) lookup of a *normalized* absolute path.
+
+ This method is intended for use by internal lookups with
+ already-normalized path data. For general-purpose lookups,
+ use the FS.Entry(), FS.Dir() or FS.File() methods.
+
+ The caller is responsible for making sure we're passed a
+ normalized absolute path; we merely let Python's dictionary look
+ up and return the One True Node.FS object for the path.
+
+ If a Node for the specified "p" doesn't already exist, and
+ "create" is specified, the Node may be created after recursive
+ invocation to find or create the parent directory or directories.
+ """
+ k = _my_normcase(p)
+ try:
+ result = self._lookupDict[k]
+ except KeyError:
+ if not create:
+ msg = "No such file or directory: '%s' in '%s' (and create is False)" % (p, str(self))
+ raise SCons.Errors.UserError(msg)
+ # There is no Node for this path name, and we're allowed
+ # to create it.
+ dir_name, file_name = p.rsplit('/',1)
+ dir_node = self._lookup_abs(dir_name, Dir)
+ result = klass(file_name, dir_node, self.fs)
+
+ # Double-check on disk (as configured) that the Node we
+ # created matches whatever is out there in the real world.
+ result.diskcheck_match()
+
+ self._lookupDict[k] = result
+ dir_node.entries[_my_normcase(file_name)] = result
+ dir_node.implicit = None
+ else:
+ # There is already a Node for this path name. Allow it to
+ # complain if we were looking for an inappropriate type.
+ result.must_be_same(klass)
+ return result
+
+ def __str__(self):
+ return self._abspath
+
+ def entry_abspath(self, name):
+ return self._abspath + name
+
+ def entry_labspath(self, name):
+ return '/' + name
+
+ def entry_path(self, name):
+ return self._path + name
+
+ def entry_tpath(self, name):
+ return self._tpath + name
+
+ def is_under(self, dir):
+ if self is dir:
+ return 1
+ else:
+ return 0
+
+ def up(self):
+ return None
+
+ def get_dir(self):
+ return None
+
+ def src_builder(self):
+ return _null
+
+
+class FileNodeInfo(SCons.Node.NodeInfoBase):
+ __slots__ = ('csig', 'timestamp', 'size')
+ current_version_id = 2
+
+ field_list = ['csig', 'timestamp', 'size']
+
+ # This should get reset by the FS initialization.
+ fs = None
+
+ def str_to_node(self, s):
+ top = self.fs.Top
+ root = top.root
+ if do_splitdrive:
+ drive, s = _my_splitdrive(s)
+ if drive:
+ root = self.fs.get_root(drive)
+ if not os.path.isabs(s):
+ s = top.get_labspath() + '/' + s
+ return root._lookup_abs(s, Entry)
+
+ def __getstate__(self):
+ """
+ Return all fields that shall be pickled. Walk the slots in the class
+ hierarchy and add those to the state dictionary. If a '__dict__' slot is
+ available, copy all entries to the dictionary. Also include the version
+ id, which is fixed for all instances of a class.
+ """
+ state = getattr(self, '__dict__', {}).copy()
+ for obj in type(self).mro():
+ for name in getattr(obj,'__slots__',()):
+ if hasattr(self, name):
+ state[name] = getattr(self, name)
+
+ state['_version_id'] = self.current_version_id
+ try:
+ del state['__weakref__']
+ except KeyError:
+ pass
+
+ return state
+
+ def __setstate__(self, state):
+ """
+ Restore the attributes from a pickled state.
+ """
+ # TODO check or discard version
+ del state['_version_id']
+ for key, value in state.items():
+ if key not in ('__weakref__',):
+ setattr(self, key, value)
+
+
+class FileBuildInfo(SCons.Node.BuildInfoBase):
+ __slots__ = ()
+ current_version_id = 2
+
+ def convert_to_sconsign(self):
+ """
+ Converts this FileBuildInfo object for writing to a .sconsign file
+
+ This replaces each Node in our various dependency lists with its
+ usual string representation: relative to the top-level SConstruct
+ directory, or an absolute path if it's outside.
+ """
+ if os_sep_is_slash:
+ node_to_str = str
+ else:
+ def node_to_str(n):
+ try:
+ s = n.get_internal_path()
+ except AttributeError:
+ s = str(n)
+ else:
+ s = s.replace(OS_SEP, '/')
+ return s
+ for attr in ['bsources', 'bdepends', 'bimplicit']:
+ try:
+ val = getattr(self, attr)
+ except AttributeError:
+ pass
+ else:
+ setattr(self, attr, list(map(node_to_str, val)))
+
+ def convert_from_sconsign(self, dir, name):
+ """
+ Converts a newly-read FileBuildInfo object for in-SCons use
+
+ For normal up-to-date checking, we don't have any conversion to
+ perform--but we're leaving this method here to make that clear.
+ """
+ pass
+
+ def prepare_dependencies(self):
+ """
+ Prepares a FileBuildInfo object for explaining what changed
+
+ The bsources, bdepends and bimplicit lists have all been
+ stored on disk as paths relative to the top-level SConstruct
+ directory. Convert the strings to actual Nodes (for use by the
+ --debug=explain code and --implicit-cache).
+ """
+ attrs = [
+ ('bsources', 'bsourcesigs'),
+ ('bdepends', 'bdependsigs'),
+ ('bimplicit', 'bimplicitsigs'),
+ ]
+ for (nattr, sattr) in attrs:
+ try:
+ strings = getattr(self, nattr)
+ nodeinfos = getattr(self, sattr)
+ except AttributeError:
+ continue
+ if strings is None or nodeinfos is None:
+ continue
+ nodes = []
+ for s, ni in zip(strings, nodeinfos):
+ if not isinstance(s, SCons.Node.Node):
+ s = ni.str_to_node(s)
+ nodes.append(s)
+ setattr(self, nattr, nodes)
+
+ def format(self, names=0):
+ result = []
+ bkids = self.bsources + self.bdepends + self.bimplicit
+ bkidsigs = self.bsourcesigs + self.bdependsigs + self.bimplicitsigs
+ for bkid, bkidsig in zip(bkids, bkidsigs):
+ result.append(str(bkid) + ': ' +
+ ' '.join(bkidsig.format(names=names)))
+ if not hasattr(self,'bact'):
+ self.bact = "none"
+ result.append('%s [%s]' % (self.bactsig, self.bact))
+ return '\n'.join(result)
+
+
+class File(Base):
+ """A class for files in a file system.
+ """
+
+ __slots__ = ['scanner_paths',
+ 'cachedir_csig',
+ 'cachesig',
+ 'repositories',
+ 'srcdir',
+ 'entries',
+ 'searched',
+ '_sconsign',
+ 'variant_dirs',
+ 'root',
+ 'dirname',
+ 'on_disk_entries',
+ 'released_target_info',
+ 'contentsig']
+
+ NodeInfo = FileNodeInfo
+ BuildInfo = FileBuildInfo
+
+ md5_chunksize = 64
+
+ def diskcheck_match(self):
+ diskcheck_match(self, self.isdir,
+ "Directory %s found where file expected.")
+
+ def __init__(self, name, directory, fs):
+ if SCons.Debug.track_instances: logInstanceCreation(self, 'Node.FS.File')
+ Base.__init__(self, name, directory, fs)
+ self._morph()
+
+ def Entry(self, name):
+ """Create an entry node named 'name' relative to
+ the directory of this file."""
+ return self.dir.Entry(name)
+
+ def Dir(self, name, create=True):
+ """Create a directory node named 'name' relative to
+ the directory of this file."""
+ return self.dir.Dir(name, create=create)
+
+ def Dirs(self, pathlist):
+ """Create a list of directories relative to the SConscript
+ directory of this file."""
+ return [self.Dir(p) for p in pathlist]
+
+ def File(self, name):
+ """Create a file node named 'name' relative to
+ the directory of this file."""
+ return self.dir.File(name)
+
+ def _morph(self):
+ """Turn a file system node into a File object."""
+ self.scanner_paths = {}
+ if not hasattr(self, '_local'):
+ self._local = 0
+ if not hasattr(self, 'released_target_info'):
+ self.released_target_info = False
+
+ self.store_info = 1
+ self._func_exists = 4
+ self._func_get_contents = 3
+
+ # Initialize this Node's decider function to decide_source() because
+ # every file is a source file until it has a Builder attached...
+ self.changed_since_last_build = 4
+
+ # If there was already a Builder set on this entry, then
+ # we need to make sure we call the target-decider function,
+ # not the source-decider. Reaching in and doing this by hand
+ # is a little bogus. We'd prefer to handle this by adding
+ # an Entry.builder_set() method that disambiguates like the
+ # other methods, but that starts running into problems with the
+ # fragile way we initialize Dir Nodes with their Mkdir builders,
+ # yet still allow them to be overridden by the user. Since it's
+ # not clear right now how to fix that, stick with what works
+ # until it becomes clear...
+ if self.has_builder():
+ self.changed_since_last_build = 5
+
+ def scanner_key(self):
+ return self.get_suffix()
+
+ def get_contents(self):
+ return SCons.Node._get_contents_map[self._func_get_contents](self)
+
+ def get_text_contents(self):
+ """
+ This attempts to figure out what the encoding of the text is
+ based upon the BOM bytes, and then decodes the contents so that
+ it's a valid python string.
+ """
+ contents = self.get_contents()
+ # The behavior of various decode() methods and functions
+ # w.r.t. the initial BOM bytes is different for different
+ # encodings and/or Python versions. ('utf-8' does not strip
+ # them, but has a 'utf-8-sig' which does; 'utf-16' seems to
+ # strip them; etc.) Just sidestep all the complication by
+ # explicitly stripping the BOM before we decode().
+ if contents[:len(codecs.BOM_UTF8)] == codecs.BOM_UTF8:
+ return contents[len(codecs.BOM_UTF8):].decode('utf-8')
+ if contents[:len(codecs.BOM_UTF16_LE)] == codecs.BOM_UTF16_LE:
+ return contents[len(codecs.BOM_UTF16_LE):].decode('utf-16-le')
+ if contents[:len(codecs.BOM_UTF16_BE)] == codecs.BOM_UTF16_BE:
+ return contents[len(codecs.BOM_UTF16_BE):].decode('utf-16-be')
+ try:
+ return contents.decode('utf-8')
+ except UnicodeDecodeError as e:
+ try:
+ return contents.decode('latin-1')
+ except UnicodeDecodeError as e:
+ return contents.decode('utf-8', error='backslashreplace')
+
+
+ def get_content_hash(self):
+ """
+ Compute and return the MD5 hash for this file.
+ """
+ if not self.rexists():
+ return SCons.Util.MD5signature('')
+ fname = self.rfile().get_abspath()
+ try:
+ cs = SCons.Util.MD5filesignature(fname,
+ chunksize=SCons.Node.FS.File.md5_chunksize*1024)
+ except EnvironmentError as e:
+ if not e.filename:
+ e.filename = fname
+ raise
+ return cs
+
+ @SCons.Memoize.CountMethodCall
+ def get_size(self):
+ try:
+ return self._memo['get_size']
+ except KeyError:
+ pass
+
+ if self.rexists():
+ size = self.rfile().getsize()
+ else:
+ size = 0
+
+ self._memo['get_size'] = size
+
+ return size
+
+ @SCons.Memoize.CountMethodCall
+ def get_timestamp(self):
+ try:
+ return self._memo['get_timestamp']
+ except KeyError:
+ pass
+
+ if self.rexists():
+ timestamp = self.rfile().getmtime()
+ else:
+ timestamp = 0
+
+ self._memo['get_timestamp'] = timestamp
+
+ return timestamp
+
+ convert_copy_attrs = [
+ 'bsources',
+ 'bimplicit',
+ 'bdepends',
+ 'bact',
+ 'bactsig',
+ 'ninfo',
+ ]
+
+
+ convert_sig_attrs = [
+ 'bsourcesigs',
+ 'bimplicitsigs',
+ 'bdependsigs',
+ ]
+
+ def convert_old_entry(self, old_entry):
+ # Convert a .sconsign entry from before the Big Signature
+ # Refactoring, doing what we can to convert its information
+ # to the new .sconsign entry format.
+ #
+ # The old format looked essentially like this:
+ #
+ # BuildInfo
+ # .ninfo (NodeInfo)
+ # .bsig
+ # .csig
+ # .timestamp
+ # .size
+ # .bsources
+ # .bsourcesigs ("signature" list)
+ # .bdepends
+ # .bdependsigs ("signature" list)
+ # .bimplicit
+ # .bimplicitsigs ("signature" list)
+ # .bact
+ # .bactsig
+ #
+ # The new format looks like this:
+ #
+ # .ninfo (NodeInfo)
+ # .bsig
+ # .csig
+ # .timestamp
+ # .size
+ # .binfo (BuildInfo)
+ # .bsources
+ # .bsourcesigs (NodeInfo list)
+ # .bsig
+ # .csig
+ # .timestamp
+ # .size
+ # .bdepends
+ # .bdependsigs (NodeInfo list)
+ # .bsig
+ # .csig
+ # .timestamp
+ # .size
+ # .bimplicit
+ # .bimplicitsigs (NodeInfo list)
+ # .bsig
+ # .csig
+ # .timestamp
+ # .size
+ # .bact
+ # .bactsig
+ #
+ # The basic idea of the new structure is that a NodeInfo always
+ # holds all available information about the state of a given Node
+ # at a certain point in time. The various .b*sigs lists can just
+ # be a list of pointers to the .ninfo attributes of the different
+ # dependent nodes, without any copying of information until it's
+ # time to pickle it for writing out to a .sconsign file.
+ #
+ # The complicating issue is that the *old* format only stored one
+ # "signature" per dependency, based on however the *last* build
+ # was configured. We don't know from just looking at it whether
+ # it was a build signature, a content signature, or a timestamp
+ # "signature". Since we no longer use build signatures, the
+ # best we can do is look at the length and if it's thirty two,
+ # assume that it was (or might have been) a content signature.
+ # If it was actually a build signature, then it will cause a
+ # rebuild anyway when it doesn't match the new content signature,
+ # but that's probably the best we can do.
+ import SCons.SConsign
+ new_entry = SCons.SConsign.SConsignEntry()
+ new_entry.binfo = self.new_binfo()
+ binfo = new_entry.binfo
+ for attr in self.convert_copy_attrs:
+ try:
+ value = getattr(old_entry, attr)
+ except AttributeError:
+ continue
+ setattr(binfo, attr, value)
+ delattr(old_entry, attr)
+ for attr in self.convert_sig_attrs:
+ try:
+ sig_list = getattr(old_entry, attr)
+ except AttributeError:
+ continue
+ value = []
+ for sig in sig_list:
+ ninfo = self.new_ninfo()
+ if len(sig) == 32:
+ ninfo.csig = sig
+ else:
+ ninfo.timestamp = sig
+ value.append(ninfo)
+ setattr(binfo, attr, value)
+ delattr(old_entry, attr)
+ return new_entry
+
+ @SCons.Memoize.CountMethodCall
+ def get_stored_info(self):
+ try:
+ return self._memo['get_stored_info']
+ except KeyError:
+ pass
+
+ try:
+ sconsign_entry = self.dir.sconsign().get_entry(self.name)
+ except (KeyError, EnvironmentError):
+ import SCons.SConsign
+ sconsign_entry = SCons.SConsign.SConsignEntry()
+ sconsign_entry.binfo = self.new_binfo()
+ sconsign_entry.ninfo = self.new_ninfo()
+ else:
+ if isinstance(sconsign_entry, FileBuildInfo):
+ # This is a .sconsign file from before the Big Signature
+ # Refactoring; convert it as best we can.
+ sconsign_entry = self.convert_old_entry(sconsign_entry)
+ try:
+ delattr(sconsign_entry.ninfo, 'bsig')
+ except AttributeError:
+ pass
+
+ self._memo['get_stored_info'] = sconsign_entry
+
+ return sconsign_entry
+
+ def get_stored_implicit(self):
+ binfo = self.get_stored_info().binfo
+ binfo.prepare_dependencies()
+ try: return binfo.bimplicit
+ except AttributeError: return None
+
+ def rel_path(self, other):
+ return self.dir.rel_path(other)
+
+ def _get_found_includes_key(self, env, scanner, path):
+ return (id(env), id(scanner), path)
+
+ @SCons.Memoize.CountDictCall(_get_found_includes_key)
+ def get_found_includes(self, env, scanner, path):
+ """Return the included implicit dependencies in this file.
+ Cache results so we only scan the file once per path
+ regardless of how many times this information is requested.
+ """
+ memo_key = (id(env), id(scanner), path)
+ try:
+ memo_dict = self._memo['get_found_includes']
+ except KeyError:
+ memo_dict = {}
+ self._memo['get_found_includes'] = memo_dict
+ else:
+ try:
+ return memo_dict[memo_key]
+ except KeyError:
+ pass
+
+ if scanner:
+ result = [n.disambiguate() for n in scanner(self, env, path)]
+ else:
+ result = []
+
+ memo_dict[memo_key] = result
+
+ return result
+
+ def _createDir(self):
+ # ensure that the directories for this node are
+ # created.
+ self.dir._create()
+
+ def push_to_cache(self):
+ """Try to push the node into a cache
+ """
+ # This should get called before the Nodes' .built() method is
+ # called, which would clear the build signature if the file has
+ # a source scanner.
+ #
+ # We have to clear the local memoized values *before* we push
+ # the node to cache so that the memoization of the self.exists()
+ # return value doesn't interfere.
+ if self.nocache:
+ return
+ self.clear_memoized_values()
+ if self.exists():
+ self.get_build_env().get_CacheDir().push(self)
+
+ def retrieve_from_cache(self):
+ """Try to retrieve the node's content from a cache
+
+ This method is called from multiple threads in a parallel build,
+ so only do thread safe stuff here. Do thread unsafe stuff in
+ built().
+
+ Returns true if the node was successfully retrieved.
+ """
+ if self.nocache:
+ return None
+ if not self.is_derived():
+ return None
+ return self.get_build_env().get_CacheDir().retrieve(self)
+
+ def visited(self):
+ if self.exists() and self.executor is not None:
+ self.get_build_env().get_CacheDir().push_if_forced(self)
+
+ ninfo = self.get_ninfo()
+
+ csig = self.get_max_drift_csig()
+ if csig:
+ ninfo.csig = csig
+
+ ninfo.timestamp = self.get_timestamp()
+ ninfo.size = self.get_size()
+
+ if not self.has_builder():
+ # This is a source file, but it might have been a target file
+ # in another build that included more of the DAG. Copy
+ # any build information that's stored in the .sconsign file
+ # into our binfo object so it doesn't get lost.
+ old = self.get_stored_info()
+ self.get_binfo().merge(old.binfo)
+
+ SCons.Node.store_info_map[self.store_info](self)
+
+ def release_target_info(self):
+ """Called just after this node has been marked
+ up-to-date or was built completely.
+
+ This is where we try to release as many target node infos
+ as possible for clean builds and update runs, in order
+ to minimize the overall memory consumption.
+
+ We'd like to remove a lot more attributes like self.sources
+ and self.sources_set, but they might get used
+ in a next build step. For example, during configuration
+ the source files for a built E{*}.o file are used to figure out
+ which linker to use for the resulting Program (gcc vs. g++)!
+ That's why we check for the 'keep_targetinfo' attribute,
+ config Nodes and the Interactive mode just don't allow
+ an early release of most variables.
+
+ In the same manner, we can't simply remove the self.attributes
+ here. The smart linking relies on the shared flag, and some
+ parts of the java Tool use it to transport information
+ about nodes...
+
+ @see: built() and Node.release_target_info()
+ """
+ if (self.released_target_info or SCons.Node.interactive):
+ return
+
+ if not hasattr(self.attributes, 'keep_targetinfo'):
+ # Cache some required values, before releasing
+ # stuff like env, executor and builder...
+ self.changed(allowcache=True)
+ self.get_contents_sig()
+ self.get_build_env()
+ # Now purge unneeded stuff to free memory...
+ self.executor = None
+ self._memo.pop('rfile', None)
+ self.prerequisites = None
+ # Cleanup lists, but only if they're empty
+ if not len(self.ignore_set):
+ self.ignore_set = None
+ if not len(self.implicit_set):
+ self.implicit_set = None
+ if not len(self.depends_set):
+ self.depends_set = None
+ if not len(self.ignore):
+ self.ignore = None
+ if not len(self.depends):
+ self.depends = None
+ # Mark this node as done, we only have to release
+ # the memory once...
+ self.released_target_info = True
+
+ def find_src_builder(self):
+ if self.rexists():
+ return None
+ scb = self.dir.src_builder()
+ if scb is _null:
+ scb = None
+ if scb is not None:
+ try:
+ b = self.builder
+ except AttributeError:
+ b = None
+ if b is None:
+ self.builder_set(scb)
+ return scb
+
+ def has_src_builder(self):
+ """Return whether this Node has a source builder or not.
+
+ If this Node doesn't have an explicit source code builder, this
+ is where we figure out, on the fly, if there's a transparent
+ source code builder for it.
+
+ Note that if we found a source builder, we also set the
+ self.builder attribute, so that all of the methods that actually
+ *build* this file don't have to do anything different.
+ """
+ try:
+ scb = self.sbuilder
+ except AttributeError:
+ scb = self.sbuilder = self.find_src_builder()
+ return scb is not None
+
+ def alter_targets(self):
+ """Return any corresponding targets in a variant directory.
+ """
+ if self.is_derived():
+ return [], None
+ return self.fs.variant_dir_target_climb(self, self.dir, [self.name])
+
+ def _rmv_existing(self):
+ self.clear_memoized_values()
+ if SCons.Node.print_duplicate:
+ print("dup: removing existing target {}".format(self))
+ e = Unlink(self, [], None)
+ if isinstance(e, SCons.Errors.BuildError):
+ raise e
+
+ #
+ # Taskmaster interface subsystem
+ #
+
+ def make_ready(self):
+ self.has_src_builder()
+ self.get_binfo()
+
+ def prepare(self):
+ """Prepare for this file to be created."""
+ SCons.Node.Node.prepare(self)
+
+ if self.get_state() != SCons.Node.up_to_date:
+ if self.exists():
+ if self.is_derived() and not self.precious:
+ self._rmv_existing()
+ else:
+ try:
+ self._createDir()
+ except SCons.Errors.StopError as drive:
+ raise SCons.Errors.StopError("No drive `{}' for target `{}'.".format(drive, self))
+
+ #
+ #
+ #
+
+ def remove(self):
+ """Remove this file."""
+ if self.exists() or self.islink():
+ self.fs.unlink(self.get_internal_path())
+ return 1
+ return None
+
+ def do_duplicate(self, src):
+ self._createDir()
+ if SCons.Node.print_duplicate:
+ print("dup: relinking variant '{}' from '{}'".format(self, src))
+ Unlink(self, None, None)
+ e = Link(self, src, None)
+ if isinstance(e, SCons.Errors.BuildError):
+ raise SCons.Errors.StopError("Cannot duplicate `{}' in `{}': {}.".format(src.get_internal_path(), self.dir._path, e.errstr))
+ self.linked = 1
+ # The Link() action may or may not have actually
+ # created the file, depending on whether the -n
+ # option was used or not. Delete the _exists and
+ # _rexists attributes so they can be reevaluated.
+ self.clear()
+
+ @SCons.Memoize.CountMethodCall
+ def exists(self):
+ try:
+ return self._memo['exists']
+ except KeyError:
+ pass
+ result = SCons.Node._exists_map[self._func_exists](self)
+ self._memo['exists'] = result
+ return result
+
+ #
+ # SIGNATURE SUBSYSTEM
+ #
+
+ def get_max_drift_csig(self):
+ """
+ Returns the content signature currently stored for this node
+ if it's been unmodified longer than the max_drift value, or the
+ max_drift value is 0. Returns None otherwise.
+ """
+ old = self.get_stored_info()
+ mtime = self.get_timestamp()
+
+ max_drift = self.fs.max_drift
+ if max_drift > 0:
+ if (time.time() - mtime) > max_drift:
+ try:
+ n = old.ninfo
+ if n.timestamp and n.csig and n.timestamp == mtime:
+ return n.csig
+ except AttributeError:
+ pass
+ elif max_drift == 0:
+ try:
+ return old.ninfo.csig
+ except AttributeError:
+ pass
+
+ return None
+
+ def get_csig(self):
+ """
+ Generate a node's content signature, the digested signature
+ of its content.
+
+ node - the node
+ cache - alternate node to use for the signature cache
+ returns - the content signature
+ """
+ ninfo = self.get_ninfo()
+ try:
+ return ninfo.csig
+ except AttributeError:
+ pass
+
+ csig = self.get_max_drift_csig()
+ if csig is None:
+
+ try:
+ if self.get_size() < SCons.Node.FS.File.md5_chunksize:
+ contents = self.get_contents()
+ else:
+ csig = self.get_content_hash()
+ except IOError:
+ # This can happen if there's actually a directory on-disk,
+ # which can be the case if they've disabled disk checks,
+ # or if an action with a File target actually happens to
+ # create a same-named directory by mistake.
+ csig = ''
+ else:
+ if not csig:
+ csig = SCons.Util.MD5signature(contents)
+
+ ninfo.csig = csig
+
+ return csig
+
+ #
+ # DECISION SUBSYSTEM
+ #
+
+ def builder_set(self, builder):
+ SCons.Node.Node.builder_set(self, builder)
+ self.changed_since_last_build = 5
+
+ def built(self):
+ """Called just after this File node is successfully built.
+
+ Just like for 'release_target_info' we try to release
+ some more target node attributes in order to minimize the
+ overall memory consumption.
+
+ @see: release_target_info
+ """
+
+ SCons.Node.Node.built(self)
+
+ if (not SCons.Node.interactive and
+ not hasattr(self.attributes, 'keep_targetinfo')):
+ # Ensure that the build infos get computed and cached...
+ SCons.Node.store_info_map[self.store_info](self)
+ # ... then release some more variables.
+ self._specific_sources = False
+ self._labspath = None
+ self._save_str()
+ self.cwd = None
+
+ self.scanner_paths = None
+
+ def changed(self, node=None, allowcache=False):
+ """
+ Returns if the node is up-to-date with respect to the BuildInfo
+ stored last time it was built.
+
+ For File nodes this is basically a wrapper around Node.changed(),
+ but we allow the return value to get cached after the reference
+ to the Executor got released in release_target_info().
+
+ @see: Node.changed()
+ """
+ if node is None:
+ try:
+ return self._memo['changed']
+ except KeyError:
+ pass
+
+ has_changed = SCons.Node.Node.changed(self, node)
+ if allowcache:
+ self._memo['changed'] = has_changed
+ return has_changed
+
+ def changed_content(self, target, prev_ni):
+ cur_csig = self.get_csig()
+ try:
+ return cur_csig != prev_ni.csig
+ except AttributeError:
+ return 1
+
+ def changed_state(self, target, prev_ni):
+ return self.state != SCons.Node.up_to_date
+
+ def changed_timestamp_then_content(self, target, prev_ni):
+ if not self.changed_timestamp_match(target, prev_ni):
+ try:
+ self.get_ninfo().csig = prev_ni.csig
+ except AttributeError:
+ pass
+ return False
+ return self.changed_content(target, prev_ni)
+
+ def changed_timestamp_newer(self, target, prev_ni):
+ try:
+ return self.get_timestamp() > target.get_timestamp()
+ except AttributeError:
+ return 1
+
+ def changed_timestamp_match(self, target, prev_ni):
+ try:
+ return self.get_timestamp() != prev_ni.timestamp
+ except AttributeError:
+ return 1
+
+ def is_up_to_date(self):
+ T = 0
+ if T: Trace('is_up_to_date(%s):' % self)
+ if not self.exists():
+ if T: Trace(' not self.exists():')
+ # The file doesn't exist locally...
+ r = self.rfile()
+ if r != self:
+ # ...but there is one in a Repository...
+ if not self.changed(r):
+ if T: Trace(' changed(%s):' % r)
+ # ...and it's even up-to-date...
+ if self._local:
+ # ...and they'd like a local copy.
+ e = LocalCopy(self, r, None)
+ if isinstance(e, SCons.Errors.BuildError):
+ raise
+ SCons.Node.store_info_map[self.store_info](self)
+ if T: Trace(' 1\n')
+ return 1
+ self.changed()
+ if T: Trace(' None\n')
+ return None
+ else:
+ r = self.changed()
+ if T: Trace(' self.exists(): %s\n' % r)
+ return not r
+
+ @SCons.Memoize.CountMethodCall
+ def rfile(self):
+ try:
+ return self._memo['rfile']
+ except KeyError:
+ pass
+ result = self
+ if not self.exists():
+ norm_name = _my_normcase(self.name)
+ for dir in self.dir.get_all_rdirs():
+ try: node = dir.entries[norm_name]
+ except KeyError: node = dir.file_on_disk(self.name)
+ if node and node.exists() and \
+ (isinstance(node, File) or isinstance(node, Entry) \
+ or not node.is_derived()):
+ result = node
+ # Copy over our local attributes to the repository
+ # Node so we identify shared object files in the
+ # repository and don't assume they're static.
+ #
+ # This isn't perfect; the attribute would ideally
+ # be attached to the object in the repository in
+ # case it was built statically in the repository
+ # and we changed it to shared locally, but that's
+ # rarely the case and would only occur if you
+ # intentionally used the same suffix for both
+ # shared and static objects anyway. So this
+ # should work well in practice.
+ result.attributes = self.attributes
+ break
+ self._memo['rfile'] = result
+ return result
+
+ def rstr(self):
+ return str(self.rfile())
+
+ def get_cachedir_csig(self):
+ """
+ Fetch a Node's content signature for purposes of computing
+ another Node's cachesig.
+
+ This is a wrapper around the normal get_csig() method that handles
+ the somewhat obscure case of using CacheDir with the -n option.
+ Any files that don't exist would normally be "built" by fetching
+ them from the cache, but the normal get_csig() method will try
+ to open up the local file, which doesn't exist because the -n
+ option meant we didn't actually pull the file from cachedir.
+ But since the file *does* actually exist in the cachedir, we
+ can use its contents for the csig.
+ """
+ try:
+ return self.cachedir_csig
+ except AttributeError:
+ pass
+
+ cachedir, cachefile = self.get_build_env().get_CacheDir().cachepath(self)
+ if not self.exists() and cachefile and os.path.exists(cachefile):
+ self.cachedir_csig = SCons.Util.MD5filesignature(cachefile, \
+ SCons.Node.FS.File.md5_chunksize * 1024)
+ else:
+ self.cachedir_csig = self.get_csig()
+ return self.cachedir_csig
+
+ def get_contents_sig(self):
+ """
+ A helper method for get_cachedir_bsig.
+
+ It computes and returns the signature for this
+ node's contents.
+ """
+
+ try:
+ return self.contentsig
+ except AttributeError:
+ pass
+
+ executor = self.get_executor()
+
+ result = self.contentsig = SCons.Util.MD5signature(executor.get_contents())
+ return result
+
+ def get_cachedir_bsig(self):
+ """
+ Return the signature for a cached file, including
+ its children.
+
+ It adds the path of the cached file to the cache signature,
+ because multiple targets built by the same action will all
+ have the same build signature, and we have to differentiate
+ them somehow.
+ """
+ try:
+ return self.cachesig
+ except AttributeError:
+ pass
+
+ # Collect signatures for all children
+ children = self.children()
+ sigs = [n.get_cachedir_csig() for n in children]
+ # Append this node's signature...
+ sigs.append(self.get_contents_sig())
+ # ...and it's path
+ sigs.append(self.get_internal_path())
+ # Merge this all into a single signature
+ result = self.cachesig = SCons.Util.MD5collect(sigs)
+ return result
+
+default_fs = None
+
+def get_default_fs():
+ global default_fs
+ if not default_fs:
+ default_fs = FS()
+ return default_fs
+
+class FileFinder(object):
+ """
+ """
+
+ def __init__(self):
+ self._memo = {}
+
+ def filedir_lookup(self, p, fd=None):
+ """
+ A helper method for find_file() that looks up a directory for
+ a file we're trying to find. This only creates the Dir Node if
+ it exists on-disk, since if the directory doesn't exist we know
+ we won't find any files in it... :-)
+
+ It would be more compact to just use this as a nested function
+ with a default keyword argument (see the commented-out version
+ below), but that doesn't work unless you have nested scopes,
+ so we define it here just so this work under Python 1.5.2.
+ """
+ if fd is None:
+ fd = self.default_filedir
+ dir, name = os.path.split(fd)
+ drive, d = _my_splitdrive(dir)
+ if not name and d[:1] in ('/', OS_SEP):
+ #return p.fs.get_root(drive).dir_on_disk(name)
+ return p.fs.get_root(drive)
+ if dir:
+ p = self.filedir_lookup(p, dir)
+ if not p:
+ return None
+ norm_name = _my_normcase(name)
+ try:
+ node = p.entries[norm_name]
+ except KeyError:
+ return p.dir_on_disk(name)
+ if isinstance(node, Dir):
+ return node
+ if isinstance(node, Entry):
+ node.must_be_same(Dir)
+ return node
+ return None
+
+ def _find_file_key(self, filename, paths, verbose=None):
+ return (filename, paths)
+
+ @SCons.Memoize.CountDictCall(_find_file_key)
+ def find_file(self, filename, paths, verbose=None):
+ """
+ Find a node corresponding to either a derived file or a file that exists already.
+
+ Only the first file found is returned, and none is returned if no file is found.
+
+ filename: A filename to find
+ paths: A list of directory path *nodes* to search in. Can be represented as a list, a tuple, or a callable that is called with no arguments and returns the list or tuple.
+
+ returns The node created from the found file.
+
+ """
+ memo_key = self._find_file_key(filename, paths)
+ try:
+ memo_dict = self._memo['find_file']
+ except KeyError:
+ memo_dict = {}
+ self._memo['find_file'] = memo_dict
+ else:
+ try:
+ return memo_dict[memo_key]
+ except KeyError:
+ pass
+
+ if verbose and not callable(verbose):
+ if not SCons.Util.is_String(verbose):
+ verbose = "find_file"
+ _verbose = u' %s: ' % verbose
+ verbose = lambda s: sys.stdout.write(_verbose + s)
+
+ filedir, filename = os.path.split(filename)
+ if filedir:
+ self.default_filedir = filedir
+ paths = [_f for _f in map(self.filedir_lookup, paths) if _f]
+
+ result = None
+ for dir in paths:
+ if verbose:
+ verbose("looking for '%s' in '%s' ...\n" % (filename, dir))
+ node, d = dir.srcdir_find_file(filename)
+ if node:
+ if verbose:
+ verbose("... FOUND '%s' in '%s'\n" % (filename, d))
+ result = node
+ break
+
+ memo_dict[memo_key] = result
+
+ return result
+
+find_file = FileFinder().find_file
+
+
+def invalidate_node_memos(targets):
+ """
+ Invalidate the memoized values of all Nodes (files or directories)
+ that are associated with the given entries. Has been added to
+ clear the cache of nodes affected by a direct execution of an
+ action (e.g. Delete/Copy/Chmod). Existing Node caches become
+ inconsistent if the action is run through Execute(). The argument
+ `targets` can be a single Node object or filename, or a sequence
+ of Nodes/filenames.
+ """
+ from traceback import extract_stack
+
+ # First check if the cache really needs to be flushed. Only
+ # actions run in the SConscript with Execute() seem to be
+ # affected. XXX The way to check if Execute() is in the stacktrace
+ # is a very dirty hack and should be replaced by a more sensible
+ # solution.
+ for f in extract_stack():
+ if f[2] == 'Execute' and f[0][-14:] == 'Environment.py':
+ break
+ else:
+ # Dont have to invalidate, so return
+ return
+
+ if not SCons.Util.is_List(targets):
+ targets = [targets]
+
+ for entry in targets:
+ # If the target is a Node object, clear the cache. If it is a
+ # filename, look up potentially existing Node object first.
+ try:
+ entry.clear_memoized_values()
+ except AttributeError:
+ # Not a Node object, try to look up Node by filename. XXX
+ # This creates Node objects even for those filenames which
+ # do not correspond to an existing Node object.
+ node = get_default_fs().Entry(entry)
+ if node:
+ node.clear_memoized_values()
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Node/FSTests.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Node/FSTests.py
new file mode 100644
index 0000000..273f809
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Node/FSTests.py
@@ -0,0 +1,3787 @@
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+from __future__ import division, print_function
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import SCons.compat
+
+import os
+import os.path
+import sys
+import time
+import unittest
+import shutil
+import stat
+
+from TestCmd import TestCmd
+import TestUnit
+
+import SCons.Errors
+import SCons.Node.FS
+import SCons.Util
+import SCons.Warnings
+
+built_it = None
+
+scanner_count = 0
+
+class Scanner(object):
+ def __init__(self, node=None):
+ global scanner_count
+ scanner_count = scanner_count + 1
+ self.hash = scanner_count
+ self.node = node
+ def path(self, env, dir, target=None, source=None):
+ return ()
+ def __call__(self, node, env, path):
+ return [self.node]
+ def __hash__(self):
+ return self.hash
+ def select(self, node):
+ return self
+ def recurse_nodes(self, nodes):
+ return nodes
+
+class Environment(object):
+ def __init__(self):
+ self.scanner = Scanner()
+ def Dictionary(self, *args):
+ return {}
+ def autogenerate(self, **kw):
+ return {}
+ def get_scanner(self, skey):
+ return self.scanner
+ def Override(self, overrides):
+ return self
+ def _update(self, dict):
+ pass
+
+class Action(object):
+ def __call__(self, targets, sources, env, **kw):
+ global built_it
+ if kw.get('execute', 1):
+ built_it = 1
+ return 0
+ def show(self, string):
+ pass
+ def get_contents(self, target, source, env):
+ return bytearray("",'utf-8')
+ def genstring(self, target, source, env):
+ return ""
+ def strfunction(self, targets, sources, env):
+ return ""
+ def get_implicit_deps(self, target, source, env):
+ return []
+
+class Builder(object):
+ def __init__(self, factory, action=Action()):
+ self.factory = factory
+ self.env = Environment()
+ self.overrides = {}
+ self.action = action
+ self.target_scanner = None
+ self.source_scanner = None
+
+ def targets(self, t):
+ return [t]
+
+ def source_factory(self, name):
+ return self.factory(name)
+
+class _tempdirTestCase(unittest.TestCase):
+ def setUp(self):
+ self.save_cwd = os.getcwd()
+ self.test = TestCmd(workdir='')
+ # FS doesn't like the cwd to be something other than its root.
+ os.chdir(self.test.workpath(""))
+ self.fs = SCons.Node.FS.FS()
+
+ def tearDown(self):
+ os.chdir(self.save_cwd)
+
+class VariantDirTestCase(unittest.TestCase):
+ def runTest(self):
+ """Test variant dir functionality"""
+ test=TestCmd(workdir='')
+
+ fs = SCons.Node.FS.FS()
+ f1 = fs.File('build/test1')
+ fs.VariantDir('build', 'src')
+ f2 = fs.File('build/test2')
+ d1 = fs.Dir('build')
+ assert f1.srcnode().get_internal_path() == os.path.normpath('src/test1'), f1.srcnode().get_internal_path()
+ assert f2.srcnode().get_internal_path() == os.path.normpath('src/test2'), f2.srcnode().get_internal_path()
+ assert d1.srcnode().get_internal_path() == 'src', d1.srcnode().get_internal_path()
+
+ fs = SCons.Node.FS.FS()
+ f1 = fs.File('build/test1')
+ fs.VariantDir('build', '.')
+ f2 = fs.File('build/test2')
+ d1 = fs.Dir('build')
+ assert f1.srcnode().get_internal_path() == 'test1', f1.srcnode().get_internal_path()
+ assert f2.srcnode().get_internal_path() == 'test2', f2.srcnode().get_internal_path()
+ assert d1.srcnode().get_internal_path() == '.', d1.srcnode().get_internal_path()
+
+ fs = SCons.Node.FS.FS()
+ fs.VariantDir('build/var1', 'src')
+ fs.VariantDir('build/var2', 'src')
+ f1 = fs.File('build/var1/test1')
+ f2 = fs.File('build/var2/test1')
+ assert f1.srcnode().get_internal_path() == os.path.normpath('src/test1'), f1.srcnode().get_internal_path()
+ assert f2.srcnode().get_internal_path() == os.path.normpath('src/test1'), f2.srcnode().get_internal_path()
+
+ fs = SCons.Node.FS.FS()
+ fs.VariantDir('../var1', 'src')
+ fs.VariantDir('../var2', 'src')
+ f1 = fs.File('../var1/test1')
+ f2 = fs.File('../var2/test1')
+ assert f1.srcnode().get_internal_path() == os.path.normpath('src/test1'), f1.srcnode().get_internal_path()
+ assert f2.srcnode().get_internal_path() == os.path.normpath('src/test1'), f2.srcnode().get_internal_path()
+
+ # Set up some files
+ test.subdir('work', ['work', 'src'])
+ test.subdir(['work', 'build'], ['work', 'build', 'var1'])
+ test.subdir(['work', 'build', 'var2'])
+ test.subdir('rep1', ['rep1', 'src'])
+ test.subdir(['rep1', 'build'], ['rep1', 'build', 'var1'])
+ test.subdir(['rep1', 'build', 'var2'])
+
+ # A source file in the source directory
+ test.write([ 'work', 'src', 'test.in' ], 'test.in')
+
+ # A source file in a subdir of the source directory
+ test.subdir([ 'work', 'src', 'new_dir' ])
+ test.write([ 'work', 'src', 'new_dir', 'test9.out' ], 'test9.out\n')
+
+ # A source file in the repository
+ test.write([ 'rep1', 'src', 'test2.in' ], 'test2.in')
+
+ # Some source files in the variant directory
+ test.write([ 'work', 'build', 'var2', 'test.in' ], 'test.old')
+ test.write([ 'work', 'build', 'var2', 'test2.in' ], 'test2.old')
+
+ # An old derived file in the variant directories
+ test.write([ 'work', 'build', 'var1', 'test.out' ], 'test.old')
+ test.write([ 'work', 'build', 'var2', 'test.out' ], 'test.old')
+
+ # And just in case we are weird, a derived file in the source
+ # dir.
+ test.write([ 'work', 'src', 'test.out' ], 'test.out.src')
+
+ # A derived file in the repository
+ test.write([ 'rep1', 'build', 'var1', 'test2.out' ], 'test2.out_rep')
+ test.write([ 'rep1', 'build', 'var2', 'test2.out' ], 'test2.out_rep')
+
+ os.chdir(test.workpath('work'))
+
+ fs = SCons.Node.FS.FS(test.workpath('work'))
+ fs.VariantDir('build/var1', 'src', duplicate=0)
+ fs.VariantDir('build/var2', 'src')
+ f1 = fs.File('build/var1/test.in')
+ f1out = fs.File('build/var1/test.out')
+ f1out.builder = 1
+ f1out_2 = fs.File('build/var1/test2.out')
+ f1out_2.builder = 1
+ f2 = fs.File('build/var2/test.in')
+ f2out = fs.File('build/var2/test.out')
+ f2out.builder = 1
+ f2out_2 = fs.File('build/var2/test2.out')
+ f2out_2.builder = 1
+ fs.Repository(test.workpath('rep1'))
+
+ assert f1.srcnode().get_internal_path() == os.path.normpath('src/test.in'),\
+ f1.srcnode().get_internal_path()
+ # str(node) returns source path for duplicate = 0
+ assert str(f1) == os.path.normpath('src/test.in'), str(f1)
+ # Build path does not exist
+ assert not f1.exists()
+ # ...but the actual file is not there...
+ assert not os.path.exists(f1.get_abspath())
+ # And duplicate=0 should also work just like a Repository
+ assert f1.rexists()
+ # rfile() should point to the source path
+ assert f1.rfile().get_internal_path() == os.path.normpath('src/test.in'),\
+ f1.rfile().get_internal_path()
+
+ assert f2.srcnode().get_internal_path() == os.path.normpath('src/test.in'),\
+ f2.srcnode().get_internal_path()
+ # str(node) returns build path for duplicate = 1
+ assert str(f2) == os.path.normpath('build/var2/test.in'), str(f2)
+ # Build path exists
+ assert f2.exists()
+ # ...and exists() should copy the file from src to build path
+ assert test.read(['work', 'build', 'var2', 'test.in']) == bytearray('test.in','utf-8'),\
+ test.read(['work', 'build', 'var2', 'test.in'])
+ # Since exists() is true, so should rexists() be
+ assert f2.rexists()
+
+ f3 = fs.File('build/var1/test2.in')
+ f4 = fs.File('build/var2/test2.in')
+
+ assert f3.srcnode().get_internal_path() == os.path.normpath('src/test2.in'),\
+ f3.srcnode().get_internal_path()
+ # str(node) returns source path for duplicate = 0
+ assert str(f3) == os.path.normpath('src/test2.in'), str(f3)
+ # Build path does not exist
+ assert not f3.exists()
+ # Source path does not either
+ assert not f3.srcnode().exists()
+ # But we do have a file in the Repository
+ assert f3.rexists()
+ # rfile() should point to the source path
+ assert f3.rfile().get_internal_path() == os.path.normpath(test.workpath('rep1/src/test2.in')),\
+ f3.rfile().get_internal_path()
+
+ assert f4.srcnode().get_internal_path() == os.path.normpath('src/test2.in'),\
+ f4.srcnode().get_internal_path()
+ # str(node) returns build path for duplicate = 1
+ assert str(f4) == os.path.normpath('build/var2/test2.in'), str(f4)
+ # Build path should exist
+ assert f4.exists()
+ # ...and copy over the file into the local build path
+ assert test.read(['work', 'build', 'var2', 'test2.in']) == bytearray('test2.in','utf-8')
+ # should exist in repository, since exists() is true
+ assert f4.rexists()
+ # rfile() should point to ourselves
+ assert f4.rfile().get_internal_path() == os.path.normpath('build/var2/test2.in'),\
+ f4.rfile().get_internal_path()
+
+ f5 = fs.File('build/var1/test.out')
+ f6 = fs.File('build/var2/test.out')
+
+ assert f5.exists()
+ # We should not copy the file from the source dir, since this is
+ # a derived file.
+ assert test.read(['work', 'build', 'var1', 'test.out']) == bytearray('test.old','utf-8')
+
+ assert f6.exists()
+ # We should not copy the file from the source dir, since this is
+ # a derived file.
+ assert test.read(['work', 'build', 'var2', 'test.out']) == bytearray('test.old','utf-8')
+
+ f7 = fs.File('build/var1/test2.out')
+ f8 = fs.File('build/var2/test2.out')
+
+ assert not f7.exists()
+ assert f7.rexists()
+ r = f7.rfile().get_internal_path()
+ expect = os.path.normpath(test.workpath('rep1/build/var1/test2.out'))
+ assert r == expect, (repr(r), repr(expect))
+
+ assert not f8.exists()
+ assert f8.rexists()
+ assert f8.rfile().get_internal_path() == os.path.normpath(test.workpath('rep1/build/var2/test2.out')),\
+ f8.rfile().get_internal_path()
+
+ # Verify the Mkdir and Link actions are called
+ d9 = fs.Dir('build/var2/new_dir')
+ f9 = fs.File('build/var2/new_dir/test9.out')
+
+ class MkdirAction(Action):
+ def __init__(self, dir_made):
+ self.dir_made = dir_made
+ def __call__(self, target, source, env, executor=None):
+ if executor:
+ target = executor.get_all_targets()
+ source = executor.get_all_sources()
+ self.dir_made.extend(target)
+
+ save_Link = SCons.Node.FS.Link
+ link_made = []
+ def link_func(target, source, env, link_made=link_made):
+ link_made.append(target)
+ SCons.Node.FS.Link = link_func
+
+ try:
+ dir_made = []
+ d9.builder = Builder(fs.Dir, action=MkdirAction(dir_made))
+ d9.reset_executor()
+ f9.exists()
+ expect = os.path.join('build', 'var2', 'new_dir')
+ assert dir_made[0].get_internal_path() == expect, dir_made[0].get_internal_path()
+ expect = os.path.join('build', 'var2', 'new_dir', 'test9.out')
+ assert link_made[0].get_internal_path() == expect, link_made[0].get_internal_path()
+ assert f9.linked
+ finally:
+ SCons.Node.FS.Link = save_Link
+
+ # Test for an interesting pathological case...we have a source
+ # file in a build path, but not in a source path. This can
+ # happen if you switch from duplicate=1 to duplicate=0, then
+ # delete a source file. At one time, this would cause exists()
+ # to return a 1 but get_contents() to throw.
+ test.write([ 'work', 'build', 'var1', 'asourcefile' ], 'stuff')
+ f10 = fs.File('build/var1/asourcefile')
+ assert f10.exists()
+ assert f10.get_contents() == bytearray('stuff','utf-8'), f10.get_contents()
+
+ f11 = fs.File('src/file11')
+ t, m = f11.alter_targets()
+ bdt = [n.get_internal_path() for n in t]
+ var1_file11 = os.path.normpath('build/var1/file11')
+ var2_file11 = os.path.normpath('build/var2/file11')
+ assert bdt == [var1_file11, var2_file11], bdt
+
+ f12 = fs.File('src/file12')
+ f12.builder = 1
+ bdt, m = f12.alter_targets()
+ assert bdt == [], [n.get_internal_path() for n in bdt]
+
+ d13 = fs.Dir('src/new_dir')
+ t, m = d13.alter_targets()
+ bdt = [n.get_internal_path() for n in t]
+ var1_new_dir = os.path.normpath('build/var1/new_dir')
+ var2_new_dir = os.path.normpath('build/var2/new_dir')
+ assert bdt == [var1_new_dir, var2_new_dir], bdt
+
+ # Test that an IOError trying to Link a src file
+ # into a VariantDir ends up throwing a StopError.
+ fIO = fs.File("build/var2/IOError")
+
+ save_Link = SCons.Node.FS.Link
+ def Link_IOError(target, source, env):
+ raise IOError(17, "Link_IOError")
+ SCons.Node.FS.Link = SCons.Action.Action(Link_IOError, None)
+
+ test.write(['work', 'src', 'IOError'], "work/src/IOError\n")
+
+ try:
+ exc_caught = 0
+ try:
+ fIO.exists()
+ except SCons.Errors.StopError:
+ exc_caught = 1
+ assert exc_caught, "Should have caught a StopError"
+
+ finally:
+ SCons.Node.FS.Link = save_Link
+
+ # Test to see if Link() works...
+ test.subdir('src','build')
+ test.write('src/foo', 'src/foo\n')
+ os.chmod(test.workpath('src/foo'), stat.S_IRUSR)
+ SCons.Node.FS.Link(fs.File(test.workpath('build/foo')),
+ fs.File(test.workpath('src/foo')),
+ None)
+ os.chmod(test.workpath('src/foo'), stat.S_IRUSR | stat.S_IWRITE)
+ st=os.stat(test.workpath('build/foo'))
+ assert (stat.S_IMODE(st[stat.ST_MODE]) & stat.S_IWRITE), \
+ stat.S_IMODE(st[stat.ST_MODE])
+
+ # This used to generate a UserError when we forbid the source
+ # directory from being outside the top-level SConstruct dir.
+ fs = SCons.Node.FS.FS()
+ fs.VariantDir('build', '/test/foo')
+
+ exc_caught = 0
+ try:
+ try:
+ fs = SCons.Node.FS.FS()
+ fs.VariantDir('build', 'build/src')
+ except SCons.Errors.UserError:
+ exc_caught = 1
+ assert exc_caught, "Should have caught a UserError."
+ finally:
+ test.unlink( "src/foo" )
+ test.unlink( "build/foo" )
+
+ fs = SCons.Node.FS.FS()
+ fs.VariantDir('build', 'src1')
+
+ # Calling the same VariantDir twice should work fine.
+ fs.VariantDir('build', 'src1')
+
+ # Trying to move a variant dir to a second source dir
+ # should blow up
+ try:
+ fs.VariantDir('build', 'src2')
+ except SCons.Errors.UserError:
+ pass
+ else:
+ assert 0, "Should have caught a UserError."
+
+ # Test against a former bug. Make sure we can get a repository
+ # path for the variant directory itself!
+ fs=SCons.Node.FS.FS(test.workpath('work'))
+ test.subdir('work')
+ fs.VariantDir('build/var3', 'src', duplicate=0)
+ d1 = fs.Dir('build/var3')
+ r = d1.rdir()
+ assert r == d1, "%s != %s" % (r, d1)
+
+ # verify the link creation attempts in file_link()
+ class LinkSimulator (object):
+ """A class to intercept os.[sym]link() calls and track them."""
+
+ def __init__( self, duplicate, link, symlink, copy ) :
+ self.duplicate = duplicate
+ self.have = {}
+ self.have['hard'] = link
+ self.have['soft'] = symlink
+ self.have['copy'] = copy
+
+ self.links_to_be_called = []
+ for link in self.duplicate.split('-'):
+ if self.have[link]:
+ self.links_to_be_called.append(link)
+
+ def link_fail( self , src , dest ) :
+ next_link = self.links_to_be_called.pop(0)
+ assert next_link == "hard", \
+ "Wrong link order: expected %s to be called "\
+ "instead of hard" % next_link
+ raise OSError( "Simulating hard link creation error." )
+
+ def symlink_fail( self , src , dest ) :
+ next_link = self.links_to_be_called.pop(0)
+ assert next_link == "soft", \
+ "Wrong link order: expected %s to be called "\
+ "instead of soft" % next_link
+ raise OSError( "Simulating symlink creation error." )
+
+ def copy( self , src , dest ) :
+ next_link = self.links_to_be_called.pop(0)
+ assert next_link == "copy", \
+ "Wrong link order: expected %s to be called "\
+ "instead of copy" % next_link
+ # copy succeeds, but use the real copy
+ self.have['copy'](src, dest)
+ # end class LinkSimulator
+
+ try:
+ SCons.Node.FS.set_duplicate("no-link-order")
+ assert 0, "Expected exception when passing an invalid duplicate to set_duplicate"
+ except SCons.Errors.InternalError:
+ pass
+
+ for duplicate in SCons.Node.FS.Valid_Duplicates:
+ # save the real functions for later restoration
+ try:
+ real_link = os.link
+ except AttributeError:
+ real_link = None
+ try:
+ real_symlink = os.symlink
+ except AttributeError:
+ real_symlink = None
+
+ # Disable symlink and link for now in win32.
+ # We don't have a consistant plan to make these work as yet
+ # They are only supported with PY3
+ if sys.platform == 'win32':
+ real_symlink = None
+ real_link = None
+
+ real_copy = shutil.copy2
+
+ simulator = LinkSimulator(duplicate, real_link, real_symlink, real_copy)
+
+ # override the real functions with our simulation
+ os.link = simulator.link_fail
+ os.symlink = simulator.symlink_fail
+ shutil.copy2 = simulator.copy
+
+ try:
+
+ SCons.Node.FS.set_duplicate(duplicate)
+
+ src_foo = test.workpath('src', 'foo')
+ build_foo = test.workpath('build', 'foo')
+
+ test.write(src_foo, 'src/foo\n')
+ os.chmod(src_foo, stat.S_IRUSR)
+ try:
+ SCons.Node.FS.Link(fs.File(build_foo),
+ fs.File(src_foo),
+ None)
+ finally:
+ os.chmod(src_foo, stat.S_IRUSR | stat.S_IWRITE)
+ test.unlink(src_foo)
+ test.unlink(build_foo)
+
+ finally:
+ # restore the real functions
+ if real_link:
+ os.link = real_link
+ else:
+ delattr(os, 'link')
+ if real_symlink:
+ os.symlink = real_symlink
+ else:
+ delattr(os, 'symlink')
+ shutil.copy2 = real_copy
+
+ # Test VariantDir "reflection," where a same-named subdirectory
+ # exists underneath a variant_dir.
+ fs = SCons.Node.FS.FS()
+ fs.VariantDir('work/src/b1/b2', 'work/src')
+
+ dir_list = [
+ 'work/src',
+ 'work/src/b1',
+ 'work/src/b1/b2',
+ 'work/src/b1/b2/b1',
+ 'work/src/b1/b2/b1/b2',
+ 'work/src/b1/b2/b1/b2/b1',
+ 'work/src/b1/b2/b1/b2/b1/b2',
+ ]
+
+ srcnode_map = {
+ 'work/src/b1/b2' : 'work/src',
+ 'work/src/b1/b2/f' : 'work/src/f',
+ 'work/src/b1/b2/b1' : 'work/src/b1/',
+ 'work/src/b1/b2/b1/f' : 'work/src/b1/f',
+ 'work/src/b1/b2/b1/b2' : 'work/src/b1/b2',
+ 'work/src/b1/b2/b1/b2/f' : 'work/src/b1/b2/f',
+ 'work/src/b1/b2/b1/b2/b1' : 'work/src/b1/b2/b1',
+ 'work/src/b1/b2/b1/b2/b1/f' : 'work/src/b1/b2/b1/f',
+ 'work/src/b1/b2/b1/b2/b1/b2' : 'work/src/b1/b2/b1/b2',
+ 'work/src/b1/b2/b1/b2/b1/b2/f' : 'work/src/b1/b2/b1/b2/f',
+ }
+
+ alter_map = {
+ 'work/src' : 'work/src/b1/b2',
+ 'work/src/f' : 'work/src/b1/b2/f',
+ 'work/src/b1' : 'work/src/b1/b2/b1',
+ 'work/src/b1/f' : 'work/src/b1/b2/b1/f',
+ }
+
+ errors = 0
+
+ for dir in dir_list:
+ dnode = fs.Dir(dir)
+ f = dir + '/f'
+ fnode = fs.File(dir + '/f')
+
+ dp = dnode.srcnode().get_internal_path()
+ expect = os.path.normpath(srcnode_map.get(dir, dir))
+ if dp != expect:
+ print("Dir `%s' srcnode() `%s' != expected `%s'" % (dir, dp, expect))
+ errors = errors + 1
+
+ fp = fnode.srcnode().get_internal_path()
+ expect = os.path.normpath(srcnode_map.get(f, f))
+ if fp != expect:
+ print("File `%s' srcnode() `%s' != expected `%s'" % (f, fp, expect))
+ errors = errors + 1
+
+ for dir in dir_list:
+ dnode = fs.Dir(dir)
+ f = dir + '/f'
+ fnode = fs.File(dir + '/f')
+
+ t, m = dnode.alter_targets()
+ tp = t[0].get_internal_path()
+ expect = os.path.normpath(alter_map.get(dir, dir))
+ if tp != expect:
+ print("Dir `%s' alter_targets() `%s' != expected `%s'" % (dir, tp, expect))
+ errors = errors + 1
+
+ t, m = fnode.alter_targets()
+ tp = t[0].get_internal_path()
+ expect = os.path.normpath(alter_map.get(f, f))
+ if tp != expect:
+ print("File `%s' alter_targets() `%s' != expected `%s'" % (f, tp, expect))
+ errors = errors + 1
+
+ self.failIf(errors)
+
+class BaseTestCase(_tempdirTestCase):
+ def test_stat(self):
+ """Test the Base.stat() method"""
+ test = self.test
+ test.write("e1", "e1\n")
+ fs = SCons.Node.FS.FS()
+
+ e1 = fs.Entry('e1')
+ s = e1.stat()
+ assert s is not None, s
+
+ e2 = fs.Entry('e2')
+ s = e2.stat()
+ assert s is None, s
+
+ def test_getmtime(self):
+ """Test the Base.getmtime() method"""
+ test = self.test
+ test.write("file", "file\n")
+ fs = SCons.Node.FS.FS()
+
+ file = fs.Entry('file')
+ assert file.getmtime()
+
+ file = fs.Entry('nonexistent')
+ mtime = file.getmtime()
+ assert mtime is None, mtime
+
+ def test_getsize(self):
+ """Test the Base.getsize() method"""
+ test = self.test
+ test.write("file", "file\n")
+ fs = SCons.Node.FS.FS()
+
+ file = fs.Entry('file')
+ size = file.getsize()
+ assert size == 5, size
+
+ file = fs.Entry('nonexistent')
+ size = file.getsize()
+ assert size is None, size
+
+ def test_isdir(self):
+ """Test the Base.isdir() method"""
+ test = self.test
+ test.subdir('dir')
+ test.write("file", "file\n")
+ fs = SCons.Node.FS.FS()
+
+ dir = fs.Entry('dir')
+ assert dir.isdir()
+
+ file = fs.Entry('file')
+ assert not file.isdir()
+
+ nonexistent = fs.Entry('nonexistent')
+ assert not nonexistent.isdir()
+
+ def test_isfile(self):
+ """Test the Base.isfile() method"""
+ test = self.test
+ test.subdir('dir')
+ test.write("file", "file\n")
+ fs = SCons.Node.FS.FS()
+
+ dir = fs.Entry('dir')
+ assert not dir.isfile()
+
+ file = fs.Entry('file')
+ assert file.isfile()
+
+ nonexistent = fs.Entry('nonexistent')
+ assert not nonexistent.isfile()
+
+ if sys.platform != 'win32' and hasattr(os, 'symlink'):
+ def test_islink(self):
+ """Test the Base.islink() method"""
+ test = self.test
+ test.subdir('dir')
+ test.write("file", "file\n")
+ test.symlink("symlink", "symlink")
+ fs = SCons.Node.FS.FS()
+
+ dir = fs.Entry('dir')
+ assert not dir.islink()
+
+ file = fs.Entry('file')
+ assert not file.islink()
+
+ symlink = fs.Entry('symlink')
+ assert symlink.islink()
+
+ nonexistent = fs.Entry('nonexistent')
+ assert not nonexistent.islink()
+
+class DirNodeInfoTestCase(_tempdirTestCase):
+ def test___init__(self):
+ """Test DirNodeInfo initialization"""
+ ddd = self.fs.Dir('ddd')
+ ni = SCons.Node.FS.DirNodeInfo()
+
+class DirBuildInfoTestCase(_tempdirTestCase):
+ def test___init__(self):
+ """Test DirBuildInfo initialization"""
+ ddd = self.fs.Dir('ddd')
+ bi = SCons.Node.FS.DirBuildInfo()
+
+class FileNodeInfoTestCase(_tempdirTestCase):
+ def test___init__(self):
+ """Test FileNodeInfo initialization"""
+ fff = self.fs.File('fff')
+ ni = SCons.Node.FS.FileNodeInfo()
+ assert isinstance(ni, SCons.Node.FS.FileNodeInfo)
+
+ def test_update(self):
+ """Test updating a File.NodeInfo with on-disk information"""
+ test = self.test
+ fff = self.fs.File('fff')
+
+ ni = SCons.Node.FS.FileNodeInfo()
+
+ test.write('fff', "fff\n")
+
+ st = os.stat('fff')
+
+ ni.update(fff)
+
+ assert hasattr(ni, 'timestamp')
+ assert hasattr(ni, 'size')
+
+ ni.timestamp = 0
+ ni.size = 0
+
+ ni.update(fff)
+
+ mtime = st[stat.ST_MTIME]
+ assert ni.timestamp == mtime, (ni.timestamp, mtime)
+ size = st[stat.ST_SIZE]
+ assert ni.size == size, (ni.size, size)
+
+ import time
+ time.sleep(2)
+
+ test.write('fff', "fff longer size, different time stamp\n")
+
+ st = os.stat('fff')
+
+ mtime = st[stat.ST_MTIME]
+ assert ni.timestamp != mtime, (ni.timestamp, mtime)
+ size = st[stat.ST_SIZE]
+ assert ni.size != size, (ni.size, size)
+
+class FileBuildInfoTestCase(_tempdirTestCase):
+ def test___init__(self):
+ """Test File.BuildInfo initialization"""
+ fff = self.fs.File('fff')
+ bi = SCons.Node.FS.FileBuildInfo()
+ assert bi, bi
+
+ def test_convert_to_sconsign(self):
+ """Test converting to .sconsign file format"""
+ fff = self.fs.File('fff')
+ bi = SCons.Node.FS.FileBuildInfo()
+ assert hasattr(bi, 'convert_to_sconsign')
+
+ def test_convert_from_sconsign(self):
+ """Test converting from .sconsign file format"""
+ fff = self.fs.File('fff')
+ bi = SCons.Node.FS.FileBuildInfo()
+ assert hasattr(bi, 'convert_from_sconsign')
+
+ def test_prepare_dependencies(self):
+ """Test that we have a prepare_dependencies() method"""
+ fff = self.fs.File('fff')
+ bi = SCons.Node.FS.FileBuildInfo()
+ bi.prepare_dependencies()
+
+ def test_format(self):
+ """Test the format() method"""
+ f1 = self.fs.File('f1')
+ bi1 = SCons.Node.FS.FileBuildInfo()
+
+ self.fs.File('n1')
+ self.fs.File('n2')
+ self.fs.File('n3')
+
+ s1sig = SCons.Node.FS.FileNodeInfo()
+ s1sig.csig = 1
+ d1sig = SCons.Node.FS.FileNodeInfo()
+ d1sig.timestamp = 2
+ i1sig = SCons.Node.FS.FileNodeInfo()
+ i1sig.size = 3
+
+ bi1.bsources = [self.fs.File('s1')]
+ bi1.bdepends = [self.fs.File('d1')]
+ bi1.bimplicit = [self.fs.File('i1')]
+ bi1.bsourcesigs = [s1sig]
+ bi1.bdependsigs = [d1sig]
+ bi1.bimplicitsigs = [i1sig]
+ bi1.bact = 'action'
+ bi1.bactsig = 'actionsig'
+
+ expect_lines = [
+ 's1: 1 None None',
+ 'd1: None 2 None',
+ 'i1: None None 3',
+ 'actionsig [action]',
+ ]
+
+ expect = '\n'.join(expect_lines)
+ format = bi1.format()
+ assert format == expect, (repr(expect), repr(format))
+
+class FSTestCase(_tempdirTestCase):
+ def test_needs_normpath(self):
+ """Test the needs_normpath Regular expression
+
+ This test case verifies that the regular expression used to
+ determine whether a path needs normalization works as
+ expected.
+ """
+ needs_normpath_match = SCons.Node.FS.needs_normpath_match
+
+ do_not_need_normpath = [
+ ".",
+ "/",
+ "/a",
+ "/aa",
+ "/a/",
+ "/aa/",
+ "/a/b",
+ "/aa/bb",
+ "/a/b/",
+ "/aa/bb/",
+
+ "",
+ "a",
+ "aa",
+ "a/",
+ "aa/",
+ "a/b",
+ "aa/bb",
+ "a/b/",
+ "aa/bb/",
+
+ "a.",
+ "a..",
+ "/a.",
+ "/a..",
+ "a./",
+ "a../",
+ "/a./",
+ "/a../",
+
+
+ ".a",
+ "..a",
+ "/.a",
+ "/..a",
+ ".a/",
+ "..a/",
+ "/.a/",
+ "/..a/",
+ ]
+ for p in do_not_need_normpath:
+ assert needs_normpath_match(p) is None, p
+
+ needs_normpath = [
+ "//",
+ "//a",
+ "//aa",
+ "//a/",
+ "//a/",
+ "/aa//",
+
+ "//a/b",
+ "//aa/bb",
+ "//a/b/",
+ "//aa/bb/",
+
+ "/a//b",
+ "/aa//bb",
+ "/a/b//",
+ "/aa/bb//",
+
+ "/a/b//",
+ "/aa/bb//",
+
+ "a//",
+ "aa//",
+ "a//b",
+ "aa//bb",
+ "a//b/",
+ "aa//bb/",
+ "a/b//",
+ "aa/bb//",
+
+ "..",
+ "/.",
+ "/..",
+ "./",
+ "../",
+ "/./",
+ "/../",
+
+ "a/.",
+ "a/..",
+ "./a",
+ "../a",
+ "a/./a",
+ "a/../a",
+ ]
+ for p in needs_normpath:
+ assert needs_normpath_match(p) is not None, p
+
+ def test_runTest(self):
+ """Test FS (file system) Node operations
+
+ This test case handles all of the file system node
+ tests in one environment, so we don't have to set up a
+ complicated directory structure for each test individually.
+ """
+ test = self.test
+
+ test.subdir('sub', ['sub', 'dir'])
+
+ wp = test.workpath('')
+ sub = test.workpath('sub', '')
+ sub_dir = test.workpath('sub', 'dir', '')
+ sub_dir_foo = test.workpath('sub', 'dir', 'foo', '')
+ sub_dir_foo_bar = test.workpath('sub', 'dir', 'foo', 'bar', '')
+ sub_foo = test.workpath('sub', 'foo', '')
+
+ os.chdir(sub_dir)
+
+ fs = SCons.Node.FS.FS()
+
+ e1 = fs.Entry('e1')
+ assert isinstance(e1, SCons.Node.FS.Entry)
+
+ d1 = fs.Dir('d1')
+ assert isinstance(d1, SCons.Node.FS.Dir)
+ assert d1.cwd is d1, d1
+
+ f1 = fs.File('f1', directory = d1)
+ assert isinstance(f1, SCons.Node.FS.File)
+
+ d1_f1 = os.path.join('d1', 'f1')
+ assert f1.get_internal_path() == d1_f1, "f1.path %s != %s" % (f1.get_internal_path(), d1_f1)
+ assert str(f1) == d1_f1, "str(f1) %s != %s" % (str(f1), d1_f1)
+
+ x1 = d1.File('x1')
+ assert isinstance(x1, SCons.Node.FS.File)
+ assert str(x1) == os.path.join('d1', 'x1')
+
+ x2 = d1.Dir('x2')
+ assert isinstance(x2, SCons.Node.FS.Dir)
+ assert str(x2) == os.path.join('d1', 'x2')
+
+ x3 = d1.Entry('x3')
+ assert isinstance(x3, SCons.Node.FS.Entry)
+ assert str(x3) == os.path.join('d1', 'x3')
+
+ assert d1.File(x1) == x1
+ assert d1.Dir(x2) == x2
+ assert d1.Entry(x3) == x3
+
+ x1.cwd = d1
+
+ x4 = x1.File('x4')
+ assert str(x4) == os.path.join('d1', 'x4')
+
+ x5 = x1.Dir('x5')
+ assert str(x5) == os.path.join('d1', 'x5')
+
+ x6 = x1.Entry('x6')
+ assert str(x6) == os.path.join('d1', 'x6')
+ x7 = x1.Entry('x7')
+ assert str(x7) == os.path.join('d1', 'x7')
+
+ assert x1.File(x4) == x4
+ assert x1.Dir(x5) == x5
+ assert x1.Entry(x6) == x6
+ assert x1.Entry(x7) == x7
+
+ assert x1.Entry(x5) == x5
+ try:
+ x1.File(x5)
+ except TypeError:
+ pass
+ else:
+ raise Exception("did not catch expected TypeError")
+
+ assert x1.Entry(x4) == x4
+ try:
+ x1.Dir(x4)
+ except TypeError:
+ pass
+ else:
+ raise Exception("did not catch expected TypeError")
+
+ x6 = x1.File(x6)
+ assert isinstance(x6, SCons.Node.FS.File)
+
+ x7 = x1.Dir(x7)
+ assert isinstance(x7, SCons.Node.FS.Dir)
+
+ seps = [os.sep]
+ if os.sep != '/':
+ seps = seps + ['/']
+
+ drive, path = os.path.splitdrive(os.getcwd())
+
+ def _do_Dir_test(lpath, path_, abspath_, up_path_, sep, fileSys=fs, drive=drive):
+ dir = fileSys.Dir(lpath.replace('/', sep))
+
+ if os.sep != '/':
+ path_ = path_.replace('/', os.sep)
+ abspath_ = abspath_.replace('/', os.sep)
+ up_path_ = up_path_.replace('/', os.sep)
+
+ def strip_slash(p, drive=drive):
+ if p[-1] == os.sep and len(p) > 1:
+ p = p[:-1]
+ if p[0] == os.sep:
+ p = drive + p
+ return p
+ path = strip_slash(path_)
+ abspath = strip_slash(abspath_)
+ up_path = strip_slash(up_path_)
+
+ name = abspath.split(os.sep)[-1]
+
+ if not name:
+ if drive:
+ name = drive
+ else:
+ name = os.sep
+
+ if dir.up() is None:
+ dir_up_path = dir.get_internal_path()
+ else:
+ dir_up_path = dir.up().get_internal_path()
+
+ assert dir.name == name, \
+ "dir.name %s != expected name %s" % \
+ (dir.name, name)
+ assert dir.get_internal_path() == path, \
+ "dir.path %s != expected path %s" % \
+ (dir.get_internal_path(), path)
+ assert str(dir) == path, \
+ "str(dir) %s != expected path %s" % \
+ (str(dir), path)
+ assert dir.get_abspath() == abspath, \
+ "dir.abspath %s != expected absolute path %s" % \
+ (dir.get_abspath(), abspath)
+ assert dir_up_path == up_path, \
+ "dir.up().path %s != expected parent path %s" % \
+ (dir_up_path, up_path)
+
+ for sep in seps:
+
+ def Dir_test(lpath, path_, abspath_, up_path_, sep=sep, func=_do_Dir_test):
+ return func(lpath, path_, abspath_, up_path_, sep)
+
+ Dir_test('/', '/', '/', '/')
+ Dir_test('', './', sub_dir, sub)
+ Dir_test('foo', 'foo/', sub_dir_foo, './')
+ Dir_test('foo/bar', 'foo/bar/', sub_dir_foo_bar, 'foo/')
+ Dir_test('/foo', '/foo/', '/foo/', '/')
+ Dir_test('/foo/bar', '/foo/bar/', '/foo/bar/', '/foo/')
+ Dir_test('..', sub, sub, wp)
+ Dir_test('foo/..', './', sub_dir, sub)
+ Dir_test('../foo', sub_foo, sub_foo, sub)
+ Dir_test('.', './', sub_dir, sub)
+ Dir_test('./.', './', sub_dir, sub)
+ Dir_test('foo/./bar', 'foo/bar/', sub_dir_foo_bar, 'foo/')
+ Dir_test('#../foo', sub_foo, sub_foo, sub)
+ Dir_test('#/../foo', sub_foo, sub_foo, sub)
+ Dir_test('#foo/bar', 'foo/bar/', sub_dir_foo_bar, 'foo/')
+ Dir_test('#/foo/bar', 'foo/bar/', sub_dir_foo_bar, 'foo/')
+ Dir_test('#', './', sub_dir, sub)
+
+ try:
+ f2 = fs.File(sep.join(['f1', 'f2']), directory = d1)
+ except TypeError as x:
+ assert str(x) == ("Tried to lookup File '%s' as a Dir." %
+ d1_f1), x
+ except:
+ raise
+
+ try:
+ dir = fs.Dir(sep.join(['d1', 'f1']))
+ except TypeError as x:
+ assert str(x) == ("Tried to lookup File '%s' as a Dir." %
+ d1_f1), x
+ except:
+ raise
+
+ try:
+ f2 = fs.File('d1')
+ except TypeError as x:
+ assert str(x) == ("Tried to lookup Dir '%s' as a File." %
+ 'd1'), x
+ except:
+ raise
+
+ # Test that just specifying the drive works to identify
+ # its root directory.
+ p = os.path.abspath(test.workpath('root_file'))
+ drive, path = os.path.splitdrive(p)
+ if drive:
+ # The assert below probably isn't correct for the general
+ # case, but it works for Windows, which covers a lot
+ # of ground...
+ dir = fs.Dir(drive)
+ assert str(dir) == drive + os.sep, str(dir)
+
+ # Make sure that lookups with and without the drive are
+ # equivalent.
+ p = os.path.abspath(test.workpath('some/file'))
+ drive, path = os.path.splitdrive(p)
+
+ e1 = fs.Entry(p)
+ e2 = fs.Entry(path)
+ assert e1 is e2, (e1, e2)
+ assert str(e1) is str(e2), (str(e1), str(e2))
+
+ # Test for a bug in 0.04 that did not like looking up
+ # dirs with a trailing slash on Windows.
+ d=fs.Dir('./')
+ assert d.get_internal_path() == '.', d.get_abspath()
+ d=fs.Dir('foo/')
+ assert d.get_internal_path() == 'foo', d.get_abspath()
+
+ # Test for sub-classing of node building.
+ global built_it
+
+ built_it = None
+ assert not built_it
+ d1.add_source([SCons.Node.Node()]) # XXX FAKE SUBCLASS ATTRIBUTE
+ d1.builder_set(Builder(fs.File))
+ d1.reset_executor()
+ d1.env_set(Environment())
+ d1.build()
+ assert built_it
+
+ built_it = None
+ assert not built_it
+ f1.add_source([SCons.Node.Node()]) # XXX FAKE SUBCLASS ATTRIBUTE
+ f1.builder_set(Builder(fs.File))
+ f1.reset_executor()
+ f1.env_set(Environment())
+ f1.build()
+ assert built_it
+
+ def match(path, expect):
+ expect = expect.replace('/', os.sep)
+ assert path == expect, "path %s != expected %s" % (path, expect)
+
+ e1 = fs.Entry("d1")
+ assert e1.__class__.__name__ == 'Dir'
+ match(e1.get_internal_path(), "d1")
+ match(e1.dir.get_internal_path(), ".")
+
+ e2 = fs.Entry("d1/f1")
+ assert e2.__class__.__name__ == 'File'
+ match(e2.get_internal_path(), "d1/f1")
+ match(e2.dir.get_internal_path(), "d1")
+
+ e3 = fs.Entry("e3")
+ assert e3.__class__.__name__ == 'Entry'
+ match(e3.get_internal_path(), "e3")
+ match(e3.dir.get_internal_path(), ".")
+
+ e4 = fs.Entry("d1/e4")
+ assert e4.__class__.__name__ == 'Entry'
+ match(e4.get_internal_path(), "d1/e4")
+ match(e4.dir.get_internal_path(), "d1")
+
+ e5 = fs.Entry("e3/e5")
+ assert e3.__class__.__name__ == 'Dir'
+ match(e3.get_internal_path(), "e3")
+ match(e3.dir.get_internal_path(), ".")
+ assert e5.__class__.__name__ == 'Entry'
+ match(e5.get_internal_path(), "e3/e5")
+ match(e5.dir.get_internal_path(), "e3")
+
+ e6 = fs.Dir("d1/e4")
+ assert e6 is e4
+ assert e4.__class__.__name__ == 'Dir'
+ match(e4.get_internal_path(), "d1/e4")
+ match(e4.dir.get_internal_path(), "d1")
+
+ e7 = fs.File("e3/e5")
+ assert e7 is e5
+ assert e5.__class__.__name__ == 'File'
+ match(e5.get_internal_path(), "e3/e5")
+ match(e5.dir.get_internal_path(), "e3")
+
+ fs.chdir(fs.Dir('subdir'))
+ f11 = fs.File("f11")
+ match(f11.get_internal_path(), "subdir/f11")
+ d12 = fs.Dir("d12")
+ e13 = fs.Entry("subdir/e13")
+ match(e13.get_internal_path(), "subdir/subdir/e13")
+ fs.chdir(fs.Dir('..'))
+
+ # Test scanning
+ f1.builder_set(Builder(fs.File))
+ f1.env_set(Environment())
+ xyz = fs.File("xyz")
+ f1.builder.target_scanner = Scanner(xyz)
+
+ f1.scan()
+ assert f1.implicit[0].get_internal_path() == "xyz"
+ f1.implicit = []
+ f1.scan()
+ assert f1.implicit == []
+ f1.implicit = None
+ f1.scan()
+ assert f1.implicit[0].get_internal_path() == "xyz"
+
+ # Test underlying scanning functionality in get_found_includes()
+ env = Environment()
+ f12 = fs.File("f12")
+ t1 = fs.File("t1")
+
+ deps = f12.get_found_includes(env, None, t1)
+ assert deps == [], deps
+
+ class MyScanner(Scanner):
+ call_count = 0
+ def __call__(self, node, env, path):
+ self.call_count = self.call_count + 1
+ return Scanner.__call__(self, node, env, path)
+ s = MyScanner(xyz)
+
+ deps = f12.get_found_includes(env, s, t1)
+ assert deps == [xyz], deps
+ assert s.call_count == 1, s.call_count
+
+ f12.built()
+
+ deps = f12.get_found_includes(env, s, t1)
+ assert deps == [xyz], deps
+ assert s.call_count == 2, s.call_count
+
+ env2 = Environment()
+
+ deps = f12.get_found_includes(env2, s, t1)
+ assert deps == [xyz], deps
+ assert s.call_count == 3, s.call_count
+
+
+
+ # Make sure we can scan this file even if the target isn't
+ # a file that has a scanner (it might be an Alias, e.g.).
+ class DummyNode(object):
+ pass
+
+ deps = f12.get_found_includes(env, s, DummyNode())
+ assert deps == [xyz], deps
+
+ # Test building a file whose directory is not there yet...
+ f1 = fs.File(test.workpath("foo/bar/baz/ack"))
+ assert not f1.dir.exists()
+ f1.prepare()
+ f1.build()
+ assert f1.dir.exists()
+
+ os.chdir('..')
+
+ # Test getcwd()
+ fs = SCons.Node.FS.FS()
+ assert str(fs.getcwd()) == ".", str(fs.getcwd())
+ fs.chdir(fs.Dir('subdir'))
+ # The cwd's path is always "."
+ assert str(fs.getcwd()) == ".", str(fs.getcwd())
+ assert fs.getcwd().get_internal_path() == 'subdir', fs.getcwd().get_internal_path()
+ fs.chdir(fs.Dir('../..'))
+ assert fs.getcwd().get_internal_path() == test.workdir, fs.getcwd().get_internal_path()
+
+ f1 = fs.File(test.workpath("do_i_exist"))
+ assert not f1.exists()
+ test.write("do_i_exist","\n")
+ assert not f1.exists(), "exists() call not cached"
+ f1.built()
+ assert f1.exists(), "exists() call caching not reset"
+ test.unlink("do_i_exist")
+ assert f1.exists()
+ f1.built()
+ assert not f1.exists()
+
+ # For some reason, in Windows, the \x1a character terminates
+ # the reading of files in text mode. This tests that
+ # get_contents() returns the binary contents.
+ test.write("binary_file", "Foo\x1aBar")
+ f1 = fs.File(test.workpath("binary_file"))
+ assert f1.get_contents() == bytearray("Foo\x1aBar",'utf-8'), f1.get_contents()
+
+ # This tests to make sure we can decode UTF-8 text files.
+ test_string = u"Foo\x1aBar"
+ test.write("utf8_file", test_string.encode('utf-8'))
+ f1 = fs.File(test.workpath("utf8_file"))
+ assert eval('f1.get_text_contents() == u"Foo\x1aBar"'), \
+ f1.get_text_contents()
+
+ # Check for string which doesn't have BOM and isn't valid
+ # ASCII
+ test_string = b'Gan\xdfauge'
+ test.write('latin1_file', test_string)
+ f1 = fs.File(test.workpath("latin1_file"))
+ assert f1.get_text_contents() == test_string.decode('latin-1'), \
+ f1.get_text_contents()
+
+ def nonexistent(method, s):
+ try:
+ x = method(s, create = 0)
+ except SCons.Errors.UserError:
+ pass
+ else:
+ raise Exception("did not catch expected UserError")
+
+ nonexistent(fs.Entry, 'nonexistent')
+ nonexistent(fs.Entry, 'nonexistent/foo')
+
+ nonexistent(fs.File, 'nonexistent')
+ nonexistent(fs.File, 'nonexistent/foo')
+
+ nonexistent(fs.Dir, 'nonexistent')
+ nonexistent(fs.Dir, 'nonexistent/foo')
+
+ test.write("preserve_me", "\n")
+ assert os.path.exists(test.workpath("preserve_me"))
+ f1 = fs.File(test.workpath("preserve_me"))
+ f1.prepare()
+ assert os.path.exists(test.workpath("preserve_me"))
+
+ test.write("remove_me", "\n")
+ assert os.path.exists(test.workpath("remove_me"))
+ f1 = fs.File(test.workpath("remove_me"))
+ f1.builder = Builder(fs.File)
+ f1.env_set(Environment())
+ f1.prepare()
+ assert not os.path.exists(test.workpath("remove_me"))
+
+ e = fs.Entry('e_local')
+ assert not hasattr(e, '_local')
+ e.set_local()
+ assert e._local == 1
+ f = fs.File('e_local')
+ assert f._local == 1
+ f = fs.File('f_local')
+ assert f._local == 0
+
+ #XXX test_is_up_to_date() for directories
+
+ #XXX test_sconsign() for directories
+
+ #XXX test_set_signature() for directories
+
+ #XXX test_build() for directories
+
+ #XXX test_root()
+
+ # test Entry.get_contents()
+ e = fs.Entry('does_not_exist')
+ c = e.get_contents()
+ assert c == "", c
+ assert e.__class__ == SCons.Node.FS.Entry
+
+ test.write("file", "file\n")
+ try:
+ e = fs.Entry('file')
+ c = e.get_contents()
+ assert c == bytearray("file\n",'utf-8'), c
+ assert e.__class__ == SCons.Node.FS.File
+ finally:
+ test.unlink("file")
+
+ # test Entry.get_text_contents()
+ e = fs.Entry('does_not_exist')
+ c = e.get_text_contents()
+ assert c == "", c
+ assert e.__class__ == SCons.Node.FS.Entry
+
+ test.write("file", "file\n")
+ try:
+ e = fs.Entry('file')
+ c = e.get_text_contents()
+ assert c == "file\n", c
+ assert e.__class__ == SCons.Node.FS.File
+ finally:
+ test.unlink("file")
+
+ test.subdir("dir")
+ e = fs.Entry('dir')
+ c = e.get_contents()
+ assert c == "", c
+ assert e.__class__ == SCons.Node.FS.Dir
+
+ c = e.get_text_contents()
+ try:
+ eval('assert c == u"", c')
+ except SyntaxError:
+ assert c == ""
+
+ if sys.platform != 'win32' and hasattr(os, 'symlink'):
+ os.symlink('nonexistent', test.workpath('dangling_symlink'))
+ e = fs.Entry('dangling_symlink')
+ c = e.get_contents()
+ assert e.__class__ == SCons.Node.FS.Entry, e.__class__
+ assert c == "", c
+ c = e.get_text_contents()
+ try:
+ eval('assert c == u"", c')
+ except SyntaxError:
+ assert c == "", c
+
+ test.write("tstamp", "tstamp\n")
+ try:
+ # Okay, *this* manipulation accomodates Windows FAT file systems
+ # that only have two-second granularity on their timestamps.
+ # We round down the current time to the nearest even integer
+ # value, subtract two to make sure the timestamp is not "now,"
+ # and then convert it back to a float.
+ tstamp = float(int(time.time() // 2) * 2) - 2.0
+ os.utime(test.workpath("tstamp"), (tstamp - 2.0, tstamp))
+ f = fs.File("tstamp")
+ t = f.get_timestamp()
+ assert t == tstamp, "expected %f, got %f" % (tstamp, t)
+ finally:
+ test.unlink("tstamp")
+
+ test.subdir('tdir1')
+ d = fs.Dir('tdir1')
+ t = d.get_timestamp()
+ assert t == 0, "expected 0, got %s" % str(t)
+
+ test.subdir('tdir2')
+ f1 = test.workpath('tdir2', 'file1')
+ f2 = test.workpath('tdir2', 'file2')
+ test.write(f1, 'file1\n')
+ test.write(f2, 'file2\n')
+ current_time = float(int(time.time() // 2) * 2)
+ t1 = current_time - 4.0
+ t2 = current_time - 2.0
+ os.utime(f1, (t1 - 2.0, t1))
+ os.utime(f2, (t2 - 2.0, t2))
+ d = fs.Dir('tdir2')
+ fs.File(f1)
+ fs.File(f2)
+ t = d.get_timestamp()
+ assert t == t2, "expected %f, got %f" % (t2, t)
+
+ skey = fs.Entry('eee.x').scanner_key()
+ assert skey == '.x', skey
+ skey = fs.Entry('eee.xyz').scanner_key()
+ assert skey == '.xyz', skey
+
+ skey = fs.File('fff.x').scanner_key()
+ assert skey == '.x', skey
+ skey = fs.File('fff.xyz').scanner_key()
+ assert skey == '.xyz', skey
+
+ skey = fs.Dir('ddd.x').scanner_key()
+ assert skey is None, skey
+
+ test.write("i_am_not_a_directory", "\n")
+ try:
+ exc_caught = 0
+ try:
+ fs.Dir(test.workpath("i_am_not_a_directory"))
+ except TypeError:
+ exc_caught = 1
+ assert exc_caught, "Should have caught a TypeError"
+ finally:
+ test.unlink("i_am_not_a_directory")
+
+ exc_caught = 0
+ try:
+ fs.File(sub_dir)
+ except TypeError:
+ exc_caught = 1
+ assert exc_caught, "Should have caught a TypeError"
+
+ # XXX test_is_up_to_date()
+
+ d = fs.Dir('dir')
+ r = d.remove()
+ assert r is None, r
+
+ f = fs.File('does_not_exist')
+ r = f.remove()
+ assert r is None, r
+
+ test.write('exists', "exists\n")
+ f = fs.File('exists')
+ r = f.remove()
+ assert r, r
+ assert not os.path.exists(test.workpath('exists')), "exists was not removed"
+
+ if sys.platform != 'win32' and hasattr(os, 'symlink'):
+ symlink = test.workpath('symlink')
+ os.symlink(test.workpath('does_not_exist'), symlink)
+ assert os.path.islink(symlink)
+ f = fs.File('symlink')
+ r = f.remove()
+ assert r, r
+ assert not os.path.islink(symlink), "symlink was not removed"
+
+ test.write('can_not_remove', "can_not_remove\n")
+ test.writable(test.workpath('.'), 0)
+ fp = open(test.workpath('can_not_remove'))
+
+ f = fs.File('can_not_remove')
+ exc_caught = 0
+ try:
+ r = f.remove()
+ except OSError:
+ exc_caught = 1
+
+ fp.close()
+
+ assert exc_caught, "Should have caught an OSError, r = " + str(r)
+
+ f = fs.Entry('foo/bar/baz')
+ assert f.for_signature() == 'baz', f.for_signature()
+ assert f.get_string(0) == os.path.normpath('foo/bar/baz'), \
+ f.get_string(0)
+ assert f.get_string(1) == 'baz', f.get_string(1)
+
+ def test_drive_letters(self):
+ """Test drive-letter look-ups"""
+
+ test = self.test
+
+ test.subdir('sub', ['sub', 'dir'])
+
+ def drive_workpath(dirs, test=test):
+ x = test.workpath(*dirs)
+ drive, path = os.path.splitdrive(x)
+ return 'X:' + path
+
+ wp = drive_workpath([''])
+
+ if wp[-1] in (os.sep, '/'):
+ tmp = os.path.split(wp[:-1])[0]
+ else:
+ tmp = os.path.split(wp)[0]
+
+ parent_tmp = os.path.split(tmp)[0]
+ if parent_tmp == 'X:':
+ parent_tmp = 'X:' + os.sep
+
+ tmp_foo = os.path.join(tmp, 'foo')
+
+ foo = drive_workpath(['foo'])
+ foo_bar = drive_workpath(['foo', 'bar'])
+ sub = drive_workpath(['sub', ''])
+ sub_dir = drive_workpath(['sub', 'dir', ''])
+ sub_dir_foo = drive_workpath(['sub', 'dir', 'foo', ''])
+ sub_dir_foo_bar = drive_workpath(['sub', 'dir', 'foo', 'bar', ''])
+ sub_foo = drive_workpath(['sub', 'foo', ''])
+
+ fs = SCons.Node.FS.FS()
+
+ seps = [os.sep]
+ if os.sep != '/':
+ seps = seps + ['/']
+
+ def _do_Dir_test(lpath, path_, up_path_, sep, fileSys=fs):
+ dir = fileSys.Dir(lpath.replace('/', sep))
+
+ if os.sep != '/':
+ path_ = path_.replace('/', os.sep)
+ up_path_ = up_path_.replace('/', os.sep)
+
+ def strip_slash(p):
+ if p[-1] == os.sep and len(p) > 3:
+ p = p[:-1]
+ return p
+ path = strip_slash(path_)
+ up_path = strip_slash(up_path_)
+ name = path.split(os.sep)[-1]
+
+ assert dir.name == name, \
+ "dir.name %s != expected name %s" % \
+ (dir.name, name)
+ assert dir.get_internal_path() == path, \
+ "dir.path %s != expected path %s" % \
+ (dir.get_internal_path(), path)
+ assert str(dir) == path, \
+ "str(dir) %s != expected path %s" % \
+ (str(dir), path)
+ assert dir.up().get_internal_path() == up_path, \
+ "dir.up().path %s != expected parent path %s" % \
+ (dir.up().get_internal_path(), up_path)
+
+ save_os_path = os.path
+ save_os_sep = os.sep
+ try:
+ import ntpath
+ os.path = ntpath
+ os.sep = '\\'
+ SCons.Node.FS.initialize_do_splitdrive()
+
+ for sep in seps:
+
+ def Dir_test(lpath, path_, up_path_, sep=sep, func=_do_Dir_test):
+ return func(lpath, path_, up_path_, sep)
+
+ Dir_test('#X:', wp, tmp)
+ Dir_test('X:foo', foo, wp)
+ Dir_test('X:foo/bar', foo_bar, foo)
+ Dir_test('X:/foo', 'X:/foo', 'X:/')
+ Dir_test('X:/foo/bar', 'X:/foo/bar/', 'X:/foo/')
+ Dir_test('X:..', tmp, parent_tmp)
+ Dir_test('X:foo/..', wp, tmp)
+ Dir_test('X:../foo', tmp_foo, tmp)
+ Dir_test('X:.', wp, tmp)
+ Dir_test('X:./.', wp, tmp)
+ Dir_test('X:foo/./bar', foo_bar, foo)
+ Dir_test('#X:../foo', tmp_foo, tmp)
+ Dir_test('#X:/../foo', tmp_foo, tmp)
+ Dir_test('#X:foo/bar', foo_bar, foo)
+ Dir_test('#X:/foo/bar', foo_bar, foo)
+ Dir_test('#X:/', wp, tmp)
+ finally:
+ os.path = save_os_path
+ os.sep = save_os_sep
+ SCons.Node.FS.initialize_do_splitdrive()
+
+ def test_unc_path(self):
+ """Test UNC path look-ups"""
+
+ test = self.test
+
+ test.subdir('sub', ['sub', 'dir'])
+
+ def strip_slash(p):
+ if p[-1] == os.sep and len(p) > 3:
+ p = p[:-1]
+ return p
+
+ def unc_workpath(dirs, test=test):
+ import ntpath
+ x = test.workpath(*dirs)
+ drive, path = ntpath.splitdrive(x)
+ unc, path = ntpath.splitunc(path)
+ path = strip_slash(path)
+ return '//' + path[1:]
+
+ wp = unc_workpath([''])
+
+ if wp[-1] in (os.sep, '/'):
+ tmp = os.path.split(wp[:-1])[0]
+ else:
+ tmp = os.path.split(wp)[0]
+
+ parent_tmp = os.path.split(tmp)[0]
+
+ tmp_foo = os.path.join(tmp, 'foo')
+
+ foo = unc_workpath(['foo'])
+ foo_bar = unc_workpath(['foo', 'bar'])
+ sub = unc_workpath(['sub', ''])
+ sub_dir = unc_workpath(['sub', 'dir', ''])
+ sub_dir_foo = unc_workpath(['sub', 'dir', 'foo', ''])
+ sub_dir_foo_bar = unc_workpath(['sub', 'dir', 'foo', 'bar', ''])
+ sub_foo = unc_workpath(['sub', 'foo', ''])
+
+ fs = SCons.Node.FS.FS()
+
+ seps = [os.sep]
+ if os.sep != '/':
+ seps = seps + ['/']
+
+ def _do_Dir_test(lpath, path, up_path, sep, fileSys=fs):
+ dir = fileSys.Dir(lpath.replace('/', sep))
+
+ if os.sep != '/':
+ path = path.replace('/', os.sep)
+ up_path = up_path.replace('/', os.sep)
+
+ if path == os.sep + os.sep:
+ name = os.sep + os.sep
+ else:
+ name = path.split(os.sep)[-1]
+
+ if dir.up() is None:
+ dir_up_path = dir.get_internal_path()
+ else:
+ dir_up_path = dir.up().get_internal_path()
+
+ assert dir.name == name, \
+ "dir.name %s != expected name %s" % \
+ (dir.name, name)
+ assert dir.get_internal_path() == path, \
+ "dir.path %s != expected path %s" % \
+ (dir.get_internal_path(), path)
+ assert str(dir) == path, \
+ "str(dir) %s != expected path %s" % \
+ (str(dir), path)
+ assert dir_up_path == up_path, \
+ "dir.up().path %s != expected parent path %s" % \
+ (dir.up().get_internal_path(), up_path)
+
+ save_os_path = os.path
+ save_os_sep = os.sep
+ try:
+ import ntpath
+ os.path = ntpath
+ os.sep = '\\'
+ SCons.Node.FS.initialize_do_splitdrive()
+
+ for sep in seps:
+
+ def Dir_test(lpath, path_, up_path_, sep=sep, func=_do_Dir_test):
+ return func(lpath, path_, up_path_, sep)
+
+ Dir_test('//foo', '//foo', '//')
+ Dir_test('//foo/bar', '//foo/bar', '//foo')
+ Dir_test('//', '//', '//')
+ Dir_test('//..', '//', '//')
+ Dir_test('//foo/..', '//', '//')
+ Dir_test('//../foo', '//foo', '//')
+ Dir_test('//.', '//', '//')
+ Dir_test('//./.', '//', '//')
+ Dir_test('//foo/./bar', '//foo/bar', '//foo')
+ Dir_test('//foo/../bar', '//bar', '//')
+ Dir_test('//foo/../../bar', '//bar', '//')
+ Dir_test('//foo/bar/../..', '//', '//')
+ Dir_test('#//', wp, tmp)
+ Dir_test('#//../foo', tmp_foo, tmp)
+ Dir_test('#//../foo', tmp_foo, tmp)
+ Dir_test('#//foo/bar', foo_bar, foo)
+ Dir_test('#//foo/bar', foo_bar, foo)
+ Dir_test('#//', wp, tmp)
+ finally:
+ os.path = save_os_path
+ os.sep = save_os_sep
+ SCons.Node.FS.initialize_do_splitdrive()
+
+ def test_target_from_source(self):
+ """Test the method for generating target nodes from sources"""
+ fs = self.fs
+
+ x = fs.File('x.c')
+ t = x.target_from_source('pre-', '-suf')
+ assert str(t) == 'pre-x-suf', str(t)
+ assert t.__class__ == SCons.Node.FS.Entry
+
+ y = fs.File('dir/y')
+ t = y.target_from_source('pre-', '-suf')
+ assert str(t) == os.path.join('dir', 'pre-y-suf'), str(t)
+ assert t.__class__ == SCons.Node.FS.Entry
+
+ z = fs.File('zz')
+ t = z.target_from_source('pre-', '-suf', lambda x: x[:-1])
+ assert str(t) == 'pre-z-suf', str(t)
+ assert t.__class__ == SCons.Node.FS.Entry
+
+ d = fs.Dir('ddd')
+ t = d.target_from_source('pre-', '-suf')
+ assert str(t) == 'pre-ddd-suf', str(t)
+ assert t.__class__ == SCons.Node.FS.Entry
+
+ e = fs.Entry('eee')
+ t = e.target_from_source('pre-', '-suf')
+ assert str(t) == 'pre-eee-suf', str(t)
+ assert t.__class__ == SCons.Node.FS.Entry
+
+ def test_same_name(self):
+ """Test that a local same-named file isn't found for a Dir lookup"""
+ test = self.test
+ fs = self.fs
+
+ test.subdir('subdir')
+ test.write(['subdir', 'build'], "subdir/build\n")
+
+ subdir = fs.Dir('subdir')
+ fs.chdir(subdir, change_os_dir=1)
+ self.fs._lookup('#build/file', subdir, SCons.Node.FS.File)
+
+ def test_above_root(self):
+ """Testing looking up a path above the root directory"""
+ test = self.test
+ fs = self.fs
+
+ d1 = fs.Dir('d1')
+ d2 = d1.Dir('d2')
+ dirs = os.path.normpath(d2.get_abspath()).split(os.sep)
+ above_path = os.path.join(*['..']*len(dirs) + ['above'])
+ above = d2.Dir(above_path)
+
+ def test_lookup_abs(self):
+ """Exercise the _lookup_abs function"""
+ test = self.test
+ fs = self.fs
+
+ root = fs.Dir('/')
+ d = root._lookup_abs('/tmp/foo-nonexistent/nonexistent-dir', SCons.Node.FS.Dir)
+ assert d.__class__ == SCons.Node.FS.Dir, str(d.__class__)
+
+ def test_lookup_uncpath(self):
+ """Testing looking up a UNC path on Windows"""
+ if sys.platform not in ('win32',):
+ return
+ test = self.test
+ fs = self.fs
+ path='//servername/C$/foo'
+ f = self.fs._lookup('//servername/C$/foo', fs.Dir('#'), SCons.Node.FS.File)
+ # before the fix in this commit, this returned 'C:\servername\C$\foo'
+ # Should be a normalized Windows UNC path as below.
+ assert str(f) == r'\\servername\C$\foo', \
+ 'UNC path %s got looked up as %s'%(path, f)
+
+ def test_unc_drive_letter(self):
+ """Test drive-letter lookup for windows UNC-style directories"""
+ if sys.platform not in ('win32',):
+ return
+ share = self.fs.Dir(r'\\SERVER\SHARE\Directory')
+ assert str(share) == r'\\SERVER\SHARE\Directory', str(share)
+
+ def test_UNC_dirs_2689(self):
+ """Test some UNC dirs that printed incorrectly and/or caused
+ infinite recursion errors prior to r5180 (SCons 2.1)."""
+ fs = self.fs
+ if sys.platform not in ('win32',):
+ return
+ p = fs.Dir(r"\\computername\sharename").get_abspath()
+ assert p == r"\\computername\sharename", p
+ p = fs.Dir(r"\\\computername\sharename").get_abspath()
+ assert p == r"\\computername\sharename", p
+
+ def test_rel_path(self):
+ """Test the rel_path() method"""
+ test = self.test
+ fs = self.fs
+
+ d1 = fs.Dir('d1')
+ d1_f = d1.File('f')
+ d1_d2 = d1.Dir('d2')
+ d1_d2_f = d1_d2.File('f')
+
+ d3 = fs.Dir('d3')
+ d3_f = d3.File('f')
+ d3_d4 = d3.Dir('d4')
+ d3_d4_f = d3_d4.File('f')
+
+ cases = [
+ d1, d1, '.',
+ d1, d1_f, 'f',
+ d1, d1_d2, 'd2',
+ d1, d1_d2_f, 'd2/f',
+ d1, d3, '../d3',
+ d1, d3_f, '../d3/f',
+ d1, d3_d4, '../d3/d4',
+ d1, d3_d4_f, '../d3/d4/f',
+
+ d1_f, d1, '.',
+ d1_f, d1_f, 'f',
+ d1_f, d1_d2, 'd2',
+ d1_f, d1_d2_f, 'd2/f',
+ d1_f, d3, '../d3',
+ d1_f, d3_f, '../d3/f',
+ d1_f, d3_d4, '../d3/d4',
+ d1_f, d3_d4_f, '../d3/d4/f',
+
+ d1_d2, d1, '..',
+ d1_d2, d1_f, '../f',
+ d1_d2, d1_d2, '.',
+ d1_d2, d1_d2_f, 'f',
+ d1_d2, d3, '../../d3',
+ d1_d2, d3_f, '../../d3/f',
+ d1_d2, d3_d4, '../../d3/d4',
+ d1_d2, d3_d4_f, '../../d3/d4/f',
+
+ d1_d2_f, d1, '..',
+ d1_d2_f, d1_f, '../f',
+ d1_d2_f, d1_d2, '.',
+ d1_d2_f, d1_d2_f, 'f',
+ d1_d2_f, d3, '../../d3',
+ d1_d2_f, d3_f, '../../d3/f',
+ d1_d2_f, d3_d4, '../../d3/d4',
+ d1_d2_f, d3_d4_f, '../../d3/d4/f',
+ ]
+
+ if sys.platform in ('win32',):
+ x_d1 = fs.Dir(r'X:\d1')
+ x_d1_d2 = x_d1.Dir('d2')
+ y_d1 = fs.Dir(r'Y:\d1')
+ y_d1_d2 = y_d1.Dir('d2')
+ y_d2 = fs.Dir(r'Y:\d2')
+
+ win32_cases = [
+ x_d1, x_d1, '.',
+ x_d1, x_d1_d2, 'd2',
+ x_d1, y_d1, r'Y:\d1',
+ x_d1, y_d1_d2, r'Y:\d1\d2',
+ x_d1, y_d2, r'Y:\d2',
+ ]
+
+ cases.extend(win32_cases)
+
+ failed = 0
+ while cases:
+ dir, other, expect = cases[:3]
+ expect = os.path.normpath(expect)
+ del cases[:3]
+ result = dir.rel_path(other)
+ if result != expect:
+ if failed == 0: print()
+ fmt = " dir_path(%(dir)s, %(other)s) => '%(result)s' did not match '%(expect)s'"
+ print(fmt % locals())
+ failed = failed + 1
+ assert failed == 0, "%d rel_path() cases failed" % failed
+
+ def test_proxy(self):
+ """Test a Node.FS object wrapped in a proxy instance"""
+ f1 = self.fs.File('fff')
+ class MyProxy(SCons.Util.Proxy):
+ __str__ = SCons.Util.Delegate('__str__')
+ p = MyProxy(f1)
+ f2 = self.fs.Entry(p)
+ assert f1 is f2, (f1, str(f1), f2, str(f2))
+
+
+
+class DirTestCase(_tempdirTestCase):
+
+ def test__morph(self):
+ """Test handling of actions when morphing an Entry into a Dir"""
+ test = self.test
+ e = self.fs.Entry('eee')
+ x = e.get_executor()
+ x.add_pre_action('pre')
+ x.add_post_action('post')
+ e.must_be_same(SCons.Node.FS.Dir)
+ a = x.get_action_list()
+ assert 'pre' in a, a
+ assert 'post' in a, a
+
+ def test_subclass(self):
+ """Test looking up subclass of Dir nodes"""
+ class DirSubclass(SCons.Node.FS.Dir):
+ pass
+ sd = self.fs._lookup('special_dir', None, DirSubclass, create=1)
+ sd.must_be_same(SCons.Node.FS.Dir)
+
+ def test_get_env_scanner(self):
+ """Test the Dir.get_env_scanner() method
+ """
+ import SCons.Defaults
+ d = self.fs.Dir('ddd')
+ s = d.get_env_scanner(Environment())
+ assert s is SCons.Defaults.DirEntryScanner, s
+
+ def test_get_target_scanner(self):
+ """Test the Dir.get_target_scanner() method
+ """
+ import SCons.Defaults
+ d = self.fs.Dir('ddd')
+ s = d.get_target_scanner()
+ assert s is SCons.Defaults.DirEntryScanner, s
+
+ def test_scan(self):
+ """Test scanning a directory for in-memory entries
+ """
+ fs = self.fs
+
+ dir = fs.Dir('ddd')
+ fs.File(os.path.join('ddd', 'f1'))
+ fs.File(os.path.join('ddd', 'f2'))
+ fs.File(os.path.join('ddd', 'f3'))
+ fs.Dir(os.path.join('ddd', 'd1'))
+ fs.Dir(os.path.join('ddd', 'd1', 'f4'))
+ fs.Dir(os.path.join('ddd', 'd1', 'f5'))
+ dir.scan()
+ kids = sorted([x.get_internal_path() for x in dir.children(None)])
+ assert kids == [os.path.join('ddd', 'd1'),
+ os.path.join('ddd', 'f1'),
+ os.path.join('ddd', 'f2'),
+ os.path.join('ddd', 'f3')], kids
+
+ def test_get_contents(self):
+ """Test getting the contents for a directory.
+ """
+ test = self.test
+
+ test.subdir('d')
+ test.write(['d', 'g'], "67890\n")
+ test.write(['d', 'f'], "12345\n")
+ test.subdir(['d','sub'])
+ test.write(['d', 'sub','h'], "abcdef\n")
+ test.subdir(['d','empty'])
+
+ d = self.fs.Dir('d')
+ g = self.fs.File(os.path.join('d', 'g'))
+ f = self.fs.File(os.path.join('d', 'f'))
+ h = self.fs.File(os.path.join('d', 'sub', 'h'))
+ e = self.fs.Dir(os.path.join('d', 'empty'))
+ s = self.fs.Dir(os.path.join('d', 'sub'))
+
+ files = d.get_contents().split('\n')
+
+ assert e.get_contents() == '', e.get_contents()
+ assert e.get_text_contents() == '', e.get_text_contents()
+ assert e.get_csig()+" empty" == files[0], files
+ assert f.get_csig()+" f" == files[1], files
+ assert g.get_csig()+" g" == files[2], files
+ assert s.get_csig()+" sub" == files[3], files
+
+ def test_implicit_re_scans(self):
+ """Test that adding entries causes a directory to be re-scanned
+ """
+
+ fs = self.fs
+
+ dir = fs.Dir('ddd')
+
+ fs.File(os.path.join('ddd', 'f1'))
+ dir.scan()
+ kids = sorted([x.get_internal_path() for x in dir.children()])
+ assert kids == [os.path.join('ddd', 'f1')], kids
+
+ fs.File(os.path.join('ddd', 'f2'))
+ dir.scan()
+ kids = sorted([x.get_internal_path() for x in dir.children()])
+ assert kids == [os.path.join('ddd', 'f1'),
+ os.path.join('ddd', 'f2')], kids
+
+ def test_entry_exists_on_disk(self):
+ """Test the Dir.entry_exists_on_disk() method
+ """
+ test = self.test
+
+ does_not_exist = self.fs.Dir('does_not_exist')
+ assert not does_not_exist.entry_exists_on_disk('foo')
+
+ test.subdir('d')
+ test.write(['d', 'exists'], "d/exists\n")
+ test.write(['d', 'Case-Insensitive'], "d/Case-Insensitive\n")
+
+ d = self.fs.Dir('d')
+ assert d.entry_exists_on_disk('exists')
+ assert not d.entry_exists_on_disk('does_not_exist')
+
+ if os.path.normcase("TeSt") != os.path.normpath("TeSt") or sys.platform == "cygwin":
+ assert d.entry_exists_on_disk('case-insensitive')
+
+ def test_rentry_exists_on_disk(self):
+ """Test the Dir.rentry_exists_on_disk() method
+ """
+ test = self.test
+
+ does_not_exist = self.fs.Dir('does_not_exist')
+ assert not does_not_exist.rentry_exists_on_disk('foo')
+
+ test.subdir('d')
+ test.write(['d', 'exists'], "d/exists\n")
+ test.write(['d', 'Case-Insensitive'], "d/Case-Insensitive\n")
+
+ test.subdir('r')
+ test.write(['r', 'rexists'], "r/rexists\n")
+
+ d = self.fs.Dir('d')
+ r = self.fs.Dir('r')
+ d.addRepository(r)
+
+ assert d.rentry_exists_on_disk('exists')
+ assert d.rentry_exists_on_disk('rexists')
+ assert not d.rentry_exists_on_disk('does_not_exist')
+
+ if os.path.normcase("TeSt") != os.path.normpath("TeSt") or sys.platform == "cygwin":
+ assert d.rentry_exists_on_disk('case-insensitive')
+
+ def test_srcdir_list(self):
+ """Test the Dir.srcdir_list() method
+ """
+ src = self.fs.Dir('src')
+ bld = self.fs.Dir('bld')
+ sub1 = bld.Dir('sub')
+ sub2 = sub1.Dir('sub')
+ sub3 = sub2.Dir('sub')
+ self.fs.VariantDir(bld, src, duplicate=0)
+ self.fs.VariantDir(sub2, src, duplicate=0)
+
+ def check(result, expect):
+ result = list(map(str, result))
+ expect = list(map(os.path.normpath, expect))
+ assert result == expect, result
+
+ s = src.srcdir_list()
+ check(s, [])
+
+ s = bld.srcdir_list()
+ check(s, ['src'])
+
+ s = sub1.srcdir_list()
+ check(s, ['src/sub'])
+
+ s = sub2.srcdir_list()
+ check(s, ['src', 'src/sub/sub'])
+
+ s = sub3.srcdir_list()
+ check(s, ['src/sub', 'src/sub/sub/sub'])
+
+ self.fs.VariantDir('src/b1/b2', 'src')
+ b1 = src.Dir('b1')
+ b1_b2 = b1.Dir('b2')
+ b1_b2_b1 = b1_b2.Dir('b1')
+ b1_b2_b1_b2 = b1_b2_b1.Dir('b2')
+ b1_b2_b1_b2_sub = b1_b2_b1_b2.Dir('sub')
+
+ s = b1.srcdir_list()
+ check(s, [])
+
+ s = b1_b2.srcdir_list()
+ check(s, ['src'])
+
+ s = b1_b2_b1.srcdir_list()
+ check(s, ['src/b1'])
+
+ s = b1_b2_b1_b2.srcdir_list()
+ check(s, ['src/b1/b2'])
+
+ s = b1_b2_b1_b2_sub.srcdir_list()
+ check(s, ['src/b1/b2/sub'])
+
+ def test_srcdir_duplicate(self):
+ """Test the Dir.srcdir_duplicate() method
+ """
+ test = self.test
+
+ test.subdir('src0')
+ test.write(['src0', 'exists'], "src0/exists\n")
+
+ bld0 = self.fs.Dir('bld0')
+ src0 = self.fs.Dir('src0')
+ self.fs.VariantDir(bld0, src0, duplicate=0)
+
+ n = bld0.srcdir_duplicate('does_not_exist')
+ assert n is None, n
+ assert not os.path.exists(test.workpath('bld0', 'does_not_exist'))
+
+ n = bld0.srcdir_duplicate('exists')
+ assert str(n) == os.path.normpath('src0/exists'), str(n)
+ assert not os.path.exists(test.workpath('bld0', 'exists'))
+
+ test.subdir('src1')
+ test.write(['src1', 'exists'], "src0/exists\n")
+
+ bld1 = self.fs.Dir('bld1')
+ src1 = self.fs.Dir('src1')
+ self.fs.VariantDir(bld1, src1, duplicate=1)
+
+ n = bld1.srcdir_duplicate('does_not_exist')
+ assert n is None, n
+ assert not os.path.exists(test.workpath('bld1', 'does_not_exist'))
+
+ n = bld1.srcdir_duplicate('exists')
+ assert str(n) == os.path.normpath('bld1/exists'), str(n)
+ assert os.path.exists(test.workpath('bld1', 'exists'))
+
+ def test_srcdir_find_file(self):
+ """Test the Dir.srcdir_find_file() method
+ """
+ test = self.test
+
+ def return_true(node):
+ return 1
+
+ SCons.Node._is_derived_map[2] = return_true
+ SCons.Node._exists_map[5] = return_true
+
+ test.subdir('src0')
+ test.write(['src0', 'on-disk-f1'], "src0/on-disk-f1\n")
+ test.write(['src0', 'on-disk-f2'], "src0/on-disk-f2\n")
+ test.write(['src0', 'on-disk-e1'], "src0/on-disk-e1\n")
+ test.write(['src0', 'on-disk-e2'], "src0/on-disk-e2\n")
+
+ bld0 = self.fs.Dir('bld0')
+ src0 = self.fs.Dir('src0')
+ self.fs.VariantDir(bld0, src0, duplicate=0)
+
+ derived_f = src0.File('derived-f')
+ derived_f._func_is_derived = 2
+ exists_f = src0.File('exists-f')
+ exists_f._func_exists = 5
+
+ derived_e = src0.Entry('derived-e')
+ derived_e._func_is_derived = 2
+ exists_e = src0.Entry('exists-e')
+ exists_e._func_exists = 5
+
+ def check(result, expect):
+ result = list(map(str, result))
+ expect = list(map(os.path.normpath, expect))
+ assert result == expect, result
+
+ # First check from the source directory.
+ n = src0.srcdir_find_file('does_not_exist')
+ assert n == (None, None), n
+
+ n = src0.srcdir_find_file('derived-f')
+ check(n, ['src0/derived-f', 'src0'])
+ n = src0.srcdir_find_file('exists-f')
+ check(n, ['src0/exists-f', 'src0'])
+ n = src0.srcdir_find_file('on-disk-f1')
+ check(n, ['src0/on-disk-f1', 'src0'])
+
+ n = src0.srcdir_find_file('derived-e')
+ check(n, ['src0/derived-e', 'src0'])
+ n = src0.srcdir_find_file('exists-e')
+ check(n, ['src0/exists-e', 'src0'])
+ n = src0.srcdir_find_file('on-disk-e1')
+ check(n, ['src0/on-disk-e1', 'src0'])
+
+ # Now check from the variant directory.
+ n = bld0.srcdir_find_file('does_not_exist')
+ assert n == (None, None), n
+
+ n = bld0.srcdir_find_file('derived-f')
+ check(n, ['src0/derived-f', 'bld0'])
+ n = bld0.srcdir_find_file('exists-f')
+ check(n, ['src0/exists-f', 'bld0'])
+ n = bld0.srcdir_find_file('on-disk-f2')
+ check(n, ['src0/on-disk-f2', 'bld0'])
+
+ n = bld0.srcdir_find_file('derived-e')
+ check(n, ['src0/derived-e', 'bld0'])
+ n = bld0.srcdir_find_file('exists-e')
+ check(n, ['src0/exists-e', 'bld0'])
+ n = bld0.srcdir_find_file('on-disk-e2')
+ check(n, ['src0/on-disk-e2', 'bld0'])
+
+ test.subdir('src1')
+ test.write(['src1', 'on-disk-f1'], "src1/on-disk-f1\n")
+ test.write(['src1', 'on-disk-f2'], "src1/on-disk-f2\n")
+ test.write(['src1', 'on-disk-e1'], "src1/on-disk-e1\n")
+ test.write(['src1', 'on-disk-e2'], "src1/on-disk-e2\n")
+
+ bld1 = self.fs.Dir('bld1')
+ src1 = self.fs.Dir('src1')
+ self.fs.VariantDir(bld1, src1, duplicate=1)
+
+ derived_f = src1.File('derived-f')
+ derived_f._func_is_derived = 2
+ exists_f = src1.File('exists-f')
+ exists_f._func_exists = 5
+
+ derived_e = src1.Entry('derived-e')
+ derived_e._func_is_derived = 2
+ exists_e = src1.Entry('exists-e')
+ exists_e._func_exists = 5
+
+ # First check from the source directory.
+ n = src1.srcdir_find_file('does_not_exist')
+ assert n == (None, None), n
+
+ n = src1.srcdir_find_file('derived-f')
+ check(n, ['src1/derived-f', 'src1'])
+ n = src1.srcdir_find_file('exists-f')
+ check(n, ['src1/exists-f', 'src1'])
+ n = src1.srcdir_find_file('on-disk-f1')
+ check(n, ['src1/on-disk-f1', 'src1'])
+
+ n = src1.srcdir_find_file('derived-e')
+ check(n, ['src1/derived-e', 'src1'])
+ n = src1.srcdir_find_file('exists-e')
+ check(n, ['src1/exists-e', 'src1'])
+ n = src1.srcdir_find_file('on-disk-e1')
+ check(n, ['src1/on-disk-e1', 'src1'])
+
+ # Now check from the variant directory.
+ n = bld1.srcdir_find_file('does_not_exist')
+ assert n == (None, None), n
+
+ n = bld1.srcdir_find_file('derived-f')
+ check(n, ['bld1/derived-f', 'src1'])
+ n = bld1.srcdir_find_file('exists-f')
+ check(n, ['bld1/exists-f', 'src1'])
+ n = bld1.srcdir_find_file('on-disk-f2')
+ check(n, ['bld1/on-disk-f2', 'bld1'])
+
+ n = bld1.srcdir_find_file('derived-e')
+ check(n, ['bld1/derived-e', 'src1'])
+ n = bld1.srcdir_find_file('exists-e')
+ check(n, ['bld1/exists-e', 'src1'])
+ n = bld1.srcdir_find_file('on-disk-e2')
+ check(n, ['bld1/on-disk-e2', 'bld1'])
+
+ def test_dir_on_disk(self):
+ """Test the Dir.dir_on_disk() method"""
+ self.test.subdir('sub', ['sub', 'exists'])
+ self.test.write(['sub', 'file'], "self/file\n")
+ sub = self.fs.Dir('sub')
+
+ r = sub.dir_on_disk('does_not_exist')
+ assert not r, r
+
+ r = sub.dir_on_disk('exists')
+ assert r, r
+
+ r = sub.dir_on_disk('file')
+ assert not r, r
+
+ def test_file_on_disk(self):
+ """Test the Dir.file_on_disk() method"""
+ self.test.subdir('sub', ['sub', 'dir'])
+ self.test.write(['sub', 'exists'], "self/exists\n")
+ sub = self.fs.Dir('sub')
+
+ r = sub.file_on_disk('does_not_exist')
+ assert not r, r
+
+ r = sub.file_on_disk('exists')
+ assert r, r
+
+ r = sub.file_on_disk('dir')
+ assert not r, r
+
+class EntryTestCase(_tempdirTestCase):
+ def test_runTest(self):
+ """Test methods specific to the Entry sub-class.
+ """
+ test = TestCmd(workdir='')
+ # FS doesn't like the cwd to be something other than its root.
+ os.chdir(test.workpath(""))
+
+ fs = SCons.Node.FS.FS()
+
+ e1 = fs.Entry('e1')
+ e1.rfile()
+ assert e1.__class__ is SCons.Node.FS.File, e1.__class__
+
+ test.subdir('e3d')
+ test.write('e3f', "e3f\n")
+
+ e3d = fs.Entry('e3d')
+ e3d.get_contents()
+ assert e3d.__class__ is SCons.Node.FS.Dir, e3d.__class__
+
+ e3f = fs.Entry('e3f')
+ e3f.get_contents()
+ assert e3f.__class__ is SCons.Node.FS.File, e3f.__class__
+
+ e3n = fs.Entry('e3n')
+ e3n.get_contents()
+ assert e3n.__class__ is SCons.Node.FS.Entry, e3n.__class__
+
+ test.subdir('e4d')
+ test.write('e4f', "e4f\n")
+
+ e4d = fs.Entry('e4d')
+ exists = e4d.exists()
+ assert e4d.__class__ is SCons.Node.FS.Dir, e4d.__class__
+ assert exists, "e4d does not exist?"
+
+ e4f = fs.Entry('e4f')
+ exists = e4f.exists()
+ assert e4f.__class__ is SCons.Node.FS.File, e4f.__class__
+ assert exists, "e4f does not exist?"
+
+ e4n = fs.Entry('e4n')
+ exists = e4n.exists()
+ assert e4n.__class__ is SCons.Node.FS.File, e4n.__class__
+ assert not exists, "e4n exists?"
+
+ class MyCalc(object):
+ def __init__(self, val):
+ self.max_drift = 0
+ class M(object):
+ def __init__(self, val):
+ self.val = val
+ def collect(self, args):
+ result = 0
+ for a in args:
+ result += a
+ return result
+ def signature(self, executor):
+ return self.val + 222
+ self.module = M(val)
+
+ test.subdir('e5d')
+ test.write('e5f', "e5f\n")
+
+ def test_Entry_Entry_lookup(self):
+ """Test looking up an Entry within another Entry"""
+ self.fs.Entry('#topdir')
+ self.fs.Entry('#topdir/a/b/c')
+
+
+
+class FileTestCase(_tempdirTestCase):
+
+ def test_subclass(self):
+ """Test looking up subclass of File nodes"""
+ class FileSubclass(SCons.Node.FS.File):
+ pass
+ sd = self.fs._lookup('special_file', None, FileSubclass, create=1)
+ sd.must_be_same(SCons.Node.FS.File)
+
+ def test_Dirs(self):
+ """Test the File.Dirs() method"""
+ fff = self.fs.File('subdir/fff')
+ # This simulates that the SConscript file that defined
+ # fff is in subdir/.
+ fff.cwd = self.fs.Dir('subdir')
+ d1 = self.fs.Dir('subdir/d1')
+ d2 = self.fs.Dir('subdir/d2')
+ dirs = fff.Dirs(['d1', 'd2'])
+ assert dirs == [d1, d2], list(map(str, dirs))
+
+ def test_exists(self):
+ """Test the File.exists() method"""
+ fs = self.fs
+ test = self.test
+
+ src_f1 = fs.File('src/f1')
+ assert not src_f1.exists(), "%s apparently exists?" % src_f1
+
+ test.subdir('src')
+ test.write(['src', 'f1'], "src/f1\n")
+
+ assert not src_f1.exists(), "%s did not cache previous exists() value" % src_f1
+ src_f1.clear()
+ assert src_f1.exists(), "%s apparently does not exist?" % src_f1
+
+ test.subdir('build')
+ fs.VariantDir('build', 'src')
+ build_f1 = fs.File('build/f1')
+
+ assert build_f1.exists(), "%s did not realize that %s exists" % (build_f1, src_f1)
+ assert os.path.exists(build_f1.get_abspath()), "%s did not get duplicated on disk" % build_f1.get_abspath()
+
+ test.unlink(['src', 'f1'])
+ src_f1.clear() # so the next exists() call will look on disk again
+
+ assert build_f1.exists(), "%s did not cache previous exists() value" % build_f1
+ build_f1.clear()
+ build_f1.linked = None
+ assert not build_f1.exists(), "%s did not realize that %s disappeared" % (build_f1, src_f1)
+ assert not os.path.exists(build_f1.get_abspath()), "%s did not get removed after %s was removed" % (build_f1, src_f1)
+
+
+
+class GlobTestCase(_tempdirTestCase):
+ def setUp(self):
+ _tempdirTestCase.setUp(self)
+
+ fs = SCons.Node.FS.FS()
+ self.fs = fs
+
+ # Make entries on disk that will not have Nodes, so we can verify
+ # the behavior of looking for things on disk.
+ self.test.write('disk-bbb', "disk-bbb\n")
+ self.test.write('disk-aaa', "disk-aaa\n")
+ self.test.write('disk-ccc', "disk-ccc\n")
+ self.test.write('#disk-hash', "#disk-hash\n")
+ self.test.subdir('disk-sub')
+ self.test.write(['disk-sub', 'disk-ddd'], "disk-sub/disk-ddd\n")
+ self.test.write(['disk-sub', 'disk-eee'], "disk-sub/disk-eee\n")
+ self.test.write(['disk-sub', 'disk-fff'], "disk-sub/disk-fff\n")
+
+ # Make some entries that have both Nodes and on-disk entries,
+ # so we can verify what we do with
+ self.test.write('both-aaa', "both-aaa\n")
+ self.test.write('both-bbb', "both-bbb\n")
+ self.test.write('both-ccc', "both-ccc\n")
+ self.test.write('#both-hash', "#both-hash\n")
+ self.test.subdir('both-sub1')
+ self.test.write(['both-sub1', 'both-ddd'], "both-sub1/both-ddd\n")
+ self.test.write(['both-sub1', 'both-eee'], "both-sub1/both-eee\n")
+ self.test.write(['both-sub1', 'both-fff'], "both-sub1/both-fff\n")
+ self.test.subdir('both-sub2')
+ self.test.write(['both-sub2', 'both-ddd'], "both-sub2/both-ddd\n")
+ self.test.write(['both-sub2', 'both-eee'], "both-sub2/both-eee\n")
+ self.test.write(['both-sub2', 'both-fff'], "both-sub2/both-fff\n")
+
+ self.both_aaa = fs.File('both-aaa')
+ self.both_bbb = fs.File('both-bbb')
+ self.both_ccc = fs.File('both-ccc')
+ self._both_hash = fs.File('./#both-hash')
+ self.both_sub1 = fs.Dir('both-sub1')
+ self.both_sub1_both_ddd = self.both_sub1.File('both-ddd')
+ self.both_sub1_both_eee = self.both_sub1.File('both-eee')
+ self.both_sub1_both_fff = self.both_sub1.File('both-fff')
+ self.both_sub2 = fs.Dir('both-sub2')
+ self.both_sub2_both_ddd = self.both_sub2.File('both-ddd')
+ self.both_sub2_both_eee = self.both_sub2.File('both-eee')
+ self.both_sub2_both_fff = self.both_sub2.File('both-fff')
+
+ # Make various Nodes (that don't have on-disk entries) so we
+ # can verify how we match them.
+ self.ggg = fs.File('ggg')
+ self.hhh = fs.File('hhh')
+ self.iii = fs.File('iii')
+ self._hash = fs.File('./#hash')
+ self.subdir1 = fs.Dir('subdir1')
+ self.subdir1_lll = self.subdir1.File('lll')
+ self.subdir1_jjj = self.subdir1.File('jjj')
+ self.subdir1_kkk = self.subdir1.File('kkk')
+ self.subdir2 = fs.Dir('subdir2')
+ self.subdir2_lll = self.subdir2.File('lll')
+ self.subdir2_kkk = self.subdir2.File('kkk')
+ self.subdir2_jjj = self.subdir2.File('jjj')
+ self.sub = fs.Dir('sub')
+ self.sub_dir3 = self.sub.Dir('dir3')
+ self.sub_dir3_kkk = self.sub_dir3.File('kkk')
+ self.sub_dir3_jjj = self.sub_dir3.File('jjj')
+ self.sub_dir3_lll = self.sub_dir3.File('lll')
+
+
+ def do_cases(self, cases, **kwargs):
+
+ # First, execute all of the cases with string=True and verify
+ # that we get the expected strings returned. We do this first
+ # so the Glob() calls don't add Nodes to the self.fs file system
+ # hierarchy.
+
+ import copy
+ strings_kwargs = copy.copy(kwargs)
+ strings_kwargs['strings'] = True
+ for input, string_expect, node_expect in cases:
+ r = sorted(self.fs.Glob(input, **strings_kwargs))
+ assert r == string_expect, "Glob(%s, strings=True) expected %s, got %s" % (input, string_expect, r)
+
+ # Now execute all of the cases without string=True and look for
+ # the expected Nodes to be returned. If we don't have a list of
+ # actual expected Nodes, that means we're expecting a search for
+ # on-disk-only files to have returned some newly-created nodes.
+ # Verify those by running the list through str() before comparing
+ # them with the expected list of strings.
+ for input, string_expect, node_expect in cases:
+ r = self.fs.Glob(input, **kwargs)
+ if node_expect:
+ r = sorted(r, key=lambda a: a.get_internal_path())
+ result = []
+ for n in node_expect:
+ if isinstance(n, str):
+ n = self.fs.Entry(n)
+ result.append(n)
+ fmt = lambda n: "%s %s" % (repr(n), repr(str(n)))
+ else:
+ r = sorted(map(str, r))
+ result = string_expect
+ fmt = lambda n: n
+ if r != result:
+ import pprint
+ print("Glob(%s) expected:" % repr(input))
+ pprint.pprint(list(map(fmt, result)))
+ print("Glob(%s) got:" % repr(input))
+ pprint.pprint(list(map(fmt, r)))
+ self.fail()
+
+ def test_exact_match(self):
+ """Test globbing for exact Node matches"""
+ join = os.path.join
+
+ cases = (
+ ('ggg', ['ggg'], [self.ggg]),
+
+ ('subdir1', ['subdir1'], [self.subdir1]),
+
+ ('subdir1/jjj', [join('subdir1', 'jjj')], [self.subdir1_jjj]),
+
+ ('disk-aaa', ['disk-aaa'], None),
+
+ ('disk-sub', ['disk-sub'], None),
+
+ ('both-aaa', ['both-aaa'], []),
+ )
+
+ self.do_cases(cases)
+
+ def test_subdir_matches(self):
+ """Test globbing for exact Node matches in subdirectories"""
+ join = os.path.join
+
+ cases = (
+ ('*/jjj',
+ [join('subdir1', 'jjj'), join('subdir2', 'jjj')],
+ [self.subdir1_jjj, self.subdir2_jjj]),
+
+ ('*/disk-ddd',
+ [join('disk-sub', 'disk-ddd')],
+ None),
+ )
+
+ self.do_cases(cases)
+
+ def test_asterisk1(self):
+ """Test globbing for simple asterisk Node matches (1)"""
+ cases = (
+ ('h*',
+ ['hhh'],
+ [self.hhh]),
+
+ ('*',
+ ['#both-hash', '#hash',
+ 'both-aaa', 'both-bbb', 'both-ccc',
+ 'both-sub1', 'both-sub2',
+ 'ggg', 'hhh', 'iii',
+ 'sub', 'subdir1', 'subdir2'],
+ [self._both_hash, self._hash,
+ self.both_aaa, self.both_bbb, self.both_ccc, 'both-hash',
+ self.both_sub1, self.both_sub2,
+ self.ggg, 'hash', self.hhh, self.iii,
+ self.sub, self.subdir1, self.subdir2]),
+ )
+
+ self.do_cases(cases, ondisk=False)
+
+ def test_asterisk2(self):
+ """Test globbing for simple asterisk Node matches (2)"""
+ cases = (
+ ('disk-b*',
+ ['disk-bbb'],
+ None),
+
+ ('*',
+ ['#both-hash', '#disk-hash', '#hash',
+ 'both-aaa', 'both-bbb', 'both-ccc',
+ 'both-sub1', 'both-sub2',
+ 'disk-aaa', 'disk-bbb', 'disk-ccc', 'disk-sub',
+ 'ggg', 'hhh', 'iii',
+ 'sub', 'subdir1', 'subdir2'],
+ ['./#both-hash', './#disk-hash', './#hash',
+ 'both-aaa', 'both-bbb', 'both-ccc', 'both-hash',
+ 'both-sub1', 'both-sub2',
+ 'disk-aaa', 'disk-bbb', 'disk-ccc', 'disk-sub',
+ 'ggg', 'hash', 'hhh', 'iii',
+ 'sub', 'subdir1', 'subdir2']),
+ )
+
+ self.do_cases(cases)
+
+ def test_question_mark(self):
+ """Test globbing for simple question-mark Node matches"""
+ join = os.path.join
+
+ cases = (
+ ('ii?',
+ ['iii'],
+ [self.iii]),
+
+ ('both-sub?/both-eee',
+ [join('both-sub1', 'both-eee'), join('both-sub2', 'both-eee')],
+ [self.both_sub1_both_eee, self.both_sub2_both_eee]),
+
+ ('subdir?/jjj',
+ [join('subdir1', 'jjj'), join('subdir2', 'jjj')],
+ [self.subdir1_jjj, self.subdir2_jjj]),
+
+ ('disk-cc?',
+ ['disk-ccc'],
+ None),
+ )
+
+ self.do_cases(cases)
+
+ def test_does_not_exist(self):
+ """Test globbing for things that don't exist"""
+
+ cases = (
+ ('does_not_exist', [], []),
+ ('no_subdir/*', [], []),
+ ('subdir?/no_file', [], []),
+ )
+
+ self.do_cases(cases)
+
+ def test_subdir_asterisk(self):
+ """Test globbing for asterisk Node matches in subdirectories"""
+ join = os.path.join
+
+ cases = (
+ ('*/k*',
+ [join('subdir1', 'kkk'), join('subdir2', 'kkk')],
+ [self.subdir1_kkk, self.subdir2_kkk]),
+
+ ('both-sub?/*',
+ [join('both-sub1', 'both-ddd'),
+ join('both-sub1', 'both-eee'),
+ join('both-sub1', 'both-fff'),
+ join('both-sub2', 'both-ddd'),
+ join('both-sub2', 'both-eee'),
+ join('both-sub2', 'both-fff')],
+ [self.both_sub1_both_ddd,
+ self.both_sub1_both_eee,
+ self.both_sub1_both_fff,
+ self.both_sub2_both_ddd,
+ self.both_sub2_both_eee,
+ self.both_sub2_both_fff],
+ ),
+
+ ('subdir?/*',
+ [join('subdir1', 'jjj'),
+ join('subdir1', 'kkk'),
+ join('subdir1', 'lll'),
+ join('subdir2', 'jjj'),
+ join('subdir2', 'kkk'),
+ join('subdir2', 'lll')],
+ [self.subdir1_jjj, self.subdir1_kkk, self.subdir1_lll,
+ self.subdir2_jjj, self.subdir2_kkk, self.subdir2_lll]),
+
+ ('sub/*/*',
+ [join('sub', 'dir3', 'jjj'),
+ join('sub', 'dir3', 'kkk'),
+ join('sub', 'dir3', 'lll')],
+ [self.sub_dir3_jjj, self.sub_dir3_kkk, self.sub_dir3_lll]),
+
+ ('*/k*',
+ [join('subdir1', 'kkk'), join('subdir2', 'kkk')],
+ None),
+
+ ('subdir?/*',
+ [join('subdir1', 'jjj'),
+ join('subdir1', 'kkk'),
+ join('subdir1', 'lll'),
+ join('subdir2', 'jjj'),
+ join('subdir2', 'kkk'),
+ join('subdir2', 'lll')],
+ None),
+
+ ('sub/*/*',
+ [join('sub', 'dir3', 'jjj'),
+ join('sub', 'dir3', 'kkk'),
+ join('sub', 'dir3', 'lll')],
+ None),
+ )
+
+ self.do_cases(cases)
+
+ def test_subdir_question(self):
+ """Test globbing for question-mark Node matches in subdirectories"""
+ join = os.path.join
+
+ cases = (
+ ('*/?kk',
+ [join('subdir1', 'kkk'), join('subdir2', 'kkk')],
+ [self.subdir1_kkk, self.subdir2_kkk]),
+
+ ('subdir?/l?l',
+ [join('subdir1', 'lll'), join('subdir2', 'lll')],
+ [self.subdir1_lll, self.subdir2_lll]),
+
+ ('*/disk-?ff',
+ [join('disk-sub', 'disk-fff')],
+ None),
+
+ ('subdir?/l?l',
+ [join('subdir1', 'lll'), join('subdir2', 'lll')],
+ None),
+ )
+
+ self.do_cases(cases)
+
+ def test_sort(self):
+ """Test whether globbing sorts"""
+ join = os.path.join
+ # At least sometimes this should return out-of-order items
+ # if Glob doesn't sort.
+ # It's not a very good test though since it depends on the
+ # order returned by glob, which might already be sorted.
+ g = self.fs.Glob('disk-sub/*', strings=True)
+ expect = [
+ os.path.join('disk-sub', 'disk-ddd'),
+ os.path.join('disk-sub', 'disk-eee'),
+ os.path.join('disk-sub', 'disk-fff'),
+ ]
+ assert g == expect, str(g) + " is not sorted, but should be!"
+
+ g = self.fs.Glob('disk-*', strings=True)
+ expect = [ 'disk-aaa', 'disk-bbb', 'disk-ccc', 'disk-sub' ]
+ assert g == expect, str(g) + " is not sorted, but should be!"
+
+
+class RepositoryTestCase(_tempdirTestCase):
+
+ def setUp(self):
+ _tempdirTestCase.setUp(self)
+
+ self.test.subdir('rep1', 'rep2', 'rep3', 'work')
+
+ self.rep1 = self.test.workpath('rep1')
+ self.rep2 = self.test.workpath('rep2')
+ self.rep3 = self.test.workpath('rep3')
+
+ os.chdir(self.test.workpath('work'))
+
+ self.fs = SCons.Node.FS.FS()
+ self.fs.Repository(self.rep1, self.rep2, self.rep3)
+
+ def test_getRepositories(self):
+ """Test the Dir.getRepositories() method"""
+ self.fs.Repository('foo')
+ self.fs.Repository(os.path.join('foo', 'bar'))
+ self.fs.Repository('bar/foo')
+ self.fs.Repository('bar')
+
+ expect = [
+ self.rep1,
+ self.rep2,
+ self.rep3,
+ 'foo',
+ os.path.join('foo', 'bar'),
+ os.path.join('bar', 'foo'),
+ 'bar'
+ ]
+
+ rep = self.fs.Dir('#').getRepositories()
+ r = [os.path.normpath(str(x)) for x in rep]
+ assert r == expect, r
+
+ def test_get_all_rdirs(self):
+ """Test the Dir.get_all_rdirs() method"""
+ self.fs.Repository('foo')
+ self.fs.Repository(os.path.join('foo', 'bar'))
+ self.fs.Repository('bar/foo')
+ self.fs.Repository('bar')
+
+ expect = [
+ '.',
+ self.rep1,
+ self.rep2,
+ self.rep3,
+ 'foo',
+ os.path.join('foo', 'bar'),
+ os.path.join('bar', 'foo'),
+ 'bar'
+ ]
+
+ rep = self.fs.Dir('#').get_all_rdirs()
+ r = [os.path.normpath(str(x)) for x in rep]
+ assert r == expect, r
+
+ def test_rentry(self):
+ """Test the Base.entry() method"""
+ return_true = lambda: 1
+ return_false = lambda: 0
+
+ d1 = self.fs.Dir('d1')
+ d2 = self.fs.Dir('d2')
+ d3 = self.fs.Dir('d3')
+
+ e1 = self.fs.Entry('e1')
+ e2 = self.fs.Entry('e2')
+ e3 = self.fs.Entry('e3')
+
+ f1 = self.fs.File('f1')
+ f2 = self.fs.File('f2')
+ f3 = self.fs.File('f3')
+
+ self.test.write([self.rep1, 'd2'], "")
+ self.test.subdir([self.rep2, 'd3'])
+ self.test.write([self.rep3, 'd3'], "")
+
+ self.test.write([self.rep1, 'e2'], "")
+ self.test.subdir([self.rep2, 'e3'])
+ self.test.write([self.rep3, 'e3'], "")
+
+ self.test.write([self.rep1, 'f2'], "")
+ self.test.subdir([self.rep2, 'f3'])
+ self.test.write([self.rep3, 'f3'], "")
+
+ r = d1.rentry()
+ assert r is d1, r
+
+ r = d2.rentry()
+ assert not r is d2, r
+ r = str(r)
+ assert r == os.path.join(self.rep1, 'd2'), r
+
+ r = d3.rentry()
+ assert not r is d3, r
+ r = str(r)
+ assert r == os.path.join(self.rep2, 'd3'), r
+
+ r = e1.rentry()
+ assert r is e1, r
+
+ r = e2.rentry()
+ assert not r is e2, r
+ r = str(r)
+ assert r == os.path.join(self.rep1, 'e2'), r
+
+ r = e3.rentry()
+ assert not r is e3, r
+ r = str(r)
+ assert r == os.path.join(self.rep2, 'e3'), r
+
+ r = f1.rentry()
+ assert r is f1, r
+
+ r = f2.rentry()
+ assert not r is f2, r
+ r = str(r)
+ assert r == os.path.join(self.rep1, 'f2'), r
+
+ r = f3.rentry()
+ assert not r is f3, r
+ r = str(r)
+ assert r == os.path.join(self.rep2, 'f3'), r
+
+ def test_rdir(self):
+ """Test the Dir.rdir() method"""
+ def return_true(obj):
+ return 1
+ def return_false(obj):
+ return 0
+ SCons.Node._exists_map[5] = return_true
+ SCons.Node._exists_map[6] = return_false
+ SCons.Node._is_derived_map[2] = return_true
+ SCons.Node._is_derived_map[3] = return_false
+
+ d1 = self.fs.Dir('d1')
+ d2 = self.fs.Dir('d2')
+ d3 = self.fs.Dir('d3')
+
+ self.test.subdir([self.rep1, 'd2'])
+ self.test.write([self.rep2, 'd3'], "")
+ self.test.subdir([self.rep3, 'd3'])
+
+ r = d1.rdir()
+ assert r is d1, r
+
+ r = d2.rdir()
+ assert not r is d2, r
+ r = str(r)
+ assert r == os.path.join(self.rep1, 'd2'), r
+
+ r = d3.rdir()
+ assert not r is d3, r
+ r = str(r)
+ assert r == os.path.join(self.rep3, 'd3'), r
+
+ e1 = self.fs.Dir('e1')
+ e1._func_exists = 6
+ e2 = self.fs.Dir('e2')
+ e2._func_exists = 6
+
+ # Make sure we match entries in repositories,
+ # regardless of whether they're derived or not.
+
+ re1 = self.fs.Entry(os.path.join(self.rep1, 'e1'))
+ re1._func_exists = 5
+ re1._func_is_derived = 2
+ re2 = self.fs.Entry(os.path.join(self.rep2, 'e2'))
+ re2._func_exists = 5
+ re2._func_is_derived = 3
+
+ r = e1.rdir()
+ assert r is re1, r
+
+ r = e2.rdir()
+ assert r is re2, r
+
+ def test_rfile(self):
+ """Test the File.rfile() method"""
+ def return_true(obj):
+ return 1
+ def return_false(obj):
+ return 0
+ SCons.Node._exists_map[5] = return_true
+ SCons.Node._exists_map[6] = return_false
+ SCons.Node._is_derived_map[2] = return_true
+ SCons.Node._is_derived_map[3] = return_false
+
+ f1 = self.fs.File('f1')
+ f2 = self.fs.File('f2')
+ f3 = self.fs.File('f3')
+
+ self.test.write([self.rep1, 'f2'], "")
+ self.test.subdir([self.rep2, 'f3'])
+ self.test.write([self.rep3, 'f3'], "")
+
+ r = f1.rfile()
+ assert r is f1, r
+
+ r = f2.rfile()
+ assert not r is f2, r
+ r = str(r)
+ assert r == os.path.join(self.rep1, 'f2'), r
+
+ r = f3.rfile()
+ assert not r is f3, r
+ r = f3.rstr()
+ assert r == os.path.join(self.rep3, 'f3'), r
+
+ e1 = self.fs.File('e1')
+ e1._func_exists = 6
+ e2 = self.fs.File('e2')
+ e2._func_exists = 6
+
+ # Make sure we match entries in repositories,
+ # regardless of whether they're derived or not.
+
+ re1 = self.fs.Entry(os.path.join(self.rep1, 'e1'))
+ re1._func_exists = 5
+ re1._func_is_derived = 2
+ re2 = self.fs.Entry(os.path.join(self.rep2, 'e2'))
+ re2._func_exists = 5
+ re2._func_is_derived = 3
+
+ r = e1.rfile()
+ assert r is re1, r
+
+ r = e2.rfile()
+ assert r is re2, r
+
+ def test_Rfindalldirs(self):
+ """Test the Rfindalldirs() methods"""
+ fs = self.fs
+ test = self.test
+
+ d1 = fs.Dir('d1')
+ d2 = fs.Dir('d2')
+ rep1_d1 = fs.Dir(test.workpath('rep1', 'd1'))
+ rep2_d1 = fs.Dir(test.workpath('rep2', 'd1'))
+ rep3_d1 = fs.Dir(test.workpath('rep3', 'd1'))
+ sub = fs.Dir('sub')
+ sub_d1 = sub.Dir('d1')
+ rep1_sub_d1 = fs.Dir(test.workpath('rep1', 'sub', 'd1'))
+ rep2_sub_d1 = fs.Dir(test.workpath('rep2', 'sub', 'd1'))
+ rep3_sub_d1 = fs.Dir(test.workpath('rep3', 'sub', 'd1'))
+
+ r = fs.Top.Rfindalldirs((d1,))
+ assert r == [d1], list(map(str, r))
+
+ r = fs.Top.Rfindalldirs((d1, d2))
+ assert r == [d1, d2], list(map(str, r))
+
+ r = fs.Top.Rfindalldirs(('d1',))
+ assert r == [d1, rep1_d1, rep2_d1, rep3_d1], list(map(str, r))
+
+ r = fs.Top.Rfindalldirs(('#d1',))
+ assert r == [d1, rep1_d1, rep2_d1, rep3_d1], list(map(str, r))
+
+ r = sub.Rfindalldirs(('d1',))
+ assert r == [sub_d1, rep1_sub_d1, rep2_sub_d1, rep3_sub_d1], list(map(str, r))
+
+ r = sub.Rfindalldirs(('#d1',))
+ assert r == [d1, rep1_d1, rep2_d1, rep3_d1], list(map(str, r))
+
+ r = fs.Top.Rfindalldirs(('d1', d2))
+ assert r == [d1, rep1_d1, rep2_d1, rep3_d1, d2], list(map(str, r))
+
+ def test_rexists(self):
+ """Test the Entry.rexists() method"""
+ fs = self.fs
+ test = self.test
+
+ test.write([self.rep1, 'f2'], "")
+ test.write([self.rep2, "i_exist"], "\n")
+ test.write(["work", "i_exist_too"], "\n")
+
+ fs.VariantDir('build', '.')
+
+ f = fs.File(test.workpath("work", "i_do_not_exist"))
+ assert not f.rexists()
+
+ f = fs.File(test.workpath("work", "i_exist"))
+ assert f.rexists()
+
+ f = fs.File(test.workpath("work", "i_exist_too"))
+ assert f.rexists()
+
+ f1 = fs.File(os.path.join('build', 'f1'))
+ assert not f1.rexists()
+
+ f2 = fs.File(os.path.join('build', 'f2'))
+ assert f2.rexists()
+
+ def test_FAT_timestamps(self):
+ """Test repository timestamps on FAT file systems"""
+ fs = self.fs
+ test = self.test
+
+ test.write(["rep2", "tstamp"], "tstamp\n")
+ try:
+ # Okay, *this* manipulation accomodates Windows FAT file systems
+ # that only have two-second granularity on their timestamps.
+ # We round down the current time to the nearest even integer
+ # value, subtract two to make sure the timestamp is not "now,"
+ # and then convert it back to a float.
+ tstamp = float(int(time.time() // 2) * 2) - 2.0
+ os.utime(test.workpath("rep2", "tstamp"), (tstamp - 2.0, tstamp))
+ f = fs.File("tstamp")
+ t = f.get_timestamp()
+ assert t == tstamp, "expected %f, got %f" % (tstamp, t)
+ finally:
+ test.unlink(["rep2", "tstamp"])
+
+ def test_get_contents(self):
+ """Ensure get_contents() returns binary contents from Repositories"""
+ fs = self.fs
+ test = self.test
+
+ test.write(["rep3", "contents"], "Con\x1aTents\n")
+ try:
+ c = fs.File("contents").get_contents()
+ assert c == bytearray("Con\x1aTents\n",'utf-8'), "got '%s'" % c
+ finally:
+ test.unlink(["rep3", "contents"])
+
+ def test_get_text_contents(self):
+ """Ensure get_text_contents() returns text contents from
+ Repositories"""
+ fs = self.fs
+ test = self.test
+
+ # Use a test string that has a file terminator in it to make
+ # sure we read the entire file, regardless of its contents.
+ try:
+ eval('test_string = u"Con\x1aTents\n"')
+ except SyntaxError:
+ import collections
+ class FakeUnicodeString(collections.UserString):
+ def encode(self, encoding):
+ return str(self)
+ test_string = FakeUnicodeString("Con\x1aTents\n")
+
+
+ # Test with ASCII.
+ test.write(["rep3", "contents"], test_string.encode('ascii'))
+ try:
+ c = fs.File("contents").get_text_contents()
+ assert test_string == c, "got %s" % repr(c)
+ finally:
+ test.unlink(["rep3", "contents"])
+
+ # Test with utf-8
+ test.write(["rep3", "contents"], test_string.encode('utf-8'))
+ try:
+ c = fs.File("contents").get_text_contents()
+ assert test_string == c, "got %s" % repr(c)
+ finally:
+ test.unlink(["rep3", "contents"])
+
+ # Test with utf-16
+ test.write(["rep3", "contents"], test_string.encode('utf-16'))
+ try:
+ c = fs.File("contents").get_text_contents()
+ assert test_string == c, "got %s" % repr(c)
+ finally:
+ test.unlink(["rep3", "contents"])
+
+ #def test_is_up_to_date(self):
+
+
+
+class find_fileTestCase(unittest.TestCase):
+ def runTest(self):
+ """Testing find_file function"""
+ test = TestCmd(workdir = '')
+ test.write('./foo', 'Some file\n')
+ test.write('./foo2', 'Another file\n')
+ test.subdir('same')
+ test.subdir('bar')
+ test.write(['bar', 'on_disk'], 'Another file\n')
+ test.write(['bar', 'same'], 'bar/same\n')
+
+ fs = SCons.Node.FS.FS(test.workpath(""))
+ # FS doesn't like the cwd to be something other than its root.
+ os.chdir(test.workpath(""))
+
+ node_derived = fs.File(test.workpath('bar/baz'))
+ node_derived.builder_set(1) # Any non-zero value.
+ node_pseudo = fs.File(test.workpath('pseudo'))
+ node_pseudo.set_src_builder(1) # Any non-zero value.
+
+ paths = tuple(map(fs.Dir, ['.', 'same', './bar']))
+ nodes = [SCons.Node.FS.find_file('foo', paths)]
+ nodes.append(SCons.Node.FS.find_file('baz', paths))
+ nodes.append(SCons.Node.FS.find_file('pseudo', paths))
+ nodes.append(SCons.Node.FS.find_file('same', paths))
+
+ file_names = list(map(str, nodes))
+ file_names = list(map(os.path.normpath, file_names))
+ expect = ['./foo', './bar/baz', './pseudo', './bar/same']
+ expect = list(map(os.path.normpath, expect))
+ assert file_names == expect, file_names
+
+ # Make sure we don't blow up if there's already a File in place
+ # of a directory that we'd otherwise try to search. If this
+ # is broken, we'll see an exception like "Tried to lookup File
+ # 'bar/baz' as a Dir.
+ SCons.Node.FS.find_file('baz/no_file_here', paths)
+
+ import io
+ save_sys_stdout = sys.stdout
+
+ try:
+ sio = io.StringIO()
+ sys.stdout = sio
+ SCons.Node.FS.find_file('foo2', paths, verbose="xyz")
+ expect = " xyz: looking for 'foo2' in '.' ...\n" + \
+ " xyz: ... FOUND 'foo2' in '.'\n"
+ c = sio.getvalue()
+ assert c == expect, c
+
+ sio = io.StringIO()
+ sys.stdout = sio
+ SCons.Node.FS.find_file('baz2', paths, verbose=1)
+ expect = " find_file: looking for 'baz2' in '.' ...\n" + \
+ " find_file: looking for 'baz2' in 'same' ...\n" + \
+ " find_file: looking for 'baz2' in 'bar' ...\n"
+ c = sio.getvalue()
+ assert c == expect, c
+
+ sio = io.StringIO()
+ sys.stdout = sio
+ SCons.Node.FS.find_file('on_disk', paths, verbose=1)
+ expect = " find_file: looking for 'on_disk' in '.' ...\n" + \
+ " find_file: looking for 'on_disk' in 'same' ...\n" + \
+ " find_file: looking for 'on_disk' in 'bar' ...\n" + \
+ " find_file: ... FOUND 'on_disk' in 'bar'\n"
+ c = sio.getvalue()
+ assert c == expect, c
+ finally:
+ sys.stdout = save_sys_stdout
+
+class StringDirTestCase(unittest.TestCase):
+ def runTest(self):
+ """Test using a string as the second argument of
+ File() and Dir()"""
+
+ test = TestCmd(workdir = '')
+ test.subdir('sub')
+ fs = SCons.Node.FS.FS(test.workpath(''))
+
+ d = fs.Dir('sub', '.')
+ assert str(d) == 'sub', str(d)
+ assert d.exists()
+ f = fs.File('file', 'sub')
+ assert str(f) == os.path.join('sub', 'file')
+ assert not f.exists()
+
+class stored_infoTestCase(unittest.TestCase):
+ def runTest(self):
+ """Test how we store build information"""
+ test = TestCmd(workdir = '')
+ test.subdir('sub')
+ fs = SCons.Node.FS.FS(test.workpath(''))
+
+ d = fs.Dir('sub')
+ f = fs.File('file1', d)
+ bi = f.get_stored_info()
+ assert hasattr(bi, 'ninfo')
+
+ class MySConsign(object):
+ class Null(object):
+ def __init__(self):
+ self.xyzzy = 7
+ def get_entry(self, name):
+ return self.Null()
+
+ def test_sconsign(node):
+ return MySConsign()
+
+ f = fs.File('file2', d)
+ SCons.Node.FS._sconsign_map[2] = test_sconsign
+ f.dir._func_sconsign = 2
+ bi = f.get_stored_info()
+ assert bi.xyzzy == 7, bi
+
+class has_src_builderTestCase(unittest.TestCase):
+ def runTest(self):
+ """Test the has_src_builder() method"""
+ test = TestCmd(workdir = '')
+ fs = SCons.Node.FS.FS(test.workpath(''))
+ os.chdir(test.workpath(''))
+ test.subdir('sub1')
+
+ sub1 = fs.Dir('sub1', '.')
+ f1 = fs.File('f1', sub1)
+ f2 = fs.File('f2', sub1)
+ f3 = fs.File('f3', sub1)
+
+ h = f1.has_src_builder()
+ assert not h, h
+ h = f1.has_builder()
+ assert not h, h
+
+ b1 = Builder(fs.File)
+ sub1.set_src_builder(b1)
+
+ test.write(['sub1', 'f2'], "sub1/f2\n")
+ h = f1.has_src_builder() # cached from previous call
+ assert not h, h
+ h = f1.has_builder() # cached from previous call
+ assert not h, h
+ h = f2.has_src_builder()
+ assert not h, h
+ h = f2.has_builder()
+ assert not h, h
+ h = f3.has_src_builder()
+ assert h, h
+ h = f3.has_builder()
+ assert h, h
+ assert f3.builder is b1, f3.builder
+
+class prepareTestCase(unittest.TestCase):
+ def runTest(self):
+ """Test the prepare() method"""
+
+ class MyFile(SCons.Node.FS.File):
+ def _createDir(self, update=None):
+ raise SCons.Errors.StopError
+ def exists(self):
+ return None
+
+ fs = SCons.Node.FS.FS()
+ file = MyFile('foo', fs.Dir('.'), fs)
+
+ exc_caught = 0
+ try:
+ file.prepare()
+ except SCons.Errors.StopError:
+ exc_caught = 1
+ assert exc_caught, "Should have caught a StopError."
+
+ class MkdirAction(Action):
+ def __init__(self, dir_made):
+ self.dir_made = dir_made
+ def __call__(self, target, source, env, executor=None):
+ if executor:
+ target = executor.get_all_targets()
+ source = executor.get_all_sources()
+ self.dir_made.extend(target)
+
+ dir_made = []
+ new_dir = fs.Dir("new_dir")
+ new_dir.builder = Builder(fs.Dir, action=MkdirAction(dir_made))
+ new_dir.reset_executor()
+ xyz = fs.File(os.path.join("new_dir", "xyz"))
+
+ xyz.set_state(SCons.Node.up_to_date)
+ xyz.prepare()
+ assert dir_made == [], dir_made
+
+ xyz.set_state(0)
+ xyz.prepare()
+ assert dir_made[0].get_internal_path() == "new_dir", dir_made[0]
+
+ dir = fs.Dir("dir")
+ dir.prepare()
+
+
+
+class SConstruct_dirTestCase(unittest.TestCase):
+ def runTest(self):
+ """Test setting the SConstruct directory"""
+
+ fs = SCons.Node.FS.FS()
+ fs.set_SConstruct_dir(fs.Dir('xxx'))
+ assert fs.SConstruct_dir.get_internal_path() == 'xxx'
+
+
+
+class CacheDirTestCase(unittest.TestCase):
+
+ def test_get_cachedir_csig(self):
+ fs = SCons.Node.FS.FS()
+
+ f9 = fs.File('f9')
+ r = f9.get_cachedir_csig()
+ assert r == 'd41d8cd98f00b204e9800998ecf8427e', r
+
+
+
+class clearTestCase(unittest.TestCase):
+ def runTest(self):
+ """Test clearing FS nodes of cached data."""
+ fs = SCons.Node.FS.FS()
+ test = TestCmd(workdir='')
+
+ e = fs.Entry('e')
+ assert not e.exists()
+ assert not e.rexists()
+ assert str(e) == 'e', str(d)
+ e.clear()
+ assert not e.exists()
+ assert not e.rexists()
+ assert str(e) == 'e', str(d)
+
+ d = fs.Dir(test.workpath('d'))
+ test.subdir('d')
+ assert d.exists()
+ assert d.rexists()
+ assert str(d) == test.workpath('d'), str(d)
+ fs.rename(test.workpath('d'), test.workpath('gone'))
+ # Verify caching is active
+ assert d.exists(), 'caching not active'
+ assert d.rexists()
+ assert str(d) == test.workpath('d'), str(d)
+ # Now verify clear() resets the cache
+ d.clear()
+ assert not d.exists()
+ assert not d.rexists()
+ assert str(d) == test.workpath('d'), str(d)
+
+ f = fs.File(test.workpath('f'))
+ test.write(test.workpath('f'), 'file f')
+ assert f.exists()
+ assert f.rexists()
+ assert str(f) == test.workpath('f'), str(f)
+ # Verify caching is active
+ test.unlink(test.workpath('f'))
+ assert f.exists()
+ assert f.rexists()
+ assert str(f) == test.workpath('f'), str(f)
+ # Now verify clear() resets the cache
+ f.clear()
+ assert not f.exists()
+ assert not f.rexists()
+ assert str(f) == test.workpath('f'), str(f)
+
+
+
+class disambiguateTestCase(unittest.TestCase):
+ def runTest(self):
+ """Test calling the disambiguate() method."""
+ test = TestCmd(workdir='')
+
+ fs = SCons.Node.FS.FS()
+
+ ddd = fs.Dir('ddd')
+ d = ddd.disambiguate()
+ assert d is ddd, d
+
+ fff = fs.File('fff')
+ f = fff.disambiguate()
+ assert f is fff, f
+
+ test.subdir('edir')
+ test.write('efile', "efile\n")
+
+ edir = fs.Entry(test.workpath('edir'))
+ d = edir.disambiguate()
+ assert d.__class__ is ddd.__class__, d.__class__
+
+ efile = fs.Entry(test.workpath('efile'))
+ f = efile.disambiguate()
+ assert f.__class__ is fff.__class__, f.__class__
+
+ test.subdir('build')
+ test.subdir(['build', 'bdir'])
+ test.write(['build', 'bfile'], "build/bfile\n")
+
+ test.subdir('src')
+ test.write(['src', 'bdir'], "src/bdir\n")
+ test.subdir(['src', 'bfile'])
+
+ test.subdir(['src', 'edir'])
+ test.write(['src', 'efile'], "src/efile\n")
+
+ fs.VariantDir(test.workpath('build'), test.workpath('src'))
+
+ build_bdir = fs.Entry(test.workpath('build/bdir'))
+ d = build_bdir.disambiguate()
+ assert d is build_bdir, d
+ assert d.__class__ is ddd.__class__, d.__class__
+
+ build_bfile = fs.Entry(test.workpath('build/bfile'))
+ f = build_bfile.disambiguate()
+ assert f is build_bfile, f
+ assert f.__class__ is fff.__class__, f.__class__
+
+ build_edir = fs.Entry(test.workpath('build/edir'))
+ d = build_edir.disambiguate()
+ assert d.__class__ is ddd.__class__, d.__class__
+
+ build_efile = fs.Entry(test.workpath('build/efile'))
+ f = build_efile.disambiguate()
+ assert f.__class__ is fff.__class__, f.__class__
+
+ build_nonexistant = fs.Entry(test.workpath('build/nonexistant'))
+ f = build_nonexistant.disambiguate()
+ assert f.__class__ is fff.__class__, f.__class__
+
+class postprocessTestCase(unittest.TestCase):
+ def runTest(self):
+ """Test calling the postprocess() method."""
+ fs = SCons.Node.FS.FS()
+
+ e = fs.Entry('e')
+ e.postprocess()
+
+ d = fs.Dir('d')
+ d.postprocess()
+
+ f = fs.File('f')
+ f.postprocess()
+
+
+
+class SpecialAttrTestCase(unittest.TestCase):
+ def runTest(self):
+ """Test special attributes of file nodes."""
+ test=TestCmd(workdir='')
+ fs = SCons.Node.FS.FS(test.workpath('work'))
+
+ f = fs.Entry('foo/bar/baz.blat').get_subst_proxy()
+
+ s = str(f.dir)
+ assert s == os.path.normpath('foo/bar'), s
+ assert f.dir.is_literal(), f.dir
+ for_sig = f.dir.for_signature()
+ assert for_sig == 'bar', for_sig
+
+ s = str(f.file)
+ assert s == 'baz.blat', s
+ assert f.file.is_literal(), f.file
+ for_sig = f.file.for_signature()
+ assert for_sig == 'baz.blat_file', for_sig
+
+ s = str(f.base)
+ assert s == os.path.normpath('foo/bar/baz'), s
+ assert f.base.is_literal(), f.base
+ for_sig = f.base.for_signature()
+ assert for_sig == 'baz.blat_base', for_sig
+
+ s = str(f.filebase)
+ assert s == 'baz', s
+ assert f.filebase.is_literal(), f.filebase
+ for_sig = f.filebase.for_signature()
+ assert for_sig == 'baz.blat_filebase', for_sig
+
+ s = str(f.suffix)
+ assert s == '.blat', s
+ assert f.suffix.is_literal(), f.suffix
+ for_sig = f.suffix.for_signature()
+ assert for_sig == 'baz.blat_suffix', for_sig
+
+ s = str(f.get_abspath())
+ assert s == test.workpath('work', 'foo', 'bar', 'baz.blat'), s
+ assert f.abspath.is_literal(), f.abspath
+ for_sig = f.abspath.for_signature()
+ assert for_sig == 'baz.blat_abspath', for_sig
+
+ s = str(f.posix)
+ assert s == 'foo/bar/baz.blat', s
+ assert f.posix.is_literal(), f.posix
+ if f.posix != f:
+ for_sig = f.posix.for_signature()
+ assert for_sig == 'baz.blat_posix', for_sig
+
+ s = str(f.windows)
+ assert s == 'foo\\bar\\baz.blat', repr(s)
+ assert f.windows.is_literal(), f.windows
+ if f.windows != f:
+ for_sig = f.windows.for_signature()
+ assert for_sig == 'baz.blat_windows', for_sig
+
+ # Deprecated synonym for the .windows suffix.
+ s = str(f.win32)
+ assert s == 'foo\\bar\\baz.blat', repr(s)
+ assert f.win32.is_literal(), f.win32
+ if f.win32 != f:
+ for_sig = f.win32.for_signature()
+ assert for_sig == 'baz.blat_windows', for_sig
+
+ # And now, combinations!!!
+ s = str(f.srcpath.base)
+ assert s == os.path.normpath('foo/bar/baz'), s
+ s = str(f.srcpath.dir)
+ assert s == str(f.srcdir), s
+ s = str(f.srcpath.posix)
+ assert s == 'foo/bar/baz.blat', s
+ s = str(f.srcpath.windows)
+ assert s == 'foo\\bar\\baz.blat', s
+ s = str(f.srcpath.win32)
+ assert s == 'foo\\bar\\baz.blat', s
+
+ # Test what happens with VariantDir()
+ fs.VariantDir('foo', 'baz')
+
+ s = str(f.srcpath)
+ assert s == os.path.normpath('baz/bar/baz.blat'), s
+ assert f.srcpath.is_literal(), f.srcpath
+ g = f.srcpath.get()
+ assert isinstance(g, SCons.Node.FS.File), g.__class__
+
+ s = str(f.srcdir)
+ assert s == os.path.normpath('baz/bar'), s
+ assert f.srcdir.is_literal(), f.srcdir
+ g = f.srcdir.get()
+ assert isinstance(g, SCons.Node.FS.Dir), g.__class__
+
+ # And now what happens with VariantDir() + Repository()
+ fs.Repository(test.workpath('repository'))
+
+ f = fs.Entry('foo/sub/file.suffix').get_subst_proxy()
+ test.subdir('repository',
+ ['repository', 'baz'],
+ ['repository', 'baz', 'sub'])
+
+ rd = test.workpath('repository', 'baz', 'sub')
+ rf = test.workpath('repository', 'baz', 'sub', 'file.suffix')
+ test.write(rf, "\n")
+
+ s = str(f.srcpath)
+ assert s == os.path.normpath('baz/sub/file.suffix'), s
+ assert f.srcpath.is_literal(), f.srcpath
+ g = f.srcpath.get()
+ # Gets disambiguated to SCons.Node.FS.File by get_subst_proxy().
+ assert isinstance(g, SCons.Node.FS.File), g.__class__
+
+ s = str(f.srcdir)
+ assert s == os.path.normpath('baz/sub'), s
+ assert f.srcdir.is_literal(), f.srcdir
+ g = f.srcdir.get()
+ assert isinstance(g, SCons.Node.FS.Dir), g.__class__
+
+ s = str(f.rsrcpath)
+ assert s == rf, s
+ assert f.rsrcpath.is_literal(), f.rsrcpath
+ g = f.rsrcpath.get()
+ assert isinstance(g, SCons.Node.FS.File), g.__class__
+
+ s = str(f.rsrcdir)
+ assert s == rd, s
+ assert f.rsrcdir.is_literal(), f.rsrcdir
+ g = f.rsrcdir.get()
+ assert isinstance(g, SCons.Node.FS.Dir), g.__class__
+
+ # Check that attempts to access non-existent attributes of the
+ # subst proxy generate the right exceptions and messages.
+ caught = None
+ try:
+ fs.Dir('ddd').get_subst_proxy().no_such_attr
+ except AttributeError as e:
+ assert str(e) == "Dir instance 'ddd' has no attribute 'no_such_attr'", e
+ caught = 1
+ assert caught, "did not catch expected AttributeError"
+
+ caught = None
+ try:
+ fs.Entry('eee').get_subst_proxy().no_such_attr
+ except AttributeError as e:
+ # Gets disambiguated to File instance by get_subst_proxy().
+ assert str(e) == "File instance 'eee' has no attribute 'no_such_attr'", e
+ caught = 1
+ assert caught, "did not catch expected AttributeError"
+
+ caught = None
+ try:
+ fs.File('fff').get_subst_proxy().no_such_attr
+ except AttributeError as e:
+ assert str(e) == "File instance 'fff' has no attribute 'no_such_attr'", e
+ caught = 1
+ assert caught, "did not catch expected AttributeError"
+
+
+
+class SaveStringsTestCase(unittest.TestCase):
+ def runTest(self):
+ """Test caching string values of nodes."""
+ test=TestCmd(workdir='')
+
+ def setup(fs):
+ fs.Dir('src')
+ fs.Dir('d0')
+ fs.Dir('d1')
+
+ d0_f = fs.File('d0/f')
+ d1_f = fs.File('d1/f')
+ d0_b = fs.File('d0/b')
+ d1_b = fs.File('d1/b')
+ d1_f.duplicate = 1
+ d1_b.duplicate = 1
+ d0_b.builder = 1
+ d1_b.builder = 1
+
+ return [d0_f, d1_f, d0_b, d1_b]
+
+ def modify(nodes):
+ d0_f, d1_f, d0_b, d1_b = nodes
+ d1_f.duplicate = 0
+ d1_b.duplicate = 0
+ d0_b.builder = 0
+ d1_b.builder = 0
+
+ fs1 = SCons.Node.FS.FS(test.workpath('fs1'))
+ nodes = setup(fs1)
+ fs1.VariantDir('d0', 'src', duplicate=0)
+ fs1.VariantDir('d1', 'src', duplicate=1)
+
+ s = list(map(str, nodes))
+ expect = list(map(os.path.normpath, ['src/f', 'd1/f', 'd0/b', 'd1/b']))
+ assert s == expect, s
+
+ modify(nodes)
+
+ s = list(map(str, nodes))
+ expect = list(map(os.path.normpath, ['src/f', 'src/f', 'd0/b', 'd1/b']))
+ assert s == expect, s
+
+ SCons.Node.FS.save_strings(1)
+ fs2 = SCons.Node.FS.FS(test.workpath('fs2'))
+ nodes = setup(fs2)
+ fs2.VariantDir('d0', 'src', duplicate=0)
+ fs2.VariantDir('d1', 'src', duplicate=1)
+
+ s = list(map(str, nodes))
+ expect = list(map(os.path.normpath, ['src/f', 'd1/f', 'd0/b', 'd1/b']))
+ assert s == expect, s
+
+ modify(nodes)
+
+ s = list(map(str, nodes))
+ expect = list(map(os.path.normpath, ['src/f', 'd1/f', 'd0/b', 'd1/b']))
+ assert s == expect, 'node str() not cached: %s'%s
+
+
+class AbsolutePathTestCase(unittest.TestCase):
+ def test_root_lookup_equivalence(self):
+ """Test looking up /fff vs. fff in the / directory"""
+ test=TestCmd(workdir='')
+
+ fs = SCons.Node.FS.FS('/')
+
+ save_cwd = os.getcwd()
+ try:
+ os.chdir('/')
+ fff1 = fs.File('fff')
+ fff2 = fs.File('/fff')
+ assert fff1 is fff2, "fff and /fff returned different Nodes!"
+ finally:
+ os.chdir(save_cwd)
+
+
+
+if __name__ == "__main__":
+ suite = unittest.TestSuite()
+ suite.addTest(VariantDirTestCase())
+ suite.addTest(find_fileTestCase())
+ suite.addTest(StringDirTestCase())
+ suite.addTest(stored_infoTestCase())
+ suite.addTest(has_src_builderTestCase())
+ suite.addTest(prepareTestCase())
+ suite.addTest(SConstruct_dirTestCase())
+ suite.addTest(clearTestCase())
+ suite.addTest(disambiguateTestCase())
+ suite.addTest(postprocessTestCase())
+ suite.addTest(SpecialAttrTestCase())
+ suite.addTest(SaveStringsTestCase())
+ tclasses = [
+ AbsolutePathTestCase,
+ BaseTestCase,
+ CacheDirTestCase,
+ DirTestCase,
+ DirBuildInfoTestCase,
+ DirNodeInfoTestCase,
+ EntryTestCase,
+ FileTestCase,
+ FileBuildInfoTestCase,
+ FileNodeInfoTestCase,
+ FSTestCase,
+ GlobTestCase,
+ RepositoryTestCase,
+ ]
+ for tclass in tclasses:
+ names = unittest.getTestCaseNames(tclass, 'test_')
+ suite.addTests(list(map(tclass, names)))
+ TestUnit.run(suite)
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Node/NodeTests.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Node/NodeTests.py
new file mode 100644
index 0000000..3802f8c
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Node/NodeTests.py
@@ -0,0 +1,1366 @@
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import SCons.compat
+
+import collections
+import os
+import re
+import sys
+import unittest
+
+import TestUnit
+
+import SCons.Errors
+import SCons.Node
+import SCons.Util
+
+
+
+built_it = None
+built_target = None
+built_source = None
+cycle_detected = None
+built_order = 0
+
+def _actionAppend(a1, a2):
+ all = []
+ for curr_a in [a1, a2]:
+ if isinstance(curr_a, MyAction):
+ all.append(curr_a)
+ elif isinstance(curr_a, MyListAction):
+ all.extend(curr_a.list)
+ elif isinstance(curr_a, list):
+ all.extend(curr_a)
+ else:
+ raise Exception('Cannot Combine Actions')
+ return MyListAction(all)
+
+class MyActionBase(object):
+ def __add__(self, other):
+ return _actionAppend(self, other)
+
+ def __radd__(self, other):
+ return _actionAppend(other, self)
+
+class MyAction(MyActionBase):
+ def __init__(self):
+ self.order = 0
+
+ def __call__(self, target, source, env, executor=None):
+ global built_it, built_target, built_source, built_args, built_order
+ if executor:
+ target = executor.get_all_targets()
+ source = executor.get_all_sources()
+ built_it = 1
+ built_target = target
+ built_source = source
+ built_args = env
+ built_order = built_order + 1
+ self.order = built_order
+ return 0
+
+ def get_implicit_deps(self, target, source, env):
+ return []
+
+class MyExecutor(object):
+ def __init__(self, env=None, targets=[], sources=[]):
+ self.env = env
+ self.targets = targets
+ self.sources = sources
+ def get_build_env(self):
+ return self.env
+ def get_build_scanner_path(self, scanner):
+ return 'executor would call %s' % scanner
+ def cleanup(self):
+ self.cleaned_up = 1
+ def scan_targets(self, scanner):
+ if not scanner:
+ return
+ d = scanner(self.targets)
+ for t in self.targets:
+ t.implicit.extend(d)
+ def scan_sources(self, scanner):
+ if not scanner:
+ return
+ d = scanner(self.sources)
+ for t in self.targets:
+ t.implicit.extend(d)
+
+class MyListAction(MyActionBase):
+ def __init__(self, list):
+ self.list = list
+ def __call__(self, target, source, env):
+ for A in self.list:
+ A(target, source, env)
+
+class Environment(object):
+ def __init__(self, **kw):
+ self._dict = {}
+ self._dict.update(kw)
+ def __getitem__(self, key):
+ return self._dict[key]
+ def get(self, key, default = None):
+ return self._dict.get(key, default)
+ def Dictionary(self, *args):
+ return {}
+ def Override(self, overrides):
+ d = self._dict.copy()
+ d.update(overrides)
+ return Environment(**d)
+ def _update(self, dict):
+ self._dict.update(dict)
+ def get_factory(self, factory):
+ return factory or MyNode
+ def get_scanner(self, scanner_key):
+ try:
+ return self._dict['SCANNERS'][0]
+ except:
+ pass
+
+ return []
+
+class Builder(object):
+ def __init__(self, env=None, is_explicit=1):
+ if env is None: env = Environment()
+ self.env = env
+ self.overrides = {}
+ self.action = MyAction()
+ self.source_factory = MyNode
+ self.is_explicit = is_explicit
+ self.target_scanner = None
+ self.source_scanner = None
+ def targets(self, t):
+ return [t]
+ def get_actions(self):
+ return [self.action]
+ def get_contents(self, target, source, env):
+ return 7
+
+class NoneBuilder(Builder):
+ def execute(self, target, source, env):
+ Builder.execute(self, target, source, env)
+ return None
+
+class ListBuilder(Builder):
+ def __init__(self, *nodes):
+ Builder.__init__(self)
+ self.nodes = nodes
+ def execute(self, target, source, env):
+ if hasattr(self, 'status'):
+ return self.status
+ for n in self.nodes:
+ n.prepare()
+ target = self.nodes[0]
+ self.status = Builder.execute(self, target, source, env)
+
+class FailBuilder(object):
+ def execute(self, target, source, env):
+ return 1
+
+class ExceptBuilder(object):
+ def execute(self, target, source, env):
+ raise SCons.Errors.BuildError
+
+class ExceptBuilder2(object):
+ def execute(self, target, source, env):
+ raise Exception("foo")
+
+class Scanner(object):
+ called = None
+ def __call__(self, node):
+ self.called = 1
+ return node.GetTag('found_includes')
+ def path(self, env, dir=None, target=None, source=None, kw={}):
+ return ()
+ def select(self, node):
+ return self
+ def recurse_nodes(self, nodes):
+ return nodes
+
+class MyNode(SCons.Node.Node):
+ """The base Node class contains a number of do-nothing methods that
+ we expect to be overridden by real, functional Node subclasses. So
+ simulate a real, functional Node subclass.
+ """
+ def __init__(self, name):
+ SCons.Node.Node.__init__(self)
+ self.name = name
+ self.Tag('found_includes', [])
+ def __str__(self):
+ return self.name
+ def get_found_includes(self, env, scanner, target):
+ return scanner(self)
+
+class Calculator(object):
+ def __init__(self, val):
+ self.max_drift = 0
+ class M(object):
+ def __init__(self, val):
+ self.val = val
+ def signature(self, args):
+ return self.val
+ def collect(self, args):
+ result = self.val
+ for a in args:
+ result += a
+ return result
+ self.module = M(val)
+
+
+
+class NodeInfoBaseTestCase(unittest.TestCase):
+ # The abstract class NodeInfoBase has not enough default slots to perform
+ # the merge and format test (arbitrary attributes do not work). Do it with a
+ # derived class that does provide the slots.
+
+ def test_merge(self):
+ """Test merging NodeInfoBase attributes"""
+
+ class TestNodeInfo(SCons.Node.NodeInfoBase):
+ __slots__ = ('a1', 'a2', 'a3')
+
+ ni1 = TestNodeInfo()
+ ni2 = TestNodeInfo()
+
+ ni1.a1 = 1
+ ni1.a2 = 2
+
+ ni2.a2 = 222
+ ni2.a3 = 333
+
+ ni1.merge(ni2)
+ assert ni1.a1 == 1, ni1.a1
+ assert ni1.a2 == 222, ni1.a2
+ assert ni1.a3 == 333, ni1.a3
+
+ def test_update(self):
+ """Test the update() method"""
+ ni = SCons.Node.NodeInfoBase()
+ ni.update(SCons.Node.Node())
+
+ def test_format(self):
+ """Test the NodeInfoBase.format() method"""
+
+ class TestNodeInfo(SCons.Node.NodeInfoBase):
+ __slots__ = ('xxx', 'yyy', 'zzz')
+
+ ni1 = TestNodeInfo()
+ ni1.xxx = 'x'
+ ni1.yyy = 'y'
+ ni1.zzz = 'z'
+
+ f = ni1.format()
+ assert f == ['x', 'y', 'z'], f
+
+ field_list = ['xxx', 'zzz', 'aaa']
+
+ f = ni1.format(field_list)
+ assert f == ['x', 'z', 'None'], f
+
+
+
+class BuildInfoBaseTestCase(unittest.TestCase):
+
+ def test___init__(self):
+ """Test BuildInfoBase initialization"""
+ n = SCons.Node.Node()
+ bi = SCons.Node.BuildInfoBase()
+ assert bi
+
+ def test_merge(self):
+ """Test merging BuildInfoBase attributes"""
+ n1 = SCons.Node.Node()
+ bi1 = SCons.Node.BuildInfoBase()
+ n2 = SCons.Node.Node()
+ bi2 = SCons.Node.BuildInfoBase()
+
+ bi1.bsources = 1
+ bi1.bdepends = 2
+
+ bi2.bdepends = 222
+ bi2.bact = 333
+
+ bi1.merge(bi2)
+ assert bi1.bsources == 1, bi1.bsources
+ assert bi1.bdepends == 222, bi1.bdepends
+ assert bi1.bact == 333, bi1.bact
+
+
+class NodeTestCase(unittest.TestCase):
+
+ def test_build(self):
+ """Test building a node
+ """
+ global built_it, built_order
+
+ # Make sure it doesn't blow up if no builder is set.
+ node = MyNode("www")
+ node.build()
+ assert built_it is None
+ node.build(extra_kw_argument = 1)
+ assert built_it is None
+
+ node = MyNode("xxx")
+ node.builder_set(Builder())
+ node.env_set(Environment())
+ node.path = "xxx"
+ node.sources = ["yyy", "zzz"]
+ node.build()
+ assert built_it
+ assert built_target == [node], built_target
+ assert built_source == ["yyy", "zzz"], built_source
+
+ built_it = None
+ node = MyNode("qqq")
+ node.builder_set(NoneBuilder())
+ node.env_set(Environment())
+ node.path = "qqq"
+ node.sources = ["rrr", "sss"]
+ node.builder.overrides = { "foo" : 1, "bar" : 2 }
+ node.build()
+ assert built_it
+ assert built_target == [node], built_target
+ assert built_source == ["rrr", "sss"], built_source
+ assert built_args["foo"] == 1, built_args
+ assert built_args["bar"] == 2, built_args
+
+ fff = MyNode("fff")
+ ggg = MyNode("ggg")
+ lb = ListBuilder(fff, ggg)
+ e = Environment()
+ fff.builder_set(lb)
+ fff.env_set(e)
+ fff.path = "fff"
+ ggg.builder_set(lb)
+ ggg.env_set(e)
+ ggg.path = "ggg"
+ fff.sources = ["hhh", "iii"]
+ ggg.sources = ["hhh", "iii"]
+ built_it = None
+ fff.build()
+ assert built_it
+ assert built_target == [fff], built_target
+ assert built_source == ["hhh", "iii"], built_source
+ built_it = None
+ ggg.build()
+ assert built_it
+ assert built_target == [ggg], built_target
+ assert built_source == ["hhh", "iii"], built_source
+
+ built_it = None
+ jjj = MyNode("jjj")
+ b = Builder()
+ jjj.builder_set(b)
+ # NOTE: No env_set()! We should pull the environment from the builder.
+ b.env = Environment()
+ b.overrides = { "on" : 3, "off" : 4 }
+ e.builder = b
+ jjj.build()
+ assert built_it
+ assert built_target[0] == jjj, built_target[0]
+ assert built_source == [], built_source
+ assert built_args["on"] == 3, built_args
+ assert built_args["off"] == 4, built_args
+
+ def test_get_build_scanner_path(self):
+ """Test the get_build_scanner_path() method"""
+ n = SCons.Node.Node()
+ x = MyExecutor()
+ n.set_executor(x)
+ p = n.get_build_scanner_path('fake_scanner')
+ assert p == "executor would call fake_scanner", p
+
+ def test_get_executor(self):
+ """Test the get_executor() method"""
+ n = SCons.Node.Node()
+
+ try:
+ n.get_executor(0)
+ except AttributeError:
+ pass
+ else:
+ self.fail("did not catch expected AttributeError")
+
+ class Builder(object):
+ action = 'act'
+ env = 'env1'
+ overrides = {}
+
+ n = SCons.Node.Node()
+ n.builder_set(Builder())
+ x = n.get_executor()
+ assert x.env == 'env1', x.env
+
+ n = SCons.Node.Node()
+ n.builder_set(Builder())
+ n.env_set('env2')
+ x = n.get_executor()
+ assert x.env == 'env2', x.env
+
+ def test_set_executor(self):
+ """Test the set_executor() method"""
+ n = SCons.Node.Node()
+ n.set_executor(1)
+ assert n.executor == 1, n.executor
+
+ def test_executor_cleanup(self):
+ """Test letting the executor cleanup its cache"""
+ n = SCons.Node.Node()
+ x = MyExecutor()
+ n.set_executor(x)
+ n.executor_cleanup()
+ assert x.cleaned_up
+
+ def test_reset_executor(self):
+ """Test the reset_executor() method"""
+ n = SCons.Node.Node()
+ n.set_executor(1)
+ assert n.executor == 1, n.executor
+ n.reset_executor()
+ assert not hasattr(n, 'executor'), "unexpected executor attribute"
+
+ def test_built(self):
+ """Test the built() method"""
+ class SubNodeInfo(SCons.Node.NodeInfoBase):
+ __slots__ = ('updated',)
+ def update(self, node):
+ self.updated = 1
+ class SubNode(SCons.Node.Node):
+ def clear(self):
+ self.cleared = 1
+
+ n = SubNode()
+ n.ninfo = SubNodeInfo()
+ n.built()
+ assert n.cleared, n.cleared
+ assert n.ninfo.updated, n.ninfo.cleared
+
+ def test_push_to_cache(self):
+ """Test the base push_to_cache() method"""
+ n = SCons.Node.Node()
+ r = n.push_to_cache()
+ assert r is None, r
+
+ def test_retrieve_from_cache(self):
+ """Test the base retrieve_from_cache() method"""
+ n = SCons.Node.Node()
+ r = n.retrieve_from_cache()
+ assert r == 0, r
+
+ def test_visited(self):
+ """Test the base visited() method
+
+ Just make sure it's there and we can call it.
+ """
+ n = SCons.Node.Node()
+ n.visited()
+
+ def test_builder_set(self):
+ """Test setting a Node's Builder
+ """
+ node = SCons.Node.Node()
+ b = Builder()
+ node.builder_set(b)
+ assert node.builder == b
+
+ def test_has_builder(self):
+ """Test the has_builder() method
+ """
+ n1 = SCons.Node.Node()
+ assert n1.has_builder() == 0
+ n1.builder_set(Builder())
+ assert n1.has_builder() == 1
+
+ def test_has_explicit_builder(self):
+ """Test the has_explicit_builder() method
+ """
+ n1 = SCons.Node.Node()
+ assert not n1.has_explicit_builder()
+ n1.set_explicit(1)
+ assert n1.has_explicit_builder()
+ n1.set_explicit(None)
+ assert not n1.has_explicit_builder()
+
+ def test_get_builder(self):
+ """Test the get_builder() method"""
+ n1 = SCons.Node.Node()
+ b = n1.get_builder()
+ assert b is None, b
+ b = n1.get_builder(777)
+ assert b == 777, b
+ n1.builder_set(888)
+ b = n1.get_builder()
+ assert b == 888, b
+ b = n1.get_builder(999)
+ assert b == 888, b
+
+ def test_multiple_side_effect_has_builder(self):
+ """Test the multiple_side_effect_has_builder() method
+ """
+ n1 = SCons.Node.Node()
+ assert n1.multiple_side_effect_has_builder() == 0
+ n1.builder_set(Builder())
+ assert n1.multiple_side_effect_has_builder() == 1
+
+ def test_is_derived(self):
+ """Test the is_derived() method
+ """
+ n1 = SCons.Node.Node()
+ n2 = SCons.Node.Node()
+ n3 = SCons.Node.Node()
+
+ n2.builder_set(Builder())
+ n3.side_effect = 1
+
+ assert n1.is_derived() == 0
+ assert n2.is_derived() == 1
+ assert n3.is_derived() == 1
+
+ def test_alter_targets(self):
+ """Test the alter_targets() method
+ """
+ n = SCons.Node.Node()
+ t, m = n.alter_targets()
+ assert t == [], t
+ assert m is None, m
+
+ def test_is_up_to_date(self):
+ """Test the default is_up_to_date() method
+ """
+ node = SCons.Node.Node()
+ assert node.is_up_to_date() is None
+
+ def test_children_are_up_to_date(self):
+ """Test the children_are_up_to_date() method used by subclasses
+ """
+ n1 = SCons.Node.Node()
+ n2 = SCons.Node.Node()
+
+ n1.add_source([n2])
+ assert n1.children_are_up_to_date(), "expected up to date"
+ n2.set_state(SCons.Node.executed)
+ assert not n1.children_are_up_to_date(), "expected not up to date"
+ n2.set_state(SCons.Node.up_to_date)
+ assert n1.children_are_up_to_date(), "expected up to date"
+ n1.always_build = 1
+ assert not n1.children_are_up_to_date(), "expected not up to date"
+
+ def test_env_set(self):
+ """Test setting a Node's Environment
+ """
+ node = SCons.Node.Node()
+ e = Environment()
+ node.env_set(e)
+ assert node.env == e
+
+ def test_get_actions(self):
+ """Test fetching a Node's action list
+ """
+ node = SCons.Node.Node()
+ node.builder_set(Builder())
+ a = node.builder.get_actions()
+ assert isinstance(a[0], MyAction), a[0]
+
+ def test_get_csig(self):
+ """Test generic content signature calculation
+ """
+
+ class TestNodeInfo(SCons.Node.NodeInfoBase):
+ __slots__ = ('csig',)
+ try:
+ SCons.Node.Node.NodeInfo = TestNodeInfo
+ def my_contents(obj):
+ return 444
+ SCons.Node._get_contents_map[4] = my_contents
+ node = SCons.Node.Node()
+ node._func_get_contents = 4
+ result = node.get_csig()
+ assert result == '550a141f12de6341fba65b0ad0433500', result
+ finally:
+ SCons.Node.Node.NodeInfo = SCons.Node.NodeInfoBase
+
+ def test_get_cachedir_csig(self):
+ """Test content signature calculation for CacheDir
+ """
+ class TestNodeInfo(SCons.Node.NodeInfoBase):
+ __slots__ = ('csig',)
+ try:
+ SCons.Node.Node.NodeInfo = TestNodeInfo
+ def my_contents(obj):
+ return 555
+ SCons.Node._get_contents_map[4] = my_contents
+ node = SCons.Node.Node()
+ node._func_get_contents = 4
+ result = node.get_cachedir_csig()
+ assert result == '15de21c670ae7c3f6f3f1f37029303c9', result
+ finally:
+ SCons.Node.Node.NodeInfo = SCons.Node.NodeInfoBase
+
+ def test_get_binfo(self):
+ """Test fetching/creating a build information structure
+ """
+ class TestNodeInfo(SCons.Node.NodeInfoBase):
+ __slots__ = ('csig',)
+ SCons.Node.Node.NodeInfo = TestNodeInfo
+ node = SCons.Node.Node()
+
+ binfo = node.get_binfo()
+ assert isinstance(binfo, SCons.Node.BuildInfoBase), binfo
+
+ node = SCons.Node.Node()
+ d = SCons.Node.Node()
+ ninfo = d.get_ninfo()
+ assert isinstance(ninfo, SCons.Node.NodeInfoBase), ninfo
+ i = SCons.Node.Node()
+ ninfo = i.get_ninfo()
+ assert isinstance(ninfo, SCons.Node.NodeInfoBase), ninfo
+ node.depends = [d]
+ node.implicit = [i]
+
+ binfo = node.get_binfo()
+ assert isinstance(binfo, SCons.Node.BuildInfoBase), binfo
+ assert hasattr(binfo, 'bsources')
+ assert hasattr(binfo, 'bsourcesigs')
+ assert binfo.bdepends == [d]
+ assert hasattr(binfo, 'bdependsigs')
+ assert binfo.bimplicit == [i]
+ assert hasattr(binfo, 'bimplicitsigs')
+
+ def test_explain(self):
+ """Test explaining why a Node must be rebuilt
+ """
+ class testNode(SCons.Node.Node):
+ def __str__(self): return 'xyzzy'
+ node = testNode()
+ node.exists = lambda: None
+ # Can't do this with new-style classes (python bug #1066490)
+ #node.__str__ = lambda: 'xyzzy'
+ result = node.explain()
+ assert result == "building `xyzzy' because it doesn't exist\n", result
+
+ class testNode2(SCons.Node.Node):
+ def __str__(self): return 'null_binfo'
+ class FS(object):
+ pass
+ node = testNode2()
+ node.fs = FS()
+ node.fs.Top = SCons.Node.Node()
+ result = node.explain()
+ assert result is None, result
+
+ def get_null_info():
+ class Null_SConsignEntry(object):
+ class Null_BuildInfo(object):
+ def prepare_dependencies(self):
+ pass
+ binfo = Null_BuildInfo()
+ return Null_SConsignEntry()
+
+ node.get_stored_info = get_null_info
+ #see above: node.__str__ = lambda: 'null_binfo'
+ result = node.explain()
+ assert result == "Cannot explain why `null_binfo' is being rebuilt: No previous build information found\n", result
+
+ # XXX additional tests for the guts of the functionality some day
+
+ #def test_del_binfo(self):
+ # """Test deleting the build information from a Node
+ # """
+ # node = SCons.Node.Node()
+ # node.binfo = None
+ # node.del_binfo()
+ # assert not hasattr(node, 'binfo'), node
+
+ def test_store_info(self):
+ """Test calling the method to store build information
+ """
+ node = SCons.Node.Node()
+ SCons.Node.store_info_map[node.store_info](node)
+
+ def test_get_stored_info(self):
+ """Test calling the method to fetch stored build information
+ """
+ node = SCons.Node.Node()
+ result = node.get_stored_info()
+ assert result is None, result
+
+ def test_set_always_build(self):
+ """Test setting a Node's always_build value
+ """
+ node = SCons.Node.Node()
+ node.set_always_build()
+ assert node.always_build
+ node.set_always_build(3)
+ assert node.always_build == 3
+
+ def test_set_noclean(self):
+ """Test setting a Node's noclean value
+ """
+ node = SCons.Node.Node()
+ node.set_noclean()
+ assert node.noclean == 1, node.noclean
+ node.set_noclean(7)
+ assert node.noclean == 1, node.noclean
+ node.set_noclean(0)
+ assert node.noclean == 0, node.noclean
+ node.set_noclean(None)
+ assert node.noclean == 0, node.noclean
+
+ def test_set_precious(self):
+ """Test setting a Node's precious value
+ """
+ node = SCons.Node.Node()
+ node.set_precious()
+ assert node.precious
+ node.set_precious(7)
+ assert node.precious == 7
+
+ def test_set_pseudo(self):
+ """Test setting a Node's pseudo value
+ """
+ node = SCons.Node.Node()
+ node.set_pseudo()
+ assert node.pseudo
+ node.set_pseudo(False)
+ assert not node.pseudo
+
+ def test_exists(self):
+ """Test evaluating whether a Node exists.
+ """
+ node = SCons.Node.Node()
+ e = node.exists()
+ assert e == 1, e
+
+ def test_exists(self):
+ """Test evaluating whether a Node exists locally or in a repository.
+ """
+ node = SCons.Node.Node()
+ e = node.rexists()
+ assert e == 1, e
+
+ class MyNode(SCons.Node.Node):
+ def exists(self):
+ return 'xyz'
+
+ node = MyNode()
+ e = node.rexists()
+ assert e == 'xyz', e
+
+ def test_prepare(self):
+ """Test preparing a node to be built
+
+ By extension, this also tests the missing() method.
+ """
+ node = SCons.Node.Node()
+
+ n1 = SCons.Node.Node()
+ n1.builder_set(Builder())
+ node.implicit = []
+ node.implicit_set = set()
+ node._add_child(node.implicit, node.implicit_set, [n1])
+
+ node.prepare() # should not throw an exception
+
+ n2 = SCons.Node.Node()
+ n2.linked = 1
+ node.implicit = []
+ node.implicit_set = set()
+ node._add_child(node.implicit, node.implicit_set, [n2])
+
+ node.prepare() # should not throw an exception
+
+ n3 = SCons.Node.Node()
+ node.implicit = []
+ node.implicit_set = set()
+ node._add_child(node.implicit, node.implicit_set, [n3])
+
+ node.prepare() # should not throw an exception
+
+ class MyNode(SCons.Node.Node):
+ def rexists(self):
+ return None
+ n4 = MyNode()
+ node.implicit = []
+ node.implicit_set = set()
+ node._add_child(node.implicit, node.implicit_set, [n4])
+ exc_caught = 0
+ try:
+ node.prepare()
+ except SCons.Errors.StopError:
+ exc_caught = 1
+ assert exc_caught, "did not catch expected StopError"
+
+ def test_add_dependency(self):
+ """Test adding dependencies to a Node's list.
+ """
+ node = SCons.Node.Node()
+ assert node.depends == []
+
+ zero = SCons.Node.Node()
+
+ one = SCons.Node.Node()
+ two = SCons.Node.Node()
+ three = SCons.Node.Node()
+ four = SCons.Node.Node()
+ five = SCons.Node.Node()
+ six = SCons.Node.Node()
+
+ node.add_dependency([zero])
+ assert node.depends == [zero]
+ node.add_dependency([one])
+ assert node.depends == [zero, one]
+ node.add_dependency([two, three])
+ assert node.depends == [zero, one, two, three]
+ node.add_dependency([three, four, one])
+ assert node.depends == [zero, one, two, three, four]
+
+ try:
+ node.add_depends([[five, six]])
+ except:
+ pass
+ else:
+ raise Exception("did not catch expected exception")
+ assert node.depends == [zero, one, two, three, four]
+
+
+ def test_add_source(self):
+ """Test adding sources to a Node's list.
+ """
+ node = SCons.Node.Node()
+ assert node.sources == []
+
+ zero = SCons.Node.Node()
+ one = SCons.Node.Node()
+ two = SCons.Node.Node()
+ three = SCons.Node.Node()
+ four = SCons.Node.Node()
+ five = SCons.Node.Node()
+ six = SCons.Node.Node()
+
+ node.add_source([zero])
+ assert node.sources == [zero]
+ node.add_source([one])
+ assert node.sources == [zero, one]
+ node.add_source([two, three])
+ assert node.sources == [zero, one, two, three]
+ node.add_source([three, four, one])
+ assert node.sources == [zero, one, two, three, four]
+
+ try:
+ node.add_source([[five, six]])
+ except:
+ pass
+ else:
+ raise Exception("did not catch expected exception")
+ assert node.sources == [zero, one, two, three, four], node.sources
+
+ def test_add_ignore(self):
+ """Test adding files whose dependencies should be ignored.
+ """
+ node = SCons.Node.Node()
+ assert node.ignore == []
+
+ zero = SCons.Node.Node()
+ one = SCons.Node.Node()
+ two = SCons.Node.Node()
+ three = SCons.Node.Node()
+ four = SCons.Node.Node()
+ five = SCons.Node.Node()
+ six = SCons.Node.Node()
+
+ node.add_ignore([zero])
+ assert node.ignore == [zero]
+ node.add_ignore([one])
+ assert node.ignore == [zero, one]
+ node.add_ignore([two, three])
+ assert node.ignore == [zero, one, two, three]
+ node.add_ignore([three, four, one])
+ assert node.ignore == [zero, one, two, three, four]
+
+ try:
+ node.add_ignore([[five, six]])
+ except:
+ pass
+ else:
+ raise Exception("did not catch expected exception")
+ assert node.ignore == [zero, one, two, three, four]
+
+ def test_get_found_includes(self):
+ """Test the default get_found_includes() method
+ """
+ node = SCons.Node.Node()
+ target = SCons.Node.Node()
+ e = Environment()
+ deps = node.get_found_includes(e, None, target)
+ assert deps == [], deps
+
+ def test_get_implicit_deps(self):
+ """Test get_implicit_deps()
+ """
+ node = MyNode("nnn")
+ target = MyNode("ttt")
+ env = Environment()
+
+ # No scanner at all returns []
+ deps = node.get_implicit_deps(env, None, target)
+ assert deps == [], deps
+
+ s = Scanner()
+ d1 = MyNode("d1")
+ d2 = MyNode("d2")
+ node.Tag('found_includes', [d1, d2])
+
+ # Simple return of the found includes
+ deps = node.get_implicit_deps(env, s, s.path)
+ assert deps == [d1, d2], deps
+
+ # By default, our fake scanner recurses
+ e = MyNode("eee")
+ f = MyNode("fff")
+ g = MyNode("ggg")
+ d1.Tag('found_includes', [e, f])
+ d2.Tag('found_includes', [e, f])
+ f.Tag('found_includes', [g])
+ deps = node.get_implicit_deps(env, s, s.path)
+ assert deps == [d1, d2, e, f, g], list(map(str, deps))
+
+ # Recursive scanning eliminates duplicates
+ e.Tag('found_includes', [f])
+ deps = node.get_implicit_deps(env, s, s.path)
+ assert deps == [d1, d2, e, f, g], list(map(str, deps))
+
+ # Scanner method can select specific nodes to recurse
+ def no_fff(nodes):
+ return [n for n in nodes if str(n)[0] != 'f']
+ s.recurse_nodes = no_fff
+ deps = node.get_implicit_deps(env, s, s.path)
+ assert deps == [d1, d2, e, f], list(map(str, deps))
+
+ # Scanner method can short-circuit recursing entirely
+ s.recurse_nodes = lambda nodes: []
+ deps = node.get_implicit_deps(env, s, s.path)
+ assert deps == [d1, d2], list(map(str, deps))
+
+ def test_get_env_scanner(self):
+ """Test fetching the environment scanner for a Node
+ """
+ node = SCons.Node.Node()
+ scanner = Scanner()
+ env = Environment(SCANNERS = [scanner])
+ s = node.get_env_scanner(env)
+ assert s == scanner, s
+ s = node.get_env_scanner(env, {'X':1})
+ assert s == scanner, s
+
+ def test_get_target_scanner(self):
+ """Test fetching the target scanner for a Node
+ """
+ s = Scanner()
+ b = Builder()
+ b.target_scanner = s
+ n = SCons.Node.Node()
+ n.builder = b
+ x = n.get_target_scanner()
+ assert x is s, x
+
+ def test_get_source_scanner(self):
+ """Test fetching the source scanner for a Node
+ """
+ target = SCons.Node.Node()
+ source = SCons.Node.Node()
+ s = target.get_source_scanner(source)
+ assert isinstance(s, SCons.Util.Null), s
+
+ ts1 = Scanner()
+ ts2 = Scanner()
+ ts3 = Scanner()
+
+ class Builder1(Builder):
+ def __call__(self, source):
+ r = SCons.Node.Node()
+ r.builder = self
+ return [r]
+ class Builder2(Builder1):
+ def __init__(self, scanner):
+ self.source_scanner = scanner
+
+ builder = Builder2(ts1)
+
+ targets = builder([source])
+ s = targets[0].get_source_scanner(source)
+ assert s is ts1, s
+
+ target.builder_set(Builder2(ts1))
+ target.builder.source_scanner = ts2
+ s = target.get_source_scanner(source)
+ assert s is ts2, s
+
+ builder = Builder1(env=Environment(SCANNERS = [ts3]))
+
+ targets = builder([source])
+
+ s = targets[0].get_source_scanner(source)
+ assert s is ts3, s
+
+
+ def test_scan(self):
+ """Test Scanner functionality
+ """
+ env = Environment()
+ node = MyNode("nnn")
+ node.builder = Builder()
+ node.env_set(env)
+ x = MyExecutor(env, [node])
+
+ s = Scanner()
+ d = MyNode("ddd")
+ node.Tag('found_includes', [d])
+
+ node.builder.target_scanner = s
+ assert node.implicit is None
+
+ node.scan()
+ assert s.called
+ assert node.implicit == [d], node.implicit
+
+ # Check that scanning a node with some stored implicit
+ # dependencies resets internal attributes appropriately
+ # if the stored dependencies need recalculation.
+ class StoredNode(MyNode):
+ def get_stored_implicit(self):
+ return [MyNode('implicit1'), MyNode('implicit2')]
+
+ save_implicit_cache = SCons.Node.implicit_cache
+ save_implicit_deps_changed = SCons.Node.implicit_deps_changed
+ save_implicit_deps_unchanged = SCons.Node.implicit_deps_unchanged
+ SCons.Node.implicit_cache = 1
+ SCons.Node.implicit_deps_changed = None
+ SCons.Node.implicit_deps_unchanged = None
+ try:
+ sn = StoredNode("eee")
+ sn.builder_set(Builder())
+ sn.builder.target_scanner = s
+
+ sn.scan()
+
+ assert sn.implicit == [], sn.implicit
+ assert sn.children() == [], sn.children()
+
+ finally:
+ SCons.Node.implicit_cache = save_implicit_cache
+ SCons.Node.implicit_deps_changed = save_implicit_deps_changed
+ SCons.Node.implicit_deps_unchanged = save_implicit_deps_unchanged
+
+ def test_scanner_key(self):
+ """Test that a scanner_key() method exists"""
+ assert SCons.Node.Node().scanner_key() is None
+
+ def test_children(self):
+ """Test fetching the non-ignored "children" of a Node.
+ """
+ node = SCons.Node.Node()
+ n1 = SCons.Node.Node()
+ n2 = SCons.Node.Node()
+ n3 = SCons.Node.Node()
+ n4 = SCons.Node.Node()
+ n5 = SCons.Node.Node()
+ n6 = SCons.Node.Node()
+ n7 = SCons.Node.Node()
+ n8 = SCons.Node.Node()
+ n9 = SCons.Node.Node()
+ n10 = SCons.Node.Node()
+ n11 = SCons.Node.Node()
+ n12 = SCons.Node.Node()
+
+ node.add_source([n1, n2, n3])
+ node.add_dependency([n4, n5, n6])
+ node.implicit = []
+ node.implicit_set = set()
+ node._add_child(node.implicit, node.implicit_set, [n7, n8, n9])
+ node._add_child(node.implicit, node.implicit_set, [n10, n11, n12])
+ node.add_ignore([n2, n5, n8, n11])
+
+ kids = node.children()
+ for kid in [n1, n3, n4, n6, n7, n9, n10, n12]:
+ assert kid in kids, kid
+ for kid in [n2, n5, n8, n11]:
+ assert not kid in kids, kid
+
+ def test_all_children(self):
+ """Test fetching all the "children" of a Node.
+ """
+ node = SCons.Node.Node()
+ n1 = SCons.Node.Node()
+ n2 = SCons.Node.Node()
+ n3 = SCons.Node.Node()
+ n4 = SCons.Node.Node()
+ n5 = SCons.Node.Node()
+ n6 = SCons.Node.Node()
+ n7 = SCons.Node.Node()
+ n8 = SCons.Node.Node()
+ n9 = SCons.Node.Node()
+ n10 = SCons.Node.Node()
+ n11 = SCons.Node.Node()
+ n12 = SCons.Node.Node()
+
+ node.add_source([n1, n2, n3])
+ node.add_dependency([n4, n5, n6])
+ node.implicit = []
+ node.implicit_set = set()
+ node._add_child(node.implicit, node.implicit_set, [n7, n8, n9])
+ node._add_child(node.implicit, node.implicit_set, [n10, n11, n12])
+ node.add_ignore([n2, n5, n8, n11])
+
+ kids = node.all_children()
+ for kid in [n1, n2, n3, n4, n5, n6, n7, n8, n9, n10, n11, n12]:
+ assert kid in kids, kid
+
+ def test_state(self):
+ """Test setting and getting the state of a node
+ """
+ node = SCons.Node.Node()
+ assert node.get_state() == SCons.Node.no_state
+ node.set_state(SCons.Node.executing)
+ assert node.get_state() == SCons.Node.executing
+ assert SCons.Node.pending < SCons.Node.executing
+ assert SCons.Node.executing < SCons.Node.up_to_date
+ assert SCons.Node.up_to_date < SCons.Node.executed
+ assert SCons.Node.executed < SCons.Node.failed
+
+ def test_walker(self):
+ """Test walking a Node tree.
+ """
+
+ n1 = MyNode("n1")
+
+ nw = SCons.Node.Walker(n1)
+ assert not nw.is_done()
+ assert nw.get_next().name == "n1"
+ assert nw.is_done()
+ assert nw.get_next() is None
+
+ n2 = MyNode("n2")
+ n3 = MyNode("n3")
+ n1.add_source([n2, n3])
+
+ nw = SCons.Node.Walker(n1)
+ n = nw.get_next()
+ assert n.name == "n2", n.name
+ n = nw.get_next()
+ assert n.name == "n3", n.name
+ n = nw.get_next()
+ assert n.name == "n1", n.name
+ n = nw.get_next()
+ assert n is None, n
+
+ n4 = MyNode("n4")
+ n5 = MyNode("n5")
+ n6 = MyNode("n6")
+ n7 = MyNode("n7")
+ n2.add_source([n4, n5])
+ n3.add_dependency([n6, n7])
+
+ nw = SCons.Node.Walker(n1)
+ assert nw.get_next().name == "n4"
+ assert nw.get_next().name == "n5"
+ assert n2 in nw.history
+ assert nw.get_next().name == "n2"
+ assert nw.get_next().name == "n6"
+ assert nw.get_next().name == "n7"
+ assert n3 in nw.history
+ assert nw.get_next().name == "n3"
+ assert n1 in nw.history
+ assert nw.get_next().name == "n1"
+ assert nw.get_next() is None
+
+ n8 = MyNode("n8")
+ n8.add_dependency([n3])
+ n7.add_dependency([n8])
+
+ def cycle(node, stack):
+ global cycle_detected
+ cycle_detected = 1
+
+ global cycle_detected
+
+ nw = SCons.Node.Walker(n3, cycle_func = cycle)
+ n = nw.get_next()
+ assert n.name == "n6", n.name
+ n = nw.get_next()
+ assert n.name == "n8", n.name
+ assert cycle_detected
+ cycle_detected = None
+ n = nw.get_next()
+ assert n.name == "n7", n.name
+ n = nw.get_next()
+ assert nw.get_next() is None
+
+ def test_abspath(self):
+ """Test the get_abspath() method."""
+ n = MyNode("foo")
+ assert n.get_abspath() == str(n), n.get_abspath()
+
+ def test_for_signature(self):
+ """Test the for_signature() method."""
+ n = MyNode("foo")
+ assert n.for_signature() == str(n), n.get_abspath()
+
+ def test_get_string(self):
+ """Test the get_string() method."""
+ class TestNode(MyNode):
+ def __init__(self, name, sig):
+ MyNode.__init__(self, name)
+ self.sig = sig
+
+ def for_signature(self):
+ return self.sig
+
+ n = TestNode("foo", "bar")
+ assert n.get_string(0) == "foo", n.get_string(0)
+ assert n.get_string(1) == "bar", n.get_string(1)
+
+ def test_literal(self):
+ """Test the is_literal() function."""
+ n=SCons.Node.Node()
+ assert n.is_literal()
+
+ def test_Annotate(self):
+ """Test using an interface-specific Annotate function."""
+ def my_annotate(node, self=self):
+ node.Tag('annotation', self.node_string)
+
+ save_Annotate = SCons.Node.Annotate
+ SCons.Node.Annotate = my_annotate
+
+ try:
+ self.node_string = '#1'
+ n = SCons.Node.Node()
+ a = n.GetTag('annotation')
+ assert a == '#1', a
+
+ self.node_string = '#2'
+ n = SCons.Node.Node()
+ a = n.GetTag('annotation')
+ assert a == '#2', a
+ finally:
+ SCons.Node.Annotate = save_Annotate
+
+ def test_clear(self):
+ """Test clearing all cached state information."""
+ n = SCons.Node.Node()
+
+ n.set_state(3)
+ n.binfo = 'xyz'
+ n.includes = 'testincludes'
+ n.Tag('found_includes', {'testkey':'testvalue'})
+ n.implicit = 'testimplicit'
+
+ x = MyExecutor()
+ n.set_executor(x)
+
+ n.clear()
+
+ assert n.includes is None, n.includes
+ assert x.cleaned_up
+
+ def test_get_subst_proxy(self):
+ """Test the get_subst_proxy method."""
+ n = MyNode("test")
+
+ assert n.get_subst_proxy() == n, n.get_subst_proxy()
+
+ def test_new_binfo(self):
+ """Test the new_binfo() method"""
+ n = SCons.Node.Node()
+ result = n.new_binfo()
+ assert isinstance(result, SCons.Node.BuildInfoBase), result
+
+ def test_get_suffix(self):
+ """Test the base Node get_suffix() method"""
+ n = SCons.Node.Node()
+ s = n.get_suffix()
+ assert s == '', s
+
+ def test_postprocess(self):
+ """Test calling the base Node postprocess() method"""
+ n = SCons.Node.Node()
+ n.waiting_parents = set( ['foo','bar'] )
+
+ n.postprocess()
+ assert n.waiting_parents == set(), n.waiting_parents
+
+ def test_add_to_waiting_parents(self):
+ """Test the add_to_waiting_parents() method"""
+ n1 = SCons.Node.Node()
+ n2 = SCons.Node.Node()
+ assert n1.waiting_parents == set(), n1.waiting_parents
+ r = n1.add_to_waiting_parents(n2)
+ assert r == 1, r
+ assert n1.waiting_parents == set((n2,)), n1.waiting_parents
+ r = n1.add_to_waiting_parents(n2)
+ assert r == 0, r
+
+
+class NodeListTestCase(unittest.TestCase):
+ def test___str__(self):
+ """Test"""
+ n1 = MyNode("n1")
+ n2 = MyNode("n2")
+ n3 = MyNode("n3")
+ nl = SCons.Node.NodeList([n3, n2, n1])
+
+ l = [1]
+ ul = collections.UserList([2])
+ s = str(nl)
+ assert s == "['n3', 'n2', 'n1']", s
+
+ r = repr(nl)
+ r = re.sub('at (0[xX])?[0-9a-fA-F]+', 'at 0x', r)
+ # Don't care about ancestry: just leaf value of MyNode
+ r = re.sub('<.*?\.MyNode', '<MyNode', r)
+ # New-style classes report as "object"; classic classes report
+ # as "instance"...
+ r = re.sub("object", "instance", r)
+ l = ", ".join(["<MyNode instance at 0x>"]*3)
+ assert r == '[%s]' % l, r
+
+
+
+if __name__ == "__main__":
+ suite = unittest.TestSuite()
+ tclasses = [ BuildInfoBaseTestCase,
+ NodeInfoBaseTestCase,
+ NodeTestCase,
+ NodeListTestCase ]
+ for tclass in tclasses:
+ names = unittest.getTestCaseNames(tclass, 'test_')
+ suite.addTests(list(map(tclass, names)))
+ TestUnit.run(suite)
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Node/Python.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Node/Python.py
new file mode 100644
index 0000000..8c47c97
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Node/Python.py
@@ -0,0 +1,171 @@
+"""scons.Node.Python
+
+Python nodes.
+
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import SCons.Node
+
+class ValueNodeInfo(SCons.Node.NodeInfoBase):
+ __slots__ = ('csig',)
+ current_version_id = 2
+
+ field_list = ['csig']
+
+ def str_to_node(self, s):
+ return Value(s)
+
+ def __getstate__(self):
+ """
+ Return all fields that shall be pickled. Walk the slots in the class
+ hierarchy and add those to the state dictionary. If a '__dict__' slot is
+ available, copy all entries to the dictionary. Also include the version
+ id, which is fixed for all instances of a class.
+ """
+ state = getattr(self, '__dict__', {}).copy()
+ for obj in type(self).mro():
+ for name in getattr(obj,'__slots__',()):
+ if hasattr(self, name):
+ state[name] = getattr(self, name)
+
+ state['_version_id'] = self.current_version_id
+ try:
+ del state['__weakref__']
+ except KeyError:
+ pass
+
+ return state
+
+ def __setstate__(self, state):
+ """
+ Restore the attributes from a pickled state.
+ """
+ # TODO check or discard version
+ del state['_version_id']
+ for key, value in state.items():
+ if key not in ('__weakref__',):
+ setattr(self, key, value)
+
+
+class ValueBuildInfo(SCons.Node.BuildInfoBase):
+ __slots__ = ()
+ current_version_id = 2
+
+class Value(SCons.Node.Node):
+ """A class for Python variables, typically passed on the command line
+ or generated by a script, but not from a file or some other source.
+ """
+
+ NodeInfo = ValueNodeInfo
+ BuildInfo = ValueBuildInfo
+
+ def __init__(self, value, built_value=None):
+ SCons.Node.Node.__init__(self)
+ self.value = value
+ self.changed_since_last_build = 6
+ self.store_info = 0
+ if built_value is not None:
+ self.built_value = built_value
+
+ def str_for_display(self):
+ return repr(self.value)
+
+ def __str__(self):
+ return str(self.value)
+
+ def make_ready(self):
+ self.get_csig()
+
+ def build(self, **kw):
+ if not hasattr(self, 'built_value'):
+ SCons.Node.Node.build(self, **kw)
+
+ is_up_to_date = SCons.Node.Node.children_are_up_to_date
+
+ def is_under(self, dir):
+ # Make Value nodes get built regardless of
+ # what directory scons was run from. Value nodes
+ # are outside the filesystem:
+ return 1
+
+ def write(self, built_value):
+ """Set the value of the node."""
+ self.built_value = built_value
+
+ def read(self):
+ """Return the value. If necessary, the value is built."""
+ self.build()
+ if not hasattr(self, 'built_value'):
+ self.built_value = self.value
+ return self.built_value
+
+ def get_text_contents(self):
+ """By the assumption that the node.built_value is a
+ deterministic product of the sources, the contents of a Value
+ are the concatenation of all the contents of its sources. As
+ the value need not be built when get_contents() is called, we
+ cannot use the actual node.built_value."""
+ ###TODO: something reasonable about universal newlines
+ contents = str(self.value)
+ for kid in self.children(None):
+ contents = contents + kid.get_contents().decode()
+ return contents
+
+ def get_contents(self):
+ text_contents = self.get_text_contents()
+ try:
+ return text_contents.encode()
+ except UnicodeDecodeError:
+ # Already encoded as python2 str are bytes
+ return text_contents
+
+
+ def changed_since_last_build(self, target, prev_ni):
+ cur_csig = self.get_csig()
+ try:
+ return cur_csig != prev_ni.csig
+ except AttributeError:
+ return 1
+
+ def get_csig(self, calc=None):
+ """Because we're a Python value node and don't have a real
+ timestamp, we get to ignore the calculator and just use the
+ value contents."""
+ try:
+ return self.ninfo.csig
+ except AttributeError:
+ pass
+ contents = self.get_contents()
+ self.get_ninfo().csig = contents
+ return contents
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Node/PythonTests.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Node/PythonTests.py
new file mode 100644
index 0000000..346542b
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Node/PythonTests.py
@@ -0,0 +1,131 @@
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import sys
+import unittest
+
+import TestUnit
+
+import SCons.Errors
+import SCons.Node.Python
+
+class ValueTestCase(unittest.TestCase):
+
+ def test_Value(self):
+ """Test creating a Value() object
+ """
+ v1 = SCons.Node.Python.Value('a')
+ assert v1.value == 'a', v1.value
+
+ value2 = 'a'
+ v2 = SCons.Node.Python.Value(value2)
+ assert v2.value == value2, v2.value
+ assert v2.value is value2, v2.value
+
+ assert not v1 is v2
+ assert v1.value == v2.value
+
+ v3 = SCons.Node.Python.Value('c', 'cb')
+ assert v3.built_value == 'cb'
+
+ def test_build(self):
+ """Test "building" a Value Node
+ """
+ class fake_executor(object):
+ def __call__(self, node):
+ node.write('faked')
+
+ v1 = SCons.Node.Python.Value('b', 'built')
+ v1.executor = fake_executor()
+ v1.build()
+ assert v1.built_value == 'built', v1.built_value
+
+ v2 = SCons.Node.Python.Value('b')
+ v2.executor = fake_executor()
+ v2.build()
+ assert v2.built_value == 'faked', v2.built_value
+
+ def test_read(self):
+ """Test the Value.read() method
+ """
+ v1 = SCons.Node.Python.Value('a')
+ x = v1.read()
+ assert x == 'a', x
+
+ def test_write(self):
+ """Test the Value.write() method
+ """
+ v1 = SCons.Node.Python.Value('a')
+ assert v1.value == 'a', v1.value
+ assert not hasattr(v1, 'built_value')
+
+ v1.write('new')
+ assert v1.value == 'a', v1.value
+ assert v1.built_value == 'new', v1.built_value
+
+ def test_get_csig(self):
+ """Test calculating the content signature of a Value() object
+ """
+ v1 = SCons.Node.Python.Value('aaa')
+ csig = v1.get_csig(None)
+ assert csig.decode() == 'aaa', csig
+
+ v2 = SCons.Node.Python.Value(7)
+ csig = v2.get_csig(None)
+ assert csig.decode() == '7', csig
+
+ v3 = SCons.Node.Python.Value(None)
+ csig = v3.get_csig(None)
+ assert csig.decode() == 'None', csig
+
+class ValueNodeInfoTestCase(unittest.TestCase):
+ def test___init__(self):
+ """Test ValueNodeInfo initialization"""
+ vvv = SCons.Node.Python.Value('vvv')
+ ni = SCons.Node.Python.ValueNodeInfo()
+
+class ValueBuildInfoTestCase(unittest.TestCase):
+ def test___init__(self):
+ """Test ValueBuildInfo initialization"""
+ vvv = SCons.Node.Python.Value('vvv')
+ bi = SCons.Node.Python.ValueBuildInfo()
+
+if __name__ == "__main__":
+ suite = unittest.TestSuite()
+ tclasses = [
+ ValueTestCase,
+ ValueBuildInfoTestCase,
+ ValueNodeInfoTestCase,
+ ]
+ for tclass in tclasses:
+ names = unittest.getTestCaseNames(tclass, 'test_')
+ suite.addTests(list(map(tclass, names)))
+ TestUnit.run(suite)
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Node/__init__.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Node/__init__.py
new file mode 100644
index 0000000..e186752
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Node/__init__.py
@@ -0,0 +1,1734 @@
+"""SCons.Node
+
+The Node package for the SCons software construction utility.
+
+This is, in many ways, the heart of SCons.
+
+A Node is where we encapsulate all of the dependency information about
+any thing that SCons can build, or about any thing which SCons can use
+to build some other thing. The canonical "thing," of course, is a file,
+but a Node can also represent something remote (like a web page) or
+something completely abstract (like an Alias).
+
+Each specific type of "thing" is specifically represented by a subclass
+of the Node base class: Node.FS.File for files, Node.Alias for aliases,
+etc. Dependency information is kept here in the base class, and
+information specific to files/aliases/etc. is in the subclass. The
+goal, if we've done this correctly, is that any type of "thing" should
+be able to depend on any other type of "thing."
+
+"""
+
+from __future__ import print_function
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import collections
+import copy
+from itertools import chain
+
+import SCons.Debug
+from SCons.Debug import logInstanceCreation
+import SCons.Executor
+import SCons.Memoize
+import SCons.Util
+
+from SCons.Debug import Trace
+
+from SCons.compat import with_metaclass, NoSlotsPyPy
+
+print_duplicate = 0
+
+def classname(obj):
+ return str(obj.__class__).split('.')[-1]
+
+# Set to false if we're doing a dry run. There's more than one of these
+# little treats
+do_store_info = True
+
+# Node states
+#
+# These are in "priority" order, so that the maximum value for any
+# child/dependency of a node represents the state of that node if
+# it has no builder of its own. The canonical example is a file
+# system directory, which is only up to date if all of its children
+# were up to date.
+no_state = 0
+pending = 1
+executing = 2
+up_to_date = 3
+executed = 4
+failed = 5
+
+StateString = {
+ 0 : "no_state",
+ 1 : "pending",
+ 2 : "executing",
+ 3 : "up_to_date",
+ 4 : "executed",
+ 5 : "failed",
+}
+
+# controls whether implicit dependencies are cached:
+implicit_cache = 0
+
+# controls whether implicit dep changes are ignored:
+implicit_deps_unchanged = 0
+
+# controls whether the cached implicit deps are ignored:
+implicit_deps_changed = 0
+
+# A variable that can be set to an interface-specific function be called
+# to annotate a Node with information about its creation.
+def do_nothing(node): pass
+
+Annotate = do_nothing
+
+# Gets set to 'True' if we're running in interactive mode. Is
+# currently used to release parts of a target's info during
+# clean builds and update runs (see release_target_info).
+interactive = False
+
+def is_derived_none(node):
+ raise NotImplementedError
+
+def is_derived_node(node):
+ """
+ Returns true if this node is derived (i.e. built).
+ """
+ return node.has_builder() or node.side_effect
+
+_is_derived_map = {0 : is_derived_none,
+ 1 : is_derived_node}
+
+def exists_none(node):
+ raise NotImplementedError
+
+def exists_always(node):
+ return 1
+
+def exists_base(node):
+ return node.stat() is not None
+
+def exists_entry(node):
+ """Return if the Entry exists. Check the file system to see
+ what we should turn into first. Assume a file if there's no
+ directory."""
+ node.disambiguate()
+ return _exists_map[node._func_exists](node)
+
+def exists_file(node):
+ # Duplicate from source path if we are set up to do this.
+ if node.duplicate and not node.is_derived() and not node.linked:
+ src = node.srcnode()
+ if src is not node:
+ # At this point, src is meant to be copied in a variant directory.
+ src = src.rfile()
+ if src.get_abspath() != node.get_abspath():
+ if src.exists():
+ node.do_duplicate(src)
+ # Can't return 1 here because the duplication might
+ # not actually occur if the -n option is being used.
+ else:
+ # The source file does not exist. Make sure no old
+ # copy remains in the variant directory.
+ if print_duplicate:
+ print("dup: no src for %s, unlinking old variant copy"%self)
+ if exists_base(node) or node.islink():
+ node.fs.unlink(node.get_internal_path())
+ # Return None explicitly because the Base.exists() call
+ # above will have cached its value if the file existed.
+ return None
+ return exists_base(node)
+
+_exists_map = {0 : exists_none,
+ 1 : exists_always,
+ 2 : exists_base,
+ 3 : exists_entry,
+ 4 : exists_file}
+
+
+def rexists_none(node):
+ raise NotImplementedError
+
+def rexists_node(node):
+ return node.exists()
+
+def rexists_base(node):
+ return node.rfile().exists()
+
+_rexists_map = {0 : rexists_none,
+ 1 : rexists_node,
+ 2 : rexists_base}
+
+def get_contents_none(node):
+ raise NotImplementedError
+
+def get_contents_entry(node):
+ """Fetch the contents of the entry. Returns the exact binary
+ contents of the file."""
+ try:
+ node = node.disambiguate(must_exist=1)
+ except SCons.Errors.UserError:
+ # There was nothing on disk with which to disambiguate
+ # this entry. Leave it as an Entry, but return a null
+ # string so calls to get_contents() in emitters and the
+ # like (e.g. in qt.py) don't have to disambiguate by hand
+ # or catch the exception.
+ return ''
+ else:
+ return _get_contents_map[node._func_get_contents](node)
+
+def get_contents_dir(node):
+ """Return content signatures and names of all our children
+ separated by new-lines. Ensure that the nodes are sorted."""
+ contents = []
+ for n in sorted(node.children(), key=lambda t: t.name):
+ contents.append('%s %s\n' % (n.get_csig(), n.name))
+ return ''.join(contents)
+
+def get_contents_file(node):
+ if not node.rexists():
+ return b''
+ fname = node.rfile().get_abspath()
+ try:
+ with open(fname, "rb") as fp:
+ contents = fp.read()
+ except EnvironmentError as e:
+ if not e.filename:
+ e.filename = fname
+ raise
+ return contents
+
+_get_contents_map = {0 : get_contents_none,
+ 1 : get_contents_entry,
+ 2 : get_contents_dir,
+ 3 : get_contents_file}
+
+def target_from_source_none(node, prefix, suffix, splitext):
+ raise NotImplementedError
+
+def target_from_source_base(node, prefix, suffix, splitext):
+ return node.dir.Entry(prefix + splitext(node.name)[0] + suffix)
+
+_target_from_source_map = {0 : target_from_source_none,
+ 1 : target_from_source_base}
+
+#
+# The new decider subsystem for Nodes
+#
+# We would set and overwrite the changed_since_last_build function
+# before, but for being able to use slots (less memory!) we now have
+# a dictionary of the different decider functions. Then in the Node
+# subclasses we simply store the index to the decider that should be
+# used by it.
+#
+
+#
+# First, the single decider functions
+#
+def changed_since_last_build_node(node, target, prev_ni):
+ """
+
+ Must be overridden in a specific subclass to return True if this
+ Node (a dependency) has changed since the last time it was used
+ to build the specified target. prev_ni is this Node's state (for
+ example, its file timestamp, length, maybe content signature)
+ as of the last time the target was built.
+
+ Note that this method is called through the dependency, not the
+ target, because a dependency Node must be able to use its own
+ logic to decide if it changed. For example, File Nodes need to
+ obey if we're configured to use timestamps, but Python Value Nodes
+ never use timestamps and always use the content. If this method
+ were called through the target, then each Node's implementation
+ of this method would have to have more complicated logic to
+ handle all the different Node types on which it might depend.
+ """
+ raise NotImplementedError
+
+def changed_since_last_build_alias(node, target, prev_ni):
+ cur_csig = node.get_csig()
+ try:
+ return cur_csig != prev_ni.csig
+ except AttributeError:
+ return 1
+
+def changed_since_last_build_entry(node, target, prev_ni):
+ node.disambiguate()
+ return _decider_map[node.changed_since_last_build](node, target, prev_ni)
+
+def changed_since_last_build_state_changed(node, target, prev_ni):
+ return (node.state != SCons.Node.up_to_date)
+
+def decide_source(node, target, prev_ni):
+ return target.get_build_env().decide_source(node, target, prev_ni)
+
+def decide_target(node, target, prev_ni):
+ return target.get_build_env().decide_target(node, target, prev_ni)
+
+def changed_since_last_build_python(node, target, prev_ni):
+ cur_csig = node.get_csig()
+ try:
+ return cur_csig != prev_ni.csig
+ except AttributeError:
+ return 1
+
+
+#
+# Now, the mapping from indices to decider functions
+#
+_decider_map = {0 : changed_since_last_build_node,
+ 1 : changed_since_last_build_alias,
+ 2 : changed_since_last_build_entry,
+ 3 : changed_since_last_build_state_changed,
+ 4 : decide_source,
+ 5 : decide_target,
+ 6 : changed_since_last_build_python}
+
+do_store_info = True
+
+#
+# The new store_info subsystem for Nodes
+#
+# We would set and overwrite the store_info function
+# before, but for being able to use slots (less memory!) we now have
+# a dictionary of the different functions. Then in the Node
+# subclasses we simply store the index to the info method that should be
+# used by it.
+#
+
+#
+# First, the single info functions
+#
+
+def store_info_pass(node):
+ pass
+
+def store_info_file(node):
+ # Merge our build information into the already-stored entry.
+ # This accommodates "chained builds" where a file that's a target
+ # in one build (SConstruct file) is a source in a different build.
+ # See test/chained-build.py for the use case.
+ if do_store_info:
+ node.dir.sconsign().store_info(node.name, node)
+
+
+store_info_map = {0 : store_info_pass,
+ 1 : store_info_file}
+
+# Classes for signature info for Nodes.
+
+class NodeInfoBase(object):
+ """
+ The generic base class for signature information for a Node.
+
+ Node subclasses should subclass NodeInfoBase to provide their own
+ logic for dealing with their own Node-specific signature information.
+ """
+ __slots__ = ('__weakref__',)
+ current_version_id = 2
+
+ def update(self, node):
+ try:
+ field_list = self.field_list
+ except AttributeError:
+ return
+ for f in field_list:
+ try:
+ delattr(self, f)
+ except AttributeError:
+ pass
+ try:
+ func = getattr(node, 'get_' + f)
+ except AttributeError:
+ pass
+ else:
+ setattr(self, f, func())
+
+ def convert(self, node, val):
+ pass
+
+ def merge(self, other):
+ """
+ Merge the fields of another object into this object. Already existing
+ information is overwritten by the other instance's data.
+ WARNING: If a '__dict__' slot is added, it should be updated instead of
+ replaced.
+ """
+ state = other.__getstate__()
+ self.__setstate__(state)
+ def format(self, field_list=None, names=0):
+ if field_list is None:
+ try:
+ field_list = self.field_list
+ except AttributeError:
+ field_list = list(getattr(self, '__dict__', {}).keys())
+ for obj in type(self).mro():
+ for slot in getattr(obj, '__slots__', ()):
+ if slot not in ('__weakref__', '__dict__'):
+ field_list.append(slot)
+ field_list.sort()
+ fields = []
+ for field in field_list:
+ try:
+ f = getattr(self, field)
+ except AttributeError:
+ f = None
+ f = str(f)
+ if names:
+ f = field + ': ' + f
+ fields.append(f)
+ return fields
+
+ def __getstate__(self):
+ """
+ Return all fields that shall be pickled. Walk the slots in the class
+ hierarchy and add those to the state dictionary. If a '__dict__' slot is
+ available, copy all entries to the dictionary. Also include the version
+ id, which is fixed for all instances of a class.
+ """
+ state = getattr(self, '__dict__', {}).copy()
+ for obj in type(self).mro():
+ for name in getattr(obj,'__slots__',()):
+ if hasattr(self, name):
+ state[name] = getattr(self, name)
+
+ state['_version_id'] = self.current_version_id
+ try:
+ del state['__weakref__']
+ except KeyError:
+ pass
+ return state
+
+ def __setstate__(self, state):
+ """
+ Restore the attributes from a pickled state. The version is discarded.
+ """
+ # TODO check or discard version
+ del state['_version_id']
+
+ for key, value in state.items():
+ if key not in ('__weakref__',):
+ setattr(self, key, value)
+
+
+class BuildInfoBase(object):
+ """
+ The generic base class for build information for a Node.
+
+ This is what gets stored in a .sconsign file for each target file.
+ It contains a NodeInfo instance for this node (signature information
+ that's specific to the type of Node) and direct attributes for the
+ generic build stuff we have to track: sources, explicit dependencies,
+ implicit dependencies, and action information.
+ """
+ __slots__ = ("bsourcesigs", "bdependsigs", "bimplicitsigs", "bactsig",
+ "bsources", "bdepends", "bact", "bimplicit", "__weakref__")
+ current_version_id = 2
+
+ def __init__(self):
+ # Create an object attribute from the class attribute so it ends up
+ # in the pickled data in the .sconsign file.
+ self.bsourcesigs = []
+ self.bdependsigs = []
+ self.bimplicitsigs = []
+ self.bactsig = None
+
+ def merge(self, other):
+ """
+ Merge the fields of another object into this object. Already existing
+ information is overwritten by the other instance's data.
+ WARNING: If a '__dict__' slot is added, it should be updated instead of
+ replaced.
+ """
+ state = other.__getstate__()
+ self.__setstate__(state)
+
+ def __getstate__(self):
+ """
+ Return all fields that shall be pickled. Walk the slots in the class
+ hierarchy and add those to the state dictionary. If a '__dict__' slot is
+ available, copy all entries to the dictionary. Also include the version
+ id, which is fixed for all instances of a class.
+ """
+ state = getattr(self, '__dict__', {}).copy()
+ for obj in type(self).mro():
+ for name in getattr(obj,'__slots__',()):
+ if hasattr(self, name):
+ state[name] = getattr(self, name)
+
+ state['_version_id'] = self.current_version_id
+ try:
+ del state['__weakref__']
+ except KeyError:
+ pass
+ return state
+
+ def __setstate__(self, state):
+ """
+ Restore the attributes from a pickled state.
+ """
+ # TODO check or discard version
+ del state['_version_id']
+ for key, value in state.items():
+ if key not in ('__weakref__',):
+ setattr(self, key, value)
+
+
+class Node(object, with_metaclass(NoSlotsPyPy)):
+ """The base Node class, for entities that we know how to
+ build, or use to build other Nodes.
+ """
+
+ __slots__ = ['sources',
+ 'sources_set',
+ '_specific_sources',
+ 'depends',
+ 'depends_set',
+ 'ignore',
+ 'ignore_set',
+ 'prerequisites',
+ 'implicit',
+ 'waiting_parents',
+ 'waiting_s_e',
+ 'ref_count',
+ 'wkids',
+ 'env',
+ 'state',
+ 'precious',
+ 'noclean',
+ 'nocache',
+ 'cached',
+ 'always_build',
+ 'includes',
+ 'attributes',
+ 'side_effect',
+ 'side_effects',
+ 'linked',
+ '_memo',
+ 'executor',
+ 'binfo',
+ 'ninfo',
+ 'builder',
+ 'is_explicit',
+ 'implicit_set',
+ 'changed_since_last_build',
+ 'store_info',
+ 'pseudo',
+ '_tags',
+ '_func_is_derived',
+ '_func_exists',
+ '_func_rexists',
+ '_func_get_contents',
+ '_func_target_from_source']
+
+ class Attrs(object):
+ __slots__ = ('shared', '__dict__')
+
+
+ def __init__(self):
+ if SCons.Debug.track_instances: logInstanceCreation(self, 'Node.Node')
+ # Note that we no longer explicitly initialize a self.builder
+ # attribute to None here. That's because the self.builder
+ # attribute may be created on-the-fly later by a subclass (the
+ # canonical example being a builder to fetch a file from a
+ # source code system like CVS or Subversion).
+
+ # Each list of children that we maintain is accompanied by a
+ # dictionary used to look up quickly whether a node is already
+ # present in the list. Empirical tests showed that it was
+ # fastest to maintain them as side-by-side Node attributes in
+ # this way, instead of wrapping up each list+dictionary pair in
+ # a class. (Of course, we could always still do that in the
+ # future if we had a good reason to...).
+ self.sources = [] # source files used to build node
+ self.sources_set = set()
+ self._specific_sources = False
+ self.depends = [] # explicit dependencies (from Depends)
+ self.depends_set = set()
+ self.ignore = [] # dependencies to ignore
+ self.ignore_set = set()
+ self.prerequisites = None
+ self.implicit = None # implicit (scanned) dependencies (None means not scanned yet)
+ self.waiting_parents = set()
+ self.waiting_s_e = set()
+ self.ref_count = 0
+ self.wkids = None # Kids yet to walk, when it's an array
+
+ self.env = None
+ self.state = no_state
+ self.precious = None
+ self.pseudo = False
+ self.noclean = 0
+ self.nocache = 0
+ self.cached = 0 # is this node pulled from cache?
+ self.always_build = None
+ self.includes = None
+ self.attributes = self.Attrs() # Generic place to stick information about the Node.
+ self.side_effect = 0 # true iff this node is a side effect
+ self.side_effects = [] # the side effects of building this target
+ self.linked = 0 # is this node linked to the variant directory?
+ self.changed_since_last_build = 0
+ self.store_info = 0
+ self._tags = None
+ self._func_is_derived = 1
+ self._func_exists = 1
+ self._func_rexists = 1
+ self._func_get_contents = 0
+ self._func_target_from_source = 0
+
+ self.clear_memoized_values()
+
+ # Let the interface in which the build engine is embedded
+ # annotate this Node with its own info (like a description of
+ # what line in what file created the node, for example).
+ Annotate(self)
+
+ def disambiguate(self, must_exist=None):
+ return self
+
+ def get_suffix(self):
+ return ''
+
+ @SCons.Memoize.CountMethodCall
+ def get_build_env(self):
+ """Fetch the appropriate Environment to build this node.
+ """
+ try:
+ return self._memo['get_build_env']
+ except KeyError:
+ pass
+ result = self.get_executor().get_build_env()
+ self._memo['get_build_env'] = result
+ return result
+
+ def get_build_scanner_path(self, scanner):
+ """Fetch the appropriate scanner path for this node."""
+ return self.get_executor().get_build_scanner_path(scanner)
+
+ def set_executor(self, executor):
+ """Set the action executor for this node."""
+ self.executor = executor
+
+ def get_executor(self, create=1):
+ """Fetch the action executor for this node. Create one if
+ there isn't already one, and requested to do so."""
+ try:
+ executor = self.executor
+ except AttributeError:
+ if not create:
+ raise
+ try:
+ act = self.builder.action
+ except AttributeError:
+ executor = SCons.Executor.Null(targets=[self])
+ else:
+ executor = SCons.Executor.Executor(act,
+ self.env or self.builder.env,
+ [self.builder.overrides],
+ [self],
+ self.sources)
+ self.executor = executor
+ return executor
+
+ def executor_cleanup(self):
+ """Let the executor clean up any cached information."""
+ try:
+ executor = self.get_executor(create=None)
+ except AttributeError:
+ pass
+ else:
+ if executor is not None:
+ executor.cleanup()
+
+ def reset_executor(self):
+ "Remove cached executor; forces recompute when needed."
+ try:
+ delattr(self, 'executor')
+ except AttributeError:
+ pass
+
+ def push_to_cache(self):
+ """Try to push a node into a cache
+ """
+ pass
+
+ def retrieve_from_cache(self):
+ """Try to retrieve the node's content from a cache
+
+ This method is called from multiple threads in a parallel build,
+ so only do thread safe stuff here. Do thread unsafe stuff in
+ built().
+
+ Returns true if the node was successfully retrieved.
+ """
+ return 0
+
+ #
+ # Taskmaster interface subsystem
+ #
+
+ def make_ready(self):
+ """Get a Node ready for evaluation.
+
+ This is called before the Taskmaster decides if the Node is
+ up-to-date or not. Overriding this method allows for a Node
+ subclass to be disambiguated if necessary, or for an implicit
+ source builder to be attached.
+ """
+ pass
+
+ def prepare(self):
+ """Prepare for this Node to be built.
+
+ This is called after the Taskmaster has decided that the Node
+ is out-of-date and must be rebuilt, but before actually calling
+ the method to build the Node.
+
+ This default implementation checks that explicit or implicit
+ dependencies either exist or are derived, and initializes the
+ BuildInfo structure that will hold the information about how
+ this node is, uh, built.
+
+ (The existence of source files is checked separately by the
+ Executor, which aggregates checks for all of the targets built
+ by a specific action.)
+
+ Overriding this method allows for for a Node subclass to remove
+ the underlying file from the file system. Note that subclass
+ methods should call this base class method to get the child
+ check and the BuildInfo structure.
+ """
+ if self.depends is not None:
+ for d in self.depends:
+ if d.missing():
+ msg = "Explicit dependency `%s' not found, needed by target `%s'."
+ raise SCons.Errors.StopError(msg % (d, self))
+ if self.implicit is not None:
+ for i in self.implicit:
+ if i.missing():
+ msg = "Implicit dependency `%s' not found, needed by target `%s'."
+ raise SCons.Errors.StopError(msg % (i, self))
+ self.binfo = self.get_binfo()
+
+ def build(self, **kw):
+ """Actually build the node.
+
+ This is called by the Taskmaster after it's decided that the
+ Node is out-of-date and must be rebuilt, and after the prepare()
+ method has gotten everything, uh, prepared.
+
+ This method is called from multiple threads in a parallel build,
+ so only do thread safe stuff here. Do thread unsafe stuff
+ in built().
+
+ """
+ try:
+ self.get_executor()(self, **kw)
+ except SCons.Errors.BuildError as e:
+ e.node = self
+ raise
+
+ def built(self):
+ """Called just after this node is successfully built."""
+
+ # Clear the implicit dependency caches of any Nodes
+ # waiting for this Node to be built.
+ for parent in self.waiting_parents:
+ parent.implicit = None
+
+ self.clear()
+
+ if self.pseudo:
+ if self.exists():
+ raise SCons.Errors.UserError("Pseudo target " + str(self) + " must not exist")
+ else:
+ if not self.exists() and do_store_info:
+ SCons.Warnings.warn(SCons.Warnings.TargetNotBuiltWarning,
+ "Cannot find target " + str(self) + " after building")
+ self.ninfo.update(self)
+
+ def visited(self):
+ """Called just after this node has been visited (with or
+ without a build)."""
+ try:
+ binfo = self.binfo
+ except AttributeError:
+ # Apparently this node doesn't need build info, so
+ # don't bother calculating or storing it.
+ pass
+ else:
+ self.ninfo.update(self)
+ SCons.Node.store_info_map[self.store_info](self)
+
+ def release_target_info(self):
+ """Called just after this node has been marked
+ up-to-date or was built completely.
+
+ This is where we try to release as many target node infos
+ as possible for clean builds and update runs, in order
+ to minimize the overall memory consumption.
+
+ By purging attributes that aren't needed any longer after
+ a Node (=File) got built, we don't have to care that much how
+ many KBytes a Node actually requires...as long as we free
+ the memory shortly afterwards.
+
+ @see: built() and File.release_target_info()
+ """
+ pass
+
+ #
+ #
+ #
+
+ def add_to_waiting_s_e(self, node):
+ self.waiting_s_e.add(node)
+
+ def add_to_waiting_parents(self, node):
+ """
+ Returns the number of nodes added to our waiting parents list:
+ 1 if we add a unique waiting parent, 0 if not. (Note that the
+ returned values are intended to be used to increment a reference
+ count, so don't think you can "clean up" this function by using
+ True and False instead...)
+ """
+ wp = self.waiting_parents
+ if node in wp:
+ return 0
+ wp.add(node)
+ return 1
+
+ def postprocess(self):
+ """Clean up anything we don't need to hang onto after we've
+ been built."""
+ self.executor_cleanup()
+ self.waiting_parents = set()
+
+ def clear(self):
+ """Completely clear a Node of all its cached state (so that it
+ can be re-evaluated by interfaces that do continuous integration
+ builds).
+ """
+ # The del_binfo() call here isn't necessary for normal execution,
+ # but is for interactive mode, where we might rebuild the same
+ # target and need to start from scratch.
+ self.del_binfo()
+ self.clear_memoized_values()
+ self.ninfo = self.new_ninfo()
+ self.executor_cleanup()
+ try:
+ delattr(self, '_calculated_sig')
+ except AttributeError:
+ pass
+ self.includes = None
+
+ def clear_memoized_values(self):
+ self._memo = {}
+
+ def builder_set(self, builder):
+ self.builder = builder
+ try:
+ del self.executor
+ except AttributeError:
+ pass
+
+ def has_builder(self):
+ """Return whether this Node has a builder or not.
+
+ In Boolean tests, this turns out to be a *lot* more efficient
+ than simply examining the builder attribute directly ("if
+ node.builder: ..."). When the builder attribute is examined
+ directly, it ends up calling __getattr__ for both the __len__
+ and __nonzero__ attributes on instances of our Builder Proxy
+ class(es), generating a bazillion extra calls and slowing
+ things down immensely.
+ """
+ try:
+ b = self.builder
+ except AttributeError:
+ # There was no explicit builder for this Node, so initialize
+ # the self.builder attribute to None now.
+ b = self.builder = None
+ return b is not None
+
+ def set_explicit(self, is_explicit):
+ self.is_explicit = is_explicit
+
+ def has_explicit_builder(self):
+ """Return whether this Node has an explicit builder
+
+ This allows an internal Builder created by SCons to be marked
+ non-explicit, so that it can be overridden by an explicit
+ builder that the user supplies (the canonical example being
+ directories)."""
+ try:
+ return self.is_explicit
+ except AttributeError:
+ self.is_explicit = None
+ return self.is_explicit
+
+ def get_builder(self, default_builder=None):
+ """Return the set builder, or a specified default value"""
+ try:
+ return self.builder
+ except AttributeError:
+ return default_builder
+
+ multiple_side_effect_has_builder = has_builder
+
+ def is_derived(self):
+ """
+ Returns true if this node is derived (i.e. built).
+
+ This should return true only for nodes whose path should be in
+ the variant directory when duplicate=0 and should contribute their build
+ signatures when they are used as source files to other derived files. For
+ example: source with source builders are not derived in this sense,
+ and hence should not return true.
+ """
+ return _is_derived_map[self._func_is_derived](self)
+
+ def alter_targets(self):
+ """Return a list of alternate targets for this Node.
+ """
+ return [], None
+
+ def get_found_includes(self, env, scanner, path):
+ """Return the scanned include lines (implicit dependencies)
+ found in this node.
+
+ The default is no implicit dependencies. We expect this method
+ to be overridden by any subclass that can be scanned for
+ implicit dependencies.
+ """
+ return []
+
+ def get_implicit_deps(self, env, initial_scanner, path_func, kw = {}):
+ """Return a list of implicit dependencies for this node.
+
+ This method exists to handle recursive invocation of the scanner
+ on the implicit dependencies returned by the scanner, if the
+ scanner's recursive flag says that we should.
+ """
+ nodes = [self]
+ seen = set(nodes)
+ dependencies = []
+ path_memo = {}
+
+ root_node_scanner = self._get_scanner(env, initial_scanner, None, kw)
+
+ while nodes:
+ node = nodes.pop(0)
+
+ scanner = node._get_scanner(env, initial_scanner, root_node_scanner, kw)
+ if not scanner:
+ continue
+
+ try:
+ path = path_memo[scanner]
+ except KeyError:
+ path = path_func(scanner)
+ path_memo[scanner] = path
+
+ included_deps = [x for x in node.get_found_includes(env, scanner, path) if x not in seen]
+ if included_deps:
+ dependencies.extend(included_deps)
+ seen.update(included_deps)
+ nodes.extend(scanner.recurse_nodes(included_deps))
+
+ return dependencies
+
+ def _get_scanner(self, env, initial_scanner, root_node_scanner, kw):
+ if initial_scanner:
+ # handle explicit scanner case
+ scanner = initial_scanner.select(self)
+ else:
+ # handle implicit scanner case
+ scanner = self.get_env_scanner(env, kw)
+ if scanner:
+ scanner = scanner.select(self)
+
+ if not scanner:
+ # no scanner could be found for the given node's scanner key;
+ # thus, make an attempt at using a default.
+ scanner = root_node_scanner
+
+ return scanner
+
+ def get_env_scanner(self, env, kw={}):
+ return env.get_scanner(self.scanner_key())
+
+ def get_target_scanner(self):
+ return self.builder.target_scanner
+
+ def get_source_scanner(self, node):
+ """Fetch the source scanner for the specified node
+
+ NOTE: "self" is the target being built, "node" is
+ the source file for which we want to fetch the scanner.
+
+ Implies self.has_builder() is true; again, expect to only be
+ called from locations where this is already verified.
+
+ This function may be called very often; it attempts to cache
+ the scanner found to improve performance.
+ """
+ scanner = None
+ try:
+ scanner = self.builder.source_scanner
+ except AttributeError:
+ pass
+ if not scanner:
+ # The builder didn't have an explicit scanner, so go look up
+ # a scanner from env['SCANNERS'] based on the node's scanner
+ # key (usually the file extension).
+ scanner = self.get_env_scanner(self.get_build_env())
+ if scanner:
+ scanner = scanner.select(node)
+ return scanner
+
+ def add_to_implicit(self, deps):
+ if not hasattr(self, 'implicit') or self.implicit is None:
+ self.implicit = []
+ self.implicit_set = set()
+ self._children_reset()
+ self._add_child(self.implicit, self.implicit_set, deps)
+
+ def scan(self):
+ """Scan this node's dependents for implicit dependencies."""
+ # Don't bother scanning non-derived files, because we don't
+ # care what their dependencies are.
+ # Don't scan again, if we already have scanned.
+ if self.implicit is not None:
+ return
+ self.implicit = []
+ self.implicit_set = set()
+ self._children_reset()
+ if not self.has_builder():
+ return
+
+ build_env = self.get_build_env()
+ executor = self.get_executor()
+
+ # Here's where we implement --implicit-cache.
+ if implicit_cache and not implicit_deps_changed:
+ implicit = self.get_stored_implicit()
+ if implicit is not None:
+ # We now add the implicit dependencies returned from the
+ # stored .sconsign entry to have already been converted
+ # to Nodes for us. (We used to run them through a
+ # source_factory function here.)
+
+ # Update all of the targets with them. This
+ # essentially short-circuits an N*M scan of the
+ # sources for each individual target, which is a hell
+ # of a lot more efficient.
+ for tgt in executor.get_all_targets():
+ tgt.add_to_implicit(implicit)
+
+ if implicit_deps_unchanged or self.is_up_to_date():
+ return
+ # one of this node's sources has changed,
+ # so we must recalculate the implicit deps for all targets
+ for tgt in executor.get_all_targets():
+ tgt.implicit = []
+ tgt.implicit_set = set()
+
+ # Have the executor scan the sources.
+ executor.scan_sources(self.builder.source_scanner)
+
+ # If there's a target scanner, have the executor scan the target
+ # node itself and associated targets that might be built.
+ scanner = self.get_target_scanner()
+ if scanner:
+ executor.scan_targets(scanner)
+
+ def scanner_key(self):
+ return None
+
+ def select_scanner(self, scanner):
+ """Selects a scanner for this Node.
+
+ This is a separate method so it can be overridden by Node
+ subclasses (specifically, Node.FS.Dir) that *must* use their
+ own Scanner and don't select one the Scanner.Selector that's
+ configured for the target.
+ """
+ return scanner.select(self)
+
+ def env_set(self, env, safe=0):
+ if safe and self.env:
+ return
+ self.env = env
+
+ #
+ # SIGNATURE SUBSYSTEM
+ #
+
+ NodeInfo = NodeInfoBase
+ BuildInfo = BuildInfoBase
+
+ def new_ninfo(self):
+ ninfo = self.NodeInfo()
+ return ninfo
+
+ def get_ninfo(self):
+ try:
+ return self.ninfo
+ except AttributeError:
+ self.ninfo = self.new_ninfo()
+ return self.ninfo
+
+ def new_binfo(self):
+ binfo = self.BuildInfo()
+ return binfo
+
+ def get_binfo(self):
+ """
+ Fetch a node's build information.
+
+ node - the node whose sources will be collected
+ cache - alternate node to use for the signature cache
+ returns - the build signature
+
+ This no longer handles the recursive descent of the
+ node's children's signatures. We expect that they're
+ already built and updated by someone else, if that's
+ what's wanted.
+ """
+ try:
+ return self.binfo
+ except AttributeError:
+ pass
+
+ binfo = self.new_binfo()
+ self.binfo = binfo
+
+ executor = self.get_executor()
+ ignore_set = self.ignore_set
+
+ if self.has_builder():
+ binfo.bact = str(executor)
+ binfo.bactsig = SCons.Util.MD5signature(executor.get_contents())
+
+ if self._specific_sources:
+ sources = [ s for s in self.sources if not s in ignore_set]
+
+ else:
+ sources = executor.get_unignored_sources(self, self.ignore)
+
+ seen = set()
+ binfo.bsources = [s for s in sources if s not in seen and not seen.add(s)]
+ binfo.bsourcesigs = [s.get_ninfo() for s in binfo.bsources]
+
+
+ binfo.bdepends = self.depends
+ binfo.bdependsigs = [d.get_ninfo() for d in self.depends if d not in ignore_set]
+
+ binfo.bimplicit = self.implicit or []
+ binfo.bimplicitsigs = [i.get_ninfo() for i in binfo.bimplicit if i not in ignore_set]
+
+
+ return binfo
+
+ def del_binfo(self):
+ """Delete the build info from this node."""
+ try:
+ delattr(self, 'binfo')
+ except AttributeError:
+ pass
+
+ def get_csig(self):
+ try:
+ return self.ninfo.csig
+ except AttributeError:
+ ninfo = self.get_ninfo()
+ ninfo.csig = SCons.Util.MD5signature(self.get_contents())
+ return self.ninfo.csig
+
+ def get_cachedir_csig(self):
+ return self.get_csig()
+
+ def get_stored_info(self):
+ return None
+
+ def get_stored_implicit(self):
+ """Fetch the stored implicit dependencies"""
+ return None
+
+ #
+ #
+ #
+
+ def set_precious(self, precious = 1):
+ """Set the Node's precious value."""
+ self.precious = precious
+
+ def set_pseudo(self, pseudo = True):
+ """Set the Node's precious value."""
+ self.pseudo = pseudo
+
+ def set_noclean(self, noclean = 1):
+ """Set the Node's noclean value."""
+ # Make sure noclean is an integer so the --debug=stree
+ # output in Util.py can use it as an index.
+ self.noclean = noclean and 1 or 0
+
+ def set_nocache(self, nocache = 1):
+ """Set the Node's nocache value."""
+ # Make sure nocache is an integer so the --debug=stree
+ # output in Util.py can use it as an index.
+ self.nocache = nocache and 1 or 0
+
+ def set_always_build(self, always_build = 1):
+ """Set the Node's always_build value."""
+ self.always_build = always_build
+
+ def exists(self):
+ """Does this node exists?"""
+ return _exists_map[self._func_exists](self)
+
+ def rexists(self):
+ """Does this node exist locally or in a repositiory?"""
+ # There are no repositories by default:
+ return _rexists_map[self._func_rexists](self)
+
+ def get_contents(self):
+ """Fetch the contents of the entry."""
+ return _get_contents_map[self._func_get_contents](self)
+
+ def missing(self):
+ return not self.is_derived() and \
+ not self.linked and \
+ not self.rexists()
+
+ def remove(self):
+ """Remove this Node: no-op by default."""
+ return None
+
+ def add_dependency(self, depend):
+ """Adds dependencies."""
+ try:
+ self._add_child(self.depends, self.depends_set, depend)
+ except TypeError as e:
+ e = e.args[0]
+ if SCons.Util.is_List(e):
+ s = list(map(str, e))
+ else:
+ s = str(e)
+ raise SCons.Errors.UserError("attempted to add a non-Node dependency to %s:\n\t%s is a %s, not a Node" % (str(self), s, type(e)))
+
+ def add_prerequisite(self, prerequisite):
+ """Adds prerequisites"""
+ if self.prerequisites is None:
+ self.prerequisites = SCons.Util.UniqueList()
+ self.prerequisites.extend(prerequisite)
+ self._children_reset()
+
+ def add_ignore(self, depend):
+ """Adds dependencies to ignore."""
+ try:
+ self._add_child(self.ignore, self.ignore_set, depend)
+ except TypeError as e:
+ e = e.args[0]
+ if SCons.Util.is_List(e):
+ s = list(map(str, e))
+ else:
+ s = str(e)
+ raise SCons.Errors.UserError("attempted to ignore a non-Node dependency of %s:\n\t%s is a %s, not a Node" % (str(self), s, type(e)))
+
+ def add_source(self, source):
+ """Adds sources."""
+ if self._specific_sources:
+ return
+ try:
+ self._add_child(self.sources, self.sources_set, source)
+ except TypeError as e:
+ e = e.args[0]
+ if SCons.Util.is_List(e):
+ s = list(map(str, e))
+ else:
+ s = str(e)
+ raise SCons.Errors.UserError("attempted to add a non-Node as source of %s:\n\t%s is a %s, not a Node" % (str(self), s, type(e)))
+
+ def _add_child(self, collection, set, child):
+ """Adds 'child' to 'collection', first checking 'set' to see if it's
+ already present."""
+ added = None
+ for c in child:
+ if c not in set:
+ set.add(c)
+ collection.append(c)
+ added = 1
+ if added:
+ self._children_reset()
+
+ def set_specific_source(self, source):
+ self.add_source(source)
+ self._specific_sources = True
+
+ def add_wkid(self, wkid):
+ """Add a node to the list of kids waiting to be evaluated"""
+ if self.wkids is not None:
+ self.wkids.append(wkid)
+
+ def _children_reset(self):
+ self.clear_memoized_values()
+ # We need to let the Executor clear out any calculated
+ # build info that it's cached so we can re-calculate it.
+ self.executor_cleanup()
+
+ @SCons.Memoize.CountMethodCall
+ def _children_get(self):
+ try:
+ return self._memo['_children_get']
+ except KeyError:
+ pass
+
+ # The return list may contain duplicate Nodes, especially in
+ # source trees where there are a lot of repeated #includes
+ # of a tangle of .h files. Profiling shows, however, that
+ # eliminating the duplicates with a brute-force approach that
+ # preserves the order (that is, something like:
+ #
+ # u = []
+ # for n in list:
+ # if n not in u:
+ # u.append(n)"
+ #
+ # takes more cycles than just letting the underlying methods
+ # hand back cached values if a Node's information is requested
+ # multiple times. (Other methods of removing duplicates, like
+ # using dictionary keys, lose the order, and the only ordered
+ # dictionary patterns I found all ended up using "not in"
+ # internally anyway...)
+ if self.ignore_set:
+ iter = chain.from_iterable([_f for _f in [self.sources, self.depends, self.implicit] if _f])
+
+ children = []
+ for i in iter:
+ if i not in self.ignore_set:
+ children.append(i)
+ else:
+ children = self.all_children(scan=0)
+
+ self._memo['_children_get'] = children
+ return children
+
+ def all_children(self, scan=1):
+ """Return a list of all the node's direct children."""
+ if scan:
+ self.scan()
+
+ # The return list may contain duplicate Nodes, especially in
+ # source trees where there are a lot of repeated #includes
+ # of a tangle of .h files. Profiling shows, however, that
+ # eliminating the duplicates with a brute-force approach that
+ # preserves the order (that is, something like:
+ #
+ # u = []
+ # for n in list:
+ # if n not in u:
+ # u.append(n)"
+ #
+ # takes more cycles than just letting the underlying methods
+ # hand back cached values if a Node's information is requested
+ # multiple times. (Other methods of removing duplicates, like
+ # using dictionary keys, lose the order, and the only ordered
+ # dictionary patterns I found all ended up using "not in"
+ # internally anyway...)
+ return list(chain.from_iterable([_f for _f in [self.sources, self.depends, self.implicit] if _f]))
+
+ def children(self, scan=1):
+ """Return a list of the node's direct children, minus those
+ that are ignored by this node."""
+ if scan:
+ self.scan()
+ return self._children_get()
+
+ def set_state(self, state):
+ self.state = state
+
+ def get_state(self):
+ return self.state
+
+ def get_env(self):
+ env = self.env
+ if not env:
+ import SCons.Defaults
+ env = SCons.Defaults.DefaultEnvironment()
+ return env
+
+ def Decider(self, function):
+ foundkey = None
+ for k, v in _decider_map.items():
+ if v == function:
+ foundkey = k
+ break
+ if not foundkey:
+ foundkey = len(_decider_map)
+ _decider_map[foundkey] = function
+ self.changed_since_last_build = foundkey
+
+ def Tag(self, key, value):
+ """ Add a user-defined tag. """
+ if not self._tags:
+ self._tags = {}
+ self._tags[key] = value
+
+ def GetTag(self, key):
+ """ Return a user-defined tag. """
+ if not self._tags:
+ return None
+ return self._tags.get(key, None)
+
+ def changed(self, node=None, allowcache=False):
+ """
+ Returns if the node is up-to-date with respect to the BuildInfo
+ stored last time it was built. The default behavior is to compare
+ it against our own previously stored BuildInfo, but the stored
+ BuildInfo from another Node (typically one in a Repository)
+ can be used instead.
+
+ Note that we now *always* check every dependency. We used to
+ short-circuit the check by returning as soon as we detected
+ any difference, but we now rely on checking every dependency
+ to make sure that any necessary Node information (for example,
+ the content signature of an #included .h file) is updated.
+
+ The allowcache option was added for supporting the early
+ release of the executor/builder structures, right after
+ a File target was built. When set to true, the return
+ value of this changed method gets cached for File nodes.
+ Like this, the executor isn't needed any longer for subsequent
+ calls to changed().
+
+ @see: FS.File.changed(), FS.File.release_target_info()
+ """
+ t = 0
+ if t: Trace('changed(%s [%s], %s)' % (self, classname(self), node))
+ if node is None:
+ node = self
+
+ result = False
+
+ bi = node.get_stored_info().binfo
+ then = bi.bsourcesigs + bi.bdependsigs + bi.bimplicitsigs
+ children = self.children()
+
+ diff = len(children) - len(then)
+ if diff:
+ # The old and new dependency lists are different lengths.
+ # This always indicates that the Node must be rebuilt.
+ # We also extend the old dependency list with enough None
+ # entries to equal the new dependency list, for the benefit
+ # of the loop below that updates node information.
+ then.extend([None] * diff)
+ if t: Trace(': old %s new %s' % (len(then), len(children)))
+ result = True
+
+ for child, prev_ni in zip(children, then):
+ if _decider_map[child.changed_since_last_build](child, self, prev_ni):
+ if t: Trace(': %s changed' % child)
+ result = True
+
+ contents = self.get_executor().get_contents()
+ if self.has_builder():
+ import SCons.Util
+ newsig = SCons.Util.MD5signature(contents)
+ if bi.bactsig != newsig:
+ if t: Trace(': bactsig %s != newsig %s' % (bi.bactsig, newsig))
+ result = True
+
+ if not result:
+ if t: Trace(': up to date')
+
+ if t: Trace('\n')
+
+ return result
+
+ def is_up_to_date(self):
+ """Default check for whether the Node is current: unknown Node
+ subtypes are always out of date, so they will always get built."""
+ return None
+
+ def children_are_up_to_date(self):
+ """Alternate check for whether the Node is current: If all of
+ our children were up-to-date, then this Node was up-to-date, too.
+
+ The SCons.Node.Alias and SCons.Node.Python.Value subclasses
+ rebind their current() method to this method."""
+ # Allow the children to calculate their signatures.
+ self.binfo = self.get_binfo()
+ if self.always_build:
+ return None
+ state = 0
+ for kid in self.children(None):
+ s = kid.get_state()
+ if s and (not state or s > state):
+ state = s
+ return (state == 0 or state == SCons.Node.up_to_date)
+
+ def is_literal(self):
+ """Always pass the string representation of a Node to
+ the command interpreter literally."""
+ return 1
+
+ def render_include_tree(self):
+ """
+ Return a text representation, suitable for displaying to the
+ user, of the include tree for the sources of this node.
+ """
+ if self.is_derived():
+ env = self.get_build_env()
+ if env:
+ for s in self.sources:
+ scanner = self.get_source_scanner(s)
+ if scanner:
+ path = self.get_build_scanner_path(scanner)
+ else:
+ path = None
+ def f(node, env=env, scanner=scanner, path=path):
+ return node.get_found_includes(env, scanner, path)
+ return SCons.Util.render_tree(s, f, 1)
+ else:
+ return None
+
+ def get_abspath(self):
+ """
+ Return an absolute path to the Node. This will return simply
+ str(Node) by default, but for Node types that have a concept of
+ relative path, this might return something different.
+ """
+ return str(self)
+
+ def for_signature(self):
+ """
+ Return a string representation of the Node that will always
+ be the same for this particular Node, no matter what. This
+ is by contrast to the __str__() method, which might, for
+ instance, return a relative path for a file Node. The purpose
+ of this method is to generate a value to be used in signature
+ calculation for the command line used to build a target, and
+ we use this method instead of str() to avoid unnecessary
+ rebuilds. This method does not need to return something that
+ would actually work in a command line; it can return any kind of
+ nonsense, so long as it does not change.
+ """
+ return str(self)
+
+ def get_string(self, for_signature):
+ """This is a convenience function designed primarily to be
+ used in command generators (i.e., CommandGeneratorActions or
+ Environment variables that are callable), which are called
+ with a for_signature argument that is nonzero if the command
+ generator is being called to generate a signature for the
+ command line, which determines if we should rebuild or not.
+
+ Such command generators should use this method in preference
+ to str(Node) when converting a Node to a string, passing
+ in the for_signature parameter, such that we will call
+ Node.for_signature() or str(Node) properly, depending on whether
+ we are calculating a signature or actually constructing a
+ command line."""
+ if for_signature:
+ return self.for_signature()
+ return str(self)
+
+ def get_subst_proxy(self):
+ """
+ This method is expected to return an object that will function
+ exactly like this Node, except that it implements any additional
+ special features that we would like to be in effect for
+ Environment variable substitution. The principle use is that
+ some Nodes would like to implement a __getattr__() method,
+ but putting that in the Node type itself has a tendency to kill
+ performance. We instead put it in a proxy and return it from
+ this method. It is legal for this method to return self
+ if no new functionality is needed for Environment substitution.
+ """
+ return self
+
+ def explain(self):
+ if not self.exists():
+ return "building `%s' because it doesn't exist\n" % self
+
+ if self.always_build:
+ return "rebuilding `%s' because AlwaysBuild() is specified\n" % self
+
+ old = self.get_stored_info()
+ if old is None:
+ return None
+
+ old = old.binfo
+ old.prepare_dependencies()
+
+ try:
+ old_bkids = old.bsources + old.bdepends + old.bimplicit
+ old_bkidsigs = old.bsourcesigs + old.bdependsigs + old.bimplicitsigs
+ except AttributeError:
+ return "Cannot explain why `%s' is being rebuilt: No previous build information found\n" % self
+
+ new = self.get_binfo()
+
+ new_bkids = new.bsources + new.bdepends + new.bimplicit
+ new_bkidsigs = new.bsourcesigs + new.bdependsigs + new.bimplicitsigs
+
+ osig = dict(list(zip(old_bkids, old_bkidsigs)))
+ nsig = dict(list(zip(new_bkids, new_bkidsigs)))
+
+ # The sources and dependencies we'll want to report are all stored
+ # as relative paths to this target's directory, but we want to
+ # report them relative to the top-level SConstruct directory,
+ # so we only print them after running them through this lambda
+ # to turn them into the right relative Node and then return
+ # its string.
+ def stringify( s, E=self.dir.Entry ) :
+ if hasattr( s, 'dir' ) :
+ return str(E(s))
+ return str(s)
+
+ lines = []
+
+ removed = [x for x in old_bkids if not x in new_bkids]
+ if removed:
+ removed = list(map(stringify, removed))
+ fmt = "`%s' is no longer a dependency\n"
+ lines.extend([fmt % s for s in removed])
+
+ for k in new_bkids:
+ if not k in old_bkids:
+ lines.append("`%s' is a new dependency\n" % stringify(k))
+ elif _decider_map[k.changed_since_last_build](k, self, osig[k]):
+ lines.append("`%s' changed\n" % stringify(k))
+
+ if len(lines) == 0 and old_bkids != new_bkids:
+ lines.append("the dependency order changed:\n" +
+ "%sold: %s\n" % (' '*15, list(map(stringify, old_bkids))) +
+ "%snew: %s\n" % (' '*15, list(map(stringify, new_bkids))))
+
+ if len(lines) == 0:
+ def fmt_with_title(title, strlines):
+ lines = strlines.split('\n')
+ sep = '\n' + ' '*(15 + len(title))
+ return ' '*15 + title + sep.join(lines) + '\n'
+ if old.bactsig != new.bactsig:
+ if old.bact == new.bact:
+ lines.append("the contents of the build action changed\n" +
+ fmt_with_title('action: ', new.bact))
+
+ # lines.append("the contents of the build action changed [%s] [%s]\n"%(old.bactsig,new.bactsig) +
+ # fmt_with_title('action: ', new.bact))
+ else:
+ lines.append("the build action changed:\n" +
+ fmt_with_title('old: ', old.bact) +
+ fmt_with_title('new: ', new.bact))
+
+ if len(lines) == 0:
+ return "rebuilding `%s' for unknown reasons\n" % self
+
+ preamble = "rebuilding `%s' because" % self
+ if len(lines) == 1:
+ return "%s %s" % (preamble, lines[0])
+ else:
+ lines = ["%s:\n" % preamble] + lines
+ return ( ' '*11).join(lines)
+
+class NodeList(collections.UserList):
+ def __str__(self):
+ return str(list(map(str, self.data)))
+
+def get_children(node, parent): return node.children()
+def ignore_cycle(node, stack): pass
+def do_nothing(node, parent): pass
+
+class Walker(object):
+ """An iterator for walking a Node tree.
+
+ This is depth-first, children are visited before the parent.
+ The Walker object can be initialized with any node, and
+ returns the next node on the descent with each get_next() call.
+ 'kids_func' is an optional function that will be called to
+ get the children of a node instead of calling 'children'.
+ 'cycle_func' is an optional function that will be called
+ when a cycle is detected.
+
+ This class does not get caught in node cycles caused, for example,
+ by C header file include loops.
+ """
+ def __init__(self, node, kids_func=get_children,
+ cycle_func=ignore_cycle,
+ eval_func=do_nothing):
+ self.kids_func = kids_func
+ self.cycle_func = cycle_func
+ self.eval_func = eval_func
+ node.wkids = copy.copy(kids_func(node, None))
+ self.stack = [node]
+ self.history = {} # used to efficiently detect and avoid cycles
+ self.history[node] = None
+
+ def get_next(self):
+ """Return the next node for this walk of the tree.
+
+ This function is intentionally iterative, not recursive,
+ to sidestep any issues of stack size limitations.
+ """
+
+ while self.stack:
+ if self.stack[-1].wkids:
+ node = self.stack[-1].wkids.pop(0)
+ if not self.stack[-1].wkids:
+ self.stack[-1].wkids = None
+ if node in self.history:
+ self.cycle_func(node, self.stack)
+ else:
+ node.wkids = copy.copy(self.kids_func(node, self.stack[-1]))
+ self.stack.append(node)
+ self.history[node] = None
+ else:
+ node = self.stack.pop()
+ del self.history[node]
+ if node:
+ if self.stack:
+ parent = self.stack[-1]
+ else:
+ parent = None
+ self.eval_func(node, parent)
+ return node
+ return None
+
+ def is_done(self):
+ return not self.stack
+
+
+arg2nodes_lookups = []
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Options/BoolOption.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Options/BoolOption.py
new file mode 100644
index 0000000..452fdd3
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Options/BoolOption.py
@@ -0,0 +1,50 @@
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+__doc__ = """Place-holder for the old SCons.Options module hierarchy
+
+This is for backwards compatibility. The new equivalent is the Variables/
+class hierarchy. These will have deprecation warnings added (some day),
+and will then be removed entirely (some day).
+"""
+
+import SCons.Variables
+import SCons.Warnings
+
+warned = False
+
+def BoolOption(*args, **kw):
+ global warned
+ if not warned:
+ msg = "The BoolOption() function is deprecated; use the BoolVariable() function instead."
+ SCons.Warnings.warn(SCons.Warnings.DeprecatedOptionsWarning, msg)
+ warned = True
+ return SCons.Variables.BoolVariable(*args, **kw)
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Options/EnumOption.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Options/EnumOption.py
new file mode 100644
index 0000000..2db158d
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Options/EnumOption.py
@@ -0,0 +1,50 @@
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+__doc__ = """Place-holder for the old SCons.Options module hierarchy
+
+This is for backwards compatibility. The new equivalent is the Variables/
+class hierarchy. These will have deprecation warnings added (some day),
+and will then be removed entirely (some day).
+"""
+
+import SCons.Variables
+import SCons.Warnings
+
+warned = False
+
+def EnumOption(*args, **kw):
+ global warned
+ if not warned:
+ msg = "The EnumOption() function is deprecated; use the EnumVariable() function instead."
+ SCons.Warnings.warn(SCons.Warnings.DeprecatedOptionsWarning, msg)
+ warned = True
+ return SCons.Variables.EnumVariable(*args, **kw)
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Options/ListOption.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Options/ListOption.py
new file mode 100644
index 0000000..4167d8e
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Options/ListOption.py
@@ -0,0 +1,50 @@
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+__doc__ = """Place-holder for the old SCons.Options module hierarchy
+
+This is for backwards compatibility. The new equivalent is the Variables/
+class hierarchy. These will have deprecation warnings added (some day),
+and will then be removed entirely (some day).
+"""
+
+import SCons.Variables
+import SCons.Warnings
+
+warned = False
+
+def ListOption(*args, **kw):
+ global warned
+ if not warned:
+ msg = "The ListOption() function is deprecated; use the ListVariable() function instead."
+ SCons.Warnings.warn(SCons.Warnings.DeprecatedOptionsWarning, msg)
+ warned = True
+ return SCons.Variables.ListVariable(*args, **kw)
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Options/PackageOption.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Options/PackageOption.py
new file mode 100644
index 0000000..ba0608a
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Options/PackageOption.py
@@ -0,0 +1,50 @@
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+__doc__ = """Place-holder for the old SCons.Options module hierarchy
+
+This is for backwards compatibility. The new equivalent is the Variables/
+class hierarchy. These will have deprecation warnings added (some day),
+and will then be removed entirely (some day).
+"""
+
+import SCons.Variables
+import SCons.Warnings
+
+warned = False
+
+def PackageOption(*args, **kw):
+ global warned
+ if not warned:
+ msg = "The PackageOption() function is deprecated; use the PackageVariable() function instead."
+ SCons.Warnings.warn(SCons.Warnings.DeprecatedOptionsWarning, msg)
+ warned = True
+ return SCons.Variables.PackageVariable(*args, **kw)
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Options/PathOption.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Options/PathOption.py
new file mode 100644
index 0000000..0cc2988
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Options/PathOption.py
@@ -0,0 +1,76 @@
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+__doc__ = """Place-holder for the old SCons.Options module hierarchy
+
+This is for backwards compatibility. The new equivalent is the Variables/
+class hierarchy. These will have deprecation warnings added (some day),
+and will then be removed entirely (some day).
+"""
+
+import SCons.Variables
+import SCons.Warnings
+
+warned = False
+
+class _PathOptionClass(object):
+ def warn(self):
+ global warned
+ if not warned:
+ msg = "The PathOption() function is deprecated; use the PathVariable() function instead."
+ SCons.Warnings.warn(SCons.Warnings.DeprecatedOptionsWarning, msg)
+ warned = True
+
+ def __call__(self, *args, **kw):
+ self.warn()
+ return SCons.Variables.PathVariable(*args, **kw)
+
+ def PathAccept(self, *args, **kw):
+ self.warn()
+ return SCons.Variables.PathVariable.PathAccept(*args, **kw)
+
+ def PathIsDir(self, *args, **kw):
+ self.warn()
+ return SCons.Variables.PathVariable.PathIsDir(*args, **kw)
+
+ def PathIsDirCreate(self, *args, **kw):
+ self.warn()
+ return SCons.Variables.PathVariable.PathIsDirCreate(*args, **kw)
+
+ def PathIsFile(self, *args, **kw):
+ self.warn()
+ return SCons.Variables.PathVariable.PathIsFile(*args, **kw)
+
+ def PathExists(self, *args, **kw):
+ self.warn()
+ return SCons.Variables.PathVariable.PathExists(*args, **kw)
+
+PathOption = _PathOptionClass()
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Options/__init__.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Options/__init__.py
new file mode 100644
index 0000000..2544aec
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Options/__init__.py
@@ -0,0 +1,67 @@
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+__doc__ = """Place-holder for the old SCons.Options module hierarchy
+
+This is for backwards compatibility. The new equivalent is the Variables/
+class hierarchy. These will have deprecation warnings added (some day),
+and will then be removed entirely (some day).
+"""
+
+import SCons.Variables
+import SCons.Warnings
+
+from .BoolOption import BoolOption # okay
+from .EnumOption import EnumOption # okay
+from .ListOption import ListOption # naja
+from .PackageOption import PackageOption # naja
+from .PathOption import PathOption # okay
+
+warned = False
+
+class Options(SCons.Variables.Variables):
+ def __init__(self, *args, **kw):
+ global warned
+ if not warned:
+ msg = "The Options class is deprecated; use the Variables class instead."
+ SCons.Warnings.warn(SCons.Warnings.DeprecatedOptionsWarning, msg)
+ warned = True
+ SCons.Variables.Variables.__init__(self, *args, **kw)
+
+ def AddOptions(self, *args, **kw):
+ return SCons.Variables.Variables.AddVariables(self, *args, **kw)
+
+ def UnknownOptions(self, *args, **kw):
+ return SCons.Variables.Variables.UnknownVariables(self, *args, **kw)
+
+ def FormatOptionHelpText(self, *args, **kw):
+ return SCons.Variables.Variables.FormatVariableHelpText(self, *args,
+ **kw)
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/PathList.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/PathList.py
new file mode 100644
index 0000000..76cbeab
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/PathList.py
@@ -0,0 +1,227 @@
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+__doc__ = """SCons.PathList
+
+A module for handling lists of directory paths (the sort of things
+that get set as CPPPATH, LIBPATH, etc.) with as much caching of data and
+efficiency as we can, while still keeping the evaluation delayed so that we
+Do the Right Thing (almost) regardless of how the variable is specified.
+
+"""
+
+import os
+
+import SCons.Memoize
+import SCons.Node
+import SCons.Util
+
+#
+# Variables to specify the different types of entries in a PathList object:
+#
+
+TYPE_STRING_NO_SUBST = 0 # string with no '$'
+TYPE_STRING_SUBST = 1 # string containing '$'
+TYPE_OBJECT = 2 # other object
+
+def node_conv(obj):
+ """
+ This is the "string conversion" routine that we have our substitutions
+ use to return Nodes, not strings. This relies on the fact that an
+ EntryProxy object has a get() method that returns the underlying
+ Node that it wraps, which is a bit of architectural dependence
+ that we might need to break or modify in the future in response to
+ additional requirements.
+ """
+ try:
+ get = obj.get
+ except AttributeError:
+ if isinstance(obj, SCons.Node.Node) or SCons.Util.is_Sequence( obj ):
+ result = obj
+ else:
+ result = str(obj)
+ else:
+ result = get()
+ return result
+
+class _PathList(object):
+ """
+ An actual PathList object.
+ """
+ def __init__(self, pathlist):
+ """
+ Initializes a PathList object, canonicalizing the input and
+ pre-processing it for quicker substitution later.
+
+ The stored representation of the PathList is a list of tuples
+ containing (type, value), where the "type" is one of the TYPE_*
+ variables defined above. We distinguish between:
+
+ strings that contain no '$' and therefore need no
+ delayed-evaluation string substitution (we expect that there
+ will be many of these and that we therefore get a pretty
+ big win from avoiding string substitution)
+
+ strings that contain '$' and therefore need substitution
+ (the hard case is things like '${TARGET.dir}/include',
+ which require re-evaluation for every target + source)
+
+ other objects (which may be something like an EntryProxy
+ that needs a method called to return a Node)
+
+ Pre-identifying the type of each element in the PathList up-front
+ and storing the type in the list of tuples is intended to reduce
+ the amount of calculation when we actually do the substitution
+ over and over for each target.
+ """
+ if SCons.Util.is_String(pathlist):
+ pathlist = pathlist.split(os.pathsep)
+ elif not SCons.Util.is_Sequence(pathlist):
+ pathlist = [pathlist]
+
+ pl = []
+ for p in pathlist:
+ try:
+ found = '$' in p
+ except (AttributeError, TypeError):
+ type = TYPE_OBJECT
+ else:
+ if not found:
+ type = TYPE_STRING_NO_SUBST
+ else:
+ type = TYPE_STRING_SUBST
+ pl.append((type, p))
+
+ self.pathlist = tuple(pl)
+
+ def __len__(self): return len(self.pathlist)
+
+ def __getitem__(self, i): return self.pathlist[i]
+
+ def subst_path(self, env, target, source):
+ """
+ Performs construction variable substitution on a pre-digested
+ PathList for a specific target and source.
+ """
+ result = []
+ for type, value in self.pathlist:
+ if type == TYPE_STRING_SUBST:
+ value = env.subst(value, target=target, source=source,
+ conv=node_conv)
+ if SCons.Util.is_Sequence(value):
+ result.extend(SCons.Util.flatten(value))
+ elif value:
+ result.append(value)
+ elif type == TYPE_OBJECT:
+ value = node_conv(value)
+ if value:
+ result.append(value)
+ elif value:
+ result.append(value)
+ return tuple(result)
+
+
+class PathListCache(object):
+ """
+ A class to handle caching of PathList lookups.
+
+ This class gets instantiated once and then deleted from the namespace,
+ so it's used as a Singleton (although we don't enforce that in the
+ usual Pythonic ways). We could have just made the cache a dictionary
+ in the module namespace, but putting it in this class allows us to
+ use the same Memoizer pattern that we use elsewhere to count cache
+ hits and misses, which is very valuable.
+
+ Lookup keys in the cache are computed by the _PathList_key() method.
+ Cache lookup should be quick, so we don't spend cycles canonicalizing
+ all forms of the same lookup key. For example, 'x:y' and ['x',
+ 'y'] logically represent the same list, but we don't bother to
+ split string representations and treat those two equivalently.
+ (Note, however, that we do, treat lists and tuples the same.)
+
+ The main type of duplication we're trying to catch will come from
+ looking up the same path list from two different clones of the
+ same construction environment. That is, given
+
+ env2 = env1.Clone()
+
+ both env1 and env2 will have the same CPPPATH value, and we can
+ cheaply avoid re-parsing both values of CPPPATH by using the
+ common value from this cache.
+ """
+ def __init__(self):
+ self._memo = {}
+
+ def _PathList_key(self, pathlist):
+ """
+ Returns the key for memoization of PathLists.
+
+ Note that we want this to be pretty quick, so we don't completely
+ canonicalize all forms of the same list. For example,
+ 'dir1:$ROOT/dir2' and ['$ROOT/dir1', 'dir'] may logically
+ represent the same list if you're executing from $ROOT, but
+ we're not going to bother splitting strings into path elements,
+ or massaging strings into Nodes, to identify that equivalence.
+ We just want to eliminate obvious redundancy from the normal
+ case of re-using exactly the same cloned value for a path.
+ """
+ if SCons.Util.is_Sequence(pathlist):
+ pathlist = tuple(SCons.Util.flatten(pathlist))
+ return pathlist
+
+ @SCons.Memoize.CountDictCall(_PathList_key)
+ def PathList(self, pathlist):
+ """
+ Returns the cached _PathList object for the specified pathlist,
+ creating and caching a new object as necessary.
+ """
+ pathlist = self._PathList_key(pathlist)
+ try:
+ memo_dict = self._memo['PathList']
+ except KeyError:
+ memo_dict = {}
+ self._memo['PathList'] = memo_dict
+ else:
+ try:
+ return memo_dict[pathlist]
+ except KeyError:
+ pass
+
+ result = _PathList(pathlist)
+
+ memo_dict[pathlist] = result
+
+ return result
+
+PathList = PathListCache().PathList
+
+
+del PathListCache
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/PathListTests.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/PathListTests.py
new file mode 100644
index 0000000..b5989bb
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/PathListTests.py
@@ -0,0 +1,207 @@
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import sys
+import unittest
+
+import TestUnit
+
+import SCons.PathList
+
+
+class subst_pathTestCase(unittest.TestCase):
+
+ def setUp(self):
+
+ class FakeEnvironment(object):
+ def __init__(self, **kw):
+ self.kw = kw
+ def subst(self, s, target=None, source=None, conv=lambda x: x):
+ if s[0] == '$':
+ s = s[1:]
+ if s == 'target':
+ s = target
+ elif s == 'source':
+ s = source
+ else:
+ s = self.kw[s]
+ return s
+
+ self.env = FakeEnvironment(AAA = 'aaa', NULL = '')
+ from SCons.Environment import Environment
+ self.env = Environment(AAA = 'aaa', NULL = '')
+
+ def test_node(self):
+ """Test the subst_path() method on a Node
+ """
+
+ import SCons.Node
+
+ class A(object):
+ pass
+
+ n = SCons.Node.Node()
+
+ pl = SCons.PathList.PathList((n,))
+
+ result = pl.subst_path(self.env, 'y', 'z')
+
+ assert result == (n,), result
+
+ def test_object(self):
+ """Test the subst_path() method on a non-Node object
+ """
+
+ class A(object):
+ def __str__(self):
+ return '<object A>'
+
+ a = A()
+
+ pl = SCons.PathList.PathList((a,))
+
+ result = pl.subst_path(self.env, 'y', 'z')
+
+ assert result == ('<object A>',), result
+
+ def test_object_get(self):
+ """Test the subst_path() method on an object with a get() method
+ """
+
+ class B(object):
+ def get(self):
+ return 'b'
+
+ b = B()
+
+ pl = SCons.PathList.PathList((b,))
+
+ result = pl.subst_path(self.env, 'y', 'z')
+
+ assert result == ('b',), result
+
+ def test_string(self):
+ """Test the subst_path() method on a non-substitution string
+ """
+
+ self.env.subst = lambda s, target, source, conv: 'NOT THIS STRING'
+
+ pl = SCons.PathList.PathList(('x'))
+
+ result = pl.subst_path(self.env, 'y', 'z')
+
+ assert result == ('x',), result
+
+ def test_subst(self):
+ """Test the subst_path() method on substitution strings
+ """
+
+ pl = SCons.PathList.PathList(('$AAA', '$NULL'))
+
+ result = pl.subst_path(self.env, 'y', 'z')
+
+ assert result == ('aaa',), result
+
+ def test_list_of_lists(self):
+ """Test the subst_path() method on substitution of nested lists.
+ """
+ pl = SCons.PathList.PathList((['$AAA', '$AAA'], '$NULL'))
+ result = pl.subst_path(self.env, 'y', 'z')
+ assert result == ('aaa', 'aaa'), result
+
+ def test_subst_nested(self):
+ """Test the subst_path() method on nested substitution of strings.
+ """
+ self.env.Append(L1 = ['a', 'b'],
+ L2 = ['c', 'd'],
+ L3 = ['$L2'])
+ pl = SCons.PathList.PathList(['$L1'])
+ result = pl.subst_path(self.env, 'y', 'z')
+ assert result == ('a', 'b'), result
+ self.env.Append(L1 = ['$L2'])
+ pl = SCons.PathList.PathList(['$L1'])
+ result = pl.subst_path(self.env, 'y', 'z')
+ assert result == ('a', 'b', 'c', 'd'), result
+ self.env.Append(L1 = ['$L3'])
+ pl = SCons.PathList.PathList(['$L1'])
+ result = pl.subst_path(self.env, 'y', 'z')
+ assert result == ('a', 'b', 'c', 'd', 'c', 'd'), result
+
+ def test_another_env(self):
+ """Test the subst_path does lazy evaluation.
+ """
+ pl = SCons.PathList.PathList(('$AAA', '$NULL'))
+ result = pl.subst_path(self.env, 'y', 'z')
+ assert result == ('aaa',), result
+ e = self.env.Clone(AAA = 'bbb')
+ result = pl.subst_path(e, 'y', 'z')
+ assert result == ('bbb',), result
+
+class PathListCacheTestCase(unittest.TestCase):
+
+ def test_no_PathListCache(self):
+ """Make sure the PathListCache class is not visible
+ """
+ try:
+ SCons.PathList.PathListCache
+ except AttributeError:
+ pass
+ else:
+ self.fail("Found PathListCache unexpectedly\n")
+
+
+class PathListTestCase(unittest.TestCase):
+
+ def test_PathList(self):
+ """Test the PathList() entry point
+ """
+
+ x1 = SCons.PathList.PathList(('x',))
+ x2 = SCons.PathList.PathList(['x',])
+
+ assert x1 is x2, (x1, x2)
+
+ x3 = SCons.PathList.PathList('x')
+
+ assert not x1 is x3, (x1, x3)
+
+
+if __name__ == "__main__":
+ suite = unittest.TestSuite()
+ tclasses = [
+ subst_pathTestCase,
+ PathListCacheTestCase,
+ PathListTestCase,
+ ]
+ for tclass in tclasses:
+ names = unittest.getTestCaseNames(tclass, 'test_')
+ suite.addTests(list(map(tclass, names)))
+ TestUnit.run(suite)
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Platform/PlatformTests.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Platform/PlatformTests.py
new file mode 100644
index 0000000..3432e94
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Platform/PlatformTests.py
@@ -0,0 +1,223 @@
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import SCons.compat
+
+import collections
+import unittest
+
+import TestUnit
+
+import SCons.Errors
+import SCons.Platform
+import SCons.Environment
+import SCons.Action
+
+class Environment(collections.UserDict):
+ def Detect(self, cmd):
+ return cmd
+
+ def AppendENVPath(self, key, value):
+ pass
+
+class PlatformTestCase(unittest.TestCase):
+ def test_Platform(self):
+ """Test the Platform() function"""
+ p = SCons.Platform.Platform('cygwin')
+ assert str(p) == 'cygwin', p
+ env = Environment()
+ p(env)
+ assert env['PROGSUFFIX'] == '.exe', env
+ assert env['LIBSUFFIX'] == '.a', env
+ assert env['SHELL'] == 'sh', env
+
+ p = SCons.Platform.Platform('os2')
+ assert str(p) == 'os2', p
+ env = Environment()
+ p(env)
+ assert env['PROGSUFFIX'] == '.exe', env
+ assert env['LIBSUFFIX'] == '.lib', env
+
+ p = SCons.Platform.Platform('posix')
+ assert str(p) == 'posix', p
+ env = Environment()
+ p(env)
+ assert env['PROGSUFFIX'] == '', env
+ assert env['LIBSUFFIX'] == '.a', env
+ assert env['SHELL'] == 'sh', env
+
+ p = SCons.Platform.Platform('irix')
+ assert str(p) == 'irix', p
+ env = Environment()
+ p(env)
+ assert env['PROGSUFFIX'] == '', env
+ assert env['LIBSUFFIX'] == '.a', env
+ assert env['SHELL'] == 'sh', env
+
+ p = SCons.Platform.Platform('aix')
+ assert str(p) == 'aix', p
+ env = Environment()
+ p(env)
+ assert env['PROGSUFFIX'] == '', env
+ assert env['LIBSUFFIX'] == '.a', env
+ assert env['SHELL'] == 'sh', env
+
+ p = SCons.Platform.Platform('sunos')
+ assert str(p) == 'sunos', p
+ env = Environment()
+ p(env)
+ assert env['PROGSUFFIX'] == '', env
+ assert env['LIBSUFFIX'] == '.a', env
+ assert env['SHELL'] == 'sh', env
+
+ p = SCons.Platform.Platform('hpux')
+ assert str(p) == 'hpux', p
+ env = Environment()
+ p(env)
+ assert env['PROGSUFFIX'] == '', env
+ assert env['LIBSUFFIX'] == '.a', env
+ assert env['SHELL'] == 'sh', env
+
+ p = SCons.Platform.Platform('win32')
+ assert str(p) == 'win32', p
+ env = Environment()
+ p(env)
+ assert env['PROGSUFFIX'] == '.exe', env
+ assert env['LIBSUFFIX'] == '.lib', env
+ assert str
+
+ try:
+ p = SCons.Platform.Platform('_does_not_exist_')
+ except SCons.Errors.UserError:
+ pass
+ else:
+ raise
+
+ env = Environment()
+ SCons.Platform.Platform()(env)
+ assert env != {}, env
+
+class TempFileMungeTestCase(unittest.TestCase):
+ def test_MAXLINELENGTH(self):
+ """ Test different values for MAXLINELENGTH with the same
+ size command string to ensure that the temp file mechanism
+ kicks in only at MAXLINELENGTH+1, or higher
+ """
+ # Init class with cmd, such that the fully expanded
+ # string reads "a test command line".
+ # Note, how we're using a command string here that is
+ # actually longer than the substituted one. This is to ensure
+ # that the TempFileMunge class internally really takes the
+ # length of the expanded string into account.
+ defined_cmd = "a $VERY $OVERSIMPLIFIED line"
+ t = SCons.Platform.TempFileMunge(defined_cmd)
+ env = SCons.Environment.SubstitutionEnvironment(tools=[])
+ # Setting the line length high enough...
+ env['MAXLINELENGTH'] = 1024
+ env['VERY'] = 'test'
+ env['OVERSIMPLIFIED'] = 'command'
+ expanded_cmd = env.subst(defined_cmd)
+ # Call the tempfile munger
+ cmd = t(None,None,env,0)
+ assert cmd == defined_cmd, cmd
+ # Let MAXLINELENGTH equal the string's length
+ env['MAXLINELENGTH'] = len(expanded_cmd)
+ cmd = t(None,None,env,0)
+ assert cmd == defined_cmd, cmd
+ # Finally, let the actual tempfile mechanism kick in
+ # Disable printing of actions...
+ old_actions = SCons.Action.print_actions
+ SCons.Action.print_actions = 0
+ env['MAXLINELENGTH'] = len(expanded_cmd)-1
+ cmd = t(None,None,env,0)
+ # ...and restoring its setting.
+ SCons.Action.print_actions = old_actions
+ assert cmd != defined_cmd, cmd
+
+ def test_tempfilecreation_once(self):
+ # Init class with cmd, such that the fully expanded
+ # string reads "a test command line".
+ # Note, how we're using a command string here that is
+ # actually longer than the substituted one. This is to ensure
+ # that the TempFileMunge class internally really takes the
+ # length of the expanded string into account.
+ defined_cmd = "a $VERY $OVERSIMPLIFIED line"
+ t = SCons.Platform.TempFileMunge(defined_cmd)
+ env = SCons.Environment.SubstitutionEnvironment(tools=[])
+ # Setting the line length high enough...
+ env['VERY'] = 'test'
+ env['OVERSIMPLIFIED'] = 'command'
+ expanded_cmd = env.subst(defined_cmd)
+ env['MAXLINELENGTH'] = len(expanded_cmd)-1
+ # Disable printing of actions...
+ old_actions = SCons.Action.print_actions
+ SCons.Action.print_actions = 0
+ # Create an instance of object derived class to allow setattrb
+ class Node(object) :
+ class Attrs(object):
+ pass
+ def __init__(self):
+ self.attributes = self.Attrs()
+ target = [Node()]
+ cmd = t(target, None, env, 0)
+ # ...and restoring its setting.
+ SCons.Action.print_actions = old_actions
+ assert cmd != defined_cmd, cmd
+ assert cmd == getattr(target[0].attributes, 'tempfile_cmdlist', None)
+
+class PlatformEscapeTestCase(unittest.TestCase):
+ def test_posix_escape(self):
+ """ Check that paths with parens are escaped properly
+ """
+ import SCons.Platform.posix
+
+ test_string = "/my (really) great code/main.cpp"
+ output = SCons.Platform.posix.escape(test_string)
+
+ # We expect the escape function to wrap the string
+ # in quotes, but not escape any internal characters
+ # in the test_string. (Parens doesn't require shell
+ # escaping if their quoted)
+ assert output[1:-1] == test_string
+
+
+if __name__ == "__main__":
+ suite = unittest.TestSuite()
+
+ tclasses = [ PlatformTestCase,
+ TempFileMungeTestCase,
+ PlatformEscapeTestCase,
+ ]
+ for tclass in tclasses:
+ names = unittest.getTestCaseNames(tclass, 'test_')
+ suite.addTests(list(map(tclass, names)))
+
+ TestUnit.run(suite)
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Platform/__init__.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Platform/__init__.py
new file mode 100644
index 0000000..1654d0a
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Platform/__init__.py
@@ -0,0 +1,267 @@
+"""SCons.Platform
+
+SCons platform selection.
+
+This looks for modules that define a callable object that can modify a
+construction environment as appropriate for a given platform.
+
+Note that we take a more simplistic view of "platform" than Python does.
+We're looking for a single string that determines a set of
+tool-independent variables with which to initialize a construction
+environment. Consequently, we'll examine both sys.platform and os.name
+(and anything else that might come in to play) in order to return some
+specification which is unique enough for our purposes.
+
+Note that because this subsystem just *selects* a callable that can
+modify a construction environment, it's possible for people to define
+their own "platform specification" in an arbitrary callable function.
+No one needs to use or tie in to this subsystem in order to roll
+their own platform definition.
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+from __future__ import print_function
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import SCons.compat
+
+import imp
+import os
+import sys
+import tempfile
+
+import SCons.Errors
+import SCons.Subst
+import SCons.Tool
+
+
+def platform_default():
+ """Return the platform string for our execution environment.
+
+ The returned value should map to one of the SCons/Platform/*.py
+ files. Since we're architecture independent, though, we don't
+ care about the machine architecture.
+ """
+ osname = os.name
+ if osname == 'java':
+ osname = os._osType
+ if osname == 'posix':
+ if sys.platform == 'cygwin':
+ return 'cygwin'
+ elif sys.platform.find('irix') != -1:
+ return 'irix'
+ elif sys.platform.find('sunos') != -1:
+ return 'sunos'
+ elif sys.platform.find('hp-ux') != -1:
+ return 'hpux'
+ elif sys.platform.find('aix') != -1:
+ return 'aix'
+ elif sys.platform.find('darwin') != -1:
+ return 'darwin'
+ else:
+ return 'posix'
+ elif os.name == 'os2':
+ return 'os2'
+ else:
+ return sys.platform
+
+def platform_module(name = platform_default()):
+ """Return the imported module for the platform.
+
+ This looks for a module name that matches the specified argument.
+ If the name is unspecified, we fetch the appropriate default for
+ our execution environment.
+ """
+ full_name = 'SCons.Platform.' + name
+ if full_name not in sys.modules:
+ if os.name == 'java':
+ eval(full_name)
+ else:
+ try:
+ file, path, desc = imp.find_module(name,
+ sys.modules['SCons.Platform'].__path__)
+ try:
+ mod = imp.load_module(full_name, file, path, desc)
+ finally:
+ if file:
+ file.close()
+ except ImportError:
+ try:
+ import zipimport
+ importer = zipimport.zipimporter( sys.modules['SCons.Platform'].__path__[0] )
+ mod = importer.load_module(full_name)
+ except ImportError:
+ raise SCons.Errors.UserError("No platform named '%s'" % name)
+ setattr(SCons.Platform, name, mod)
+ return sys.modules[full_name]
+
+def DefaultToolList(platform, env):
+ """Select a default tool list for the specified platform.
+ """
+ return SCons.Tool.tool_list(platform, env)
+
+class PlatformSpec(object):
+ def __init__(self, name, generate):
+ self.name = name
+ self.generate = generate
+
+ def __call__(self, *args, **kw):
+ return self.generate(*args, **kw)
+
+ def __str__(self):
+ return self.name
+
+class TempFileMunge(object):
+ """A callable class. You can set an Environment variable to this,
+ then call it with a string argument, then it will perform temporary
+ file substitution on it. This is used to circumvent the long command
+ line limitation.
+
+ Example usage:
+ env["TEMPFILE"] = TempFileMunge
+ env["LINKCOM"] = "${TEMPFILE('$LINK $TARGET $SOURCES','$LINKCOMSTR')}"
+
+ By default, the name of the temporary file used begins with a
+ prefix of '@'. This may be configred for other tool chains by
+ setting '$TEMPFILEPREFIX'.
+
+ env["TEMPFILEPREFIX"] = '-@' # diab compiler
+ env["TEMPFILEPREFIX"] = '-via' # arm tool chain
+ """
+ def __init__(self, cmd, cmdstr = None):
+ self.cmd = cmd
+ self.cmdstr = cmdstr
+
+ def __call__(self, target, source, env, for_signature):
+ if for_signature:
+ # If we're being called for signature calculation, it's
+ # because we're being called by the string expansion in
+ # Subst.py, which has the logic to strip any $( $) that
+ # may be in the command line we squirreled away. So we
+ # just return the raw command line and let the upper
+ # string substitution layers do their thing.
+ return self.cmd
+
+ # Now we're actually being called because someone is actually
+ # going to try to execute the command, so we have to do our
+ # own expansion.
+ cmd = env.subst_list(self.cmd, SCons.Subst.SUBST_CMD, target, source)[0]
+ try:
+ maxline = int(env.subst('$MAXLINELENGTH'))
+ except ValueError:
+ maxline = 2048
+
+ length = 0
+ for c in cmd:
+ length += len(c)
+ length += len(cmd) - 1
+ if length <= maxline:
+ return self.cmd
+
+ # Check if we already created the temporary file for this target
+ # It should have been previously done by Action.strfunction() call
+ node = target[0] if SCons.Util.is_List(target) else target
+ cmdlist = getattr(node.attributes, 'tempfile_cmdlist', None) \
+ if node is not None else None
+ if cmdlist is not None :
+ return cmdlist
+
+ # We do a normpath because mktemp() has what appears to be
+ # a bug in Windows that will use a forward slash as a path
+ # delimiter. Windows's link mistakes that for a command line
+ # switch and barfs.
+ #
+ # We use the .lnk suffix for the benefit of the Phar Lap
+ # linkloc linker, which likes to append an .lnk suffix if
+ # none is given.
+ (fd, tmp) = tempfile.mkstemp('.lnk', text=True)
+ native_tmp = SCons.Util.get_native_path(os.path.normpath(tmp))
+
+ if env.get('SHELL',None) == 'sh':
+ # The sh shell will try to escape the backslashes in the
+ # path, so unescape them.
+ native_tmp = native_tmp.replace('\\', r'\\\\')
+ # In Cygwin, we want to use rm to delete the temporary
+ # file, because del does not exist in the sh shell.
+ rm = env.Detect('rm') or 'del'
+ else:
+ # Don't use 'rm' if the shell is not sh, because rm won't
+ # work with the Windows shells (cmd.exe or command.com) or
+ # Windows path names.
+ rm = 'del'
+
+ prefix = env.subst('$TEMPFILEPREFIX')
+ if not prefix:
+ prefix = '@'
+
+ args = list(map(SCons.Subst.quote_spaces, cmd[1:]))
+ os.write(fd, bytearray(" ".join(args) + "\n",'utf-8'))
+ os.close(fd)
+ # XXX Using the SCons.Action.print_actions value directly
+ # like this is bogus, but expedient. This class should
+ # really be rewritten as an Action that defines the
+ # __call__() and strfunction() methods and lets the
+ # normal action-execution logic handle whether or not to
+ # print/execute the action. The problem, though, is all
+ # of that is decided before we execute this method as
+ # part of expanding the $TEMPFILE construction variable.
+ # Consequently, refactoring this will have to wait until
+ # we get more flexible with allowing Actions to exist
+ # independently and get strung together arbitrarily like
+ # Ant tasks. In the meantime, it's going to be more
+ # user-friendly to not let obsession with architectural
+ # purity get in the way of just being helpful, so we'll
+ # reach into SCons.Action directly.
+ if SCons.Action.print_actions:
+ cmdstr = env.subst(self.cmdstr, SCons.Subst.SUBST_RAW, target,
+ source) if self.cmdstr is not None else ''
+ # Print our message only if XXXCOMSTR returns an empty string
+ if len(cmdstr) == 0 :
+ print("Using tempfile "+native_tmp+" for command line:\n"+
+ str(cmd[0]) + " " + " ".join(args))
+
+ # Store the temporary file command list into the target Node.attributes
+ # to avoid creating two temporary files one for print and one for execute.
+ cmdlist = [ cmd[0], prefix + native_tmp + '\n' + rm, native_tmp ]
+ if node is not None:
+ try :
+ setattr(node.attributes, 'tempfile_cmdlist', cmdlist)
+ except AttributeError:
+ pass
+ return cmdlist
+
+
+def Platform(name = platform_default()):
+ """Select a canned Platform specification.
+ """
+ module = platform_module(name)
+ spec = PlatformSpec(name, module.generate)
+ return spec
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Platform/__init__.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Platform/__init__.xml
new file mode 100644
index 0000000..0802369
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Platform/__init__.xml
@@ -0,0 +1,244 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+__COPYRIGHT__
+
+This file is processed by the bin/SConsDoc.py module.
+See its __doc__ string for a discussion of the format.
+-->
+
+<!DOCTYPE sconsdoc [
+<!ENTITY % scons SYSTEM '../../../../doc/scons.mod'>
+%scons;
+<!ENTITY % builders-mod SYSTEM '../../../../doc/generated/builders.mod'>
+%builders-mod;
+<!ENTITY % functions-mod SYSTEM '../../../../doc/generated/functions.mod'>
+%functions-mod;
+<!ENTITY % tools-mod SYSTEM '../../../../doc/generated/tools.mod'>
+%tools-mod;
+<!ENTITY % variables-mod SYSTEM '../../../../doc/generated/variables.mod'>
+%variables-mod;
+]>
+
+<sconsdoc xmlns="http://www.scons.org/dbxsd/v1.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://www.scons.org/dbxsd/v1.0 http://www.scons.org/dbxsd/v1.0/scons.xsd">
+
+<cvar name="ESCAPE">
+<summary>
+<para>
+A function that will be called to escape shell special characters in
+command lines. The function should take one argument: the command line
+string to escape; and should return the escaped command line.
+</para>
+</summary>
+</cvar>
+
+<cvar name="LIBPREFIX">
+<summary>
+<para>
+The prefix used for (static) library file names.
+A default value is set for each platform
+(posix, win32, os2, etc.),
+but the value is overridden by individual tools
+(ar, mslib, sgiar, sunar, tlib, etc.)
+to reflect the names of the libraries they create.
+</para>
+</summary>
+</cvar>
+
+<cvar name="LIBPREFIXES">
+<summary>
+<para>
+A list of all legal prefixes for library file names.
+When searching for library dependencies,
+SCons will look for files with these prefixes,
+the base library name,
+and suffixes in the &cv-LIBSUFFIXES; list.
+</para>
+</summary>
+</cvar>
+
+<cvar name="LIBSUFFIX">
+<summary>
+<para>
+The suffix used for (static) library file names.
+A default value is set for each platform
+(posix, win32, os2, etc.),
+but the value is overridden by individual tools
+(ar, mslib, sgiar, sunar, tlib, etc.)
+to reflect the names of the libraries they create.
+</para>
+</summary>
+</cvar>
+
+<cvar name="LIBSUFFIXES">
+<summary>
+<para>
+A list of all legal suffixes for library file names.
+When searching for library dependencies,
+SCons will look for files with prefixes, in the &cv-LIBPREFIXES; list,
+the base library name,
+and these suffixes.
+</para>
+</summary>
+</cvar>
+
+<cvar name="OBJPREFIX">
+<summary>
+<para>
+The prefix used for (static) object file names.
+</para>
+</summary>
+</cvar>
+
+<cvar name="OBJSUFFIX">
+<summary>
+<para>
+The suffix used for (static) object file names.
+</para>
+</summary>
+</cvar>
+
+<cvar name="PLATFORM">
+<summary>
+<para>
+The name of the platform used to create the Environment. If no platform is
+specified when the Environment is created,
+&scons;
+autodetects the platform.
+</para>
+
+<example_commands>
+env = Environment(tools = [])
+if env['PLATFORM'] == 'cygwin':
+ Tool('mingw')(env)
+else:
+ Tool('msvc')(env)
+</example_commands>
+</summary>
+</cvar>
+
+<cvar name="HOST_OS">
+ <summary>
+<para>
+ The name of the host operating system used to create the Environment.
+ If a platform is specified when creating the Environment, then
+ that Platform's logic will handle setting this value.
+ This value is immutable, and should not be changed by the user after
+ the Environment is initialized.
+ Currently only set for Win32.
+</para>
+ </summary>
+</cvar>
+
+<cvar name="HOST_ARCH">
+ <summary>
+<para>
+ The name of the host hardware architecture used to create the Environment.
+ If a platform is specified when creating the Environment, then
+ that Platform's logic will handle setting this value.
+ This value is immutable, and should not be changed by the user after
+ the Environment is initialized.
+ Currently only set for Win32.
+</para>
+ </summary>
+</cvar>
+
+<cvar name="TARGET_OS">
+ <summary>
+<para>
+ The name of the target operating system for the compiled objects
+ created by this Environment.
+ This defaults to the value of HOST_OS, and the user can override it.
+ Currently only set for Win32.
+</para>
+ </summary>
+</cvar>
+
+<cvar name="TARGET_ARCH">
+ <summary>
+<para>
+ The name of the target hardware architecture for the compiled objects
+ created by this Environment.
+ This defaults to the value of HOST_ARCH, and the user can override it.
+ Currently only set for Win32.
+</para>
+ </summary>
+</cvar>
+
+
+<cvar name="PROGPREFIX">
+<summary>
+<para>
+The prefix used for executable file names.
+</para>
+</summary>
+</cvar>
+
+<cvar name="PROGSUFFIX">
+<summary>
+<para>
+The suffix used for executable file names.
+</para>
+</summary>
+</cvar>
+
+<cvar name="SHELL">
+<summary>
+<para>
+A string naming the shell program that will be passed to the
+&cv-SPAWN;
+function.
+See the
+&cv-SPAWN;
+construction variable for more information.
+</para>
+</summary>
+</cvar>
+
+<cvar name="SHLIBPREFIX">
+<summary>
+<para>
+The prefix used for shared library file names.
+</para>
+</summary>
+</cvar>
+
+<cvar name="SHLIBSUFFIX">
+<summary>
+<para>
+The suffix used for shared library file names.
+</para>
+</summary>
+</cvar>
+
+<cvar name="SHOBJPREFIX">
+<summary>
+<para>
+The prefix used for shared object file names.
+</para>
+</summary>
+</cvar>
+
+<cvar name="SHOBJSUFFIX">
+<summary>
+<para>
+The suffix used for shared object file names.
+</para>
+</summary>
+</cvar>
+
+<cvar name="TEMPFILEPREFIX">
+<summary>
+<para>
+The prefix for a temporary file used
+to execute lines longer than $MAXLINELENGTH.
+The default is '@'.
+This may be set for toolchains that use other values,
+such as '-@' for the diab compiler
+or '-via' for ARM toolchain.
+</para>
+</summary>
+</cvar>
+
+</sconsdoc>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Platform/aix.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Platform/aix.py
new file mode 100644
index 0000000..0266dc6
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Platform/aix.py
@@ -0,0 +1,85 @@
+"""engine.SCons.Platform.aix
+
+Platform-specific initialization for IBM AIX systems.
+
+There normally shouldn't be any need to import this module directly. It
+will usually be imported through the generic SCons.Platform.Platform()
+selection method.
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import os
+import subprocess
+
+from . import posix
+
+import SCons.Util
+import SCons.Action
+
+def get_xlc(env, xlc=None, packages=[]):
+ # Use the AIX package installer tool lslpp to figure out where a
+ # given xl* compiler is installed and what version it is.
+ xlcPath = None
+ xlcVersion = None
+
+ if xlc is None:
+ xlc = env.get('CC', 'xlc')
+ if SCons.Util.is_List(xlc):
+ xlc = xlc[0]
+ for package in packages:
+ # find the installed filename, which may be a symlink as well
+ pipe = SCons.Action._subproc(env, ['lslpp', '-fc', package],
+ stdin = 'devnull',
+ stderr = 'devnull',
+ stdout = subprocess.PIPE)
+ # output of lslpp is something like this:
+ # #Path:Fileset:File
+ # /usr/lib/objrepos:vac.C 6.0.0.0:/usr/vac/exe/xlCcpp
+ # /usr/lib/objrepos:vac.C 6.0.0.0:/usr/vac/bin/xlc_r -> /usr/vac/bin/xlc
+ for line in pipe.stdout:
+ if xlcPath:
+ continue # read everything to let lslpp terminate
+ fileset, filename = line.split(':')[1:3]
+ filename = filename.split()[0]
+ if ('/' in xlc and filename == xlc) \
+ or ('/' not in xlc and filename.endswith('/' + xlc)):
+ xlcVersion = fileset.split()[1]
+ xlcPath, sep, xlc = filename.rpartition('/')
+ pass
+ pass
+ return (xlcPath, xlc, xlcVersion)
+
+def generate(env):
+ posix.generate(env)
+ #Based on AIX 5.2: ARG_MAX=24576 - 3000 for environment expansion
+ env['MAXLINELENGTH'] = 21576
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Platform/cygwin.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Platform/cygwin.py
new file mode 100644
index 0000000..8b4669c
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Platform/cygwin.py
@@ -0,0 +1,55 @@
+"""SCons.Platform.cygwin
+
+Platform-specific initialization for Cygwin systems.
+
+There normally shouldn't be any need to import this module directly. It
+will usually be imported through the generic SCons.Platform.Platform()
+selection method.
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+from . import posix
+from SCons.Platform import TempFileMunge
+
+def generate(env):
+ posix.generate(env)
+
+ env['PROGPREFIX'] = ''
+ env['PROGSUFFIX'] = '.exe'
+ env['SHLIBPREFIX'] = ''
+ env['SHLIBSUFFIX'] = '.dll'
+ env['LIBPREFIXES'] = [ '$LIBPREFIX', '$SHLIBPREFIX', '$IMPLIBPREFIX' ]
+ env['LIBSUFFIXES'] = [ '$LIBSUFFIX', '$SHLIBSUFFIX', '$IMPLIBSUFFIX' ]
+ env['TEMPFILE'] = TempFileMunge
+ env['TEMPFILEPREFIX'] = '@'
+ env['MAXLINELENGTH'] = 2048
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Platform/darwin.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Platform/darwin.py
new file mode 100644
index 0000000..c85b75b
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Platform/darwin.py
@@ -0,0 +1,74 @@
+"""engine.SCons.Platform.darwin
+
+Platform-specific initialization for Mac OS X systems.
+
+There normally shouldn't be any need to import this module directly. It
+will usually be imported through the generic SCons.Platform.Platform()
+selection method.
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+from . import posix
+import os
+
+def generate(env):
+ posix.generate(env)
+ env['SHLIBSUFFIX'] = '.dylib'
+ # put macports paths at front to override Apple's versions, fink path is after
+ # For now let people who want Macports or Fink tools specify it!
+ # env['ENV']['PATH'] = '/opt/local/bin:/opt/local/sbin:' + env['ENV']['PATH'] + ':/sw/bin'
+
+ # Store extra system paths in env['ENV']['PATHOSX']
+
+ filelist = ['/etc/paths',]
+ # make sure this works on Macs with Tiger or earlier
+ try:
+ dirlist = os.listdir('/etc/paths.d')
+ except:
+ dirlist = []
+
+ for file in dirlist:
+ filelist.append('/etc/paths.d/'+file)
+
+ for file in filelist:
+ if os.path.isfile(file):
+ f = open(file, 'r')
+ lines = f.readlines()
+ for line in lines:
+ if line:
+ env.AppendENVPath('PATHOSX', line.strip('\n'))
+ f.close()
+
+ # Not sure why this wasn't the case all along?
+ if env['ENV'].get('PATHOSX', False) and os.environ.get('SCONS_USE_MAC_PATHS', False):
+ env.AppendENVPath('PATH',env['ENV']['PATHOSX'])
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Platform/hpux.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Platform/hpux.py
new file mode 100644
index 0000000..0e0bbcf
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Platform/hpux.py
@@ -0,0 +1,46 @@
+"""engine.SCons.Platform.hpux
+
+Platform-specific initialization for HP-UX systems.
+
+There normally shouldn't be any need to import this module directly. It
+will usually be imported through the generic SCons.Platform.Platform()
+selection method.
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+from . import posix
+
+def generate(env):
+ posix.generate(env)
+ #Based on HP-UX11i: ARG_MAX=2048000 - 3000 for environment expansion
+ env['MAXLINELENGTH'] = 2045000
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Platform/irix.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Platform/irix.py
new file mode 100644
index 0000000..2e5f217
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Platform/irix.py
@@ -0,0 +1,44 @@
+"""SCons.Platform.irix
+
+Platform-specific initialization for SGI IRIX systems.
+
+There normally shouldn't be any need to import this module directly. It
+will usually be imported through the generic SCons.Platform.Platform()
+selection method.
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+from . import posix
+
+def generate(env):
+ posix.generate(env)
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Platform/os2.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Platform/os2.py
new file mode 100644
index 0000000..5ca26bc
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Platform/os2.py
@@ -0,0 +1,58 @@
+"""SCons.Platform.os2
+
+Platform-specific initialization for OS/2 systems.
+
+There normally shouldn't be any need to import this module directly. It
+will usually be imported through the generic SCons.Platform.Platform()
+selection method.
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+from . import win32
+
+def generate(env):
+ if 'ENV' not in env:
+ env['ENV'] = {}
+ env['OBJPREFIX'] = ''
+ env['OBJSUFFIX'] = '.obj'
+ env['SHOBJPREFIX'] = '$OBJPREFIX'
+ env['SHOBJSUFFIX'] = '$OBJSUFFIX'
+ env['PROGPREFIX'] = ''
+ env['PROGSUFFIX'] = '.exe'
+ env['LIBPREFIX'] = ''
+ env['LIBSUFFIX'] = '.lib'
+ env['SHLIBPREFIX'] = ''
+ env['SHLIBSUFFIX'] = '.dll'
+ env['LIBPREFIXES'] = '$LIBPREFIX'
+ env['LIBSUFFIXES'] = [ '$LIBSUFFIX', '$SHLIBSUFFIX' ]
+ env['HOST_OS'] = 'os2'
+ env['HOST_ARCH'] = win32.get_architecture().arch
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Platform/posix.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Platform/posix.py
new file mode 100644
index 0000000..8db08db
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Platform/posix.py
@@ -0,0 +1,126 @@
+"""SCons.Platform.posix
+
+Platform-specific initialization for POSIX (Linux, UNIX, etc.) systems.
+
+There normally shouldn't be any need to import this module directly. It
+will usually be imported through the generic SCons.Platform.Platform()
+selection method.
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import errno
+import os
+import os.path
+import subprocess
+import sys
+import select
+
+import SCons.Util
+from SCons.Platform import TempFileMunge
+
+exitvalmap = {
+ 2 : 127,
+ 13 : 126,
+}
+
+def escape(arg):
+ "escape shell special characters"
+ slash = '\\'
+ special = '"$'
+
+ arg = arg.replace(slash, slash+slash)
+ for c in special:
+ arg = arg.replace(c, slash+c)
+
+ # print("ESCAPE RESULT: %s" % arg)
+ return '"' + arg + '"'
+
+
+def exec_subprocess(l, env):
+ proc = subprocess.Popen(l, env = env, close_fds = True)
+ return proc.wait()
+
+def subprocess_spawn(sh, escape, cmd, args, env):
+ return exec_subprocess([sh, '-c', ' '.join(args)], env)
+
+def exec_popen3(l, env, stdout, stderr):
+ proc = subprocess.Popen(l, env = env, close_fds = True,
+ stdout = stdout,
+ stderr = stderr)
+ return proc.wait()
+
+def piped_env_spawn(sh, escape, cmd, args, env, stdout, stderr):
+ # spawn using Popen3 combined with the env command
+ # the command name and the command's stdout is written to stdout
+ # the command's stderr is written to stderr
+ return exec_popen3([sh, '-c', ' '.join(args)],
+ env, stdout, stderr)
+
+
+def generate(env):
+ # Bearing in mind we have python 2.4 as a baseline, we can just do this:
+ spawn = subprocess_spawn
+ pspawn = piped_env_spawn
+ # Note that this means that 'escape' is no longer used
+
+ if 'ENV' not in env:
+ env['ENV'] = {}
+ env['ENV']['PATH'] = '/usr/local/bin:/opt/bin:/bin:/usr/bin'
+ env['OBJPREFIX'] = ''
+ env['OBJSUFFIX'] = '.o'
+ env['SHOBJPREFIX'] = '$OBJPREFIX'
+ env['SHOBJSUFFIX'] = '$OBJSUFFIX'
+ env['PROGPREFIX'] = ''
+ env['PROGSUFFIX'] = ''
+ env['LIBPREFIX'] = 'lib'
+ env['LIBSUFFIX'] = '.a'
+ env['SHLIBPREFIX'] = '$LIBPREFIX'
+ env['SHLIBSUFFIX'] = '.so'
+ env['LIBPREFIXES'] = [ '$LIBPREFIX' ]
+ env['LIBSUFFIXES'] = [ '$LIBSUFFIX', '$SHLIBSUFFIX' ]
+ env['PSPAWN'] = pspawn
+ env['SPAWN'] = spawn
+ env['SHELL'] = 'sh'
+ env['ESCAPE'] = escape
+ env['TEMPFILE'] = TempFileMunge
+ env['TEMPFILEPREFIX'] = '@'
+ #Based on LINUX: ARG_MAX=ARG_MAX=131072 - 3000 for environment expansion
+ #Note: specific platforms might rise or lower this value
+ env['MAXLINELENGTH'] = 128072
+
+ # This platform supports RPATH specifications.
+ env['__RPATH'] = '$_RPATH'
+
+ # GDC is GCC family, but DMD and LDC have different options.
+ # Must be able to have GCC and DMD work in the same build, so:
+ env['__DRPATH'] = '$_DRPATH'
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Platform/posix.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Platform/posix.xml
new file mode 100644
index 0000000..e96dd63
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Platform/posix.xml
@@ -0,0 +1,80 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+__COPYRIGHT__
+
+This file is processed by the bin/SConsDoc.py module.
+See its __doc__ string for a discussion of the format.
+-->
+
+<!DOCTYPE sconsdoc [
+<!ENTITY % scons SYSTEM '../../../../doc/scons.mod'>
+%scons;
+<!ENTITY % builders-mod SYSTEM '../../../../doc/generated/builders.mod'>
+%builders-mod;
+<!ENTITY % functions-mod SYSTEM '../../../../doc/generated/functions.mod'>
+%functions-mod;
+<!ENTITY % tools-mod SYSTEM '../../../../doc/generated/tools.mod'>
+%tools-mod;
+<!ENTITY % variables-mod SYSTEM '../../../../doc/generated/variables.mod'>
+%variables-mod;
+]>
+
+<sconsdoc xmlns="http://www.scons.org/dbxsd/v1.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://www.scons.org/dbxsd/v1.0 http://www.scons.org/dbxsd/v1.0/scons.xsd">
+
+<cvar name="RPATH">
+<summary>
+<para>
+A list of paths to search for shared libraries when running programs.
+Currently only used in the GNU (gnulink),
+IRIX (sgilink) and Sun (sunlink) linkers.
+Ignored on platforms and toolchains that don't support it.
+Note that the paths added to RPATH
+are not transformed by
+&scons;
+in any way: if you want an absolute
+path, you must make it absolute yourself.
+</para>
+</summary>
+</cvar>
+
+<cvar name="_RPATH">
+<summary>
+<para>
+An automatically-generated construction variable
+containing the rpath flags to be used when linking
+a program with shared libraries.
+The value of &cv-_RPATH; is created
+by appending &cv-RPATHPREFIX; and &cv-RPATHSUFFIX;
+to the beginning and end
+of each directory in &cv-RPATH;.
+</para>
+</summary>
+</cvar>
+
+<cvar name="RPATHPREFIX">
+<summary>
+<para>
+The prefix used to specify a directory to be searched for
+shared libraries when running programs.
+This will be appended to the beginning of each directory
+in the &cv-RPATH; construction variable
+when the &cv-_RPATH; variable is automatically generated.
+</para>
+</summary>
+</cvar>
+
+<cvar name="RPATHSUFFIX">
+<summary>
+<para>
+The suffix used to specify a directory to be searched for
+shared libraries when running programs.
+This will be appended to the end of each directory
+in the &cv-RPATH; construction variable
+when the &cv-_RPATH; variable is automatically generated.
+</para>
+</summary>
+</cvar>
+
+</sconsdoc>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Platform/sunos.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Platform/sunos.py
new file mode 100644
index 0000000..057fddf
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Platform/sunos.py
@@ -0,0 +1,50 @@
+"""engine.SCons.Platform.sunos
+
+Platform-specific initialization for Sun systems.
+
+There normally shouldn't be any need to import this module directly. It
+will usually be imported through the generic SCons.Platform.Platform()
+selection method.
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+from . import posix
+
+def generate(env):
+ posix.generate(env)
+ # Based on sunSparc 8:32bit
+ # ARG_MAX=1048320 - 3000 for environment expansion
+ env['MAXLINELENGTH'] = 1045320
+ env['PKGINFO'] = 'pkginfo'
+ env['PKGCHK'] = '/usr/sbin/pkgchk'
+ env['ENV']['PATH'] = env['ENV']['PATH'] + ':/opt/SUNWspro/bin:/usr/ccs/bin'
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Platform/sunos.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Platform/sunos.xml
new file mode 100644
index 0000000..4921f4c
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Platform/sunos.xml
@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+__COPYRIGHT__
+
+This file is processed by the bin/SConsDoc.py module.
+See its __doc__ string for a discussion of the format.
+-->
+
+<!DOCTYPE sconsdoc [
+<!ENTITY % scons SYSTEM '../../../../doc/scons.mod'>
+%scons;
+<!ENTITY % builders-mod SYSTEM '../../../../doc/generated/builders.mod'>
+%builders-mod;
+<!ENTITY % functions-mod SYSTEM '../../../../doc/generated/functions.mod'>
+%functions-mod;
+<!ENTITY % tools-mod SYSTEM '../../../../doc/generated/tools.mod'>
+%tools-mod;
+<!ENTITY % variables-mod SYSTEM '../../../../doc/generated/variables.mod'>
+%variables-mod;
+]>
+
+<sconsdoc xmlns="http://www.scons.org/dbxsd/v1.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://www.scons.org/dbxsd/v1.0 http://www.scons.org/dbxsd/v1.0/scons.xsd">
+
+
+<cvar name="PKGCHK">
+<summary>
+<para>
+On Solaris systems,
+the package-checking program that will
+be used (along with &cv-PKGINFO;)
+to look for installed versions of
+the Sun PRO C++ compiler.
+The default is
+<filename>/usr/sbin/pgkchk</filename>.
+</para>
+</summary>
+</cvar>
+
+<cvar name="PKGINFO">
+<summary>
+<para>
+On Solaris systems,
+the package information program that will
+be used (along with &cv-PKGCHK;)
+to look for installed versions of
+the Sun PRO C++ compiler.
+The default is
+<filename>pkginfo</filename>.
+</para>
+</summary>
+</cvar>
+
+</sconsdoc>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Platform/win32.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Platform/win32.py
new file mode 100644
index 0000000..0e9e01f
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Platform/win32.py
@@ -0,0 +1,470 @@
+"""SCons.Platform.win32
+
+Platform-specific initialization for Win32 systems.
+
+There normally shouldn't be any need to import this module directly. It
+will usually be imported through the generic SCons.Platform.Platform()
+selection method.
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import os
+import os.path
+import sys
+import tempfile
+
+from SCons.Platform.posix import exitvalmap
+from SCons.Platform import TempFileMunge
+import SCons.Util
+
+try:
+ import msvcrt
+ import win32api
+ import win32con
+
+ msvcrt.get_osfhandle
+ win32api.SetHandleInformation
+ win32con.HANDLE_FLAG_INHERIT
+except ImportError:
+ parallel_msg = \
+ "you do not seem to have the pywin32 extensions installed;\n" + \
+ "\tparallel (-j) builds may not work reliably with open Python files."
+except AttributeError:
+ parallel_msg = \
+ "your pywin32 extensions do not support file handle operations;\n" + \
+ "\tparallel (-j) builds may not work reliably with open Python files."
+else:
+ parallel_msg = None
+
+ _builtin_open = open
+
+ def _scons_open(*args, **kw):
+ fp = _builtin_open(*args, **kw)
+ win32api.SetHandleInformation(msvcrt.get_osfhandle(fp.fileno()),
+ win32con.HANDLE_FLAG_INHERIT,
+ 0)
+ return fp
+
+ open = _scons_open
+
+ if sys.version_info.major == 2:
+ _builtin_file = file
+ class _scons_file(_builtin_file):
+ def __init__(self, *args, **kw):
+ _builtin_file.__init__(self, *args, **kw)
+ win32api.SetHandleInformation(msvcrt.get_osfhandle(self.fileno()),
+ win32con.HANDLE_FLAG_INHERIT, 0)
+ file = _scons_file
+ else:
+ import io
+ for io_class in ['BufferedReader', 'BufferedWriter', 'BufferedRWPair',
+ 'BufferedRandom', 'TextIOWrapper']:
+ _builtin_file = getattr(io, io_class)
+ class _scons_file(_builtin_file):
+ def __init__(self, *args, **kw):
+ _builtin_file.__init__(self, *args, **kw)
+ win32api.SetHandleInformation(msvcrt.get_osfhandle(self.fileno()),
+ win32con.HANDLE_FLAG_INHERIT, 0)
+ setattr(io, io_class, _scons_file)
+
+
+
+if False:
+ # Now swap out shutil.filecopy and filecopy2 for win32 api native CopyFile
+ try:
+ from ctypes import windll
+ import shutil
+
+ CopyFile = windll.kernel32.CopyFileA
+ SetFileTime = windll.kernel32.SetFileTime
+
+ _shutil_copy = shutil.copy
+ _shutil_copy2 = shutil.copy2
+
+ shutil.copy2 = CopyFile
+
+ def win_api_copyfile(src,dst):
+ CopyFile(src,dst)
+ os.utime(dst)
+
+ shutil.copy = win_api_copyfile
+
+ except AttributeError:
+ parallel_msg = \
+ "Couldn't override shutil.copy or shutil.copy2 falling back to shutil defaults"
+
+
+
+
+
+
+
+try:
+ import threading
+ spawn_lock = threading.Lock()
+
+ # This locked version of spawnve works around a Windows
+ # MSVCRT bug, because its spawnve is not thread-safe.
+ # Without this, python can randomly crash while using -jN.
+ # See the python bug at http://bugs.python.org/issue6476
+ # and SCons issue at
+ # http://scons.tigris.org/issues/show_bug.cgi?id=2449
+ def spawnve(mode, file, args, env):
+ spawn_lock.acquire()
+ try:
+ if mode == os.P_WAIT:
+ ret = os.spawnve(os.P_NOWAIT, file, args, env)
+ else:
+ ret = os.spawnve(mode, file, args, env)
+ finally:
+ spawn_lock.release()
+ if mode == os.P_WAIT:
+ pid, status = os.waitpid(ret, 0)
+ ret = status >> 8
+ return ret
+except ImportError:
+ # Use the unsafe method of spawnve.
+ # Please, don't try to optimize this try-except block
+ # away by assuming that the threading module is always present.
+ # In the test test/option-j.py we intentionally call SCons with
+ # a fake threading.py that raises an import exception right away,
+ # simulating a non-existent package.
+ def spawnve(mode, file, args, env):
+ return os.spawnve(mode, file, args, env)
+
+# The upshot of all this is that, if you are using Python 1.5.2,
+# you had better have cmd or command.com in your PATH when you run
+# scons.
+
+
+def piped_spawn(sh, escape, cmd, args, env, stdout, stderr):
+ # There is no direct way to do that in python. What we do
+ # here should work for most cases:
+ # In case stdout (stderr) is not redirected to a file,
+ # we redirect it into a temporary file tmpFileStdout
+ # (tmpFileStderr) and copy the contents of this file
+ # to stdout (stderr) given in the argument
+ if not sh:
+ sys.stderr.write("scons: Could not find command interpreter, is it in your PATH?\n")
+ return 127
+ else:
+ # one temporary file for stdout and stderr
+ tmpFileStdout = os.path.normpath(tempfile.mktemp())
+ tmpFileStderr = os.path.normpath(tempfile.mktemp())
+
+ # check if output is redirected
+ stdoutRedirected = 0
+ stderrRedirected = 0
+ for arg in args:
+ # are there more possibilities to redirect stdout ?
+ if arg.find( ">", 0, 1 ) != -1 or arg.find( "1>", 0, 2 ) != -1:
+ stdoutRedirected = 1
+ # are there more possibilities to redirect stderr ?
+ if arg.find( "2>", 0, 2 ) != -1:
+ stderrRedirected = 1
+
+ # redirect output of non-redirected streams to our tempfiles
+ if stdoutRedirected == 0:
+ args.append(">" + str(tmpFileStdout))
+ if stderrRedirected == 0:
+ args.append("2>" + str(tmpFileStderr))
+
+ # actually do the spawn
+ try:
+ args = [sh, '/C', escape(' '.join(args)) ]
+ ret = spawnve(os.P_WAIT, sh, args, env)
+ except OSError as e:
+ # catch any error
+ try:
+ ret = exitvalmap[e[0]]
+ except KeyError:
+ sys.stderr.write("scons: unknown OSError exception code %d - %s: %s\n" % (e[0], cmd, e[1]))
+ if stderr is not None:
+ stderr.write("scons: %s: %s\n" % (cmd, e[1]))
+ # copy child output from tempfiles to our streams
+ # and do clean up stuff
+ if stdout is not None and stdoutRedirected == 0:
+ try:
+ stdout.write(open( tmpFileStdout, "r" ).read())
+ os.remove( tmpFileStdout )
+ except (IOError, OSError):
+ pass
+
+ if stderr is not None and stderrRedirected == 0:
+ try:
+ stderr.write(open( tmpFileStderr, "r" ).read())
+ os.remove( tmpFileStderr )
+ except (IOError, OSError):
+ pass
+ return ret
+
+
+def exec_spawn(l, env):
+ try:
+ result = spawnve(os.P_WAIT, l[0], l, env)
+ except (OSError, EnvironmentError) as e:
+ try:
+ result = exitvalmap[e.errno]
+ sys.stderr.write("scons: %s: %s\n" % (l[0], e.strerror))
+ except KeyError:
+ result = 127
+ if len(l) > 2:
+ if len(l[2]) < 1000:
+ command = ' '.join(l[0:3])
+ else:
+ command = l[0]
+ else:
+ command = l[0]
+ sys.stderr.write("scons: unknown OSError exception code %d - '%s': %s\n" % (e.errno, command, e.strerror))
+ return result
+
+
+def spawn(sh, escape, cmd, args, env):
+ if not sh:
+ sys.stderr.write("scons: Could not find command interpreter, is it in your PATH?\n")
+ return 127
+ return exec_spawn([sh, '/C', escape(' '.join(args))], env)
+
+# Windows does not allow special characters in file names anyway, so no
+# need for a complex escape function, we will just quote the arg, except
+# that "cmd /c" requires that if an argument ends with a backslash it
+# needs to be escaped so as not to interfere with closing double quote
+# that we add.
+def escape(x):
+ if x[-1] == '\\':
+ x = x + '\\'
+ return '"' + x + '"'
+
+# Get the windows system directory name
+_system_root = None
+
+
+def get_system_root():
+ global _system_root
+ if _system_root is not None:
+ return _system_root
+
+ # A resonable default if we can't read the registry
+ val = os.environ.get('SystemRoot', "C:\\WINDOWS")
+
+ if SCons.Util.can_read_reg:
+ try:
+ # Look for Windows NT system root
+ k=SCons.Util.RegOpenKeyEx(SCons.Util.hkey_mod.HKEY_LOCAL_MACHINE,
+ 'Software\\Microsoft\\Windows NT\\CurrentVersion')
+ val, tok = SCons.Util.RegQueryValueEx(k, 'SystemRoot')
+ except SCons.Util.RegError:
+ try:
+ # Okay, try the Windows 9x system root
+ k=SCons.Util.RegOpenKeyEx(SCons.Util.hkey_mod.HKEY_LOCAL_MACHINE,
+ 'Software\\Microsoft\\Windows\\CurrentVersion')
+ val, tok = SCons.Util.RegQueryValueEx(k, 'SystemRoot')
+ except KeyboardInterrupt:
+ raise
+ except:
+ pass
+
+ # Ensure system root is a string and not unicode
+ # (This only matters for py27 were unicode in env passed to POpen fails)
+ val = str(val)
+ _system_root = val
+ return val
+
+
+def get_program_files_dir():
+ """
+ Get the location of the program files directory
+ Returns
+ -------
+
+ """
+ # Now see if we can look in the registry...
+ val = ''
+ if SCons.Util.can_read_reg:
+ try:
+ # Look for Windows Program Files directory
+ k=SCons.Util.RegOpenKeyEx(SCons.Util.hkey_mod.HKEY_LOCAL_MACHINE,
+ 'Software\\Microsoft\\Windows\\CurrentVersion')
+ val, tok = SCons.Util.RegQueryValueEx(k, 'ProgramFilesDir')
+ except SCons.Util.RegError:
+ val = ''
+ pass
+
+ if val == '':
+ # A reasonable default if we can't read the registry
+ # (Actually, it's pretty reasonable even if we can :-)
+ val = os.path.join(os.path.dirname(get_system_root()),"Program Files")
+
+ return val
+
+
+class ArchDefinition(object):
+ """
+ Determine which windows CPU were running on.
+ A class for defining architecture-specific settings and logic.
+ """
+ def __init__(self, arch, synonyms=[]):
+ self.arch = arch
+ self.synonyms = synonyms
+
+SupportedArchitectureList = [
+ ArchDefinition(
+ 'x86',
+ ['i386', 'i486', 'i586', 'i686'],
+ ),
+
+ ArchDefinition(
+ 'x86_64',
+ ['AMD64', 'amd64', 'em64t', 'EM64T', 'x86_64'],
+ ),
+
+ ArchDefinition(
+ 'ia64',
+ ['IA64'],
+ ),
+]
+
+SupportedArchitectureMap = {}
+for a in SupportedArchitectureList:
+ SupportedArchitectureMap[a.arch] = a
+ for s in a.synonyms:
+ SupportedArchitectureMap[s] = a
+
+
+def get_architecture(arch=None):
+ """Returns the definition for the specified architecture string.
+
+ If no string is specified, the system default is returned (as defined
+ by the PROCESSOR_ARCHITEW6432 or PROCESSOR_ARCHITECTURE environment
+ variables).
+ """
+ if arch is None:
+ arch = os.environ.get('PROCESSOR_ARCHITEW6432')
+ if not arch:
+ arch = os.environ.get('PROCESSOR_ARCHITECTURE')
+ return SupportedArchitectureMap.get(arch, ArchDefinition('', ['']))
+
+
+def generate(env):
+ # Attempt to find cmd.exe (for WinNT/2k/XP) or
+ # command.com for Win9x
+ cmd_interp = ''
+ # First see if we can look in the registry...
+ if SCons.Util.can_read_reg:
+ try:
+ # Look for Windows NT system root
+ k=SCons.Util.RegOpenKeyEx(SCons.Util.hkey_mod.HKEY_LOCAL_MACHINE,
+ 'Software\\Microsoft\\Windows NT\\CurrentVersion')
+ val, tok = SCons.Util.RegQueryValueEx(k, 'SystemRoot')
+ cmd_interp = os.path.join(val, 'System32\\cmd.exe')
+ except SCons.Util.RegError:
+ try:
+ # Okay, try the Windows 9x system root
+ k=SCons.Util.RegOpenKeyEx(SCons.Util.hkey_mod.HKEY_LOCAL_MACHINE,
+ 'Software\\Microsoft\\Windows\\CurrentVersion')
+ val, tok = SCons.Util.RegQueryValueEx(k, 'SystemRoot')
+ cmd_interp = os.path.join(val, 'command.com')
+ except KeyboardInterrupt:
+ raise
+ except:
+ pass
+
+ # For the special case of not having access to the registry, we
+ # use a temporary path and pathext to attempt to find the command
+ # interpreter. If we fail, we try to find the interpreter through
+ # the env's PATH. The problem with that is that it might not
+ # contain an ENV and a PATH.
+ if not cmd_interp:
+ systemroot = get_system_root()
+ tmp_path = systemroot + os.pathsep + \
+ os.path.join(systemroot,'System32')
+ tmp_pathext = '.com;.exe;.bat;.cmd'
+ if 'PATHEXT' in os.environ:
+ tmp_pathext = os.environ['PATHEXT']
+ cmd_interp = SCons.Util.WhereIs('cmd', tmp_path, tmp_pathext)
+ if not cmd_interp:
+ cmd_interp = SCons.Util.WhereIs('command', tmp_path, tmp_pathext)
+
+ if not cmd_interp:
+ cmd_interp = env.Detect('cmd')
+ if not cmd_interp:
+ cmd_interp = env.Detect('command')
+
+ if 'ENV' not in env:
+ env['ENV'] = {}
+
+ # Import things from the external environment to the construction
+ # environment's ENV. This is a potential slippery slope, because we
+ # *don't* want to make builds dependent on the user's environment by
+ # default. We're doing this for SystemRoot, though, because it's
+ # needed for anything that uses sockets, and seldom changes, and
+ # for SystemDrive because it's related.
+ #
+ # Weigh the impact carefully before adding other variables to this list.
+ import_env = ['SystemDrive', 'SystemRoot', 'TEMP', 'TMP' ]
+ for var in import_env:
+ v = os.environ.get(var)
+ if v:
+ env['ENV'][var] = v
+
+ if 'COMSPEC' not in env['ENV']:
+ v = os.environ.get("COMSPEC")
+ if v:
+ env['ENV']['COMSPEC'] = v
+
+ env.AppendENVPath('PATH', get_system_root() + '\System32')
+
+ env['ENV']['PATHEXT'] = '.COM;.EXE;.BAT;.CMD'
+ env['OBJPREFIX'] = ''
+ env['OBJSUFFIX'] = '.obj'
+ env['SHOBJPREFIX'] = '$OBJPREFIX'
+ env['SHOBJSUFFIX'] = '$OBJSUFFIX'
+ env['PROGPREFIX'] = ''
+ env['PROGSUFFIX'] = '.exe'
+ env['LIBPREFIX'] = ''
+ env['LIBSUFFIX'] = '.lib'
+ env['SHLIBPREFIX'] = ''
+ env['SHLIBSUFFIX'] = '.dll'
+ env['LIBPREFIXES'] = [ '$LIBPREFIX' ]
+ env['LIBSUFFIXES'] = [ '$LIBSUFFIX' ]
+ env['PSPAWN'] = piped_spawn
+ env['SPAWN'] = spawn
+ env['SHELL'] = cmd_interp
+ env['TEMPFILE'] = TempFileMunge
+ env['TEMPFILEPREFIX'] = '@'
+ env['MAXLINELENGTH'] = 2048
+ env['ESCAPE'] = escape
+
+ env['HOST_OS'] = 'win32'
+ env['HOST_ARCH'] = get_architecture().arch
+
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Platform/win32.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Platform/win32.xml
new file mode 100644
index 0000000..ca6dc4d
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Platform/win32.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+__COPYRIGHT__
+
+This file is processed by the bin/SConsDoc.py module.
+See its __doc__ string for a discussion of the format.
+-->
+
+<!DOCTYPE sconsdoc [
+<!ENTITY % scons SYSTEM '../../../../doc/scons.mod'>
+%scons;
+<!ENTITY % builders-mod SYSTEM '../../../../doc/generated/builders.mod'>
+%builders-mod;
+<!ENTITY % functions-mod SYSTEM '../../../../doc/generated/functions.mod'>
+%functions-mod;
+<!ENTITY % tools-mod SYSTEM '../../../../doc/generated/tools.mod'>
+%tools-mod;
+<!ENTITY % variables-mod SYSTEM '../../../../doc/generated/variables.mod'>
+%variables-mod;
+]>
+
+<sconsdoc xmlns="http://www.scons.org/dbxsd/v1.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://www.scons.org/dbxsd/v1.0 http://www.scons.org/dbxsd/v1.0/scons.xsd">
+
+<cvar name="MAXLINELENGTH">
+<summary>
+<para>
+The maximum number of characters allowed on an external command line.
+On Win32 systems,
+link lines longer than this many characters
+are linked via a temporary file name.
+</para>
+</summary>
+</cvar>
+
+</sconsdoc>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/SConf.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/SConf.py
new file mode 100644
index 0000000..48eed8e
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/SConf.py
@@ -0,0 +1,1053 @@
+"""SCons.SConf
+
+Autoconf-like configuration support.
+
+In other words, SConf allows to run tests on the build machine to detect
+capabilities of system and do some things based on result: generate config
+files, header files for C/C++, update variables in environment.
+
+Tests on the build system can detect if compiler sees header files, if
+libraries are installed, if some command line options are supported etc.
+
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+from __future__ import print_function
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import SCons.compat
+
+import io
+import os
+import re
+import sys
+import traceback
+
+import SCons.Action
+import SCons.Builder
+import SCons.Errors
+import SCons.Job
+import SCons.Node.FS
+import SCons.Taskmaster
+import SCons.Util
+import SCons.Warnings
+import SCons.Conftest
+
+from SCons.Debug import Trace
+
+# Turn off the Conftest error logging
+SCons.Conftest.LogInputFiles = 0
+SCons.Conftest.LogErrorMessages = 0
+
+# Set
+build_type = None
+build_types = ['clean', 'help']
+
+def SetBuildType(type):
+ global build_type
+ build_type = type
+
+# to be set, if we are in dry-run mode
+dryrun = 0
+
+AUTO=0 # use SCons dependency scanning for up-to-date checks
+FORCE=1 # force all tests to be rebuilt
+CACHE=2 # force all tests to be taken from cache (raise an error, if necessary)
+cache_mode = AUTO
+
+def SetCacheMode(mode):
+ """Set the Configure cache mode. mode must be one of "auto", "force",
+ or "cache"."""
+ global cache_mode
+ if mode == "auto":
+ cache_mode = AUTO
+ elif mode == "force":
+ cache_mode = FORCE
+ elif mode == "cache":
+ cache_mode = CACHE
+ else:
+ raise ValueError("SCons.SConf.SetCacheMode: Unknown mode " + mode)
+
+progress_display = SCons.Util.display # will be overwritten by SCons.Script
+def SetProgressDisplay(display):
+ """Set the progress display to use (called from SCons.Script)"""
+ global progress_display
+ progress_display = display
+
+SConfFS = None
+
+_ac_build_counter = 0 # incremented, whenever TryBuild is called
+_ac_config_logs = {} # all config.log files created in this build
+_ac_config_hs = {} # all config.h files created in this build
+sconf_global = None # current sconf object
+
+def _createConfigH(target, source, env):
+ t = open(str(target[0]), "w")
+ defname = re.sub('[^A-Za-z0-9_]', '_', str(target[0]).upper())
+ t.write("""#ifndef %(DEFNAME)s_SEEN
+#define %(DEFNAME)s_SEEN
+
+""" % {'DEFNAME' : defname})
+ t.write(source[0].get_contents().decode())
+ t.write("""
+#endif /* %(DEFNAME)s_SEEN */
+""" % {'DEFNAME' : defname})
+ t.close()
+
+def _stringConfigH(target, source, env):
+ return "scons: Configure: creating " + str(target[0])
+
+
+def NeedConfigHBuilder():
+ if len(_ac_config_hs) == 0:
+ return False
+ else:
+ return True
+
+def CreateConfigHBuilder(env):
+ """Called if necessary just before the building targets phase begins."""
+ action = SCons.Action.Action(_createConfigH,
+ _stringConfigH)
+ sconfigHBld = SCons.Builder.Builder(action=action)
+ env.Append( BUILDERS={'SConfigHBuilder':sconfigHBld} )
+ for k in list(_ac_config_hs.keys()):
+ env.SConfigHBuilder(k, env.Value(_ac_config_hs[k]))
+
+
+class SConfWarning(SCons.Warnings.Warning):
+ pass
+SCons.Warnings.enableWarningClass(SConfWarning)
+
+# some error definitions
+class SConfError(SCons.Errors.UserError):
+ def __init__(self,msg):
+ SCons.Errors.UserError.__init__(self,msg)
+
+class ConfigureDryRunError(SConfError):
+ """Raised when a file or directory needs to be updated during a Configure
+ process, but the user requested a dry-run"""
+ def __init__(self,target):
+ if not isinstance(target, SCons.Node.FS.File):
+ msg = 'Cannot create configure directory "%s" within a dry-run.' % str(target)
+ else:
+ msg = 'Cannot update configure test "%s" within a dry-run.' % str(target)
+ SConfError.__init__(self,msg)
+
+class ConfigureCacheError(SConfError):
+ """Raised when a use explicitely requested the cache feature, but the test
+ is run the first time."""
+ def __init__(self,target):
+ SConfError.__init__(self, '"%s" is not yet built and cache is forced.' % str(target))
+
+# define actions for building text files
+def _createSource( target, source, env ):
+ fd = open(str(target[0]), "w")
+ fd.write(source[0].get_contents().decode())
+ fd.close()
+def _stringSource( target, source, env ):
+ return (str(target[0]) + ' <-\n |' +
+ source[0].get_contents().decode().replace( '\n', "\n |" ) )
+
+class SConfBuildInfo(SCons.Node.FS.FileBuildInfo):
+ """
+ Special build info for targets of configure tests. Additional members
+ are result (did the builder succeed last time?) and string, which
+ contains messages of the original build phase.
+ """
+ __slots__ = ('result', 'string')
+
+ def __init__(self):
+ self.result = None # -> 0/None -> no error, != 0 error
+ self.string = None # the stdout / stderr output when building the target
+
+ def set_build_result(self, result, string):
+ self.result = result
+ self.string = string
+
+
+class Streamer(object):
+ """
+ 'Sniffer' for a file-like writable object. Similar to the unix tool tee.
+ """
+ def __init__(self, orig):
+ self.orig = orig
+ self.s = io.StringIO()
+
+ def write(self, str):
+ if self.orig:
+ self.orig.write(str)
+ try:
+ self.s.write(str)
+ except TypeError as e:
+ # "unicode argument expected" bug in IOStream (python 2.x)
+ self.s.write(str.decode())
+
+ def writelines(self, lines):
+ for l in lines:
+ self.write(l + '\n')
+
+ def getvalue(self):
+ """
+ Return everything written to orig since the Streamer was created.
+ """
+ return self.s.getvalue()
+
+ def flush(self):
+ if self.orig:
+ self.orig.flush()
+ self.s.flush()
+
+
+class SConfBuildTask(SCons.Taskmaster.AlwaysTask):
+ """
+ This is almost the same as SCons.Script.BuildTask. Handles SConfErrors
+ correctly and knows about the current cache_mode.
+ """
+ def display(self, message):
+ if sconf_global.logstream:
+ sconf_global.logstream.write("scons: Configure: " + message + "\n")
+
+ def display_cached_string(self, bi):
+ """
+ Logs the original builder messages, given the SConfBuildInfo instance
+ bi.
+ """
+ if not isinstance(bi, SConfBuildInfo):
+ SCons.Warnings.warn(SConfWarning,
+ "The stored build information has an unexpected class: %s" % bi.__class__)
+ else:
+ self.display("The original builder output was:\n" +
+ (" |" + str(bi.string)).replace("\n", "\n |"))
+
+ def failed(self):
+ # check, if the reason was a ConfigureDryRunError or a
+ # ConfigureCacheError and if yes, reraise the exception
+ exc_type = self.exc_info()[0]
+ if issubclass(exc_type, SConfError):
+ raise
+ elif issubclass(exc_type, SCons.Errors.BuildError):
+ # we ignore Build Errors (occurs, when a test doesn't pass)
+ # Clear the exception to prevent the contained traceback
+ # to build a reference cycle.
+ self.exc_clear()
+ else:
+ self.display('Caught exception while building "%s":\n' %
+ self.targets[0])
+ sys.excepthook(*self.exc_info())
+ return SCons.Taskmaster.Task.failed(self)
+
+ def collect_node_states(self):
+ # returns (is_up_to_date, cached_error, cachable)
+ # where is_up_to_date is 1, if the node(s) are up_to_date
+ # cached_error is 1, if the node(s) are up_to_date, but the
+ # build will fail
+ # cachable is 0, if some nodes are not in our cache
+ T = 0
+ changed = False
+ cached_error = False
+ cachable = True
+ for t in self.targets:
+ if T: Trace('%s' % (t))
+ bi = t.get_stored_info().binfo
+ if isinstance(bi, SConfBuildInfo):
+ if T: Trace(': SConfBuildInfo')
+ if cache_mode == CACHE:
+ t.set_state(SCons.Node.up_to_date)
+ if T: Trace(': set_state(up_to-date)')
+ else:
+ if T: Trace(': get_state() %s' % t.get_state())
+ if T: Trace(': changed() %s' % t.changed())
+ if (t.get_state() != SCons.Node.up_to_date and t.changed()):
+ changed = True
+ if T: Trace(': changed %s' % changed)
+ cached_error = cached_error or bi.result
+ else:
+ if T: Trace(': else')
+ # the node hasn't been built in a SConf context or doesn't
+ # exist
+ cachable = False
+ changed = ( t.get_state() != SCons.Node.up_to_date )
+ if T: Trace(': changed %s' % changed)
+ if T: Trace('\n')
+ return (not changed, cached_error, cachable)
+
+ def execute(self):
+ if not self.targets[0].has_builder():
+ return
+
+ sconf = sconf_global
+
+ is_up_to_date, cached_error, cachable = self.collect_node_states()
+
+ if cache_mode == CACHE and not cachable:
+ raise ConfigureCacheError(self.targets[0])
+ elif cache_mode == FORCE:
+ is_up_to_date = 0
+
+ if cached_error and is_up_to_date:
+ self.display("Building \"%s\" failed in a previous run and all "
+ "its sources are up to date." % str(self.targets[0]))
+ binfo = self.targets[0].get_stored_info().binfo
+ self.display_cached_string(binfo)
+ raise SCons.Errors.BuildError # will be 'caught' in self.failed
+ elif is_up_to_date:
+ self.display("\"%s\" is up to date." % str(self.targets[0]))
+ binfo = self.targets[0].get_stored_info().binfo
+ self.display_cached_string(binfo)
+ elif dryrun:
+ raise ConfigureDryRunError(self.targets[0])
+ else:
+ # note stdout and stderr are the same here
+ s = sys.stdout = sys.stderr = Streamer(sys.stdout)
+ try:
+ env = self.targets[0].get_build_env()
+ if cache_mode == FORCE:
+ # Set up the Decider() to force rebuilds by saying
+ # that every source has changed. Note that we still
+ # call the environment's underlying source decider so
+ # that the correct .sconsign info will get calculated
+ # and keep the build state consistent.
+ def force_build(dependency, target, prev_ni,
+ env_decider=env.decide_source):
+ env_decider(dependency, target, prev_ni)
+ return True
+ if env.decide_source.__code__ is not force_build.__code__:
+ env.Decider(force_build)
+ env['PSTDOUT'] = env['PSTDERR'] = s
+ try:
+ sconf.cached = 0
+ self.targets[0].build()
+ finally:
+ sys.stdout = sys.stderr = env['PSTDOUT'] = \
+ env['PSTDERR'] = sconf.logstream
+ except KeyboardInterrupt:
+ raise
+ except SystemExit:
+ exc_value = sys.exc_info()[1]
+ raise SCons.Errors.ExplicitExit(self.targets[0],exc_value.code)
+ except Exception as e:
+ for t in self.targets:
+ binfo = SConfBuildInfo()
+ binfo.merge(t.get_binfo())
+ binfo.set_build_result(1, s.getvalue())
+ sconsign_entry = SCons.SConsign.SConsignEntry()
+ sconsign_entry.binfo = binfo
+ #sconsign_entry.ninfo = self.get_ninfo()
+ # We'd like to do this as follows:
+ # t.store_info(binfo)
+ # However, we need to store it as an SConfBuildInfo
+ # object, and store_info() will turn it into a
+ # regular FileNodeInfo if the target is itself a
+ # regular File.
+ sconsign = t.dir.sconsign()
+ sconsign.set_entry(t.name, sconsign_entry)
+ sconsign.merge()
+ raise e
+ else:
+ for t in self.targets:
+ binfo = SConfBuildInfo()
+ binfo.merge(t.get_binfo())
+ binfo.set_build_result(0, s.getvalue())
+ sconsign_entry = SCons.SConsign.SConsignEntry()
+ sconsign_entry.binfo = binfo
+ #sconsign_entry.ninfo = self.get_ninfo()
+ # We'd like to do this as follows:
+ # t.store_info(binfo)
+ # However, we need to store it as an SConfBuildInfo
+ # object, and store_info() will turn it into a
+ # regular FileNodeInfo if the target is itself a
+ # regular File.
+ sconsign = t.dir.sconsign()
+ sconsign.set_entry(t.name, sconsign_entry)
+ sconsign.merge()
+
+class SConfBase(object):
+ """This is simply a class to represent a configure context. After
+ creating a SConf object, you can call any tests. After finished with your
+ tests, be sure to call the Finish() method, which returns the modified
+ environment.
+ Some words about caching: In most cases, it is not necessary to cache
+ Test results explicitly. Instead, we use the scons dependency checking
+ mechanism. For example, if one wants to compile a test program
+ (SConf.TryLink), the compiler is only called, if the program dependencies
+ have changed. However, if the program could not be compiled in a former
+ SConf run, we need to explicitly cache this error.
+ """
+
+ def __init__(self, env, custom_tests = {}, conf_dir='$CONFIGUREDIR',
+ log_file='$CONFIGURELOG', config_h = None, _depth = 0):
+ """Constructor. Pass additional tests in the custom_tests-dictionary,
+ e.g. custom_tests={'CheckPrivate':MyPrivateTest}, where MyPrivateTest
+ defines a custom test.
+ Note also the conf_dir and log_file arguments (you may want to
+ build tests in the VariantDir, not in the SourceDir)
+ """
+ global SConfFS
+ if not SConfFS:
+ SConfFS = SCons.Node.FS.default_fs or \
+ SCons.Node.FS.FS(env.fs.pathTop)
+ if sconf_global is not None:
+ raise SCons.Errors.UserError
+ self.env = env
+ if log_file is not None:
+ log_file = SConfFS.File(env.subst(log_file))
+ self.logfile = log_file
+ self.logstream = None
+ self.lastTarget = None
+ self.depth = _depth
+ self.cached = 0 # will be set, if all test results are cached
+
+ # add default tests
+ default_tests = {
+ 'CheckCC' : CheckCC,
+ 'CheckCXX' : CheckCXX,
+ 'CheckSHCC' : CheckSHCC,
+ 'CheckSHCXX' : CheckSHCXX,
+ 'CheckFunc' : CheckFunc,
+ 'CheckType' : CheckType,
+ 'CheckTypeSize' : CheckTypeSize,
+ 'CheckDeclaration' : CheckDeclaration,
+ 'CheckHeader' : CheckHeader,
+ 'CheckCHeader' : CheckCHeader,
+ 'CheckCXXHeader' : CheckCXXHeader,
+ 'CheckLib' : CheckLib,
+ 'CheckLibWithHeader' : CheckLibWithHeader,
+ 'CheckProg' : CheckProg,
+ }
+ self.AddTests(default_tests)
+ self.AddTests(custom_tests)
+ self.confdir = SConfFS.Dir(env.subst(conf_dir))
+ if config_h is not None:
+ config_h = SConfFS.File(config_h)
+ self.config_h = config_h
+ self._startup()
+
+ def Finish(self):
+ """Call this method after finished with your tests:
+ env = sconf.Finish()
+ """
+ self._shutdown()
+ return self.env
+
+ def Define(self, name, value = None, comment = None):
+ """
+ Define a pre processor symbol name, with the optional given value in the
+ current config header.
+
+ If value is None (default), then #define name is written. If value is not
+ none, then #define name value is written.
+
+ comment is a string which will be put as a C comment in the header, to explain the meaning of the value
+ (appropriate C comments will be added automatically).
+ """
+ lines = []
+ if comment:
+ comment_str = "/* %s */" % comment
+ lines.append(comment_str)
+
+ if value is not None:
+ define_str = "#define %s %s" % (name, value)
+ else:
+ define_str = "#define %s" % name
+ lines.append(define_str)
+ lines.append('')
+
+ self.config_h_text = self.config_h_text + '\n'.join(lines)
+
+ def BuildNodes(self, nodes):
+ """
+ Tries to build the given nodes immediately. Returns 1 on success,
+ 0 on error.
+ """
+ if self.logstream is not None:
+ # override stdout / stderr to write in log file
+ oldStdout = sys.stdout
+ sys.stdout = self.logstream
+ oldStderr = sys.stderr
+ sys.stderr = self.logstream
+
+ # the engine assumes the current path is the SConstruct directory ...
+ old_fs_dir = SConfFS.getcwd()
+ old_os_dir = os.getcwd()
+ SConfFS.chdir(SConfFS.Top, change_os_dir=1)
+
+ # Because we take responsibility here for writing out our
+ # own .sconsign info (see SConfBuildTask.execute(), above),
+ # we override the store_info() method with a null place-holder
+ # so we really control how it gets written.
+ for n in nodes:
+ n.store_info = 0
+ if not hasattr(n, 'attributes'):
+ n.attributes = SCons.Node.Node.Attrs()
+ n.attributes.keep_targetinfo = 1
+
+ ret = 1
+
+ try:
+ # ToDo: use user options for calc
+ save_max_drift = SConfFS.get_max_drift()
+ SConfFS.set_max_drift(0)
+ tm = SCons.Taskmaster.Taskmaster(nodes, SConfBuildTask)
+ # we don't want to build tests in parallel
+ jobs = SCons.Job.Jobs(1, tm )
+ jobs.run()
+ for n in nodes:
+ state = n.get_state()
+ if (state != SCons.Node.executed and
+ state != SCons.Node.up_to_date):
+ # the node could not be built. we return 0 in this case
+ ret = 0
+ finally:
+ SConfFS.set_max_drift(save_max_drift)
+ os.chdir(old_os_dir)
+ SConfFS.chdir(old_fs_dir, change_os_dir=0)
+ if self.logstream is not None:
+ # restore stdout / stderr
+ sys.stdout = oldStdout
+ sys.stderr = oldStderr
+ return ret
+
+ def pspawn_wrapper(self, sh, escape, cmd, args, env):
+ """Wrapper function for handling piped spawns.
+
+ This looks to the calling interface (in Action.py) like a "normal"
+ spawn, but associates the call with the PSPAWN variable from
+ the construction environment and with the streams to which we
+ want the output logged. This gets slid into the construction
+ environment as the SPAWN variable so Action.py doesn't have to
+ know or care whether it's spawning a piped command or not.
+ """
+ return self.pspawn(sh, escape, cmd, args, env, self.logstream, self.logstream)
+
+
+ def TryBuild(self, builder, text = None, extension = ""):
+ """Low level TryBuild implementation. Normally you don't need to
+ call that - you can use TryCompile / TryLink / TryRun instead
+ """
+ global _ac_build_counter
+
+ # Make sure we have a PSPAWN value, and save the current
+ # SPAWN value.
+ try:
+ self.pspawn = self.env['PSPAWN']
+ except KeyError:
+ raise SCons.Errors.UserError('Missing PSPAWN construction variable.')
+ try:
+ save_spawn = self.env['SPAWN']
+ except KeyError:
+ raise SCons.Errors.UserError('Missing SPAWN construction variable.')
+
+ nodesToBeBuilt = []
+
+ f = "conftest_" + str(_ac_build_counter)
+ pref = self.env.subst( builder.builder.prefix )
+ suff = self.env.subst( builder.builder.suffix )
+ target = self.confdir.File(pref + f + suff)
+
+ try:
+ # Slide our wrapper into the construction environment as
+ # the SPAWN function.
+ self.env['SPAWN'] = self.pspawn_wrapper
+ sourcetext = self.env.Value(text)
+
+ if text is not None:
+ textFile = self.confdir.File(f + extension)
+ textFileNode = self.env.SConfSourceBuilder(target=textFile,
+ source=sourcetext)
+ nodesToBeBuilt.extend(textFileNode)
+ source = textFileNode
+ else:
+ source = None
+
+ nodes = builder(target = target, source = source)
+ if not SCons.Util.is_List(nodes):
+ nodes = [nodes]
+ nodesToBeBuilt.extend(nodes)
+ result = self.BuildNodes(nodesToBeBuilt)
+
+ finally:
+ self.env['SPAWN'] = save_spawn
+
+ _ac_build_counter = _ac_build_counter + 1
+ if result:
+ self.lastTarget = nodes[0]
+ else:
+ self.lastTarget = None
+
+ return result
+
+ def TryAction(self, action, text = None, extension = ""):
+ """Tries to execute the given action with optional source file
+ contents <text> and optional source file extension <extension>,
+ Returns the status (0 : failed, 1 : ok) and the contents of the
+ output file.
+ """
+ builder = SCons.Builder.Builder(action=action)
+ self.env.Append( BUILDERS = {'SConfActionBuilder' : builder} )
+ ok = self.TryBuild(self.env.SConfActionBuilder, text, extension)
+ del self.env['BUILDERS']['SConfActionBuilder']
+ if ok:
+ outputStr = self.lastTarget.get_contents().decode()
+ return (1, outputStr)
+ return (0, "")
+
+ def TryCompile( self, text, extension):
+ """Compiles the program given in text to an env.Object, using extension
+ as file extension (e.g. '.c'). Returns 1, if compilation was
+ successful, 0 otherwise. The target is saved in self.lastTarget (for
+ further processing).
+ """
+ return self.TryBuild(self.env.Object, text, extension)
+
+ def TryLink( self, text, extension ):
+ """Compiles the program given in text to an executable env.Program,
+ using extension as file extension (e.g. '.c'). Returns 1, if
+ compilation was successful, 0 otherwise. The target is saved in
+ self.lastTarget (for further processing).
+ """
+ return self.TryBuild(self.env.Program, text, extension )
+
+ def TryRun(self, text, extension ):
+ """Compiles and runs the program given in text, using extension
+ as file extension (e.g. '.c'). Returns (1, outputStr) on success,
+ (0, '') otherwise. The target (a file containing the program's stdout)
+ is saved in self.lastTarget (for further processing).
+ """
+ ok = self.TryLink(text, extension)
+ if( ok ):
+ prog = self.lastTarget
+ pname = prog.get_internal_path()
+ output = self.confdir.File(os.path.basename(pname)+'.out')
+ node = self.env.Command(output, prog, [ [ pname, ">", "${TARGET}"] ])
+ ok = self.BuildNodes(node)
+ if ok:
+ outputStr = SCons.Util.to_str(output.get_contents())
+ return( 1, outputStr)
+ return (0, "")
+
+ class TestWrapper(object):
+ """A wrapper around Tests (to ensure sanity)"""
+ def __init__(self, test, sconf):
+ self.test = test
+ self.sconf = sconf
+ def __call__(self, *args, **kw):
+ if not self.sconf.active:
+ raise SCons.Errors.UserError
+ context = CheckContext(self.sconf)
+ ret = self.test(context, *args, **kw)
+ if self.sconf.config_h is not None:
+ self.sconf.config_h_text = self.sconf.config_h_text + context.config_h
+ context.Result("error: no result")
+ return ret
+
+ def AddTest(self, test_name, test_instance):
+ """Adds test_class to this SConf instance. It can be called with
+ self.test_name(...)"""
+ setattr(self, test_name, SConfBase.TestWrapper(test_instance, self))
+
+ def AddTests(self, tests):
+ """Adds all the tests given in the tests dictionary to this SConf
+ instance
+ """
+ for name in list(tests.keys()):
+ self.AddTest(name, tests[name])
+
+ def _createDir( self, node ):
+ dirName = str(node)
+ if dryrun:
+ if not os.path.isdir( dirName ):
+ raise ConfigureDryRunError(dirName)
+ else:
+ if not os.path.isdir( dirName ):
+ os.makedirs( dirName )
+
+ def _startup(self):
+ """Private method. Set up logstream, and set the environment
+ variables necessary for a piped build
+ """
+ global _ac_config_logs
+ global sconf_global
+ global SConfFS
+
+ self.lastEnvFs = self.env.fs
+ self.env.fs = SConfFS
+ self._createDir(self.confdir)
+ self.confdir.up().add_ignore( [self.confdir] )
+
+ if self.logfile is not None and not dryrun:
+ # truncate logfile, if SConf.Configure is called for the first time
+ # in a build
+ if self.logfile in _ac_config_logs:
+ log_mode = "a"
+ else:
+ _ac_config_logs[self.logfile] = None
+ log_mode = "w"
+ fp = open(str(self.logfile), log_mode)
+ self.logstream = SCons.Util.Unbuffered(fp)
+ # logfile may stay in a build directory, so we tell
+ # the build system not to override it with a eventually
+ # existing file with the same name in the source directory
+ self.logfile.dir.add_ignore( [self.logfile] )
+
+ tb = traceback.extract_stack()[-3-self.depth]
+ old_fs_dir = SConfFS.getcwd()
+ SConfFS.chdir(SConfFS.Top, change_os_dir=0)
+ self.logstream.write('file %s,line %d:\n\tConfigure(confdir = %s)\n' %
+ (tb[0], tb[1], str(self.confdir)) )
+ SConfFS.chdir(old_fs_dir)
+ else:
+ self.logstream = None
+ # we use a special builder to create source files from TEXT
+ action = SCons.Action.Action(_createSource,
+ _stringSource)
+ sconfSrcBld = SCons.Builder.Builder(action=action)
+ self.env.Append( BUILDERS={'SConfSourceBuilder':sconfSrcBld} )
+ self.config_h_text = _ac_config_hs.get(self.config_h, "")
+ self.active = 1
+ # only one SConf instance should be active at a time ...
+ sconf_global = self
+
+ def _shutdown(self):
+ """Private method. Reset to non-piped spawn"""
+ global sconf_global, _ac_config_hs
+
+ if not self.active:
+ raise SCons.Errors.UserError("Finish may be called only once!")
+ if self.logstream is not None and not dryrun:
+ self.logstream.write("\n")
+ self.logstream.close()
+ self.logstream = None
+ # remove the SConfSourceBuilder from the environment
+ blds = self.env['BUILDERS']
+ del blds['SConfSourceBuilder']
+ self.env.Replace( BUILDERS=blds )
+ self.active = 0
+ sconf_global = None
+ if not self.config_h is None:
+ _ac_config_hs[self.config_h] = self.config_h_text
+ self.env.fs = self.lastEnvFs
+
+class CheckContext(object):
+ """Provides a context for configure tests. Defines how a test writes to the
+ screen and log file.
+
+ A typical test is just a callable with an instance of CheckContext as
+ first argument:
+
+ def CheckCustom(context, ...):
+ context.Message('Checking my weird test ... ')
+ ret = myWeirdTestFunction(...)
+ context.Result(ret)
+
+ Often, myWeirdTestFunction will be one of
+ context.TryCompile/context.TryLink/context.TryRun. The results of
+ those are cached, for they are only rebuild, if the dependencies have
+ changed.
+ """
+
+ def __init__(self, sconf):
+ """Constructor. Pass the corresponding SConf instance."""
+ self.sconf = sconf
+ self.did_show_result = 0
+
+ # for Conftest.py:
+ self.vardict = {}
+ self.havedict = {}
+ self.headerfilename = None
+ self.config_h = "" # config_h text will be stored here
+ # we don't regenerate the config.h file after each test. That means,
+ # that tests won't be able to include the config.h file, and so
+ # they can't do an #ifdef HAVE_XXX_H. This shouldn't be a major
+ # issue, though. If it turns out, that we need to include config.h
+ # in tests, we must ensure, that the dependencies are worked out
+ # correctly. Note that we can't use Conftest.py's support for config.h,
+ # cause we will need to specify a builder for the config.h file ...
+
+ def Message(self, text):
+ """Inform about what we are doing right now, e.g.
+ 'Checking for SOMETHING ... '
+ """
+ self.Display(text)
+ self.sconf.cached = 1
+ self.did_show_result = 0
+
+ def Result(self, res):
+ """Inform about the result of the test. If res is not a string, displays
+ 'yes' or 'no' depending on whether res is evaluated as true or false.
+ The result is only displayed when self.did_show_result is not set.
+ """
+ if isinstance(res, str):
+ text = res
+ elif res:
+ text = "yes"
+ else:
+ text = "no"
+
+ if self.did_show_result == 0:
+ # Didn't show result yet, do it now.
+ self.Display(text + "\n")
+ self.did_show_result = 1
+
+ def TryBuild(self, *args, **kw):
+ return self.sconf.TryBuild(*args, **kw)
+
+ def TryAction(self, *args, **kw):
+ return self.sconf.TryAction(*args, **kw)
+
+ def TryCompile(self, *args, **kw):
+ return self.sconf.TryCompile(*args, **kw)
+
+ def TryLink(self, *args, **kw):
+ return self.sconf.TryLink(*args, **kw)
+
+ def TryRun(self, *args, **kw):
+ return self.sconf.TryRun(*args, **kw)
+
+ def __getattr__( self, attr ):
+ if( attr == 'env' ):
+ return self.sconf.env
+ elif( attr == 'lastTarget' ):
+ return self.sconf.lastTarget
+ else:
+ raise AttributeError("CheckContext instance has no attribute '%s'" % attr)
+
+ #### Stuff used by Conftest.py (look there for explanations).
+
+ def BuildProg(self, text, ext):
+ self.sconf.cached = 1
+ # TODO: should use self.vardict for $CC, $CPPFLAGS, etc.
+ return not self.TryBuild(self.env.Program, text, ext)
+
+ def CompileProg(self, text, ext):
+ self.sconf.cached = 1
+ # TODO: should use self.vardict for $CC, $CPPFLAGS, etc.
+ return not self.TryBuild(self.env.Object, text, ext)
+
+ def CompileSharedObject(self, text, ext):
+ self.sconf.cached = 1
+ # TODO: should use self.vardict for $SHCC, $CPPFLAGS, etc.
+ return not self.TryBuild(self.env.SharedObject, text, ext)
+
+ def RunProg(self, text, ext):
+ self.sconf.cached = 1
+ # TODO: should use self.vardict for $CC, $CPPFLAGS, etc.
+ st, out = self.TryRun(text, ext)
+ return not st, out
+
+ def AppendLIBS(self, lib_name_list):
+ oldLIBS = self.env.get( 'LIBS', [] )
+ self.env.Append(LIBS = lib_name_list)
+ return oldLIBS
+
+ def PrependLIBS(self, lib_name_list):
+ oldLIBS = self.env.get( 'LIBS', [] )
+ self.env.Prepend(LIBS = lib_name_list)
+ return oldLIBS
+
+ def SetLIBS(self, val):
+ oldLIBS = self.env.get( 'LIBS', [] )
+ self.env.Replace(LIBS = val)
+ return oldLIBS
+
+ def Display(self, msg):
+ if self.sconf.cached:
+ # We assume that Display is called twice for each test here
+ # once for the Checking for ... message and once for the result.
+ # The self.sconf.cached flag can only be set between those calls
+ msg = "(cached) " + msg
+ self.sconf.cached = 0
+ progress_display(msg, append_newline=0)
+ self.Log("scons: Configure: " + msg + "\n")
+
+ def Log(self, msg):
+ if self.sconf.logstream is not None:
+ self.sconf.logstream.write(msg)
+
+ #### End of stuff used by Conftest.py.
+
+
+def SConf(*args, **kw):
+ if kw.get(build_type, True):
+ kw['_depth'] = kw.get('_depth', 0) + 1
+ for bt in build_types:
+ try:
+ del kw[bt]
+ except KeyError:
+ pass
+ return SConfBase(*args, **kw)
+ else:
+ return SCons.Util.Null()
+
+
+def CheckFunc(context, function_name, header = None, language = None):
+ res = SCons.Conftest.CheckFunc(context, function_name, header = header, language = language)
+ context.did_show_result = 1
+ return not res
+
+def CheckType(context, type_name, includes = "", language = None):
+ res = SCons.Conftest.CheckType(context, type_name,
+ header = includes, language = language)
+ context.did_show_result = 1
+ return not res
+
+def CheckTypeSize(context, type_name, includes = "", language = None, expect = None):
+ res = SCons.Conftest.CheckTypeSize(context, type_name,
+ header = includes, language = language,
+ expect = expect)
+ context.did_show_result = 1
+ return res
+
+def CheckDeclaration(context, declaration, includes = "", language = None):
+ res = SCons.Conftest.CheckDeclaration(context, declaration,
+ includes = includes,
+ language = language)
+ context.did_show_result = 1
+ return not res
+
+def createIncludesFromHeaders(headers, leaveLast, include_quotes = '""'):
+ # used by CheckHeader and CheckLibWithHeader to produce C - #include
+ # statements from the specified header (list)
+ if not SCons.Util.is_List(headers):
+ headers = [headers]
+ l = []
+ if leaveLast:
+ lastHeader = headers[-1]
+ headers = headers[:-1]
+ else:
+ lastHeader = None
+ for s in headers:
+ l.append("#include %s%s%s\n"
+ % (include_quotes[0], s, include_quotes[1]))
+ return ''.join(l), lastHeader
+
+def CheckHeader(context, header, include_quotes = '<>', language = None):
+ """
+ A test for a C or C++ header file.
+ """
+ prog_prefix, hdr_to_check = \
+ createIncludesFromHeaders(header, 1, include_quotes)
+ res = SCons.Conftest.CheckHeader(context, hdr_to_check, prog_prefix,
+ language = language,
+ include_quotes = include_quotes)
+ context.did_show_result = 1
+ return not res
+
+def CheckCC(context):
+ res = SCons.Conftest.CheckCC(context)
+ context.did_show_result = 1
+ return not res
+
+def CheckCXX(context):
+ res = SCons.Conftest.CheckCXX(context)
+ context.did_show_result = 1
+ return not res
+
+def CheckSHCC(context):
+ res = SCons.Conftest.CheckSHCC(context)
+ context.did_show_result = 1
+ return not res
+
+def CheckSHCXX(context):
+ res = SCons.Conftest.CheckSHCXX(context)
+ context.did_show_result = 1
+ return not res
+
+# Bram: Make this function obsolete? CheckHeader() is more generic.
+
+def CheckCHeader(context, header, include_quotes = '""'):
+ """
+ A test for a C header file.
+ """
+ return CheckHeader(context, header, include_quotes, language = "C")
+
+
+# Bram: Make this function obsolete? CheckHeader() is more generic.
+
+def CheckCXXHeader(context, header, include_quotes = '""'):
+ """
+ A test for a C++ header file.
+ """
+ return CheckHeader(context, header, include_quotes, language = "C++")
+
+
+def CheckLib(context, library = None, symbol = "main",
+ header = None, language = None, autoadd = 1):
+ """
+ A test for a library. See also CheckLibWithHeader.
+ Note that library may also be None to test whether the given symbol
+ compiles without flags.
+ """
+
+ if library == []:
+ library = [None]
+
+ if not SCons.Util.is_List(library):
+ library = [library]
+
+ # ToDo: accept path for the library
+ res = SCons.Conftest.CheckLib(context, library, symbol, header = header,
+ language = language, autoadd = autoadd)
+ context.did_show_result = 1
+ return not res
+
+# XXX
+# Bram: Can only include one header and can't use #ifdef HAVE_HEADER_H.
+
+def CheckLibWithHeader(context, libs, header, language,
+ call = None, autoadd = 1):
+ # ToDo: accept path for library. Support system header files.
+ """
+ Another (more sophisticated) test for a library.
+ Checks, if library and header is available for language (may be 'C'
+ or 'CXX'). Call maybe be a valid expression _with_ a trailing ';'.
+ As in CheckLib, we support library=None, to test if the call compiles
+ without extra link flags.
+ """
+ prog_prefix, dummy = \
+ createIncludesFromHeaders(header, 0)
+ if libs == []:
+ libs = [None]
+
+ if not SCons.Util.is_List(libs):
+ libs = [libs]
+
+ res = SCons.Conftest.CheckLib(context, libs, None, prog_prefix,
+ call = call, language = language, autoadd = autoadd)
+ context.did_show_result = 1
+ return not res
+
+def CheckProg(context, prog_name):
+ """Simple check if a program exists in the path. Returns the path
+ for the application, or None if not found.
+ """
+ res = SCons.Conftest.CheckProg(context, prog_name)
+ context.did_show_result = 1
+ return res
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/SConfTests.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/SConfTests.py
new file mode 100644
index 0000000..f4c6f89
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/SConfTests.py
@@ -0,0 +1,789 @@
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import SCons.compat
+
+import io
+import os
+import re
+import sys
+from types import *
+import unittest
+
+import TestCmd
+import TestUnit
+
+
+sys.stdout = io.StringIO()
+
+if sys.platform == 'win32':
+ existing_lib = "msvcrt"
+else:
+ existing_lib = "m"
+
+class SConfTestCase(unittest.TestCase):
+
+ def setUp(self):
+ # we always want to start with a clean directory
+ self.save_cwd = os.getcwd()
+ self.test = TestCmd.TestCmd(workdir = '')
+ os.chdir(self.test.workpath(''))
+
+ def tearDown(self):
+ self.test.cleanup()
+ import SCons.SConsign
+ SCons.SConsign.Reset()
+ os.chdir(self.save_cwd)
+
+ def _resetSConfState(self):
+ # Ok, this is tricky, and i do not know, if everything is sane.
+ # We try to reset scons' state (including all global variables)
+ import SCons.SConsign
+ SCons.SConsign.write() # simulate normal scons-finish
+ for n in list(sys.modules.keys()):
+ if n.split('.')[0] == 'SCons' and n[:12] != 'SCons.compat':
+ m = sys.modules[n]
+ if isinstance(m, ModuleType):
+ # if this is really a scons module, clear its namespace
+ del sys.modules[n]
+ m.__dict__.clear()
+ # we only use SCons.Environment and SCons.SConf for these tests.
+ import SCons.Environment
+ import SCons.SConf
+ self.Environment = SCons.Environment
+ self.SConf = SCons.SConf
+ # and we need a new environment, cause references may point to
+ # old modules (well, at least this is safe ...)
+ self.scons_env = self.Environment.Environment()
+ self.scons_env.AppendENVPath('PATH', os.environ['PATH'])
+
+ # we want to do some autodetection here
+ # this stuff works with
+ # - cygwin on Windows (using cmd.exe, not bash)
+ # - posix
+ # - msvc on Windows (hopefully)
+ if (not self.scons_env.Detect( self.scons_env.subst('$CXX') ) or
+ not self.scons_env.Detect( self.scons_env.subst('$CC') ) or
+ not self.scons_env.Detect( self.scons_env.subst('$LINK') )):
+ raise Exception("This test needs an installed compiler!")
+ if self.scons_env['CXX'] == 'g++':
+ global existing_lib
+ existing_lib = 'm'
+
+ if sys.platform in ['cygwin', 'win32']:
+ # On Windows, SCons.Platform.win32 redefines the builtin
+ # file() and open() functions to close the file handles.
+ # This interferes with the unittest.py infrastructure in
+ # some way. Just sidestep the issue by restoring the
+ # original builtin functions whenever we have to reset
+ # all of our global state.
+
+ import SCons.Platform.win32
+
+ try:
+ file = SCons.Platform.win32._builtin_file
+ open = SCons.Platform.win32._builtin_open
+ except AttributeError:
+ pass
+
+ def _baseTryXXX(self, TryFunc):
+ # TryCompile and TryLink are much the same, so we can test them
+ # in one method, we pass the function as a string ('TryCompile',
+ # 'TryLink'), so we are aware of reloading modules.
+
+ def checks(self, sconf, TryFuncString):
+ TryFunc = self.SConf.SConfBase.__dict__[TryFuncString]
+ res1 = TryFunc( sconf, "int main() { return 0; }\n", ".c" )
+ res2 = TryFunc( sconf,
+ '#include "no_std_header.h"\nint main() {return 0; }\n',
+ '.c' )
+ return (res1,res2)
+
+ # 1. test initial behaviour (check ok / failed)
+ self._resetSConfState()
+ sconf = self.SConf.SConf(self.scons_env,
+ conf_dir=self.test.workpath('config.tests'),
+ log_file=self.test.workpath('config.log'))
+ try:
+ res = checks( self, sconf, TryFunc )
+ assert res[0] and not res[1], res
+ finally:
+ sconf.Finish()
+
+ # 2.1 test the error caching mechanism (no dependencies have changed)
+ self._resetSConfState()
+ sconf = self.SConf.SConf(self.scons_env,
+ conf_dir=self.test.workpath('config.tests'),
+ log_file=self.test.workpath('config.log'))
+ try:
+ res = checks( self, sconf, TryFunc )
+ assert res[0] and not res[1], res
+ finally:
+ sconf.Finish()
+ # we should have exactly one one error cached
+ log = str(self.test.read( self.test.workpath('config.log') ))
+ expr = re.compile( ".*failed in a previous run and all", re.DOTALL )
+ firstOcc = expr.match( log )
+ assert firstOcc is not None, log
+ secondOcc = expr.match( log, firstOcc.end(0) )
+ assert secondOcc is None, log
+
+ # 2.2 test the error caching mechanism (dependencies have changed)
+ self._resetSConfState()
+ sconf = self.SConf.SConf(self.scons_env,
+ conf_dir=self.test.workpath('config.tests'),
+ log_file=self.test.workpath('config.log'))
+ no_std_header_h = self.test.workpath('config.tests', 'no_std_header.h')
+ test_h = self.test.write( no_std_header_h,
+ "/* we are changing a dependency now */\n" );
+ try:
+ res = checks( self, sconf, TryFunc )
+ log = self.test.read( self.test.workpath('config.log') )
+ assert res[0] and res[1], res
+ finally:
+ sconf.Finish()
+
+ def test_TryBuild(self):
+ """Test SConf.TryBuild
+ """
+ # 1 test that we can try a builder that returns a list of nodes
+ self._resetSConfState()
+ sconf = self.SConf.SConf(self.scons_env,
+ conf_dir=self.test.workpath('config.tests'),
+ log_file=self.test.workpath('config.log'))
+ import SCons.Builder
+ import SCons.Node
+ class MyBuilder(SCons.Builder.BuilderBase):
+ def __init__(self):
+ self.prefix = ''
+ self.suffix = ''
+ def __call__(self, env, target, source):
+ class MyNode(object):
+ def __init__(self, name):
+ self.name = name
+ self.state = SCons.Node.no_state
+ self.waiting_parents = set()
+ self.side_effects = []
+ self.builder = None
+ self.prerequisites = None
+ def disambiguate(self):
+ return self
+ def has_builder(self):
+ return 1
+ def add_pre_action(self, *actions):
+ pass
+ def add_post_action(self, *actions):
+ pass
+ def children(self):
+ return []
+ def get_state(self):
+ return self.state
+ def set_state(self, state):
+ self.state = state
+ def alter_targets(self):
+ return [], None
+ def depends_on(self, nodes):
+ return None
+ def postprocess(self):
+ pass
+ def clear(self):
+ pass
+ def is_up_to_date(self):
+ return None
+ def prepare(self):
+ pass
+ def push_to_cache(self):
+ pass
+ def retrieve_from_cache(self):
+ return 0
+ def build(self, **kw):
+ return
+ def built(self):
+ pass
+ def get_stored_info(self):
+ pass
+ def get_executor(self):
+ class Executor(object):
+ def __init__(self, targets):
+ self.targets = targets
+ def get_all_targets(self):
+ return self.targets
+ return Executor([self])
+ return [MyNode('n1'), MyNode('n2')]
+ try:
+ self.scons_env.Append(BUILDERS = {'SConfActionBuilder' : MyBuilder()})
+ sconf.TryBuild(self.scons_env.SConfActionBuilder)
+ finally:
+ sconf.Finish()
+
+ def test_TryCompile(self):
+ """Test SConf.TryCompile
+ """
+ self._baseTryXXX( "TryCompile" ) #self.SConf.SConf.TryCompile )
+
+ def test_TryLink(self):
+ """Test SConf.TryLink
+ """
+ self._baseTryXXX( "TryLink" ) #self.SConf.SConf.TryLink )
+
+ def test_TryRun(self):
+ """Test SConf.TryRun
+ """
+ def checks(sconf):
+ prog = """
+#include <stdio.h>
+int main() {
+ printf( "Hello" );
+ return 0;
+}
+"""
+ res1 = sconf.TryRun( prog, ".c" )
+ res2 = sconf.TryRun( "not a c program\n", ".c" )
+ return (res1, res2)
+
+ self._resetSConfState()
+ sconf = self.SConf.SConf(self.scons_env,
+ conf_dir=self.test.workpath('config.tests'),
+ log_file=self.test.workpath('config.log'))
+ try:
+ res = checks(sconf)
+ assert res[0][0] and res[0][1] == "Hello", res
+ assert not res[1][0] and res[1][1] == "", res
+ finally:
+ sconf.Finish()
+ log = self.test.read( self.test.workpath('config.log') )
+
+ # test the caching mechanism
+ self._resetSConfState()
+ sconf = self.SConf.SConf(self.scons_env,
+ conf_dir=self.test.workpath('config.tests'),
+ log_file=self.test.workpath('config.log'))
+ try:
+ res = checks(sconf)
+ assert res[0][0] and res[0][1] == "Hello", res
+ assert not res[1][0] and res[1][1] == "", res
+ finally:
+ sconf.Finish()
+ # we should have exactly one error cached
+ # creating string here because it's bytes by default on py3
+ log = str(self.test.read( self.test.workpath('config.log') ))
+ expr = re.compile( ".*failed in a previous run and all", re.DOTALL )
+ firstOcc = expr.match( log )
+ assert firstOcc is not None, log
+ secondOcc = expr.match( log, firstOcc.end(0) )
+ assert secondOcc is None, log
+
+
+ def test_TryAction(self):
+ """Test SConf.TryAction
+ """
+ def actionOK(target, source, env):
+ open(str(target[0]), "w").write( "RUN OK\n" )
+ return None
+ def actionFAIL(target, source, env):
+ return 1
+ self._resetSConfState()
+ sconf = self.SConf.SConf(self.scons_env,
+ conf_dir=self.test.workpath('config.tests'),
+ log_file=self.test.workpath('config.log'))
+ try:
+ (ret, output) = sconf.TryAction(action=actionOK)
+ assert ret and output.encode('utf-8') == bytearray("RUN OK"+os.linesep,'utf-8'), (ret, output)
+ (ret, output) = sconf.TryAction(action=actionFAIL)
+ assert not ret and output == "", (ret, output)
+ finally:
+ sconf.Finish()
+
+ def _test_check_compilers(self, comp, func, name):
+ """This is the implementation for CheckCC and CheckCXX tests."""
+ from copy import deepcopy
+
+ # Check that Check* works
+ r = func()
+ assert r, "could not find %s ?" % comp
+
+ # Check that Check* does fail if comp is not available in env
+ oldcomp = deepcopy(self.scons_env[comp])
+ del self.scons_env[comp]
+ r = func()
+ assert not r, "%s worked wo comp ?" % name
+
+ # Check that Check* does fail if comp is set but empty
+ self.scons_env[comp] = ''
+ r = func()
+ assert not r, "%s worked with comp = '' ?" % name
+
+ # Check that Check* does fail if comp is set to buggy executable
+ self.scons_env[comp] = 'thiscccompilerdoesnotexist'
+ r = func()
+ assert not r, "%s worked with comp = thiscompilerdoesnotexist ?" % name
+
+ # Check that Check* does fail if CFLAGS is buggy
+ self.scons_env[comp] = oldcomp
+ self.scons_env['%sFLAGS' % comp] = '/WX qwertyuiop.c'
+ r = func()
+ assert not r, "%s worked with %sFLAGS = qwertyuiop ?" % (name, comp)
+
+ def test_CheckCC(self):
+ """Test SConf.CheckCC()
+ """
+ self._resetSConfState()
+ sconf = self.SConf.SConf(self.scons_env,
+ conf_dir=self.test.workpath('config.tests'),
+ log_file=self.test.workpath('config.log'))
+ try:
+ try:
+ self._test_check_compilers('CC', sconf.CheckCC, 'CheckCC')
+ except AssertionError:
+ sys.stderr.write(self.test.read('config.log', mode='r'))
+ raise
+ finally:
+ sconf.Finish()
+
+ def test_CheckSHCC(self):
+ """Test SConf.CheckSHCC()
+ """
+ self._resetSConfState()
+ sconf = self.SConf.SConf(self.scons_env,
+ conf_dir=self.test.workpath('config.tests'),
+ log_file=self.test.workpath('config.log'))
+ try:
+ try:
+ self._test_check_compilers('SHCC', sconf.CheckSHCC, 'CheckSHCC')
+ except AssertionError:
+ sys.stderr.write(self.test.read('config.log', mode='r'))
+ raise
+ finally:
+ sconf.Finish()
+
+ def test_CheckCXX(self):
+ """Test SConf.CheckCXX()
+ """
+ self._resetSConfState()
+ sconf = self.SConf.SConf(self.scons_env,
+ conf_dir=self.test.workpath('config.tests'),
+ log_file=self.test.workpath('config.log'))
+ try:
+ try:
+ self._test_check_compilers('CXX', sconf.CheckCXX, 'CheckCXX')
+ except AssertionError:
+ sys.stderr.write(self.test.read('config.log', mode='r'))
+ raise
+ finally:
+ sconf.Finish()
+
+ def test_CheckSHCXX(self):
+ """Test SConf.CheckSHCXX()
+ """
+ self._resetSConfState()
+ sconf = self.SConf.SConf(self.scons_env,
+ conf_dir=self.test.workpath('config.tests'),
+ log_file=self.test.workpath('config.log'))
+ try:
+ try:
+ self._test_check_compilers('SHCXX', sconf.CheckSHCXX, 'CheckSHCXX')
+ except AssertionError:
+ sys.stderr.write(self.test.read('config.log', mode='r'))
+ raise
+ finally:
+ sconf.Finish()
+
+
+ def test_CheckHeader(self):
+ """Test SConf.CheckHeader()
+ """
+ self._resetSConfState()
+ sconf = self.SConf.SConf(self.scons_env,
+ conf_dir=self.test.workpath('config.tests'),
+ log_file=self.test.workpath('config.log'))
+ try:
+ # CheckHeader()
+ r = sconf.CheckHeader( "stdio.h", include_quotes="<>", language="C" )
+ assert r, "did not find stdio.h"
+ r = sconf.CheckHeader( "HopefullyNoHeader.noh", language="C" )
+ assert not r, "unexpectedly found HopefullyNoHeader.noh"
+ r = sconf.CheckHeader( "vector", include_quotes="<>", language="C++" )
+ assert r, "did not find vector"
+ r = sconf.CheckHeader( "HopefullyNoHeader.noh", language="C++" )
+ assert not r, "unexpectedly found HopefullyNoHeader.noh"
+
+ finally:
+ sconf.Finish()
+
+ def test_CheckCHeader(self):
+ """Test SConf.CheckCHeader()
+ """
+ self._resetSConfState()
+ sconf = self.SConf.SConf(self.scons_env,
+ conf_dir=self.test.workpath('config.tests'),
+ log_file=self.test.workpath('config.log'))
+
+ try:
+ # CheckCHeader()
+ r = sconf.CheckCHeader( "stdio.h", include_quotes="<>" )
+ assert r, "did not find stdio.h"
+ r = sconf.CheckCHeader( ["math.h", "stdio.h"], include_quotes="<>" )
+ assert r, "did not find stdio.h, #include math.h first"
+ r = sconf.CheckCHeader( "HopefullyNoCHeader.noh" )
+ assert not r, "unexpectedly found HopefullyNoCHeader.noh"
+
+ finally:
+ sconf.Finish()
+
+ def test_CheckCXXHeader(self):
+ """Test SConf.CheckCXXHeader()
+ """
+ self._resetSConfState()
+ sconf = self.SConf.SConf(self.scons_env,
+ conf_dir=self.test.workpath('config.tests'),
+ log_file=self.test.workpath('config.log'))
+
+ try:
+ # CheckCXXHeader()
+ r = sconf.CheckCXXHeader( "vector", include_quotes="<>" )
+ assert r, "did not find vector"
+ r = sconf.CheckCXXHeader( ["stdio.h", "vector"], include_quotes="<>" )
+ assert r, "did not find vector, #include stdio.h first"
+ r = sconf.CheckCXXHeader( "HopefullyNoCXXHeader.noh" )
+ assert not r, "unexpectedly found HopefullyNoCXXHeader.noh"
+
+ finally:
+ sconf.Finish()
+
+ def test_CheckLib(self):
+ """Test SConf.CheckLib()
+ """
+ self._resetSConfState()
+ sconf = self.SConf.SConf(self.scons_env,
+ conf_dir=self.test.workpath('config.tests'),
+ log_file=self.test.workpath('config.log'))
+
+ try:
+ # CheckLib()
+ r = sconf.CheckLib( existing_lib, "main", autoadd=0 )
+ assert r, "did not find %s" % existing_lib
+ r = sconf.CheckLib( "hopefullynolib", "main", autoadd=0 )
+ assert not r, "unexpectedly found hopefullynolib"
+
+ # CheckLib() with list of libs
+ r = sconf.CheckLib( [existing_lib], "main", autoadd=0 )
+ assert r, "did not find %s" % existing_lib
+ r = sconf.CheckLib( ["hopefullynolib"], "main", autoadd=0 )
+ assert not r, "unexpectedly found hopefullynolib"
+ # This is a check that a null list doesn't find functions
+ # that are in libraries that must be explicitly named.
+ # This works on POSIX systems where you have to -lm to
+ # get the math functions, but it fails on Visual Studio
+ # where you apparently get all those functions for free.
+ # Comment out this check until someone who understands
+ # Visual Studio better can come up with a corresponding
+ # test (if that ever really becomes necessary).
+ #r = sconf.CheckLib( [], "sin", autoadd=0 )
+ #assert not r, "unexpectedly found nonexistent library"
+ r = sconf.CheckLib( [existing_lib,"hopefullynolib"], "main", autoadd=0 )
+ assert r, "did not find %s,%s " % (existing_lib,r)
+ r = sconf.CheckLib( ["hopefullynolib",existing_lib], "main", autoadd=0 )
+ assert r, "did not find %s " % existing_lib
+
+ # CheckLib() with autoadd
+ def libs(env):
+ return env.get('LIBS', [])
+
+ env = sconf.env.Clone()
+
+ try:
+ r = sconf.CheckLib( existing_lib, "main", autoadd=1 )
+ assert r, "did not find main in %s" % existing_lib
+ expect = libs(env) + [existing_lib]
+ got = libs(sconf.env)
+ assert got == expect, "LIBS: expected %s, got %s" % (expect, got)
+
+ sconf.env = env.Clone()
+ r = sconf.CheckLib( existing_lib, "main", autoadd=0 )
+ assert r, "did not find main in %s" % existing_lib
+ expect = libs(env)
+ got = libs(sconf.env)
+ assert got == expect, "before and after LIBS were not the same"
+ finally:
+ sconf.env = env
+ finally:
+ sconf.Finish()
+
+ def test_CheckLibWithHeader(self):
+ """Test SConf.CheckLibWithHeader()
+ """
+ self._resetSConfState()
+ sconf = self.SConf.SConf(self.scons_env,
+ conf_dir=self.test.workpath('config.tests'),
+ log_file=self.test.workpath('config.log'))
+
+ try:
+ # CheckLibWithHeader()
+ r = sconf.CheckLibWithHeader( existing_lib, "math.h", "C", autoadd=0 )
+ assert r, "did not find %s" % existing_lib
+ r = sconf.CheckLibWithHeader( existing_lib, ["stdio.h", "math.h"], "C", autoadd=0 )
+ assert r, "did not find %s, #include stdio.h first" % existing_lib
+ r = sconf.CheckLibWithHeader( "hopefullynolib", "math.h", "C", autoadd=0 )
+ assert not r, "unexpectedly found hopefullynolib"
+
+ # CheckLibWithHeader() with lists of libs
+ r = sconf.CheckLibWithHeader( [existing_lib], "math.h", "C", autoadd=0 )
+ assert r, "did not find %s" % existing_lib
+ r = sconf.CheckLibWithHeader( [existing_lib], ["stdio.h", "math.h"], "C", autoadd=0 )
+ assert r, "did not find %s, #include stdio.h first" % existing_lib
+ # This is a check that a null list doesn't find functions
+ # that are in libraries that must be explicitly named.
+ # This works on POSIX systems where you have to -lm to
+ # get the math functions, but it fails on Visual Studio
+ # where you apparently get all those functions for free.
+ # Comment out this check until someone who understands
+ # Visual Studio better can come up with a corresponding
+ # test (if that ever really becomes necessary).
+ #r = sconf.CheckLibWithHeader( [], "math.h", "C", call="sin(3);", autoadd=0 )
+ #assert not r, "unexpectedly found non-existent library"
+ r = sconf.CheckLibWithHeader( ["hopefullynolib"], "math.h", "C", autoadd=0 )
+ assert not r, "unexpectedly found hopefullynolib"
+ r = sconf.CheckLibWithHeader( ["hopefullynolib",existing_lib], ["stdio.h", "math.h"], "C", autoadd=0 )
+ assert r, "did not find %s, #include stdio.h first" % existing_lib
+ r = sconf.CheckLibWithHeader( [existing_lib,"hopefullynolib"], ["stdio.h", "math.h"], "C", autoadd=0 )
+ assert r, "did not find %s, #include stdio.h first" % existing_lib
+
+ # CheckLibWithHeader with autoadd
+ def libs(env):
+ return env.get('LIBS', [])
+
+ env = sconf.env.Clone()
+
+ try:
+ r = sconf.CheckLibWithHeader( existing_lib, "math.h", "C", autoadd=1 )
+ assert r, "did not find math.h with %s" % existing_lib
+ expect = libs(env) + [existing_lib]
+ got = libs(sconf.env)
+ assert got == expect, "LIBS: expected %s, got %s" % (expect, got)
+
+ sconf.env = env.Clone()
+ r = sconf.CheckLibWithHeader( existing_lib, "math.h", "C", autoadd=0 )
+ assert r, "did not find math.h with %s" % existing_lib
+ expect = libs(env)
+ got = libs(sconf.env)
+ assert got == expect, "before and after LIBS were not the same"
+ finally:
+ sconf.env = env
+
+ finally:
+ sconf.Finish()
+
+ def test_CheckFunc(self):
+ """Test SConf.CheckFunc()
+ """
+ self._resetSConfState()
+ sconf = self.SConf.SConf(self.scons_env,
+ conf_dir=self.test.workpath('config.tests'),
+ log_file=self.test.workpath('config.log'))
+
+ try:
+ # CheckFunc()
+ r = sconf.CheckFunc('strcpy')
+ assert r, "did not find strcpy"
+ r = sconf.CheckFunc('strcpy', '/* header */ char strcpy();')
+ assert r, "did not find strcpy"
+ r = sconf.CheckFunc('hopefullynofunction')
+ assert not r, "unexpectedly found hopefullynofunction"
+
+ finally:
+ sconf.Finish()
+
+ def test_CheckProg(self):
+ """Test SConf.CheckProg()
+ """
+ self._resetSConfState()
+ sconf = self.SConf.SConf(self.scons_env,
+ conf_dir=self.test.workpath('config.tests'),
+ log_file=self.test.workpath('config.log'))
+
+ try:
+ if os.name != 'nt':
+ r = sconf.CheckProg('sh')
+ assert r, "/bin/sh"
+ else:
+ r = sconf.CheckProg('cmd.exe')
+ self.assertIn('cmd.exe',r)
+
+
+ r = sconf.CheckProg('hopefully-not-a-program')
+ assert r is None
+
+ finally:
+ sconf.Finish()
+
+
+ def test_Define(self):
+ """Test SConf.Define()
+ """
+ self._resetSConfState()
+ sconf = self.SConf.SConf(self.scons_env,
+ conf_dir=self.test.workpath('config.tests'),
+ log_file=self.test.workpath('config.log'),
+ config_h = self.test.workpath('config.h'))
+ try:
+ # XXX: we test the generated config.h string. This is not so good,
+ # ideally, we would like to test if the generated file included in
+ # a test program does what we want.
+
+ # Test defining one symbol wo value
+ sconf.config_h_text = ''
+ sconf.Define('YOP')
+ assert sconf.config_h_text == '#define YOP\n'
+
+ # Test defining one symbol with integer value
+ sconf.config_h_text = ''
+ sconf.Define('YOP', 1)
+ assert sconf.config_h_text == '#define YOP 1\n'
+
+ # Test defining one symbol with string value
+ sconf.config_h_text = ''
+ sconf.Define('YOP', '"YIP"')
+ assert sconf.config_h_text == '#define YOP "YIP"\n'
+
+ # Test defining one symbol with string value
+ sconf.config_h_text = ''
+ sconf.Define('YOP', "YIP")
+ assert sconf.config_h_text == '#define YOP YIP\n'
+
+ finally:
+ sconf.Finish()
+
+ def test_CheckTypeSize(self):
+ """Test SConf.CheckTypeSize()
+ """
+ self._resetSConfState()
+ sconf = self.SConf.SConf(self.scons_env,
+ conf_dir=self.test.workpath('config.tests'),
+ log_file=self.test.workpath('config.log'))
+ try:
+ # CheckTypeSize()
+
+ # In ANSI C, sizeof(char) == 1.
+ r = sconf.CheckTypeSize('char', expect = 1)
+ assert r == 1, "sizeof(char) != 1 ??"
+ r = sconf.CheckTypeSize('char', expect = 0)
+ assert r == 0, "sizeof(char) == 0 ??"
+ r = sconf.CheckTypeSize('char', expect = 2)
+ assert r == 0, "sizeof(char) == 2 ??"
+ r = sconf.CheckTypeSize('char')
+ assert r == 1, "sizeof(char) != 1 ??"
+ r = sconf.CheckTypeSize('const unsigned char')
+ assert r == 1, "sizeof(const unsigned char) != 1 ??"
+
+ # Checking C++
+ r = sconf.CheckTypeSize('const unsigned char', language = 'C++')
+ assert r == 1, "sizeof(const unsigned char) != 1 ??"
+
+ # Checking Non-existing type
+ r = sconf.CheckTypeSize('thistypedefhasnotchancetosexist_scons')
+ assert r == 0, \
+ "Checking size of thistypedefhasnotchancetosexist_scons succeeded ?"
+
+ finally:
+ sconf.Finish()
+
+ def test_CheckDeclaration(self):
+ """Test SConf.CheckDeclaration()
+ """
+ self._resetSConfState()
+ sconf = self.SConf.SConf(self.scons_env,
+ conf_dir=self.test.workpath('config.tests'),
+ log_file=self.test.workpath('config.log'))
+ try:
+ # In ANSI C, malloc should be available in stdlib
+ r = sconf.CheckDeclaration('malloc', includes = "#include <stdlib.h>")
+ assert r, "malloc not declared ??"
+ # For C++, __cplusplus should be declared
+ r = sconf.CheckDeclaration('__cplusplus', language = 'C++')
+ assert r, "__cplusplus not declared in C++ ??"
+ r = sconf.CheckDeclaration('__cplusplus', language = 'C')
+ assert not r, "__cplusplus declared in C ??"
+ r = sconf.CheckDeclaration('unknown', language = 'Unknown')
+ assert not r, "unknown language was supported ??"
+ finally:
+ sconf.Finish()
+
+ def test_(self):
+ """Test SConf.CheckType()
+ """
+ self._resetSConfState()
+ sconf = self.SConf.SConf(self.scons_env,
+ conf_dir=self.test.workpath('config.tests'),
+ log_file=self.test.workpath('config.log'))
+ try:
+ # CheckType()
+ r = sconf.CheckType('off_t', '#include <sys/types.h>\n')
+ assert r, "did not find off_t"
+ r = sconf.CheckType('hopefullynotypedef_not')
+ assert not r, "unexpectedly found hopefullynotypedef_not"
+
+ finally:
+ sconf.Finish()
+
+ def test_CustomChecks(self):
+ """Test Custom Checks
+ """
+ def CheckCustom(test):
+ test.Message( "Checking UserTest ... " )
+ prog = """
+#include <stdio.h>
+
+int main() {
+ printf( "Hello" );
+ return 0;
+}
+"""
+ (ret, output) = test.TryRun( prog, ".c" )
+ test.Result( ret )
+ assert ret and output == "Hello", (ret, output)
+ return ret
+
+
+ self._resetSConfState()
+ sconf = self.SConf.SConf(self.scons_env,
+ custom_tests={'CheckCustom': CheckCustom},
+ conf_dir=self.test.workpath('config.tests'),
+ log_file=self.test.workpath('config.log'))
+ try:
+ ret = sconf.CheckCustom()
+ assert ret, ret
+ finally:
+ sconf.Finish()
+
+
+if __name__ == "__main__":
+ suite = unittest.makeSuite(SConfTestCase, 'test_')
+ TestUnit.run(suite)
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/SConsign.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/SConsign.py
new file mode 100644
index 0000000..5042aa1
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/SConsign.py
@@ -0,0 +1,426 @@
+"""SCons.SConsign
+
+Writing and reading information to the .sconsign file or files.
+
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+from __future__ import print_function
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import SCons.compat
+
+import os
+import pickle
+
+import SCons.dblite
+import SCons.Warnings
+
+from SCons.compat import PICKLE_PROTOCOL
+
+
+def corrupt_dblite_warning(filename):
+ SCons.Warnings.warn(SCons.Warnings.CorruptSConsignWarning,
+ "Ignoring corrupt .sconsign file: %s"%filename)
+
+SCons.dblite.ignore_corrupt_dbfiles = 1
+SCons.dblite.corruption_warning = corrupt_dblite_warning
+
+# XXX Get rid of the global array so this becomes re-entrant.
+sig_files = []
+
+# Info for the database SConsign implementation (now the default):
+# "DataBase" is a dictionary that maps top-level SConstruct directories
+# to open database handles.
+# "DB_Module" is the Python database module to create the handles.
+# "DB_Name" is the base name of the database file (minus any
+# extension the underlying DB module will add).
+DataBase = {}
+DB_Module = SCons.dblite
+DB_Name = ".sconsign"
+DB_sync_list = []
+
+
+def Get_DataBase(dir):
+ global DataBase, DB_Module, DB_Name
+ top = dir.fs.Top
+ if not os.path.isabs(DB_Name) and top.repositories:
+ mode = "c"
+ for d in [top] + top.repositories:
+ if dir.is_under(d):
+ try:
+ return DataBase[d], mode
+ except KeyError:
+ path = d.entry_abspath(DB_Name)
+ try: db = DataBase[d] = DB_Module.open(path, mode)
+ except (IOError, OSError): pass
+ else:
+ if mode != "r":
+ DB_sync_list.append(db)
+ return db, mode
+ mode = "r"
+ try:
+ return DataBase[top], "c"
+ except KeyError:
+ db = DataBase[top] = DB_Module.open(DB_Name, "c")
+ DB_sync_list.append(db)
+ return db, "c"
+ except TypeError:
+ print("DataBase =", DataBase)
+ raise
+
+
+def Reset():
+ """Reset global state. Used by unit tests that end up using
+ SConsign multiple times to get a clean slate for each test."""
+ global sig_files, DB_sync_list
+ sig_files = []
+ DB_sync_list = []
+
+normcase = os.path.normcase
+
+
+def write():
+ global sig_files
+ for sig_file in sig_files:
+ sig_file.write(sync=0)
+ for db in DB_sync_list:
+ try:
+ syncmethod = db.sync
+ except AttributeError:
+ pass # Not all dbm modules have sync() methods.
+ else:
+ syncmethod()
+ try:
+ closemethod = db.close
+ except AttributeError:
+ pass # Not all dbm modules have close() methods.
+ else:
+ closemethod()
+
+
+class SConsignEntry(object):
+ """
+ Wrapper class for the generic entry in a .sconsign file.
+ The Node subclass populates it with attributes as it pleases.
+
+ XXX As coded below, we do expect a '.binfo' attribute to be added,
+ but we'll probably generalize this in the next refactorings.
+ """
+ __slots__ = ("binfo", "ninfo", "__weakref__")
+ current_version_id = 2
+
+ def __init__(self):
+ # Create an object attribute from the class attribute so it ends up
+ # in the pickled data in the .sconsign file.
+ #_version_id = self.current_version_id
+ pass
+
+ def convert_to_sconsign(self):
+ self.binfo.convert_to_sconsign()
+
+ def convert_from_sconsign(self, dir, name):
+ self.binfo.convert_from_sconsign(dir, name)
+
+ def __getstate__(self):
+ state = getattr(self, '__dict__', {}).copy()
+ for obj in type(self).mro():
+ for name in getattr(obj,'__slots__',()):
+ if hasattr(self, name):
+ state[name] = getattr(self, name)
+
+ state['_version_id'] = self.current_version_id
+ try:
+ del state['__weakref__']
+ except KeyError:
+ pass
+ return state
+
+ def __setstate__(self, state):
+ for key, value in state.items():
+ if key not in ('_version_id','__weakref__'):
+ setattr(self, key, value)
+
+
+class Base(object):
+ """
+ This is the controlling class for the signatures for the collection of
+ entries associated with a specific directory. The actual directory
+ association will be maintained by a subclass that is specific to
+ the underlying storage method. This class provides a common set of
+ methods for fetching and storing the individual bits of information
+ that make up signature entry.
+ """
+ def __init__(self):
+ self.entries = {}
+ self.dirty = False
+ self.to_be_merged = {}
+
+ def get_entry(self, filename):
+ """
+ Fetch the specified entry attribute.
+ """
+ return self.entries[filename]
+
+ def set_entry(self, filename, obj):
+ """
+ Set the entry.
+ """
+ self.entries[filename] = obj
+ self.dirty = True
+
+ def do_not_set_entry(self, filename, obj):
+ pass
+
+ def store_info(self, filename, node):
+ entry = node.get_stored_info()
+ entry.binfo.merge(node.get_binfo())
+ self.to_be_merged[filename] = node
+ self.dirty = True
+
+ def do_not_store_info(self, filename, node):
+ pass
+
+ def merge(self):
+ for key, node in self.to_be_merged.items():
+ entry = node.get_stored_info()
+ try:
+ ninfo = entry.ninfo
+ except AttributeError:
+ # This happens with SConf Nodes, because the configuration
+ # subsystem takes direct control over how the build decision
+ # is made and its information stored.
+ pass
+ else:
+ ninfo.merge(node.get_ninfo())
+ self.entries[key] = entry
+ self.to_be_merged = {}
+
+
+class DB(Base):
+ """
+ A Base subclass that reads and writes signature information
+ from a global .sconsign.db* file--the actual file suffix is
+ determined by the database module.
+ """
+ def __init__(self, dir):
+ Base.__init__(self)
+
+ self.dir = dir
+
+ db, mode = Get_DataBase(dir)
+
+ # Read using the path relative to the top of the Repository
+ # (self.dir.tpath) from which we're fetching the signature
+ # information.
+ path = normcase(dir.get_tpath())
+ try:
+ rawentries = db[path]
+ except KeyError:
+ pass
+ else:
+ try:
+ self.entries = pickle.loads(rawentries)
+ if not isinstance(self.entries, dict):
+ self.entries = {}
+ raise TypeError
+ except KeyboardInterrupt:
+ raise
+ except Exception as e:
+ SCons.Warnings.warn(SCons.Warnings.CorruptSConsignWarning,
+ "Ignoring corrupt sconsign entry : %s (%s)\n"%(self.dir.get_tpath(), e))
+ for key, entry in self.entries.items():
+ entry.convert_from_sconsign(dir, key)
+
+ if mode == "r":
+ # This directory is actually under a repository, which means
+ # likely they're reaching in directly for a dependency on
+ # a file there. Don't actually set any entry info, so we
+ # won't try to write to that .sconsign.dblite file.
+ self.set_entry = self.do_not_set_entry
+ self.store_info = self.do_not_store_info
+
+ global sig_files
+ sig_files.append(self)
+
+ def write(self, sync=1):
+ if not self.dirty:
+ return
+
+ self.merge()
+
+ db, mode = Get_DataBase(self.dir)
+
+ # Write using the path relative to the top of the SConstruct
+ # directory (self.dir.path), not relative to the top of
+ # the Repository; we only write to our own .sconsign file,
+ # not to .sconsign files in Repositories.
+ path = normcase(self.dir.get_internal_path())
+ for key, entry in self.entries.items():
+ entry.convert_to_sconsign()
+ db[path] = pickle.dumps(self.entries, PICKLE_PROTOCOL)
+
+ if sync:
+ try:
+ syncmethod = db.sync
+ except AttributeError:
+ # Not all anydbm modules have sync() methods.
+ pass
+ else:
+ syncmethod()
+
+
+class Dir(Base):
+ def __init__(self, fp=None, dir=None):
+ """
+ fp - file pointer to read entries from
+ """
+ Base.__init__(self)
+
+ if not fp:
+ return
+
+ self.entries = pickle.load(fp)
+ if not isinstance(self.entries, dict):
+ self.entries = {}
+ raise TypeError
+
+ if dir:
+ for key, entry in self.entries.items():
+ entry.convert_from_sconsign(dir, key)
+
+
+class DirFile(Dir):
+ """
+ Encapsulates reading and writing a per-directory .sconsign file.
+ """
+ def __init__(self, dir):
+ """
+ dir - the directory for the file
+ """
+
+ self.dir = dir
+ self.sconsign = os.path.join(dir.get_internal_path(), '.sconsign')
+
+ try:
+ fp = open(self.sconsign, 'rb')
+ except IOError:
+ fp = None
+
+ try:
+ Dir.__init__(self, fp, dir)
+ except KeyboardInterrupt:
+ raise
+ except:
+ SCons.Warnings.warn(SCons.Warnings.CorruptSConsignWarning,
+ "Ignoring corrupt .sconsign file: %s"%self.sconsign)
+
+ global sig_files
+ sig_files.append(self)
+
+ def write(self, sync=1):
+ """
+ Write the .sconsign file to disk.
+
+ Try to write to a temporary file first, and rename it if we
+ succeed. If we can't write to the temporary file, it's
+ probably because the directory isn't writable (and if so,
+ how did we build anything in this directory, anyway?), so
+ try to write directly to the .sconsign file as a backup.
+ If we can't rename, try to copy the temporary contents back
+ to the .sconsign file. Either way, always try to remove
+ the temporary file at the end.
+ """
+ if not self.dirty:
+ return
+
+ self.merge()
+
+ temp = os.path.join(self.dir.get_internal_path(), '.scons%d' % os.getpid())
+ try:
+ file = open(temp, 'wb')
+ fname = temp
+ except IOError:
+ try:
+ file = open(self.sconsign, 'wb')
+ fname = self.sconsign
+ except IOError:
+ return
+ for key, entry in self.entries.items():
+ entry.convert_to_sconsign()
+ pickle.dump(self.entries, file, PICKLE_PROTOCOL)
+ file.close()
+ if fname != self.sconsign:
+ try:
+ mode = os.stat(self.sconsign)[0]
+ os.chmod(self.sconsign, 0o666)
+ os.unlink(self.sconsign)
+ except (IOError, OSError):
+ # Try to carry on in the face of either OSError
+ # (things like permission issues) or IOError (disk
+ # or network issues). If there's a really dangerous
+ # issue, it should get re-raised by the calls below.
+ pass
+ try:
+ os.rename(fname, self.sconsign)
+ except OSError:
+ # An OSError failure to rename may indicate something
+ # like the directory has no write permission, but
+ # the .sconsign file itself might still be writable,
+ # so try writing on top of it directly. An IOError
+ # here, or in any of the following calls, would get
+ # raised, indicating something like a potentially
+ # serious disk or network issue.
+ open(self.sconsign, 'wb').write(open(fname, 'rb').read())
+ os.chmod(self.sconsign, mode)
+ try:
+ os.unlink(temp)
+ except (IOError, OSError):
+ pass
+
+ForDirectory = DB
+
+
+def File(name, dbm_module=None):
+ """
+ Arrange for all signatures to be stored in a global .sconsign.db*
+ file.
+ """
+ global ForDirectory, DB_Name, DB_Module
+ if name is None:
+ ForDirectory = DirFile
+ DB_Module = None
+ else:
+ ForDirectory = DB
+ DB_Name = name
+ if not dbm_module is None:
+ DB_Module = dbm_module
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/SConsignTests.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/SConsignTests.py
new file mode 100644
index 0000000..d40a7b6
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/SConsignTests.py
@@ -0,0 +1,402 @@
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import os
+import sys
+import unittest
+
+import TestCmd
+import TestUnit
+
+import SCons.dblite
+
+import SCons.SConsign
+
+class BuildInfo(object):
+ def merge(self, object):
+ pass
+
+class DummySConsignEntry(object):
+ def __init__(self, name):
+ self.name = name
+ self.binfo = BuildInfo()
+ def convert_to_sconsign(self):
+ self.c_to_s = 1
+ def convert_from_sconsign(self, dir, name):
+ self.c_from_s = 1
+
+class FS(object):
+ def __init__(self, top):
+ self.Top = top
+ self.Top.repositories = []
+
+class DummyNode(object):
+ def __init__(self, path='not_a_valid_path', binfo=None):
+ self.path = path
+ self.tpath = path
+ self.fs = FS(self)
+ self.binfo = binfo
+ def get_stored_info(self):
+ return self.binfo
+ def get_binfo(self):
+ return self.binfo
+ def get_internal_path(self):
+ return self.path
+ def get_tpath(self):
+ return self.tpath
+
+class SConsignTestCase(unittest.TestCase):
+ def setUp(self):
+ self.save_cwd = os.getcwd()
+ self.test = TestCmd.TestCmd(workdir = '')
+ os.chdir(self.test.workpath(''))
+ def tearDown(self):
+ self.test.cleanup()
+ SCons.SConsign.Reset()
+ os.chdir(self.save_cwd)
+
+class BaseTestCase(SConsignTestCase):
+
+ def test_Base(self):
+ aaa = DummySConsignEntry('aaa')
+ bbb = DummySConsignEntry('bbb')
+ bbb.arg1 = 'bbb arg1'
+ ccc = DummySConsignEntry('ccc')
+ ccc.arg2 = 'ccc arg2'
+
+ f = SCons.SConsign.Base()
+ f.set_entry('aaa', aaa)
+ f.set_entry('bbb', bbb)
+
+ #f.merge()
+
+ e = f.get_entry('aaa')
+ assert e == aaa, e
+ assert e.name == 'aaa', e.name
+
+ e = f.get_entry('bbb')
+ assert e == bbb, e
+ assert e.name == 'bbb', e.name
+ assert e.arg1 == 'bbb arg1', e.arg1
+ assert not hasattr(e, 'arg2'), e
+
+ f.set_entry('bbb', ccc)
+
+ e = f.get_entry('bbb')
+ assert e.name == 'ccc', e.name
+ assert not hasattr(e, 'arg1'), e
+ assert e.arg2 == 'ccc arg2', e.arg1
+
+ ddd = DummySConsignEntry('ddd')
+ eee = DummySConsignEntry('eee')
+ fff = DummySConsignEntry('fff')
+ fff.arg = 'fff arg'
+
+ f = SCons.SConsign.Base()
+ f.set_entry('ddd', ddd)
+ f.set_entry('eee', eee)
+
+ e = f.get_entry('ddd')
+ assert e == ddd, e
+ assert e.name == 'ddd', e.name
+
+ e = f.get_entry('eee')
+ assert e == eee, e
+ assert e.name == 'eee', e.name
+ assert not hasattr(e, 'arg'), e
+
+ f.set_entry('eee', fff)
+
+ e = f.get_entry('eee')
+ assert e.name == 'fff', e.name
+ assert e.arg == 'fff arg', e.arg
+
+ def test_store_info(self):
+ aaa = DummySConsignEntry('aaa')
+ bbb = DummySConsignEntry('bbb')
+ bbb.arg1 = 'bbb arg1'
+ ccc = DummySConsignEntry('ccc')
+ ccc.arg2 = 'ccc arg2'
+
+ f = SCons.SConsign.Base()
+ f.store_info('aaa', DummyNode('aaa', aaa))
+ f.store_info('bbb', DummyNode('bbb', bbb))
+
+ try:
+ e = f.get_entry('aaa')
+ except KeyError:
+ pass
+ else:
+ raise Exception("unexpected entry %s" % e)
+
+ try:
+ e = f.get_entry('bbb')
+ except KeyError:
+ pass
+ else:
+ raise Exception("unexpected entry %s" % e)
+
+ f.merge()
+
+ e = f.get_entry('aaa')
+ assert e == aaa, "aaa = %s, e = %s" % (aaa, e)
+ assert e.name == 'aaa', e.name
+
+ e = f.get_entry('bbb')
+ assert e == bbb, "bbb = %s, e = %s" % (bbb, e)
+ assert e.name == 'bbb', e.name
+ assert e.arg1 == 'bbb arg1', e.arg1
+ assert not hasattr(e, 'arg2'), e
+
+ f.store_info('bbb', DummyNode('bbb', ccc))
+
+ e = f.get_entry('bbb')
+ assert e == bbb, e
+ assert e.name == 'bbb', e.name
+ assert e.arg1 == 'bbb arg1', e.arg1
+ assert not hasattr(e, 'arg2'), e
+
+ f.merge()
+
+ e = f.get_entry('bbb')
+ assert e.name == 'ccc', e.name
+ assert not hasattr(e, 'arg1'), e
+ assert e.arg2 == 'ccc arg2', e.arg1
+
+ ddd = DummySConsignEntry('ddd')
+ eee = DummySConsignEntry('eee')
+ fff = DummySConsignEntry('fff')
+ fff.arg = 'fff arg'
+
+ f = SCons.SConsign.Base()
+ f.store_info('ddd', DummyNode('ddd', ddd))
+ f.store_info('eee', DummyNode('eee', eee))
+
+ f.merge()
+
+ e = f.get_entry('ddd')
+ assert e == ddd, e
+ assert e.name == 'ddd', e.name
+
+ e = f.get_entry('eee')
+ assert e == eee, e
+ assert e.name == 'eee', e.name
+ assert not hasattr(e, 'arg'), e
+
+ f.store_info('eee', DummyNode('eee', fff))
+
+ e = f.get_entry('eee')
+ assert e == eee, e
+ assert e.name == 'eee', e.name
+ assert not hasattr(e, 'arg'), e
+
+ f.merge()
+
+ e = f.get_entry('eee')
+ assert e.name == 'fff', e.name
+ assert e.arg == 'fff arg', e.arg
+
+class SConsignDBTestCase(SConsignTestCase):
+
+ def test_SConsignDB(self):
+ save_DataBase = SCons.SConsign.DataBase
+ SCons.SConsign.DataBase = {}
+ try:
+ d1 = SCons.SConsign.DB(DummyNode('dir1'))
+ d1.set_entry('aaa', DummySConsignEntry('aaa name'))
+ d1.set_entry('bbb', DummySConsignEntry('bbb name'))
+
+ aaa = d1.get_entry('aaa')
+ assert aaa.name == 'aaa name'
+ bbb = d1.get_entry('bbb')
+ assert bbb.name == 'bbb name'
+
+ d2 = SCons.SConsign.DB(DummyNode('dir2'))
+ d2.set_entry('ccc', DummySConsignEntry('ccc name'))
+ d2.set_entry('ddd', DummySConsignEntry('ddd name'))
+
+ ccc = d2.get_entry('ccc')
+ assert ccc.name == 'ccc name'
+ ddd = d2.get_entry('ddd')
+ assert ddd.name == 'ddd name'
+
+ d31 = SCons.SConsign.DB(DummyNode('dir3/sub1'))
+ d31.set_entry('eee', DummySConsignEntry('eee name'))
+ d31.set_entry('fff', DummySConsignEntry('fff name'))
+
+ eee = d31.get_entry('eee')
+ assert eee.name == 'eee name'
+ fff = d31.get_entry('fff')
+ assert fff.name == 'fff name'
+
+ d32 = SCons.SConsign.DB(DummyNode('dir3%ssub2' % os.sep))
+ d32.set_entry('ggg', DummySConsignEntry('ggg name'))
+ d32.set_entry('hhh', DummySConsignEntry('hhh name'))
+
+ ggg = d32.get_entry('ggg')
+ assert ggg.name == 'ggg name'
+ hhh = d32.get_entry('hhh')
+ assert hhh.name == 'hhh name'
+
+ finally:
+
+ SCons.SConsign.DataBase = save_DataBase
+
+class SConsignDirFileTestCase(SConsignTestCase):
+
+ def test_SConsignDirFile(self):
+ bi_foo = DummySConsignEntry('foo')
+ bi_bar = DummySConsignEntry('bar')
+
+ f = SCons.SConsign.DirFile(DummyNode())
+ f.set_entry('foo', bi_foo)
+ f.set_entry('bar', bi_bar)
+
+ e = f.get_entry('foo')
+ assert e == bi_foo, e
+ assert e.name == 'foo', e.name
+
+ e = f.get_entry('bar')
+ assert e == bi_bar, e
+ assert e.name == 'bar', e.name
+ assert not hasattr(e, 'arg'), e
+
+ bbb = DummySConsignEntry('bbb')
+ bbb.arg = 'bbb arg'
+
+ f.set_entry('bar', bbb)
+
+ e = f.get_entry('bar')
+ assert e.name == 'bbb', e.name
+ assert e.arg == 'bbb arg', e.arg
+
+
+class SConsignFileTestCase(SConsignTestCase):
+
+ def test_SConsignFile(self):
+ test = self.test
+ file = test.workpath('sconsign_file')
+
+ assert SCons.SConsign.DataBase == {}, SCons.SConsign.DataBase
+ assert SCons.SConsign.DB_Name == ".sconsign", SCons.SConsign.DB_Name
+ assert SCons.SConsign.DB_Module is SCons.dblite, SCons.SConsign.DB_Module
+
+ SCons.SConsign.File(file)
+
+ assert SCons.SConsign.DataBase == {}, SCons.SConsign.DataBase
+ assert SCons.SConsign.DB_Name is file, SCons.SConsign.DB_Name
+ assert SCons.SConsign.DB_Module is SCons.dblite, SCons.SConsign.DB_Module
+
+ SCons.SConsign.File(None)
+
+ assert SCons.SConsign.DataBase == {}, SCons.SConsign.DataBase
+ assert SCons.SConsign.DB_Name is file, SCons.SConsign.DB_Name
+ assert SCons.SConsign.DB_Module is None, SCons.SConsign.DB_Module
+
+ class Fake_DBM(object):
+ def open(self, name, mode):
+ self.name = name
+ self.mode = mode
+ return self
+ def __getitem__(self, key):
+ pass
+ def __setitem__(self, key, value):
+ pass
+
+ fake_dbm = Fake_DBM()
+
+ SCons.SConsign.File(file, fake_dbm)
+
+ assert SCons.SConsign.DataBase == {}, SCons.SConsign.DataBase
+ assert SCons.SConsign.DB_Name is file, SCons.SConsign.DB_Name
+ assert SCons.SConsign.DB_Module is fake_dbm, SCons.SConsign.DB_Module
+ assert not hasattr(fake_dbm, 'name'), fake_dbm
+ assert not hasattr(fake_dbm, 'mode'), fake_dbm
+
+ SCons.SConsign.ForDirectory(DummyNode(test.workpath('dir')))
+
+ assert not SCons.SConsign.DataBase is None, SCons.SConsign.DataBase
+ assert fake_dbm.name == file, fake_dbm.name
+ assert fake_dbm.mode == "c", fake_dbm.mode
+
+
+class writeTestCase(SConsignTestCase):
+
+ def test_write(self):
+
+ test = self.test
+ file = test.workpath('sconsign_file')
+
+ class Fake_DBM(object):
+ def __getitem__(self, key):
+ return None
+ def __setitem__(self, key, value):
+ pass
+ def open(self, name, mode):
+ self.sync_count = 0
+ return self
+ def sync(self):
+ self.sync_count = self.sync_count + 1
+
+ fake_dbm = Fake_DBM()
+
+ SCons.SConsign.DataBase = {}
+ SCons.SConsign.File(file, fake_dbm)
+
+ f = SCons.SConsign.DB(DummyNode())
+
+ bi_foo = DummySConsignEntry('foo')
+ bi_bar = DummySConsignEntry('bar')
+ f.set_entry('foo', bi_foo)
+ f.set_entry('bar', bi_bar)
+
+ SCons.SConsign.write()
+
+ assert bi_foo.c_to_s, bi_foo.c_to_s
+ assert bi_bar.c_to_s, bi_bar.c_to_s
+
+ assert fake_dbm.sync_count == 1, fake_dbm.sync_count
+
+
+
+if __name__ == "__main__":
+ suite = unittest.TestSuite()
+ tclasses = [
+ BaseTestCase,
+ SConsignDBTestCase,
+ SConsignDirFileTestCase,
+ SConsignFileTestCase,
+ writeTestCase,
+ ]
+ for tclass in tclasses:
+ names = unittest.getTestCaseNames(tclass, 'test_')
+ suite.addTests(list(map(tclass, names)))
+ TestUnit.run(suite)
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Scanner/C.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Scanner/C.py
new file mode 100644
index 0000000..c2e50a6
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Scanner/C.py
@@ -0,0 +1,131 @@
+"""SCons.Scanner.C
+
+This module implements the dependency scanner for C/C++ code.
+
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import SCons.Node.FS
+import SCons.Scanner
+import SCons.Util
+
+import SCons.cpp
+
+class SConsCPPScanner(SCons.cpp.PreProcessor):
+ """
+ SCons-specific subclass of the cpp.py module's processing.
+
+ We subclass this so that: 1) we can deal with files represented
+ by Nodes, not strings; 2) we can keep track of the files that are
+ missing.
+ """
+ def __init__(self, *args, **kw):
+ SCons.cpp.PreProcessor.__init__(self, *args, **kw)
+ self.missing = []
+ def initialize_result(self, fname):
+ self.result = SCons.Util.UniqueList([fname])
+ def finalize_result(self, fname):
+ return self.result[1:]
+ def find_include_file(self, t):
+ keyword, quote, fname = t
+ result = SCons.Node.FS.find_file(fname, self.searchpath[quote])
+ if not result:
+ self.missing.append((fname, self.current_file))
+ return result
+ def read_file(self, file):
+ try:
+ with open(str(file.rfile())) as fp:
+ return fp.read()
+ except EnvironmentError as e:
+ self.missing.append((file, self.current_file))
+ return ''
+
+def dictify_CPPDEFINES(env):
+ cppdefines = env.get('CPPDEFINES', {})
+ if cppdefines is None:
+ return {}
+ if SCons.Util.is_Sequence(cppdefines):
+ result = {}
+ for c in cppdefines:
+ if SCons.Util.is_Sequence(c):
+ result[c[0]] = c[1]
+ else:
+ result[c] = None
+ return result
+ if not SCons.Util.is_Dict(cppdefines):
+ return {cppdefines : None}
+ return cppdefines
+
+class SConsCPPScannerWrapper(object):
+ """
+ The SCons wrapper around a cpp.py scanner.
+
+ This is the actual glue between the calling conventions of generic
+ SCons scanners, and the (subclass of) cpp.py class that knows how
+ to look for #include lines with reasonably real C-preprocessor-like
+ evaluation of #if/#ifdef/#else/#elif lines.
+ """
+ def __init__(self, name, variable):
+ self.name = name
+ self.path = SCons.Scanner.FindPathDirs(variable)
+ def __call__(self, node, env, path = ()):
+ cpp = SConsCPPScanner(current = node.get_dir(),
+ cpppath = path,
+ dict = dictify_CPPDEFINES(env))
+ result = cpp(node)
+ for included, includer in cpp.missing:
+ fmt = "No dependency generated for file: %s (included from: %s) -- file not found"
+ SCons.Warnings.warn(SCons.Warnings.DependencyWarning,
+ fmt % (included, includer))
+ return result
+
+ def recurse_nodes(self, nodes):
+ return nodes
+ def select(self, node):
+ return self
+
+def CScanner():
+ """Return a prototype Scanner instance for scanning source files
+ that use the C pre-processor"""
+
+ # Here's how we would (or might) use the CPP scanner code above that
+ # knows how to evaluate #if/#ifdef/#else/#elif lines when searching
+ # for #includes. This is commented out for now until we add the
+ # right configurability to let users pick between the scanners.
+ #return SConsCPPScannerWrapper("CScanner", "CPPPATH")
+
+ cs = SCons.Scanner.ClassicCPP("CScanner",
+ "$CPPSUFFIXES",
+ "CPPPATH",
+ '^[ \t]*#[ \t]*(?:include|import)[ \t]*(<|")([^>"]+)(>|")')
+ return cs
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Scanner/CTests.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Scanner/CTests.py
new file mode 100644
index 0000000..9c7df12
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Scanner/CTests.py
@@ -0,0 +1,469 @@
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import SCons.compat
+
+import collections
+import os
+import sys
+import unittest
+
+import TestCmd
+import TestUnit
+
+import SCons.Node.FS
+import SCons.Warnings
+
+import SCons.Scanner.C
+
+test = TestCmd.TestCmd(workdir = '')
+
+os.chdir(test.workpath(''))
+
+# create some source files and headers:
+
+test.write('f1.cpp',"""
+#include \"f1.h\"
+#include <f2.h>
+
+int main()
+{
+ return 0;
+}
+""")
+
+test.write('f2.cpp',"""
+#include \"d1/f1.h\"
+#include <d2/f1.h>
+#include \"f1.h\"
+#import <f4.h>
+
+int main()
+{
+ return 0;
+}
+""")
+
+test.write('f3.cpp',"""
+#include \t "f1.h"
+ \t #include "f2.h"
+# \t include "f3-test.h"
+
+#include \t <d1/f1.h>
+ \t #include <d1/f2.h>
+# \t include <d1/f3-test.h>
+
+// #include "never.h"
+
+const char* x = "#include <never.h>"
+
+int main()
+{
+ return 0;
+}
+""")
+
+
+# for Emacs -> "
+
+test.subdir('d1', ['d1', 'd2'])
+
+headers = ['f1.h','f2.h', 'f3-test.h', 'fi.h', 'fj.h', 'never.h',
+ 'd1/f1.h', 'd1/f2.h', 'd1/f3-test.h', 'd1/fi.h', 'd1/fj.h',
+ 'd1/d2/f1.h', 'd1/d2/f2.h', 'd1/d2/f3-test.h',
+ 'd1/d2/f4.h', 'd1/d2/fi.h', 'd1/d2/fj.h']
+
+for h in headers:
+ test.write(h, " ")
+
+test.write('f2.h',"""
+#include "fi.h"
+""")
+
+test.write('f3-test.h',"""
+#include <fj.h>
+""")
+
+
+test.subdir('include', 'subdir', ['subdir', 'include'])
+
+test.write('fa.cpp',"""
+#include \"fa.h\"
+#include <fb.h>
+
+int main()
+{
+ return 0;
+}
+""")
+
+test.write(['include', 'fa.h'], "\n")
+test.write(['include', 'fb.h'], "\n")
+test.write(['subdir', 'include', 'fa.h'], "\n")
+test.write(['subdir', 'include', 'fb.h'], "\n")
+
+
+test.subdir('repository', ['repository', 'include'],
+ ['repository', 'src' ])
+test.subdir('work', ['work', 'src'])
+
+test.write(['repository', 'include', 'iii.h'], "\n")
+
+test.write(['work', 'src', 'fff.c'], """
+#include <iii.h>
+#include <jjj.h>
+
+int main()
+{
+ return 0;
+}
+""")
+
+test.write([ 'work', 'src', 'aaa.c'], """
+#include "bbb.h"
+
+int main()
+{
+ return 0;
+}
+""")
+
+test.write([ 'work', 'src', 'bbb.h'], "\n")
+
+test.write([ 'repository', 'src', 'ccc.c'], """
+#include "ddd.h"
+
+int main()
+{
+ return 0;
+}
+""")
+
+test.write([ 'repository', 'src', 'ddd.h'], "\n")
+
+test.write('f5.c', """\
+#include\"f5a.h\"
+#include<f5b.h>
+""")
+
+test.write("f5a.h", "\n")
+test.write("f5b.h", "\n")
+
+# define some helpers:
+
+class DummyEnvironment(collections.UserDict):
+ def __init__(self, **kw):
+ collections.UserDict.__init__(self)
+ self.data.update(kw)
+ self.fs = SCons.Node.FS.FS(test.workpath(''))
+
+ def Dictionary(self, *args):
+ return self.data
+
+ def subst(self, strSubst, target=None, source=None, conv=None):
+ if strSubst[0] == '$':
+ return self.data[strSubst[1:]]
+ return strSubst
+
+ def subst_list(self, strSubst, target=None, source=None, conv=None):
+ if strSubst[0] == '$':
+ return [self.data[strSubst[1:]]]
+ return [[strSubst]]
+
+ def subst_path(self, path, target=None, source=None, conv=None):
+ if not isinstance(path, list):
+ path = [path]
+ return list(map(self.subst, path))
+
+ def get_calculator(self):
+ return None
+
+ def get_factory(self, factory):
+ return factory or self.fs.File
+
+ def Dir(self, filename):
+ return self.fs.Dir(filename)
+
+ def File(self, filename):
+ return self.fs.File(filename)
+
+if os.path.normcase('foo') == os.path.normcase('FOO'):
+ my_normpath = os.path.normcase
+else:
+ my_normpath = os.path.normpath
+
+def deps_match(self, deps, headers):
+ global my_normpath
+ scanned = list(map(my_normpath, list(map(str, deps))))
+ expect = list(map(my_normpath, headers))
+ self.failUnless(scanned == expect, "expect %s != scanned %s" % (expect, scanned))
+
+# define some tests:
+
+class CScannerTestCase1(unittest.TestCase):
+ def runTest(self):
+ """Find local files with no CPPPATH"""
+ env = DummyEnvironment(CPPPATH=[])
+ s = SCons.Scanner.C.CScanner()
+ path = s.path(env)
+ deps = s(env.File('f1.cpp'), env, path)
+ headers = ['f1.h', 'f2.h']
+ deps_match(self, deps, headers)
+
+class CScannerTestCase2(unittest.TestCase):
+ def runTest(self):
+ """Find a file in a CPPPATH directory"""
+ env = DummyEnvironment(CPPPATH=[test.workpath("d1")])
+ s = SCons.Scanner.C.CScanner()
+ path = s.path(env)
+ deps = s(env.File('f1.cpp'), env, path)
+ headers = ['f1.h', 'd1/f2.h']
+ deps_match(self, deps, headers)
+
+class CScannerTestCase3(unittest.TestCase):
+ def runTest(self):
+ """Find files in explicit subdirectories, ignore missing file"""
+ env = DummyEnvironment(CPPPATH=[test.workpath("d1")])
+ s = SCons.Scanner.C.CScanner()
+ path = s.path(env)
+ deps = s(env.File('f2.cpp'), env, path)
+ headers = ['d1/f1.h', 'f1.h', 'd1/d2/f1.h']
+ deps_match(self, deps, headers)
+
+class CScannerTestCase4(unittest.TestCase):
+ def runTest(self):
+ """Find files in explicit subdirectories"""
+ env = DummyEnvironment(CPPPATH=[test.workpath("d1"), test.workpath("d1/d2")])
+ s = SCons.Scanner.C.CScanner()
+ path = s.path(env)
+ deps = s(env.File('f2.cpp'), env, path)
+ headers = ['d1/f1.h', 'f1.h', 'd1/d2/f1.h', 'd1/d2/f4.h']
+ deps_match(self, deps, headers)
+
+class CScannerTestCase5(unittest.TestCase):
+ def runTest(self):
+ """Make sure files in repositories will get scanned"""
+ env = DummyEnvironment(CPPPATH=[])
+ s = SCons.Scanner.C.CScanner()
+ path = s.path(env)
+
+ n = env.File('f3.cpp')
+ def my_rexists(s):
+ s.Tag('rexists_called', 1)
+ return SCons.Node._rexists_map[s.GetTag('old_rexists')](s)
+ n.Tag('old_rexists', n._func_rexists)
+ SCons.Node._rexists_map[3] = my_rexists
+ n._func_rexists = 3
+
+ deps = s(n, env, path)
+
+ # Make sure rexists() got called on the file node being
+ # scanned, essential for cooperation with VariantDir functionality.
+ assert n.GetTag('rexists_called')
+
+ headers = ['f1.h', 'f2.h', 'f3-test.h',
+ 'd1/f1.h', 'd1/f2.h', 'd1/f3-test.h']
+ deps_match(self, deps, headers)
+
+class CScannerTestCase6(unittest.TestCase):
+ def runTest(self):
+ """Find a same-named file in different directories when CPPPATH changes"""
+ env1 = DummyEnvironment(CPPPATH=[test.workpath("d1")])
+ env2 = DummyEnvironment(CPPPATH=[test.workpath("d1/d2")])
+ s = SCons.Scanner.C.CScanner()
+ path1 = s.path(env1)
+ path2 = s.path(env2)
+ deps1 = s(env1.File('f1.cpp'), env1, path1)
+ deps2 = s(env2.File('f1.cpp'), env2, path2)
+ headers1 = ['f1.h', 'd1/f2.h']
+ headers2 = ['f1.h', 'd1/d2/f2.h']
+ deps_match(self, deps1, headers1)
+ deps_match(self, deps2, headers2)
+
+class CScannerTestCase8(unittest.TestCase):
+ def runTest(self):
+ """Find files in a subdirectory relative to the current directory"""
+ env = DummyEnvironment(CPPPATH=["include"])
+ s = SCons.Scanner.C.CScanner()
+ path = s.path(env)
+ deps1 = s(env.File('fa.cpp'), env, path)
+ env.fs.chdir(env.Dir('subdir'))
+ dir = env.fs.getcwd()
+ env.fs.chdir(env.Dir(''))
+ path = s.path(env, dir)
+ deps2 = s(env.File('#fa.cpp'), env, path)
+ headers1 = list(map(test.workpath, ['include/fa.h', 'include/fb.h']))
+ headers2 = ['include/fa.h', 'include/fb.h']
+ deps_match(self, deps1, headers1)
+ deps_match(self, deps2, headers2)
+
+class CScannerTestCase9(unittest.TestCase):
+ def runTest(self):
+ """Generate a warning when we can't find a #included file"""
+ SCons.Warnings.enableWarningClass(SCons.Warnings.DependencyWarning)
+ class TestOut(object):
+ def __call__(self, x):
+ self.out = x
+
+ to = TestOut()
+ to.out = None
+ SCons.Warnings._warningOut = to
+ test.write('fa.h','\n')
+ fs = SCons.Node.FS.FS(test.workpath(''))
+ env = DummyEnvironment(CPPPATH=[])
+ env.fs = fs
+ s = SCons.Scanner.C.CScanner()
+ path = s.path(env)
+ deps = s(fs.File('fa.cpp'), env, path)
+
+ # Did we catch the warning associated with not finding fb.h?
+ assert to.out
+
+ deps_match(self, deps, [ 'fa.h' ])
+ test.unlink('fa.h')
+
+class CScannerTestCase10(unittest.TestCase):
+ def runTest(self):
+ """Find files in the local directory when the scanned file is elsewhere"""
+ fs = SCons.Node.FS.FS(test.workpath(''))
+ fs.chdir(fs.Dir('include'))
+ env = DummyEnvironment(CPPPATH=[])
+ env.fs = fs
+ s = SCons.Scanner.C.CScanner()
+ path = s.path(env)
+ test.write('include/fa.cpp', test.read('fa.cpp'))
+ fs.chdir(fs.Dir('..'))
+ deps = s(fs.File('#include/fa.cpp'), env, path)
+ deps_match(self, deps, [ 'include/fa.h', 'include/fb.h' ])
+ test.unlink('include/fa.cpp')
+
+class CScannerTestCase11(unittest.TestCase):
+ def runTest(self):
+ """Handle dependencies on a derived .h file in a non-existent directory"""
+ os.chdir(test.workpath('work'))
+ fs = SCons.Node.FS.FS(test.workpath('work'))
+ fs.Repository(test.workpath('repository'))
+
+ # Create a derived file in a directory that does not exist yet.
+ # This was a bug at one time.
+ f1=fs.File('include2/jjj.h')
+ f1.builder=1
+ env = DummyEnvironment(CPPPATH=['include', 'include2'])
+ env.fs = fs
+ s = SCons.Scanner.C.CScanner()
+ path = s.path(env)
+ deps = s(fs.File('src/fff.c'), env, path)
+ deps_match(self, deps, [ test.workpath('repository/include/iii.h'),
+ 'include2/jjj.h' ])
+ os.chdir(test.workpath(''))
+
+class CScannerTestCase12(unittest.TestCase):
+ def runTest(self):
+ """Find files in VariantDir() directories"""
+ os.chdir(test.workpath('work'))
+ fs = SCons.Node.FS.FS(test.workpath('work'))
+ fs.VariantDir('build1', 'src', 1)
+ fs.VariantDir('build2', 'src', 0)
+ fs.Repository(test.workpath('repository'))
+ env = DummyEnvironment(CPPPATH=[])
+ env.fs = fs
+ s = SCons.Scanner.C.CScanner()
+ path = s.path(env)
+ deps1 = s(fs.File('build1/aaa.c'), env, path)
+ deps_match(self, deps1, [ 'build1/bbb.h' ])
+ deps2 = s(fs.File('build2/aaa.c'), env, path)
+ deps_match(self, deps2, [ 'src/bbb.h' ])
+ deps3 = s(fs.File('build1/ccc.c'), env, path)
+ deps_match(self, deps3, [ 'build1/ddd.h' ])
+ deps4 = s(fs.File('build2/ccc.c'), env, path)
+ deps_match(self, deps4, [ test.workpath('repository/src/ddd.h') ])
+ os.chdir(test.workpath(''))
+
+class CScannerTestCase13(unittest.TestCase):
+ def runTest(self):
+ """Find files in directories named in a substituted environment variable"""
+ class SubstEnvironment(DummyEnvironment):
+ def subst(self, arg, target=None, source=None, conv=None, test=test):
+ if arg == "$blah":
+ return test.workpath("d1")
+ else:
+ return arg
+ env = SubstEnvironment(CPPPATH=["$blah"])
+ s = SCons.Scanner.C.CScanner()
+ path = s.path(env)
+ deps = s(env.File('f1.cpp'), env, path)
+ headers = ['f1.h', 'd1/f2.h']
+ deps_match(self, deps, headers)
+
+class CScannerTestCase14(unittest.TestCase):
+ def runTest(self):
+ """Find files when there's no space between "#include" and the name"""
+ env = DummyEnvironment(CPPPATH=[])
+ s = SCons.Scanner.C.CScanner()
+ path = s.path(env)
+ deps = s(env.File('f5.c'), env, path)
+ headers = ['f5a.h', 'f5b.h']
+ deps_match(self, deps, headers)
+
+class CScannerTestCase15(unittest.TestCase):
+ def runTest(self):
+ """Verify scanner initialization with the suffixes in $CPPSUFFIXES"""
+ suffixes = [".c", ".C", ".cxx", ".cpp", ".c++", ".cc",
+ ".h", ".H", ".hxx", ".hpp", ".hh",
+ ".F", ".fpp", ".FPP",
+ ".S", ".spp", ".SPP"]
+ env = DummyEnvironment(CPPSUFFIXES = suffixes)
+ s = SCons.Scanner.C.CScanner()
+ for suffix in suffixes:
+ assert suffix in s.get_skeys(env), "%s not in skeys" % suffix
+
+
+
+def suite():
+ suite = unittest.TestSuite()
+ suite.addTest(CScannerTestCase1())
+ suite.addTest(CScannerTestCase2())
+ suite.addTest(CScannerTestCase3())
+ suite.addTest(CScannerTestCase4())
+ suite.addTest(CScannerTestCase5())
+ suite.addTest(CScannerTestCase6())
+ suite.addTest(CScannerTestCase8())
+ suite.addTest(CScannerTestCase9())
+ suite.addTest(CScannerTestCase10())
+ suite.addTest(CScannerTestCase11())
+ suite.addTest(CScannerTestCase12())
+ suite.addTest(CScannerTestCase13())
+ suite.addTest(CScannerTestCase14())
+ suite.addTest(CScannerTestCase15())
+ return suite
+
+if __name__ == "__main__":
+ TestUnit.run(suite())
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Scanner/D.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Scanner/D.py
new file mode 100644
index 0000000..95496d5
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Scanner/D.py
@@ -0,0 +1,73 @@
+"""SCons.Scanner.D
+
+Scanner for the Digital Mars "D" programming language.
+
+Coded by Andy Friesen
+17 Nov 2003
+
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import SCons.Scanner
+
+def DScanner():
+ """Return a prototype Scanner instance for scanning D source files"""
+ ds = D()
+ return ds
+
+class D(SCons.Scanner.Classic):
+ def __init__ (self):
+ SCons.Scanner.Classic.__init__ (
+ self,
+ name = "DScanner",
+ suffixes = '$DSUFFIXES',
+ path_variable = 'DPATH',
+ regex = '(?:import\s+)([\w\s=,.]+)(?:\s*:[\s\w,=]+)?(?:;)'
+ )
+
+ def find_include(self, include, source_dir, path):
+ # translate dots (package separators) to slashes
+ inc = include.replace('.', '/')
+
+ i = SCons.Node.FS.find_file(inc + '.d', (source_dir,) + path)
+ if i is None:
+ i = SCons.Node.FS.find_file (inc + '.di', (source_dir,) + path)
+ return i, include
+
+ def find_include_names(self, node):
+ includes = []
+ for iii in self.cre.findall(node.get_text_contents()):
+ for jjj in iii.split(','):
+ kkk = jjj.split('=')[-1]
+ includes.append(kkk.strip())
+ return includes
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Scanner/DTests.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Scanner/DTests.py
new file mode 100644
index 0000000..51e527a
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Scanner/DTests.py
@@ -0,0 +1,282 @@
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import unittest
+
+import TestCmd
+import TestUnit
+
+import SCons.Scanner.D
+
+test = TestCmd.TestCmd(workdir = '')
+
+import collections
+import os
+
+class DummyEnvironment(collections.UserDict):
+ def __init__(self, **kw):
+ collections.UserDict.__init__(self)
+ self.data.update(kw)
+ self.fs = SCons.Node.FS.FS(test.workpath(''))
+
+ def Dictionary(self, *args):
+ return self.data
+
+ def subst(self, strSubst, target=None, source=None, conv=None):
+ if strSubst[0] == '$':
+ return self.data[strSubst[1:]]
+ return strSubst
+
+ def subst_list(self, strSubst, target=None, source=None, conv=None):
+ if strSubst[0] == '$':
+ return [self.data[strSubst[1:]]]
+ return [[strSubst]]
+
+ def subst_path(self, path, target=None, source=None, conv=None):
+ if not isinstance(path, list):
+ path = [path]
+ return list(map(self.subst, path))
+
+ def get_calculator(self):
+ return None
+
+ def get_factory(self, factory):
+ return factory or self.fs.File
+
+ def Dir(self, filename):
+ return self.fs.Dir(filename)
+
+ def File(self, filename):
+ return self.fs.File(filename)
+
+if os.path.normcase('foo') == os.path.normcase('FOO'):
+ my_normpath = os.path.normcase
+else:
+ my_normpath = os.path.normpath
+
+def deps_match(self, deps, headers):
+ global my_normpath
+ scanned = list(map(my_normpath, list(map(str, deps))))
+ expect = list(map(my_normpath, headers))
+ self.failUnless(scanned == expect, "expect %s != scanned %s" % (expect, scanned))
+
+"""
+Examples from https://dlang.org/spec/module.html
+
+D Language: 2.071.1
+Accessed: 11 August 2016
+"""
+
+# Regular import
+test.write('basic.d',"""
+import A;
+
+void main() {}
+""")
+
+# Static import
+test.write('static.d',"""
+static import A;
+
+void main()
+{
+ std.stdio.writeln("hello!"); // ok, writeln is fully qualified
+}
+""")
+
+# Public import
+test.write('public.d',"""
+public import A;
+
+void main() {}
+""")
+
+# Renamed import
+test.write('rename.d',"""
+import B = A;
+
+void main()
+{
+ io.writeln("hello!"); // ok, calls std.stdio.writeln
+}
+""")
+
+# Selective import
+test.write('selective.d',"""
+import A : B, C;
+
+void main()
+{
+ writeln("hello!"); // ok, writeln bound into current namespace
+ foo("world"); // ok, calls std.stdio.write()
+}
+""")
+
+# Renamed and Selective import
+test.write('renameAndSelective.d',"""
+import B = A : C = D;
+
+void main()
+{
+}
+""")
+
+# Scoped import
+test.write('scoped.d',"""
+void main()
+{
+ import A;
+}
+""")
+
+# Combinatorial import
+test.write('combinatorial.d',"""
+import A, B, CCC = C, DDD = D : EEE = FFF;
+
+void main()
+{
+}
+""")
+
+# Subdirs import
+test.write('subdirs.d',"""
+import X.Y, X.Z, X.X.X;
+
+void main() {}
+""")
+
+# Multiple import
+test.write('multiple.d',"""
+public import B;
+static import C;
+
+import X = X.Y : Q, R, S, T = U;
+void main()
+{
+ import A;
+}
+""")
+
+# Multiline import
+test.write('multiline.d',"""
+import
+A;
+
+void main() {}
+""")
+
+test.write('A.d',"""
+module A;
+void main() {}
+""")
+
+test.write('B.d',"""
+module B;
+void main() {}
+""")
+
+test.write('C.d',"""
+module C;
+void main() {}
+""")
+
+test.write('D.d',"""
+module D;
+void main() {}
+""")
+
+test.subdir('X', os.path.join('X','X'))
+
+test.write(os.path.join('X','Y.d'),"""
+module Y;
+void main() {}
+""")
+
+test.write(os.path.join('X','Z.d'),"""
+module Z;
+void main() {}
+""")
+
+test.write(os.path.join('X','X','X.d'),"""
+module X;
+void main() {}
+""")
+
+class DScannerTestCase(unittest.TestCase):
+ def helper(self, filename, headers):
+ env = DummyEnvironment()
+ s = SCons.Scanner.D.DScanner()
+ path = s.path(env)
+ deps = s(env.File(filename), env, path)
+ deps_match(self, deps, headers)
+
+ def test_BasicImport(self):
+ self.helper('basic.d', ['A.d'])
+
+ def test_StaticImport(self):
+ self.helper('static.d', ['A.d'])
+
+ def test_publicImport(self):
+ self.helper('public.d', ['A.d'])
+
+ def test_RenameImport(self):
+ self.helper('rename.d', ['A.d'])
+
+ def test_SelectiveImport(self):
+ self.helper('selective.d', ['A.d'])
+
+ def test_RenameAndSelectiveImport(self):
+ self.helper('renameAndSelective.d', ['A.d'])
+
+ def test_ScopedImport(self):
+ self.helper('scoped.d', ['A.d'])
+
+ def test_CombinatorialImport(self):
+ self.helper('combinatorial.d', ['A.d', 'B.d', 'C.d', 'D.d'])
+
+ def test_SubdirsImport(self):
+ self.helper('subdirs.d', [os.path.join('X','X','X.d'), os.path.join('X','Y.d'), os.path.join('X','Z.d')])
+
+ def test_MultipleImport(self):
+ self.helper('multiple.d', ['A.d', 'B.d', 'C.d', os.path.join('X','Y.d')])
+
+ def test_MultilineImport(self):
+ self.helper('multiline.d', ['A.d'])
+
+if __name__ == "__main__":
+ suite = unittest.TestSuite()
+ tclasses = [
+ DScannerTestCase,
+ ]
+ for tclass in tclasses:
+ names = unittest.getTestCaseNames(tclass, 'test_')
+ suite.addTests(list(map(tclass, names)))
+ TestUnit.run(suite)
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Scanner/Dir.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Scanner/Dir.py
new file mode 100644
index 0000000..3b33fe5
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Scanner/Dir.py
@@ -0,0 +1,109 @@
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import SCons.Node.FS
+import SCons.Scanner
+
+def only_dirs(nodes):
+ is_Dir = lambda n: isinstance(n.disambiguate(), SCons.Node.FS.Dir)
+ return [node for node in nodes if is_Dir(node)]
+
+def DirScanner(**kw):
+ """Return a prototype Scanner instance for scanning
+ directories for on-disk files"""
+ kw['node_factory'] = SCons.Node.FS.Entry
+ kw['recursive'] = only_dirs
+ return SCons.Scanner.Base(scan_on_disk, "DirScanner", **kw)
+
+def DirEntryScanner(**kw):
+ """Return a prototype Scanner instance for "scanning"
+ directory Nodes for their in-memory entries"""
+ kw['node_factory'] = SCons.Node.FS.Entry
+ kw['recursive'] = None
+ return SCons.Scanner.Base(scan_in_memory, "DirEntryScanner", **kw)
+
+skip_entry = {}
+
+skip_entry_list = [
+ '.',
+ '..',
+ '.sconsign',
+ # Used by the native dblite.py module.
+ '.sconsign.dblite',
+ # Used by dbm and dumbdbm.
+ '.sconsign.dir',
+ # Used by dbm.
+ '.sconsign.pag',
+ # Used by dumbdbm.
+ '.sconsign.dat',
+ '.sconsign.bak',
+ # Used by some dbm emulations using Berkeley DB.
+ '.sconsign.db',
+]
+
+for skip in skip_entry_list:
+ skip_entry[skip] = 1
+ skip_entry[SCons.Node.FS._my_normcase(skip)] = 1
+
+do_not_scan = lambda k: k not in skip_entry
+
+def scan_on_disk(node, env, path=()):
+ """
+ Scans a directory for on-disk files and directories therein.
+
+ Looking up the entries will add these to the in-memory Node tree
+ representation of the file system, so all we have to do is just
+ that and then call the in-memory scanning function.
+ """
+ try:
+ flist = node.fs.listdir(node.get_abspath())
+ except (IOError, OSError):
+ return []
+ e = node.Entry
+ for f in filter(do_not_scan, flist):
+ # Add ./ to the beginning of the file name so if it begins with a
+ # '#' we don't look it up relative to the top-level directory.
+ e('./' + f)
+ return scan_in_memory(node, env, path)
+
+def scan_in_memory(node, env, path=()):
+ """
+ "Scans" a Node.FS.Dir for its in-memory entries.
+ """
+ try:
+ entries = node.entries
+ except AttributeError:
+ # It's not a Node.FS.Dir (or doesn't look enough like one for
+ # our purposes), which can happen if a target list containing
+ # mixed Node types (Dirs and Files, for example) has a Dir as
+ # the first entry.
+ return []
+ entry_list = sorted(filter(do_not_scan, list(entries.keys())))
+ return [entries[n] for n in entry_list]
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Scanner/DirTests.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Scanner/DirTests.py
new file mode 100644
index 0000000..9701921
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Scanner/DirTests.py
@@ -0,0 +1,137 @@
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import os.path
+import sys
+import unittest
+
+import TestCmd
+import TestUnit
+
+import SCons.Node.FS
+import SCons.Scanner.Dir
+
+#class DummyNode:
+# def __init__(self, name, fs):
+# self.name = name
+# self.abspath = test.workpath(name)
+# self.fs = fs
+# def __str__(self):
+# return self.name
+# def Entry(self, name):
+# return self.fs.Entry(name)
+
+class DummyEnvironment(object):
+ def __init__(self, root):
+ self.fs = SCons.Node.FS.FS(root)
+ def Dir(self, name):
+ return self.fs.Dir(name)
+ def Entry(self, name):
+ return self.fs.Entry(name)
+ def File(self, name):
+ return self.fs.File(name)
+ def get_factory(self, factory):
+ return factory or self.fs.Entry
+
+class DirScannerTestBase(unittest.TestCase):
+ def setUp(self):
+ self.test = TestCmd.TestCmd(workdir = '')
+
+ self.test.subdir('dir', ['dir', 'sub'])
+
+ self.test.write(['dir', 'f1'], "dir/f1\n")
+ self.test.write(['dir', 'f2'], "dir/f2\n")
+ self.test.write(['dir', '.sconsign'], "dir/.sconsign\n")
+ self.test.write(['dir', '.sconsign.bak'], "dir/.sconsign.bak\n")
+ self.test.write(['dir', '.sconsign.dat'], "dir/.sconsign.dat\n")
+ self.test.write(['dir', '.sconsign.db'], "dir/.sconsign.db\n")
+ self.test.write(['dir', '.sconsign.dblite'], "dir/.sconsign.dblite\n")
+ self.test.write(['dir', '.sconsign.dir'], "dir/.sconsign.dir\n")
+ self.test.write(['dir', '.sconsign.pag'], "dir/.sconsign.pag\n")
+ self.test.write(['dir', 'sub', 'f3'], "dir/sub/f3\n")
+ self.test.write(['dir', 'sub', 'f4'], "dir/sub/f4\n")
+ self.test.write(['dir', 'sub', '.sconsign'], "dir/.sconsign\n")
+ self.test.write(['dir', 'sub', '.sconsign.bak'], "dir/.sconsign.bak\n")
+ self.test.write(['dir', 'sub', '.sconsign.dat'], "dir/.sconsign.dat\n")
+ self.test.write(['dir', 'sub', '.sconsign.dblite'], "dir/.sconsign.dblite\n")
+ self.test.write(['dir', 'sub', '.sconsign.dir'], "dir/.sconsign.dir\n")
+ self.test.write(['dir', 'sub', '.sconsign.pag'], "dir/.sconsign.pag\n")
+
+class DirScannerTestCase(DirScannerTestBase):
+ def runTest(self):
+ env = DummyEnvironment(self.test.workpath())
+
+ s = SCons.Scanner.Dir.DirScanner()
+
+ expect = [
+ os.path.join('dir', 'f1'),
+ os.path.join('dir', 'f2'),
+ os.path.join('dir', 'sub'),
+ ]
+ deps = s(env.Dir('dir'), env, ())
+ sss = list(map(str, deps))
+ assert sss == expect, sss
+
+ expect = [
+ os.path.join('dir', 'sub', 'f3'),
+ os.path.join('dir', 'sub', 'f4'),
+ ]
+ deps = s(env.Dir('dir/sub'), env, ())
+ sss = list(map(str, deps))
+ assert sss == expect, sss
+
+class DirEntryScannerTestCase(DirScannerTestBase):
+ def runTest(self):
+ env = DummyEnvironment(self.test.workpath())
+
+ s = SCons.Scanner.Dir.DirEntryScanner()
+
+ deps = s(env.Dir('dir'), env, ())
+ sss = list(map(str, deps))
+ assert sss == [], sss
+
+ deps = s(env.Dir('dir/sub'), env, ())
+ sss = list(map(str, deps))
+ assert sss == [], sss
+
+ # Make sure we don't blow up if handed a non-Dir node.
+ deps = s(env.File('dir/f1'), env, ())
+ sss = list(map(str, deps))
+ assert sss == [], sss
+
+def suite():
+ suite = unittest.TestSuite()
+ suite.addTest(DirScannerTestCase())
+ suite.addTest(DirEntryScannerTestCase())
+ return suite
+
+if __name__ == "__main__":
+ TestUnit.run(suite())
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Scanner/Fortran.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Scanner/Fortran.py
new file mode 100644
index 0000000..1b55130
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Scanner/Fortran.py
@@ -0,0 +1,316 @@
+"""SCons.Scanner.Fortran
+
+This module implements the dependency scanner for Fortran code.
+
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import re
+
+import SCons.Node
+import SCons.Node.FS
+import SCons.Scanner
+import SCons.Util
+import SCons.Warnings
+
+class F90Scanner(SCons.Scanner.Classic):
+ """
+ A Classic Scanner subclass for Fortran source files which takes
+ into account both USE and INCLUDE statements. This scanner will
+ work for both F77 and F90 (and beyond) compilers.
+
+ Currently, this scanner assumes that the include files do not contain
+ USE statements. To enable the ability to deal with USE statements
+ in include files, add logic right after the module names are found
+ to loop over each include file, search for and locate each USE
+ statement, and append each module name to the list of dependencies.
+ Caching the search results in a common dictionary somewhere so that
+ the same include file is not searched multiple times would be a
+ smart thing to do.
+ """
+
+ def __init__(self, name, suffixes, path_variable,
+ use_regex, incl_regex, def_regex, *args, **kw):
+
+ self.cre_use = re.compile(use_regex, re.M)
+ self.cre_incl = re.compile(incl_regex, re.M)
+ self.cre_def = re.compile(def_regex, re.M)
+
+ def _scan(node, env, path, self=self):
+ node = node.rfile()
+
+ if not node.exists():
+ return []
+
+ return self.scan(node, env, path)
+
+ kw['function'] = _scan
+ kw['path_function'] = SCons.Scanner.FindPathDirs(path_variable)
+ kw['recursive'] = 1
+ kw['skeys'] = suffixes
+ kw['name'] = name
+
+ SCons.Scanner.Current.__init__(self, *args, **kw)
+
+ def scan(self, node, env, path=()):
+
+ # cache the includes list in node so we only scan it once:
+ if node.includes != None:
+ mods_and_includes = node.includes
+ else:
+ # retrieve all included filenames
+ includes = self.cre_incl.findall(node.get_text_contents())
+ # retrieve all USE'd module names
+ modules = self.cre_use.findall(node.get_text_contents())
+ # retrieve all defined module names
+ defmodules = self.cre_def.findall(node.get_text_contents())
+
+ # Remove all USE'd module names that are defined in the same file
+ # (case-insensitively)
+ d = {}
+ for m in defmodules:
+ d[m.lower()] = 1
+ modules = [m for m in modules if m.lower() not in d]
+
+ # Convert module name to a .mod filename
+ suffix = env.subst('$FORTRANMODSUFFIX')
+ modules = [x.lower() + suffix for x in modules]
+ # Remove unique items from the list
+ mods_and_includes = SCons.Util.unique(includes+modules)
+ node.includes = mods_and_includes
+
+ # This is a hand-coded DSU (decorate-sort-undecorate, or
+ # Schwartzian transform) pattern. The sort key is the raw name
+ # of the file as specifed on the USE or INCLUDE line, which lets
+ # us keep the sort order constant regardless of whether the file
+ # is actually found in a Repository or locally.
+ nodes = []
+ source_dir = node.get_dir()
+ if callable(path):
+ path = path()
+ for dep in mods_and_includes:
+ n, i = self.find_include(dep, source_dir, path)
+
+ if n is None:
+ SCons.Warnings.warn(SCons.Warnings.DependencyWarning,
+ "No dependency generated for file: %s (referenced by: %s) -- file not found" % (i, node))
+ else:
+ sortkey = self.sort_key(dep)
+ nodes.append((sortkey, n))
+
+ return [pair[1] for pair in sorted(nodes)]
+
+def FortranScan(path_variable="FORTRANPATH"):
+ """Return a prototype Scanner instance for scanning source files
+ for Fortran USE & INCLUDE statements"""
+
+# The USE statement regex matches the following:
+#
+# USE module_name
+# USE :: module_name
+# USE, INTRINSIC :: module_name
+# USE, NON_INTRINSIC :: module_name
+#
+# Limitations
+#
+# -- While the regex can handle multiple USE statements on one line,
+# it cannot properly handle them if they are commented out.
+# In either of the following cases:
+#
+# ! USE mod_a ; USE mod_b [entire line is commented out]
+# USE mod_a ! ; USE mod_b [in-line comment of second USE statement]
+#
+# the second module name (mod_b) will be picked up as a dependency
+# even though it should be ignored. The only way I can see
+# to rectify this would be to modify the scanner to eliminate
+# the call to re.findall, read in the contents of the file,
+# treating the comment character as an end-of-line character
+# in addition to the normal linefeed, loop over each line,
+# weeding out the comments, and looking for the USE statements.
+# One advantage to this is that the regex passed to the scanner
+# would no longer need to match a semicolon.
+#
+# -- I question whether or not we need to detect dependencies to
+# INTRINSIC modules because these are built-in to the compiler.
+# If we consider them a dependency, will SCons look for them, not
+# find them, and kill the build? Or will we there be standard
+# compiler-specific directories we will need to point to so the
+# compiler and SCons can locate the proper object and mod files?
+
+# Here is a breakdown of the regex:
+#
+# (?i) : regex is case insensitive
+# ^ : start of line
+# (?: : group a collection of regex symbols without saving the match as a "group"
+# ^|; : matches either the start of the line or a semicolon - semicolon
+# ) : end the unsaved grouping
+# \s* : any amount of white space
+# USE : match the string USE, case insensitive
+# (?: : group a collection of regex symbols without saving the match as a "group"
+# \s+| : match one or more whitespace OR .... (the next entire grouped set of regex symbols)
+# (?: : group a collection of regex symbols without saving the match as a "group"
+# (?: : establish another unsaved grouping of regex symbols
+# \s* : any amount of white space
+# , : match a comma
+# \s* : any amount of white space
+# (?:NON_)? : optionally match the prefix NON_, case insensitive
+# INTRINSIC : match the string INTRINSIC, case insensitive
+# )? : optionally match the ", INTRINSIC/NON_INTRINSIC" grouped expression
+# \s* : any amount of white space
+# :: : match a double colon that must appear after the INTRINSIC/NON_INTRINSIC attribute
+# ) : end the unsaved grouping
+# ) : end the unsaved grouping
+# \s* : match any amount of white space
+# (\w+) : match the module name that is being USE'd
+#
+#
+ use_regex = "(?i)(?:^|;)\s*USE(?:\s+|(?:(?:\s*,\s*(?:NON_)?INTRINSIC)?\s*::))\s*(\w+)"
+
+
+# The INCLUDE statement regex matches the following:
+#
+# INCLUDE 'some_Text'
+# INCLUDE "some_Text"
+# INCLUDE "some_Text" ; INCLUDE "some_Text"
+# INCLUDE kind_"some_Text"
+# INCLUDE kind_'some_Text"
+#
+# where some_Text can include any alphanumeric and/or special character
+# as defined by the Fortran 2003 standard.
+#
+# Limitations:
+#
+# -- The Fortran standard dictates that a " or ' in the INCLUDE'd
+# string must be represented as a "" or '', if the quotes that wrap
+# the entire string are either a ' or ", respectively. While the
+# regular expression below can detect the ' or " characters just fine,
+# the scanning logic, presently is unable to detect them and reduce
+# them to a single instance. This probably isn't an issue since,
+# in practice, ' or " are not generally used in filenames.
+#
+# -- This regex will not properly deal with multiple INCLUDE statements
+# when the entire line has been commented out, ala
+#
+# ! INCLUDE 'some_file' ; INCLUDE 'some_file'
+#
+# In such cases, it will properly ignore the first INCLUDE file,
+# but will actually still pick up the second. Interestingly enough,
+# the regex will properly deal with these cases:
+#
+# INCLUDE 'some_file'
+# INCLUDE 'some_file' !; INCLUDE 'some_file'
+#
+# To get around the above limitation, the FORTRAN programmer could
+# simply comment each INCLUDE statement separately, like this
+#
+# ! INCLUDE 'some_file' !; INCLUDE 'some_file'
+#
+# The way I see it, the only way to get around this limitation would
+# be to modify the scanning logic to replace the calls to re.findall
+# with a custom loop that processes each line separately, throwing
+# away fully commented out lines before attempting to match against
+# the INCLUDE syntax.
+#
+# Here is a breakdown of the regex:
+#
+# (?i) : regex is case insensitive
+# (?: : begin a non-saving group that matches the following:
+# ^ : either the start of the line
+# | : or
+# ['">]\s*; : a semicolon that follows a single quote,
+# double quote or greater than symbol (with any
+# amount of whitespace in between). This will
+# allow the regex to match multiple INCLUDE
+# statements per line (although it also requires
+# the positive lookahead assertion that is
+# used below). It will even properly deal with
+# (i.e. ignore) cases in which the additional
+# INCLUDES are part of an in-line comment, ala
+# " INCLUDE 'someFile' ! ; INCLUDE 'someFile2' "
+# ) : end of non-saving group
+# \s* : any amount of white space
+# INCLUDE : match the string INCLUDE, case insensitive
+# \s+ : match one or more white space characters
+# (?\w+_)? : match the optional "kind-param _" prefix allowed by the standard
+# [<"'] : match the include delimiter - an apostrophe, double quote, or less than symbol
+# (.+?) : match one or more characters that make up
+# the included path and file name and save it
+# in a group. The Fortran standard allows for
+# any non-control character to be used. The dot
+# operator will pick up any character, including
+# control codes, but I can't conceive of anyone
+# putting control codes in their file names.
+# The question mark indicates it is non-greedy so
+# that regex will match only up to the next quote,
+# double quote, or greater than symbol
+# (?=["'>]) : positive lookahead assertion to match the include
+# delimiter - an apostrophe, double quote, or
+# greater than symbol. This level of complexity
+# is required so that the include delimiter is
+# not consumed by the match, thus allowing the
+# sub-regex discussed above to uniquely match a
+# set of semicolon-separated INCLUDE statements
+# (as allowed by the F2003 standard)
+
+ include_regex = """(?i)(?:^|['">]\s*;)\s*INCLUDE\s+(?:\w+_)?[<"'](.+?)(?=["'>])"""
+
+# The MODULE statement regex finds module definitions by matching
+# the following:
+#
+# MODULE module_name
+#
+# but *not* the following:
+#
+# MODULE PROCEDURE procedure_name
+#
+# Here is a breakdown of the regex:
+#
+# (?i) : regex is case insensitive
+# ^\s* : any amount of white space
+# MODULE : match the string MODULE, case insensitive
+# \s+ : match one or more white space characters
+# (?!PROCEDURE) : but *don't* match if the next word matches
+# PROCEDURE (negative lookahead assertion),
+# case insensitive
+# (\w+) : match one or more alphanumeric characters
+# that make up the defined module name and
+# save it in a group
+
+ def_regex = """(?i)^\s*MODULE\s+(?!PROCEDURE)(\w+)"""
+
+ scanner = F90Scanner("FortranScan",
+ "$FORTRANSUFFIXES",
+ path_variable,
+ use_regex,
+ include_regex,
+ def_regex)
+ return scanner
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Scanner/FortranTests.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Scanner/FortranTests.py
new file mode 100644
index 0000000..aaefa79
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Scanner/FortranTests.py
@@ -0,0 +1,542 @@
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import os
+import os.path
+import sys
+import unittest
+
+import SCons.Scanner.Fortran
+import SCons.Node.FS
+import SCons.Warnings
+
+import TestCmd
+import TestUnit
+
+original = os.getcwd()
+
+test = TestCmd.TestCmd(workdir = '')
+
+os.chdir(test.workpath(''))
+
+# create some source files and headers:
+
+test.write('fff1.f',"""
+ PROGRAM FOO
+ INCLUDE 'f1.f'
+ include 'f2.f'
+ STOP
+ END
+""")
+
+test.write('fff2.f',"""
+ PROGRAM FOO
+ INCLUDE 'f2.f'
+ include 'd1/f2.f'
+ INCLUDE 'd2/f2.f'
+ STOP
+ END
+""")
+
+test.write('fff3.f',"""
+ PROGRAM FOO
+ INCLUDE 'f3.f' ; INCLUDE\t'd1/f3.f'
+ STOP
+ END
+""")
+
+
+# for Emacs -> "
+
+test.subdir('d1', ['d1', 'd2'])
+
+headers = ['fi.f', 'never.f',
+ 'd1/f1.f', 'd1/f2.f', 'd1/f3.f', 'd1/fi.f',
+ 'd1/d2/f1.f', 'd1/d2/f2.f', 'd1/d2/f3.f',
+ 'd1/d2/f4.f', 'd1/d2/fi.f']
+
+for h in headers:
+ test.write(h, "\n")
+
+
+test.subdir('include', 'subdir', ['subdir', 'include'])
+
+test.write('fff4.f',"""
+ PROGRAM FOO
+ INCLUDE 'f4.f'
+ STOP
+ END
+""")
+
+test.write('include/f4.f', "\n")
+test.write('subdir/include/f4.f', "\n")
+
+test.write('fff5.f',"""
+ PROGRAM FOO
+ INCLUDE 'f5.f'
+ INCLUDE 'not_there.f'
+ STOP
+ END
+""")
+
+test.write('f5.f', "\n")
+
+test.subdir('repository', ['repository', 'include'],
+ [ 'repository', 'src' ])
+test.subdir('work', ['work', 'src'])
+
+test.write(['repository', 'include', 'iii.f'], "\n")
+
+test.write(['work', 'src', 'fff.f'], """
+ PROGRAM FOO
+ INCLUDE 'iii.f'
+ INCLUDE 'jjj.f'
+ STOP
+ END
+""")
+
+test.write([ 'work', 'src', 'aaa.f'], """
+ PROGRAM FOO
+ INCLUDE 'bbb.f'
+ STOP
+ END
+""")
+
+test.write([ 'work', 'src', 'bbb.f'], "\n")
+
+test.write([ 'repository', 'src', 'ccc.f'], """
+ PROGRAM FOO
+ INCLUDE 'ddd.f'
+ STOP
+ END
+""")
+
+test.write([ 'repository', 'src', 'ddd.f'], "\n")
+
+
+test.write('fff90a.f90',"""
+ PROGRAM FOO
+
+! Test comments - these includes should NOT be picked up
+C INCLUDE 'fi.f'
+# INCLUDE 'fi.f'
+ ! INCLUDE 'fi.f'
+
+ INCLUDE 'f1.f' ! in-line comments are valid syntax
+ INCLUDE"fi.f" ! space is significant - this should be ignored
+ INCLUDE <f2.f> ! Absoft compiler allows greater than/less than delimiters
+!
+! Allow kind type parameters
+ INCLUDE kindType_"f3.f"
+ INCLUDE kind_Type_"f4.f"
+!
+! Test multiple statements per line - use various spacings between semicolons
+ incLUDE 'f5.f';include "f6.f" ; include <f7.f>; include 'f8.f' ;include kindType_'f9.f'
+!
+! Test various USE statement syntaxes
+!
+ USE Mod01
+ use mod02
+ use use
+ USE mOD03, ONLY : someVar
+ USE MOD04 ,only:someVar
+ USE Mod05 , ONLY: someVar ! in-line comment
+ USE Mod06,ONLY :someVar,someOtherVar
+
+ USE mod07;USE mod08; USE mod09 ;USE mod10 ; USE mod11 ! Test various semicolon placements
+ use mod12 ;use mod13! Test comment at end of line
+
+! USE modi
+! USE modia ; use modib ! Scanner regexp will only ignore the first - this is a deficiency in the regexp
+ ! USE modic ; ! use modid ! Scanner regexp should ignore both modules
+ USE mod14 !; USE modi ! Only ignore the second
+ USE mod15!;USE modi
+ USE mod16 ! ; USE modi
+
+! Test semicolon syntax - use various spacings
+ USE :: mod17
+ USE::mod18
+ USE ::mod19 ; USE:: mod20
+
+ use, non_intrinsic :: mod21, ONLY : someVar ; use,intrinsic:: mod22
+ USE, NON_INTRINSIC::mod23 ; USE ,INTRINSIC ::mod24
+
+USE mod25 ! Test USE statement at the beginning of line
+
+
+; USE modi ! Scanner should ignore this since it isn't valid syntax
+ USEmodi ! No space in between USE and module name - ignore it
+ USE mod01 ! This one is a duplicate - there should only be one dependency to it.
+
+ STOP
+ END
+""")
+
+modules = ['mod01.mod', 'mod02.mod', 'mod03.mod', 'mod04.mod', 'mod05.mod',
+ 'mod06.mod', 'mod07.mod', 'mod08.mod', 'mod09.mod', 'mod10.mod',
+ 'mod11.mod', 'mod12.mod', 'mod13.mod', 'mod14.mod', 'mod15.mod',
+ 'mod16.mod', 'mod17.mod', 'mod18.mod', 'mod19.mod', 'mod20.mod',
+ 'mod21.mod', 'mod22.mod', 'mod23.mod', 'mod24.mod', 'mod25.mod']
+
+for m in modules:
+ test.write(m, "\n")
+
+test.subdir('modules')
+test.write(['modules', 'use.mod'], "\n")
+
+# define some helpers:
+
+class DummyEnvironment(object):
+ def __init__(self, listCppPath):
+ self.path = listCppPath
+ self.fs = SCons.Node.FS.FS(test.workpath(''))
+
+ def Dictionary(self, *args):
+ if not args:
+ return { 'FORTRANPATH': self.path, 'FORTRANMODSUFFIX' : ".mod" }
+ elif len(args) == 1 and args[0] == 'FORTRANPATH':
+ return self.path
+ else:
+ raise KeyError("Dummy environment only has FORTRANPATH attribute.")
+
+ def has_key(self, key):
+ return key in self.Dictionary()
+
+ def __getitem__(self,key):
+ return self.Dictionary()[key]
+
+ def __setitem__(self,key,value):
+ self.Dictionary()[key] = value
+
+ def __delitem__(self,key):
+ del self.Dictionary()[key]
+
+ def subst(self, arg, target=None, source=None, conv=None):
+ if arg[0] == '$':
+ return self[arg[1:]]
+ return arg
+
+ def subst_path(self, path, target=None, source=None, conv=None):
+ if not isinstance(path, list):
+ path = [path]
+ return list(map(self.subst, path))
+
+ def get_calculator(self):
+ return None
+
+ def get_factory(self, factory):
+ return factory or self.fs.File
+
+ def Dir(self, filename):
+ return self.fs.Dir(filename)
+
+ def File(self, filename):
+ return self.fs.File(filename)
+
+def deps_match(self, deps, headers):
+ scanned = list(map(os.path.normpath, list(map(str, deps))))
+ expect = list(map(os.path.normpath, headers))
+ self.failUnless(scanned == expect, "expect %s != scanned %s" % (expect, scanned))
+
+# define some tests:
+
+class FortranScannerTestCase1(unittest.TestCase):
+ def runTest(self):
+ test.write('f1.f', "\n")
+ test.write('f2.f', " INCLUDE 'fi.f'\n")
+ env = DummyEnvironment([])
+ s = SCons.Scanner.Fortran.FortranScan()
+ path = s.path(env)
+ deps = s(env.File('fff1.f'), env, path)
+ headers = ['f1.f', 'f2.f']
+ deps_match(self, deps, headers)
+ test.unlink('f1.f')
+ test.unlink('f2.f')
+
+class FortranScannerTestCase2(unittest.TestCase):
+ def runTest(self):
+ test.write('f1.f', "\n")
+ test.write('f2.f', " INCLUDE 'fi.f'\n")
+ env = DummyEnvironment([test.workpath("d1")])
+ s = SCons.Scanner.Fortran.FortranScan()
+ path = s.path(env)
+ deps = s(env.File('fff1.f'), env, path)
+ headers = ['f1.f', 'f2.f']
+ deps_match(self, deps, headers)
+ test.unlink('f1.f')
+ test.unlink('f2.f')
+
+class FortranScannerTestCase3(unittest.TestCase):
+ def runTest(self):
+ env = DummyEnvironment([test.workpath("d1")])
+ s = SCons.Scanner.Fortran.FortranScan()
+ path = s.path(env)
+ deps = s(env.File('fff1.f'), env, path)
+ headers = ['d1/f1.f', 'd1/f2.f']
+ deps_match(self, deps, headers)
+
+class FortranScannerTestCase4(unittest.TestCase):
+ def runTest(self):
+ test.write(['d1', 'f2.f'], " INCLUDE 'fi.f'\n")
+ env = DummyEnvironment([test.workpath("d1")])
+ s = SCons.Scanner.Fortran.FortranScan()
+ path = s.path(env)
+ deps = s(env.File('fff1.f'), env, path)
+ headers = ['d1/f1.f', 'd1/f2.f']
+ deps_match(self, deps, headers)
+ test.write(['d1', 'f2.f'], "\n")
+
+class FortranScannerTestCase5(unittest.TestCase):
+ def runTest(self):
+ env = DummyEnvironment([test.workpath("d1")])
+ s = SCons.Scanner.Fortran.FortranScan()
+ path = s.path(env)
+ deps = s(env.File('fff2.f'), env, path)
+ headers = ['d1/f2.f', 'd1/d2/f2.f', 'd1/f2.f']
+ deps_match(self, deps, headers)
+
+class FortranScannerTestCase6(unittest.TestCase):
+ def runTest(self):
+ test.write('f2.f', "\n")
+ env = DummyEnvironment([test.workpath("d1")])
+ s = SCons.Scanner.Fortran.FortranScan()
+ path = s.path(env)
+ deps = s(env.File('fff2.f'), env, path)
+ headers = ['d1/f2.f', 'd1/d2/f2.f', 'f2.f']
+ deps_match(self, deps, headers)
+ test.unlink('f2.f')
+
+class FortranScannerTestCase7(unittest.TestCase):
+ def runTest(self):
+ env = DummyEnvironment([test.workpath("d1/d2"), test.workpath("d1")])
+ s = SCons.Scanner.Fortran.FortranScan()
+ path = s.path(env)
+ deps = s(env.File('fff2.f'), env, path)
+ headers = ['d1/f2.f', 'd1/d2/f2.f', 'd1/d2/f2.f']
+ deps_match(self, deps, headers)
+
+class FortranScannerTestCase8(unittest.TestCase):
+ def runTest(self):
+ test.write('f2.f', "\n")
+ env = DummyEnvironment([test.workpath("d1/d2"), test.workpath("d1")])
+ s = SCons.Scanner.Fortran.FortranScan()
+ path = s.path(env)
+ deps = s(env.File('fff2.f'), env, path)
+ headers = ['d1/f2.f', 'd1/d2/f2.f', 'f2.f']
+ deps_match(self, deps, headers)
+ test.unlink('f2.f')
+
+class FortranScannerTestCase9(unittest.TestCase):
+ def runTest(self):
+ test.write('f3.f', "\n")
+ env = DummyEnvironment([])
+ s = SCons.Scanner.Fortran.FortranScan()
+ path = s.path(env)
+
+ n = env.File('fff3.f')
+ def my_rexists(s):
+ s.Tag('rexists_called', 1)
+ return SCons.Node._rexists_map[s.GetTag('old_rexists')](s)
+ n.Tag('old_rexists', n._func_rexists)
+ SCons.Node._rexists_map[3] = my_rexists
+ n._func_rexists = 3
+
+ deps = s(n, env, path)
+
+ # Make sure rexists() got called on the file node being
+ # scanned, essential for cooperation with VariantDir functionality.
+ assert n.GetTag('rexists_called')
+
+ headers = ['d1/f3.f', 'f3.f']
+ deps_match(self, deps, headers)
+ test.unlink('f3.f')
+
+class FortranScannerTestCase10(unittest.TestCase):
+ def runTest(self):
+ env = DummyEnvironment(["include"])
+ s = SCons.Scanner.Fortran.FortranScan()
+ path = s.path(env)
+ deps1 = s(env.File('fff4.f'), env, path)
+ env.fs.chdir(env.Dir('subdir'))
+ dir = env.fs.getcwd()
+ env.fs.chdir(env.Dir(''))
+ path = s.path(env, dir)
+ deps2 = s(env.File('#fff4.f'), env, path)
+ headers1 = list(map(test.workpath, ['include/f4.f']))
+ headers2 = ['include/f4.f']
+ deps_match(self, deps1, headers1)
+ deps_match(self, deps2, headers2)
+
+class FortranScannerTestCase11(unittest.TestCase):
+ def runTest(self):
+ SCons.Warnings.enableWarningClass(SCons.Warnings.DependencyWarning)
+ class TestOut(object):
+ def __call__(self, x):
+ self.out = x
+
+ to = TestOut()
+ to.out = None
+ SCons.Warnings._warningOut = to
+ env = DummyEnvironment([])
+ s = SCons.Scanner.Fortran.FortranScan()
+ path = s.path(env)
+ deps = s(env.File('fff5.f'), env, path)
+
+ # Did we catch the warning from not finding not_there.f?
+ assert to.out
+
+ deps_match(self, deps, [ 'f5.f' ])
+
+class FortranScannerTestCase12(unittest.TestCase):
+ def runTest(self):
+ env = DummyEnvironment([])
+ env.fs.chdir(env.Dir('include'))
+ s = SCons.Scanner.Fortran.FortranScan()
+ path = s.path(env)
+ test.write('include/fff4.f', test.read('fff4.f'))
+ deps = s(env.File('#include/fff4.f'), env, path)
+ env.fs.chdir(env.Dir(''))
+ deps_match(self, deps, ['f4.f'])
+ test.unlink('include/fff4.f')
+
+class FortranScannerTestCase13(unittest.TestCase):
+ def runTest(self):
+ os.chdir(test.workpath('work'))
+ fs = SCons.Node.FS.FS(test.workpath('work'))
+ fs.Repository(test.workpath('repository'))
+
+ # Create a derived file in a directory that does not exist yet.
+ # This was a bug at one time.
+ f1=fs.File('include2/jjj.f')
+ f1.builder=1
+ env = DummyEnvironment(['include','include2'])
+ env.fs = fs
+ s = SCons.Scanner.Fortran.FortranScan()
+ path = s.path(env)
+ deps = s(fs.File('src/fff.f'), env, path)
+ deps_match(self, deps, [test.workpath('repository/include/iii.f'), 'include2/jjj.f'])
+ os.chdir(test.workpath(''))
+
+class FortranScannerTestCase14(unittest.TestCase):
+ def runTest(self):
+ os.chdir(test.workpath('work'))
+ fs = SCons.Node.FS.FS(test.workpath('work'))
+ fs.VariantDir('build1', 'src', 1)
+ fs.VariantDir('build2', 'src', 0)
+ fs.Repository(test.workpath('repository'))
+ env = DummyEnvironment([])
+ env.fs = fs
+ s = SCons.Scanner.Fortran.FortranScan()
+ path = s.path(env)
+ deps1 = s(fs.File('build1/aaa.f'), env, path)
+ deps_match(self, deps1, [ 'build1/bbb.f' ])
+ deps2 = s(fs.File('build2/aaa.f'), env, path)
+ deps_match(self, deps2, [ 'src/bbb.f' ])
+ deps3 = s(fs.File('build1/ccc.f'), env, path)
+ deps_match(self, deps3, [ 'build1/ddd.f' ])
+ deps4 = s(fs.File('build2/ccc.f'), env, path)
+ deps_match(self, deps4, [ test.workpath('repository/src/ddd.f') ])
+ os.chdir(test.workpath(''))
+
+class FortranScannerTestCase15(unittest.TestCase):
+ def runTest(self):
+ class SubstEnvironment(DummyEnvironment):
+ def subst(self, arg, target=None, source=None, conv=None, test=test):
+ if arg == "$junk":
+ return test.workpath("d1")
+ else:
+ return arg
+ test.write(['d1', 'f2.f'], " INCLUDE 'fi.f'\n")
+ env = SubstEnvironment(["$junk"])
+ s = SCons.Scanner.Fortran.FortranScan()
+ path = s.path(env)
+ deps = s(env.File('fff1.f'), env, path)
+ headers = ['d1/f1.f', 'd1/f2.f']
+ deps_match(self, deps, headers)
+ test.write(['d1', 'f2.f'], "\n")
+
+class FortranScannerTestCase16(unittest.TestCase):
+ def runTest(self):
+ test.write('f1.f', "\n")
+ test.write('f2.f', "\n")
+ test.write('f3.f', "\n")
+ test.write('f4.f', "\n")
+ test.write('f5.f', "\n")
+ test.write('f6.f', "\n")
+ test.write('f7.f', "\n")
+ test.write('f8.f', "\n")
+ test.write('f9.f', "\n")
+ test.write('f10.f', "\n")
+ env = DummyEnvironment([test.workpath('modules')])
+ s = SCons.Scanner.Fortran.FortranScan()
+ path = s.path(env)
+ deps = s(env.File('fff90a.f90'), env, path)
+ headers = ['f1.f', 'f2.f', 'f3.f', 'f4.f', 'f5.f', 'f6.f', 'f7.f', 'f8.f', 'f9.f']
+ modules = ['mod01.mod', 'mod02.mod', 'mod03.mod', 'mod04.mod', 'mod05.mod',
+ 'mod06.mod', 'mod07.mod', 'mod08.mod', 'mod09.mod', 'mod10.mod',
+ 'mod11.mod', 'mod12.mod', 'mod13.mod', 'mod14.mod', 'mod15.mod',
+ 'mod16.mod', 'mod17.mod', 'mod18.mod', 'mod19.mod', 'mod20.mod',
+ 'mod21.mod', 'mod22.mod', 'mod23.mod', 'mod24.mod', 'mod25.mod', 'modules/use.mod']
+ deps_expected = headers + modules
+ deps_match(self, deps, deps_expected)
+ test.unlink('f1.f')
+ test.unlink('f2.f')
+ test.unlink('f3.f')
+ test.unlink('f4.f')
+ test.unlink('f5.f')
+ test.unlink('f6.f')
+ test.unlink('f7.f')
+ test.unlink('f8.f')
+ test.unlink('f9.f')
+ test.unlink('f10.f')
+
+def suite():
+ suite = unittest.TestSuite()
+ suite.addTest(FortranScannerTestCase1())
+ suite.addTest(FortranScannerTestCase2())
+ suite.addTest(FortranScannerTestCase3())
+ suite.addTest(FortranScannerTestCase4())
+ suite.addTest(FortranScannerTestCase5())
+ suite.addTest(FortranScannerTestCase6())
+ suite.addTest(FortranScannerTestCase7())
+ suite.addTest(FortranScannerTestCase8())
+ suite.addTest(FortranScannerTestCase9())
+ suite.addTest(FortranScannerTestCase10())
+ suite.addTest(FortranScannerTestCase11())
+ suite.addTest(FortranScannerTestCase12())
+ suite.addTest(FortranScannerTestCase13())
+ suite.addTest(FortranScannerTestCase14())
+ suite.addTest(FortranScannerTestCase15())
+ suite.addTest(FortranScannerTestCase16())
+ return suite
+
+if __name__ == "__main__":
+ TestUnit.run(suite())
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Scanner/IDL.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Scanner/IDL.py
new file mode 100644
index 0000000..86ee006
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Scanner/IDL.py
@@ -0,0 +1,48 @@
+"""SCons.Scanner.IDL
+
+This module implements the dependency scanner for IDL (Interface
+Definition Language) files.
+
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import SCons.Node.FS
+import SCons.Scanner
+
+def IDLScan():
+ """Return a prototype Scanner instance for scanning IDL source files"""
+ cs = SCons.Scanner.ClassicCPP("IDLScan",
+ "$IDLSUFFIXES",
+ "CPPPATH",
+ '^[ \t]*(?:#[ \t]*include|[ \t]*import)[ \t]+(<|")([^>"]+)(>|")')
+ return cs
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Scanner/IDLTests.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Scanner/IDLTests.py
new file mode 100644
index 0000000..227799e
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Scanner/IDLTests.py
@@ -0,0 +1,454 @@
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import unittest
+import sys
+import os
+import os.path
+
+import TestCmd
+import TestUnit
+
+import SCons.Scanner.IDL
+import SCons.Node.FS
+import SCons.Warnings
+
+test = TestCmd.TestCmd(workdir = '')
+
+os.chdir(test.workpath(''))
+
+# create some source files and headers:
+
+test.write('t1.idl','''
+#include "f1.idl"
+#include <f2.idl>
+import "f3.idl";
+
+[
+ object,
+ uuid(22995106-CE26-4561-AF1B-C71C6934B840),
+ dual,
+ helpstring("IBarObject Interface"),
+ pointer_default(unique)
+]
+interface IBarObject : IDispatch
+{
+};
+''')
+
+test.write('t2.idl',"""
+#include \"d1/f1.idl\"
+#include <d2/f1.idl>
+#include \"f1.idl\"
+import <f3.idl>;
+
+[
+ object,
+ uuid(22995106-CE26-4561-AF1B-C71C6934B840),
+ dual,
+ helpstring(\"IBarObject Interface\"),
+ pointer_default(unique)
+]
+interface IBarObject : IDispatch
+{
+};
+""")
+
+test.write('t3.idl',"""
+#include \t \"f1.idl\"
+ \t #include \"f2.idl\"
+# \t include \"f3-test.idl\"
+
+#include \t <d1/f1.idl>
+ \t #include <d1/f2.idl>
+# \t include <d1/f3-test.idl>
+
+import \t \"d1/f1.idl\"
+ \t import \"d1/f2.idl\"
+
+include \t \"never.idl\"
+ \t include \"never.idl\"
+
+// #include \"never.idl\"
+
+const char* x = \"#include <never.idl>\"
+
+[
+ object,
+ uuid(22995106-CE26-4561-AF1B-C71C6934B840),
+ dual,
+ helpstring(\"IBarObject Interface\"),
+ pointer_default(unique)
+]
+interface IBarObject : IDispatch
+{
+};
+""")
+
+test.subdir('d1', ['d1', 'd2'])
+
+headers = ['f1.idl','f2.idl', 'f3.idl', 'f3-test.idl', 'fi.idl', 'fj.idl', 'never.idl',
+ 'd1/f1.idl', 'd1/f2.idl', 'd1/f3-test.idl', 'd1/fi.idl', 'd1/fj.idl',
+ 'd1/d2/f1.idl', 'd1/d2/f2.idl', 'd1/d2/f3-test.idl',
+ 'd1/d2/f4.idl', 'd1/d2/fi.idl', 'd1/d2/fj.idl']
+
+for h in headers:
+ test.write(h, " ")
+
+test.write('f2.idl',"""
+#include "fi.idl"
+""")
+
+test.write('f3-test.idl',"""
+#include <fj.idl>
+""")
+
+
+test.subdir('include', 'subdir', ['subdir', 'include'])
+
+test.write('t4.idl',"""
+#include \"fa.idl\"
+#include <fb.idl>
+
+[
+ object,
+ uuid(22995106-CE26-4561-AF1B-C71C6934B840),
+ dual,
+ helpstring(\"IBarObject Interface\"),
+ pointer_default(unique)
+]
+interface IBarObject : IDispatch
+{
+};
+""")
+
+test.write(['include', 'fa.idl'], "\n")
+test.write(['include', 'fb.idl'], "\n")
+test.write(['subdir', 'include', 'fa.idl'], "\n")
+test.write(['subdir', 'include', 'fb.idl'], "\n")
+
+test.subdir('repository', ['repository', 'include'],
+ ['repository', 'src' ])
+test.subdir('work', ['work', 'src'])
+
+test.write(['repository', 'include', 'iii.idl'], "\n")
+
+test.write(['work', 'src', 'fff.c'], """
+#include <iii.idl>
+#include <jjj.idl>
+
+int main()
+{
+ return 0;
+}
+""")
+
+test.write([ 'work', 'src', 'aaa.c'], """
+#include "bbb.idl"
+
+int main()
+{
+ return 0;
+}
+""")
+
+test.write([ 'work', 'src', 'bbb.idl'], "\n")
+
+test.write([ 'repository', 'src', 'ccc.c'], """
+#include "ddd.idl"
+
+int main()
+{
+ return 0;
+}
+""")
+
+test.write([ 'repository', 'src', 'ddd.idl'], "\n")
+
+# define some helpers:
+
+class DummyEnvironment(object):
+ def __init__(self, listCppPath):
+ self.path = listCppPath
+ self.fs = SCons.Node.FS.FS(test.workpath(''))
+
+ def Dictionary(self, *args):
+ if not args:
+ return { 'CPPPATH': self.path }
+ elif len(args) == 1 and args[0] == 'CPPPATH':
+ return self.path
+ else:
+ raise KeyError("Dummy environment only has CPPPATH attribute.")
+
+ def subst(self, arg, target=None, source=None, conv=None):
+ return arg
+
+ def subst_path(self, path, target=None, source=None, conv=None):
+ if not isinstance(path, list):
+ path = [path]
+ return list(map(self.subst, path))
+
+ def has_key(self, key):
+ return key in self.Dictionary()
+
+ def __getitem__(self,key):
+ return self.Dictionary()[key]
+
+ def __setitem__(self,key,value):
+ self.Dictionary()[key] = value
+
+ def __delitem__(self,key):
+ del self.Dictionary()[key]
+
+ def get_calculator(self):
+ return None
+
+ def get_factory(self, factory):
+ return factory or self.fs.File
+
+ def Dir(self, filename):
+ return self.fs.Dir(filename)
+
+ def File(self, filename):
+ return self.fs.File(filename)
+
+global my_normpath
+my_normpath = os.path.normpath
+
+if os.path.normcase('foo') == os.path.normcase('FOO'):
+ my_normpath = os.path.normcase
+
+def deps_match(self, deps, headers):
+ scanned = list(map(my_normpath, list(map(str, deps))))
+ expect = list(map(my_normpath, headers))
+ self.failUnless(scanned == expect, "expect %s != scanned %s" % (expect, scanned))
+
+# define some tests:
+
+class IDLScannerTestCase1(unittest.TestCase):
+ def runTest(self):
+ env = DummyEnvironment([])
+ s = SCons.Scanner.IDL.IDLScan()
+ path = s.path(env)
+ deps = s(env.File('t1.idl'), env, path)
+ headers = ['f1.idl', 'f3.idl', 'f2.idl']
+ deps_match(self, deps, headers)
+
+class IDLScannerTestCase2(unittest.TestCase):
+ def runTest(self):
+ env = DummyEnvironment([test.workpath("d1")])
+ s = SCons.Scanner.IDL.IDLScan()
+ path = s.path(env)
+ deps = s(env.File('t1.idl'), env, path)
+ headers = ['f1.idl', 'f3.idl', 'd1/f2.idl']
+ deps_match(self, deps, headers)
+
+class IDLScannerTestCase3(unittest.TestCase):
+ def runTest(self):
+ env = DummyEnvironment([test.workpath("d1")])
+ s = SCons.Scanner.IDL.IDLScan()
+ path = s.path(env)
+ deps = s(env.File('t2.idl'), env, path)
+ headers = ['d1/f1.idl', 'f1.idl', 'd1/d2/f1.idl', 'f3.idl']
+ deps_match(self, deps, headers)
+
+class IDLScannerTestCase4(unittest.TestCase):
+ def runTest(self):
+ env = DummyEnvironment([test.workpath("d1"), test.workpath("d1/d2")])
+ s = SCons.Scanner.IDL.IDLScan()
+ path = s.path(env)
+ deps = s(env.File('t2.idl'), env, path)
+ headers = ['d1/f1.idl', 'f1.idl', 'd1/d2/f1.idl', 'f3.idl']
+ deps_match(self, deps, headers)
+
+class IDLScannerTestCase5(unittest.TestCase):
+ def runTest(self):
+ env = DummyEnvironment([])
+ s = SCons.Scanner.IDL.IDLScan()
+ path = s.path(env)
+
+ n = env.File('t3.idl')
+ def my_rexists(s):
+ s.Tag('rexists_called', 1)
+ return SCons.Node._rexists_map[s.GetTag('old_rexists')](s)
+ n.Tag('old_rexists', n._func_rexists)
+ SCons.Node._rexists_map[3] = my_rexists
+ n._func_rexists = 3
+
+ deps = s(n, env, path)
+
+ # Make sure rexists() got called on the file node being
+ # scanned, essential for cooperation with VariantDir functionality.
+ assert n.GetTag('rexists_called')
+
+ headers = ['d1/f1.idl', 'd1/f2.idl',
+ 'f1.idl', 'f2.idl', 'f3-test.idl',
+ 'd1/f1.idl', 'd1/f2.idl', 'd1/f3-test.idl']
+ deps_match(self, deps, headers)
+
+class IDLScannerTestCase6(unittest.TestCase):
+ def runTest(self):
+ env1 = DummyEnvironment([test.workpath("d1")])
+ env2 = DummyEnvironment([test.workpath("d1/d2")])
+ s = SCons.Scanner.IDL.IDLScan()
+ path1 = s.path(env1)
+ path2 = s.path(env2)
+ deps1 = s(env1.File('t1.idl'), env1, path1)
+ deps2 = s(env2.File('t1.idl'), env2, path2)
+ headers1 = ['f1.idl', 'f3.idl', 'd1/f2.idl']
+ headers2 = ['f1.idl', 'f3.idl', 'd1/d2/f2.idl']
+ deps_match(self, deps1, headers1)
+ deps_match(self, deps2, headers2)
+
+class IDLScannerTestCase7(unittest.TestCase):
+ def runTest(self):
+ env = DummyEnvironment(["include"])
+ s = SCons.Scanner.IDL.IDLScan()
+ path = s.path(env)
+ deps1 = s(env.File('t4.idl'), env, path)
+ env.fs.chdir(env.Dir('subdir'))
+ dir = env.fs.getcwd()
+ env.fs.chdir(env.Dir(''))
+ path = s.path(env, dir)
+ deps2 = s(env.File('#t4.idl'), env, path)
+ headers1 = list(map(test.workpath, ['include/fa.idl', 'include/fb.idl']))
+ headers2 = ['include/fa.idl', 'include/fb.idl']
+ deps_match(self, deps1, headers1)
+ deps_match(self, deps2, headers2)
+
+class IDLScannerTestCase8(unittest.TestCase):
+ def runTest(self):
+ SCons.Warnings.enableWarningClass(SCons.Warnings.DependencyWarning)
+ class TestOut(object):
+ def __call__(self, x):
+ self.out = x
+
+ to = TestOut()
+ to.out = None
+ SCons.Warnings._warningOut = to
+ test.write('fa.idl','\n')
+ env = DummyEnvironment([])
+ s = SCons.Scanner.IDL.IDLScan()
+ path = s.path(env)
+ deps = s(env.File('t4.idl'), env, path)
+
+ # Did we catch the warning associated with not finding fb.idl?
+ assert to.out
+
+ deps_match(self, deps, [ 'fa.idl' ])
+ test.unlink('fa.idl')
+
+class IDLScannerTestCase9(unittest.TestCase):
+ def runTest(self):
+ env = DummyEnvironment([])
+ env.fs.chdir(env.Dir('include'))
+ s = SCons.Scanner.IDL.IDLScan()
+ path = s.path(env)
+ test.write('include/t4.idl', test.read('t4.idl'))
+ deps = s(env.File('#include/t4.idl'), env, path)
+ env.fs.chdir(env.Dir(''))
+ deps_match(self, deps, [ 'fa.idl', 'fb.idl' ])
+ test.unlink('include/t4.idl')
+
+class IDLScannerTestCase10(unittest.TestCase):
+ def runTest(self):
+ os.chdir(test.workpath('work'))
+ fs = SCons.Node.FS.FS(test.workpath('work'))
+ fs.Repository(test.workpath('repository'))
+
+ # Create a derived file in a directory that does not exist yet.
+ # This was a bug at one time.
+ env = DummyEnvironment(['include', 'include2'])
+ env.fs = fs
+ f1 = fs.File('include2/jjj.idl')
+ f1.builder = 1
+ s = SCons.Scanner.IDL.IDLScan()
+ path = s.path(env)
+ deps = s(fs.File('src/fff.c'), env, path)
+ deps_match(self, deps, [ test.workpath('repository/include/iii.idl'),
+ 'include2/jjj.idl' ])
+ os.chdir(test.workpath(''))
+
+class IDLScannerTestCase11(unittest.TestCase):
+ def runTest(self):
+ os.chdir(test.workpath('work'))
+ fs = SCons.Node.FS.FS(test.workpath('work'))
+ fs.VariantDir('build1', 'src', 1)
+ fs.VariantDir('build2', 'src', 0)
+ fs.Repository(test.workpath('repository'))
+ env = DummyEnvironment([])
+ env.fs = fs
+ s = SCons.Scanner.IDL.IDLScan()
+ path = s.path(env)
+ deps1 = s(fs.File('build1/aaa.c'), env, path)
+ deps_match(self, deps1, [ 'build1/bbb.idl' ])
+ deps2 = s(fs.File('build2/aaa.c'), env, path)
+ deps_match(self, deps2, [ 'src/bbb.idl' ])
+ deps3 = s(fs.File('build1/ccc.c'), env, path)
+ deps_match(self, deps3, [ 'build1/ddd.idl' ])
+ deps4 = s(fs.File('build2/ccc.c'), env, path)
+ deps_match(self, deps4, [ test.workpath('repository/src/ddd.idl') ])
+ os.chdir(test.workpath(''))
+
+class IDLScannerTestCase12(unittest.TestCase):
+ def runTest(self):
+ class SubstEnvironment(DummyEnvironment):
+ def subst(self, arg, target=None, source=None, conv=None, test=test):
+ if arg == "$blah":
+ return test.workpath("d1")
+ else:
+ return arg
+ env = SubstEnvironment(["$blah"])
+ s = SCons.Scanner.IDL.IDLScan()
+ path = s.path(env)
+ deps = s(env.File('t1.idl'), env, path)
+ headers = ['f1.idl', 'f3.idl', 'd1/f2.idl']
+ deps_match(self, deps, headers)
+
+
+def suite():
+ suite = unittest.TestSuite()
+ suite.addTest(IDLScannerTestCase1())
+ suite.addTest(IDLScannerTestCase2())
+ suite.addTest(IDLScannerTestCase3())
+ suite.addTest(IDLScannerTestCase4())
+ suite.addTest(IDLScannerTestCase5())
+ suite.addTest(IDLScannerTestCase6())
+ suite.addTest(IDLScannerTestCase7())
+ suite.addTest(IDLScannerTestCase8())
+ suite.addTest(IDLScannerTestCase9())
+ suite.addTest(IDLScannerTestCase10())
+ suite.addTest(IDLScannerTestCase11())
+ suite.addTest(IDLScannerTestCase12())
+ return suite
+
+if __name__ == "__main__":
+ TestUnit.run(suite())
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Scanner/LaTeX.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Scanner/LaTeX.py
new file mode 100644
index 0000000..5800443
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Scanner/LaTeX.py
@@ -0,0 +1,437 @@
+"""SCons.Scanner.LaTeX
+
+This module implements the dependency scanner for LaTeX code.
+
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import os.path
+import re
+
+import SCons.Scanner
+import SCons.Util
+
+# list of graphics file extensions for TeX and LaTeX
+TexGraphics = ['.eps', '.ps']
+#LatexGraphics = ['.pdf', '.png', '.jpg', '.gif', '.tif']
+LatexGraphics = [ '.png', '.jpg', '.gif', '.tif']
+
+
+# Used as a return value of modify_env_var if the variable is not set.
+class _Null(object):
+ pass
+_null = _Null
+
+# The user specifies the paths in env[variable], similar to other builders.
+# They may be relative and must be converted to absolute, as expected
+# by LaTeX and Co. The environment may already have some paths in
+# env['ENV'][var]. These paths are honored, but the env[var] paths have
+# higher precedence. All changes are un-done on exit.
+def modify_env_var(env, var, abspath):
+ try:
+ save = env['ENV'][var]
+ except KeyError:
+ save = _null
+ env.PrependENVPath(var, abspath)
+ try:
+ if SCons.Util.is_List(env[var]):
+ env.PrependENVPath(var, [os.path.abspath(str(p)) for p in env[var]])
+ else:
+ # Split at os.pathsep to convert into absolute path
+ env.PrependENVPath(var, [os.path.abspath(p) for p in str(env[var]).split(os.pathsep)])
+ except KeyError:
+ pass
+
+ # Convert into a string explicitly to append ":" (without which it won't search system
+ # paths as well). The problem is that env.AppendENVPath(var, ":")
+ # does not work, refuses to append ":" (os.pathsep).
+
+ if SCons.Util.is_List(env['ENV'][var]):
+ env['ENV'][var] = os.pathsep.join(env['ENV'][var])
+ # Append the trailing os.pathsep character here to catch the case with no env[var]
+ env['ENV'][var] = env['ENV'][var] + os.pathsep
+
+ return save
+
+class FindENVPathDirs(object):
+ """
+ A class to bind a specific E{*}PATH variable name to a function that
+ will return all of the E{*}path directories.
+ """
+ def __init__(self, variable):
+ self.variable = variable
+ def __call__(self, env, dir=None, target=None, source=None, argument=None):
+ import SCons.PathList
+ try:
+ path = env['ENV'][self.variable]
+ except KeyError:
+ return ()
+
+ dir = dir or env.fs._cwd
+ path = SCons.PathList.PathList(path).subst_path(env, target, source)
+ return tuple(dir.Rfindalldirs(path))
+
+
+
+def LaTeXScanner():
+ """
+ Return a prototype Scanner instance for scanning LaTeX source files
+ when built with latex.
+ """
+ ds = LaTeX(name = "LaTeXScanner",
+ suffixes = '$LATEXSUFFIXES',
+ # in the search order, see below in LaTeX class docstring
+ graphics_extensions = TexGraphics,
+ recursive = 0)
+ return ds
+
+def PDFLaTeXScanner():
+ """
+ Return a prototype Scanner instance for scanning LaTeX source files
+ when built with pdflatex.
+ """
+ ds = LaTeX(name = "PDFLaTeXScanner",
+ suffixes = '$LATEXSUFFIXES',
+ # in the search order, see below in LaTeX class docstring
+ graphics_extensions = LatexGraphics,
+ recursive = 0)
+ return ds
+
+class LaTeX(SCons.Scanner.Base):
+ """
+ Class for scanning LaTeX files for included files.
+
+ Unlike most scanners, which use regular expressions that just
+ return the included file name, this returns a tuple consisting
+ of the keyword for the inclusion ("include", "includegraphics",
+ "input", or "bibliography"), and then the file name itself.
+ Based on a quick look at LaTeX documentation, it seems that we
+ should append .tex suffix for the "include" keywords, append .tex if
+ there is no extension for the "input" keyword, and need to add .bib
+ for the "bibliography" keyword that does not accept extensions by itself.
+
+ Finally, if there is no extension for an "includegraphics" keyword
+ latex will append .ps or .eps to find the file, while pdftex may use .pdf,
+ .jpg, .tif, .mps, or .png.
+
+ The actual subset and search order may be altered by
+ DeclareGraphicsExtensions command. This complication is ignored.
+ The default order corresponds to experimentation with teTeX::
+
+ $ latex --version
+ pdfeTeX 3.141592-1.21a-2.2 (Web2C 7.5.4)
+ kpathsea version 3.5.4
+
+ The order is:
+ ['.eps', '.ps'] for latex
+ ['.png', '.pdf', '.jpg', '.tif'].
+
+ Another difference is that the search path is determined by the type
+ of the file being searched:
+ env['TEXINPUTS'] for "input" and "include" keywords
+ env['TEXINPUTS'] for "includegraphics" keyword
+ env['TEXINPUTS'] for "lstinputlisting" keyword
+ env['BIBINPUTS'] for "bibliography" keyword
+ env['BSTINPUTS'] for "bibliographystyle" keyword
+ env['INDEXSTYLE'] for "makeindex" keyword, no scanning support needed just allows user to set it if needed.
+
+ FIXME: also look for the class or style in document[class|style]{}
+ FIXME: also look for the argument of bibliographystyle{}
+ """
+ keyword_paths = {'include': 'TEXINPUTS',
+ 'input': 'TEXINPUTS',
+ 'includegraphics': 'TEXINPUTS',
+ 'bibliography': 'BIBINPUTS',
+ 'bibliographystyle': 'BSTINPUTS',
+ 'addbibresource': 'BIBINPUTS',
+ 'addglobalbib': 'BIBINPUTS',
+ 'addsectionbib': 'BIBINPUTS',
+ 'makeindex': 'INDEXSTYLE',
+ 'usepackage': 'TEXINPUTS',
+ 'lstinputlisting': 'TEXINPUTS'}
+ env_variables = SCons.Util.unique(list(keyword_paths.values()))
+ two_arg_commands = ['import', 'subimport',
+ 'includefrom', 'subincludefrom',
+ 'inputfrom', 'subinputfrom']
+
+ def __init__(self, name, suffixes, graphics_extensions, *args, **kw):
+
+ # We have to include \n with the % we exclude from the first part
+ # part of the regex because the expression is compiled with re.M.
+ # Without the \n, the ^ could match the beginning of a *previous*
+ # line followed by one or more newline characters (i.e. blank
+ # lines), interfering with a match on the next line.
+ # add option for whitespace before the '[options]' or the '{filename}'
+ regex = r'''
+ ^[^%\n]*
+ \\(
+ include
+ | includegraphics(?:\s*\[[^\]]+\])?
+ | lstinputlisting(?:\[[^\]]+\])?
+ | input
+ | import
+ | subimport
+ | includefrom
+ | subincludefrom
+ | inputfrom
+ | subinputfrom
+ | bibliography
+ | addbibresource
+ | addglobalbib
+ | addsectionbib
+ | usepackage
+ )
+ \s*{([^}]*)} # first arg
+ (?: \s*{([^}]*)} )? # maybe another arg
+ '''
+ self.cre = re.compile(regex, re.M | re.X)
+ self.comment_re = re.compile(r'^((?:(?:\\%)|[^%\n])*)(.*)$', re.M)
+
+ self.graphics_extensions = graphics_extensions
+
+ def _scan(node, env, path=(), self=self):
+ node = node.rfile()
+ if not node.exists():
+ return []
+ return self.scan_recurse(node, path)
+
+ class FindMultiPathDirs(object):
+ """The stock FindPathDirs function has the wrong granularity:
+ it is called once per target, while we need the path that depends
+ on what kind of included files is being searched. This wrapper
+ hides multiple instances of FindPathDirs, one per the LaTeX path
+ variable in the environment. When invoked, the function calculates
+ and returns all the required paths as a dictionary (converted into
+ a tuple to become hashable). Then the scan function converts it
+ back and uses a dictionary of tuples rather than a single tuple
+ of paths.
+ """
+ def __init__(self, dictionary):
+ self.dictionary = {}
+ for k,n in dictionary.items():
+ self.dictionary[k] = ( SCons.Scanner.FindPathDirs(n),
+ FindENVPathDirs(n) )
+
+ def __call__(self, env, dir=None, target=None, source=None,
+ argument=None):
+ di = {}
+ for k,(c,cENV) in self.dictionary.items():
+ di[k] = ( c(env, dir=None, target=None, source=None,
+ argument=None) ,
+ cENV(env, dir=None, target=None, source=None,
+ argument=None) )
+ # To prevent "dict is not hashable error"
+ return tuple(di.items())
+
+ class LaTeXScanCheck(object):
+ """Skip all but LaTeX source files, i.e., do not scan *.eps,
+ *.pdf, *.jpg, etc.
+ """
+ def __init__(self, suffixes):
+ self.suffixes = suffixes
+ def __call__(self, node, env):
+ current = not node.has_builder() or node.is_up_to_date()
+ scannable = node.get_suffix() in env.subst_list(self.suffixes)[0]
+ # Returning false means that the file is not scanned.
+ return scannable and current
+
+ kw['function'] = _scan
+ kw['path_function'] = FindMultiPathDirs(LaTeX.keyword_paths)
+ kw['recursive'] = 0
+ kw['skeys'] = suffixes
+ kw['scan_check'] = LaTeXScanCheck(suffixes)
+ kw['name'] = name
+
+ SCons.Scanner.Base.__init__(self, *args, **kw)
+
+ def _latex_names(self, include_type, filename):
+ if include_type == 'input':
+ base, ext = os.path.splitext( filename )
+ if ext == "":
+ return [filename + '.tex']
+ if include_type in ('include', 'import', 'subimport',
+ 'includefrom', 'subincludefrom',
+ 'inputfrom', 'subinputfrom'):
+ base, ext = os.path.splitext( filename )
+ if ext == "":
+ return [filename + '.tex']
+ if include_type == 'bibliography':
+ base, ext = os.path.splitext( filename )
+ if ext == "":
+ return [filename + '.bib']
+ if include_type == 'usepackage':
+ base, ext = os.path.splitext( filename )
+ if ext == "":
+ return [filename + '.sty']
+ if include_type == 'includegraphics':
+ base, ext = os.path.splitext( filename )
+ if ext == "":
+ #return [filename+e for e in self.graphics_extensions + TexGraphics]
+ # use the line above to find dependencies for the PDF builder
+ # when only an .eps figure is present. Since it will be found
+ # if the user tells scons how to make the pdf figure, leave
+ # it out for now.
+ return [filename+e for e in self.graphics_extensions]
+ return [filename]
+
+ def sort_key(self, include):
+ return SCons.Node.FS._my_normcase(str(include))
+
+ def find_include(self, include, source_dir, path):
+ inc_type, inc_subdir, inc_filename = include
+ try:
+ sub_paths = path[inc_type]
+ except (IndexError, KeyError):
+ sub_paths = ((), ())
+ try_names = self._latex_names(inc_type, inc_filename)
+
+ # There are three search paths to try:
+ # 1. current directory "source_dir"
+ # 2. env[var]
+ # 3. env['ENV'][var]
+ search_paths = [(source_dir,)] + list(sub_paths)
+
+ for n in try_names:
+ for search_path in search_paths:
+ paths = tuple([d.Dir(inc_subdir) for d in search_path])
+ i = SCons.Node.FS.find_file(n, paths)
+ if i:
+ return i, include
+ return None, include
+
+ def canonical_text(self, text):
+ """Standardize an input TeX-file contents.
+
+ Currently:
+ * removes comments, unwrapping comment-wrapped lines.
+ """
+ out = []
+ line_continues_a_comment = False
+ for line in text.splitlines():
+ line,comment = self.comment_re.findall(line)[0]
+ if line_continues_a_comment == True:
+ out[-1] = out[-1] + line.lstrip()
+ else:
+ out.append(line)
+ line_continues_a_comment = len(comment) > 0
+ return '\n'.join(out).rstrip()+'\n'
+
+ def scan(self, node, subdir='.'):
+ # Modify the default scan function to allow for the regular
+ # expression to return a comma separated list of file names
+ # as can be the case with the bibliography keyword.
+
+ # Cache the includes list in node so we only scan it once:
+ # path_dict = dict(list(path))
+ # add option for whitespace (\s) before the '['
+ noopt_cre = re.compile('\s*\[.*$')
+ if node.includes != None:
+ includes = node.includes
+ else:
+ text = self.canonical_text(node.get_text_contents())
+ includes = self.cre.findall(text)
+ # 1. Split comma-separated lines, e.g.
+ # ('bibliography', 'phys,comp')
+ # should become two entries
+ # ('bibliography', 'phys')
+ # ('bibliography', 'comp')
+ # 2. Remove the options, e.g., such as
+ # ('includegraphics[clip,width=0.7\\linewidth]', 'picture.eps')
+ # should become
+ # ('includegraphics', 'picture.eps')
+ split_includes = []
+ for include in includes:
+ inc_type = noopt_cre.sub('', include[0])
+ inc_subdir = subdir
+ if inc_type in self.two_arg_commands:
+ inc_subdir = os.path.join(subdir, include[1])
+ inc_list = include[2].split(',')
+ else:
+ inc_list = include[1].split(',')
+ for j in range(len(inc_list)):
+ split_includes.append( (inc_type, inc_subdir, inc_list[j]) )
+ #
+ includes = split_includes
+ node.includes = includes
+
+ return includes
+
+ def scan_recurse(self, node, path=()):
+ """ do a recursive scan of the top level target file
+ This lets us search for included files based on the
+ directory of the main file just as latex does"""
+
+ path_dict = dict(list(path))
+
+ queue = []
+ queue.extend( self.scan(node) )
+ seen = {}
+
+ # This is a hand-coded DSU (decorate-sort-undecorate, or
+ # Schwartzian transform) pattern. The sort key is the raw name
+ # of the file as specifed on the \include, \input, etc. line.
+ # TODO: what about the comment in the original Classic scanner:
+ # """which lets
+ # us keep the sort order constant regardless of whether the file
+ # is actually found in a Repository or locally."""
+ nodes = []
+ source_dir = node.get_dir()
+ #for include in includes:
+ while queue:
+
+ include = queue.pop()
+ inc_type, inc_subdir, inc_filename = include
+
+ try:
+ if seen[inc_filename] == 1:
+ continue
+ except KeyError:
+ seen[inc_filename] = 1
+
+ #
+ # Handle multiple filenames in include[1]
+ #
+ n, i = self.find_include(include, source_dir, path_dict)
+ if n is None:
+ # Do not bother with 'usepackage' warnings, as they most
+ # likely refer to system-level files
+ if inc_type != 'usepackage':
+ SCons.Warnings.warn(SCons.Warnings.DependencyWarning,
+ "No dependency generated for file: %s (included from: %s) -- file not found" % (i, node))
+ else:
+ sortkey = self.sort_key(n)
+ nodes.append((sortkey, n))
+ # recurse down
+ queue.extend( self.scan(n, inc_subdir) )
+
+ return [pair[1] for pair in sorted(nodes)]
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Scanner/LaTeXTests.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Scanner/LaTeXTests.py
new file mode 100644
index 0000000..213e89e
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Scanner/LaTeXTests.py
@@ -0,0 +1,174 @@
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import SCons.compat
+
+import collections
+import os
+import sys
+import unittest
+
+import TestCmd
+import TestUnit
+
+import SCons.Node.FS
+import SCons.Scanner.LaTeX
+
+test = TestCmd.TestCmd(workdir = '')
+
+test.write('test1.latex',"""
+\include{inc1}
+\input{inc2}
+include{incNO}
+%\include{incNO}
+xyzzy \include{inc6}
+\subimport{subdir}{inc3}
+\import{subdir}{inc3a}
+\includefrom{subdir}{inc3b}
+\subincludefrom{subdir}{inc3c}
+\inputfrom{subdir}{inc3d}
+\subinputfrom{subdir}{inc3e}
+""")
+
+test.write('test2.latex',"""
+\include{inc1}
+\include{inc3}
+""")
+
+test.write('test3.latex',"""
+\includegraphics{inc4.eps}
+\includegraphics[width=60mm]{inc5.xyz}
+""")
+
+test.subdir('subdir')
+
+test.write('inc1.tex',"\n")
+test.write('inc2.tex',"\n")
+test.write(['subdir', 'inc3.tex'], "\n")
+for suffix in 'abcde':
+ test.write(['subdir', 'inc3%s.tex' % suffix], "\n")
+test.write(['subdir', 'inc3b.tex'], "\n")
+test.write(['subdir', 'inc3c.tex'], "\n")
+test.write(['subdir', 'inc4.eps'], "\n")
+test.write('inc5.xyz', "\n")
+test.write('inc6.tex', "\n")
+test.write('incNO.tex', "\n")
+
+# define some helpers:
+# copied from CTest.py
+class DummyEnvironment(collections.UserDict):
+ def __init__(self, **kw):
+ collections.UserDict.__init__(self)
+ self.data.update(kw)
+ self.fs = SCons.Node.FS.FS(test.workpath(''))
+
+ def Dictionary(self, *args):
+ return self.data
+
+ def subst(self, strSubst, target=None, source=None, conv=None):
+ if strSubst[0] == '$':
+ return self.data[strSubst[1:]]
+ return strSubst
+
+ def subst_list(self, strSubst, target=None, source=None, conv=None):
+ if strSubst[0] == '$':
+ return [self.data[strSubst[1:]]]
+ return [[strSubst]]
+
+ def subst_path(self, path, target=None, source=None, conv=None):
+ if not isinstance(path, list):
+ path = [path]
+ return list(map(self.subst, path))
+
+ def get_calculator(self):
+ return None
+
+ def get_factory(self, factory):
+ return factory or self.fs.File
+
+ def Dir(self, filename):
+ return self.fs.Dir(filename)
+
+ def File(self, filename):
+ return self.fs.File(filename)
+
+if os.path.normcase('foo') == os.path.normcase('FOO'):
+ my_normpath = os.path.normcase
+else:
+ my_normpath = os.path.normpath
+
+def deps_match(self, deps, headers):
+ global my_normpath
+ scanned = list(map(my_normpath, list(map(str, deps))))
+ expect = list(map(my_normpath, headers))
+ self.failUnless(scanned == expect, "expect %s != scanned %s" % (expect, scanned))
+
+
+class LaTeXScannerTestCase1(unittest.TestCase):
+ def runTest(self):
+ env = DummyEnvironment(LATEXSUFFIXES = [".tex", ".ltx", ".latex"])
+ s = SCons.Scanner.LaTeX.LaTeXScanner()
+ path = s.path(env)
+ deps = s(env.File('test1.latex'), env, path)
+ headers = ['inc1.tex', 'inc2.tex', 'inc6.tex',
+ 'subdir/inc3.tex', 'subdir/inc3a.tex',
+ 'subdir/inc3b.tex', 'subdir/inc3c.tex',
+ 'subdir/inc3d.tex', 'subdir/inc3e.tex']
+ deps_match(self, deps, headers)
+
+class LaTeXScannerTestCase2(unittest.TestCase):
+ def runTest(self):
+ env = DummyEnvironment(TEXINPUTS=[test.workpath("subdir")],LATEXSUFFIXES = [".tex", ".ltx", ".latex"])
+ s = SCons.Scanner.LaTeX.LaTeXScanner()
+ path = s.path(env)
+ deps = s(env.File('test2.latex'), env, path)
+ headers = ['inc1.tex', 'subdir/inc3.tex']
+ deps_match(self, deps, headers)
+
+class LaTeXScannerTestCase3(unittest.TestCase):
+ def runTest(self):
+ env = DummyEnvironment(TEXINPUTS=[test.workpath("subdir")],LATEXSUFFIXES = [".tex", ".ltx", ".latex"])
+ s = SCons.Scanner.LaTeX.LaTeXScanner()
+ path = s.path(env)
+ deps = s(env.File('test3.latex'), env, path)
+ files = ['inc5.xyz', 'subdir/inc4.eps']
+ deps_match(self, deps, files)
+
+
+def suite():
+ suite = unittest.TestSuite()
+ suite.addTest(LaTeXScannerTestCase1())
+ suite.addTest(LaTeXScannerTestCase2())
+ suite.addTest(LaTeXScannerTestCase3())
+ return suite
+
+if __name__ == "__main__":
+ TestUnit.run(suite())
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Scanner/Prog.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Scanner/Prog.py
new file mode 100644
index 0000000..6567b3d
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Scanner/Prog.py
@@ -0,0 +1,116 @@
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import SCons.Node
+import SCons.Node.FS
+import SCons.Scanner
+import SCons.Util
+
+# global, set by --debug=findlibs
+print_find_libs = None
+
+def ProgramScanner(**kw):
+ """Return a prototype Scanner instance for scanning executable
+ files for static-lib dependencies"""
+ kw['path_function'] = SCons.Scanner.FindPathDirs('LIBPATH')
+ ps = SCons.Scanner.Base(scan, "ProgramScanner", **kw)
+ return ps
+
+def _subst_libs(env, libs):
+ """
+ Substitute environment variables and split into list.
+ """
+ if SCons.Util.is_String(libs):
+ libs = env.subst(libs)
+ if SCons.Util.is_String(libs):
+ libs = libs.split()
+ elif SCons.Util.is_Sequence(libs):
+ _libs = []
+ for l in libs:
+ _libs += _subst_libs(env, l)
+ libs = _libs
+ else:
+ # libs is an object (Node, for example)
+ libs = [libs]
+ return libs
+
+def scan(node, env, libpath = ()):
+ """
+ This scanner scans program files for static-library
+ dependencies. It will search the LIBPATH environment variable
+ for libraries specified in the LIBS variable, returning any
+ files it finds as dependencies.
+ """
+ try:
+ libs = env['LIBS']
+ except KeyError:
+ # There are no LIBS in this environment, so just return a null list:
+ return []
+
+ libs = _subst_libs(env, libs)
+
+ try:
+ prefix = env['LIBPREFIXES']
+ if not SCons.Util.is_List(prefix):
+ prefix = [ prefix ]
+ except KeyError:
+ prefix = [ '' ]
+
+ try:
+ suffix = env['LIBSUFFIXES']
+ if not SCons.Util.is_List(suffix):
+ suffix = [ suffix ]
+ except KeyError:
+ suffix = [ '' ]
+
+ pairs = []
+ for suf in map(env.subst, suffix):
+ for pref in map(env.subst, prefix):
+ pairs.append((pref, suf))
+
+ result = []
+
+ if callable(libpath):
+ libpath = libpath()
+
+ find_file = SCons.Node.FS.find_file
+ adjustixes = SCons.Util.adjustixes
+ for lib in libs:
+ if SCons.Util.is_String(lib):
+ for pref, suf in pairs:
+ l = adjustixes(lib, pref, suf)
+ l = find_file(l, libpath, verbose=print_find_libs)
+ if l:
+ result.append(l)
+ else:
+ result.append(lib)
+
+ return result
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Scanner/ProgTests.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Scanner/ProgTests.py
new file mode 100644
index 0000000..e7c791c
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Scanner/ProgTests.py
@@ -0,0 +1,283 @@
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import os.path
+import sys
+import unittest
+
+import TestCmd
+import TestUnit
+
+import SCons.Node.FS
+import SCons.Scanner.Prog
+import SCons.Subst
+
+test = TestCmd.TestCmd(workdir = '')
+
+test.subdir('d1', ['d1', 'd2'], 'dir', ['dir', 'sub'])
+
+libs = [ 'l1.lib', 'd1/l2.lib', 'd1/d2/l3.lib',
+ 'dir/libfoo.a', 'dir/sub/libbar.a', 'dir/libxyz.other']
+
+for h in libs:
+ test.write(h, "\n")
+
+# define some helpers:
+
+class DummyEnvironment(object):
+ def __init__(self, **kw):
+ self._dict = {'LIBSUFFIXES' : '.lib'}
+ self._dict.update(kw)
+ self.fs = SCons.Node.FS.FS(test.workpath(''))
+
+ def Dictionary(self, *args):
+ if not args:
+ return self._dict
+ elif len(args) == 1:
+ return self._dict[args[0]]
+ else:
+ return [self._dict[x] for x in args]
+
+ def has_key(self, key):
+ return key in self.Dictionary()
+
+ def __getitem__(self,key):
+ return self.Dictionary()[key]
+
+ def __setitem__(self,key,value):
+ self.Dictionary()[key] = value
+
+ def __delitem__(self,key):
+ del self.Dictionary()[key]
+
+ def subst(self, s, target=None, source=None, conv=None):
+ return SCons.Subst.scons_subst(s, self, gvars=self._dict, lvars=self._dict)
+
+ def subst_path(self, path, target=None, source=None, conv=None):
+ if not isinstance(path, list):
+ path = [path]
+ return list(map(self.subst, path))
+
+ def get_factory(self, factory):
+ return factory or self.fs.File
+
+ def Dir(self, filename):
+ return self.fs.Dir(test.workpath(filename))
+
+ def File(self, filename):
+ return self.fs.File(test.workpath(filename))
+
+class DummyNode(object):
+ def __init__(self, name):
+ self.name = name
+ def rexists(self):
+ return 1
+ def __str__(self):
+ return self.name
+
+def deps_match(deps, libs):
+ deps=sorted(map(str, deps))
+ libs.sort()
+ return list(map(os.path.normpath, deps)) == list(map(os.path.normpath, libs))
+
+# define some tests:
+
+class ProgramScannerTestCase1(unittest.TestCase):
+ def runTest(self):
+ env = DummyEnvironment(LIBPATH=[ test.workpath("") ],
+ LIBS=[ 'l1', 'l2', 'l3' ])
+ s = SCons.Scanner.Prog.ProgramScanner()
+ path = s.path(env)
+ deps = s(DummyNode('dummy'), env, path)
+ assert deps_match(deps, ['l1.lib']), list(map(str, deps))
+
+ env = DummyEnvironment(LIBPATH=[ test.workpath("") ],
+ LIBS='l1')
+ s = SCons.Scanner.Prog.ProgramScanner()
+ path = s.path(env)
+ deps = s(DummyNode('dummy'), env, path)
+ assert deps_match(deps, ['l1.lib']), list(map(str, deps))
+
+ f1 = env.fs.File(test.workpath('f1'))
+ env = DummyEnvironment(LIBPATH=[ test.workpath("") ],
+ LIBS=[f1])
+ s = SCons.Scanner.Prog.ProgramScanner()
+ path = s.path(env)
+ deps = s(DummyNode('dummy'), env, path)
+ assert deps[0] is f1, deps
+
+ f2 = env.fs.File(test.workpath('f1'))
+ env = DummyEnvironment(LIBPATH=[ test.workpath("") ],
+ LIBS=f2)
+ s = SCons.Scanner.Prog.ProgramScanner()
+ path = s.path(env)
+ deps = s(DummyNode('dummy'), env, path)
+ assert deps[0] is f2, deps
+
+
+class ProgramScannerTestCase2(unittest.TestCase):
+ def runTest(self):
+ env = DummyEnvironment(LIBPATH=list(map(test.workpath,
+ ["", "d1", "d1/d2" ])),
+ LIBS=[ 'l1', 'l2', 'l3' ])
+ s = SCons.Scanner.Prog.ProgramScanner()
+ path = s.path(env)
+ deps = s(DummyNode('dummy'), env, path)
+ assert deps_match(deps, ['l1.lib', 'd1/l2.lib', 'd1/d2/l3.lib' ]), list(map(str, deps))
+
+class ProgramScannerTestCase3(unittest.TestCase):
+ def runTest(self):
+ env = DummyEnvironment(LIBPATH=[test.workpath("d1/d2"),
+ test.workpath("d1")],
+ LIBS='l2 l3'.split())
+ s = SCons.Scanner.Prog.ProgramScanner()
+ path = s.path(env)
+ deps = s(DummyNode('dummy'), env, path)
+ assert deps_match(deps, ['d1/l2.lib', 'd1/d2/l3.lib']), list(map(str, deps))
+
+class ProgramScannerTestCase5(unittest.TestCase):
+ def runTest(self):
+ class SubstEnvironment(DummyEnvironment):
+ def subst(self, arg, target=None, source=None, conv=None, path=test.workpath("d1")):
+ if arg == "$blah":
+ return test.workpath("d1")
+ else:
+ return arg
+ env = SubstEnvironment(LIBPATH=[ "$blah" ],
+ LIBS='l2 l3'.split())
+ s = SCons.Scanner.Prog.ProgramScanner()
+ path = s.path(env)
+ deps = s(DummyNode('dummy'), env, path)
+ assert deps_match(deps, [ 'd1/l2.lib' ]), list(map(str, deps))
+
+class ProgramScannerTestCase6(unittest.TestCase):
+ def runTest(self):
+ env = DummyEnvironment(LIBPATH=[ test.workpath("dir") ],
+ LIBS=['foo', 'sub/libbar', 'xyz.other'],
+ LIBPREFIXES=['lib'],
+ LIBSUFFIXES=['.a'])
+ s = SCons.Scanner.Prog.ProgramScanner()
+ path = s.path(env)
+ deps = s(DummyNode('dummy'), env, path)
+ assert deps_match(deps, ['dir/libfoo.a', 'dir/sub/libbar.a', 'dir/libxyz.other']), list(map(str, deps))
+
+class ProgramScannerTestCase7(unittest.TestCase):
+ def runTest(self):
+ env = DummyEnvironment(LIBPATH=[ test.workpath("dir") ],
+ LIBS=['foo', '$LIBBAR', '$XYZ'],
+ LIBPREFIXES=['lib'],
+ LIBSUFFIXES=['.a'],
+ LIBBAR='sub/libbar',
+ XYZ='xyz.other')
+ s = SCons.Scanner.Prog.ProgramScanner()
+ path = s.path(env)
+ deps = s(DummyNode('dummy'), env, path)
+ assert deps_match(deps, ['dir/libfoo.a', 'dir/sub/libbar.a', 'dir/libxyz.other']), list(map(str, deps))
+
+class ProgramScannerTestCase8(unittest.TestCase):
+ def runTest(self):
+
+ n1 = DummyNode('n1')
+ env = DummyEnvironment(LIBPATH=[ test.workpath("dir") ],
+ LIBS=[n1],
+ LIBPREFIXES=['p1-', 'p2-'],
+ LIBSUFFIXES=['.1', '2'])
+ s = SCons.Scanner.Prog.ProgramScanner(node_class = DummyNode)
+ path = s.path(env)
+ deps = s(DummyNode('dummy'), env, path)
+ assert deps == [n1], deps
+
+ n2 = DummyNode('n2')
+ env = DummyEnvironment(LIBPATH=[ test.workpath("dir") ],
+ LIBS=[n1, [n2]],
+ LIBPREFIXES=['p1-', 'p2-'],
+ LIBSUFFIXES=['.1', '2'])
+ s = SCons.Scanner.Prog.ProgramScanner(node_class = DummyNode)
+ path = s.path(env)
+ deps = s(DummyNode('dummy'), env, path)
+ assert deps == [n1, n2], deps
+
+class ProgramScannerTestCase9(unittest.TestCase):
+ def runTest(self):
+ env = DummyEnvironment(LIBPATH=[ test.workpath("dir") ],
+ LIBS=['foo', '$LIBBAR'],
+ LIBPREFIXES=['lib'],
+ LIBSUFFIXES=['.a'],
+ LIBBAR=['sub/libbar', 'xyz.other'])
+ s = SCons.Scanner.Prog.ProgramScanner()
+ path = s.path(env)
+ deps = s(DummyNode('dummy'), env, path)
+ assert deps_match(deps, ['dir/libfoo.a', 'dir/sub/libbar.a', 'dir/libxyz.other']), list(map(str, deps))
+
+class ProgramScannerTestCase10(unittest.TestCase):
+ def runTest(self):
+ env = DummyEnvironment(LIBPATH=[ test.workpath("dir") ],
+ LIBS=['foo', '$LIBBAR'],
+ LIBPREFIXES=['lib'],
+ LIBSUFFIXES=['.a'],
+ LIBBAR='sub/libbar $LIBBAR2',
+ LIBBAR2=['xyz.other'])
+ s = SCons.Scanner.Prog.ProgramScanner()
+ path = s.path(env)
+ deps = s(DummyNode('dummy'), env, path)
+ assert deps_match(deps, ['dir/libfoo.a', 'dir/sub/libbar.a', 'dir/libxyz.other']), list(map(str, deps))
+
+def suite():
+ suite = unittest.TestSuite()
+ suite.addTest(ProgramScannerTestCase1())
+ suite.addTest(ProgramScannerTestCase2())
+ suite.addTest(ProgramScannerTestCase3())
+ suite.addTest(ProgramScannerTestCase5())
+ suite.addTest(ProgramScannerTestCase6())
+ suite.addTest(ProgramScannerTestCase7())
+ suite.addTest(ProgramScannerTestCase8())
+ suite.addTest(ProgramScannerTestCase9())
+ suite.addTest(ProgramScannerTestCase10())
+ try: unicode
+ except NameError: pass
+ else:
+ code = """if 1:
+ class ProgramScannerTestCase4(unittest.TestCase):
+ def runTest(self):
+ env = DummyEnvironment(LIBPATH=[test.workpath("d1/d2"),
+ test.workpath("d1")],
+ LIBS=u'l2 l3'.split())
+ s = SCons.Scanner.Prog.ProgramScanner()
+ path = s.path(env)
+ deps = s(DummyNode('dummy'), env, path)
+ assert deps_match(deps, ['d1/l2.lib', 'd1/d2/l3.lib']), map(str, deps)
+ suite.addTest(ProgramScannerTestCase4())
+ \n"""
+ exec(code)
+ return suite
+
+if __name__ == "__main__":
+ TestUnit.run(suite())
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Scanner/RC.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Scanner/RC.py
new file mode 100644
index 0000000..82f8ddc
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Scanner/RC.py
@@ -0,0 +1,66 @@
+"""SCons.Scanner.RC
+
+This module implements the dependency scanner for RC (Interface
+Definition Language) files.
+
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import re
+
+import SCons.Node.FS
+import SCons.Scanner
+
+
+def no_tlb(nodes):
+ """
+ Filter out .tlb files as they are binary and shouldn't be scanned
+ """
+ # print("Nodes:%s"%[str(n) for n in nodes])
+ return [n for n in nodes if str(n)[-4:] != '.tlb']
+
+
+def RCScan():
+ """Return a prototype Scanner instance for scanning RC source files"""
+
+ res_re= r'^(?:\s*#\s*(?:include)|' \
+ '.*?\s+(?:ICON|BITMAP|CURSOR|HTML|FONT|MESSAGETABLE|TYPELIB|REGISTRY|D3DFX)' \
+ '\s*.*?)' \
+ '\s*(<|"| )([^>"\s]+)(?:[>"\s])*$'
+ resScanner = SCons.Scanner.ClassicCPP("ResourceScanner",
+ "$RCSUFFIXES",
+ "CPPPATH",
+ res_re,
+ recursive=no_tlb)
+
+ return resScanner
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Scanner/RCTests.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Scanner/RCTests.py
new file mode 100644
index 0000000..2864026
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Scanner/RCTests.py
@@ -0,0 +1,176 @@
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import unittest
+import sys
+import collections
+import os
+
+import TestCmd
+import TestUnit
+
+import SCons.Scanner.RC
+import SCons.Node.FS
+import SCons.Warnings
+
+test = TestCmd.TestCmd(workdir = '')
+
+os.chdir(test.workpath(''))
+
+# create some source files and headers:
+
+test.write('t1.rc','''
+#include "t1.h"
+''')
+
+test.write('t2.rc',"""
+#include "t1.h"
+ICO_TEST ICON DISCARDABLE "abc.ico"
+BMP_TEST BITMAP DISCARDABLE "def.bmp"
+cursor1 CURSOR "bullseye.cur"
+ID_RESPONSE_ERROR_PAGE HTML "responseerrorpage.htm"
+5 FONT "cmroman.fnt"
+1 MESSAGETABLE "MSG00409.bin"
+1 MESSAGETABLE MSG00410.bin
+1 TYPELIB "testtypelib.tlb"
+TEST_REGIS REGISTRY MOVEABLE PURE "testregis.rgs"
+TEST_D3DFX D3DFX DISCARDABLE "testEffect.fx"
+
+""")
+
+test.write('t3.rc','#include "t1.h"\r\n')
+
+# Create dummy include files
+headers = ['t1.h',
+ 'abc.ico','def.bmp','bullseye.cur','responseerrorpage.htm','cmroman.fnt',
+ 'testEffect.fx',
+ 'MSG00409.bin','MSG00410.bin','testtypelib.tlb','testregis.rgs']
+
+for h in headers:
+ test.write(h, " ")
+
+
+# define some helpers:
+
+class DummyEnvironment(collections.UserDict):
+ def __init__(self,**kw):
+ collections.UserDict.__init__(self)
+ self.data.update(kw)
+ self.fs = SCons.Node.FS.FS(test.workpath(''))
+
+ def Dictionary(self, *args):
+ return self.data
+
+ def subst(self, arg, target=None, source=None, conv=None):
+ if strSubst[0] == '$':
+ return self.data[strSubst[1:]]
+ return strSubst
+
+ def subst_path(self, path, target=None, source=None, conv=None):
+ if not isinstance(path, list):
+ path = [path]
+ return list(map(self.subst, path))
+
+ def has_key(self, key):
+ return key in self.Dictionary()
+
+ def get_calculator(self):
+ return None
+
+ def get_factory(self, factory):
+ return factory or self.fs.File
+
+ def Dir(self, filename):
+ return self.fs.Dir(filename)
+
+ def File(self, filename):
+ return self.fs.File(filename)
+
+global my_normpath
+my_normpath = os.path.normpath
+
+if os.path.normcase('foo') == os.path.normcase('FOO'):
+ my_normpath = os.path.normcase
+
+def deps_match(self, deps, headers):
+ scanned = sorted(map(my_normpath, list(map(str, deps))))
+ expect = sorted(map(my_normpath, headers))
+ self.failUnless(scanned == expect, "expect %s != scanned %s" % (expect, scanned))
+
+# define some tests:
+
+class RCScannerTestCase1(unittest.TestCase):
+ def runTest(self):
+ path = []
+ env = DummyEnvironment(RCSUFFIXES=['.rc','.rc2'],
+ CPPPATH=path)
+ s = SCons.Scanner.RC.RCScan()
+ deps = s(env.File('t1.rc'), env, path)
+ headers = ['t1.h']
+ deps_match(self, deps, headers)
+
+class RCScannerTestCase2(unittest.TestCase):
+ def runTest(self):
+ path = []
+ env = DummyEnvironment(RCSUFFIXES=['.rc','.rc2'],
+ CPPPATH=path)
+ s = SCons.Scanner.RC.RCScan()
+ deps = s(env.File('t2.rc'), env, path)
+ headers = ['MSG00410.bin',
+ 'abc.ico','bullseye.cur',
+ 'cmroman.fnt','def.bmp',
+ 'MSG00409.bin',
+ 'responseerrorpage.htm',
+ 't1.h',
+ 'testEffect.fx',
+ 'testregis.rgs','testtypelib.tlb']
+ deps_match(self, deps, headers)
+
+class RCScannerTestCase3(unittest.TestCase):
+ def runTest(self):
+ path = []
+ env = DummyEnvironment(RCSUFFIXES=['.rc','.rc2'],
+ CPPPATH=path)
+ s = SCons.Scanner.RC.RCScan()
+ deps = s(env.File('t3.rc'), env, path)
+ headers = ['t1.h']
+ deps_match(self, deps, headers)
+
+
+def suite():
+ suite = unittest.TestSuite()
+ suite.addTest(RCScannerTestCase1())
+ suite.addTest(RCScannerTestCase2())
+ suite.addTest(RCScannerTestCase3())
+ return suite
+
+if __name__ == "__main__":
+ TestUnit.run(suite())
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Scanner/SWIG.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Scanner/SWIG.py
new file mode 100644
index 0000000..2650e4b
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Scanner/SWIG.py
@@ -0,0 +1,45 @@
+"""SCons.Scanner.SWIG
+
+This module implements the dependency scanner for SWIG code.
+
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import SCons.Scanner
+
+SWIGSuffixes = [ '.i' ]
+
+def SWIGScanner():
+ expr = '^[ \t]*%[ \t]*(?:include|import|extern)[ \t]*(<|"?)([^>\s"]+)(?:>|"?)'
+ scanner = SCons.Scanner.ClassicCPP("SWIGScanner", ".i", "SWIGPATH", expr)
+ return scanner
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Scanner/ScannerTests.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Scanner/ScannerTests.py
new file mode 100644
index 0000000..8050216
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Scanner/ScannerTests.py
@@ -0,0 +1,634 @@
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import SCons.compat
+
+import collections
+import sys
+import unittest
+
+import TestUnit
+
+import SCons.Scanner
+
+class DummyFS(object):
+ def File(self, name):
+ return DummyNode(name)
+
+class DummyEnvironment(collections.UserDict):
+ def __init__(self, dict=None, **kw):
+ collections.UserDict.__init__(self, dict)
+ self.data.update(kw)
+ self.fs = DummyFS()
+ def subst(self, strSubst, target=None, source=None, conv=None):
+ if strSubst[0] == '$':
+ return self.data[strSubst[1:]]
+ return strSubst
+ def subst_list(self, strSubst, target=None, source=None, conv=None):
+ if strSubst[0] == '$':
+ return [self.data[strSubst[1:]]]
+ return [[strSubst]]
+ def subst_path(self, path, target=None, source=None, conv=None):
+ if not isinstance(path, list):
+ path = [path]
+ return list(map(self.subst, path))
+ def get_factory(self, factory):
+ return factory or self.fs.File
+
+class DummyNode(object):
+ def __init__(self, name, search_result=()):
+ self.name = name
+ self.search_result = tuple(search_result)
+ def rexists(self):
+ return 1
+ def __str__(self):
+ return self.name
+ def Rfindalldirs(self, pathlist):
+ return self.search_result + pathlist
+
+class FindPathDirsTestCase(unittest.TestCase):
+ def test_FindPathDirs(self):
+ """Test the FindPathDirs callable class"""
+
+ env = DummyEnvironment(LIBPATH = [ 'foo' ])
+ env.fs = DummyFS()
+ env.fs._cwd = DummyNode('cwd')
+
+ dir = DummyNode('dir', ['xxx'])
+ fpd = SCons.Scanner.FindPathDirs('LIBPATH')
+ result = fpd(env)
+ assert str(result) == "('foo',)", result
+ result = fpd(env, dir)
+ assert str(result) == "('xxx', 'foo')", result
+
+class ScannerTestCase(unittest.TestCase):
+
+ def test_creation(self):
+ """Test creation of Scanner objects"""
+ def func(self):
+ pass
+ s = SCons.Scanner.Base(func)
+ assert isinstance(s, SCons.Scanner.Base), s
+ s = SCons.Scanner.Base({})
+ assert isinstance(s, SCons.Scanner.Base), s
+
+ s = SCons.Scanner.Base(func, name='fooscan')
+ assert str(s) == 'fooscan', str(s)
+ s = SCons.Scanner.Base({}, name='barscan')
+ assert str(s) == 'barscan', str(s)
+
+ s = SCons.Scanner.Base(func, name='fooscan', argument=9)
+ assert str(s) == 'fooscan', str(s)
+ assert s.argument == 9, s.argument
+ s = SCons.Scanner.Base({}, name='fooscan', argument=888)
+ assert str(s) == 'fooscan', str(s)
+ assert s.argument == 888, s.argument
+
+
+class BaseTestCase(unittest.TestCase):
+
+ class skey_node(object):
+ def __init__(self, key):
+ self.key = key
+ def scanner_key(self):
+ return self.key
+ def rexists(self):
+ return 1
+
+ def func(self, filename, env, target, *args):
+ self.filename = filename
+ self.env = env
+ self.target = target
+
+ if len(args) > 0:
+ self.arg = args[0]
+
+ return self.deps
+
+ def test(self, scanner, env, filename, deps, *args):
+ self.deps = deps
+ path = scanner.path(env)
+ scanned = scanner(filename, env, path)
+ scanned_strs = [str(x) for x in scanned]
+
+ self.failUnless(self.filename == filename, "the filename was passed incorrectly")
+ self.failUnless(self.env == env, "the environment was passed incorrectly")
+ self.failUnless(scanned_strs == deps, "the dependencies were returned incorrectly")
+ for d in scanned:
+ self.failUnless(not isinstance(d, str), "got a string in the dependencies")
+
+ if len(args) > 0:
+ self.failUnless(self.arg == args[0], "the argument was passed incorrectly")
+ else:
+ self.failIf(hasattr(self, "arg"), "an argument was given when it shouldn't have been")
+
+ def test___call__dict(self):
+ """Test calling Scanner.Base objects with a dictionary"""
+ called = []
+ def s1func(node, env, path, called=called):
+ called.append('s1func')
+ called.append(node)
+ return []
+ def s2func(node, env, path, called=called):
+ called.append('s2func')
+ called.append(node)
+ return []
+ s1 = SCons.Scanner.Base(s1func)
+ s2 = SCons.Scanner.Base(s2func)
+ selector = SCons.Scanner.Base({'.x' : s1, '.y' : s2})
+ nx = self.skey_node('.x')
+ env = DummyEnvironment()
+ selector(nx, env, [])
+ assert called == ['s1func', nx], called
+ del called[:]
+ ny = self.skey_node('.y')
+ selector(ny, env, [])
+ assert called == ['s2func', ny], called
+
+ def test_path(self):
+ """Test the Scanner.Base path() method"""
+ def pf(env, cwd, target, source, argument=None):
+ return "pf: %s %s %s %s %s" % \
+ (env.VARIABLE, cwd, target[0], source[0], argument)
+
+ env = DummyEnvironment()
+ env.VARIABLE = 'v1'
+ target = DummyNode('target')
+ source = DummyNode('source')
+
+ s = SCons.Scanner.Base(self.func, path_function=pf)
+ p = s.path(env, 'here', [target], [source])
+ assert p == "pf: v1 here target source None", p
+
+ s = SCons.Scanner.Base(self.func, path_function=pf, argument="xyz")
+ p = s.path(env, 'here', [target], [source])
+ assert p == "pf: v1 here target source xyz", p
+
+ def test_positional(self):
+ """Test the Scanner.Base class using positional arguments"""
+ s = SCons.Scanner.Base(self.func, "Pos")
+ env = DummyEnvironment()
+ env.VARIABLE = "var1"
+ self.test(s, env, DummyNode('f1.cpp'), ['f1.h', 'f1.hpp'])
+
+ env = DummyEnvironment()
+ env.VARIABLE = "i1"
+ self.test(s, env, DummyNode('i1.cpp'), ['i1.h', 'i1.hpp'])
+
+ def test_keywords(self):
+ """Test the Scanner.Base class using keyword arguments"""
+ s = SCons.Scanner.Base(function = self.func, name = "Key")
+ env = DummyEnvironment()
+ env.VARIABLE = "var2"
+ self.test(s, env, DummyNode('f2.cpp'), ['f2.h', 'f2.hpp'])
+
+ env = DummyEnvironment()
+ env.VARIABLE = "i2"
+
+ self.test(s, env, DummyNode('i2.cpp'), ['i2.h', 'i2.hpp'])
+
+ def test_pos_opt(self):
+ """Test the Scanner.Base class using both position and optional arguments"""
+ arg = "this is the argument"
+ s = SCons.Scanner.Base(self.func, "PosArg", arg)
+ env = DummyEnvironment()
+ env.VARIABLE = "var3"
+ self.test(s, env, DummyNode('f3.cpp'), ['f3.h', 'f3.hpp'], arg)
+
+ env = DummyEnvironment()
+ env.VARIABLE = "i3"
+ self.test(s, env, DummyNode('i3.cpp'), ['i3.h', 'i3.hpp'], arg)
+
+ def test_key_opt(self):
+ """Test the Scanner.Base class using both keyword and optional arguments"""
+ arg = "this is another argument"
+ s = SCons.Scanner.Base(function = self.func, name = "KeyArg",
+ argument = arg)
+ env = DummyEnvironment()
+ env.VARIABLE = "var4"
+ self.test(s, env, DummyNode('f4.cpp'), ['f4.h', 'f4.hpp'], arg)
+
+ env = DummyEnvironment()
+ env.VARIABLE = "i4"
+ self.test(s, env, DummyNode('i4.cpp'), ['i4.h', 'i4.hpp'], arg)
+
+ def test___cmp__(self):
+ """Test the Scanner.Base class __cmp__() method"""
+ s = SCons.Scanner.Base(self.func, "Cmp")
+ assert s != None
+
+ def test_hash(self):
+ """Test the Scanner.Base class __hash__() method"""
+ s = SCons.Scanner.Base(self.func, "Hash")
+ dict = {}
+ dict[s] = 777
+ i = hash(id(s))
+ h = hash(list(dict.keys())[0])
+ self.failUnless(h == i,
+ "hash Scanner base class expected %s, got %s" % (i, h))
+
+ def test_scan_check(self):
+ """Test the Scanner.Base class scan_check() method"""
+ def my_scan(filename, env, target, *args):
+ return []
+ def check(node, env, s=self):
+ s.checked[str(node)] = 1
+ return 1
+ env = DummyEnvironment()
+ s = SCons.Scanner.Base(my_scan, "Check", scan_check = check)
+ self.checked = {}
+ path = s.path(env)
+ scanned = s(DummyNode('x'), env, path)
+ self.failUnless(self.checked['x'] == 1,
+ "did not call check function")
+
+ def test_recursive(self):
+ """Test the Scanner.Base class recursive flag"""
+ nodes = [1, 2, 3, 4]
+
+ s = SCons.Scanner.Base(function = self.func)
+ n = s.recurse_nodes(nodes)
+ self.failUnless(n == [],
+ "default behavior returned nodes: %s" % n)
+
+ s = SCons.Scanner.Base(function = self.func, recursive = None)
+ n = s.recurse_nodes(nodes)
+ self.failUnless(n == [],
+ "recursive = None returned nodes: %s" % n)
+
+ s = SCons.Scanner.Base(function = self.func, recursive = 1)
+ n = s.recurse_nodes(nodes)
+ self.failUnless(n == n,
+ "recursive = 1 didn't return all nodes: %s" % n)
+
+ def odd_only(nodes):
+ return [n for n in nodes if n % 2]
+ s = SCons.Scanner.Base(function = self.func, recursive = odd_only)
+ n = s.recurse_nodes(nodes)
+ self.failUnless(n == [1, 3],
+ "recursive = 1 didn't return all nodes: %s" % n)
+
+ def test_get_skeys(self):
+ """Test the Scanner.Base get_skeys() method"""
+ s = SCons.Scanner.Base(function = self.func)
+ sk = s.get_skeys()
+ self.failUnless(sk == [],
+ "did not initialize to expected []")
+
+ s = SCons.Scanner.Base(function = self.func, skeys = ['.1', '.2'])
+ sk = s.get_skeys()
+ self.failUnless(sk == ['.1', '.2'],
+ "sk was %s, not ['.1', '.2']")
+
+ s = SCons.Scanner.Base(function = self.func, skeys = '$LIST')
+ env = DummyEnvironment(LIST = ['.3', '.4'])
+ sk = s.get_skeys(env)
+ self.failUnless(sk == ['.3', '.4'],
+ "sk was %s, not ['.3', '.4']")
+
+ def test_select(self):
+ """Test the Scanner.Base select() method"""
+ scanner = SCons.Scanner.Base(function = self.func)
+ s = scanner.select('.x')
+ assert s is scanner, s
+
+ selector = SCons.Scanner.Base({'.x' : 1, '.y' : 2})
+ s = selector.select(self.skey_node('.x'))
+ assert s == 1, s
+ s = selector.select(self.skey_node('.y'))
+ assert s == 2, s
+ s = selector.select(self.skey_node('.z'))
+ assert s is None, s
+
+ def test_add_scanner(self):
+ """Test the Scanner.Base add_scanner() method"""
+ selector = SCons.Scanner.Base({'.x' : 1, '.y' : 2})
+ s = selector.select(self.skey_node('.z'))
+ assert s is None, s
+ selector.add_scanner('.z', 3)
+ s = selector.select(self.skey_node('.z'))
+ assert s == 3, s
+
+ def test___str__(self):
+ """Test the Scanner.Base __str__() method"""
+ scanner = SCons.Scanner.Base(function = self.func)
+ s = str(scanner)
+ assert s == 'NONE', s
+ scanner = SCons.Scanner.Base(function = self.func, name = 'xyzzy')
+ s = str(scanner)
+ assert s == 'xyzzy', s
+
+class SelectorTestCase(unittest.TestCase):
+ class skey_node(object):
+ def __init__(self, key):
+ self.key = key
+ def scanner_key(self):
+ return self.key
+ def rexists(self):
+ return 1
+
+ def test___init__(self):
+ """Test creation of Scanner.Selector object"""
+ s = SCons.Scanner.Selector({})
+ assert isinstance(s, SCons.Scanner.Selector), s
+ assert s.dict == {}, s.dict
+
+ def test___call__(self):
+ """Test calling Scanner.Selector objects"""
+ called = []
+ def s1func(node, env, path, called=called):
+ called.append('s1func')
+ called.append(node)
+ return []
+ def s2func(node, env, path, called=called):
+ called.append('s2func')
+ called.append(node)
+ return []
+ s1 = SCons.Scanner.Base(s1func)
+ s2 = SCons.Scanner.Base(s2func)
+ selector = SCons.Scanner.Selector({'.x' : s1, '.y' : s2})
+ nx = self.skey_node('.x')
+ env = DummyEnvironment()
+ selector(nx, env, [])
+ assert called == ['s1func', nx], called
+ del called[:]
+ ny = self.skey_node('.y')
+ selector(ny, env, [])
+ assert called == ['s2func', ny], called
+
+ def test_select(self):
+ """Test the Scanner.Selector select() method"""
+ selector = SCons.Scanner.Selector({'.x' : 1, '.y' : 2})
+ s = selector.select(self.skey_node('.x'))
+ assert s == 1, s
+ s = selector.select(self.skey_node('.y'))
+ assert s == 2, s
+ s = selector.select(self.skey_node('.z'))
+ assert s is None, s
+
+ def test_add_scanner(self):
+ """Test the Scanner.Selector add_scanner() method"""
+ selector = SCons.Scanner.Selector({'.x' : 1, '.y' : 2})
+ s = selector.select(self.skey_node('.z'))
+ assert s is None, s
+ selector.add_scanner('.z', 3)
+ s = selector.select(self.skey_node('.z'))
+ assert s == 3, s
+
+class CurrentTestCase(unittest.TestCase):
+ def test_class(self):
+ """Test the Scanner.Current class"""
+ class MyNode(object):
+ def __init__(self):
+ self.called_has_builder = None
+ self.called_is_up_to_date = None
+ self.func_called = None
+ def rexists(self):
+ return 1
+ class HasNoBuilder(MyNode):
+ def has_builder(self):
+ self.called_has_builder = 1
+ return None
+ class IsNotCurrent(MyNode):
+ def has_builder(self):
+ self.called_has_builder = 1
+ return 1
+ def is_up_to_date(self):
+ self.called_is_up_to_date = 1
+ return None
+ class IsCurrent(MyNode):
+ def has_builder(self):
+ self.called_has_builder = 1
+ return 1
+ def is_up_to_date(self):
+ self.called_is_up_to_date = 1
+ return 1
+ def func(node, env, path):
+ node.func_called = 1
+ return []
+ env = DummyEnvironment()
+ s = SCons.Scanner.Current(func)
+ path = s.path(env)
+ hnb = HasNoBuilder()
+ s(hnb, env, path)
+ self.failUnless(hnb.called_has_builder, "did not call has_builder()")
+ self.failUnless(not hnb.called_is_up_to_date, "did call is_up_to_date()")
+ self.failUnless(hnb.func_called, "did not call func()")
+ inc = IsNotCurrent()
+ s(inc, env, path)
+ self.failUnless(inc.called_has_builder, "did not call has_builder()")
+ self.failUnless(inc.called_is_up_to_date, "did not call is_up_to_date()")
+ self.failUnless(not inc.func_called, "did call func()")
+ ic = IsCurrent()
+ s(ic, env, path)
+ self.failUnless(ic.called_has_builder, "did not call has_builder()")
+ self.failUnless(ic.called_is_up_to_date, "did not call is_up_to_date()")
+ self.failUnless(ic.func_called, "did not call func()")
+
+class ClassicTestCase(unittest.TestCase):
+
+ def func(self, filename, env, target, *args):
+ self.filename = filename
+ self.env = env
+ self.target = target
+
+ if len(args) > 0:
+ self.arg = args[0]
+
+ return self.deps
+
+ def test_find_include(self):
+ """Test the Scanner.Classic find_include() method"""
+ env = DummyEnvironment()
+ s = SCons.Scanner.Classic("t", ['.suf'], 'MYPATH', '^my_inc (\S+)')
+
+ def _find_file(filename, paths):
+ return paths[0]+'/'+filename
+
+ save = SCons.Node.FS.find_file
+ SCons.Node.FS.find_file = _find_file
+
+ try:
+ n, i = s.find_include('aaa', 'foo', ('path',))
+ assert n == 'foo/aaa', n
+ assert i == 'aaa', i
+
+ finally:
+ SCons.Node.FS.find_file = save
+
+ def test_name(self):
+ """Test setting the Scanner.Classic name"""
+ s = SCons.Scanner.Classic("my_name", ['.s'], 'MYPATH', '^my_inc (\S+)')
+ assert s.name == "my_name", s.name
+
+ def test_scan(self):
+ """Test the Scanner.Classic scan() method"""
+ class MyNode(object):
+ def __init__(self, name):
+ self.name = name
+ self._rfile = self
+ self.includes = None
+ def rfile(self):
+ return self._rfile
+ def exists(self):
+ return self._exists
+ def get_contents(self):
+ return self._contents
+ def get_text_contents(self):
+ return self._contents
+ def get_dir(self):
+ return self._dir
+
+ class MyScanner(SCons.Scanner.Classic):
+ def find_include(self, include, source_dir, path):
+ return include, include
+
+ env = DummyEnvironment()
+ s = MyScanner("t", ['.suf'], 'MYPATH', '^my_inc (\S+)')
+
+ # This set of tests is intended to test the scanning operation
+ # of the Classic scanner.
+
+ # Note that caching has been added for not just the includes
+ # but the entire scan call. The caching is based on the
+ # arguments, so we will fiddle with the path parameter to
+ # defeat this caching for the purposes of these tests.
+
+ # If the node doesn't exist, scanning turns up nothing.
+ n1 = MyNode("n1")
+ n1._exists = None
+ ret = s.function(n1, env)
+ assert ret == [], ret
+
+ # Verify that it finds includes from the contents.
+ n = MyNode("n")
+ n._exists = 1
+ n._dir = MyNode("n._dir")
+ n._contents = 'my_inc abc\n'
+ ret = s.function(n, env, ('foo',))
+ assert ret == ['abc'], ret
+
+ # Verify that it uses the cached include info.
+ n._contents = 'my_inc def\n'
+ ret = s.function(n, env, ('foo2',))
+ assert ret == ['abc'], ret
+
+ # Verify that if we wipe the cache, it uses the new contents.
+ n.includes = None
+ ret = s.function(n, env, ('foo3',))
+ assert ret == ['def'], ret
+
+ # We no longer cache overall scan results, which would be returned
+ # if individual results are de-cached. If we ever restore that
+ # functionality, this test goes back here.
+ #ret = s.function(n, env, ('foo2',))
+ #assert ret == ['abc'], 'caching inactive; got: %s'%ret
+
+ # Verify that it sorts what it finds.
+ n.includes = ['xyz', 'uvw']
+ ret = s.function(n, env, ('foo4',))
+ assert ret == ['uvw', 'xyz'], ret
+
+ # Verify that we use the rfile() node.
+ nr = MyNode("nr")
+ nr._exists = 1
+ nr._dir = MyNode("nr._dir")
+ nr.includes = ['jkl', 'mno']
+ n._rfile = nr
+ ret = s.function(n, env, ('foo5',))
+ assert ret == ['jkl', 'mno'], ret
+
+ def test_recursive(self):
+ """Test the Scanner.Classic class recursive flag"""
+ nodes = [1, 2, 3, 4]
+
+
+ s = SCons.Scanner.Classic("Test", [], None, "", function=self.func, recursive=1)
+ n = s.recurse_nodes(nodes)
+ self.failUnless(n == n,
+ "recursive = 1 didn't return all nodes: %s" % n)
+
+ def odd_only(nodes):
+ return [n for n in nodes if n % 2]
+
+ s = SCons.Scanner.Classic("Test", [], None, "", function=self.func, recursive=odd_only)
+ n = s.recurse_nodes(nodes)
+ self.failUnless(n == [1, 3],
+ "recursive = 1 didn't return all nodes: %s" % n)
+
+
+
+
+class ClassicCPPTestCase(unittest.TestCase):
+ def test_find_include(self):
+ """Test the Scanner.ClassicCPP find_include() method"""
+ env = DummyEnvironment()
+ s = SCons.Scanner.ClassicCPP("Test", [], None, "")
+
+ def _find_file(filename, paths):
+ return paths[0]+'/'+filename
+
+ save = SCons.Node.FS.find_file
+ SCons.Node.FS.find_file = _find_file
+
+ try:
+ n, i = s.find_include(('"', 'aaa'), 'foo', ('path',))
+ assert n == 'foo/aaa', n
+ assert i == 'aaa', i
+
+ n, i = s.find_include(('<', 'bbb'), 'foo', ('path',))
+ assert n == 'path/bbb', n
+ assert i == 'bbb', i
+
+ n, i = s.find_include(('<', u'ccc'), 'foo', ('path',))
+ assert n == 'path/ccc', n
+ assert i == 'ccc', i
+
+ finally:
+ SCons.Node.FS.find_file = save
+
+def suite():
+ suite = unittest.TestSuite()
+ tclasses = [
+ FindPathDirsTestCase,
+ ScannerTestCase,
+ BaseTestCase,
+ SelectorTestCase,
+ CurrentTestCase,
+ ClassicTestCase,
+ ClassicCPPTestCase,
+ ]
+ for tclass in tclasses:
+ names = unittest.getTestCaseNames(tclass, 'test_')
+ suite.addTests(list(map(tclass, names)))
+ return suite
+
+if __name__ == "__main__":
+ TestUnit.run(suite())
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Scanner/__init__.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Scanner/__init__.py
new file mode 100644
index 0000000..f7828ab
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Scanner/__init__.py
@@ -0,0 +1,421 @@
+"""SCons.Scanner
+
+The Scanner package for the SCons software construction utility.
+
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import re
+
+import SCons.Node.FS
+import SCons.Util
+
+
+class _Null(object):
+ pass
+
+# This is used instead of None as a default argument value so None can be
+# used as an actual argument value.
+_null = _Null
+
+def Scanner(function, *args, **kw):
+ """
+ Public interface factory function for creating different types
+ of Scanners based on the different types of "functions" that may
+ be supplied.
+
+ TODO: Deprecate this some day. We've moved the functionality
+ inside the Base class and really don't need this factory function
+ any more. It was, however, used by some of our Tool modules, so
+ the call probably ended up in various people's custom modules
+ patterned on SCons code.
+ """
+ if SCons.Util.is_Dict(function):
+ return Selector(function, *args, **kw)
+ else:
+ return Base(function, *args, **kw)
+
+
+
+class FindPathDirs(object):
+ """
+ A class to bind a specific E{*}PATH variable name to a function that
+ will return all of the E{*}path directories.
+ """
+ def __init__(self, variable):
+ self.variable = variable
+ def __call__(self, env, dir=None, target=None, source=None, argument=None):
+ import SCons.PathList
+ try:
+ path = env[self.variable]
+ except KeyError:
+ return ()
+
+ dir = dir or env.fs._cwd
+ path = SCons.PathList.PathList(path).subst_path(env, target, source)
+ return tuple(dir.Rfindalldirs(path))
+
+
+
+class Base(object):
+ """
+ The base class for dependency scanners. This implements
+ straightforward, single-pass scanning of a single file.
+ """
+
+ def __init__(self,
+ function,
+ name = "NONE",
+ argument = _null,
+ skeys = _null,
+ path_function = None,
+ # Node.FS.Base so that, by default, it's okay for a
+ # scanner to return a Dir, File or Entry.
+ node_class = SCons.Node.FS.Base,
+ node_factory = None,
+ scan_check = None,
+ recursive = None):
+ """
+ Construct a new scanner object given a scanner function.
+
+ 'function' - a scanner function taking two or three
+ arguments and returning a list of strings.
+
+ 'name' - a name for identifying this scanner object.
+
+ 'argument' - an optional argument that, if specified, will be
+ passed to both the scanner function and the path_function.
+
+ 'skeys' - an optional list argument that can be used to determine
+ which scanner should be used for a given Node. In the case of File
+ nodes, for example, the 'skeys' would be file suffixes.
+
+ 'path_function' - a function that takes four or five arguments
+ (a construction environment, Node for the directory containing
+ the SConscript file that defined the primary target, list of
+ target nodes, list of source nodes, and optional argument for
+ this instance) and returns a tuple of the directories that can
+ be searched for implicit dependency files. May also return a
+ callable() which is called with no args and returns the tuple
+ (supporting Bindable class).
+
+ 'node_class' - the class of Nodes which this scan will return.
+ If node_class is None, then this scanner will not enforce any
+ Node conversion and will return the raw results from the
+ underlying scanner function.
+
+ 'node_factory' - the factory function to be called to translate
+ the raw results returned by the scanner function into the
+ expected node_class objects.
+
+ 'scan_check' - a function to be called to first check whether
+ this node really needs to be scanned.
+
+ 'recursive' - specifies that this scanner should be invoked
+ recursively on all of the implicit dependencies it returns
+ (the canonical example being #include lines in C source files).
+ May be a callable, which will be called to filter the list
+ of nodes found to select a subset for recursive scanning
+ (the canonical example being only recursively scanning
+ subdirectories within a directory).
+
+ The scanner function's first argument will be a Node that should
+ be scanned for dependencies, the second argument will be an
+ Environment object, the third argument will be the tuple of paths
+ returned by the path_function, and the fourth argument will be
+ the value passed into 'argument', and the returned list should
+ contain the Nodes for all the direct dependencies of the file.
+
+ Examples:
+
+ s = Scanner(my_scanner_function)
+
+ s = Scanner(function = my_scanner_function)
+
+ s = Scanner(function = my_scanner_function, argument = 'foo')
+
+ """
+
+ # Note: this class could easily work with scanner functions that take
+ # something other than a filename as an argument (e.g. a database
+ # node) and a dependencies list that aren't file names. All that
+ # would need to be changed is the documentation.
+
+ self.function = function
+ self.path_function = path_function
+ self.name = name
+ self.argument = argument
+
+ if skeys is _null:
+ if SCons.Util.is_Dict(function):
+ skeys = list(function.keys())
+ else:
+ skeys = []
+ self.skeys = skeys
+
+ self.node_class = node_class
+ self.node_factory = node_factory
+ self.scan_check = scan_check
+ if callable(recursive):
+ self.recurse_nodes = recursive
+ elif recursive:
+ self.recurse_nodes = self._recurse_all_nodes
+ else:
+ self.recurse_nodes = self._recurse_no_nodes
+
+ def path(self, env, dir=None, target=None, source=None):
+ if not self.path_function:
+ return ()
+ if self.argument is not _null:
+ return self.path_function(env, dir, target, source, self.argument)
+ else:
+ return self.path_function(env, dir, target, source)
+
+ def __call__(self, node, env, path=()):
+ """
+ This method scans a single object. 'node' is the node
+ that will be passed to the scanner function, and 'env' is the
+ environment that will be passed to the scanner function. A list of
+ direct dependency nodes for the specified node will be returned.
+ """
+ if self.scan_check and not self.scan_check(node, env):
+ return []
+
+ self = self.select(node)
+
+ if not self.argument is _null:
+ node_list = self.function(node, env, path, self.argument)
+ else:
+ node_list = self.function(node, env, path)
+
+ kw = {}
+ if hasattr(node, 'dir'):
+ kw['directory'] = node.dir
+ node_factory = env.get_factory(self.node_factory)
+ nodes = []
+ for l in node_list:
+ if self.node_class and not isinstance(l, self.node_class):
+ l = node_factory(l, **kw)
+ nodes.append(l)
+ return nodes
+
+ def __eq__(self, other):
+ try:
+ return self.__dict__ == other.__dict__
+ except AttributeError:
+ # other probably doesn't have a __dict__
+ return self.__dict__ == other
+
+ def __hash__(self):
+ return id(self)
+
+ def __str__(self):
+ return self.name
+
+ def add_skey(self, skey):
+ """Add a skey to the list of skeys"""
+ self.skeys.append(skey)
+
+ def get_skeys(self, env=None):
+ if env and SCons.Util.is_String(self.skeys):
+ return env.subst_list(self.skeys)[0]
+ return self.skeys
+
+ def select(self, node):
+ if SCons.Util.is_Dict(self.function):
+ key = node.scanner_key()
+ try:
+ return self.function[key]
+ except KeyError:
+ return None
+ else:
+ return self
+
+ def _recurse_all_nodes(self, nodes):
+ return nodes
+
+ def _recurse_no_nodes(self, nodes):
+ return []
+
+ # recurse_nodes = _recurse_no_nodes
+
+ def add_scanner(self, skey, scanner):
+ self.function[skey] = scanner
+ self.add_skey(skey)
+
+
+class Selector(Base):
+ """
+ A class for selecting a more specific scanner based on the
+ scanner_key() (suffix) for a specific Node.
+
+ TODO: This functionality has been moved into the inner workings of
+ the Base class, and this class will be deprecated at some point.
+ (It was never exposed directly as part of the public interface,
+ although it is used by the Scanner() factory function that was
+ used by various Tool modules and therefore was likely a template
+ for custom modules that may be out there.)
+ """
+ def __init__(self, dict, *args, **kw):
+ Base.__init__(self, None, *args, **kw)
+ self.dict = dict
+ self.skeys = list(dict.keys())
+
+ def __call__(self, node, env, path=()):
+ return self.select(node)(node, env, path)
+
+ def select(self, node):
+ try:
+ return self.dict[node.scanner_key()]
+ except KeyError:
+ return None
+
+ def add_scanner(self, skey, scanner):
+ self.dict[skey] = scanner
+ self.add_skey(skey)
+
+
+class Current(Base):
+ """
+ A class for scanning files that are source files (have no builder)
+ or are derived files and are current (which implies that they exist,
+ either locally or in a repository).
+ """
+
+ def __init__(self, *args, **kw):
+ def current_check(node, env):
+ return not node.has_builder() or node.is_up_to_date()
+ kw['scan_check'] = current_check
+ Base.__init__(self, *args, **kw)
+
+class Classic(Current):
+ """
+ A Scanner subclass to contain the common logic for classic CPP-style
+ include scanning, but which can be customized to use different
+ regular expressions to find the includes.
+
+ Note that in order for this to work "out of the box" (without
+ overriding the find_include() and sort_key() methods), the regular
+ expression passed to the constructor must return the name of the
+ include file in group 0.
+ """
+
+ def __init__(self, name, suffixes, path_variable, regex, *args, **kw):
+
+ self.cre = re.compile(regex, re.M)
+
+ def _scan(node, _, path=(), self=self):
+ node = node.rfile()
+ if not node.exists():
+ return []
+ return self.scan(node, path)
+
+ kw['function'] = _scan
+ kw['path_function'] = FindPathDirs(path_variable)
+
+ # Allow recursive to propagate if child class specifies.
+ # In this case resource scanner needs to specify a filter on which files
+ # get recursively processed. Previously was hardcoded to 1 instead of
+ # defaulted to 1.
+ kw['recursive'] = kw.get('recursive', 1)
+ kw['skeys'] = suffixes
+ kw['name'] = name
+
+ Current.__init__(self, *args, **kw)
+
+ def find_include(self, include, source_dir, path):
+ n = SCons.Node.FS.find_file(include, (source_dir,) + tuple(path))
+ return n, include
+
+ def sort_key(self, include):
+ return SCons.Node.FS._my_normcase(include)
+
+ def find_include_names(self, node):
+ return self.cre.findall(node.get_text_contents())
+
+ def scan(self, node, path=()):
+
+ # cache the includes list in node so we only scan it once:
+ if node.includes is not None:
+ includes = node.includes
+ else:
+ includes = self.find_include_names(node)
+ # Intern the names of the include files. Saves some memory
+ # if the same header is included many times.
+ node.includes = list(map(SCons.Util.silent_intern, includes))
+
+ # This is a hand-coded DSU (decorate-sort-undecorate, or
+ # Schwartzian transform) pattern. The sort key is the raw name
+ # of the file as specifed on the #include line (including the
+ # " or <, since that may affect what file is found), which lets
+ # us keep the sort order constant regardless of whether the file
+ # is actually found in a Repository or locally.
+ nodes = []
+ source_dir = node.get_dir()
+ if callable(path):
+ path = path()
+ for include in includes:
+ n, i = self.find_include(include, source_dir, path)
+
+ if n is None:
+ SCons.Warnings.warn(SCons.Warnings.DependencyWarning,
+ "No dependency generated for file: %s (included from: %s) -- file not found" % (i, node))
+ else:
+ nodes.append((self.sort_key(include), n))
+
+ return [pair[1] for pair in sorted(nodes)]
+
+class ClassicCPP(Classic):
+ """
+ A Classic Scanner subclass which takes into account the type of
+ bracketing used to include the file, and uses classic CPP rules
+ for searching for the files based on the bracketing.
+
+ Note that in order for this to work, the regular expression passed
+ to the constructor must return the leading bracket in group 0, and
+ the contained filename in group 1.
+ """
+ def find_include(self, include, source_dir, path):
+ include = list(map(SCons.Util.to_str, include))
+ if include[0] == '"':
+ paths = (source_dir,) + tuple(path)
+ else:
+ paths = tuple(path) + (source_dir,)
+
+ n = SCons.Node.FS.find_file(include[1], paths)
+
+ i = SCons.Util.silent_intern(include[1])
+ return n, i
+
+ def sort_key(self, include):
+ return SCons.Node.FS._my_normcase(' '.join(include))
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Scanner/__init__.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Scanner/__init__.xml
new file mode 100644
index 0000000..470e045
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Scanner/__init__.xml
@@ -0,0 +1,91 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+__COPYRIGHT__
+
+This file is processed by the bin/SConsDoc.py module.
+See its __doc__ string for a discussion of the format.
+-->
+
+<!DOCTYPE sconsdoc [
+<!ENTITY % scons SYSTEM '../../../../doc/scons.mod'>
+%scons;
+<!ENTITY % builders-mod SYSTEM '../../../../doc/generated/builders.mod'>
+%builders-mod;
+<!ENTITY % functions-mod SYSTEM '../../../../doc/generated/functions.mod'>
+%functions-mod;
+<!ENTITY % tools-mod SYSTEM '../../../../doc/generated/tools.mod'>
+%tools-mod;
+<!ENTITY % variables-mod SYSTEM '../../../../doc/generated/variables.mod'>
+%variables-mod;
+]>
+
+<sconsdoc xmlns="http://www.scons.org/dbxsd/v1.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://www.scons.org/dbxsd/v1.0 http://www.scons.org/dbxsd/v1.0/scons.xsd">
+
+
+<scons_function name="FindPathDirs">
+<arguments signature="global">
+(variable)
+</arguments>
+<summary>
+<para>
+Returns a function
+(actually a callable Python object)
+intended to be used as the
+<varname>path_function</varname>
+of a Scanner object.
+The returned object will look up the specified
+<varname>variable</varname>
+in a construction environment
+and treat the construction variable's value as a list of
+directory paths that should be searched
+(like
+&cv-link-CPPPATH;,
+&cv-link-LIBPATH;,
+etc.).
+</para>
+
+<para>
+Note that use of
+&f-FindPathDirs;
+is generally preferable to
+writing your own
+<varname>path_function</varname>
+for the following reasons:
+1) The returned list will contain all appropriate directories
+found in source trees
+(when
+&f-link-VariantDir;
+is used)
+or in code repositories
+(when
+&f-Repository;
+or the
+<option>-Y</option>
+option are used).
+2) scons will identify expansions of
+<varname>variable</varname>
+that evaluate to the same list of directories as,
+in fact, the same list,
+and avoid re-scanning the directories for files,
+when possible.
+</para>
+
+<para>
+Example:
+</para>
+
+<example_commands>
+def my_scan(node, env, path, arg):
+ # Code to scan file contents goes here...
+ return include_files
+
+scanner = Scanner(name = 'myscanner',
+ function = my_scan,
+ path_function = FindPathDirs('MYPATH'))
+</example_commands>
+</summary>
+</scons_function>
+
+</sconsdoc>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Script/Interactive.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Script/Interactive.py
new file mode 100644
index 0000000..cc4f23c
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Script/Interactive.py
@@ -0,0 +1,376 @@
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+from __future__ import print_function
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+__doc__ = """
+SCons interactive mode
+"""
+
+# TODO:
+#
+# This has the potential to grow into something with a really big life
+# of its own, which might or might not be a good thing. Nevertheless,
+# here are some enhancements that will probably be requested some day
+# and are worth keeping in mind (assuming this takes off):
+#
+# - A command to re-read / re-load the SConscript files. This may
+# involve allowing people to specify command-line options (e.g. -f,
+# -I, --no-site-dir) that affect how the SConscript files are read.
+#
+# - Additional command-line options on the "build" command.
+#
+# Of the supported options that seemed to make sense (after a quick
+# pass through the list), the ones that seemed likely enough to be
+# used are listed in the man page and have explicit test scripts.
+#
+# These had code changed in Script/Main.py to support them, but didn't
+# seem likely to be used regularly, so had no test scripts added:
+#
+# build --diskcheck=*
+# build --implicit-cache=*
+# build --implicit-deps-changed=*
+# build --implicit-deps-unchanged=*
+#
+# These look like they should "just work" with no changes to the
+# existing code, but like those above, look unlikely to be used and
+# therefore had no test scripts added:
+#
+# build --random
+#
+# These I'm not sure about. They might be useful for individual
+# "build" commands, and may even work, but they seem unlikely enough
+# that we'll wait until they're requested before spending any time on
+# writing test scripts for them, or investigating whether they work.
+#
+# build -q [??? is there a useful analog to the exit status?]
+# build --duplicate=
+# build --profile=
+# build --max-drift=
+# build --warn=*
+# build --Y
+#
+# - Most of the SCons command-line options that the "build" command
+# supports should be settable as default options that apply to all
+# subsequent "build" commands. Maybe a "set {option}" command that
+# maps to "SetOption('{option}')".
+#
+# - Need something in the 'help' command that prints the -h output.
+#
+# - A command to run the configure subsystem separately (must see how
+# this interacts with the new automake model).
+#
+# - Command-line completion of target names; maybe even of SCons options?
+# Completion is something that's supported by the Python cmd module,
+# so this should be doable without too much trouble.
+#
+
+import cmd
+import copy
+import os
+import re
+import shlex
+import sys
+
+try:
+ import readline
+except ImportError:
+ pass
+
+class SConsInteractiveCmd(cmd.Cmd):
+ """\
+
+build [TARGETS] Build the specified TARGETS and their dependencies. 'b' is a synonym.
+clean [TARGETS] Clean (remove) the specified TARGETS and their dependencies. 'c' is a synonym.
+exit Exit SCons interactive mode.
+help [COMMAND] Prints help for the specified COMMAND. 'h' and '?' are synonyms.
+shell [COMMANDLINE] Execute COMMANDLINE in a subshell. 'sh' and '!' are synonyms.
+version Prints SCons version information.
+"""
+
+ synonyms = {
+ 'b' : 'build',
+ 'c' : 'clean',
+ 'h' : 'help',
+ 'scons' : 'build',
+ 'sh' : 'shell',
+ }
+
+ def __init__(self, **kw):
+ cmd.Cmd.__init__(self)
+ for key, val in kw.items():
+ setattr(self, key, val)
+
+ if sys.platform == 'win32':
+ self.shell_variable = 'COMSPEC'
+ else:
+ self.shell_variable = 'SHELL'
+
+ def default(self, argv):
+ print("*** Unknown command: %s" % argv[0])
+
+ def onecmd(self, line):
+ line = line.strip()
+ if not line:
+ print(self.lastcmd)
+ return self.emptyline()
+ self.lastcmd = line
+ if line[0] == '!':
+ line = 'shell ' + line[1:]
+ elif line[0] == '?':
+ line = 'help ' + line[1:]
+ if os.sep == '\\':
+ line = line.replace('\\', '\\\\')
+ argv = shlex.split(line)
+ argv[0] = self.synonyms.get(argv[0], argv[0])
+ if not argv[0]:
+ return self.default(line)
+ else:
+ try:
+ func = getattr(self, 'do_' + argv[0])
+ except AttributeError:
+ return self.default(argv)
+ return func(argv)
+
+ def do_build(self, argv):
+ """\
+ build [TARGETS] Build the specified TARGETS and their
+ dependencies. 'b' is a synonym.
+ """
+ import SCons.Node
+ import SCons.SConsign
+ import SCons.Script.Main
+
+ options = copy.deepcopy(self.options)
+
+ options, targets = self.parser.parse_args(argv[1:], values=options)
+
+ SCons.Script.COMMAND_LINE_TARGETS = targets
+
+ if targets:
+ SCons.Script.BUILD_TARGETS = targets
+ else:
+ # If the user didn't specify any targets on the command line,
+ # use the list of default targets.
+ SCons.Script.BUILD_TARGETS = SCons.Script._build_plus_default
+
+ nodes = SCons.Script.Main._build_targets(self.fs,
+ options,
+ targets,
+ self.target_top)
+
+ if not nodes:
+ return
+
+ # Call each of the Node's alter_targets() methods, which may
+ # provide additional targets that ended up as part of the build
+ # (the canonical example being a VariantDir() when we're building
+ # from a source directory) and which we therefore need their
+ # state cleared, too.
+ x = []
+ for n in nodes:
+ x.extend(n.alter_targets()[0])
+ nodes.extend(x)
+
+ # Clean up so that we can perform the next build correctly.
+ #
+ # We do this by walking over all the children of the targets,
+ # and clearing their state.
+ #
+ # We currently have to re-scan each node to find their
+ # children, because built nodes have already been partially
+ # cleared and don't remember their children. (In scons
+ # 0.96.1 and earlier, this wasn't the case, and we didn't
+ # have to re-scan the nodes.)
+ #
+ # Because we have to re-scan each node, we can't clear the
+ # nodes as we walk over them, because we may end up rescanning
+ # a cleared node as we scan a later node. Therefore, only
+ # store the list of nodes that need to be cleared as we walk
+ # the tree, and clear them in a separate pass.
+ #
+ # XXX: Someone more familiar with the inner workings of scons
+ # may be able to point out a more efficient way to do this.
+
+ SCons.Script.Main.progress_display("scons: Clearing cached node information ...")
+
+ seen_nodes = {}
+
+ def get_unseen_children(node, parent, seen_nodes=seen_nodes):
+ def is_unseen(node, seen_nodes=seen_nodes):
+ return node not in seen_nodes
+ return [child for child in node.children(scan=1) if is_unseen(child)]
+
+ def add_to_seen_nodes(node, parent, seen_nodes=seen_nodes):
+ seen_nodes[node] = 1
+
+ # If this file is in a VariantDir and has a
+ # corresponding source file in the source tree, remember the
+ # node in the source tree, too. This is needed in
+ # particular to clear cached implicit dependencies on the
+ # source file, since the scanner will scan it if the
+ # VariantDir was created with duplicate=0.
+ try:
+ rfile_method = node.rfile
+ except AttributeError:
+ return
+ else:
+ rfile = rfile_method()
+ if rfile != node:
+ seen_nodes[rfile] = 1
+
+ for node in nodes:
+ walker = SCons.Node.Walker(node,
+ kids_func=get_unseen_children,
+ eval_func=add_to_seen_nodes)
+ n = walker.get_next()
+ while n:
+ n = walker.get_next()
+
+ for node in list(seen_nodes.keys()):
+ # Call node.clear() to clear most of the state
+ node.clear()
+ # node.clear() doesn't reset node.state, so call
+ # node.set_state() to reset it manually
+ node.set_state(SCons.Node.no_state)
+ node.implicit = None
+
+ # Debug: Uncomment to verify that all Taskmaster reference
+ # counts have been reset to zero.
+ #if node.ref_count != 0:
+ # from SCons.Debug import Trace
+ # Trace('node %s, ref_count %s !!!\n' % (node, node.ref_count))
+
+ SCons.SConsign.Reset()
+ SCons.Script.Main.progress_display("scons: done clearing node information.")
+
+ def do_clean(self, argv):
+ """\
+ clean [TARGETS] Clean (remove) the specified TARGETS
+ and their dependencies. 'c' is a synonym.
+ """
+ return self.do_build(['build', '--clean'] + argv[1:])
+
+ def do_EOF(self, argv):
+ print()
+ self.do_exit(argv)
+
+ def _do_one_help(self, arg):
+ try:
+ # If help_<arg>() exists, then call it.
+ func = getattr(self, 'help_' + arg)
+ except AttributeError:
+ try:
+ func = getattr(self, 'do_' + arg)
+ except AttributeError:
+ doc = None
+ else:
+ doc = self._doc_to_help(func)
+ if doc:
+ sys.stdout.write(doc + '\n')
+ sys.stdout.flush()
+ else:
+ doc = self.strip_initial_spaces(func())
+ if doc:
+ sys.stdout.write(doc + '\n')
+ sys.stdout.flush()
+
+ def _doc_to_help(self, obj):
+ doc = obj.__doc__
+ if doc is None:
+ return ''
+ return self._strip_initial_spaces(doc)
+
+ def _strip_initial_spaces(self, s):
+ lines = s.split('\n')
+ spaces = re.match(' *', lines[0]).group(0)
+ def strip_spaces(l, spaces=spaces):
+ if l[:len(spaces)] == spaces:
+ l = l[len(spaces):]
+ return l
+ lines = list(map(strip_spaces, lines))
+ return '\n'.join(lines)
+
+ def do_exit(self, argv):
+ """\
+ exit Exit SCons interactive mode.
+ """
+ sys.exit(0)
+
+ def do_help(self, argv):
+ """\
+ help [COMMAND] Prints help for the specified COMMAND. 'h'
+ and '?' are synonyms.
+ """
+ if argv[1:]:
+ for arg in argv[1:]:
+ if self._do_one_help(arg):
+ break
+ else:
+ # If bare 'help' is called, print this class's doc
+ # string (if it has one).
+ doc = self._doc_to_help(self.__class__)
+ if doc:
+ sys.stdout.write(doc + '\n')
+ sys.stdout.flush()
+
+ def do_shell(self, argv):
+ """\
+ shell [COMMANDLINE] Execute COMMANDLINE in a subshell. 'sh' and
+ '!' are synonyms.
+ """
+ import subprocess
+ argv = argv[1:]
+ if not argv:
+ argv = os.environ[self.shell_variable]
+ try:
+ # Per "[Python-Dev] subprocess insufficiently platform-independent?"
+ # http://mail.python.org/pipermail/python-dev/2008-August/081979.html "+
+ # Doing the right thing with an argument list currently
+ # requires different shell= values on Windows and Linux.
+ p = subprocess.Popen(argv, shell=(sys.platform=='win32'))
+ except EnvironmentError as e:
+ sys.stderr.write('scons: %s: %s\n' % (argv[0], e.strerror))
+ else:
+ p.wait()
+
+ def do_version(self, argv):
+ """\
+ version Prints SCons version information.
+ """
+ sys.stdout.write(self.parser.version + '\n')
+
+def interact(fs, parser, options, targets, target_top):
+ c = SConsInteractiveCmd(prompt = 'scons>>> ',
+ fs = fs,
+ parser = parser,
+ options = options,
+ targets = targets,
+ target_top = target_top)
+ c.cmdloop()
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Script/Main.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Script/Main.py
new file mode 100644
index 0000000..c810634
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Script/Main.py
@@ -0,0 +1,1427 @@
+"""SCons.Script
+
+This file implements the main() function used by the scons script.
+
+Architecturally, this *is* the scons script, and will likely only be
+called from the external "scons" wrapper. Consequently, anything here
+should not be, or be considered, part of the build engine. If it's
+something that we expect other software to want to use, it should go in
+some other module. If it's specific to the "scons" script invocation,
+it goes here.
+"""
+
+from __future__ import print_function
+
+
+unsupported_python_version = (2, 6, 0)
+deprecated_python_version = (2, 7, 0)
+
+
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+
+import SCons.compat
+
+import os
+import sys
+import time
+import traceback
+import sysconfig
+
+import SCons.CacheDir
+import SCons.Debug
+import SCons.Defaults
+import SCons.Environment
+import SCons.Errors
+import SCons.Job
+import SCons.Node
+import SCons.Node.FS
+import SCons.Platform
+import SCons.SConf
+import SCons.Script
+import SCons.Taskmaster
+import SCons.Util
+import SCons.Warnings
+
+import SCons.Script.Interactive
+
+
+def fetch_win32_parallel_msg():
+ # A subsidiary function that exists solely to isolate this import
+ # so we don't have to pull it in on all platforms, and so that an
+ # in-line "import" statement in the _main() function below doesn't
+ # cause warnings about local names shadowing use of the 'SCons'
+ # global in nest scopes and UnboundLocalErrors and the like in some
+ # versions (2.1) of Python.
+ import SCons.Platform.win32
+ return SCons.Platform.win32.parallel_msg
+
+
+def revert_io():
+ # This call is added to revert stderr and stdout to the original
+ # ones just in case some build rule or something else in the system
+ # has redirected them elsewhere.
+ sys.stderr = sys.__stderr__
+ sys.stdout = sys.__stdout__
+
+class SConsPrintHelpException(Exception):
+ pass
+
+display = SCons.Util.display
+progress_display = SCons.Util.DisplayEngine()
+
+first_command_start = None
+last_command_end = None
+
+
+class Progressor(object):
+ prev = ''
+ count = 0
+ target_string = '$TARGET'
+
+ def __init__(self, obj, interval=1, file=None, overwrite=False):
+ if file is None:
+ file = sys.stdout
+
+ self.obj = obj
+ self.file = file
+ self.interval = interval
+ self.overwrite = overwrite
+
+ if callable(obj):
+ self.func = obj
+ elif SCons.Util.is_List(obj):
+ self.func = self.spinner
+ elif obj.find(self.target_string) != -1:
+ self.func = self.replace_string
+ else:
+ self.func = self.string
+
+ def write(self, s):
+ self.file.write(s)
+ self.file.flush()
+ self.prev = s
+
+ def erase_previous(self):
+ if self.prev:
+ length = len(self.prev)
+ if self.prev[-1] in ('\n', '\r'):
+ length = length - 1
+ self.write(' ' * length + '\r')
+ self.prev = ''
+
+ def spinner(self, node):
+ self.write(self.obj[self.count % len(self.obj)])
+
+ def string(self, node):
+ self.write(self.obj)
+
+ def replace_string(self, node):
+ self.write(self.obj.replace(self.target_string, str(node)))
+
+ def __call__(self, node):
+ self.count = self.count + 1
+ if (self.count % self.interval) == 0:
+ if self.overwrite:
+ self.erase_previous()
+ self.func(node)
+
+ProgressObject = SCons.Util.Null()
+
+def Progress(*args, **kw):
+ global ProgressObject
+ ProgressObject = Progressor(*args, **kw)
+
+# Task control.
+#
+
+_BuildFailures = []
+
+
+def GetBuildFailures():
+ return _BuildFailures
+
+
+class BuildTask(SCons.Taskmaster.OutOfDateTask):
+ """An SCons build task."""
+ progress = ProgressObject
+
+ def display(self, message):
+ display('scons: ' + message)
+
+ def prepare(self):
+ self.progress(self.targets[0])
+ return SCons.Taskmaster.OutOfDateTask.prepare(self)
+
+ def needs_execute(self):
+ if SCons.Taskmaster.OutOfDateTask.needs_execute(self):
+ return True
+ if self.top and self.targets[0].has_builder():
+ display("scons: `%s' is up to date." % str(self.node))
+ return False
+
+ def execute(self):
+ if print_time:
+ start_time = time.time()
+ global first_command_start
+ if first_command_start is None:
+ first_command_start = start_time
+ SCons.Taskmaster.OutOfDateTask.execute(self)
+ if print_time:
+ global cumulative_command_time
+ global last_command_end
+ finish_time = time.time()
+ last_command_end = finish_time
+ cumulative_command_time = cumulative_command_time+finish_time-start_time
+ sys.stdout.write("Command execution time: %s: %f seconds\n"%(str(self.node), finish_time-start_time))
+
+ def do_failed(self, status=2):
+ _BuildFailures.append(self.exception[1])
+ global exit_status
+ global this_build_status
+ if self.options.ignore_errors:
+ SCons.Taskmaster.OutOfDateTask.executed(self)
+ elif self.options.keep_going:
+ SCons.Taskmaster.OutOfDateTask.fail_continue(self)
+ exit_status = status
+ this_build_status = status
+ else:
+ SCons.Taskmaster.OutOfDateTask.fail_stop(self)
+ exit_status = status
+ this_build_status = status
+
+ def executed(self):
+ t = self.targets[0]
+ if self.top and not t.has_builder() and not t.side_effect:
+ if not t.exists():
+ if t.__class__.__name__ in ('File', 'Dir', 'Entry'):
+ errstr="Do not know how to make %s target `%s' (%s)." % (t.__class__.__name__, t, t.get_abspath())
+ else: # Alias or Python or ...
+ errstr="Do not know how to make %s target `%s'." % (t.__class__.__name__, t)
+ sys.stderr.write("scons: *** " + errstr)
+ if not self.options.keep_going:
+ sys.stderr.write(" Stop.")
+ sys.stderr.write("\n")
+ try:
+ raise SCons.Errors.BuildError(t, errstr)
+ except KeyboardInterrupt:
+ raise
+ except:
+ self.exception_set()
+ self.do_failed()
+ else:
+ print("scons: Nothing to be done for `%s'." % t)
+ SCons.Taskmaster.OutOfDateTask.executed(self)
+ else:
+ SCons.Taskmaster.OutOfDateTask.executed(self)
+
+ def failed(self):
+ # Handle the failure of a build task. The primary purpose here
+ # is to display the various types of Errors and Exceptions
+ # appropriately.
+ exc_info = self.exc_info()
+ try:
+ t, e, tb = exc_info
+ except ValueError:
+ t, e = exc_info
+ tb = None
+
+ if t is None:
+ # The Taskmaster didn't record an exception for this Task;
+ # see if the sys module has one.
+ try:
+ t, e, tb = sys.exc_info()[:]
+ except ValueError:
+ t, e = exc_info
+ tb = None
+
+ # Deprecated string exceptions will have their string stored
+ # in the first entry of the tuple.
+ if e is None:
+ e = t
+
+ buildError = SCons.Errors.convert_to_BuildError(e)
+ if not buildError.node:
+ buildError.node = self.node
+
+ node = buildError.node
+ if not SCons.Util.is_List(node):
+ node = [ node ]
+ nodename = ', '.join(map(str, node))
+
+ errfmt = "scons: *** [%s] %s\n"
+ sys.stderr.write(errfmt % (nodename, buildError))
+
+ if (buildError.exc_info[2] and buildError.exc_info[1] and
+ not isinstance(
+ buildError.exc_info[1],
+ (EnvironmentError, SCons.Errors.StopError,
+ SCons.Errors.UserError))):
+ type, value, trace = buildError.exc_info
+ if tb and print_stacktrace:
+ sys.stderr.write("scons: internal stack trace:\n")
+ traceback.print_tb(tb, file=sys.stderr)
+ traceback.print_exception(type, value, trace)
+ elif tb and print_stacktrace:
+ sys.stderr.write("scons: internal stack trace:\n")
+ traceback.print_tb(tb, file=sys.stderr)
+
+ self.exception = (e, buildError, tb) # type, value, traceback
+ self.do_failed(buildError.exitstatus)
+
+ self.exc_clear()
+
+ def postprocess(self):
+ if self.top:
+ t = self.targets[0]
+ for tp in self.options.tree_printers:
+ tp.display(t)
+ if self.options.debug_includes:
+ tree = t.render_include_tree()
+ if tree:
+ print()
+ print(tree)
+ SCons.Taskmaster.OutOfDateTask.postprocess(self)
+
+ def make_ready(self):
+ """Make a task ready for execution"""
+ SCons.Taskmaster.OutOfDateTask.make_ready(self)
+ if self.out_of_date and self.options.debug_explain:
+ explanation = self.out_of_date[0].explain()
+ if explanation:
+ sys.stdout.write("scons: " + explanation)
+
+
+class CleanTask(SCons.Taskmaster.AlwaysTask):
+ """An SCons clean task."""
+ def fs_delete(self, path, pathstr, remove=True):
+ try:
+ if os.path.lexists(path):
+ if os.path.isfile(path) or os.path.islink(path):
+ if remove: os.unlink(path)
+ display("Removed " + pathstr)
+ elif os.path.isdir(path) and not os.path.islink(path):
+ # delete everything in the dir
+ for e in sorted(os.listdir(path)):
+ p = os.path.join(path, e)
+ s = os.path.join(pathstr, e)
+ if os.path.isfile(p):
+ if remove: os.unlink(p)
+ display("Removed " + s)
+ else:
+ self.fs_delete(p, s, remove)
+ # then delete dir itself
+ if remove: os.rmdir(path)
+ display("Removed directory " + pathstr)
+ else:
+ errstr = "Path '%s' exists but isn't a file or directory."
+ raise SCons.Errors.UserError(errstr % (pathstr))
+ except SCons.Errors.UserError as e:
+ print(e)
+ except (IOError, OSError) as e:
+ print("scons: Could not remove '%s':" % pathstr, e.strerror)
+
+ def _get_files_to_clean(self):
+ result = []
+ target = self.targets[0]
+ if target.has_builder() or target.side_effect:
+ result = [t for t in self.targets if not t.noclean]
+ return result
+
+ def _clean_targets(self, remove=True):
+ target = self.targets[0]
+ if target in SCons.Environment.CleanTargets:
+ files = SCons.Environment.CleanTargets[target]
+ for f in files:
+ self.fs_delete(f.get_abspath(), str(f), remove)
+
+ def show(self):
+ for t in self._get_files_to_clean():
+ if not t.isdir():
+ display("Removed " + str(t))
+ self._clean_targets(remove=False)
+
+ def remove(self):
+ for t in self._get_files_to_clean():
+ try:
+ removed = t.remove()
+ except OSError as e:
+ # An OSError may indicate something like a permissions
+ # issue, an IOError would indicate something like
+ # the file not existing. In either case, print a
+ # message and keep going to try to remove as many
+ # targets as possible.
+ print("scons: Could not remove '{0}'".format(str(t)), e.strerror)
+ else:
+ if removed:
+ display("Removed " + str(t))
+ self._clean_targets(remove=True)
+
+ execute = remove
+
+ # We want the Taskmaster to update the Node states (and therefore
+ # handle reference counts, etc.), but we don't want to call
+ # back to the Node's post-build methods, which would do things
+ # we don't want, like store .sconsign information.
+ executed = SCons.Taskmaster.Task.executed_without_callbacks
+
+ # Have the Taskmaster arrange to "execute" all of the targets, because
+ # we'll figure out ourselves (in remove() or show() above) whether
+ # anything really needs to be done.
+ make_ready = SCons.Taskmaster.Task.make_ready_all
+
+ def prepare(self):
+ pass
+
+class QuestionTask(SCons.Taskmaster.AlwaysTask):
+ """An SCons task for the -q (question) option."""
+ def prepare(self):
+ pass
+
+ def execute(self):
+ if self.targets[0].get_state() != SCons.Node.up_to_date or \
+ (self.top and not self.targets[0].exists()):
+ global exit_status
+ global this_build_status
+ exit_status = 1
+ this_build_status = 1
+ self.tm.stop()
+
+ def executed(self):
+ pass
+
+
+class TreePrinter(object):
+ def __init__(self, derived=False, prune=False, status=False):
+ self.derived = derived
+ self.prune = prune
+ self.status = status
+ def get_all_children(self, node):
+ return node.all_children()
+ def get_derived_children(self, node):
+ children = node.all_children(None)
+ return [x for x in children if x.has_builder()]
+ def display(self, t):
+ if self.derived:
+ func = self.get_derived_children
+ else:
+ func = self.get_all_children
+ s = self.status and 2 or 0
+ SCons.Util.print_tree(t, func, prune=self.prune, showtags=s)
+
+
+def python_version_string():
+ return sys.version.split()[0]
+
+def python_version_unsupported(version=sys.version_info):
+ return version < unsupported_python_version
+
+def python_version_deprecated(version=sys.version_info):
+ return version < deprecated_python_version
+
+
+# Global variables
+
+print_objects = 0
+print_memoizer = 0
+print_stacktrace = 0
+print_time = 0
+sconscript_time = 0
+cumulative_command_time = 0
+exit_status = 0 # final exit status, assume success by default
+this_build_status = 0 # "exit status" of an individual build
+num_jobs = None
+delayed_warnings = []
+
+class FakeOptionParser(object):
+ """
+ A do-nothing option parser, used for the initial OptionsParser variable.
+
+ During normal SCons operation, the OptionsParser is created right
+ away by the main() function. Certain tests scripts however, can
+ introspect on different Tool modules, the initialization of which
+ can try to add a new, local option to an otherwise uninitialized
+ OptionsParser object. This allows that introspection to happen
+ without blowing up.
+
+ """
+ class FakeOptionValues(object):
+ def __getattr__(self, attr):
+ return None
+ values = FakeOptionValues()
+ def add_local_option(self, *args, **kw):
+ pass
+
+OptionsParser = FakeOptionParser()
+
+def AddOption(*args, **kw):
+ if 'default' not in kw:
+ kw['default'] = None
+ result = OptionsParser.add_local_option(*args, **kw)
+ return result
+
+def GetOption(name):
+ return getattr(OptionsParser.values, name)
+
+def SetOption(name, value):
+ return OptionsParser.values.set_option(name, value)
+
+def PrintHelp(file=None):
+ OptionsParser.print_help(file=file)
+
+class Stats(object):
+ def __init__(self):
+ self.stats = []
+ self.labels = []
+ self.append = self.do_nothing
+ self.print_stats = self.do_nothing
+ def enable(self, outfp):
+ self.outfp = outfp
+ self.append = self.do_append
+ self.print_stats = self.do_print
+ def do_nothing(self, *args, **kw):
+ pass
+
+class CountStats(Stats):
+ def do_append(self, label):
+ self.labels.append(label)
+ self.stats.append(SCons.Debug.fetchLoggedInstances())
+ def do_print(self):
+ stats_table = {}
+ for s in self.stats:
+ for n in [t[0] for t in s]:
+ stats_table[n] = [0, 0, 0, 0]
+ i = 0
+ for s in self.stats:
+ for n, c in s:
+ stats_table[n][i] = c
+ i = i + 1
+ self.outfp.write("Object counts:\n")
+ pre = [" "]
+ post = [" %s\n"]
+ l = len(self.stats)
+ fmt1 = ''.join(pre + [' %7s']*l + post)
+ fmt2 = ''.join(pre + [' %7d']*l + post)
+ labels = self.labels[:l]
+ labels.append(("", "Class"))
+ self.outfp.write(fmt1 % tuple([x[0] for x in labels]))
+ self.outfp.write(fmt1 % tuple([x[1] for x in labels]))
+ for k in sorted(stats_table.keys()):
+ r = stats_table[k][:l] + [k]
+ self.outfp.write(fmt2 % tuple(r))
+
+count_stats = CountStats()
+
+class MemStats(Stats):
+ def do_append(self, label):
+ self.labels.append(label)
+ self.stats.append(SCons.Debug.memory())
+ def do_print(self):
+ fmt = 'Memory %-32s %12d\n'
+ for label, stats in zip(self.labels, self.stats):
+ self.outfp.write(fmt % (label, stats))
+
+memory_stats = MemStats()
+
+# utility functions
+
+def _scons_syntax_error(e):
+ """Handle syntax errors. Print out a message and show where the error
+ occurred.
+ """
+ etype, value, tb = sys.exc_info()
+ lines = traceback.format_exception_only(etype, value)
+ for line in lines:
+ sys.stderr.write(line+'\n')
+ sys.exit(2)
+
+def find_deepest_user_frame(tb):
+ """
+ Find the deepest stack frame that is not part of SCons.
+
+ Input is a "pre-processed" stack trace in the form
+ returned by traceback.extract_tb() or traceback.extract_stack()
+ """
+
+ tb.reverse()
+
+ # find the deepest traceback frame that is not part
+ # of SCons:
+ for frame in tb:
+ filename = frame[0]
+ if filename.find(os.sep+'SCons'+os.sep) == -1:
+ return frame
+ return tb[0]
+
+def _scons_user_error(e):
+ """Handle user errors. Print out a message and a description of the
+ error, along with the line number and routine where it occured.
+ The file and line number will be the deepest stack frame that is
+ not part of SCons itself.
+ """
+ global print_stacktrace
+ etype, value, tb = sys.exc_info()
+ if print_stacktrace:
+ traceback.print_exception(etype, value, tb)
+ filename, lineno, routine, dummy = find_deepest_user_frame(traceback.extract_tb(tb))
+ sys.stderr.write("\nscons: *** %s\n" % value)
+ sys.stderr.write('File "%s", line %d, in %s\n' % (filename, lineno, routine))
+ sys.exit(2)
+
+def _scons_user_warning(e):
+ """Handle user warnings. Print out a message and a description of
+ the warning, along with the line number and routine where it occured.
+ The file and line number will be the deepest stack frame that is
+ not part of SCons itself.
+ """
+ etype, value, tb = sys.exc_info()
+ filename, lineno, routine, dummy = find_deepest_user_frame(traceback.extract_tb(tb))
+ sys.stderr.write("\nscons: warning: %s\n" % e)
+ sys.stderr.write('File "%s", line %d, in %s\n' % (filename, lineno, routine))
+
+def _scons_internal_warning(e):
+ """Slightly different from _scons_user_warning in that we use the
+ *current call stack* rather than sys.exc_info() to get our stack trace.
+ This is used by the warnings framework to print warnings."""
+ filename, lineno, routine, dummy = find_deepest_user_frame(traceback.extract_stack())
+ sys.stderr.write("\nscons: warning: %s\n" % e.args[0])
+ sys.stderr.write('File "%s", line %d, in %s\n' % (filename, lineno, routine))
+
+def _scons_internal_error():
+ """Handle all errors but user errors. Print out a message telling
+ the user what to do in this case and print a normal trace.
+ """
+ print('internal error')
+ traceback.print_exc()
+ sys.exit(2)
+
+def _SConstruct_exists(dirname='', repositories=[], filelist=None):
+ """This function checks that an SConstruct file exists in a directory.
+ If so, it returns the path of the file. By default, it checks the
+ current directory.
+ """
+ if not filelist:
+ filelist = ['SConstruct', 'Sconstruct', 'sconstruct']
+ for file in filelist:
+ sfile = os.path.join(dirname, file)
+ if os.path.isfile(sfile):
+ return sfile
+ if not os.path.isabs(sfile):
+ for rep in repositories:
+ if os.path.isfile(os.path.join(rep, sfile)):
+ return sfile
+ return None
+
+def _set_debug_values(options):
+ global print_memoizer, print_objects, print_stacktrace, print_time
+
+ debug_values = options.debug
+
+ if "count" in debug_values:
+ # All of the object counts are within "if track_instances:" blocks,
+ # which get stripped when running optimized (with python -O or
+ # from compiled *.pyo files). Provide a warning if __debug__ is
+ # stripped, so it doesn't just look like --debug=count is broken.
+ enable_count = False
+ if __debug__: enable_count = True
+ if enable_count:
+ count_stats.enable(sys.stdout)
+ SCons.Debug.track_instances = True
+ else:
+ msg = "--debug=count is not supported when running SCons\n" + \
+ "\twith the python -O option or optimized (.pyo) modules."
+ SCons.Warnings.warn(SCons.Warnings.NoObjectCountWarning, msg)
+ if "dtree" in debug_values:
+ options.tree_printers.append(TreePrinter(derived=True))
+ options.debug_explain = ("explain" in debug_values)
+ if "findlibs" in debug_values:
+ SCons.Scanner.Prog.print_find_libs = "findlibs"
+ options.debug_includes = ("includes" in debug_values)
+ print_memoizer = ("memoizer" in debug_values)
+ if "memory" in debug_values:
+ memory_stats.enable(sys.stdout)
+ print_objects = ("objects" in debug_values)
+ if print_objects:
+ SCons.Debug.track_instances = True
+ if "presub" in debug_values:
+ SCons.Action.print_actions_presub = 1
+ if "stacktrace" in debug_values:
+ print_stacktrace = 1
+ if "stree" in debug_values:
+ options.tree_printers.append(TreePrinter(status=True))
+ if "time" in debug_values:
+ print_time = 1
+ if "tree" in debug_values:
+ options.tree_printers.append(TreePrinter())
+ if "prepare" in debug_values:
+ SCons.Taskmaster.print_prepare = 1
+ if "duplicate" in debug_values:
+ SCons.Node.print_duplicate = 1
+
+def _create_path(plist):
+ path = '.'
+ for d in plist:
+ if os.path.isabs(d):
+ path = d
+ else:
+ path = path + '/' + d
+ return path
+
+def _load_site_scons_dir(topdir, site_dir_name=None):
+ """Load the site_scons dir under topdir.
+ Prepends site_scons to sys.path, imports site_scons/site_init.py,
+ and prepends site_scons/site_tools to default toolpath."""
+ if site_dir_name:
+ err_if_not_found = True # user specified: err if missing
+ else:
+ site_dir_name = "site_scons"
+ err_if_not_found = False
+
+ site_dir = os.path.join(topdir, site_dir_name)
+ if not os.path.exists(site_dir):
+ if err_if_not_found:
+ raise SCons.Errors.UserError("site dir %s not found."%site_dir)
+ return
+
+ site_init_filename = "site_init.py"
+ site_init_modname = "site_init"
+ site_tools_dirname = "site_tools"
+ # prepend to sys.path
+ sys.path = [os.path.abspath(site_dir)] + sys.path
+ site_init_file = os.path.join(site_dir, site_init_filename)
+ site_tools_dir = os.path.join(site_dir, site_tools_dirname)
+ if os.path.exists(site_init_file):
+ import imp, re
+ try:
+ try:
+ fp, pathname, description = imp.find_module(site_init_modname,
+ [site_dir])
+ # Load the file into SCons.Script namespace. This is
+ # opaque and clever; m is the module object for the
+ # SCons.Script module, and the exec ... in call executes a
+ # file (or string containing code) in the context of the
+ # module's dictionary, so anything that code defines ends
+ # up adding to that module. This is really short, but all
+ # the error checking makes it longer.
+ try:
+ m = sys.modules['SCons.Script']
+ except Exception as e:
+ fmt = 'cannot import site_init.py: missing SCons.Script module %s'
+ raise SCons.Errors.InternalError(fmt % repr(e))
+ try:
+ sfx = description[0]
+ modname = os.path.basename(pathname)[:-len(sfx)]
+ site_m = {"__file__": pathname, "__name__": modname, "__doc__": None}
+ re_special = re.compile("__[^_]+__")
+ for k in list(m.__dict__.keys()):
+ if not re_special.match(k):
+ site_m[k] = m.__dict__[k]
+
+ # This is the magic.
+ exec(compile(fp.read(), fp.name, 'exec'), site_m)
+ except KeyboardInterrupt:
+ raise
+ except Exception as e:
+ fmt = '*** Error loading site_init file %s:\n'
+ sys.stderr.write(fmt % repr(site_init_file))
+ raise
+ else:
+ for k in site_m:
+ if not re_special.match(k):
+ m.__dict__[k] = site_m[k]
+ except KeyboardInterrupt:
+ raise
+ except ImportError as e:
+ fmt = '*** cannot import site init file %s:\n'
+ sys.stderr.write(fmt % repr(site_init_file))
+ raise
+ finally:
+ if fp:
+ fp.close()
+ if os.path.exists(site_tools_dir):
+ # prepend to DefaultToolpath
+ SCons.Tool.DefaultToolpath.insert(0, os.path.abspath(site_tools_dir))
+
+def _load_all_site_scons_dirs(topdir, verbose=None):
+ """Load all of the predefined site_scons dir.
+ Order is significant; we load them in order from most generic
+ (machine-wide) to most specific (topdir).
+ The verbose argument is only for testing.
+ """
+ platform = SCons.Platform.platform_default()
+
+ def homedir(d):
+ return os.path.expanduser('~/'+d)
+
+ if platform == 'win32' or platform == 'cygwin':
+ # Note we use $ here instead of %...% because older
+ # pythons (prior to 2.6?) didn't expand %...% on Windows.
+ # This set of dirs should work on XP, Vista, 7 and later.
+ sysdirs=[
+ os.path.expandvars('$ALLUSERSPROFILE\\Application Data\\scons'),
+ os.path.expandvars('$USERPROFILE\\Local Settings\\Application Data\\scons')]
+ appdatadir = os.path.expandvars('$APPDATA\\scons')
+ if appdatadir not in sysdirs:
+ sysdirs.append(appdatadir)
+ sysdirs.append(homedir('.scons'))
+
+ elif platform == 'darwin': # MacOS X
+ sysdirs=['/Library/Application Support/SCons',
+ '/opt/local/share/scons', # (for MacPorts)
+ '/sw/share/scons', # (for Fink)
+ homedir('Library/Application Support/SCons'),
+ homedir('.scons')]
+ elif platform == 'sunos': # Solaris
+ sysdirs=['/opt/sfw/scons',
+ '/usr/share/scons',
+ homedir('.scons')]
+ else: # Linux, HPUX, etc.
+ # assume posix-like, i.e. platform == 'posix'
+ sysdirs=['/usr/share/scons',
+ homedir('.scons')]
+
+ dirs=sysdirs + [topdir]
+ for d in dirs:
+ if verbose: # this is used by unit tests.
+ print("Loading site dir ", d)
+ _load_site_scons_dir(d)
+
+def test_load_all_site_scons_dirs(d):
+ _load_all_site_scons_dirs(d, True)
+
+def version_string(label, module):
+ version = module.__version__
+ build = module.__build__
+ if build:
+ if build[0] != '.':
+ build = '.' + build
+ version = version + build
+ fmt = "\t%s: v%s, %s, by %s on %s\n"
+ return fmt % (label,
+ version,
+ module.__date__,
+ module.__developer__,
+ module.__buildsys__)
+
+def path_string(label, module):
+ path = module.__path__
+ return "\t%s path: %s\n"%(label,path)
+
+def _main(parser):
+ global exit_status
+ global this_build_status
+
+ options = parser.values
+
+ # Here's where everything really happens.
+
+ # First order of business: set up default warnings and then
+ # handle the user's warning options, so that we can issue (or
+ # suppress) appropriate warnings about anything that might happen,
+ # as configured by the user.
+
+ default_warnings = [ SCons.Warnings.WarningOnByDefault,
+ SCons.Warnings.DeprecatedWarning,
+ ]
+
+ for warning in default_warnings:
+ SCons.Warnings.enableWarningClass(warning)
+ SCons.Warnings._warningOut = _scons_internal_warning
+ SCons.Warnings.process_warn_strings(options.warn)
+
+ # Now that we have the warnings configuration set up, we can actually
+ # issue (or suppress) any warnings about warning-worthy things that
+ # occurred while the command-line options were getting parsed.
+ try:
+ dw = options.delayed_warnings
+ except AttributeError:
+ pass
+ else:
+ delayed_warnings.extend(dw)
+ for warning_type, message in delayed_warnings:
+ SCons.Warnings.warn(warning_type, message)
+
+ if options.diskcheck:
+ SCons.Node.FS.set_diskcheck(options.diskcheck)
+
+ # Next, we want to create the FS object that represents the outside
+ # world's file system, as that's central to a lot of initialization.
+ # To do this, however, we need to be in the directory from which we
+ # want to start everything, which means first handling any relevant
+ # options that might cause us to chdir somewhere (-C, -D, -U, -u).
+ if options.directory:
+ script_dir = os.path.abspath(_create_path(options.directory))
+ else:
+ script_dir = os.getcwd()
+
+ target_top = None
+ if options.climb_up:
+ target_top = '.' # directory to prepend to targets
+ while script_dir and not _SConstruct_exists(script_dir,
+ options.repository,
+ options.file):
+ script_dir, last_part = os.path.split(script_dir)
+ if last_part:
+ target_top = os.path.join(last_part, target_top)
+ else:
+ script_dir = ''
+
+ if script_dir and script_dir != os.getcwd():
+ if not options.silent:
+ display("scons: Entering directory `%s'" % script_dir)
+ try:
+ os.chdir(script_dir)
+ except OSError:
+ sys.stderr.write("Could not change directory to %s\n" % script_dir)
+
+ # Now that we're in the top-level SConstruct directory, go ahead
+ # and initialize the FS object that represents the file system,
+ # and make it the build engine default.
+ fs = SCons.Node.FS.get_default_fs()
+
+ for rep in options.repository:
+ fs.Repository(rep)
+
+ # Now that we have the FS object, the next order of business is to
+ # check for an SConstruct file (or other specified config file).
+ # If there isn't one, we can bail before doing any more work.
+ scripts = []
+ if options.file:
+ scripts.extend(options.file)
+ if not scripts:
+ sfile = _SConstruct_exists(repositories=options.repository,
+ filelist=options.file)
+ if sfile:
+ scripts.append(sfile)
+
+ if not scripts:
+ if options.help:
+ # There's no SConstruct, but they specified -h.
+ # Give them the options usage now, before we fail
+ # trying to read a non-existent SConstruct file.
+ raise SConsPrintHelpException
+ raise SCons.Errors.UserError("No SConstruct file found.")
+
+ if scripts[0] == "-":
+ d = fs.getcwd()
+ else:
+ d = fs.File(scripts[0]).dir
+ fs.set_SConstruct_dir(d)
+
+ _set_debug_values(options)
+ SCons.Node.implicit_cache = options.implicit_cache
+ SCons.Node.implicit_deps_changed = options.implicit_deps_changed
+ SCons.Node.implicit_deps_unchanged = options.implicit_deps_unchanged
+
+ if options.no_exec:
+ SCons.SConf.dryrun = 1
+ SCons.Action.execute_actions = None
+ if options.question:
+ SCons.SConf.dryrun = 1
+ if options.clean:
+ SCons.SConf.SetBuildType('clean')
+ if options.help:
+ SCons.SConf.SetBuildType('help')
+ SCons.SConf.SetCacheMode(options.config)
+ SCons.SConf.SetProgressDisplay(progress_display)
+
+ if options.no_progress or options.silent:
+ progress_display.set_mode(0)
+
+ if options.site_dir:
+ _load_site_scons_dir(d.get_internal_path(), options.site_dir)
+ elif not options.no_site_dir:
+ _load_all_site_scons_dirs(d.get_internal_path())
+
+ if options.include_dir:
+ sys.path = options.include_dir + sys.path
+
+ # If we're about to start SCons in the interactive mode,
+ # inform the FS about this right here. Else, the release_target_info
+ # method could get called on some nodes, like the used "gcc" compiler,
+ # when using the Configure methods within the SConscripts.
+ # This would then cause subtle bugs, as already happened in #2971.
+ if options.interactive:
+ SCons.Node.interactive = True
+
+ # That should cover (most of) the options. Next, set up the variables
+ # that hold command-line arguments, so the SConscript files that we
+ # read and execute have access to them.
+ targets = []
+ xmit_args = []
+ for a in parser.largs:
+ if a[:1] == '-':
+ continue
+ if '=' in a:
+ xmit_args.append(a)
+ else:
+ targets.append(a)
+ SCons.Script._Add_Targets(targets + parser.rargs)
+ SCons.Script._Add_Arguments(xmit_args)
+
+ # If stdout is not a tty, replace it with a wrapper object to call flush
+ # after every write.
+ #
+ # Tty devices automatically flush after every newline, so the replacement
+ # isn't necessary. Furthermore, if we replace sys.stdout, the readline
+ # module will no longer work. This affects the behavior during
+ # --interactive mode. --interactive should only be used when stdin and
+ # stdout refer to a tty.
+ if not hasattr(sys.stdout, 'isatty') or not sys.stdout.isatty():
+ sys.stdout = SCons.Util.Unbuffered(sys.stdout)
+ if not hasattr(sys.stderr, 'isatty') or not sys.stderr.isatty():
+ sys.stderr = SCons.Util.Unbuffered(sys.stderr)
+
+ memory_stats.append('before reading SConscript files:')
+ count_stats.append(('pre-', 'read'))
+
+ # And here's where we (finally) read the SConscript files.
+
+ progress_display("scons: Reading SConscript files ...")
+
+ start_time = time.time()
+ try:
+ for script in scripts:
+ SCons.Script._SConscript._SConscript(fs, script)
+ except SCons.Errors.StopError as e:
+ # We had problems reading an SConscript file, such as it
+ # couldn't be copied in to the VariantDir. Since we're just
+ # reading SConscript files and haven't started building
+ # things yet, stop regardless of whether they used -i or -k
+ # or anything else.
+ revert_io()
+ sys.stderr.write("scons: *** %s Stop.\n" % e)
+ sys.exit(2)
+ global sconscript_time
+ sconscript_time = time.time() - start_time
+
+ progress_display("scons: done reading SConscript files.")
+
+ memory_stats.append('after reading SConscript files:')
+ count_stats.append(('post-', 'read'))
+
+ # Re-{enable,disable} warnings in case they disabled some in
+ # the SConscript file.
+ #
+ # We delay enabling the PythonVersionWarning class until here so that,
+ # if they explicitly disabled it in either in the command line or in
+ # $SCONSFLAGS, or in the SConscript file, then the search through
+ # the list of deprecated warning classes will find that disabling
+ # first and not issue the warning.
+ #SCons.Warnings.enableWarningClass(SCons.Warnings.PythonVersionWarning)
+ SCons.Warnings.process_warn_strings(options.warn)
+
+ # Now that we've read the SConscript files, we can check for the
+ # warning about deprecated Python versions--delayed until here
+ # in case they disabled the warning in the SConscript files.
+ if python_version_deprecated():
+ msg = "Support for pre-%s Python version (%s) is deprecated.\n" + \
+ " If this will cause hardship, contact scons-dev@scons.org"
+ deprecated_version_string = ".".join(map(str, deprecated_python_version))
+ SCons.Warnings.warn(SCons.Warnings.PythonVersionWarning,
+ msg % (deprecated_version_string, python_version_string()))
+
+ if not options.help:
+ # [ ] Clarify why we need to create Builder here at all, and
+ # why it is created in DefaultEnvironment
+ # https://bitbucket.org/scons/scons/commits/d27a548aeee8ad5e67ea75c2d19a7d305f784e30
+ if SCons.SConf.NeedConfigHBuilder():
+ SCons.SConf.CreateConfigHBuilder(SCons.Defaults.DefaultEnvironment())
+
+ # Now re-parse the command-line options (any to the left of a '--'
+ # argument, that is) with any user-defined command-line options that
+ # the SConscript files may have added to the parser object. This will
+ # emit the appropriate error message and exit if any unknown option
+ # was specified on the command line.
+
+ parser.preserve_unknown_options = False
+ parser.parse_args(parser.largs, options)
+
+ if options.help:
+ help_text = SCons.Script.help_text
+ if help_text is None:
+ # They specified -h, but there was no Help() inside the
+ # SConscript files. Give them the options usage.
+ raise SConsPrintHelpException
+ else:
+ print(help_text)
+ print("Use scons -H for help about command-line options.")
+ exit_status = 0
+ return
+
+ # Change directory to the top-level SConstruct directory, then tell
+ # the Node.FS subsystem that we're all done reading the SConscript
+ # files and calling Repository() and VariantDir() and changing
+ # directories and the like, so it can go ahead and start memoizing
+ # the string values of file system nodes.
+
+ fs.chdir(fs.Top)
+
+ SCons.Node.FS.save_strings(1)
+
+ # Now that we've read the SConscripts we can set the options
+ # that are SConscript settable:
+ SCons.Node.implicit_cache = options.implicit_cache
+ SCons.Node.FS.set_duplicate(options.duplicate)
+ fs.set_max_drift(options.max_drift)
+
+ SCons.Job.explicit_stack_size = options.stack_size
+
+ if options.md5_chunksize:
+ SCons.Node.FS.File.md5_chunksize = options.md5_chunksize
+
+ platform = SCons.Platform.platform_module()
+
+ if options.interactive:
+ SCons.Script.Interactive.interact(fs, OptionsParser, options,
+ targets, target_top)
+
+ else:
+
+ # Build the targets
+ nodes = _build_targets(fs, options, targets, target_top)
+ if not nodes:
+ revert_io()
+ print('Found nothing to build')
+ exit_status = 2
+
+def _build_targets(fs, options, targets, target_top):
+
+ global this_build_status
+ this_build_status = 0
+
+ progress_display.set_mode(not (options.no_progress or options.silent))
+ display.set_mode(not options.silent)
+ SCons.Action.print_actions = not options.silent
+ SCons.Action.execute_actions = not options.no_exec
+ SCons.Node.do_store_info = not options.no_exec
+ SCons.SConf.dryrun = options.no_exec
+
+ if options.diskcheck:
+ SCons.Node.FS.set_diskcheck(options.diskcheck)
+
+ SCons.CacheDir.cache_enabled = not options.cache_disable
+ SCons.CacheDir.cache_readonly = options.cache_readonly
+ SCons.CacheDir.cache_debug = options.cache_debug
+ SCons.CacheDir.cache_force = options.cache_force
+ SCons.CacheDir.cache_show = options.cache_show
+
+ if options.no_exec:
+ CleanTask.execute = CleanTask.show
+ else:
+ CleanTask.execute = CleanTask.remove
+
+ lookup_top = None
+ if targets or SCons.Script.BUILD_TARGETS != SCons.Script._build_plus_default:
+ # They specified targets on the command line or modified
+ # BUILD_TARGETS in the SConscript file(s), so if they used -u,
+ # -U or -D, we have to look up targets relative to the top,
+ # but we build whatever they specified.
+ if target_top:
+ lookup_top = fs.Dir(target_top)
+ target_top = None
+
+ targets = SCons.Script.BUILD_TARGETS
+ else:
+ # There are no targets specified on the command line,
+ # so if they used -u, -U or -D, we may have to restrict
+ # what actually gets built.
+ d = None
+ if target_top:
+ if options.climb_up == 1:
+ # -u, local directory and below
+ target_top = fs.Dir(target_top)
+ lookup_top = target_top
+ elif options.climb_up == 2:
+ # -D, all Default() targets
+ target_top = None
+ lookup_top = None
+ elif options.climb_up == 3:
+ # -U, local SConscript Default() targets
+ target_top = fs.Dir(target_top)
+ def check_dir(x, target_top=target_top):
+ if hasattr(x, 'cwd') and not x.cwd is None:
+ cwd = x.cwd.srcnode()
+ return cwd == target_top
+ else:
+ # x doesn't have a cwd, so it's either not a target,
+ # or not a file, so go ahead and keep it as a default
+ # target and let the engine sort it out:
+ return 1
+ d = [tgt for tgt in SCons.Script.DEFAULT_TARGETS if check_dir(tgt)]
+ SCons.Script.DEFAULT_TARGETS[:] = d
+ target_top = None
+ lookup_top = None
+
+ targets = SCons.Script._Get_Default_Targets(d, fs)
+
+ if not targets:
+ sys.stderr.write("scons: *** No targets specified and no Default() targets found. Stop.\n")
+ return None
+
+ def Entry(x, ltop=lookup_top, ttop=target_top, fs=fs):
+ if isinstance(x, SCons.Node.Node):
+ node = x
+ else:
+ node = None
+ # Why would ltop be None? Unfortunately this happens.
+ if ltop is None: ltop = ''
+ # Curdir becomes important when SCons is called with -u, -C,
+ # or similar option that changes directory, and so the paths
+ # of targets given on the command line need to be adjusted.
+ curdir = os.path.join(os.getcwd(), str(ltop))
+ for lookup in SCons.Node.arg2nodes_lookups:
+ node = lookup(x, curdir=curdir)
+ if node is not None:
+ break
+ if node is None:
+ node = fs.Entry(x, directory=ltop, create=1)
+ if ttop and not node.is_under(ttop):
+ if isinstance(node, SCons.Node.FS.Dir) and ttop.is_under(node):
+ node = ttop
+ else:
+ node = None
+ return node
+
+ nodes = [_f for _f in map(Entry, targets) if _f]
+
+ task_class = BuildTask # default action is to build targets
+ opening_message = "Building targets ..."
+ closing_message = "done building targets."
+ if options.keep_going:
+ failure_message = "done building targets (errors occurred during build)."
+ else:
+ failure_message = "building terminated because of errors."
+ if options.question:
+ task_class = QuestionTask
+ try:
+ if options.clean:
+ task_class = CleanTask
+ opening_message = "Cleaning targets ..."
+ closing_message = "done cleaning targets."
+ if options.keep_going:
+ failure_message = "done cleaning targets (errors occurred during clean)."
+ else:
+ failure_message = "cleaning terminated because of errors."
+ except AttributeError:
+ pass
+
+ task_class.progress = ProgressObject
+
+ if options.random:
+ def order(dependencies):
+ """Randomize the dependencies."""
+ import random
+ random.shuffle(dependencies)
+ return dependencies
+ else:
+ def order(dependencies):
+ """Leave the order of dependencies alone."""
+ return dependencies
+
+ if options.taskmastertrace_file == '-':
+ tmtrace = sys.stdout
+ elif options.taskmastertrace_file:
+ tmtrace = open(options.taskmastertrace_file, 'w')
+ else:
+ tmtrace = None
+ taskmaster = SCons.Taskmaster.Taskmaster(nodes, task_class, order, tmtrace)
+
+ # Let the BuildTask objects get at the options to respond to the
+ # various print_* settings, tree_printer list, etc.
+ BuildTask.options = options
+
+
+ python_has_threads = sysconfig.get_config_var('WITH_THREAD')
+ # to check if python configured with threads.
+ global num_jobs
+ num_jobs = options.num_jobs
+ jobs = SCons.Job.Jobs(num_jobs, taskmaster)
+ if num_jobs > 1:
+ msg = None
+ if sys.platform == 'win32':
+ msg = fetch_win32_parallel_msg()
+ elif jobs.num_jobs == 1 or not python_has_threads:
+ msg = "parallel builds are unsupported by this version of Python;\n" + \
+ "\tignoring -j or num_jobs option.\n"
+ if msg:
+ SCons.Warnings.warn(SCons.Warnings.NoParallelSupportWarning, msg)
+
+ memory_stats.append('before building targets:')
+ count_stats.append(('pre-', 'build'))
+
+ def jobs_postfunc(
+ jobs=jobs,
+ options=options,
+ closing_message=closing_message,
+ failure_message=failure_message
+ ):
+ if jobs.were_interrupted():
+ if not options.no_progress and not options.silent:
+ sys.stderr.write("scons: Build interrupted.\n")
+ global exit_status
+ global this_build_status
+ exit_status = 2
+ this_build_status = 2
+
+ if this_build_status:
+ progress_display("scons: " + failure_message)
+ else:
+ progress_display("scons: " + closing_message)
+ if not options.no_exec:
+ if jobs.were_interrupted():
+ progress_display("scons: writing .sconsign file.")
+ SCons.SConsign.write()
+
+ progress_display("scons: " + opening_message)
+ jobs.run(postfunc = jobs_postfunc)
+
+ memory_stats.append('after building targets:')
+ count_stats.append(('post-', 'build'))
+
+ return nodes
+
+def _exec_main(parser, values):
+ sconsflags = os.environ.get('SCONSFLAGS', '')
+ all_args = sconsflags.split() + sys.argv[1:]
+
+ options, args = parser.parse_args(all_args, values)
+
+ if isinstance(options.debug, list) and "pdb" in options.debug:
+ import pdb
+ pdb.Pdb().runcall(_main, parser)
+ elif options.profile_file:
+ # compat layer imports "cProfile" for us if it's available.
+ from profile import Profile
+
+ prof = Profile()
+ try:
+ prof.runcall(_main, parser)
+ finally:
+ prof.dump_stats(options.profile_file)
+ else:
+ _main(parser)
+
+def main():
+ global OptionsParser
+ global exit_status
+ global first_command_start
+
+ # Check up front for a Python version we do not support. We
+ # delay the check for deprecated Python versions until later,
+ # after the SConscript files have been read, in case they
+ # disable that warning.
+ if python_version_unsupported():
+ msg = "scons: *** SCons version %s does not run under Python version %s.\n"
+ sys.stderr.write(msg % (SCons.__version__, python_version_string()))
+ sys.exit(1)
+
+ parts = ["SCons by Steven Knight et al.:\n"]
+ try:
+ import __main__
+ parts.append(version_string("script", __main__))
+ except (ImportError, AttributeError):
+ # On Windows there is no scons.py, so there is no
+ # __main__.__version__, hence there is no script version.
+ pass
+ parts.append(version_string("engine", SCons))
+ parts.append(path_string("engine", SCons))
+ parts.append("__COPYRIGHT__")
+ version = ''.join(parts)
+
+ from . import SConsOptions
+ parser = SConsOptions.Parser(version)
+ values = SConsOptions.SConsValues(parser.get_default_values())
+
+ OptionsParser = parser
+
+ try:
+ try:
+ _exec_main(parser, values)
+ finally:
+ revert_io()
+ except SystemExit as s:
+ if s:
+ exit_status = s
+ except KeyboardInterrupt:
+ print("scons: Build interrupted.")
+ sys.exit(2)
+ except SyntaxError as e:
+ _scons_syntax_error(e)
+ except SCons.Errors.InternalError:
+ _scons_internal_error()
+ except SCons.Errors.UserError as e:
+ _scons_user_error(e)
+ except SConsPrintHelpException:
+ parser.print_help()
+ exit_status = 0
+ except SCons.Errors.BuildError as e:
+ print(e)
+ exit_status = e.exitstatus
+ except:
+ # An exception here is likely a builtin Python exception Python
+ # code in an SConscript file. Show them precisely what the
+ # problem was and where it happened.
+ SCons.Script._SConscript.SConscript_exception()
+ sys.exit(2)
+
+ memory_stats.print_stats()
+ count_stats.print_stats()
+
+ if print_objects:
+ SCons.Debug.listLoggedInstances('*')
+ #SCons.Debug.dumpLoggedInstances('*')
+
+ if print_memoizer:
+ SCons.Memoize.Dump("Memoizer (memory cache) hits and misses:")
+
+ # Dump any development debug info that may have been enabled.
+ # These are purely for internal debugging during development, so
+ # there's no need to control them with --debug= options; they're
+ # controlled by changing the source code.
+ SCons.Debug.dump_caller_counts()
+ SCons.Taskmaster.dump_stats()
+
+ if print_time:
+ total_time = time.time() - SCons.Script.start_time
+ if num_jobs == 1:
+ ct = cumulative_command_time
+ else:
+ if last_command_end is None or first_command_start is None:
+ ct = 0.0
+ else:
+ ct = last_command_end - first_command_start
+ scons_time = total_time - sconscript_time - ct
+ print("Total build time: %f seconds"%total_time)
+ print("Total SConscript file execution time: %f seconds"%sconscript_time)
+ print("Total SCons execution time: %f seconds"%scons_time)
+ print("Total command execution time: %f seconds"%ct)
+
+ sys.exit(exit_status)
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Script/Main.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Script/Main.xml
new file mode 100644
index 0000000..e95afbc
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Script/Main.xml
@@ -0,0 +1,818 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+__COPYRIGHT__
+
+This file is processed by the bin/SConsDoc.py module.
+See its __doc__ string for a discussion of the format.
+-->
+
+<!DOCTYPE sconsdoc [
+<!ENTITY % scons SYSTEM '../../../../doc/scons.mod'>
+%scons;
+<!ENTITY % builders-mod SYSTEM '../../../../doc/generated/builders.mod'>
+%builders-mod;
+<!ENTITY % functions-mod SYSTEM '../../../../doc/generated/functions.mod'>
+%functions-mod;
+<!ENTITY % tools-mod SYSTEM '../../../../doc/generated/tools.mod'>
+%tools-mod;
+<!ENTITY % variables-mod SYSTEM '../../../../doc/generated/variables.mod'>
+%variables-mod;
+]>
+
+<sconsdoc xmlns="http://www.scons.org/dbxsd/v1.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://www.scons.org/dbxsd/v1.0 http://www.scons.org/dbxsd/v1.0/scons.xsd">
+
+
+<scons_function name="AddOption">
+<arguments signature="global">
+(arguments)
+</arguments>
+<summary>
+<para>
+This function adds a new command-line option to be recognized.
+The specified
+<varname>arguments</varname>
+are the same as supported by the standard Python
+<function>optparse.add_option</function>()
+method (with a few additional capabilities noted below);
+see the documentation for
+<literal>optparse</literal>
+for a thorough discussion of its option-processing capabities.
+</para>
+
+<para>
+In addition to the arguments and values supported by the
+<function>optparse.add_option</function>()
+method,
+the SCons
+&f-AddOption;
+function allows you to set the
+<literal>nargs</literal>
+keyword value to
+<literal>'?'</literal>
+(a string with just the question mark)
+to indicate that the specified long option(s) take(s) an
+<emphasis>optional</emphasis>
+argument.
+When
+<literal>nargs = '?'</literal>
+is passed to the
+&f-AddOption;
+function, the
+<literal>const</literal>
+keyword argument
+may be used to supply the "default"
+value that should be used when the
+option is specified on the command line
+without an explicit argument.
+</para>
+
+<para>
+If no
+<literal>default=</literal>
+keyword argument is supplied when calling
+&f-AddOption;,
+the option will have a default value of
+<literal>None</literal>.
+</para>
+
+<para>
+Once a new command-line option has been added with
+&f-AddOption;,
+the option value may be accessed using
+&f-GetOption;
+or
+<function>env.GetOption</function>().
+The value may also be set, using
+&f-SetOption;
+or
+<function>env.SetOption</function>(),
+if conditions in a
+&SConscript;
+require overriding any default value.
+Note, however, that a
+value specified on the command line will
+<emphasis>always</emphasis>
+override a value set by any SConscript file.
+</para>
+
+<para>
+Any specified
+<literal>help=</literal>
+strings for the new option(s)
+will be displayed by the
+<option>-H</option>
+or
+<option>-h</option>
+options
+(the latter only if no other help text is
+specified in the SConscript files).
+The help text for the local options specified by
+&f-AddOption;
+will appear below the SCons options themselves,
+under a separate
+<literal>Local Options</literal>
+heading.
+The options will appear in the help text
+in the order in which the
+&f-AddOption;
+calls occur.
+</para>
+
+<para>
+Example:
+</para>
+
+<example_commands>
+AddOption('--prefix',
+ dest='prefix',
+ nargs=1, type='string',
+ action='store',
+ metavar='DIR',
+ help='installation prefix')
+env = Environment(PREFIX = GetOption('prefix'))
+</example_commands>
+</summary>
+</scons_function>
+
+<scons_function name="GetBuildFailures">
+<arguments signature="global">
+()
+</arguments>
+<summary>
+<para>
+Returns a list of exceptions for the
+actions that failed while
+attempting to build targets.
+Each element in the returned list is a
+<classname>BuildError</classname>
+object
+with the following attributes
+that record various aspects
+of the build failure:
+</para>
+
+<para>
+<literal>.node</literal>
+The node that was being built
+when the build failure occurred.
+</para>
+
+<para>
+<literal>.status</literal>
+The numeric exit status
+returned by the command or Python function
+that failed when trying to build the
+specified Node.
+</para>
+
+<para>
+<literal>.errstr</literal>
+The SCons error string
+describing the build failure.
+(This is often a generic
+message like "Error 2"
+to indicate that an executed
+command exited with a status of 2.)
+</para>
+
+<para>
+<literal>.filename</literal>
+The name of the file or
+directory that actually caused the failure.
+This may be different from the
+<literal>.node</literal>
+attribute.
+For example,
+if an attempt to build a target named
+<filename>sub/dir/target</filename>
+fails because the
+<filename>sub/dir</filename>
+directory could not be created,
+then the
+<literal>.node</literal>
+attribute will be
+<filename>sub/dir/target</filename>
+but the
+<literal>.filename</literal>
+attribute will be
+<filename>sub/dir</filename>.
+</para>
+
+<para>
+<literal>.executor</literal>
+The SCons Executor object
+for the target Node
+being built.
+This can be used to retrieve
+the construction environment used
+for the failed action.
+</para>
+
+<para>
+<literal>.action</literal>
+The actual SCons Action object that failed.
+This will be one specific action
+out of the possible list of
+actions that would have been
+executed to build the target.
+</para>
+
+<para>
+<literal>.command</literal>
+The actual expanded command that was executed and failed,
+after expansion of
+&cv-link-TARGET;,
+&cv-link-SOURCE;,
+and other construction variables.
+</para>
+
+<para>
+Note that the
+&f-GetBuildFailures;
+function
+will always return an empty list
+until any build failure has occurred,
+which means that
+&f-GetBuildFailures;
+will always return an empty list
+while the
+&SConscript;
+files are being read.
+Its primary intended use is
+for functions that will be
+executed before SCons exits
+by passing them to the
+standard Python
+<function>atexit.register</function>()
+function.
+Example:
+</para>
+
+<example_commands>
+import atexit
+
+def print_build_failures():
+ from SCons.Script import GetBuildFailures
+ for bf in GetBuildFailures():
+ print("%s failed: %s" % (bf.node, bf.errstr))
+
+atexit.register(print_build_failures)
+</example_commands>
+</summary>
+</scons_function>
+
+<scons_function name="GetOption">
+<arguments>
+(name)
+</arguments>
+<summary>
+<para>
+This function provides a way to query the value of
+SCons options set on scons command line
+(or set using the
+&f-link-SetOption;
+function).
+The options supported are:
+</para>
+
+<para>
+<variablelist>
+<varlistentry>
+<term><literal>cache_debug</literal></term>
+<listitem>
+<para>
+which corresponds to --cache-debug;
+</para>
+</listitem>
+</varlistentry>
+<varlistentry>
+<term><literal>cache_disable</literal></term>
+<listitem>
+<para>
+which corresponds to --cache-disable;
+</para>
+</listitem>
+</varlistentry>
+<varlistentry>
+<term><literal>cache_force</literal></term>
+<listitem>
+<para>
+which corresponds to --cache-force;
+</para>
+</listitem>
+</varlistentry>
+<varlistentry>
+<term><literal>cache_show</literal></term>
+<listitem>
+<para>
+which corresponds to --cache-show;
+</para>
+</listitem>
+</varlistentry>
+<varlistentry>
+<term><literal>clean</literal></term>
+<listitem>
+<para>
+which corresponds to -c, --clean and --remove;
+</para>
+</listitem>
+</varlistentry>
+<varlistentry>
+<term><literal>config</literal></term>
+<listitem>
+<para>
+which corresponds to --config;
+</para>
+</listitem>
+</varlistentry>
+<varlistentry>
+<term><literal>directory</literal></term>
+<listitem>
+<para>
+which corresponds to -C and --directory;
+</para>
+</listitem>
+</varlistentry>
+<varlistentry>
+<term><literal>diskcheck</literal></term>
+<listitem>
+<para>
+which corresponds to --diskcheck
+</para>
+</listitem>
+</varlistentry>
+<varlistentry>
+<term><literal>duplicate</literal></term>
+<listitem>
+<para>
+which corresponds to --duplicate;
+</para>
+</listitem>
+</varlistentry>
+<varlistentry>
+<term><literal>file</literal></term>
+<listitem>
+<para>
+which corresponds to -f, --file, --makefile and --sconstruct;
+</para>
+</listitem>
+</varlistentry>
+<varlistentry>
+<term><literal>help</literal></term>
+<listitem>
+<para>
+which corresponds to -h and --help;
+</para>
+</listitem>
+</varlistentry>
+<varlistentry>
+<term><literal>ignore_errors</literal></term>
+<listitem>
+<para>
+which corresponds to --ignore-errors;
+</para>
+</listitem>
+</varlistentry>
+<varlistentry>
+<term><literal>implicit_cache</literal></term>
+<listitem>
+<para>
+which corresponds to --implicit-cache;
+</para>
+</listitem>
+</varlistentry>
+<varlistentry>
+<term><literal>implicit_deps_changed</literal></term>
+<listitem>
+<para>
+which corresponds to --implicit-deps-changed;
+</para>
+</listitem>
+</varlistentry>
+<varlistentry>
+<term><literal>implicit_deps_unchanged</literal></term>
+<listitem>
+<para>
+which corresponds to --implicit-deps-unchanged;
+</para>
+</listitem>
+</varlistentry>
+<varlistentry>
+<term><literal>interactive</literal></term>
+<listitem>
+<para>
+which corresponds to --interact and --interactive;
+</para>
+</listitem>
+</varlistentry>
+<varlistentry>
+<term><literal>keep_going</literal></term>
+<listitem>
+<para>
+which corresponds to -k and --keep-going;
+</para>
+</listitem>
+</varlistentry>
+<varlistentry>
+<term><literal>max_drift</literal></term>
+<listitem>
+<para>
+which corresponds to --max-drift;
+</para>
+</listitem>
+</varlistentry>
+<varlistentry>
+<term><literal>no_exec</literal></term>
+<listitem>
+<para>
+which corresponds to -n, --no-exec, --just-print, --dry-run and --recon;
+</para>
+</listitem>
+</varlistentry>
+<varlistentry>
+<term><literal>no_site_dir</literal></term>
+<listitem>
+<para>
+which corresponds to --no-site-dir;
+</para>
+</listitem>
+</varlistentry>
+<varlistentry>
+<term><literal>num_jobs</literal></term>
+<listitem>
+<para>
+which corresponds to -j and --jobs;
+</para>
+</listitem>
+</varlistentry>
+<varlistentry>
+<term><literal>profile_file</literal></term>
+<listitem>
+<para>
+which corresponds to --profile;
+</para>
+</listitem>
+</varlistentry>
+<varlistentry>
+<term><literal>question</literal></term>
+<listitem>
+<para>
+which corresponds to -q and --question;
+</para>
+</listitem>
+</varlistentry>
+<varlistentry>
+<term><literal>random</literal></term>
+<listitem>
+<para>
+which corresponds to --random;
+</para>
+</listitem>
+</varlistentry>
+<varlistentry>
+<term><literal>repository</literal></term>
+<listitem>
+<para>
+which corresponds to -Y, --repository and --srcdir;
+</para>
+</listitem>
+</varlistentry>
+<varlistentry>
+<term><literal>silent</literal></term>
+<listitem>
+<para>
+which corresponds to -s, --silent and --quiet;
+</para>
+</listitem>
+</varlistentry>
+<varlistentry>
+<term><literal>site_dir</literal></term>
+<listitem>
+<para>
+which corresponds to --site-dir;
+</para>
+</listitem>
+</varlistentry>
+<varlistentry>
+<term><literal>stack_size</literal></term>
+<listitem>
+<para>
+which corresponds to --stack-size;
+</para>
+</listitem>
+</varlistentry>
+<varlistentry>
+<term><literal>taskmastertrace_file</literal></term>
+<listitem>
+<para>
+which corresponds to --taskmastertrace; and
+</para>
+</listitem>
+</varlistentry>
+<varlistentry>
+<term><literal>warn</literal></term>
+<listitem>
+<para>
+which corresponds to --warn and --warning.
+</para>
+</listitem>
+</varlistentry>
+</variablelist>
+</para>
+
+<para>
+See the documentation for the
+corresponding command line object for information about each specific
+option.
+</para>
+</summary>
+</scons_function>
+
+<scons_function name="Progress">
+<arguments signature="global">
+(callable, [interval])
+</arguments>
+<arguments signature="global">
+(string, [interval, file, overwrite])
+</arguments>
+<arguments signature="global">
+(list_of_strings, [interval, file, overwrite])
+</arguments>
+<summary>
+<para>
+Allows SCons to show progress made during the build
+by displaying a string or calling a function while
+evaluating Nodes (e.g. files).
+</para>
+
+<para>
+If the first specified argument is a Python callable
+(a function or an object that has a
+<function>__call__</function>()
+method),
+the function will be called
+once every
+<varname>interval</varname>
+times a Node is evaluated.
+The callable will be passed the evaluated Node
+as its only argument.
+(For future compatibility,
+it's a good idea to also add
+<literal>*args</literal>
+and
+<literal>**kw</literal>
+as arguments to your function or method.
+This will prevent the code from breaking
+if SCons ever changes the interface
+to call the function with additional arguments in the future.)
+</para>
+
+<para>
+An example of a simple custom progress function
+that prints a string containing the Node name
+every 10 Nodes:
+</para>
+
+<example_commands>
+def my_progress_function(node, *args, **kw):
+ print('Evaluating node %s!' % node)
+Progress(my_progress_function, interval=10)
+</example_commands>
+
+<para>
+A more complicated example of a custom progress display object
+that prints a string containing a count
+every 100 evaluated Nodes.
+Note the use of
+<literal>\r</literal>
+(a carriage return)
+at the end so that the string
+will overwrite itself on a display:
+</para>
+
+<example_commands>
+import sys
+class ProgressCounter(object):
+ count = 0
+ def __call__(self, node, *args, **kw):
+ self.count += 100
+ sys.stderr.write('Evaluated %s nodes\r' % self.count)
+Progress(ProgressCounter(), interval=100)
+</example_commands>
+
+<para>
+If the first argument
+&f-link-Progress;
+is a string,
+the string will be displayed
+every
+<varname>interval</varname>
+evaluated Nodes.
+The default is to print the string on standard output;
+an alternate output stream
+may be specified with the
+<literal>file=</literal>
+argument.
+The following will print a series of dots
+on the error output,
+one dot for every 100 evaluated Nodes:
+</para>
+
+<example_commands>
+import sys
+Progress('.', interval=100, file=sys.stderr)
+</example_commands>
+
+<para>
+If the string contains the verbatim substring
+&cv-TARGET;,
+it will be replaced with the Node.
+Note that, for performance reasons, this is
+<emphasis>not</emphasis>
+a regular SCons variable substition,
+so you can not use other variables
+or use curly braces.
+The following example will print the name of
+every evaluated Node,
+using a
+<literal>\r</literal>
+(carriage return) to cause each line to overwritten by the next line,
+and the
+<literal>overwrite=</literal>
+keyword argument to make sure the previously-printed
+file name is overwritten with blank spaces:
+</para>
+
+<example_commands>
+import sys
+Progress('$TARGET\r', overwrite=True)
+</example_commands>
+
+<para>
+If the first argument to
+&f-Progress;
+is a list of strings,
+then each string in the list will be displayed
+in rotating fashion every
+<varname>interval</varname>
+evaluated Nodes.
+This can be used to implement a "spinner"
+on the user's screen as follows:
+</para>
+
+<example_commands>
+Progress(['-\r', '\\\r', '|\r', '/\r'], interval=5)
+</example_commands>
+</summary>
+</scons_function>
+
+<scons_function name="Precious">
+<arguments>
+(target, ...)
+</arguments>
+<summary>
+<para>
+Marks each given
+<varname>target</varname>
+as precious so it is not deleted before it is rebuilt. Normally
+&scons;
+deletes a target before building it.
+Multiple targets can be passed in to a single call to
+&f-Precious;.
+</para>
+</summary>
+</scons_function>
+
+<scons_function name="Pseudo">
+<arguments>
+(target, ...)
+</arguments>
+<summary>
+<para>
+This indicates that each given
+<varname>target</varname>
+should not be created by the build rule, and if the target is created,
+an error will be generated. This is similar to the gnu make .PHONY
+target. However, in the vast majority of cases, an
+&f-Alias;
+is more appropriate.
+
+Multiple targets can be passed in to a single call to
+&f-Pseudo;.
+</para>
+</summary>
+</scons_function>
+<scons_function name="SetOption">
+<arguments>
+(name, value)
+</arguments>
+<summary>
+<para>
+This function provides a way to set a select subset of the scons command
+line options from a SConscript file. The options supported are:
+</para>
+
+<para>
+<variablelist>
+<varlistentry>
+<term><literal>clean</literal></term>
+<listitem>
+<para>
+which corresponds to -c, --clean and --remove;
+</para>
+</listitem>
+</varlistentry>
+<varlistentry>
+<term><literal>duplicate</literal></term>
+<listitem>
+<para>
+which corresponds to --duplicate;
+</para>
+</listitem>
+</varlistentry>
+<varlistentry>
+<term><literal>help</literal></term>
+<listitem>
+<para>
+which corresponds to -h and --help;
+</para>
+</listitem>
+</varlistentry>
+<varlistentry>
+<term><literal>implicit_cache</literal></term>
+<listitem>
+<para>
+which corresponds to --implicit-cache;
+</para>
+</listitem>
+</varlistentry>
+<varlistentry>
+<term><literal>max_drift</literal></term>
+<listitem>
+<para>
+which corresponds to --max-drift;
+</para>
+</listitem>
+</varlistentry>
+<varlistentry>
+<term><literal>no_exec</literal></term>
+<listitem>
+<para>
+which corresponds to -n, --no-exec, --just-print, --dry-run and --recon;
+</para>
+</listitem>
+</varlistentry>
+<varlistentry>
+<term><literal>num_jobs</literal></term>
+<listitem>
+<para>
+which corresponds to -j and --jobs;
+</para>
+</listitem>
+</varlistentry>
+<varlistentry>
+<term><literal>random</literal></term>
+<listitem>
+<para>
+which corresponds to --random; and
+</para>
+</listitem>
+</varlistentry>
+<varlistentry>
+<term><literal>silent</literal></term>
+<listitem>
+<para>
+which corresponds to --silent.
+</para>
+</listitem>
+</varlistentry>
+<varlistentry>
+<term><literal>stack_size</literal></term>
+<listitem>
+<para>
+which corresponds to --stack-size.
+</para>
+</listitem>
+</varlistentry>
+</variablelist>
+</para>
+
+<para>
+See the documentation for the
+corresponding command line object for information about each specific
+option.
+</para>
+
+<para>
+Example:
+</para>
+
+<example_commands>
+SetOption('max_drift', 1)
+</example_commands>
+</summary>
+</scons_function>
+
+</sconsdoc>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Script/MainTests.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Script/MainTests.py
new file mode 100644
index 0000000..fd6aaf4
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Script/MainTests.py
@@ -0,0 +1,55 @@
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import unittest
+
+import TestUnit
+
+import SCons.Errors
+import SCons.Script.Main
+
+# Unit tests of various classes within SCons.Script.Main.py.
+#
+# Most of the tests of this functionality are actually end-to-end scripts
+# in the test/ hierarchy.
+#
+# This module is for specific bits of functionality that we can test
+# more effectively here, instead of in an end-to-end test that would
+# have to reach into SCons.Script.Main for various classes or other bits
+# of private functionality.
+
+if __name__ == "__main__":
+ suite = unittest.TestSuite()
+ tclasses = []
+ for tclass in tclasses:
+ names = unittest.getTestCaseNames(tclass, 'test_')
+ suite.addTests(list(map(tclass, names)))
+ TestUnit.run(suite)
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Script/SConsOptions.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Script/SConsOptions.py
new file mode 100644
index 0000000..60d456e
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Script/SConsOptions.py
@@ -0,0 +1,988 @@
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import optparse
+import re
+import sys
+import textwrap
+
+no_hyphen_re = re.compile(r'(\s+|(?<=[\w\!\"\'\&\.\,\?])-{2,}(?=\w))')
+
+try:
+ from gettext import gettext
+except ImportError:
+ def gettext(message):
+ return message
+_ = gettext
+
+import SCons.Node.FS
+import SCons.Warnings
+
+OptionValueError = optparse.OptionValueError
+SUPPRESS_HELP = optparse.SUPPRESS_HELP
+
+diskcheck_all = SCons.Node.FS.diskcheck_types()
+
+def diskcheck_convert(value):
+ if value is None:
+ return []
+ if not SCons.Util.is_List(value):
+ value = value.split(',')
+ result = []
+ for v in value:
+ v = v.lower()
+ if v == 'all':
+ result = diskcheck_all
+ elif v == 'none':
+ result = []
+ elif v in diskcheck_all:
+ result.append(v)
+ else:
+ raise ValueError(v)
+ return result
+
+
+class SConsValues(optparse.Values):
+ """
+ Holder class for uniform access to SCons options, regardless
+ of whether or not they can be set on the command line or in the
+ SConscript files (using the SetOption() function).
+
+ A SCons option value can originate three different ways:
+
+ 1) set on the command line;
+ 2) set in an SConscript file;
+ 3) the default setting (from the the op.add_option()
+ calls in the Parser() function, below).
+
+ The command line always overrides a value set in a SConscript file,
+ which in turn always overrides default settings. Because we want
+ to support user-specified options in the SConscript file itself,
+ though, we may not know about all of the options when the command
+ line is first parsed, so we can't make all the necessary precedence
+ decisions at the time the option is configured.
+
+ The solution implemented in this class is to keep these different sets
+ of settings separate (command line, SConscript file, and default)
+ and to override the __getattr__() method to check them in turn.
+ This should allow the rest of the code to just fetch values as
+ attributes of an instance of this class, without having to worry
+ about where they came from.
+
+ Note that not all command line options are settable from SConscript
+ files, and the ones that are must be explicitly added to the
+ "settable" list in this class, and optionally validated and coerced
+ in the set_option() method.
+ """
+
+ def __init__(self, defaults):
+ self.__dict__['__defaults__'] = defaults
+ self.__dict__['__SConscript_settings__'] = {}
+
+ def __getattr__(self, attr):
+ """
+ Fetches an options value, checking first for explicit settings
+ from the command line (which are direct attributes), then the
+ SConscript file settings, then the default values.
+ """
+ try:
+ return self.__dict__[attr]
+ except KeyError:
+ try:
+ return self.__dict__['__SConscript_settings__'][attr]
+ except KeyError:
+ try:
+ return getattr(self.__dict__['__defaults__'], attr)
+ except KeyError:
+ # Added because with py3 this is a new class,
+ # not a classic class, and due to the way
+ # In that case it will create an object without
+ # __defaults__, and then query for __setstate__
+ # which will throw an exception of KeyError
+ # deepcopy() is expecting AttributeError if __setstate__
+ # is not available.
+ raise AttributeError(attr)
+
+
+ settable = [
+ 'clean',
+ 'diskcheck',
+ 'duplicate',
+ 'help',
+ 'implicit_cache',
+ 'max_drift',
+ 'md5_chunksize',
+ 'no_exec',
+ 'num_jobs',
+ 'random',
+ 'stack_size',
+ 'warn',
+ 'silent'
+ ]
+
+ def set_option(self, name, value):
+ """
+ Sets an option from an SConscript file.
+ """
+ if not name in self.settable:
+ raise SCons.Errors.UserError("This option is not settable from a SConscript file: %s"%name)
+
+ if name == 'num_jobs':
+ try:
+ value = int(value)
+ if value < 1:
+ raise ValueError
+ except ValueError:
+ raise SCons.Errors.UserError("A positive integer is required: %s"%repr(value))
+ elif name == 'max_drift':
+ try:
+ value = int(value)
+ except ValueError:
+ raise SCons.Errors.UserError("An integer is required: %s"%repr(value))
+ elif name == 'duplicate':
+ try:
+ value = str(value)
+ except ValueError:
+ raise SCons.Errors.UserError("A string is required: %s"%repr(value))
+ if not value in SCons.Node.FS.Valid_Duplicates:
+ raise SCons.Errors.UserError("Not a valid duplication style: %s" % value)
+ # Set the duplicate style right away so it can affect linking
+ # of SConscript files.
+ SCons.Node.FS.set_duplicate(value)
+ elif name == 'diskcheck':
+ try:
+ value = diskcheck_convert(value)
+ except ValueError as v:
+ raise SCons.Errors.UserError("Not a valid diskcheck value: %s"%v)
+ if 'diskcheck' not in self.__dict__:
+ # No --diskcheck= option was specified on the command line.
+ # Set this right away so it can affect the rest of the
+ # file/Node lookups while processing the SConscript files.
+ SCons.Node.FS.set_diskcheck(value)
+ elif name == 'stack_size':
+ try:
+ value = int(value)
+ except ValueError:
+ raise SCons.Errors.UserError("An integer is required: %s"%repr(value))
+ elif name == 'md5_chunksize':
+ try:
+ value = int(value)
+ except ValueError:
+ raise SCons.Errors.UserError("An integer is required: %s"%repr(value))
+ elif name == 'warn':
+ if SCons.Util.is_String(value):
+ value = [value]
+ value = self.__SConscript_settings__.get(name, []) + value
+ SCons.Warnings.process_warn_strings(value)
+
+ self.__SConscript_settings__[name] = value
+
+
+class SConsOption(optparse.Option):
+ def convert_value(self, opt, value):
+ if value is not None:
+ if self.nargs in (1, '?'):
+ return self.check_value(opt, value)
+ else:
+ return tuple([self.check_value(opt, v) for v in value])
+
+ def process(self, opt, value, values, parser):
+
+ # First, convert the value(s) to the right type. Howl if any
+ # value(s) are bogus.
+ value = self.convert_value(opt, value)
+
+ # And then take whatever action is expected of us.
+ # This is a separate method to make life easier for
+ # subclasses to add new actions.
+ return self.take_action(
+ self.action, self.dest, opt, value, values, parser)
+
+ def _check_nargs_optional(self):
+ if self.nargs == '?' and self._short_opts:
+ fmt = "option %s: nargs='?' is incompatible with short options"
+ raise SCons.Errors.UserError(fmt % self._short_opts[0])
+
+ try:
+ _orig_CONST_ACTIONS = optparse.Option.CONST_ACTIONS
+
+ _orig_CHECK_METHODS = optparse.Option.CHECK_METHODS
+
+ except AttributeError:
+ # optparse.Option had no CONST_ACTIONS before Python 2.5.
+
+ _orig_CONST_ACTIONS = ("store_const",)
+
+ def _check_const(self):
+ if self.action not in self.CONST_ACTIONS and self.const is not None:
+ raise OptionError(
+ "'const' must not be supplied for action %r" % self.action,
+ self)
+
+ # optparse.Option collects its list of unbound check functions
+ # up front. This sucks because it means we can't just override
+ # the _check_const() function like a normal method, we have to
+ # actually replace it in the list. This seems to be the most
+ # straightforward way to do that.
+
+ _orig_CHECK_METHODS = [optparse.Option._check_action,
+ optparse.Option._check_type,
+ optparse.Option._check_choice,
+ optparse.Option._check_dest,
+ _check_const,
+ optparse.Option._check_nargs,
+ optparse.Option._check_callback]
+
+ CHECK_METHODS = _orig_CHECK_METHODS + [_check_nargs_optional]
+
+ CONST_ACTIONS = _orig_CONST_ACTIONS + optparse.Option.TYPED_ACTIONS
+
+class SConsOptionGroup(optparse.OptionGroup):
+ """
+ A subclass for SCons-specific option groups.
+
+ The only difference between this and the base class is that we print
+ the group's help text flush left, underneath their own title but
+ lined up with the normal "SCons Options".
+ """
+ def format_help(self, formatter):
+ """
+ Format an option group's help text, outdenting the title so it's
+ flush with the "SCons Options" title we print at the top.
+ """
+ formatter.dedent()
+ result = formatter.format_heading(self.title)
+ formatter.indent()
+ result = result + optparse.OptionContainer.format_help(self, formatter)
+ return result
+
+class SConsOptionParser(optparse.OptionParser):
+ preserve_unknown_options = False
+
+ def error(self, msg):
+ # overridden OptionValueError exception handler
+ self.print_usage(sys.stderr)
+ sys.stderr.write("SCons Error: %s\n" % msg)
+ sys.exit(2)
+
+ def _process_long_opt(self, rargs, values):
+ """
+ SCons-specific processing of long options.
+
+ This is copied directly from the normal
+ optparse._process_long_opt() method, except that, if configured
+ to do so, we catch the exception thrown when an unknown option
+ is encountered and just stick it back on the "leftover" arguments
+ for later (re-)processing.
+ """
+ arg = rargs.pop(0)
+
+ # Value explicitly attached to arg? Pretend it's the next
+ # argument.
+ if "=" in arg:
+ (opt, next_arg) = arg.split("=", 1)
+ rargs.insert(0, next_arg)
+ had_explicit_value = True
+ else:
+ opt = arg
+ had_explicit_value = False
+
+ try:
+ opt = self._match_long_opt(opt)
+ except optparse.BadOptionError:
+ if self.preserve_unknown_options:
+ # SCons-specific: if requested, add unknown options to
+ # the "leftover arguments" list for later processing.
+ self.largs.append(arg)
+ if had_explicit_value:
+ # The unknown option will be re-processed later,
+ # so undo the insertion of the explicit value.
+ rargs.pop(0)
+ return
+ raise
+
+ option = self._long_opt[opt]
+ if option.takes_value():
+ nargs = option.nargs
+ if nargs == '?':
+ if had_explicit_value:
+ value = rargs.pop(0)
+ else:
+ value = option.const
+ elif len(rargs) < nargs:
+ if nargs == 1:
+ if not option.choices:
+ self.error(_("%s option requires an argument") % opt)
+ else:
+ msg = _("%s option requires an argument " % opt)
+ msg += _("(choose from %s)"
+ % ', '.join(option.choices))
+ self.error(msg)
+ else:
+ self.error(_("%s option requires %d arguments")
+ % (opt, nargs))
+ elif nargs == 1:
+ value = rargs.pop(0)
+ else:
+ value = tuple(rargs[0:nargs])
+ del rargs[0:nargs]
+
+ elif had_explicit_value:
+ self.error(_("%s option does not take a value") % opt)
+
+ else:
+ value = None
+
+ option.process(opt, value, values, self)
+
+ def reparse_local_options(self):
+ """
+ Re-parse the leftover command-line options stored
+ in self.largs, so that any value overridden on the
+ command line is immediately available if the user turns
+ around and does a GetOption() right away.
+
+ We mimic the processing of the single args
+ in the original OptionParser._process_args(), but here we
+ allow exact matches for long-opts only (no partial
+ argument names!).
+
+ Else, this would lead to problems in add_local_option()
+ below. When called from there, we try to reparse the
+ command-line arguments that
+ 1. haven't been processed so far (self.largs), but
+ 2. are possibly not added to the list of options yet.
+
+ So, when we only have a value for "--myargument" yet,
+ a command-line argument of "--myarg=test" would set it.
+ Responsible for this behaviour is the method
+ _match_long_opt(), which allows for partial matches of
+ the option name, as long as the common prefix appears to
+ be unique.
+ This would lead to further confusion, because we might want
+ to add another option "--myarg" later on (see issue #2929).
+
+ """
+ rargs = []
+ largs_restore = []
+ # Loop over all remaining arguments
+ skip = False
+ for l in self.largs:
+ if skip:
+ # Accept all remaining arguments as they are
+ largs_restore.append(l)
+ else:
+ if len(l) > 2 and l[0:2] == "--":
+ # Check long option
+ lopt = (l,)
+ if "=" in l:
+ # Split into option and value
+ lopt = l.split("=", 1)
+
+ if lopt[0] in self._long_opt:
+ # Argument is already known
+ rargs.append('='.join(lopt))
+ else:
+ # Not known yet, so reject for now
+ largs_restore.append('='.join(lopt))
+ else:
+ if l == "--" or l == "-":
+ # Stop normal processing and don't
+ # process the rest of the command-line opts
+ largs_restore.append(l)
+ skip = True
+ else:
+ rargs.append(l)
+
+ # Parse the filtered list
+ self.parse_args(rargs, self.values)
+ # Restore the list of remaining arguments for the
+ # next call of AddOption/add_local_option...
+ self.largs = self.largs + largs_restore
+
+ def add_local_option(self, *args, **kw):
+ """
+ Adds a local option to the parser.
+
+ This is initiated by a SetOption() call to add a user-defined
+ command-line option. We add the option to a separate option
+ group for the local options, creating the group if necessary.
+ """
+ try:
+ group = self.local_option_group
+ except AttributeError:
+ group = SConsOptionGroup(self, 'Local Options')
+ group = self.add_option_group(group)
+ self.local_option_group = group
+
+ result = group.add_option(*args, **kw)
+
+ if result:
+ # The option was added successfully. We now have to add the
+ # default value to our object that holds the default values
+ # (so that an attempt to fetch the option's attribute will
+ # yield the default value when not overridden) and then
+ # we re-parse the leftover command-line options, so that
+ # any value overridden on the command line is immediately
+ # available if the user turns around and does a GetOption()
+ # right away.
+ setattr(self.values.__defaults__, result.dest, result.default)
+ self.reparse_local_options()
+
+ return result
+
+class SConsIndentedHelpFormatter(optparse.IndentedHelpFormatter):
+ def format_usage(self, usage):
+ return "usage: %s\n" % usage
+
+ def format_heading(self, heading):
+ """
+ This translates any heading of "options" or "Options" into
+ "SCons Options." Unfortunately, we have to do this here,
+ because those titles are hard-coded in the optparse calls.
+ """
+ if heading == 'Options':
+ heading = "SCons Options"
+ return optparse.IndentedHelpFormatter.format_heading(self, heading)
+
+ def format_option(self, option):
+ """
+ A copy of the normal optparse.IndentedHelpFormatter.format_option()
+ method. This has been snarfed so we can modify text wrapping to
+ out liking:
+
+ -- add our own regular expression that doesn't break on hyphens
+ (so things like --no-print-directory don't get broken);
+
+ -- wrap the list of options themselves when it's too long
+ (the wrapper.fill(opts) call below);
+
+ -- set the subsequent_indent when wrapping the help_text.
+ """
+ # The help for each option consists of two parts:
+ # * the opt strings and metavars
+ # eg. ("-x", or "-fFILENAME, --file=FILENAME")
+ # * the user-supplied help string
+ # eg. ("turn on expert mode", "read data from FILENAME")
+ #
+ # If possible, we write both of these on the same line:
+ # -x turn on expert mode
+ #
+ # But if the opt string list is too long, we put the help
+ # string on a second line, indented to the same column it would
+ # start in if it fit on the first line.
+ # -fFILENAME, --file=FILENAME
+ # read data from FILENAME
+ result = []
+
+ opts = self.option_strings[option]
+ opt_width = self.help_position - self.current_indent - 2
+ if len(opts) > opt_width:
+ wrapper = textwrap.TextWrapper(width=self.width,
+ initial_indent = ' ',
+ subsequent_indent = ' ')
+ wrapper.wordsep_re = no_hyphen_re
+ opts = wrapper.fill(opts) + '\n'
+ indent_first = self.help_position
+ else: # start help on same line as opts
+ opts = "%*s%-*s " % (self.current_indent, "", opt_width, opts)
+ indent_first = 0
+ result.append(opts)
+ if option.help:
+
+ help_text = self.expand_default(option)
+
+ # SCons: indent every line of the help text but the first.
+ wrapper = textwrap.TextWrapper(width=self.help_width,
+ subsequent_indent = ' ')
+ wrapper.wordsep_re = no_hyphen_re
+ help_lines = wrapper.wrap(help_text)
+ result.append("%*s%s\n" % (indent_first, "", help_lines[0]))
+ for line in help_lines[1:]:
+ result.append("%*s%s\n" % (self.help_position, "", line))
+ elif opts[-1] != "\n":
+ result.append("\n")
+ return "".join(result)
+
+def Parser(version):
+ """
+ Returns an options parser object initialized with the standard
+ SCons options.
+ """
+
+ formatter = SConsIndentedHelpFormatter(max_help_position=30)
+
+ op = SConsOptionParser(option_class=SConsOption,
+ add_help_option=False,
+ formatter=formatter,
+ usage="usage: scons [OPTION] [TARGET] ...",)
+
+ op.preserve_unknown_options = True
+ op.version = version
+
+ # Add the options to the parser we just created.
+ #
+ # These are in the order we want them to show up in the -H help
+ # text, basically alphabetical. Each op.add_option() call below
+ # should have a consistent format:
+ #
+ # op.add_option("-L", "--long-option-name",
+ # nargs=1, type="string",
+ # dest="long_option_name", default='foo',
+ # action="callback", callback=opt_long_option,
+ # help="help text goes here",
+ # metavar="VAR")
+ #
+ # Even though the optparse module constructs reasonable default
+ # destination names from the long option names, we're going to be
+ # explicit about each one for easier readability and so this code
+ # will at least show up when grepping the source for option attribute
+ # names, or otherwise browsing the source code.
+
+ # options ignored for compatibility
+ def opt_ignore(option, opt, value, parser):
+ sys.stderr.write("Warning: ignoring %s option\n" % opt)
+ op.add_option("-b", "-d", "-e", "-m", "-S", "-t", "-w",
+ "--environment-overrides",
+ "--no-keep-going",
+ "--no-print-directory",
+ "--print-directory",
+ "--stop",
+ "--touch",
+ action="callback", callback=opt_ignore,
+ help="Ignored for compatibility.")
+
+ op.add_option('-c', '--clean', '--remove',
+ dest="clean", default=False,
+ action="store_true",
+ help="Remove specified targets and dependencies.")
+
+ op.add_option('-C', '--directory',
+ nargs=1, type="string",
+ dest="directory", default=[],
+ action="append",
+ help="Change to DIR before doing anything.",
+ metavar="DIR")
+
+ op.add_option('--cache-debug',
+ nargs=1,
+ dest="cache_debug", default=None,
+ action="store",
+ help="Print CacheDir debug info to FILE.",
+ metavar="FILE")
+
+ op.add_option('--cache-disable', '--no-cache',
+ dest='cache_disable', default=False,
+ action="store_true",
+ help="Do not retrieve built targets from CacheDir.")
+
+ op.add_option('--cache-force', '--cache-populate',
+ dest='cache_force', default=False,
+ action="store_true",
+ help="Copy already-built targets into the CacheDir.")
+
+ op.add_option('--cache-readonly',
+ dest='cache_readonly', default=False,
+ action="store_true",
+ help="Do not update CacheDir with built targets.")
+
+ op.add_option('--cache-show',
+ dest='cache_show', default=False,
+ action="store_true",
+ help="Print build actions for files from CacheDir.")
+
+ def opt_invalid(group, value, options):
+ errmsg = "`%s' is not a valid %s option type, try:\n" % (value, group)
+ return errmsg + " %s" % ", ".join(options)
+
+ config_options = ["auto", "force" ,"cache"]
+
+ opt_config_help = "Controls Configure subsystem: %s." \
+ % ", ".join(config_options)
+
+ op.add_option('--config',
+ nargs=1, choices=config_options,
+ dest="config", default="auto",
+ help = opt_config_help,
+ metavar="MODE")
+
+ op.add_option('-D',
+ dest="climb_up", default=None,
+ action="store_const", const=2,
+ help="Search up directory tree for SConstruct, "
+ "build all Default() targets.")
+
+ deprecated_debug_options = {
+ "dtree" : '; please use --tree=derived instead',
+ "nomemoizer" : ' and has no effect',
+ "stree" : '; please use --tree=all,status instead',
+ "tree" : '; please use --tree=all instead',
+ }
+
+ debug_options = ["count", "duplicate", "explain", "findlibs",
+ "includes", "memoizer", "memory", "objects",
+ "pdb", "prepare", "presub", "stacktrace",
+ "time"]
+
+ def opt_debug(option, opt, value__, parser,
+ debug_options=debug_options,
+ deprecated_debug_options=deprecated_debug_options):
+ for value in value__.split(','):
+ if value in debug_options:
+ parser.values.debug.append(value)
+ elif value in list(deprecated_debug_options.keys()):
+ parser.values.debug.append(value)
+ try:
+ parser.values.delayed_warnings
+ except AttributeError:
+ parser.values.delayed_warnings = []
+ msg = deprecated_debug_options[value]
+ w = "The --debug=%s option is deprecated%s." % (value, msg)
+ t = (SCons.Warnings.DeprecatedDebugOptionsWarning, w)
+ parser.values.delayed_warnings.append(t)
+ else:
+ raise OptionValueError(opt_invalid('debug', value, debug_options))
+
+ opt_debug_help = "Print various types of debugging information: %s." \
+ % ", ".join(debug_options)
+ op.add_option('--debug',
+ nargs=1, type="string",
+ dest="debug", default=[],
+ action="callback", callback=opt_debug,
+ help=opt_debug_help,
+ metavar="TYPE")
+
+ def opt_diskcheck(option, opt, value, parser):
+ try:
+ diskcheck_value = diskcheck_convert(value)
+ except ValueError as e:
+ raise OptionValueError("`%s' is not a valid diskcheck type" % e)
+ setattr(parser.values, option.dest, diskcheck_value)
+
+ op.add_option('--diskcheck',
+ nargs=1, type="string",
+ dest='diskcheck', default=None,
+ action="callback", callback=opt_diskcheck,
+ help="Enable specific on-disk checks.",
+ metavar="TYPE")
+
+ def opt_duplicate(option, opt, value, parser):
+ if not value in SCons.Node.FS.Valid_Duplicates:
+ raise OptionValueError(opt_invalid('duplication', value,
+ SCons.Node.FS.Valid_Duplicates))
+ setattr(parser.values, option.dest, value)
+ # Set the duplicate style right away so it can affect linking
+ # of SConscript files.
+ SCons.Node.FS.set_duplicate(value)
+
+ opt_duplicate_help = "Set the preferred duplication methods. Must be one of " \
+ + ", ".join(SCons.Node.FS.Valid_Duplicates)
+
+ op.add_option('--duplicate',
+ nargs=1, type="string",
+ dest="duplicate", default='hard-soft-copy',
+ action="callback", callback=opt_duplicate,
+ help=opt_duplicate_help)
+
+ op.add_option('-f', '--file', '--makefile', '--sconstruct',
+ nargs=1, type="string",
+ dest="file", default=[],
+ action="append",
+ help="Read FILE as the top-level SConstruct file.")
+
+ op.add_option('-h', '--help',
+ dest="help", default=False,
+ action="store_true",
+ help="Print defined help message, or this one.")
+
+ op.add_option("-H", "--help-options",
+ action="help",
+ help="Print this message and exit.")
+
+ op.add_option('-i', '--ignore-errors',
+ dest='ignore_errors', default=False,
+ action="store_true",
+ help="Ignore errors from build actions.")
+
+ op.add_option('-I', '--include-dir',
+ nargs=1,
+ dest='include_dir', default=[],
+ action="append",
+ help="Search DIR for imported Python modules.",
+ metavar="DIR")
+
+ op.add_option('--implicit-cache',
+ dest='implicit_cache', default=False,
+ action="store_true",
+ help="Cache implicit dependencies")
+
+ def opt_implicit_deps(option, opt, value, parser):
+ setattr(parser.values, 'implicit_cache', True)
+ setattr(parser.values, option.dest, True)
+
+ op.add_option('--implicit-deps-changed',
+ dest="implicit_deps_changed", default=False,
+ action="callback", callback=opt_implicit_deps,
+ help="Ignore cached implicit dependencies.")
+
+ op.add_option('--implicit-deps-unchanged',
+ dest="implicit_deps_unchanged", default=False,
+ action="callback", callback=opt_implicit_deps,
+ help="Ignore changes in implicit dependencies.")
+
+ op.add_option('--interact', '--interactive',
+ dest='interactive', default=False,
+ action="store_true",
+ help="Run in interactive mode.")
+
+ op.add_option('-j', '--jobs',
+ nargs=1, type="int",
+ dest="num_jobs", default=1,
+ action="store",
+ help="Allow N jobs at once.",
+ metavar="N")
+
+ op.add_option('-k', '--keep-going',
+ dest='keep_going', default=False,
+ action="store_true",
+ help="Keep going when a target can't be made.")
+
+ op.add_option('--max-drift',
+ nargs=1, type="int",
+ dest='max_drift', default=SCons.Node.FS.default_max_drift,
+ action="store",
+ help="Set maximum system clock drift to N seconds.",
+ metavar="N")
+
+ op.add_option('--md5-chunksize',
+ nargs=1, type="int",
+ dest='md5_chunksize', default=SCons.Node.FS.File.md5_chunksize,
+ action="store",
+ help="Set chunk-size for MD5 signature computation to N kilobytes.",
+ metavar="N")
+
+ op.add_option('-n', '--no-exec', '--just-print', '--dry-run', '--recon',
+ dest='no_exec', default=False,
+ action="store_true",
+ help="Don't build; just print commands.")
+
+ op.add_option('--no-site-dir',
+ dest='no_site_dir', default=False,
+ action="store_true",
+ help="Don't search or use the usual site_scons dir.")
+
+ op.add_option('--profile',
+ nargs=1,
+ dest="profile_file", default=None,
+ action="store",
+ help="Profile SCons and put results in FILE.",
+ metavar="FILE")
+
+ op.add_option('-q', '--question',
+ dest="question", default=False,
+ action="store_true",
+ help="Don't build; exit status says if up to date.")
+
+ op.add_option('-Q',
+ dest='no_progress', default=False,
+ action="store_true",
+ help="Suppress \"Reading/Building\" progress messages.")
+
+ op.add_option('--random',
+ dest="random", default=False,
+ action="store_true",
+ help="Build dependencies in random order.")
+
+ op.add_option('-s', '--silent', '--quiet',
+ dest="silent", default=False,
+ action="store_true",
+ help="Don't print commands.")
+
+ op.add_option('--site-dir',
+ nargs=1,
+ dest='site_dir', default=None,
+ action="store",
+ help="Use DIR instead of the usual site_scons dir.",
+ metavar="DIR")
+
+ op.add_option('--stack-size',
+ nargs=1, type="int",
+ dest='stack_size',
+ action="store",
+ help="Set the stack size of the threads used to run jobs to N kilobytes.",
+ metavar="N")
+
+ op.add_option('--taskmastertrace',
+ nargs=1,
+ dest="taskmastertrace_file", default=None,
+ action="store",
+ help="Trace Node evaluation to FILE.",
+ metavar="FILE")
+
+ tree_options = ["all", "derived", "prune", "status"]
+
+ def opt_tree(option, opt, value, parser, tree_options=tree_options):
+ from . import Main
+ tp = Main.TreePrinter()
+ for o in value.split(','):
+ if o == 'all':
+ tp.derived = False
+ elif o == 'derived':
+ tp.derived = True
+ elif o == 'prune':
+ tp.prune = True
+ elif o == 'status':
+ tp.status = True
+ else:
+ raise OptionValueError(opt_invalid('--tree', o, tree_options))
+ parser.values.tree_printers.append(tp)
+
+ opt_tree_help = "Print a dependency tree in various formats: %s." \
+ % ", ".join(tree_options)
+
+ op.add_option('--tree',
+ nargs=1, type="string",
+ dest="tree_printers", default=[],
+ action="callback", callback=opt_tree,
+ help=opt_tree_help,
+ metavar="OPTIONS")
+
+ op.add_option('-u', '--up', '--search-up',
+ dest="climb_up", default=0,
+ action="store_const", const=1,
+ help="Search up directory tree for SConstruct, "
+ "build targets at or below current directory.")
+
+ op.add_option('-U',
+ dest="climb_up", default=0,
+ action="store_const", const=3,
+ help="Search up directory tree for SConstruct, "
+ "build Default() targets from local SConscript.")
+
+ def opt_version(option, opt, value, parser):
+ sys.stdout.write(parser.version + '\n')
+ sys.exit(0)
+ op.add_option("-v", "--version",
+ action="callback", callback=opt_version,
+ help="Print the SCons version number and exit.")
+
+ def opt_warn(option, opt, value, parser, tree_options=tree_options):
+ if SCons.Util.is_String(value):
+ value = value.split(',')
+ parser.values.warn.extend(value)
+
+ op.add_option('--warn', '--warning',
+ nargs=1, type="string",
+ dest="warn", default=[],
+ action="callback", callback=opt_warn,
+ help="Enable or disable warnings.",
+ metavar="WARNING-SPEC")
+
+ op.add_option('-Y', '--repository', '--srcdir',
+ nargs=1,
+ dest="repository", default=[],
+ action="append",
+ help="Search REPOSITORY for source and target files.")
+
+ # Options from Make and Cons classic that we do not yet support,
+ # but which we may support someday and whose (potential) meanings
+ # we don't want to change. These all get a "the -X option is not
+ # yet implemented" message and don't show up in the help output.
+
+ def opt_not_yet(option, opt, value, parser):
+ msg = "Warning: the %s option is not yet implemented\n" % opt
+ sys.stderr.write(msg)
+
+ op.add_option('-l', '--load-average', '--max-load',
+ nargs=1, type="float",
+ dest="load_average", default=0,
+ action="callback", callback=opt_not_yet,
+ # action="store",
+ # help="Don't start multiple jobs unless load is below "
+ # "LOAD-AVERAGE."
+ help=SUPPRESS_HELP)
+ op.add_option('--list-actions',
+ dest="list_actions",
+ action="callback", callback=opt_not_yet,
+ # help="Don't build; list files and build actions."
+ help=SUPPRESS_HELP)
+ op.add_option('--list-derived',
+ dest="list_derived",
+ action="callback", callback=opt_not_yet,
+ # help="Don't build; list files that would be built."
+ help=SUPPRESS_HELP)
+ op.add_option('--list-where',
+ dest="list_where",
+ action="callback", callback=opt_not_yet,
+ # help="Don't build; list files and where defined."
+ help=SUPPRESS_HELP)
+ op.add_option('-o', '--old-file', '--assume-old',
+ nargs=1, type="string",
+ dest="old_file", default=[],
+ action="callback", callback=opt_not_yet,
+ # action="append",
+ # help = "Consider FILE to be old; don't rebuild it."
+ help=SUPPRESS_HELP)
+ op.add_option('--override',
+ nargs=1, type="string",
+ action="callback", callback=opt_not_yet,
+ dest="override",
+ # help="Override variables as specified in FILE."
+ help=SUPPRESS_HELP)
+ op.add_option('-p',
+ action="callback", callback=opt_not_yet,
+ dest="p",
+ # help="Print internal environments/objects."
+ help=SUPPRESS_HELP)
+ op.add_option('-r', '-R', '--no-builtin-rules', '--no-builtin-variables',
+ action="callback", callback=opt_not_yet,
+ dest="no_builtin_rules",
+ # help="Clear default environments and variables."
+ help=SUPPRESS_HELP)
+ op.add_option('--write-filenames',
+ nargs=1, type="string",
+ dest="write_filenames",
+ action="callback", callback=opt_not_yet,
+ # help="Write all filenames examined into FILE."
+ help=SUPPRESS_HELP)
+ op.add_option('-W', '--new-file', '--assume-new', '--what-if',
+ nargs=1, type="string",
+ dest="new_file",
+ action="callback", callback=opt_not_yet,
+ # help="Consider FILE to be changed."
+ help=SUPPRESS_HELP)
+ op.add_option('--warn-undefined-variables',
+ dest="warn_undefined_variables",
+ action="callback", callback=opt_not_yet,
+ # help="Warn when an undefined variable is referenced."
+ help=SUPPRESS_HELP)
+
+ return op
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Script/SConscript.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Script/SConscript.py
new file mode 100644
index 0000000..db6552c
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Script/SConscript.py
@@ -0,0 +1,640 @@
+"""SCons.Script.SConscript
+
+This module defines the Python API provided to SConscript and SConstruct
+files.
+
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import SCons
+import SCons.Action
+import SCons.Builder
+import SCons.Defaults
+import SCons.Environment
+import SCons.Errors
+import SCons.Node
+import SCons.Node.Alias
+import SCons.Node.FS
+import SCons.Platform
+import SCons.SConf
+import SCons.Script.Main
+import SCons.Tool
+import SCons.Util
+
+from . import Main
+
+import collections
+import os
+import os.path
+import re
+import sys
+import traceback
+import time
+
+class SConscriptReturn(Exception):
+ pass
+
+launch_dir = os.path.abspath(os.curdir)
+
+GlobalDict = None
+
+# global exports set by Export():
+global_exports = {}
+
+# chdir flag
+sconscript_chdir = 1
+
+def get_calling_namespaces():
+ """Return the locals and globals for the function that called
+ into this module in the current call stack."""
+ try: 1//0
+ except ZeroDivisionError:
+ # Don't start iterating with the current stack-frame to
+ # prevent creating reference cycles (f_back is safe).
+ frame = sys.exc_info()[2].tb_frame.f_back
+
+ # Find the first frame that *isn't* from this file. This means
+ # that we expect all of the SCons frames that implement an Export()
+ # or SConscript() call to be in this file, so that we can identify
+ # the first non-Script.SConscript frame as the user's local calling
+ # environment, and the locals and globals dictionaries from that
+ # frame as the calling namespaces. See the comment below preceding
+ # the DefaultEnvironmentCall block for even more explanation.
+ while frame.f_globals.get("__name__") == __name__:
+ frame = frame.f_back
+
+ return frame.f_locals, frame.f_globals
+
+
+def compute_exports(exports):
+ """Compute a dictionary of exports given one of the parameters
+ to the Export() function or the exports argument to SConscript()."""
+
+ loc, glob = get_calling_namespaces()
+
+ retval = {}
+ try:
+ for export in exports:
+ if SCons.Util.is_Dict(export):
+ retval.update(export)
+ else:
+ try:
+ retval[export] = loc[export]
+ except KeyError:
+ retval[export] = glob[export]
+ except KeyError as x:
+ raise SCons.Errors.UserError("Export of non-existent variable '%s'"%x)
+
+ return retval
+
+class Frame(object):
+ """A frame on the SConstruct/SConscript call stack"""
+ def __init__(self, fs, exports, sconscript):
+ self.globals = BuildDefaultGlobals()
+ self.retval = None
+ self.prev_dir = fs.getcwd()
+ self.exports = compute_exports(exports) # exports from the calling SConscript
+ # make sure the sconscript attr is a Node.
+ if isinstance(sconscript, SCons.Node.Node):
+ self.sconscript = sconscript
+ elif sconscript == '-':
+ self.sconscript = None
+ else:
+ self.sconscript = fs.File(str(sconscript))
+
+# the SConstruct/SConscript call stack:
+call_stack = []
+
+# For documentation on the methods in this file, see the scons man-page
+
+def Return(*vars, **kw):
+ retval = []
+ try:
+ fvars = SCons.Util.flatten(vars)
+ for var in fvars:
+ for v in var.split():
+ retval.append(call_stack[-1].globals[v])
+ except KeyError as x:
+ raise SCons.Errors.UserError("Return of non-existent variable '%s'"%x)
+
+ if len(retval) == 1:
+ call_stack[-1].retval = retval[0]
+ else:
+ call_stack[-1].retval = tuple(retval)
+
+ stop = kw.get('stop', True)
+
+ if stop:
+ raise SConscriptReturn
+
+
+stack_bottom = '% Stack boTTom %' # hard to define a variable w/this name :)
+
+def _SConscript(fs, *files, **kw):
+ top = fs.Top
+ sd = fs.SConstruct_dir.rdir()
+ exports = kw.get('exports', [])
+
+ # evaluate each SConscript file
+ results = []
+ for fn in files:
+ call_stack.append(Frame(fs, exports, fn))
+ old_sys_path = sys.path
+ try:
+ SCons.Script.sconscript_reading = SCons.Script.sconscript_reading + 1
+ if fn == "-":
+ exec(sys.stdin.read(), call_stack[-1].globals)
+ else:
+ if isinstance(fn, SCons.Node.Node):
+ f = fn
+ else:
+ f = fs.File(str(fn))
+ _file_ = None
+
+ # Change directory to the top of the source
+ # tree to make sure the os's cwd and the cwd of
+ # fs match so we can open the SConscript.
+ fs.chdir(top, change_os_dir=1)
+ if f.rexists():
+ actual = f.rfile()
+ _file_ = open(actual.get_abspath(), "rb")
+ elif f.srcnode().rexists():
+ actual = f.srcnode().rfile()
+ _file_ = open(actual.get_abspath(), "rb")
+ elif f.has_src_builder():
+ # The SConscript file apparently exists in a source
+ # code management system. Build it, but then clear
+ # the builder so that it doesn't get built *again*
+ # during the actual build phase.
+ f.build()
+ f.built()
+ f.builder_set(None)
+ if f.exists():
+ _file_ = open(f.get_abspath(), "rb")
+ if _file_:
+ # Chdir to the SConscript directory. Use a path
+ # name relative to the SConstruct file so that if
+ # we're using the -f option, we're essentially
+ # creating a parallel SConscript directory structure
+ # in our local directory tree.
+ #
+ # XXX This is broken for multiple-repository cases
+ # where the SConstruct and SConscript files might be
+ # in different Repositories. For now, cross that
+ # bridge when someone comes to it.
+ try:
+ src_dir = kw['src_dir']
+ except KeyError:
+ ldir = fs.Dir(f.dir.get_path(sd))
+ else:
+ ldir = fs.Dir(src_dir)
+ if not ldir.is_under(f.dir):
+ # They specified a source directory, but
+ # it's above the SConscript directory.
+ # Do the sensible thing and just use the
+ # SConcript directory.
+ ldir = fs.Dir(f.dir.get_path(sd))
+ try:
+ fs.chdir(ldir, change_os_dir=sconscript_chdir)
+ except OSError:
+ # There was no local directory, so we should be
+ # able to chdir to the Repository directory.
+ # Note that we do this directly, not through
+ # fs.chdir(), because we still need to
+ # interpret the stuff within the SConscript file
+ # relative to where we are logically.
+ fs.chdir(ldir, change_os_dir=0)
+ os.chdir(actual.dir.get_abspath())
+
+ # Append the SConscript directory to the beginning
+ # of sys.path so Python modules in the SConscript
+ # directory can be easily imported.
+ sys.path = [ f.dir.get_abspath() ] + sys.path
+
+ # This is the magic line that actually reads up
+ # and executes the stuff in the SConscript file.
+ # The locals for this frame contain the special
+ # bottom-of-the-stack marker so that any
+ # exceptions that occur when processing this
+ # SConscript can base the printed frames at this
+ # level and not show SCons internals as well.
+ call_stack[-1].globals.update({stack_bottom:1})
+ old_file = call_stack[-1].globals.get('__file__')
+ try:
+ del call_stack[-1].globals['__file__']
+ except KeyError:
+ pass
+ try:
+ try:
+# _file_ = SCons.Util.to_str(_file_)
+ if Main.print_time:
+ time1 = time.time()
+ exec(compile(_file_.read(), _file_.name, 'exec'),
+ call_stack[-1].globals)
+ except SConscriptReturn:
+ pass
+ finally:
+ if Main.print_time:
+ time2 = time.time()
+ print('SConscript:%s took %0.3f ms' % (f.get_abspath(), (time2 - time1) * 1000.0))
+
+ if old_file is not None:
+ call_stack[-1].globals.update({__file__:old_file})
+ else:
+ SCons.Warnings.warn(SCons.Warnings.MissingSConscriptWarning,
+ "Ignoring missing SConscript '%s'" % f.get_internal_path())
+
+ finally:
+ SCons.Script.sconscript_reading = SCons.Script.sconscript_reading - 1
+ sys.path = old_sys_path
+ frame = call_stack.pop()
+ try:
+ fs.chdir(frame.prev_dir, change_os_dir=sconscript_chdir)
+ except OSError:
+ # There was no local directory, so chdir to the
+ # Repository directory. Like above, we do this
+ # directly.
+ fs.chdir(frame.prev_dir, change_os_dir=0)
+ rdir = frame.prev_dir.rdir()
+ rdir._create() # Make sure there's a directory there.
+ try:
+ os.chdir(rdir.get_abspath())
+ except OSError as e:
+ # We still couldn't chdir there, so raise the error,
+ # but only if actions are being executed.
+ #
+ # If the -n option was used, the directory would *not*
+ # have been created and we should just carry on and
+ # let things muddle through. This isn't guaranteed
+ # to work if the SConscript files are reading things
+ # from disk (for example), but it should work well
+ # enough for most configurations.
+ if SCons.Action.execute_actions:
+ raise e
+
+ results.append(frame.retval)
+
+ # if we only have one script, don't return a tuple
+ if len(results) == 1:
+ return results[0]
+ else:
+ return tuple(results)
+
+def SConscript_exception(file=sys.stderr):
+ """Print an exception stack trace just for the SConscript file(s).
+ This will show users who have Python errors where the problem is,
+ without cluttering the output with all of the internal calls leading
+ up to where we exec the SConscript."""
+ exc_type, exc_value, exc_tb = sys.exc_info()
+ tb = exc_tb
+ while tb and stack_bottom not in tb.tb_frame.f_locals:
+ tb = tb.tb_next
+ if not tb:
+ # We did not find our exec statement, so this was actually a bug
+ # in SCons itself. Show the whole stack.
+ tb = exc_tb
+ stack = traceback.extract_tb(tb)
+ try:
+ type = exc_type.__name__
+ except AttributeError:
+ type = str(exc_type)
+ if type[:11] == "exceptions.":
+ type = type[11:]
+ file.write('%s: %s:\n' % (type, exc_value))
+ for fname, line, func, text in stack:
+ file.write(' File "%s", line %d:\n' % (fname, line))
+ file.write(' %s\n' % text)
+
+def annotate(node):
+ """Annotate a node with the stack frame describing the
+ SConscript file and line number that created it."""
+ tb = sys.exc_info()[2]
+ while tb and stack_bottom not in tb.tb_frame.f_locals:
+ tb = tb.tb_next
+ if not tb:
+ # We did not find any exec of an SConscript file: what?!
+ raise SCons.Errors.InternalError("could not find SConscript stack frame")
+ node.creator = traceback.extract_stack(tb)[0]
+
+# The following line would cause each Node to be annotated using the
+# above function. Unfortunately, this is a *huge* performance hit, so
+# leave this disabled until we find a more efficient mechanism.
+#SCons.Node.Annotate = annotate
+
+class SConsEnvironment(SCons.Environment.Base):
+ """An Environment subclass that contains all of the methods that
+ are particular to the wrapper SCons interface and which aren't
+ (or shouldn't be) part of the build engine itself.
+
+ Note that not all of the methods of this class have corresponding
+ global functions, there are some private methods.
+ """
+
+ #
+ # Private methods of an SConsEnvironment.
+ #
+ def _exceeds_version(self, major, minor, v_major, v_minor):
+ """Return 1 if 'major' and 'minor' are greater than the version
+ in 'v_major' and 'v_minor', and 0 otherwise."""
+ return (major > v_major or (major == v_major and minor > v_minor))
+
+ def _get_major_minor_revision(self, version_string):
+ """Split a version string into major, minor and (optionally)
+ revision parts.
+
+ This is complicated by the fact that a version string can be
+ something like 3.2b1."""
+ version = version_string.split(' ')[0].split('.')
+ v_major = int(version[0])
+ v_minor = int(re.match('\d+', version[1]).group())
+ if len(version) >= 3:
+ v_revision = int(re.match('\d+', version[2]).group())
+ else:
+ v_revision = 0
+ return v_major, v_minor, v_revision
+
+ def _get_SConscript_filenames(self, ls, kw):
+ """
+ Convert the parameters passed to SConscript() calls into a list
+ of files and export variables. If the parameters are invalid,
+ throws SCons.Errors.UserError. Returns a tuple (l, e) where l
+ is a list of SConscript filenames and e is a list of exports.
+ """
+ exports = []
+
+ if len(ls) == 0:
+ try:
+ dirs = kw["dirs"]
+ except KeyError:
+ raise SCons.Errors.UserError("Invalid SConscript usage - no parameters")
+
+ if not SCons.Util.is_List(dirs):
+ dirs = [ dirs ]
+ dirs = list(map(str, dirs))
+
+ name = kw.get('name', 'SConscript')
+
+ files = [os.path.join(n, name) for n in dirs]
+
+ elif len(ls) == 1:
+
+ files = ls[0]
+
+ elif len(ls) == 2:
+
+ files = ls[0]
+ exports = self.Split(ls[1])
+
+ else:
+
+ raise SCons.Errors.UserError("Invalid SConscript() usage - too many arguments")
+
+ if not SCons.Util.is_List(files):
+ files = [ files ]
+
+ if kw.get('exports'):
+ exports.extend(self.Split(kw['exports']))
+
+ variant_dir = kw.get('variant_dir') or kw.get('build_dir')
+ if variant_dir:
+ if len(files) != 1:
+ raise SCons.Errors.UserError("Invalid SConscript() usage - can only specify one SConscript with a variant_dir")
+ duplicate = kw.get('duplicate', 1)
+ src_dir = kw.get('src_dir')
+ if not src_dir:
+ src_dir, fname = os.path.split(str(files[0]))
+ files = [os.path.join(str(variant_dir), fname)]
+ else:
+ if not isinstance(src_dir, SCons.Node.Node):
+ src_dir = self.fs.Dir(src_dir)
+ fn = files[0]
+ if not isinstance(fn, SCons.Node.Node):
+ fn = self.fs.File(fn)
+ if fn.is_under(src_dir):
+ # Get path relative to the source directory.
+ fname = fn.get_path(src_dir)
+ files = [os.path.join(str(variant_dir), fname)]
+ else:
+ files = [fn.get_abspath()]
+ kw['src_dir'] = variant_dir
+ self.fs.VariantDir(variant_dir, src_dir, duplicate)
+
+ return (files, exports)
+
+ #
+ # Public methods of an SConsEnvironment. These get
+ # entry points in the global namespace so they can be called
+ # as global functions.
+ #
+
+ def Configure(self, *args, **kw):
+ if not SCons.Script.sconscript_reading:
+ raise SCons.Errors.UserError("Calling Configure from Builders is not supported.")
+ kw['_depth'] = kw.get('_depth', 0) + 1
+ return SCons.Environment.Base.Configure(self, *args, **kw)
+
+ def Default(self, *targets):
+ SCons.Script._Set_Default_Targets(self, targets)
+
+ def EnsureSConsVersion(self, major, minor, revision=0):
+ """Exit abnormally if the SCons version is not late enough."""
+ # split string to avoid replacement during build process
+ if SCons.__version__ == '__' + 'VERSION__':
+ SCons.Warnings.warn(SCons.Warnings.DevelopmentVersionWarning,
+ "EnsureSConsVersion is ignored for development version")
+ return
+ scons_ver = self._get_major_minor_revision(SCons.__version__)
+ if scons_ver < (major, minor, revision):
+ if revision:
+ scons_ver_string = '%d.%d.%d' % (major, minor, revision)
+ else:
+ scons_ver_string = '%d.%d' % (major, minor)
+ print("SCons %s or greater required, but you have SCons %s" % \
+ (scons_ver_string, SCons.__version__))
+ sys.exit(2)
+
+ def EnsurePythonVersion(self, major, minor):
+ """Exit abnormally if the Python version is not late enough."""
+ if sys.version_info < (major, minor):
+ v = sys.version.split()[0]
+ print("Python %d.%d or greater required, but you have Python %s" %(major,minor,v))
+ sys.exit(2)
+
+ def Exit(self, value=0):
+ sys.exit(value)
+
+ def Export(self, *vars, **kw):
+ for var in vars:
+ global_exports.update(compute_exports(self.Split(var)))
+ global_exports.update(kw)
+
+ def GetLaunchDir(self):
+ global launch_dir
+ return launch_dir
+
+ def GetOption(self, name):
+ name = self.subst(name)
+ return SCons.Script.Main.GetOption(name)
+
+ def Help(self, text, append=False):
+ text = self.subst(text, raw=1)
+ SCons.Script.HelpFunction(text, append=append)
+
+ def Import(self, *vars):
+ try:
+ frame = call_stack[-1]
+ globals = frame.globals
+ exports = frame.exports
+ for var in vars:
+ var = self.Split(var)
+ for v in var:
+ if v == '*':
+ globals.update(global_exports)
+ globals.update(exports)
+ else:
+ if v in exports:
+ globals[v] = exports[v]
+ else:
+ globals[v] = global_exports[v]
+ except KeyError as x:
+ raise SCons.Errors.UserError("Import of non-existent variable '%s'"%x)
+
+ def SConscript(self, *ls, **kw):
+ if 'build_dir' in kw:
+ msg = """The build_dir keyword has been deprecated; use the variant_dir keyword instead."""
+ SCons.Warnings.warn(SCons.Warnings.DeprecatedBuildDirWarning, msg)
+ def subst_element(x, subst=self.subst):
+ if SCons.Util.is_List(x):
+ x = list(map(subst, x))
+ else:
+ x = subst(x)
+ return x
+ ls = list(map(subst_element, ls))
+ subst_kw = {}
+ for key, val in kw.items():
+ if SCons.Util.is_String(val):
+ val = self.subst(val)
+ elif SCons.Util.is_List(val):
+ result = []
+ for v in val:
+ if SCons.Util.is_String(v):
+ v = self.subst(v)
+ result.append(v)
+ val = result
+ subst_kw[key] = val
+
+ files, exports = self._get_SConscript_filenames(ls, subst_kw)
+ subst_kw['exports'] = exports
+ return _SConscript(self.fs, *files, **subst_kw)
+
+ def SConscriptChdir(self, flag):
+ global sconscript_chdir
+ sconscript_chdir = flag
+
+ def SetOption(self, name, value):
+ name = self.subst(name)
+ SCons.Script.Main.SetOption(name, value)
+
+#
+#
+#
+SCons.Environment.Environment = SConsEnvironment
+
+def Configure(*args, **kw):
+ if not SCons.Script.sconscript_reading:
+ raise SCons.Errors.UserError("Calling Configure from Builders is not supported.")
+ kw['_depth'] = 1
+ return SCons.SConf.SConf(*args, **kw)
+
+# It's very important that the DefaultEnvironmentCall() class stay in this
+# file, with the get_calling_namespaces() function, the compute_exports()
+# function, the Frame class and the SConsEnvironment.Export() method.
+# These things make up the calling stack leading up to the actual global
+# Export() or SConscript() call that the user issued. We want to allow
+# users to export local variables that they define, like so:
+#
+# def func():
+# x = 1
+# Export('x')
+#
+# To support this, the get_calling_namespaces() function assumes that
+# the *first* stack frame that's not from this file is the local frame
+# for the Export() or SConscript() call.
+
+_DefaultEnvironmentProxy = None
+
+def get_DefaultEnvironmentProxy():
+ global _DefaultEnvironmentProxy
+ if not _DefaultEnvironmentProxy:
+ default_env = SCons.Defaults.DefaultEnvironment()
+ _DefaultEnvironmentProxy = SCons.Environment.NoSubstitutionProxy(default_env)
+ return _DefaultEnvironmentProxy
+
+class DefaultEnvironmentCall(object):
+ """A class that implements "global function" calls of
+ Environment methods by fetching the specified method from the
+ DefaultEnvironment's class. Note that this uses an intermediate
+ proxy class instead of calling the DefaultEnvironment method
+ directly so that the proxy can override the subst() method and
+ thereby prevent expansion of construction variables (since from
+ the user's point of view this was called as a global function,
+ with no associated construction environment)."""
+ def __init__(self, method_name, subst=0):
+ self.method_name = method_name
+ if subst:
+ self.factory = SCons.Defaults.DefaultEnvironment
+ else:
+ self.factory = get_DefaultEnvironmentProxy
+ def __call__(self, *args, **kw):
+ env = self.factory()
+ method = getattr(env, self.method_name)
+ return method(*args, **kw)
+
+
+def BuildDefaultGlobals():
+ """
+ Create a dictionary containing all the default globals for
+ SConstruct and SConscript files.
+ """
+
+ global GlobalDict
+ if GlobalDict is None:
+ GlobalDict = {}
+
+ import SCons.Script
+ d = SCons.Script.__dict__
+ def not_a_module(m, d=d, mtype=type(SCons.Script)):
+ return not isinstance(d[m], mtype)
+ for m in filter(not_a_module, dir(SCons.Script)):
+ GlobalDict[m] = d[m]
+
+ return GlobalDict.copy()
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Script/SConscript.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Script/SConscript.xml
new file mode 100644
index 0000000..8553fbe
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Script/SConscript.xml
@@ -0,0 +1,602 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+__COPYRIGHT__
+
+This file is processed by the bin/SConsDoc.py module.
+See its __doc__ string for a discussion of the format.
+-->
+
+<!DOCTYPE sconsdoc [
+<!ENTITY % scons SYSTEM '../../../../doc/scons.mod'>
+%scons;
+<!ENTITY % builders-mod SYSTEM '../../../../doc/generated/builders.mod'>
+%builders-mod;
+<!ENTITY % functions-mod SYSTEM '../../../../doc/generated/functions.mod'>
+%functions-mod;
+<!ENTITY % tools-mod SYSTEM '../../../../doc/generated/tools.mod'>
+%tools-mod;
+<!ENTITY % variables-mod SYSTEM '../../../../doc/generated/variables.mod'>
+%variables-mod;
+]>
+
+<sconsdoc xmlns="http://www.scons.org/dbxsd/v1.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://www.scons.org/dbxsd/v1.0 http://www.scons.org/dbxsd/v1.0/scons.xsd">
+
+
+<scons_function name="Default">
+<arguments>
+(targets)
+</arguments>
+<summary>
+<para>
+This specifies a list of default targets,
+which will be built by
+&scons;
+if no explicit targets are given on the command line.
+Multiple calls to
+&f-Default;
+are legal,
+and add to the list of default targets.
+</para>
+
+<para>
+Multiple targets should be specified as
+separate arguments to the
+&f-Default;
+method, or as a list.
+&f-Default;
+will also accept the Node returned by any
+of a construction environment's
+builder methods.
+</para>
+
+<para>
+Examples:
+</para>
+
+<example_commands>
+Default('foo', 'bar', 'baz')
+env.Default(['a', 'b', 'c'])
+hello = env.Program('hello', 'hello.c')
+env.Default(hello)
+</example_commands>
+
+<para>
+An argument to
+&f-Default;
+of
+<literal>None</literal>
+will clear all default targets.
+Later calls to
+&f-Default;
+will add to the (now empty) default-target list
+like normal.
+</para>
+
+<para>
+The current list of targets added using the
+&f-Default;
+function or method is available in the
+<literal>DEFAULT_TARGETS</literal>
+list;
+see below.
+</para>
+</summary>
+</scons_function>
+
+<scons_function name="EnsurePythonVersion">
+<arguments>
+(major, minor)
+</arguments>
+<summary>
+<para>
+Ensure that the Python version is at least
+<varname>major</varname>.<varname>minor</varname>.
+This function will
+print out an error message and exit SCons with a non-zero exit code if the
+actual Python version is not late enough.
+</para>
+
+<para>
+Example:
+</para>
+
+<example_commands>
+EnsurePythonVersion(2,2)
+</example_commands>
+</summary>
+</scons_function>
+
+<scons_function name="EnsureSConsVersion">
+<arguments>
+(major, minor, [revision])
+</arguments>
+<summary>
+<para>
+Ensure that the SCons version is at least
+<varname>major.minor</varname>,
+or
+<varname>major.minor.revision</varname>.
+if
+<varname>revision</varname>
+is specified.
+This function will
+print out an error message and exit SCons with a non-zero exit code if the
+actual SCons version is not late enough.
+</para>
+
+<para>
+Examples:
+</para>
+
+<example_commands>
+EnsureSConsVersion(0,14)
+
+EnsureSConsVersion(0,96,90)
+</example_commands>
+</summary>
+</scons_function>
+
+<scons_function name="Exit">
+<arguments>
+([value])
+</arguments>
+<summary>
+<para>
+This tells
+&scons;
+to exit immediately
+with the specified
+<varname>value</varname>.
+A default exit value of
+<literal>0</literal>
+(zero)
+is used if no value is specified.
+</para>
+</summary>
+</scons_function>
+
+<scons_function name="Export">
+<arguments>
+(vars)
+</arguments>
+<summary>
+<para>
+This tells
+&scons;
+to export a list of variables from the current
+SConscript file to all other SConscript files.
+The exported variables are kept in a global collection,
+so subsequent calls to
+&f-Export;
+will over-write previous exports that have the same name.
+Multiple variable names can be passed to
+&f-Export;
+as separate arguments or as a list.
+Keyword arguments can be used to provide names and their values.
+A dictionary can be used to map variables to a different name when exported.
+Both local variables and global variables can be exported.
+</para>
+
+<para>
+Examples:
+</para>
+
+<example_commands>
+env = Environment()
+# Make env available for all SConscript files to Import().
+Export("env")
+
+package = 'my_name'
+# Make env and package available for all SConscript files:.
+Export("env", "package")
+
+# Make env and package available for all SConscript files:
+Export(["env", "package"])
+
+# Make env available using the name debug:
+Export(debug = env)
+
+# Make env available using the name debug:
+Export({"debug":env})
+</example_commands>
+
+<para>
+Note that the
+&f-SConscript;
+function supports an
+<varname>exports</varname>
+argument that makes it easier to to export a variable or
+set of variables to a single SConscript file.
+See the description of the
+&f-SConscript;
+function, below.
+</para>
+</summary>
+</scons_function>
+
+<scons_function name="GetLaunchDir">
+<arguments>
+()
+</arguments>
+<summary>
+<para>
+Returns the absolute path name of the directory from which
+&scons;
+was initially invoked.
+This can be useful when using the
+<option>-u</option>,
+<option>-U</option>
+or
+<option>-D</option>
+options, which internally
+change to the directory in which the
+&SConstruct;
+file is found.
+</para>
+</summary>
+</scons_function>
+
+<scons_function name="Help">
+<arguments>
+(text, append=False)
+</arguments>
+<summary>
+<para>
+This specifies help text to be printed if the
+<option>-h</option>
+argument is given to
+&scons;.
+If
+&f-Help;
+is called multiple times, the text is appended together in the order that
+&f-Help;
+is called. With append set to False, any
+&f-Help;
+text generated with
+&f-AddOption;
+is clobbered. If append is True, the AddOption help is prepended to the help
+string, thus preserving the
+<option>-h</option>
+message.
+</para>
+</summary>
+</scons_function>
+
+<scons_function name="Import">
+<arguments>
+(vars)
+</arguments>
+<summary>
+<para>
+This tells
+&scons;
+to import a list of variables into the current SConscript file. This
+will import variables that were exported with
+&f-Export;
+or in the
+<varname>exports</varname>
+argument to
+&f-link-SConscript;.
+Variables exported by
+&f-SConscript;
+have precedence.
+Multiple variable names can be passed to
+&f-Import;
+as separate arguments or as a list. The variable "*" can be used
+to import all variables.
+</para>
+
+<para>
+Examples:
+</para>
+
+<example_commands>
+Import("env")
+Import("env", "variable")
+Import(["env", "variable"])
+Import("*")
+</example_commands>
+</summary>
+</scons_function>
+
+<scons_function name="Return">
+<arguments signature="global">
+([vars..., stop=])
+</arguments>
+<summary>
+<para>
+By default,
+this stops processing the current SConscript
+file and returns to the calling SConscript file
+the values of the variables named in the
+<varname>vars</varname>
+string arguments.
+Multiple strings contaning variable names may be passed to
+&f-Return;.
+Any strings that contain white space
+</para>
+
+<para>
+The optional
+<literal>stop=</literal>
+keyword argument may be set to a false value
+to continue processing the rest of the SConscript
+file after the
+&f-Return;
+call.
+This was the default behavior prior to SCons 0.98.
+However, the values returned
+are still the values of the variables in the named
+<varname>vars</varname>
+at the point
+&f-Return;
+is called.
+</para>
+
+<para>
+Examples:
+</para>
+
+<example_commands>
+# Returns without returning a value.
+Return()
+
+# Returns the value of the 'foo' Python variable.
+Return("foo")
+
+# Returns the values of the Python variables 'foo' and 'bar'.
+Return("foo", "bar")
+
+# Returns the values of Python variables 'val1' and 'val2'.
+Return('val1 val2')
+</example_commands>
+</summary>
+</scons_function>
+
+<scons_function name="SConscript">
+<arguments>
+(scripts, [exports, variant_dir, duplicate])
+<!-- (scripts, [exports, variant_dir, src_dir, duplicate]) -->
+</arguments>
+<arguments>
+(dirs=subdirs, [name=script, exports, variant_dir, duplicate])
+<!-- (dirs=subdirs, [name=script, exports, variant_dir, src_dir, duplicate]) -->
+</arguments>
+<summary>
+<para>
+This tells
+&scons;
+to execute
+one or more subsidiary SConscript (configuration) files.
+Any variables returned by a called script using
+&f-link-Return;
+will be returned by the call to
+&f-SConscript;.
+There are two ways to call the
+&f-SConscript;
+function.
+</para>
+
+<para>
+The first way you can call
+&f-SConscript;
+is to explicitly specify one or more
+<varname>scripts</varname>
+as the first argument.
+A single script may be specified as a string;
+multiple scripts must be specified as a list
+(either explicitly or as created by
+a function like
+&f-Split;).
+Examples:
+</para>
+<example_commands>
+SConscript('SConscript') # run SConscript in the current directory
+SConscript('src/SConscript') # run SConscript in the src directory
+SConscript(['src/SConscript', 'doc/SConscript'])
+config = SConscript('MyConfig.py')
+</example_commands>
+
+<para>
+The second way you can call
+&f-SConscript;
+is to specify a list of (sub)directory names
+as a
+<literal>dirs=</literal><varname>subdirs</varname>
+keyword argument.
+In this case,
+&scons;
+will, by default,
+execute a subsidiary configuration file named
+&SConscript;
+in each of the specified directories.
+You may specify a name other than
+&SConscript;
+by supplying an optional
+<literal>name=</literal><varname>script</varname>
+keyword argument.
+The first three examples below have the same effect
+as the first three examples above:
+</para>
+<example_commands>
+SConscript(dirs='.') # run SConscript in the current directory
+SConscript(dirs='src') # run SConscript in the src directory
+SConscript(dirs=['src', 'doc'])
+SConscript(dirs=['sub1', 'sub2'], name='MySConscript')
+</example_commands>
+
+<para>
+The optional
+<varname>exports</varname>
+argument provides a list of variable names or a dictionary of
+named values to export to the
+<varname>script(s)</varname>.
+These variables are locally exported only to the specified
+<varname>script(s)</varname>,
+and do not affect the global pool of variables used by the
+&f-Export;
+function.
+<!-- If multiple dirs are provided, each script gets a fresh export. -->
+The subsidiary
+<varname>script(s)</varname>
+must use the
+&f-link-Import;
+function to import the variables.
+Examples:
+</para>
+<example_commands>
+foo = SConscript('sub/SConscript', exports='env')
+SConscript('dir/SConscript', exports=['env', 'variable'])
+SConscript(dirs='subdir', exports='env variable')
+SConscript(dirs=['one', 'two', 'three'], exports='shared_info')
+</example_commands>
+
+<para>
+If the optional
+<varname>variant_dir</varname>
+argument is present, it causes an effect equivalent to the
+&f-link-VariantDir;
+method described below.
+(If
+<varname>variant_dir</varname>
+is not present, the
+<!-- <varname>src_dir</varname> and -->
+<varname>duplicate</varname>
+<!-- arguments are ignored.) -->
+argument is ignored.)
+The
+<varname>variant_dir</varname>
+<!--
+and
+<varname>src_dir</varname>
+arguments are interpreted relative to the directory of the calling
+-->
+argument is interpreted relative to the directory of the calling
+&SConscript;
+file.
+See the description of the
+&f-VariantDir;
+function below for additional details and restrictions.
+</para>
+
+<para>
+If
+<varname>variant_dir</varname>
+is present,
+<!--
+but
+<varname>src_dir</varname>
+is not,
+-->
+the source directory is the directory in which the
+&SConscript;
+file resides and the
+&SConscript;
+file is evaluated as if it were in the
+<varname>variant_dir</varname>
+directory:
+</para>
+<example_commands>
+SConscript('src/SConscript', variant_dir = 'build')
+</example_commands>
+
+<para>
+is equivalent to
+</para>
+
+<example_commands>
+VariantDir('build', 'src')
+SConscript('build/SConscript')
+</example_commands>
+
+<para>
+This later paradigm is often used when the sources are
+in the same directory as the
+&SConstruct;:
+</para>
+
+<example_commands>
+SConscript('SConscript', variant_dir = 'build')
+</example_commands>
+
+<para>
+is equivalent to
+</para>
+
+<example_commands>
+VariantDir('build', '.')
+SConscript('build/SConscript')
+</example_commands>
+
+<para>
+<!--
+If
+<varname>variant_dir</varname>
+and"
+<varname>src_dir</varname>
+are both present,
+xxxxx everything is in a state of confusion.
+</para>
+<example_commands>
+SConscript(dirs = 'src', variant_dir = 'build', src_dir = '.')
+runs src/SConscript in build/src, but
+SConscript(dirs = 'lib', variant_dir = 'build', src_dir = 'src')
+runs lib/SConscript (in lib!). However,
+SConscript(dirs = 'src', variant_dir = 'build', src_dir = 'src')
+runs src/SConscript in build. Moreover,
+SConscript(dirs = 'src/lib', variant_dir = 'build', src_dir = 'src')
+runs src/lib/SConscript in build/lib. Moreover,
+SConscript(dirs = 'build/src/lib', variant_dir = 'build', src_dir = 'src')
+can't find build/src/lib/SConscript, even though it ought to exist.
+</example_commands>
+<para>
+is equivalent to
+</para>
+<example_commands>
+????????????????
+</example_commands>
+<para>
+and what about this alternative?
+TODO??? SConscript('build/SConscript', src_dir='src')
+-->
+</para>
+
+<para>
+Here are some composite examples:
+</para>
+
+<example_commands>
+# collect the configuration information and use it to build src and doc
+shared_info = SConscript('MyConfig.py')
+SConscript('src/SConscript', exports='shared_info')
+SConscript('doc/SConscript', exports='shared_info')
+</example_commands>
+
+<example_commands>
+# build debugging and production versions. SConscript
+# can use Dir('.').path to determine variant.
+SConscript('SConscript', variant_dir='debug', duplicate=0)
+SConscript('SConscript', variant_dir='prod', duplicate=0)
+</example_commands>
+
+<example_commands>
+# build debugging and production versions. SConscript
+# is passed flags to use.
+opts = { 'CPPDEFINES' : ['DEBUG'], 'CCFLAGS' : '-pgdb' }
+SConscript('SConscript', variant_dir='debug', duplicate=0, exports=opts)
+opts = { 'CPPDEFINES' : ['NODEBUG'], 'CCFLAGS' : '-O' }
+SConscript('SConscript', variant_dir='prod', duplicate=0, exports=opts)
+</example_commands>
+
+<example_commands>
+# build common documentation and compile for different architectures
+SConscript('doc/SConscript', variant_dir='build/doc', duplicate=0)
+SConscript('src/SConscript', variant_dir='build/x86', duplicate=0)
+SConscript('src/SConscript', variant_dir='build/ppc', duplicate=0)
+</example_commands>
+</summary>
+</scons_function>
+
+</sconsdoc>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Script/SConscriptTests.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Script/SConscriptTests.py
new file mode 100644
index 0000000..8b2521d
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Script/SConscriptTests.py
@@ -0,0 +1,34 @@
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import SCons.Script.SConscript
+
+# all of the SConscript.py tests are in test/SConscript.py
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Script/__init__.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Script/__init__.py
new file mode 100644
index 0000000..5bdd63e
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Script/__init__.py
@@ -0,0 +1,429 @@
+"""SCons.Script
+
+This file implements the main() function used by the scons script.
+
+Architecturally, this *is* the scons script, and will likely only be
+called from the external "scons" wrapper. Consequently, anything here
+should not be, or be considered, part of the build engine. If it's
+something that we expect other software to want to use, it should go in
+some other module. If it's specific to the "scons" script invocation,
+it goes here.
+
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import time
+start_time = time.time()
+
+import collections
+import os
+
+try:
+ from StringIO import StringIO
+except ImportError:
+ from io import StringIO
+
+import sys
+
+# Special chicken-and-egg handling of the "--debug=memoizer" flag:
+#
+# SCons.Memoize contains a metaclass implementation that affects how
+# the other classes are instantiated. The Memoizer may add shim methods
+# to classes that have methods that cache computed values in order to
+# count and report the hits and misses.
+#
+# If we wait to enable the Memoization until after we've parsed the
+# command line options normally, it will be too late, because the Memoizer
+# will have already analyzed the classes that it's Memoizing and decided
+# to not add the shims. So we use a special-case, up-front check for
+# the "--debug=memoizer" flag and enable Memoizer before we import any
+# of the other modules that use it.
+
+_args = sys.argv + os.environ.get('SCONSFLAGS', '').split()
+if "--debug=memoizer" in _args:
+ import SCons.Memoize
+ import SCons.Warnings
+ try:
+ SCons.Memoize.EnableMemoization()
+ except SCons.Warnings.Warning:
+ # Some warning was thrown. Arrange for it to be displayed
+ # or not after warnings are configured.
+ from . import Main
+ exc_type, exc_value, tb = sys.exc_info()
+ Main.delayed_warnings.append((exc_type, exc_value))
+del _args
+
+import SCons.Action
+import SCons.Builder
+import SCons.Environment
+import SCons.Node.FS
+import SCons.Options
+import SCons.Platform
+import SCons.Scanner
+import SCons.SConf
+import SCons.Subst
+import SCons.Tool
+import SCons.Util
+import SCons.Variables
+import SCons.Defaults
+
+from . import Main
+
+main = Main.main
+
+# The following are global class definitions and variables that used to
+# live directly in this module back before 0.96.90, when it contained
+# a lot of code. Some SConscript files in widely-distributed packages
+# (Blender is the specific example) actually reached into SCons.Script
+# directly to use some of these. Rather than break those SConscript
+# files, we're going to propagate these names into the SCons.Script
+# namespace here.
+#
+# Some of these are commented out because it's *really* unlikely anyone
+# used them, but we're going to leave the comment here to try to make
+# it obvious what to do if the situation arises.
+BuildTask = Main.BuildTask
+CleanTask = Main.CleanTask
+QuestionTask = Main.QuestionTask
+#PrintHelp = Main.PrintHelp
+#SConscriptSettableOptions = Main.SConscriptSettableOptions
+
+AddOption = Main.AddOption
+PrintHelp = Main.PrintHelp
+GetOption = Main.GetOption
+SetOption = Main.SetOption
+Progress = Main.Progress
+GetBuildFailures = Main.GetBuildFailures
+
+#keep_going_on_error = Main.keep_going_on_error
+#print_dtree = Main.print_dtree
+#print_explanations = Main.print_explanations
+#print_includes = Main.print_includes
+#print_objects = Main.print_objects
+#print_time = Main.print_time
+#print_tree = Main.print_tree
+#memory_stats = Main.memory_stats
+#ignore_errors = Main.ignore_errors
+#sconscript_time = Main.sconscript_time
+#command_time = Main.command_time
+#exit_status = Main.exit_status
+#profiling = Main.profiling
+#repositories = Main.repositories
+
+#
+from . import SConscript
+_SConscript = SConscript
+
+call_stack = _SConscript.call_stack
+
+#
+Action = SCons.Action.Action
+AddMethod = SCons.Util.AddMethod
+AllowSubstExceptions = SCons.Subst.SetAllowableExceptions
+Builder = SCons.Builder.Builder
+Configure = _SConscript.Configure
+Environment = SCons.Environment.Environment
+#OptParser = SCons.SConsOptions.OptParser
+FindPathDirs = SCons.Scanner.FindPathDirs
+Platform = SCons.Platform.Platform
+Return = _SConscript.Return
+Scanner = SCons.Scanner.Base
+Tool = SCons.Tool.Tool
+WhereIs = SCons.Util.WhereIs
+
+#
+BoolVariable = SCons.Variables.BoolVariable
+EnumVariable = SCons.Variables.EnumVariable
+ListVariable = SCons.Variables.ListVariable
+PackageVariable = SCons.Variables.PackageVariable
+PathVariable = SCons.Variables.PathVariable
+
+# Deprecated names that will go away some day.
+BoolOption = SCons.Options.BoolOption
+EnumOption = SCons.Options.EnumOption
+ListOption = SCons.Options.ListOption
+PackageOption = SCons.Options.PackageOption
+PathOption = SCons.Options.PathOption
+
+# Action factories.
+Chmod = SCons.Defaults.Chmod
+Copy = SCons.Defaults.Copy
+Delete = SCons.Defaults.Delete
+Mkdir = SCons.Defaults.Mkdir
+Move = SCons.Defaults.Move
+Touch = SCons.Defaults.Touch
+
+# Pre-made, public scanners.
+CScanner = SCons.Tool.CScanner
+DScanner = SCons.Tool.DScanner
+DirScanner = SCons.Defaults.DirScanner
+ProgramScanner = SCons.Tool.ProgramScanner
+SourceFileScanner = SCons.Tool.SourceFileScanner
+
+# Functions we might still convert to Environment methods.
+CScan = SCons.Defaults.CScan
+DefaultEnvironment = SCons.Defaults.DefaultEnvironment
+
+# Other variables we provide.
+class TargetList(collections.UserList):
+ def _do_nothing(self, *args, **kw):
+ pass
+ def _add_Default(self, list):
+ self.extend(list)
+ def _clear(self):
+ del self[:]
+
+ARGUMENTS = {}
+ARGLIST = []
+BUILD_TARGETS = TargetList()
+COMMAND_LINE_TARGETS = []
+DEFAULT_TARGETS = []
+
+# BUILD_TARGETS can be modified in the SConscript files. If so, we
+# want to treat the modified BUILD_TARGETS list as if they specified
+# targets on the command line. To do that, though, we need to know if
+# BUILD_TARGETS was modified through "official" APIs or by hand. We do
+# this by updating two lists in parallel, the documented BUILD_TARGETS
+# list, above, and this internal _build_plus_default targets list which
+# should only have "official" API changes. Then Script/Main.py can
+# compare these two afterwards to figure out if the user added their
+# own targets to BUILD_TARGETS.
+_build_plus_default = TargetList()
+
+def _Add_Arguments(alist):
+ for arg in alist:
+ a, b = arg.split('=', 1)
+ ARGUMENTS[a] = b
+ ARGLIST.append((a, b))
+
+def _Add_Targets(tlist):
+ if tlist:
+ COMMAND_LINE_TARGETS.extend(tlist)
+ BUILD_TARGETS.extend(tlist)
+ BUILD_TARGETS._add_Default = BUILD_TARGETS._do_nothing
+ BUILD_TARGETS._clear = BUILD_TARGETS._do_nothing
+ _build_plus_default.extend(tlist)
+ _build_plus_default._add_Default = _build_plus_default._do_nothing
+ _build_plus_default._clear = _build_plus_default._do_nothing
+
+def _Set_Default_Targets_Has_Been_Called(d, fs):
+ return DEFAULT_TARGETS
+
+def _Set_Default_Targets_Has_Not_Been_Called(d, fs):
+ if d is None:
+ d = [fs.Dir('.')]
+ return d
+
+_Get_Default_Targets = _Set_Default_Targets_Has_Not_Been_Called
+
+def _Set_Default_Targets(env, tlist):
+ global DEFAULT_TARGETS
+ global _Get_Default_Targets
+ _Get_Default_Targets = _Set_Default_Targets_Has_Been_Called
+ for t in tlist:
+ if t is None:
+ # Delete the elements from the list in-place, don't
+ # reassign an empty list to DEFAULT_TARGETS, so that the
+ # variables will still point to the same object we point to.
+ del DEFAULT_TARGETS[:]
+ BUILD_TARGETS._clear()
+ _build_plus_default._clear()
+ elif isinstance(t, SCons.Node.Node):
+ DEFAULT_TARGETS.append(t)
+ BUILD_TARGETS._add_Default([t])
+ _build_plus_default._add_Default([t])
+ else:
+ nodes = env.arg2nodes(t, env.fs.Entry)
+ DEFAULT_TARGETS.extend(nodes)
+ BUILD_TARGETS._add_Default(nodes)
+ _build_plus_default._add_Default(nodes)
+
+#
+help_text = None
+
+def HelpFunction(text, append=False):
+ global help_text
+ if help_text is None:
+ if append:
+ s = StringIO()
+ PrintHelp(s)
+ help_text = s.getvalue()
+ s.close()
+ else:
+ help_text = ""
+
+ help_text= help_text + text
+
+
+#
+# Will be non-zero if we are reading an SConscript file.
+sconscript_reading = 0
+
+#
+def Variables(files=[], args=ARGUMENTS):
+ return SCons.Variables.Variables(files, args)
+
+def Options(files=[], args=ARGUMENTS):
+ return SCons.Options.Options(files, args)
+
+# The list of global functions to add to the SConscript name space
+# that end up calling corresponding methods or Builders in the
+# DefaultEnvironment().
+GlobalDefaultEnvironmentFunctions = [
+ # Methods from the SConsEnvironment class, above.
+ 'Default',
+ 'EnsurePythonVersion',
+ 'EnsureSConsVersion',
+ 'Exit',
+ 'Export',
+ 'GetLaunchDir',
+ 'Help',
+ 'Import',
+ #'SConscript', is handled separately, below.
+ 'SConscriptChdir',
+
+ # Methods from the Environment.Base class.
+ 'AddPostAction',
+ 'AddPreAction',
+ 'Alias',
+ 'AlwaysBuild',
+ 'BuildDir',
+ 'CacheDir',
+ 'Clean',
+ #The Command() method is handled separately, below.
+ 'Decider',
+ 'Depends',
+ 'Dir',
+ 'NoClean',
+ 'NoCache',
+ 'Entry',
+ 'Execute',
+ 'File',
+ 'FindFile',
+ 'FindInstalledFiles',
+ 'FindSourceFiles',
+ 'Flatten',
+ 'GetBuildPath',
+ 'Glob',
+ 'Ignore',
+ 'Install',
+ 'InstallAs',
+ 'InstallVersionedLib',
+ 'Literal',
+ 'Local',
+ 'ParseDepends',
+ 'Precious',
+ 'PyPackageDir',
+ 'Repository',
+ 'Requires',
+ 'SConsignFile',
+ 'SideEffect',
+ 'SourceCode',
+ 'SourceSignatures',
+ 'Split',
+ 'Tag',
+ 'TargetSignatures',
+ 'Value',
+ 'VariantDir',
+]
+
+GlobalDefaultBuilders = [
+ # Supported builders.
+ 'CFile',
+ 'CXXFile',
+ 'DVI',
+ 'Jar',
+ 'Java',
+ 'JavaH',
+ 'Library',
+ 'LoadableModule',
+ 'M4',
+ 'MSVSProject',
+ 'Object',
+ 'PCH',
+ 'PDF',
+ 'PostScript',
+ 'Program',
+ 'RES',
+ 'RMIC',
+ 'SharedLibrary',
+ 'SharedObject',
+ 'StaticLibrary',
+ 'StaticObject',
+ 'Tar',
+ 'TypeLibrary',
+ 'Zip',
+ 'Package',
+]
+
+for name in GlobalDefaultEnvironmentFunctions + GlobalDefaultBuilders:
+ exec ("%s = _SConscript.DefaultEnvironmentCall(%s)" % (name, repr(name)))
+del name
+
+# There are a handful of variables that used to live in the
+# Script/SConscript.py module that some SConscript files out there were
+# accessing directly as SCons.Script.SConscript.*. The problem is that
+# "SConscript" in this namespace is no longer a module, it's a global
+# function call--or more precisely, an object that implements a global
+# function call through the default Environment. Nevertheless, we can
+# maintain backwards compatibility for SConscripts that were reaching in
+# this way by hanging some attributes off the "SConscript" object here.
+SConscript = _SConscript.DefaultEnvironmentCall('SConscript')
+
+# Make SConscript look enough like the module it used to be so
+# that pychecker doesn't barf.
+SConscript.__name__ = 'SConscript'
+
+SConscript.Arguments = ARGUMENTS
+SConscript.ArgList = ARGLIST
+SConscript.BuildTargets = BUILD_TARGETS
+SConscript.CommandLineTargets = COMMAND_LINE_TARGETS
+SConscript.DefaultTargets = DEFAULT_TARGETS
+
+# The global Command() function must be handled differently than the
+# global functions for other construction environment methods because
+# we want people to be able to use Actions that must expand $TARGET
+# and $SOURCE later, when (and if) the Action is invoked to build
+# the target(s). We do this with the subst=1 argument, which creates
+# a DefaultEnvironmentCall instance that wraps up a normal default
+# construction environment that performs variable substitution, not a
+# proxy that doesn't.
+#
+# There's a flaw here, though, because any other $-variables on a command
+# line will *also* be expanded, each to a null string, but that should
+# only be a problem in the unusual case where someone was passing a '$'
+# on a command line and *expected* the $ to get through to the shell
+# because they were calling Command() and not env.Command()... This is
+# unlikely enough that we're going to leave this as is and cross that
+# bridge if someone actually comes to it.
+Command = _SConscript.DefaultEnvironmentCall('Command', subst=1)
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Subst.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Subst.py
new file mode 100644
index 0000000..68d247f
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Subst.py
@@ -0,0 +1,929 @@
+"""SCons.Subst
+
+SCons string substitution.
+
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import collections
+import re
+
+import SCons.Errors
+
+from SCons.Util import is_String, is_Sequence
+
+# Indexed by the SUBST_* constants below.
+_strconv = [SCons.Util.to_String_for_subst,
+ SCons.Util.to_String_for_subst,
+ SCons.Util.to_String_for_signature]
+
+
+
+AllowableExceptions = (IndexError, NameError)
+
+def SetAllowableExceptions(*excepts):
+ global AllowableExceptions
+ AllowableExceptions = [_f for _f in excepts if _f]
+
+def raise_exception(exception, target, s):
+ name = exception.__class__.__name__
+ msg = "%s `%s' trying to evaluate `%s'" % (name, exception, s)
+ if target:
+ raise SCons.Errors.BuildError(target[0], msg)
+ else:
+ raise SCons.Errors.UserError(msg)
+
+
+
+class Literal(object):
+ """A wrapper for a string. If you use this object wrapped
+ around a string, then it will be interpreted as literal.
+ When passed to the command interpreter, all special
+ characters will be escaped."""
+ def __init__(self, lstr):
+ self.lstr = lstr
+
+ def __str__(self):
+ return self.lstr
+
+ def escape(self, escape_func):
+ return escape_func(self.lstr)
+
+ def for_signature(self):
+ return self.lstr
+
+ def is_literal(self):
+ return 1
+
+ def __eq__(self, other):
+ if not isinstance(other, Literal):
+ return False
+ return self.lstr == other.lstr
+
+ def __neq__(self, other):
+ return not self.__eq__(other)
+
+class SpecialAttrWrapper(object):
+ """This is a wrapper for what we call a 'Node special attribute.'
+ This is any of the attributes of a Node that we can reference from
+ Environment variable substitution, such as $TARGET.abspath or
+ $SOURCES[1].filebase. We implement the same methods as Literal
+ so we can handle special characters, plus a for_signature method,
+ such that we can return some canonical string during signature
+ calculation to avoid unnecessary rebuilds."""
+
+ def __init__(self, lstr, for_signature=None):
+ """The for_signature parameter, if supplied, will be the
+ canonical string we return from for_signature(). Else
+ we will simply return lstr."""
+ self.lstr = lstr
+ if for_signature:
+ self.forsig = for_signature
+ else:
+ self.forsig = lstr
+
+ def __str__(self):
+ return self.lstr
+
+ def escape(self, escape_func):
+ return escape_func(self.lstr)
+
+ def for_signature(self):
+ return self.forsig
+
+ def is_literal(self):
+ return 1
+
+def quote_spaces(arg):
+ """Generic function for putting double quotes around any string that
+ has white space in it."""
+ if ' ' in arg or '\t' in arg:
+ return '"%s"' % arg
+ else:
+ return str(arg)
+
+class CmdStringHolder(collections.UserString):
+ """This is a special class used to hold strings generated by
+ scons_subst() and scons_subst_list(). It defines a special method
+ escape(). When passed a function with an escape algorithm for a
+ particular platform, it will return the contained string with the
+ proper escape sequences inserted.
+ """
+ def __init__(self, cmd, literal=None):
+ collections.UserString.__init__(self, cmd)
+ self.literal = literal
+
+ def is_literal(self):
+ return self.literal
+
+ def escape(self, escape_func, quote_func=quote_spaces):
+ """Escape the string with the supplied function. The
+ function is expected to take an arbitrary string, then
+ return it with all special characters escaped and ready
+ for passing to the command interpreter.
+
+ After calling this function, the next call to str() will
+ return the escaped string.
+ """
+
+ if self.is_literal():
+ return escape_func(self.data)
+ elif ' ' in self.data or '\t' in self.data:
+ return quote_func(self.data)
+ else:
+ return self.data
+
+def escape_list(mylist, escape_func):
+ """Escape a list of arguments by running the specified escape_func
+ on every object in the list that has an escape() method."""
+ def escape(obj, escape_func=escape_func):
+ try:
+ e = obj.escape
+ except AttributeError:
+ return obj
+ else:
+ return e(escape_func)
+ return list(map(escape, mylist))
+
+class NLWrapper(object):
+ """A wrapper class that delays turning a list of sources or targets
+ into a NodeList until it's needed. The specified function supplied
+ when the object is initialized is responsible for turning raw nodes
+ into proxies that implement the special attributes like .abspath,
+ .source, etc. This way, we avoid creating those proxies just
+ "in case" someone is going to use $TARGET or the like, and only
+ go through the trouble if we really have to.
+
+ In practice, this might be a wash performance-wise, but it's a little
+ cleaner conceptually...
+ """
+
+ def __init__(self, list, func):
+ self.list = list
+ self.func = func
+ def _return_nodelist(self):
+ return self.nodelist
+ def _gen_nodelist(self):
+ mylist = self.list
+ if mylist is None:
+ mylist = []
+ elif not is_Sequence(mylist):
+ mylist = [mylist]
+ # The map(self.func) call is what actually turns
+ # a list into appropriate proxies.
+ self.nodelist = SCons.Util.NodeList(list(map(self.func, mylist)))
+ self._create_nodelist = self._return_nodelist
+ return self.nodelist
+ _create_nodelist = _gen_nodelist
+
+
+class Targets_or_Sources(collections.UserList):
+ """A class that implements $TARGETS or $SOURCES expansions by in turn
+ wrapping a NLWrapper. This class handles the different methods used
+ to access the list, calling the NLWrapper to create proxies on demand.
+
+ Note that we subclass collections.UserList purely so that the
+ is_Sequence() function will identify an object of this class as
+ a list during variable expansion. We're not really using any
+ collections.UserList methods in practice.
+ """
+ def __init__(self, nl):
+ self.nl = nl
+ def __getattr__(self, attr):
+ nl = self.nl._create_nodelist()
+ return getattr(nl, attr)
+ def __getitem__(self, i):
+ nl = self.nl._create_nodelist()
+ return nl[i]
+ def __getslice__(self, i, j):
+ nl = self.nl._create_nodelist()
+ i = max(i, 0); j = max(j, 0)
+ return nl[i:j]
+ def __str__(self):
+ nl = self.nl._create_nodelist()
+ return str(nl)
+ def __repr__(self):
+ nl = self.nl._create_nodelist()
+ return repr(nl)
+
+class Target_or_Source(object):
+ """A class that implements $TARGET or $SOURCE expansions by in turn
+ wrapping a NLWrapper. This class handles the different methods used
+ to access an individual proxy Node, calling the NLWrapper to create
+ a proxy on demand.
+ """
+ def __init__(self, nl):
+ self.nl = nl
+ def __getattr__(self, attr):
+ nl = self.nl._create_nodelist()
+ try:
+ nl0 = nl[0]
+ except IndexError:
+ # If there is nothing in the list, then we have no attributes to
+ # pass through, so raise AttributeError for everything.
+ raise AttributeError("NodeList has no attribute: %s" % attr)
+ return getattr(nl0, attr)
+ def __str__(self):
+ nl = self.nl._create_nodelist()
+ if nl:
+ return str(nl[0])
+ return ''
+ def __repr__(self):
+ nl = self.nl._create_nodelist()
+ if nl:
+ return repr(nl[0])
+ return ''
+
+class NullNodeList(SCons.Util.NullSeq):
+ def __call__(self, *args, **kwargs): return ''
+ def __str__(self): return ''
+
+NullNodesList = NullNodeList()
+
+def subst_dict(target, source):
+ """Create a dictionary for substitution of special
+ construction variables.
+
+ This translates the following special arguments:
+
+ target - the target (object or array of objects),
+ used to generate the TARGET and TARGETS
+ construction variables
+
+ source - the source (object or array of objects),
+ used to generate the SOURCES and SOURCE
+ construction variables
+ """
+ dict = {}
+
+ if target:
+ def get_tgt_subst_proxy(thing):
+ try:
+ subst_proxy = thing.get_subst_proxy()
+ except AttributeError:
+ subst_proxy = thing # probably a string, just return it
+ return subst_proxy
+ tnl = NLWrapper(target, get_tgt_subst_proxy)
+ dict['TARGETS'] = Targets_or_Sources(tnl)
+ dict['TARGET'] = Target_or_Source(tnl)
+
+ # This is a total cheat, but hopefully this dictionary goes
+ # away soon anyway. We just let these expand to $TARGETS
+ # because that's "good enough" for the use of ToolSurrogates
+ # (see test/ToolSurrogate.py) to generate documentation.
+ dict['CHANGED_TARGETS'] = '$TARGETS'
+ dict['UNCHANGED_TARGETS'] = '$TARGETS'
+ else:
+ dict['TARGETS'] = NullNodesList
+ dict['TARGET'] = NullNodesList
+
+ if source:
+ def get_src_subst_proxy(node):
+ try:
+ rfile = node.rfile
+ except AttributeError:
+ pass
+ else:
+ node = rfile()
+ try:
+ return node.get_subst_proxy()
+ except AttributeError:
+ return node # probably a String, just return it
+ snl = NLWrapper(source, get_src_subst_proxy)
+ dict['SOURCES'] = Targets_or_Sources(snl)
+ dict['SOURCE'] = Target_or_Source(snl)
+
+ # This is a total cheat, but hopefully this dictionary goes
+ # away soon anyway. We just let these expand to $TARGETS
+ # because that's "good enough" for the use of ToolSurrogates
+ # (see test/ToolSurrogate.py) to generate documentation.
+ dict['CHANGED_SOURCES'] = '$SOURCES'
+ dict['UNCHANGED_SOURCES'] = '$SOURCES'
+ else:
+ dict['SOURCES'] = NullNodesList
+ dict['SOURCE'] = NullNodesList
+
+ return dict
+
+# Constants for the "mode" parameter to scons_subst_list() and
+# scons_subst(). SUBST_RAW gives the raw command line. SUBST_CMD
+# gives a command line suitable for passing to a shell. SUBST_SIG
+# gives a command line appropriate for calculating the signature
+# of a command line...if this changes, we should rebuild.
+SUBST_CMD = 0
+SUBST_RAW = 1
+SUBST_SIG = 2
+
+_rm = re.compile(r'\$[()]')
+
+# Note the pattern below only matches $( or $) when there is no
+# preceeding $. (Thus the (?<!\$))
+_rm_split = re.compile(r'(?<!\$)(\$[()])')
+
+# Indexed by the SUBST_* constants above.
+_regex_remove = [ _rm, None, _rm_split ]
+
+def _rm_list(list):
+ return [l for l in list if not l in ('$(', '$)')]
+
+def _remove_list(list):
+ result = []
+ depth = 0
+ for l in list:
+ if l == '$(':
+ depth += 1
+ elif l == '$)':
+ depth -= 1
+ if depth < 0:
+ break
+ elif depth == 0:
+ result.append(l)
+ if depth != 0:
+ return None
+ return result
+
+# Indexed by the SUBST_* constants above.
+_list_remove = [ _rm_list, None, _remove_list ]
+
+# Regular expressions for splitting strings and handling substitutions,
+# for use by the scons_subst() and scons_subst_list() functions:
+#
+# The first expression compiled matches all of the $-introduced tokens
+# that we need to process in some way, and is used for substitutions.
+# The expressions it matches are:
+#
+# "$$"
+# "$("
+# "$)"
+# "$variable" [must begin with alphabetic or underscore]
+# "${any stuff}"
+#
+# The second expression compiled is used for splitting strings into tokens
+# to be processed, and it matches all of the tokens listed above, plus
+# the following that affect how arguments do or don't get joined together:
+#
+# " " [white space]
+# "non-white-space" [without any dollar signs]
+# "$" [single dollar sign]
+#
+_dollar_exps_str = r'\$[\$\(\)]|\$[_a-zA-Z][\.\w]*|\${[^}]*}'
+_dollar_exps = re.compile(r'(%s)' % _dollar_exps_str)
+_separate_args = re.compile(r'(%s|\s+|[^\s\$]+|\$)' % _dollar_exps_str)
+
+# This regular expression is used to replace strings of multiple white
+# space characters in the string result from the scons_subst() function.
+_space_sep = re.compile(r'[\t ]+(?![^{]*})')
+
+def scons_subst(strSubst, env, mode=SUBST_RAW, target=None, source=None, gvars={}, lvars={}, conv=None):
+ """Expand a string or list containing construction variable
+ substitutions.
+
+ This is the work-horse function for substitutions in file names
+ and the like. The companion scons_subst_list() function (below)
+ handles separating command lines into lists of arguments, so see
+ that function if that's what you're looking for.
+ """
+ if isinstance(strSubst, str) and strSubst.find('$') < 0:
+ return strSubst
+
+ class StringSubber(object):
+ """A class to construct the results of a scons_subst() call.
+
+ This binds a specific construction environment, mode, target and
+ source with two methods (substitute() and expand()) that handle
+ the expansion.
+ """
+ def __init__(self, env, mode, conv, gvars):
+ self.env = env
+ self.mode = mode
+ self.conv = conv
+ self.gvars = gvars
+
+ def expand(self, s, lvars):
+ """Expand a single "token" as necessary, returning an
+ appropriate string containing the expansion.
+
+ This handles expanding different types of things (strings,
+ lists, callables) appropriately. It calls the wrapper
+ substitute() method to re-expand things as necessary, so that
+ the results of expansions of side-by-side strings still get
+ re-evaluated separately, not smushed together.
+ """
+ if is_String(s):
+ try:
+ s0, s1 = s[:2]
+ except (IndexError, ValueError):
+ return s
+ if s0 != '$':
+ return s
+ if s1 == '$':
+ # In this case keep the double $'s which we'll later
+ # swap for a single dollar sign as we need to retain
+ # this information to properly avoid matching "$("" when
+ # the actual text was "$$("" (or "$)"" when "$$)"" )
+ return '$$'
+ elif s1 in '()':
+ return s
+ else:
+ key = s[1:]
+ if key[0] == '{' or '.' in key:
+ if key[0] == '{':
+ key = key[1:-1]
+ try:
+ s = eval(key, self.gvars, lvars)
+ except KeyboardInterrupt:
+ raise
+ except Exception as e:
+ if e.__class__ in AllowableExceptions:
+ return ''
+ raise_exception(e, lvars['TARGETS'], s)
+ else:
+ if key in lvars:
+ s = lvars[key]
+ elif key in self.gvars:
+ s = self.gvars[key]
+ elif not NameError in AllowableExceptions:
+ raise_exception(NameError(key), lvars['TARGETS'], s)
+ else:
+ return ''
+
+ # Before re-expanding the result, handle
+ # recursive expansion by copying the local
+ # variable dictionary and overwriting a null
+ # string for the value of the variable name
+ # we just expanded.
+ #
+ # This could potentially be optimized by only
+ # copying lvars when s contains more expansions,
+ # but lvars is usually supposed to be pretty
+ # small, and deeply nested variable expansions
+ # are probably more the exception than the norm,
+ # so it should be tolerable for now.
+ lv = lvars.copy()
+ var = key.split('.')[0]
+ lv[var] = ''
+ return self.substitute(s, lv)
+ elif is_Sequence(s):
+ def func(l, conv=self.conv, substitute=self.substitute, lvars=lvars):
+ return conv(substitute(l, lvars))
+ return list(map(func, s))
+ elif callable(s):
+ try:
+ s = s(target=lvars['TARGETS'],
+ source=lvars['SOURCES'],
+ env=self.env,
+ for_signature=(self.mode != SUBST_CMD))
+ except TypeError:
+ # This probably indicates that it's a callable
+ # object that doesn't match our calling arguments
+ # (like an Action).
+ if self.mode == SUBST_RAW:
+ return s
+ s = self.conv(s)
+ return self.substitute(s, lvars)
+ elif s is None:
+ return ''
+ else:
+ return s
+
+ def substitute(self, args, lvars):
+ """Substitute expansions in an argument or list of arguments.
+
+ This serves as a wrapper for splitting up a string into
+ separate tokens.
+ """
+ if is_String(args) and not isinstance(args, CmdStringHolder):
+ args = str(args) # In case it's a UserString.
+ try:
+ def sub_match(match):
+ return self.conv(self.expand(match.group(1), lvars))
+ result = _dollar_exps.sub(sub_match, args)
+ except TypeError:
+ # If the internal conversion routine doesn't return
+ # strings (it could be overridden to return Nodes, for
+ # example), then the 1.5.2 re module will throw this
+ # exception. Back off to a slower, general-purpose
+ # algorithm that works for all data types.
+ args = _separate_args.findall(args)
+ result = []
+ for a in args:
+ result.append(self.conv(self.expand(a, lvars)))
+ if len(result) == 1:
+ result = result[0]
+ else:
+ result = ''.join(map(str, result))
+ return result
+ else:
+ return self.expand(args, lvars)
+
+ if conv is None:
+ conv = _strconv[mode]
+
+ # Doing this every time is a bit of a waste, since the Executor
+ # has typically already populated the OverrideEnvironment with
+ # $TARGET/$SOURCE variables. We're keeping this (for now), though,
+ # because it supports existing behavior that allows us to call
+ # an Action directly with an arbitrary target+source pair, which
+ # we use in Tool/tex.py to handle calling $BIBTEX when necessary.
+ # If we dropped that behavior (or found another way to cover it),
+ # we could get rid of this call completely and just rely on the
+ # Executor setting the variables.
+ if 'TARGET' not in lvars:
+ d = subst_dict(target, source)
+ if d:
+ lvars = lvars.copy()
+ lvars.update(d)
+
+ # We're (most likely) going to eval() things. If Python doesn't
+ # find a __builtins__ value in the global dictionary used for eval(),
+ # it copies the current global values for you. Avoid this by
+ # setting it explicitly and then deleting, so we don't pollute the
+ # construction environment Dictionary(ies) that are typically used
+ # for expansion.
+ gvars['__builtins__'] = __builtins__
+
+ ss = StringSubber(env, mode, conv, gvars)
+ result = ss.substitute(strSubst, lvars)
+
+ try:
+ del gvars['__builtins__']
+ except KeyError:
+ pass
+
+ res = result
+ if is_String(result):
+ # Remove $(-$) pairs and any stuff in between,
+ # if that's appropriate.
+ remove = _regex_remove[mode]
+ if remove:
+ if mode == SUBST_SIG:
+ result = _list_remove[mode](remove.split(result))
+ if result is None:
+ raise SCons.Errors.UserError("Unbalanced $(/$) in: " + res)
+ result = ' '.join(result)
+ else:
+ result = remove.sub('', result)
+ if mode != SUBST_RAW:
+ # Compress strings of white space characters into
+ # a single space.
+ result = _space_sep.sub(' ', result).strip()
+
+ # Now replace escaped $'s currently "$$"
+ # This is needed because we now retain $$ instead of
+ # replacing them during substition to avoid
+ # improperly trying to escape "$$(" as being "$("
+ result = result.replace('$$','$')
+ elif is_Sequence(result):
+ remove = _list_remove[mode]
+ if remove:
+ result = remove(result)
+ if result is None:
+ raise SCons.Errors.UserError("Unbalanced $(/$) in: " + str(res))
+
+ return result
+
+def scons_subst_list(strSubst, env, mode=SUBST_RAW, target=None, source=None, gvars={}, lvars={}, conv=None):
+ """Substitute construction variables in a string (or list or other
+ object) and separate the arguments into a command list.
+
+ The companion scons_subst() function (above) handles basic
+ substitutions within strings, so see that function instead
+ if that's what you're looking for.
+ """
+ class ListSubber(collections.UserList):
+ """A class to construct the results of a scons_subst_list() call.
+
+ Like StringSubber, this class binds a specific construction
+ environment, mode, target and source with two methods
+ (substitute() and expand()) that handle the expansion.
+
+ In addition, however, this class is used to track the state of
+ the result(s) we're gathering so we can do the appropriate thing
+ whenever we have to append another word to the result--start a new
+ line, start a new word, append to the current word, etc. We do
+ this by setting the "append" attribute to the right method so
+ that our wrapper methods only need ever call ListSubber.append(),
+ and the rest of the object takes care of doing the right thing
+ internally.
+ """
+ def __init__(self, env, mode, conv, gvars):
+ collections.UserList.__init__(self, [])
+ self.env = env
+ self.mode = mode
+ self.conv = conv
+ self.gvars = gvars
+
+ if self.mode == SUBST_RAW:
+ self.add_strip = lambda x: self.append(x)
+ else:
+ self.add_strip = lambda x: None
+ self.in_strip = None
+ self.next_line()
+
+ def expand(self, s, lvars, within_list):
+ """Expand a single "token" as necessary, appending the
+ expansion to the current result.
+
+ This handles expanding different types of things (strings,
+ lists, callables) appropriately. It calls the wrapper
+ substitute() method to re-expand things as necessary, so that
+ the results of expansions of side-by-side strings still get
+ re-evaluated separately, not smushed together.
+ """
+
+ if is_String(s):
+ try:
+ s0, s1 = s[:2]
+ except (IndexError, ValueError):
+ self.append(s)
+ return
+ if s0 != '$':
+ self.append(s)
+ return
+ if s1 == '$':
+ self.append('$')
+ elif s1 == '(':
+ self.open_strip('$(')
+ elif s1 == ')':
+ self.close_strip('$)')
+ else:
+ key = s[1:]
+ if key[0] == '{' or key.find('.') >= 0:
+ if key[0] == '{':
+ key = key[1:-1]
+ try:
+ s = eval(key, self.gvars, lvars)
+ except KeyboardInterrupt:
+ raise
+ except Exception as e:
+ if e.__class__ in AllowableExceptions:
+ return
+ raise_exception(e, lvars['TARGETS'], s)
+ else:
+ if key in lvars:
+ s = lvars[key]
+ elif key in self.gvars:
+ s = self.gvars[key]
+ elif not NameError in AllowableExceptions:
+ raise_exception(NameError(), lvars['TARGETS'], s)
+ else:
+ return
+
+ # Before re-expanding the result, handle
+ # recursive expansion by copying the local
+ # variable dictionary and overwriting a null
+ # string for the value of the variable name
+ # we just expanded.
+ lv = lvars.copy()
+ var = key.split('.')[0]
+ lv[var] = ''
+ self.substitute(s, lv, 0)
+ self.this_word()
+ elif is_Sequence(s):
+ for a in s:
+ self.substitute(a, lvars, 1)
+ self.next_word()
+ elif callable(s):
+ try:
+ s = s(target=lvars['TARGETS'],
+ source=lvars['SOURCES'],
+ env=self.env,
+ for_signature=(self.mode != SUBST_CMD))
+ except TypeError:
+ # This probably indicates that it's a callable
+ # object that doesn't match our calling arguments
+ # (like an Action).
+ if self.mode == SUBST_RAW:
+ self.append(s)
+ return
+ s = self.conv(s)
+ self.substitute(s, lvars, within_list)
+ elif s is None:
+ self.this_word()
+ else:
+ self.append(s)
+
+ def substitute(self, args, lvars, within_list):
+ """Substitute expansions in an argument or list of arguments.
+
+ This serves as a wrapper for splitting up a string into
+ separate tokens.
+ """
+
+ if is_String(args) and not isinstance(args, CmdStringHolder):
+ args = str(args) # In case it's a UserString.
+ args = _separate_args.findall(args)
+ for a in args:
+ if a[0] in ' \t\n\r\f\v':
+ if '\n' in a:
+ self.next_line()
+ elif within_list:
+ self.append(a)
+ else:
+ self.next_word()
+ else:
+ self.expand(a, lvars, within_list)
+ else:
+ self.expand(args, lvars, within_list)
+
+ def next_line(self):
+ """Arrange for the next word to start a new line. This
+ is like starting a new word, except that we have to append
+ another line to the result."""
+ collections.UserList.append(self, [])
+ self.next_word()
+
+ def this_word(self):
+ """Arrange for the next word to append to the end of the
+ current last word in the result."""
+ self.append = self.add_to_current_word
+
+ def next_word(self):
+ """Arrange for the next word to start a new word."""
+ self.append = self.add_new_word
+
+ def add_to_current_word(self, x):
+ """Append the string x to the end of the current last word
+ in the result. If that is not possible, then just add
+ it as a new word. Make sure the entire concatenated string
+ inherits the object attributes of x (in particular, the
+ escape function) by wrapping it as CmdStringHolder."""
+
+ if not self.in_strip or self.mode != SUBST_SIG:
+ try:
+ current_word = self[-1][-1]
+ except IndexError:
+ self.add_new_word(x)
+ else:
+ # All right, this is a hack and it should probably
+ # be refactored out of existence in the future.
+ # The issue is that we want to smoosh words together
+ # and make one file name that gets escaped if
+ # we're expanding something like foo$EXTENSION,
+ # but we don't want to smoosh them together if
+ # it's something like >$TARGET, because then we'll
+ # treat the '>' like it's part of the file name.
+ # So for now, just hard-code looking for the special
+ # command-line redirection characters...
+ try:
+ last_char = str(current_word)[-1]
+ except IndexError:
+ last_char = '\0'
+ if last_char in '<>|':
+ self.add_new_word(x)
+ else:
+ y = current_word + x
+
+ # We used to treat a word appended to a literal
+ # as a literal itself, but this caused problems
+ # with interpreting quotes around space-separated
+ # targets on command lines. Removing this makes
+ # none of the "substantive" end-to-end tests fail,
+ # so we'll take this out but leave it commented
+ # for now in case there's a problem not covered
+ # by the test cases and we need to resurrect this.
+ #literal1 = self.literal(self[-1][-1])
+ #literal2 = self.literal(x)
+ y = self.conv(y)
+ if is_String(y):
+ #y = CmdStringHolder(y, literal1 or literal2)
+ y = CmdStringHolder(y, None)
+ self[-1][-1] = y
+
+ def add_new_word(self, x):
+ if not self.in_strip or self.mode != SUBST_SIG:
+ literal = self.literal(x)
+ x = self.conv(x)
+ if is_String(x):
+ x = CmdStringHolder(x, literal)
+ self[-1].append(x)
+ self.append = self.add_to_current_word
+
+ def literal(self, x):
+ try:
+ l = x.is_literal
+ except AttributeError:
+ return None
+ else:
+ return l()
+
+ def open_strip(self, x):
+ """Handle the "open strip" $( token."""
+ self.add_strip(x)
+ self.in_strip = 1
+
+ def close_strip(self, x):
+ """Handle the "close strip" $) token."""
+ self.add_strip(x)
+ self.in_strip = None
+
+ if conv is None:
+ conv = _strconv[mode]
+
+ # Doing this every time is a bit of a waste, since the Executor
+ # has typically already populated the OverrideEnvironment with
+ # $TARGET/$SOURCE variables. We're keeping this (for now), though,
+ # because it supports existing behavior that allows us to call
+ # an Action directly with an arbitrary target+source pair, which
+ # we use in Tool/tex.py to handle calling $BIBTEX when necessary.
+ # If we dropped that behavior (or found another way to cover it),
+ # we could get rid of this call completely and just rely on the
+ # Executor setting the variables.
+ if 'TARGET' not in lvars:
+ d = subst_dict(target, source)
+ if d:
+ lvars = lvars.copy()
+ lvars.update(d)
+
+ # We're (most likely) going to eval() things. If Python doesn't
+ # find a __builtins__ value in the global dictionary used for eval(),
+ # it copies the current global values for you. Avoid this by
+ # setting it explicitly and then deleting, so we don't pollute the
+ # construction environment Dictionary(ies) that are typically used
+ # for expansion.
+ gvars['__builtins__'] = __builtins__
+
+ ls = ListSubber(env, mode, conv, gvars)
+ ls.substitute(strSubst, lvars, 0)
+
+ try:
+ del gvars['__builtins__']
+ except KeyError:
+ pass
+
+ return ls.data
+
+def scons_subst_once(strSubst, env, key):
+ """Perform single (non-recursive) substitution of a single
+ construction variable keyword.
+
+ This is used when setting a variable when copying or overriding values
+ in an Environment. We want to capture (expand) the old value before
+ we override it, so people can do things like:
+
+ env2 = env.Clone(CCFLAGS = '$CCFLAGS -g')
+
+ We do this with some straightforward, brute-force code here...
+ """
+ if isinstance(strSubst, str) and strSubst.find('$') < 0:
+ return strSubst
+
+ matchlist = ['$' + key, '${' + key + '}']
+ val = env.get(key, '')
+ def sub_match(match, val=val, matchlist=matchlist):
+ a = match.group(1)
+ if a in matchlist:
+ a = val
+ if is_Sequence(a):
+ return ' '.join(map(str, a))
+ else:
+ return str(a)
+
+ if is_Sequence(strSubst):
+ result = []
+ for arg in strSubst:
+ if is_String(arg):
+ if arg in matchlist:
+ arg = val
+ if is_Sequence(arg):
+ result.extend(arg)
+ else:
+ result.append(arg)
+ else:
+ result.append(_dollar_exps.sub(sub_match, arg))
+ else:
+ result.append(arg)
+ return result
+ elif is_String(strSubst):
+ return _dollar_exps.sub(sub_match, strSubst)
+ else:
+ return strSubst
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Subst.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Subst.xml
new file mode 100644
index 0000000..e9ec599
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Subst.xml
@@ -0,0 +1,73 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+__COPYRIGHT__
+
+This file is processed by the bin/SConsDoc.py module.
+See its __doc__ string for a discussion of the format.
+-->
+
+<!DOCTYPE sconsdoc [
+<!ENTITY % scons SYSTEM '../../../doc/scons.mod'>
+%scons;
+<!ENTITY % builders-mod SYSTEM '../../../doc/generated/builders.mod'>
+%builders-mod;
+<!ENTITY % functions-mod SYSTEM '../../../doc/generated/functions.mod'>
+%functions-mod;
+<!ENTITY % tools-mod SYSTEM '../../../doc/generated/tools.mod'>
+%tools-mod;
+<!ENTITY % variables-mod SYSTEM '../../../doc/generated/variables.mod'>
+%variables-mod;
+]>
+
+<sconsdoc xmlns="http://www.scons.org/dbxsd/v1.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://www.scons.org/dbxsd/v1.0 http://www.scons.org/dbxsd/v1.0/scons.xsd">
+
+
+<scons_function name="AllowSubstExceptions">
+<arguments signature="global">
+([exception, ...])
+</arguments>
+<summary>
+<para>
+Specifies the exceptions that will be allowed
+when expanding construction variables.
+By default,
+any construction variable expansions that generate a
+<literal>NameError</literal>
+or
+<literal>IndexError</literal>
+exception will expand to a
+<literal>''</literal>
+(a null string) and not cause scons to fail.
+All exceptions not in the specified list
+will generate an error message
+and terminate processing.
+</para>
+
+<para>
+If
+&f-AllowSubstExceptions;
+is called multiple times,
+each call completely overwrites the previous list
+of allowed exceptions.
+</para>
+
+<para>
+Example:
+</para>
+
+<example_commands>
+# Requires that all construction variable names exist.
+# (You may wish to do this if you want to enforce strictly
+# that all construction variables must be defined before use.)
+AllowSubstExceptions()
+
+# Also allow a string containing a zero-division expansion
+# like '${1 / 0}' to evalute to ''.
+AllowSubstExceptions(IndexError, NameError, ZeroDivisionError)
+</example_commands>
+</summary>
+</scons_function>
+
+</sconsdoc>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/SubstTests.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/SubstTests.py
new file mode 100644
index 0000000..fcd77df
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/SubstTests.py
@@ -0,0 +1,1266 @@
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+from __future__ import print_function
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import SCons.compat
+
+import os
+import sys
+import unittest
+
+from collections import UserDict
+
+import TestUnit
+
+import SCons.Errors
+
+from SCons.Subst import *
+
+class DummyNode(object):
+ """Simple node work-alike."""
+ def __init__(self, name):
+ self.name = os.path.normpath(name)
+ def __str__(self):
+ return self.name
+ def is_literal(self):
+ return 1
+ def rfile(self):
+ return self
+ def get_subst_proxy(self):
+ return self
+
+class DummyEnv(object):
+ def __init__(self, dict={}):
+ self.dict = dict
+
+ def Dictionary(self, key = None):
+ if not key:
+ return self.dict
+ return self.dict[key]
+
+ def __getitem__(self, key):
+ return self.dict[key]
+
+ def get(self, key, default):
+ return self.dict.get(key, default)
+
+ def sig_dict(self):
+ dict = self.dict.copy()
+ dict["TARGETS"] = 'tsig'
+ dict["SOURCES"] = 'ssig'
+ return dict
+
+def cs(target=None, source=None, env=None, for_signature=None):
+ return 'cs'
+
+def cl(target=None, source=None, env=None, for_signature=None):
+ return ['cl']
+
+def CmdGen1(target, source, env, for_signature):
+ # Nifty trick...since Environment references are interpolated,
+ # instantiate an instance of a callable class with this one,
+ # which will then get evaluated.
+ assert str(target) == 't', target
+ assert str(source) == 's', source
+ return "${CMDGEN2('foo', %d)}" % for_signature
+
+class CmdGen2(object):
+ def __init__(self, mystr, forsig):
+ self.mystr = mystr
+ self.expect_for_signature = forsig
+
+ def __call__(self, target, source, env, for_signature):
+ assert str(target) == 't', target
+ assert str(source) == 's', source
+ assert for_signature == self.expect_for_signature, for_signature
+ return [ self.mystr, env.Dictionary('BAR') ]
+
+if os.sep == '/':
+ def cvt(str):
+ return str
+else:
+ def cvt(str):
+ return str.replace('/', os.sep)
+
+class SubstTestCase(unittest.TestCase):
+ class MyNode(DummyNode):
+ """Simple node work-alike with some extra stuff for testing."""
+ def __init__(self, name):
+ DummyNode.__init__(self, name)
+ class Attribute(object):
+ pass
+ self.attribute = Attribute()
+ self.attribute.attr1 = 'attr$1-' + os.path.basename(name)
+ self.attribute.attr2 = 'attr$2-' + os.path.basename(name)
+ def get_stuff(self, extra):
+ return self.name + extra
+ foo = 1
+
+ class TestLiteral(object):
+ def __init__(self, literal):
+ self.literal = literal
+ def __str__(self):
+ return self.literal
+ def is_literal(self):
+ return 1
+
+ class TestCallable(object):
+ def __init__(self, value):
+ self.value = value
+ def __call__(self):
+ pass
+ def __str__(self):
+ return self.value
+
+ def function_foo(arg):
+ pass
+
+ target = [ MyNode("./foo/bar.exe"),
+ MyNode("/bar/baz with spaces.obj"),
+ MyNode("../foo/baz.obj") ]
+ source = [ MyNode("./foo/blah with spaces.cpp"),
+ MyNode("/bar/ack.cpp"),
+ MyNode("../foo/ack.c") ]
+
+ callable_object_1 = TestCallable('callable-1')
+ callable_object_2 = TestCallable('callable-2')
+
+ def _defines(defs):
+ l = []
+ for d in defs:
+ if SCons.Util.is_List(d) or isinstance(d, tuple):
+ l.append(str(d[0]) + '=' + str(d[1]))
+ else:
+ l.append(str(d))
+ return l
+
+ loc = {
+ 'xxx' : None,
+ 'NEWLINE' : 'before\nafter',
+
+ 'null' : '',
+ 'zero' : 0,
+ 'one' : 1,
+ 'BAZ' : 'baz',
+ 'ONE' : '$TWO',
+ 'TWO' : '$THREE',
+ 'THREE' : 'four',
+
+ 'AAA' : 'a',
+ 'BBB' : 'b',
+ 'CCC' : 'c',
+
+ 'DO' : DummyNode('do something'),
+ 'FOO' : DummyNode('foo.in'),
+ 'BAR' : DummyNode('bar with spaces.out'),
+ 'CRAZY' : DummyNode('crazy\nfile.in'),
+
+ # $XXX$HHH should expand to GGGIII, not BADNEWS.
+ 'XXX' : '$FFF',
+ 'FFF' : 'GGG',
+ 'HHH' : 'III',
+ 'FFFIII' : 'BADNEWS',
+
+ 'THING1' : "$(STUFF$)",
+ 'THING2' : "$THING1",
+
+ 'LITERAL' : TestLiteral("$XXX"),
+
+ # Test that we can expand to and return a function.
+ #'FUNCTION' : function_foo,
+
+ 'CMDGEN1' : CmdGen1,
+ 'CMDGEN2' : CmdGen2,
+
+ 'LITERALS' : [ Literal('foo\nwith\nnewlines'),
+ Literal('bar\nwith\nnewlines') ],
+
+ 'NOTHING' : "",
+ 'NONE' : None,
+
+ # Test various combinations of strings, lists and functions.
+ 'N' : None,
+ 'X' : 'x',
+ 'Y' : '$X',
+ 'R' : '$R',
+ 'S' : 'x y',
+ 'LS' : ['x y'],
+ 'L' : ['x', 'y'],
+ 'TS' : ('x y'),
+ 'T' : ('x', 'y'),
+ 'CS' : cs,
+ 'CL' : cl,
+ 'US' : collections.UserString('us'),
+
+ # Test function calls within ${}.
+ 'FUNCCALL' : '${FUNC1("$AAA $FUNC2 $BBB")}',
+ 'FUNC1' : lambda x: x,
+ 'FUNC2' : lambda target, source, env, for_signature: ['x$CCC'],
+
+ # Various tests refactored from ActionTests.py.
+ 'LIST' : [["This", "is", "$(", "$a", "$)", "test"]],
+
+ # Test recursion.
+ 'RECURSE' : 'foo $RECURSE bar',
+ 'RRR' : 'foo $SSS bar',
+ 'SSS' : '$RRR',
+
+ # Test callables that don't match the calling arguments.
+ 'CALLABLE1' : callable_object_1,
+ 'CALLABLE2' : callable_object_2,
+
+ '_defines' : _defines,
+ 'DEFS' : [ ('Q1', '"q1"'), ('Q2', '"$AAA"') ],
+ }
+
+ def basic_comparisons(self, function, convert):
+ env = DummyEnv(self.loc)
+ cases = self.basic_cases[:]
+ kwargs = {'target' : self.target, 'source' : self.source,
+ 'gvars' : env.Dictionary()}
+
+ failed = 0
+ while cases:
+ input, expect = cases[:2]
+ expect = convert(expect)
+ try:
+ result = function(input, env, **kwargs)
+ except Exception as e:
+ fmt = " input %s generated %s (%s)"
+ print(fmt % (repr(input), e.__class__.__name__, repr(e)))
+ failed = failed + 1
+ else:
+ if result != expect:
+ if failed == 0: print()
+ print(" input %s => \n%s did not match \n%s" % (repr(input), repr(result), repr(expect)))
+ failed = failed + 1
+ del cases[:2]
+ fmt = "%d %s() cases failed"
+ assert failed == 0, fmt % (failed, function.__name__)
+
+class scons_subst_TestCase(SubstTestCase):
+
+ # Basic tests of substitution functionality.
+ basic_cases = [
+ # Basics: strings without expansions are left alone, and
+ # the simplest possible expansion to a null-string value.
+ "test", "test",
+ "$null", "",
+
+ # Test expansion of integer values.
+ "test $zero", "test 0",
+ "test $one", "test 1",
+
+ # Test multiple re-expansion of values.
+ "test $ONE", "test four",
+
+ # Test a whole bunch of $TARGET[S] and $SOURCE[S] expansions.
+ "test $TARGETS $SOURCES",
+ "test foo/bar.exe /bar/baz with spaces.obj ../foo/baz.obj foo/blah with spaces.cpp /bar/ack.cpp ../foo/ack.c",
+
+ "test ${TARGETS[:]} ${SOURCES[0]}",
+ "test foo/bar.exe /bar/baz with spaces.obj ../foo/baz.obj foo/blah with spaces.cpp",
+
+ "test ${TARGETS[1:]}v",
+ "test /bar/baz with spaces.obj ../foo/baz.objv",
+
+ "test $TARGET",
+ "test foo/bar.exe",
+
+ "test $TARGET$NO_SUCH_VAR[0]",
+ "test foo/bar.exe[0]",
+
+ "test $TARGETS.foo",
+ "test 1 1 1",
+
+ "test ${SOURCES[0:2].foo}",
+ "test 1 1",
+
+ "test $SOURCE.foo",
+ "test 1",
+
+ "test ${TARGET.get_stuff('blah')}",
+ "test foo/bar.exeblah",
+
+ "test ${SOURCES.get_stuff('blah')}",
+ "test foo/blah with spaces.cppblah /bar/ack.cppblah ../foo/ack.cblah",
+
+ "test ${SOURCES[0:2].get_stuff('blah')}",
+ "test foo/blah with spaces.cppblah /bar/ack.cppblah",
+
+ "test ${SOURCES[0:2].get_stuff('blah')}",
+ "test foo/blah with spaces.cppblah /bar/ack.cppblah",
+
+ "test ${SOURCES.attribute.attr1}",
+ "test attr$1-blah with spaces.cpp attr$1-ack.cpp attr$1-ack.c",
+
+ "test ${SOURCES.attribute.attr2}",
+ "test attr$2-blah with spaces.cpp attr$2-ack.cpp attr$2-ack.c",
+
+ # Test adjacent expansions.
+ "foo$BAZ",
+ "foobaz",
+
+ "foo${BAZ}",
+ "foobaz",
+
+ # Test that adjacent expansions don't get re-interpreted
+ # together. The correct disambiguated expansion should be:
+ # $XXX$HHH => ${FFF}III => GGGIII
+ # not:
+ # $XXX$HHH => ${FFFIII} => BADNEWS
+ "$XXX$HHH", "GGGIII",
+
+ # Test double-dollar-sign behavior.
+ "$$FFF$HHH", "$FFFIII",
+
+ # Test double-dollar-sign before open paren. It's not meant
+ # to be signature escaping
+ 'echo $$(pwd) > XYZ', 'echo $(pwd) > XYZ',
+
+ # Test that a Literal will stop dollar-sign substitution.
+ "$XXX $LITERAL $FFF", "GGG $XXX GGG",
+
+ # Test that we don't blow up even if they subscript
+ # something in ways they "can't."
+ "${FFF[0]}", "G",
+ "${FFF[7]}", "",
+ "${NOTHING[1]}", "",
+
+ # Test various combinations of strings and lists.
+ #None, '',
+ '', '',
+ 'x', 'x',
+ 'x y', 'x y',
+ '$N', '',
+ '$X', 'x',
+ '$Y', 'x',
+ '$R', '',
+ '$S', 'x y',
+ '$LS', 'x y',
+ '$L', 'x y',
+ '$TS', 'x y',
+ '$T', 'x y',
+ '$S z', 'x y z',
+ '$LS z', 'x y z',
+ '$L z', 'x y z',
+ '$TS z', 'x y z',
+ '$T z', 'x y z',
+ #cs, 'cs',
+ #cl, 'cl',
+ '$CS', 'cs',
+ '$CL', 'cl',
+
+ # Various uses of UserString.
+ collections.UserString('x'), 'x',
+ collections.UserString('$X'), 'x',
+ collections.UserString('$US'), 'us',
+ '$US', 'us',
+
+ # Test function calls within ${}.
+ '$FUNCCALL', 'a xc b',
+
+ # Bug reported by Christoph Wiedemann.
+ cvt('$xxx/bin'), '/bin',
+
+ # Tests callables that don't match our calling arguments.
+ '$CALLABLE1', 'callable-1',
+
+ # Test handling of quotes.
+ 'aaa "bbb ccc" ddd', 'aaa "bbb ccc" ddd',
+ ]
+
+ def test_scons_subst(self):
+ """Test scons_subst(): basic substitution"""
+ return self.basic_comparisons(scons_subst, cvt)
+
+ subst_cases = [
+ "test $xxx",
+ "test ",
+ "test",
+ "test",
+
+ "test $($xxx$)",
+ "test $($)",
+ "test",
+ "test",
+
+ "test $( $xxx $)",
+ "test $( $)",
+ "test",
+ "test",
+
+ "test $( $THING2 $)",
+ "test $( $(STUFF$) $)",
+ "test STUFF",
+ "test",
+
+ "$AAA ${AAA}A $BBBB $BBB",
+ "a aA b",
+ "a aA b",
+ "a aA b",
+
+ "$RECURSE",
+ "foo bar",
+ "foo bar",
+ "foo bar",
+
+ "$RRR",
+ "foo bar",
+ "foo bar",
+ "foo bar",
+
+ # Verify what happens with no target or source nodes.
+ "$TARGET $SOURCES",
+ " ",
+ "",
+ "",
+
+ "$TARGETS $SOURCE",
+ " ",
+ "",
+ "",
+
+ # Various tests refactored from ActionTests.py.
+ "${LIST}",
+ "This is $( $) test",
+ "This is test",
+ "This is test",
+
+ ["|", "$(", "$AAA", "|", "$BBB", "$)", "|", "$CCC", 1],
+ ["|", "$(", "a", "|", "b", "$)", "|", "c", "1"],
+ ["|", "a", "|", "b", "|", "c", "1"],
+ ["|", "|", "c", "1"],
+ ]
+
+ def test_subst_env(self):
+ """Test scons_subst(): expansion dictionary"""
+ # The expansion dictionary no longer comes from the construction
+ # environment automatically.
+ env = DummyEnv(self.loc)
+ s = scons_subst('$AAA', env)
+ assert s == '', s
+
+ def test_subst_SUBST_modes(self):
+ """Test scons_subst(): SUBST_* modes"""
+ env = DummyEnv(self.loc)
+ subst_cases = self.subst_cases[:]
+
+ gvars = env.Dictionary()
+
+ failed = 0
+ while subst_cases:
+ input, eraw, ecmd, esig = subst_cases[:4]
+ result = scons_subst(input, env, mode=SUBST_RAW, gvars=gvars)
+ if result != eraw:
+ if failed == 0: print()
+ print(" input %s => RAW %s did not match %s" % (repr(input), repr(result), repr(eraw)))
+ failed = failed + 1
+ result = scons_subst(input, env, mode=SUBST_CMD, gvars=gvars)
+ if result != ecmd:
+ if failed == 0: print()
+ print(" input %s => CMD %s did not match %s" % (repr(input), repr(result), repr(ecmd)))
+ failed = failed + 1
+ result = scons_subst(input, env, mode=SUBST_SIG, gvars=gvars)
+ if result != esig:
+ if failed == 0: print()
+ print(" input %s => SIG %s did not match %s" % (repr(input), repr(result), repr(esig)))
+ failed = failed + 1
+ del subst_cases[:4]
+ assert failed == 0, "%d subst() mode cases failed" % failed
+
+ def test_subst_target_source(self):
+ """Test scons_subst(): target= and source= arguments"""
+ env = DummyEnv(self.loc)
+ t1 = self.MyNode('t1')
+ t2 = self.MyNode('t2')
+ s1 = self.MyNode('s1')
+ s2 = self.MyNode('s2')
+ result = scons_subst("$TARGET $SOURCES", env,
+ target=[t1, t2],
+ source=[s1, s2])
+ assert result == "t1 s1 s2", result
+ result = scons_subst("$TARGET $SOURCES", env,
+ target=[t1, t2],
+ source=[s1, s2],
+ gvars={})
+ assert result == "t1 s1 s2", result
+
+ result = scons_subst("$TARGET $SOURCES", env, target=[], source=[])
+ assert result == " ", result
+ result = scons_subst("$TARGETS $SOURCE", env, target=[], source=[])
+ assert result == " ", result
+
+ def test_subst_callable_expansion(self):
+ """Test scons_subst(): expanding a callable"""
+ env = DummyEnv(self.loc)
+ gvars = env.Dictionary()
+ newcom = scons_subst("test $CMDGEN1 $SOURCES $TARGETS", env,
+ target=self.MyNode('t'), source=self.MyNode('s'),
+ gvars=gvars)
+ assert newcom == "test foo bar with spaces.out s t", newcom
+
+ def test_subst_attribute_errors(self):
+ """Test scons_subst(): handling attribute errors"""
+ env = DummyEnv(self.loc)
+ try:
+ class Foo(object):
+ pass
+ scons_subst('${foo.bar}', env, gvars={'foo':Foo()})
+ except SCons.Errors.UserError as e:
+ expect = [
+ "AttributeError `bar' trying to evaluate `${foo.bar}'",
+ "AttributeError `Foo instance has no attribute 'bar'' trying to evaluate `${foo.bar}'",
+ "AttributeError `'Foo' instance has no attribute 'bar'' trying to evaluate `${foo.bar}'",
+ "AttributeError `'Foo' object has no attribute 'bar'' trying to evaluate `${foo.bar}'",
+ ]
+ assert str(e) in expect, e
+ else:
+ raise AssertionError("did not catch expected UserError")
+
+ def test_subst_syntax_errors(self):
+ """Test scons_subst(): handling syntax errors"""
+ env = DummyEnv(self.loc)
+ try:
+ scons_subst('$foo.bar.3.0', env)
+ except SCons.Errors.UserError as e:
+ expect = [
+ # Python 2.3, 2.4
+ "SyntaxError `invalid syntax (line 1)' trying to evaluate `$foo.bar.3.0'",
+ # Python 2.5
+ "SyntaxError `invalid syntax (<string>, line 1)' trying to evaluate `$foo.bar.3.0'",
+ ]
+ assert str(e) in expect, e
+ else:
+ raise AssertionError("did not catch expected UserError")
+
+ def test_subst_balance_errors(self):
+ """Test scons_subst(): handling syntax errors"""
+ env = DummyEnv(self.loc)
+ try:
+ scons_subst('$(', env, mode=SUBST_SIG)
+ except SCons.Errors.UserError as e:
+ assert str(e) == "Unbalanced $(/$) in: $(", str(e)
+ else:
+ raise AssertionError("did not catch expected UserError")
+
+ try:
+ scons_subst('$)', env, mode=SUBST_SIG)
+ except SCons.Errors.UserError as e:
+ assert str(e) == "Unbalanced $(/$) in: $)", str(e)
+ else:
+ raise AssertionError("did not catch expected UserError")
+
+ def test_subst_type_errors(self):
+ """Test scons_subst(): handling type errors"""
+ env = DummyEnv(self.loc)
+ try:
+ scons_subst("${NONE[2]}", env, gvars={'NONE':None})
+ except SCons.Errors.UserError as e:
+ expect = [
+ # Python 2.3, 2.4
+ "TypeError `unsubscriptable object' trying to evaluate `${NONE[2]}'",
+ # Python 2.5, 2.6
+ "TypeError `'NoneType' object is unsubscriptable' trying to evaluate `${NONE[2]}'",
+ # Python 2.7 and later
+ "TypeError `'NoneType' object is not subscriptable' trying to evaluate `${NONE[2]}'",
+ # Python 2.7 and later under Fedora
+ "TypeError `'NoneType' object has no attribute '__getitem__'' trying to evaluate `${NONE[2]}'",
+ ]
+ assert str(e) in expect, e
+ else:
+ raise AssertionError("did not catch expected UserError")
+
+ try:
+ def func(a, b, c):
+ pass
+ scons_subst("${func(1)}", env, gvars={'func':func})
+ except SCons.Errors.UserError as e:
+ expect = [
+ # Python 2.3, 2.4, 2.5
+ "TypeError `func() takes exactly 3 arguments (1 given)' trying to evaluate `${func(1)}'",
+
+ # Python 3.5 (and 3.x?)
+ "TypeError `func() missing 2 required positional arguments: 'b' and 'c'' trying to evaluate `${func(1)}'"
+ ]
+ assert str(e) in expect, repr(str(e))
+ else:
+ raise AssertionError("did not catch expected UserError")
+
+ def test_subst_raw_function(self):
+ """Test scons_subst(): fetch function with SUBST_RAW plus conv"""
+ # Test that the combination of SUBST_RAW plus a pass-through
+ # conversion routine allows us to fetch a function through the
+ # dictionary. CommandAction uses this to allow delayed evaluation
+ # of $SPAWN variables.
+ env = DummyEnv(self.loc)
+ gvars = env.Dictionary()
+ x = lambda x: x
+ r = scons_subst("$CALLABLE1", env, mode=SUBST_RAW, conv=x, gvars=gvars)
+ assert r is self.callable_object_1, repr(r)
+ r = scons_subst("$CALLABLE1", env, mode=SUBST_RAW, gvars=gvars)
+ assert r == 'callable-1', repr(r)
+
+ # Test how we handle overriding the internal conversion routines.
+ def s(obj):
+ return obj
+
+ n1 = self.MyNode('n1')
+ env = DummyEnv({'NODE' : n1})
+ gvars = env.Dictionary()
+ node = scons_subst("$NODE", env, mode=SUBST_RAW, conv=s, gvars=gvars)
+ assert node is n1, node
+ node = scons_subst("$NODE", env, mode=SUBST_CMD, conv=s, gvars=gvars)
+ assert node is n1, node
+ node = scons_subst("$NODE", env, mode=SUBST_SIG, conv=s, gvars=gvars)
+ assert node is n1, node
+
+ def test_subst_overriding_gvars(self):
+ """Test scons_subst(): supplying an overriding gvars dictionary"""
+ env = DummyEnv({'XXX' : 'xxx'})
+ result = scons_subst('$XXX', env, gvars=env.Dictionary())
+ assert result == 'xxx', result
+ result = scons_subst('$XXX', env, gvars={'XXX' : 'yyy'})
+ assert result == 'yyy', result
+
+class CLVar_TestCase(unittest.TestCase):
+ def test_CLVar(self):
+ """Test scons_subst() and scons_subst_list() with CLVar objects"""
+
+ loc = {}
+ loc['FOO'] = 'foo'
+ loc['BAR'] = SCons.Util.CLVar('bar')
+ loc['CALL'] = lambda target, source, env, for_signature: 'call'
+ env = DummyEnv(loc)
+
+ cmd = SCons.Util.CLVar("test $FOO $BAR $CALL test")
+
+ newcmd = scons_subst(cmd, env, gvars=env.Dictionary())
+ assert newcmd == ['test', 'foo', 'bar', 'call', 'test'], newcmd
+
+ cmd_list = scons_subst_list(cmd, env, gvars=env.Dictionary())
+ assert len(cmd_list) == 1, cmd_list
+ assert cmd_list[0][0] == "test", cmd_list[0][0]
+ assert cmd_list[0][1] == "foo", cmd_list[0][1]
+ assert cmd_list[0][2] == "bar", cmd_list[0][2]
+ assert cmd_list[0][3] == "call", cmd_list[0][3]
+ assert cmd_list[0][4] == "test", cmd_list[0][4]
+
+class scons_subst_list_TestCase(SubstTestCase):
+
+ basic_cases = [
+ "$TARGETS",
+ [
+ ["foo/bar.exe", "/bar/baz with spaces.obj", "../foo/baz.obj"],
+ ],
+
+ "$SOURCES $NEWLINE $TARGETS",
+ [
+ ["foo/blah with spaces.cpp", "/bar/ack.cpp", "../foo/ack.c", "before"],
+ ["after", "foo/bar.exe", "/bar/baz with spaces.obj", "../foo/baz.obj"],
+ ],
+
+ "$SOURCES$NEWLINE",
+ [
+ ["foo/blah with spaces.cpp", "/bar/ack.cpp", "../foo/ack.cbefore"],
+ ["after"],
+ ],
+
+ "foo$FFF",
+ [
+ ["fooGGG"],
+ ],
+
+ "foo${FFF}",
+ [
+ ["fooGGG"],
+ ],
+
+ "test ${SOURCES.attribute.attr1}",
+ [
+ ["test", "attr$1-blah with spaces.cpp", "attr$1-ack.cpp", "attr$1-ack.c"],
+ ],
+
+ "test ${SOURCES.attribute.attr2}",
+ [
+ ["test", "attr$2-blah with spaces.cpp", "attr$2-ack.cpp", "attr$2-ack.c"],
+ ],
+
+ "$DO --in=$FOO --out=$BAR",
+ [
+ ["do something", "--in=foo.in", "--out=bar with spaces.out"],
+ ],
+
+ # This test is now fixed, and works like it should.
+ "$DO --in=$CRAZY --out=$BAR",
+ [
+ ["do something", "--in=crazy\nfile.in", "--out=bar with spaces.out"],
+ ],
+
+ # Try passing a list to scons_subst_list().
+ [ "$SOURCES$NEWLINE", "$TARGETS", "This is a test"],
+ [
+ ["foo/blah with spaces.cpp", "/bar/ack.cpp", "../foo/ack.cbefore"],
+ ["after", "foo/bar.exe", "/bar/baz with spaces.obj", "../foo/baz.obj", "This is a test"],
+ ],
+
+ # Test against a former bug in scons_subst_list().
+ "$XXX$HHH",
+ [
+ ["GGGIII"],
+ ],
+
+ # Test double-dollar-sign behavior.
+ "$$FFF$HHH",
+ [
+ ["$FFFIII"],
+ ],
+
+ # Test various combinations of strings, lists and functions.
+ None, [[]],
+ [None], [[]],
+ '', [[]],
+ [''], [[]],
+ 'x', [['x']],
+ ['x'], [['x']],
+ 'x y', [['x', 'y']],
+ ['x y'], [['x y']],
+ ['x', 'y'], [['x', 'y']],
+ '$N', [[]],
+ ['$N'], [[]],
+ '$X', [['x']],
+ ['$X'], [['x']],
+ '$Y', [['x']],
+ ['$Y'], [['x']],
+ #'$R', [[]],
+ #['$R'], [[]],
+ '$S', [['x', 'y']],
+ '$S z', [['x', 'y', 'z']],
+ ['$S'], [['x', 'y']],
+ ['$S z'], [['x', 'y z']], # XXX - IS THIS BEST?
+ ['$S', 'z'], [['x', 'y', 'z']],
+ '$LS', [['x y']],
+ '$LS z', [['x y', 'z']],
+ ['$LS'], [['x y']],
+ ['$LS z'], [['x y z']],
+ ['$LS', 'z'], [['x y', 'z']],
+ '$L', [['x', 'y']],
+ '$L z', [['x', 'y', 'z']],
+ ['$L'], [['x', 'y']],
+ ['$L z'], [['x', 'y z']], # XXX - IS THIS BEST?
+ ['$L', 'z'], [['x', 'y', 'z']],
+ cs, [['cs']],
+ [cs], [['cs']],
+ cl, [['cl']],
+ [cl], [['cl']],
+ '$CS', [['cs']],
+ ['$CS'], [['cs']],
+ '$CL', [['cl']],
+ ['$CL'], [['cl']],
+
+ # Various uses of UserString.
+ collections.UserString('x'), [['x']],
+ [collections.UserString('x')], [['x']],
+ collections.UserString('$X'), [['x']],
+ [collections.UserString('$X')], [['x']],
+ collections.UserString('$US'), [['us']],
+ [collections.UserString('$US')], [['us']],
+ '$US', [['us']],
+ ['$US'], [['us']],
+
+ # Test function calls within ${}.
+ '$FUNCCALL', [['a', 'xc', 'b']],
+
+ # Test handling of newlines in white space.
+ 'foo\nbar', [['foo'], ['bar']],
+ 'foo\n\nbar', [['foo'], ['bar']],
+ 'foo \n \n bar', [['foo'], ['bar']],
+ 'foo \nmiddle\n bar', [['foo'], ['middle'], ['bar']],
+
+ # Bug reported by Christoph Wiedemann.
+ cvt('$xxx/bin'), [['/bin']],
+
+ # Test variables smooshed together with different prefixes.
+ 'foo$AAA', [['fooa']],
+ '<$AAA', [['<', 'a']],
+ '>$AAA', [['>', 'a']],
+ '|$AAA', [['|', 'a']],
+
+ # Test callables that don't match our calling arguments.
+ '$CALLABLE2', [['callable-2']],
+
+ # Test handling of quotes.
+ # XXX Find a way to handle this in the future.
+ #'aaa "bbb ccc" ddd', [['aaa', 'bbb ccc', 'ddd']],
+
+ '${_defines(DEFS)}', [['Q1="q1"', 'Q2="a"']],
+ ]
+
+ def test_scons_subst_list(self):
+ """Test scons_subst_list(): basic substitution"""
+ def convert_lists(expect):
+ return [list(map(cvt, l)) for l in expect]
+ return self.basic_comparisons(scons_subst_list, convert_lists)
+
+ subst_list_cases = [
+ "test $xxx",
+ [["test"]],
+ [["test"]],
+ [["test"]],
+
+ "test $($xxx$)",
+ [["test", "$($)"]],
+ [["test"]],
+ [["test"]],
+
+ "test $( $xxx $)",
+ [["test", "$(", "$)"]],
+ [["test"]],
+ [["test"]],
+
+ "$AAA ${AAA}A $BBBB $BBB",
+ [["a", "aA", "b"]],
+ [["a", "aA", "b"]],
+ [["a", "aA", "b"]],
+
+ "$RECURSE",
+ [["foo", "bar"]],
+ [["foo", "bar"]],
+ [["foo", "bar"]],
+
+ "$RRR",
+ [["foo", "bar"]],
+ [["foo", "bar"]],
+ [["foo", "bar"]],
+
+ # Verify what happens with no target or source nodes.
+ "$TARGET $SOURCES",
+ [[]],
+ [[]],
+ [[]],
+
+ "$TARGETS $SOURCE",
+ [[]],
+ [[]],
+ [[]],
+
+ # Various test refactored from ActionTests.py
+ "${LIST}",
+ [['This', 'is', '$(', '$)', 'test']],
+ [['This', 'is', 'test']],
+ [['This', 'is', 'test']],
+
+ ["|", "$(", "$AAA", "|", "$BBB", "$)", "|", "$CCC", 1],
+ [["|", "$(", "a", "|", "b", "$)", "|", "c", "1"]],
+ [["|", "a", "|", "b", "|", "c", "1"]],
+ [["|", "|", "c", "1"]],
+ ]
+
+ def test_subst_env(self):
+ """Test scons_subst_list(): expansion dictionary"""
+ # The expansion dictionary no longer comes from the construction
+ # environment automatically.
+ env = DummyEnv()
+ s = scons_subst_list('$AAA', env)
+ assert s == [[]], s
+
+ def test_subst_target_source(self):
+ """Test scons_subst_list(): target= and source= arguments"""
+ env = DummyEnv(self.loc)
+ gvars = env.Dictionary()
+ t1 = self.MyNode('t1')
+ t2 = self.MyNode('t2')
+ s1 = self.MyNode('s1')
+ s2 = self.MyNode('s2')
+ result = scons_subst_list("$TARGET $SOURCES", env,
+ target=[t1, t2],
+ source=[s1, s2],
+ gvars=gvars)
+ assert result == [['t1', 's1', 's2']], result
+ result = scons_subst_list("$TARGET $SOURCES", env,
+ target=[t1, t2],
+ source=[s1, s2],
+ gvars={})
+ assert result == [['t1', 's1', 's2']], result
+
+ # Test interpolating a callable.
+ _t = DummyNode('t')
+ _s = DummyNode('s')
+ cmd_list = scons_subst_list("testing $CMDGEN1 $TARGETS $SOURCES",
+ env, target=_t, source=_s,
+ gvars=gvars)
+ assert cmd_list == [['testing', 'foo', 'bar with spaces.out', 't', 's']], cmd_list
+
+ def test_subst_escape(self):
+ """Test scons_subst_list(): escape functionality"""
+ env = DummyEnv(self.loc)
+ gvars = env.Dictionary()
+ def escape_func(foo):
+ return '**' + foo + '**'
+ cmd_list = scons_subst_list("abc $LITERALS xyz", env, gvars=gvars)
+ assert cmd_list == [['abc',
+ 'foo\nwith\nnewlines',
+ 'bar\nwith\nnewlines',
+ 'xyz']], cmd_list
+ c = cmd_list[0][0].escape(escape_func)
+ assert c == 'abc', c
+ c = cmd_list[0][1].escape(escape_func)
+ assert c == '**foo\nwith\nnewlines**', c
+ c = cmd_list[0][2].escape(escape_func)
+ assert c == '**bar\nwith\nnewlines**', c
+ c = cmd_list[0][3].escape(escape_func)
+ assert c == 'xyz', c
+
+ # We used to treat literals smooshed together like the whole
+ # thing was literal and escape it as a unit. The commented-out
+ # asserts below are in case we ever have to find a way to
+ # resurrect that functionality in some way.
+ cmd_list = scons_subst_list("abc${LITERALS}xyz", env, gvars=gvars)
+ c = cmd_list[0][0].escape(escape_func)
+ #assert c == '**abcfoo\nwith\nnewlines**', c
+ assert c == 'abcfoo\nwith\nnewlines', c
+ c = cmd_list[0][1].escape(escape_func)
+ #assert c == '**bar\nwith\nnewlinesxyz**', c
+ assert c == 'bar\nwith\nnewlinesxyz', c
+
+ _t = DummyNode('t')
+
+ cmd_list = scons_subst_list('echo "target: $TARGET"', env,
+ target=_t, gvars=gvars)
+ c = cmd_list[0][0].escape(escape_func)
+ assert c == 'echo', c
+ c = cmd_list[0][1].escape(escape_func)
+ assert c == '"target:', c
+ c = cmd_list[0][2].escape(escape_func)
+ assert c == 't"', c
+
+ def test_subst_SUBST_modes(self):
+ """Test scons_subst_list(): SUBST_* modes"""
+ env = DummyEnv(self.loc)
+ subst_list_cases = self.subst_list_cases[:]
+ gvars = env.Dictionary()
+
+ r = scons_subst_list("$TARGET $SOURCES", env, mode=SUBST_RAW, gvars=gvars)
+ assert r == [[]], r
+
+ failed = 0
+ while subst_list_cases:
+ input, eraw, ecmd, esig = subst_list_cases[:4]
+ result = scons_subst_list(input, env, mode=SUBST_RAW, gvars=gvars)
+ if result != eraw:
+ if failed == 0: print()
+ print(" input %s => RAW %s did not match %s" % (repr(input), repr(result), repr(eraw)))
+ failed = failed + 1
+ result = scons_subst_list(input, env, mode=SUBST_CMD, gvars=gvars)
+ if result != ecmd:
+ if failed == 0: print()
+ print(" input %s => CMD %s did not match %s" % (repr(input), repr(result), repr(ecmd)))
+ failed = failed + 1
+ result = scons_subst_list(input, env, mode=SUBST_SIG, gvars=gvars)
+ if result != esig:
+ if failed == 0: print()
+ print(" input %s => SIG %s did not match %s" % (repr(input), repr(result), repr(esig)))
+ failed = failed + 1
+ del subst_list_cases[:4]
+ assert failed == 0, "%d subst() mode cases failed" % failed
+
+ def test_subst_attribute_errors(self):
+ """Test scons_subst_list(): handling attribute errors"""
+ env = DummyEnv()
+ try:
+ class Foo(object):
+ pass
+ scons_subst_list('${foo.bar}', env, gvars={'foo':Foo()})
+ except SCons.Errors.UserError as e:
+ expect = [
+ "AttributeError `bar' trying to evaluate `${foo.bar}'",
+ "AttributeError `Foo instance has no attribute 'bar'' trying to evaluate `${foo.bar}'",
+ "AttributeError `'Foo' instance has no attribute 'bar'' trying to evaluate `${foo.bar}'",
+ "AttributeError `'Foo' object has no attribute 'bar'' trying to evaluate `${foo.bar}'",
+ ]
+ assert str(e) in expect, e
+ else:
+ raise AssertionError("did not catch expected UserError")
+
+ def test_subst_syntax_errors(self):
+ """Test scons_subst_list(): handling syntax errors"""
+ env = DummyEnv()
+ try:
+ scons_subst_list('$foo.bar.3.0', env)
+ except SCons.Errors.UserError as e:
+ expect = [
+ "SyntaxError `invalid syntax' trying to evaluate `$foo.bar.3.0'",
+ "SyntaxError `invalid syntax (line 1)' trying to evaluate `$foo.bar.3.0'",
+ "SyntaxError `invalid syntax (<string>, line 1)' trying to evaluate `$foo.bar.3.0'",
+ ]
+ assert str(e) in expect, e
+ else:
+ raise AssertionError("did not catch expected SyntaxError")
+
+ def test_subst_raw_function(self):
+ """Test scons_subst_list(): fetch function with SUBST_RAW plus conv"""
+ # Test that the combination of SUBST_RAW plus a pass-through
+ # conversion routine allows us to fetch a function through the
+ # dictionary.
+ env = DummyEnv(self.loc)
+ gvars = env.Dictionary()
+ x = lambda x: x
+ r = scons_subst_list("$CALLABLE2", env, mode=SUBST_RAW, conv=x, gvars=gvars)
+ assert r == [[self.callable_object_2]], repr(r)
+ r = scons_subst_list("$CALLABLE2", env, mode=SUBST_RAW, gvars=gvars)
+ assert r == [['callable-2']], repr(r)
+
+ def test_subst_list_overriding_gvars(self):
+ """Test scons_subst_list(): overriding conv()"""
+ env = DummyEnv()
+ def s(obj):
+ return obj
+
+ n1 = self.MyNode('n1')
+ env = DummyEnv({'NODE' : n1})
+ gvars=env.Dictionary()
+ node = scons_subst_list("$NODE", env, mode=SUBST_RAW, conv=s, gvars=gvars)
+ assert node == [[n1]], node
+ node = scons_subst_list("$NODE", env, mode=SUBST_CMD, conv=s, gvars=gvars)
+ assert node == [[n1]], node
+ node = scons_subst_list("$NODE", env, mode=SUBST_SIG, conv=s, gvars=gvars)
+ assert node == [[n1]], node
+
+ def test_subst_list_overriding_gvars(self):
+ """Test scons_subst_list(): supplying an overriding gvars dictionary"""
+ env = DummyEnv({'XXX' : 'xxx'})
+ result = scons_subst_list('$XXX', env, gvars=env.Dictionary())
+ assert result == [['xxx']], result
+ result = scons_subst_list('$XXX', env, gvars={'XXX' : 'yyy'})
+ assert result == [['yyy']], result
+
+class scons_subst_once_TestCase(unittest.TestCase):
+
+ loc = {
+ 'CCFLAGS' : '-DFOO',
+ 'ONE' : 1,
+ 'RECURSE' : 'r $RECURSE r',
+ 'LIST' : ['a', 'b', 'c'],
+ }
+
+ basic_cases = [
+ '$CCFLAGS -DBAR',
+ 'OTHER_KEY',
+ '$CCFLAGS -DBAR',
+
+ '$CCFLAGS -DBAR',
+ 'CCFLAGS',
+ '-DFOO -DBAR',
+
+ 'x $ONE y',
+ 'ONE',
+ 'x 1 y',
+
+ 'x $RECURSE y',
+ 'RECURSE',
+ 'x r $RECURSE r y',
+
+ '$LIST',
+ 'LIST',
+ 'a b c',
+
+ ['$LIST'],
+ 'LIST',
+ ['a', 'b', 'c'],
+
+ ['x', '$LIST', 'y'],
+ 'LIST',
+ ['x', 'a', 'b', 'c', 'y'],
+
+ ['x', 'x $LIST y', 'y'],
+ 'LIST',
+ ['x', 'x a b c y', 'y'],
+
+ ['x', 'x $CCFLAGS y', 'y'],
+ 'LIST',
+ ['x', 'x $CCFLAGS y', 'y'],
+
+ ['x', 'x $RECURSE y', 'y'],
+ 'LIST',
+ ['x', 'x $RECURSE y', 'y'],
+ ]
+
+ def test_subst_once(self):
+ """Test the scons_subst_once() function"""
+ env = DummyEnv(self.loc)
+ cases = self.basic_cases[:]
+
+ failed = 0
+ while cases:
+ input, key, expect = cases[:3]
+ result = scons_subst_once(input, env, key)
+ if result != expect:
+ if failed == 0: print()
+ print(" input %s (%s) => %s did not match %s" % (repr(input), repr(key), repr(result), repr(expect)))
+ failed = failed + 1
+ del cases[:3]
+ assert failed == 0, "%d subst() cases failed" % failed
+
+class quote_spaces_TestCase(unittest.TestCase):
+ def test_quote_spaces(self):
+ """Test the quote_spaces() method..."""
+ q = quote_spaces('x')
+ assert q == 'x', q
+
+ q = quote_spaces('x x')
+ assert q == '"x x"', q
+
+ q = quote_spaces('x\tx')
+ assert q == '"x\tx"', q
+
+ class Node(object):
+ def __init__(self, name, children=[]):
+ self.children = children
+ self.name = name
+ def __str__(self):
+ return self.name
+ def exists(self):
+ return 1
+ def rexists(self):
+ return 1
+ def has_builder(self):
+ return 1
+ def has_explicit_builder(self):
+ return 1
+ def side_effect(self):
+ return 1
+ def precious(self):
+ return 1
+ def always_build(self):
+ return 1
+ def current(self):
+ return 1
+
+class LiteralTestCase(unittest.TestCase):
+ def test_Literal(self):
+ """Test the Literal() function."""
+ input_list = [ '$FOO', Literal('$BAR') ]
+ gvars = { 'FOO' : 'BAZ', 'BAR' : 'BLAT' }
+
+ def escape_func(cmd):
+ return '**' + cmd + '**'
+
+ cmd_list = scons_subst_list(input_list, None, gvars=gvars)
+ cmd_list = escape_list(cmd_list[0], escape_func)
+ assert cmd_list == ['BAZ', '**$BAR**'], cmd_list
+
+ def test_LiteralEqualsTest(self):
+ """Test that Literals compare for equality properly"""
+ assert Literal('a literal') == Literal('a literal')
+ assert Literal('a literal') != Literal('b literal')
+
+class SpecialAttrWrapperTestCase(unittest.TestCase):
+ def test_SpecialAttrWrapper(self):
+ """Test the SpecialAttrWrapper() function."""
+ input_list = [ '$FOO', SpecialAttrWrapper('$BAR', 'BLEH') ]
+ gvars = { 'FOO' : 'BAZ', 'BAR' : 'BLAT' }
+
+ def escape_func(cmd):
+ return '**' + cmd + '**'
+
+ cmd_list = scons_subst_list(input_list, None, gvars=gvars)
+ cmd_list = escape_list(cmd_list[0], escape_func)
+ assert cmd_list == ['BAZ', '**$BAR**'], cmd_list
+
+ cmd_list = scons_subst_list(input_list, None, mode=SUBST_SIG, gvars=gvars)
+ cmd_list = escape_list(cmd_list[0], escape_func)
+ assert cmd_list == ['BAZ', '**BLEH**'], cmd_list
+
+class subst_dict_TestCase(unittest.TestCase):
+ def test_subst_dict(self):
+ """Test substituting dictionary values in an Action
+ """
+ t = DummyNode('t')
+ s = DummyNode('s')
+ d = subst_dict(target=t, source=s)
+ assert str(d['TARGETS'][0]) == 't', d['TARGETS']
+ assert str(d['TARGET']) == 't', d['TARGET']
+ assert str(d['SOURCES'][0]) == 's', d['SOURCES']
+ assert str(d['SOURCE']) == 's', d['SOURCE']
+
+ t1 = DummyNode('t1')
+ t2 = DummyNode('t2')
+ s1 = DummyNode('s1')
+ s2 = DummyNode('s2')
+ d = subst_dict(target=[t1, t2], source=[s1, s2])
+ TARGETS = sorted([str(x) for x in d['TARGETS']])
+ assert TARGETS == ['t1', 't2'], d['TARGETS']
+ assert str(d['TARGET']) == 't1', d['TARGET']
+ SOURCES = sorted([str(x) for x in d['SOURCES']])
+ assert SOURCES == ['s1', 's2'], d['SOURCES']
+ assert str(d['SOURCE']) == 's1', d['SOURCE']
+
+ class V(object):
+ # Fake Value node with no rfile() method.
+ def __init__(self, name):
+ self.name = name
+ def __str__(self):
+ return 'v-'+self.name
+ def get_subst_proxy(self):
+ return self
+
+ class N(V):
+ def rfile(self):
+ return self.__class__('rstr-' + self.name)
+
+ t3 = N('t3')
+ t4 = DummyNode('t4')
+ t5 = V('t5')
+ s3 = DummyNode('s3')
+ s4 = N('s4')
+ s5 = V('s5')
+ d = subst_dict(target=[t3, t4, t5], source=[s3, s4, s5])
+ TARGETS = sorted([str(x) for x in d['TARGETS']])
+ assert TARGETS == ['t4', 'v-t3', 'v-t5'], TARGETS
+ SOURCES = sorted([str(x) for x in d['SOURCES']])
+ assert SOURCES == ['s3', 'v-rstr-s4', 'v-s5'], SOURCES
+
+if __name__ == "__main__":
+ suite = unittest.TestSuite()
+ tclasses = [
+ CLVar_TestCase,
+ LiteralTestCase,
+ SpecialAttrWrapperTestCase,
+ quote_spaces_TestCase,
+ scons_subst_TestCase,
+ scons_subst_list_TestCase,
+ scons_subst_once_TestCase,
+ subst_dict_TestCase,
+ ]
+ for tclass in tclasses:
+ names = unittest.getTestCaseNames(tclass, 'test_')
+ suite.addTests(list(map(tclass, names)))
+ TestUnit.run(suite)
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Taskmaster.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Taskmaster.py
new file mode 100644
index 0000000..17507a6
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Taskmaster.py
@@ -0,0 +1,1071 @@
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+from __future__ import print_function
+
+import sys
+
+__doc__ = """
+ Generic Taskmaster module for the SCons build engine.
+ =====================================================
+
+ This module contains the primary interface(s) between a wrapping user
+ interface and the SCons build engine. There are two key classes here:
+
+ Taskmaster
+ ----------
+ This is the main engine for walking the dependency graph and
+ calling things to decide what does or doesn't need to be built.
+
+ Task
+ ----
+ This is the base class for allowing a wrapping interface to
+ decide what does or doesn't actually need to be done. The
+ intention is for a wrapping interface to subclass this as
+ appropriate for different types of behavior it may need.
+
+ The canonical example is the SCons native Python interface,
+ which has Task subclasses that handle its specific behavior,
+ like printing "'foo' is up to date" when a top-level target
+ doesn't need to be built, and handling the -c option by removing
+ targets as its "build" action. There is also a separate subclass
+ for suppressing this output when the -q option is used.
+
+ The Taskmaster instantiates a Task object for each (set of)
+ target(s) that it decides need to be evaluated and/or built.
+"""
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+from itertools import chain
+import operator
+import sys
+import traceback
+
+import SCons.Errors
+import SCons.Node
+import SCons.Warnings
+
+StateString = SCons.Node.StateString
+NODE_NO_STATE = SCons.Node.no_state
+NODE_PENDING = SCons.Node.pending
+NODE_EXECUTING = SCons.Node.executing
+NODE_UP_TO_DATE = SCons.Node.up_to_date
+NODE_EXECUTED = SCons.Node.executed
+NODE_FAILED = SCons.Node.failed
+
+print_prepare = 0 # set by option --debug=prepare
+
+# A subsystem for recording stats about how different Nodes are handled by
+# the main Taskmaster loop. There's no external control here (no need for
+# a --debug= option); enable it by changing the value of CollectStats.
+
+CollectStats = None
+
+class Stats(object):
+ """
+ A simple class for holding statistics about the disposition of a
+ Node by the Taskmaster. If we're collecting statistics, each Node
+ processed by the Taskmaster gets one of these attached, in which case
+ the Taskmaster records its decision each time it processes the Node.
+ (Ideally, that's just once per Node.)
+ """
+ def __init__(self):
+ """
+ Instantiates a Taskmaster.Stats object, initializing all
+ appropriate counters to zero.
+ """
+ self.considered = 0
+ self.already_handled = 0
+ self.problem = 0
+ self.child_failed = 0
+ self.not_built = 0
+ self.side_effects = 0
+ self.build = 0
+
+StatsNodes = []
+
+fmt = "%(considered)3d "\
+ "%(already_handled)3d " \
+ "%(problem)3d " \
+ "%(child_failed)3d " \
+ "%(not_built)3d " \
+ "%(side_effects)3d " \
+ "%(build)3d "
+
+def dump_stats():
+ for n in sorted(StatsNodes, key=lambda a: str(a)):
+ print((fmt % n.attributes.stats.__dict__) + str(n))
+
+
+
+class Task(object):
+ """
+ Default SCons build engine task.
+
+ This controls the interaction of the actual building of node
+ and the rest of the engine.
+
+ This is expected to handle all of the normally-customizable
+ aspects of controlling a build, so any given application
+ *should* be able to do what it wants by sub-classing this
+ class and overriding methods as appropriate. If an application
+ needs to customize something by sub-classing Taskmaster (or
+ some other build engine class), we should first try to migrate
+ that functionality into this class.
+
+ Note that it's generally a good idea for sub-classes to call
+ these methods explicitly to update state, etc., rather than
+ roll their own interaction with Taskmaster from scratch.
+ """
+ def __init__(self, tm, targets, top, node):
+ self.tm = tm
+ self.targets = targets
+ self.top = top
+ self.node = node
+ self.exc_clear()
+
+ def trace_message(self, method, node, description='node'):
+ fmt = '%-20s %s %s\n'
+ return fmt % (method + ':', description, self.tm.trace_node(node))
+
+ def display(self, message):
+ """
+ Hook to allow the calling interface to display a message.
+
+ This hook gets called as part of preparing a task for execution
+ (that is, a Node to be built). As part of figuring out what Node
+ should be built next, the actual target list may be altered,
+ along with a message describing the alteration. The calling
+ interface can subclass Task and provide a concrete implementation
+ of this method to see those messages.
+ """
+ pass
+
+ def prepare(self):
+ """
+ Called just before the task is executed.
+
+ This is mainly intended to give the target Nodes a chance to
+ unlink underlying files and make all necessary directories before
+ the Action is actually called to build the targets.
+ """
+ global print_prepare
+ T = self.tm.trace
+ if T: T.write(self.trace_message(u'Task.prepare()', self.node))
+
+ # Now that it's the appropriate time, give the TaskMaster a
+ # chance to raise any exceptions it encountered while preparing
+ # this task.
+ self.exception_raise()
+
+ if self.tm.message:
+ self.display(self.tm.message)
+ self.tm.message = None
+
+ # Let the targets take care of any necessary preparations.
+ # This includes verifying that all of the necessary sources
+ # and dependencies exist, removing the target file(s), etc.
+ #
+ # As of April 2008, the get_executor().prepare() method makes
+ # sure that all of the aggregate sources necessary to build this
+ # Task's target(s) exist in one up-front check. The individual
+ # target t.prepare() methods check that each target's explicit
+ # or implicit dependencies exists, and also initialize the
+ # .sconsign info.
+ executor = self.targets[0].get_executor()
+ if executor is None:
+ return
+ executor.prepare()
+ for t in executor.get_action_targets():
+ if print_prepare:
+ print("Preparing target %s..."%t)
+ for s in t.side_effects:
+ print("...with side-effect %s..."%s)
+ t.prepare()
+ for s in t.side_effects:
+ if print_prepare:
+ print("...Preparing side-effect %s..."%s)
+ s.prepare()
+
+ def get_target(self):
+ """Fetch the target being built or updated by this task.
+ """
+ return self.node
+
+ def needs_execute(self):
+ # TODO(deprecate): "return True" is the old default behavior;
+ # change it to NotImplementedError (after running through the
+ # Deprecation Cycle) so the desired behavior is explicitly
+ # determined by which concrete subclass is used.
+ #raise NotImplementedError
+ msg = ('Taskmaster.Task is an abstract base class; instead of\n'
+ '\tusing it directly, '
+ 'derive from it and override the abstract methods.')
+ SCons.Warnings.warn(SCons.Warnings.TaskmasterNeedsExecuteWarning, msg)
+ return True
+
+ def execute(self):
+ """
+ Called to execute the task.
+
+ This method is called from multiple threads in a parallel build,
+ so only do thread safe stuff here. Do thread unsafe stuff in
+ prepare(), executed() or failed().
+ """
+ T = self.tm.trace
+ if T: T.write(self.trace_message(u'Task.execute()', self.node))
+
+ try:
+ cached_targets = []
+ for t in self.targets:
+ if not t.retrieve_from_cache():
+ break
+ cached_targets.append(t)
+ if len(cached_targets) < len(self.targets):
+ # Remove targets before building. It's possible that we
+ # partially retrieved targets from the cache, leaving
+ # them in read-only mode. That might cause the command
+ # to fail.
+ #
+ for t in cached_targets:
+ try:
+ t.fs.unlink(t.get_internal_path())
+ except (IOError, OSError):
+ pass
+ self.targets[0].build()
+ else:
+ for t in cached_targets:
+ t.cached = 1
+ except SystemExit:
+ exc_value = sys.exc_info()[1]
+ raise SCons.Errors.ExplicitExit(self.targets[0], exc_value.code)
+ except SCons.Errors.UserError:
+ raise
+ except SCons.Errors.BuildError:
+ raise
+ except Exception as e:
+ buildError = SCons.Errors.convert_to_BuildError(e)
+ buildError.node = self.targets[0]
+ buildError.exc_info = sys.exc_info()
+ raise buildError
+
+ def executed_without_callbacks(self):
+ """
+ Called when the task has been successfully executed
+ and the Taskmaster instance doesn't want to call
+ the Node's callback methods.
+ """
+ T = self.tm.trace
+ if T: T.write(self.trace_message('Task.executed_without_callbacks()',
+ self.node))
+
+ for t in self.targets:
+ if t.get_state() == NODE_EXECUTING:
+ for side_effect in t.side_effects:
+ side_effect.set_state(NODE_NO_STATE)
+ t.set_state(NODE_EXECUTED)
+
+ def executed_with_callbacks(self):
+ """
+ Called when the task has been successfully executed and
+ the Taskmaster instance wants to call the Node's callback
+ methods.
+
+ This may have been a do-nothing operation (to preserve build
+ order), so we must check the node's state before deciding whether
+ it was "built", in which case we call the appropriate Node method.
+ In any event, we always call "visited()", which will handle any
+ post-visit actions that must take place regardless of whether
+ or not the target was an actual built target or a source Node.
+ """
+ global print_prepare
+ T = self.tm.trace
+ if T: T.write(self.trace_message('Task.executed_with_callbacks()',
+ self.node))
+
+ for t in self.targets:
+ if t.get_state() == NODE_EXECUTING:
+ for side_effect in t.side_effects:
+ side_effect.set_state(NODE_NO_STATE)
+ t.set_state(NODE_EXECUTED)
+ if not t.cached:
+ t.push_to_cache()
+ t.built()
+ t.visited()
+ if (not print_prepare and
+ (not hasattr(self, 'options') or not self.options.debug_includes)):
+ t.release_target_info()
+ else:
+ t.visited()
+
+ executed = executed_with_callbacks
+
+ def failed(self):
+ """
+ Default action when a task fails: stop the build.
+
+ Note: Although this function is normally invoked on nodes in
+ the executing state, it might also be invoked on up-to-date
+ nodes when using Configure().
+ """
+ self.fail_stop()
+
+ def fail_stop(self):
+ """
+ Explicit stop-the-build failure.
+
+ This sets failure status on the target nodes and all of
+ their dependent parent nodes.
+
+ Note: Although this function is normally invoked on nodes in
+ the executing state, it might also be invoked on up-to-date
+ nodes when using Configure().
+ """
+ T = self.tm.trace
+ if T: T.write(self.trace_message('Task.failed_stop()', self.node))
+
+ # Invoke will_not_build() to clean-up the pending children
+ # list.
+ self.tm.will_not_build(self.targets, lambda n: n.set_state(NODE_FAILED))
+
+ # Tell the taskmaster to not start any new tasks
+ self.tm.stop()
+
+ # We're stopping because of a build failure, but give the
+ # calling Task class a chance to postprocess() the top-level
+ # target under which the build failure occurred.
+ self.targets = [self.tm.current_top]
+ self.top = 1
+
+ def fail_continue(self):
+ """
+ Explicit continue-the-build failure.
+
+ This sets failure status on the target nodes and all of
+ their dependent parent nodes.
+
+ Note: Although this function is normally invoked on nodes in
+ the executing state, it might also be invoked on up-to-date
+ nodes when using Configure().
+ """
+ T = self.tm.trace
+ if T: T.write(self.trace_message('Task.failed_continue()', self.node))
+
+ self.tm.will_not_build(self.targets, lambda n: n.set_state(NODE_FAILED))
+
+ def make_ready_all(self):
+ """
+ Marks all targets in a task ready for execution.
+
+ This is used when the interface needs every target Node to be
+ visited--the canonical example being the "scons -c" option.
+ """
+ T = self.tm.trace
+ if T: T.write(self.trace_message('Task.make_ready_all()', self.node))
+
+ self.out_of_date = self.targets[:]
+ for t in self.targets:
+ t.disambiguate().set_state(NODE_EXECUTING)
+ for s in t.side_effects:
+ # add disambiguate here to mirror the call on targets above
+ s.disambiguate().set_state(NODE_EXECUTING)
+
+ def make_ready_current(self):
+ """
+ Marks all targets in a task ready for execution if any target
+ is not current.
+
+ This is the default behavior for building only what's necessary.
+ """
+ global print_prepare
+ T = self.tm.trace
+ if T: T.write(self.trace_message(u'Task.make_ready_current()',
+ self.node))
+
+ self.out_of_date = []
+ needs_executing = False
+ for t in self.targets:
+ try:
+ t.disambiguate().make_ready()
+ is_up_to_date = not t.has_builder() or \
+ (not t.always_build and t.is_up_to_date())
+ except EnvironmentError as e:
+ raise SCons.Errors.BuildError(node=t, errstr=e.strerror, filename=e.filename)
+
+ if not is_up_to_date:
+ self.out_of_date.append(t)
+ needs_executing = True
+
+ if needs_executing:
+ for t in self.targets:
+ t.set_state(NODE_EXECUTING)
+ for s in t.side_effects:
+ # add disambiguate here to mirror the call on targets in first loop above
+ s.disambiguate().set_state(NODE_EXECUTING)
+ else:
+ for t in self.targets:
+ # We must invoke visited() to ensure that the node
+ # information has been computed before allowing the
+ # parent nodes to execute. (That could occur in a
+ # parallel build...)
+ t.visited()
+ t.set_state(NODE_UP_TO_DATE)
+ if (not print_prepare and
+ (not hasattr(self, 'options') or not self.options.debug_includes)):
+ t.release_target_info()
+
+ make_ready = make_ready_current
+
+ def postprocess(self):
+ """
+ Post-processes a task after it's been executed.
+
+ This examines all the targets just built (or not, we don't care
+ if the build was successful, or even if there was no build
+ because everything was up-to-date) to see if they have any
+ waiting parent Nodes, or Nodes waiting on a common side effect,
+ that can be put back on the candidates list.
+ """
+ T = self.tm.trace
+ if T: T.write(self.trace_message(u'Task.postprocess()', self.node))
+
+ # We may have built multiple targets, some of which may have
+ # common parents waiting for this build. Count up how many
+ # targets each parent was waiting for so we can subtract the
+ # values later, and so we *don't* put waiting side-effect Nodes
+ # back on the candidates list if the Node is also a waiting
+ # parent.
+
+ targets = set(self.targets)
+
+ pending_children = self.tm.pending_children
+ parents = {}
+ for t in targets:
+ # A node can only be in the pending_children set if it has
+ # some waiting_parents.
+ if t.waiting_parents:
+ if T: T.write(self.trace_message(u'Task.postprocess()',
+ t,
+ 'removing'))
+ pending_children.discard(t)
+ for p in t.waiting_parents:
+ parents[p] = parents.get(p, 0) + 1
+
+ for t in targets:
+ if t.side_effects is not None:
+ for s in t.side_effects:
+ if s.get_state() == NODE_EXECUTING:
+ s.set_state(NODE_NO_STATE)
+ for p in s.waiting_parents:
+ parents[p] = parents.get(p, 0) + 1
+ for p in s.waiting_s_e:
+ if p.ref_count == 0:
+ self.tm.candidates.append(p)
+
+ for p, subtract in parents.items():
+ p.ref_count = p.ref_count - subtract
+ if T: T.write(self.trace_message(u'Task.postprocess()',
+ p,
+ 'adjusted parent ref count'))
+ if p.ref_count == 0:
+ self.tm.candidates.append(p)
+
+ for t in targets:
+ t.postprocess()
+
+ # Exception handling subsystem.
+ #
+ # Exceptions that occur while walking the DAG or examining Nodes
+ # must be raised, but must be raised at an appropriate time and in
+ # a controlled manner so we can, if necessary, recover gracefully,
+ # possibly write out signature information for Nodes we've updated,
+ # etc. This is done by having the Taskmaster tell us about the
+ # exception, and letting
+
+ def exc_info(self):
+ """
+ Returns info about a recorded exception.
+ """
+ return self.exception
+
+ def exc_clear(self):
+ """
+ Clears any recorded exception.
+
+ This also changes the "exception_raise" attribute to point
+ to the appropriate do-nothing method.
+ """
+ self.exception = (None, None, None)
+ self.exception_raise = self._no_exception_to_raise
+
+ def exception_set(self, exception=None):
+ """
+ Records an exception to be raised at the appropriate time.
+
+ This also changes the "exception_raise" attribute to point
+ to the method that will, in fact
+ """
+ if not exception:
+ exception = sys.exc_info()
+ self.exception = exception
+ self.exception_raise = self._exception_raise
+
+ def _no_exception_to_raise(self):
+ pass
+
+ def _exception_raise(self):
+ """
+ Raises a pending exception that was recorded while getting a
+ Task ready for execution.
+ """
+ exc = self.exc_info()[:]
+ try:
+ exc_type, exc_value, exc_traceback = exc
+ except ValueError:
+ exc_type, exc_value = exc
+ exc_traceback = None
+
+ # raise exc_type(exc_value).with_traceback(exc_traceback)
+ if sys.version_info[0] == 2:
+ exec("raise exc_type, exc_value, exc_traceback")
+ else: # sys.version_info[0] == 3:
+ if isinstance(exc_value, Exception): #hasattr(exc_value, 'with_traceback'):
+ # If exc_value is an exception, then just reraise
+ exec("raise exc_value.with_traceback(exc_traceback)")
+ else:
+ # else we'll create an exception using the value and raise that
+ exec("raise exc_type(exc_value).with_traceback(exc_traceback)")
+
+
+ # raise e.__class__, e.__class__(e), sys.exc_info()[2]
+ # exec("raise exc_type(exc_value).with_traceback(exc_traceback)")
+
+
+
+class AlwaysTask(Task):
+ def needs_execute(self):
+ """
+ Always returns True (indicating this Task should always
+ be executed).
+
+ Subclasses that need this behavior (as opposed to the default
+ of only executing Nodes that are out of date w.r.t. their
+ dependencies) can use this as follows:
+
+ class MyTaskSubclass(SCons.Taskmaster.Task):
+ needs_execute = SCons.Taskmaster.Task.execute_always
+ """
+ return True
+
+class OutOfDateTask(Task):
+ def needs_execute(self):
+ """
+ Returns True (indicating this Task should be executed) if this
+ Task's target state indicates it needs executing, which has
+ already been determined by an earlier up-to-date check.
+ """
+ return self.targets[0].get_state() == SCons.Node.executing
+
+
+def find_cycle(stack, visited):
+ if stack[-1] in visited:
+ return None
+ visited.add(stack[-1])
+ for n in stack[-1].waiting_parents:
+ stack.append(n)
+ if stack[0] == stack[-1]:
+ return stack
+ if find_cycle(stack, visited):
+ return stack
+ stack.pop()
+ return None
+
+
+class Taskmaster(object):
+ """
+ The Taskmaster for walking the dependency DAG.
+ """
+
+ def __init__(self, targets=[], tasker=None, order=None, trace=None):
+ self.original_top = targets
+ self.top_targets_left = targets[:]
+ self.top_targets_left.reverse()
+ self.candidates = []
+ if tasker is None:
+ tasker = OutOfDateTask
+ self.tasker = tasker
+ if not order:
+ order = lambda l: l
+ self.order = order
+ self.message = None
+ self.trace = trace
+ self.next_candidate = self.find_next_candidate
+ self.pending_children = set()
+
+ def find_next_candidate(self):
+ """
+ Returns the next candidate Node for (potential) evaluation.
+
+ The candidate list (really a stack) initially consists of all of
+ the top-level (command line) targets provided when the Taskmaster
+ was initialized. While we walk the DAG, visiting Nodes, all the
+ children that haven't finished processing get pushed on to the
+ candidate list. Each child can then be popped and examined in
+ turn for whether *their* children are all up-to-date, in which
+ case a Task will be created for their actual evaluation and
+ potential building.
+
+ Here is where we also allow candidate Nodes to alter the list of
+ Nodes that should be examined. This is used, for example, when
+ invoking SCons in a source directory. A source directory Node can
+ return its corresponding build directory Node, essentially saying,
+ "Hey, you really need to build this thing over here instead."
+ """
+ try:
+ return self.candidates.pop()
+ except IndexError:
+ pass
+ try:
+ node = self.top_targets_left.pop()
+ except IndexError:
+ return None
+ self.current_top = node
+ alt, message = node.alter_targets()
+ if alt:
+ self.message = message
+ self.candidates.append(node)
+ self.candidates.extend(self.order(alt))
+ node = self.candidates.pop()
+ return node
+
+ def no_next_candidate(self):
+ """
+ Stops Taskmaster processing by not returning a next candidate.
+
+ Note that we have to clean-up the Taskmaster candidate list
+ because the cycle detection depends on the fact all nodes have
+ been processed somehow.
+ """
+ while self.candidates:
+ candidates = self.candidates
+ self.candidates = []
+ self.will_not_build(candidates)
+ return None
+
+ def _validate_pending_children(self):
+ """
+ Validate the content of the pending_children set. Assert if an
+ internal error is found.
+
+ This function is used strictly for debugging the taskmaster by
+ checking that no invariants are violated. It is not used in
+ normal operation.
+
+ The pending_children set is used to detect cycles in the
+ dependency graph. We call a "pending child" a child that is
+ found in the "pending" state when checking the dependencies of
+ its parent node.
+
+ A pending child can occur when the Taskmaster completes a loop
+ through a cycle. For example, let's imagine a graph made of
+ three nodes (A, B and C) making a cycle. The evaluation starts
+ at node A. The Taskmaster first considers whether node A's
+ child B is up-to-date. Then, recursively, node B needs to
+ check whether node C is up-to-date. This leaves us with a
+ dependency graph looking like::
+
+ Next candidate \
+ \
+ Node A (Pending) --> Node B(Pending) --> Node C (NoState)
+ ^ |
+ | |
+ +-------------------------------------+
+
+ Now, when the Taskmaster examines the Node C's child Node A,
+ it finds that Node A is in the "pending" state. Therefore,
+ Node A is a pending child of node C.
+
+ Pending children indicate that the Taskmaster has potentially
+ loop back through a cycle. We say potentially because it could
+ also occur when a DAG is evaluated in parallel. For example,
+ consider the following graph::
+
+ Node A (Pending) --> Node B(Pending) --> Node C (Pending) --> ...
+ | ^
+ | |
+ +----------> Node D (NoState) --------+
+ /
+ Next candidate /
+
+ The Taskmaster first evaluates the nodes A, B, and C and
+ starts building some children of node C. Assuming, that the
+ maximum parallel level has not been reached, the Taskmaster
+ will examine Node D. It will find that Node C is a pending
+ child of Node D.
+
+ In summary, evaluating a graph with a cycle will always
+ involve a pending child at one point. A pending child might
+ indicate either a cycle or a diamond-shaped DAG. Only a
+ fraction of the nodes ends-up being a "pending child" of
+ another node. This keeps the pending_children set small in
+ practice.
+
+ We can differentiate between the two cases if we wait until
+ the end of the build. At this point, all the pending children
+ nodes due to a diamond-shaped DAG will have been properly
+ built (or will have failed to build). But, the pending
+ children involved in a cycle will still be in the pending
+ state.
+
+ The taskmaster removes nodes from the pending_children set as
+ soon as a pending_children node moves out of the pending
+ state. This also helps to keep the pending_children set small.
+ """
+
+ for n in self.pending_children:
+ assert n.state in (NODE_PENDING, NODE_EXECUTING), \
+ (str(n), StateString[n.state])
+ assert len(n.waiting_parents) != 0, (str(n), len(n.waiting_parents))
+ for p in n.waiting_parents:
+ assert p.ref_count > 0, (str(n), str(p), p.ref_count)
+
+
+ def trace_message(self, message):
+ return 'Taskmaster: %s\n' % message
+
+ def trace_node(self, node):
+ return '<%-10s %-3s %s>' % (StateString[node.get_state()],
+ node.ref_count,
+ repr(str(node)))
+
+ def _find_next_ready_node(self):
+ """
+ Finds the next node that is ready to be built.
+
+ This is *the* main guts of the DAG walk. We loop through the
+ list of candidates, looking for something that has no un-built
+ children (i.e., that is a leaf Node or has dependencies that are
+ all leaf Nodes or up-to-date). Candidate Nodes are re-scanned
+ (both the target Node itself and its sources, which are always
+ scanned in the context of a given target) to discover implicit
+ dependencies. A Node that must wait for some children to be
+ built will be put back on the candidates list after the children
+ have finished building. A Node that has been put back on the
+ candidates list in this way may have itself (or its sources)
+ re-scanned, in order to handle generated header files (e.g.) and
+ the implicit dependencies therein.
+
+ Note that this method does not do any signature calculation or
+ up-to-date check itself. All of that is handled by the Task
+ class. This is purely concerned with the dependency graph walk.
+ """
+
+ self.ready_exc = None
+
+ T = self.trace
+ if T: T.write(SCons.Util.UnicodeType('\n') + self.trace_message('Looking for a node to evaluate'))
+
+ while True:
+ node = self.next_candidate()
+ if node is None:
+ if T: T.write(self.trace_message('No candidate anymore.') + u'\n')
+ return None
+
+ node = node.disambiguate()
+ state = node.get_state()
+
+ # For debugging only:
+ #
+ # try:
+ # self._validate_pending_children()
+ # except:
+ # self.ready_exc = sys.exc_info()
+ # return node
+
+ if CollectStats:
+ if not hasattr(node.attributes, 'stats'):
+ node.attributes.stats = Stats()
+ StatsNodes.append(node)
+ S = node.attributes.stats
+ S.considered = S.considered + 1
+ else:
+ S = None
+
+ if T: T.write(self.trace_message(u' Considering node %s and its children:' % self.trace_node(node)))
+
+ if state == NODE_NO_STATE:
+ # Mark this node as being on the execution stack:
+ node.set_state(NODE_PENDING)
+ elif state > NODE_PENDING:
+ # Skip this node if it has already been evaluated:
+ if S: S.already_handled = S.already_handled + 1
+ if T: T.write(self.trace_message(u' already handled (executed)'))
+ continue
+
+ executor = node.get_executor()
+
+ try:
+ children = executor.get_all_children()
+ except SystemExit:
+ exc_value = sys.exc_info()[1]
+ e = SCons.Errors.ExplicitExit(node, exc_value.code)
+ self.ready_exc = (SCons.Errors.ExplicitExit, e)
+ if T: T.write(self.trace_message(' SystemExit'))
+ return node
+ except Exception as e:
+ # We had a problem just trying to figure out the
+ # children (like a child couldn't be linked in to a
+ # VariantDir, or a Scanner threw something). Arrange to
+ # raise the exception when the Task is "executed."
+ self.ready_exc = sys.exc_info()
+ if S: S.problem = S.problem + 1
+ if T: T.write(self.trace_message(' exception %s while scanning children.\n' % e))
+ return node
+
+ children_not_visited = []
+ children_pending = set()
+ children_not_ready = []
+ children_failed = False
+
+ for child in chain(executor.get_all_prerequisites(), children):
+ childstate = child.get_state()
+
+ if T: T.write(self.trace_message(u' ' + self.trace_node(child)))
+
+ if childstate == NODE_NO_STATE:
+ children_not_visited.append(child)
+ elif childstate == NODE_PENDING:
+ children_pending.add(child)
+ elif childstate == NODE_FAILED:
+ children_failed = True
+
+ if childstate <= NODE_EXECUTING:
+ children_not_ready.append(child)
+
+ # These nodes have not even been visited yet. Add
+ # them to the list so that on some next pass we can
+ # take a stab at evaluating them (or their children).
+ children_not_visited.reverse()
+ self.candidates.extend(self.order(children_not_visited))
+
+ # if T and children_not_visited:
+ # T.write(self.trace_message(' adding to candidates: %s' % map(str, children_not_visited)))
+ # T.write(self.trace_message(' candidates now: %s\n' % map(str, self.candidates)))
+
+ # Skip this node if any of its children have failed.
+ #
+ # This catches the case where we're descending a top-level
+ # target and one of our children failed while trying to be
+ # built by a *previous* descent of an earlier top-level
+ # target.
+ #
+ # It can also occur if a node is reused in multiple
+ # targets. One first descends though the one of the
+ # target, the next time occurs through the other target.
+ #
+ # Note that we can only have failed_children if the
+ # --keep-going flag was used, because without it the build
+ # will stop before diving in the other branch.
+ #
+ # Note that even if one of the children fails, we still
+ # added the other children to the list of candidate nodes
+ # to keep on building (--keep-going).
+ if children_failed:
+ for n in executor.get_action_targets():
+ n.set_state(NODE_FAILED)
+
+ if S: S.child_failed = S.child_failed + 1
+ if T: T.write(self.trace_message('****** %s\n' % self.trace_node(node)))
+ continue
+
+ if children_not_ready:
+ for child in children_not_ready:
+ # We're waiting on one or more derived targets
+ # that have not yet finished building.
+ if S: S.not_built = S.not_built + 1
+
+ # Add this node to the waiting parents lists of
+ # anything we're waiting on, with a reference
+ # count so we can be put back on the list for
+ # re-evaluation when they've all finished.
+ node.ref_count = node.ref_count + child.add_to_waiting_parents(node)
+ if T: T.write(self.trace_message(u' adjusted ref count: %s, child %s' %
+ (self.trace_node(node), repr(str(child)))))
+
+ if T:
+ for pc in children_pending:
+ T.write(self.trace_message(' adding %s to the pending children set\n' %
+ self.trace_node(pc)))
+ self.pending_children = self.pending_children | children_pending
+
+ continue
+
+ # Skip this node if it has side-effects that are
+ # currently being built:
+ wait_side_effects = False
+ for se in executor.get_action_side_effects():
+ if se.get_state() == NODE_EXECUTING:
+ se.add_to_waiting_s_e(node)
+ wait_side_effects = True
+
+ if wait_side_effects:
+ if S: S.side_effects = S.side_effects + 1
+ continue
+
+ # The default when we've gotten through all of the checks above:
+ # this node is ready to be built.
+ if S: S.build = S.build + 1
+ if T: T.write(self.trace_message(u'Evaluating %s\n' %
+ self.trace_node(node)))
+
+ # For debugging only:
+ #
+ # try:
+ # self._validate_pending_children()
+ # except:
+ # self.ready_exc = sys.exc_info()
+ # return node
+
+ return node
+
+ return None
+
+ def next_task(self):
+ """
+ Returns the next task to be executed.
+
+ This simply asks for the next Node to be evaluated, and then wraps
+ it in the specific Task subclass with which we were initialized.
+ """
+ node = self._find_next_ready_node()
+
+ if node is None:
+ return None
+
+ executor = node.get_executor()
+ if executor is None:
+ return None
+
+ tlist = executor.get_all_targets()
+
+ task = self.tasker(self, tlist, node in self.original_top, node)
+ try:
+ task.make_ready()
+ except Exception as e :
+ # We had a problem just trying to get this task ready (like
+ # a child couldn't be linked to a VariantDir when deciding
+ # whether this node is current). Arrange to raise the
+ # exception when the Task is "executed."
+ self.ready_exc = sys.exc_info()
+
+ if self.ready_exc:
+ task.exception_set(self.ready_exc)
+
+ self.ready_exc = None
+
+ return task
+
+ def will_not_build(self, nodes, node_func=lambda n: None):
+ """
+ Perform clean-up about nodes that will never be built. Invokes
+ a user defined function on all of these nodes (including all
+ of their parents).
+ """
+
+ T = self.trace
+
+ pending_children = self.pending_children
+
+ to_visit = set(nodes)
+ pending_children = pending_children - to_visit
+
+ if T:
+ for n in nodes:
+ T.write(self.trace_message(' removing node %s from the pending children set\n' %
+ self.trace_node(n)))
+ try:
+ while len(to_visit):
+ node = to_visit.pop()
+ node_func(node)
+
+ # Prune recursion by flushing the waiting children
+ # list immediately.
+ parents = node.waiting_parents
+ node.waiting_parents = set()
+
+ to_visit = to_visit | parents
+ pending_children = pending_children - parents
+
+ for p in parents:
+ p.ref_count = p.ref_count - 1
+ if T: T.write(self.trace_message(' removing parent %s from the pending children set\n' %
+ self.trace_node(p)))
+ except KeyError:
+ # The container to_visit has been emptied.
+ pass
+
+ # We have the stick back the pending_children list into the
+ # taskmaster because the python 1.5.2 compatibility does not
+ # allow us to use in-place updates
+ self.pending_children = pending_children
+
+ def stop(self):
+ """
+ Stops the current build completely.
+ """
+ self.next_candidate = self.no_next_candidate
+
+ def cleanup(self):
+ """
+ Check for dependency cycles.
+ """
+ if not self.pending_children:
+ return
+
+ nclist = [(n, find_cycle([n], set())) for n in self.pending_children]
+
+ genuine_cycles = [
+ node for node,cycle in nclist
+ if cycle or node.get_state() != NODE_EXECUTED
+ ]
+ if not genuine_cycles:
+ # All of the "cycles" found were single nodes in EXECUTED state,
+ # which is to say, they really weren't cycles. Just return.
+ return
+
+ desc = 'Found dependency cycle(s):\n'
+ for node, cycle in nclist:
+ if cycle:
+ desc = desc + " " + " -> ".join(map(str, cycle)) + "\n"
+ else:
+ desc = desc + \
+ " Internal Error: no cycle found for node %s (%s) in state %s\n" % \
+ (node, repr(node), StateString[node.get_state()])
+
+ raise SCons.Errors.UserError(desc)
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/TaskmasterTests.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/TaskmasterTests.py
new file mode 100644
index 0000000..d237d60
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/TaskmasterTests.py
@@ -0,0 +1,1249 @@
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+from __future__ import division
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import SCons.compat
+
+import copy
+import sys
+import unittest
+
+import TestUnit
+
+import SCons.Taskmaster
+import SCons.Errors
+
+
+built_text = None
+cache_text = []
+visited_nodes = []
+executed = None
+scan_called = 0
+
+class Node(object):
+ def __init__(self, name, kids = [], scans = []):
+ self.name = name
+ self.kids = kids
+ self.scans = scans
+ self.cached = 0
+ self.scanned = 0
+ self.scanner = None
+ self.targets = [self]
+ self.prerequisites = None
+ class Builder(object):
+ def targets(self, node):
+ return node.targets
+ self.builder = Builder()
+ self.bsig = None
+ self.csig = None
+ self.state = SCons.Node.no_state
+ self.prepared = None
+ self.ref_count = 0
+ self.waiting_parents = set()
+ self.waiting_s_e = set()
+ self.side_effect = 0
+ self.side_effects = []
+ self.alttargets = []
+ self.postprocessed = None
+ self._bsig_val = None
+ self._current_val = 0
+ self.always_build = None
+
+ def disambiguate(self):
+ return self
+
+ def push_to_cache(self):
+ pass
+
+ def retrieve_from_cache(self):
+ global cache_text
+ if self.cached:
+ cache_text.append(self.name + " retrieved")
+ return self.cached
+
+ def make_ready(self):
+ pass
+
+ def prepare(self):
+ self.prepared = 1
+ self.get_binfo()
+
+ def build(self):
+ global built_text
+ built_text = self.name + " built"
+
+ def remove(self):
+ pass
+
+ # The following four methods new_binfo(), del_binfo(),
+ # get_binfo(), clear() as well as its calls have been added
+ # to support the cached_execute() test (issue #2720).
+ # They are full copies (or snippets) of their actual
+ # counterparts in the Node class...
+ def new_binfo(self):
+ binfo = "binfo"
+ return binfo
+
+ def del_binfo(self):
+ """Delete the build info from this node."""
+ try:
+ delattr(self, 'binfo')
+ except AttributeError:
+ pass
+
+ def get_binfo(self):
+ """Fetch a node's build information."""
+ try:
+ return self.binfo
+ except AttributeError:
+ pass
+
+ binfo = self.new_binfo()
+ self.binfo = binfo
+
+ return binfo
+
+ def clear(self):
+ # The del_binfo() call here isn't necessary for normal execution,
+ # but is for interactive mode, where we might rebuild the same
+ # target and need to start from scratch.
+ self.del_binfo()
+
+ def built(self):
+ global built_text
+ if not self.cached:
+ built_text = built_text + " really"
+
+ # Clear the implicit dependency caches of any Nodes
+ # waiting for this Node to be built.
+ for parent in self.waiting_parents:
+ parent.implicit = None
+
+ self.clear()
+
+ def release_target_info(self):
+ pass
+
+ def has_builder(self):
+ return not self.builder is None
+
+ def is_derived(self):
+ return self.has_builder or self.side_effect
+
+ def alter_targets(self):
+ return self.alttargets, None
+
+ def visited(self):
+ global visited_nodes
+ visited_nodes.append(self.name)
+
+ def children(self):
+ if not self.scanned:
+ self.scan()
+ self.scanned = 1
+ return self.kids
+
+ def scan(self):
+ global scan_called
+ scan_called = scan_called + 1
+ self.kids = self.kids + self.scans
+ self.scans = []
+
+ def scanner_key(self):
+ return self.name
+
+ def add_to_waiting_parents(self, node):
+ wp = self.waiting_parents
+ if node in wp:
+ return 0
+ wp.add(node)
+ return 1
+
+ def get_state(self):
+ return self.state
+
+ def set_state(self, state):
+ self.state = state
+
+ def set_bsig(self, bsig):
+ self.bsig = bsig
+
+ def set_csig(self, csig):
+ self.csig = csig
+
+ def store_csig(self):
+ pass
+
+ def store_bsig(self):
+ pass
+
+ def is_pseudo_derived(self):
+ pass
+
+ def is_up_to_date(self):
+ return self._current_val
+
+ def depends_on(self, nodes):
+ for node in nodes:
+ if node in self.kids:
+ return 1
+ return 0
+
+ def __str__(self):
+ return self.name
+
+ def postprocess(self):
+ self.postprocessed = 1
+ self.waiting_parents = set()
+
+ def get_executor(self):
+ if not hasattr(self, 'executor'):
+ class Executor(object):
+ def prepare(self):
+ pass
+ def get_action_targets(self):
+ return self.targets
+ def get_all_targets(self):
+ return self.targets
+ def get_all_children(self):
+ result = []
+ for node in self.targets:
+ result.extend(node.children())
+ return result
+ def get_all_prerequisites(self):
+ return []
+ def get_action_side_effects(self):
+ return []
+ self.executor = Executor()
+ self.executor.targets = self.targets
+ return self.executor
+
+class OtherError(Exception):
+ pass
+
+class MyException(Exception):
+ pass
+
+
+class TaskmasterTestCase(unittest.TestCase):
+
+ def test_next_task(self):
+ """Test fetching the next task
+ """
+ global built_text
+
+ n1 = Node("n1")
+ tm = SCons.Taskmaster.Taskmaster([n1, n1])
+ t = tm.next_task()
+ t.prepare()
+ t.execute()
+ t = tm.next_task()
+ assert t is None
+
+ n1 = Node("n1")
+ n2 = Node("n2")
+ n3 = Node("n3", [n1, n2])
+
+ tm = SCons.Taskmaster.Taskmaster([n3])
+
+ t = tm.next_task()
+ t.prepare()
+ t.execute()
+ assert built_text == "n1 built", built_text
+ t.executed()
+ t.postprocess()
+
+ t = tm.next_task()
+ t.prepare()
+ t.execute()
+ assert built_text == "n2 built", built_text
+ t.executed()
+ t.postprocess()
+
+ t = tm.next_task()
+ t.prepare()
+ t.execute()
+ assert built_text == "n3 built", built_text
+ t.executed()
+ t.postprocess()
+
+ assert tm.next_task() is None
+
+ built_text = "up to date: "
+ top_node = n3
+
+ class MyTask(SCons.Taskmaster.Task):
+ def execute(self):
+ global built_text
+ if self.targets[0].get_state() == SCons.Node.up_to_date:
+ if self.top:
+ built_text = self.targets[0].name + " up-to-date top"
+ else:
+ built_text = self.targets[0].name + " up-to-date"
+ else:
+ self.targets[0].build()
+
+ n1.set_state(SCons.Node.no_state)
+ n1._current_val = 1
+ n2.set_state(SCons.Node.no_state)
+ n2._current_val = 1
+ n3.set_state(SCons.Node.no_state)
+ n3._current_val = 1
+ tm = SCons.Taskmaster.Taskmaster(targets = [n3], tasker = MyTask)
+
+ t = tm.next_task()
+ t.prepare()
+ t.execute()
+ assert built_text == "n1 up-to-date", built_text
+ t.executed()
+ t.postprocess()
+
+ t = tm.next_task()
+ t.prepare()
+ t.execute()
+ assert built_text == "n2 up-to-date", built_text
+ t.executed()
+ t.postprocess()
+
+ t = tm.next_task()
+ t.prepare()
+ t.execute()
+ assert built_text == "n3 up-to-date top", built_text
+ t.executed()
+ t.postprocess()
+
+ assert tm.next_task() is None
+
+
+ n1 = Node("n1")
+ n2 = Node("n2")
+ n3 = Node("n3", [n1, n2])
+ n4 = Node("n4")
+ n5 = Node("n5", [n3, n4])
+ tm = SCons.Taskmaster.Taskmaster([n5])
+
+ t1 = tm.next_task()
+ assert t1.get_target() == n1
+
+ t2 = tm.next_task()
+ assert t2.get_target() == n2
+
+ t4 = tm.next_task()
+ assert t4.get_target() == n4
+ t4.executed()
+ t4.postprocess()
+
+ t1.executed()
+ t1.postprocess()
+ t2.executed()
+ t2.postprocess()
+ t3 = tm.next_task()
+ assert t3.get_target() == n3
+
+ t3.executed()
+ t3.postprocess()
+ t5 = tm.next_task()
+ assert t5.get_target() == n5, t5.get_target()
+ t5.executed()
+ t5.postprocess()
+
+ assert tm.next_task() is None
+
+
+ n4 = Node("n4")
+ n4.set_state(SCons.Node.executed)
+ tm = SCons.Taskmaster.Taskmaster([n4])
+ assert tm.next_task() is None
+
+ n1 = Node("n1")
+ n2 = Node("n2", [n1])
+ tm = SCons.Taskmaster.Taskmaster([n2,n2])
+ t = tm.next_task()
+ t.executed()
+ t.postprocess()
+ t = tm.next_task()
+ assert tm.next_task() is None
+
+
+ n1 = Node("n1")
+ n2 = Node("n2")
+ n3 = Node("n3", [n1], [n2])
+ tm = SCons.Taskmaster.Taskmaster([n3])
+ t = tm.next_task()
+ target = t.get_target()
+ assert target == n1, target
+ t.executed()
+ t.postprocess()
+ t = tm.next_task()
+ target = t.get_target()
+ assert target == n2, target
+ t.executed()
+ t.postprocess()
+ t = tm.next_task()
+ target = t.get_target()
+ assert target == n3, target
+ t.executed()
+ t.postprocess()
+ assert tm.next_task() is None
+
+ n1 = Node("n1")
+ n2 = Node("n2")
+ n3 = Node("n3", [n1, n2])
+ n4 = Node("n4", [n3])
+ n5 = Node("n5", [n3])
+ global scan_called
+ scan_called = 0
+ tm = SCons.Taskmaster.Taskmaster([n4])
+ t = tm.next_task()
+ assert t.get_target() == n1
+ t.executed()
+ t.postprocess()
+ t = tm.next_task()
+ assert t.get_target() == n2
+ t.executed()
+ t.postprocess()
+ t = tm.next_task()
+ assert t.get_target() == n3
+ t.executed()
+ t.postprocess()
+ t = tm.next_task()
+ assert t.get_target() == n4
+ t.executed()
+ t.postprocess()
+ assert tm.next_task() is None
+ assert scan_called == 4, scan_called
+
+ tm = SCons.Taskmaster.Taskmaster([n5])
+ t = tm.next_task()
+ assert t.get_target() == n5, t.get_target()
+ t.executed()
+ assert tm.next_task() is None
+ assert scan_called == 5, scan_called
+
+ n1 = Node("n1")
+ n2 = Node("n2")
+ n3 = Node("n3")
+ n4 = Node("n4", [n1,n2,n3])
+ n5 = Node("n5", [n4])
+ n3.side_effect = 1
+ n1.side_effects = n2.side_effects = n3.side_effects = [n4]
+ tm = SCons.Taskmaster.Taskmaster([n1,n2,n3,n4,n5])
+ t = tm.next_task()
+ assert t.get_target() == n1
+ assert n4.state == SCons.Node.executing, n4.state
+ t.executed()
+ t.postprocess()
+ t = tm.next_task()
+ assert t.get_target() == n2
+ t.executed()
+ t.postprocess()
+ t = tm.next_task()
+ assert t.get_target() == n3
+ t.executed()
+ t.postprocess()
+ t = tm.next_task()
+ assert t.get_target() == n4
+ t.executed()
+ t.postprocess()
+ t = tm.next_task()
+ assert t.get_target() == n5
+ assert not tm.next_task()
+ t.executed()
+ t.postprocess()
+
+ n1 = Node("n1")
+ n2 = Node("n2")
+ n3 = Node("n3")
+ n4 = Node("n4", [n1,n2,n3])
+ def reverse(dependencies):
+ dependencies.reverse()
+ return dependencies
+ tm = SCons.Taskmaster.Taskmaster([n4], order=reverse)
+ t = tm.next_task()
+ assert t.get_target() == n3, t.get_target()
+ t.executed()
+ t.postprocess()
+ t = tm.next_task()
+ assert t.get_target() == n2, t.get_target()
+ t.executed()
+ t.postprocess()
+ t = tm.next_task()
+ assert t.get_target() == n1, t.get_target()
+ t.executed()
+ t.postprocess()
+ t = tm.next_task()
+ assert t.get_target() == n4, t.get_target()
+ t.executed()
+ t.postprocess()
+
+ n5 = Node("n5")
+ n6 = Node("n6")
+ n7 = Node("n7")
+ n6.alttargets = [n7]
+
+ tm = SCons.Taskmaster.Taskmaster([n5])
+ t = tm.next_task()
+ assert t.get_target() == n5
+ t.executed()
+ t.postprocess()
+
+ tm = SCons.Taskmaster.Taskmaster([n6])
+ t = tm.next_task()
+ assert t.get_target() == n7
+ t.executed()
+ t.postprocess()
+ t = tm.next_task()
+ assert t.get_target() == n6
+ t.executed()
+ t.postprocess()
+
+ n1 = Node("n1")
+ n2 = Node("n2", [n1])
+ n1.set_state(SCons.Node.failed)
+ tm = SCons.Taskmaster.Taskmaster([n2])
+ assert tm.next_task() is None
+
+ n1 = Node("n1")
+ n2 = Node("n2")
+ n1.targets = [n1, n2]
+ n1._current_val = 1
+ tm = SCons.Taskmaster.Taskmaster([n1])
+ t = tm.next_task()
+ t.executed()
+ t.postprocess()
+
+ s = n1.get_state()
+ assert s == SCons.Node.executed, s
+ s = n2.get_state()
+ assert s == SCons.Node.executed, s
+
+
+ def test_make_ready_out_of_date(self):
+ """Test the Task.make_ready() method's list of out-of-date Nodes
+ """
+ ood = []
+ def TaskGen(tm, targets, top, node, ood=ood):
+ class MyTask(SCons.Taskmaster.Task):
+ def make_ready(self):
+ SCons.Taskmaster.Task.make_ready(self)
+ self.ood.extend(self.out_of_date)
+ t = MyTask(tm, targets, top, node)
+ t.ood = ood
+ return t
+
+ n1 = Node("n1")
+ c2 = Node("c2")
+ c2._current_val = 1
+ n3 = Node("n3")
+ c4 = Node("c4")
+ c4._current_val = 1
+ a5 = Node("a5")
+ a5._current_val = 1
+ a5.always_build = 1
+ tm = SCons.Taskmaster.Taskmaster(targets = [n1, c2, n3, c4, a5],
+ tasker = TaskGen)
+
+ del ood[:]
+ t = tm.next_task()
+ assert ood == [n1], ood
+
+ del ood[:]
+ t = tm.next_task()
+ assert ood == [], ood
+
+ del ood[:]
+ t = tm.next_task()
+ assert ood == [n3], ood
+
+ del ood[:]
+ t = tm.next_task()
+ assert ood == [], ood
+
+ del ood[:]
+ t = tm.next_task()
+ assert ood == [a5], ood
+
+ def test_make_ready_exception(self):
+ """Test handling exceptions from Task.make_ready()
+ """
+ class MyTask(SCons.Taskmaster.Task):
+ def make_ready(self):
+ raise MyException("from make_ready()")
+
+ n1 = Node("n1")
+ tm = SCons.Taskmaster.Taskmaster(targets = [n1], tasker = MyTask)
+ t = tm.next_task()
+ exc_type, exc_value, exc_tb = t.exception
+ assert exc_type == MyException, repr(exc_type)
+ assert str(exc_value) == "from make_ready()", exc_value
+
+
+ def test_make_ready_all(self):
+ """Test the make_ready_all() method"""
+ class MyTask(SCons.Taskmaster.Task):
+ make_ready = SCons.Taskmaster.Task.make_ready_all
+
+ n1 = Node("n1")
+ c2 = Node("c2")
+ c2._current_val = 1
+ n3 = Node("n3")
+ c4 = Node("c4")
+ c4._current_val = 1
+
+ tm = SCons.Taskmaster.Taskmaster(targets = [n1, c2, n3, c4])
+
+ t = tm.next_task()
+ target = t.get_target()
+ assert target is n1, target
+ assert target.state == SCons.Node.executing, target.state
+ t = tm.next_task()
+ target = t.get_target()
+ assert target is c2, target
+ assert target.state == SCons.Node.up_to_date, target.state
+ t = tm.next_task()
+ target = t.get_target()
+ assert target is n3, target
+ assert target.state == SCons.Node.executing, target.state
+ t = tm.next_task()
+ target = t.get_target()
+ assert target is c4, target
+ assert target.state == SCons.Node.up_to_date, target.state
+ t = tm.next_task()
+ assert t is None
+
+ n1 = Node("n1")
+ c2 = Node("c2")
+ n3 = Node("n3")
+ c4 = Node("c4")
+
+ tm = SCons.Taskmaster.Taskmaster(targets = [n1, c2, n3, c4],
+ tasker = MyTask)
+
+ t = tm.next_task()
+ target = t.get_target()
+ assert target is n1, target
+ assert target.state == SCons.Node.executing, target.state
+ t = tm.next_task()
+ target = t.get_target()
+ assert target is c2, target
+ assert target.state == SCons.Node.executing, target.state
+ t = tm.next_task()
+ target = t.get_target()
+ assert target is n3, target
+ assert target.state == SCons.Node.executing, target.state
+ t = tm.next_task()
+ target = t.get_target()
+ assert target is c4, target
+ assert target.state == SCons.Node.executing, target.state
+ t = tm.next_task()
+ assert t is None
+
+
+ def test_children_errors(self):
+ """Test errors when fetching the children of a node.
+ """
+ class StopNode(Node):
+ def children(self):
+ raise SCons.Errors.StopError("stop!")
+ class ExitNode(Node):
+ def children(self):
+ sys.exit(77)
+
+ n1 = StopNode("n1")
+ tm = SCons.Taskmaster.Taskmaster([n1])
+ t = tm.next_task()
+ exc_type, exc_value, exc_tb = t.exception
+ assert exc_type == SCons.Errors.StopError, repr(exc_type)
+ assert str(exc_value) == "stop!", exc_value
+
+ n2 = ExitNode("n2")
+ tm = SCons.Taskmaster.Taskmaster([n2])
+ t = tm.next_task()
+ exc_type, exc_value = t.exception
+ assert exc_type == SCons.Errors.ExplicitExit, repr(exc_type)
+ assert exc_value.node == n2, exc_value.node
+ assert exc_value.status == 77, exc_value.status
+
+ def test_cycle_detection(self):
+ """Test detecting dependency cycles
+ """
+ n1 = Node("n1")
+ n2 = Node("n2", [n1])
+ n3 = Node("n3", [n2])
+ n1.kids = [n3]
+
+ tm = SCons.Taskmaster.Taskmaster([n3])
+ try:
+ t = tm.next_task()
+ except SCons.Errors.UserError as e:
+ assert str(e) == "Dependency cycle: n3 -> n1 -> n2 -> n3", str(e)
+ else:
+ assert 'Did not catch expected UserError'
+
+ def test_next_top_level_candidate(self):
+ """Test the next_top_level_candidate() method
+ """
+ n1 = Node("n1")
+ n2 = Node("n2", [n1])
+ n3 = Node("n3", [n2])
+
+ tm = SCons.Taskmaster.Taskmaster([n3])
+ t = tm.next_task()
+ assert t.targets == [n1], t.targets
+ t.fail_stop()
+ assert t.targets == [n3], list(map(str, t.targets))
+ assert t.top == 1, t.top
+
+ def test_stop(self):
+ """Test the stop() method
+
+ Both default and overridden in a subclass.
+ """
+ global built_text
+
+ n1 = Node("n1")
+ n2 = Node("n2")
+ n3 = Node("n3", [n1, n2])
+
+ tm = SCons.Taskmaster.Taskmaster([n3])
+ t = tm.next_task()
+ t.prepare()
+ t.execute()
+ assert built_text == "n1 built", built_text
+ t.executed()
+ t.postprocess()
+ assert built_text == "n1 built really", built_text
+
+ tm.stop()
+ assert tm.next_task() is None
+
+ class MyTM(SCons.Taskmaster.Taskmaster):
+ def stop(self):
+ global built_text
+ built_text = "MyTM.stop()"
+ SCons.Taskmaster.Taskmaster.stop(self)
+
+ n1 = Node("n1")
+ n2 = Node("n2")
+ n3 = Node("n3", [n1, n2])
+
+ built_text = None
+ tm = MyTM([n3])
+ tm.next_task().execute()
+ assert built_text == "n1 built"
+
+ tm.stop()
+ assert built_text == "MyTM.stop()"
+ assert tm.next_task() is None
+
+ def test_executed(self):
+ """Test when a task has been executed
+ """
+ global built_text
+ global visited_nodes
+
+ n1 = Node("n1")
+ tm = SCons.Taskmaster.Taskmaster([n1])
+ t = tm.next_task()
+ built_text = "xxx"
+ visited_nodes = []
+ n1.set_state(SCons.Node.executing)
+
+ t.executed()
+
+ s = n1.get_state()
+ assert s == SCons.Node.executed, s
+ assert built_text == "xxx really", built_text
+ assert visited_nodes == ['n1'], visited_nodes
+
+ n2 = Node("n2")
+ tm = SCons.Taskmaster.Taskmaster([n2])
+ t = tm.next_task()
+ built_text = "should_not_change"
+ visited_nodes = []
+ n2.set_state(None)
+
+ t.executed()
+
+ s = n2.get_state()
+ assert s is None, s
+ assert built_text == "should_not_change", built_text
+ assert visited_nodes == ['n2'], visited_nodes
+
+ n3 = Node("n3")
+ n4 = Node("n4")
+ n3.targets = [n3, n4]
+ tm = SCons.Taskmaster.Taskmaster([n3])
+ t = tm.next_task()
+ visited_nodes = []
+ n3.set_state(SCons.Node.up_to_date)
+ n4.set_state(SCons.Node.executing)
+
+ t.executed()
+
+ s = n3.get_state()
+ assert s == SCons.Node.up_to_date, s
+ s = n4.get_state()
+ assert s == SCons.Node.executed, s
+ assert visited_nodes == ['n3', 'n4'], visited_nodes
+
+ def test_prepare(self):
+ """Test preparation of multiple Nodes for a task
+ """
+ n1 = Node("n1")
+ n2 = Node("n2")
+ tm = SCons.Taskmaster.Taskmaster([n1, n2])
+ t = tm.next_task()
+ # This next line is moderately bogus. We're just reaching
+ # in and setting the targets for this task to an array. The
+ # "right" way to do this would be to have the next_task() call
+ # set it up by having something that approximates a real Builder
+ # return this list--but that's more work than is probably
+ # warranted right now.
+ n1.get_executor().targets = [n1, n2]
+ t.prepare()
+ assert n1.prepared
+ assert n2.prepared
+
+ n3 = Node("n3")
+ n4 = Node("n4")
+ tm = SCons.Taskmaster.Taskmaster([n3, n4])
+ t = tm.next_task()
+ # More bogus reaching in and setting the targets.
+ n3.set_state(SCons.Node.up_to_date)
+ n3.get_executor().targets = [n3, n4]
+ t.prepare()
+ assert n3.prepared
+ assert n4.prepared
+
+ # If the Node has had an exception recorded while it was getting
+ # prepared, then prepare() should raise that exception.
+ class MyException(Exception):
+ pass
+
+ built_text = None
+ n5 = Node("n5")
+ tm = SCons.Taskmaster.Taskmaster([n5])
+ t = tm.next_task()
+ t.exception_set((MyException, "exception value"))
+ exc_caught = None
+ exc_actually_caught = None
+ exc_value = None
+ try:
+ t.prepare()
+ except MyException as e:
+ exc_caught = 1
+ exc_value = e
+ except Exception as e:
+ exc_actually_caught = e
+ pass
+ assert exc_caught, "did not catch expected MyException: %s"%exc_actually_caught
+ assert str(exc_value) == "exception value", exc_value
+ assert built_text is None, built_text
+
+ # Regression test, make sure we prepare not only
+ # all targets, but their side effects as well.
+ n6 = Node("n6")
+ n7 = Node("n7")
+ n8 = Node("n8")
+ n9 = Node("n9")
+ n10 = Node("n10")
+
+ n6.side_effects = [ n8 ]
+ n7.side_effects = [ n9, n10 ]
+
+ tm = SCons.Taskmaster.Taskmaster([n6, n7])
+ t = tm.next_task()
+ # More bogus reaching in and setting the targets.
+ n6.get_executor().targets = [n6, n7]
+ t.prepare()
+ assert n6.prepared
+ assert n7.prepared
+ assert n8.prepared
+ assert n9.prepared
+ assert n10.prepared
+
+ # Make sure we call an Executor's prepare() method.
+ class ExceptionExecutor(object):
+ def prepare(self):
+ raise Exception("Executor.prepare() exception")
+ def get_all_targets(self):
+ return self.nodes
+ def get_all_children(self):
+ result = []
+ for node in self.nodes:
+ result.extend(node.children())
+ return result
+ def get_all_prerequisites(self):
+ return []
+ def get_action_side_effects(self):
+ return []
+
+ n11 = Node("n11")
+ n11.executor = ExceptionExecutor()
+ n11.executor.nodes = [n11]
+ tm = SCons.Taskmaster.Taskmaster([n11])
+ t = tm.next_task()
+ try:
+ t.prepare()
+ except Exception as e:
+ assert str(e) == "Executor.prepare() exception", e
+ else:
+ raise AssertionError("did not catch expected exception")
+
+ def test_execute(self):
+ """Test executing a task
+ """
+ global built_text
+ global cache_text
+
+ n1 = Node("n1")
+ tm = SCons.Taskmaster.Taskmaster([n1])
+ t = tm.next_task()
+ t.execute()
+ assert built_text == "n1 built", built_text
+
+ def raise_UserError():
+ raise SCons.Errors.UserError
+ n2 = Node("n2")
+ n2.build = raise_UserError
+ tm = SCons.Taskmaster.Taskmaster([n2])
+ t = tm.next_task()
+ try:
+ t.execute()
+ except SCons.Errors.UserError:
+ pass
+ else:
+ raise TestFailed("did not catch expected UserError")
+
+ def raise_BuildError():
+ raise SCons.Errors.BuildError
+ n3 = Node("n3")
+ n3.build = raise_BuildError
+ tm = SCons.Taskmaster.Taskmaster([n3])
+ t = tm.next_task()
+ try:
+ t.execute()
+ except SCons.Errors.BuildError:
+ pass
+ else:
+ raise TestFailed("did not catch expected BuildError")
+
+ # On a generic (non-BuildError) exception from a Builder,
+ # the target should throw a BuildError exception with the
+ # args set to the exception value, instance, and traceback.
+ def raise_OtherError():
+ raise OtherError
+ n4 = Node("n4")
+ n4.build = raise_OtherError
+ tm = SCons.Taskmaster.Taskmaster([n4])
+ t = tm.next_task()
+ try:
+ t.execute()
+ except SCons.Errors.BuildError as e:
+ assert e.node == n4, e.node
+ assert e.errstr == "OtherError : ", e.errstr
+ assert len(e.exc_info) == 3, e.exc_info
+ exc_traceback = sys.exc_info()[2]
+ assert isinstance(e.exc_info[2], type(exc_traceback)), e.exc_info[2]
+ else:
+ raise TestFailed("did not catch expected BuildError")
+
+ built_text = None
+ cache_text = []
+ n5 = Node("n5")
+ n6 = Node("n6")
+ n6.cached = 1
+ tm = SCons.Taskmaster.Taskmaster([n5])
+ t = tm.next_task()
+ # This next line is moderately bogus. We're just reaching
+ # in and setting the targets for this task to an array. The
+ # "right" way to do this would be to have the next_task() call
+ # set it up by having something that approximates a real Builder
+ # return this list--but that's more work than is probably
+ # warranted right now.
+ t.targets = [n5, n6]
+ t.execute()
+ assert built_text == "n5 built", built_text
+ assert cache_text == [], cache_text
+
+ built_text = None
+ cache_text = []
+ n7 = Node("n7")
+ n8 = Node("n8")
+ n7.cached = 1
+ n8.cached = 1
+ tm = SCons.Taskmaster.Taskmaster([n7])
+ t = tm.next_task()
+ # This next line is moderately bogus. We're just reaching
+ # in and setting the targets for this task to an array. The
+ # "right" way to do this would be to have the next_task() call
+ # set it up by having something that approximates a real Builder
+ # return this list--but that's more work than is probably
+ # warranted right now.
+ t.targets = [n7, n8]
+ t.execute()
+ assert built_text is None, built_text
+ assert cache_text == ["n7 retrieved", "n8 retrieved"], cache_text
+
+ def test_cached_execute(self):
+ """Test executing a task with cached targets
+ """
+ # In issue #2720 Alexei Klimkin detected that the previous
+ # workflow for execute() led to problems in a multithreaded build.
+ # We have:
+ # task.prepare()
+ # task.execute()
+ # task.executed()
+ # -> node.visited()
+ # for the Serial flow, but
+ # - Parallel - - Worker -
+ # task.prepare()
+ # requestQueue.put(task)
+ # task = requestQueue.get()
+ # task.execute()
+ # resultQueue.put(task)
+ # task = resultQueue.get()
+ # task.executed()
+ # ->node.visited()
+ # in parallel. Since execute() used to call built() when a target
+ # was cached, it could unblock dependent nodes before the binfo got
+ # restored again in visited(). This resulted in spurious
+ # "file not found" build errors, because files fetched from cache would
+ # be seen as not up to date and wouldn't be scanned for implicit
+ # dependencies.
+ #
+ # The following test ensures that execute() only marks targets as cached,
+ # but the actual call to built() happens in executed() only.
+ # Like this, the binfo should still be intact after calling execute()...
+ global cache_text
+
+ n1 = Node("n1")
+ # Mark the node as being cached
+ n1.cached = 1
+ tm = SCons.Taskmaster.Taskmaster([n1])
+ t = tm.next_task()
+ t.prepare()
+ t.execute()
+ assert cache_text == ["n1 retrieved"], cache_text
+ # If no binfo exists anymore, something has gone wrong...
+ has_binfo = hasattr(n1, 'binfo')
+ assert has_binfo == True, has_binfo
+
+ def test_exception(self):
+ """Test generic Taskmaster exception handling
+
+ """
+ n1 = Node("n1")
+ tm = SCons.Taskmaster.Taskmaster([n1])
+ t = tm.next_task()
+
+ t.exception_set((1, 2))
+ exc_type, exc_value = t.exception
+ assert exc_type == 1, exc_type
+ assert exc_value == 2, exc_value
+
+ t.exception_set(3)
+ assert t.exception == 3
+
+ try: 1//0
+ except:
+ # Moved from below
+ t.exception_set(None)
+ #pass
+
+# import pdb; pdb.set_trace()
+
+ # Having this here works for python 2.x,
+ # but it is a tuple (None, None, None) when called outside
+ # an except statement
+ # t.exception_set(None)
+
+ exc_type, exc_value, exc_tb = t.exception
+ assert exc_type is ZeroDivisionError, "Expecting ZeroDevisionError got:%s"%exc_type
+ exception_values = [
+ "integer division or modulo",
+ "integer division or modulo by zero",
+ ]
+ assert str(exc_value) in exception_values, exc_value
+
+ class Exception1(Exception):
+ pass
+
+ # Previously value was None, but while PY2 None = "", in Py3 None != "", so set to ""
+ t.exception_set((Exception1, ""))
+ try:
+ t.exception_raise()
+ except:
+ exc_type, exc_value = sys.exc_info()[:2]
+ assert exc_type == Exception1, exc_type
+ assert str(exc_value) == '', "Expecting empty string got:%s (type %s)"%(exc_value,type(exc_value))
+ else:
+ assert 0, "did not catch expected exception"
+
+ class Exception2(Exception):
+ pass
+
+ t.exception_set((Exception2, "xyzzy"))
+ try:
+ t.exception_raise()
+ except:
+ exc_type, exc_value = sys.exc_info()[:2]
+ assert exc_type == Exception2, exc_type
+ assert str(exc_value) == "xyzzy", exc_value
+ else:
+ assert 0, "did not catch expected exception"
+
+ class Exception3(Exception):
+ pass
+
+ try:
+ 1//0
+ except:
+ tb = sys.exc_info()[2]
+ t.exception_set((Exception3, "arg", tb))
+ try:
+ t.exception_raise()
+ except:
+ exc_type, exc_value, exc_tb = sys.exc_info()
+ assert exc_type == Exception3, exc_type
+ assert str(exc_value) == "arg", exc_value
+ import traceback
+ x = traceback.extract_tb(tb)[-1]
+ y = traceback.extract_tb(exc_tb)[-1]
+ assert x == y, "x = %s, y = %s" % (x, y)
+ else:
+ assert 0, "did not catch expected exception"
+
+ def test_postprocess(self):
+ """Test postprocessing targets to give them a chance to clean up
+ """
+ n1 = Node("n1")
+ tm = SCons.Taskmaster.Taskmaster([n1])
+
+ t = tm.next_task()
+ assert not n1.postprocessed
+ t.postprocess()
+ assert n1.postprocessed
+
+ n2 = Node("n2")
+ n3 = Node("n3")
+ tm = SCons.Taskmaster.Taskmaster([n2, n3])
+
+ assert not n2.postprocessed
+ assert not n3.postprocessed
+ t = tm.next_task()
+ t.postprocess()
+ assert n2.postprocessed
+ assert not n3.postprocessed
+ t = tm.next_task()
+ t.postprocess()
+ assert n2.postprocessed
+ assert n3.postprocessed
+
+ def test_trace(self):
+ """Test Taskmaster tracing
+ """
+ import io
+
+ trace = io.StringIO()
+ n1 = Node("n1")
+ n2 = Node("n2")
+ n3 = Node("n3", [n1, n2])
+ tm = SCons.Taskmaster.Taskmaster([n1, n1, n3], trace=trace)
+ t = tm.next_task()
+ t.prepare()
+ t.execute()
+ t.postprocess()
+ n1.set_state(SCons.Node.executed)
+ t = tm.next_task()
+ t.prepare()
+ t.execute()
+ t.postprocess()
+ n2.set_state(SCons.Node.executed)
+ t = tm.next_task()
+ t.prepare()
+ t.execute()
+ t.postprocess()
+ t = tm.next_task()
+ assert t is None
+
+ value = trace.getvalue()
+ expect = """\
+
+Taskmaster: Looking for a node to evaluate
+Taskmaster: Considering node <no_state 0 'n1'> and its children:
+Taskmaster: Evaluating <pending 0 'n1'>
+
+Task.make_ready_current(): node <pending 0 'n1'>
+Task.prepare(): node <executing 0 'n1'>
+Task.execute(): node <executing 0 'n1'>
+Task.postprocess(): node <executing 0 'n1'>
+
+Taskmaster: Looking for a node to evaluate
+Taskmaster: Considering node <executed 0 'n1'> and its children:
+Taskmaster: already handled (executed)
+Taskmaster: Considering node <no_state 0 'n3'> and its children:
+Taskmaster: <executed 0 'n1'>
+Taskmaster: <no_state 0 'n2'>
+Taskmaster: adjusted ref count: <pending 1 'n3'>, child 'n2'
+Taskmaster: Considering node <no_state 0 'n2'> and its children:
+Taskmaster: Evaluating <pending 0 'n2'>
+
+Task.make_ready_current(): node <pending 0 'n2'>
+Task.prepare(): node <executing 0 'n2'>
+Task.execute(): node <executing 0 'n2'>
+Task.postprocess(): node <executing 0 'n2'>
+Task.postprocess(): removing <executing 0 'n2'>
+Task.postprocess(): adjusted parent ref count <pending 0 'n3'>
+
+Taskmaster: Looking for a node to evaluate
+Taskmaster: Considering node <pending 0 'n3'> and its children:
+Taskmaster: <executed 0 'n1'>
+Taskmaster: <executed 0 'n2'>
+Taskmaster: Evaluating <pending 0 'n3'>
+
+Task.make_ready_current(): node <pending 0 'n3'>
+Task.prepare(): node <executing 0 'n3'>
+Task.execute(): node <executing 0 'n3'>
+Task.postprocess(): node <executing 0 'n3'>
+
+Taskmaster: Looking for a node to evaluate
+Taskmaster: No candidate anymore.
+
+"""
+ assert value == expect, value
+
+
+
+if __name__ == "__main__":
+ suite = unittest.makeSuite(TaskmasterTestCase, 'test_')
+ TestUnit.run(suite)
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/386asm.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/386asm.py
new file mode 100644
index 0000000..51738eb
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/386asm.py
@@ -0,0 +1,61 @@
+"""SCons.Tool.386asm
+
+Tool specification for the 386ASM assembler for the Phar Lap ETS embedded
+operating system.
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+from SCons.Tool.PharLapCommon import addPharLapPaths
+import SCons.Util
+
+as_module = __import__('as', globals(), locals(), [], 1)
+
+def generate(env):
+ """Add Builders and construction variables for ar to an Environment."""
+ as_module.generate(env)
+
+ env['AS'] = '386asm'
+ env['ASFLAGS'] = SCons.Util.CLVar('')
+ env['ASPPFLAGS'] = '$ASFLAGS'
+ env['ASCOM'] = '$AS $ASFLAGS $SOURCES -o $TARGET'
+ env['ASPPCOM'] = '$CC $ASPPFLAGS $CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS $SOURCES -o $TARGET'
+
+ addPharLapPaths(env)
+
+def exists(env):
+ return env.Detect('386asm')
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/386asm.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/386asm.xml
new file mode 100644
index 0000000..c592ed8
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/386asm.xml
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+__COPYRIGHT__
+
+This file is processed by the bin/SConsDoc.py module.
+See its __doc__ string for a discussion of the format.
+-->
+
+<!DOCTYPE sconsdoc [
+<!ENTITY % scons SYSTEM '../../../../doc/scons.mod'>
+%scons;
+<!ENTITY % builders-mod SYSTEM '../../../../doc/generated/builders.mod'>
+%builders-mod;
+<!ENTITY % functions-mod SYSTEM '../../../../doc/generated/functions.mod'>
+%functions-mod;
+<!ENTITY % tools-mod SYSTEM '../../../../doc/generated/tools.mod'>
+%tools-mod;
+<!ENTITY % variables-mod SYSTEM '../../../../doc/generated/variables.mod'>
+%variables-mod;
+]>
+
+<sconsdoc xmlns="http://www.scons.org/dbxsd/v1.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://www.scons.org/dbxsd/v1.0 http://www.scons.org/dbxsd/v1.0/scons.xsd">
+
+<tool name="386asm">
+<summary>
+<para>
+Sets construction variables for the 386ASM assembler
+for the Phar Lap ETS embedded operating system.
+</para>
+</summary>
+<sets>
+<item>AS</item>
+<item>ASFLAGS</item>
+<item>ASPPFLAGS</item>
+<item>ASCOM</item>
+<item>ASPPCOM</item>
+</sets>
+<uses>
+<item>CC</item>
+<item>CPPFLAGS</item>
+<item>_CPPDEFFLAGS</item>
+<item>_CPPINCFLAGS</item>
+</uses>
+</tool>
+
+</sconsdoc>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/DCommon.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/DCommon.py
new file mode 100644
index 0000000..71c4d8d
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/DCommon.py
@@ -0,0 +1,69 @@
+from __future__ import print_function
+
+"""SCons.Tool.DCommon
+
+Common code for the various D tools.
+
+Coded by Russel Winder (russel@winder.org.uk)
+2012-09-06
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import os.path
+
+
+def isD(env, source):
+ if not source:
+ return 0
+ for s in source:
+ if s.sources:
+ ext = os.path.splitext(str(s.sources[0]))[1]
+ if ext == '.d':
+ return 1
+ return 0
+
+
+def addDPATHToEnv(env, executable):
+ dPath = env.WhereIs(executable)
+ if dPath:
+ phobosDir = dPath[:dPath.rindex(executable)] + '/../src/phobos'
+ if os.path.isdir(phobosDir):
+ env.Append(DPATH=[phobosDir])
+
+
+def allAtOnceEmitter(target, source, env):
+ if env['DC'] in ('ldc2', 'dmd'):
+ env.SideEffect(str(target[0]) + '.o', target[0])
+ env.Clean(target[0], str(target[0]) + '.o')
+ return target, source
+
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/DCommon.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/DCommon.xml
new file mode 100644
index 0000000..f42bea3
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/DCommon.xml
@@ -0,0 +1,71 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+__COPYRIGHT__
+
+This file is processed by the bin/SConsDoc.py module.
+See its __doc__ string for a discussion of the format.
+-->
+
+<!DOCTYPE sconsdoc [
+ <!ENTITY % scons SYSTEM '../../../../doc/scons.mod'>
+ %scons;
+ <!ENTITY % builders-mod SYSTEM '../../../../doc/generated/builders.mod'>
+ %builders-mod;
+ <!ENTITY % functions-mod SYSTEM '../../../../doc/generated/functions.mod'>
+ %functions-mod;
+ <!ENTITY % tools-mod SYSTEM '../../../../doc/generated/tools.mod'>
+ %tools-mod;
+ <!ENTITY % variables-mod SYSTEM '../../../../doc/generated/variables.mod'>
+ %variables-mod;
+ ]>
+
+<sconsdoc xmlns="http://www.scons.org/dbxsd/v1.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://www.scons.org/dbxsd/v1.0/scons.xsd">
+
+
+
+
+
+ <cvar name="DRPATHPREFIX">
+ <summary>
+ <para>
+ DRPATHPREFIX.
+ </para>
+ </summary>
+ </cvar>
+
+ <cvar name="DRPATHSUFFIX">
+ <summary>
+ <para>
+ DRPATHSUFFIX.
+ </para>
+ </summary>
+ </cvar>
+
+
+ <cvar name="DShLibSonameGenerator">
+ <summary>
+ <para>
+ DShLibSonameGenerator.
+ </para>
+ </summary>
+ </cvar>
+
+ <cvar name="SHDLIBVERSION">
+ <summary>
+ <para>
+ SHDLIBVERSION.
+ </para>
+ </summary>
+ </cvar>
+ <cvar name="SHDLIBVERSIONFLAGS">
+ <summary>
+ <para>
+ SHDLIBVERSIONFLAGS.
+ </para>
+ </summary>
+ </cvar>
+
+
+</sconsdoc>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/FortranCommon.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/FortranCommon.py
new file mode 100644
index 0000000..ec409c0
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/FortranCommon.py
@@ -0,0 +1,280 @@
+"""SCons.Tool.FortranCommon
+
+Stuff for processing Fortran, common to all fortran dialects.
+
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+from __future__ import print_function
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import re
+import os.path
+
+import SCons.Action
+import SCons.Defaults
+import SCons.Scanner.Fortran
+import SCons.Tool
+import SCons.Util
+
+def isfortran(env, source):
+ """Return 1 if any of code in source has fortran files in it, 0
+ otherwise."""
+ try:
+ fsuffixes = env['FORTRANSUFFIXES']
+ except KeyError:
+ # If no FORTRANSUFFIXES, no fortran tool, so there is no need to look
+ # for fortran sources.
+ return 0
+
+ if not source:
+ # Source might be None for unusual cases like SConf.
+ return 0
+ for s in source:
+ if s.sources:
+ ext = os.path.splitext(str(s.sources[0]))[1]
+ if ext in fsuffixes:
+ return 1
+ return 0
+
+def _fortranEmitter(target, source, env):
+ node = source[0].rfile()
+ if not node.exists() and not node.is_derived():
+ print("Could not locate " + str(node.name))
+ return ([], [])
+ mod_regex = """(?i)^\s*MODULE\s+(?!PROCEDURE)(\w+)"""
+ cre = re.compile(mod_regex,re.M)
+ # Retrieve all USE'd module names
+ modules = cre.findall(node.get_text_contents())
+ # Remove unique items from the list
+ modules = SCons.Util.unique(modules)
+ # Convert module name to a .mod filename
+ suffix = env.subst('$FORTRANMODSUFFIX', target=target, source=source)
+ moddir = env.subst('$FORTRANMODDIR', target=target, source=source)
+ modules = [x.lower() + suffix for x in modules]
+ for m in modules:
+ target.append(env.fs.File(m, moddir))
+ return (target, source)
+
+def FortranEmitter(target, source, env):
+ target, source = _fortranEmitter(target, source, env)
+ return SCons.Defaults.StaticObjectEmitter(target, source, env)
+
+def ShFortranEmitter(target, source, env):
+ target, source = _fortranEmitter(target, source, env)
+ return SCons.Defaults.SharedObjectEmitter(target, source, env)
+
+def ComputeFortranSuffixes(suffixes, ppsuffixes):
+ """suffixes are fortran source files, and ppsuffixes the ones to be
+ pre-processed. Both should be sequences, not strings."""
+ assert len(suffixes) > 0
+ s = suffixes[0]
+ sup = s.upper()
+ upper_suffixes = [_.upper() for _ in suffixes]
+ if SCons.Util.case_sensitive_suffixes(s, sup):
+ ppsuffixes.extend(upper_suffixes)
+ else:
+ suffixes.extend(upper_suffixes)
+
+def CreateDialectActions(dialect):
+ """Create dialect specific actions."""
+ CompAction = SCons.Action.Action('$%sCOM ' % dialect, '$%sCOMSTR' % dialect)
+ CompPPAction = SCons.Action.Action('$%sPPCOM ' % dialect, '$%sPPCOMSTR' % dialect)
+ ShCompAction = SCons.Action.Action('$SH%sCOM ' % dialect, '$SH%sCOMSTR' % dialect)
+ ShCompPPAction = SCons.Action.Action('$SH%sPPCOM ' % dialect, '$SH%sPPCOMSTR' % dialect)
+
+ return CompAction, CompPPAction, ShCompAction, ShCompPPAction
+
+def DialectAddToEnv(env, dialect, suffixes, ppsuffixes, support_module = 0):
+ """Add dialect specific construction variables."""
+ ComputeFortranSuffixes(suffixes, ppsuffixes)
+
+ fscan = SCons.Scanner.Fortran.FortranScan("%sPATH" % dialect)
+
+ for suffix in suffixes + ppsuffixes:
+ SCons.Tool.SourceFileScanner.add_scanner(suffix, fscan)
+
+ env.AppendUnique(FORTRANSUFFIXES = suffixes + ppsuffixes)
+
+ compaction, compppaction, shcompaction, shcompppaction = \
+ CreateDialectActions(dialect)
+
+ static_obj, shared_obj = SCons.Tool.createObjBuilders(env)
+
+ for suffix in suffixes:
+ static_obj.add_action(suffix, compaction)
+ shared_obj.add_action(suffix, shcompaction)
+ static_obj.add_emitter(suffix, FortranEmitter)
+ shared_obj.add_emitter(suffix, ShFortranEmitter)
+
+ for suffix in ppsuffixes:
+ static_obj.add_action(suffix, compppaction)
+ shared_obj.add_action(suffix, shcompppaction)
+ static_obj.add_emitter(suffix, FortranEmitter)
+ shared_obj.add_emitter(suffix, ShFortranEmitter)
+
+ if '%sFLAGS' % dialect not in env:
+ env['%sFLAGS' % dialect] = SCons.Util.CLVar('')
+
+ if 'SH%sFLAGS' % dialect not in env:
+ env['SH%sFLAGS' % dialect] = SCons.Util.CLVar('$%sFLAGS' % dialect)
+
+ # If a tool does not define fortran prefix/suffix for include path, use C ones
+ if 'INC%sPREFIX' % dialect not in env:
+ env['INC%sPREFIX' % dialect] = '$INCPREFIX'
+
+ if 'INC%sSUFFIX' % dialect not in env:
+ env['INC%sSUFFIX' % dialect] = '$INCSUFFIX'
+
+ env['_%sINCFLAGS' % dialect] = '$( ${_concat(INC%sPREFIX, %sPATH, INC%sSUFFIX, __env__, RDirs, TARGET, SOURCE)} $)' % (dialect, dialect, dialect)
+
+ if support_module == 1:
+ env['%sCOM' % dialect] = '$%s -o $TARGET -c $%sFLAGS $_%sINCFLAGS $_FORTRANMODFLAG $SOURCES' % (dialect, dialect, dialect)
+ env['%sPPCOM' % dialect] = '$%s -o $TARGET -c $%sFLAGS $CPPFLAGS $_CPPDEFFLAGS $_%sINCFLAGS $_FORTRANMODFLAG $SOURCES' % (dialect, dialect, dialect)
+ env['SH%sCOM' % dialect] = '$SH%s -o $TARGET -c $SH%sFLAGS $_%sINCFLAGS $_FORTRANMODFLAG $SOURCES' % (dialect, dialect, dialect)
+ env['SH%sPPCOM' % dialect] = '$SH%s -o $TARGET -c $SH%sFLAGS $CPPFLAGS $_CPPDEFFLAGS $_%sINCFLAGS $_FORTRANMODFLAG $SOURCES' % (dialect, dialect, dialect)
+ else:
+ env['%sCOM' % dialect] = '$%s -o $TARGET -c $%sFLAGS $_%sINCFLAGS $SOURCES' % (dialect, dialect, dialect)
+ env['%sPPCOM' % dialect] = '$%s -o $TARGET -c $%sFLAGS $CPPFLAGS $_CPPDEFFLAGS $_%sINCFLAGS $SOURCES' % (dialect, dialect, dialect)
+ env['SH%sCOM' % dialect] = '$SH%s -o $TARGET -c $SH%sFLAGS $_%sINCFLAGS $SOURCES' % (dialect, dialect, dialect)
+ env['SH%sPPCOM' % dialect] = '$SH%s -o $TARGET -c $SH%sFLAGS $CPPFLAGS $_CPPDEFFLAGS $_%sINCFLAGS $SOURCES' % (dialect, dialect, dialect)
+
+def add_fortran_to_env(env):
+ """Add Builders and construction variables for Fortran to an Environment."""
+ try:
+ FortranSuffixes = env['FORTRANFILESUFFIXES']
+ except KeyError:
+ FortranSuffixes = ['.f', '.for', '.ftn']
+
+ #print("Adding %s to fortran suffixes" % FortranSuffixes)
+ try:
+ FortranPPSuffixes = env['FORTRANPPFILESUFFIXES']
+ except KeyError:
+ FortranPPSuffixes = ['.fpp', '.FPP']
+
+ DialectAddToEnv(env, "FORTRAN", FortranSuffixes,
+ FortranPPSuffixes, support_module = 1)
+
+ env['FORTRANMODPREFIX'] = '' # like $LIBPREFIX
+ env['FORTRANMODSUFFIX'] = '.mod' # like $LIBSUFFIX
+
+ env['FORTRANMODDIR'] = '' # where the compiler should place .mod files
+ env['FORTRANMODDIRPREFIX'] = '' # some prefix to $FORTRANMODDIR - similar to $INCPREFIX
+ env['FORTRANMODDIRSUFFIX'] = '' # some suffix to $FORTRANMODDIR - similar to $INCSUFFIX
+ env['_FORTRANMODFLAG'] = '$( ${_concat(FORTRANMODDIRPREFIX, FORTRANMODDIR, FORTRANMODDIRSUFFIX, __env__, RDirs, TARGET, SOURCE)} $)'
+
+def add_f77_to_env(env):
+ """Add Builders and construction variables for f77 to an Environment."""
+ try:
+ F77Suffixes = env['F77FILESUFFIXES']
+ except KeyError:
+ F77Suffixes = ['.f77']
+
+ #print("Adding %s to f77 suffixes" % F77Suffixes)
+ try:
+ F77PPSuffixes = env['F77PPFILESUFFIXES']
+ except KeyError:
+ F77PPSuffixes = []
+
+ DialectAddToEnv(env, "F77", F77Suffixes, F77PPSuffixes)
+
+def add_f90_to_env(env):
+ """Add Builders and construction variables for f90 to an Environment."""
+ try:
+ F90Suffixes = env['F90FILESUFFIXES']
+ except KeyError:
+ F90Suffixes = ['.f90']
+
+ #print("Adding %s to f90 suffixes" % F90Suffixes)
+ try:
+ F90PPSuffixes = env['F90PPFILESUFFIXES']
+ except KeyError:
+ F90PPSuffixes = []
+
+ DialectAddToEnv(env, "F90", F90Suffixes, F90PPSuffixes,
+ support_module = 1)
+
+def add_f95_to_env(env):
+ """Add Builders and construction variables for f95 to an Environment."""
+ try:
+ F95Suffixes = env['F95FILESUFFIXES']
+ except KeyError:
+ F95Suffixes = ['.f95']
+
+ #print("Adding %s to f95 suffixes" % F95Suffixes)
+ try:
+ F95PPSuffixes = env['F95PPFILESUFFIXES']
+ except KeyError:
+ F95PPSuffixes = []
+
+ DialectAddToEnv(env, "F95", F95Suffixes, F95PPSuffixes,
+ support_module = 1)
+
+def add_f03_to_env(env):
+ """Add Builders and construction variables for f03 to an Environment."""
+ try:
+ F03Suffixes = env['F03FILESUFFIXES']
+ except KeyError:
+ F03Suffixes = ['.f03']
+
+ #print("Adding %s to f95 suffixes" % F95Suffixes)
+ try:
+ F03PPSuffixes = env['F03PPFILESUFFIXES']
+ except KeyError:
+ F03PPSuffixes = []
+
+ DialectAddToEnv(env, "F03", F03Suffixes, F03PPSuffixes,
+ support_module = 1)
+
+def add_f08_to_env(env):
+ """Add Builders and construction variables for f08 to an Environment."""
+ try:
+ F08Suffixes = env['F08FILESUFFIXES']
+ except KeyError:
+ F08Suffixes = ['.f08']
+
+ try:
+ F08PPSuffixes = env['F08PPFILESUFFIXES']
+ except KeyError:
+ F08PPSuffixes = []
+
+ DialectAddToEnv(env, "F08", F08Suffixes, F08PPSuffixes,
+ support_module = 1)
+
+def add_all_to_env(env):
+ """Add builders and construction variables for all supported fortran
+ dialects."""
+ add_fortran_to_env(env)
+ add_f77_to_env(env)
+ add_f90_to_env(env)
+ add_f95_to_env(env)
+ add_f03_to_env(env)
+ add_f08_to_env(env)
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/GettextCommon.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/GettextCommon.py
new file mode 100644
index 0000000..3b840a6
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/GettextCommon.py
@@ -0,0 +1,469 @@
+"""SCons.Tool.GettextCommon module
+
+Used by several tools of `gettext` toolset.
+"""
+
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import SCons.Warnings
+import re
+
+
+#############################################################################
+class XgettextToolWarning(SCons.Warnings.Warning): pass
+
+
+class XgettextNotFound(XgettextToolWarning): pass
+
+
+class MsginitToolWarning(SCons.Warnings.Warning): pass
+
+
+class MsginitNotFound(MsginitToolWarning): pass
+
+
+class MsgmergeToolWarning(SCons.Warnings.Warning): pass
+
+
+class MsgmergeNotFound(MsgmergeToolWarning): pass
+
+
+class MsgfmtToolWarning(SCons.Warnings.Warning): pass
+
+
+class MsgfmtNotFound(MsgfmtToolWarning): pass
+
+
+#############################################################################
+SCons.Warnings.enableWarningClass(XgettextToolWarning)
+SCons.Warnings.enableWarningClass(XgettextNotFound)
+SCons.Warnings.enableWarningClass(MsginitToolWarning)
+SCons.Warnings.enableWarningClass(MsginitNotFound)
+SCons.Warnings.enableWarningClass(MsgmergeToolWarning)
+SCons.Warnings.enableWarningClass(MsgmergeNotFound)
+SCons.Warnings.enableWarningClass(MsgfmtToolWarning)
+SCons.Warnings.enableWarningClass(MsgfmtNotFound)
+
+
+#############################################################################
+
+#############################################################################
+class _POTargetFactory(object):
+ """ A factory of `PO` target files.
+
+ Factory defaults differ from these of `SCons.Node.FS.FS`. We set `precious`
+ (this is required by builders and actions gettext) and `noclean` flags by
+ default for all produced nodes.
+ """
+
+ def __init__(self, env, nodefault=True, alias=None, precious=True
+ , noclean=True):
+ """ Object constructor.
+
+ **Arguments**
+
+ - *env* (`SCons.Environment.Environment`)
+ - *nodefault* (`boolean`) - if `True`, produced nodes will be ignored
+ from default target `'.'`
+ - *alias* (`string`) - if provided, produced nodes will be automatically
+ added to this alias, and alias will be set as `AlwaysBuild`
+ - *precious* (`boolean`) - if `True`, the produced nodes will be set as
+ `Precious`.
+ - *noclen* (`boolean`) - if `True`, the produced nodes will be excluded
+ from `Clean`.
+ """
+ self.env = env
+ self.alias = alias
+ self.precious = precious
+ self.noclean = noclean
+ self.nodefault = nodefault
+
+ def _create_node(self, name, factory, directory=None, create=1):
+ """ Create node, and set it up to factory settings. """
+ import SCons.Util
+ node = factory(name, directory, create)
+ node.set_noclean(self.noclean)
+ node.set_precious(self.precious)
+ if self.nodefault:
+ self.env.Ignore('.', node)
+ if self.alias:
+ self.env.AlwaysBuild(self.env.Alias(self.alias, node))
+ return node
+
+ def Entry(self, name, directory=None, create=1):
+ """ Create `SCons.Node.FS.Entry` """
+ return self._create_node(name, self.env.fs.Entry, directory, create)
+
+ def File(self, name, directory=None, create=1):
+ """ Create `SCons.Node.FS.File` """
+ return self._create_node(name, self.env.fs.File, directory, create)
+
+
+#############################################################################
+
+#############################################################################
+_re_comment = re.compile(r'(#[^\n\r]+)$', re.M)
+_re_lang = re.compile(r'([a-zA-Z0-9_]+)', re.M)
+
+
+#############################################################################
+def _read_linguas_from_files(env, linguas_files=None):
+ """ Parse `LINGUAS` file and return list of extracted languages """
+ import SCons.Util
+ import SCons.Environment
+ global _re_comment
+ global _re_lang
+ if not SCons.Util.is_List(linguas_files) \
+ and not SCons.Util.is_String(linguas_files) \
+ and not isinstance(linguas_files, SCons.Node.FS.Base) \
+ and linguas_files:
+ # If, linguas_files==True or such, then read 'LINGUAS' file.
+ linguas_files = ['LINGUAS']
+ if linguas_files is None:
+ return []
+ fnodes = env.arg2nodes(linguas_files)
+ linguas = []
+ for fnode in fnodes:
+ contents = _re_comment.sub("", fnode.get_text_contents())
+ ls = [l for l in _re_lang.findall(contents) if l]
+ linguas.extend(ls)
+ return linguas
+
+
+#############################################################################
+
+#############################################################################
+from SCons.Builder import BuilderBase
+
+
+#############################################################################
+class _POFileBuilder(BuilderBase):
+ """ `PO` file builder.
+
+ This is multi-target single-source builder. In typical situation the source
+ is single `POT` file, e.g. `messages.pot`, and there are multiple `PO`
+ targets to be updated from this `POT`. We must run
+ `SCons.Builder.BuilderBase._execute()` separatelly for each target to track
+ dependencies separatelly for each target file.
+
+ **NOTE**: if we call `SCons.Builder.BuilderBase._execute(.., target, ...)`
+ with target being list of all targets, all targets would be rebuilt each time
+ one of the targets from this list is missing. This would happen, for example,
+ when new language `ll` enters `LINGUAS_FILE` (at this moment there is no
+ `ll.po` file yet). To avoid this, we override
+ `SCons.Builder.BuilerBase._execute()` and call it separatelly for each
+ target. Here we also append to the target list the languages read from
+ `LINGUAS_FILE`.
+ """
+
+ #
+ # * The argument for overriding _execute(): We must use environment with
+ # builder overrides applied (see BuilderBase.__init__(). Here it comes for
+ # free.
+ # * The argument against using 'emitter': The emitter is called too late
+ # by BuilderBase._execute(). If user calls, for example:
+ #
+ # env.POUpdate(LINGUAS_FILE = 'LINGUAS')
+ #
+ # the builder throws error, because it is called with target=None,
+ # source=None and is trying to "generate" sources or target list first.
+ # If user calls
+ #
+ # env.POUpdate(['foo', 'baz'], LINGUAS_FILE = 'LINGUAS')
+ #
+ # the env.BuilderWrapper() calls our builder with target=None,
+ # source=['foo', 'baz']. The BuilderBase._execute() then splits execution
+ # and execute iterativelly (recursion) self._execute(None, source[i]).
+ # After that it calls emitter (which is quite too late). The emitter is
+ # also called in each iteration, what makes things yet worse.
+ def __init__(self, env, **kw):
+ if not 'suffix' in kw:
+ kw['suffix'] = '$POSUFFIX'
+ if not 'src_suffix' in kw:
+ kw['src_suffix'] = '$POTSUFFIX'
+ if not 'src_builder' in kw:
+ kw['src_builder'] = '_POTUpdateBuilder'
+ if not 'single_source' in kw:
+ kw['single_source'] = True
+ alias = None
+ if 'target_alias' in kw:
+ alias = kw['target_alias']
+ del kw['target_alias']
+ if not 'target_factory' in kw:
+ kw['target_factory'] = _POTargetFactory(env, alias=alias).File
+ BuilderBase.__init__(self, **kw)
+
+ def _execute(self, env, target, source, *args, **kw):
+ """ Execute builder's actions.
+
+ Here we append to `target` the languages read from `$LINGUAS_FILE` and
+ apply `SCons.Builder.BuilderBase._execute()` separatelly to each target.
+ The arguments and return value are same as for
+ `SCons.Builder.BuilderBase._execute()`.
+ """
+ import SCons.Util
+ import SCons.Node
+ linguas_files = None
+ if 'LINGUAS_FILE' in env and env['LINGUAS_FILE']:
+ linguas_files = env['LINGUAS_FILE']
+ # This prevents endless recursion loop (we'll be invoked once for
+ # each target appended here, we must not extend the list again).
+ env['LINGUAS_FILE'] = None
+ linguas = _read_linguas_from_files(env, linguas_files)
+ if SCons.Util.is_List(target):
+ target.extend(linguas)
+ elif target is not None:
+ target = [target] + linguas
+ else:
+ target = linguas
+ if not target:
+ # Let the SCons.BuilderBase to handle this patologic situation
+ return BuilderBase._execute(self, env, target, source, *args, **kw)
+ # The rest is ours
+ if not SCons.Util.is_List(target):
+ target = [target]
+ result = []
+ for tgt in target:
+ r = BuilderBase._execute(self, env, [tgt], source, *args, **kw)
+ result.extend(r)
+ if linguas_files is not None:
+ env['LINGUAS_FILE'] = linguas_files
+ return SCons.Node.NodeList(result)
+
+
+#############################################################################
+
+import SCons.Environment
+
+
+#############################################################################
+def _translate(env, target=None, source=SCons.Environment._null, *args, **kw):
+ """ Function for `Translate()` pseudo-builder """
+ if target is None: target = []
+ pot = env.POTUpdate(None, source, *args, **kw)
+ po = env.POUpdate(target, pot, *args, **kw)
+ return po
+
+
+#############################################################################
+
+#############################################################################
+class RPaths(object):
+ """ Callable object, which returns pathnames relative to SCons current
+ working directory.
+
+ It seems like `SCons.Node.FS.Base.get_path()` returns absolute paths
+ for nodes that are outside of current working directory (`env.fs.getcwd()`).
+ Here, we often have `SConscript`, `POT` and `PO` files within `po/`
+ directory and source files (e.g. `*.c`) outside of it. When generating `POT`
+ template file, references to source files are written to `POT` template, so
+ a translator may later quickly jump to appropriate source file and line from
+ its `PO` editor (e.g. `poedit`). Relative paths in `PO` file are usually
+ interpreted by `PO` editor as paths relative to the place, where `PO` file
+ lives. The absolute paths would make resultant `POT` file nonportable, as
+ the references would be correct only on the machine, where `POT` file was
+ recently re-created. For such reason, we need a function, which always
+ returns relative paths. This is the purpose of `RPaths` callable object.
+
+ The `__call__` method returns paths relative to current working directory, but
+ we assume, that *xgettext(1)* is run from the directory, where target file is
+ going to be created.
+
+ Note, that this may not work for files distributed over several hosts or
+ across different drives on windows. We assume here, that single local
+ filesystem holds both source files and target `POT` templates.
+
+ Intended use of `RPaths` - in `xgettext.py`::
+
+ def generate(env):
+ from GettextCommon import RPaths
+ ...
+ sources = '$( ${_concat( "", SOURCES, "", __env__, XgettextRPaths, TARGET, SOURCES)} $)'
+ env.Append(
+ ...
+ XGETTEXTCOM = 'XGETTEXT ... ' + sources,
+ ...
+ XgettextRPaths = RPaths(env)
+ )
+ """
+
+ # NOTE: This callable object returns pathnames of dirs/files relative to
+ # current working directory. The pathname remains relative also for entries
+ # that are outside of current working directory (node, that
+ # SCons.Node.FS.File and siblings return absolute path in such case). For
+ # simplicity we compute path relative to current working directory, this
+ # seems be enough for our purposes (don't need TARGET variable and
+ # SCons.Defaults.Variable_Caller stuff).
+
+ def __init__(self, env):
+ """ Initialize `RPaths` callable object.
+
+ **Arguments**:
+
+ - *env* - a `SCons.Environment.Environment` object, defines *current
+ working dir*.
+ """
+ self.env = env
+
+ # FIXME: I'm not sure, how it should be implemented (what the *args are in
+ # general, what is **kw).
+ def __call__(self, nodes, *args, **kw):
+ """ Return nodes' paths (strings) relative to current working directory.
+
+ **Arguments**:
+
+ - *nodes* ([`SCons.Node.FS.Base`]) - list of nodes.
+ - *args* - currently unused.
+ - *kw* - currently unused.
+
+ **Returns**:
+
+ - Tuple of strings, which represent paths relative to current working
+ directory (for given environment).
+ """
+ import os
+ import SCons.Node.FS
+ rpaths = ()
+ cwd = self.env.fs.getcwd().get_abspath()
+ for node in nodes:
+ rpath = None
+ if isinstance(node, SCons.Node.FS.Base):
+ rpath = os.path.relpath(node.get_abspath(), cwd)
+ # FIXME: Other types possible here?
+ if rpath is not None:
+ rpaths += (rpath,)
+ return rpaths
+
+
+#############################################################################
+
+#############################################################################
+def _init_po_files(target, source, env):
+ """ Action function for `POInit` builder. """
+ nop = lambda target, source, env: 0
+ if 'POAUTOINIT' in env:
+ autoinit = env['POAUTOINIT']
+ else:
+ autoinit = False
+ # Well, if everything outside works well, this loop should do single
+ # iteration. Otherwise we are rebuilding all the targets even, if just
+ # one has changed (but is this our fault?).
+ for tgt in target:
+ if not tgt.exists():
+ if autoinit:
+ action = SCons.Action.Action('$MSGINITCOM', '$MSGINITCOMSTR')
+ else:
+ msg = 'File ' + repr(str(tgt)) + ' does not exist. ' \
+ + 'If you are a translator, you can create it through: \n' \
+ + '$MSGINITCOM'
+ action = SCons.Action.Action(nop, msg)
+ status = action([tgt], source, env)
+ if status: return status
+ return 0
+
+
+#############################################################################
+
+#############################################################################
+def _detect_xgettext(env):
+ """ Detects *xgettext(1)* binary """
+ if 'XGETTEXT' in env:
+ return env['XGETTEXT']
+ xgettext = env.Detect('xgettext');
+ if xgettext:
+ return xgettext
+ raise SCons.Errors.StopError(XgettextNotFound, "Could not detect xgettext")
+ return None
+
+
+#############################################################################
+def _xgettext_exists(env):
+ return _detect_xgettext(env)
+
+
+#############################################################################
+
+#############################################################################
+def _detect_msginit(env):
+ """ Detects *msginit(1)* program. """
+ if 'MSGINIT' in env:
+ return env['MSGINIT']
+ msginit = env.Detect('msginit');
+ if msginit:
+ return msginit
+ raise SCons.Errors.StopError(MsginitNotFound, "Could not detect msginit")
+ return None
+
+
+#############################################################################
+def _msginit_exists(env):
+ return _detect_msginit(env)
+
+
+#############################################################################
+
+#############################################################################
+def _detect_msgmerge(env):
+ """ Detects *msgmerge(1)* program. """
+ if 'MSGMERGE' in env:
+ return env['MSGMERGE']
+ msgmerge = env.Detect('msgmerge');
+ if msgmerge:
+ return msgmerge
+ raise SCons.Errors.StopError(MsgmergeNotFound, "Could not detect msgmerge")
+ return None
+
+
+#############################################################################
+def _msgmerge_exists(env):
+ return _detect_msgmerge(env)
+
+
+#############################################################################
+
+#############################################################################
+def _detect_msgfmt(env):
+ """ Detects *msgmfmt(1)* program. """
+ if 'MSGFMT' in env:
+ return env['MSGFMT']
+ msgfmt = env.Detect('msgfmt');
+ if msgfmt:
+ return msgfmt
+ raise SCons.Errors.StopError(MsgfmtNotFound, "Could not detect msgfmt")
+ return None
+
+
+#############################################################################
+def _msgfmt_exists(env):
+ return _detect_msgfmt(env)
+
+
+#############################################################################
+
+#############################################################################
+def tool_list(platform, env):
+ """ List tools that shall be generated by top-level `gettext` tool """
+ return ['xgettext', 'msginit', 'msgmerge', 'msgfmt']
+
+#############################################################################
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/JavaCommon.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/JavaCommon.py
new file mode 100644
index 0000000..8b13f9f
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/JavaCommon.py
@@ -0,0 +1,324 @@
+"""SCons.Tool.JavaCommon
+
+Stuff for processing Java.
+
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import os
+import os.path
+import re
+
+java_parsing = 1
+
+default_java_version = '1.4'
+
+if java_parsing:
+ # Parse Java files for class names.
+ #
+ # This is a really cool parser from Charles Crain
+ # that finds appropriate class names in Java source.
+
+ # A regular expression that will find, in a java file:
+ # newlines;
+ # double-backslashes;
+ # a single-line comment "//";
+ # single or double quotes preceeded by a backslash;
+ # single quotes, double quotes, open or close braces, semi-colons,
+ # periods, open or close parentheses;
+ # floating-point numbers;
+ # any alphanumeric token (keyword, class name, specifier);
+ # any alphanumeric token surrounded by angle brackets (generics);
+ # the multi-line comment begin and end tokens /* and */;
+ # array declarations "[]".
+ _reToken = re.compile(r'(\n|\\\\|//|\\[\'"]|[\'"\{\}\;\.\(\)]|' +
+ r'\d*\.\d*|[A-Za-z_][\w\$\.]*|<[A-Za-z_]\w+>|' +
+ r'/\*|\*/|\[\])')
+
+ class OuterState(object):
+ """The initial state for parsing a Java file for classes,
+ interfaces, and anonymous inner classes."""
+ def __init__(self, version=default_java_version):
+
+ if not version in ('1.1', '1.2', '1.3','1.4', '1.5', '1.6', '1.7',
+ '1.8', '5', '6'):
+ msg = "Java version %s not supported" % version
+ raise NotImplementedError(msg)
+
+ self.version = version
+ self.listClasses = []
+ self.listOutputs = []
+ self.stackBrackets = []
+ self.brackets = 0
+ self.nextAnon = 1
+ self.localClasses = []
+ self.stackAnonClassBrackets = []
+ self.anonStacksStack = [[0]]
+ self.package = None
+
+ def trace(self):
+ pass
+
+ def __getClassState(self):
+ try:
+ return self.classState
+ except AttributeError:
+ ret = ClassState(self)
+ self.classState = ret
+ return ret
+
+ def __getPackageState(self):
+ try:
+ return self.packageState
+ except AttributeError:
+ ret = PackageState(self)
+ self.packageState = ret
+ return ret
+
+ def __getAnonClassState(self):
+ try:
+ return self.anonState
+ except AttributeError:
+ self.outer_state = self
+ ret = SkipState(1, AnonClassState(self))
+ self.anonState = ret
+ return ret
+
+ def __getSkipState(self):
+ try:
+ return self.skipState
+ except AttributeError:
+ ret = SkipState(1, self)
+ self.skipState = ret
+ return ret
+
+ def __getAnonStack(self):
+ return self.anonStacksStack[-1]
+
+ def openBracket(self):
+ self.brackets = self.brackets + 1
+
+ def closeBracket(self):
+ self.brackets = self.brackets - 1
+ if len(self.stackBrackets) and \
+ self.brackets == self.stackBrackets[-1]:
+ self.listOutputs.append('$'.join(self.listClasses))
+ self.localClasses.pop()
+ self.listClasses.pop()
+ self.anonStacksStack.pop()
+ self.stackBrackets.pop()
+ if len(self.stackAnonClassBrackets) and \
+ self.brackets == self.stackAnonClassBrackets[-1]:
+ self.__getAnonStack().pop()
+ self.stackAnonClassBrackets.pop()
+
+ def parseToken(self, token):
+ if token[:2] == '//':
+ return IgnoreState('\n', self)
+ elif token == '/*':
+ return IgnoreState('*/', self)
+ elif token == '{':
+ self.openBracket()
+ elif token == '}':
+ self.closeBracket()
+ elif token in [ '"', "'" ]:
+ return IgnoreState(token, self)
+ elif token == "new":
+ # anonymous inner class
+ if len(self.listClasses) > 0:
+ return self.__getAnonClassState()
+ return self.__getSkipState() # Skip the class name
+ elif token in ['class', 'interface', 'enum']:
+ if len(self.listClasses) == 0:
+ self.nextAnon = 1
+ self.stackBrackets.append(self.brackets)
+ return self.__getClassState()
+ elif token == 'package':
+ return self.__getPackageState()
+ elif token == '.':
+ # Skip the attribute, it might be named "class", in which
+ # case we don't want to treat the following token as
+ # an inner class name...
+ return self.__getSkipState()
+ return self
+
+ def addAnonClass(self):
+ """Add an anonymous inner class"""
+ if self.version in ('1.1', '1.2', '1.3', '1.4'):
+ clazz = self.listClasses[0]
+ self.listOutputs.append('%s$%d' % (clazz, self.nextAnon))
+ elif self.version in ('1.5', '1.6', '1.7', '1.8', '5', '6'):
+ self.stackAnonClassBrackets.append(self.brackets)
+ className = []
+ className.extend(self.listClasses)
+ self.__getAnonStack()[-1] = self.__getAnonStack()[-1] + 1
+ for anon in self.__getAnonStack():
+ className.append(str(anon))
+ self.listOutputs.append('$'.join(className))
+
+ self.nextAnon = self.nextAnon + 1
+ self.__getAnonStack().append(0)
+
+ def setPackage(self, package):
+ self.package = package
+
+ class AnonClassState(object):
+ """A state that looks for anonymous inner classes."""
+ def __init__(self, old_state):
+ # outer_state is always an instance of OuterState
+ self.outer_state = old_state.outer_state
+ self.old_state = old_state
+ self.brace_level = 0
+ def parseToken(self, token):
+ # This is an anonymous class if and only if the next
+ # non-whitespace token is a bracket. Everything between
+ # braces should be parsed as normal java code.
+ if token[:2] == '//':
+ return IgnoreState('\n', self)
+ elif token == '/*':
+ return IgnoreState('*/', self)
+ elif token == '\n':
+ return self
+ elif token[0] == '<' and token[-1] == '>':
+ return self
+ elif token == '(':
+ self.brace_level = self.brace_level + 1
+ return self
+ if self.brace_level > 0:
+ if token == 'new':
+ # look further for anonymous inner class
+ return SkipState(1, AnonClassState(self))
+ elif token in [ '"', "'" ]:
+ return IgnoreState(token, self)
+ elif token == ')':
+ self.brace_level = self.brace_level - 1
+ return self
+ if token == '{':
+ self.outer_state.addAnonClass()
+ return self.old_state.parseToken(token)
+
+ class SkipState(object):
+ """A state that will skip a specified number of tokens before
+ reverting to the previous state."""
+ def __init__(self, tokens_to_skip, old_state):
+ self.tokens_to_skip = tokens_to_skip
+ self.old_state = old_state
+ def parseToken(self, token):
+ self.tokens_to_skip = self.tokens_to_skip - 1
+ if self.tokens_to_skip < 1:
+ return self.old_state
+ return self
+
+ class ClassState(object):
+ """A state we go into when we hit a class or interface keyword."""
+ def __init__(self, outer_state):
+ # outer_state is always an instance of OuterState
+ self.outer_state = outer_state
+ def parseToken(self, token):
+ # the next non-whitespace token should be the name of the class
+ if token == '\n':
+ return self
+ # If that's an inner class which is declared in a method, it
+ # requires an index prepended to the class-name, e.g.
+ # 'Foo$1Inner'
+ # http://scons.tigris.org/issues/show_bug.cgi?id=2087
+ if self.outer_state.localClasses and \
+ self.outer_state.stackBrackets[-1] > \
+ self.outer_state.stackBrackets[-2]+1:
+ locals = self.outer_state.localClasses[-1]
+ try:
+ idx = locals[token]
+ locals[token] = locals[token]+1
+ except KeyError:
+ locals[token] = 1
+ token = str(locals[token]) + token
+ self.outer_state.localClasses.append({})
+ self.outer_state.listClasses.append(token)
+ self.outer_state.anonStacksStack.append([0])
+ return self.outer_state
+
+ class IgnoreState(object):
+ """A state that will ignore all tokens until it gets to a
+ specified token."""
+ def __init__(self, ignore_until, old_state):
+ self.ignore_until = ignore_until
+ self.old_state = old_state
+ def parseToken(self, token):
+ if self.ignore_until == token:
+ return self.old_state
+ return self
+
+ class PackageState(object):
+ """The state we enter when we encounter the package keyword.
+ We assume the next token will be the package name."""
+ def __init__(self, outer_state):
+ # outer_state is always an instance of OuterState
+ self.outer_state = outer_state
+ def parseToken(self, token):
+ self.outer_state.setPackage(token)
+ return self.outer_state
+
+ def parse_java_file(fn, version=default_java_version):
+ return parse_java(open(fn, 'r').read(), version)
+
+ def parse_java(contents, version=default_java_version, trace=None):
+ """Parse a .java file and return a double of package directory,
+ plus a list of .class files that compiling that .java file will
+ produce"""
+ package = None
+ initial = OuterState(version)
+ currstate = initial
+ for token in _reToken.findall(contents):
+ # The regex produces a bunch of groups, but only one will
+ # have anything in it.
+ currstate = currstate.parseToken(token)
+ if trace: trace(token, currstate)
+ if initial.package:
+ package = initial.package.replace('.', os.sep)
+ return (package, initial.listOutputs)
+
+else:
+ # Don't actually parse Java files for class names.
+ #
+ # We might make this a configurable option in the future if
+ # Java-file parsing takes too long (although it shouldn't relative
+ # to how long the Java compiler itself seems to take...).
+
+ def parse_java_file(fn):
+ """ "Parse" a .java file.
+
+ This actually just splits the file name, so the assumption here
+ is that the file name matches the public class name, and that
+ the path to the file is the same as the package name.
+ """
+ return os.path.split(file)
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/JavaCommonTests.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/JavaCommonTests.py
new file mode 100644
index 0000000..902030d
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/JavaCommonTests.py
@@ -0,0 +1,582 @@
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import os.path
+import sys
+import unittest
+
+import TestUnit
+
+import SCons.Scanner.IDL
+import SCons.Tool.JavaCommon
+
+
+# Adding trace=trace to any of the parse_jave() calls below will cause
+# the parser to spit out trace messages of the tokens it sees and the
+# attendant transitions.
+
+def trace(token, newstate):
+ from SCons.Debug import Trace
+ statename = newstate.__class__.__name__
+ Trace('token = %s, state = %s\n' % (repr(token), statename))
+
+class parse_javaTestCase(unittest.TestCase):
+
+ def test_bare_bones(self):
+ """Test a bare-bones class"""
+
+ input = """\
+package com.sub.bar;
+
+public class Foo
+{
+
+ public static void main(String[] args)
+ {
+
+ /* This tests a former bug where strings would eat later code. */
+ String hello1 = new String("Hello, world!");
+
+ }
+
+}
+"""
+ pkg_dir, classes = SCons.Tool.JavaCommon.parse_java(input)
+ assert pkg_dir == os.path.join('com', 'sub', 'bar'), pkg_dir
+ assert classes == ['Foo'], classes
+
+
+
+ def test_dollar_sign(self):
+ """Test class names with $ in them"""
+
+ input = """\
+public class BadDep {
+ public void new$rand () {}
+}
+"""
+ pkg_dir, classes = SCons.Tool.JavaCommon.parse_java(input)
+ assert pkg_dir is None, pkg_dir
+ assert classes == ['BadDep'], classes
+
+
+
+ def test_inner_classes(self):
+ """Test parsing various forms of inner classes"""
+
+ input = """\
+class Empty {
+}
+
+interface Listener {
+ public void execute();
+}
+
+public
+class
+Test implements Listener {
+ class Inner {
+ void go() {
+ use(new Listener() {
+ public void execute() {
+ System.out.println("In Inner");
+ }
+ });
+ }
+ String s1 = "class A";
+ String s2 = "new Listener() { }";
+ /* class B */
+ /* new Listener() { } */
+ }
+
+ class Inner2 {
+ Inner2() { Listener l = new Listener(); }
+ }
+
+ /* Make sure this class doesn't get interpreted as an inner class of the previous one, when "new" is used in the previous class. */
+ class Inner3 {
+
+ }
+
+ public static void main(String[] args) {
+ new Test().run();
+ }
+
+ void run() {
+ use(new Listener() {
+ public void execute() {
+ use(new Listener( ) {
+ public void execute() {
+ System.out.println("Inside execute()");
+ }
+ });
+ }
+ });
+
+ new Inner().go();
+ }
+
+ void use(Listener l) {
+ l.execute();
+ }
+}
+
+class Private {
+ void run() {
+ new Listener() {
+ public void execute() {
+ }
+ };
+ }
+}
+"""
+
+ pkg_dir, classes = SCons.Tool.JavaCommon.parse_java(input, '1.4')
+ assert pkg_dir is None, pkg_dir
+ expect = [
+ 'Empty',
+ 'Listener',
+ 'Test$1',
+ 'Test$Inner',
+ 'Test$Inner2',
+ 'Test$Inner3',
+ 'Test$2',
+ 'Test$3',
+ 'Test',
+ 'Private$1',
+ 'Private',
+ ]
+ assert classes == expect, classes
+
+ pkg_dir, classes = SCons.Tool.JavaCommon.parse_java(input, '1.5')
+ assert pkg_dir is None, pkg_dir
+ expect = [
+ 'Empty',
+ 'Listener',
+ 'Test$Inner$1',
+ 'Test$Inner',
+ 'Test$Inner2',
+ 'Test$Inner3',
+ 'Test$1',
+ 'Test$1$1',
+ 'Test',
+ 'Private$1',
+ 'Private',
+ ]
+ assert classes == expect, (expect, classes)
+
+ pkg_dir, classes = SCons.Tool.JavaCommon.parse_java(input, '5')
+ assert pkg_dir is None, pkg_dir
+ expect = [
+ 'Empty',
+ 'Listener',
+ 'Test$Inner$1',
+ 'Test$Inner',
+ 'Test$Inner2',
+ 'Test$Inner3',
+ 'Test$1',
+ 'Test$1$1',
+ 'Test',
+ 'Private$1',
+ 'Private',
+ ]
+ assert classes == expect, (expect, classes)
+
+
+
+ def test_comments(self):
+ """Test a class with comments"""
+
+ input = """\
+package com.sub.foo;
+
+import java.rmi.Naming;
+import java.rmi.RemoteException;
+import java.rmi.RMISecurityManager;
+import java.rmi.server.UnicastRemoteObject;
+
+public class Example1 extends UnicastRemoteObject implements Hello {
+
+ public Example1() throws RemoteException {
+ super();
+ }
+
+ public String sayHello() {
+ return "Hello World!";
+ }
+
+ public static void main(String args[]) {
+ if (System.getSecurityManager() == null) {
+ System.setSecurityManager(new RMISecurityManager());
+ }
+ // a comment
+ try {
+ Example1 obj = new Example1();
+
+ Naming.rebind("//myhost/HelloServer", obj);
+
+ System.out.println("HelloServer bound in registry");
+ } catch (Exception e) {
+ System.out.println("Example1 err: " + e.getMessage());
+ e.printStackTrace();
+ }
+ }
+}
+"""
+
+ pkg_dir, classes = SCons.Tool.JavaCommon.parse_java(input)
+ assert pkg_dir == os.path.join('com', 'sub', 'foo'), pkg_dir
+ assert classes == ['Example1'], classes
+
+
+ def test_arrays(self):
+ """Test arrays of class instances"""
+
+ input = """\
+public class Test {
+ MyClass abc = new MyClass();
+ MyClass xyz = new MyClass();
+ MyClass _array[] = new MyClass[] {
+ abc,
+ xyz
+ }
+}
+"""
+
+ pkg_dir, classes = SCons.Tool.JavaCommon.parse_java(input)
+ assert pkg_dir is None, pkg_dir
+ assert classes == ['Test'], classes
+
+
+
+ def test_backslash(self):
+ """Test backslash handling"""
+
+ input = """\
+public class MyTabs
+{
+ private class MyInternal
+ {
+ }
+ private final static String PATH = "images\\\\";
+}
+"""
+
+ pkg_dir, classes = SCons.Tool.JavaCommon.parse_java(input)
+ assert pkg_dir is None, pkg_dir
+ assert classes == ['MyTabs$MyInternal', 'MyTabs'], classes
+
+
+ def test_enum(self):
+ """Test the Java 1.5 enum keyword"""
+
+ input = """\
+package p;
+public enum a {}
+"""
+
+ pkg_dir, classes = SCons.Tool.JavaCommon.parse_java(input)
+ assert pkg_dir == 'p', pkg_dir
+ assert classes == ['a'], classes
+
+
+ def test_anon_classes(self):
+ """Test anonymous classes"""
+
+ input = """\
+public abstract class TestClass
+{
+ public void completed()
+ {
+ new Thread()
+ {
+ }.start();
+
+ new Thread()
+ {
+ }.start();
+ }
+}
+"""
+
+ pkg_dir, classes = SCons.Tool.JavaCommon.parse_java(input)
+ assert pkg_dir is None, pkg_dir
+ assert classes == ['TestClass$1', 'TestClass$2', 'TestClass'], classes
+
+
+ def test_closing_bracket(self):
+ """Test finding a closing bracket instead of an anonymous class"""
+
+ input = """\
+class TestSCons {
+ public static void main(String[] args) {
+ Foo[] fooArray = new Foo[] { new Foo() };
+ }
+}
+
+class Foo { }
+"""
+
+ pkg_dir, classes = SCons.Tool.JavaCommon.parse_java(input)
+ assert pkg_dir is None, pkg_dir
+ assert classes == ['TestSCons', 'Foo'], classes
+
+
+ def test_dot_class_attributes(self):
+ """Test handling ".class" attributes"""
+
+ input = """\
+public class Test extends Object
+{
+ static {
+ Class c = Object[].class;
+ Object[] s = new Object[] {};
+ }
+}
+"""
+
+ pkg_dir, classes = SCons.Tool.JavaCommon.parse_java(input)
+ assert classes == ['Test'], classes
+
+ input = """\
+public class A {
+ public class B {
+ public void F(Object[] o) {
+ F(new Object[] {Object[].class});
+ }
+ public void G(Object[] o) {
+ F(new Object[] {});
+ }
+ }
+}
+"""
+
+ pkg_dir, classes = SCons.Tool.JavaCommon.parse_java(input)
+ assert pkg_dir is None, pkg_dir
+ assert classes == ['A$B', 'A'], classes
+
+ def test_anonymous_classes_with_parentheses(self):
+ """Test finding anonymous classes marked by parentheses"""
+
+ input = """\
+import java.io.File;
+
+public class Foo {
+ public static void main(String[] args) {
+ File f = new File(
+ new File("a") {
+ public String toString() {
+ return "b";
+ }
+ } to String()
+ ) {
+ public String toString() {
+ return "c";
+ }
+ };
+ }
+}
+"""
+
+ pkg_dir, classes = SCons.Tool.JavaCommon.parse_java(input, '1.4')
+ assert classes == ['Foo$1', 'Foo$2', 'Foo'], classes
+
+ pkg_dir, classes = SCons.Tool.JavaCommon.parse_java(input, '1.5')
+ assert classes == ['Foo$1', 'Foo$1$1', 'Foo'], classes
+
+ pkg_dir, classes = SCons.Tool.JavaCommon.parse_java(input, '6')
+ assert classes == ['Foo$1', 'Foo$1$1', 'Foo'], classes
+
+
+
+ def test_nested_anonymous_inner_classes(self):
+ """Test finding nested anonymous inner classes"""
+
+ input = """\
+// import java.util.*;
+
+public class NestedExample
+{
+ public NestedExample()
+ {
+ Thread t = new Thread() {
+ public void start()
+ {
+ Thread t = new Thread() {
+ public void start()
+ {
+ try {Thread.sleep(200);}
+ catch (Exception e) {}
+ }
+ };
+ while (true)
+ {
+ try {Thread.sleep(200);}
+ catch (Exception e) {}
+ }
+ }
+ };
+ }
+
+
+ public static void main(String argv[])
+ {
+ NestedExample e = new NestedExample();
+ }
+}
+"""
+
+ pkg_dir, classes = SCons.Tool.JavaCommon.parse_java(input, '1.4')
+ expect = [ 'NestedExample$1', 'NestedExample$2', 'NestedExample' ]
+ assert expect == classes, (expect, classes)
+
+ pkg_dir, classes = SCons.Tool.JavaCommon.parse_java(input, '1.5')
+ expect = [ 'NestedExample$1', 'NestedExample$1$1', 'NestedExample' ]
+ assert expect == classes, (expect, classes)
+
+ pkg_dir, classes = SCons.Tool.JavaCommon.parse_java(input, '6')
+ expect = [ 'NestedExample$1', 'NestedExample$1$1', 'NestedExample' ]
+ assert expect == classes, (expect, classes)
+
+ def test_private_inner_class_instantiation(self):
+ """Test anonymous inner class generated by private instantiation"""
+
+ input = """\
+class test
+{
+ test()
+ {
+ super();
+ new inner();
+ }
+
+ static class inner
+ {
+ private inner() {}
+ }
+}
+"""
+
+ # This is what we *should* generate, apparently due to the
+ # private instantiation of the inner class, but don't today.
+ #expect = [ 'test$1', 'test$inner', 'test' ]
+
+ # What our parser currently generates, which doesn't match
+ # what the Java compiler actually generates.
+ expect = [ 'test$inner', 'test' ]
+
+ pkg_dir, classes = SCons.Tool.JavaCommon.parse_java(input, '1.4')
+ assert expect == classes, (expect, classes)
+
+ pkg_dir, classes = SCons.Tool.JavaCommon.parse_java(input, '1.5')
+ assert expect == classes, (expect, classes)
+
+ def test_floating_point_numbers(self):
+ """Test floating-point numbers in the input stream"""
+ input = """
+// Broken.java
+class Broken
+{
+ /**
+ * Detected.
+ */
+ Object anonymousInnerOK = new Runnable() { public void run () {} };
+
+ /**
+ * Detected.
+ */
+ class InnerOK { InnerOK () { } }
+
+ {
+ System.out.println("a number: " + 1000.0 + "");
+ }
+
+ /**
+ * Not detected.
+ */
+ Object anonymousInnerBAD = new Runnable() { public void run () {} };
+
+ /**
+ * Not detected.
+ */
+ class InnerBAD { InnerBAD () { } }
+}
+"""
+
+ expect = ['Broken$1', 'Broken$InnerOK', 'Broken$2', 'Broken$InnerBAD', 'Broken']
+
+ pkg_dir, classes = SCons.Tool.JavaCommon.parse_java(input, '1.4')
+ assert expect == classes, (expect, classes)
+
+ pkg_dir, classes = SCons.Tool.JavaCommon.parse_java(input, '1.5')
+ assert expect == classes, (expect, classes)
+
+
+ def test_genercis(self):
+ """Test that generics don't interfere with detecting anonymous classes"""
+
+ input = """\
+import java.util.Date;
+import java.util.Comparator;
+
+public class Foo
+{
+ public void foo()
+ {
+ Comparator<Date> comp = new Comparator<Date>()
+ {
+ static final long serialVersionUID = 1L;
+ public int compare(Date lhs, Date rhs)
+ {
+ return 0;
+ }
+ };
+ }
+}
+"""
+
+ expect = [ 'Foo$1', 'Foo' ]
+
+ pkg_dir, classes = SCons.Tool.JavaCommon.parse_java(input, '1.6')
+ assert expect == classes, (expect, classes)
+
+ pkg_dir, classes = SCons.Tool.JavaCommon.parse_java(input, '6')
+ assert expect == classes, (expect, classes)
+
+
+
+if __name__ == "__main__":
+ suite = unittest.TestSuite()
+ tclasses = [ parse_javaTestCase ]
+ for tclass in tclasses:
+ names = unittest.getTestCaseNames(tclass, 'test_')
+ suite.addTests(list(map(tclass, names)))
+ TestUnit.run(suite)
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/MSCommon/__init__.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/MSCommon/__init__.py
new file mode 100644
index 0000000..c87bf71
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/MSCommon/__init__.py
@@ -0,0 +1,57 @@
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+__doc__ = """
+Common functions for Microsoft Visual Studio and Visual C/C++.
+"""
+
+import copy
+import os
+import re
+import subprocess
+
+import SCons.Errors
+import SCons.Platform.win32
+import SCons.Util
+
+from SCons.Tool.MSCommon.sdk import mssdk_exists, \
+ mssdk_setup_env
+
+from SCons.Tool.MSCommon.vc import msvc_exists, \
+ msvc_setup_env, \
+ msvc_setup_env_once, \
+ msvc_version_to_maj_min
+
+from SCons.Tool.MSCommon.vs import get_default_version, \
+ get_vs_by_version, \
+ merge_default_version, \
+ msvs_exists, \
+ query_versions
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/MSCommon/arch.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/MSCommon/arch.py
new file mode 100644
index 0000000..9bcc221
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/MSCommon/arch.py
@@ -0,0 +1,67 @@
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+__doc__ = """Module to define supported Windows chip architectures.
+"""
+
+import os
+
+class ArchDefinition(object):
+ """
+ A class for defining architecture-specific settings and logic.
+ """
+ def __init__(self, arch, synonyms=[]):
+ self.arch = arch
+ self.synonyms = synonyms
+
+SupportedArchitectureList = [
+ ArchitectureDefinition(
+ 'x86',
+ ['i386', 'i486', 'i586', 'i686'],
+ ),
+
+ ArchitectureDefinition(
+ 'x86_64',
+ ['AMD64', 'amd64', 'em64t', 'EM64T', 'x86_64'],
+ ),
+
+ ArchitectureDefinition(
+ 'ia64',
+ ['IA64'],
+ ),
+
+ ArchitectureDefinition(
+ 'arm',
+ ['ARM'],
+ ),
+
+]
+
+SupportedArchitectureMap = {}
+for a in SupportedArchitectureList:
+ SupportedArchitectureMap[a.arch] = a
+ for s in a.synonyms:
+ SupportedArchitectureMap[s] = a
+
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/MSCommon/common.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/MSCommon/common.py
new file mode 100644
index 0000000..b60cd5b
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/MSCommon/common.py
@@ -0,0 +1,247 @@
+"""
+Common helper functions for working with the Microsoft tool chain.
+"""
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+from __future__ import print_function
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import copy
+import os
+import subprocess
+import re
+
+import SCons.Util
+
+
+LOGFILE = os.environ.get('SCONS_MSCOMMON_DEBUG')
+if LOGFILE == '-':
+ def debug(message):
+ print(message)
+elif LOGFILE:
+ try:
+ import logging
+ except ImportError:
+ debug = lambda message: open(LOGFILE, 'a').write(message + '\n')
+ else:
+ logging.basicConfig(filename=LOGFILE, level=logging.DEBUG)
+ debug = logging.debug
+else:
+ debug = lambda x: None
+
+
+_is_win64 = None
+
+def is_win64():
+ """Return true if running on windows 64 bits.
+
+ Works whether python itself runs in 64 bits or 32 bits."""
+ # Unfortunately, python does not provide a useful way to determine
+ # if the underlying Windows OS is 32-bit or 64-bit. Worse, whether
+ # the Python itself is 32-bit or 64-bit affects what it returns,
+ # so nothing in sys.* or os.* help.
+
+ # Apparently the best solution is to use env vars that Windows
+ # sets. If PROCESSOR_ARCHITECTURE is not x86, then the python
+ # process is running in 64 bit mode (on a 64-bit OS, 64-bit
+ # hardware, obviously).
+ # If this python is 32-bit but the OS is 64, Windows will set
+ # ProgramW6432 and PROCESSOR_ARCHITEW6432 to non-null.
+ # (Checking for HKLM\Software\Wow6432Node in the registry doesn't
+ # work, because some 32-bit installers create it.)
+ global _is_win64
+ if _is_win64 is None:
+ # I structured these tests to make it easy to add new ones or
+ # add exceptions in the future, because this is a bit fragile.
+ _is_win64 = False
+ if os.environ.get('PROCESSOR_ARCHITECTURE', 'x86') != 'x86':
+ _is_win64 = True
+ if os.environ.get('PROCESSOR_ARCHITEW6432'):
+ _is_win64 = True
+ if os.environ.get('ProgramW6432'):
+ _is_win64 = True
+ return _is_win64
+
+
+def read_reg(value, hkroot=SCons.Util.HKEY_LOCAL_MACHINE):
+ return SCons.Util.RegGetValue(hkroot, value)[0]
+
+def has_reg(value):
+ """Return True if the given key exists in HKEY_LOCAL_MACHINE, False
+ otherwise."""
+ try:
+ SCons.Util.RegOpenKeyEx(SCons.Util.HKEY_LOCAL_MACHINE, value)
+ ret = True
+ except SCons.Util.WinError:
+ ret = False
+ return ret
+
+# Functions for fetching environment variable settings from batch files.
+
+def normalize_env(env, keys, force=False):
+ """Given a dictionary representing a shell environment, add the variables
+ from os.environ needed for the processing of .bat files; the keys are
+ controlled by the keys argument.
+
+ It also makes sure the environment values are correctly encoded.
+
+ If force=True, then all of the key values that exist are copied
+ into the returned dictionary. If force=false, values are only
+ copied if the key does not already exist in the copied dictionary.
+
+ Note: the environment is copied."""
+ normenv = {}
+ if env:
+ for k in list(env.keys()):
+ normenv[k] = copy.deepcopy(env[k])
+
+ for k in keys:
+ if k in os.environ and (force or not k in normenv):
+ normenv[k] = os.environ[k]
+
+ # This shouldn't be necessary, since the default environment should include system32,
+ # but keep this here to be safe, since it's needed to find reg.exe which the MSVC
+ # bat scripts use.
+ sys32_dir = os.path.join(os.environ.get("SystemRoot",
+ os.environ.get("windir", r"C:\Windows\system32")),
+ "System32")
+
+ if sys32_dir not in normenv['PATH']:
+ normenv['PATH'] = normenv['PATH'] + os.pathsep + sys32_dir
+
+ # Without Wbem in PATH, vcvarsall.bat has a "'wmic' is not recognized"
+ # error starting with Visual Studio 2017, although the script still
+ # seems to work anyway.
+ sys32_wbem_dir = os.path.join(sys32_dir, 'Wbem')
+ if sys32_wbem_dir not in normenv['PATH']:
+ normenv['PATH'] = normenv['PATH'] + os.pathsep + sys32_wbem_dir
+
+ debug("PATH: %s"%normenv['PATH'])
+
+ return normenv
+
+def get_output(vcbat, args = None, env = None):
+ """Parse the output of given bat file, with given args."""
+
+ if env is None:
+ # Create a blank environment, for use in launching the tools
+ env = SCons.Environment.Environment(tools=[])
+
+ # TODO: This is a hard-coded list of the variables that (may) need
+ # to be imported from os.environ[] for v[sc]*vars*.bat file
+ # execution to work. This list should really be either directly
+ # controlled by vc.py, or else derived from the common_tools_var
+ # settings in vs.py.
+ vs_vc_vars = [
+ 'COMSPEC',
+ # VS100 and VS110: Still set, but modern MSVC setup scripts will
+ # discard these if registry has values. However Intel compiler setup
+ # script still requires these as of 2013/2014.
+ 'VS140COMNTOOLS',
+ 'VS120COMNTOOLS',
+ 'VS110COMNTOOLS',
+ 'VS100COMNTOOLS',
+ 'VS90COMNTOOLS',
+ 'VS80COMNTOOLS',
+ 'VS71COMNTOOLS',
+ 'VS70COMNTOOLS',
+ 'VS60COMNTOOLS',
+ ]
+ env['ENV'] = normalize_env(env['ENV'], vs_vc_vars, force=False)
+
+ if args:
+ debug("Calling '%s %s'" % (vcbat, args))
+ popen = SCons.Action._subproc(env,
+ '"%s" %s & set' % (vcbat, args),
+ stdin='devnull',
+ stdout=subprocess.PIPE,
+ stderr=subprocess.PIPE)
+ else:
+ debug("Calling '%s'" % vcbat)
+ popen = SCons.Action._subproc(env,
+ '"%s" & set' % vcbat,
+ stdin='devnull',
+ stdout=subprocess.PIPE,
+ stderr=subprocess.PIPE)
+
+ # Use the .stdout and .stderr attributes directly because the
+ # .communicate() method uses the threading module on Windows
+ # and won't work under Pythons not built with threading.
+ stdout = popen.stdout.read()
+ stderr = popen.stderr.read()
+
+ # Extra debug logic, uncomment if necessary
+# debug('get_output():stdout:%s'%stdout)
+# debug('get_output():stderr:%s'%stderr)
+
+ if stderr:
+ # TODO: find something better to do with stderr;
+ # this at least prevents errors from getting swallowed.
+ import sys
+ sys.stderr.write(stderr)
+ if popen.wait() != 0:
+ raise IOError(stderr.decode("mbcs"))
+
+ output = stdout.decode("mbcs")
+ return output
+
+def parse_output(output, keep=("INCLUDE", "LIB", "LIBPATH", "PATH")):
+ """
+ Parse output from running visual c++/studios vcvarsall.bat and running set
+ To capture the values listed in keep
+ """
+
+ # dkeep is a dict associating key: path_list, where key is one item from
+ # keep, and pat_list the associated list of paths
+ dkeep = dict([(i, []) for i in keep])
+
+ # rdk will keep the regex to match the .bat file output line starts
+ rdk = {}
+ for i in keep:
+ rdk[i] = re.compile('%s=(.*)' % i, re.I)
+
+ def add_env(rmatch, key, dkeep=dkeep):
+ path_list = rmatch.group(1).split(os.pathsep)
+ for path in path_list:
+ # Do not add empty paths (when a var ends with ;)
+ if path:
+ # XXX: For some reason, VC98 .bat file adds "" around the PATH
+ # values, and it screws up the environment later, so we strip
+ # it.
+ path = path.strip('"')
+ dkeep[key].append(str(path))
+
+ for line in output.splitlines():
+ for k, value in rdk.items():
+ match = value.match(line)
+ if match:
+ add_env(match, k)
+
+ return dkeep
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/MSCommon/netframework.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/MSCommon/netframework.py
new file mode 100644
index 0000000..787d008
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/MSCommon/netframework.py
@@ -0,0 +1,83 @@
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+__doc__ = """
+"""
+
+import os
+import re
+import SCons.Util
+
+from .common import read_reg, debug
+
+# Original value recorded by dcournapeau
+_FRAMEWORKDIR_HKEY_ROOT = r'Software\Microsoft\.NETFramework\InstallRoot'
+# On SGK's system
+_FRAMEWORKDIR_HKEY_ROOT = r'Software\Microsoft\Microsoft SDKs\.NETFramework\v2.0\InstallationFolder'
+
+def find_framework_root():
+ # XXX: find it from environment (FrameworkDir)
+ try:
+ froot = read_reg(_FRAMEWORKDIR_HKEY_ROOT)
+ debug("Found framework install root in registry: {}".format(froot))
+ except SCons.Util.WinError as e:
+ debug("Could not read reg key {}".format(_FRAMEWORKDIR_HKEY_ROOT))
+ return None
+
+ if not os.path.exists(froot):
+ debug("{} not found on fs".format(froot))
+ return None
+
+ return froot
+
+def query_versions():
+ froot = find_framework_root()
+ if froot:
+ contents = os.listdir(froot)
+
+ l = re.compile('v[0-9]+.*')
+ versions = [e for e in contents if l.match(e)]
+
+ def versrt(a,b):
+ # since version numbers aren't really floats...
+ aa = a[1:]
+ bb = b[1:]
+ aal = aa.split('.')
+ bbl = bb.split('.')
+ # sequence comparison in python is lexicographical
+ # which is exactly what we want.
+ # Note we sort backwards so the highest version is first.
+ return cmp(bbl,aal)
+
+ versions.sort(versrt)
+ else:
+ versions = []
+
+ return versions
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/MSCommon/sdk.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/MSCommon/sdk.py
new file mode 100644
index 0000000..43b0272
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/MSCommon/sdk.py
@@ -0,0 +1,403 @@
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+__doc__ = """Module to detect the Platform/Windows SDK
+
+PSDK 2003 R1 is the earliest version detected.
+"""
+
+import os
+
+import SCons.Errors
+import SCons.Util
+
+from . import common
+
+debug = common.debug
+
+# SDK Checks. This is of course a mess as everything else on MS platforms. Here
+# is what we do to detect the SDK:
+#
+# For Windows SDK >= 6.0: just look into the registry entries:
+# HKLM\Software\Microsoft\Microsoft SDKs\Windows
+# All the keys in there are the available versions.
+#
+# For Platform SDK before 6.0 (2003 server R1 and R2, etc...), there does not
+# seem to be any sane registry key, so the precise location is hardcoded.
+#
+# For versions below 2003R1, it seems the PSDK is included with Visual Studio?
+#
+# Also, per the following:
+# http://benjamin.smedbergs.us/blog/tag/atl/
+# VC++ Professional comes with the SDK, VC++ Express does not.
+
+# Location of the SDK (checked for 6.1 only)
+_CURINSTALLED_SDK_HKEY_ROOT = \
+ r"Software\Microsoft\Microsoft SDKs\Windows\CurrentInstallFolder"
+
+
+class SDKDefinition(object):
+ """
+ An abstract base class for trying to find installed SDK directories.
+ """
+ def __init__(self, version, **kw):
+ self.version = version
+ self.__dict__.update(kw)
+
+ def find_sdk_dir(self):
+ """Try to find the MS SDK from the registry.
+
+ Return None if failed or the directory does not exist.
+ """
+ if not SCons.Util.can_read_reg:
+ debug('find_sdk_dir(): can not read registry')
+ return None
+
+ hkey = self.HKEY_FMT % self.hkey_data
+ debug('find_sdk_dir(): checking registry:{}'.format(hkey))
+
+ try:
+ sdk_dir = common.read_reg(hkey)
+ except SCons.Util.WinError as e:
+ debug('find_sdk_dir(): no SDK registry key {}'.format(repr(hkey)))
+ return None
+
+ debug('find_sdk_dir(): Trying SDK Dir: {}'.format(sdk_dir))
+
+ if not os.path.exists(sdk_dir):
+ debug('find_sdk_dir(): {} not on file system'.format(sdk_dir))
+ return None
+
+ ftc = os.path.join(sdk_dir, self.sanity_check_file)
+ if not os.path.exists(ftc):
+ debug("find_sdk_dir(): sanity check {} not found".format(ftc))
+ return None
+
+ return sdk_dir
+
+ def get_sdk_dir(self):
+ """Return the MSSSDK given the version string."""
+ try:
+ return self._sdk_dir
+ except AttributeError:
+ sdk_dir = self.find_sdk_dir()
+ self._sdk_dir = sdk_dir
+ return sdk_dir
+
+ def get_sdk_vc_script(self,host_arch, target_arch):
+ """ Return the script to initialize the VC compiler installed by SDK
+ """
+
+ if (host_arch == 'amd64' and target_arch == 'x86'):
+ # No cross tools needed compiling 32 bits on 64 bit machine
+ host_arch=target_arch
+
+ arch_string=target_arch
+ if (host_arch != target_arch):
+ arch_string='%s_%s'%(host_arch,target_arch)
+
+ debug("sdk.py: get_sdk_vc_script():arch_string:%s host_arch:%s target_arch:%s"%(arch_string,
+ host_arch,
+ target_arch))
+ file=self.vc_setup_scripts.get(arch_string,None)
+ debug("sdk.py: get_sdk_vc_script():file:%s"%file)
+ return file
+
+class WindowsSDK(SDKDefinition):
+ """
+ A subclass for trying to find installed Windows SDK directories.
+ """
+ HKEY_FMT = r'Software\Microsoft\Microsoft SDKs\Windows\v%s\InstallationFolder'
+ def __init__(self, *args, **kw):
+ SDKDefinition.__init__(self, *args, **kw)
+ self.hkey_data = self.version
+
+class PlatformSDK(SDKDefinition):
+ """
+ A subclass for trying to find installed Platform SDK directories.
+ """
+ HKEY_FMT = r'Software\Microsoft\MicrosoftSDK\InstalledSDKS\%s\Install Dir'
+ def __init__(self, *args, **kw):
+ SDKDefinition.__init__(self, *args, **kw)
+ self.hkey_data = self.uuid
+
+#
+# The list of VC initialization scripts installed by the SDK
+# These should be tried if the vcvarsall.bat TARGET_ARCH fails
+preSDK61VCSetupScripts = { 'x86' : r'bin\vcvars32.bat',
+ 'amd64' : r'bin\vcvarsamd64.bat',
+ 'x86_amd64': r'bin\vcvarsx86_amd64.bat',
+ 'x86_ia64' : r'bin\vcvarsx86_ia64.bat',
+ 'ia64' : r'bin\vcvarsia64.bat'}
+
+SDK61VCSetupScripts = {'x86' : r'bin\vcvars32.bat',
+ 'amd64' : r'bin\amd64\vcvarsamd64.bat',
+ 'x86_amd64': r'bin\x86_amd64\vcvarsx86_amd64.bat',
+ 'x86_ia64' : r'bin\x86_ia64\vcvarsx86_ia64.bat',
+ 'ia64' : r'bin\ia64\vcvarsia64.bat'}
+
+SDK70VCSetupScripts = { 'x86' : r'bin\vcvars32.bat',
+ 'amd64' : r'bin\vcvars64.bat',
+ 'x86_amd64': r'bin\vcvarsx86_amd64.bat',
+ 'x86_ia64' : r'bin\vcvarsx86_ia64.bat',
+ 'ia64' : r'bin\vcvarsia64.bat'}
+
+SDK100VCSetupScripts = {'x86' : r'bin\vcvars32.bat',
+ 'amd64' : r'bin\vcvars64.bat',
+ 'x86_amd64': r'bin\x86_amd64\vcvarsx86_amd64.bat',
+ 'x86_arm' : r'bin\x86_arm\vcvarsx86_arm.bat'}
+
+
+# The list of support SDKs which we know how to detect.
+#
+# The first SDK found in the list is the one used by default if there
+# are multiple SDKs installed. Barring good reasons to the contrary,
+# this means we should list SDKs from most recent to oldest.
+#
+# If you update this list, update the documentation in Tool/mssdk.xml.
+SupportedSDKList = [
+ WindowsSDK('10.0',
+ sanity_check_file=r'bin\SetEnv.Cmd',
+ include_subdir='include',
+ lib_subdir={
+ 'x86' : ['lib'],
+ 'x86_64' : [r'lib\x64'],
+ 'ia64' : [r'lib\ia64'],
+ },
+ vc_setup_scripts = SDK70VCSetupScripts,
+ ),
+ WindowsSDK('7.1',
+ sanity_check_file=r'bin\SetEnv.Cmd',
+ include_subdir='include',
+ lib_subdir={
+ 'x86' : ['lib'],
+ 'x86_64' : [r'lib\x64'],
+ 'ia64' : [r'lib\ia64'],
+ },
+ vc_setup_scripts = SDK70VCSetupScripts,
+ ),
+ WindowsSDK('7.0A',
+ sanity_check_file=r'bin\SetEnv.Cmd',
+ include_subdir='include',
+ lib_subdir={
+ 'x86' : ['lib'],
+ 'x86_64' : [r'lib\x64'],
+ 'ia64' : [r'lib\ia64'],
+ },
+ vc_setup_scripts = SDK70VCSetupScripts,
+ ),
+ WindowsSDK('7.0',
+ sanity_check_file=r'bin\SetEnv.Cmd',
+ include_subdir='include',
+ lib_subdir={
+ 'x86' : ['lib'],
+ 'x86_64' : [r'lib\x64'],
+ 'ia64' : [r'lib\ia64'],
+ },
+ vc_setup_scripts = SDK70VCSetupScripts,
+ ),
+ WindowsSDK('6.1',
+ sanity_check_file=r'bin\SetEnv.Cmd',
+ include_subdir='include',
+ lib_subdir={
+ 'x86' : ['lib'],
+ 'x86_64' : [r'lib\x64'],
+ 'ia64' : [r'lib\ia64'],
+ },
+ vc_setup_scripts = SDK61VCSetupScripts,
+ ),
+
+ WindowsSDK('6.0A',
+ sanity_check_file=r'include\windows.h',
+ include_subdir='include',
+ lib_subdir={
+ 'x86' : ['lib'],
+ 'x86_64' : [r'lib\x64'],
+ 'ia64' : [r'lib\ia64'],
+ },
+ vc_setup_scripts = preSDK61VCSetupScripts,
+ ),
+
+ WindowsSDK('6.0',
+ sanity_check_file=r'bin\gacutil.exe',
+ include_subdir='include',
+ lib_subdir='lib',
+ vc_setup_scripts = preSDK61VCSetupScripts,
+ ),
+
+ PlatformSDK('2003R2',
+ sanity_check_file=r'SetEnv.Cmd',
+ uuid="D2FF9F89-8AA2-4373-8A31-C838BF4DBBE1",
+ vc_setup_scripts = preSDK61VCSetupScripts,
+ ),
+
+ PlatformSDK('2003R1',
+ sanity_check_file=r'SetEnv.Cmd',
+ uuid="8F9E5EF3-A9A5-491B-A889-C58EFFECE8B3",
+ vc_setup_scripts = preSDK61VCSetupScripts,
+ ),
+]
+
+SupportedSDKMap = {}
+for sdk in SupportedSDKList:
+ SupportedSDKMap[sdk.version] = sdk
+
+
+# Finding installed SDKs isn't cheap, because it goes not only to the
+# registry but also to the disk to sanity-check that there is, in fact,
+# an SDK installed there and that the registry entry isn't just stale.
+# Find this information once, when requested, and cache it.
+
+InstalledSDKList = None
+InstalledSDKMap = None
+
+def get_installed_sdks():
+ global InstalledSDKList
+ global InstalledSDKMap
+ debug('sdk.py:get_installed_sdks()')
+ if InstalledSDKList is None:
+ InstalledSDKList = []
+ InstalledSDKMap = {}
+ for sdk in SupportedSDKList:
+ debug('MSCommon/sdk.py: trying to find SDK %s' % sdk.version)
+ if sdk.get_sdk_dir():
+ debug('MSCommon/sdk.py:found SDK %s' % sdk.version)
+ InstalledSDKList.append(sdk)
+ InstalledSDKMap[sdk.version] = sdk
+ return InstalledSDKList
+
+
+# We may be asked to update multiple construction environments with
+# SDK information. When doing this, we check on-disk for whether
+# the SDK has 'mfc' and 'atl' subdirectories. Since going to disk
+# is expensive, cache results by directory.
+
+SDKEnvironmentUpdates = {}
+
+def set_sdk_by_directory(env, sdk_dir):
+ global SDKEnvironmentUpdates
+ debug('set_sdk_by_directory: Using dir:%s'%sdk_dir)
+ try:
+ env_tuple_list = SDKEnvironmentUpdates[sdk_dir]
+ except KeyError:
+ env_tuple_list = []
+ SDKEnvironmentUpdates[sdk_dir] = env_tuple_list
+
+ include_path = os.path.join(sdk_dir, 'include')
+ mfc_path = os.path.join(include_path, 'mfc')
+ atl_path = os.path.join(include_path, 'atl')
+
+ if os.path.exists(mfc_path):
+ env_tuple_list.append(('INCLUDE', mfc_path))
+ if os.path.exists(atl_path):
+ env_tuple_list.append(('INCLUDE', atl_path))
+ env_tuple_list.append(('INCLUDE', include_path))
+
+ env_tuple_list.append(('LIB', os.path.join(sdk_dir, 'lib')))
+ env_tuple_list.append(('LIBPATH', os.path.join(sdk_dir, 'lib')))
+ env_tuple_list.append(('PATH', os.path.join(sdk_dir, 'bin')))
+
+ for variable, directory in env_tuple_list:
+ env.PrependENVPath(variable, directory)
+
+def get_sdk_by_version(mssdk):
+ if mssdk not in SupportedSDKMap:
+ raise SCons.Errors.UserError("SDK version {} is not supported".format(repr(mssdk)))
+ get_installed_sdks()
+ return InstalledSDKMap.get(mssdk)
+
+def get_default_sdk():
+ """Set up the default Platform/Windows SDK."""
+ get_installed_sdks()
+ if not InstalledSDKList:
+ return None
+ return InstalledSDKList[0]
+
+def mssdk_setup_env(env):
+ debug('sdk.py:mssdk_setup_env()')
+ if 'MSSDK_DIR' in env:
+ sdk_dir = env['MSSDK_DIR']
+ if sdk_dir is None:
+ return
+ sdk_dir = env.subst(sdk_dir)
+ debug('sdk.py:mssdk_setup_env: Using MSSDK_DIR:{}'.format(sdk_dir))
+ elif 'MSSDK_VERSION' in env:
+ sdk_version = env['MSSDK_VERSION']
+ if sdk_version is None:
+ msg = "SDK version is specified as None"
+ raise SCons.Errors.UserError(msg)
+ sdk_version = env.subst(sdk_version)
+ mssdk = get_sdk_by_version(sdk_version)
+ if mssdk is None:
+ msg = "SDK version %s is not installed" % sdk_version
+ raise SCons.Errors.UserError(msg)
+ sdk_dir = mssdk.get_sdk_dir()
+ debug('sdk.py:mssdk_setup_env: Using MSSDK_VERSION:%s'%sdk_dir)
+ elif 'MSVS_VERSION' in env:
+ msvs_version = env['MSVS_VERSION']
+ debug('sdk.py:mssdk_setup_env:Getting MSVS_VERSION from env:%s'%msvs_version)
+ if msvs_version is None:
+ debug('sdk.py:mssdk_setup_env thinks msvs_version is None')
+ return
+ msvs_version = env.subst(msvs_version)
+ from . import vs
+ msvs = vs.get_vs_by_version(msvs_version)
+ debug('sdk.py:mssdk_setup_env:msvs is :%s'%msvs)
+ if not msvs:
+ debug('sdk.py:mssdk_setup_env: no VS version detected, bailingout:%s'%msvs)
+ return
+ sdk_version = msvs.sdk_version
+ debug('sdk.py:msvs.sdk_version is %s'%sdk_version)
+ if not sdk_version:
+ return
+ mssdk = get_sdk_by_version(sdk_version)
+ if not mssdk:
+ mssdk = get_default_sdk()
+ if not mssdk:
+ return
+ sdk_dir = mssdk.get_sdk_dir()
+ debug('sdk.py:mssdk_setup_env: Using MSVS_VERSION:%s'%sdk_dir)
+ else:
+ mssdk = get_default_sdk()
+ if not mssdk:
+ return
+ sdk_dir = mssdk.get_sdk_dir()
+ debug('sdk.py:mssdk_setup_env: not using any env values. sdk_dir:%s'%sdk_dir)
+
+ set_sdk_by_directory(env, sdk_dir)
+
+ #print "No MSVS_VERSION: this is likely to be a bug"
+
+def mssdk_exists(version=None):
+ sdks = get_installed_sdks()
+ if version is None:
+ return len(sdks) > 0
+ return version in sdks
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/MSCommon/vc.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/MSCommon/vc.py
new file mode 100644
index 0000000..53bd397
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/MSCommon/vc.py
@@ -0,0 +1,573 @@
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+# TODO:
+# * supported arch for versions: for old versions of batch file without
+# argument, giving bogus argument cannot be detected, so we have to hardcode
+# this here
+# * print warning when msvc version specified but not found
+# * find out why warning do not print
+# * test on 64 bits XP + VS 2005 (and VS 6 if possible)
+# * SDK
+# * Assembly
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+__doc__ = """Module for Visual C/C++ detection and configuration.
+"""
+import SCons.compat
+import SCons.Util
+
+import subprocess
+import os
+import platform
+from string import digits as string_digits
+
+import SCons.Warnings
+
+from . import common
+
+debug = common.debug
+
+from . import sdk
+
+get_installed_sdks = sdk.get_installed_sdks
+
+
+class VisualCException(Exception):
+ pass
+
+class UnsupportedVersion(VisualCException):
+ pass
+
+class UnsupportedArch(VisualCException):
+ pass
+
+class MissingConfiguration(VisualCException):
+ pass
+
+class NoVersionFound(VisualCException):
+ pass
+
+class BatchFileExecutionError(VisualCException):
+ pass
+
+# Dict to 'canonalize' the arch
+_ARCH_TO_CANONICAL = {
+ "amd64" : "amd64",
+ "emt64" : "amd64",
+ "i386" : "x86",
+ "i486" : "x86",
+ "i586" : "x86",
+ "i686" : "x86",
+ "ia64" : "ia64",
+ "itanium" : "ia64",
+ "x86" : "x86",
+ "x86_64" : "amd64",
+ "x86_amd64" : "x86_amd64", # Cross compile to 64 bit from 32bits
+}
+
+# Given a (host, target) tuple, return the argument for the bat file. Both host
+# and targets should be canonalized.
+_HOST_TARGET_ARCH_TO_BAT_ARCH = {
+ ("x86", "x86"): "x86",
+ ("x86", "amd64"): "x86_amd64",
+ ("x86", "x86_amd64"): "x86_amd64",
+ ("amd64", "x86_amd64"): "x86_amd64", # This is present in (at least) VS2012 express
+ ("amd64", "amd64"): "amd64",
+ ("amd64", "x86"): "x86",
+ ("x86", "ia64"): "x86_ia64"
+}
+
+def get_host_target(env):
+ debug('vc.py:get_host_target()')
+
+ host_platform = env.get('HOST_ARCH')
+ if not host_platform:
+ host_platform = platform.machine()
+ # TODO(2.5): the native Python platform.machine() function returns
+ # '' on all Python versions before 2.6, after which it also uses
+ # PROCESSOR_ARCHITECTURE.
+ if not host_platform:
+ host_platform = os.environ.get('PROCESSOR_ARCHITECTURE', '')
+
+ # Retain user requested TARGET_ARCH
+ req_target_platform = env.get('TARGET_ARCH')
+ debug('vc.py:get_host_target() req_target_platform:%s'%req_target_platform)
+
+ if req_target_platform:
+ # If user requested a specific platform then only try that one.
+ target_platform = req_target_platform
+ else:
+ target_platform = host_platform
+
+ try:
+ host = _ARCH_TO_CANONICAL[host_platform.lower()]
+ except KeyError as e:
+ msg = "Unrecognized host architecture %s"
+ raise ValueError(msg % repr(host_platform))
+
+ try:
+ target = _ARCH_TO_CANONICAL[target_platform.lower()]
+ except KeyError as e:
+ all_archs = str(list(_ARCH_TO_CANONICAL.keys()))
+ raise ValueError("Unrecognized target architecture %s\n\tValid architectures: %s" % (target_platform, all_archs))
+
+ return (host, target,req_target_platform)
+
+# If you update this, update SupportedVSList in Tool/MSCommon/vs.py, and the
+# MSVC_VERSION documentation in Tool/msvc.xml.
+_VCVER = ["14.1", "14.0", "14.0Exp", "12.0", "12.0Exp", "11.0", "11.0Exp", "10.0", "10.0Exp", "9.0", "9.0Exp","8.0", "8.0Exp","7.1", "7.0", "6.0"]
+
+_VCVER_TO_PRODUCT_DIR = {
+ '14.1' : [
+ (SCons.Util.HKEY_LOCAL_MACHINE, r'')], # Visual Studio 2017 doesn't set this registry key anymore
+ '14.0' : [
+ (SCons.Util.HKEY_LOCAL_MACHINE, r'Microsoft\VisualStudio\14.0\Setup\VC\ProductDir')],
+ '14.0Exp' : [
+ (SCons.Util.HKEY_LOCAL_MACHINE, r'Microsoft\VCExpress\14.0\Setup\VC\ProductDir')],
+ '12.0' : [
+ (SCons.Util.HKEY_LOCAL_MACHINE, r'Microsoft\VisualStudio\12.0\Setup\VC\ProductDir'),
+ ],
+ '12.0Exp' : [
+ (SCons.Util.HKEY_LOCAL_MACHINE, r'Microsoft\VCExpress\12.0\Setup\VC\ProductDir'),
+ ],
+ '11.0': [
+ (SCons.Util.HKEY_LOCAL_MACHINE, r'Microsoft\VisualStudio\11.0\Setup\VC\ProductDir'),
+ ],
+ '11.0Exp' : [
+ (SCons.Util.HKEY_LOCAL_MACHINE, r'Microsoft\VCExpress\11.0\Setup\VC\ProductDir'),
+ ],
+ '10.0': [
+ (SCons.Util.HKEY_LOCAL_MACHINE, r'Microsoft\VisualStudio\10.0\Setup\VC\ProductDir'),
+ ],
+ '10.0Exp' : [
+ (SCons.Util.HKEY_LOCAL_MACHINE, r'Microsoft\VCExpress\10.0\Setup\VC\ProductDir'),
+ ],
+ '9.0': [
+ (SCons.Util.HKEY_CURRENT_USER, r'Microsoft\DevDiv\VCForPython\9.0\installdir',),
+ (SCons.Util.HKEY_LOCAL_MACHINE, r'Microsoft\VisualStudio\9.0\Setup\VC\ProductDir',),
+ ],
+ '9.0Exp' : [
+ (SCons.Util.HKEY_LOCAL_MACHINE, r'Microsoft\VCExpress\9.0\Setup\VC\ProductDir'),
+ ],
+ '8.0': [
+ (SCons.Util.HKEY_LOCAL_MACHINE, r'Microsoft\VisualStudio\8.0\Setup\VC\ProductDir'),
+ ],
+ '8.0Exp': [
+ (SCons.Util.HKEY_LOCAL_MACHINE, r'Microsoft\VCExpress\8.0\Setup\VC\ProductDir'),
+ ],
+ '7.1': [
+ (SCons.Util.HKEY_LOCAL_MACHINE, r'Microsoft\VisualStudio\7.1\Setup\VC\ProductDir'),
+ ],
+ '7.0': [
+ (SCons.Util.HKEY_LOCAL_MACHINE, r'Microsoft\VisualStudio\7.0\Setup\VC\ProductDir'),
+ ],
+ '6.0': [
+ (SCons.Util.HKEY_LOCAL_MACHINE, r'Microsoft\VisualStudio\6.0\Setup\Microsoft Visual C++\ProductDir'),
+ ]
+}
+
+def msvc_version_to_maj_min(msvc_version):
+ msvc_version_numeric = ''.join([x for x in msvc_version if x in string_digits + '.'])
+
+ t = msvc_version_numeric.split(".")
+ if not len(t) == 2:
+ raise ValueError("Unrecognized version %s (%s)" % (msvc_version,msvc_version_numeric))
+ try:
+ maj = int(t[0])
+ min = int(t[1])
+ return maj, min
+ except ValueError as e:
+ raise ValueError("Unrecognized version %s (%s)" % (msvc_version,msvc_version_numeric))
+
+def is_host_target_supported(host_target, msvc_version):
+ """Return True if the given (host, target) tuple is supported given the
+ msvc version.
+
+ Parameters
+ ----------
+ host_target: tuple
+ tuple of (canonalized) host-target, e.g. ("x86", "amd64") for cross
+ compilation from 32 bits windows to 64 bits.
+ msvc_version: str
+ msvc version (major.minor, e.g. 10.0)
+
+ Note
+ ----
+ This only check whether a given version *may* support the given (host,
+ target), not that the toolchain is actually present on the machine.
+ """
+ # We assume that any Visual Studio version supports x86 as a target
+ if host_target[1] != "x86":
+ maj, min = msvc_version_to_maj_min(msvc_version)
+ if maj < 8:
+ return False
+
+ return True
+
+
+def find_vc_pdir_vswhere(msvc_version):
+ """
+ Find the MSVC product directory using vswhere.exe .
+ Run it asking for specified version and get MSVS install location
+ :param msvc_version:
+ :return: MSVC install dir
+ """
+ vswhere_path = os.path.join(
+ 'C:\\',
+ 'Program Files (x86)',
+ 'Microsoft Visual Studio',
+ 'Installer',
+ 'vswhere.exe'
+ )
+ vswhere_cmd = [vswhere_path, '-version', msvc_version, '-property', 'installationPath']
+
+ if os.path.exists(vswhere_path):
+ sp = subprocess.Popen(vswhere_cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
+ vsdir, err = sp.communicate()
+ vsdir = vsdir.decode("mbcs")
+ vsdir = vsdir.rstrip()
+ vc_pdir = os.path.join(vsdir, 'VC')
+ return vc_pdir
+ else:
+ # No vswhere on system, no install info available
+ return None
+
+
+def find_vc_pdir(msvc_version):
+ """Try to find the product directory for the given
+ version.
+
+ Note
+ ----
+ If for some reason the requested version could not be found, an
+ exception which inherits from VisualCException will be raised."""
+ root = 'Software\\'
+ try:
+ hkeys = _VCVER_TO_PRODUCT_DIR[msvc_version]
+ except KeyError:
+ debug("Unknown version of MSVC: %s" % msvc_version)
+ raise UnsupportedVersion("Unknown version %s" % msvc_version)
+
+ for hkroot, key in hkeys:
+ try:
+ comps = None
+ if not key:
+ comps = find_vc_pdir_vswhere(msvc_version)
+ if not comps:
+ debug('find_vc_dir(): no VC found via vswhere for version {}'.format(repr(key)))
+ raise SCons.Util.WinError
+ else:
+ if common.is_win64():
+ try:
+ # ordinally at win64, try Wow6432Node first.
+ comps = common.read_reg(root + 'Wow6432Node\\' + key, hkroot)
+ except SCons.Util.WinError as e:
+ # at Microsoft Visual Studio for Python 2.7, value is not in Wow6432Node
+ pass
+ if not comps:
+ # not Win64, or Microsoft Visual Studio for Python 2.7
+ comps = common.read_reg(root + key, hkroot)
+ except SCons.Util.WinError as e:
+ debug('find_vc_dir(): no VC registry key {}'.format(repr(key)))
+ else:
+ debug('find_vc_dir(): found VC in registry: {}'.format(comps))
+ if os.path.exists(comps):
+ return comps
+ else:
+ debug('find_vc_dir(): reg says dir is {}, but it does not exist. (ignoring)'.format(comps))
+ raise MissingConfiguration("registry dir {} not found on the filesystem".format(comps))
+ return None
+
+def find_batch_file(env,msvc_version,host_arch,target_arch):
+ """
+ Find the location of the batch script which should set up the compiler
+ for any TARGET_ARCH whose compilers were installed by Visual Studio/VCExpress
+ """
+ pdir = find_vc_pdir(msvc_version)
+ if pdir is None:
+ raise NoVersionFound("No version of Visual Studio found")
+
+ debug('vc.py: find_batch_file() pdir:{}'.format(pdir))
+
+ # filter out e.g. "Exp" from the version name
+ msvc_ver_numeric = ''.join([x for x in msvc_version if x in string_digits + "."])
+ vernum = float(msvc_ver_numeric)
+ if 7 <= vernum < 8:
+ pdir = os.path.join(pdir, os.pardir, "Common7", "Tools")
+ batfilename = os.path.join(pdir, "vsvars32.bat")
+ elif vernum < 7:
+ pdir = os.path.join(pdir, "Bin")
+ batfilename = os.path.join(pdir, "vcvars32.bat")
+ elif 8 <= vernum <= 14:
+ batfilename = os.path.join(pdir, "vcvarsall.bat")
+ else: # vernum >= 14.1 VS2017 and above
+ batfilename = os.path.join(pdir, "Auxiliary", "Build", "vcvarsall.bat")
+
+ if not os.path.exists(batfilename):
+ debug("Not found: %s" % batfilename)
+ batfilename = None
+
+ installed_sdks=get_installed_sdks()
+ for _sdk in installed_sdks:
+ sdk_bat_file = _sdk.get_sdk_vc_script(host_arch,target_arch)
+ if not sdk_bat_file:
+ debug("vc.py:find_batch_file() not found:%s"%_sdk)
+ else:
+ sdk_bat_file_path = os.path.join(pdir,sdk_bat_file)
+ if os.path.exists(sdk_bat_file_path):
+ debug('vc.py:find_batch_file() sdk_bat_file_path:%s'%sdk_bat_file_path)
+ return (batfilename,sdk_bat_file_path)
+ return (batfilename,None)
+
+
+__INSTALLED_VCS_RUN = None
+
+def cached_get_installed_vcs():
+ global __INSTALLED_VCS_RUN
+
+ if __INSTALLED_VCS_RUN is None:
+ ret = get_installed_vcs()
+ __INSTALLED_VCS_RUN = ret
+
+ return __INSTALLED_VCS_RUN
+
+def get_installed_vcs():
+ installed_versions = []
+ for ver in _VCVER:
+ debug('trying to find VC %s' % ver)
+ try:
+ if find_vc_pdir(ver):
+ debug('found VC %s' % ver)
+ installed_versions.append(ver)
+ else:
+ debug('find_vc_pdir return None for ver %s' % ver)
+ except VisualCException as e:
+ debug('did not find VC %s: caught exception %s' % (ver, str(e)))
+ return installed_versions
+
+def reset_installed_vcs():
+ """Make it try again to find VC. This is just for the tests."""
+ __INSTALLED_VCS_RUN = None
+
+# Running these batch files isn't cheap: most of the time spent in
+# msvs.generate() is due to vcvars*.bat. In a build that uses "tools='msvs'"
+# in multiple environments, for example:
+# env1 = Environment(tools='msvs')
+# env2 = Environment(tools='msvs')
+# we can greatly improve the speed of the second and subsequent Environment
+# (or Clone) calls by memoizing the environment variables set by vcvars*.bat.
+script_env_stdout_cache = {}
+def script_env(script, args=None):
+ cache_key = (script, args)
+ stdout = script_env_stdout_cache.get(cache_key, None)
+ if stdout is None:
+ stdout = common.get_output(script, args)
+ script_env_stdout_cache[cache_key] = stdout
+
+ # Stupid batch files do not set return code: we take a look at the
+ # beginning of the output for an error message instead
+ olines = stdout.splitlines()
+ if olines[0].startswith("The specified configuration type is missing"):
+ raise BatchFileExecutionError("\n".join(olines[:2]))
+
+ return common.parse_output(stdout)
+
+def get_default_version(env):
+ debug('get_default_version()')
+
+ msvc_version = env.get('MSVC_VERSION')
+ msvs_version = env.get('MSVS_VERSION')
+
+ debug('get_default_version(): msvc_version:%s msvs_version:%s'%(msvc_version,msvs_version))
+
+ if msvs_version and not msvc_version:
+ SCons.Warnings.warn(
+ SCons.Warnings.DeprecatedWarning,
+ "MSVS_VERSION is deprecated: please use MSVC_VERSION instead ")
+ return msvs_version
+ elif msvc_version and msvs_version:
+ if not msvc_version == msvs_version:
+ SCons.Warnings.warn(
+ SCons.Warnings.VisualVersionMismatch,
+ "Requested msvc version (%s) and msvs version (%s) do " \
+ "not match: please use MSVC_VERSION only to request a " \
+ "visual studio version, MSVS_VERSION is deprecated" \
+ % (msvc_version, msvs_version))
+ return msvs_version
+ if not msvc_version:
+ installed_vcs = cached_get_installed_vcs()
+ debug('installed_vcs:%s' % installed_vcs)
+ if not installed_vcs:
+ #msg = 'No installed VCs'
+ #debug('msv %s\n' % repr(msg))
+ #SCons.Warnings.warn(SCons.Warnings.VisualCMissingWarning, msg)
+ debug('msvc_setup_env: No installed VCs')
+ return None
+ msvc_version = installed_vcs[0]
+ debug('msvc_setup_env: using default installed MSVC version %s\n' % repr(msvc_version))
+
+ return msvc_version
+
+def msvc_setup_env_once(env):
+ try:
+ has_run = env["MSVC_SETUP_RUN"]
+ except KeyError:
+ has_run = False
+
+ if not has_run:
+ msvc_setup_env(env)
+ env["MSVC_SETUP_RUN"] = True
+
+def msvc_find_valid_batch_script(env,version):
+ debug('vc.py:msvc_find_valid_batch_script()')
+ # Find the host platform, target platform, and if present the requested
+ # target platform
+ (host_platform, target_platform,req_target_platform) = get_host_target(env)
+
+ try_target_archs = [target_platform]
+ debug("msvs_find_valid_batch_script(): req_target_platform %s target_platform:%s"%(req_target_platform,target_platform))
+
+ # VS2012 has a "cross compile" environment to build 64 bit
+ # with x86_amd64 as the argument to the batch setup script
+ if req_target_platform in ('amd64','x86_64'):
+ try_target_archs.append('x86_amd64')
+ elif not req_target_platform and target_platform in ['amd64','x86_64']:
+ # There may not be "native" amd64, but maybe "cross" x86_amd64 tools
+ try_target_archs.append('x86_amd64')
+ # If the user hasn't specifically requested a TARGET_ARCH, and
+ # The TARGET_ARCH is amd64 then also try 32 bits if there are no viable
+ # 64 bit tools installed
+ try_target_archs.append('x86')
+
+ debug("msvs_find_valid_batch_script(): host_platform: %s try_target_archs:%s"%(host_platform, try_target_archs))
+
+ d = None
+ for tp in try_target_archs:
+ # Set to current arch.
+ env['TARGET_ARCH']=tp
+
+ debug("vc.py:msvc_find_valid_batch_script() trying target_platform:%s"%tp)
+ host_target = (host_platform, tp)
+ if not is_host_target_supported(host_target, version):
+ warn_msg = "host, target = %s not supported for MSVC version %s" % \
+ (host_target, version)
+ SCons.Warnings.warn(SCons.Warnings.VisualCMissingWarning, warn_msg)
+ arg = _HOST_TARGET_ARCH_TO_BAT_ARCH[host_target]
+
+ # Get just version numbers
+ maj, min = msvc_version_to_maj_min(version)
+ # VS2015+
+ if maj >= 14:
+ if env.get('MSVC_UWP_APP') == '1':
+ # Initialize environment variables with store/universal paths
+ arg += ' store'
+
+ # Try to locate a batch file for this host/target platform combo
+ try:
+ (vc_script,sdk_script) = find_batch_file(env,version,host_platform,tp)
+ debug('vc.py:msvc_find_valid_batch_script() vc_script:%s sdk_script:%s'%(vc_script,sdk_script))
+ except VisualCException as e:
+ msg = str(e)
+ debug('Caught exception while looking for batch file (%s)' % msg)
+ warn_msg = "VC version %s not installed. " + \
+ "C/C++ compilers are most likely not set correctly.\n" + \
+ " Installed versions are: %s"
+ warn_msg = warn_msg % (version, cached_get_installed_vcs())
+ SCons.Warnings.warn(SCons.Warnings.VisualCMissingWarning, warn_msg)
+ continue
+
+ # Try to use the located batch file for this host/target platform combo
+ debug('vc.py:msvc_find_valid_batch_script() use_script 2 %s, args:%s\n' % (repr(vc_script), arg))
+ if vc_script:
+ try:
+ d = script_env(vc_script, args=arg)
+ except BatchFileExecutionError as e:
+ debug('vc.py:msvc_find_valid_batch_script() use_script 3: failed running VC script %s: %s: Error:%s'%(repr(vc_script),arg,e))
+ vc_script=None
+ continue
+ if not vc_script and sdk_script:
+ debug('vc.py:msvc_find_valid_batch_script() use_script 4: trying sdk script: %s'%(sdk_script))
+ try:
+ d = script_env(sdk_script)
+ except BatchFileExecutionError as e:
+ debug('vc.py:msvc_find_valid_batch_script() use_script 5: failed running SDK script %s: Error:%s'%(repr(sdk_script),e))
+ continue
+ elif not vc_script and not sdk_script:
+ debug('vc.py:msvc_find_valid_batch_script() use_script 6: Neither VC script nor SDK script found')
+ continue
+
+ debug("vc.py:msvc_find_valid_batch_script() Found a working script/target: %s %s"%(repr(sdk_script),arg))
+ break # We've found a working target_platform, so stop looking
+
+ # If we cannot find a viable installed compiler, reset the TARGET_ARCH
+ # To it's initial value
+ if not d:
+ env['TARGET_ARCH']=req_target_platform
+
+ return d
+
+
+def msvc_setup_env(env):
+ debug('msvc_setup_env()')
+
+ version = get_default_version(env)
+ if version is None:
+ warn_msg = "No version of Visual Studio compiler found - C/C++ " \
+ "compilers most likely not set correctly"
+ SCons.Warnings.warn(SCons.Warnings.VisualCMissingWarning, warn_msg)
+ return None
+ debug('msvc_setup_env: using specified MSVC version %s\n' % repr(version))
+
+ # XXX: we set-up both MSVS version for backward
+ # compatibility with the msvs tool
+ env['MSVC_VERSION'] = version
+ env['MSVS_VERSION'] = version
+ env['MSVS'] = {}
+
+
+ use_script = env.get('MSVC_USE_SCRIPT', True)
+ if SCons.Util.is_String(use_script):
+ debug('vc.py:msvc_setup_env() use_script 1 %s\n' % repr(use_script))
+ d = script_env(use_script)
+ elif use_script:
+ d = msvc_find_valid_batch_script(env,version)
+ debug('vc.py:msvc_setup_env() use_script 2 %s\n' % d)
+ if not d:
+ return d
+ else:
+ debug('MSVC_USE_SCRIPT set to False')
+ warn_msg = "MSVC_USE_SCRIPT set to False, assuming environment " \
+ "set correctly."
+ SCons.Warnings.warn(SCons.Warnings.VisualCMissingWarning, warn_msg)
+ return None
+
+ for k, v in d.items():
+ debug('vc.py:msvc_setup_env() env:%s -> %s'%(k,v))
+ env.PrependENVPath(k, v, delete_existing=True)
+
+def msvc_exists(version=None):
+ vcs = cached_get_installed_vcs()
+ if version is None:
+ return len(vcs) > 0
+ return version in vcs
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/MSCommon/vs.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/MSCommon/vs.py
new file mode 100644
index 0000000..f9382fb
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/MSCommon/vs.py
@@ -0,0 +1,573 @@
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+__doc__ = """Module to detect Visual Studio and/or Visual C/C++
+"""
+
+import os
+
+import SCons.Errors
+import SCons.Util
+
+from .common import debug, \
+ get_output, \
+ is_win64, \
+ normalize_env, \
+ parse_output, \
+ read_reg
+
+import SCons.Tool.MSCommon.vc
+
+class VisualStudio(object):
+ """
+ An abstract base class for trying to find installed versions of
+ Visual Studio.
+ """
+ def __init__(self, version, **kw):
+ self.version = version
+ kw['vc_version'] = kw.get('vc_version', version)
+ kw['sdk_version'] = kw.get('sdk_version', version)
+ self.__dict__.update(kw)
+ self._cache = {}
+
+ def find_batch_file(self):
+ vs_dir = self.get_vs_dir()
+ if not vs_dir:
+ debug('find_executable(): no vs_dir')
+ return None
+ batch_file = os.path.join(vs_dir, self.batch_file_path)
+ batch_file = os.path.normpath(batch_file)
+ if not os.path.isfile(batch_file):
+ debug('find_batch_file(): %s not on file system' % batch_file)
+ return None
+ return batch_file
+
+ def find_vs_dir_by_vc(self):
+ SCons.Tool.MSCommon.vc.get_installed_vcs()
+ dir = SCons.Tool.MSCommon.vc.find_vc_pdir(self.vc_version)
+ if not dir:
+ debug('find_vs_dir(): no installed VC %s' % self.vc_version)
+ return None
+ return dir
+
+ def find_vs_dir_by_reg(self):
+ root = 'Software\\'
+
+ if is_win64():
+ root = root + 'Wow6432Node\\'
+ for key in self.hkeys:
+ if key=='use_dir':
+ return self.find_vs_dir_by_vc()
+ key = root + key
+ try:
+ comps = read_reg(key)
+ except SCons.Util.WinError as e:
+ debug('find_vs_dir_by_reg(): no VS registry key {}'.format(repr(key)))
+ else:
+ debug('find_vs_dir_by_reg(): found VS in registry: {}'.format(comps))
+ return comps
+ return None
+
+ def find_vs_dir(self):
+ """ Can use registry or location of VC to find vs dir
+ First try to find by registry, and if that fails find via VC dir
+ """
+
+
+ if True:
+ vs_dir=self.find_vs_dir_by_reg()
+ return vs_dir
+ else:
+ return self.find_vs_dir_by_vc()
+
+ def find_executable(self):
+ vs_dir = self.get_vs_dir()
+ if not vs_dir:
+ debug('find_executable(): no vs_dir ({})'.format(vs_dir))
+ return None
+ executable = os.path.join(vs_dir, self.executable_path)
+ executable = os.path.normpath(executable)
+ if not os.path.isfile(executable):
+ debug('find_executable(): {} not on file system'.format(executable))
+ return None
+ return executable
+
+ def get_batch_file(self):
+ try:
+ return self._cache['batch_file']
+ except KeyError:
+ batch_file = self.find_batch_file()
+ self._cache['batch_file'] = batch_file
+ return batch_file
+
+ def get_executable(self):
+ try:
+ debug('get_executable using cache:%s'%self._cache['executable'])
+ return self._cache['executable']
+ except KeyError:
+ executable = self.find_executable()
+ self._cache['executable'] = executable
+ debug('get_executable not in cache:%s'%executable)
+ return executable
+
+ def get_vs_dir(self):
+ try:
+ return self._cache['vs_dir']
+ except KeyError:
+ vs_dir = self.find_vs_dir()
+ self._cache['vs_dir'] = vs_dir
+ return vs_dir
+
+ def get_supported_arch(self):
+ try:
+ return self._cache['supported_arch']
+ except KeyError:
+ # RDEVE: for the time being use hardcoded lists
+ # supported_arch = self.find_supported_arch()
+ self._cache['supported_arch'] = self.supported_arch
+ return self.supported_arch
+
+ def reset(self):
+ self._cache = {}
+
+# The list of supported Visual Studio versions we know how to detect.
+#
+# How to look for .bat file ?
+# - VS 2008 Express (x86):
+# * from registry key productdir, gives the full path to vsvarsall.bat. In
+# HKEY_LOCAL_MACHINE):
+# Software\Microsoft\VCEpress\9.0\Setup\VC\productdir
+# * from environmnent variable VS90COMNTOOLS: the path is then ..\..\VC
+# relatively to the path given by the variable.
+#
+# - VS 2008 Express (WoW6432: 32 bits on windows x64):
+# Software\Wow6432Node\Microsoft\VCEpress\9.0\Setup\VC\productdir
+#
+# - VS 2005 Express (x86):
+# * from registry key productdir, gives the full path to vsvarsall.bat. In
+# HKEY_LOCAL_MACHINE):
+# Software\Microsoft\VCEpress\8.0\Setup\VC\productdir
+# * from environmnent variable VS80COMNTOOLS: the path is then ..\..\VC
+# relatively to the path given by the variable.
+#
+# - VS 2005 Express (WoW6432: 32 bits on windows x64): does not seem to have a
+# productdir ?
+#
+# - VS 2003 .Net (pro edition ? x86):
+# * from registry key productdir. The path is then ..\Common7\Tools\
+# relatively to the key. The key is in HKEY_LOCAL_MACHINE):
+# Software\Microsoft\VisualStudio\7.1\Setup\VC\productdir
+# * from environmnent variable VS71COMNTOOLS: the path is the full path to
+# vsvars32.bat
+#
+# - VS 98 (VS 6):
+# * from registry key productdir. The path is then Bin
+# relatively to the key. The key is in HKEY_LOCAL_MACHINE):
+# Software\Microsoft\VisualStudio\6.0\Setup\VC98\productdir
+#
+# The first version found in the list is the one used by default if
+# there are multiple versions installed. Barring good reasons to
+# the contrary, this means we should list versions from most recent
+# to oldest. Pro versions get listed before Express versions on the
+# assumption that, by default, you'd rather use the version you paid
+# good money for in preference to whatever Microsoft makes available
+# for free.
+#
+# If you update this list, update _VCVER and _VCVER_TO_PRODUCT_DIR in
+# Tool/MSCommon/vc.py, and the MSVC_VERSION documentation in Tool/msvc.xml.
+
+SupportedVSList = [
+ # Visual Studio 2017
+ VisualStudio('14.1',
+ vc_version='14.1',
+ sdk_version='10.0A',
+ hkeys=[],
+ common_tools_var='VS150COMNTOOLS',
+ executable_path=r'Common7\IDE\devenv.com',
+ batch_file_path=r'VC\Auxiliary\Build\vsvars32.bat',
+ supported_arch=['x86', 'amd64', "arm"],
+ ),
+
+ # Visual Studio 2015
+ VisualStudio('14.0',
+ vc_version='14.0',
+ sdk_version='10.0',
+ hkeys=[r'Microsoft\VisualStudio\14.0\Setup\VS\ProductDir'],
+ common_tools_var='VS140COMNTOOLS',
+ executable_path=r'Common7\IDE\devenv.com',
+ batch_file_path=r'Common7\Tools\vsvars32.bat',
+ supported_arch=['x86', 'amd64', "arm"],
+ ),
+
+ # Visual C++ 2015 Express Edition (for Desktop)
+ VisualStudio('14.0Exp',
+ vc_version='14.0',
+ sdk_version='10.0A',
+ hkeys=[r'Microsoft\VisualStudio\14.0\Setup\VS\ProductDir'],
+ common_tools_var='VS140COMNTOOLS',
+ executable_path=r'Common7\IDE\WDExpress.exe',
+ batch_file_path=r'Common7\Tools\vsvars32.bat',
+ supported_arch=['x86', 'amd64', "arm"],
+ ),
+
+ # Visual Studio 2013
+ VisualStudio('12.0',
+ vc_version='12.0',
+ sdk_version='8.1A',
+ hkeys=[r'Microsoft\VisualStudio\12.0\Setup\VS\ProductDir'],
+ common_tools_var='VS120COMNTOOLS',
+ executable_path=r'Common7\IDE\devenv.com',
+ batch_file_path=r'Common7\Tools\vsvars32.bat',
+ supported_arch=['x86', 'amd64'],
+ ),
+
+ # Visual C++ 2013 Express Edition (for Desktop)
+ VisualStudio('12.0Exp',
+ vc_version='12.0',
+ sdk_version='8.1A',
+ hkeys=[r'Microsoft\VisualStudio\12.0\Setup\VS\ProductDir'],
+ common_tools_var='VS120COMNTOOLS',
+ executable_path=r'Common7\IDE\WDExpress.exe',
+ batch_file_path=r'Common7\Tools\vsvars32.bat',
+ supported_arch=['x86', 'amd64'],
+ ),
+
+ # Visual Studio 2012
+ VisualStudio('11.0',
+ sdk_version='8.0A',
+ hkeys=[r'Microsoft\VisualStudio\11.0\Setup\VS\ProductDir'],
+ common_tools_var='VS110COMNTOOLS',
+ executable_path=r'Common7\IDE\devenv.com',
+ batch_file_path=r'Common7\Tools\vsvars32.bat',
+ supported_arch=['x86', 'amd64'],
+ ),
+
+ # Visual C++ 2012 Express Edition (for Desktop)
+ VisualStudio('11.0Exp',
+ vc_version='11.0',
+ sdk_version='8.0A',
+ hkeys=[r'Microsoft\VisualStudio\11.0\Setup\VS\ProductDir'],
+ common_tools_var='VS110COMNTOOLS',
+ executable_path=r'Common7\IDE\WDExpress.exe',
+ batch_file_path=r'Common7\Tools\vsvars32.bat',
+ supported_arch=['x86', 'amd64'],
+ ),
+
+ # Visual Studio 2010
+ VisualStudio('10.0',
+ sdk_version='7.0A',
+ hkeys=[r'Microsoft\VisualStudio\10.0\Setup\VS\ProductDir'],
+ common_tools_var='VS100COMNTOOLS',
+ executable_path=r'Common7\IDE\devenv.com',
+ batch_file_path=r'Common7\Tools\vsvars32.bat',
+ supported_arch=['x86', 'amd64'],
+ ),
+
+ # Visual C++ 2010 Express Edition
+ VisualStudio('10.0Exp',
+ vc_version='10.0',
+ sdk_version='7.0A',
+ hkeys=[r'Microsoft\VCExpress\10.0\Setup\VS\ProductDir'],
+ common_tools_var='VS100COMNTOOLS',
+ executable_path=r'Common7\IDE\VCExpress.exe',
+ batch_file_path=r'Common7\Tools\vsvars32.bat',
+ supported_arch=['x86'],
+ ),
+
+ # Visual Studio 2008
+ VisualStudio('9.0',
+ sdk_version='6.0A',
+ hkeys=[r'Microsoft\VisualStudio\9.0\Setup\VS\ProductDir'],
+ common_tools_var='VS90COMNTOOLS',
+ executable_path=r'Common7\IDE\devenv.com',
+ batch_file_path=r'Common7\Tools\vsvars32.bat',
+ supported_arch=['x86', 'amd64'],
+ ),
+
+ # Visual C++ 2008 Express Edition
+ VisualStudio('9.0Exp',
+ vc_version='9.0',
+ sdk_version='6.0A',
+ hkeys=[r'Microsoft\VCExpress\9.0\Setup\VS\ProductDir'],
+ common_tools_var='VS90COMNTOOLS',
+ executable_path=r'Common7\IDE\VCExpress.exe',
+ batch_file_path=r'Common7\Tools\vsvars32.bat',
+ supported_arch=['x86'],
+ ),
+
+ # Visual Studio 2005
+ VisualStudio('8.0',
+ sdk_version='6.0A',
+ hkeys=[r'Microsoft\VisualStudio\8.0\Setup\VS\ProductDir'],
+ common_tools_var='VS80COMNTOOLS',
+ executable_path=r'Common7\IDE\devenv.com',
+ batch_file_path=r'Common7\Tools\vsvars32.bat',
+ default_dirname='Microsoft Visual Studio 8',
+ supported_arch=['x86', 'amd64'],
+ ),
+
+ # Visual C++ 2005 Express Edition
+ VisualStudio('8.0Exp',
+ vc_version='8.0Exp',
+ sdk_version='6.0A',
+ hkeys=[r'Microsoft\VCExpress\8.0\Setup\VS\ProductDir'],
+ common_tools_var='VS80COMNTOOLS',
+ executable_path=r'Common7\IDE\VCExpress.exe',
+ batch_file_path=r'Common7\Tools\vsvars32.bat',
+ default_dirname='Microsoft Visual Studio 8',
+ supported_arch=['x86'],
+ ),
+
+ # Visual Studio .NET 2003
+ VisualStudio('7.1',
+ sdk_version='6.0',
+ hkeys=[r'Microsoft\VisualStudio\7.1\Setup\VS\ProductDir'],
+ common_tools_var='VS71COMNTOOLS',
+ executable_path=r'Common7\IDE\devenv.com',
+ batch_file_path=r'Common7\Tools\vsvars32.bat',
+ default_dirname='Microsoft Visual Studio .NET 2003',
+ supported_arch=['x86'],
+ ),
+
+ # Visual Studio .NET
+ VisualStudio('7.0',
+ sdk_version='2003R2',
+ hkeys=[r'Microsoft\VisualStudio\7.0\Setup\VS\ProductDir'],
+ common_tools_var='VS70COMNTOOLS',
+ executable_path=r'IDE\devenv.com',
+ batch_file_path=r'Common7\Tools\vsvars32.bat',
+ default_dirname='Microsoft Visual Studio .NET',
+ supported_arch=['x86'],
+ ),
+
+ # Visual Studio 6.0
+ VisualStudio('6.0',
+ sdk_version='2003R1',
+ hkeys=[r'Microsoft\VisualStudio\6.0\Setup\Microsoft Visual Studio\ProductDir',
+ 'use_dir'],
+ common_tools_var='VS60COMNTOOLS',
+ executable_path=r'Common\MSDev98\Bin\MSDEV.COM',
+ batch_file_path=r'Common7\Tools\vsvars32.bat',
+ default_dirname='Microsoft Visual Studio',
+ supported_arch=['x86'],
+ ),
+]
+
+SupportedVSMap = {}
+for vs in SupportedVSList:
+ SupportedVSMap[vs.version] = vs
+
+
+# Finding installed versions of Visual Studio isn't cheap, because it
+# goes not only to the registry but also to the disk to sanity-check
+# that there is, in fact, a Visual Studio directory there and that the
+# registry entry isn't just stale. Find this information once, when
+# requested, and cache it.
+
+InstalledVSList = None
+InstalledVSMap = None
+
+def get_installed_visual_studios():
+ global InstalledVSList
+ global InstalledVSMap
+ if InstalledVSList is None:
+ InstalledVSList = []
+ InstalledVSMap = {}
+ for vs in SupportedVSList:
+ debug('trying to find VS %s' % vs.version)
+ if vs.get_executable():
+ debug('found VS %s' % vs.version)
+ InstalledVSList.append(vs)
+ InstalledVSMap[vs.version] = vs
+ return InstalledVSList
+
+def reset_installed_visual_studios():
+ global InstalledVSList
+ global InstalledVSMap
+ InstalledVSList = None
+ InstalledVSMap = None
+ for vs in SupportedVSList:
+ vs.reset()
+
+ # Need to clear installed VC's as well as they are used in finding
+ # installed VS's
+ SCons.Tool.MSCommon.vc.reset_installed_vcs()
+
+
+# We may be asked to update multiple construction environments with
+# SDK information. When doing this, we check on-disk for whether
+# the SDK has 'mfc' and 'atl' subdirectories. Since going to disk
+# is expensive, cache results by directory.
+
+#SDKEnvironmentUpdates = {}
+#
+#def set_sdk_by_directory(env, sdk_dir):
+# global SDKEnvironmentUpdates
+# try:
+# env_tuple_list = SDKEnvironmentUpdates[sdk_dir]
+# except KeyError:
+# env_tuple_list = []
+# SDKEnvironmentUpdates[sdk_dir] = env_tuple_list
+#
+# include_path = os.path.join(sdk_dir, 'include')
+# mfc_path = os.path.join(include_path, 'mfc')
+# atl_path = os.path.join(include_path, 'atl')
+#
+# if os.path.exists(mfc_path):
+# env_tuple_list.append(('INCLUDE', mfc_path))
+# if os.path.exists(atl_path):
+# env_tuple_list.append(('INCLUDE', atl_path))
+# env_tuple_list.append(('INCLUDE', include_path))
+#
+# env_tuple_list.append(('LIB', os.path.join(sdk_dir, 'lib')))
+# env_tuple_list.append(('LIBPATH', os.path.join(sdk_dir, 'lib')))
+# env_tuple_list.append(('PATH', os.path.join(sdk_dir, 'bin')))
+#
+# for variable, directory in env_tuple_list:
+# env.PrependENVPath(variable, directory)
+
+def msvs_exists():
+ return (len(get_installed_visual_studios()) > 0)
+
+def get_vs_by_version(msvs):
+ global InstalledVSMap
+ global SupportedVSMap
+
+ debug('vs.py:get_vs_by_version()')
+ if msvs not in SupportedVSMap:
+ msg = "Visual Studio version %s is not supported" % repr(msvs)
+ raise SCons.Errors.UserError(msg)
+ get_installed_visual_studios()
+ vs = InstalledVSMap.get(msvs)
+ debug('InstalledVSMap:%s'%InstalledVSMap)
+ debug('vs.py:get_vs_by_version: found vs:%s'%vs)
+ # Some check like this would let us provide a useful error message
+ # if they try to set a Visual Studio version that's not installed.
+ # However, we also want to be able to run tests (like the unit
+ # tests) on systems that don't, or won't ever, have it installed.
+ # It might be worth resurrecting this, with some configurable
+ # setting that the tests can use to bypass the check.
+ #if not vs:
+ # msg = "Visual Studio version %s is not installed" % repr(msvs)
+ # raise SCons.Errors.UserError, msg
+ return vs
+
+def get_default_version(env):
+ """Returns the default version string to use for MSVS.
+
+ If no version was requested by the user through the MSVS environment
+ variable, query all the available visual studios through
+ get_installed_visual_studios, and take the highest one.
+
+ Return
+ ------
+ version: str
+ the default version.
+ """
+ if 'MSVS' not in env or not SCons.Util.is_Dict(env['MSVS']):
+ # get all versions, and remember them for speed later
+ versions = [vs.version for vs in get_installed_visual_studios()]
+ env['MSVS'] = {'VERSIONS' : versions}
+ else:
+ versions = env['MSVS'].get('VERSIONS', [])
+
+ if 'MSVS_VERSION' not in env:
+ if versions:
+ env['MSVS_VERSION'] = versions[0] #use highest version by default
+ else:
+ debug('get_default_version: WARNING: no installed versions found, '
+ 'using first in SupportedVSList (%s)'%SupportedVSList[0].version)
+ env['MSVS_VERSION'] = SupportedVSList[0].version
+
+ env['MSVS']['VERSION'] = env['MSVS_VERSION']
+
+ return env['MSVS_VERSION']
+
+def get_default_arch(env):
+ """Return the default arch to use for MSVS
+
+ if no version was requested by the user through the MSVS_ARCH environment
+ variable, select x86
+
+ Return
+ ------
+ arch: str
+ """
+ arch = env.get('MSVS_ARCH', 'x86')
+
+ msvs = InstalledVSMap.get(env['MSVS_VERSION'])
+
+ if not msvs:
+ arch = 'x86'
+ elif not arch in msvs.get_supported_arch():
+ fmt = "Visual Studio version %s does not support architecture %s"
+ raise SCons.Errors.UserError(fmt % (env['MSVS_VERSION'], arch))
+
+ return arch
+
+def merge_default_version(env):
+ version = get_default_version(env)
+ arch = get_default_arch(env)
+
+def msvs_setup_env(env):
+ batfilename = msvs.get_batch_file()
+ msvs = get_vs_by_version(version)
+ if msvs is None:
+ return
+
+ # XXX: I think this is broken. This will silently set a bogus tool instead
+ # of failing, but there is no other way with the current scons tool
+ # framework
+ if batfilename is not None:
+
+ vars = ('LIB', 'LIBPATH', 'PATH', 'INCLUDE')
+
+ msvs_list = get_installed_visual_studios()
+ vscommonvarnames = [vs.common_tools_var for vs in msvs_list]
+ save_ENV = env['ENV']
+ nenv = normalize_env(env['ENV'],
+ ['COMSPEC'] + vscommonvarnames,
+ force=True)
+ try:
+ output = get_output(batfilename, arch, env=nenv)
+ finally:
+ env['ENV'] = save_ENV
+ vars = parse_output(output, vars)
+
+ for k, v in vars.items():
+ env.PrependENVPath(k, v, delete_existing=1)
+
+def query_versions():
+ """Query the system to get available versions of VS. A version is
+ considered when a batfile is found."""
+ msvs_list = get_installed_visual_studios()
+ versions = [msvs.version for msvs in msvs_list]
+ return versions
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/PharLapCommon.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/PharLapCommon.py
new file mode 100644
index 0000000..864a185
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/PharLapCommon.py
@@ -0,0 +1,115 @@
+"""SCons.Tool.PharLapCommon
+
+This module contains common code used by all Tools for the
+Phar Lap ETS tool chain. Right now, this is linkloc and
+386asm.
+
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import os
+import os.path
+import SCons.Errors
+import SCons.Util
+import re
+
+def getPharLapPath():
+ """Reads the registry to find the installed path of the Phar Lap ETS
+ development kit.
+
+ Raises UserError if no installed version of Phar Lap can
+ be found."""
+
+ if not SCons.Util.can_read_reg:
+ raise SCons.Errors.InternalError("No Windows registry module was found")
+ try:
+ k=SCons.Util.RegOpenKeyEx(SCons.Util.HKEY_LOCAL_MACHINE,
+ 'SOFTWARE\\Pharlap\\ETS')
+ val, type = SCons.Util.RegQueryValueEx(k, 'BaseDir')
+
+ # The following is a hack...there is (not surprisingly)
+ # an odd issue in the Phar Lap plug in that inserts
+ # a bunch of junk data after the phar lap path in the
+ # registry. We must trim it.
+ idx=val.find('\0')
+ if idx >= 0:
+ val = val[:idx]
+
+ return os.path.normpath(val)
+ except SCons.Util.RegError:
+ raise SCons.Errors.UserError("Cannot find Phar Lap ETS path in the registry. Is it installed properly?")
+
+REGEX_ETS_VER = re.compile(r'#define\s+ETS_VER\s+([0-9]+)')
+
+def getPharLapVersion():
+ """Returns the version of the installed ETS Tool Suite as a
+ decimal number. This version comes from the ETS_VER #define in
+ the embkern.h header. For example, '#define ETS_VER 1010' (which
+ is what Phar Lap 10.1 defines) would cause this method to return
+ 1010. Phar Lap 9.1 does not have such a #define, but this method
+ will return 910 as a default.
+
+ Raises UserError if no installed version of Phar Lap can
+ be found."""
+
+ include_path = os.path.join(getPharLapPath(), os.path.normpath("include/embkern.h"))
+ if not os.path.exists(include_path):
+ raise SCons.Errors.UserError("Cannot find embkern.h in ETS include directory.\nIs Phar Lap ETS installed properly?")
+ mo = REGEX_ETS_VER.search(open(include_path, 'r').read())
+ if mo:
+ return int(mo.group(1))
+ # Default return for Phar Lap 9.1
+ return 910
+
+def addPharLapPaths(env):
+ """This function adds the path to the Phar Lap binaries, includes,
+ and libraries, if they are not already there."""
+ ph_path = getPharLapPath()
+
+ try:
+ env_dict = env['ENV']
+ except KeyError:
+ env_dict = {}
+ env['ENV'] = env_dict
+ SCons.Util.AddPathIfNotExists(env_dict, 'PATH',
+ os.path.join(ph_path, 'bin'))
+ SCons.Util.AddPathIfNotExists(env_dict, 'INCLUDE',
+ os.path.join(ph_path, 'include'))
+ SCons.Util.AddPathIfNotExists(env_dict, 'LIB',
+ os.path.join(ph_path, 'lib'))
+ SCons.Util.AddPathIfNotExists(env_dict, 'LIB',
+ os.path.join(ph_path, os.path.normpath('lib/vclib')))
+
+ env['PHARLAP_PATH'] = getPharLapPath()
+ env['PHARLAP_VERSION'] = str(getPharLapVersion())
+
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/ToolTests.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/ToolTests.py
new file mode 100644
index 0000000..a4353b1
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/ToolTests.py
@@ -0,0 +1,89 @@
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import sys
+import unittest
+
+import TestUnit
+
+import SCons.Errors
+import SCons.Tool
+
+class ToolTestCase(unittest.TestCase):
+ def test_Tool(self):
+ """Test the Tool() function"""
+ class Environment(object):
+ def __init__(self):
+ self.dict = {}
+ def Detect(self, progs):
+ if not SCons.Util.is_List(progs):
+ progs = [ progs ]
+ return progs[0]
+ def Append(self, **kw):
+ self.dict.update(kw)
+ def __getitem__(self, key):
+ return self.dict[key]
+ def __setitem__(self, key, val):
+ self.dict[key] = val
+ def __contains__(self, key):
+ return self.dict.__contains__(key)
+ def has_key(self, key):
+ return key in self.dict
+ def subst(self, string, *args, **kwargs):
+ return string
+ env = Environment()
+ env['BUILDERS'] = {}
+ env['ENV'] = {}
+ env['PLATFORM'] = 'test'
+ t = SCons.Tool.Tool('g++')
+ t(env)
+ assert (env['CXX'] == 'c++' or env['CXX'] == 'g++'), env['CXX']
+ assert env['INCPREFIX'] == '-I', env['INCPREFIX']
+ assert env['TOOLS'] == ['g++'], env['TOOLS']
+
+ try:
+ SCons.Tool.Tool()
+ except TypeError:
+ pass
+ else:
+ raise
+
+ try:
+ p = SCons.Tool.Tool('_does_not_exist_')
+ except SCons.Errors.EnvironmentError:
+ pass
+ else:
+ raise
+
+
+if __name__ == "__main__":
+ suite = unittest.makeSuite(ToolTestCase, 'test_')
+ TestUnit.run(suite)
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/__init__.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/__init__.py
new file mode 100644
index 0000000..42f84e1
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/__init__.py
@@ -0,0 +1,1254 @@
+"""SCons.Tool
+
+SCons tool selection.
+
+This looks for modules that define a callable object that can modify
+a construction environment as appropriate for a given tool (or tool
+chain).
+
+Note that because this subsystem just *selects* a callable that can
+modify a construction environment, it's possible for people to define
+their own "tool specification" in an arbitrary callable function. No
+one needs to use or tie in to this subsystem in order to roll their own
+tool definition.
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import imp
+import importlib
+import sys
+import re
+import os
+import shutil
+
+
+import SCons.Builder
+import SCons.Errors
+import SCons.Node.FS
+import SCons.Scanner
+import SCons.Scanner.C
+import SCons.Scanner.D
+import SCons.Scanner.LaTeX
+import SCons.Scanner.Prog
+import SCons.Scanner.SWIG
+import collections
+
+DefaultToolpath=[]
+
+CScanner = SCons.Scanner.C.CScanner()
+DScanner = SCons.Scanner.D.DScanner()
+LaTeXScanner = SCons.Scanner.LaTeX.LaTeXScanner()
+PDFLaTeXScanner = SCons.Scanner.LaTeX.PDFLaTeXScanner()
+ProgramScanner = SCons.Scanner.Prog.ProgramScanner()
+SourceFileScanner = SCons.Scanner.Base({}, name='SourceFileScanner')
+SWIGScanner = SCons.Scanner.SWIG.SWIGScanner()
+
+CSuffixes = [".c", ".C", ".cxx", ".cpp", ".c++", ".cc",
+ ".h", ".H", ".hxx", ".hpp", ".hh",
+ ".F", ".fpp", ".FPP",
+ ".m", ".mm",
+ ".S", ".spp", ".SPP", ".sx"]
+
+DSuffixes = ['.d']
+
+IDLSuffixes = [".idl", ".IDL"]
+
+LaTeXSuffixes = [".tex", ".ltx", ".latex"]
+
+SWIGSuffixes = ['.i']
+
+for suffix in CSuffixes:
+ SourceFileScanner.add_scanner(suffix, CScanner)
+
+for suffix in DSuffixes:
+ SourceFileScanner.add_scanner(suffix, DScanner)
+
+for suffix in SWIGSuffixes:
+ SourceFileScanner.add_scanner(suffix, SWIGScanner)
+
+# FIXME: what should be done here? Two scanners scan the same extensions,
+# but look for different files, e.g., "picture.eps" vs. "picture.pdf".
+# The builders for DVI and PDF explicitly reference their scanners
+# I think that means this is not needed???
+for suffix in LaTeXSuffixes:
+ SourceFileScanner.add_scanner(suffix, LaTeXScanner)
+ SourceFileScanner.add_scanner(suffix, PDFLaTeXScanner)
+
+
+# Tool aliases are needed for those tools whos module names also
+# occur in the python standard library. This causes module shadowing and
+# can break using python library functions under python3
+TOOL_ALIASES = {
+ 'gettext':'gettext_tool',
+ 'clang++': 'clangxx',
+}
+
+class Tool(object):
+ def __init__(self, name, toolpath=[], **kw):
+
+ # Rename if there's a TOOL_ALIAS for this tool
+ self.name = TOOL_ALIASES.get(name,name)
+ self.toolpath = toolpath + DefaultToolpath
+ # remember these so we can merge them into the call
+ self.init_kw = kw
+
+ module = self._tool_module()
+ self.generate = module.generate
+ self.exists = module.exists
+ if hasattr(module, 'options'):
+ self.options = module.options
+
+ def _load_dotted_module_py2(self, short_name, full_name, searchpaths=None):
+ splitname = short_name.split('.')
+ index = 0
+ srchpths = searchpaths
+ for item in splitname:
+ file, path, desc = imp.find_module(item, srchpths)
+ mod = imp.load_module(full_name, file, path, desc)
+ srchpths = [path]
+ return mod, file
+
+ def _tool_module(self):
+ oldpythonpath = sys.path
+ sys.path = self.toolpath + sys.path
+ # sys.stderr.write("Tool:%s\nPATH:%s\n"%(self.name,sys.path))
+
+ if sys.version_info[0] < 3 or (sys.version_info[0] == 3 and sys.version_info[1] in (0,1,2,3,4)):
+ # Py 2 code
+ try:
+ try:
+ file = None
+ try:
+ mod, file = self._load_dotted_module_py2(self.name, self.name, self.toolpath)
+ return mod
+ finally:
+ if file:
+ file.close()
+ except ImportError as e:
+ splitname = self.name.split('.')
+ if str(e)!="No module named %s"%splitname[0]:
+ raise SCons.Errors.EnvironmentError(e)
+ try:
+ import zipimport
+ except ImportError:
+ pass
+ else:
+ for aPath in self.toolpath:
+ try:
+ importer = zipimport.zipimporter(aPath)
+ return importer.load_module(self.name)
+ except ImportError as e:
+ pass
+ finally:
+ sys.path = oldpythonpath
+ elif sys.version_info[1] > 4:
+ # From: http://stackoverflow.com/questions/67631/how-to-import-a-module-given-the-full-path/67692#67692
+ # import importlib.util
+ # spec = importlib.util.spec_from_file_location("module.name", "/path/to/file.py")
+ # foo = importlib.util.module_from_spec(spec)
+ # spec.loader.exec_module(foo)
+ # foo.MyClass()
+ # Py 3 code
+
+ # import pdb; pdb.set_trace()
+ import importlib.util
+
+ # sys.stderr.write("toolpath:%s\n" % self.toolpath)
+ # sys.stderr.write("SCONS.TOOL path:%s\n" % sys.modules['SCons.Tool'].__path__)
+ debug = False
+ spec = None
+ found_name = self.name
+ add_to_scons_tools_namespace = False
+ for path in self.toolpath:
+ sepname = self.name.replace('.', os.path.sep)
+ file_path = os.path.join(path, "%s.py"%sepname)
+ file_package = os.path.join(path, sepname)
+
+ if debug: sys.stderr.write("Trying:%s %s\n"%(file_path, file_package))
+
+ if os.path.isfile(file_path):
+ spec = importlib.util.spec_from_file_location(self.name, file_path)
+ if debug: print("file_Path:%s FOUND"%file_path)
+ break
+ elif os.path.isdir(file_package):
+ file_package = os.path.join(file_package, '__init__.py')
+ spec = importlib.util.spec_from_file_location(self.name, file_package)
+ if debug: print("PACKAGE:%s Found"%file_package)
+ break
+
+ else:
+ continue
+
+ if spec is None:
+ if debug: sys.stderr.write("NO SPEC :%s\n"%self.name)
+ spec = importlib.util.find_spec("."+self.name, package='SCons.Tool')
+ if spec:
+ found_name = 'SCons.Tool.'+self.name
+ add_to_scons_tools_namespace = True
+ if debug: sys.stderr.write("Spec Found? .%s :%s\n"%(self.name, spec))
+
+ if spec is None:
+ error_string = "No module named %s"%self.name
+ raise SCons.Errors.EnvironmentError(error_string)
+
+ module = importlib.util.module_from_spec(spec)
+ if module is None:
+ if debug: print("MODULE IS NONE:%s"%self.name)
+ error_string = "No module named %s"%self.name
+ raise SCons.Errors.EnvironmentError(error_string)
+
+ # Don't reload a tool we already loaded.
+ sys_modules_value = sys.modules.get(found_name,False)
+
+ found_module = None
+ if sys_modules_value and sys_modules_value.__file__ == spec.origin:
+ found_module = sys.modules[found_name]
+ else:
+ # Not sure what to do in the case that there already
+ # exists sys.modules[self.name] but the source file is
+ # different.. ?
+ module = spec.loader.load_module(spec.name)
+
+ sys.modules[found_name] = module
+ if add_to_scons_tools_namespace:
+ # If we found it in SCons.Tool, then add it to the module
+ setattr(SCons.Tool, self.name, module)
+
+ found_module = module
+
+ if found_module is not None:
+ sys.path = oldpythonpath
+ return found_module
+
+
+ sys.path = oldpythonpath
+
+ full_name = 'SCons.Tool.' + self.name
+ try:
+ return sys.modules[full_name]
+ except KeyError:
+ try:
+ smpath = sys.modules['SCons.Tool'].__path__
+ try:
+ module, file = self._load_dotted_module_py2(self.name, full_name, smpath)
+ setattr(SCons.Tool, self.name, module)
+ if file:
+ file.close()
+ return module
+ except ImportError as e:
+ if str(e)!="No module named %s"%self.name:
+ raise SCons.Errors.EnvironmentError(e)
+ try:
+ import zipimport
+ importer = zipimport.zipimporter( sys.modules['SCons.Tool'].__path__[0] )
+ module = importer.load_module(full_name)
+ setattr(SCons.Tool, self.name, module)
+ return module
+ except ImportError as e:
+ m = "No tool named '%s': %s" % (self.name, e)
+ raise SCons.Errors.EnvironmentError(m)
+ except ImportError as e:
+ m = "No tool named '%s': %s" % (self.name, e)
+ raise SCons.Errors.EnvironmentError(m)
+
+ def __call__(self, env, *args, **kw):
+ if self.init_kw is not None:
+ # Merge call kws into init kws;
+ # but don't bash self.init_kw.
+ if kw is not None:
+ call_kw = kw
+ kw = self.init_kw.copy()
+ kw.update(call_kw)
+ else:
+ kw = self.init_kw
+ env.Append(TOOLS = [ self.name ])
+ if hasattr(self, 'options'):
+ import SCons.Variables
+ if 'options' not in env:
+ from SCons.Script import ARGUMENTS
+ env['options']=SCons.Variables.Variables(args=ARGUMENTS)
+ opts=env['options']
+
+ self.options(opts)
+ opts.Update(env)
+
+ self.generate(env, *args, **kw)
+
+ def __str__(self):
+ return self.name
+
+##########################################################################
+# Create common executable program / library / object builders
+
+def createProgBuilder(env):
+ """This is a utility function that creates the Program
+ Builder in an Environment if it is not there already.
+
+ If it is already there, we return the existing one.
+ """
+
+ try:
+ program = env['BUILDERS']['Program']
+ except KeyError:
+ import SCons.Defaults
+ program = SCons.Builder.Builder(action = SCons.Defaults.LinkAction,
+ emitter = '$PROGEMITTER',
+ prefix = '$PROGPREFIX',
+ suffix = '$PROGSUFFIX',
+ src_suffix = '$OBJSUFFIX',
+ src_builder = 'Object',
+ target_scanner = ProgramScanner)
+ env['BUILDERS']['Program'] = program
+
+ return program
+
+
+def createStaticLibBuilder(env):
+ """This is a utility function that creates the StaticLibrary
+ Builder in an Environment if it is not there already.
+
+ If it is already there, we return the existing one.
+ """
+
+ try:
+ static_lib = env['BUILDERS']['StaticLibrary']
+ except KeyError:
+ action_list = [ SCons.Action.Action("$ARCOM", "$ARCOMSTR") ]
+ if env.get('RANLIB',False) or env.Detect('ranlib'):
+ ranlib_action = SCons.Action.Action("$RANLIBCOM", "$RANLIBCOMSTR")
+ action_list.append(ranlib_action)
+
+ static_lib = SCons.Builder.Builder(action = action_list,
+ emitter = '$LIBEMITTER',
+ prefix = '$LIBPREFIX',
+ suffix = '$LIBSUFFIX',
+ src_suffix = '$OBJSUFFIX',
+ src_builder = 'StaticObject')
+ env['BUILDERS']['StaticLibrary'] = static_lib
+ env['BUILDERS']['Library'] = static_lib
+
+ return static_lib
+
+def _call_linker_cb(env, callback, args, result = None):
+ """Returns the result of env['LINKCALLBACKS'][callback](*args)
+ if env['LINKCALLBACKS'] is a dictionary and env['LINKCALLBACKS'][callback]
+ is callable. If these conditions are not met, return the value provided as
+ the *result* argument. This function is mainly used for generating library
+ info such as versioned suffixes, symlink maps, sonames etc. by delegating
+ the core job to callbacks configured by current linker tool"""
+
+ Verbose = False
+
+ if Verbose:
+ print('_call_linker_cb: args=%r' % args)
+ print('_call_linker_cb: callback=%r' % callback)
+
+ try:
+ cbfun = env['LINKCALLBACKS'][callback]
+ except (KeyError, TypeError):
+ if Verbose:
+ print('_call_linker_cb: env["LINKCALLBACKS"][%r] not found or can not be used' % callback)
+ pass
+ else:
+ if Verbose:
+ print('_call_linker_cb: env["LINKCALLBACKS"][%r] found' % callback)
+ print('_call_linker_cb: env["LINKCALLBACKS"][%r]=%r' % (callback, cbfun))
+ if(isinstance(cbfun, collections.Callable)):
+ if Verbose:
+ print('_call_linker_cb: env["LINKCALLBACKS"][%r] is callable' % callback)
+ result = cbfun(env, *args)
+ return result
+
+def _call_env_subst(env, string, *args, **kw):
+ kw2 = {}
+ for k in ('raw', 'target', 'source', 'conv', 'executor'):
+ try: kw2[k] = kw[k]
+ except KeyError: pass
+ return env.subst(string, *args, **kw2)
+
+class _ShLibInfoSupport(object):
+ def get_libtype(self):
+ return 'ShLib'
+ def get_lib_prefix(self, env, *args, **kw):
+ return _call_env_subst(env,'$SHLIBPREFIX', *args, **kw)
+ def get_lib_suffix(self, env, *args, **kw):
+ return _call_env_subst(env,'$SHLIBSUFFIX', *args, **kw)
+ def get_lib_version(self, env, *args, **kw):
+ return _call_env_subst(env,'$SHLIBVERSION', *args, **kw)
+ def get_lib_noversionsymlinks(self, env, *args, **kw):
+ return _call_env_subst(env,'$SHLIBNOVERSIONSYMLINKS', *args, **kw)
+
+class _LdModInfoSupport(object):
+ def get_libtype(self):
+ return 'LdMod'
+ def get_lib_prefix(self, env, *args, **kw):
+ return _call_env_subst(env,'$LDMODULEPREFIX', *args, **kw)
+ def get_lib_suffix(self, env, *args, **kw):
+ return _call_env_subst(env,'$LDMODULESUFFIX', *args, **kw)
+ def get_lib_version(self, env, *args, **kw):
+ return _call_env_subst(env,'$LDMODULEVERSION', *args, **kw)
+ def get_lib_noversionsymlinks(self, env, *args, **kw):
+ return _call_env_subst(env,'$LDMODULENOVERSIONSYMLINKS', *args, **kw)
+
+class _ImpLibInfoSupport(object):
+ def get_libtype(self):
+ return 'ImpLib'
+ def get_lib_prefix(self, env, *args, **kw):
+ return _call_env_subst(env,'$IMPLIBPREFIX', *args, **kw)
+ def get_lib_suffix(self, env, *args, **kw):
+ return _call_env_subst(env,'$IMPLIBSUFFIX', *args, **kw)
+ def get_lib_version(self, env, *args, **kw):
+ version = _call_env_subst(env,'$IMPLIBVERSION', *args, **kw)
+ if not version:
+ try: lt = kw['implib_libtype']
+ except KeyError: pass
+ else:
+ if lt == 'ShLib':
+ version = _call_env_subst(env,'$SHLIBVERSION', *args, **kw)
+ elif lt == 'LdMod':
+ version = _call_env_subst(env,'$LDMODULEVERSION', *args, **kw)
+ return version
+ def get_lib_noversionsymlinks(self, env, *args, **kw):
+ disable = None
+ try: env['IMPLIBNOVERSIONSYMLINKS']
+ except KeyError:
+ try: lt = kw['implib_libtype']
+ except KeyError: pass
+ else:
+ if lt == 'ShLib':
+ disable = _call_env_subst(env,'$SHLIBNOVERSIONSYMLINKS', *args, **kw)
+ elif lt == 'LdMod':
+ disable = _call_env_subst(env,'$LDMODULENOVERSIONSYMLINKS', *args, **kw)
+ else:
+ disable = _call_env_subst(env,'$IMPLIBNOVERSIONSYMLINKS', *args, **kw)
+ return disable
+
+class _LibInfoGeneratorBase(object):
+ """Generator base class for library-related info such as suffixes for
+ versioned libraries, symlink maps, sonames etc. It handles commonities
+ of SharedLibrary and LoadableModule
+ """
+ _support_classes = { 'ShLib' : _ShLibInfoSupport,
+ 'LdMod' : _LdModInfoSupport,
+ 'ImpLib' : _ImpLibInfoSupport }
+ def __init__(self, libtype, infoname):
+ self.set_libtype(libtype)
+ self.set_infoname(infoname)
+
+ def set_libtype(self, libtype):
+ try:
+ support_class = self._support_classes[libtype]
+ except KeyError:
+ raise ValueError('unsupported libtype %r' % libtype)
+ self._support = support_class()
+
+ def get_libtype(self):
+ return self._support.get_libtype()
+
+ def set_infoname(self, infoname):
+ self.infoname = infoname
+
+ def get_infoname(self):
+ return self.infoname
+
+ def get_lib_prefix(self, env, *args, **kw):
+ return self._support.get_lib_prefix(env,*args,**kw)
+
+ def get_lib_suffix(self, env, *args, **kw):
+ return self._support.get_lib_suffix(env,*args,**kw)
+
+ def get_lib_version(self, env, *args, **kw):
+ return self._support.get_lib_version(env,*args,**kw)
+
+ def get_lib_noversionsymlinks(self, env, *args, **kw):
+ return self._support.get_lib_noversionsymlinks(env,*args,**kw)
+
+ # Returns name of generator linker callback that shall be used to generate
+ # our info for a versioned library. For example, if our libtype is 'ShLib'
+ # and infoname is 'Prefix', it would return 'VersionedShLibPrefix'.
+ def get_versioned_lib_info_generator(self, **kw):
+ try: libtype = kw['generator_libtype']
+ except KeyError: libtype = self.get_libtype()
+ infoname = self.get_infoname()
+ return 'Versioned%s%s' % (libtype, infoname)
+
+ def generate_versioned_lib_info(self, env, args, result = None, **kw):
+ callback = self.get_versioned_lib_info_generator(**kw)
+ return _call_linker_cb(env, callback, args, result)
+
+class _LibPrefixGenerator(_LibInfoGeneratorBase):
+ """Library prefix generator, used as target_prefix in SharedLibrary and
+ LoadableModule builders"""
+ def __init__(self, libtype):
+ super(_LibPrefixGenerator, self).__init__(libtype, 'Prefix')
+
+ def __call__(self, env, sources = None, **kw):
+ Verbose = False
+
+ if sources and 'source' not in kw:
+ kw2 = kw.copy()
+ kw2['source'] = sources
+ else:
+ kw2 = kw
+
+ prefix = self.get_lib_prefix(env,**kw2)
+ if Verbose:
+ print("_LibPrefixGenerator: input prefix=%r" % prefix)
+
+ version = self.get_lib_version(env, **kw2)
+ if Verbose:
+ print("_LibPrefixGenerator: version=%r" % version)
+
+ if version:
+ prefix = self.generate_versioned_lib_info(env, [prefix, version], prefix, **kw2)
+
+ if Verbose:
+ print("_LibPrefixGenerator: return prefix=%r" % prefix)
+ return prefix
+
+ShLibPrefixGenerator = _LibPrefixGenerator('ShLib')
+LdModPrefixGenerator = _LibPrefixGenerator('LdMod')
+ImpLibPrefixGenerator = _LibPrefixGenerator('ImpLib')
+
+class _LibSuffixGenerator(_LibInfoGeneratorBase):
+ """Library suffix generator, used as target_suffix in SharedLibrary and
+ LoadableModule builders"""
+ def __init__(self, libtype):
+ super(_LibSuffixGenerator, self).__init__(libtype, 'Suffix')
+
+ def __call__(self, env, sources = None, **kw):
+ Verbose = False
+
+ if sources and 'source' not in kw:
+ kw2 = kw.copy()
+ kw2['source'] = sources
+ else:
+ kw2 = kw
+
+ suffix = self.get_lib_suffix(env, **kw2)
+ if Verbose:
+ print("_LibSuffixGenerator: input suffix=%r" % suffix)
+
+ version = self.get_lib_version(env, **kw2)
+ if Verbose:
+ print("_LibSuffixGenerator: version=%r" % version)
+
+ if version:
+ suffix = self.generate_versioned_lib_info(env, [suffix, version], suffix, **kw2)
+
+ if Verbose:
+ print("_LibSuffixGenerator: return suffix=%r" % suffix)
+ return suffix
+
+ShLibSuffixGenerator = _LibSuffixGenerator('ShLib')
+LdModSuffixGenerator = _LibSuffixGenerator('LdMod')
+ImpLibSuffixGenerator = _LibSuffixGenerator('ImpLib')
+
+class _LibSymlinkGenerator(_LibInfoGeneratorBase):
+ """Library symlink map generator. It generates a list of symlinks that
+ should be created by SharedLibrary or LoadableModule builders"""
+ def __init__(self, libtype):
+ super(_LibSymlinkGenerator, self).__init__(libtype, 'Symlinks')
+
+ def __call__(self, env, libnode, **kw):
+ Verbose = False
+
+ if libnode and 'target' not in kw:
+ kw2 = kw.copy()
+ kw2['target'] = libnode
+ else:
+ kw2 = kw
+
+ if Verbose:
+ print("_LibSymLinkGenerator: libnode=%r" % libnode.get_path())
+
+ symlinks = None
+
+ version = self.get_lib_version(env, **kw2)
+ disable = self.get_lib_noversionsymlinks(env, **kw2)
+ if Verbose:
+ print('_LibSymlinkGenerator: version=%r' % version)
+ print('_LibSymlinkGenerator: disable=%r' % disable)
+
+ if version and not disable:
+ prefix = self.get_lib_prefix(env,**kw2)
+ suffix = self.get_lib_suffix(env,**kw2)
+ symlinks = self.generate_versioned_lib_info(env, [libnode, version, prefix, suffix], **kw2)
+
+ if Verbose:
+ print('_LibSymlinkGenerator: return symlinks=%r' % StringizeLibSymlinks(symlinks))
+ return symlinks
+
+ShLibSymlinkGenerator = _LibSymlinkGenerator('ShLib')
+LdModSymlinkGenerator = _LibSymlinkGenerator('LdMod')
+ImpLibSymlinkGenerator = _LibSymlinkGenerator('ImpLib')
+
+class _LibNameGenerator(_LibInfoGeneratorBase):
+ """Generates "unmangled" library name from a library file node.
+
+ Generally, it's thought to revert modifications done by prefix/suffix
+ generators (_LibPrefixGenerator/_LibSuffixGenerator) used by a library
+ builder. For example, on gnulink the suffix generator used by SharedLibrary
+ builder appends $SHLIBVERSION to $SHLIBSUFFIX producing node name which
+ ends with "$SHLIBSUFFIX.$SHLIBVERSION". Correspondingly, the implementation
+ of _LibNameGenerator replaces "$SHLIBSUFFIX.$SHLIBVERSION" with
+ "$SHLIBSUFFIX" in the node's basename. So that, if $SHLIBSUFFIX is ".so",
+ $SHLIBVERSION is "0.1.2" and the node path is "/foo/bar/libfoo.so.0.1.2",
+ the _LibNameGenerator shall return "libfoo.so". Other link tools may
+ implement it's own way of library name unmangling.
+ """
+ def __init__(self, libtype):
+ super(_LibNameGenerator, self).__init__(libtype, 'Name')
+
+ def __call__(self, env, libnode, **kw):
+ """Returns "demangled" library name"""
+ Verbose = False
+
+ if libnode and 'target' not in kw:
+ kw2 = kw.copy()
+ kw2['target'] = libnode
+ else:
+ kw2 = kw
+
+ if Verbose:
+ print("_LibNameGenerator: libnode=%r" % libnode.get_path())
+
+ version = self.get_lib_version(env, **kw2)
+ if Verbose:
+ print('_LibNameGenerator: version=%r' % version)
+
+ name = None
+ if version:
+ prefix = self.get_lib_prefix(env,**kw2)
+ suffix = self.get_lib_suffix(env,**kw2)
+ name = self.generate_versioned_lib_info(env, [libnode, version, prefix, suffix], **kw2)
+
+ if not name:
+ name = os.path.basename(libnode.get_path())
+
+ if Verbose:
+ print('_LibNameGenerator: return name=%r' % name)
+
+ return name
+
+ShLibNameGenerator = _LibNameGenerator('ShLib')
+LdModNameGenerator = _LibNameGenerator('LdMod')
+ImpLibNameGenerator = _LibNameGenerator('ImpLib')
+
+class _LibSonameGenerator(_LibInfoGeneratorBase):
+ """Library soname generator. Returns library soname (e.g. libfoo.so.0) for
+ a given node (e.g. /foo/bar/libfoo.so.0.1.2)"""
+ def __init__(self, libtype):
+ super(_LibSonameGenerator, self).__init__(libtype, 'Soname')
+
+ def __call__(self, env, libnode, **kw):
+ """Returns a SONAME based on a shared library's node path"""
+ Verbose = False
+
+ if libnode and 'target' not in kw:
+ kw2 = kw.copy()
+ kw2['target'] = libnode
+ else:
+ kw2 = kw
+
+ if Verbose:
+ print("_LibSonameGenerator: libnode=%r" % libnode.get_path())
+
+ soname = _call_env_subst(env, '$SONAME', **kw2)
+ if not soname:
+ version = self.get_lib_version(env,**kw2)
+ if Verbose:
+ print("_LibSonameGenerator: version=%r" % version)
+ if version:
+ prefix = self.get_lib_prefix(env,**kw2)
+ suffix = self.get_lib_suffix(env,**kw2)
+ soname = self.generate_versioned_lib_info(env, [libnode, version, prefix, suffix], **kw2)
+
+ if not soname:
+ # fallback to library name (as returned by appropriate _LibNameGenerator)
+ soname = _LibNameGenerator(self.get_libtype())(env, libnode)
+ if Verbose:
+ print("_LibSonameGenerator: FALLBACK: soname=%r" % soname)
+
+ if Verbose:
+ print("_LibSonameGenerator: return soname=%r" % soname)
+
+ return soname
+
+ShLibSonameGenerator = _LibSonameGenerator('ShLib')
+LdModSonameGenerator = _LibSonameGenerator('LdMod')
+
+def StringizeLibSymlinks(symlinks):
+ """Converts list with pairs of nodes to list with pairs of node paths
+ (strings). Used mainly for debugging."""
+ if SCons.Util.is_List(symlinks):
+ try:
+ return [ (k.get_path(), v.get_path()) for k,v in symlinks ]
+ except (TypeError, ValueError):
+ return symlinks
+ else:
+ return symlinks
+
+def EmitLibSymlinks(env, symlinks, libnode, **kw):
+ """Used by emitters to handle (shared/versioned) library symlinks"""
+ Verbose = False
+
+ # nodes involved in process... all symlinks + library
+ nodes = list(set([ x for x,y in symlinks ] + [libnode]))
+
+ clean_targets = kw.get('clean_targets', [])
+ if not SCons.Util.is_List(clean_targets):
+ clean_targets = [ clean_targets ]
+
+ for link, linktgt in symlinks:
+ env.SideEffect(link, linktgt)
+ if(Verbose):
+ print("EmitLibSymlinks: SideEffect(%r,%r)" % (link.get_path(), linktgt.get_path()))
+ clean_list = [x for x in nodes if x != linktgt]
+ env.Clean(list(set([linktgt] + clean_targets)), clean_list)
+ if(Verbose):
+ print("EmitLibSymlinks: Clean(%r,%r)" % (linktgt.get_path(), [x.get_path() for x in clean_list]))
+
+def CreateLibSymlinks(env, symlinks):
+ """Physically creates symlinks. The symlinks argument must be a list in
+ form [ (link, linktarget), ... ], where link and linktarget are SCons
+ nodes.
+ """
+
+ Verbose = False
+ for link, linktgt in symlinks:
+ linktgt = link.get_dir().rel_path(linktgt)
+ link = link.get_path()
+ if(Verbose):
+ print("CreateLibSymlinks: preparing to add symlink %r -> %r" % (link, linktgt))
+ # Delete the (previously created) symlink if exists. Let only symlinks
+ # to be deleted to prevent accidental deletion of source files...
+ if env.fs.islink(link):
+ env.fs.unlink(link)
+ if(Verbose):
+ print("CreateLibSymlinks: removed old symlink %r" % link)
+ # If a file or directory exists with the same name as link, an OSError
+ # will be thrown, which should be enough, I think.
+ env.fs.symlink(linktgt, link)
+ if(Verbose):
+ print("CreateLibSymlinks: add symlink %r -> %r" % (link, linktgt))
+ return 0
+
+def LibSymlinksActionFunction(target, source, env):
+ for tgt in target:
+ symlinks = getattr(getattr(tgt,'attributes', None), 'shliblinks', None)
+ if symlinks:
+ CreateLibSymlinks(env, symlinks)
+ return 0
+
+def LibSymlinksStrFun(target, source, env, *args):
+ cmd = None
+ for tgt in target:
+ symlinks = getattr(getattr(tgt,'attributes', None), 'shliblinks', None)
+ if symlinks:
+ if cmd is None: cmd = ""
+ if cmd: cmd += "\n"
+ cmd += "Create symlinks for: %r" % tgt.get_path()
+ try:
+ linkstr = ', '.join([ "%r->%r" %(k,v) for k,v in StringizeLibSymlinks(symlinks)])
+ except (KeyError, ValueError):
+ pass
+ else:
+ cmd += ": %s" % linkstr
+ return cmd
+
+
+LibSymlinksAction = SCons.Action.Action(LibSymlinksActionFunction, LibSymlinksStrFun)
+
+
+def createSharedLibBuilder(env):
+ """This is a utility function that creates the SharedLibrary
+ Builder in an Environment if it is not there already.
+
+ If it is already there, we return the existing one.
+ """
+
+ try:
+ shared_lib = env['BUILDERS']['SharedLibrary']
+ except KeyError:
+ import SCons.Defaults
+ action_list = [ SCons.Defaults.SharedCheck,
+ SCons.Defaults.ShLinkAction,
+ LibSymlinksAction ]
+ shared_lib = SCons.Builder.Builder(action = action_list,
+ emitter = "$SHLIBEMITTER",
+ prefix = ShLibPrefixGenerator,
+ suffix = ShLibSuffixGenerator,
+ target_scanner = ProgramScanner,
+ src_suffix = '$SHOBJSUFFIX',
+ src_builder = 'SharedObject')
+ env['BUILDERS']['SharedLibrary'] = shared_lib
+
+ return shared_lib
+
+def createLoadableModuleBuilder(env):
+ """This is a utility function that creates the LoadableModule
+ Builder in an Environment if it is not there already.
+
+ If it is already there, we return the existing one.
+ """
+
+ try:
+ ld_module = env['BUILDERS']['LoadableModule']
+ except KeyError:
+ import SCons.Defaults
+ action_list = [ SCons.Defaults.SharedCheck,
+ SCons.Defaults.LdModuleLinkAction,
+ LibSymlinksAction ]
+ ld_module = SCons.Builder.Builder(action = action_list,
+ emitter = "$LDMODULEEMITTER",
+ prefix = LdModPrefixGenerator,
+ suffix = LdModSuffixGenerator,
+ target_scanner = ProgramScanner,
+ src_suffix = '$SHOBJSUFFIX',
+ src_builder = 'SharedObject')
+ env['BUILDERS']['LoadableModule'] = ld_module
+
+ return ld_module
+
+def createObjBuilders(env):
+ """This is a utility function that creates the StaticObject
+ and SharedObject Builders in an Environment if they
+ are not there already.
+
+ If they are there already, we return the existing ones.
+
+ This is a separate function because soooo many Tools
+ use this functionality.
+
+ The return is a 2-tuple of (StaticObject, SharedObject)
+ """
+
+
+ try:
+ static_obj = env['BUILDERS']['StaticObject']
+ except KeyError:
+ static_obj = SCons.Builder.Builder(action = {},
+ emitter = {},
+ prefix = '$OBJPREFIX',
+ suffix = '$OBJSUFFIX',
+ src_builder = ['CFile', 'CXXFile'],
+ source_scanner = SourceFileScanner,
+ single_source = 1)
+ env['BUILDERS']['StaticObject'] = static_obj
+ env['BUILDERS']['Object'] = static_obj
+
+ try:
+ shared_obj = env['BUILDERS']['SharedObject']
+ except KeyError:
+ shared_obj = SCons.Builder.Builder(action = {},
+ emitter = {},
+ prefix = '$SHOBJPREFIX',
+ suffix = '$SHOBJSUFFIX',
+ src_builder = ['CFile', 'CXXFile'],
+ source_scanner = SourceFileScanner,
+ single_source = 1)
+ env['BUILDERS']['SharedObject'] = shared_obj
+
+ return (static_obj, shared_obj)
+
+def createCFileBuilders(env):
+ """This is a utility function that creates the CFile/CXXFile
+ Builders in an Environment if they
+ are not there already.
+
+ If they are there already, we return the existing ones.
+
+ This is a separate function because soooo many Tools
+ use this functionality.
+
+ The return is a 2-tuple of (CFile, CXXFile)
+ """
+
+ try:
+ c_file = env['BUILDERS']['CFile']
+ except KeyError:
+ c_file = SCons.Builder.Builder(action = {},
+ emitter = {},
+ suffix = {None:'$CFILESUFFIX'})
+ env['BUILDERS']['CFile'] = c_file
+
+ env.SetDefault(CFILESUFFIX = '.c')
+
+ try:
+ cxx_file = env['BUILDERS']['CXXFile']
+ except KeyError:
+ cxx_file = SCons.Builder.Builder(action = {},
+ emitter = {},
+ suffix = {None:'$CXXFILESUFFIX'})
+ env['BUILDERS']['CXXFile'] = cxx_file
+ env.SetDefault(CXXFILESUFFIX = '.cc')
+
+ return (c_file, cxx_file)
+
+##########################################################################
+# Create common Java builders
+
+def CreateJarBuilder(env):
+ """The Jar builder expects a list of class files
+ which it can package into a jar file.
+
+ The jar tool provides an interface for passing other types
+ of java files such as .java, directories or swig interfaces
+ and will build them to class files in which it can package
+ into the jar.
+ """
+ try:
+ java_jar = env['BUILDERS']['JarFile']
+ except KeyError:
+ fs = SCons.Node.FS.get_default_fs()
+ jar_com = SCons.Action.Action('$JARCOM', '$JARCOMSTR')
+ java_jar = SCons.Builder.Builder(action = jar_com,
+ suffix = '$JARSUFFIX',
+ src_suffix = '$JAVACLASSSUFFIX',
+ src_builder = 'JavaClassFile',
+ source_factory = fs.Entry)
+ env['BUILDERS']['JarFile'] = java_jar
+ return java_jar
+
+def CreateJavaHBuilder(env):
+ try:
+ java_javah = env['BUILDERS']['JavaH']
+ except KeyError:
+ fs = SCons.Node.FS.get_default_fs()
+ java_javah_com = SCons.Action.Action('$JAVAHCOM', '$JAVAHCOMSTR')
+ java_javah = SCons.Builder.Builder(action = java_javah_com,
+ src_suffix = '$JAVACLASSSUFFIX',
+ target_factory = fs.Entry,
+ source_factory = fs.File,
+ src_builder = 'JavaClassFile')
+ env['BUILDERS']['JavaH'] = java_javah
+ return java_javah
+
+def CreateJavaClassFileBuilder(env):
+ try:
+ java_class_file = env['BUILDERS']['JavaClassFile']
+ except KeyError:
+ fs = SCons.Node.FS.get_default_fs()
+ javac_com = SCons.Action.Action('$JAVACCOM', '$JAVACCOMSTR')
+ java_class_file = SCons.Builder.Builder(action = javac_com,
+ emitter = {},
+ #suffix = '$JAVACLASSSUFFIX',
+ src_suffix = '$JAVASUFFIX',
+ src_builder = ['JavaFile'],
+ target_factory = fs.Entry,
+ source_factory = fs.File)
+ env['BUILDERS']['JavaClassFile'] = java_class_file
+ return java_class_file
+
+def CreateJavaClassDirBuilder(env):
+ try:
+ java_class_dir = env['BUILDERS']['JavaClassDir']
+ except KeyError:
+ fs = SCons.Node.FS.get_default_fs()
+ javac_com = SCons.Action.Action('$JAVACCOM', '$JAVACCOMSTR')
+ java_class_dir = SCons.Builder.Builder(action = javac_com,
+ emitter = {},
+ target_factory = fs.Dir,
+ source_factory = fs.Dir)
+ env['BUILDERS']['JavaClassDir'] = java_class_dir
+ return java_class_dir
+
+def CreateJavaFileBuilder(env):
+ try:
+ java_file = env['BUILDERS']['JavaFile']
+ except KeyError:
+ java_file = SCons.Builder.Builder(action = {},
+ emitter = {},
+ suffix = {None:'$JAVASUFFIX'})
+ env['BUILDERS']['JavaFile'] = java_file
+ env['JAVASUFFIX'] = '.java'
+ return java_file
+
+class ToolInitializerMethod(object):
+ """
+ This is added to a construction environment in place of a
+ method(s) normally called for a Builder (env.Object, env.StaticObject,
+ etc.). When called, it has its associated ToolInitializer
+ object search the specified list of tools and apply the first
+ one that exists to the construction environment. It then calls
+ whatever builder was (presumably) added to the construction
+ environment in place of this particular instance.
+ """
+ def __init__(self, name, initializer):
+ """
+ Note: we store the tool name as __name__ so it can be used by
+ the class that attaches this to a construction environment.
+ """
+ self.__name__ = name
+ self.initializer = initializer
+
+ def get_builder(self, env):
+ """
+ Returns the appropriate real Builder for this method name
+ after having the associated ToolInitializer object apply
+ the appropriate Tool module.
+ """
+ builder = getattr(env, self.__name__)
+
+ self.initializer.apply_tools(env)
+
+ builder = getattr(env, self.__name__)
+ if builder is self:
+ # There was no Builder added, which means no valid Tool
+ # for this name was found (or possibly there's a mismatch
+ # between the name we were called by and the Builder name
+ # added by the Tool module).
+ return None
+
+ self.initializer.remove_methods(env)
+
+ return builder
+
+ def __call__(self, env, *args, **kw):
+ """
+ """
+ builder = self.get_builder(env)
+ if builder is None:
+ return [], []
+ return builder(*args, **kw)
+
+class ToolInitializer(object):
+ """
+ A class for delayed initialization of Tools modules.
+
+ Instances of this class associate a list of Tool modules with
+ a list of Builder method names that will be added by those Tool
+ modules. As part of instantiating this object for a particular
+ construction environment, we also add the appropriate
+ ToolInitializerMethod objects for the various Builder methods
+ that we want to use to delay Tool searches until necessary.
+ """
+ def __init__(self, env, tools, names):
+ if not SCons.Util.is_List(tools):
+ tools = [tools]
+ if not SCons.Util.is_List(names):
+ names = [names]
+ self.env = env
+ self.tools = tools
+ self.names = names
+ self.methods = {}
+ for name in names:
+ method = ToolInitializerMethod(name, self)
+ self.methods[name] = method
+ env.AddMethod(method)
+
+ def remove_methods(self, env):
+ """
+ Removes the methods that were added by the tool initialization
+ so we no longer copy and re-bind them when the construction
+ environment gets cloned.
+ """
+ for method in list(self.methods.values()):
+ env.RemoveMethod(method)
+
+ def apply_tools(self, env):
+ """
+ Searches the list of associated Tool modules for one that
+ exists, and applies that to the construction environment.
+ """
+ for t in self.tools:
+ tool = SCons.Tool.Tool(t)
+ if tool.exists(env):
+ env.Tool(tool)
+ return
+
+ # If we fall through here, there was no tool module found.
+ # This is where we can put an informative error message
+ # about the inability to find the tool. We'll start doing
+ # this as we cut over more pre-defined Builder+Tools to use
+ # the ToolInitializer class.
+
+def Initializers(env):
+ ToolInitializer(env, ['install'], ['_InternalInstall', '_InternalInstallAs', '_InternalInstallVersionedLib'])
+ def Install(self, *args, **kw):
+ return self._InternalInstall(*args, **kw)
+ def InstallAs(self, *args, **kw):
+ return self._InternalInstallAs(*args, **kw)
+ def InstallVersionedLib(self, *args, **kw):
+ return self._InternalInstallVersionedLib(*args, **kw)
+ env.AddMethod(Install)
+ env.AddMethod(InstallAs)
+ env.AddMethod(InstallVersionedLib)
+
+def FindTool(tools, env):
+ for tool in tools:
+ t = Tool(tool)
+ if t.exists(env):
+ return tool
+ return None
+
+def FindAllTools(tools, env):
+ def ToolExists(tool, env=env):
+ return Tool(tool).exists(env)
+ return list(filter (ToolExists, tools))
+
+def tool_list(platform, env):
+
+ other_plat_tools=[]
+ # XXX this logic about what tool to prefer on which platform
+ # should be moved into either the platform files or
+ # the tool files themselves.
+ # The search orders here are described in the man page. If you
+ # change these search orders, update the man page as well.
+ if str(platform) == 'win32':
+ "prefer Microsoft tools on Windows"
+ linkers = ['mslink', 'gnulink', 'ilink', 'linkloc', 'ilink32' ]
+ c_compilers = ['msvc', 'mingw', 'gcc', 'intelc', 'icl', 'icc', 'cc', 'bcc32' ]
+ cxx_compilers = ['msvc', 'intelc', 'icc', 'g++', 'cxx', 'bcc32' ]
+ assemblers = ['masm', 'nasm', 'gas', '386asm' ]
+ fortran_compilers = ['gfortran', 'g77', 'ifl', 'cvf', 'f95', 'f90', 'fortran']
+ ars = ['mslib', 'ar', 'tlib']
+ other_plat_tools = ['msvs', 'midl']
+ elif str(platform) == 'os2':
+ "prefer IBM tools on OS/2"
+ linkers = ['ilink', 'gnulink', ]#'mslink']
+ c_compilers = ['icc', 'gcc',]# 'msvc', 'cc']
+ cxx_compilers = ['icc', 'g++',]# 'msvc', 'cxx']
+ assemblers = ['nasm',]# 'masm', 'gas']
+ fortran_compilers = ['ifl', 'g77']
+ ars = ['ar',]# 'mslib']
+ elif str(platform) == 'irix':
+ "prefer MIPSPro on IRIX"
+ linkers = ['sgilink', 'gnulink']
+ c_compilers = ['sgicc', 'gcc', 'cc']
+ cxx_compilers = ['sgicxx', 'g++', 'cxx']
+ assemblers = ['as', 'gas']
+ fortran_compilers = ['f95', 'f90', 'f77', 'g77', 'fortran']
+ ars = ['sgiar']
+ elif str(platform) == 'sunos':
+ "prefer Forte tools on SunOS"
+ linkers = ['sunlink', 'gnulink']
+ c_compilers = ['suncc', 'gcc', 'cc']
+ cxx_compilers = ['suncxx', 'g++', 'cxx']
+ assemblers = ['as', 'gas']
+ fortran_compilers = ['sunf95', 'sunf90', 'sunf77', 'f95', 'f90', 'f77',
+ 'gfortran', 'g77', 'fortran']
+ ars = ['sunar']
+ elif str(platform) == 'hpux':
+ "prefer aCC tools on HP-UX"
+ linkers = ['hplink', 'gnulink']
+ c_compilers = ['hpcc', 'gcc', 'cc']
+ cxx_compilers = ['hpcxx', 'g++', 'cxx']
+ assemblers = ['as', 'gas']
+ fortran_compilers = ['f95', 'f90', 'f77', 'g77', 'fortran']
+ ars = ['ar']
+ elif str(platform) == 'aix':
+ "prefer AIX Visual Age tools on AIX"
+ linkers = ['aixlink', 'gnulink']
+ c_compilers = ['aixcc', 'gcc', 'cc']
+ cxx_compilers = ['aixcxx', 'g++', 'cxx']
+ assemblers = ['as', 'gas']
+ fortran_compilers = ['f95', 'f90', 'aixf77', 'g77', 'fortran']
+ ars = ['ar']
+ elif str(platform) == 'darwin':
+ "prefer GNU tools on Mac OS X, except for some linkers and IBM tools"
+ linkers = ['applelink', 'gnulink']
+ c_compilers = ['gcc', 'cc']
+ cxx_compilers = ['g++', 'cxx']
+ assemblers = ['as']
+ fortran_compilers = ['gfortran', 'f95', 'f90', 'g77']
+ ars = ['ar']
+ elif str(platform) == 'cygwin':
+ "prefer GNU tools on Cygwin, except for a platform-specific linker"
+ linkers = ['cyglink', 'mslink', 'ilink']
+ c_compilers = ['gcc', 'msvc', 'intelc', 'icc', 'cc']
+ cxx_compilers = ['g++', 'msvc', 'intelc', 'icc', 'cxx']
+ assemblers = ['gas', 'nasm', 'masm']
+ fortran_compilers = ['gfortran', 'g77', 'ifort', 'ifl', 'f95', 'f90', 'f77']
+ ars = ['ar', 'mslib']
+ else:
+ "prefer GNU tools on all other platforms"
+ linkers = ['gnulink', 'ilink']
+ c_compilers = ['gcc', 'intelc', 'icc', 'cc']
+ cxx_compilers = ['g++', 'intelc', 'icc', 'cxx']
+ assemblers = ['gas', 'nasm', 'masm']
+ fortran_compilers = ['gfortran', 'g77', 'ifort', 'ifl', 'f95', 'f90', 'f77']
+ ars = ['ar',]
+
+ if not str(platform) == 'win32':
+ other_plat_tools += ['m4', 'rpm']
+
+ c_compiler = FindTool(c_compilers, env) or c_compilers[0]
+
+ # XXX this logic about what tool provides what should somehow be
+ # moved into the tool files themselves.
+ if c_compiler and c_compiler == 'mingw':
+ # MinGW contains a linker, C compiler, C++ compiler,
+ # Fortran compiler, archiver and assembler:
+ cxx_compiler = None
+ linker = None
+ assembler = None
+ fortran_compiler = None
+ ar = None
+ else:
+ # Don't use g++ if the C compiler has built-in C++ support:
+ if c_compiler in ('msvc', 'intelc', 'icc'):
+ cxx_compiler = None
+ else:
+ cxx_compiler = FindTool(cxx_compilers, env) or cxx_compilers[0]
+ linker = FindTool(linkers, env) or linkers[0]
+ assembler = FindTool(assemblers, env) or assemblers[0]
+ fortran_compiler = FindTool(fortran_compilers, env) or fortran_compilers[0]
+ ar = FindTool(ars, env) or ars[0]
+
+ d_compilers = ['dmd', 'ldc', 'gdc']
+ d_compiler = FindTool(d_compilers, env) or d_compilers[0]
+
+ other_tools = FindAllTools(other_plat_tools + [
+ #TODO: merge 'install' into 'filesystem' and
+ # make 'filesystem' the default
+ 'filesystem',
+ 'wix', #'midl', 'msvs',
+ # Parser generators
+ 'lex', 'yacc',
+ # Foreign function interface
+ 'rpcgen', 'swig',
+ # Java
+ 'jar', 'javac', 'javah', 'rmic',
+ # TeX
+ 'dvipdf', 'dvips', 'gs',
+ 'tex', 'latex', 'pdflatex', 'pdftex',
+ # Archivers
+ 'tar', 'zip',
+ ], env)
+
+ tools = ([linker, c_compiler, cxx_compiler,
+ fortran_compiler, assembler, ar, d_compiler]
+ + other_tools)
+
+ return [x for x in tools if x]
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/__init__.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/__init__.xml
new file mode 100644
index 0000000..69cc597
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/__init__.xml
@@ -0,0 +1,527 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+__COPYRIGHT__
+
+This file is processed by the bin/SConsDoc.py module.
+See its __doc__ string for a discussion of the format.
+-->
+
+<!DOCTYPE sconsdoc [
+<!ENTITY % scons SYSTEM '../../../../doc/scons.mod'>
+%scons;
+<!ENTITY % builders-mod SYSTEM '../../../../doc/generated/builders.mod'>
+%builders-mod;
+<!ENTITY % functions-mod SYSTEM '../../../../doc/generated/functions.mod'>
+%functions-mod;
+<!ENTITY % tools-mod SYSTEM '../../../../doc/generated/tools.mod'>
+%tools-mod;
+<!ENTITY % variables-mod SYSTEM '../../../../doc/generated/variables.mod'>
+%variables-mod;
+]>
+
+<sconsdoc xmlns="http://www.scons.org/dbxsd/v1.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://www.scons.org/dbxsd/v1.0 http://www.scons.org/dbxsd/v1.0/scons.xsd">
+
+<builder name="CFile">
+<summary>
+<para>
+Builds a C source file given a lex (<filename>.l</filename>)
+or yacc (<filename>.y</filename>) input file.
+The suffix specified by the &cv-link-CFILESUFFIX; construction variable
+(<filename>.c</filename> by default)
+is automatically added to the target
+if it is not already present.
+Example:
+</para>
+
+<example_commands>
+# builds foo.c
+env.CFile(target = 'foo.c', source = 'foo.l')
+# builds bar.c
+env.CFile(target = 'bar', source = 'bar.y')
+</example_commands>
+</summary>
+</builder>
+
+<builder name="CXXFile">
+<summary>
+<para>
+Builds a C++ source file given a lex (<filename>.ll</filename>)
+or yacc (<filename>.yy</filename>)
+input file.
+The suffix specified by the &cv-link-CXXFILESUFFIX; construction variable
+(<filename>.cc</filename> by default)
+is automatically added to the target
+if it is not already present.
+Example:
+</para>
+
+<example_commands>
+# builds foo.cc
+env.CXXFile(target = 'foo.cc', source = 'foo.ll')
+# builds bar.cc
+env.CXXFile(target = 'bar', source = 'bar.yy')
+</example_commands>
+</summary>
+</builder>
+
+<builder name="Library">
+<summary>
+<para>
+A synonym for the
+&b-StaticLibrary;
+builder method.
+</para>
+</summary>
+</builder>
+
+<builder name="LoadableModule">
+<summary>
+<para>
+On most systems,
+this is the same as
+&b-SharedLibrary;.
+On Mac OS X (Darwin) platforms,
+this creates a loadable module bundle.
+</para>
+</summary>
+</builder>
+
+<builder name="Object">
+<summary>
+<para>
+A synonym for the
+&b-StaticObject;
+builder method.
+</para>
+</summary>
+</builder>
+
+<builder name="Program">
+<summary>
+<para>
+Builds an executable given one or more object files
+or C, C++, D, or Fortran source files.
+If any C, C++, D or Fortran source files are specified,
+then they will be automatically
+compiled to object files using the
+&b-Object;
+builder method;
+see that builder method's description for
+a list of legal source file suffixes
+and how they are interpreted.
+The target executable file prefix
+(specified by the &cv-link-PROGPREFIX; construction variable; nothing by default)
+and suffix
+(specified by the &cv-link-PROGSUFFIX; construction variable;
+by default, <filename>.exe</filename> on Windows systems,
+nothing on POSIX systems)
+are automatically added to the target if not already present.
+Example:
+</para>
+
+<example_commands>
+env.Program(target = 'foo', source = ['foo.o', 'bar.c', 'baz.f'])
+</example_commands>
+</summary>
+</builder>
+
+<builder name="SharedLibrary">
+<summary>
+<para>
+Builds a shared library
+(<filename>.so</filename> on a POSIX system,
+<filename>.dll</filename> on Windows)
+given one or more object files
+or C, C++, D or Fortran source files.
+If any source files are given,
+then they will be automatically
+compiled to object files.
+The static library prefix and suffix (if any)
+are automatically added to the target.
+The target library file prefix
+(specified by the &cv-link-SHLIBPREFIX; construction variable;
+by default, <filename>lib</filename> on POSIX systems,
+nothing on Windows systems)
+and suffix
+(specified by the &cv-link-SHLIBSUFFIX; construction variable;
+by default, <filename>.dll</filename> on Windows systems,
+<filename>.so</filename> on POSIX systems)
+are automatically added to the target if not already present.
+Example:
+</para>
+
+<example_commands>
+env.SharedLibrary(target = 'bar', source = ['bar.c', 'foo.o'])
+</example_commands>
+
+<para>
+On Windows systems, the
+&b-SharedLibrary;
+builder method will always build an import
+(<filename>.lib</filename>) library
+in addition to the shared (<filename>.dll</filename>) library,
+adding a <filename>.lib</filename> library with the same basename
+if there is not already a <filename>.lib</filename> file explicitly
+listed in the targets.
+</para>
+
+<para>
+On Cygwin systems, the
+&b-SharedLibrary;
+builder method will always build an import
+(<filename>.dll.a</filename>) library
+in addition to the shared (<filename>.dll</filename>) library,
+adding a <filename>.dll.a</filename> library with the same basename
+if there is not already a <filename>.dll.a</filename> file explicitly
+listed in the targets.
+</para>
+
+<para>
+Any object files listed in the
+<literal>source</literal>
+must have been built for a shared library
+(that is, using the
+&b-SharedObject;
+builder method).
+&scons;
+will raise an error if there is any mismatch.
+</para>
+
+<para>
+On some platforms, there is a distinction between a shared library
+(loaded automatically by the system to resolve external references)
+and a loadable module (explicitly loaded by user action).
+For maximum portability, use the &b-LoadableModule; builder for the latter.
+</para>
+
+<para>
+When the &cv-link-SHLIBVERSION; construction variable is defined a versioned
+shared library is created. This modifies the &cv-link-SHLINKFLAGS; as required,
+adds the version number to the library name, and creates the symlinks that
+are needed.
+</para>
+
+<example_commands>
+env.SharedLibrary(target = 'bar', source = ['bar.c', 'foo.o'], SHLIBVERSION='1.5.2')
+</example_commands>
+
+<para>
+On a POSIX system, versions with a single token create exactly one symlink:
+libbar.so.6 would have symlinks libbar.so only.
+On a POSIX system, versions with two or more
+tokens create exactly two symlinks: libbar.so.2.3.1 would have symlinks
+libbar.so and libbar.so.2; on a Darwin (OSX) system the library would be
+libbar.2.3.1.dylib and the link would be libbar.dylib.
+</para>
+
+<para>
+On Windows systems, specifying
+<literal>register=1</literal>
+will cause the <filename>.dll</filename> to be
+registered after it is built using REGSVR32.
+The command that is run
+("regsvr32" by default) is determined by &cv-link-REGSVR; construction
+variable, and the flags passed are determined by &cv-link-REGSVRFLAGS;. By
+default, &cv-link-REGSVRFLAGS; includes the <option>/s</option> option,
+to prevent dialogs from popping
+up and requiring user attention when it is run. If you change
+&cv-link-REGSVRFLAGS;, be sure to include the <option>/s</option> option.
+For example,
+</para>
+
+<example_commands>
+env.SharedLibrary(target = 'bar',
+ source = ['bar.cxx', 'foo.obj'],
+ register=1)
+</example_commands>
+
+<para>
+will register <filename>bar.dll</filename> as a COM object
+when it is done linking it.
+</para>
+</summary>
+</builder>
+
+<builder name="SharedObject">
+<summary>
+<para>
+Builds an object file for
+inclusion in a shared library.
+Source files must have one of the same set of extensions
+specified above for the
+&b-StaticObject;
+builder method.
+On some platforms building a shared object requires additional
+compiler option
+(e.g. <option>-fPIC</option> for gcc)
+in addition to those needed to build a
+normal (static) object, but on some platforms there is no difference between a
+shared object and a normal (static) one. When there is a difference, SCons
+will only allow shared objects to be linked into a shared library, and will
+use a different suffix for shared objects. On platforms where there is no
+difference, SCons will allow both normal (static)
+and shared objects to be linked into a
+shared library, and will use the same suffix for shared and normal
+(static) objects.
+The target object file prefix
+(specified by the &cv-link-SHOBJPREFIX; construction variable;
+by default, the same as &cv-link-OBJPREFIX;)
+and suffix
+(specified by the &cv-link-SHOBJSUFFIX; construction variable)
+are automatically added to the target if not already present.
+Examples:
+</para>
+
+<example_commands>
+env.SharedObject(target = 'ddd', source = 'ddd.c')
+env.SharedObject(target = 'eee.o', source = 'eee.cpp')
+env.SharedObject(target = 'fff.obj', source = 'fff.for')
+</example_commands>
+
+<para>
+Note that the source files will be scanned
+according to the suffix mappings in the
+<literal>SourceFileScanner</literal>
+object.
+See the section "Scanner Objects,"
+below, for more information.
+</para>
+</summary>
+</builder>
+
+<builder name="StaticLibrary">
+<summary>
+<para>
+Builds a static library given one or more object files
+or C, C++, D or Fortran source files.
+If any source files are given,
+then they will be automatically
+compiled to object files.
+The static library prefix and suffix (if any)
+are automatically added to the target.
+The target library file prefix
+(specified by the &cv-link-LIBPREFIX; construction variable;
+by default, <filename>lib</filename> on POSIX systems,
+nothing on Windows systems)
+and suffix
+(specified by the &cv-link-LIBSUFFIX; construction variable;
+by default, <filename>.lib</filename> on Windows systems,
+<filename>.a</filename> on POSIX systems)
+are automatically added to the target if not already present.
+Example:
+</para>
+
+<example_commands>
+env.StaticLibrary(target = 'bar', source = ['bar.c', 'foo.o'])
+</example_commands>
+
+<para>
+Any object files listed in the
+<literal>source</literal>
+must have been built for a static library
+(that is, using the
+&b-StaticObject;
+builder method).
+&scons;
+will raise an error if there is any mismatch.
+</para>
+</summary>
+</builder>
+
+<builder name="StaticObject">
+<summary>
+<para>
+Builds a static object file
+from one or more C, C++, D, or Fortran source files.
+Source files must have one of the following extensions:
+</para>
+
+<example_commands>
+ .asm assembly language file
+ .ASM assembly language file
+ .c C file
+ .C Windows: C file
+ POSIX: C++ file
+ .cc C++ file
+ .cpp C++ file
+ .cxx C++ file
+ .cxx C++ file
+ .c++ C++ file
+ .C++ C++ file
+ .d D file
+ .f Fortran file
+ .F Windows: Fortran file
+ POSIX: Fortran file + C pre-processor
+ .for Fortran file
+ .FOR Fortran file
+ .fpp Fortran file + C pre-processor
+ .FPP Fortran file + C pre-processor
+ .m Object C file
+ .mm Object C++ file
+ .s assembly language file
+ .S Windows: assembly language file
+ ARM: CodeSourcery Sourcery Lite
+ .sx assembly language file + C pre-processor
+ POSIX: assembly language file + C pre-processor
+ .spp assembly language file + C pre-processor
+ .SPP assembly language file + C pre-processor
+</example_commands>
+
+<para>
+The target object file prefix
+(specified by the &cv-link-OBJPREFIX; construction variable; nothing by default)
+and suffix
+(specified by the &cv-link-OBJSUFFIX; construction variable;
+<filename>.obj</filename> on Windows systems,
+<filename>.o</filename> on POSIX systems)
+are automatically added to the target if not already present.
+Examples:
+</para>
+
+<example_commands>
+env.StaticObject(target = 'aaa', source = 'aaa.c')
+env.StaticObject(target = 'bbb.o', source = 'bbb.c++')
+env.StaticObject(target = 'ccc.obj', source = 'ccc.f')
+</example_commands>
+
+<para>
+Note that the source files will be scanned
+according to the suffix mappings in
+<literal>SourceFileScanner</literal>
+object.
+See the section "Scanner Objects,"
+below, for more information.
+</para>
+</summary>
+</builder>
+
+<cvar name="CCVERSION">
+<summary>
+<para>
+The version number of the C compiler.
+This may or may not be set,
+depending on the specific C compiler being used.
+</para>
+</summary>
+</cvar>
+
+<cvar name="CFILESUFFIX">
+<summary>
+<para>
+The suffix for C source files.
+This is used by the internal CFile builder
+when generating C files from Lex (.l) or YACC (.y) input files.
+The default suffix, of course, is
+<filename>.c</filename>
+(lower case).
+On case-insensitive systems (like Windows),
+SCons also treats
+<filename>.C</filename>
+(upper case) files
+as C files.
+</para>
+</summary>
+</cvar>
+
+<cvar name="CXXVERSION">
+<summary>
+<para>
+The version number of the C++ compiler.
+This may or may not be set,
+depending on the specific C++ compiler being used.
+</para>
+</summary>
+</cvar>
+
+<cvar name="CXXFILESUFFIX">
+<summary>
+<para>
+The suffix for C++ source files.
+This is used by the internal CXXFile builder
+when generating C++ files from Lex (.ll) or YACC (.yy) input files.
+The default suffix is
+<filename>.cc</filename>.
+SCons also treats files with the suffixes
+<filename>.cpp</filename>,
+<filename>.cxx</filename>,
+<filename>.c++</filename>,
+and
+<filename>.C++</filename>
+as C++ files,
+and files with
+<filename>.mm</filename>
+suffixes as Objective C++ files.
+On case-sensitive systems (Linux, UNIX, and other POSIX-alikes),
+SCons also treats
+<filename>.C</filename>
+(upper case) files
+as C++ files.
+</para>
+</summary>
+</cvar>
+
+<cvar name="IMPLIBVERSION">
+<summary>
+<para>
+Used to override &cv-link-SHLIBVERSION;/&cv-link-LDMODULEVERSION; when
+generating versioned import library for a shared library/loadable module. If
+undefined, the &cv-link-SHLIBVERSION;/&cv-link-LDMODULEVERSION; is used to
+determine the version of versioned import library.
+</para>
+</summary>
+</cvar>
+
+<cvar name="LIBEMITTER">
+<summary>
+<para>
+TODO
+</para>
+</summary>
+</cvar>
+
+<cvar name="LDMODULEVERSION">
+<summary>
+<para>
+When this construction variable is defined, a versioned loadable module
+is created by &b-link-LoadableModule; builder. This activates the
+&cv-link-_LDMODULEVERSIONFLAGS; and thus modifies the &cv-link-LDMODULECOM; as
+required, adds the version number to the library name, and creates the symlinks
+that are needed. &cv-link-LDMODULEVERSION; versions should exist in the same
+format as &cv-link-SHLIBVERSION;.
+</para>
+</summary>
+</cvar>
+
+<cvar name="SHLIBEMITTER">
+<summary>
+<para>
+TODO
+</para>
+</summary>
+</cvar>
+
+<cvar name="PROGEMITTER">
+<summary>
+<para>
+TODO
+</para>
+</summary>
+</cvar>
+
+<cvar name="SHLIBVERSION">
+<summary>
+<para>
+When this construction variable is defined, a versioned shared library
+is created by &b-link-SharedLibrary; builder. This activates the
+&cv-link-_SHLIBVERSIONFLAGS; and thus modifies the &cv-link-SHLINKCOM; as
+required, adds the version number to the library name, and creates the symlinks
+that are needed. &cv-link-SHLIBVERSION; versions should exist as alpha-numeric,
+decimal-delimited values as defined by the regular expression "\w+[\.\w+]*".
+Example &cv-link-SHLIBVERSION; values include '1', '1.2.3', and '1.2.gitaa412c8b'.
+</para>
+</summary>
+</cvar>
+
+</sconsdoc>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/aixc++.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/aixc++.py
new file mode 100644
index 0000000..c3efaea
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/aixc++.py
@@ -0,0 +1,43 @@
+"""SCons.Tool.aixc++
+
+Tool-specific initialization for IBM xlC / Visual Age C++ compiler.
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+#forward proxy to the preffered cxx version
+from SCons.Tool.aixcxx import *
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/aixc++.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/aixc++.xml
new file mode 100644
index 0000000..3aa891a
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/aixc++.xml
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+__COPYRIGHT__
+
+This file is processed by the bin/SConsDoc.py module.
+See its __doc__ string for a discussion of the format.
+-->
+
+<!DOCTYPE sconsdoc [
+<!ENTITY % scons SYSTEM '../../../../doc/scons.mod'>
+%scons;
+<!ENTITY % builders-mod SYSTEM '../../../../doc/generated/builders.mod'>
+%builders-mod;
+<!ENTITY % functions-mod SYSTEM '../../../../doc/generated/functions.mod'>
+%functions-mod;
+<!ENTITY % tools-mod SYSTEM '../../../../doc/generated/tools.mod'>
+%tools-mod;
+<!ENTITY % variables-mod SYSTEM '../../../../doc/generated/variables.mod'>
+%variables-mod;
+]>
+
+<sconsdoc xmlns="http://www.scons.org/dbxsd/v1.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://www.scons.org/dbxsd/v1.0 http://www.scons.org/dbxsd/v1.0/scons.xsd">
+
+<tool name="aixc++">
+<summary>
+<para>
+Sets construction variables for the IMB xlc / Visual Age C++ compiler.
+</para>
+</summary>
+<sets>
+<item>CXX</item>
+<item>SHCXX</item>
+<item>CXXVERSION</item>
+<item>SHOBJSUFFIX</item>
+</sets>
+<uses>
+</uses>
+</tool>
+
+</sconsdoc>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/aixcc.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/aixcc.py
new file mode 100644
index 0000000..09365b1
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/aixcc.py
@@ -0,0 +1,74 @@
+"""SCons.Tool.aixcc
+
+Tool-specific initialization for IBM xlc / Visual Age C compiler.
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import os.path
+
+import SCons.Platform.aix
+
+from . import cc
+
+packages = ['vac.C', 'ibmcxx.cmp']
+
+def get_xlc(env):
+ xlc = env.get('CC', 'xlc')
+ return SCons.Platform.aix.get_xlc(env, xlc, packages)
+
+def generate(env):
+ """Add Builders and construction variables for xlc / Visual Age
+ suite to an Environment."""
+ path, _cc, version = get_xlc(env)
+ if path and _cc:
+ _cc = os.path.join(path, _cc)
+
+ if 'CC' not in env:
+ env['CC'] = _cc
+
+ cc.generate(env)
+
+ if version:
+ env['CCVERSION'] = version
+
+def exists(env):
+ path, _cc, version = get_xlc(env)
+ if path and _cc:
+ xlc = os.path.join(path, _cc)
+ if os.path.exists(xlc):
+ return xlc
+ return None
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/aixcc.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/aixcc.xml
new file mode 100644
index 0000000..11a4ce3
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/aixcc.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+__COPYRIGHT__
+
+This file is processed by the bin/SConsDoc.py module.
+See its __doc__ string for a discussion of the format.
+-->
+
+<!DOCTYPE sconsdoc [
+<!ENTITY % scons SYSTEM '../../../../doc/scons.mod'>
+%scons;
+<!ENTITY % builders-mod SYSTEM '../../../../doc/generated/builders.mod'>
+%builders-mod;
+<!ENTITY % functions-mod SYSTEM '../../../../doc/generated/functions.mod'>
+%functions-mod;
+<!ENTITY % tools-mod SYSTEM '../../../../doc/generated/tools.mod'>
+%tools-mod;
+<!ENTITY % variables-mod SYSTEM '../../../../doc/generated/variables.mod'>
+%variables-mod;
+]>
+
+<sconsdoc xmlns="http://www.scons.org/dbxsd/v1.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://www.scons.org/dbxsd/v1.0 http://www.scons.org/dbxsd/v1.0/scons.xsd">
+
+<tool name="aixcc">
+<summary>
+<para>
+Sets construction variables for the IBM xlc / Visual Age C compiler.
+</para>
+</summary>
+<sets>
+<item>CC</item>
+<item>SHCC</item>
+<item>CCVERSION</item>
+</sets>
+<uses>
+</uses>
+</tool>
+
+</sconsdoc>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/aixcxx.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/aixcxx.py
new file mode 100644
index 0000000..58d9ecc
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/aixcxx.py
@@ -0,0 +1,77 @@
+"""SCons.Tool.aixc++
+
+Tool-specific initialization for IBM xlC / Visual Age C++ compiler.
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import os.path
+
+import SCons.Platform.aix
+
+import SCons.Tool.cxx
+cplusplus = SCons.Tool.cxx
+#cplusplus = __import__('cxx', globals(), locals(), [])
+
+packages = ['vacpp.cmp.core', 'vacpp.cmp.batch', 'vacpp.cmp.C', 'ibmcxx.cmp']
+
+def get_xlc(env):
+ xlc = env.get('CXX', 'xlC')
+ return SCons.Platform.aix.get_xlc(env, xlc, packages)
+
+def generate(env):
+ """Add Builders and construction variables for xlC / Visual Age
+ suite to an Environment."""
+ path, _cxx, version = get_xlc(env)
+ if path and _cxx:
+ _cxx = os.path.join(path, _cxx)
+
+ if 'CXX' not in env:
+ env['CXX'] = _cxx
+
+ cplusplus.generate(env)
+
+ if version:
+ env['CXXVERSION'] = version
+
+def exists(env):
+ path, _cxx, version = get_xlc(env)
+ if path and _cxx:
+ xlc = os.path.join(path, _cxx)
+ if os.path.exists(xlc):
+ return xlc
+ return None
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/aixf77.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/aixf77.py
new file mode 100644
index 0000000..3e30cd0
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/aixf77.py
@@ -0,0 +1,80 @@
+"""engine.SCons.Tool.aixf77
+
+Tool-specific initialization for IBM Visual Age f77 Fortran compiler.
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import os.path
+
+#import SCons.Platform.aix
+
+from . import f77
+
+# It would be good to look for the AIX F77 package the same way we're now
+# looking for the C and C++ packages. This should be as easy as supplying
+# the correct package names in the following list and uncommenting the
+# SCons.Platform.aix_get_xlc() call in the function below.
+packages = []
+
+def get_xlf77(env):
+ xlf77 = env.get('F77', 'xlf77')
+ xlf77_r = env.get('SHF77', 'xlf77_r')
+ #return SCons.Platform.aix.get_xlc(env, xlf77, xlf77_r, packages)
+ return (None, xlf77, xlf77_r, None)
+
+def generate(env):
+ """
+ Add Builders and construction variables for the Visual Age FORTRAN
+ compiler to an Environment.
+ """
+ path, _f77, _shf77, version = get_xlf77(env)
+ if path:
+ _f77 = os.path.join(path, _f77)
+ _shf77 = os.path.join(path, _shf77)
+
+ f77.generate(env)
+
+ env['F77'] = _f77
+ env['SHF77'] = _shf77
+
+def exists(env):
+ path, _f77, _shf77, version = get_xlf77(env)
+ if path and _f77:
+ xlf77 = os.path.join(path, _f77)
+ if os.path.exists(xlf77):
+ return xlf77
+ return None
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/aixf77.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/aixf77.xml
new file mode 100644
index 0000000..46e241e
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/aixf77.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+__COPYRIGHT__
+
+This file is processed by the bin/SConsDoc.py module.
+See its __doc__ string for a discussion of the format.
+-->
+
+<!DOCTYPE sconsdoc [
+<!ENTITY % scons SYSTEM '../../../../doc/scons.mod'>
+%scons;
+<!ENTITY % builders-mod SYSTEM '../../../../doc/generated/builders.mod'>
+%builders-mod;
+<!ENTITY % functions-mod SYSTEM '../../../../doc/generated/functions.mod'>
+%functions-mod;
+<!ENTITY % tools-mod SYSTEM '../../../../doc/generated/tools.mod'>
+%tools-mod;
+<!ENTITY % variables-mod SYSTEM '../../../../doc/generated/variables.mod'>
+%variables-mod;
+]>
+
+<sconsdoc xmlns="http://www.scons.org/dbxsd/v1.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://www.scons.org/dbxsd/v1.0 http://www.scons.org/dbxsd/v1.0/scons.xsd">
+
+<tool name="aixf77">
+<summary>
+<para>
+Sets construction variables for the IBM Visual Age f77 Fortran compiler.
+</para>
+</summary>
+<sets>
+<item>F77</item>
+<item>SHF77</item>
+</sets>
+<uses>
+</uses>
+</tool>
+
+</sconsdoc>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/aixlink.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/aixlink.py
new file mode 100644
index 0000000..fed4342
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/aixlink.py
@@ -0,0 +1,81 @@
+"""SCons.Tool.aixlink
+
+Tool-specific initialization for the IBM Visual Age linker.
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import os
+import os.path
+
+import SCons.Util
+
+from . import aixcc
+from . import link
+
+import SCons.Tool.cxx
+cplusplus = SCons.Tool.cxx
+#cplusplus = __import__('cxx', globals(), locals(), [])
+
+
+def smart_linkflags(source, target, env, for_signature):
+ if cplusplus.iscplusplus(source):
+ build_dir = env.subst('$BUILDDIR', target=target, source=source)
+ if build_dir:
+ return '-qtempinc=' + os.path.join(build_dir, 'tempinc')
+ return ''
+
+def generate(env):
+ """
+ Add Builders and construction variables for Visual Age linker to
+ an Environment.
+ """
+ link.generate(env)
+
+ env['SMARTLINKFLAGS'] = smart_linkflags
+ env['LINKFLAGS'] = SCons.Util.CLVar('$SMARTLINKFLAGS')
+ env['SHLINKFLAGS'] = SCons.Util.CLVar('$LINKFLAGS -qmkshrobj -qsuppress=1501-218')
+ env['SHLIBSUFFIX'] = '.a'
+
+def exists(env):
+ # TODO: sync with link.smart_link() to choose a linker
+ linkers = { 'CXX': ['aixc++'], 'CC': ['aixcc'] }
+ alltools = []
+ for langvar, linktools in linkers.items():
+ if langvar in env: # use CC over CXX when user specified CC but not CXX
+ return SCons.Tool.FindTool(linktools, env)
+ alltools.extend(linktools)
+ return SCons.Tool.FindTool(alltools, env)
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/aixlink.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/aixlink.xml
new file mode 100644
index 0000000..23288e9
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/aixlink.xml
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+__COPYRIGHT__
+
+This file is processed by the bin/SConsDoc.py module.
+See its __doc__ string for a discussion of the format.
+-->
+
+<!DOCTYPE sconsdoc [
+<!ENTITY % scons SYSTEM '../../../../doc/scons.mod'>
+%scons;
+<!ENTITY % builders-mod SYSTEM '../../../../doc/generated/builders.mod'>
+%builders-mod;
+<!ENTITY % functions-mod SYSTEM '../../../../doc/generated/functions.mod'>
+%functions-mod;
+<!ENTITY % tools-mod SYSTEM '../../../../doc/generated/tools.mod'>
+%tools-mod;
+<!ENTITY % variables-mod SYSTEM '../../../../doc/generated/variables.mod'>
+%variables-mod;
+]>
+
+<sconsdoc xmlns="http://www.scons.org/dbxsd/v1.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://www.scons.org/dbxsd/v1.0 http://www.scons.org/dbxsd/v1.0/scons.xsd">
+
+<tool name="aixlink">
+<summary>
+<para>
+Sets construction variables for the IBM Visual Age linker.
+</para>
+</summary>
+<sets>
+<item><!--SMARTLINKFLAGS--></item>
+<item>LINKFLAGS</item>
+<item>SHLINKFLAGS</item>
+<item>SHLIBSUFFIX</item>
+</sets>
+<uses>
+</uses>
+</tool>
+
+</sconsdoc>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/applelink.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/applelink.py
new file mode 100644
index 0000000..c5f4376
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/applelink.py
@@ -0,0 +1,79 @@
+"""SCons.Tool.applelink
+
+Tool-specific initialization for the Apple gnu-like linker.
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import SCons.Util
+
+# Even though the Mac is based on the GNU toolchain, it doesn't understand
+# the -rpath option, so we use the "link" tool instead of "gnulink".
+from . import link
+
+def generate(env):
+ """Add Builders and construction variables for applelink to an
+ Environment."""
+ link.generate(env)
+
+ env['FRAMEWORKPATHPREFIX'] = '-F'
+ env['_FRAMEWORKPATH'] = '${_concat(FRAMEWORKPATHPREFIX, FRAMEWORKPATH, "", __env__)}'
+ env['_FRAMEWORKS'] = '${_concat("-framework ", FRAMEWORKS, "", __env__)}'
+ env['LINKCOM'] = env['LINKCOM'] + ' $_FRAMEWORKPATH $_FRAMEWORKS $FRAMEWORKSFLAGS'
+ env['SHLINKFLAGS'] = SCons.Util.CLVar('$LINKFLAGS -dynamiclib')
+ env['SHLINKCOM'] = env['SHLINKCOM'] + ' $_FRAMEWORKPATH $_FRAMEWORKS $FRAMEWORKSFLAGS'
+
+
+ # TODO: Work needed to generate versioned shared libraries
+ # Leaving this commented out, and also going to disable versioned library checking for now
+ # see: http://docstore.mik.ua/orelly/unix3/mac/ch05_04.htm for proper naming
+ #link._setup_versioned_lib_variables(env, tool = 'applelink')#, use_soname = use_soname)
+ #env['LINKCALLBACKS'] = link._versioned_lib_callbacks()
+
+
+ # override the default for loadable modules, which are different
+ # on OS X than dynamic shared libs. echoing what XCode does for
+ # pre/suffixes:
+ env['LDMODULEPREFIX'] = ''
+ env['LDMODULESUFFIX'] = ''
+ env['LDMODULEFLAGS'] = SCons.Util.CLVar('$LINKFLAGS -bundle')
+ env['LDMODULECOM'] = '$LDMODULE -o ${TARGET} $LDMODULEFLAGS $SOURCES $_LIBDIRFLAGS $_LIBFLAGS $_FRAMEWORKPATH $_FRAMEWORKS $FRAMEWORKSFLAGS'
+
+
+
+def exists(env):
+ return env['PLATFORM'] == 'darwin'
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/applelink.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/applelink.xml
new file mode 100644
index 0000000..5e5571f
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/applelink.xml
@@ -0,0 +1,155 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+__COPYRIGHT__
+
+This file is processed by the bin/SConsDoc.py module.
+See its __doc__ string for a discussion of the format.
+-->
+
+<!DOCTYPE sconsdoc [
+<!ENTITY % scons SYSTEM '../../../../doc/scons.mod'>
+%scons;
+<!ENTITY % builders-mod SYSTEM '../../../../doc/generated/builders.mod'>
+%builders-mod;
+<!ENTITY % functions-mod SYSTEM '../../../../doc/generated/functions.mod'>
+%functions-mod;
+<!ENTITY % tools-mod SYSTEM '../../../../doc/generated/tools.mod'>
+%tools-mod;
+<!ENTITY % variables-mod SYSTEM '../../../../doc/generated/variables.mod'>
+%variables-mod;
+]>
+
+<sconsdoc xmlns="http://www.scons.org/dbxsd/v1.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://www.scons.org/dbxsd/v1.0 http://www.scons.org/dbxsd/v1.0/scons.xsd">
+
+<tool name="applelink">
+<summary>
+<para>
+Sets construction variables for the Apple linker
+(similar to the GNU linker).
+</para>
+</summary>
+<sets>
+<item>FRAMEWORKPATHPREFIX</item>
+<item>_FRAMEWORKPATH</item>
+<item>_FRAMEWORKS</item>
+<item>LINKCOM</item>
+<item>SHLINKFLAGS</item>
+<item>SHLINKCOM</item>
+<item>LDMODULEPREFIX</item>
+<item>LDMODULESUFFIX</item>
+<item>LDMODULEFLAGS</item>
+<item>LDMODULECOM</item>
+</sets>
+<uses>
+<item>FRAMEWORKSFLAGS</item>
+</uses>
+</tool>
+
+<cvar name="FRAMEWORKSFLAGS">">
+<summary>
+<para>
+On Mac OS X with gcc,
+general user-supplied frameworks options to be added at
+the end of a command
+line building a loadable module.
+(This has been largely superseded by
+the &cv-link-FRAMEWORKPATH;, &cv-link-FRAMEWORKPATHPREFIX;,
+&cv-link-FRAMEWORKPREFIX; and &cv-link-FRAMEWORKS; variables
+described above.)
+</para>
+</summary>
+</cvar>
+
+<cvar name="FRAMEWORKS">
+<summary>
+<para>
+On Mac OS X with gcc, a list of the framework names to be linked into a
+program or shared library or bundle.
+The default value is the empty list.
+For example:
+</para>
+
+<example_commands>
+ env.AppendUnique(FRAMEWORKS=Split('System Cocoa SystemConfiguration'))
+</example_commands>
+
+</summary>
+</cvar>
+
+<cvar name="FRAMEWORKPREFIX">
+<summary>
+<para>
+On Mac OS X with gcc,
+the prefix to be used for linking in frameworks
+(see &cv-link-FRAMEWORKS;).
+The default value is
+<option>-framework</option>.
+</para>
+</summary>
+</cvar>
+
+<cvar name="_FRAMEWORKS">
+<summary>
+<para>
+On Mac OS X with gcc,
+an automatically-generated construction variable
+containing the linker command-line options
+for linking with FRAMEWORKS.
+</para>
+</summary>
+</cvar>
+
+<cvar name="FRAMEWORKPATH">
+<summary>
+<para>
+On Mac OS X with gcc,
+a list containing the paths to search for frameworks.
+Used by the compiler to find framework-style includes like
+#include &lt;Fmwk/Header.h&gt;.
+Used by the linker to find user-specified frameworks when linking (see
+&cv-link-FRAMEWORKS;).
+For example:
+</para>
+
+<example_commands>
+ env.AppendUnique(FRAMEWORKPATH='#myframeworkdir')
+</example_commands>
+
+<para>
+will add
+</para>
+
+<example_commands>
+ ... -Fmyframeworkdir
+</example_commands>
+
+<para>
+to the compiler and linker command lines.
+</para>
+</summary>
+</cvar>
+
+<cvar name="FRAMEWORKPATHPREFIX">
+<summary>
+<para>
+On Mac OS X with gcc, the prefix to be used for the FRAMEWORKPATH entries.
+(see &cv-link-FRAMEWORKPATH;).
+The default value is
+<option>-F</option>.
+</para>
+</summary>
+</cvar>
+
+<cvar name="_FRAMEWORKPATH">
+<summary>
+<para>
+On Mac OS X with gcc, an automatically-generated construction variable
+containing the linker command-line options corresponding to
+&cv-link-FRAMEWORKPATH;.
+</para>
+</summary>
+</cvar>
+
+</sconsdoc>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/ar.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/ar.py
new file mode 100644
index 0000000..2cd15c8
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/ar.py
@@ -0,0 +1,63 @@
+"""SCons.Tool.ar
+
+Tool-specific initialization for ar (library archive).
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import SCons.Defaults
+import SCons.Tool
+import SCons.Util
+
+
+def generate(env):
+ """Add Builders and construction variables for ar to an Environment."""
+ SCons.Tool.createStaticLibBuilder(env)
+
+ env['AR'] = 'ar'
+ env['ARFLAGS'] = SCons.Util.CLVar('rc')
+ env['ARCOM'] = '$AR $ARFLAGS $TARGET $SOURCES'
+ env['LIBPREFIX'] = 'lib'
+ env['LIBSUFFIX'] = '.a'
+
+ if env.get('RANLIB',env.Detect('ranlib')) :
+ env['RANLIB'] = env.get('RANLIB','ranlib')
+ env['RANLIBFLAGS'] = SCons.Util.CLVar('')
+ env['RANLIBCOM'] = '$RANLIB $RANLIBFLAGS $TARGET'
+
+def exists(env):
+ return env.Detect('ar')
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/ar.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/ar.xml
new file mode 100644
index 0000000..5d4becb
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/ar.xml
@@ -0,0 +1,121 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+__COPYRIGHT__
+
+This file is processed by the bin/SConsDoc.py module.
+See its __doc__ string for a discussion of the format.
+-->
+
+<!DOCTYPE sconsdoc [
+<!ENTITY % scons SYSTEM '../../../../doc/scons.mod'>
+%scons;
+<!ENTITY % builders-mod SYSTEM '../../../../doc/generated/builders.mod'>
+%builders-mod;
+<!ENTITY % functions-mod SYSTEM '../../../../doc/generated/functions.mod'>
+%functions-mod;
+<!ENTITY % tools-mod SYSTEM '../../../../doc/generated/tools.mod'>
+%tools-mod;
+<!ENTITY % variables-mod SYSTEM '../../../../doc/generated/variables.mod'>
+%variables-mod;
+]>
+
+<sconsdoc xmlns="http://www.scons.org/dbxsd/v1.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://www.scons.org/dbxsd/v1.0 http://www.scons.org/dbxsd/v1.0/scons.xsd">
+
+<tool name="ar">
+<summary>
+<para>
+Sets construction variables for the &ar; library archiver.
+</para>
+</summary>
+<sets>
+<item>AR</item>
+<item>ARFLAGS</item>
+<item>ARCOM</item>
+<item>LIBPREFIX</item>
+<item>LIBSUFFIX</item>
+<item>RANLIB</item>
+<item>RANLIBFLAGS</item>
+<item>RANLIBCOM</item>
+</sets>
+<uses>
+</uses>
+</tool>
+
+<cvar name="AR">
+<summary>
+<para>
+The static library archiver.
+</para>
+</summary>
+</cvar>
+
+<cvar name="ARCOM">
+<summary>
+<para>
+The command line used to generate a static library from object files.
+</para>
+</summary>
+</cvar>
+
+<cvar name="ARCOMSTR">
+<summary>
+<para>
+The string displayed when an object file
+is generated from an assembly-language source file.
+If this is not set, then &cv-link-ARCOM; (the command line) is displayed.
+</para>
+
+<example_commands>
+env = Environment(ARCOMSTR = "Archiving $TARGET")
+</example_commands>
+</summary>
+</cvar>
+
+<cvar name="ARFLAGS">
+<summary>
+<para>
+General options passed to the static library archiver.
+</para>
+</summary>
+</cvar>
+
+<cvar name="RANLIB">
+<summary>
+<para>
+The archive indexer.
+</para>
+</summary>
+</cvar>
+
+<cvar name="RANLIBCOM">
+<summary>
+<para>
+The command line used to index a static library archive.
+</para>
+</summary>
+</cvar>
+
+<cvar name="RANLIBCOMSTR">
+<summary>
+<para>
+The string displayed when a static library archive is indexed.
+If this is not set, then &cv-link-RANLIBCOM; (the command line) is displayed.
+</para>
+
+<example_commands>
+env = Environment(RANLIBCOMSTR = "Indexing $TARGET")
+</example_commands>
+</summary>
+</cvar>
+
+<cvar name="RANLIBFLAGS">
+<summary>
+<para>
+General options passed to the archive indexer.
+</para>
+</summary>
+</cvar>
+
+</sconsdoc>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/as.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/as.py
new file mode 100644
index 0000000..c748251
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/as.py
@@ -0,0 +1,78 @@
+"""SCons.Tool.as
+
+Tool-specific initialization for as, the generic Posix assembler.
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import SCons.Defaults
+import SCons.Tool
+import SCons.Util
+
+assemblers = ['as']
+
+ASSuffixes = ['.s', '.asm', '.ASM']
+ASPPSuffixes = ['.spp', '.SPP', '.sx']
+if SCons.Util.case_sensitive_suffixes('.s', '.S'):
+ ASPPSuffixes.extend(['.S'])
+else:
+ ASSuffixes.extend(['.S'])
+
+def generate(env):
+ """Add Builders and construction variables for as to an Environment."""
+ static_obj, shared_obj = SCons.Tool.createObjBuilders(env)
+
+ for suffix in ASSuffixes:
+ static_obj.add_action(suffix, SCons.Defaults.ASAction)
+ shared_obj.add_action(suffix, SCons.Defaults.ASAction)
+ static_obj.add_emitter(suffix, SCons.Defaults.StaticObjectEmitter)
+ shared_obj.add_emitter(suffix, SCons.Defaults.SharedObjectEmitter)
+
+ for suffix in ASPPSuffixes:
+ static_obj.add_action(suffix, SCons.Defaults.ASPPAction)
+ shared_obj.add_action(suffix, SCons.Defaults.ASPPAction)
+ static_obj.add_emitter(suffix, SCons.Defaults.StaticObjectEmitter)
+ shared_obj.add_emitter(suffix, SCons.Defaults.SharedObjectEmitter)
+
+ env['AS'] = env.Detect(assemblers) or 'as'
+ env['ASFLAGS'] = SCons.Util.CLVar('')
+ env['ASCOM'] = '$AS $ASFLAGS -o $TARGET $SOURCES'
+ env['ASPPFLAGS'] = '$ASFLAGS'
+ env['ASPPCOM'] = '$CC $ASPPFLAGS $CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS -c -o $TARGET $SOURCES'
+
+def exists(env):
+ return env.Detect(assemblers)
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/as.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/as.xml
new file mode 100644
index 0000000..7661a29
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/as.xml
@@ -0,0 +1,125 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+__COPYRIGHT__
+
+This file is processed by the bin/SConsDoc.py module.
+See its __doc__ string for a discussion of the format.
+-->
+
+<!DOCTYPE sconsdoc [
+<!ENTITY % scons SYSTEM '../../../../doc/scons.mod'>
+%scons;
+<!ENTITY % builders-mod SYSTEM '../../../../doc/generated/builders.mod'>
+%builders-mod;
+<!ENTITY % functions-mod SYSTEM '../../../../doc/generated/functions.mod'>
+%functions-mod;
+<!ENTITY % tools-mod SYSTEM '../../../../doc/generated/tools.mod'>
+%tools-mod;
+<!ENTITY % variables-mod SYSTEM '../../../../doc/generated/variables.mod'>
+%variables-mod;
+]>
+
+<sconsdoc xmlns="http://www.scons.org/dbxsd/v1.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://www.scons.org/dbxsd/v1.0 http://www.scons.org/dbxsd/v1.0/scons.xsd">
+
+<tool name="as">
+<summary>
+<para>
+Sets construction variables for the &as; assembler.
+</para>
+</summary>
+<sets>
+<item>AS</item>
+<item>ASFLAGS</item>
+<item>ASCOM</item>
+<item>ASPPFLAGS</item>
+<item>ASPPCOM</item>
+</sets>
+<uses>
+<item>CC</item>
+<item>CPPFLAGS</item>
+<item>_CPPDEFFLAGS</item>
+<item>_CPPINCFLAGS</item>
+</uses>
+</tool>
+
+<cvar name="AS">
+<summary>
+<para>
+The assembler.
+</para>
+</summary>
+</cvar>
+
+<cvar name="ASCOM">
+<summary>
+<para>
+The command line used to generate an object file
+from an assembly-language source file.
+</para>
+</summary>
+</cvar>
+
+<cvar name="ASCOMSTR">
+<summary>
+<para>
+The string displayed when an object file
+is generated from an assembly-language source file.
+If this is not set, then &cv-link-ASCOM; (the command line) is displayed.
+</para>
+
+<example_commands>
+env = Environment(ASCOMSTR = "Assembling $TARGET")
+</example_commands>
+</summary>
+</cvar>
+
+<cvar name="ASFLAGS">
+<summary>
+<para>
+General options passed to the assembler.
+</para>
+</summary>
+</cvar>
+
+<cvar name="ASPPCOM">
+<summary>
+<para>
+The command line used to assemble an assembly-language
+source file into an object file
+after first running the file through the C preprocessor.
+Any options specified
+in the &cv-link-ASFLAGS; and &cv-link-CPPFLAGS; construction variables
+are included on this command line.
+</para>
+</summary>
+</cvar>
+
+<cvar name="ASPPCOMSTR">
+<summary>
+<para>
+The string displayed when an object file
+is generated from an assembly-language source file
+after first running the file through the C preprocessor.
+If this is not set, then &cv-link-ASPPCOM; (the command line) is displayed.
+</para>
+
+<example_commands>
+env = Environment(ASPPCOMSTR = "Assembling $TARGET")
+</example_commands>
+</summary>
+</cvar>
+
+<cvar name="ASPPFLAGS">
+<summary>
+<para>
+General options when an assembling an assembly-language
+source file into an object file
+after first running the file through the C preprocessor.
+The default is to use the value of &cv-link-ASFLAGS;.
+</para>
+</summary>
+</cvar>
+
+</sconsdoc>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/bcc32.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/bcc32.py
new file mode 100644
index 0000000..55f871b
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/bcc32.py
@@ -0,0 +1,81 @@
+"""SCons.Tool.bcc32
+
+XXX
+
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import os
+import os.path
+
+import SCons.Defaults
+import SCons.Tool
+import SCons.Util
+
+def findIt(program, env):
+ # First search in the SCons path and then the OS path:
+ borwin = env.WhereIs(program) or SCons.Util.WhereIs(program)
+ if borwin:
+ dir = os.path.dirname(borwin)
+ env.PrependENVPath('PATH', dir)
+ return borwin
+
+def generate(env):
+ findIt('bcc32', env)
+ """Add Builders and construction variables for bcc to an
+ Environment."""
+ static_obj, shared_obj = SCons.Tool.createObjBuilders(env)
+ for suffix in ['.c', '.cpp']:
+ static_obj.add_action(suffix, SCons.Defaults.CAction)
+ shared_obj.add_action(suffix, SCons.Defaults.ShCAction)
+ static_obj.add_emitter(suffix, SCons.Defaults.StaticObjectEmitter)
+ shared_obj.add_emitter(suffix, SCons.Defaults.SharedObjectEmitter)
+
+ env['CC'] = 'bcc32'
+ env['CCFLAGS'] = SCons.Util.CLVar('')
+ env['CFLAGS'] = SCons.Util.CLVar('')
+ env['CCCOM'] = '$CC -q $CFLAGS $CCFLAGS $CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS -c -o$TARGET $SOURCES'
+ env['SHCC'] = '$CC'
+ env['SHCCFLAGS'] = SCons.Util.CLVar('$CCFLAGS')
+ env['SHCFLAGS'] = SCons.Util.CLVar('$CFLAGS')
+ env['SHCCCOM'] = '$SHCC -WD $SHCFLAGS $SHCCFLAGS $CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS -c -o$TARGET $SOURCES'
+ env['CPPDEFPREFIX'] = '-D'
+ env['CPPDEFSUFFIX'] = ''
+ env['INCPREFIX'] = '-I'
+ env['INCSUFFIX'] = ''
+ env['SHOBJSUFFIX'] = '.dll'
+ env['STATIC_AND_SHARED_OBJECTS_ARE_THE_SAME'] = 0
+ env['CFILESUFFIX'] = '.cpp'
+
+def exists(env):
+ return findIt('bcc32', env)
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/bcc32.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/bcc32.xml
new file mode 100644
index 0000000..743ec00
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/bcc32.xml
@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+__COPYRIGHT__
+
+This file is processed by the bin/SConsDoc.py module.
+See its __doc__ string for a discussion of the format.
+-->
+
+<!DOCTYPE sconsdoc [
+<!ENTITY % scons SYSTEM '../../../../doc/scons.mod'>
+%scons;
+<!ENTITY % builders-mod SYSTEM '../../../../doc/generated/builders.mod'>
+%builders-mod;
+<!ENTITY % functions-mod SYSTEM '../../../../doc/generated/functions.mod'>
+%functions-mod;
+<!ENTITY % tools-mod SYSTEM '../../../../doc/generated/tools.mod'>
+%tools-mod;
+<!ENTITY % variables-mod SYSTEM '../../../../doc/generated/variables.mod'>
+%variables-mod;
+]>
+
+<sconsdoc xmlns="http://www.scons.org/dbxsd/v1.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://www.scons.org/dbxsd/v1.0 http://www.scons.org/dbxsd/v1.0/scons.xsd">
+
+<tool name="bcc32">
+<summary>
+<para>
+Sets construction variables for the bcc32 compiler.
+</para>
+</summary>
+<sets>
+<item>CC</item>
+<item>CCFLAGS</item>
+<item>CFLAGS</item>
+<item>CCCOM</item>
+<item>SHCC</item>
+<item>SHCCFLAGS</item>
+<item>SHCFLAGS</item>
+<item>SHCCCOM</item>
+<item>CPPDEFPREFIX</item>
+<item>CPPDEFSUFFIX</item>
+<item>INCPREFIX</item>
+<item>INCSUFFIX</item>
+<item>SHOBJSUFFIX</item>
+<item><!--STATIC_AND_SHARED_OBJECTS_ARE_THE_SAME--></item>
+<item>CFILESUFFIX</item>
+</sets>
+<uses>
+<item>_CPPDEFFLAGS</item>
+<item>_CPPINCFLAGS</item>
+</uses>
+</tool>
+
+</sconsdoc>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/c++.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/c++.py
new file mode 100644
index 0000000..6b772fa
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/c++.py
@@ -0,0 +1,44 @@
+"""SCons.Tool.c++
+
+Tool-specific initialization for generic Posix C++ compilers.
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+
+#forward proxy to the preffered cxx version
+from SCons.Tool.cxx import *
+
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/c++.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/c++.xml
new file mode 100644
index 0000000..d5fcad7
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/c++.xml
@@ -0,0 +1,141 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+__COPYRIGHT__
+
+This file is processed by the bin/SConsDoc.py module.
+See its __doc__ string for a discussion of the format.
+-->
+
+<!DOCTYPE sconsdoc [
+<!ENTITY % scons SYSTEM '../../../../doc/scons.mod'>
+%scons;
+<!ENTITY % builders-mod SYSTEM '../../../../doc/generated/builders.mod'>
+%builders-mod;
+<!ENTITY % functions-mod SYSTEM '../../../../doc/generated/functions.mod'>
+%functions-mod;
+<!ENTITY % tools-mod SYSTEM '../../../../doc/generated/tools.mod'>
+%tools-mod;
+<!ENTITY % variables-mod SYSTEM '../../../../doc/generated/variables.mod'>
+%variables-mod;
+]>
+
+<sconsdoc xmlns="http://www.scons.org/dbxsd/v1.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://www.scons.org/dbxsd/v1.0 http://www.scons.org/dbxsd/v1.0/scons.xsd">
+
+<tool name="cXX">
+<summary>
+<para>
+Sets construction variables for generic POSIX C++ compilers.
+</para>
+</summary>
+<sets>
+<item>CXX</item>
+<item>CXXFLAGS</item>
+<item>CXXCOM</item>
+<item>SHCXX</item>
+<item>SHCXXFLAGS</item>
+<item>SHCXXCOM</item>
+<item>CPPDEFPREFIX</item>
+<item>CPPDEFSUFFIX</item>
+<item>INCPREFIX</item>
+<item>INCSUFFIX</item>
+<item>SHOBJSUFFIX</item>
+<item>OBJSUFFIX</item>
+<item><!--STATIC_AND_SHARED_OBJECTS_ARE_THE_SAME--></item>
+<item>CXXFILESUFFIX</item>
+</sets>
+<uses>
+<item>CXXCOMSTR</item>
+</uses>
+</tool>
+
+<cvar name="CXX">
+<summary>
+<para>
+The C++ compiler.
+</para>
+</summary>
+</cvar>
+
+<cvar name="CXXCOM">
+<summary>
+<para>
+The command line used to compile a C++ source file to an object file.
+Any options specified in the &cv-link-CXXFLAGS; and
+&cv-link-CPPFLAGS; construction variables
+are included on this command line.
+</para>
+</summary>
+</cvar>
+
+<cvar name="CXXCOMSTR">
+<summary>
+<para>
+The string displayed when a C++ source file
+is compiled to a (static) object file.
+If this is not set, then &cv-link-CXXCOM; (the command line) is displayed.
+</para>
+
+<example_commands>
+env = Environment(CXXCOMSTR = "Compiling static object $TARGET")
+</example_commands>
+</summary>
+</cvar>
+
+<cvar name="CXXFLAGS">
+<summary>
+<para>
+General options that are passed to the C++ compiler.
+By default, this includes the value of &cv-link-CCFLAGS;,
+so that setting &cv-CCFLAGS; affects both C and C++ compilation.
+If you want to add C++-specific flags,
+you must set or override the value of &cv-link-CXXFLAGS;.
+</para>
+</summary>
+</cvar>
+
+<cvar name="SHCXX">
+<summary>
+<para>
+The C++ compiler used for generating shared-library objects.
+</para>
+</summary>
+</cvar>
+
+<cvar name="SHCXXCOM">
+<summary>
+<para>
+The command line used to compile a C++ source file
+to a shared-library object file.
+Any options specified in the &cv-link-SHCXXFLAGS; and
+&cv-link-CPPFLAGS; construction variables
+are included on this command line.
+</para>
+</summary>
+</cvar>
+
+<cvar name="SHCXXCOMSTR">
+<summary>
+<para>
+The string displayed when a C++ source file
+is compiled to a shared object file.
+If this is not set, then &cv-link-SHCXXCOM; (the command line) is displayed.
+</para>
+
+<example_commands>
+env = Environment(SHCXXCOMSTR = "Compiling shared object $TARGET")
+</example_commands>
+</summary>
+</cvar>
+
+<cvar name="SHCXXFLAGS">
+<summary>
+<para>
+Options that are passed to the C++ compiler
+to generate shared-library objects.
+</para>
+</summary>
+</cvar>
+
+</sconsdoc>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/cc.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/cc.py
new file mode 100644
index 0000000..590ec5f
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/cc.py
@@ -0,0 +1,105 @@
+"""SCons.Tool.cc
+
+Tool-specific initialization for generic Posix C compilers.
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import SCons.Tool
+import SCons.Defaults
+import SCons.Util
+
+CSuffixes = ['.c', '.m']
+if not SCons.Util.case_sensitive_suffixes('.c', '.C'):
+ CSuffixes.append('.C')
+
+def add_common_cc_variables(env):
+ """
+ Add underlying common "C compiler" variables that
+ are used by multiple tools (specifically, c++).
+ """
+ if '_CCCOMCOM' not in env:
+ env['_CCCOMCOM'] = '$CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS'
+ # It's a hack to test for darwin here, but the alternative
+ # of creating an applecc.py to contain this seems overkill.
+ # Maybe someday the Apple platform will require more setup and
+ # this logic will be moved.
+ env['FRAMEWORKS'] = SCons.Util.CLVar('')
+ env['FRAMEWORKPATH'] = SCons.Util.CLVar('')
+ if env['PLATFORM'] == 'darwin':
+ env['_CCCOMCOM'] = env['_CCCOMCOM'] + ' $_FRAMEWORKPATH'
+
+ if 'CCFLAGS' not in env:
+ env['CCFLAGS'] = SCons.Util.CLVar('')
+
+ if 'SHCCFLAGS' not in env:
+ env['SHCCFLAGS'] = SCons.Util.CLVar('$CCFLAGS')
+
+compilers = ['cc']
+
+def generate(env):
+ """
+ Add Builders and construction variables for C compilers to an Environment.
+ """
+ static_obj, shared_obj = SCons.Tool.createObjBuilders(env)
+
+ for suffix in CSuffixes:
+ static_obj.add_action(suffix, SCons.Defaults.CAction)
+ shared_obj.add_action(suffix, SCons.Defaults.ShCAction)
+ static_obj.add_emitter(suffix, SCons.Defaults.StaticObjectEmitter)
+ shared_obj.add_emitter(suffix, SCons.Defaults.SharedObjectEmitter)
+
+ add_common_cc_variables(env)
+
+ if 'CC' not in env:
+ env['CC'] = env.Detect(compilers) or compilers[0]
+ env['CFLAGS'] = SCons.Util.CLVar('')
+ env['CCCOM'] = '$CC -o $TARGET -c $CFLAGS $CCFLAGS $_CCCOMCOM $SOURCES'
+ env['SHCC'] = '$CC'
+ env['SHCFLAGS'] = SCons.Util.CLVar('$CFLAGS')
+ env['SHCCCOM'] = '$SHCC -o $TARGET -c $SHCFLAGS $SHCCFLAGS $_CCCOMCOM $SOURCES'
+
+ env['CPPDEFPREFIX'] = '-D'
+ env['CPPDEFSUFFIX'] = ''
+ env['INCPREFIX'] = '-I'
+ env['INCSUFFIX'] = ''
+ env['SHOBJSUFFIX'] = '.os'
+ env['STATIC_AND_SHARED_OBJECTS_ARE_THE_SAME'] = 0
+
+ env['CFILESUFFIX'] = '.c'
+
+def exists(env):
+ return env.Detect(env.get('CC', compilers))
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/cc.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/cc.xml
new file mode 100644
index 0000000..9330436
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/cc.xml
@@ -0,0 +1,208 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+__COPYRIGHT__
+
+This file is processed by the bin/SConsDoc.py module.
+See its __doc__ string for a discussion of the format.
+-->
+
+<!DOCTYPE sconsdoc [
+<!ENTITY % scons SYSTEM '../../../../doc/scons.mod'>
+%scons;
+<!ENTITY % builders-mod SYSTEM '../../../../doc/generated/builders.mod'>
+%builders-mod;
+<!ENTITY % functions-mod SYSTEM '../../../../doc/generated/functions.mod'>
+%functions-mod;
+<!ENTITY % tools-mod SYSTEM '../../../../doc/generated/tools.mod'>
+%tools-mod;
+<!ENTITY % variables-mod SYSTEM '../../../../doc/generated/variables.mod'>
+%variables-mod;
+]>
+
+<sconsdoc xmlns="http://www.scons.org/dbxsd/v1.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://www.scons.org/dbxsd/v1.0 http://www.scons.org/dbxsd/v1.0/scons.xsd">
+
+<tool name="cc">
+<summary>
+<para>
+Sets construction variables for generic POSIX C copmilers.
+</para>
+</summary>
+<sets>
+<item><!--_CCCOMCOM--></item>
+<item>FRAMEWORKS</item>
+<item>FRAMEWORKPATH</item>
+<item>CC</item>
+<item>CFLAGS</item>
+<item>CCFLAGS</item>
+<item>CCCOM</item>
+<item>SHCC</item>
+<item>SHCFLAGS</item>
+<item>SHCCFLAGS</item>
+<item>SHCCCOM</item>
+<item>CPPDEFPREFIX</item>
+<item>CPPDEFSUFFIX</item>
+<item>INCPREFIX</item>
+<item>INCSUFFIX</item>
+<item>SHOBJSUFFIX</item>
+<item><!--STATIC_AND_SHARED_OBJECTS_ARE_THE_SAME--></item>
+<item>CFILESUFFIX</item>
+</sets>
+<uses>
+<item>PLATFORM</item>
+</uses>
+</tool>
+
+<cvar name="CC">
+<summary>
+<para>
+The C compiler.
+</para>
+</summary>
+</cvar>
+
+<cvar name="CCCOM">
+<summary>
+<para>
+The command line used to compile a C source file to a (static) object
+file. Any options specified in the &cv-link-CFLAGS;, &cv-link-CCFLAGS; and
+&cv-link-CPPFLAGS; construction variables are included on this command
+line.
+</para>
+</summary>
+</cvar>
+
+<cvar name="CCCOMSTR">
+<summary>
+<para>
+The string displayed when a C source file
+is compiled to a (static) object file.
+If this is not set, then &cv-link-CCCOM; (the command line) is displayed.
+</para>
+
+<example_commands>
+env = Environment(CCCOMSTR = "Compiling static object $TARGET")
+</example_commands>
+</summary>
+</cvar>
+
+<cvar name="CCFLAGS">
+<summary>
+<para>
+General options that are passed to the C and C++ compilers.
+</para>
+</summary>
+</cvar>
+
+<cvar name="CFLAGS">
+<summary>
+<para>
+General options that are passed to the C compiler (C only; not C++).
+</para>
+</summary>
+</cvar>
+
+<cvar name="CPPFLAGS">
+<summary>
+<para>
+User-specified C preprocessor options.
+These will be included in any command that uses the C preprocessor,
+including not just compilation of C and C++ source files
+via the &cv-link-CCCOM;,
+&cv-link-SHCCCOM;,
+&cv-link-CXXCOM; and
+&cv-link-SHCXXCOM; command lines,
+but also the &cv-link-FORTRANPPCOM;,
+&cv-link-SHFORTRANPPCOM;,
+&cv-link-F77PPCOM; and
+&cv-link-SHF77PPCOM; command lines
+used to compile a Fortran source file,
+and the &cv-link-ASPPCOM; command line
+used to assemble an assembly language source file,
+after first running each file through the C preprocessor.
+Note that this variable does
+<emphasis>not</emphasis>
+contain
+<option>-I</option>
+(or similar) include search path options
+that scons generates automatically from &cv-link-CPPPATH;.
+See &cv-link-_CPPINCFLAGS;, below,
+for the variable that expands to those options.
+</para>
+</summary>
+</cvar>
+
+<cvar name="CPPSUFFIXES">
+<summary>
+<para>
+The list of suffixes of files that will be scanned
+for C preprocessor implicit dependencies
+(#include lines).
+The default list is:
+</para>
+
+<example_commands>
+[".c", ".C", ".cxx", ".cpp", ".c++", ".cc",
+ ".h", ".H", ".hxx", ".hpp", ".hh",
+ ".F", ".fpp", ".FPP",
+ ".m", ".mm",
+ ".S", ".spp", ".SPP"]
+</example_commands>
+</summary>
+</cvar>
+
+<cvar name="SHCC">
+<summary>
+<para>
+The C compiler used for generating shared-library objects.
+</para>
+</summary>
+</cvar>
+
+<cvar name="SHCCCOM">
+<summary>
+<para>
+The command line used to compile a C source file
+to a shared-library object file.
+Any options specified in the &cv-link-SHCFLAGS;,
+&cv-link-SHCCFLAGS; and
+&cv-link-CPPFLAGS; construction variables
+are included on this command line.
+</para>
+</summary>
+</cvar>
+
+<cvar name="SHCCCOMSTR">
+<summary>
+<para>
+The string displayed when a C source file
+is compiled to a shared object file.
+If this is not set, then &cv-link-SHCCCOM; (the command line) is displayed.
+</para>
+
+<example_commands>
+env = Environment(SHCCCOMSTR = "Compiling shared object $TARGET")
+</example_commands>
+</summary>
+</cvar>
+
+<cvar name="SHCCFLAGS">
+<summary>
+<para>
+Options that are passed to the C and C++ compilers
+to generate shared-library objects.
+</para>
+</summary>
+</cvar>
+
+<cvar name="SHCFLAGS">
+<summary>
+<para>
+Options that are passed to the C compiler (only; not C++)
+to generate shared-library objects.
+</para>
+</summary>
+</cvar>
+
+</sconsdoc>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/clang.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/clang.py
new file mode 100644
index 0000000..177e6b2
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/clang.py
@@ -0,0 +1,83 @@
+# -*- coding: utf-8; -*-
+
+"""SCons.Tool.clang
+
+Tool-specific initialization for clang.
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+# __revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+# Based on SCons/Tool/gcc.py by Paweł Tomulik 2014 as a separate tool.
+# Brought into the SCons mainline by Russel Winder 2017.
+
+import os
+import re
+import subprocess
+import sys
+
+import SCons.Util
+import SCons.Tool.cc
+
+compilers = ['clang']
+
+def generate(env):
+ """Add Builders and construction variables for clang to an Environment."""
+ SCons.Tool.cc.generate(env)
+
+ env['CC'] = env.Detect(compilers) or 'clang'
+ if env['PLATFORM'] in ['cygwin', 'win32']:
+ env['SHCCFLAGS'] = SCons.Util.CLVar('$CCFLAGS')
+ else:
+ env['SHCCFLAGS'] = SCons.Util.CLVar('$CCFLAGS -fPIC')
+ # determine compiler version
+ if env['CC']:
+ #pipe = SCons.Action._subproc(env, [env['CC'], '-dumpversion'],
+ pipe = SCons.Action._subproc(env, [env['CC'], '--version'],
+ stdin='devnull',
+ stderr='devnull',
+ stdout=subprocess.PIPE)
+ if pipe.wait() != 0: return
+ # clang -dumpversion is of no use
+ line = pipe.stdout.readline()
+ if sys.version_info[0] > 2:
+ line = line.decode()
+ match = re.search(r'clang +version +([0-9]+(?:\.[0-9]+)+)', line)
+ if match:
+ env['CCVERSION'] = match.group(1)
+
+def exists(env):
+ return env.Detect(compilers)
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/clang.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/clang.xml
new file mode 100644
index 0000000..e2e50d4
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/clang.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+__COPYRIGHT__
+
+This file is processed by the bin/SConsDoc.py module.
+See its __doc__ string for a discussion of the format.
+-->
+
+<!DOCTYPE sconsdoc [
+<!ENTITY % scons SYSTEM '../../../../doc/scons.mod'>
+%scons;
+<!ENTITY % builders-mod SYSTEM '../../../../doc/generated/builders.mod'>
+%builders-mod;
+<!ENTITY % functions-mod SYSTEM '../../../../doc/generated/functions.mod'>
+%functions-mod;
+<!ENTITY % tools-mod SYSTEM '../../../../doc/generated/tools.mod'>
+%tools-mod;
+<!ENTITY % variables-mod SYSTEM '../../../../doc/generated/variables.mod'>
+%variables-mod;
+]>
+
+<sconsdoc xmlns="http://www.scons.org/dbxsd/v1.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://www.scons.org/dbxsd/v1.0 http://www.scons.org/dbxsd/v1.0/scons.xsd">
+
+<tool name="clang">
+<summary>
+<para>
+Set construction variables for the Clang C compiler.
+</para>
+</summary>
+<sets>
+<item>CC</item>
+<item>SHCCFLAGS</item>
+<item>CCVERSION</item>
+</sets>
+</tool>
+
+</sconsdoc>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/clangxx.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/clangxx.py
new file mode 100644
index 0000000..dd501af
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/clangxx.py
@@ -0,0 +1,91 @@
+# -*- coding: utf-8; -*-
+
+"""SCons.Tool.clang++
+
+Tool-specific initialization for clang++.
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+# __revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+# Based on SCons/Tool/g++.py by Paweł Tomulik 2014 as a separate tool.
+# Brought into the SCons mainline by Russel Winder 2017.
+
+import os.path
+import re
+import subprocess
+import sys
+
+import SCons.Tool
+import SCons.Util
+import SCons.Tool.cxx
+
+compilers = ['clang++']
+
+def generate(env):
+ """Add Builders and construction variables for clang++ to an Environment."""
+ static_obj, shared_obj = SCons.Tool.createObjBuilders(env)
+
+ SCons.Tool.cxx.generate(env)
+
+ env['CXX'] = env.Detect(compilers) or 'clang++'
+
+ # platform specific settings
+ if env['PLATFORM'] == 'aix':
+ env['SHCXXFLAGS'] = SCons.Util.CLVar('$CXXFLAGS -mminimal-toc')
+ env['STATIC_AND_SHARED_OBJECTS_ARE_THE_SAME'] = 1
+ env['SHOBJSUFFIX'] = '$OBJSUFFIX'
+ elif env['PLATFORM'] == 'hpux':
+ env['SHOBJSUFFIX'] = '.pic.o'
+ elif env['PLATFORM'] == 'sunos':
+ env['SHOBJSUFFIX'] = '.pic.o'
+ # determine compiler version
+ if env['CXX']:
+ pipe = SCons.Action._subproc(env, [env['CXX'], '--version'],
+ stdin='devnull',
+ stderr='devnull',
+ stdout=subprocess.PIPE)
+ if pipe.wait() != 0: return
+ # clang -dumpversion is of no use
+ line = pipe.stdout.readline()
+ if sys.version_info[0] > 2:
+ line = line.decode()
+ match = re.search(r'clang +version +([0-9]+(?:\.[0-9]+)+)', line)
+ if match:
+ env['CXXVERSION'] = match.group(1)
+
+def exists(env):
+ return env.Detect(compilers)
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/clangxx.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/clangxx.xml
new file mode 100644
index 0000000..2c1c2ca
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/clangxx.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+__COPYRIGHT__
+
+This file is processed by the bin/SConsDoc.py module.
+See its __doc__ string for a discussion of the format.
+-->
+
+<!DOCTYPE sconsdoc [
+<!ENTITY % scons SYSTEM '../../../../doc/scons.mod'>
+%scons;
+<!ENTITY % builders-mod SYSTEM '../../../../doc/generated/builders.mod'>
+%builders-mod;
+<!ENTITY % functions-mod SYSTEM '../../../../doc/generated/functions.mod'>
+%functions-mod;
+<!ENTITY % tools-mod SYSTEM '../../../../doc/generated/tools.mod'>
+%tools-mod;
+<!ENTITY % variables-mod SYSTEM '../../../../doc/generated/variables.mod'>
+%variables-mod;
+]>
+
+<sconsdoc xmlns="http://www.scons.org/dbxsd/v1.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://www.scons.org/dbxsd/v1.0 http://www.scons.org/dbxsd/v1.0/scons.xsd">
+
+<tool name="clangxx">
+<summary>
+<para>
+Set construction variables for the Clang C++ compiler.
+</para>
+</summary>
+<sets>
+<item>CXX</item>
+<item>SHCXXFLAGS</item>
+<item>STATIC_AND_SHARED_OBJECTS_ARE_THE_SAME</item>
+<item>SHOBJSUFFIX</item>
+<item>CXXVERSION</item>
+</sets>
+</tool>
+
+</sconsdoc>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/cvf.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/cvf.py
new file mode 100644
index 0000000..da2c910
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/cvf.py
@@ -0,0 +1,58 @@
+"""engine.SCons.Tool.cvf
+
+Tool-specific initialization for the Compaq Visual Fortran compiler.
+
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+from . import fortran
+
+compilers = ['f90']
+
+def generate(env):
+ """Add Builders and construction variables for compaq visual fortran to an Environment."""
+
+ fortran.generate(env)
+
+ env['FORTRAN'] = 'f90'
+ env['FORTRANCOM'] = '$FORTRAN $FORTRANFLAGS $_FORTRANMODFLAG $_FORTRANINCFLAGS /compile_only ${SOURCES.windows} /object:${TARGET.windows}'
+ env['FORTRANPPCOM'] = '$FORTRAN $FORTRANFLAGS $CPPFLAGS $_CPPDEFFLAGS $_FORTRANMODFLAG $_FORTRANINCFLAGS /compile_only ${SOURCES.windows} /object:${TARGET.windows}'
+ env['SHFORTRANCOM'] = '$SHFORTRAN $SHFORTRANFLAGS $_FORTRANMODFLAG $_FORTRANINCFLAGS /compile_only ${SOURCES.windows} /object:${TARGET.windows}'
+ env['SHFORTRANPPCOM'] = '$SHFORTRAN $SHFORTRANFLAGS $CPPFLAGS $_CPPDEFFLAGS $_FORTRANMODFLAG $_FORTRANINCFLAGS /compile_only ${SOURCES.windows} /object:${TARGET.windows}'
+ env['OBJSUFFIX'] = '.obj'
+ env['FORTRANMODDIR'] = '${TARGET.dir}'
+ env['FORTRANMODDIRPREFIX'] = '/module:'
+ env['FORTRANMODDIRSUFFIX'] = ''
+
+def exists(env):
+ return env.Detect(compilers)
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/cvf.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/cvf.xml
new file mode 100644
index 0000000..e6c550b
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/cvf.xml
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+__COPYRIGHT__
+
+This file is processed by the bin/SConsDoc.py module.
+See its __doc__ string for a discussion of the format.
+-->
+
+<!DOCTYPE sconsdoc [
+<!ENTITY % scons SYSTEM '../../../../doc/scons.mod'>
+%scons;
+<!ENTITY % builders-mod SYSTEM '../../../../doc/generated/builders.mod'>
+%builders-mod;
+<!ENTITY % functions-mod SYSTEM '../../../../doc/generated/functions.mod'>
+%functions-mod;
+<!ENTITY % tools-mod SYSTEM '../../../../doc/generated/tools.mod'>
+%tools-mod;
+<!ENTITY % variables-mod SYSTEM '../../../../doc/generated/variables.mod'>
+%variables-mod;
+]>
+
+<sconsdoc xmlns="http://www.scons.org/dbxsd/v1.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://www.scons.org/dbxsd/v1.0 http://www.scons.org/dbxsd/v1.0/scons.xsd">
+
+<tool name="cvf">
+<summary>
+<para>
+Sets construction variables for the Compaq Visual Fortran compiler.
+</para>
+</summary>
+<sets>
+<item>FORTRAN</item>
+<item>FORTRANCOM</item>
+<item>FORTRANPPCOM</item>
+<item>SHFORTRANCOM</item>
+<item>SHFORTRANPPCOM</item>
+<item>OBJSUFFIX</item>
+<item>FORTRANMODDIR</item>
+<item>FORTRANMODDIRPREFIX</item>
+<item>FORTRANMODDIRSUFFIX</item>
+</sets>
+<uses>
+<item>FORTRANFLAGS</item>
+<item>SHFORTRANFLAGS</item>
+<item>_FORTRANMODFLAG</item>
+<item>_FORTRANINCFLAGS</item>
+<item>CPPFLAGS</item>
+<item>_CPPDEFFLAGS</item>
+</uses>
+</tool>
+
+</sconsdoc>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/cxx.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/cxx.py
new file mode 100644
index 0000000..430851c
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/cxx.py
@@ -0,0 +1,100 @@
+"""SCons.Tool.c++
+
+Tool-specific initialization for generic Posix C++ compilers.
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import os.path
+
+import SCons.Tool
+import SCons.Defaults
+import SCons.Util
+
+compilers = ['CC', 'c++']
+
+CXXSuffixes = ['.cpp', '.cc', '.cxx', '.c++', '.C++', '.mm']
+if SCons.Util.case_sensitive_suffixes('.c', '.C'):
+ CXXSuffixes.append('.C')
+
+def iscplusplus(source):
+ if not source:
+ # Source might be None for unusual cases like SConf.
+ return 0
+ for s in source:
+ if s.sources:
+ ext = os.path.splitext(str(s.sources[0]))[1]
+ if ext in CXXSuffixes:
+ return 1
+ return 0
+
+def generate(env):
+ """
+ Add Builders and construction variables for Visual Age C++ compilers
+ to an Environment.
+ """
+ import SCons.Tool
+ import SCons.Tool.cc
+ static_obj, shared_obj = SCons.Tool.createObjBuilders(env)
+
+ for suffix in CXXSuffixes:
+ static_obj.add_action(suffix, SCons.Defaults.CXXAction)
+ shared_obj.add_action(suffix, SCons.Defaults.ShCXXAction)
+ static_obj.add_emitter(suffix, SCons.Defaults.StaticObjectEmitter)
+ shared_obj.add_emitter(suffix, SCons.Defaults.SharedObjectEmitter)
+
+ SCons.Tool.cc.add_common_cc_variables(env)
+
+ if 'CXX' not in env:
+ env['CXX'] = env.Detect(compilers) or compilers[0]
+ env['CXXFLAGS'] = SCons.Util.CLVar('')
+ env['CXXCOM'] = '$CXX -o $TARGET -c $CXXFLAGS $CCFLAGS $_CCCOMCOM $SOURCES'
+ env['SHCXX'] = '$CXX'
+ env['SHCXXFLAGS'] = SCons.Util.CLVar('$CXXFLAGS')
+ env['SHCXXCOM'] = '$SHCXX -o $TARGET -c $SHCXXFLAGS $SHCCFLAGS $_CCCOMCOM $SOURCES'
+
+ env['CPPDEFPREFIX'] = '-D'
+ env['CPPDEFSUFFIX'] = ''
+ env['INCPREFIX'] = '-I'
+ env['INCSUFFIX'] = ''
+ env['SHOBJSUFFIX'] = '.os'
+ env['OBJSUFFIX'] = '.o'
+ env['STATIC_AND_SHARED_OBJECTS_ARE_THE_SAME'] = 0
+
+ env['CXXFILESUFFIX'] = '.cc'
+
+def exists(env):
+ return env.Detect(env.get('CXX', compilers))
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/cyglink.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/cyglink.py
new file mode 100644
index 0000000..f69b886
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/cyglink.py
@@ -0,0 +1,236 @@
+"""SCons.Tool.cyglink
+
+Customization of gnulink for Cygwin (http://www.cygwin.com/)
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+
+"""
+
+from __future__ import absolute_import, print_function
+
+import re
+import os
+
+import SCons.Action
+import SCons.Util
+import SCons.Tool
+
+#MAYBE: from . import gnulink
+from . import gnulink
+from . import link
+
+def _lib_generator(target, source, env, for_signature, **kw):
+ try: cmd = kw['cmd']
+ except KeyError: cmd = SCons.Util.CLVar(['$SHLINK'])
+
+ try: vp = kw['varprefix']
+ except KeyError: vp = 'SHLIB'
+
+ dll = env.FindIxes(target, '%sPREFIX' % vp, '%sSUFFIX' % vp)
+ if dll: cmd.extend(['-o', dll])
+
+ cmd.extend(['$SHLINKFLAGS', '$__%sVERSIONFLAGS' % vp, '$__RPATH'])
+
+ implib = env.FindIxes(target, 'IMPLIBPREFIX', 'IMPLIBSUFFIX')
+ if implib:
+ cmd.extend([
+ '-Wl,--out-implib='+implib.get_string(for_signature),
+ '-Wl,--export-all-symbols',
+ '-Wl,--enable-auto-import',
+ '-Wl,--whole-archive', '$SOURCES',
+ '-Wl,--no-whole-archive', '$_LIBDIRFLAGS', '$_LIBFLAGS'
+ ])
+ else:
+ cmd.extend(['$SOURCES', '$_LIBDIRFLAGS', '$_LIBFLAGS'])
+
+ return [cmd]
+
+
+def shlib_generator(target, source, env, for_signature):
+ return _lib_generator(target, source, env, for_signature,
+ varprefix='SHLIB',
+ cmd = SCons.Util.CLVar(['$SHLINK']))
+
+def ldmod_generator(target, source, env, for_signature):
+ return _lib_generator(target, source, env, for_signature,
+ varprefix='LDMODULE',
+ cmd = SCons.Util.CLVar(['$LDMODULE']))
+
+def _lib_emitter(target, source, env, **kw):
+ Verbose = False
+
+ if Verbose:
+ print("_lib_emitter: target[0]=%r" % target[0].get_path())
+
+ try: vp = kw['varprefix']
+ except KeyError: vp = 'SHLIB'
+
+ try: libtype = kw['libtype']
+ except KeyError: libtype = 'ShLib'
+
+ dll = env.FindIxes(target, '%sPREFIX' % vp, '%sSUFFIX' % vp)
+ no_import_lib = env.get('no_import_lib', 0)
+
+ if Verbose:
+ print("_lib_emitter: dll=%r" % dll.get_path())
+
+ if not dll or len(target) > 1:
+ raise SCons.Errors.UserError("A shared library should have exactly one target with the suffix: %s" % env.subst("$%sSUFFIX" % vp))
+
+ # Remove any "lib" after the prefix
+ pre = env.subst('$%sPREFIX' % vp)
+ if dll.name[len(pre):len(pre)+3] == 'lib':
+ dll.name = pre + dll.name[len(pre)+3:]
+
+ if Verbose:
+ print("_lib_emitter: dll.name=%r" % dll.name)
+
+ orig_target = target
+ target = [env.fs.File(dll)]
+ target[0].attributes.shared = 1
+
+ if Verbose:
+ print("_lib_emitter: after target=[env.fs.File(dll)]: target[0]=%r" % target[0].get_path())
+
+ # Append an import lib target
+ if not no_import_lib:
+ # Create list of target libraries as strings
+ target_strings = env.ReplaceIxes(orig_target[0],
+ '%sPREFIX' % vp, '%sSUFFIX' % vp,
+ 'IMPLIBPREFIX', 'IMPLIBSUFFIX')
+ if Verbose:
+ print("_lib_emitter: target_strings=%r" % target_strings)
+
+ implib_target = env.fs.File(target_strings)
+ if Verbose:
+ print("_lib_emitter: implib_target=%r" % implib_target.get_path())
+ implib_target.attributes.shared = 1
+ target.append(implib_target)
+
+ symlinks = SCons.Tool.ImpLibSymlinkGenerator(env, implib_target,
+ implib_libtype=libtype,
+ generator_libtype=libtype+'ImpLib')
+ if Verbose:
+ print("_lib_emitter: implib symlinks=%r" % SCons.Tool.StringizeLibSymlinks(symlinks))
+ if symlinks:
+ SCons.Tool.EmitLibSymlinks(env, symlinks, implib_target, clean_targets = target[0])
+ implib_target.attributes.shliblinks = symlinks
+
+ return (target, source)
+
+def shlib_emitter(target, source, env):
+ return _lib_emitter(target, source, env, varprefix='SHLIB', libtype='ShLib')
+
+def ldmod_emitter(target, source, env):
+ return _lib_emitter(target, source, env, varprefix='LDMODULE', libtype='LdMod')
+
+def _versioned_lib_suffix(env, suffix, version):
+ """Generate versioned shared library suffix from a unversioned one.
+ If suffix='.dll', and version='0.1.2', then it returns '-0-1-2.dll'"""
+ Verbose = False
+ if Verbose:
+ print("_versioned_lib_suffix: suffix= ", suffix)
+ print("_versioned_lib_suffix: version= ", version)
+ cygversion = re.sub('\.', '-', version)
+ if not suffix.startswith('-' + cygversion):
+ suffix = '-' + cygversion + suffix
+ if Verbose:
+ print("_versioned_lib_suffix: return suffix= ", suffix)
+ return suffix
+
+def _versioned_implib_name(env, libnode, version, prefix, suffix, **kw):
+ return link._versioned_lib_name(env, libnode, version, prefix, suffix,
+ SCons.Tool.ImpLibPrefixGenerator,
+ SCons.Tool.ImpLibSuffixGenerator,
+ implib_libtype=kw['libtype'])
+
+def _versioned_implib_symlinks(env, libnode, version, prefix, suffix, **kw):
+ """Generate link names that should be created for a versioned shared library.
+ Returns a list in the form [ (link, linktarget), ... ]
+ """
+ Verbose = False
+
+ if Verbose:
+ print("_versioned_implib_symlinks: libnode=%r" % libnode.get_path())
+ print("_versioned_implib_symlinks: version=%r" % version)
+
+ try: libtype = kw['libtype']
+ except KeyError: libtype = 'ShLib'
+
+
+ linkdir = os.path.dirname(libnode.get_path())
+ if Verbose:
+ print("_versioned_implib_symlinks: linkdir=%r" % linkdir)
+
+ name = SCons.Tool.ImpLibNameGenerator(env, libnode,
+ implib_libtype=libtype,
+ generator_libtype=libtype+'ImpLib')
+ if Verbose:
+ print("_versioned_implib_symlinks: name=%r" % name)
+
+ major = version.split('.')[0]
+
+ link0 = env.fs.File(os.path.join(linkdir, name))
+ symlinks = [(link0, libnode)]
+
+ if Verbose:
+ print("_versioned_implib_symlinks: return symlinks=%r" % SCons.Tool.StringizeLibSymlinks(symlinks))
+
+ return symlinks
+
+shlib_action = SCons.Action.Action(shlib_generator, generator=1)
+ldmod_action = SCons.Action.Action(ldmod_generator, generator=1)
+
+def generate(env):
+ """Add Builders and construction variables for cyglink to an Environment."""
+ gnulink.generate(env)
+
+ env['LINKFLAGS'] = SCons.Util.CLVar('-Wl,-no-undefined')
+
+ env['SHLINKCOM'] = shlib_action
+ env['LDMODULECOM'] = ldmod_action
+ env.Append(SHLIBEMITTER = [shlib_emitter])
+ env.Append(LDMODULEEMITTER = [ldmod_emitter])
+
+ env['SHLIBPREFIX'] = 'cyg'
+ env['SHLIBSUFFIX'] = '.dll'
+
+ env['IMPLIBPREFIX'] = 'lib'
+ env['IMPLIBSUFFIX'] = '.dll.a'
+
+ # Variables used by versioned shared libraries
+ env['_SHLIBVERSIONFLAGS'] = '$SHLIBVERSIONFLAGS'
+ env['_LDMODULEVERSIONFLAGS'] = '$LDMODULEVERSIONFLAGS'
+
+ # SHLIBVERSIONFLAGS and LDMODULEVERSIONFLAGS are same as in gnulink...
+
+ # LINKCALLBACKS are NOT inherited from gnulink
+ env['LINKCALLBACKS'] = {
+ 'VersionedShLibSuffix' : _versioned_lib_suffix,
+ 'VersionedLdModSuffix' : _versioned_lib_suffix,
+ 'VersionedImpLibSuffix' : _versioned_lib_suffix,
+ 'VersionedShLibName' : link._versioned_shlib_name,
+ 'VersionedLdModName' : link._versioned_ldmod_name,
+ 'VersionedShLibImpLibName' : lambda *args: _versioned_implib_name(*args, libtype='ShLib'),
+ 'VersionedLdModImpLibName' : lambda *args: _versioned_implib_name(*args, libtype='LdMod'),
+ 'VersionedShLibImpLibSymlinks' : lambda *args: _versioned_implib_symlinks(*args, libtype='ShLib'),
+ 'VersionedLdModImpLibSymlinks' : lambda *args: _versioned_implib_symlinks(*args, libtype='LdMod'),
+ }
+
+ # these variables were set by gnulink but are not used in cyglink
+ try: del env['_SHLIBSONAME']
+ except KeyError: pass
+ try: del env['_LDMODULESONAME']
+ except KeyError: pass
+
+def exists(env):
+ return gnulink.exists(env)
+
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/cyglink.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/cyglink.xml
new file mode 100644
index 0000000..42208f1
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/cyglink.xml
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+__COPYRIGHT__
+
+This file is processed by the bin/SConsDoc.py module.
+See its __doc__ string for a discussion of the format.
+-->
+
+<!DOCTYPE sconsdoc [
+<!ENTITY % scons SYSTEM '../../../../doc/scons.mod'>
+%scons;
+<!ENTITY % builders-mod SYSTEM '../../../../doc/generated/builders.mod'>
+%builders-mod;
+<!ENTITY % functions-mod SYSTEM '../../../../doc/generated/functions.mod'>
+%functions-mod;
+<!ENTITY % tools-mod SYSTEM '../../../../doc/generated/tools.mod'>
+%tools-mod;
+<!ENTITY % variables-mod SYSTEM '../../../../doc/generated/variables.mod'>
+%variables-mod;
+]>
+
+<sconsdoc xmlns="http://www.scons.org/dbxsd/v1.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://www.scons.org/dbxsd/v1.0 http://www.scons.org/dbxsd/v1.0/scons.xsd">
+
+<tool name="cyglink">
+<summary>
+<para>
+Set construction variables for cygwin linker/loader.
+</para>
+</summary>
+<sets>
+<item>IMPLIBPREFIX</item>
+<item>IMPLIBSUFFIX</item>
+<item>LDMODULEVERSIONFLAGS</item>
+<item>LINKFLAGS</item>
+<item>RPATHPREFIX</item>
+<item>RPATHSUFFIX</item>
+<item>SHLIBPREFIX</item>
+<item>SHLIBSUFFIX</item>
+<item>SHLIBVERSIONFLAGS</item>
+<item>SHLINKCOM</item>
+<item>SHLINKFLAGS</item>
+<item>_LDMODULEVERSIONFLAGS</item>
+<item>_SHLIBVERSIONFLAGS</item>
+</sets>
+</tool>
+
+</sconsdoc>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/default.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/default.py
new file mode 100644
index 0000000..a36e9ec
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/default.py
@@ -0,0 +1,50 @@
+"""SCons.Tool.default
+
+Initialization with a default tool list.
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import SCons.Tool
+
+def generate(env):
+ """Add default tools."""
+ for t in SCons.Tool.tool_list(env['PLATFORM'], env):
+ SCons.Tool.Tool(t)(env)
+
+def exists(env):
+ return 1
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/default.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/default.xml
new file mode 100644
index 0000000..38eb122
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/default.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+__COPYRIGHT__
+
+This file is processed by the bin/SConsDoc.py module.
+See its __doc__ string for a discussion of the format.
+-->
+
+<!DOCTYPE sconsdoc [
+<!ENTITY % scons SYSTEM '../../../../doc/scons.mod'>
+%scons;
+<!ENTITY % builders-mod SYSTEM '../../../../doc/generated/builders.mod'>
+%builders-mod;
+<!ENTITY % functions-mod SYSTEM '../../../../doc/generated/functions.mod'>
+%functions-mod;
+<!ENTITY % tools-mod SYSTEM '../../../../doc/generated/tools.mod'>
+%tools-mod;
+<!ENTITY % variables-mod SYSTEM '../../../../doc/generated/variables.mod'>
+%variables-mod;
+]>
+
+<sconsdoc xmlns="http://www.scons.org/dbxsd/v1.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://www.scons.org/dbxsd/v1.0 http://www.scons.org/dbxsd/v1.0/scons.xsd">
+
+<tool name="default">
+<summary>
+<para>
+Sets variables by calling a default list of Tool modules
+for the platform on which SCons is running.
+</para>
+</summary>
+</tool>
+
+</sconsdoc>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/dmd.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/dmd.py
new file mode 100644
index 0000000..6a64a72
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/dmd.py
@@ -0,0 +1,161 @@
+from __future__ import print_function
+
+"""SCons.Tool.dmd
+
+Tool-specific initialization for the Digital Mars D compiler.
+(http://digitalmars.com/d)
+
+Originally coded by Andy Friesen (andy@ikagames.com)
+15 November 2003
+
+Evolved by Russel Winder (russel@winder.org.uk)
+2010-02-07 onwards
+
+Compiler variables:
+ DC - The name of the D compiler to use. Defaults to dmd or gdmd,
+ whichever is found.
+ DPATH - List of paths to search for import modules.
+ DVERSIONS - List of version tags to enable when compiling.
+ DDEBUG - List of debug tags to enable when compiling.
+
+Linker related variables:
+ LIBS - List of library files to link in.
+ DLINK - Name of the linker to use. Defaults to dmd or gdmd,
+ whichever is found.
+ DLINKFLAGS - List of linker flags.
+
+Lib tool variables:
+ DLIB - Name of the lib tool to use. Defaults to lib.
+ DLIBFLAGS - List of flags to pass to the lib tool.
+ LIBS - Same as for the linker. (libraries to pull into the .lib)
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import os
+import subprocess
+
+import SCons.Action
+import SCons.Builder
+import SCons.Defaults
+import SCons.Scanner.D
+import SCons.Tool
+
+import SCons.Tool.DCommon as DCommon
+
+
+def generate(env):
+ static_obj, shared_obj = SCons.Tool.createObjBuilders(env)
+
+ static_obj.add_action('.d', SCons.Defaults.DAction)
+ shared_obj.add_action('.d', SCons.Defaults.ShDAction)
+ static_obj.add_emitter('.d', SCons.Defaults.StaticObjectEmitter)
+ shared_obj.add_emitter('.d', SCons.Defaults.SharedObjectEmitter)
+
+ env['DC'] = env.Detect(['dmd', 'ldmd2', 'gdmd']) or 'dmd'
+ env['DCOM'] = '$DC $_DINCFLAGS $_DVERFLAGS $_DDEBUGFLAGS $_DFLAGS -c -of$TARGET $SOURCES'
+ env['_DINCFLAGS'] = '${_concat(DINCPREFIX, DPATH, DINCSUFFIX, __env__, RDirs, TARGET, SOURCE)}'
+ env['_DVERFLAGS'] = '${_concat(DVERPREFIX, DVERSIONS, DVERSUFFIX, __env__)}'
+ env['_DDEBUGFLAGS'] = '${_concat(DDEBUGPREFIX, DDEBUG, DDEBUGSUFFIX, __env__)}'
+ env['_DFLAGS'] = '${_concat(DFLAGPREFIX, DFLAGS, DFLAGSUFFIX, __env__)}'
+
+ env['SHDC'] = '$DC'
+ env['SHDCOM'] = '$DC $_DINCFLAGS $_DVERFLAGS $_DDEBUGFLAGS $_DFLAGS -c -fPIC -of$TARGET $SOURCES'
+
+ env['DPATH'] = ['#/']
+ env['DFLAGS'] = []
+ env['DVERSIONS'] = []
+ env['DDEBUG'] = []
+
+ if env['DC']:
+ DCommon.addDPATHToEnv(env, env['DC'])
+
+ env['DINCPREFIX'] = '-I'
+ env['DINCSUFFIX'] = ''
+ env['DVERPREFIX'] = '-version='
+ env['DVERSUFFIX'] = ''
+ env['DDEBUGPREFIX'] = '-debug='
+ env['DDEBUGSUFFIX'] = ''
+ env['DFLAGPREFIX'] = '-'
+ env['DFLAGSUFFIX'] = ''
+ env['DFILESUFFIX'] = '.d'
+
+ env['DLINK'] = '$DC'
+ env['DLINKFLAGS'] = SCons.Util.CLVar('')
+ env['DLINKCOM'] = '$DLINK -of$TARGET $DLINKFLAGS $__DRPATH $SOURCES $_DLIBDIRFLAGS $_DLIBFLAGS'
+
+ env['SHDLINK'] = '$DC'
+ env['SHDLINKFLAGS'] = SCons.Util.CLVar('$DLINKFLAGS -shared -defaultlib=libphobos2.so')
+ env['SHDLINKCOM'] = '$DLINK -of$TARGET $SHDLINKFLAGS $__SHDLIBVERSIONFLAGS $__DRPATH $SOURCES $_DLIBDIRFLAGS $_DLIBFLAGS'
+
+ env['DLIBLINKPREFIX'] = '' if env['PLATFORM'] == 'win32' else '-L-l'
+ env['DLIBLINKSUFFIX'] = '.lib' if env['PLATFORM'] == 'win32' else ''
+ env['_DLIBFLAGS'] = '${_stripixes(DLIBLINKPREFIX, LIBS, DLIBLINKSUFFIX, LIBPREFIXES, LIBSUFFIXES, __env__)}'
+
+ env['DLIBDIRPREFIX'] = '-L-L'
+ env['DLIBDIRSUFFIX'] = ''
+ env['_DLIBDIRFLAGS'] = '${_concat(DLIBDIRPREFIX, LIBPATH, DLIBDIRSUFFIX, __env__, RDirs, TARGET, SOURCE)}'
+
+ env['DLIB'] = 'lib' if env['PLATFORM'] == 'win32' else 'ar cr'
+ env['DLIBCOM'] = '$DLIB $_DLIBFLAGS {0}$TARGET $SOURCES $_DLIBFLAGS'.format('-c ' if env['PLATFORM'] == 'win32' else '')
+
+ # env['_DLIBFLAGS'] = '${_concat(DLIBFLAGPREFIX, DLIBFLAGS, DLIBFLAGSUFFIX, __env__)}'
+
+ env['DLIBFLAGPREFIX'] = '-'
+ env['DLIBFLAGSUFFIX'] = ''
+
+ # __RPATH is set to $_RPATH in the platform specification if that
+ # platform supports it.
+ env['DRPATHPREFIX'] = '-L-rpath,' if env['PLATFORM'] == 'darwin' else '-L-rpath='
+ env['DRPATHSUFFIX'] = ''
+ env['_DRPATH'] = '${_concat(DRPATHPREFIX, RPATH, DRPATHSUFFIX, __env__)}'
+
+ # Support for versioned libraries
+ env['_SHDLIBVERSIONFLAGS'] = '$SHDLIBVERSIONFLAGS -L-soname=$_SHDLIBSONAME'
+ env['_SHDLIBSONAME'] = '${DShLibSonameGenerator(__env__,TARGET)}'
+ # NOTE: this is a quick hack, the soname will only work if there is
+ # c/c++ linker loaded which provides callback for the ShLibSonameGenerator
+ env['DShLibSonameGenerator'] = SCons.Tool.ShLibSonameGenerator
+ # NOTE: this is only for further reference, currently $SHDLIBVERSION does
+ # not work, the user must use $SHLIBVERSION
+ env['SHDLIBVERSION'] = '$SHLIBVERSION'
+ env['SHDLIBVERSIONFLAGS'] = []
+
+ env['BUILDERS']['ProgramAllAtOnce'] = SCons.Builder.Builder(
+ action='$DC $_DINCFLAGS $_DVERFLAGS $_DDEBUGFLAGS $_DFLAGS -of$TARGET $DLINKFLAGS $__DRPATH $SOURCES $_DLIBDIRFLAGS $_DLIBFLAGS',
+ emitter=DCommon.allAtOnceEmitter,
+ )
+
+
+def exists(env):
+ return env.Detect(['dmd', 'ldmd2', 'gdmd'])
+
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/dmd.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/dmd.xml
new file mode 100644
index 0000000..7e220dc
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/dmd.xml
@@ -0,0 +1,371 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+__COPYRIGHT__
+
+This file is processed by the bin/SConsDoc.py module.
+See its __doc__ string for a discussion of the format.
+-->
+
+<!DOCTYPE sconsdoc [
+<!ENTITY % scons SYSTEM '../../../../doc/scons.mod'>
+%scons;
+<!ENTITY % builders-mod SYSTEM '../../../../doc/generated/builders.mod'>
+%builders-mod;
+<!ENTITY % functions-mod SYSTEM '../../../../doc/generated/functions.mod'>
+%functions-mod;
+<!ENTITY % tools-mod SYSTEM '../../../../doc/generated/tools.mod'>
+%tools-mod;
+<!ENTITY % variables-mod SYSTEM '../../../../doc/generated/variables.mod'>
+%variables-mod;
+]>
+
+<sconsdoc xmlns="http://www.scons.org/dbxsd/v1.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://www.scons.org/dbxsd/v1.0/scons.xsd">
+
+<tool name="dmd">
+<summary>
+<para>
+Sets construction variables for D language compiler DMD.
+</para>
+</summary>
+<sets>
+<item>DC</item>
+<item>DCOM</item>
+<item>SHDC</item>
+<item>SHDCOM</item>
+<item>DPATH</item>
+<item>DFLAGS</item>
+<item>DVERSIONS</item>
+<item>DDEBUG</item>
+<item>DINCPREFIX</item>
+<item>DINCSUFFIX</item>
+<item>DVERPREFIX</item>
+<item>DVERSUFFIX</item>
+<item>DDEBUGPREFIX</item>
+<item>DDEBUGSUFFIX</item>
+<item>DFLAGPREFIX</item>
+<item>DFLAGSUFFIX</item>
+<item>DFILESUFFIX</item>
+<item>DLINK</item>
+<item>DLINKFLAGS</item>
+<item>DLINKCOM</item>
+<item>SHDLINK</item>
+<item>SHDLINKFLAGS</item>
+<item>SHDLINKCOM</item>
+<item>DLIBLINKPREFIX</item>
+<item>DLIBLINKSUFFIX</item>
+<item>DLIBDIRPREFIX</item>
+<item>DLIBDIRSUFFIX</item>
+<item>DLIB</item>
+<item>DLIBCOM</item>
+<item>DLIBFLAGPREFIX</item>
+<item>DLIBFLAGSUFFIX</item>
+<item>DLINKFLAGPREFIX</item>
+<item>DLINKFLAGSUFFIX</item>
+<item>DRPATHPREFIX</item>
+<item>DRPATHSUFFIX</item>
+<item>DShLibSonameGenerator</item>
+<item>SHDLIBVERSION</item>
+<item>SHDLIBVERSIONFLAGS</item>
+</sets>
+<uses>
+</uses>
+</tool>
+
+<cvar name="DC">
+<summary>
+<para>
+The D compiler to use.
+</para>
+</summary>
+</cvar>
+
+<cvar name="DCOM">
+<summary>
+<para>
+ The command line used to compile a D file to an object file.
+ Any options specified in the &cv-link-DFLAGS; construction variable
+ is included on this command line.
+</para>
+</summary>
+</cvar>
+
+<cvar name="DDEBUG">
+<summary>
+<para>
+ List of debug tags to enable when compiling.
+</para>
+</summary>
+</cvar>
+
+<cvar name="DFLAGS">
+<summary>
+<para>
+ General options that are passed to the D compiler.
+</para>
+</summary>
+</cvar>
+
+<cvar name="DLIB">
+<summary>
+<para>
+ Name of the lib tool to use for D codes.
+</para>
+</summary>
+</cvar>
+
+<cvar name="DLIBCOM">
+<summary>
+<para>
+ The command line to use when creating libraries.
+</para>
+</summary>
+</cvar>
+
+<cvar name="DLINK">
+<summary>
+<para>
+ Name of the linker to use for linking systems including D sources.
+</para>
+</summary>
+</cvar>
+
+<cvar name="DLINKCOM">
+<summary>
+<para>
+ The command line to use when linking systems including D sources.
+</para>
+</summary>
+</cvar>
+
+<cvar name="DLINKFLAGS">
+<summary>
+<para>
+List of linker flags.
+</para>
+</summary>
+</cvar>
+
+<cvar name="DPATH">
+<summary>
+<para>
+ List of paths to search for import modules.
+</para>
+</summary>
+</cvar>
+
+<cvar name="DVERSIONS">
+<summary>
+<para>
+ List of version tags to enable when compiling.
+</para>
+</summary>
+</cvar>
+
+<cvar name="SHDC">
+<summary>
+<para>
+ The name of the compiler to use when compiling D source
+ destined to be in a shared objects.
+</para>
+</summary>
+</cvar>
+
+<cvar name="SHDCOM">
+<summary>
+<para>
+ The command line to use when compiling code to be part of shared objects.
+</para>
+</summary>
+</cvar>
+
+<cvar name="SHDLINK">
+<summary>
+<para>
+ The linker to use when creating shared objects for code bases
+ include D sources.
+</para>
+</summary>
+</cvar>
+
+<cvar name="SHDLINKCOM">
+<summary>
+<para>
+ The command line to use when generating shared objects.
+</para>
+</summary>
+</cvar>
+
+<cvar name="SHDLINKFLAGS">
+<summary>
+<para>
+ The list of flags to use when generating a shared object.
+</para>
+</summary>
+</cvar>
+
+<cvar name="DVERSUFFIX">
+ <summary>
+ <para>
+ DVERSUFFIX.
+ </para>
+ </summary>
+</cvar>
+
+<cvar name="DVERPREFIX">
+ <summary>
+ <para>
+ DVERPREFIX.
+ </para>
+ </summary>
+</cvar>
+
+<cvar name="DLINKFLAGSUFFIX">
+ <summary>
+ <para>
+ DLINKFLAGSUFFIX.
+ </para>
+ </summary>
+</cvar>
+
+<cvar name="DLINKFLAGPREFIX">
+ <summary>
+ <para>
+ DLINKFLAGPREFIX.
+ </para>
+ </summary>
+</cvar>
+
+<cvar name="DLIBLINKSUFFIX">
+ <summary>
+ <para>
+ DLIBLINKSUFFIX.
+ </para>
+ </summary>
+</cvar>
+
+<cvar name="DLIBLINKPREFIX">
+ <summary>
+ <para>
+ DLIBLINKPREFIX.
+ </para>
+ </summary>
+</cvar>
+
+<cvar name="DLIBFLAGSUFFIX">
+ <summary>
+ <para>
+ DLIBFLAGSUFFIX.
+ </para>
+ </summary>
+</cvar>
+
+<cvar name="DLIBFLAGPREFIX">
+ <summary>
+ <para>
+ DLIBFLAGPREFIX.
+ </para>
+ </summary>
+</cvar>
+
+<cvar name="DLIBDIRSUFFIX">
+ <summary>
+ <para>
+ DLIBLINKSUFFIX.
+ </para>
+ </summary>
+</cvar>
+
+<cvar name="DLIBDIRPREFIX">
+ <summary>
+ <para>
+ DLIBLINKPREFIX.
+ </para>
+ </summary>
+</cvar>
+
+<cvar name="DINCSUFFIX">
+ <summary>
+ <para>
+ DLIBFLAGSUFFIX.
+ </para>
+ </summary>
+</cvar>
+
+
+<cvar name="DINCPREFIX">
+ <summary>
+ <para>
+ DINCPREFIX.
+ </para>
+ </summary>
+</cvar>
+
+<cvar name="DFLAGSUFFIX">
+ <summary>
+ <para>
+ DFLAGSUFFIX.
+ </para>
+ </summary>
+</cvar>
+
+<cvar name="DFLAGPREFIX">
+ <summary>
+ <para>
+ DFLAGPREFIX.
+ </para>
+ </summary>
+</cvar>
+
+<cvar name="DFILESUFFIX">
+ <summary>
+ <para>
+ DFILESUFFIX.
+ </para>
+ </summary>
+</cvar>
+
+<cvar name="DDEBUGPREFIX">
+ <summary>
+ <para>
+ DDEBUGPREFIX.
+ </para>
+ </summary>
+</cvar>
+
+<cvar name="DDEBUGSUFFIX">
+ <summary>
+ <para>
+ DDEBUGSUFFIX.
+ </para>
+ </summary>
+</cvar>
+
+<builder name="ProgramAllAtOnce">
+ <summary>
+ <para>
+ Builds an executable from D sources without first creating individual
+ objects for each file.
+ </para>
+ <para>
+ D sources can be compiled file-by-file as C and C++ source are, and
+ D is integrated into the &scons; Object and Program builders for
+ this model of build. D codes can though do whole source
+ meta-programming (some of the testing frameworks do this). For this
+ it is imperative that all sources are compiled and linked in a single call of
+ the D compiler. This builder serves that purpose.
+ </para>
+ <example_commands>
+ env.ProgramAllAtOnce('executable', ['mod_a.d, mod_b.d', 'mod_c.d'])
+ </example_commands>
+ <para>
+ This command will compile the modules mod_a, mod_b, and mod_c in a
+ single compilation process without first creating object files for
+ the modules. Some of the D compilers will create executable.o others
+ will not.
+ </para>
+ </summary>
+</builder>
+
+</sconsdoc>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/__init__.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/__init__.py
new file mode 100644
index 0000000..d60789d
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/__init__.py
@@ -0,0 +1,883 @@
+
+"""SCons.Tool.docbook
+
+Tool-specific initialization for Docbook.
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+import os
+import glob
+import re
+
+import SCons.Action
+import SCons.Builder
+import SCons.Defaults
+import SCons.Script
+import SCons.Tool
+import SCons.Util
+
+
+__debug_tool_location = False
+# Get full path to this script
+scriptpath = os.path.dirname(os.path.realpath(__file__))
+
+# Local folder for the collection of DocBook XSLs
+db_xsl_folder = 'docbook-xsl-1.76.1'
+
+# Do we have libxml2/libxslt/lxml?
+has_libxml2 = True
+has_lxml = True
+try:
+ import libxml2
+ import libxslt
+except:
+ has_libxml2 = False
+try:
+ import lxml
+except:
+ has_lxml = False
+
+# Set this to True, to prefer xsltproc over libxml2 and lxml
+prefer_xsltproc = False
+
+# Regexs for parsing Docbook XML sources of MAN pages
+re_manvolnum = re.compile("<manvolnum>([^<]*)</manvolnum>")
+re_refname = re.compile("<refname>([^<]*)</refname>")
+
+#
+# Helper functions
+#
+def __extend_targets_sources(target, source):
+ """ Prepare the lists of target and source files. """
+ if not SCons.Util.is_List(target):
+ target = [target]
+ if not source:
+ source = target[:]
+ elif not SCons.Util.is_List(source):
+ source = [source]
+ if len(target) < len(source):
+ target.extend(source[len(target):])
+
+ return target, source
+
+def __init_xsl_stylesheet(kw, env, user_xsl_var, default_path):
+ if kw.get('DOCBOOK_XSL','') == '':
+ xsl_style = kw.get('xsl', env.subst(user_xsl_var))
+ if xsl_style == '':
+ path_args = [scriptpath, db_xsl_folder] + default_path
+ xsl_style = os.path.join(*path_args)
+ kw['DOCBOOK_XSL'] = xsl_style
+
+def __select_builder(lxml_builder, libxml2_builder, cmdline_builder):
+ """ Selects a builder, based on which Python modules are present. """
+ if prefer_xsltproc:
+ return cmdline_builder
+
+ if not has_libxml2:
+ # At the moment we prefer libxml2 over lxml, the latter can lead
+ # to conflicts when installed together with libxml2.
+ if has_lxml:
+ return lxml_builder
+ else:
+ return cmdline_builder
+
+ return libxml2_builder
+
+def __ensure_suffix(t, suffix):
+ """ Ensure that the target t has the given suffix. """
+ tpath = str(t)
+ if not tpath.endswith(suffix):
+ return tpath+suffix
+
+ return t
+
+def __ensure_suffix_stem(t, suffix):
+ """ Ensure that the target t has the given suffix, and return the file's stem. """
+ tpath = str(t)
+ if not tpath.endswith(suffix):
+ stem = tpath
+ tpath += suffix
+
+ return tpath, stem
+ else:
+ stem, ext = os.path.splitext(tpath)
+
+ return t, stem
+
+def __get_xml_text(root):
+ """ Return the text for the given root node (xml.dom.minidom). """
+ txt = ""
+ for e in root.childNodes:
+ if (e.nodeType == e.TEXT_NODE):
+ txt += e.data
+ return txt
+
+def __create_output_dir(base_dir):
+ """ Ensure that the output directory base_dir exists. """
+ root, tail = os.path.split(base_dir)
+ dir = None
+ if tail:
+ if base_dir.endswith('/'):
+ dir = base_dir
+ else:
+ dir = root
+ else:
+ if base_dir.endswith('/'):
+ dir = base_dir
+
+ if dir and not os.path.isdir(dir):
+ os.makedirs(dir)
+
+
+#
+# Supported command line tools and their call "signature"
+#
+xsltproc_com_priority = ['xsltproc', 'saxon', 'saxon-xslt', 'xalan']
+
+# TODO: Set minimum version of saxon-xslt to be 8.x (lower than this only supports xslt 1.0.
+# see: http://saxon.sourceforge.net/saxon6.5.5/
+# see: http://saxon.sourceforge.net/
+xsltproc_com = {'xsltproc' : '$DOCBOOK_XSLTPROC $DOCBOOK_XSLTPROCFLAGS -o $TARGET $DOCBOOK_XSL $SOURCE',
+ 'saxon' : '$DOCBOOK_XSLTPROC $DOCBOOK_XSLTPROCFLAGS -o $TARGET $DOCBOOK_XSL $SOURCE $DOCBOOK_XSLTPROCPARAMS',
+ 'saxon-xslt' : '$DOCBOOK_XSLTPROC $DOCBOOK_XSLTPROCFLAGS -o $TARGET $DOCBOOK_XSL $SOURCE $DOCBOOK_XSLTPROCPARAMS',
+ 'xalan' : '$DOCBOOK_XSLTPROC $DOCBOOK_XSLTPROCFLAGS -q -out $TARGET -xsl $DOCBOOK_XSL -in $SOURCE'}
+xmllint_com = {'xmllint' : '$DOCBOOK_XMLLINT $DOCBOOK_XMLLINTFLAGS --xinclude $SOURCE > $TARGET'}
+fop_com = {'fop' : '$DOCBOOK_FOP $DOCBOOK_FOPFLAGS -fo $SOURCE -pdf $TARGET',
+ 'xep' : '$DOCBOOK_FOP $DOCBOOK_FOPFLAGS -valid -fo $SOURCE -pdf $TARGET',
+ 'jw' : '$DOCBOOK_FOP $DOCBOOK_FOPFLAGS -f docbook -b pdf $SOURCE -o $TARGET'}
+
+def __detect_cl_tool(env, chainkey, cdict, cpriority=None):
+ """
+ Helper function, picks a command line tool from the list
+ and initializes its environment variables.
+ """
+ if env.get(chainkey,'') == '':
+ clpath = ''
+
+ if cpriority is None:
+ cpriority = cdict.keys()
+ for cltool in cpriority:
+ if __debug_tool_location:
+ print("DocBook: Looking for %s"%cltool)
+ clpath = env.WhereIs(cltool)
+ if clpath:
+ if __debug_tool_location:
+ print("DocBook: Found:%s"%cltool)
+ env[chainkey] = clpath
+ if not env[chainkey + 'COM']:
+ env[chainkey + 'COM'] = cdict[cltool]
+ break
+
+def _detect(env):
+ """
+ Detect all the command line tools that we might need for creating
+ the requested output formats.
+ """
+ global prefer_xsltproc
+
+ if env.get('DOCBOOK_PREFER_XSLTPROC',''):
+ prefer_xsltproc = True
+
+ if ((not has_libxml2 and not has_lxml) or (prefer_xsltproc)):
+ # Try to find the XSLT processors
+ __detect_cl_tool(env, 'DOCBOOK_XSLTPROC', xsltproc_com, xsltproc_com_priority)
+ __detect_cl_tool(env, 'DOCBOOK_XMLLINT', xmllint_com)
+
+ __detect_cl_tool(env, 'DOCBOOK_FOP', fop_com, ['fop','xep','jw'])
+
+#
+# Scanners
+#
+include_re = re.compile('fileref\\s*=\\s*["|\']([^\\n]*)["|\']')
+sentity_re = re.compile('<!ENTITY\\s+%*\\s*[^\\s]+\\s+SYSTEM\\s+["|\']([^\\n]*)["|\']>')
+
+def __xml_scan(node, env, path, arg):
+ """ Simple XML file scanner, detecting local images and XIncludes as implicit dependencies. """
+ # Does the node exist yet?
+ if not os.path.isfile(str(node)):
+ return []
+
+ if env.get('DOCBOOK_SCANENT',''):
+ # Use simple pattern matching for system entities..., no support
+ # for recursion yet.
+ contents = node.get_text_contents()
+ return sentity_re.findall(contents)
+
+ xsl_file = os.path.join(scriptpath,'utils','xmldepend.xsl')
+ if not has_libxml2 or prefer_xsltproc:
+ if has_lxml and not prefer_xsltproc:
+
+ from lxml import etree
+
+ xsl_tree = etree.parse(xsl_file)
+ doc = etree.parse(str(node))
+ result = doc.xslt(xsl_tree)
+
+ depfiles = [x.strip() for x in str(result).splitlines() if x.strip() != "" and not x.startswith("<?xml ")]
+ return depfiles
+ else:
+ # Try to call xsltproc
+ xsltproc = env.subst("$DOCBOOK_XSLTPROC")
+ if xsltproc and xsltproc.endswith('xsltproc'):
+ result = env.backtick(' '.join([xsltproc, xsl_file, str(node)]))
+ depfiles = [x.strip() for x in str(result).splitlines() if x.strip() != "" and not x.startswith("<?xml ")]
+ return depfiles
+ else:
+ # Use simple pattern matching, there is currently no support
+ # for xi:includes...
+ contents = node.get_text_contents()
+ return include_re.findall(contents)
+
+ styledoc = libxml2.parseFile(xsl_file)
+ style = libxslt.parseStylesheetDoc(styledoc)
+ doc = libxml2.readFile(str(node), None, libxml2.XML_PARSE_NOENT)
+ result = style.applyStylesheet(doc, None)
+
+ depfiles = []
+ for x in str(result).splitlines():
+ if x.strip() != "" and not x.startswith("<?xml "):
+ depfiles.extend(x.strip().split())
+
+ style.freeStylesheet()
+ doc.freeDoc()
+ result.freeDoc()
+
+ return depfiles
+
+# Creating the instance of our XML dependency scanner
+docbook_xml_scanner = SCons.Script.Scanner(function = __xml_scan,
+ argument = None)
+
+
+#
+# Action generators
+#
+def __generate_xsltproc_action(source, target, env, for_signature):
+ cmd = env['DOCBOOK_XSLTPROCCOM']
+ # Does the environment have a base_dir defined?
+ base_dir = env.subst('$base_dir')
+ if base_dir:
+ # Yes, so replace target path by its filename
+ return cmd.replace('$TARGET','${TARGET.file}')
+ return cmd
+
+
+#
+# Emitters
+#
+def __emit_xsl_basedir(target, source, env):
+ # Does the environment have a base_dir defined?
+ base_dir = env.subst('$base_dir')
+ if base_dir:
+ # Yes, so prepend it to each target
+ return [os.path.join(base_dir, str(t)) for t in target], source
+
+ # No, so simply pass target and source names through
+ return target, source
+
+
+#
+# Builders
+#
+def __build_libxml2(target, source, env):
+ """
+ General XSLT builder (HTML/FO), using the libxml2 module.
+ """
+ xsl_style = env.subst('$DOCBOOK_XSL')
+ styledoc = libxml2.parseFile(xsl_style)
+ style = libxslt.parseStylesheetDoc(styledoc)
+ doc = libxml2.readFile(str(source[0]),None,libxml2.XML_PARSE_NOENT)
+ # Support for additional parameters
+ parampass = {}
+ if parampass:
+ result = style.applyStylesheet(doc, parampass)
+ else:
+ result = style.applyStylesheet(doc, None)
+ style.saveResultToFilename(str(target[0]), result, 0)
+ style.freeStylesheet()
+ doc.freeDoc()
+ result.freeDoc()
+
+ return None
+
+def __build_lxml(target, source, env):
+ """
+ General XSLT builder (HTML/FO), using the lxml module.
+ """
+ from lxml import etree
+
+ xslt_ac = etree.XSLTAccessControl(read_file=True,
+ write_file=True,
+ create_dir=True,
+ read_network=False,
+ write_network=False)
+ xsl_style = env.subst('$DOCBOOK_XSL')
+ xsl_tree = etree.parse(xsl_style)
+ transform = etree.XSLT(xsl_tree, access_control=xslt_ac)
+ doc = etree.parse(str(source[0]))
+ # Support for additional parameters
+ parampass = {}
+ if parampass:
+ result = transform(doc, **parampass)
+ else:
+ result = transform(doc)
+
+ try:
+ of = open(str(target[0]), "wb")
+ of.write(of.write(etree.tostring(result, pretty_print=True)))
+ of.close()
+ except:
+ pass
+
+ return None
+
+def __xinclude_libxml2(target, source, env):
+ """
+ Resolving XIncludes, using the libxml2 module.
+ """
+ doc = libxml2.readFile(str(source[0]), None, libxml2.XML_PARSE_NOENT)
+ doc.xincludeProcessFlags(libxml2.XML_PARSE_NOENT)
+ doc.saveFile(str(target[0]))
+ doc.freeDoc()
+
+ return None
+
+def __xinclude_lxml(target, source, env):
+ """
+ Resolving XIncludes, using the lxml module.
+ """
+ from lxml import etree
+
+ doc = etree.parse(str(source[0]))
+ doc.xinclude()
+ try:
+ doc.write(str(target[0]), xml_declaration=True,
+ encoding="UTF-8", pretty_print=True)
+ except:
+ pass
+
+ return None
+
+__libxml2_builder = SCons.Builder.Builder(
+ action = __build_libxml2,
+ src_suffix = '.xml',
+ source_scanner = docbook_xml_scanner,
+ emitter = __emit_xsl_basedir)
+__lxml_builder = SCons.Builder.Builder(
+ action = __build_lxml,
+ src_suffix = '.xml',
+ source_scanner = docbook_xml_scanner,
+ emitter = __emit_xsl_basedir)
+
+__xinclude_libxml2_builder = SCons.Builder.Builder(
+ action = __xinclude_libxml2,
+ suffix = '.xml',
+ src_suffix = '.xml',
+ source_scanner = docbook_xml_scanner)
+__xinclude_lxml_builder = SCons.Builder.Builder(
+ action = __xinclude_lxml,
+ suffix = '.xml',
+ src_suffix = '.xml',
+ source_scanner = docbook_xml_scanner)
+
+__xsltproc_builder = SCons.Builder.Builder(
+ action = SCons.Action.CommandGeneratorAction(__generate_xsltproc_action,
+ {'cmdstr' : '$DOCBOOK_XSLTPROCCOMSTR'}),
+ src_suffix = '.xml',
+ source_scanner = docbook_xml_scanner,
+ emitter = __emit_xsl_basedir)
+__xmllint_builder = SCons.Builder.Builder(
+ action = SCons.Action.Action('$DOCBOOK_XMLLINTCOM','$DOCBOOK_XMLLINTCOMSTR'),
+ suffix = '.xml',
+ src_suffix = '.xml',
+ source_scanner = docbook_xml_scanner)
+__fop_builder = SCons.Builder.Builder(
+ action = SCons.Action.Action('$DOCBOOK_FOPCOM','$DOCBOOK_FOPCOMSTR'),
+ suffix = '.pdf',
+ src_suffix = '.fo',
+ ensure_suffix=1)
+
+def DocbookEpub(env, target, source=None, *args, **kw):
+ """
+ A pseudo-Builder, providing a Docbook toolchain for ePub output.
+ """
+ import zipfile
+ import shutil
+
+ def build_open_container(target, source, env):
+ """Generate the *.epub file from intermediate outputs
+
+ Constructs the epub file according to the Open Container Format. This
+ function could be replaced by a call to the SCons Zip builder if support
+ was added for different compression formats for separate source nodes.
+ """
+ zf = zipfile.ZipFile(str(target[0]), 'w')
+ mime_file = open('mimetype', 'w')
+ mime_file.write('application/epub+zip')
+ mime_file.close()
+ zf.write(mime_file.name, compress_type = zipfile.ZIP_STORED)
+ for s in source:
+ if os.path.isfile(str(s)):
+ head, tail = os.path.split(str(s))
+ if not head:
+ continue
+ s = head
+ for dirpath, dirnames, filenames in os.walk(str(s)):
+ for fname in filenames:
+ path = os.path.join(dirpath, fname)
+ if os.path.isfile(path):
+ zf.write(path, os.path.relpath(path, str(env.get('ZIPROOT', ''))),
+ zipfile.ZIP_DEFLATED)
+ zf.close()
+
+ def add_resources(target, source, env):
+ """Add missing resources to the OEBPS directory
+
+ Ensure all the resources in the manifest are present in the OEBPS directory.
+ """
+ hrefs = []
+ content_file = os.path.join(source[0].get_abspath(), 'content.opf')
+ if not os.path.isfile(content_file):
+ return
+
+ hrefs = []
+ if has_libxml2:
+ nsmap = {'opf' : 'http://www.idpf.org/2007/opf'}
+ # Read file and resolve entities
+ doc = libxml2.readFile(content_file, None, 0)
+ opf = doc.getRootElement()
+ # Create xpath context
+ xpath_context = doc.xpathNewContext()
+ # Register namespaces
+ for key, val in nsmap.items():
+ xpath_context.xpathRegisterNs(key, val)
+
+ if hasattr(opf, 'xpathEval') and xpath_context:
+ # Use the xpath context
+ xpath_context.setContextNode(opf)
+ items = xpath_context.xpathEval(".//opf:item")
+ else:
+ items = opf.findall(".//{'http://www.idpf.org/2007/opf'}item")
+
+ for item in items:
+ if hasattr(item, 'prop'):
+ hrefs.append(item.prop('href'))
+ else:
+ hrefs.append(item.attrib['href'])
+
+ doc.freeDoc()
+ xpath_context.xpathFreeContext()
+ elif has_lxml:
+ from lxml import etree
+
+ opf = etree.parse(content_file)
+ # All the opf:item elements are resources
+ for item in opf.xpath('//opf:item',
+ namespaces= { 'opf': 'http://www.idpf.org/2007/opf' }):
+ hrefs.append(item.attrib['href'])
+
+ for href in hrefs:
+ # If the resource was not already created by DocBook XSL itself,
+ # copy it into the OEBPS folder
+ referenced_file = os.path.join(source[0].get_abspath(), href)
+ if not os.path.exists(referenced_file):
+ shutil.copy(href, os.path.join(source[0].get_abspath(), href))
+
+ # Init list of targets/sources
+ target, source = __extend_targets_sources(target, source)
+
+ # Init XSL stylesheet
+ __init_xsl_stylesheet(kw, env, '$DOCBOOK_DEFAULT_XSL_EPUB', ['epub','docbook.xsl'])
+
+ # Setup builder
+ __builder = __select_builder(__lxml_builder, __libxml2_builder, __xsltproc_builder)
+
+ # Create targets
+ result = []
+ if not env.GetOption('clean'):
+ # Ensure that the folders OEBPS and META-INF exist
+ __create_output_dir('OEBPS/')
+ __create_output_dir('META-INF/')
+ dirs = env.Dir(['OEBPS', 'META-INF'])
+
+ # Set the fixed base_dir
+ kw['base_dir'] = 'OEBPS/'
+ tocncx = __builder.__call__(env, 'toc.ncx', source[0], **kw)
+ cxml = env.File('META-INF/container.xml')
+ env.SideEffect(cxml, tocncx)
+
+ env.Depends(tocncx, kw['DOCBOOK_XSL'])
+ result.extend(tocncx+[cxml])
+
+ container = env.Command(__ensure_suffix(str(target[0]), '.epub'),
+ tocncx+[cxml], [add_resources, build_open_container])
+ mimetype = env.File('mimetype')
+ env.SideEffect(mimetype, container)
+
+ result.extend(container)
+ # Add supporting files for cleanup
+ env.Clean(tocncx, dirs)
+
+ return result
+
+def DocbookHtml(env, target, source=None, *args, **kw):
+ """
+ A pseudo-Builder, providing a Docbook toolchain for HTML output.
+ """
+ # Init list of targets/sources
+ target, source = __extend_targets_sources(target, source)
+
+ # Init XSL stylesheet
+ __init_xsl_stylesheet(kw, env, '$DOCBOOK_DEFAULT_XSL_HTML', ['html','docbook.xsl'])
+
+ # Setup builder
+ __builder = __select_builder(__lxml_builder, __libxml2_builder, __xsltproc_builder)
+
+ # Create targets
+ result = []
+ for t,s in zip(target,source):
+ r = __builder.__call__(env, __ensure_suffix(t,'.html'), s, **kw)
+ env.Depends(r, kw['DOCBOOK_XSL'])
+ result.extend(r)
+
+ return result
+
+def DocbookHtmlChunked(env, target, source=None, *args, **kw):
+ """
+ A pseudo-Builder, providing a Docbook toolchain for chunked HTML output.
+ """
+ # Init target/source
+ if not SCons.Util.is_List(target):
+ target = [target]
+ if not source:
+ source = target
+ target = ['index.html']
+ elif not SCons.Util.is_List(source):
+ source = [source]
+
+ # Init XSL stylesheet
+ __init_xsl_stylesheet(kw, env, '$DOCBOOK_DEFAULT_XSL_HTMLCHUNKED', ['html','chunkfast.xsl'])
+
+ # Setup builder
+ __builder = __select_builder(__lxml_builder, __libxml2_builder, __xsltproc_builder)
+
+ # Detect base dir
+ base_dir = kw.get('base_dir', '')
+ if base_dir:
+ __create_output_dir(base_dir)
+
+ # Create targets
+ result = []
+ r = __builder.__call__(env, __ensure_suffix(str(target[0]), '.html'), source[0], **kw)
+ env.Depends(r, kw['DOCBOOK_XSL'])
+ result.extend(r)
+ # Add supporting files for cleanup
+ env.Clean(r, glob.glob(os.path.join(base_dir, '*.html')))
+
+ return result
+
+
+def DocbookHtmlhelp(env, target, source=None, *args, **kw):
+ """
+ A pseudo-Builder, providing a Docbook toolchain for HTMLHELP output.
+ """
+ # Init target/source
+ if not SCons.Util.is_List(target):
+ target = [target]
+ if not source:
+ source = target
+ target = ['index.html']
+ elif not SCons.Util.is_List(source):
+ source = [source]
+
+ # Init XSL stylesheet
+ __init_xsl_stylesheet(kw, env, '$DOCBOOK_DEFAULT_XSL_HTMLHELP', ['htmlhelp','htmlhelp.xsl'])
+
+ # Setup builder
+ __builder = __select_builder(__lxml_builder, __libxml2_builder, __xsltproc_builder)
+
+ # Detect base dir
+ base_dir = kw.get('base_dir', '')
+ if base_dir:
+ __create_output_dir(base_dir)
+
+ # Create targets
+ result = []
+ r = __builder.__call__(env, __ensure_suffix(str(target[0]), '.html'), source[0], **kw)
+ env.Depends(r, kw['DOCBOOK_XSL'])
+ result.extend(r)
+ # Add supporting files for cleanup
+ env.Clean(r, ['toc.hhc', 'htmlhelp.hhp', 'index.hhk'] +
+ glob.glob(os.path.join(base_dir, '[ar|bk|ch]*.html')))
+
+ return result
+
+def DocbookPdf(env, target, source=None, *args, **kw):
+ """
+ A pseudo-Builder, providing a Docbook toolchain for PDF output.
+ """
+ # Init list of targets/sources
+ target, source = __extend_targets_sources(target, source)
+
+ # Init XSL stylesheet
+ __init_xsl_stylesheet(kw, env, '$DOCBOOK_DEFAULT_XSL_PDF', ['fo','docbook.xsl'])
+
+ # Setup builder
+ __builder = __select_builder(__lxml_builder, __libxml2_builder, __xsltproc_builder)
+
+ # Create targets
+ result = []
+ for t,s in zip(target,source):
+ t, stem = __ensure_suffix_stem(t, '.pdf')
+ xsl = __builder.__call__(env, stem+'.fo', s, **kw)
+ result.extend(xsl)
+ env.Depends(xsl, kw['DOCBOOK_XSL'])
+ result.extend(__fop_builder.__call__(env, t, xsl, **kw))
+
+ return result
+
+def DocbookMan(env, target, source=None, *args, **kw):
+ """
+ A pseudo-Builder, providing a Docbook toolchain for Man page output.
+ """
+ # Init list of targets/sources
+ target, source = __extend_targets_sources(target, source)
+
+ # Init XSL stylesheet
+ __init_xsl_stylesheet(kw, env, '$DOCBOOK_DEFAULT_XSL_MAN', ['manpages','docbook.xsl'])
+
+ # Setup builder
+ __builder = __select_builder(__lxml_builder, __libxml2_builder, __xsltproc_builder)
+
+ # Create targets
+ result = []
+ for t,s in zip(target,source):
+ volnum = "1"
+ outfiles = []
+ srcfile = __ensure_suffix(str(s),'.xml')
+ if os.path.isfile(srcfile):
+ try:
+ import xml.dom.minidom
+
+ dom = xml.dom.minidom.parse(__ensure_suffix(str(s),'.xml'))
+ # Extract volume number, default is 1
+ for node in dom.getElementsByTagName('refmeta'):
+ for vol in node.getElementsByTagName('manvolnum'):
+ volnum = __get_xml_text(vol)
+
+ # Extract output filenames
+ for node in dom.getElementsByTagName('refnamediv'):
+ for ref in node.getElementsByTagName('refname'):
+ outfiles.append(__get_xml_text(ref)+'.'+volnum)
+
+ except:
+ # Use simple regex parsing
+ f = open(__ensure_suffix(str(s),'.xml'), 'r')
+ content = f.read()
+ f.close()
+
+ for m in re_manvolnum.finditer(content):
+ volnum = m.group(1)
+
+ for m in re_refname.finditer(content):
+ outfiles.append(m.group(1)+'.'+volnum)
+
+ if not outfiles:
+ # Use stem of the source file
+ spath = str(s)
+ if not spath.endswith('.xml'):
+ outfiles.append(spath+'.'+volnum)
+ else:
+ stem, ext = os.path.splitext(spath)
+ outfiles.append(stem+'.'+volnum)
+ else:
+ # We have to completely rely on the given target name
+ outfiles.append(t)
+
+ __builder.__call__(env, outfiles[0], s, **kw)
+ env.Depends(outfiles[0], kw['DOCBOOK_XSL'])
+ result.append(outfiles[0])
+ if len(outfiles) > 1:
+ env.Clean(outfiles[0], outfiles[1:])
+
+
+ return result
+
+def DocbookSlidesPdf(env, target, source=None, *args, **kw):
+ """
+ A pseudo-Builder, providing a Docbook toolchain for PDF slides output.
+ """
+ # Init list of targets/sources
+ target, source = __extend_targets_sources(target, source)
+
+ # Init XSL stylesheet
+ __init_xsl_stylesheet(kw, env, '$DOCBOOK_DEFAULT_XSL_SLIDESPDF', ['slides','fo','plain.xsl'])
+
+ # Setup builder
+ __builder = __select_builder(__lxml_builder, __libxml2_builder, __xsltproc_builder)
+
+ # Create targets
+ result = []
+ for t,s in zip(target,source):
+ t, stem = __ensure_suffix_stem(t, '.pdf')
+ xsl = __builder.__call__(env, stem+'.fo', s, **kw)
+ env.Depends(xsl, kw['DOCBOOK_XSL'])
+ result.extend(xsl)
+ result.extend(__fop_builder.__call__(env, t, xsl, **kw))
+
+ return result
+
+def DocbookSlidesHtml(env, target, source=None, *args, **kw):
+ """
+ A pseudo-Builder, providing a Docbook toolchain for HTML slides output.
+ """
+ # Init list of targets/sources
+ if not SCons.Util.is_List(target):
+ target = [target]
+ if not source:
+ source = target
+ target = ['index.html']
+ elif not SCons.Util.is_List(source):
+ source = [source]
+
+ # Init XSL stylesheet
+ __init_xsl_stylesheet(kw, env, '$DOCBOOK_DEFAULT_XSL_SLIDESHTML', ['slides','html','plain.xsl'])
+
+ # Setup builder
+ __builder = __select_builder(__lxml_builder, __libxml2_builder, __xsltproc_builder)
+
+ # Detect base dir
+ base_dir = kw.get('base_dir', '')
+ if base_dir:
+ __create_output_dir(base_dir)
+
+ # Create targets
+ result = []
+ r = __builder.__call__(env, __ensure_suffix(str(target[0]), '.html'), source[0], **kw)
+ env.Depends(r, kw['DOCBOOK_XSL'])
+ result.extend(r)
+ # Add supporting files for cleanup
+ env.Clean(r, [os.path.join(base_dir, 'toc.html')] +
+ glob.glob(os.path.join(base_dir, 'foil*.html')))
+
+ return result
+
+def DocbookXInclude(env, target, source, *args, **kw):
+ """
+ A pseudo-Builder, for resolving XIncludes in a separate processing step.
+ """
+ # Init list of targets/sources
+ target, source = __extend_targets_sources(target, source)
+
+ # Setup builder
+ __builder = __select_builder(__xinclude_lxml_builder,__xinclude_libxml2_builder,__xmllint_builder)
+
+ # Create targets
+ result = []
+ for t,s in zip(target,source):
+ result.extend(__builder.__call__(env, t, s, **kw))
+
+ return result
+
+def DocbookXslt(env, target, source=None, *args, **kw):
+ """
+ A pseudo-Builder, applying a simple XSL transformation to the input file.
+ """
+ # Init list of targets/sources
+ target, source = __extend_targets_sources(target, source)
+
+ # Init XSL stylesheet
+ kw['DOCBOOK_XSL'] = kw.get('xsl', 'transform.xsl')
+
+ # Setup builder
+ __builder = __select_builder(__lxml_builder, __libxml2_builder, __xsltproc_builder)
+
+ # Create targets
+ result = []
+ for t,s in zip(target,source):
+ r = __builder.__call__(env, t, s, **kw)
+ env.Depends(r, kw['DOCBOOK_XSL'])
+ result.extend(r)
+
+ return result
+
+
+def generate(env):
+ """Add Builders and construction variables for docbook to an Environment."""
+
+ env.SetDefault(
+ # Default names for customized XSL stylesheets
+ DOCBOOK_DEFAULT_XSL_EPUB = '',
+ DOCBOOK_DEFAULT_XSL_HTML = '',
+ DOCBOOK_DEFAULT_XSL_HTMLCHUNKED = '',
+ DOCBOOK_DEFAULT_XSL_HTMLHELP = '',
+ DOCBOOK_DEFAULT_XSL_PDF = '',
+ DOCBOOK_DEFAULT_XSL_MAN = '',
+ DOCBOOK_DEFAULT_XSL_SLIDESPDF = '',
+ DOCBOOK_DEFAULT_XSL_SLIDESHTML = '',
+
+ # Paths to the detected executables
+ DOCBOOK_XSLTPROC = '',
+ DOCBOOK_XMLLINT = '',
+ DOCBOOK_FOP = '',
+
+ # Additional flags for the text processors
+ DOCBOOK_XSLTPROCFLAGS = SCons.Util.CLVar(''),
+ DOCBOOK_XMLLINTFLAGS = SCons.Util.CLVar(''),
+ DOCBOOK_FOPFLAGS = SCons.Util.CLVar(''),
+ DOCBOOK_XSLTPROCPARAMS = SCons.Util.CLVar(''),
+
+ # Default command lines for the detected executables
+ DOCBOOK_XSLTPROCCOM = xsltproc_com['xsltproc'],
+ DOCBOOK_XMLLINTCOM = xmllint_com['xmllint'],
+ DOCBOOK_FOPCOM = fop_com['fop'],
+
+ # Screen output for the text processors
+ DOCBOOK_XSLTPROCCOMSTR = None,
+ DOCBOOK_XMLLINTCOMSTR = None,
+ DOCBOOK_FOPCOMSTR = None,
+
+ )
+ _detect(env)
+
+ env.AddMethod(DocbookEpub, "DocbookEpub")
+ env.AddMethod(DocbookHtml, "DocbookHtml")
+ env.AddMethod(DocbookHtmlChunked, "DocbookHtmlChunked")
+ env.AddMethod(DocbookHtmlhelp, "DocbookHtmlhelp")
+ env.AddMethod(DocbookPdf, "DocbookPdf")
+ env.AddMethod(DocbookMan, "DocbookMan")
+ env.AddMethod(DocbookSlidesPdf, "DocbookSlidesPdf")
+ env.AddMethod(DocbookSlidesHtml, "DocbookSlidesHtml")
+ env.AddMethod(DocbookXInclude, "DocbookXInclude")
+ env.AddMethod(DocbookXslt, "DocbookXslt")
+
+
+def exists(env):
+ return 1
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/__init__.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/__init__.xml
new file mode 100644
index 0000000..6559d16
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/__init__.xml
@@ -0,0 +1,608 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+__COPYRIGHT__
+
+This file is processed by the bin/SConsDoc.py module.
+See its __doc__ string for a discussion of the format.
+-->
+
+<!DOCTYPE sconsdoc [
+<!ENTITY % scons SYSTEM '../../../../../doc/scons.mod'>
+%scons;
+<!ENTITY % builders-mod SYSTEM '../../../../../doc/generated/builders.mod'>
+%builders-mod;
+<!ENTITY % functions-mod SYSTEM '../../../../../doc/generated/functions.mod'>
+%functions-mod;
+<!ENTITY % tools-mod SYSTEM '../../../../../doc/generated/tools.mod'>
+%tools-mod;
+<!ENTITY % variables-mod SYSTEM '../../../../../doc/generated/variables.mod'>
+%variables-mod;
+]>
+
+<sconsdoc xmlns="http://www.scons.org/dbxsd/v1.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://www.scons.org/dbxsd/v1.0 http://www.scons.org/dbxsd/v1.0/scons.xsd">
+
+<tool name="docbook">
+<summary>
+<para>This tool tries to make working with Docbook in SCons a little easier.
+It provides several toolchains for creating different output formats,
+like HTML or PDF. Contained in the package is
+a distribution of the Docbook XSL stylesheets as of version 1.76.1.
+As long as you don't specify your own stylesheets for customization,
+these official versions are picked as default...which should reduce
+the inevitable setup hassles for you.
+</para>
+<para>Implicit dependencies to images and XIncludes are detected automatically
+if you meet the HTML requirements. The additional
+stylesheet <filename>utils/xmldepend.xsl</filename> by Paul DuBois is used for this purpose.
+</para>
+<para>Note, that there is no support for XML catalog resolving offered! This tool calls
+the XSLT processors and PDF renderers with the stylesheets you specified, that's it.
+The rest lies in your hands and you still have to know what you're doing when
+resolving names via a catalog.
+</para>
+<para>For activating the tool "docbook", you have to add its name to the Environment constructor,
+like this
+</para>
+<screen>env = Environment(tools=['docbook'])
+</screen>
+<para>On its startup, the Docbook tool tries to find a required <literal>xsltproc</literal> processor, and
+a PDF renderer, e.g. <literal>fop</literal>. So make sure that these are added to your system's environment
+<literal>PATH</literal> and can be called directly, without specifying their full path.
+</para>
+<para>For the most basic processing of Docbook to HTML, you need to have installed
+</para>
+<itemizedlist><listitem><para>the Python <literal>lxml</literal> binding to <literal>libxml2</literal>, or
+</para>
+</listitem>
+<listitem><para>the direct Python bindings for <literal>libxml2/libxslt</literal>, or
+</para>
+</listitem>
+<listitem><para>a standalone XSLT processor, currently detected are <literal>xsltproc</literal>, <literal>saxon</literal>, <literal>saxon-xslt</literal>
+and <literal>xalan</literal>.
+</para>
+</listitem>
+</itemizedlist>
+<para>Rendering to PDF requires you to have one of the applications
+<literal>fop</literal> or <literal>xep</literal> installed.
+</para>
+
+<para>Creating a HTML or PDF document is very simple and straightforward. Say
+</para>
+<screen>env = Environment(tools=['docbook'])
+env.DocbookHtml('manual.html', 'manual.xml')
+env.DocbookPdf('manual.pdf', 'manual.xml')
+</screen>
+<para>to get both outputs from your XML source <filename>manual.xml</filename>. As a shortcut, you can
+give the stem of the filenames alone, like this:
+</para>
+<screen>env = Environment(tools=['docbook'])
+env.DocbookHtml('manual')
+env.DocbookPdf('manual')
+</screen>
+<para>and get the same result. Target and source lists are also supported:
+</para>
+<screen>env = Environment(tools=['docbook'])
+env.DocbookHtml(['manual.html','reference.html'], ['manual.xml','reference.xml'])
+</screen>
+<para>or even
+</para>
+<screen>env = Environment(tools=['docbook'])
+env.DocbookHtml(['manual','reference'])
+</screen>
+<important><para>Whenever you leave out the list of sources, you may not specify a file extension! The
+Tool uses the given names as file stems, and adds the suffixes for target and source files
+accordingly.
+</para>
+</important>
+<para>The rules given above are valid for the Builders &b-link-DocbookHtml;,
+&b-link-DocbookPdf;, &b-link-DocbookEpub;, &b-link-DocbookSlidesPdf; and &b-link-DocbookXInclude;. For the
+&b-link-DocbookMan; transformation you
+can specify a target name, but the actual output names are automatically
+set from the <literal>refname</literal> entries in your XML source.
+</para>
+
+<para>The Builders &b-link-DocbookHtmlChunked;, &b-link-DocbookHtmlhelp; and
+&b-link-DocbookSlidesHtml; are special, in that:
+</para>
+<orderedlist><listitem><para>they create a large set of files, where the exact names and their number depend
+on the content of the source file, and
+</para>
+</listitem>
+<listitem><para>the main target is always named <filename>index.html</filename>, i.e. the output name for the
+XSL transformation is not picked up by the stylesheets.
+</para>
+</listitem>
+</orderedlist>
+<para>As a result, there is simply no use in specifying a target HTML name.
+So the basic syntax for these builders is always:
+</para>
+<screen>env = Environment(tools=['docbook'])
+env.DocbookHtmlhelp('manual')
+</screen>
+
+<para>If you want to use a specific XSL file, you can set the
+additional <literal>xsl</literal> parameter to your
+Builder call as follows:
+</para>
+<screen>env.DocbookHtml('other.html', 'manual.xml', xsl='html.xsl')
+</screen>
+<para>Since this may get tedious if you always use the same local naming for your customized XSL files,
+e.g. <filename>html.xsl</filename> for HTML and <filename>pdf.xsl</filename> for PDF output, a set of
+variables for setting the default XSL name is provided. These are:
+</para>
+<screen>DOCBOOK_DEFAULT_XSL_HTML
+DOCBOOK_DEFAULT_XSL_HTMLCHUNKED
+DOCBOOK_DEFAULT_XSL_HTMLHELP
+DOCBOOK_DEFAULT_XSL_PDF
+DOCBOOK_DEFAULT_XSL_EPUB
+DOCBOOK_DEFAULT_XSL_MAN
+DOCBOOK_DEFAULT_XSL_SLIDESPDF
+DOCBOOK_DEFAULT_XSL_SLIDESHTML
+</screen>
+<para>and you can set them when constructing your environment:
+</para>
+<screen>env = Environment(tools=['docbook'],
+ DOCBOOK_DEFAULT_XSL_HTML='html.xsl',
+ DOCBOOK_DEFAULT_XSL_PDF='pdf.xsl')
+env.DocbookHtml('manual') # now uses html.xsl
+</screen>
+</summary>
+<sets>
+<item>DOCBOOK_DEFAULT_XSL_HTML</item>
+<item>DOCBOOK_DEFAULT_XSL_HTMLCHUNKED</item>
+<item>DOCBOOK_DEFAULT_XSL_HTMLHELP</item>
+<item>DOCBOOK_DEFAULT_XSL_PDF</item>
+<item>DOCBOOK_DEFAULT_XSL_EPUB</item>
+<item>DOCBOOK_DEFAULT_XSL_MAN</item>
+<item>DOCBOOK_DEFAULT_XSL_SLIDESPDF</item>
+<item>DOCBOOK_DEFAULT_XSL_SLIDESHTML</item>
+<item>DOCBOOK_XSLTPROC</item>
+<item>DOCBOOK_XMLLINT</item>
+<item>DOCBOOK_FOP</item>
+<item>DOCBOOK_XSLTPROCFLAGS</item>
+<item>DOCBOOK_XMLLINTFLAGS</item>
+<item>DOCBOOK_FOPFLAGS</item>
+<item>DOCBOOK_XSLTPROCPARAMS</item>
+<item>DOCBOOK_XSLTPROCCOM</item>
+<item>DOCBOOK_XMLLINTCOM</item>
+<item>DOCBOOK_FOPCOM</item>
+</sets>
+<uses>
+<item>DOCBOOK_XSLTPROCCOMSTR</item>
+<item>DOCBOOK_XMLLINTCOMSTR</item>
+<item>DOCBOOK_FOPCOMSTR</item>
+</uses>
+</tool>
+
+
+<cvar name="DOCBOOK_DEFAULT_XSL_HTML">
+<summary>
+<para>
+The default XSLT file for the &b-link-DocbookHtml; builder within the
+current environment, if no other XSLT gets specified via keyword.
+</para>
+</summary>
+</cvar>
+
+
+<cvar name="DOCBOOK_DEFAULT_XSL_HTMLCHUNKED">
+<summary>
+<para>
+The default XSLT file for the &b-link-DocbookHtmlChunked; builder within the
+current environment, if no other XSLT gets specified via keyword.
+</para>
+</summary>
+</cvar>
+
+<cvar name="DOCBOOK_DEFAULT_XSL_HTMLHELP">
+<summary>
+<para>
+The default XSLT file for the &b-link-DocbookHtmlhelp; builder within the
+current environment, if no other XSLT gets specified via keyword.
+</para>
+</summary>
+</cvar>
+
+<cvar name="DOCBOOK_DEFAULT_XSL_PDF">
+<summary>
+<para>
+The default XSLT file for the &b-link-DocbookPdf; builder within the
+current environment, if no other XSLT gets specified via keyword.
+</para>
+</summary>
+</cvar>
+
+<cvar name="DOCBOOK_DEFAULT_XSL_EPUB">
+<summary>
+<para>
+The default XSLT file for the &b-link-DocbookEpub; builder within the
+current environment, if no other XSLT gets specified via keyword.
+</para>
+</summary>
+</cvar>
+
+<cvar name="DOCBOOK_DEFAULT_XSL_MAN">
+<summary>
+<para>
+The default XSLT file for the &b-link-DocbookMan; builder within the
+current environment, if no other XSLT gets specified via keyword.
+</para>
+</summary>
+</cvar>
+
+<cvar name="DOCBOOK_DEFAULT_XSL_SLIDESPDF">
+<summary>
+<para>
+The default XSLT file for the &b-link-DocbookSlidesPdf; builder within the
+current environment, if no other XSLT gets specified via keyword.
+</para>
+</summary>
+</cvar>
+
+<cvar name="DOCBOOK_DEFAULT_XSL_SLIDESHTML">
+<summary>
+<para>
+The default XSLT file for the &b-link-DocbookSlidesHtml; builder within the
+current environment, if no other XSLT gets specified via keyword.
+</para>
+</summary>
+</cvar>
+
+<cvar name="DOCBOOK_XSLTPROC">
+<summary>
+<para>
+The path to the external executable <literal>xsltproc</literal>
+(or <literal>saxon</literal>, <literal>xalan</literal>), if one of them
+is installed.
+Note, that this is only used as last fallback for XSL transformations, if
+no libxml2 or lxml Python binding can be imported in the current system.
+</para>
+</summary>
+</cvar>
+
+<cvar name="DOCBOOK_XMLLINT">
+<summary>
+<para>
+The path to the external executable <literal>xmllint</literal>, if it's installed.
+Note, that this is only used as last fallback for resolving
+XIncludes, if no libxml2 or lxml Python binding can be imported
+in the current system.
+</para>
+</summary>
+</cvar>
+
+<cvar name="DOCBOOK_FOP">
+<summary>
+<para>
+The path to the PDF renderer <literal>fop</literal> or <literal>xep</literal>,
+if one of them is installed (<literal>fop</literal> gets checked first).
+</para>
+</summary>
+</cvar>
+
+<cvar name="DOCBOOK_XSLTPROCFLAGS">
+<summary>
+<para>
+Additonal command-line flags for the external executable
+<literal>xsltproc</literal> (or <literal>saxon</literal>,
+<literal>xalan</literal>).
+</para>
+</summary>
+</cvar>
+
+<cvar name="DOCBOOK_XMLLINTFLAGS">
+<summary>
+<para>
+Additonal command-line flags for the external executable
+<literal>xmllint</literal>.
+</para>
+</summary>
+</cvar>
+
+<cvar name="DOCBOOK_FOPFLAGS">
+<summary>
+<para>
+Additonal command-line flags for the
+PDF renderer <literal>fop</literal> or <literal>xep</literal>.
+</para>
+</summary>
+</cvar>
+
+<cvar name="DOCBOOK_XSLTPROCPARAMS">
+<summary>
+<para>
+Additonal parameters that are not intended for the XSLT processor executable, but
+the XSL processing itself. By default, they get appended at the end of the command line
+for <literal>saxon</literal> and <literal>saxon-xslt</literal>, respectively.
+</para>
+</summary>
+</cvar>
+
+<cvar name="DOCBOOK_XSLTPROCCOM">
+<summary>
+<para>
+The full command-line for the external executable
+<literal>xsltproc</literal> (or <literal>saxon</literal>,
+<literal>xalan</literal>).
+</para>
+</summary>
+</cvar>
+
+<cvar name="DOCBOOK_XMLLINTCOM">
+<summary>
+<para>
+The full command-line for the external executable
+<literal>xmllint</literal>.
+</para>
+</summary>
+</cvar>
+
+<cvar name="DOCBOOK_FOPCOM">
+<summary>
+<para>
+The full command-line for the
+PDF renderer <literal>fop</literal> or <literal>xep</literal>.
+</para>
+</summary>
+</cvar>
+
+<cvar name="DOCBOOK_XSLTPROCCOMSTR">
+<summary>
+<para>
+The string displayed when <literal>xsltproc</literal> is used to transform
+an XML file via a given XSLT stylesheet.
+</para>
+</summary>
+</cvar>
+
+<cvar name="DOCBOOK_XMLLINTCOMSTR">
+<summary>
+<para>
+The string displayed when <literal>xmllint</literal> is used to resolve
+XIncludes for a given XML file.
+</para>
+</summary>
+</cvar>
+
+<cvar name="DOCBOOK_FOPCOMSTR">
+<summary>
+<para>
+The string displayed when a renderer like <literal>fop</literal> or
+<literal>xep</literal> is used to create PDF output from an XML file.
+</para>
+</summary>
+</cvar>
+
+<builder name="DocbookHtml">
+<summary>
+<para>
+A pseudo-Builder, providing a Docbook toolchain for HTML output.
+</para>
+<example_commands>env = Environment(tools=['docbook'])
+env.DocbookHtml('manual.html', 'manual.xml')
+</example_commands>
+<para>
+or simply
+</para>
+<example_commands>env = Environment(tools=['docbook'])
+env.DocbookHtml('manual')
+</example_commands>
+</summary>
+</builder>
+
+<builder name="DocbookHtmlChunked">
+<summary>
+<para>
+A pseudo-Builder, providing a Docbook toolchain for chunked HTML output.
+It supports the <literal>base.dir</literal> parameter. The
+<filename>chunkfast.xsl</filename> file (requires &quot;EXSLT&quot;) is used as the
+default stylesheet. Basic syntax:
+</para>
+
+<example_commands>env = Environment(tools=['docbook'])
+env.DocbookHtmlChunked('manual')
+</example_commands>
+<para>
+where <filename>manual.xml</filename> is the input file.
+</para>
+<para>If you use the <literal>root.filename</literal>
+parameter in your own stylesheets you have to specify the new target name.
+This ensures that the dependencies get correct, especially for the cleanup via <quote><literal>scons -c</literal></quote>:
+</para>
+<screen>env = Environment(tools=['docbook'])
+env.DocbookHtmlChunked('mymanual.html', 'manual', xsl='htmlchunk.xsl')
+</screen>
+<para>Some basic support for the <literal>base.dir</literal> is provided. You
+can add the <literal>base_dir</literal> keyword to your Builder
+call, and the given prefix gets prepended to all the created filenames:
+</para>
+<screen>env = Environment(tools=['docbook'])
+env.DocbookHtmlChunked('manual', xsl='htmlchunk.xsl', base_dir='output/')
+</screen>
+<para>Make sure that you don't forget the trailing slash for the base folder, else
+your files get renamed only!
+</para>
+</summary>
+</builder>
+
+<builder name="DocbookHtmlhelp">
+<summary>
+<para>
+A pseudo-Builder, providing a Docbook toolchain for HTMLHELP output.
+Its basic syntax is:
+</para>
+
+<example_commands>env = Environment(tools=['docbook'])
+env.DocbookHtmlhelp('manual')
+</example_commands>
+<para>
+where <filename>manual.xml</filename> is the input file.
+</para>
+
+<para>If you use the <literal>root.filename</literal>
+parameter in your own stylesheets you have to specify the new target name.
+This ensures that the dependencies get correct, especially for the cleanup via <quote><literal>scons -c</literal></quote>:
+</para>
+<screen>env = Environment(tools=['docbook'])
+env.DocbookHtmlhelp('mymanual.html', 'manual', xsl='htmlhelp.xsl')
+</screen>
+<para>Some basic support for the <literal>base.dir</literal> parameter
+is provided. You can add the <literal>base_dir</literal> keyword to
+your Builder call, and the given prefix gets prepended to all the
+created filenames:
+</para>
+<screen>env = Environment(tools=['docbook'])
+env.DocbookHtmlhelp('manual', xsl='htmlhelp.xsl', base_dir='output/')
+</screen>
+<para>Make sure that you don't forget the trailing slash for the base folder, else
+your files get renamed only!
+</para>
+
+</summary>
+</builder>
+
+<builder name="DocbookPdf">
+<summary>
+<para>
+A pseudo-Builder, providing a Docbook toolchain for PDF output.
+</para>
+
+<example_commands>env = Environment(tools=['docbook'])
+env.DocbookPdf('manual.pdf', 'manual.xml')
+</example_commands>
+
+<para>
+or simply
+</para>
+
+<example_commands>env = Environment(tools=['docbook'])
+env.DocbookPdf('manual')
+</example_commands>
+
+</summary>
+</builder>
+
+<builder name="DocbookEpub">
+<summary>
+<para>
+A pseudo-Builder, providing a Docbook toolchain for EPUB output.
+</para>
+
+<example_commands>env = Environment(tools=['docbook'])
+env.DocbookEpub('manual.epub', 'manual.xml')
+</example_commands>
+
+<para>
+or simply
+</para>
+
+<example_commands>env = Environment(tools=['docbook'])
+env.DocbookEpub('manual')
+</example_commands>
+
+</summary>
+</builder>
+
+<builder name="DocbookMan">
+<summary>
+<para>
+A pseudo-Builder, providing a Docbook toolchain for Man page output.
+Its basic syntax is:
+</para>
+
+<example_commands>env = Environment(tools=['docbook'])
+env.DocbookMan('manual')
+</example_commands>
+<para>
+where <filename>manual.xml</filename> is the input file. Note, that
+you can specify a target name, but the actual output names are automatically
+set from the <literal>refname</literal> entries in your XML source.
+</para>
+</summary>
+</builder>
+
+<builder name="DocbookSlidesPdf">
+<summary>
+<para>
+A pseudo-Builder, providing a Docbook toolchain for PDF slides output.
+</para>
+
+<example_commands>env = Environment(tools=['docbook'])
+env.DocbookSlidesPdf('manual.pdf', 'manual.xml')
+</example_commands>
+
+<para>
+or simply
+</para>
+
+<example_commands>env = Environment(tools=['docbook'])
+env.DocbookSlidesPdf('manual')
+</example_commands>
+</summary>
+</builder>
+
+<builder name="DocbookSlidesHtml">
+<summary>
+<para>
+A pseudo-Builder, providing a Docbook toolchain for HTML slides output.
+</para>
+
+<example_commands>env = Environment(tools=['docbook'])
+env.DocbookSlidesHtml('manual')
+</example_commands>
+
+<para>If you use the <literal>titlefoil.html</literal> parameter in
+your own stylesheets you have to give the new target name. This ensures
+that the dependencies get correct, especially for the cleanup via
+<quote><literal>scons -c</literal></quote>:
+</para>
+<screen>env = Environment(tools=['docbook'])
+env.DocbookSlidesHtml('mymanual.html','manual', xsl='slideshtml.xsl')
+</screen>
+
+<para>Some basic support for the <literal>base.dir</literal> parameter
+is provided. You
+can add the <literal>base_dir</literal> keyword to your Builder
+call, and the given prefix gets prepended to all the created filenames:
+</para>
+<screen>env = Environment(tools=['docbook'])
+env.DocbookSlidesHtml('manual', xsl='slideshtml.xsl', base_dir='output/')
+</screen>
+<para>Make sure that you don't forget the trailing slash for the base folder, else
+your files get renamed only!
+</para>
+
+</summary>
+</builder>
+
+<builder name="DocbookXInclude">
+<summary>
+<para>
+A pseudo-Builder, for resolving XIncludes in a separate processing step.
+</para>
+
+<example_commands>env = Environment(tools=['docbook'])
+env.DocbookXInclude('manual_xincluded.xml', 'manual.xml')
+</example_commands>
+</summary>
+</builder>
+
+<builder name="DocbookXslt">
+<summary>
+<para>
+A pseudo-Builder, applying a given XSL transformation to the input file.
+</para>
+
+<example_commands>env = Environment(tools=['docbook'])
+env.DocbookXslt('manual_transformed.xml', 'manual.xml', xsl='transform.xslt')
+</example_commands>
+
+<para>Note, that this builder requires the <literal>xsl</literal> parameter
+to be set.
+</para>
+</summary>
+</builder>
+
+</sconsdoc>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/.CatalogManager.properties.example b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/.CatalogManager.properties.example
new file mode 100644
index 0000000..23434e1
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/.CatalogManager.properties.example
@@ -0,0 +1,61 @@
+########################################################################
+# CatalogManager provides an interface to the catalog properties.
+# Properties can come from two places: from system properties or
+# from a CatalogManager.properties file. This class provides a
+# transparent interface to both, with system properties preferred
+# over property file values.
+
+#######################################################################
+# Catalog Files:
+# The semicolon-delimited list of catalog files.
+# Example: catalogs=/etc/xml/catalog;~/catalog.xml
+
+catalogs=
+
+#######################################################################
+# Relative Catalogs:
+# If false, relative catalog URIs are made absolute with respect to the
+# base URI of the CatalogManager.properties file. This setting only
+# applies to catalog URIs obtained from the catalogs property in the
+# CatalogManager.properties file
+# Example: relative-catalogs = [yes|no]
+
+relative-catalogs=yes
+
+#######################################################################
+# Verbosity:
+# If non-zero, the Catalog classes will print informative and debugging
+# messages. The higher the number, the more messages.
+# Example: verbosity = [0..99]
+
+verbosity=0
+
+#######################################################################
+# Prefer:
+# Which identifier is preferred, "public" or "system"?
+# Example: xml.catalog.prefer = [public|system]
+
+prefer=system
+
+#######################################################################
+# Static-catalog:
+# Should a single catalog be constructed for all parsing, or should a
+# different catalog be created for each parser?
+# Example: static-catalog = [yes|no]
+
+static-catalog=yes
+
+#######################################################################
+# Allow-oasis-xml-catalog-pi
+# If the source document contains "oasis-xml-catalog" processing
+# instructions, should they be used?
+# Example: allow-oasis-xml-catalog-pi = [yes|no]
+
+allow-oasis-xml-catalog-pi=yes
+
+#######################################################################
+# catalog-class-name
+# If you're using the convenience classes
+# org.apache.xml.resolver.tools.*, this setting allows you to specify
+# an alternate class name to use for the underlying catalog.
+# Example: catalog-class-name=org.apache.xml.resolver.Resolver
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/.urilist b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/.urilist
new file mode 100644
index 0000000..2751d8d
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/.urilist
@@ -0,0 +1 @@
+. http://docbook.sourceforge.net/release/xsl/current/
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/AUTHORS b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/AUTHORS
new file mode 100644
index 0000000..9c3dcdc
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/AUTHORS
@@ -0,0 +1,4 @@
+The DocBook XSL stylesheets are maintained by Norman Walsh,
+<ndw@nwalsh.com>, and members of the DocBook Project,
+<docbook-developers@sf.net>
+
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/BUGS b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/BUGS
new file mode 100644
index 0000000..b3c7867
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/BUGS
@@ -0,0 +1,21 @@
+To view a list of all open DocBook Project XSL stylesheet bugs:
+
+ http://docbook.sf.net/tracker/xsl/bugs
+
+To submit a bug report against the stylesheets:
+
+ http://docbook.sf.net/tracker/submit/bug
+
+To do a full-text search of all DocBook Project issues:
+
+ http://docbook.sf.net/tracker/search
+
+Discussion about the DocBook Project XSL stylesheets takes place
+on the docbook-apps mailing list:
+
+ http://wiki.docbook.org/topic/DocBookAppsMailingList
+
+Real-time discussion takes place on IRC:
+
+ http://wiki.docbook.org/topic/DocBookIrcChannel
+ irc://irc.freenode.net/docbook
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/COPYING b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/COPYING
new file mode 100644
index 0000000..46bc120
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/COPYING
@@ -0,0 +1,47 @@
+Copyright
+---------
+Copyright (C) 1999-2007 Norman Walsh
+Copyright (C) 2003 Jiří Kosek
+Copyright (C) 2004-2007 Steve Ball
+Copyright (C) 2005-2008 The DocBook Project
+
+Permission is hereby granted, free of charge, to any person
+obtaining a copy of this software and associated documentation
+files (the ``Software''), to deal in the Software without
+restriction, including without limitation the rights to use,
+copy, modify, merge, publish, distribute, sublicense, and/or
+sell copies of the Software, and to permit persons to whom the
+Software is furnished to do so, subject to the following
+conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+Except as contained in this notice, the names of individuals
+credited with contribution to this software shall not be used in
+advertising or otherwise to promote the sale, use or other
+dealings in this Software without prior written authorization
+from the individuals in question.
+
+Any stylesheet derived from this Software that is publically
+distributed will be identified with a different name and the
+version strings in any derived Software will be changed so that
+no possibility of confusion between the derived package and this
+Software will exist.
+
+Warranty
+--------
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL NORMAN WALSH OR ANY OTHER
+CONTRIBUTOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+
+Contacting the Author
+---------------------
+The DocBook XSL stylesheets are maintained by Norman Walsh,
+<ndw@nwalsh.com>, and members of the DocBook Project,
+<docbook-developers@sf.net>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/INSTALL b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/INSTALL
new file mode 100644
index 0000000..72cb82b
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/INSTALL
@@ -0,0 +1,88 @@
+$Id: INSTALL 6145 2006-08-06 13:13:03Z xmldoc $
+
+INSTALL file for the DocBook XSL stylesheets distribution
+
+----------------------------------------------------------------------
+Case #1: Installation using a package management system
+----------------------------------------------------------------------
+If you have installed the DocBook XSL distribution using "apt-get",
+"yum", "urpmi", or some similar package-management front-end,
+then, as part of the package installation, the stylesheets have
+already been automatically installed in the appropriate location
+for your system, and your XML catalog environment has probably
+been updated to use that location.
+
+----------------------------------------------------------------------
+Case #2: Installing manually
+----------------------------------------------------------------------
+If you have downloaded a docbook-xsl zip, tar.gz, or tar.bz2
+file, use the following steps to install it.
+
+ 1. Move the zip, tar.gz, or tar.bz2 file to the directory where
+ you'd like to install it (not to a temporary directory).
+
+ 2. unzip or untar/uncompress the file
+
+ That will create a docbook-xsl-$VERSION directory (where
+ $VERSION is the version number for the release).
+
+The remaining steps are all OPTIONAL. They are intended to
+automatically update your user environment with XML Catalog
+information about the DocBook XSL distribution. You are NOT
+REQUIRED to complete these remaining steps. However, if you do
+not, and you want to use XML catalogs with the DocBook XSL
+stylesheets, you will need to manually update your XML catalog
+environment
+
+ 3. Change to the docbook-xsl-$VERSION directory and execute the
+ install.sh script:
+
+ ./install.sh
+
+ That will launch an interactive installer, which will emit a
+ series of prompts for you to respond to.
+
+ To instead run it non-interactively without being prompted
+ for confirmation of the changes it makes, invoke it with the
+ "--batch" switch, like this:
+
+ ./install.sh --batch
+
+ After the process is complete, the installer will emit a
+ message with a command you need to run in order to source
+ your environment for use with the stylesheets.
+
+ 4. To test that he installation has updated your environment
+ correctly, execute the test.sh script:
+
+ ./test.sh
+
+ That will test your XML catalog environment, using both the
+ xmlcatalog application and the Apache XML Commons Resolver.
+
+ NOTE: The test.sh file is not created until the install.sh
+ file is run for the first time.
+
+ 5. (UNINSTALLING) If/when you want to uninstall the release,
+ execute the uninstall.sh script.
+
+ ./uninstall.sh
+
+ To instead run it non-interactively without being prompted
+ for confirmation of the changes it makes, invoke it with the
+ "--batch" switch, like this:
+
+ ./uninstall.sh --batch
+
+ NOTE: The uninstall.sh file is not created until the install.sh
+ file is run for the first time.
+
+
+----------------------------------------------------------------------
+Note to packagers
+----------------------------------------------------------------------
+The install.sh, .CatalogManager.properties.example, and .urilist
+files should not be packaged. They are useful only to users who
+are installing the stylesheets manually.
+
+The catalog.xml file should be packaged.
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/Makefile b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/Makefile
new file mode 100644
index 0000000..a87d60b
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/Makefile
@@ -0,0 +1,89 @@
+# $Id: Makefile.tests 8481 2009-07-13 20:18:41Z abdelazer $
+#
+# This makefile does a "smoketest" of stylesheets for various
+# output formats in the DocBook XSL Stylesheets release package.
+# It doesn't actually check the output -- it's just useful for
+# confirming whether each XSLT transformation actually executes
+# successfully without any errors.
+#
+# To use it, run "make check" or just "make"
+
+XSLTPROC=xsltproc
+XSLTPROC_FLAGS=
+
+TESTFILE=tests/refentry.007.xml
+TESTFILE_NS=tests/refentry.007.ns.xml
+
+NORMAL_STYLES=fo/docbook.xsl html/docbook.xsl xhtml/docbook.xsl
+NORMAL_PROFILE_STYLES=fo/profile-docbook.xsl html/profile-docbook.xsl xhtml/profile-docbook.xsl
+CHUNK_STYLES=html/chunk.xsl html/onechunk.xsl xhtml/chunk.xsl xhtml/onechunk.xsl
+HELP_STYLES=htmlhelp/htmlhelp.xsl javahelp/javahelp.xsl eclipse/eclipse.xsl
+MULTIFILE_STYLES=$(CHUNK_STYLES) $(HELP_STYLES)
+CHUNK_PROFILE_STYLES=html/profile-chunk.xsl html/profile-onechunk.xsl xhtml/profile-chunk.xsl xhtml/profile-onechunk.xsl
+HELP_PROFILE_STYLES=htmlhelp/profile-htmlhelp.xsl eclipse/profile-eclipse.xsl javahelp/profile-javahelp.xsl
+MULTIFILE_PROFILE_STYLES=$(CHUNK_PROFILE_STYLES) $(HELP_PROFILE_STYLES)
+
+MAN_STYLE=manpages/docbook.xsl
+MAN_PROFILE_STYLE=manpages/profile-docbook.xsl
+
+TWO_PROFILE_STYLE=profiling/profile.xsl
+
+ROUNDTRIP_STYLES=roundtrip/dbk2ooo.xsl roundtrip/dbk2pages.xsl roundtrip/dbk2wordml.xsl
+SLIDES_STYLES=slides/html/default.xsl slides/xhtml/default.xsl slides/fo/plain.xsl
+WEBSITE_STYLES=website/website.xsl
+WEBSITE_CHUNK_STYLES=website/chunk-website.xsl
+
+# chunked output gets written to TMP_OUTPUT_DIR
+TMP_OUTPUT_DIR=/tmp/smoketest-output/
+# if you don't want TMP_OUTPUT_DIR and its contents deleted, unset
+# SMOKETEST_CLEAN_TARGET; e.g. "make check SMOKETEST_CLEAN_TARGET=''"
+SMOKETEST_CLEAN_TARGET=smoketest-clean
+
+check: smoketest-make-tmp-dir smoketest-normal smoketest-normal-profile smoketest-chunk smoketest-chunk-profile smoketest-man smoketest-man-profile smoketest-two-profile $(SMOKETEST_CLEAN_TARGET)
+
+smoketest-make-tmp-dir:
+ $(RM) -r $(TMP_OUTPUT_DIR)
+ mkdir '$(TMP_OUTPUT_DIR)'
+
+smoketest-normal:
+ for stylesheet in $(NORMAL_STYLES); do \
+ echo "$(XSLT) $(TESTFILE) $$stylesheet > /dev/null"; \
+ $(XSLT) $(TESTFILE) $$stylesheet > /dev/null; \
+ echo "$(XSLT) $(TESTFILE_NS) $$stylesheet > /dev/null"; \
+ $(XSLT) $(TESTFILE_NS) $$stylesheet > /dev/null; \
+ done
+
+smoketest-normal-profile:
+ for stylesheet in $(NORMAL_PROFILE_STYLES); do \
+ echo "$(XSLT) $(TESTFILE) $$stylesheet > /dev/null"; \
+ $(XSLT) $(TESTFILE) $$stylesheet > /dev/null; \
+ echo "$(XSLT) $(TESTFILE_NS) $$stylesheet > /dev/null"; \
+ $(XSLT) $(TESTFILE_NS) $$stylesheet > /dev/null; \
+ done
+
+smoketest-chunk:
+ for stylesheet in $(MULTIFILE_STYLES) ; do \
+ $(XSLT) $(TESTFILE) $$stylesheet manifest.in.base.dir=1 base.dir=$(TMP_OUTPUT_DIR) ; \
+ $(XSLT) $(TESTFILE_NS) $$stylesheet manifest.in.base.dir=1 base.dir=$(TMP_OUTPUT_DIR) ; \
+ done;
+
+smoketest-chunk-profile:
+ for stylesheet in $(MULTIFILE_PROFILE_STYLES) ; do \
+ $(XSLT) $(TESTFILE) $$stylesheet manifest.in.base.dir=1 base.dir=$(TMP_OUTPUT_DIR) ; \
+ $(XSLT) $(TESTFILE_NS) $$stylesheet manifest.in.base.dir=1 base.dir=$(TMP_OUTPUT_DIR) ; \
+ done;
+
+smoketest-man:
+ $(XSLT) $(TESTFILE) $(MAN_STYLE) man.output.in.separate.dir=1 man.output.base.dir=$(TMP_OUTPUT_DIR) ; \
+ $(XSLT) $(TESTFILE_NS) $(MAN_STYLE) man.output.in.separate.dir=1 man.output.base.dir=$(TMP_OUTPUT_DIR) ;
+
+smoketest-man-profile:
+ $(XSLT) $(TESTFILE) $(MAN_PROFILE_STYLE) man.output.in.separate.dir=1 man.output.base.dir=$(TMP_OUTPUT_DIR) ; \
+ $(XSLT) $(TESTFILE_NS) $(MAN_PROFILE_STYLE) man.output.in.separate.dir=1 man.output.base.dir=$(TMP_OUTPUT_DIR) ;
+
+smoketest-two-profile:
+ $(XSLT) $(TESTFILE_NS) $(TWO_PROFILE_STYLE) > /dev/null ;
+
+smoketest-clean:
+ $(RM) -r $(TMP_OUTPUT_DIR)
+
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/NEWS b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/NEWS
new file mode 100644
index 0000000..ed3dc54
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/NEWS
@@ -0,0 +1,139 @@
+Changes since the 1.76.0 release
+
+Note: This document lists changes only since the 1.76.0 release. If you instead
+want a record of the complete list of changes for the codebase over its entire
+history, you can obtain one by running the following commands:
+
+ svn checkout https://docbook.svn.sourceforge.net/svnroot/docbook/trunk/xsl
+ svn log --xml --verbose xsl > ChangeHistory.xml
+
+â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”
+
+Table of Contents
+
+Release Notes: 1.76.1
+
+ Common
+ FO
+ HTML
+ Epub
+ Webhelp
+ Params
+ Extensions
+
+Release Notes: 1.76.1
+
+The following is a list of changes that have been made since the 1.76.0
+release.
+
+Common
+
+The following changes have been made to the common code since the 1.76.0
+release.
+
+ â— Mauritz Jeanson: Makefile
+
+ Added eu.xml and gl.xml to SOURCES.
+
+ â— Jirka Kosek: l10n.xsl
+
+ Fixed bug when context was lost due to usage of xsl:key
+
+FO
+
+The following changes have been made to the fo code since the 1.76.0 release.
+
+ â— Robert Stayton: docbook.xsl; xref.xsl; fop1.xsl
+
+ Apply patch to support named destination in fop1.xsl, per Sourceforge
+ bug report #3029845.
+
+ â— dleidert: pagesetup.xsl
+
+ Remove the namespace mistakingly added with the last upload.
+
+HTML
+
+The following changes have been made to the html code since the 1.76.0 release.
+
+ â— Keith Fahlgren: highlight.xsl
+
+ Implementing handling for <b> and <i>: transform to <strong> and <em> for XHTML outputs and do not use in the highliting output (per Mauritz Jeanson)
+
+Epub
+
+The following changes have been made to the epub code since the 1.76.0 release.
+
+ â— Keith Fahlgren: docbook.xsl
+
+ Bugfix for [#3071521] to ensure that NCX navPoints are generated for d:book root nodes with the -NS version of the stylesheets
+
+ â— Keith Fahlgren: docbook.xsl
+
+ Remove unused NCX metadata elements
+
+ â— Keith Fahlgren: bin/spec/epub_regressions_spec.rb; docbook.xsl; bin/spec/
+ files/test_cust.x⋯
+
+ Normalizing identifier lookup between NCX and OPF
+
+ â— Keith Fahlgren: bin/dbtoepub
+
+ Reduce logging verbosity
+
+ â— Keith Fahlgren: bin/dbtoepub; bin/lib/docbook.rb
+
+ Only copy images once for the DocBook to EPUB tool to correct Windows bug reported in [#3065489]
+
+Webhelp
+
+The following changes have been made to the webhelp code since the 1.76.0
+release.
+
+ â— David Cramer: indexer
+
+ More webhelp indexer refactoring
+
+ â— David Cramer: build.xml
+
+ Removed cruft from before webhelp indexer refactoring
+
+ â— David Cramer: indexer/src
+
+ Refactoring webhelp to separate more cleanly the xsl and java code.
+
+ â— David Cramer: indexer/lib
+
+ Refactoring webhelp to separate more cleanly the xsl and java code.
+
+ â— David Cramer: Makefile; build.xml
+
+ Refactoring webhelp to separate more cleanly the xsl and java code.
+
+ â— David Cramer: indexer/src/com/nexwave/nquindexer/IndexerTask.java;
+ build.xml; indexer/src/⋯
+
+ Merged in changes from webhelp branch to address issue #3058244 regarding the xx.html temp file that was being created
+
+Params
+
+The following changes have been made to the params code since the 1.76.0
+release.
+
+ â— Robert Stayton: draft.mode.xml
+
+ Change default for draft.mode to 'no'.
+
+Extensions
+
+The following changes have been made to the extensions code since the 1.76.0
+release.
+
+ â— David Cramer: Makefile
+
+ More webhelp refactoring
+
+ â— David Cramer: Makefile
+
+ Refactoring webhelp to separate more cleanly the xsl and java code.
+
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/NEWS.html b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/NEWS.html
new file mode 100644
index 0000000..979e2a2
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/NEWS.html
@@ -0,0 +1,25 @@
+<html><head><meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"><title>Changes since the 1.76.0 release</title><meta name="generator" content="DocBook XSL Stylesheets V1.76.1"><meta name="description" content="Note: This document lists changes only since the 1.76.0 release. If you instead want a record of the complete list of changes for the codebase over its entire history, you can obtain one by running the following commands: svn checkout https://docbook.svn.sourceforge.net/svnroot/docbook/trunk/xsl svn log --xml --verbose xsl &gt; ChangeHistory.xml"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="article" title="Changes since the 1.76.0 release"><div class="titlepage"><div><div><h2 class="title"><a name="id36089309"></a>Changes since the 1.76.0 release</h2></div><div><div class="abstract" title="Abstract"><p><span class="strong"><strong>Note:</strong></span> This
+ document lists changes only since the 1.76.0 release.
+ If you instead want a record of the complete list of
+ changes for the codebase over its entire history, you
+ can obtain one by running the following commands:
+
+</p><pre class="screen"> <code class="code">svn checkout https://docbook.svn.sourceforge.net/svnroot/docbook/trunk/xsl</code>
+ <code class="code">svn log --xml --verbose xsl &gt; ChangeHistory.xml</code></pre></div></div></div><hr></div><div class="toc"><p><b>Table of Contents</b></p><dl><dt><span class="sect1"><a href="#V1.76.1">Release Notes: 1.76.1</a></span></dt><dd><dl><dt><span class="sect2"><a href="#V1.76.1_Common">Common</a></span></dt><dt><span class="sect2"><a href="#V1.76.1_FO">FO</a></span></dt><dt><span class="sect2"><a href="#V1.76.1_HTML">HTML</a></span></dt><dt><span class="sect2"><a href="#V1.76.1_Epub">Epub</a></span></dt><dt><span class="sect2"><a href="#V1.76.1_Webhelp">Webhelp</a></span></dt><dt><span class="sect2"><a href="#V1.76.1_Params">Params</a></span></dt><dt><span class="sect2"><a href="#V1.76.1_Extensions">Extensions</a></span></dt></dl></dd></dl></div><div class="sect1" title="Release Notes: 1.76.1"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="V1.76.1"></a>Release Notes: 1.76.1</h2></div></div></div><p>The following is a list of changes that have been made
+ since the 1.76.0 release.</p><div class="sect2" title="Common"><div class="titlepage"><div><div><h3 class="title"><a name="V1.76.1_Common"></a>Common</h3></div></div></div><p>The following changes have been made to the
+ <code class="filename">common</code> code
+ since the 1.76.0 release.</p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p><code class="literal">Mauritz Jeanson: Makefile</code></p><pre class="screen"><span class="commit-message">Added eu.xml and gl.xml to SOURCES.</span></pre></li><li class="listitem"><p><code class="literal">Jirka Kosek: l10n.xsl</code></p><pre class="screen"><span class="commit-message">Fixed bug when context was lost due to usage of xsl:key</span></pre></li></ul></div></div><div class="sect2" title="FO"><div class="titlepage"><div><div><h3 class="title"><a name="V1.76.1_FO"></a>FO</h3></div></div></div><p>The following changes have been made to the
+ <code class="filename">fo</code> code
+ since the 1.76.0 release.</p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p><code class="literal">Robert Stayton: docbook.xsl; xref.xsl; fop1.xsl</code></p><pre class="screen"><span class="commit-message">Apply patch to support named destination in fop1.xsl, per Sourceforge
+bug report #3029845.</span></pre></li><li class="listitem"><p><code class="literal">dleidert: pagesetup.xsl</code></p><pre class="screen"><span class="commit-message">Remove the namespace mistakingly added with the last upload.</span></pre></li></ul></div></div><div class="sect2" title="HTML"><div class="titlepage"><div><div><h3 class="title"><a name="V1.76.1_HTML"></a>HTML</h3></div></div></div><p>The following changes have been made to the
+ <code class="filename">html</code> code
+ since the 1.76.0 release.</p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p><code class="literal">Keith Fahlgren: highlight.xsl</code></p><pre class="screen"><span class="commit-message">Implementing handling for &lt;b&gt; and &lt;i&gt;: transform to &lt;strong&gt; and &lt;em&gt; for XHTML outputs and do not use in the highliting output (per Mauritz Jeanson)</span></pre></li></ul></div></div><div class="sect2" title="Epub"><div class="titlepage"><div><div><h3 class="title"><a name="V1.76.1_Epub"></a>Epub</h3></div></div></div><p>The following changes have been made to the
+ <code class="filename">epub</code> code
+ since the 1.76.0 release.</p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p><code class="literal">Keith Fahlgren: docbook.xsl</code></p><pre class="screen"><span class="commit-message">Bugfix for [#3071521] to ensure that NCX navPoints are generated for d:<a href="http://docbook.org/tdg5/en/html/book.html"><code class="sgmltag-element">book</code></a> root nodes with the -NS version of the stylesheets</span></pre></li><li class="listitem"><p><code class="literal">Keith Fahlgren: docbook.xsl</code></p><pre class="screen"><span class="commit-message">Remove unused NCX metadata elements</span></pre></li><li class="listitem"><p><code class="literal">Keith Fahlgren: bin/spec/epub_regressions_spec.rb; docbook.xsl; bin/spec/files/test_cust.x&#8943;</code></p><pre class="screen"><span class="commit-message">Normalizing identifier lookup between NCX and OPF</span></pre></li><li class="listitem"><p><code class="literal">Keith Fahlgren: bin/dbtoepub</code></p><pre class="screen"><span class="commit-message">Reduce logging verbosity</span></pre></li><li class="listitem"><p><code class="literal">Keith Fahlgren: bin/dbtoepub; bin/lib/docbook.rb</code></p><pre class="screen"><span class="commit-message">Only copy images once for the DocBook to EPUB tool to correct Windows bug reported in [#3065489]</span></pre></li></ul></div></div><div class="sect2" title="Webhelp"><div class="titlepage"><div><div><h3 class="title"><a name="V1.76.1_Webhelp"></a>Webhelp</h3></div></div></div><p>The following changes have been made to the
+ <code class="filename">webhelp</code> code
+ since the 1.76.0 release.</p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p><code class="literal">David Cramer: indexer</code></p><pre class="screen"><span class="commit-message">More webhelp indexer refactoring</span></pre></li><li class="listitem"><p><code class="literal">David Cramer: build.xml</code></p><pre class="screen"><span class="commit-message">Removed cruft from before webhelp indexer refactoring</span></pre></li><li class="listitem"><p><code class="literal">David Cramer: indexer/src</code></p><pre class="screen"><span class="commit-message">Refactoring webhelp to separate more cleanly the xsl and java code.</span></pre></li><li class="listitem"><p><code class="literal">David Cramer: indexer/lib</code></p><pre class="screen"><span class="commit-message">Refactoring webhelp to separate more cleanly the xsl and java code.</span></pre></li><li class="listitem"><p><code class="literal">David Cramer: Makefile; build.xml</code></p><pre class="screen"><span class="commit-message">Refactoring webhelp to separate more cleanly the xsl and java code.</span></pre></li><li class="listitem"><p><code class="literal">David Cramer: indexer/src/com/nexwave/nquindexer/IndexerTask.java; build.xml; indexer/src/&#8943;</code></p><pre class="screen"><span class="commit-message">Merged in changes from webhelp branch to <a href="http://docbook.org/tdg5/en/html/address.html"><code class="sgmltag-element">address</code></a> issue #3058244 regarding the xx.html temp file that was being created</span></pre></li></ul></div></div><div class="sect2" title="Params"><div class="titlepage"><div><div><h3 class="title"><a name="V1.76.1_Params"></a>Params</h3></div></div></div><p>The following changes have been made to the
+ <code class="filename">params</code> code
+ since the 1.76.0 release.</p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p><code class="literal">Robert Stayton: draft.mode.xml</code></p><pre class="screen"><span class="commit-message">Change default for <a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/draft.mode.html"><em class="parameter"><code>draft.mode</code></em></a> to 'no'.</span></pre></li></ul></div></div><div class="sect2" title="Extensions"><div class="titlepage"><div><div><h3 class="title"><a name="V1.76.1_Extensions"></a>Extensions</h3></div></div></div><p>The following changes have been made to the
+ <code class="filename">extensions</code> code
+ since the 1.76.0 release.</p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p><code class="literal">David Cramer: Makefile</code></p><pre class="screen"><span class="commit-message">More webhelp refactoring</span></pre></li><li class="listitem"><p><code class="literal">David Cramer: Makefile</code></p><pre class="screen"><span class="commit-message">Refactoring webhelp to separate more cleanly the xsl and java code.</span></pre></li></ul></div></div></div></div></body></html>
+
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/NEWS.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/NEWS.xml
new file mode 100644
index 0000000..8cc04e6
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/NEWS.xml
@@ -0,0 +1,145 @@
+<?xml version="1.0"?>
+
+<article>
+<info>
+<abstract>
+<para><emphasis role="strong">Note:</emphasis> This
+ document lists changes only since the 1.76.0 release.
+ If you instead want a record of the complete list of
+ changes for the codebase over its entire history, you
+ can obtain one by running the following commands:
+
+<screen> <code>svn checkout https://docbook.svn.sourceforge.net/svnroot/docbook/trunk/xsl</code>
+ <code>svn log --xml --verbose xsl &gt; ChangeHistory.xml</code></screen></para>
+</abstract>
+</info><title>Changes since the 1.76.0 release</title>
+
+<sect1 xml:id="V1.76.1">
+<title>Release Notes: 1.76.1</title>
+<para>The following is a list of changes that have been made
+ since the 1.76.0 release.</para>
+
+<sect2 xml:id="V1.76.1_Common">
+<title>Common</title>
+<para>The following changes have been made to the
+ <filename>common</filename> code
+ since the 1.76.0 release.</para>
+<itemizedlist>
+<listitem>
+<para><literal>Mauritz Jeanson: Makefile</literal></para><screen><phrase role="commit-message">Added eu.xml and gl.xml to SOURCES.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Jirka Kosek: l10n.xsl</literal></para><screen><phrase role="commit-message">Fixed bug when context was lost due to usage of xsl:key</phrase></screen>
+</listitem>
+</itemizedlist>
+</sect2><!--end of Common changes for 1.76.1-->
+
+<sect2 xml:id="V1.76.1_FO">
+<title>FO</title>
+<para>The following changes have been made to the
+ <filename>fo</filename> code
+ since the 1.76.0 release.</para>
+<itemizedlist>
+<listitem>
+<para><literal>Robert Stayton: docbook.xsl; xref.xsl; fop1.xsl</literal></para><screen><phrase role="commit-message">Apply patch to support named destination in fop1.xsl, per Sourceforge
+bug report #3029845.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>dleidert: pagesetup.xsl</literal></para><screen><phrase role="commit-message">Remove the namespace mistakingly added with the last upload.</phrase></screen>
+</listitem>
+</itemizedlist>
+</sect2><!--end of FO changes for 1.76.1-->
+
+<sect2 xml:id="V1.76.1_HTML">
+<title>HTML</title>
+<para>The following changes have been made to the
+ <filename>html</filename> code
+ since the 1.76.0 release.</para>
+<itemizedlist>
+<listitem>
+<para><literal>Keith Fahlgren: highlight.xsl</literal></para><screen><phrase role="commit-message">Implementing handling for &lt;b&gt; and &lt;i&gt;: transform to &lt;strong&gt; and &lt;em&gt; for XHTML outputs and do not use in the highliting output (per Mauritz Jeanson)</phrase></screen>
+</listitem>
+</itemizedlist>
+</sect2><!--end of HTML changes for 1.76.1-->
+
+<sect2 xml:id="V1.76.1_Epub">
+<title>Epub</title>
+<para>The following changes have been made to the
+ <filename>epub</filename> code
+ since the 1.76.0 release.</para>
+<itemizedlist>
+<listitem>
+<para><literal>Keith Fahlgren: docbook.xsl</literal></para><screen><phrase role="commit-message">Bugfix for [#3071521] to ensure that NCX navPoints are generated for d:<tag>book</tag> root nodes with the -NS version of the stylesheets</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Keith Fahlgren: docbook.xsl</literal></para><screen><phrase role="commit-message">Remove unused NCX metadata elements</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Keith Fahlgren: bin/spec/epub_regressions_spec.rb; docbook.xsl; bin/spec/files/test_cust.x⋯</literal></para><screen><phrase role="commit-message">Normalizing identifier lookup between NCX and OPF</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Keith Fahlgren: bin/dbtoepub</literal></para><screen><phrase role="commit-message">Reduce logging verbosity</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Keith Fahlgren: bin/dbtoepub; bin/lib/docbook.rb</literal></para><screen><phrase role="commit-message">Only copy images once for the DocBook to EPUB tool to correct Windows bug reported in [#3065489]</phrase></screen>
+</listitem>
+</itemizedlist>
+</sect2><!--end of Epub changes for 1.76.1-->
+
+<sect2 xml:id="V1.76.1_Webhelp">
+<title>Webhelp</title>
+<para>The following changes have been made to the
+ <filename>webhelp</filename> code
+ since the 1.76.0 release.</para>
+<itemizedlist>
+<listitem>
+<para><literal>David Cramer: indexer</literal></para><screen><phrase role="commit-message">More webhelp indexer refactoring</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>David Cramer: build.xml</literal></para><screen><phrase role="commit-message">Removed cruft from before webhelp indexer refactoring</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>David Cramer: indexer/src</literal></para><screen><phrase role="commit-message">Refactoring webhelp to separate more cleanly the xsl and java code.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>David Cramer: indexer/lib</literal></para><screen><phrase role="commit-message">Refactoring webhelp to separate more cleanly the xsl and java code.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>David Cramer: Makefile; build.xml</literal></para><screen><phrase role="commit-message">Refactoring webhelp to separate more cleanly the xsl and java code.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>David Cramer: indexer/src/com/nexwave/nquindexer/IndexerTask.java; build.xml; indexer/src/⋯</literal></para><screen><phrase role="commit-message">Merged in changes from webhelp branch to <tag>address</tag> issue #3058244 regarding the xx.html temp file that was being created</phrase></screen>
+</listitem>
+</itemizedlist>
+</sect2><!--end of Webhelp changes for 1.76.1-->
+
+<sect2 xml:id="V1.76.1_Params">
+<title>Params</title>
+<para>The following changes have been made to the
+ <filename>params</filename> code
+ since the 1.76.0 release.</para>
+<itemizedlist>
+<listitem>
+<para><literal>Robert Stayton: draft.mode.xml</literal></para><screen><phrase role="commit-message">Change default for <parameter>draft.mode</parameter> to 'no'.</phrase></screen>
+</listitem>
+</itemizedlist>
+</sect2><!--end of Params changes for 1.76.1-->
+
+<sect2 xml:id="V1.76.1_Extensions">
+<title>Extensions</title>
+<para>The following changes have been made to the
+ <filename>extensions</filename> code
+ since the 1.76.0 release.</para>
+<itemizedlist>
+<listitem>
+<para><literal>David Cramer: Makefile</literal></para><screen><phrase role="commit-message">More webhelp refactoring</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>David Cramer: Makefile</literal></para><screen><phrase role="commit-message">Refactoring webhelp to separate more cleanly the xsl and java code.</phrase></screen>
+</listitem>
+</itemizedlist>
+</sect2><!--end of Extensions changes for 1.76.1-->
+
+</sect1>
+</article>
+
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/README b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/README
new file mode 100644
index 0000000..3a5558a
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/README
@@ -0,0 +1,157 @@
+----------------------------------------------------------------------
+ README file for the DocBook XSL Stylesheets
+----------------------------------------------------------------------
+$Id: README 8484 2009-07-13 20:35:34Z mzjn $
+
+These are XSL stylesheets for transforming DocBook XML document
+instances into various output formats.
+
+This README file provides only very minimal documentation on using
+the stylesheets. For more complete information, see Bob Stayton's
+book "DocBook XSL: The Complete Guide", available online at:
+
+ http://www.sagehill.net/docbookxsl/
+
+----------------------------------------------------------------------
+Installation
+----------------------------------------------------------------------
+See the INSTALL file for information about installing this release.
+
+----------------------------------------------------------------------
+How to use the stylesheets
+----------------------------------------------------------------------
+The base canonical URI for these stylesheets is:
+
+ http://docbook.sourceforge.net/release/xsl/current/
+
+You call any of the stylesheets in this distribution by doing one
+of the following:
+
+ - Use the base canonical URI in combination with one of the
+ pathnames below. For example, for "chunked" HTML, output:
+
+ http://docbook.sourceforge.net/release/xsl/current/html/chunk.xsl
+
+ If your system has a working XML Catalog or SGML Catalog setup
+ (most Linux systems do), then that URI will automatically be
+ resolved and replaced with a local pathname on your system.
+
+ - Use a "real" local system base path in combination with one of
+ the pathnames below. For example, for "chunked" HTML, output:
+
+ /usr/share/xml/docbook/stylesheet/nwalsh/html/chunk.xsl
+
+To transform documents created with the standard DocBook
+schema/DTD, use one of the following stylesheets:
+
+ fo/docbook.xsl - for XSL-FO
+
+ html/docbook.xsl - for HTML (as a single file)
+ html/chunk.xsl - for HTML (chunked into multiple files)
+ html/onechunk.xsl - for HTML (chunked output in single file)
+
+ xhtml/*.xsl - for XHTML versions of the above
+
+ xhtml-1_1/*.xsl - for XHTML 1.1 versions of the above
+
+ epub/docbook.xsl - for .epub
+
+ htmlhelp/htmlhelp.xsl - for HTML Help
+ javahelp/javahelp.xsl - for JavaHelp
+ eclipse/eclipse.xsl - for Eclipse Help
+
+ manpages/docbook.xsl - for groff/nroff man pages
+
+ */profile-* - single-pass-profiling versions of all above
+
+ roundtrip/*.xsl - for DocBook to WordML, etc., to DocBook
+
+To transform documents created with the DocBook Slides schema/DTD,
+use one of the following stylesheets:
+
+ slides/html/*.xsl - for HTML slides of various kinds
+ slides/xhtml/*.xsl - for XHTML slides of various kinds
+ slides/fo/plain.xsl - for XSL-FO slides
+ slides/htmlhelp/... - for HTML Help slides
+
+To transform documents created with the DocBook Website
+schema/DTD, use one of the following stylesheets:
+
+ website/website.xsl - for non-tabular, non-chunked output
+ website/tabular.xsl - for tabular, non-chunked output
+ website/chunk-* - for chunked output
+
+To generate a titlepage customization layer from a titlepage spec:
+
+ template/titlepage.xsl
+
+For details about creating titlepage spec files and generating and
+using titlepage customization layers, see "DocBook XSL: The
+Complete Guide" <http://www.sagehill.net/docbookxsl/>
+
+----------------------------------------------------------------------
+Manifest
+----------------------------------------------------------------------
+AUTHORS contact information
+BUGS about known problems
+COPYING copyright information
+INSTALL installation instructions
+README this file
+RELEASE.* per-release cumulative summaries of user-visible changes
+TODO about planned features not yet implemented
+VERSION release metadata, including the current version
+ number (note that the VERSION file is an XSL stylesheet)
+NEWS changes since the last public release (for a cumulative list of
+ changes, see the ChangeHistory.xml file)
+
+common/ code used among several output formats (HTML, FO, manpages,...)
+docsrc/ documentation sources
+eclipse/ for producing Eclipse Help
+epub/ for producing .epub
+extensions/ DocBook XSL Java extensions
+fo/ for producing XSL-FO
+highlighting files used for adding source-code syntax highlighting in output
+html/ for producing HTML
+htmlhelp/ for producing HTML Help
+images/ images used in callouts and graphical admonitions
+javahelp/ for producing Java Help
+lib/ utility stylesheets with schema-independent functions
+manpages/ for producing groff/troff man pages
+profiling/ for profiling (omitting/including conditional text)
+roundtrip/ for "round trip" conversion among DocBook and
+ various word-processor formats (WordML, etc.)
+slides/ for producing slides output (from Slides source)
+template/ templates for building stylesheet customization layers
+tools/ assorted supplementary tools
+website/ for producing website output (from Website source)
+xhtml/ for producing XHTML
+xhtml-1_1/ for producing (stricter) XHTML 1.1
+
+----------------------------------------------------------------------
+Changes
+----------------------------------------------------------------------
+See the NEWS file for changes made since the previous release.
+
+See the RELEASE-NOTES.html or RELEASE-NOTES.txt or RELEASE-NOTES.pdf
+files for per-release cumulative summaries of significant
+user-visible changes.
+
+For online access to a hyperlinked view of all changes made over
+the entire history of the codebase, see the following:
+
+ http://docbook.svn.sourceforge.net/viewvc/docbook/trunk/xsl/?view=log
+
+WARNING: That above change history is a very long list and may
+take a long time to load/download.
+
+You can also create an XML-formatted "ChangeHistory.xml" copy of
+the complete change history for the codebase by running the
+following commands:
+
+ svn checkout https://docbook.svn.sf.net/svnroot/docbook/trunk/xsl
+ svn log --xml --verbose xsl > ChangeHistory.xml
+
+----------------------------------------------------------------------
+Copyright information
+----------------------------------------------------------------------
+See the accompanying file named COPYING.
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/RELEASE-NOTES.html b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/RELEASE-NOTES.html
new file mode 100644
index 0000000..556bd67
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/RELEASE-NOTES.html
@@ -0,0 +1,8353 @@
+<html><head><meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"><title>Release Notes for the DocBook XSL Stylesheets</title><meta name="generator" content="DocBook XSL Stylesheets V1.76.1"><meta name="description" content="This release-notes document is available in the following formats: HTML, PDF, plain text; it provides a per-release list of enhancements and changes to the stylesheets&#8217; public APIs (user-configurable parameters) and excludes descriptions of most bug fixes. For a complete list of all changes (including all bug fixes) that have been made since the previous release, see the separate NEWS (plain text) or NEWS.html files. Also available: An online hyperlinked change history (warning: big file) of all changes made over the entire history of the codebase. As with all DocBook Project &#8220;dot one plus&#8221; releases, this release aspires to be stable (in contrast to dot-zero releases, which are experimental)."></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div lang="en" class="article" title="Release Notes for the DocBook XSL Stylesheets"><div class="titlepage"><div><div><h2 class="title"><a name="releasenotes"></a>Release Notes for the DocBook XSL Stylesheets</h2></div><div><p class="releaseinfo">$Revision: 8934 $ $Date: 2010-11-01 13:03:14 -0700 (Mon, 01 Nov 2010) $</p></div><div><p class="pubdate">2010-11-01</p></div><div><div class="abstract" title="Abstract">
+<p>This release-notes
+ document is available in the following formats:
+ <a class="ulink" href="http://docbook.sourceforge.net/release/xsl/current/RELEASE-NOTES.html" target="_top">HTML</a>,
+ <a class="ulink" href="http://docbook.sourceforge.net/release/xsl/current/RELEASE-NOTES.pdf" target="_top">PDF</a>,
+ <a class="ulink" href="http://docbook.sourceforge.net/release/xsl/current/RELEASE-NOTES.txt" target="_top">plain text</a>; it provides a per-release list
+of enhancements and changes to the stylesheets&#8217; public APIs
+(user-configurable parameters) and excludes descriptions of most
+bug fixes. For a complete list of all changes (including all bug
+fixes) that have been made since the previous release, see the
+separate <a class="ulink" href="NEWS" target="_top">NEWS</a> (plain text) or <a class="ulink" href="NEWS.html" target="_top">NEWS.html</a> files. Also available:
+An online <a class="ulink" href="http://docbook.svn.sourceforge.net/viewvc/docbook/trunk/xsl/?view=log" target="_top">hyperlinked change history</a> (warning: big file) of all
+changes made over the entire history of the codebase.</p>
+
+<p>As with all DocBook Project &#8220;dot
+ one plus&#8221; releases, this release aspires to be stable (in
+ contrast to <a class="link" href="#dot0" title="About dot-zero releases">dot-zero</a> releases, which
+ are experimental).</p>
+
+
+</div></div></div><hr></div><div class="toc"><p><b>Table of Contents</b></p><dl><dt><span class="sect1"><a href="#V1.76.1">Release Notes: 1.76.1</a></span></dt><dd><dl><dt><span class="sect2"><a href="#rnV1.76.1_FO">FO</a></span></dt><dt><span class="sect2"><a href="#rnV1.76.1_HTML">HTML</a></span></dt><dt><span class="sect2"><a href="#rnV1.76.1_Params">Params</a></span></dt></dl></dd><dt><span class="sect1"><a href="#V1.76.0">Release Notes: 1.76.0</a></span></dt><dd><dl><dt><span class="sect2"><a href="#rnV1.76.0_Gentext">Gentext</a></span></dt><dt><span class="sect2"><a href="#rnV1.76.0_Common">Common</a></span></dt><dt><span class="sect2"><a href="#rnV1.76.0_FO">FO</a></span></dt><dt><span class="sect2"><a href="#rnV1.76.0_HTML">HTML</a></span></dt><dt><span class="sect2"><a href="#rnV1.76.0_Manpages">Manpages</a></span></dt><dt><span class="sect2"><a href="#rnV1.76.0_Epub">Epub</a></span></dt><dt><span class="sect2"><a href="#rnV1.76.0_Eclipse">Eclipse</a></span></dt><dt><span class="sect2"><a href="#rnV1.76.0_Params">Params</a></span></dt><dt><span class="sect2"><a href="#rnV1.76.0_XSL-Xalan">XSL-Xalan</a></span></dt></dl></dd><dt><span class="sect1"><a href="#rn_V1.75.2">Release Notes: 1.75.2</a></span></dt><dd><dl><dt><span class="sect2"><a href="#rn_V1.75.2_Gentext">Gentext</a></span></dt><dt><span class="sect2"><a href="#rn_V1.75.2_Common">Common</a></span></dt><dt><span class="sect2"><a href="#rn_V1.75.2_FO">FO</a></span></dt><dt><span class="sect2"><a href="#rn_V1.75.2_HTML">HTML</a></span></dt><dt><span class="sect2"><a href="#rn_V1.75.2_Manpages">Manpages</a></span></dt><dt><span class="sect2"><a href="#rn_V1.75.2_Epub">Epub</a></span></dt><dt><span class="sect2"><a href="#rn_V1.75.2_Profiling">Profiling</a></span></dt><dt><span class="sect2"><a href="#rn_V1.75.2_XSL-Saxon">XSL-Saxon</a></span></dt><dt><span class="sect2"><a href="#rn_V1.75.2_XSL-Xalan">XSL-Xalan</a></span></dt></dl></dd><dt><span class="sect1"><a href="#rn_V1.75.1">Release Notes: 1.75.1</a></span></dt><dd><dl><dt><span class="sect2"><a href="#rn_V1.75.1_FO">FO</a></span></dt><dt><span class="sect2"><a href="#rn_V1.75.1_HTML">HTML</a></span></dt><dt><span class="sect2"><a href="#rn_V1.75.1_Epub">Epub</a></span></dt><dt><span class="sect2"><a href="#rn_V1.75.1_Params">Params</a></span></dt></dl></dd><dt><span class="sect1"><a href="#V1.75.0">Release Notes: 1.75.0</a></span></dt><dd><dl><dt><span class="sect2"><a href="#rn_V1.75.0_Gentext">Gentext</a></span></dt><dt><span class="sect2"><a href="#rn_V1.75.0_Common">Common</a></span></dt><dt><span class="sect2"><a href="#rn_V1.75.0_FO">FO</a></span></dt><dt><span class="sect2"><a href="#rn_V1.75.0_HTML">HTML</a></span></dt><dt><span class="sect2"><a href="#rn_V1.75.0_Manpages">Manpages</a></span></dt><dt><span class="sect2"><a href="#rn_V1.75.0_Epub">ePub</a></span></dt><dt><span class="sect2"><a href="#rn_V1.75.0_HTMLHelp">HTMLHelp</a></span></dt><dt><span class="sect2"><a href="#rn_V1.75.0_Params">Params</a></span></dt><dt><span class="sect2"><a href="#rn_V1.75.0_Highlighting">Highlighting</a></span></dt><dt><span class="sect2"><a href="#rn_V1.75.0_XSL-Saxon">XSL-Saxon</a></span></dt><dt><span class="sect2"><a href="#rn_V1.75.0_XSL-Xalan">XSL-Xalan</a></span></dt></dl></dd><dt><span class="sect1"><a href="#V1.74.3">Release Notes: 1.74.3</a></span></dt><dt><span class="sect1"><a href="#V1.74.2">Release Notes: 1.74.2</a></span></dt><dt><span class="sect1"><a href="#V1.74.1">Release Notes: 1.74.1</a></span></dt><dd><dl><dt><span class="sect2"><a href="#summary_V1.74.1_Gentext">Gentext</a></span></dt><dt><span class="sect2"><a href="#summary_V1.74.1_FO">FO</a></span></dt><dt><span class="sect2"><a href="#summary_V1.74.1_HTML">HTML</a></span></dt><dt><span class="sect2"><a href="#summary_V1.74.1_Manpages">Manpages</a></span></dt><dt><span class="sect2"><a href="#summary_V1.74.1_Epub">ePub</a></span></dt><dt><span class="sect2"><a href="#summary_V1.74.1_Roundtrip">Roundtrip</a></span></dt><dt><span class="sect2"><a href="#summary_V1.74.1_Params">Params</a></span></dt><dt><span class="sect2"><a href="#summary_V1.74.1_Highlighting">Highlighting</a></span></dt></dl></dd><dt><span class="sect1"><a href="#V1.74.0">Release Notes: 1.74.0</a></span></dt><dd><dl><dt><span class="sect2"><a href="#V1.74.0_Gentext">Gentext</a></span></dt><dt><span class="sect2"><a href="#V1.74.0_Common">Common</a></span></dt><dt><span class="sect2"><a href="#V1.74.0_FO">FO</a></span></dt><dt><span class="sect2"><a href="#V1.74.0_HTML">HTML</a></span></dt><dt><span class="sect2"><a href="#V1.74.0_Manpages">Manpages</a></span></dt><dt><span class="sect2"><a href="#V1.74.0_Epub">Epub</a></span></dt><dt><span class="sect2"><a href="#V1.74.0_HTMLHelp">HTMLHelp</a></span></dt><dt><span class="sect2"><a href="#V1.74.0_Eclipse">Eclipse</a></span></dt><dt><span class="sect2"><a href="#V1.74.0_JavaHelp">JavaHelp</a></span></dt><dt><span class="sect2"><a href="#V1.74.0_Roundtrip">Roundtrip</a></span></dt><dt><span class="sect2"><a href="#V1.74.0_Slides">Slides</a></span></dt><dt><span class="sect2"><a href="#V1.74.0_Website">Website</a></span></dt><dt><span class="sect2"><a href="#V1.74.0_Params">Params</a></span></dt><dt><span class="sect2"><a href="#V1.74.0_Profiling">Profiling</a></span></dt><dt><span class="sect2"><a href="#V1.74.0_Tools">Tools</a></span></dt><dt><span class="sect2"><a href="#V1.74.0_Extensions">Extensions</a></span></dt><dt><span class="sect2"><a href="#V1.74.0_XSL-Saxon">XSL-Saxon</a></span></dt><dt><span class="sect2"><a href="#V1.74.0_XSL-Xalan">XSL-Xalan</a></span></dt><dt><span class="sect2"><a href="#V1.74.0_XSL-libxslt">XSL-libxslt</a></span></dt></dl></dd><dt><span class="sect1"><a href="#V1.73.2">Release Notes: 1.73.2</a></span></dt><dt><span class="sect1"><a href="#V1.73.1">Release: 1.73.1</a></span></dt><dd><dl><dt><span class="sect2"><a href="#V1.73.1_Gentext">Gentext</a></span></dt><dt><span class="sect2"><a href="#V1.73.1_FO">FO</a></span></dt><dt><span class="sect2"><a href="#V1.73.1_HTML">HTML</a></span></dt><dt><span class="sect2"><a href="#V1.73.1_Manpages">Manpages</a></span></dt><dt><span class="sect2"><a href="#V1.73.1_HTMLHelp">HTMLHelp</a></span></dt><dt><span class="sect2"><a href="#V1.73.1_Eclipse">Eclipse</a></span></dt><dt><span class="sect2"><a href="#V1.73.1_JavaHelp">JavaHelp</a></span></dt><dt><span class="sect2"><a href="#V1.73.1_Roundtrip">Roundtrip</a></span></dt><dt><span class="sect2"><a href="#V1.73.1_Params">Params</a></span></dt></dl></dd><dt><span class="sect1"><a href="#V1.73.0">Release: 1.73.0</a></span></dt><dd><dl><dt><span class="sect2"><a href="#V1.73.0_Gentext">Gentext</a></span></dt><dt><span class="sect2"><a href="#V1.73.0_Common">Common</a></span></dt><dt><span class="sect2"><a href="#V1.73.0_FO">FO</a></span></dt><dt><span class="sect2"><a href="#V1.73.0_HTML">HTML</a></span></dt><dt><span class="sect2"><a href="#V1.73.0_Manpages">Manpages</a></span></dt><dt><span class="sect2"><a href="#V1.73.0_Eclipse">Eclipse</a></span></dt><dt><span class="sect2"><a href="#V1.73.0_JavaHelp">JavaHelp</a></span></dt><dt><span class="sect2"><a href="#V1.73.0_Roundtrip">Roundtrip</a></span></dt><dt><span class="sect2"><a href="#V1.73.0_Params">Params</a></span></dt><dt><span class="sect2"><a href="#V1.73.0_Highlighting">Highlighting</a></span></dt><dt><span class="sect2"><a href="#V1.73.0_Profiling">Profiling</a></span></dt><dt><span class="sect2"><a href="#V1.73.0_Lib">Lib</a></span></dt><dt><span class="sect2"><a href="#V1.73.0_Tools">Tools</a></span></dt><dt><span class="sect2"><a href="#V1.73.0_XSL-Saxon">XSL-Saxon</a></span></dt><dt><span class="sect2"><a href="#V1.73.0_XSL-Xalan">XSL-Xalan</a></span></dt></dl></dd><dt><span class="sect1"><a href="#V1.72.0">Release: 1.72.0</a></span></dt><dd><dl><dt><span class="sect2"><a href="#V1.72.0_Common">Common</a></span></dt><dt><span class="sect2"><a href="#V1.72.0_FO">FO</a></span></dt><dt><span class="sect2"><a href="#V1.72.0_HTML">HTML</a></span></dt><dt><span class="sect2"><a href="#V1.72.0_Manpages">Manpages</a></span></dt><dt><span class="sect2"><a href="#V1.72.0_Params">Params</a></span></dt><dt><span class="sect2"><a href="#V1.72.0_Template">Template</a></span></dt><dt><span class="sect2"><a href="#V1.72.0_Roundtrip">Roundtrip</a></span></dt></dl></dd><dt><span class="sect1"><a href="#V1.71.1">Release: 1.71.1</a></span></dt><dd><dl><dt><span class="sect2"><a href="#V1.71.1_Common">Common</a></span></dt><dt><span class="sect2"><a href="#V1.71.1_FO">FO</a></span></dt><dt><span class="sect2"><a href="#V1.71.1_HTML">HTML</a></span></dt><dt><span class="sect2"><a href="#V1.71.1_Highlighting">Highlighting</a></span></dt><dt><span class="sect2"><a href="#V1.71.1_Manpages">Manpages</a></span></dt><dt><span class="sect2"><a href="#V1.71.1_Params">Params</a></span></dt><dt><span class="sect2"><a href="#V1.71.1_Profiling">Profiling</a></span></dt></dl></dd><dt><span class="sect1"><a href="#V1.71.0">Release: 1.71.0</a></span></dt><dd><dl><dt><span class="sect2"><a href="#V1.71.0_Common">Common</a></span></dt><dt><span class="sect2"><a href="#V1.71.0_Extensions">Extensions</a></span></dt><dt><span class="sect2"><a href="#V1.71.0_FO">FO</a></span></dt><dt><span class="sect2"><a href="#V1.71.0_HTML">HTML</a></span></dt><dt><span class="sect2"><a href="#V1.71.0_Highlighting">Highlighting</a></span></dt><dt><span class="sect2"><a href="#V1.71.0_Manpages">Manpages</a></span></dt><dt><span class="sect2"><a href="#V1.71.0_Params">Params</a></span></dt><dt><span class="sect2"><a href="#V1.71.0_Tools">Tools</a></span></dt></dl></dd><dt><span class="sect1"><a href="#V1701">Release: 1.70.1</a></span></dt><dd><dl><dt><span class="sect2"><a href="#V1701_FO">FO</a></span></dt><dt><span class="sect2"><a href="#V1701_HTML">HTML</a></span></dt><dt><span class="sect2"><a href="#V1701_HTMLHelp">HTMLHelp</a></span></dt><dt><span class="sect2"><a href="#V1701_Params">Params</a></span></dt></dl></dd><dt><span class="sect1"><a href="#V1700">Release: 1.70.0</a></span></dt><dd><dl><dt><span class="sect2"><a href="#V1700_Common">Common</a></span></dt><dt><span class="sect2"><a href="#V1700_Extensions">Extensions</a></span></dt><dt><span class="sect2"><a href="#V1700_FO">FO</a></span></dt><dt><span class="sect2"><a href="#V1700_HTML">HTML</a></span></dt><dt><span class="sect2"><a href="#V1700_Manpages">Manpages</a></span></dt><dt><span class="sect2"><a href="#V1700_Params">Params</a></span></dt><dt><span class="sect2"><a href="#V1700_Profiling">Profiling</a></span></dt><dt><span class="sect2"><a href="#V1700_Tools">Tools</a></span></dt><dt><span class="sect2"><a href="#V1700_WordML">WordML</a></span></dt></dl></dd><dt><span class="sect1"><a href="#V1691">Release 1.69.1</a></span></dt><dt><span class="sect1"><a href="#V1690">Release 1.69.0</a></span></dt><dd><dl><dt><span class="sect2"><a href="#V1690_COMMON">Common</a></span></dt><dt><span class="sect2"><a href="#V1690_FO">FO</a></span></dt><dt><span class="sect2"><a href="#V1690_HELP">Help</a></span></dt><dt><span class="sect2"><a href="#V1690_HTML">HTML</a></span></dt><dt><span class="sect2"><a href="#V1690_MAN">man</a></span></dt></dl></dd><dt><span class="sect1"><a href="#V1681">Release 1.68.1</a></span></dt><dt><span class="sect1"><a href="#V1680">Release 1.68.0</a></span></dt><dt><span class="sect1"><a href="#V1672">Release 1.67.2</a></span></dt><dt><span class="sect1"><a href="#V1671">Release 1.67.1</a></span></dt><dt><span class="sect1"><a href="#V1670">Release 1.67.0</a></span></dt><dt><span class="sect1"><a href="#V1661">Release 1.66.1</a></span></dt><dt><span class="sect1"><a href="#V1650">Release 1.65.0</a></span></dt><dt><span class="sect1"><a href="#V1641">Release 1.64.1</a></span></dt><dt><span class="sect1"><a href="#V1610">Release 1.61.0</a></span></dt><dt><span class="sect1"><a href="#V1601">Release 1.60.1</a></span></dt><dt><span class="sect1"><a href="#V1592">Release 1.59.2</a></span></dt><dt><span class="sect1"><a href="#V1591">Release 1.59.1</a></span></dt><dt><span class="sect1"><a href="#V1580">Release 1.58.0</a></span></dt><dt><span class="sect1"><a href="#V1570">Release 1.57.0</a></span></dt><dt><span class="sect1"><a href="#V1560">Release 1.56.0</a></span></dt><dt><span class="sect1"><a href="#VOlder">Older releases</a></span></dt><dt><span class="sect1"><a href="#dot0">About dot-zero releases</a></span></dt></dl></div>
+
+
+
+
+<div class="sect1" title="Release Notes: 1.76.1"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="V1.76.1"></a>Release Notes: 1.76.1</h2></div></div></div>
+
+<p>The following is a list of changes that have been made
+ since the 1.76.0 release.</p>
+
+<div class="sect2" title="FO"><div class="titlepage"><div><div><h3 class="title"><a name="rnV1.76.1_FO"></a>FO</h3></div></div></div>
+
+<p>The following changes have been made to the
+ <code class="filename">fo</code> code
+ since the 1.76.0 release.</p>
+<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
+<p><code class="literal">Robert Stayton: docbook.xsl; xref.xsl; fop1.xsl</code></p><pre class="screen"><span class="commit-message">Apply patch to support named destination in fop1.xsl, per Sourceforge
+bug report #3029845.</span></pre>
+</li></ul></div>
+</div>
+
+<div class="sect2" title="HTML"><div class="titlepage"><div><div><h3 class="title"><a name="rnV1.76.1_HTML"></a>HTML</h3></div></div></div>
+
+<p>The following changes have been made to the <code class="filename">html</code> code since the 1.76.0 release.</p>
+<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
+<p><code class="literal">Keith Fahlgren: highlight.xsl</code></p><pre class="screen"><span class="commit-message">Implementing handling for &lt;b&gt; and &lt;i&gt;: transform to &lt;strong&gt; and &lt;em&gt; for XHTML outputs and do not use in the highliting output (per Mauritz Jeanson)</span></pre>
+</li></ul></div>
+</div>
+
+<div class="sect2" title="Params"><div class="titlepage"><div><div><h3 class="title"><a name="rnV1.76.1_Params"></a>Params</h3></div></div></div>
+
+<p>The following changes have been made to the
+ <code class="filename">params</code> code
+ since the 1.76.0 release.</p>
+<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
+<p><code class="literal">Robert Stayton: draft.mode.xml</code></p><pre class="screen"><span class="commit-message">Change default for <a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/draft.mode.html"><em class="parameter"><code>draft.mode</code></em></a> to 'no'.</span></pre>
+</li></ul></div>
+</div>
+
+
+</div>
+ <div class="sect1" title="Release Notes: 1.76.0"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="V1.76.0"></a>Release Notes: 1.76.0</h2></div></div></div>
+
+<p>This release includes important bug fixes and adds the following
+significant feature changes:</p>
+<div class="variablelist"><dl><dt><span class="term">Webhelp</span></dt><dd><p>A new browser-based, cross-platform help format with full-text search and other features typically found in help systems. See <code class="filename">webhelp/docs/content/ch01.html</code> for more information and a demo. </p></dd><dt><span class="term">Gentext</span></dt><dd><p>Many updates and additions to translation/locales thanks to Red Hat, the Fedora Project, and other contributors.</p></dd><dt><span class="term">Common</span></dt><dd><p>Faster localization support, as language files are loaded on demand.</p></dd><dt><span class="term">FO</span></dt><dd><p>Support for SVG content in <a href="http://docbook.org/tdg5/en/html/imagedata.html"><code class="sgmltag-element">imagedata</code></a> added.</p></dd><dt><span class="term">HTML</span></dt><dd><p>Output improved when using '<a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/make.clean.html.html"><em class="parameter"><code>make.clean.html</code></em></a>' and a stock CSS file is now provided.</p></dd><dt><span class="term">EPUB</span></dt><dd><p>A number of improvements to NCX, cover and image selection, and XHTML 1.1 element choices</p></dd></dl></div>
+
+ <p>The following is a list of changes that have been made since the 1.75.2 release.</p>
+ <div class="sect2" title="Gentext"><div class="titlepage"><div><div><h3 class="title"><a name="rnV1.76.0_Gentext"></a>Gentext</h3></div></div></div>
+
+ <p>The following changes have been made to the <code class="filename">gentext</code> code since the 1.75.2 release.</p>
+ <div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
+ <p>
+ <code class="literal">rlandmann: locale/fa.xml</code>
+ </p>
+ <pre class="screen">
+ <span class="commit-message">Update to Persian translation from the Fedora Project</span>
+ </pre>
+ </li><li class="listitem">
+ <p>
+ <code class="literal">rlandmann: locale/nds.xml</code>
+ </p>
+ <pre class="screen">
+ <span class="commit-message">Locale for Low German</span>
+ </pre>
+ </li><li class="listitem">
+ <p>
+ <code class="literal">Mauritz Jeanson: locale/ka.xml; Makefile</code>
+ </p>
+ <pre class="screen">
+ <span class="commit-message">Added support for Georgian based on patch #2917147.</span>
+ </pre>
+ </li><li class="listitem">
+ <p>
+ <code class="literal">rlandmann: locale/nl.xml; locale/ja.xml</code>
+ </p>
+ <pre class="screen">
+ <span class="commit-message">Updated translations from Red Hat and the Fedora Project</span>
+ </pre>
+ </li><li class="listitem">
+ <p>
+ <code class="literal">rlandmann: locale/bs.xml; locale/ru.xml; locale/hr.xml</code>
+ </p>
+ <pre class="screen">
+ <span class="commit-message">Updated locales from Red Hat and the Fedora Project</span>
+ </pre>
+ </li><li class="listitem">
+ <p>
+ <code class="literal">rlandmann: locale/pt.xml; locale/cs.xml; locale/es.xml; locale/bg.xml; locale/nl.xml; loca&#8943;</code>
+ </p>
+ <pre class="screen">
+ <span class="commit-message">Updated translations from Red Hat and the Fedora Project</span>
+ </pre>
+ </li><li class="listitem">
+ <p>
+ <code class="literal">rlandmann: locale/as.xml; locale/bn_IN.xml; locale/ast.xml; locale/ml.xml; locale/te.xml; &#8943;</code>
+ </p>
+ <pre class="screen">
+ <span class="commit-message">New translations from Red Hat and the Fedora Project</span>
+ </pre>
+ </li><li class="listitem">
+ <p>
+ <code class="literal">rlandmann: locale/pt.xml; locale/ca.xml; locale/da.xml; locale/sr.xml; locale/ru.xml; loca&#8943;</code>
+ </p>
+ <pre class="screen">
+ <span class="commit-message">Updated translations from Red Hat and the Fedora Project</span>
+ </pre>
+ </li></ul></div>
+ </div>
+
+ <div class="sect2" title="Common"><div class="titlepage"><div><div><h3 class="title"><a name="rnV1.76.0_Common"></a>Common</h3></div></div></div>
+
+ <p>The following changes have been made to the <code class="filename">common</code> code since the 1.75.2 release.</p>
+ <div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
+ <p>
+ <code class="literal">Mauritz Jeanson: common.xsl</code>
+ </p>
+ <pre class="screen">
+ <span class="commit-message">Fixed bug in output-orderedlist-starting-number template (@startingnumber did not work for FO).</span>
+ </pre>
+ </li><li class="listitem">
+ <p>
+ <code class="literal">Mauritz Jeanson: gentext.xsl</code>
+ </p>
+ <pre class="screen">
+ <span class="commit-message">Added fix to catch ID also of descendants of <a href="http://docbook.org/tdg5/en/html/listitem.html"><code class="sgmltag-element">listitem</code></a>. Closes bug #2955077.</span>
+ </pre>
+ </li><li class="listitem">
+ <p>
+ <code class="literal">Jirka Kosek: l10n.xsl</code>
+ </p>
+ <pre class="screen">
+ <span class="commit-message">Stripped down, faster version of gentext.template is used when there is no localization customization.</span>
+ </pre>
+ </li><li class="listitem">
+ <p>
+ <code class="literal">Mauritz Jeanson: stripns.xsl</code>
+ </p>
+ <pre class="screen">
+ <span class="commit-message">Added fix that preserves <a href="http://docbook.org/tdg5/en/html/link.html"><code class="sgmltag-element">link</code></a>/@role (makes links in the <a href="http://docbook.org/tdg5/en/html/reference.html"><code class="sgmltag-element">reference</code></a> documentation
+with @role="tcg" work).</span>
+ </pre>
+ </li><li class="listitem">
+ <p>
+ <code class="literal">Mauritz Jeanson: l10n.xsl</code>
+ </p>
+ <pre class="screen">
+ <span class="commit-message">Fixed bugs related to manpages and L10n.</span>
+ </pre>
+ </li><li class="listitem">
+ <p>
+ <code class="literal">Jirka Kosek: entities.ent; autoidx-kosek.xsl</code>
+ </p>
+ <pre class="screen">
+ <span class="commit-message">Upgraded to use common entities. Fixed bug when some code used @sortas and some not for grouping/sorting of indexterms.</span>
+ </pre>
+ </li><li class="listitem">
+ <p>
+ <code class="literal">Jirka Kosek: l10n.xsl; l10n.dtd; l10n.xml; autoidx-kosek.xsl</code>
+ </p>
+ <pre class="screen">
+ <span class="commit-message">Refactored localization support. Language files are loaded on demand. Speedup is about 30%.</span>
+ </pre>
+ </li><li class="listitem">
+ <p>
+ <code class="literal">Jirka Kosek: l10n.xsl</code>
+ </p>
+ <pre class="screen">
+ <span class="commit-message">Added xsl:keys for improved performance of localization texts look up. Performance gain around 15%.</span>
+ </pre>
+ </li><li class="listitem">
+ <p>
+ <code class="literal">Mauritz Jeanson: titles.xsl</code>
+ </p>
+ <pre class="screen">
+ <span class="commit-message">Fixed bug #2912677 (error with <a href="http://docbook.org/tdg5/en/html/xref.html"><code class="sgmltag-element">xref</code></a> in <a href="http://docbook.org/tdg5/en/html/title.html"><code class="sgmltag-element">title</code></a>).</span>
+ </pre>
+ </li><li class="listitem">
+ <p>
+ <code class="literal">Robert Stayton: olink.xsl</code>
+ </p>
+ <pre class="screen">
+ <span class="commit-message">Fix bug in xrefstyle "<a href="http://docbook.org/tdg5/en/html/title.html"><code class="sgmltag-element">title</code></a>" handling introduced with
+the 'insert.targetdb.data' template.</span>
+ </pre>
+ </li><li class="listitem">
+ <p>
+ <code class="literal">Robert Stayton: gentext.xsl</code>
+ </p>
+ <pre class="screen">
+ <span class="commit-message">Fix bug in <a href="http://docbook.org/tdg5/en/html/xref.html"><code class="sgmltag-element">xref</code></a> to <a href="http://docbook.org/tdg5/en/html/equation.html"><code class="sgmltag-element">equation</code></a> without <a href="http://docbook.org/tdg5/en/html/title.html"><code class="sgmltag-element">title</code></a> to use context="xref-number" instead
+of "xref-number-and-title".</span>
+ </pre>
+ </li><li class="listitem">
+ <p>
+ <code class="literal">Robert Stayton: labels.xsl</code>
+ </p>
+ <pre class="screen">
+ <span class="commit-message">Number all equations in one sequence, with or without <a href="http://docbook.org/tdg5/en/html/title.html"><code class="sgmltag-element">title</code></a>.</span>
+ </pre>
+ </li><li class="listitem">
+ <p>
+ <code class="literal">Robert Stayton: entities.ent</code>
+ </p>
+ <pre class="screen">
+ <span class="commit-message">Fix bug #2896909 where duplicate @sortas on indexterms caused
+some indexterms to drop out of <a href="http://docbook.org/tdg5/en/html/index.html"><code class="sgmltag-element">index</code></a>.</span>
+ </pre>
+ </li><li class="listitem">
+ <p>
+ <code class="literal">Robert Stayton: stripns.xsl</code>
+ </p>
+ <pre class="screen">
+ <span class="commit-message">Expand the "Stripping namespace ..." message to advise users to
+use the namespaced stylesheets.</span>
+ </pre>
+ </li><li class="listitem">
+ <p>
+ <code class="literal">Robert Stayton: stripns.xsl</code>
+ </p>
+ <pre class="screen">
+ <span class="commit-message">need a local version of $exsl.node.set.available variable because
+this module imported many places.</span>
+ </pre>
+ </li><li class="listitem">
+ <p>
+ <code class="literal">Mauritz Jeanson: olink.xsl</code>
+ </p>
+ <pre class="screen">
+ <span class="commit-message">Added /node() to the select expression that is used to compute the <a href="http://docbook.org/tdg5/en/html/title.html"><code class="sgmltag-element">title</code></a> text
+so that no &lt;ttl&gt; elements end up in the output. Closes bug #2830119.</span>
+ </pre>
+ </li></ul></div>
+ </div>
+
+ <div class="sect2" title="FO"><div class="titlepage"><div><div><h3 class="title"><a name="rnV1.76.0_FO"></a>FO</h3></div></div></div>
+
+ <p>The following changes have been made to the
+ <code class="filename">fo</code> code
+ since the 1.75.2 release.</p>
+ <div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
+ <p>
+ <code class="literal">Robert Stayton: table.xsl</code>
+ </p>
+ <pre class="screen">
+ <span class="commit-message">Fix bug 2979166 able - Attribute @rowheader not working</span>
+ </pre>
+ </li><li class="listitem">
+ <p>
+ <code class="literal">Mauritz Jeanson: inline.xsl</code>
+ </p>
+ <pre class="screen">
+ <span class="commit-message">Improved <a href="http://docbook.org/tdg5/en/html/glossterm.html"><code class="sgmltag-element">glossterm</code></a> auto-linking by using keys. The old code was inefficient when processing documents
+with many inline glossterms.</span>
+ </pre>
+ </li><li class="listitem">
+ <p>
+ <code class="literal">Robert Stayton: titlepage.xsl</code>
+ </p>
+ <pre class="screen">
+ <span class="commit-message">Fix bug 2805530 <a href="http://docbook.org/tdg5/en/html/author.html"><code class="sgmltag-element">author</code></a>/<a href="http://docbook.org/tdg5/en/html/orgname.html"><code class="sgmltag-element">orgname</code></a> not appearing on <a href="http://docbook.org/tdg5/en/html/title.html"><code class="sgmltag-element">title</code></a> page.</span>
+ </pre>
+ </li><li class="listitem">
+ <p>
+ <code class="literal">Mauritz Jeanson: graphics.xsl</code>
+ </p>
+ <pre class="screen">
+ <span class="commit-message">Added support for SVG content in <a href="http://docbook.org/tdg5/en/html/imagedata.html"><code class="sgmltag-element">imagedata</code></a> (inspired by patch #2909154).</span>
+ </pre>
+ </li><li class="listitem">
+ <p>
+ <code class="literal">Mauritz Jeanson: table.xsl</code>
+ </p>
+ <pre class="screen">
+ <span class="commit-message">Removed superfluous test used when computing column-width. Closes bug #3000898.</span>
+ </pre>
+ </li><li class="listitem">
+ <p>
+ <code class="literal">Mauritz Jeanson: inline.xsl</code>
+ </p>
+ <pre class="screen">
+ <span class="commit-message">Added missing &lt;xsl:call-template name="<a href="http://docbook.org/tdg5/en/html/anchor.html"><code class="sgmltag-element">anchor</code></a>"/&gt;. Closes bug #2998567.</span>
+ </pre>
+ </li><li class="listitem">
+ <p>
+ <code class="literal">Mauritz Jeanson: lists.xsl</code>
+ </p>
+ <pre class="screen">
+ <span class="commit-message">Added table-layout="fixed" on <a href="http://docbook.org/tdg5/en/html/segmentedlist.html"><code class="sgmltag-element">segmentedlist</code></a> <a href="http://docbook.org/tdg5/en/html/table.html"><code class="sgmltag-element">table</code></a> (required by XSL spec when proportional-column-width() is used).</span>
+ </pre>
+ </li><li class="listitem">
+ <p>
+ <code class="literal">Jirka Kosek: autoidx-kosek.xsl</code>
+ </p>
+ <pre class="screen">
+ <span class="commit-message">Upgraded to use common entities. Fixed bug when some code used @sortas and some not for grouping/sorting of indexterms.</span>
+ </pre>
+ </li><li class="listitem">
+ <p>
+ <code class="literal">Jirka Kosek: index.xsl</code>
+ </p>
+ <pre class="screen">
+ <span class="commit-message">Upgraded to use common entities. Fixed bug when some code used @sortas and some not for grouping/sorting of indexterms.</span>
+ </pre>
+ </li><li class="listitem">
+ <p>
+ <code class="literal">Robert Stayton: xref.xsl</code>
+ </p>
+ <pre class="screen">
+ <span class="commit-message">Fix bug in <a href="http://docbook.org/tdg5/en/html/olink.html"><code class="sgmltag-element">olink</code></a> template when an <a href="http://docbook.org/tdg5/en/html/olink.html"><code class="sgmltag-element">olink</code></a> has an id.
+Add warning message with id value when trying to <a href="http://docbook.org/tdg5/en/html/link.html"><code class="sgmltag-element">link</code></a>
+to an element that has no generated text.</span>
+ </pre>
+ </li><li class="listitem">
+ <p>
+ <code class="literal">Mauritz Jeanson: refentry.xsl</code>
+ </p>
+ <pre class="screen">
+ <span class="commit-message">Fixed bug #2930968 (<a href="http://docbook.org/tdg5/en/html/indexterm.html"><code class="sgmltag-element">indexterm</code></a> in <a href="http://docbook.org/tdg5/en/html/refmeta.html"><code class="sgmltag-element">refmeta</code></a> not handled correctly).</span>
+ </pre>
+ </li><li class="listitem">
+ <p>
+ <code class="literal">Robert Stayton: block.xsl</code>
+ </p>
+ <pre class="screen">
+ <span class="commit-message">fix bug 2949567 <a href="http://docbook.org/tdg5/en/html/title.html"><code class="sgmltag-element">title</code></a> in <a href="http://docbook.org/tdg5/en/html/revhistory.html"><code class="sgmltag-element">revhistory</code></a> breaks FO transform.</span>
+ </pre>
+ </li><li class="listitem">
+ <p>
+ <code class="literal">Robert Stayton: glossary.xsl</code>
+ </p>
+ <pre class="screen">
+ <span class="commit-message">Output id attributes on <a href="http://docbook.org/tdg5/en/html/glossdiv.html"><code class="sgmltag-element">glossdiv</code></a> blocks so they can be added to
+xrefs or <a href="http://docbook.org/tdg5/en/html/toc.html"><code class="sgmltag-element">TOC</code></a>.</span>
+ </pre>
+ </li><li class="listitem">
+ <p>
+ <code class="literal">Jirka Kosek: xref.xsl</code>
+ </p>
+ <pre class="screen">
+ <span class="commit-message">Enabled hyphenation of URLs when ulink content is the same as <a href="http://docbook.org/tdg5/en/html/link.html"><code class="sgmltag-element">link</code></a> target</span>
+ </pre>
+ </li><li class="listitem">
+ <p>
+ <code class="literal">Robert Stayton: table.xsl</code>
+ </p>
+ <pre class="screen">
+ <span class="commit-message">Apply patch to turn off <a href="http://docbook.org/tdg5/en/html/row.html"><code class="sgmltag-element">row</code></a> recursion if no @morerows attributes present.
+This will enable very large tables without <a href="http://docbook.org/tdg5/en/html/row.html"><code class="sgmltag-element">row</code></a> spanning to
+process without running into recursion limits.</span>
+ </pre>
+ </li><li class="listitem">
+ <p>
+ <code class="literal">Robert Stayton: formal.xsl</code>
+ </p>
+ <pre class="screen">
+ <span class="commit-message">Format <a href="http://docbook.org/tdg5/en/html/equation.html"><code class="sgmltag-element">equation</code></a> without <a href="http://docbook.org/tdg5/en/html/title.html"><code class="sgmltag-element">title</code></a> using <a href="http://docbook.org/tdg5/en/html/table.html"><code class="sgmltag-element">table</code></a> layout with <a href="http://docbook.org/tdg5/en/html/equation.html"><code class="sgmltag-element">equation</code></a> number
+next to the <a href="http://docbook.org/tdg5/en/html/equation.html"><code class="sgmltag-element">equation</code></a>.</span>
+ </pre>
+ </li><li class="listitem">
+ <p>
+ <code class="literal">Robert Stayton: param.xweb; param.ent</code>
+ </p>
+ <pre class="screen">
+ <span class="commit-message">Add <a href="http://docbook.sourceforge.net/release/xsl/current/doc/fo/equation.number.properties.html"><em class="parameter"><code>equation.number.properties</code></em></a>.</span>
+ </pre>
+ </li></ul></div>
+ </div>
+
+ <div class="sect2" title="HTML"><div class="titlepage"><div><div><h3 class="title"><a name="rnV1.76.0_HTML"></a>HTML</h3></div></div></div>
+
+ <p>The following changes have been made to the
+ <code class="filename">html</code> code
+ since the 1.75.2 release.</p>
+ <div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
+ <p>
+ <code class="literal">Mauritz Jeanson: block.xsl</code>
+ </p>
+ <pre class="screen">
+ <span class="commit-message">Modified <a href="http://docbook.org/tdg5/en/html/acknowledgements.html"><code class="sgmltag-element">acknowledgements</code></a> template to avoid invalid output (&lt;p&gt; in &lt;p&gt;).</span>
+ </pre>
+ </li><li class="listitem">
+ <p>
+ <code class="literal">Mauritz Jeanson: titlepage.xsl</code>
+ </p>
+ <pre class="screen">
+ <span class="commit-message">Added default <a href="http://docbook.org/tdg5/en/html/sidebar.html"><code class="sgmltag-element">sidebar</code></a> attribute-sets.</span>
+ </pre>
+ </li><li class="listitem">
+ <p>
+ <code class="literal">Robert Stayton: table.xsl</code>
+ </p>
+ <pre class="screen">
+ <span class="commit-message">Fix bug 2979166 able - Attribute @rowheader not working</span>
+ </pre>
+ </li><li class="listitem">
+ <p>
+ <code class="literal">Robert Stayton: footnote.xsl</code>
+ </p>
+ <pre class="screen">
+ <span class="commit-message">Fix bug 3033191 footnotes in html tables.</span>
+ </pre>
+ </li><li class="listitem">
+ <p>
+ <code class="literal">Mauritz Jeanson: inline.xsl</code>
+ </p>
+ <pre class="screen">
+ <span class="commit-message">Improved <a href="http://docbook.org/tdg5/en/html/glossterm.html"><code class="sgmltag-element">glossterm</code></a> auto-linking by using keys. The old code was inefficient when processing documents
+with many inline glossterms.</span>
+ </pre>
+ </li><li class="listitem">
+ <p>
+ <code class="literal">Robert Stayton: docbook.css.xml; verbatim.xsl</code>
+ </p>
+ <pre class="screen">
+ <span class="commit-message">Fix bug 2844927 Validity error for <a href="http://docbook.org/tdg5/en/html/callout.html"><code class="sgmltag-element">callout</code></a> bugs.</span>
+ </pre>
+ </li><li class="listitem">
+ <p>
+ <code class="literal">Robert Stayton: formal.xsl</code>
+ </p>
+ <pre class="screen">
+ <span class="commit-message">Convert formal.object.heading to respect <a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/make.clean.html.html"><em class="parameter"><code>make.clean.html</code></em></a> param.</span>
+ </pre>
+ </li><li class="listitem">
+ <p>
+ <code class="literal">Robert Stayton: titlepage.templates.xml; block.xsl</code>
+ </p>
+ <pre class="screen">
+ <span class="commit-message">Fix bug 2840768 <a href="http://docbook.org/tdg5/en/html/sidebar.html"><code class="sgmltag-element">sidebar</code></a> without <a href="http://docbook.org/tdg5/en/html/title.html"><code class="sgmltag-element">title</code></a> inserts empty b <a href="http://docbook.org/tdg5/en/html/tag.html"><code class="sgmltag-element">tag</code></a>.</span>
+ </pre>
+ </li><li class="listitem">
+ <p>
+ <code class="literal">Mauritz Jeanson: docbook.xsl</code>
+ </p>
+ <pre class="screen">
+ <span class="commit-message">Moved the template that outputs &lt;base&gt; so that the base URI also applies to relative CSS paths that come later.
+See patch #2896121.</span>
+ </pre>
+ </li><li class="listitem">
+ <p>
+ <code class="literal">Jirka Kosek: autoidx-kosek.xsl</code>
+ </p>
+ <pre class="screen">
+ <span class="commit-message">Upgraded to use common entities. Fixed bug when some code used @sortas and some not for grouping/sorting of indexterms.</span>
+ </pre>
+ </li><li class="listitem">
+ <p>
+ <code class="literal">Robert Stayton: chunk-code.xsl</code>
+ </p>
+ <pre class="screen">
+ <span class="commit-message">fix bug 2948363 generated <a href="http://docbook.org/tdg5/en/html/filename.html"><code class="sgmltag-element">filename</code></a> for <a href="http://docbook.org/tdg5/en/html/refentry.html"><code class="sgmltag-element">refentry</code></a> not unique, when
+used in a set.</span>
+ </pre>
+ </li><li class="listitem">
+ <p>
+ <code class="literal">Robert Stayton: component.xsl</code>
+ </p>
+ <pre class="screen">
+ <span class="commit-message">Fix missing "<a href="http://docbook.org/tdg5/en/html/chapter.html"><code class="sgmltag-element">Chapter</code></a> n" <a href="http://docbook.org/tdg5/en/html/label.html"><code class="sgmltag-element">label</code></a> when use <a href="http://docbook.org/tdg5/en/html/chapter.html"><code class="sgmltag-element">chapter</code></a>/<a href="http://docbook.org/tdg5/en/html/info.html"><code class="sgmltag-element">info</code></a>/<a href="http://docbook.org/tdg5/en/html/title.html"><code class="sgmltag-element">title</code></a>.</span>
+ </pre>
+ </li><li class="listitem">
+ <p>
+ <code class="literal">Robert Stayton: table.xsl</code>
+ </p>
+ <pre class="screen">
+ <span class="commit-message"><a href="http://docbook.org/tdg5/en/html/row.html"><code class="sgmltag-element">Row</code></a> recursion turned off if no @morerows attributes in the <a href="http://docbook.org/tdg5/en/html/table.html"><code class="sgmltag-element">table</code></a>.
+This will prevent failure on long <a href="http://docbook.org/tdg5/en/html/table.html"><code class="sgmltag-element">table</code></a> (with no @morerows) due
+to excessive depth of recursion.</span>
+ </pre>
+ </li><li class="listitem">
+ <p>
+ <code class="literal">Robert Stayton: autotoc.xsl; docbook.css.xml</code>
+ </p>
+ <pre class="screen">
+ <span class="commit-message">Support <a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/make.clean.html.html"><em class="parameter"><code>make.clean.html</code></em></a> in autotoc.xsl.</span>
+ </pre>
+ </li><li class="listitem">
+ <p>
+ <code class="literal">Robert Stayton: docbook.css.xml; block.xsl</code>
+ </p>
+ <pre class="screen">
+ <span class="commit-message">Add support for <a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/make.clean.html.html"><em class="parameter"><code>make.clean.html</code></em></a> setting in block elements.</span>
+ </pre>
+ </li><li class="listitem">
+ <p>
+ <code class="literal">Robert Stayton: docbook.css.xml</code>
+ </p>
+ <pre class="screen">
+ <span class="commit-message">Stock CSS styles for DocBook HTML output when '<a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/make.clean.html.html"><em class="parameter"><code>make.clean.html</code></em></a>' is non-zero.</span>
+ </pre>
+ </li><li class="listitem">
+ <p>
+ <code class="literal">Robert Stayton: html.xsl</code>
+ </p>
+ <pre class="screen">
+ <span class="commit-message">Add templates for generating CSS files and links to them.</span>
+ </pre>
+ </li><li class="listitem">
+ <p>
+ <code class="literal">Robert Stayton: param.xweb</code>
+ </p>
+ <pre class="screen">
+ <span class="commit-message">Fix bugs in new entity references.</span>
+ </pre>
+ </li><li class="listitem">
+ <p>
+ <code class="literal">Robert Stayton: chunk-common.xsl</code>
+ </p>
+ <pre class="screen">
+ <span class="commit-message">List of Equations now includes on equations with titles.</span>
+ </pre>
+ </li><li class="listitem">
+ <p>
+ <code class="literal">Robert Stayton: table.xsl</code>
+ </p>
+ <pre class="screen">
+ <span class="commit-message">If a <a href="http://docbook.org/tdg5/en/html/colspec.html"><code class="sgmltag-element">colspec</code></a> has a colname attribute, add it to the HTML <a href="http://docbook.org/tdg5/en/html/col.html"><code class="sgmltag-element">col</code></a>
+element as a class attribute so it can be styled.</span>
+ </pre>
+ </li><li class="listitem">
+ <p>
+ <code class="literal">Robert Stayton: formal.xsl</code>
+ </p>
+ <pre class="screen">
+ <span class="commit-message">Fix bug 2825842 where <a href="http://docbook.org/tdg5/en/html/table.html"><code class="sgmltag-element">table</code></a> footnotes not appearing in HTML-coded <a href="http://docbook.org/tdg5/en/html/table.html"><code class="sgmltag-element">table</code></a>.</span>
+ </pre>
+ </li><li class="listitem">
+ <p>
+ <code class="literal">Robert Stayton: chunktoc.xsl</code>
+ </p>
+ <pre class="screen">
+ <span class="commit-message">Fix bug #2834826 where <a href="http://docbook.org/tdg5/en/html/appendix.html"><code class="sgmltag-element">appendix</code></a> inside part was not chunked as it should be.</span>
+ </pre>
+ </li><li class="listitem">
+ <p>
+ <code class="literal">Mauritz Jeanson: chunktoc.xsl</code>
+ </p>
+ <pre class="screen">
+ <span class="commit-message">Added missing namespace declarations. Closes bug #2890069.</span>
+ </pre>
+ </li><li class="listitem">
+ <p>
+ <code class="literal">Mauritz Jeanson: footnote.xsl</code>
+ </p>
+ <pre class="screen">
+ <span class="commit-message">Updated the template for <a href="http://docbook.org/tdg5/en/html/footnote.html"><code class="sgmltag-element">footnote</code></a> paras to use the 'paragraph' template. Closes bug #2803739.</span>
+ </pre>
+ </li><li class="listitem">
+ <p>
+ <code class="literal">Keith Fahlgren: inline.xsl; lists.xsl</code>
+ </p>
+ <pre class="screen">
+ <span class="commit-message">Remove &lt;b&gt; and &lt;i&gt; elements "discouraged in favor of style sheets" from
+XHTML, XHTML 1.1 (and therefore EPUB) outputs by changing html2xhtml.xsl.
+
+Fixes bug #2873153: No &lt;b&gt; and &lt;i&gt; tags in XHTML/EPUB
+
+Added regression to EPUB specs:</span>
+ </pre>
+ </li><li class="listitem">
+ <p>
+ <code class="literal">Mauritz Jeanson: inline.xsl</code>
+ </p>
+ <pre class="screen">
+ <span class="commit-message">Fixed bug #2844916 (don't output @target if <a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/ulink.target.html"><em class="parameter"><code>ulink.target</code></em></a> is empty).</span>
+ </pre>
+ </li><li class="listitem">
+ <p>
+ <code class="literal">Keith Fahlgren: autoidx.xsl</code>
+ </p>
+ <pre class="screen">
+ <span class="commit-message">Fix a bug when using <a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/index.on.type.html"><em class="parameter"><code>index.on.type</code></em></a>: an '<a href="http://docbook.org/tdg5/en/html/index.html"><code class="sgmltag-element">index</code></a> symbols' <a href="http://docbook.org/tdg5/en/html/section.html"><code class="sgmltag-element">section</code></a> was created
+even if that typed <a href="http://docbook.org/tdg5/en/html/index.html"><code class="sgmltag-element">index</code></a> didn't include any symbols (they were in the other types).</span>
+ </pre>
+ </li></ul></div>
+ </div>
+
+ <div class="sect2" title="Manpages"><div class="titlepage"><div><div><h3 class="title"><a name="rnV1.76.0_Manpages"></a>Manpages</h3></div></div></div>
+
+ <p>The following changes have been made to the
+ <code class="filename">manpages</code> code
+ since the 1.75.2 release.</p>
+ <div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
+ <p>
+ <code class="literal">Mauritz Jeanson: other.xsl</code>
+ </p>
+ <pre class="screen">
+ <span class="commit-message">Modified the write.stubs template so that the <a href="http://docbook.org/tdg5/en/html/section.html"><code class="sgmltag-element">section</code></a> directory name is not output twice. Should fix bug #2831602.
+Also ensured that $lang is added to the .so path (when <a href="http://docbook.sourceforge.net/release/xsl/current/doc/manpages/man.output.lang.in.name.enabled.html"><em class="parameter"><code>man.output.lang.in.name.enabled</code></em></a>=1).</span>
+ </pre>
+ </li><li class="listitem">
+ <p>
+ <code class="literal">Mauritz Jeanson: docbook.xsl; other.xsl</code>
+ </p>
+ <pre class="screen">
+ <span class="commit-message">Fixed bug #2412738 (apostrophe escaping) by applying the submitted patch.</span>
+ </pre>
+ </li><li class="listitem">
+ <p>
+ <code class="literal">Norman Walsh: block.xsl; endnotes.xsl</code>
+ </p>
+ <pre class="screen">
+ <span class="commit-message">Fix bug where <a href="http://docbook.org/tdg5/en/html/simpara.html"><code class="sgmltag-element">simpara</code></a> in <a href="http://docbook.org/tdg5/en/html/footnote.html"><code class="sgmltag-element">footnote</code></a> didn't work. Patch by Jonathan Nieder, jrnieder@gmail.com</span>
+ </pre>
+ </li><li class="listitem">
+ <p>
+ <code class="literal">dleidert: lists.xsl</code>
+ </p>
+ <pre class="screen">
+ <span class="commit-message">Fix two indentation issues: In the first case there is no corresponding .RS
+macro (Debian #519438, sf.net 2793873). In the second case an .RS instead of
+the probably intended .sp leads to an indentation bug (Debian #527309,
+sf.net #2642139).</span>
+ </pre>
+ </li></ul></div>
+ </div>
+
+ <div class="sect2" title="Epub"><div class="titlepage"><div><div><h3 class="title"><a name="rnV1.76.0_Epub"></a>Epub</h3></div></div></div>
+
+ <p>The following changes have been made to the
+ <code class="filename">epub</code> code
+ since the 1.75.2 release.</p>
+ <div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
+ <p>
+ <code class="literal">Keith Fahlgren: bin/spec/examples/AMasqueOfDays.epub; docbook.xsl; bin/spec/epub_spec.rb</code>
+ </p>
+ <pre class="screen">
+ <span class="commit-message">Resolve some actual regressions in <a href="http://docbook.org/tdg5/en/html/date.html"><code class="sgmltag-element">date</code></a> output spotted by more recent versions of epubcheck</span>
+ </pre>
+ </li><li class="listitem">
+ <p>
+ <code class="literal">Keith Fahlgren: docbook.xsl</code>
+ </p>
+ <pre class="screen">
+ <span class="commit-message">Updated <a href="http://docbook.org/tdg5/en/html/mediaobject.html"><code class="sgmltag-element">mediaobject</code></a> selection code that better uses roles (when available); based on contributons by Glenn McDonald</span>
+ </pre>
+ </li><li class="listitem">
+ <p>
+ <code class="literal">Keith Fahlgren: bin/spec/epub_regressions_spec.rb; docbook.xsl</code>
+ </p>
+ <pre class="screen">
+ <span class="commit-message">Ensure that NCX documents are always outputted with a default namespace
+to prevent problems with the kindlegen machinery</span>
+ </pre>
+ </li><li class="listitem">
+ <p>
+ <code class="literal">Keith Fahlgren: bin/spec/epub_regressions_spec.rb; bin/spec/files/partintro.xml; docbook.x&#8943;</code>
+ </p>
+ <pre class="screen">
+ <span class="commit-message">Adding support for partintros with sect2s, 3s, etc</span>
+ </pre>
+ </li><li class="listitem">
+ <p>
+ <code class="literal">Keith Fahlgren: docbook.xsl</code>
+ </p>
+ <pre class="screen">
+ <span class="commit-message">Adding param to workaround horrific ADE bug with the inability to process &lt;br&gt;</span>
+ </pre>
+ </li><li class="listitem">
+ <p>
+ <code class="literal">Keith Fahlgren: docbook.xsl</code>
+ </p>
+ <pre class="screen">
+ <span class="commit-message">Add support for <a href="http://docbook.org/tdg5/en/html/authorgroup.html"><code class="sgmltag-element">authorgroup</code></a>/<a href="http://docbook.org/tdg5/en/html/author.html"><code class="sgmltag-element">author</code></a> in OPF metadata (via Michael Wiedmann)</span>
+ </pre>
+ </li><li class="listitem">
+ <p>
+ <code class="literal">Keith Fahlgren: bin/spec/epub_regressions_spec.rb</code>
+ </p>
+ <pre class="screen">
+ <span class="commit-message">Remove &lt;b&gt; and &lt;i&gt; elements "discouraged in favor of style sheets" from
+XHTML, XHTML 1.1 (and therefore EPUB) outputs by changing html2xhtml.xsl.
+
+Fixes bug #2873153: No &lt;b&gt; and &lt;i&gt; tags in XHTML/EPUB
+
+Added regression to EPUB specs:</span>
+ </pre>
+ </li><li class="listitem">
+ <p>
+ <code class="literal">Keith Fahlgren: bin/lib/docbook.rb; bin/spec/files/DejaVuSerif-Italic.otf; docbook.xsl; bi&#8943;</code>
+ </p>
+ <pre class="screen">
+ <span class="commit-message">This resolves bug #2873142, Please add support for multiple embedded fonts
+
+
+If you navigate to a checkout of DocBook-XSL and go to:
+xsl/epub/bin/spec/files
+You can now run the following <a href="http://docbook.org/tdg5/en/html/command.html"><code class="sgmltag-element">command</code></a>:
+
+../../dbtoepub -f DejaVuSerif.otf -f DejaVuSerif-Italic.otf -c test.css
+-s test_cust.xsl orm.book.001.xml
+
+In dbtoepub, the following option can be used more than once:
+-f, --font [OTF FILE] Embed OTF FILE in .epub.
+
+The underlying stylesheet now accepts a comma-separated list of font file
+names rather than just one as the RENAMED epub.embedded.fonts ('s' added).
+
+The runnable EPUB spec now includes:
+- should be valid .epub after including more than one embedded font</span>
+ </pre>
+ </li><li class="listitem">
+ <p>
+ <code class="literal">Keith Fahlgren: docbook.xsl</code>
+ </p>
+ <pre class="screen">
+ <span class="commit-message">Improve the selection of <a href="http://docbook.org/tdg5/en/html/cover.html"><code class="sgmltag-element">cover</code></a> images when working in DocBook 4.x land (work in progress)</span>
+ </pre>
+ </li><li class="listitem">
+ <p>
+ <code class="literal">Keith Fahlgren: bin/spec/epub_regressions_spec.rb; docbook.xsl</code>
+ </p>
+ <pre class="screen">
+ <span class="commit-message">Improve the quality of the OPF spine regression by ensuring that the spine
+elements for deeply nested refentries are in order and adjacent to their
+opening wrapper XHTML chunk.</span>
+ </pre>
+ </li><li class="listitem">
+ <p>
+ <code class="literal">Keith Fahlgren: bin/spec/epub_regressions_spec.rb; docbook.xsl; bin/spec/files/orm.book.00&#8943;</code>
+ </p>
+ <pre class="screen">
+ <span class="commit-message">Add more careful handling of refentries to ensure that they always appear in the opf:spine.
+This was only a problem when refentries were pushed deep into the hierarchy (like inside
+a <a href="http://docbook.org/tdg5/en/html/sect2.html"><code class="sgmltag-element">sect2</code></a>), but presented navigational problems for many reading systems (despite the
+correct NCX references). This may *not* be the best solution, but attacking a better
+chunking strategy for refentries was too big a nut to crack at this time.</span>
+ </pre>
+ </li></ul></div>
+ </div>
+
+ <div class="sect2" title="Eclipse"><div class="titlepage"><div><div><h3 class="title"><a name="rnV1.76.0_Eclipse"></a>Eclipse</h3></div></div></div>
+
+ <p>The following changes have been made to the
+ <code class="filename">eclipse</code> code
+ since the 1.75.2 release.</p>
+ <div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
+ <p>
+ <code class="literal">Mauritz Jeanson: eclipse3.xsl</code>
+ </p>
+ <pre class="screen">
+ <span class="commit-message">Added a stylesheet module that generates plug-ins conforming to the standard (OSGi-based) Eclipse 3.x
+architecture. The main difference to the older format is that metadata is stored in a separate
+<a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/manifest.html"><em class="parameter"><code>manifest</code></em></a> file. The module imports and extends the existing eclipse.xsl module. Based on code
+contributed in patch #2624668.</span>
+ </pre>
+ </li></ul></div>
+ </div>
+
+ <div class="sect2" title="Params"><div class="titlepage"><div><div><h3 class="title"><a name="rnV1.76.0_Params"></a>Params</h3></div></div></div>
+
+ <p>The following changes have been made to the
+ <code class="filename">params</code> code
+ since the 1.75.2 release.</p>
+ <div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
+ <p>
+ <code class="literal">Robert Stayton: draft.watermark.image.xml</code>
+ </p>
+ <pre class="screen">
+ <span class="commit-message">Fix bug 2922488 <a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/draft.watermark.image.html"><em class="parameter"><code>draft.watermark.image</code></em></a> pointing to web resource.
+Now the value is images/draft.png, and may require customization
+for local resolution.</span>
+ </pre>
+ </li><li class="listitem">
+ <p>
+ <code class="literal">Mauritz Jeanson: equation.number.properties.xml</code>
+ </p>
+ <pre class="screen">
+ <span class="commit-message">Corrected <a href="http://docbook.org/tdg5/en/html/refpurpose.html"><code class="sgmltag-element">refpurpose</code></a>.</span>
+ </pre>
+ </li><li class="listitem">
+ <p>
+ <code class="literal">Norman Walsh: paper.type.xml</code>
+ </p>
+ <pre class="screen">
+ <span class="commit-message">Added USlegal and USlegallandscape paper types.</span>
+ </pre>
+ </li><li class="listitem">
+ <p>
+ <code class="literal">Jirka Kosek: highlight.xslthl.config.xml</code>
+ </p>
+ <pre class="screen">
+ <span class="commit-message">Added note about specifying location as URL</span>
+ </pre>
+ </li><li class="listitem">
+ <p>
+ <code class="literal">Robert Stayton: docbook.css.source.xml; generate.css.header.xml; custom.css.source.xml; ma&#8943;</code>
+ </p>
+ <pre class="screen">
+ <span class="commit-message">Params to support generated CSS files.</span>
+ </pre>
+ </li><li class="listitem">
+ <p>
+ <code class="literal">Robert Stayton: equation.number.properties.xml</code>
+ </p>
+ <pre class="screen">
+ <span class="commit-message">New attribute set for numbers appearing next to equations.</span>
+ </pre>
+ </li></ul></div>
+ </div>
+
+ <div class="sect2" title="XSL-Xalan"><div class="titlepage"><div><div><h3 class="title"><a name="rnV1.76.0_XSL-Xalan"></a>XSL-Xalan</h3></div></div></div>
+
+ <p>The following changes have been made to the
+ <code class="filename">xsl-xalan</code> code
+ since the 1.75.2 release.</p>
+ <div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
+ <p>
+ <code class="literal">dleidert: nbproject/genfiles.properties; nbproject/build-impl.xml</code>
+ </p>
+ <pre class="screen">
+ <span class="commit-message">Rebuild netbeans build files after adding missing Netbeans configuration to allow easier packaging for Debian.</span>
+ </pre>
+ </li></ul></div>
+ </div>
+
+ </div>
+<div class="sect1" title="Release Notes: 1.75.2"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="rn_V1.75.2"></a>Release Notes: 1.75.2</h2></div></div></div>
+
+<p>The following is a list of changes that have been made
+ since the 1.75.1 release.</p>
+
+<div class="sect2" title="Gentext"><div class="titlepage"><div><div><h3 class="title"><a name="rn_V1.75.2_Gentext"></a>Gentext</h3></div></div></div>
+
+<p>The following changes have been made to the
+ <code class="filename">gentext</code> code
+ since the 1.75.1 release.</p>
+<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
+<p><code class="literal">dleidert: locale/ja.xml</code></p><pre class="screen"><span class="commit-message">Improved Japanese translation for Note(s). Closes bug #2823965.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">dleidert: locale/pl.xml</code></p><pre class="screen"><span class="commit-message">Polish alphabet contains O with acute accent, not with grave accent. Closes bug #2823964.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Robert Stayton: locale/ja.xml</code></p><pre class="screen"><span class="commit-message">Fix translation of "<a href="http://docbook.org/tdg5/en/html/index.html"><code class="sgmltag-element">index</code></a>", per bug report 2796064.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Robert Stayton: locale/is.xml</code></p><pre class="screen"><span class="commit-message">New Icelandic locale file.</span></pre>
+</li></ul></div>
+</div>
+
+<div class="sect2" title="Common"><div class="titlepage"><div><div><h3 class="title"><a name="rn_V1.75.2_Common"></a>Common</h3></div></div></div>
+
+<p>The following changes have been made to the
+ <code class="filename">common</code> code
+ since the 1.75.1 release.</p>
+<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
+<p><code class="literal">Norman Walsh: stripns.xsl</code></p><pre class="screen"><span class="commit-message">Support more downconvert cases</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Robert Stayton: titles.xsl</code></p><pre class="screen"><span class="commit-message">Make sure <a href="http://docbook.org/tdg5/en/html/title.html"><code class="sgmltag-element">title</code></a> inside <a href="http://docbook.org/tdg5/en/html/info.html"><code class="sgmltag-element">info</code></a> is used if no other <a href="http://docbook.org/tdg5/en/html/title.html"><code class="sgmltag-element">title</code></a>.</span></pre>
+</li></ul></div>
+</div>
+
+<div class="sect2" title="FO"><div class="titlepage"><div><div><h3 class="title"><a name="rn_V1.75.2_FO"></a>FO</h3></div></div></div>
+
+<p>The following changes have been made to the
+ <code class="filename">fo</code> code
+ since the 1.75.1 release.</p>
+<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
+<p><code class="literal">Robert Stayton: pi.xsl</code></p><pre class="screen"><span class="commit-message">Turn off dbfo-need for <a href="http://docbook.sourceforge.net/release/xsl/current/doc/fo/fop1.extensions.html"><em class="parameter"><code>fop1.extensions</code></em></a> also, per bug #2816141.</span></pre>
+</li></ul></div>
+</div>
+
+<div class="sect2" title="HTML"><div class="titlepage"><div><div><h3 class="title"><a name="rn_V1.75.2_HTML"></a>HTML</h3></div></div></div>
+
+<p>The following changes have been made to the
+ <code class="filename">html</code> code
+ since the 1.75.1 release.</p>
+<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
+<p><code class="literal">Mauritz Jeanson: titlepage.xsl</code></p><pre class="screen"><span class="commit-message">Output "<a href="http://docbook.org/tdg5/en/html/copyright.html"><code class="sgmltag-element">Copyright</code></a>" heading in XHTML too.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Mauritz Jeanson: titlepage.xsl</code></p><pre class="screen"><span class="commit-message">Added stylesheet.result.type test for <a href="http://docbook.org/tdg5/en/html/copyright.html"><code class="sgmltag-element">copyright</code></a>. Closes bug #2813289.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Norman Walsh: htmltbl.xsl</code></p><pre class="screen"><span class="commit-message">Remove ambiguity wrt @span, @rowspan, and @colspan</span></pre>
+</li></ul></div>
+</div>
+
+<div class="sect2" title="Manpages"><div class="titlepage"><div><div><h3 class="title"><a name="rn_V1.75.2_Manpages"></a>Manpages</h3></div></div></div>
+
+<p>The following changes have been made to the
+ <code class="filename">manpages</code> code
+ since the 1.75.1 release.</p>
+<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
+<p><code class="literal">Mauritz Jeanson: endnotes.xsl</code></p><pre class="screen"><span class="commit-message">Added normalize-space() for ulink content. Closes bug #2793877.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Mauritz Jeanson: docbook.xsl</code></p><pre class="screen"><span class="commit-message">Added stylesheet.result.type test for <a href="http://docbook.org/tdg5/en/html/copyright.html"><code class="sgmltag-element">copyright</code></a>. Closes bug #2813289.</span></pre>
+</li></ul></div>
+</div>
+
+<div class="sect2" title="Epub"><div class="titlepage"><div><div><h3 class="title"><a name="rn_V1.75.2_Epub"></a>Epub</h3></div></div></div>
+
+<p>The following changes have been made to the
+ <code class="filename">epub</code> code
+ since the 1.75.1 release.</p>
+<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
+<p><code class="literal">Keith Fahlgren: bin/dbtoepub; bin/lib/docbook.rb</code></p><pre class="screen"><span class="commit-message">Corrected bugs caused by path and file assumptions were not met</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Keith Fahlgren: bin/lib/docbook.rb; docbook.xsl</code></p><pre class="screen"><span class="commit-message">Cleaning up hardcoded values into parameters and fixing Ruby library to pass them properly; all thanks to patch from Liza Daly</span></pre>
+</li></ul></div>
+</div>
+
+<div class="sect2" title="Profiling"><div class="titlepage"><div><div><h3 class="title"><a name="rn_V1.75.2_Profiling"></a>Profiling</h3></div></div></div>
+
+<p>The following changes have been made to the
+ <code class="filename">profiling</code> code
+ since the 1.75.1 release.</p>
+<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
+<p><code class="literal">Robert Stayton: profile.xsl</code></p><pre class="screen"><span class="commit-message">Fix bug 2815493 missing <a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/exsl.node.set.available.html"><em class="parameter"><code>exsl.node.set.available</code></em></a> parameter.</span></pre>
+</li></ul></div>
+</div>
+
+<div class="sect2" title="XSL-Saxon"><div class="titlepage"><div><div><h3 class="title"><a name="rn_V1.75.2_XSL-Saxon"></a>XSL-Saxon</h3></div></div></div>
+
+<p>The following changes have been made to the
+ <code class="filename">xsl-saxon</code> code
+ since the 1.75.1 release.</p>
+<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
+<p><code class="literal">Mauritz Jeanson: src/com/nwalsh/saxon/ColumnUpdateEmitter.java; src/com/nwalsh/saxon/Colum&#8943;</code></p><pre class="screen"><span class="commit-message">Added fixes so that colgroups in the XHTML namespace are processed properly.</span></pre>
+</li></ul></div>
+</div>
+
+<div class="sect2" title="XSL-Xalan"><div class="titlepage"><div><div><h3 class="title"><a name="rn_V1.75.2_XSL-Xalan"></a>XSL-Xalan</h3></div></div></div>
+
+<p>The following changes have been made to the
+ <code class="filename">xsl-xalan</code> code
+ since the 1.75.1 release.</p>
+<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
+<p><code class="literal">Mauritz Jeanson: nbproject/project.xml</code></p><pre class="screen"><span class="commit-message">Added missing NetBeans configuration.</span></pre>
+</li></ul></div>
+</div>
+
+</div>
+
+
+<div class="sect1" title="Release Notes: 1.75.1"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="rn_V1.75.1"></a>Release Notes: 1.75.1</h2></div></div></div>
+
+<p>This release includes bug fixes.</p>
+
+<p>The following is a list of changes that have been made since the 1.75.0 release.</p>
+
+
+<div class="sect2" title="FO"><div class="titlepage"><div><div><h3 class="title"><a name="rn_V1.75.1_FO"></a>FO</h3></div></div></div>
+
+<p>The following changes have been made to the <code class="filename">fo</code> code since the 1.75.0 release.</p>
+<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
+<p><code class="literal">Keith Fahlgren: block.xsl</code></p><pre class="screen"><span class="commit-message">Switching to em dash for character before <a href="http://docbook.org/tdg5/en/html/attribution.html"><code class="sgmltag-element">attribution</code></a> in <a href="http://docbook.org/tdg5/en/html/epigraph.html"><code class="sgmltag-element">epigraph</code></a>; resolves Bug #2793878</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Robert Stayton: lists.xsl</code></p><pre class="screen"><span class="commit-message">Fixed bug 2789947, id attribute missing on <a href="http://docbook.org/tdg5/en/html/simplelist.html"><code class="sgmltag-element">simplelist</code></a> fo output.</span></pre>
+</li></ul></div>
+</div>
+
+<div class="sect2" title="HTML"><div class="titlepage"><div><div><h3 class="title"><a name="rn_V1.75.1_HTML"></a>HTML</h3></div></div></div>
+
+<p>The following changes have been made to the
+ <code class="filename">html</code> code
+ since the 1.75.0 release.</p>
+<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
+<p><code class="literal">Keith Fahlgren: block.xsl</code></p><pre class="screen"><span class="commit-message">Switching to em dash for character before <a href="http://docbook.org/tdg5/en/html/attribution.html"><code class="sgmltag-element">attribution</code></a> in <a href="http://docbook.org/tdg5/en/html/epigraph.html"><code class="sgmltag-element">epigraph</code></a>; resolves Bug #2793878</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Robert Stayton: lists.xsl</code></p><pre class="screen"><span class="commit-message">Fixed bug 2789678: apply-templates line accidentally deleted.</span></pre>
+</li></ul></div>
+</div>
+
+<div class="sect2" title="Epub"><div class="titlepage"><div><div><h3 class="title"><a name="rn_V1.75.1_Epub"></a>Epub</h3></div></div></div>
+
+<p>The following changes have been made to the
+ <code class="filename">epub</code> code
+ since the 1.75.0 release.</p>
+<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
+<p><code class="literal">Keith Fahlgren: bin/spec/epub_regressions_spec.rb; docbook.xsl</code></p><pre class="screen"><span class="commit-message">Added regression and fix to correct "bug" with namespace-prefixed container elements in META-INF/container.xml ; resolves Issue #2790017</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Keith Fahlgren: bin/spec/epub_regressions_spec.rb; bin/spec/files/onegraphic.xinclude.xml;&#8943;</code></p><pre class="screen"><span class="commit-message">Another attempt at flexible named entity and XInclude processing</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Keith Fahlgren: bin/lib/docbook.rb</code></p><pre class="screen"><span class="commit-message">Tweaking solution to Bug #2750442 following regression reported by Michael Wiedmann.</span></pre>
+</li></ul></div>
+</div>
+
+<div class="sect2" title="Params"><div class="titlepage"><div><div><h3 class="title"><a name="rn_V1.75.1_Params"></a>Params</h3></div></div></div>
+
+<p>The following changes have been made to the
+ <code class="filename">params</code> code
+ since the 1.75.0 release.</p>
+<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
+<p><code class="literal">Mauritz Jeanson: highlight.source.xml</code></p><pre class="screen"><span class="commit-message">Updated documentation to reflect changes made in r8419.</span></pre>
+</li></ul></div>
+</div>
+
+</div>
+
+
+<div class="sect1" title="Release Notes: 1.75.0"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="V1.75.0"></a>Release Notes: 1.75.0</h2></div></div></div>
+
+<p>This release includes important bug fixes and adds the following
+significant feature changes:
+</p><div class="variablelist"><dl><dt><span class="term">Gentext</span></dt><dd><p>Modifications to translations have been made. </p></dd><dt><span class="term">Common</span></dt><dd>
+<p>Added support for some format properties on tables using
+HTML <a href="http://docbook.org/tdg5/en/html/table.html"><code class="sgmltag-element">table</code></a> markup. </p>
+<p>Added two new <a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/qanda.defaultlabel.html"><em class="parameter"><code>qanda.defaultlabel</code></em></a> values so that numbered sections
+and numbered questions can be distinguished. Satisfies
+Feature Request #1539045.</p>
+<p>Added code to handle <a href="http://docbook.org/tdg5/en/html/acknowledgements.html"><code class="sgmltag-element">acknowledgements</code></a> in <a href="http://docbook.org/tdg5/en/html/book.html"><code class="sgmltag-element">book</code></a> and part. The element is processed
+similarly to <a href="http://docbook.org/tdg5/en/html/dedication.html"><code class="sgmltag-element">dedication</code></a>. All <a href="http://docbook.org/tdg5/en/html/acknowledgements.html"><code class="sgmltag-element">acknowledgements</code></a> will appear as front matter, after
+any dedications.</p>
+</dd><dt><span class="term">FO</span></dt><dd>
+<p>The inclusion of highlighting code has been simplified.</p>
+<p>Add support for pgwide on informal objects.</p>
+<p>Added a new parameter, <a href="http://docbook.sourceforge.net/release/xsl/current/doc/fo/bookmarks.collapse.html"><em class="parameter"><code>bookmarks.collapse</code></em></a>, that controls the initial <a href="http://docbook.org/tdg5/en/html/state.html"><code class="sgmltag-element">state</code></a> of the bookmark tree. Closes FR #1792326.</p>
+<p>Add support for more dbfo processing instructions.</p>
+<p>Add new <a href="http://docbook.sourceforge.net/release/xsl/current/doc/fo/variablelist.term.properties.html"><em class="parameter"><code>variablelist.term.properties</code></em></a> to format terms, per request # 1968513.</p>
+<p>Add support for @width on <a href="http://docbook.org/tdg5/en/html/screen.html"><code class="sgmltag-element">screen</code></a> and <a href="http://docbook.org/tdg5/en/html/programlisting.html"><code class="sgmltag-element">programlisting</code></a>, fixes bug #2012736.</p>
+<p>Add support for writing-mode="rl-tb" (right-to-left) in FO outputs. </p>
+<p>Add <a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/writing.mode.html"><em class="parameter"><code>writing.mode</code></em></a> param for FO output.</p>
+</dd><dt><span class="term">HTML</span></dt><dd>
+<p>Convert all calls to class.attribute to calls to common.html.attributes to support dir, lang, and <a href="http://docbook.org/tdg5/en/html/title.html"><code class="sgmltag-element">title</code></a> attributes in html output for all elements. Fulfills feature request #1993833.</p>
+<p>Inclusion of highlighting code was simplified. Only one import is now necessary.</p>
+<p>Add new param <a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/index.links.to.section.html"><em class="parameter"><code>index.links.to.section</code></em></a>.</p>
+<p>Add support for the new <a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/index.links.to.section.html"><em class="parameter"><code>index.links.to.section</code></em></a> param which permits precise links to indexterms in HTML output rather than to the <a href="http://docbook.org/tdg5/en/html/section.html"><code class="sgmltag-element">section</code></a> <a href="http://docbook.org/tdg5/en/html/title.html"><code class="sgmltag-element">title</code></a>.</p>
+</dd><dt><span class="term">ePub</span></dt><dd>
+<p>Slightly more nuanced handling of <a href="http://docbook.org/tdg5/en/html/imageobject.html"><code class="sgmltag-element">imageobject</code></a> alternatives and better support in dbtoepub for XIncludes and ENTITYs to resolve Issue #2750442 reported by Raphael Hertzog.</p>
+<p>Added a colon after an <a href="http://docbook.org/tdg5/en/html/abstract.html"><code class="sgmltag-element">abstract</code></a>/<a href="http://docbook.org/tdg5/en/html/title.html"><code class="sgmltag-element">title</code></a> when mapping into the dc:description for OPF metadata in ePub output to help the flat text have more pseudo-semantics (sugestions from Michael Wiedmann)</p>
+<p>Added DocBook <a href="http://docbook.org/tdg5/en/html/subjectset.html"><code class="sgmltag-element">subjectset</code></a> -&gt; OPF dc:<a href="http://docbook.org/tdg5/en/html/subject.html"><code class="sgmltag-element">subject</code></a> mapping and tests</p>
+<p>Added DocBook <a href="http://docbook.org/tdg5/en/html/date.html"><code class="sgmltag-element">date</code></a> -&gt; OPF dc:date mapping and tests</p>
+<p>Added DocBook <a href="http://docbook.org/tdg5/en/html/abstract.html"><code class="sgmltag-element">abstract</code></a> -&gt; OPF dc:description mapping and tests</p>
+<p>Added --output option to dbtoepub based on user request</p>
+</dd><dt><span class="term">HTMLHelp</span></dt><dd>
+<p>Add support for generating <a href="http://docbook.org/tdg5/en/html/olink.html"><code class="sgmltag-element">olink</code></a> target <a href="http://docbook.org/tdg5/en/html/database.html"><code class="sgmltag-element">database</code></a> for htmlhelp files.</p></dd><dt><span class="term">Params</span></dt><dd>
+<p>Add default setting for @rules attribute on HTML markup tables.</p>
+<p>Added a new parameter, <a href="http://docbook.sourceforge.net/release/xsl/current/doc/fo/bookmarks.collapse.html"><em class="parameter"><code>bookmarks.collapse</code></em></a>, that controls the initial <a href="http://docbook.org/tdg5/en/html/state.html"><code class="sgmltag-element">state</code></a> of the bookmark tree. When the parameter has a non-zero value (the default), only the top-level bookmarks are displayed initially. Otherwise, the whole tree of bookmarks is displayed. This is implemented for FOP 0.9X. Closes FR #1792326.</p>
+<p>Add new <a href="http://docbook.sourceforge.net/release/xsl/current/doc/fo/variablelist.term.properties.html"><em class="parameter"><code>variablelist.term.properties</code></em></a> to format terms, per request # 1968513.</p>
+<p>Add two new <a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/qanda.defaultlabel.html"><em class="parameter"><code>qanda.defaultlabel</code></em></a> values so that numbered sections and numbered questions can be distinguished. Satisfies Feature Request #1539045.</p>
+<p>Add param to control whether an <a href="http://docbook.org/tdg5/en/html/index.html"><code class="sgmltag-element">index</code></a> <a href="http://docbook.org/tdg5/en/html/entry.html"><code class="sgmltag-element">entry</code></a> links to a <a href="http://docbook.org/tdg5/en/html/section.html"><code class="sgmltag-element">section</code></a> <a href="http://docbook.org/tdg5/en/html/title.html"><code class="sgmltag-element">title</code></a> or to the precise location of the <a href="http://docbook.org/tdg5/en/html/indexterm.html"><code class="sgmltag-element">indexterm</code></a>.</p>
+<p>New attribute list for <a href="http://docbook.org/tdg5/en/html/glossentry.html"><code class="sgmltag-element">glossentry</code></a> in <a href="http://docbook.org/tdg5/en/html/glossary.html"><code class="sgmltag-element">glossary</code></a>.</p>
+<p>New parameter to support @width on <a href="http://docbook.org/tdg5/en/html/programlisting.html"><code class="sgmltag-element">programlisting</code></a> and <a href="http://docbook.org/tdg5/en/html/screen.html"><code class="sgmltag-element">screen</code></a>.</p>
+<p>Add attribute-sets for formatting <a href="http://docbook.org/tdg5/en/html/glossary.html"><code class="sgmltag-element">glossary</code></a> terms and defs.</p>
+</dd><dt><span class="term">Highlighting</span></dt><dd>
+<p>Inclusion of highlighting code was simplified. Only one import is now necessary.</p>
+</dd></dl></div><p>
+
+
+</p>
+<p>The following is a list of changes that have been made
+ since the 1.74.3 release.</p>
+
+<div class="sect2" title="Gentext"><div class="titlepage"><div><div><h3 class="title"><a name="rn_V1.75.0_Gentext"></a>Gentext</h3></div></div></div>
+
+<p>The following changes have been made to the
+ <code class="filename">gentext</code> code
+ since the 1.74.3 release.</p>
+<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
+<p><code class="literal">Robert Stayton: locale/sv.xml; locale/ja.xml; locale/pl.xml</code></p><pre class="screen"><span class="commit-message">Check in translations of <a href="http://docbook.org/tdg5/en/html/legalnotice.html"><code class="sgmltag-element">Legalnotice</code></a> submitted on mailing list.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Robert Stayton: locale/es.xml</code></p><pre class="screen"><span class="commit-message">Fix spelling errors in <a href="http://docbook.org/tdg5/en/html/acknowledgements.html"><code class="sgmltag-element">Acknowledgements</code></a> entries.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Robert Stayton: locale/es.xml</code></p><pre class="screen"><span class="commit-message">Check in translations for 4 elements submitted through docbook-apps
+message of 14 April 2009.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">David Cramer: locale/zh.xml; locale/ca.xml; locale/ru.xml; locale/ga.xml; locale/gl.xml; l&#8943;</code></p><pre class="screen"><span class="commit-message">Internationalized punctuation in <a href="http://docbook.org/tdg5/en/html/glosssee.html"><code class="sgmltag-element">glosssee</code></a> and <a href="http://docbook.org/tdg5/en/html/glossseealso.html"><code class="sgmltag-element">glossseealso</code></a></span></pre>
+</li><li class="listitem">
+<p><code class="literal">Robert Stayton: Makefile</code></p><pre class="screen"><span class="commit-message">Check in fixes for DSSSL gentext targets from submitted patch #1689633.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Robert Stayton: locale/uk.xml</code></p><pre class="screen"><span class="commit-message">Check in major update submitted with bug report #2008524.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Robert Stayton: locale/zh_tw.xml</code></p><pre class="screen"><span class="commit-message">Check in fix to Note string submitted in bug #2441051.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Robert Stayton: locale/ru.xml</code></p><pre class="screen"><span class="commit-message">Checkin typo fix submitted in bug #2453406.</span></pre>
+</li></ul></div>
+</div>
+
+<div class="sect2" title="Common"><div class="titlepage"><div><div><h3 class="title"><a name="rn_V1.75.0_Common"></a>Common</h3></div></div></div>
+
+<p>The following changes have been made to the
+ <code class="filename">common</code> code
+ since the 1.74.3 release.</p>
+<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
+<p><code class="literal">Robert Stayton: gentext.xsl</code></p><pre class="screen"><span class="commit-message">Fix extra generated space when xrefstyle includes 'nopage'.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Robert Stayton: table.xsl</code></p><pre class="screen"><span class="commit-message">Add support for some format properties on tables using
+HTML <a href="http://docbook.org/tdg5/en/html/table.html"><code class="sgmltag-element">table</code></a> markup. These include:
+ - frame attribute on <a href="http://docbook.org/tdg5/en/html/table.html"><code class="sgmltag-element">table</code></a> (or uses $default.table.frame parameter).
+ - rules attribute on <a href="http://docbook.org/tdg5/en/html/table.html"><code class="sgmltag-element">table</code></a> (or uses $default.table.rules parameter).
+ - align attribute on <a href="http://docbook.org/tdg5/en/html/td.html"><code class="sgmltag-element">td</code></a> and <a href="http://docbook.org/tdg5/en/html/th.html"><code class="sgmltag-element">th</code></a>
+ - valign attribute on <a href="http://docbook.org/tdg5/en/html/td.html"><code class="sgmltag-element">td</code></a> and <a href="http://docbook.org/tdg5/en/html/th.html"><code class="sgmltag-element">th</code></a>
+ - colspan on <a href="http://docbook.org/tdg5/en/html/td.html"><code class="sgmltag-element">td</code></a> and <a href="http://docbook.org/tdg5/en/html/th.html"><code class="sgmltag-element">th</code></a>
+ - rowspan on <a href="http://docbook.org/tdg5/en/html/td.html"><code class="sgmltag-element">td</code></a> and <a href="http://docbook.org/tdg5/en/html/th.html"><code class="sgmltag-element">th</code></a>
+ - bgcolor on <a href="http://docbook.org/tdg5/en/html/td.html"><code class="sgmltag-element">td</code></a> and <a href="http://docbook.org/tdg5/en/html/th.html"><code class="sgmltag-element">th</code></a></span></pre>
+</li><li class="listitem">
+<p><code class="literal">Robert Stayton: olink.xsl</code></p><pre class="screen"><span class="commit-message">Add placeholder template to massage <a href="http://docbook.org/tdg5/en/html/olink.html"><code class="sgmltag-element">olink</code></a> hot text to make
+customization easier, per Feature Request 1828608.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Robert Stayton: targets.xsl</code></p><pre class="screen"><span class="commit-message">Add support for collecting <a href="http://docbook.org/tdg5/en/html/olink.html"><code class="sgmltag-element">olink</code></a> targets from a <a href="http://docbook.org/tdg5/en/html/glossary.html"><code class="sgmltag-element">glossary</code></a>
+generated from a <a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/glossary.collection.html"><em class="parameter"><code>glossary.collection</code></em></a>.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Robert Stayton: titles.xsl</code></p><pre class="screen"><span class="commit-message">Handle <a href="http://docbook.org/tdg5/en/html/firstterm.html"><code class="sgmltag-element">firstterm</code></a> like <a href="http://docbook.org/tdg5/en/html/glossterm.html"><code class="sgmltag-element">glossterm</code></a> in mode="title.markup".</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Robert Stayton: titles.xsl</code></p><pre class="screen"><span class="commit-message">Add match on <a href="http://docbook.org/tdg5/en/html/info.html"><code class="sgmltag-element">info</code></a>/<a href="http://docbook.org/tdg5/en/html/title.html"><code class="sgmltag-element">title</code></a> in title.markup templates where missing.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Mauritz Jeanson: titles.xsl</code></p><pre class="screen"><span class="commit-message">Changed "ancestor::<a href="http://docbook.org/tdg5/en/html/title.html"><code class="sgmltag-element">title</code></a>" to "(ancestor::<a href="http://docbook.org/tdg5/en/html/title.html"><code class="sgmltag-element">title</code></a> and (@id or @xml:id))".
+This enables proper formatting of inline elements in titles in TOCs,
+as long as these inlines don't have id or xml:id attributes.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Robert Stayton: labels.xsl</code></p><pre class="screen"><span class="commit-message">Add two new <a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/qanda.defaultlabel.html"><em class="parameter"><code>qanda.defaultlabel</code></em></a> values so that numbered sections
+and numbered questions can be distinguished. Satisfies
+Feature Request #1539045.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Robert Stayton: stripns.xsl; pi.xsl</code></p><pre class="screen"><span class="commit-message">Convert function-available(exsl:node-set) to use the new param
+so Xalan bug is isolated.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Mauritz Jeanson: titles.xsl</code></p><pre class="screen"><span class="commit-message">Added fixes for bugs #2112656 and #1759205:
+1. Reverted mistaken commits r7485 and r7523.
+2. Updated the template with match="<a href="http://docbook.org/tdg5/en/html/link.html"><code class="sgmltag-element">link</code></a>" and mode="no.anchor.mode" so that
+@endterm is used if it exists and if the <a href="http://docbook.org/tdg5/en/html/link.html"><code class="sgmltag-element">link</code></a> has no content.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Mauritz Jeanson: titles.xsl</code></p><pre class="screen"><span class="commit-message">Added code to handle <a href="http://docbook.org/tdg5/en/html/acknowledgements.html"><code class="sgmltag-element">acknowledgements</code></a> in <a href="http://docbook.org/tdg5/en/html/book.html"><code class="sgmltag-element">book</code></a> and part. The element is processed
+similarly to <a href="http://docbook.org/tdg5/en/html/dedication.html"><code class="sgmltag-element">dedication</code></a>. All <a href="http://docbook.org/tdg5/en/html/acknowledgements.html"><code class="sgmltag-element">acknowledgements</code></a> will appear as front matter, after
+any dedications.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Robert Stayton: olink.xsl</code></p><pre class="screen"><span class="commit-message">Fix bug #2018717 <a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/use.local.olink.style.html"><em class="parameter"><code>use.local.olink.style</code></em></a> uses wrong gentext context.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Robert Stayton: olink.xsl</code></p><pre class="screen"><span class="commit-message">Fix bug #1787167 incorrect hot text for some olinks.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Robert Stayton: common.xsl</code></p><pre class="screen"><span class="commit-message">Fix bug #1669654 Broken output if <a href="http://docbook.org/tdg5/en/html/copyright.html"><code class="sgmltag-element">copyright</code></a> &lt;<a href="http://docbook.org/tdg5/en/html/year.html"><code class="sgmltag-element">year</code></a>&gt; contains a range.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Robert Stayton: labels.xsl</code></p><pre class="screen"><span class="commit-message">Fix bug in labelling <a href="http://docbook.org/tdg5/en/html/figure.html"><code class="sgmltag-element">figure</code></a> inside <a href="http://docbook.org/tdg5/en/html/appendix.html"><code class="sgmltag-element">appendix</code></a> inside <a href="http://docbook.org/tdg5/en/html/article.html"><code class="sgmltag-element">article</code></a> inside <a href="http://docbook.org/tdg5/en/html/book.html"><code class="sgmltag-element">book</code></a>.</span></pre>
+</li></ul></div>
+</div>
+
+<div class="sect2" title="FO"><div class="titlepage"><div><div><h3 class="title"><a name="rn_V1.75.0_FO"></a>FO</h3></div></div></div>
+
+<p>The following changes have been made to the
+ <code class="filename">fo</code> code
+ since the 1.74.3 release.</p>
+<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
+<p><code class="literal">Jirka Kosek: highlight.xsl</code></p><pre class="screen"><span class="commit-message">Inclusion of highlighting code was simplified. Only one import is now necessary.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Robert Stayton: fop1.xsl</code></p><pre class="screen"><span class="commit-message">Add the new fop extensions namespace declaration, in case FOP
+extension functions are used.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Robert Stayton: formal.xsl</code></p><pre class="screen"><span class="commit-message">Add support for pgwide on informal objects.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Robert Stayton: docbook.xsl</code></p><pre class="screen"><span class="commit-message">Fixed spurious closing <a href="http://docbook.org/tdg5/en/html/quote.html"><code class="sgmltag-element">quote</code></a> on line 134.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Robert Stayton: docbook.xsl; autoidx-kosek.xsl; autoidx.xsl</code></p><pre class="screen"><span class="commit-message">Convert function-available for node-set() to use
+new $exsl.node.set.available param in test.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">David Cramer: xref.xsl</code></p><pre class="screen"><span class="commit-message">Suppress extra space after <a href="http://docbook.org/tdg5/en/html/xref.html"><code class="sgmltag-element">xref</code></a> when xrefstyle='select: <a href="http://docbook.org/tdg5/en/html/label.html"><code class="sgmltag-element">label</code></a> nopage' (#2740472)</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Mauritz Jeanson: pi.xsl</code></p><pre class="screen"><span class="commit-message">Fixed doc bug for row-height.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">David Cramer: glossary.xsl</code></p><pre class="screen"><span class="commit-message">Internationalized punctuation in <a href="http://docbook.org/tdg5/en/html/glosssee.html"><code class="sgmltag-element">glosssee</code></a> and <a href="http://docbook.org/tdg5/en/html/glossseealso.html"><code class="sgmltag-element">glossseealso</code></a></span></pre>
+</li><li class="listitem">
+<p><code class="literal">Robert Stayton: param.xweb; param.ent; htmltbl.xsl; table.xsl</code></p><pre class="screen"><span class="commit-message">Add support for some format properties on tables using
+HTML <a href="http://docbook.org/tdg5/en/html/table.html"><code class="sgmltag-element">table</code></a> markup. These include:
+ - frame attribute on <a href="http://docbook.org/tdg5/en/html/table.html"><code class="sgmltag-element">table</code></a> (or uses $default.table.frame parameter).
+ - rules attribute on <a href="http://docbook.org/tdg5/en/html/table.html"><code class="sgmltag-element">table</code></a> (or uses $default.table.rules parameter).
+ - align attribute on <a href="http://docbook.org/tdg5/en/html/td.html"><code class="sgmltag-element">td</code></a> and <a href="http://docbook.org/tdg5/en/html/th.html"><code class="sgmltag-element">th</code></a>
+ - valign attribute on <a href="http://docbook.org/tdg5/en/html/td.html"><code class="sgmltag-element">td</code></a> and <a href="http://docbook.org/tdg5/en/html/th.html"><code class="sgmltag-element">th</code></a>
+ - colspan on <a href="http://docbook.org/tdg5/en/html/td.html"><code class="sgmltag-element">td</code></a> and <a href="http://docbook.org/tdg5/en/html/th.html"><code class="sgmltag-element">th</code></a>
+ - rowspan on <a href="http://docbook.org/tdg5/en/html/td.html"><code class="sgmltag-element">td</code></a> and <a href="http://docbook.org/tdg5/en/html/th.html"><code class="sgmltag-element">th</code></a>
+ - bgcolor on <a href="http://docbook.org/tdg5/en/html/td.html"><code class="sgmltag-element">td</code></a> and <a href="http://docbook.org/tdg5/en/html/th.html"><code class="sgmltag-element">th</code></a></span></pre>
+</li><li class="listitem">
+<p><code class="literal">Robert Stayton: table.xsl</code></p><pre class="screen"><span class="commit-message">Add support bgcolor in <a href="http://docbook.org/tdg5/en/html/td.html"><code class="sgmltag-element">td</code></a> and <a href="http://docbook.org/tdg5/en/html/th.html"><code class="sgmltag-element">th</code></a>
+elements in HTML <a href="http://docbook.org/tdg5/en/html/table.html"><code class="sgmltag-element">table</code></a> markup.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Robert Stayton: htmltbl.xsl</code></p><pre class="screen"><span class="commit-message">Add support for colspan and rowspan and bgcolor in <a href="http://docbook.org/tdg5/en/html/td.html"><code class="sgmltag-element">td</code></a> and <a href="http://docbook.org/tdg5/en/html/th.html"><code class="sgmltag-element">th</code></a>
+elements in HTML <a href="http://docbook.org/tdg5/en/html/table.html"><code class="sgmltag-element">table</code></a> markup.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Robert Stayton: param.xweb</code></p><pre class="screen"><span class="commit-message">Fix working of page-master left and right margins.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Mauritz Jeanson: param.xweb; param.ent; fop1.xsl</code></p><pre class="screen"><span class="commit-message">Added a new parameter, <a href="http://docbook.sourceforge.net/release/xsl/current/doc/fo/bookmarks.collapse.html"><em class="parameter"><code>bookmarks.collapse</code></em></a>, that controls the initial <a href="http://docbook.org/tdg5/en/html/state.html"><code class="sgmltag-element">state</code></a> of the bookmark tree. When the parameter has a non-zero value (the default), only the top-level bookmarks are displayed initially. Otherwise, the whole tree of bookmarks is displayed. This is implemented for FOP 0.9X. Closes FR #1792326.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Robert Stayton: table.xsl; pi.xsl</code></p><pre class="screen"><span class="commit-message">Add support for dbfo row-height processing instruction, like that in dbhtml.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Robert Stayton: lists.xsl</code></p><pre class="screen"><span class="commit-message">Add support for dbfo keep-together processing instruction for
+entire list instances.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Robert Stayton: lists.xsl; block.xsl</code></p><pre class="screen"><span class="commit-message">Add support fo dbfo keep-together processing instruction to
+more blocks like list items and paras.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Robert Stayton: lists.xsl; param.xweb; param.ent</code></p><pre class="screen"><span class="commit-message">Add new <a href="http://docbook.sourceforge.net/release/xsl/current/doc/fo/variablelist.term.properties.html"><em class="parameter"><code>variablelist.term.properties</code></em></a> to format terms, per request # 1968513.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Robert Stayton: inline.xsl</code></p><pre class="screen"><span class="commit-message">In simple.xlink, rearrange order of processing.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Robert Stayton: xref.xsl</code></p><pre class="screen"><span class="commit-message">Handle <a href="http://docbook.org/tdg5/en/html/firstterm.html"><code class="sgmltag-element">firstterm</code></a> like <a href="http://docbook.org/tdg5/en/html/glossterm.html"><code class="sgmltag-element">glossterm</code></a> in mode="xref-to".</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Robert Stayton: glossary.xsl; xref.xsl; pi.xsl; footnote.xsl</code></p><pre class="screen"><span class="commit-message">Implement simple.xlink for <a href="http://docbook.org/tdg5/en/html/glosssee.html"><code class="sgmltag-element">glosssee</code></a> and <a href="http://docbook.org/tdg5/en/html/glossseealso.html"><code class="sgmltag-element">glossseealso</code></a> so they can use
+other types of linking besides otherterm.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Robert Stayton: qandaset.xsl</code></p><pre class="screen"><span class="commit-message">Add two new <a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/qanda.defaultlabel.html"><em class="parameter"><code>qanda.defaultlabel</code></em></a> values so that numbered sections and numbered questions can be distinguished. Satisfies Feature Request #1539045.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Robert Stayton: titlepage.xsl</code></p><pre class="screen"><span class="commit-message">For the <a href="http://docbook.org/tdg5/en/html/book.html"><code class="sgmltag-element">book</code></a> <a href="http://docbook.org/tdg5/en/html/title.html"><code class="sgmltag-element">title</code></a> templates, I changed <a href="http://docbook.org/tdg5/en/html/info.html"><code class="sgmltag-element">info</code></a>/<a href="http://docbook.org/tdg5/en/html/title.html"><code class="sgmltag-element">title</code></a> to <a href="http://docbook.org/tdg5/en/html/book.html"><code class="sgmltag-element">book</code></a>/<a href="http://docbook.org/tdg5/en/html/info.html"><code class="sgmltag-element">info</code></a>/<a href="http://docbook.org/tdg5/en/html/title.html"><code class="sgmltag-element">title</code></a>
+so other element's titles will not be affected.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Robert Stayton: xref.xsl; verbatim.xsl</code></p><pre class="screen"><span class="commit-message">Use param <a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/exsl.node.set.available.html"><em class="parameter"><code>exsl.node.set.available</code></em></a> to test for <a href="http://docbook.org/tdg5/en/html/function.html"><code class="sgmltag-element">function</code></a>.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Robert Stayton: param.xweb; param.ent; footnote.xsl</code></p><pre class="screen"><span class="commit-message">Start using new param <a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/exsl.node.set.available.html"><em class="parameter"><code>exsl.node.set.available</code></em></a> to work around Xalan bug.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Robert Stayton: titlepage.templates.xml</code></p><pre class="screen"><span class="commit-message">Add comment on use of t:predicate for <a href="http://docbook.org/tdg5/en/html/editor.html"><code class="sgmltag-element">editor</code></a> to prevent
+extra processing of multiple editors. Fixes bug 2687842.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Robert Stayton: xref.xsl; autoidx.xsl</code></p><pre class="screen"><span class="commit-message">An <a href="http://docbook.org/tdg5/en/html/indexterm.html"><code class="sgmltag-element">indexterm</code></a> <a href="http://docbook.org/tdg5/en/html/primary.html"><code class="sgmltag-element">primary</code></a>, <a href="http://docbook.org/tdg5/en/html/secondary.html"><code class="sgmltag-element">secondary</code></a>, or <a href="http://docbook.org/tdg5/en/html/tertiary.html"><code class="sgmltag-element">tertiary</code></a> element with an id or xml:id
+now outputs that ID, so that <a href="http://docbook.org/tdg5/en/html/index.html"><code class="sgmltag-element">index</code></a> entries can be cross referenced to.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Mauritz Jeanson: synop.xsl</code></p><pre class="screen"><span class="commit-message">Added modeless template for ooclass|oointerface|ooexception.
+Closes bug #1623468.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Robert Stayton: xref.xsl</code></p><pre class="screen"><span class="commit-message">Add template with match on <a href="http://docbook.org/tdg5/en/html/indexterm.html"><code class="sgmltag-element">indexterm</code></a> in mode="xref-to" to fix bug 2102592.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Robert Stayton: xref.xsl</code></p><pre class="screen"><span class="commit-message">Now <a href="http://docbook.org/tdg5/en/html/xref.html"><code class="sgmltag-element">xref</code></a> to <a href="http://docbook.org/tdg5/en/html/qandaentry.html"><code class="sgmltag-element">qandaentry</code></a> will use the <a href="http://docbook.org/tdg5/en/html/label.html"><code class="sgmltag-element">label</code></a> element in a <a href="http://docbook.org/tdg5/en/html/question.html"><code class="sgmltag-element">question</code></a> for
+the <a href="http://docbook.org/tdg5/en/html/link.html"><code class="sgmltag-element">link</code></a> text if it has one.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Robert Stayton: inline.xsl</code></p><pre class="screen"><span class="commit-message">Add id if specified from @id to output for <a href="http://docbook.org/tdg5/en/html/quote.html"><code class="sgmltag-element">quote</code></a> and <a href="http://docbook.org/tdg5/en/html/phrase.html"><code class="sgmltag-element">phrase</code></a> so
+they can be <a href="http://docbook.org/tdg5/en/html/xref.html"><code class="sgmltag-element">xref</code></a>'ed to.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Robert Stayton: xref.xsl</code></p><pre class="screen"><span class="commit-message">Add support for <a href="http://docbook.org/tdg5/en/html/xref.html"><code class="sgmltag-element">xref</code></a> to <a href="http://docbook.org/tdg5/en/html/phrase.html"><code class="sgmltag-element">phrase</code></a>, <a href="http://docbook.org/tdg5/en/html/simpara.html"><code class="sgmltag-element">simpara</code></a>, <a href="http://docbook.org/tdg5/en/html/anchor.html"><code class="sgmltag-element">anchor</code></a>, and <a href="http://docbook.org/tdg5/en/html/quote.html"><code class="sgmltag-element">quote</code></a>.
+This assumes the <a href="http://docbook.org/tdg5/en/html/author.html"><code class="sgmltag-element">author</code></a> specifies something using xrefstyle since
+the elements don't have ordinary <a href="http://docbook.org/tdg5/en/html/link.html"><code class="sgmltag-element">link</code></a> text.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Robert Stayton: toc.xsl</code></p><pre class="screen"><span class="commit-message">Fix bug in new <a href="http://docbook.org/tdg5/en/html/toc.html"><code class="sgmltag-element">toc</code></a> templates.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Mauritz Jeanson: titlepage.xsl; component.xsl; division.xsl; xref.xsl; titlepage.templates&#8943;</code></p><pre class="screen"><span class="commit-message">Added code to handle <a href="http://docbook.org/tdg5/en/html/acknowledgements.html"><code class="sgmltag-element">acknowledgements</code></a> in <a href="http://docbook.org/tdg5/en/html/book.html"><code class="sgmltag-element">book</code></a> and part. The element is processed
+similarly to <a href="http://docbook.org/tdg5/en/html/dedication.html"><code class="sgmltag-element">dedication</code></a>. All <a href="http://docbook.org/tdg5/en/html/acknowledgements.html"><code class="sgmltag-element">acknowledgements</code></a> will appear as front matter, after
+any dedications.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Robert Stayton: toc.xsl</code></p><pre class="screen"><span class="commit-message">Rewrite <a href="http://docbook.org/tdg5/en/html/toc.html"><code class="sgmltag-element">toc</code></a> templates to support an empty <a href="http://docbook.org/tdg5/en/html/toc.html"><code class="sgmltag-element">toc</code></a> or populated <a href="http://docbook.org/tdg5/en/html/toc.html"><code class="sgmltag-element">toc</code></a>
+in all permitted contexts. Same for lot elements.
+This fixes bug #1595969 for FO outputs.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Robert Stayton: index.xsl</code></p><pre class="screen"><span class="commit-message">Fix indents for <a href="http://docbook.org/tdg5/en/html/seealsoie.html"><code class="sgmltag-element">seealsoie</code></a> so they are consistent.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Mauritz Jeanson: param.xweb</code></p><pre class="screen"><span class="commit-message">Removed duplicate (<a href="http://docbook.sourceforge.net/release/xsl/current/doc/fo/monospace.font.family.html"><em class="parameter"><code>monospace.font.family</code></em></a>).</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Robert Stayton: param.xweb; param.ent</code></p><pre class="screen"><span class="commit-message">Add <a href="http://docbook.sourceforge.net/release/xsl/current/doc/fo/glossentry.list.item.properties.html"><em class="parameter"><code>glossentry.list.item.properties</code></em></a>.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Robert Stayton: param.xweb; param.ent</code></p><pre class="screen"><span class="commit-message">Add <a href="http://docbook.sourceforge.net/release/xsl/current/doc/fo/monospace.verbatim.font.width.html"><em class="parameter"><code>monospace.verbatim.font.width</code></em></a> param to support @width on <a href="http://docbook.org/tdg5/en/html/programlisting.html"><code class="sgmltag-element">programlisting</code></a>.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Robert Stayton: verbatim.xsl</code></p><pre class="screen"><span class="commit-message">Put <a href="http://docbook.org/tdg5/en/html/programlisting.html"><code class="sgmltag-element">programlisting</code></a> in fo:block-container with writing-mode="lr-tb"
+when text direction is right to left because all program languages
+are left-to-right.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Robert Stayton: verbatim.xsl</code></p><pre class="screen"><span class="commit-message">Add support for @width on <a href="http://docbook.org/tdg5/en/html/screen.html"><code class="sgmltag-element">screen</code></a> and <a href="http://docbook.org/tdg5/en/html/programlisting.html"><code class="sgmltag-element">programlisting</code></a>, fixes bug #2012736.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Robert Stayton: xref.xsl</code></p><pre class="screen"><span class="commit-message">Fix bug #1973585 <a href="http://docbook.org/tdg5/en/html/xref.html"><code class="sgmltag-element">xref</code></a> to <a href="http://docbook.org/tdg5/en/html/para.html"><code class="sgmltag-element">para</code></a> with xrefstyle not handled correctly.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Mauritz Jeanson: block.xsl</code></p><pre class="screen"><span class="commit-message">Added support for <a href="http://docbook.org/tdg5/en/html/acknowledgements.html"><code class="sgmltag-element">acknowledgements</code></a> in <a href="http://docbook.org/tdg5/en/html/article.html"><code class="sgmltag-element">article</code></a>.
+Support in <a href="http://docbook.org/tdg5/en/html/book.html"><code class="sgmltag-element">book</code></a>/part remains to be added.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Robert Stayton: xref.xsl</code></p><pre class="screen"><span class="commit-message">Fix bug #1787167 incorrect hot text for some olinks.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Robert Stayton: fo.xsl</code></p><pre class="screen"><span class="commit-message">Add writing-mode="tb-rl" as well since some XSL-FO processors support it.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Robert Stayton: autotoc.xsl; lists.xsl; glossary.xsl; fo.xsl; table.xsl; pagesetup.xsl</code></p><pre class="screen"><span class="commit-message">Add support for writing-mode="rl-tb" (right-to-left) in FO outputs.
+Changed instances of margin-left to margin-{$direction.align.start}
+and margin-right to margin-{$direction.align.end}. Those direction.align
+params are computed from the writing mode value in each locale's
+gentext key named 'writing-mode', introduced in 1.74.3 to add
+right-to-left support to HTML outputs.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Robert Stayton: param.xweb; param.ent</code></p><pre class="screen"><span class="commit-message">Add attribute-sets for formatting <a href="http://docbook.org/tdg5/en/html/glossary.html"><code class="sgmltag-element">glossary</code></a> terms and defs.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Robert Stayton: param.xweb; param.ent</code></p><pre class="screen"><span class="commit-message">Add <a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/writing.mode.html"><em class="parameter"><code>writing.mode</code></em></a> param for FO output.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Robert Stayton: autotoc.xsl</code></p><pre class="screen"><span class="commit-message">Fix bug 1546008: in <a href="http://docbook.org/tdg5/en/html/qandaentry.html"><code class="sgmltag-element">qandaentry</code></a> in a <a href="http://docbook.org/tdg5/en/html/toc.html"><code class="sgmltag-element">TOC</code></a>, use its blockinfo/<a href="http://docbook.org/tdg5/en/html/titleabbrev.html"><code class="sgmltag-element">titleabbrev</code></a> or blockinfo/<a href="http://docbook.org/tdg5/en/html/title.html"><code class="sgmltag-element">title</code></a>
+instead of <a href="http://docbook.org/tdg5/en/html/question.html"><code class="sgmltag-element">question</code></a>, if available. For DocBook 5, use the <a href="http://docbook.org/tdg5/en/html/info.html"><code class="sgmltag-element">info</code></a> versions.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Keith Fahlgren: verbatim.xsl</code></p><pre class="screen"><span class="commit-message">Add better pointer to README for XSLTHL</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Keith Fahlgren: verbatim.xsl</code></p><pre class="screen"><span class="commit-message">More tweaking the way that XSLTHL does or does not get called</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Keith Fahlgren: verbatim.xsl</code></p><pre class="screen"><span class="commit-message">Alternate attempt at sanely including/excluding XSLTHT code</span></pre>
+</li></ul></div>
+</div>
+
+<div class="sect2" title="HTML"><div class="titlepage"><div><div><h3 class="title"><a name="rn_V1.75.0_HTML"></a>HTML</h3></div></div></div>
+
+<p>The following changes have been made to the
+ <code class="filename">html</code> code
+ since the 1.74.3 release.</p>
+<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
+<p><code class="literal">Robert Stayton: lists.xsl</code></p><pre class="screen"><span class="commit-message">Removed redundant lang and <a href="http://docbook.org/tdg5/en/html/title.html"><code class="sgmltag-element">title</code></a> attributes on list element inside
+div element for lists.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Robert Stayton: inline.xsl; titlepage.xsl; division.xsl; toc.xsl; sections.xsl; table.xsl;&#8943;</code></p><pre class="screen"><span class="commit-message">Convert all calls to class.attribute to calls to common.html.attributes
+to support dir, lang, and <a href="http://docbook.org/tdg5/en/html/title.html"><code class="sgmltag-element">title</code></a> attributes in html output for all elements.
+Fulfills feature request #1993833.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Robert Stayton: chunk-common.xsl</code></p><pre class="screen"><span class="commit-message">Fix bug #2750253 wrong links in list of figures in chunk.html
+when target html is in a subdirectory and dbhtml <a href="http://docbook.org/tdg5/en/html/filename.html"><code class="sgmltag-element">filename</code></a> used.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Jirka Kosek: highlight.xsl</code></p><pre class="screen"><span class="commit-message">Inclusion of highlighting code was simplified. Only one import is now necessary.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Robert Stayton: chunk-common.xsl; chunktoc.xsl; docbook.xsl; chunk-changebars.xsl; autoidx&#8943;</code></p><pre class="screen"><span class="commit-message">Convert function-available for node-set() to use
+new $exsl.node.set.available param in test.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Mauritz Jeanson: pi.xsl</code></p><pre class="screen"><span class="commit-message">Fixed doc bug for row-height.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">David Cramer: glossary.xsl</code></p><pre class="screen"><span class="commit-message">Internationalized punctuation in <a href="http://docbook.org/tdg5/en/html/glosssee.html"><code class="sgmltag-element">glosssee</code></a> and <a href="http://docbook.org/tdg5/en/html/glossseealso.html"><code class="sgmltag-element">glossseealso</code></a></span></pre>
+</li><li class="listitem">
+<p><code class="literal">Robert Stayton: lists.xsl; html.xsl; block.xsl</code></p><pre class="screen"><span class="commit-message">More elements get common.html.attributes.
+Added locale.html.attributes template which does the lang,
+dir, and <a href="http://docbook.org/tdg5/en/html/title.html"><code class="sgmltag-element">title</code></a> attributes, but not the class attribute
+(used on <a href="http://docbook.org/tdg5/en/html/para.html"><code class="sgmltag-element">para</code></a>, for example).</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Robert Stayton: lists.xsl</code></p><pre class="screen"><span class="commit-message">Replace more <a href="http://docbook.org/tdg5/en/html/literal.html"><code class="sgmltag-element">literal</code></a> class atts with mode="class.attribute" to support
+easier customization.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Robert Stayton: glossary.xsl</code></p><pre class="screen"><span class="commit-message">Support olinking in <a href="http://docbook.org/tdg5/en/html/glosssee.html"><code class="sgmltag-element">glosssee</code></a> and <a href="http://docbook.org/tdg5/en/html/glossseealso.html"><code class="sgmltag-element">glossseealso</code></a>.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Robert Stayton: inline.xsl</code></p><pre class="screen"><span class="commit-message">In simple.xlink, rearrange order of processing.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Robert Stayton: xref.xsl</code></p><pre class="screen"><span class="commit-message">Handle <a href="http://docbook.org/tdg5/en/html/firstterm.html"><code class="sgmltag-element">firstterm</code></a> like <a href="http://docbook.org/tdg5/en/html/glossterm.html"><code class="sgmltag-element">glossterm</code></a> in mode="xref-to".</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Robert Stayton: lists.xsl; html.xsl; block.xsl</code></p><pre class="screen"><span class="commit-message">Added template named common.html.attributes to output
+class, <a href="http://docbook.org/tdg5/en/html/title.html"><code class="sgmltag-element">title</code></a>, lang, and dir for most elements.
+Started adding it to some list and block elements.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Robert Stayton: qandaset.xsl</code></p><pre class="screen"><span class="commit-message">Add two new <a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/qanda.defaultlabel.html"><em class="parameter"><code>qanda.defaultlabel</code></em></a> values so that numbered sections
+and numbered questions can be distinguished. Satisfies
+Feature Request #1539045.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Robert Stayton: param.xweb; chunk-code.xsl; param.ent; xref.xsl; chunkfast.xsl; verbatim.x&#8943;</code></p><pre class="screen"><span class="commit-message">Use new param <a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/exsl.node.set.available.html"><em class="parameter"><code>exsl.node.set.available</code></em></a> to test, handles Xalan bug.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Robert Stayton: autoidx.xsl</code></p><pre class="screen"><span class="commit-message">Use named anchors for <a href="http://docbook.org/tdg5/en/html/primary.html"><code class="sgmltag-element">primary</code></a>, <a href="http://docbook.org/tdg5/en/html/secondary.html"><code class="sgmltag-element">secondary</code></a>, and <a href="http://docbook.org/tdg5/en/html/tertiary.html"><code class="sgmltag-element">tertiary</code></a> ids so
+duplicate entries with different ids can still have an id output.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Robert Stayton: param.xweb; param.ent</code></p><pre class="screen"><span class="commit-message">Add new param <a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/index.links.to.section.html"><em class="parameter"><code>index.links.to.section</code></em></a>.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Robert Stayton: xref.xsl; autoidx.xsl</code></p><pre class="screen"><span class="commit-message">Pass through an id on <a href="http://docbook.org/tdg5/en/html/primary.html"><code class="sgmltag-element">primary</code></a>, <a href="http://docbook.org/tdg5/en/html/secondary.html"><code class="sgmltag-element">secondary</code></a>, or <a href="http://docbook.org/tdg5/en/html/tertiary.html"><code class="sgmltag-element">tertiary</code></a> to
+the <a href="http://docbook.org/tdg5/en/html/index.html"><code class="sgmltag-element">index</code></a> <a href="http://docbook.org/tdg5/en/html/entry.html"><code class="sgmltag-element">entry</code></a>, so that one could <a href="http://docbook.org/tdg5/en/html/link.html"><code class="sgmltag-element">link</code></a> to an <a href="http://docbook.org/tdg5/en/html/index.html"><code class="sgmltag-element">index</code></a> <a href="http://docbook.org/tdg5/en/html/entry.html"><code class="sgmltag-element">entry</code></a>.
+You can't <a href="http://docbook.org/tdg5/en/html/link.html"><code class="sgmltag-element">link</code></a> to the id on an <a href="http://docbook.org/tdg5/en/html/indexterm.html"><code class="sgmltag-element">indexterm</code></a> because that is
+used to place the main <a href="http://docbook.org/tdg5/en/html/anchor.html"><code class="sgmltag-element">anchor</code></a> in the text flow.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Robert Stayton: autoidx.xsl</code></p><pre class="screen"><span class="commit-message">Add support for the new <a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/index.links.to.section.html"><em class="parameter"><code>index.links.to.section</code></em></a> param which permits
+precise links to indexterms in HTML output rather than to
+the <a href="http://docbook.org/tdg5/en/html/section.html"><code class="sgmltag-element">section</code></a> <a href="http://docbook.org/tdg5/en/html/title.html"><code class="sgmltag-element">title</code></a>.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Mauritz Jeanson: synop.xsl</code></p><pre class="screen"><span class="commit-message">Added modeless template for ooclass|oointerface|ooexception.
+Closes bug #1623468.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Robert Stayton: qandaset.xsl</code></p><pre class="screen"><span class="commit-message">Make sure a <a href="http://docbook.org/tdg5/en/html/qandaset.html"><code class="sgmltag-element">qandaset</code></a> has an <a href="http://docbook.org/tdg5/en/html/anchor.html"><code class="sgmltag-element">anchor</code></a>, even when it has no <a href="http://docbook.org/tdg5/en/html/title.html"><code class="sgmltag-element">title</code></a>,
+because it may be referenced in a <a href="http://docbook.org/tdg5/en/html/toc.html"><code class="sgmltag-element">TOC</code></a> or <a href="http://docbook.org/tdg5/en/html/xref.html"><code class="sgmltag-element">xref</code></a>.
+Before, the <a href="http://docbook.org/tdg5/en/html/anchor.html"><code class="sgmltag-element">anchor</code></a> was output by the <a href="http://docbook.org/tdg5/en/html/title.html"><code class="sgmltag-element">title</code></a>, but there was no
+<a href="http://docbook.org/tdg5/en/html/anchor.html"><code class="sgmltag-element">anchor</code></a> if there was no <a href="http://docbook.org/tdg5/en/html/title.html"><code class="sgmltag-element">title</code></a>.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Robert Stayton: xref.xsl</code></p><pre class="screen"><span class="commit-message">Add a template for <a href="http://docbook.org/tdg5/en/html/indexterm.html"><code class="sgmltag-element">indexterm</code></a> with mode="xref-to" to fix bug 2102592.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Robert Stayton: xref.xsl</code></p><pre class="screen"><span class="commit-message">Now <a href="http://docbook.org/tdg5/en/html/xref.html"><code class="sgmltag-element">xref</code></a> to <a href="http://docbook.org/tdg5/en/html/qandaentry.html"><code class="sgmltag-element">qandaentry</code></a> will use the <a href="http://docbook.org/tdg5/en/html/label.html"><code class="sgmltag-element">label</code></a> element in a <a href="http://docbook.org/tdg5/en/html/question.html"><code class="sgmltag-element">question</code></a> for
+the <a href="http://docbook.org/tdg5/en/html/link.html"><code class="sgmltag-element">link</code></a> text if it has one.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Robert Stayton: qandaset.xsl; html.xsl</code></p><pre class="screen"><span class="commit-message">Create separate templates for computing <a href="http://docbook.org/tdg5/en/html/label.html"><code class="sgmltag-element">label</code></a> of <a href="http://docbook.org/tdg5/en/html/question.html"><code class="sgmltag-element">question</code></a> and <a href="http://docbook.org/tdg5/en/html/answer.html"><code class="sgmltag-element">answer</code></a>
+in a <a href="http://docbook.org/tdg5/en/html/qandaentry.html"><code class="sgmltag-element">qandaentry</code></a>, so such can be used for the <a href="http://docbook.org/tdg5/en/html/alt.html"><code class="sgmltag-element">alt</code></a> text of an <a href="http://docbook.org/tdg5/en/html/xref.html"><code class="sgmltag-element">xref</code></a>
+to a <a href="http://docbook.org/tdg5/en/html/qandaentry.html"><code class="sgmltag-element">qandaentry</code></a>.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Robert Stayton: inline.xsl; xref.xsl</code></p><pre class="screen"><span class="commit-message">Now support <a href="http://docbook.org/tdg5/en/html/xref.html"><code class="sgmltag-element">xref</code></a> to <a href="http://docbook.org/tdg5/en/html/phrase.html"><code class="sgmltag-element">phrase</code></a>, <a href="http://docbook.org/tdg5/en/html/simpara.html"><code class="sgmltag-element">simpara</code></a>, <a href="http://docbook.org/tdg5/en/html/anchor.html"><code class="sgmltag-element">anchor</code></a>, and <a href="http://docbook.org/tdg5/en/html/quote.html"><code class="sgmltag-element">quote</code></a>,
+most useful when an xrefstyle is used.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Robert Stayton: toc.xsl</code></p><pre class="screen"><span class="commit-message">Rewrite <a href="http://docbook.org/tdg5/en/html/toc.html"><code class="sgmltag-element">toc</code></a> templates to support an empty <a href="http://docbook.org/tdg5/en/html/toc.html"><code class="sgmltag-element">toc</code></a> or populated <a href="http://docbook.org/tdg5/en/html/toc.html"><code class="sgmltag-element">toc</code></a>
+in all permitted contexts. Same for lot elements.
+This fixes bug #1595969 for HTML outputs.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Mauritz Jeanson: titlepage.xsl; component.xsl; division.xsl; xref.xsl; titlepage.templates&#8943;</code></p><pre class="screen"><span class="commit-message">Added code to handle <a href="http://docbook.org/tdg5/en/html/acknowledgements.html"><code class="sgmltag-element">acknowledgements</code></a> in <a href="http://docbook.org/tdg5/en/html/book.html"><code class="sgmltag-element">book</code></a> and part. The element is processed
+similarly to <a href="http://docbook.org/tdg5/en/html/dedication.html"><code class="sgmltag-element">dedication</code></a>. All <a href="http://docbook.org/tdg5/en/html/acknowledgements.html"><code class="sgmltag-element">acknowledgements</code></a> will appear as front matter, after
+any dedications.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Robert Stayton: index.xsl</code></p><pre class="screen"><span class="commit-message">Rewrote <a href="http://docbook.org/tdg5/en/html/primaryie.html"><code class="sgmltag-element">primaryie</code></a>, <a href="http://docbook.org/tdg5/en/html/secondaryie.html"><code class="sgmltag-element">secondaryie</code></a> and <a href="http://docbook.org/tdg5/en/html/tertiaryie.html"><code class="sgmltag-element">tertiaryie</code></a> templates to handle
+nesting of elements and <a href="http://docbook.org/tdg5/en/html/seeie.html"><code class="sgmltag-element">seeie</code></a> and <a href="http://docbook.org/tdg5/en/html/seealsoie.html"><code class="sgmltag-element">seealsoie</code></a>, as reported in
+bug # 1168912.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Robert Stayton: autotoc.xsl</code></p><pre class="screen"><span class="commit-message">Fix <a href="http://docbook.org/tdg5/en/html/simplesect.html"><code class="sgmltag-element">simplesect</code></a> in <a href="http://docbook.org/tdg5/en/html/toc.html"><code class="sgmltag-element">toc</code></a> problem.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Robert Stayton: verbatim.xsl</code></p><pre class="screen"><span class="commit-message">Add support for @width per bug report #2012736.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Robert Stayton: formal.xsl; htmltbl.xsl</code></p><pre class="screen"><span class="commit-message">Fix bug #1787140 HTML tables not handling attributes correctly.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Robert Stayton: param.xweb</code></p><pre class="screen"><span class="commit-message">Move writing-mode param.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Keith Fahlgren: refentry.xsl</code></p><pre class="screen"><span class="commit-message">Remove a nesting of &lt;p&gt; inside &lt;p&gt; for <a href="http://docbook.org/tdg5/en/html/refclass.html"><code class="sgmltag-element">refclass</code></a> (made XHTML* invalid, made HTML silly)</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Robert Stayton: table.xsl</code></p><pre class="screen"><span class="commit-message">Fix bug #1945872 to allow passthrough of colwidth values to
+HTML <a href="http://docbook.org/tdg5/en/html/table.html"><code class="sgmltag-element">table</code></a> when no <a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/tablecolumns.extension.html"><em class="parameter"><code>tablecolumns.extension</code></em></a> is available and
+when no instance of * appears in the <a href="http://docbook.org/tdg5/en/html/table.html"><code class="sgmltag-element">table</code></a>'s colspecs.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Mauritz Jeanson: block.xsl</code></p><pre class="screen"><span class="commit-message">Added support for <a href="http://docbook.org/tdg5/en/html/acknowledgements.html"><code class="sgmltag-element">acknowledgements</code></a> in <a href="http://docbook.org/tdg5/en/html/article.html"><code class="sgmltag-element">article</code></a>.
+Support in <a href="http://docbook.org/tdg5/en/html/book.html"><code class="sgmltag-element">book</code></a>/part remains to be added.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Robert Stayton: chunk-common.xsl</code></p><pre class="screen"><span class="commit-message">Fix bug #1787167 incorrect hot text for some olinks.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Robert Stayton: qandaset.xsl</code></p><pre class="screen"><span class="commit-message">Fix bug 1546008: in <a href="http://docbook.org/tdg5/en/html/qandaentry.html"><code class="sgmltag-element">qandaentry</code></a> in a <a href="http://docbook.org/tdg5/en/html/toc.html"><code class="sgmltag-element">TOC</code></a>, use its blockinfo/<a href="http://docbook.org/tdg5/en/html/titleabbrev.html"><code class="sgmltag-element">titleabbrev</code></a> or blockinfo/<a href="http://docbook.org/tdg5/en/html/title.html"><code class="sgmltag-element">title</code></a>
+instead of <a href="http://docbook.org/tdg5/en/html/question.html"><code class="sgmltag-element">question</code></a>, if available. For DocBook 5, use the <a href="http://docbook.org/tdg5/en/html/info.html"><code class="sgmltag-element">info</code></a> versions.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Robert Stayton: chunktoc.xsl</code></p><pre class="screen"><span class="commit-message">Add support for generating <a href="http://docbook.org/tdg5/en/html/olink.html"><code class="sgmltag-element">olink</code></a> <a href="http://docbook.org/tdg5/en/html/database.html"><code class="sgmltag-element">database</code></a> when using chunktoc.xsl.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Keith Fahlgren: verbatim.xsl</code></p><pre class="screen"><span class="commit-message">Add better pointer to README for XSLTHL</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Keith Fahlgren: verbatim.xsl</code></p><pre class="screen"><span class="commit-message">Another stab at fixing the stupid XSLTHT includes across processors (Saxon regression reported by Sorin Ristache)</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Keith Fahlgren: verbatim.xsl</code></p><pre class="screen"><span class="commit-message">More tweaking the way that XSLTHL does or does not get called</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Keith Fahlgren: verbatim.xsl</code></p><pre class="screen"><span class="commit-message">Alternate attempt at sanely including/excluding XSLTHT code</span></pre>
+</li></ul></div>
+</div>
+
+<div class="sect2" title="Manpages"><div class="titlepage"><div><div><h3 class="title"><a name="rn_V1.75.0_Manpages"></a>Manpages</h3></div></div></div>
+
+<p>The following changes have been made to the
+ <code class="filename">manpages</code> code
+ since the 1.74.3 release.</p>
+<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
+<p><code class="literal">Robert Stayton: table.xsl</code></p><pre class="screen"><span class="commit-message">Convert function-available test for node-set() <a href="http://docbook.org/tdg5/en/html/function.html"><code class="sgmltag-element">function</code></a> to
+test of $exsl.node.set.available param.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Mauritz Jeanson: lists.xsl</code></p><pre class="screen"><span class="commit-message">Added a template for <a href="http://docbook.org/tdg5/en/html/bibliolist.html"><code class="sgmltag-element">bibliolist</code></a>. Closes bug #1815916.</span></pre>
+</li></ul></div>
+</div>
+
+<div class="sect2" title="ePub"><div class="titlepage"><div><div><h3 class="title"><a name="rn_V1.75.0_Epub"></a>ePub</h3></div></div></div>
+
+<p>The following changes have been made to the
+ <code class="filename">epub</code> code
+ since the 1.74.3 release.</p>
+<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
+<p><code class="literal">Keith Fahlgren: bin/spec/epub_regressions_spec.rb; bin/spec/files/onegraphic.xinclude.xml;&#8943;</code></p><pre class="screen"><span class="commit-message">Slightly more nuanced handling of <a href="http://docbook.org/tdg5/en/html/imageobject.html"><code class="sgmltag-element">imageobject</code></a> alternatives and better support in dbtoepub for XIncludes and ENTITYs to resolve Issue #2750442 reported by Raphael Hertzog.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Keith Fahlgren: docbook.xsl</code></p><pre class="screen"><span class="commit-message">Add a colon after an <a href="http://docbook.org/tdg5/en/html/abstract.html"><code class="sgmltag-element">abstract</code></a>/<a href="http://docbook.org/tdg5/en/html/title.html"><code class="sgmltag-element">title</code></a> when mapping into the dc:description for OPF metadata in ePub output to help the flat text have more pseudo-semantics (sugestions from Michael Wiedmann)</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Keith Fahlgren: bin/spec/epub_regressions_spec.rb; docbook.xsl; bin/spec/files/de.xml</code></p><pre class="screen"><span class="commit-message">Correctly set dc:language in OPF metadata when i18nizing. Closes Bug #2755150</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Keith Fahlgren: bin/spec/epub_regressions_spec.rb; docbook.xsl</code></p><pre class="screen"><span class="commit-message">Corrected namespace declarations for <a href="http://docbook.org/tdg5/en/html/literal.html"><code class="sgmltag-element">literal</code></a> XHTML elements to make them serialize "normally"</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Keith Fahlgren: docbook.xsl</code></p><pre class="screen"><span class="commit-message">Be a little bit more nuanced about dates</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Keith Fahlgren: docbook.xsl; bin/spec/epub_realbook_spec.rb; bin/spec/files/orm.book.001.x&#8943;</code></p><pre class="screen"><span class="commit-message">Add DocBook <a href="http://docbook.org/tdg5/en/html/subjectset.html"><code class="sgmltag-element">subjectset</code></a> -&gt; OPF dc:<a href="http://docbook.org/tdg5/en/html/subject.html"><code class="sgmltag-element">subject</code></a> mapping and tests</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Keith Fahlgren: docbook.xsl; bin/spec/epub_realbook_spec.rb; bin/spec/files/orm.book.001.x&#8943;</code></p><pre class="screen"><span class="commit-message">Add DocBook <a href="http://docbook.org/tdg5/en/html/date.html"><code class="sgmltag-element">date</code></a> -&gt; OPF dc:date mapping and tests</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Keith Fahlgren: docbook.xsl; bin/spec/epub_realbook_spec.rb; bin/spec/files/orm.book.001.x&#8943;</code></p><pre class="screen"><span class="commit-message">Add DocBook <a href="http://docbook.org/tdg5/en/html/abstract.html"><code class="sgmltag-element">abstract</code></a> -&gt; OPF dc:description mapping and tests</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Robert Stayton: docbook.xsl</code></p><pre class="screen"><span class="commit-message">Check in patch submitted by user to add opf:file-as attribute
+to dc:creator element.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Keith Fahlgren: bin/dbtoepub</code></p><pre class="screen"><span class="commit-message">Adding --output option to dbtoepub based on user request</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Keith Fahlgren: docbook.xsl; bin/spec/epub_spec.rb</code></p><pre class="screen"><span class="commit-message">Cleaning and regularizing the generation of namespaced nodes for OPF, NCX, XHTML and other outputted filetypes (hat <a href="http://docbook.org/tdg5/en/html/tip.html"><code class="sgmltag-element">tip</code></a> to bobstayton for pointing out the silly, incorrect code)</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Keith Fahlgren: bin/spec/epub_regressions_spec.rb; bin/spec/files/refclass.xml</code></p><pre class="screen"><span class="commit-message">Remove a nesting of &lt;p&gt; inside &lt;p&gt; for <a href="http://docbook.org/tdg5/en/html/refclass.html"><code class="sgmltag-element">refclass</code></a> (made XHTML* invalid, made HTML silly)</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Keith Fahlgren: bin/spec/epub_regressions_spec.rb; bin/spec/files/blockquotepre.xml</code></p><pre class="screen"><span class="commit-message">Added regression test and fix for XHTML validation problem with &lt;a&gt;s added inside &lt;<a href="http://docbook.org/tdg5/en/html/blockquote.html"><code class="sgmltag-element">blockquote</code></a>&gt;; This potentially causes another problem (where something is referenced by has no <a href="http://docbook.org/tdg5/en/html/anchor.html"><code class="sgmltag-element">anchor</code></a>, but someone reporting that should cause the whole &lt;a id='thing'/&gt; thing to be reconsidered with modern browsers in mind.</span></pre>
+</li></ul></div>
+</div>
+
+<div class="sect2" title="HTMLHelp"><div class="titlepage"><div><div><h3 class="title"><a name="rn_V1.75.0_HTMLHelp"></a>HTMLHelp</h3></div></div></div>
+
+<p>The following changes have been made to the
+ <code class="filename">htmlhelp</code> code
+ since the 1.74.3 release.</p>
+<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
+<p><code class="literal">Robert Stayton: htmlhelp-common.xsl</code></p><pre class="screen"><span class="commit-message">Add support for generating <a href="http://docbook.org/tdg5/en/html/olink.html"><code class="sgmltag-element">olink</code></a> target <a href="http://docbook.org/tdg5/en/html/database.html"><code class="sgmltag-element">database</code></a> for htmlhelp files.</span></pre>
+</li></ul></div>
+</div>
+
+
+<div class="sect2" title="Params"><div class="titlepage"><div><div><h3 class="title"><a name="rn_V1.75.0_Params"></a>Params</h3></div></div></div>
+
+<p>The following changes have been made to the
+ <code class="filename">params</code> code
+ since the 1.74.3 release.</p>
+<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
+<p><code class="literal">Robert Stayton: default.table.rules.xml</code></p><pre class="screen"><span class="commit-message">Add default setting for @rules attribute on HTML markup tables.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Mauritz Jeanson: bookmarks.collapse.xml</code></p><pre class="screen"><span class="commit-message">Added a new parameter, <a href="http://docbook.sourceforge.net/release/xsl/current/doc/fo/bookmarks.collapse.html"><em class="parameter"><code>bookmarks.collapse</code></em></a>, that controls the initial <a href="http://docbook.org/tdg5/en/html/state.html"><code class="sgmltag-element">state</code></a>
+of the bookmark tree. When the parameter has a non-zero value (the default),
+only the top-level bookmarks are displayed initially. Otherwise, the whole
+tree of bookmarks is displayed.
+
+This is implemented for FOP 0.9X. Closes FR #1792326.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Robert Stayton: variablelist.term.properties.xml</code></p><pre class="screen"><span class="commit-message">Add new <a href="http://docbook.sourceforge.net/release/xsl/current/doc/fo/variablelist.term.properties.html"><em class="parameter"><code>variablelist.term.properties</code></em></a> to format terms, per
+request # 1968513.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Robert Stayton: qanda.defaultlabel.xml</code></p><pre class="screen"><span class="commit-message">Add two new <a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/qanda.defaultlabel.html"><em class="parameter"><code>qanda.defaultlabel</code></em></a> values so that numbered sections
+and numbered questions can be distinguished. Satisfies
+Feature Request #1539045.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Robert Stayton: index.links.to.section.xml</code></p><pre class="screen"><span class="commit-message">Change default to 1 to match past behavior.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Robert Stayton: exsl.node.set.available.xml</code></p><pre class="screen"><span class="commit-message">Isolate this text for Xalan bug regarding exsl:node-set available.
+If it is ever fixed in Xalan, just fix it here.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Robert Stayton: index.links.to.section.xml</code></p><pre class="screen"><span class="commit-message">Add param to control whether an <a href="http://docbook.org/tdg5/en/html/index.html"><code class="sgmltag-element">index</code></a> <a href="http://docbook.org/tdg5/en/html/entry.html"><code class="sgmltag-element">entry</code></a> links to
+a <a href="http://docbook.org/tdg5/en/html/section.html"><code class="sgmltag-element">section</code></a> <a href="http://docbook.org/tdg5/en/html/title.html"><code class="sgmltag-element">title</code></a> or to the precise location of the
+<a href="http://docbook.org/tdg5/en/html/indexterm.html"><code class="sgmltag-element">indexterm</code></a>.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Robert Stayton: glossentry.list.item.properties.xml</code></p><pre class="screen"><span class="commit-message">New attribute list for <a href="http://docbook.org/tdg5/en/html/glossentry.html"><code class="sgmltag-element">glossentry</code></a> in <a href="http://docbook.org/tdg5/en/html/glossary.html"><code class="sgmltag-element">glossary</code></a>.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Robert Stayton: monospace.verbatim.font.width.xml</code></p><pre class="screen"><span class="commit-message">New parameter to support @width on <a href="http://docbook.org/tdg5/en/html/programlisting.html"><code class="sgmltag-element">programlisting</code></a> and <a href="http://docbook.org/tdg5/en/html/screen.html"><code class="sgmltag-element">screen</code></a>.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Mauritz Jeanson: highlight.source.xml</code></p><pre class="screen"><span class="commit-message">Updated and reorganized the description.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Robert Stayton: page.margin.outer.xml; page.margin.inner.xml</code></p><pre class="screen"><span class="commit-message">Add caveat about XEP bug when writing-mode is right-to-left.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Robert Stayton: article.appendix.title.properties.xml; writing.mode.xml; body.start.indent&#8943;</code></p><pre class="screen"><span class="commit-message">Change 'left' to 'start' and 'right' to 'end' to support right-to-left
+writing mode.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Robert Stayton: glossdef.block.properties.xml; glossdef.list.properties.xml; glossterm.blo&#8943;</code></p><pre class="screen"><span class="commit-message">Add attribute-sets for formatting <a href="http://docbook.org/tdg5/en/html/glossary.html"><code class="sgmltag-element">glossary</code></a> terms and defs.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Robert Stayton: glossterm.separation.xml</code></p><pre class="screen"><span class="commit-message">Clarify the description.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Robert Stayton: make.year.ranges.xml</code></p><pre class="screen"><span class="commit-message">Now handles <a href="http://docbook.org/tdg5/en/html/year.html"><code class="sgmltag-element">year</code></a> element containing a comma or dash without error.</span></pre>
+</li></ul></div>
+</div>
+
+<div class="sect2" title="Highlighting"><div class="titlepage"><div><div><h3 class="title"><a name="rn_V1.75.0_Highlighting"></a>Highlighting</h3></div></div></div>
+
+<p>The following changes have been made to the
+ <code class="filename">highlighting</code> code
+ since the 1.74.3 release.</p>
+<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
+<p><code class="literal">Jirka Kosek: README</code></p><pre class="screen"><span class="commit-message">Inclusion of highlighting code was simplified. Only one import is now necessary.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Keith Fahlgren: README</code></p><pre class="screen"><span class="commit-message">Adding XSLTHL readme</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Keith Fahlgren: common.xsl</code></p><pre class="screen"><span class="commit-message">Alternate attempt at sanely including/excluding XSLTHT code</span></pre>
+</li></ul></div>
+</div>
+
+<div class="sect2" title="XSL-Saxon"><div class="titlepage"><div><div><h3 class="title"><a name="rn_V1.75.0_XSL-Saxon"></a>XSL-Saxon</h3></div></div></div>
+
+<p>The following changes have been made to the
+ <code class="filename">xsl-saxon</code> code
+ since the 1.74.3 release.</p>
+<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
+<p><code class="literal">Mauritz Jeanson: src/com/nwalsh/saxon/Text.java</code></p><pre class="screen"><span class="commit-message">Added a fix that prevents output of extra blank line.
+Hopefully this closes bug #894805.</span></pre>
+</li></ul></div>
+</div>
+
+<div class="sect2" title="XSL-Xalan"><div class="titlepage"><div><div><h3 class="title"><a name="rn_V1.75.0_XSL-Xalan"></a>XSL-Xalan</h3></div></div></div>
+
+<p>The following changes have been made to the
+ <code class="filename">xsl-xalan</code> code
+ since the 1.74.3 release.</p>
+<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
+<p><code class="literal">Mauritz Jeanson: src/com/nwalsh/xalan/Text.java</code></p><pre class="screen"><span class="commit-message">Added a fix that prevents output of extra blank line.
+Hopefully this closes bug #894805.</span></pre>
+</li></ul></div>
+</div>
+
+
+</div>
+
+<div class="sect1" title="Release Notes: 1.74.3"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="V1.74.3"></a>Release Notes: 1.74.3</h2></div></div></div>
+
+<p>This release fixes some bugs in the 1.74.2 release.</p>
+<p>See <code class="filename">highlighting/README</code> for XSLTHL usage instructions.</p>
+</div>
+<div class="sect1" title="Release Notes: 1.74.2"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="V1.74.2"></a>Release Notes: 1.74.2</h2></div></div></div>
+
+<p>This release fixes some bugs in the 1.74.1 release.</p>
+</div>
+
+<div class="sect1" title="Release Notes: 1.74.1"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="V1.74.1"></a>Release Notes: 1.74.1</h2></div></div></div>
+
+<p>This release includes important bug fixes and adds the following
+significant feature changes:
+</p><div class="variablelist"><dl><dt><span class="term">Gentext</span></dt><dd><p>Kirghiz locale added and Chinese translations have been simplified.</p><p>Somme support for gentext and right-to-left languages has been added.</p></dd><dt><span class="term">FO</span></dt><dd><p>Various bugs have been resolved. </p> <p>Support for a new processing instruction: <span class="markup">dbfo funcsynopsis-style</span> has been added. </p> <p>Added new param <a href="http://docbook.sourceforge.net/release/xsl/current/doc/fo/email.mailto.enabled.html"><em class="parameter"><code>email.mailto.enabled</code></em></a> for FO output. Patch from Paolo Borelli. </p>
+<p>Support for documented metadata in fop1 mode has been added. </p>
+</dd><dt><span class="term">Highlighting</span></dt><dd><p>Support for the latest version of XSLTHL 2.0 and some new language syntaxes have been added to a variety of outputs.</p></dd><dt><span class="term">Manpages</span></dt><dd><p>Added man.output.better.ps.enabled param (zero default). It non-zero, no such
+markup is embedded in generated man pages, and no enhancements are
+included in the PostScript output generated from those man pages
+by the man -Tps <a href="http://docbook.org/tdg5/en/html/command.html"><code class="sgmltag-element">command</code></a>.</p></dd><dt><span class="term">HTML</span></dt><dd><p>Support for <a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/writing.mode.html"><em class="parameter"><code>writing.mode</code></em></a> to set text direction and <a href="http://docbook.sourceforge.net/release/xsl/current/doc/fo/alignment.html"><em class="parameter"><code>alignment</code></em></a> based on document locale has been added.</p>
+<p>Added a new top-level stylesheet module, chunk-changebars.xsl, to be
+used for generating chunked output with highlighting based on change
+(@revisionflag) markup. The module imports/includes the standard chunking
+and changebars templates and contains additional logic for chunked output.
+See FRs #1015180 and #1819915.</p>
+</dd><dt><span class="term">ePub</span></dt><dd>
+<p>Covers now look better in Adobe Digital Editions thanks to a patch from Paul Norton of Adobe</p>
+<p>Cover handling now more generic (including limited DocBook 5.0 <span class="markup">cover</span> support thanks to patch contributed by Liza Daly.</p> <p>Cover markup now carries more reliably into files destined for .mobi and the Kindle.</p> <p><span class="markup">dc:identifiers</span> are now generated from more types of numbering schemes. </p><p>Both SEO and semantic structure of chunked ePub output by ensuring that we always send out one and only one h1 in each XHTML chunk.</p>
+<p>Primitive support for embedding a single font added.</p>
+
+<p>Support for embedding a CSS customizations added.</p>
+</dd><dt><span class="term">Roundtrip</span></dt><dd>
+<p>Support for imagedata-metadata and <a href="http://docbook.org/tdg5/en/html/table.html"><code class="sgmltag-element">table</code></a> as images added.</p>
+
+<p>Support for imagedata-metadata and <a href="http://docbook.org/tdg5/en/html/legalnotice.html"><code class="sgmltag-element">legalnotice</code></a> as images added.</p>
+</dd><dt><span class="term">Params</span></dt><dd><p><a href="http://docbook.sourceforge.net/release/xsl/current/doc/manpages/man.output.better.ps.enabled.html"><em class="parameter"><code>man.output.better.ps.enabled</code></em></a> added for Manpages output </p>
+<p><em class="parameter"><code>writing.mode.xml</code></em> added to set text direction.</p>
+
+<p>Added new param <a href="http://docbook.sourceforge.net/release/xsl/current/doc/fo/email.mailto.enabled.html"><em class="parameter"><code>email.mailto.enabled</code></em></a> for FO output.
+Patch from Paolo Borelli. Closes #2086321.</p>
+
+<p><a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/highlight.source.html"><em class="parameter"><code>highlight.source</code></em></a> upgraded to support the latest version of XSLTHL 2.0.</p>
+</dd></dl></div><p>
+</p>
+<p>The following is a list of changes that have been made since the 1.74.0 release.</p>
+
+
+<div class="sect2" title="Gentext"><div class="titlepage"><div><div><h3 class="title"><a name="summary_V1.74.1_Gentext"></a>Gentext</h3></div></div></div>
+
+<p>The following changes have been made to the <code class="filename">gentext</code> code since the 1.74.0 release.</p>
+<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: locale/ky.xml; Makefile</code></p><pre class="screen"><span class="commit-message">new Kirghiz locale from Ilyas Bakirov</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Mauritz Jeanson: locale/en.xml</code></p><pre class="screen"><span class="commit-message">Added "<a href="http://docbook.org/tdg5/en/html/acknowledgements.html"><code class="sgmltag-element">Acknowledgements</code></a>".</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Dongsheng Song: locale/zh_cn.xml</code></p><pre class="screen"><span class="commit-message">Simplified Chinese translation.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Robert Stayton: locale/lv.xml; locale/ca.xml; locale/pt.xml; locale/tr.xml; locale/af.xml;&#8943;</code></p><pre class="screen"><span class="commit-message">Add writing-mode gentext string to support right-to-left languages.</span></pre>
+</li></ul></div>
+</div>
+
+<div class="sect2" title="FO"><div class="titlepage"><div><div><h3 class="title"><a name="summary_V1.74.1_FO"></a>FO</h3></div></div></div>
+
+<p>The following changes have been made to the <code class="filename">fo</code> code since the 1.74.0 release.</p>
+<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
+<p><code class="literal">David Cramer: footnote.xsl</code></p><pre class="screen"><span class="commit-message">Added a check to confirm that a <a href="http://docbook.org/tdg5/en/html/footnoteref.html"><code class="sgmltag-element">footnoteref</code></a>'s linkend points to a <a href="http://docbook.org/tdg5/en/html/footnote.html"><code class="sgmltag-element">footnote</code></a>. Stylesheets stop processing if not and provide a useful error message.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Mauritz Jeanson: spaces.xsl</code></p><pre class="screen"><span class="commit-message">Convert spaces to fo:leader also in elements in the DB 5 namespace.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Mauritz Jeanson: pi.xsl; synop.xsl</code></p><pre class="screen"><span class="commit-message">Added support for a new processing instruction: dbfo funcsynopsis-style.
+Closes bug #1838213.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: inline.xsl; param.xweb; param.ent</code></p><pre class="screen"><span class="commit-message">Added new param <a href="http://docbook.sourceforge.net/release/xsl/current/doc/fo/email.mailto.enabled.html"><em class="parameter"><code>email.mailto.enabled</code></em></a> for FO output.
+Patch from Paolo Borelli. Closes #2086321.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Mauritz Jeanson: docbook.xsl</code></p><pre class="screen"><span class="commit-message">Added support for document metadata for fop1 (patch #2067318).</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Jirka Kosek: param.ent; param.xweb; highlight.xsl</code></p><pre class="screen"><span class="commit-message">Upgraded to support the latest version of XSLTHL 2.0
+ -- nested markup in highlited code is now processed
+ -- it is no longer needed to specify path XSLTHL configuration file using Java property
+ -- support for new languages, including Perl, Python and Ruby was added</span></pre>
+</li></ul></div>
+</div>
+
+<div class="sect2" title="HTML"><div class="titlepage"><div><div><h3 class="title"><a name="summary_V1.74.1_HTML"></a>HTML</h3></div></div></div>
+
+<p>The following changes have been made to the <code class="filename">html</code> code since the 1.74.0 release.</p>
+<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
+<p><code class="literal">Robert Stayton: param.xweb; docbook.xsl; param.ent; html.xsl</code></p><pre class="screen"><span class="commit-message">Add support for <a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/writing.mode.html"><em class="parameter"><code>writing.mode</code></em></a> to set text direction and <a href="http://docbook.sourceforge.net/release/xsl/current/doc/fo/alignment.html"><em class="parameter"><code>alignment</code></em></a> based on document locale.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Mauritz Jeanson: chunk-changebars.xsl</code></p><pre class="screen"><span class="commit-message">Added a new top-level stylesheet module, chunk-changebars.xsl, to be
+used for generating chunked output with highlighting based on change
+(@revisionflag) markup. The module imports/includes the standard chunking
+and changebars templates and contains additional logic for chunked output.
+See FRs #1015180 and #1819915.</span></pre>
+</li></ul></div>
+</div>
+
+<div class="sect2" title="Manpages"><div class="titlepage"><div><div><h3 class="title"><a name="summary_V1.74.1_Manpages"></a>Manpages</h3></div></div></div>
+
+<p>The following changes have been made to the <code class="filename">manpages</code> code since the 1.74.0 release.</p>
+<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: docbook.xsl</code></p><pre class="screen"><span class="commit-message">Put the following at the top of generated roff for each page:
+ \" t
+purpose is to explicitly tell AT&amp;T troff that the page needs to be
+pre-processed through tbl(1); groff can <a href="http://docbook.org/tdg5/en/html/figure.html"><code class="sgmltag-element">figure</code></a> it out
+automatically, but apparently AT&amp;T troff needs to be explicitly told</span></pre>
+</li></ul></div>
+</div>
+
+<div class="sect2" title="ePub"><div class="titlepage"><div><div><h3 class="title"><a name="summary_V1.74.1_Epub"></a>ePub</h3></div></div></div>
+
+<p>The following changes have been made to the <code class="filename">epub</code> code since the 1.74.0 release.</p>
+<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
+<p><code class="literal">Keith Fahlgren: docbook.xsl</code></p><pre class="screen"><span class="commit-message">Patch from Paul Norton of Adobe to get covers to look better in Adobe Digital Editions</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Keith Fahlgren: bin/spec/epub_regressions_spec.rb; bin/spec/files/v5cover.xml; bin/spec/sp&#8943;</code></p><pre class="screen"><span class="commit-message">Patch contributed by Liza Daly to make ePub <a href="http://docbook.org/tdg5/en/html/cover.html"><code class="sgmltag-element">cover</code></a> handling more generic. Additionally
+DocBook 5.0's &lt;<a href="http://docbook.org/tdg5/en/html/cover.html"><code class="sgmltag-element">cover</code></a>&gt; now has some limited support:
+
+- should <a href="http://docbook.org/tdg5/en/html/reference.html"><code class="sgmltag-element">reference</code></a> a <a href="http://docbook.org/tdg5/en/html/cover.html"><code class="sgmltag-element">cover</code></a> in the OPF guide for a DocBook 5.0 test document</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Keith Fahlgren: bin/spec/files/isbn.xml; bin/spec/files/issn.xml; bin/spec/files/biblioid.&#8943;</code></p><pre class="screen"><span class="commit-message">Liza Daly reported that the dc:identifer-generation code was garbage (she was right).
+
+Added new tests:
+- should include at least one dc:identifier
+- should include an ISBN as URN for dc:identifier if an ISBN was in the metadata
+- should include an ISSN as URN for dc:identifier if an ISSN was in the metadata
+- should include an <a href="http://docbook.org/tdg5/en/html/biblioid.html"><code class="sgmltag-element">biblioid</code></a> as a dc:identifier if an <a href="http://docbook.org/tdg5/en/html/biblioid.html"><code class="sgmltag-element">biblioid</code></a> was in the metadata
+- should include a URN for a <a href="http://docbook.org/tdg5/en/html/biblioid.html"><code class="sgmltag-element">biblioid</code></a> with @class attribute as a dc:identifier if an <a href="http://docbook.org/tdg5/en/html/biblioid.html"><code class="sgmltag-element">biblioid</code></a> was in the metadata</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Keith Fahlgren: docbook.xsl; bin/spec/epub_spec.rb</code></p><pre class="screen"><span class="commit-message">Improve both SEO and semantic structure of chunked ePub output by ensuring that
+we always send out one and only one h1 in each XHTML chunk.
+
+DocBook::Epub
+- should include one and only one &lt;h1&gt; in each HTML file in rendered ePub files
+for &lt;<a href="http://docbook.org/tdg5/en/html/book.html"><code class="sgmltag-element">book</code></a>&gt;s
+- should include one and only one &lt;h1&gt; in each HTML file in rendered ePub files
+for &lt;<a href="http://docbook.org/tdg5/en/html/book.html"><code class="sgmltag-element">book</code></a>&gt;s even if they do not have <a href="http://docbook.org/tdg5/en/html/section.html"><code class="sgmltag-element">section</code></a> markup</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Keith Fahlgren: docbook.xsl; bin/spec/epub_realbook_spec.rb; bin/spec/files/orm.book.001.x&#8943;</code></p><pre class="screen"><span class="commit-message">Adding better support for covers in epub files destined for .mobi and the Kindle</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Keith Fahlgren: bin/dbtoepub; bin/lib/docbook.rb; bin/spec/files/DejaVuSerif.otf; docbook.&#8943;</code></p><pre class="screen"><span class="commit-message">Adding primitive support for embedding a single font</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Keith Fahlgren: bin/dbtoepub; bin/lib/docbook.rb; bin/spec/files/test_cust.xsl; bin/spec/e&#8943;</code></p><pre class="screen"><span class="commit-message">Adding support for user-specified customization layers in dbtoepub</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Keith Fahlgren: bin/dbtoepub; bin/spec/epub_regressions_spec.rb; bin/lib/docbook.rb; bin/s&#8943;</code></p><pre class="screen"><span class="commit-message">Adding CSS support to .epub target &amp; dbtoepub:
+ -c, --css [FILE] Use FILE for CSS on generated XHTML.
+
+
+DocBook::Epub
+...
+- should include a CSS <a href="http://docbook.org/tdg5/en/html/link.html"><code class="sgmltag-element">link</code></a> in HTML files when a CSS file has been provided
+- should include CSS file in .epub when a CSS file has been provided
+- should include a CSS <a href="http://docbook.org/tdg5/en/html/link.html"><code class="sgmltag-element">link</code></a> in OPF file when a CSS file has been provided</span></pre>
+</li></ul></div>
+</div>
+
+<div class="sect2" title="Roundtrip"><div class="titlepage"><div><div><h3 class="title"><a name="summary_V1.74.1_Roundtrip"></a>Roundtrip</h3></div></div></div>
+
+<p>The following changes have been made to the
+ <code class="filename">roundtrip</code> code
+ since the 1.74.0 release.</p>
+<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
+<p><code class="literal">Steve Ball: blocks2dbk.xsl; template.xml; template.dot</code></p><pre class="screen"><span class="commit-message">added support for imagedata-metadata
+added support for <a href="http://docbook.org/tdg5/en/html/table.html"><code class="sgmltag-element">table</code></a> as images</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Steve Ball: blocks2dbk.xsl; normalise2sections.xsl; sections2blocks.xsl</code></p><pre class="screen"><span class="commit-message">Improved support for <a href="http://docbook.org/tdg5/en/html/personname.html"><code class="sgmltag-element">personname</code></a> inlines.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Steve Ball: blocks2dbk.xsl; blocks2dbk.dtd; template.xml</code></p><pre class="screen"><span class="commit-message">Added support for <a href="http://docbook.org/tdg5/en/html/legalnotice.html"><code class="sgmltag-element">legalnotice</code></a>.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Steve Ball: blocks2dbk.xsl; wordml2normalise.xsl</code></p><pre class="screen"><span class="commit-message">added support for <a href="http://docbook.org/tdg5/en/html/orgname.html"><code class="sgmltag-element">orgname</code></a> in <a href="http://docbook.org/tdg5/en/html/author.html"><code class="sgmltag-element">author</code></a></span></pre>
+</li><li class="listitem">
+<p><code class="literal">Steve Ball: specifications.xml; supported.xml; blocks2dbk.xsl; wordml2normalise.xsl; dbk2w&#8943;</code></p><pre class="screen"><span class="commit-message">Updated specification.
+to-DocBook: add cols attribute to <a href="http://docbook.org/tdg5/en/html/tgroup.html"><code class="sgmltag-element">tgroup</code></a>
+from-DocBook: fix for <a href="http://docbook.org/tdg5/en/html/blockquote.html"><code class="sgmltag-element">blockquote</code></a> <a href="http://docbook.org/tdg5/en/html/title.html"><code class="sgmltag-element">title</code></a></span></pre>
+</li></ul></div>
+</div>
+
+<div class="sect2" title="Params"><div class="titlepage"><div><div><h3 class="title"><a name="summary_V1.74.1_Params"></a>Params</h3></div></div></div>
+
+<p>The following changes have been made to the <code class="filename">params</code> since the 1.74.0 release.</p>
+<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
+<p>The change was to add man.output.better.ps.enabled parameter, with
+its default value set to zero.
+
+If the value of the man.output.better.ps.enabled parameter is
+non-zero, certain markup is embedded in each generated man page
+such that PostScript output from the man -Tps <a href="http://docbook.org/tdg5/en/html/command.html"><code class="sgmltag-element">command</code></a> for that
+page will include a number of enhancements designed to improve the
+quality of that output.
+
+If man.output.better.ps.enabled is zero (the default), no such
+markup is embedded in generated man pages, and no enhancements are
+included in the PostScript output generated from those man pages
+by the man -Tps <a href="http://docbook.org/tdg5/en/html/command.html"><code class="sgmltag-element">command</code></a>.
+
+WARNING: The enhancements provided by this parameter rely on
+features that are specific to groff (GNU troff) and that are not
+part of "classic" AT&amp;T troff or any of its derivatives. Therefore,
+any man pages you generate with this parameter enabled will be
+readable only on systems on which the groff (GNU troff) program is
+installed, such as GNU/Linux systems. The pages will not not be
+readable on systems on with the classic troff (AT&amp;T troff) <a href="http://docbook.org/tdg5/en/html/command.html"><code class="sgmltag-element">command</code></a>
+is installed.
+
+NOTE: The value of this parameter only affects PostScript output
+generated from the man <a href="http://docbook.org/tdg5/en/html/command.html"><code class="sgmltag-element">command</code></a>. It has no effect on output
+generated using the FO backend.
+
+<a href="http://docbook.org/tdg5/en/html/tip.html"><code class="sgmltag-element">TIP</code></a>: You can generate PostScript output for any man page by
+running the following <a href="http://docbook.org/tdg5/en/html/command.html"><code class="sgmltag-element">command</code></a>:
+
+man FOO -Tps &gt; FOO.ps
+
+You can then generate PDF output by running the following <a href="http://docbook.org/tdg5/en/html/command.html"><code class="sgmltag-element">command</code></a>:
+
+ps2pdf FOO.ps</p>
+</li><li class="listitem">
+<p><code class="literal">Robert Stayton: writing.mode.xml</code></p><pre class="screen"><span class="commit-message">writing mode param used to set text direction.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: email.mailto.enabled.xml</code></p><pre class="screen"><span class="commit-message">Added new param <a href="http://docbook.sourceforge.net/release/xsl/current/doc/fo/email.mailto.enabled.html"><em class="parameter"><code>email.mailto.enabled</code></em></a> for FO output.
+Patch from Paolo Borelli. Closes #2086321.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Jirka Kosek: highlight.source.xml; highlight.xslthl.config.xml</code></p><pre class="screen"><span class="commit-message">Upgraded to support the latest version of XSLTHL 2.0
+ -- nested markup in highlited code is now processed
+ -- it is no longer needed to specify path XSLTHL configuration file using Java property
+ -- support for new languages, including Perl, Python and Ruby was added</span></pre>
+</li></ul></div>
+</div>
+
+<div class="sect2" title="Highlighting"><div class="titlepage"><div><div><h3 class="title"><a name="summary_V1.74.1_Highlighting"></a>Highlighting</h3></div></div></div>
+
+<p>The following changes have been made to the
+ <code class="filename">highlighting</code> code
+ since the 1.74.0 release.</p>
+<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
+<p><code class="literal">Jirka Kosek: cpp-hl.xml; c-hl.xml; tcl-hl.xml; php-hl.xml; common.xsl; perl-hl.xml; delphi&#8943;</code></p><pre class="screen"><span class="commit-message">Upgraded to support the latest version of XSLTHL 2.0
+ -- nested markup in highlited code is now processed
+ -- it is no longer needed to specify path XSLTHL configuration file using Java property
+ -- support for new languages, including Perl, Python and Ruby was added</span></pre>
+</li></ul></div>
+</div>
+
+</div>
+
+
+<div class="sect1" title="Release Notes: 1.74.0"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="V1.74.0"></a>Release Notes: 1.74.0</h2></div></div></div>
+
+<p>This release includes important bug fixes and adds the following
+significant feature changes:
+</p><div class="variablelist"><dl><dt><span class="term">.epub target</span></dt><dd><p>Paul Norton (Adobe) and Keith Fahlgren(O'Reilly Media) have donated code that generates <code class="filename">.epub</code> documents from
+DocBook input. An alpha-reference implementation in Ruby has also been provided.</p>
+<p>.epub is an open standard of the The International Digital Publishing Forum (IDPF),
+a the trade and standards association for the digital publishing industry. </p>
+<p>Read more about this target in <code class="filename">epub/README</code>
+</p></dd><dt><span class="term">XHTML 1.1 target</span></dt><dd><p>To support .epub output, a strict XHTML 1.1 target has been added. The stylesheets for this output are
+generated and are quite similar to the XHTML target.</p></dd><dt><span class="term">Gentext updates</span></dt><dd><p>A number of locales have been updated.</p></dd><dt><span class="term">Roundtrip improvements</span></dt><dd><p>Table, figure, template syncronization, and character style improvements have been made for WordML &amp; Pages. Support added for OpenOffice.org.</p></dd><dt><span class="term">First implementation of a libxslt extension</span></dt><dd>
+ <p>A stylesheet extension for libxslt, written in Python, has been added.
+ The extension is a function for adjusting column widths in CALS tables. See
+ <code class="filename">extensions/README.LIBXSLT</code> for more information.</p>
+ </dd></dl></div><p>
+</p>
+<p>The following is a list of changes that have been made
+ since the 1.73.2 release.</p>
+
+<div class="sect2" title="Gentext"><div class="titlepage"><div><div><h3 class="title"><a name="V1.74.0_Gentext"></a>Gentext</h3></div></div></div>
+
+<p>The following changes have been made to the
+ <code class="filename">gentext</code> code
+ since the 1.73.2 release.</p>
+<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: locale/id.xml</code></p><pre class="screen"><span class="commit-message">Checked in changes to Indonesion locale submitted by Euis Luhuanam a long time ago.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: locale/lt.xml</code></p><pre class="screen"><span class="commit-message">Added changes to Lithuanian locate submitted a long time back by Nikolajus Krauklis.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: locale/hu.xml</code></p><pre class="screen"><span class="commit-message">fixed error in lowercase.alpha definition in Hungarian locale</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: locale/nb.xml</code></p><pre class="screen"><span class="commit-message">Corrected language code for nb locale, and restored missing "startquote" key.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: locale/ja.xml</code></p><pre class="screen"><span class="commit-message">Committed changes to ja locale file, from Akagi Kobayashi. Adds bracket quotes around many xref instances that did not have them
+before.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: Makefile</code></p><pre class="screen"><span class="commit-message">"no" locale is now "nb"</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: locale/nb.xml</code></p><pre class="screen"><span class="commit-message">Update Norwegian Bokmål translation. Thanks to Hans F. Nordhaug.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: locale/no.xml; locale/nb.xml</code></p><pre class="screen"><span class="commit-message">per message from Hans F. Nordhaug, correct identifier for
+Norwegian Bokmål is "nb" (not "no") and has been for quite some
+time now...</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: locale/ja.xml</code></p><pre class="screen"><span class="commit-message">Converted ja.xml source file to use real unicode characters so
+that the actual glyphs so up when you edit it in a text editor
+(instead of the character references).</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: locale/ja.xml</code></p><pre class="screen"><span class="commit-message">Checked in changes to ja.xml locale file. Thanks to Akagi Kobayashi.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: locale/it.xml</code></p><pre class="screen"><span class="commit-message">Changes from Federico Zenith</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Dongsheng Song: locale/zh_cn.xml</code></p><pre class="screen"><span class="commit-message">Added missing translations.</span></pre>
+</li></ul></div>
+</div>
+
+<div class="sect2" title="Common"><div class="titlepage"><div><div><h3 class="title"><a name="V1.74.0_Common"></a>Common</h3></div></div></div>
+
+<p>The following changes have been made to the
+ <code class="filename">common</code> code
+ since the 1.73.2 release.</p>
+<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: l10n.xsl</code></p><pre class="screen"><span class="commit-message">Added new template "l10.language.name" for retrieving the
+English-language name of the lang setting of the current document.
+Closes #1916837. Thanks to Simon Kennedy.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: refentry.xsl</code></p><pre class="screen"><span class="commit-message">fixed syntax error</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: refentry.xsl</code></p><pre class="screen"><span class="commit-message">fixed a couple of typos</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: refentry.xsl</code></p><pre class="screen"><span class="commit-message">refined handling of cases where refentry "source" or "manual"
+metadata is missing or when we use fallback content instead. We
+now report a Warning if we use fallback content.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: refentry.xsl</code></p><pre class="screen"><span class="commit-message">don't use refmiscinfo@class=date value as fallback for refentry
+"source" or "manual" metadata fields</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: refentry.xsl</code></p><pre class="screen"><span class="commit-message">Made reporting of missing refentry metadata more quiet:
+
+ - we no longer report anything if usable-but-not-preferred
+ metadata is found; we just quietly use whatever we manage to
+ find
+
+ - we now only report missing "source" metadata if the refentry
+ is missing BOTH "source name" and "version" metadata; if it
+ has one but not the other, we use whichever one it has and
+ don't report anything as missing
+
+The above changes were made because testing with some "real world"
+source reveals that some authors are intentionally choosing to use
+"non preferred" markup for some metadata, and also choosing to
+omit "source name" or "version" metadata in there DocBook XML. So
+it does no good to give them pedantic reminders about what they
+already know...
+
+Also, changed code to cause "fixme" text to be inserted in output
+in particular cases:
+
+ - if we can't manage to find any "source" metadata at all, we
+ now put fixme text into the output
+
+ - if we can't manage to find any "manual" metadata a all, we
+ now put fixme text into the output
+
+The "source" and "manual" metadata is necessary information, so
+buy putting the fixme stuff in the output, we alert users to the
+need problem of it being missing.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: refentry.xsl</code></p><pre class="screen"><span class="commit-message">When generating manpages output, we no longer report anything if
+the refentry source is missing date or pubdate content. In
+practice, many users intentionally omit the date from the source
+because they explicitly want it to be generated.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: l10n.xml</code></p><pre class="screen"><span class="commit-message">further change needed for switch from no locale to nb.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: common.xsl</code></p><pre class="screen"><span class="commit-message">Added support for orgname in authorgroup. Thanks to Camille
+Bégnis.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: Makefile</code></p><pre class="screen"><span class="commit-message">"no" locale is now "nb"</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Mauritz Jeanson: stripns.xsl</code></p><pre class="screen"><span class="commit-message">Removed the template matching "ng:link|db:link" (in order to make @xlink:show
+work with &lt;link&gt; elements). As far as I can tell, this template is no longer needed.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Mauritz Jeanson: entities.ent</code></p><pre class="screen"><span class="commit-message">Moved declaration of comment.block.parents entity to common/entities.ent.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Mauritz Jeanson: titles.xsl</code></p><pre class="screen"><span class="commit-message">Added an update the fix made in revision 7528 (handling of xref/link in no.anchor.mode mode).
+Having xref in title is not a problem as long as the target is not an ancestor element.
+Closes bug #1838136.
+
+Note that an xref that is in a title and whose target is an ancestor element is still not
+rendered in the TOC. This could be considered a bug, but on the other hand I cannot really
+see the point in having such an xref in a document.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Mauritz Jeanson: titles.xsl</code></p><pre class="screen"><span class="commit-message">Added a "not(ancestor::title)" test to work around "too many nested
+apply-templates" problems when processing xrefs or links in no.anchor.mode mode.
+Hopefully, this closes bug #1811721.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Mauritz Jeanson: titles.xsl</code></p><pre class="screen"><span class="commit-message">Removed old template matching "link" in no.anchor.mode mode.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Mauritz Jeanson: titles.xsl</code></p><pre class="screen"><span class="commit-message">Process &lt;link&gt; in no.anchor.mode mode with the same template as &lt;xref&gt;.
+Closes bug #1759205 (Empty link in no.anchor.mode mode).</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Mauritz Jeanson: titles.xsl</code></p><pre class="screen"><span class="commit-message">In no.anchor.mode mode, do not output anchors for elements that are descendants
+of &lt;title&gt;. Previously, having inline elements with @id/@xml:id in &lt;title&gt;s
+resulted in anchors both in the TOC and in the main flow. Closes bug #1797492.</span></pre>
+</li></ul></div>
+</div>
+
+<div class="sect2" title="FO"><div class="titlepage"><div><div><h3 class="title"><a name="V1.74.0_FO"></a>FO</h3></div></div></div>
+
+<p>The following changes have been made to the
+ <code class="filename">fo</code> code
+ since the 1.73.2 release.</p>
+<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"> <p><code class="literal">Mauritz Jeanson: pi.xsl</code></p><pre class="screen"><span class="commit-message">Updated documentation for keep-together.</span></pre> </li><li class="listitem"> <p><code class="literal">Mauritz Jeanson: task.xsl</code></p><pre class="screen"><span class="commit-message">Enabled use of the keep-together PI on <a href="http://docbook.org/tdg5/en/html/task.html"><code class="sgmltag-element">task</code></a> elements.</span></pre> </li><li class="listitem">
+<p><code class="literal">Robert Stayton: index.xsl</code></p><pre class="screen"><span class="commit-message">FOP1 requires fo:wrapper for inline index entries, not fo:inline.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Robert Stayton: index.xsl</code></p><pre class="screen"><span class="commit-message">Fixed non-working inline.or.block template for indexterm wrappers.
+Add fop1 to list of processors using inline.or.block.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Mauritz Jeanson: table.xsl</code></p><pre class="screen"><span class="commit-message">Fixed bug #1891965 (colsep in entytbl not working).</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Mauritz Jeanson: titlepage.xsl</code></p><pre class="screen"><span class="commit-message">Added support for title in revhistory. Closes bug #1842847.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Mauritz Jeanson: pi.xsl</code></p><pre class="screen"><span class="commit-message">Small doc cleanup (dbfo float-type).</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Mauritz Jeanson: titlepage.xsl</code></p><pre class="screen"><span class="commit-message">Insert commas between multiple copyright holders.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Mauritz Jeanson: autotoc.xsl; division.xsl</code></p><pre class="screen"><span class="commit-message">Added modifications to support nested set elements. See bug #1853172.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">David Cramer: glossary.xsl</code></p><pre class="screen"><span class="commit-message">Added normalize-space to xsl:sorts to avoid missorting of glossterms due to stray leading spaces.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">David Cramer: glossary.xsl</code></p><pre class="screen"><span class="commit-message">Fixed bug #1854199: glossary.xsl should use the sortas attribute on glossentry</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Mauritz Jeanson: inline.xsl</code></p><pre class="screen"><span class="commit-message">Added a template for citebiblioid. The hyperlink target is the parent of the referenced biblioid,
+and the "hot text" is the biblioid itself enclosed in brackets.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Mauritz Jeanson: inline.xsl</code></p><pre class="screen"><span class="commit-message">Moved declaration of comment.block.parents entity to common/entities.ent.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Mauritz Jeanson: docbook.xsl</code></p><pre class="screen"><span class="commit-message">Updated message about unmatched element.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Mauritz Jeanson: param.xweb</code></p><pre class="screen"><span class="commit-message">Added link to profiling chapter of TCG.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Mauritz Jeanson: refentry.xsl</code></p><pre class="screen"><span class="commit-message">Fixed typo (refsynopsysdiv -&gt; refsynopsisdiv).</span></pre>
+</li><li class="listitem">
+<p><code class="literal">David Cramer: fop.xsl; fop1.xsl; ptc.xsl; xep.xsl</code></p><pre class="screen"><span class="commit-message">Added test to check generate.index param when generating pdf bookmarks</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Mauritz Jeanson: graphics.xsl</code></p><pre class="screen"><span class="commit-message">Added support for MathML in imagedata.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: math.xsl</code></p><pre class="screen"><span class="commit-message">Removed unnecessary extra test condition in test express that
+checks for passivetex.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: math.xsl</code></p><pre class="screen"><span class="commit-message">Don't use fo:instream-foreign-object if we are processing with
+passivetex. Closes #1806899. Thanks to Justus Piater.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Mauritz Jeanson: component.xsl</code></p><pre class="screen"><span class="commit-message">Added code to output a TOC for an appendix in an article when
+generate.toc='article/appendix toc'. Closes bug #1669658.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Dongsheng Song: biblio-iso690.xsl</code></p><pre class="screen"><span class="commit-message">Change encoding from "windows-1250" to "UTF-8".</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Mauritz Jeanson: pi.xsl</code></p><pre class="screen"><span class="commit-message">Updated documentation for dbfo_label-width.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Mauritz Jeanson: lists.xsl</code></p><pre class="screen"><span class="commit-message">Added support for the dbfo_label-width PI in calloutlists.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Robert Stayton: biblio.xsl</code></p><pre class="screen"><span class="commit-message">Support finding glossary database entries inside bibliodivs.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Robert Stayton: formal.xsl</code></p><pre class="screen"><span class="commit-message">Complete support for &lt;?dbfo pgwide="1"?&gt; for informal
+elements too.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Mauritz Jeanson: table.xsl</code></p><pre class="screen"><span class="commit-message">In the table.block template, added a check for the dbfo_keep-together PI, so that
+a table may break (depending on the PI value) at a page break. This was needed
+since the outer fo:block that surrounds fo:table has keep-together.within-column="always"
+by default, which prevents the table from breaking. Closes bug #1740964 (Titled
+table does not respect dbfo PI).</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Mauritz Jeanson: pi.xsl</code></p><pre class="screen"><span class="commit-message">Added a few missing @role="tcg".</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Mauritz Jeanson: inline.xsl</code></p><pre class="screen"><span class="commit-message">Use normalize-space() in glossterm comparisons (as in html/inline.xsl).</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Mauritz Jeanson: autoidx.xsl</code></p><pre class="screen"><span class="commit-message">Removed the [&amp;scope;] predicate from the target variable in the template with name="reference".
+This filter was the cause of missing index backlinks when @zone and @type were used on indexterms,
+with index.on.type=1. Closes bug #1680836.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: inline.xsl; xref.xsl; footnote.xsl</code></p><pre class="screen"><span class="commit-message">Added capability in FO output for displaying URLs for all
+hyperlinks (elements marked up with xlink:href attributes) in the
+same way as URLs for ulinks are already handled (which is to say,
+either inline or as numbered footnotes).
+
+Background on this change:
+DocBook 5 allows "ubiquitous" linking, which means you can make
+any element a hyperlink just by adding an xlink:href attribute to
+it, with the value set to an external URL. That's in contrast to
+DocBook 4, which only allows you to use specific elements (e.g.,
+the link and ulink elements) to mark up hyperlinks.
+
+The existing FO stylesheets have a mechanism for handling display
+of URLs for hyperlinks that are marked up with ulink, but they did
+not handle display of URLs for elements that were marked up with
+xlink:href attributes. This change adds handling for those other
+elements, enabling the URLs they link to be displayed either
+inline or as numbered footnotes (depending on what values the user
+has the ulink.show and ulink.footnotes params set to).
+
+Note that this change only adds URL display support for elements
+that call the simple.xlink template -- which currently is most
+(but not all) inline elements.
+
+This change also moves the URL display handling out of the ulink
+template and into a new "hyperlink.url.display" named template;
+the ulink template and the simple.xlink named template now both
+call the hyperlink.url.display template.
+
+Warning: In the stylesheet code that determines what footnote
+number to assign to each footnote or external hyperlink, there is
+an XPath expression for determining whether a particular
+xlink:href instance is an external hyperlink; that expression is
+necessarily a bit complicated and further testing may reveal that
+it doesn't handle all cases as expected -- so some refinements to
+it may need to be done later.
+
+Closes #1785519. Thanks to Ken Morse for reporting and
+troubleshooting the problem.</span></pre>
+</li></ul></div>
+</div>
+
+<div class="sect2" title="HTML"><div class="titlepage"><div><div><h3 class="title"><a name="V1.74.0_HTML"></a>HTML</h3></div></div></div>
+
+<p>The following changes have been made to the
+ <code class="filename">html</code> code
+ since the 1.73.2 release.</p>
+<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"> <p><code class="literal">Keith Fahlgren: inline.xsl; synop.xsl</code></p><pre class="screen"><span class="commit-message">Work to make HTML and XHTML targets more valid</span></pre> </li><li class="listitem"> <p><code class="literal">Keith Fahlgren: table.xsl</code></p><pre class="screen"><span class="commit-message">Add better handling for tables that have footnotes in the titles</span></pre> </li><li class="listitem"> <p><code class="literal">Keith Fahlgren: biblio.xsl</code></p><pre class="screen"><span class="commit-message">Add anchors to bibliodivs</span></pre> </li><li class="listitem">
+<p><code class="literal">Keith Fahlgren: formal.xsl; Makefile; htmltbl.xsl</code></p><pre class="screen"><span class="commit-message">Initial checkin/merge of epub target from work provided by Paul Norton of Adobe
+and Keith Fahlgren of O'Reilly.</span></pre>
+<p>This change includes new code for generating the XHTML 1.1 target sanely.</p>
+</li><li class="listitem">
+<p><code class="literal">Mauritz Jeanson: biblio.xsl</code></p><pre class="screen"><span class="commit-message">Added code for creating URLs from biblioids with @class="doi" (representing Digital
+Object Identifiers). See FR #1934434 and http://doi.org.
+
+To do: 1) Add support for FO output. 2) Figure out how @class="doi" should be handled
+for bibliorelation, bibliosource and citebiblioid.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Norman Walsh: formal.xsl</code></p><pre class="screen"><span class="commit-message">Don't use xsl:copy because it forces the resulting element to be in the same namespace as the source element; in the XHTML stylesheets, that's wrong. But the HTML-to-XHTML converter does the right thing with literal result elements, so use one of them.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: Makefile</code></p><pre class="screen"><span class="commit-message">Added checks and hacks to various makefiles to enable building
+under Cygwin. This stuff is ugly and maybe not worth the mess and
+trouble, but does seem to work as expected and not break anything
+else.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: docbook.xsl</code></p><pre class="screen"><span class="commit-message">added "exslt" namespace binding to html/docbook.xsl file (in
+addition to existing "exsl" binding. reason is because lack of it
+seems to cause processing problems when using the profiled
+version of the stylsheet</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Norman Walsh: chunk-common.xsl</code></p><pre class="screen"><span class="commit-message">Rename link</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Mauritz Jeanson: table.xsl</code></p><pre class="screen"><span class="commit-message">Added a fix to make rowsep apply to the last row of thead in entrytbl.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: synop.xsl</code></p><pre class="screen"><span class="commit-message">Simplified and streamlined handling of output for ANSI-style
+funcprototype output, to correct a problem that was causing type
+data to be lost in the output parameter definitions. For example,
+for an instance like this:
+ &lt;paramdef&gt;void *&lt;parameter&gt;dataptr&lt;/parameter&gt;[]&lt;/paramdef&gt;
+... the brackets (indicating an array type) were being dropped.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: synop.xsl</code></p><pre class="screen"><span class="commit-message">Changed HTML handling of K&amp;R-style paramdef output. The parameter
+definitions are no longer output in a table (though the prototype
+still is). The reason for the change is that the
+kr-tabular-funcsynopsis-mode template was causing type data to be
+lost in the output parameter definitions. For example, for an
+instance like this:
+ &lt;paramdef&gt;void *&lt;parameter&gt;dataptr&lt;/parameter&gt;[]&lt;/paramdef&gt;
+... the brackets (indicating an array type) were being dropped.
+The easiest way to deal with the problem is to not try to chop up
+the parameter definitions and display them in table format, but to
+instead just output them as-is. May not look quite as pretty, but
+at least we can be sure no information is being lost...</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: pi.xsl</code></p><pre class="screen"><span class="commit-message">updated wording of doc for funcsynopsis-style PI</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: param.xweb; param.ent; synop.xsl</code></p><pre class="screen"><span class="commit-message">Removed the funcsynopsis.tabular.threshold param. It's no longer
+being used in the code and hasn't been since mid 2006.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Mauritz Jeanson: graphics.xsl</code></p><pre class="screen"><span class="commit-message">Added support for the img.src.path parameter for SVG graphics. Closes bug #1888169.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Mauritz Jeanson: chunk-common.xsl</code></p><pre class="screen"><span class="commit-message">Added missing space.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Norman Walsh: component.xsl</code></p><pre class="screen"><span class="commit-message">Fix bug where component titles inside info elements were not handled properly</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: pi.xsl</code></p><pre class="screen"><span class="commit-message">Moved dbhtml_stop-chunking embedded doc into alphabetical order,
+fixed text of TCG section it see-also'ed.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">David Cramer: pi.xsl</code></p><pre class="screen"><span class="commit-message">Added support for &lt;?dbhtml stop-chunking?&gt; processing instruction</span></pre>
+</li><li class="listitem">
+<p><code class="literal">David Cramer: chunk-common.xsl; pi.xsl</code></p><pre class="screen"><span class="commit-message">Added support for &lt;?dbhtml stop-chunking?&gt; processing instruction</span></pre>
+</li><li class="listitem">
+<p><code class="literal">David Cramer: glossary.xsl</code></p><pre class="screen"><span class="commit-message">Fixed bug #1854199: glossary.xsl should use the sortas attribute on glossentry. Also added normalize-space to avoid missorting due to stray leading spaces.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Mauritz Jeanson: inline.xsl</code></p><pre class="screen"><span class="commit-message">Added a template for citebiblioid. The hyperlink target is the parent of the referenced biblioid,
+and the "hot text" is the biblioid itself enclosed in brackets.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Mauritz Jeanson: inline.xsl</code></p><pre class="screen"><span class="commit-message">Added support for @xlink:show in the simple.xlink template. The "new" and "replace"
+values are supported (corresponding to values of "_blank" and "_top" for the
+ulink.target parameter). I have assumed that @xlink:show should override ulink.target
+for external URI links. This closes bugs #1762023 and #1727498.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Mauritz Jeanson: inline.xsl</code></p><pre class="screen"><span class="commit-message">Moved declaration of comment.block.parents entity to common/entities.ent.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Mauritz Jeanson: param.xweb</code></p><pre class="screen"><span class="commit-message">Added link to profiling chapter of TCG.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Dongsheng Song: biblio-iso690.xsl</code></p><pre class="screen"><span class="commit-message">Change encoding from "windows-1250" to "UTF-8".</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Robert Stayton: biblio.xsl</code></p><pre class="screen"><span class="commit-message">Add support in biblio collection to entries in bibliodivs.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Mauritz Jeanson: pi.xsl</code></p><pre class="screen"><span class="commit-message">Added missing @role="tcg".</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Mauritz Jeanson: chunk-common.xsl; titlepage.xsl</code></p><pre class="screen"><span class="commit-message">Refactored legalnotice/revhistory chunking, so that the use.id.as.filename
+parameter as well as the dbhtml_filename PI are taken into account. A new named
+template in titlepage.xsl is used to compute the filename.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Mauritz Jeanson: chunk-common.xsl; titlepage.xsl</code></p><pre class="screen"><span class="commit-message">An update to the fix for bug #1790495 (r7433):
+The "ln-" prefix is output only when the legalnotice doesn't have an
+@id/@xml:id, in which case the stylesheets generate an ID value,
+resulting in a filename like "ln-7e0fwgj.html". This is useful because
+without the prefix, you wouldn't know that the file contained a legalnotice.
+The same logic is also applied to revhistory, using an "rh-" prefix.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Mauritz Jeanson: autoidx.xsl</code></p><pre class="screen"><span class="commit-message">Removed the [&amp;scope;] predicate from the target variable in the template with name="reference".
+This filter was the cause of missing index backlinks when @zone and @type were used on indexterms,
+with index.on.type=1. Closes bug #1680836.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Mauritz Jeanson: titlepage.xsl</code></p><pre class="screen"><span class="commit-message">Added 'ln-' prefix to the name of the legalnotice chunk, in order to match the
+&lt;link href"..."&gt; that is output by make.legalnotice.head.links (chunk-common.xsl).
+Modified the href attribute on the legalnotice link.
+Closes bug #1790495.</span></pre>
+</li></ul></div>
+</div>
+
+<div class="sect2" title="Manpages"><div class="titlepage"><div><div><h3 class="title"><a name="V1.74.0_Manpages"></a>Manpages</h3></div></div></div>
+
+<p>The following changes have been made to the
+ <code class="filename">manpages</code> code
+ since the 1.73.2 release.</p>
+<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: other.xsl</code></p><pre class="screen"><span class="commit-message">slightly adjusted spacing around admonition markers</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: refentry.xsl; utility.xsl</code></p><pre class="screen"><span class="commit-message">make sure refsect3 titles are preceded by a line of space, and
+make the indenting of their child content less severe</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: block.xsl</code></p><pre class="screen"><span class="commit-message">only indent verbatim environments in TTY output, not in non-TTY/PS</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: block.xsl</code></p><pre class="screen"><span class="commit-message">made another adjustment to correct vertical alignment of admonition marker</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: block.xsl; other.xsl</code></p><pre class="screen"><span class="commit-message">Adjusted/corrected alignment of adominition marker in PS/non-TTY output.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: endnotes.xsl</code></p><pre class="screen"><span class="commit-message">For PS/non-TTY output, display footnote/endnote numbers in
+superscript.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: table.xsl; synop.xsl; utility.xsl</code></p><pre class="screen"><span class="commit-message">Changed handling of hanging indents for cmdsynopsis, funcsynopsis,
+and synopfragment such that they now look correct in non-TTY/PS
+output. We now use the groff \w escape to hang by the actual width
+-- in the current font -- of the command, funcdef, or
+synopfragment references number (as opposed to hanging by the
+number of characters). This rendering in TTY output remains the
+same, since the width in monospaced TTY output is the same as the
+number of characters.
+
+Also, created new synopsis-block-start and synopsis-block-end
+templates to use for cmdsynopsis and funcsynopsis instead of the
+corresponding verbatim-* templates.
+
+Along with those changes, also corrected a problem that caused the
+content of synopfragment to be dropped, and made a
+vertical-spacing change to adjust spacing around table titles and
+among sibling synopfragment instances.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: other.xsl</code></p><pre class="screen"><span class="commit-message">use common l10.language.name template to retrieve English-language name</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: synop.xsl; inline.xsl</code></p><pre class="screen"><span class="commit-message">added comment in code explaining why we don't put filename output
+in italic (despite the fact that man guidelines say we should)</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: inline.xsl</code></p><pre class="screen"><span class="commit-message">put filename output in monospace instead of italic</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: synop.xsl</code></p><pre class="screen"><span class="commit-message">put cmdsynopsis in monospace</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: inline.xsl</code></p><pre class="screen"><span class="commit-message">removed template match for literal. template matches for monospace
+inlines are all imported from the HTML stylesheet</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: block.xsl</code></p><pre class="screen"><span class="commit-message">don't indent verbatim environments that are descendants of
+refsynopsisdiv, not put backgrounds behind them</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: inline.xsl</code></p><pre class="screen"><span class="commit-message">set output of the literal element in monospace. this causes all
+inline monospace instances in the git man pages to be set in
+monospace (since DocBook XML source for git docs is generated with
+asciidoc and asciidoc consistently outputs only &lt;literal&gt; for
+inline monospace (not &lt;command&gt; or &lt;code&gt; or anything else).
+Of course this only affects non-TTY output...</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: utility.xsl</code></p><pre class="screen"><span class="commit-message">Added inline.monoseq named template.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: utility.xsl</code></p><pre class="screen"><span class="commit-message">don't bother using a custom register to store the previous
+font-family value when setting blocks of text in code font; just
+use \F[] .fam with no arg to switch back</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: endnotes.xsl</code></p><pre class="screen"><span class="commit-message">put links in blue in PS output (note that this matches how groff
+renders content marked up with the .URL macro)</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: endnotes.xsl; param.xweb; param.ent</code></p><pre class="screen"><span class="commit-message">removed man.links.are.underlined and added man.font.links. Also,
+changed the default font formatting for links to bold.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: endnotes.xsl; param.xweb; param.ent</code></p><pre class="screen"><span class="commit-message">Added new param man.base.url.for.relative.links .. specifies a
+base URL for relative links (for ulink, @xlink:href, imagedata,
+audiodata, videodata) shown in the generated NOTES section of
+man-page output. The value of man.base.url.for.relative.links is
+prepended to any relative URI that is a value of ulink url,
+xlink:href, or fileref attribute.
+
+If you use relative URIs in link sources in your DocBook refentry
+source, and you leave man.base.url.for.relative.links unset, the
+relative links will appear "as is" in the NOTES section of any
+man-page output generated from your source. That's probably not
+what you want, because such relative links are only usable in the
+context of HTML output. So, to make the links meaningful and
+usable in the context of man-page output, set a value for
+man.base.url.for.relative.links that points
+to the online version of HTML output generated from your DocBook
+refentry source. For example:
+
+ &lt;xsl:param name="man.base.url.for.relative.links"
+ &gt;http://www.kernel.org/pub/software/scm/git/docs/&lt;/xsl:param&gt;</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: info.xsl</code></p><pre class="screen"><span class="commit-message">If a source refentry contains a Documentation or DOCUMENTATION
+section, don't report it as having missing AUTHOR information.
+Also, if missing a contrib/personblurb for a person or org, report
+pointers to http://docbook.sf.net/el/personblurb and to
+http://docbook.sf.net/el/contrib</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: info.xsl</code></p><pre class="screen"><span class="commit-message">If we encounter an author|editor|othercredit instance that lacks a
+personblurb or contrib, report it to the user (because that means
+we have no information about that author|editor|othercredit to
+display in the generated AUTHOR|AUTHORS section...)</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: info.xsl; docbook.xsl; other.xsl</code></p><pre class="screen"><span class="commit-message">if we can't find any usable author data, emit a warning and insert
+a fixme in the output</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: info.xsl</code></p><pre class="screen"><span class="commit-message">fixed bug in indenting of output for contrib instances in AUTHORS
+section. Thanks to Daniel Leidert and the fglrx docs for exposing
+the bug.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: block.xsl</code></p><pre class="screen"><span class="commit-message">for a para or simpara that is the first child of a callout,
+suppress the .sp or .PP that would normally be output (because in
+those cases, the output goes into a table cell, and the .sp or .PP
+markup causes a spurious linebreak before it when displayed</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: lists.xsl</code></p><pre class="screen"><span class="commit-message">Added support for rendering co callouts and calloutlist instances.
+So you can now use simple callouts -- marking up programlisting
+and such with co instances -- and have the callouts displayed in
+man-page output. ("simple callouts" means using co@id and
+callout@arearefs pointing to co@id instances; in man/roff output,
+we can't/don't support markup that uses areaset and area)</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: block.xsl</code></p><pre class="screen"><span class="commit-message">only put a line of space after a verbatim if it's followed by a
+text node or a paragraph</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: utility.xsl</code></p><pre class="screen"><span class="commit-message">put verbatim environments in slightly smaller font in non-TTY
+output</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: lists.xsl</code></p><pre class="screen"><span class="commit-message">minor whitespace-only reformatting of lists.xsl source</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: lists.xsl</code></p><pre class="screen"><span class="commit-message">Made refinements/fixes to output of orderedlist and itemizedlist
+-- in part, to get mysql man pages to display correctly. This
+change causes a "\c" continuation marker to be added between
+listitem markers and contents (to ensure that the content remains
+on the same line as the marker when displayed)</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: block.xsl</code></p><pre class="screen"><span class="commit-message">put a line of vertical space after all verbatim output that has
+sibling content following it (not just if that sibling content is
+a text node)</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: block.xsl</code></p><pre class="screen"><span class="commit-message">refined spacing around titles for admonitions</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: block.xsl; other.xsl</code></p><pre class="screen"><span class="commit-message">Deal with case of verbatim environments that have a linebreak
+after the opening tag. Assumption is that users generally don't
+want that linebreak to appear in output, so we do some groff
+hackery to mess with vertical spacing and close the space.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: inline.xsl</code></p><pre class="screen"><span class="commit-message">indexterm instances now produce groff comments like this:
+
+ .\" primary: secondary: tertiary
+
+remark instances, if non-empty, now produce groff comments</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: charmap.groff.xsl; other.xsl</code></p><pre class="screen"><span class="commit-message">convert no-break space character to groff "\ \&amp;" (instead of just
+"\ "). the reason is that if a space occurs at the end of a line,
+our processing causes it to be eaten. a real-world case of this is
+the mysql(1) man page. appending the "\&amp;" prevents that</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: block.xsl</code></p><pre class="screen"><span class="commit-message">output "sp" before simpara output, not after it (outputting it
+after results in undesirable whitespace in particular cases; for
+example, in the hg/mercurial docs</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: table.xsl; synop.xsl; utility.xsl</code></p><pre class="screen"><span class="commit-message">renamed from title-preamble to pinch.together and replaced "sp -1"
+between synopsis fragments with call to pinch.together instead</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: table.xsl</code></p><pre class="screen"><span class="commit-message">use title-preamble template for table titles (instead of "sp -1"
+hack), and "sp 1" after all tables (instead of just "sp"</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: utility.xsl</code></p><pre class="screen"><span class="commit-message">created title-preamble template for suppressing line spacing after
+headings</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: info.xsl</code></p><pre class="screen"><span class="commit-message">further refinement of indenting in AUTHORS section</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: block.xsl; other.xsl</code></p><pre class="screen"><span class="commit-message">refined handling of admonitions</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: lists.xsl</code></p><pre class="screen"><span class="commit-message">Use RS/RE in another place where we had IP ""</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: info.xsl</code></p><pre class="screen"><span class="commit-message">Replace (ab)use of IP with "sp -1" in AUTHORS section with RS/RE
+instead.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: table.xsl; synop.xsl; info.xsl</code></p><pre class="screen"><span class="commit-message">changed all instances of ".sp -1n" to ".sp -1"</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: other.xsl</code></p><pre class="screen"><span class="commit-message">add extra line before SH heads only in non-TTY output</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: block.xsl</code></p><pre class="screen"><span class="commit-message">Reworked output for admonitions (caution, important, note, tip,
+warning). In TTY output, admonitions now get indented. In non-TTY
+output, a colored marker (yellow) is displayed next to them.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: other.xsl</code></p><pre class="screen"><span class="commit-message">Added BM/EM macros for putting a colored marker in margin next to
+a block of text.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: utility.xsl</code></p><pre class="screen"><span class="commit-message">created make.bold.title template by moving title-bolding part out
+from nested-section-title template. This allows the bolding to
+also be used by the template for formatting admonitions</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: info.xsl</code></p><pre class="screen"><span class="commit-message">put .br before copyright contents to prevent them from getting run in</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: refentry.xsl; other.xsl; utility.xsl</code></p><pre class="screen"><span class="commit-message">made point size of output for Refsect2 and Refsect3 heads bigger</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: other.xsl</code></p><pre class="screen"><span class="commit-message">put slightly more space between SH head and underline in non-TTY
+output</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: param.xweb; param.ent; other.xsl</code></p><pre class="screen"><span class="commit-message">Added the man.charmap.subset.profile.english parameter and refined
+the handling of charmap subsets to differentiate between English
+and non-English source.
+
+This way charmap subsets are now handled is this:
+
+If the value of the man.charmap.use.subset parameter is non-zero,
+and your DocBook source is not written in English (that is, if its
+lang or xml:lang attribute has a value other than en), then the
+character-map subset specified by the man.charmap.subset.profile
+parameter is used instead of the full roff character map.
+
+Otherwise, if the lang or xml:lang attribute on the root element
+in your DocBook source or on the first refentry element in your
+source has the value en or if it has no lang or xml:lang
+attribute, then the character-map subset specified by the
+man.charmap.subset.profile.english parameter is used instead of
+man.charmap.subset.profile.
+
+The difference between the two subsets is that
+man.charmap.subset.profile provides mappings for characters in
+Western European languages that are not part of the Roman
+(English) alphabet (ASCII character set).</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: other.xsl</code></p><pre class="screen"><span class="commit-message">Various updates, mainly related to uppercasing SH titles:
+
+ - added a "Language: " metadata line to the top comment area of
+ output man pages, to indicate the language the page is in
+
+ - added a "toupper" macro of doing locale-aware uppercasing of
+ SH titles and cross-references to SH titles; the mechanism
+ relies on the uppercase.alpha and lowercase.alpha DocBook
+ gentext keys to do locale-aware uppercasing based on the
+ language the page is written in
+
+ - added a "string.shuffle" template, which provides a library
+ function for "shuffling" two strings together into a single
+ string; it takes the first character for the first string, the
+ first character from second string, etc. The only current use
+ for it is to generate the argument for the groff tr request
+ that does string uppercasing.
+
+ - added make.tr.uppercase.arg and make.tr.normalcase.arg named
+ templates for use in generating groff code for uppercasing and
+ "normal"-casing SH titles
+
+ - made the BB/BE "background drawing" macros have effect only in
+ non-TTY output
+
+ - output a few comments in the top part of source</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: utility.xsl</code></p><pre class="screen"><span class="commit-message">removed some leftover kruft</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: refentry.xsl</code></p><pre class="screen"><span class="commit-message">To create the name(s) for each man page, we now replace any spaces
+in the refname(s) with underscores. This ensures that tools like
+lexgrog(1) will be able to parse the name (lexgrog won't parse
+names that contain spaces).</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: docbook.xsl</code></p><pre class="screen"><span class="commit-message">Put a comment into source of man page to indicate where the main
+content starts. (We now have a few of macro definitions at the
+start of the source, so putting this comment in helps those that
+might be viewing the source.)</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: refentry.xsl</code></p><pre class="screen"><span class="commit-message">refined mechanism for generating SH titles</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: charmap.groff.xsl</code></p><pre class="screen"><span class="commit-message">Added zcaron, Zcaron, scaron, and Scaron to the groff character map.
+This means that generated Finnish man pages will no longer contain
+any raw accented characters -- they'll instead by marked up with
+groff escapes.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: other.xsl; utility.xsl</code></p><pre class="screen"><span class="commit-message">corrected a regression I introduced about a year ago that caused
+dots to be output just as "\." -- instead needs to be "\&amp;." (which
+is what it will be now, after this change)</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: refentry.xsl</code></p><pre class="screen"><span class="commit-message">Changed backend handling for generating titles for SH sections and
+for cross-references to those sections. This should have no effect
+on TTY output (behavior should remain the same hopefully) but
+results in titles in normal case (instead of uppercase) in PS
+output.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: info.xsl</code></p><pre class="screen"><span class="commit-message">use make.subheading template to make subheadings for AUTHORS and
+COPYRIGHT sections (instead of harcoding roff markup)</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: block.xsl</code></p><pre class="screen"><span class="commit-message">put code font around programlisting etc.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: synop.xsl; docbook.xsl</code></p><pre class="screen"><span class="commit-message">embed custom macro definitions in man pages, plus wrap synopsis in
+code font</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: endnotes.xsl</code></p><pre class="screen"><span class="commit-message">use the make.subheading template to generated SH subheading for
+endnotes section.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: lists.xsl</code></p><pre class="screen"><span class="commit-message">Added some templates for generating if-then-else conditional
+markup in groff, so let's use those instead of hard-coding it in
+multiple places...</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: other.xsl; utility.xsl</code></p><pre class="screen"><span class="commit-message">Initial checkin of some changes related to making PS/PDF output
+from "man -l -Tps" look better. The current changes:
+
+ - render synopsis and verbatim sections in a monospace/code font
+
+ - put a light-grey background behind all programlisting, screen,
+ and literallayout instances
+
+ - prevent SH heads in PS output from being rendered in uppercase
+ (as they are in console output)
+
+ - also display xrefs to SH heads in PS output in normal case
+ (instead of uppercase)
+
+ - draw a line under SH heads in PS output
+
+The changes made to the code to support the above features were:
+
+ - added some embedded/custom macros: one for conditionally
+ upper-casing SH x-refs, one for redefining the SH macro
+ itself, with some conditional handling for PS output, and
+ finally a macro for putting a background/screen (filled box)
+ around a block of text (e.g., a program listing) in PS output
+
+ - added utility templates for wrapping blocks of text in code
+ font; also templates for inline code font</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Robert Stayton: refentry.xsl</code></p><pre class="screen"><span class="commit-message">refpurpose nodes now get apply-templates instead of just normalize-space().</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: lists.xsl</code></p><pre class="screen"><span class="commit-message">Fixed alignment of first lined of text for each listitem in
+orderedlist output for TTY. Existing code seemed to have been
+causing an extra undesirable space to appear.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: lists.xsl</code></p><pre class="screen"><span class="commit-message">Wrapped some roff conditionals around roff markup for orderedlist
+and itemizedlist output, so that the lists look acceptable in PS
+output as well as TTY.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: pi.xsl; synop.xsl; param.xweb; param.ent</code></p><pre class="screen"><span class="commit-message">Added the man.funcsynopsis.style parameter. Has the same effect in
+manpages output as the funcsynopsis.style parameter has in HTML
+output -- except that its default value is 'ansi' instead of 'kr'.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: synop.xsl</code></p><pre class="screen"><span class="commit-message">Reworked handling of K&amp;R funcprototype output. It no longer relies
+on the HTML kr-tabular templates, but instead just does direct
+transformation to roff. For K&amp;R output, it displays the paramdef
+output in an indented list following the prototype.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: synop.xsl</code></p><pre class="screen"><span class="commit-message">Properly integrated handling for K&amp;R output into manpages
+stylesheet. The choice between K&amp;R output and ANSI output is
+currently controlled through use of the (HTML) funcsynopsis.style
+parameter. Note that because the mechanism does currently rely on
+funcsynopsis.style, the default in manpages output is now K&amp;R
+(because that's the default of that param). But I suppose I ought
+to create a man.funcsynopsis.style and make the default for that
+ANSI (to preserve the existing default behavior).</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: docbook.xsl</code></p><pre class="screen"><span class="commit-message">added manpages/pi.xsl file</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: .cvsignore; pi.xsl</code></p><pre class="screen"><span class="commit-message">Added "dbman funcsynopsis-style" PI and incorporated it into the
+doc build.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: refentry.xsl</code></p><pre class="screen"><span class="commit-message">Fixed regression that caused an unescaped dash to be output
+between refname and refpurpose content. Closes bug #1894244.
+Thanks to Daniel Leidert.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: other.xsl</code></p><pre class="screen"><span class="commit-message">Fixed problem with dots being escaped in filenames of generated
+man files. Closes #1827195. Thanks to Daniel Leidert.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: inline.xsl</code></p><pre class="screen"><span class="commit-message">Added support for processing structfield (was appearing in roff
+output surrounded by HTML &lt;em&gt; tags; fixed so that it gets roff
+ital markup). Closes bug #1858329. Thanks to Sam Varshavchik.</span></pre>
+</li></ul></div>
+</div>
+
+<div class="sect2" title="Epub"><div class="titlepage"><div><div><h3 class="title"><a name="V1.74.0_Epub"></a>Epub</h3></div></div></div>
+
+<p>The following changes have been made to the
+ <code class="filename">epub</code> code
+ since the 1.73.2 release.</p>
+<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"> <p><code class="literal">Keith Fahlgren: bin/spec/README; bin/spec/epub_realbook_spec.rb</code></p><pre class="screen"><span class="commit-message">'Realbook' spec now passes</span></pre> </li><li class="listitem"> <p><code class="literal">Keith Fahlgren: bin/dbtoepub; README; bin/spec/README; bin/lib/docbook.rb; bin/spec/epub_r&#8943;</code></p><pre class="screen"><span class="commit-message">Very primitive Windows support for dbtoepub <a href="http://docbook.org/tdg5/en/html/reference.html"><code class="sgmltag-element">reference</code></a> implementation; README for running tests and for the .epub target in general; shorter realbook test document (still fails for now)</span></pre> </li><li class="listitem"> <p><code class="literal">Keith Fahlgren: bin/dbtoepub; bin/spec/epub_regressions_spec.rb; bin/lib/docbook.rb; bin/s&#8943;</code></p><pre class="screen"><span class="commit-message">Changes to OPF spine to not duplicate idrefs for documents with parts not at the root; regression specs for same</span></pre> </li><li class="listitem"> <p><code class="literal">Keith Fahlgren: docbook.xsl</code></p><pre class="screen"><span class="commit-message">Fixing linking to <a href="http://docbook.org/tdg5/en/html/cover.html"><code class="sgmltag-element">cover</code></a> @id, distinct from other needs of cover-image-id (again, thanks to Martin Goerner)</span></pre> </li><li class="listitem"> <p><code class="literal">Keith Fahlgren: docbook.xsl</code></p><pre class="screen"><span class="commit-message">Updating the <a href="http://docbook.org/tdg5/en/html/title.html"><code class="sgmltag-element">title</code></a> of the <a href="http://docbook.org/tdg5/en/html/toc.html"><code class="sgmltag-element">toc</code></a> element in the guide to be more explicit (thanks to Martin Goerner)</span></pre> </li><li class="listitem">
+<p><code class="literal">Keith Fahlgren: bin/spec/examples/amasque_exploded/content.opf; bin/spec/examples/amasque_&#8943;</code></p><pre class="screen"><span class="commit-message">Initial checkin/merge of epub target from work provided by Paul Norton of Adobe
+and Keith Fahlgren of O'Reilly.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Keith Fahlgren: docbook.xsl</code></p><pre class="screen"><span class="commit-message">== General epub test support
+
+$ spec -O ~/.spec.opts spec/epub_spec.rb
+
+DocBook::Epub
+- should be able to be created
+- should fail on a nonexistent file
+- should be able to render to a file
+- should create a file after rendering
+- should have the correct mimetype after rendering
+- should be valid .epub after rendering an article
+- should be valid .epub after rendering an article without sections
+- should be valid .epub after rendering a book
+- should be valid .epub after rendering a book even if it has one graphic
+- should be valid .epub after rendering a book even if it has many graphics
+- should be valid .epub after rendering a book even if it has many duplicated graphics
+- should report an empty file as invalid
+- should confirm that a valid .epub file is valid
+- should not include PDFs in rendered epub files as valid image inclusions
+- should include a TOC link in rendered epub files for &lt;book&gt;s
+
+Finished in 20.608395 seconds
+
+15 examples, 0 failures
+
+
+== Verbose epub test coverage against _all_ of the testdocs
+
+Fails on only (errors truncated):
+1)
+'DocBook::Epub should be able to render a valid .epub for the test document /Users/keith/work/docbook-dev/trunk/xsl/epub/bin/spec/testdocs/calloutlist.003.xml [30]' FAILED
+'DocBook::Epub should be able to render a valid .epub for the test document /Users/keith/work/docbook-dev/trunk/xsl/epub/bin/spec/testdocs/cmdsynopsis.001.xml [35]' FAILED
+....
+
+Finished in 629.89194 seconds
+
+224 examples, 15 failures
+
+224 examples, 15 failures yields 6% failure rate</span></pre>
+</li></ul></div>
+</div>
+
+<div class="sect2" title="HTMLHelp"><div class="titlepage"><div><div><h3 class="title"><a name="V1.74.0_HTMLHelp"></a>HTMLHelp</h3></div></div></div>
+
+<p>The following changes have been made to the
+ <code class="filename">htmlhelp</code> code
+ since the 1.73.2 release.</p>
+<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
+<p><code class="literal">Mauritz Jeanson: htmlhelp-common.xsl</code></p><pre class="screen"><span class="commit-message">Added &lt;xsl:with-param name="quiet" select="$chunk.quietly"/&gt; to calls to
+the write.chunk, write.chunk.with.doctype, and write.text.chunk templates.
+This makes chunk.quietly=1 suppress chunk filename messages also for help
+support files (which seems to be what one would expect). See bug #1648360.</span></pre>
+</li></ul></div>
+</div>
+
+<div class="sect2" title="Eclipse"><div class="titlepage"><div><div><h3 class="title"><a name="V1.74.0_Eclipse"></a>Eclipse</h3></div></div></div>
+
+<p>The following changes have been made to the
+ <code class="filename">eclipse</code> code
+ since the 1.73.2 release.</p>
+<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
+<p><code class="literal">David Cramer: eclipse.xsl</code></p><pre class="screen"><span class="commit-message">Use sortas attributes (if they exist) when sorting indexterms</span></pre>
+</li><li class="listitem">
+<p><code class="literal">David Cramer: eclipse.xsl</code></p><pre class="screen"><span class="commit-message">Added support for indexterm/see in eclipse index.xml</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Mauritz Jeanson: eclipse.xsl</code></p><pre class="screen"><span class="commit-message">Added &lt;xsl:with-param name="quiet" select="$chunk.quietly"/&gt;
+to helpidx template.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">David Cramer: eclipse.xsl</code></p><pre class="screen"><span class="commit-message">Generate index.xml file and add related goo to plugin.xml file. Does not yet support see and seealso.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Mauritz Jeanson: eclipse.xsl</code></p><pre class="screen"><span class="commit-message">Added &lt;xsl:with-param name="quiet" select="$chunk.quietly"/&gt; to calls to
+the write.chunk, write.chunk.with.doctype, and write.text.chunk templates.
+This makes chunk.quietly=1 suppress chunk filename messages also for help
+support files (which seems to be what one would expect). See bug #1648360.</span></pre>
+</li></ul></div>
+</div>
+
+<div class="sect2" title="JavaHelp"><div class="titlepage"><div><div><h3 class="title"><a name="V1.74.0_JavaHelp"></a>JavaHelp</h3></div></div></div>
+
+<p>The following changes have been made to the
+ <code class="filename">javahelp</code> code
+ since the 1.73.2 release.</p>
+<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
+<p><code class="literal">Mauritz Jeanson: javahelp.xsl</code></p><pre class="screen"><span class="commit-message">Added &lt;xsl:with-param name="quiet" select="$chunk.quietly"/&gt; to calls to
+the write.chunk, write.chunk.with.doctype, and write.text.chunk templates.
+This makes chunk.quietly=1 suppress chunk filename messages also for help
+support files (which seems to be what one would expect). See bug #1648360.</span></pre>
+</li></ul></div>
+</div>
+
+<div class="sect2" title="Roundtrip"><div class="titlepage"><div><div><h3 class="title"><a name="V1.74.0_Roundtrip"></a>Roundtrip</h3></div></div></div>
+
+<p>The following changes have been made to the
+ <code class="filename">roundtrip</code> code
+ since the 1.73.2 release.</p>
+<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
+<p><code class="literal">Steve Ball: blocks2dbk.xsl; wordml2normalise.xsl</code></p><pre class="screen"><span class="commit-message">fix table/cell borders for wordml, fix formal figure, add emphasis-strong</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Mauritz Jeanson: supported.xml</code></p><pre class="screen"><span class="commit-message">Changed @cols to 5.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Steve Ball: blocks2dbk.xsl; blocks2dbk.dtd; template.xml</code></p><pre class="screen"><span class="commit-message">added pubdate, fixed metadata handling in biblioentry</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Steve Ball: supported.xml</code></p><pre class="screen"><span class="commit-message">Added support for edition.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Steve Ball: docbook-pages.xsl; wordml-blocks.xsl; docbook.xsl; wordml.xsl; pages-normalise&#8943;</code></p><pre class="screen"><span class="commit-message">Removed stylesheets for old, deprecated conversion method.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Steve Ball: specifications.xml; dbk2ooo.xsl; blocks2dbk.xsl; dbk2pages.xsl; blocks2dbk.dtd&#8943;</code></p><pre class="screen"><span class="commit-message">Added support for Open Office, added edition element, improved list and table support in Word and Pages</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Steve Ball: normalise-common.xsl; blocks2dbk.xsl; dbk2pages.xsl; template-pages.xml; templ&#8943;</code></p><pre class="screen"><span class="commit-message">Fixed bug in WordML table handling, improved table handling for Pages 08, synchronised WordML and Pages templates.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Steve Ball: normalise-common.xsl; blocks2dbk.xsl; wordml2normalise.xsl; dbk2wp.xsl</code></p><pre class="screen"><span class="commit-message">fix caption, attributes</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Steve Ball: specifications.xml; blocks2dbk.xsl; wordml2normalise.xsl; blocks2dbk.dtd; temp&#8943;</code></p><pre class="screen"><span class="commit-message">Fixes to table and list handling</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Steve Ball: blocks2dbk.xsl</code></p><pre class="screen"><span class="commit-message">added support for explicit emphasis character styles</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Steve Ball: wordml2normalise.xsl</code></p><pre class="screen"><span class="commit-message">added support for customisation in image handling</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Steve Ball: blocks2dbk.xsl</code></p><pre class="screen"><span class="commit-message">Added inlinemediaobject support for metadata.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Steve Ball: normalise-common.xsl; blocks2dbk.xsl; template.xml; dbk2wordml.xsl; dbk2wp.xsl</code></p><pre class="screen"><span class="commit-message">Added support file. Added style locking. Conversion bug fixes.</span></pre>
+</li></ul></div>
+</div>
+
+<div class="sect2" title="Slides"><div class="titlepage"><div><div><h3 class="title"><a name="V1.74.0_Slides"></a>Slides</h3></div></div></div>
+
+<p>The following changes have been made to the
+ <code class="filename">slides</code> code
+ since the 1.73.2 release.</p>
+<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: fo/Makefile; html/Makefile</code></p><pre class="screen"><span class="commit-message">Added checks and hacks to various makefiles to enable building
+under Cygwin. This stuff is ugly and maybe not worth the mess and
+trouble, but does seem to work as expected and not break anything
+else.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Jirka Kosek: html/plain.xsl</code></p><pre class="screen"><span class="commit-message">Added support for showing foil number</span></pre>
+</li></ul></div>
+</div>
+
+<div class="sect2" title="Website"><div class="titlepage"><div><div><h3 class="title"><a name="V1.74.0_Website"></a>Website</h3></div></div></div>
+
+<p>The following changes have been made to the
+ <code class="filename">website</code> code
+ since the 1.73.2 release.</p>
+<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: extensions/saxon64/.classes/.gitignore; extensions/xalan2/.classes/com/&#8943;</code></p><pre class="screen"><span class="commit-message">renamed a bunch more .cvsignore files to .gitignore (to facilitate use of git-svn)</span></pre>
+</li></ul></div>
+</div>
+
+<div class="sect2" title="Params"><div class="titlepage"><div><div><h3 class="title"><a name="V1.74.0_Params"></a>Params</h3></div></div></div>
+
+<p>The following changes have been made to the
+ <code class="filename">params</code> code
+ since the 1.73.2 release.</p>
+<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"> <p><code class="literal">Keith Fahlgren: epub.autolabel.xml</code></p><pre class="screen"><span class="commit-message">New parameter for epub, epub.autolabel</span></pre> </li><li class="listitem">
+<p><code class="literal">Mauritz Jeanson: table.frame.border.color.xml; table.cell.padding.xml; table.cell.border.t&#8943;</code></p><pre class="screen"><span class="commit-message">Added missing refpurposes and descriptions.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Keith Fahlgren: ade.extensions.xml</code></p><pre class="screen"><span class="commit-message">Extensions to support Adobe Digital Editions extensions in .epub output.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Mauritz Jeanson: fop.extensions.xml; fop1.extensions.xml</code></p><pre class="screen"><span class="commit-message">Clarified that fop1.extensions is for FOP 0.90 and later. Version 1 is not here yet...</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: man.links.are.underlined.xml; man.endnotes.list.enabled.xml; man.font.l&#8943;</code></p><pre class="screen"><span class="commit-message">removed man.links.are.underlined and added man.font.links. Also,
+changed the default font formatting for links to bold.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: man.base.url.for.relative.links.xml</code></p><pre class="screen"><span class="commit-message">Added new param man.base.url.for.relative.links .. specifies a
+base URL for relative links (for ulink, @xlink:href, imagedata,
+audiodata, videodata) shown in the generated NOTES section of
+man-page output. The value of man.base.url.for.relative.links is
+prepended to any relative URI that is a value of ulink url,
+xlink:href, or fileref attribute.
+
+If you use relative URIs in link sources in your DocBook refentry
+source, and you leave man.base.url.for.relative.links unset, the
+relative links will appear "as is" in the NOTES section of any
+man-page output generated from your source. That's probably not
+what you want, because such relative links are only usable in the
+context of HTML output. So, to make the links meaningful and
+usable in the context of man-page output, set a value for
+man.base.url.for.relative.links that points
+to the online version of HTML output generated from your DocBook
+refentry source. For example:
+
+ &lt;xsl:param name="man.base.url.for.relative.links"
+ &gt;http://www.kernel.org/pub/software/scm/git/docs/&lt;/xsl:param&gt;</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: man.string.subst.map.xml</code></p><pre class="screen"><span class="commit-message">squeeze .sp\n.sp into a single .sp (to prevent a extra, spurious
+line of whitespace from being inserted after programlisting etc.
+in certain cases)</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: refentry.manual.fallback.profile.xml; refentry.source.fallback.profile.&#8943;</code></p><pre class="screen"><span class="commit-message">don't use refmiscinfo@class=date value as fallback for refentry
+"source" or "manual" metadata fields</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: man.charmap.subset.profile.xml; man.charmap.enabled.xml; man.charmap.su&#8943;</code></p><pre class="screen"><span class="commit-message">made some further doc tweaks related to the
+man.charmap.subset.profile.english param</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: man.charmap.subset.profile.xml; man.charmap.enabled.xml; man.charmap.su&#8943;</code></p><pre class="screen"><span class="commit-message">Added the man.charmap.subset.profile.english parameter and refined
+the handling of charmap subsets to differentiate between English
+and non-English source.
+
+This way charmap subsets are now handled is this:
+
+If the value of the man.charmap.use.subset parameter is non-zero,
+and your DocBook source is not written in English (that is, if its
+lang or xml:lang attribute has a value other than en), then the
+character-map subset specified by the man.charmap.subset.profile
+parameter is used instead of the full roff character map.
+
+Otherwise, if the lang or xml:lang attribute on the root element
+in your DocBook source or on the first refentry element in your
+source has the value en or if it has no lang or xml:lang
+attribute, then the character-map subset specified by the
+man.charmap.subset.profile.english parameter is used instead of
+man.charmap.subset.profile.
+
+The difference between the two subsets is that
+man.charmap.subset.profile provides mappings for characters in
+Western European languages that are not part of the Roman
+(English) alphabet (ASCII character set).</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: man.charmap.subset.profile.xml</code></p><pre class="screen"><span class="commit-message">Added to default charmap used by manpages:
+
+ - the "letters" part of the 'C1 Controls And Latin-1 Supplement
+ (Latin-1 Supplement)' Unicode block
+ - Latin Extended-A block (but not all of the characters from
+ that block have mappings in groff, so some of them are still
+ passed through as-is)
+
+The effects of this change are that in man pages generated for
+most Western European languages and for Finnish, all characters
+not part of the Roman alphabet are (e.g., "accented" characters)
+are converted to groff escapes.
+
+Previously, by default we passed through those characters as is
+(and users needed to use the full charmap if they wanted to have
+those characters converted).
+
+As a result of this change, man pages generated for Western
+European languages will be viewable in some environments in which
+they are not viewable if the "raw" non-Roman characters are in them.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Mauritz Jeanson: generate.legalnotice.link.xml; generate.revhistory.link.xml</code></p><pre class="screen"><span class="commit-message">Added information on how the filename is computed.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Mauritz Jeanson: default.table.width.xml</code></p><pre class="screen"><span class="commit-message">Clarified PI usage.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: man.funcsynopsis.style.xml</code></p><pre class="screen"><span class="commit-message">Added the man.funcsynopsis.style parameter. Has the same effect in
+manpages output as the funcsynopsis.style parameter has in HTML
+output -- except that its default value is 'ansi' instead of 'kr'.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: funcsynopsis.tabular.threshold.xml</code></p><pre class="screen"><span class="commit-message">Removed the funcsynopsis.tabular.threshold param. It's no longer
+being used in the code and hasn't been since mid 2006.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Mauritz Jeanson: table.properties.xml</code></p><pre class="screen"><span class="commit-message">Set keep-together.within-column to "auto". This seems to be the most sensible
+default value for tables.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Mauritz Jeanson: informal.object.properties.xml; admon.graphics.extension.xml; informalequ&#8943;</code></p><pre class="screen"><span class="commit-message">Several small documentation fixes.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Mauritz Jeanson: manifest.in.base.dir.xml</code></p><pre class="screen"><span class="commit-message">Wording fixes.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Mauritz Jeanson: header.content.properties.xml; footer.content.properties.xml</code></p><pre class="screen"><span class="commit-message">Added refpurpose.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Mauritz Jeanson: ulink.footnotes.xml; ulink.show.xml</code></p><pre class="screen"><span class="commit-message">Updated for DocBook 5.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Mauritz Jeanson: index.method.xml; glossterm.auto.link.xml</code></p><pre class="screen"><span class="commit-message">Spelling and wording fixes.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Mauritz Jeanson: callout.graphics.extension.xml</code></p><pre class="screen"><span class="commit-message">Clarifed available graphics formats and extensions.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Mauritz Jeanson: footnote.sep.leader.properties.xml</code></p><pre class="screen"><span class="commit-message">Corrected refpurpose.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Jirka Kosek: footnote.properties.xml</code></p><pre class="screen"><span class="commit-message">Added more properties which make it possible to render correctly footnotes placed inside verbatim elements.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Mauritz Jeanson: img.src.path.xml</code></p><pre class="screen"><span class="commit-message">img.src.path works with inlinegraphic too.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Mauritz Jeanson: saxon.character.representation.xml</code></p><pre class="screen"><span class="commit-message">Added TCG link.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Mauritz Jeanson: img.src.path.xml</code></p><pre class="screen"><span class="commit-message">Updated description of img.src.path. Bug #1785224 revealed that
+there was a risk of misunderstanding how it works.</span></pre>
+</li></ul></div>
+</div>
+
+<div class="sect2" title="Profiling"><div class="titlepage"><div><div><h3 class="title"><a name="V1.74.0_Profiling"></a>Profiling</h3></div></div></div>
+
+<p>The following changes have been made to the
+ <code class="filename">profiling</code> code
+ since the 1.73.2 release.</p>
+<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
+<p><code class="literal">Jirka Kosek: xsl2profile.xsl</code></p><pre class="screen"><span class="commit-message">Added new rules to profile all content generated by HTML Help (including alias files)</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Robert Stayton: profile-mode.xsl</code></p><pre class="screen"><span class="commit-message">use mode="profile" instead of xsl:copy-of for attributes so
+they can be more easily customized.</span></pre>
+</li></ul></div>
+</div>
+
+
+<div class="sect2" title="Tools"><div class="titlepage"><div><div><h3 class="title"><a name="V1.74.0_Tools"></a>Tools</h3></div></div></div>
+
+<p>The following changes have been made to the
+ <code class="filename">tools</code> code
+ since the 1.73.2 release.</p>
+<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: make/Makefile.DocBook</code></p><pre class="screen"><span class="commit-message">various changes and additions to support making with asciidoc as
+an input format</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: make/Makefile.DocBook</code></p><pre class="screen"><span class="commit-message">make dblatex the default PDF maker for the example makefile</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: xsl/build/html2roff.xsl</code></p><pre class="screen"><span class="commit-message">Reworked handling of K&amp;R funcprototype output. It no longer relies
+on the HTML kr-tabular templates, but instead just does direct
+transformation to roff. For K&amp;R output, it displays the paramdef
+output in an indented list following the prototype.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Mauritz Jeanson: xsl/build/make-xsl-params.xsl</code></p><pre class="screen"><span class="commit-message">Made attribute-sets members of the param list. This enables links to attribute-sets in the
+reference documentation.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: xsl/build/html2roff.xsl</code></p><pre class="screen"><span class="commit-message">use .BI handling in K&amp;R funsynopsis output for manpages, just as
+we do already of ANSI output</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: xsl/build/html2roff.xsl</code></p><pre class="screen"><span class="commit-message">Implemented initial support for handling tabular K&amp;R output of
+funcprototype in manpages output. Accomplished by adding more
+templates to the intermediate HTML-to-roff stylesheet that the
+build uses to create the manpages/html-synop.xsl stylesheet.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: xsl/build/doc-link-docbook.xsl</code></p><pre class="screen"><span class="commit-message">Made the xsl/tools/xsl/build/doc-link-docbook.xsl stylesheet
+import profile-docbook.xsl, so that we can do profiling of release
+notes. Corrected some problems in the target for the release-notes
+HTML build.</span></pre>
+</li></ul></div>
+</div>
+
+<div class="sect2" title="Extensions"><div class="titlepage"><div><div><h3 class="title"><a name="V1.74.0_Extensions"></a>Extensions</h3></div></div></div>
+
+<p>The following changes have been made to the
+ <code class="filename">extensions</code> code
+ since the 1.73.2 release.</p>
+<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"> <p><code class="literal">Keith Fahlgren: Makefile</code></p><pre class="screen"><span class="commit-message">Use DOCBOOK_SVN variable everywhere, please; build with PDF_MAKER</span></pre> </li><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: Makefile</code></p><pre class="screen"><span class="commit-message">moved extensions build targets from master xsl/Makefile to
+xsl/extensions/Makefile</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: .cvsignore</code></p><pre class="screen"><span class="commit-message">re-adding empty extensions subdir</span></pre>
+</li></ul></div>
+</div>
+
+<div class="sect2" title="XSL-Saxon"><div class="titlepage"><div><div><h3 class="title"><a name="V1.74.0_XSL-Saxon"></a>XSL-Saxon</h3></div></div></div>
+
+<p>The following changes have been made to the
+ <code class="filename">xsl-saxon</code> code
+ since the 1.73.2 release.</p>
+<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: VERSION</code></p><pre class="screen"><span class="commit-message">bring xsl2, xsl-saxon, and xsl-xalan VERSION files up-to-date with
+recent change to snapshot build infrastructure</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: nbproject/build-impl.xml; nbproject/project.properties</code></p><pre class="screen"><span class="commit-message">Changed hard-coded file references in "clean" target to variable
+references. Closes #1792043. Thanks to Daniel Leidert.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: VERSION; Makefile</code></p><pre class="screen"><span class="commit-message">Did post-release wrap-up of xsl-saxon and xsl-xalan dirs</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: nbproject/build-impl.xml; VERSION; Makefile; test</code></p><pre class="screen"><span class="commit-message">More tweaks to get release-ready</span></pre>
+</li></ul></div>
+</div>
+
+<div class="sect2" title="XSL-Xalan"><div class="titlepage"><div><div><h3 class="title"><a name="V1.74.0_XSL-Xalan"></a>XSL-Xalan</h3></div></div></div>
+
+<p>The following changes have been made to the
+ <code class="filename">xsl-xalan</code> code
+ since the 1.73.2 release.</p>
+<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: VERSION</code></p><pre class="screen"><span class="commit-message">bring xsl2, xsl-saxon, and xsl-xalan VERSION files up-to-date with
+recent change to snapshot build infrastructure</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: nbproject/build-impl.xml</code></p><pre class="screen"><span class="commit-message">Changed hard-coded file references in "clean" target to variable
+references. Closes #1792043. Thanks to Daniel Leidert.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: Makefile; VERSION</code></p><pre class="screen"><span class="commit-message">Did post-release wrap-up of xsl-saxon and xsl-xalan dirs</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: Makefile; nbproject/build-impl.xml; VERSION</code></p><pre class="screen"><span class="commit-message">More tweaks to get release-ready</span></pre>
+</li></ul></div>
+</div>
+
+<div class="sect2" title="XSL-libxslt"><div class="titlepage"><div><div><h3 class="title"><a name="V1.74.0_XSL-libxslt"></a>XSL-libxslt</h3></div></div></div>
+
+<p>The following changes have been made to the
+ <code class="filename">xsl-libxslt</code> code
+ since the 1.73.2 release.</p>
+<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
+<p><code class="literal">Mauritz Jeanson: python/xslt.py</code></p><pre class="screen"><span class="commit-message">Print the result to stdout if no outfile has been given.
+Some unnecessary semicolons removed.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Mauritz Jeanson: python/xslt.py</code></p><pre class="screen"><span class="commit-message">Added a function that quotes parameter values (to ensure that they are interpreted as strings).
+Replaced deprecated functions from the string module with string methods.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: python/README; python/README.LIBXSLT</code></p><pre class="screen"><span class="commit-message">renamed xsl-libxslt/python/README to xsl-libxslt/python/README.LIBXSLT</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Mauritz Jeanson: python/README</code></p><pre class="screen"><span class="commit-message">Tweaked the text a little.</span></pre>
+</li></ul></div>
+</div>
+
+</div>
+
+<div class="sect1" title="Release Notes: 1.73.2"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="V1.73.2"></a>Release Notes: 1.73.2</h2></div></div></div>
+
+<p>This is solely a minor bug-fix update to the 1.73.1 release.
+ It fixes a packaging error in the 1.73.1 package, as well as a
+ bug in footnote handling in FO output.</p>
+</div>
+
+<div class="sect1" title="Release: 1.73.1"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="V1.73.1"></a>Release: 1.73.1</h2></div></div></div>
+
+<p>This is mostly a bug-fix update to the 1.73.0 release.</p>
+
+<div class="sect2" title="Gentext"><div class="titlepage"><div><div><h3 class="title"><a name="V1.73.1_Gentext"></a>Gentext</h3></div></div></div>
+
+<p>The following changes have been made to the
+ <code class="filename">gentext</code> code
+ since the 1.73.0 release.</p>
+<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
+<p><code class="literal">Mauritz Jeanson: locale/de.xml</code></p><pre class="screen"><span class="commit-message">Applied patch #1766009.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: locale/lv.xml</code></p><pre class="screen"><span class="commit-message">Added localization for <a href="http://docbook.org/tdg5/en/html/productionset.html"><code class="sgmltag-element">ProductionSet</code></a>.</span></pre>
+</li></ul></div>
+</div>
+
+<div class="sect2" title="FO"><div class="titlepage"><div><div><h3 class="title"><a name="V1.73.1_FO"></a>FO</h3></div></div></div>
+
+<p>The following changes have been made to the
+ <code class="filename">fo</code> code
+ since the 1.73.0 release.</p>
+<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
+<p><code class="literal">Mauritz Jeanson: table.xsl</code></p><pre class="screen"><span class="commit-message">Modified the <a href="http://docbook.org/tdg5/en/html/tgroup.html"><code class="sgmltag-element">tgroup</code></a> template so that, for tables with multiple tgroups,
+a width attribute is output on all corresponding fo:tables. Previously,
+there was a test prohibiting this (and a comment saying that outputting more
+than one width attribute will cause an error). But this seems to be no longer
+relevant; it is not a problem with FOP 0.93 or XEP 4.10. Closes bug #1760559.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Mauritz Jeanson: graphics.xsl</code></p><pre class="screen"><span class="commit-message">Replaced useless &lt;a&gt; elements with warning messages (textinsert extension).</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Mauritz Jeanson: admon.xsl</code></p><pre class="screen"><span class="commit-message">Enabled generation of ids (on fo:wrapper) for indexterms in admonition titles, so that page
+references in the <a href="http://docbook.org/tdg5/en/html/index.html"><code class="sgmltag-element">index</code></a> can be created. Closes bug #1775086.</span></pre>
+</li></ul></div>
+</div>
+
+<div class="sect2" title="HTML"><div class="titlepage"><div><div><h3 class="title"><a name="V1.73.1_HTML"></a>HTML</h3></div></div></div>
+
+<p>The following changes have been made to the
+ <code class="filename">html</code> code
+ since the 1.73.0 release.</p>
+<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
+<p><code class="literal">Mauritz Jeanson: titlepage.xsl</code></p><pre class="screen"><span class="commit-message">Added &lt;xsl:call-template name="process.footnotes"/&gt; to <a href="http://docbook.org/tdg5/en/html/abstract.html"><code class="sgmltag-element">abstract</code></a> template
+so that footnotes in <a href="http://docbook.org/tdg5/en/html/info.html"><code class="sgmltag-element">info</code></a>/<a href="http://docbook.org/tdg5/en/html/abstract.html"><code class="sgmltag-element">abstract</code></a> are processed. Closes bug #1760907.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: pi.xsl; synop.xsl</code></p><pre class="screen"><span class="commit-message">Changed handling of HTML output for the <a href="http://docbook.org/tdg5/en/html/cmdsynopsis.html"><code class="sgmltag-element">cmdsynopsis</code></a> and
+<a href="http://docbook.org/tdg5/en/html/funcsynopsis.html"><code class="sgmltag-element">funcsynopsis</code></a> elements, such that a@id instances are generated for
+them if they are descendants of any element containing a dbcmdlist
+or dbfunclist PI. Also, update the embedded <a href="http://docbook.org/tdg5/en/html/reference.html"><code class="sgmltag-element">reference</code></a> docs for the
+dbcmdlist and dbfunclist PIs to make it clear that they can be
+used within any element for which <a href="http://docbook.org/tdg5/en/html/cmdsynopsis.html"><code class="sgmltag-element">cmdsynopsis</code></a> or <a href="http://docbook.org/tdg5/en/html/funcsynopsis.html"><code class="sgmltag-element">funcsynopsis</code></a> are
+valid children.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: formal.xsl</code></p><pre class="screen"><span class="commit-message">Reverted the part of <a href="http://docbook.org/tdg5/en/html/revision.html"><code class="sgmltag-element">revision</code></a> 6952 that caused a@id anchors to be
+generated for output of informal objects. Thanks to Sam Steingold
+for reporting.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Robert Stayton: glossary.xsl</code></p><pre class="screen"><span class="commit-message">Account for a <a href="http://docbook.org/tdg5/en/html/glossary.html"><code class="sgmltag-element">glossary</code></a> with no <a href="http://docbook.org/tdg5/en/html/glossdiv.html"><code class="sgmltag-element">glossdiv</code></a> or <a href="http://docbook.org/tdg5/en/html/glossentry.html"><code class="sgmltag-element">glossentry</code></a> children.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Mauritz Jeanson: titlepage.xsl</code></p><pre class="screen"><span class="commit-message">Modified <a href="http://docbook.org/tdg5/en/html/legalnotice.html"><code class="sgmltag-element">legalnotice</code></a> template so that the base.name parameter is calculated
+in the same way as for <a href="http://docbook.org/tdg5/en/html/revhistory.html"><code class="sgmltag-element">revhistory</code></a> chunks. Using &lt;xsl:apply-templates
+mode="chunk-filename" select="."/&gt; did not work for single-page output since
+the template with that mode is in chunk-code.xsl.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Mauritz Jeanson: graphics.xsl</code></p><pre class="screen"><span class="commit-message">Updated support for SVG (must be a child of <a href="http://docbook.org/tdg5/en/html/imagedata.html"><code class="sgmltag-element">imagedata</code></a> in DB 5).
+Added support for MathML in <a href="http://docbook.org/tdg5/en/html/imagedata.html"><code class="sgmltag-element">imagedata</code></a>.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Mauritz Jeanson: pi.xsl</code></p><pre class="screen"><span class="commit-message">Added documentation for the dbhh PI (used for context-sensitive HTML Help).
+(The two templates matching 'dbhh' are still in htmlhelp-common.xsl).</span></pre>
+</li></ul></div>
+</div>
+
+<div class="sect2" title="Manpages"><div class="titlepage"><div><div><h3 class="title"><a name="V1.73.1_Manpages"></a>Manpages</h3></div></div></div>
+
+<p>The following changes have been made to the
+ <code class="filename">manpages</code> code
+ since the 1.73.0 release.</p>
+<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: endnotes.xsl</code></p><pre class="screen"><span class="commit-message">In manpages output, generate warnings about notesources with
+non-para children only if the notesource is a <a href="http://docbook.org/tdg5/en/html/footnote.html"><code class="sgmltag-element">footnote</code></a> or
+<a href="http://docbook.org/tdg5/en/html/annotation.html"><code class="sgmltag-element">annotation</code></a>. Thanks to Sam Steingold for reporting problems with
+the existing handling.</span></pre>
+</li></ul></div>
+</div>
+
+<div class="sect2" title="HTMLHelp"><div class="titlepage"><div><div><h3 class="title"><a name="V1.73.1_HTMLHelp"></a>HTMLHelp</h3></div></div></div>
+
+<p>The following changes have been made to the
+ <code class="filename">htmlhelp</code> code
+ since the 1.73.0 release.</p>
+<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: htmlhelp-common.xsl</code></p><pre class="screen"><span class="commit-message">Added single-pass namespace-stripping support to the htmlhelp,
+eclipse, and javahelp stylesheets.</span></pre>
+</li></ul></div>
+</div>
+
+<div class="sect2" title="Eclipse"><div class="titlepage"><div><div><h3 class="title"><a name="V1.73.1_Eclipse"></a>Eclipse</h3></div></div></div>
+
+<p>The following changes have been made to the
+ <code class="filename">eclipse</code> code
+ since the 1.73.0 release.</p>
+<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: eclipse.xsl</code></p><pre class="screen"><span class="commit-message">Added single-pass namespace-stripping support to the htmlhelp,
+eclipse, and javahelp stylesheets.</span></pre>
+</li></ul></div>
+</div>
+
+<div class="sect2" title="JavaHelp"><div class="titlepage"><div><div><h3 class="title"><a name="V1.73.1_JavaHelp"></a>JavaHelp</h3></div></div></div>
+
+<p>The following changes have been made to the
+ <code class="filename">javahelp</code> code
+ since the 1.73.0 release.</p>
+<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: javahelp.xsl</code></p><pre class="screen"><span class="commit-message">Added single-pass namespace-stripping support to the htmlhelp,
+eclipse, and javahelp stylesheets.</span></pre>
+</li></ul></div>
+</div>
+
+<div class="sect2" title="Roundtrip"><div class="titlepage"><div><div><h3 class="title"><a name="V1.73.1_Roundtrip"></a>Roundtrip</h3></div></div></div>
+
+<p>The following changes have been made to the
+ <code class="filename">roundtrip</code> code
+ since the 1.73.0 release.</p>
+<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
+<p><code class="literal">Steve Ball: blocks2dbk.xsl; blocks2dbk.dtd; pages2normalise.xsl</code></p><pre class="screen"><span class="commit-message">Modularised blocks2dbk to allow customisation,
+Added support for tables to pages2normalise</span></pre>
+</li></ul></div>
+</div>
+
+<div class="sect2" title="Params"><div class="titlepage"><div><div><h3 class="title"><a name="V1.73.1_Params"></a>Params</h3></div></div></div>
+
+<p>The following changes have been made to the
+ <code class="filename">params</code> code
+ since the 1.73.0 release.</p>
+<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
+<p><code class="literal">Robert Stayton: procedure.properties.xml</code></p><pre class="screen"><span class="commit-message"><a href="http://docbook.org/tdg5/en/html/procedure.html"><code class="sgmltag-element">procedure</code></a> was inheriting keep-together from formal.object.properties, but
+a <a href="http://docbook.org/tdg5/en/html/procedure.html"><code class="sgmltag-element">procedure</code></a> does not need to be kept together by default.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Dave Pawson: title.font.family.xml; component.label.includes.part.label.xml; table.frame.b&#8943;</code></p><pre class="screen"><span class="commit-message">Regular formatting re-org.</span></pre>
+</li></ul></div>
+</div>
+</div>
+
+<div class="sect1" title="Release: 1.73.0"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="V1.73.0"></a>Release: 1.73.0</h2></div></div></div>
+
+<p>This release includes important bug fixes and adds the following
+significant feature changes:
+</p><div class="variablelist"><dl><dt><span class="term">New localizations and localization updates</span></dt><dd>
+ <p>We added two new localizations: Latvian and
+ Esperanto, and made updates to the Czech, Chinese
+ Simplified, Mongolian, Serbian, Italian, and Ukrainian
+ localizations.</p>
+ </dd><dt><span class="term">ISO690 citation style for bibliography output.</span></dt><dd>
+ <p>Set the
+ <a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/bibliography.style.html"><em class="parameter"><code>bibliography.style</code></em></a> parameter to
+ <code class="literal">iso690</code> to use ISO690 style.</p>
+ </dd><dt><span class="term">New documentation for processing instructions (PI)</span></dt><dd>
+ <p>The reference documentation that ships with the
+ release now includes <a class="ulink" href="http://docbook.sourceforge.net/release/xsl/current/doc/pi/" target="_top">documentation on all PIs</a> that you can use to
+ control output from the stylesheets.</p>
+ </dd><dt><span class="term">New profiling parameters for <code class="literal">audience</code> and <code class="literal">wordsize</code></span></dt><dd>
+ <p>You can now do profiling based on the values of the
+ <code class="literal">audience</code> and
+ <code class="literal">wordsize</code> attributes.</p>
+ </dd><dt><span class="term">Changes to man-page output</span></dt><dd>
+ <p>The manpages stylesheet now supports single-pass
+ profiling and single-pass DocBook 5 namespace stripping
+ (just as the HTML and FO stylesheets also do). Also, added
+ handling for <a href="http://docbook.org/tdg5/en/html/mediaobject.html"><code class="sgmltag-element">mediaobject</code></a> &amp;
+ <a href="http://docbook.org/tdg5/en/html/inlinemediaobject.html"><code class="sgmltag-element">inlinemediaobject</code></a>. (Each <a href="http://docbook.org/tdg5/en/html/imagedata.html"><code class="sgmltag-element">imagedata</code></a>,
+ <a href="http://docbook.org/tdg5/en/html/audiodata.html"><code class="sgmltag-element">audiodata</code></a>, or <a href="http://docbook.org/tdg5/en/html/videodata.html"><code class="sgmltag-element">videodata</code></a> element
+ within a <a href="http://docbook.org/tdg5/en/html/mediaobject.html"><code class="sgmltag-element">mediaobject</code></a> or inline
+ <a href="http://docbook.org/tdg5/en/html/mediaobject.html"><code class="sgmltag-element">mediaobject</code></a> is now treated as a "notesource"
+ and so handled in much the same way as links and
+ <a href="http://docbook.org/tdg5/en/html/annotation.html"><code class="sgmltag-element">annotation</code></a>/<a href="http://docbook.org/tdg5/en/html/alt.html"><code class="sgmltag-element">alt</code></a>/<a href="http://docbook.org/tdg5/en/html/footnote.html"><code class="sgmltag-element">footnote</code></a>
+ are in manpages output.) And added the
+ <a href="http://docbook.sourceforge.net/release/xsl/current/doc/manpages/man.authors.section.enabled.html"><em class="parameter"><code>man.authors.section.enabled</code></em></a> and
+ <a href="http://docbook.sourceforge.net/release/xsl/current/doc/manpages/man.copyright.section.enabled.html"><em class="parameter"><code>man.copyright.section.enabled</code></em></a>
+ parameters to enable control over whether output includes
+ auto-generated <code class="literal">AUTHORS</code> and
+ <code class="literal">COPYRIGHT</code> sections.</p>
+ </dd><dt><span class="term">Highlighting support for C</span></dt><dd>
+ <p>The highlighting mechanism for generating
+ syntax-highlighted code snippets in output now supports C
+ code listings (along with Java, PHP, XSLT, and others).</p>
+ </dd><dt><span class="term">Experimental <code class="literal">docbook-xsl-update script</code></span></dt><dd>
+ <p>We added an experimental <code class="literal">docbook-xsl-update
+ script</code>, the purpose of which is to facilitate
+ easy sync-up to the latest docbook-xsl snapshot (by means
+ of rsync).</p>
+ </dd></dl></div><p>
+</p>
+
+<div class="sect2" title="Gentext"><div class="titlepage"><div><div><h3 class="title"><a name="V1.73.0_Gentext"></a>Gentext</h3></div></div></div>
+
+<p>The following changes have been made to the
+<code class="filename">gentext</code> code
+since the 1.72.0 release.</p>
+<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: locale/lv.xml; Makefile</code></p><pre class="screen"><span class="commit-message">Added Latvian localization file, from Girts Ziemelis.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Dongsheng Song: locale/zh_cn.xml</code></p><pre class="screen"><span class="commit-message">Brought up to <a href="http://docbook.org/tdg5/en/html/date.html"><code class="sgmltag-element">date</code></a> with en.xml in terms of items. A few strings marked for translation.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Jirka Kosek: locale/cs.xml</code></p><pre class="screen"><span class="commit-message">Added missing translations</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Robert Stayton: locale/eo.xml</code></p><pre class="screen"><span class="commit-message">New locale for Esperanto.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Robert Stayton: locale/mn.xml</code></p><pre class="screen"><span class="commit-message">Update from Ganbold Tsagaankhuu.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Jirka Kosek: locale/en.xml; locale/cs.xml</code></p><pre class="screen"><span class="commit-message">Rules for normalizing <a href="http://docbook.org/tdg5/en/html/glossary.html"><code class="sgmltag-element">glossary</code></a> entries before they are sorted can be now different for each language.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: locale/sr_Latn.xml; locale/sr.xml</code></p><pre class="screen"><span class="commit-message">Committed changes from Milo&#353; Komar&#269;evi&#263; to Serbian files.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Robert Stayton: locale/ja.xml</code></p><pre class="screen"><span class="commit-message">Fix <a href="http://docbook.org/tdg5/en/html/chapter.html"><code class="sgmltag-element">chapter</code></a> in context xref-number-and-title</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Robert Stayton: locale/it.xml</code></p><pre class="screen"><span class="commit-message">Improved version from contributor.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Mauritz Jeanson: locale/uk.xml</code></p><pre class="screen"><span class="commit-message">Applied patch 1592083.</span></pre>
+</li></ul></div>
+</div>
+<div class="sect2" title="Common"><div class="titlepage"><div><div><h3 class="title"><a name="V1.73.0_Common"></a>Common</h3></div></div></div>
+
+<p>The following changes have been made to the
+<code class="filename">common</code> code
+since the 1.72.0 release.</p>
+<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: labels.xsl</code></p><pre class="screen"><span class="commit-message">Changed handling of <a href="http://docbook.org/tdg5/en/html/reference.html"><code class="sgmltag-element">reference</code></a> auto-labeling such that <a href="http://docbook.org/tdg5/en/html/reference.html"><code class="sgmltag-element">reference</code></a>
+(when it appears at the component level) is now affected by the
+<a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/label.from.part.html"><em class="parameter"><code>label.from.part</code></em></a> param, just as <a href="http://docbook.org/tdg5/en/html/preface.html"><code class="sgmltag-element">preface</code></a>, <a href="http://docbook.org/tdg5/en/html/chapter.html"><code class="sgmltag-element">chapter</code></a>, and <a href="http://docbook.org/tdg5/en/html/appendix.html"><code class="sgmltag-element">appendix</code></a>.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: common.xsl</code></p><pre class="screen"><span class="commit-message">Added support to the HTML stylesheets for proper processing of
+<a href="http://docbook.org/tdg5/en/html/orgname.html"><code class="sgmltag-element">orgname</code></a> as a child of <a href="http://docbook.org/tdg5/en/html/author.html"><code class="sgmltag-element">author</code></a>.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: refentry.xsl</code></p><pre class="screen"><span class="commit-message">Refined logging output of <a href="http://docbook.org/tdg5/en/html/refentry.html"><code class="sgmltag-element">refentry</code></a> metadata-gathering template;
+for some cases of "missing" elements (<a href="http://docbook.org/tdg5/en/html/refmiscinfo.html"><code class="sgmltag-element">refmiscinfo</code></a> stuff, etc.),
+the log messages now include URL to corresponding page in the
+Definitive Guide (TDG).</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Robert Stayton: titles.xsl</code></p><pre class="screen"><span class="commit-message">Add <a href="http://docbook.org/tdg5/en/html/refsection.html"><code class="sgmltag-element">refsection</code></a>/<a href="http://docbook.org/tdg5/en/html/info.html"><code class="sgmltag-element">info</code></a>/<a href="http://docbook.org/tdg5/en/html/title.html"><code class="sgmltag-element">title</code></a> support.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: titles.xsl</code></p><pre class="screen"><span class="commit-message">Added support for correct handling of <a href="http://docbook.org/tdg5/en/html/xref.html"><code class="sgmltag-element">xref</code></a> to elements that
+contain <a href="http://docbook.org/tdg5/en/html/info.html"><code class="sgmltag-element">info</code></a>/<a href="http://docbook.org/tdg5/en/html/title.html"><code class="sgmltag-element">title</code></a> descendants but no <a href="http://docbook.org/tdg5/en/html/title.html"><code class="sgmltag-element">title</code></a> children.
+
+This should be further refined so that it handles any *<a href="http://docbook.org/tdg5/en/html/info.html"><code class="sgmltag-element">info</code></a>
+elements. And there are probably some other places where similar
+handling for *<a href="http://docbook.org/tdg5/en/html/info.html"><code class="sgmltag-element">info</code></a>/<a href="http://docbook.org/tdg5/en/html/title.html"><code class="sgmltag-element">title</code></a> should be added.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Mauritz Jeanson: pi.xsl</code></p><pre class="screen"><span class="commit-message">Modified &lt;xsl:when&gt; in datetime.format template to work
+around Xalan bug.</span></pre>
+</li></ul></div>
+</div>
+<div class="sect2" title="FO"><div class="titlepage"><div><div><h3 class="title"><a name="V1.73.0_FO"></a>FO</h3></div></div></div>
+
+<p>The following changes have been made to the
+<code class="filename">fo</code> code
+since the 1.72.0 release.</p>
+<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
+<p><code class="literal">Robert Stayton: component.xsl</code></p><pre class="screen"><span class="commit-message">Add parameters to the page.sequence utility template.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Mauritz Jeanson: xref.xsl</code></p><pre class="screen"><span class="commit-message">Added template for <a href="http://docbook.org/tdg5/en/html/xref.html"><code class="sgmltag-element">xref</code></a> to <a href="http://docbook.org/tdg5/en/html/area.html"><code class="sgmltag-element">area</code></a>/<a href="http://docbook.org/tdg5/en/html/areaset.html"><code class="sgmltag-element">areaset</code></a>.
+Part of fix for bug #1675513 (<a href="http://docbook.org/tdg5/en/html/xref.html"><code class="sgmltag-element">xref</code></a> to <a href="http://docbook.org/tdg5/en/html/area.html"><code class="sgmltag-element">area</code></a> broken).</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: inline.xsl</code></p><pre class="screen"><span class="commit-message">Added template match for <a href="http://docbook.org/tdg5/en/html/person.html"><code class="sgmltag-element">person</code></a> element to fo stylesheet.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Robert Stayton: lists.xsl</code></p><pre class="screen"><span class="commit-message">Added support for spacing="compact" in <a href="http://docbook.org/tdg5/en/html/variablelist.html"><code class="sgmltag-element">variablelist</code></a>, per bug report #1722540.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Robert Stayton: table.xsl</code></p><pre class="screen"><span class="commit-message"><a href="http://docbook.org/tdg5/en/html/table.html"><code class="sgmltag-element">table</code></a> pgwide="1" should also use pgwide.properties attribute-set.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Mauritz Jeanson: inline.xsl</code></p><pre class="screen"><span class="commit-message">Make citations numbered if <a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/bibliography.numbered.html"><em class="parameter"><code>bibliography.numbered</code></em></a> != 0.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Robert Stayton: param.xweb; param.ent</code></p><pre class="screen"><span class="commit-message">Add new profiling parameters for audience and wordsize.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Robert Stayton: param.xweb; param.ent</code></p><pre class="screen"><span class="commit-message">Added <a href="http://docbook.sourceforge.net/release/xsl/current/doc/fo/callout.icon.size.html"><em class="parameter"><code>callout.icon.size</code></em></a> parameter.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Robert Stayton: inline.xsl; xref.xsl</code></p><pre class="screen"><span class="commit-message">Add support for xlink as <a href="http://docbook.org/tdg5/en/html/olink.html"><code class="sgmltag-element">olink</code></a>.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Robert Stayton: autotoc.xsl; param.xweb; param.ent</code></p><pre class="screen"><span class="commit-message">Add support for <a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/qanda.in.toc.html"><em class="parameter"><code>qanda.in.toc</code></em></a> to fo <a href="http://docbook.org/tdg5/en/html/toc.html"><code class="sgmltag-element">TOC</code></a>.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Robert Stayton: component.xsl</code></p><pre class="screen"><span class="commit-message">Improved the page.sequence utility template for use with <a href="http://docbook.org/tdg5/en/html/book.html"><code class="sgmltag-element">book</code></a>.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Robert Stayton: division.xsl</code></p><pre class="screen"><span class="commit-message">Refactored the big <a href="http://docbook.org/tdg5/en/html/book.html"><code class="sgmltag-element">book</code></a> template into smaller pieces.
+Used the "page.sequence" utility template in
+component.xsl to shorten the <a href="http://docbook.org/tdg5/en/html/toc.html"><code class="sgmltag-element">toc</code></a> piece.
+Added placeholder templates for front.cover and back.cover.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Robert Stayton: param.xweb; param.ent; sections.xsl</code></p><pre class="screen"><span class="commit-message">Add <a href="http://docbook.sourceforge.net/release/xsl/current/doc/fo/section.container.element.html"><em class="parameter"><code>section.container.element</code></em></a> parameter to enable
+pgwide spans inside sections.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Robert Stayton: param.xweb; param.ent; component.xsl</code></p><pre class="screen"><span class="commit-message">Add component.titlepage.properties attribute-set to
+support span="all" and other properties.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Robert Stayton: htmltbl.xsl; table.xsl</code></p><pre class="screen"><span class="commit-message">Apply table.row.properties template to html <a href="http://docbook.org/tdg5/en/html/tr.html"><code class="sgmltag-element">tr</code></a> rows too.
+Add keep-with-next to table.row.properties when <a href="http://docbook.org/tdg5/en/html/row.html"><code class="sgmltag-element">row</code></a> is in <a href="http://docbook.org/tdg5/en/html/thead.html"><code class="sgmltag-element">thead</code></a>.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Robert Stayton: table.xsl</code></p><pre class="screen"><span class="commit-message">Add support for <a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/default.table.frame.html"><em class="parameter"><code>default.table.frame</code></em></a> parameter.
+Fix bug 1575446 rowsep last check for @morerows.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Robert Stayton: refentry.xsl</code></p><pre class="screen"><span class="commit-message">Add support for <a href="http://docbook.org/tdg5/en/html/info.html"><code class="sgmltag-element">info</code></a>/<a href="http://docbook.org/tdg5/en/html/title.html"><code class="sgmltag-element">title</code></a> in refsections.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">David Cramer: qandaset.xsl</code></p><pre class="screen"><span class="commit-message">Make fo questions and answers behave the same way as html</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Jirka Kosek: lists.xsl</code></p><pre class="screen"><span class="commit-message">Added missing attribute set for <a href="http://docbook.org/tdg5/en/html/procedure.html"><code class="sgmltag-element">procedure</code></a></span></pre>
+</li><li class="listitem">
+<p><code class="literal">Jirka Kosek: param.xweb; biblio.xsl; docbook.xsl; param.ent; biblio-iso690.xsl</code></p><pre class="screen"><span class="commit-message">Added support for formatting biblioentries according to ISO690 <a href="http://docbook.org/tdg5/en/html/citation.html"><code class="sgmltag-element">citation</code></a> style.
+New <a href="http://docbook.org/tdg5/en/html/bibliography.html"><code class="sgmltag-element">bibliography</code></a> style can be turned on by setting parameter <a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/bibliography.style.html"><em class="parameter"><code>bibliography.style</code></em></a> to "iso690"
+The code was provided by Jana Dvorakova</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Robert Stayton: param.xweb; param.ent; pagesetup.xsl</code></p><pre class="screen"><span class="commit-message">Add header.table.properties and footer.table.properties attribute-sets.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Robert Stayton: inline.xsl</code></p><pre class="screen"><span class="commit-message">Add <a href="http://docbook.sourceforge.net/release/xsl/current/doc/fo/fop1.extensions.html"><em class="parameter"><code>fop1.extensions</code></em></a> for <a href="http://docbook.org/tdg5/en/html/menuchoice.html"><code class="sgmltag-element">menuchoice</code></a> arrow handling exception.</span></pre>
+</li></ul></div>
+</div>
+<div class="sect2" title="HTML"><div class="titlepage"><div><div><h3 class="title"><a name="V1.73.0_HTML"></a>HTML</h3></div></div></div>
+
+<p>The following changes have been made to the
+ <code class="filename">html</code> code
+ since the 1.72.0 release.</p>
+<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
+<p><code class="literal">Mauritz Jeanson: param.xweb; param.ent</code></p><pre class="screen"><span class="commit-message">Moved declaration and documentation of <a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/javahelp.encoding.html"><em class="parameter"><code>javahelp.encoding</code></em></a> from javahelp.xsl to the
+regular "parameter machinery".</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: admon.xsl</code></p><pre class="screen"><span class="commit-message">Changed handling of titles for note, warning, <a href="http://docbook.org/tdg5/en/html/caution.html"><code class="sgmltag-element">caution</code></a>, <a href="http://docbook.org/tdg5/en/html/important.html"><code class="sgmltag-element">important</code></a>,
+<a href="http://docbook.org/tdg5/en/html/tip.html"><code class="sgmltag-element">tip</code></a> admonitions: We now output and HTML h3 head only if
+<a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/admon.textlabel.html"><em class="parameter"><code>admon.textlabel</code></em></a> is non-zero or if the admonition actually contains
+a <a href="http://docbook.org/tdg5/en/html/title.html"><code class="sgmltag-element">title</code></a>; otherwise, we don't output an h3 head at all.
+(Previously, we were outputting an empty h3 if the <a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/admon.textlabel.html"><em class="parameter"><code>admon.textlabel</code></em></a>
+was zero and if the admonition had no title.)</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Mauritz Jeanson: xref.xsl</code></p><pre class="screen"><span class="commit-message">Added template for <a href="http://docbook.org/tdg5/en/html/xref.html"><code class="sgmltag-element">xref</code></a> to <a href="http://docbook.org/tdg5/en/html/area.html"><code class="sgmltag-element">area</code></a>/<a href="http://docbook.org/tdg5/en/html/areaset.html"><code class="sgmltag-element">areaset</code></a>.
+Part of fix for bug #1675513 (<a href="http://docbook.org/tdg5/en/html/xref.html"><code class="sgmltag-element">xref</code></a> to <a href="http://docbook.org/tdg5/en/html/area.html"><code class="sgmltag-element">area</code></a> broken).</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Mauritz Jeanson: titlepage.xsl; component.xsl; division.xsl; sections.xsl</code></p><pre class="screen"><span class="commit-message">Added fixes to avoid duplicate ids when <a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/generate.id.attributes.html"><em class="parameter"><code>generate.id.attributes</code></em></a> = 1.
+This (hopefully) closes bug #1671052.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: formal.xsl; pi.xsl</code></p><pre class="screen"><span class="commit-message">Made the dbfunclist PI work as intended. Also added doc for
+dbfunclist and dbcmdlist PIs.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: pi.xsl; synop.xsl</code></p><pre class="screen"><span class="commit-message">Made the dbcmdlist work the way it appears to have been intended
+to work. Restored dbhtml-dir template back to pi.xsl.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: titlepage.xsl; param.xweb; param.ent</code></p><pre class="screen"><span class="commit-message">Added new param <a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/abstract.notitle.enabled.html"><em class="parameter"><code>abstract.notitle.enabled</code></em></a>.
+If non-zero, in output of the <a href="http://docbook.org/tdg5/en/html/abstract.html"><code class="sgmltag-element">abstract</code></a> element on titlepages,
+display of the <a href="http://docbook.org/tdg5/en/html/abstract.html"><code class="sgmltag-element">abstract</code></a> <a href="http://docbook.org/tdg5/en/html/title.html"><code class="sgmltag-element">title</code></a> is suppressed.
+Because sometimes you really don't want or need that <a href="http://docbook.org/tdg5/en/html/title.html"><code class="sgmltag-element">title</code></a>
+there...</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: chunk-code.xsl; graphics.xsl</code></p><pre class="screen"><span class="commit-message">When we are chunking long descriptions for <a href="http://docbook.org/tdg5/en/html/mediaobject.html"><code class="sgmltag-element">mediaobject</code></a> instances
+into separate HTML output files, and <a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/use.id.as.filename.html"><em class="parameter"><code>use.id.as.filename</code></em></a> is
+non-zero, if a <a href="http://docbook.org/tdg5/en/html/mediaobject.html"><code class="sgmltag-element">mediaobject</code></a> has an ID, use that ID as the basename
+for the long-description file (otherwise, we generate an ID for it
+and use that ID as the basename for the file).
+The parallels the recent change made to cause IDs for <a href="http://docbook.org/tdg5/en/html/legalnotice.html"><code class="sgmltag-element">legalnotice</code></a>
+instances to be used as basenames for <a href="http://docbook.org/tdg5/en/html/legalnotice.html"><code class="sgmltag-element">legalnotice</code></a> chunks.
+Also, made some minor refinements to the recent changes for
+<a href="http://docbook.org/tdg5/en/html/legalnotice.html"><code class="sgmltag-element">legalnotice</code></a> chunk handling.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: titlepage.xsl</code></p><pre class="screen"><span class="commit-message">Added support to the HTML stylesheets for proper processing of
+<a href="http://docbook.org/tdg5/en/html/orgname.html"><code class="sgmltag-element">orgname</code></a> as a child of <a href="http://docbook.org/tdg5/en/html/author.html"><code class="sgmltag-element">author</code></a>.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: chunk-code.xsl</code></p><pre class="screen"><span class="commit-message">When $generate.legalnotice.link is non-zero and
+$use.id.as.filename is also non-zero, if a <a href="http://docbook.org/tdg5/en/html/legalnotice.html"><code class="sgmltag-element">legalnotice</code></a> has an ID,
+then instead of assigning the "ln-&lt;generatedID&gt;" basename to the
+output file for that <a href="http://docbook.org/tdg5/en/html/legalnotice.html"><code class="sgmltag-element">legalnotice</code></a>, just use its real ID as the
+basename for the file -- as we do when chunking other elements
+that have IDs.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">David Cramer: xref.xsl</code></p><pre class="screen"><span class="commit-message">Handle <a href="http://docbook.org/tdg5/en/html/alt.html"><code class="sgmltag-element">alt</code></a> text on xrefs to steps when the step doesn't have a <a href="http://docbook.org/tdg5/en/html/title.html"><code class="sgmltag-element">title</code></a>.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">David Cramer: lists.xsl</code></p><pre class="screen"><span class="commit-message">Added &lt;p&gt; element around <a href="http://docbook.org/tdg5/en/html/term.html"><code class="sgmltag-element">term</code></a> in <a href="http://docbook.org/tdg5/en/html/variablelist.html"><code class="sgmltag-element">variablelist</code></a> when formatted as <a href="http://docbook.org/tdg5/en/html/table.html"><code class="sgmltag-element">table</code></a> to avoid misalignment of <a href="http://docbook.org/tdg5/en/html/term.html"><code class="sgmltag-element">term</code></a> and <a href="http://docbook.org/tdg5/en/html/listitem.html"><code class="sgmltag-element">listitem</code></a> in xhtml (non-quirks mode) output</span></pre>
+</li><li class="listitem">
+<p><code class="literal">David Cramer: qandaset.xsl</code></p><pre class="screen"><span class="commit-message">Added &lt;p&gt; element around <a href="http://docbook.org/tdg5/en/html/question.html"><code class="sgmltag-element">question</code></a> and <a href="http://docbook.org/tdg5/en/html/answer.html"><code class="sgmltag-element">answer</code></a> labels to avoid misalignment of <a href="http://docbook.org/tdg5/en/html/label.html"><code class="sgmltag-element">label</code></a> and <a href="http://docbook.org/tdg5/en/html/listitem.html"><code class="sgmltag-element">listitem</code></a> in xhtml (non-quirks mode) output</span></pre>
+</li><li class="listitem">
+<p><code class="literal">David Cramer: lists.xsl</code></p><pre class="screen"><span class="commit-message">Added &lt;p&gt; element around callouts to avoid misalignment of <a href="http://docbook.org/tdg5/en/html/callout.html"><code class="sgmltag-element">callout</code></a> and <a href="http://docbook.org/tdg5/en/html/listitem.html"><code class="sgmltag-element">listitem</code></a> in xhtml (non-quirks mode) output</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Mauritz Jeanson: inline.xsl</code></p><pre class="screen"><span class="commit-message">Make citations numbered if <a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/bibliography.numbered.html"><em class="parameter"><code>bibliography.numbered</code></em></a> != 0.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Robert Stayton: param.xweb; param.ent</code></p><pre class="screen"><span class="commit-message">Add support for new profiling attributes audience and wordsize.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Robert Stayton: inline.xsl; xref.xsl</code></p><pre class="screen"><span class="commit-message">Add support for xlink olinks.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Jirka Kosek: glossary.xsl</code></p><pre class="screen"><span class="commit-message">Rules for normalizing <a href="http://docbook.org/tdg5/en/html/glossary.html"><code class="sgmltag-element">glossary</code></a> entries before they are sorted can be now different for each language.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Robert Stayton: chunk-common.xsl; chunk-code.xsl; manifest.xsl; chunk.xsl</code></p><pre class="screen"><span class="commit-message">Refactored the chunking modules to move all named templates to
+chunk-common.xsl and all match templates to chunk-code.xsl, in
+order to enable better chunk customization.
+See the comments in chunk.xsl for more details.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Robert Stayton: lists.xsl</code></p><pre class="screen"><span class="commit-message">Add <a href="http://docbook.org/tdg5/en/html/anchor.html"><code class="sgmltag-element">anchor</code></a> for xml:id for <a href="http://docbook.org/tdg5/en/html/listitem.html"><code class="sgmltag-element">listitem</code></a> in <a href="http://docbook.org/tdg5/en/html/varlistentry.html"><code class="sgmltag-element">varlistentry</code></a>.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Robert Stayton: refentry.xsl</code></p><pre class="screen"><span class="commit-message">Add support for <a href="http://docbook.org/tdg5/en/html/info.html"><code class="sgmltag-element">info</code></a>/<a href="http://docbook.org/tdg5/en/html/title.html"><code class="sgmltag-element">title</code></a> in refsections for db5.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Jirka Kosek: param.xweb; biblio.xsl; docbook.xsl; param.ent; biblio-iso690.xsl</code></p><pre class="screen"><span class="commit-message">Added support for formatting biblioentries according to ISO690 <a href="http://docbook.org/tdg5/en/html/citation.html"><code class="sgmltag-element">citation</code></a> style.
+New <a href="http://docbook.org/tdg5/en/html/bibliography.html"><code class="sgmltag-element">bibliography</code></a> style can be turned on by setting parameter <a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/bibliography.style.html"><em class="parameter"><code>bibliography.style</code></em></a> to "iso690"
+The code was provided by Jana Dvorakova</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Robert Stayton: inline.xsl; xref.xsl</code></p><pre class="screen"><span class="commit-message">Add call to class.attribute to &lt;a&gt; output elements so they can
+have a class value too.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Mauritz Jeanson: glossary.xsl</code></p><pre class="screen"><span class="commit-message">Fixed bug #1644881:
+* Added curly braces around all $language attribute values.
+* Moved declaration of language variable to top level of stylesheet.
+Tested with Xalan, Saxon, and xsltproc.</span></pre>
+</li></ul></div>
+</div>
+<div class="sect2" title="Manpages"><div class="titlepage"><div><div><h3 class="title"><a name="V1.73.0_Manpages"></a>Manpages</h3></div></div></div>
+
+<p>The following changes have been made to the
+ <code class="filename">manpages</code> code
+ since the 1.72.0 release.</p>
+<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: param.xweb; docbook.xsl; param.ent</code></p><pre class="screen"><span class="commit-message">Added the <a href="http://docbook.sourceforge.net/release/xsl/current/doc/manpages/man.authors.section.enabled.html"><em class="parameter"><code>man.authors.section.enabled</code></em></a> and
+<a href="http://docbook.sourceforge.net/release/xsl/current/doc/manpages/man.copyright.section.enabled.html"><em class="parameter"><code>man.copyright.section.enabled</code></em></a> parameters. Set those to zero when
+you want to suppress display of the auto-generated AUTHORS and
+<a href="http://docbook.org/tdg5/en/html/copyright.html"><code class="sgmltag-element">COPYRIGHT</code></a> sections. Closes request #1467806. Thanks to Daniel
+Leidert.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: docbook.xsl</code></p><pre class="screen"><span class="commit-message">Took the test that the manpages stylesheet does to see if there
+are any <a href="http://docbook.org/tdg5/en/html/refentry.html"><code class="sgmltag-element">Refentry</code></a> chilren in current doc, and made it
+namespace-agnostic. Reason for that is because the test otherwise
+won't work when it is copied over into the generated
+profile-docbook.xsl stylesheet.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: Makefile</code></p><pre class="screen"><span class="commit-message">Added a manpages/profile-docbook.xsl file to enable single-pass
+profiling for manpages output.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: info.xsl</code></p><pre class="screen"><span class="commit-message">Output <a href="http://docbook.org/tdg5/en/html/copyright.html"><code class="sgmltag-element">copyright</code></a> and <a href="http://docbook.org/tdg5/en/html/legalnotice.html"><code class="sgmltag-element">legalnotice</code></a> in man-page output in whatever
+place they are in in document order. Closes #1690539. Thanks to
+Daniel Leidert for reporting.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: docbook.xsl</code></p><pre class="screen"><span class="commit-message">Restored support for single-pass namespace stripping to manpages
+stylesheet.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: synop.xsl; block.xsl; info.xsl; inline.xsl; lists.xsl; endnotes.xsl; ut&#8943;</code></p><pre class="screen"><span class="commit-message">Changed handling of bold and italic/underline output in manpages
+output. Should be transparent to users, but...
+
+This touches handling of all bold and italic/underline output. The
+exact change is that the mode="bold" and mode="italic" utility
+templates were changed to named templates. (I think maybe I've
+changed it back and forth from mode to named before, so this is
+maybe re-reverting it yet again).
+
+Anyway, the reason for the change is that the templates are
+sometimes call on dynamically node-sets, and using modes to format
+those doesn't allow passing <a href="http://docbook.org/tdg5/en/html/info.html"><code class="sgmltag-element">info</code></a> about the current/real context
+node from the source (not the node-set created by the stylesheet)
+to that formatting stage.
+
+The named templates allow the context to be passed in as a
+parameter, so that the bold/ital formatting template can use
+context-aware condition checking.
+
+This was basically necessary in order to suppress bold formatting
+in titles, which otherwise gets screwed up because of the numbnut
+way that roff handles nested bold/ital.
+
+Closes #1674534). Much thanks to Daniel Leidert, whose in his
+docbook-xsl bug-finding kung-fu has achieved Grand Master status.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: block.xsl</code></p><pre class="screen"><span class="commit-message">Fixed handling of example instances by adding the example element
+to the same template we use for processing <a href="http://docbook.org/tdg5/en/html/figure.html"><code class="sgmltag-element">figure</code></a>. Closes
+#1674538. Thanks to Daniel Leidert.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: utility.xsl</code></p><pre class="screen"><span class="commit-message">Don't include lang in manpages <a href="http://docbook.org/tdg5/en/html/filename.html"><code class="sgmltag-element">filename</code></a>/pathname if lang=en (that
+is, only generate lang-qualified file-/pathnames for non-English).</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: endnotes.xsl</code></p><pre class="screen"><span class="commit-message">In manpages output, emit warnings for notesources (<a href="http://docbook.org/tdg5/en/html/footnote.html"><code class="sgmltag-element">footnote</code></a>, etc.)
+that have something other than <a href="http://docbook.org/tdg5/en/html/para.html"><code class="sgmltag-element">para</code></a> as a child.
+
+The numbered-with-hanging-indent formatting that's used for
+rendering endnotes in the NOTES <a href="http://docbook.org/tdg5/en/html/section.html"><code class="sgmltag-element">section</code></a> of man pages places some
+limits/assumptions on how the DocBook source is marked up; namely,
+for notesources (<a href="http://docbook.org/tdg5/en/html/footnote.html"><code class="sgmltag-element">footnote</code></a>, <a href="http://docbook.org/tdg5/en/html/annotation.html"><code class="sgmltag-element">annotation</code></a>, etc.) that can contain
+block-level children, if the they have a block-level child such as
+a <a href="http://docbook.org/tdg5/en/html/table.html"><code class="sgmltag-element">table</code></a> or <a href="http://docbook.org/tdg5/en/html/itemizedlist.html"><code class="sgmltag-element">itemizedlist</code></a> or <a href="http://docbook.org/tdg5/en/html/orderedlist.html"><code class="sgmltag-element">orderedlist</code></a> that is the first child of
+a <a href="http://docbook.org/tdg5/en/html/footnote.html"><code class="sgmltag-element">footnote</code></a>, we have no way of rendering/indenting its content
+properly in the endnotes list.
+
+Thus, the manpages stylesheet not emits a warning message for that
+case, and suggests the "fix" (which is to wrap the <a href="http://docbook.org/tdg5/en/html/table.html"><code class="sgmltag-element">table</code></a> or
+<a href="http://docbook.org/tdg5/en/html/itemizedlist.html"><code class="sgmltag-element">itemizedlist</code></a> or whatever in a <a href="http://docbook.org/tdg5/en/html/para.html"><code class="sgmltag-element">para</code></a> that has some preferatory text.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: utility.xsl</code></p><pre class="screen"><span class="commit-message">Added support to mixed-block template for handling tables in
+mixed-blocks (e.g., as child of <a href="http://docbook.org/tdg5/en/html/para.html"><code class="sgmltag-element">para</code></a>) correctly.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: table.xsl; synop.xsl; block.xsl; info.xsl; lists.xsl; refentry.xsl; end&#8943;</code></p><pre class="screen"><span class="commit-message">Reverted necessary escaping of backslash, dot, and dash
+out of the well-intentioned (but it now appears,
+misguided) "marker" mechanism (introduced in the 1.72.0
+release) -- which made use of alternative "marker"
+characters as internal representations of those
+characters, and then replaced them just prior to
+serialization -- and back into what's basically the
+system that was used prior to the 1.69.0 release; that
+is, into a part of stylesheet code that gets executed
+at the beginning of processing -- before any other roff
+markup up is. This change obviates the need for the
+marker system. It also requires a lot less RAM during
+processing (for large files, the marker mechanism
+ending up requiring gigabytes of memory).
+
+Closes bug #1661177. Thanks to Scott Smedley for
+providing a test case (the fvwm man page) that exposed
+the problem with the marker mechanism.
+
+Also moved the mechanism for converting non-breaking
+spaces back into the same <a href="http://docbook.org/tdg5/en/html/area.html"><code class="sgmltag-element">area</code></a> of the stylesheet code.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: lists.xsl</code></p><pre class="screen"><span class="commit-message">Fixed problem with incorrect formatting of nested <a href="http://docbook.org/tdg5/en/html/variablelist.html"><code class="sgmltag-element">variablelist</code></a>.
+Closes bug #1650931. Thanks to Daniel "Eagle Eye" Leidert.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: lists.xsl</code></p><pre class="screen"><span class="commit-message">Make sure that all listitems in <a href="http://docbook.org/tdg5/en/html/itemizedlist.html"><code class="sgmltag-element">itemizedlist</code></a> and <a href="http://docbook.org/tdg5/en/html/orderedlist.html"><code class="sgmltag-element">orderedlist</code></a> are
+preceded by a blank line. This fixes a regression that occurred
+when instances of the TP macro that were use in a previous
+versions of the list-handling code were switched to RS/RE (because
+TP doesn't support nesting). TP automatically generates a blank
+line, but RS doesn't. So I added a .sp before each .RS</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: block.xsl; inline.xsl; param.xweb; docbook.xsl; links.xsl; param.ent</code></p><pre class="screen"><span class="commit-message">Made a number of changes related to elements with
+out-of-line content:
+
+- Added handling for <a href="http://docbook.org/tdg5/en/html/mediaobject.html"><code class="sgmltag-element">mediaobject</code></a> &amp; <a href="http://docbook.org/tdg5/en/html/inlinemediaobject.html"><code class="sgmltag-element">inlinemediaobject</code></a>.
+ Each <a href="http://docbook.org/tdg5/en/html/imagedata.html"><code class="sgmltag-element">imagedata</code></a>, <a href="http://docbook.org/tdg5/en/html/audiodata.html"><code class="sgmltag-element">audiodata</code></a>, or <a href="http://docbook.org/tdg5/en/html/videodata.html"><code class="sgmltag-element">videodata</code></a> element
+ within a <a href="http://docbook.org/tdg5/en/html/mediaobject.html"><code class="sgmltag-element">mediaobject</code></a> or inline <a href="http://docbook.org/tdg5/en/html/mediaobject.html"><code class="sgmltag-element">mediaobject</code></a> is now
+ treated as a "notesource" and so handled in much the
+ same way as links and <a href="http://docbook.org/tdg5/en/html/annotation.html"><code class="sgmltag-element">annotation</code></a>/<a href="http://docbook.org/tdg5/en/html/alt.html"><code class="sgmltag-element">alt</code></a>/footnotes.
+
+ That means a numbered marker is generated inline to
+ mark the place in the main flow where the <a href="http://docbook.org/tdg5/en/html/imagedata.html"><code class="sgmltag-element">imagedata</code></a>,
+ <a href="http://docbook.org/tdg5/en/html/audiodata.html"><code class="sgmltag-element">audiodata</code></a>, or <a href="http://docbook.org/tdg5/en/html/videodata.html"><code class="sgmltag-element">videodata</code></a> element occurs, and a
+ corresponding numbered endnote for it is generated in
+ the endnotes list at the end of the man page; the
+ endnote contains the URL from the fileref attribute
+ of the <a href="http://docbook.org/tdg5/en/html/imagedata.html"><code class="sgmltag-element">imagedata</code></a>, <a href="http://docbook.org/tdg5/en/html/audiodata.html"><code class="sgmltag-element">audiodata</code></a>, or <a href="http://docbook.org/tdg5/en/html/videodata.html"><code class="sgmltag-element">videodata</code></a> element.
+
+ For mediobject and <a href="http://docbook.org/tdg5/en/html/inlinemediaobject.html"><code class="sgmltag-element">inlinemediaobject</code></a> instances that
+ have a <a href="http://docbook.org/tdg5/en/html/textobject.html"><code class="sgmltag-element">textobject</code></a> child, the <a href="http://docbook.org/tdg5/en/html/textobject.html"><code class="sgmltag-element">textobject</code></a> is displayed
+ within the main text flow.
+
+- Renamed several man.link.* params to man.endnotes.*,
+ to reflect that fact that the endnotes list now
+ contains more than just links. Also did similar
+ renaming for a number of stylesheet-internal vars.
+
+- Added support for xlink:href (along with existing
+ support for the legacy ulink element).
+
+- Cleaned up and streamlined the endnotes-handling
+ code. It's still messy and klunky and the basic
+ mechanism it uses is very inefficent for documents
+ that contain a lot of notesources, but at least it's
+ a bit better than it was.</span></pre>
+</li></ul></div>
+</div>
+<div class="sect2" title="Eclipse"><div class="titlepage"><div><div><h3 class="title"><a name="V1.73.0_Eclipse"></a>Eclipse</h3></div></div></div>
+
+<p>The following changes have been made to the
+ <code class="filename">eclipse</code> code
+ since the 1.72.0 release.</p>
+<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
+<p><code class="literal">Mauritz Jeanson: Makefile</code></p><pre class="screen"><span class="commit-message">Fixed bug #1715093: Makefile for creating profiled version of eclipse.xsl added.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">David Cramer: eclipse.xsl</code></p><pre class="screen"><span class="commit-message">Added normalize-space around to avoid leading whitespace from appearing in the output if there's extra leading whitespace (e.g. &lt;<a href="http://docbook.org/tdg5/en/html/title.html"><code class="sgmltag-element">title</code></a>&gt; Foo&lt;/<a href="http://docbook.org/tdg5/en/html/title.html"><code class="sgmltag-element">title</code></a>&gt;) in the source</span></pre>
+</li></ul></div>
+</div>
+<div class="sect2" title="JavaHelp"><div class="titlepage"><div><div><h3 class="title"><a name="V1.73.0_JavaHelp"></a>JavaHelp</h3></div></div></div>
+
+<p>The following changes have been made to the
+ <code class="filename">javahelp</code> code
+ since the 1.72.0 release.</p>
+<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
+<p><code class="literal">Mauritz Jeanson: javahelp.xsl</code></p><pre class="screen"><span class="commit-message">Implemented FR #1230233 (sorted <a href="http://docbook.org/tdg5/en/html/index.html"><code class="sgmltag-element">index</code></a> in javahelp).</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Mauritz Jeanson: javahelp.xsl</code></p><pre class="screen"><span class="commit-message">Added normalize-space() around titles and <a href="http://docbook.org/tdg5/en/html/index.html"><code class="sgmltag-element">index</code></a> entries to work around whitespace problems.
+Added support for <a href="http://docbook.org/tdg5/en/html/glossary.html"><code class="sgmltag-element">glossary</code></a> and <a href="http://docbook.org/tdg5/en/html/bibliography.html"><code class="sgmltag-element">bibliography</code></a> in <a href="http://docbook.org/tdg5/en/html/toc.html"><code class="sgmltag-element">toc</code></a> and map files.</span></pre>
+</li></ul></div>
+</div>
+<div class="sect2" title="Roundtrip"><div class="titlepage"><div><div><h3 class="title"><a name="V1.73.0_Roundtrip"></a>Roundtrip</h3></div></div></div>
+
+<p>The following changes have been made to the
+ <code class="filename">roundtrip</code> code
+ since the 1.72.0 release.</p>
+<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
+<p><code class="literal">Steve Ball: blocks2dbk.xsl; wordml2normalise.xsl; normalise2sections.xsl; sections2blocks.&#8943;</code></p><pre class="screen"><span class="commit-message">new stylesheets for better word processor support and easier maintenance</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Steve Ball: template-pages.xml; dbk2wp.xsl; sections-spec.xml</code></p><pre class="screen"><span class="commit-message">fixed bugs</span></pre>
+</li></ul></div>
+</div>
+<div class="sect2" title="Params"><div class="titlepage"><div><div><h3 class="title"><a name="V1.73.0_Params"></a>Params</h3></div></div></div>
+
+<p>The following changes have been made to the
+ <code class="filename">params</code> code
+ since the 1.72.0 release.</p>
+<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
+<p><code class="literal">Mauritz Jeanson: htmlhelp.button.back.xml; htmlhelp.button.forward.xml; htmlhelp.button.zo&#8943;</code></p><pre class="screen"><span class="commit-message">Modified <a href="http://docbook.org/tdg5/en/html/refpurpose.html"><code class="sgmltag-element">refpurpose</code></a> text.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Mauritz Jeanson: htmlhelp.map.file.xml; htmlhelp.force.map.and.alias.xml; htmlhelp.alias.f&#8943;</code></p><pre class="screen"><span class="commit-message">Fixed typos, made some small changes.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Mauritz Jeanson: javahelp.encoding.xml</code></p><pre class="screen"><span class="commit-message">Moved declaration and documentation of <a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/javahelp.encoding.html"><em class="parameter"><code>javahelp.encoding</code></em></a> from javahelp.xsl to the
+regular "parameter machinery".</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Mauritz Jeanson: generate.id.attributes.xml</code></p><pre class="screen"><span class="commit-message">Added <a href="http://docbook.org/tdg5/en/html/refpurpose.html"><code class="sgmltag-element">refpurpose</code></a> text.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Mauritz Jeanson: annotation.js.xml; annotation.graphic.open.xml; annotation.graphic.close.&#8943;</code></p><pre class="screen"><span class="commit-message">Added better <a href="http://docbook.org/tdg5/en/html/refpurpose.html"><code class="sgmltag-element">refpurpose</code></a> texts.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: chunker.output.cdata-section-elements.xml; chunker.output.standalone.xm&#8943;</code></p><pre class="screen"><span class="commit-message">Fixed some broken formatting in source files for chunker.* params,
+as pointed out by Dave Pawson.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: label.from.part.xml</code></p><pre class="screen"><span class="commit-message">Changed handling of <a href="http://docbook.org/tdg5/en/html/reference.html"><code class="sgmltag-element">reference</code></a> auto-labeling such that <a href="http://docbook.org/tdg5/en/html/reference.html"><code class="sgmltag-element">reference</code></a>
+(when it appears at the component level) is now affected by the
+<a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/label.from.part.html"><em class="parameter"><code>label.from.part</code></em></a> param, just as <a href="http://docbook.org/tdg5/en/html/preface.html"><code class="sgmltag-element">preface</code></a>, <a href="http://docbook.org/tdg5/en/html/chapter.html"><code class="sgmltag-element">chapter</code></a>, and <a href="http://docbook.org/tdg5/en/html/appendix.html"><code class="sgmltag-element">appendix</code></a>.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Mauritz Jeanson: callout.graphics.extension.xml</code></p><pre class="screen"><span class="commit-message">Clarified that 'extension' refers to file names.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: abstract.notitle.enabled.xml</code></p><pre class="screen"><span class="commit-message">Added new param <a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/abstract.notitle.enabled.html"><em class="parameter"><code>abstract.notitle.enabled</code></em></a>.
+If non-zero, in output of the <a href="http://docbook.org/tdg5/en/html/abstract.html"><code class="sgmltag-element">abstract</code></a> element on titlepages,
+display of the <a href="http://docbook.org/tdg5/en/html/abstract.html"><code class="sgmltag-element">abstract</code></a> <a href="http://docbook.org/tdg5/en/html/title.html"><code class="sgmltag-element">title</code></a> is suppressed.
+Because sometimes you really don't want or need that <a href="http://docbook.org/tdg5/en/html/title.html"><code class="sgmltag-element">title</code></a>
+there...</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: man.string.subst.map.xml</code></p><pre class="screen"><span class="commit-message">Updated manpages string-substitute map to reflect fact that
+because of another recent change to suppress bold markup in .SH
+output, we no longer need to add a workaround for the accidental
+uppercasing of roff escapes that occurred previously.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Jirka Kosek: margin.note.float.type.xml; title.font.family.xml; table.frame.border.color.x&#8943;</code></p><pre class="screen"><span class="commit-message">Improved parameter metadata</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Robert Stayton: profile.wordsize.xml; profile.audience.xml</code></p><pre class="screen"><span class="commit-message">Add support for profiling on new attributes audience and wordsize.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Robert Stayton: callout.graphics.number.limit.xml; callout.graphics.extension.xml</code></p><pre class="screen"><span class="commit-message">Added SVG graphics for fo output.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Robert Stayton: callout.icon.size.xml</code></p><pre class="screen"><span class="commit-message">Set size of <a href="http://docbook.org/tdg5/en/html/callout.html"><code class="sgmltag-element">callout</code></a> graphics.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Jirka Kosek: default.units.xml; chunker.output.method.xml; toc.list.type.xml; output.inden&#8943;</code></p><pre class="screen"><span class="commit-message">Updated parameter metadata to the new format.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Jirka Kosek: man.output.quietly.xml; title.font.family.xml; footnote.sep.leader.properties&#8943;</code></p><pre class="screen"><span class="commit-message">Added type annotations into parameter definition files.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Robert Stayton: section.container.element.xml</code></p><pre class="screen"><span class="commit-message">Support spans in sections for certain processors.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Robert Stayton: component.titlepage.properties.xml</code></p><pre class="screen"><span class="commit-message">Empty attribute set for top level component titlepage block.
+Allows setting a span on <a href="http://docbook.org/tdg5/en/html/title.html"><code class="sgmltag-element">title</code></a> <a href="http://docbook.org/tdg5/en/html/info.html"><code class="sgmltag-element">info</code></a>.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Jirka Kosek: bibliography.style.xml</code></p><pre class="screen"><span class="commit-message">Added <a href="http://docbook.org/tdg5/en/html/link.html"><code class="sgmltag-element">link</code></a> to WiKi page with description of special markup needed for ISO690 biblioentries</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Robert Stayton: make.year.ranges.xml</code></p><pre class="screen"><span class="commit-message">Clarify that multiple <a href="http://docbook.org/tdg5/en/html/year.html"><code class="sgmltag-element">year</code></a> elements are required.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Robert Stayton: id.warnings.xml</code></p><pre class="screen"><span class="commit-message">Turn off <a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/id.warnings.html"><em class="parameter"><code>id.warnings</code></em></a> by default.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Jirka Kosek: bibliography.style.xml</code></p><pre class="screen"><span class="commit-message">Added support for formatting biblioentries according to ISO690 <a href="http://docbook.org/tdg5/en/html/citation.html"><code class="sgmltag-element">citation</code></a> style.
+New <a href="http://docbook.org/tdg5/en/html/bibliography.html"><code class="sgmltag-element">bibliography</code></a> style can be turned on by setting parameter <a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/bibliography.style.html"><em class="parameter"><code>bibliography.style</code></em></a> to "iso690"
+The code was provided by Jana Dvorakova</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Robert Stayton: header.table.properties.xml; footer.table.properties.xml</code></p><pre class="screen"><span class="commit-message">Support adding <a href="http://docbook.org/tdg5/en/html/table.html"><code class="sgmltag-element">table</code></a> properties to header and footer tables.</span></pre>
+</li></ul></div>
+</div>
+<div class="sect2" title="Highlighting"><div class="titlepage"><div><div><h3 class="title"><a name="V1.73.0_Highlighting"></a>Highlighting</h3></div></div></div>
+
+<p>The following changes have been made to the
+ <code class="filename">highlighting</code> code
+ since the 1.72.0 release.</p>
+<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
+<p><code class="literal">Jirka Kosek: c-hl.xml; xslthl-config.xml</code></p><pre class="screen"><span class="commit-message">Added support for C language. Provided by Bruno Guegan.</span></pre>
+</li></ul></div>
+</div>
+<div class="sect2" title="Profiling"><div class="titlepage"><div><div><h3 class="title"><a name="V1.73.0_Profiling"></a>Profiling</h3></div></div></div>
+
+<p>The following changes have been made to the
+ <code class="filename">profiling</code> code
+ since the 1.72.0 release.</p>
+<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
+<p><code class="literal">Robert Stayton: profile-mode.xsl</code></p><pre class="screen"><span class="commit-message">Add support for new profiling attributes audience and wordsize.</span></pre>
+</li></ul></div>
+</div>
+<div class="sect2" title="Lib"><div class="titlepage"><div><div><h3 class="title"><a name="V1.73.0_Lib"></a>Lib</h3></div></div></div>
+
+<p>The following changes have been made to the
+ <code class="filename">lib</code> code
+ since the 1.72.0 release.</p>
+<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: lib.xweb</code></p><pre class="screen"><span class="commit-message">Changed name of prepend-pad template to pad-string and twheeked so
+it can do both right/left padding.</span></pre>
+</li></ul></div>
+</div>
+<div class="sect2" title="Tools"><div class="titlepage"><div><div><h3 class="title"><a name="V1.73.0_Tools"></a>Tools</h3></div></div></div>
+
+<p>The following changes have been made to the
+ <code class="filename">tools</code> code
+ since the 1.72.0 release.</p>
+<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: bin; bin/docbook-xsl-update</code></p><pre class="screen"><span class="commit-message">Did some cleanup to the install.sh source and added a
+docbook-xsl-update script to the docbook-xsl distro, the purpose
+of which is to facilitate easy sync-up to the latest docbook-xsl
+snapshot (by means of rsync).</span></pre>
+</li></ul></div>
+</div>
+<div class="sect2" title="XSL-Saxon"><div class="titlepage"><div><div><h3 class="title"><a name="V1.73.0_XSL-Saxon"></a>XSL-Saxon</h3></div></div></div>
+
+<p>The following changes have been made to the
+ <code class="filename">xsl-saxon</code> code
+ since the 1.72.0 release.</p>
+<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
+<p><code class="literal">Mauritz Jeanson: xalan27/src/com/nwalsh/xalan/Verbatim.java; xalan27/src/com/nwalsh/xalan/&#8943;</code></p><pre class="screen"><span class="commit-message">Added modifications so that the new <a href="http://docbook.sourceforge.net/release/xsl/current/doc/fo/callout.icon.size.html"><em class="parameter"><code>callout.icon.size</code></em></a> parameter is taken into account. This
+parameter is used for FO output (where SVG now is the default graphics format for callouts).</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Mauritz Jeanson: saxon65/src/com/nwalsh/saxon/FormatCallout.java; xalan27/src/com/nwalsh/x&#8943;</code></p><pre class="screen"><span class="commit-message">Added code for generating id attributes on callouts in HTML and FO output.
+These patches enable cross-references to callouts placed by <a href="http://docbook.org/tdg5/en/html/area.html"><code class="sgmltag-element">area</code></a> coordinates.
+It works for graphic, unicode and text callouts.
+Part of fix for bug #1675513 (<a href="http://docbook.org/tdg5/en/html/xref.html"><code class="sgmltag-element">xref</code></a> to <a href="http://docbook.org/tdg5/en/html/area.html"><code class="sgmltag-element">area</code></a> broken).</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: saxon65/src/com/nwalsh/saxon/Website.java; xalan27/src/com/nwalsh/xalan&#8943;</code></p><pre class="screen"><span class="commit-message">Copied over Website XSL Java extensions.</span></pre>
+</li></ul></div>
+</div>
+<div class="sect2" title="XSL-Xalan"><div class="titlepage"><div><div><h3 class="title"><a name="V1.73.0_XSL-Xalan"></a>XSL-Xalan</h3></div></div></div>
+
+<p>The following changes have been made to the
+ <code class="filename">xsl-xalan</code> code
+ since the 1.72.0 release.</p>
+<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: Makefile; xalan2</code></p><pre class="screen"><span class="commit-message">Turned off xalan2.jar build. This removes DocBook XSL
+Java extensions support for versions of Xalan prior to
+Xalan 2.7. If you are currently using the extensions
+with an earlier version of Xalan, you need to upgrade
+to Xalan 2.7.</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Mauritz Jeanson: xalan27/src/com/nwalsh/xalan/Verbatim.java; xalan27/src/com/nwalsh/xalan/&#8943;</code></p><pre class="screen"><span class="commit-message">Added modifications so that the new <a href="http://docbook.sourceforge.net/release/xsl/current/doc/fo/callout.icon.size.html"><em class="parameter"><code>callout.icon.size</code></em></a> parameter is taken into account. This
+parameter is used for FO output (where SVG now is the default graphics format for callouts).</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Mauritz Jeanson: saxon65/src/com/nwalsh/saxon/FormatCallout.java; xalan27/src/com/nwalsh/x&#8943;</code></p><pre class="screen"><span class="commit-message">Added code for generating id attributes on callouts in HTML and FO output.
+These patches enable cross-references to callouts placed by <a href="http://docbook.org/tdg5/en/html/area.html"><code class="sgmltag-element">area</code></a> coordinates.
+It works for graphic, unicode and text callouts.
+Part of fix for bug #1675513 (<a href="http://docbook.org/tdg5/en/html/xref.html"><code class="sgmltag-element">xref</code></a> to <a href="http://docbook.org/tdg5/en/html/area.html"><code class="sgmltag-element">area</code></a> broken).</span></pre>
+</li><li class="listitem">
+<p><code class="literal">Michael(tm) Smith: saxon65/src/com/nwalsh/saxon/Website.java; xalan27/src/com/nwalsh/xalan&#8943;</code></p><pre class="screen"><span class="commit-message">Copied over Website XSL Java extensions.</span></pre>
+</li></ul></div>
+</div>
+</div>
+
+<div class="sect1" title="Release: 1.72.0"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="V1.72.0"></a>Release: 1.72.0</h2></div></div></div>
+
+<p>This release includes important bug fixes and adds the following
+significant feature changes:
+</p><div class="variablelist"><dl><dt><span class="term">Automatic sorting of glossary entries</span></dt><dd>
+ <p>The HTML and FO stylesheets now support automatic sorting
+ of <a href="http://docbook.org/tdg5/en/html/glossary.html"><code class="sgmltag-element">glossary</code></a> entries. To enable glossary sorting, set
+ the value of the <a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/glossary.sort.html"><em class="parameter"><code>glossary.sort </code></em></a> parameter
+ to <code class="code">1</code> (by default, it&#8217;s value is
+ <code class="code">0</code>). When you enable glossary sorting,
+ <a href="http://docbook.org/tdg5/en/html/glossentry.html"><code class="sgmltag-element">glossentry</code></a> elements within a <a href="http://docbook.org/tdg5/en/html/glossary.html"><code class="sgmltag-element"> glossary</code></a>,
+ <a href="http://docbook.org/tdg5/en/html/glossdiv.html"><code class="sgmltag-element">glossdiv</code></a>, or <a href="http://docbook.org/tdg5/en/html/glosslist.html"><code class="sgmltag-element">glosslist</code></a> are sorted on the
+ <a href="http://docbook.org/tdg5/en/html/glossterm.html"><code class="sgmltag-element">glossterm</code></a>, using the current language setting. If you
+ don&#8217;t enable glossary sorting, then the order of
+ <a href="http://docbook.org/tdg5/en/html/glossentry.html"><code class="sgmltag-element">glossentry</code></a> elements is left &#8220;as is&#8221; &#8212; that is, they
+ are not sorted but are instead just displayed in document
+ order.</p>
+ </dd><dt><span class="term">WordML renamed to Roundtrip, OpenOffice support added</span></dt><dd>
+ <p>Stylesheets for &#8220;roundtrip&#8221; conversion between documents in
+ OpenOffice format (ODF) and DocBook XML have been added to the set
+ of stylesheets that formerly had the collective title
+ <em class="wordasword">WordML</em>, and that set of stylesheets has
+ been renamed to <em class="wordasword">Roundtrip</em> to better
+ reflect the actual scope and purpose of its contents.</p>
+ <p>So the DocBook XSL Stylesheets now support roundtrip
+ conversion (with certain limitations) of WordML, OpenOffice, and
+ Apple Pages documents to and from DocBook XML.</p>
+ </dd><dt><span class="term">Including QandASet questions in TOCs</span></dt><dd>
+ <p>The HTML stylesheet now provides support for including
+ <a href="http://docbook.org/tdg5/en/html/qandaset.html"><code class="sgmltag-element">QandASet</code></a> <a href="http://docbook.org/tdg5/en/html/question.html"><code class="sgmltag-element">question</code></a>s in the document TOC. To
+ enable display of <a href="http://docbook.org/tdg5/en/html/question.html"><code class="sgmltag-element">question</code></a>s in the document TOC, set
+ the value of the <a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/qanda.in.toc.html"><em class="parameter"><code>qanda.in.toc</code></em></a> to
+ <code class="code">1</code> (by default, it&#8217;s <code class="code">0</code>). When you
+ enable <a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/qanda.in.toc.html"><em class="parameter"><code>qanda.in.toc</code></em></a>, then the generated
+ table of contents for a document will include
+ <a href="http://docbook.org/tdg5/en/html/qandaset.html"><code class="sgmltag-element">qandaset</code></a> titles, <a href="http://docbook.org/tdg5/en/html/qandadiv.html"><code class="sgmltag-element">qandadiv</code></a> titles, and
+ <a href="http://docbook.org/tdg5/en/html/question.html"><code class="sgmltag-element">question</code></a> elements. The default value of zero
+ excludes them from the TOC.
+ </p><div class="note" title="Note" style="margin-left: 0.5in; margin-right: 0.5in;"><h3 class="title">Note</h3>
+ <p>The <a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/qanda.in.toc.html"><em class="parameter"><code>qanda.in.toc</code></em></a> parameter does
+ not affect any tables of contents that may be generated
+ <span class="emphasis"><em>within</em></span> a <a href="http://docbook.org/tdg5/en/html/qandaset.html"><code class="sgmltag-element">qandaset</code></a> or
+ <a href="http://docbook.org/tdg5/en/html/qandadiv.html"><code class="sgmltag-element">qandadiv</code></a> (only in the document TOC).</p>
+ </div><p>
+ </p>
+ </dd><dt><span class="term">Language identifier in man-page filenames and pathnames</span></dt><dd>
+ <p>Added new parameter <a href="http://docbook.sourceforge.net/release/xsl/current/doc/manpages/man.output.lang.in.name.enabled.html"><em class="parameter"><code>man.output.lang.in.name.enabled</code></em></a>, which controls whether
+ a language identifier is included in man-page filenames and
+ pathnames. It works like this:</p>
+
+ <p>If the value of <a href="http://docbook.sourceforge.net/release/xsl/current/doc/manpages/man.output.lang.in.name.enabled.html"><em class="parameter"><code>man.output.lang.in.name.enabled</code></em></a> is non-zero,
+ man-page files are output with a language identifier included in
+ their filenames or pathnames as follows:</p>
+
+ <div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>if
+ <a href="http://docbook.sourceforge.net/release/xsl/current/doc/manpages/man.output.subdirs.enabled.html"><em class="parameter"><code>man.output.subdirs.enabled</code></em></a> is non-zero,
+ each file is output to, e.g., a
+ <code class="filename">/$lang/man8/foo.8</code> pathname</p></li><li class="listitem"><p>if
+ <a href="http://docbook.sourceforge.net/release/xsl/current/doc/manpages/man.output.subdirs.enabled.html"><em class="parameter"><code>man.output.subdirs.enabled</code></em></a> is zero,
+ each file is output with a <code class="sgmltag-element">foo.$lang.8</code>
+ filename</p></li></ul></div>
+
+ </dd><dt><span class="term"><a href="http://docbook.sourceforge.net/release/xsl/current/doc/fo/index.page.number.properties.html"><em class="parameter"><code>index.page.number.properties</code></em></a> property set</span></dt><dd>
+ <p>For FO output, use the
+ <a href="http://docbook.sourceforge.net/release/xsl/current/doc/fo/index.page.number.properties.html"><em class="parameter"><code>index.page.number.properties</code></em></a> to control
+ formatting of page numbers in <a href="http://docbook.org/tdg5/en/html/index.html"><code class="sgmltag-element">index</code></a> output &#8212; to (for
+ example) to display page numbers in <a href="http://docbook.org/tdg5/en/html/index.html"><code class="sgmltag-element">index</code></a> output in a
+ different color (to indicate that they are links).</p>
+ </dd><dt><span class="term">Crop marks in output from Antenna House XSL Formatter</span></dt><dd>
+ <p>Support has been added for generating crop marks in
+ print/PDF output generated using Antenna House XSL Formatter</p>
+ </dd><dt><span class="term">More string-substitution hooks in manpages output</span></dt><dd>
+ <p>The <a href="http://docbook.sourceforge.net/release/xsl/current/doc/manpages/man.string.subst.map.local.pre.html"><em class="parameter"><code>man.string.subst.map.local.pre</code></em></a>
+ and <a href="http://docbook.sourceforge.net/release/xsl/current/doc/manpages/man.string.subst.map.local.post.html"><em class="parameter"><code>man.string.subst.map.local.post</code></em></a>
+ parameters have been added to enable easier control over
+ custom string substitutions.</p>
+ </dd><dt><span class="term">Moved verbatim properties to attribute-set</span></dt><dd>
+ <p>The hardcoded properties used in verbatim elements (literallayout,
+ programlisting, screen) were moved to the verbatim.properties
+ attribute-set so they can be more easily customized.</p>
+ </dd><dt><span class="term">enhanced simple.xlink template</span></dt><dd>
+ <p>Now the simple.xlink template in inline.xsl works with
+ cross reference elements xref and link as well. Also, more elements
+ call simple.xlink, which enables DB5 xlink functionality.
+ </p>
+ </dd><dt><span class="term">DocBook 5 compatibility</span></dt><dd>
+ <p>Stylesheets now consistently support DocBook 5 attributes
+ (such as xml:id). Also, DocBook 5 info elements are now checked
+ along with other *info elements, and the use of name() function
+ was replaced by local-name() so it also matches on DocBook 5 elements.
+ These changes enable reusing the stylesheets with DocBook 5
+ documents with minimal fixup.
+ </p>
+ </dd><dt><span class="term">HTML class attributes now handled in class.attribute mode </span></dt><dd>
+ <p>The HTML class attributes were formerly hardcoded to the
+ element name. Now the class attribute is generated by applying
+ templates in class.attribute mode so class attribute names
+ can be customized. The default is still the element name.</p>
+ </dd><dt><span class="term">arabic-indic numbering enabled in autolabels</span></dt><dd>
+ <p>Numbering of chapter, sections, and pages can now use
+ arabic-indic numbering when number format is set to 'arabicindic' or
+ to &#1633;.</p>
+ </dd></dl></div><p>
+The following is a detailed list of changes (not
+including bug fixes) that have been made since the 1.71.1
+release.</p>
+
+<div class="sect2" title="Common"><div class="titlepage"><div><div><h3 class="title"><a name="V1.72.0_Common"></a>Common</h3></div></div></div>
+
+<p>The following changes have been made to the
+ <code class="filename">common</code> code
+ since the 1.71.1 release.</p>
+<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
+<div class="literallayout"><p><span class="commit-message">Add support for arabicindic numbering to autolabel.format template.</span></p></div>
+</li><li class="listitem">
+<div class="literallayout"><p><span class="commit-message">Finish support for @xml:id everywhere @id is used.</span></p></div>
+</li><li class="listitem">
+<div class="literallayout"><p><span class="commit-message">replace name() with local-name() in most cases.</span></p></div>
+</li><li class="listitem">
+<div class="literallayout"><p><span class="commit-message">Add support for <a href="http://docbook.org/tdg5/en/html/info.html"><code class="sgmltag-element">info</code></a>.</span></p></div>
+</li><li class="listitem">
+<div class="literallayout"><p><span class="commit-message">Add utility template tabstyle to return the tabstyle from<br>
+any <a href="http://docbook.org/tdg5/en/html/table.html"><code class="sgmltag-element">table</code></a> element.</span></p></div>
+</li></ul></div>
+</div>
+
+<div class="sect2" title="FO"><div class="titlepage"><div><div><h3 class="title"><a name="V1.72.0_FO"></a>FO</h3></div></div></div>
+
+<p>The following changes have been made to the
+ <code class="filename">fo</code> code
+ since the 1.71.1 release.</p>
+<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
+<div class="literallayout"><p><span class="commit-message">Add support for sorting <a href="http://docbook.org/tdg5/en/html/glossary.html"><code class="sgmltag-element">glossary</code></a> entries</span></p></div>
+</li><li class="listitem">
+<div class="literallayout"><p><span class="commit-message">Add table.row.properties template to customize <a href="http://docbook.org/tdg5/en/html/table.html"><code class="sgmltag-element">table</code></a> rows.</span></p></div>
+</li><li class="listitem">
+<div class="literallayout"><p><span class="commit-message">Moved all properties to attribute-sets so can be customized more easily.</span></p></div>
+</li><li class="listitem">
+<div class="literallayout"><p><span class="commit-message">Add index.page.number.properties attribute-set to format page numbers.</span></p></div>
+</li><li class="listitem">
+<div class="literallayout"><p><span class="commit-message"><a href="http://docbook.org/tdg5/en/html/xref.html"><code class="sgmltag-element">xref</code></a> now supports xlink:href, using simple.xlink template.</span></p></div>
+</li><li class="listitem">
+<div class="literallayout"><p><span class="commit-message">Rewrote simple.xlink, and call it with all charseq templates.</span></p></div>
+</li><li class="listitem">
+<div class="literallayout"><p><span class="commit-message">Add simple.xlink processing to <a href="http://docbook.org/tdg5/en/html/term.html"><code class="sgmltag-element">term</code></a> and <a href="http://docbook.org/tdg5/en/html/member.html"><code class="sgmltag-element">member</code></a> elements.</span></p></div>
+</li><li class="listitem">
+<div class="literallayout"><p><span class="commit-message">Add support for crop marks in Antenna House.</span></p></div>
+</li></ul></div>
+</div>
+
+<div class="sect2" title="HTML"><div class="titlepage"><div><div><h3 class="title"><a name="V1.72.0_HTML"></a>HTML</h3></div></div></div>
+
+<p>The following changes have been made to the
+ <code class="filename">html</code> code
+ since the 1.71.1 release.</p>
+<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
+<div class="literallayout"><p><span class="commit-message">Add support for sorting <a href="http://docbook.org/tdg5/en/html/glossary.html"><code class="sgmltag-element">glossary</code></a> entries</span></p></div>
+</li><li class="listitem">
+<div class="literallayout"><p><span class="commit-message">Add support for <a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/qanda.in.toc.html"><em class="parameter"><code>qanda.in.toc</code></em></a> to add <a href="http://docbook.org/tdg5/en/html/qandaentry.html"><code class="sgmltag-element">qandaentry</code></a> questions to document <a href="http://docbook.org/tdg5/en/html/toc.html"><code class="sgmltag-element">TOC</code></a>.</span></p></div>
+</li><li class="listitem">
+<div class="literallayout"><p><span class="commit-message">add simple.xlink support to <a href="http://docbook.org/tdg5/en/html/variablelist.html"><code class="sgmltag-element">variablelist</code></a> <a href="http://docbook.org/tdg5/en/html/term.html"><code class="sgmltag-element">term</code></a> and <a href="http://docbook.org/tdg5/en/html/simplelist.html"><code class="sgmltag-element">simplelist</code></a> <a href="http://docbook.org/tdg5/en/html/member.html"><code class="sgmltag-element">member</code></a>.</span></p></div>
+</li><li class="listitem">
+<div class="literallayout"><p><span class="commit-message">*.propagates.style now handled in class.attribute mode.</span></p></div>
+</li><li class="listitem">
+<div class="literallayout"><p><span class="commit-message">add class parameter to class.attribute mode to set default class.</span></p></div>
+</li><li class="listitem">
+<div class="literallayout"><p><span class="commit-message">Convert all class attributes to use the class.attribute mode<br>
+so class names can be customized more easily.</span></p></div>
+</li><li class="listitem">
+<div class="literallayout"><p><span class="commit-message">Add class.attribute mode to generate class attributes.</span></p></div>
+</li><li class="listitem">
+<div class="literallayout"><p><span class="commit-message">Added simple.xlink to most remaining inlines.<br>
+Changed class attributes to applying class.attributes mode.</span></p></div>
+</li><li class="listitem">
+<div class="literallayout"><p><span class="commit-message">Changed <a href="http://docbook.org/tdg5/en/html/xref.html"><code class="sgmltag-element">xref</code></a> template to use simple.xlink tempalte.</span></p></div>
+</li><li class="listitem">
+<div class="literallayout"><p><span class="commit-message">Improve generate.html.title to work with <a href="http://docbook.org/tdg5/en/html/link.html"><code class="sgmltag-element">link</code></a> targets too.</span></p></div>
+</li><li class="listitem">
+<div class="literallayout"><p><span class="commit-message">Improved simple.xlink to support <a href="http://docbook.org/tdg5/en/html/link.html"><code class="sgmltag-element">link</code></a> and <a href="http://docbook.org/tdg5/en/html/xref.html"><code class="sgmltag-element">xref</code></a>.</span></p></div>
+</li><li class="listitem">
+<div class="literallayout"><p><span class="commit-message">Use new link.title.attribute now.</span></p></div>
+</li><li class="listitem">
+<div class="literallayout"><p><span class="commit-message">Rewrote simple.xlink to handle linkend also.<br>
+Better computation of <a href="http://docbook.org/tdg5/en/html/title.html"><code class="sgmltag-element">title</code></a> attribute on <a href="http://docbook.org/tdg5/en/html/link.html"><code class="sgmltag-element">link</code></a> too.</span></p></div>
+</li><li class="listitem">
+<div class="literallayout"><p><span class="commit-message">Handle Xalan quirk as special case.</span></p></div>
+</li><li class="listitem">
+<div class="literallayout"><p><span class="commit-message">Add support for <a href="http://docbook.org/tdg5/en/html/info.html"><code class="sgmltag-element">info</code></a>.</span></p></div>
+</li><li class="listitem">
+<div class="literallayout"><p><span class="commit-message">Fixed imagemaps so they work properly going from calspair coords<br>
+to HTML <a href="http://docbook.org/tdg5/en/html/area.html"><code class="sgmltag-element">area</code></a> coords.</span></p></div>
+</li></ul></div>
+</div>
+
+<div class="sect2" title="Manpages"><div class="titlepage"><div><div><h3 class="title"><a name="V1.72.0_Manpages"></a>Manpages</h3></div></div></div>
+
+<p>The following changes have been made to the
+ <code class="filename">manpages</code> code
+ since the 1.71.1 release.</p>
+<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
+<div class="literallayout"><p><span class="commit-message">Added doc for <a href="http://docbook.sourceforge.net/release/xsl/current/doc/manpages/man.output.lang.in.name.enabled.html"><em class="parameter"><code>man.output.lang.in.name.enabled</code></em></a> parameter. This<br>
+checkin completes support for writing file/pathnames for man-pages<br>
+with $lang include in the names. Closes #1585967. knightly<br>
+accolades to Daniel Leidert for providing the feature request.</span></p></div>
+</li><li class="listitem">
+<div class="literallayout"><p><span class="commit-message">Added new param <a href="http://docbook.sourceforge.net/release/xsl/current/doc/manpages/man.output.lang.in.name.enabled.html"><em class="parameter"><code>man.output.lang.in.name.enabled</code></em></a>, which<br>
+controls whether $LANG value is included in manpages<br>
+filenames and pathnames. It works like this:<br>
+<br>
+If the value of <a href="http://docbook.sourceforge.net/release/xsl/current/doc/manpages/man.output.lang.in.name.enabled.html"><em class="parameter"><code>man.output.lang.in.name.enabled</code></em></a> is non-zero,<br>
+man-page files are output with the $lang value included in<br>
+their filenames or pathnames as follows;<br>
+<br>
+- if <a href="http://docbook.sourceforge.net/release/xsl/current/doc/manpages/man.output.subdirs.enabled.html"><em class="parameter"><code>man.output.subdirs.enabled</code></em></a> is non-zero, each file is<br>
+  output to, e.g., a /$lang/man8/foo.8 pathname<br>
+<br>
+- if <a href="http://docbook.sourceforge.net/release/xsl/current/doc/manpages/man.output.subdirs.enabled.html"><em class="parameter"><code>man.output.subdirs.enabled</code></em></a> is zero, each file is output<br>
+  with a foo.$lang.8 <a href="http://docbook.org/tdg5/en/html/filename.html"><code class="sgmltag-element">filename</code></a></span></p></div>
+</li><li class="listitem">
+<div class="literallayout"><p><span class="commit-message">Use "\e" instead of "\\" for backslash output, because the<br>
+groff docs say that's the correct thing to do; also because<br>
+testing (thanks, Paul Dubois) shows that "\\" doesn't always<br>
+work as expected; for example, "\\" within a <a href="http://docbook.org/tdg5/en/html/table.html"><code class="sgmltag-element">table</code></a> seems to<br>
+mess things up.</span></p></div>
+</li><li class="listitem">
+<div class="literallayout"><p><span class="commit-message">Added the <a href="http://docbook.sourceforge.net/release/xsl/current/doc/manpages/man.string.subst.map.local.pre.html"><em class="parameter"><code>man.string.subst.map.local.pre</code></em></a> and<br>
+<a href="http://docbook.sourceforge.net/release/xsl/current/doc/manpages/man.string.subst.map.local.post.html"><em class="parameter"><code>man.string.subst.map.local.post</code></em></a> parameters. Those parameters<br>
+enable local additions and changes to string-substitution mappings<br>
+without the need to change the value of <a href="http://docbook.sourceforge.net/release/xsl/current/doc/manpages/man.string.subst.map.html"><em class="parameter"><code>man.string.subst.map</code></em></a><br>
+parameter (which is for standard system mappings). Closes<br>
+#1456738. Thanks to Sam Steingold for constructing a true<br>
+stylesheet torture test (the clisp docs) that exposed the need for<br>
+these params.</span></p></div>
+</li><li class="listitem">
+<div class="literallayout"><p><span class="commit-message">Added the Markup element to the list of elements that get output<br>
+in bold. Thanks to Eric S. Raymond.</span></p></div>
+</li><li class="listitem">
+<div class="literallayout"><p><span class="commit-message">Replaced all dots in roff requests with U+2302 ("house"<br>
+character), and added escaping in output for all instances of dot<br>
+that are not in roff requests. This fixes the problem case where a<br>
+string beginning with a dot (for example, the string ".bashrc")<br>
+might occur at the beginning of a line in output, in which case <br>
+would mistakenly get interpreted as a roff request. Thanks to Eric<br>
+S. Raymond for pushing to fix this.</span></p></div>
+</li><li class="listitem">
+<div class="literallayout"><p><span class="commit-message">Made change to ensure that list content nested in<br>
+<a href="http://docbook.org/tdg5/en/html/itemizedlist.html"><code class="sgmltag-element">itemizedlist</code></a> and <a href="http://docbook.org/tdg5/en/html/orderedlist.html"><code class="sgmltag-element">orderedlist</code></a> instances is properly indented. This<br>
+is a switch from using .TP to format those lists to using .RS/.RE<br>
+to format them instead (because .TP does not allow nesting). Closes bug #1602616.<br>
+Thanks to Daniel Leidert.</span></p></div>
+</li></ul></div>
+</div>
+
+<div class="sect2" title="Params"><div class="titlepage"><div><div><h3 class="title"><a name="V1.72.0_Params"></a>Params</h3></div></div></div>
+
+<p>The following changes have been made to the
+ <code class="filename">params</code> code
+ since the 1.71.1 release.</p>
+<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
+<div class="literallayout"><p><span class="commit-message">Added doc for <a href="http://docbook.sourceforge.net/release/xsl/current/doc/manpages/man.output.lang.in.name.enabled.html"><em class="parameter"><code>man.output.lang.in.name.enabled</code></em></a> parameter. This<br>
+checkin completes support for writing file/pathnames for man-pages<br>
+with $lang include in the names. Closes #1585967. knightly<br>
+accolades to Daniel Leidert for providing the feature request.</span></p></div>
+</li><li class="listitem">
+<div class="literallayout"><p><span class="commit-message">Added new param <a href="http://docbook.sourceforge.net/release/xsl/current/doc/manpages/man.output.lang.in.name.enabled.html"><em class="parameter"><code>man.output.lang.in.name.enabled</code></em></a>, which<br>
+controls whether $LANG value is included in manpages<br>
+filenames and pathnames. It works like this:<br>
+<br>
+If the value of <a href="http://docbook.sourceforge.net/release/xsl/current/doc/manpages/man.output.lang.in.name.enabled.html"><em class="parameter"><code>man.output.lang.in.name.enabled</code></em></a> is non-zero,<br>
+man-page files are output with the $lang value included in<br>
+their filenames or pathnames as follows;<br>
+<br>
+- if <a href="http://docbook.sourceforge.net/release/xsl/current/doc/manpages/man.output.subdirs.enabled.html"><em class="parameter"><code>man.output.subdirs.enabled</code></em></a> is non-zero, each file is<br>
+  output to, e.g., a /$lang/man8/foo.8 pathname<br>
+<br>
+- if <a href="http://docbook.sourceforge.net/release/xsl/current/doc/manpages/man.output.subdirs.enabled.html"><em class="parameter"><code>man.output.subdirs.enabled</code></em></a> is zero, each file is output<br>
+  with a foo.$lang.8 <a href="http://docbook.org/tdg5/en/html/filename.html"><code class="sgmltag-element">filename</code></a></span></p></div>
+</li><li class="listitem">
+<div class="literallayout"><p><span class="commit-message">Added the <a href="http://docbook.sourceforge.net/release/xsl/current/doc/manpages/man.string.subst.map.local.pre.html"><em class="parameter"><code>man.string.subst.map.local.pre</code></em></a> and<br>
+<a href="http://docbook.sourceforge.net/release/xsl/current/doc/manpages/man.string.subst.map.local.post.html"><em class="parameter"><code>man.string.subst.map.local.post</code></em></a> parameters. Those parameters<br>
+enable local additions and changes to string-substitution mappings<br>
+without the need to change the value of <a href="http://docbook.sourceforge.net/release/xsl/current/doc/manpages/man.string.subst.map.html"><em class="parameter"><code>man.string.subst.map</code></em></a><br>
+parameter (which is for standard system mappings). Closes<br>
+#1456738. Thanks to Sam Steingold for constructing a true<br>
+stylesheet torture test (the clisp docs) that exposed the need for<br>
+these params.</span></p></div>
+</li><li class="listitem">
+<div class="literallayout"><p><span class="commit-message">Add index.page.number.properties by default.</span></p></div>
+</li><li class="listitem">
+<div class="literallayout"><p><span class="commit-message">Added <a href="http://docbook.sourceforge.net/release/xsl/current/doc/fo/index.page.number.properties.html"><em class="parameter"><code>index.page.number.properties</code></em></a> to allow customizations of page numbers in indexes.</span></p></div>
+</li><li class="listitem">
+<div class="literallayout"><p><span class="commit-message">Move show-destination="replace" property from template to attribute-set<br>
+so it can be customized.</span></p></div>
+</li><li class="listitem">
+<div class="literallayout"><p><span class="commit-message">Add support for sorting <a href="http://docbook.org/tdg5/en/html/glossary.html"><code class="sgmltag-element">glossary</code></a> entries</span></p></div>
+</li><li class="listitem">
+<div class="literallayout"><p><span class="commit-message">Add option to include qanda in tables of contents.</span></p></div>
+</li><li class="listitem">
+<div class="literallayout"><p><span class="commit-message">Moved all properties to attribute-sets so can be customized more easily.</span></p></div>
+</li></ul></div>
+</div>
+
+<div class="sect2" title="Template"><div class="titlepage"><div><div><h3 class="title"><a name="V1.72.0_Template"></a>Template</h3></div></div></div>
+
+<p>The following changes have been made to the
+ <code class="filename">template</code> code
+ since the 1.71.1 release.</p>
+<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
+<div class="literallayout"><p><span class="commit-message">Added workaround for Xalan bug: use for-each and copy instead of copy-of (#1604770).</span></p></div>
+</li></ul></div>
+</div>
+
+<div class="sect2" title="Roundtrip"><div class="titlepage"><div><div><h3 class="title"><a name="V1.72.0_Roundtrip"></a>Roundtrip</h3></div></div></div>
+
+<p>The following changes have been made to the
+ <code class="filename">roundtrip</code> code
+ since the 1.71.1 release.</p>
+<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
+<div class="literallayout"><p><span class="commit-message">rename to roundtrip, add OpenOffice support</span></p></div>
+</li></ul></div>
+</div>
+</div>
+
+<div class="sect1" title="Release: 1.71.1"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="V1.71.1"></a>Release: 1.71.1</h2></div></div></div>
+
+<p>This is a minor update to the 1.71.0 release. Along with a
+number of bug fixes, it includes two feature changes:
+
+</p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
+ <p>Added support for profiling based on <code class="sgmltag-attribute">xml:lang</code> and <code class="sgmltag-attribute">status</code> attributes.</p>
+ </li><li class="listitem">
+ <p>Added initial support in manpages output for
+ <a href="http://docbook.org/tdg5/en/html/footnote.html"><code class="sgmltag-element">footnote</code></a>, <a href="http://docbook.org/tdg5/en/html/annotation.html"><code class="sgmltag-element">annotation</code></a>, and <a href="http://docbook.org/tdg5/en/html/alt.html"><code class="sgmltag-element">alt</code></a>
+ instances. Basically, they all now get handled the same way
+ <code class="sgmltag-element">ulink</code> instances are. They are treated as a class as
+ "note sources": A numbered marker is generated at the place in the
+ main text flow where they occur, then their contents are displayed
+ in an endnotes section at the end of the man page.</p>
+ </li></ul></div><p>
+</p>
+
+<div class="sect2" title="Common"><div class="titlepage"><div><div><h3 class="title"><a name="V1.71.1_Common"></a>Common</h3></div></div></div>
+
+<p>The following changes have been made to the
+ <code class="filename">common</code> code
+ since the 1.71.1 release.</p>
+<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
+<div class="literallayout"><p><span class="commit-message">For backward compatability autoidx-ng.xsl is invoking "kosek" indexing method again.</span></p></div>
+</li><li class="listitem">
+<div class="literallayout"><p><span class="commit-message">Add support for Xalan generating a root xml:base like saxon.</span></p></div>
+</li></ul></div>
+</div>
+
+<div class="sect2" title="FO"><div class="titlepage"><div><div><h3 class="title"><a name="V1.71.1_FO"></a>FO</h3></div></div></div>
+
+<p>The following changes have been made to the
+ <code class="filename">fo</code> code
+ since the 1.71.1 release.</p>
+<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
+<div class="literallayout"><p><span class="commit-message">For backward compatability autoidx-ng.xsl is invoking "kosek" indexing method again.</span></p></div>
+</li><li class="listitem">
+<div class="literallayout"><p><span class="commit-message">Add support for Xalan to add root node xml:base for db5 docs.</span></p></div>
+</li><li class="listitem">
+<div class="literallayout"><p><span class="commit-message">Added support for profiling based on xml:lang and status attributes.</span></p></div>
+</li></ul></div>
+</div>
+
+<div class="sect2" title="HTML"><div class="titlepage"><div><div><h3 class="title"><a name="V1.71.1_HTML"></a>HTML</h3></div></div></div>
+
+<p>The following changes have been made to the
+ <code class="filename">html</code> code
+ since the 1.71.1 release.</p>
+<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
+<div class="literallayout"><p><span class="commit-message">For backward compatability autoidx-ng.xsl is invoking "kosek" indexing method again.</span></p></div>
+</li><li class="listitem">
+<div class="literallayout"><p><span class="commit-message">Add support for Xalan to add root node xml:base for db5 docs.</span></p></div>
+</li><li class="listitem">
+<div class="literallayout"><p><span class="commit-message">Added support for profiling based on xml:lang and status attributes.</span></p></div>
+</li><li class="listitem">
+<div class="literallayout"><p><span class="commit-message">Made changes in namespace declarations to prevent xmllint's<br>
+canonicalizer from treating them as relative namespace URIs.<br>
+<br>
+  - Changed xmlns:k="java:com.isogen.saxoni18n.Saxoni18nService"<br>
+    to xmlns:k="http://www.isogen.com/functions/com.isogen.saxoni18n.Saxoni18nService";<br>
+    Saxon accepts either form<br>
+    (see http://www.saxonica.com/documentation/extensibility/functions.html);<br>
+    to Saxon, "the part of the URI before the final '/' is immaterial".<br>
+<br>
+  - Changed, e.g. xmlns:xverb="com.nwalsh.xalan.Verbatim" to<br>
+    xmlns:xverb="xalan://com.nwalsh.xalan.Verbatim"; Xalan accepts<br>
+    either form<br>
+    (see http://xml.apache.org/xalan-j/extensions.html#java-namespace-declare);<br>
+    just as Saxon does, it will "simply use the string to the<br>
+    right of the rightmost forward slash as the Java class name".<br>
+<br>
+  - Changed xmlns:xalanredirect="org.apache.xalan.xslt.extensions.Redirect"<br>
+    to xmlns:redirect="http://xml.apache.org/xalan/redirect", and<br>
+    adjusted associated code to make the current Xalan redirect spec.<br>
+    (see http://xml.apache.org/xalan-j/apidocs/org/apache/xalan/lib/Redirect.html)</span></p></div>
+</li><li class="listitem">
+<div class="literallayout"><p><span class="commit-message">Added the <a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/html.append.html"><em class="parameter"><code>html.append</code></em></a> and <a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/chunk.append.html"><em class="parameter"><code>chunk.append</code></em></a> parameters. By default, the<br>
+value of both is empty; but the internal DocBook XSL stylesheets<br>
+build sets their value to "&lt;xsl:text&gt;&amp;#x0a;&lt;/xsl:text&gt;", in order<br>
+to ensure that all files in the docbook-xsl-doc package end in a<br>
+newline character. (Because diff and some other tools may emit<br>
+error messages and/or not behave as expected when processing<br>
+files that are not newline-terminated.)</span></p></div>
+</li></ul></div>
+</div>
+
+<div class="sect2" title="Highlighting"><div class="titlepage"><div><div><h3 class="title"><a name="V1.71.1_Highlighting"></a>Highlighting</h3></div></div></div>
+
+<p>The following changes have been made to the
+ <code class="filename">highlighting</code> code
+ since the 1.71.1 release.</p>
+<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
+<div class="literallayout"><p><span class="commit-message">Added license information</span></p></div>
+</li></ul></div>
+</div>
+
+<div class="sect2" title="Manpages"><div class="titlepage"><div><div><h3 class="title"><a name="V1.71.1_Manpages"></a>Manpages</h3></div></div></div>
+
+<p>The following changes have been made to the
+ <code class="filename">manpages</code> code
+ since the 1.71.1 release.</p>
+<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
+<div class="literallayout"><p><span class="commit-message">Added initial support in manpages output for <a href="http://docbook.org/tdg5/en/html/footnote.html"><code class="sgmltag-element">footnote</code></a>, <a href="http://docbook.org/tdg5/en/html/annotation.html"><code class="sgmltag-element">annotation</code></a>,<br>
+and <a href="http://docbook.org/tdg5/en/html/alt.html"><code class="sgmltag-element">alt</code></a> instances. Basically, they all now get handled the same<br>
+way ulink instances are. They are treated as a class as "note<br>
+sources": A numbered marker is generated at the place in the main<br>
+text flow where they occur, then their contents are displayed in<br>
+an endnotes <a href="http://docbook.org/tdg5/en/html/section.html"><code class="sgmltag-element">section</code></a> at the end of the man page (currently titled<br>
+REFERENCES, for English output, but will be changed to NOTES).<br>
+<br>
+This support is not yet complete. It works for most "normal"<br>
+cases, but probably mishandles a good number of cases. More<br>
+testing will be needed to expose the problems. It may well also<br>
+introduce some bugs and regressions in other areas, including<br>
+basic paragraph handling, handling of "mixed block" content,<br>
+handling of other indented content, and handling of authorblurb<br>
+and <a href="http://docbook.org/tdg5/en/html/personblurb.html"><code class="sgmltag-element">personblurb</code></a> in the AUTHORS <a href="http://docbook.org/tdg5/en/html/section.html"><code class="sgmltag-element">section</code></a>.</span></p></div>
+</li></ul></div>
+</div>
+
+<div class="sect2" title="Params"><div class="titlepage"><div><div><h3 class="title"><a name="V1.71.1_Params"></a>Params</h3></div></div></div>
+
+<p>The following changes have been made to the
+ <code class="filename">params</code> code
+ since the 1.71.1 release.</p>
+<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
+<div class="literallayout"><p><span class="commit-message">Added support for profiling based on xml:lang and status attributes.</span></p></div>
+</li><li class="listitem">
+<div class="literallayout"><p><span class="commit-message">Added the <a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/html.append.html"><em class="parameter"><code>html.append</code></em></a> and <a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/chunk.append.html"><em class="parameter"><code>chunk.append</code></em></a> parameters. By default, the<br>
+value of both is empty; but the internal DocBook XSL stylesheets<br>
+build sets their value to "&lt;xsl:text&gt;&amp;#x0a;&lt;/xsl:text&gt;", in order<br>
+to ensure that all files in the docbook-xsl-doc <a href="http://docbook.org/tdg5/en/html/package.html"><code class="sgmltag-element">package</code></a> end in a<br>
+newline character. (Because diff and some other tools may emit<br>
+error messages and/or not behave as expected when processing<br>
+files that are not newline-terminated.)</span></p></div>
+</li></ul></div>
+</div>
+
+<div class="sect2" title="Profiling"><div class="titlepage"><div><div><h3 class="title"><a name="V1.71.1_Profiling"></a>Profiling</h3></div></div></div>
+
+<p>The following changes have been made to the
+ <code class="filename">profiling</code> code
+ since the 1.71.1 release.</p>
+<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
+<div class="literallayout"><p><span class="commit-message">Added support for profiling based on xml:lang and status attributes.</span></p></div>
+</li></ul></div>
+</div>
+
+</div>
+
+<div class="sect1" title="Release: 1.71.0"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="V1.71.0"></a>Release: 1.71.0</h2></div></div></div>
+
+<p>This is mainly a bug fix release, but it also includes two
+significant feature changes:
+</p><div class="variablelist"><dl><dt><span class="term">Highlighting support added</span></dt><dd>
+ <p>The stylesheets now include support for source-code
+ highlighting in output of programlisting instances (controlled
+ through the <a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/highlight.source.html"><em class="parameter"><code>highlight.source</code></em></a>
+ parameter). The Java-based implementation requires Saxon and
+ makes use of <a class="ulink" href="http://molhanec.net/" target="_top"><span class="person"><span class="personname"><span class="firstname">Michal</span> <span class="surname">Molhanec</span></span></span></a>&#8217;s <a class="ulink" href="http://sourceforge.net/projects/xslthl" target="_top">XSLTHL</a>. More details are available at Jirka Kosek&#8217;s
+ website: </p><div class="blockquote"><blockquote class="blockquote"><p><a class="ulink" href="http://xmlguru.cz/2006/07/docbook-syntax-highlighting" target="_top">http://xmlguru.cz/2006/07/docbook-syntax-highlighting</a></p></blockquote></div><p> The support is currently limited to highlighting
+ of XML, Java, PHP, Delphi, Modula-2 sources, and INI
+ files.</p>
+ </dd><dt><span class="term">Changes to autoindexing</span></dt><dd>
+ <p>The templates that handle alternative indexing methods
+ were reworked to avoid errors produced by certain processors not
+ being able to tolerate the presence of unused functions. With
+ this release, none of the code for the 'kimber' or 'kosek'
+ methods is included in the default stylesheets. In order to use
+ one of those methods, your customization layer must import one
+ of the optional stylesheet modules:</p>
+ <p>
+ </p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
+ html/autoidx-kosek.xsl
+ </li><li class="listitem">
+ html/autoidx-kimber.xsl
+ </li><li class="listitem">
+ fo/autoidx-kosek.xsl
+ </li><li class="listitem">
+ fo/autoidx-kimber.xsl
+ </li></ul></div><p>
+ See the <a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/index.method.html"><em class="parameter"><code>index.method</code></em></a> parameter
+ reference page for more information.
+ </p>
+ <p>Two other changes to note:
+ </p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
+ The default indexing method now can handle accented
+ characters in latin-based alphabets, not just English. This
+ means accented latin letters will group and sort with their
+ unaccented counterpart.
+ </li><li class="listitem">
+ The default value for the
+ <a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/index.method.html"><em class="parameter"><code>index.method</code></em></a> parameter was changed
+ from 'english' to 'basic' because now the default method can
+ handle latin-based alphabets, not just English.
+ </li></ul></div><p>
+ </p>
+ </dd></dl></div><p>
+The following is a list of changes that have
+been made since the 1.70.1 release.</p>
+
+<div class="sect2" title="Common"><div class="titlepage"><div><div><h3 class="title"><a name="V1.71.0_Common"></a>Common</h3></div></div></div>
+
+<p>The following changes have been made to the
+ <code class="filename">common</code> code
+ since the 1.70.1 release.</p>
+<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
+<div class="literallayout"><p><span class="commit-message">Added <a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/reference.autolabel.html"><em class="parameter"><code>reference.autolabel</code></em></a> parameter for controlling labels on<br>
+<a href="http://docbook.org/tdg5/en/html/reference.html"><code class="sgmltag-element">reference</code></a> output.</span></p></div>
+</li><li class="listitem">
+<div class="literallayout"><p><span class="commit-message">Support <a href="http://docbook.org/tdg5/en/html/row.html"><code class="sgmltag-element">row</code></a>s that are *completely* overlapped by the preceding <a href="http://docbook.org/tdg5/en/html/row.html"><code class="sgmltag-element">row</code></a></span></p></div>
+</li><li class="listitem">
+<div class="literallayout"><p><span class="commit-message">New modules for supporting indexing extensions.</span></p></div>
+</li><li class="listitem">
+<div class="literallayout"><p><span class="commit-message">Support startinglinenumber on <a href="http://docbook.org/tdg5/en/html/orderedlist.html"><code class="sgmltag-element">orderedlist</code></a></span></p></div>
+</li></ul></div>
+</div>
+
+<div class="sect2" title="Extensions"><div class="titlepage"><div><div><h3 class="title"><a name="V1.71.0_Extensions"></a>Extensions</h3></div></div></div>
+
+<p>The following changes have been made to the
+ <code class="filename">extensions</code> code
+ since the 1.70.1 release.</p>
+<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
+<div class="literallayout"><p><span class="commit-message">Completely reworked extensions build system; now uses NetBeans and ant</span></p></div>
+</li></ul></div>
+</div>
+
+<div class="sect2" title="FO"><div class="titlepage"><div><div><h3 class="title"><a name="V1.71.0_FO"></a>FO</h3></div></div></div>
+
+<p>The following changes have been made to the
+ <code class="filename">fo</code> code
+ since the 1.70.1 release.</p>
+<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
+<div class="literallayout"><p><span class="commit-message">xsl:sort lang attribute now uses two-char substring of lang attribute.</span></p></div>
+</li><li class="listitem">
+<div class="literallayout"><p><span class="commit-message">Support titlecase "Java", "Perl", and "IDL" as values for the<br>
+language attribute on <a href="http://docbook.org/tdg5/en/html/classsynopsis.html"><code class="sgmltag-element">classsynopsis</code></a>, etc. (instead of just<br>
+lowercase "java", "perl", and "idl"). Also support "c++" and "C++"<br>
+(instead of just "cpp").<br>
+<br>
+Affects HTML, FO, and manpages output. Closes bug 1552332. Thanks<br>
+to "Brian A. Vanderburg II".</span></p></div>
+</li><li class="listitem">
+<div class="literallayout"><p><span class="commit-message">Added support for the <a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/reference.autolabel.html"><em class="parameter"><code>reference.autolabel</code></em></a> param in (X)HTML and FO<br>
+output.</span></p></div>
+</li><li class="listitem">
+<div class="literallayout"><p><span class="commit-message">Support <a href="http://docbook.org/tdg5/en/html/row.html"><code class="sgmltag-element">row</code></a>s that are *completely* overlapped by the preceding <a href="http://docbook.org/tdg5/en/html/row.html"><code class="sgmltag-element">row</code></a></span></p></div>
+</li><li class="listitem">
+<div class="literallayout"><p><span class="commit-message">Rearranged templates for the 3 indexing methods<br>
+and changed method named 'english' to 'basic'.</span></p></div>
+</li><li class="listitem">
+<div class="literallayout"><p><span class="commit-message">New modules for supporting indexing extensions.</span></p></div>
+</li><li class="listitem">
+<div class="literallayout"><p><span class="commit-message">Turn off blank-body for <a href="http://docbook.sourceforge.net/release/xsl/current/doc/fo/fop1.extensions.html"><em class="parameter"><code>fop1.extensions</code></em></a> too since fop 0.92<br>
+does not support it either.</span></p></div>
+</li><li class="listitem">
+<div class="literallayout"><p><span class="commit-message">Add Xalan variant to test for exslt:node-set <a href="http://docbook.org/tdg5/en/html/function.html"><code class="sgmltag-element">function</code></a>.<br>
+Xalan can use <a href="http://docbook.org/tdg5/en/html/function.html"><code class="sgmltag-element">function</code></a> named node-set(), but doesn't<br>
+recognize it using function-available().</span></p></div>
+</li><li class="listitem">
+<div class="literallayout"><p><span class="commit-message">Added support to FO stylesheets for handling instances of <a href="http://docbook.org/tdg5/en/html/org.html"><code class="sgmltag-element">Org</code></a><br>
+where it occurs outside of *<a href="http://docbook.org/tdg5/en/html/info.html"><code class="sgmltag-element">info</code></a> content. In HTML stylesheets,<br>
+moved handling of <a href="http://docbook.org/tdg5/en/html/org.html"><code class="sgmltag-element">Org</code></a> out of info.xsl and into inline.xsl. In both<br>
+FO and HTML stylesheets, added support for correctly processing<br>
+<a href="http://docbook.org/tdg5/en/html/affiliation.html"><code class="sgmltag-element">Affiliation</code></a> and <a href="http://docbook.org/tdg5/en/html/jobtitle.html"><code class="sgmltag-element">Jobtitle</code></a>.</span></p></div>
+</li><li class="listitem">
+<div class="literallayout"><p><span class="commit-message">Don't output punctuation between <a href="http://docbook.org/tdg5/en/html/refname.html"><code class="sgmltag-element">Refname</code></a> and <a href="http://docbook.org/tdg5/en/html/refpurpose.html"><code class="sgmltag-element">Refpurpose</code></a> if<br>
+<a href="http://docbook.org/tdg5/en/html/refpurpose.html"><code class="sgmltag-element">Refpurpose</code></a> is empty. Also corrected handling of <a href="http://docbook.org/tdg5/en/html/refsect2.html"><code class="sgmltag-element">Refsect2</code></a>/<a href="http://docbook.org/tdg5/en/html/title.html"><code class="sgmltag-element">title</code></a><br>
+instances, and removed some debugging stuff that was generated in<br>
+manpages output to mark the ends of sections.</span></p></div>
+</li><li class="listitem">
+<div class="literallayout"><p><span class="commit-message">Added new <a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/email.delimiters.enabled.html"><em class="parameter"><code>email.delimiters.enabled</code></em></a> param. If non-zero (the<br>
+default), delimiters are generated around e-mail addresses (output<br>
+of the <a href="http://docbook.org/tdg5/en/html/email.html"><code class="sgmltag-element">email</code></a> element). If zero, the delimiters are suppressed.</span></p></div>
+</li><li class="listitem">
+<div class="literallayout"><p><span class="commit-message">Initial support of syntax highlighting of programlistings.</span></p></div>
+</li><li class="listitem">
+<div class="literallayout"><p><span class="commit-message"><a href="http://docbook.org/tdg5/en/html/chapter.html"><code class="sgmltag-element">Chapter</code></a> after <a href="http://docbook.org/tdg5/en/html/preface.html"><code class="sgmltag-element">preface</code></a> should restart numbering of pages.</span></p></div>
+</li></ul></div>
+</div>
+
+<div class="sect2" title="HTML"><div class="titlepage"><div><div><h3 class="title"><a name="V1.71.0_HTML"></a>HTML</h3></div></div></div>
+
+<p>The following changes have been made to the
+ <code class="filename">html</code> code
+ since the 1.70.1 release.</p>
+<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
+<div class="literallayout"><p><span class="commit-message">xsl:sort lang attribute now uses two-char substring of lang attribute.</span></p></div>
+</li><li class="listitem">
+<div class="literallayout"><p><span class="commit-message">Support titlecase "Java", "Perl", and "IDL" as values for the<br>
+language attribute on <a href="http://docbook.org/tdg5/en/html/classsynopsis.html"><code class="sgmltag-element">classsynopsis</code></a>, etc. (instead of just<br>
+lowercase "java", "perl", and "idl"). Also support "c++" and "C++"<br>
+(instead of just "cpp").<br>
+<br>
+Affects HTML, FO, and manpages output. Closes bug 1552332. Thanks<br>
+to "Brian A. Vanderburg II".</span></p></div>
+</li><li class="listitem">
+<div class="literallayout"><p><span class="commit-message">Added support for the <a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/reference.autolabel.html"><em class="parameter"><code>reference.autolabel</code></em></a> param in (X)HTML and FO<br>
+output.</span></p></div>
+</li><li class="listitem">
+<div class="literallayout"><p><span class="commit-message">Support <a href="http://docbook.org/tdg5/en/html/row.html"><code class="sgmltag-element">row</code></a>s that are *completely* overlapped by the preceding <a href="http://docbook.org/tdg5/en/html/row.html"><code class="sgmltag-element">row</code></a></span></p></div>
+</li><li class="listitem">
+<div class="literallayout"><p><span class="commit-message">Rearranged templates for the 3 indexing methods<br>
+and changed method named 'english' to 'basic'.</span></p></div>
+</li><li class="listitem">
+<div class="literallayout"><p><span class="commit-message">New modules for supporting indexing extensions.</span></p></div>
+</li><li class="listitem">
+<div class="literallayout"><p><span class="commit-message">Added several new HTML parameters for controlling appearance of<br>
+content on HTML <a href="http://docbook.org/tdg5/en/html/title.html"><code class="sgmltag-element">title</code></a> pages:<br>
+<br>
+<a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/contrib.inline.enabled.html"><em class="parameter"><code>contrib.inline.enabled</code></em></a>:<br>
+  If non-zero (the default), output of the <a href="http://docbook.org/tdg5/en/html/contrib.html"><code class="sgmltag-element">contrib</code></a> element is<br>
+  displayed as inline content rather than as block content.<br>
+<br>
+<a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/othercredit.like.author.enabled.html"><em class="parameter"><code>othercredit.like.author.enabled</code></em></a>:<br>
+  If non-zero, output of the <a href="http://docbook.org/tdg5/en/html/othercredit.html"><code class="sgmltag-element">othercredit</code></a> element on titlepages is<br>
+  displayed in the same style as <a href="http://docbook.org/tdg5/en/html/author.html"><code class="sgmltag-element">author</code></a> and <a href="http://docbook.org/tdg5/en/html/editor.html"><code class="sgmltag-element">editor</code></a> output. If zero<br>
+  (the default), <a href="http://docbook.org/tdg5/en/html/othercredit.html"><code class="sgmltag-element">othercredit</code></a> output is displayed using a style<br>
+  different than that of <a href="http://docbook.org/tdg5/en/html/author.html"><code class="sgmltag-element">author</code></a> and <a href="http://docbook.org/tdg5/en/html/editor.html"><code class="sgmltag-element">editor</code></a>.<br>
+<br>
+<a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/blurb.on.titlepage.enabled.html"><em class="parameter"><code>blurb.on.titlepage.enabled</code></em></a>:<br>
+  If non-zero, output from authorblurb and <a href="http://docbook.org/tdg5/en/html/personblurb.html"><code class="sgmltag-element">personblurb</code></a> elements is<br>
+  displayed on <a href="http://docbook.org/tdg5/en/html/title.html"><code class="sgmltag-element">title</code></a> pages. If zero (the default), output from<br>
+  those elements is suppressed on <a href="http://docbook.org/tdg5/en/html/title.html"><code class="sgmltag-element">title</code></a> pages (unless you are<br>
+  using a titlepage customization that causes them to be included).<br>
+<br>
+<a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/editedby.enabled.html"><em class="parameter"><code>editedby.enabled</code></em></a><br>
+  If non-zero (the default), a localized Edited by heading is<br>
+  displayed above <a href="http://docbook.org/tdg5/en/html/editor.html"><code class="sgmltag-element">editor</code></a> names in output of the <a href="http://docbook.org/tdg5/en/html/editor.html"><code class="sgmltag-element">editor</code></a> element.</span></p></div>
+</li><li class="listitem">
+<div class="literallayout"><p><span class="commit-message">Add Xalan variant to test for exslt:node-set <a href="http://docbook.org/tdg5/en/html/function.html"><code class="sgmltag-element">function</code></a>.<br>
+Xalan can use <a href="http://docbook.org/tdg5/en/html/function.html"><code class="sgmltag-element">function</code></a> named node-set(), but doesn't<br>
+recognize it using function-available().</span></p></div>
+</li><li class="listitem">
+<div class="literallayout"><p><span class="commit-message">Added support to FO stylesheets for handling instances of <a href="http://docbook.org/tdg5/en/html/org.html"><code class="sgmltag-element">Org</code></a><br>
+where it occurs outside of *<a href="http://docbook.org/tdg5/en/html/info.html"><code class="sgmltag-element">info</code></a> content. In HTML stylesheets,<br>
+moved handling of <a href="http://docbook.org/tdg5/en/html/org.html"><code class="sgmltag-element">Org</code></a> out of info.xsl and into inline.xsl. In both<br>
+FO and HTML stylesheets, added support for correctly processing<br>
+<a href="http://docbook.org/tdg5/en/html/affiliation.html"><code class="sgmltag-element">Affiliation</code></a> and <a href="http://docbook.org/tdg5/en/html/jobtitle.html"><code class="sgmltag-element">Jobtitle</code></a>.</span></p></div>
+</li><li class="listitem">
+<div class="literallayout"><p><span class="commit-message">Don't output punctuation between <a href="http://docbook.org/tdg5/en/html/refname.html"><code class="sgmltag-element">Refname</code></a> and <a href="http://docbook.org/tdg5/en/html/refpurpose.html"><code class="sgmltag-element">Refpurpose</code></a> if<br>
+<a href="http://docbook.org/tdg5/en/html/refpurpose.html"><code class="sgmltag-element">Refpurpose</code></a> is empty. Also corrected handling of <a href="http://docbook.org/tdg5/en/html/refsect2.html"><code class="sgmltag-element">Refsect2</code></a>/<a href="http://docbook.org/tdg5/en/html/title.html"><code class="sgmltag-element">title</code></a><br>
+instances, and removed some debugging stuff that was generated in<br>
+manpages output to mark the ends of sections.</span></p></div>
+</li><li class="listitem">
+<div class="literallayout"><p><span class="commit-message">Added new <a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/email.delimiters.enabled.html"><em class="parameter"><code>email.delimiters.enabled</code></em></a> param. If non-zero (the<br>
+default), delimiters are generated around e-mail addresses (output<br>
+of the <a href="http://docbook.org/tdg5/en/html/email.html"><code class="sgmltag-element">email</code></a> element). If zero, the delimiters are suppressed.</span></p></div>
+</li><li class="listitem">
+<div class="literallayout"><p><span class="commit-message">Added <a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/qanda.nested.in.toc.html"><em class="parameter"><code>qanda.nested.in.toc</code></em></a> param. Default value is zero. If<br>
+non-zero, instances of "nested" <a href="http://docbook.org/tdg5/en/html/qandaentry.html"><code class="sgmltag-element">Qandaentry</code></a> (ones that are children<br>
+of <a href="http://docbook.org/tdg5/en/html/answer.html"><code class="sgmltag-element">Answer</code></a> elements) are displayed in the <a href="http://docbook.org/tdg5/en/html/toc.html"><code class="sgmltag-element">TOC</code></a>. Closes patch 1509018<br>
+(from Daniel Leidert). Currently on affects HTML output (no patch<br>
+for FO output provided).</span></p></div>
+</li><li class="listitem">
+<div class="literallayout"><p><span class="commit-message">Improved handling of relative locations generated files</span></p></div>
+</li><li class="listitem">
+<div class="literallayout"><p><span class="commit-message">Initial support of syntax highlighting of programlistings.</span></p></div>
+</li><li class="listitem">
+<div class="literallayout"><p><span class="commit-message">Support <a href="http://docbook.org/tdg5/en/html/org.html"><code class="sgmltag-element">org</code></a></span></p></div>
+</li><li class="listitem">
+<div class="literallayout"><p><span class="commit-message">Support <a href="http://docbook.org/tdg5/en/html/person.html"><code class="sgmltag-element">person</code></a></span></p></div>
+</li><li class="listitem">
+<div class="literallayout"><p><span class="commit-message">Support $keep.relative.image.uris also when chunking</span></p></div>
+</li></ul></div>
+</div>
+
+<div class="sect2" title="Highlighting"><div class="titlepage"><div><div><h3 class="title"><a name="V1.71.0_Highlighting"></a>Highlighting</h3></div></div></div>
+
+<p>The following changes have been made to the
+ <code class="filename">highlighting</code> code
+ since the 1.70.1 release.</p>
+<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
+<div class="literallayout"><p><span class="commit-message">Initial support of syntax highlighting of programlistings.</span></p></div>
+</li></ul></div>
+</div>
+
+<div class="sect2" title="Manpages"><div class="titlepage"><div><div><h3 class="title"><a name="V1.71.0_Manpages"></a>Manpages</h3></div></div></div>
+
+<p>The following changes have been made to the
+ <code class="filename">manpages</code> code
+ since the 1.70.1 release.</p>
+<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
+<div class="literallayout"><p><span class="commit-message">Suppress <a href="http://docbook.org/tdg5/en/html/footnote.html"><code class="sgmltag-element">footnote</code></a> markers and output warning that footnotes are<br>
+not yet supported.</span></p></div>
+</li><li class="listitem">
+<div class="literallayout"><p><span class="commit-message">Handle instances of <a href="http://docbook.org/tdg5/en/html/address.html"><code class="sgmltag-element">address</code></a>/<a href="http://docbook.org/tdg5/en/html/otheraddr.html"><code class="sgmltag-element">otheraddr</code></a>/ulink in <a href="http://docbook.org/tdg5/en/html/author.html"><code class="sgmltag-element">author</code></a> et al in the<br>
+same way as <a href="http://docbook.org/tdg5/en/html/email.html"><code class="sgmltag-element">email</code></a> instances; that is, display them on the same<br>
+linke as the <a href="http://docbook.org/tdg5/en/html/author.html"><code class="sgmltag-element">author</code></a>, <a href="http://docbook.org/tdg5/en/html/editor.html"><code class="sgmltag-element">editor</code></a>, etc., name.</span></p></div>
+</li><li class="listitem">
+<div class="literallayout"><p><span class="commit-message">Don't number or link-list any Ulink instance whose string value is<br>
+identical to the value of its url attribute. Just display it inline.</span></p></div>
+</li><li class="listitem">
+<div class="literallayout"><p><span class="commit-message">Don't output punctuation between <a href="http://docbook.org/tdg5/en/html/refname.html"><code class="sgmltag-element">Refname</code></a> and <a href="http://docbook.org/tdg5/en/html/refpurpose.html"><code class="sgmltag-element">Refpurpose</code></a> if<br>
+<a href="http://docbook.org/tdg5/en/html/refpurpose.html"><code class="sgmltag-element">Refpurpose</code></a> is empty. Also corrected handling of <a href="http://docbook.org/tdg5/en/html/refsect2.html"><code class="sgmltag-element">Refsect2</code></a>/<a href="http://docbook.org/tdg5/en/html/title.html"><code class="sgmltag-element">title</code></a><br>
+instances, and removed some debugging stuff that was generated in<br>
+manpages output to mark the ends of sections.</span></p></div>
+</li><li class="listitem">
+<div class="literallayout"><p><span class="commit-message">Added new <a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/email.delimiters.enabled.html"><em class="parameter"><code>email.delimiters.enabled</code></em></a> param. If non-zero (the<br>
+default), delimiters are generated around e-mail addresses (output<br>
+of the <a href="http://docbook.org/tdg5/en/html/email.html"><code class="sgmltag-element">email</code></a> element). If zero, the delimiters are suppressed.</span></p></div>
+</li><li class="listitem">
+<div class="literallayout"><p><span class="commit-message">In manpages output, if the last/nearest *<a href="http://docbook.org/tdg5/en/html/info.html"><code class="sgmltag-element">info</code></a> element for<br>
+particular <a href="http://docbook.org/tdg5/en/html/refentry.html"><code class="sgmltag-element">Refentry</code></a> has multiple <a href="http://docbook.org/tdg5/en/html/copyright.html"><code class="sgmltag-element">Copyright</code></a> and/or <a href="http://docbook.org/tdg5/en/html/legalnotice.html"><code class="sgmltag-element">Legalnotice</code></a><br>
+children, process them all (not just the first ones). Closes bug<br>
+1524576. Thanks to Sam Steingold for the report and to Daniel<br>
+Leidert for providing a patch.</span></p></div>
+</li></ul></div>
+</div>
+
+<div class="sect2" title="Params"><div class="titlepage"><div><div><h3 class="title"><a name="V1.71.0_Params"></a>Params</h3></div></div></div>
+
+<p>The following changes have been made to the
+ <code class="filename">params</code> code
+ since the 1.70.1 release.</p>
+<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
+<div class="literallayout"><p><span class="commit-message">Added <a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/reference.autolabel.html"><em class="parameter"><code>reference.autolabel</code></em></a> parameter for controlling labels on<br>
+<a href="http://docbook.org/tdg5/en/html/reference.html"><code class="sgmltag-element">reference</code></a> output.</span></p></div>
+</li><li class="listitem">
+<div class="literallayout"><p><span class="commit-message">Added namespace declarations to document elements for all param files.</span></p></div>
+</li><li class="listitem">
+<div class="literallayout"><p><span class="commit-message">Updated index.method doc to describe revised setup for importing <a href="http://docbook.org/tdg5/en/html/index.html"><code class="sgmltag-element">index</code></a> extensions.</span></p></div>
+</li><li class="listitem">
+<div class="literallayout"><p><span class="commit-message">Added several new HTML parameters for controlling appearance of<br>
+content on HTML <a href="http://docbook.org/tdg5/en/html/title.html"><code class="sgmltag-element">title</code></a> pages:<br>
+<br>
+<a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/contrib.inline.enabled.html"><em class="parameter"><code>contrib.inline.enabled</code></em></a>:<br>
+  If non-zero (the default), output of the <a href="http://docbook.org/tdg5/en/html/contrib.html"><code class="sgmltag-element">contrib</code></a> element is<br>
+  displayed as inline content rather than as block content.<br>
+<br>
+<a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/othercredit.like.author.enabled.html"><em class="parameter"><code>othercredit.like.author.enabled</code></em></a>:<br>
+  If non-zero, output of the <a href="http://docbook.org/tdg5/en/html/othercredit.html"><code class="sgmltag-element">othercredit</code></a> element on titlepages is<br>
+  displayed in the same style as <a href="http://docbook.org/tdg5/en/html/author.html"><code class="sgmltag-element">author</code></a> and <a href="http://docbook.org/tdg5/en/html/editor.html"><code class="sgmltag-element">editor</code></a> output. If zero<br>
+  (the default), <a href="http://docbook.org/tdg5/en/html/othercredit.html"><code class="sgmltag-element">othercredit</code></a> output is displayed using a style<br>
+  different than that of <a href="http://docbook.org/tdg5/en/html/author.html"><code class="sgmltag-element">author</code></a> and <a href="http://docbook.org/tdg5/en/html/editor.html"><code class="sgmltag-element">editor</code></a>.<br>
+<br>
+<a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/blurb.on.titlepage.enabled.html"><em class="parameter"><code>blurb.on.titlepage.enabled</code></em></a>:<br>
+  If non-zero, output from authorblurb and <a href="http://docbook.org/tdg5/en/html/personblurb.html"><code class="sgmltag-element">personblurb</code></a> elements is<br>
+  displayed on <a href="http://docbook.org/tdg5/en/html/title.html"><code class="sgmltag-element">title</code></a> pages. If zero (the default), output from<br>
+  those elements is suppressed on <a href="http://docbook.org/tdg5/en/html/title.html"><code class="sgmltag-element">title</code></a> pages (unless you are<br>
+  using a titlepage customization that causes them to be included).<br>
+<br>
+<a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/editedby.enabled.html"><em class="parameter"><code>editedby.enabled</code></em></a><br>
+  If non-zero (the default), a localized Edited by heading is<br>
+  displayed above <a href="http://docbook.org/tdg5/en/html/editor.html"><code class="sgmltag-element">editor</code></a> names in output of the <a href="http://docbook.org/tdg5/en/html/editor.html"><code class="sgmltag-element">editor</code></a> element.</span></p></div>
+</li><li class="listitem">
+<div class="literallayout"><p><span class="commit-message">Added new <a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/email.delimiters.enabled.html"><em class="parameter"><code>email.delimiters.enabled</code></em></a> param. If non-zero (the<br>
+default), delimiters are generated around e-mail addresses (output<br>
+of the <a href="http://docbook.org/tdg5/en/html/email.html"><code class="sgmltag-element">email</code></a> element). If zero, the delimiters are suppressed.</span></p></div>
+</li><li class="listitem">
+<div class="literallayout"><p><span class="commit-message">Added <a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/qanda.nested.in.toc.html"><em class="parameter"><code>qanda.nested.in.toc</code></em></a> param. Default value is zero. If<br>
+non-zero, instances of "nested" <a href="http://docbook.org/tdg5/en/html/qandaentry.html"><code class="sgmltag-element">Qandaentry</code></a> (ones that are children<br>
+of <a href="http://docbook.org/tdg5/en/html/answer.html"><code class="sgmltag-element">Answer</code></a> elements) are displayed in the <a href="http://docbook.org/tdg5/en/html/toc.html"><code class="sgmltag-element">TOC</code></a>. Closes patch 1509018<br>
+(from Daniel Leidert). Currently on affects HTML output (no patch<br>
+for FO output provided).</span></p></div>
+</li><li class="listitem">
+<div class="literallayout"><p><span class="commit-message">Initial support of syntax highlighting of programlistings.</span></p></div>
+</li></ul></div>
+</div>
+
+<div class="sect2" title="Tools"><div class="titlepage"><div><div><h3 class="title"><a name="V1.71.0_Tools"></a>Tools</h3></div></div></div>
+
+<p>The following changes have been made to the
+ <code class="filename">tools</code> code
+ since the 1.70.1 release.</p>
+<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
+<div class="literallayout"><p><span class="commit-message">Racheted down font sizes of headings in example makefile FO output.</span></p></div>
+</li><li class="listitem">
+<div class="literallayout"><p><span class="commit-message">Added param and attribute set to example makefile, for getting<br>
+wrapping in verbatims in FO output.</span></p></div>
+</li><li class="listitem">
+<div class="literallayout"><p><span class="commit-message">Renamed Makefile.paramDoc to Makefile.docParam.</span></p></div>
+</li><li class="listitem">
+<div class="literallayout"><p><span class="commit-message">Added Makefile.paramDoc file, for creating versions of param.xsl<br>
+files with doc embedded.</span></p></div>
+</li><li class="listitem">
+<div class="literallayout"><p><span class="commit-message">Added variable to example makefile for controlling whether HTML or<br>
+XHTML is generated.</span></p></div>
+</li></ul></div>
+</div>
+</div>
+
+<div class="sect1" title="Release: 1.70.1"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="V1701"></a>Release: 1.70.1</h2></div></div></div>
+
+
+<p>This is a stable release of the 1.70 stylesheets. It includes only a
+few small changes from 1.70.0.</p>
+
+<p>The following is a list of changes that have been made
+ since the 1.70.0 release.</p>
+
+<div class="sect2" title="FO"><div class="titlepage"><div><div><h3 class="title"><a name="V1701_FO"></a>FO</h3></div></div></div>
+
+<p>The following changes have been made to the
+ <code class="filename">fo</code> code
+ since the 1.70.0 release.</p>
+<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
+<p>Added three new attribute sets (revhistory.title.properties, revhistory.table.properties and revhistory.table.cell.properties) for controlling appearance of revhistory in FO output.</p>
+<p class="commit-changes">Modified: fo/block.xsl,1.34; fo/param.ent,1.101; fo/param.xweb,1.114; fo/titlepage.xsl,1.41; params/revhistory.table.cell.properties.xml,1.1; params/revhistory.table.properties.xml,1.1; params/revhistory.title.properties.xml,1.1 - Jirka Kosek</p>
+</li><li class="listitem">
+<p>Support DBv5 revisions with full author name (not only authorinitials)</p>
+<p class="commit-changes">Modified: fo/block.xsl,1.33; fo/titlepage.xsl,1.40 - Jirka Kosek</p>
+</li></ul></div>
+</div>
+
+<div class="sect2" title="HTML"><div class="titlepage"><div><div><h3 class="title"><a name="V1701_HTML"></a>HTML</h3></div></div></div>
+
+<p>The following changes have been made to the
+ <code class="filename">html</code> code
+ since the 1.70.0 release.</p>
+<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
+<p>Support DBv5 revisions with full author name (not only authorinitials)</p>
+<p class="commit-changes">Modified: html/block.xsl,1.23; html/titlepage.xsl,1.34 - Jirka Kosek</p>
+</li></ul></div>
+</div>
+
+<div class="sect2" title="HTMLHelp"><div class="titlepage"><div><div><h3 class="title"><a name="V1701_HTMLHelp"></a>HTMLHelp</h3></div></div></div>
+
+<p>The following changes have been made to the
+ <code class="filename">htmlhelp</code> code
+ since the 1.70.0 release.</p>
+<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
+<p>htmlhelp.generate.index is now param, not variable. This means that you can override its setting from outside. This is useful when you generate indexterms on the fly (see http://www.xml.com/pub/a/2004/07/14/dbndx.html?page=3).</p>
+<p class="commit-changes">Modified: htmlhelp/htmlhelp-common.xsl,1.38 - Jirka Kosek</p>
+</li><li class="listitem">
+<p>Support chunk.tocs.and.lots in HTML Help</p>
+<p class="commit-changes">Modified: htmlhelp/htmlhelp-common.xsl,1.37 - Jirka Kosek</p>
+</li></ul></div>
+</div>
+
+<div class="sect2" title="Params"><div class="titlepage"><div><div><h3 class="title"><a name="V1701_Params"></a>Params</h3></div></div></div>
+
+<p>The following changes have been made to the
+ <code class="filename">params</code> code
+ since the 1.70.0 release.</p>
+<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
+<p>Added three new attribute sets (revhistory.title.properties, revhistory.table.properties and revhistory.table.cell.properties) for controlling appearance of revhistory in FO output.</p>
+<p class="commit-changes">Modified: fo/block.xsl,1.34; fo/param.ent,1.101; fo/param.xweb,1.114; fo/titlepage.xsl,1.41; params/revhistory.table.cell.properties.xml,1.1; params/revhistory.table.properties.xml,1.1; params/revhistory.title.properties.xml,1.1 - Jirka Kosek</p>
+</li></ul></div>
+</div>
+
+</div>
+
+<div class="sect1" title="Release: 1.70.0"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="V1700"></a>Release: 1.70.0</h2></div></div></div>
+
+<p>As with all DocBook Project <a class="link" href="#dot0" title="About dot-zero releases">dot-zero</a>
+releases, this is an experimental release. It will be followed shortly
+by a stable release.</p>
+
+<p>This release adds a number of new features,
+including:</p>
+
+<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
+ <p>support for selecting alternative index-collation methods
+ (in particular, support for using a collation library developed by
+ Eliot Kimber)</p>
+ </li><li class="listitem">
+ <p>improved handling of DocBook 5 document instances (through a
+ namespace-stripping mechanism)</p>
+ </li><li class="listitem">
+ <p>full support for CALS and HTML tables in manpages
+ output</p>
+ </li><li class="listitem">
+ <p>a mechanism for preserving relative URIs in documents that
+ make use of XInclude</p>
+ </li><li class="listitem">
+ <p>support for the "new" <code class="literal">.90</code> version of
+ FOP</p>
+ </li><li class="listitem">
+ <p>enhanced capabilities for controlling formatting of lists in HTML
+ and FO output</p>
+ </li><li class="listitem">
+ <p>autogeneration of AUTHOR and COPYRIGHT sections in manpages
+ output</p>
+ </li><li class="listitem">
+ <p>support for generating crop marks in FO/PDF output</p>
+ </li><li class="listitem">
+ <p>support for qandaset as a root element in FO output</p>
+ </li><li class="listitem">
+ <p>support for floatstyle and orient on all table types</p>
+ </li><li class="listitem">
+ <p>support for floatstyle in figure, and example</p>
+ </li><li class="listitem">
+ <p>pgwide.properties attribute-set supports extending figure,
+ example and table into the left indent area instead of spanning
+ multiple columns.</p>
+ </li></ul></div>
+ <p>The following is a detailed list of enhancements and API
+ changes that have been made since the 1.69.1 release.</p>
+
+<div class="sect2" title="Common"><div class="titlepage"><div><div><h3 class="title"><a name="V1700_Common"></a>Common</h3></div></div></div>
+
+<p>The following changes have been made to the
+ <code class="filename">common</code> code
+ since the 1.69.1 release.</p>
+<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
+<p>Add the xsl:key for the kimber
+indexing method.</p>
+<p class="commit-changes">Modified: common/autoidx-ng.xsl,1.2 - Robert
+Stayton</p>
+</li><li class="listitem">
+<p>Add support for
+<a href="http://docbook.org/tdg5/en/html/qandaset.html"><code class="sgmltag-element">qandaset</code></a>.</p>
+<p class="commit-changes">Modified: common/labels.xsl,1.37;
+common/subtitles.xsl,1.7; common/titles.xsl,1.35 - Robert
+Stayton</p>
+</li><li class="listitem">
+<p>Support dbhtml/dbfo start PI for
+<a href="http://docbook.org/tdg5/en/html/orderedlist.html"><code class="sgmltag-element">orderedlist</code></a> numbering in both HTML and
+FO</p>
+<p class="commit-changes">Modified: common/common.xsl,1.61; html/lists.xsl,1.50 - Norman
+Walsh</p>
+</li><li class="listitem">
+<p>Added CVS
+header.</p>
+<p class="commit-changes">Modified: common/stripns.xsl,1.12 - Robert
+Stayton</p>
+</li><li class="listitem">
+<p>Changed content model of text
+element to ANY rather than #PCDATA because they could contain
+markup.</p>
+<p class="commit-changes">Modified: common/targetdatabase.dtd,1.7 - Robert
+Stayton</p>
+</li><li class="listitem">
+<p>Added
+<a href="http://docbook.org/tdg5/en/html/refentry.html"><code class="sgmltag-element">refentry</code></a>.meta.get.quietly param.</p>
+<p>If zero (the
+default), notes and warnings about "missing" markup are generated
+during gathering of <a href="http://docbook.org/tdg5/en/html/refentry.html"><code class="sgmltag-element">refentry</code></a> metadata. If
+non-zero, the metadata is gathered "quietly" -- that is, the
+notes and warnings are suppressed.</p>
+<p>NOTE: If you are
+processing a large amount of <a href="http://docbook.org/tdg5/en/html/refentry.html"><code class="sgmltag-element">refentry</code></a> content, you
+may be able to speed up processing significantly by setting a
+non-zero value for
+<a href="http://docbook.org/tdg5/en/html/refentry.html"><code class="sgmltag-element">refentry</code></a>.meta.get.quietly.</p>
+<p class="commit-changes">Modified: common/refentry.xsl,1.17;
+manpages/param.ent,1.15; manpages/param.xweb,1.17;
+params/refentry.meta.get.quietly.xml,1.1 - Michael(tm)
+Smith</p>
+</li><li class="listitem">
+<p>After namespace stripping, the
+source document is the temporary tree created by the stripping
+process and it has the wrong base <a href="http://docbook.org/tdg5/en/html/uri.html"><code class="sgmltag-element">URI</code></a> for relative
+references. Earlier versions of this code used to try to fix that
+by patching the elements with relative @fileref attributes. That
+was inadequate because it calculated an absolute base <a href="http://docbook.org/tdg5/en/html/uri.html"><code class="sgmltag-element">URI</code></a>
+without considering that there might be xml:base attributes
+already in effect. It seems obvious now that the right thing to
+do is simply to put the xml:base on the root of the document. And
+that seems to work.</p>
+<p class="commit-changes">Modified: common/stripns.xsl,1.7 - Norman
+Walsh</p>
+</li><li class="listitem">
+<p>Added support for "software" and
+"sectdesc" class values on <a href="http://docbook.org/tdg5/en/html/refmiscinfo.html"><code class="sgmltag-element">refmiscinfo</code></a>; "software" is
+treated identically to "source", and "setdesc" is treated
+identically to "manual".</p>
+<p class="commit-changes">Modified: common/refentry.xsl,1.10;
+params/man.th.extra2.max.length.xml,1.3;
+params/refentry.source.name.profile.xml,1.4 - Michael(tm)
+Smith</p>
+</li><li class="listitem">
+<p>Added support for DocBook 5
+namespace-stripping in manpages stylesheet. Closes request
+#1210692.</p>
+<p class="commit-changes">Modified: common/common.xsl,1.56; manpages/docbook.xsl,1.57 -
+Michael(tm) Smith</p>
+</li><li class="listitem">
+<p>Added &lt;xsl:template
+match="/"&gt; to make stripns.xsl usable as a standalone
+stylesheet for stripping out DocBook 5/NG to DocBook 4. Note that
+DocBook XSLT drivers that include this stylesheet all override
+the match="/" template.</p>
+<p class="commit-changes">Modified: common/stripns.xsl,1.4 - Michael(tm)
+Smith</p>
+</li><li class="listitem">
+<p>Number figures, examples, and
+tables from <a href="http://docbook.org/tdg5/en/html/book.html"><code class="sgmltag-element">book</code></a> if there is no prefix (i.e. if
+<a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/chapter.autolabel.html"><em class="parameter"><code>chapter.autolabel</code></em></a> is set to 0). This avoids
+having the list of figures where the figures mysteriously restart
+their numeration periodically when
+<a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/chapter.autolabel.html"><em class="parameter"><code>chapter.autolabel</code></em></a> is set to
+0.</p>
+<p class="commit-changes">Modified: common/labels.xsl,1.36 - David Cramer</p>
+</li><li class="listitem">
+<p>Add <a href="http://docbook.org/tdg5/en/html/task.html"><code class="sgmltag-element">task</code></a> template in
+<a href="http://docbook.org/tdg5/en/html/title.html"><code class="sgmltag-element">title</code></a>.markup mode.</p>
+<p class="commit-changes">Modified: common/titles.xsl,1.34 - Robert
+Stayton</p>
+</li><li class="listitem">
+<p>Add children (with ids) of formal
+objects to target data.</p>
+<p class="commit-changes">Modified: common/targets.xsl,1.10 - Robert
+Stayton</p>
+</li><li class="listitem">
+<p>Added support for case when
+<a href="http://docbook.org/tdg5/en/html/personname.html"><code class="sgmltag-element">personname</code></a> doesn't contain specific name markup (as allowed
+in DocBook 5.0)</p>
+<p class="commit-changes">Modified: common/common.xsl,1.54 - Jirka
+Kosek</p>
+</li></ul></div>
+</div>
+
+<div class="sect2" title="Extensions"><div class="titlepage"><div><div><h3 class="title"><a name="V1700_Extensions"></a>Extensions</h3></div></div></div>
+
+<p>The following changes have been made to the
+ <code class="filename">extensions</code> code
+ since the 1.69.1 release.</p>
+<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
+<p>Support Xalan
+2.7</p>
+<p class="commit-changes">Modified: extensions/xalan27/.cvsignore,1.1;
+extensions/xalan27/build.xml,1.1;
+extensions/xalan27/nbproject/.cvsignore,1.1;
+extensions/xalan27/nbproject/build-impl.xml,1.1;
+extensions/xalan27/nbproject/genfiles.properties,1.1;
+extensions/xalan27/nbproject/project.properties,1.1;
+extensions/xalan27/nbproject/project.xml,1.1;
+extensions/xalan27/src/com/nwalsh/xalan/CVS.java,1.1;
+extensions/xalan27/src/com/nwalsh/xalan/Callout.java,1.1;
+extensions/xalan27/src/com/nwalsh/xalan/FormatCallout.java,1.1;
+extensions/xalan27/src/com/nwalsh/xalan/FormatDingbatCallout.java,1.1;
+extensions/xalan27/src/com/nwalsh/xalan/FormatGraphicCallout.java,1.1;
+extensions/xalan27/src/com/nwalsh/xalan/FormatTextCallout.java,1.1;
+extensions/xalan27/src/com/nwalsh/xalan/FormatUnicodeCallout.java,1.1;
+extensions/xalan27/src/com/nwalsh/xalan/Func.java,1.1;
+extensions/xalan27/src/com/nwalsh/xalan/ImageIntrinsics.java,1.1;
+extensions/xalan27/src/com/nwalsh/xalan/Params.java,1.1;
+extensions/xalan27/src/com/nwalsh/xalan/Table.java,1.1;
+extensions/xalan27/src/com/nwalsh/xalan/Text.java,1.1;
+extensions/xalan27/src/com/nwalsh/xalan/Verbatim.java,1.1 - Norman
+Walsh</p>
+</li><li class="listitem">
+<p>Handle the case where the imageFn
+is actually a <a href="http://docbook.org/tdg5/en/html/uri.html"><code class="sgmltag-element">URI</code></a>. This still needs
+work.</p>
+<p class="commit-changes">Modified: extensions/saxon643/com/nwalsh/saxon/ImageIntrinsics.java,1.4
+- Norman Walsh</p>
+</li></ul></div>
+</div>
+
+<div class="sect2" title="FO"><div class="titlepage"><div><div><h3 class="title"><a name="V1700_FO"></a>FO</h3></div></div></div>
+
+<p>The following changes have been made to the
+ <code class="filename">fo</code> code
+ since the 1.69.1 release.</p>
+<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
+<p>Adapted to the new indexing
+code. Now works just like a wrapper that calls kosek indexing method,
+originally implemented here.</p>
+<p class="commit-changes">Modified: fo/autoidx-ng.xsl,1.5 - Jirka
+Kosek</p>
+</li><li class="listitem">
+<p>Added parameters for header/footer
+<a href="http://docbook.org/tdg5/en/html/table.html"><code class="sgmltag-element">table</code></a> minimum height.</p>
+<p class="commit-changes">Modified: fo/pagesetup.xsl,1.60;
+fo/param.ent,1.100; fo/param.xweb,1.113 - Robert
+Stayton</p>
+</li><li class="listitem">
+<p>Add the <a href="http://docbook.org/tdg5/en/html/index.html"><code class="sgmltag-element">index</code></a>.method
+parameter.</p>
+<p class="commit-changes">Modified: fo/param.ent,1.99; fo/param.xweb,1.112 - Robert
+Stayton</p>
+</li><li class="listitem">
+<p>Integrate support for three
+indexing methods: - the original English-only method. -
+Jirka Kosek's method using EXSLT extensions. - Eliot Kimber's
+method using Saxon extensions. Use the '<a href="http://docbook.org/tdg5/en/html/index.html"><code class="sgmltag-element">index</code></a>.method'
+parameter to select.</p>
+<p class="commit-changes">Modified: fo/autoidx.xsl,1.38 - Robert
+Stayton</p>
+</li><li class="listitem">
+<p>Add support for <a href="http://docbook.org/tdg5/en/html/toc.html"><code class="sgmltag-element">TOC</code></a> for
+<a href="http://docbook.org/tdg5/en/html/qandaset.html"><code class="sgmltag-element">qandaset</code></a> in fo output.</p>
+<p class="commit-changes">Modified: fo/autotoc.xsl,1.30;
+fo/qandaset.xsl,1.20 - Robert Stayton</p>
+</li><li class="listitem">
+<p>Added parameter
+<a href="http://docbook.sourceforge.net/release/xsl/current/doc/fo/ulink.hyphenate.html"><em class="parameter"><code>ulink.hyphenate</code></em></a>.chars. Added parameter
+insert.<a href="http://docbook.org/tdg5/en/html/link.html"><code class="sgmltag-element">link</code></a>.page.number.</p>
+<p class="commit-changes">Modified: fo/param.ent,1.98;
+fo/param.xweb,1.111 - Robert Stayton</p>
+</li><li class="listitem">
+<p>Implemented feature request
+#942524 to add insert.<a href="http://docbook.org/tdg5/en/html/link.html"><code class="sgmltag-element">link</code></a>.page.number to allow link
+element cross references to have a page number.</p>
+<p class="commit-changes">Modified: fo/xref.xsl,1.67 -
+Robert Stayton</p>
+</li><li class="listitem">
+<p>Add support for
+<a href="http://docbook.sourceforge.net/release/xsl/current/doc/fo/ulink.hyphenate.html"><em class="parameter"><code>ulink.hyphenate</code></em></a>.chars so more characters
+can be break points in urls.</p>
+<p class="commit-changes">Modified: fo/xref.xsl,1.66 - Robert
+Stayton</p>
+</li><li class="listitem">
+<p>Implemented patch #1075144 to make
+the url text in a ulink in FO output an active <a href="http://docbook.org/tdg5/en/html/link.html"><code class="sgmltag-element">link</code></a> as
+well.</p>
+<p class="commit-changes">Modified: fo/xref.xsl,1.65 - Robert Stayton</p>
+</li><li class="listitem">
+<p><a href="http://docbook.org/tdg5/en/html/table.html"><code class="sgmltag-element">table</code></a> footnotes now
+have their own <a href="http://docbook.org/tdg5/en/html/table.html"><code class="sgmltag-element">table</code></a>.<a href="http://docbook.org/tdg5/en/html/footnote.html"><code class="sgmltag-element">footnote</code></a>.properties
+attribute set.</p>
+<p class="commit-changes">Modified: fo/footnote.xsl,1.23 - Robert
+Stayton</p>
+</li><li class="listitem">
+<p>Add <a href="http://docbook.org/tdg5/en/html/qandaset.html"><code class="sgmltag-element">qandaset</code></a> to
+root.elements.</p>
+<p class="commit-changes">Modified: fo/docbook.xsl,1.41 - Robert
+Stayton</p>
+</li><li class="listitem">
+<p>Added mode="page.sequence" to make
+it easier to put content into a page sequence. First used for
+<a href="http://docbook.org/tdg5/en/html/qandaset.html"><code class="sgmltag-element">qandaset</code></a>.</p>
+<p class="commit-changes">Modified: fo/component.xsl,1.37 - Robert
+Stayton</p>
+</li><li class="listitem">
+<p>Implemented feature request
+#1434408 to support formatting
+of <a href="http://docbook.org/tdg5/en/html/biblioentry.html"><code class="sgmltag-element">biblioentry</code></a>.</p>
+<p class="commit-changes">Modified: fo/biblio.xsl,1.35 - Robert
+Stayton</p>
+</li><li class="listitem">
+<p>Added
+<a href="http://docbook.org/tdg5/en/html/biblioentry.html"><code class="sgmltag-element">biblioentry</code></a>.properties.</p>
+<p class="commit-changes">Modified: fo/param.ent,1.97;
+fo/param.xweb,1.110 - Robert Stayton</p>
+</li><li class="listitem">
+<p>Support PTC/Arbortext
+bookmarks</p>
+<p class="commit-changes">Modified: fo/docbook.xsl,1.40; fo/ptc.xsl,1.1 - Norman
+Walsh</p>
+</li><li class="listitem">
+<p>Added
+<a href="http://docbook.org/tdg5/en/html/table.html"><code class="sgmltag-element">table</code></a>.<a href="http://docbook.org/tdg5/en/html/footnote.html"><code class="sgmltag-element">footnote</code></a>.properties to permit
+<a href="http://docbook.org/tdg5/en/html/table.html"><code class="sgmltag-element">table</code></a> footnotes to format differently from regular
+footnotes.</p>
+<p class="commit-changes">Modified: fo/param.ent,1.96; fo/param.xweb,1.109 - Robert
+Stayton</p>
+</li><li class="listitem">
+<p>Refactored <a href="http://docbook.org/tdg5/en/html/table.html"><code class="sgmltag-element">table</code></a>
+templates to unify their processing and support all options in
+all types. Now <a href="http://docbook.org/tdg5/en/html/table.html"><code class="sgmltag-element">table</code></a> and <a href="http://docbook.org/tdg5/en/html/informaltable.html"><code class="sgmltag-element">informaltable</code></a>, in
+both Cals and Html markup, use the same templates where possible,
+and all support pgwide, rotation, and floats. There is also a
+placeholder <a href="http://docbook.org/tdg5/en/html/table.html"><code class="sgmltag-element">table</code></a>.container template to
+support wrapping a <a href="http://docbook.org/tdg5/en/html/table.html"><code class="sgmltag-element">table</code></a> in a layout <a href="http://docbook.org/tdg5/en/html/table.html"><code class="sgmltag-element">table</code></a>,
+so the XEP <a href="http://docbook.org/tdg5/en/html/table.html"><code class="sgmltag-element">table</code></a> <a href="http://docbook.org/tdg5/en/html/title.html"><code class="sgmltag-element">title</code></a> "continued"
+extension can be more easily implemented.</p>
+<p class="commit-changes">Modified: fo/formal.xsl,1.52;
+fo/htmltbl.xsl,1.9; fo/table.xsl,1.48 - Robert
+Stayton</p>
+</li><li class="listitem">
+<p>Added new attribute set
+<a href="http://docbook.org/tdg5/en/html/toc.html"><code class="sgmltag-element">toc</code></a>.line.properties for controlling appearance of lines in
+ToC/LoT</p>
+<p class="commit-changes">Modified: fo/autotoc.xsl,1.29; fo/param.ent,1.95;
+fo/param.xweb,1.108 - Jirka Kosek</p>
+</li><li class="listitem">
+<p>Added support for float to example
+and <a href="http://docbook.org/tdg5/en/html/equation.html"><code class="sgmltag-element">equation</code></a>. Added support for pgwide to
+<a href="http://docbook.org/tdg5/en/html/figure.html"><code class="sgmltag-element">figure</code></a>, example, and <a href="http://docbook.org/tdg5/en/html/equation.html"><code class="sgmltag-element">equation</code></a> (the latter
+two via a dbfo pgwide="1" processing
+instruction).</p>
+<p class="commit-changes">Modified: fo/formal.xsl,1.51 - Robert
+Stayton</p>
+</li><li class="listitem">
+<p>Add pgwide.properties
+attribute-set.</p>
+<p class="commit-changes">Modified: fo/param.ent,1.94; fo/param.xweb,1.107 - Robert
+Stayton</p>
+</li><li class="listitem">
+<p>Added <a href="http://docbook.org/tdg5/en/html/refclass.html"><code class="sgmltag-element">refclass</code></a>.suppress
+param.</p>
+<p>If the value of <a href="http://docbook.org/tdg5/en/html/refclass.html"><code class="sgmltag-element">refclass</code></a>.suppress is
+non-zero, then display <a href="http://docbook.org/tdg5/en/html/refclass.html"><code class="sgmltag-element">refclass</code></a> contents is suppressed
+in output. Affects HTML and FO output
+only.</p>
+<p class="commit-changes">Modified: fo/param.ent,1.93; fo/param.xweb,1.106; html/param.ent,1.90;
+html/param.xweb,1.99; params/refclass.suppress.xml,1.1 - Michael(tm)
+Smith</p>
+</li><li class="listitem">
+<p>Improved support for
+<a href="http://docbook.org/tdg5/en/html/task.html"><code class="sgmltag-element">task</code></a> subelements</p>
+<p class="commit-changes">Modified: fo/task.xsl,1.3; html/task.xsl,1.3 -
+Jirka Kosek</p>
+</li><li class="listitem">
+<p>Adjusted spacing around
+K&amp;R-formatted <a href="http://docbook.org/tdg5/en/html/funcdef.html"><code class="sgmltag-element">Funcdef</code></a> and <a href="http://docbook.org/tdg5/en/html/paramdef.html"><code class="sgmltag-element">Paramdef</code></a>
+output such that it can more easily be discerned where one ends
+and the other begins. Closes #1213264.</p>
+<p class="commit-changes">Modified: fo/synop.xsl,1.18 -
+Michael(tm) Smith</p>
+</li><li class="listitem">
+<p>Made handling of
+paramdef/parameter in FO output consistent with that in HTML and
+manpages output. Closes #1213259.</p>
+<p class="commit-changes">Modified: fo/synop.xsl,1.17 - Michael(tm)
+Smith</p>
+</li><li class="listitem">
+<p>Made handling of
+<a href="http://docbook.org/tdg5/en/html/refnamediv.html"><code class="sgmltag-element">Refnamediv</code></a> consistent with formatting in HTML
+and manpages output; specifically, changed so that
+<a href="http://docbook.org/tdg5/en/html/refname.html"><code class="sgmltag-element">Refname</code></a> (comma-separated list of multiple instances
+found) is used (instead of <a href="http://docbook.org/tdg5/en/html/refentrytitle.html"><code class="sgmltag-element">Refentrytitle</code></a> as
+previously), then em-dash, then the <a href="http://docbook.org/tdg5/en/html/refpurpose.html"><code class="sgmltag-element">Refpurpose</code></a>. Closes
+#1212562.</p>
+<p class="commit-changes">Modified: fo/refentry.xsl,1.30 - Michael(tm)
+Smith</p>
+</li><li class="listitem">
+<p>Added output of
+<a href="http://docbook.org/tdg5/en/html/releaseinfo.html"><code class="sgmltag-element">Releaseinfo</code></a> to recto titlepage ("<a href="http://docbook.org/tdg5/en/html/copyright.html"><code class="sgmltag-element">copyright</code></a>"
+page) for <a href="http://docbook.org/tdg5/en/html/book.html"><code class="sgmltag-element">Book</code></a> in FO output. This makes it consistent
+with HTML output. Closes #1327034. Thanks to Paul DuBois for
+reporting.</p>
+<p class="commit-changes">Modified: fo/titlepage.templates.xml,1.28 - Michael(tm)
+Smith</p>
+</li><li class="listitem">
+<p>Added condition for setting
+block-progression-dimension.minimum on table-row, instead of
+height, when <a href="http://docbook.sourceforge.net/release/xsl/current/doc/fo/fop1.extensions.html"><em class="parameter"><code>fop1.extensions</code></em></a> is
+non-zero. For an explanation of the reason for the change,
+<a href="http://docbook.org/tdg5/en/html/see.html"><code class="sgmltag-element">see</code></a>: http://wiki.apache.org/xmlgraphics-fop/Troubleshooting/CommonLogMessages</p>
+<p class="commit-changes">Modified: fo/pagesetup.xsl,1.59
+- Michael(tm) Smith</p>
+</li><li class="listitem">
+<p>Added new
+<a href="http://docbook.org/tdg5/en/html/refclass.html"><code class="sgmltag-element">refclass</code></a>.suppress param for suppressing display
+of <a href="http://docbook.org/tdg5/en/html/refclass.html"><code class="sgmltag-element">Refclass</code></a> in HTML and FO output. Did not add it to
+manpages because manpages stylesheet is currently just silently
+ignoring <a href="http://docbook.org/tdg5/en/html/refclass.html"><code class="sgmltag-element">Refclass</code></a> anyway. Closes request
+#1461065. Thanks to Davor Ocelic (docelic) for
+reporting.</p>
+<p class="commit-changes">Modified: fo/refentry.xsl,1.29; html/refentry.xsl,1.23 -
+Michael(tm) Smith</p>
+</li><li class="listitem">
+<p>Add support for keep-together PI
+to informal objects.</p>
+<p class="commit-changes">Modified: fo/formal.xsl,1.50 - Robert
+Stayton</p>
+</li><li class="listitem">
+<p>Add support for
+<a href="http://docbook.sourceforge.net/release/xsl/current/doc/fo/fop1.extensions.html"><em class="parameter"><code>fop1.extensions</code></em></a>.</p>
+<p class="commit-changes">Modified: fo/formal.xsl,1.49;
+fo/graphics.xsl,1.44; fo/table.xsl,1.47 - Robert
+Stayton</p>
+</li><li class="listitem">
+<p>Add support for fop1
+bookmarks.</p>
+<p class="commit-changes">Modified: fo/docbook.xsl,1.39 - Robert
+Stayton</p>
+</li><li class="listitem">
+<p>Add fop1.extentions parameter to
+add support for fop development version.</p>
+<p class="commit-changes">Modified: fo/param.ent,1.92;
+fo/param.xweb,1.105 - Robert Stayton</p>
+</li><li class="listitem">
+<p>Start supporting fop development
+version, which will become fop version 1.</p>
+<p class="commit-changes">Modified: fo/fop1.xsl,1.1 -
+Robert Stayton</p>
+</li><li class="listitem">
+<p>Add template for <a href="http://docbook.org/tdg5/en/html/task.html"><code class="sgmltag-element">task</code></a>
+in mode="xref-to".</p>
+<p class="commit-changes">Modified: fo/xref.xsl,1.63; html/xref.xsl,1.57 - Robert
+Stayton</p>
+</li><li class="listitem">
+<p><a href="http://docbook.org/tdg5/en/html/table.html"><code class="sgmltag-element">table</code></a> footnotes now
+also get <a href="http://docbook.org/tdg5/en/html/footnote.html"><code class="sgmltag-element">footnote</code></a>.properties
+attribute-set.</p>
+<p class="commit-changes">Modified: fo/footnote.xsl,1.22 - Robert
+Stayton</p>
+</li><li class="listitem">
+<p>Added <a href="http://docbook.org/tdg5/en/html/index.html"><code class="sgmltag-element">index</code></a>.separator
+named template to compute the separator punctuation based on
+locale.</p>
+<p class="commit-changes">Modified: fo/autoidx.xsl,1.36 - Robert Stayton</p>
+</li><li class="listitem">
+<p>Added support for <a href="http://docbook.org/tdg5/en/html/link.html"><code class="sgmltag-element">link</code></a>,
+<a href="http://docbook.org/tdg5/en/html/olink.html"><code class="sgmltag-element">olink</code></a>, and <a href="http://docbook.org/tdg5/en/html/xref.html"><code class="sgmltag-element">xref</code></a> within OO
+<a href="http://docbook.org/tdg5/en/html/classsynopsis.html"><code class="sgmltag-element">Classsynopsis</code></a> and children. (Because DocBook NG/5
+allows it).</p>
+<p class="commit-changes">Modified: fo/synop.xsl,1.15; html/synop.xsl,1.19 - Michael(tm)
+Smith</p>
+</li><li class="listitem">
+<p>Support <a href="http://docbook.org/tdg5/en/html/date.html"><code class="sgmltag-element">date</code></a> as an
+inline</p>
+<p class="commit-changes">Modified: fo/inline.xsl,1.43; html/inline.xsl,1.46 - Norman
+Walsh</p>
+</li><li class="listitem">
+<p>Added new parameter
+<a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/keep.relative.image.uris.html"><em class="parameter"><code>keep.relative.image.uris</code></em></a></p>
+<p class="commit-changes">Modified: fo/param.ent,1.91;
+fo/param.xweb,1.104; html/param.ent,1.87; html/param.xweb,1.96;
+params/keep.relative.image.uris.xml,1.1 - Norman
+Walsh</p>
+</li><li class="listitem">
+<p>Map Unicode space characters
+U+2000-U+200A to fo:leaders.</p>
+<p class="commit-changes">Modified: fo/docbook.xsl,1.38;
+fo/passivetex.xsl,1.4; fo/spaces.xsl,1.1 - Jirka
+Kosek</p>
+</li><li class="listitem">
+<p>Output a real em dash for em-dash
+dingbat (instead of two hypens).</p>
+<p class="commit-changes">Modified: fo/fo.xsl,1.7 - Michael(tm)
+Smith</p>
+</li><li class="listitem">
+<p>Support default <a href="http://docbook.org/tdg5/en/html/label.html"><code class="sgmltag-element">label</code></a>
+width parameters for itemized and ordered lists</p>
+<p class="commit-changes">Modified: fo/lists.xsl,1.64;
+fo/param.ent,1.90; fo/param.xweb,1.103;
+params/itemizedlist.label.width.xml,1.1;
+params/orderedlist.label.width.xml,1.1 - Norman
+Walsh</p>
+</li><li class="listitem">
+<p>Generate localized
+<a href="http://docbook.org/tdg5/en/html/title.html"><code class="sgmltag-element">title</code></a> for <a href="http://docbook.org/tdg5/en/html/refsynopsisdiv.html"><code class="sgmltag-element">Refsynopsisdiv</code></a> if no
+appropriate <a href="http://docbook.org/tdg5/en/html/title.html"><code class="sgmltag-element">Title</code></a> descendant found in source. Closes
+#1212398. This change makes behavior for the <a href="http://docbook.org/tdg5/en/html/synopsis.html"><code class="sgmltag-element">Synopsis</code></a>
+<a href="http://docbook.org/tdg5/en/html/title.html"><code class="sgmltag-element">title</code></a> consistent with the behavior of HTML and
+manpages output.</p>
+<p>Also, added
+xsl:use-attribute-sets="normal.<a href="http://docbook.org/tdg5/en/html/para.html"><code class="sgmltag-element">para</code></a>.spacing" to
+block generated for <a href="http://docbook.org/tdg5/en/html/cmdsynopsis.html"><code class="sgmltag-element">Cmdsynopsis</code></a> output. Previously,
+that block had no spacing at all specified, which resulted it
+being crammed up to closely to the <a href="http://docbook.org/tdg5/en/html/synopsis.html"><code class="sgmltag-element">Synopsis</code></a>
+head.</p>
+<p class="commit-changes">Modified: fo/refentry.xsl,1.28; fo/synop.xsl,1.13 - Michael(tm)
+Smith</p>
+</li><li class="listitem">
+<p>Added parameters to support
+localization of <a href="http://docbook.org/tdg5/en/html/index.html"><code class="sgmltag-element">index</code></a>
+item punctuation.</p>
+<p class="commit-changes">Modified: fo/autoidx.xsl,1.35 - Robert
+Stayton</p>
+</li><li class="listitem">
+<p>Added
+<a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/index.number.separator.html"><em class="parameter"><code>index.number.separator</code></em></a>,
+<a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/index.range.separator.html"><em class="parameter"><code>index.range.separator</code></em></a>,
+and <a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/index.term.separator.html"><em class="parameter"><code>index.term.separator</code></em></a> parameters to
+support localization of punctuation in <a href="http://docbook.org/tdg5/en/html/index.html"><code class="sgmltag-element">index</code></a>
+entries.</p>
+<p class="commit-changes">Modified: fo/param.ent,1.89; fo/param.xweb,1.102 - Robert
+Stayton</p>
+</li><li class="listitem">
+<p>Added "Cross References"
+<a href="http://docbook.org/tdg5/en/html/section.html"><code class="sgmltag-element">section</code></a> in HTML doc (for consistency with the FO
+doc). Also, moved the existing FO "Cross
+References" <a href="http://docbook.org/tdg5/en/html/section.html"><code class="sgmltag-element">section</code></a> to follow the "Linking"
+<a href="http://docbook.org/tdg5/en/html/section.html"><code class="sgmltag-element">section</code></a>.</p>
+<p class="commit-changes">Modified: fo/param.xweb,1.101; html/param.xweb,1.95 -
+Michael(tm) Smith</p>
+</li><li class="listitem">
+<p>Added ID attribues to all
+<a href="http://docbook.org/tdg5/en/html/reference.html"><code class="sgmltag-element">Reference</code></a> elements (e.g., id="tables" for the doc for
+<a href="http://docbook.org/tdg5/en/html/section.html"><code class="sgmltag-element">section</code></a> on <a href="http://docbook.org/tdg5/en/html/table.html"><code class="sgmltag-element">Table</code></a> params). So pages for
+all subsections of ref docs now have stable filenames instead
+of arbitrary generated filenames.</p>
+<p class="commit-changes">Modified: fo/param.xweb,1.100;
+html/param.xweb,1.94 - Michael(tm) Smith</p>
+</li><li class="listitem">
+<p>Added two new parameters for
+handling of multi-term
+<a href="http://docbook.org/tdg5/en/html/varlistentry.html"><code class="sgmltag-element">varlistentry</code></a> elements:</p>
+<p><a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/variablelist.term.break.after.html"><em class="parameter"><code>variablelist.term.break.after</code></em></a>:
+When the <a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/variablelist.term.break.after.html"><em class="parameter"><code>variablelist.term.break.after</code></em></a> is
+non-zero, it will generate a line break after each
+<a href="http://docbook.org/tdg5/en/html/term.html"><code class="sgmltag-element">term</code></a> multi-term
+<a href="http://docbook.org/tdg5/en/html/varlistentry.html"><code class="sgmltag-element">varlistentry</code></a>.</p>
+<p><a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/variablelist.term.separator.html"><em class="parameter"><code>variablelist.term.separator</code></em></a>:
+When a <a href="http://docbook.org/tdg5/en/html/varlistentry.html"><code class="sgmltag-element">varlistentry</code></a> contains multiple <a href="http://docbook.org/tdg5/en/html/term.html"><code class="sgmltag-element">term</code></a>
+elements, the string specified in the value of the
+<a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/variablelist.term.separator.html"><em class="parameter"><code>variablelist.term.separator</code></em></a> parameter is
+placed after each <a href="http://docbook.org/tdg5/en/html/term.html"><code class="sgmltag-element">term</code></a> except the last. The default
+is ", " (a comma followed by a space). To suppress rendering of
+the separator, set the value of
+<a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/variablelist.term.separator.html"><em class="parameter"><code>variablelist.term.separator</code></em></a> to the empty
+string ("").</p>
+<p>These parameters are primarily intended to be
+useful if you have multi-term varlistentries that have long
+terms.</p>
+<p>Closes #1306676. Thanks to Sam Steingold for
+providing an example "lots of long terms" doc that demonstrated
+the value of having these options.</p>
+<p>Also, added
+normalize-space() call to processing of each
+<a href="http://docbook.org/tdg5/en/html/term.html"><code class="sgmltag-element">term</code></a>.</p>
+<p>This change affects all output formats
+(HTML, PDF, manpages). The default behavior should pretty much
+remain the same as before, but it is possible (as always) that
+the change may introduce some
+new bugginess.</p>
+<p class="commit-changes">Modified: fo/lists.xsl,1.62; fo/param.ent,1.88;
+fo/param.xweb,1.99; html/lists.xsl,1.48; html/param.ent,1.86;
+html/param.xweb,1.93; manpages/lists.xsl,1.22;
+manpages/param.ent,1.14; manpages/param.xweb,1.16;
+params/variablelist.term.break.after.xml,1.1;
+params/variablelist.term.separator.xml,1.1 - Michael(tm)
+Smith</p>
+</li><li class="listitem">
+<p>Add <a href="http://docbook.org/tdg5/en/html/sidebar.html"><code class="sgmltag-element">sidebar</code></a> titlepage
+placeholder attset for styles.</p>
+<p class="commit-changes">Modified: fo/titlepage.xsl,1.37 - Robert
+Stayton</p>
+</li><li class="listitem">
+<p>Add titlepage for
+<a href="http://docbook.org/tdg5/en/html/sidebar.html"><code class="sgmltag-element">sidebar</code></a>.</p>
+<p class="commit-changes">Modified: fo/titlepage.templates.xml,1.27 - Robert
+Stayton</p>
+</li><li class="listitem">
+<p>Implemented RFE
+#1292615.</p>
+<p>Added bunch of new parameters (attribute sets)
+that affect list presentation: list.block.properties,
+<a href="http://docbook.org/tdg5/en/html/itemizedlist.html"><code class="sgmltag-element">itemizedlist</code></a>.properties, <a href="http://docbook.org/tdg5/en/html/orderedlist.html"><code class="sgmltag-element">orderedlist</code></a>.properties,
+<a href="http://docbook.org/tdg5/en/html/itemizedlist.html"><code class="sgmltag-element">itemizedlist</code></a>.<a href="http://docbook.org/tdg5/en/html/label.html"><code class="sgmltag-element">label</code></a>.properties and
+<a href="http://docbook.org/tdg5/en/html/orderedlist.html"><code class="sgmltag-element">orderedlist</code></a>.<a href="http://docbook.org/tdg5/en/html/label.html"><code class="sgmltag-element">label</code></a>.properties. Default behaviour
+of stylesheets has not been changed but further customizations will be
+much more easier.</p>
+<p class="commit-changes">Modified: fo/lists.xsl,1.61; fo/param.ent,1.87;
+fo/param.xweb,1.98; params/itemizedlist.label.properties.xml,1.1;
+params/itemizedlist.properties.xml,1.1;
+params/list.block.properties.xml,1.1;
+params/orderedlist.label.properties.xml,1.1;
+params/orderedlist.properties.xml,1.1 - Jirka
+Kosek</p>
+</li><li class="listitem">
+<p>Implemented RFE
+#1242092.</p>
+<p>You can enable crop marks in your document by
+setting crop.marks=1 and xep.extensions=1. Appearance of crop
+marks can be controlled by parameters
+<a href="http://docbook.sourceforge.net/release/xsl/current/doc/fo/crop.mark.bleed.html"><em class="parameter"><code>crop.mark.bleed</code></em></a> (6pt),
+<a href="http://docbook.sourceforge.net/release/xsl/current/doc/fo/crop.mark.offset.html"><em class="parameter"><code>crop.mark.offset</code></em></a> (24pt) and
+<a href="http://docbook.sourceforge.net/release/xsl/current/doc/fo/crop.mark.width.html"><em class="parameter"><code>crop.mark.width</code></em></a> (0.5pt).</p>
+<p>Also there
+is new named template called user-xep-pis. You can overwrite it in
+order to produce some PIs that can control XEP as described in
+http://www.renderx.com/reference.html#Output_Formats</p>
+<p class="commit-changes">Modified: fo/docbook.xsl,1.36;
+fo/param.ent,1.86; fo/param.xweb,1.97; fo/xep.xsl,1.23;
+params/crop.mark.bleed.xml,1.1; params/crop.mark.offset.xml,1.1;
+params/crop.mark.width.xml,1.1; params/crop.marks.xml,1.1 - Jirka
+Kosek</p>
+</li></ul></div>
+</div>
+
+<div class="sect2" title="HTML"><div class="titlepage"><div><div><h3 class="title"><a name="V1700_HTML"></a>HTML</h3></div></div></div>
+
+<p>The following changes have been made to the
+ <code class="filename">html</code> code
+ since the 1.69.1 release.</p>
+<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
+<p>implemented
+<a href="http://docbook.org/tdg5/en/html/index.html"><code class="sgmltag-element">index</code></a>.method parameter and three
+methods.</p>
+<p class="commit-changes">Modified: html/autoidx.xsl,1.28 - Robert
+Stayton</p>
+</li><li class="listitem">
+<p>added <a href="http://docbook.org/tdg5/en/html/index.html"><code class="sgmltag-element">index</code></a>.method
+parameter to support 3 indexing methods.</p>
+<p class="commit-changes">Modified: html/param.ent,1.94;
+html/param.xweb,1.103 - Robert Stayton</p>
+</li><li class="listitem">
+<p>Implemented feature request
+#1072510 as a processing instruction to permit including external
+HTML content into HTML output.</p>
+<p class="commit-changes">Modified: html/pi.xsl,1.9 - Robert
+Stayton</p>
+</li><li class="listitem">
+<p>Added new parameter
+<a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/chunk.tocs.and.lots.html"><em class="parameter"><code>chunk.tocs.and.lots</code></em></a>.has.<a href="http://docbook.org/tdg5/en/html/title.html"><code class="sgmltag-element">title</code></a> which
+controls presence of <a href="http://docbook.org/tdg5/en/html/title.html"><code class="sgmltag-element">title</code></a> in a separate chunk with
+ToC/LoT. Disabling <a href="http://docbook.org/tdg5/en/html/title.html"><code class="sgmltag-element">title</code></a> can be very useful if you are
+generating frameset output (well, yes those frames, but some customers
+really want them ;-).</p>
+<p class="commit-changes">Modified: html/chunk-code.xsl,1.15;
+html/param.ent,1.93; html/param.xweb,1.102;
+params/chunk.tocs.and.lots.has.title.xml,1.1 - Jirka
+Kosek</p>
+</li><li class="listitem">
+<p>Support dbhtml/dbfo start PI for
+<a href="http://docbook.org/tdg5/en/html/orderedlist.html"><code class="sgmltag-element">orderedlist</code></a> numbering in both HTML and
+FO</p>
+<p class="commit-changes">Modified: common/common.xsl,1.61; html/lists.xsl,1.50 - Norman
+Walsh</p>
+</li><li class="listitem">
+<p>Allow <a href="http://docbook.org/tdg5/en/html/toc.html"><code class="sgmltag-element">ToC</code></a> without
+<a href="http://docbook.org/tdg5/en/html/title.html"><code class="sgmltag-element">title</code></a> also for set and
+<a href="http://docbook.org/tdg5/en/html/book.html"><code class="sgmltag-element">book</code></a>.</p>
+<p class="commit-changes">Modified: html/autotoc.xsl,1.37; html/division.xsl,1.12 -
+Jirka Kosek</p>
+</li><li class="listitem">
+<p>Implemented floats uniformly for
+<a href="http://docbook.org/tdg5/en/html/figure.html"><code class="sgmltag-element">figure</code></a>, example, <a href="http://docbook.org/tdg5/en/html/equation.html"><code class="sgmltag-element">equation</code></a>
+and <a href="http://docbook.org/tdg5/en/html/informalfigure.html"><code class="sgmltag-element">informalfigure</code></a>, <a href="http://docbook.org/tdg5/en/html/informalexample.html"><code class="sgmltag-element">informalexample</code></a>, and
+<a href="http://docbook.org/tdg5/en/html/informalequation.html"><code class="sgmltag-element">informalequation</code></a>.</p>
+<p class="commit-changes">Modified: html/formal.xsl,1.22 - Robert
+Stayton</p>
+</li><li class="listitem">
+<p>Added the
+autotoc.<a href="http://docbook.org/tdg5/en/html/label.html"><code class="sgmltag-element">label</code></a>.in.hyperlink param.</p>
+<p>If the value
+of autotoc.<a href="http://docbook.org/tdg5/en/html/label.html"><code class="sgmltag-element">label</code></a>.in.hyperlink is non-zero, labels
+are included in hyperlinked titles in the <a href="http://docbook.org/tdg5/en/html/toc.html"><code class="sgmltag-element">TOC</code></a>. If it
+is instead zero, labels are still displayed prior to the
+hyperlinked titles, but are not hyperlinked along with the
+titles.</p>
+<p>Closes patch #1065868. Thanks to anatoly techtonik
+for the patch.</p>
+<p class="commit-changes">Modified: html/autotoc.xsl,1.36; html/param.ent,1.92;
+html/param.xweb,1.101; params/autotoc.label.in.hyperlink.xml,1.1 -
+Michael(tm) Smith</p>
+</li><li class="listitem">
+<p>Added two new params:
+html.head.<a href="http://docbook.org/tdg5/en/html/legalnotice.html"><code class="sgmltag-element">legalnotice</code></a>.<a href="http://docbook.org/tdg5/en/html/link.html"><code class="sgmltag-element">link</code></a>.types
+and html.head.<a href="http://docbook.org/tdg5/en/html/legalnotice.html"><code class="sgmltag-element">legalnotice</code></a>.<a href="http://docbook.org/tdg5/en/html/link.html"><code class="sgmltag-element">link</code></a>.multiple.</p>
+<p>If
+the value of the <a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/generate.legalnotice.link.html"><em class="parameter"><code>generate.legalnotice.link</code></em></a> is
+non-zero, then the stylesheet generates (in the head
+<a href="http://docbook.org/tdg5/en/html/section.html"><code class="sgmltag-element">section</code></a> of the HTML source) either a single HTML
+<a href="http://docbook.org/tdg5/en/html/link.html"><code class="sgmltag-element">link</code></a> element or, if the value of
+the html.head.<a href="http://docbook.org/tdg5/en/html/legalnotice.html"><code class="sgmltag-element">legalnotice</code></a>.<a href="http://docbook.org/tdg5/en/html/link.html"><code class="sgmltag-element">link</code></a>.multiple is
+non-zero, one <a href="http://docbook.org/tdg5/en/html/link.html"><code class="sgmltag-element">link</code></a> element for each <a href="http://docbook.org/tdg5/en/html/link.html"><code class="sgmltag-element">link</code></a>
+type specified. Each <a href="http://docbook.org/tdg5/en/html/link.html"><code class="sgmltag-element">link</code></a> has the
+following attributes:</p>
+<p> - a rel attribute whose value
+is derived from the value of
+html.head.<a href="http://docbook.org/tdg5/en/html/legalnotice.html"><code class="sgmltag-element">legalnotice</code></a>.<a href="http://docbook.org/tdg5/en/html/link.html"><code class="sgmltag-element">link</code></a>.types</p>
+<p> -
+an href attribute whose value is set to the URL of the file
+containing the <a href="http://docbook.org/tdg5/en/html/legalnotice.html"><code class="sgmltag-element">legalnotice</code></a></p>
+<p> - a <a href="http://docbook.org/tdg5/en/html/title.html"><code class="sgmltag-element">title</code></a>
+attribute whose value is set to the <a href="http://docbook.org/tdg5/en/html/title.html"><code class="sgmltag-element">title</code></a> of the
+corresponding <a href="http://docbook.org/tdg5/en/html/legalnotice.html"><code class="sgmltag-element">legalnotice</code></a> (or a <a href="http://docbook.org/tdg5/en/html/title.html"><code class="sgmltag-element">title</code></a>
+programatically determined by the stylesheet)</p>
+<p>For
+example:</p>
+<p> &lt;<a href="http://docbook.org/tdg5/en/html/link.html"><code class="sgmltag-element">link</code></a> rel="<a href="http://docbook.org/tdg5/en/html/copyright.html"><code class="sgmltag-element">copyright</code></a>"
+href="ln-id2524073.html" title="Legal Notice"&gt;</p>
+<p>Closes
+#1476450. Thanks to Sam Steingold.</p>
+<p class="commit-changes">Modified: html/chunk-common.xsl,1.45;
+html/param.ent,1.91; html/param.xweb,1.100;
+params/generate.legalnotice.link.xml,1.4;
+params/html.head.legalnotice.link.multiple.xml,1.1;
+params/html.head.legalnotice.link.types.xml,1.1 - Michael(tm)
+Smith</p>
+</li><li class="listitem">
+<p>Added <a href="http://docbook.org/tdg5/en/html/refclass.html"><code class="sgmltag-element">refclass</code></a>.suppress
+param.</p>
+<p>If the value of <a href="http://docbook.org/tdg5/en/html/refclass.html"><code class="sgmltag-element">refclass</code></a>.suppress is
+non-zero, then display <a href="http://docbook.org/tdg5/en/html/refclass.html"><code class="sgmltag-element">refclass</code></a> contents is suppressed
+in output. Affects HTML and FO output
+only.</p>
+<p class="commit-changes">Modified: fo/param.ent,1.93; fo/param.xweb,1.106; html/param.ent,1.90;
+html/param.xweb,1.99; params/refclass.suppress.xml,1.1 - Michael(tm)
+Smith</p>
+</li><li class="listitem">
+<p>Improved support for
+<a href="http://docbook.org/tdg5/en/html/task.html"><code class="sgmltag-element">task</code></a> subelements</p>
+<p class="commit-changes">Modified: fo/task.xsl,1.3; html/task.xsl,1.3 -
+Jirka Kosek</p>
+</li><li class="listitem">
+<p>Added new
+<a href="http://docbook.org/tdg5/en/html/refclass.html"><code class="sgmltag-element">refclass</code></a>.suppress param for suppressing display
+of <a href="http://docbook.org/tdg5/en/html/refclass.html"><code class="sgmltag-element">Refclass</code></a> in HTML and FO output. Did not add it to
+manpages because manpages stylesheet is currently just silently
+ignoring <a href="http://docbook.org/tdg5/en/html/refclass.html"><code class="sgmltag-element">Refclass</code></a> anyway. Closes request
+#1461065. Thanks to Davor Ocelic (docelic) for
+reporting.</p>
+<p class="commit-changes">Modified: fo/refentry.xsl,1.29; html/refentry.xsl,1.23 -
+Michael(tm) Smith</p>
+</li><li class="listitem">
+<p>Process <a href="http://docbook.org/tdg5/en/html/alt.html"><code class="sgmltag-element">alt</code></a> text with
+normalize-space(). Replace tab indents with
+spaces.</p>
+<p class="commit-changes">Modified: html/graphics.xsl,1.57 - Robert
+Stayton</p>
+</li><li class="listitem">
+<p>Content of <a href="http://docbook.org/tdg5/en/html/citation.html"><code class="sgmltag-element">citation</code></a>
+element is automatically linked to the bibliographic <a href="http://docbook.org/tdg5/en/html/entry.html"><code class="sgmltag-element">entry</code></a>
+with the corresponding <a href="http://docbook.org/tdg5/en/html/abbrev.html"><code class="sgmltag-element">abbrev</code></a>.</p>
+<p class="commit-changes">Modified: html/biblio.xsl,1.26;
+html/inline.xsl,1.47; html/xref.xsl,1.58 - Jirka
+Kosek</p>
+</li><li class="listitem">
+<p>Add template for <a href="http://docbook.org/tdg5/en/html/task.html"><code class="sgmltag-element">task</code></a>
+in mode="xref-to".</p>
+<p class="commit-changes">Modified: fo/xref.xsl,1.63; html/xref.xsl,1.57 - Robert
+Stayton</p>
+</li><li class="listitem">
+<p>Suppress ID warnings if the
+.warnings parameter is 0</p>
+<p class="commit-changes">Modified: html/html.xsl,1.17 - Norman
+Walsh</p>
+</li><li class="listitem">
+<p>Add support for floatstyle to
+<a href="http://docbook.org/tdg5/en/html/figure.html"><code class="sgmltag-element">figure</code></a>.</p>
+<p class="commit-changes">Modified: html/formal.xsl,1.21 - Robert
+Stayton</p>
+</li><li class="listitem">
+<p>Handling of <a href="http://docbook.org/tdg5/en/html/xref.html"><code class="sgmltag-element">xref</code></a> to
+area/areaset need support in extensions code also. I currently have no
+time to touch extensions code, so code is here to be enabled when
+extension is fixed also.</p>
+<p class="commit-changes">Modified: html/xref.xsl,1.56 - Jirka
+Kosek</p>
+</li><li class="listitem">
+<p>Added 3 parameters for overriding
+gentext for <a href="http://docbook.org/tdg5/en/html/index.html"><code class="sgmltag-element">index</code></a>
+punctuation.</p>
+<p class="commit-changes">Modified: html/param.ent,1.89; html/param.xweb,1.98 - Robert
+Stayton</p>
+</li><li class="listitem">
+<p>Added parameters to support
+localization of <a href="http://docbook.org/tdg5/en/html/index.html"><code class="sgmltag-element">index</code></a> item punctuation. Added
+<a href="http://docbook.org/tdg5/en/html/index.html"><code class="sgmltag-element">index</code></a>.separator named template to compute
+the separator punctuation based on
+locale.</p>
+<p class="commit-changes">Modified: html/autoidx.xsl,1.27 - Robert
+Stayton</p>
+</li><li class="listitem">
+<p>Added a &lt;div
+class="{$class}-contents"&gt; wrapper around output of contents
+of all formal objects. Also, added an optional &lt;br
+class="{class}-break"/&gt; linebreak after all formal
+objects.</p>
+<p>WARNING: Because this change places an additional
+DIV between the DIV wrapper for the <a href="http://docbook.org/tdg5/en/html/equation.html"><code class="sgmltag-element">equation</code></a> and the
+<a href="http://docbook.org/tdg5/en/html/equation.html"><code class="sgmltag-element">equation</code></a> contents, it may break some existing CSS
+stylesheets that have been created with the assumption that there
+would never be an intervening DIV there.</p>
+<p>The following is
+an example of what <a href="http://docbook.org/tdg5/en/html/equation.html"><code class="sgmltag-element">Equation</code></a> output looks like as a
+result of the changes described above.</p>
+<p> &lt;div
+class="<a href="http://docbook.org/tdg5/en/html/equation.html"><code class="sgmltag-element">equation</code></a>"&gt; &lt;a name="three"
+id="three"&gt;&lt;/a&gt;</p>
+<p> &lt;p
+class="<a href="http://docbook.org/tdg5/en/html/title.html"><code class="sgmltag-element">title</code></a>"&gt;&lt;b&gt;(1.3)&lt;/b&gt;&lt;/p&gt;</p>
+<p>
+&lt;div class="equation-contents"&gt; &lt;span
+class="<a href="http://docbook.org/tdg5/en/html/mathphrase.html"><code class="sgmltag-element">mathphrase</code></a>"&gt;1+1=3&lt;/span&gt;
+&lt;/div&gt; &lt;/div&gt;&lt;br
+class="equation-break"&gt;</p>
+<p>Rationale: These changes allow
+CSS control of the placement of the formal-object
+<a href="http://docbook.org/tdg5/en/html/title.html"><code class="sgmltag-element">title</code></a> relative to the formal-object
+contents. For example, using the CSS "float" <a href="http://docbook.org/tdg5/en/html/property.html"><code class="sgmltag-element">property</code></a>
+enables the <a href="http://docbook.org/tdg5/en/html/title.html"><code class="sgmltag-element">title</code></a> and contents to be rendered on the
+same line. Example stylesheet:</p>
+<p> .<a href="http://docbook.org/tdg5/en/html/equation.html"><code class="sgmltag-element">equation</code></a>
+{ margin-top: 20px; margin-bottom: 20px; }
+.equation-contents { float: left; }</p>
+<p>
+.<a href="http://docbook.org/tdg5/en/html/equation.html"><code class="sgmltag-element">equation</code></a> .<a href="http://docbook.org/tdg5/en/html/title.html"><code class="sgmltag-element">title</code></a> { margin-top: 0;
+float: right; margin-right: 200px; }</p>
+<p>
+.<a href="http://docbook.org/tdg5/en/html/equation.html"><code class="sgmltag-element">equation</code></a> .<a href="http://docbook.org/tdg5/en/html/title.html"><code class="sgmltag-element">title</code></a> b { font-weight:
+normal; }</p>
+<p> .equation-break { clear: both;
+}</p>
+<p>Note that the purpose of the ".equation-break" class is
+to provide a way to clear off the floats.</p>
+<p>If you want
+to instead have the <a href="http://docbook.org/tdg5/en/html/equation.html"><code class="sgmltag-element">equation</code></a> <a href="http://docbook.org/tdg5/en/html/title.html"><code class="sgmltag-element">title</code></a> rendered to
+the left of the <a href="http://docbook.org/tdg5/en/html/equation.html"><code class="sgmltag-element">equation</code></a> contents, you can do
+something like this:</p>
+<p> .<a href="http://docbook.org/tdg5/en/html/equation.html"><code class="sgmltag-element">equation</code></a> {
+margin-top: 20px; width: 300px; margin-bottom: 20px;
+} .equation-contents { float: right; }</p>
+<p>
+.<a href="http://docbook.org/tdg5/en/html/equation.html"><code class="sgmltag-element">equation</code></a> .<a href="http://docbook.org/tdg5/en/html/title.html"><code class="sgmltag-element">title</code></a> { margin-top: 0;
+float: left; margin-right: 200px; }</p>
+<p>
+.<a href="http://docbook.org/tdg5/en/html/equation.html"><code class="sgmltag-element">equation</code></a> .<a href="http://docbook.org/tdg5/en/html/title.html"><code class="sgmltag-element">title</code></a> b { font-weight:
+normal; }</p>
+<p> .equation-break { clear: both;
+}</p>
+<p class="commit-changes">Modified: html/formal.xsl,1.20 - Michael(tm) Smith</p>
+</li><li class="listitem">
+<p>Added a chunker.output.quiet
+top-level parameter so that the chunker can be made quiet by
+default</p>
+<p class="commit-changes">Modified: html/chunker.xsl,1.26 - Norman Walsh</p>
+</li><li class="listitem">
+<p>Added support for <a href="http://docbook.org/tdg5/en/html/link.html"><code class="sgmltag-element">link</code></a>,
+<a href="http://docbook.org/tdg5/en/html/olink.html"><code class="sgmltag-element">olink</code></a>, and <a href="http://docbook.org/tdg5/en/html/xref.html"><code class="sgmltag-element">xref</code></a> within OO
+<a href="http://docbook.org/tdg5/en/html/classsynopsis.html"><code class="sgmltag-element">Classsynopsis</code></a> and children. (Because DocBook NG/5
+allows it).</p>
+<p class="commit-changes">Modified: fo/synop.xsl,1.15; html/synop.xsl,1.19 - Michael(tm)
+Smith</p>
+</li><li class="listitem">
+<p>New parameter:
+<a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/id.warnings.html"><em class="parameter"><code>id.warnings</code></em></a>. If non-zero, warnings are
+generated for titled objects that don't have titles. True by default;
+I wonder if this will be too aggressive?</p>
+<p class="commit-changes">Modified: html/biblio.xsl,1.25;
+html/component.xsl,1.27; html/division.xsl,1.11; html/formal.xsl,1.19;
+html/glossary.xsl,1.20; html/html.xsl,1.13; html/index.xsl,1.16;
+html/param.ent,1.88; html/param.xweb,1.97; html/refentry.xsl,1.22;
+html/sections.xsl,1.30; params/id.warnings.xml,1.1 - Norman
+Walsh</p>
+</li><li class="listitem">
+<p>If the
+<a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/keep.relative.image.uris.html"><em class="parameter"><code>keep.relative.image.uris</code></em></a> parameter is true,
+don't use the absolute <a href="http://docbook.org/tdg5/en/html/uri.html"><code class="sgmltag-element">URI</code></a> (as calculated from xml:base) in
+the img src attribute, us the value the <a href="http://docbook.org/tdg5/en/html/author.html"><code class="sgmltag-element">author</code></a>
+specified. Note that we still have to calculate the absolute
+<a href="http://docbook.org/tdg5/en/html/filename.html"><code class="sgmltag-element">filename</code></a> for use in the image intrinsics
+extension.</p>
+<p class="commit-changes">Modified: html/graphics.xsl,1.56 - Norman
+Walsh</p>
+</li><li class="listitem">
+<p>Support <a href="http://docbook.org/tdg5/en/html/date.html"><code class="sgmltag-element">date</code></a> as an
+inline</p>
+<p class="commit-changes">Modified: fo/inline.xsl,1.43; html/inline.xsl,1.46 - Norman
+Walsh</p>
+</li><li class="listitem">
+<p>Added new parameter
+<a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/keep.relative.image.uris.html"><em class="parameter"><code>keep.relative.image.uris</code></em></a></p>
+<p class="commit-changes">Modified: fo/param.ent,1.91;
+fo/param.xweb,1.104; html/param.ent,1.87; html/param.xweb,1.96;
+params/keep.relative.image.uris.xml,1.1 - Norman
+Walsh</p>
+</li><li class="listitem">
+<p>Added two new parameters for
+handling of multi-term
+<a href="http://docbook.org/tdg5/en/html/varlistentry.html"><code class="sgmltag-element">varlistentry</code></a> elements:</p>
+<p><a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/variablelist.term.break.after.html"><em class="parameter"><code>variablelist.term.break.after</code></em></a>:
+When the <a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/variablelist.term.break.after.html"><em class="parameter"><code>variablelist.term.break.after</code></em></a> is
+non-zero, it will generate a line break after each
+<a href="http://docbook.org/tdg5/en/html/term.html"><code class="sgmltag-element">term</code></a> multi-term
+<a href="http://docbook.org/tdg5/en/html/varlistentry.html"><code class="sgmltag-element">varlistentry</code></a>.</p>
+<p><a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/variablelist.term.separator.html"><em class="parameter"><code>variablelist.term.separator</code></em></a>:
+When a <a href="http://docbook.org/tdg5/en/html/varlistentry.html"><code class="sgmltag-element">varlistentry</code></a> contains multiple <a href="http://docbook.org/tdg5/en/html/term.html"><code class="sgmltag-element">term</code></a>
+elements, the string specified in the value of the
+<a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/variablelist.term.separator.html"><em class="parameter"><code>variablelist.term.separator</code></em></a> parameter is
+placed after each <a href="http://docbook.org/tdg5/en/html/term.html"><code class="sgmltag-element">term</code></a> except the last. The default
+is ", " (a comma followed by a space). To suppress rendering of
+the separator, set the value of
+<a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/variablelist.term.separator.html"><em class="parameter"><code>variablelist.term.separator</code></em></a> to the empty
+string ("").</p>
+<p>These parameters are primarily intended to be
+useful if you have multi-term varlistentries that have long
+terms.</p>
+<p>Closes #1306676. Thanks to Sam Steingold for
+providing an example "lots of long terms" doc that demonstrated
+the value of having these options.</p>
+<p>Also, added
+normalize-space() call to processing of each
+<a href="http://docbook.org/tdg5/en/html/term.html"><code class="sgmltag-element">term</code></a>.</p>
+<p>This change affects all output formats
+(HTML, PDF, manpages). The default behavior should pretty much
+remain the same as before, but it is possible (as always) that
+the change may introduce some
+new bugginess.</p>
+<p class="commit-changes">Modified: fo/lists.xsl,1.62; fo/param.ent,1.88;
+fo/param.xweb,1.99; html/lists.xsl,1.48; html/param.ent,1.86;
+html/param.xweb,1.93; manpages/lists.xsl,1.22;
+manpages/param.ent,1.14; manpages/param.xweb,1.16;
+params/variablelist.term.break.after.xml,1.1;
+params/variablelist.term.separator.xml,1.1 - Michael(tm)
+Smith</p>
+</li><li class="listitem">
+<p>Added "wrapper-name" param to
+inline.charseq named template, enabling it to output inlines
+other than just "span". <a href="http://docbook.org/tdg5/en/html/acronym.html"><code class="sgmltag-element">Acronym</code></a> and <a href="http://docbook.org/tdg5/en/html/abbrev.html"><code class="sgmltag-element">Abbrev</code></a>
+templates now use inline.charseq to output HTML
+"<a href="http://docbook.org/tdg5/en/html/acronym.html"><code class="sgmltag-element">acronym</code></a>" and "abbr" elements (instead of
+"span"). Closes #1305468. Thanks to Sam Steingold for suggesting
+the change.</p>
+<p class="commit-changes">Modified: html/inline.xsl,1.45 - Michael(tm)
+Smith</p>
+</li></ul></div>
+</div>
+
+<div class="sect2" title="Manpages"><div class="titlepage"><div><div><h3 class="title"><a name="V1700_Manpages"></a>Manpages</h3></div></div></div>
+
+<p>The following changes have been made to the
+ <code class="filename">manpages</code> code
+ since the 1.69.1 release.</p>
+<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
+<p>Added the following
+params:</p>
+<p> - man.indent.width (string-valued) -
+man.indent.refsect (boolean) - man.indent.blurbs (boolean)
+- man.indent.lists (boolean) - man.indent.verbatims
+(boolean)</p>
+<p>Note that in earlier snapshots, man.indent.width
+was named man.indentation.default.value and the boolean params
+had names like man.indentation.*.adjust. Also the
+man.indent.blurbs param was called man.indentation.authors.adjust
+(or something).</p>
+<p>The behavior now is: If the value of a
+particular man.indent.* boolean param is non-zero, the
+corresponding contents (refsect*, list items,
+authorblurb/personblurb, vervatims) are displayed with a left
+margin indented by a width equal to the value
+of man.indent.width.</p>
+<p class="commit-changes">Modified: params/man.indent.blurbs.xml,1.1;
+manpages/docbook.xsl,1.74; manpages/info.xsl,1.20;
+manpages/lists.xsl,1.30; manpages/other.xsl,1.20;
+manpages/param.ent,1.22; manpages/param.xweb,1.24;
+manpages/refentry.xsl,1.14; params/man.indent.lists.xml,1.1;
+params/man.indent.refsect.xml,1.1;
+params/man.indent.verbatims.xml,1.1; params/man.indent.width.xml,1.1 -
+Michael(tm) Smith</p>
+</li><li class="listitem">
+<p>Added
+man.<a href="http://docbook.org/tdg5/en/html/table.html"><code class="sgmltag-element">table</code></a>.footnotes.divider param.</p>
+<p>In each
+<a href="http://docbook.org/tdg5/en/html/table.html"><code class="sgmltag-element">table</code></a> that contains footenotes, the string specified
+by the man.<a href="http://docbook.org/tdg5/en/html/table.html"><code class="sgmltag-element">table</code></a>.footnotes.divider parameter is output
+before the list of footnotes for the
+<a href="http://docbook.org/tdg5/en/html/table.html"><code class="sgmltag-element">table</code></a>.</p>
+<p class="commit-changes">Modified: manpages/docbook.xsl,1.73;
+manpages/links.xsl,1.6; manpages/param.ent,1.21;
+manpages/param.xweb,1.23; params/man.table.footnotes.divider.xml,1.1 -
+Michael(tm) Smith</p>
+</li><li class="listitem">
+<p>Added the
+man.output.in.separate.dir,
+man.output.<a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/base.dir.html"><em class="parameter"><code>base.dir</code></em></a>,
+and man.output.subdirs.enabled parameters.</p>
+<p>The
+man.output.<a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/base.dir.html"><em class="parameter"><code>base.dir</code></em></a> parameter specifies the
+base directory into which man-page files are
+output. The man.output.subdirs.enabled parameter controls whether
+the files are output in subdirectories within the base
+directory.</p>
+<p>The values of the
+man.output.<a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/base.dir.html"><em class="parameter"><code>base.dir</code></em></a>
+and man.output.subdirs.enabled parameters are used only if the
+value of man.output.in.separate.dir parameter is non-zero. If the
+value of man.output.in.separate.dir is zero, man-page files are
+not output in a separate
+directory.</p>
+<p class="commit-changes">Modified: manpages/docbook.xsl,1.72; manpages/param.ent,1.20;
+manpages/param.xweb,1.22; params/man.output.base.dir.xml,1.1;
+params/man.output.in.separate.dir.xml,1.1;
+params/man.output.subdirs.enabled.xml,1.1 - Michael(tm)
+Smith</p>
+</li><li class="listitem">
+<p>Added
+man.font.<a href="http://docbook.org/tdg5/en/html/table.html"><code class="sgmltag-element">table</code></a>.headings and
+man.font.<a href="http://docbook.org/tdg5/en/html/table.html"><code class="sgmltag-element">table</code></a>.<a href="http://docbook.org/tdg5/en/html/title.html"><code class="sgmltag-element">title</code></a> params, for
+controlling font in <a href="http://docbook.org/tdg5/en/html/table.html"><code class="sgmltag-element">table</code></a> headings and
+titles.</p>
+<p class="commit-changes">Modified: manpages/docbook.xsl,1.71; manpages/param.ent,1.19;
+manpages/param.xweb,1.21; params/man.font.table.headings.xml,1.1;
+params/man.font.table.title.xml,1.1 - Michael(tm)
+Smith</p>
+</li><li class="listitem">
+<p>Added
+man.font.<a href="http://docbook.org/tdg5/en/html/funcsynopsisinfo.html"><code class="sgmltag-element">funcsynopsisinfo</code></a> and
+man.font.<a href="http://docbook.org/tdg5/en/html/funcprototype.html"><code class="sgmltag-element">funcprototype</code></a> params, for specifying the roff
+font (for example, BI, B, I) for <a href="http://docbook.org/tdg5/en/html/funcsynopsisinfo.html"><code class="sgmltag-element">funcsynopsisinfo</code></a> and
+<a href="http://docbook.org/tdg5/en/html/funcprototype.html"><code class="sgmltag-element">funcprototype</code></a> output.</p>
+<p class="commit-changes">Modified: manpages/block.xsl,1.19;
+manpages/docbook.xsl,1.69; manpages/param.ent,1.18;
+manpages/param.xweb,1.20; manpages/synop.xsl,1.29;
+manpages/table.xsl,1.21; params/man.font.funcprototype.xml,1.1;
+params/man.font.funcsynopsisinfo.xml,1.1 - Michael(tm)
+Smith</p>
+</li><li class="listitem">
+<p>Added
+man.<a href="http://docbook.org/tdg5/en/html/segtitle.html"><code class="sgmltag-element">segtitle</code></a>.suppress param.</p>
+<p>If the value of
+man.<a href="http://docbook.org/tdg5/en/html/segtitle.html"><code class="sgmltag-element">segtitle</code></a>.suppress is non-zero, then display
+of <a href="http://docbook.org/tdg5/en/html/segtitle.html"><code class="sgmltag-element">segtitle</code></a> contents is suppressed in
+output.</p>
+<p class="commit-changes">Modified: manpages/docbook.xsl,1.68; manpages/param.ent,1.17;
+manpages/param.xweb,1.19; params/man.segtitle.suppress.xml,1.1 -
+Michael(tm) Smith</p>
+</li><li class="listitem">
+<p>Added
+man.output.<a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/manifest.html"><em class="parameter"><code>manifest</code></em></a>.enabled and
+man.output.manifest.<a href="http://docbook.org/tdg5/en/html/filename.html"><code class="sgmltag-element">filename</code></a> params.</p>
+<p>If
+man.output.<a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/manifest.html"><em class="parameter"><code>manifest</code></em></a>.enabled is non-zero, a list
+of filenames for man pages generated by the stylesheet
+transformation is written to the file named by
+man.output.<a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/manifest.html"><em class="parameter"><code>manifest</code></em></a>.<a href="http://docbook.org/tdg5/en/html/filename.html"><code class="sgmltag-element">filename</code></a></p>
+<p class="commit-changes">Modified: manpages/docbook.xsl,1.67;
+manpages/other.xsl,1.19; manpages/param.ent,1.16;
+manpages/param.xweb,1.18; params/man.output.manifest.enabled.xml,1.1;
+params/man.output.manifest.filename.xml,1.1;
+tools/make/Makefile.DocBook,1.4 - Michael(tm)
+Smith</p>
+</li><li class="listitem">
+<p>Added
+<a href="http://docbook.org/tdg5/en/html/refentry.html"><code class="sgmltag-element">refentry</code></a>.meta.get.quietly param.</p>
+<p>If zero (the
+default), notes and warnings about "missing" markup are generated
+during gathering of <a href="http://docbook.org/tdg5/en/html/refentry.html"><code class="sgmltag-element">refentry</code></a> metadata. If
+non-zero, the metadata is gathered "quietly" -- that is, the
+notes and warnings are suppressed.</p>
+<p>NOTE: If you are
+processing a large amount of <a href="http://docbook.org/tdg5/en/html/refentry.html"><code class="sgmltag-element">refentry</code></a> content, you
+may be able to speed up processing significantly by setting a
+non-zero value for
+<a href="http://docbook.org/tdg5/en/html/refentry.html"><code class="sgmltag-element">refentry</code></a>.meta.get.quietly.</p>
+<p class="commit-changes">Modified: common/refentry.xsl,1.17;
+manpages/param.ent,1.15; manpages/param.xweb,1.17;
+params/refentry.meta.get.quietly.xml,1.1 - Michael(tm)
+Smith</p>
+</li><li class="listitem">
+<p>Changed names of all boolean
+indentation params to man.indent.* Also discarded individual
+man.indent.*.value params and switched to just using a common
+man.indent.width param (3n by default).</p>
+<p class="commit-changes">Modified: manpages/docbook.xsl,1.66;
+manpages/info.xsl,1.19; manpages/lists.xsl,1.29;
+manpages/other.xsl,1.18; manpages/refentry.xsl,1.13 - Michael(tm)
+Smith</p>
+</li><li class="listitem">
+<p>Added boolean
+man.output.in.separate.dir param, to control whether or not man
+files are output in separate directory.</p>
+<p class="commit-changes">Modified: manpages/docbook.xsl,1.65;
+manpages/utility.xsl,1.14 - Michael(tm) Smith</p>
+</li><li class="listitem">
+<p>Added options for controlling
+indentation of verbatim output. Controlled through the
+man.indentation.verbatims.adjust
+and man.indentation.verbatims.value params. Closes
+#1242997</p>
+<p class="commit-changes">Modified: manpages/block.xsl,1.15; manpages/docbook.xsl,1.64 -
+Michael(tm) Smith</p>
+</li><li class="listitem">
+<p>Added options for controlling
+indentation in lists and in *blurb output in the AUTHORS
+<a href="http://docbook.org/tdg5/en/html/section.html"><code class="sgmltag-element">section</code></a>. Controlled through
+the man.indentation.lists.adjust,
+man.indentation.lists.value, man.indentation.authors.adjust, and
+man.indentation.authors.value parameters. Default is 3 characters
+(instead of the roff default of 8 characters). Closes
+#1449369.</p>
+<p>Also, removed the indent that was being set on
+<a href="http://docbook.org/tdg5/en/html/informalexample.html"><code class="sgmltag-element">informalexample</code></a> outuput. I will instead add an option
+for indenting verbatims, which I think is what the
+<a href="http://docbook.org/tdg5/en/html/informalexample.html"><code class="sgmltag-element">informalexample</code></a> indent was intended
+for originally.</p>
+<p class="commit-changes">Modified: manpages/block.xsl,1.14;
+manpages/docbook.xsl,1.63; manpages/info.xsl,1.18;
+manpages/lists.xsl,1.28 - Michael(tm) Smith</p>
+</li><li class="listitem">
+<p>Changed line-spacing call before
+<a href="http://docbook.org/tdg5/en/html/synopfragment.html"><code class="sgmltag-element">synopfragment</code></a> to use ".sp -1n" ("n" units specified)
+instead of plain ".sp -1"</p>
+<p class="commit-changes">Modified: manpages/synop.xsl,1.28 - Michael(tm)
+Smith</p>
+</li><li class="listitem">
+<p>Added support for writing man
+files into a specific output directory and into appropriate
+subdirectories within that output directory. Controlled through
+the man.<a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/base.dir.html"><em class="parameter"><code>base.dir</code></em></a> parameter (similar to the
+<a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/base.dir.html"><em class="parameter"><code>base.dir</code></em></a> support in the HTML stylesheet) and
+the man.subdirs.enabled parameter, which automatically determines
+the name of an appropriate subdir (for example, man/man7,
+man/man1, etc.) based on the <a href="http://docbook.org/tdg5/en/html/section.html"><code class="sgmltag-element">section</code></a> number/manvolnum
+of the source <a href="http://docbook.org/tdg5/en/html/refentry.html"><code class="sgmltag-element">Refentry</code></a>.</p>
+<p>Closes #1255036 and
+#1170317. Thanks to Denis Bradford for the original feature
+request, and to Costin Stroie for submitting a patch that was
+very helpful in implementing the
+support.</p>
+<p class="commit-changes">Modified: manpages/docbook.xsl,1.62; manpages/utility.xsl,1.13 -
+Michael(tm) Smith</p>
+</li><li class="listitem">
+<p>Refined XPath statements and
+notification messages for <a href="http://docbook.org/tdg5/en/html/refentry.html"><code class="sgmltag-element">refentry</code></a> metadata
+handling.</p>
+<p class="commit-changes">Modified: common/common.xsl,1.59; common/refentry.xsl,1.14;
+manpages/docbook.xsl,1.61; manpages/other.xsl,1.17 - Michael(tm)
+Smith</p>
+</li><li class="listitem">
+<p>Added support for
+<a href="http://docbook.org/tdg5/en/html/copyright.html"><code class="sgmltag-element">copyright</code></a> and <a href="http://docbook.org/tdg5/en/html/legalnotice.html"><code class="sgmltag-element">legalnotice</code></a>. The manpages
+stylesheets now output a <a href="http://docbook.org/tdg5/en/html/copyright.html"><code class="sgmltag-element">COPYRIGHT</code></a> <a href="http://docbook.org/tdg5/en/html/section.html"><code class="sgmltag-element">section</code></a>,
+after the AUTHORS <a href="http://docbook.org/tdg5/en/html/section.html"><code class="sgmltag-element">section</code></a>, if a <a href="http://docbook.org/tdg5/en/html/copyright.html"><code class="sgmltag-element">copyright</code></a>
+or <a href="http://docbook.org/tdg5/en/html/legalnotice.html"><code class="sgmltag-element">legalnotice</code></a> is found in the source. The
+<a href="http://docbook.org/tdg5/en/html/section.html"><code class="sgmltag-element">section</code></a> contains the <a href="http://docbook.org/tdg5/en/html/copyright.html"><code class="sgmltag-element">copyright</code></a> contents followed
+by the <a href="http://docbook.org/tdg5/en/html/legalnotice.html"><code class="sgmltag-element">legalnotice</code></a> contents. Closes
+#1450209.</p>
+<p class="commit-changes">Modified: manpages/docbook.xsl,1.59; manpages/info.xsl,1.17 -
+Michael(tm) Smith</p>
+</li><li class="listitem">
+<p>Drastically reworked all of the
+XPath expressions used in <a href="http://docbook.org/tdg5/en/html/refentry.html"><code class="sgmltag-element">refentry</code></a> metadata gathering
+-- completely removed $parentinfo and turned $info into a set of
+nodes that includes the *info contents of the <a href="http://docbook.org/tdg5/en/html/refentry.html"><code class="sgmltag-element">Refentry</code></a>
+plus the *info contents all all of its ancestor elements. The
+basic XPath expression now used throughout is (using the example
+of checking for a <a href="http://docbook.org/tdg5/en/html/date.html"><code class="sgmltag-element">date</code></a>):</p>
+<p>
+(($info[//date])[last()]/date)[1].</p>
+<p>That selects the "last"
+*info/date <a href="http://docbook.org/tdg5/en/html/date.html"><code class="sgmltag-element">date</code></a> in document order -- that is, the one
+eitther on the <a href="http://docbook.org/tdg5/en/html/refentry.html"><code class="sgmltag-element">Refentry</code></a> itself or on the
+closest ancestor to the <a href="http://docbook.org/tdg5/en/html/refentry.html"><code class="sgmltag-element">Refentry</code></a>.</p>
+<p>It's
+likely this change may break some things; may need to pick up
+some pieces later.</p>
+<p>Also, changed the default value for the
+<a href="http://docbook.sourceforge.net/release/xsl/current/doc/manpages/man.th.extra2.max.length.html"><em class="parameter"><code>man.th.extra2.max.length</code></em></a> from 40 to
+30.</p>
+<p class="commit-changes">Modified: common/common.xsl,1.58; common/refentry.xsl,1.7;
+params/man.th.extra2.max.length.xml,1.2;
+params/refentry.date.profile.xml,1.2;
+params/refentry.manual.profile.xml,1.2;
+params/refentry.source.name.profile.xml,1.2;
+params/refentry.version.profile.xml,1.2; manpages/docbook.xsl,1.58;
+manpages/other.xsl,1.15 - Michael(tm) Smith</p>
+</li><li class="listitem">
+<p>Added support for DocBook 5
+namespace-stripping in manpages stylesheet. Closes request
+#1210692.</p>
+<p class="commit-changes">Modified: common/common.xsl,1.56; manpages/docbook.xsl,1.57 -
+Michael(tm) Smith</p>
+</li><li class="listitem">
+<p>Fixed handling of <a href="http://docbook.org/tdg5/en/html/table.html"><code class="sgmltag-element">table</code></a>
+footnotes. With this checkin, the <a href="http://docbook.org/tdg5/en/html/table.html"><code class="sgmltag-element">table</code></a> support in the
+manpages stylesheet is now basically feature complete. So this
+change closes request #619532, "No support for tables" -- the
+oldest currently open manpages feature request, submitted by Ben
+Secrest (blsecres) on 2002-10-07. Congratulations to me [patting
+myself on the back].</p>
+<p class="commit-changes">Modified: manpages/block.xsl,1.11;
+manpages/docbook.xsl,1.55; manpages/table.xsl,1.15 - Michael(tm)
+Smith</p>
+</li><li class="listitem">
+<p>Added handling for
+<a href="http://docbook.org/tdg5/en/html/table.html"><code class="sgmltag-element">table</code></a> titles. Also fixed handling of nested tables;
+nest tables are now "extracted" and displayed just after their
+parent tables.</p>
+<p class="commit-changes">Modified: manpages/docbook.xsl,1.54; manpages/table.xsl,1.14
+- Michael(tm) Smith</p>
+</li><li class="listitem">
+<p>Added option for turning off bold
+formatting in <a href="http://docbook.org/tdg5/en/html/funcsynopsis.html"><code class="sgmltag-element">Funcsynopsis</code></a>. Boldface formatting in
+<a href="http://docbook.org/tdg5/en/html/function.html"><code class="sgmltag-element">function</code></a> <a href="http://docbook.org/tdg5/en/html/synopsis.html"><code class="sgmltag-element">synopsis</code></a> is mandated in the
+man(7) man page and is used almost universally in existing man
+pages. Despite that, it really does look like crap to have an
+entire <a href="http://docbook.org/tdg5/en/html/funcsynopsis.html"><code class="sgmltag-element">Funcsynopsis</code></a> output in bold, so I added params
+for turning off the bold formatting and/or replacing it with a
+different roff special font (e.g., "RI" for alternating
+roman/italic instead of the default "BI" for alternating
+bold/italic). The new params
+are "man.<a href="http://docbook.org/tdg5/en/html/funcprototype.html"><code class="sgmltag-element">funcprototype</code></a>.font" and
+"man.<a href="http://docbook.org/tdg5/en/html/funcsynopsisinfo.html"><code class="sgmltag-element">funcsynopsisinfo</code></a>.font". To be documented
+later.</p>
+<p>Closes #1452247. Thanks to Joe Orton for the feature
+request.</p>
+<p class="commit-changes">Modified: params/man.string.subst.map.xml,1.16;
+manpages/block.xsl,1.10; manpages/docbook.xsl,1.51;
+manpages/inline.xsl,1.16; manpages/synop.xsl,1.27 - Michael(tm)
+Smith</p>
+</li><li class="listitem">
+<p>Use AUTHORS instead of
+<a href="http://docbook.org/tdg5/en/html/author.html"><code class="sgmltag-element">AUTHOR</code></a> if we have multiple people to attribute. Also,
+fixed checking such that we generate
+<a href="http://docbook.org/tdg5/en/html/author.html"><code class="sgmltag-element">author</code></a> <a href="http://docbook.org/tdg5/en/html/section.html"><code class="sgmltag-element">section</code></a> even if we don't have an
+<a href="http://docbook.org/tdg5/en/html/author.html"><code class="sgmltag-element">author</code></a> (as long as there is at least one other
+person/entity we can put in the
+<a href="http://docbook.org/tdg5/en/html/section.html"><code class="sgmltag-element">section</code></a>). Also adjusted assembly of content for
+<a href="http://docbook.org/tdg5/en/html/author.html"><code class="sgmltag-element">Author</code></a> metainfo field such that we now not only use
+<a href="http://docbook.org/tdg5/en/html/author.html"><code class="sgmltag-element">author</code></a>, but try to find a "best match" if we can't
+find an <a href="http://docbook.org/tdg5/en/html/author.html"><code class="sgmltag-element">author</code></a> name to put there.</p>
+<p>Closes
+#1233592. Thanks to Sam Steingold for the
+request.</p>
+<p class="commit-changes">Modified: manpages/info.xsl,1.12 - Michael(tm)
+Smith</p>
+</li><li class="listitem">
+<p>Changes for request #1243027,
+"Impove handling of <a href="http://docbook.org/tdg5/en/html/author.html"><code class="sgmltag-element">AUTHOR</code></a> <a href="http://docbook.org/tdg5/en/html/section.html"><code class="sgmltag-element">section</code></a>." This
+adds support for <a href="http://docbook.org/tdg5/en/html/collab.html"><code class="sgmltag-element">Collab</code></a>, Corpauthor, Corpcredt,
+<a href="http://docbook.org/tdg5/en/html/orgname.html"><code class="sgmltag-element">Orgname</code></a>, <a href="http://docbook.org/tdg5/en/html/publishername.html"><code class="sgmltag-element">Publishername</code></a>, and
+<a href="http://docbook.org/tdg5/en/html/publisher.html"><code class="sgmltag-element">Publisher</code></a>. Also adds support for output
+of <a href="http://docbook.org/tdg5/en/html/affiliation.html"><code class="sgmltag-element">Affiliation</code></a> and its children, and support for using
+gentext strings for auto-attributing roles (<a href="http://docbook.org/tdg5/en/html/author.html"><code class="sgmltag-element">Author</code></a>,
+<a href="http://docbook.org/tdg5/en/html/editor.html"><code class="sgmltag-element">Editor</code></a>, <a href="http://docbook.org/tdg5/en/html/publisher.html"><code class="sgmltag-element">Publisher</code></a>, Translator, etc.). Also
+did a lot of code cleanup and modularization of all the
+<a href="http://docbook.org/tdg5/en/html/author.html"><code class="sgmltag-element">AUTHOR</code></a> handling code. And fixed a bug that was causing
+<a href="http://docbook.org/tdg5/en/html/author.html"><code class="sgmltag-element">Author</code></a> <a href="http://docbook.org/tdg5/en/html/info.html"><code class="sgmltag-element">info</code></a> to not be picked up correctly
+for metainfo comment we embed in man-page
+source.</p>
+<p class="commit-changes">Modified: manpages/info.xsl,1.11 - Michael(tm)
+Smith</p>
+</li><li class="listitem">
+<p>Support bold output for
+"<a href="http://docbook.org/tdg5/en/html/emphasis.html"><code class="sgmltag-element">emphasis</code></a> remap='B'". (because Eric Raymond's
+doclifter(1) tool converts groff source marked up with ".B"
+request or "\fB" escapes to DocBook "<a href="http://docbook.org/tdg5/en/html/emphasis.html"><code class="sgmltag-element">emphasis</code></a>
+remap='B'".)</p>
+<p class="commit-changes">Modified: manpages/inline.xsl,1.14 - Michael(tm)
+Smith</p>
+</li><li class="listitem">
+<p>Added support for
+<a href="http://docbook.org/tdg5/en/html/segmentedlist.html"><code class="sgmltag-element">Segmentedlist</code></a>. Details: Output is tabular, with no
+option for "list" type output. Output for <a href="http://docbook.org/tdg5/en/html/segtitle.html"><code class="sgmltag-element">Segtitle</code></a>
+elements can be supressed by
+setting man.<a href="http://docbook.org/tdg5/en/html/segtitle.html"><code class="sgmltag-element">segtitle</code></a>.suppress. If <a href="http://docbook.org/tdg5/en/html/segtitle.html"><code class="sgmltag-element">Segtitle</code></a>
+content is output, it is rendered in italic type (not bold
+because not all terminals support bold and so italic ensures the
+stand out on those terminals). Extra space (.sp line) at end of
+<a href="http://docbook.org/tdg5/en/html/table.html"><code class="sgmltag-element">table</code></a> code ensures that it gets handled correctly in
+the case where its source is the child of a <a href="http://docbook.org/tdg5/en/html/para.html"><code class="sgmltag-element">Para</code></a>.
+Closes feature-request #1400097. Thanks to Daniel Leidert for the
+patch and push, and to Alastair Rankine for filing the original
+feature request.</p>
+<p class="commit-changes">Modified: manpages/lists.xsl,1.23;
+manpages/utility.xsl,1.10 - Michael(tm) Smith</p>
+</li><li class="listitem">
+<p>Improved handling or
+Author/Editor/Othercredit.</p>
+<p>Reworked content of
+(non-visible) comment added at top of each page (metadata
+stuff).</p>
+<p>Added support for generating a
+<a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/manifest.html"><em class="parameter"><code>manifest</code></em></a> file (useful for cleaning up
+after builds, etc.)</p>
+<p class="commit-changes">Modified: manpages/docbook.xsl,1.46;
+manpages/info.xsl,1.9; manpages/other.xsl,1.12;
+manpages/utility.xsl,1.6 - Michael(tm) Smith</p>
+</li><li class="listitem">
+<p>Added two new parameters for
+handling of multi-term
+<a href="http://docbook.org/tdg5/en/html/varlistentry.html"><code class="sgmltag-element">varlistentry</code></a> elements:</p>
+<p><a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/variablelist.term.break.after.html"><em class="parameter"><code>variablelist.term.break.after</code></em></a>:
+When the <a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/variablelist.term.break.after.html"><em class="parameter"><code>variablelist.term.break.after</code></em></a> is
+non-zero, it will generate a line break after each
+<a href="http://docbook.org/tdg5/en/html/term.html"><code class="sgmltag-element">term</code></a> multi-term
+<a href="http://docbook.org/tdg5/en/html/varlistentry.html"><code class="sgmltag-element">varlistentry</code></a>.</p>
+<p><a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/variablelist.term.separator.html"><em class="parameter"><code>variablelist.term.separator</code></em></a>:
+When a <a href="http://docbook.org/tdg5/en/html/varlistentry.html"><code class="sgmltag-element">varlistentry</code></a> contains multiple <a href="http://docbook.org/tdg5/en/html/term.html"><code class="sgmltag-element">term</code></a>
+elements, the string specified in the value of the
+<a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/variablelist.term.separator.html"><em class="parameter"><code>variablelist.term.separator</code></em></a> parameter is
+placed after each <a href="http://docbook.org/tdg5/en/html/term.html"><code class="sgmltag-element">term</code></a> except the last. The default
+is ", " (a comma followed by a space). To suppress rendering of
+the separator, set the value of
+<a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/variablelist.term.separator.html"><em class="parameter"><code>variablelist.term.separator</code></em></a> to the empty
+string ("").</p>
+<p>These parameters are primarily intended to be
+useful if you have multi-term varlistentries that have long
+terms.</p>
+<p>Closes #1306676. Thanks to Sam Steingold for
+providing an example "lots of long terms" doc that demonstrated
+the value of having these options.</p>
+<p>Also, added
+normalize-space() call to processing of each
+<a href="http://docbook.org/tdg5/en/html/term.html"><code class="sgmltag-element">term</code></a>.</p>
+<p>This change affects all output formats
+(HTML, PDF, manpages). The default behavior should pretty much
+remain the same as before, but it is possible (as always) that
+the change may introduce some
+new bugginess.</p>
+<p class="commit-changes">Modified: fo/lists.xsl,1.62; fo/param.ent,1.88;
+fo/param.xweb,1.99; html/lists.xsl,1.48; html/param.ent,1.86;
+html/param.xweb,1.93; manpages/lists.xsl,1.22;
+manpages/param.ent,1.14; manpages/param.xweb,1.16;
+params/variablelist.term.break.after.xml,1.1;
+params/variablelist.term.separator.xml,1.1 - Michael(tm)
+Smith</p>
+</li></ul></div>
+</div>
+
+<div class="sect2" title="Params"><div class="titlepage"><div><div><h3 class="title"><a name="V1700_Params"></a>Params</h3></div></div></div>
+
+<p>The following changes have been made to the
+ <code class="filename">params</code> code
+ since the 1.69.1 release.</p>
+<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
+<p>New parameters to set
+header/footer <a href="http://docbook.org/tdg5/en/html/table.html"><code class="sgmltag-element">table</code></a> minimum
+height.</p>
+<p class="commit-changes">Modified: params/footer.table.height.xml,1.1;
+params/header.table.height.xml,1.1 - Robert
+Stayton</p>
+</li><li class="listitem">
+<p>Support multiple indexing methods
+for different languages.</p>
+<p class="commit-changes">Modified: params/index.method.xml,1.1 - Robert
+Stayton</p>
+</li><li class="listitem">
+<p>Remove <a href="http://docbook.org/tdg5/en/html/qandaset.html"><code class="sgmltag-element">qandaset</code></a> and
+<a href="http://docbook.org/tdg5/en/html/qandadiv.html"><code class="sgmltag-element">qandadiv</code></a> from <a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/generate.toc.html"><em class="parameter"><code>generate.toc</code></em></a> for fo
+output because formerly it wasn't working, but now it is and
+the default behavior should stay the
+same.</p>
+<p class="commit-changes">Modified: params/generate.toc.xml,1.8 - Robert
+Stayton</p>
+</li><li class="listitem">
+<p>add support for page number
+references to <a href="http://docbook.org/tdg5/en/html/link.html"><code class="sgmltag-element">link</code></a> element
+too.</p>
+<p class="commit-changes">Modified: params/insert.link.page.number.xml,1.1 - Robert
+Stayton</p>
+</li><li class="listitem">
+<p>Add support for more characters to
+hyphen on when <a href="http://docbook.sourceforge.net/release/xsl/current/doc/fo/ulink.hyphenate.html"><em class="parameter"><code>ulink.hyphenate</code></em></a> is turned
+on.</p>
+<p class="commit-changes">Modified: params/ulink.hyphenate.chars.xml,1.1;
+params/ulink.hyphenate.xml,1.3 - Robert Stayton</p>
+</li><li class="listitem">
+<p>New attribute-set to format
+<a href="http://docbook.org/tdg5/en/html/biblioentry.html"><code class="sgmltag-element">biblioentry</code></a> and
+<a href="http://docbook.org/tdg5/en/html/bibliomixed.html"><code class="sgmltag-element">bibliomixed</code></a>.</p>
+<p class="commit-changes">Modified: params/biblioentry.properties.xml,1.1 -
+Robert Stayton</p>
+</li><li class="listitem">
+<p>Added new parameter
+<a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/chunk.tocs.and.lots.html"><em class="parameter"><code>chunk.tocs.and.lots</code></em></a>.has.<a href="http://docbook.org/tdg5/en/html/title.html"><code class="sgmltag-element">title</code></a> which
+controls presence of <a href="http://docbook.org/tdg5/en/html/title.html"><code class="sgmltag-element">title</code></a> in a separate chunk with
+ToC/LoT. Disabling <a href="http://docbook.org/tdg5/en/html/title.html"><code class="sgmltag-element">title</code></a> can be very useful if you are
+generating frameset output (well, yes those frames, but some customers
+really want them ;-).</p>
+<p class="commit-changes">Modified: html/chunk-code.xsl,1.15;
+html/param.ent,1.93; html/param.xweb,1.102;
+params/chunk.tocs.and.lots.has.title.xml,1.1 - Jirka
+Kosek</p>
+</li><li class="listitem">
+<p>Added new attribute set
+<a href="http://docbook.org/tdg5/en/html/toc.html"><code class="sgmltag-element">toc</code></a>.line.properties for controlling appearance of lines in
+ToC/LoT</p>
+<p class="commit-changes">Modified: params/toc.line.properties.xml,1.1 - Jirka
+Kosek</p>
+</li><li class="listitem">
+<p>Allow <a href="http://docbook.org/tdg5/en/html/table.html"><code class="sgmltag-element">table</code></a> footnotes
+to have different properties from regular
+footnotes.</p>
+<p class="commit-changes">Modified: params/table.footnote.properties.xml,1.1 - Robert
+Stayton</p>
+</li><li class="listitem">
+<p>Set properties for pgwide="1"
+objects.</p>
+<p class="commit-changes">Modified: params/pgwide.properties.xml,1.1 - Robert
+Stayton</p>
+</li><li class="listitem">
+<p>Added the
+autotoc.<a href="http://docbook.org/tdg5/en/html/label.html"><code class="sgmltag-element">label</code></a>.in.hyperlink param.</p>
+<p>If the value
+of autotoc.<a href="http://docbook.org/tdg5/en/html/label.html"><code class="sgmltag-element">label</code></a>.in.hyperlink is non-zero, labels
+are included in hyperlinked titles in the <a href="http://docbook.org/tdg5/en/html/toc.html"><code class="sgmltag-element">TOC</code></a>. If it
+is instead zero, labels are still displayed prior to the
+hyperlinked titles, but are not hyperlinked along with the
+titles.</p>
+<p>Closes patch #1065868. Thanks to anatoly techtonik
+for the patch.</p>
+<p class="commit-changes">Modified: html/autotoc.xsl,1.36; html/param.ent,1.92;
+html/param.xweb,1.101; params/autotoc.label.in.hyperlink.xml,1.1 -
+Michael(tm) Smith</p>
+</li><li class="listitem">
+<p>Added two new params:
+html.head.<a href="http://docbook.org/tdg5/en/html/legalnotice.html"><code class="sgmltag-element">legalnotice</code></a>.<a href="http://docbook.org/tdg5/en/html/link.html"><code class="sgmltag-element">link</code></a>.types
+and html.head.<a href="http://docbook.org/tdg5/en/html/legalnotice.html"><code class="sgmltag-element">legalnotice</code></a>.<a href="http://docbook.org/tdg5/en/html/link.html"><code class="sgmltag-element">link</code></a>.multiple.</p>
+<p>If
+the value of the <a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/generate.legalnotice.link.html"><em class="parameter"><code>generate.legalnotice.link</code></em></a> is
+non-zero, then the stylesheet generates (in the head
+<a href="http://docbook.org/tdg5/en/html/section.html"><code class="sgmltag-element">section</code></a> of the HTML source) either a single HTML
+<a href="http://docbook.org/tdg5/en/html/link.html"><code class="sgmltag-element">link</code></a> element or, if the value of
+the html.head.<a href="http://docbook.org/tdg5/en/html/legalnotice.html"><code class="sgmltag-element">legalnotice</code></a>.<a href="http://docbook.org/tdg5/en/html/link.html"><code class="sgmltag-element">link</code></a>.multiple is
+non-zero, one <a href="http://docbook.org/tdg5/en/html/link.html"><code class="sgmltag-element">link</code></a> element for each <a href="http://docbook.org/tdg5/en/html/link.html"><code class="sgmltag-element">link</code></a>
+type specified. Each <a href="http://docbook.org/tdg5/en/html/link.html"><code class="sgmltag-element">link</code></a> has the
+following attributes:</p>
+<p> - a rel attribute whose value
+is derived from the value of
+html.head.<a href="http://docbook.org/tdg5/en/html/legalnotice.html"><code class="sgmltag-element">legalnotice</code></a>.<a href="http://docbook.org/tdg5/en/html/link.html"><code class="sgmltag-element">link</code></a>.types</p>
+<p> -
+an href attribute whose value is set to the URL of the file
+containing the <a href="http://docbook.org/tdg5/en/html/legalnotice.html"><code class="sgmltag-element">legalnotice</code></a></p>
+<p> - a <a href="http://docbook.org/tdg5/en/html/title.html"><code class="sgmltag-element">title</code></a>
+attribute whose value is set to the <a href="http://docbook.org/tdg5/en/html/title.html"><code class="sgmltag-element">title</code></a> of the
+corresponding <a href="http://docbook.org/tdg5/en/html/legalnotice.html"><code class="sgmltag-element">legalnotice</code></a> (or a <a href="http://docbook.org/tdg5/en/html/title.html"><code class="sgmltag-element">title</code></a>
+programatically determined by the stylesheet)</p>
+<p>For
+example:</p>
+<p> &lt;<a href="http://docbook.org/tdg5/en/html/link.html"><code class="sgmltag-element">link</code></a> rel="<a href="http://docbook.org/tdg5/en/html/copyright.html"><code class="sgmltag-element">copyright</code></a>"
+href="ln-id2524073.html" title="Legal Notice"&gt;</p>
+<p>Closes
+#1476450. Thanks to Sam Steingold.</p>
+<p class="commit-changes">Modified: html/chunk-common.xsl,1.45;
+html/param.ent,1.91; html/param.xweb,1.100;
+params/generate.legalnotice.link.xml,1.4;
+params/html.head.legalnotice.link.multiple.xml,1.1;
+params/html.head.legalnotice.link.types.xml,1.1 - Michael(tm)
+Smith</p>
+</li><li class="listitem">
+<p>Added the following
+params:</p>
+<p> - man.indent.width (string-valued) -
+man.indent.refsect (boolean) - man.indent.blurbs (boolean)
+- man.indent.lists (boolean) - man.indent.verbatims
+(boolean)</p>
+<p>Note that in earlier snapshots, man.indent.width
+was named man.indentation.default.value and the boolean params
+had names like man.indentation.*.adjust. Also the
+man.indent.blurbs param was called man.indentation.authors.adjust
+(or something).</p>
+<p>The behavior now is: If the value of a
+particular man.indent.* boolean param is non-zero, the
+corresponding contents (refsect*, list items,
+authorblurb/personblurb, vervatims) are displayed with a left
+margin indented by a width equal to the value
+of man.indent.width.</p>
+<p class="commit-changes">Modified: params/man.indent.blurbs.xml,1.1;
+manpages/docbook.xsl,1.74; manpages/info.xsl,1.20;
+manpages/lists.xsl,1.30; manpages/other.xsl,1.20;
+manpages/param.ent,1.22; manpages/param.xweb,1.24;
+manpages/refentry.xsl,1.14; params/man.indent.lists.xml,1.1;
+params/man.indent.refsect.xml,1.1;
+params/man.indent.verbatims.xml,1.1; params/man.indent.width.xml,1.1 -
+Michael(tm) Smith</p>
+</li><li class="listitem">
+<p>Added
+man.<a href="http://docbook.org/tdg5/en/html/table.html"><code class="sgmltag-element">table</code></a>.footnotes.divider param.</p>
+<p>In each
+<a href="http://docbook.org/tdg5/en/html/table.html"><code class="sgmltag-element">table</code></a> that contains footenotes, the string specified
+by the man.<a href="http://docbook.org/tdg5/en/html/table.html"><code class="sgmltag-element">table</code></a>.footnotes.divider parameter is output
+before the list of footnotes for the
+<a href="http://docbook.org/tdg5/en/html/table.html"><code class="sgmltag-element">table</code></a>.</p>
+<p class="commit-changes">Modified: manpages/docbook.xsl,1.73;
+manpages/links.xsl,1.6; manpages/param.ent,1.21;
+manpages/param.xweb,1.23; params/man.table.footnotes.divider.xml,1.1 -
+Michael(tm) Smith</p>
+</li><li class="listitem">
+<p>Added the
+man.output.in.separate.dir,
+man.output.<a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/base.dir.html"><em class="parameter"><code>base.dir</code></em></a>,
+and man.output.subdirs.enabled parameters.</p>
+<p>The
+man.output.<a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/base.dir.html"><em class="parameter"><code>base.dir</code></em></a> parameter specifies the
+base directory into which man-page files are
+output. The man.output.subdirs.enabled parameter controls whether
+the files are output in subdirectories within the base
+directory.</p>
+<p>The values of the
+man.output.<a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/base.dir.html"><em class="parameter"><code>base.dir</code></em></a>
+and man.output.subdirs.enabled parameters are used only if the
+value of man.output.in.separate.dir parameter is non-zero. If the
+value of man.output.in.separate.dir is zero, man-page files are
+not output in a separate
+directory.</p>
+<p class="commit-changes">Modified: manpages/docbook.xsl,1.72; manpages/param.ent,1.20;
+manpages/param.xweb,1.22; params/man.output.base.dir.xml,1.1;
+params/man.output.in.separate.dir.xml,1.1;
+params/man.output.subdirs.enabled.xml,1.1 - Michael(tm)
+Smith</p>
+</li><li class="listitem">
+<p>Added
+man.font.<a href="http://docbook.org/tdg5/en/html/table.html"><code class="sgmltag-element">table</code></a>.headings and
+man.font.<a href="http://docbook.org/tdg5/en/html/table.html"><code class="sgmltag-element">table</code></a>.<a href="http://docbook.org/tdg5/en/html/title.html"><code class="sgmltag-element">title</code></a> params, for
+controlling font in <a href="http://docbook.org/tdg5/en/html/table.html"><code class="sgmltag-element">table</code></a> headings and
+titles.</p>
+<p class="commit-changes">Modified: manpages/docbook.xsl,1.71; manpages/param.ent,1.19;
+manpages/param.xweb,1.21; params/man.font.table.headings.xml,1.1;
+params/man.font.table.title.xml,1.1 - Michael(tm)
+Smith</p>
+</li><li class="listitem">
+<p>Added
+man.font.<a href="http://docbook.org/tdg5/en/html/funcsynopsisinfo.html"><code class="sgmltag-element">funcsynopsisinfo</code></a> and
+man.font.<a href="http://docbook.org/tdg5/en/html/funcprototype.html"><code class="sgmltag-element">funcprototype</code></a> params, for specifying the roff
+font (for example, BI, B, I) for <a href="http://docbook.org/tdg5/en/html/funcsynopsisinfo.html"><code class="sgmltag-element">funcsynopsisinfo</code></a> and
+<a href="http://docbook.org/tdg5/en/html/funcprototype.html"><code class="sgmltag-element">funcprototype</code></a> output.</p>
+<p class="commit-changes">Modified: manpages/block.xsl,1.19;
+manpages/docbook.xsl,1.69; manpages/param.ent,1.18;
+manpages/param.xweb,1.20; manpages/synop.xsl,1.29;
+manpages/table.xsl,1.21; params/man.font.funcprototype.xml,1.1;
+params/man.font.funcsynopsisinfo.xml,1.1 - Michael(tm)
+Smith</p>
+</li><li class="listitem">
+<p>Changed to select="0" in
+<a href="http://docbook.org/tdg5/en/html/refclass.html"><code class="sgmltag-element">refclass</code></a>.suppress (instead of
+..&gt;0&lt;/..)</p>
+<p class="commit-changes">Modified: params/refclass.suppress.xml,1.3 - Michael(tm)
+Smith</p>
+</li><li class="listitem">
+<p>Added
+man.<a href="http://docbook.org/tdg5/en/html/segtitle.html"><code class="sgmltag-element">segtitle</code></a>.suppress param.</p>
+<p>If the value of
+man.<a href="http://docbook.org/tdg5/en/html/segtitle.html"><code class="sgmltag-element">segtitle</code></a>.suppress is non-zero, then display
+of <a href="http://docbook.org/tdg5/en/html/segtitle.html"><code class="sgmltag-element">segtitle</code></a> contents is suppressed in
+output.</p>
+<p class="commit-changes">Modified: manpages/docbook.xsl,1.68; manpages/param.ent,1.17;
+manpages/param.xweb,1.19; params/man.segtitle.suppress.xml,1.1 -
+Michael(tm) Smith</p>
+</li><li class="listitem">
+<p>Added
+man.output.<a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/manifest.html"><em class="parameter"><code>manifest</code></em></a>.enabled and
+man.output.manifest.<a href="http://docbook.org/tdg5/en/html/filename.html"><code class="sgmltag-element">filename</code></a> params.</p>
+<p>If
+man.output.<a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/manifest.html"><em class="parameter"><code>manifest</code></em></a>.enabled is non-zero, a list
+of filenames for man pages generated by the stylesheet
+transformation is written to the file named by
+man.output.<a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/manifest.html"><em class="parameter"><code>manifest</code></em></a>.<a href="http://docbook.org/tdg5/en/html/filename.html"><code class="sgmltag-element">filename</code></a></p>
+<p class="commit-changes">Modified: manpages/docbook.xsl,1.67;
+manpages/other.xsl,1.19; manpages/param.ent,1.16;
+manpages/param.xweb,1.18; params/man.output.manifest.enabled.xml,1.1;
+params/man.output.manifest.filename.xml,1.1;
+tools/make/Makefile.DocBook,1.4 - Michael(tm)
+Smith</p>
+</li><li class="listitem">
+<p>Added <a href="http://docbook.org/tdg5/en/html/refclass.html"><code class="sgmltag-element">refclass</code></a>.suppress
+param.</p>
+<p>If the value of <a href="http://docbook.org/tdg5/en/html/refclass.html"><code class="sgmltag-element">refclass</code></a>.suppress is
+non-zero, then display <a href="http://docbook.org/tdg5/en/html/refclass.html"><code class="sgmltag-element">refclass</code></a> contents is suppressed
+in output. Affects HTML and FO output
+only.</p>
+<p class="commit-changes">Modified: fo/param.ent,1.93; fo/param.xweb,1.106; html/param.ent,1.90;
+html/param.xweb,1.99; params/refclass.suppress.xml,1.1 - Michael(tm)
+Smith</p>
+</li><li class="listitem">
+<p>Added
+<a href="http://docbook.org/tdg5/en/html/refentry.html"><code class="sgmltag-element">refentry</code></a>.meta.get.quietly param.</p>
+<p>If zero (the
+default), notes and warnings about "missing" markup are generated
+during gathering of <a href="http://docbook.org/tdg5/en/html/refentry.html"><code class="sgmltag-element">refentry</code></a> metadata. If
+non-zero, the metadata is gathered "quietly" -- that is, the
+notes and warnings are suppressed.</p>
+<p>NOTE: If you are
+processing a large amount of <a href="http://docbook.org/tdg5/en/html/refentry.html"><code class="sgmltag-element">refentry</code></a> content, you
+may be able to speed up processing significantly by setting a
+non-zero value for
+<a href="http://docbook.org/tdg5/en/html/refentry.html"><code class="sgmltag-element">refentry</code></a>.meta.get.quietly.</p>
+<p class="commit-changes">Modified: common/refentry.xsl,1.17;
+manpages/param.ent,1.15; manpages/param.xweb,1.17;
+params/refentry.meta.get.quietly.xml,1.1 - Michael(tm)
+Smith</p>
+</li><li class="listitem">
+<p>Added support for "software" and
+"sectdesc" class values on <a href="http://docbook.org/tdg5/en/html/refmiscinfo.html"><code class="sgmltag-element">refmiscinfo</code></a>; "software" is
+treated identically to "source", and "setdesc" is treated
+identically to "manual".</p>
+<p class="commit-changes">Modified: common/refentry.xsl,1.10;
+params/man.th.extra2.max.length.xml,1.3;
+params/refentry.source.name.profile.xml,1.4 - Michael(tm)
+Smith</p>
+</li><li class="listitem">
+<p>Drastically reworked all of the
+XPath expressions used in <a href="http://docbook.org/tdg5/en/html/refentry.html"><code class="sgmltag-element">refentry</code></a> metadata gathering
+-- completely removed $parentinfo and turned $info into a set of
+nodes that includes the *info contents of the <a href="http://docbook.org/tdg5/en/html/refentry.html"><code class="sgmltag-element">Refentry</code></a>
+plus the *info contents all all of its ancestor elements. The
+basic XPath expression now used throughout is (using the example
+of checking for a <a href="http://docbook.org/tdg5/en/html/date.html"><code class="sgmltag-element">date</code></a>):</p>
+<p>
+(($info[//date])[last()]/date)[1].</p>
+<p>That selects the "last"
+*info/date <a href="http://docbook.org/tdg5/en/html/date.html"><code class="sgmltag-element">date</code></a> in document order -- that is, the one
+eitther on the <a href="http://docbook.org/tdg5/en/html/refentry.html"><code class="sgmltag-element">Refentry</code></a> itself or on the
+closest ancestor to the <a href="http://docbook.org/tdg5/en/html/refentry.html"><code class="sgmltag-element">Refentry</code></a>.</p>
+<p>It's
+likely this change may break some things; may need to pick up
+some pieces later.</p>
+<p>Also, changed the default value for the
+<a href="http://docbook.sourceforge.net/release/xsl/current/doc/manpages/man.th.extra2.max.length.html"><em class="parameter"><code>man.th.extra2.max.length</code></em></a> from 40 to
+30.</p>
+<p class="commit-changes">Modified: common/common.xsl,1.58; common/refentry.xsl,1.7;
+params/man.th.extra2.max.length.xml,1.2;
+params/refentry.date.profile.xml,1.2;
+params/refentry.manual.profile.xml,1.2;
+params/refentry.source.name.profile.xml,1.2;
+params/refentry.version.profile.xml,1.2; manpages/docbook.xsl,1.58;
+manpages/other.xsl,1.15 - Michael(tm) Smith</p>
+</li><li class="listitem">
+<p>Added option for turning off bold
+formatting in <a href="http://docbook.org/tdg5/en/html/funcsynopsis.html"><code class="sgmltag-element">Funcsynopsis</code></a>. Boldface formatting in
+<a href="http://docbook.org/tdg5/en/html/function.html"><code class="sgmltag-element">function</code></a> <a href="http://docbook.org/tdg5/en/html/synopsis.html"><code class="sgmltag-element">synopsis</code></a> is mandated in the
+man(7) man page and is used almost universally in existing man
+pages. Despite that, it really does look like crap to have an
+entire <a href="http://docbook.org/tdg5/en/html/funcsynopsis.html"><code class="sgmltag-element">Funcsynopsis</code></a> output in bold, so I added params
+for turning off the bold formatting and/or replacing it with a
+different roff special font (e.g., "RI" for alternating
+roman/italic instead of the default "BI" for alternating
+bold/italic). The new params
+are "man.<a href="http://docbook.org/tdg5/en/html/funcprototype.html"><code class="sgmltag-element">funcprototype</code></a>.font" and
+"man.<a href="http://docbook.org/tdg5/en/html/funcsynopsisinfo.html"><code class="sgmltag-element">funcsynopsisinfo</code></a>.font". To be documented
+later.</p>
+<p>Closes #1452247. Thanks to Joe Orton for the feature
+request.</p>
+<p class="commit-changes">Modified: params/man.string.subst.map.xml,1.16;
+manpages/block.xsl,1.10; manpages/docbook.xsl,1.51;
+manpages/inline.xsl,1.16; manpages/synop.xsl,1.27 - Michael(tm)
+Smith</p>
+</li><li class="listitem">
+<p><a href="http://docbook.sourceforge.net/release/xsl/current/doc/fo/fop.extensions.html"><em class="parameter"><code>fop.extensions</code></em></a> now only
+for FOP version 0.20.5 and earlier.</p>
+<p class="commit-changes">Modified: params/fop.extensions.xml,1.4
+- Robert Stayton</p>
+</li><li class="listitem">
+<p>Support for fop1 different from
+fop 0.20.5 and earlier.</p>
+<p class="commit-changes">Modified: params/fop1.extensions.xml,1.1 - Robert
+Stayton</p>
+</li><li class="listitem">
+<p>Reset default value to empty
+string so template uses gentext first, then the parameter value
+if not empty.</p>
+<p class="commit-changes">Modified: params/index.number.separator.xml,1.2;
+params/index.range.separator.xml,1.2;
+params/index.term.separator.xml,1.2 - Robert
+Stayton</p>
+</li><li class="listitem">
+<p>New parameter:
+<a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/id.warnings.html"><em class="parameter"><code>id.warnings</code></em></a>. If non-zero, warnings are
+generated for titled objects that don't have titles. True by default;
+I wonder if this will be too aggressive?</p>
+<p class="commit-changes">Modified: html/biblio.xsl,1.25;
+html/component.xsl,1.27; html/division.xsl,1.11; html/formal.xsl,1.19;
+html/glossary.xsl,1.20; html/html.xsl,1.13; html/index.xsl,1.16;
+html/param.ent,1.88; html/param.xweb,1.97; html/refentry.xsl,1.22;
+html/sections.xsl,1.30; params/id.warnings.xml,1.1 - Norman
+Walsh</p>
+</li><li class="listitem">
+<p>Added new parameter
+<a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/keep.relative.image.uris.html"><em class="parameter"><code>keep.relative.image.uris</code></em></a></p>
+<p class="commit-changes">Modified: fo/param.ent,1.91;
+fo/param.xweb,1.104; html/param.ent,1.87; html/param.xweb,1.96;
+params/keep.relative.image.uris.xml,1.1 - Norman
+Walsh</p>
+</li><li class="listitem">
+<p>Support default <a href="http://docbook.org/tdg5/en/html/label.html"><code class="sgmltag-element">label</code></a>
+width parameters for itemized and ordered lists</p>
+<p class="commit-changes">Modified: fo/lists.xsl,1.64;
+fo/param.ent,1.90; fo/param.xweb,1.103;
+params/itemizedlist.label.width.xml,1.1;
+params/orderedlist.label.width.xml,1.1 - Norman
+Walsh</p>
+</li><li class="listitem">
+<p>Added parameters to localize
+punctuation in indexes.</p>
+<p class="commit-changes">Modified: params/index.number.separator.xml,1.1;
+params/index.range.separator.xml,1.1;
+params/index.term.separator.xml,1.1 - Robert
+Stayton</p>
+</li><li class="listitem">
+<p>Added two new parameters for
+handling of multi-term
+<a href="http://docbook.org/tdg5/en/html/varlistentry.html"><code class="sgmltag-element">varlistentry</code></a> elements:</p>
+<p><a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/variablelist.term.break.after.html"><em class="parameter"><code>variablelist.term.break.after</code></em></a>:
+When the <a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/variablelist.term.break.after.html"><em class="parameter"><code>variablelist.term.break.after</code></em></a> is
+non-zero, it will generate a line break after each
+<a href="http://docbook.org/tdg5/en/html/term.html"><code class="sgmltag-element">term</code></a> multi-term
+<a href="http://docbook.org/tdg5/en/html/varlistentry.html"><code class="sgmltag-element">varlistentry</code></a>.</p>
+<p><a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/variablelist.term.separator.html"><em class="parameter"><code>variablelist.term.separator</code></em></a>:
+When a <a href="http://docbook.org/tdg5/en/html/varlistentry.html"><code class="sgmltag-element">varlistentry</code></a> contains multiple <a href="http://docbook.org/tdg5/en/html/term.html"><code class="sgmltag-element">term</code></a>
+elements, the string specified in the value of the
+<a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/variablelist.term.separator.html"><em class="parameter"><code>variablelist.term.separator</code></em></a> parameter is
+placed after each <a href="http://docbook.org/tdg5/en/html/term.html"><code class="sgmltag-element">term</code></a> except the last. The default
+is ", " (a comma followed by a space). To suppress rendering of
+the separator, set the value of
+<a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/variablelist.term.separator.html"><em class="parameter"><code>variablelist.term.separator</code></em></a> to the empty
+string ("").</p>
+<p>These parameters are primarily intended to be
+useful if you have multi-term varlistentries that have long
+terms.</p>
+<p>Closes #1306676. Thanks to Sam Steingold for
+providing an example "lots of long terms" doc that demonstrated
+the value of having these options.</p>
+<p>Also, added
+normalize-space() call to processing of each
+<a href="http://docbook.org/tdg5/en/html/term.html"><code class="sgmltag-element">term</code></a>.</p>
+<p>This change affects all output formats
+(HTML, PDF, manpages). The default behavior should pretty much
+remain the same as before, but it is possible (as always) that
+the change may introduce some
+new bugginess.</p>
+<p class="commit-changes">Modified: fo/lists.xsl,1.62; fo/param.ent,1.88;
+fo/param.xweb,1.99; html/lists.xsl,1.48; html/param.ent,1.86;
+html/param.xweb,1.93; manpages/lists.xsl,1.22;
+manpages/param.ent,1.14; manpages/param.xweb,1.16;
+params/variablelist.term.break.after.xml,1.1;
+params/variablelist.term.separator.xml,1.1 - Michael(tm)
+Smith</p>
+</li><li class="listitem">
+<p>Convert 'no' to string in default
+value.</p>
+<p class="commit-changes">Modified: params/olink.doctitle.xml,1.4 - Robert
+Stayton</p>
+</li><li class="listitem">
+<p>Implemented RFE
+#1292615.</p>
+<p>Added bunch of new parameters (attribute sets)
+that affect list presentation: list.block.properties,
+<a href="http://docbook.org/tdg5/en/html/itemizedlist.html"><code class="sgmltag-element">itemizedlist</code></a>.properties, <a href="http://docbook.org/tdg5/en/html/orderedlist.html"><code class="sgmltag-element">orderedlist</code></a>.properties,
+<a href="http://docbook.org/tdg5/en/html/itemizedlist.html"><code class="sgmltag-element">itemizedlist</code></a>.<a href="http://docbook.org/tdg5/en/html/label.html"><code class="sgmltag-element">label</code></a>.properties and
+<a href="http://docbook.org/tdg5/en/html/orderedlist.html"><code class="sgmltag-element">orderedlist</code></a>.<a href="http://docbook.org/tdg5/en/html/label.html"><code class="sgmltag-element">label</code></a>.properties. Default behaviour
+of stylesheets has not been changed but further customizations will be
+much more easier.</p>
+<p class="commit-changes">Modified: fo/lists.xsl,1.61; fo/param.ent,1.87;
+fo/param.xweb,1.98; params/itemizedlist.label.properties.xml,1.1;
+params/itemizedlist.properties.xml,1.1;
+params/list.block.properties.xml,1.1;
+params/orderedlist.label.properties.xml,1.1;
+params/orderedlist.properties.xml,1.1 - Jirka
+Kosek</p>
+</li><li class="listitem">
+<p>Implemented RFE
+#1242092.</p>
+<p>You can enable crop marks in your document by
+setting crop.marks=1 and xep.extensions=1. Appearance of crop
+marks can be controlled by parameters
+<a href="http://docbook.sourceforge.net/release/xsl/current/doc/fo/crop.mark.bleed.html"><em class="parameter"><code>crop.mark.bleed</code></em></a> (6pt),
+<a href="http://docbook.sourceforge.net/release/xsl/current/doc/fo/crop.mark.offset.html"><em class="parameter"><code>crop.mark.offset</code></em></a> (24pt) and
+<a href="http://docbook.sourceforge.net/release/xsl/current/doc/fo/crop.mark.width.html"><em class="parameter"><code>crop.mark.width</code></em></a> (0.5pt).</p>
+<p>Also there
+is new named template called user-xep-pis. You can overwrite it in
+order to produce some PIs that can control XEP as described in
+http://www.renderx.com/reference.html#Output_Formats</p>
+<p class="commit-changes">Modified: fo/docbook.xsl,1.36;
+fo/param.ent,1.86; fo/param.xweb,1.97; fo/xep.xsl,1.23;
+params/crop.mark.bleed.xml,1.1; params/crop.mark.offset.xml,1.1;
+params/crop.mark.width.xml,1.1; params/crop.marks.xml,1.1 - Jirka
+Kosek</p>
+</li><li class="listitem">
+<p>Changed short descriptions in doc
+for *autolabel* params to match new autolabel
+behavior.</p>
+<p class="commit-changes">Modified: params/appendix.autolabel.xml,1.5;
+params/chapter.autolabel.xml,1.4; params/part.autolabel.xml,1.5;
+params/preface.autolabel.xml,1.4 - Michael(tm)
+Smith</p>
+</li></ul></div>
+</div>
+
+<div class="sect2" title="Profiling"><div class="titlepage"><div><div><h3 class="title"><a name="V1700_Profiling"></a>Profiling</h3></div></div></div>
+
+<p>The following changes have been made to the
+ <code class="filename">profiling</code> code
+ since the 1.69.1 release.</p>
+<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
+<p>Profiling now works together with
+namespace stripping (V5 documents). Namespace striping should work
+with all stylesheets named profile-, even if they are not supporting
+namespace stripping in a non-profiling
+variant.</p>
+<p class="commit-changes">Modified: profiling/profile-mode.xsl,1.4;
+profiling/xsl2profile.xsl,1.7 - Jirka Kosek</p>
+</li><li class="listitem">
+<p>Moved profiling stage out of
+templates. This make possible to reuse profiled content by several
+templates and still maintaing node indentity (needed for example for
+HTML Help where content is processed multiple times).</p>
+<p>I
+don't know why this was not on the top level before. Maybe some XSLT
+processors choked on it. I hope this will be OK
+now.</p>
+<p class="commit-changes">Modified: profiling/xsl2profile.xsl,1.5 - Jirka
+Kosek</p>
+</li></ul></div>
+</div>
+
+<div class="sect2" title="Tools"><div class="titlepage"><div><div><h3 class="title"><a name="V1700_Tools"></a>Tools</h3></div></div></div>
+
+<p>The following changes have been made to the
+ <code class="filename">tools</code> code
+ since the 1.69.1 release.</p>
+<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
+<p>Moved Makefile.DocBook from
+<a href="http://docbook.org/tdg5/en/html/contrib.html"><code class="sgmltag-element">contrib</code></a> module to xsl
+module.</p>
+<p class="commit-changes">Modified: tools/make/Makefile.DocBook,1.1 - Michael(tm)
+Smith</p>
+</li></ul></div>
+</div>
+
+<div class="sect2" title="WordML"><div class="titlepage"><div><div><h3 class="title"><a name="V1700_WordML"></a>WordML</h3></div></div></div>
+
+<p>The following changes have been made to the
+ <code class="filename">wordml</code> code
+ since the 1.69.1 release.</p>
+<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
+<p>added <a href="http://docbook.org/tdg5/en/html/contrib.html"><code class="sgmltag-element">contrib</code></a> element,
+better handling of default paragraph
+style</p>
+<p class="commit-changes">Modified: wordml/pages-normalise.xsl,1.6; wordml/supported.xml,1.2;
+wordml/wordml-final.xsl,1.14 - Steve Ball</p>
+</li><li class="listitem">
+<p>added
+<a href="http://docbook.org/tdg5/en/html/bridgehead.html"><code class="sgmltag-element">bridgehead</code></a></p>
+<p class="commit-changes">Modified: wordml/docbook-pages.xsl,1.6;
+wordml/docbook.xsl,1.17; wordml/pages-normalise.xsl,1.5;
+wordml/template-pages.xml,1.7; wordml/template.dot,1.4;
+wordml/template.xml,1.14; wordml/wordml-final.xsl,1.13 - Steve
+Ball</p>
+</li><li class="listitem">
+<p>added blocks stylesheet to support
+bibliographies, glossaries and qandasets</p>
+<p class="commit-changes">Modified: wordml/Makefile,1.4;
+wordml/README,1.3; wordml/blocks-spec.xml,1.1;
+wordml/docbook-pages.xsl,1.5; wordml/docbook.xsl,1.16;
+wordml/pages-normalise.xsl,1.4; wordml/sections-spec.xml,1.3;
+wordml/specifications.xml,1.13; wordml/template-pages.xml,1.6;
+wordml/template.dot,1.3; wordml/template.xml,1.13;
+wordml/wordml-blocks.xsl,1.1; wordml/wordml-final.xsl,1.12;
+wordml/wordml-sections.xsl,1.3 - Steve Ball</p>
+</li><li class="listitem">
+<p>added <a href="http://docbook.org/tdg5/en/html/mediaobject.html"><code class="sgmltag-element">mediaobject</code></a>
+<a href="http://docbook.org/tdg5/en/html/caption.html"><code class="sgmltag-element">caption</code></a></p>
+<p class="commit-changes">Modified: wordml/docbook-pages.xsl,1.4;
+wordml/docbook.xsl,1.15; wordml/specifications.xml,1.12;
+wordml/template-pages.xml,1.5; wordml/template.dot,1.2;
+wordml/template.xml,1.12; wordml/wordml-final.xsl,1.11 - Steve
+Ball</p>
+</li><li class="listitem">
+<p>added
+callouts</p>
+<p class="commit-changes">Modified: wordml/docbook-pages.xsl,1.3; wordml/docbook.xsl,1.14;
+wordml/pages-normalise.xsl,1.3; wordml/specifications.xml,1.11;
+wordml/template-pages.xml,1.4; wordml/wordml-final.xsl,1.10 - Steve
+Ball</p>
+</li><li class="listitem">
+<p>added Word template
+file</p>
+<p class="commit-changes">Modified: wordml/template.dot,1.1 - Steve Ball</p>
+</li><li class="listitem">
+<p>added <a href="http://docbook.org/tdg5/en/html/abstract.html"><code class="sgmltag-element">abstract</code></a>, fixed
+<a href="http://docbook.org/tdg5/en/html/itemizedlist.html"><code class="sgmltag-element">itemizedlist</code></a>, ulink</p>
+<p class="commit-changes">Modified: wordml/specifications.xml,1.10;
+wordml/wordml-final.xsl,1.9 - Steve Ball</p>
+</li><li class="listitem">
+<p>fixed Makefile added many
+features to Pages support added <a href="http://docbook.org/tdg5/en/html/revhistory.html"><code class="sgmltag-element">revhistory</code></a>, inlines,
+highlights, <a href="http://docbook.org/tdg5/en/html/abstract.html"><code class="sgmltag-element">abstract</code></a></p>
+<p class="commit-changes">Modified: wordml/Makefile,1.2;
+wordml/docbook-pages.xsl,1.2; wordml/pages-normalise.xsl,1.2;
+wordml/sections-spec.xml,1.2; wordml/specifications.xml,1.9;
+wordml/template-pages.xml,1.3; wordml/template.xml,1.11;
+wordml/wordml-final.xsl,1.8; wordml/wordml-sections.xsl,1.2 - Steve
+Ball</p>
+</li><li class="listitem">
+<p>fixed handling linebreaks when
+generating WordML added Apple Pages
+support</p>
+<p class="commit-changes">Modified: wordml/docbook.xsl,1.13; wordml/template-pages.xml,1.2 -
+Steve Ball</p>
+</li></ul></div>
+</div>
+</div>
+
+ <div class="sect1" title="Release 1.69.1"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="V1691"></a>Release 1.69.1</h2></div></div></div>
+
+ <p>This release is a minor bug-fix update to the 1.69.0
+ release. Along with bug fixes, it includes one
+ configuration-parameter change: The default value of the
+ <a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/annotation.support.html"><em class="parameter"><code>annotation.support</code></em></a> parameter is now
+ <code class="literal">0</code> (off). The reason for that change is that
+ there have been reports that <a href="http://docbook.org/tdg5/en/html/annotation.html"><code class="sgmltag-element">annotation</code></a> handling is
+ causing a significant performance degradation in processing of
+ large documents with <span class="command"><strong>xsltproc</strong></span>.</p>
+ </div>
+
+
+ <div class="sect1" title="Release 1.69.0"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="V1690"></a>Release 1.69.0</h2></div></div></div>
+
+ <p>The release includes major feature changes,
+ particularly in the <a class="link" href="#V1690_MAN" title="man">manpages
+ stylesheets</a>, as well as a large number of bug fixes.</p>
+
+ <p>As with all DocBook Project <span class="quote">&#8220;<span class="quote">dot zero</span>&#8221;</span> releases, this is an
+ <a class="link" href="#dot0" title="About dot-zero releases">experimental release </a>.</p>
+
+ <div class="sect2" title="Common"><div class="titlepage"><div><div><h3 class="title"><a name="V1690_COMMON"></a>Common</h3></div></div></div>
+
+ <div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
+ <p>This release adds localizations for the following
+ languages:
+ <span class="simplelist">Albanian, Amharic, Azerbaijani, Hindi, Irish (Gaelic), Gujarati, Kannada, Mongolian, Oriya, Punjabi, Tagalog, Tamil, and Welsh</span>.</p>
+ </li><li class="listitem">
+ <p>Added support for specifying number format for auto
+ labels for <a href="http://docbook.org/tdg5/en/html/chapter.html"><code class="sgmltag-element">chapter</code></a>, <a href="http://docbook.org/tdg5/en/html/appendix.html"><code class="sgmltag-element">appendix</code></a>,
+ <a href="http://docbook.org/tdg5/en/html/part.html"><code class="sgmltag-element">part</code></a>, and <a href="http://docbook.org/tdg5/en/html/preface.html"><code class="sgmltag-element">preface</code></a>. Contolled with the
+ <a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/appendix.autolabel.html"><em class="parameter"><code>appendix.autolabel</code></em></a>,
+ <a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/chapter.autolabel.html"><em class="parameter"><code>chapter.autolabel</code></em></a>,
+ <a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/part.autolabel.html"><em class="parameter"><code>part.autolabel</code></em></a>, and
+ <a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/preface.autolabel.html"><em class="parameter"><code>preface.autolabel</code></em></a> parameters.</p>
+ </li><li class="listitem">
+ <p>Added basic support for <a href="http://docbook.org/tdg5/en/html/biblioref.html"><code class="sgmltag-element">biblioref</code></a> cross
+ referencing.</p>
+ </li><li class="listitem">
+ <p>Added support for <code class="sgmltag-attribute">align</code>
+ on <a href="http://docbook.org/tdg5/en/html/caption.html"><code class="sgmltag-element">caption</code></a> in <a href="http://docbook.org/tdg5/en/html/mediaobject.html"><code class="sgmltag-element">mediaobject</code></a>.</p>
+ </li><li class="listitem">
+ <p>Added support for processing documents that use the
+ DocBook V5 namespace.</p>
+ </li><li class="listitem">
+ <p>Added support for <a href="http://docbook.org/tdg5/en/html/termdef.html"><code class="sgmltag-element">termdef</code></a> and
+ <a href="http://docbook.org/tdg5/en/html/mathphrase.html"><code class="sgmltag-element">mathphrase</code></a>.</p>
+ </li><li class="listitem">
+ <p>EXPERIMENTAL: Incorporated the Slides and Website
+ stylesheets into the DocBook XSL stylesheets package. So,
+ for example, Website documents can now be processed using
+ the following URI for the driver Website
+ <code class="filename">tabular.xsl</code> file: </p><pre class="literallayout"><code class="uri">http://docbook.sourceforge.net/release/xsl/current/website/tabular.xsl</code></pre>
+ </li><li class="listitem">
+ <p>A <a href="http://docbook.org/tdg5/en/html/procedure.html"><code class="sgmltag-element">procedure</code></a> without a <a href="http://docbook.org/tdg5/en/html/title.html"><code class="sgmltag-element">title</code></a> is
+ now treated as an <span class="quote">&#8220;<span class="quote">informal</span>&#8221;</span> procedure (meaning
+ that it is not added to any generated <span class="quote">&#8220;<span class="quote">list of
+ procedures</span>&#8221;</span> and has no affect on numbering of
+ generated labels for other procedures).</p>
+ </li><li class="listitem">
+ <p><code class="sgmltag-element">docname</code> is no longer added to
+ <a href="http://docbook.org/tdg5/en/html/olink.html"><code class="sgmltag-element">olink</code></a> when pointing to a root element.</p>
+ </li><li class="listitem">
+ <p>Added support for generation of choice separator in
+ inline simplelist. This enables auto-generation of an
+ appropriate localized <span class="quote">&#8220;<span class="quote">choice separator</span>&#8221;</span> (for
+ example, <span class="quote">&#8220;<span class="quote">and</span>&#8221;</span> or <span class="quote">&#8220;<span class="quote">or</span>&#8221;</span>) before the
+ final item in an inline <a href="http://docbook.org/tdg5/en/html/simplelist.html"><code class="sgmltag-element">simplelist</code></a>.</p>
+ <p>To indicate that you want a choice separator
+ generated for a particular list, you need to put a processing
+ instruction (PI) of the form
+ <code class="sgmltag-xmlpi">&lt;?dbchoice choice="foo"?&gt;</code> as a
+ child of the list. For example:
+ </p><pre class="literallayout"> &lt;para&gt;Choose from
+ ONE and ONLY ONE of the following:
+ &lt;simplelist type="inline"&gt;
+ &lt;?dbchoice choice="or" ?&gt;
+ &lt;member&gt;A&lt;/member&gt;
+ &lt;member&gt;B&lt;/member&gt;
+ &lt;member&gt;C&lt;/member&gt;.&lt;/simplelist&gt;&lt;/para&gt;</pre><p>
+
+ Output (for English):
+ </p><div class="blockquote"><blockquote class="blockquote">
+ <p>Choose from ONE and only ONE of the
+ following choices: A, B, or C.</p>
+ </blockquote></div><p>
+ As a temporary workaround for the fact that most of the
+ DocBook non-English locale files don't have a localization for
+ the word <span class="quote">&#8220;<span class="quote">or</span>&#8221;</span>, you can put in a literal string to
+ be used; example for French: <code class="sgmltag-pi">&lt;?dbchoice choice="ou"&gt;</code>. That is, use
+ <span class="quote">&#8220;<span class="quote">ou</span>&#8221;</span> instead of <span class="quote">&#8220;<span class="quote">or</span>&#8221;</span>.</p>
+ </li></ul></div>
+ </div>
+ <div class="sect2" title="FO"><div class="titlepage"><div><div><h3 class="title"><a name="V1690_FO"></a>FO</h3></div></div></div>
+
+ <div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
+ <p> Added <code class="literal">content-type</code> property to
+ <code class="literal">external-graphic</code> element, based on
+ <a href="http://docbook.org/tdg5/en/html/imagedata.html"><code class="sgmltag-element">imagedata</code></a> <code class="sgmltag-attribute">format</code>
+ attribute.</p>
+ </li><li class="listitem">
+ <p>Added support for generating
+ <code class="literal">&lt;rx:meta-field creator="$VERSION"/&gt;</code>
+ field for XEP output. This makes the DocBook XSL
+ stylesheet version information available through the
+ <span class="guimenu">Document Properties</span> menu in Acrobat
+ Reader and other PDF viewers.</p>
+ </li><li class="listitem">
+ <p>Trademark symbol handling made consistent with
+ handling of same in HTML stylesheets. Prior to this change,
+ if you processed a document that contained no value for the
+ <code class="sgmltag-attribute">class</code> attribute on the
+ <a href="http://docbook.org/tdg5/en/html/trademark.html"><code class="sgmltag-element">trademark</code></a> element, the HTML stylesheets would
+ default to rendering a superscript <code class="literal">TM
+ </code>symbol after the <a href="http://docbook.org/tdg5/en/html/trademark.html"><code class="sgmltag-element">trademark</code></a> contents,
+ but the FO stylesheets would render nothing.</p>
+ </li><li class="listitem">
+ <p>Added support for generating XEP bookmarks for
+ <a href="http://docbook.org/tdg5/en/html/refentry.html"><code class="sgmltag-element">refentry</code></a>.</p>
+ </li><li class="listitem">
+ <p>Added support for HTML markup <a href="http://docbook.org/tdg5/en/html/table.html"><code class="sgmltag-element">table</code></a> <code class="sgmltag-attribute">border</code> attribute, applied to each
+ table cell.</p>
+ </li><li class="listitem">
+ <p>The <code class="function">table.width</code> template can now
+ sum column specs if none use <code class="literal">%</code> or
+ <code class="literal">*</code>.</p>
+ </li><li class="listitem">
+ <p>Added <code class="literal">fox:destination</code> extension
+ inside <code class="literal">fox:outline</code> to support linking to
+ internal destinations.</p>
+ </li><li class="listitem">
+ <p>Added support for customizing
+ <code class="literal">abstract</code> with property sets. Controlled
+ with the <a href="http://docbook.sourceforge.net/release/xsl/current/doc/fo/abstract.properties.html"><em class="parameter"><code>abstract.properties</code></em></a> and
+ <a href="http://docbook.sourceforge.net/release/xsl/current/doc/fo/abstract.title.properties.html"><em class="parameter"><code>abstract.title.properties</code></em></a>
+ parameters.</p>
+ </li><li class="listitem">
+ <p>Add <a href="http://docbook.org/tdg5/en/html/footnote.html"><code class="sgmltag-element">footnote</code></a>s in <a href="http://docbook.org/tdg5/en/html/table.html"><code class="sgmltag-element">table</code></a> title to
+ table footnote set, and add support for table footnotes to
+ HTML table markup.</p>
+ </li><li class="listitem">
+ <p>Added support for <a href="http://docbook.org/tdg5/en/html/title.html"><code class="sgmltag-element">title</code></a> in
+ <a href="http://docbook.org/tdg5/en/html/glosslist.html"><code class="sgmltag-element">glosslist</code></a>.</p>
+ </li><li class="listitem">
+ <p>Added support for <a href="http://docbook.org/tdg5/en/html/itemizedlist.html"><code class="sgmltag-element">itemizedlist</code></a> symbol
+ <code class="literal">none</code>.</p>
+ </li><li class="listitem">
+ <p>Implemented the new
+ <a href="http://docbook.sourceforge.net/release/xsl/current/doc/fo/graphical.admonition.properties.html"><em class="parameter"><code>graphical.admonition.properties</code></em></a> and
+ <a href="http://docbook.sourceforge.net/release/xsl/current/doc/fo/nongraphical.admonition.properties.html"><em class="parameter"><code>nongraphical.admonition.properties</code></em></a>
+ attribute sets.</p>
+ </li><li class="listitem">
+ <p>Added <code class="sgmltag-attribute">id</code> to
+ <a href="http://docbook.org/tdg5/en/html/formalpara.html"><code class="sgmltag-element">formalpara</code></a> and some other blocks that were
+ missing it.</p>
+ </li><li class="listitem">
+ <p>Changed the anchor template to output
+ <code class="literal">fo:inline</code> instead of
+ <code class="literal">fo:wrapper</code>.</p>
+ </li><li class="listitem">
+ <p>Added support for <a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/toc.max.depth.html"><em class="parameter"><code>toc.max.depth</code></em></a>
+ parameter.</p>
+ </li></ul></div>
+ </div>
+
+ <div class="sect2" title="Help"><div class="titlepage"><div><div><h3 class="title"><a name="V1690_HELP"></a>Help</h3></div></div></div>
+
+ <div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
+ <p>Eclipse Help: Added support for generating olink
+ database.</p>
+ </li></ul></div>
+ </div>
+
+ <div class="sect2" title="HTML"><div class="titlepage"><div><div><h3 class="title"><a name="V1690_HTML"></a>HTML</h3></div></div></div>
+
+ <div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
+ <p>Added a first cut at support in HTML output for
+ DocBook 5 style <a href="http://docbook.org/tdg5/en/html/annotation.html"><code class="sgmltag-element">annotation</code></a>s. Controlled using the
+ <a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/annotation.support.html"><em class="parameter"><code>annotation.support</code></em></a> parameter, and
+ implemented using JavaScript and CSS styling. For more
+ details, see the documentation for the
+ <a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/annotation.js.html"><em class="parameter"><code>annotation.js</code></em></a>,
+ <a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/annotation.css.html"><em class="parameter"><code>annotation.css</code></em></a>,
+ <a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/annotation.graphic.open.html"><em class="parameter"><code>annotation.graphic.open</code></em></a>, and
+ <a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/annotation.graphic.close.html"><em class="parameter"><code>annotation.graphic.close</code></em></a>
+ parameters.</p>
+ </li><li class="listitem">
+ <p>Generate client-side image map for
+ <a href="http://docbook.org/tdg5/en/html/imageobjectco.html"><code class="sgmltag-element">imageobjectco</code></a> with areas using
+ <code class="literal">calspair</code> units</p>
+ </li><li class="listitem">
+ <p>Added support for <code class="sgmltag-xmlpi">&lt;?img.src.path?&gt;</code> PI.</p>
+ </li><li class="listitem">
+ <p>Added support for passing
+ <a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/img.src.path.html"><em class="parameter"><code>img.src.path</code></em></a> to DocBook Java XSLT
+ image extensions when appropriate. Controlled using the
+ <a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/graphicsize.use.img.src.path.html"><em class="parameter"><code>graphicsize.use.img.src.path</code></em></a>
+ parameter.</p>
+ </li><li class="listitem">
+ <p>Added support for (not
+ valid for DocBook 4) <code class="sgmltag-attribute">xlink:href</code>
+ on <a href="http://docbook.org/tdg5/en/html/area.html"><code class="sgmltag-element">area</code></a> and (not valid for DocBook 4)
+ <a href="http://docbook.org/tdg5/en/html/alt.html"><code class="sgmltag-element">alt</code></a> in <a href="http://docbook.org/tdg5/en/html/area.html"><code class="sgmltag-element">area</code></a>.</p>
+ </li><li class="listitem">
+ <p>Added new parameter
+ <a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/default.table.frame.html"><em class="parameter"><code>default.table.frame</code></em></a> to control table
+ framing if there is no <code class="sgmltag-attribute">frame</code>
+ attribute on a table.</p>
+ </li><li class="listitem">
+ <p>Added initial, experimental support for generating
+ content for the HTML <code class="literal">title</code> attribute from
+ content of the <a href="http://docbook.org/tdg5/en/html/alt.html"><code class="sgmltag-element">alt</code></a> element. This change adds
+ support for the following inline elements only (none of them
+ are block elements):
+ <span class="simplelist"><a href="http://docbook.org/tdg5/en/html/abbrev.html"><code class="sgmltag-element">abbrev</code></a>, <a href="http://docbook.org/tdg5/en/html/accel.html"><code class="sgmltag-element">accel</code></a>, <a href="http://docbook.org/tdg5/en/html/acronym.html"><code class="sgmltag-element">acronym</code></a>, <code class="sgmltag-element">action</code>, <a href="http://docbook.org/tdg5/en/html/application.html"><code class="sgmltag-element">application</code></a>, <a href="http://docbook.org/tdg5/en/html/authorinitials.html"><code class="sgmltag-element">authorinitials</code></a>, <code class="sgmltag-element">beginpage</code>, <a href="http://docbook.org/tdg5/en/html/citation.html"><code class="sgmltag-element">citation</code></a>, <a href="http://docbook.org/tdg5/en/html/citerefentry.html"><code class="sgmltag-element">citerefentry</code></a>, <a href="http://docbook.org/tdg5/en/html/citetitle.html"><code class="sgmltag-element">citetitle</code></a>, <a href="http://docbook.org/tdg5/en/html/city.html"><code class="sgmltag-element">city</code></a>, <a href="http://docbook.org/tdg5/en/html/classname.html"><code class="sgmltag-element">classname</code></a>, <a href="http://docbook.org/tdg5/en/html/code.html"><code class="sgmltag-element">code</code></a>, <a href="http://docbook.org/tdg5/en/html/command.html"><code class="sgmltag-element">command</code></a>, <a href="http://docbook.org/tdg5/en/html/computeroutput.html"><code class="sgmltag-element">computeroutput</code></a>, <a href="http://docbook.org/tdg5/en/html/constant.html"><code class="sgmltag-element">constant</code></a>, <a href="http://docbook.org/tdg5/en/html/country.html"><code class="sgmltag-element">country</code></a>, <a href="http://docbook.org/tdg5/en/html/database.html"><code class="sgmltag-element">database</code></a>, <a href="http://docbook.org/tdg5/en/html/email.html"><code class="sgmltag-element">email</code></a>, <a href="http://docbook.org/tdg5/en/html/envar.html"><code class="sgmltag-element">envar</code></a>, <a href="http://docbook.org/tdg5/en/html/errorcode.html"><code class="sgmltag-element">errorcode</code></a>, <a href="http://docbook.org/tdg5/en/html/errorname.html"><code class="sgmltag-element">errorname</code></a>, <a href="http://docbook.org/tdg5/en/html/errortext.html"><code class="sgmltag-element">errortext</code></a>, <a href="http://docbook.org/tdg5/en/html/errortype.html"><code class="sgmltag-element">errortype</code></a>, <a href="http://docbook.org/tdg5/en/html/exceptionname.html"><code class="sgmltag-element">exceptionname</code></a>, <a href="http://docbook.org/tdg5/en/html/fax.html"><code class="sgmltag-element">fax</code></a>, <a href="http://docbook.org/tdg5/en/html/filename.html"><code class="sgmltag-element">filename</code></a>, <a href="http://docbook.org/tdg5/en/html/firstname.html"><code class="sgmltag-element">firstname</code></a>, <a href="http://docbook.org/tdg5/en/html/firstterm.html"><code class="sgmltag-element">firstterm</code></a>, <a href="http://docbook.org/tdg5/en/html/foreignphrase.html"><code class="sgmltag-element">foreignphrase</code></a>, <a href="http://docbook.org/tdg5/en/html/function.html"><code class="sgmltag-element">function</code></a>, <a href="http://docbook.org/tdg5/en/html/glossterm.html"><code class="sgmltag-element">glossterm</code></a>, <a href="http://docbook.org/tdg5/en/html/guibutton.html"><code class="sgmltag-element">guibutton</code></a>, <a href="http://docbook.org/tdg5/en/html/guiicon.html"><code class="sgmltag-element">guiicon</code></a>, <a href="http://docbook.org/tdg5/en/html/guilabel.html"><code class="sgmltag-element">guilabel</code></a>, <a href="http://docbook.org/tdg5/en/html/guimenu.html"><code class="sgmltag-element">guimenu</code></a>, <a href="http://docbook.org/tdg5/en/html/guimenuitem.html"><code class="sgmltag-element">guimenuitem</code></a>, <a href="http://docbook.org/tdg5/en/html/guisubmenu.html"><code class="sgmltag-element">guisubmenu</code></a>, <a href="http://docbook.org/tdg5/en/html/hardware.html"><code class="sgmltag-element">hardware</code></a>, <a href="http://docbook.org/tdg5/en/html/honorific.html"><code class="sgmltag-element">honorific</code></a>, <code class="sgmltag-element">interface</code>, <a href="http://docbook.org/tdg5/en/html/interfacename.html"><code class="sgmltag-element">interfacename</code></a>, <a href="http://docbook.org/tdg5/en/html/keycap.html"><code class="sgmltag-element">keycap</code></a>, <a href="http://docbook.org/tdg5/en/html/keycode.html"><code class="sgmltag-element">keycode</code></a>, <a href="http://docbook.org/tdg5/en/html/keysym.html"><code class="sgmltag-element">keysym</code></a>, <a href="http://docbook.org/tdg5/en/html/lineage.html"><code class="sgmltag-element">lineage</code></a>, <a href="http://docbook.org/tdg5/en/html/lineannotation.html"><code class="sgmltag-element">lineannotation</code></a>, <a href="http://docbook.org/tdg5/en/html/literal.html"><code class="sgmltag-element">literal</code></a>, <a href="http://docbook.org/tdg5/en/html/markup.html"><code class="sgmltag-element">markup</code></a>, <code class="sgmltag-element">medialabel</code>, <a href="http://docbook.org/tdg5/en/html/methodname.html"><code class="sgmltag-element">methodname</code></a>, <a href="http://docbook.org/tdg5/en/html/mousebutton.html"><code class="sgmltag-element">mousebutton</code></a>, <a href="http://docbook.org/tdg5/en/html/option.html"><code class="sgmltag-element">option</code></a>, <a href="http://docbook.org/tdg5/en/html/optional.html"><code class="sgmltag-element">optional</code></a>, <a href="http://docbook.org/tdg5/en/html/otheraddr.html"><code class="sgmltag-element">otheraddr</code></a>, <a href="http://docbook.org/tdg5/en/html/othername.html"><code class="sgmltag-element">othername</code></a>, <a href="http://docbook.org/tdg5/en/html/package.html"><code class="sgmltag-element">package</code></a>, <a href="http://docbook.org/tdg5/en/html/parameter.html"><code class="sgmltag-element">parameter</code></a>, <a href="http://docbook.org/tdg5/en/html/personname.html"><code class="sgmltag-element">personname</code></a>, <a href="http://docbook.org/tdg5/en/html/phone.html"><code class="sgmltag-element">phone</code></a>, <a href="http://docbook.org/tdg5/en/html/pob.html"><code class="sgmltag-element">pob</code></a>, <a href="http://docbook.org/tdg5/en/html/postcode.html"><code class="sgmltag-element">postcode</code></a>, <a href="http://docbook.org/tdg5/en/html/productname.html"><code class="sgmltag-element">productname</code></a>, <a href="http://docbook.org/tdg5/en/html/productnumber.html"><code class="sgmltag-element">productnumber</code></a>, <a href="http://docbook.org/tdg5/en/html/prompt.html"><code class="sgmltag-element">prompt</code></a>, <a href="http://docbook.org/tdg5/en/html/property.html"><code class="sgmltag-element">property</code></a>, <a href="http://docbook.org/tdg5/en/html/quote.html"><code class="sgmltag-element">quote</code></a>, <a href="http://docbook.org/tdg5/en/html/refentrytitle.html"><code class="sgmltag-element">refentrytitle</code></a>, <a href="http://docbook.org/tdg5/en/html/remark.html"><code class="sgmltag-element">remark</code></a>, <a href="http://docbook.org/tdg5/en/html/replaceable.html"><code class="sgmltag-element">replaceable</code></a>, <a href="http://docbook.org/tdg5/en/html/returnvalue.html"><code class="sgmltag-element">returnvalue</code></a>, <a href="http://docbook.org/tdg5/en/html/tag.html"><code class="sgmltag-element">tag</code></a>, <a href="http://docbook.org/tdg5/en/html/shortcut.html"><code class="sgmltag-element">shortcut</code></a>, <a href="http://docbook.org/tdg5/en/html/state.html"><code class="sgmltag-element">state</code></a>, <a href="http://docbook.org/tdg5/en/html/street.html"><code class="sgmltag-element">street</code></a>, <code class="sgmltag-element">structfield</code>, <code class="sgmltag-element">structname</code>, <a href="http://docbook.org/tdg5/en/html/subscript.html"><code class="sgmltag-element">subscript</code></a>, <a href="http://docbook.org/tdg5/en/html/superscript.html"><code class="sgmltag-element">superscript</code></a>, <a href="http://docbook.org/tdg5/en/html/surname.html"><code class="sgmltag-element">surname</code></a>, <a href="http://docbook.org/tdg5/en/html/symbol.html"><code class="sgmltag-element">symbol</code></a>, <a href="http://docbook.org/tdg5/en/html/systemitem.html"><code class="sgmltag-element">systemitem</code></a>, <a href="http://docbook.org/tdg5/en/html/tag.html"><code class="sgmltag-element">tag</code></a>, <a href="http://docbook.org/tdg5/en/html/termdef.html"><code class="sgmltag-element">termdef</code></a>, <a href="http://docbook.org/tdg5/en/html/token.html"><code class="sgmltag-element">token</code></a>, <a href="http://docbook.org/tdg5/en/html/trademark.html"><code class="sgmltag-element">trademark</code></a>, <a href="http://docbook.org/tdg5/en/html/type.html"><code class="sgmltag-element">type</code></a>, <a href="http://docbook.org/tdg5/en/html/uri.html"><code class="sgmltag-element">uri</code></a>, <a href="http://docbook.org/tdg5/en/html/userinput.html"><code class="sgmltag-element">userinput</code></a>, <a href="http://docbook.org/tdg5/en/html/varname.html"><code class="sgmltag-element">varname</code></a>, and <a href="http://docbook.org/tdg5/en/html/wordasword.html"><code class="sgmltag-element">wordasword</code></a></span>
+ </p>
+ </li><li class="listitem">
+ <p>Added support for chunking <a href="http://docbook.org/tdg5/en/html/revhistory.html"><code class="sgmltag-element">revhistory</code></a> into
+ separate file (similar to the support for doing same with
+ <a href="http://docbook.org/tdg5/en/html/legalnotice.html"><code class="sgmltag-element">legalnotice</code></a>). Patch from Thomas
+ Schraitle. Controlled through <em class="parameter"><code>new
+ generate.revhistory.link</code></em> parameter.</p>
+ </li><li class="listitem">
+ <p>l10n.xsl: Made language codes RFC compliant. Added a
+ new boolean config parameter,
+ <a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/l10n.lang.value.rfc.compliant.html"><em class="parameter"><code>l10n.lang.value.rfc.compliant</code></em></a>. If it
+ is non-zero (the default), any underscore in a language code
+ will be converted to a hyphen in HTML output. If it is zero,
+ the language code will be left as-is.</p>
+ </li></ul></div>
+ </div>
+ <div class="sect2" title="man"><div class="titlepage"><div><div><h3 class="title"><a name="V1690_MAN"></a>man</h3></div></div></div>
+
+ <p>This release closes out 44 manpages stylesheet bug reports
+ and feature requests. It adds more than 35 new configuration
+ parameters for controlling aspects of man-page output --
+ including hyphenation and justification, handling of links,
+ conversion of Unicode characters, and contents of man-page
+ headers and footers.</p>
+ <div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
+ <p>New options for globally disabling/enabling
+ hyphenation and justification:
+ <a href="http://docbook.sourceforge.net/release/xsl/current/doc/manpages/man.justify.html"><em class="parameter"><code>man.justify</code></em></a> and
+ <a href="http://docbook.sourceforge.net/release/xsl/current/doc/manpages/man.hyphenate.html"><em class="parameter"><code>man.hyphenate</code></em></a>.</p>
+ <p>Note that the default
+ for the both of those is zero (off), because justified text
+ looks good only when it is also hyphenated; to quote the
+ <span class="quote">&#8220;<span class="quote">Hyphenation</span>&#8221;</span> node from the groff info page:
+ </p><div class="blockquote"><blockquote class="blockquote">
+ <p><span class="emphasis"><em>Since the odds are not great for finding a
+ set of words, for every output line, which fit nicely on a
+ line without inserting excessive amounts of space between
+ words, `gtroff' hyphenates words so that it can justify
+ lines without inserting too much space between
+ words.</em></span></p>
+ </blockquote></div><p>
+ The problem is that groff can end up hyphenating a lot of
+ things that you don't want hyphenated (variable names and
+ command names, for example). Keeping both justification and
+ hyphenation disabled ensures that hyphens won't get inserted
+ where you don't want to them, and you don't end up with
+ lines containing excessive amounts of space between
+ words. These default settings run counter to how most
+ existing man pages are formatted. But there are some notable
+ exceptions, such as the perl man pages.</p>
+ </li><li class="listitem">
+ <p> Added parameters for controlling hyphenation of
+ computer inlines, filenames, and URLs. By default, even when
+ hyphenation is enabled (globally), hyphenation is now
+ suppressed for "computer inlines" (currently, just
+ <a href="http://docbook.org/tdg5/en/html/classname.html"><code class="sgmltag-element">classname</code></a>, <a href="http://docbook.org/tdg5/en/html/constant.html"><code class="sgmltag-element">constant</code></a>, <a href="http://docbook.org/tdg5/en/html/envar.html"><code class="sgmltag-element">envar</code></a>,
+ <a href="http://docbook.org/tdg5/en/html/errorcode.html"><code class="sgmltag-element">errorcode</code></a>, <a href="http://docbook.org/tdg5/en/html/option.html"><code class="sgmltag-element">option</code></a>,
+ <a href="http://docbook.org/tdg5/en/html/replaceable.html"><code class="sgmltag-element">replaceable</code></a>, <a href="http://docbook.org/tdg5/en/html/userinput.html"><code class="sgmltag-element">userinput</code></a>,
+ <a href="http://docbook.org/tdg5/en/html/type.html"><code class="sgmltag-element">type</code></a>, and <a href="http://docbook.org/tdg5/en/html/varname.html"><code class="sgmltag-element">varname</code></a>, and for
+ <code class="sgmltag-element">filenames</code>, and for URLs from <a href="http://docbook.org/tdg5/en/html/link.html"><code class="sgmltag-element">link</code></a>. It
+ can be (re)enabled using the
+ <a href="http://docbook.sourceforge.net/release/xsl/current/doc/manpages/man.hyphenate.computer.inlines.html"><em class="parameter"><code>man.hyphenate.computer.inlines</code></em></a>,
+ <a href="http://docbook.sourceforge.net/release/xsl/current/doc/manpages/man.hyphenate.filenames.html"><em class="parameter"><code>man.hyphenate.filenames</code></em></a>, and
+ <em class="parameter"><code>man.hyphenate.urls parameters</code></em>.</p>
+ </li><li class="listitem">
+ <p>Implemented a new system for replacing Unicode
+ characters. There are two parts to the new system: a
+ <span class="quote">&#8220;<span class="quote">string substitution map</span>&#8221;</span> for doing
+ <span class="quote">&#8220;<span class="quote">essential</span>&#8221;</span> replacements, and a
+ <span class="quote">&#8220;<span class="quote">character map</span>&#8221;</span> that can optionally be disabled
+ and enabled.</p>
+ <p>The new system fixes all open bugs that had to do with
+ literal Unicode numbered entities such as &amp;#8220; and
+ &amp;#8221; showing up in output, and greatly expands the
+ ability of the stylesheets to generate <span class="quote">&#8220;<span class="quote">good</span>&#8221;</span> roff
+ equivalents for Unicode symbols and special
+ characters.</p>
+ <p>Here are some details...</p>
+ <p>The previous manpages mechanism for replacing Unicode
+ symbols and special characters with roff equivalents (the
+ <code class="function">replace-entities</code> template) was not
+ scalable and not complete. The mechanism handled a somewhat
+ arbitrary selection of less than 20 or so Unicode
+ characters. But there are potentially more than
+ <span class="emphasis"><em>800</em></span> Unicode special characters that
+ have some groff equivalent they can be mapped to. And there
+ are about 34 symbols in the Latin-1 (ISO-8859-1) block
+ alone. Users might reasonably expect that if they include
+ any of those Latin-1 characters in their DocBook source
+ documents, they will get correctly converted to known roff
+ equivalents in output.</p>
+ <p>In addition to those common symbols, certain users may
+ have a need to use symbols from other Unicode blocks. Say,
+ somebody who is documenting an application related to math
+ might need to use a bunch of symbols from the
+ <span class="quote">&#8220;<span class="quote">Mathematical Operators</span>&#8221;</span> Unicode block (there
+ are about 65 characters in that block that have reasonable
+ roff equivalents). Or somebody else might really like
+ Dingbats -- such as the checkmark character -- and so might
+ use a bunch of things from the <span class="quote">&#8220;<span class="quote">Dingbat</span>&#8221;</span> block
+ (141 characters in that that have roff equivalents or that
+ can at least be <span class="quote">&#8220;<span class="quote">degraded</span>&#8221;</span> somewhat gracefully
+ into roff).</p>
+ <p>So, the old <code class="function">replace-entities</code>
+ mechanism was replaced with a completely different mechanism
+ that is based on use of two <span class="quote">&#8220;<span class="quote">maps</span>&#8221;</span>: a
+ <span class="quote">&#8220;<span class="quote">substitution map</span>&#8221;</span> and a <span class="quote">&#8220;<span class="quote">character
+ map</span>&#8221;</span> (the latter in a format compliant with the XSLT
+ 2.0 spec and therefore completely <span class="quote">&#8220;<span class="quote">forward
+ compatible</span>&#8221;</span> with XSLT 2.0).</p>
+ <p>The substitution map is controlled through the
+ <a href="http://docbook.sourceforge.net/release/xsl/current/doc/manpages/man.string.subst.map.html"><em class="parameter"><code>man.string.subst.map</code></em></a> parameter, and
+ is used to replace things like the backslash character
+ (which needs special handling to prevent it from being
+ interpreted as a roff escape). The substitution map cannot
+ be disabled, because disabling it will cause the output to
+ be broken. However, you can add to it and change it if
+ needed.</p>
+
+ <p>The <span class="quote">&#8220;<span class="quote">character map</span>&#8221;</span> mechanism, on the
+ other hand, can be completely disabled. It is enabled by
+ default, and, by default, does replacement of all Latin-1
+ symbols, along with most special spaces, dashes, and quotes
+ (about 75 characters by default). Also, you can optionally
+ enable a <span class="quote">&#8220;<span class="quote">full</span>&#8221;</span> character map that provides
+ support for converting all 800 or so of the characters that
+ have some reasonable groff equivalent.</p>
+
+ <p>The character-map mechanism is controlled through the
+ following parameters:
+ </p><div class="variablelist"><dl><dt><span class="term"><a href="http://docbook.sourceforge.net/release/xsl/current/doc/manpages/man.charmap.enabled.html"><em class="parameter"><code>man.charmap.enabled</code></em></a></span></dt><dd><p>turns character-map support
+ on/off</p></dd><dt><span class="term"><a href="http://docbook.sourceforge.net/release/xsl/current/doc/manpages/man.charmap.use.subset.html"><em class="parameter"><code>man.charmap.use.subset</code></em></a></span></dt><dd><p>specifies that a subset of the character
+ map is used instead of the full map</p></dd><dt><span class="term"><a href="http://docbook.sourceforge.net/release/xsl/current/doc/manpages/man.charmap.subset.profile.html"><em class="parameter"><code>man.charmap.subset.profile</code></em></a></span></dt><dd><p>specifies profile of character-map
+ subset</p></dd><dt><span class="term"><a href="http://docbook.sourceforge.net/release/xsl/current/doc/manpages/man.charmap.uri.html"><em class="parameter"><code>man.charmap.uri</code></em></a></span></dt><dd><p>specifies an alternate character map to
+ use instead of the <span class="quote">&#8220;<span class="quote">standard</span>&#8221;</span> character map
+ provided in the distribution</p></dd></dl></div><p>
+ </p>
+ </li><li class="listitem">
+ <p>Implemented out-of-line handling of display of URLs
+ for links (currently, only for <code class="sgmltag-element">ulink</code>). This gives
+ you three choices for handling of links:
+ </p><div class="orderedlist"><ol class="orderedlist" type="1"><li class="listitem">
+ <p>Number and list links. Each link is numbered
+ inline, with a number in square brackets preceding the
+ link contents, and a numbered list of all links is added
+ to the end of the document.</p>
+ </li><li class="listitem">
+ <p>Only list links. Links are not numbered, but an
+ (unnumbered) list of links is added to the end of the
+ document.</p>
+ </li><li class="listitem">
+ <p>Suppress links. Don't number links and don't add
+ any list of links to the end of the document.</p>
+ </li></ol></div><p>
+ You can also choose whether links should be underlined. The
+ default is <span class="quote">&#8220;<span class="quote">the works</span>&#8221;</span> -- list, number, and
+ underline links. You can use the
+ <em class="parameter"><code>man.links.list.enabled</code></em>, <em class="parameter"><code>
+ man.links.are.numbered</code></em>, and
+ <em class="parameter"><code>man.links.are.underlined</code></em> parameters
+ to change the defaults. The default heading for the link
+ list is REFERENCES. You can be change that using the
+ <em class="parameter"><code>man.links.list.heading</code></em>
+ parameter.</p>
+ </li><li class="listitem">
+ <p>Changed default output encoding to UTF-8. <span class="bold"><strong>This does not mean that man pages are output in
+ raw UTF-8</strong></span>, because the character map is applied
+ before final output, causing all UTF-8 characters covered in
+ the map to be converted to roff equivalents.</p>
+ </li><li class="listitem">
+ <p>Added support for processing <a href="http://docbook.org/tdg5/en/html/refsect3.html"><code class="sgmltag-element">refsect3</code></a> and
+ <a href="http://docbook.org/tdg5/en/html/formalpara.html"><code class="sgmltag-element">formalpara</code></a> and nested <a href="http://docbook.org/tdg5/en/html/refsection.html"><code class="sgmltag-element">refsection</code></a>
+ elements, down to any arbitrary level of nesting.</p>
+ </li><li class="listitem">
+ <p>Output of the <code class="literal">NAME</code> and
+ <code class="literal">SYNOPSIS</code> and <code class="literal">AUTHOR</code>
+ headings and the headings for admonitions (<a href="http://docbook.org/tdg5/en/html/note.html"><code class="sgmltag-element">note</code></a>,
+ <a href="http://docbook.org/tdg5/en/html/caution.html"><code class="sgmltag-element">caution</code></a>, etc.) are no longer hard-coded for
+ English. Instead, headings are generated for those in the
+ correct locale (just as the FO and HTML stylesheets
+ do).</p>
+ </li><li class="listitem">
+ <p>Re-worked mechanism for assembling page
+ headers/footers (the contents of the <code class="literal">.TH</code>
+ macro <span class="quote">&#8220;<span class="quote">title line</span>&#8221;</span>).</p>
+
+ <p>Here are some details...</p>
+
+ <p>All man pages contain a <code class="literal">.TH</code> roff
+ macro whose contents are used for rendering the <span class="quote">&#8220;<span class="quote">title
+ line</span>&#8221;</span> displayed in the header and footer of each
+ page. Here are a couple of examples of real-world man pages
+ that have useful page headers/footers: </p><pre class="literallayout">
+ gtk-options(7) GTK+ User's Manual gtk-options(7) &lt;-- header
+ GTK+ 1.2 2003-10-20 gtk-options(7) &lt;-- footer
+
+ svgalib(7) Svgalib User Manual svgalib(7) &lt;-- header
+ Svgalib 1.4.1 16 December 1999 svgalib(7) &lt;-- footer</pre>
+
+ <p>And here are the terms with which the
+ <code class="literal">groff_man(7)</code> man page refers to the
+ various parts of the header/footer: </p><pre class="literallayout">
+ title(section) extra3 title(section) &lt;- header
+ extra2 extra1 title(section) &lt;- footer</pre>
+ <p> Or, using the names with which the <code class="literal">man(7)</code>
+ man page refers to those same fields: </p><pre class="literallayout">
+ title(section) manual title(section) &lt;- page header
+ source date title(section) &lt;- page footer</pre>
+
+ <p>The easiest way to control the contents of those
+ fields is to mark up your <a href="http://docbook.org/tdg5/en/html/refentry.html"><code class="sgmltag-element">refentry</code></a> content like
+ the following (note that this is a <span class="quote">&#8220;<span class="quote">minimal</span>&#8221;</span>
+ example). </p><pre class="programlisting">
+ &lt;refentry&gt;
+ &lt;info&gt;
+ &lt;date&gt;2003-10-20&lt;/date&gt; <a class="co" name="V1690_date-co" href="#V1690_date"><img src="images/callouts/1.png" alt="1" border="0"></a>
+ &lt;/info&gt;
+ &lt;refmeta&gt;
+ &lt;refentrytitle&gt;gtk-options&lt;/refentrytitle&gt; <a class="co" name="V1690_title-co" href="#V1690_title"><img src="images/callouts/2.png" alt="2" border="0"></a>
+ &lt;manvolnum&gt;7&lt;/manvolnum&gt; <a class="co" name="V1690_manvolnum-co" href="#V1690_manvolnum"><img src="images/callouts/3.png" alt="3" border="0"></a>
+ &lt;refmiscinfo class="source-name"&gt;GTK+&lt;/refmiscinfo&gt; <a class="co" name="V1690_source-name-co" href="#V1690_source-name"><img src="images/callouts/4.png" alt="4" border="0"></a>
+ &lt;refmiscinfo class="version"&gt;1.2&lt;/refmiscinfo&gt; <a class="co" name="V1690_version-co" href="#V1690_version"><img src="images/callouts/5.png" alt="5" border="0"></a>
+ &lt;refmiscinfo class="manual"&gt;GTK+ User's Manual&lt;/refmiscinfo&gt; <a class="co" name="V1690_manual-co" href="#V1690_manual"><img src="images/callouts/6.png" alt="6" border="0"></a>
+ &lt;/refmeta&gt;
+ &lt;refnamediv&gt;
+ &lt;refname&gt;gtk-options&lt;/refname&gt;
+ &lt;refpurpose&gt;Standard Command Line Options for GTK+ Programs&lt;/refpurpose&gt;
+ &lt;/refnamediv&gt;
+ &lt;refsect1&gt;
+ &lt;title&gt;Description&lt;/title&gt;
+ &lt;para&gt;This manual page describes the command line options, which
+ are common to all GTK+ based applications.&lt;/para&gt;
+ &lt;/refsect1&gt;
+ &lt;/refentry&gt;</pre><p>
+ </p><div class="calloutlist"><table border="0" summary="Callout list"><tr><td width="5%" valign="top" align="left"><p><a name="V1690_date"></a><a href="#V1690_date-co"><img src="images/callouts/1.png" alt="1" border="0"></a> </p></td><td valign="top" align="left">
+ <p>Sets the <span class="quote">&#8220;<span class="quote">date</span>&#8221;</span> part of the header/footer.</p>
+ </td></tr><tr><td width="5%" valign="top" align="left"><p><a name="V1690_title"></a><a href="#V1690_title-co"><img src="images/callouts/2.png" alt="2" border="0"></a> </p></td><td valign="top" align="left">
+ <p>Sets the <span class="quote">&#8220;<span class="quote">title</span>&#8221;</span> part.</p>
+ </td></tr><tr><td width="5%" valign="top" align="left"><p><a name="V1690_manvolnum"></a><a href="#V1690_manvolnum-co"><img src="images/callouts/3.png" alt="3" border="0"></a> </p></td><td valign="top" align="left">
+ <p>Sets the <span class="quote">&#8220;<span class="quote">section</span>&#8221;</span> part.</p>
+ </td></tr><tr><td width="5%" valign="top" align="left"><p><a name="V1690_source-name"></a><a href="#V1690_source-name-co"><img src="images/callouts/4.png" alt="4" border="0"></a> </p></td><td valign="top" align="left">
+ <p>Sets the <span class="quote">&#8220;<span class="quote">source name</span>&#8221;</span> part.</p>
+ </td></tr><tr><td width="5%" valign="top" align="left"><p><a name="V1690_version"></a><a href="#V1690_version-co"><img src="images/callouts/5.png" alt="5" border="0"></a> </p></td><td valign="top" align="left">
+ <p>Sets the <span class="quote">&#8220;<span class="quote">version</span>&#8221;</span> part.</p>
+ </td></tr><tr><td width="5%" valign="top" align="left"><p><a name="V1690_manual"></a><a href="#V1690_manual-co"><img src="images/callouts/6.png" alt="6" border="0"></a> </p></td><td valign="top" align="left">
+ <p>Sets the <span class="quote">&#8220;<span class="quote">manual</span>&#8221;</span> part.</p>
+ </td></tr></table></div><p>
+ </p>
+ <p>Below are explanations of the steps the stylesheets
+ take to attempt to assemble and display
+ <span class="quote">&#8220;<span class="quote">good</span>&#8221;</span> headers and footer. [In the
+ descriptions, note that <em class="replaceable"><code>*info</code></em>
+ is the <a href="http://docbook.org/tdg5/en/html/refentry.html"><code class="sgmltag-element">refentry</code></a> <span class="quote">&#8220;<span class="quote">info</span>&#8221;</span> child
+ (whatever its name), and
+ <em class="replaceable"><code>parentinfo</code></em> is the
+ <span class="quote">&#8220;<span class="quote">info</span>&#8221;</span> child of its parent (again, whatever
+ its name).]
+ </p><div class="variablelist"><dl><dt><span class="term">extra1 field (date)</span></dt><dd>
+ <p>Content of the <span class="quote">&#8220;<span class="quote">extra1</span>&#8221;</span> field is
+ what shows up in the <span class="bold"><strong>center
+ footer</strong></span> position of each page. The
+ <code class="literal">man(7)</code> man page describes it as
+ <span class="quote">&#8220;<span class="quote">the date of the last revision</span>&#8221;</span>.</p>
+ <p>To provide this content, if the
+ <a href="http://docbook.sourceforge.net/release/xsl/current/doc/manpages/refentry.date.profile.enabled.html"><em class="parameter"><code>refentry.date.profile.enabled</code></em></a>
+ is non-zero, the stylesheets check the value of
+ <a href="http://docbook.sourceforge.net/release/xsl/current/doc/manpages/refentry.date.profile.html"><em class="parameter"><code>refentry.date.profile</code></em></a>.</p>
+ <p>Otherwise, by default, they check for a
+ <a href="http://docbook.org/tdg5/en/html/date.html"><code class="sgmltag-element">date</code></a> or <a href="http://docbook.org/tdg5/en/html/pubdate.html"><code class="sgmltag-element">pubdate</code></a> not only in the
+ <em class="replaceable"><code>*info</code></em> contents, but also in
+ the <em class="replaceable"><code>parentinfo</code></em>
+ contents.</p>
+ <p>If a date cannot be found, the stylesheets now
+ automatically generate a localized <span class="quote">&#8220;<span class="quote">long
+ format</span>&#8221;</span> date, ensuring that this field always
+ has content in output.</p>
+ <p>However, if for some reason you want to suppress
+ this field, you can do so by setting a non-zero value
+ for <a href="http://docbook.sourceforge.net/release/xsl/current/doc/manpages/man.th.extra1.suppress.html"><em class="parameter"><code>man.th.extra1.suppress</code></em></a>.</p>
+ </dd><dt><span class="term">extra2 field (source)</span></dt><dd>
+ <p>On Linux systems and on systems with a modern
+ groff, the content of the <span class="quote">&#8220;<span class="quote">extra2</span>&#8221;</span> field
+ are what shows up in the <span class="bold"><strong>left
+ footer</strong></span> position of each page.</p>
+
+ <p>The <code class="literal">man(7)</code> man page describes
+ this as <span class="quote">&#8220;<span class="quote">the source of the command</span>&#8221;</span>, and
+ provides the following examples:
+ </p><div class="itemizedlist"><ul class="itemizedlist" type="circle"><li class="listitem">
+ <p>For binaries, use somwething like: GNU,
+ NET-2, SLS Distribution, MCC Distribution.</p>
+ </li><li class="listitem">
+ <p>For system calls, use the version of the
+ kernel that you are currently looking at: Linux
+ 0.99.11.</p>
+ </li><li class="listitem">
+ <p>For library calls, use the source of the
+ function: GNU, BSD 4.3, Linux DLL 4.4.1.</p>
+ </li></ul></div><p>
+ </p>
+
+ <p>In practice, there are many pages that simply
+ have a version number in the <span class="quote">&#8220;<span class="quote">source</span>&#8221;</span>
+ field. So, it looks like what we have is a two-part
+ field,
+ <em class="replaceable"><code>Name</code></em> <em class="replaceable"><code>Version</code></em>,
+ where:
+ </p><div class="variablelist"><dl><dt><span class="term">Name</span></dt><dd>
+ <p>product name (e.g., BSD) or org. name
+ (e.g., GNU)</p>
+ </dd><dt><span class="term">Version</span></dt><dd>
+ <p>version name</p>
+ </dd></dl></div><p>
+ Each part is optional. If the
+ <em class="replaceable"><code>Name</code></em> is a product name,
+ then the <em class="replaceable"><code>Version</code></em> is
+ probably the version of the product. Or there may be
+ no <em class="replaceable"><code>Name</code></em>, in which case, if
+ there is a <em class="replaceable"><code>Version</code></em>, it is
+ probably the version of the item itself, not the
+ product it is part of. Or, if the
+ <em class="replaceable"><code>Name</code></em> is an organization
+ name, then there probably will be no
+ <em class="replaceable"><code>Version</code></em>.
+ </p>
+ <p>To provide this content, if the
+ <a href="http://docbook.sourceforge.net/release/xsl/current/doc/manpages/refentry.source.name.profile.enabled.html"><em class="parameter"><code>refentry.source.name.profile.enabled</code></em></a>
+ and
+ <a href="http://docbook.sourceforge.net/release/xsl/current/doc/manpages/refentry.version.profile.enabled.html"><em class="parameter"><code>refentry.version.profile.enabled</code></em></a>
+ parameter are non-zero, the stylesheets check the
+ value of <a href="http://docbook.sourceforge.net/release/xsl/current/doc/manpages/refentry.source.name.profile.html"><em class="parameter"><code>refentry.source.name.profile</code></em></a>
+ <a href="http://docbook.sourceforge.net/release/xsl/current/doc/manpages/refentry.version.profile.html"><em class="parameter"><code>refentry.version.profile</code></em></a>.</p>
+
+ <p>Otherwise, by default, they check the following
+ places, in the following order:
+ </p><div class="orderedlist"><ol class="orderedlist" type="1"><li class="listitem">
+ <pre class="literallayout"><em class="replaceable"><code>*info</code></em>/<a href="http://docbook.org/tdg5/en/html/productnumber.html"><code class="sgmltag-element">productnumber</code></a></pre>
+ </li><li class="listitem">
+ <pre class="literallayout"><em class="replaceable"><code>*info</code></em>/<a href="http://docbook.org/tdg5/en/html/productnumber.html"><code class="sgmltag-element">productnumber</code></a></pre>
+ </li><li class="listitem">
+ <pre class="literallayout"><a href="http://docbook.org/tdg5/en/html/refmeta.html"><code class="sgmltag-element">refmeta</code></a>/<a href="http://docbook.org/tdg5/en/html/refmiscinfo.html"><code class="sgmltag-element">refmiscinfo</code></a>[@class = 'version']</pre>
+ </li><li class="listitem">
+ <pre class="literallayout"><em class="replaceable"><code>parentinfo</code></em>/<a href="http://docbook.org/tdg5/en/html/productnumber.html"><code class="sgmltag-element">productnumber</code></a></pre>
+ </li><li class="listitem">
+ <pre class="literallayout"><em class="replaceable"><code>*info</code></em>/<a href="http://docbook.org/tdg5/en/html/productname.html"><code class="sgmltag-element">productname</code></a></pre>
+ </li><li class="listitem">
+ <pre class="literallayout"><em class="replaceable"><code>parentinfo</code></em>/<a href="http://docbook.org/tdg5/en/html/productname.html"><code class="sgmltag-element">productname</code></a></pre>
+ </li><li class="listitem">
+ <pre class="literallayout"><a href="http://docbook.org/tdg5/en/html/refmeta.html"><code class="sgmltag-element">refmeta</code></a>/<a href="http://docbook.org/tdg5/en/html/refmiscinfo.html"><code class="sgmltag-element">refmiscinfo</code></a></pre>
+ </li><li class="listitem">
+ <p>[nothing found, so leave it empty]</p>
+ </li></ol></div><p>
+ </p>
+ </dd><dt><span class="term">extra3 field</span></dt><dd>
+ <p>On Linux systems and on systems with a modern
+ groff, the content of the <span class="quote">&#8220;<span class="quote">extra3</span>&#8221;</span> field
+ are what shows up in the <span class="bold"><strong>center
+ header</strong></span> position of each page. Some man
+ pages have <span class="quote">&#8220;<span class="quote">extra2</span>&#8221;</span> content, some
+ don't. If a particular man page has it, it is most
+ often <span class="quote">&#8220;<span class="quote">context</span>&#8221;</span> data about some larger
+ system the documented item belongs to (for example,
+ the name or description of a group of related
+ applications). The stylesheets now check the following
+ places, in the following order, to look for content to
+ add to the <span class="quote">&#8220;<span class="quote">extra3</span>&#8221;</span> field.</p>
+ <div class="orderedlist"><ol class="orderedlist" type="1"><li class="listitem">
+ <pre class="literallayout"><em class="replaceable"><code>parentinfo</code></em>/<a href="http://docbook.org/tdg5/en/html/title.html"><code class="sgmltag-element">title</code></a></pre>
+ </li><li class="listitem">
+ <pre class="literallayout">parent's <a href="http://docbook.org/tdg5/en/html/title.html"><code class="sgmltag-element">title</code></a></pre>
+ </li><li class="listitem">
+ <pre class="literallayout"><a href="http://docbook.org/tdg5/en/html/refmeta.html"><code class="sgmltag-element">refmeta</code></a>/<a href="http://docbook.org/tdg5/en/html/refmiscinfo.html"><code class="sgmltag-element">refmiscinfo</code></a></pre>
+ </li><li class="listitem">
+ <p>[nothing found, so leave it empty]</p>
+ </li></ol></div>
+ </dd></dl></div><p>
+ </p>
+ </li><li class="listitem">
+ <p>Reworked <em class="replaceable"><code>*info</code></em> gathering. For
+ each <a href="http://docbook.org/tdg5/en/html/refentry.html"><code class="sgmltag-element">refentry</code></a> found, the stylesheets now cache its
+ <em class="replaceable"><code>*info</code></em> content, then check for any
+ valid parent of it that might have metainfo content and cache
+ that, if found; they then then do all further matches against
+ those node-sets (rather than re-selecting the original
+ <em class="replaceable"><code>*info</code></em> nodes each time they are
+ needed).</p>
+ </li><li class="listitem">
+ <p>New option for breaking strings after forward
+ slashes. This enables long URLs and pathnames to be broken
+ across lines. Controlled through
+ <a href="http://docbook.sourceforge.net/release/xsl/current/doc/manpages/man.break.after.slash.html"><em class="parameter"><code>man.break.after.slash</code></em></a> parameter.</p>
+ </li><li class="listitem">
+ <p>Output for servicemark and trademark are now
+ <code class="literal">(SM)</code> and <code class="literal">(TM)</code>. There is
+ a groff <code class="literal">"\(tm"</code> escape, but output from that
+ is not acceptable.</p>
+ </li><li class="listitem">
+ <p>New option for controlling the length of the title
+ part of the <code class="literal">.TH</code> title line. Controlled
+ through the <a href="http://docbook.sourceforge.net/release/xsl/current/doc/manpages/man.th.title.max.length.html"><em class="parameter"><code>man.th.title.max.length</code></em></a>
+ parameter.</p>
+ </li><li class="listitem">
+ <p>New option for specifying output encoding of each man
+ page; controlled with
+ <a href="http://docbook.sourceforge.net/release/xsl/current/doc/manpages/man.output.encoding.html"><em class="parameter"><code>man.output.encoding</code></em></a> (similar to the
+ HTML <em class="parameter"><code>chunker.output.encoding </code></em>
+ parameter).</p>
+ </li><li class="listitem">
+ <p>New option for suppressing filename messages when
+ generating output; controlled with
+ <a href="http://docbook.sourceforge.net/release/xsl/current/doc/manpages/man.output.quietly.html"><em class="parameter"><code>man.output.quietly</code></em></a> (similar to the HTML
+ <a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/chunk.quietly.html"><em class="parameter"><code>chunk.quietly</code></em></a> parameter).</p>
+ </li><li class="listitem">
+ <p>The text of cross-references to first-level
+ <a href="http://docbook.org/tdg5/en/html/refentry.html"><code class="sgmltag-element">refentry</code></a> (<a href="http://docbook.org/tdg5/en/html/refsect1.html"><code class="sgmltag-element">refsect1</code></a>, top-level
+ <a href="http://docbook.org/tdg5/en/html/refsection.html"><code class="sgmltag-element">refsection</code></a>, <a href="http://docbook.org/tdg5/en/html/refnamediv.html"><code class="sgmltag-element">refnamediv</code></a>, and
+ <a href="http://docbook.org/tdg5/en/html/refsynopsisdiv.html"><code class="sgmltag-element">refsynopsisdiv</code></a>) are now capitalized.</p>
+ </li><li class="listitem">
+ <p>Cross-references to <a href="http://docbook.org/tdg5/en/html/refnamediv.html"><code class="sgmltag-element">refnamediv</code></a> now use the
+ localized <code class="literal">NAME</code> title instead of using the
+ first <a href="http://docbook.org/tdg5/en/html/refname.html"><code class="sgmltag-element">refname</code></a> child. This makes the output
+ inconsistent with HTML and FO output, but for man-page output,
+ it seems to make better sense to have the
+ <code class="literal">NAME</code>. (It may actually make better sense to
+ do it that way in HTML and FO output as well...)</p>
+ </li><li class="listitem">
+ <p>Added support for processing <a href="http://docbook.org/tdg5/en/html/funcparams.html"><code class="sgmltag-element">funcparams</code></a>.</p>
+ </li><li class="listitem">
+ <p>Removed the space that was being output between
+ <a href="http://docbook.org/tdg5/en/html/funcdef.html"><code class="sgmltag-element">funcdef</code></a> and <a href="http://docbook.org/tdg5/en/html/paramdef.html"><code class="sgmltag-element">paramdef</code></a>; example: was:
+ <code class="literal">float rand (void)</code>; now:
+ <code class="literal">float rand(void)</code></p>
+ </li><li class="listitem">
+ <p>Turned off bold formatting for the <a href="http://docbook.org/tdg5/en/html/type.html"><code class="sgmltag-element">type</code></a>
+ element when it occurs within a <a href="http://docbook.org/tdg5/en/html/funcdef.html"><code class="sgmltag-element">funcdef</code></a> or
+ <a href="http://docbook.org/tdg5/en/html/paramdef.html"><code class="sgmltag-element">paramdef</code></a></p>
+ </li><li class="listitem">
+ <p>Corrected rendering of <a href="http://docbook.org/tdg5/en/html/simplelist.html"><code class="sgmltag-element">simplelist</code></a>. Any
+ <code class="literal">&lt;simplelist type="inline"</code> instance
+ is now rendered as a comma-separated list (also with an
+ optional localized <span class="quote">&#8220;<span class="quote">and</span>&#8221;</span> or <span class="quote">&#8220;<span class="quote">or</span>&#8221;</span> before the last item -- see
+ description elsewhere in these release notes). Any simplelist
+ instance whose <code class="sgmltag-attribute">type</code> is not
+ <code class="literal">inline</code> is rendered as a one-column vertical
+ list (ignoring the values of the <code class="sgmltag-attribute">type</code> and <code class="sgmltag-attribute">columns</code> attributes if present)</p>
+ </li><li class="listitem">
+ <p>Comment added at top of roff source for each page now
+ includes DocBook XSL stylesheets version number (as in the
+ HTML stylesheets)</p>
+ </li><li class="listitem">
+ <p>Made change to prevent <span class="quote">&#8220;<span class="quote">sticky</span>&#8221;</span> fonts
+ changes. Now, when the manpages stylesheets encounter node
+ sets that need to be boldfaced or italicized, they put the
+ <code class="literal">\fBfoo\fR</code> and <code class="literal">\fIbar\fR</code>
+ groff bold/italic instructions separately around each node in
+ the set.</p>
+ </li><li class="listitem">
+ <p>synop.xsl: Boldface everything in
+ <a href="http://docbook.org/tdg5/en/html/funcsynopsis.html"><code class="sgmltag-element">funcsynopsis</code></a> output except parameters (which are in
+ ital). The <code class="literal">man(7)</code> man page says:
+ </p><div class="blockquote"><blockquote class="blockquote">
+ <p>For functions, the arguments are always specified
+ using italics, even in the SYNOPSIS section, where the rest
+ of the function is specified in bold.</p>
+ </blockquote></div><p>
+ A look through the contents of the
+ <code class="filename">man/man2</code> directory shows that most
+ (all) existing pages do follow this <span class="quote">&#8220;<span class="quote">everything in
+ funcsynopsis bold</span>&#8221;</span> rule. That means the
+ <a href="http://docbook.org/tdg5/en/html/type.html"><code class="sgmltag-element">type</code></a> content and any punctuation (parens,
+ semicolons, <code class="sgmltag-element">vararg</code>s) also must be bolded.</p>
+ </li><li class="listitem">
+ <p>Removed code for adding backslashes before periods/dots
+ in roff source, because backslashes in front of periods/dots
+ in roff source are needed only in the very rare case where a
+ period is the very first character in a line, without any
+ space in front of it. A better way to deal with that rare case
+ is for you to add a zero-width space in front of the offending
+ dot(s) in your source</p>
+ </li><li class="listitem">
+ <p>Removed special handling of the <a href="http://docbook.org/tdg5/en/html/quote.html"><code class="sgmltag-element">quote</code></a>
+ element. That was hard-coded to cause anything marked up with
+ the <a href="http://docbook.org/tdg5/en/html/quote.html"><code class="sgmltag-element">quote</code></a> element to be output preceded by two
+ backticks and followed by two apostrophes -- that is, that
+ old-school kludge for generating <span class="quote">&#8220;<span class="quote">curly</span>&#8221;</span> quotes in Emacs and
+ in X-Windows fonts. While Emacs still seems to support that, I
+ don't think X-Windows has for a long time now. And, anyway, it
+ looks (and has always looked) like crap when viewed on a
+ normal tty/console. In addition, it breaks localiztion of
+ <a href="http://docbook.org/tdg5/en/html/quote.html"><code class="sgmltag-element">quote</code></a>. By default, <a href="http://docbook.org/tdg5/en/html/quote.html"><code class="sgmltag-element">quote</code></a> content is
+ output with localized quotation marks, which, depending on the
+ locale, may or may not be left and right double quotation
+ marks.</p>
+ </li><li class="listitem">
+ <p>Changed mappings for left and right single quotation
+ marks. Those had previously been incorrectly mapped to the
+ backtick (&amp;#96;) and apostrophe (&amp;39;) characters (for
+ kludgy reasons -- see above). They are now correctly mapped to
+ the <code class="literal">\(oq</code> and <code class="literal">\(cq</code> roff
+ escapes. If you want the old (broken) behavior, you need to
+ manually change the mappings for those in the value of the
+ <a href="http://docbook.sourceforge.net/release/xsl/current/doc/manpages/man.string.subst.map.html"><em class="parameter"><code>man.string.subst.map</code></em></a> parameter.</p>
+ </li><li class="listitem">
+ <p>Removed <code class="filename">xref.xsl</code> file. Now, of the
+ various cross-reference elements, only the <code class="sgmltag-element">ulink</code>
+ element is handled differently; the rest are handled exactly
+ as the HTML stylesheets handle them, except that no hypertext
+ links are generated. (Because there is no equivalent hypertext
+ mechanism is man pages.)</p>
+ </li><li class="listitem">
+ <p>New option for making <span class="quote">&#8220;<span class="quote">subheading dividers</span>&#8221;</span> in generated
+ roff source. The dividers are not visible in the rendered man
+ page; they are just there to make the source
+ readable. Controlled using
+ <a href="http://docbook.sourceforge.net/release/xsl/current/doc/manpages/man.subheading.divider.html"><em class="parameter"><code>man.subheading.divider</code></em></a>.</p>
+ </li><li class="listitem">
+ <p>Fixed many places where too much space was being added
+ between lines.</p>
+ </li></ul></div>
+
+ </div>
+</div>
+
+
+ <div class="sect1" title="Release 1.68.1"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="V1681"></a>Release 1.68.1</h2></div></div></div>
+
+ <p>The release adds localization support for Farsi (thanks to
+ Sina Heshmati) and improved support for the XLink-based DocBook NG
+ <code class="sgmltag-element">db:link</code> element. Other than that, it is a minor
+ bug-fix update to the 1.68.0 release. The main thing it fixes is a
+ build error that caused the XSLT Java extensions to be jarred up
+ with the wrong package structure. Thanks to Jens Stavnstrup for
+ quickly reporting the problem, and to Mauritz Jeanson for
+ investigating and finding the cause.</p>
+ </div>
+
+
+ <div class="sect1" title="Release 1.68.0"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="V1680"></a>Release 1.68.0</h2></div></div></div>
+
+ <p>This release includes some features changes, particularly
+ for FO/PDF output, and a number of bug fixes.
+ </p><div class="itemizedlist" title="FO"><a name="V1680_FO"></a><p class="title"><b>FO</b></p><ul class="itemizedlist" type="disc"><li class="listitem">
+ <p>Moved footnote properties to attribute-sets.</p>
+ </li><li class="listitem">
+ <p>Added support for side floats, margin notes, and
+ custom floats.</p>
+ </li><li class="listitem">
+ <p>Added new parameters
+ <a href="http://docbook.sourceforge.net/release/xsl/current/doc/fo/body.start.indent.html"><em class="parameter"><code>body.start.indent</code></em></a> and
+ <a href="http://docbook.sourceforge.net/release/xsl/current/doc/fo/body.end.indent.html"><em class="parameter"><code>body.end.indent</code></em></a> to the
+ <em class="parameter"><code>set.flow.properties template</code></em>.</p>
+ </li><li class="listitem">
+ <p>Added support for <code class="sgmltag-attribute">xml:id</code></p>
+ </li><li class="listitem">
+ <p>Added support for
+ <a href="http://docbook.org/tdg5/en/html/refdescriptor.html"><code class="sgmltag-element">refdescriptor</code></a>.</p>
+ </li><li class="listitem">
+ <p>Added support for multiple <a href="http://docbook.org/tdg5/en/html/refnamediv.html"><code class="sgmltag-element">refnamediv</code></a>s.</p>
+ </li><li class="listitem">
+ <p>Added <a href="http://docbook.sourceforge.net/release/xsl/current/doc/fo/index.entry.properties.html"><em class="parameter"><code>index.entry.properties</code></em></a>
+ attribute-set to support customization of index
+ entries.</p>
+ </li><li class="listitem">
+ <p>Added <em class="parameter"><code>set.flow.properties
+ template</code></em> call to each <code class="sgmltag-element">fo:flow</code>
+ to support customizations entry point.</p>
+ </li><li class="listitem">
+ <p>Add support for <code class="literal">@floatstyle</code> in
+ <a href="http://docbook.org/tdg5/en/html/figure.html"><code class="sgmltag-element">figure</code></a></p>
+ </li><li class="listitem">
+ <p>Moved hardcoded properties for index division titles
+ to the <a href="http://docbook.sourceforge.net/release/xsl/current/doc/fo/index.div.title.properties.html"><em class="parameter"><code>index.div.title.properties</code></em></a>
+ attribute-set.</p>
+ </li><li class="listitem">
+ <p>Added support for
+ <code class="sgmltag-element">table-layout</code>="<code class="sgmltag-attvalue">auto</code>" for XEP.</p>
+ </li><li class="listitem">
+ <p>Added <a href="http://docbook.sourceforge.net/release/xsl/current/doc/fo/index.div.title.properties.html"><em class="parameter"><code>index.div.title.properties</code></em></a>
+ attribute-set.</p>
+ </li><li class="listitem">
+ <p><em class="parameter"><code>$verbose</code></em> parameter is now
+ passed to most elements.</p>
+ </li><li class="listitem">
+ <p>Added <a href="http://docbook.org/tdg5/en/html/refentry.html"><code class="sgmltag-element">refentry</code></a> to
+ <a href="http://docbook.org/tdg5/en/html/toc.html"><code class="sgmltag-element">toc</code></a> in <a href="http://docbook.org/tdg5/en/html/part.html"><code class="sgmltag-element">part</code></a>, as it is
+ permitted by the DocBook schema/DTD.</p>
+ </li><li class="listitem">
+ <p>Added backmatter elements and
+ <a href="http://docbook.org/tdg5/en/html/article.html"><code class="sgmltag-element">article</code></a> to <a href="http://docbook.org/tdg5/en/html/toc.html"><code class="sgmltag-element">toc</code></a> in
+ <a href="http://docbook.org/tdg5/en/html/part.html"><code class="sgmltag-element">part</code></a>, since they are permitted by the
+ DocBook schema/DTD.</p>
+ </li><li class="listitem">
+ <p>Added <code class="sgmltag-attribute">mode</code>="<code class="sgmltag-attvalue">toc</code>" for
+ <a href="http://docbook.org/tdg5/en/html/simplesect.html"><code class="sgmltag-element">simplesect</code></a>, since it is now permitted in
+ the <a href="http://docbook.org/tdg5/en/html/toc.html"><code class="sgmltag-element">toc</code></a> if
+ <a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/simplesect.in.toc.html"><em class="parameter"><code>simplesect.in.toc</code></em></a> is set.</p>
+ </li><li class="listitem">
+ <p>Moved hard-coded properties to
+ <em class="parameter"><code>nongraphical.admonintion.properties</code></em>
+ and <a href="http://docbook.sourceforge.net/release/xsl/current/doc/fo/graphical.admonition.properties.html"><em class="parameter"><code>graphical.admonition.properties</code></em></a>
+ attribute sets.</p>
+ </li><li class="listitem">
+ <p>Added support for <code class="literal">sidebar-width</code> and
+ <code class="literal">float-type</code> processing instructions in
+ <a href="http://docbook.org/tdg5/en/html/sidebar.html"><code class="sgmltag-element">sidebar</code></a>.</p>
+ </li><li class="listitem">
+ <p>For tables with HTML markup elements, added support
+ for <code class="literal">dbfo bgcolor</code> PI, the attribute-sets
+ named <a href="http://docbook.sourceforge.net/release/xsl/current/doc/fo/table.properties.html"><em class="parameter"><code>table.properties</code></em></a>,
+ <a href="http://docbook.sourceforge.net/release/xsl/current/doc/fo/informaltable.properties.html"><em class="parameter"><code>informaltable.properties</code></em></a>,
+ <a href="http://docbook.sourceforge.net/release/xsl/current/doc/fo/table.table.properties.html"><em class="parameter"><code>table.table.properties</code></em></a>, and
+ <a href="http://docbook.sourceforge.net/release/xsl/current/doc/fo/table.cell.padding.html"><em class="parameter"><code>table.cell.padding</code></em></a>. Also added
+ support for the templates named
+ <em class="parameter"><code>table.cell.properties</code></em> and
+ <em class="parameter"><code>table.cell.block.properties</code></em> so that
+ tabstyles can be implemented. Also added support for tables
+ containing only <a href="http://docbook.org/tdg5/en/html/tr.html"><code class="sgmltag-element">tr</code></a> instead of
+ <a href="http://docbook.org/tdg5/en/html/tbody.html"><code class="sgmltag-element">tbody</code></a> with <a href="http://docbook.org/tdg5/en/html/tr.html"><code class="sgmltag-element">tr</code></a>.</p>
+ </li><li class="listitem">
+ <p>Added new paramater
+ <a href="http://docbook.sourceforge.net/release/xsl/current/doc/fo/hyphenate.verbatim.characters.html"><em class="parameter"><code>hyphenate.verbatim.characters</code></em></a> which
+ can specify characters after which a line break can occur in
+ verbatim environments. This parameter can be used to extend
+ the initial set of characters which contain only space and
+ non-breakable space.</p>
+ </li><li class="listitem">
+ <p>Added <em class="parameter"><code>itemizedlist.label.markup</code></em> to enable
+ selection of different bullet symbol. Also added several
+ potential bullet characters, commented out by default.</p>
+ </li><li class="listitem">
+ <p>Enabled all id's in XEP output for external olinking.</p>
+ </li></ul></div><p>
+
+ </p><div class="itemizedlist" title="HTML"><a name="V1680_HTML"></a><p class="title"><b>HTML</b></p><ul class="itemizedlist" type="disc"><li class="listitem">
+ <p>Added support for
+ <a href="http://docbook.org/tdg5/en/html/refdescriptor.html"><code class="sgmltag-element">refdescriptor</code></a>.</p>
+ </li><li class="listitem">
+ <p>Added support for multiple <a href="http://docbook.org/tdg5/en/html/refnamediv.html"><code class="sgmltag-element">refnamediv</code></a>s.</p>
+ </li><li class="listitem">
+ <p>Added support for <code class="sgmltag-attribute">xml:id</code></p>
+ </li><li class="listitem">
+ <p><a href="http://docbook.org/tdg5/en/html/refsynopsisdiv.html"><code class="sgmltag-element">refsynopsisdiv</code></a> as a section for
+ counting section levels</p>
+ </li></ul></div><p>
+ </p><div class="itemizedlist" title="Images"><a name="V1680_images"></a><p class="title"><b>Images</b></p><ul class="itemizedlist" type="disc"><li class="listitem">
+ <p>Added new SVG admonition graphics and navigation images.</p>
+ </li></ul></div><p>
+ </p>
+ </div>
+
+
+ <div class="sect1" title="Release 1.67.2"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="V1672"></a>Release 1.67.2</h2></div></div></div>
+
+ <p>This release fixes a table bug introduced in the 1.67.1
+ release.</p>
+ </div>
+ <div class="sect1" title="Release 1.67.1"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="V1671"></a>Release 1.67.1</h2></div></div></div>
+
+ <p>This release includes a number of bug fixes.</p>
+ <p>The following lists provide details about API and feature changes.
+ </p><div class="itemizedlist" title="FO"><a name="V1671_FO"></a><p class="title"><b>FO</b></p><ul class="itemizedlist" type="disc"><li class="listitem">
+ <p>Tables: Inherited cell properties are now passed to the
+ <code class="literal">table.cell.properties</code> template so they can
+ be overridden by a customization.</p>
+ </li><li class="listitem">
+ <p>Tables: Added support for bgcolor PI on table row
+ element.</p>
+ </li><li class="listitem">
+ <p>TOCs: Added new parameter
+ <a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/simplesect.in.toc.html"><em class="parameter"><code>simplesect.in.toc</code></em></a>; default value of
+ <code class="literal">0</code> causes simplesect to be omitted from TOCs; to
+ cause <a href="http://docbook.org/tdg5/en/html/simplesect.html"><code class="sgmltag-element">simplesect</code></a> to be included in TOCs, you
+ must set the value of <a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/simplesect.in.toc.html"><em class="parameter"><code>simplesect.in.toc</code></em></a> to
+ <code class="literal">1</code>.Comment from Norm:
+
+ </p><div class="blockquote"><blockquote class="blockquote">
+ <p><span class="emphasis"><em>Simplesect elements aren't supposed to
+ appear in the ToC at all... The use case for simplesect
+ is when, for example, every chapter in a book ends with
+ "Exercises" or "For More Information" sections and you
+ don't want those to appear in the ToC.</em></span></p>
+ </blockquote></div><p>
+ </p>
+ </li><li class="listitem">
+ <p>Sections: Reverted change that caused a variable reference
+ to be used in a template match and rewrote code to preserve
+ intended semantics.</p>
+ </li><li class="listitem">
+ <p>Lists: Added workaround to prevent "* 0.60 + 1em" garbage in
+ list output from PassiveTeX</p>
+ </li><li class="listitem">
+ <p>Moved the literal attributes from
+ <em class="parameter"><code>component.title</code></em> to the
+ <a href="http://docbook.sourceforge.net/release/xsl/current/doc/fo/component.title.properties.html"><em class="parameter"><code>component.title.properties</code></em></a> attribute-set so
+ they can be customized.</p>
+ </li><li class="listitem">
+ <p>Lists: Added <a href="http://docbook.org/tdg5/en/html/glossdef.html"><code class="sgmltag-element">glossdef</code></a>'s first
+ <a href="http://docbook.org/tdg5/en/html/para.html"><code class="sgmltag-element">para</code></a> to special handling in
+ <code class="literal">fo:list-item-body</code>.</p>
+ </li></ul></div><p>
+
+ </p><div class="itemizedlist" title="HTML"><a name="V1671_HTML"></a><p class="title"><b>HTML</b></p><ul class="itemizedlist" type="disc"><li class="listitem">
+ <p>TOCs: Added new parameter
+ <a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/simplesect.in.toc.html"><em class="parameter"><code>simplesect.in.toc</code></em></a>; for details, see
+ the list of <a class="xref" href="#V1671_FO" title="FO">FO</a> changes for this
+ release.</p>
+ </li><li class="listitem">
+ <p>Indexing: Added new parameter
+ <a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/index.prefer.titleabbrev.html"><em class="parameter"><code>index.prefer.titleabbrev</code></em></a>; when set to
+ <code class="literal">1</code>, index references will use
+ <a href="http://docbook.org/tdg5/en/html/titleabbrev.html"><code class="sgmltag-element">titleabbrev</code></a> instead of
+ <a href="http://docbook.org/tdg5/en/html/title.html"><code class="sgmltag-element">title</code></a> when available.</p>
+ </li></ul></div><p>
+ </p><div class="itemizedlist" title="HTML Help"><a name="V1671_HELP"></a><p class="title"><b>HTML Help</b></p><ul class="itemizedlist" type="disc"><li class="listitem">
+ <p>Added support for generating windows-1252-encoded
+ output using Saxon; for more details, see the list of <a class="xref" href="#V1671_EXT" title="XSL Java extensions">XSL Java extensions</a> changes for this release.</p>
+ </li></ul></div><p>
+ </p><div class="itemizedlist" title="man pages"><a name="V1671_MAN"></a><p class="title"><b>man pages</b></p><ul class="itemizedlist" type="disc"><li class="listitem">
+ <p>Replaced named/numeric character-entity references for
+ non-breaking space with groff equivalent (backslash-tilde).</p>
+ </li></ul></div><p>
+ </p><div class="itemizedlist" title="XSL Java extensions"><a name="V1671_EXT"></a><p class="title"><b>XSL Java extensions</b></p><ul class="itemizedlist" type="disc"><li class="listitem">
+ <p>Saxon extensions: Added the
+ <code class="classname">Windows1252</code> class. It extends Saxon
+ 6.5.x with the windows-1252 character set, which is
+ particularly useful when generating HTML Help for Western
+ European Languages (code from
+ <span class="personname"><span class="firstname">Pontus</span> <span class="surname">Haglund</span></span> and contributed to the
+ DocBook community by Sectra AB, Sweden).</p>
+ <p>To use:
+ </p><div class="orderedlist"><ol class="orderedlist" type="1"><li class="listitem">
+ <p>Make sure that the Saxon 6.5.x jar file and the jar file for
+ the DocBook XSL Java extensions are in your <code class="envar">CLASSPATH</code></p>
+ </li><li class="listitem">
+ <p>Create a DocBook XSL customization layer -- a file named
+ <code class="filename">mystylesheet.xsl</code> or whatever -- that, at a
+ minimum, contains the following:
+ </p><pre class="screen"> &lt;xsl:stylesheet
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version='1.0'&gt;
+ &lt;xsl:import href="http://docbook.sourceforge.net/release/xsl/current/htmlhelp/htmlhelp.xsl"/&gt;
+ &lt;xsl:output method="html" encoding="WINDOWS-1252" indent="no"/&gt;
+ &lt;xsl:param name="htmlhelp.encoding" select="'WINDOWS-1252'"&gt;&lt;/xsl:param&gt;
+ &lt;xsl:param name="chunker.output.encoding" select="'WINDOWS-1252'"&gt;&lt;/xsl:param&gt;
+ &lt;xsl:param name="saxon.character.representation" select="'native'"&gt;&lt;/xsl:param&gt;
+ &lt;/xsl:stylesheet&gt;</pre><p>
+ </p>
+ <p>Invoke Saxon with the
+ <code class="literal">encoding.windows-1252</code> Java system property set
+ to <code class="literal">com.nwalsh.saxon.Windows1252</code>; for example
+ </p><pre class="screen"> java \
+ -Dencoding.windows-1252=com.nwalsh.saxon.Windows1252 \
+ com.icl.saxon.StyleSheet \
+ mydoc.xml mystylesheet.xsl</pre><p>
+
+ Or, for a more complete "real world" case showing other
+ options you'll typically want to use:
+ </p><pre class="screen"> java \
+ -Dencoding.windows-1252=com.nwalsh.saxon.Windows1252 \
+ -Djavax.xml.parsers.DocumentBuilderFactory=org.apache.xerces.jaxp.DocumentBuilderFactoryImpl \
+ -Djavax.xml.parsers.SAXParserFactory=org.apache.xerces.jaxp.SAXParserFactoryImpl \
+ -Djavax.xml.transform.TransformerFactory=com.icl.saxon.TransformerFactoryImpl \
+ com.icl.saxon.StyleSheet \
+ -x org.apache.xml.resolver.tools.ResolvingXMLReader \
+ -y org.apache.xml.resolver.tools.ResolvingXMLReader \
+ -r org.apache.xml.resolver.tools.CatalogResolver \
+ mydoc.xml mystylesheet.xsl</pre><p>
+
+ In both cases, the "mystylesheet.xsl" file should be a
+ DocBook customization layer containing the parameters
+ show in step 2.</p>
+ </li></ol></div><p>
+ </p>
+ </li><li class="listitem">
+ <p>Saxon extensions: Removed Saxon 8 extensions from release package</p>
+ </li></ul></div><p>
+ </p>
+ </div>
+<div class="sect1" title="Release 1.67.0"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="V1670"></a>Release 1.67.0</h2></div></div></div>
+
+ <div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
+ <p>A number of important bug fixes.</p>
+ </li><li class="listitem">
+ <p>Added Saxon8 extensions</p>
+ </li><li class="listitem">
+ <p>Enabled <code class="literal">dbfo table-width</code> on
+ <a href="http://docbook.org/tdg5/en/html/entrytbl.html"><code class="sgmltag-element">entrytbl</code></a> in FO output</p>
+ </li><li class="listitem">
+ <p>Added support for <code class="literal">role=strong</code> on
+ <a href="http://docbook.org/tdg5/en/html/emphasis.html"><code class="sgmltag-element">emphasis</code></a> in FO output</p>
+ </li><li class="listitem">
+ <p>Added new FO parameter
+ <a href="http://docbook.sourceforge.net/release/xsl/current/doc/fo/hyphenate.verbatim.html"><em class="parameter"><code>hyphenate.verbatim</code></em></a> that can be used to turn
+ on "intelligent" wrapping of verbatim environments.</p>
+ </li><li class="listitem">
+ <p>Replaced all <code class="literal">&lt;tt&gt;&lt;/tt&gt;</code> output with
+ <code class="literal">&lt;code&gt;&lt;/code&gt;</code></p>
+ </li><li class="listitem">
+ <p>Changed <code class="literal">admon.graphic.width</code> template to a
+ mode so that different admonitions can have different graphical
+ widths.</p>
+ </li><li class="listitem">
+ <p>Deprecated the HTML <a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/shade.verbatim.html"><em class="parameter"><code>shade.verbatim</code></em></a>
+ parameter (use CSS instead)</p>
+ </li><li class="listitem">
+ <p>Wrapped ToC
+ <a href="http://docbook.org/tdg5/en/html/refentrytitle.html"><code class="sgmltag-element">refentrytitle</code></a>/<a href="http://docbook.org/tdg5/en/html/refname.html"><code class="sgmltag-element">refname</code></a> and
+ <a href="http://docbook.org/tdg5/en/html/refpurpose.html"><code class="sgmltag-element">refpurpose</code></a> in span with class values. This
+ makes it possible to style them using a CSS stylesheet.</p>
+ </li><li class="listitem">
+ <p>Use <code class="literal">strong/em</code> instead of
+ <code class="literal">b/i</code> in HTML output</p>
+ </li><li class="listitem">
+ <p>Added support for converting <a href="http://docbook.org/tdg5/en/html/emphasis.html"><code class="sgmltag-element">Emphasis</code></a> to
+ groff italic and <a href="http://docbook.org/tdg5/en/html/emphasis.html"><code class="sgmltag-element">Emphasis role='bold'</code></a> to
+ bold. Controlled by
+ <a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/emphasis.propagates.style.html"><em class="parameter"><code>emphasis.propagates.style</code></em></a> param, but not
+ documented yet using litprog system. Will do that next (planning
+ to add some other parameter-controllable options for hyphenation
+ and handling of line spacing).</p>
+ </li><li class="listitem">
+ <p><em class="parameter"><code>callout.graphics.number.limit.xml</code></em>
+ param: Changed the default from <code class="literal">10</code> to
+ <code class="literal">15</code>.</p>
+ </li><li class="listitem">
+ <p><a href="http://docbook.sourceforge.net/release/xsl/current/doc/fo/verbatim.properties.html"><em class="parameter"><code>verbatim.properties</code></em></a>: Added
+ <code class="literal">hyphenate=false</code></p>
+ </li><li class="listitem">
+ <p>Saxon and Xalan Text.java extensions: Added support for
+ <code class="methodname">URIResolver()</code> on insertfile href's</p>
+ </li><li class="listitem">
+ <p>Added generated <code class="filename">RELEASE-NOTES.txt</code>
+ file.</p>
+ </li><li class="listitem">
+ <p>Added <code class="filename">INSTALL</code> file (executable file for
+ generating catalog.xml)</p>
+ </li><li class="listitem">
+ <p>Removed obsolete <code class="filename">tools</code> directory from
+ package</p>
+ </li></ul></div>
+</div>
+<div class="sect1" title="Release 1.66.1"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="V1661"></a>Release 1.66.1</h2></div></div></div>
+
+ <div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
+<p>A number of important bug fixes.
+</p>
+</li><li class="listitem">
+<p>
+Now <code class="literal">xml:base</code> attributes that are generated by an
+XInclude processor are resolved for image files.
+</p>
+</li><li class="listitem">
+<p>
+Rewrote olink templates to support several new features.
+</p>
+<div class="itemizedlist"><ul class="itemizedlist" type="circle"><li class="listitem">
+<p>
+Extended full olink support to FO output.
+</p>
+</li><li class="listitem">
+<p>
+Add support for <code class="literal">xrefstyle</code> attribute in olinks.
+</p>
+</li><li class="listitem">
+<p>
+New parameters to support new olink features:
+<a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/insert.olink.page.number.html"><em class="parameter"><code>insert.olink.page.number</code></em></a>, <a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/insert.olink.pdf.frag.html"><em class="parameter"><code>insert.olink.pdf.frag</code></em></a>,
+<a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/olink.debug.html"><em class="parameter"><code>olink.debug</code></em></a>, <a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/olink.lang.fallback.sequence.html"><em class="parameter"><code>olink.lang.fallback.sequence</code></em></a>, <a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/olink.properties.html"><em class="parameter"><code>olink.properties</code></em></a>,
+<a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/prefer.internal.olink.html"><em class="parameter"><code>prefer.internal.olink</code></em></a>.
+See the reference page for each parameter for more
+information.</p>
+</li></ul></div>
+</li><li class="listitem">
+<p>
+Added <a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/index.on.type.html"><em class="parameter"><code>index.on.type</code></em></a> parameter for new <code class="sgmltag-attribute">type</code>
+attribute introduced in DocBook 4.3 for indexterms and index.
+This allows you to create multiple indices containing
+different categories of entries.
+For users of 4.2 and earlier, you can use the new parameter <a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/index.on.role.html"><em class="parameter"><code>index.on.role</code></em></a>
+instead.
+</p>
+</li><li class="listitem">
+<p>
+Added new
+<a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/section.autolabel.max.depth.html"><em class="parameter"><code>section.autolabel.max.depth</code></em></a> parameter to turn off section numbering
+below a certain depth.
+This permits you to number major section levels and leave minor
+section levels unnumbered.</p>
+</li><li class="listitem">
+<p>
+Added <a href="http://docbook.sourceforge.net/release/xsl/current/doc/fo/footnote.sep.leader.properties.html"><em class="parameter"><code>footnote.sep.leader.properties</code></em></a> attribute set to format
+the line separating footnotes in printed output.
+</p>
+</li><li class="listitem">
+<p>
+Added parameter <a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/img.src.path.html"><em class="parameter"><code>img.src.path</code></em></a> as a prefix to HTML img src
+attributes.
+The prefix is added to whatever path is already generated by the
+stylesheet for each image file.</p>
+</li><li class="listitem">
+<p>
+Added new attribute-sets
+<a href="http://docbook.sourceforge.net/release/xsl/current/doc/fo/informalequation.properties.html"><em class="parameter"><code>informalequation.properties</code></em></a>,
+<a href="http://docbook.sourceforge.net/release/xsl/current/doc/fo/informalexample.properties.html"><em class="parameter"><code>informalexample.properties</code></em></a>,
+<a href="http://docbook.sourceforge.net/release/xsl/current/doc/fo/informalfigure.properties.html"><em class="parameter"><code>informalfigure.properties</code></em></a>, and <a href="http://docbook.sourceforge.net/release/xsl/current/doc/fo/informaltable.properties.html"><em class="parameter"><code>informaltable.properties</code></em></a>,
+so each such element type can be formatted
+individually if needed.
+</p>
+</li><li class="listitem">
+<p>
+Add <a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/component.label.includes.part.label.html"><em class="parameter"><code>component.label.includes.part.label</code></em></a>
+parameter to add any part number to chapter, appendix
+and other component labels when
+the <a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/label.from.part.html"><em class="parameter"><code>label.from.part</code></em></a> parameter is nonzero.
+This permits you to distinguish multiple chapters with the same
+chapter number in cross references and the TOC.</p>
+</li><li class="listitem">
+<p>
+Added <a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/chunk.separate.lots.html"><em class="parameter"><code>chunk.separate.lots</code></em></a> parameter for HTML output.
+This parameter lets you generate separate chunk files for each LOT
+(list of tables, list of figures, etc.).</p>
+</li><li class="listitem">
+<p>Added several table features:</p>
+<div class="itemizedlist"><ul class="itemizedlist" type="circle"><li class="listitem">
+<p>
+Added <a href="http://docbook.sourceforge.net/release/xsl/current/doc/fo/table.table.properties.html"><em class="parameter"><code>table.table.properties</code></em></a> attribute set to add
+properties to the fo:table element.
+</p>
+</li><li class="listitem">
+<p>
+Added placeholder templates named <code class="literal">table.cell.properties</code>
+and <code class="literal">table.cell.block.properties</code> to enable adding properties
+to any <code class="sgmltag-element">fo:table-cell</code> or the cell's <code class="sgmltag-element">fo:block</code>, respectively.
+ These templates are a start for implementing table styles.</p>
+</li></ul></div>
+</li><li class="listitem">
+<p>
+Added new attribute
+set <a href="http://docbook.sourceforge.net/release/xsl/current/doc/fo/component.title.properties.html"><em class="parameter"><code>component.title.properties</code></em></a> for easy modifications of
+component's title formatting in FO output.
+</p>
+</li><li class="listitem">
+<p>
+Added Saxon support for an <code class="sgmltag-attribute">encoding</code> attribute on the <a href="http://docbook.org/tdg5/en/html/textdata.html"><code class="sgmltag-element">textdata</code></a> element. Added new parameter
+<a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/textdata.default.encoding.html"><em class="parameter"><code>textdata.default.encoding</code></em></a> which specifies encoding when
+<code class="sgmltag-attribute">encoding</code> attribute on
+<a href="http://docbook.org/tdg5/en/html/textdata.html"><code class="sgmltag-element">textdata</code></a> is missing.
+</p>
+</li><li class="listitem">
+<p>
+Template <code class="literal">label.this.section</code> now controls whole
+section label, not only sub-label which corresponds to
+particular label. Former behaviour was IMHO bug as it was
+not usable.
+</p>
+</li><li class="listitem">
+<p>
+Formatting in titleabbrev for TOC and headers
+is preserved when there are no hotlink elements in the title. Formerly the title showed only the text of the title, no font changes or other markup.
+</p>
+</li><li class="listitem">
+<p>
+Added <code class="literal">intial.page.number</code> template to set the <code class="literal">initial-page-number
+property</code> for page sequences in print output.
+Customizing this template lets you change when page numbering restarts. This is similar to the <code class="literal">format.page.number</code> template that lets you change how the page number formatting changes in the output.
+</p>
+</li><li class="listitem">
+<p>
+Added <code class="literal">force.page.count</code> template to set the force-page-count
+property for page sequences in print output.
+This is similar to the <code class="literal">format.page.number</code> template.
+</p>
+</li><li class="listitem">
+<p>
+Sort language for localized index sorting in <code class="filename">autoidx-ng.xsl</code> is now taken from document
+lang, not from system environment.
+</p>
+</li><li class="listitem">
+<p>
+Numbering and formatting of normal
+and ulink footnotes (if turned on) has been unified.
+Now ulink footnotes are mixed in with any other footnotes.</p>
+</li><li class="listitem">
+<p>
+Added support for <code class="sgmltag-element">renderas</code> attribute in section and
+sect1 et al.
+This permits you to render a given section title as if it were a different level.</p>
+</li><li class="listitem">
+<p>
+Added support for <a href="http://docbook.org/tdg5/en/html/label.html"><code class="sgmltag-element">label</code></a> attribute in footnote to manually
+supply the footnote mark.
+</p>
+</li><li class="listitem">
+<p>
+Added support for DocBook 4.3 <code class="sgmltag-element">corpcredit</code> element.
+</p>
+</li><li class="listitem">
+<p>
+Added support for a <code class="literal">dbfo keep-together</code> PI for
+formal objects (table, figure, example, equation, programlisting). That permits a formal object to be kept together if it is not already, or to be broken if it
+is very long and the
+default keep-together is not appropriate.
+</p>
+</li><li class="listitem">
+<p>
+For graphics files, made file extension matching case
+insensitive, and updated the list of graphics extensions.
+</p>
+</li><li class="listitem">
+<p>
+Allow <a href="http://docbook.org/tdg5/en/html/calloutlist.html"><code class="sgmltag-element">calloutlist</code></a> to have block content before
+the first callout
+</p>
+</li><li class="listitem">
+<p>
+Added <code class="literal">dbfo-need</code> processing instruction to provide
+soft page breaks.
+</p>
+</li><li class="listitem">
+<p>
+Added implementation of existing but unused
+<a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/default.image.width.html"><em class="parameter"><code>default.image.width</code></em></a> parameter for graphics.
+</p>
+</li><li class="listitem">
+<p>
+Support DocBook NG <a href="http://docbook.org/tdg5/en/html/tag.html"><code class="sgmltag-element">tag</code></a> inline element.
+</p>
+</li><li class="listitem">
+<p>
+It appears that XEP now supports Unicode characters in
+bookmarks. There is no further need to strip accents from
+characters.
+</p>
+</li><li class="listitem">
+<p>
+Make <a href="http://docbook.org/tdg5/en/html/segmentedlist.html"><code class="sgmltag-element">segmentedlist</code></a> HTML markup
+more semantic and available to CSS styles.
+</p>
+</li><li class="listitem">
+<p>
+Added <code class="literal">user.preroot</code> placeholder template to
+permit xsl-stylesheet and other PIs and comments to be
+output before the HTML root element.
+</p>
+</li><li class="listitem">
+<p>
+Non-chunked legalnotice now gets an &lt;a
+name="id"&gt; element in HTML output
+so it can be referenced with xref or link.
+</p>
+</li><li class="listitem">
+<p>
+In chunked HTML output, changed <code class="literal">link rel="home"</code> to <code class="literal">rel="start"</code>,
+and <code class="literal">link rel="previous"</code> to <code class="literal">rel="prev"</code>, per W3C HTML 4.01
+spec.
+</p>
+</li><li class="listitem">
+<p>
+Added several patches to htmlhelp from W. Borgert
+</p>
+</li><li class="listitem">
+<p>
+Added Bosnian locale file as common/bs.xml.
+</p>
+</li></ul></div>
+</div>
+<div class="sect1" title="Release 1.65.0"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="V1650"></a>Release 1.65.0</h2></div></div></div>
+
+<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
+<p>A number of important bug fixes.
+</p>
+</li><li class="listitem">
+<p>Added a workaround to allow these stylesheets to process DocBook NG
+documents. (It&#8217;s a hack that pre-processes the document to strip off the
+namespace and then uses <code class="function">exsl:node-set</code> to process
+the result.)
+</p>
+</li><li class="listitem">
+<p>Added alternative indexing mechanism which has better
+internationalization support. New indexing method allows grouping of
+accented letters like e, é, ë into the same group under letter "e". It
+can also treat special letters (e.g. "ch") as one character and place
+them in the correct position (e.g. between "h" and "i" in Czech
+language).</p>
+<p>In order to use this mechanism you must create customization
+layer which imports some base stylesheet (like
+<code class="filename">fo/docbook.xsl</code>,
+<code class="filename">html/chunk.xsl</code>) and then includes appropriate
+stylesheet with new indexing code
+(<code class="filename">fo/autoidx-ng.xsl</code> or
+<code class="filename">html/autoidx-ng.xsl</code>). For example:</p>
+<pre class="programlisting">&lt;xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="1.0"&gt;
+
+&lt;xsl:import href="http://docbook.sourceforge.net/release/xsl/current/fo/docbook.xsl"/&gt;
+&lt;xsl:include href="http://docbook.sourceforge.net/release/xsl/current/fo/autoidx-ng.xsl"/&gt;
+
+&lt;/xsl:stylesheet&gt;</pre>
+<p>New method is known to work with Saxon and it should also work
+with xsltproc 1.1.1 and later. Currently supported languages are
+English, Czech, German, French, Spanish and Danish.</p>
+</li></ul></div>
+</div>
+<div class="sect1" title="Release 1.64.1"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="V1641"></a>Release 1.64.1</h2></div></div></div>
+
+<div class="itemizedlist"><p>General bug fixes and improvements. Sorry about the failure to produce
+an updated release notes file for 1.62.0&#8212;1.63.2</p><ul class="itemizedlist" type="disc"><li class="listitem">
+<p>In the course of fixing bug #849787, wrapping Unicode callouts
+with an appropriate font change in the Xalan extensions, I discovered
+that the Xalan APIs have changed a bit. So <code class="filename">xalan2.jar</code>
+will work with older Xalan 2 implementations, <code class="filename">xalan25.jar</code>
+works with Xalan 2.5.</p>
+</li></ul></div>
+</div>
+<div class="sect1" title="Release 1.61.0"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="V1610"></a>Release 1.61.0</h2></div></div></div>
+
+<div class="itemizedlist"><p>Lots of bug fixes and improvements.</p><ul class="itemizedlist" type="disc"><li class="listitem">
+<p>Initial support for timestamp PI. From now you
+ can use &lt;?dbtimestamp format="Y-m-d H:M:S"?&gt; to get current
+ datetime in your document. Added localization support for datetime PI
+</p>
+</li><li class="listitem">
+<p>Added level 6 to test for <a href="http://docbook.org/tdg5/en/html/section.html"><code class="sgmltag-element">section</code></a> depth in
+section.level template so that
+section.title.level6.properties will be used for sections
+that are 6 deep or deeper. This should also cause a h6 to be
+created in html output.
+</p>
+</li><li class="listitem">
+<p>Don't use SVG graphics if <a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/use.svg.html"><em class="parameter"><code>use.svg</code></em></a>=0
+</p>
+</li><li class="listitem">
+<p>Now uses number-and-title-template for sections
+ only if <a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/section.autolabel.html"><em class="parameter"><code>section.autolabel</code></em></a> is not zero.
+</p>
+</li><li class="listitem">
+<p>Added missing 'english-language-name' attribute to
+the l10n element, and the missing 'style' attribute to the
+template element so the current gentext documents will
+validate.
+</p>
+</li><li class="listitem">
+<p>Corrected several references to parameter
+ <a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/qanda.defaultlabel.html"><em class="parameter"><code>qanda.defaultlabel</code></em></a> that were missing the "$".
+</p>
+</li><li class="listitem">
+<p>Now accepts <a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/admon.textlabel.html"><em class="parameter"><code>admon.textlabel</code></em></a> parameter to turn off
+ Note, Warning, etc. label.
+</p>
+</li><li class="listitem">
+<p>FeatReq #684561: support more XEP metadata
+</p>
+</li><li class="listitem">
+<p>Added hyphenation support. Added support for <a href="http://docbook.org/tdg5/en/html/coref.html"><code class="sgmltag-element">coref</code></a>.
+Added <code class="sgmltag-element">beginpage</code> support. (does nothing; see TDG).
+</p>
+</li><li class="listitem">
+<p>Added support for
+hyphenation-character, hyphenation-push-character-count, and
+hyphenation-remain-character-count
+</p>
+</li><li class="listitem">
+<p>Added <a href="http://docbook.sourceforge.net/release/xsl/current/doc/fo/root.properties.html"><em class="parameter"><code>root.properties</code></em></a>,
+<a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/ebnf.assignment.html"><em class="parameter"><code>ebnf.assignment</code></em></a>,
+and <a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/ebnf.statement.terminator.html"><em class="parameter"><code>ebnf.statement.terminator</code></em></a>
+</p>
+</li><li class="listitem">
+<p>Support bgcolor PI in table cells; make sure
+rowsep and colsep don't have any effect on the last row or
+column
+</p>
+</li><li class="listitem">
+<p>Handle <a href="http://docbook.org/tdg5/en/html/othercredit.html"><code class="sgmltag-element">othercredit</code></a> on titlepage a little
+better
+</p>
+</li><li class="listitem">
+<p>Applied fix from Jeff Beal that fixed the bug
+that put secondary page numbers on primary entries. Same
+with tertiary page numbers on secondary entries.
+</p>
+</li><li class="listitem">
+<p>Added definition of missing variable
+<em class="parameter"><code>collection</code></em>.
+</p>
+</li><li class="listitem">
+<p>Make <a href="http://docbook.org/tdg5/en/html/footnote.html"><code class="sgmltag-element">footnote</code></a> formatting 'normal' even when it
+occurs in a context that has special formatting
+</p>
+</li><li class="listitem">
+<p>Added warning when <a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/glossary.collection.html"><em class="parameter"><code>glossary.collection</code></em></a> is not
+blank, but it cannot open the specified file.
+</p>
+</li><li class="listitem">
+<p>Pick up the frame attribute on <a href="http://docbook.org/tdg5/en/html/table.html"><code class="sgmltag-element">table</code></a> and
+<a href="http://docbook.org/tdg5/en/html/informaltable.html"><code class="sgmltag-element">informaltable</code></a>.
+</p>
+</li><li class="listitem">
+<p><a href="http://docbook.org/tdg5/en/html/indexdiv.html"><code class="sgmltag-element">indexdiv</code></a>/<a href="http://docbook.org/tdg5/en/html/title.html"><code class="sgmltag-element">title</code></a>
+in non-autogenerated indexes are
+now picked up.
+</p>
+</li><li class="listitem">
+<p>Removed (unused)
+component.title.properties
+</p>
+</li><li class="listitem">
+<p>Move IDs from
+page-sequences down to titlepage blocks
+</p>
+</li><li class="listitem">
+<p>Use
+proportional-column-width(1) on more <a href="http://docbook.org/tdg5/en/html/table.html"><code class="sgmltag-element">table</code></a>s.
+</p>
+<p>Use proportional-column-width() for
+header/footer tables; suppress relative-align when when
+using FOP
+</p>
+</li><li class="listitem">
+<p>Check for <a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/glossterm.auto.link.html"><em class="parameter"><code>glossterm.auto.link</code></em></a> when linking
+firstterms; don't output gl. prefix on glossterm links
+</p>
+</li><li class="listitem">
+<p>Generate Part ToCs
+</p>
+</li><li class="listitem">
+<p>Support <a href="http://docbook.org/tdg5/en/html/glossary.html"><code class="sgmltag-element">glossary</code></a>, <a href="http://docbook.org/tdg5/en/html/bibliography.html"><code class="sgmltag-element">bibliography</code></a>,
+and <a href="http://docbook.org/tdg5/en/html/index.html"><code class="sgmltag-element">index</code></a> in component ToCs.
+</p>
+</li><li class="listitem">
+<p>Refactored chunking code so that
+customization of chunk algorithm and chunk elements is more
+practical
+</p>
+</li><li class="listitem">
+<p>Support <a href="http://docbook.org/tdg5/en/html/textobject.html"><code class="sgmltag-element">textobject</code></a>/<a href="http://docbook.org/tdg5/en/html/phrase.html"><code class="sgmltag-element">phrase</code></a>
+on <a href="http://docbook.org/tdg5/en/html/inlinemediaobject.html"><code class="sgmltag-element">inlinemediaobject</code></a>.
+</p>
+</li><li class="listitem">
+<p>Support 'start' PI on ordered lists
+</p>
+</li><li class="listitem">
+<p>Fixed test of $toc PI to turn on qandaset TOC.
+</p>
+</li><li class="listitem">
+<p>Added process.chunk.footnotes to sect2 through
+5 to fix bug of missing footnotes when chunk level greater
+than 1.
+</p>
+</li><li class="listitem">
+<p>Added
+paramater <a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/toc.max.depth.html"><em class="parameter"><code>toc.max.depth</code></em></a> which controls maximal depth of ToC
+as requested by PHP-DOC group.
+</p>
+</li><li class="listitem">
+<p>Exempted <a href="http://docbook.org/tdg5/en/html/titleabbrev.html"><code class="sgmltag-element">titleabbrev</code></a> from preamble processing in
+lists, and fixed variablelist preamble code to use the same
+syntax as the other lists.
+</p>
+</li><li class="listitem">
+<p>Added support for elements between variablelist
+and first varlistentry since DocBook 4.2 supports that now.
+</p>
+</li></ul></div>
+</div>
+<div class="sect1" title="Release 1.60.1"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="V1601"></a>Release 1.60.1</h2></div></div></div>
+
+<div class="itemizedlist"><p>Lots of bug fixes.</p><ul class="itemizedlist" type="disc"><li class="listitem">
+<p>The format of the <code class="filename">titlepage.templates.xml</code> files and
+the stylesheet that transforms them have been significantly changed. All of the
+attributes used to control the templates are now namespace qualified. So what
+used to be:</p>
+<pre class="programlisting">&lt;t:titlepage element="article" wrapper="fo:block"&gt;</pre>
+<p>is now:</p>
+<pre class="programlisting">&lt;t:titlepage t:element="article" t:wrapper="fo:block"&gt;</pre>
+<p>Attributes from other namespaces (including those that are unqualified) are
+now copied directly through. In practice, this means that the names that used
+to be <span class="quote">&#8220;<span class="quote">fo:</span>&#8221;</span> qualified:</p>
+<pre class="programlisting">&lt;title named-template="component.title"
+ param:node="ancestor-or-self::article[1]"
+ fo:text-align="center"
+ fo:keep-with-next="always"
+ fo:font-size="&amp;hsize5;"
+ fo:font-weight="bold"
+ fo:font-family="{$title.font.family}"/&gt;</pre>
+<p>are now unqualified:</p>
+<pre class="programlisting">&lt;title t:named-template="component.title"
+ param:node="ancestor-or-self::article[1]"
+ text-align="center"
+ keep-with-next="always"
+ font-size="&amp;hsize5;"
+ font-weight="bold"
+ font-family="{$title.font.family}"/&gt;</pre>
+<p>The <code class="sgmltag-element">t:titlepage</code> and <code class="sgmltag-element">t:titlepage-content</code>
+elements both generate wrappers now. And unqualified attributes on those elements
+are passed through. This means that you can now make the title font apply to
+ane entire titlepage and make the entire <span class="quote">&#8220;<span class="quote">recto</span>&#8221;</span>
+titlepage centered by specifying the font and alignment on the those elements:</p>
+<pre class="programlisting">&lt;t:titlepage t:element="article" t:wrapper="fo:block"
+ font-family="{$title.font.family}"&gt;
+
+ &lt;t:titlepage-content t:side="recto"
+ text-align="center"&gt;</pre>
+
+
+
+
+
+</li><li class="listitem">
+<p>Support use of <a href="http://docbook.org/tdg5/en/html/titleabbrev.html"><code class="sgmltag-element">titleabbrev</code></a> in running
+headers and footers.
+</p>
+</li><li class="listitem">
+<p>Added (experimental) <a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/xref.with.number.and.title.html"><em class="parameter"><code>xref.with.number.and.title</code></em></a>
+parameter to enable number/title cross references even when the
+default would
+be just the number.
+</p>
+</li><li class="listitem">
+<p>Generate <a href="http://docbook.org/tdg5/en/html/part.html"><code class="sgmltag-element">part</code></a> ToCs if they're requested.
+</p>
+</li><li class="listitem">
+<p>Use proportional-column-width() in header/footer tables.
+</p>
+</li><li class="listitem">
+<p>Handle alignment correctly when <a href="http://docbook.org/tdg5/en/html/screenshot.html"><code class="sgmltag-element">screenshot</code></a>
+wraps a graphic in a <a href="http://docbook.org/tdg5/en/html/figure.html"><code class="sgmltag-element">figure</code></a>.
+</p>
+</li><li class="listitem">
+<p>Format <a href="http://docbook.org/tdg5/en/html/chapter.html"><code class="sgmltag-element">chapter</code></a> and <a href="http://docbook.org/tdg5/en/html/appendix.html"><code class="sgmltag-element">appendix</code></a>
+cross references consistently.
+</p>
+</li><li class="listitem">
+<p>Attempt to support tables with multiple <a href="http://docbook.org/tdg5/en/html/tgroup.html"><code class="sgmltag-element">tgroup</code></a>s
+in FO.
+</p>
+</li><li class="listitem">
+<p>Output <code class="sgmltag-element">fo:table-columns</code> in
+<a href="http://docbook.org/tdg5/en/html/simplelist.html"><code class="sgmltag-element">simplelist</code></a> tables.
+</p>
+</li><li class="listitem">
+<p>Use <code class="filename">titlepage.templates.xml</code> for
+<a href="http://docbook.org/tdg5/en/html/indexdiv.html"><code class="sgmltag-element">indexdiv</code></a> and <a href="http://docbook.org/tdg5/en/html/glossdiv.html"><code class="sgmltag-element">glossdiv</code></a> formatting.
+</p>
+</li><li class="listitem">
+<p>Improve support for new bibliography elements.
+</p>
+</li><li class="listitem">
+<p>Added
+<a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/footnote.number.format.html"><em class="parameter"><code>footnote.number.format</code></em></a>,
+<a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/table.footnote.number.format.html"><em class="parameter"><code>table.footnote.number.format</code></em></a>,
+<a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/footnote.number.symbols.html"><em class="parameter"><code>footnote.number.symbols</code></em></a>, and
+<a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/table.footnote.number.symbols.html"><em class="parameter"><code>table.footnote.number.symbols</code></em></a> for better control of
+footnote markers.
+</p>
+</li><li class="listitem">
+<p>Added <code class="sgmltag-element">glossentry.show.acronyms</code>.
+</p>
+</li><li class="listitem">
+<p>Suppress the draft-mode page masters when
+<em class="parameter"><code>draft-mode</code></em> is <span class="quote">&#8220;<span class="quote">no</span>&#8221;</span>.
+</p>
+</li><li class="listitem">
+<p>Make blank pages verso not recto. D'Oh!
+</p>
+</li><li class="listitem">
+<p>Improved formatting of <code class="sgmltag-element">ulink</code> footnotes.
+</p>
+</li><li class="listitem">
+<p>Fixed bugs in graphic width/height calculations.
+</p>
+</li><li class="listitem">
+<p>Added class attributes to inline elements.
+</p>
+</li><li class="listitem">
+<p>Don't add <span class="quote">&#8220;<span class="quote">.html</span>&#8221;</span> to the filenames identified
+with the <span class="quote">&#8220;<span class="quote">dbhtml</span>&#8221;</span> PI.
+</p>
+</li><li class="listitem">
+<p>Don't force a ToC when sections contain <a href="http://docbook.org/tdg5/en/html/refentry.html"><code class="sgmltag-element">refentry</code></a>s.
+</p>
+</li><li class="listitem">
+<p>Make section title sizes a function of the
+<em class="parameter"><code>body.master.size</code></em>.
+</p>
+</li></ul></div>
+</div>
+<div class="sect1" title="Release 1.59.2"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="V1592"></a>Release 1.59.2</h2></div></div></div>
+
+<div class="itemizedlist"><p>The 1.59.2 fixes an FO bug in the page masters that causes FOP to fail.
+</p><ul class="itemizedlist" type="disc"><li class="listitem">
+<p>Removed the region-name from the region-body of blank pages. There's
+no reason to give the body of blank pages a unique name and doing so causes
+a mismatch that FOP detects.
+</p>
+</li><li class="listitem">
+<p>Output IDs for the first paragraphs in listitems.
+</p>
+</li><li class="listitem">
+<p>Fixed some small bugs in the handling of page numbers in double-sided mode.
+</p>
+</li><li class="listitem">
+<p>Attempt to prevent duplicated IDs from being produced when
+<code class="sgmltag-attribute">endterm</code> on <a href="http://docbook.org/tdg5/en/html/xref.html"><code class="sgmltag-element">xref</code></a> points
+to something with nested structure.
+</p>
+</li><li class="listitem">
+<p>Fix aligment problems in <a href="http://docbook.org/tdg5/en/html/equation.html"><code class="sgmltag-element">equation</code></a>s.
+</p>
+</li><li class="listitem">
+<p>Output the type attribute on unordered lists (UL) in HTML only if
+the css.decoration parameter is true.
+</p>
+</li><li class="listitem">
+<p>Calculate the font size in formal.title.properties so that it's 1.2 times
+the base font size, not a fixed "12pt".
+</p>
+</li></ul></div>
+</div>
+<div class="sect1" title="Release 1.59.1"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="V1591"></a>Release 1.59.1</h2></div></div></div>
+
+<div class="itemizedlist"><p>The 1.59.1 fixes a few bugs.
+</p><ul class="itemizedlist" type="disc"><li class="listitem">
+<p>Added Bulgarian localization.
+</p>
+</li><li class="listitem">
+<p>Indexing improvements; localize book indexes to books but allow setindex
+to index an entire set.
+</p>
+</li><li class="listitem">
+<p>The default value for rowsep and colsep is now "1" as per CALS.
+</p>
+</li><li class="listitem">
+<p>Added support for <a href="http://docbook.org/tdg5/en/html/titleabbrev.html"><code class="sgmltag-element">titleabbrev</code></a> (use them for cross
+references).
+</p>
+</li><li class="listitem">
+<p>Improvements to <a href="http://docbook.org/tdg5/en/html/mediaobject.html"><code class="sgmltag-element">mediaobject</code></a> for selecting print vs. online
+images.
+</p>
+</li><li class="listitem">
+<p>Added seperate property sets for <a href="http://docbook.org/tdg5/en/html/figure.html"><code class="sgmltag-element">figure</code></a>s,
+<a href="http://docbook.org/tdg5/en/html/example.html"><code class="sgmltag-element">example</code></a>s, <a href="http://docbook.org/tdg5/en/html/equation.html"><code class="sgmltag-element">equation</code></a>s, <code class="sgmltag-element">tables</code>s,
+and <a href="http://docbook.org/tdg5/en/html/procedure.html"><code class="sgmltag-element">procedure</code></a>s.
+</p>
+</li><li class="listitem">
+<p>Make <a href="http://docbook.org/tdg5/en/html/lineannotation.html"><code class="sgmltag-element">lineannotation</code></a>s italic.
+</p>
+</li><li class="listitem">
+<p>Support <code class="sgmltag-attribute">xrefstyle</code> attribute.
+</p>
+</li><li class="listitem">
+<p>Make <code class="sgmltag-attribute">endterm</code> on
+<a href="http://docbook.org/tdg5/en/html/xref.html"><code class="sgmltag-element">xref</code></a> higher priority than
+<code class="sgmltag-attribute">xreflabel</code> target.
+</p>
+</li><li class="listitem">
+<p>Glossary formatting improvements.
+</p>
+</li></ul></div>
+</div>
+<div class="sect1" title="Release 1.58.0"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="V1580"></a>Release 1.58.0</h2></div></div></div>
+
+<div class="itemizedlist"><p>The 1.58.0 adds some initial support for extensions in xsltproc, adds
+a few features, and fixes bugs.
+</p><ul class="itemizedlist" type="disc"><li class="listitem">
+<p>This release contains the first attempt at extension support for xsltproc.
+The only extension available to date is the one that adjusts table column widths.
+Run <code class="filename">extensions/xsltproc/python/xslt.py</code>.
+</p>
+</li><li class="listitem">
+<p>Fixed bugs in calculation of adjusted column widths to correct for rounding
+errors.
+</p>
+</li><li class="listitem">
+<p>Support nested <a href="http://docbook.org/tdg5/en/html/refsection.html"><code class="sgmltag-element">refsection</code></a> elements correctly.
+</p>
+</li><li class="listitem">
+<p>Reworked <code class="literal">gentext.template</code> to take context into consideration.
+The name of elements in localization files is now an xpath-like context list, not
+just a simple name.
+</p>
+</li><li class="listitem">
+<p>Made some improvements to bibliography formatting.
+</p>
+</li><li class="listitem">
+<p>Improved graphical formatting of admonitions.
+</p>
+</li><li class="listitem">
+<p>Added support for <a href="http://docbook.org/tdg5/en/html/entrytbl.html"><code class="sgmltag-element">entrytbl</code></a>.
+</p>
+</li><li class="listitem">
+<p>Support spanning index terms.
+</p>
+</li><li class="listitem">
+<p>Support <a href="http://docbook.org/tdg5/en/html/bibliosource.html"><code class="sgmltag-element">bibliosource</code></a>.
+</p>
+</li></ul></div>
+</div>
+<div class="sect1" title="Release 1.57.0"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="V1570"></a>Release 1.57.0</h2></div></div></div>
+
+<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
+<p>The 1.57.0 release wasn't documented here. Oops.
+</p>
+</li></ul></div>
+</div>
+<div class="sect1" title="Release 1.56.0"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="V1560"></a>Release 1.56.0</h2></div></div></div>
+
+<div class="itemizedlist"><p>The 1.56.0 release fixes bugs.
+</p><ul class="itemizedlist" type="disc"><li class="listitem">
+<p>Reworked chunking. <span class="emphasis"><em>This will break all existing customizations
+layers that change the chunking algorithm.</em></span> If you're customizing chunking,
+look at the new <span class="quote">&#8220;<span class="quote">content</span>&#8221;</span> parameter that's passed to
+<code class="literal">process-chunk-element</code> and friends.
+</p>
+</li><li class="listitem">
+<p>Support continued and inherited numeration in <a href="http://docbook.org/tdg5/en/html/orderedlist.html"><code class="sgmltag-element">orderedlist</code></a>
+formatting for FOs.
+</p>
+</li><li class="listitem">
+<p>Added Thai localization.
+</p>
+</li><li class="listitem">
+<p>Tweaked stylesheet documentation stylesheets to link to TDG and
+the parameter references.
+</p>
+</li><li class="listitem">
+<p>Allow title on tables of contents ("Table of Contents") to be optional.
+Added new keyword to <a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/generate.toc.html"><em class="parameter"><code>generate.toc</code></em></a>.
+Support tables of contents on sections.
+</p>
+</li><li class="listitem">
+<p>Made separate parameters for table borders and table cell borders:
+<a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/table.frame.border.color.html"><em class="parameter"><code>table.frame.border.color</code></em></a>,
+<a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/table.frame.border.style.html"><em class="parameter"><code>table.frame.border.style</code></em></a>,
+<a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/table.frame.border.thickness.html"><em class="parameter"><code>table.frame.border.thickness</code></em></a>,
+<a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/table.cell.border.color.html"><em class="parameter"><code>table.cell.border.color</code></em></a>,
+<a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/table.cell.border.style.html"><em class="parameter"><code>table.cell.border.style</code></em></a>, and
+<a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/table.cell.border.thickness.html"><em class="parameter"><code>table.cell.border.thickness</code></em></a>.
+</p>
+</li><li class="listitem">
+<p>Suppress formatting of <span class="quote">&#8220;<span class="quote">endofrange</span>&#8221;</span> <a href="http://docbook.org/tdg5/en/html/indexterm.html"><code class="sgmltag-element">indexterm</code></a>s.
+This is only half-right. They should generate a range, but I haven't figured out how
+to do that yet.
+</p>
+</li><li class="listitem">
+<p>Support <a href="http://docbook.org/tdg5/en/html/revdescription.html"><code class="sgmltag-element">revdescription</code></a>. (Bug #582192)
+</p>
+</li><li class="listitem">
+<p>Added <a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/default.float.class.html"><em class="parameter"><code>default.float.class</code></em></a> and fixed figure
+floats. (Bug #497603)
+</p>
+</li><li class="listitem">
+<p>Fixed formatting of <a href="http://docbook.org/tdg5/en/html/sbr.html"><code class="sgmltag-element">sbr</code></a> in FOs.
+</p>
+</li><li class="listitem">
+<p>Added context to the <span class="quote">&#8220;<span class="quote">missing template</span>&#8221;</span> error message.
+</p>
+</li><li class="listitem">
+<p>Process <a href="http://docbook.org/tdg5/en/html/arg.html"><code class="sgmltag-element">arg</code></a> correctly in a <a href="http://docbook.org/tdg5/en/html/group.html"><code class="sgmltag-element">group</code></a>.
+(Bug #605150)
+</p>
+</li><li class="listitem">
+<p>Removed 'keep-with-next' from <a href="http://docbook.sourceforge.net/release/xsl/current/doc/fo/formal.title.properties.html"><em class="parameter"><code>formal.title.properties</code></em></a>
+attribute set now that the stylesheets support the option of putting
+such titles below the object. Now the $placement value determines if
+'keep-with-next' or 'keep-with-previous' is used in the title block.
+</p>
+</li><li class="listitem">
+<p>Wrap <span class="quote">&#8220;<span class="quote">url()</span>&#8221;</span> around external-destinations when appropriate.
+</p>
+</li><li class="listitem">
+<p>Fixed typo in compact list spacing. (Bug #615464)
+</p>
+</li><li class="listitem">
+<p>Removed spurious hash in anchor name. (Bug #617717)
+</p>
+</li><li class="listitem">
+<p>Address is now displayed verbatim on title pages. (Bug #618600)
+</p>
+</li><li class="listitem">
+<p>The <a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/bridgehead.in.toc.html"><em class="parameter"><code>bridgehead.in.toc</code></em></a> parameter is now properly
+supported.
+</p>
+</li><li class="listitem">
+<p>Improved effectiveness of HTML cleanup by increasing the number
+of places where it is used. Improve use of HTML cleanup in XHTML stylesheets.
+</p>
+</li><li class="listitem">
+<p>Support table of contents for <a href="http://docbook.org/tdg5/en/html/appendix.html"><code class="sgmltag-element">appendix</code></a> in
+<a href="http://docbook.org/tdg5/en/html/article.html"><code class="sgmltag-element">article</code></a>. (Bug #596599)
+</p>
+</li><li class="listitem">
+<p>Don't duplicate footnotes in <a href="http://docbook.org/tdg5/en/html/bibliography.html"><code class="sgmltag-element">bibliography</code></a>s and
+<a href="http://docbook.org/tdg5/en/html/glossary.html"><code class="sgmltag-element">glossary</code></a>s. (Bug #583282)
+</p>
+</li><li class="listitem">
+<p>Added <a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/default.image.width.html"><em class="parameter"><code>default.image.width</code></em></a>. (Bug #516859)
+</p>
+</li><li class="listitem">
+<p>Totally reworked <a href="http://docbook.org/tdg5/en/html/funcsynopsis.html"><code class="sgmltag-element">funcsynopsis</code></a> code; it now
+supports a 'tabular' presentation style for 'wide' prototypes; see
+<em class="parameter"><code>funcsynopsis.tabular.threshold</code></em>. (HTML only
+right now, I think, FO support, uh, real soon now.)
+</p>
+</li><li class="listitem">
+<p>Reworked support for difference marking; toned down the colors a bit
+and added a <span class="quote">&#8220;<span class="quote">system.head.content</span>&#8221;</span> template so that the diff CSS
+wasn't overriding <span class="quote">&#8220;<span class="quote">user.head.content</span>&#8221;</span>. (Bug #610660)
+</p>
+</li><li class="listitem">
+<p>Added call to the <span class="quote">&#8220;<span class="quote">*.head.content</span>&#8221;</span> elements when writing
+out long description chunks.
+</p>
+</li><li class="listitem">
+<p>Make sure <a href="http://docbook.org/tdg5/en/html/legalnotice.html"><code class="sgmltag-element">legalnotice</code></a> link is correct even when
+chunking to a different <a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/base.dir.html"><em class="parameter"><code>base.dir</code></em></a>.
+</p>
+</li><li class="listitem">
+<p>Use CSS to set viewport characteristics if
+<a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/css.decoration.html"><em class="parameter"><code>css.decoration</code></em></a> is non-zero, use div instead of p for making
+graphic a block element; make figure <a href="http://docbook.org/tdg5/en/html/title.html"><code class="sgmltag-element">title</code></a>s the
+default alt
+text for images in a <a href="http://docbook.org/tdg5/en/html/figure.html"><code class="sgmltag-element">figure</code></a>.</p>
+</li><li class="listitem">
+<p>Added space-after to <a href="http://docbook.sourceforge.net/release/xsl/current/doc/fo/list.block.spacing.html"><em class="parameter"><code>list.block.spacing</code></em></a>.
+</p>
+</li><li class="listitem">
+<p>Reworked section.level template to give <span class="quote">&#8220;<span class="quote">correct</span>&#8221;</span> answer
+instead of being off by one.
+</p>
+</li><li class="listitem">
+<p>When processing tables, use the <code class="sgmltag-attribute">tabstyle</code>
+attribute as the division class.
+</p>
+</li><li class="listitem">
+<p>Fixed bug in <code class="filename">html2xhtml.xsl</code> that was causing the
+XHTML chunker to output HTML instead of XHTML.
+</p>
+</li></ul></div>
+</div>
+<div class="sect1" title="Older releases"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="VOlder"></a>Older releases</h2></div></div></div>
+
+ <p>To view the release notes for older releases, see <code class="uri"><a class="uri" href="http://cvs.sourceforge.net/viewcvs.py/docbook/xsl/RELEASE-NOTES.xml" target="_top">http://cvs.sourceforge.net/viewcvs.py/docbook/xsl/RELEASE-NOTES.xml</a></code>. Be
+ aware that there were no release notes for releases prior to the
+ 1.50.0 release.</p>
+</div>
+<div class="sect1" title="About dot-zero releases"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="dot0"></a>About dot-zero releases</h2></div></div></div>
+
+ <p>DocBook Project &#8220;dot zero&#8221; releases should be
+ considered <span class="emphasis"><em>experimental</em></span> and are always
+ followed by stable &#8220;dot one plus&#8221; releases, usually within
+ two or three weeks. Please help to ensure the stability of
+ &#8220;dot one plus&#8221; releases by carefully testing each
+ &#8220;dot zero&#8221; release and reporting back about any
+ problems you find. </p>
+ <p>It is not recommended that you use a &#8220;dot zero&#8221;
+ release in a production system. Instead, you should wait for
+ the &#8220;dot one&#8221; or greater versions.</p>
+ </div>
+</div></body></html>
+
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/RELEASE-NOTES.txt b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/RELEASE-NOTES.txt
new file mode 100644
index 0000000..65e1d86
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/RELEASE-NOTES.txt
@@ -0,0 +1,8575 @@
+Release Notes for the DocBook XSL Stylesheets
+
+$Revision: 8934 $ $Date: 2010-11-01 13:03:14 -0700 (Mon, 01 Nov 2010) $
+
+2010-11-01
+
+This release-notes document is available in the following formats: HTML, PDF,
+plain text; it provides a per-release list of enhancements and changes to the
+stylesheets’ public APIs (user-configurable parameters) and excludes
+descriptions of most bug fixes. For a complete list of all changes (including
+all bug fixes) that have been made since the previous release, see the separate
+NEWS (plain text) or NEWS.html files. Also available: An online hyperlinked
+change history (warning: big file) of all changes made over the entire history
+of the codebase.
+
+As with all DocBook Project “dot one plus†releases, this release aspires to be
+stable (in contrast to dot-zero releases, which are experimental).
+
+â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”
+
+Table of Contents
+
+Release Notes: 1.76.1
+
+ FO
+ HTML
+ Params
+
+Release Notes: 1.76.0
+
+ Gentext
+ Common
+ FO
+ HTML
+ Manpages
+ Epub
+ Eclipse
+ Params
+ XSL-Xalan
+
+Release Notes: 1.75.2
+
+ Gentext
+ Common
+ FO
+ HTML
+ Manpages
+ Epub
+ Profiling
+ XSL-Saxon
+ XSL-Xalan
+
+Release Notes: 1.75.1
+
+ FO
+ HTML
+ Epub
+ Params
+
+Release Notes: 1.75.0
+
+ Gentext
+ Common
+ FO
+ HTML
+ Manpages
+ ePub
+ HTMLHelp
+ Params
+ Highlighting
+ XSL-Saxon
+ XSL-Xalan
+
+Release Notes: 1.74.3
+Release Notes: 1.74.2
+Release Notes: 1.74.1
+
+ Gentext
+ FO
+ HTML
+ Manpages
+ ePub
+ Roundtrip
+ Params
+ Highlighting
+
+Release Notes: 1.74.0
+
+ Gentext
+ Common
+ FO
+ HTML
+ Manpages
+ Epub
+ HTMLHelp
+ Eclipse
+ JavaHelp
+ Roundtrip
+ Slides
+ Website
+ Params
+ Profiling
+ Tools
+ Extensions
+ XSL-Saxon
+ XSL-Xalan
+ XSL-libxslt
+
+Release Notes: 1.73.2
+Release: 1.73.1
+
+ Gentext
+ FO
+ HTML
+ Manpages
+ HTMLHelp
+ Eclipse
+ JavaHelp
+ Roundtrip
+ Params
+
+Release: 1.73.0
+
+ Gentext
+ Common
+ FO
+ HTML
+ Manpages
+ Eclipse
+ JavaHelp
+ Roundtrip
+ Params
+ Highlighting
+ Profiling
+ Lib
+ Tools
+ XSL-Saxon
+ XSL-Xalan
+
+Release: 1.72.0
+
+ Common
+ FO
+ HTML
+ Manpages
+ Params
+ Template
+ Roundtrip
+
+Release: 1.71.1
+
+ Common
+ FO
+ HTML
+ Highlighting
+ Manpages
+ Params
+ Profiling
+
+Release: 1.71.0
+
+ Common
+ Extensions
+ FO
+ HTML
+ Highlighting
+ Manpages
+ Params
+ Tools
+
+Release: 1.70.1
+
+ FO
+ HTML
+ HTMLHelp
+ Params
+
+Release: 1.70.0
+
+ Common
+ Extensions
+ FO
+ HTML
+ Manpages
+ Params
+ Profiling
+ Tools
+ WordML
+
+Release 1.69.1
+Release 1.69.0
+
+ Common
+ FO
+ Help
+ HTML
+ man
+
+Release 1.68.1
+Release 1.68.0
+Release 1.67.2
+Release 1.67.1
+Release 1.67.0
+Release 1.66.1
+Release 1.65.0
+Release 1.64.1
+Release 1.61.0
+Release 1.60.1
+Release 1.59.2
+Release 1.59.1
+Release 1.58.0
+Release 1.57.0
+Release 1.56.0
+Older releases
+About dot-zero releases
+
+Release Notes: 1.76.1
+
+The following is a list of changes that have been made since the 1.76.0
+release.
+
+FO
+
+The following changes have been made to the fo code since the 1.76.0 release.
+
+ â— Robert Stayton: docbook.xsl; xref.xsl; fop1.xsl
+
+ Apply patch to support named destination in fop1.xsl, per Sourceforge
+ bug report #3029845.
+
+HTML
+
+The following changes have been made to the html code since the 1.76.0 release.
+
+ â— Keith Fahlgren: highlight.xsl
+
+ Implementing handling for <b> and <i>: transform to <strong> and <em> for XHTML outputs and do not use in the highliting output (per Mauritz Jeanson)
+
+Params
+
+The following changes have been made to the params code since the 1.76.0
+release.
+
+ â— Robert Stayton: draft.mode.xml
+
+ Change default for draft.mode to 'no'.
+
+Release Notes: 1.76.0
+
+This release includes important bug fixes and adds the following significant
+feature changes:
+
+Webhelp
+
+ A new browser-based, cross-platform help format with full-text search and
+ other features typically found in help systems. See webhelp/docs/content/
+ ch01.html for more information and a demo.
+
+Gentext
+
+ Many updates and additions to translation/locales thanks to Red Hat, the
+ Fedora Project, and other contributors.
+
+Common
+
+ Faster localization support, as language files are loaded on demand.
+
+FO
+
+ Support for SVG content in imagedata added.
+
+HTML
+
+ Output improved when using 'make.clean.html' and a stock CSS file is now
+ provided.
+
+EPUB
+
+ A number of improvements to NCX, cover and image selection, and XHTML 1.1
+ element choices
+
+The following is a list of changes that have been made since the 1.75.2
+release.
+
+Gentext
+
+The following changes have been made to the gentext code since the 1.75.2
+release.
+
+ â— rlandmann: locale/fa.xml
+
+ Update to Persian translation from the Fedora Project
+
+
+ â— rlandmann: locale/nds.xml
+
+ Locale for Low German
+
+
+ â— Mauritz Jeanson: locale/ka.xml; Makefile
+
+ Added support for Georgian based on patch #2917147.
+
+
+ â— rlandmann: locale/nl.xml; locale/ja.xml
+
+ Updated translations from Red Hat and the Fedora Project
+
+
+ â— rlandmann: locale/bs.xml; locale/ru.xml; locale/hr.xml
+
+ Updated locales from Red Hat and the Fedora Project
+
+
+ â— rlandmann: locale/pt.xml; locale/cs.xml; locale/es.xml; locale/bg.xml;
+ locale/nl.xml; loca⋯
+
+ Updated translations from Red Hat and the Fedora Project
+
+
+ â— rlandmann: locale/as.xml; locale/bn_IN.xml; locale/ast.xml; locale/ml.xml;
+ locale/te.xml; ⋯
+
+ New translations from Red Hat and the Fedora Project
+
+
+ â— rlandmann: locale/pt.xml; locale/ca.xml; locale/da.xml; locale/sr.xml;
+ locale/ru.xml; loca⋯
+
+ Updated translations from Red Hat and the Fedora Project
+
+
+Common
+
+The following changes have been made to the common code since the 1.75.2
+release.
+
+ â— Mauritz Jeanson: common.xsl
+
+ Fixed bug in output-orderedlist-starting-number template (@startingnumber did not work for FO).
+
+
+ â— Mauritz Jeanson: gentext.xsl
+
+ Added fix to catch ID also of descendants of listitem. Closes bug #2955077.
+
+
+ â— Jirka Kosek: l10n.xsl
+
+ Stripped down, faster version of gentext.template is used when there is no localization customization.
+
+
+ â— Mauritz Jeanson: stripns.xsl
+
+ Added fix that preserves link/@role (makes links in the reference documentation
+ with @role="tcg" work).
+
+
+ â— Mauritz Jeanson: l10n.xsl
+
+ Fixed bugs related to manpages and L10n.
+
+
+ â— Jirka Kosek: entities.ent; autoidx-kosek.xsl
+
+ Upgraded to use common entities. Fixed bug when some code used @sortas and some not for grouping/sorting of indexterms.
+
+
+ â— Jirka Kosek: l10n.xsl; l10n.dtd; l10n.xml; autoidx-kosek.xsl
+
+ Refactored localization support. Language files are loaded on demand. Speedup is about 30%.
+
+
+ â— Jirka Kosek: l10n.xsl
+
+ Added xsl:keys for improved performance of localization texts look up. Performance gain around 15%.
+
+
+ â— Mauritz Jeanson: titles.xsl
+
+ Fixed bug #2912677 (error with xref in title).
+
+
+ â— Robert Stayton: olink.xsl
+
+ Fix bug in xrefstyle "title" handling introduced with
+ the 'insert.targetdb.data' template.
+
+
+ â— Robert Stayton: gentext.xsl
+
+ Fix bug in xref to equation without title to use context="xref-number" instead
+ of "xref-number-and-title".
+
+
+ â— Robert Stayton: labels.xsl
+
+ Number all equations in one sequence, with or without title.
+
+
+ â— Robert Stayton: entities.ent
+
+ Fix bug #2896909 where duplicate @sortas on indexterms caused
+ some indexterms to drop out of index.
+
+
+ â— Robert Stayton: stripns.xsl
+
+ Expand the "Stripping namespace ..." message to advise users to
+ use the namespaced stylesheets.
+
+
+ â— Robert Stayton: stripns.xsl
+
+ need a local version of $exsl.node.set.available variable because
+ this module imported many places.
+
+
+ â— Mauritz Jeanson: olink.xsl
+
+ Added /node() to the select expression that is used to compute the title text
+ so that no <ttl> elements end up in the output. Closes bug #2830119.
+
+
+FO
+
+The following changes have been made to the fo code since the 1.75.2 release.
+
+ â— Robert Stayton: table.xsl
+
+ Fix bug 2979166 able - Attribute @rowheader not working
+
+
+ â— Mauritz Jeanson: inline.xsl
+
+ Improved glossterm auto-linking by using keys. The old code was inefficient when processing documents
+ with many inline glossterms.
+
+
+ â— Robert Stayton: titlepage.xsl
+
+ Fix bug 2805530 author/orgname not appearing on title page.
+
+
+ â— Mauritz Jeanson: graphics.xsl
+
+ Added support for SVG content in imagedata (inspired by patch #2909154).
+
+
+ â— Mauritz Jeanson: table.xsl
+
+ Removed superfluous test used when computing column-width. Closes bug #3000898.
+
+
+ â— Mauritz Jeanson: inline.xsl
+
+ Added missing <xsl:call-template name="anchor"/>. Closes bug #2998567.
+
+
+ â— Mauritz Jeanson: lists.xsl
+
+ Added table-layout="fixed" on segmentedlist table (required by XSL spec when proportional-column-width() is used).
+
+
+ â— Jirka Kosek: autoidx-kosek.xsl
+
+ Upgraded to use common entities. Fixed bug when some code used @sortas and some not for grouping/sorting of indexterms.
+
+
+ â— Jirka Kosek: index.xsl
+
+ Upgraded to use common entities. Fixed bug when some code used @sortas and some not for grouping/sorting of indexterms.
+
+
+ â— Robert Stayton: xref.xsl
+
+ Fix bug in olink template when an olink has an id.
+ Add warning message with id value when trying to link
+ to an element that has no generated text.
+
+
+ â— Mauritz Jeanson: refentry.xsl
+
+ Fixed bug #2930968 (indexterm in refmeta not handled correctly).
+
+
+ â— Robert Stayton: block.xsl
+
+ fix bug 2949567 title in revhistory breaks FO transform.
+
+
+ â— Robert Stayton: glossary.xsl
+
+ Output id attributes on glossdiv blocks so they can be added to
+ xrefs or TOC.
+
+
+ â— Jirka Kosek: xref.xsl
+
+ Enabled hyphenation of URLs when ulink content is the same as link target
+
+
+ â— Robert Stayton: table.xsl
+
+ Apply patch to turn off row recursion if no @morerows attributes present.
+ This will enable very large tables without row spanning to
+ process without running into recursion limits.
+
+
+ â— Robert Stayton: formal.xsl
+
+ Format equation without title using table layout with equation number
+ next to the equation.
+
+
+ â— Robert Stayton: param.xweb; param.ent
+
+ Add equation.number.properties.
+
+
+HTML
+
+The following changes have been made to the html code since the 1.75.2 release.
+
+ â— Mauritz Jeanson: block.xsl
+
+ Modified acknowledgements template to avoid invalid output (<p> in <p>).
+
+
+ â— Mauritz Jeanson: titlepage.xsl
+
+ Added default sidebar attribute-sets.
+
+
+ â— Robert Stayton: table.xsl
+
+ Fix bug 2979166 able - Attribute @rowheader not working
+
+
+ â— Robert Stayton: footnote.xsl
+
+ Fix bug 3033191 footnotes in html tables.
+
+
+ â— Mauritz Jeanson: inline.xsl
+
+ Improved glossterm auto-linking by using keys. The old code was inefficient when processing documents
+ with many inline glossterms.
+
+
+ â— Robert Stayton: docbook.css.xml; verbatim.xsl
+
+ Fix bug 2844927 Validity error for callout bugs.
+
+
+ â— Robert Stayton: formal.xsl
+
+ Convert formal.object.heading to respect make.clean.html param.
+
+
+ â— Robert Stayton: titlepage.templates.xml; block.xsl
+
+ Fix bug 2840768 sidebar without title inserts empty b tag.
+
+
+ â— Mauritz Jeanson: docbook.xsl
+
+ Moved the template that outputs <base> so that the base URI also applies to relative CSS paths that come later.
+ See patch #2896121.
+
+
+ â— Jirka Kosek: autoidx-kosek.xsl
+
+ Upgraded to use common entities. Fixed bug when some code used @sortas and some not for grouping/sorting of indexterms.
+
+
+ â— Robert Stayton: chunk-code.xsl
+
+ fix bug 2948363 generated filename for refentry not unique, when
+ used in a set.
+
+
+ â— Robert Stayton: component.xsl
+
+ Fix missing "Chapter n" label when use chapter/info/title.
+
+
+ â— Robert Stayton: table.xsl
+
+ Row recursion turned off if no @morerows attributes in the table.
+ This will prevent failure on long table (with no @morerows) due
+ to excessive depth of recursion.
+
+
+ â— Robert Stayton: autotoc.xsl; docbook.css.xml
+
+ Support make.clean.html in autotoc.xsl.
+
+
+ â— Robert Stayton: docbook.css.xml; block.xsl
+
+ Add support for make.clean.html setting in block elements.
+
+
+ â— Robert Stayton: docbook.css.xml
+
+ Stock CSS styles for DocBook HTML output when 'make.clean.html' is non-zero.
+
+
+ â— Robert Stayton: html.xsl
+
+ Add templates for generating CSS files and links to them.
+
+
+ â— Robert Stayton: param.xweb
+
+ Fix bugs in new entity references.
+
+
+ â— Robert Stayton: chunk-common.xsl
+
+ List of Equations now includes on equations with titles.
+
+
+ â— Robert Stayton: table.xsl
+
+ If a colspec has a colname attribute, add it to the HTML col
+ element as a class attribute so it can be styled.
+
+
+ â— Robert Stayton: formal.xsl
+
+ Fix bug 2825842 where table footnotes not appearing in HTML-coded table.
+
+
+ â— Robert Stayton: chunktoc.xsl
+
+ Fix bug #2834826 where appendix inside part was not chunked as it should be.
+
+
+ â— Mauritz Jeanson: chunktoc.xsl
+
+ Added missing namespace declarations. Closes bug #2890069.
+
+
+ â— Mauritz Jeanson: footnote.xsl
+
+ Updated the template for footnote paras to use the 'paragraph' template. Closes bug #2803739.
+
+
+ â— Keith Fahlgren: inline.xsl; lists.xsl
+
+ Remove <b> and <i> elements "discouraged in favor of style sheets" from
+ XHTML, XHTML 1.1 (and therefore EPUB) outputs by changing html2xhtml.xsl.
+
+ Fixes bug #2873153: No <b> and <i> tags in XHTML/EPUB
+
+ Added regression to EPUB specs:
+
+
+ â— Mauritz Jeanson: inline.xsl
+
+ Fixed bug #2844916 (don't output @target if ulink.target is empty).
+
+
+ â— Keith Fahlgren: autoidx.xsl
+
+ Fix a bug when using index.on.type: an 'index symbols' section was created
+ even if that typed index didn't include any symbols (they were in the other types).
+
+
+Manpages
+
+The following changes have been made to the manpages code since the 1.75.2
+release.
+
+ â— Mauritz Jeanson: other.xsl
+
+ Modified the write.stubs template so that the section directory name is not output twice. Should fix bug #2831602.
+ Also ensured that $lang is added to the .so path (when man.output.lang.in.name.enabled=1).
+
+
+ â— Mauritz Jeanson: docbook.xsl; other.xsl
+
+ Fixed bug #2412738 (apostrophe escaping) by applying the submitted patch.
+
+
+ â— Norman Walsh: block.xsl; endnotes.xsl
+
+ Fix bug where simpara in footnote didn't work. Patch by Jonathan Nieder, jrnieder@gmail.com
+
+
+ â— dleidert: lists.xsl
+
+ Fix two indentation issues: In the first case there is no corresponding .RS
+ macro (Debian #519438, sf.net 2793873). In the second case an .RS instead of
+ the probably intended .sp leads to an indentation bug (Debian #527309,
+ sf.net #2642139).
+
+
+Epub
+
+The following changes have been made to the epub code since the 1.75.2 release.
+
+ â— Keith Fahlgren: bin/spec/examples/AMasqueOfDays.epub; docbook.xsl; bin/spec
+ /epub_spec.rb
+
+ Resolve some actual regressions in date output spotted by more recent versions of epubcheck
+
+
+ â— Keith Fahlgren: docbook.xsl
+
+ Updated mediaobject selection code that better uses roles (when available); based on contributons by Glenn McDonald
+
+
+ â— Keith Fahlgren: bin/spec/epub_regressions_spec.rb; docbook.xsl
+
+ Ensure that NCX documents are always outputted with a default namespace
+ to prevent problems with the kindlegen machinery
+
+
+ â— Keith Fahlgren: bin/spec/epub_regressions_spec.rb; bin/spec/files/
+ partintro.xml; docbook.x⋯
+
+ Adding support for partintros with sect2s, 3s, etc
+
+
+ â— Keith Fahlgren: docbook.xsl
+
+ Adding param to workaround horrific ADE bug with the inability to process <br>
+
+
+ â— Keith Fahlgren: docbook.xsl
+
+ Add support for authorgroup/author in OPF metadata (via Michael Wiedmann)
+
+
+ â— Keith Fahlgren: bin/spec/epub_regressions_spec.rb
+
+ Remove <b> and <i> elements "discouraged in favor of style sheets" from
+ XHTML, XHTML 1.1 (and therefore EPUB) outputs by changing html2xhtml.xsl.
+
+ Fixes bug #2873153: No <b> and <i> tags in XHTML/EPUB
+
+ Added regression to EPUB specs:
+
+
+ â— Keith Fahlgren: bin/lib/docbook.rb; bin/spec/files/DejaVuSerif-Italic.otf;
+ docbook.xsl; bi⋯
+
+ This resolves bug #2873142, Please add support for multiple embedded fonts
+
+
+ If you navigate to a checkout of DocBook-XSL and go to:
+ xsl/epub/bin/spec/files
+ You can now run the following command:
+
+ ../../dbtoepub -f DejaVuSerif.otf -f DejaVuSerif-Italic.otf -c test.css
+ -s test_cust.xsl orm.book.001.xml
+
+ In dbtoepub, the following option can be used more than once:
+ -f, --font [OTF FILE] Embed OTF FILE in .epub.
+
+ The underlying stylesheet now accepts a comma-separated list of font file
+ names rather than just one as the RENAMED epub.embedded.fonts ('s' added).
+
+ The runnable EPUB spec now includes:
+ - should be valid .epub after including more than one embedded font
+
+
+ â— Keith Fahlgren: docbook.xsl
+
+ Improve the selection of cover images when working in DocBook 4.x land (work in progress)
+
+
+ â— Keith Fahlgren: bin/spec/epub_regressions_spec.rb; docbook.xsl
+
+ Improve the quality of the OPF spine regression by ensuring that the spine
+ elements for deeply nested refentries are in order and adjacent to their
+ opening wrapper XHTML chunk.
+
+
+ â— Keith Fahlgren: bin/spec/epub_regressions_spec.rb; docbook.xsl; bin/spec/
+ files/orm.book.00⋯
+
+ Add more careful handling of refentries to ensure that they always appear in the opf:spine.
+ This was only a problem when refentries were pushed deep into the hierarchy (like inside
+ a sect2), but presented navigational problems for many reading systems (despite the
+ correct NCX references). This may *not* be the best solution, but attacking a better
+ chunking strategy for refentries was too big a nut to crack at this time.
+
+
+Eclipse
+
+The following changes have been made to the eclipse code since the 1.75.2
+release.
+
+ â— Mauritz Jeanson: eclipse3.xsl
+
+ Added a stylesheet module that generates plug-ins conforming to the standard (OSGi-based) Eclipse 3.x
+ architecture. The main difference to the older format is that metadata is stored in a separate
+ manifest file. The module imports and extends the existing eclipse.xsl module. Based on code
+ contributed in patch #2624668.
+
+
+Params
+
+The following changes have been made to the params code since the 1.75.2
+release.
+
+ â— Robert Stayton: draft.watermark.image.xml
+
+ Fix bug 2922488 draft.watermark.image pointing to web resource.
+ Now the value is images/draft.png, and may require customization
+ for local resolution.
+
+
+ â— Mauritz Jeanson: equation.number.properties.xml
+
+ Corrected refpurpose.
+
+
+ â— Norman Walsh: paper.type.xml
+
+ Added USlegal and USlegallandscape paper types.
+
+
+ â— Jirka Kosek: highlight.xslthl.config.xml
+
+ Added note about specifying location as URL
+
+
+ â— Robert Stayton: docbook.css.source.xml; generate.css.header.xml;
+ custom.css.source.xml; ma⋯
+
+ Params to support generated CSS files.
+
+
+ â— Robert Stayton: equation.number.properties.xml
+
+ New attribute set for numbers appearing next to equations.
+
+
+XSL-Xalan
+
+The following changes have been made to the xsl-xalan code since the 1.75.2
+release.
+
+ â— dleidert: nbproject/genfiles.properties; nbproject/build-impl.xml
+
+ Rebuild netbeans build files after adding missing Netbeans configuration to allow easier packaging for Debian.
+
+
+Release Notes: 1.75.2
+
+The following is a list of changes that have been made since the 1.75.1
+release.
+
+Gentext
+
+The following changes have been made to the gentext code since the 1.75.1
+release.
+
+ â— dleidert: locale/ja.xml
+
+ Improved Japanese translation for Note(s). Closes bug #2823965.
+
+ â— dleidert: locale/pl.xml
+
+ Polish alphabet contains O with acute accent, not with grave accent. Closes bug #2823964.
+
+ â— Robert Stayton: locale/ja.xml
+
+ Fix translation of "index", per bug report 2796064.
+
+ â— Robert Stayton: locale/is.xml
+
+ New Icelandic locale file.
+
+Common
+
+The following changes have been made to the common code since the 1.75.1
+release.
+
+ â— Norman Walsh: stripns.xsl
+
+ Support more downconvert cases
+
+ â— Robert Stayton: titles.xsl
+
+ Make sure title inside info is used if no other title.
+
+FO
+
+The following changes have been made to the fo code since the 1.75.1 release.
+
+ â— Robert Stayton: pi.xsl
+
+ Turn off dbfo-need for fop1.extensions also, per bug #2816141.
+
+HTML
+
+The following changes have been made to the html code since the 1.75.1 release.
+
+ â— Mauritz Jeanson: titlepage.xsl
+
+ Output "Copyright" heading in XHTML too.
+
+ â— Mauritz Jeanson: titlepage.xsl
+
+ Added stylesheet.result.type test for copyright. Closes bug #2813289.
+
+ â— Norman Walsh: htmltbl.xsl
+
+ Remove ambiguity wrt @span, @rowspan, and @colspan
+
+Manpages
+
+The following changes have been made to the manpages code since the 1.75.1
+release.
+
+ â— Mauritz Jeanson: endnotes.xsl
+
+ Added normalize-space() for ulink content. Closes bug #2793877.
+
+ â— Mauritz Jeanson: docbook.xsl
+
+ Added stylesheet.result.type test for copyright. Closes bug #2813289.
+
+Epub
+
+The following changes have been made to the epub code since the 1.75.1 release.
+
+ â— Keith Fahlgren: bin/dbtoepub; bin/lib/docbook.rb
+
+ Corrected bugs caused by path and file assumptions were not met
+
+ â— Keith Fahlgren: bin/lib/docbook.rb; docbook.xsl
+
+ Cleaning up hardcoded values into parameters and fixing Ruby library to pass them properly; all thanks to patch from Liza Daly
+
+Profiling
+
+The following changes have been made to the profiling code since the 1.75.1
+release.
+
+ â— Robert Stayton: profile.xsl
+
+ Fix bug 2815493 missing exsl.node.set.available parameter.
+
+XSL-Saxon
+
+The following changes have been made to the xsl-saxon code since the 1.75.1
+release.
+
+ â— Mauritz Jeanson: src/com/nwalsh/saxon/ColumnUpdateEmitter.java; src/com/
+ nwalsh/saxon/Colum⋯
+
+ Added fixes so that colgroups in the XHTML namespace are processed properly.
+
+XSL-Xalan
+
+The following changes have been made to the xsl-xalan code since the 1.75.1
+release.
+
+ â— Mauritz Jeanson: nbproject/project.xml
+
+ Added missing NetBeans configuration.
+
+Release Notes: 1.75.1
+
+This release includes bug fixes.
+
+The following is a list of changes that have been made since the 1.75.0
+release.
+
+FO
+
+The following changes have been made to the fo code since the 1.75.0 release.
+
+ â— Keith Fahlgren: block.xsl
+
+ Switching to em dash for character before attribution in epigraph; resolves Bug #2793878
+
+ â— Robert Stayton: lists.xsl
+
+ Fixed bug 2789947, id attribute missing on simplelist fo output.
+
+HTML
+
+The following changes have been made to the html code since the 1.75.0 release.
+
+ â— Keith Fahlgren: block.xsl
+
+ Switching to em dash for character before attribution in epigraph; resolves Bug #2793878
+
+ â— Robert Stayton: lists.xsl
+
+ Fixed bug 2789678: apply-templates line accidentally deleted.
+
+Epub
+
+The following changes have been made to the epub code since the 1.75.0 release.
+
+ â— Keith Fahlgren: bin/spec/epub_regressions_spec.rb; docbook.xsl
+
+ Added regression and fix to correct "bug" with namespace-prefixed container elements in META-INF/container.xml ; resolves Issue #2790017
+
+ â— Keith Fahlgren: bin/spec/epub_regressions_spec.rb; bin/spec/files/
+ onegraphic.xinclude.xml;⋯
+
+ Another attempt at flexible named entity and XInclude processing
+
+ â— Keith Fahlgren: bin/lib/docbook.rb
+
+ Tweaking solution to Bug #2750442 following regression reported by Michael Wiedmann.
+
+Params
+
+The following changes have been made to the params code since the 1.75.0
+release.
+
+ â— Mauritz Jeanson: highlight.source.xml
+
+ Updated documentation to reflect changes made in r8419.
+
+Release Notes: 1.75.0
+
+This release includes important bug fixes and adds the following significant
+feature changes:
+
+Gentext
+
+ Modifications to translations have been made.
+
+Common
+
+ Added support for some format properties on tables using HTML table markup.
+
+ Added two new qanda.defaultlabel values so that numbered sections and
+ numbered questions can be distinguished. Satisfies Feature Request #
+ 1539045.
+
+ Added code to handle acknowledgements in book and part. The element is
+ processed similarly to dedication. All acknowledgements will appear as
+ front matter, after any dedications.
+
+FO
+
+ The inclusion of highlighting code has been simplified.
+
+ Add support for pgwide on informal objects.
+
+ Added a new parameter, bookmarks.collapse, that controls the initial state
+ of the bookmark tree. Closes FR #1792326.
+
+ Add support for more dbfo processing instructions.
+
+ Add new variablelist.term.properties to format terms, per request #
+ 1968513.
+
+ Add support for @width on screen and programlisting, fixes bug #2012736.
+
+ Add support for writing-mode="rl-tb" (right-to-left) in FO outputs.
+
+ Add writing.mode param for FO output.
+
+HTML
+
+ Convert all calls to class.attribute to calls to common.html.attributes to
+ support dir, lang, and title attributes in html output for all elements.
+ Fulfills feature request #1993833.
+
+ Inclusion of highlighting code was simplified. Only one import is now
+ necessary.
+
+ Add new param index.links.to.section.
+
+ Add support for the new index.links.to.section param which permits precise
+ links to indexterms in HTML output rather than to the section title.
+
+ePub
+
+ Slightly more nuanced handling of imageobject alternatives and better
+ support in dbtoepub for XIncludes and ENTITYs to resolve Issue #2750442
+ reported by Raphael Hertzog.
+
+ Added a colon after an abstract/title when mapping into the dc:description
+ for OPF metadata in ePub output to help the flat text have more
+ pseudo-semantics (sugestions from Michael Wiedmann)
+
+ Added DocBook subjectset -> OPF dc:subject mapping and tests
+
+ Added DocBook date -> OPF dc:date mapping and tests
+
+ Added DocBook abstract -> OPF dc:description mapping and tests
+
+ Added --output option to dbtoepub based on user request
+
+HTMLHelp
+
+ Add support for generating olink target database for htmlhelp files.
+
+Params
+
+ Add default setting for @rules attribute on HTML markup tables.
+
+ Added a new parameter, bookmarks.collapse, that controls the initial state
+ of the bookmark tree. When the parameter has a non-zero value (the
+ default), only the top-level bookmarks are displayed initially. Otherwise,
+ the whole tree of bookmarks is displayed. This is implemented for FOP 0.9X.
+ Closes FR #1792326.
+
+ Add new variablelist.term.properties to format terms, per request #
+ 1968513.
+
+ Add two new qanda.defaultlabel values so that numbered sections and
+ numbered questions can be distinguished. Satisfies Feature Request #
+ 1539045.
+
+ Add param to control whether an index entry links to a section title or to
+ the precise location of the indexterm.
+
+ New attribute list for glossentry in glossary.
+
+ New parameter to support @width on programlisting and screen.
+
+ Add attribute-sets for formatting glossary terms and defs.
+
+Highlighting
+
+ Inclusion of highlighting code was simplified. Only one import is now
+ necessary.
+
+The following is a list of changes that have been made since the 1.74.3
+release.
+
+Gentext
+
+The following changes have been made to the gentext code since the 1.74.3
+release.
+
+ â— Robert Stayton: locale/sv.xml; locale/ja.xml; locale/pl.xml
+
+ Check in translations of Legalnotice submitted on mailing list.
+
+ â— Robert Stayton: locale/es.xml
+
+ Fix spelling errors in Acknowledgements entries.
+
+ â— Robert Stayton: locale/es.xml
+
+ Check in translations for 4 elements submitted through docbook-apps
+ message of 14 April 2009.
+
+ â— David Cramer: locale/zh.xml; locale/ca.xml; locale/ru.xml; locale/ga.xml;
+ locale/gl.xml; l⋯
+
+ Internationalized punctuation in glosssee and glossseealso
+
+ â— Robert Stayton: Makefile
+
+ Check in fixes for DSSSL gentext targets from submitted patch #1689633.
+
+ â— Robert Stayton: locale/uk.xml
+
+ Check in major update submitted with bug report #2008524.
+
+ â— Robert Stayton: locale/zh_tw.xml
+
+ Check in fix to Note string submitted in bug #2441051.
+
+ â— Robert Stayton: locale/ru.xml
+
+ Checkin typo fix submitted in bug #2453406.
+
+Common
+
+The following changes have been made to the common code since the 1.74.3
+release.
+
+ â— Robert Stayton: gentext.xsl
+
+ Fix extra generated space when xrefstyle includes 'nopage'.
+
+ â— Robert Stayton: table.xsl
+
+ Add support for some format properties on tables using
+ HTML table markup. These include:
+ - frame attribute on table (or uses $default.table.frame parameter).
+ - rules attribute on table (or uses $default.table.rules parameter).
+ - align attribute on td and th
+ - valign attribute on td and th
+ - colspan on td and th
+ - rowspan on td and th
+ - bgcolor on td and th
+
+ â— Robert Stayton: olink.xsl
+
+ Add placeholder template to massage olink hot text to make
+ customization easier, per Feature Request 1828608.
+
+ â— Robert Stayton: targets.xsl
+
+ Add support for collecting olink targets from a glossary
+ generated from a glossary.collection.
+
+ â— Robert Stayton: titles.xsl
+
+ Handle firstterm like glossterm in mode="title.markup".
+
+ â— Robert Stayton: titles.xsl
+
+ Add match on info/title in title.markup templates where missing.
+
+ â— Mauritz Jeanson: titles.xsl
+
+ Changed "ancestor::title" to "(ancestor::title and (@id or @xml:id))".
+ This enables proper formatting of inline elements in titles in TOCs,
+ as long as these inlines don't have id or xml:id attributes.
+
+ â— Robert Stayton: labels.xsl
+
+ Add two new qanda.defaultlabel values so that numbered sections
+ and numbered questions can be distinguished. Satisfies
+ Feature Request #1539045.
+
+ â— Robert Stayton: stripns.xsl; pi.xsl
+
+ Convert function-available(exsl:node-set) to use the new param
+ so Xalan bug is isolated.
+
+ â— Mauritz Jeanson: titles.xsl
+
+ Added fixes for bugs #2112656 and #1759205:
+ 1. Reverted mistaken commits r7485 and r7523.
+ 2. Updated the template with match="link" and mode="no.anchor.mode" so that
+ @endterm is used if it exists and if the link has no content.
+
+ â— Mauritz Jeanson: titles.xsl
+
+ Added code to handle acknowledgements in book and part. The element is processed
+ similarly to dedication. All acknowledgements will appear as front matter, after
+ any dedications.
+
+ â— Robert Stayton: olink.xsl
+
+ Fix bug #2018717 use.local.olink.style uses wrong gentext context.
+
+ â— Robert Stayton: olink.xsl
+
+ Fix bug #1787167 incorrect hot text for some olinks.
+
+ â— Robert Stayton: common.xsl
+
+ Fix bug #1669654 Broken output if copyright <year> contains a range.
+
+ â— Robert Stayton: labels.xsl
+
+ Fix bug in labelling figure inside appendix inside article inside book.
+
+FO
+
+The following changes have been made to the fo code since the 1.74.3 release.
+
+ â— Jirka Kosek: highlight.xsl
+
+ Inclusion of highlighting code was simplified. Only one import is now necessary.
+
+ â— Robert Stayton: fop1.xsl
+
+ Add the new fop extensions namespace declaration, in case FOP
+ extension functions are used.
+
+ â— Robert Stayton: formal.xsl
+
+ Add support for pgwide on informal objects.
+
+ â— Robert Stayton: docbook.xsl
+
+ Fixed spurious closing quote on line 134.
+
+ â— Robert Stayton: docbook.xsl; autoidx-kosek.xsl; autoidx.xsl
+
+ Convert function-available for node-set() to use
+ new $exsl.node.set.available param in test.
+
+ â— David Cramer: xref.xsl
+
+ Suppress extra space after xref when xrefstyle='select: label nopage' (#2740472)
+
+ â— Mauritz Jeanson: pi.xsl
+
+ Fixed doc bug for row-height.
+
+ â— David Cramer: glossary.xsl
+
+ Internationalized punctuation in glosssee and glossseealso
+
+ â— Robert Stayton: param.xweb; param.ent; htmltbl.xsl; table.xsl
+
+ Add support for some format properties on tables using
+ HTML table markup. These include:
+ - frame attribute on table (or uses $default.table.frame parameter).
+ - rules attribute on table (or uses $default.table.rules parameter).
+ - align attribute on td and th
+ - valign attribute on td and th
+ - colspan on td and th
+ - rowspan on td and th
+ - bgcolor on td and th
+
+ â— Robert Stayton: table.xsl
+
+ Add support bgcolor in td and th
+ elements in HTML table markup.
+
+ â— Robert Stayton: htmltbl.xsl
+
+ Add support for colspan and rowspan and bgcolor in td and th
+ elements in HTML table markup.
+
+ â— Robert Stayton: param.xweb
+
+ Fix working of page-master left and right margins.
+
+ â— Mauritz Jeanson: param.xweb; param.ent; fop1.xsl
+
+ Added a new parameter, bookmarks.collapse, that controls the initial state of the bookmark tree. When the parameter has a non-zero value (the default), only the top-level bookmarks are displayed initially. Otherwise, the whole tree of bookmarks is displayed. This is implemented for FOP 0.9X. Closes FR #1792326.
+
+ â— Robert Stayton: table.xsl; pi.xsl
+
+ Add support for dbfo row-height processing instruction, like that in dbhtml.
+
+ â— Robert Stayton: lists.xsl
+
+ Add support for dbfo keep-together processing instruction for
+ entire list instances.
+
+ â— Robert Stayton: lists.xsl; block.xsl
+
+ Add support fo dbfo keep-together processing instruction to
+ more blocks like list items and paras.
+
+ â— Robert Stayton: lists.xsl; param.xweb; param.ent
+
+ Add new variablelist.term.properties to format terms, per request # 1968513.
+
+ â— Robert Stayton: inline.xsl
+
+ In simple.xlink, rearrange order of processing.
+
+ â— Robert Stayton: xref.xsl
+
+ Handle firstterm like glossterm in mode="xref-to".
+
+ â— Robert Stayton: glossary.xsl; xref.xsl; pi.xsl; footnote.xsl
+
+ Implement simple.xlink for glosssee and glossseealso so they can use
+ other types of linking besides otherterm.
+
+ â— Robert Stayton: qandaset.xsl
+
+ Add two new qanda.defaultlabel values so that numbered sections and numbered questions can be distinguished. Satisfies Feature Request #1539045.
+
+ â— Robert Stayton: titlepage.xsl
+
+ For the book title templates, I changed info/title to book/info/title
+ so other element's titles will not be affected.
+
+ â— Robert Stayton: xref.xsl; verbatim.xsl
+
+ Use param exsl.node.set.available to test for function.
+
+ â— Robert Stayton: param.xweb; param.ent; footnote.xsl
+
+ Start using new param exsl.node.set.available to work around Xalan bug.
+
+ â— Robert Stayton: titlepage.templates.xml
+
+ Add comment on use of t:predicate for editor to prevent
+ extra processing of multiple editors. Fixes bug 2687842.
+
+ â— Robert Stayton: xref.xsl; autoidx.xsl
+
+ An indexterm primary, secondary, or tertiary element with an id or xml:id
+ now outputs that ID, so that index entries can be cross referenced to.
+
+ â— Mauritz Jeanson: synop.xsl
+
+ Added modeless template for ooclass|oointerface|ooexception.
+ Closes bug #1623468.
+
+ â— Robert Stayton: xref.xsl
+
+ Add template with match on indexterm in mode="xref-to" to fix bug 2102592.
+
+ â— Robert Stayton: xref.xsl
+
+ Now xref to qandaentry will use the label element in a question for
+ the link text if it has one.
+
+ â— Robert Stayton: inline.xsl
+
+ Add id if specified from @id to output for quote and phrase so
+ they can be xref'ed to.
+
+ â— Robert Stayton: xref.xsl
+
+ Add support for xref to phrase, simpara, anchor, and quote.
+ This assumes the author specifies something using xrefstyle since
+ the elements don't have ordinary link text.
+
+ â— Robert Stayton: toc.xsl
+
+ Fix bug in new toc templates.
+
+ â— Mauritz Jeanson: titlepage.xsl; component.xsl; division.xsl; xref.xsl;
+ titlepage.templates⋯
+
+ Added code to handle acknowledgements in book and part. The element is processed
+ similarly to dedication. All acknowledgements will appear as front matter, after
+ any dedications.
+
+ â— Robert Stayton: toc.xsl
+
+ Rewrite toc templates to support an empty toc or populated toc
+ in all permitted contexts. Same for lot elements.
+ This fixes bug #1595969 for FO outputs.
+
+ â— Robert Stayton: index.xsl
+
+ Fix indents for seealsoie so they are consistent.
+
+ â— Mauritz Jeanson: param.xweb
+
+ Removed duplicate (monospace.font.family).
+
+ â— Robert Stayton: param.xweb; param.ent
+
+ Add glossentry.list.item.properties.
+
+ â— Robert Stayton: param.xweb; param.ent
+
+ Add monospace.verbatim.font.width param to support @width on programlisting.
+
+ â— Robert Stayton: verbatim.xsl
+
+ Put programlisting in fo:block-container with writing-mode="lr-tb"
+ when text direction is right to left because all program languages
+ are left-to-right.
+
+ â— Robert Stayton: verbatim.xsl
+
+ Add support for @width on screen and programlisting, fixes bug #2012736.
+
+ â— Robert Stayton: xref.xsl
+
+ Fix bug #1973585 xref to para with xrefstyle not handled correctly.
+
+ â— Mauritz Jeanson: block.xsl
+
+ Added support for acknowledgements in article.
+ Support in book/part remains to be added.
+
+ â— Robert Stayton: xref.xsl
+
+ Fix bug #1787167 incorrect hot text for some olinks.
+
+ â— Robert Stayton: fo.xsl
+
+ Add writing-mode="tb-rl" as well since some XSL-FO processors support it.
+
+ â— Robert Stayton: autotoc.xsl; lists.xsl; glossary.xsl; fo.xsl; table.xsl;
+ pagesetup.xsl
+
+ Add support for writing-mode="rl-tb" (right-to-left) in FO outputs.
+ Changed instances of margin-left to margin-{$direction.align.start}
+ and margin-right to margin-{$direction.align.end}. Those direction.align
+ params are computed from the writing mode value in each locale's
+ gentext key named 'writing-mode', introduced in 1.74.3 to add
+ right-to-left support to HTML outputs.
+
+ â— Robert Stayton: param.xweb; param.ent
+
+ Add attribute-sets for formatting glossary terms and defs.
+
+ â— Robert Stayton: param.xweb; param.ent
+
+ Add writing.mode param for FO output.
+
+ â— Robert Stayton: autotoc.xsl
+
+ Fix bug 1546008: in qandaentry in a TOC, use its blockinfo/titleabbrev or blockinfo/title
+ instead of question, if available. For DocBook 5, use the info versions.
+
+ â— Keith Fahlgren: verbatim.xsl
+
+ Add better pointer to README for XSLTHL
+
+ â— Keith Fahlgren: verbatim.xsl
+
+ More tweaking the way that XSLTHL does or does not get called
+
+ â— Keith Fahlgren: verbatim.xsl
+
+ Alternate attempt at sanely including/excluding XSLTHT code
+
+HTML
+
+The following changes have been made to the html code since the 1.74.3 release.
+
+ â— Robert Stayton: lists.xsl
+
+ Removed redundant lang and title attributes on list element inside
+ div element for lists.
+
+ â— Robert Stayton: inline.xsl; titlepage.xsl; division.xsl; toc.xsl;
+ sections.xsl; table.xsl;⋯
+
+ Convert all calls to class.attribute to calls to common.html.attributes
+ to support dir, lang, and title attributes in html output for all elements.
+ Fulfills feature request #1993833.
+
+ â— Robert Stayton: chunk-common.xsl
+
+ Fix bug #2750253 wrong links in list of figures in chunk.html
+ when target html is in a subdirectory and dbhtml filename used.
+
+ â— Jirka Kosek: highlight.xsl
+
+ Inclusion of highlighting code was simplified. Only one import is now necessary.
+
+ â— Robert Stayton: chunk-common.xsl; chunktoc.xsl; docbook.xsl;
+ chunk-changebars.xsl; autoidx⋯
+
+ Convert function-available for node-set() to use
+ new $exsl.node.set.available param in test.
+
+ â— Mauritz Jeanson: pi.xsl
+
+ Fixed doc bug for row-height.
+
+ â— David Cramer: glossary.xsl
+
+ Internationalized punctuation in glosssee and glossseealso
+
+ â— Robert Stayton: lists.xsl; html.xsl; block.xsl
+
+ More elements get common.html.attributes.
+ Added locale.html.attributes template which does the lang,
+ dir, and title attributes, but not the class attribute
+ (used on para, for example).
+
+ â— Robert Stayton: lists.xsl
+
+ Replace more literal class atts with mode="class.attribute" to support
+ easier customization.
+
+ â— Robert Stayton: glossary.xsl
+
+ Support olinking in glosssee and glossseealso.
+
+ â— Robert Stayton: inline.xsl
+
+ In simple.xlink, rearrange order of processing.
+
+ â— Robert Stayton: xref.xsl
+
+ Handle firstterm like glossterm in mode="xref-to".
+
+ â— Robert Stayton: lists.xsl; html.xsl; block.xsl
+
+ Added template named common.html.attributes to output
+ class, title, lang, and dir for most elements.
+ Started adding it to some list and block elements.
+
+ â— Robert Stayton: qandaset.xsl
+
+ Add two new qanda.defaultlabel values so that numbered sections
+ and numbered questions can be distinguished. Satisfies
+ Feature Request #1539045.
+
+ â— Robert Stayton: param.xweb; chunk-code.xsl; param.ent; xref.xsl;
+ chunkfast.xsl; verbatim.x⋯
+
+ Use new param exsl.node.set.available to test, handles Xalan bug.
+
+ â— Robert Stayton: autoidx.xsl
+
+ Use named anchors for primary, secondary, and tertiary ids so
+ duplicate entries with different ids can still have an id output.
+
+ â— Robert Stayton: param.xweb; param.ent
+
+ Add new param index.links.to.section.
+
+ â— Robert Stayton: xref.xsl; autoidx.xsl
+
+ Pass through an id on primary, secondary, or tertiary to
+ the index entry, so that one could link to an index entry.
+ You can't link to the id on an indexterm because that is
+ used to place the main anchor in the text flow.
+
+ â— Robert Stayton: autoidx.xsl
+
+ Add support for the new index.links.to.section param which permits
+ precise links to indexterms in HTML output rather than to
+ the section title.
+
+ â— Mauritz Jeanson: synop.xsl
+
+ Added modeless template for ooclass|oointerface|ooexception.
+ Closes bug #1623468.
+
+ â— Robert Stayton: qandaset.xsl
+
+ Make sure a qandaset has an anchor, even when it has no title,
+ because it may be referenced in a TOC or xref.
+ Before, the anchor was output by the title, but there was no
+ anchor if there was no title.
+
+ â— Robert Stayton: xref.xsl
+
+ Add a template for indexterm with mode="xref-to" to fix bug 2102592.
+
+ â— Robert Stayton: xref.xsl
+
+ Now xref to qandaentry will use the label element in a question for
+ the link text if it has one.
+
+ â— Robert Stayton: qandaset.xsl; html.xsl
+
+ Create separate templates for computing label of question and answer
+ in a qandaentry, so such can be used for the alt text of an xref
+ to a qandaentry.
+
+ â— Robert Stayton: inline.xsl; xref.xsl
+
+ Now support xref to phrase, simpara, anchor, and quote,
+ most useful when an xrefstyle is used.
+
+ â— Robert Stayton: toc.xsl
+
+ Rewrite toc templates to support an empty toc or populated toc
+ in all permitted contexts. Same for lot elements.
+ This fixes bug #1595969 for HTML outputs.
+
+ â— Mauritz Jeanson: titlepage.xsl; component.xsl; division.xsl; xref.xsl;
+ titlepage.templates⋯
+
+ Added code to handle acknowledgements in book and part. The element is processed
+ similarly to dedication. All acknowledgements will appear as front matter, after
+ any dedications.
+
+ â— Robert Stayton: index.xsl
+
+ Rewrote primaryie, secondaryie and tertiaryie templates to handle
+ nesting of elements and seeie and seealsoie, as reported in
+ bug # 1168912.
+
+ â— Robert Stayton: autotoc.xsl
+
+ Fix simplesect in toc problem.
+
+ â— Robert Stayton: verbatim.xsl
+
+ Add support for @width per bug report #2012736.
+
+ â— Robert Stayton: formal.xsl; htmltbl.xsl
+
+ Fix bug #1787140 HTML tables not handling attributes correctly.
+
+ â— Robert Stayton: param.xweb
+
+ Move writing-mode param.
+
+ â— Keith Fahlgren: refentry.xsl
+
+ Remove a nesting of <p> inside <p> for refclass (made XHTML* invalid, made HTML silly)
+
+ â— Robert Stayton: table.xsl
+
+ Fix bug #1945872 to allow passthrough of colwidth values to
+ HTML table when no tablecolumns.extension is available and
+ when no instance of * appears in the table's colspecs.
+
+ â— Mauritz Jeanson: block.xsl
+
+ Added support for acknowledgements in article.
+ Support in book/part remains to be added.
+
+ â— Robert Stayton: chunk-common.xsl
+
+ Fix bug #1787167 incorrect hot text for some olinks.
+
+ â— Robert Stayton: qandaset.xsl
+
+ Fix bug 1546008: in qandaentry in a TOC, use its blockinfo/titleabbrev or blockinfo/title
+ instead of question, if available. For DocBook 5, use the info versions.
+
+ â— Robert Stayton: chunktoc.xsl
+
+ Add support for generating olink database when using chunktoc.xsl.
+
+ â— Keith Fahlgren: verbatim.xsl
+
+ Add better pointer to README for XSLTHL
+
+ â— Keith Fahlgren: verbatim.xsl
+
+ Another stab at fixing the stupid XSLTHT includes across processors (Saxon regression reported by Sorin Ristache)
+
+ â— Keith Fahlgren: verbatim.xsl
+
+ More tweaking the way that XSLTHL does or does not get called
+
+ â— Keith Fahlgren: verbatim.xsl
+
+ Alternate attempt at sanely including/excluding XSLTHT code
+
+Manpages
+
+The following changes have been made to the manpages code since the 1.74.3
+release.
+
+ â— Robert Stayton: table.xsl
+
+ Convert function-available test for node-set() function to
+ test of $exsl.node.set.available param.
+
+ â— Mauritz Jeanson: lists.xsl
+
+ Added a template for bibliolist. Closes bug #1815916.
+
+ePub
+
+The following changes have been made to the epub code since the 1.74.3 release.
+
+ â— Keith Fahlgren: bin/spec/epub_regressions_spec.rb; bin/spec/files/
+ onegraphic.xinclude.xml;⋯
+
+ Slightly more nuanced handling of imageobject alternatives and better support in dbtoepub for XIncludes and ENTITYs to resolve Issue #2750442 reported by Raphael Hertzog.
+
+ â— Keith Fahlgren: docbook.xsl
+
+ Add a colon after an abstract/title when mapping into the dc:description for OPF metadata in ePub output to help the flat text have more pseudo-semantics (sugestions from Michael Wiedmann)
+
+ â— Keith Fahlgren: bin/spec/epub_regressions_spec.rb; docbook.xsl; bin/spec/
+ files/de.xml
+
+ Correctly set dc:language in OPF metadata when i18nizing. Closes Bug #2755150
+
+ â— Keith Fahlgren: bin/spec/epub_regressions_spec.rb; docbook.xsl
+
+ Corrected namespace declarations for literal XHTML elements to make them serialize "normally"
+
+ â— Keith Fahlgren: docbook.xsl
+
+ Be a little bit more nuanced about dates
+
+ â— Keith Fahlgren: docbook.xsl; bin/spec/epub_realbook_spec.rb; bin/spec/files
+ /orm.book.001.x⋯
+
+ Add DocBook subjectset -> OPF dc:subject mapping and tests
+
+ â— Keith Fahlgren: docbook.xsl; bin/spec/epub_realbook_spec.rb; bin/spec/files
+ /orm.book.001.x⋯
+
+ Add DocBook date -> OPF dc:date mapping and tests
+
+ â— Keith Fahlgren: docbook.xsl; bin/spec/epub_realbook_spec.rb; bin/spec/files
+ /orm.book.001.x⋯
+
+ Add DocBook abstract -> OPF dc:description mapping and tests
+
+ â— Robert Stayton: docbook.xsl
+
+ Check in patch submitted by user to add opf:file-as attribute
+ to dc:creator element.
+
+ â— Keith Fahlgren: bin/dbtoepub
+
+ Adding --output option to dbtoepub based on user request
+
+ â— Keith Fahlgren: docbook.xsl; bin/spec/epub_spec.rb
+
+ Cleaning and regularizing the generation of namespaced nodes for OPF, NCX, XHTML and other outputted filetypes (hat tip to bobstayton for pointing out the silly, incorrect code)
+
+ â— Keith Fahlgren: bin/spec/epub_regressions_spec.rb; bin/spec/files/
+ refclass.xml
+
+ Remove a nesting of <p> inside <p> for refclass (made XHTML* invalid, made HTML silly)
+
+ â— Keith Fahlgren: bin/spec/epub_regressions_spec.rb; bin/spec/files/
+ blockquotepre.xml
+
+ Added regression test and fix for XHTML validation problem with <a>s added inside <blockquote>; This potentially causes another problem (where something is referenced by has no anchor, but someone reporting that should cause the whole <a id='thing'/> thing to be reconsidered with modern browsers in mind.
+
+HTMLHelp
+
+The following changes have been made to the htmlhelp code since the 1.74.3
+release.
+
+ â— Robert Stayton: htmlhelp-common.xsl
+
+ Add support for generating olink target database for htmlhelp files.
+
+Params
+
+The following changes have been made to the params code since the 1.74.3
+release.
+
+ â— Robert Stayton: default.table.rules.xml
+
+ Add default setting for @rules attribute on HTML markup tables.
+
+ â— Mauritz Jeanson: bookmarks.collapse.xml
+
+ Added a new parameter, bookmarks.collapse, that controls the initial state
+ of the bookmark tree. When the parameter has a non-zero value (the default),
+ only the top-level bookmarks are displayed initially. Otherwise, the whole
+ tree of bookmarks is displayed.
+
+ This is implemented for FOP 0.9X. Closes FR #1792326.
+
+ â— Robert Stayton: variablelist.term.properties.xml
+
+ Add new variablelist.term.properties to format terms, per
+ request # 1968513.
+
+ â— Robert Stayton: qanda.defaultlabel.xml
+
+ Add two new qanda.defaultlabel values so that numbered sections
+ and numbered questions can be distinguished. Satisfies
+ Feature Request #1539045.
+
+ â— Robert Stayton: index.links.to.section.xml
+
+ Change default to 1 to match past behavior.
+
+ â— Robert Stayton: exsl.node.set.available.xml
+
+ Isolate this text for Xalan bug regarding exsl:node-set available.
+ If it is ever fixed in Xalan, just fix it here.
+
+ â— Robert Stayton: index.links.to.section.xml
+
+ Add param to control whether an index entry links to
+ a section title or to the precise location of the
+ indexterm.
+
+ â— Robert Stayton: glossentry.list.item.properties.xml
+
+ New attribute list for glossentry in glossary.
+
+ â— Robert Stayton: monospace.verbatim.font.width.xml
+
+ New parameter to support @width on programlisting and screen.
+
+ â— Mauritz Jeanson: highlight.source.xml
+
+ Updated and reorganized the description.
+
+ â— Robert Stayton: page.margin.outer.xml; page.margin.inner.xml
+
+ Add caveat about XEP bug when writing-mode is right-to-left.
+
+ â— Robert Stayton: article.appendix.title.properties.xml; writing.mode.xml;
+ body.start.indent⋯
+
+ Change 'left' to 'start' and 'right' to 'end' to support right-to-left
+ writing mode.
+
+ â— Robert Stayton: glossdef.block.properties.xml;
+ glossdef.list.properties.xml; glossterm.blo⋯
+
+ Add attribute-sets for formatting glossary terms and defs.
+
+ â— Robert Stayton: glossterm.separation.xml
+
+ Clarify the description.
+
+ â— Robert Stayton: make.year.ranges.xml
+
+ Now handles year element containing a comma or dash without error.
+
+Highlighting
+
+The following changes have been made to the highlighting code since the 1.74.3
+release.
+
+ â— Jirka Kosek: README
+
+ Inclusion of highlighting code was simplified. Only one import is now necessary.
+
+ â— Keith Fahlgren: README
+
+ Adding XSLTHL readme
+
+ â— Keith Fahlgren: common.xsl
+
+ Alternate attempt at sanely including/excluding XSLTHT code
+
+XSL-Saxon
+
+The following changes have been made to the xsl-saxon code since the 1.74.3
+release.
+
+ â— Mauritz Jeanson: src/com/nwalsh/saxon/Text.java
+
+ Added a fix that prevents output of extra blank line.
+ Hopefully this closes bug #894805.
+
+XSL-Xalan
+
+The following changes have been made to the xsl-xalan code since the 1.74.3
+release.
+
+ â— Mauritz Jeanson: src/com/nwalsh/xalan/Text.java
+
+ Added a fix that prevents output of extra blank line.
+ Hopefully this closes bug #894805.
+
+Release Notes: 1.74.3
+
+This release fixes some bugs in the 1.74.2 release.
+
+See highlighting/README for XSLTHL usage instructions.
+
+Release Notes: 1.74.2
+
+This release fixes some bugs in the 1.74.1 release.
+
+Release Notes: 1.74.1
+
+This release includes important bug fixes and adds the following significant
+feature changes:
+
+Gentext
+
+ Kirghiz locale added and Chinese translations have been simplified.
+
+ Somme support for gentext and right-to-left languages has been added.
+
+FO
+
+ Various bugs have been resolved.
+
+ Support for a new processing instruction: dbfo funcsynopsis-style has been
+ added.
+
+ Added new param email.mailto.enabled for FO output. Patch from Paolo
+ Borelli.
+
+ Support for documented metadata in fop1 mode has been added.
+
+Highlighting
+
+ Support for the latest version of XSLTHL 2.0 and some new language syntaxes
+ have been added to a variety of outputs.
+
+Manpages
+
+ Added man.output.better.ps.enabled param (zero default). It non-zero, no
+ such markup is embedded in generated man pages, and no enhancements are
+ included in the PostScript output generated from those man pages by the man
+ -Tps command.
+
+HTML
+
+ Support for writing.mode to set text direction and alignment based on
+ document locale has been added.
+
+ Added a new top-level stylesheet module, chunk-changebars.xsl, to be used
+ for generating chunked output with highlighting based on change
+ (@revisionflag) markup. The module imports/includes the standard chunking
+ and changebars templates and contains additional logic for chunked output.
+ See FRs #1015180 and #1819915.
+
+ePub
+
+ Covers now look better in Adobe Digital Editions thanks to a patch from
+ Paul Norton of Adobe
+
+ Cover handling now more generic (including limited DocBook 5.0 cover
+ support thanks to patch contributed by Liza Daly.
+
+ Cover markup now carries more reliably into files destined for .mobi and
+ the Kindle.
+
+ dc:identifiers are now generated from more types of numbering schemes.
+
+ Both SEO and semantic structure of chunked ePub output by ensuring that we
+ always send out one and only one h1 in each XHTML chunk.
+
+ Primitive support for embedding a single font added.
+
+ Support for embedding a CSS customizations added.
+
+Roundtrip
+
+ Support for imagedata-metadata and table as images added.
+
+ Support for imagedata-metadata and legalnotice as images added.
+
+Params
+
+ man.output.better.ps.enabled added for Manpages output
+
+ writing.mode.xml added to set text direction.
+
+ Added new param email.mailto.enabled for FO output. Patch from Paolo
+ Borelli. Closes #2086321.
+
+ highlight.source upgraded to support the latest version of XSLTHL 2.0.
+
+The following is a list of changes that have been made since the 1.74.0
+release.
+
+Gentext
+
+The following changes have been made to the gentext code since the 1.74.0
+release.
+
+ â— Michael(tm) Smith: locale/ky.xml; Makefile
+
+ new Kirghiz locale from Ilyas Bakirov
+
+ â— Mauritz Jeanson: locale/en.xml
+
+ Added "Acknowledgements".
+
+ â— Dongsheng Song: locale/zh_cn.xml
+
+ Simplified Chinese translation.
+
+ â— Robert Stayton: locale/lv.xml; locale/ca.xml; locale/pt.xml; locale/tr.xml;
+ locale/af.xml;⋯
+
+ Add writing-mode gentext string to support right-to-left languages.
+
+FO
+
+The following changes have been made to the fo code since the 1.74.0 release.
+
+ â— David Cramer: footnote.xsl
+
+ Added a check to confirm that a footnoteref's linkend points to a footnote. Stylesheets stop processing if not and provide a useful error message.
+
+ â— Mauritz Jeanson: spaces.xsl
+
+ Convert spaces to fo:leader also in elements in the DB 5 namespace.
+
+ â— Mauritz Jeanson: pi.xsl; synop.xsl
+
+ Added support for a new processing instruction: dbfo funcsynopsis-style.
+ Closes bug #1838213.
+
+ â— Michael(tm) Smith: inline.xsl; param.xweb; param.ent
+
+ Added new param email.mailto.enabled for FO output.
+ Patch from Paolo Borelli. Closes #2086321.
+
+ â— Mauritz Jeanson: docbook.xsl
+
+ Added support for document metadata for fop1 (patch #2067318).
+
+ â— Jirka Kosek: param.ent; param.xweb; highlight.xsl
+
+ Upgraded to support the latest version of XSLTHL 2.0
+ -- nested markup in highlited code is now processed
+ -- it is no longer needed to specify path XSLTHL configuration file using Java property
+ -- support for new languages, including Perl, Python and Ruby was added
+
+HTML
+
+The following changes have been made to the html code since the 1.74.0 release.
+
+ â— Robert Stayton: param.xweb; docbook.xsl; param.ent; html.xsl
+
+ Add support for writing.mode to set text direction and alignment based on document locale.
+
+ â— Mauritz Jeanson: chunk-changebars.xsl
+
+ Added a new top-level stylesheet module, chunk-changebars.xsl, to be
+ used for generating chunked output with highlighting based on change
+ (@revisionflag) markup. The module imports/includes the standard chunking
+ and changebars templates and contains additional logic for chunked output.
+ See FRs #1015180 and #1819915.
+
+Manpages
+
+The following changes have been made to the manpages code since the 1.74.0
+release.
+
+ â— Michael(tm) Smith: docbook.xsl
+
+ Put the following at the top of generated roff for each page:
+ \" t
+ purpose is to explicitly tell AT&T troff that the page needs to be
+ pre-processed through tbl(1); groff can figure it out
+ automatically, but apparently AT&T troff needs to be explicitly told
+
+ePub
+
+The following changes have been made to the epub code since the 1.74.0 release.
+
+ â— Keith Fahlgren: docbook.xsl
+
+ Patch from Paul Norton of Adobe to get covers to look better in Adobe Digital Editions
+
+ â— Keith Fahlgren: bin/spec/epub_regressions_spec.rb; bin/spec/files/
+ v5cover.xml; bin/spec/sp⋯
+
+ Patch contributed by Liza Daly to make ePub cover handling more generic. Additionally
+ DocBook 5.0's <cover> now has some limited support:
+
+ - should reference a cover in the OPF guide for a DocBook 5.0 test document
+
+ â— Keith Fahlgren: bin/spec/files/isbn.xml; bin/spec/files/issn.xml; bin/spec/
+ files/biblioid.⋯
+
+ Liza Daly reported that the dc:identifer-generation code was garbage (she was right).
+
+ Added new tests:
+ - should include at least one dc:identifier
+ - should include an ISBN as URN for dc:identifier if an ISBN was in the metadata
+ - should include an ISSN as URN for dc:identifier if an ISSN was in the metadata
+ - should include an biblioid as a dc:identifier if an biblioid was in the metadata
+ - should include a URN for a biblioid with @class attribute as a dc:identifier if an biblioid was in the metadata
+
+ â— Keith Fahlgren: docbook.xsl; bin/spec/epub_spec.rb
+
+ Improve both SEO and semantic structure of chunked ePub output by ensuring that
+ we always send out one and only one h1 in each XHTML chunk.
+
+ DocBook::Epub
+ - should include one and only one <h1> in each HTML file in rendered ePub files
+ for <book>s
+ - should include one and only one <h1> in each HTML file in rendered ePub files
+ for <book>s even if they do not have section markup
+
+ â— Keith Fahlgren: docbook.xsl; bin/spec/epub_realbook_spec.rb; bin/spec/files
+ /orm.book.001.x⋯
+
+ Adding better support for covers in epub files destined for .mobi and the Kindle
+
+ â— Keith Fahlgren: bin/dbtoepub; bin/lib/docbook.rb; bin/spec/files/
+ DejaVuSerif.otf; docbook.⋯
+
+ Adding primitive support for embedding a single font
+
+ â— Keith Fahlgren: bin/dbtoepub; bin/lib/docbook.rb; bin/spec/files/
+ test_cust.xsl; bin/spec/e⋯
+
+ Adding support for user-specified customization layers in dbtoepub
+
+ â— Keith Fahlgren: bin/dbtoepub; bin/spec/epub_regressions_spec.rb; bin/lib/
+ docbook.rb; bin/s⋯
+
+ Adding CSS support to .epub target & dbtoepub:
+ -c, --css [FILE] Use FILE for CSS on generated XHTML.
+
+
+ DocBook::Epub
+ ...
+ - should include a CSS link in HTML files when a CSS file has been provided
+ - should include CSS file in .epub when a CSS file has been provided
+ - should include a CSS link in OPF file when a CSS file has been provided
+
+Roundtrip
+
+The following changes have been made to the roundtrip code since the 1.74.0
+release.
+
+ â— Steve Ball: blocks2dbk.xsl; template.xml; template.dot
+
+ added support for imagedata-metadata
+ added support for table as images
+
+ â— Steve Ball: blocks2dbk.xsl; normalise2sections.xsl; sections2blocks.xsl
+
+ Improved support for personname inlines.
+
+ â— Steve Ball: blocks2dbk.xsl; blocks2dbk.dtd; template.xml
+
+ Added support for legalnotice.
+
+ â— Steve Ball: blocks2dbk.xsl; wordml2normalise.xsl
+
+ added support for orgname in author
+
+ â— Steve Ball: specifications.xml; supported.xml; blocks2dbk.xsl;
+ wordml2normalise.xsl; dbk2w⋯
+
+ Updated specification.
+ to-DocBook: add cols attribute to tgroup
+ from-DocBook: fix for blockquote title
+
+Params
+
+The following changes have been made to the params since the 1.74.0 release.
+
+ â— The change was to add man.output.better.ps.enabled parameter, with its
+ default value set to zero. If the value of the man.output.better.ps.enabled
+ parameter is non-zero, certain markup is embedded in each generated man
+ page such that PostScript output from the man -Tps command for that page
+ will include a number of enhancements designed to improve the quality of
+ that output. If man.output.better.ps.enabled is zero (the default), no such
+ markup is embedded in generated man pages, and no enhancements are included
+ in the PostScript output generated from those man pages by the man -Tps
+ command. WARNING: The enhancements provided by this parameter rely on
+ features that are specific to groff (GNU troff) and that are not part of
+ "classic" AT&T troff or any of its derivatives. Therefore, any man pages
+ you generate with this parameter enabled will be readable only on systems
+ on which the groff (GNU troff) program is installed, such as GNU/Linux
+ systems. The pages will not not be readable on systems on with the classic
+ troff (AT&T troff) command is installed. NOTE: The value of this parameter
+ only affects PostScript output generated from the man command. It has no
+ effect on output generated using the FO backend. TIP: You can generate
+ PostScript output for any man page by running the following command: man
+ FOO -Tps > FOO.ps You can then generate PDF output by running the following
+ command: ps2pdf FOO.ps
+
+ â— Robert Stayton: writing.mode.xml
+
+ writing mode param used to set text direction.
+
+ â— Michael(tm) Smith: email.mailto.enabled.xml
+
+ Added new param email.mailto.enabled for FO output.
+ Patch from Paolo Borelli. Closes #2086321.
+
+ â— Jirka Kosek: highlight.source.xml; highlight.xslthl.config.xml
+
+ Upgraded to support the latest version of XSLTHL 2.0
+ -- nested markup in highlited code is now processed
+ -- it is no longer needed to specify path XSLTHL configuration file using Java property
+ -- support for new languages, including Perl, Python and Ruby was added
+
+Highlighting
+
+The following changes have been made to the highlighting code since the 1.74.0
+release.
+
+ â— Jirka Kosek: cpp-hl.xml; c-hl.xml; tcl-hl.xml; php-hl.xml; common.xsl;
+ perl-hl.xml; delphi⋯
+
+ Upgraded to support the latest version of XSLTHL 2.0
+ -- nested markup in highlited code is now processed
+ -- it is no longer needed to specify path XSLTHL configuration file using Java property
+ -- support for new languages, including Perl, Python and Ruby was added
+
+Release Notes: 1.74.0
+
+This release includes important bug fixes and adds the following significant
+feature changes:
+
+.epub target
+
+ Paul Norton (Adobe) and Keith Fahlgren(O'Reilly Media) have donated code
+ that generates .epub documents from DocBook input. An alpha-reference
+ implementation in Ruby has also been provided.
+
+ .epub is an open standard of the The International Digital Publishing Forum
+ (IDPF), a the trade and standards association for the digital publishing
+ industry.
+
+ Read more about this target in epub/README
+
+XHTML 1.1 target
+
+ To support .epub output, a strict XHTML 1.1 target has been added. The
+ stylesheets for this output are generated and are quite similar to the
+ XHTML target.
+
+Gentext updates
+
+ A number of locales have been updated.
+
+Roundtrip improvements
+
+ Table, figure, template syncronization, and character style improvements
+ have been made for WordML & Pages. Support added for OpenOffice.org.
+
+First implementation of a libxslt extension
+
+ A stylesheet extension for libxslt, written in Python, has been added. The
+ extension is a function for adjusting column widths in CALS tables. See
+ extensions/README.LIBXSLT for more information.
+
+The following is a list of changes that have been made since the 1.73.2
+release.
+
+Gentext
+
+The following changes have been made to the gentext code since the 1.73.2
+release.
+
+ â— Michael(tm) Smith: locale/id.xml
+
+ Checked in changes to Indonesion locale submitted by Euis Luhuanam a long time ago.
+
+ â— Michael(tm) Smith: locale/lt.xml
+
+ Added changes to Lithuanian locate submitted a long time back by Nikolajus Krauklis.
+
+ â— Michael(tm) Smith: locale/hu.xml
+
+ fixed error in lowercase.alpha definition in Hungarian locale
+
+ â— Michael(tm) Smith: locale/nb.xml
+
+ Corrected language code for nb locale, and restored missing "startquote" key.
+
+ â— Michael(tm) Smith: locale/ja.xml
+
+ Committed changes to ja locale file, from Akagi Kobayashi. Adds bracket quotes around many xref instances that did not have them
+ before.
+
+ â— Michael(tm) Smith: Makefile
+
+ "no" locale is now "nb"
+
+ â— Michael(tm) Smith: locale/nb.xml
+
+ Update Norwegian Bokmål translation. Thanks to Hans F. Nordhaug.
+
+ â— Michael(tm) Smith: locale/no.xml; locale/nb.xml
+
+ per message from Hans F. Nordhaug, correct identifier for
+ Norwegian Bokmål is "nb" (not "no") and has been for quite some
+ time now...
+
+ â— Michael(tm) Smith: locale/ja.xml
+
+ Converted ja.xml source file to use real unicode characters so
+ that the actual glyphs so up when you edit it in a text editor
+ (instead of the character references).
+
+ â— Michael(tm) Smith: locale/ja.xml
+
+ Checked in changes to ja.xml locale file. Thanks to Akagi Kobayashi.
+
+ â— Michael(tm) Smith: locale/it.xml
+
+ Changes from Federico Zenith
+
+ â— Dongsheng Song: locale/zh_cn.xml
+
+ Added missing translations.
+
+Common
+
+The following changes have been made to the common code since the 1.73.2
+release.
+
+ â— Michael(tm) Smith: l10n.xsl
+
+ Added new template "l10.language.name" for retrieving the
+ English-language name of the lang setting of the current document.
+ Closes #1916837. Thanks to Simon Kennedy.
+
+ â— Michael(tm) Smith: refentry.xsl
+
+ fixed syntax error
+
+ â— Michael(tm) Smith: refentry.xsl
+
+ fixed a couple of typos
+
+ â— Michael(tm) Smith: refentry.xsl
+
+ refined handling of cases where refentry "source" or "manual"
+ metadata is missing or when we use fallback content instead. We
+ now report a Warning if we use fallback content.
+
+ â— Michael(tm) Smith: refentry.xsl
+
+ don't use refmiscinfo@class=date value as fallback for refentry
+ "source" or "manual" metadata fields
+
+ â— Michael(tm) Smith: refentry.xsl
+
+ Made reporting of missing refentry metadata more quiet:
+
+ - we no longer report anything if usable-but-not-preferred
+ metadata is found; we just quietly use whatever we manage to
+ find
+
+ - we now only report missing "source" metadata if the refentry
+ is missing BOTH "source name" and "version" metadata; if it
+ has one but not the other, we use whichever one it has and
+ don't report anything as missing
+
+ The above changes were made because testing with some "real world"
+ source reveals that some authors are intentionally choosing to use
+ "non preferred" markup for some metadata, and also choosing to
+ omit "source name" or "version" metadata in there DocBook XML. So
+ it does no good to give them pedantic reminders about what they
+ already know...
+
+ Also, changed code to cause "fixme" text to be inserted in output
+ in particular cases:
+
+ - if we can't manage to find any "source" metadata at all, we
+ now put fixme text into the output
+
+ - if we can't manage to find any "manual" metadata a all, we
+ now put fixme text into the output
+
+ The "source" and "manual" metadata is necessary information, so
+ buy putting the fixme stuff in the output, we alert users to the
+ need problem of it being missing.
+
+ â— Michael(tm) Smith: refentry.xsl
+
+ When generating manpages output, we no longer report anything if
+ the refentry source is missing date or pubdate content. In
+ practice, many users intentionally omit the date from the source
+ because they explicitly want it to be generated.
+
+ â— Michael(tm) Smith: l10n.xml
+
+ further change needed for switch from no locale to nb.
+
+ â— Michael(tm) Smith: common.xsl
+
+ Added support for orgname in authorgroup. Thanks to Camille
+ Bégnis.
+
+ â— Michael(tm) Smith: Makefile
+
+ "no" locale is now "nb"
+
+ â— Mauritz Jeanson: stripns.xsl
+
+ Removed the template matching "ng:link|db:link" (in order to make @xlink:show
+ work with <link> elements). As far as I can tell, this template is no longer needed.
+
+ â— Mauritz Jeanson: entities.ent
+
+ Moved declaration of comment.block.parents entity to common/entities.ent.
+
+ â— Mauritz Jeanson: titles.xsl
+
+ Added an update the fix made in revision 7528 (handling of xref/link in no.anchor.mode mode).
+ Having xref in title is not a problem as long as the target is not an ancestor element.
+ Closes bug #1838136.
+
+ Note that an xref that is in a title and whose target is an ancestor element is still not
+ rendered in the TOC. This could be considered a bug, but on the other hand I cannot really
+ see the point in having such an xref in a document.
+
+ â— Mauritz Jeanson: titles.xsl
+
+ Added a "not(ancestor::title)" test to work around "too many nested
+ apply-templates" problems when processing xrefs or links in no.anchor.mode mode.
+ Hopefully, this closes bug #1811721.
+
+ â— Mauritz Jeanson: titles.xsl
+
+ Removed old template matching "link" in no.anchor.mode mode.
+
+ â— Mauritz Jeanson: titles.xsl
+
+ Process <link> in no.anchor.mode mode with the same template as <xref>.
+ Closes bug #1759205 (Empty link in no.anchor.mode mode).
+
+ â— Mauritz Jeanson: titles.xsl
+
+ In no.anchor.mode mode, do not output anchors for elements that are descendants
+ of <title>. Previously, having inline elements with @id/@xml:id in <title>s
+ resulted in anchors both in the TOC and in the main flow. Closes bug #1797492.
+
+FO
+
+The following changes have been made to the fo code since the 1.73.2 release.
+
+ â— Mauritz Jeanson: pi.xsl
+
+ Updated documentation for keep-together.
+
+ â— Mauritz Jeanson: task.xsl
+
+ Enabled use of the keep-together PI on task elements.
+
+ â— Robert Stayton: index.xsl
+
+ FOP1 requires fo:wrapper for inline index entries, not fo:inline.
+
+ â— Robert Stayton: index.xsl
+
+ Fixed non-working inline.or.block template for indexterm wrappers.
+ Add fop1 to list of processors using inline.or.block.
+
+ â— Mauritz Jeanson: table.xsl
+
+ Fixed bug #1891965 (colsep in entytbl not working).
+
+ â— Mauritz Jeanson: titlepage.xsl
+
+ Added support for title in revhistory. Closes bug #1842847.
+
+ â— Mauritz Jeanson: pi.xsl
+
+ Small doc cleanup (dbfo float-type).
+
+ â— Mauritz Jeanson: titlepage.xsl
+
+ Insert commas between multiple copyright holders.
+
+ â— Mauritz Jeanson: autotoc.xsl; division.xsl
+
+ Added modifications to support nested set elements. See bug #1853172.
+
+ â— David Cramer: glossary.xsl
+
+ Added normalize-space to xsl:sorts to avoid missorting of glossterms due to stray leading spaces.
+
+ â— David Cramer: glossary.xsl
+
+ Fixed bug #1854199: glossary.xsl should use the sortas attribute on glossentry
+
+ â— Mauritz Jeanson: inline.xsl
+
+ Added a template for citebiblioid. The hyperlink target is the parent of the referenced biblioid,
+ and the "hot text" is the biblioid itself enclosed in brackets.
+
+ â— Mauritz Jeanson: inline.xsl
+
+ Moved declaration of comment.block.parents entity to common/entities.ent.
+
+ â— Mauritz Jeanson: docbook.xsl
+
+ Updated message about unmatched element.
+
+ â— Mauritz Jeanson: param.xweb
+
+ Added link to profiling chapter of TCG.
+
+ â— Mauritz Jeanson: refentry.xsl
+
+ Fixed typo (refsynopsysdiv -> refsynopsisdiv).
+
+ â— David Cramer: fop.xsl; fop1.xsl; ptc.xsl; xep.xsl
+
+ Added test to check generate.index param when generating pdf bookmarks
+
+ â— Mauritz Jeanson: graphics.xsl
+
+ Added support for MathML in imagedata.
+
+ â— Michael(tm) Smith: math.xsl
+
+ Removed unnecessary extra test condition in test express that
+ checks for passivetex.
+
+ â— Michael(tm) Smith: math.xsl
+
+ Don't use fo:instream-foreign-object if we are processing with
+ passivetex. Closes #1806899. Thanks to Justus Piater.
+
+ â— Mauritz Jeanson: component.xsl
+
+ Added code to output a TOC for an appendix in an article when
+ generate.toc='article/appendix toc'. Closes bug #1669658.
+
+ â— Dongsheng Song: biblio-iso690.xsl
+
+ Change encoding from "windows-1250" to "UTF-8".
+
+ â— Mauritz Jeanson: pi.xsl
+
+ Updated documentation for dbfo_label-width.
+
+ â— Mauritz Jeanson: lists.xsl
+
+ Added support for the dbfo_label-width PI in calloutlists.
+
+ â— Robert Stayton: biblio.xsl
+
+ Support finding glossary database entries inside bibliodivs.
+
+ â— Robert Stayton: formal.xsl
+
+ Complete support for <?dbfo pgwide="1"?> for informal
+ elements too.
+
+ â— Mauritz Jeanson: table.xsl
+
+ In the table.block template, added a check for the dbfo_keep-together PI, so that
+ a table may break (depending on the PI value) at a page break. This was needed
+ since the outer fo:block that surrounds fo:table has keep-together.within-column="always"
+ by default, which prevents the table from breaking. Closes bug #1740964 (Titled
+ table does not respect dbfo PI).
+
+ â— Mauritz Jeanson: pi.xsl
+
+ Added a few missing @role="tcg".
+
+ â— Mauritz Jeanson: inline.xsl
+
+ Use normalize-space() in glossterm comparisons (as in html/inline.xsl).
+
+ â— Mauritz Jeanson: autoidx.xsl
+
+ Removed the [&scope;] predicate from the target variable in the template with name="reference".
+ This filter was the cause of missing index backlinks when @zone and @type were used on indexterms,
+ with index.on.type=1. Closes bug #1680836.
+
+ â— Michael(tm) Smith: inline.xsl; xref.xsl; footnote.xsl
+
+ Added capability in FO output for displaying URLs for all
+ hyperlinks (elements marked up with xlink:href attributes) in the
+ same way as URLs for ulinks are already handled (which is to say,
+ either inline or as numbered footnotes).
+
+ Background on this change:
+ DocBook 5 allows "ubiquitous" linking, which means you can make
+ any element a hyperlink just by adding an xlink:href attribute to
+ it, with the value set to an external URL. That's in contrast to
+ DocBook 4, which only allows you to use specific elements (e.g.,
+ the link and ulink elements) to mark up hyperlinks.
+
+ The existing FO stylesheets have a mechanism for handling display
+ of URLs for hyperlinks that are marked up with ulink, but they did
+ not handle display of URLs for elements that were marked up with
+ xlink:href attributes. This change adds handling for those other
+ elements, enabling the URLs they link to be displayed either
+ inline or as numbered footnotes (depending on what values the user
+ has the ulink.show and ulink.footnotes params set to).
+
+ Note that this change only adds URL display support for elements
+ that call the simple.xlink template -- which currently is most
+ (but not all) inline elements.
+
+ This change also moves the URL display handling out of the ulink
+ template and into a new "hyperlink.url.display" named template;
+ the ulink template and the simple.xlink named template now both
+ call the hyperlink.url.display template.
+
+ Warning: In the stylesheet code that determines what footnote
+ number to assign to each footnote or external hyperlink, there is
+ an XPath expression for determining whether a particular
+ xlink:href instance is an external hyperlink; that expression is
+ necessarily a bit complicated and further testing may reveal that
+ it doesn't handle all cases as expected -- so some refinements to
+ it may need to be done later.
+
+ Closes #1785519. Thanks to Ken Morse for reporting and
+ troubleshooting the problem.
+
+HTML
+
+The following changes have been made to the html code since the 1.73.2 release.
+
+ â— Keith Fahlgren: inline.xsl; synop.xsl
+
+ Work to make HTML and XHTML targets more valid
+
+ â— Keith Fahlgren: table.xsl
+
+ Add better handling for tables that have footnotes in the titles
+
+ â— Keith Fahlgren: biblio.xsl
+
+ Add anchors to bibliodivs
+
+ â— Keith Fahlgren: formal.xsl; Makefile; htmltbl.xsl
+
+ Initial checkin/merge of epub target from work provided by Paul Norton of Adobe
+ and Keith Fahlgren of O'Reilly.
+
+ This change includes new code for generating the XHTML 1.1 target sanely.
+
+ â— Mauritz Jeanson: biblio.xsl
+
+ Added code for creating URLs from biblioids with @class="doi" (representing Digital
+ Object Identifiers). See FR #1934434 and http://doi.org.
+
+ To do: 1) Add support for FO output. 2) Figure out how @class="doi" should be handled
+ for bibliorelation, bibliosource and citebiblioid.
+
+ â— Norman Walsh: formal.xsl
+
+ Don't use xsl:copy because it forces the resulting element to be in the same namespace as the source element; in the XHTML stylesheets, that's wrong. But the HTML-to-XHTML converter does the right thing with literal result elements, so use one of them.
+
+ â— Michael(tm) Smith: Makefile
+
+ Added checks and hacks to various makefiles to enable building
+ under Cygwin. This stuff is ugly and maybe not worth the mess and
+ trouble, but does seem to work as expected and not break anything
+ else.
+
+ â— Michael(tm) Smith: docbook.xsl
+
+ added "exslt" namespace binding to html/docbook.xsl file (in
+ addition to existing "exsl" binding. reason is because lack of it
+ seems to cause processing problems when using the profiled
+ version of the stylsheet
+
+ â— Norman Walsh: chunk-common.xsl
+
+ Rename link
+
+ â— Mauritz Jeanson: table.xsl
+
+ Added a fix to make rowsep apply to the last row of thead in entrytbl.
+
+ â— Michael(tm) Smith: synop.xsl
+
+ Simplified and streamlined handling of output for ANSI-style
+ funcprototype output, to correct a problem that was causing type
+ data to be lost in the output parameter definitions. For example,
+ for an instance like this:
+ <paramdef>void *<parameter>dataptr</parameter>[]</paramdef>
+ ... the brackets (indicating an array type) were being dropped.
+
+ â— Michael(tm) Smith: synop.xsl
+
+ Changed HTML handling of K&R-style paramdef output. The parameter
+ definitions are no longer output in a table (though the prototype
+ still is). The reason for the change is that the
+ kr-tabular-funcsynopsis-mode template was causing type data to be
+ lost in the output parameter definitions. For example, for an
+ instance like this:
+ <paramdef>void *<parameter>dataptr</parameter>[]</paramdef>
+ ... the brackets (indicating an array type) were being dropped.
+ The easiest way to deal with the problem is to not try to chop up
+ the parameter definitions and display them in table format, but to
+ instead just output them as-is. May not look quite as pretty, but
+ at least we can be sure no information is being lost...
+
+ â— Michael(tm) Smith: pi.xsl
+
+ updated wording of doc for funcsynopsis-style PI
+
+ â— Michael(tm) Smith: param.xweb; param.ent; synop.xsl
+
+ Removed the funcsynopsis.tabular.threshold param. It's no longer
+ being used in the code and hasn't been since mid 2006.
+
+ â— Mauritz Jeanson: graphics.xsl
+
+ Added support for the img.src.path parameter for SVG graphics. Closes bug #1888169.
+
+ â— Mauritz Jeanson: chunk-common.xsl
+
+ Added missing space.
+
+ â— Norman Walsh: component.xsl
+
+ Fix bug where component titles inside info elements were not handled properly
+
+ â— Michael(tm) Smith: pi.xsl
+
+ Moved dbhtml_stop-chunking embedded doc into alphabetical order,
+ fixed text of TCG section it see-also'ed.
+
+ â— David Cramer: pi.xsl
+
+ Added support for <?dbhtml stop-chunking?> processing instruction
+
+ â— David Cramer: chunk-common.xsl; pi.xsl
+
+ Added support for <?dbhtml stop-chunking?> processing instruction
+
+ â— David Cramer: glossary.xsl
+
+ Fixed bug #1854199: glossary.xsl should use the sortas attribute on glossentry. Also added normalize-space to avoid missorting due to stray leading spaces.
+
+ â— Mauritz Jeanson: inline.xsl
+
+ Added a template for citebiblioid. The hyperlink target is the parent of the referenced biblioid,
+ and the "hot text" is the biblioid itself enclosed in brackets.
+
+ â— Mauritz Jeanson: inline.xsl
+
+ Added support for @xlink:show in the simple.xlink template. The "new" and "replace"
+ values are supported (corresponding to values of "_blank" and "_top" for the
+ ulink.target parameter). I have assumed that @xlink:show should override ulink.target
+ for external URI links. This closes bugs #1762023 and #1727498.
+
+ â— Mauritz Jeanson: inline.xsl
+
+ Moved declaration of comment.block.parents entity to common/entities.ent.
+
+ â— Mauritz Jeanson: param.xweb
+
+ Added link to profiling chapter of TCG.
+
+ â— Dongsheng Song: biblio-iso690.xsl
+
+ Change encoding from "windows-1250" to "UTF-8".
+
+ â— Robert Stayton: biblio.xsl
+
+ Add support in biblio collection to entries in bibliodivs.
+
+ â— Mauritz Jeanson: pi.xsl
+
+ Added missing @role="tcg".
+
+ â— Mauritz Jeanson: chunk-common.xsl; titlepage.xsl
+
+ Refactored legalnotice/revhistory chunking, so that the use.id.as.filename
+ parameter as well as the dbhtml_filename PI are taken into account. A new named
+ template in titlepage.xsl is used to compute the filename.
+
+ â— Mauritz Jeanson: chunk-common.xsl; titlepage.xsl
+
+ An update to the fix for bug #1790495 (r7433):
+ The "ln-" prefix is output only when the legalnotice doesn't have an
+ @id/@xml:id, in which case the stylesheets generate an ID value,
+ resulting in a filename like "ln-7e0fwgj.html". This is useful because
+ without the prefix, you wouldn't know that the file contained a legalnotice.
+ The same logic is also applied to revhistory, using an "rh-" prefix.
+
+ â— Mauritz Jeanson: autoidx.xsl
+
+ Removed the [&scope;] predicate from the target variable in the template with name="reference".
+ This filter was the cause of missing index backlinks when @zone and @type were used on indexterms,
+ with index.on.type=1. Closes bug #1680836.
+
+ â— Mauritz Jeanson: titlepage.xsl
+
+ Added 'ln-' prefix to the name of the legalnotice chunk, in order to match the
+ <link href"..."> that is output by make.legalnotice.head.links (chunk-common.xsl).
+ Modified the href attribute on the legalnotice link.
+ Closes bug #1790495.
+
+Manpages
+
+The following changes have been made to the manpages code since the 1.73.2
+release.
+
+ â— Michael(tm) Smith: other.xsl
+
+ slightly adjusted spacing around admonition markers
+
+ â— Michael(tm) Smith: refentry.xsl; utility.xsl
+
+ make sure refsect3 titles are preceded by a line of space, and
+ make the indenting of their child content less severe
+
+ â— Michael(tm) Smith: block.xsl
+
+ only indent verbatim environments in TTY output, not in non-TTY/PS
+
+ â— Michael(tm) Smith: block.xsl
+
+ made another adjustment to correct vertical alignment of admonition marker
+
+ â— Michael(tm) Smith: block.xsl; other.xsl
+
+ Adjusted/corrected alignment of adominition marker in PS/non-TTY output.
+
+ â— Michael(tm) Smith: endnotes.xsl
+
+ For PS/non-TTY output, display footnote/endnote numbers in
+ superscript.
+
+ â— Michael(tm) Smith: table.xsl; synop.xsl; utility.xsl
+
+ Changed handling of hanging indents for cmdsynopsis, funcsynopsis,
+ and synopfragment such that they now look correct in non-TTY/PS
+ output. We now use the groff \w escape to hang by the actual width
+ -- in the current font -- of the command, funcdef, or
+ synopfragment references number (as opposed to hanging by the
+ number of characters). This rendering in TTY output remains the
+ same, since the width in monospaced TTY output is the same as the
+ number of characters.
+
+ Also, created new synopsis-block-start and synopsis-block-end
+ templates to use for cmdsynopsis and funcsynopsis instead of the
+ corresponding verbatim-* templates.
+
+ Along with those changes, also corrected a problem that caused the
+ content of synopfragment to be dropped, and made a
+ vertical-spacing change to adjust spacing around table titles and
+ among sibling synopfragment instances.
+
+ â— Michael(tm) Smith: other.xsl
+
+ use common l10.language.name template to retrieve English-language name
+
+ â— Michael(tm) Smith: synop.xsl; inline.xsl
+
+ added comment in code explaining why we don't put filename output
+ in italic (despite the fact that man guidelines say we should)
+
+ â— Michael(tm) Smith: inline.xsl
+
+ put filename output in monospace instead of italic
+
+ â— Michael(tm) Smith: synop.xsl
+
+ put cmdsynopsis in monospace
+
+ â— Michael(tm) Smith: inline.xsl
+
+ removed template match for literal. template matches for monospace
+ inlines are all imported from the HTML stylesheet
+
+ â— Michael(tm) Smith: block.xsl
+
+ don't indent verbatim environments that are descendants of
+ refsynopsisdiv, not put backgrounds behind them
+
+ â— Michael(tm) Smith: inline.xsl
+
+ set output of the literal element in monospace. this causes all
+ inline monospace instances in the git man pages to be set in
+ monospace (since DocBook XML source for git docs is generated with
+ asciidoc and asciidoc consistently outputs only <literal> for
+ inline monospace (not <command> or <code> or anything else).
+ Of course this only affects non-TTY output...
+
+ â— Michael(tm) Smith: utility.xsl
+
+ Added inline.monoseq named template.
+
+ â— Michael(tm) Smith: utility.xsl
+
+ don't bother using a custom register to store the previous
+ font-family value when setting blocks of text in code font; just
+ use \F[] .fam with no arg to switch back
+
+ â— Michael(tm) Smith: endnotes.xsl
+
+ put links in blue in PS output (note that this matches how groff
+ renders content marked up with the .URL macro)
+
+ â— Michael(tm) Smith: endnotes.xsl; param.xweb; param.ent
+
+ removed man.links.are.underlined and added man.font.links. Also,
+ changed the default font formatting for links to bold.
+
+ â— Michael(tm) Smith: endnotes.xsl; param.xweb; param.ent
+
+ Added new param man.base.url.for.relative.links .. specifies a
+ base URL for relative links (for ulink, @xlink:href, imagedata,
+ audiodata, videodata) shown in the generated NOTES section of
+ man-page output. The value of man.base.url.for.relative.links is
+ prepended to any relative URI that is a value of ulink url,
+ xlink:href, or fileref attribute.
+
+ If you use relative URIs in link sources in your DocBook refentry
+ source, and you leave man.base.url.for.relative.links unset, the
+ relative links will appear "as is" in the NOTES section of any
+ man-page output generated from your source. That's probably not
+ what you want, because such relative links are only usable in the
+ context of HTML output. So, to make the links meaningful and
+ usable in the context of man-page output, set a value for
+ man.base.url.for.relative.links that points
+ to the online version of HTML output generated from your DocBook
+ refentry source. For example:
+
+ <xsl:param name="man.base.url.for.relative.links"
+ >http://www.kernel.org/pub/software/scm/git/docs/</xsl:param>
+
+ â— Michael(tm) Smith: info.xsl
+
+ If a source refentry contains a Documentation or DOCUMENTATION
+ section, don't report it as having missing AUTHOR information.
+ Also, if missing a contrib/personblurb for a person or org, report
+ pointers to http://docbook.sf.net/el/personblurb and to
+ http://docbook.sf.net/el/contrib
+
+ â— Michael(tm) Smith: info.xsl
+
+ If we encounter an author|editor|othercredit instance that lacks a
+ personblurb or contrib, report it to the user (because that means
+ we have no information about that author|editor|othercredit to
+ display in the generated AUTHOR|AUTHORS section...)
+
+ â— Michael(tm) Smith: info.xsl; docbook.xsl; other.xsl
+
+ if we can't find any usable author data, emit a warning and insert
+ a fixme in the output
+
+ â— Michael(tm) Smith: info.xsl
+
+ fixed bug in indenting of output for contrib instances in AUTHORS
+ section. Thanks to Daniel Leidert and the fglrx docs for exposing
+ the bug.
+
+ â— Michael(tm) Smith: block.xsl
+
+ for a para or simpara that is the first child of a callout,
+ suppress the .sp or .PP that would normally be output (because in
+ those cases, the output goes into a table cell, and the .sp or .PP
+ markup causes a spurious linebreak before it when displayed
+
+ â— Michael(tm) Smith: lists.xsl
+
+ Added support for rendering co callouts and calloutlist instances.
+ So you can now use simple callouts -- marking up programlisting
+ and such with co instances -- and have the callouts displayed in
+ man-page output. ("simple callouts" means using co@id and
+ callout@arearefs pointing to co@id instances; in man/roff output,
+ we can't/don't support markup that uses areaset and area)
+
+ â— Michael(tm) Smith: block.xsl
+
+ only put a line of space after a verbatim if it's followed by a
+ text node or a paragraph
+
+ â— Michael(tm) Smith: utility.xsl
+
+ put verbatim environments in slightly smaller font in non-TTY
+ output
+
+ â— Michael(tm) Smith: lists.xsl
+
+ minor whitespace-only reformatting of lists.xsl source
+
+ â— Michael(tm) Smith: lists.xsl
+
+ Made refinements/fixes to output of orderedlist and itemizedlist
+ -- in part, to get mysql man pages to display correctly. This
+ change causes a "\c" continuation marker to be added between
+ listitem markers and contents (to ensure that the content remains
+ on the same line as the marker when displayed)
+
+ â— Michael(tm) Smith: block.xsl
+
+ put a line of vertical space after all verbatim output that has
+ sibling content following it (not just if that sibling content is
+ a text node)
+
+ â— Michael(tm) Smith: block.xsl
+
+ refined spacing around titles for admonitions
+
+ â— Michael(tm) Smith: block.xsl; other.xsl
+
+ Deal with case of verbatim environments that have a linebreak
+ after the opening tag. Assumption is that users generally don't
+ want that linebreak to appear in output, so we do some groff
+ hackery to mess with vertical spacing and close the space.
+
+ â— Michael(tm) Smith: inline.xsl
+
+ indexterm instances now produce groff comments like this:
+
+ .\" primary: secondary: tertiary
+
+ remark instances, if non-empty, now produce groff comments
+
+ â— Michael(tm) Smith: charmap.groff.xsl; other.xsl
+
+ convert no-break space character to groff "\ \&" (instead of just
+ "\ "). the reason is that if a space occurs at the end of a line,
+ our processing causes it to be eaten. a real-world case of this is
+ the mysql(1) man page. appending the "\&" prevents that
+
+ â— Michael(tm) Smith: block.xsl
+
+ output "sp" before simpara output, not after it (outputting it
+ after results in undesirable whitespace in particular cases; for
+ example, in the hg/mercurial docs
+
+ â— Michael(tm) Smith: table.xsl; synop.xsl; utility.xsl
+
+ renamed from title-preamble to pinch.together and replaced "sp -1"
+ between synopsis fragments with call to pinch.together instead
+
+ â— Michael(tm) Smith: table.xsl
+
+ use title-preamble template for table titles (instead of "sp -1"
+ hack), and "sp 1" after all tables (instead of just "sp"
+
+ â— Michael(tm) Smith: utility.xsl
+
+ created title-preamble template for suppressing line spacing after
+ headings
+
+ â— Michael(tm) Smith: info.xsl
+
+ further refinement of indenting in AUTHORS section
+
+ â— Michael(tm) Smith: block.xsl; other.xsl
+
+ refined handling of admonitions
+
+ â— Michael(tm) Smith: lists.xsl
+
+ Use RS/RE in another place where we had IP ""
+
+ â— Michael(tm) Smith: info.xsl
+
+ Replace (ab)use of IP with "sp -1" in AUTHORS section with RS/RE
+ instead.
+
+ â— Michael(tm) Smith: table.xsl; synop.xsl; info.xsl
+
+ changed all instances of ".sp -1n" to ".sp -1"
+
+ â— Michael(tm) Smith: other.xsl
+
+ add extra line before SH heads only in non-TTY output
+
+ â— Michael(tm) Smith: block.xsl
+
+ Reworked output for admonitions (caution, important, note, tip,
+ warning). In TTY output, admonitions now get indented. In non-TTY
+ output, a colored marker (yellow) is displayed next to them.
+
+ â— Michael(tm) Smith: other.xsl
+
+ Added BM/EM macros for putting a colored marker in margin next to
+ a block of text.
+
+ â— Michael(tm) Smith: utility.xsl
+
+ created make.bold.title template by moving title-bolding part out
+ from nested-section-title template. This allows the bolding to
+ also be used by the template for formatting admonitions
+
+ â— Michael(tm) Smith: info.xsl
+
+ put .br before copyright contents to prevent them from getting run in
+
+ â— Michael(tm) Smith: refentry.xsl; other.xsl; utility.xsl
+
+ made point size of output for Refsect2 and Refsect3 heads bigger
+
+ â— Michael(tm) Smith: other.xsl
+
+ put slightly more space between SH head and underline in non-TTY
+ output
+
+ â— Michael(tm) Smith: param.xweb; param.ent; other.xsl
+
+ Added the man.charmap.subset.profile.english parameter and refined
+ the handling of charmap subsets to differentiate between English
+ and non-English source.
+
+ This way charmap subsets are now handled is this:
+
+ If the value of the man.charmap.use.subset parameter is non-zero,
+ and your DocBook source is not written in English (that is, if its
+ lang or xml:lang attribute has a value other than en), then the
+ character-map subset specified by the man.charmap.subset.profile
+ parameter is used instead of the full roff character map.
+
+ Otherwise, if the lang or xml:lang attribute on the root element
+ in your DocBook source or on the first refentry element in your
+ source has the value en or if it has no lang or xml:lang
+ attribute, then the character-map subset specified by the
+ man.charmap.subset.profile.english parameter is used instead of
+ man.charmap.subset.profile.
+
+ The difference between the two subsets is that
+ man.charmap.subset.profile provides mappings for characters in
+ Western European languages that are not part of the Roman
+ (English) alphabet (ASCII character set).
+
+ â— Michael(tm) Smith: other.xsl
+
+ Various updates, mainly related to uppercasing SH titles:
+
+ - added a "Language: " metadata line to the top comment area of
+ output man pages, to indicate the language the page is in
+
+ - added a "toupper" macro of doing locale-aware uppercasing of
+ SH titles and cross-references to SH titles; the mechanism
+ relies on the uppercase.alpha and lowercase.alpha DocBook
+ gentext keys to do locale-aware uppercasing based on the
+ language the page is written in
+
+ - added a "string.shuffle" template, which provides a library
+ function for "shuffling" two strings together into a single
+ string; it takes the first character for the first string, the
+ first character from second string, etc. The only current use
+ for it is to generate the argument for the groff tr request
+ that does string uppercasing.
+
+ - added make.tr.uppercase.arg and make.tr.normalcase.arg named
+ templates for use in generating groff code for uppercasing and
+ "normal"-casing SH titles
+
+ - made the BB/BE "background drawing" macros have effect only in
+ non-TTY output
+
+ - output a few comments in the top part of source
+
+ â— Michael(tm) Smith: utility.xsl
+
+ removed some leftover kruft
+
+ â— Michael(tm) Smith: refentry.xsl
+
+ To create the name(s) for each man page, we now replace any spaces
+ in the refname(s) with underscores. This ensures that tools like
+ lexgrog(1) will be able to parse the name (lexgrog won't parse
+ names that contain spaces).
+
+ â— Michael(tm) Smith: docbook.xsl
+
+ Put a comment into source of man page to indicate where the main
+ content starts. (We now have a few of macro definitions at the
+ start of the source, so putting this comment in helps those that
+ might be viewing the source.)
+
+ â— Michael(tm) Smith: refentry.xsl
+
+ refined mechanism for generating SH titles
+
+ â— Michael(tm) Smith: charmap.groff.xsl
+
+ Added zcaron, Zcaron, scaron, and Scaron to the groff character map.
+ This means that generated Finnish man pages will no longer contain
+ any raw accented characters -- they'll instead by marked up with
+ groff escapes.
+
+ â— Michael(tm) Smith: other.xsl; utility.xsl
+
+ corrected a regression I introduced about a year ago that caused
+ dots to be output just as "\." -- instead needs to be "\&." (which
+ is what it will be now, after this change)
+
+ â— Michael(tm) Smith: refentry.xsl
+
+ Changed backend handling for generating titles for SH sections and
+ for cross-references to those sections. This should have no effect
+ on TTY output (behavior should remain the same hopefully) but
+ results in titles in normal case (instead of uppercase) in PS
+ output.
+
+ â— Michael(tm) Smith: info.xsl
+
+ use make.subheading template to make subheadings for AUTHORS and
+ COPYRIGHT sections (instead of harcoding roff markup)
+
+ â— Michael(tm) Smith: block.xsl
+
+ put code font around programlisting etc.
+
+ â— Michael(tm) Smith: synop.xsl; docbook.xsl
+
+ embed custom macro definitions in man pages, plus wrap synopsis in
+ code font
+
+ â— Michael(tm) Smith: endnotes.xsl
+
+ use the make.subheading template to generated SH subheading for
+ endnotes section.
+
+ â— Michael(tm) Smith: lists.xsl
+
+ Added some templates for generating if-then-else conditional
+ markup in groff, so let's use those instead of hard-coding it in
+ multiple places...
+
+ â— Michael(tm) Smith: other.xsl; utility.xsl
+
+ Initial checkin of some changes related to making PS/PDF output
+ from "man -l -Tps" look better. The current changes:
+
+ - render synopsis and verbatim sections in a monospace/code font
+
+ - put a light-grey background behind all programlisting, screen,
+ and literallayout instances
+
+ - prevent SH heads in PS output from being rendered in uppercase
+ (as they are in console output)
+
+ - also display xrefs to SH heads in PS output in normal case
+ (instead of uppercase)
+
+ - draw a line under SH heads in PS output
+
+ The changes made to the code to support the above features were:
+
+ - added some embedded/custom macros: one for conditionally
+ upper-casing SH x-refs, one for redefining the SH macro
+ itself, with some conditional handling for PS output, and
+ finally a macro for putting a background/screen (filled box)
+ around a block of text (e.g., a program listing) in PS output
+
+ - added utility templates for wrapping blocks of text in code
+ font; also templates for inline code font
+
+ â— Robert Stayton: refentry.xsl
+
+ refpurpose nodes now get apply-templates instead of just normalize-space().
+
+ â— Michael(tm) Smith: lists.xsl
+
+ Fixed alignment of first lined of text for each listitem in
+ orderedlist output for TTY. Existing code seemed to have been
+ causing an extra undesirable space to appear.
+
+ â— Michael(tm) Smith: lists.xsl
+
+ Wrapped some roff conditionals around roff markup for orderedlist
+ and itemizedlist output, so that the lists look acceptable in PS
+ output as well as TTY.
+
+ â— Michael(tm) Smith: pi.xsl; synop.xsl; param.xweb; param.ent
+
+ Added the man.funcsynopsis.style parameter. Has the same effect in
+ manpages output as the funcsynopsis.style parameter has in HTML
+ output -- except that its default value is 'ansi' instead of 'kr'.
+
+ â— Michael(tm) Smith: synop.xsl
+
+ Reworked handling of K&R funcprototype output. It no longer relies
+ on the HTML kr-tabular templates, but instead just does direct
+ transformation to roff. For K&R output, it displays the paramdef
+ output in an indented list following the prototype.
+
+ â— Michael(tm) Smith: synop.xsl
+
+ Properly integrated handling for K&R output into manpages
+ stylesheet. The choice between K&R output and ANSI output is
+ currently controlled through use of the (HTML) funcsynopsis.style
+ parameter. Note that because the mechanism does currently rely on
+ funcsynopsis.style, the default in manpages output is now K&R
+ (because that's the default of that param). But I suppose I ought
+ to create a man.funcsynopsis.style and make the default for that
+ ANSI (to preserve the existing default behavior).
+
+ â— Michael(tm) Smith: docbook.xsl
+
+ added manpages/pi.xsl file
+
+ â— Michael(tm) Smith: .cvsignore; pi.xsl
+
+ Added "dbman funcsynopsis-style" PI and incorporated it into the
+ doc build.
+
+ â— Michael(tm) Smith: refentry.xsl
+
+ Fixed regression that caused an unescaped dash to be output
+ between refname and refpurpose content. Closes bug #1894244.
+ Thanks to Daniel Leidert.
+
+ â— Michael(tm) Smith: other.xsl
+
+ Fixed problem with dots being escaped in filenames of generated
+ man files. Closes #1827195. Thanks to Daniel Leidert.
+
+ â— Michael(tm) Smith: inline.xsl
+
+ Added support for processing structfield (was appearing in roff
+ output surrounded by HTML <em> tags; fixed so that it gets roff
+ ital markup). Closes bug #1858329. Thanks to Sam Varshavchik.
+
+Epub
+
+The following changes have been made to the epub code since the 1.73.2 release.
+
+ â— Keith Fahlgren: bin/spec/README; bin/spec/epub_realbook_spec.rb
+
+ 'Realbook' spec now passes
+
+ â— Keith Fahlgren: bin/dbtoepub; README; bin/spec/README; bin/lib/docbook.rb;
+ bin/spec/epub_r⋯
+
+ Very primitive Windows support for dbtoepub reference implementation; README for running tests and for the .epub target in general; shorter realbook test document (still fails for now)
+
+ â— Keith Fahlgren: bin/dbtoepub; bin/spec/epub_regressions_spec.rb; bin/lib/
+ docbook.rb; bin/s⋯
+
+ Changes to OPF spine to not duplicate idrefs for documents with parts not at the root; regression specs for same
+
+ â— Keith Fahlgren: docbook.xsl
+
+ Fixing linking to cover @id, distinct from other needs of cover-image-id (again, thanks to Martin Goerner)
+
+ â— Keith Fahlgren: docbook.xsl
+
+ Updating the title of the toc element in the guide to be more explicit (thanks to Martin Goerner)
+
+ â— Keith Fahlgren: bin/spec/examples/amasque_exploded/content.opf; bin/spec/
+ examples/amasque_⋯
+
+ Initial checkin/merge of epub target from work provided by Paul Norton of Adobe
+ and Keith Fahlgren of O'Reilly.
+
+ â— Keith Fahlgren: docbook.xsl
+
+ == General epub test support
+
+ $ spec -O ~/.spec.opts spec/epub_spec.rb
+
+ DocBook::Epub
+ - should be able to be created
+ - should fail on a nonexistent file
+ - should be able to render to a file
+ - should create a file after rendering
+ - should have the correct mimetype after rendering
+ - should be valid .epub after rendering an article
+ - should be valid .epub after rendering an article without sections
+ - should be valid .epub after rendering a book
+ - should be valid .epub after rendering a book even if it has one graphic
+ - should be valid .epub after rendering a book even if it has many graphics
+ - should be valid .epub after rendering a book even if it has many duplicated graphics
+ - should report an empty file as invalid
+ - should confirm that a valid .epub file is valid
+ - should not include PDFs in rendered epub files as valid image inclusions
+ - should include a TOC link in rendered epub files for <book>s
+
+ Finished in 20.608395 seconds
+
+ 15 examples, 0 failures
+
+
+ == Verbose epub test coverage against _all_ of the testdocs
+
+ Fails on only (errors truncated):
+ 1)
+ 'DocBook::Epub should be able to render a valid .epub for the test document /Users/keith/work/docbook-dev/trunk/xsl/epub/bin/spec/testdocs/calloutlist.003.xml [30]' FAILED
+ 'DocBook::Epub should be able to render a valid .epub for the test document /Users/keith/work/docbook-dev/trunk/xsl/epub/bin/spec/testdocs/cmdsynopsis.001.xml [35]' FAILED
+ ....
+
+ Finished in 629.89194 seconds
+
+ 224 examples, 15 failures
+
+ 224 examples, 15 failures yields 6% failure rate
+
+HTMLHelp
+
+The following changes have been made to the htmlhelp code since the 1.73.2
+release.
+
+ â— Mauritz Jeanson: htmlhelp-common.xsl
+
+ Added <xsl:with-param name="quiet" select="$chunk.quietly"/> to calls to
+ the write.chunk, write.chunk.with.doctype, and write.text.chunk templates.
+ This makes chunk.quietly=1 suppress chunk filename messages also for help
+ support files (which seems to be what one would expect). See bug #1648360.
+
+Eclipse
+
+The following changes have been made to the eclipse code since the 1.73.2
+release.
+
+ â— David Cramer: eclipse.xsl
+
+ Use sortas attributes (if they exist) when sorting indexterms
+
+ â— David Cramer: eclipse.xsl
+
+ Added support for indexterm/see in eclipse index.xml
+
+ â— Mauritz Jeanson: eclipse.xsl
+
+ Added <xsl:with-param name="quiet" select="$chunk.quietly"/>
+ to helpidx template.
+
+ â— David Cramer: eclipse.xsl
+
+ Generate index.xml file and add related goo to plugin.xml file. Does not yet support see and seealso.
+
+ â— Mauritz Jeanson: eclipse.xsl
+
+ Added <xsl:with-param name="quiet" select="$chunk.quietly"/> to calls to
+ the write.chunk, write.chunk.with.doctype, and write.text.chunk templates.
+ This makes chunk.quietly=1 suppress chunk filename messages also for help
+ support files (which seems to be what one would expect). See bug #1648360.
+
+JavaHelp
+
+The following changes have been made to the javahelp code since the 1.73.2
+release.
+
+ â— Mauritz Jeanson: javahelp.xsl
+
+ Added <xsl:with-param name="quiet" select="$chunk.quietly"/> to calls to
+ the write.chunk, write.chunk.with.doctype, and write.text.chunk templates.
+ This makes chunk.quietly=1 suppress chunk filename messages also for help
+ support files (which seems to be what one would expect). See bug #1648360.
+
+Roundtrip
+
+The following changes have been made to the roundtrip code since the 1.73.2
+release.
+
+ â— Steve Ball: blocks2dbk.xsl; wordml2normalise.xsl
+
+ fix table/cell borders for wordml, fix formal figure, add emphasis-strong
+
+ â— Mauritz Jeanson: supported.xml
+
+ Changed @cols to 5.
+
+ â— Steve Ball: blocks2dbk.xsl; blocks2dbk.dtd; template.xml
+
+ added pubdate, fixed metadata handling in biblioentry
+
+ â— Steve Ball: supported.xml
+
+ Added support for edition.
+
+ â— Steve Ball: docbook-pages.xsl; wordml-blocks.xsl; docbook.xsl; wordml.xsl;
+ pages-normalise⋯
+
+ Removed stylesheets for old, deprecated conversion method.
+
+ â— Steve Ball: specifications.xml; dbk2ooo.xsl; blocks2dbk.xsl; dbk2pages.xsl;
+ blocks2dbk.dtd⋯
+
+ Added support for Open Office, added edition element, improved list and table support in Word and Pages
+
+ â— Steve Ball: normalise-common.xsl; blocks2dbk.xsl; dbk2pages.xsl;
+ template-pages.xml; templ⋯
+
+ Fixed bug in WordML table handling, improved table handling for Pages 08, synchronised WordML and Pages templates.
+
+ â— Steve Ball: normalise-common.xsl; blocks2dbk.xsl; wordml2normalise.xsl;
+ dbk2wp.xsl
+
+ fix caption, attributes
+
+ â— Steve Ball: specifications.xml; blocks2dbk.xsl; wordml2normalise.xsl;
+ blocks2dbk.dtd; temp⋯
+
+ Fixes to table and list handling
+
+ â— Steve Ball: blocks2dbk.xsl
+
+ added support for explicit emphasis character styles
+
+ â— Steve Ball: wordml2normalise.xsl
+
+ added support for customisation in image handling
+
+ â— Steve Ball: blocks2dbk.xsl
+
+ Added inlinemediaobject support for metadata.
+
+ â— Steve Ball: normalise-common.xsl; blocks2dbk.xsl; template.xml;
+ dbk2wordml.xsl; dbk2wp.xsl
+
+ Added support file. Added style locking. Conversion bug fixes.
+
+Slides
+
+The following changes have been made to the slides code since the 1.73.2
+release.
+
+ â— Michael(tm) Smith: fo/Makefile; html/Makefile
+
+ Added checks and hacks to various makefiles to enable building
+ under Cygwin. This stuff is ugly and maybe not worth the mess and
+ trouble, but does seem to work as expected and not break anything
+ else.
+
+ â— Jirka Kosek: html/plain.xsl
+
+ Added support for showing foil number
+
+Website
+
+The following changes have been made to the website code since the 1.73.2
+release.
+
+ â— Michael(tm) Smith: extensions/saxon64/.classes/.gitignore; extensions/
+ xalan2/.classes/com/⋯
+
+ renamed a bunch more .cvsignore files to .gitignore (to facilitate use of git-svn)
+
+Params
+
+The following changes have been made to the params code since the 1.73.2
+release.
+
+ â— Keith Fahlgren: epub.autolabel.xml
+
+ New parameter for epub, epub.autolabel
+
+ â— Mauritz Jeanson: table.frame.border.color.xml; table.cell.padding.xml;
+ table.cell.border.t⋯
+
+ Added missing refpurposes and descriptions.
+
+ â— Keith Fahlgren: ade.extensions.xml
+
+ Extensions to support Adobe Digital Editions extensions in .epub output.
+
+ â— Mauritz Jeanson: fop.extensions.xml; fop1.extensions.xml
+
+ Clarified that fop1.extensions is for FOP 0.90 and later. Version 1 is not here yet...
+
+ â— Michael(tm) Smith: man.links.are.underlined.xml;
+ man.endnotes.list.enabled.xml; man.font.l⋯
+
+ removed man.links.are.underlined and added man.font.links. Also,
+ changed the default font formatting for links to bold.
+
+ â— Michael(tm) Smith: man.base.url.for.relative.links.xml
+
+ Added new param man.base.url.for.relative.links .. specifies a
+ base URL for relative links (for ulink, @xlink:href, imagedata,
+ audiodata, videodata) shown in the generated NOTES section of
+ man-page output. The value of man.base.url.for.relative.links is
+ prepended to any relative URI that is a value of ulink url,
+ xlink:href, or fileref attribute.
+
+ If you use relative URIs in link sources in your DocBook refentry
+ source, and you leave man.base.url.for.relative.links unset, the
+ relative links will appear "as is" in the NOTES section of any
+ man-page output generated from your source. That's probably not
+ what you want, because such relative links are only usable in the
+ context of HTML output. So, to make the links meaningful and
+ usable in the context of man-page output, set a value for
+ man.base.url.for.relative.links that points
+ to the online version of HTML output generated from your DocBook
+ refentry source. For example:
+
+ <xsl:param name="man.base.url.for.relative.links"
+ >http://www.kernel.org/pub/software/scm/git/docs/</xsl:param>
+
+ â— Michael(tm) Smith: man.string.subst.map.xml
+
+ squeeze .sp\n.sp into a single .sp (to prevent a extra, spurious
+ line of whitespace from being inserted after programlisting etc.
+ in certain cases)
+
+ â— Michael(tm) Smith: refentry.manual.fallback.profile.xml;
+ refentry.source.fallback.profile.⋯
+
+ don't use refmiscinfo@class=date value as fallback for refentry
+ "source" or "manual" metadata fields
+
+ â— Michael(tm) Smith: man.charmap.subset.profile.xml; man.charmap.enabled.xml;
+ man.charmap.su⋯
+
+ made some further doc tweaks related to the
+ man.charmap.subset.profile.english param
+
+ â— Michael(tm) Smith: man.charmap.subset.profile.xml; man.charmap.enabled.xml;
+ man.charmap.su⋯
+
+ Added the man.charmap.subset.profile.english parameter and refined
+ the handling of charmap subsets to differentiate between English
+ and non-English source.
+
+ This way charmap subsets are now handled is this:
+
+ If the value of the man.charmap.use.subset parameter is non-zero,
+ and your DocBook source is not written in English (that is, if its
+ lang or xml:lang attribute has a value other than en), then the
+ character-map subset specified by the man.charmap.subset.profile
+ parameter is used instead of the full roff character map.
+
+ Otherwise, if the lang or xml:lang attribute on the root element
+ in your DocBook source or on the first refentry element in your
+ source has the value en or if it has no lang or xml:lang
+ attribute, then the character-map subset specified by the
+ man.charmap.subset.profile.english parameter is used instead of
+ man.charmap.subset.profile.
+
+ The difference between the two subsets is that
+ man.charmap.subset.profile provides mappings for characters in
+ Western European languages that are not part of the Roman
+ (English) alphabet (ASCII character set).
+
+ â— Michael(tm) Smith: man.charmap.subset.profile.xml
+
+ Added to default charmap used by manpages:
+
+ - the "letters" part of the 'C1 Controls And Latin-1 Supplement
+ (Latin-1 Supplement)' Unicode block
+ - Latin Extended-A block (but not all of the characters from
+ that block have mappings in groff, so some of them are still
+ passed through as-is)
+
+ The effects of this change are that in man pages generated for
+ most Western European languages and for Finnish, all characters
+ not part of the Roman alphabet are (e.g., "accented" characters)
+ are converted to groff escapes.
+
+ Previously, by default we passed through those characters as is
+ (and users needed to use the full charmap if they wanted to have
+ those characters converted).
+
+ As a result of this change, man pages generated for Western
+ European languages will be viewable in some environments in which
+ they are not viewable if the "raw" non-Roman characters are in them.
+
+ â— Mauritz Jeanson: generate.legalnotice.link.xml;
+ generate.revhistory.link.xml
+
+ Added information on how the filename is computed.
+
+ â— Mauritz Jeanson: default.table.width.xml
+
+ Clarified PI usage.
+
+ â— Michael(tm) Smith: man.funcsynopsis.style.xml
+
+ Added the man.funcsynopsis.style parameter. Has the same effect in
+ manpages output as the funcsynopsis.style parameter has in HTML
+ output -- except that its default value is 'ansi' instead of 'kr'.
+
+ â— Michael(tm) Smith: funcsynopsis.tabular.threshold.xml
+
+ Removed the funcsynopsis.tabular.threshold param. It's no longer
+ being used in the code and hasn't been since mid 2006.
+
+ â— Mauritz Jeanson: table.properties.xml
+
+ Set keep-together.within-column to "auto". This seems to be the most sensible
+ default value for tables.
+
+ â— Mauritz Jeanson: informal.object.properties.xml;
+ admon.graphics.extension.xml; informalequ⋯
+
+ Several small documentation fixes.
+
+ â— Mauritz Jeanson: manifest.in.base.dir.xml
+
+ Wording fixes.
+
+ â— Mauritz Jeanson: header.content.properties.xml;
+ footer.content.properties.xml
+
+ Added refpurpose.
+
+ â— Mauritz Jeanson: ulink.footnotes.xml; ulink.show.xml
+
+ Updated for DocBook 5.
+
+ â— Mauritz Jeanson: index.method.xml; glossterm.auto.link.xml
+
+ Spelling and wording fixes.
+
+ â— Mauritz Jeanson: callout.graphics.extension.xml
+
+ Clarifed available graphics formats and extensions.
+
+ â— Mauritz Jeanson: footnote.sep.leader.properties.xml
+
+ Corrected refpurpose.
+
+ â— Jirka Kosek: footnote.properties.xml
+
+ Added more properties which make it possible to render correctly footnotes placed inside verbatim elements.
+
+ â— Mauritz Jeanson: img.src.path.xml
+
+ img.src.path works with inlinegraphic too.
+
+ â— Mauritz Jeanson: saxon.character.representation.xml
+
+ Added TCG link.
+
+ â— Mauritz Jeanson: img.src.path.xml
+
+ Updated description of img.src.path. Bug #1785224 revealed that
+ there was a risk of misunderstanding how it works.
+
+Profiling
+
+The following changes have been made to the profiling code since the 1.73.2
+release.
+
+ â— Jirka Kosek: xsl2profile.xsl
+
+ Added new rules to profile all content generated by HTML Help (including alias files)
+
+ â— Robert Stayton: profile-mode.xsl
+
+ use mode="profile" instead of xsl:copy-of for attributes so
+ they can be more easily customized.
+
+Tools
+
+The following changes have been made to the tools code since the 1.73.2
+release.
+
+ â— Michael(tm) Smith: make/Makefile.DocBook
+
+ various changes and additions to support making with asciidoc as
+ an input format
+
+ â— Michael(tm) Smith: make/Makefile.DocBook
+
+ make dblatex the default PDF maker for the example makefile
+
+ â— Michael(tm) Smith: xsl/build/html2roff.xsl
+
+ Reworked handling of K&R funcprototype output. It no longer relies
+ on the HTML kr-tabular templates, but instead just does direct
+ transformation to roff. For K&R output, it displays the paramdef
+ output in an indented list following the prototype.
+
+ â— Mauritz Jeanson: xsl/build/make-xsl-params.xsl
+
+ Made attribute-sets members of the param list. This enables links to attribute-sets in the
+ reference documentation.
+
+ â— Michael(tm) Smith: xsl/build/html2roff.xsl
+
+ use .BI handling in K&R funsynopsis output for manpages, just as
+ we do already of ANSI output
+
+ â— Michael(tm) Smith: xsl/build/html2roff.xsl
+
+ Implemented initial support for handling tabular K&R output of
+ funcprototype in manpages output. Accomplished by adding more
+ templates to the intermediate HTML-to-roff stylesheet that the
+ build uses to create the manpages/html-synop.xsl stylesheet.
+
+ â— Michael(tm) Smith: xsl/build/doc-link-docbook.xsl
+
+ Made the xsl/tools/xsl/build/doc-link-docbook.xsl stylesheet
+ import profile-docbook.xsl, so that we can do profiling of release
+ notes. Corrected some problems in the target for the release-notes
+ HTML build.
+
+Extensions
+
+The following changes have been made to the extensions code since the 1.73.2
+release.
+
+ â— Keith Fahlgren: Makefile
+
+ Use DOCBOOK_SVN variable everywhere, please; build with PDF_MAKER
+
+ â— Michael(tm) Smith: Makefile
+
+ moved extensions build targets from master xsl/Makefile to
+ xsl/extensions/Makefile
+
+ â— Michael(tm) Smith: .cvsignore
+
+ re-adding empty extensions subdir
+
+XSL-Saxon
+
+The following changes have been made to the xsl-saxon code since the 1.73.2
+release.
+
+ â— Michael(tm) Smith: VERSION
+
+ bring xsl2, xsl-saxon, and xsl-xalan VERSION files up-to-date with
+ recent change to snapshot build infrastructure
+
+ â— Michael(tm) Smith: nbproject/build-impl.xml; nbproject/project.properties
+
+ Changed hard-coded file references in "clean" target to variable
+ references. Closes #1792043. Thanks to Daniel Leidert.
+
+ â— Michael(tm) Smith: VERSION; Makefile
+
+ Did post-release wrap-up of xsl-saxon and xsl-xalan dirs
+
+ â— Michael(tm) Smith: nbproject/build-impl.xml; VERSION; Makefile; test
+
+ More tweaks to get release-ready
+
+XSL-Xalan
+
+The following changes have been made to the xsl-xalan code since the 1.73.2
+release.
+
+ â— Michael(tm) Smith: VERSION
+
+ bring xsl2, xsl-saxon, and xsl-xalan VERSION files up-to-date with
+ recent change to snapshot build infrastructure
+
+ â— Michael(tm) Smith: nbproject/build-impl.xml
+
+ Changed hard-coded file references in "clean" target to variable
+ references. Closes #1792043. Thanks to Daniel Leidert.
+
+ â— Michael(tm) Smith: Makefile; VERSION
+
+ Did post-release wrap-up of xsl-saxon and xsl-xalan dirs
+
+ â— Michael(tm) Smith: Makefile; nbproject/build-impl.xml; VERSION
+
+ More tweaks to get release-ready
+
+XSL-libxslt
+
+The following changes have been made to the xsl-libxslt code since the 1.73.2
+release.
+
+ â— Mauritz Jeanson: python/xslt.py
+
+ Print the result to stdout if no outfile has been given.
+ Some unnecessary semicolons removed.
+
+ â— Mauritz Jeanson: python/xslt.py
+
+ Added a function that quotes parameter values (to ensure that they are interpreted as strings).
+ Replaced deprecated functions from the string module with string methods.
+
+ â— Michael(tm) Smith: python/README; python/README.LIBXSLT
+
+ renamed xsl-libxslt/python/README to xsl-libxslt/python/README.LIBXSLT
+
+ â— Mauritz Jeanson: python/README
+
+ Tweaked the text a little.
+
+Release Notes: 1.73.2
+
+This is solely a minor bug-fix update to the 1.73.1 release. It fixes a
+packaging error in the 1.73.1 package, as well as a bug in footnote handling in
+FO output.
+
+Release: 1.73.1
+
+This is mostly a bug-fix update to the 1.73.0 release.
+
+Gentext
+
+The following changes have been made to the gentext code since the 1.73.0
+release.
+
+ â— Mauritz Jeanson: locale/de.xml
+
+ Applied patch #1766009.
+
+ â— Michael(tm) Smith: locale/lv.xml
+
+ Added localization for ProductionSet.
+
+FO
+
+The following changes have been made to the fo code since the 1.73.0 release.
+
+ â— Mauritz Jeanson: table.xsl
+
+ Modified the tgroup template so that, for tables with multiple tgroups,
+ a width attribute is output on all corresponding fo:tables. Previously,
+ there was a test prohibiting this (and a comment saying that outputting more
+ than one width attribute will cause an error). But this seems to be no longer
+ relevant; it is not a problem with FOP 0.93 or XEP 4.10. Closes bug #1760559.
+
+ â— Mauritz Jeanson: graphics.xsl
+
+ Replaced useless <a> elements with warning messages (textinsert extension).
+
+ â— Mauritz Jeanson: admon.xsl
+
+ Enabled generation of ids (on fo:wrapper) for indexterms in admonition titles, so that page
+ references in the index can be created. Closes bug #1775086.
+
+HTML
+
+The following changes have been made to the html code since the 1.73.0 release.
+
+ â— Mauritz Jeanson: titlepage.xsl
+
+ Added <xsl:call-template name="process.footnotes"/> to abstract template
+ so that footnotes in info/abstract are processed. Closes bug #1760907.
+
+ â— Michael(tm) Smith: pi.xsl; synop.xsl
+
+ Changed handling of HTML output for the cmdsynopsis and
+ funcsynopsis elements, such that a@id instances are generated for
+ them if they are descendants of any element containing a dbcmdlist
+ or dbfunclist PI. Also, update the embedded reference docs for the
+ dbcmdlist and dbfunclist PIs to make it clear that they can be
+ used within any element for which cmdsynopsis or funcsynopsis are
+ valid children.
+
+ â— Michael(tm) Smith: formal.xsl
+
+ Reverted the part of revision 6952 that caused a@id anchors to be
+ generated for output of informal objects. Thanks to Sam Steingold
+ for reporting.
+
+ â— Robert Stayton: glossary.xsl
+
+ Account for a glossary with no glossdiv or glossentry children.
+
+ â— Mauritz Jeanson: titlepage.xsl
+
+ Modified legalnotice template so that the base.name parameter is calculated
+ in the same way as for revhistory chunks. Using <xsl:apply-templates
+ mode="chunk-filename" select="."/> did not work for single-page output since
+ the template with that mode is in chunk-code.xsl.
+
+ â— Mauritz Jeanson: graphics.xsl
+
+ Updated support for SVG (must be a child of imagedata in DB 5).
+ Added support for MathML in imagedata.
+
+ â— Mauritz Jeanson: pi.xsl
+
+ Added documentation for the dbhh PI (used for context-sensitive HTML Help).
+ (The two templates matching 'dbhh' are still in htmlhelp-common.xsl).
+
+Manpages
+
+The following changes have been made to the manpages code since the 1.73.0
+release.
+
+ â— Michael(tm) Smith: endnotes.xsl
+
+ In manpages output, generate warnings about notesources with
+ non-para children only if the notesource is a footnote or
+ annotation. Thanks to Sam Steingold for reporting problems with
+ the existing handling.
+
+HTMLHelp
+
+The following changes have been made to the htmlhelp code since the 1.73.0
+release.
+
+ â— Michael(tm) Smith: htmlhelp-common.xsl
+
+ Added single-pass namespace-stripping support to the htmlhelp,
+ eclipse, and javahelp stylesheets.
+
+Eclipse
+
+The following changes have been made to the eclipse code since the 1.73.0
+release.
+
+ â— Michael(tm) Smith: eclipse.xsl
+
+ Added single-pass namespace-stripping support to the htmlhelp,
+ eclipse, and javahelp stylesheets.
+
+JavaHelp
+
+The following changes have been made to the javahelp code since the 1.73.0
+release.
+
+ â— Michael(tm) Smith: javahelp.xsl
+
+ Added single-pass namespace-stripping support to the htmlhelp,
+ eclipse, and javahelp stylesheets.
+
+Roundtrip
+
+The following changes have been made to the roundtrip code since the 1.73.0
+release.
+
+ â— Steve Ball: blocks2dbk.xsl; blocks2dbk.dtd; pages2normalise.xsl
+
+ Modularised blocks2dbk to allow customisation,
+ Added support for tables to pages2normalise
+
+Params
+
+The following changes have been made to the params code since the 1.73.0
+release.
+
+ â— Robert Stayton: procedure.properties.xml
+
+ procedure was inheriting keep-together from formal.object.properties, but
+ a procedure does not need to be kept together by default.
+
+ â— Dave Pawson: title.font.family.xml;
+ component.label.includes.part.label.xml; table.frame.b⋯
+
+ Regular formatting re-org.
+
+Release: 1.73.0
+
+This release includes important bug fixes and adds the following significant
+feature changes:
+
+New localizations and localization updates
+
+ We added two new localizations: Latvian and Esperanto, and made updates to
+ the Czech, Chinese Simplified, Mongolian, Serbian, Italian, and Ukrainian
+ localizations.
+
+ISO690 citation style for bibliography output.
+
+ Set the bibliography.style parameter to iso690 to use ISO690 style.
+
+New documentation for processing instructions (PI)
+
+ The reference documentation that ships with the release now includes
+ documentation on all PIs that you can use to control output from the
+ stylesheets.
+
+New profiling parameters for audience and wordsize
+
+ You can now do profiling based on the values of the audience and wordsize
+ attributes.
+
+Changes to man-page output
+
+ The manpages stylesheet now supports single-pass profiling and single-pass
+ DocBook 5 namespace stripping (just as the HTML and FO stylesheets also
+ do). Also, added handling for mediaobject & inlinemediaobject. (Each
+ imagedata, audiodata, or videodata element within a mediaobject or inline
+ mediaobject is now treated as a "notesource" and so handled in much the
+ same way as links and annotation/alt/footnote are in manpages output.) And
+ added the man.authors.section.enabled and man.copyright.section.enabled
+ parameters to enable control over whether output includes auto-generated
+ AUTHORS and COPYRIGHT sections.
+
+Highlighting support for C
+
+ The highlighting mechanism for generating syntax-highlighted code snippets
+ in output now supports C code listings (along with Java, PHP, XSLT, and
+ others).
+
+Experimental docbook-xsl-update script
+
+ We added an experimental docbook-xsl-update script, the purpose of which is
+ to facilitate easy sync-up to the latest docbook-xsl snapshot (by means of
+ rsync).
+
+Gentext
+
+The following changes have been made to the gentext code since the 1.72.0
+release.
+
+ â— Michael(tm) Smith: locale/lv.xml; Makefile
+
+ Added Latvian localization file, from Girts Ziemelis.
+
+ â— Dongsheng Song: locale/zh_cn.xml
+
+ Brought up to date with en.xml in terms of items. A few strings marked for translation.
+
+ â— Jirka Kosek: locale/cs.xml
+
+ Added missing translations
+
+ â— Robert Stayton: locale/eo.xml
+
+ New locale for Esperanto.
+
+ â— Robert Stayton: locale/mn.xml
+
+ Update from Ganbold Tsagaankhuu.
+
+ â— Jirka Kosek: locale/en.xml; locale/cs.xml
+
+ Rules for normalizing glossary entries before they are sorted can be now different for each language.
+
+ â— Michael(tm) Smith: locale/sr_Latn.xml; locale/sr.xml
+
+ Committed changes from MiloÅ¡ KomarÄević to Serbian files.
+
+ â— Robert Stayton: locale/ja.xml
+
+ Fix chapter in context xref-number-and-title
+
+ â— Robert Stayton: locale/it.xml
+
+ Improved version from contributor.
+
+ â— Mauritz Jeanson: locale/uk.xml
+
+ Applied patch 1592083.
+
+Common
+
+The following changes have been made to the common code since the 1.72.0
+release.
+
+ â— Michael(tm) Smith: labels.xsl
+
+ Changed handling of reference auto-labeling such that reference
+ (when it appears at the component level) is now affected by the
+ label.from.part param, just as preface, chapter, and appendix.
+
+ â— Michael(tm) Smith: common.xsl
+
+ Added support to the HTML stylesheets for proper processing of
+ orgname as a child of author.
+
+ â— Michael(tm) Smith: refentry.xsl
+
+ Refined logging output of refentry metadata-gathering template;
+ for some cases of "missing" elements (refmiscinfo stuff, etc.),
+ the log messages now include URL to corresponding page in the
+ Definitive Guide (TDG).
+
+ â— Robert Stayton: titles.xsl
+
+ Add refsection/info/title support.
+
+ â— Michael(tm) Smith: titles.xsl
+
+ Added support for correct handling of xref to elements that
+ contain info/title descendants but no title children.
+
+ This should be further refined so that it handles any *info
+ elements. And there are probably some other places where similar
+ handling for *info/title should be added.
+
+ â— Mauritz Jeanson: pi.xsl
+
+ Modified <xsl:when> in datetime.format template to work
+ around Xalan bug.
+
+FO
+
+The following changes have been made to the fo code since the 1.72.0 release.
+
+ â— Robert Stayton: component.xsl
+
+ Add parameters to the page.sequence utility template.
+
+ â— Mauritz Jeanson: xref.xsl
+
+ Added template for xref to area/areaset.
+ Part of fix for bug #1675513 (xref to area broken).
+
+ â— Michael(tm) Smith: inline.xsl
+
+ Added template match for person element to fo stylesheet.
+
+ â— Robert Stayton: lists.xsl
+
+ Added support for spacing="compact" in variablelist, per bug report #1722540.
+
+ â— Robert Stayton: table.xsl
+
+ table pgwide="1" should also use pgwide.properties attribute-set.
+
+ â— Mauritz Jeanson: inline.xsl
+
+ Make citations numbered if bibliography.numbered != 0.
+
+ â— Robert Stayton: param.xweb; param.ent
+
+ Add new profiling parameters for audience and wordsize.
+
+ â— Robert Stayton: param.xweb; param.ent
+
+ Added callout.icon.size parameter.
+
+ â— Robert Stayton: inline.xsl; xref.xsl
+
+ Add support for xlink as olink.
+
+ â— Robert Stayton: autotoc.xsl; param.xweb; param.ent
+
+ Add support for qanda.in.toc to fo TOC.
+
+ â— Robert Stayton: component.xsl
+
+ Improved the page.sequence utility template for use with book.
+
+ â— Robert Stayton: division.xsl
+
+ Refactored the big book template into smaller pieces.
+ Used the "page.sequence" utility template in
+ component.xsl to shorten the toc piece.
+ Added placeholder templates for front.cover and back.cover.
+
+ â— Robert Stayton: param.xweb; param.ent; sections.xsl
+
+ Add section.container.element parameter to enable
+ pgwide spans inside sections.
+
+ â— Robert Stayton: param.xweb; param.ent; component.xsl
+
+ Add component.titlepage.properties attribute-set to
+ support span="all" and other properties.
+
+ â— Robert Stayton: htmltbl.xsl; table.xsl
+
+ Apply table.row.properties template to html tr rows too.
+ Add keep-with-next to table.row.properties when row is in thead.
+
+ â— Robert Stayton: table.xsl
+
+ Add support for default.table.frame parameter.
+ Fix bug 1575446 rowsep last check for @morerows.
+
+ â— Robert Stayton: refentry.xsl
+
+ Add support for info/title in refsections.
+
+ â— David Cramer: qandaset.xsl
+
+ Make fo questions and answers behave the same way as html
+
+ â— Jirka Kosek: lists.xsl
+
+ Added missing attribute set for procedure
+
+ â— Jirka Kosek: param.xweb; biblio.xsl; docbook.xsl; param.ent;
+ biblio-iso690.xsl
+
+ Added support for formatting biblioentries according to ISO690 citation style.
+ New bibliography style can be turned on by setting parameter bibliography.style to "iso690"
+ The code was provided by Jana Dvorakova
+
+ â— Robert Stayton: param.xweb; param.ent; pagesetup.xsl
+
+ Add header.table.properties and footer.table.properties attribute-sets.
+
+ â— Robert Stayton: inline.xsl
+
+ Add fop1.extensions for menuchoice arrow handling exception.
+
+HTML
+
+The following changes have been made to the html code since the 1.72.0 release.
+
+ â— Mauritz Jeanson: param.xweb; param.ent
+
+ Moved declaration and documentation of javahelp.encoding from javahelp.xsl to the
+ regular "parameter machinery".
+
+ â— Michael(tm) Smith: admon.xsl
+
+ Changed handling of titles for note, warning, caution, important,
+ tip admonitions: We now output and HTML h3 head only if
+ admon.textlabel is non-zero or if the admonition actually contains
+ a title; otherwise, we don't output an h3 head at all.
+ (Previously, we were outputting an empty h3 if the admon.textlabel
+ was zero and if the admonition had no title.)
+
+ â— Mauritz Jeanson: xref.xsl
+
+ Added template for xref to area/areaset.
+ Part of fix for bug #1675513 (xref to area broken).
+
+ â— Mauritz Jeanson: titlepage.xsl; component.xsl; division.xsl; sections.xsl
+
+ Added fixes to avoid duplicate ids when generate.id.attributes = 1.
+ This (hopefully) closes bug #1671052.
+
+ â— Michael(tm) Smith: formal.xsl; pi.xsl
+
+ Made the dbfunclist PI work as intended. Also added doc for
+ dbfunclist and dbcmdlist PIs.
+
+ â— Michael(tm) Smith: pi.xsl; synop.xsl
+
+ Made the dbcmdlist work the way it appears to have been intended
+ to work. Restored dbhtml-dir template back to pi.xsl.
+
+ â— Michael(tm) Smith: titlepage.xsl; param.xweb; param.ent
+
+ Added new param abstract.notitle.enabled.
+ If non-zero, in output of the abstract element on titlepages,
+ display of the abstract title is suppressed.
+ Because sometimes you really don't want or need that title
+ there...
+
+ â— Michael(tm) Smith: chunk-code.xsl; graphics.xsl
+
+ When we are chunking long descriptions for mediaobject instances
+ into separate HTML output files, and use.id.as.filename is
+ non-zero, if a mediaobject has an ID, use that ID as the basename
+ for the long-description file (otherwise, we generate an ID for it
+ and use that ID as the basename for the file).
+ The parallels the recent change made to cause IDs for legalnotice
+ instances to be used as basenames for legalnotice chunks.
+ Also, made some minor refinements to the recent changes for
+ legalnotice chunk handling.
+
+ â— Michael(tm) Smith: titlepage.xsl
+
+ Added support to the HTML stylesheets for proper processing of
+ orgname as a child of author.
+
+ â— Michael(tm) Smith: chunk-code.xsl
+
+ When $generate.legalnotice.link is non-zero and
+ $use.id.as.filename is also non-zero, if a legalnotice has an ID,
+ then instead of assigning the "ln-<generatedID>" basename to the
+ output file for that legalnotice, just use its real ID as the
+ basename for the file -- as we do when chunking other elements
+ that have IDs.
+
+ â— David Cramer: xref.xsl
+
+ Handle alt text on xrefs to steps when the step doesn't have a title.
+
+ â— David Cramer: lists.xsl
+
+ Added <p> element around term in variablelist when formatted as table to avoid misalignment of term and listitem in xhtml (non-quirks mode) output
+
+ â— David Cramer: qandaset.xsl
+
+ Added <p> element around question and answer labels to avoid misalignment of label and listitem in xhtml (non-quirks mode) output
+
+ â— David Cramer: lists.xsl
+
+ Added <p> element around callouts to avoid misalignment of callout and listitem in xhtml (non-quirks mode) output
+
+ â— Mauritz Jeanson: inline.xsl
+
+ Make citations numbered if bibliography.numbered != 0.
+
+ â— Robert Stayton: param.xweb; param.ent
+
+ Add support for new profiling attributes audience and wordsize.
+
+ â— Robert Stayton: inline.xsl; xref.xsl
+
+ Add support for xlink olinks.
+
+ â— Jirka Kosek: glossary.xsl
+
+ Rules for normalizing glossary entries before they are sorted can be now different for each language.
+
+ â— Robert Stayton: chunk-common.xsl; chunk-code.xsl; manifest.xsl; chunk.xsl
+
+ Refactored the chunking modules to move all named templates to
+ chunk-common.xsl and all match templates to chunk-code.xsl, in
+ order to enable better chunk customization.
+ See the comments in chunk.xsl for more details.
+
+ â— Robert Stayton: lists.xsl
+
+ Add anchor for xml:id for listitem in varlistentry.
+
+ â— Robert Stayton: refentry.xsl
+
+ Add support for info/title in refsections for db5.
+
+ â— Jirka Kosek: param.xweb; biblio.xsl; docbook.xsl; param.ent;
+ biblio-iso690.xsl
+
+ Added support for formatting biblioentries according to ISO690 citation style.
+ New bibliography style can be turned on by setting parameter bibliography.style to "iso690"
+ The code was provided by Jana Dvorakova
+
+ â— Robert Stayton: inline.xsl; xref.xsl
+
+ Add call to class.attribute to <a> output elements so they can
+ have a class value too.
+
+ â— Mauritz Jeanson: glossary.xsl
+
+ Fixed bug #1644881:
+ * Added curly braces around all $language attribute values.
+ * Moved declaration of language variable to top level of stylesheet.
+ Tested with Xalan, Saxon, and xsltproc.
+
+Manpages
+
+The following changes have been made to the manpages code since the 1.72.0
+release.
+
+ â— Michael(tm) Smith: param.xweb; docbook.xsl; param.ent
+
+ Added the man.authors.section.enabled and
+ man.copyright.section.enabled parameters. Set those to zero when
+ you want to suppress display of the auto-generated AUTHORS and
+ COPYRIGHT sections. Closes request #1467806. Thanks to Daniel
+ Leidert.
+
+ â— Michael(tm) Smith: docbook.xsl
+
+ Took the test that the manpages stylesheet does to see if there
+ are any Refentry chilren in current doc, and made it
+ namespace-agnostic. Reason for that is because the test otherwise
+ won't work when it is copied over into the generated
+ profile-docbook.xsl stylesheet.
+
+ â— Michael(tm) Smith: Makefile
+
+ Added a manpages/profile-docbook.xsl file to enable single-pass
+ profiling for manpages output.
+
+ â— Michael(tm) Smith: info.xsl
+
+ Output copyright and legalnotice in man-page output in whatever
+ place they are in in document order. Closes #1690539. Thanks to
+ Daniel Leidert for reporting.
+
+ â— Michael(tm) Smith: docbook.xsl
+
+ Restored support for single-pass namespace stripping to manpages
+ stylesheet.
+
+ â— Michael(tm) Smith: synop.xsl; block.xsl; info.xsl; inline.xsl; lists.xsl;
+ endnotes.xsl; ut⋯
+
+ Changed handling of bold and italic/underline output in manpages
+ output. Should be transparent to users, but...
+
+ This touches handling of all bold and italic/underline output. The
+ exact change is that the mode="bold" and mode="italic" utility
+ templates were changed to named templates. (I think maybe I've
+ changed it back and forth from mode to named before, so this is
+ maybe re-reverting it yet again).
+
+ Anyway, the reason for the change is that the templates are
+ sometimes call on dynamically node-sets, and using modes to format
+ those doesn't allow passing info about the current/real context
+ node from the source (not the node-set created by the stylesheet)
+ to that formatting stage.
+
+ The named templates allow the context to be passed in as a
+ parameter, so that the bold/ital formatting template can use
+ context-aware condition checking.
+
+ This was basically necessary in order to suppress bold formatting
+ in titles, which otherwise gets screwed up because of the numbnut
+ way that roff handles nested bold/ital.
+
+ Closes #1674534). Much thanks to Daniel Leidert, whose in his
+ docbook-xsl bug-finding kung-fu has achieved Grand Master status.
+
+ â— Michael(tm) Smith: block.xsl
+
+ Fixed handling of example instances by adding the example element
+ to the same template we use for processing figure. Closes
+ #1674538. Thanks to Daniel Leidert.
+
+ â— Michael(tm) Smith: utility.xsl
+
+ Don't include lang in manpages filename/pathname if lang=en (that
+ is, only generate lang-qualified file-/pathnames for non-English).
+
+ â— Michael(tm) Smith: endnotes.xsl
+
+ In manpages output, emit warnings for notesources (footnote, etc.)
+ that have something other than para as a child.
+
+ The numbered-with-hanging-indent formatting that's used for
+ rendering endnotes in the NOTES section of man pages places some
+ limits/assumptions on how the DocBook source is marked up; namely,
+ for notesources (footnote, annotation, etc.) that can contain
+ block-level children, if the they have a block-level child such as
+ a table or itemizedlist or orderedlist that is the first child of
+ a footnote, we have no way of rendering/indenting its content
+ properly in the endnotes list.
+
+ Thus, the manpages stylesheet not emits a warning message for that
+ case, and suggests the "fix" (which is to wrap the table or
+ itemizedlist or whatever in a para that has some preferatory text.
+
+ â— Michael(tm) Smith: utility.xsl
+
+ Added support to mixed-block template for handling tables in
+ mixed-blocks (e.g., as child of para) correctly.
+
+ â— Michael(tm) Smith: table.xsl; synop.xsl; block.xsl; info.xsl; lists.xsl;
+ refentry.xsl; end⋯
+
+ Reverted necessary escaping of backslash, dot, and dash
+ out of the well-intentioned (but it now appears,
+ misguided) "marker" mechanism (introduced in the 1.72.0
+ release) -- which made use of alternative "marker"
+ characters as internal representations of those
+ characters, and then replaced them just prior to
+ serialization -- and back into what's basically the
+ system that was used prior to the 1.69.0 release; that
+ is, into a part of stylesheet code that gets executed
+ at the beginning of processing -- before any other roff
+ markup up is. This change obviates the need for the
+ marker system. It also requires a lot less RAM during
+ processing (for large files, the marker mechanism
+ ending up requiring gigabytes of memory).
+
+ Closes bug #1661177. Thanks to Scott Smedley for
+ providing a test case (the fvwm man page) that exposed
+ the problem with the marker mechanism.
+
+ Also moved the mechanism for converting non-breaking
+ spaces back into the same area of the stylesheet code.
+
+ â— Michael(tm) Smith: lists.xsl
+
+ Fixed problem with incorrect formatting of nested variablelist.
+ Closes bug #1650931. Thanks to Daniel "Eagle Eye" Leidert.
+
+ â— Michael(tm) Smith: lists.xsl
+
+ Make sure that all listitems in itemizedlist and orderedlist are
+ preceded by a blank line. This fixes a regression that occurred
+ when instances of the TP macro that were use in a previous
+ versions of the list-handling code were switched to RS/RE (because
+ TP doesn't support nesting). TP automatically generates a blank
+ line, but RS doesn't. So I added a .sp before each .RS
+
+ â— Michael(tm) Smith: block.xsl; inline.xsl; param.xweb; docbook.xsl;
+ links.xsl; param.ent
+
+ Made a number of changes related to elements with
+ out-of-line content:
+
+ - Added handling for mediaobject & inlinemediaobject.
+ Each imagedata, audiodata, or videodata element
+ within a mediaobject or inline mediaobject is now
+ treated as a "notesource" and so handled in much the
+ same way as links and annotation/alt/footnotes.
+
+ That means a numbered marker is generated inline to
+ mark the place in the main flow where the imagedata,
+ audiodata, or videodata element occurs, and a
+ corresponding numbered endnote for it is generated in
+ the endnotes list at the end of the man page; the
+ endnote contains the URL from the fileref attribute
+ of the imagedata, audiodata, or videodata element.
+
+ For mediobject and inlinemediaobject instances that
+ have a textobject child, the textobject is displayed
+ within the main text flow.
+
+ - Renamed several man.link.* params to man.endnotes.*,
+ to reflect that fact that the endnotes list now
+ contains more than just links. Also did similar
+ renaming for a number of stylesheet-internal vars.
+
+ - Added support for xlink:href (along with existing
+ support for the legacy ulink element).
+
+ - Cleaned up and streamlined the endnotes-handling
+ code. It's still messy and klunky and the basic
+ mechanism it uses is very inefficent for documents
+ that contain a lot of notesources, but at least it's
+ a bit better than it was.
+
+Eclipse
+
+The following changes have been made to the eclipse code since the 1.72.0
+release.
+
+ â— Mauritz Jeanson: Makefile
+
+ Fixed bug #1715093: Makefile for creating profiled version of eclipse.xsl added.
+
+ â— David Cramer: eclipse.xsl
+
+ Added normalize-space around to avoid leading whitespace from appearing in the output if there's extra leading whitespace (e.g. <title> Foo</title>) in the source
+
+JavaHelp
+
+The following changes have been made to the javahelp code since the 1.72.0
+release.
+
+ â— Mauritz Jeanson: javahelp.xsl
+
+ Implemented FR #1230233 (sorted index in javahelp).
+
+ â— Mauritz Jeanson: javahelp.xsl
+
+ Added normalize-space() around titles and index entries to work around whitespace problems.
+ Added support for glossary and bibliography in toc and map files.
+
+Roundtrip
+
+The following changes have been made to the roundtrip code since the 1.72.0
+release.
+
+ â— Steve Ball: blocks2dbk.xsl; wordml2normalise.xsl; normalise2sections.xsl;
+ sections2blocks.⋯
+
+ new stylesheets for better word processor support and easier maintenance
+
+ â— Steve Ball: template-pages.xml; dbk2wp.xsl; sections-spec.xml
+
+ fixed bugs
+
+Params
+
+The following changes have been made to the params code since the 1.72.0
+release.
+
+ â— Mauritz Jeanson: htmlhelp.button.back.xml; htmlhelp.button.forward.xml;
+ htmlhelp.button.zo⋯
+
+ Modified refpurpose text.
+
+ â— Mauritz Jeanson: htmlhelp.map.file.xml; htmlhelp.force.map.and.alias.xml;
+ htmlhelp.alias.f⋯
+
+ Fixed typos, made some small changes.
+
+ â— Mauritz Jeanson: javahelp.encoding.xml
+
+ Moved declaration and documentation of javahelp.encoding from javahelp.xsl to the
+ regular "parameter machinery".
+
+ â— Mauritz Jeanson: generate.id.attributes.xml
+
+ Added refpurpose text.
+
+ â— Mauritz Jeanson: annotation.js.xml; annotation.graphic.open.xml;
+ annotation.graphic.close.⋯
+
+ Added better refpurpose texts.
+
+ â— Michael(tm) Smith: chunker.output.cdata-section-elements.xml;
+ chunker.output.standalone.xm⋯
+
+ Fixed some broken formatting in source files for chunker.* params,
+ as pointed out by Dave Pawson.
+
+ â— Michael(tm) Smith: label.from.part.xml
+
+ Changed handling of reference auto-labeling such that reference
+ (when it appears at the component level) is now affected by the
+ label.from.part param, just as preface, chapter, and appendix.
+
+ â— Mauritz Jeanson: callout.graphics.extension.xml
+
+ Clarified that 'extension' refers to file names.
+
+ â— Michael(tm) Smith: abstract.notitle.enabled.xml
+
+ Added new param abstract.notitle.enabled.
+ If non-zero, in output of the abstract element on titlepages,
+ display of the abstract title is suppressed.
+ Because sometimes you really don't want or need that title
+ there...
+
+ â— Michael(tm) Smith: man.string.subst.map.xml
+
+ Updated manpages string-substitute map to reflect fact that
+ because of another recent change to suppress bold markup in .SH
+ output, we no longer need to add a workaround for the accidental
+ uppercasing of roff escapes that occurred previously.
+
+ â— Jirka Kosek: margin.note.float.type.xml; title.font.family.xml;
+ table.frame.border.color.x⋯
+
+ Improved parameter metadata
+
+ â— Robert Stayton: profile.wordsize.xml; profile.audience.xml
+
+ Add support for profiling on new attributes audience and wordsize.
+
+ â— Robert Stayton: callout.graphics.number.limit.xml;
+ callout.graphics.extension.xml
+
+ Added SVG graphics for fo output.
+
+ â— Robert Stayton: callout.icon.size.xml
+
+ Set size of callout graphics.
+
+ â— Jirka Kosek: default.units.xml; chunker.output.method.xml;
+ toc.list.type.xml; output.inden⋯
+
+ Updated parameter metadata to the new format.
+
+ â— Jirka Kosek: man.output.quietly.xml; title.font.family.xml;
+ footnote.sep.leader.properties⋯
+
+ Added type annotations into parameter definition files.
+
+ â— Robert Stayton: section.container.element.xml
+
+ Support spans in sections for certain processors.
+
+ â— Robert Stayton: component.titlepage.properties.xml
+
+ Empty attribute set for top level component titlepage block.
+ Allows setting a span on title info.
+
+ â— Jirka Kosek: bibliography.style.xml
+
+ Added link to WiKi page with description of special markup needed for ISO690 biblioentries
+
+ â— Robert Stayton: make.year.ranges.xml
+
+ Clarify that multiple year elements are required.
+
+ â— Robert Stayton: id.warnings.xml
+
+ Turn off id.warnings by default.
+
+ â— Jirka Kosek: bibliography.style.xml
+
+ Added support for formatting biblioentries according to ISO690 citation style.
+ New bibliography style can be turned on by setting parameter bibliography.style to "iso690"
+ The code was provided by Jana Dvorakova
+
+ â— Robert Stayton: header.table.properties.xml; footer.table.properties.xml
+
+ Support adding table properties to header and footer tables.
+
+Highlighting
+
+The following changes have been made to the highlighting code since the 1.72.0
+release.
+
+ â— Jirka Kosek: c-hl.xml; xslthl-config.xml
+
+ Added support for C language. Provided by Bruno Guegan.
+
+Profiling
+
+The following changes have been made to the profiling code since the 1.72.0
+release.
+
+ â— Robert Stayton: profile-mode.xsl
+
+ Add support for new profiling attributes audience and wordsize.
+
+Lib
+
+The following changes have been made to the lib code since the 1.72.0 release.
+
+ â— Michael(tm) Smith: lib.xweb
+
+ Changed name of prepend-pad template to pad-string and twheeked so
+ it can do both right/left padding.
+
+Tools
+
+The following changes have been made to the tools code since the 1.72.0
+release.
+
+ â— Michael(tm) Smith: bin; bin/docbook-xsl-update
+
+ Did some cleanup to the install.sh source and added a
+ docbook-xsl-update script to the docbook-xsl distro, the purpose
+ of which is to facilitate easy sync-up to the latest docbook-xsl
+ snapshot (by means of rsync).
+
+XSL-Saxon
+
+The following changes have been made to the xsl-saxon code since the 1.72.0
+release.
+
+ â— Mauritz Jeanson: xalan27/src/com/nwalsh/xalan/Verbatim.java; xalan27/src/
+ com/nwalsh/xalan/⋯
+
+ Added modifications so that the new callout.icon.size parameter is taken into account. This
+ parameter is used for FO output (where SVG now is the default graphics format for callouts).
+
+ â— Mauritz Jeanson: saxon65/src/com/nwalsh/saxon/FormatCallout.java; xalan27/
+ src/com/nwalsh/x⋯
+
+ Added code for generating id attributes on callouts in HTML and FO output.
+ These patches enable cross-references to callouts placed by area coordinates.
+ It works for graphic, unicode and text callouts.
+ Part of fix for bug #1675513 (xref to area broken).
+
+ â— Michael(tm) Smith: saxon65/src/com/nwalsh/saxon/Website.java; xalan27/src/
+ com/nwalsh/xalan⋯
+
+ Copied over Website XSL Java extensions.
+
+XSL-Xalan
+
+The following changes have been made to the xsl-xalan code since the 1.72.0
+release.
+
+ â— Michael(tm) Smith: Makefile; xalan2
+
+ Turned off xalan2.jar build. This removes DocBook XSL
+ Java extensions support for versions of Xalan prior to
+ Xalan 2.7. If you are currently using the extensions
+ with an earlier version of Xalan, you need to upgrade
+ to Xalan 2.7.
+
+ â— Mauritz Jeanson: xalan27/src/com/nwalsh/xalan/Verbatim.java; xalan27/src/
+ com/nwalsh/xalan/⋯
+
+ Added modifications so that the new callout.icon.size parameter is taken into account. This
+ parameter is used for FO output (where SVG now is the default graphics format for callouts).
+
+ â— Mauritz Jeanson: saxon65/src/com/nwalsh/saxon/FormatCallout.java; xalan27/
+ src/com/nwalsh/x⋯
+
+ Added code for generating id attributes on callouts in HTML and FO output.
+ These patches enable cross-references to callouts placed by area coordinates.
+ It works for graphic, unicode and text callouts.
+ Part of fix for bug #1675513 (xref to area broken).
+
+ â— Michael(tm) Smith: saxon65/src/com/nwalsh/saxon/Website.java; xalan27/src/
+ com/nwalsh/xalan⋯
+
+ Copied over Website XSL Java extensions.
+
+Release: 1.72.0
+
+This release includes important bug fixes and adds the following significant
+feature changes:
+
+Automatic sorting of glossary entries
+
+ The HTML and FO stylesheets now support automatic sorting of glossary
+ entries. To enable glossary sorting, set the value of the glossary.sort
+ parameter to 1 (by default, it’s value is 0). When you enable glossary
+ sorting, glossentry elements within a glossary, glossdiv, or glosslist are
+ sorted on the glossterm, using the current language setting. If you don’t
+ enable glossary sorting, then the order of glossentry elements is left “as
+ is†— that is, they are not sorted but are instead just displayed in
+ document order.
+
+WordML renamed to Roundtrip, OpenOffice support added
+
+ Stylesheets for “roundtrip†conversion between documents in OpenOffice
+ format (ODF) and DocBook XML have been added to the set of stylesheets that
+ formerly had the collective title WordML, and that set of stylesheets has
+ been renamed to Roundtrip to better reflect the actual scope and purpose of
+ its contents.
+
+ So the DocBook XSL Stylesheets now support roundtrip conversion (with
+ certain limitations) of WordML, OpenOffice, and Apple Pages documents to
+ and from DocBook XML.
+
+Including QandASet questions in TOCs
+
+ The HTML stylesheet now provides support for including QandASet questions
+ in the document TOC. To enable display of questions in the document TOC,
+ set the value of the qanda.in.toc to 1 (by default, it’s 0). When you
+ enable qanda.in.toc, then the generated table of contents for a document
+ will include qandaset titles, qandadiv titles, and question elements. The
+ default value of zero excludes them from the TOC.
+
+ Note
+
+ The qanda.in.toc parameter does not affect any tables of contents that may
+ be generated within a qandaset or qandadiv (only in the document TOC).
+
+Language identifier in man-page filenames and pathnames
+
+ Added new parameter man.output.lang.in.name.enabled, which controls whether
+ a language identifier is included in man-page filenames and pathnames. It
+ works like this:
+
+ If the value of man.output.lang.in.name.enabled is non-zero, man-page files
+ are output with a language identifier included in their filenames or
+ pathnames as follows:
+
+ â— if man.output.subdirs.enabled is non-zero, each file is output to,
+ e.g., a /$lang/man8/foo.8 pathname
+
+ â— if man.output.subdirs.enabled is zero, each file is output with a
+ foo.$lang.8 filename
+
+index.page.number.properties property set
+
+ For FO output, use the index.page.number.properties to control formatting
+ of page numbers in index output — to (for example) to display page numbers
+ in index output in a different color (to indicate that they are links).
+
+Crop marks in output from Antenna House XSL Formatter
+
+ Support has been added for generating crop marks in print/PDF output
+ generated using Antenna House XSL Formatter
+
+More string-substitution hooks in manpages output
+
+ The man.string.subst.map.local.pre and man.string.subst.map.local.post
+ parameters have been added to enable easier control over custom string
+ substitutions.
+
+Moved verbatim properties to attribute-set
+
+ The hardcoded properties used in verbatim elements (literallayout,
+ programlisting, screen) were moved to the verbatim.properties attribute-set
+ so they can be more easily customized.
+
+enhanced simple.xlink template
+
+ Now the simple.xlink template in inline.xsl works with cross reference
+ elements xref and link as well. Also, more elements call simple.xlink,
+ which enables DB5 xlink functionality.
+
+DocBook 5 compatibility
+
+ Stylesheets now consistently support DocBook 5 attributes (such as xml:id).
+ Also, DocBook 5 info elements are now checked along with other *info
+ elements, and the use of name() function was replaced by local-name() so it
+ also matches on DocBook 5 elements. These changes enable reusing the
+ stylesheets with DocBook 5 documents with minimal fixup.
+
+HTML class attributes now handled in class.attribute mode
+
+ The HTML class attributes were formerly hardcoded to the element name. Now
+ the class attribute is generated by applying templates in class.attribute
+ mode so class attribute names can be customized. The default is still the
+ element name.
+
+arabic-indic numbering enabled in autolabels
+
+ Numbering of chapter, sections, and pages can now use arabic-indic
+ numbering when number format is set to 'arabicindic' or to Ù¡.
+
+The following is a detailed list of changes (not including bug fixes) that have
+been made since the 1.71.1 release.
+
+Common
+
+The following changes have been made to the common code since the 1.71.1
+release.
+
+ ◠Add support for arabicindic numbering to autolabel.format template.
+
+ ◠Finish support for @xml:id everywhere @id is used.
+
+ ◠replace name() with local-name() in most cases.
+
+ ◠Add support for info.
+
+ ◠Add utility template tabstyle to return the tabstyle from
+ any table element.
+
+FO
+
+The following changes have been made to the fo code since the 1.71.1 release.
+
+ ◠Add support for sorting glossary entries
+
+ ◠Add table.row.properties template to customize table rows.
+
+ ◠Moved all properties to attribute-sets so can be customized more easily.
+
+ ◠Add index.page.number.properties attribute-set to format page numbers.
+
+ ◠xref now supports xlink:href, using simple.xlink template.
+
+ ◠Rewrote simple.xlink, and call it with all charseq templates.
+
+ ◠Add simple.xlink processing to term and member elements.
+
+ ◠Add support for crop marks in Antenna House.
+
+HTML
+
+The following changes have been made to the html code since the 1.71.1 release.
+
+ ◠Add support for sorting glossary entries
+
+ ◠Add support for qanda.in.toc to add qandaentry questions to document TOC.
+
+ ◠add simple.xlink support to variablelist term and simplelist member.
+
+ ◠*.propagates.style now handled in class.attribute mode.
+
+ ◠add class parameter to class.attribute mode to set default class.
+
+ ◠Convert all class attributes to use the class.attribute mode
+ so class names can be customized more easily.
+
+ ◠Add class.attribute mode to generate class attributes.
+
+ ◠Added simple.xlink to most remaining inlines.
+ Changed class attributes to applying class.attributes mode.
+
+ ◠Changed xref template to use simple.xlink tempalte.
+
+ ◠Improve generate.html.title to work with link targets too.
+
+ ◠Improved simple.xlink to support link and xref.
+
+ ◠Use new link.title.attribute now.
+
+ ◠Rewrote simple.xlink to handle linkend also.
+ Better computation of title attribute on link too.
+
+ ◠Handle Xalan quirk as special case.
+
+ ◠Add support for info.
+
+ ◠Fixed imagemaps so they work properly going from calspair coords
+ to HTML area coords.
+
+Manpages
+
+The following changes have been made to the manpages code since the 1.71.1
+release.
+
+ ◠Added doc for man.output.lang.in.name.enabled parameter. This
+ checkin completes support for writing file/pathnames for man-pages
+ with $lang include in the names. Closes #1585967. knightly
+ accolades to Daniel Leidert for providing the feature request.
+
+ ◠Added new param man.output.lang.in.name.enabled, which
+ controls whether $LANG value is included in manpages
+ filenames and pathnames. It works like this:
+
+ If the value of man.output.lang.in.name.enabled is non-zero,
+ man-page files are output with the $lang value included in
+ their filenames or pathnames as follows;
+
+ - if man.output.subdirs.enabled is non-zero, each file is
+   output to, e.g., a /$lang/man8/foo.8 pathname
+
+ - if man.output.subdirs.enabled is zero, each file is output
+   with a foo.$lang.8 filename
+
+ ◠Use "\e" instead of "\\" for backslash output, because the
+ groff docs say that's the correct thing to do; also because
+ testing (thanks, Paul Dubois) shows that "\\" doesn't always
+ work as expected; for example, "\\" within a table seems to
+ mess things up.
+
+ ◠Added the man.string.subst.map.local.pre and
+ man.string.subst.map.local.post parameters. Those parameters
+ enable local additions and changes to string-substitution mappings
+ without the need to change the value of man.string.subst.map
+ parameter (which is for standard system mappings). Closes
+ #1456738. Thanks to Sam Steingold for constructing a true
+ stylesheet torture test (the clisp docs) that exposed the need for
+ these params.
+
+ ◠Added the Markup element to the list of elements that get output
+ in bold. Thanks to Eric S. Raymond.
+
+ ◠Replaced all dots in roff requests with U+2302 ("house"
+ character), and added escaping in output for all instances of dot
+ that are not in roff requests. This fixes the problem case where a
+ string beginning with a dot (for example, the string ".bashrc")
+ might occur at the beginning of a line in output, in which case 
+ would mistakenly get interpreted as a roff request. Thanks to Eric
+ S. Raymond for pushing to fix this.
+
+ ◠Made change to ensure that list content nested in
+ itemizedlist and orderedlist instances is properly indented. This
+ is a switch from using .TP to format those lists to using .RS/.RE
+ to format them instead (because .TP does not allow nesting). Closes bug #
+ 1602616.
+ Thanks to Daniel Leidert.
+
+Params
+
+The following changes have been made to the params code since the 1.71.1
+release.
+
+ ◠Added doc for man.output.lang.in.name.enabled parameter. This
+ checkin completes support for writing file/pathnames for man-pages
+ with $lang include in the names. Closes #1585967. knightly
+ accolades to Daniel Leidert for providing the feature request.
+
+ ◠Added new param man.output.lang.in.name.enabled, which
+ controls whether $LANG value is included in manpages
+ filenames and pathnames. It works like this:
+
+ If the value of man.output.lang.in.name.enabled is non-zero,
+ man-page files are output with the $lang value included in
+ their filenames or pathnames as follows;
+
+ - if man.output.subdirs.enabled is non-zero, each file is
+   output to, e.g., a /$lang/man8/foo.8 pathname
+
+ - if man.output.subdirs.enabled is zero, each file is output
+   with a foo.$lang.8 filename
+
+ ◠Added the man.string.subst.map.local.pre and
+ man.string.subst.map.local.post parameters. Those parameters
+ enable local additions and changes to string-substitution mappings
+ without the need to change the value of man.string.subst.map
+ parameter (which is for standard system mappings). Closes
+ #1456738. Thanks to Sam Steingold for constructing a true
+ stylesheet torture test (the clisp docs) that exposed the need for
+ these params.
+
+ ◠Add index.page.number.properties by default.
+
+ ◠Added index.page.number.properties
+  to allow customizations of page numbers in indexes.
+
+ ◠Move show-destination="replace" property from template to attribute-set
+ so it can be customized.
+
+ ◠Add support for sorting glossary entries
+
+ ◠Add option to include qanda in tables of contents.
+
+ ◠Moved all properties to attribute-sets so can be customized more easily.
+
+Template
+
+The following changes have been made to the template code since the 1.71.1
+release.
+
+ ◠Added workaround for Xalan bug: use for-each and copy instead of copy-of (#
+ 1604770).
+
+Roundtrip
+
+The following changes have been made to the roundtrip code since the 1.71.1
+release.
+
+ ◠rename to roundtrip, add OpenOffice support
+
+Release: 1.71.1
+
+This is a minor update to the 1.71.0 release. Along with a number of bug fixes,
+it includes two feature changes:
+
+ â— Added support for profiling based on xml:lang and status attributes.
+
+ â— Added initial support in manpages output for footnote, annotation, and alt
+ instances. Basically, they all now get handled the same way ulink instances
+ are. They are treated as a class as "note sources": A numbered marker is
+ generated at the place in the main text flow where they occur, then their
+ contents are displayed in an endnotes section at the end of the man page.
+
+Common
+
+The following changes have been made to the common code since the 1.71.1
+release.
+
+ ◠For backward compatability autoidx-ng.xsl is invoking "kosek" indexing method again.
+
+ ◠Add support for Xalan generating a root xml:base like saxon.
+
+FO
+
+The following changes have been made to the fo code since the 1.71.1 release.
+
+ ◠For backward compatability autoidx-ng.xsl is invoking "kosek" indexing method again.
+
+ ◠Add support for Xalan to add root node xml:base for db5 docs.
+
+ ◠Added support for profiling based on xml:lang and status attributes.
+
+HTML
+
+The following changes have been made to the html code since the 1.71.1 release.
+
+ ◠For backward compatability autoidx-ng.xsl is invoking "kosek" indexing method again.
+
+ ◠Add support for Xalan to add root node xml:base for db5 docs.
+
+ ◠Added support for profiling based on xml:lang and status attributes.
+
+ ◠Made changes in namespace declarations to prevent xmllint's
+ canonicalizer from treating them as relative namespace URIs.
+
+   - Changed xmlns:k="java:com.isogen.saxoni18n.Saxoni18nService"
+     to xmlns:k="http://www.isogen.com/functions/
+ com.isogen.saxoni18n.Saxoni18nService";
+     Saxon accepts either form
+     (see http://www.saxonica.com/documentation/extensibility/
+ functions.html);
+     to Saxon, "the part of the URI before the final '/' is immaterial".
+
+   - Changed, e.g. xmlns:xverb="com.nwalsh.xalan.Verbatim" to
+     xmlns:xverb="xalan://com.nwalsh.xalan.Verbatim"; Xalan accepts
+     either form
+     (see http://xml.apache.org/xalan-j/extensions.html#
+ java-namespace-declare);
+     just as Saxon does, it will "simply use the string to the
+     right of the rightmost forward slash as the Java class name".
+
+   - Changed xmlns:xalanredirect="org.apache.xalan.xslt.extensions.Redirect"
+     to xmlns:redirect="http://xml.apache.org/xalan/redirect", and
+     adjusted associated code to make the current Xalan redirect spec.
+     (see http://xml.apache.org/xalan-j/apidocs/org/apache/xalan/lib/
+ Redirect.html)
+
+ ◠Added the html.append and chunk.append parameters. By default, the
+ value of both is empty; but the internal DocBook XSL stylesheets
+ build sets their value to "<xsl:text>&#x0a;</xsl:text>", in order
+ to ensure that all files in the docbook-xsl-doc package end in a
+ newline character. (Because diff and some other tools may emit
+ error messages and/or not behave as expected when processing
+ files that are not newline-terminated.)
+
+Highlighting
+
+The following changes have been made to the highlighting code since the 1.71.1
+release.
+
+ ◠Added license information
+
+Manpages
+
+The following changes have been made to the manpages code since the 1.71.1
+release.
+
+ ◠Added initial support in manpages output for footnote, annotation,
+ and alt instances. Basically, they all now get handled the same
+ way ulink instances are. They are treated as a class as "note
+ sources": A numbered marker is generated at the place in the main
+ text flow where they occur, then their contents are displayed in
+ an endnotes section at the end of the man page (currently titled
+ REFERENCES, for English output, but will be changed to NOTES).
+
+ This support is not yet complete. It works for most "normal"
+ cases, but probably mishandles a good number of cases. More
+ testing will be needed to expose the problems. It may well also
+ introduce some bugs and regressions in other areas, including
+ basic paragraph handling, handling of "mixed block" content,
+ handling of other indented content, and handling of authorblurb
+ and personblurb in the AUTHORS section.
+
+Params
+
+The following changes have been made to the params code since the 1.71.1
+release.
+
+ ◠Added support for profiling based on xml:lang and status attributes.
+
+ ◠Added the html.append and chunk.append parameters. By default, the
+ value of both is empty; but the internal DocBook XSL stylesheets
+ build sets their value to "<xsl:text>&#x0a;</xsl:text>", in order
+ to ensure that all files in the docbook-xsl-doc package end in a
+ newline character. (Because diff and some other tools may emit
+ error messages and/or not behave as expected when processing
+ files that are not newline-terminated.)
+
+Profiling
+
+The following changes have been made to the profiling code since the 1.71.1
+release.
+
+ ◠Added support for profiling based on xml:lang and status attributes.
+
+Release: 1.71.0
+
+This is mainly a bug fix release, but it also includes two significant feature
+changes:
+
+Highlighting support added
+
+ The stylesheets now include support for source-code highlighting in output
+ of programlisting instances (controlled through the highlight.source
+ parameter). The Java-based implementation requires Saxon and makes use of
+ Michal Molhanec’s XSLTHL. More details are available at Jirka Kosek’s
+ website:
+
+ http://xmlguru.cz/2006/07/docbook-syntax-highlighting
+
+ The support is currently limited to highlighting of XML, Java, PHP, Delphi,
+ Modula-2 sources, and INI files.
+
+Changes to autoindexing
+
+ The templates that handle alternative indexing methods were reworked to
+ avoid errors produced by certain processors not being able to tolerate the
+ presence of unused functions. With this release, none of the code for the
+ 'kimber' or 'kosek' methods is included in the default stylesheets. In
+ order to use one of those methods, your customization layer must import one
+ of the optional stylesheet modules:
+
+ â— html/autoidx-kosek.xsl
+ â— html/autoidx-kimber.xsl
+ â— fo/autoidx-kosek.xsl
+ â— fo/autoidx-kimber.xsl
+
+ See the index.method parameter reference page for more information.
+
+ Two other changes to note:
+
+ â— The default indexing method now can handle accented characters in
+ latin-based alphabets, not just English. This means accented latin
+ letters will group and sort with their unaccented counterpart.
+ â— The default value for the index.method parameter was changed from
+ 'english' to 'basic' because now the default method can handle
+ latin-based alphabets, not just English.
+
+The following is a list of changes that have been made since the 1.70.1
+release.
+
+Common
+
+The following changes have been made to the common code since the 1.70.1
+release.
+
+ ◠Added reference.autolabel parameter for controlling labels on
+ reference output.
+
+ ◠Support rows that are *completely* overlapped by the preceding row
+
+ ◠New modules for supporting indexing extensions.
+
+ ◠Support startinglinenumber on orderedlist
+
+Extensions
+
+The following changes have been made to the extensions code since the 1.70.1
+release.
+
+ ◠Completely reworked extensions build system; now uses NetBeans and ant
+
+FO
+
+The following changes have been made to the fo code since the 1.70.1 release.
+
+ ◠xsl:sort lang attribute now uses two-char substring of lang attribute.
+
+ ◠Support titlecase "Java", "Perl", and "IDL" as values for the
+ language attribute on classsynopsis, etc. (instead of just
+ lowercase "java", "perl", and "idl"). Also support "c++" and "C++"
+ (instead of just "cpp").
+
+ Affects HTML, FO, and manpages output. Closes bug 1552332. Thanks
+ to "Brian A. Vanderburg II".
+
+ ◠Added support for the reference.autolabel param in (X)HTML and FO
+ output.
+
+ ◠Support rows that are *completely* overlapped by the preceding row
+
+ ◠Rearranged templates for the 3 indexing methods
+ and changed method named 'english' to 'basic'.
+
+ ◠New modules for supporting indexing extensions.
+
+ ◠Turn off blank-body for fop1.extensions too since fop 0.92
+ does not support it either.
+
+ ◠Add Xalan variant to test for exslt:node-set function.
+ Xalan can use function named node-set(), but doesn't
+ recognize it using function-available().
+
+ ◠Added support to FO stylesheets for handling instances of Org
+ where it occurs outside of *info content. In HTML stylesheets,
+ moved handling of Org out of info.xsl and into inline.xsl. In both
+ FO and HTML stylesheets, added support for correctly processing
+ Affiliation and Jobtitle.
+
+ ◠Don't output punctuation between Refname and Refpurpose if
+ Refpurpose is empty. Also corrected handling of Refsect2/title
+ instances, and removed some debugging stuff that was generated in
+ manpages output to mark the ends of sections.
+
+ ◠Added new email.delimiters.enabled param. If non-zero (the
+ default), delimiters are generated around e-mail addresses (output
+ of the email element). If zero, the delimiters are suppressed.
+
+ ◠Initial support of syntax highlighting of programlistings.
+
+ ◠Chapter after preface should restart numbering of pages.
+
+HTML
+
+The following changes have been made to the html code since the 1.70.1 release.
+
+ ◠xsl:sort lang attribute now uses two-char substring of lang attribute.
+
+ ◠Support titlecase "Java", "Perl", and "IDL" as values for the
+ language attribute on classsynopsis, etc. (instead of just
+ lowercase "java", "perl", and "idl"). Also support "c++" and "C++"
+ (instead of just "cpp").
+
+ Affects HTML, FO, and manpages output. Closes bug 1552332. Thanks
+ to "Brian A. Vanderburg II".
+
+ ◠Added support for the reference.autolabel param in (X)HTML and FO
+ output.
+
+ ◠Support rows that are *completely* overlapped by the preceding row
+
+ ◠Rearranged templates for the 3 indexing methods
+ and changed method named 'english' to 'basic'.
+
+ ◠New modules for supporting indexing extensions.
+
+ ◠Added several new HTML parameters for controlling appearance of
+ content on HTML title pages:
+
+ contrib.inline.enabled:
+   If non-zero (the default), output of the contrib element is
+   displayed as inline content rather than as block content.
+
+ othercredit.like.author.enabled:
+   If non-zero, output of the othercredit element on titlepages is
+   displayed in the same style as author and editor output. If zero
+   (the default), othercredit output is displayed using a style
+   different than that of author and editor.
+
+ blurb.on.titlepage.enabled:
+   If non-zero, output from authorblurb and personblurb elements is
+   displayed on title pages. If zero (the default), output from
+   those elements is suppressed on title pages (unless you are
+   using a titlepage customization that causes them to be included).
+
+ editedby.enabled
+   If non-zero (the default), a localized Edited by heading is
+   displayed above editor names in output of the editor element.
+
+ ◠Add Xalan variant to test for exslt:node-set function.
+ Xalan can use function named node-set(), but doesn't
+ recognize it using function-available().
+
+ ◠Added support to FO stylesheets for handling instances of Org
+ where it occurs outside of *info content. In HTML stylesheets,
+ moved handling of Org out of info.xsl and into inline.xsl. In both
+ FO and HTML stylesheets, added support for correctly processing
+ Affiliation and Jobtitle.
+
+ ◠Don't output punctuation between Refname and Refpurpose if
+ Refpurpose is empty. Also corrected handling of Refsect2/title
+ instances, and removed some debugging stuff that was generated in
+ manpages output to mark the ends of sections.
+
+ ◠Added new email.delimiters.enabled param. If non-zero (the
+ default), delimiters are generated around e-mail addresses (output
+ of the email element). If zero, the delimiters are suppressed.
+
+ ◠Added qanda.nested.in.toc param. Default value is zero. If
+ non-zero, instances of "nested" Qandaentry (ones that are children
+ of Answer elements) are displayed in the TOC. Closes patch 1509018
+ (from Daniel Leidert). Currently on affects HTML output (no patch
+ for FO output provided).
+
+ ◠Improved handling of relative locations generated files
+
+ ◠Initial support of syntax highlighting of programlistings.
+
+ ◠Support org
+
+ ◠Support person
+
+ ◠Support $keep.relative.image.uris also when chunking
+
+Highlighting
+
+The following changes have been made to the highlighting code since the 1.70.1
+release.
+
+ ◠Initial support of syntax highlighting of programlistings.
+
+Manpages
+
+The following changes have been made to the manpages code since the 1.70.1
+release.
+
+ ◠Suppress footnote markers and output warning that footnotes are
+ not yet supported.
+
+ ◠Handle instances of address/otheraddr/ulink in author et al in the
+ same way as email instances; that is, display them on the same
+ linke as the author, editor, etc., name.
+
+ ◠Don't number or link-list any Ulink instance whose string value is
+ identical to the value of its url attribute. Just display it inline.
+
+ ◠Don't output punctuation between Refname and Refpurpose if
+ Refpurpose is empty. Also corrected handling of Refsect2/title
+ instances, and removed some debugging stuff that was generated in
+ manpages output to mark the ends of sections.
+
+ ◠Added new email.delimiters.enabled param. If non-zero (the
+ default), delimiters are generated around e-mail addresses (output
+ of the email element). If zero, the delimiters are suppressed.
+
+ ◠In manpages output, if the last/nearest *info element for
+ particular Refentry has multiple Copyright and/or Legalnotice
+ children, process them all (not just the first ones). Closes bug
+ 1524576. Thanks to Sam Steingold for the report and to Daniel
+ Leidert for providing a patch.
+
+Params
+
+The following changes have been made to the params code since the 1.70.1
+release.
+
+ ◠Added reference.autolabel parameter for controlling labels on
+ reference output.
+
+ ◠Added namespace declarations to document elements for all param files.
+
+ ◠Updated index.method doc to describe revised setup for importing index
+  extensions.
+
+ ◠Added several new HTML parameters for controlling appearance of
+ content on HTML title pages:
+
+ contrib.inline.enabled:
+   If non-zero (the default), output of the contrib element is
+   displayed as inline content rather than as block content.
+
+ othercredit.like.author.enabled:
+   If non-zero, output of the othercredit element on titlepages is
+   displayed in the same style as author and editor output. If zero
+   (the default), othercredit output is displayed using a style
+   different than that of author and editor.
+
+ blurb.on.titlepage.enabled:
+   If non-zero, output from authorblurb and personblurb elements is
+   displayed on title pages. If zero (the default), output from
+   those elements is suppressed on title pages (unless you are
+   using a titlepage customization that causes them to be included).
+
+ editedby.enabled
+   If non-zero (the default), a localized Edited by heading is
+   displayed above editor names in output of the editor element.
+
+ ◠Added new email.delimiters.enabled param. If non-zero (the
+ default), delimiters are generated around e-mail addresses (output
+ of the email element). If zero, the delimiters are suppressed.
+
+ ◠Added qanda.nested.in.toc param. Default value is zero. If
+ non-zero, instances of "nested" Qandaentry (ones that are children
+ of Answer elements) are displayed in the TOC. Closes patch 1509018
+ (from Daniel Leidert). Currently on affects HTML output (no patch
+ for FO output provided).
+
+ ◠Initial support of syntax highlighting of programlistings.
+
+Tools
+
+The following changes have been made to the tools code since the 1.70.1
+release.
+
+ ◠Racheted down font sizes of headings in example makefile FO output.
+
+ ◠Added param and attribute set to example makefile, for getting
+ wrapping in verbatims in FO output.
+
+ ◠Renamed Makefile.paramDoc to Makefile.docParam.
+
+ ◠Added Makefile.paramDoc file, for creating versions of param.xsl
+ files with doc embedded.
+
+ ◠Added variable to example makefile for controlling whether HTML or
+ XHTML is generated.
+
+Release: 1.70.1
+
+This is a stable release of the 1.70 stylesheets. It includes only a few small
+changes from 1.70.0.
+
+The following is a list of changes that have been made since the 1.70.0
+release.
+
+FO
+
+The following changes have been made to the fo code since the 1.70.0 release.
+
+ â— Added three new attribute sets (revhistory.title.properties,
+ revhistory.table.properties and revhistory.table.cell.properties) for
+ controlling appearance of revhistory in FO output.
+
+ Modified: fo/block.xsl,1.34; fo/param.ent,1.101; fo/param.xweb,1.114; fo/
+ titlepage.xsl,1.41; params/revhistory.table.cell.properties.xml,1.1; params
+ /revhistory.table.properties.xml,1.1; params/
+ revhistory.title.properties.xml,1.1 - Jirka Kosek
+
+ â— Support DBv5 revisions with full author name (not only authorinitials)
+
+ Modified: fo/block.xsl,1.33; fo/titlepage.xsl,1.40 - Jirka Kosek
+
+HTML
+
+The following changes have been made to the html code since the 1.70.0 release.
+
+ â— Support DBv5 revisions with full author name (not only authorinitials)
+
+ Modified: html/block.xsl,1.23; html/titlepage.xsl,1.34 - Jirka Kosek
+
+HTMLHelp
+
+The following changes have been made to the htmlhelp code since the 1.70.0
+release.
+
+ â— htmlhelp.generate.index is now param, not variable. This means that you can
+ override its setting from outside. This is useful when you generate
+ indexterms on the fly (see http://www.xml.com/pub/a/2004/07/14/dbndx.html?
+ page=3).
+
+ Modified: htmlhelp/htmlhelp-common.xsl,1.38 - Jirka Kosek
+
+ â— Support chunk.tocs.and.lots in HTML Help
+
+ Modified: htmlhelp/htmlhelp-common.xsl,1.37 - Jirka Kosek
+
+Params
+
+The following changes have been made to the params code since the 1.70.0
+release.
+
+ â— Added three new attribute sets (revhistory.title.properties,
+ revhistory.table.properties and revhistory.table.cell.properties) for
+ controlling appearance of revhistory in FO output.
+
+ Modified: fo/block.xsl,1.34; fo/param.ent,1.101; fo/param.xweb,1.114; fo/
+ titlepage.xsl,1.41; params/revhistory.table.cell.properties.xml,1.1; params
+ /revhistory.table.properties.xml,1.1; params/
+ revhistory.title.properties.xml,1.1 - Jirka Kosek
+
+Release: 1.70.0
+
+As with all DocBook Project dot-zero releases, this is an experimental release.
+It will be followed shortly by a stable release.
+
+This release adds a number of new features, including:
+
+ â— support for selecting alternative index-collation methods (in particular,
+ support for using a collation library developed by Eliot Kimber)
+
+ â— improved handling of DocBook 5 document instances (through a
+ namespace-stripping mechanism)
+
+ â— full support for CALS and HTML tables in manpages output
+
+ â— a mechanism for preserving relative URIs in documents that make use of
+ XInclude
+
+ â— support for the "new" .90 version of FOP
+
+ â— enhanced capabilities for controlling formatting of lists in HTML and FO
+ output
+
+ â— autogeneration of AUTHOR and COPYRIGHT sections in manpages output
+
+ â— support for generating crop marks in FO/PDF output
+
+ â— support for qandaset as a root element in FO output
+
+ â— support for floatstyle and orient on all table types
+
+ â— support for floatstyle in figure, and example
+
+ â— pgwide.properties attribute-set supports extending figure, example and
+ table into the left indent area instead of spanning multiple columns.
+
+The following is a detailed list of enhancements and API changes that have been
+made since the 1.69.1 release.
+
+Common
+
+The following changes have been made to the common code since the 1.69.1
+release.
+
+ â— Add the xsl:key for the kimber indexing method.
+
+ Modified: common/autoidx-ng.xsl,1.2 - Robert Stayton
+
+ â— Add support for qandaset.
+
+ Modified: common/labels.xsl,1.37; common/subtitles.xsl,1.7; common/
+ titles.xsl,1.35 - Robert Stayton
+
+ â— Support dbhtml/dbfo start PI for orderedlist numbering in both HTML and FO
+
+ Modified: common/common.xsl,1.61; html/lists.xsl,1.50 - Norman Walsh
+
+ â— Added CVS header.
+
+ Modified: common/stripns.xsl,1.12 - Robert Stayton
+
+ â— Changed content model of text element to ANY rather than #PCDATA because
+ they could contain markup.
+
+ Modified: common/targetdatabase.dtd,1.7 - Robert Stayton
+
+ â— Added refentry.meta.get.quietly param.
+
+ If zero (the default), notes and warnings about "missing" markup are
+ generated during gathering of refentry metadata. If non-zero, the metadata
+ is gathered "quietly" -- that is, the notes and warnings are suppressed.
+
+ NOTE: If you are processing a large amount of refentry content, you may be
+ able to speed up processing significantly by setting a non-zero value for
+ refentry.meta.get.quietly.
+
+ Modified: common/refentry.xsl,1.17; manpages/param.ent,1.15; manpages/
+ param.xweb,1.17; params/refentry.meta.get.quietly.xml,1.1 - Michael(tm)
+ Smith
+
+ â— After namespace stripping, the source document is the temporary tree
+ created by the stripping process and it has the wrong base URI for relative
+ references. Earlier versions of this code used to try to fix that by
+ patching the elements with relative @fileref attributes. That was
+ inadequate because it calculated an absolute base URI without considering
+ that there might be xml:base attributes already in effect. It seems obvious
+ now that the right thing to do is simply to put the xml:base on the root of
+ the document. And that seems to work.
+
+ Modified: common/stripns.xsl,1.7 - Norman Walsh
+
+ â— Added support for "software" and "sectdesc" class values on refmiscinfo;
+ "software" is treated identically to "source", and "setdesc" is treated
+ identically to "manual".
+
+ Modified: common/refentry.xsl,1.10; params/
+ man.th.extra2.max.length.xml,1.3; params/
+ refentry.source.name.profile.xml,1.4 - Michael(tm) Smith
+
+ â— Added support for DocBook 5 namespace-stripping in manpages stylesheet.
+ Closes request #1210692.
+
+ Modified: common/common.xsl,1.56; manpages/docbook.xsl,1.57 - Michael(tm)
+ Smith
+
+ â— Added <xsl:template match="/"> to make stripns.xsl usable as a standalone
+ stylesheet for stripping out DocBook 5/NG to DocBook 4. Note that DocBook
+ XSLT drivers that include this stylesheet all override the match="/"
+ template.
+
+ Modified: common/stripns.xsl,1.4 - Michael(tm) Smith
+
+ â— Number figures, examples, and tables from book if there is no prefix (i.e.
+ if chapter.autolabel is set to 0). This avoids having the list of figures
+ where the figures mysteriously restart their numeration periodically when
+ chapter.autolabel is set to 0.
+
+ Modified: common/labels.xsl,1.36 - David Cramer
+
+ â— Add task template in title.markup mode.
+
+ Modified: common/titles.xsl,1.34 - Robert Stayton
+
+ â— Add children (with ids) of formal objects to target data.
+
+ Modified: common/targets.xsl,1.10 - Robert Stayton
+
+ â— Added support for case when personname doesn't contain specific name markup
+ (as allowed in DocBook 5.0)
+
+ Modified: common/common.xsl,1.54 - Jirka Kosek
+
+Extensions
+
+The following changes have been made to the extensions code since the 1.69.1
+release.
+
+ â— Support Xalan 2.7
+
+ Modified: extensions/xalan27/.cvsignore,1.1; extensions/xalan27/
+ build.xml,1.1; extensions/xalan27/nbproject/.cvsignore,1.1; extensions/
+ xalan27/nbproject/build-impl.xml,1.1; extensions/xalan27/nbproject/
+ genfiles.properties,1.1; extensions/xalan27/nbproject/
+ project.properties,1.1; extensions/xalan27/nbproject/project.xml,1.1;
+ extensions/xalan27/src/com/nwalsh/xalan/CVS.java,1.1; extensions/xalan27/
+ src/com/nwalsh/xalan/Callout.java,1.1; extensions/xalan27/src/com/nwalsh/
+ xalan/FormatCallout.java,1.1; extensions/xalan27/src/com/nwalsh/xalan/
+ FormatDingbatCallout.java,1.1; extensions/xalan27/src/com/nwalsh/xalan/
+ FormatGraphicCallout.java,1.1; extensions/xalan27/src/com/nwalsh/xalan/
+ FormatTextCallout.java,1.1; extensions/xalan27/src/com/nwalsh/xalan/
+ FormatUnicodeCallout.java,1.1; extensions/xalan27/src/com/nwalsh/xalan/
+ Func.java,1.1; extensions/xalan27/src/com/nwalsh/xalan/
+ ImageIntrinsics.java,1.1; extensions/xalan27/src/com/nwalsh/xalan/
+ Params.java,1.1; extensions/xalan27/src/com/nwalsh/xalan/Table.java,1.1;
+ extensions/xalan27/src/com/nwalsh/xalan/Text.java,1.1; extensions/xalan27/
+ src/com/nwalsh/xalan/Verbatim.java,1.1 - Norman Walsh
+
+ â— Handle the case where the imageFn is actually a URI. This still needs work.
+
+ Modified: extensions/saxon643/com/nwalsh/saxon/ImageIntrinsics.java,1.4 -
+ Norman Walsh
+
+FO
+
+The following changes have been made to the fo code since the 1.69.1 release.
+
+ â— Adapted to the new indexing code. Now works just like a wrapper that calls
+ kosek indexing method, originally implemented here.
+
+ Modified: fo/autoidx-ng.xsl,1.5 - Jirka Kosek
+
+ â— Added parameters for header/footer table minimum height.
+
+ Modified: fo/pagesetup.xsl,1.60; fo/param.ent,1.100; fo/param.xweb,1.113 -
+ Robert Stayton
+
+ â— Add the index.method parameter.
+
+ Modified: fo/param.ent,1.99; fo/param.xweb,1.112 - Robert Stayton
+
+ â— Integrate support for three indexing methods: - the original English-only
+ method. - Jirka Kosek's method using EXSLT extensions. - Eliot Kimber's
+ method using Saxon extensions. Use the 'index.method' parameter to select.
+
+ Modified: fo/autoidx.xsl,1.38 - Robert Stayton
+
+ â— Add support for TOC for qandaset in fo output.
+
+ Modified: fo/autotoc.xsl,1.30; fo/qandaset.xsl,1.20 - Robert Stayton
+
+ â— Added parameter ulink.hyphenate.chars. Added parameter insert.link
+ .page.number.
+
+ Modified: fo/param.ent,1.98; fo/param.xweb,1.111 - Robert Stayton
+
+ â— Implemented feature request #942524 to add insert.link.page.number to allow
+ link element cross references to have a page number.
+
+ Modified: fo/xref.xsl,1.67 - Robert Stayton
+
+ â— Add support for ulink.hyphenate.chars so more characters can be break
+ points in urls.
+
+ Modified: fo/xref.xsl,1.66 - Robert Stayton
+
+ â— Implemented patch #1075144 to make the url text in a ulink in FO output an
+ active link as well.
+
+ Modified: fo/xref.xsl,1.65 - Robert Stayton
+
+ â— table footnotes now have their own table.footnote.properties attribute set.
+
+ Modified: fo/footnote.xsl,1.23 - Robert Stayton
+
+ â— Add qandaset to root.elements.
+
+ Modified: fo/docbook.xsl,1.41 - Robert Stayton
+
+ â— Added mode="page.sequence" to make it easier to put content into a page
+ sequence. First used for qandaset.
+
+ Modified: fo/component.xsl,1.37 - Robert Stayton
+
+ â— Implemented feature request #1434408 to support formatting of biblioentry.
+
+ Modified: fo/biblio.xsl,1.35 - Robert Stayton
+
+ â— Added biblioentry.properties.
+
+ Modified: fo/param.ent,1.97; fo/param.xweb,1.110 - Robert Stayton
+
+ â— Support PTC/Arbortext bookmarks
+
+ Modified: fo/docbook.xsl,1.40; fo/ptc.xsl,1.1 - Norman Walsh
+
+ â— Added table.footnote.properties to permit table footnotes to format
+ differently from regular footnotes.
+
+ Modified: fo/param.ent,1.96; fo/param.xweb,1.109 - Robert Stayton
+
+ â— Refactored table templates to unify their processing and support all
+ options in all types. Now table and informaltable, in both Cals and Html
+ markup, use the same templates where possible, and all support pgwide,
+ rotation, and floats. There is also a placeholder table.container template
+ to support wrapping a table in a layout table, so the XEP table title
+ "continued" extension can be more easily implemented.
+
+ Modified: fo/formal.xsl,1.52; fo/htmltbl.xsl,1.9; fo/table.xsl,1.48 -
+ Robert Stayton
+
+ â— Added new attribute set toc.line.properties for controlling appearance of
+ lines in ToC/LoT
+
+ Modified: fo/autotoc.xsl,1.29; fo/param.ent,1.95; fo/param.xweb,1.108 -
+ Jirka Kosek
+
+ â— Added support for float to example and equation. Added support for pgwide
+ to figure, example, and equation (the latter two via a dbfo pgwide="1"
+ processing instruction).
+
+ Modified: fo/formal.xsl,1.51 - Robert Stayton
+
+ â— Add pgwide.properties attribute-set.
+
+ Modified: fo/param.ent,1.94; fo/param.xweb,1.107 - Robert Stayton
+
+ â— Added refclass.suppress param.
+
+ If the value of refclass.suppress is non-zero, then display refclass
+ contents is suppressed in output. Affects HTML and FO output only.
+
+ Modified: fo/param.ent,1.93; fo/param.xweb,1.106; html/param.ent,1.90; html
+ /param.xweb,1.99; params/refclass.suppress.xml,1.1 - Michael(tm) Smith
+
+ â— Improved support for task subelements
+
+ Modified: fo/task.xsl,1.3; html/task.xsl,1.3 - Jirka Kosek
+
+ â— Adjusted spacing around K&R-formatted Funcdef and Paramdef output such that
+ it can more easily be discerned where one ends and the other begins. Closes
+ #1213264.
+
+ Modified: fo/synop.xsl,1.18 - Michael(tm) Smith
+
+ â— Made handling of paramdef/parameter in FO output consistent with that in
+ HTML and manpages output. Closes #1213259.
+
+ Modified: fo/synop.xsl,1.17 - Michael(tm) Smith
+
+ â— Made handling of Refnamediv consistent with formatting in HTML and manpages
+ output; specifically, changed so that Refname (comma-separated list of
+ multiple instances found) is used (instead of Refentrytitle as previously),
+ then em-dash, then the Refpurpose. Closes #1212562.
+
+ Modified: fo/refentry.xsl,1.30 - Michael(tm) Smith
+
+ â— Added output of Releaseinfo to recto titlepage ("copyright" page) for Book
+ in FO output. This makes it consistent with HTML output. Closes #1327034.
+ Thanks to Paul DuBois for reporting.
+
+ Modified: fo/titlepage.templates.xml,1.28 - Michael(tm) Smith
+
+ â— Added condition for setting block-progression-dimension.minimum on
+ table-row, instead of height, when fop1.extensions is non-zero. For an
+ explanation of the reason for the change, see: http://wiki.apache.org/
+ xmlgraphics-fop/Troubleshooting/CommonLogMessages
+
+ Modified: fo/pagesetup.xsl,1.59 - Michael(tm) Smith
+
+ â— Added new refclass.suppress param for suppressing display of Refclass in
+ HTML and FO output. Did not add it to manpages because manpages stylesheet
+ is currently just silently ignoring Refclass anyway. Closes request #
+ 1461065. Thanks to Davor Ocelic (docelic) for reporting.
+
+ Modified: fo/refentry.xsl,1.29; html/refentry.xsl,1.23 - Michael(tm) Smith
+
+ â— Add support for keep-together PI to informal objects.
+
+ Modified: fo/formal.xsl,1.50 - Robert Stayton
+
+ â— Add support for fop1.extensions.
+
+ Modified: fo/formal.xsl,1.49; fo/graphics.xsl,1.44; fo/table.xsl,1.47 -
+ Robert Stayton
+
+ â— Add support for fop1 bookmarks.
+
+ Modified: fo/docbook.xsl,1.39 - Robert Stayton
+
+ â— Add fop1.extentions parameter to add support for fop development version.
+
+ Modified: fo/param.ent,1.92; fo/param.xweb,1.105 - Robert Stayton
+
+ â— Start supporting fop development version, which will become fop version 1.
+
+ Modified: fo/fop1.xsl,1.1 - Robert Stayton
+
+ â— Add template for task in mode="xref-to".
+
+ Modified: fo/xref.xsl,1.63; html/xref.xsl,1.57 - Robert Stayton
+
+ â— table footnotes now also get footnote.properties attribute-set.
+
+ Modified: fo/footnote.xsl,1.22 - Robert Stayton
+
+ â— Added index.separator named template to compute the separator punctuation
+ based on locale.
+
+ Modified: fo/autoidx.xsl,1.36 - Robert Stayton
+
+ â— Added support for link, olink, and xref within OO Classsynopsis and
+ children. (Because DocBook NG/5 allows it).
+
+ Modified: fo/synop.xsl,1.15; html/synop.xsl,1.19 - Michael(tm) Smith
+
+ â— Support date as an inline
+
+ Modified: fo/inline.xsl,1.43; html/inline.xsl,1.46 - Norman Walsh
+
+ â— Added new parameter keep.relative.image.uris
+
+ Modified: fo/param.ent,1.91; fo/param.xweb,1.104; html/param.ent,1.87; html
+ /param.xweb,1.96; params/keep.relative.image.uris.xml,1.1 - Norman Walsh
+
+ â— Map Unicode space characters U+2000-U+200A to fo:leaders.
+
+ Modified: fo/docbook.xsl,1.38; fo/passivetex.xsl,1.4; fo/spaces.xsl,1.1 -
+ Jirka Kosek
+
+ â— Output a real em dash for em-dash dingbat (instead of two hypens).
+
+ Modified: fo/fo.xsl,1.7 - Michael(tm) Smith
+
+ â— Support default label width parameters for itemized and ordered lists
+
+ Modified: fo/lists.xsl,1.64; fo/param.ent,1.90; fo/param.xweb,1.103; params
+ /itemizedlist.label.width.xml,1.1; params/orderedlist.label.width.xml,1.1 -
+ Norman Walsh
+
+ â— Generate localized title for Refsynopsisdiv if no appropriate Title
+ descendant found in source. Closes #1212398. This change makes behavior for
+ the Synopsis title consistent with the behavior of HTML and manpages
+ output.
+
+ Also, added xsl:use-attribute-sets="normal.para.spacing" to block generated
+ for Cmdsynopsis output. Previously, that block had no spacing at all
+ specified, which resulted it being crammed up to closely to the Synopsis
+ head.
+
+ Modified: fo/refentry.xsl,1.28; fo/synop.xsl,1.13 - Michael(tm) Smith
+
+ â— Added parameters to support localization of index item punctuation.
+
+ Modified: fo/autoidx.xsl,1.35 - Robert Stayton
+
+ â— Added index.number.separator, index.range.separator, and
+ index.term.separator parameters to support localization of punctuation in
+ index entries.
+
+ Modified: fo/param.ent,1.89; fo/param.xweb,1.102 - Robert Stayton
+
+ â— Added "Cross References" section in HTML doc (for consistency with the FO
+ doc). Also, moved the existing FO "Cross References" section to follow the
+ "Linking" section.
+
+ Modified: fo/param.xweb,1.101; html/param.xweb,1.95 - Michael(tm) Smith
+
+ â— Added ID attribues to all Reference elements (e.g., id="tables" for the doc
+ for section on Table params). So pages for all subsections of ref docs now
+ have stable filenames instead of arbitrary generated filenames.
+
+ Modified: fo/param.xweb,1.100; html/param.xweb,1.94 - Michael(tm) Smith
+
+ â— Added two new parameters for handling of multi-term varlistentry elements:
+
+ variablelist.term.break.after: When the variablelist.term.break.after is
+ non-zero, it will generate a line break after each term multi-term
+ varlistentry.
+
+ variablelist.term.separator: When a varlistentry contains multiple term
+ elements, the string specified in the value of the
+ variablelist.term.separator parameter is placed after each term except the
+ last. The default is ", " (a comma followed by a space). To suppress
+ rendering of the separator, set the value of variablelist.term.separator to
+ the empty string ("").
+
+ These parameters are primarily intended to be useful if you have multi-term
+ varlistentries that have long terms.
+
+ Closes #1306676. Thanks to Sam Steingold for providing an example "lots of
+ long terms" doc that demonstrated the value of having these options.
+
+ Also, added normalize-space() call to processing of each term.
+
+ This change affects all output formats (HTML, PDF, manpages). The default
+ behavior should pretty much remain the same as before, but it is possible
+ (as always) that the change may introduce some new bugginess.
+
+ Modified: fo/lists.xsl,1.62; fo/param.ent,1.88; fo/param.xweb,1.99; html/
+ lists.xsl,1.48; html/param.ent,1.86; html/param.xweb,1.93; manpages/
+ lists.xsl,1.22; manpages/param.ent,1.14; manpages/param.xweb,1.16; params/
+ variablelist.term.break.after.xml,1.1; params/
+ variablelist.term.separator.xml,1.1 - Michael(tm) Smith
+
+ â— Add sidebar titlepage placeholder attset for styles.
+
+ Modified: fo/titlepage.xsl,1.37 - Robert Stayton
+
+ â— Add titlepage for sidebar.
+
+ Modified: fo/titlepage.templates.xml,1.27 - Robert Stayton
+
+ â— Implemented RFE #1292615.
+
+ Added bunch of new parameters (attribute sets) that affect list
+ presentation: list.block.properties, itemizedlist.properties, orderedlist
+ .properties, itemizedlist.label.properties and orderedlist.label
+ .properties. Default behaviour of stylesheets has not been changed but
+ further customizations will be much more easier.
+
+ Modified: fo/lists.xsl,1.61; fo/param.ent,1.87; fo/param.xweb,1.98; params/
+ itemizedlist.label.properties.xml,1.1; params/
+ itemizedlist.properties.xml,1.1; params/list.block.properties.xml,1.1;
+ params/orderedlist.label.properties.xml,1.1; params/
+ orderedlist.properties.xml,1.1 - Jirka Kosek
+
+ â— Implemented RFE #1242092.
+
+ You can enable crop marks in your document by setting crop.marks=1 and
+ xep.extensions=1. Appearance of crop marks can be controlled by parameters
+ crop.mark.bleed (6pt), crop.mark.offset (24pt) and crop.mark.width (0.5pt).
+
+ Also there is new named template called user-xep-pis. You can overwrite it
+ in order to produce some PIs that can control XEP as described in http://
+ www.renderx.com/reference.html#Output_Formats
+
+ Modified: fo/docbook.xsl,1.36; fo/param.ent,1.86; fo/param.xweb,1.97; fo/
+ xep.xsl,1.23; params/crop.mark.bleed.xml,1.1; params/
+ crop.mark.offset.xml,1.1; params/crop.mark.width.xml,1.1; params/
+ crop.marks.xml,1.1 - Jirka Kosek
+
+HTML
+
+The following changes have been made to the html code since the 1.69.1 release.
+
+ â— implemented index.method parameter and three methods.
+
+ Modified: html/autoidx.xsl,1.28 - Robert Stayton
+
+ â— added index.method parameter to support 3 indexing methods.
+
+ Modified: html/param.ent,1.94; html/param.xweb,1.103 - Robert Stayton
+
+ â— Implemented feature request #1072510 as a processing instruction to permit
+ including external HTML content into HTML output.
+
+ Modified: html/pi.xsl,1.9 - Robert Stayton
+
+ â— Added new parameter chunk.tocs.and.lots.has.title which controls presence
+ of title in a separate chunk with ToC/LoT. Disabling title can be very
+ useful if you are generating frameset output (well, yes those frames, but
+ some customers really want them ;-).
+
+ Modified: html/chunk-code.xsl,1.15; html/param.ent,1.93; html/
+ param.xweb,1.102; params/chunk.tocs.and.lots.has.title.xml,1.1 - Jirka
+ Kosek
+
+ â— Support dbhtml/dbfo start PI for orderedlist numbering in both HTML and FO
+
+ Modified: common/common.xsl,1.61; html/lists.xsl,1.50 - Norman Walsh
+
+ â— Allow ToC without title also for set and book.
+
+ Modified: html/autotoc.xsl,1.37; html/division.xsl,1.12 - Jirka Kosek
+
+ â— Implemented floats uniformly for figure, example, equation and
+ informalfigure, informalexample, and informalequation.
+
+ Modified: html/formal.xsl,1.22 - Robert Stayton
+
+ â— Added the autotoc.label.in.hyperlink param.
+
+ If the value of autotoc.label.in.hyperlink is non-zero, labels are included
+ in hyperlinked titles in the TOC. If it is instead zero, labels are still
+ displayed prior to the hyperlinked titles, but are not hyperlinked along
+ with the titles.
+
+ Closes patch #1065868. Thanks to anatoly techtonik for the patch.
+
+ Modified: html/autotoc.xsl,1.36; html/param.ent,1.92; html/
+ param.xweb,1.101; params/autotoc.label.in.hyperlink.xml,1.1 - Michael(tm)
+ Smith
+
+ â— Added two new params: html.head.legalnotice.link.types and html.head.
+ legalnotice.link.multiple.
+
+ If the value of the generate.legalnotice.link is non-zero, then the
+ stylesheet generates (in the head section of the HTML source) either a
+ single HTML link element or, if the value of the html.head.legalnotice.link
+ .multiple is non-zero, one link element for each link type specified. Each
+ link has the following attributes:
+
+ - a rel attribute whose value is derived from the value of html.head.
+ legalnotice.link.types
+
+ - an href attribute whose value is set to the URL of the file containing
+ the legalnotice
+
+ - a title attribute whose value is set to the title of the corresponding
+ legalnotice (or a title programatically determined by the stylesheet)
+
+ For example:
+
+ <link rel="copyright" href="ln-id2524073.html" title="Legal Notice">
+
+ Closes #1476450. Thanks to Sam Steingold.
+
+ Modified: html/chunk-common.xsl,1.45; html/param.ent,1.91; html/
+ param.xweb,1.100; params/generate.legalnotice.link.xml,1.4; params/
+ html.head.legalnotice.link.multiple.xml,1.1; params/
+ html.head.legalnotice.link.types.xml,1.1 - Michael(tm) Smith
+
+ â— Added refclass.suppress param.
+
+ If the value of refclass.suppress is non-zero, then display refclass
+ contents is suppressed in output. Affects HTML and FO output only.
+
+ Modified: fo/param.ent,1.93; fo/param.xweb,1.106; html/param.ent,1.90; html
+ /param.xweb,1.99; params/refclass.suppress.xml,1.1 - Michael(tm) Smith
+
+ â— Improved support for task subelements
+
+ Modified: fo/task.xsl,1.3; html/task.xsl,1.3 - Jirka Kosek
+
+ â— Added new refclass.suppress param for suppressing display of Refclass in
+ HTML and FO output. Did not add it to manpages because manpages stylesheet
+ is currently just silently ignoring Refclass anyway. Closes request #
+ 1461065. Thanks to Davor Ocelic (docelic) for reporting.
+
+ Modified: fo/refentry.xsl,1.29; html/refentry.xsl,1.23 - Michael(tm) Smith
+
+ â— Process alt text with normalize-space(). Replace tab indents with spaces.
+
+ Modified: html/graphics.xsl,1.57 - Robert Stayton
+
+ â— Content of citation element is automatically linked to the bibliographic
+ entry with the corresponding abbrev.
+
+ Modified: html/biblio.xsl,1.26; html/inline.xsl,1.47; html/xref.xsl,1.58 -
+ Jirka Kosek
+
+ â— Add template for task in mode="xref-to".
+
+ Modified: fo/xref.xsl,1.63; html/xref.xsl,1.57 - Robert Stayton
+
+ â— Suppress ID warnings if the .warnings parameter is 0
+
+ Modified: html/html.xsl,1.17 - Norman Walsh
+
+ â— Add support for floatstyle to figure.
+
+ Modified: html/formal.xsl,1.21 - Robert Stayton
+
+ â— Handling of xref to area/areaset need support in extensions code also. I
+ currently have no time to touch extensions code, so code is here to be
+ enabled when extension is fixed also.
+
+ Modified: html/xref.xsl,1.56 - Jirka Kosek
+
+ â— Added 3 parameters for overriding gentext for index punctuation.
+
+ Modified: html/param.ent,1.89; html/param.xweb,1.98 - Robert Stayton
+
+ â— Added parameters to support localization of index item punctuation. Added
+ index.separator named template to compute the separator punctuation based
+ on locale.
+
+ Modified: html/autoidx.xsl,1.27 - Robert Stayton
+
+ â— Added a <div class="{$class}-contents"> wrapper around output of contents
+ of all formal objects. Also, added an optional <br class="{class}-break"/>
+ linebreak after all formal objects.
+
+ WARNING: Because this change places an additional DIV between the DIV
+ wrapper for the equation and the equation contents, it may break some
+ existing CSS stylesheets that have been created with the assumption that
+ there would never be an intervening DIV there.
+
+ The following is an example of what Equation output looks like as a result
+ of the changes described above.
+
+ <div class="equation"> <a name="three" id="three"></a>
+
+ <p class="title"><b>(1.3)</b></p>
+
+ <div class="equation-contents"> <span class="mathphrase">1+1=3</span> </
+ div> </div><br class="equation-break">
+
+ Rationale: These changes allow CSS control of the placement of the
+ formal-object title relative to the formal-object contents. For example,
+ using the CSS "float" property enables the title and contents to be
+ rendered on the same line. Example stylesheet:
+
+ .equation { margin-top: 20px; margin-bottom: 20px; } .equation-contents {
+ float: left; }
+
+ .equation .title { margin-top: 0; float: right; margin-right: 200px; }
+
+ .equation .title b { font-weight: normal; }
+
+ .equation-break { clear: both; }
+
+ Note that the purpose of the ".equation-break" class is to provide a way to
+ clear off the floats.
+
+ If you want to instead have the equation title rendered to the left of the
+ equation contents, you can do something like this:
+
+ .equation { margin-top: 20px; width: 300px; margin-bottom: 20px; }
+ .equation-contents { float: right; }
+
+ .equation .title { margin-top: 0; float: left; margin-right: 200px; }
+
+ .equation .title b { font-weight: normal; }
+
+ .equation-break { clear: both; }
+
+ Modified: html/formal.xsl,1.20 - Michael(tm) Smith
+
+ â— Added a chunker.output.quiet top-level parameter so that the chunker can be
+ made quiet by default
+
+ Modified: html/chunker.xsl,1.26 - Norman Walsh
+
+ â— Added support for link, olink, and xref within OO Classsynopsis and
+ children. (Because DocBook NG/5 allows it).
+
+ Modified: fo/synop.xsl,1.15; html/synop.xsl,1.19 - Michael(tm) Smith
+
+ â— New parameter: id.warnings. If non-zero, warnings are generated for titled
+ objects that don't have titles. True by default; I wonder if this will be
+ too aggressive?
+
+ Modified: html/biblio.xsl,1.25; html/component.xsl,1.27; html/
+ division.xsl,1.11; html/formal.xsl,1.19; html/glossary.xsl,1.20; html/
+ html.xsl,1.13; html/index.xsl,1.16; html/param.ent,1.88; html/
+ param.xweb,1.97; html/refentry.xsl,1.22; html/sections.xsl,1.30; params/
+ id.warnings.xml,1.1 - Norman Walsh
+
+ â— If the keep.relative.image.uris parameter is true, don't use the absolute
+ URI (as calculated from xml:base) in the img src attribute, us the value
+ the author specified. Note that we still have to calculate the absolute
+ filename for use in the image intrinsics extension.
+
+ Modified: html/graphics.xsl,1.56 - Norman Walsh
+
+ â— Support date as an inline
+
+ Modified: fo/inline.xsl,1.43; html/inline.xsl,1.46 - Norman Walsh
+
+ â— Added new parameter keep.relative.image.uris
+
+ Modified: fo/param.ent,1.91; fo/param.xweb,1.104; html/param.ent,1.87; html
+ /param.xweb,1.96; params/keep.relative.image.uris.xml,1.1 - Norman Walsh
+
+ â— Added two new parameters for handling of multi-term varlistentry elements:
+
+ variablelist.term.break.after: When the variablelist.term.break.after is
+ non-zero, it will generate a line break after each term multi-term
+ varlistentry.
+
+ variablelist.term.separator: When a varlistentry contains multiple term
+ elements, the string specified in the value of the
+ variablelist.term.separator parameter is placed after each term except the
+ last. The default is ", " (a comma followed by a space). To suppress
+ rendering of the separator, set the value of variablelist.term.separator to
+ the empty string ("").
+
+ These parameters are primarily intended to be useful if you have multi-term
+ varlistentries that have long terms.
+
+ Closes #1306676. Thanks to Sam Steingold for providing an example "lots of
+ long terms" doc that demonstrated the value of having these options.
+
+ Also, added normalize-space() call to processing of each term.
+
+ This change affects all output formats (HTML, PDF, manpages). The default
+ behavior should pretty much remain the same as before, but it is possible
+ (as always) that the change may introduce some new bugginess.
+
+ Modified: fo/lists.xsl,1.62; fo/param.ent,1.88; fo/param.xweb,1.99; html/
+ lists.xsl,1.48; html/param.ent,1.86; html/param.xweb,1.93; manpages/
+ lists.xsl,1.22; manpages/param.ent,1.14; manpages/param.xweb,1.16; params/
+ variablelist.term.break.after.xml,1.1; params/
+ variablelist.term.separator.xml,1.1 - Michael(tm) Smith
+
+ â— Added "wrapper-name" param to inline.charseq named template, enabling it to
+ output inlines other than just "span". Acronym and Abbrev templates now use
+ inline.charseq to output HTML "acronym" and "abbr" elements (instead of
+ "span"). Closes #1305468. Thanks to Sam Steingold for suggesting the
+ change.
+
+ Modified: html/inline.xsl,1.45 - Michael(tm) Smith
+
+Manpages
+
+The following changes have been made to the manpages code since the 1.69.1
+release.
+
+ â— Added the following params:
+
+ - man.indent.width (string-valued) - man.indent.refsect (boolean) -
+ man.indent.blurbs (boolean) - man.indent.lists (boolean) -
+ man.indent.verbatims (boolean)
+
+ Note that in earlier snapshots, man.indent.width was named
+ man.indentation.default.value and the boolean params had names like
+ man.indentation.*.adjust. Also the man.indent.blurbs param was called
+ man.indentation.authors.adjust (or something).
+
+ The behavior now is: If the value of a particular man.indent.* boolean
+ param is non-zero, the corresponding contents (refsect*, list items,
+ authorblurb/personblurb, vervatims) are displayed with a left margin
+ indented by a width equal to the value of man.indent.width.
+
+ Modified: params/man.indent.blurbs.xml,1.1; manpages/docbook.xsl,1.74;
+ manpages/info.xsl,1.20; manpages/lists.xsl,1.30; manpages/other.xsl,1.20;
+ manpages/param.ent,1.22; manpages/param.xweb,1.24; manpages/
+ refentry.xsl,1.14; params/man.indent.lists.xml,1.1; params/
+ man.indent.refsect.xml,1.1; params/man.indent.verbatims.xml,1.1; params/
+ man.indent.width.xml,1.1 - Michael(tm) Smith
+
+ â— Added man.table.footnotes.divider param.
+
+ In each table that contains footenotes, the string specified by the man.
+ table.footnotes.divider parameter is output before the list of footnotes
+ for the table.
+
+ Modified: manpages/docbook.xsl,1.73; manpages/links.xsl,1.6; manpages/
+ param.ent,1.21; manpages/param.xweb,1.23; params/
+ man.table.footnotes.divider.xml,1.1 - Michael(tm) Smith
+
+ â— Added the man.output.in.separate.dir, man.output.base.dir, and
+ man.output.subdirs.enabled parameters.
+
+ The man.output.base.dir parameter specifies the base directory into which
+ man-page files are output. The man.output.subdirs.enabled parameter
+ controls whether the files are output in subdirectories within the base
+ directory.
+
+ The values of the man.output.base.dir and man.output.subdirs.enabled
+ parameters are used only if the value of man.output.in.separate.dir
+ parameter is non-zero. If the value of man.output.in.separate.dir is zero,
+ man-page files are not output in a separate directory.
+
+ Modified: manpages/docbook.xsl,1.72; manpages/param.ent,1.20; manpages/
+ param.xweb,1.22; params/man.output.base.dir.xml,1.1; params/
+ man.output.in.separate.dir.xml,1.1; params/
+ man.output.subdirs.enabled.xml,1.1 - Michael(tm) Smith
+
+ â— Added man.font.table.headings and man.font.table.title params, for
+ controlling font in table headings and titles.
+
+ Modified: manpages/docbook.xsl,1.71; manpages/param.ent,1.19; manpages/
+ param.xweb,1.21; params/man.font.table.headings.xml,1.1; params/
+ man.font.table.title.xml,1.1 - Michael(tm) Smith
+
+ â— Added man.font.funcsynopsisinfo and man.font.funcprototype params, for
+ specifying the roff font (for example, BI, B, I) for funcsynopsisinfo and
+ funcprototype output.
+
+ Modified: manpages/block.xsl,1.19; manpages/docbook.xsl,1.69; manpages/
+ param.ent,1.18; manpages/param.xweb,1.20; manpages/synop.xsl,1.29; manpages
+ /table.xsl,1.21; params/man.font.funcprototype.xml,1.1; params/
+ man.font.funcsynopsisinfo.xml,1.1 - Michael(tm) Smith
+
+ â— Added man.segtitle.suppress param.
+
+ If the value of man.segtitle.suppress is non-zero, then display of segtitle
+ contents is suppressed in output.
+
+ Modified: manpages/docbook.xsl,1.68; manpages/param.ent,1.17; manpages/
+ param.xweb,1.19; params/man.segtitle.suppress.xml,1.1 - Michael(tm) Smith
+
+ â— Added man.output.manifest.enabled and man.output.manifest.filename params.
+
+ If man.output.manifest.enabled is non-zero, a list of filenames for man
+ pages generated by the stylesheet transformation is written to the file
+ named by man.output.manifest.filename
+
+ Modified: manpages/docbook.xsl,1.67; manpages/other.xsl,1.19; manpages/
+ param.ent,1.16; manpages/param.xweb,1.18; params/
+ man.output.manifest.enabled.xml,1.1; params/
+ man.output.manifest.filename.xml,1.1; tools/make/Makefile.DocBook,1.4 -
+ Michael(tm) Smith
+
+ â— Added refentry.meta.get.quietly param.
+
+ If zero (the default), notes and warnings about "missing" markup are
+ generated during gathering of refentry metadata. If non-zero, the metadata
+ is gathered "quietly" -- that is, the notes and warnings are suppressed.
+
+ NOTE: If you are processing a large amount of refentry content, you may be
+ able to speed up processing significantly by setting a non-zero value for
+ refentry.meta.get.quietly.
+
+ Modified: common/refentry.xsl,1.17; manpages/param.ent,1.15; manpages/
+ param.xweb,1.17; params/refentry.meta.get.quietly.xml,1.1 - Michael(tm)
+ Smith
+
+ â— Changed names of all boolean indentation params to man.indent.* Also
+ discarded individual man.indent.*.value params and switched to just using a
+ common man.indent.width param (3n by default).
+
+ Modified: manpages/docbook.xsl,1.66; manpages/info.xsl,1.19; manpages/
+ lists.xsl,1.29; manpages/other.xsl,1.18; manpages/refentry.xsl,1.13 -
+ Michael(tm) Smith
+
+ â— Added boolean man.output.in.separate.dir param, to control whether or not
+ man files are output in separate directory.
+
+ Modified: manpages/docbook.xsl,1.65; manpages/utility.xsl,1.14 - Michael
+ (tm) Smith
+
+ â— Added options for controlling indentation of verbatim output. Controlled
+ through the man.indentation.verbatims.adjust and
+ man.indentation.verbatims.value params. Closes #1242997
+
+ Modified: manpages/block.xsl,1.15; manpages/docbook.xsl,1.64 - Michael(tm)
+ Smith
+
+ â— Added options for controlling indentation in lists and in *blurb output in
+ the AUTHORS section. Controlled through the man.indentation.lists.adjust,
+ man.indentation.lists.value, man.indentation.authors.adjust, and
+ man.indentation.authors.value parameters. Default is 3 characters (instead
+ of the roff default of 8 characters). Closes #1449369.
+
+ Also, removed the indent that was being set on informalexample outuput. I
+ will instead add an option for indenting verbatims, which I think is what
+ the informalexample indent was intended for originally.
+
+ Modified: manpages/block.xsl,1.14; manpages/docbook.xsl,1.63; manpages/
+ info.xsl,1.18; manpages/lists.xsl,1.28 - Michael(tm) Smith
+
+ â— Changed line-spacing call before synopfragment to use ".sp -1n" ("n" units
+ specified) instead of plain ".sp -1"
+
+ Modified: manpages/synop.xsl,1.28 - Michael(tm) Smith
+
+ â— Added support for writing man files into a specific output directory and
+ into appropriate subdirectories within that output directory. Controlled
+ through the man.base.dir parameter (similar to the base.dir support in the
+ HTML stylesheet) and the man.subdirs.enabled parameter, which automatically
+ determines the name of an appropriate subdir (for example, man/man7, man/
+ man1, etc.) based on the section number/manvolnum of the source Refentry.
+
+ Closes #1255036 and #1170317. Thanks to Denis Bradford for the original
+ feature request, and to Costin Stroie for submitting a patch that was very
+ helpful in implementing the support.
+
+ Modified: manpages/docbook.xsl,1.62; manpages/utility.xsl,1.13 - Michael
+ (tm) Smith
+
+ â— Refined XPath statements and notification messages for refentry metadata
+ handling.
+
+ Modified: common/common.xsl,1.59; common/refentry.xsl,1.14; manpages/
+ docbook.xsl,1.61; manpages/other.xsl,1.17 - Michael(tm) Smith
+
+ â— Added support for copyright and legalnotice. The manpages stylesheets now
+ output a COPYRIGHT section, after the AUTHORS section, if a copyright or
+ legalnotice is found in the source. The section contains the copyright
+ contents followed by the legalnotice contents. Closes #1450209.
+
+ Modified: manpages/docbook.xsl,1.59; manpages/info.xsl,1.17 - Michael(tm)
+ Smith
+
+ â— Drastically reworked all of the XPath expressions used in refentry metadata
+ gathering -- completely removed $parentinfo and turned $info into a set of
+ nodes that includes the *info contents of the Refentry plus the *info
+ contents all all of its ancestor elements. The basic XPath expression now
+ used throughout is (using the example of checking for a date):
+
+ (($info[//date])[last()]/date)[1].
+
+ That selects the "last" *info/date date in document order -- that is, the
+ one eitther on the Refentry itself or on the closest ancestor to the
+ Refentry.
+
+ It's likely this change may break some things; may need to pick up some
+ pieces later.
+
+ Also, changed the default value for the man.th.extra2.max.length from 40 to
+ 30.
+
+ Modified: common/common.xsl,1.58; common/refentry.xsl,1.7; params/
+ man.th.extra2.max.length.xml,1.2; params/refentry.date.profile.xml,1.2;
+ params/refentry.manual.profile.xml,1.2; params/
+ refentry.source.name.profile.xml,1.2; params/
+ refentry.version.profile.xml,1.2; manpages/docbook.xsl,1.58; manpages/
+ other.xsl,1.15 - Michael(tm) Smith
+
+ â— Added support for DocBook 5 namespace-stripping in manpages stylesheet.
+ Closes request #1210692.
+
+ Modified: common/common.xsl,1.56; manpages/docbook.xsl,1.57 - Michael(tm)
+ Smith
+
+ â— Fixed handling of table footnotes. With this checkin, the table support in
+ the manpages stylesheet is now basically feature complete. So this change
+ closes request #619532, "No support for tables" -- the oldest currently
+ open manpages feature request, submitted by Ben Secrest (blsecres) on
+ 2002-10-07. Congratulations to me [patting myself on the back].
+
+ Modified: manpages/block.xsl,1.11; manpages/docbook.xsl,1.55; manpages/
+ table.xsl,1.15 - Michael(tm) Smith
+
+ â— Added handling for table titles. Also fixed handling of nested tables; nest
+ tables are now "extracted" and displayed just after their parent tables.
+
+ Modified: manpages/docbook.xsl,1.54; manpages/table.xsl,1.14 - Michael(tm)
+ Smith
+
+ â— Added option for turning off bold formatting in Funcsynopsis. Boldface
+ formatting in function synopsis is mandated in the man(7) man page and is
+ used almost universally in existing man pages. Despite that, it really does
+ look like crap to have an entire Funcsynopsis output in bold, so I added
+ params for turning off the bold formatting and/or replacing it with a
+ different roff special font (e.g., "RI" for alternating roman/italic
+ instead of the default "BI" for alternating bold/italic). The new params
+ are "man.funcprototype.font" and "man.funcsynopsisinfo.font". To be
+ documented later.
+
+ Closes #1452247. Thanks to Joe Orton for the feature request.
+
+ Modified: params/man.string.subst.map.xml,1.16; manpages/block.xsl,1.10;
+ manpages/docbook.xsl,1.51; manpages/inline.xsl,1.16; manpages/
+ synop.xsl,1.27 - Michael(tm) Smith
+
+ â— Use AUTHORS instead of AUTHOR if we have multiple people to attribute.
+ Also, fixed checking such that we generate author section even if we don't
+ have an author (as long as there is at least one other person/entity we can
+ put in the section). Also adjusted assembly of content for Author metainfo
+ field such that we now not only use author, but try to find a "best match"
+ if we can't find an author name to put there.
+
+ Closes #1233592. Thanks to Sam Steingold for the request.
+
+ Modified: manpages/info.xsl,1.12 - Michael(tm) Smith
+
+ â— Changes for request #1243027, "Impove handling of AUTHOR section." This
+ adds support for Collab, Corpauthor, Corpcredt, Orgname, Publishername, and
+ Publisher. Also adds support for output of Affiliation and its children,
+ and support for using gentext strings for auto-attributing roles (Author,
+ Editor, Publisher, Translator, etc.). Also did a lot of code cleanup and
+ modularization of all the AUTHOR handling code. And fixed a bug that was
+ causing Author info to not be picked up correctly for metainfo comment we
+ embed in man-page source.
+
+ Modified: manpages/info.xsl,1.11 - Michael(tm) Smith
+
+ â— Support bold output for "emphasis remap='B'". (because Eric Raymond's
+ doclifter(1) tool converts groff source marked up with ".B" request or "\
+ fB" escapes to DocBook "emphasis remap='B'".)
+
+ Modified: manpages/inline.xsl,1.14 - Michael(tm) Smith
+
+ â— Added support for Segmentedlist. Details: Output is tabular, with no option
+ for "list" type output. Output for Segtitle elements can be supressed by
+ setting man.segtitle.suppress. If Segtitle content is output, it is
+ rendered in italic type (not bold because not all terminals support bold
+ and so italic ensures the stand out on those terminals). Extra space (.sp
+ line) at end of table code ensures that it gets handled correctly in the
+ case where its source is the child of a Para. Closes feature-request #
+ 1400097. Thanks to Daniel Leidert for the patch and push, and to Alastair
+ Rankine for filing the original feature request.
+
+ Modified: manpages/lists.xsl,1.23; manpages/utility.xsl,1.10 - Michael(tm)
+ Smith
+
+ â— Improved handling or Author/Editor/Othercredit.
+
+ Reworked content of (non-visible) comment added at top of each page
+ (metadata stuff).
+
+ Added support for generating a manifest file (useful for cleaning up after
+ builds, etc.)
+
+ Modified: manpages/docbook.xsl,1.46; manpages/info.xsl,1.9; manpages/
+ other.xsl,1.12; manpages/utility.xsl,1.6 - Michael(tm) Smith
+
+ â— Added two new parameters for handling of multi-term varlistentry elements:
+
+ variablelist.term.break.after: When the variablelist.term.break.after is
+ non-zero, it will generate a line break after each term multi-term
+ varlistentry.
+
+ variablelist.term.separator: When a varlistentry contains multiple term
+ elements, the string specified in the value of the
+ variablelist.term.separator parameter is placed after each term except the
+ last. The default is ", " (a comma followed by a space). To suppress
+ rendering of the separator, set the value of variablelist.term.separator to
+ the empty string ("").
+
+ These parameters are primarily intended to be useful if you have multi-term
+ varlistentries that have long terms.
+
+ Closes #1306676. Thanks to Sam Steingold for providing an example "lots of
+ long terms" doc that demonstrated the value of having these options.
+
+ Also, added normalize-space() call to processing of each term.
+
+ This change affects all output formats (HTML, PDF, manpages). The default
+ behavior should pretty much remain the same as before, but it is possible
+ (as always) that the change may introduce some new bugginess.
+
+ Modified: fo/lists.xsl,1.62; fo/param.ent,1.88; fo/param.xweb,1.99; html/
+ lists.xsl,1.48; html/param.ent,1.86; html/param.xweb,1.93; manpages/
+ lists.xsl,1.22; manpages/param.ent,1.14; manpages/param.xweb,1.16; params/
+ variablelist.term.break.after.xml,1.1; params/
+ variablelist.term.separator.xml,1.1 - Michael(tm) Smith
+
+Params
+
+The following changes have been made to the params code since the 1.69.1
+release.
+
+ â— New parameters to set header/footer table minimum height.
+
+ Modified: params/footer.table.height.xml,1.1; params/
+ header.table.height.xml,1.1 - Robert Stayton
+
+ â— Support multiple indexing methods for different languages.
+
+ Modified: params/index.method.xml,1.1 - Robert Stayton
+
+ â— Remove qandaset and qandadiv from generate.toc for fo output because
+ formerly it wasn't working, but now it is and the default behavior should
+ stay the same.
+
+ Modified: params/generate.toc.xml,1.8 - Robert Stayton
+
+ â— add support for page number references to link element too.
+
+ Modified: params/insert.link.page.number.xml,1.1 - Robert Stayton
+
+ â— Add support for more characters to hyphen on when ulink.hyphenate is turned
+ on.
+
+ Modified: params/ulink.hyphenate.chars.xml,1.1; params/
+ ulink.hyphenate.xml,1.3 - Robert Stayton
+
+ â— New attribute-set to format biblioentry and bibliomixed.
+
+ Modified: params/biblioentry.properties.xml,1.1 - Robert Stayton
+
+ â— Added new parameter chunk.tocs.and.lots.has.title which controls presence
+ of title in a separate chunk with ToC/LoT. Disabling title can be very
+ useful if you are generating frameset output (well, yes those frames, but
+ some customers really want them ;-).
+
+ Modified: html/chunk-code.xsl,1.15; html/param.ent,1.93; html/
+ param.xweb,1.102; params/chunk.tocs.and.lots.has.title.xml,1.1 - Jirka
+ Kosek
+
+ â— Added new attribute set toc.line.properties for controlling appearance of
+ lines in ToC/LoT
+
+ Modified: params/toc.line.properties.xml,1.1 - Jirka Kosek
+
+ â— Allow table footnotes to have different properties from regular footnotes.
+
+ Modified: params/table.footnote.properties.xml,1.1 - Robert Stayton
+
+ â— Set properties for pgwide="1" objects.
+
+ Modified: params/pgwide.properties.xml,1.1 - Robert Stayton
+
+ â— Added the autotoc.label.in.hyperlink param.
+
+ If the value of autotoc.label.in.hyperlink is non-zero, labels are included
+ in hyperlinked titles in the TOC. If it is instead zero, labels are still
+ displayed prior to the hyperlinked titles, but are not hyperlinked along
+ with the titles.
+
+ Closes patch #1065868. Thanks to anatoly techtonik for the patch.
+
+ Modified: html/autotoc.xsl,1.36; html/param.ent,1.92; html/
+ param.xweb,1.101; params/autotoc.label.in.hyperlink.xml,1.1 - Michael(tm)
+ Smith
+
+ â— Added two new params: html.head.legalnotice.link.types and html.head.
+ legalnotice.link.multiple.
+
+ If the value of the generate.legalnotice.link is non-zero, then the
+ stylesheet generates (in the head section of the HTML source) either a
+ single HTML link element or, if the value of the html.head.legalnotice.link
+ .multiple is non-zero, one link element for each link type specified. Each
+ link has the following attributes:
+
+ - a rel attribute whose value is derived from the value of html.head.
+ legalnotice.link.types
+
+ - an href attribute whose value is set to the URL of the file containing
+ the legalnotice
+
+ - a title attribute whose value is set to the title of the corresponding
+ legalnotice (or a title programatically determined by the stylesheet)
+
+ For example:
+
+ <link rel="copyright" href="ln-id2524073.html" title="Legal Notice">
+
+ Closes #1476450. Thanks to Sam Steingold.
+
+ Modified: html/chunk-common.xsl,1.45; html/param.ent,1.91; html/
+ param.xweb,1.100; params/generate.legalnotice.link.xml,1.4; params/
+ html.head.legalnotice.link.multiple.xml,1.1; params/
+ html.head.legalnotice.link.types.xml,1.1 - Michael(tm) Smith
+
+ â— Added the following params:
+
+ - man.indent.width (string-valued) - man.indent.refsect (boolean) -
+ man.indent.blurbs (boolean) - man.indent.lists (boolean) -
+ man.indent.verbatims (boolean)
+
+ Note that in earlier snapshots, man.indent.width was named
+ man.indentation.default.value and the boolean params had names like
+ man.indentation.*.adjust. Also the man.indent.blurbs param was called
+ man.indentation.authors.adjust (or something).
+
+ The behavior now is: If the value of a particular man.indent.* boolean
+ param is non-zero, the corresponding contents (refsect*, list items,
+ authorblurb/personblurb, vervatims) are displayed with a left margin
+ indented by a width equal to the value of man.indent.width.
+
+ Modified: params/man.indent.blurbs.xml,1.1; manpages/docbook.xsl,1.74;
+ manpages/info.xsl,1.20; manpages/lists.xsl,1.30; manpages/other.xsl,1.20;
+ manpages/param.ent,1.22; manpages/param.xweb,1.24; manpages/
+ refentry.xsl,1.14; params/man.indent.lists.xml,1.1; params/
+ man.indent.refsect.xml,1.1; params/man.indent.verbatims.xml,1.1; params/
+ man.indent.width.xml,1.1 - Michael(tm) Smith
+
+ â— Added man.table.footnotes.divider param.
+
+ In each table that contains footenotes, the string specified by the man.
+ table.footnotes.divider parameter is output before the list of footnotes
+ for the table.
+
+ Modified: manpages/docbook.xsl,1.73; manpages/links.xsl,1.6; manpages/
+ param.ent,1.21; manpages/param.xweb,1.23; params/
+ man.table.footnotes.divider.xml,1.1 - Michael(tm) Smith
+
+ â— Added the man.output.in.separate.dir, man.output.base.dir, and
+ man.output.subdirs.enabled parameters.
+
+ The man.output.base.dir parameter specifies the base directory into which
+ man-page files are output. The man.output.subdirs.enabled parameter
+ controls whether the files are output in subdirectories within the base
+ directory.
+
+ The values of the man.output.base.dir and man.output.subdirs.enabled
+ parameters are used only if the value of man.output.in.separate.dir
+ parameter is non-zero. If the value of man.output.in.separate.dir is zero,
+ man-page files are not output in a separate directory.
+
+ Modified: manpages/docbook.xsl,1.72; manpages/param.ent,1.20; manpages/
+ param.xweb,1.22; params/man.output.base.dir.xml,1.1; params/
+ man.output.in.separate.dir.xml,1.1; params/
+ man.output.subdirs.enabled.xml,1.1 - Michael(tm) Smith
+
+ â— Added man.font.table.headings and man.font.table.title params, for
+ controlling font in table headings and titles.
+
+ Modified: manpages/docbook.xsl,1.71; manpages/param.ent,1.19; manpages/
+ param.xweb,1.21; params/man.font.table.headings.xml,1.1; params/
+ man.font.table.title.xml,1.1 - Michael(tm) Smith
+
+ â— Added man.font.funcsynopsisinfo and man.font.funcprototype params, for
+ specifying the roff font (for example, BI, B, I) for funcsynopsisinfo and
+ funcprototype output.
+
+ Modified: manpages/block.xsl,1.19; manpages/docbook.xsl,1.69; manpages/
+ param.ent,1.18; manpages/param.xweb,1.20; manpages/synop.xsl,1.29; manpages
+ /table.xsl,1.21; params/man.font.funcprototype.xml,1.1; params/
+ man.font.funcsynopsisinfo.xml,1.1 - Michael(tm) Smith
+
+ â— Changed to select="0" in refclass.suppress (instead of ..>0</..)
+
+ Modified: params/refclass.suppress.xml,1.3 - Michael(tm) Smith
+
+ â— Added man.segtitle.suppress param.
+
+ If the value of man.segtitle.suppress is non-zero, then display of segtitle
+ contents is suppressed in output.
+
+ Modified: manpages/docbook.xsl,1.68; manpages/param.ent,1.17; manpages/
+ param.xweb,1.19; params/man.segtitle.suppress.xml,1.1 - Michael(tm) Smith
+
+ â— Added man.output.manifest.enabled and man.output.manifest.filename params.
+
+ If man.output.manifest.enabled is non-zero, a list of filenames for man
+ pages generated by the stylesheet transformation is written to the file
+ named by man.output.manifest.filename
+
+ Modified: manpages/docbook.xsl,1.67; manpages/other.xsl,1.19; manpages/
+ param.ent,1.16; manpages/param.xweb,1.18; params/
+ man.output.manifest.enabled.xml,1.1; params/
+ man.output.manifest.filename.xml,1.1; tools/make/Makefile.DocBook,1.4 -
+ Michael(tm) Smith
+
+ â— Added refclass.suppress param.
+
+ If the value of refclass.suppress is non-zero, then display refclass
+ contents is suppressed in output. Affects HTML and FO output only.
+
+ Modified: fo/param.ent,1.93; fo/param.xweb,1.106; html/param.ent,1.90; html
+ /param.xweb,1.99; params/refclass.suppress.xml,1.1 - Michael(tm) Smith
+
+ â— Added refentry.meta.get.quietly param.
+
+ If zero (the default), notes and warnings about "missing" markup are
+ generated during gathering of refentry metadata. If non-zero, the metadata
+ is gathered "quietly" -- that is, the notes and warnings are suppressed.
+
+ NOTE: If you are processing a large amount of refentry content, you may be
+ able to speed up processing significantly by setting a non-zero value for
+ refentry.meta.get.quietly.
+
+ Modified: common/refentry.xsl,1.17; manpages/param.ent,1.15; manpages/
+ param.xweb,1.17; params/refentry.meta.get.quietly.xml,1.1 - Michael(tm)
+ Smith
+
+ â— Added support for "software" and "sectdesc" class values on refmiscinfo;
+ "software" is treated identically to "source", and "setdesc" is treated
+ identically to "manual".
+
+ Modified: common/refentry.xsl,1.10; params/
+ man.th.extra2.max.length.xml,1.3; params/
+ refentry.source.name.profile.xml,1.4 - Michael(tm) Smith
+
+ â— Drastically reworked all of the XPath expressions used in refentry metadata
+ gathering -- completely removed $parentinfo and turned $info into a set of
+ nodes that includes the *info contents of the Refentry plus the *info
+ contents all all of its ancestor elements. The basic XPath expression now
+ used throughout is (using the example of checking for a date):
+
+ (($info[//date])[last()]/date)[1].
+
+ That selects the "last" *info/date date in document order -- that is, the
+ one eitther on the Refentry itself or on the closest ancestor to the
+ Refentry.
+
+ It's likely this change may break some things; may need to pick up some
+ pieces later.
+
+ Also, changed the default value for the man.th.extra2.max.length from 40 to
+ 30.
+
+ Modified: common/common.xsl,1.58; common/refentry.xsl,1.7; params/
+ man.th.extra2.max.length.xml,1.2; params/refentry.date.profile.xml,1.2;
+ params/refentry.manual.profile.xml,1.2; params/
+ refentry.source.name.profile.xml,1.2; params/
+ refentry.version.profile.xml,1.2; manpages/docbook.xsl,1.58; manpages/
+ other.xsl,1.15 - Michael(tm) Smith
+
+ â— Added option for turning off bold formatting in Funcsynopsis. Boldface
+ formatting in function synopsis is mandated in the man(7) man page and is
+ used almost universally in existing man pages. Despite that, it really does
+ look like crap to have an entire Funcsynopsis output in bold, so I added
+ params for turning off the bold formatting and/or replacing it with a
+ different roff special font (e.g., "RI" for alternating roman/italic
+ instead of the default "BI" for alternating bold/italic). The new params
+ are "man.funcprototype.font" and "man.funcsynopsisinfo.font". To be
+ documented later.
+
+ Closes #1452247. Thanks to Joe Orton for the feature request.
+
+ Modified: params/man.string.subst.map.xml,1.16; manpages/block.xsl,1.10;
+ manpages/docbook.xsl,1.51; manpages/inline.xsl,1.16; manpages/
+ synop.xsl,1.27 - Michael(tm) Smith
+
+ â— fop.extensions now only for FOP version 0.20.5 and earlier.
+
+ Modified: params/fop.extensions.xml,1.4 - Robert Stayton
+
+ â— Support for fop1 different from fop 0.20.5 and earlier.
+
+ Modified: params/fop1.extensions.xml,1.1 - Robert Stayton
+
+ â— Reset default value to empty string so template uses gentext first, then
+ the parameter value if not empty.
+
+ Modified: params/index.number.separator.xml,1.2; params/
+ index.range.separator.xml,1.2; params/index.term.separator.xml,1.2 - Robert
+ Stayton
+
+ â— New parameter: id.warnings. If non-zero, warnings are generated for titled
+ objects that don't have titles. True by default; I wonder if this will be
+ too aggressive?
+
+ Modified: html/biblio.xsl,1.25; html/component.xsl,1.27; html/
+ division.xsl,1.11; html/formal.xsl,1.19; html/glossary.xsl,1.20; html/
+ html.xsl,1.13; html/index.xsl,1.16; html/param.ent,1.88; html/
+ param.xweb,1.97; html/refentry.xsl,1.22; html/sections.xsl,1.30; params/
+ id.warnings.xml,1.1 - Norman Walsh
+
+ â— Added new parameter keep.relative.image.uris
+
+ Modified: fo/param.ent,1.91; fo/param.xweb,1.104; html/param.ent,1.87; html
+ /param.xweb,1.96; params/keep.relative.image.uris.xml,1.1 - Norman Walsh
+
+ â— Support default label width parameters for itemized and ordered lists
+
+ Modified: fo/lists.xsl,1.64; fo/param.ent,1.90; fo/param.xweb,1.103; params
+ /itemizedlist.label.width.xml,1.1; params/orderedlist.label.width.xml,1.1 -
+ Norman Walsh
+
+ â— Added parameters to localize punctuation in indexes.
+
+ Modified: params/index.number.separator.xml,1.1; params/
+ index.range.separator.xml,1.1; params/index.term.separator.xml,1.1 - Robert
+ Stayton
+
+ â— Added two new parameters for handling of multi-term varlistentry elements:
+
+ variablelist.term.break.after: When the variablelist.term.break.after is
+ non-zero, it will generate a line break after each term multi-term
+ varlistentry.
+
+ variablelist.term.separator: When a varlistentry contains multiple term
+ elements, the string specified in the value of the
+ variablelist.term.separator parameter is placed after each term except the
+ last. The default is ", " (a comma followed by a space). To suppress
+ rendering of the separator, set the value of variablelist.term.separator to
+ the empty string ("").
+
+ These parameters are primarily intended to be useful if you have multi-term
+ varlistentries that have long terms.
+
+ Closes #1306676. Thanks to Sam Steingold for providing an example "lots of
+ long terms" doc that demonstrated the value of having these options.
+
+ Also, added normalize-space() call to processing of each term.
+
+ This change affects all output formats (HTML, PDF, manpages). The default
+ behavior should pretty much remain the same as before, but it is possible
+ (as always) that the change may introduce some new bugginess.
+
+ Modified: fo/lists.xsl,1.62; fo/param.ent,1.88; fo/param.xweb,1.99; html/
+ lists.xsl,1.48; html/param.ent,1.86; html/param.xweb,1.93; manpages/
+ lists.xsl,1.22; manpages/param.ent,1.14; manpages/param.xweb,1.16; params/
+ variablelist.term.break.after.xml,1.1; params/
+ variablelist.term.separator.xml,1.1 - Michael(tm) Smith
+
+ â— Convert 'no' to string in default value.
+
+ Modified: params/olink.doctitle.xml,1.4 - Robert Stayton
+
+ â— Implemented RFE #1292615.
+
+ Added bunch of new parameters (attribute sets) that affect list
+ presentation: list.block.properties, itemizedlist.properties, orderedlist
+ .properties, itemizedlist.label.properties and orderedlist.label
+ .properties. Default behaviour of stylesheets has not been changed but
+ further customizations will be much more easier.
+
+ Modified: fo/lists.xsl,1.61; fo/param.ent,1.87; fo/param.xweb,1.98; params/
+ itemizedlist.label.properties.xml,1.1; params/
+ itemizedlist.properties.xml,1.1; params/list.block.properties.xml,1.1;
+ params/orderedlist.label.properties.xml,1.1; params/
+ orderedlist.properties.xml,1.1 - Jirka Kosek
+
+ â— Implemented RFE #1242092.
+
+ You can enable crop marks in your document by setting crop.marks=1 and
+ xep.extensions=1. Appearance of crop marks can be controlled by parameters
+ crop.mark.bleed (6pt), crop.mark.offset (24pt) and crop.mark.width (0.5pt).
+
+ Also there is new named template called user-xep-pis. You can overwrite it
+ in order to produce some PIs that can control XEP as described in http://
+ www.renderx.com/reference.html#Output_Formats
+
+ Modified: fo/docbook.xsl,1.36; fo/param.ent,1.86; fo/param.xweb,1.97; fo/
+ xep.xsl,1.23; params/crop.mark.bleed.xml,1.1; params/
+ crop.mark.offset.xml,1.1; params/crop.mark.width.xml,1.1; params/
+ crop.marks.xml,1.1 - Jirka Kosek
+
+ â— Changed short descriptions in doc for *autolabel* params to match new
+ autolabel behavior.
+
+ Modified: params/appendix.autolabel.xml,1.5; params/
+ chapter.autolabel.xml,1.4; params/part.autolabel.xml,1.5; params/
+ preface.autolabel.xml,1.4 - Michael(tm) Smith
+
+Profiling
+
+The following changes have been made to the profiling code since the 1.69.1
+release.
+
+ â— Profiling now works together with namespace stripping (V5 documents).
+ Namespace striping should work with all stylesheets named profile-, even if
+ they are not supporting namespace stripping in a non-profiling variant.
+
+ Modified: profiling/profile-mode.xsl,1.4; profiling/xsl2profile.xsl,1.7 -
+ Jirka Kosek
+
+ â— Moved profiling stage out of templates. This make possible to reuse
+ profiled content by several templates and still maintaing node indentity
+ (needed for example for HTML Help where content is processed multiple
+ times).
+
+ I don't know why this was not on the top level before. Maybe some XSLT
+ processors choked on it. I hope this will be OK now.
+
+ Modified: profiling/xsl2profile.xsl,1.5 - Jirka Kosek
+
+Tools
+
+The following changes have been made to the tools code since the 1.69.1
+release.
+
+ â— Moved Makefile.DocBook from contrib module to xsl module.
+
+ Modified: tools/make/Makefile.DocBook,1.1 - Michael(tm) Smith
+
+WordML
+
+The following changes have been made to the wordml code since the 1.69.1
+release.
+
+ â— added contrib element, better handling of default paragraph style
+
+ Modified: wordml/pages-normalise.xsl,1.6; wordml/supported.xml,1.2; wordml/
+ wordml-final.xsl,1.14 - Steve Ball
+
+ â— added bridgehead
+
+ Modified: wordml/docbook-pages.xsl,1.6; wordml/docbook.xsl,1.17; wordml/
+ pages-normalise.xsl,1.5; wordml/template-pages.xml,1.7; wordml/
+ template.dot,1.4; wordml/template.xml,1.14; wordml/wordml-final.xsl,1.13 -
+ Steve Ball
+
+ â— added blocks stylesheet to support bibliographies, glossaries and qandasets
+
+ Modified: wordml/Makefile,1.4; wordml/README,1.3; wordml/
+ blocks-spec.xml,1.1; wordml/docbook-pages.xsl,1.5; wordml/docbook.xsl,1.16;
+ wordml/pages-normalise.xsl,1.4; wordml/sections-spec.xml,1.3; wordml/
+ specifications.xml,1.13; wordml/template-pages.xml,1.6; wordml/
+ template.dot,1.3; wordml/template.xml,1.13; wordml/wordml-blocks.xsl,1.1;
+ wordml/wordml-final.xsl,1.12; wordml/wordml-sections.xsl,1.3 - Steve Ball
+
+ â— added mediaobject caption
+
+ Modified: wordml/docbook-pages.xsl,1.4; wordml/docbook.xsl,1.15; wordml/
+ specifications.xml,1.12; wordml/template-pages.xml,1.5; wordml/
+ template.dot,1.2; wordml/template.xml,1.12; wordml/wordml-final.xsl,1.11 -
+ Steve Ball
+
+ â— added callouts
+
+ Modified: wordml/docbook-pages.xsl,1.3; wordml/docbook.xsl,1.14; wordml/
+ pages-normalise.xsl,1.3; wordml/specifications.xml,1.11; wordml/
+ template-pages.xml,1.4; wordml/wordml-final.xsl,1.10 - Steve Ball
+
+ â— added Word template file
+
+ Modified: wordml/template.dot,1.1 - Steve Ball
+
+ â— added abstract, fixed itemizedlist, ulink
+
+ Modified: wordml/specifications.xml,1.10; wordml/wordml-final.xsl,1.9 -
+ Steve Ball
+
+ â— fixed Makefile added many features to Pages support added revhistory,
+ inlines, highlights, abstract
+
+ Modified: wordml/Makefile,1.2; wordml/docbook-pages.xsl,1.2; wordml/
+ pages-normalise.xsl,1.2; wordml/sections-spec.xml,1.2; wordml/
+ specifications.xml,1.9; wordml/template-pages.xml,1.3; wordml/
+ template.xml,1.11; wordml/wordml-final.xsl,1.8; wordml/
+ wordml-sections.xsl,1.2 - Steve Ball
+
+ â— fixed handling linebreaks when generating WordML added Apple Pages support
+
+ Modified: wordml/docbook.xsl,1.13; wordml/template-pages.xml,1.2 - Steve
+ Ball
+
+Release 1.69.1
+
+This release is a minor bug-fix update to the 1.69.0 release. Along with bug
+fixes, it includes one configuration-parameter change: The default value of the
+annotation.support parameter is now 0 (off). The reason for that change is that
+there have been reports that annotation handling is causing a significant
+performance degradation in processing of large documents with xsltproc.
+
+Release 1.69.0
+
+The release includes major feature changes, particularly in the manpages
+stylesheets, as well as a large number of bug fixes.
+
+As with all DocBook Project “dot zero†releases, this is an experimental
+release .
+
+Common
+
+ â— This release adds localizations for the following languages: Albanian,
+ Amharic, Azerbaijani, Hindi, Irish (Gaelic), Gujarati, Kannada, Mongolian,
+ Oriya, Punjabi, Tagalog, Tamil, and Welsh.
+
+ â— Added support for specifying number format for auto labels for chapter,
+ appendix, part, and preface. Contolled with the appendix.autolabel,
+ chapter.autolabel, part.autolabel, and preface.autolabel parameters.
+
+ â— Added basic support for biblioref cross referencing.
+
+ â— Added support for align on caption in mediaobject.
+
+ â— Added support for processing documents that use the DocBook V5 namespace.
+
+ â— Added support for termdef and mathphrase.
+
+ â— EXPERIMENTAL: Incorporated the Slides and Website stylesheets into the
+ DocBook XSL stylesheets package. So, for example, Website documents can now
+ be processed using the following URI for the driver Website tabular.xsl
+ file:
+
+ http://docbook.sourceforge.net/release/xsl/current/website/tabular.xsl
+
+ ◠A procedure without a title is now treated as an “informal†procedure
+ (meaning that it is not added to any generated “list of procedures†and has
+ no affect on numbering of generated labels for other procedures).
+
+ â— docname is no longer added to olink when pointing to a root element.
+
+ â— Added support for generation of choice separator in inline simplelist. This
+ enables auto-generation of an appropriate localized “choice separator†(for
+ example, “and†or “orâ€) before the final item in an inline simplelist.
+
+ To indicate that you want a choice separator generated for a particular
+ list, you need to put a processing instruction (PI) of the form <?
+ dbchoice choice="foo"?> as a child of the list. For example:
+
+ <para>Choose from
+ ONE and ONLY ONE of the following:
+ <simplelist type="inline">
+ <?dbchoice choice="or" ?>
+ <member>A</member>
+ <member>B</member>
+ <member>C</member>.</simplelist></para>
+
+ Output (for English):
+
+ Choose from ONE and only ONE of the following choices: A, B, or C.
+
+ As a temporary workaround for the fact that most of the DocBook non-English
+ locale files don't have a localization for the word “orâ€, you can put in a
+ literal string to be used; example for French: <?dbchoice choice="ou">.
+ That is, use “ou†instead of “orâ€.
+
+FO
+
+ â— Added content-type property to external-graphic element, based on imagedata
+ format attribute.
+
+ ◠Added support for generating <rx:meta-field creator="$VERSION"/> field for
+ XEP output. This makes the DocBook XSL stylesheet version information
+ available through the Document Properties menu in Acrobat Reader and other
+ PDF viewers.
+
+ â— Trademark symbol handling made consistent with handling of same in HTML
+ stylesheets. Prior to this change, if you processed a document that
+ contained no value for the class attribute on the trademark element, the
+ HTML stylesheets would default to rendering a superscript TM symbol after
+ the trademark contents, but the FO stylesheets would render nothing.
+
+ â— Added support for generating XEP bookmarks for refentry.
+
+ â— Added support for HTML markup table border attribute, applied to each table
+ cell.
+
+ â— The table.width template can now sum column specs if none use % or *.
+
+ â— Added fox:destination extension inside fox:outline to support linking to
+ internal destinations.
+
+ â— Added support for customizing abstract with property sets. Controlled with
+ the abstract.properties and abstract.title.properties parameters.
+
+ â— Add footnotes in table title to table footnote set, and add support for
+ table footnotes to HTML table markup.
+
+ â— Added support for title in glosslist.
+
+ â— Added support for itemizedlist symbol none.
+
+ â— Implemented the new graphical.admonition.properties and
+ nongraphical.admonition.properties attribute sets.
+
+ â— Added id to formalpara and some other blocks that were missing it.
+
+ â— Changed the anchor template to output fo:inline instead of fo:wrapper.
+
+ â— Added support for toc.max.depth parameter.
+
+Help
+
+ â— Eclipse Help: Added support for generating olink database.
+
+HTML
+
+ â— Added a first cut at support in HTML output for DocBook 5 style annotation
+ s. Controlled using the annotation.support parameter, and implemented using
+ JavaScript and CSS styling. For more details, see the documentation for the
+ annotation.js, annotation.css, annotation.graphic.open, and
+ annotation.graphic.close parameters.
+
+ â— Generate client-side image map for imageobjectco with areas using calspair
+ units
+
+ â— Added support for <?img.src.path?> PI.
+
+ â— Added support for passing img.src.path to DocBook Java XSLT image
+ extensions when appropriate. Controlled using the
+ graphicsize.use.img.src.path parameter.
+
+ â— Added support for (not valid for DocBook 4) xlink:href on area and (not
+ valid for DocBook 4) alt in area.
+
+ â— Added new parameter default.table.frame to control table framing if there
+ is no frame attribute on a table.
+
+ â— Added initial, experimental support for generating content for the HTML
+ title attribute from content of the alt element. This change adds support
+ for the following inline elements only (none of them are block elements):
+ abbrev, accel, acronym, action, application, authorinitials, beginpage,
+ citation, citerefentry, citetitle, city, classname, code, command,
+ computeroutput, constant, country, database, email, envar, errorcode,
+ errorname, errortext, errortype, exceptionname, fax, filename, firstname,
+ firstterm, foreignphrase, function, glossterm, guibutton, guiicon, guilabel
+ , guimenu, guimenuitem, guisubmenu, hardware, honorific, interface,
+ interfacename, keycap, keycode, keysym, lineage, lineannotation, literal,
+ markup, medialabel, methodname, mousebutton, option, optional, otheraddr,
+ othername, package, parameter, personname, phone, pob, postcode,
+ productname, productnumber, prompt, property, quote, refentrytitle, remark,
+ replaceable, returnvalue, tag, shortcut, state, street, structfield,
+ structname, subscript, superscript, surname, symbol, systemitem, tag,
+ termdef, token, trademark, type, uri, userinput, varname, and wordasword
+
+ â— Added support for chunking revhistory into separate file (similar to the
+ support for doing same with legalnotice). Patch from Thomas Schraitle.
+ Controlled through new generate.revhistory.link parameter.
+
+ â— l10n.xsl: Made language codes RFC compliant. Added a new boolean config
+ parameter, l10n.lang.value.rfc.compliant. If it is non-zero (the default),
+ any underscore in a language code will be converted to a hyphen in HTML
+ output. If it is zero, the language code will be left as-is.
+
+man
+
+This release closes out 44 manpages stylesheet bug reports and feature
+requests. It adds more than 35 new configuration parameters for controlling
+aspects of man-page output -- including hyphenation and justification, handling
+of links, conversion of Unicode characters, and contents of man-page headers
+and footers.
+
+ â— New options for globally disabling/enabling hyphenation and justification:
+ man.justify and man.hyphenate.
+
+ Note that the default for the both of those is zero (off), because
+ justified text looks good only when it is also hyphenated; to quote the
+ “Hyphenation†node from the groff info page:
+
+ Since the odds are not great for finding a set of words, for every
+ output line, which fit nicely on a line without inserting excessive
+ amounts of space between words, `gtroff' hyphenates words so that it
+ can justify lines without inserting too much space between words.
+
+ The problem is that groff can end up hyphenating a lot of things that you
+ don't want hyphenated (variable names and command names, for example).
+ Keeping both justification and hyphenation disabled ensures that hyphens
+ won't get inserted where you don't want to them, and you don't end up with
+ lines containing excessive amounts of space between words. These default
+ settings run counter to how most existing man pages are formatted. But
+ there are some notable exceptions, such as the perl man pages.
+
+ â— Added parameters for controlling hyphenation of computer inlines,
+ filenames, and URLs. By default, even when hyphenation is enabled
+ (globally), hyphenation is now suppressed for "computer inlines"
+ (currently, just classname, constant, envar, errorcode, option, replaceable
+ , userinput, type, and varname, and for filenames, and for URLs from link.
+ It can be (re)enabled using the man.hyphenate.computer.inlines,
+ man.hyphenate.filenames, and man.hyphenate.urls parameters.
+
+ â— Implemented a new system for replacing Unicode characters. There are two
+ parts to the new system: a “string substitution map†for doing “essentialâ€
+ replacements, and a “character map†that can optionally be disabled and
+ enabled.
+
+ The new system fixes all open bugs that had to do with literal Unicode
+ numbered entities such as &#8220; and &#8221; showing up in output, and
+ greatly expands the ability of the stylesheets to generate “good†roff
+ equivalents for Unicode symbols and special characters.
+
+ Here are some details...
+
+ The previous manpages mechanism for replacing Unicode symbols and special
+ characters with roff equivalents (the replace-entities template) was not
+ scalable and not complete. The mechanism handled a somewhat arbitrary
+ selection of less than 20 or so Unicode characters. But there are
+ potentially more than 800 Unicode special characters that have some groff
+ equivalent they can be mapped to. And there are about 34 symbols in the
+ Latin-1 (ISO-8859-1) block alone. Users might reasonably expect that if
+ they include any of those Latin-1 characters in their DocBook source
+ documents, they will get correctly converted to known roff equivalents in
+ output.
+
+ In addition to those common symbols, certain users may have a need to use
+ symbols from other Unicode blocks. Say, somebody who is documenting an
+ application related to math might need to use a bunch of symbols from the
+ “Mathematical Operators†Unicode block (there are about 65 characters in
+ that block that have reasonable roff equivalents). Or somebody else might
+ really like Dingbats -- such as the checkmark character -- and so might use
+ a bunch of things from the “Dingbat†block (141 characters in that that
+ have roff equivalents or that can at least be “degraded†somewhat
+ gracefully into roff).
+
+ So, the old replace-entities mechanism was replaced with a completely
+ different mechanism that is based on use of two “mapsâ€: a “substitution
+ map†and a “character map†(the latter in a format compliant with the XSLT
+ 2.0 spec and therefore completely “forward compatible†with XSLT 2.0).
+
+ The substitution map is controlled through the man.string.subst.map
+ parameter, and is used to replace things like the backslash character
+ (which needs special handling to prevent it from being interpreted as a
+ roff escape). The substitution map cannot be disabled, because disabling it
+ will cause the output to be broken. However, you can add to it and change
+ it if needed.
+
+ The “character map†mechanism, on the other hand, can be completely
+ disabled. It is enabled by default, and, by default, does replacement of
+ all Latin-1 symbols, along with most special spaces, dashes, and quotes
+ (about 75 characters by default). Also, you can optionally enable a “fullâ€
+ character map that provides support for converting all 800 or so of the
+ characters that have some reasonable groff equivalent.
+
+ The character-map mechanism is controlled through the following parameters:
+
+ man.charmap.enabled
+
+ turns character-map support on/off
+
+ man.charmap.use.subset
+
+ specifies that a subset of the character map is used instead of the
+ full map
+
+ man.charmap.subset.profile
+
+ specifies profile of character-map subset
+
+ man.charmap.uri
+
+ specifies an alternate character map to use instead of the “standardâ€
+ character map provided in the distribution
+
+ â— Implemented out-of-line handling of display of URLs for links (currently,
+ only for ulink). This gives you three choices for handling of links:
+
+ 1. Number and list links. Each link is numbered inline, with a number in
+ square brackets preceding the link contents, and a numbered list of all
+ links is added to the end of the document.
+
+ 2. Only list links. Links are not numbered, but an (unnumbered) list of
+ links is added to the end of the document.
+
+ 3. Suppress links. Don't number links and don't add any list of links to
+ the end of the document.
+
+ You can also choose whether links should be underlined. The default is “the
+ works†-- list, number, and underline links. You can use the
+ man.links.list.enabled, man.links.are.numbered, and
+ man.links.are.underlined parameters to change the defaults. The default
+ heading for the link list is REFERENCES. You can be change that using the
+ man.links.list.heading parameter.
+
+ â— Changed default output encoding to UTF-8. This does not mean that man pages
+ are output in raw UTF-8, because the character map is applied before final
+ output, causing all UTF-8 characters covered in the map to be converted to
+ roff equivalents.
+
+ â— Added support for processing refsect3 and formalpara and nested refsection
+ elements, down to any arbitrary level of nesting.
+
+ â— Output of the NAME and SYNOPSIS and AUTHOR headings and the headings for
+ admonitions (note, caution, etc.) are no longer hard-coded for English.
+ Instead, headings are generated for those in the correct locale (just as
+ the FO and HTML stylesheets do).
+
+ â— Re-worked mechanism for assembling page headers/footers (the contents of
+ the .TH macro “title lineâ€).
+
+ Here are some details...
+
+ All man pages contain a .TH roff macro whose contents are used for
+ rendering the “title line†displayed in the header and footer of each page.
+ Here are a couple of examples of real-world man pages that have useful page
+ headers/footers:
+
+ gtk-options(7) GTK+ User's Manual gtk-options(7) <-- header
+ GTK+ 1.2 2003-10-20 gtk-options(7) <-- footer
+
+ svgalib(7) Svgalib User Manual svgalib(7) <-- header
+ Svgalib 1.4.1 16 December 1999 svgalib(7) <-- footer
+
+ And here are the terms with which the groff_man(7) man page refers to the
+ various parts of the header/footer:
+
+ title(section) extra3 title(section) <- header
+ extra2 extra1 title(section) <- footer
+
+ Or, using the names with which the man(7) man page refers to those same
+ fields:
+
+ title(section) manual title(section) <- page header
+ source date title(section) <- page footer
+
+ The easiest way to control the contents of those fields is to mark up your
+ refentry content like the following (note that this is a “minimalâ€
+ example).
+
+ <refentry>
+ <info>
+ <date>2003-10-20</date> 1
+ </info>
+ <refmeta>
+ <refentrytitle>gtk-options</refentrytitle> 2
+ <manvolnum>7</manvolnum> 3
+ <refmiscinfo class="source-name">GTK+</refmiscinfo> 4
+ <refmiscinfo class="version">1.2</refmiscinfo> 5
+ <refmiscinfo class="manual">GTK+ User's Manual</refmiscinfo> 6
+ </refmeta>
+ <refnamediv>
+ <refname>gtk-options</refname>
+ <refpurpose>Standard Command Line Options for GTK+ Programs</refpurpose>
+ </refnamediv>
+ <refsect1>
+ <title>Description</title>
+ <para>This manual page describes the command line options, which
+ are common to all GTK+ based applications.</para>
+ </refsect1>
+ </refentry>
+
+ 1 Sets the “date†part of the header/footer.
+
+ 2 Sets the “title†part.
+
+ 3 Sets the “section†part.
+
+ 4 Sets the “source name†part.
+
+ 5 Sets the “version†part.
+
+ 6 Sets the “manual†part.
+
+ Below are explanations of the steps the stylesheets take to attempt to
+ assemble and display “good†headers and footer. [In the descriptions, note
+ that *info is the refentry “info†child (whatever its name), and parentinfo
+ is the “info†child of its parent (again, whatever its name).]
+
+ extra1 field (date)
+
+ Content of the “extra1†field is what shows up in the center footer
+ position of each page. The man(7) man page describes it as “the date of
+ the last revisionâ€.
+
+ To provide this content, if the refentry.date.profile.enabled is
+ non-zero, the stylesheets check the value of refentry.date.profile.
+
+ Otherwise, by default, they check for a date or pubdate not only in the
+ *info contents, but also in the parentinfo contents.
+
+ If a date cannot be found, the stylesheets now automatically generate a
+ localized “long format†date, ensuring that this field always has
+ content in output.
+
+ However, if for some reason you want to suppress this field, you can do
+ so by setting a non-zero value for man.th.extra1.suppress.
+
+ extra2 field (source)
+
+ On Linux systems and on systems with a modern groff, the content of the
+ “extra2†field are what shows up in the left footer position of each
+ page.
+
+ The man(7) man page describes this as “the source of the commandâ€, and
+ provides the following examples:
+
+ â—‹ For binaries, use somwething like: GNU, NET-2, SLS Distribution,
+ MCC Distribution.
+
+ â—‹ For system calls, use the version of the kernel that you are
+ currently looking at: Linux 0.99.11.
+
+ â—‹ For library calls, use the source of the function: GNU, BSD 4.3,
+ Linux DLL 4.4.1.
+
+ In practice, there are many pages that simply have a version number in
+ the “source†field. So, it looks like what we have is a two-part field,
+ Name Version, where:
+
+ Name
+
+ product name (e.g., BSD) or org. name (e.g., GNU)
+
+ Version
+
+ version name
+
+ Each part is optional. If the Name is a product name, then the Version
+ is probably the version of the product. Or there may be no Name, in
+ which case, if there is a Version, it is probably the version of the
+ item itself, not the product it is part of. Or, if the Name is an
+ organization name, then there probably will be no Version.
+
+ To provide this content, if the refentry.source.name.profile.enabled
+ and refentry.version.profile.enabled parameter are non-zero, the
+ stylesheets check the value of refentry.source.name.profile
+ refentry.version.profile.
+
+ Otherwise, by default, they check the following places, in the
+ following order:
+
+ 1. *info/productnumber
+
+ 2. *info/productnumber
+
+ 3. refmeta/refmiscinfo[@class = 'version']
+
+ 4. parentinfo/productnumber
+
+ 5. *info/productname
+
+ 6. parentinfo/productname
+
+ 7. refmeta/refmiscinfo
+
+ 8. [nothing found, so leave it empty]
+
+ extra3 field
+
+ On Linux systems and on systems with a modern groff, the content of the
+ “extra3†field are what shows up in the center header position of each
+ page. Some man pages have “extra2†content, some don't. If a particular
+ man page has it, it is most often “context†data about some larger
+ system the documented item belongs to (for example, the name or
+ description of a group of related applications). The stylesheets now
+ check the following places, in the following order, to look for content
+ to add to the “extra3†field.
+
+ 1. parentinfo/title
+
+ 2. parent's title
+
+ 3. refmeta/refmiscinfo
+
+ 4. [nothing found, so leave it empty]
+
+ â— Reworked *info gathering. For each refentry found, the stylesheets now
+ cache its *info content, then check for any valid parent of it that might
+ have metainfo content and cache that, if found; they then then do all
+ further matches against those node-sets (rather than re-selecting the
+ original *info nodes each time they are needed).
+
+ â— New option for breaking strings after forward slashes. This enables long
+ URLs and pathnames to be broken across lines. Controlled through
+ man.break.after.slash parameter.
+
+ â— Output for servicemark and trademark are now (SM) and (TM). There is a
+ groff "\(tm" escape, but output from that is not acceptable.
+
+ â— New option for controlling the length of the title part of the .TH title
+ line. Controlled through the man.th.title.max.length parameter.
+
+ â— New option for specifying output encoding of each man page; controlled with
+ man.output.encoding (similar to the HTML chunker.output.encoding
+ parameter).
+
+ â— New option for suppressing filename messages when generating output;
+ controlled with man.output.quietly (similar to the HTML chunk.quietly
+ parameter).
+
+ â— The text of cross-references to first-level refentry (refsect1, top-level
+ refsection, refnamediv, and refsynopsisdiv) are now capitalized.
+
+ â— Cross-references to refnamediv now use the localized NAME title instead of
+ using the first refname child. This makes the output inconsistent with HTML
+ and FO output, but for man-page output, it seems to make better sense to
+ have the NAME. (It may actually make better sense to do it that way in HTML
+ and FO output as well...)
+
+ â— Added support for processing funcparams.
+
+ â— Removed the space that was being output between funcdef and paramdef;
+ example: was: float rand (void); now: float rand(void)
+
+ â— Turned off bold formatting for the type element when it occurs within a
+ funcdef or paramdef
+
+ ◠Corrected rendering of simplelist. Any <simplelist type="inline" instance
+ is now rendered as a comma-separated list (also with an optional localized
+ “and†or “or†before the last item -- see description elsewhere in these
+ release notes). Any simplelist instance whose type is not inline is
+ rendered as a one-column vertical list (ignoring the values of the type and
+ columns attributes if present)
+
+ â— Comment added at top of roff source for each page now includes DocBook XSL
+ stylesheets version number (as in the HTML stylesheets)
+
+ ◠Made change to prevent “sticky†fonts changes. Now, when the manpages
+ stylesheets encounter node sets that need to be boldfaced or italicized,
+ they put the \fBfoo\fR and \fIbar\fR groff bold/italic instructions
+ separately around each node in the set.
+
+ â— synop.xsl: Boldface everything in funcsynopsis output except parameters
+ (which are in ital). The man(7) man page says:
+
+ For functions, the arguments are always specified using italics, even
+ in the SYNOPSIS section, where the rest of the function is specified in
+ bold.
+
+ A look through the contents of the man/man2 directory shows that most (all)
+ existing pages do follow this “everything in funcsynopsis bold†rule. That
+ means the type content and any punctuation (parens, semicolons, varargs)
+ also must be bolded.
+
+ â— Removed code for adding backslashes before periods/dots in roff source,
+ because backslashes in front of periods/dots in roff source are needed only
+ in the very rare case where a period is the very first character in a line,
+ without any space in front of it. A better way to deal with that rare case
+ is for you to add a zero-width space in front of the offending dot(s) in
+ your source
+
+ â— Removed special handling of the quote element. That was hard-coded to cause
+ anything marked up with the quote element to be output preceded by two
+ backticks and followed by two apostrophes -- that is, that old-school
+ kludge for generating “curly†quotes in Emacs and in X-Windows fonts. While
+ Emacs still seems to support that, I don't think X-Windows has for a long
+ time now. And, anyway, it looks (and has always looked) like crap when
+ viewed on a normal tty/console. In addition, it breaks localiztion of quote
+ . By default, quote content is output with localized quotation marks,
+ which, depending on the locale, may or may not be left and right double
+ quotation marks.
+
+ â— Changed mappings for left and right single quotation marks. Those had
+ previously been incorrectly mapped to the backtick (&#96;) and apostrophe
+ (&39;) characters (for kludgy reasons -- see above). They are now correctly
+ mapped to the \(oq and \(cq roff escapes. If you want the old (broken)
+ behavior, you need to manually change the mappings for those in the value
+ of the man.string.subst.map parameter.
+
+ â— Removed xref.xsl file. Now, of the various cross-reference elements, only
+ the ulink element is handled differently; the rest are handled exactly as
+ the HTML stylesheets handle them, except that no hypertext links are
+ generated. (Because there is no equivalent hypertext mechanism is man
+ pages.)
+
+ ◠New option for making “subheading dividers†in generated roff source. The
+ dividers are not visible in the rendered man page; they are just there to
+ make the source readable. Controlled using man.subheading.divider.
+
+ â— Fixed many places where too much space was being added between lines.
+
+Release 1.68.1
+
+The release adds localization support for Farsi (thanks to Sina Heshmati) and
+improved support for the XLink-based DocBook NG db:link element. Other than
+that, it is a minor bug-fix update to the 1.68.0 release. The main thing it
+fixes is a build error that caused the XSLT Java extensions to be jarred up
+with the wrong package structure. Thanks to Jens Stavnstrup for quickly
+reporting the problem, and to Mauritz Jeanson for investigating and finding the
+cause.
+
+Release 1.68.0
+
+This release includes some features changes, particularly for FO/PDF output,
+and a number of bug fixes.
+
+FO
+
+ â— Moved footnote properties to attribute-sets.
+
+ â— Added support for side floats, margin notes, and custom floats.
+
+ â— Added new parameters body.start.indent and body.end.indent to the
+ set.flow.properties template.
+
+ â— Added support for xml:id
+
+ â— Added support for refdescriptor.
+
+ â— Added support for multiple refnamedivs.
+
+ â— Added index.entry.properties attribute-set to support customization of
+ index entries.
+
+ â— Added set.flow.properties template call to each fo:flow to support
+ customizations entry point.
+
+ â— Add support for @floatstyle in figure
+
+ â— Moved hardcoded properties for index division titles to the
+ index.div.title.properties attribute-set.
+
+ â— Added support for table-layout="auto" for XEP.
+
+ â— Added index.div.title.properties attribute-set.
+
+ â— $verbose parameter is now passed to most elements.
+
+ â— Added refentry to toc in part, as it is permitted by the DocBook schema/
+ DTD.
+
+ â— Added backmatter elements and article to toc in part, since they are
+ permitted by the DocBook schema/DTD.
+
+ â— Added mode="toc" for simplesect, since it is now permitted in the toc if
+ simplesect.in.toc is set.
+
+ â— Moved hard-coded properties to nongraphical.admonintion.properties and
+ graphical.admonition.properties attribute sets.
+
+ â— Added support for sidebar-width and float-type processing instructions in
+ sidebar.
+
+ â— For tables with HTML markup elements, added support for dbfo bgcolor PI,
+ the attribute-sets named table.properties, informaltable.properties,
+ table.table.properties, and table.cell.padding. Also added support for the
+ templates named table.cell.properties and table.cell.block.properties so
+ that tabstyles can be implemented. Also added support for tables containing
+ only tr instead of tbody with tr.
+
+ â— Added new paramater hyphenate.verbatim.characters which can specify
+ characters after which a line break can occur in verbatim environments.
+ This parameter can be used to extend the initial set of characters which
+ contain only space and non-breakable space.
+
+ â— Added itemizedlist.label.markup to enable selection of different bullet
+ symbol. Also added several potential bullet characters, commented out by
+ default.
+
+ â— Enabled all id's in XEP output for external olinking.
+
+HTML
+
+ â— Added support for refdescriptor.
+
+ â— Added support for multiple refnamedivs.
+
+ â— Added support for xml:id
+
+ â— refsynopsisdiv as a section for counting section levels
+
+Images
+
+ â— Added new SVG admonition graphics and navigation images.
+
+Release 1.67.2
+
+This release fixes a table bug introduced in the 1.67.1 release.
+
+Release 1.67.1
+
+This release includes a number of bug fixes.
+
+The following lists provide details about API and feature changes.
+
+FO
+
+ â— Tables: Inherited cell properties are now passed to the
+ table.cell.properties template so they can be overridden by a
+ customization.
+
+ â— Tables: Added support for bgcolor PI on table row element.
+
+ â— TOCs: Added new parameter simplesect.in.toc; default value of 0 causes
+ simplesect to be omitted from TOCs; to cause simplesect to be included in
+ TOCs, you must set the value of simplesect.in.toc to 1.Comment from Norm:
+
+ Simplesect elements aren't supposed to appear in the ToC at all... The
+ use case for simplesect is when, for example, every chapter in a book
+ ends with "Exercises" or "For More Information" sections and you don't
+ want those to appear in the ToC.
+
+ â— Sections: Reverted change that caused a variable reference to be used in a
+ template match and rewrote code to preserve intended semantics.
+
+ â— Lists: Added workaround to prevent "* 0.60 + 1em" garbage in list output
+ from PassiveTeX
+
+ â— Moved the literal attributes from component.title to the
+ component.title.properties attribute-set so they can be customized.
+
+ â— Lists: Added glossdef's first para to special handling in
+ fo:list-item-body.
+
+HTML
+
+ â— TOCs: Added new parameter simplesect.in.toc; for details, see the list of
+ FO changes for this release.
+
+ â— Indexing: Added new parameter index.prefer.titleabbrev; when set to 1,
+ index references will use titleabbrev instead of title when available.
+
+HTML Help
+
+ â— Added support for generating windows-1252-encoded output using Saxon; for
+ more details, see the list of XSL Java extensions changes for this release.
+
+man pages
+
+ â— Replaced named/numeric character-entity references for non-breaking space
+ with groff equivalent (backslash-tilde).
+
+XSL Java extensions
+
+ â— Saxon extensions: Added the Windows1252 class. It extends Saxon 6.5.x with
+ the windows-1252 character set, which is particularly useful when
+ generating HTML Help for Western European Languages (code from Pontus
+ Haglund and contributed to the DocBook community by Sectra AB, Sweden).
+
+ To use:
+
+ 1. Make sure that the Saxon 6.5.x jar file and the jar file for the
+ DocBook XSL Java extensions are in your CLASSPATH
+
+ 2. Create a DocBook XSL customization layer -- a file named
+ mystylesheet.xsl or whatever -- that, at a minimum, contains the
+ following:
+
+ <xsl:stylesheet
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version='1.0'>
+ <xsl:import href="http://docbook.sourceforge.net/release/xsl/current/htmlhelp/htmlhelp.xsl"/>
+ <xsl:output method="html" encoding="WINDOWS-1252" indent="no"/>
+ <xsl:param name="htmlhelp.encoding" select="'WINDOWS-1252'"></xsl:param>
+ <xsl:param name="chunker.output.encoding" select="'WINDOWS-1252'"></xsl:param>
+ <xsl:param name="saxon.character.representation" select="'native'"></xsl:param>
+ </xsl:stylesheet>
+
+ Invoke Saxon with the encoding.windows-1252 Java system property set to
+ com.nwalsh.saxon.Windows1252; for example
+
+ java \
+ -Dencoding.windows-1252=com.nwalsh.saxon.Windows1252 \
+ com.icl.saxon.StyleSheet \
+ mydoc.xml mystylesheet.xsl
+
+ Or, for a more complete "real world" case showing other options you'll
+ typically want to use:
+
+ java \
+ -Dencoding.windows-1252=com.nwalsh.saxon.Windows1252 \
+ -Djavax.xml.parsers.DocumentBuilderFactory=org.apache.xerces.jaxp.DocumentBuilderFactoryImpl \
+ -Djavax.xml.parsers.SAXParserFactory=org.apache.xerces.jaxp.SAXParserFactoryImpl \
+ -Djavax.xml.transform.TransformerFactory=com.icl.saxon.TransformerFactoryImpl \
+ com.icl.saxon.StyleSheet \
+ -x org.apache.xml.resolver.tools.ResolvingXMLReader \
+ -y org.apache.xml.resolver.tools.ResolvingXMLReader \
+ -r org.apache.xml.resolver.tools.CatalogResolver \
+ mydoc.xml mystylesheet.xsl
+
+ In both cases, the "mystylesheet.xsl" file should be a DocBook
+ customization layer containing the parameters show in step 2.
+
+ â— Saxon extensions: Removed Saxon 8 extensions from release package
+
+Release 1.67.0
+
+ â— A number of important bug fixes.
+
+ â— Added Saxon8 extensions
+
+ â— Enabled dbfo table-width on entrytbl in FO output
+
+ â— Added support for role=strong on emphasis in FO output
+
+ â— Added new FO parameter hyphenate.verbatim that can be used to turn on
+ "intelligent" wrapping of verbatim environments.
+
+ â— Replaced all <tt></tt> output with <code></code>
+
+ â— Changed admon.graphic.width template to a mode so that different
+ admonitions can have different graphical widths.
+
+ â— Deprecated the HTML shade.verbatim parameter (use CSS instead)
+
+ â— Wrapped ToC refentrytitle/refname and refpurpose in span with class values.
+ This makes it possible to style them using a CSS stylesheet.
+
+ â— Use strong/em instead of b/i in HTML output
+
+ â— Added support for converting Emphasis to groff italic and Emphasis role=
+ 'bold' to bold. Controlled by emphasis.propagates.style param, but not
+ documented yet using litprog system. Will do that next (planning to add
+ some other parameter-controllable options for hyphenation and handling of
+ line spacing).
+
+ â— callout.graphics.number.limit.xml param: Changed the default from 10 to 15.
+
+ â— verbatim.properties: Added hyphenate=false
+
+ â— Saxon and Xalan Text.java extensions: Added support for URIResolver() on
+ insertfile href's
+
+ â— Added generated RELEASE-NOTES.txt file.
+
+ â— Added INSTALL file (executable file for generating catalog.xml)
+
+ â— Removed obsolete tools directory from package
+
+Release 1.66.1
+
+ â— A number of important bug fixes.
+
+ â— Now xml:base attributes that are generated by an XInclude processor are
+ resolved for image files.
+
+ â— Rewrote olink templates to support several new features.
+
+ â—‹ Extended full olink support to FO output.
+
+ â—‹ Add support for xrefstyle attribute in olinks.
+
+ â—‹ New parameters to support new olink features: insert.olink.page.number,
+ insert.olink.pdf.frag, olink.debug, olink.lang.fallback.sequence,
+ olink.properties, prefer.internal.olink. See the reference page for
+ each parameter for more information.
+
+ â— Added index.on.type parameter for new type attribute introduced in DocBook
+ 4.3 for indexterms and index. This allows you to create multiple indices
+ containing different categories of entries. For users of 4.2 and earlier,
+ you can use the new parameter index.on.role instead.
+
+ â— Added new section.autolabel.max.depth parameter to turn off section
+ numbering below a certain depth. This permits you to number major section
+ levels and leave minor section levels unnumbered.
+
+ â— Added footnote.sep.leader.properties attribute set to format the line
+ separating footnotes in printed output.
+
+ â— Added parameter img.src.path as a prefix to HTML img src attributes. The
+ prefix is added to whatever path is already generated by the stylesheet for
+ each image file.
+
+ â— Added new attribute-sets informalequation.properties,
+ informalexample.properties, informalfigure.properties, and
+ informaltable.properties, so each such element type can be formatted
+ individually if needed.
+
+ â— Add component.label.includes.part.label parameter to add any part number to
+ chapter, appendix and other component labels when the label.from.part
+ parameter is nonzero. This permits you to distinguish multiple chapters
+ with the same chapter number in cross references and the TOC.
+
+ â— Added chunk.separate.lots parameter for HTML output. This parameter lets
+ you generate separate chunk files for each LOT (list of tables, list of
+ figures, etc.).
+
+ â— Added several table features:
+
+ â—‹ Added table.table.properties attribute set to add properties to the
+ fo:table element.
+
+ â—‹ Added placeholder templates named table.cell.properties and
+ table.cell.block.properties to enable adding properties to any
+ fo:table-cell or the cell's fo:block, respectively. These templates are
+ a start for implementing table styles.
+
+ â— Added new attribute set component.title.properties for easy modifications
+ of component's title formatting in FO output.
+
+ â— Added Saxon support for an encoding attribute on the textdata element.
+ Added new parameter textdata.default.encoding which specifies encoding when
+ encoding attribute on textdata is missing.
+
+ â— Template label.this.section now controls whole section label, not only
+ sub-label which corresponds to particular label. Former behaviour was IMHO
+ bug as it was not usable.
+
+ â— Formatting in titleabbrev for TOC and headers is preserved when there are
+ no hotlink elements in the title. Formerly the title showed only the text
+ of the title, no font changes or other markup.
+
+ â— Added intial.page.number template to set the initial-page-number property
+ for page sequences in print output. Customizing this template lets you
+ change when page numbering restarts. This is similar to the
+ format.page.number template that lets you change how the page number
+ formatting changes in the output.
+
+ â— Added force.page.count template to set the force-page-count property for
+ page sequences in print output. This is similar to the format.page.number
+ template.
+
+ â— Sort language for localized index sorting in autoidx-ng.xsl is now taken
+ from document lang, not from system environment.
+
+ â— Numbering and formatting of normal and ulink footnotes (if turned on) has
+ been unified. Now ulink footnotes are mixed in with any other footnotes.
+
+ â— Added support for renderas attribute in section and sect1 et al. This
+ permits you to render a given section title as if it were a different
+ level.
+
+ â— Added support for label attribute in footnote to manually supply the
+ footnote mark.
+
+ â— Added support for DocBook 4.3 corpcredit element.
+
+ â— Added support for a dbfo keep-together PI for formal objects (table,
+ figure, example, equation, programlisting). That permits a formal object to
+ be kept together if it is not already, or to be broken if it is very long
+ and the default keep-together is not appropriate.
+
+ â— For graphics files, made file extension matching case insensitive, and
+ updated the list of graphics extensions.
+
+ â— Allow calloutlist to have block content before the first callout
+
+ â— Added dbfo-need processing instruction to provide soft page breaks.
+
+ â— Added implementation of existing but unused default.image.width parameter
+ for graphics.
+
+ â— Support DocBook NG tag inline element.
+
+ â— It appears that XEP now supports Unicode characters in bookmarks. There is
+ no further need to strip accents from characters.
+
+ â— Make segmentedlist HTML markup more semantic and available to CSS styles.
+
+ â— Added user.preroot placeholder template to permit xsl-stylesheet and other
+ PIs and comments to be output before the HTML root element.
+
+ â— Non-chunked legalnotice now gets an <a name="id"> element in HTML output so
+ it can be referenced with xref or link.
+
+ â— In chunked HTML output, changed link rel="home" to rel="start", and link
+ rel="previous" to rel="prev", per W3C HTML 4.01 spec.
+
+ â— Added several patches to htmlhelp from W. Borgert
+
+ â— Added Bosnian locale file as common/bs.xml.
+
+Release 1.65.0
+
+ â— A number of important bug fixes.
+
+ â— Added a workaround to allow these stylesheets to process DocBook NG
+ documents. (It’s a hack that pre-processes the document to strip off the
+ namespace and then uses exsl:node-set to process the result.)
+
+ â— Added alternative indexing mechanism which has better internationalization
+ support. New indexing method allows grouping of accented letters like e, é,
+ ë into the same group under letter "e". It can also treat special letters
+ (e.g. "ch") as one character and place them in the correct position (e.g.
+ between "h" and "i" in Czech language).
+
+ In order to use this mechanism you must create customization layer which
+ imports some base stylesheet (like fo/docbook.xsl, html/chunk.xsl) and then
+ includes appropriate stylesheet with new indexing code (fo/autoidx-ng.xsl
+ or html/autoidx-ng.xsl). For example:
+
+ <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="1.0">
+
+ <xsl:import href="http://docbook.sourceforge.net/release/xsl/current/fo/docbook.xsl"/>
+ <xsl:include href="http://docbook.sourceforge.net/release/xsl/current/fo/autoidx-ng.xsl"/>
+
+ </xsl:stylesheet>
+
+ New method is known to work with Saxon and it should also work with
+ xsltproc 1.1.1 and later. Currently supported languages are English, Czech,
+ German, French, Spanish and Danish.
+
+Release 1.64.1
+
+General bug fixes and improvements. Sorry about the failure to produce an
+updated release notes file for 1.62.0—1.63.2
+
+ â— In the course of fixing bug #849787, wrapping Unicode callouts with an
+ appropriate font change in the Xalan extensions, I discovered that the
+ Xalan APIs have changed a bit. So xalan2.jar will work with older Xalan 2
+ implementations, xalan25.jar works with Xalan 2.5.
+
+Release 1.61.0
+
+Lots of bug fixes and improvements.
+
+ â— Initial support for timestamp PI. From now you can use <?dbtimestamp format
+ ="Y-m-d H:M:S"?> to get current datetime in your document. Added
+ localization support for datetime PI
+
+ â— Added level 6 to test for section depth in section.level template so that
+ section.title.level6.properties will be used for sections that are 6 deep
+ or deeper. This should also cause a h6 to be created in html output.
+
+ â— Don't use SVG graphics if use.svg=0
+
+ â— Now uses number-and-title-template for sections only if section.autolabel
+ is not zero.
+
+ â— Added missing 'english-language-name' attribute to the l10n element, and
+ the missing 'style' attribute to the template element so the current
+ gentext documents will validate.
+
+ â— Corrected several references to parameter qanda.defaultlabel that were
+ missing the "$".
+
+ â— Now accepts admon.textlabel parameter to turn off Note, Warning, etc.
+ label.
+
+ â— FeatReq #684561: support more XEP metadata
+
+ â— Added hyphenation support. Added support for coref. Added beginpage
+ support. (does nothing; see TDG).
+
+ â— Added support for hyphenation-character, hyphenation-push-character-count,
+ and hyphenation-remain-character-count
+
+ â— Added root.properties, ebnf.assignment, and ebnf.statement.terminator
+
+ â— Support bgcolor PI in table cells; make sure rowsep and colsep don't have
+ any effect on the last row or column
+
+ â— Handle othercredit on titlepage a little better
+
+ â— Applied fix from Jeff Beal that fixed the bug that put secondary page
+ numbers on primary entries. Same with tertiary page numbers on secondary
+ entries.
+
+ â— Added definition of missing variable collection.
+
+ â— Make footnote formatting 'normal' even when it occurs in a context that has
+ special formatting
+
+ â— Added warning when glossary.collection is not blank, but it cannot open the
+ specified file.
+
+ â— Pick up the frame attribute on table and informaltable.
+
+ â— indexdiv/title in non-autogenerated indexes are now picked up.
+
+ â— Removed (unused) component.title.properties
+
+ â— Move IDs from page-sequences down to titlepage blocks
+
+ â— Use proportional-column-width(1) on more tables.
+
+ Use proportional-column-width() for header/footer tables; suppress
+ relative-align when when using FOP
+
+ â— Check for glossterm.auto.link when linking firstterms; don't output gl.
+ prefix on glossterm links
+
+ â— Generate Part ToCs
+
+ â— Support glossary, bibliography, and index in component ToCs.
+
+ â— Refactored chunking code so that customization of chunk algorithm and chunk
+ elements is more practical
+
+ â— Support textobject/phrase on inlinemediaobject.
+
+ â— Support 'start' PI on ordered lists
+
+ â— Fixed test of $toc PI to turn on qandaset TOC.
+
+ â— Added process.chunk.footnotes to sect2 through 5 to fix bug of missing
+ footnotes when chunk level greater than 1.
+
+ â— Added paramater toc.max.depth which controls maximal depth of ToC as
+ requested by PHP-DOC group.
+
+ â— Exempted titleabbrev from preamble processing in lists, and fixed
+ variablelist preamble code to use the same syntax as the other lists.
+
+ â— Added support for elements between variablelist and first varlistentry
+ since DocBook 4.2 supports that now.
+
+Release 1.60.1
+
+Lots of bug fixes.
+
+ â— The format of the titlepage.templates.xml files and the stylesheet that
+ transforms them have been significantly changed. All of the attributes used
+ to control the templates are now namespace qualified. So what used to be:
+
+ <t:titlepage element="article" wrapper="fo:block">
+
+ is now:
+
+ <t:titlepage t:element="article" t:wrapper="fo:block">
+
+ Attributes from other namespaces (including those that are unqualified) are
+ now copied directly through. In practice, this means that the names that
+ used to be “fo:†qualified:
+
+ <title named-template="component.title"
+ param:node="ancestor-or-self::article[1]"
+ fo:text-align="center"
+ fo:keep-with-next="always"
+ fo:font-size="&hsize5;"
+ fo:font-weight="bold"
+ fo:font-family="{$title.font.family}"/>
+
+ are now unqualified:
+
+ <title t:named-template="component.title"
+ param:node="ancestor-or-self::article[1]"
+ text-align="center"
+ keep-with-next="always"
+ font-size="&hsize5;"
+ font-weight="bold"
+ font-family="{$title.font.family}"/>
+
+ The t:titlepage and t:titlepage-content elements both generate wrappers
+ now. And unqualified attributes on those elements are passed through. This
+ means that you can now make the title font apply to ane entire titlepage
+ and make the entire “recto†titlepage centered by specifying the font and
+ alignment on the those elements:
+
+ <t:titlepage t:element="article" t:wrapper="fo:block"
+ font-family="{$title.font.family}">
+
+ <t:titlepage-content t:side="recto"
+ text-align="center">
+
+ â— Support use of titleabbrev in running headers and footers.
+
+ â— Added (experimental) xref.with.number.and.title parameter to enable number/
+ title cross references even when the default would be just the number.
+
+ â— Generate part ToCs if they're requested.
+
+ â— Use proportional-column-width() in header/footer tables.
+
+ â— Handle alignment correctly when screenshot wraps a graphic in a figure.
+
+ â— Format chapter and appendix cross references consistently.
+
+ â— Attempt to support tables with multiple tgroups in FO.
+
+ â— Output fo:table-columns in simplelist tables.
+
+ â— Use titlepage.templates.xml for indexdiv and glossdiv formatting.
+
+ â— Improve support for new bibliography elements.
+
+ â— Added footnote.number.format, table.footnote.number.format,
+ footnote.number.symbols, and table.footnote.number.symbols for better
+ control of footnote markers.
+
+ â— Added glossentry.show.acronyms.
+
+ â— Suppress the draft-mode page masters when draft-mode is “noâ€.
+
+ â— Make blank pages verso not recto. D'Oh!
+
+ â— Improved formatting of ulink footnotes.
+
+ â— Fixed bugs in graphic width/height calculations.
+
+ â— Added class attributes to inline elements.
+
+ ◠Don't add “.html†to the filenames identified with the “dbhtml†PI.
+
+ â— Don't force a ToC when sections contain refentrys.
+
+ â— Make section title sizes a function of the body.master.size.
+
+Release 1.59.2
+
+The 1.59.2 fixes an FO bug in the page masters that causes FOP to fail.
+
+ â— Removed the region-name from the region-body of blank pages. There's no
+ reason to give the body of blank pages a unique name and doing so causes a
+ mismatch that FOP detects.
+
+ â— Output IDs for the first paragraphs in listitems.
+
+ â— Fixed some small bugs in the handling of page numbers in double-sided mode.
+
+ â— Attempt to prevent duplicated IDs from being produced when endterm on xref
+ points to something with nested structure.
+
+ â— Fix aligment problems in equations.
+
+ â— Output the type attribute on unordered lists (UL) in HTML only if the
+ css.decoration parameter is true.
+
+ â— Calculate the font size in formal.title.properties so that it's 1.2 times
+ the base font size, not a fixed "12pt".
+
+Release 1.59.1
+
+The 1.59.1 fixes a few bugs.
+
+ â— Added Bulgarian localization.
+
+ â— Indexing improvements; localize book indexes to books but allow setindex to
+ index an entire set.
+
+ â— The default value for rowsep and colsep is now "1" as per CALS.
+
+ â— Added support for titleabbrev (use them for cross references).
+
+ â— Improvements to mediaobject for selecting print vs. online images.
+
+ â— Added seperate property sets for figures, examples, equations, tabless, and
+ procedures.
+
+ â— Make lineannotations italic.
+
+ â— Support xrefstyle attribute.
+
+ â— Make endterm on xref higher priority than xreflabel target.
+
+ â— Glossary formatting improvements.
+
+Release 1.58.0
+
+The 1.58.0 adds some initial support for extensions in xsltproc, adds a few
+features, and fixes bugs.
+
+ â— This release contains the first attempt at extension support for xsltproc.
+ The only extension available to date is the one that adjusts table column
+ widths. Run extensions/xsltproc/python/xslt.py.
+
+ â— Fixed bugs in calculation of adjusted column widths to correct for rounding
+ errors.
+
+ â— Support nested refsection elements correctly.
+
+ â— Reworked gentext.template to take context into consideration. The name of
+ elements in localization files is now an xpath-like context list, not just
+ a simple name.
+
+ â— Made some improvements to bibliography formatting.
+
+ â— Improved graphical formatting of admonitions.
+
+ â— Added support for entrytbl.
+
+ â— Support spanning index terms.
+
+ â— Support bibliosource.
+
+Release 1.57.0
+
+ â— The 1.57.0 release wasn't documented here. Oops.
+
+Release 1.56.0
+
+The 1.56.0 release fixes bugs.
+
+ â— Reworked chunking. This will break all existing customizations layers that
+ change the chunking algorithm. If you're customizing chunking, look at the
+ new “content†parameter that's passed to process-chunk-element and friends.
+
+ â— Support continued and inherited numeration in orderedlist formatting for
+ FOs.
+
+ â— Added Thai localization.
+
+ â— Tweaked stylesheet documentation stylesheets to link to TDG and the
+ parameter references.
+
+ â— Allow title on tables of contents ("Table of Contents") to be optional.
+ Added new keyword to generate.toc. Support tables of contents on sections.
+
+ â— Made separate parameters for table borders and table cell borders:
+ table.frame.border.color, table.frame.border.style,
+ table.frame.border.thickness, table.cell.border.color,
+ table.cell.border.style, and table.cell.border.thickness.
+
+ ◠Suppress formatting of “endofrange†indexterms. This is only half-right.
+ They should generate a range, but I haven't figured out how to do that yet.
+
+ â— Support revdescription. (Bug #582192)
+
+ â— Added default.float.class and fixed figure floats. (Bug #497603)
+
+ â— Fixed formatting of sbr in FOs.
+
+ ◠Added context to the “missing template†error message.
+
+ â— Process arg correctly in a group. (Bug #605150)
+
+ â— Removed 'keep-with-next' from formal.title.properties attribute set now
+ that the stylesheets support the option of putting such titles below the
+ object. Now the $placement value determines if 'keep-with-next' or
+ 'keep-with-previous' is used in the title block.
+
+ ◠Wrap “url()†around external-destinations when appropriate.
+
+ â— Fixed typo in compact list spacing. (Bug #615464)
+
+ â— Removed spurious hash in anchor name. (Bug #617717)
+
+ â— Address is now displayed verbatim on title pages. (Bug #618600)
+
+ â— The bridgehead.in.toc parameter is now properly supported.
+
+ â— Improved effectiveness of HTML cleanup by increasing the number of places
+ where it is used. Improve use of HTML cleanup in XHTML stylesheets.
+
+ â— Support table of contents for appendix in article. (Bug #596599)
+
+ â— Don't duplicate footnotes in bibliographys and glossarys. (Bug #583282)
+
+ â— Added default.image.width. (Bug #516859)
+
+ â— Totally reworked funcsynopsis code; it now supports a 'tabular'
+ presentation style for 'wide' prototypes; see
+ funcsynopsis.tabular.threshold. (HTML only right now, I think, FO support,
+ uh, real soon now.)
+
+ â— Reworked support for difference marking; toned down the colors a bit and
+ added a “system.head.content†template so that the diff CSS wasn't
+ overriding “user.head.contentâ€. (Bug #610660)
+
+ ◠Added call to the “*.head.content†elements when writing out long
+ description chunks.
+
+ â— Make sure legalnotice link is correct even when chunking to a different
+ base.dir.
+
+ â— Use CSS to set viewport characteristics if css.decoration is non-zero, use
+ div instead of p for making graphic a block element; make figure titles the
+ default alt text for images in a figure.
+
+ â— Added space-after to list.block.spacing.
+
+ ◠Reworked section.level template to give “correct†answer instead of being
+ off by one.
+
+ â— When processing tables, use the tabstyle attribute as the division class.
+
+ â— Fixed bug in html2xhtml.xsl that was causing the XHTML chunker to output
+ HTML instead of XHTML.
+
+Older releases
+
+To view the release notes for older releases, see http://cvs.sourceforge.net/
+viewcvs.py/docbook/xsl/RELEASE-NOTES.xml. Be aware that there were no release
+notes for releases prior to the 1.50.0 release.
+
+About dot-zero releases
+
+DocBook Project “dot zero†releases should be considered experimental and are
+always followed by stable “dot one plus†releases, usually within two or three
+weeks. Please help to ensure the stability of “dot one plus†releases by
+carefully testing each “dot zero†release and reporting back about any problems
+you find.
+
+It is not recommended that you use a “dot zero†release in a production system.
+Instead, you should wait for the “dot one†or greater versions.
+
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/RELEASE-NOTES.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/RELEASE-NOTES.xml
new file mode 100644
index 0000000..9c50d9a
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/RELEASE-NOTES.xml
@@ -0,0 +1,10327 @@
+<article xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xml:lang="en" xml:id="releasenotes"
+ version="5.0">
+
+<info>
+ <title>Release Notes for the DocBook XSL Stylesheets</title>
+ <pubdate><?dbtimestamp format="Y-m-d"?></pubdate>
+ <releaseinfo role="cvs">$Revision: 8934 $ $Date: 2010-11-01 13:03:14 -0700 (Mon, 01 Nov 2010) $</releaseinfo>
+ <!-- * <author><orgname>DocBook Project Development Team</orgname></author> -->
+<abstract>
+<para condition="dot-zero;dot-one-plus">This release-notes
+ document is available in the following formats:
+ <link
+ xlink:href="http://docbook.sourceforge.net/release/xsl/current/RELEASE-NOTES.html"
+ >HTML</link>,
+ <link
+ xlink:href="http://docbook.sourceforge.net/release/xsl/current/RELEASE-NOTES.pdf"
+ >PDF</link>,
+ <link
+ xlink:href="http://docbook.sourceforge.net/release/xsl/current/RELEASE-NOTES.txt"
+ >plain text</link>; it provides a per-release list
+of enhancements and changes to the stylesheets’ public APIs
+(user-configurable parameters) and excludes descriptions of most
+bug fixes. For a complete list of all changes (including all bug
+fixes) that have been made since the previous release, see the
+separate <link xlink:href="NEWS">NEWS</link> (plain text) or <link
+ xlink:href="NEWS.html">NEWS.html</link> files. Also available:
+An online <link
+ xlink:href="http://docbook.svn.sourceforge.net/viewvc/docbook/trunk/xsl/?view=log"
+ >hyperlinked change history</link> (warning: big file) of all
+changes made over the entire history of the codebase.</para>
+<para condition="dot-zero">As with all DocBook Project <link
+ linkend="dot0">dot-zero</link> releases, this is an
+ experimental release. It will be followed shortly by a stable
+ release.</para>
+<para condition="dot-one-plus">As with all DocBook Project “dot
+ one plus†releases, this release aspires to be stable (in
+ contrast to <link linkend="dot0">dot-zero</link> releases, which
+ are experimental).</para>
+<para condition="snapshot">This is a pre-release “snapshot†of the
+DocBook XSL Stylesheets. The change information in the first
+section of this file
+(for “<xi:include href="NEWS.xml" xpointer="xpointer(/article/sect1/title/text())"/>â€) is
+auto-generated from change descriptions stored in the project
+source-code repository.</para>
+<para condition="snapshot">That means the first section contains
+descriptions both of bug fixes and of feature changes. The
+remaining sections are manually edited changelog subsets that
+exclude bug-fix descriptions – that is, trimmed down to just those
+those descriptions that document enhancements and changes to the
+public APIs (user-configurable parameters).</para>
+</abstract>
+</info>
+
+<sect1 condition="snapshot" xml:id="current">
+ <xi:include href="NEWS.xml" xpointer="xpointer(/article/sect1/*)"/>
+</sect1>
+<sect1 xml:id="V1.76.1">
+<title>Release Notes: 1.76.1</title>
+<para>The following is a list of changes that have been made
+ since the 1.76.0 release.</para>
+
+<sect2 xml:id="rnV1.76.1_FO">
+<title>FO</title>
+<para>The following changes have been made to the
+ <filename>fo</filename> code
+ since the 1.76.0 release.</para>
+<itemizedlist>
+<listitem>
+<para><literal>Robert Stayton: docbook.xsl; xref.xsl; fop1.xsl</literal></para><screen><phrase role="commit-message">Apply patch to support named destination in fop1.xsl, per Sourceforge
+bug report #3029845.</phrase></screen>
+</listitem>
+</itemizedlist>
+</sect2><!--end of FO changes for 1.76.1-->
+
+<sect2 xml:id="rnV1.76.1_HTML">
+<title>HTML</title>
+<para>The following changes have been made to the <filename>html</filename> code since the 1.76.0 release.</para>
+<itemizedlist>
+<listitem>
+<para><literal>Keith Fahlgren: highlight.xsl</literal></para><screen><phrase role="commit-message">Implementing handling for &lt;b&gt; and &lt;i&gt;: transform to &lt;strong&gt; and &lt;em&gt; for XHTML outputs and do not use in the highliting output (per Mauritz Jeanson)</phrase></screen>
+</listitem>
+</itemizedlist>
+</sect2><!--end of HTML changes for 1.76.1-->
+
+<sect2 xml:id="rnV1.76.1_Params">
+<title>Params</title>
+<para>The following changes have been made to the
+ <filename>params</filename> code
+ since the 1.76.0 release.</para>
+<itemizedlist>
+<listitem>
+<para><literal>Robert Stayton: draft.mode.xml</literal></para><screen><phrase role="commit-message">Change default for <parameter>draft.mode</parameter> to 'no'.</phrase></screen>
+</listitem>
+</itemizedlist>
+</sect2><!--end of Params changes for 1.76.1-->
+
+
+</sect1>
+ <sect1 xml:id="V1.76.0">
+ <title>Release Notes: 1.76.0</title>
+<para>This release includes important bug fixes and adds the following
+significant feature changes:</para>
+<variablelist>
+<varlistentry>
+<term>Webhelp</term>
+<listitem><para>A new browser-based, cross-platform help format with full-text search and other features typically found in help systems. See <filename>webhelp/docs/content/ch01.html</filename> for more information and a demo. </para></listitem>
+
+</varlistentry>
+
+<varlistentry>
+<term>Gentext</term>
+<listitem><para>Many updates and additions to translation/locales thanks to Red Hat, the Fedora Project, and other contributors.</para></listitem>
+</varlistentry>
+<varlistentry>
+<term>Common</term>
+<listitem><para>Faster localization support, as language files are loaded on demand.</para></listitem>
+
+</varlistentry>
+ <varlistentry>
+ <term>FO</term>
+ <listitem><para>Support for SVG content in <tag>imagedata</tag> added.</para></listitem>
+</varlistentry>
+ <varlistentry>
+ <term>HTML</term>
+ <listitem><para>Output improved when using '<parameter>make.clean.html</parameter>' and a stock CSS file is now provided.</para></listitem>
+</varlistentry>
+<varlistentry>
+<term>EPUB</term>
+<listitem><para>A number of improvements to NCX, cover and image selection, and XHTML 1.1 element choices</para></listitem>
+</varlistentry>
+
+</variablelist>
+
+ <para>The following is a list of changes that have been made since the 1.75.2 release.</para>
+ <sect2 xml:id="rnV1.76.0_Gentext">
+ <title>Gentext</title>
+ <para>The following changes have been made to the <filename>gentext</filename> code since the 1.75.2 release.</para>
+ <itemizedlist>
+ <listitem>
+ <para>
+ <literal>rlandmann: locale/fa.xml</literal>
+ </para>
+ <screen>
+ <phrase role="commit-message">Update to Persian translation from the Fedora Project</phrase>
+ </screen>
+ </listitem>
+ <listitem>
+ <para>
+ <literal>rlandmann: locale/nds.xml</literal>
+ </para>
+ <screen>
+ <phrase role="commit-message">Locale for Low German</phrase>
+ </screen>
+ </listitem>
+ <listitem>
+ <para>
+ <literal>Mauritz Jeanson: locale/ka.xml; Makefile</literal>
+ </para>
+ <screen>
+ <phrase role="commit-message">Added support for Georgian based on patch #2917147.</phrase>
+ </screen>
+ </listitem>
+ <listitem>
+ <para>
+ <literal>rlandmann: locale/nl.xml; locale/ja.xml</literal>
+ </para>
+ <screen>
+ <phrase role="commit-message">Updated translations from Red Hat and the Fedora Project</phrase>
+ </screen>
+ </listitem>
+ <listitem>
+ <para>
+ <literal>rlandmann: locale/bs.xml; locale/ru.xml; locale/hr.xml</literal>
+ </para>
+ <screen>
+ <phrase role="commit-message">Updated locales from Red Hat and the Fedora Project</phrase>
+ </screen>
+ </listitem>
+ <listitem>
+ <para>
+ <literal>rlandmann: locale/pt.xml; locale/cs.xml; locale/es.xml; locale/bg.xml; locale/nl.xml; loca⋯</literal>
+ </para>
+ <screen>
+ <phrase role="commit-message">Updated translations from Red Hat and the Fedora Project</phrase>
+ </screen>
+ </listitem>
+ <listitem>
+ <para>
+ <literal>rlandmann: locale/as.xml; locale/bn_IN.xml; locale/ast.xml; locale/ml.xml; locale/te.xml; ⋯</literal>
+ </para>
+ <screen>
+ <phrase role="commit-message">New translations from Red Hat and the Fedora Project</phrase>
+ </screen>
+ </listitem>
+ <listitem>
+ <para>
+ <literal>rlandmann: locale/pt.xml; locale/ca.xml; locale/da.xml; locale/sr.xml; locale/ru.xml; loca⋯</literal>
+ </para>
+ <screen>
+ <phrase role="commit-message">Updated translations from Red Hat and the Fedora Project</phrase>
+ </screen>
+ </listitem>
+ </itemizedlist>
+ </sect2>
+ <!--end of Gentext changes for 1.76.0-->
+ <sect2 xml:id="rnV1.76.0_Common">
+ <title>Common</title>
+ <para>The following changes have been made to the <filename>common</filename> code since the 1.75.2 release.</para>
+ <itemizedlist>
+ <listitem>
+ <para>
+ <literal>Mauritz Jeanson: common.xsl</literal>
+ </para>
+ <screen>
+ <phrase role="commit-message">Fixed bug in output-orderedlist-starting-number template (@startingnumber did not work for FO).</phrase>
+ </screen>
+ </listitem>
+ <listitem>
+ <para>
+ <literal>Mauritz Jeanson: gentext.xsl</literal>
+ </para>
+ <screen>
+ <phrase role="commit-message">Added fix to catch ID also of descendants of <tag>listitem</tag>. Closes bug #2955077.</phrase>
+ </screen>
+ </listitem>
+ <listitem>
+ <para>
+ <literal>Jirka Kosek: l10n.xsl</literal>
+ </para>
+ <screen>
+ <phrase role="commit-message">Stripped down, faster version of gentext.template is used when there is no localization customization.</phrase>
+ </screen>
+ </listitem>
+ <listitem>
+ <para>
+ <literal>Mauritz Jeanson: stripns.xsl</literal>
+ </para>
+ <screen>
+ <phrase role="commit-message">Added fix that preserves <tag>link</tag>/@role (makes links in the <tag>reference</tag> documentation
+with @role="tcg" work).</phrase>
+ </screen>
+ </listitem>
+ <listitem>
+ <para>
+ <literal>Mauritz Jeanson: l10n.xsl</literal>
+ </para>
+ <screen>
+ <phrase role="commit-message">Fixed bugs related to manpages and L10n.</phrase>
+ </screen>
+ </listitem>
+ <listitem>
+ <para>
+ <literal>Jirka Kosek: entities.ent; autoidx-kosek.xsl</literal>
+ </para>
+ <screen>
+ <phrase role="commit-message">Upgraded to use common entities. Fixed bug when some code used @sortas and some not for grouping/sorting of indexterms.</phrase>
+ </screen>
+ </listitem>
+ <listitem>
+ <para>
+ <literal>Jirka Kosek: l10n.xsl; l10n.dtd; l10n.xml; autoidx-kosek.xsl</literal>
+ </para>
+ <screen>
+ <phrase role="commit-message">Refactored localization support. Language files are loaded on demand. Speedup is about 30%.</phrase>
+ </screen>
+ </listitem>
+ <listitem>
+ <para>
+ <literal>Jirka Kosek: l10n.xsl</literal>
+ </para>
+ <screen>
+ <phrase role="commit-message">Added xsl:keys for improved performance of localization texts look up. Performance gain around 15%.</phrase>
+ </screen>
+ </listitem>
+ <listitem>
+ <para>
+ <literal>Mauritz Jeanson: titles.xsl</literal>
+ </para>
+ <screen>
+ <phrase role="commit-message">Fixed bug #2912677 (error with <tag>xref</tag> in <tag>title</tag>).</phrase>
+ </screen>
+ </listitem>
+ <listitem>
+ <para>
+ <literal>Robert Stayton: olink.xsl</literal>
+ </para>
+ <screen>
+ <phrase role="commit-message">Fix bug in xrefstyle "<tag>title</tag>" handling introduced with
+the 'insert.targetdb.data' template.</phrase>
+ </screen>
+ </listitem>
+ <listitem>
+ <para>
+ <literal>Robert Stayton: gentext.xsl</literal>
+ </para>
+ <screen>
+ <phrase role="commit-message">Fix bug in <tag>xref</tag> to <tag>equation</tag> without <tag>title</tag> to use context="xref-number" instead
+of "xref-number-and-title".</phrase>
+ </screen>
+ </listitem>
+ <listitem>
+ <para>
+ <literal>Robert Stayton: labels.xsl</literal>
+ </para>
+ <screen>
+ <phrase role="commit-message">Number all equations in one sequence, with or without <tag>title</tag>.</phrase>
+ </screen>
+ </listitem>
+ <listitem>
+ <para>
+ <literal>Robert Stayton: entities.ent</literal>
+ </para>
+ <screen>
+ <phrase role="commit-message">Fix bug #2896909 where duplicate @sortas on indexterms caused
+some indexterms to drop out of <tag>index</tag>.</phrase>
+ </screen>
+ </listitem>
+ <listitem>
+ <para>
+ <literal>Robert Stayton: stripns.xsl</literal>
+ </para>
+ <screen>
+ <phrase role="commit-message">Expand the "Stripping namespace ..." message to advise users to
+use the namespaced stylesheets.</phrase>
+ </screen>
+ </listitem>
+ <listitem>
+ <para>
+ <literal>Robert Stayton: stripns.xsl</literal>
+ </para>
+ <screen>
+ <phrase role="commit-message">need a local version of $exsl.node.set.available variable because
+this module imported many places.</phrase>
+ </screen>
+ </listitem>
+ <listitem>
+ <para>
+ <literal>Mauritz Jeanson: olink.xsl</literal>
+ </para>
+ <screen>
+ <phrase role="commit-message">Added /node() to the select expression that is used to compute the <tag>title</tag> text
+so that no &lt;ttl&gt; elements end up in the output. Closes bug #2830119.</phrase>
+ </screen>
+ </listitem>
+ </itemizedlist>
+ </sect2>
+ <!--end of Common changes for 1.76.0-->
+ <sect2 xml:id="rnV1.76.0_FO">
+ <title>FO</title>
+ <para>The following changes have been made to the
+ <filename>fo</filename> code
+ since the 1.75.2 release.</para>
+ <itemizedlist>
+ <listitem>
+ <para>
+ <literal>Robert Stayton: table.xsl</literal>
+ </para>
+ <screen>
+ <phrase role="commit-message">Fix bug 2979166 able - Attribute @rowheader not working</phrase>
+ </screen>
+ </listitem>
+ <listitem>
+ <para>
+ <literal>Mauritz Jeanson: inline.xsl</literal>
+ </para>
+ <screen>
+ <phrase role="commit-message">Improved <tag>glossterm</tag> auto-linking by using keys. The old code was inefficient when processing documents
+with many inline glossterms.</phrase>
+ </screen>
+ </listitem>
+ <listitem>
+ <para>
+ <literal>Robert Stayton: titlepage.xsl</literal>
+ </para>
+ <screen>
+ <phrase role="commit-message">Fix bug 2805530 <tag>author</tag>/<tag>orgname</tag> not appearing on <tag>title</tag> page.</phrase>
+ </screen>
+ </listitem>
+ <listitem>
+ <para>
+ <literal>Mauritz Jeanson: graphics.xsl</literal>
+ </para>
+ <screen>
+ <phrase role="commit-message">Added support for SVG content in <tag>imagedata</tag> (inspired by patch #2909154).</phrase>
+ </screen>
+ </listitem>
+ <listitem>
+ <para>
+ <literal>Mauritz Jeanson: table.xsl</literal>
+ </para>
+ <screen>
+ <phrase role="commit-message">Removed superfluous test used when computing column-width. Closes bug #3000898.</phrase>
+ </screen>
+ </listitem>
+ <listitem>
+ <para>
+ <literal>Mauritz Jeanson: inline.xsl</literal>
+ </para>
+ <screen>
+ <phrase role="commit-message">Added missing &lt;xsl:call-template name="<tag>anchor</tag>"/&gt;. Closes bug #2998567.</phrase>
+ </screen>
+ </listitem>
+ <listitem>
+ <para>
+ <literal>Mauritz Jeanson: lists.xsl</literal>
+ </para>
+ <screen>
+ <phrase role="commit-message">Added table-layout="fixed" on <tag>segmentedlist</tag> <tag>table</tag> (required by XSL spec when proportional-column-width() is used).</phrase>
+ </screen>
+ </listitem>
+ <listitem>
+ <para>
+ <literal>Jirka Kosek: autoidx-kosek.xsl</literal>
+ </para>
+ <screen>
+ <phrase role="commit-message">Upgraded to use common entities. Fixed bug when some code used @sortas and some not for grouping/sorting of indexterms.</phrase>
+ </screen>
+ </listitem>
+ <listitem>
+ <para>
+ <literal>Jirka Kosek: index.xsl</literal>
+ </para>
+ <screen>
+ <phrase role="commit-message">Upgraded to use common entities. Fixed bug when some code used @sortas and some not for grouping/sorting of indexterms.</phrase>
+ </screen>
+ </listitem>
+ <listitem>
+ <para>
+ <literal>Robert Stayton: xref.xsl</literal>
+ </para>
+ <screen>
+ <phrase role="commit-message">Fix bug in <tag>olink</tag> template when an <tag>olink</tag> has an id.
+Add warning message with id value when trying to <tag>link</tag>
+to an element that has no generated text.</phrase>
+ </screen>
+ </listitem>
+ <listitem>
+ <para>
+ <literal>Mauritz Jeanson: refentry.xsl</literal>
+ </para>
+ <screen>
+ <phrase role="commit-message">Fixed bug #2930968 (<tag>indexterm</tag> in <tag>refmeta</tag> not handled correctly).</phrase>
+ </screen>
+ </listitem>
+ <listitem>
+ <para>
+ <literal>Robert Stayton: block.xsl</literal>
+ </para>
+ <screen>
+ <phrase role="commit-message">fix bug 2949567 <tag>title</tag> in <tag>revhistory</tag> breaks FO transform.</phrase>
+ </screen>
+ </listitem>
+ <listitem>
+ <para>
+ <literal>Robert Stayton: glossary.xsl</literal>
+ </para>
+ <screen>
+ <phrase role="commit-message">Output id attributes on <tag>glossdiv</tag> blocks so they can be added to
+xrefs or <tag>TOC</tag>.</phrase>
+ </screen>
+ </listitem>
+ <listitem>
+ <para>
+ <literal>Jirka Kosek: xref.xsl</literal>
+ </para>
+ <screen>
+ <phrase role="commit-message">Enabled hyphenation of URLs when ulink content is the same as <tag>link</tag> target</phrase>
+ </screen>
+ </listitem>
+ <listitem>
+ <para>
+ <literal>Robert Stayton: table.xsl</literal>
+ </para>
+ <screen>
+ <phrase role="commit-message">Apply patch to turn off <tag>row</tag> recursion if no @morerows attributes present.
+This will enable very large tables without <tag>row</tag> spanning to
+process without running into recursion limits.</phrase>
+ </screen>
+ </listitem>
+ <listitem>
+ <para>
+ <literal>Robert Stayton: formal.xsl</literal>
+ </para>
+ <screen>
+ <phrase role="commit-message">Format <tag>equation</tag> without <tag>title</tag> using <tag>table</tag> layout with <tag>equation</tag> number
+next to the <tag>equation</tag>.</phrase>
+ </screen>
+ </listitem>
+ <listitem>
+ <para>
+ <literal>Robert Stayton: param.xweb; param.ent</literal>
+ </para>
+ <screen>
+ <phrase role="commit-message">Add <parameter>equation.number.properties</parameter>.</phrase>
+ </screen>
+ </listitem>
+ </itemizedlist>
+ </sect2>
+ <!--end of FO changes for 1.76.0-->
+ <sect2 xml:id="rnV1.76.0_HTML">
+ <title>HTML</title>
+ <para>The following changes have been made to the
+ <filename>html</filename> code
+ since the 1.75.2 release.</para>
+ <itemizedlist>
+ <listitem>
+ <para>
+ <literal>Mauritz Jeanson: block.xsl</literal>
+ </para>
+ <screen>
+ <phrase role="commit-message">Modified <tag>acknowledgements</tag> template to avoid invalid output (&lt;p&gt; in &lt;p&gt;).</phrase>
+ </screen>
+ </listitem>
+ <listitem>
+ <para>
+ <literal>Mauritz Jeanson: titlepage.xsl</literal>
+ </para>
+ <screen>
+ <phrase role="commit-message">Added default <tag>sidebar</tag> attribute-sets.</phrase>
+ </screen>
+ </listitem>
+ <listitem>
+ <para>
+ <literal>Robert Stayton: table.xsl</literal>
+ </para>
+ <screen>
+ <phrase role="commit-message">Fix bug 2979166 able - Attribute @rowheader not working</phrase>
+ </screen>
+ </listitem>
+ <listitem>
+ <para>
+ <literal>Robert Stayton: footnote.xsl</literal>
+ </para>
+ <screen>
+ <phrase role="commit-message">Fix bug 3033191 footnotes in html tables.</phrase>
+ </screen>
+ </listitem>
+ <listitem>
+ <para>
+ <literal>Mauritz Jeanson: inline.xsl</literal>
+ </para>
+ <screen>
+ <phrase role="commit-message">Improved <tag>glossterm</tag> auto-linking by using keys. The old code was inefficient when processing documents
+with many inline glossterms.</phrase>
+ </screen>
+ </listitem>
+ <listitem>
+ <para>
+ <literal>Robert Stayton: docbook.css.xml; verbatim.xsl</literal>
+ </para>
+ <screen>
+ <phrase role="commit-message">Fix bug 2844927 Validity error for <tag>callout</tag> bugs.</phrase>
+ </screen>
+ </listitem>
+ <listitem>
+ <para>
+ <literal>Robert Stayton: formal.xsl</literal>
+ </para>
+ <screen>
+ <phrase role="commit-message">Convert formal.object.heading to respect <parameter>make.clean.html</parameter> param.</phrase>
+ </screen>
+ </listitem>
+ <listitem>
+ <para>
+ <literal>Robert Stayton: titlepage.templates.xml; block.xsl</literal>
+ </para>
+ <screen>
+ <phrase role="commit-message">Fix bug 2840768 <tag>sidebar</tag> without <tag>title</tag> inserts empty b <tag>tag</tag>.</phrase>
+ </screen>
+ </listitem>
+ <listitem>
+ <para>
+ <literal>Mauritz Jeanson: docbook.xsl</literal>
+ </para>
+ <screen>
+ <phrase role="commit-message">Moved the template that outputs &lt;base&gt; so that the base URI also applies to relative CSS paths that come later.
+See patch #2896121.</phrase>
+ </screen>
+ </listitem>
+ <listitem>
+ <para>
+ <literal>Jirka Kosek: autoidx-kosek.xsl</literal>
+ </para>
+ <screen>
+ <phrase role="commit-message">Upgraded to use common entities. Fixed bug when some code used @sortas and some not for grouping/sorting of indexterms.</phrase>
+ </screen>
+ </listitem>
+ <listitem>
+ <para>
+ <literal>Robert Stayton: chunk-code.xsl</literal>
+ </para>
+ <screen>
+ <phrase role="commit-message">fix bug 2948363 generated <tag>filename</tag> for <tag>refentry</tag> not unique, when
+used in a set.</phrase>
+ </screen>
+ </listitem>
+ <listitem>
+ <para>
+ <literal>Robert Stayton: component.xsl</literal>
+ </para>
+ <screen>
+ <phrase role="commit-message">Fix missing "<tag>Chapter</tag> n" <tag>label</tag> when use <tag>chapter</tag>/<tag>info</tag>/<tag>title</tag>.</phrase>
+ </screen>
+ </listitem>
+ <listitem>
+ <para>
+ <literal>Robert Stayton: table.xsl</literal>
+ </para>
+ <screen>
+ <phrase role="commit-message"><tag>Row</tag> recursion turned off if no @morerows attributes in the <tag>table</tag>.
+This will prevent failure on long <tag>table</tag> (with no @morerows) due
+to excessive depth of recursion.</phrase>
+ </screen>
+ </listitem>
+ <listitem>
+ <para>
+ <literal>Robert Stayton: autotoc.xsl; docbook.css.xml</literal>
+ </para>
+ <screen>
+ <phrase role="commit-message">Support <parameter>make.clean.html</parameter> in autotoc.xsl.</phrase>
+ </screen>
+ </listitem>
+ <listitem>
+ <para>
+ <literal>Robert Stayton: docbook.css.xml; block.xsl</literal>
+ </para>
+ <screen>
+ <phrase role="commit-message">Add support for <parameter>make.clean.html</parameter> setting in block elements.</phrase>
+ </screen>
+ </listitem>
+ <listitem>
+ <para>
+ <literal>Robert Stayton: docbook.css.xml</literal>
+ </para>
+ <screen>
+ <phrase role="commit-message">Stock CSS styles for DocBook HTML output when '<parameter>make.clean.html</parameter>' is non-zero.</phrase>
+ </screen>
+ </listitem>
+ <listitem>
+ <para>
+ <literal>Robert Stayton: html.xsl</literal>
+ </para>
+ <screen>
+ <phrase role="commit-message">Add templates for generating CSS files and links to them.</phrase>
+ </screen>
+ </listitem>
+ <listitem>
+ <para>
+ <literal>Robert Stayton: param.xweb</literal>
+ </para>
+ <screen>
+ <phrase role="commit-message">Fix bugs in new entity references.</phrase>
+ </screen>
+ </listitem>
+ <listitem>
+ <para>
+ <literal>Robert Stayton: chunk-common.xsl</literal>
+ </para>
+ <screen>
+ <phrase role="commit-message">List of Equations now includes on equations with titles.</phrase>
+ </screen>
+ </listitem>
+ <listitem>
+ <para>
+ <literal>Robert Stayton: table.xsl</literal>
+ </para>
+ <screen>
+ <phrase role="commit-message">If a <tag>colspec</tag> has a colname attribute, add it to the HTML <tag>col</tag>
+element as a class attribute so it can be styled.</phrase>
+ </screen>
+ </listitem>
+ <listitem>
+ <para>
+ <literal>Robert Stayton: formal.xsl</literal>
+ </para>
+ <screen>
+ <phrase role="commit-message">Fix bug 2825842 where <tag>table</tag> footnotes not appearing in HTML-coded <tag>table</tag>.</phrase>
+ </screen>
+ </listitem>
+ <listitem>
+ <para>
+ <literal>Robert Stayton: chunktoc.xsl</literal>
+ </para>
+ <screen>
+ <phrase role="commit-message">Fix bug #2834826 where <tag>appendix</tag> inside part was not chunked as it should be.</phrase>
+ </screen>
+ </listitem>
+ <listitem>
+ <para>
+ <literal>Mauritz Jeanson: chunktoc.xsl</literal>
+ </para>
+ <screen>
+ <phrase role="commit-message">Added missing namespace declarations. Closes bug #2890069.</phrase>
+ </screen>
+ </listitem>
+ <listitem>
+ <para>
+ <literal>Mauritz Jeanson: footnote.xsl</literal>
+ </para>
+ <screen>
+ <phrase role="commit-message">Updated the template for <tag>footnote</tag> paras to use the 'paragraph' template. Closes bug #2803739.</phrase>
+ </screen>
+ </listitem>
+ <listitem>
+ <para>
+ <literal>Keith Fahlgren: inline.xsl; lists.xsl</literal>
+ </para>
+ <screen>
+ <phrase role="commit-message">Remove &lt;b&gt; and &lt;i&gt; elements "discouraged in favor of style sheets" from
+XHTML, XHTML 1.1 (and therefore EPUB) outputs by changing html2xhtml.xsl.
+
+Fixes bug #2873153: No &lt;b&gt; and &lt;i&gt; tags in XHTML/EPUB
+
+Added regression to EPUB specs:</phrase>
+ </screen>
+ </listitem>
+ <listitem>
+ <para>
+ <literal>Mauritz Jeanson: inline.xsl</literal>
+ </para>
+ <screen>
+ <phrase role="commit-message">Fixed bug #2844916 (don't output @target if <parameter>ulink.target</parameter> is empty).</phrase>
+ </screen>
+ </listitem>
+ <listitem>
+ <para>
+ <literal>Keith Fahlgren: autoidx.xsl</literal>
+ </para>
+ <screen>
+ <phrase role="commit-message">Fix a bug when using <parameter>index.on.type</parameter>: an '<tag>index</tag> symbols' <tag>section</tag> was created
+even if that typed <tag>index</tag> didn't include any symbols (they were in the other types).</phrase>
+ </screen>
+ </listitem>
+ </itemizedlist>
+ </sect2>
+ <!--end of HTML changes for 1.76.0-->
+ <sect2 xml:id="rnV1.76.0_Manpages">
+ <title>Manpages</title>
+ <para>The following changes have been made to the
+ <filename>manpages</filename> code
+ since the 1.75.2 release.</para>
+ <itemizedlist>
+ <listitem>
+ <para>
+ <literal>Mauritz Jeanson: other.xsl</literal>
+ </para>
+ <screen>
+ <phrase role="commit-message">Modified the write.stubs template so that the <tag>section</tag> directory name is not output twice. Should fix bug #2831602.
+Also ensured that $lang is added to the .so path (when <parameter>man.output.lang.in.name.enabled</parameter>=1).</phrase>
+ </screen>
+ </listitem>
+ <listitem>
+ <para>
+ <literal>Mauritz Jeanson: docbook.xsl; other.xsl</literal>
+ </para>
+ <screen>
+ <phrase role="commit-message">Fixed bug #2412738 (apostrophe escaping) by applying the submitted patch.</phrase>
+ </screen>
+ </listitem>
+ <listitem>
+ <para>
+ <literal>Norman Walsh: block.xsl; endnotes.xsl</literal>
+ </para>
+ <screen>
+ <phrase role="commit-message">Fix bug where <tag>simpara</tag> in <tag>footnote</tag> didn't work. Patch by Jonathan Nieder, jrnieder@gmail.com</phrase>
+ </screen>
+ </listitem>
+ <listitem>
+ <para>
+ <literal>dleidert: lists.xsl</literal>
+ </para>
+ <screen>
+ <phrase role="commit-message">Fix two indentation issues: In the first case there is no corresponding .RS
+macro (Debian #519438, sf.net 2793873). In the second case an .RS instead of
+the probably intended .sp leads to an indentation bug (Debian #527309,
+sf.net #2642139).</phrase>
+ </screen>
+ </listitem>
+ </itemizedlist>
+ </sect2>
+ <!--end of Manpages changes for 1.76.0-->
+ <sect2 xml:id="rnV1.76.0_Epub">
+ <title>Epub</title>
+ <para>The following changes have been made to the
+ <filename>epub</filename> code
+ since the 1.75.2 release.</para>
+ <itemizedlist>
+ <listitem>
+ <para>
+ <literal>Keith Fahlgren: bin/spec/examples/AMasqueOfDays.epub; docbook.xsl; bin/spec/epub_spec.rb</literal>
+ </para>
+ <screen>
+ <phrase role="commit-message">Resolve some actual regressions in <tag>date</tag> output spotted by more recent versions of epubcheck</phrase>
+ </screen>
+ </listitem>
+ <listitem>
+ <para>
+ <literal>Keith Fahlgren: docbook.xsl</literal>
+ </para>
+ <screen>
+ <phrase role="commit-message">Updated <tag>mediaobject</tag> selection code that better uses roles (when available); based on contributons by Glenn McDonald</phrase>
+ </screen>
+ </listitem>
+ <listitem>
+ <para>
+ <literal>Keith Fahlgren: bin/spec/epub_regressions_spec.rb; docbook.xsl</literal>
+ </para>
+ <screen>
+ <phrase role="commit-message">Ensure that NCX documents are always outputted with a default namespace
+to prevent problems with the kindlegen machinery</phrase>
+ </screen>
+ </listitem>
+ <listitem>
+ <para>
+ <literal>Keith Fahlgren: bin/spec/epub_regressions_spec.rb; bin/spec/files/partintro.xml; docbook.x⋯</literal>
+ </para>
+ <screen>
+ <phrase role="commit-message">Adding support for partintros with sect2s, 3s, etc</phrase>
+ </screen>
+ </listitem>
+ <listitem>
+ <para>
+ <literal>Keith Fahlgren: docbook.xsl</literal>
+ </para>
+ <screen>
+ <phrase role="commit-message">Adding param to workaround horrific ADE bug with the inability to process &lt;br&gt;</phrase>
+ </screen>
+ </listitem>
+ <listitem>
+ <para>
+ <literal>Keith Fahlgren: docbook.xsl</literal>
+ </para>
+ <screen>
+ <phrase role="commit-message">Add support for <tag>authorgroup</tag>/<tag>author</tag> in OPF metadata (via Michael Wiedmann)</phrase>
+ </screen>
+ </listitem>
+ <listitem>
+ <para>
+ <literal>Keith Fahlgren: bin/spec/epub_regressions_spec.rb</literal>
+ </para>
+ <screen>
+ <phrase role="commit-message">Remove &lt;b&gt; and &lt;i&gt; elements "discouraged in favor of style sheets" from
+XHTML, XHTML 1.1 (and therefore EPUB) outputs by changing html2xhtml.xsl.
+
+Fixes bug #2873153: No &lt;b&gt; and &lt;i&gt; tags in XHTML/EPUB
+
+Added regression to EPUB specs:</phrase>
+ </screen>
+ </listitem>
+ <listitem>
+ <para>
+ <literal>Keith Fahlgren: bin/lib/docbook.rb; bin/spec/files/DejaVuSerif-Italic.otf; docbook.xsl; bi⋯</literal>
+ </para>
+ <screen>
+ <phrase role="commit-message">This resolves bug #2873142, Please add support for multiple embedded fonts
+
+
+If you navigate to a checkout of DocBook-XSL and go to:
+xsl/epub/bin/spec/files
+You can now run the following <tag>command</tag>:
+
+../../dbtoepub -f DejaVuSerif.otf -f DejaVuSerif-Italic.otf -c test.css
+-s test_cust.xsl orm.book.001.xml
+
+In dbtoepub, the following option can be used more than once:
+-f, --font [OTF FILE] Embed OTF FILE in .epub.
+
+The underlying stylesheet now accepts a comma-separated list of font file
+names rather than just one as the RENAMED epub.embedded.fonts ('s' added).
+
+The runnable EPUB spec now includes:
+- should be valid .epub after including more than one embedded font</phrase>
+ </screen>
+ </listitem>
+ <listitem>
+ <para>
+ <literal>Keith Fahlgren: docbook.xsl</literal>
+ </para>
+ <screen>
+ <phrase role="commit-message">Improve the selection of <tag>cover</tag> images when working in DocBook 4.x land (work in progress)</phrase>
+ </screen>
+ </listitem>
+ <listitem>
+ <para>
+ <literal>Keith Fahlgren: bin/spec/epub_regressions_spec.rb; docbook.xsl</literal>
+ </para>
+ <screen>
+ <phrase role="commit-message">Improve the quality of the OPF spine regression by ensuring that the spine
+elements for deeply nested refentries are in order and adjacent to their
+opening wrapper XHTML chunk.</phrase>
+ </screen>
+ </listitem>
+ <listitem>
+ <para>
+ <literal>Keith Fahlgren: bin/spec/epub_regressions_spec.rb; docbook.xsl; bin/spec/files/orm.book.00⋯</literal>
+ </para>
+ <screen>
+ <phrase role="commit-message">Add more careful handling of refentries to ensure that they always appear in the opf:spine.
+This was only a problem when refentries were pushed deep into the hierarchy (like inside
+a <tag>sect2</tag>), but presented navigational problems for many reading systems (despite the
+correct NCX references). This may *not* be the best solution, but attacking a better
+chunking strategy for refentries was too big a nut to crack at this time.</phrase>
+ </screen>
+ </listitem>
+ </itemizedlist>
+ </sect2>
+ <!--end of Epub changes for 1.76.0-->
+ <sect2 xml:id="rnV1.76.0_Eclipse">
+ <title>Eclipse</title>
+ <para>The following changes have been made to the
+ <filename>eclipse</filename> code
+ since the 1.75.2 release.</para>
+ <itemizedlist>
+ <listitem>
+ <para>
+ <literal>Mauritz Jeanson: eclipse3.xsl</literal>
+ </para>
+ <screen>
+ <phrase role="commit-message">Added a stylesheet module that generates plug-ins conforming to the standard (OSGi-based) Eclipse 3.x
+architecture. The main difference to the older format is that metadata is stored in a separate
+<parameter>manifest</parameter> file. The module imports and extends the existing eclipse.xsl module. Based on code
+contributed in patch #2624668.</phrase>
+ </screen>
+ </listitem>
+ </itemizedlist>
+ </sect2>
+ <!--end of Eclipse changes for 1.76.0-->
+ <sect2 xml:id="rnV1.76.0_Params">
+ <title>Params</title>
+ <para>The following changes have been made to the
+ <filename>params</filename> code
+ since the 1.75.2 release.</para>
+ <itemizedlist>
+ <listitem>
+ <para>
+ <literal>Robert Stayton: draft.watermark.image.xml</literal>
+ </para>
+ <screen>
+ <phrase role="commit-message">Fix bug 2922488 <parameter>draft.watermark.image</parameter> pointing to web resource.
+Now the value is images/draft.png, and may require customization
+for local resolution.</phrase>
+ </screen>
+ </listitem>
+ <listitem>
+ <para>
+ <literal>Mauritz Jeanson: equation.number.properties.xml</literal>
+ </para>
+ <screen>
+ <phrase role="commit-message">Corrected <tag>refpurpose</tag>.</phrase>
+ </screen>
+ </listitem>
+ <listitem>
+ <para>
+ <literal>Norman Walsh: paper.type.xml</literal>
+ </para>
+ <screen>
+ <phrase role="commit-message">Added USlegal and USlegallandscape paper types.</phrase>
+ </screen>
+ </listitem>
+ <listitem>
+ <para>
+ <literal>Jirka Kosek: highlight.xslthl.config.xml</literal>
+ </para>
+ <screen>
+ <phrase role="commit-message">Added note about specifying location as URL</phrase>
+ </screen>
+ </listitem>
+ <listitem>
+ <para>
+ <literal>Robert Stayton: docbook.css.source.xml; generate.css.header.xml; custom.css.source.xml; ma⋯</literal>
+ </para>
+ <screen>
+ <phrase role="commit-message">Params to support generated CSS files.</phrase>
+ </screen>
+ </listitem>
+ <listitem>
+ <para>
+ <literal>Robert Stayton: equation.number.properties.xml</literal>
+ </para>
+ <screen>
+ <phrase role="commit-message">New attribute set for numbers appearing next to equations.</phrase>
+ </screen>
+ </listitem>
+ </itemizedlist>
+ </sect2>
+ <!--end of Params changes for 1.76.0-->
+ <sect2 xml:id="rnV1.76.0_XSL-Xalan">
+ <title>XSL-Xalan</title>
+ <para>The following changes have been made to the
+ <filename>xsl-xalan</filename> code
+ since the 1.75.2 release.</para>
+ <itemizedlist>
+ <listitem>
+ <para>
+ <literal>dleidert: nbproject/genfiles.properties; nbproject/build-impl.xml</literal>
+ </para>
+ <screen>
+ <phrase role="commit-message">Rebuild netbeans build files after adding missing Netbeans configuration to allow easier packaging for Debian.</phrase>
+ </screen>
+ </listitem>
+ </itemizedlist>
+ </sect2>
+ <!--end of XSL-Xalan changes for 1.76.0-->
+ </sect1>
+<sect1 xml:id="rn_V1.75.2">
+<title>Release Notes: 1.75.2</title>
+<para>The following is a list of changes that have been made
+ since the 1.75.1 release.</para>
+
+<sect2 xml:id="rn_V1.75.2_Gentext">
+<title>Gentext</title>
+<para>The following changes have been made to the
+ <filename>gentext</filename> code
+ since the 1.75.1 release.</para>
+<itemizedlist>
+<listitem>
+<para><literal>dleidert: locale/ja.xml</literal></para><screen><phrase role="commit-message">Improved Japanese translation for Note(s). Closes bug #2823965.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>dleidert: locale/pl.xml</literal></para><screen><phrase role="commit-message">Polish alphabet contains O with acute accent, not with grave accent. Closes bug #2823964.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Robert Stayton: locale/ja.xml</literal></para><screen><phrase role="commit-message">Fix translation of "<tag>index</tag>", per bug report 2796064.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Robert Stayton: locale/is.xml</literal></para><screen><phrase role="commit-message">New Icelandic locale file.</phrase></screen>
+</listitem>
+</itemizedlist>
+</sect2><!--end of Gentext changes for 1.75.2-->
+
+<sect2 xml:id="rn_V1.75.2_Common">
+<title>Common</title>
+<para>The following changes have been made to the
+ <filename>common</filename> code
+ since the 1.75.1 release.</para>
+<itemizedlist>
+<listitem>
+<para><literal>Norman Walsh: stripns.xsl</literal></para><screen><phrase role="commit-message">Support more downconvert cases</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Robert Stayton: titles.xsl</literal></para><screen><phrase role="commit-message">Make sure <tag>title</tag> inside <tag>info</tag> is used if no other <tag>title</tag>.</phrase></screen>
+</listitem>
+</itemizedlist>
+</sect2><!--end of Common changes for 1.75.2-->
+
+<sect2 xml:id="rn_V1.75.2_FO">
+<title>FO</title>
+<para>The following changes have been made to the
+ <filename>fo</filename> code
+ since the 1.75.1 release.</para>
+<itemizedlist>
+<listitem>
+<para><literal>Robert Stayton: pi.xsl</literal></para><screen><phrase role="commit-message">Turn off dbfo-need for <parameter>fop1.extensions</parameter> also, per bug #2816141.</phrase></screen>
+</listitem>
+</itemizedlist>
+</sect2><!--end of FO changes for 1.75.2-->
+
+<sect2 xml:id="rn_V1.75.2_HTML">
+<title>HTML</title>
+<para>The following changes have been made to the
+ <filename>html</filename> code
+ since the 1.75.1 release.</para>
+<itemizedlist>
+<listitem>
+<para><literal>Mauritz Jeanson: titlepage.xsl</literal></para><screen><phrase role="commit-message">Output "<tag>Copyright</tag>" heading in XHTML too.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Mauritz Jeanson: titlepage.xsl</literal></para><screen><phrase role="commit-message">Added stylesheet.result.type test for <tag>copyright</tag>. Closes bug #2813289.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Norman Walsh: htmltbl.xsl</literal></para><screen><phrase role="commit-message">Remove ambiguity wrt @span, @rowspan, and @colspan</phrase></screen>
+</listitem>
+</itemizedlist>
+</sect2><!--end of HTML changes for 1.75.2-->
+
+<sect2 xml:id="rn_V1.75.2_Manpages">
+<title>Manpages</title>
+<para>The following changes have been made to the
+ <filename>manpages</filename> code
+ since the 1.75.1 release.</para>
+<itemizedlist>
+<listitem>
+<para><literal>Mauritz Jeanson: endnotes.xsl</literal></para><screen><phrase role="commit-message">Added normalize-space() for ulink content. Closes bug #2793877.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Mauritz Jeanson: docbook.xsl</literal></para><screen><phrase role="commit-message">Added stylesheet.result.type test for <tag>copyright</tag>. Closes bug #2813289.</phrase></screen>
+</listitem>
+</itemizedlist>
+</sect2><!--end of Manpages changes for 1.75.2-->
+
+<sect2 xml:id="rn_V1.75.2_Epub">
+<title>Epub</title>
+<para>The following changes have been made to the
+ <filename>epub</filename> code
+ since the 1.75.1 release.</para>
+<itemizedlist>
+<listitem>
+<para><literal>Keith Fahlgren: bin/dbtoepub; bin/lib/docbook.rb</literal></para><screen><phrase role="commit-message">Corrected bugs caused by path and file assumptions were not met</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Keith Fahlgren: bin/lib/docbook.rb; docbook.xsl</literal></para><screen><phrase role="commit-message">Cleaning up hardcoded values into parameters and fixing Ruby library to pass them properly; all thanks to patch from Liza Daly</phrase></screen>
+</listitem>
+</itemizedlist>
+</sect2><!--end of Epub changes for 1.75.2-->
+
+<sect2 xml:id="rn_V1.75.2_Profiling">
+<title>Profiling</title>
+<para>The following changes have been made to the
+ <filename>profiling</filename> code
+ since the 1.75.1 release.</para>
+<itemizedlist>
+<listitem>
+<para><literal>Robert Stayton: profile.xsl</literal></para><screen><phrase role="commit-message">Fix bug 2815493 missing <parameter>exsl.node.set.available</parameter> parameter.</phrase></screen>
+</listitem>
+</itemizedlist>
+</sect2><!--end of Profiling changes for 1.75.2-->
+
+<sect2 xml:id="rn_V1.75.2_XSL-Saxon">
+<title>XSL-Saxon</title>
+<para>The following changes have been made to the
+ <filename>xsl-saxon</filename> code
+ since the 1.75.1 release.</para>
+<itemizedlist>
+<listitem>
+<para><literal>Mauritz Jeanson: src/com/nwalsh/saxon/ColumnUpdateEmitter.java; src/com/nwalsh/saxon/Colum⋯</literal></para><screen><phrase role="commit-message">Added fixes so that colgroups in the XHTML namespace are processed properly.</phrase></screen>
+</listitem>
+</itemizedlist>
+</sect2><!--end of XSL-Saxon changes for 1.75.2-->
+
+<sect2 xml:id="rn_V1.75.2_XSL-Xalan">
+<title>XSL-Xalan</title>
+<para>The following changes have been made to the
+ <filename>xsl-xalan</filename> code
+ since the 1.75.1 release.</para>
+<itemizedlist>
+<listitem>
+<para><literal>Mauritz Jeanson: nbproject/project.xml</literal></para><screen><phrase role="commit-message">Added missing NetBeans configuration.</phrase></screen>
+</listitem>
+</itemizedlist>
+</sect2><!--end of XSL-Xalan changes for 1.75.2-->
+
+</sect1>
+
+
+<sect1 xml:id="rn_V1.75.1">
+<title>Release Notes: 1.75.1</title>
+<para>This release includes bug fixes.</para>
+
+<para>The following is a list of changes that have been made since the 1.75.0 release.</para>
+
+
+<sect2 xml:id="rn_V1.75.1_FO">
+<title>FO</title>
+<para>The following changes have been made to the <filename>fo</filename> code since the 1.75.0 release.</para>
+<itemizedlist>
+<listitem>
+<para><literal>Keith Fahlgren: block.xsl</literal></para><screen><phrase role="commit-message">Switching to em dash for character before <tag>attribution</tag> in <tag>epigraph</tag>; resolves Bug #2793878</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Robert Stayton: lists.xsl</literal></para><screen><phrase role="commit-message">Fixed bug 2789947, id attribute missing on <tag>simplelist</tag> fo output.</phrase></screen>
+</listitem>
+</itemizedlist>
+</sect2><!--end of FO changes for 1.75.1-->
+
+<sect2 xml:id="rn_V1.75.1_HTML">
+<title>HTML</title>
+<para>The following changes have been made to the
+ <filename>html</filename> code
+ since the 1.75.0 release.</para>
+<itemizedlist>
+<listitem>
+<para><literal>Keith Fahlgren: block.xsl</literal></para><screen><phrase role="commit-message">Switching to em dash for character before <tag>attribution</tag> in <tag>epigraph</tag>; resolves Bug #2793878</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Robert Stayton: lists.xsl</literal></para><screen><phrase role="commit-message">Fixed bug 2789678: apply-templates line accidentally deleted.</phrase></screen>
+</listitem>
+</itemizedlist>
+</sect2><!--end of HTML changes for 1.75.1-->
+
+<sect2 xml:id="rn_V1.75.1_Epub">
+<title>Epub</title>
+<para>The following changes have been made to the
+ <filename>epub</filename> code
+ since the 1.75.0 release.</para>
+<itemizedlist>
+<listitem>
+<para><literal>Keith Fahlgren: bin/spec/epub_regressions_spec.rb; docbook.xsl</literal></para><screen><phrase role="commit-message">Added regression and fix to correct "bug" with namespace-prefixed container elements in META-INF/container.xml ; resolves Issue #2790017</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Keith Fahlgren: bin/spec/epub_regressions_spec.rb; bin/spec/files/onegraphic.xinclude.xml;⋯</literal></para><screen><phrase role="commit-message">Another attempt at flexible named entity and XInclude processing</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Keith Fahlgren: bin/lib/docbook.rb</literal></para><screen><phrase role="commit-message">Tweaking solution to Bug #2750442 following regression reported by Michael Wiedmann.</phrase></screen>
+</listitem>
+</itemizedlist>
+</sect2><!--end of Epub changes for 1.75.1-->
+
+<sect2 xml:id="rn_V1.75.1_Params">
+<title>Params</title>
+<para>The following changes have been made to the
+ <filename>params</filename> code
+ since the 1.75.0 release.</para>
+<itemizedlist>
+<listitem>
+<para><literal>Mauritz Jeanson: highlight.source.xml</literal></para><screen><phrase role="commit-message">Updated documentation to reflect changes made in r8419.</phrase></screen>
+</listitem>
+</itemizedlist>
+</sect2><!--end of Params changes for 1.75.1-->
+
+</sect1>
+
+
+<sect1 xml:id="V1.75.0">
+<title>Release Notes: 1.75.0</title>
+<para>This release includes important bug fixes and adds the following
+significant feature changes:
+<variablelist>
+<varlistentry>
+<term>Gentext</term>
+<listitem><para>Modifications to translations have been made. </para></listitem>
+
+</varlistentry>
+<varlistentry>
+<term>Common</term>
+<listitem>
+<para>Added support for some format properties on tables using
+HTML <tag>table</tag> markup. </para>
+<para>Added two new <parameter>qanda.defaultlabel</parameter> values so that numbered sections
+and numbered questions can be distinguished. Satisfies
+Feature Request #1539045.</para>
+<para>Added code to handle <tag>acknowledgements</tag> in <tag>book</tag> and part. The element is processed
+similarly to <tag>dedication</tag>. All <tag>acknowledgements</tag> will appear as front matter, after
+any dedications.</para>
+</listitem>
+</varlistentry>
+
+<varlistentry>
+<term>FO</term>
+<listitem>
+<para>The inclusion of highlighting code has been simplified.</para>
+<para>Add support for pgwide on informal objects.</para>
+<para>Added a new parameter, <parameter>bookmarks.collapse</parameter>, that controls the initial <tag>state</tag> of the bookmark tree. Closes FR #1792326.</para>
+<para>Add support for more dbfo processing instructions.</para>
+<para>Add new <parameter>variablelist.term.properties</parameter> to format terms, per request # 1968513.</para>
+<para>Add support for @width on <tag>screen</tag> and <tag>programlisting</tag>, fixes bug #2012736.</para>
+<para>Add support for writing-mode="rl-tb" (right-to-left) in FO outputs. </para>
+<para>Add <parameter>writing.mode</parameter> param for FO output.</para>
+</listitem>
+</varlistentry>
+<varlistentry>
+<term>HTML</term>
+<listitem>
+<para>Convert all calls to class.attribute to calls to common.html.attributes to support dir, lang, and <tag>title</tag> attributes in html output for all elements. Fulfills feature request #1993833.</para>
+<para>Inclusion of highlighting code was simplified. Only one import is now necessary.</para>
+<para>Add new param <parameter>index.links.to.section</parameter>.</para>
+<para>Add support for the new <parameter>index.links.to.section</parameter> param which permits precise links to indexterms in HTML output rather than to the <tag>section</tag> <tag>title</tag>.</para>
+</listitem>
+</varlistentry>
+<varlistentry>
+<term>ePub</term>
+<listitem>
+<para>Slightly more nuanced handling of <tag>imageobject</tag> alternatives and better support in dbtoepub for XIncludes and ENTITYs to resolve Issue #2750442 reported by Raphael Hertzog.</para>
+<para>Added a colon after an <tag>abstract</tag>/<tag>title</tag> when mapping into the dc:description for OPF metadata in ePub output to help the flat text have more pseudo-semantics (sugestions from Michael Wiedmann)</para>
+<para>Added DocBook <tag>subjectset</tag> -&gt; OPF dc:<tag>subject</tag> mapping and tests</para>
+<para>Added DocBook <tag>date</tag> -&gt; OPF dc:date mapping and tests</para>
+<para>Added DocBook <tag>abstract</tag> -&gt; OPF dc:description mapping and tests</para>
+<para>Added --output option to dbtoepub based on user request</para>
+</listitem>
+
+</varlistentry>
+<varlistentry>
+<term>HTMLHelp</term>
+<listitem>
+<para>Add support for generating <tag>olink</tag> target <tag>database</tag> for htmlhelp files.</para></listitem>
+
+</varlistentry>
+
+<varlistentry>
+<term>Params</term>
+<listitem>
+<para>Add default setting for @rules attribute on HTML markup tables.</para>
+<para>Added a new parameter, <parameter>bookmarks.collapse</parameter>, that controls the initial <tag>state</tag> of the bookmark tree. When the parameter has a non-zero value (the default), only the top-level bookmarks are displayed initially. Otherwise, the whole tree of bookmarks is displayed. This is implemented for FOP 0.9X. Closes FR #1792326.</para>
+<para>Add new <parameter>variablelist.term.properties</parameter> to format terms, per request # 1968513.</para>
+<para>Add two new <parameter>qanda.defaultlabel</parameter> values so that numbered sections and numbered questions can be distinguished. Satisfies Feature Request #1539045.</para>
+<para>Add param to control whether an <tag>index</tag> <tag>entry</tag> links to a <tag>section</tag> <tag>title</tag> or to the precise location of the <tag>indexterm</tag>.</para>
+<para>New attribute list for <tag>glossentry</tag> in <tag>glossary</tag>.</para>
+<para>New parameter to support @width on <tag>programlisting</tag> and <tag>screen</tag>.</para>
+<para>Add attribute-sets for formatting <tag>glossary</tag> terms and defs.</para>
+</listitem>
+</varlistentry>
+<varlistentry>
+<term>Highlighting</term>
+<listitem>
+<para>Inclusion of highlighting code was simplified. Only one import is now necessary.</para>
+</listitem>
+
+</varlistentry>
+</variablelist>
+
+
+</para>
+<para>The following is a list of changes that have been made
+ since the 1.74.3 release.</para>
+
+<sect2 xml:id="rn_V1.75.0_Gentext">
+<title>Gentext</title>
+<para>The following changes have been made to the
+ <filename>gentext</filename> code
+ since the 1.74.3 release.</para>
+<itemizedlist>
+<listitem>
+<para><literal>Robert Stayton: locale/sv.xml; locale/ja.xml; locale/pl.xml</literal></para><screen><phrase role="commit-message">Check in translations of <tag>Legalnotice</tag> submitted on mailing list.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Robert Stayton: locale/es.xml</literal></para><screen><phrase role="commit-message">Fix spelling errors in <tag>Acknowledgements</tag> entries.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Robert Stayton: locale/es.xml</literal></para><screen><phrase role="commit-message">Check in translations for 4 elements submitted through docbook-apps
+message of 14 April 2009.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>David Cramer: locale/zh.xml; locale/ca.xml; locale/ru.xml; locale/ga.xml; locale/gl.xml; l⋯</literal></para><screen><phrase role="commit-message">Internationalized punctuation in <tag>glosssee</tag> and <tag>glossseealso</tag></phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Robert Stayton: Makefile</literal></para><screen><phrase role="commit-message">Check in fixes for DSSSL gentext targets from submitted patch #1689633.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Robert Stayton: locale/uk.xml</literal></para><screen><phrase role="commit-message">Check in major update submitted with bug report #2008524.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Robert Stayton: locale/zh_tw.xml</literal></para><screen><phrase role="commit-message">Check in fix to Note string submitted in bug #2441051.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Robert Stayton: locale/ru.xml</literal></para><screen><phrase role="commit-message">Checkin typo fix submitted in bug #2453406.</phrase></screen>
+</listitem>
+</itemizedlist>
+</sect2><!--end of Gentext changes for 1.75.0-->
+
+<sect2 xml:id="rn_V1.75.0_Common">
+<title>Common</title>
+<para>The following changes have been made to the
+ <filename>common</filename> code
+ since the 1.74.3 release.</para>
+<itemizedlist>
+<listitem>
+<para><literal>Robert Stayton: gentext.xsl</literal></para><screen><phrase role="commit-message">Fix extra generated space when xrefstyle includes 'nopage'.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Robert Stayton: table.xsl</literal></para><screen><phrase role="commit-message">Add support for some format properties on tables using
+HTML <tag>table</tag> markup. These include:
+ - frame attribute on <tag>table</tag> (or uses $default.table.frame parameter).
+ - rules attribute on <tag>table</tag> (or uses $default.table.rules parameter).
+ - align attribute on <tag>td</tag> and <tag>th</tag>
+ - valign attribute on <tag>td</tag> and <tag>th</tag>
+ - colspan on <tag>td</tag> and <tag>th</tag>
+ - rowspan on <tag>td</tag> and <tag>th</tag>
+ - bgcolor on <tag>td</tag> and <tag>th</tag></phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Robert Stayton: olink.xsl</literal></para><screen><phrase role="commit-message">Add placeholder template to massage <tag>olink</tag> hot text to make
+customization easier, per Feature Request 1828608.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Robert Stayton: targets.xsl</literal></para><screen><phrase role="commit-message">Add support for collecting <tag>olink</tag> targets from a <tag>glossary</tag>
+generated from a <parameter>glossary.collection</parameter>.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Robert Stayton: titles.xsl</literal></para><screen><phrase role="commit-message">Handle <tag>firstterm</tag> like <tag>glossterm</tag> in mode="title.markup".</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Robert Stayton: titles.xsl</literal></para><screen><phrase role="commit-message">Add match on <tag>info</tag>/<tag>title</tag> in title.markup templates where missing.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Mauritz Jeanson: titles.xsl</literal></para><screen><phrase role="commit-message">Changed "ancestor::<tag>title</tag>" to "(ancestor::<tag>title</tag> and (@id or @xml:id))".
+This enables proper formatting of inline elements in titles in TOCs,
+as long as these inlines don't have id or xml:id attributes.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Robert Stayton: labels.xsl</literal></para><screen><phrase role="commit-message">Add two new <parameter>qanda.defaultlabel</parameter> values so that numbered sections
+and numbered questions can be distinguished. Satisfies
+Feature Request #1539045.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Robert Stayton: stripns.xsl; pi.xsl</literal></para><screen><phrase role="commit-message">Convert function-available(exsl:node-set) to use the new param
+so Xalan bug is isolated.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Mauritz Jeanson: titles.xsl</literal></para><screen><phrase role="commit-message">Added fixes for bugs #2112656 and #1759205:
+1. Reverted mistaken commits r7485 and r7523.
+2. Updated the template with match="<tag>link</tag>" and mode="no.anchor.mode" so that
+@endterm is used if it exists and if the <tag>link</tag> has no content.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Mauritz Jeanson: titles.xsl</literal></para><screen><phrase role="commit-message">Added code to handle <tag>acknowledgements</tag> in <tag>book</tag> and part. The element is processed
+similarly to <tag>dedication</tag>. All <tag>acknowledgements</tag> will appear as front matter, after
+any dedications.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Robert Stayton: olink.xsl</literal></para><screen><phrase role="commit-message">Fix bug #2018717 <parameter>use.local.olink.style</parameter> uses wrong gentext context.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Robert Stayton: olink.xsl</literal></para><screen><phrase role="commit-message">Fix bug #1787167 incorrect hot text for some olinks.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Robert Stayton: common.xsl</literal></para><screen><phrase role="commit-message">Fix bug #1669654 Broken output if <tag>copyright</tag> &lt;<tag>year</tag>&gt; contains a range.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Robert Stayton: labels.xsl</literal></para><screen><phrase role="commit-message">Fix bug in labelling <tag>figure</tag> inside <tag>appendix</tag> inside <tag>article</tag> inside <tag>book</tag>.</phrase></screen>
+</listitem>
+</itemizedlist>
+</sect2><!--end of Common changes for 1.75.0-->
+
+<sect2 xml:id="rn_V1.75.0_FO">
+<title>FO</title>
+<para>The following changes have been made to the
+ <filename>fo</filename> code
+ since the 1.74.3 release.</para>
+<itemizedlist>
+<listitem>
+<para><literal>Jirka Kosek: highlight.xsl</literal></para><screen><phrase role="commit-message">Inclusion of highlighting code was simplified. Only one import is now necessary.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Robert Stayton: fop1.xsl</literal></para><screen><phrase role="commit-message">Add the new fop extensions namespace declaration, in case FOP
+extension functions are used.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Robert Stayton: formal.xsl</literal></para><screen><phrase role="commit-message">Add support for pgwide on informal objects.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Robert Stayton: docbook.xsl</literal></para><screen><phrase role="commit-message">Fixed spurious closing <tag>quote</tag> on line 134.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Robert Stayton: docbook.xsl; autoidx-kosek.xsl; autoidx.xsl</literal></para><screen><phrase role="commit-message">Convert function-available for node-set() to use
+new $exsl.node.set.available param in test.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>David Cramer: xref.xsl</literal></para><screen><phrase role="commit-message">Suppress extra space after <tag>xref</tag> when xrefstyle='select: <tag>label</tag> nopage' (#2740472)</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Mauritz Jeanson: pi.xsl</literal></para><screen><phrase role="commit-message">Fixed doc bug for row-height.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>David Cramer: glossary.xsl</literal></para><screen><phrase role="commit-message">Internationalized punctuation in <tag>glosssee</tag> and <tag>glossseealso</tag></phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Robert Stayton: param.xweb; param.ent; htmltbl.xsl; table.xsl</literal></para><screen><phrase role="commit-message">Add support for some format properties on tables using
+HTML <tag>table</tag> markup. These include:
+ - frame attribute on <tag>table</tag> (or uses $default.table.frame parameter).
+ - rules attribute on <tag>table</tag> (or uses $default.table.rules parameter).
+ - align attribute on <tag>td</tag> and <tag>th</tag>
+ - valign attribute on <tag>td</tag> and <tag>th</tag>
+ - colspan on <tag>td</tag> and <tag>th</tag>
+ - rowspan on <tag>td</tag> and <tag>th</tag>
+ - bgcolor on <tag>td</tag> and <tag>th</tag></phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Robert Stayton: table.xsl</literal></para><screen><phrase role="commit-message">Add support bgcolor in <tag>td</tag> and <tag>th</tag>
+elements in HTML <tag>table</tag> markup.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Robert Stayton: htmltbl.xsl</literal></para><screen><phrase role="commit-message">Add support for colspan and rowspan and bgcolor in <tag>td</tag> and <tag>th</tag>
+elements in HTML <tag>table</tag> markup.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Robert Stayton: param.xweb</literal></para><screen><phrase role="commit-message">Fix working of page-master left and right margins.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Mauritz Jeanson: param.xweb; param.ent; fop1.xsl</literal></para><screen><phrase role="commit-message">Added a new parameter, <parameter>bookmarks.collapse</parameter>, that controls the initial <tag>state</tag> of the bookmark tree. When the parameter has a non-zero value (the default), only the top-level bookmarks are displayed initially. Otherwise, the whole tree of bookmarks is displayed. This is implemented for FOP 0.9X. Closes FR #1792326.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Robert Stayton: table.xsl; pi.xsl</literal></para><screen><phrase role="commit-message">Add support for dbfo row-height processing instruction, like that in dbhtml.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Robert Stayton: lists.xsl</literal></para><screen><phrase role="commit-message">Add support for dbfo keep-together processing instruction for
+entire list instances.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Robert Stayton: lists.xsl; block.xsl</literal></para><screen><phrase role="commit-message">Add support fo dbfo keep-together processing instruction to
+more blocks like list items and paras.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Robert Stayton: lists.xsl; param.xweb; param.ent</literal></para><screen><phrase role="commit-message">Add new <parameter>variablelist.term.properties</parameter> to format terms, per request # 1968513.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Robert Stayton: inline.xsl</literal></para><screen><phrase role="commit-message">In simple.xlink, rearrange order of processing.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Robert Stayton: xref.xsl</literal></para><screen><phrase role="commit-message">Handle <tag>firstterm</tag> like <tag>glossterm</tag> in mode="xref-to".</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Robert Stayton: glossary.xsl; xref.xsl; pi.xsl; footnote.xsl</literal></para><screen><phrase role="commit-message">Implement simple.xlink for <tag>glosssee</tag> and <tag>glossseealso</tag> so they can use
+other types of linking besides otherterm.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Robert Stayton: qandaset.xsl</literal></para><screen><phrase role="commit-message">Add two new <parameter>qanda.defaultlabel</parameter> values so that numbered sections and numbered questions can be distinguished. Satisfies Feature Request #1539045.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Robert Stayton: titlepage.xsl</literal></para><screen><phrase role="commit-message">For the <tag>book</tag> <tag>title</tag> templates, I changed <tag>info</tag>/<tag>title</tag> to <tag>book</tag>/<tag>info</tag>/<tag>title</tag>
+so other element's titles will not be affected.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Robert Stayton: xref.xsl; verbatim.xsl</literal></para><screen><phrase role="commit-message">Use param <parameter>exsl.node.set.available</parameter> to test for <tag>function</tag>.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Robert Stayton: param.xweb; param.ent; footnote.xsl</literal></para><screen><phrase role="commit-message">Start using new param <parameter>exsl.node.set.available</parameter> to work around Xalan bug.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Robert Stayton: titlepage.templates.xml</literal></para><screen><phrase role="commit-message">Add comment on use of t:predicate for <tag>editor</tag> to prevent
+extra processing of multiple editors. Fixes bug 2687842.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Robert Stayton: xref.xsl; autoidx.xsl</literal></para><screen><phrase role="commit-message">An <tag>indexterm</tag> <tag>primary</tag>, <tag>secondary</tag>, or <tag>tertiary</tag> element with an id or xml:id
+now outputs that ID, so that <tag>index</tag> entries can be cross referenced to.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Mauritz Jeanson: synop.xsl</literal></para><screen><phrase role="commit-message">Added modeless template for ooclass|oointerface|ooexception.
+Closes bug #1623468.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Robert Stayton: xref.xsl</literal></para><screen><phrase role="commit-message">Add template with match on <tag>indexterm</tag> in mode="xref-to" to fix bug 2102592.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Robert Stayton: xref.xsl</literal></para><screen><phrase role="commit-message">Now <tag>xref</tag> to <tag>qandaentry</tag> will use the <tag>label</tag> element in a <tag>question</tag> for
+the <tag>link</tag> text if it has one.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Robert Stayton: inline.xsl</literal></para><screen><phrase role="commit-message">Add id if specified from @id to output for <tag>quote</tag> and <tag>phrase</tag> so
+they can be <tag>xref</tag>'ed to.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Robert Stayton: xref.xsl</literal></para><screen><phrase role="commit-message">Add support for <tag>xref</tag> to <tag>phrase</tag>, <tag>simpara</tag>, <tag>anchor</tag>, and <tag>quote</tag>.
+This assumes the <tag>author</tag> specifies something using xrefstyle since
+the elements don't have ordinary <tag>link</tag> text.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Robert Stayton: toc.xsl</literal></para><screen><phrase role="commit-message">Fix bug in new <tag>toc</tag> templates.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Mauritz Jeanson: titlepage.xsl; component.xsl; division.xsl; xref.xsl; titlepage.templates⋯</literal></para><screen><phrase role="commit-message">Added code to handle <tag>acknowledgements</tag> in <tag>book</tag> and part. The element is processed
+similarly to <tag>dedication</tag>. All <tag>acknowledgements</tag> will appear as front matter, after
+any dedications.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Robert Stayton: toc.xsl</literal></para><screen><phrase role="commit-message">Rewrite <tag>toc</tag> templates to support an empty <tag>toc</tag> or populated <tag>toc</tag>
+in all permitted contexts. Same for lot elements.
+This fixes bug #1595969 for FO outputs.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Robert Stayton: index.xsl</literal></para><screen><phrase role="commit-message">Fix indents for <tag>seealsoie</tag> so they are consistent.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Mauritz Jeanson: param.xweb</literal></para><screen><phrase role="commit-message">Removed duplicate (<parameter>monospace.font.family</parameter>).</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Robert Stayton: param.xweb; param.ent</literal></para><screen><phrase role="commit-message">Add <parameter>glossentry.list.item.properties</parameter>.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Robert Stayton: param.xweb; param.ent</literal></para><screen><phrase role="commit-message">Add <parameter>monospace.verbatim.font.width</parameter> param to support @width on <tag>programlisting</tag>.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Robert Stayton: verbatim.xsl</literal></para><screen><phrase role="commit-message">Put <tag>programlisting</tag> in fo:block-container with writing-mode="lr-tb"
+when text direction is right to left because all program languages
+are left-to-right.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Robert Stayton: verbatim.xsl</literal></para><screen><phrase role="commit-message">Add support for @width on <tag>screen</tag> and <tag>programlisting</tag>, fixes bug #2012736.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Robert Stayton: xref.xsl</literal></para><screen><phrase role="commit-message">Fix bug #1973585 <tag>xref</tag> to <tag>para</tag> with xrefstyle not handled correctly.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Mauritz Jeanson: block.xsl</literal></para><screen><phrase role="commit-message">Added support for <tag>acknowledgements</tag> in <tag>article</tag>.
+Support in <tag>book</tag>/part remains to be added.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Robert Stayton: xref.xsl</literal></para><screen><phrase role="commit-message">Fix bug #1787167 incorrect hot text for some olinks.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Robert Stayton: fo.xsl</literal></para><screen><phrase role="commit-message">Add writing-mode="tb-rl" as well since some XSL-FO processors support it.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Robert Stayton: autotoc.xsl; lists.xsl; glossary.xsl; fo.xsl; table.xsl; pagesetup.xsl</literal></para><screen><phrase role="commit-message">Add support for writing-mode="rl-tb" (right-to-left) in FO outputs.
+Changed instances of margin-left to margin-{$direction.align.start}
+and margin-right to margin-{$direction.align.end}. Those direction.align
+params are computed from the writing mode value in each locale's
+gentext key named 'writing-mode', introduced in 1.74.3 to add
+right-to-left support to HTML outputs.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Robert Stayton: param.xweb; param.ent</literal></para><screen><phrase role="commit-message">Add attribute-sets for formatting <tag>glossary</tag> terms and defs.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Robert Stayton: param.xweb; param.ent</literal></para><screen><phrase role="commit-message">Add <parameter>writing.mode</parameter> param for FO output.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Robert Stayton: autotoc.xsl</literal></para><screen><phrase role="commit-message">Fix bug 1546008: in <tag>qandaentry</tag> in a <tag>TOC</tag>, use its blockinfo/<tag>titleabbrev</tag> or blockinfo/<tag>title</tag>
+instead of <tag>question</tag>, if available. For DocBook 5, use the <tag>info</tag> versions.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Keith Fahlgren: verbatim.xsl</literal></para><screen><phrase role="commit-message">Add better pointer to README for XSLTHL</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Keith Fahlgren: verbatim.xsl</literal></para><screen><phrase role="commit-message">More tweaking the way that XSLTHL does or does not get called</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Keith Fahlgren: verbatim.xsl</literal></para><screen><phrase role="commit-message">Alternate attempt at sanely including/excluding XSLTHT code</phrase></screen>
+</listitem>
+</itemizedlist>
+</sect2><!--end of FO changes for 1.75.0-->
+
+<sect2 xml:id="rn_V1.75.0_HTML">
+<title>HTML</title>
+<para>The following changes have been made to the
+ <filename>html</filename> code
+ since the 1.74.3 release.</para>
+<itemizedlist>
+<listitem>
+<para><literal>Robert Stayton: lists.xsl</literal></para><screen><phrase role="commit-message">Removed redundant lang and <tag>title</tag> attributes on list element inside
+div element for lists.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Robert Stayton: inline.xsl; titlepage.xsl; division.xsl; toc.xsl; sections.xsl; table.xsl;⋯</literal></para><screen><phrase role="commit-message">Convert all calls to class.attribute to calls to common.html.attributes
+to support dir, lang, and <tag>title</tag> attributes in html output for all elements.
+Fulfills feature request #1993833.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Robert Stayton: chunk-common.xsl</literal></para><screen><phrase role="commit-message">Fix bug #2750253 wrong links in list of figures in chunk.html
+when target html is in a subdirectory and dbhtml <tag>filename</tag> used.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Jirka Kosek: highlight.xsl</literal></para><screen><phrase role="commit-message">Inclusion of highlighting code was simplified. Only one import is now necessary.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Robert Stayton: chunk-common.xsl; chunktoc.xsl; docbook.xsl; chunk-changebars.xsl; autoidx⋯</literal></para><screen><phrase role="commit-message">Convert function-available for node-set() to use
+new $exsl.node.set.available param in test.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Mauritz Jeanson: pi.xsl</literal></para><screen><phrase role="commit-message">Fixed doc bug for row-height.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>David Cramer: glossary.xsl</literal></para><screen><phrase role="commit-message">Internationalized punctuation in <tag>glosssee</tag> and <tag>glossseealso</tag></phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Robert Stayton: lists.xsl; html.xsl; block.xsl</literal></para><screen><phrase role="commit-message">More elements get common.html.attributes.
+Added locale.html.attributes template which does the lang,
+dir, and <tag>title</tag> attributes, but not the class attribute
+(used on <tag>para</tag>, for example).</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Robert Stayton: lists.xsl</literal></para><screen><phrase role="commit-message">Replace more <tag>literal</tag> class atts with mode="class.attribute" to support
+easier customization.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Robert Stayton: glossary.xsl</literal></para><screen><phrase role="commit-message">Support olinking in <tag>glosssee</tag> and <tag>glossseealso</tag>.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Robert Stayton: inline.xsl</literal></para><screen><phrase role="commit-message">In simple.xlink, rearrange order of processing.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Robert Stayton: xref.xsl</literal></para><screen><phrase role="commit-message">Handle <tag>firstterm</tag> like <tag>glossterm</tag> in mode="xref-to".</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Robert Stayton: lists.xsl; html.xsl; block.xsl</literal></para><screen><phrase role="commit-message">Added template named common.html.attributes to output
+class, <tag>title</tag>, lang, and dir for most elements.
+Started adding it to some list and block elements.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Robert Stayton: qandaset.xsl</literal></para><screen><phrase role="commit-message">Add two new <parameter>qanda.defaultlabel</parameter> values so that numbered sections
+and numbered questions can be distinguished. Satisfies
+Feature Request #1539045.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Robert Stayton: param.xweb; chunk-code.xsl; param.ent; xref.xsl; chunkfast.xsl; verbatim.x⋯</literal></para><screen><phrase role="commit-message">Use new param <parameter>exsl.node.set.available</parameter> to test, handles Xalan bug.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Robert Stayton: autoidx.xsl</literal></para><screen><phrase role="commit-message">Use named anchors for <tag>primary</tag>, <tag>secondary</tag>, and <tag>tertiary</tag> ids so
+duplicate entries with different ids can still have an id output.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Robert Stayton: param.xweb; param.ent</literal></para><screen><phrase role="commit-message">Add new param <parameter>index.links.to.section</parameter>.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Robert Stayton: xref.xsl; autoidx.xsl</literal></para><screen><phrase role="commit-message">Pass through an id on <tag>primary</tag>, <tag>secondary</tag>, or <tag>tertiary</tag> to
+the <tag>index</tag> <tag>entry</tag>, so that one could <tag>link</tag> to an <tag>index</tag> <tag>entry</tag>.
+You can't <tag>link</tag> to the id on an <tag>indexterm</tag> because that is
+used to place the main <tag>anchor</tag> in the text flow.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Robert Stayton: autoidx.xsl</literal></para><screen><phrase role="commit-message">Add support for the new <parameter>index.links.to.section</parameter> param which permits
+precise links to indexterms in HTML output rather than to
+the <tag>section</tag> <tag>title</tag>.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Mauritz Jeanson: synop.xsl</literal></para><screen><phrase role="commit-message">Added modeless template for ooclass|oointerface|ooexception.
+Closes bug #1623468.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Robert Stayton: qandaset.xsl</literal></para><screen><phrase role="commit-message">Make sure a <tag>qandaset</tag> has an <tag>anchor</tag>, even when it has no <tag>title</tag>,
+because it may be referenced in a <tag>TOC</tag> or <tag>xref</tag>.
+Before, the <tag>anchor</tag> was output by the <tag>title</tag>, but there was no
+<tag>anchor</tag> if there was no <tag>title</tag>.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Robert Stayton: xref.xsl</literal></para><screen><phrase role="commit-message">Add a template for <tag>indexterm</tag> with mode="xref-to" to fix bug 2102592.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Robert Stayton: xref.xsl</literal></para><screen><phrase role="commit-message">Now <tag>xref</tag> to <tag>qandaentry</tag> will use the <tag>label</tag> element in a <tag>question</tag> for
+the <tag>link</tag> text if it has one.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Robert Stayton: qandaset.xsl; html.xsl</literal></para><screen><phrase role="commit-message">Create separate templates for computing <tag>label</tag> of <tag>question</tag> and <tag>answer</tag>
+in a <tag>qandaentry</tag>, so such can be used for the <tag>alt</tag> text of an <tag>xref</tag>
+to a <tag>qandaentry</tag>.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Robert Stayton: inline.xsl; xref.xsl</literal></para><screen><phrase role="commit-message">Now support <tag>xref</tag> to <tag>phrase</tag>, <tag>simpara</tag>, <tag>anchor</tag>, and <tag>quote</tag>,
+most useful when an xrefstyle is used.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Robert Stayton: toc.xsl</literal></para><screen><phrase role="commit-message">Rewrite <tag>toc</tag> templates to support an empty <tag>toc</tag> or populated <tag>toc</tag>
+in all permitted contexts. Same for lot elements.
+This fixes bug #1595969 for HTML outputs.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Mauritz Jeanson: titlepage.xsl; component.xsl; division.xsl; xref.xsl; titlepage.templates⋯</literal></para><screen><phrase role="commit-message">Added code to handle <tag>acknowledgements</tag> in <tag>book</tag> and part. The element is processed
+similarly to <tag>dedication</tag>. All <tag>acknowledgements</tag> will appear as front matter, after
+any dedications.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Robert Stayton: index.xsl</literal></para><screen><phrase role="commit-message">Rewrote <tag>primaryie</tag>, <tag>secondaryie</tag> and <tag>tertiaryie</tag> templates to handle
+nesting of elements and <tag>seeie</tag> and <tag>seealsoie</tag>, as reported in
+bug # 1168912.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Robert Stayton: autotoc.xsl</literal></para><screen><phrase role="commit-message">Fix <tag>simplesect</tag> in <tag>toc</tag> problem.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Robert Stayton: verbatim.xsl</literal></para><screen><phrase role="commit-message">Add support for @width per bug report #2012736.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Robert Stayton: formal.xsl; htmltbl.xsl</literal></para><screen><phrase role="commit-message">Fix bug #1787140 HTML tables not handling attributes correctly.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Robert Stayton: param.xweb</literal></para><screen><phrase role="commit-message">Move writing-mode param.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Keith Fahlgren: refentry.xsl</literal></para><screen><phrase role="commit-message">Remove a nesting of &lt;p&gt; inside &lt;p&gt; for <tag>refclass</tag> (made XHTML* invalid, made HTML silly)</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Robert Stayton: table.xsl</literal></para><screen><phrase role="commit-message">Fix bug #1945872 to allow passthrough of colwidth values to
+HTML <tag>table</tag> when no <parameter>tablecolumns.extension</parameter> is available and
+when no instance of * appears in the <tag>table</tag>'s colspecs.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Mauritz Jeanson: block.xsl</literal></para><screen><phrase role="commit-message">Added support for <tag>acknowledgements</tag> in <tag>article</tag>.
+Support in <tag>book</tag>/part remains to be added.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Robert Stayton: chunk-common.xsl</literal></para><screen><phrase role="commit-message">Fix bug #1787167 incorrect hot text for some olinks.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Robert Stayton: qandaset.xsl</literal></para><screen><phrase role="commit-message">Fix bug 1546008: in <tag>qandaentry</tag> in a <tag>TOC</tag>, use its blockinfo/<tag>titleabbrev</tag> or blockinfo/<tag>title</tag>
+instead of <tag>question</tag>, if available. For DocBook 5, use the <tag>info</tag> versions.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Robert Stayton: chunktoc.xsl</literal></para><screen><phrase role="commit-message">Add support for generating <tag>olink</tag> <tag>database</tag> when using chunktoc.xsl.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Keith Fahlgren: verbatim.xsl</literal></para><screen><phrase role="commit-message">Add better pointer to README for XSLTHL</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Keith Fahlgren: verbatim.xsl</literal></para><screen><phrase role="commit-message">Another stab at fixing the stupid XSLTHT includes across processors (Saxon regression reported by Sorin Ristache)</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Keith Fahlgren: verbatim.xsl</literal></para><screen><phrase role="commit-message">More tweaking the way that XSLTHL does or does not get called</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Keith Fahlgren: verbatim.xsl</literal></para><screen><phrase role="commit-message">Alternate attempt at sanely including/excluding XSLTHT code</phrase></screen>
+</listitem>
+</itemizedlist>
+</sect2><!--end of HTML changes for 1.75.0-->
+
+<sect2 xml:id="rn_V1.75.0_Manpages">
+<title>Manpages</title>
+<para>The following changes have been made to the
+ <filename>manpages</filename> code
+ since the 1.74.3 release.</para>
+<itemizedlist>
+<listitem>
+<para><literal>Robert Stayton: table.xsl</literal></para><screen><phrase role="commit-message">Convert function-available test for node-set() <tag>function</tag> to
+test of $exsl.node.set.available param.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Mauritz Jeanson: lists.xsl</literal></para><screen><phrase role="commit-message">Added a template for <tag>bibliolist</tag>. Closes bug #1815916.</phrase></screen>
+</listitem>
+</itemizedlist>
+</sect2><!--end of Manpages changes for 1.75.0-->
+
+<sect2 xml:id="rn_V1.75.0_Epub">
+<title>ePub</title>
+<para>The following changes have been made to the
+ <filename>epub</filename> code
+ since the 1.74.3 release.</para>
+<itemizedlist>
+<listitem>
+<para><literal>Keith Fahlgren: bin/spec/epub_regressions_spec.rb; bin/spec/files/onegraphic.xinclude.xml;⋯</literal></para><screen><phrase role="commit-message">Slightly more nuanced handling of <tag>imageobject</tag> alternatives and better support in dbtoepub for XIncludes and ENTITYs to resolve Issue #2750442 reported by Raphael Hertzog.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Keith Fahlgren: docbook.xsl</literal></para><screen><phrase role="commit-message">Add a colon after an <tag>abstract</tag>/<tag>title</tag> when mapping into the dc:description for OPF metadata in ePub output to help the flat text have more pseudo-semantics (sugestions from Michael Wiedmann)</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Keith Fahlgren: bin/spec/epub_regressions_spec.rb; docbook.xsl; bin/spec/files/de.xml</literal></para><screen><phrase role="commit-message">Correctly set dc:language in OPF metadata when i18nizing. Closes Bug #2755150</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Keith Fahlgren: bin/spec/epub_regressions_spec.rb; docbook.xsl</literal></para><screen><phrase role="commit-message">Corrected namespace declarations for <tag>literal</tag> XHTML elements to make them serialize "normally"</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Keith Fahlgren: docbook.xsl</literal></para><screen><phrase role="commit-message">Be a little bit more nuanced about dates</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Keith Fahlgren: docbook.xsl; bin/spec/epub_realbook_spec.rb; bin/spec/files/orm.book.001.x⋯</literal></para><screen><phrase role="commit-message">Add DocBook <tag>subjectset</tag> -&gt; OPF dc:<tag>subject</tag> mapping and tests</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Keith Fahlgren: docbook.xsl; bin/spec/epub_realbook_spec.rb; bin/spec/files/orm.book.001.x⋯</literal></para><screen><phrase role="commit-message">Add DocBook <tag>date</tag> -&gt; OPF dc:date mapping and tests</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Keith Fahlgren: docbook.xsl; bin/spec/epub_realbook_spec.rb; bin/spec/files/orm.book.001.x⋯</literal></para><screen><phrase role="commit-message">Add DocBook <tag>abstract</tag> -&gt; OPF dc:description mapping and tests</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Robert Stayton: docbook.xsl</literal></para><screen><phrase role="commit-message">Check in patch submitted by user to add opf:file-as attribute
+to dc:creator element.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Keith Fahlgren: bin/dbtoepub</literal></para><screen><phrase role="commit-message">Adding --output option to dbtoepub based on user request</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Keith Fahlgren: docbook.xsl; bin/spec/epub_spec.rb</literal></para><screen><phrase role="commit-message">Cleaning and regularizing the generation of namespaced nodes for OPF, NCX, XHTML and other outputted filetypes (hat <tag>tip</tag> to bobstayton for pointing out the silly, incorrect code)</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Keith Fahlgren: bin/spec/epub_regressions_spec.rb; bin/spec/files/refclass.xml</literal></para><screen><phrase role="commit-message">Remove a nesting of &lt;p&gt; inside &lt;p&gt; for <tag>refclass</tag> (made XHTML* invalid, made HTML silly)</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Keith Fahlgren: bin/spec/epub_regressions_spec.rb; bin/spec/files/blockquotepre.xml</literal></para><screen><phrase role="commit-message">Added regression test and fix for XHTML validation problem with &lt;a&gt;s added inside &lt;<tag>blockquote</tag>&gt;; This potentially causes another problem (where something is referenced by has no <tag>anchor</tag>, but someone reporting that should cause the whole &lt;a id='thing'/&gt; thing to be reconsidered with modern browsers in mind.</phrase></screen>
+</listitem>
+</itemizedlist>
+</sect2><!--end of Epub changes for 1.75.0-->
+
+<sect2 xml:id="rn_V1.75.0_HTMLHelp">
+<title>HTMLHelp</title>
+<para>The following changes have been made to the
+ <filename>htmlhelp</filename> code
+ since the 1.74.3 release.</para>
+<itemizedlist>
+<listitem>
+<para><literal>Robert Stayton: htmlhelp-common.xsl</literal></para><screen><phrase role="commit-message">Add support for generating <tag>olink</tag> target <tag>database</tag> for htmlhelp files.</phrase></screen>
+</listitem>
+</itemizedlist>
+</sect2><!--end of HTMLHelp changes for 1.75.0-->
+
+
+<sect2 xml:id="rn_V1.75.0_Params">
+<title>Params</title>
+<para>The following changes have been made to the
+ <filename>params</filename> code
+ since the 1.74.3 release.</para>
+<itemizedlist>
+<listitem>
+<para><literal>Robert Stayton: default.table.rules.xml</literal></para><screen><phrase role="commit-message">Add default setting for @rules attribute on HTML markup tables.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Mauritz Jeanson: bookmarks.collapse.xml</literal></para><screen><phrase role="commit-message">Added a new parameter, <parameter>bookmarks.collapse</parameter>, that controls the initial <tag>state</tag>
+of the bookmark tree. When the parameter has a non-zero value (the default),
+only the top-level bookmarks are displayed initially. Otherwise, the whole
+tree of bookmarks is displayed.
+
+This is implemented for FOP 0.9X. Closes FR #1792326.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Robert Stayton: variablelist.term.properties.xml</literal></para><screen><phrase role="commit-message">Add new <parameter>variablelist.term.properties</parameter> to format terms, per
+request # 1968513.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Robert Stayton: qanda.defaultlabel.xml</literal></para><screen><phrase role="commit-message">Add two new <parameter>qanda.defaultlabel</parameter> values so that numbered sections
+and numbered questions can be distinguished. Satisfies
+Feature Request #1539045.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Robert Stayton: index.links.to.section.xml</literal></para><screen><phrase role="commit-message">Change default to 1 to match past behavior.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Robert Stayton: exsl.node.set.available.xml</literal></para><screen><phrase role="commit-message">Isolate this text for Xalan bug regarding exsl:node-set available.
+If it is ever fixed in Xalan, just fix it here.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Robert Stayton: index.links.to.section.xml</literal></para><screen><phrase role="commit-message">Add param to control whether an <tag>index</tag> <tag>entry</tag> links to
+a <tag>section</tag> <tag>title</tag> or to the precise location of the
+<tag>indexterm</tag>.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Robert Stayton: glossentry.list.item.properties.xml</literal></para><screen><phrase role="commit-message">New attribute list for <tag>glossentry</tag> in <tag>glossary</tag>.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Robert Stayton: monospace.verbatim.font.width.xml</literal></para><screen><phrase role="commit-message">New parameter to support @width on <tag>programlisting</tag> and <tag>screen</tag>.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Mauritz Jeanson: highlight.source.xml</literal></para><screen><phrase role="commit-message">Updated and reorganized the description.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Robert Stayton: page.margin.outer.xml; page.margin.inner.xml</literal></para><screen><phrase role="commit-message">Add caveat about XEP bug when writing-mode is right-to-left.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Robert Stayton: article.appendix.title.properties.xml; writing.mode.xml; body.start.indent⋯</literal></para><screen><phrase role="commit-message">Change 'left' to 'start' and 'right' to 'end' to support right-to-left
+writing mode.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Robert Stayton: glossdef.block.properties.xml; glossdef.list.properties.xml; glossterm.blo⋯</literal></para><screen><phrase role="commit-message">Add attribute-sets for formatting <tag>glossary</tag> terms and defs.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Robert Stayton: glossterm.separation.xml</literal></para><screen><phrase role="commit-message">Clarify the description.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Robert Stayton: make.year.ranges.xml</literal></para><screen><phrase role="commit-message">Now handles <tag>year</tag> element containing a comma or dash without error.</phrase></screen>
+</listitem>
+</itemizedlist>
+</sect2><!--end of Params changes for 1.75.0-->
+
+<sect2 xml:id="rn_V1.75.0_Highlighting">
+<title>Highlighting</title>
+<para>The following changes have been made to the
+ <filename>highlighting</filename> code
+ since the 1.74.3 release.</para>
+<itemizedlist>
+<listitem>
+<para><literal>Jirka Kosek: README</literal></para><screen><phrase role="commit-message">Inclusion of highlighting code was simplified. Only one import is now necessary.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Keith Fahlgren: README</literal></para><screen><phrase role="commit-message">Adding XSLTHL readme</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Keith Fahlgren: common.xsl</literal></para><screen><phrase role="commit-message">Alternate attempt at sanely including/excluding XSLTHT code</phrase></screen>
+</listitem>
+</itemizedlist>
+</sect2><!--end of Highlighting changes for 1.75.0-->
+
+<sect2 xml:id="rn_V1.75.0_XSL-Saxon">
+<title>XSL-Saxon</title>
+<para>The following changes have been made to the
+ <filename>xsl-saxon</filename> code
+ since the 1.74.3 release.</para>
+<itemizedlist>
+<listitem>
+<para><literal>Mauritz Jeanson: src/com/nwalsh/saxon/Text.java</literal></para><screen><phrase role="commit-message">Added a fix that prevents output of extra blank line.
+Hopefully this closes bug #894805.</phrase></screen>
+</listitem>
+</itemizedlist>
+</sect2><!--end of XSL-Saxon changes for 1.75.0-->
+
+<sect2 xml:id="rn_V1.75.0_XSL-Xalan">
+<title>XSL-Xalan</title>
+<para>The following changes have been made to the
+ <filename>xsl-xalan</filename> code
+ since the 1.74.3 release.</para>
+<itemizedlist>
+<listitem>
+<para><literal>Mauritz Jeanson: src/com/nwalsh/xalan/Text.java</literal></para><screen><phrase role="commit-message">Added a fix that prevents output of extra blank line.
+Hopefully this closes bug #894805.</phrase></screen>
+</listitem>
+</itemizedlist>
+</sect2><!--end of XSL-Xalan changes for 1.75.0-->
+
+
+</sect1>
+
+<sect1 xml:id="V1.74.3">
+<title>Release Notes: 1.74.3</title>
+<para>This release fixes some bugs in the 1.74.2 release.</para>
+<para>See <filename>highlighting/README</filename> for XSLTHL usage instructions.</para>
+</sect1>
+<sect1 xml:id="V1.74.2">
+<title>Release Notes: 1.74.2</title>
+<para>This release fixes some bugs in the 1.74.1 release.</para>
+</sect1>
+
+<sect1 xml:id="V1.74.1">
+<title>Release Notes: 1.74.1</title>
+<para>This release includes important bug fixes and adds the following
+significant feature changes:
+<variablelist>
+<varlistentry>
+<term>Gentext</term>
+<listitem><para>Kirghiz locale added and Chinese translations have been simplified.</para></listitem>
+<listitem><para>Somme support for gentext and right-to-left languages has been added.</para></listitem>
+</varlistentry>
+<varlistentry>
+<term>FO</term>
+<listitem><para>Various bugs have been resolved. </para> </listitem>
+<listitem><para>Support for a new processing instruction: <markup>dbfo funcsynopsis-style</markup> has been added. </para> </listitem>
+<listitem><para>Added new param <parameter>email.mailto.enabled</parameter> for FO output. Patch from Paolo Borelli. </para>
+</listitem>
+<listitem><para>Support for documented metadata in fop1 mode has been added. </para>
+</listitem>
+
+</varlistentry>
+<varlistentry>
+<term>Highlighting</term>
+<listitem><para>Support for the latest version of XSLTHL 2.0 and some new language syntaxes have been added to a variety of outputs.</para></listitem>
+
+</varlistentry>
+
+<varlistentry>
+<term>Manpages</term>
+<listitem><para>Added man.output.better.ps.enabled param (zero default). It non-zero, no such
+markup is embedded in generated man pages, and no enhancements are
+included in the PostScript output generated from those man pages
+by the man -Tps <tag>command</tag>.</para></listitem>
+
+</varlistentry>
+
+
+<varlistentry>
+<term>HTML</term>
+<listitem><para>Support for <parameter>writing.mode</parameter> to set text direction and <parameter>alignment</parameter> based on document locale has been added.</para></listitem>
+<listitem>
+<para>Added a new top-level stylesheet module, chunk-changebars.xsl, to be
+used for generating chunked output with highlighting based on change
+(@revisionflag) markup. The module imports/includes the standard chunking
+and changebars templates and contains additional logic for chunked output.
+See FRs #1015180 and #1819915.</para>
+</listitem>
+
+</varlistentry>
+<varlistentry>
+<term>ePub</term>
+<listitem>
+<para>Covers now look better in Adobe Digital Editions thanks to a patch from Paul Norton of Adobe</para>
+</listitem>
+<listitem><para>Cover handling now more generic (including limited DocBook 5.0 <markup>cover</markup> support thanks to patch contributed by Liza Daly.</para> </listitem>
+<listitem><para>Cover markup now carries more reliably into files destined for .mobi and the Kindle.</para> </listitem>
+<listitem><para><markup>dc:identifiers</markup> are now generated from more types of numbering schemes. </para></listitem>
+<listitem><para>Both SEO and semantic structure of chunked ePub output by ensuring that we always send out one and only one h1 in each XHTML chunk.</para></listitem>
+<listitem>
+<para>Primitive support for embedding a single font added.</para>
+</listitem>
+<listitem>
+<para>Support for embedding a CSS customizations added.</para>
+</listitem>
+
+</varlistentry>
+
+<varlistentry>
+<term>Roundtrip</term>
+
+<listitem>
+<para>Support for imagedata-metadata and <tag>table</tag> as images added.</para>
+</listitem>
+<listitem>
+<para>Support for imagedata-metadata and <tag>legalnotice</tag> as images added.</para>
+</listitem>
+</varlistentry>
+
+<varlistentry>
+<term>Params</term>
+<listitem><para><parameter>man.output.better.ps.enabled</parameter> added for Manpages output </para></listitem>
+<listitem>
+<para><parameter>writing.mode.xml</parameter> added to set text direction.</para>
+</listitem>
+<listitem>
+<para>Added new param <parameter>email.mailto.enabled</parameter> for FO output.
+Patch from Paolo Borelli. Closes #2086321.</para>
+</listitem>
+<listitem>
+<para><parameter>highlight.source</parameter> upgraded to support the latest version of XSLTHL 2.0.</para>
+</listitem>
+
+</varlistentry>
+
+
+
+</variablelist>
+</para>
+<para>The following is a list of changes that have been made since the 1.74.0 release.</para>
+
+
+<sect2 xml:id="summary_V1.74.1_Gentext">
+<title>Gentext</title>
+<para>The following changes have been made to the <filename>gentext</filename> code since the 1.74.0 release.</para>
+<itemizedlist>
+<listitem>
+<para><literal>Michael(tm) Smith: locale/ky.xml; Makefile</literal></para><screen><phrase role="commit-message">new Kirghiz locale from Ilyas Bakirov</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Mauritz Jeanson: locale/en.xml</literal></para><screen><phrase role="commit-message">Added "<tag>Acknowledgements</tag>".</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Dongsheng Song: locale/zh_cn.xml</literal></para><screen><phrase role="commit-message">Simplified Chinese translation.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Robert Stayton: locale/lv.xml; locale/ca.xml; locale/pt.xml; locale/tr.xml; locale/af.xml;⋯</literal></para><screen><phrase role="commit-message">Add writing-mode gentext string to support right-to-left languages.</phrase></screen>
+</listitem>
+</itemizedlist>
+</sect2><!--end of Gentext changes for 1.74.1-->
+
+<sect2 xml:id="summary_V1.74.1_FO">
+<title>FO</title>
+<para>The following changes have been made to the <filename>fo</filename> code since the 1.74.0 release.</para>
+<itemizedlist>
+<listitem>
+<para><literal>David Cramer: footnote.xsl</literal></para><screen><phrase role="commit-message">Added a check to confirm that a <tag>footnoteref</tag>'s linkend points to a <tag>footnote</tag>. Stylesheets stop processing if not and provide a useful error message.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Mauritz Jeanson: spaces.xsl</literal></para><screen><phrase role="commit-message">Convert spaces to fo:leader also in elements in the DB 5 namespace.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Mauritz Jeanson: pi.xsl; synop.xsl</literal></para><screen><phrase role="commit-message">Added support for a new processing instruction: dbfo funcsynopsis-style.
+Closes bug #1838213.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Michael(tm) Smith: inline.xsl; param.xweb; param.ent</literal></para><screen><phrase role="commit-message">Added new param <parameter>email.mailto.enabled</parameter> for FO output.
+Patch from Paolo Borelli. Closes #2086321.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Mauritz Jeanson: docbook.xsl</literal></para><screen><phrase role="commit-message">Added support for document metadata for fop1 (patch #2067318).</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Jirka Kosek: param.ent; param.xweb; highlight.xsl</literal></para><screen><phrase role="commit-message">Upgraded to support the latest version of XSLTHL 2.0
+ -- nested markup in highlited code is now processed
+ -- it is no longer needed to specify path XSLTHL configuration file using Java property
+ -- support for new languages, including Perl, Python and Ruby was added</phrase></screen>
+</listitem>
+</itemizedlist>
+</sect2><!--end of FO changes for 1.74.1-->
+
+<sect2 xml:id="summary_V1.74.1_HTML">
+<title>HTML</title>
+<para>The following changes have been made to the <filename>html</filename> code since the 1.74.0 release.</para>
+<itemizedlist>
+<listitem>
+<para><literal>Robert Stayton: param.xweb; docbook.xsl; param.ent; html.xsl</literal></para><screen><phrase role="commit-message">Add support for <parameter>writing.mode</parameter> to set text direction and <parameter>alignment</parameter> based on document locale.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Mauritz Jeanson: chunk-changebars.xsl</literal></para><screen><phrase role="commit-message">Added a new top-level stylesheet module, chunk-changebars.xsl, to be
+used for generating chunked output with highlighting based on change
+(@revisionflag) markup. The module imports/includes the standard chunking
+and changebars templates and contains additional logic for chunked output.
+See FRs #1015180 and #1819915.</phrase></screen>
+</listitem>
+</itemizedlist>
+</sect2><!--end of HTML changes for 1.74.1-->
+
+<sect2 xml:id="summary_V1.74.1_Manpages">
+<title>Manpages</title>
+<para>The following changes have been made to the <filename>manpages</filename> code since the 1.74.0 release.</para>
+<itemizedlist>
+<listitem>
+<para><literal>Michael(tm) Smith: docbook.xsl</literal></para><screen><phrase role="commit-message">Put the following at the top of generated roff for each page:
+ \" t
+purpose is to explicitly tell AT&amp;T troff that the page needs to be
+pre-processed through tbl(1); groff can <tag>figure</tag> it out
+automatically, but apparently AT&amp;T troff needs to be explicitly told</phrase></screen>
+</listitem>
+</itemizedlist>
+</sect2><!--end of Manpages changes for 1.74.1-->
+
+<sect2 xml:id="summary_V1.74.1_Epub">
+<title>ePub</title>
+<para>The following changes have been made to the <filename>epub</filename> code since the 1.74.0 release.</para>
+<itemizedlist>
+<listitem>
+<para><literal>Keith Fahlgren: docbook.xsl</literal></para><screen><phrase role="commit-message">Patch from Paul Norton of Adobe to get covers to look better in Adobe Digital Editions</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Keith Fahlgren: bin/spec/epub_regressions_spec.rb; bin/spec/files/v5cover.xml; bin/spec/sp⋯</literal></para><screen><phrase role="commit-message">Patch contributed by Liza Daly to make ePub <tag>cover</tag> handling more generic. Additionally
+DocBook 5.0's &lt;<tag>cover</tag>&gt; now has some limited support:
+
+- should <tag>reference</tag> a <tag>cover</tag> in the OPF guide for a DocBook 5.0 test document</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Keith Fahlgren: bin/spec/files/isbn.xml; bin/spec/files/issn.xml; bin/spec/files/biblioid.⋯</literal></para><screen><phrase role="commit-message">Liza Daly reported that the dc:identifer-generation code was garbage (she was right).
+
+Added new tests:
+- should include at least one dc:identifier
+- should include an ISBN as URN for dc:identifier if an ISBN was in the metadata
+- should include an ISSN as URN for dc:identifier if an ISSN was in the metadata
+- should include an <tag>biblioid</tag> as a dc:identifier if an <tag>biblioid</tag> was in the metadata
+- should include a URN for a <tag>biblioid</tag> with @class attribute as a dc:identifier if an <tag>biblioid</tag> was in the metadata</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Keith Fahlgren: docbook.xsl; bin/spec/epub_spec.rb</literal></para><screen><phrase role="commit-message">Improve both SEO and semantic structure of chunked ePub output by ensuring that
+we always send out one and only one h1 in each XHTML chunk.
+
+DocBook::Epub
+- should include one and only one &lt;h1&gt; in each HTML file in rendered ePub files
+for &lt;<tag>book</tag>&gt;s
+- should include one and only one &lt;h1&gt; in each HTML file in rendered ePub files
+for &lt;<tag>book</tag>&gt;s even if they do not have <tag>section</tag> markup</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Keith Fahlgren: docbook.xsl; bin/spec/epub_realbook_spec.rb; bin/spec/files/orm.book.001.x⋯</literal></para><screen><phrase role="commit-message">Adding better support for covers in epub files destined for .mobi and the Kindle</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Keith Fahlgren: bin/dbtoepub; bin/lib/docbook.rb; bin/spec/files/DejaVuSerif.otf; docbook.⋯</literal></para><screen><phrase role="commit-message">Adding primitive support for embedding a single font</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Keith Fahlgren: bin/dbtoepub; bin/lib/docbook.rb; bin/spec/files/test_cust.xsl; bin/spec/e⋯</literal></para><screen><phrase role="commit-message">Adding support for user-specified customization layers in dbtoepub</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Keith Fahlgren: bin/dbtoepub; bin/spec/epub_regressions_spec.rb; bin/lib/docbook.rb; bin/s⋯</literal></para><screen><phrase role="commit-message">Adding CSS support to .epub target &amp; dbtoepub:
+ -c, --css [FILE] Use FILE for CSS on generated XHTML.
+
+
+DocBook::Epub
+...
+- should include a CSS <tag>link</tag> in HTML files when a CSS file has been provided
+- should include CSS file in .epub when a CSS file has been provided
+- should include a CSS <tag>link</tag> in OPF file when a CSS file has been provided</phrase></screen>
+</listitem>
+</itemizedlist>
+</sect2><!--end of Epub changes for 1.74.1-->
+
+<sect2 xml:id="summary_V1.74.1_Roundtrip">
+<title>Roundtrip</title>
+<para>The following changes have been made to the
+ <filename>roundtrip</filename> code
+ since the 1.74.0 release.</para>
+<itemizedlist>
+<listitem>
+<para><literal>Steve Ball: blocks2dbk.xsl; template.xml; template.dot</literal></para><screen><phrase role="commit-message">added support for imagedata-metadata
+added support for <tag>table</tag> as images</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Steve Ball: blocks2dbk.xsl; normalise2sections.xsl; sections2blocks.xsl</literal></para><screen><phrase role="commit-message">Improved support for <tag>personname</tag> inlines.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Steve Ball: blocks2dbk.xsl; blocks2dbk.dtd; template.xml</literal></para><screen><phrase role="commit-message">Added support for <tag>legalnotice</tag>.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Steve Ball: blocks2dbk.xsl; wordml2normalise.xsl</literal></para><screen><phrase role="commit-message">added support for <tag>orgname</tag> in <tag>author</tag></phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Steve Ball: specifications.xml; supported.xml; blocks2dbk.xsl; wordml2normalise.xsl; dbk2w⋯</literal></para><screen><phrase role="commit-message">Updated specification.
+to-DocBook: add cols attribute to <tag>tgroup</tag>
+from-DocBook: fix for <tag>blockquote</tag> <tag>title</tag></phrase></screen>
+</listitem>
+</itemizedlist>
+</sect2><!--end of Roundtrip changes for 1.74.1-->
+
+<sect2 xml:id="summary_V1.74.1_Params">
+<title>Params</title>
+<para>The following changes have been made to the <filename>params</filename> since the 1.74.0 release.</para>
+<itemizedlist>
+<listitem>
+<para>The change was to add man.output.better.ps.enabled parameter, with
+its default value set to zero.
+
+If the value of the man.output.better.ps.enabled parameter is
+non-zero, certain markup is embedded in each generated man page
+such that PostScript output from the man -Tps <tag>command</tag> for that
+page will include a number of enhancements designed to improve the
+quality of that output.
+
+If man.output.better.ps.enabled is zero (the default), no such
+markup is embedded in generated man pages, and no enhancements are
+included in the PostScript output generated from those man pages
+by the man -Tps <tag>command</tag>.
+
+WARNING: The enhancements provided by this parameter rely on
+features that are specific to groff (GNU troff) and that are not
+part of "classic" AT&amp;T troff or any of its derivatives. Therefore,
+any man pages you generate with this parameter enabled will be
+readable only on systems on which the groff (GNU troff) program is
+installed, such as GNU/Linux systems. The pages will not not be
+readable on systems on with the classic troff (AT&amp;T troff) <tag>command</tag>
+is installed.
+
+NOTE: The value of this parameter only affects PostScript output
+generated from the man <tag>command</tag>. It has no effect on output
+generated using the FO backend.
+
+<tag>TIP</tag>: You can generate PostScript output for any man page by
+running the following <tag>command</tag>:
+
+man FOO -Tps &gt; FOO.ps
+
+You can then generate PDF output by running the following <tag>command</tag>:
+
+ps2pdf FOO.ps</para>
+</listitem>
+<listitem>
+<para><literal>Robert Stayton: writing.mode.xml</literal></para><screen><phrase role="commit-message">writing mode param used to set text direction.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Michael(tm) Smith: email.mailto.enabled.xml</literal></para><screen><phrase role="commit-message">Added new param <parameter>email.mailto.enabled</parameter> for FO output.
+Patch from Paolo Borelli. Closes #2086321.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Jirka Kosek: highlight.source.xml; highlight.xslthl.config.xml</literal></para><screen><phrase role="commit-message">Upgraded to support the latest version of XSLTHL 2.0
+ -- nested markup in highlited code is now processed
+ -- it is no longer needed to specify path XSLTHL configuration file using Java property
+ -- support for new languages, including Perl, Python and Ruby was added</phrase></screen>
+</listitem>
+</itemizedlist>
+</sect2><!--end of Params changes for 1.74.1-->
+
+<sect2 xml:id="summary_V1.74.1_Highlighting">
+<title>Highlighting</title>
+<para>The following changes have been made to the
+ <filename>highlighting</filename> code
+ since the 1.74.0 release.</para>
+<itemizedlist>
+<listitem>
+<para><literal>Jirka Kosek: cpp-hl.xml; c-hl.xml; tcl-hl.xml; php-hl.xml; common.xsl; perl-hl.xml; delphi⋯</literal></para><screen><phrase role="commit-message">Upgraded to support the latest version of XSLTHL 2.0
+ -- nested markup in highlited code is now processed
+ -- it is no longer needed to specify path XSLTHL configuration file using Java property
+ -- support for new languages, including Perl, Python and Ruby was added</phrase></screen>
+</listitem>
+</itemizedlist>
+</sect2><!--end of Highlighting changes for 1.74.1-->
+
+</sect1>
+
+
+<sect1 xml:id="V1.74.0">
+<title>Release Notes: 1.74.0</title>
+<para>This release includes important bug fixes and adds the following
+significant feature changes:
+<variablelist>
+<varlistentry>
+<term>.epub target</term>
+<listitem><para>Paul Norton (Adobe) and Keith Fahlgren(O'Reilly Media) have donated code that generates <filename>.epub</filename> documents from
+DocBook input. An alpha-reference implementation in Ruby has also been provided.</para>
+<para>.epub is an open standard of the The International Digital Publishing Forum (IDPF),
+a the trade and standards association for the digital publishing industry. </para>
+<para>Read more about this target in <filename>epub/README</filename>
+</para></listitem>
+</varlistentry>
+
+<varlistentry>
+<term>XHTML 1.1 target</term>
+<listitem><para>To support .epub output, a strict XHTML 1.1 target has been added. The stylesheets for this output are
+generated and are quite similar to the XHTML target.</para></listitem>
+</varlistentry>
+<varlistentry>
+<term>Gentext updates</term>
+<listitem><para>A number of locales have been updated.</para></listitem>
+</varlistentry>
+<varlistentry>
+<term>Roundtrip improvements</term>
+<listitem><para>Table, figure, template syncronization, and character style improvements have been made for WordML &amp; Pages. Support added for OpenOffice.org.</para></listitem>
+
+</varlistentry>
+
+<varlistentry>
+ <term>First implementation of a libxslt extension</term>
+ <listitem>
+ <para>A stylesheet extension for libxslt, written in Python, has been added.
+ The extension is a function for adjusting column widths in CALS tables. See
+ <filename>extensions/README.LIBXSLT</filename> for more information.</para>
+ </listitem>
+ </varlistentry>
+
+</variablelist>
+</para>
+<para>The following is a list of changes that have been made
+ since the 1.73.2 release.</para>
+
+<sect2 xml:id="V1.74.0_Gentext">
+<title>Gentext</title>
+<para>The following changes have been made to the
+ <filename>gentext</filename> code
+ since the 1.73.2 release.</para>
+<itemizedlist>
+<listitem>
+<para><literal>Michael(tm) Smith: locale/id.xml</literal></para><screen><phrase role="commit-message">Checked in changes to Indonesion locale submitted by Euis Luhuanam a long time ago.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Michael(tm) Smith: locale/lt.xml</literal></para><screen><phrase role="commit-message">Added changes to Lithuanian locate submitted a long time back by Nikolajus Krauklis.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Michael(tm) Smith: locale/hu.xml</literal></para><screen><phrase role="commit-message">fixed error in lowercase.alpha definition in Hungarian locale</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Michael(tm) Smith: locale/nb.xml</literal></para><screen><phrase role="commit-message">Corrected language code for nb locale, and restored missing "startquote" key.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Michael(tm) Smith: locale/ja.xml</literal></para><screen><phrase role="commit-message">Committed changes to ja locale file, from Akagi Kobayashi. Adds bracket quotes around many xref instances that did not have them
+before.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Michael(tm) Smith: Makefile</literal></para><screen><phrase role="commit-message">"no" locale is now "nb"</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Michael(tm) Smith: locale/nb.xml</literal></para><screen><phrase role="commit-message">Update Norwegian Bokmål translation. Thanks to Hans F. Nordhaug.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Michael(tm) Smith: locale/no.xml; locale/nb.xml</literal></para><screen><phrase role="commit-message">per message from Hans F. Nordhaug, correct identifier for
+Norwegian Bokmål is "nb" (not "no") and has been for quite some
+time now...</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Michael(tm) Smith: locale/ja.xml</literal></para><screen><phrase role="commit-message">Converted ja.xml source file to use real unicode characters so
+that the actual glyphs so up when you edit it in a text editor
+(instead of the character references).</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Michael(tm) Smith: locale/ja.xml</literal></para><screen><phrase role="commit-message">Checked in changes to ja.xml locale file. Thanks to Akagi Kobayashi.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Michael(tm) Smith: locale/it.xml</literal></para><screen><phrase role="commit-message">Changes from Federico Zenith</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Dongsheng Song: locale/zh_cn.xml</literal></para><screen><phrase role="commit-message">Added missing translations.</phrase></screen>
+</listitem>
+</itemizedlist>
+</sect2><!--end of Gentext changes for 1.74.0-->
+
+<sect2 xml:id="V1.74.0_Common">
+<title>Common</title>
+<para>The following changes have been made to the
+ <filename>common</filename> code
+ since the 1.73.2 release.</para>
+<itemizedlist>
+<listitem>
+<para><literal>Michael(tm) Smith: l10n.xsl</literal></para><screen><phrase role="commit-message">Added new template "l10.language.name" for retrieving the
+English-language name of the lang setting of the current document.
+Closes #1916837. Thanks to Simon Kennedy.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Michael(tm) Smith: refentry.xsl</literal></para><screen><phrase role="commit-message">fixed syntax error</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Michael(tm) Smith: refentry.xsl</literal></para><screen><phrase role="commit-message">fixed a couple of typos</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Michael(tm) Smith: refentry.xsl</literal></para><screen><phrase role="commit-message">refined handling of cases where refentry "source" or "manual"
+metadata is missing or when we use fallback content instead. We
+now report a Warning if we use fallback content.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Michael(tm) Smith: refentry.xsl</literal></para><screen><phrase role="commit-message">don't use refmiscinfo@class=date value as fallback for refentry
+"source" or "manual" metadata fields</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Michael(tm) Smith: refentry.xsl</literal></para><screen><phrase role="commit-message">Made reporting of missing refentry metadata more quiet:
+
+ - we no longer report anything if usable-but-not-preferred
+ metadata is found; we just quietly use whatever we manage to
+ find
+
+ - we now only report missing "source" metadata if the refentry
+ is missing BOTH "source name" and "version" metadata; if it
+ has one but not the other, we use whichever one it has and
+ don't report anything as missing
+
+The above changes were made because testing with some "real world"
+source reveals that some authors are intentionally choosing to use
+"non preferred" markup for some metadata, and also choosing to
+omit "source name" or "version" metadata in there DocBook XML. So
+it does no good to give them pedantic reminders about what they
+already know...
+
+Also, changed code to cause "fixme" text to be inserted in output
+in particular cases:
+
+ - if we can't manage to find any "source" metadata at all, we
+ now put fixme text into the output
+
+ - if we can't manage to find any "manual" metadata a all, we
+ now put fixme text into the output
+
+The "source" and "manual" metadata is necessary information, so
+buy putting the fixme stuff in the output, we alert users to the
+need problem of it being missing.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Michael(tm) Smith: refentry.xsl</literal></para><screen><phrase role="commit-message">When generating manpages output, we no longer report anything if
+the refentry source is missing date or pubdate content. In
+practice, many users intentionally omit the date from the source
+because they explicitly want it to be generated.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Michael(tm) Smith: l10n.xml</literal></para><screen><phrase role="commit-message">further change needed for switch from no locale to nb.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Michael(tm) Smith: common.xsl</literal></para><screen><phrase role="commit-message">Added support for orgname in authorgroup. Thanks to Camille
+Bégnis.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Michael(tm) Smith: Makefile</literal></para><screen><phrase role="commit-message">"no" locale is now "nb"</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Mauritz Jeanson: stripns.xsl</literal></para><screen><phrase role="commit-message">Removed the template matching "ng:link|db:link" (in order to make @xlink:show
+work with &lt;link&gt; elements). As far as I can tell, this template is no longer needed.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Mauritz Jeanson: entities.ent</literal></para><screen><phrase role="commit-message">Moved declaration of comment.block.parents entity to common/entities.ent.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Mauritz Jeanson: titles.xsl</literal></para><screen><phrase role="commit-message">Added an update the fix made in revision 7528 (handling of xref/link in no.anchor.mode mode).
+Having xref in title is not a problem as long as the target is not an ancestor element.
+Closes bug #1838136.
+
+Note that an xref that is in a title and whose target is an ancestor element is still not
+rendered in the TOC. This could be considered a bug, but on the other hand I cannot really
+see the point in having such an xref in a document.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Mauritz Jeanson: titles.xsl</literal></para><screen><phrase role="commit-message">Added a "not(ancestor::title)" test to work around "too many nested
+apply-templates" problems when processing xrefs or links in no.anchor.mode mode.
+Hopefully, this closes bug #1811721.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Mauritz Jeanson: titles.xsl</literal></para><screen><phrase role="commit-message">Removed old template matching "link" in no.anchor.mode mode.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Mauritz Jeanson: titles.xsl</literal></para><screen><phrase role="commit-message">Process &lt;link&gt; in no.anchor.mode mode with the same template as &lt;xref&gt;.
+Closes bug #1759205 (Empty link in no.anchor.mode mode).</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Mauritz Jeanson: titles.xsl</literal></para><screen><phrase role="commit-message">In no.anchor.mode mode, do not output anchors for elements that are descendants
+of &lt;title&gt;. Previously, having inline elements with @id/@xml:id in &lt;title&gt;s
+resulted in anchors both in the TOC and in the main flow. Closes bug #1797492.</phrase></screen>
+</listitem>
+</itemizedlist>
+</sect2><!--end of Common changes for 1.74.0-->
+
+<sect2 xml:id="V1.74.0_FO">
+<title>FO</title>
+<para>The following changes have been made to the
+ <filename>fo</filename> code
+ since the 1.73.2 release.</para>
+<itemizedlist>
+<listitem> <para><literal>Mauritz Jeanson: pi.xsl</literal></para><screen><phrase role="commit-message">Updated documentation for keep-together.</phrase></screen> </listitem>
+<listitem> <para><literal>Mauritz Jeanson: task.xsl</literal></para><screen><phrase role="commit-message">Enabled use of the keep-together PI on <tag>task</tag> elements.</phrase></screen> </listitem>
+<listitem>
+<para><literal>Robert Stayton: index.xsl</literal></para><screen><phrase role="commit-message">FOP1 requires fo:wrapper for inline index entries, not fo:inline.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Robert Stayton: index.xsl</literal></para><screen><phrase role="commit-message">Fixed non-working inline.or.block template for indexterm wrappers.
+Add fop1 to list of processors using inline.or.block.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Mauritz Jeanson: table.xsl</literal></para><screen><phrase role="commit-message">Fixed bug #1891965 (colsep in entytbl not working).</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Mauritz Jeanson: titlepage.xsl</literal></para><screen><phrase role="commit-message">Added support for title in revhistory. Closes bug #1842847.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Mauritz Jeanson: pi.xsl</literal></para><screen><phrase role="commit-message">Small doc cleanup (dbfo float-type).</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Mauritz Jeanson: titlepage.xsl</literal></para><screen><phrase role="commit-message">Insert commas between multiple copyright holders.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Mauritz Jeanson: autotoc.xsl; division.xsl</literal></para><screen><phrase role="commit-message">Added modifications to support nested set elements. See bug #1853172.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>David Cramer: glossary.xsl</literal></para><screen><phrase role="commit-message">Added normalize-space to xsl:sorts to avoid missorting of glossterms due to stray leading spaces.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>David Cramer: glossary.xsl</literal></para><screen><phrase role="commit-message">Fixed bug #1854199: glossary.xsl should use the sortas attribute on glossentry</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Mauritz Jeanson: inline.xsl</literal></para><screen><phrase role="commit-message">Added a template for citebiblioid. The hyperlink target is the parent of the referenced biblioid,
+and the "hot text" is the biblioid itself enclosed in brackets.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Mauritz Jeanson: inline.xsl</literal></para><screen><phrase role="commit-message">Moved declaration of comment.block.parents entity to common/entities.ent.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Mauritz Jeanson: docbook.xsl</literal></para><screen><phrase role="commit-message">Updated message about unmatched element.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Mauritz Jeanson: param.xweb</literal></para><screen><phrase role="commit-message">Added link to profiling chapter of TCG.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Mauritz Jeanson: refentry.xsl</literal></para><screen><phrase role="commit-message">Fixed typo (refsynopsysdiv -&gt; refsynopsisdiv).</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>David Cramer: fop.xsl; fop1.xsl; ptc.xsl; xep.xsl</literal></para><screen><phrase role="commit-message">Added test to check generate.index param when generating pdf bookmarks</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Mauritz Jeanson: graphics.xsl</literal></para><screen><phrase role="commit-message">Added support for MathML in imagedata.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Michael(tm) Smith: math.xsl</literal></para><screen><phrase role="commit-message">Removed unnecessary extra test condition in test express that
+checks for passivetex.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Michael(tm) Smith: math.xsl</literal></para><screen><phrase role="commit-message">Don't use fo:instream-foreign-object if we are processing with
+passivetex. Closes #1806899. Thanks to Justus Piater.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Mauritz Jeanson: component.xsl</literal></para><screen><phrase role="commit-message">Added code to output a TOC for an appendix in an article when
+generate.toc='article/appendix toc'. Closes bug #1669658.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Dongsheng Song: biblio-iso690.xsl</literal></para><screen><phrase role="commit-message">Change encoding from "windows-1250" to "UTF-8".</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Mauritz Jeanson: pi.xsl</literal></para><screen><phrase role="commit-message">Updated documentation for dbfo_label-width.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Mauritz Jeanson: lists.xsl</literal></para><screen><phrase role="commit-message">Added support for the dbfo_label-width PI in calloutlists.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Robert Stayton: biblio.xsl</literal></para><screen><phrase role="commit-message">Support finding glossary database entries inside bibliodivs.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Robert Stayton: formal.xsl</literal></para><screen><phrase role="commit-message">Complete support for &lt;?dbfo pgwide="1"?&gt; for informal
+elements too.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Mauritz Jeanson: table.xsl</literal></para><screen><phrase role="commit-message">In the table.block template, added a check for the dbfo_keep-together PI, so that
+a table may break (depending on the PI value) at a page break. This was needed
+since the outer fo:block that surrounds fo:table has keep-together.within-column="always"
+by default, which prevents the table from breaking. Closes bug #1740964 (Titled
+table does not respect dbfo PI).</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Mauritz Jeanson: pi.xsl</literal></para><screen><phrase role="commit-message">Added a few missing @role="tcg".</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Mauritz Jeanson: inline.xsl</literal></para><screen><phrase role="commit-message">Use normalize-space() in glossterm comparisons (as in html/inline.xsl).</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Mauritz Jeanson: autoidx.xsl</literal></para><screen><phrase role="commit-message">Removed the [&amp;scope;] predicate from the target variable in the template with name="reference".
+This filter was the cause of missing index backlinks when @zone and @type were used on indexterms,
+with index.on.type=1. Closes bug #1680836.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Michael(tm) Smith: inline.xsl; xref.xsl; footnote.xsl</literal></para><screen><phrase role="commit-message">Added capability in FO output for displaying URLs for all
+hyperlinks (elements marked up with xlink:href attributes) in the
+same way as URLs for ulinks are already handled (which is to say,
+either inline or as numbered footnotes).
+
+Background on this change:
+DocBook 5 allows "ubiquitous" linking, which means you can make
+any element a hyperlink just by adding an xlink:href attribute to
+it, with the value set to an external URL. That's in contrast to
+DocBook 4, which only allows you to use specific elements (e.g.,
+the link and ulink elements) to mark up hyperlinks.
+
+The existing FO stylesheets have a mechanism for handling display
+of URLs for hyperlinks that are marked up with ulink, but they did
+not handle display of URLs for elements that were marked up with
+xlink:href attributes. This change adds handling for those other
+elements, enabling the URLs they link to be displayed either
+inline or as numbered footnotes (depending on what values the user
+has the ulink.show and ulink.footnotes params set to).
+
+Note that this change only adds URL display support for elements
+that call the simple.xlink template -- which currently is most
+(but not all) inline elements.
+
+This change also moves the URL display handling out of the ulink
+template and into a new "hyperlink.url.display" named template;
+the ulink template and the simple.xlink named template now both
+call the hyperlink.url.display template.
+
+Warning: In the stylesheet code that determines what footnote
+number to assign to each footnote or external hyperlink, there is
+an XPath expression for determining whether a particular
+xlink:href instance is an external hyperlink; that expression is
+necessarily a bit complicated and further testing may reveal that
+it doesn't handle all cases as expected -- so some refinements to
+it may need to be done later.
+
+Closes #1785519. Thanks to Ken Morse for reporting and
+troubleshooting the problem.</phrase></screen>
+</listitem>
+</itemizedlist>
+</sect2><!--end of FO changes for 1.74.0-->
+
+<sect2 xml:id="V1.74.0_HTML">
+<title>HTML</title>
+<para>The following changes have been made to the
+ <filename>html</filename> code
+ since the 1.73.2 release.</para>
+<itemizedlist>
+<listitem> <para><literal>Keith Fahlgren: inline.xsl; synop.xsl</literal></para><screen><phrase role="commit-message">Work to make HTML and XHTML targets more valid</phrase></screen> </listitem>
+<listitem> <para><literal>Keith Fahlgren: table.xsl</literal></para><screen><phrase role="commit-message">Add better handling for tables that have footnotes in the titles</phrase></screen> </listitem>
+<listitem> <para><literal>Keith Fahlgren: biblio.xsl</literal></para><screen><phrase role="commit-message">Add anchors to bibliodivs</phrase></screen> </listitem>
+<listitem>
+<para><literal>Keith Fahlgren: formal.xsl; Makefile; htmltbl.xsl</literal></para><screen><phrase role="commit-message">Initial checkin/merge of epub target from work provided by Paul Norton of Adobe
+and Keith Fahlgren of O'Reilly.</phrase></screen>
+<para>This change includes new code for generating the XHTML 1.1 target sanely.</para>
+</listitem>
+<listitem>
+<para><literal>Mauritz Jeanson: biblio.xsl</literal></para><screen><phrase role="commit-message">Added code for creating URLs from biblioids with @class="doi" (representing Digital
+Object Identifiers). See FR #1934434 and http://doi.org.
+
+To do: 1) Add support for FO output. 2) Figure out how @class="doi" should be handled
+for bibliorelation, bibliosource and citebiblioid.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Norman Walsh: formal.xsl</literal></para><screen><phrase role="commit-message">Don't use xsl:copy because it forces the resulting element to be in the same namespace as the source element; in the XHTML stylesheets, that's wrong. But the HTML-to-XHTML converter does the right thing with literal result elements, so use one of them.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Michael(tm) Smith: Makefile</literal></para><screen><phrase role="commit-message">Added checks and hacks to various makefiles to enable building
+under Cygwin. This stuff is ugly and maybe not worth the mess and
+trouble, but does seem to work as expected and not break anything
+else.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Michael(tm) Smith: docbook.xsl</literal></para><screen><phrase role="commit-message">added "exslt" namespace binding to html/docbook.xsl file (in
+addition to existing "exsl" binding. reason is because lack of it
+seems to cause processing problems when using the profiled
+version of the stylsheet</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Norman Walsh: chunk-common.xsl</literal></para><screen><phrase role="commit-message">Rename link</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Mauritz Jeanson: table.xsl</literal></para><screen><phrase role="commit-message">Added a fix to make rowsep apply to the last row of thead in entrytbl.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Michael(tm) Smith: synop.xsl</literal></para><screen><phrase role="commit-message">Simplified and streamlined handling of output for ANSI-style
+funcprototype output, to correct a problem that was causing type
+data to be lost in the output parameter definitions. For example,
+for an instance like this:
+ &lt;paramdef&gt;void *&lt;parameter&gt;dataptr&lt;/parameter&gt;[]&lt;/paramdef&gt;
+... the brackets (indicating an array type) were being dropped.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Michael(tm) Smith: synop.xsl</literal></para><screen><phrase role="commit-message">Changed HTML handling of K&amp;R-style paramdef output. The parameter
+definitions are no longer output in a table (though the prototype
+still is). The reason for the change is that the
+kr-tabular-funcsynopsis-mode template was causing type data to be
+lost in the output parameter definitions. For example, for an
+instance like this:
+ &lt;paramdef&gt;void *&lt;parameter&gt;dataptr&lt;/parameter&gt;[]&lt;/paramdef&gt;
+... the brackets (indicating an array type) were being dropped.
+The easiest way to deal with the problem is to not try to chop up
+the parameter definitions and display them in table format, but to
+instead just output them as-is. May not look quite as pretty, but
+at least we can be sure no information is being lost...</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Michael(tm) Smith: pi.xsl</literal></para><screen><phrase role="commit-message">updated wording of doc for funcsynopsis-style PI</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Michael(tm) Smith: param.xweb; param.ent; synop.xsl</literal></para><screen><phrase role="commit-message">Removed the funcsynopsis.tabular.threshold param. It's no longer
+being used in the code and hasn't been since mid 2006.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Mauritz Jeanson: graphics.xsl</literal></para><screen><phrase role="commit-message">Added support for the img.src.path parameter for SVG graphics. Closes bug #1888169.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Mauritz Jeanson: chunk-common.xsl</literal></para><screen><phrase role="commit-message">Added missing space.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Norman Walsh: component.xsl</literal></para><screen><phrase role="commit-message">Fix bug where component titles inside info elements were not handled properly</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Michael(tm) Smith: pi.xsl</literal></para><screen><phrase role="commit-message">Moved dbhtml_stop-chunking embedded doc into alphabetical order,
+fixed text of TCG section it see-also'ed.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>David Cramer: pi.xsl</literal></para><screen><phrase role="commit-message">Added support for &lt;?dbhtml stop-chunking?&gt; processing instruction</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>David Cramer: chunk-common.xsl; pi.xsl</literal></para><screen><phrase role="commit-message">Added support for &lt;?dbhtml stop-chunking?&gt; processing instruction</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>David Cramer: glossary.xsl</literal></para><screen><phrase role="commit-message">Fixed bug #1854199: glossary.xsl should use the sortas attribute on glossentry. Also added normalize-space to avoid missorting due to stray leading spaces.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Mauritz Jeanson: inline.xsl</literal></para><screen><phrase role="commit-message">Added a template for citebiblioid. The hyperlink target is the parent of the referenced biblioid,
+and the "hot text" is the biblioid itself enclosed in brackets.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Mauritz Jeanson: inline.xsl</literal></para><screen><phrase role="commit-message">Added support for @xlink:show in the simple.xlink template. The "new" and "replace"
+values are supported (corresponding to values of "_blank" and "_top" for the
+ulink.target parameter). I have assumed that @xlink:show should override ulink.target
+for external URI links. This closes bugs #1762023 and #1727498.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Mauritz Jeanson: inline.xsl</literal></para><screen><phrase role="commit-message">Moved declaration of comment.block.parents entity to common/entities.ent.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Mauritz Jeanson: param.xweb</literal></para><screen><phrase role="commit-message">Added link to profiling chapter of TCG.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Dongsheng Song: biblio-iso690.xsl</literal></para><screen><phrase role="commit-message">Change encoding from "windows-1250" to "UTF-8".</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Robert Stayton: biblio.xsl</literal></para><screen><phrase role="commit-message">Add support in biblio collection to entries in bibliodivs.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Mauritz Jeanson: pi.xsl</literal></para><screen><phrase role="commit-message">Added missing @role="tcg".</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Mauritz Jeanson: chunk-common.xsl; titlepage.xsl</literal></para><screen><phrase role="commit-message">Refactored legalnotice/revhistory chunking, so that the use.id.as.filename
+parameter as well as the dbhtml_filename PI are taken into account. A new named
+template in titlepage.xsl is used to compute the filename.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Mauritz Jeanson: chunk-common.xsl; titlepage.xsl</literal></para><screen><phrase role="commit-message">An update to the fix for bug #1790495 (r7433):
+The "ln-" prefix is output only when the legalnotice doesn't have an
+@id/@xml:id, in which case the stylesheets generate an ID value,
+resulting in a filename like "ln-7e0fwgj.html". This is useful because
+without the prefix, you wouldn't know that the file contained a legalnotice.
+The same logic is also applied to revhistory, using an "rh-" prefix.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Mauritz Jeanson: autoidx.xsl</literal></para><screen><phrase role="commit-message">Removed the [&amp;scope;] predicate from the target variable in the template with name="reference".
+This filter was the cause of missing index backlinks when @zone and @type were used on indexterms,
+with index.on.type=1. Closes bug #1680836.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Mauritz Jeanson: titlepage.xsl</literal></para><screen><phrase role="commit-message">Added 'ln-' prefix to the name of the legalnotice chunk, in order to match the
+&lt;link href"..."&gt; that is output by make.legalnotice.head.links (chunk-common.xsl).
+Modified the href attribute on the legalnotice link.
+Closes bug #1790495.</phrase></screen>
+</listitem>
+</itemizedlist>
+</sect2><!--end of HTML changes for 1.74.0-->
+
+<sect2 xml:id="V1.74.0_Manpages">
+<title>Manpages</title>
+<para>The following changes have been made to the
+ <filename>manpages</filename> code
+ since the 1.73.2 release.</para>
+<itemizedlist>
+<listitem>
+<para><literal>Michael(tm) Smith: other.xsl</literal></para><screen><phrase role="commit-message">slightly adjusted spacing around admonition markers</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Michael(tm) Smith: refentry.xsl; utility.xsl</literal></para><screen><phrase role="commit-message">make sure refsect3 titles are preceded by a line of space, and
+make the indenting of their child content less severe</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Michael(tm) Smith: block.xsl</literal></para><screen><phrase role="commit-message">only indent verbatim environments in TTY output, not in non-TTY/PS</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Michael(tm) Smith: block.xsl</literal></para><screen><phrase role="commit-message">made another adjustment to correct vertical alignment of admonition marker</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Michael(tm) Smith: block.xsl; other.xsl</literal></para><screen><phrase role="commit-message">Adjusted/corrected alignment of adominition marker in PS/non-TTY output.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Michael(tm) Smith: endnotes.xsl</literal></para><screen><phrase role="commit-message">For PS/non-TTY output, display footnote/endnote numbers in
+superscript.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Michael(tm) Smith: table.xsl; synop.xsl; utility.xsl</literal></para><screen><phrase role="commit-message">Changed handling of hanging indents for cmdsynopsis, funcsynopsis,
+and synopfragment such that they now look correct in non-TTY/PS
+output. We now use the groff \w escape to hang by the actual width
+-- in the current font -- of the command, funcdef, or
+synopfragment references number (as opposed to hanging by the
+number of characters). This rendering in TTY output remains the
+same, since the width in monospaced TTY output is the same as the
+number of characters.
+
+Also, created new synopsis-block-start and synopsis-block-end
+templates to use for cmdsynopsis and funcsynopsis instead of the
+corresponding verbatim-* templates.
+
+Along with those changes, also corrected a problem that caused the
+content of synopfragment to be dropped, and made a
+vertical-spacing change to adjust spacing around table titles and
+among sibling synopfragment instances.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Michael(tm) Smith: other.xsl</literal></para><screen><phrase role="commit-message">use common l10.language.name template to retrieve English-language name</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Michael(tm) Smith: synop.xsl; inline.xsl</literal></para><screen><phrase role="commit-message">added comment in code explaining why we don't put filename output
+in italic (despite the fact that man guidelines say we should)</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Michael(tm) Smith: inline.xsl</literal></para><screen><phrase role="commit-message">put filename output in monospace instead of italic</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Michael(tm) Smith: synop.xsl</literal></para><screen><phrase role="commit-message">put cmdsynopsis in monospace</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Michael(tm) Smith: inline.xsl</literal></para><screen><phrase role="commit-message">removed template match for literal. template matches for monospace
+inlines are all imported from the HTML stylesheet</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Michael(tm) Smith: block.xsl</literal></para><screen><phrase role="commit-message">don't indent verbatim environments that are descendants of
+refsynopsisdiv, not put backgrounds behind them</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Michael(tm) Smith: inline.xsl</literal></para><screen><phrase role="commit-message">set output of the literal element in monospace. this causes all
+inline monospace instances in the git man pages to be set in
+monospace (since DocBook XML source for git docs is generated with
+asciidoc and asciidoc consistently outputs only &lt;literal&gt; for
+inline monospace (not &lt;command&gt; or &lt;code&gt; or anything else).
+Of course this only affects non-TTY output...</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Michael(tm) Smith: utility.xsl</literal></para><screen><phrase role="commit-message">Added inline.monoseq named template.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Michael(tm) Smith: utility.xsl</literal></para><screen><phrase role="commit-message">don't bother using a custom register to store the previous
+font-family value when setting blocks of text in code font; just
+use \F[] .fam with no arg to switch back</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Michael(tm) Smith: endnotes.xsl</literal></para><screen><phrase role="commit-message">put links in blue in PS output (note that this matches how groff
+renders content marked up with the .URL macro)</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Michael(tm) Smith: endnotes.xsl; param.xweb; param.ent</literal></para><screen><phrase role="commit-message">removed man.links.are.underlined and added man.font.links. Also,
+changed the default font formatting for links to bold.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Michael(tm) Smith: endnotes.xsl; param.xweb; param.ent</literal></para><screen><phrase role="commit-message">Added new param man.base.url.for.relative.links .. specifies a
+base URL for relative links (for ulink, @xlink:href, imagedata,
+audiodata, videodata) shown in the generated NOTES section of
+man-page output. The value of man.base.url.for.relative.links is
+prepended to any relative URI that is a value of ulink url,
+xlink:href, or fileref attribute.
+
+If you use relative URIs in link sources in your DocBook refentry
+source, and you leave man.base.url.for.relative.links unset, the
+relative links will appear "as is" in the NOTES section of any
+man-page output generated from your source. That's probably not
+what you want, because such relative links are only usable in the
+context of HTML output. So, to make the links meaningful and
+usable in the context of man-page output, set a value for
+man.base.url.for.relative.links that points
+to the online version of HTML output generated from your DocBook
+refentry source. For example:
+
+ &lt;xsl:param name="man.base.url.for.relative.links"
+ &gt;http://www.kernel.org/pub/software/scm/git/docs/&lt;/xsl:param&gt;</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Michael(tm) Smith: info.xsl</literal></para><screen><phrase role="commit-message">If a source refentry contains a Documentation or DOCUMENTATION
+section, don't report it as having missing AUTHOR information.
+Also, if missing a contrib/personblurb for a person or org, report
+pointers to http://docbook.sf.net/el/personblurb and to
+http://docbook.sf.net/el/contrib</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Michael(tm) Smith: info.xsl</literal></para><screen><phrase role="commit-message">If we encounter an author|editor|othercredit instance that lacks a
+personblurb or contrib, report it to the user (because that means
+we have no information about that author|editor|othercredit to
+display in the generated AUTHOR|AUTHORS section...)</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Michael(tm) Smith: info.xsl; docbook.xsl; other.xsl</literal></para><screen><phrase role="commit-message">if we can't find any usable author data, emit a warning and insert
+a fixme in the output</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Michael(tm) Smith: info.xsl</literal></para><screen><phrase role="commit-message">fixed bug in indenting of output for contrib instances in AUTHORS
+section. Thanks to Daniel Leidert and the fglrx docs for exposing
+the bug.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Michael(tm) Smith: block.xsl</literal></para><screen><phrase role="commit-message">for a para or simpara that is the first child of a callout,
+suppress the .sp or .PP that would normally be output (because in
+those cases, the output goes into a table cell, and the .sp or .PP
+markup causes a spurious linebreak before it when displayed</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Michael(tm) Smith: lists.xsl</literal></para><screen><phrase role="commit-message">Added support for rendering co callouts and calloutlist instances.
+So you can now use simple callouts -- marking up programlisting
+and such with co instances -- and have the callouts displayed in
+man-page output. ("simple callouts" means using co@id and
+callout@arearefs pointing to co@id instances; in man/roff output,
+we can't/don't support markup that uses areaset and area)</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Michael(tm) Smith: block.xsl</literal></para><screen><phrase role="commit-message">only put a line of space after a verbatim if it's followed by a
+text node or a paragraph</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Michael(tm) Smith: utility.xsl</literal></para><screen><phrase role="commit-message">put verbatim environments in slightly smaller font in non-TTY
+output</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Michael(tm) Smith: lists.xsl</literal></para><screen><phrase role="commit-message">minor whitespace-only reformatting of lists.xsl source</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Michael(tm) Smith: lists.xsl</literal></para><screen><phrase role="commit-message">Made refinements/fixes to output of orderedlist and itemizedlist
+-- in part, to get mysql man pages to display correctly. This
+change causes a "\c" continuation marker to be added between
+listitem markers and contents (to ensure that the content remains
+on the same line as the marker when displayed)</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Michael(tm) Smith: block.xsl</literal></para><screen><phrase role="commit-message">put a line of vertical space after all verbatim output that has
+sibling content following it (not just if that sibling content is
+a text node)</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Michael(tm) Smith: block.xsl</literal></para><screen><phrase role="commit-message">refined spacing around titles for admonitions</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Michael(tm) Smith: block.xsl; other.xsl</literal></para><screen><phrase role="commit-message">Deal with case of verbatim environments that have a linebreak
+after the opening tag. Assumption is that users generally don't
+want that linebreak to appear in output, so we do some groff
+hackery to mess with vertical spacing and close the space.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Michael(tm) Smith: inline.xsl</literal></para><screen><phrase role="commit-message">indexterm instances now produce groff comments like this:
+
+ .\" primary: secondary: tertiary
+
+remark instances, if non-empty, now produce groff comments</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Michael(tm) Smith: charmap.groff.xsl; other.xsl</literal></para><screen><phrase role="commit-message">convert no-break space character to groff "\ \&amp;" (instead of just
+"\ "). the reason is that if a space occurs at the end of a line,
+our processing causes it to be eaten. a real-world case of this is
+the mysql(1) man page. appending the "\&amp;" prevents that</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Michael(tm) Smith: block.xsl</literal></para><screen><phrase role="commit-message">output "sp" before simpara output, not after it (outputting it
+after results in undesirable whitespace in particular cases; for
+example, in the hg/mercurial docs</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Michael(tm) Smith: table.xsl; synop.xsl; utility.xsl</literal></para><screen><phrase role="commit-message">renamed from title-preamble to pinch.together and replaced "sp -1"
+between synopsis fragments with call to pinch.together instead</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Michael(tm) Smith: table.xsl</literal></para><screen><phrase role="commit-message">use title-preamble template for table titles (instead of "sp -1"
+hack), and "sp 1" after all tables (instead of just "sp"</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Michael(tm) Smith: utility.xsl</literal></para><screen><phrase role="commit-message">created title-preamble template for suppressing line spacing after
+headings</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Michael(tm) Smith: info.xsl</literal></para><screen><phrase role="commit-message">further refinement of indenting in AUTHORS section</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Michael(tm) Smith: block.xsl; other.xsl</literal></para><screen><phrase role="commit-message">refined handling of admonitions</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Michael(tm) Smith: lists.xsl</literal></para><screen><phrase role="commit-message">Use RS/RE in another place where we had IP ""</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Michael(tm) Smith: info.xsl</literal></para><screen><phrase role="commit-message">Replace (ab)use of IP with "sp -1" in AUTHORS section with RS/RE
+instead.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Michael(tm) Smith: table.xsl; synop.xsl; info.xsl</literal></para><screen><phrase role="commit-message">changed all instances of ".sp -1n" to ".sp -1"</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Michael(tm) Smith: other.xsl</literal></para><screen><phrase role="commit-message">add extra line before SH heads only in non-TTY output</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Michael(tm) Smith: block.xsl</literal></para><screen><phrase role="commit-message">Reworked output for admonitions (caution, important, note, tip,
+warning). In TTY output, admonitions now get indented. In non-TTY
+output, a colored marker (yellow) is displayed next to them.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Michael(tm) Smith: other.xsl</literal></para><screen><phrase role="commit-message">Added BM/EM macros for putting a colored marker in margin next to
+a block of text.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Michael(tm) Smith: utility.xsl</literal></para><screen><phrase role="commit-message">created make.bold.title template by moving title-bolding part out
+from nested-section-title template. This allows the bolding to
+also be used by the template for formatting admonitions</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Michael(tm) Smith: info.xsl</literal></para><screen><phrase role="commit-message">put .br before copyright contents to prevent them from getting run in</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Michael(tm) Smith: refentry.xsl; other.xsl; utility.xsl</literal></para><screen><phrase role="commit-message">made point size of output for Refsect2 and Refsect3 heads bigger</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Michael(tm) Smith: other.xsl</literal></para><screen><phrase role="commit-message">put slightly more space between SH head and underline in non-TTY
+output</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Michael(tm) Smith: param.xweb; param.ent; other.xsl</literal></para><screen><phrase role="commit-message">Added the man.charmap.subset.profile.english parameter and refined
+the handling of charmap subsets to differentiate between English
+and non-English source.
+
+This way charmap subsets are now handled is this:
+
+If the value of the man.charmap.use.subset parameter is non-zero,
+and your DocBook source is not written in English (that is, if its
+lang or xml:lang attribute has a value other than en), then the
+character-map subset specified by the man.charmap.subset.profile
+parameter is used instead of the full roff character map.
+
+Otherwise, if the lang or xml:lang attribute on the root element
+in your DocBook source or on the first refentry element in your
+source has the value en or if it has no lang or xml:lang
+attribute, then the character-map subset specified by the
+man.charmap.subset.profile.english parameter is used instead of
+man.charmap.subset.profile.
+
+The difference between the two subsets is that
+man.charmap.subset.profile provides mappings for characters in
+Western European languages that are not part of the Roman
+(English) alphabet (ASCII character set).</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Michael(tm) Smith: other.xsl</literal></para><screen><phrase role="commit-message">Various updates, mainly related to uppercasing SH titles:
+
+ - added a "Language: " metadata line to the top comment area of
+ output man pages, to indicate the language the page is in
+
+ - added a "toupper" macro of doing locale-aware uppercasing of
+ SH titles and cross-references to SH titles; the mechanism
+ relies on the uppercase.alpha and lowercase.alpha DocBook
+ gentext keys to do locale-aware uppercasing based on the
+ language the page is written in
+
+ - added a "string.shuffle" template, which provides a library
+ function for "shuffling" two strings together into a single
+ string; it takes the first character for the first string, the
+ first character from second string, etc. The only current use
+ for it is to generate the argument for the groff tr request
+ that does string uppercasing.
+
+ - added make.tr.uppercase.arg and make.tr.normalcase.arg named
+ templates for use in generating groff code for uppercasing and
+ "normal"-casing SH titles
+
+ - made the BB/BE "background drawing" macros have effect only in
+ non-TTY output
+
+ - output a few comments in the top part of source</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Michael(tm) Smith: utility.xsl</literal></para><screen><phrase role="commit-message">removed some leftover kruft</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Michael(tm) Smith: refentry.xsl</literal></para><screen><phrase role="commit-message">To create the name(s) for each man page, we now replace any spaces
+in the refname(s) with underscores. This ensures that tools like
+lexgrog(1) will be able to parse the name (lexgrog won't parse
+names that contain spaces).</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Michael(tm) Smith: docbook.xsl</literal></para><screen><phrase role="commit-message">Put a comment into source of man page to indicate where the main
+content starts. (We now have a few of macro definitions at the
+start of the source, so putting this comment in helps those that
+might be viewing the source.)</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Michael(tm) Smith: refentry.xsl</literal></para><screen><phrase role="commit-message">refined mechanism for generating SH titles</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Michael(tm) Smith: charmap.groff.xsl</literal></para><screen><phrase role="commit-message">Added zcaron, Zcaron, scaron, and Scaron to the groff character map.
+This means that generated Finnish man pages will no longer contain
+any raw accented characters -- they'll instead by marked up with
+groff escapes.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Michael(tm) Smith: other.xsl; utility.xsl</literal></para><screen><phrase role="commit-message">corrected a regression I introduced about a year ago that caused
+dots to be output just as "\." -- instead needs to be "\&amp;." (which
+is what it will be now, after this change)</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Michael(tm) Smith: refentry.xsl</literal></para><screen><phrase role="commit-message">Changed backend handling for generating titles for SH sections and
+for cross-references to those sections. This should have no effect
+on TTY output (behavior should remain the same hopefully) but
+results in titles in normal case (instead of uppercase) in PS
+output.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Michael(tm) Smith: info.xsl</literal></para><screen><phrase role="commit-message">use make.subheading template to make subheadings for AUTHORS and
+COPYRIGHT sections (instead of harcoding roff markup)</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Michael(tm) Smith: block.xsl</literal></para><screen><phrase role="commit-message">put code font around programlisting etc.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Michael(tm) Smith: synop.xsl; docbook.xsl</literal></para><screen><phrase role="commit-message">embed custom macro definitions in man pages, plus wrap synopsis in
+code font</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Michael(tm) Smith: endnotes.xsl</literal></para><screen><phrase role="commit-message">use the make.subheading template to generated SH subheading for
+endnotes section.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Michael(tm) Smith: lists.xsl</literal></para><screen><phrase role="commit-message">Added some templates for generating if-then-else conditional
+markup in groff, so let's use those instead of hard-coding it in
+multiple places...</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Michael(tm) Smith: other.xsl; utility.xsl</literal></para><screen><phrase role="commit-message">Initial checkin of some changes related to making PS/PDF output
+from "man -l -Tps" look better. The current changes:
+
+ - render synopsis and verbatim sections in a monospace/code font
+
+ - put a light-grey background behind all programlisting, screen,
+ and literallayout instances
+
+ - prevent SH heads in PS output from being rendered in uppercase
+ (as they are in console output)
+
+ - also display xrefs to SH heads in PS output in normal case
+ (instead of uppercase)
+
+ - draw a line under SH heads in PS output
+
+The changes made to the code to support the above features were:
+
+ - added some embedded/custom macros: one for conditionally
+ upper-casing SH x-refs, one for redefining the SH macro
+ itself, with some conditional handling for PS output, and
+ finally a macro for putting a background/screen (filled box)
+ around a block of text (e.g., a program listing) in PS output
+
+ - added utility templates for wrapping blocks of text in code
+ font; also templates for inline code font</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Robert Stayton: refentry.xsl</literal></para><screen><phrase role="commit-message">refpurpose nodes now get apply-templates instead of just normalize-space().</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Michael(tm) Smith: lists.xsl</literal></para><screen><phrase role="commit-message">Fixed alignment of first lined of text for each listitem in
+orderedlist output for TTY. Existing code seemed to have been
+causing an extra undesirable space to appear.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Michael(tm) Smith: lists.xsl</literal></para><screen><phrase role="commit-message">Wrapped some roff conditionals around roff markup for orderedlist
+and itemizedlist output, so that the lists look acceptable in PS
+output as well as TTY.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Michael(tm) Smith: pi.xsl; synop.xsl; param.xweb; param.ent</literal></para><screen><phrase role="commit-message">Added the man.funcsynopsis.style parameter. Has the same effect in
+manpages output as the funcsynopsis.style parameter has in HTML
+output -- except that its default value is 'ansi' instead of 'kr'.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Michael(tm) Smith: synop.xsl</literal></para><screen><phrase role="commit-message">Reworked handling of K&amp;R funcprototype output. It no longer relies
+on the HTML kr-tabular templates, but instead just does direct
+transformation to roff. For K&amp;R output, it displays the paramdef
+output in an indented list following the prototype.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Michael(tm) Smith: synop.xsl</literal></para><screen><phrase role="commit-message">Properly integrated handling for K&amp;R output into manpages
+stylesheet. The choice between K&amp;R output and ANSI output is
+currently controlled through use of the (HTML) funcsynopsis.style
+parameter. Note that because the mechanism does currently rely on
+funcsynopsis.style, the default in manpages output is now K&amp;R
+(because that's the default of that param). But I suppose I ought
+to create a man.funcsynopsis.style and make the default for that
+ANSI (to preserve the existing default behavior).</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Michael(tm) Smith: docbook.xsl</literal></para><screen><phrase role="commit-message">added manpages/pi.xsl file</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Michael(tm) Smith: .cvsignore; pi.xsl</literal></para><screen><phrase role="commit-message">Added "dbman funcsynopsis-style" PI and incorporated it into the
+doc build.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Michael(tm) Smith: refentry.xsl</literal></para><screen><phrase role="commit-message">Fixed regression that caused an unescaped dash to be output
+between refname and refpurpose content. Closes bug #1894244.
+Thanks to Daniel Leidert.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Michael(tm) Smith: other.xsl</literal></para><screen><phrase role="commit-message">Fixed problem with dots being escaped in filenames of generated
+man files. Closes #1827195. Thanks to Daniel Leidert.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Michael(tm) Smith: inline.xsl</literal></para><screen><phrase role="commit-message">Added support for processing structfield (was appearing in roff
+output surrounded by HTML &lt;em&gt; tags; fixed so that it gets roff
+ital markup). Closes bug #1858329. Thanks to Sam Varshavchik.</phrase></screen>
+</listitem>
+</itemizedlist>
+</sect2><!--end of Manpages changes for 1.74.0-->
+
+<sect2 xml:id="V1.74.0_Epub">
+<title>Epub</title>
+<para>The following changes have been made to the
+ <filename>epub</filename> code
+ since the 1.73.2 release.</para>
+<itemizedlist>
+<listitem> <para><literal>Keith Fahlgren: bin/spec/README; bin/spec/epub_realbook_spec.rb</literal></para><screen><phrase role="commit-message">'Realbook' spec now passes</phrase></screen> </listitem>
+<listitem> <para><literal>Keith Fahlgren: bin/dbtoepub; README; bin/spec/README; bin/lib/docbook.rb; bin/spec/epub_r⋯</literal></para><screen><phrase role="commit-message">Very primitive Windows support for dbtoepub <tag>reference</tag> implementation; README for running tests and for the .epub target in general; shorter realbook test document (still fails for now)</phrase></screen> </listitem>
+<listitem> <para><literal>Keith Fahlgren: bin/dbtoepub; bin/spec/epub_regressions_spec.rb; bin/lib/docbook.rb; bin/s⋯</literal></para><screen><phrase role="commit-message">Changes to OPF spine to not duplicate idrefs for documents with parts not at the root; regression specs for same</phrase></screen> </listitem>
+<listitem> <para><literal>Keith Fahlgren: docbook.xsl</literal></para><screen><phrase role="commit-message">Fixing linking to <tag>cover</tag> @id, distinct from other needs of cover-image-id (again, thanks to Martin Goerner)</phrase></screen> </listitem>
+<listitem> <para><literal>Keith Fahlgren: docbook.xsl</literal></para><screen><phrase role="commit-message">Updating the <tag>title</tag> of the <tag>toc</tag> element in the guide to be more explicit (thanks to Martin Goerner)</phrase></screen> </listitem>
+<listitem>
+<para><literal>Keith Fahlgren: bin/spec/examples/amasque_exploded/content.opf; bin/spec/examples/amasque_⋯</literal></para><screen><phrase role="commit-message">Initial checkin/merge of epub target from work provided by Paul Norton of Adobe
+and Keith Fahlgren of O'Reilly.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Keith Fahlgren: docbook.xsl</literal></para><screen><phrase role="commit-message">== General epub test support
+
+$ spec -O ~/.spec.opts spec/epub_spec.rb
+
+DocBook::Epub
+- should be able to be created
+- should fail on a nonexistent file
+- should be able to render to a file
+- should create a file after rendering
+- should have the correct mimetype after rendering
+- should be valid .epub after rendering an article
+- should be valid .epub after rendering an article without sections
+- should be valid .epub after rendering a book
+- should be valid .epub after rendering a book even if it has one graphic
+- should be valid .epub after rendering a book even if it has many graphics
+- should be valid .epub after rendering a book even if it has many duplicated graphics
+- should report an empty file as invalid
+- should confirm that a valid .epub file is valid
+- should not include PDFs in rendered epub files as valid image inclusions
+- should include a TOC link in rendered epub files for &lt;book&gt;s
+
+Finished in 20.608395 seconds
+
+15 examples, 0 failures
+
+
+== Verbose epub test coverage against _all_ of the testdocs
+
+Fails on only (errors truncated):
+1)
+'DocBook::Epub should be able to render a valid .epub for the test document /Users/keith/work/docbook-dev/trunk/xsl/epub/bin/spec/testdocs/calloutlist.003.xml [30]' FAILED
+'DocBook::Epub should be able to render a valid .epub for the test document /Users/keith/work/docbook-dev/trunk/xsl/epub/bin/spec/testdocs/cmdsynopsis.001.xml [35]' FAILED
+....
+
+Finished in 629.89194 seconds
+
+224 examples, 15 failures
+
+224 examples, 15 failures yields 6% failure rate</phrase></screen>
+</listitem>
+</itemizedlist>
+</sect2><!--end of Epub changes for 1.74.0-->
+
+<sect2 xml:id="V1.74.0_HTMLHelp">
+<title>HTMLHelp</title>
+<para>The following changes have been made to the
+ <filename>htmlhelp</filename> code
+ since the 1.73.2 release.</para>
+<itemizedlist>
+<listitem>
+<para><literal>Mauritz Jeanson: htmlhelp-common.xsl</literal></para><screen><phrase role="commit-message">Added &lt;xsl:with-param name="quiet" select="$chunk.quietly"/&gt; to calls to
+the write.chunk, write.chunk.with.doctype, and write.text.chunk templates.
+This makes chunk.quietly=1 suppress chunk filename messages also for help
+support files (which seems to be what one would expect). See bug #1648360.</phrase></screen>
+</listitem>
+</itemizedlist>
+</sect2><!--end of HTMLHelp changes for 1.74.0-->
+
+<sect2 xml:id="V1.74.0_Eclipse">
+<title>Eclipse</title>
+<para>The following changes have been made to the
+ <filename>eclipse</filename> code
+ since the 1.73.2 release.</para>
+<itemizedlist>
+<listitem>
+<para><literal>David Cramer: eclipse.xsl</literal></para><screen><phrase role="commit-message">Use sortas attributes (if they exist) when sorting indexterms</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>David Cramer: eclipse.xsl</literal></para><screen><phrase role="commit-message">Added support for indexterm/see in eclipse index.xml</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Mauritz Jeanson: eclipse.xsl</literal></para><screen><phrase role="commit-message">Added &lt;xsl:with-param name="quiet" select="$chunk.quietly"/&gt;
+to helpidx template.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>David Cramer: eclipse.xsl</literal></para><screen><phrase role="commit-message">Generate index.xml file and add related goo to plugin.xml file. Does not yet support see and seealso.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Mauritz Jeanson: eclipse.xsl</literal></para><screen><phrase role="commit-message">Added &lt;xsl:with-param name="quiet" select="$chunk.quietly"/&gt; to calls to
+the write.chunk, write.chunk.with.doctype, and write.text.chunk templates.
+This makes chunk.quietly=1 suppress chunk filename messages also for help
+support files (which seems to be what one would expect). See bug #1648360.</phrase></screen>
+</listitem>
+</itemizedlist>
+</sect2><!--end of Eclipse changes for 1.74.0-->
+
+<sect2 xml:id="V1.74.0_JavaHelp">
+<title>JavaHelp</title>
+<para>The following changes have been made to the
+ <filename>javahelp</filename> code
+ since the 1.73.2 release.</para>
+<itemizedlist>
+<listitem>
+<para><literal>Mauritz Jeanson: javahelp.xsl</literal></para><screen><phrase role="commit-message">Added &lt;xsl:with-param name="quiet" select="$chunk.quietly"/&gt; to calls to
+the write.chunk, write.chunk.with.doctype, and write.text.chunk templates.
+This makes chunk.quietly=1 suppress chunk filename messages also for help
+support files (which seems to be what one would expect). See bug #1648360.</phrase></screen>
+</listitem>
+</itemizedlist>
+</sect2><!--end of JavaHelp changes for 1.74.0-->
+
+<sect2 xml:id="V1.74.0_Roundtrip">
+<title>Roundtrip</title>
+<para>The following changes have been made to the
+ <filename>roundtrip</filename> code
+ since the 1.73.2 release.</para>
+<itemizedlist>
+<listitem>
+<para><literal>Steve Ball: blocks2dbk.xsl; wordml2normalise.xsl</literal></para><screen><phrase role="commit-message">fix table/cell borders for wordml, fix formal figure, add emphasis-strong</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Mauritz Jeanson: supported.xml</literal></para><screen><phrase role="commit-message">Changed @cols to 5.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Steve Ball: blocks2dbk.xsl; blocks2dbk.dtd; template.xml</literal></para><screen><phrase role="commit-message">added pubdate, fixed metadata handling in biblioentry</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Steve Ball: supported.xml</literal></para><screen><phrase role="commit-message">Added support for edition.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Steve Ball: docbook-pages.xsl; wordml-blocks.xsl; docbook.xsl; wordml.xsl; pages-normalise⋯</literal></para><screen><phrase role="commit-message">Removed stylesheets for old, deprecated conversion method.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Steve Ball: specifications.xml; dbk2ooo.xsl; blocks2dbk.xsl; dbk2pages.xsl; blocks2dbk.dtd⋯</literal></para><screen><phrase role="commit-message">Added support for Open Office, added edition element, improved list and table support in Word and Pages</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Steve Ball: normalise-common.xsl; blocks2dbk.xsl; dbk2pages.xsl; template-pages.xml; templ⋯</literal></para><screen><phrase role="commit-message">Fixed bug in WordML table handling, improved table handling for Pages 08, synchronised WordML and Pages templates.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Steve Ball: normalise-common.xsl; blocks2dbk.xsl; wordml2normalise.xsl; dbk2wp.xsl</literal></para><screen><phrase role="commit-message">fix caption, attributes</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Steve Ball: specifications.xml; blocks2dbk.xsl; wordml2normalise.xsl; blocks2dbk.dtd; temp⋯</literal></para><screen><phrase role="commit-message">Fixes to table and list handling</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Steve Ball: blocks2dbk.xsl</literal></para><screen><phrase role="commit-message">added support for explicit emphasis character styles</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Steve Ball: wordml2normalise.xsl</literal></para><screen><phrase role="commit-message">added support for customisation in image handling</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Steve Ball: blocks2dbk.xsl</literal></para><screen><phrase role="commit-message">Added inlinemediaobject support for metadata.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Steve Ball: normalise-common.xsl; blocks2dbk.xsl; template.xml; dbk2wordml.xsl; dbk2wp.xsl</literal></para><screen><phrase role="commit-message">Added support file. Added style locking. Conversion bug fixes.</phrase></screen>
+</listitem>
+</itemizedlist>
+</sect2><!--end of Roundtrip changes for 1.74.0-->
+
+<sect2 xml:id="V1.74.0_Slides">
+<title>Slides</title>
+<para>The following changes have been made to the
+ <filename>slides</filename> code
+ since the 1.73.2 release.</para>
+<itemizedlist>
+<listitem>
+<para><literal>Michael(tm) Smith: fo/Makefile; html/Makefile</literal></para><screen><phrase role="commit-message">Added checks and hacks to various makefiles to enable building
+under Cygwin. This stuff is ugly and maybe not worth the mess and
+trouble, but does seem to work as expected and not break anything
+else.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Jirka Kosek: html/plain.xsl</literal></para><screen><phrase role="commit-message">Added support for showing foil number</phrase></screen>
+</listitem>
+</itemizedlist>
+</sect2><!--end of Slides changes for 1.74.0-->
+
+<sect2 xml:id="V1.74.0_Website">
+<title>Website</title>
+<para>The following changes have been made to the
+ <filename>website</filename> code
+ since the 1.73.2 release.</para>
+<itemizedlist>
+<listitem>
+<para><literal>Michael(tm) Smith: extensions/saxon64/.classes/.gitignore; extensions/xalan2/.classes/com/⋯</literal></para><screen><phrase role="commit-message">renamed a bunch more .cvsignore files to .gitignore (to facilitate use of git-svn)</phrase></screen>
+</listitem>
+</itemizedlist>
+</sect2><!--end of Website changes for 1.74.0-->
+
+<sect2 xml:id="V1.74.0_Params">
+<title>Params</title>
+<para>The following changes have been made to the
+ <filename>params</filename> code
+ since the 1.73.2 release.</para>
+<itemizedlist>
+<listitem> <para><literal>Keith Fahlgren: epub.autolabel.xml</literal></para><screen><phrase role="commit-message">New parameter for epub, epub.autolabel</phrase></screen> </listitem>
+<listitem>
+<para><literal>Mauritz Jeanson: table.frame.border.color.xml; table.cell.padding.xml; table.cell.border.t⋯</literal></para><screen><phrase role="commit-message">Added missing refpurposes and descriptions.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Keith Fahlgren: ade.extensions.xml</literal></para><screen><phrase role="commit-message">Extensions to support Adobe Digital Editions extensions in .epub output.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Mauritz Jeanson: fop.extensions.xml; fop1.extensions.xml</literal></para><screen><phrase role="commit-message">Clarified that fop1.extensions is for FOP 0.90 and later. Version 1 is not here yet...</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Michael(tm) Smith: man.links.are.underlined.xml; man.endnotes.list.enabled.xml; man.font.l⋯</literal></para><screen><phrase role="commit-message">removed man.links.are.underlined and added man.font.links. Also,
+changed the default font formatting for links to bold.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Michael(tm) Smith: man.base.url.for.relative.links.xml</literal></para><screen><phrase role="commit-message">Added new param man.base.url.for.relative.links .. specifies a
+base URL for relative links (for ulink, @xlink:href, imagedata,
+audiodata, videodata) shown in the generated NOTES section of
+man-page output. The value of man.base.url.for.relative.links is
+prepended to any relative URI that is a value of ulink url,
+xlink:href, or fileref attribute.
+
+If you use relative URIs in link sources in your DocBook refentry
+source, and you leave man.base.url.for.relative.links unset, the
+relative links will appear "as is" in the NOTES section of any
+man-page output generated from your source. That's probably not
+what you want, because such relative links are only usable in the
+context of HTML output. So, to make the links meaningful and
+usable in the context of man-page output, set a value for
+man.base.url.for.relative.links that points
+to the online version of HTML output generated from your DocBook
+refentry source. For example:
+
+ &lt;xsl:param name="man.base.url.for.relative.links"
+ &gt;http://www.kernel.org/pub/software/scm/git/docs/&lt;/xsl:param&gt;</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Michael(tm) Smith: man.string.subst.map.xml</literal></para><screen><phrase role="commit-message">squeeze .sp\n.sp into a single .sp (to prevent a extra, spurious
+line of whitespace from being inserted after programlisting etc.
+in certain cases)</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Michael(tm) Smith: refentry.manual.fallback.profile.xml; refentry.source.fallback.profile.⋯</literal></para><screen><phrase role="commit-message">don't use refmiscinfo@class=date value as fallback for refentry
+"source" or "manual" metadata fields</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Michael(tm) Smith: man.charmap.subset.profile.xml; man.charmap.enabled.xml; man.charmap.su⋯</literal></para><screen><phrase role="commit-message">made some further doc tweaks related to the
+man.charmap.subset.profile.english param</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Michael(tm) Smith: man.charmap.subset.profile.xml; man.charmap.enabled.xml; man.charmap.su⋯</literal></para><screen><phrase role="commit-message">Added the man.charmap.subset.profile.english parameter and refined
+the handling of charmap subsets to differentiate between English
+and non-English source.
+
+This way charmap subsets are now handled is this:
+
+If the value of the man.charmap.use.subset parameter is non-zero,
+and your DocBook source is not written in English (that is, if its
+lang or xml:lang attribute has a value other than en), then the
+character-map subset specified by the man.charmap.subset.profile
+parameter is used instead of the full roff character map.
+
+Otherwise, if the lang or xml:lang attribute on the root element
+in your DocBook source or on the first refentry element in your
+source has the value en or if it has no lang or xml:lang
+attribute, then the character-map subset specified by the
+man.charmap.subset.profile.english parameter is used instead of
+man.charmap.subset.profile.
+
+The difference between the two subsets is that
+man.charmap.subset.profile provides mappings for characters in
+Western European languages that are not part of the Roman
+(English) alphabet (ASCII character set).</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Michael(tm) Smith: man.charmap.subset.profile.xml</literal></para><screen><phrase role="commit-message">Added to default charmap used by manpages:
+
+ - the "letters" part of the 'C1 Controls And Latin-1 Supplement
+ (Latin-1 Supplement)' Unicode block
+ - Latin Extended-A block (but not all of the characters from
+ that block have mappings in groff, so some of them are still
+ passed through as-is)
+
+The effects of this change are that in man pages generated for
+most Western European languages and for Finnish, all characters
+not part of the Roman alphabet are (e.g., "accented" characters)
+are converted to groff escapes.
+
+Previously, by default we passed through those characters as is
+(and users needed to use the full charmap if they wanted to have
+those characters converted).
+
+As a result of this change, man pages generated for Western
+European languages will be viewable in some environments in which
+they are not viewable if the "raw" non-Roman characters are in them.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Mauritz Jeanson: generate.legalnotice.link.xml; generate.revhistory.link.xml</literal></para><screen><phrase role="commit-message">Added information on how the filename is computed.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Mauritz Jeanson: default.table.width.xml</literal></para><screen><phrase role="commit-message">Clarified PI usage.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Michael(tm) Smith: man.funcsynopsis.style.xml</literal></para><screen><phrase role="commit-message">Added the man.funcsynopsis.style parameter. Has the same effect in
+manpages output as the funcsynopsis.style parameter has in HTML
+output -- except that its default value is 'ansi' instead of 'kr'.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Michael(tm) Smith: funcsynopsis.tabular.threshold.xml</literal></para><screen><phrase role="commit-message">Removed the funcsynopsis.tabular.threshold param. It's no longer
+being used in the code and hasn't been since mid 2006.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Mauritz Jeanson: table.properties.xml</literal></para><screen><phrase role="commit-message">Set keep-together.within-column to "auto". This seems to be the most sensible
+default value for tables.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Mauritz Jeanson: informal.object.properties.xml; admon.graphics.extension.xml; informalequ⋯</literal></para><screen><phrase role="commit-message">Several small documentation fixes.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Mauritz Jeanson: manifest.in.base.dir.xml</literal></para><screen><phrase role="commit-message">Wording fixes.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Mauritz Jeanson: header.content.properties.xml; footer.content.properties.xml</literal></para><screen><phrase role="commit-message">Added refpurpose.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Mauritz Jeanson: ulink.footnotes.xml; ulink.show.xml</literal></para><screen><phrase role="commit-message">Updated for DocBook 5.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Mauritz Jeanson: index.method.xml; glossterm.auto.link.xml</literal></para><screen><phrase role="commit-message">Spelling and wording fixes.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Mauritz Jeanson: callout.graphics.extension.xml</literal></para><screen><phrase role="commit-message">Clarifed available graphics formats and extensions.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Mauritz Jeanson: footnote.sep.leader.properties.xml</literal></para><screen><phrase role="commit-message">Corrected refpurpose.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Jirka Kosek: footnote.properties.xml</literal></para><screen><phrase role="commit-message">Added more properties which make it possible to render correctly footnotes placed inside verbatim elements.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Mauritz Jeanson: img.src.path.xml</literal></para><screen><phrase role="commit-message">img.src.path works with inlinegraphic too.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Mauritz Jeanson: saxon.character.representation.xml</literal></para><screen><phrase role="commit-message">Added TCG link.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Mauritz Jeanson: img.src.path.xml</literal></para><screen><phrase role="commit-message">Updated description of img.src.path. Bug #1785224 revealed that
+there was a risk of misunderstanding how it works.</phrase></screen>
+</listitem>
+</itemizedlist>
+</sect2><!--end of Params changes for 1.74.0-->
+
+<sect2 xml:id="V1.74.0_Profiling">
+<title>Profiling</title>
+<para>The following changes have been made to the
+ <filename>profiling</filename> code
+ since the 1.73.2 release.</para>
+<itemizedlist>
+<listitem>
+<para><literal>Jirka Kosek: xsl2profile.xsl</literal></para><screen><phrase role="commit-message">Added new rules to profile all content generated by HTML Help (including alias files)</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Robert Stayton: profile-mode.xsl</literal></para><screen><phrase role="commit-message">use mode="profile" instead of xsl:copy-of for attributes so
+they can be more easily customized.</phrase></screen>
+</listitem>
+</itemizedlist>
+</sect2><!--end of Profiling changes for 1.74.0-->
+
+
+<sect2 xml:id="V1.74.0_Tools">
+<title>Tools</title>
+<para>The following changes have been made to the
+ <filename>tools</filename> code
+ since the 1.73.2 release.</para>
+<itemizedlist>
+<listitem>
+<para><literal>Michael(tm) Smith: make/Makefile.DocBook</literal></para><screen><phrase role="commit-message">various changes and additions to support making with asciidoc as
+an input format</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Michael(tm) Smith: make/Makefile.DocBook</literal></para><screen><phrase role="commit-message">make dblatex the default PDF maker for the example makefile</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Michael(tm) Smith: xsl/build/html2roff.xsl</literal></para><screen><phrase role="commit-message">Reworked handling of K&amp;R funcprototype output. It no longer relies
+on the HTML kr-tabular templates, but instead just does direct
+transformation to roff. For K&amp;R output, it displays the paramdef
+output in an indented list following the prototype.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Mauritz Jeanson: xsl/build/make-xsl-params.xsl</literal></para><screen><phrase role="commit-message">Made attribute-sets members of the param list. This enables links to attribute-sets in the
+reference documentation.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Michael(tm) Smith: xsl/build/html2roff.xsl</literal></para><screen><phrase role="commit-message">use .BI handling in K&amp;R funsynopsis output for manpages, just as
+we do already of ANSI output</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Michael(tm) Smith: xsl/build/html2roff.xsl</literal></para><screen><phrase role="commit-message">Implemented initial support for handling tabular K&amp;R output of
+funcprototype in manpages output. Accomplished by adding more
+templates to the intermediate HTML-to-roff stylesheet that the
+build uses to create the manpages/html-synop.xsl stylesheet.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Michael(tm) Smith: xsl/build/doc-link-docbook.xsl</literal></para><screen><phrase role="commit-message">Made the xsl/tools/xsl/build/doc-link-docbook.xsl stylesheet
+import profile-docbook.xsl, so that we can do profiling of release
+notes. Corrected some problems in the target for the release-notes
+HTML build.</phrase></screen>
+</listitem>
+</itemizedlist>
+</sect2><!--end of Tools changes for 1.74.0-->
+
+<sect2 xml:id="V1.74.0_Extensions">
+<title>Extensions</title>
+<para>The following changes have been made to the
+ <filename>extensions</filename> code
+ since the 1.73.2 release.</para>
+<itemizedlist>
+<listitem> <para><literal>Keith Fahlgren: Makefile</literal></para><screen><phrase role="commit-message">Use DOCBOOK_SVN variable everywhere, please; build with PDF_MAKER</phrase></screen> </listitem>
+<listitem>
+<para><literal>Michael(tm) Smith: Makefile</literal></para><screen><phrase role="commit-message">moved extensions build targets from master xsl/Makefile to
+xsl/extensions/Makefile</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Michael(tm) Smith: .cvsignore</literal></para><screen><phrase role="commit-message">re-adding empty extensions subdir</phrase></screen>
+</listitem>
+</itemizedlist>
+</sect2><!--end of Extensions changes for 1.74.0-->
+
+<sect2 xml:id="V1.74.0_XSL-Saxon">
+<title>XSL-Saxon</title>
+<para>The following changes have been made to the
+ <filename>xsl-saxon</filename> code
+ since the 1.73.2 release.</para>
+<itemizedlist>
+<listitem>
+<para><literal>Michael(tm) Smith: VERSION</literal></para><screen><phrase role="commit-message">bring xsl2, xsl-saxon, and xsl-xalan VERSION files up-to-date with
+recent change to snapshot build infrastructure</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Michael(tm) Smith: nbproject/build-impl.xml; nbproject/project.properties</literal></para><screen><phrase role="commit-message">Changed hard-coded file references in "clean" target to variable
+references. Closes #1792043. Thanks to Daniel Leidert.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Michael(tm) Smith: VERSION; Makefile</literal></para><screen><phrase role="commit-message">Did post-release wrap-up of xsl-saxon and xsl-xalan dirs</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Michael(tm) Smith: nbproject/build-impl.xml; VERSION; Makefile; test</literal></para><screen><phrase role="commit-message">More tweaks to get release-ready</phrase></screen>
+</listitem>
+</itemizedlist>
+</sect2><!--end of XSL-Saxon changes for 1.74.0-->
+
+<sect2 xml:id="V1.74.0_XSL-Xalan">
+<title>XSL-Xalan</title>
+<para>The following changes have been made to the
+ <filename>xsl-xalan</filename> code
+ since the 1.73.2 release.</para>
+<itemizedlist>
+<listitem>
+<para><literal>Michael(tm) Smith: VERSION</literal></para><screen><phrase role="commit-message">bring xsl2, xsl-saxon, and xsl-xalan VERSION files up-to-date with
+recent change to snapshot build infrastructure</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Michael(tm) Smith: nbproject/build-impl.xml</literal></para><screen><phrase role="commit-message">Changed hard-coded file references in "clean" target to variable
+references. Closes #1792043. Thanks to Daniel Leidert.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Michael(tm) Smith: Makefile; VERSION</literal></para><screen><phrase role="commit-message">Did post-release wrap-up of xsl-saxon and xsl-xalan dirs</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Michael(tm) Smith: Makefile; nbproject/build-impl.xml; VERSION</literal></para><screen><phrase role="commit-message">More tweaks to get release-ready</phrase></screen>
+</listitem>
+</itemizedlist>
+</sect2><!--end of XSL-Xalan changes for 1.74.0-->
+
+<sect2 xml:id="V1.74.0_XSL-libxslt">
+<title>XSL-libxslt</title>
+<para>The following changes have been made to the
+ <filename>xsl-libxslt</filename> code
+ since the 1.73.2 release.</para>
+<itemizedlist>
+<listitem>
+<para><literal>Mauritz Jeanson: python/xslt.py</literal></para><screen><phrase role="commit-message">Print the result to stdout if no outfile has been given.
+Some unnecessary semicolons removed.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Mauritz Jeanson: python/xslt.py</literal></para><screen><phrase role="commit-message">Added a function that quotes parameter values (to ensure that they are interpreted as strings).
+Replaced deprecated functions from the string module with string methods.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Michael(tm) Smith: python/README; python/README.LIBXSLT</literal></para><screen><phrase role="commit-message">renamed xsl-libxslt/python/README to xsl-libxslt/python/README.LIBXSLT</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Mauritz Jeanson: python/README</literal></para><screen><phrase role="commit-message">Tweaked the text a little.</phrase></screen>
+</listitem>
+</itemizedlist>
+</sect2><!--end of XSL-libxslt changes for 1.74.0-->
+
+</sect1>
+
+<sect1 xml:id="V1.73.2">
+<title>Release Notes: 1.73.2</title>
+<para>This is solely a minor bug-fix update to the 1.73.1 release.
+ It fixes a packaging error in the 1.73.1 package, as well as a
+ bug in footnote handling in FO output.</para>
+</sect1>
+
+<sect1 xml:id="V1.73.1">
+<title>Release: 1.73.1</title>
+<para>This is mostly a bug-fix update to the 1.73.0 release.</para>
+
+<sect2 xml:id="V1.73.1_Gentext">
+<title>Gentext</title>
+<para>The following changes have been made to the
+ <filename>gentext</filename> code
+ since the 1.73.0 release.</para>
+<itemizedlist>
+<listitem>
+<para><literal>Mauritz Jeanson: locale/de.xml</literal></para><screen><phrase role="commit-message">Applied patch #1766009.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Michael(tm) Smith: locale/lv.xml</literal></para><screen><phrase role="commit-message">Added localization for <tag>ProductionSet</tag>.</phrase></screen>
+</listitem>
+</itemizedlist>
+</sect2><!--end of Gentext changes for 1.73.1-->
+
+<sect2 xml:id="V1.73.1_FO">
+<title>FO</title>
+<para>The following changes have been made to the
+ <filename>fo</filename> code
+ since the 1.73.0 release.</para>
+<itemizedlist>
+<listitem>
+<para><literal>Mauritz Jeanson: table.xsl</literal></para><screen><phrase role="commit-message">Modified the <tag>tgroup</tag> template so that, for tables with multiple tgroups,
+a width attribute is output on all corresponding fo:tables. Previously,
+there was a test prohibiting this (and a comment saying that outputting more
+than one width attribute will cause an error). But this seems to be no longer
+relevant; it is not a problem with FOP 0.93 or XEP 4.10. Closes bug #1760559.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Mauritz Jeanson: graphics.xsl</literal></para><screen><phrase role="commit-message">Replaced useless &lt;a&gt; elements with warning messages (textinsert extension).</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Mauritz Jeanson: admon.xsl</literal></para><screen><phrase role="commit-message">Enabled generation of ids (on fo:wrapper) for indexterms in admonition titles, so that page
+references in the <tag>index</tag> can be created. Closes bug #1775086.</phrase></screen>
+</listitem>
+</itemizedlist>
+</sect2><!--end of FO changes for 1.73.1-->
+
+<sect2 xml:id="V1.73.1_HTML">
+<title>HTML</title>
+<para>The following changes have been made to the
+ <filename>html</filename> code
+ since the 1.73.0 release.</para>
+<itemizedlist>
+<listitem>
+<para><literal>Mauritz Jeanson: titlepage.xsl</literal></para><screen><phrase role="commit-message">Added &lt;xsl:call-template name="process.footnotes"/&gt; to <tag>abstract</tag> template
+so that footnotes in <tag>info</tag>/<tag>abstract</tag> are processed. Closes bug #1760907.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Michael(tm) Smith: pi.xsl; synop.xsl</literal></para><screen><phrase role="commit-message">Changed handling of HTML output for the <tag>cmdsynopsis</tag> and
+<tag>funcsynopsis</tag> elements, such that a@id instances are generated for
+them if they are descendants of any element containing a dbcmdlist
+or dbfunclist PI. Also, update the embedded <tag>reference</tag> docs for the
+dbcmdlist and dbfunclist PIs to make it clear that they can be
+used within any element for which <tag>cmdsynopsis</tag> or <tag>funcsynopsis</tag> are
+valid children.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Michael(tm) Smith: formal.xsl</literal></para><screen><phrase role="commit-message">Reverted the part of <tag>revision</tag> 6952 that caused a@id anchors to be
+generated for output of informal objects. Thanks to Sam Steingold
+for reporting.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Robert Stayton: glossary.xsl</literal></para><screen><phrase role="commit-message">Account for a <tag>glossary</tag> with no <tag>glossdiv</tag> or <tag>glossentry</tag> children.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Mauritz Jeanson: titlepage.xsl</literal></para><screen><phrase role="commit-message">Modified <tag>legalnotice</tag> template so that the base.name parameter is calculated
+in the same way as for <tag>revhistory</tag> chunks. Using &lt;xsl:apply-templates
+mode="chunk-filename" select="."/&gt; did not work for single-page output since
+the template with that mode is in chunk-code.xsl.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Mauritz Jeanson: graphics.xsl</literal></para><screen><phrase role="commit-message">Updated support for SVG (must be a child of <tag>imagedata</tag> in DB 5).
+Added support for MathML in <tag>imagedata</tag>.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Mauritz Jeanson: pi.xsl</literal></para><screen><phrase role="commit-message">Added documentation for the dbhh PI (used for context-sensitive HTML Help).
+(The two templates matching 'dbhh' are still in htmlhelp-common.xsl).</phrase></screen>
+</listitem>
+</itemizedlist>
+</sect2><!--end of HTML changes for 1.73.1-->
+
+<sect2 xml:id="V1.73.1_Manpages">
+<title>Manpages</title>
+<para>The following changes have been made to the
+ <filename>manpages</filename> code
+ since the 1.73.0 release.</para>
+<itemizedlist>
+<listitem>
+<para><literal>Michael(tm) Smith: endnotes.xsl</literal></para><screen><phrase role="commit-message">In manpages output, generate warnings about notesources with
+non-para children only if the notesource is a <tag>footnote</tag> or
+<tag>annotation</tag>. Thanks to Sam Steingold for reporting problems with
+the existing handling.</phrase></screen>
+</listitem>
+</itemizedlist>
+</sect2><!--end of Manpages changes for 1.73.1-->
+
+<sect2 xml:id="V1.73.1_HTMLHelp">
+<title>HTMLHelp</title>
+<para>The following changes have been made to the
+ <filename>htmlhelp</filename> code
+ since the 1.73.0 release.</para>
+<itemizedlist>
+<listitem>
+<para><literal>Michael(tm) Smith: htmlhelp-common.xsl</literal></para><screen><phrase role="commit-message">Added single-pass namespace-stripping support to the htmlhelp,
+eclipse, and javahelp stylesheets.</phrase></screen>
+</listitem>
+</itemizedlist>
+</sect2><!--end of HTMLHelp changes for 1.73.1-->
+
+<sect2 xml:id="V1.73.1_Eclipse">
+<title>Eclipse</title>
+<para>The following changes have been made to the
+ <filename>eclipse</filename> code
+ since the 1.73.0 release.</para>
+<itemizedlist>
+<listitem>
+<para><literal>Michael(tm) Smith: eclipse.xsl</literal></para><screen><phrase role="commit-message">Added single-pass namespace-stripping support to the htmlhelp,
+eclipse, and javahelp stylesheets.</phrase></screen>
+</listitem>
+</itemizedlist>
+</sect2><!--end of Eclipse changes for 1.73.1-->
+
+<sect2 xml:id="V1.73.1_JavaHelp">
+<title>JavaHelp</title>
+<para>The following changes have been made to the
+ <filename>javahelp</filename> code
+ since the 1.73.0 release.</para>
+<itemizedlist>
+<listitem>
+<para><literal>Michael(tm) Smith: javahelp.xsl</literal></para><screen><phrase role="commit-message">Added single-pass namespace-stripping support to the htmlhelp,
+eclipse, and javahelp stylesheets.</phrase></screen>
+</listitem>
+</itemizedlist>
+</sect2><!--end of JavaHelp changes for 1.73.1-->
+
+<sect2 xml:id="V1.73.1_Roundtrip">
+<title>Roundtrip</title>
+<para>The following changes have been made to the
+ <filename>roundtrip</filename> code
+ since the 1.73.0 release.</para>
+<itemizedlist>
+<listitem>
+<para><literal>Steve Ball: blocks2dbk.xsl; blocks2dbk.dtd; pages2normalise.xsl</literal></para><screen><phrase role="commit-message">Modularised blocks2dbk to allow customisation,
+Added support for tables to pages2normalise</phrase></screen>
+</listitem>
+</itemizedlist>
+</sect2><!--end of Roundtrip changes for 1.73.1-->
+
+<sect2 xml:id="V1.73.1_Params">
+<title>Params</title>
+<para>The following changes have been made to the
+ <filename>params</filename> code
+ since the 1.73.0 release.</para>
+<itemizedlist>
+<listitem>
+<para><literal>Robert Stayton: procedure.properties.xml</literal></para><screen><phrase role="commit-message"><tag>procedure</tag> was inheriting keep-together from formal.object.properties, but
+a <tag>procedure</tag> does not need to be kept together by default.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Dave Pawson: title.font.family.xml; component.label.includes.part.label.xml; table.frame.b⋯</literal></para><screen><phrase role="commit-message">Regular formatting re-org.</phrase></screen>
+</listitem>
+</itemizedlist>
+</sect2><!--end of Params changes for 1.73.1-->
+</sect1>
+
+<sect1 xml:id="V1.73.0">
+<title>Release: 1.73.0</title>
+<para>This release includes important bug fixes and adds the following
+significant feature changes:
+<variablelist>
+ <varlistentry>
+ <term>New localizations and localization updates</term>
+ <listitem>
+ <para>We added two new localizations: Latvian and
+ Esperanto, and made updates to the Czech, Chinese
+ Simplified, Mongolian, Serbian, Italian, and Ukrainian
+ localizations.</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>ISO690 citation style for bibliography output.</term>
+ <listitem>
+ <para>Set the
+ <parameter>bibliography.style</parameter> parameter to
+ <literal>iso690</literal> to use ISO690 style.</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>New documentation for processing instructions (PI)</term>
+ <listitem>
+ <para>The reference documentation that ships with the
+ release now includes <link
+ xlink:href="http://docbook.sourceforge.net/release/xsl/current/doc/pi/"
+ >documentation on all PIs</link> that you can use to
+ control output from the stylesheets.</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>New profiling parameters for <literal>audience</literal> and <literal>wordsize</literal></term>
+ <listitem>
+ <para>You can now do profiling based on the values of the
+ <literal>audience</literal> and
+ <literal>wordsize</literal> attributes.</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>Changes to man-page output</term>
+ <listitem>
+ <para>The manpages stylesheet now supports single-pass
+ profiling and single-pass DocBook 5 namespace stripping
+ (just as the HTML and FO stylesheets also do). Also, added
+ handling for <tag>mediaobject</tag> &amp;
+ <tag>inlinemediaobject</tag>. (Each <tag>imagedata</tag>,
+ <tag>audiodata</tag>, or <tag>videodata</tag> element
+ within a <tag>mediaobject</tag> or inline
+ <tag>mediaobject</tag> is now treated as a "notesource"
+ and so handled in much the same way as links and
+ <tag>annotation</tag>/<tag>alt</tag>/<tag>footnote</tag>
+ are in manpages output.) And added the
+ <parameter>man.authors.section.enabled</parameter> and
+ <parameter>man.copyright.section.enabled</parameter>
+ parameters to enable control over whether output includes
+ auto-generated <literal>AUTHORS</literal> and
+ <literal>COPYRIGHT</literal> sections.</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>Highlighting support for C</term>
+ <listitem>
+ <para>The highlighting mechanism for generating
+ syntax-highlighted code snippets in output now supports C
+ code listings (along with Java, PHP, XSLT, and others).</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>Experimental <literal>docbook-xsl-update script</literal></term>
+ <listitem>
+ <para>We added an experimental <literal>docbook-xsl-update
+ script</literal>, the purpose of which is to facilitate
+ easy sync-up to the latest docbook-xsl snapshot (by means
+ of rsync).</para>
+ </listitem>
+ </varlistentry>
+</variablelist>
+</para>
+
+<sect2 xml:id="V1.73.0_Gentext">
+<title>Gentext</title>
+<para>The following changes have been made to the
+<filename>gentext</filename> code
+since the 1.72.0 release.</para>
+<itemizedlist>
+<listitem>
+<para><literal>Michael(tm) Smith: locale/lv.xml; Makefile</literal></para><screen><phrase role="commit-message">Added Latvian localization file, from Girts Ziemelis.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Dongsheng Song: locale/zh_cn.xml</literal></para><screen><phrase role="commit-message">Brought up to <tag>date</tag> with en.xml in terms of items. A few strings marked for translation.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Jirka Kosek: locale/cs.xml</literal></para><screen><phrase role="commit-message">Added missing translations</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Robert Stayton: locale/eo.xml</literal></para><screen><phrase role="commit-message">New locale for Esperanto.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Robert Stayton: locale/mn.xml</literal></para><screen><phrase role="commit-message">Update from Ganbold Tsagaankhuu.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Jirka Kosek: locale/en.xml; locale/cs.xml</literal></para><screen><phrase role="commit-message">Rules for normalizing <tag>glossary</tag> entries before they are sorted can be now different for each language.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Michael(tm) Smith: locale/sr_Latn.xml; locale/sr.xml</literal></para><screen><phrase role="commit-message">Committed changes from MiloÅ¡ KomarÄević to Serbian files.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Robert Stayton: locale/ja.xml</literal></para><screen><phrase role="commit-message">Fix <tag>chapter</tag> in context xref-number-and-title</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Robert Stayton: locale/it.xml</literal></para><screen><phrase role="commit-message">Improved version from contributor.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Mauritz Jeanson: locale/uk.xml</literal></para><screen><phrase role="commit-message">Applied patch 1592083.</phrase></screen>
+</listitem>
+</itemizedlist>
+</sect2><!--end of Gentext changes for 1.73.0-->
+<sect2 xml:id="V1.73.0_Common">
+<title>Common</title>
+<para>The following changes have been made to the
+<filename>common</filename> code
+since the 1.72.0 release.</para>
+<itemizedlist>
+<listitem>
+<para><literal>Michael(tm) Smith: labels.xsl</literal></para><screen><phrase role="commit-message">Changed handling of <tag>reference</tag> auto-labeling such that <tag>reference</tag>
+(when it appears at the component level) is now affected by the
+<parameter>label.from.part</parameter> param, just as <tag>preface</tag>, <tag>chapter</tag>, and <tag>appendix</tag>.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Michael(tm) Smith: common.xsl</literal></para><screen><phrase role="commit-message">Added support to the HTML stylesheets for proper processing of
+<tag>orgname</tag> as a child of <tag>author</tag>.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Michael(tm) Smith: refentry.xsl</literal></para><screen><phrase role="commit-message">Refined logging output of <tag>refentry</tag> metadata-gathering template;
+for some cases of "missing" elements (<tag>refmiscinfo</tag> stuff, etc.),
+the log messages now include URL to corresponding page in the
+Definitive Guide (TDG).</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Robert Stayton: titles.xsl</literal></para><screen><phrase role="commit-message">Add <tag>refsection</tag>/<tag>info</tag>/<tag>title</tag> support.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Michael(tm) Smith: titles.xsl</literal></para><screen><phrase role="commit-message">Added support for correct handling of <tag>xref</tag> to elements that
+contain <tag>info</tag>/<tag>title</tag> descendants but no <tag>title</tag> children.
+
+This should be further refined so that it handles any *<tag>info</tag>
+elements. And there are probably some other places where similar
+handling for *<tag>info</tag>/<tag>title</tag> should be added.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Mauritz Jeanson: pi.xsl</literal></para><screen><phrase role="commit-message">Modified &lt;xsl:when&gt; in datetime.format template to work
+around Xalan bug.</phrase></screen>
+</listitem>
+</itemizedlist>
+</sect2><!--end of Common changes for 1.73.0-->
+<sect2 xml:id="V1.73.0_FO">
+<title>FO</title>
+<para>The following changes have been made to the
+<filename>fo</filename> code
+since the 1.72.0 release.</para>
+<itemizedlist>
+<listitem>
+<para><literal>Robert Stayton: component.xsl</literal></para><screen><phrase role="commit-message">Add parameters to the page.sequence utility template.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Mauritz Jeanson: xref.xsl</literal></para><screen><phrase role="commit-message">Added template for <tag>xref</tag> to <tag>area</tag>/<tag>areaset</tag>.
+Part of fix for bug #1675513 (<tag>xref</tag> to <tag>area</tag> broken).</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Michael(tm) Smith: inline.xsl</literal></para><screen><phrase role="commit-message">Added template match for <tag>person</tag> element to fo stylesheet.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Robert Stayton: lists.xsl</literal></para><screen><phrase role="commit-message">Added support for spacing="compact" in <tag>variablelist</tag>, per bug report #1722540.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Robert Stayton: table.xsl</literal></para><screen><phrase role="commit-message"><tag>table</tag> pgwide="1" should also use pgwide.properties attribute-set.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Mauritz Jeanson: inline.xsl</literal></para><screen><phrase role="commit-message">Make citations numbered if <parameter>bibliography.numbered</parameter> != 0.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Robert Stayton: param.xweb; param.ent</literal></para><screen><phrase role="commit-message">Add new profiling parameters for audience and wordsize.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Robert Stayton: param.xweb; param.ent</literal></para><screen><phrase role="commit-message">Added <parameter>callout.icon.size</parameter> parameter.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Robert Stayton: inline.xsl; xref.xsl</literal></para><screen><phrase role="commit-message">Add support for xlink as <tag>olink</tag>.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Robert Stayton: autotoc.xsl; param.xweb; param.ent</literal></para><screen><phrase role="commit-message">Add support for <parameter>qanda.in.toc</parameter> to fo <tag>TOC</tag>.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Robert Stayton: component.xsl</literal></para><screen><phrase role="commit-message">Improved the page.sequence utility template for use with <tag>book</tag>.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Robert Stayton: division.xsl</literal></para><screen><phrase role="commit-message">Refactored the big <tag>book</tag> template into smaller pieces.
+Used the "page.sequence" utility template in
+component.xsl to shorten the <tag>toc</tag> piece.
+Added placeholder templates for front.cover and back.cover.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Robert Stayton: param.xweb; param.ent; sections.xsl</literal></para><screen><phrase role="commit-message">Add <parameter>section.container.element</parameter> parameter to enable
+pgwide spans inside sections.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Robert Stayton: param.xweb; param.ent; component.xsl</literal></para><screen><phrase role="commit-message">Add component.titlepage.properties attribute-set to
+support span="all" and other properties.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Robert Stayton: htmltbl.xsl; table.xsl</literal></para><screen><phrase role="commit-message">Apply table.row.properties template to html <tag>tr</tag> rows too.
+Add keep-with-next to table.row.properties when <tag>row</tag> is in <tag>thead</tag>.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Robert Stayton: table.xsl</literal></para><screen><phrase role="commit-message">Add support for <parameter>default.table.frame</parameter> parameter.
+Fix bug 1575446 rowsep last check for @morerows.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Robert Stayton: refentry.xsl</literal></para><screen><phrase role="commit-message">Add support for <tag>info</tag>/<tag>title</tag> in refsections.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>David Cramer: qandaset.xsl</literal></para><screen><phrase role="commit-message">Make fo questions and answers behave the same way as html</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Jirka Kosek: lists.xsl</literal></para><screen><phrase role="commit-message">Added missing attribute set for <tag>procedure</tag></phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Jirka Kosek: param.xweb; biblio.xsl; docbook.xsl; param.ent; biblio-iso690.xsl</literal></para><screen><phrase role="commit-message">Added support for formatting biblioentries according to ISO690 <tag>citation</tag> style.
+New <tag>bibliography</tag> style can be turned on by setting parameter <parameter>bibliography.style</parameter> to "iso690"
+The code was provided by Jana Dvorakova</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Robert Stayton: param.xweb; param.ent; pagesetup.xsl</literal></para><screen><phrase role="commit-message">Add header.table.properties and footer.table.properties attribute-sets.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Robert Stayton: inline.xsl</literal></para><screen><phrase role="commit-message">Add <parameter>fop1.extensions</parameter> for <tag>menuchoice</tag> arrow handling exception.</phrase></screen>
+</listitem>
+</itemizedlist>
+</sect2><!--end of FO changes for 1.73.0-->
+<sect2 xml:id="V1.73.0_HTML">
+<title>HTML</title>
+<para>The following changes have been made to the
+ <filename>html</filename> code
+ since the 1.72.0 release.</para>
+<itemizedlist>
+<listitem>
+<para><literal>Mauritz Jeanson: param.xweb; param.ent</literal></para><screen><phrase role="commit-message">Moved declaration and documentation of <parameter>javahelp.encoding</parameter> from javahelp.xsl to the
+regular "parameter machinery".</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Michael(tm) Smith: admon.xsl</literal></para><screen><phrase role="commit-message">Changed handling of titles for note, warning, <tag>caution</tag>, <tag>important</tag>,
+<tag>tip</tag> admonitions: We now output and HTML h3 head only if
+<parameter>admon.textlabel</parameter> is non-zero or if the admonition actually contains
+a <tag>title</tag>; otherwise, we don't output an h3 head at all.
+(Previously, we were outputting an empty h3 if the <parameter>admon.textlabel</parameter>
+was zero and if the admonition had no title.)</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Mauritz Jeanson: xref.xsl</literal></para><screen><phrase role="commit-message">Added template for <tag>xref</tag> to <tag>area</tag>/<tag>areaset</tag>.
+Part of fix for bug #1675513 (<tag>xref</tag> to <tag>area</tag> broken).</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Mauritz Jeanson: titlepage.xsl; component.xsl; division.xsl; sections.xsl</literal></para><screen><phrase role="commit-message">Added fixes to avoid duplicate ids when <parameter>generate.id.attributes</parameter> = 1.
+This (hopefully) closes bug #1671052.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Michael(tm) Smith: formal.xsl; pi.xsl</literal></para><screen><phrase role="commit-message">Made the dbfunclist PI work as intended. Also added doc for
+dbfunclist and dbcmdlist PIs.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Michael(tm) Smith: pi.xsl; synop.xsl</literal></para><screen><phrase role="commit-message">Made the dbcmdlist work the way it appears to have been intended
+to work. Restored dbhtml-dir template back to pi.xsl.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Michael(tm) Smith: titlepage.xsl; param.xweb; param.ent</literal></para><screen><phrase role="commit-message">Added new param <parameter>abstract.notitle.enabled</parameter>.
+If non-zero, in output of the <tag>abstract</tag> element on titlepages,
+display of the <tag>abstract</tag> <tag>title</tag> is suppressed.
+Because sometimes you really don't want or need that <tag>title</tag>
+there...</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Michael(tm) Smith: chunk-code.xsl; graphics.xsl</literal></para><screen><phrase role="commit-message">When we are chunking long descriptions for <tag>mediaobject</tag> instances
+into separate HTML output files, and <parameter>use.id.as.filename</parameter> is
+non-zero, if a <tag>mediaobject</tag> has an ID, use that ID as the basename
+for the long-description file (otherwise, we generate an ID for it
+and use that ID as the basename for the file).
+The parallels the recent change made to cause IDs for <tag>legalnotice</tag>
+instances to be used as basenames for <tag>legalnotice</tag> chunks.
+Also, made some minor refinements to the recent changes for
+<tag>legalnotice</tag> chunk handling.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Michael(tm) Smith: titlepage.xsl</literal></para><screen><phrase role="commit-message">Added support to the HTML stylesheets for proper processing of
+<tag>orgname</tag> as a child of <tag>author</tag>.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Michael(tm) Smith: chunk-code.xsl</literal></para><screen><phrase role="commit-message">When $generate.legalnotice.link is non-zero and
+$use.id.as.filename is also non-zero, if a <tag>legalnotice</tag> has an ID,
+then instead of assigning the "ln-&lt;generatedID&gt;" basename to the
+output file for that <tag>legalnotice</tag>, just use its real ID as the
+basename for the file -- as we do when chunking other elements
+that have IDs.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>David Cramer: xref.xsl</literal></para><screen><phrase role="commit-message">Handle <tag>alt</tag> text on xrefs to steps when the step doesn't have a <tag>title</tag>.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>David Cramer: lists.xsl</literal></para><screen><phrase role="commit-message">Added &lt;p&gt; element around <tag>term</tag> in <tag>variablelist</tag> when formatted as <tag>table</tag> to avoid misalignment of <tag>term</tag> and <tag>listitem</tag> in xhtml (non-quirks mode) output</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>David Cramer: qandaset.xsl</literal></para><screen><phrase role="commit-message">Added &lt;p&gt; element around <tag>question</tag> and <tag>answer</tag> labels to avoid misalignment of <tag>label</tag> and <tag>listitem</tag> in xhtml (non-quirks mode) output</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>David Cramer: lists.xsl</literal></para><screen><phrase role="commit-message">Added &lt;p&gt; element around callouts to avoid misalignment of <tag>callout</tag> and <tag>listitem</tag> in xhtml (non-quirks mode) output</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Mauritz Jeanson: inline.xsl</literal></para><screen><phrase role="commit-message">Make citations numbered if <parameter>bibliography.numbered</parameter> != 0.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Robert Stayton: param.xweb; param.ent</literal></para><screen><phrase role="commit-message">Add support for new profiling attributes audience and wordsize.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Robert Stayton: inline.xsl; xref.xsl</literal></para><screen><phrase role="commit-message">Add support for xlink olinks.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Jirka Kosek: glossary.xsl</literal></para><screen><phrase role="commit-message">Rules for normalizing <tag>glossary</tag> entries before they are sorted can be now different for each language.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Robert Stayton: chunk-common.xsl; chunk-code.xsl; manifest.xsl; chunk.xsl</literal></para><screen><phrase role="commit-message">Refactored the chunking modules to move all named templates to
+chunk-common.xsl and all match templates to chunk-code.xsl, in
+order to enable better chunk customization.
+See the comments in chunk.xsl for more details.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Robert Stayton: lists.xsl</literal></para><screen><phrase role="commit-message">Add <tag>anchor</tag> for xml:id for <tag>listitem</tag> in <tag>varlistentry</tag>.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Robert Stayton: refentry.xsl</literal></para><screen><phrase role="commit-message">Add support for <tag>info</tag>/<tag>title</tag> in refsections for db5.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Jirka Kosek: param.xweb; biblio.xsl; docbook.xsl; param.ent; biblio-iso690.xsl</literal></para><screen><phrase role="commit-message">Added support for formatting biblioentries according to ISO690 <tag>citation</tag> style.
+New <tag>bibliography</tag> style can be turned on by setting parameter <parameter>bibliography.style</parameter> to "iso690"
+The code was provided by Jana Dvorakova</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Robert Stayton: inline.xsl; xref.xsl</literal></para><screen><phrase role="commit-message">Add call to class.attribute to &lt;a&gt; output elements so they can
+have a class value too.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Mauritz Jeanson: glossary.xsl</literal></para><screen><phrase role="commit-message">Fixed bug #1644881:
+* Added curly braces around all $language attribute values.
+* Moved declaration of language variable to top level of stylesheet.
+Tested with Xalan, Saxon, and xsltproc.</phrase></screen>
+</listitem>
+</itemizedlist>
+</sect2><!--end of HTML changes for 1.73.0-->
+<sect2 xml:id="V1.73.0_Manpages">
+<title>Manpages</title>
+<para>The following changes have been made to the
+ <filename>manpages</filename> code
+ since the 1.72.0 release.</para>
+<itemizedlist>
+<listitem>
+<para><literal>Michael(tm) Smith: param.xweb; docbook.xsl; param.ent</literal></para><screen><phrase role="commit-message">Added the <parameter>man.authors.section.enabled</parameter> and
+<parameter>man.copyright.section.enabled</parameter> parameters. Set those to zero when
+you want to suppress display of the auto-generated AUTHORS and
+<tag>COPYRIGHT</tag> sections. Closes request #1467806. Thanks to Daniel
+Leidert.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Michael(tm) Smith: docbook.xsl</literal></para><screen><phrase role="commit-message">Took the test that the manpages stylesheet does to see if there
+are any <tag>Refentry</tag> chilren in current doc, and made it
+namespace-agnostic. Reason for that is because the test otherwise
+won't work when it is copied over into the generated
+profile-docbook.xsl stylesheet.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Michael(tm) Smith: Makefile</literal></para><screen><phrase role="commit-message">Added a manpages/profile-docbook.xsl file to enable single-pass
+profiling for manpages output.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Michael(tm) Smith: info.xsl</literal></para><screen><phrase role="commit-message">Output <tag>copyright</tag> and <tag>legalnotice</tag> in man-page output in whatever
+place they are in in document order. Closes #1690539. Thanks to
+Daniel Leidert for reporting.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Michael(tm) Smith: docbook.xsl</literal></para><screen><phrase role="commit-message">Restored support for single-pass namespace stripping to manpages
+stylesheet.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Michael(tm) Smith: synop.xsl; block.xsl; info.xsl; inline.xsl; lists.xsl; endnotes.xsl; ut⋯</literal></para><screen><phrase role="commit-message">Changed handling of bold and italic/underline output in manpages
+output. Should be transparent to users, but...
+
+This touches handling of all bold and italic/underline output. The
+exact change is that the mode="bold" and mode="italic" utility
+templates were changed to named templates. (I think maybe I've
+changed it back and forth from mode to named before, so this is
+maybe re-reverting it yet again).
+
+Anyway, the reason for the change is that the templates are
+sometimes call on dynamically node-sets, and using modes to format
+those doesn't allow passing <tag>info</tag> about the current/real context
+node from the source (not the node-set created by the stylesheet)
+to that formatting stage.
+
+The named templates allow the context to be passed in as a
+parameter, so that the bold/ital formatting template can use
+context-aware condition checking.
+
+This was basically necessary in order to suppress bold formatting
+in titles, which otherwise gets screwed up because of the numbnut
+way that roff handles nested bold/ital.
+
+Closes #1674534). Much thanks to Daniel Leidert, whose in his
+docbook-xsl bug-finding kung-fu has achieved Grand Master status.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Michael(tm) Smith: block.xsl</literal></para><screen><phrase role="commit-message">Fixed handling of example instances by adding the example element
+to the same template we use for processing <tag>figure</tag>. Closes
+#1674538. Thanks to Daniel Leidert.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Michael(tm) Smith: utility.xsl</literal></para><screen><phrase role="commit-message">Don't include lang in manpages <tag>filename</tag>/pathname if lang=en (that
+is, only generate lang-qualified file-/pathnames for non-English).</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Michael(tm) Smith: endnotes.xsl</literal></para><screen><phrase role="commit-message">In manpages output, emit warnings for notesources (<tag>footnote</tag>, etc.)
+that have something other than <tag>para</tag> as a child.
+
+The numbered-with-hanging-indent formatting that's used for
+rendering endnotes in the NOTES <tag>section</tag> of man pages places some
+limits/assumptions on how the DocBook source is marked up; namely,
+for notesources (<tag>footnote</tag>, <tag>annotation</tag>, etc.) that can contain
+block-level children, if the they have a block-level child such as
+a <tag>table</tag> or <tag>itemizedlist</tag> or <tag>orderedlist</tag> that is the first child of
+a <tag>footnote</tag>, we have no way of rendering/indenting its content
+properly in the endnotes list.
+
+Thus, the manpages stylesheet not emits a warning message for that
+case, and suggests the "fix" (which is to wrap the <tag>table</tag> or
+<tag>itemizedlist</tag> or whatever in a <tag>para</tag> that has some preferatory text.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Michael(tm) Smith: utility.xsl</literal></para><screen><phrase role="commit-message">Added support to mixed-block template for handling tables in
+mixed-blocks (e.g., as child of <tag>para</tag>) correctly.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Michael(tm) Smith: table.xsl; synop.xsl; block.xsl; info.xsl; lists.xsl; refentry.xsl; end⋯</literal></para><screen><phrase role="commit-message">Reverted necessary escaping of backslash, dot, and dash
+out of the well-intentioned (but it now appears,
+misguided) "marker" mechanism (introduced in the 1.72.0
+release) -- which made use of alternative "marker"
+characters as internal representations of those
+characters, and then replaced them just prior to
+serialization -- and back into what's basically the
+system that was used prior to the 1.69.0 release; that
+is, into a part of stylesheet code that gets executed
+at the beginning of processing -- before any other roff
+markup up is. This change obviates the need for the
+marker system. It also requires a lot less RAM during
+processing (for large files, the marker mechanism
+ending up requiring gigabytes of memory).
+
+Closes bug #1661177. Thanks to Scott Smedley for
+providing a test case (the fvwm man page) that exposed
+the problem with the marker mechanism.
+
+Also moved the mechanism for converting non-breaking
+spaces back into the same <tag>area</tag> of the stylesheet code.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Michael(tm) Smith: lists.xsl</literal></para><screen><phrase role="commit-message">Fixed problem with incorrect formatting of nested <tag>variablelist</tag>.
+Closes bug #1650931. Thanks to Daniel "Eagle Eye" Leidert.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Michael(tm) Smith: lists.xsl</literal></para><screen><phrase role="commit-message">Make sure that all listitems in <tag>itemizedlist</tag> and <tag>orderedlist</tag> are
+preceded by a blank line. This fixes a regression that occurred
+when instances of the TP macro that were use in a previous
+versions of the list-handling code were switched to RS/RE (because
+TP doesn't support nesting). TP automatically generates a blank
+line, but RS doesn't. So I added a .sp before each .RS</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Michael(tm) Smith: block.xsl; inline.xsl; param.xweb; docbook.xsl; links.xsl; param.ent</literal></para><screen><phrase role="commit-message">Made a number of changes related to elements with
+out-of-line content:
+
+- Added handling for <tag>mediaobject</tag> &amp; <tag>inlinemediaobject</tag>.
+ Each <tag>imagedata</tag>, <tag>audiodata</tag>, or <tag>videodata</tag> element
+ within a <tag>mediaobject</tag> or inline <tag>mediaobject</tag> is now
+ treated as a "notesource" and so handled in much the
+ same way as links and <tag>annotation</tag>/<tag>alt</tag>/footnotes.
+
+ That means a numbered marker is generated inline to
+ mark the place in the main flow where the <tag>imagedata</tag>,
+ <tag>audiodata</tag>, or <tag>videodata</tag> element occurs, and a
+ corresponding numbered endnote for it is generated in
+ the endnotes list at the end of the man page; the
+ endnote contains the URL from the fileref attribute
+ of the <tag>imagedata</tag>, <tag>audiodata</tag>, or <tag>videodata</tag> element.
+
+ For mediobject and <tag>inlinemediaobject</tag> instances that
+ have a <tag>textobject</tag> child, the <tag>textobject</tag> is displayed
+ within the main text flow.
+
+- Renamed several man.link.* params to man.endnotes.*,
+ to reflect that fact that the endnotes list now
+ contains more than just links. Also did similar
+ renaming for a number of stylesheet-internal vars.
+
+- Added support for xlink:href (along with existing
+ support for the legacy ulink element).
+
+- Cleaned up and streamlined the endnotes-handling
+ code. It's still messy and klunky and the basic
+ mechanism it uses is very inefficent for documents
+ that contain a lot of notesources, but at least it's
+ a bit better than it was.</phrase></screen>
+</listitem>
+</itemizedlist>
+</sect2><!--end of Manpages changes for 1.73.0-->
+<sect2 xml:id="V1.73.0_Eclipse">
+<title>Eclipse</title>
+<para>The following changes have been made to the
+ <filename>eclipse</filename> code
+ since the 1.72.0 release.</para>
+<itemizedlist>
+<listitem>
+<para><literal>Mauritz Jeanson: Makefile</literal></para><screen><phrase role="commit-message">Fixed bug #1715093: Makefile for creating profiled version of eclipse.xsl added.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>David Cramer: eclipse.xsl</literal></para><screen><phrase role="commit-message">Added normalize-space around to avoid leading whitespace from appearing in the output if there's extra leading whitespace (e.g. &lt;<tag>title</tag>&gt; Foo&lt;/<tag>title</tag>&gt;) in the source</phrase></screen>
+</listitem>
+</itemizedlist>
+</sect2><!--end of Eclipse changes for 1.73.0-->
+<sect2 xml:id="V1.73.0_JavaHelp">
+<title>JavaHelp</title>
+<para>The following changes have been made to the
+ <filename>javahelp</filename> code
+ since the 1.72.0 release.</para>
+<itemizedlist>
+<listitem>
+<para><literal>Mauritz Jeanson: javahelp.xsl</literal></para><screen><phrase role="commit-message">Implemented FR #1230233 (sorted <tag>index</tag> in javahelp).</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Mauritz Jeanson: javahelp.xsl</literal></para><screen><phrase role="commit-message">Added normalize-space() around titles and <tag>index</tag> entries to work around whitespace problems.
+Added support for <tag>glossary</tag> and <tag>bibliography</tag> in <tag>toc</tag> and map files.</phrase></screen>
+</listitem>
+</itemizedlist>
+</sect2><!--end of JavaHelp changes for 1.73.0-->
+<sect2 xml:id="V1.73.0_Roundtrip">
+<title>Roundtrip</title>
+<para>The following changes have been made to the
+ <filename>roundtrip</filename> code
+ since the 1.72.0 release.</para>
+<itemizedlist>
+<listitem>
+<para><literal>Steve Ball: blocks2dbk.xsl; wordml2normalise.xsl; normalise2sections.xsl; sections2blocks.⋯</literal></para><screen><phrase role="commit-message">new stylesheets for better word processor support and easier maintenance</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Steve Ball: template-pages.xml; dbk2wp.xsl; sections-spec.xml</literal></para><screen><phrase role="commit-message">fixed bugs</phrase></screen>
+</listitem>
+</itemizedlist>
+</sect2><!--end of Roundtrip changes for 1.73.0-->
+<sect2 xml:id="V1.73.0_Params">
+<title>Params</title>
+<para>The following changes have been made to the
+ <filename>params</filename> code
+ since the 1.72.0 release.</para>
+<itemizedlist>
+<listitem>
+<para><literal>Mauritz Jeanson: htmlhelp.button.back.xml; htmlhelp.button.forward.xml; htmlhelp.button.zo⋯</literal></para><screen><phrase role="commit-message">Modified <tag>refpurpose</tag> text.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Mauritz Jeanson: htmlhelp.map.file.xml; htmlhelp.force.map.and.alias.xml; htmlhelp.alias.f⋯</literal></para><screen><phrase role="commit-message">Fixed typos, made some small changes.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Mauritz Jeanson: javahelp.encoding.xml</literal></para><screen><phrase role="commit-message">Moved declaration and documentation of <parameter>javahelp.encoding</parameter> from javahelp.xsl to the
+regular "parameter machinery".</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Mauritz Jeanson: generate.id.attributes.xml</literal></para><screen><phrase role="commit-message">Added <tag>refpurpose</tag> text.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Mauritz Jeanson: annotation.js.xml; annotation.graphic.open.xml; annotation.graphic.close.⋯</literal></para><screen><phrase role="commit-message">Added better <tag>refpurpose</tag> texts.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Michael(tm) Smith: chunker.output.cdata-section-elements.xml; chunker.output.standalone.xm⋯</literal></para><screen><phrase role="commit-message">Fixed some broken formatting in source files for chunker.* params,
+as pointed out by Dave Pawson.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Michael(tm) Smith: label.from.part.xml</literal></para><screen><phrase role="commit-message">Changed handling of <tag>reference</tag> auto-labeling such that <tag>reference</tag>
+(when it appears at the component level) is now affected by the
+<parameter>label.from.part</parameter> param, just as <tag>preface</tag>, <tag>chapter</tag>, and <tag>appendix</tag>.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Mauritz Jeanson: callout.graphics.extension.xml</literal></para><screen><phrase role="commit-message">Clarified that 'extension' refers to file names.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Michael(tm) Smith: abstract.notitle.enabled.xml</literal></para><screen><phrase role="commit-message">Added new param <parameter>abstract.notitle.enabled</parameter>.
+If non-zero, in output of the <tag>abstract</tag> element on titlepages,
+display of the <tag>abstract</tag> <tag>title</tag> is suppressed.
+Because sometimes you really don't want or need that <tag>title</tag>
+there...</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Michael(tm) Smith: man.string.subst.map.xml</literal></para><screen><phrase role="commit-message">Updated manpages string-substitute map to reflect fact that
+because of another recent change to suppress bold markup in .SH
+output, we no longer need to add a workaround for the accidental
+uppercasing of roff escapes that occurred previously.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Jirka Kosek: margin.note.float.type.xml; title.font.family.xml; table.frame.border.color.x⋯</literal></para><screen><phrase role="commit-message">Improved parameter metadata</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Robert Stayton: profile.wordsize.xml; profile.audience.xml</literal></para><screen><phrase role="commit-message">Add support for profiling on new attributes audience and wordsize.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Robert Stayton: callout.graphics.number.limit.xml; callout.graphics.extension.xml</literal></para><screen><phrase role="commit-message">Added SVG graphics for fo output.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Robert Stayton: callout.icon.size.xml</literal></para><screen><phrase role="commit-message">Set size of <tag>callout</tag> graphics.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Jirka Kosek: default.units.xml; chunker.output.method.xml; toc.list.type.xml; output.inden⋯</literal></para><screen><phrase role="commit-message">Updated parameter metadata to the new format.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Jirka Kosek: man.output.quietly.xml; title.font.family.xml; footnote.sep.leader.properties⋯</literal></para><screen><phrase role="commit-message">Added type annotations into parameter definition files.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Robert Stayton: section.container.element.xml</literal></para><screen><phrase role="commit-message">Support spans in sections for certain processors.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Robert Stayton: component.titlepage.properties.xml</literal></para><screen><phrase role="commit-message">Empty attribute set for top level component titlepage block.
+Allows setting a span on <tag>title</tag> <tag>info</tag>.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Jirka Kosek: bibliography.style.xml</literal></para><screen><phrase role="commit-message">Added <tag>link</tag> to WiKi page with description of special markup needed for ISO690 biblioentries</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Robert Stayton: make.year.ranges.xml</literal></para><screen><phrase role="commit-message">Clarify that multiple <tag>year</tag> elements are required.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Robert Stayton: id.warnings.xml</literal></para><screen><phrase role="commit-message">Turn off <parameter>id.warnings</parameter> by default.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Jirka Kosek: bibliography.style.xml</literal></para><screen><phrase role="commit-message">Added support for formatting biblioentries according to ISO690 <tag>citation</tag> style.
+New <tag>bibliography</tag> style can be turned on by setting parameter <parameter>bibliography.style</parameter> to "iso690"
+The code was provided by Jana Dvorakova</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Robert Stayton: header.table.properties.xml; footer.table.properties.xml</literal></para><screen><phrase role="commit-message">Support adding <tag>table</tag> properties to header and footer tables.</phrase></screen>
+</listitem>
+</itemizedlist>
+</sect2><!--end of Params changes for 1.73.0-->
+<sect2 xml:id="V1.73.0_Highlighting">
+<title>Highlighting</title>
+<para>The following changes have been made to the
+ <filename>highlighting</filename> code
+ since the 1.72.0 release.</para>
+<itemizedlist>
+<listitem>
+<para><literal>Jirka Kosek: c-hl.xml; xslthl-config.xml</literal></para><screen><phrase role="commit-message">Added support for C language. Provided by Bruno Guegan.</phrase></screen>
+</listitem>
+</itemizedlist>
+</sect2><!--end of Highlighting changes for 1.73.0-->
+<sect2 xml:id="V1.73.0_Profiling">
+<title>Profiling</title>
+<para>The following changes have been made to the
+ <filename>profiling</filename> code
+ since the 1.72.0 release.</para>
+<itemizedlist>
+<listitem>
+<para><literal>Robert Stayton: profile-mode.xsl</literal></para><screen><phrase role="commit-message">Add support for new profiling attributes audience and wordsize.</phrase></screen>
+</listitem>
+</itemizedlist>
+</sect2><!--end of Profiling changes for 1.73.0-->
+<sect2 xml:id="V1.73.0_Lib">
+<title>Lib</title>
+<para>The following changes have been made to the
+ <filename>lib</filename> code
+ since the 1.72.0 release.</para>
+<itemizedlist>
+<listitem>
+<para><literal>Michael(tm) Smith: lib.xweb</literal></para><screen><phrase role="commit-message">Changed name of prepend-pad template to pad-string and twheeked so
+it can do both right/left padding.</phrase></screen>
+</listitem>
+</itemizedlist>
+</sect2><!--end of Lib changes for 1.73.0-->
+<sect2 xml:id="V1.73.0_Tools">
+<title>Tools</title>
+<para>The following changes have been made to the
+ <filename>tools</filename> code
+ since the 1.72.0 release.</para>
+<itemizedlist>
+<listitem>
+<para><literal>Michael(tm) Smith: bin; bin/docbook-xsl-update</literal></para><screen><phrase role="commit-message">Did some cleanup to the install.sh source and added a
+docbook-xsl-update script to the docbook-xsl distro, the purpose
+of which is to facilitate easy sync-up to the latest docbook-xsl
+snapshot (by means of rsync).</phrase></screen>
+</listitem>
+</itemizedlist>
+</sect2><!--end of Tools changes for 1.73.0-->
+<sect2 xml:id="V1.73.0_XSL-Saxon">
+<title>XSL-Saxon</title>
+<para>The following changes have been made to the
+ <filename>xsl-saxon</filename> code
+ since the 1.72.0 release.</para>
+<itemizedlist>
+<listitem>
+<para><literal>Mauritz Jeanson: xalan27/src/com/nwalsh/xalan/Verbatim.java; xalan27/src/com/nwalsh/xalan/⋯</literal></para><screen><phrase role="commit-message">Added modifications so that the new <parameter>callout.icon.size</parameter> parameter is taken into account. This
+parameter is used for FO output (where SVG now is the default graphics format for callouts).</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Mauritz Jeanson: saxon65/src/com/nwalsh/saxon/FormatCallout.java; xalan27/src/com/nwalsh/x⋯</literal></para><screen><phrase role="commit-message">Added code for generating id attributes on callouts in HTML and FO output.
+These patches enable cross-references to callouts placed by <tag>area</tag> coordinates.
+It works for graphic, unicode and text callouts.
+Part of fix for bug #1675513 (<tag>xref</tag> to <tag>area</tag> broken).</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Michael(tm) Smith: saxon65/src/com/nwalsh/saxon/Website.java; xalan27/src/com/nwalsh/xalan⋯</literal></para><screen><phrase role="commit-message">Copied over Website XSL Java extensions.</phrase></screen>
+</listitem>
+</itemizedlist>
+</sect2><!--end of XSL-Saxon changes for 1.73.0-->
+<sect2 xml:id="V1.73.0_XSL-Xalan">
+<title>XSL-Xalan</title>
+<para>The following changes have been made to the
+ <filename>xsl-xalan</filename> code
+ since the 1.72.0 release.</para>
+<itemizedlist>
+<listitem>
+<para><literal>Michael(tm) Smith: Makefile; xalan2</literal></para><screen><phrase role="commit-message">Turned off xalan2.jar build. This removes DocBook XSL
+Java extensions support for versions of Xalan prior to
+Xalan 2.7. If you are currently using the extensions
+with an earlier version of Xalan, you need to upgrade
+to Xalan 2.7.</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Mauritz Jeanson: xalan27/src/com/nwalsh/xalan/Verbatim.java; xalan27/src/com/nwalsh/xalan/⋯</literal></para><screen><phrase role="commit-message">Added modifications so that the new <parameter>callout.icon.size</parameter> parameter is taken into account. This
+parameter is used for FO output (where SVG now is the default graphics format for callouts).</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Mauritz Jeanson: saxon65/src/com/nwalsh/saxon/FormatCallout.java; xalan27/src/com/nwalsh/x⋯</literal></para><screen><phrase role="commit-message">Added code for generating id attributes on callouts in HTML and FO output.
+These patches enable cross-references to callouts placed by <tag>area</tag> coordinates.
+It works for graphic, unicode and text callouts.
+Part of fix for bug #1675513 (<tag>xref</tag> to <tag>area</tag> broken).</phrase></screen>
+</listitem>
+<listitem>
+<para><literal>Michael(tm) Smith: saxon65/src/com/nwalsh/saxon/Website.java; xalan27/src/com/nwalsh/xalan⋯</literal></para><screen><phrase role="commit-message">Copied over Website XSL Java extensions.</phrase></screen>
+</listitem>
+</itemizedlist>
+</sect2><!--end of XSL-Saxon changes for 1.73.0-->
+</sect1><!--end of changes for the 1.73.0 release-->
+
+<sect1 xml:id="V1.72.0">
+<title>Release: 1.72.0</title>
+<para>This release includes important bug fixes and adds the following
+significant feature changes:
+<variablelist>
+ <varlistentry>
+ <term>Automatic sorting of glossary entries</term>
+ <listitem>
+ <para>The HTML and FO stylesheets now support automatic sorting
+ of <tag>glossary</tag> entries. To enable glossary sorting, set
+ the value of the <parameter>glossary.sort </parameter> parameter
+ to <code>1</code> (by default, it’s value is
+ <code>0</code>). When you enable glossary sorting,
+ <tag>glossentry</tag> elements within a <tag> glossary</tag>,
+ <tag>glossdiv</tag>, or <tag>glosslist</tag> are sorted on the
+ <tag>glossterm</tag>, using the current language setting. If you
+ don’t enable glossary sorting, then the order of
+ <tag>glossentry</tag> elements is left “as is†— that is, they
+ are not sorted but are instead just displayed in document
+ order.</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>WordML renamed to Roundtrip, OpenOffice support added</term>
+ <listitem>
+ <para>Stylesheets for “roundtrip†conversion between documents in
+ OpenOffice format (ODF) and DocBook XML have been added to the set
+ of stylesheets that formerly had the collective title
+ <wordasword>WordML</wordasword>, and that set of stylesheets has
+ been renamed to <wordasword>Roundtrip</wordasword> to better
+ reflect the actual scope and purpose of its contents.</para>
+ <para>So the DocBook XSL Stylesheets now support roundtrip
+ conversion (with certain limitations) of WordML, OpenOffice, and
+ Apple Pages documents to and from DocBook XML.</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>Including QandASet questions in TOCs</term>
+ <listitem>
+ <para>The HTML stylesheet now provides support for including
+ <tag>QandASet</tag> <tag>question</tag>s in the document TOC. To
+ enable display of <tag>question</tag>s in the document TOC, set
+ the value of the <parameter>qanda.in.toc</parameter> to
+ <code>1</code> (by default, it’s <code>0</code>). When you
+ enable <parameter>qanda.in.toc</parameter>, then the generated
+ table of contents for a document will include
+ <tag>qandaset</tag> titles, <tag>qandadiv</tag> titles, and
+ <tag>question</tag> elements. The default value of zero
+ excludes them from the TOC.
+ <note>
+ <para>The <parameter>qanda.in.toc</parameter> parameter does
+ not affect any tables of contents that may be generated
+ <emphasis>within</emphasis> a <tag>qandaset</tag> or
+ <tag>qandadiv</tag> (only in the document TOC).</para>
+ </note>
+ </para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>Language identifier in man-page filenames and pathnames</term>
+ <listitem>
+ <para>Added new parameter <parameter
+ >man.output.lang.in.name.enabled</parameter>, which controls whether
+ a language identifier is included in man-page filenames and
+ pathnames. It works like this:</para>
+
+ <para>If the value of <parameter
+ >man.output.lang.in.name.enabled</parameter> is non-zero,
+ man-page files are output with a language identifier included in
+ their filenames or pathnames as follows:</para>
+
+ <itemizedlist>
+ <listitem><para>if
+ <parameter>man.output.subdirs.enabled</parameter> is non-zero,
+ each file is output to, e.g., a
+ <filename>/$lang/man8/foo.8</filename> pathname</para></listitem>
+
+ <listitem><para>if
+ <parameter>man.output.subdirs.enabled</parameter> is zero,
+ each file is output with a <tag>foo.$lang.8</tag>
+ filename</para></listitem>
+ </itemizedlist>
+
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><parameter>index.page.number.properties</parameter> property set</term>
+ <listitem>
+ <para>For FO output, use the
+ <parameter>index.page.number.properties</parameter> to control
+ formatting of page numbers in <tag>index</tag> output — to (for
+ example) to display page numbers in <tag>index</tag> output in a
+ different color (to indicate that they are links).</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>Crop marks in output from Antenna House XSL Formatter</term>
+ <listitem>
+ <para>Support has been added for generating crop marks in
+ print/PDF output generated using Antenna House XSL Formatter</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>More string-substitution hooks in manpages output</term>
+ <listitem>
+ <para>The <parameter>man.string.subst.map.local.pre</parameter>
+ and <parameter>man.string.subst.map.local.post</parameter>
+ parameters have been added to enable easier control over
+ custom string substitutions.</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>Moved verbatim properties to attribute-set</term>
+ <listitem>
+ <para>The hardcoded properties used in verbatim elements (literallayout,
+ programlisting, screen) were moved to the verbatim.properties
+ attribute-set so they can be more easily customized.</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>enhanced simple.xlink template</term>
+ <listitem>
+ <para>Now the simple.xlink template in inline.xsl works with
+ cross reference elements xref and link as well. Also, more elements
+ call simple.xlink, which enables DB5 xlink functionality.
+ </para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>DocBook 5 compatibility</term>
+ <listitem>
+ <para>Stylesheets now consistently support DocBook 5 attributes
+ (such as xml:id). Also, DocBook 5 info elements are now checked
+ along with other *info elements, and the use of name() function
+ was replaced by local-name() so it also matches on DocBook 5 elements.
+ These changes enable reusing the stylesheets with DocBook 5
+ documents with minimal fixup.
+ </para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>HTML class attributes now handled in class.attribute mode </term>
+ <listitem>
+ <para>The HTML class attributes were formerly hardcoded to the
+ element name. Now the class attribute is generated by applying
+ templates in class.attribute mode so class attribute names
+ can be customized. The default is still the element name.</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>arabic-indic numbering enabled in autolabels</term>
+ <listitem>
+ <para>Numbering of chapter, sections, and pages can now use
+ arabic-indic numbering when number format is set to 'arabicindic' or
+ to &#x661;.</para>
+ </listitem>
+ </varlistentry>
+</variablelist>
+The following is a detailed list of changes (not
+including bug fixes) that have been made since the 1.71.1
+release.</para>
+
+<sect2 xml:id="V1.72.0_Common">
+<title>Common</title>
+<para>The following changes have been made to the
+ <filename>common</filename> code
+ since the 1.71.1 release.</para>
+<itemizedlist>
+<listitem>
+<literallayout><phrase role="commit-message">Add support for arabicindic numbering to autolabel.format template.<alt>M: /trunk/xsl/common/labels.xsl - Robert Stayton</alt></phrase></literallayout>
+</listitem>
+<listitem>
+<literallayout><phrase role="commit-message">Finish support for @xml:id everywhere @id is used.<alt>M: /trunk/xsl/common/gentext.xsl; M: /trunk/xsl/common/titles.xsl - Robert Stayton</alt></phrase></literallayout>
+</listitem>
+<listitem>
+<literallayout><phrase role="commit-message">replace name() with local-name() in most cases.<alt>M: /trunk/xsl/common/l10n.xsl; M: /trunk/xsl/common/olink.xsl; M: /trunk/xsl/common/subtitles.xsl; M: /trunk/xsl/common/labels.xsl; M: /trunk/xsl/common/titles.xsl; M: /trunk/xsl/common/common.xsl - Robert Stayton</alt></phrase></literallayout>
+</listitem>
+<listitem>
+<literallayout><phrase role="commit-message">Add support for <tag>info</tag>.<alt>M: /trunk/xsl/common/subtitles.xsl; M: /trunk/xsl/common/labels.xsl; M: /trunk/xsl/common/titles.xsl; M: /trunk/xsl/common/common.xsl; M: /trunk/xsl/common/targets.xsl - Robert Stayton</alt></phrase></literallayout>
+</listitem>
+<listitem>
+<literallayout><phrase role="commit-message">Add utility template tabstyle to return the tabstyle from
+any <tag>table</tag> element.<alt>M: /trunk/xsl/common/table.xsl - Robert Stayton</alt></phrase></literallayout>
+</listitem>
+</itemizedlist>
+</sect2><!--end of Common changes for 1.72.0-->
+
+<sect2 xml:id="V1.72.0_FO">
+<title>FO</title>
+<para>The following changes have been made to the
+ <filename>fo</filename> code
+ since the 1.71.1 release.</para>
+<itemizedlist>
+<listitem>
+<literallayout><phrase role="commit-message">Add support for sorting <tag>glossary</tag> entries<alt>M: /trunk/xsl/fo/param.xweb; M: /trunk/xsl/fo/param.ent; M: /trunk/xsl/fo/glossary.xsl - Robert Stayton</alt></phrase></literallayout>
+</listitem>
+<listitem>
+<literallayout><phrase role="commit-message">Add table.row.properties template to customize <tag>table</tag> rows.<alt>M: /trunk/xsl/fo/table.xsl - Robert Stayton</alt></phrase></literallayout>
+</listitem>
+<listitem>
+<literallayout><phrase role="commit-message">Moved all properties to attribute-sets so can be customized more easily.<alt>M: /trunk/xsl/fo/verbatim.xsl - Robert Stayton</alt></phrase></literallayout>
+</listitem>
+<listitem>
+<literallayout><phrase role="commit-message">Add index.page.number.properties attribute-set to format page numbers.<alt>M: /trunk/xsl/fo/autoidx.xsl - Robert Stayton</alt></phrase></literallayout>
+</listitem>
+<listitem>
+<literallayout><phrase role="commit-message"><tag>xref</tag> now supports xlink:href, using simple.xlink template.<alt>M: /trunk/xsl/fo/xref.xsl - Robert Stayton</alt></phrase></literallayout>
+</listitem>
+<listitem>
+<literallayout><phrase role="commit-message">Rewrote simple.xlink, and call it with all charseq templates.<alt>M: /trunk/xsl/fo/inline.xsl - Robert Stayton</alt></phrase></literallayout>
+</listitem>
+<listitem>
+<literallayout><phrase role="commit-message">Add simple.xlink processing to <tag>term</tag> and <tag>member</tag> elements.<alt>M: /trunk/xsl/fo/lists.xsl - Robert Stayton</alt></phrase></literallayout>
+</listitem>
+<listitem>
+<literallayout><phrase role="commit-message">Add support for crop marks in Antenna House.<alt>M: /trunk/xsl/fo/axf.xsl; M: /trunk/xsl/fo/pagesetup.xsl - Robert Stayton</alt></phrase></literallayout>
+</listitem>
+</itemizedlist>
+</sect2><!--end of FO changes for 1.72.0-->
+
+<sect2 xml:id="V1.72.0_HTML">
+<title>HTML</title>
+<para>The following changes have been made to the
+ <filename>html</filename> code
+ since the 1.71.1 release.</para>
+<itemizedlist>
+<listitem>
+<literallayout><phrase role="commit-message">Add support for sorting <tag>glossary</tag> entries<alt>M: /trunk/xsl/html/glossary.xsl - Robert Stayton</alt></phrase></literallayout>
+</listitem>
+<listitem>
+<literallayout><phrase role="commit-message">Add support for <parameter>qanda.in.toc</parameter> to add <tag>qandaentry</tag> questions to document <tag>TOC</tag>.<alt>M: /trunk/xsl/html/autotoc.xsl; M: /trunk/xsl/html/param.xweb; M: /trunk/xsl/html/param.ent - Robert Stayton</alt></phrase></literallayout>
+</listitem>
+<listitem>
+<literallayout><phrase role="commit-message">add simple.xlink support to <tag>variablelist</tag> <tag>term</tag> and <tag>simplelist</tag> <tag>member</tag>.<alt>M: /trunk/xsl/html/lists.xsl - Robert Stayton</alt></phrase></literallayout>
+</listitem>
+<listitem>
+<literallayout><phrase role="commit-message">*.propagates.style now handled in class.attribute mode.<alt>M: /trunk/xsl/html/inline.xsl; M: /trunk/xsl/html/lists.xsl; M: /trunk/xsl/html/table.xsl; M: /trunk/xsl/html/block.xsl; M: /trunk/xsl/html/footnote.xsl - Robert Stayton</alt></phrase></literallayout>
+</listitem>
+<listitem>
+<literallayout><phrase role="commit-message">add class parameter to class.attribute mode to set default class.<alt>M: /trunk/xsl/html/html.xsl - Robert Stayton</alt></phrase></literallayout>
+</listitem>
+<listitem>
+<literallayout><phrase role="commit-message">Convert all class attributes to use the class.attribute mode
+so class names can be customized more easily.<alt>M: /trunk/xsl/html/titlepage.xsl; M: /trunk/xsl/html/chunk-code.xsl; M: /trunk/xsl/html/division.xsl; M: /trunk/xsl/html/sections.xsl; M: /trunk/xsl/html/math.xsl; M: /trunk/xsl/html/block.xsl; M: /trunk/xsl/html/info.xsl; M: /trunk/xsl/html/footnote.xsl; M: /trunk/xsl/html/lists.xsl; M: /trunk/xsl/html/admon.xsl; M: /trunk/xsl/html/refentry.xsl; M: /trunk/xsl/html/qandaset.xsl; M: /trunk/xsl/html/graphics.xsl; M: /trunk/xsl/html/biblio.xsl; M: /trunk/xsl/html/task.xsl; M: /trunk/xsl/html/component.xsl; M: /trunk/xsl/html/glossary.xsl; M: /trunk/xsl/html/callout.xsl; M: /trunk/xsl/html/index.xsl; M: /trunk/xsl/html/synop.xsl; M: /trunk/xsl/html/verbatim.xsl; M: /trunk/xsl/html/ebnf.xsl - Robert Stayton</alt></phrase></literallayout>
+</listitem>
+<listitem>
+<literallayout><phrase role="commit-message">Add class.attribute mode to generate class attributes.<alt>M: /trunk/xsl/html/html.xsl - Robert Stayton</alt></phrase></literallayout>
+</listitem>
+<listitem>
+<literallayout><phrase role="commit-message">Added simple.xlink to most remaining inlines.
+Changed class attributes to applying class.attributes mode.<alt>M: /trunk/xsl/html/inline.xsl - Robert Stayton</alt></phrase></literallayout>
+</listitem>
+<listitem>
+<literallayout><phrase role="commit-message">Changed <tag>xref</tag> template to use simple.xlink tempalte.<alt>M: /trunk/xsl/html/xref.xsl - Robert Stayton</alt></phrase></literallayout>
+</listitem>
+<listitem>
+<literallayout><phrase role="commit-message">Improve generate.html.title to work with <tag>link</tag> targets too.<alt>M: /trunk/xsl/html/html.xsl - Robert Stayton</alt></phrase></literallayout>
+</listitem>
+<listitem>
+<literallayout><phrase role="commit-message">Improved simple.xlink to support <tag>link</tag> and <tag>xref</tag>.<alt>M: /trunk/xsl/html/inline.xsl - Robert Stayton</alt></phrase></literallayout>
+</listitem>
+<listitem>
+<literallayout><phrase role="commit-message">Use new link.title.attribute now.<alt>M: /trunk/xsl/html/xref.xsl - Robert Stayton</alt></phrase></literallayout>
+</listitem>
+<listitem>
+<literallayout><phrase role="commit-message">Rewrote simple.xlink to handle linkend also.
+Better computation of <tag>title</tag> attribute on <tag>link</tag> too.<alt>M: /trunk/xsl/html/inline.xsl - Robert Stayton</alt></phrase></literallayout>
+</listitem>
+<listitem>
+<literallayout><phrase role="commit-message">Handle Xalan quirk as special case.<alt>M: /trunk/xsl/html/db5strip.xsl - Robert Stayton</alt></phrase></literallayout>
+</listitem>
+<listitem>
+<literallayout><phrase role="commit-message">Add support for <tag>info</tag>.<alt>M: /trunk/xsl/html/admon.xsl; M: /trunk/xsl/html/autotoc.xsl; M: /trunk/xsl/html/lists.xsl; M: /trunk/xsl/html/refentry.xsl; M: /trunk/xsl/html/biblio.xsl; M: /trunk/xsl/html/qandaset.xsl; M: /trunk/xsl/html/component.xsl; M: /trunk/xsl/html/glossary.xsl; M: /trunk/xsl/html/division.xsl; M: /trunk/xsl/html/index.xsl; M: /trunk/xsl/html/sections.xsl; M: /trunk/xsl/html/table.xsl; M: /trunk/xsl/html/block.xsl - Robert Stayton</alt></phrase></literallayout>
+</listitem>
+<listitem>
+<literallayout><phrase role="commit-message">Fixed imagemaps so they work properly going from calspair coords
+to HTML <tag>area</tag> coords.<alt>M: /trunk/xsl/html/graphics.xsl - Robert Stayton</alt></phrase></literallayout>
+</listitem>
+</itemizedlist>
+</sect2><!--end of HTML changes for 1.72.0-->
+
+<sect2 xml:id="V1.72.0_Manpages">
+<title>Manpages</title>
+<para>The following changes have been made to the
+ <filename>manpages</filename> code
+ since the 1.71.1 release.</para>
+<itemizedlist>
+<listitem>
+<literallayout><phrase role="commit-message">Added doc for <parameter>man.output.lang.in.name.enabled</parameter> parameter. This
+checkin completes support for writing file/pathnames for man-pages
+with $lang include in the names. Closes #1585967. knightly
+accolades to Daniel Leidert for providing the feature request.<alt>M: /trunk/xsl/manpages/param.xweb; M: /trunk/xsl/manpages/param.ent - Michael(tm) Smith</alt></phrase></literallayout>
+</listitem>
+<listitem>
+<literallayout><phrase role="commit-message">Added new param <parameter>man.output.lang.in.name.enabled</parameter>, which
+controls whether $LANG value is included in manpages
+filenames and pathnames. It works like this:
+
+If the value of <parameter>man.output.lang.in.name.enabled</parameter> is non-zero,
+man-page files are output with the $lang value included in
+their filenames or pathnames as follows;
+
+- if <parameter>man.output.subdirs.enabled</parameter> is non-zero, each file is
+ output to, e.g., a /$lang/man8/foo.8 pathname
+
+- if <parameter>man.output.subdirs.enabled</parameter> is zero, each file is output
+ with a foo.$lang.8 <tag>filename</tag><alt>M: /trunk/xsl/manpages/docbook.xsl; M: /trunk/xsl/manpages/other.xsl; M: /trunk/xsl/manpages/utility.xsl - Michael(tm) Smith</alt></phrase></literallayout>
+</listitem>
+<listitem>
+<literallayout><phrase role="commit-message">Use "\e" instead of "\\" for backslash output, because the
+groff docs say that's the correct thing to do; also because
+testing (thanks, Paul Dubois) shows that "\\" doesn't always
+work as expected; for example, "\\" within a <tag>table</tag> seems to
+mess things up.<alt>M: /trunk/xsl/manpages/charmap.groff.xsl - Michael(tm) Smith</alt></phrase></literallayout>
+</listitem>
+<listitem>
+<literallayout><phrase role="commit-message">Added the <parameter>man.string.subst.map.local.pre</parameter> and
+<parameter>man.string.subst.map.local.post</parameter> parameters. Those parameters
+enable local additions and changes to string-substitution mappings
+without the need to change the value of <parameter>man.string.subst.map</parameter>
+parameter (which is for standard system mappings). Closes
+#1456738. Thanks to Sam Steingold for constructing a true
+stylesheet torture test (the clisp docs) that exposed the need for
+these params.<alt>M: /trunk/xsl/manpages/param.xweb; M: /trunk/xsl/manpages/param.ent; M: /trunk/xsl/manpages/other.xsl - Michael(tm) Smith</alt></phrase></literallayout>
+</listitem>
+<listitem>
+<literallayout><phrase role="commit-message">Added the Markup element to the list of elements that get output
+in bold. Thanks to Eric S. Raymond.<alt>M: /trunk/xsl/manpages/inline.xsl - Michael(tm) Smith</alt></phrase></literallayout>
+</listitem>
+<listitem>
+<literallayout><phrase role="commit-message">Replaced all dots in roff requests with U+2302 ("house"
+character), and added escaping in output for all instances of dot
+that are not in roff requests. This fixes the problem case where a
+string beginning with a dot (for example, the string ".bashrc")
+might occur at the beginning of a line in output, in which case
+would mistakenly get interpreted as a roff request. Thanks to Eric
+S. Raymond for pushing to fix this.<alt>M: /trunk/xsl/manpages/table.xsl; M: /trunk/xsl/manpages/synop.xsl; M: /trunk/xsl/manpages/block.xsl; M: /trunk/xsl/manpages/info.xsl; M: /trunk/xsl/manpages/lists.xsl; M: /trunk/xsl/manpages/refentry.xsl; M: /trunk/xsl/manpages/links.xsl; M: /trunk/xsl/manpages/other.xsl; M: /trunk/xsl/manpages/utility.xsl - Michael(tm) Smith</alt></phrase></literallayout>
+</listitem>
+<listitem>
+<literallayout><phrase role="commit-message">Made change to ensure that list content nested in
+<tag>itemizedlist</tag> and <tag>orderedlist</tag> instances is properly indented. This
+is a switch from using .TP to format those lists to using .RS/.RE
+to format them instead (because .TP does not allow nesting). Closes bug #1602616.
+Thanks to Daniel Leidert.<alt>M: /trunk/xsl/manpages/lists.xsl - Michael(tm) Smith</alt></phrase></literallayout>
+</listitem>
+</itemizedlist>
+</sect2><!--end of Manpages changes for 1.72.0-->
+
+<sect2 xml:id="V1.72.0_Params">
+<title>Params</title>
+<para>The following changes have been made to the
+ <filename>params</filename> code
+ since the 1.71.1 release.</para>
+<itemizedlist>
+<listitem>
+<literallayout><phrase role="commit-message">Added doc for <parameter>man.output.lang.in.name.enabled</parameter> parameter. This
+checkin completes support for writing file/pathnames for man-pages
+with $lang include in the names. Closes #1585967. knightly
+accolades to Daniel Leidert for providing the feature request.<alt>A: /trunk/xsl/params/man.output.lang.in.name.enabled.xml - Michael(tm) Smith</alt></phrase></literallayout>
+</listitem>
+<listitem>
+<literallayout><phrase role="commit-message">Added new param <parameter>man.output.lang.in.name.enabled</parameter>, which
+controls whether $LANG value is included in manpages
+filenames and pathnames. It works like this:
+
+If the value of <parameter>man.output.lang.in.name.enabled</parameter> is non-zero,
+man-page files are output with the $lang value included in
+their filenames or pathnames as follows;
+
+- if <parameter>man.output.subdirs.enabled</parameter> is non-zero, each file is
+ output to, e.g., a /$lang/man8/foo.8 pathname
+
+- if <parameter>man.output.subdirs.enabled</parameter> is zero, each file is output
+ with a foo.$lang.8 <tag>filename</tag><alt>M: /trunk/xsl/manpages/docbook.xsl; M: /trunk/xsl/manpages/other.xsl; M: /trunk/xsl/manpages/utility.xsl - Michael(tm) Smith</alt></phrase></literallayout>
+</listitem>
+<listitem>
+<literallayout><phrase role="commit-message">Added the <parameter>man.string.subst.map.local.pre</parameter> and
+<parameter>man.string.subst.map.local.post</parameter> parameters. Those parameters
+enable local additions and changes to string-substitution mappings
+without the need to change the value of <parameter>man.string.subst.map</parameter>
+parameter (which is for standard system mappings). Closes
+#1456738. Thanks to Sam Steingold for constructing a true
+stylesheet torture test (the clisp docs) that exposed the need for
+these params.<alt>A: /trunk/xsl/params/man.string.subst.map.local.post.xml; A: /trunk/xsl/params/man.string.subst.map.local.pre.xml; M: /trunk/xsl/params/man.string.subst.map.xml - Michael(tm) Smith</alt></phrase></literallayout>
+</listitem>
+<listitem>
+<literallayout><phrase role="commit-message">Add index.page.number.properties by default.<alt>M: /trunk/xsl/params/xep.index.item.properties.xml - Robert Stayton</alt></phrase></literallayout>
+</listitem>
+<listitem>
+<literallayout><phrase role="commit-message">Added <parameter>index.page.number.properties</parameter> to allow customizations of page numbers in indexes.<alt>A: /trunk/xsl/params/index.page.number.properties.xml - Robert Stayton</alt></phrase></literallayout>
+</listitem>
+<listitem>
+<literallayout><phrase role="commit-message">Move show-destination="replace" property from template to attribute-set
+so it can be customized.<alt>M: /trunk/xsl/params/olink.properties.xml - Robert Stayton</alt></phrase></literallayout>
+</listitem>
+<listitem>
+<literallayout><phrase role="commit-message">Add support for sorting <tag>glossary</tag> entries<alt>A: /trunk/xsl/params/glossary.sort.xml - Robert Stayton</alt></phrase></literallayout>
+</listitem>
+<listitem>
+<literallayout><phrase role="commit-message">Add option to include qanda in tables of contents.<alt>A: /trunk/xsl/params/qanda.in.toc.xml - Robert Stayton</alt></phrase></literallayout>
+</listitem>
+<listitem>
+<literallayout><phrase role="commit-message">Moved all properties to attribute-sets so can be customized more easily.<alt>M: /trunk/xsl/params/verbatim.properties.xml - Robert Stayton</alt></phrase></literallayout>
+</listitem>
+</itemizedlist>
+</sect2><!--end of Params changes for 1.72.0-->
+
+<sect2 xml:id="V1.72.0_Template">
+<title>Template</title>
+<para>The following changes have been made to the
+ <filename>template</filename> code
+ since the 1.71.1 release.</para>
+<itemizedlist>
+<listitem>
+<literallayout><phrase role="commit-message">Added workaround for Xalan bug: use for-each and copy instead of copy-of (#1604770).<alt>M: /trunk/xsl/template/titlepage.xsl - Mauritz Jeanson</alt></phrase></literallayout>
+</listitem>
+</itemizedlist>
+</sect2><!--end of Template changes for 1.72.0-->
+
+<sect2 xml:id="V1.72.0_Roundtrip">
+<title>Roundtrip</title>
+<para>The following changes have been made to the
+ <filename>roundtrip</filename> code
+ since the 1.71.1 release.</para>
+<itemizedlist>
+<listitem>
+<literallayout><phrase role="commit-message">rename to roundtrip, add OpenOffice support<alt>M: /trunk/xsl/roundtrip/docbook-pages.xsl; M: /trunk/xsl/roundtrip/specifications.xml; A: /trunk/xsl/roundtrip/dbk2ooo.xsl; M: /trunk/xsl/roundtrip/docbook.xsl; A: /trunk/xsl/roundtrip/dbk2pages.xsl; M: /trunk/xsl/roundtrip/template.xml; A: /trunk/xsl/roundtrip/dbk2wordml.xsl; A: /trunk/xsl/roundtrip/dbk2wp.xsl; M: /trunk/xsl/roundtrip/template.dot; M: /trunk/xsl/roundtrip/wordml-final.xsl - Steve Ball</alt></phrase></literallayout>
+</listitem>
+</itemizedlist>
+</sect2><!--end of Roundtrip changes for 1.72.0-->
+</sect1><!--end of V1.72.0-->
+
+<sect1 xml:id="V1.71.1">
+<title>Release: 1.71.1</title>
+<para>This is a minor update to the 1.71.0 release. Along with a
+number of bug fixes, it includes two feature changes:
+
+<itemizedlist>
+ <listitem>
+ <para>Added support for profiling based on <tag
+ class="attribute">xml:lang</tag> and <tag
+ class="attribute">status</tag> attributes.</para>
+ </listitem>
+ <listitem>
+ <para>Added initial support in manpages output for
+ <tag>footnote</tag>, <tag>annotation</tag>, and <tag>alt</tag>
+ instances. Basically, they all now get handled the same way
+ <tag>ulink</tag> instances are. They are treated as a class as
+ "note sources": A numbered marker is generated at the place in the
+ main text flow where they occur, then their contents are displayed
+ in an endnotes section at the end of the man page.</para>
+ </listitem>
+</itemizedlist>
+</para>
+
+<sect2 xml:id="V1.71.1_Common">
+<title>Common</title>
+<para>The following changes have been made to the
+ <filename>common</filename> code
+ since the 1.71.1 release.</para>
+<itemizedlist>
+<listitem>
+<literallayout><phrase role="commit-message">For backward compatability autoidx-ng.xsl is invoking "kosek" indexing method again.<alt>D: /trunk/xsl/common/autoidx-ng.xsl - Jirka Kosek</alt></phrase></literallayout>
+</listitem>
+<listitem>
+<literallayout><phrase role="commit-message">Add support for Xalan generating a root xml:base like saxon.<alt>M: /trunk/xsl/common/stripns.xsl - Robert Stayton</alt></phrase></literallayout>
+</listitem>
+</itemizedlist>
+</sect2><!--end of Common changes for 1.71.1-->
+
+<sect2 xml:id="V1.71.1_FO">
+<title>FO</title>
+<para>The following changes have been made to the
+ <filename>fo</filename> code
+ since the 1.71.1 release.</para>
+<itemizedlist>
+<listitem>
+<literallayout><phrase role="commit-message">For backward compatability autoidx-ng.xsl is invoking "kosek" indexing method again.<alt>M: /trunk/xsl/fo/autoidx-ng.xsl; M: /trunk/xsl/fo/autoidx-kosek.xsl - Jirka Kosek</alt></phrase></literallayout>
+</listitem>
+<listitem>
+<literallayout><phrase role="commit-message">Add support for Xalan to add root node xml:base for db5 docs.<alt>M: /trunk/xsl/fo/docbook.xsl - Robert Stayton</alt></phrase></literallayout>
+</listitem>
+<listitem>
+<literallayout><phrase role="commit-message">Added support for profiling based on xml:lang and status attributes.<alt>M: /trunk/xsl/fo/param.xweb; M: /trunk/xsl/fo/param.ent - Jirka Kosek</alt></phrase></literallayout>
+</listitem>
+</itemizedlist>
+</sect2><!--end of FO changes for 1.71.1-->
+
+<sect2 xml:id="V1.71.1_HTML">
+<title>HTML</title>
+<para>The following changes have been made to the
+ <filename>html</filename> code
+ since the 1.71.1 release.</para>
+<itemizedlist>
+<listitem>
+<literallayout><phrase role="commit-message">For backward compatability autoidx-ng.xsl is invoking "kosek" indexing method again.<alt>M: /trunk/xsl/html/autoidx-ng.xsl; M: /trunk/xsl/html/autoidx-kosek.xsl - Jirka Kosek</alt></phrase></literallayout>
+</listitem>
+<listitem>
+<literallayout><phrase role="commit-message">Add support for Xalan to add root node xml:base for db5 docs.<alt>M: /trunk/xsl/html/chunk-code.xsl; M: /trunk/xsl/html/docbook.xsl - Robert Stayton</alt></phrase></literallayout>
+</listitem>
+<listitem>
+<literallayout><phrase role="commit-message">Added support for profiling based on xml:lang and status attributes.<alt>M: /trunk/xsl/html/param.xweb; M: /trunk/xsl/html/param.ent - Jirka Kosek</alt></phrase></literallayout>
+</listitem>
+<listitem>
+<literallayout><phrase role="commit-message">Made changes in namespace declarations to prevent xmllint's
+canonicalizer from treating them as relative namespace URIs.
+
+ - Changed xmlns:k="java:com.isogen.saxoni18n.Saxoni18nService"
+ to xmlns:k="http://www.isogen.com/functions/com.isogen.saxoni18n.Saxoni18nService";
+ Saxon accepts either form
+ (see http://www.saxonica.com/documentation/extensibility/functions.html);
+ to Saxon, "the part of the URI before the final '/' is immaterial".
+
+ - Changed, e.g. xmlns:xverb="com.nwalsh.xalan.Verbatim" to
+ xmlns:xverb="xalan://com.nwalsh.xalan.Verbatim"; Xalan accepts
+ either form
+ (see http://xml.apache.org/xalan-j/extensions.html#java-namespace-declare);
+ just as Saxon does, it will "simply use the string to the
+ right of the rightmost forward slash as the Java class name".
+
+ - Changed xmlns:xalanredirect="org.apache.xalan.xslt.extensions.Redirect"
+ to xmlns:redirect="http://xml.apache.org/xalan/redirect", and
+ adjusted associated code to make the current Xalan redirect spec.
+ (see http://xml.apache.org/xalan-j/apidocs/org/apache/xalan/lib/Redirect.html)<alt>M: /trunk/xsl/html/oldchunker.xsl; M: /trunk/xsl/html/chunker.xsl; M: /trunk/xsl/html/graphics.xsl; M: /trunk/xsl/html/callout.xsl; M: /trunk/xsl/html/autoidx-kimber.xsl; M: /trunk/xsl/html/autoidx-kosek.xsl; M: /trunk/xsl/html/table.xsl; M: /trunk/xsl/html/verbatim.xsl - Michael(tm) Smith</alt></phrase></literallayout>
+</listitem>
+<listitem>
+<literallayout><phrase role="commit-message">Added the <parameter>html.append</parameter> and <parameter>chunk.append</parameter> parameters. By default, the
+value of both is empty; but the internal DocBook XSL stylesheets
+build sets their value to "&lt;xsl:text&gt;&amp;#x0a;&lt;/xsl:text&gt;", in order
+to ensure that all files in the docbook-xsl-doc package end in a
+newline character. (Because diff and some other tools may emit
+error messages and/or not behave as expected when processing
+files that are not newline-terminated.)<alt>M: /trunk/xsl/html/chunk-common.xsl; M: /trunk/xsl/html/titlepage.xsl; M: /trunk/xsl/html/param.xweb; M: /trunk/xsl/html/docbook.xsl; M: /trunk/xsl/html/graphics.xsl; M: /trunk/xsl/html/param.ent - Michael(tm) Smith</alt></phrase></literallayout>
+</listitem>
+</itemizedlist>
+</sect2><!--end of HTML changes for 1.71.1-->
+
+<sect2 xml:id="V1.71.1_Highlighting">
+<title>Highlighting</title>
+<para>The following changes have been made to the
+ <filename>highlighting</filename> code
+ since the 1.71.1 release.</para>
+<itemizedlist>
+<listitem>
+<literallayout><phrase role="commit-message">Added license information<alt>M: /trunk/xsl/highlighting/delphi-hl.xml; M: /trunk/xsl/highlighting/myxml-hl.xml; M: /trunk/xsl/highlighting/php-hl.xml; M: /trunk/xsl/highlighting/m2-hl.xml; M: /trunk/xsl/highlighting/ini-hl.xml; M: /trunk/xsl/highlighting/xslthl-config.xml; M: /trunk/xsl/highlighting/java-hl.xml - Jirka Kosek</alt></phrase></literallayout>
+</listitem>
+</itemizedlist>
+</sect2><!--end of Highlighting changes for 1.71.1-->
+
+<sect2 xml:id="V1.71.1_Manpages">
+<title>Manpages</title>
+<para>The following changes have been made to the
+ <filename>manpages</filename> code
+ since the 1.71.1 release.</para>
+<itemizedlist>
+<listitem>
+<literallayout><phrase role="commit-message">Added initial support in manpages output for <tag>footnote</tag>, <tag>annotation</tag>,
+and <tag>alt</tag> instances. Basically, they all now get handled the same
+way ulink instances are. They are treated as a class as "note
+sources": A numbered marker is generated at the place in the main
+text flow where they occur, then their contents are displayed in
+an endnotes <tag>section</tag> at the end of the man page (currently titled
+REFERENCES, for English output, but will be changed to NOTES).
+
+This support is not yet complete. It works for most "normal"
+cases, but probably mishandles a good number of cases. More
+testing will be needed to expose the problems. It may well also
+introduce some bugs and regressions in other areas, including
+basic paragraph handling, handling of "mixed block" content,
+handling of other indented content, and handling of authorblurb
+and <tag>personblurb</tag> in the AUTHORS <tag>section</tag>.<alt>M: /trunk/xsl/manpages/table.xsl; M: /trunk/xsl/manpages/block.xsl; M: /trunk/xsl/manpages/docbook.xsl; M: /trunk/xsl/manpages/links.xsl; M: /trunk/xsl/manpages/other.xsl; M: /trunk/xsl/manpages/utility.xsl - Michael(tm) Smith</alt></phrase></literallayout>
+</listitem>
+</itemizedlist>
+</sect2><!--end of Manpages changes for 1.71.1-->
+
+<sect2 xml:id="V1.71.1_Params">
+<title>Params</title>
+<para>The following changes have been made to the
+ <filename>params</filename> code
+ since the 1.71.1 release.</para>
+<itemizedlist>
+<listitem>
+<literallayout><phrase role="commit-message">Added support for profiling based on xml:lang and status attributes.<alt>A: /trunk/xsl/params/profile.status.xml - Jirka Kosek</alt></phrase></literallayout>
+</listitem>
+<listitem>
+<literallayout><phrase role="commit-message">Added the <parameter>html.append</parameter> and <parameter>chunk.append</parameter> parameters. By default, the
+value of both is empty; but the internal DocBook XSL stylesheets
+build sets their value to "&lt;xsl:text&gt;&amp;#x0a;&lt;/xsl:text&gt;", in order
+to ensure that all files in the docbook-xsl-doc <tag>package</tag> end in a
+newline character. (Because diff and some other tools may emit
+error messages and/or not behave as expected when processing
+files that are not newline-terminated.)<alt>A: /trunk/xsl/params/html.append.xml; A: /trunk/xsl/params/chunk.append.xml - Michael(tm) Smith</alt></phrase></literallayout>
+</listitem>
+</itemizedlist>
+</sect2><!--end of Params changes for 1.71.1-->
+
+<sect2 xml:id="V1.71.1_Profiling">
+<title>Profiling</title>
+<para>The following changes have been made to the
+ <filename>profiling</filename> code
+ since the 1.71.1 release.</para>
+<itemizedlist>
+<listitem>
+<literallayout><phrase role="commit-message">Added support for profiling based on xml:lang and status attributes.<alt>M: /trunk/xsl/profiling/profile.xsl; M: /trunk/xsl/profiling/profile-mode.xsl - Jirka Kosek</alt></phrase></literallayout>
+</listitem>
+</itemizedlist>
+</sect2><!--end of Profiling changes for 1.71.1-->
+
+</sect1>
+
+<sect1 xml:id="V1.71.0">
+<title>Release: 1.71.0</title>
+<para>This is mainly a bug fix release, but it also includes two
+significant feature changes:
+<variablelist>
+ <varlistentry>
+ <term>Highlighting support added</term>
+ <listitem>
+ <para>The stylesheets now include support for source-code
+ highlighting in output of programlisting instances (controlled
+ through the <parameter>highlight.source</parameter>
+ parameter). The Java-based implementation requires Saxon and
+ makes use of <link
+ xlink:href="http://molhanec.net/"><person><personname
+ ><firstname>Michal</firstname><surname
+ >Molhanec</surname></personname></person></link>’s <link
+ xlink:href="http://sourceforge.net/projects/xslthl"
+ >XSLTHL</link>. More details are available at Jirka Kosek’s
+ website: <blockquote ><simpara ><link
+ xlink:href="http://xmlguru.cz/2006/07/docbook-syntax-highlighting"/></simpara
+ ></blockquote> The support is currently limited to highlighting
+ of XML, Java, PHP, Delphi, Modula-2 sources, and INI
+ files.</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>Changes to autoindexing</term>
+ <listitem>
+ <para>The templates that handle alternative indexing methods
+ were reworked to avoid errors produced by certain processors not
+ being able to tolerate the presence of unused functions. With
+ this release, none of the code for the 'kimber' or 'kosek'
+ methods is included in the default stylesheets. In order to use
+ one of those methods, your customization layer must import one
+ of the optional stylesheet modules:</para>
+ <para>
+ <itemizedlist>
+ <listitem>
+ <simpara>html/autoidx-kosek.xsl</simpara>
+ </listitem>
+ <listitem>
+ <simpara>html/autoidx-kimber.xsl</simpara>
+ </listitem>
+ <listitem>
+ <simpara>fo/autoidx-kosek.xsl</simpara>
+ </listitem>
+ <listitem>
+ <simpara>fo/autoidx-kimber.xsl</simpara>
+ </listitem>
+ </itemizedlist>
+ See the <parameter>index.method</parameter> parameter
+ reference page for more information.
+ </para>
+ <para>Two other changes to note:
+ <itemizedlist>
+ <listitem>
+ <simpara>The default indexing method now can handle accented
+ characters in latin-based alphabets, not just English. This
+ means accented latin letters will group and sort with their
+ unaccented counterpart.</simpara>
+ </listitem>
+ <listitem>
+ <simpara>The default value for the
+ <parameter>index.method</parameter> parameter was changed
+ from 'english' to 'basic' because now the default method can
+ handle latin-based alphabets, not just English.</simpara>
+ </listitem>
+ </itemizedlist>
+ </para>
+ </listitem>
+ </varlistentry>
+</variablelist>
+The following is a list of changes that have
+been made since the 1.70.1 release.</para>
+
+<sect2 xml:id="V1.71.0_Common">
+<title>Common</title>
+<para>The following changes have been made to the
+ <filename>common</filename> code
+ since the 1.70.1 release.</para>
+<itemizedlist>
+
+<listitem>
+<literallayout><phrase role="commit-message">Added <parameter>reference.autolabel</parameter> parameter for controlling labels on
+<tag>reference</tag> output.<alt>M: /trunk/xsl/common/labels.xsl - Michael(tm) Smith</alt></phrase></literallayout>
+</listitem>
+<listitem>
+<literallayout><phrase role="commit-message">Support <tag>row</tag>s that are *completely* overlapped by the preceding <tag>row</tag><alt>M: /trunk/xsl/common/table.xsl - Norman Walsh</alt></phrase></literallayout>
+</listitem>
+<listitem>
+<literallayout><phrase role="commit-message">New modules for supporting indexing extensions.<alt>A: /trunk/xsl/common/autoidx-kimber.xsl; A: /trunk/xsl/common/autoidx-kosek.xsl - Robert Stayton</alt></phrase></literallayout>
+</listitem>
+<listitem>
+<literallayout><phrase role="commit-message">Support startinglinenumber on <tag>orderedlist</tag><alt>M: /trunk/xsl/common/common.xsl - Norman Walsh</alt></phrase></literallayout>
+</listitem>
+</itemizedlist>
+</sect2><!--end of Common changes for 1.71.0-->
+
+<sect2 xml:id="V1.71.0_Extensions">
+<title>Extensions</title>
+<para>The following changes have been made to the
+ <filename>extensions</filename> code
+ since the 1.70.1 release.</para>
+<itemizedlist>
+<listitem>
+<literallayout><phrase role="commit-message">Completely reworked extensions build system; now uses NetBeans and ant<alt>D: /trunk/xsl/extensions/xalan27/.cvsignore; A: /trunk/xsl/extensions/saxon65/nbproject; A: /trunk/xsl/extensions/saxon65/nbproject/project.properties; D: /trunk/xsl/extensions/prj.el; A: /trunk/xsl/extensions/saxon65/src; A: /trunk/xsl/extensions/xalan2/src/com; M: /trunk/xsl/extensions/xalan2/src/com/nwalsh/xalan/Text.java; A: /trunk/xsl/extensions/saxon65/nbproject/project.xml; D: /trunk/xsl/extensions/build.xml; A: /trunk/xsl/extensions/saxon65/build.xml; A: /trunk/xsl/extensions/xalan2/nbproject/genfiles.properties; A: /trunk/xsl/extensions/saxon65; D: /trunk/xsl/extensions/xalan2/com; M: /trunk/xsl/extensions/xalan2/src/com/nwalsh/xalan/Func.java; A: /trunk/xsl/extensions/xalan2/test; A: /trunk/xsl/extensions/saxon65/src/com; A: /trunk/xsl/extensions/xalan2/nbproject/build-impl.xml; A: /trunk/xsl/extensions/xalan2/nbproject; A: /trunk/xsl/extensions/xalan2/src; A: /trunk/xsl/extensions/xalan2/nbproject/project.properties; D: /trunk/xsl/extensions/.cvsignore; M: /trunk/xsl/extensions/Makefile; D: /trunk/xsl/extensions/saxon8; A: /trunk/xsl/extensions/saxon65/nbproject/genfiles.properties; A: /trunk/xsl/extensions/xalan2/nbproject/project.xml; A: /trunk/xsl/extensions/saxon65/test; M: /trunk/xsl/extensions/xalan2/src/com/nwalsh/xalan/Verbatim.java; A: /trunk/xsl/extensions/xalan2/build.xml; M: /trunk/xsl/extensions/xalan2; D: /trunk/xsl/extensions/saxon643; A: /trunk/xsl/extensions/saxon65/nbproject/build-impl.xml - Norman Walsh</alt></phrase></literallayout>
+</listitem>
+</itemizedlist>
+</sect2><!--end of Extensions changes for 1.71.0-->
+
+<sect2 xml:id="V1.71.0_FO">
+<title>FO</title>
+<para>The following changes have been made to the
+ <filename>fo</filename> code
+ since the 1.70.1 release.</para>
+<itemizedlist>
+
+<listitem>
+<literallayout><phrase role="commit-message">xsl:sort lang attribute now uses two-char substring of lang attribute.<alt>M: /trunk/xsl/fo/autoidx-kimber.xsl - Robert Stayton</alt></phrase></literallayout>
+</listitem>
+
+<listitem>
+<literallayout><phrase role="commit-message">Support titlecase "Java", "Perl", and "IDL" as values for the
+language attribute on <tag>classsynopsis</tag>, etc. (instead of just
+lowercase "java", "perl", and "idl"). Also support "c++" and "C++"
+(instead of just "cpp").
+
+Affects HTML, FO, and manpages output. Closes bug 1552332. Thanks
+to "Brian A. Vanderburg II".<alt>M: /trunk/xsl/fo/synop.xsl - Michael(tm) Smith</alt></phrase></literallayout>
+</listitem>
+
+<listitem>
+<literallayout><phrase role="commit-message">Added support for the <parameter>reference.autolabel</parameter> param in (X)HTML and FO
+output.<alt>M: /trunk/xsl/fo/param.xweb; M: /trunk/xsl/fo/param.ent - Michael(tm) Smith</alt></phrase></literallayout>
+</listitem>
+
+<listitem>
+<literallayout><phrase role="commit-message">Support <tag>row</tag>s that are *completely* overlapped by the preceding <tag>row</tag><alt>M: /trunk/xsl/fo/table.xsl - Norman Walsh</alt></phrase></literallayout>
+</listitem>
+
+<listitem>
+<literallayout><phrase role="commit-message">Rearranged templates for the 3 indexing methods
+and changed method named 'english' to 'basic'.<alt>M: /trunk/xsl/fo/autoidx.xsl - Robert Stayton</alt></phrase></literallayout>
+</listitem>
+<listitem>
+<literallayout><phrase role="commit-message">New modules for supporting indexing extensions.<alt>A: /trunk/xsl/fo/autoidx-kimber.xsl; A: /trunk/xsl/fo/autoidx-kosek.xsl - Robert Stayton</alt></phrase></literallayout>
+</listitem>
+
+<listitem>
+<literallayout><phrase role="commit-message">Turn off blank-body for <parameter>fop1.extensions</parameter> too since fop 0.92
+does not support it either.<alt>M: /trunk/xsl/fo/pagesetup.xsl - Robert Stayton</alt></phrase></literallayout>
+</listitem>
+
+<listitem>
+<literallayout><phrase role="commit-message">Add Xalan variant to test for exslt:node-set <tag>function</tag>.
+Xalan can use <tag>function</tag> named node-set(), but doesn't
+recognize it using function-available().<alt>M: /trunk/xsl/fo/autoidx.xsl - Robert Stayton</alt></phrase></literallayout>
+</listitem>
+
+<listitem>
+<literallayout><phrase role="commit-message">Added support to FO stylesheets for handling instances of <tag>Org</tag>
+where it occurs outside of *<tag>info</tag> content. In HTML stylesheets,
+moved handling of <tag>Org</tag> out of info.xsl and into inline.xsl. In both
+FO and HTML stylesheets, added support for correctly processing
+<tag>Affiliation</tag> and <tag>Jobtitle</tag>.<alt>M: /trunk/xsl/fo/inline.xsl - Michael(tm) Smith</alt></phrase></literallayout>
+</listitem>
+<listitem>
+<literallayout><phrase role="commit-message">Don't output punctuation between <tag>Refname</tag> and <tag>Refpurpose</tag> if
+<tag>Refpurpose</tag> is empty. Also corrected handling of <tag>Refsect2</tag>/<tag>title</tag>
+instances, and removed some debugging stuff that was generated in
+manpages output to mark the ends of sections.<alt>M: /trunk/xsl/fo/refentry.xsl - Michael(tm) Smith</alt></phrase></literallayout>
+</listitem>
+<listitem>
+<literallayout><phrase role="commit-message">Added new <parameter>email.delimiters.enabled</parameter> param. If non-zero (the
+default), delimiters are generated around e-mail addresses (output
+of the <tag>email</tag> element). If zero, the delimiters are suppressed.<alt>M: /trunk/xsl/fo/inline.xsl; M: /trunk/xsl/fo/param.xweb; M: /trunk/xsl/fo/param.ent - Michael(tm) Smith</alt></phrase></literallayout>
+</listitem>
+
+<listitem>
+<literallayout><phrase role="commit-message">Initial support of syntax highlighting of programlistings.<alt>M: /trunk/xsl/fo/param.ent; M: /trunk/xsl/fo/param.xweb; A: /trunk/xsl/fo/highlight.xsl; M: /trunk/xsl/fo/verbatim.xsl - Jirka Kosek</alt></phrase></literallayout>
+</listitem>
+<listitem>
+<literallayout><phrase role="commit-message"><tag>Chapter</tag> after <tag>preface</tag> should restart numbering of pages.<alt>M: /trunk/xsl/fo/pagesetup.xsl - Jirka Kosek</alt></phrase></literallayout>
+</listitem>
+</itemizedlist>
+</sect2><!--end of FO changes for 1.71.0-->
+
+<sect2 xml:id="V1.71.0_HTML">
+<title>HTML</title>
+<para>The following changes have been made to the
+ <filename>html</filename> code
+ since the 1.70.1 release.</para>
+<itemizedlist>
+
+<listitem>
+<literallayout><phrase role="commit-message">xsl:sort lang attribute now uses two-char substring of lang attribute.<alt>M: /trunk/xsl/html/autoidx-kimber.xsl - Robert Stayton</alt></phrase></literallayout>
+</listitem>
+<listitem>
+<literallayout><phrase role="commit-message">Support titlecase "Java", "Perl", and "IDL" as values for the
+language attribute on <tag>classsynopsis</tag>, etc. (instead of just
+lowercase "java", "perl", and "idl"). Also support "c++" and "C++"
+(instead of just "cpp").
+
+Affects HTML, FO, and manpages output. Closes bug 1552332. Thanks
+to "Brian A. Vanderburg II".<alt>M: /trunk/xsl/html/synop.xsl - Michael(tm) Smith</alt></phrase></literallayout>
+</listitem>
+
+<listitem>
+<literallayout><phrase role="commit-message">Added support for the <parameter>reference.autolabel</parameter> param in (X)HTML and FO
+output.<alt>M: /trunk/xsl/html/param.xweb; M: /trunk/xsl/html/param.ent - Michael(tm) Smith</alt></phrase></literallayout>
+</listitem>
+<listitem>
+<literallayout><phrase role="commit-message">Support <tag>row</tag>s that are *completely* overlapped by the preceding <tag>row</tag><alt>M: /trunk/xsl/html/table.xsl - Norman Walsh</alt></phrase></literallayout>
+</listitem>
+
+<listitem>
+<literallayout><phrase role="commit-message">Rearranged templates for the 3 indexing methods
+and changed method named 'english' to 'basic'.<alt>M: /trunk/xsl/html/autoidx.xsl - Robert Stayton</alt></phrase></literallayout>
+</listitem>
+<listitem>
+<literallayout><phrase role="commit-message">New modules for supporting indexing extensions.<alt>A: /trunk/xsl/html/autoidx-kimber.xsl; A: /trunk/xsl/html/autoidx-kosek.xsl - Robert Stayton</alt></phrase></literallayout>
+</listitem>
+
+<listitem>
+<literallayout><phrase role="commit-message">Added several new HTML parameters for controlling appearance of
+content on HTML <tag>title</tag> pages:
+
+<parameter>contrib.inline.enabled</parameter>:
+ If non-zero (the default), output of the <tag>contrib</tag> element is
+ displayed as inline content rather than as block content.
+
+<parameter>othercredit.like.author.enabled</parameter>:
+ If non-zero, output of the <tag>othercredit</tag> element on titlepages is
+ displayed in the same style as <tag>author</tag> and <tag>editor</tag> output. If zero
+ (the default), <tag>othercredit</tag> output is displayed using a style
+ different than that of <tag>author</tag> and <tag>editor</tag>.
+
+<parameter>blurb.on.titlepage.enabled</parameter>:
+ If non-zero, output from authorblurb and <tag>personblurb</tag> elements is
+ displayed on <tag>title</tag> pages. If zero (the default), output from
+ those elements is suppressed on <tag>title</tag> pages (unless you are
+ using a titlepage customization that causes them to be included).
+
+<parameter>editedby.enabled</parameter>
+ If non-zero (the default), a localized Edited by heading is
+ displayed above <tag>editor</tag> names in output of the <tag>editor</tag> element.<alt>M: /trunk/xsl/html/titlepage.xsl; M: /trunk/xsl/html/param.xweb; M: /trunk/xsl/html/param.ent - Michael(tm) Smith</alt></phrase></literallayout>
+</listitem>
+
+<listitem>
+<literallayout><phrase role="commit-message">Add Xalan variant to test for exslt:node-set <tag>function</tag>.
+Xalan can use <tag>function</tag> named node-set(), but doesn't
+recognize it using function-available().<alt>M: /trunk/xsl/html/autoidx.xsl - Robert Stayton</alt></phrase></literallayout>
+</listitem>
+
+<listitem>
+<literallayout><phrase role="commit-message">Added support to FO stylesheets for handling instances of <tag>Org</tag>
+where it occurs outside of *<tag>info</tag> content. In HTML stylesheets,
+moved handling of <tag>Org</tag> out of info.xsl and into inline.xsl. In both
+FO and HTML stylesheets, added support for correctly processing
+<tag>Affiliation</tag> and <tag>Jobtitle</tag>.<alt>M: /trunk/xsl/html/inline.xsl; M: /trunk/xsl/html/info.xsl - Michael(tm) Smith</alt></phrase></literallayout>
+</listitem>
+<listitem>
+<literallayout><phrase role="commit-message">Don't output punctuation between <tag>Refname</tag> and <tag>Refpurpose</tag> if
+<tag>Refpurpose</tag> is empty. Also corrected handling of <tag>Refsect2</tag>/<tag>title</tag>
+instances, and removed some debugging stuff that was generated in
+manpages output to mark the ends of sections.<alt>M: /trunk/xsl/html/refentry.xsl - Michael(tm) Smith</alt></phrase></literallayout>
+</listitem>
+<listitem>
+<literallayout><phrase role="commit-message">Added new <parameter>email.delimiters.enabled</parameter> param. If non-zero (the
+default), delimiters are generated around e-mail addresses (output
+of the <tag>email</tag> element). If zero, the delimiters are suppressed.<alt>M: /trunk/xsl/html/inline.xsl; M: /trunk/xsl/html/param.xweb; M: /trunk/xsl/html/param.ent - Michael(tm) Smith</alt></phrase></literallayout>
+</listitem>
+
+<listitem>
+<literallayout><phrase role="commit-message">Added <parameter>qanda.nested.in.toc</parameter> param. Default value is zero. If
+non-zero, instances of "nested" <tag>Qandaentry</tag> (ones that are children
+of <tag>Answer</tag> elements) are displayed in the <tag>TOC</tag>. Closes patch 1509018
+(from Daniel Leidert). Currently on affects HTML output (no patch
+for FO output provided).<alt>M: /trunk/xsl/html/param.xweb; M: /trunk/xsl/html/param.ent; M: /trunk/xsl/html/qandaset.xsl - Michael(tm) Smith</alt></phrase></literallayout>
+</listitem>
+
+
+<listitem>
+<literallayout><phrase role="commit-message">Improved handling of relative locations generated files<alt>M: /trunk/xsl/html/html.xsl - Jirka Kosek</alt></phrase></literallayout>
+</listitem>
+
+<listitem>
+<literallayout><phrase role="commit-message">Initial support of syntax highlighting of programlistings.<alt>M: /trunk/xsl/html/param.ent; M: /trunk/xsl/html/param.xweb; A: /trunk/xsl/html/highlight.xsl; M: /trunk/xsl/html/verbatim.xsl - Jirka Kosek</alt></phrase></literallayout>
+</listitem>
+<listitem>
+<literallayout><phrase role="commit-message">Support <tag>org</tag><alt>M: /trunk/xsl/html/info.xsl - Norman Walsh</alt></phrase></literallayout>
+</listitem>
+<listitem>
+<literallayout><phrase role="commit-message">Support <tag>person</tag><alt>M: /trunk/xsl/html/inline.xsl - Norman Walsh</alt></phrase></literallayout>
+</listitem>
+<listitem>
+<literallayout><phrase role="commit-message">Support $keep.relative.image.uris also when chunking<alt>M: /trunk/xsl/html/chunk-code.xsl - Jirka Kosek</alt></phrase></literallayout>
+</listitem>
+</itemizedlist>
+</sect2><!--end of HTML changes for 1.71.0-->
+
+<sect2 xml:id="V1.71.0_Highlighting">
+<title>Highlighting</title>
+<para>The following changes have been made to the
+ <filename>highlighting</filename> code
+ since the 1.70.1 release.</para>
+<itemizedlist>
+
+<listitem>
+<literallayout><phrase role="commit-message">Initial support of syntax highlighting of programlistings.<alt>A: /trunk/xsl/highlighting/php-hl.xml; A: /trunk/xsl/highlighting/common.xsl; A: /trunk/xsl/highlighting/delphi-hl.xml; A: /trunk/xsl/highlighting/myxml-hl.xml; A: /trunk/xsl/highlighting/m2-hl.xml; A: /trunk/xsl/highlighting/ini-hl.xml; A: /trunk/xsl/highlighting/xslthl-config.xml; A: /trunk/xsl/highlighting/java-hl.xml - Jirka Kosek</alt></phrase></literallayout>
+</listitem>
+</itemizedlist>
+</sect2><!--end of Highlighting changes for 1.71.0-->
+
+<sect2 xml:id="V1.71.0_Manpages">
+<title>Manpages</title>
+<para>The following changes have been made to the
+ <filename>manpages</filename> code
+ since the 1.70.1 release.</para>
+<itemizedlist>
+
+<listitem>
+<literallayout><phrase role="commit-message">Suppress <tag>footnote</tag> markers and output warning that footnotes are
+not yet supported.<alt>M: /trunk/xsl/manpages/docbook.xsl; M: /trunk/xsl/manpages/links.xsl; M: /trunk/xsl/manpages/other.xsl - Michael(tm) Smith</alt></phrase></literallayout>
+</listitem>
+
+<listitem>
+<literallayout><phrase role="commit-message">Handle instances of <tag>address</tag>/<tag>otheraddr</tag>/ulink in <tag>author</tag> et al in the
+same way as <tag>email</tag> instances; that is, display them on the same
+linke as the <tag>author</tag>, <tag>editor</tag>, etc., name.<alt>M: /trunk/xsl/manpages/info.xsl - Michael(tm) Smith</alt></phrase></literallayout>
+</listitem>
+<listitem>
+<literallayout><phrase role="commit-message">Don't number or link-list any Ulink instance whose string value is
+identical to the value of its url attribute. Just display it inline.<alt>M: /trunk/xsl/manpages/links.xsl - Michael(tm) Smith</alt></phrase></literallayout>
+</listitem>
+
+<listitem>
+<literallayout><phrase role="commit-message">Don't output punctuation between <tag>Refname</tag> and <tag>Refpurpose</tag> if
+<tag>Refpurpose</tag> is empty. Also corrected handling of <tag>Refsect2</tag>/<tag>title</tag>
+instances, and removed some debugging stuff that was generated in
+manpages output to mark the ends of sections.<alt>M: /trunk/xsl/manpages/refentry.xsl - Michael(tm) Smith</alt></phrase></literallayout>
+</listitem>
+<listitem>
+<literallayout><phrase role="commit-message">Added new <parameter>email.delimiters.enabled</parameter> param. If non-zero (the
+default), delimiters are generated around e-mail addresses (output
+of the <tag>email</tag> element). If zero, the delimiters are suppressed.<alt>M: /trunk/xsl/manpages/param.xweb; M: /trunk/xsl/manpages/param.ent - Michael(tm) Smith</alt></phrase></literallayout>
+</listitem>
+
+<listitem>
+<literallayout><phrase role="commit-message">In manpages output, if the last/nearest *<tag>info</tag> element for
+particular <tag>Refentry</tag> has multiple <tag>Copyright</tag> and/or <tag>Legalnotice</tag>
+children, process them all (not just the first ones). Closes bug
+1524576. Thanks to Sam Steingold for the report and to Daniel
+Leidert for providing a patch.<alt>M: /trunk/xsl/manpages/info.xsl - Michael(tm) Smith</alt></phrase></literallayout>
+</listitem>
+
+</itemizedlist>
+</sect2><!--end of Manpages changes for 1.71.0-->
+
+<sect2 xml:id="V1.71.0_Params">
+<title>Params</title>
+<para>The following changes have been made to the
+ <filename>params</filename> code
+ since the 1.70.1 release.</para>
+<itemizedlist>
+<listitem>
+<literallayout><phrase role="commit-message">Added <parameter>reference.autolabel</parameter> parameter for controlling labels on
+<tag>reference</tag> output.<alt>A: /trunk/xsl/params/reference.autolabel.xml - Michael(tm) Smith</alt></phrase></literallayout>
+</listitem>
+<listitem>
+<literallayout><phrase role="commit-message">Added namespace declarations to document elements for all param files.<alt>M: /trunk/xsl/params/toc.line.properties.xml; M: /trunk/xsl/params/title.font.family.xml; M: /trunk/xsl/params/component.label.includes.part.label.xml; M: /trunk/xsl/params/refentry.manual.profile.xml; M: /trunk/xsl/params/orderedlist.properties.xml; M: /trunk/xsl/params/olink.pubid.xml; M: /trunk/xsl/params/informalexample.properties.xml; M: /trunk/xsl/params/appendix.autolabel.xml; M: /trunk/xsl/params/htmlhelp.show.toolbar.text.xml; M: /trunk/xsl/params/index.on.role.xml; M: /trunk/xsl/params/htmlhelp.button.jump2.url.xml; M: /trunk/xsl/params/variablelist.term.separator.xml; M: /trunk/xsl/params/para.propagates.style.xml; M: /trunk/xsl/params/html.stylesheet.xml; M: /trunk/xsl/params/qanda.nested.in.toc.xml; M: /trunk/xsl/params/annotation.css.xml; M: /trunk/xsl/params/funcsynopsis.style.xml; M: /trunk/xsl/params/htmlhelp.encoding.xml; M: /trunk/xsl/params/footer.content.properties.xml; M: /trunk/xsl/params/verbatim.properties.xml; M: /trunk/xsl/params/autotoc.label.in.hyperlink.xml; M: /trunk/xsl/params/body.margin.top.xml; M: /trunk/xsl/params/bibliography.numbered.xml; M: /trunk/xsl/params/figure.properties.xml; M: /trunk/xsl/params/variablelist.max.termlength.xml; M: /trunk/xsl/params/table.cell.border.style.xml; M: /trunk/xsl/params/htmlhelp.button.options.xml; M: /trunk/xsl/params/preferred.mediaobject.role.xml; M: /trunk/xsl/params/htmlhelp.chm.xml; M: /trunk/xsl/params/man.charmap.subset.profile.xml; M: /trunk/xsl/params/qanda.title.level3.properties.xml; M: /trunk/xsl/params/page.width.xml; M: /trunk/xsl/params/firstterm.only.link.xml; M: /trunk/xsl/params/section.level6.properties.xml; M: /trunk/xsl/params/htmlhelp.button.locate.xml; M: /trunk/xsl/params/chunk.sections.xml; M: /trunk/xsl/params/use.local.olink.style.xml; M: /trunk/xsl/params/refentry.date.profile.enabled.xml; M: /trunk/xsl/params/refentry.version.suppress.xml; M: /trunk/xsl/params/refentry.generate.title.xml; M: /trunk/xsl/params/punct.honorific.xml; M: /trunk/xsl/params/column.gap.index.xml; M: /trunk/xsl/params/body.start.indent.xml; M: /trunk/xsl/params/crop.mark.width.xml; M: /trunk/xsl/params/refentry.version.profile.enabled.xml; M: /trunk/xsl/params/superscript.properties.xml; M: /trunk/xsl/params/chunker.output.doctype-public.xml; M: /trunk/xsl/params/saxon.character.representation.xml; M: /trunk/xsl/params/saxon.linenumbering.xml; M: /trunk/xsl/params/shade.verbatim.style.xml; M: /trunk/xsl/params/annotate.toc.xml; M: /trunk/xsl/params/profile.attribute.xml; M: /trunk/xsl/params/callout.graphics.number.limit.xml; M: /trunk/xsl/params/profile.arch.xml; M: /trunk/xsl/params/saxon.tablecolumns.xml; M: /trunk/xsl/params/glossterm.auto.link.xml; M: /trunk/xsl/params/default.units.xml; M: /trunk/xsl/params/qanda.title.level1.properties.xml; M: /trunk/xsl/params/list.block.spacing.xml; M: /trunk/xsl/params/section.level4.properties.xml; M: /trunk/xsl/params/spacing.paras.xml; M: /trunk/xsl/params/column.count.index.xml; M: /trunk/xsl/params/dingbat.font.family.xml; M: /trunk/xsl/params/citerefentry.link.xml; M: /trunk/xsl/params/keep.relative.image.uris.xml; M: /trunk/xsl/params/ulink.footnotes.xml; M: /trunk/xsl/params/prefer.internal.olink.xml; M: /trunk/xsl/params/refentry.title.properties.xml; M: /trunk/xsl/params/variablelist.term.break.after.xml; M: /trunk/xsl/params/use.id.function.xml; M: /trunk/xsl/params/callout.unicode.start.character.xml; M: /trunk/xsl/params/column.gap.titlepage.xml; M: /trunk/xsl/params/editedby.enabled.xml; M: /trunk/xsl/params/funcsynopsis.tabular.threshold.xml; M: /trunk/xsl/params/use.extensions.xml; M: /trunk/xsl/params/index.preferred.page.properties.xml; M: /trunk/xsl/params/man.th.extra3.max.length.xml; M: /trunk/xsl/params/column.gap.back.xml; M: /trunk/xsl/params/tex.math.delims.xml; M: /trunk/xsl/params/article.appendix.title.properties.xml; M: /trunk/xsl/params/ulink.target.xml; M: /trunk/xsl/params/suppress.header.navigation.xml; M: /trunk/xsl/params/olink.resolver.xml; M: /trunk/xsl/params/admon.textlabel.xml; M: /trunk/xsl/params/procedure.properties.xml; M: /trunk/xsl/params/blurb.on.titlepage.enabled.xml; M: /trunk/xsl/params/section.level2.properties.xml; M: /trunk/xsl/params/column.gap.front.xml; M: /trunk/xsl/params/margin.note.title.properties.xml; M: /trunk/xsl/params/glossary.collection.xml; M: /trunk/xsl/params/admon.graphics.xml; M: /trunk/xsl/params/current.docid.xml; M: /trunk/xsl/params/qanda.inherit.numeration.xml; M: /trunk/xsl/params/table.cell.padding.xml; M: /trunk/xsl/params/preface.autolabel.xml; M: /trunk/xsl/params/man.th.extra3.suppress.xml; M: /trunk/xsl/params/wordml.template.xml; M: /trunk/xsl/params/htmlhelp.use.hhk.xml; M: /trunk/xsl/params/textinsert.extension.xml; M: /trunk/xsl/params/ebnf.table.bgcolor.xml; M: /trunk/xsl/params/refentry.source.fallback.profile.xml; M: /trunk/xsl/params/body.font.master.xml; M: /trunk/xsl/params/l10n.gentext.default.language.xml; M: /trunk/xsl/params/list.block.properties.xml; M: /trunk/xsl/params/refentry.source.name.suppress.xml; M: /trunk/xsl/params/htmlhelp.hhp.window.xml; M: /trunk/xsl/params/sidebar.properties.xml; M: /trunk/xsl/params/tex.math.file.xml; M: /trunk/xsl/params/man.justify.xml; M: /trunk/xsl/params/subscript.properties.xml; M: /trunk/xsl/params/column.count.front.xml; M: /trunk/xsl/params/index.term.separator.xml; M: /trunk/xsl/params/biblioentry.properties.xml; M: /trunk/xsl/params/biblioentry.item.separator.xml; M: /trunk/xsl/params/htmlhelp.button.home.url.xml; M: /trunk/xsl/params/column.count.body.xml; M: /trunk/xsl/params/suppress.navigation.xml; M: /trunk/xsl/params/htmlhelp.remember.window.position.xml; M: /trunk/xsl/params/htmlhelp.hhc.section.depth.xml; M: /trunk/xsl/params/xref.with.number.and.title.xml; M: /trunk/xsl/params/make.year.ranges.xml; M: /trunk/xsl/params/region.before.extent.xml; M: /trunk/xsl/params/xref.label-page.separator.xml; M: /trunk/xsl/params/html.longdesc.link.xml; M: /trunk/xsl/params/man.subheading.divider.enabled.xml; M: /trunk/xsl/params/index.entry.properties.xml; M: /trunk/xsl/params/generate.legalnotice.link.xml; M: /trunk/xsl/params/section.autolabel.xml; M: /trunk/xsl/params/html.base.xml; M: /trunk/xsl/params/suppress.footer.navigation.xml; M: /trunk/xsl/params/nominal.image.depth.xml; M: /trunk/xsl/params/table.footnote.number.symbols.xml; M: /trunk/xsl/params/table.footnote.number.format.xml; M: /trunk/xsl/params/callout.graphics.xml; M: /trunk/xsl/params/man.break.after.slash.xml; M: /trunk/xsl/params/function.parens.xml; M: /trunk/xsl/params/part.autolabel.xml; M: /trunk/xsl/params/saxon.callouts.xml; M: /trunk/xsl/params/css.decoration.xml; M: /trunk/xsl/params/htmlhelp.button.home.xml; M: /trunk/xsl/params/email.delimiters.enabled.xml; M: /trunk/xsl/params/column.count.lot.xml; M: /trunk/xsl/params/draft.mode.xml; M: /trunk/xsl/params/use.role.for.mediaobject.xml; M: /trunk/xsl/params/refentry.separator.xml; M: /trunk/xsl/params/man.font.funcsynopsisinfo.xml; M: /trunk/xsl/params/man.output.manifest.filename.xml; M: /trunk/xsl/params/process.empty.source.toc.xml; M: /trunk/xsl/params/man.output.in.separate.dir.xml; M: /trunk/xsl/params/graphicsize.use.img.src.path.xml; M: /trunk/xsl/params/man.output.encoding.xml; M: /trunk/xsl/params/column.gap.lot.xml; M: /trunk/xsl/params/profile.role.xml; M: /trunk/xsl/params/column.count.titlepage.xml; M: /trunk/xsl/params/show.comments.xml; M: /trunk/xsl/params/informalfigure.properties.xml; M: /trunk/xsl/params/entry.propagates.style.xml; M: /trunk/xsl/params/bibliography.collection.xml; M: /trunk/xsl/params/contrib.inline.enabled.xml; M: /trunk/xsl/params/section.title.level5.properties.xml; M: /trunk/xsl/params/fop.extensions.xml; M: /trunk/xsl/params/htmlhelp.button.jump1.xml; M: /trunk/xsl/params/man.hyphenate.urls.xml; M: /trunk/xsl/params/profile.condition.xml; M: /trunk/xsl/params/header.column.widths.xml; M: /trunk/xsl/params/annotation.js.xml; M: /trunk/xsl/params/chunker.output.standalone.xml; M: /trunk/xsl/params/targets.filename.xml; M: /trunk/xsl/params/default.float.class.xml; M: /trunk/xsl/params/chapter.autolabel.xml; M: /trunk/xsl/params/sidebar.float.type.xml; M: /trunk/xsl/params/profile.separator.xml; M: /trunk/xsl/params/generate.index.xml; M: /trunk/xsl/params/nongraphical.admonition.properties.xml; M: /trunk/xsl/params/navig.graphics.xml; M: /trunk/xsl/params/htmlhelp.button.next.xml; M: /trunk/xsl/params/insert.olink.pdf.frag.xml; M: /trunk/xsl/params/htmlhelp.button.stop.xml; M: /trunk/xsl/params/footnote.font.size.xml; M: /trunk/xsl/params/profile.value.xml; M: /trunk/xsl/params/ebnf.table.border.xml; M: /trunk/xsl/params/htmlhelp.hhc.folders.instead.books.xml; M: /trunk/xsl/params/glossary.as.blocks.xml; M: /trunk/xsl/params/body.end.indent.xml; M: /trunk/xsl/params/use.role.as.xrefstyle.xml; M: /trunk/xsl/params/man.indent.blurbs.xml; M: /trunk/xsl/params/chunker.output.encoding.xml; M: /trunk/xsl/params/chunker.output.omit-xml-declaration.xml; M: /trunk/xsl/params/sans.font.family.xml; M: /trunk/xsl/params/html.cleanup.xml; M: /trunk/xsl/params/htmlhelp.hhp.xml; M: /trunk/xsl/params/htmlhelp.only.xml; M: /trunk/xsl/params/eclipse.plugin.name.xml; M: /trunk/xsl/params/section.title.level3.properties.xml; M: /trunk/xsl/params/man.th.extra1.suppress.xml; M: /trunk/xsl/params/chunk.section.depth.xml; M: /trunk/xsl/params/htmlhelp.hhp.tail.xml; M: /trunk/xsl/params/sidebar.title.properties.xml; M: /trunk/xsl/params/hyphenate.xml; M: /trunk/xsl/params/paper.type.xml; M: /trunk/xsl/params/chunk.tocs.and.lots.has.title.xml; M: /trunk/xsl/params/symbol.font.family.xml; M: /trunk/xsl/params/page.margin.bottom.xml; M: /trunk/xsl/params/callout.unicode.number.limit.xml; M: /trunk/xsl/params/itemizedlist.properties.xml; M: /trunk/xsl/params/root.filename.xml; M: /trunk/xsl/params/tablecolumns.extension.xml; M: /trunk/xsl/params/htmlhelp.show.favorities.xml; M: /trunk/xsl/params/informaltable.properties.xml; M: /trunk/xsl/params/revhistory.table.cell.properties.xml; M: /trunk/xsl/params/htmlhelp.default.topic.xml; M: /trunk/xsl/params/compact.list.item.spacing.xml; M: /trunk/xsl/params/page.height.portrait.xml; M: /trunk/xsl/params/html.head.legalnotice.link.types.xml; M: /trunk/xsl/params/passivetex.extensions.xml; M: /trunk/xsl/params/orderedlist.label.properties.xml; M: /trunk/xsl/params/othercredit.like.author.enabled.xml; M: /trunk/xsl/params/header.content.properties.xml; M: /trunk/xsl/params/refentry.meta.get.quietly.xml; M: /trunk/xsl/params/section.properties.xml; M: /trunk/xsl/params/htmlhelp.button.hideshow.xml; M: /trunk/xsl/params/simplesect.in.toc.xml; M: /trunk/xsl/params/chunk.quietly.xml; M: /trunk/xsl/params/htmlhelp.enumerate.images.xml; M: /trunk/xsl/params/section.title.level1.properties.xml; M: /trunk/xsl/params/qanda.defaultlabel.xml; M: /trunk/xsl/params/htmlhelp.enhanced.decompilation.xml; M: /trunk/xsl/params/man.th.title.max.length.xml; M: /trunk/xsl/params/footnote.number.format.xml; M: /trunk/xsl/params/body.margin.bottom.xml; M: /trunk/xsl/params/htmlhelp.window.geometry.xml; M: /trunk/xsl/params/htmlhelp.button.jump2.xml; M: /trunk/xsl/params/use.svg.xml; M: /trunk/xsl/params/qanda.title.level6.properties.xml; M: /trunk/xsl/params/collect.xref.targets.xml; M: /trunk/xsl/params/html.extra.head.links.xml; M: /trunk/xsl/params/variablelist.as.table.xml; M: /trunk/xsl/params/man.indent.width.xml; M: /trunk/xsl/params/eclipse.plugin.id.xml; M: /trunk/xsl/params/linenumbering.width.xml; M: /trunk/xsl/params/axf.extensions.xml; M: /trunk/xsl/params/menuchoice.separator.xml; M: /trunk/xsl/params/glossterm.separation.xml; M: /trunk/xsl/params/htmlhelp.autolabel.xml; M: /trunk/xsl/params/chunk.separate.lots.xml; M: /trunk/xsl/params/man.hyphenate.computer.inlines.xml; M: /trunk/xsl/params/linenumbering.separator.xml; M: /trunk/xsl/params/htmlhelp.title.xml; M: /trunk/xsl/params/index.number.separator.xml; M: /trunk/xsl/params/htmlhelp.button.prev.xml; M: /trunk/xsl/params/refentry.manual.fallback.profile.xml; M: /trunk/xsl/params/table.frame.border.color.xml; M: /trunk/xsl/params/footnote.sep.leader.properties.xml; M: /trunk/xsl/params/hyphenate.verbatim.characters.xml; M: /trunk/xsl/params/table.cell.border.thickness.xml; M: /trunk/xsl/params/template.xml; M: /trunk/xsl/params/margin.note.properties.xml; M: /trunk/xsl/params/man.segtitle.suppress.xml; M: /trunk/xsl/params/generate.toc.xml; M: /trunk/xsl/params/formal.object.properties.xml; M: /trunk/xsl/params/footnote.mark.properties.xml; M: /trunk/xsl/params/header.table.height.xml; M: /trunk/xsl/params/htmlhelp.button.back.xml; M: /trunk/xsl/params/qanda.title.level4.properties.xml; M: /trunk/xsl/params/man.links.are.numbered.xml; M: /trunk/xsl/params/manual.toc.xml; M: /trunk/xsl/params/olink.lang.fallback.sequence.xml; M: /trunk/xsl/params/refentry.manual.profile.enabled.xml; M: /trunk/xsl/params/ulink.hyphenate.chars.xml; M: /trunk/xsl/params/manifest.xml; M: /trunk/xsl/params/olink.fragid.xml; M: /trunk/xsl/params/refentry.date.profile.xml; M: /trunk/xsl/params/linenumbering.extension.xml; M: /trunk/xsl/params/component.title.properties.xml; M: /trunk/xsl/params/alignment.xml; M: /trunk/xsl/params/refentry.version.profile.xml; M: /trunk/xsl/params/ebnf.assignment.xml; M: /trunk/xsl/params/htmlhelp.button.print.xml; M: /trunk/xsl/params/annotation.support.xml; M: /trunk/xsl/params/sidebar.float.width.xml; M: /trunk/xsl/params/normal.para.spacing.xml; M: /trunk/xsl/params/xref.title-page.separator.xml; M: /trunk/xsl/params/callout.unicode.font.xml; M: /trunk/xsl/params/default.table.frame.xml; M: /trunk/xsl/params/pages.template.xml; M: /trunk/xsl/params/htmlhelp.button.zoom.xml; M: /trunk/xsl/params/admonition.title.properties.xml; M: /trunk/xsl/params/callout.graphics.extension.xml; M: /trunk/xsl/params/make.valid.html.xml; M: /trunk/xsl/params/qanda.title.level2.properties.xml; M: /trunk/xsl/params/page.margin.top.xml; M: /trunk/xsl/params/xep.index.item.properties.xml; M: /trunk/xsl/params/section.level5.properties.xml; M: /trunk/xsl/params/line-height.xml; M: /trunk/xsl/params/table.cell.border.color.xml; M: /trunk/xsl/params/qandadiv.autolabel.xml; M: /trunk/xsl/params/xref.label-title.separator.xml; M: /trunk/xsl/params/chunk.tocs.and.lots.xml; M: /trunk/xsl/params/man.font.funcprototype.xml; M: /trunk/xsl/params/process.source.toc.xml; M: /trunk/xsl/params/page.orientation.xml; M: /trunk/xsl/params/refentry.generate.name.xml; M: /trunk/xsl/params/navig.showtitles.xml; M: /trunk/xsl/params/table.table.properties.xml; M: /trunk/xsl/params/arbortext.extensions.xml; M: /trunk/xsl/params/informalequation.properties.xml; M: /trunk/xsl/params/headers.on.blank.pages.xml; M: /trunk/xsl/params/table.footnote.properties.xml; M: /trunk/xsl/params/root.properties.xml; M: /trunk/xsl/params/htmlhelp.display.progress.xml; M: /trunk/xsl/params/htmlhelp.hhp.windows.xml; M: /trunk/xsl/params/graphical.admonition.properties.xml; M: /trunk/xsl/params/refclass.suppress.xml; M: /trunk/xsl/params/profile.conformance.xml; M: /trunk/xsl/params/htmlhelp.button.forward.xml; M: /trunk/xsl/params/segmentedlist.as.table.xml; M: /trunk/xsl/params/margin.note.float.type.xml; M: /trunk/xsl/params/man.table.footnotes.divider.xml; M: /trunk/xsl/params/man.output.quietly.xml; M: /trunk/xsl/params/htmlhelp.hhc.show.root.xml; M: /trunk/xsl/params/footers.on.blank.pages.xml; M: /trunk/xsl/params/crop.mark.offset.xml; M: /trunk/xsl/params/olink.doctitle.xml; M: /trunk/xsl/params/section.level3.properties.xml; M: /trunk/xsl/params/callout.unicode.xml; M: /trunk/xsl/params/formal.procedures.xml; M: /trunk/xsl/params/toc.section.depth.xml; M: /trunk/xsl/params/index.prefer.titleabbrev.xml; M: /trunk/xsl/params/nominal.image.width.xml; M: /trunk/xsl/params/htmlhelp.show.menu.xml; M: /trunk/xsl/params/linenumbering.everyNth.xml; M: /trunk/xsl/params/double.sided.xml; M: /trunk/xsl/params/generate.revhistory.link.xml; M: /trunk/xsl/params/olink.properties.xml; M: /trunk/xsl/params/tex.math.in.alt.xml; M: /trunk/xsl/params/man.output.subdirs.enabled.xml; M: /trunk/xsl/params/section.title.properties.xml; M: /trunk/xsl/params/column.count.back.xml; M: /trunk/xsl/params/toc.indent.width.xml; M: /trunk/xsl/params/man.charmap.uri.xml; M: /trunk/xsl/params/index.method.xml; M: /trunk/xsl/params/generate.section.toc.level.xml; M: /trunk/xsl/params/page.width.portrait.xml; M: /trunk/xsl/params/man.th.extra2.max.length.xml; M: /trunk/xsl/params/abstract.properties.xml; M: /trunk/xsl/params/revhistory.table.properties.xml; M: /trunk/xsl/params/nominal.table.width.xml; M: /trunk/xsl/params/ulink.show.xml; M: /trunk/xsl/params/htmlhelp.button.jump1.title.xml; M: /trunk/xsl/params/index.div.title.properties.xml; M: /trunk/xsl/params/profile.userlevel.xml; M: /trunk/xsl/params/html.cellpadding.xml; M: /trunk/xsl/params/orderedlist.label.width.xml; M: /trunk/xsl/params/crop.marks.xml; M: /trunk/xsl/params/menuchoice.menu.separator.xml; M: /trunk/xsl/params/author.othername.in.middle.xml; M: /trunk/xsl/params/section.level1.properties.xml; M: /trunk/xsl/params/textdata.default.encoding.xml; M: /trunk/xsl/params/label.from.part.xml; M: /trunk/xsl/params/use.embed.for.svg.xml; M: /trunk/xsl/params/list.item.spacing.xml; M: /trunk/xsl/params/htmlhelp.hhc.width.xml; M: /trunk/xsl/params/column.gap.body.xml; M: /trunk/xsl/params/rootid.xml; M: /trunk/xsl/params/glosslist.as.blocks.xml; M: /trunk/xsl/params/index.range.separator.xml; M: /trunk/xsl/params/html.ext.xml; M: /trunk/xsl/params/callout.list.table.xml; M: /trunk/xsl/params/highlight.source.xml; M: /trunk/xsl/params/show.revisionflag.xml; M: /trunk/xsl/params/man.output.manifest.enabled.xml; M: /trunk/xsl/params/make.single.year.ranges.xml; M: /trunk/xsl/params/pgwide.properties.xml; M: /trunk/xsl/params/generate.id.attributes.xml; M: /trunk/xsl/params/emphasis.propagates.style.xml; M: /trunk/xsl/params/abstract.title.properties.xml; M: /trunk/xsl/params/htmlhelp.hhc.xml; M: /trunk/xsl/params/monospace.properties.xml; M: /trunk/xsl/params/htmlhelp.hhk.xml; M: /trunk/xsl/params/table.borders.with.css.xml; M: /trunk/xsl/params/man.links.are.underlined.xml; M: /trunk/xsl/params/profile.vendor.xml; M: /trunk/xsl/params/shade.verbatim.xml; M: /trunk/xsl/params/callout.graphics.path.xml; M: /trunk/xsl/params/olink.debug.xml; M: /trunk/xsl/params/make.graphic.viewport.xml; M: /trunk/xsl/params/footnote.number.symbols.xml; M: /trunk/xsl/params/man.charmap.enabled.xml; M: /trunk/xsl/params/page.height.xml; M: /trunk/xsl/params/htmlhelp.button.jump1.url.xml; M: /trunk/xsl/params/man.font.table.title.xml; M: /trunk/xsl/params/revhistory.title.properties.xml; M: /trunk/xsl/params/chunker.output.media-type.xml; M: /trunk/xsl/params/glossterm.width.xml; M: /trunk/xsl/params/points.per.em.xml; M: /trunk/xsl/params/page.margin.inner.xml; M: /trunk/xsl/params/itemizedlist.label.width.xml; M: /trunk/xsl/params/ulink.hyphenate.xml; M: /trunk/xsl/params/crop.mark.bleed.xml; M: /trunk/xsl/params/use.id.as.filename.xml; M: /trunk/xsl/params/section.title.level6.properties.xml; M: /trunk/xsl/params/highlight.default.language.xml; M: /trunk/xsl/params/man.th.extra2.suppress.xml; M: /trunk/xsl/params/id.warnings.xml; M: /trunk/xsl/params/title.margin.left.xml; M: /trunk/xsl/params/chunker.output.doctype-system.xml; M: /trunk/xsl/params/man.indent.verbatims.xml; M: /trunk/xsl/params/table.frame.border.thickness.xml; M: /trunk/xsl/params/monospace.verbatim.properties.xml; M: /trunk/xsl/params/formal.title.properties.xml; M: /trunk/xsl/params/margin.note.width.xml; M: /trunk/xsl/params/man.hyphenate.filenames.xml; M: /trunk/xsl/params/blockquote.properties.xml; M: /trunk/xsl/params/callout.defaultcolumn.xml; M: /trunk/xsl/params/profile.security.xml; M: /trunk/xsl/params/informal.object.properties.xml; M: /trunk/xsl/params/formal.title.placement.xml; M: /trunk/xsl/params/draft.watermark.image.xml; M: /trunk/xsl/params/equation.properties.xml; M: /trunk/xsl/params/body.font.family.xml; M: /trunk/xsl/params/ignore.image.scaling.xml; M: /trunk/xsl/params/chunk.first.sections.xml; M: /trunk/xsl/params/base.dir.xml; M: /trunk/xsl/params/footnote.properties.xml; M: /trunk/xsl/params/olink.outline.ext.xml; M: /trunk/xsl/params/img.src.path.xml; M: /trunk/xsl/params/qanda.title.properties.xml; M: /trunk/xsl/params/ebnf.statement.terminator.xml; M: /trunk/xsl/params/callouts.extension.xml; M: /trunk/xsl/params/manifest.in.base.dir.xml; M: /trunk/xsl/params/fop1.extensions.xml; M: /trunk/xsl/params/olink.sysid.xml; M: /trunk/xsl/params/section.title.level4.properties.xml; M: /trunk/xsl/params/monospace.font.family.xml; M: /trunk/xsl/params/l10n.gentext.language.xml; M: /trunk/xsl/params/graphic.default.extension.xml; M: /trunk/xsl/params/default.image.width.xml; M: /trunk/xsl/params/htmlhelp.button.refresh.xml; M: /trunk/xsl/params/chunker.output.cdata-section-elements.xml; M: /trunk/xsl/params/admon.graphics.path.xml; M: /trunk/xsl/params/admon.style.xml; M: /trunk/xsl/params/profile.revision.xml; M: /trunk/xsl/params/generate.manifest.xml; M: /trunk/xsl/params/html.longdesc.xml; M: /trunk/xsl/params/footer.rule.xml; M: /trunk/xsl/params/eclipse.plugin.provider.xml; M: /trunk/xsl/params/refentry.source.name.profile.xml; M: /trunk/xsl/params/toc.max.depth.xml; M: /trunk/xsl/params/chunker.output.indent.xml; M: /trunk/xsl/params/html.head.legalnotice.link.multiple.xml; M: /trunk/xsl/params/toc.list.type.xml; M: /trunk/xsl/params/link.mailto.url.xml; M: /trunk/xsl/params/table.properties.xml; M: /trunk/xsl/params/side.float.properties.xml; M: /trunk/xsl/params/man.charmap.use.subset.xml; M: /trunk/xsl/params/annotation.graphic.open.xml; M: /trunk/xsl/params/html.cellspacing.xml; M: /trunk/xsl/params/default.table.width.xml; M: /trunk/xsl/params/xep.extensions.xml; M: /trunk/xsl/params/admonition.properties.xml; M: /trunk/xsl/params/toc.margin.properties.xml; M: /trunk/xsl/params/chunk.toc.xml; M: /trunk/xsl/params/table.entry.padding.xml; M: /trunk/xsl/params/header.rule.xml; M: /trunk/xsl/params/glossentry.show.acronym.xml; M: /trunk/xsl/params/variablelist.as.blocks.xml; M: /trunk/xsl/params/man.hyphenate.xml; M: /trunk/xsl/params/refentry.source.name.profile.enabled.xml; M: /trunk/xsl/params/section.label.includes.component.label.xml; M: /trunk/xsl/params/bridgehead.in.toc.xml; M: /trunk/xsl/params/section.title.level2.properties.xml; M: /trunk/xsl/params/admon.graphics.extension.xml; M: /trunk/xsl/params/inherit.keywords.xml; M: /trunk/xsl/params/insert.xref.page.number.xml; M: /trunk/xsl/params/pixels.per.inch.xml; M: /trunk/xsl/params/refentry.pagebreak.xml; M: /trunk/xsl/params/profile.lang.xml; M: /trunk/xsl/params/insert.olink.page.number.xml; M: /trunk/xsl/params/generate.meta.abstract.xml; M: /trunk/xsl/params/graphicsize.extension.xml; M: /trunk/xsl/params/man.indent.lists.xml; M: /trunk/xsl/params/funcsynopsis.decoration.xml; M: /trunk/xsl/params/runinhead.title.end.punct.xml; M: /trunk/xsl/params/man.string.subst.map.xml; M: /trunk/xsl/params/man.links.list.enabled.xml; M: /trunk/xsl/params/section.autolabel.max.depth.xml; M: /trunk/xsl/params/htmlhelp.show.advanced.search.xml; M: /trunk/xsl/params/htmlhelp.map.file.xml; M: /trunk/xsl/params/l10n.gentext.use.xref.language.xml; M: /trunk/xsl/params/body.font.size.xml; M: /trunk/xsl/params/html.stylesheet.type.xml; M: /trunk/xsl/params/refentry.xref.manvolnum.xml; M: /trunk/xsl/params/runinhead.default.title.end.punct.xml; M: /trunk/xsl/params/navig.graphics.extension.xml; M: /trunk/xsl/params/itemizedlist.label.properties.xml; M: /trunk/xsl/params/htmlhelp.force.map.and.alias.xml; M: /trunk/xsl/params/profile.os.xml; M: /trunk/xsl/params/htmlhelp.alias.file.xml; M: /trunk/xsl/params/page.margin.outer.xml; M: /trunk/xsl/params/annotation.graphic.close.xml; M: /trunk/xsl/params/eclipse.autolabel.xml; M: /trunk/xsl/params/table.frame.border.style.xml; M: /trunk/xsl/params/navig.graphics.path.xml; M: /trunk/xsl/params/htmlhelp.hhc.binary.xml; M: /trunk/xsl/params/index.on.type.xml; M: /trunk/xsl/params/target.database.document.xml; M: /trunk/xsl/params/man.subheading.divider.xml; M: /trunk/xsl/params/chunker.output.method.xml; M: /trunk/xsl/params/make.index.markup.xml; M: /trunk/xsl/params/olink.base.uri.xml; M: /trunk/xsl/params/phrase.propagates.style.xml; M: /trunk/xsl/params/man.indent.refsect.xml; M: /trunk/xsl/params/example.properties.xml; M: /trunk/xsl/params/man.font.table.headings.xml; M: /trunk/xsl/params/profile.revisionflag.xml; M: /trunk/xsl/params/region.after.extent.xml; M: /trunk/xsl/params/qanda.title.level5.properties.xml; M: /trunk/xsl/params/marker.section.level.xml; M: /trunk/xsl/params/footer.table.height.xml; M: /trunk/xsl/params/autotoc.label.separator.xml; M: /trunk/xsl/params/footer.column.widths.xml; M: /trunk/xsl/params/hyphenate.verbatim.xml; M: /trunk/xsl/params/xref.properties.xml; M: /trunk/xsl/params/man.output.base.dir.xml; M: /trunk/xsl/params/man.links.list.heading.xml; M: /trunk/xsl/params/insert.link.page.number.xml; M: /trunk/xsl/params/htmlhelp.button.jump2.title.xml; M: /trunk/xsl/params/l10n.lang.value.rfc.compliant.xml - Michael(tm) Smith</alt></phrase></literallayout>
+</listitem>
+<listitem>
+<literallayout><phrase role="commit-message">Updated index.method doc to describe revised setup for importing <tag>index</tag> extensions.<alt>M: /trunk/xsl/params/index.method.xml - Robert Stayton</alt></phrase></literallayout>
+</listitem>
+<listitem>
+<literallayout><phrase role="commit-message">Added several new HTML parameters for controlling appearance of
+content on HTML <tag>title</tag> pages:
+
+<parameter>contrib.inline.enabled</parameter>:
+ If non-zero (the default), output of the <tag>contrib</tag> element is
+ displayed as inline content rather than as block content.
+
+<parameter>othercredit.like.author.enabled</parameter>:
+ If non-zero, output of the <tag>othercredit</tag> element on titlepages is
+ displayed in the same style as <tag>author</tag> and <tag>editor</tag> output. If zero
+ (the default), <tag>othercredit</tag> output is displayed using a style
+ different than that of <tag>author</tag> and <tag>editor</tag>.
+
+<parameter>blurb.on.titlepage.enabled</parameter>:
+ If non-zero, output from authorblurb and <tag>personblurb</tag> elements is
+ displayed on <tag>title</tag> pages. If zero (the default), output from
+ those elements is suppressed on <tag>title</tag> pages (unless you are
+ using a titlepage customization that causes them to be included).
+
+<parameter>editedby.enabled</parameter>
+ If non-zero (the default), a localized Edited by heading is
+ displayed above <tag>editor</tag> names in output of the <tag>editor</tag> element.<alt>A: /trunk/xsl/params/contrib.inline.enabled.xml; A: /trunk/xsl/params/blurb.on.titlepage.enabled.xml; A: /trunk/xsl/params/othercredit.like.author.enabled.xml; A: /trunk/xsl/params/editedby.enabled.xml - Michael(tm) Smith</alt></phrase></literallayout>
+</listitem>
+<listitem>
+<literallayout><phrase role="commit-message">Added new <parameter>email.delimiters.enabled</parameter> param. If non-zero (the
+default), delimiters are generated around e-mail addresses (output
+of the <tag>email</tag> element). If zero, the delimiters are suppressed.<alt>A: /trunk/xsl/params/email.delimiters.enabled.xml - Michael(tm) Smith</alt></phrase></literallayout>
+</listitem>
+
+<listitem>
+<literallayout><phrase role="commit-message">Added <parameter>qanda.nested.in.toc</parameter> param. Default value is zero. If
+non-zero, instances of "nested" <tag>Qandaentry</tag> (ones that are children
+of <tag>Answer</tag> elements) are displayed in the <tag>TOC</tag>. Closes patch 1509018
+(from Daniel Leidert). Currently on affects HTML output (no patch
+for FO output provided).<alt>A: /trunk/xsl/params/qanda.nested.in.toc.xml - Michael(tm) Smith</alt></phrase></literallayout>
+</listitem>
+
+<listitem>
+<literallayout><phrase role="commit-message">Initial support of syntax highlighting of programlistings.<alt>A: /trunk/xsl/params/highlight.source.xml; A: /trunk/xsl/params/highlight.default.language.xml - Jirka Kosek</alt></phrase></literallayout>
+</listitem>
+</itemizedlist>
+</sect2><!--end of Params changes for 1.71.0-->
+
+<sect2 xml:id="V1.71.0_Tools">
+<title>Tools</title>
+<para>The following changes have been made to the
+ <filename>tools</filename> code
+ since the 1.70.1 release.</para>
+<itemizedlist>
+
+<listitem>
+<literallayout><phrase role="commit-message">Racheted down font sizes of headings in example makefile FO output.<alt>M: /trunk/xsl/tools/make/Makefile.DocBook - Michael(tm) Smith</alt></phrase></literallayout>
+</listitem>
+<listitem>
+<literallayout><phrase role="commit-message">Added param and attribute set to example makefile, for getting
+wrapping in verbatims in FO output.<alt>M: /trunk/xsl/tools/make/Makefile.DocBook - Michael(tm) Smith</alt></phrase></literallayout>
+</listitem>
+<listitem>
+<literallayout><phrase role="commit-message">Renamed Makefile.paramDoc to Makefile.docParam.<alt>A: /trunk/xsl/tools/make/Makefile.docParam; D: /trunk/xsl/tools/make/Makefile.paramDoc - Michael(tm) Smith</alt></phrase></literallayout>
+</listitem>
+<listitem>
+<literallayout><phrase role="commit-message">Added Makefile.paramDoc file, for creating versions of param.xsl
+files with doc embedded.<alt>A: /trunk/xsl/tools/make/Makefile.paramDoc - Michael(tm) Smith</alt></phrase></literallayout>
+</listitem>
+<listitem>
+<literallayout><phrase role="commit-message">Added variable to example makefile for controlling whether HTML or
+XHTML is generated.<alt>M: /trunk/xsl/tools/make/Makefile.DocBook - Michael(tm) Smith</alt></phrase></literallayout>
+</listitem>
+
+</itemizedlist>
+</sect2><!--end of Tools changes for 1.71.0-->
+</sect1>
+
+<sect1 xml:id="V1701">
+<title>Release: 1.70.1</title>
+
+<para>This is a stable release of the 1.70 stylesheets. It includes only a
+few small changes from 1.70.0.</para>
+
+<para>The following is a list of changes that have been made
+ since the 1.70.0 release.</para>
+
+<sect2 xml:id="V1701_FO">
+<title>FO</title>
+<para>The following changes have been made to the
+ <filename>fo</filename> code
+ since the 1.70.0 release.</para>
+<itemizedlist>
+<listitem role="commit-message">
+<para>Added three new attribute sets (revhistory.title.properties, revhistory.table.properties and revhistory.table.cell.properties) for controlling appearance of revhistory in FO output.</para>
+<para role="commit-changes">Modified: fo/block.xsl,1.34; fo/param.ent,1.101; fo/param.xweb,1.114; fo/titlepage.xsl,1.41; params/revhistory.table.cell.properties.xml,1.1; params/revhistory.table.properties.xml,1.1; params/revhistory.title.properties.xml,1.1 - Jirka Kosek</para>
+</listitem>
+<listitem role="commit-message">
+<para>Support DBv5 revisions with full author name (not only authorinitials)</para>
+<para role="commit-changes">Modified: fo/block.xsl,1.33; fo/titlepage.xsl,1.40 - Jirka Kosek</para>
+</listitem>
+</itemizedlist>
+</sect2><!--end of FO changes for 1.70.1-->
+
+<sect2 xml:id="V1701_HTML">
+<title>HTML</title>
+<para>The following changes have been made to the
+ <filename>html</filename> code
+ since the 1.70.0 release.</para>
+<itemizedlist>
+<listitem role="commit-message">
+<para>Support DBv5 revisions with full author name (not only authorinitials)</para>
+<para role="commit-changes">Modified: html/block.xsl,1.23; html/titlepage.xsl,1.34 - Jirka Kosek</para>
+</listitem>
+</itemizedlist>
+</sect2><!--end of HTML changes for 1.70.1-->
+
+<sect2 xml:id="V1701_HTMLHelp">
+<title>HTMLHelp</title>
+<para>The following changes have been made to the
+ <filename>htmlhelp</filename> code
+ since the 1.70.0 release.</para>
+<itemizedlist>
+<listitem role="commit-message">
+<para>htmlhelp.generate.index is now param, not variable. This means that you can override its setting from outside. This is useful when you generate indexterms on the fly (see http://www.xml.com/pub/a/2004/07/14/dbndx.html?page=3).</para>
+<para role="commit-changes">Modified: htmlhelp/htmlhelp-common.xsl,1.38 - Jirka Kosek</para>
+</listitem>
+<listitem role="commit-message">
+<para>Support chunk.tocs.and.lots in HTML Help</para>
+<para role="commit-changes">Modified: htmlhelp/htmlhelp-common.xsl,1.37 - Jirka Kosek</para>
+</listitem>
+</itemizedlist>
+</sect2><!--end of HTMLHelp changes for 1.70.1-->
+
+<sect2 xml:id="V1701_Params">
+<title>Params</title>
+<para>The following changes have been made to the
+ <filename>params</filename> code
+ since the 1.70.0 release.</para>
+<itemizedlist>
+<listitem role="commit-message">
+<para>Added three new attribute sets (revhistory.title.properties, revhistory.table.properties and revhistory.table.cell.properties) for controlling appearance of revhistory in FO output.</para>
+<para role="commit-changes">Modified: fo/block.xsl,1.34; fo/param.ent,1.101; fo/param.xweb,1.114; fo/titlepage.xsl,1.41; params/revhistory.table.cell.properties.xml,1.1; params/revhistory.table.properties.xml,1.1; params/revhistory.title.properties.xml,1.1 - Jirka Kosek</para>
+</listitem>
+</itemizedlist>
+</sect2><!--end of Params changes for 1.70.1-->
+
+</sect1>
+
+<sect1 xml:id="V1700">
+<title>Release: 1.70.0</title>
+<para>As with all DocBook Project <link linkend="dot0">dot-zero</link>
+releases, this is an experimental release. It will be followed shortly
+by a stable release.</para>
+
+<para>This release adds a number of new features,
+including:</para>
+
+<itemizedlist>
+ <listitem>
+ <para>support for selecting alternative index-collation methods
+ (in particular, support for using a collation library developed by
+ Eliot Kimber)</para>
+ </listitem>
+ <listitem>
+ <para>improved handling of DocBook 5 document instances (through a
+ namespace-stripping mechanism)</para>
+ </listitem>
+ <listitem>
+ <para>full support for CALS and HTML tables in manpages
+ output</para>
+ </listitem>
+ <listitem>
+ <para>a mechanism for preserving relative URIs in documents that
+ make use of XInclude</para>
+ </listitem>
+ <listitem>
+ <para>support for the "new" <literal>.90</literal> version of
+ FOP</para>
+ </listitem>
+ <listitem>
+ <para>enhanced capabilities for controlling formatting of lists in HTML
+ and FO output</para>
+ </listitem>
+ <listitem>
+ <para>autogeneration of AUTHOR and COPYRIGHT sections in manpages
+ output</para>
+ </listitem>
+ <listitem>
+ <para>support for generating crop marks in FO/PDF output</para>
+ </listitem>
+ <listitem>
+ <para>support for qandaset as a root element in FO output</para>
+ </listitem>
+ <listitem>
+ <para>support for floatstyle and orient on all table types</para>
+ </listitem>
+ <listitem>
+ <para>support for floatstyle in figure, and example</para>
+ </listitem>
+ <listitem>
+ <para>pgwide.properties attribute-set supports extending figure,
+ example and table into the left indent area instead of spanning
+ multiple columns.</para>
+ </listitem>
+</itemizedlist>
+ <para>The following is a detailed list of enhancements and API
+ changes that have been made since the 1.69.1 release.</para>
+
+<sect2 xml:id="V1700_Common">
+<title>Common</title>
+<para>The following changes have been made to the
+ <filename>common</filename> code
+ since the 1.69.1 release.</para>
+<itemizedlist>
+<listitem role="commit-message">
+<para>Add the xsl:key for the kimber
+indexing method.</para>
+<para role="commit-changes">Modified: common/autoidx-ng.xsl,1.2 - Robert
+Stayton</para>
+</listitem>
+<listitem role="commit-message">
+<para>Add support for
+<tag>qandaset</tag>.</para>
+<para role="commit-changes">Modified: common/labels.xsl,1.37;
+common/subtitles.xsl,1.7; common/titles.xsl,1.35 - Robert
+Stayton</para>
+</listitem>
+<listitem role="commit-message">
+<para>Support dbhtml/dbfo start PI for
+<tag>orderedlist</tag> numbering in both HTML and
+FO</para>
+<para role="commit-changes">Modified: common/common.xsl,1.61; html/lists.xsl,1.50 - Norman
+Walsh</para>
+</listitem>
+<listitem role="commit-message">
+<para>Added CVS
+header.</para>
+<para role="commit-changes">Modified: common/stripns.xsl,1.12 - Robert
+Stayton</para>
+</listitem>
+<listitem role="commit-message">
+<para>Changed content model of text
+element to ANY rather than #PCDATA because they could contain
+markup.</para>
+<para role="commit-changes">Modified: common/targetdatabase.dtd,1.7 - Robert
+Stayton</para>
+</listitem>
+<listitem role="commit-message">
+<para>Added
+<tag>refentry</tag>.meta.get.quietly param.</para>
+<para>If zero (the
+default), notes and warnings about "missing" markup are generated
+during gathering of <tag>refentry</tag> metadata. If
+non-zero, the metadata is gathered "quietly" -- that is, the
+notes and warnings are suppressed.</para>
+<para>NOTE: If you are
+processing a large amount of <tag>refentry</tag> content, you
+may be able to speed up processing significantly by setting a
+non-zero value for
+<tag>refentry</tag>.meta.get.quietly.</para>
+<para role="commit-changes">Modified: common/refentry.xsl,1.17;
+manpages/param.ent,1.15; manpages/param.xweb,1.17;
+params/refentry.meta.get.quietly.xml,1.1 - Michael(tm)
+Smith</para>
+</listitem>
+<listitem role="commit-message">
+<para>After namespace stripping, the
+source document is the temporary tree created by the stripping
+process and it has the wrong base <tag>URI</tag> for relative
+references. Earlier versions of this code used to try to fix that
+by patching the elements with relative @fileref attributes. That
+was inadequate because it calculated an absolute base <tag>URI</tag>
+without considering that there might be xml:base attributes
+already in effect. It seems obvious now that the right thing to
+do is simply to put the xml:base on the root of the document. And
+that seems to work.</para>
+<para role="commit-changes">Modified: common/stripns.xsl,1.7 - Norman
+Walsh</para>
+</listitem>
+<listitem role="commit-message">
+<para>Added support for "software" and
+"sectdesc" class values on <tag>refmiscinfo</tag>; "software" is
+treated identically to "source", and "setdesc" is treated
+identically to "manual".</para>
+<para role="commit-changes">Modified: common/refentry.xsl,1.10;
+params/man.th.extra2.max.length.xml,1.3;
+params/refentry.source.name.profile.xml,1.4 - Michael(tm)
+Smith</para>
+</listitem>
+<listitem role="commit-message">
+<para>Added support for DocBook 5
+namespace-stripping in manpages stylesheet. Closes request
+#1210692.</para>
+<para role="commit-changes">Modified: common/common.xsl,1.56; manpages/docbook.xsl,1.57 -
+Michael(tm) Smith</para>
+</listitem>
+<listitem role="commit-message">
+<para>Added &lt;xsl:template
+match="/"&gt; to make stripns.xsl usable as a standalone
+stylesheet for stripping out DocBook 5/NG to DocBook 4. Note that
+DocBook XSLT drivers that include this stylesheet all override
+the match="/" template.</para>
+<para role="commit-changes">Modified: common/stripns.xsl,1.4 - Michael(tm)
+Smith</para>
+</listitem>
+<listitem role="commit-message">
+<para>Number figures, examples, and
+tables from <tag>book</tag> if there is no prefix (i.e. if
+<parameter>chapter.autolabel</parameter> is set to 0). This avoids
+having the list of figures where the figures mysteriously restart
+their numeration periodically when
+<parameter>chapter.autolabel</parameter> is set to
+0.</para>
+<para role="commit-changes">Modified: common/labels.xsl,1.36 - David Cramer</para>
+</listitem>
+<listitem role="commit-message">
+<para>Add <tag>task</tag> template in
+<tag>title</tag>.markup mode.</para>
+<para role="commit-changes">Modified: common/titles.xsl,1.34 - Robert
+Stayton</para>
+</listitem>
+<listitem role="commit-message">
+<para>Add children (with ids) of formal
+objects to target data.</para>
+<para role="commit-changes">Modified: common/targets.xsl,1.10 - Robert
+Stayton</para>
+</listitem>
+<listitem role="commit-message">
+<para>Added support for case when
+<tag>personname</tag> doesn't contain specific name markup (as allowed
+in DocBook 5.0)</para>
+<para role="commit-changes">Modified: common/common.xsl,1.54 - Jirka
+Kosek</para>
+</listitem>
+</itemizedlist>
+</sect2><!--end of Common changes for snapshot_2006-05-15_0803-->
+
+<sect2 xml:id="V1700_Extensions">
+<title>Extensions</title>
+<para>The following changes have been made to the
+ <filename>extensions</filename> code
+ since the 1.69.1 release.</para>
+<itemizedlist>
+<listitem role="commit-message">
+<para>Support Xalan
+2.7</para>
+<para role="commit-changes">Modified: extensions/xalan27/.cvsignore,1.1;
+extensions/xalan27/build.xml,1.1;
+extensions/xalan27/nbproject/.cvsignore,1.1;
+extensions/xalan27/nbproject/build-impl.xml,1.1;
+extensions/xalan27/nbproject/genfiles.properties,1.1;
+extensions/xalan27/nbproject/project.properties,1.1;
+extensions/xalan27/nbproject/project.xml,1.1;
+extensions/xalan27/src/com/nwalsh/xalan/CVS.java,1.1;
+extensions/xalan27/src/com/nwalsh/xalan/Callout.java,1.1;
+extensions/xalan27/src/com/nwalsh/xalan/FormatCallout.java,1.1;
+extensions/xalan27/src/com/nwalsh/xalan/FormatDingbatCallout.java,1.1;
+extensions/xalan27/src/com/nwalsh/xalan/FormatGraphicCallout.java,1.1;
+extensions/xalan27/src/com/nwalsh/xalan/FormatTextCallout.java,1.1;
+extensions/xalan27/src/com/nwalsh/xalan/FormatUnicodeCallout.java,1.1;
+extensions/xalan27/src/com/nwalsh/xalan/Func.java,1.1;
+extensions/xalan27/src/com/nwalsh/xalan/ImageIntrinsics.java,1.1;
+extensions/xalan27/src/com/nwalsh/xalan/Params.java,1.1;
+extensions/xalan27/src/com/nwalsh/xalan/Table.java,1.1;
+extensions/xalan27/src/com/nwalsh/xalan/Text.java,1.1;
+extensions/xalan27/src/com/nwalsh/xalan/Verbatim.java,1.1 - Norman
+Walsh</para>
+</listitem>
+<listitem role="commit-message">
+<para>Handle the case where the imageFn
+is actually a <tag>URI</tag>. This still needs
+work.</para>
+<para role="commit-changes">Modified: extensions/saxon643/com/nwalsh/saxon/ImageIntrinsics.java,1.4
+- Norman Walsh</para>
+</listitem>
+</itemizedlist>
+</sect2><!--end of Extensions changes for snapshot_2006-05-15_0803-->
+
+<sect2 xml:id="V1700_FO">
+<title>FO</title>
+<para>The following changes have been made to the
+ <filename>fo</filename> code
+ since the 1.69.1 release.</para>
+<itemizedlist>
+<listitem role="commit-message">
+<para>Adapted to the new indexing
+code. Now works just like a wrapper that calls kosek indexing method,
+originally implemented here.</para>
+<para role="commit-changes">Modified: fo/autoidx-ng.xsl,1.5 - Jirka
+Kosek</para>
+</listitem>
+<listitem role="commit-message">
+<para>Added parameters for header/footer
+<tag>table</tag> minimum height.</para>
+<para role="commit-changes">Modified: fo/pagesetup.xsl,1.60;
+fo/param.ent,1.100; fo/param.xweb,1.113 - Robert
+Stayton</para>
+</listitem>
+<listitem role="commit-message">
+<para>Add the <tag>index</tag>.method
+parameter.</para>
+<para role="commit-changes">Modified: fo/param.ent,1.99; fo/param.xweb,1.112 - Robert
+Stayton</para>
+</listitem>
+<listitem role="commit-message">
+<para>Integrate support for three
+indexing methods: - the original English-only method. -
+Jirka Kosek's method using EXSLT extensions. - Eliot Kimber's
+method using Saxon extensions. Use the '<tag>index</tag>.method'
+parameter to select.</para>
+<para role="commit-changes">Modified: fo/autoidx.xsl,1.38 - Robert
+Stayton</para>
+</listitem>
+<listitem role="commit-message">
+<para>Add support for <tag>TOC</tag> for
+<tag>qandaset</tag> in fo output.</para>
+<para role="commit-changes">Modified: fo/autotoc.xsl,1.30;
+fo/qandaset.xsl,1.20 - Robert Stayton</para>
+</listitem>
+<listitem role="commit-message">
+<para>Added parameter
+<parameter>ulink.hyphenate</parameter>.chars. Added parameter
+insert.<tag>link</tag>.page.number.</para>
+<para role="commit-changes">Modified: fo/param.ent,1.98;
+fo/param.xweb,1.111 - Robert Stayton</para>
+</listitem>
+<listitem role="commit-message">
+<para>Implemented feature request
+#942524 to add insert.<tag>link</tag>.page.number to allow link
+element cross references to have a page number.</para>
+<para role="commit-changes">Modified: fo/xref.xsl,1.67 -
+Robert Stayton</para>
+</listitem>
+<listitem role="commit-message">
+<para>Add support for
+<parameter>ulink.hyphenate</parameter>.chars so more characters
+can be break points in urls.</para>
+<para role="commit-changes">Modified: fo/xref.xsl,1.66 - Robert
+Stayton</para>
+</listitem>
+<listitem role="commit-message">
+<para>Implemented patch #1075144 to make
+the url text in a ulink in FO output an active <tag>link</tag> as
+well.</para>
+<para role="commit-changes">Modified: fo/xref.xsl,1.65 - Robert Stayton</para>
+</listitem>
+<listitem role="commit-message">
+<para><tag>table</tag> footnotes now
+have their own <tag>table</tag>.<tag>footnote</tag>.properties
+attribute set.</para>
+<para role="commit-changes">Modified: fo/footnote.xsl,1.23 - Robert
+Stayton</para>
+</listitem>
+<listitem role="commit-message">
+<para>Add <tag>qandaset</tag> to
+root.elements.</para>
+<para role="commit-changes">Modified: fo/docbook.xsl,1.41 - Robert
+Stayton</para>
+</listitem>
+<listitem role="commit-message">
+<para>Added mode="page.sequence" to make
+it easier to put content into a page sequence. First used for
+<tag>qandaset</tag>.</para>
+<para role="commit-changes">Modified: fo/component.xsl,1.37 - Robert
+Stayton</para>
+</listitem>
+<listitem role="commit-message">
+<para>Implemented feature request
+#1434408 to support formatting
+of <tag>biblioentry</tag>.</para>
+<para role="commit-changes">Modified: fo/biblio.xsl,1.35 - Robert
+Stayton</para>
+</listitem>
+<listitem role="commit-message">
+<para>Added
+<tag>biblioentry</tag>.properties.</para>
+<para role="commit-changes">Modified: fo/param.ent,1.97;
+fo/param.xweb,1.110 - Robert Stayton</para>
+</listitem>
+<listitem role="commit-message">
+<para>Support PTC/Arbortext
+bookmarks</para>
+<para role="commit-changes">Modified: fo/docbook.xsl,1.40; fo/ptc.xsl,1.1 - Norman
+Walsh</para>
+</listitem>
+<listitem role="commit-message">
+<para>Added
+<tag>table</tag>.<tag>footnote</tag>.properties to permit
+<tag>table</tag> footnotes to format differently from regular
+footnotes.</para>
+<para role="commit-changes">Modified: fo/param.ent,1.96; fo/param.xweb,1.109 - Robert
+Stayton</para>
+</listitem>
+<listitem role="commit-message">
+<para>Refactored <tag>table</tag>
+templates to unify their processing and support all options in
+all types. Now <tag>table</tag> and <tag>informaltable</tag>, in
+both Cals and Html markup, use the same templates where possible,
+and all support pgwide, rotation, and floats. There is also a
+placeholder <tag>table</tag>.container template to
+support wrapping a <tag>table</tag> in a layout <tag>table</tag>,
+so the XEP <tag>table</tag> <tag>title</tag> "continued"
+extension can be more easily implemented.</para>
+<para role="commit-changes">Modified: fo/formal.xsl,1.52;
+fo/htmltbl.xsl,1.9; fo/table.xsl,1.48 - Robert
+Stayton</para>
+</listitem>
+<listitem role="commit-message">
+<para>Added new attribute set
+<tag>toc</tag>.line.properties for controlling appearance of lines in
+ToC/LoT</para>
+<para role="commit-changes">Modified: fo/autotoc.xsl,1.29; fo/param.ent,1.95;
+fo/param.xweb,1.108 - Jirka Kosek</para>
+</listitem>
+<listitem role="commit-message">
+<para>Added support for float to example
+and <tag>equation</tag>. Added support for pgwide to
+<tag>figure</tag>, example, and <tag>equation</tag> (the latter
+two via a dbfo pgwide="1" processing
+instruction).</para>
+<para role="commit-changes">Modified: fo/formal.xsl,1.51 - Robert
+Stayton</para>
+</listitem>
+<listitem role="commit-message">
+<para>Add pgwide.properties
+attribute-set.</para>
+<para role="commit-changes">Modified: fo/param.ent,1.94; fo/param.xweb,1.107 - Robert
+Stayton</para>
+</listitem>
+<listitem role="commit-message">
+<para>Added <tag>refclass</tag>.suppress
+param.</para>
+<para>If the value of <tag>refclass</tag>.suppress is
+non-zero, then display <tag>refclass</tag> contents is suppressed
+in output. Affects HTML and FO output
+only.</para>
+<para role="commit-changes">Modified: fo/param.ent,1.93; fo/param.xweb,1.106; html/param.ent,1.90;
+html/param.xweb,1.99; params/refclass.suppress.xml,1.1 - Michael(tm)
+Smith</para>
+</listitem>
+<listitem role="commit-message">
+<para>Improved support for
+<tag>task</tag> subelements</para>
+<para role="commit-changes">Modified: fo/task.xsl,1.3; html/task.xsl,1.3 -
+Jirka Kosek</para>
+</listitem>
+<listitem role="commit-message">
+<para>Adjusted spacing around
+K&amp;R-formatted <tag>Funcdef</tag> and <tag>Paramdef</tag>
+output such that it can more easily be discerned where one ends
+and the other begins. Closes #1213264.</para>
+<para role="commit-changes">Modified: fo/synop.xsl,1.18 -
+Michael(tm) Smith</para>
+</listitem>
+<listitem role="commit-message">
+<para>Made handling of
+paramdef/parameter in FO output consistent with that in HTML and
+manpages output. Closes #1213259.</para>
+<para role="commit-changes">Modified: fo/synop.xsl,1.17 - Michael(tm)
+Smith</para>
+</listitem>
+<listitem role="commit-message">
+<para>Made handling of
+<tag>Refnamediv</tag> consistent with formatting in HTML
+and manpages output; specifically, changed so that
+<tag>Refname</tag> (comma-separated list of multiple instances
+found) is used (instead of <tag>Refentrytitle</tag> as
+previously), then em-dash, then the <tag>Refpurpose</tag>. Closes
+#1212562.</para>
+<para role="commit-changes">Modified: fo/refentry.xsl,1.30 - Michael(tm)
+Smith</para>
+</listitem>
+<listitem role="commit-message">
+<para>Added output of
+<tag>Releaseinfo</tag> to recto titlepage ("<tag>copyright</tag>"
+page) for <tag>Book</tag> in FO output. This makes it consistent
+with HTML output. Closes #1327034. Thanks to Paul DuBois for
+reporting.</para>
+<para role="commit-changes">Modified: fo/titlepage.templates.xml,1.28 - Michael(tm)
+Smith</para>
+</listitem>
+<listitem role="commit-message">
+<para>Added condition for setting
+block-progression-dimension.minimum on table-row, instead of
+height, when <parameter>fop1.extensions</parameter> is
+non-zero. For an explanation of the reason for the change,
+<tag>see</tag>: http://wiki.apache.org/xmlgraphics-fop/Troubleshooting/CommonLogMessages</para>
+<para role="commit-changes">Modified: fo/pagesetup.xsl,1.59
+- Michael(tm) Smith</para>
+</listitem>
+<listitem role="commit-message">
+<para>Added new
+<tag>refclass</tag>.suppress param for suppressing display
+of <tag>Refclass</tag> in HTML and FO output. Did not add it to
+manpages because manpages stylesheet is currently just silently
+ignoring <tag>Refclass</tag> anyway. Closes request
+#1461065. Thanks to Davor Ocelic (docelic) for
+reporting.</para>
+<para role="commit-changes">Modified: fo/refentry.xsl,1.29; html/refentry.xsl,1.23 -
+Michael(tm) Smith</para>
+</listitem>
+<listitem role="commit-message">
+<para>Add support for keep-together PI
+to informal objects.</para>
+<para role="commit-changes">Modified: fo/formal.xsl,1.50 - Robert
+Stayton</para>
+</listitem>
+<listitem role="commit-message">
+<para>Add support for
+<parameter>fop1.extensions</parameter>.</para>
+<para role="commit-changes">Modified: fo/formal.xsl,1.49;
+fo/graphics.xsl,1.44; fo/table.xsl,1.47 - Robert
+Stayton</para>
+</listitem>
+<listitem role="commit-message">
+<para>Add support for fop1
+bookmarks.</para>
+<para role="commit-changes">Modified: fo/docbook.xsl,1.39 - Robert
+Stayton</para>
+</listitem>
+<listitem role="commit-message">
+<para>Add fop1.extentions parameter to
+add support for fop development version.</para>
+<para role="commit-changes">Modified: fo/param.ent,1.92;
+fo/param.xweb,1.105 - Robert Stayton</para>
+</listitem>
+<listitem role="commit-message">
+<para>Start supporting fop development
+version, which will become fop version 1.</para>
+<para role="commit-changes">Modified: fo/fop1.xsl,1.1 -
+Robert Stayton</para>
+</listitem>
+<listitem role="commit-message">
+<para>Add template for <tag>task</tag>
+in mode="xref-to".</para>
+<para role="commit-changes">Modified: fo/xref.xsl,1.63; html/xref.xsl,1.57 - Robert
+Stayton</para>
+</listitem>
+<listitem role="commit-message">
+<para><tag>table</tag> footnotes now
+also get <tag>footnote</tag>.properties
+attribute-set.</para>
+<para role="commit-changes">Modified: fo/footnote.xsl,1.22 - Robert
+Stayton</para>
+</listitem>
+<listitem role="commit-message">
+<para>Added <tag>index</tag>.separator
+named template to compute the separator punctuation based on
+locale.</para>
+<para role="commit-changes">Modified: fo/autoidx.xsl,1.36 - Robert Stayton</para>
+</listitem>
+<listitem role="commit-message">
+<para>Added support for <tag>link</tag>,
+<tag>olink</tag>, and <tag>xref</tag> within OO
+<tag>Classsynopsis</tag> and children. (Because DocBook NG/5
+allows it).</para>
+<para role="commit-changes">Modified: fo/synop.xsl,1.15; html/synop.xsl,1.19 - Michael(tm)
+Smith</para>
+</listitem>
+<listitem role="commit-message">
+<para>Support <tag>date</tag> as an
+inline</para>
+<para role="commit-changes">Modified: fo/inline.xsl,1.43; html/inline.xsl,1.46 - Norman
+Walsh</para>
+</listitem>
+<listitem role="commit-message">
+<para>Added new parameter
+<parameter>keep.relative.image.uris</parameter></para>
+<para role="commit-changes">Modified: fo/param.ent,1.91;
+fo/param.xweb,1.104; html/param.ent,1.87; html/param.xweb,1.96;
+params/keep.relative.image.uris.xml,1.1 - Norman
+Walsh</para>
+</listitem>
+<listitem role="commit-message">
+<para>Map Unicode space characters
+U+2000-U+200A to fo:leaders.</para>
+<para role="commit-changes">Modified: fo/docbook.xsl,1.38;
+fo/passivetex.xsl,1.4; fo/spaces.xsl,1.1 - Jirka
+Kosek</para>
+</listitem>
+<listitem role="commit-message">
+<para>Output a real em dash for em-dash
+dingbat (instead of two hypens).</para>
+<para role="commit-changes">Modified: fo/fo.xsl,1.7 - Michael(tm)
+Smith</para>
+</listitem>
+<listitem role="commit-message">
+<para>Support default <tag>label</tag>
+width parameters for itemized and ordered lists</para>
+<para role="commit-changes">Modified: fo/lists.xsl,1.64;
+fo/param.ent,1.90; fo/param.xweb,1.103;
+params/itemizedlist.label.width.xml,1.1;
+params/orderedlist.label.width.xml,1.1 - Norman
+Walsh</para>
+</listitem>
+<listitem role="commit-message">
+<para>Generate localized
+<tag>title</tag> for <tag>Refsynopsisdiv</tag> if no
+appropriate <tag>Title</tag> descendant found in source. Closes
+#1212398. This change makes behavior for the <tag>Synopsis</tag>
+<tag>title</tag> consistent with the behavior of HTML and
+manpages output.</para>
+<para>Also, added
+xsl:use-attribute-sets="normal.<tag>para</tag>.spacing" to
+block generated for <tag>Cmdsynopsis</tag> output. Previously,
+that block had no spacing at all specified, which resulted it
+being crammed up to closely to the <tag>Synopsis</tag>
+head.</para>
+<para role="commit-changes">Modified: fo/refentry.xsl,1.28; fo/synop.xsl,1.13 - Michael(tm)
+Smith</para>
+</listitem>
+<listitem role="commit-message">
+<para>Added parameters to support
+localization of <tag>index</tag>
+item punctuation.</para>
+<para role="commit-changes">Modified: fo/autoidx.xsl,1.35 - Robert
+Stayton</para>
+</listitem>
+<listitem role="commit-message">
+<para>Added
+<parameter>index.number.separator</parameter>,
+<parameter>index.range.separator</parameter>,
+and <parameter>index.term.separator</parameter> parameters to
+support localization of punctuation in <tag>index</tag>
+entries.</para>
+<para role="commit-changes">Modified: fo/param.ent,1.89; fo/param.xweb,1.102 - Robert
+Stayton</para>
+</listitem>
+<listitem role="commit-message">
+<para>Added "Cross References"
+<tag>section</tag> in HTML doc (for consistency with the FO
+doc). Also, moved the existing FO "Cross
+References" <tag>section</tag> to follow the "Linking"
+<tag>section</tag>.</para>
+<para role="commit-changes">Modified: fo/param.xweb,1.101; html/param.xweb,1.95 -
+Michael(tm) Smith</para>
+</listitem>
+<listitem role="commit-message">
+<para>Added ID attribues to all
+<tag>Reference</tag> elements (e.g., id="tables" for the doc for
+<tag>section</tag> on <tag>Table</tag> params). So pages for
+all subsections of ref docs now have stable filenames instead
+of arbitrary generated filenames.</para>
+<para role="commit-changes">Modified: fo/param.xweb,1.100;
+html/param.xweb,1.94 - Michael(tm) Smith</para>
+</listitem>
+<listitem role="commit-message">
+<para>Added two new parameters for
+handling of multi-term
+<tag>varlistentry</tag> elements:</para>
+<para><parameter>variablelist.term.break.after</parameter>:
+When the <parameter>variablelist.term.break.after</parameter> is
+non-zero, it will generate a line break after each
+<tag>term</tag> multi-term
+<tag>varlistentry</tag>.</para>
+<para><parameter>variablelist.term.separator</parameter>:
+When a <tag>varlistentry</tag> contains multiple <tag>term</tag>
+elements, the string specified in the value of the
+<parameter>variablelist.term.separator</parameter> parameter is
+placed after each <tag>term</tag> except the last. The default
+is ", " (a comma followed by a space). To suppress rendering of
+the separator, set the value of
+<parameter>variablelist.term.separator</parameter> to the empty
+string ("").</para>
+<para>These parameters are primarily intended to be
+useful if you have multi-term varlistentries that have long
+terms.</para>
+<para>Closes #1306676. Thanks to Sam Steingold for
+providing an example "lots of long terms" doc that demonstrated
+the value of having these options.</para>
+<para>Also, added
+normalize-space() call to processing of each
+<tag>term</tag>.</para>
+<para>This change affects all output formats
+(HTML, PDF, manpages). The default behavior should pretty much
+remain the same as before, but it is possible (as always) that
+the change may introduce some
+new bugginess.</para>
+<para role="commit-changes">Modified: fo/lists.xsl,1.62; fo/param.ent,1.88;
+fo/param.xweb,1.99; html/lists.xsl,1.48; html/param.ent,1.86;
+html/param.xweb,1.93; manpages/lists.xsl,1.22;
+manpages/param.ent,1.14; manpages/param.xweb,1.16;
+params/variablelist.term.break.after.xml,1.1;
+params/variablelist.term.separator.xml,1.1 - Michael(tm)
+Smith</para>
+</listitem>
+<listitem role="commit-message">
+<para>Add <tag>sidebar</tag> titlepage
+placeholder attset for styles.</para>
+<para role="commit-changes">Modified: fo/titlepage.xsl,1.37 - Robert
+Stayton</para>
+</listitem>
+<listitem role="commit-message">
+<para>Add titlepage for
+<tag>sidebar</tag>.</para>
+<para role="commit-changes">Modified: fo/titlepage.templates.xml,1.27 - Robert
+Stayton</para>
+</listitem>
+<listitem role="commit-message">
+<para>Implemented RFE
+#1292615.</para>
+<para>Added bunch of new parameters (attribute sets)
+that affect list presentation: list.block.properties,
+<tag>itemizedlist</tag>.properties, <tag>orderedlist</tag>.properties,
+<tag>itemizedlist</tag>.<tag>label</tag>.properties and
+<tag>orderedlist</tag>.<tag>label</tag>.properties. Default behaviour
+of stylesheets has not been changed but further customizations will be
+much more easier.</para>
+<para role="commit-changes">Modified: fo/lists.xsl,1.61; fo/param.ent,1.87;
+fo/param.xweb,1.98; params/itemizedlist.label.properties.xml,1.1;
+params/itemizedlist.properties.xml,1.1;
+params/list.block.properties.xml,1.1;
+params/orderedlist.label.properties.xml,1.1;
+params/orderedlist.properties.xml,1.1 - Jirka
+Kosek</para>
+</listitem>
+<listitem role="commit-message">
+<para>Implemented RFE
+#1242092.</para>
+<para>You can enable crop marks in your document by
+setting crop.marks=1 and xep.extensions=1. Appearance of crop
+marks can be controlled by parameters
+<parameter>crop.mark.bleed</parameter> (6pt),
+<parameter>crop.mark.offset</parameter> (24pt) and
+<parameter>crop.mark.width</parameter> (0.5pt).</para>
+<para>Also there
+is new named template called user-xep-pis. You can overwrite it in
+order to produce some PIs that can control XEP as described in
+http://www.renderx.com/reference.html#Output_Formats</para>
+<para role="commit-changes">Modified: fo/docbook.xsl,1.36;
+fo/param.ent,1.86; fo/param.xweb,1.97; fo/xep.xsl,1.23;
+params/crop.mark.bleed.xml,1.1; params/crop.mark.offset.xml,1.1;
+params/crop.mark.width.xml,1.1; params/crop.marks.xml,1.1 - Jirka
+Kosek</para>
+</listitem>
+</itemizedlist>
+</sect2><!--end of FO changes for snapshot_2006-05-15_0803-->
+
+<sect2 xml:id="V1700_HTML">
+<title>HTML</title>
+<para>The following changes have been made to the
+ <filename>html</filename> code
+ since the 1.69.1 release.</para>
+<itemizedlist>
+<listitem role="commit-message">
+<para>implemented
+<tag>index</tag>.method parameter and three
+methods.</para>
+<para role="commit-changes">Modified: html/autoidx.xsl,1.28 - Robert
+Stayton</para>
+</listitem>
+<listitem role="commit-message">
+<para>added <tag>index</tag>.method
+parameter to support 3 indexing methods.</para>
+<para role="commit-changes">Modified: html/param.ent,1.94;
+html/param.xweb,1.103 - Robert Stayton</para>
+</listitem>
+<listitem role="commit-message">
+<para>Implemented feature request
+#1072510 as a processing instruction to permit including external
+HTML content into HTML output.</para>
+<para role="commit-changes">Modified: html/pi.xsl,1.9 - Robert
+Stayton</para>
+</listitem>
+<listitem role="commit-message">
+<para>Added new parameter
+<parameter>chunk.tocs.and.lots</parameter>.has.<tag>title</tag> which
+controls presence of <tag>title</tag> in a separate chunk with
+ToC/LoT. Disabling <tag>title</tag> can be very useful if you are
+generating frameset output (well, yes those frames, but some customers
+really want them ;-).</para>
+<para role="commit-changes">Modified: html/chunk-code.xsl,1.15;
+html/param.ent,1.93; html/param.xweb,1.102;
+params/chunk.tocs.and.lots.has.title.xml,1.1 - Jirka
+Kosek</para>
+</listitem>
+<listitem role="commit-message">
+<para>Support dbhtml/dbfo start PI for
+<tag>orderedlist</tag> numbering in both HTML and
+FO</para>
+<para role="commit-changes">Modified: common/common.xsl,1.61; html/lists.xsl,1.50 - Norman
+Walsh</para>
+</listitem>
+<listitem role="commit-message">
+<para>Allow <tag>ToC</tag> without
+<tag>title</tag> also for set and
+<tag>book</tag>.</para>
+<para role="commit-changes">Modified: html/autotoc.xsl,1.37; html/division.xsl,1.12 -
+Jirka Kosek</para>
+</listitem>
+<listitem role="commit-message">
+<para>Implemented floats uniformly for
+<tag>figure</tag>, example, <tag>equation</tag>
+and <tag>informalfigure</tag>, <tag>informalexample</tag>, and
+<tag>informalequation</tag>.</para>
+<para role="commit-changes">Modified: html/formal.xsl,1.22 - Robert
+Stayton</para>
+</listitem>
+<listitem role="commit-message">
+<para>Added the
+autotoc.<tag>label</tag>.in.hyperlink param.</para>
+<para>If the value
+of autotoc.<tag>label</tag>.in.hyperlink is non-zero, labels
+are included in hyperlinked titles in the <tag>TOC</tag>. If it
+is instead zero, labels are still displayed prior to the
+hyperlinked titles, but are not hyperlinked along with the
+titles.</para>
+<para>Closes patch #1065868. Thanks to anatoly techtonik
+for the patch.</para>
+<para role="commit-changes">Modified: html/autotoc.xsl,1.36; html/param.ent,1.92;
+html/param.xweb,1.101; params/autotoc.label.in.hyperlink.xml,1.1 -
+Michael(tm) Smith</para>
+</listitem>
+<listitem role="commit-message">
+<para>Added two new params:
+html.head.<tag>legalnotice</tag>.<tag>link</tag>.types
+and html.head.<tag>legalnotice</tag>.<tag>link</tag>.multiple.</para>
+<para>If
+the value of the <parameter>generate.legalnotice.link</parameter> is
+non-zero, then the stylesheet generates (in the head
+<tag>section</tag> of the HTML source) either a single HTML
+<tag>link</tag> element or, if the value of
+the html.head.<tag>legalnotice</tag>.<tag>link</tag>.multiple is
+non-zero, one <tag>link</tag> element for each <tag>link</tag>
+type specified. Each <tag>link</tag> has the
+following attributes:</para>
+<para> - a rel attribute whose value
+is derived from the value of
+html.head.<tag>legalnotice</tag>.<tag>link</tag>.types</para>
+<para> -
+an href attribute whose value is set to the URL of the file
+containing the <tag>legalnotice</tag></para>
+<para> - a <tag>title</tag>
+attribute whose value is set to the <tag>title</tag> of the
+corresponding <tag>legalnotice</tag> (or a <tag>title</tag>
+programatically determined by the stylesheet)</para>
+<para>For
+example:</para>
+<para> &lt;<tag>link</tag> rel="<tag>copyright</tag>"
+href="ln-id2524073.html" title="Legal Notice"&gt;</para>
+<para>Closes
+#1476450. Thanks to Sam Steingold.</para>
+<para role="commit-changes">Modified: html/chunk-common.xsl,1.45;
+html/param.ent,1.91; html/param.xweb,1.100;
+params/generate.legalnotice.link.xml,1.4;
+params/html.head.legalnotice.link.multiple.xml,1.1;
+params/html.head.legalnotice.link.types.xml,1.1 - Michael(tm)
+Smith</para>
+</listitem>
+<listitem role="commit-message">
+<para>Added <tag>refclass</tag>.suppress
+param.</para>
+<para>If the value of <tag>refclass</tag>.suppress is
+non-zero, then display <tag>refclass</tag> contents is suppressed
+in output. Affects HTML and FO output
+only.</para>
+<para role="commit-changes">Modified: fo/param.ent,1.93; fo/param.xweb,1.106; html/param.ent,1.90;
+html/param.xweb,1.99; params/refclass.suppress.xml,1.1 - Michael(tm)
+Smith</para>
+</listitem>
+<listitem role="commit-message">
+<para>Improved support for
+<tag>task</tag> subelements</para>
+<para role="commit-changes">Modified: fo/task.xsl,1.3; html/task.xsl,1.3 -
+Jirka Kosek</para>
+</listitem>
+<listitem role="commit-message">
+<para>Added new
+<tag>refclass</tag>.suppress param for suppressing display
+of <tag>Refclass</tag> in HTML and FO output. Did not add it to
+manpages because manpages stylesheet is currently just silently
+ignoring <tag>Refclass</tag> anyway. Closes request
+#1461065. Thanks to Davor Ocelic (docelic) for
+reporting.</para>
+<para role="commit-changes">Modified: fo/refentry.xsl,1.29; html/refentry.xsl,1.23 -
+Michael(tm) Smith</para>
+</listitem>
+<listitem role="commit-message">
+<para>Process <tag>alt</tag> text with
+normalize-space(). Replace tab indents with
+spaces.</para>
+<para role="commit-changes">Modified: html/graphics.xsl,1.57 - Robert
+Stayton</para>
+</listitem>
+<listitem role="commit-message">
+<para>Content of <tag>citation</tag>
+element is automatically linked to the bibliographic <tag>entry</tag>
+with the corresponding <tag>abbrev</tag>.</para>
+<para role="commit-changes">Modified: html/biblio.xsl,1.26;
+html/inline.xsl,1.47; html/xref.xsl,1.58 - Jirka
+Kosek</para>
+</listitem>
+<listitem role="commit-message">
+<para>Add template for <tag>task</tag>
+in mode="xref-to".</para>
+<para role="commit-changes">Modified: fo/xref.xsl,1.63; html/xref.xsl,1.57 - Robert
+Stayton</para>
+</listitem>
+<listitem role="commit-message">
+<para>Suppress ID warnings if the
+.warnings parameter is 0</para>
+<para role="commit-changes">Modified: html/html.xsl,1.17 - Norman
+Walsh</para>
+</listitem>
+<listitem role="commit-message">
+<para>Add support for floatstyle to
+<tag>figure</tag>.</para>
+<para role="commit-changes">Modified: html/formal.xsl,1.21 - Robert
+Stayton</para>
+</listitem>
+<listitem role="commit-message">
+<para>Handling of <tag>xref</tag> to
+area/areaset need support in extensions code also. I currently have no
+time to touch extensions code, so code is here to be enabled when
+extension is fixed also.</para>
+<para role="commit-changes">Modified: html/xref.xsl,1.56 - Jirka
+Kosek</para>
+</listitem>
+<listitem role="commit-message">
+<para>Added 3 parameters for overriding
+gentext for <tag>index</tag>
+punctuation.</para>
+<para role="commit-changes">Modified: html/param.ent,1.89; html/param.xweb,1.98 - Robert
+Stayton</para>
+</listitem>
+<listitem role="commit-message">
+<para>Added parameters to support
+localization of <tag>index</tag> item punctuation. Added
+<tag>index</tag>.separator named template to compute
+the separator punctuation based on
+locale.</para>
+<para role="commit-changes">Modified: html/autoidx.xsl,1.27 - Robert
+Stayton</para>
+</listitem>
+<listitem role="commit-message">
+<para>Added a &lt;div
+class="{$class}-contents"&gt; wrapper around output of contents
+of all formal objects. Also, added an optional &lt;br
+class="{class}-break"/&gt; linebreak after all formal
+objects.</para>
+<para>WARNING: Because this change places an additional
+DIV between the DIV wrapper for the <tag>equation</tag> and the
+<tag>equation</tag> contents, it may break some existing CSS
+stylesheets that have been created with the assumption that there
+would never be an intervening DIV there.</para>
+<para>The following is
+an example of what <tag>Equation</tag> output looks like as a
+result of the changes described above.</para>
+<para> &lt;div
+class="<tag>equation</tag>"&gt; &lt;a name="three"
+id="three"&gt;&lt;/a&gt;</para>
+<para> &lt;p
+class="<tag>title</tag>"&gt;&lt;b&gt;(1.3)&lt;/b&gt;&lt;/p&gt;</para>
+<para>
+&lt;div class="equation-contents"&gt; &lt;span
+class="<tag>mathphrase</tag>"&gt;1+1=3&lt;/span&gt;
+&lt;/div&gt; &lt;/div&gt;&lt;br
+class="equation-break"&gt;</para>
+<para>Rationale: These changes allow
+CSS control of the placement of the formal-object
+<tag>title</tag> relative to the formal-object
+contents. For example, using the CSS "float" <tag>property</tag>
+enables the <tag>title</tag> and contents to be rendered on the
+same line. Example stylesheet:</para>
+<para> .<tag>equation</tag>
+{ margin-top: 20px; margin-bottom: 20px; }
+.equation-contents { float: left; }</para>
+<para>
+.<tag>equation</tag> .<tag>title</tag> { margin-top: 0;
+float: right; margin-right: 200px; }</para>
+<para>
+.<tag>equation</tag> .<tag>title</tag> b { font-weight:
+normal; }</para>
+<para> .equation-break { clear: both;
+}</para>
+<para>Note that the purpose of the ".equation-break" class is
+to provide a way to clear off the floats.</para>
+<para>If you want
+to instead have the <tag>equation</tag> <tag>title</tag> rendered to
+the left of the <tag>equation</tag> contents, you can do
+something like this:</para>
+<para> .<tag>equation</tag> {
+margin-top: 20px; width: 300px; margin-bottom: 20px;
+} .equation-contents { float: right; }</para>
+<para>
+.<tag>equation</tag> .<tag>title</tag> { margin-top: 0;
+float: left; margin-right: 200px; }</para>
+<para>
+.<tag>equation</tag> .<tag>title</tag> b { font-weight:
+normal; }</para>
+<para> .equation-break { clear: both;
+}</para>
+<para role="commit-changes">Modified: html/formal.xsl,1.20 - Michael(tm) Smith</para>
+</listitem>
+<listitem role="commit-message">
+<para>Added a chunker.output.quiet
+top-level parameter so that the chunker can be made quiet by
+default</para>
+<para role="commit-changes">Modified: html/chunker.xsl,1.26 - Norman Walsh</para>
+</listitem>
+<listitem role="commit-message">
+<para>Added support for <tag>link</tag>,
+<tag>olink</tag>, and <tag>xref</tag> within OO
+<tag>Classsynopsis</tag> and children. (Because DocBook NG/5
+allows it).</para>
+<para role="commit-changes">Modified: fo/synop.xsl,1.15; html/synop.xsl,1.19 - Michael(tm)
+Smith</para>
+</listitem>
+<listitem role="commit-message">
+<para>New parameter:
+<parameter>id.warnings</parameter>. If non-zero, warnings are
+generated for titled objects that don't have titles. True by default;
+I wonder if this will be too aggressive?</para>
+<para role="commit-changes">Modified: html/biblio.xsl,1.25;
+html/component.xsl,1.27; html/division.xsl,1.11; html/formal.xsl,1.19;
+html/glossary.xsl,1.20; html/html.xsl,1.13; html/index.xsl,1.16;
+html/param.ent,1.88; html/param.xweb,1.97; html/refentry.xsl,1.22;
+html/sections.xsl,1.30; params/id.warnings.xml,1.1 - Norman
+Walsh</para>
+</listitem>
+<listitem role="commit-message">
+<para>If the
+<parameter>keep.relative.image.uris</parameter> parameter is true,
+don't use the absolute <tag>URI</tag> (as calculated from xml:base) in
+the img src attribute, us the value the <tag>author</tag>
+specified. Note that we still have to calculate the absolute
+<tag>filename</tag> for use in the image intrinsics
+extension.</para>
+<para role="commit-changes">Modified: html/graphics.xsl,1.56 - Norman
+Walsh</para>
+</listitem>
+<listitem role="commit-message">
+<para>Support <tag>date</tag> as an
+inline</para>
+<para role="commit-changes">Modified: fo/inline.xsl,1.43; html/inline.xsl,1.46 - Norman
+Walsh</para>
+</listitem>
+<listitem role="commit-message">
+<para>Added new parameter
+<parameter>keep.relative.image.uris</parameter></para>
+<para role="commit-changes">Modified: fo/param.ent,1.91;
+fo/param.xweb,1.104; html/param.ent,1.87; html/param.xweb,1.96;
+params/keep.relative.image.uris.xml,1.1 - Norman
+Walsh</para>
+</listitem>
+<listitem role="commit-message">
+<para>Added two new parameters for
+handling of multi-term
+<tag>varlistentry</tag> elements:</para>
+<para><parameter>variablelist.term.break.after</parameter>:
+When the <parameter>variablelist.term.break.after</parameter> is
+non-zero, it will generate a line break after each
+<tag>term</tag> multi-term
+<tag>varlistentry</tag>.</para>
+<para><parameter>variablelist.term.separator</parameter>:
+When a <tag>varlistentry</tag> contains multiple <tag>term</tag>
+elements, the string specified in the value of the
+<parameter>variablelist.term.separator</parameter> parameter is
+placed after each <tag>term</tag> except the last. The default
+is ", " (a comma followed by a space). To suppress rendering of
+the separator, set the value of
+<parameter>variablelist.term.separator</parameter> to the empty
+string ("").</para>
+<para>These parameters are primarily intended to be
+useful if you have multi-term varlistentries that have long
+terms.</para>
+<para>Closes #1306676. Thanks to Sam Steingold for
+providing an example "lots of long terms" doc that demonstrated
+the value of having these options.</para>
+<para>Also, added
+normalize-space() call to processing of each
+<tag>term</tag>.</para>
+<para>This change affects all output formats
+(HTML, PDF, manpages). The default behavior should pretty much
+remain the same as before, but it is possible (as always) that
+the change may introduce some
+new bugginess.</para>
+<para role="commit-changes">Modified: fo/lists.xsl,1.62; fo/param.ent,1.88;
+fo/param.xweb,1.99; html/lists.xsl,1.48; html/param.ent,1.86;
+html/param.xweb,1.93; manpages/lists.xsl,1.22;
+manpages/param.ent,1.14; manpages/param.xweb,1.16;
+params/variablelist.term.break.after.xml,1.1;
+params/variablelist.term.separator.xml,1.1 - Michael(tm)
+Smith</para>
+</listitem>
+<listitem role="commit-message">
+<para>Added "wrapper-name" param to
+inline.charseq named template, enabling it to output inlines
+other than just "span". <tag>Acronym</tag> and <tag>Abbrev</tag>
+templates now use inline.charseq to output HTML
+"<tag>acronym</tag>" and "abbr" elements (instead of
+"span"). Closes #1305468. Thanks to Sam Steingold for suggesting
+the change.</para>
+<para role="commit-changes">Modified: html/inline.xsl,1.45 - Michael(tm)
+Smith</para>
+</listitem>
+</itemizedlist>
+</sect2><!--end of HTML changes for snapshot_2006-05-15_0803-->
+
+<sect2 xml:id="V1700_Manpages">
+<title>Manpages</title>
+<para>The following changes have been made to the
+ <filename>manpages</filename> code
+ since the 1.69.1 release.</para>
+<itemizedlist>
+<listitem role="commit-message">
+<para>Added the following
+params:</para>
+<para> - man.indent.width (string-valued) -
+man.indent.refsect (boolean) - man.indent.blurbs (boolean)
+- man.indent.lists (boolean) - man.indent.verbatims
+(boolean)</para>
+<para>Note that in earlier snapshots, man.indent.width
+was named man.indentation.default.value and the boolean params
+had names like man.indentation.*.adjust. Also the
+man.indent.blurbs param was called man.indentation.authors.adjust
+(or something).</para>
+<para>The behavior now is: If the value of a
+particular man.indent.* boolean param is non-zero, the
+corresponding contents (refsect*, list items,
+authorblurb/personblurb, vervatims) are displayed with a left
+margin indented by a width equal to the value
+of man.indent.width.</para>
+<para role="commit-changes">Modified: params/man.indent.blurbs.xml,1.1;
+manpages/docbook.xsl,1.74; manpages/info.xsl,1.20;
+manpages/lists.xsl,1.30; manpages/other.xsl,1.20;
+manpages/param.ent,1.22; manpages/param.xweb,1.24;
+manpages/refentry.xsl,1.14; params/man.indent.lists.xml,1.1;
+params/man.indent.refsect.xml,1.1;
+params/man.indent.verbatims.xml,1.1; params/man.indent.width.xml,1.1 -
+Michael(tm) Smith</para>
+</listitem>
+<listitem role="commit-message">
+<para>Added
+man.<tag>table</tag>.footnotes.divider param.</para>
+<para>In each
+<tag>table</tag> that contains footenotes, the string specified
+by the man.<tag>table</tag>.footnotes.divider parameter is output
+before the list of footnotes for the
+<tag>table</tag>.</para>
+<para role="commit-changes">Modified: manpages/docbook.xsl,1.73;
+manpages/links.xsl,1.6; manpages/param.ent,1.21;
+manpages/param.xweb,1.23; params/man.table.footnotes.divider.xml,1.1 -
+Michael(tm) Smith</para>
+</listitem>
+<listitem role="commit-message">
+<para>Added the
+man.output.in.separate.dir,
+man.output.<parameter>base.dir</parameter>,
+and man.output.subdirs.enabled parameters.</para>
+<para>The
+man.output.<parameter>base.dir</parameter> parameter specifies the
+base directory into which man-page files are
+output. The man.output.subdirs.enabled parameter controls whether
+the files are output in subdirectories within the base
+directory.</para>
+<para>The values of the
+man.output.<parameter>base.dir</parameter>
+and man.output.subdirs.enabled parameters are used only if the
+value of man.output.in.separate.dir parameter is non-zero. If the
+value of man.output.in.separate.dir is zero, man-page files are
+not output in a separate
+directory.</para>
+<para role="commit-changes">Modified: manpages/docbook.xsl,1.72; manpages/param.ent,1.20;
+manpages/param.xweb,1.22; params/man.output.base.dir.xml,1.1;
+params/man.output.in.separate.dir.xml,1.1;
+params/man.output.subdirs.enabled.xml,1.1 - Michael(tm)
+Smith</para>
+</listitem>
+<listitem role="commit-message">
+<para>Added
+man.font.<tag>table</tag>.headings and
+man.font.<tag>table</tag>.<tag>title</tag> params, for
+controlling font in <tag>table</tag> headings and
+titles.</para>
+<para role="commit-changes">Modified: manpages/docbook.xsl,1.71; manpages/param.ent,1.19;
+manpages/param.xweb,1.21; params/man.font.table.headings.xml,1.1;
+params/man.font.table.title.xml,1.1 - Michael(tm)
+Smith</para>
+</listitem>
+<listitem role="commit-message">
+<para>Added
+man.font.<tag>funcsynopsisinfo</tag> and
+man.font.<tag>funcprototype</tag> params, for specifying the roff
+font (for example, BI, B, I) for <tag>funcsynopsisinfo</tag> and
+<tag>funcprototype</tag> output.</para>
+<para role="commit-changes">Modified: manpages/block.xsl,1.19;
+manpages/docbook.xsl,1.69; manpages/param.ent,1.18;
+manpages/param.xweb,1.20; manpages/synop.xsl,1.29;
+manpages/table.xsl,1.21; params/man.font.funcprototype.xml,1.1;
+params/man.font.funcsynopsisinfo.xml,1.1 - Michael(tm)
+Smith</para>
+</listitem>
+<listitem role="commit-message">
+<para>Added
+man.<tag>segtitle</tag>.suppress param.</para>
+<para>If the value of
+man.<tag>segtitle</tag>.suppress is non-zero, then display
+of <tag>segtitle</tag> contents is suppressed in
+output.</para>
+<para role="commit-changes">Modified: manpages/docbook.xsl,1.68; manpages/param.ent,1.17;
+manpages/param.xweb,1.19; params/man.segtitle.suppress.xml,1.1 -
+Michael(tm) Smith</para>
+</listitem>
+<listitem role="commit-message">
+<para>Added
+man.output.<parameter>manifest</parameter>.enabled and
+man.output.manifest.<tag>filename</tag> params.</para>
+<para>If
+man.output.<parameter>manifest</parameter>.enabled is non-zero, a list
+of filenames for man pages generated by the stylesheet
+transformation is written to the file named by
+man.output.<parameter>manifest</parameter>.<tag>filename</tag></para>
+<para role="commit-changes">Modified: manpages/docbook.xsl,1.67;
+manpages/other.xsl,1.19; manpages/param.ent,1.16;
+manpages/param.xweb,1.18; params/man.output.manifest.enabled.xml,1.1;
+params/man.output.manifest.filename.xml,1.1;
+tools/make/Makefile.DocBook,1.4 - Michael(tm)
+Smith</para>
+</listitem>
+<listitem role="commit-message">
+<para>Added
+<tag>refentry</tag>.meta.get.quietly param.</para>
+<para>If zero (the
+default), notes and warnings about "missing" markup are generated
+during gathering of <tag>refentry</tag> metadata. If
+non-zero, the metadata is gathered "quietly" -- that is, the
+notes and warnings are suppressed.</para>
+<para>NOTE: If you are
+processing a large amount of <tag>refentry</tag> content, you
+may be able to speed up processing significantly by setting a
+non-zero value for
+<tag>refentry</tag>.meta.get.quietly.</para>
+<para role="commit-changes">Modified: common/refentry.xsl,1.17;
+manpages/param.ent,1.15; manpages/param.xweb,1.17;
+params/refentry.meta.get.quietly.xml,1.1 - Michael(tm)
+Smith</para>
+</listitem>
+<listitem role="commit-message">
+<para>Changed names of all boolean
+indentation params to man.indent.* Also discarded individual
+man.indent.*.value params and switched to just using a common
+man.indent.width param (3n by default).</para>
+<para role="commit-changes">Modified: manpages/docbook.xsl,1.66;
+manpages/info.xsl,1.19; manpages/lists.xsl,1.29;
+manpages/other.xsl,1.18; manpages/refentry.xsl,1.13 - Michael(tm)
+Smith</para>
+</listitem>
+<listitem role="commit-message">
+<para>Added boolean
+man.output.in.separate.dir param, to control whether or not man
+files are output in separate directory.</para>
+<para role="commit-changes">Modified: manpages/docbook.xsl,1.65;
+manpages/utility.xsl,1.14 - Michael(tm) Smith</para>
+</listitem>
+<listitem role="commit-message">
+<para>Added options for controlling
+indentation of verbatim output. Controlled through the
+man.indentation.verbatims.adjust
+and man.indentation.verbatims.value params. Closes
+#1242997</para>
+<para role="commit-changes">Modified: manpages/block.xsl,1.15; manpages/docbook.xsl,1.64 -
+Michael(tm) Smith</para>
+</listitem>
+<listitem role="commit-message">
+<para>Added options for controlling
+indentation in lists and in *blurb output in the AUTHORS
+<tag>section</tag>. Controlled through
+the man.indentation.lists.adjust,
+man.indentation.lists.value, man.indentation.authors.adjust, and
+man.indentation.authors.value parameters. Default is 3 characters
+(instead of the roff default of 8 characters). Closes
+#1449369.</para>
+<para>Also, removed the indent that was being set on
+<tag>informalexample</tag> outuput. I will instead add an option
+for indenting verbatims, which I think is what the
+<tag>informalexample</tag> indent was intended
+for originally.</para>
+<para role="commit-changes">Modified: manpages/block.xsl,1.14;
+manpages/docbook.xsl,1.63; manpages/info.xsl,1.18;
+manpages/lists.xsl,1.28 - Michael(tm) Smith</para>
+</listitem>
+<listitem role="commit-message">
+<para>Changed line-spacing call before
+<tag>synopfragment</tag> to use ".sp -1n" ("n" units specified)
+instead of plain ".sp -1"</para>
+<para role="commit-changes">Modified: manpages/synop.xsl,1.28 - Michael(tm)
+Smith</para>
+</listitem>
+<listitem role="commit-message">
+<para>Added support for writing man
+files into a specific output directory and into appropriate
+subdirectories within that output directory. Controlled through
+the man.<parameter>base.dir</parameter> parameter (similar to the
+<parameter>base.dir</parameter> support in the HTML stylesheet) and
+the man.subdirs.enabled parameter, which automatically determines
+the name of an appropriate subdir (for example, man/man7,
+man/man1, etc.) based on the <tag>section</tag> number/manvolnum
+of the source <tag>Refentry</tag>.</para>
+<para>Closes #1255036 and
+#1170317. Thanks to Denis Bradford for the original feature
+request, and to Costin Stroie for submitting a patch that was
+very helpful in implementing the
+support.</para>
+<para role="commit-changes">Modified: manpages/docbook.xsl,1.62; manpages/utility.xsl,1.13 -
+Michael(tm) Smith</para>
+</listitem>
+<listitem role="commit-message">
+<para>Refined XPath statements and
+notification messages for <tag>refentry</tag> metadata
+handling.</para>
+<para role="commit-changes">Modified: common/common.xsl,1.59; common/refentry.xsl,1.14;
+manpages/docbook.xsl,1.61; manpages/other.xsl,1.17 - Michael(tm)
+Smith</para>
+</listitem>
+<listitem role="commit-message">
+<para>Added support for
+<tag>copyright</tag> and <tag>legalnotice</tag>. The manpages
+stylesheets now output a <tag>COPYRIGHT</tag> <tag>section</tag>,
+after the AUTHORS <tag>section</tag>, if a <tag>copyright</tag>
+or <tag>legalnotice</tag> is found in the source. The
+<tag>section</tag> contains the <tag>copyright</tag> contents followed
+by the <tag>legalnotice</tag> contents. Closes
+#1450209.</para>
+<para role="commit-changes">Modified: manpages/docbook.xsl,1.59; manpages/info.xsl,1.17 -
+Michael(tm) Smith</para>
+</listitem>
+<listitem role="commit-message">
+<para>Drastically reworked all of the
+XPath expressions used in <tag>refentry</tag> metadata gathering
+-- completely removed $parentinfo and turned $info into a set of
+nodes that includes the *info contents of the <tag>Refentry</tag>
+plus the *info contents all all of its ancestor elements. The
+basic XPath expression now used throughout is (using the example
+of checking for a <tag>date</tag>):</para>
+<para>
+(($info[//date])[last()]/date)[1].</para>
+<para>That selects the "last"
+*info/date <tag>date</tag> in document order -- that is, the one
+eitther on the <tag>Refentry</tag> itself or on the
+closest ancestor to the <tag>Refentry</tag>.</para>
+<para>It's
+likely this change may break some things; may need to pick up
+some pieces later.</para>
+<para>Also, changed the default value for the
+<parameter>man.th.extra2.max.length</parameter> from 40 to
+30.</para>
+<para role="commit-changes">Modified: common/common.xsl,1.58; common/refentry.xsl,1.7;
+params/man.th.extra2.max.length.xml,1.2;
+params/refentry.date.profile.xml,1.2;
+params/refentry.manual.profile.xml,1.2;
+params/refentry.source.name.profile.xml,1.2;
+params/refentry.version.profile.xml,1.2; manpages/docbook.xsl,1.58;
+manpages/other.xsl,1.15 - Michael(tm) Smith</para>
+</listitem>
+<listitem role="commit-message">
+<para>Added support for DocBook 5
+namespace-stripping in manpages stylesheet. Closes request
+#1210692.</para>
+<para role="commit-changes">Modified: common/common.xsl,1.56; manpages/docbook.xsl,1.57 -
+Michael(tm) Smith</para>
+</listitem>
+<listitem role="commit-message">
+<para>Fixed handling of <tag>table</tag>
+footnotes. With this checkin, the <tag>table</tag> support in the
+manpages stylesheet is now basically feature complete. So this
+change closes request #619532, "No support for tables" -- the
+oldest currently open manpages feature request, submitted by Ben
+Secrest (blsecres) on 2002-10-07. Congratulations to me [patting
+myself on the back].</para>
+<para role="commit-changes">Modified: manpages/block.xsl,1.11;
+manpages/docbook.xsl,1.55; manpages/table.xsl,1.15 - Michael(tm)
+Smith</para>
+</listitem>
+<listitem role="commit-message">
+<para>Added handling for
+<tag>table</tag> titles. Also fixed handling of nested tables;
+nest tables are now "extracted" and displayed just after their
+parent tables.</para>
+<para role="commit-changes">Modified: manpages/docbook.xsl,1.54; manpages/table.xsl,1.14
+- Michael(tm) Smith</para>
+</listitem>
+<listitem role="commit-message">
+<para>Added option for turning off bold
+formatting in <tag>Funcsynopsis</tag>. Boldface formatting in
+<tag>function</tag> <tag>synopsis</tag> is mandated in the
+man(7) man page and is used almost universally in existing man
+pages. Despite that, it really does look like crap to have an
+entire <tag>Funcsynopsis</tag> output in bold, so I added params
+for turning off the bold formatting and/or replacing it with a
+different roff special font (e.g., "RI" for alternating
+roman/italic instead of the default "BI" for alternating
+bold/italic). The new params
+are "man.<tag>funcprototype</tag>.font" and
+"man.<tag>funcsynopsisinfo</tag>.font". To be documented
+later.</para>
+<para>Closes #1452247. Thanks to Joe Orton for the feature
+request.</para>
+<para role="commit-changes">Modified: params/man.string.subst.map.xml,1.16;
+manpages/block.xsl,1.10; manpages/docbook.xsl,1.51;
+manpages/inline.xsl,1.16; manpages/synop.xsl,1.27 - Michael(tm)
+Smith</para>
+</listitem>
+<listitem role="commit-message">
+<para>Use AUTHORS instead of
+<tag>AUTHOR</tag> if we have multiple people to attribute. Also,
+fixed checking such that we generate
+<tag>author</tag> <tag>section</tag> even if we don't have an
+<tag>author</tag> (as long as there is at least one other
+person/entity we can put in the
+<tag>section</tag>). Also adjusted assembly of content for
+<tag>Author</tag> metainfo field such that we now not only use
+<tag>author</tag>, but try to find a "best match" if we can't
+find an <tag>author</tag> name to put there.</para>
+<para>Closes
+#1233592. Thanks to Sam Steingold for the
+request.</para>
+<para role="commit-changes">Modified: manpages/info.xsl,1.12 - Michael(tm)
+Smith</para>
+</listitem>
+<listitem role="commit-message">
+<para>Changes for request #1243027,
+"Impove handling of <tag>AUTHOR</tag> <tag>section</tag>." This
+adds support for <tag>Collab</tag>, Corpauthor, Corpcredt,
+<tag>Orgname</tag>, <tag>Publishername</tag>, and
+<tag>Publisher</tag>. Also adds support for output
+of <tag>Affiliation</tag> and its children, and support for using
+gentext strings for auto-attributing roles (<tag>Author</tag>,
+<tag>Editor</tag>, <tag>Publisher</tag>, Translator, etc.). Also
+did a lot of code cleanup and modularization of all the
+<tag>AUTHOR</tag> handling code. And fixed a bug that was causing
+<tag>Author</tag> <tag>info</tag> to not be picked up correctly
+for metainfo comment we embed in man-page
+source.</para>
+<para role="commit-changes">Modified: manpages/info.xsl,1.11 - Michael(tm)
+Smith</para>
+</listitem>
+<listitem role="commit-message">
+<para>Support bold output for
+"<tag>emphasis</tag> remap='B'". (because Eric Raymond's
+doclifter(1) tool converts groff source marked up with ".B"
+request or "\fB" escapes to DocBook "<tag>emphasis</tag>
+remap='B'".)</para>
+<para role="commit-changes">Modified: manpages/inline.xsl,1.14 - Michael(tm)
+Smith</para>
+</listitem>
+<listitem role="commit-message">
+<para>Added support for
+<tag>Segmentedlist</tag>. Details: Output is tabular, with no
+option for "list" type output. Output for <tag>Segtitle</tag>
+elements can be supressed by
+setting man.<tag>segtitle</tag>.suppress. If <tag>Segtitle</tag>
+content is output, it is rendered in italic type (not bold
+because not all terminals support bold and so italic ensures the
+stand out on those terminals). Extra space (.sp line) at end of
+<tag>table</tag> code ensures that it gets handled correctly in
+the case where its source is the child of a <tag>Para</tag>.
+Closes feature-request #1400097. Thanks to Daniel Leidert for the
+patch and push, and to Alastair Rankine for filing the original
+feature request.</para>
+<para role="commit-changes">Modified: manpages/lists.xsl,1.23;
+manpages/utility.xsl,1.10 - Michael(tm) Smith</para>
+</listitem>
+<listitem role="commit-message">
+<para>Improved handling or
+Author/Editor/Othercredit.</para>
+<para>Reworked content of
+(non-visible) comment added at top of each page (metadata
+stuff).</para>
+<para>Added support for generating a
+<parameter>manifest</parameter> file (useful for cleaning up
+after builds, etc.)</para>
+<para role="commit-changes">Modified: manpages/docbook.xsl,1.46;
+manpages/info.xsl,1.9; manpages/other.xsl,1.12;
+manpages/utility.xsl,1.6 - Michael(tm) Smith</para>
+</listitem>
+<listitem role="commit-message">
+<para>Added two new parameters for
+handling of multi-term
+<tag>varlistentry</tag> elements:</para>
+<para><parameter>variablelist.term.break.after</parameter>:
+When the <parameter>variablelist.term.break.after</parameter> is
+non-zero, it will generate a line break after each
+<tag>term</tag> multi-term
+<tag>varlistentry</tag>.</para>
+<para><parameter>variablelist.term.separator</parameter>:
+When a <tag>varlistentry</tag> contains multiple <tag>term</tag>
+elements, the string specified in the value of the
+<parameter>variablelist.term.separator</parameter> parameter is
+placed after each <tag>term</tag> except the last. The default
+is ", " (a comma followed by a space). To suppress rendering of
+the separator, set the value of
+<parameter>variablelist.term.separator</parameter> to the empty
+string ("").</para>
+<para>These parameters are primarily intended to be
+useful if you have multi-term varlistentries that have long
+terms.</para>
+<para>Closes #1306676. Thanks to Sam Steingold for
+providing an example "lots of long terms" doc that demonstrated
+the value of having these options.</para>
+<para>Also, added
+normalize-space() call to processing of each
+<tag>term</tag>.</para>
+<para>This change affects all output formats
+(HTML, PDF, manpages). The default behavior should pretty much
+remain the same as before, but it is possible (as always) that
+the change may introduce some
+new bugginess.</para>
+<para role="commit-changes">Modified: fo/lists.xsl,1.62; fo/param.ent,1.88;
+fo/param.xweb,1.99; html/lists.xsl,1.48; html/param.ent,1.86;
+html/param.xweb,1.93; manpages/lists.xsl,1.22;
+manpages/param.ent,1.14; manpages/param.xweb,1.16;
+params/variablelist.term.break.after.xml,1.1;
+params/variablelist.term.separator.xml,1.1 - Michael(tm)
+Smith</para>
+</listitem>
+</itemizedlist>
+</sect2><!--end of Manpages changes for snapshot_2006-05-15_0803-->
+
+<sect2 xml:id="V1700_Params">
+<title>Params</title>
+<para>The following changes have been made to the
+ <filename>params</filename> code
+ since the 1.69.1 release.</para>
+<itemizedlist>
+<listitem role="commit-message">
+<para>New parameters to set
+header/footer <tag>table</tag> minimum
+height.</para>
+<para role="commit-changes">Modified: params/footer.table.height.xml,1.1;
+params/header.table.height.xml,1.1 - Robert
+Stayton</para>
+</listitem>
+<listitem role="commit-message">
+<para>Support multiple indexing methods
+for different languages.</para>
+<para role="commit-changes">Modified: params/index.method.xml,1.1 - Robert
+Stayton</para>
+</listitem>
+<listitem role="commit-message">
+<para>Remove <tag>qandaset</tag> and
+<tag>qandadiv</tag> from <parameter>generate.toc</parameter> for fo
+output because formerly it wasn't working, but now it is and
+the default behavior should stay the
+same.</para>
+<para role="commit-changes">Modified: params/generate.toc.xml,1.8 - Robert
+Stayton</para>
+</listitem>
+<listitem role="commit-message">
+<para>add support for page number
+references to <tag>link</tag> element
+too.</para>
+<para role="commit-changes">Modified: params/insert.link.page.number.xml,1.1 - Robert
+Stayton</para>
+</listitem>
+<listitem role="commit-message">
+<para>Add support for more characters to
+hyphen on when <parameter>ulink.hyphenate</parameter> is turned
+on.</para>
+<para role="commit-changes">Modified: params/ulink.hyphenate.chars.xml,1.1;
+params/ulink.hyphenate.xml,1.3 - Robert Stayton</para>
+</listitem>
+<listitem role="commit-message">
+<para>New attribute-set to format
+<tag>biblioentry</tag> and
+<tag>bibliomixed</tag>.</para>
+<para role="commit-changes">Modified: params/biblioentry.properties.xml,1.1 -
+Robert Stayton</para>
+</listitem>
+<listitem role="commit-message">
+<para>Added new parameter
+<parameter>chunk.tocs.and.lots</parameter>.has.<tag>title</tag> which
+controls presence of <tag>title</tag> in a separate chunk with
+ToC/LoT. Disabling <tag>title</tag> can be very useful if you are
+generating frameset output (well, yes those frames, but some customers
+really want them ;-).</para>
+<para role="commit-changes">Modified: html/chunk-code.xsl,1.15;
+html/param.ent,1.93; html/param.xweb,1.102;
+params/chunk.tocs.and.lots.has.title.xml,1.1 - Jirka
+Kosek</para>
+</listitem>
+<listitem role="commit-message">
+<para>Added new attribute set
+<tag>toc</tag>.line.properties for controlling appearance of lines in
+ToC/LoT</para>
+<para role="commit-changes">Modified: params/toc.line.properties.xml,1.1 - Jirka
+Kosek</para>
+</listitem>
+<listitem role="commit-message">
+<para>Allow <tag>table</tag> footnotes
+to have different properties from regular
+footnotes.</para>
+<para role="commit-changes">Modified: params/table.footnote.properties.xml,1.1 - Robert
+Stayton</para>
+</listitem>
+<listitem role="commit-message">
+<para>Set properties for pgwide="1"
+objects.</para>
+<para role="commit-changes">Modified: params/pgwide.properties.xml,1.1 - Robert
+Stayton</para>
+</listitem>
+<listitem role="commit-message">
+<para>Added the
+autotoc.<tag>label</tag>.in.hyperlink param.</para>
+<para>If the value
+of autotoc.<tag>label</tag>.in.hyperlink is non-zero, labels
+are included in hyperlinked titles in the <tag>TOC</tag>. If it
+is instead zero, labels are still displayed prior to the
+hyperlinked titles, but are not hyperlinked along with the
+titles.</para>
+<para>Closes patch #1065868. Thanks to anatoly techtonik
+for the patch.</para>
+<para role="commit-changes">Modified: html/autotoc.xsl,1.36; html/param.ent,1.92;
+html/param.xweb,1.101; params/autotoc.label.in.hyperlink.xml,1.1 -
+Michael(tm) Smith</para>
+</listitem>
+<listitem role="commit-message">
+<para>Added two new params:
+html.head.<tag>legalnotice</tag>.<tag>link</tag>.types
+and html.head.<tag>legalnotice</tag>.<tag>link</tag>.multiple.</para>
+<para>If
+the value of the <parameter>generate.legalnotice.link</parameter> is
+non-zero, then the stylesheet generates (in the head
+<tag>section</tag> of the HTML source) either a single HTML
+<tag>link</tag> element or, if the value of
+the html.head.<tag>legalnotice</tag>.<tag>link</tag>.multiple is
+non-zero, one <tag>link</tag> element for each <tag>link</tag>
+type specified. Each <tag>link</tag> has the
+following attributes:</para>
+<para> - a rel attribute whose value
+is derived from the value of
+html.head.<tag>legalnotice</tag>.<tag>link</tag>.types</para>
+<para> -
+an href attribute whose value is set to the URL of the file
+containing the <tag>legalnotice</tag></para>
+<para> - a <tag>title</tag>
+attribute whose value is set to the <tag>title</tag> of the
+corresponding <tag>legalnotice</tag> (or a <tag>title</tag>
+programatically determined by the stylesheet)</para>
+<para>For
+example:</para>
+<para> &lt;<tag>link</tag> rel="<tag>copyright</tag>"
+href="ln-id2524073.html" title="Legal Notice"&gt;</para>
+<para>Closes
+#1476450. Thanks to Sam Steingold.</para>
+<para role="commit-changes">Modified: html/chunk-common.xsl,1.45;
+html/param.ent,1.91; html/param.xweb,1.100;
+params/generate.legalnotice.link.xml,1.4;
+params/html.head.legalnotice.link.multiple.xml,1.1;
+params/html.head.legalnotice.link.types.xml,1.1 - Michael(tm)
+Smith</para>
+</listitem>
+<listitem role="commit-message">
+<para>Added the following
+params:</para>
+<para> - man.indent.width (string-valued) -
+man.indent.refsect (boolean) - man.indent.blurbs (boolean)
+- man.indent.lists (boolean) - man.indent.verbatims
+(boolean)</para>
+<para>Note that in earlier snapshots, man.indent.width
+was named man.indentation.default.value and the boolean params
+had names like man.indentation.*.adjust. Also the
+man.indent.blurbs param was called man.indentation.authors.adjust
+(or something).</para>
+<para>The behavior now is: If the value of a
+particular man.indent.* boolean param is non-zero, the
+corresponding contents (refsect*, list items,
+authorblurb/personblurb, vervatims) are displayed with a left
+margin indented by a width equal to the value
+of man.indent.width.</para>
+<para role="commit-changes">Modified: params/man.indent.blurbs.xml,1.1;
+manpages/docbook.xsl,1.74; manpages/info.xsl,1.20;
+manpages/lists.xsl,1.30; manpages/other.xsl,1.20;
+manpages/param.ent,1.22; manpages/param.xweb,1.24;
+manpages/refentry.xsl,1.14; params/man.indent.lists.xml,1.1;
+params/man.indent.refsect.xml,1.1;
+params/man.indent.verbatims.xml,1.1; params/man.indent.width.xml,1.1 -
+Michael(tm) Smith</para>
+</listitem>
+<listitem role="commit-message">
+<para>Added
+man.<tag>table</tag>.footnotes.divider param.</para>
+<para>In each
+<tag>table</tag> that contains footenotes, the string specified
+by the man.<tag>table</tag>.footnotes.divider parameter is output
+before the list of footnotes for the
+<tag>table</tag>.</para>
+<para role="commit-changes">Modified: manpages/docbook.xsl,1.73;
+manpages/links.xsl,1.6; manpages/param.ent,1.21;
+manpages/param.xweb,1.23; params/man.table.footnotes.divider.xml,1.1 -
+Michael(tm) Smith</para>
+</listitem>
+<listitem role="commit-message">
+<para>Added the
+man.output.in.separate.dir,
+man.output.<parameter>base.dir</parameter>,
+and man.output.subdirs.enabled parameters.</para>
+<para>The
+man.output.<parameter>base.dir</parameter> parameter specifies the
+base directory into which man-page files are
+output. The man.output.subdirs.enabled parameter controls whether
+the files are output in subdirectories within the base
+directory.</para>
+<para>The values of the
+man.output.<parameter>base.dir</parameter>
+and man.output.subdirs.enabled parameters are used only if the
+value of man.output.in.separate.dir parameter is non-zero. If the
+value of man.output.in.separate.dir is zero, man-page files are
+not output in a separate
+directory.</para>
+<para role="commit-changes">Modified: manpages/docbook.xsl,1.72; manpages/param.ent,1.20;
+manpages/param.xweb,1.22; params/man.output.base.dir.xml,1.1;
+params/man.output.in.separate.dir.xml,1.1;
+params/man.output.subdirs.enabled.xml,1.1 - Michael(tm)
+Smith</para>
+</listitem>
+<listitem role="commit-message">
+<para>Added
+man.font.<tag>table</tag>.headings and
+man.font.<tag>table</tag>.<tag>title</tag> params, for
+controlling font in <tag>table</tag> headings and
+titles.</para>
+<para role="commit-changes">Modified: manpages/docbook.xsl,1.71; manpages/param.ent,1.19;
+manpages/param.xweb,1.21; params/man.font.table.headings.xml,1.1;
+params/man.font.table.title.xml,1.1 - Michael(tm)
+Smith</para>
+</listitem>
+<listitem role="commit-message">
+<para>Added
+man.font.<tag>funcsynopsisinfo</tag> and
+man.font.<tag>funcprototype</tag> params, for specifying the roff
+font (for example, BI, B, I) for <tag>funcsynopsisinfo</tag> and
+<tag>funcprototype</tag> output.</para>
+<para role="commit-changes">Modified: manpages/block.xsl,1.19;
+manpages/docbook.xsl,1.69; manpages/param.ent,1.18;
+manpages/param.xweb,1.20; manpages/synop.xsl,1.29;
+manpages/table.xsl,1.21; params/man.font.funcprototype.xml,1.1;
+params/man.font.funcsynopsisinfo.xml,1.1 - Michael(tm)
+Smith</para>
+</listitem>
+<listitem role="commit-message">
+<para>Changed to select="0" in
+<tag>refclass</tag>.suppress (instead of
+..&gt;0&lt;/..)</para>
+<para role="commit-changes">Modified: params/refclass.suppress.xml,1.3 - Michael(tm)
+Smith</para>
+</listitem>
+<listitem role="commit-message">
+<para>Added
+man.<tag>segtitle</tag>.suppress param.</para>
+<para>If the value of
+man.<tag>segtitle</tag>.suppress is non-zero, then display
+of <tag>segtitle</tag> contents is suppressed in
+output.</para>
+<para role="commit-changes">Modified: manpages/docbook.xsl,1.68; manpages/param.ent,1.17;
+manpages/param.xweb,1.19; params/man.segtitle.suppress.xml,1.1 -
+Michael(tm) Smith</para>
+</listitem>
+<listitem role="commit-message">
+<para>Added
+man.output.<parameter>manifest</parameter>.enabled and
+man.output.manifest.<tag>filename</tag> params.</para>
+<para>If
+man.output.<parameter>manifest</parameter>.enabled is non-zero, a list
+of filenames for man pages generated by the stylesheet
+transformation is written to the file named by
+man.output.<parameter>manifest</parameter>.<tag>filename</tag></para>
+<para role="commit-changes">Modified: manpages/docbook.xsl,1.67;
+manpages/other.xsl,1.19; manpages/param.ent,1.16;
+manpages/param.xweb,1.18; params/man.output.manifest.enabled.xml,1.1;
+params/man.output.manifest.filename.xml,1.1;
+tools/make/Makefile.DocBook,1.4 - Michael(tm)
+Smith</para>
+</listitem>
+<listitem role="commit-message">
+<para>Added <tag>refclass</tag>.suppress
+param.</para>
+<para>If the value of <tag>refclass</tag>.suppress is
+non-zero, then display <tag>refclass</tag> contents is suppressed
+in output. Affects HTML and FO output
+only.</para>
+<para role="commit-changes">Modified: fo/param.ent,1.93; fo/param.xweb,1.106; html/param.ent,1.90;
+html/param.xweb,1.99; params/refclass.suppress.xml,1.1 - Michael(tm)
+Smith</para>
+</listitem>
+<listitem role="commit-message">
+<para>Added
+<tag>refentry</tag>.meta.get.quietly param.</para>
+<para>If zero (the
+default), notes and warnings about "missing" markup are generated
+during gathering of <tag>refentry</tag> metadata. If
+non-zero, the metadata is gathered "quietly" -- that is, the
+notes and warnings are suppressed.</para>
+<para>NOTE: If you are
+processing a large amount of <tag>refentry</tag> content, you
+may be able to speed up processing significantly by setting a
+non-zero value for
+<tag>refentry</tag>.meta.get.quietly.</para>
+<para role="commit-changes">Modified: common/refentry.xsl,1.17;
+manpages/param.ent,1.15; manpages/param.xweb,1.17;
+params/refentry.meta.get.quietly.xml,1.1 - Michael(tm)
+Smith</para>
+</listitem>
+<listitem role="commit-message">
+<para>Added support for "software" and
+"sectdesc" class values on <tag>refmiscinfo</tag>; "software" is
+treated identically to "source", and "setdesc" is treated
+identically to "manual".</para>
+<para role="commit-changes">Modified: common/refentry.xsl,1.10;
+params/man.th.extra2.max.length.xml,1.3;
+params/refentry.source.name.profile.xml,1.4 - Michael(tm)
+Smith</para>
+</listitem>
+<listitem role="commit-message">
+<para>Drastically reworked all of the
+XPath expressions used in <tag>refentry</tag> metadata gathering
+-- completely removed $parentinfo and turned $info into a set of
+nodes that includes the *info contents of the <tag>Refentry</tag>
+plus the *info contents all all of its ancestor elements. The
+basic XPath expression now used throughout is (using the example
+of checking for a <tag>date</tag>):</para>
+<para>
+(($info[//date])[last()]/date)[1].</para>
+<para>That selects the "last"
+*info/date <tag>date</tag> in document order -- that is, the one
+eitther on the <tag>Refentry</tag> itself or on the
+closest ancestor to the <tag>Refentry</tag>.</para>
+<para>It's
+likely this change may break some things; may need to pick up
+some pieces later.</para>
+<para>Also, changed the default value for the
+<parameter>man.th.extra2.max.length</parameter> from 40 to
+30.</para>
+<para role="commit-changes">Modified: common/common.xsl,1.58; common/refentry.xsl,1.7;
+params/man.th.extra2.max.length.xml,1.2;
+params/refentry.date.profile.xml,1.2;
+params/refentry.manual.profile.xml,1.2;
+params/refentry.source.name.profile.xml,1.2;
+params/refentry.version.profile.xml,1.2; manpages/docbook.xsl,1.58;
+manpages/other.xsl,1.15 - Michael(tm) Smith</para>
+</listitem>
+<listitem role="commit-message">
+<para>Added option for turning off bold
+formatting in <tag>Funcsynopsis</tag>. Boldface formatting in
+<tag>function</tag> <tag>synopsis</tag> is mandated in the
+man(7) man page and is used almost universally in existing man
+pages. Despite that, it really does look like crap to have an
+entire <tag>Funcsynopsis</tag> output in bold, so I added params
+for turning off the bold formatting and/or replacing it with a
+different roff special font (e.g., "RI" for alternating
+roman/italic instead of the default "BI" for alternating
+bold/italic). The new params
+are "man.<tag>funcprototype</tag>.font" and
+"man.<tag>funcsynopsisinfo</tag>.font". To be documented
+later.</para>
+<para>Closes #1452247. Thanks to Joe Orton for the feature
+request.</para>
+<para role="commit-changes">Modified: params/man.string.subst.map.xml,1.16;
+manpages/block.xsl,1.10; manpages/docbook.xsl,1.51;
+manpages/inline.xsl,1.16; manpages/synop.xsl,1.27 - Michael(tm)
+Smith</para>
+</listitem>
+<listitem role="commit-message">
+<para><parameter>fop.extensions</parameter> now only
+for FOP version 0.20.5 and earlier.</para>
+<para role="commit-changes">Modified: params/fop.extensions.xml,1.4
+- Robert Stayton</para>
+</listitem>
+<listitem role="commit-message">
+<para>Support for fop1 different from
+fop 0.20.5 and earlier.</para>
+<para role="commit-changes">Modified: params/fop1.extensions.xml,1.1 - Robert
+Stayton</para>
+</listitem>
+<listitem role="commit-message">
+<para>Reset default value to empty
+string so template uses gentext first, then the parameter value
+if not empty.</para>
+<para role="commit-changes">Modified: params/index.number.separator.xml,1.2;
+params/index.range.separator.xml,1.2;
+params/index.term.separator.xml,1.2 - Robert
+Stayton</para>
+</listitem>
+<listitem role="commit-message">
+<para>New parameter:
+<parameter>id.warnings</parameter>. If non-zero, warnings are
+generated for titled objects that don't have titles. True by default;
+I wonder if this will be too aggressive?</para>
+<para role="commit-changes">Modified: html/biblio.xsl,1.25;
+html/component.xsl,1.27; html/division.xsl,1.11; html/formal.xsl,1.19;
+html/glossary.xsl,1.20; html/html.xsl,1.13; html/index.xsl,1.16;
+html/param.ent,1.88; html/param.xweb,1.97; html/refentry.xsl,1.22;
+html/sections.xsl,1.30; params/id.warnings.xml,1.1 - Norman
+Walsh</para>
+</listitem>
+<listitem role="commit-message">
+<para>Added new parameter
+<parameter>keep.relative.image.uris</parameter></para>
+<para role="commit-changes">Modified: fo/param.ent,1.91;
+fo/param.xweb,1.104; html/param.ent,1.87; html/param.xweb,1.96;
+params/keep.relative.image.uris.xml,1.1 - Norman
+Walsh</para>
+</listitem>
+<listitem role="commit-message">
+<para>Support default <tag>label</tag>
+width parameters for itemized and ordered lists</para>
+<para role="commit-changes">Modified: fo/lists.xsl,1.64;
+fo/param.ent,1.90; fo/param.xweb,1.103;
+params/itemizedlist.label.width.xml,1.1;
+params/orderedlist.label.width.xml,1.1 - Norman
+Walsh</para>
+</listitem>
+<listitem role="commit-message">
+<para>Added parameters to localize
+punctuation in indexes.</para>
+<para role="commit-changes">Modified: params/index.number.separator.xml,1.1;
+params/index.range.separator.xml,1.1;
+params/index.term.separator.xml,1.1 - Robert
+Stayton</para>
+</listitem>
+<listitem role="commit-message">
+<para>Added two new parameters for
+handling of multi-term
+<tag>varlistentry</tag> elements:</para>
+<para><parameter>variablelist.term.break.after</parameter>:
+When the <parameter>variablelist.term.break.after</parameter> is
+non-zero, it will generate a line break after each
+<tag>term</tag> multi-term
+<tag>varlistentry</tag>.</para>
+<para><parameter>variablelist.term.separator</parameter>:
+When a <tag>varlistentry</tag> contains multiple <tag>term</tag>
+elements, the string specified in the value of the
+<parameter>variablelist.term.separator</parameter> parameter is
+placed after each <tag>term</tag> except the last. The default
+is ", " (a comma followed by a space). To suppress rendering of
+the separator, set the value of
+<parameter>variablelist.term.separator</parameter> to the empty
+string ("").</para>
+<para>These parameters are primarily intended to be
+useful if you have multi-term varlistentries that have long
+terms.</para>
+<para>Closes #1306676. Thanks to Sam Steingold for
+providing an example "lots of long terms" doc that demonstrated
+the value of having these options.</para>
+<para>Also, added
+normalize-space() call to processing of each
+<tag>term</tag>.</para>
+<para>This change affects all output formats
+(HTML, PDF, manpages). The default behavior should pretty much
+remain the same as before, but it is possible (as always) that
+the change may introduce some
+new bugginess.</para>
+<para role="commit-changes">Modified: fo/lists.xsl,1.62; fo/param.ent,1.88;
+fo/param.xweb,1.99; html/lists.xsl,1.48; html/param.ent,1.86;
+html/param.xweb,1.93; manpages/lists.xsl,1.22;
+manpages/param.ent,1.14; manpages/param.xweb,1.16;
+params/variablelist.term.break.after.xml,1.1;
+params/variablelist.term.separator.xml,1.1 - Michael(tm)
+Smith</para>
+</listitem>
+<listitem role="commit-message">
+<para>Convert 'no' to string in default
+value.</para>
+<para role="commit-changes">Modified: params/olink.doctitle.xml,1.4 - Robert
+Stayton</para>
+</listitem>
+<listitem role="commit-message">
+<para>Implemented RFE
+#1292615.</para>
+<para>Added bunch of new parameters (attribute sets)
+that affect list presentation: list.block.properties,
+<tag>itemizedlist</tag>.properties, <tag>orderedlist</tag>.properties,
+<tag>itemizedlist</tag>.<tag>label</tag>.properties and
+<tag>orderedlist</tag>.<tag>label</tag>.properties. Default behaviour
+of stylesheets has not been changed but further customizations will be
+much more easier.</para>
+<para role="commit-changes">Modified: fo/lists.xsl,1.61; fo/param.ent,1.87;
+fo/param.xweb,1.98; params/itemizedlist.label.properties.xml,1.1;
+params/itemizedlist.properties.xml,1.1;
+params/list.block.properties.xml,1.1;
+params/orderedlist.label.properties.xml,1.1;
+params/orderedlist.properties.xml,1.1 - Jirka
+Kosek</para>
+</listitem>
+<listitem role="commit-message">
+<para>Implemented RFE
+#1242092.</para>
+<para>You can enable crop marks in your document by
+setting crop.marks=1 and xep.extensions=1. Appearance of crop
+marks can be controlled by parameters
+<parameter>crop.mark.bleed</parameter> (6pt),
+<parameter>crop.mark.offset</parameter> (24pt) and
+<parameter>crop.mark.width</parameter> (0.5pt).</para>
+<para>Also there
+is new named template called user-xep-pis. You can overwrite it in
+order to produce some PIs that can control XEP as described in
+http://www.renderx.com/reference.html#Output_Formats</para>
+<para role="commit-changes">Modified: fo/docbook.xsl,1.36;
+fo/param.ent,1.86; fo/param.xweb,1.97; fo/xep.xsl,1.23;
+params/crop.mark.bleed.xml,1.1; params/crop.mark.offset.xml,1.1;
+params/crop.mark.width.xml,1.1; params/crop.marks.xml,1.1 - Jirka
+Kosek</para>
+</listitem>
+<listitem role="commit-message">
+<para>Changed short descriptions in doc
+for *autolabel* params to match new autolabel
+behavior.</para>
+<para role="commit-changes">Modified: params/appendix.autolabel.xml,1.5;
+params/chapter.autolabel.xml,1.4; params/part.autolabel.xml,1.5;
+params/preface.autolabel.xml,1.4 - Michael(tm)
+Smith</para>
+</listitem>
+</itemizedlist>
+</sect2><!--end of Params changes for snapshot_2006-05-15_0803-->
+
+<sect2 xml:id="V1700_Profiling">
+<title>Profiling</title>
+<para>The following changes have been made to the
+ <filename>profiling</filename> code
+ since the 1.69.1 release.</para>
+<itemizedlist>
+<listitem role="commit-message">
+<para>Profiling now works together with
+namespace stripping (V5 documents). Namespace striping should work
+with all stylesheets named profile-, even if they are not supporting
+namespace stripping in a non-profiling
+variant.</para>
+<para role="commit-changes">Modified: profiling/profile-mode.xsl,1.4;
+profiling/xsl2profile.xsl,1.7 - Jirka Kosek</para>
+</listitem>
+<listitem role="commit-message">
+<para>Moved profiling stage out of
+templates. This make possible to reuse profiled content by several
+templates and still maintaing node indentity (needed for example for
+HTML Help where content is processed multiple times).</para>
+<para>I
+don't know why this was not on the top level before. Maybe some XSLT
+processors choked on it. I hope this will be OK
+now.</para>
+<para role="commit-changes">Modified: profiling/xsl2profile.xsl,1.5 - Jirka
+Kosek</para>
+</listitem>
+</itemizedlist>
+</sect2><!--end of Profiling changes for snapshot_2006-05-15_0803-->
+
+<sect2 xml:id="V1700_Tools">
+<title>Tools</title>
+<para>The following changes have been made to the
+ <filename>tools</filename> code
+ since the 1.69.1 release.</para>
+<itemizedlist>
+<listitem role="commit-message">
+<para>Moved Makefile.DocBook from
+<tag>contrib</tag> module to xsl
+module.</para>
+<para role="commit-changes">Modified: tools/make/Makefile.DocBook,1.1 - Michael(tm)
+Smith</para>
+</listitem>
+</itemizedlist>
+</sect2><!--end of Tools changes for snapshot_2006-05-15_0803-->
+
+<sect2 xml:id="V1700_WordML">
+<title>WordML</title>
+<para>The following changes have been made to the
+ <filename>wordml</filename> code
+ since the 1.69.1 release.</para>
+<itemizedlist>
+<listitem role="commit-message">
+<para>added <tag>contrib</tag> element,
+better handling of default paragraph
+style</para>
+<para role="commit-changes">Modified: wordml/pages-normalise.xsl,1.6; wordml/supported.xml,1.2;
+wordml/wordml-final.xsl,1.14 - Steve Ball</para>
+</listitem>
+<listitem role="commit-message">
+<para>added
+<tag>bridgehead</tag></para>
+<para role="commit-changes">Modified: wordml/docbook-pages.xsl,1.6;
+wordml/docbook.xsl,1.17; wordml/pages-normalise.xsl,1.5;
+wordml/template-pages.xml,1.7; wordml/template.dot,1.4;
+wordml/template.xml,1.14; wordml/wordml-final.xsl,1.13 - Steve
+Ball</para>
+</listitem>
+<listitem role="commit-message">
+<para>added blocks stylesheet to support
+bibliographies, glossaries and qandasets</para>
+<para role="commit-changes">Modified: wordml/Makefile,1.4;
+wordml/README,1.3; wordml/blocks-spec.xml,1.1;
+wordml/docbook-pages.xsl,1.5; wordml/docbook.xsl,1.16;
+wordml/pages-normalise.xsl,1.4; wordml/sections-spec.xml,1.3;
+wordml/specifications.xml,1.13; wordml/template-pages.xml,1.6;
+wordml/template.dot,1.3; wordml/template.xml,1.13;
+wordml/wordml-blocks.xsl,1.1; wordml/wordml-final.xsl,1.12;
+wordml/wordml-sections.xsl,1.3 - Steve Ball</para>
+</listitem>
+<listitem role="commit-message">
+<para>added <tag>mediaobject</tag>
+<tag>caption</tag></para>
+<para role="commit-changes">Modified: wordml/docbook-pages.xsl,1.4;
+wordml/docbook.xsl,1.15; wordml/specifications.xml,1.12;
+wordml/template-pages.xml,1.5; wordml/template.dot,1.2;
+wordml/template.xml,1.12; wordml/wordml-final.xsl,1.11 - Steve
+Ball</para>
+</listitem>
+<listitem role="commit-message">
+<para>added
+callouts</para>
+<para role="commit-changes">Modified: wordml/docbook-pages.xsl,1.3; wordml/docbook.xsl,1.14;
+wordml/pages-normalise.xsl,1.3; wordml/specifications.xml,1.11;
+wordml/template-pages.xml,1.4; wordml/wordml-final.xsl,1.10 - Steve
+Ball</para>
+</listitem>
+<listitem role="commit-message">
+<para>added Word template
+file</para>
+<para role="commit-changes">Modified: wordml/template.dot,1.1 - Steve Ball</para>
+</listitem>
+<listitem role="commit-message">
+<para>added <tag>abstract</tag>, fixed
+<tag>itemizedlist</tag>, ulink</para>
+<para role="commit-changes">Modified: wordml/specifications.xml,1.10;
+wordml/wordml-final.xsl,1.9 - Steve Ball</para>
+</listitem>
+<listitem role="commit-message">
+<para>fixed Makefile added many
+features to Pages support added <tag>revhistory</tag>, inlines,
+highlights, <tag>abstract</tag></para>
+<para role="commit-changes">Modified: wordml/Makefile,1.2;
+wordml/docbook-pages.xsl,1.2; wordml/pages-normalise.xsl,1.2;
+wordml/sections-spec.xml,1.2; wordml/specifications.xml,1.9;
+wordml/template-pages.xml,1.3; wordml/template.xml,1.11;
+wordml/wordml-final.xsl,1.8; wordml/wordml-sections.xsl,1.2 - Steve
+Ball</para>
+</listitem>
+<listitem role="commit-message">
+<para>fixed handling linebreaks when
+generating WordML added Apple Pages
+support</para>
+<para role="commit-changes">Modified: wordml/docbook.xsl,1.13; wordml/template-pages.xml,1.2 -
+Steve Ball</para>
+</listitem>
+</itemizedlist>
+</sect2><!--end of WordML changes for snapshot_2006-05-15_0803-->
+</sect1>
+
+ <sect1 xml:id="V1691">
+ <title>Release 1.69.1</title>
+ <para>This release is a minor bug-fix update to the 1.69.0
+ release. Along with bug fixes, it includes one
+ configuration-parameter change: The default value of the
+ <parameter>annotation.support</parameter> parameter is now
+ <literal>0</literal> (off). The reason for that change is that
+ there have been reports that <tag>annotation</tag> handling is
+ causing a significant performance degradation in processing of
+ large documents with <command>xsltproc</command>.</para>
+ </sect1>
+ <!-- end of notes for 1.69.1 release -->
+
+ <sect1 xml:id="V1690">
+ <title>Release 1.69.0</title>
+ <para>The release includes major feature changes,
+ particularly in the <link linkend="V1690_MAN">manpages
+ stylesheets</link>, as well as a large number of bug fixes.</para>
+
+ <para>As with all DocBook Project <quote>dot zero</quote> releases, this is an
+ <link linkend="dot0">experimental release </link>.</para>
+
+ <sect2 xml:id="V1690_COMMON">
+ <title>Common</title>
+ <itemizedlist>
+ <listitem>
+ <para>This release adds localizations for the following
+ languages:
+ <simplelist type="inline">
+ <?dbchoice choice="and"?>
+ <member>Albanian</member>
+ <member>Amharic</member>
+ <member>Azerbaijani</member>
+ <member>Hindi</member>
+ <member>Irish (Gaelic)</member>
+ <member>Gujarati</member>
+ <member>Kannada</member>
+ <member>Mongolian</member>
+ <member>Oriya</member>
+ <member>Punjabi</member>
+ <member>Tagalog</member>
+ <member>Tamil</member>
+ <member>Welsh</member>
+ </simplelist>.</para>
+ </listitem>
+ <listitem>
+ <para>Added support for specifying number format for auto
+ labels for <tag>chapter</tag>, <tag>appendix</tag>,
+ <tag>part</tag>, and <tag>preface</tag>. Contolled with the
+ <parameter>appendix.autolabel</parameter>,
+ <parameter>chapter.autolabel</parameter>,
+ <parameter>part.autolabel</parameter>, and
+ <parameter>preface.autolabel</parameter> parameters.</para>
+ </listitem>
+ <listitem>
+ <para>Added basic support for <tag>biblioref</tag> cross
+ referencing.</para>
+ </listitem>
+ <listitem>
+ <para>Added support for <tag class="attribute">align</tag>
+ on <tag>caption</tag> in <tag>mediaobject</tag>.</para>
+ </listitem>
+ <listitem>
+ <para>Added support for processing documents that use the
+ DocBook V5 namespace.</para>
+ </listitem>
+ <listitem>
+ <para>Added support for <tag>termdef</tag> and
+ <tag>mathphrase</tag>.</para>
+ </listitem>
+ <listitem>
+ <para>EXPERIMENTAL: Incorporated the Slides and Website
+ stylesheets into the DocBook XSL stylesheets package. So,
+ for example, Website documents can now be processed using
+ the following URI for the driver Website
+ <filename>tabular.xsl</filename> file: <literallayout class="monospaced"><uri>http://docbook.sourceforge.net/release/xsl/current/website/tabular.xsl</uri></literallayout></para>
+ </listitem>
+ <listitem>
+ <para>A <tag>procedure</tag> without a <tag>title</tag> is
+ now treated as an <quote>informal</quote> procedure (meaning
+ that it is not added to any generated <quote>list of
+ procedures</quote> and has no affect on numbering of
+ generated labels for other procedures).</para>
+ </listitem>
+ <listitem>
+ <para><tag>docname</tag> is no longer added to
+ <tag>olink</tag> when pointing to a root element.</para>
+ </listitem>
+ <!-- ======================================================= -->
+ <listitem>
+ <para>Added support for generation of choice separator in
+ inline simplelist. This enables auto-generation of an
+ appropriate localized <quote>choice separator</quote> (for
+ example, <quote>and</quote> or <quote>or</quote>) before the
+ final item in an inline <tag>simplelist</tag>.</para>
+ <para>To indicate that you want a choice separator
+ generated for a particular list, you need to put a processing
+ instruction (PI) of the form
+ <tag class="xmlpi">dbchoice choice="foo"</tag> as a
+ child of the list. For example:
+ <literallayout class="monospaced"> &lt;para&gt;Choose from
+ ONE and ONLY ONE of the following:
+ &lt;simplelist type="inline"&gt;
+ &lt;?dbchoice choice="or" ?&gt;
+ &lt;member&gt;A&lt;/member&gt;
+ &lt;member&gt;B&lt;/member&gt;
+ &lt;member&gt;C&lt;/member&gt;.&lt;/simplelist&gt;&lt;/para&gt;</literallayout>
+
+ Output (for English):
+ <blockquote>
+ <para>Choose from ONE and only ONE of the
+ following choices: A, B, or C.</para>
+ </blockquote>
+ As a temporary workaround for the fact that most of the
+ DocBook non-English locale files don't have a localization for
+ the word <quote>or</quote>, you can put in a literal string to
+ be used; example for French: <tag class="pi">dbchoice choice="ou"</tag>. That is, use
+ <quote>ou</quote> instead of <quote>or</quote>.</para>
+ </listitem>
+ </itemizedlist>
+ </sect2>
+ <sect2 xml:id="V1690_FO">
+ <title>FO</title>
+ <itemizedlist>
+ <listitem>
+ <para> Added <literal>content-type</literal> property to
+ <literal>external-graphic</literal> element, based on
+ <tag>imagedata</tag> <tag class="attribute">format</tag>
+ attribute.</para>
+ </listitem>
+ <listitem>
+ <para>Added support for generating
+ <literal>&lt;rx:meta-field creator="$VERSION"/&gt;</literal>
+ field for XEP output. This makes the DocBook XSL
+ stylesheet version information available through the
+ <guimenu>Document Properties</guimenu> menu in Acrobat
+ Reader and other PDF viewers.</para>
+ </listitem>
+ <listitem>
+ <para>Trademark symbol handling made consistent with
+ handling of same in HTML stylesheets. Prior to this change,
+ if you processed a document that contained no value for the
+ <tag class="attribute">class</tag> attribute on the
+ <tag>trademark</tag> element, the HTML stylesheets would
+ default to rendering a superscript <literal>TM
+ </literal>symbol after the <tag>trademark</tag> contents,
+ but the FO stylesheets would render nothing.</para>
+ </listitem>
+ <listitem>
+ <para>Added support for generating XEP bookmarks for
+ <tag>refentry</tag>.</para>
+ </listitem>
+ <listitem>
+ <para>Added support for HTML markup <tag>table</tag> <tag class="attribute">border</tag> attribute, applied to each
+ table cell.</para>
+ </listitem>
+ <listitem>
+ <para>The <function>table.width</function> template can now
+ sum column specs if none use <literal>%</literal> or
+ <literal>*</literal>.</para>
+ </listitem>
+ <listitem>
+ <para>Added <literal>fox:destination</literal> extension
+ inside <literal>fox:outline</literal> to support linking to
+ internal destinations.</para>
+ </listitem>
+ <listitem>
+ <para>Added support for customizing
+ <literal>abstract</literal> with property sets. Controlled
+ with the <parameter>abstract.properties</parameter> and
+ <parameter>abstract.title.properties</parameter>
+ parameters.</para>
+ </listitem>
+ <listitem>
+ <para>Add <tag>footnote</tag>s in <tag>table</tag> title to
+ table footnote set, and add support for table footnotes to
+ HTML table markup.</para>
+ </listitem>
+ <listitem>
+ <para>Added support for <tag>title</tag> in
+ <tag>glosslist</tag>.</para>
+ </listitem>
+ <listitem>
+ <para>Added support for <tag>itemizedlist</tag> symbol
+ <literal>none</literal>.</para>
+ </listitem>
+ <listitem>
+ <para>Implemented the new
+ <parameter>graphical.admonition.properties</parameter> and
+ <parameter>nongraphical.admonition.properties</parameter>
+ attribute sets.</para>
+ </listitem>
+ <listitem>
+ <para>Added <tag class="attribute">id</tag> to
+ <tag>formalpara</tag> and some other blocks that were
+ missing it.</para>
+ </listitem>
+ <listitem>
+ <para>Changed the anchor template to output
+ <literal>fo:inline</literal> instead of
+ <literal>fo:wrapper</literal>.</para>
+ </listitem>
+ <listitem>
+ <para>Added support for <parameter>toc.max.depth</parameter>
+ parameter.</para>
+ </listitem>
+ </itemizedlist>
+ </sect2>
+
+ <sect2 xml:id="V1690_HELP">
+ <title>Help</title>
+ <itemizedlist>
+ <listitem>
+ <para>Eclipse Help: Added support for generating olink
+ database.</para>
+ </listitem>
+ </itemizedlist>
+ </sect2>
+
+ <sect2 xml:id="V1690_HTML">
+ <title>HTML</title>
+ <itemizedlist>
+ <listitem>
+ <para>Added a first cut at support in HTML output for
+ DocBook 5 style <tag>annotation</tag>s. Controlled using the
+ <parameter>annotation.support</parameter> parameter, and
+ implemented using JavaScript and CSS styling. For more
+ details, see the documentation for the
+ <parameter>annotation.js</parameter>,
+ <parameter>annotation.css</parameter>,
+ <parameter>annotation.graphic.open</parameter>, and
+ <parameter>annotation.graphic.close</parameter>
+ parameters.</para>
+ </listitem>
+ <listitem>
+ <para>Generate client-side image map for
+ <tag>imageobjectco</tag> with areas using
+ <literal>calspair</literal> units</para>
+ </listitem>
+ <listitem>
+ <para>Added support for <tag class="xmlpi">img.src.path</tag> PI.</para>
+ </listitem>
+ <listitem>
+ <para>Added support for passing
+ <parameter>img.src.path</parameter> to DocBook Java XSLT
+ image extensions when appropriate. Controlled using the
+ <parameter>graphicsize.use.img.src.path</parameter>
+ parameter.</para>
+ </listitem>
+ <listitem>
+ <para>Added support for (not
+ valid for DocBook 4) <tag class="attribute">xlink:href</tag>
+ on <tag>area</tag> and (not valid for DocBook 4)
+ <tag>alt</tag> in <tag>area</tag>.</para>
+ </listitem>
+ <listitem>
+ <para>Added new parameter
+ <parameter>default.table.frame</parameter> to control table
+ framing if there is no <tag class="attribute">frame</tag>
+ attribute on a table.</para>
+ </listitem>
+ <listitem>
+ <para>Added initial, experimental support for generating
+ content for the HTML <literal>title</literal> attribute from
+ content of the <tag>alt</tag> element. This change adds
+ support for the following inline elements only (none of them
+ are block elements):
+ <simplelist type="inline">
+ <?dbchoice choice="and"?>
+ <member><tag>abbrev</tag></member>
+ <member><tag>accel</tag></member>
+ <member><tag>acronym</tag></member>
+ <member><tag>action</tag></member>
+ <member><tag>application</tag></member>
+ <member><tag>authorinitials</tag></member>
+ <member><tag>beginpage</tag></member>
+ <member><tag>citation</tag></member>
+ <member><tag>citerefentry</tag></member>
+ <member><tag>citetitle</tag></member>
+ <member><tag>city</tag></member>
+ <member><tag>classname</tag></member>
+ <member><tag>code</tag></member>
+ <member><tag>command</tag></member>
+ <member><tag>computeroutput</tag></member>
+ <member><tag>constant</tag></member>
+ <member><tag>country</tag></member>
+ <member><tag>database</tag></member>
+ <member><tag>email</tag></member>
+ <member><tag>envar</tag></member>
+ <member><tag>errorcode</tag></member>
+ <member><tag>errorname</tag></member>
+ <member><tag>errortext</tag></member>
+ <member><tag>errortype</tag></member>
+ <member><tag>exceptionname</tag></member>
+ <member><tag>fax</tag></member>
+ <member><tag>filename</tag></member>
+ <member><tag>firstname</tag></member>
+ <member><tag>firstterm</tag></member>
+ <member><tag>foreignphrase</tag></member>
+ <member><tag>function</tag></member>
+ <member><tag>glossterm</tag></member>
+ <member><tag>guibutton</tag></member>
+ <member><tag>guiicon</tag></member>
+ <member><tag>guilabel</tag></member>
+ <member><tag>guimenu</tag></member>
+ <member><tag>guimenuitem</tag></member>
+ <member><tag>guisubmenu</tag></member>
+ <member><tag>hardware</tag></member>
+ <member><tag>honorific</tag></member>
+ <member><tag>interface</tag></member>
+ <member><tag>interfacename</tag></member>
+ <member><tag>keycap</tag></member>
+ <member><tag>keycode</tag></member>
+ <member><tag>keysym</tag></member>
+ <member><tag>lineage</tag></member>
+ <member><tag>lineannotation</tag></member>
+ <member><tag>literal</tag></member>
+ <member><tag>markup</tag></member>
+ <member><tag>medialabel</tag></member>
+ <member><tag>methodname</tag></member>
+ <member><tag>mousebutton</tag></member>
+ <member><tag>option</tag></member>
+ <member><tag>optional</tag></member>
+ <member><tag>otheraddr</tag></member>
+ <member><tag>othername</tag></member>
+ <member><tag>package</tag></member>
+ <member><tag>parameter</tag></member>
+ <member><tag>personname</tag></member>
+ <member><tag>phone</tag></member>
+ <member><tag>pob</tag></member>
+ <member><tag>postcode</tag></member>
+ <member><tag>productname</tag></member>
+ <member><tag>productnumber</tag></member>
+ <member><tag>prompt</tag></member>
+ <member><tag>property</tag></member>
+ <member><tag>quote</tag></member>
+ <member><tag>refentrytitle</tag></member>
+ <member><tag>remark</tag></member>
+ <member><tag>replaceable</tag></member>
+ <member><tag>returnvalue</tag></member>
+ <member><tag>tag</tag></member>
+ <member><tag>shortcut</tag></member>
+ <member><tag>state</tag></member>
+ <member><tag>street</tag></member>
+ <member><tag>structfield</tag></member>
+ <member><tag>structname</tag></member>
+ <member><tag>subscript</tag></member>
+ <member><tag>superscript</tag></member>
+ <member><tag>surname</tag></member>
+ <member><tag>symbol</tag></member>
+ <member><tag>systemitem</tag></member>
+ <member><tag>tag</tag></member>
+ <member><tag>termdef</tag></member>
+ <member><tag>token</tag></member>
+ <member><tag>trademark</tag></member>
+ <member><tag>type</tag></member>
+ <member><tag>uri</tag></member>
+ <member><tag>userinput</tag></member>
+ <member><tag>varname</tag></member>
+ <member><tag>wordasword</tag></member>
+ </simplelist>
+ </para>
+ </listitem>
+ <listitem>
+ <para>Added support for chunking <tag>revhistory</tag> into
+ separate file (similar to the support for doing same with
+ <tag>legalnotice</tag>). Patch from Thomas
+ Schraitle. Controlled through <parameter>new
+ generate.revhistory.link</parameter> parameter.</para>
+ </listitem>
+ <listitem>
+ <para>l10n.xsl: Made language codes RFC compliant. Added a
+ new boolean config parameter,
+ <parameter>l10n.lang.value.rfc.compliant</parameter>. If it
+ is non-zero (the default), any underscore in a language code
+ will be converted to a hyphen in HTML output. If it is zero,
+ the language code will be left as-is.</para>
+ </listitem>
+ </itemizedlist>
+ </sect2>
+ <sect2 xml:id="V1690_MAN">
+ <title>man</title>
+ <para>This release closes out 44 manpages stylesheet bug reports
+ and feature requests. It adds more than 35 new configuration
+ parameters for controlling aspects of man-page output --
+ including hyphenation and justification, handling of links,
+ conversion of Unicode characters, and contents of man-page
+ headers and footers.</para>
+ <itemizedlist>
+ <!-- ======================================================= -->
+ <listitem>
+ <para>New options for globally disabling/enabling
+ hyphenation and justification:
+ <parameter>man.justify</parameter> and
+ <parameter>man.hyphenate</parameter>.</para>
+ <para>Note that the default
+ for the both of those is zero (off), because justified text
+ looks good only when it is also hyphenated; to quote the
+ <quote>Hyphenation</quote> node from the groff info page:
+ <blockquote>
+ <para><emphasis>Since the odds are not great for finding a
+ set of words, for every output line, which fit nicely on a
+ line without inserting excessive amounts of space between
+ words, `gtroff' hyphenates words so that it can justify
+ lines without inserting too much space between
+ words.</emphasis></para>
+ </blockquote>
+ The problem is that groff can end up hyphenating a lot of
+ things that you don't want hyphenated (variable names and
+ command names, for example). Keeping both justification and
+ hyphenation disabled ensures that hyphens won't get inserted
+ where you don't want to them, and you don't end up with
+ lines containing excessive amounts of space between
+ words. These default settings run counter to how most
+ existing man pages are formatted. But there are some notable
+ exceptions, such as the perl man pages.</para>
+ </listitem>
+ <listitem>
+ <para> Added parameters for controlling hyphenation of
+ computer inlines, filenames, and URLs. By default, even when
+ hyphenation is enabled (globally), hyphenation is now
+ suppressed for "computer inlines" (currently, just
+ <tag>classname</tag>, <tag>constant</tag>, <tag>envar</tag>,
+ <tag>errorcode</tag>, <tag>option</tag>,
+ <tag>replaceable</tag>, <tag>userinput</tag>,
+ <tag>type</tag>, and <tag>varname</tag>, and for
+ <tag>filenames</tag>, and for URLs from <tag>link</tag>. It
+ can be (re)enabled using the
+ <parameter>man.hyphenate.computer.inlines</parameter>,
+ <parameter>man.hyphenate.filenames</parameter>, and
+ <parameter>man.hyphenate.urls parameters</parameter>.</para>
+ </listitem>
+ <!-- ======================================================= -->
+ <listitem>
+ <para>Implemented a new system for replacing Unicode
+ characters. There are two parts to the new system: a
+ <quote>string substitution map</quote> for doing
+ <quote>essential</quote> replacements, and a
+ <quote>character map</quote> that can optionally be disabled
+ and enabled.</para>
+ <para>The new system fixes all open bugs that had to do with
+ literal Unicode numbered entities such as &amp;#8220; and
+ &amp;#8221; showing up in output, and greatly expands the
+ ability of the stylesheets to generate <quote>good</quote> roff
+ equivalents for Unicode symbols and special
+ characters.</para>
+ <para>Here are some details...</para>
+ <para>The previous manpages mechanism for replacing Unicode
+ symbols and special characters with roff equivalents (the
+ <function>replace-entities</function> template) was not
+ scalable and not complete. The mechanism handled a somewhat
+ arbitrary selection of less than 20 or so Unicode
+ characters. But there are potentially more than
+ <emphasis>800</emphasis> Unicode special characters that
+ have some groff equivalent they can be mapped to. And there
+ are about 34 symbols in the Latin-1 (ISO-8859-1) block
+ alone. Users might reasonably expect that if they include
+ any of those Latin-1 characters in their DocBook source
+ documents, they will get correctly converted to known roff
+ equivalents in output.</para>
+ <para>In addition to those common symbols, certain users may
+ have a need to use symbols from other Unicode blocks. Say,
+ somebody who is documenting an application related to math
+ might need to use a bunch of symbols from the
+ <quote>Mathematical Operators</quote> Unicode block (there
+ are about 65 characters in that block that have reasonable
+ roff equivalents). Or somebody else might really like
+ Dingbats -- such as the checkmark character -- and so might
+ use a bunch of things from the <quote>Dingbat</quote> block
+ (141 characters in that that have roff equivalents or that
+ can at least be <quote>degraded</quote> somewhat gracefully
+ into roff).</para>
+ <para>So, the old <function>replace-entities</function>
+ mechanism was replaced with a completely different mechanism
+ that is based on use of two <quote>maps</quote>: a
+ <quote>substitution map</quote> and a <quote>character
+ map</quote> (the latter in a format compliant with the XSLT
+ 2.0 spec and therefore completely <quote>forward
+ compatible</quote> with XSLT 2.0).</para>
+ <para>The substitution map is controlled through the
+ <parameter>man.string.subst.map</parameter> parameter, and
+ is used to replace things like the backslash character
+ (which needs special handling to prevent it from being
+ interpreted as a roff escape). The substitution map cannot
+ be disabled, because disabling it will cause the output to
+ be broken. However, you can add to it and change it if
+ needed.</para>
+
+ <para>The <quote>character map</quote> mechanism, on the
+ other hand, can be completely disabled. It is enabled by
+ default, and, by default, does replacement of all Latin-1
+ symbols, along with most special spaces, dashes, and quotes
+ (about 75 characters by default). Also, you can optionally
+ enable a <quote>full</quote> character map that provides
+ support for converting all 800 or so of the characters that
+ have some reasonable groff equivalent.</para>
+
+ <para>The character-map mechanism is controlled through the
+ following parameters:
+ <variablelist>
+ <varlistentry>
+ <term><parameter>man.charmap.enabled</parameter></term>
+ <listitem><para>turns character-map support
+ on/off</para></listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><parameter>man.charmap.use.subset</parameter></term>
+ <listitem><para>specifies that a subset of the character
+ map is used instead of the full map</para></listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><parameter>man.charmap.subset.profile</parameter></term>
+ <listitem><para>specifies profile of character-map
+ subset</para></listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><parameter>man.charmap.uri</parameter></term>
+ <listitem><para>specifies an alternate character map to
+ use instead of the <quote>standard</quote> character map
+ provided in the distribution</para></listitem>
+ </varlistentry>
+ </variablelist>
+ </para>
+ </listitem>
+ <!-- ======================================================= -->
+ <listitem>
+ <para>Implemented out-of-line handling of display of URLs
+ for links (currently, only for <tag>ulink</tag>). This gives
+ you three choices for handling of links:
+ <orderedlist>
+ <listitem>
+ <para>Number and list links. Each link is numbered
+ inline, with a number in square brackets preceding the
+ link contents, and a numbered list of all links is added
+ to the end of the document.</para>
+ </listitem>
+ <listitem>
+ <para>Only list links. Links are not numbered, but an
+ (unnumbered) list of links is added to the end of the
+ document.</para>
+ </listitem>
+ <listitem>
+ <para>Suppress links. Don't number links and don't add
+ any list of links to the end of the document.</para>
+ </listitem>
+ </orderedlist>
+ You can also choose whether links should be underlined. The
+ default is <quote>the works</quote> -- list, number, and
+ underline links. You can use the
+ <parameter>man.links.list.enabled</parameter>, <parameter>
+ man.links.are.numbered</parameter>, and
+ <parameter>man.links.are.underlined</parameter> parameters
+ to change the defaults. The default heading for the link
+ list is REFERENCES. You can be change that using the
+ <parameter>man.links.list.heading</parameter>
+ parameter.</para>
+ </listitem>
+ <listitem>
+ <para>Changed default output encoding to UTF-8. <emphasis role="bold">This does not mean that man pages are output in
+ raw UTF-8</emphasis>, because the character map is applied
+ before final output, causing all UTF-8 characters covered in
+ the map to be converted to roff equivalents.</para>
+ </listitem>
+ <!-- ======================================================= -->
+ <listitem>
+ <para>Added support for processing <tag>refsect3</tag> and
+ <tag>formalpara</tag> and nested <tag>refsection</tag>
+ elements, down to any arbitrary level of nesting.</para>
+ </listitem>
+ <!-- ======================================================= -->
+ <listitem>
+ <para>Output of the <literal>NAME</literal> and
+ <literal>SYNOPSIS</literal> and <literal>AUTHOR</literal>
+ headings and the headings for admonitions (<tag>note</tag>,
+ <tag>caution</tag>, etc.) are no longer hard-coded for
+ English. Instead, headings are generated for those in the
+ correct locale (just as the FO and HTML stylesheets
+ do).</para>
+ </listitem>
+ <!-- ======================================================= -->
+ <listitem>
+ <para>Re-worked mechanism for assembling page
+ headers/footers (the contents of the <literal>.TH</literal>
+ macro <quote>title line</quote>).</para>
+
+ <para>Here are some details...</para>
+
+ <para>All man pages contain a <literal>.TH</literal> roff
+ macro whose contents are used for rendering the <quote>title
+ line</quote> displayed in the header and footer of each
+ page. Here are a couple of examples of real-world man pages
+ that have useful page headers/footers: <literallayout class="monospaced">
+ gtk-options(7) GTK+ User's Manual gtk-options(7) &lt;-- header
+ GTK+ 1.2 2003-10-20 gtk-options(7) &lt;-- footer
+
+ svgalib(7) Svgalib User Manual svgalib(7) &lt;-- header
+ Svgalib 1.4.1 16 December 1999 svgalib(7) &lt;-- footer</literallayout></para>
+
+ <para>And here are the terms with which the
+ <literal>groff_man(7)</literal> man page refers to the
+ various parts of the header/footer: <literallayout class="monospaced">
+ title(section) extra3 title(section) &lt;- header
+ extra2 extra1 title(section) &lt;- footer</literallayout></para>
+ <para> Or, using the names with which the <literal>man(7)</literal>
+ man page refers to those same fields: <literallayout class="monospaced">
+ title(section) manual title(section) &lt;- page header
+ source date title(section) &lt;- page footer</literallayout></para>
+
+ <para>The easiest way to control the contents of those
+ fields is to mark up your <tag>refentry</tag> content like
+ the following (note that this is a <quote>minimal</quote>
+ example). <programlisting>
+ &lt;refentry&gt;
+ &lt;info&gt;
+ &lt;date&gt;2003-10-20&lt;/date&gt; <co xml:id="V1690_date-co" linkends="V1690_date"/>
+ &lt;/info&gt;
+ &lt;refmeta&gt;
+ &lt;refentrytitle&gt;gtk-options&lt;/refentrytitle&gt; <co xml:id="V1690_title-co" linkends="V1690_title"/>
+ &lt;manvolnum&gt;7&lt;/manvolnum&gt; <co xml:id="V1690_manvolnum-co" linkends="V1690_manvolnum"/>
+ &lt;refmiscinfo class="source-name"&gt;GTK+&lt;/refmiscinfo&gt; <co xml:id="V1690_source-name-co" linkends="V1690_source-name"/>
+ &lt;refmiscinfo class="version"&gt;1.2&lt;/refmiscinfo&gt; <co xml:id="V1690_version-co" linkends="V1690_version"/>
+ &lt;refmiscinfo class="manual"&gt;GTK+ User's Manual&lt;/refmiscinfo&gt; <co xml:id="V1690_manual-co" linkends="V1690_manual"/>
+ &lt;/refmeta&gt;
+ &lt;refnamediv&gt;
+ &lt;refname&gt;gtk-options&lt;/refname&gt;
+ &lt;refpurpose&gt;Standard Command Line Options for GTK+ Programs&lt;/refpurpose&gt;
+ &lt;/refnamediv&gt;
+ &lt;refsect1&gt;
+ &lt;title&gt;Description&lt;/title&gt;
+ &lt;para&gt;This manual page describes the command line options, which
+ are common to all GTK+ based applications.&lt;/para&gt;
+ &lt;/refsect1&gt;
+ &lt;/refentry&gt;</programlisting>
+ <calloutlist>
+ <callout arearefs="V1690_date-co" xml:id="V1690_date">
+ <para>Sets the <quote>date</quote> part of the header/footer.</para>
+ </callout>
+ <callout arearefs="V1690_title-co" xml:id="V1690_title">
+ <para>Sets the <quote>title</quote> part.</para>
+ </callout>
+ <callout arearefs="V1690_manvolnum-co" xml:id="V1690_manvolnum">
+ <para>Sets the <quote>section</quote> part.</para>
+ </callout>
+ <callout arearefs="V1690_source-name-co" xml:id="V1690_source-name">
+ <para>Sets the <quote>source name</quote> part.</para>
+ </callout>
+ <callout arearefs="V1690_version-co" xml:id="V1690_version">
+ <para>Sets the <quote>version</quote> part.</para>
+ </callout>
+ <callout arearefs="V1690_manual-co" xml:id="V1690_manual">
+ <para>Sets the <quote>manual</quote> part.</para>
+ </callout>
+ </calloutlist>
+ </para>
+ <para>Below are explanations of the steps the stylesheets
+ take to attempt to assemble and display
+ <quote>good</quote> headers and footer. [In the
+ descriptions, note that <replaceable>*info</replaceable>
+ is the <tag>refentry</tag> <quote>info</quote> child
+ (whatever its name), and
+ <replaceable>parentinfo</replaceable> is the
+ <quote>info</quote> child of its parent (again, whatever
+ its name).]
+ <variablelist>
+ <varlistentry>
+ <term>extra1 field (date)</term>
+ <listitem>
+ <para>Content of the <quote>extra1</quote> field is
+ what shows up in the <emphasis role="bold">center
+ footer</emphasis> position of each page. The
+ <literal>man(7)</literal> man page describes it as
+ <quote>the date of the last revision</quote>.</para>
+ <para>To provide this content, if the
+ <parameter>refentry.date.profile.enabled</parameter>
+ is non-zero, the stylesheets check the value of
+ <parameter>refentry.date.profile</parameter>.</para>
+ <para>Otherwise, by default, they check for a
+ <tag>date</tag> or <tag>pubdate</tag> not only in the
+ <replaceable>*info</replaceable> contents, but also in
+ the <replaceable>parentinfo</replaceable>
+ contents.</para>
+ <para>If a date cannot be found, the stylesheets now
+ automatically generate a localized <quote>long
+ format</quote> date, ensuring that this field always
+ has content in output.</para>
+ <para>However, if for some reason you want to suppress
+ this field, you can do so by setting a non-zero value
+ for <parameter>man.th.extra1.suppress</parameter>.</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>extra2 field (source)</term>
+ <listitem>
+ <para>On Linux systems and on systems with a modern
+ groff, the content of the <quote>extra2</quote> field
+ are what shows up in the <emphasis role="bold">left
+ footer</emphasis> position of each page.</para>
+
+ <para>The <literal>man(7)</literal> man page describes
+ this as <quote>the source of the command</quote>, and
+ provides the following examples:
+ <itemizedlist>
+ <listitem>
+ <para>For binaries, use somwething like: GNU,
+ NET-2, SLS Distribution, MCC Distribution.</para>
+ </listitem>
+ <listitem>
+ <para>For system calls, use the version of the
+ kernel that you are currently looking at: Linux
+ 0.99.11.</para>
+ </listitem>
+ <listitem>
+ <para>For library calls, use the source of the
+ function: GNU, BSD 4.3, Linux DLL 4.4.1.</para>
+ </listitem>
+ </itemizedlist>
+ </para>
+
+ <para>In practice, there are many pages that simply
+ have a version number in the <quote>source</quote>
+ field. So, it looks like what we have is a two-part
+ field,
+ <replaceable>Name</replaceable> <replaceable>Version</replaceable>,
+ where:
+ <variablelist>
+ <varlistentry>
+ <term>Name</term>
+ <listitem>
+ <para>product name (e.g., BSD) or org. name
+ (e.g., GNU)</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>Version</term>
+ <listitem>
+ <para>version name</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ Each part is optional. If the
+ <replaceable>Name</replaceable> is a product name,
+ then the <replaceable>Version</replaceable> is
+ probably the version of the product. Or there may be
+ no <replaceable>Name</replaceable>, in which case, if
+ there is a <replaceable>Version</replaceable>, it is
+ probably the version of the item itself, not the
+ product it is part of. Or, if the
+ <replaceable>Name</replaceable> is an organization
+ name, then there probably will be no
+ <replaceable>Version</replaceable>.
+ </para>
+ <para>To provide this content, if the
+ <parameter>refentry.source.name.profile.enabled</parameter>
+ and
+ <parameter>refentry.version.profile.enabled</parameter>
+ parameter are non-zero, the stylesheets check the
+ value of <parameter>refentry.source.name.profile</parameter>
+ <parameter>refentry.version.profile</parameter>.</para>
+
+ <para>Otherwise, by default, they check the following
+ places, in the following order:
+ <orderedlist>
+ <listitem>
+ <literallayout class="monospaced"><replaceable>*info</replaceable>/<tag>productnumber</tag></literallayout>
+ </listitem>
+ <listitem>
+ <literallayout class="monospaced"><replaceable>*info</replaceable>/<tag>productnumber</tag></literallayout>
+ </listitem>
+ <listitem>
+ <literallayout class="monospaced"><tag>refmeta</tag>/<tag>refmiscinfo</tag>[@class = 'version']</literallayout>
+ </listitem>
+ <listitem>
+ <literallayout class="monospaced"><replaceable>parentinfo</replaceable>/<tag>productnumber</tag></literallayout>
+ </listitem>
+ <listitem>
+ <literallayout class="monospaced"><replaceable>*info</replaceable>/<tag>productname</tag></literallayout>
+ </listitem>
+ <listitem>
+ <literallayout class="monospaced"><replaceable>parentinfo</replaceable>/<tag>productname</tag></literallayout>
+ </listitem>
+ <listitem>
+ <literallayout class="monospaced"><tag>refmeta</tag>/<tag>refmiscinfo</tag></literallayout>
+ </listitem>
+ <listitem>
+ <para>[nothing found, so leave it empty]</para>
+ </listitem>
+ </orderedlist>
+ </para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>extra3 field</term>
+ <listitem>
+ <para>On Linux systems and on systems with a modern
+ groff, the content of the <quote>extra3</quote> field
+ are what shows up in the <emphasis role="bold">center
+ header</emphasis> position of each page. Some man
+ pages have <quote>extra2</quote> content, some
+ don't. If a particular man page has it, it is most
+ often <quote>context</quote> data about some larger
+ system the documented item belongs to (for example,
+ the name or description of a group of related
+ applications). The stylesheets now check the following
+ places, in the following order, to look for content to
+ add to the <quote>extra3</quote> field.</para>
+ <orderedlist>
+ <listitem>
+ <literallayout class="monospaced"><replaceable>parentinfo</replaceable>/<tag>title</tag></literallayout>
+ </listitem>
+ <listitem>
+ <literallayout class="monospaced">parent's <tag>title</tag></literallayout>
+ </listitem>
+ <listitem>
+ <literallayout class="monospaced"><tag>refmeta</tag>/<tag>refmiscinfo</tag></literallayout>
+ </listitem>
+ <listitem>
+ <para>[nothing found, so leave it empty]</para>
+ </listitem>
+ </orderedlist>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </para>
+ </listitem>
+ <!-- ======================================================= -->
+ <listitem>
+ <para>Reworked <replaceable>*info</replaceable> gathering. For
+ each <tag>refentry</tag> found, the stylesheets now cache its
+ <replaceable>*info</replaceable> content, then check for any
+ valid parent of it that might have metainfo content and cache
+ that, if found; they then then do all further matches against
+ those node-sets (rather than re-selecting the original
+ <replaceable>*info</replaceable> nodes each time they are
+ needed).</para>
+ </listitem>
+ <!-- ======================================================= -->
+ <listitem>
+ <para>New option for breaking strings after forward
+ slashes. This enables long URLs and pathnames to be broken
+ across lines. Controlled through
+ <parameter>man.break.after.slash</parameter> parameter.</para>
+ </listitem>
+ <!-- ======================================================= -->
+ <listitem>
+ <para>Output for servicemark and trademark are now
+ <literal>(SM)</literal> and <literal>(TM)</literal>. There is
+ a groff <literal>"\(tm"</literal> escape, but output from that
+ is not acceptable.</para>
+ </listitem>
+ <!-- ======================================================= -->
+ <listitem>
+ <para>New option for controlling the length of the title
+ part of the <literal>.TH</literal> title line. Controlled
+ through the <parameter>man.th.title.max.length</parameter>
+ parameter.</para>
+ </listitem>
+ <!-- ======================================================= -->
+ <listitem>
+ <para>New option for specifying output encoding of each man
+ page; controlled with
+ <parameter>man.output.encoding</parameter> (similar to the
+ HTML <parameter>chunker.output.encoding </parameter>
+ parameter).</para>
+ </listitem>
+ <!-- ======================================================= -->
+ <listitem>
+ <para>New option for suppressing filename messages when
+ generating output; controlled with
+ <parameter>man.output.quietly</parameter> (similar to the HTML
+ <parameter>chunk.quietly</parameter> parameter).</para>
+ </listitem>
+ <!-- ======================================================= -->
+ <listitem>
+ <para>The text of cross-references to first-level
+ <tag>refentry</tag> (<tag>refsect1</tag>, top-level
+ <tag>refsection</tag>, <tag>refnamediv</tag>, and
+ <tag>refsynopsisdiv</tag>) are now capitalized.</para>
+ </listitem>
+ <!-- ======================================================= -->
+ <listitem>
+ <para>Cross-references to <tag>refnamediv</tag> now use the
+ localized <literal>NAME</literal> title instead of using the
+ first <tag>refname</tag> child. This makes the output
+ inconsistent with HTML and FO output, but for man-page output,
+ it seems to make better sense to have the
+ <literal>NAME</literal>. (It may actually make better sense to
+ do it that way in HTML and FO output as well...)</para>
+ </listitem>
+ <!-- ======================================================= -->
+ <listitem>
+ <para>Added support for processing <tag>funcparams</tag>.</para>
+ </listitem>
+ <!-- ======================================================= -->
+ <listitem>
+ <para>Removed the space that was being output between
+ <tag>funcdef</tag> and <tag>paramdef</tag>; example: was:
+ <literal>float rand (void)</literal>; now:
+ <literal>float rand(void)</literal></para>
+ </listitem>
+ <!-- ======================================================= -->
+ <listitem>
+ <para>Turned off bold formatting for the <tag>type</tag>
+ element when it occurs within a <tag>funcdef</tag> or
+ <tag>paramdef</tag></para>
+ </listitem>
+ <!-- ======================================================= -->
+ <listitem>
+ <para>Corrected rendering of <tag>simplelist</tag>. Any
+ <literal>&lt;simplelist type="inline"</literal> instance
+ is now rendered as a comma-separated list (also with an
+ optional localized <quote>and</quote> or <quote>or</quote> before the last item -- see
+ description elsewhere in these release notes). Any simplelist
+ instance whose <tag class="attribute">type</tag> is not
+ <literal>inline</literal> is rendered as a one-column vertical
+ list (ignoring the values of the <tag class="attribute">type</tag> and <tag class="attribute">columns</tag> attributes if present)</para>
+ </listitem>
+ <!-- ======================================================= -->
+ <listitem>
+ <para>Comment added at top of roff source for each page now
+ includes DocBook XSL stylesheets version number (as in the
+ HTML stylesheets)</para>
+ </listitem>
+ <!-- ======================================================= -->
+ <listitem>
+ <para>Made change to prevent <quote>sticky</quote> fonts
+ changes. Now, when the manpages stylesheets encounter node
+ sets that need to be boldfaced or italicized, they put the
+ <literal>\fBfoo\fR</literal> and <literal>\fIbar\fR</literal>
+ groff bold/italic instructions separately around each node in
+ the set.</para>
+ </listitem>
+ <listitem>
+ <para>synop.xsl: Boldface everything in
+ <tag>funcsynopsis</tag> output except parameters (which are in
+ ital). The <literal>man(7)</literal> man page says:
+ <blockquote>
+ <para>For functions, the arguments are always specified
+ using italics, even in the SYNOPSIS section, where the rest
+ of the function is specified in bold.</para>
+ </blockquote>
+ A look through the contents of the
+ <filename>man/man2</filename> directory shows that most
+ (all) existing pages do follow this <quote>everything in
+ funcsynopsis bold</quote> rule. That means the
+ <tag>type</tag> content and any punctuation (parens,
+ semicolons, <tag>vararg</tag>s) also must be bolded.</para>
+ </listitem>
+ <!-- ======================================================= -->
+ <listitem>
+ <para>Removed code for adding backslashes before periods/dots
+ in roff source, because backslashes in front of periods/dots
+ in roff source are needed only in the very rare case where a
+ period is the very first character in a line, without any
+ space in front of it. A better way to deal with that rare case
+ is for you to add a zero-width space in front of the offending
+ dot(s) in your source</para>
+ </listitem>
+ <!-- ======================================================= -->
+ <listitem>
+ <para>Removed special handling of the <tag>quote</tag>
+ element. That was hard-coded to cause anything marked up with
+ the <tag>quote</tag> element to be output preceded by two
+ backticks and followed by two apostrophes -- that is, that
+ old-school kludge for generating <quote>curly</quote> quotes in Emacs and
+ in X-Windows fonts. While Emacs still seems to support that, I
+ don't think X-Windows has for a long time now. And, anyway, it
+ looks (and has always looked) like crap when viewed on a
+ normal tty/console. In addition, it breaks localiztion of
+ <tag>quote</tag>. By default, <tag>quote</tag> content is
+ output with localized quotation marks, which, depending on the
+ locale, may or may not be left and right double quotation
+ marks.</para>
+ </listitem>
+ <!-- ======================================================= -->
+ <listitem>
+ <para>Changed mappings for left and right single quotation
+ marks. Those had previously been incorrectly mapped to the
+ backtick (&amp;#96;) and apostrophe (&amp;39;) characters (for
+ kludgy reasons -- see above). They are now correctly mapped to
+ the <literal>\(oq</literal> and <literal>\(cq</literal> roff
+ escapes. If you want the old (broken) behavior, you need to
+ manually change the mappings for those in the value of the
+ <parameter>man.string.subst.map</parameter> parameter.</para>
+ </listitem>
+ <listitem>
+ <para>Removed <filename>xref.xsl</filename> file. Now, of the
+ various cross-reference elements, only the <tag>ulink</tag>
+ element is handled differently; the rest are handled exactly
+ as the HTML stylesheets handle them, except that no hypertext
+ links are generated. (Because there is no equivalent hypertext
+ mechanism is man pages.)</para>
+ </listitem>
+ <!-- ======================================================= -->
+ <listitem>
+ <para>New option for making <quote>subheading dividers</quote> in generated
+ roff source. The dividers are not visible in the rendered man
+ page; they are just there to make the source
+ readable. Controlled using
+ <parameter>man.subheading.divider</parameter>.</para>
+ </listitem>
+ <!-- ======================================================= -->
+ <listitem>
+ <para>Fixed many places where too much space was being added
+ between lines.</para>
+ </listitem>
+ </itemizedlist>
+ <!-- end of MAN changes for 1.69.0 release -->
+ </sect2>
+</sect1>
+ <!-- end of notes for 1.69.0 release -->
+
+ <sect1 xml:id="V1681">
+ <title>Release 1.68.1</title>
+ <para>The release adds localization support for Farsi (thanks to
+ Sina Heshmati) and improved support for the XLink-based DocBook NG
+ <tag>db:link</tag> element. Other than that, it is a minor
+ bug-fix update to the 1.68.0 release. The main thing it fixes is a
+ build error that caused the XSLT Java extensions to be jarred up
+ with the wrong package structure. Thanks to Jens Stavnstrup for
+ quickly reporting the problem, and to Mauritz Jeanson for
+ investigating and finding the cause.</para>
+ </sect1>
+ <!-- end of notes for 1.68.1 release -->
+
+ <sect1 xml:id="V1680">
+ <title>Release 1.68.0</title>
+ <para>This release includes some features changes, particularly
+ for FO/PDF output, and a number of bug fixes.
+ <itemizedlist xml:id="V1680_FO">
+ <title>FO</title>
+ <listitem>
+ <para>Moved footnote properties to attribute-sets.</para>
+ </listitem>
+ <listitem>
+ <para>Added support for side floats, margin notes, and
+ custom floats.</para>
+ </listitem>
+ <listitem>
+ <para>Added new parameters
+ <parameter>body.start.indent</parameter> and
+ <parameter>body.end.indent</parameter> to the
+ <parameter>set.flow.properties template</parameter>.</para>
+ </listitem>
+ <listitem>
+ <para>Added support for <tag class="attribute">xml:id</tag></para>
+ </listitem>
+ <listitem>
+ <para>Added support for
+ <tag>refdescriptor</tag>.</para>
+ </listitem>
+ <listitem>
+ <para>Added support for multiple <tag>refnamediv</tag>s.</para>
+ </listitem>
+ <listitem>
+ <para>Added <parameter>index.entry.properties</parameter>
+ attribute-set to support customization of index
+ entries.</para>
+ </listitem>
+ <listitem>
+ <para>Added <parameter>set.flow.properties
+ template</parameter> call to each <tag>fo:flow</tag>
+ to support customizations entry point.</para>
+ </listitem>
+ <listitem>
+ <para>Add support for <literal>@floatstyle</literal> in
+ <tag>figure</tag></para>
+ </listitem>
+ <listitem>
+ <para>Moved hardcoded properties for index division titles
+ to the <parameter>index.div.title.properties</parameter>
+ attribute-set.</para>
+ </listitem>
+ <listitem>
+ <para>Added support for
+ <tag>table-layout</tag>="<tag class="attvalue">auto</tag>" for XEP.</para>
+ </listitem>
+ <listitem>
+ <para>Added <parameter>index.div.title.properties</parameter>
+ attribute-set.</para>
+ </listitem>
+ <listitem>
+ <para><parameter>$verbose</parameter> parameter is now
+ passed to most elements.</para>
+ </listitem>
+ <listitem>
+ <para>Added <tag>refentry</tag> to
+ <tag>toc</tag> in <tag>part</tag>, as it is
+ permitted by the DocBook schema/DTD.</para>
+ </listitem>
+ <listitem>
+ <para>Added backmatter elements and
+ <tag>article</tag> to <tag>toc</tag> in
+ <tag>part</tag>, since they are permitted by the
+ DocBook schema/DTD.</para>
+ </listitem>
+ <listitem>
+ <para>Added <tag class="attribute">mode</tag>="<tag class="attvalue">toc</tag>" for
+ <tag>simplesect</tag>, since it is now permitted in
+ the <tag>toc</tag> if
+ <parameter>simplesect.in.toc</parameter> is set.</para>
+ </listitem>
+ <listitem>
+ <para>Moved hard-coded properties to
+ <parameter>nongraphical.admonintion.properties</parameter>
+ and <parameter>graphical.admonition.properties</parameter>
+ attribute sets.</para>
+ </listitem>
+ <listitem>
+ <para>Added support for <literal>sidebar-width</literal> and
+ <literal>float-type</literal> processing instructions in
+ <tag>sidebar</tag>.</para>
+ </listitem>
+ <listitem>
+ <para>For tables with HTML markup elements, added support
+ for <literal>dbfo bgcolor</literal> PI, the attribute-sets
+ named <parameter>table.properties</parameter>,
+ <parameter>informaltable.properties</parameter>,
+ <parameter>table.table.properties</parameter>, and
+ <parameter>table.cell.padding</parameter>. Also added
+ support for the templates named
+ <parameter>table.cell.properties</parameter> and
+ <parameter>table.cell.block.properties</parameter> so that
+ tabstyles can be implemented. Also added support for tables
+ containing only <tag>tr</tag> instead of
+ <tag>tbody</tag> with <tag>tr</tag>.</para>
+ </listitem>
+ <listitem>
+ <para>Added new paramater
+ <parameter>hyphenate.verbatim.characters</parameter> which
+ can specify characters after which a line break can occur in
+ verbatim environments. This parameter can be used to extend
+ the initial set of characters which contain only space and
+ non-breakable space.</para>
+ </listitem>
+ <listitem>
+ <para>Added <parameter>itemizedlist.label.markup</parameter> to enable
+ selection of different bullet symbol. Also added several
+ potential bullet characters, commented out by default.</para>
+ </listitem>
+ <listitem>
+ <para>Enabled all id's in XEP output for external olinking.</para>
+ </listitem>
+ </itemizedlist>
+
+ <itemizedlist xml:id="V1680_HTML">
+ <title>HTML</title>
+ <listitem>
+ <para>Added support for
+ <tag>refdescriptor</tag>.</para>
+ </listitem>
+ <listitem>
+ <para>Added support for multiple <tag>refnamediv</tag>s.</para>
+ </listitem>
+ <listitem>
+ <para>Added support for <tag class="attribute">xml:id</tag></para>
+ </listitem>
+ <listitem>
+ <para><tag>refsynopsisdiv</tag> as a section for
+ counting section levels</para>
+ </listitem>
+ </itemizedlist>
+ <itemizedlist xml:id="V1680_images">
+ <title>Images</title>
+ <listitem>
+ <para>Added new SVG admonition graphics and navigation images.</para>
+ </listitem>
+ </itemizedlist>
+ </para>
+ </sect1>
+ <!-- end of notes for 1.68.0 release -->
+
+ <sect1 xml:id="V1672">
+ <title>Release 1.67.2</title>
+ <para>This release fixes a table bug introduced in the 1.67.1
+ release.</para>
+ </sect1>
+ <sect1 xml:id="V1671">
+ <title>Release 1.67.1</title>
+ <para>This release includes a number of bug fixes.</para>
+ <para>The following lists provide details about API and feature changes.
+ <itemizedlist xml:id="V1671_FO">
+ <title>FO</title>
+ <listitem>
+ <para>Tables: Inherited cell properties are now passed to the
+ <literal>table.cell.properties</literal> template so they can
+ be overridden by a customization.</para>
+ </listitem>
+ <listitem>
+ <para>Tables: Added support for bgcolor PI on table row
+ element.</para>
+ </listitem>
+ <listitem>
+ <para>TOCs: Added new parameter
+ <parameter>simplesect.in.toc</parameter>; default value of
+ <literal>0</literal> causes simplesect to be omitted from TOCs; to
+ cause <tag>simplesect</tag> to be included in TOCs, you
+ must set the value of <parameter>simplesect.in.toc</parameter> to
+ <literal>1</literal>.Comment from Norm:
+
+ <blockquote>
+ <para><emphasis>Simplesect elements aren't supposed to
+ appear in the ToC at all... The use case for simplesect
+ is when, for example, every chapter in a book ends with
+ "Exercises" or "For More Information" sections and you
+ don't want those to appear in the ToC.</emphasis></para>
+ </blockquote>
+ </para>
+ </listitem>
+ <listitem>
+ <para>Sections: Reverted change that caused a variable reference
+ to be used in a template match and rewrote code to preserve
+ intended semantics.</para>
+ </listitem>
+ <listitem>
+ <para>Lists: Added workaround to prevent "* 0.60 + 1em" garbage in
+ list output from PassiveTeX</para>
+ </listitem>
+ <listitem>
+ <para>Moved the literal attributes from
+ <parameter>component.title</parameter> to the
+ <parameter>component.title.properties</parameter> attribute-set so
+ they can be customized.</para>
+ </listitem>
+ <listitem>
+ <para>Lists: Added <tag>glossdef</tag>'s first
+ <tag>para</tag> to special handling in
+ <literal>fo:list-item-body</literal>.</para>
+ </listitem>
+ </itemizedlist>
+
+ <itemizedlist xml:id="V1671_HTML">
+ <title>HTML</title>
+ <listitem>
+ <para>TOCs: Added new parameter
+ <parameter>simplesect.in.toc</parameter>; for details, see
+ the list of <xref linkend="V1671_FO"/> changes for this
+ release.</para>
+ </listitem>
+ <listitem>
+ <para>Indexing: Added new parameter
+ <parameter>index.prefer.titleabbrev</parameter>; when set to
+ <literal>1</literal>, index references will use
+ <tag>titleabbrev</tag> instead of
+ <tag>title</tag> when available.</para>
+ </listitem>
+ </itemizedlist>
+ <itemizedlist xml:id="V1671_HELP">
+ <title>HTML Help</title>
+ <listitem>
+ <para>Added support for generating windows-1252-encoded
+ output using Saxon; for more details, see the list of <xref linkend="V1671_EXT"/> changes for this release.</para>
+ </listitem>
+ </itemizedlist>
+ <itemizedlist xml:id="V1671_MAN">
+ <title>man pages</title>
+ <listitem>
+ <para>Replaced named/numeric character-entity references for
+ non-breaking space with groff equivalent (backslash-tilde).</para>
+ </listitem>
+ </itemizedlist>
+ <itemizedlist xml:id="V1671_EXT">
+ <title>XSL Java extensions</title>
+ <listitem>
+ <para>Saxon extensions: Added the
+ <classname>Windows1252</classname> class. It extends Saxon
+ 6.5.x with the windows-1252 character set, which is
+ particularly useful when generating HTML Help for Western
+ European Languages (code from
+ <personname><firstname>Pontus</firstname>
+ <surname>Haglund</surname></personname> and contributed to the
+ DocBook community by Sectra AB, Sweden).</para>
+ <para>To use:
+ <orderedlist>
+ <listitem>
+ <para>Make sure that the Saxon 6.5.x jar file and the jar file for
+ the DocBook XSL Java extensions are in your <envar>CLASSPATH</envar></para>
+ </listitem>
+ <listitem>
+ <para>Create a DocBook XSL customization layer -- a file named
+ <filename>mystylesheet.xsl</filename> or whatever -- that, at a
+ minimum, contains the following:
+ <screen> &lt;xsl:stylesheet
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version='1.0'&gt;
+ &lt;xsl:import href="http://docbook.sourceforge.net/release/xsl/current/htmlhelp/htmlhelp.xsl"/&gt;
+ &lt;xsl:output method="html" encoding="WINDOWS-1252" indent="no"/&gt;
+ &lt;xsl:param name="htmlhelp.encoding" select="'WINDOWS-1252'"&gt;&lt;/xsl:param&gt;
+ &lt;xsl:param name="chunker.output.encoding" select="'WINDOWS-1252'"&gt;&lt;/xsl:param&gt;
+ &lt;xsl:param name="saxon.character.representation" select="'native'"&gt;&lt;/xsl:param&gt;
+ &lt;/xsl:stylesheet&gt;</screen>
+ </para>
+ <para>Invoke Saxon with the
+ <literal>encoding.windows-1252</literal> Java system property set
+ to <literal>com.nwalsh.saxon.Windows1252</literal>; for example
+ <screen> java \
+ -Dencoding.windows-1252=com.nwalsh.saxon.Windows1252 \
+ com.icl.saxon.StyleSheet \
+ mydoc.xml mystylesheet.xsl</screen>
+
+ Or, for a more complete "real world" case showing other
+ options you'll typically want to use:
+ <screen> java \
+ -Dencoding.windows-1252=com.nwalsh.saxon.Windows1252 \
+ -Djavax.xml.parsers.DocumentBuilderFactory=org.apache.xerces.jaxp.DocumentBuilderFactoryImpl \
+ -Djavax.xml.parsers.SAXParserFactory=org.apache.xerces.jaxp.SAXParserFactoryImpl \
+ -Djavax.xml.transform.TransformerFactory=com.icl.saxon.TransformerFactoryImpl \
+ com.icl.saxon.StyleSheet \
+ -x org.apache.xml.resolver.tools.ResolvingXMLReader \
+ -y org.apache.xml.resolver.tools.ResolvingXMLReader \
+ -r org.apache.xml.resolver.tools.CatalogResolver \
+ mydoc.xml mystylesheet.xsl</screen>
+
+ In both cases, the "mystylesheet.xsl" file should be a
+ DocBook customization layer containing the parameters
+ show in step 2.</para>
+ </listitem>
+ </orderedlist>
+ </para>
+ </listitem>
+ <listitem>
+ <para>Saxon extensions: Removed Saxon 8 extensions from release package</para>
+ </listitem>
+ </itemizedlist>
+ </para>
+ </sect1>
+<sect1 xml:id="V1670">
+ <title>Release 1.67.0</title>
+ <itemizedlist>
+ <listitem>
+ <para>A number of important bug fixes.</para>
+ </listitem>
+ <listitem>
+ <para>Added Saxon8 extensions</para>
+ </listitem>
+ <listitem>
+ <para>Enabled <literal>dbfo table-width</literal> on
+ <tag>entrytbl</tag> in FO output</para>
+ </listitem>
+ <listitem>
+ <para>Added support for <literal>role=strong</literal> on
+ <tag>emphasis</tag> in FO output</para>
+ </listitem>
+ <listitem>
+ <para>Added new FO parameter
+ <parameter>hyphenate.verbatim</parameter> that can be used to turn
+ on "intelligent" wrapping of verbatim environments.</para>
+ </listitem>
+ <listitem>
+ <para>Replaced all <literal>&lt;tt&gt;&lt;/tt&gt;</literal> output with
+ <literal>&lt;code&gt;&lt;/code&gt;</literal></para>
+ </listitem>
+ <listitem>
+ <para>Changed <literal>admon.graphic.width</literal> template to a
+ mode so that different admonitions can have different graphical
+ widths.</para>
+ </listitem>
+ <listitem>
+ <para>Deprecated the HTML <parameter>shade.verbatim</parameter>
+ parameter (use CSS instead)</para>
+ </listitem>
+ <listitem>
+ <para>Wrapped ToC
+ <tag>refentrytitle</tag>/<tag>refname</tag> and
+ <tag>refpurpose</tag> in span with class values. This
+ makes it possible to style them using a CSS stylesheet.</para>
+ </listitem>
+ <listitem>
+ <para>Use <literal>strong/em</literal> instead of
+ <literal>b/i</literal> in HTML output</para>
+ </listitem>
+ <listitem>
+ <para>Added support for converting <tag>Emphasis</tag> to
+ groff italic and <tag>Emphasis role='bold'</tag> to
+ bold. Controlled by
+ <parameter>emphasis.propagates.style</parameter> param, but not
+ documented yet using litprog system. Will do that next (planning
+ to add some other parameter-controllable options for hyphenation
+ and handling of line spacing).</para>
+ </listitem>
+ <listitem>
+ <para><parameter>callout.graphics.number.limit.xml</parameter>
+ param: Changed the default from <literal>10</literal> to
+ <literal>15</literal>.</para>
+ </listitem>
+ <listitem>
+ <para><parameter>verbatim.properties</parameter>: Added
+ <literal>hyphenate=false</literal></para>
+ </listitem>
+ <listitem>
+ <para>Saxon and Xalan Text.java extensions: Added support for
+ <methodname>URIResolver()</methodname> on insertfile href's</para>
+ </listitem>
+ <listitem>
+ <para>Added generated <filename>RELEASE-NOTES.txt</filename>
+ file.</para>
+ </listitem>
+ <listitem>
+ <para>Added <filename>INSTALL</filename> file (executable file for
+ generating catalog.xml)</para>
+ </listitem>
+ <listitem>
+ <para>Removed obsolete <filename>tools</filename> directory from
+ package</para>
+ </listitem>
+</itemizedlist>
+</sect1>
+<sect1 xml:id="V1661">
+<title>Release 1.66.1</title>
+ <itemizedlist>
+<listitem>
+<para>A number of important bug fixes.
+</para>
+</listitem>
+<listitem>
+<para>
+Now <literal>xml:base</literal> attributes that are generated by an
+XInclude processor are resolved for image files.
+</para>
+</listitem>
+<listitem>
+<para>
+Rewrote olink templates to support several new features.
+</para>
+<itemizedlist>
+<listitem>
+<para>
+Extended full olink support to FO output.
+</para>
+</listitem>
+<listitem>
+<para>
+Add support for <literal>xrefstyle</literal> attribute in olinks.
+</para>
+</listitem>
+<listitem>
+<para>
+New parameters to support new olink features:
+<parameter>insert.olink.page.number</parameter>, <parameter>insert.olink.pdf.frag</parameter>,
+<parameter>olink.debug</parameter>, <parameter>olink.lang.fallback.sequence</parameter>, <parameter>olink.properties</parameter>,
+<parameter>prefer.internal.olink</parameter>.
+See the reference page for each parameter for more
+information.</para>
+</listitem>
+</itemizedlist>
+</listitem>
+<listitem>
+<para>
+Added <parameter>index.on.type</parameter> parameter for new <tag class="attribute">type</tag>
+attribute introduced in DocBook 4.3 for indexterms and index.
+This allows you to create multiple indices containing
+different categories of entries.
+For users of 4.2 and earlier, you can use the new parameter <parameter>index.on.role</parameter>
+instead.
+</para>
+</listitem>
+<listitem>
+<para>
+Added new
+<parameter>section.autolabel.max.depth</parameter> parameter to turn off section numbering
+below a certain depth.
+This permits you to number major section levels and leave minor
+section levels unnumbered.</para>
+</listitem>
+<listitem>
+<para>
+Added <parameter>footnote.sep.leader.properties</parameter> attribute set to format
+the line separating footnotes in printed output.
+</para>
+</listitem>
+<listitem>
+<para>
+Added parameter <parameter>img.src.path</parameter> as a prefix to HTML img src
+attributes.
+The prefix is added to whatever path is already generated by the
+stylesheet for each image file.</para>
+</listitem>
+<listitem>
+<para>
+Added new attribute-sets
+<parameter>informalequation.properties</parameter>,
+<parameter>informalexample.properties</parameter>,
+<parameter>informalfigure.properties</parameter>, and <parameter>informaltable.properties</parameter>,
+so each such element type can be formatted
+individually if needed.
+</para>
+</listitem>
+<listitem>
+<para>
+Add <parameter>component.label.includes.part.label</parameter>
+parameter to add any part number to chapter, appendix
+and other component labels when
+the <parameter>label.from.part</parameter> parameter is nonzero.
+This permits you to distinguish multiple chapters with the same
+chapter number in cross references and the TOC.</para>
+</listitem>
+<listitem>
+<para>
+Added <parameter>chunk.separate.lots</parameter> parameter for HTML output.
+This parameter lets you generate separate chunk files for each LOT
+(list of tables, list of figures, etc.).</para>
+</listitem>
+<listitem>
+<para>Added several table features:</para>
+<itemizedlist>
+<listitem>
+<para>
+Added <parameter>table.table.properties</parameter> attribute set to add
+properties to the fo:table element.
+</para>
+</listitem>
+<listitem>
+<para>
+Added placeholder templates named <literal>table.cell.properties</literal>
+and <literal>table.cell.block.properties</literal> to enable adding properties
+to any <tag>fo:table-cell</tag> or the cell's <tag>fo:block</tag>, respectively.
+ These templates are a start for implementing table styles.</para>
+</listitem>
+</itemizedlist>
+</listitem>
+<listitem>
+<para>
+Added new attribute
+set <parameter>component.title.properties</parameter> for easy modifications of
+component's title formatting in FO output.
+</para>
+</listitem>
+<listitem>
+<para>
+Added Saxon support for an <tag class="attribute">encoding</tag> attribute on the <tag class="element">textdata</tag> element. Added new parameter
+<parameter>textdata.default.encoding</parameter> which specifies encoding when
+<tag class="attribute">encoding</tag> attribute on
+<tag class="element">textdata</tag> is missing.
+</para>
+</listitem>
+<listitem>
+<para>
+Template <literal>label.this.section</literal> now controls whole
+section label, not only sub-label which corresponds to
+particular label. Former behaviour was IMHO bug as it was
+not usable.
+</para>
+</listitem>
+<listitem>
+<para>
+Formatting in titleabbrev for TOC and headers
+is preserved when there are no hotlink elements in the title. Formerly the title showed only the text of the title, no font changes or other markup.
+</para>
+</listitem>
+<listitem>
+<para>
+Added <literal>intial.page.number</literal> template to set the <literal>initial-page-number
+property</literal> for page sequences in print output.
+Customizing this template lets you change when page numbering restarts. This is similar to the <literal>format.page.number</literal> template that lets you change how the page number formatting changes in the output.
+</para>
+</listitem>
+<listitem>
+<para>
+Added <literal>force.page.count</literal> template to set the force-page-count
+property for page sequences in print output.
+This is similar to the <literal>format.page.number</literal> template.
+</para>
+</listitem>
+<listitem>
+<para>
+Sort language for localized index sorting in <filename>autoidx-ng.xsl</filename> is now taken from document
+lang, not from system environment.
+</para>
+</listitem>
+<listitem>
+<para>
+Numbering and formatting of normal
+and ulink footnotes (if turned on) has been unified.
+Now ulink footnotes are mixed in with any other footnotes.</para>
+</listitem>
+<listitem>
+<para>
+Added support for <tag>renderas</tag> attribute in section and
+sect1 et al.
+This permits you to render a given section title as if it were a different level.</para>
+</listitem>
+<listitem>
+<para>
+Added support for <tag>label</tag> attribute in footnote to manually
+supply the footnote mark.
+</para>
+</listitem>
+<listitem>
+<para>
+Added support for DocBook 4.3 <tag>corpcredit</tag> element.
+</para>
+</listitem>
+<listitem>
+<para>
+Added support for a <literal>dbfo keep-together</literal> PI for
+formal objects (table, figure, example, equation, programlisting). That permits a formal object to be kept together if it is not already, or to be broken if it
+is very long and the
+default keep-together is not appropriate.
+</para>
+</listitem>
+<listitem>
+<para>
+For graphics files, made file extension matching case
+insensitive, and updated the list of graphics extensions.
+</para>
+</listitem>
+<listitem>
+<para>
+Allow <tag>calloutlist</tag> to have block content before
+the first callout
+</para>
+</listitem>
+<listitem>
+<para>
+Added <literal>dbfo-need</literal> processing instruction to provide
+soft page breaks.
+</para>
+</listitem>
+<listitem>
+<para>
+Added implementation of existing but unused
+<parameter>default.image.width</parameter> parameter for graphics.
+</para>
+</listitem>
+<listitem>
+<para>
+Support DocBook NG <tag>tag</tag> inline element.
+</para>
+</listitem>
+<listitem>
+<para>
+It appears that XEP now supports Unicode characters in
+bookmarks. There is no further need to strip accents from
+characters.
+</para>
+</listitem>
+<listitem>
+<para>
+Make <tag>segmentedlist</tag> HTML markup
+more semantic and available to CSS styles.
+</para>
+</listitem>
+<listitem>
+<para>
+Added <literal>user.preroot</literal> placeholder template to
+permit xsl-stylesheet and other PIs and comments to be
+output before the HTML root element.
+</para>
+</listitem>
+<listitem>
+<para>
+Non-chunked legalnotice now gets an &lt;a
+name="id"&gt; element in HTML output
+so it can be referenced with xref or link.
+</para>
+</listitem>
+<listitem>
+<para>
+In chunked HTML output, changed <literal>link rel="home"</literal> to <literal>rel="start"</literal>,
+and <literal>link rel="previous"</literal> to <literal>rel="prev"</literal>, per W3C HTML 4.01
+spec.
+</para>
+</listitem>
+<listitem>
+<para>
+Added several patches to htmlhelp from W. Borgert
+</para>
+</listitem>
+<listitem>
+<para>
+Added Bosnian locale file as common/bs.xml.
+</para>
+</listitem>
+</itemizedlist>
+</sect1>
+<sect1 xml:id="V1650">
+<title>Release 1.65.0</title>
+<itemizedlist>
+<listitem>
+<para>A number of important bug fixes.
+</para>
+</listitem>
+<listitem>
+<para>Added a workaround to allow these stylesheets to process DocBook NG
+documents. (It’s a hack that pre-processes the document to strip off the
+namespace and then uses <function>exsl:node-set</function> to process
+the result.)
+</para>
+</listitem>
+<listitem>
+<para>Added alternative indexing mechanism which has better
+internationalization support. New indexing method allows grouping of
+accented letters like e, é, ë into the same group under letter "e". It
+can also treat special letters (e.g. "ch") as one character and place
+them in the correct position (e.g. between "h" and "i" in Czech
+language).</para>
+<para>In order to use this mechanism you must create customization
+layer which imports some base stylesheet (like
+<filename>fo/docbook.xsl</filename>,
+<filename>html/chunk.xsl</filename>) and then includes appropriate
+stylesheet with new indexing code
+(<filename>fo/autoidx-ng.xsl</filename> or
+<filename>html/autoidx-ng.xsl</filename>). For example:</para>
+<programlisting>&lt;xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="1.0"&gt;
+
+&lt;xsl:import href="http://docbook.sourceforge.net/release/xsl/current/fo/docbook.xsl"/&gt;
+&lt;xsl:include href="http://docbook.sourceforge.net/release/xsl/current/fo/autoidx-ng.xsl"/&gt;
+
+&lt;/xsl:stylesheet&gt;</programlisting>
+<para>New method is known to work with Saxon and it should also work
+with xsltproc 1.1.1 and later. Currently supported languages are
+English, Czech, German, French, Spanish and Danish.</para>
+</listitem>
+</itemizedlist>
+</sect1>
+<sect1 xml:id="V1641">
+<title>Release 1.64.1</title>
+<itemizedlist>
+<para>General bug fixes and improvements. Sorry about the failure to produce
+an updated release notes file for 1.62.0—1.63.2</para>
+<listitem>
+<para>In the course of fixing bug #849787, wrapping Unicode callouts
+with an appropriate font change in the Xalan extensions, I discovered
+that the Xalan APIs have changed a bit. So <filename>xalan2.jar</filename>
+will work with older Xalan 2 implementations, <filename>xalan25.jar</filename>
+works with Xalan 2.5.</para>
+</listitem>
+</itemizedlist>
+</sect1>
+<sect1 xml:id="V1610">
+<title>Release 1.61.0</title>
+<itemizedlist>
+<para>Lots of bug fixes and improvements.</para>
+<listitem>
+<para>Initial support for timestamp PI. From now you
+ can use &lt;?dbtimestamp format="Y-m-d H:M:S"?&gt; to get current
+ datetime in your document. Added localization support for datetime PI
+</para>
+</listitem>
+<listitem>
+<para>Added level 6 to test for <tag>section</tag> depth in
+section.level template so that
+section.title.level6.properties will be used for sections
+that are 6 deep or deeper. This should also cause a h6 to be
+created in html output.
+</para>
+</listitem>
+<listitem>
+<para>Don't use SVG graphics if <parameter>use.svg</parameter>=0
+</para>
+</listitem>
+<listitem>
+<para>Now uses number-and-title-template for sections
+ only if <parameter>section.autolabel</parameter> is not zero.
+</para>
+</listitem>
+<listitem>
+<para>Added missing 'english-language-name' attribute to
+the l10n element, and the missing 'style' attribute to the
+template element so the current gentext documents will
+validate.
+</para>
+</listitem>
+<listitem>
+<para>Corrected several references to parameter
+ <parameter>qanda.defaultlabel</parameter> that were missing the "$".
+</para>
+</listitem>
+<listitem>
+<para>Now accepts <parameter>admon.textlabel</parameter> parameter to turn off
+ Note, Warning, etc. label.
+</para>
+</listitem>
+<listitem>
+<para>FeatReq #684561: support more XEP metadata
+</para>
+</listitem>
+<listitem>
+<para>Added hyphenation support. Added support for <tag>coref</tag>.
+Added <tag>beginpage</tag> support. (does nothing; see TDG).
+</para>
+</listitem>
+<listitem>
+<para>Added support for
+hyphenation-character, hyphenation-push-character-count, and
+hyphenation-remain-character-count
+</para>
+</listitem>
+<listitem>
+<para>Added <parameter>root.properties</parameter>,
+<parameter>ebnf.assignment</parameter>,
+and <parameter>ebnf.statement.terminator</parameter>
+</para>
+</listitem>
+<listitem>
+<para>Support bgcolor PI in table cells; make sure
+rowsep and colsep don't have any effect on the last row or
+column
+</para>
+</listitem>
+<listitem>
+<para>Handle <tag>othercredit</tag> on titlepage a little
+better
+</para>
+</listitem>
+<listitem>
+<para>Applied fix from Jeff Beal that fixed the bug
+that put secondary page numbers on primary entries. Same
+with tertiary page numbers on secondary entries.
+</para>
+</listitem>
+<listitem>
+<para>Added definition of missing variable
+<parameter>collection</parameter>.
+</para>
+</listitem>
+<listitem>
+<para>Make <tag>footnote</tag> formatting 'normal' even when it
+occurs in a context that has special formatting
+</para>
+</listitem>
+<listitem>
+<para>Added warning when <parameter>glossary.collection</parameter> is not
+blank, but it cannot open the specified file.
+</para>
+</listitem>
+<listitem>
+<para>Pick up the frame attribute on <tag>table</tag> and
+<tag>informaltable</tag>.
+</para>
+</listitem>
+<listitem>
+<para><tag>indexdiv</tag>/<tag>title</tag>
+in non-autogenerated indexes are
+now picked up.
+</para>
+</listitem>
+<listitem>
+<para>Removed (unused)
+component.title.properties
+</para>
+</listitem>
+<listitem>
+<para>Move IDs from
+page-sequences down to titlepage blocks
+</para>
+</listitem>
+<listitem>
+<para>Use
+proportional-column-width(1) on more <tag>table</tag>s.
+</para>
+<para>Use proportional-column-width() for
+header/footer tables; suppress relative-align when when
+using FOP
+</para>
+</listitem>
+<listitem>
+<para>Check for <parameter>glossterm.auto.link</parameter> when linking
+firstterms; don't output gl. prefix on glossterm links
+</para>
+</listitem>
+<listitem>
+<para>Generate Part ToCs
+</para>
+</listitem>
+<listitem>
+<para>Support <tag>glossary</tag>, <tag>bibliography</tag>,
+and <tag>index</tag> in component ToCs.
+</para>
+</listitem>
+<listitem>
+<para>Refactored chunking code so that
+customization of chunk algorithm and chunk elements is more
+practical
+</para>
+</listitem>
+<listitem>
+<para>Support <tag>textobject</tag>/<tag>phrase</tag>
+on <tag>inlinemediaobject</tag>.
+</para>
+</listitem>
+<listitem>
+<para>Support 'start' PI on ordered lists
+</para>
+</listitem>
+<listitem>
+<para>Fixed test of $toc PI to turn on qandaset TOC.
+</para>
+</listitem>
+<listitem>
+<para>Added process.chunk.footnotes to sect2 through
+5 to fix bug of missing footnotes when chunk level greater
+than 1.
+</para>
+</listitem>
+<listitem>
+<para>Added
+paramater <parameter>toc.max.depth</parameter> which controls maximal depth of ToC
+as requested by PHP-DOC group.
+</para>
+</listitem>
+<listitem>
+<para>Exempted <tag>titleabbrev</tag> from preamble processing in
+lists, and fixed variablelist preamble code to use the same
+syntax as the other lists.
+</para>
+</listitem>
+<listitem>
+<para>Added support for elements between variablelist
+and first varlistentry since DocBook 4.2 supports that now.
+</para>
+</listitem>
+</itemizedlist>
+</sect1>
+<sect1 xml:id="V1601">
+<title>Release 1.60.1</title>
+<itemizedlist>
+<para>Lots of bug fixes.</para>
+<listitem>
+<para>The format of the <filename>titlepage.templates.xml</filename> files and
+the stylesheet that transforms them have been significantly changed. All of the
+attributes used to control the templates are now namespace qualified. So what
+used to be:</para>
+<programlisting>&lt;t:titlepage element="article" wrapper="fo:block"&gt;</programlisting>
+<para>is now:</para>
+<programlisting>&lt;t:titlepage t:element="article" t:wrapper="fo:block"&gt;</programlisting>
+<para>Attributes from other namespaces (including those that are unqualified) are
+now copied directly through. In practice, this means that the names that used
+to be <quote>fo:</quote> qualified:</para>
+<programlisting>&lt;title named-template="component.title"
+ param:node="ancestor-or-self::article[1]"
+ fo:text-align="center"
+ fo:keep-with-next="always"
+ fo:font-size="&amp;hsize5;"
+ fo:font-weight="bold"
+ fo:font-family="{$title.font.family}"/&gt;</programlisting>
+<para>are now unqualified:</para>
+<programlisting>&lt;title t:named-template="component.title"
+ param:node="ancestor-or-self::article[1]"
+ text-align="center"
+ keep-with-next="always"
+ font-size="&amp;hsize5;"
+ font-weight="bold"
+ font-family="{$title.font.family}"/&gt;</programlisting>
+<para>The <tag>t:titlepage</tag> and <tag>t:titlepage-content</tag>
+elements both generate wrappers now. And unqualified attributes on those elements
+are passed through. This means that you can now make the title font apply to
+ane entire titlepage and make the entire <quote>recto</quote>
+titlepage centered by specifying the font and alignment on the those elements:</para>
+<programlisting>&lt;t:titlepage t:element="article" t:wrapper="fo:block"
+ font-family="{$title.font.family}"&gt;
+
+ &lt;t:titlepage-content t:side="recto"
+ text-align="center"&gt;</programlisting>
+
+
+
+
+
+</listitem>
+<listitem>
+<para>Support use of <tag>titleabbrev</tag> in running
+headers and footers.
+</para>
+</listitem>
+<listitem>
+<para>Added (experimental) <parameter>xref.with.number.and.title</parameter>
+parameter to enable number/title cross references even when the
+default would
+be just the number.
+</para>
+</listitem>
+<listitem>
+<para>Generate <tag>part</tag> ToCs if they're requested.
+</para>
+</listitem>
+<listitem>
+<para>Use proportional-column-width() in header/footer tables.
+</para>
+</listitem>
+<listitem>
+<para>Handle alignment correctly when <tag>screenshot</tag>
+wraps a graphic in a <tag>figure</tag>.
+</para>
+</listitem>
+<listitem>
+<para>Format <tag>chapter</tag> and <tag>appendix</tag>
+cross references consistently.
+</para>
+</listitem>
+<listitem>
+<para>Attempt to support tables with multiple <tag>tgroup</tag>s
+in FO.
+</para>
+</listitem>
+<listitem>
+<para>Output <tag>fo:table-columns</tag> in
+<tag>simplelist</tag> tables.
+</para>
+</listitem>
+<listitem>
+<para>Use <filename>titlepage.templates.xml</filename> for
+<tag>indexdiv</tag> and <tag>glossdiv</tag> formatting.
+</para>
+</listitem>
+<listitem>
+<para>Improve support for new bibliography elements.
+</para>
+</listitem>
+<listitem>
+<para>Added
+<parameter>footnote.number.format</parameter>,
+<parameter>table.footnote.number.format</parameter>,
+<parameter>footnote.number.symbols</parameter>, and
+<parameter>table.footnote.number.symbols</parameter> for better control of
+footnote markers.
+</para>
+</listitem>
+<listitem>
+<para>Added <tag>glossentry.show.acronyms</tag>.
+</para>
+</listitem>
+<listitem>
+<para>Suppress the draft-mode page masters when
+<parameter>draft-mode</parameter> is <quote>no</quote>.
+</para>
+</listitem>
+<listitem>
+<para>Make blank pages verso not recto. D'Oh!
+</para>
+</listitem>
+<listitem>
+<para>Improved formatting of <tag>ulink</tag> footnotes.
+</para>
+</listitem>
+<listitem>
+<para>Fixed bugs in graphic width/height calculations.
+</para>
+</listitem>
+<listitem>
+<para>Added class attributes to inline elements.
+</para>
+</listitem>
+<listitem>
+<para>Don't add <quote>.html</quote> to the filenames identified
+with the <quote>dbhtml</quote> PI.
+</para>
+</listitem>
+<listitem>
+<para>Don't force a ToC when sections contain <tag>refentry</tag>s.
+</para>
+</listitem>
+<listitem>
+<para>Make section title sizes a function of the
+<parameter>body.master.size</parameter>.
+</para>
+</listitem>
+</itemizedlist>
+</sect1>
+<sect1 xml:id="V1592">
+<title>Release 1.59.2</title>
+<itemizedlist>
+<para>The 1.59.2 fixes an FO bug in the page masters that causes FOP to fail.
+</para>
+<listitem>
+<para>Removed the region-name from the region-body of blank pages. There's
+no reason to give the body of blank pages a unique name and doing so causes
+a mismatch that FOP detects.
+</para>
+</listitem>
+<listitem>
+<para>Output IDs for the first paragraphs in listitems.
+</para>
+</listitem>
+<listitem>
+<para>Fixed some small bugs in the handling of page numbers in double-sided mode.
+</para>
+</listitem>
+<listitem>
+<para>Attempt to prevent duplicated IDs from being produced when
+<tag class="attribute">endterm</tag> on <tag>xref</tag> points
+to something with nested structure.
+</para>
+</listitem>
+<listitem>
+<para>Fix aligment problems in <tag>equation</tag>s.
+</para>
+</listitem>
+<listitem>
+<para>Output the type attribute on unordered lists (UL) in HTML only if
+the css.decoration parameter is true.
+</para>
+</listitem>
+<listitem>
+<para>Calculate the font size in formal.title.properties so that it's 1.2 times
+the base font size, not a fixed "12pt".
+</para>
+</listitem>
+</itemizedlist>
+</sect1>
+<sect1 xml:id="V1591">
+<title>Release 1.59.1</title>
+<itemizedlist>
+<para>The 1.59.1 fixes a few bugs.
+</para>
+<listitem>
+<para>Added Bulgarian localization.
+</para>
+</listitem>
+<listitem>
+<para>Indexing improvements; localize book indexes to books but allow setindex
+to index an entire set.
+</para>
+</listitem>
+<listitem>
+<para>The default value for rowsep and colsep is now "1" as per CALS.
+</para>
+</listitem>
+<listitem>
+<para>Added support for <tag>titleabbrev</tag> (use them for cross
+references).
+</para>
+</listitem>
+<listitem>
+<para>Improvements to <tag>mediaobject</tag> for selecting print vs. online
+images.
+</para>
+</listitem>
+<listitem>
+<para>Added seperate property sets for <tag>figure</tag>s,
+<tag>example</tag>s, <tag>equation</tag>s, <tag>tables</tag>s,
+and <tag>procedure</tag>s.
+</para>
+</listitem>
+<listitem>
+<para>Make <tag>lineannotation</tag>s italic.
+</para>
+</listitem>
+<listitem>
+<para>Support <tag class="attribute">xrefstyle</tag> attribute.
+</para>
+</listitem>
+<listitem>
+<para>Make <tag class="attribute">endterm</tag> on
+<tag>xref</tag> higher priority than
+<tag class="attribute">xreflabel</tag> target.
+</para>
+</listitem>
+<listitem>
+<para>Glossary formatting improvements.
+</para>
+</listitem>
+</itemizedlist>
+</sect1>
+<sect1 xml:id="V1580">
+<title>Release 1.58.0</title>
+<itemizedlist>
+<para>The 1.58.0 adds some initial support for extensions in xsltproc, adds
+a few features, and fixes bugs.
+</para>
+<listitem>
+<para>This release contains the first attempt at extension support for xsltproc.
+The only extension available to date is the one that adjusts table column widths.
+Run <filename>extensions/xsltproc/python/xslt.py</filename>.
+</para>
+</listitem>
+<listitem>
+<para>Fixed bugs in calculation of adjusted column widths to correct for rounding
+errors.
+</para>
+</listitem>
+<listitem>
+<para>Support nested <tag>refsection</tag> elements correctly.
+</para>
+</listitem>
+<listitem>
+<para>Reworked <literal>gentext.template</literal> to take context into consideration.
+The name of elements in localization files is now an xpath-like context list, not
+just a simple name.
+</para>
+</listitem>
+<listitem>
+<para>Made some improvements to bibliography formatting.
+</para>
+</listitem>
+<listitem>
+<para>Improved graphical formatting of admonitions.
+</para>
+</listitem>
+<listitem>
+<para>Added support for <tag>entrytbl</tag>.
+</para>
+</listitem>
+<listitem>
+<para>Support spanning index terms.
+</para>
+</listitem>
+<listitem>
+<para>Support <tag>bibliosource</tag>.
+</para>
+</listitem>
+</itemizedlist>
+</sect1>
+<sect1 xml:id="V1570">
+<title>Release 1.57.0</title>
+<itemizedlist>
+<listitem>
+<para>The 1.57.0 release wasn't documented here. Oops.
+</para>
+</listitem>
+</itemizedlist>
+</sect1>
+<sect1 xml:id="V1560">
+<title>Release 1.56.0</title>
+<itemizedlist>
+<para>The 1.56.0 release fixes bugs.
+</para>
+<listitem>
+<para>Reworked chunking. <emphasis>This will break all existing customizations
+layers that change the chunking algorithm.</emphasis> If you're customizing chunking,
+look at the new <quote>content</quote> parameter that's passed to
+<literal>process-chunk-element</literal> and friends.
+</para>
+</listitem>
+<listitem>
+<para>Support continued and inherited numeration in <tag>orderedlist</tag>
+formatting for FOs.
+</para>
+</listitem>
+<listitem>
+<para>Added Thai localization.
+</para>
+</listitem>
+<listitem>
+<para>Tweaked stylesheet documentation stylesheets to link to TDG and
+the parameter references.
+</para>
+</listitem>
+<listitem>
+<para>Allow title on tables of contents ("Table of Contents") to be optional.
+Added new keyword to <parameter>generate.toc</parameter>.
+Support tables of contents on sections.
+</para>
+</listitem>
+<listitem>
+<para>Made separate parameters for table borders and table cell borders:
+<parameter>table.frame.border.color</parameter>,
+<parameter>table.frame.border.style</parameter>,
+<parameter>table.frame.border.thickness</parameter>,
+<parameter>table.cell.border.color</parameter>,
+<parameter>table.cell.border.style</parameter>, and
+<parameter>table.cell.border.thickness</parameter>.
+</para>
+</listitem>
+<listitem>
+<para>Suppress formatting of <quote>endofrange</quote> <tag>indexterm</tag>s.
+This is only half-right. They should generate a range, but I haven't figured out how
+to do that yet.
+</para>
+</listitem>
+<listitem>
+<para>Support <tag>revdescription</tag>. (Bug #582192)
+</para>
+</listitem>
+<listitem>
+<para>Added <parameter>default.float.class</parameter> and fixed figure
+floats. (Bug #497603)
+</para>
+</listitem>
+<listitem>
+<para>Fixed formatting of <tag>sbr</tag> in FOs.
+</para>
+</listitem>
+<listitem>
+<para>Added context to the <quote>missing template</quote> error message.
+</para>
+</listitem>
+<listitem>
+<para>Process <tag>arg</tag> correctly in a <tag>group</tag>.
+(Bug #605150)
+</para>
+</listitem>
+<listitem>
+<para>Removed 'keep-with-next' from <parameter>formal.title.properties</parameter>
+attribute set now that the stylesheets support the option of putting
+such titles below the object. Now the $placement value determines if
+'keep-with-next' or 'keep-with-previous' is used in the title block.
+</para>
+</listitem>
+<listitem>
+<para>Wrap <quote>url()</quote> around external-destinations when appropriate.
+</para>
+</listitem>
+<listitem>
+<para>Fixed typo in compact list spacing. (Bug #615464)
+</para>
+</listitem>
+<listitem>
+<para>Removed spurious hash in anchor name. (Bug #617717)
+</para>
+</listitem>
+<listitem>
+<para>Address is now displayed verbatim on title pages. (Bug #618600)
+</para>
+</listitem>
+<listitem>
+<para>The <parameter>bridgehead.in.toc</parameter> parameter is now properly
+supported.
+</para>
+</listitem>
+<listitem>
+<para>Improved effectiveness of HTML cleanup by increasing the number
+of places where it is used. Improve use of HTML cleanup in XHTML stylesheets.
+</para>
+</listitem>
+<listitem>
+<para>Support table of contents for <tag>appendix</tag> in
+<tag>article</tag>. (Bug #596599)
+</para>
+</listitem>
+<listitem>
+<para>Don't duplicate footnotes in <tag>bibliography</tag>s and
+<tag>glossary</tag>s. (Bug #583282)
+</para>
+</listitem>
+<listitem>
+<para>Added <parameter>default.image.width</parameter>. (Bug #516859)
+</para>
+</listitem>
+<listitem>
+<para>Totally reworked <tag>funcsynopsis</tag> code; it now
+supports a 'tabular' presentation style for 'wide' prototypes; see
+<parameter>funcsynopsis.tabular.threshold</parameter>. (HTML only
+right now, I think, FO support, uh, real soon now.)
+</para>
+</listitem>
+<listitem>
+<para>Reworked support for difference marking; toned down the colors a bit
+and added a <quote>system.head.content</quote> template so that the diff CSS
+wasn't overriding <quote>user.head.content</quote>. (Bug #610660)
+</para>
+</listitem>
+<listitem>
+<para>Added call to the <quote>*.head.content</quote> elements when writing
+out long description chunks.
+</para>
+</listitem>
+<listitem>
+<para>Make sure <tag>legalnotice</tag> link is correct even when
+chunking to a different <parameter>base.dir</parameter>.
+</para>
+</listitem>
+<listitem>
+<para>Use CSS to set viewport characteristics if
+<parameter>css.decoration</parameter> is non-zero, use div instead of p for making
+graphic a block element; make figure <tag>title</tag>s the
+default alt
+text for images in a <tag>figure</tag>.</para>
+</listitem>
+<listitem>
+<para>Added space-after to <parameter>list.block.spacing</parameter>.
+</para>
+</listitem>
+<listitem>
+<para>Reworked section.level template to give <quote>correct</quote> answer
+instead of being off by one.
+</para>
+</listitem>
+<listitem>
+<para>When processing tables, use the <tag class="attribute">tabstyle</tag>
+attribute as the division class.
+</para>
+</listitem>
+<listitem>
+<para>Fixed bug in <filename>html2xhtml.xsl</filename> that was causing the
+XHTML chunker to output HTML instead of XHTML.
+</para>
+</listitem>
+</itemizedlist>
+</sect1>
+<sect1 xml:id="VOlder">
+ <title>Older releases</title>
+ <para>To view the release notes for older releases, see <uri xlink:href="http://cvs.sourceforge.net/viewcvs.py/docbook/xsl/RELEASE-NOTES.xml">http://cvs.sourceforge.net/viewcvs.py/docbook/xsl/RELEASE-NOTES.xml</uri>. Be
+ aware that there were no release notes for releases prior to the
+ 1.50.0 release.</para>
+</sect1>
+<sect1 xml:id="dot0">
+ <title>About dot-zero releases</title>
+ <para>DocBook Project “dot zero†releases should be
+ considered <emphasis>experimental</emphasis> and are always
+ followed by stable “dot one plus†releases, usually within
+ two or three weeks. Please help to ensure the stability of
+ “dot one plus†releases by carefully testing each
+ “dot zero†release and reporting back about any
+ problems you find. </para>
+ <para>It is not recommended that you use a “dot zeroâ€
+ release in a production system. Instead, you should wait for
+ the “dot one†or greater versions.</para>
+ </sect1>
+</article>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/TODO b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/TODO
new file mode 100644
index 0000000..1f421cd
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/TODO
@@ -0,0 +1,23 @@
+The "to do" list for the DocBook Project XSL stylesheets is
+maintained at Sourceforge. To view a list of all open feature
+requests for the stylesheets:
+
+ http://docbook.sf.net/tracker/xsl/requests
+
+To submit a feature request against the stylesheets:
+
+ http://docbook.sf.net/tracker/submit/request
+
+To do a full-text search of all DocBook Project issues:
+
+ http://docbook.sf.net/tracker/search
+
+Discussion about the DocBook Project XSL stylesheets takes place
+on the docbook-apps mailing list:
+
+ http://wiki.docbook.org/topic/DocBookAppsMailingList
+
+Real-time discussion takes place on IRC:
+
+ http://wiki.docbook.org/topic/DocBookIrcChannel
+ irc://irc.freenode.net/docbook
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/VERSION b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/VERSION
new file mode 100644
index 0000000..a073fbf
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/VERSION
@@ -0,0 +1,115 @@
+<?xml version='1.0'?> <!-- -*- nxml -*- vim: set foldlevel=2: -->
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:fm="http://freshmeat.net/projects/freshmeat-submit/"
+ xmlns:sf="http://sourceforge.net/"
+ xmlns:dyn="http://exslt.org/dynamic"
+ xmlns:saxon="http://icl.com/saxon"
+ exclude-result-prefixes="fm sf"
+ version='1.0'>
+
+<xsl:param name="get"/>
+<xsl:param name="VERSION" select="string(document('')//fm:Version[1])"/>
+<xsl:param name="Tag" select="concat('V',translate(string(document('')//fm:Version[1]),'.',''))"/>
+<xsl:param name="DistroTitle" select="string(document('')//fm:Branch[1])"/>
+<xsl:param name="sf-relid" select="0"/>
+
+<xsl:param name="DistroName">docbook-xsl</xsl:param>
+<xsl:param name="PreviousRelease">1.76.0</xsl:param>
+<xsl:param name="PreviousReleaseRevision">8900</xsl:param>
+<xsl:param name="Revision">$Revision: 8933 $</xsl:param>
+<xsl:param name="VersionFileURL">$URL: https://docbook.svn.sourceforge.net/svnroot/docbook/trunk/xsl/VERSION $</xsl:param>
+
+<xsl:strip-space elements="fm:*"/>
+
+<fm:project>
+ <fm:Project>DocBook</fm:Project>
+ <fm:Branch>XSL Stylesheets</fm:Branch>
+ <!-- * set/keep fm:version as N.NN.N-pre except for official releases, -->
+ <!-- * then after the release, revert it to N.NN.N-pre & check back in -->
+ <fm:Version>1.76.1</fm:Version>
+<!--
+ <fm:License>MIT/X Consortium License</fm:License>
+-->
+ <fm:Release-Focus>
+<!-- * Initial freshmeat announcement -->
+<!-- * Documentation -->
+<!-- * Code cleanup -->
+<!-- * Minor feature enhancements -->
+<!-- * Major feature enhancements -->
+* Minor bugfixes
+<!-- * Major bugfixes -->
+<!-- * Minor security fixes -->
+<!-- * Major security fixes -->
+ </fm:Release-Focus>
+ <fm:Home-Page-URL>http://sourceforge.net/projects/docbook/</fm:Home-Page-URL>
+ <fm:Gzipped-Tar-URL>http://prdownloads.sourceforge.net/docbook/{DISTRONAME-VERSION}.tar.gz?download</fm:Gzipped-Tar-URL>
+ <fm:Zipped-Tar-URL>http://prdownloads.sourceforge.net/docbook/{DISTRONAME-VERSION}.zip?download</fm:Zipped-Tar-URL>
+ <fm:Bzipped-Tar-URL>http://prdownloads.sourceforge.net/docbook/{DISTRONAME-VERSION}.bz2?download</fm:Bzipped-Tar-URL>
+ <fm:Changelog-URL>http://sourceforge.net/project/shownotes.php?release_id={SFRELID}</fm:Changelog-URL>
+ <fm:CVS-URL>http://docbook.svn.sourceforge.net/viewvc/docbook/</fm:CVS-URL>
+ <fm:Mailing-List-URL>http://lists.oasis-open.org/archives/docbook-apps/</fm:Mailing-List-URL>
+ <fm:Changes>This is a release with bugfixes and some enhancements.</fm:Changes>
+</fm:project>
+
+<xsl:template match="/" priority="-100">
+ <xsl:choose>
+ <xsl:when test="$get = 'Tag'">
+ <xsl:value-of select="$Tag"/>
+ </xsl:when>
+ <xsl:when test="$get = 'PreviousRelease'">
+ <xsl:value-of select="$PreviousRelease"/>
+ </xsl:when>
+ <xsl:when test="$get = 'PreviousReleaseRevision'">
+ <xsl:value-of select="$PreviousReleaseRevision"/>
+ </xsl:when>
+ <xsl:when test="$get = 'DistroTitle'">
+ <xsl:value-of select="$DistroTitle"/>
+ </xsl:when>
+ <xsl:when test="$get = 'VERSION'">
+ <xsl:value-of select="$VERSION"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:if test="$sf-relid = 0">
+ <xsl:message terminate="yes">
+ <xsl:text>You must specify the sf-relid as a parameter.</xsl:text>
+ </xsl:message>
+ </xsl:if>
+ <xsl:apply-templates select="//fm:project"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="fm:project">
+ <xsl:apply-templates/>
+ <xsl:text>&#10;</xsl:text>
+ <xsl:apply-templates select="fm:Changes" mode="text"/>
+</xsl:template>
+
+<xsl:template match="fm:Changes"/>
+
+<xsl:template match="fm:Gzipped-Tar-URL|fm:Zipped-Tar-URL|fm:Bzipped-Tar-URL">
+ <xsl:value-of select="local-name(.)"/>
+ <xsl:text>: </xsl:text>
+ <xsl:value-of select="substring-before(., '{DISTRONAME-VERSION}')"/>
+ <xsl:value-of select="concat($DistroName, '-', $VERSION)"/>
+ <xsl:value-of select="substring-after(., '{DISTRONAME-VERSION}')"/>
+ <xsl:text>&#10;</xsl:text>
+</xsl:template>
+
+<xsl:template match="fm:Changelog-URL">
+ <xsl:value-of select="local-name(.)"/>
+ <xsl:text>: </xsl:text>
+ <xsl:value-of select="substring-before(., '{SFRELID}')"/>
+ <xsl:value-of select="$sf-relid"/>
+ <xsl:value-of select="substring-after(., '{SFRELID}')"/>
+ <xsl:text>&#10;</xsl:text>
+</xsl:template>
+
+<xsl:template match="fm:*">
+ <xsl:value-of select="local-name(.)"/>
+ <xsl:text>: </xsl:text>
+ <xsl:value-of select="normalize-space(.)"/>
+ <xsl:text>&#10;</xsl:text>
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/catalog.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/catalog.xml
new file mode 100644
index 0000000..f058646
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/catalog.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<catalog xmlns="urn:oasis:names:tc:entity:xmlns:xml:catalog">
+ <!-- XML Catalog file for DocBook XSL Stylesheets v1.76.1 -->
+ <rewriteURI uriStartString="http://docbook.sourceforge.net/release/xsl/current/" rewritePrefix="./"/>
+ <rewriteSystem systemIdStartString="http://docbook.sourceforge.net/release/xsl/current/" rewritePrefix="./"/>
+ <rewriteURI uriStartString="http://docbook.sourceforge.net/release/xsl/1.76.1/" rewritePrefix="./"/>
+ <rewriteSystem systemIdStartString="http://docbook.sourceforge.net/release/xsl/1.76.1/" rewritePrefix="./"/>
+</catalog>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/af.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/af.xml
new file mode 100644
index 0000000..535b612
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/af.xml
@@ -0,0 +1,1229 @@
+<?xml version="1.0" encoding="utf-8"?>
+<l:l10n xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0" language="af" english-language-name="Afrikaans">
+
+<!-- * This file is generated automatically. -->
+<!-- * To submit changes to this file upstream (to the DocBook Project) -->
+<!-- * do not submit an edited version of this file. Instead, submit an -->
+<!-- * edited version of the source file at the following location: -->
+<!-- * -->
+<!-- * https://docbook.svn.sourceforge.net/svnroot/docbook/trunk/gentext/locale/af.xml -->
+<!-- * -->
+<!-- * E-mail the edited af.xml source file to: -->
+<!-- * -->
+<!-- * docbook-developers@lists.sourceforge.net -->
+
+<!-- ******************************************************************** -->
+
+<!-- This file is part of the XSL DocBook Stylesheet distribution. -->
+<!-- See ../README or http://docbook.sf.net/release/xsl/current/ for -->
+<!-- copyright and other information. -->
+
+<!-- ******************************************************************** -->
+<!-- In these files, % with a letter is used for a placeholder: -->
+<!-- %t is the current element's title -->
+<!-- %s is the current element's subtitle (if applicable)-->
+<!-- %n is the current element's number label-->
+<!-- %p is the current element's page number (if applicable)-->
+<!-- ******************************************************************** -->
+
+
+<l:gentext key="Abstract" text="Samevatting"/>
+<l:gentext key="abstract" text="samevatting"/>
+<l:gentext key="Acknowledgements" text="Acknowledgements" lang="en"/>
+<l:gentext key="acknowledgements" text="Acknowledgements" lang="en"/>
+<l:gentext key="Answer" text="Antwoord:"/>
+<l:gentext key="answer" text="antwoord:"/>
+<l:gentext key="Appendix" text="Aanhangsel"/>
+<l:gentext key="appendix" text="aanhangsel"/>
+<l:gentext key="Article" text="Artikel"/>
+<l:gentext key="article" text="artikel"/>
+<l:gentext key="Author" text="Author" lang="en"/>
+<l:gentext key="Bibliography" text="Bibliografie"/>
+<l:gentext key="bibliography" text="bibliografie"/>
+<l:gentext key="Book" text="Boek"/>
+<l:gentext key="book" text="boek"/>
+<l:gentext key="CAUTION" text="PAS OP"/>
+<l:gentext key="Caution" text="Pas op"/>
+<l:gentext key="caution" text="pas op"/>
+<l:gentext key="Chapter" text="Hoofdstuk"/>
+<l:gentext key="chapter" text="hoofdstuk"/>
+<l:gentext key="Colophon" text="Kolifon"/>
+<l:gentext key="colophon" text="kolifon"/>
+<l:gentext key="Copyright" text="Kopie reg"/>
+<l:gentext key="copyright" text="kopie reg"/>
+<l:gentext key="Dedication" text="Opgedra aan"/>
+<l:gentext key="dedication" text="opgedra aan"/>
+<l:gentext key="Edition" text="Uitgawe"/>
+<l:gentext key="edition" text="uitgawe"/>
+<l:gentext key="Editor" text="Editor" lang="en"/>
+<l:gentext key="Equation" text="Vergelyking"/>
+<l:gentext key="equation" text="vergelyking"/>
+<l:gentext key="Example" text="Voorbeeld"/>
+<l:gentext key="example" text="voorbeeld"/>
+<l:gentext key="Figure" text="Figuur"/>
+<l:gentext key="figure" text="figuur"/>
+<l:gentext key="Glossary" text="Woordlys"/>
+<l:gentext key="glossary" text="woordlys"/>
+<l:gentext key="GlossSee" text="WoordelysSien"/>
+<l:gentext key="glosssee" text="woordelyssien"/>
+<l:gentext key="GlossSeeAlso" text="WoordelysSienOok"/>
+<l:gentext key="glossseealso" text="woordelyssienook"/>
+<l:gentext key="IMPORTANT" text="BELANGRIK"/>
+<l:gentext key="important" text="belangrik"/>
+<l:gentext key="Important" text="Belangrik"/>
+<l:gentext key="Index" text="Indeks"/>
+<l:gentext key="index" text="indeks"/>
+<l:gentext key="ISBN" text="ISBN"/>
+<l:gentext key="isbn" text="isbn"/>
+<l:gentext key="LegalNotice" text="RegsKennisgewing"/>
+<l:gentext key="legalnotice" text="regskennisgewing"/>
+<l:gentext key="MsgAud" text="Teikengroep"/>
+<l:gentext key="msgaud" text="teikengroep"/>
+<l:gentext key="MsgLevel" text="Vlak"/>
+<l:gentext key="msglevel" text="vlak"/>
+<l:gentext key="MsgOrig" text="Herkoms"/>
+<l:gentext key="msgorig" text="herkoms"/>
+<l:gentext key="NOTE" text="OPMERKING"/>
+<l:gentext key="Note" text="Opmerking"/>
+<l:gentext key="note" text="opmerking"/>
+<l:gentext key="Part" text="Deel"/>
+<l:gentext key="part" text="deel"/>
+<l:gentext key="Preface" text="Voorwoord"/>
+<l:gentext key="preface" text="voorwoord"/>
+<l:gentext key="Procedure" text="Prosedure"/>
+<l:gentext key="procedure" text="prosedure"/>
+<l:gentext key="ProductionSet" text="ProduksieStel"/>
+<l:gentext key="PubDate" text="Publication Date" lang="en"/>
+<l:gentext key="pubdate" text="Publication date" lang="en"/>
+<l:gentext key="Published" text="Uitgegee"/>
+<l:gentext key="published" text="uitgegee"/>
+<l:gentext key="Publisher" text="Publisher" lang="en"/>
+<l:gentext key="Qandadiv" text="Vraag et Antwoord"/>
+<l:gentext key="qandadiv" text="Vraag et Antwoord"/>
+<l:gentext key="QandASet" text="Frequently Asked Questions" lang="en"/>
+<l:gentext key="Question" text="Vraag:"/>
+<l:gentext key="question" text="vraag:"/>
+<l:gentext key="RefEntry" text="Verwysingslemma"/>
+<l:gentext key="refentry" text="verwysingslemma"/>
+<l:gentext key="Reference" text="Verwysing"/>
+<l:gentext key="reference" text="verwysing"/>
+<l:gentext key="References" text="References" lang="en"/>
+<l:gentext key="RefName" text="Verwysingsnaam"/>
+<l:gentext key="refname" text="verwysingsnaam"/>
+<l:gentext key="RefSection" text="Verwysingsparagraaf"/>
+<l:gentext key="refsection" text="verwysingsparagraaf"/>
+<l:gentext key="RefSynopsisDiv" text="Verwysingsamevatting"/>
+<l:gentext key="refsynopsisdiv" text="verwysingsamevatting"/>
+<l:gentext key="RevHistory" text="Hersiening geskiedenis"/>
+<l:gentext key="revhistory" text="hersiening geskiedenis"/>
+<l:gentext key="revision" text="hersiening"/>
+<l:gentext key="Revision" text="Hersiening"/>
+<l:gentext key="sect1" text="Paragraaf"/>
+<l:gentext key="sect2" text="Paragraaf"/>
+<l:gentext key="sect3" text="Paragraaf"/>
+<l:gentext key="sect4" text="Paragraaf"/>
+<l:gentext key="sect5" text="Paragraaf"/>
+<l:gentext key="section" text="paragraaf"/>
+<l:gentext key="Section" text="Paragraaf"/>
+<l:gentext key="see" text="sien"/>
+<l:gentext key="See" text="Sien"/>
+<l:gentext key="seealso" text="sien ook"/>
+<l:gentext key="Seealso" text="Sien ook"/>
+<l:gentext key="SeeAlso" text="Sien Ook"/>
+<l:gentext key="set" text="versameling"/>
+<l:gentext key="Set" text="Versameling"/>
+<l:gentext key="setindex" text="versamelingindeks"/>
+<l:gentext key="SetIndex" text="VersamelingIndeks"/>
+<l:gentext key="Sidebar" text="Kantbalk"/>
+<l:gentext key="sidebar" text="kantbalk"/>
+<l:gentext key="step" text="stap"/>
+<l:gentext key="Step" text="Stap"/>
+<l:gentext key="table" text="tabel"/>
+<l:gentext key="Table" text="Tabel"/>
+<l:gentext key="task" text="Task" lang="en"/>
+<l:gentext key="Task" text="Task" lang="en"/>
+<l:gentext key="tip" text="leidraad"/>
+<l:gentext key="TIP" text="LEIDRAAD"/>
+<l:gentext key="Tip" text="Leidraad"/>
+<l:gentext key="Warning" text="Waarskuwing"/>
+<l:gentext key="warning" text="waarskuwing"/>
+<l:gentext key="WARNING" text="WAARSKUWING"/>
+<l:gentext key="and" text="en"/>
+<l:gentext key="by" text="deur"/>
+<l:gentext key="Edited" text="Geredigeer"/>
+<l:gentext key="edited" text="geredigeer"/>
+<l:gentext key="Editedby" text="Geredigeer deur"/>
+<l:gentext key="editedby" text="geredigeer deur"/>
+<l:gentext key="in" text="in"/>
+<l:gentext key="lastlistcomma" text=","/>
+<l:gentext key="listcomma" text=","/>
+<l:gentext key="notes" text="Notas"/>
+<l:gentext key="Notes" text="notas"/>
+<l:gentext key="Pgs" text="bl."/>
+<l:gentext key="pgs" text="bl."/>
+<l:gentext key="Revisedby" text="Hersien deur"/>
+<l:gentext key="revisedby" text="hersien deur"/>
+<l:gentext key="TableNotes" text="TabelOpmerking"/>
+<l:gentext key="tablenotes" text="tabelopmerking"/>
+<l:gentext key="TableofContents" text="Inhoudsopgawe"/>
+<l:gentext key="tableofcontents" text="inhoudsopgawe"/>
+<l:gentext key="unexpectedelementname" text="onverwagte element naam"/>
+<l:gentext key="unsupported" text="nie geondersteun"/>
+<l:gentext key="xrefto" text="verwysing na"/>
+<l:gentext key="Authors" text="Authors" lang="en"/>
+<l:gentext key="copyeditor" text="Copy Editor" lang="en"/>
+<l:gentext key="graphicdesigner" text="Graphic Designer" lang="en"/>
+<l:gentext key="productioneditor" text="Production Editor" lang="en"/>
+<l:gentext key="technicaleditor" text="Technical Editor" lang="en"/>
+<l:gentext key="translator" text="Translator" lang="en"/>
+<l:gentext key="listofequations" text="lys van vergelykings"/>
+<l:gentext key="ListofEquations" text="Lys van vergelykings"/>
+<l:gentext key="ListofExamples" text="Lys van voorbeelde"/>
+<l:gentext key="listofexamples" text="lys van voorbeelde"/>
+<l:gentext key="ListofFigures" text="Lys van figure"/>
+<l:gentext key="listoffigures" text="lys van figure"/>
+<l:gentext key="ListofProcedures" text="List of Procedures" lang="en"/>
+<l:gentext key="listofprocedures" text="List of Procedures" lang="en"/>
+<l:gentext key="listoftables" text="lys van tabelle"/>
+<l:gentext key="ListofTables" text="Lys van tabelle"/>
+<l:gentext key="ListofUnknown" text="Lys van onbekende tipes"/>
+<l:gentext key="listofunknown" text="lys van onbekende tipes"/>
+<l:gentext key="nav-home" text="Begin"/>
+<l:gentext key="nav-next" text="Volgende"/>
+<l:gentext key="nav-next-sibling" text="Verder vooruit"/>
+<l:gentext key="nav-prev" text="Terug"/>
+<l:gentext key="nav-prev-sibling" text="Verder terug"/>
+<l:gentext key="nav-up" text="Boontoe"/>
+<l:gentext key="nav-toc" text="ToC" lang="en"/>
+<l:gentext key="Draft" text="Proef"/>
+<l:gentext key="above" text="bo"/>
+<l:gentext key="below" text="onder"/>
+<l:gentext key="sectioncalled" text="die seksie genaamd"/>
+<l:gentext key="index symbols" text="indeks simbole"/>
+<l:gentext key="writing-mode" text="lr-tb"/>
+<l:gentext key="lowercase.alpha" text="abcdefghijklmnopqrstuvwxyz"/>
+<l:gentext key="uppercase.alpha" text="ABCDEFGHIJKLMNOPQRSTUVWXYZ"/>
+<l:gentext key="normalize.sort.input" text="AaÀàÃáÂâÃãÄäÅåĀÄĂ㥹ÇǎǞǟǠǡǺǻȀÈȂȃȦȧḀá¸áºšáº áº¡áº¢áº£áº¤áº¥áº¦áº§áº¨áº©áºªáº«áº¬áº­áº®áº¯áº°áº±áº²áº³áº´áºµáº¶áº·BbÆ€ÆɓƂƃḂḃḄḅḆḇCcÇçĆćĈĉĊċČÄƇƈɕḈḉDdÄŽÄÄđƊɗƋƌDžDzȡɖḊḋḌá¸á¸Žá¸á¸á¸‘ḒḓEeÈèÉéÊêËëĒēĔĕĖėĘęĚěȄȅȆȇȨȩḔḕḖḗḘḙḚḛḜá¸áº¸áº¹áººáº»áº¼áº½áº¾áº¿á»€á»á»‚ểỄễỆệFfƑƒḞḟGgÄœÄĞğĠġĢģƓɠǤǥǦǧǴǵḠḡHhĤĥĦħȞȟɦḢḣḤḥḦḧḨḩḪḫẖIiÌìÃíÎîÃïĨĩĪīĬĭĮįİƗɨÇÇȈȉȊȋḬḭḮḯỈỉỊịJjĴĵǰÊKkĶķƘƙǨǩḰḱḲḳḴḵLlĹĺĻļĽľĿŀÅłƚLjȴɫɬɭḶḷḸḹḺḻḼḽMmɱḾḿṀá¹á¹‚ṃNnÑñŃńŅņŇňÆɲƞȠNjǸǹȵɳṄṅṆṇṈṉṊṋOoÒòÓóÔôÕõÖöØøŌÅÅŽÅÅőƟƠơǑǒǪǫǬǭǾǿȌÈÈŽÈȪȫȬȭȮȯȰȱṌá¹á¹Žá¹á¹á¹‘ṒṓỌá»á»Žá»á»á»‘ỒồỔổỖỗỘộỚớỜá»á»žá»Ÿá» á»¡á»¢á»£PpƤƥṔṕṖṗQqÊ RrŔŕŖŗŘřÈȑȒȓɼɽɾṘṙṚṛṜá¹á¹žá¹ŸSsŚśŜÅŞşŠšȘșʂṠṡṢṣṤṥṦṧṨṩTtŢţŤťŦŧƫƬƭƮʈȚțȶṪṫṬṭṮṯṰṱẗUuÙùÚúÛûÜüŨũŪūŬŭŮůŰűŲųƯưǓǔǕǖǗǘǙǚǛǜȔȕȖȗṲṳṴṵṶṷṸṹṺṻỤụỦủỨứỪừỬửỮữỰựVvƲʋṼṽṾṿWwŴŵẀáºáº‚ẃẄẅẆẇẈẉẘXxẊẋẌáºYyÃýÿŸŶŷƳƴȲȳẎáºáº™á»²á»³á»´á»µá»¶á»·á»¸á»¹ZzŹźŻżŽžƵƶȤȥÊÊ‘áºáº‘ẒẓẔẕẕ" lang="en"/>
+<l:gentext key="normalize.sort.output" text="AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBCCCCCCCCCCCCCCCCCDDDDDDDDDDDDDDDDDDDDDDDDEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEFFFFFFGGGGGGGGGGGGGGGGGGGGHHHHHHHHHHHHHHHHHHHHIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIJJJJJJKKKKKKKKKKKKKKLLLLLLLLLLLLLLLLLLLLLLLLLLMMMMMMMMMNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOPPPPPPPPQQQRRRRRRRRRRRRRRRRRRRRRRRSSSSSSSSSSSSSSSSSSSSSSSTTTTTTTTTTTTTTTTTTTTTTTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUVVVVVVVVWWWWWWWWWWWWWWWXXXXXXYYYYYYYYYYYYYYYYYYYYYYYZZZZZZZZZZZZZZZZZZZZZ" lang="en"/>
+<l:dingbat key="startquote" text="“"/>
+<l:dingbat key="endquote" text="â€"/>
+<l:dingbat key="nestedstartquote" text="‘"/>
+<l:dingbat key="nestedendquote" text="’"/>
+<l:dingbat key="singlestartquote" text="‘" lang="en"/>
+<l:dingbat key="singleendquote" text="’" lang="en"/>
+<l:dingbat key="bullet" text="•"/>
+<l:gentext key="hyphenation-character" text="-" lang="en"/>
+<l:gentext key="hyphenation-push-character-count" text="2" lang="en"/>
+<l:gentext key="hyphenation-remain-character-count" text="2" lang="en"/>
+<l:context name="styles"><l:template name="person-name" text="first-last"/>
+</l:context>
+<l:context name="title"><l:template name="abstract" text="%t"/>
+<l:template name="acknowledgements" text="%t" lang="en"/>
+<l:template name="answer" text="%t"/>
+<l:template name="appendix" text="Aanhangsel %n. %t"/>
+<l:template name="article" text="%t"/>
+<l:template name="authorblurb" text="%t"/>
+<l:template name="bibliodiv" text="%t"/>
+<l:template name="biblioentry" text="%t"/>
+<l:template name="bibliography" text="%t"/>
+<l:template name="bibliolist" text="%t" lang="en"/>
+<l:template name="bibliomixed" text="%t"/>
+<l:template name="bibliomset" text="%t"/>
+<l:template name="biblioset" text="%t"/>
+<l:template name="blockquote" text="%t"/>
+<l:template name="book" text="%t"/>
+<l:template name="calloutlist" text="%t"/>
+<l:template name="caution" text="%t"/>
+<l:template name="chapter" text="Hoofdstuk %n. %t"/>
+<l:template name="colophon" text="%t"/>
+<l:template name="dedication" text="%t"/>
+<l:template name="equation" text="Vergelyking %n. %t"/>
+<l:template name="example" text="Voorbeeld %n. %t"/>
+<l:template name="figure" text="Figuur %n. %t"/>
+<l:template name="foil" text="%t" lang="en"/>
+<l:template name="foilgroup" text="%t" lang="en"/>
+<l:template name="formalpara" text="%t"/>
+<l:template name="glossary" text="%t"/>
+<l:template name="glossdiv" text="%t"/>
+<l:template name="glosslist" text="%t" lang="en"/>
+<l:template name="glossentry" text="%t" lang="en"/>
+<l:template name="important" text="%t"/>
+<l:template name="index" text="%t"/>
+<l:template name="indexdiv" text="%t"/>
+<l:template name="itemizedlist" text="%t"/>
+<l:template name="legalnotice" text="%t"/>
+<l:template name="listitem" text=""/>
+<l:template name="lot" text="%t"/>
+<l:template name="msg" text="%t"/>
+<l:template name="msgexplan" text="%t"/>
+<l:template name="msgmain" text="%t"/>
+<l:template name="msgrel" text="%t"/>
+<l:template name="msgset" text="%t"/>
+<l:template name="msgsub" text="%t"/>
+<l:template name="note" text="%t"/>
+<l:template name="orderedlist" text="%t"/>
+<l:template name="part" text="Deel %n. %t"/>
+<l:template name="partintro" text="%t"/>
+<l:template name="preface" text="%t"/>
+<l:template name="procedure" text="%t"/>
+<l:template name="procedure.formal" text="Prosedure %n. %t"/>
+<l:template name="productionset" text="%t"/>
+<l:template name="productionset.formal" text="ProduksieStel %n"/>
+<l:template name="qandadiv" text="%t"/>
+<l:template name="qandaentry" text="%t"/>
+<l:template name="qandaset" text="%t"/>
+<l:template name="question" text="%t"/>
+<l:template name="refentry" text="%t"/>
+<l:template name="reference" text="%t"/>
+<l:template name="refsection" text="%t"/>
+<l:template name="refsect1" text="%t"/>
+<l:template name="refsect2" text="%t"/>
+<l:template name="refsect3" text="%t"/>
+<l:template name="refsynopsisdiv" text="%t"/>
+<l:template name="refsynopsisdivinfo" text="%t"/>
+<l:template name="segmentedlist" text="%t"/>
+<l:template name="set" text="%t"/>
+<l:template name="setindex" text="%t"/>
+<l:template name="sidebar" text="%t"/>
+<l:template name="step" text="%t"/>
+<l:template name="table" text="Tabel %n. %t"/>
+<l:template name="task" text="%t" lang="en"/>
+<l:template name="tasksummary" text="%t" lang="en"/>
+<l:template name="taskprerequisites" text="%t" lang="en"/>
+<l:template name="taskrelated" text="%t" lang="en"/>
+<l:template name="tip" text="%t"/>
+<l:template name="toc" text="%t"/>
+<l:template name="variablelist" text="%t"/>
+<l:template name="varlistentry" text="" lang="en"/>
+<l:template name="warning" text="%t"/>
+</l:context>
+<l:context name="title-unnumbered"><l:template name="appendix" text="%t"/>
+<l:template name="article/appendix" text="%t" lang="en"/>
+<l:template name="bridgehead" text="%t"/>
+<l:template name="chapter" text="%t"/>
+<l:template name="sect1" text="%t"/>
+<l:template name="sect2" text="%t"/>
+<l:template name="sect3" text="%t"/>
+<l:template name="sect4" text="%t"/>
+<l:template name="sect5" text="%t"/>
+<l:template name="section" text="%t"/>
+<l:template name="simplesect" text="%t"/>
+<l:template name="part" text="%t" lang="en"/>
+</l:context>
+<l:context name="title-numbered"><l:template name="appendix" text="Aanhangsel %n. %t"/>
+<l:template name="article/appendix" text="%n. %t" lang="en"/>
+<l:template name="bridgehead" text="%n. %t"/>
+<l:template name="chapter" text="Hoofdstuk %n. %t"/>
+<l:template name="part" text="Deel %n. %t"/>
+<l:template name="sect1" text="%n. %t"/>
+<l:template name="sect2" text="%n. %t"/>
+<l:template name="sect3" text="%n. %t"/>
+<l:template name="sect4" text="%n. %t"/>
+<l:template name="sect5" text="%n. %t"/>
+<l:template name="section" text="%n. %t"/>
+<l:template name="simplesect" text="%n. %t"/>
+</l:context>
+<l:context name="subtitle"><l:template name="appendix" text="%s"/>
+<l:template name="acknowledgements" text="%s" lang="en"/>
+<l:template name="article" text="%s"/>
+<l:template name="bibliodiv" text="%s"/>
+<l:template name="biblioentry" text="%s"/>
+<l:template name="bibliography" text="%s"/>
+<l:template name="bibliomixed" text="%s"/>
+<l:template name="bibliomset" text="%s"/>
+<l:template name="biblioset" text="%s"/>
+<l:template name="book" text="%s"/>
+<l:template name="chapter" text="%s"/>
+<l:template name="colophon" text="%s"/>
+<l:template name="dedication" text="%s"/>
+<l:template name="glossary" text="%s"/>
+<l:template name="glossdiv" text="%s"/>
+<l:template name="index" text="%s"/>
+<l:template name="indexdiv" text="%s"/>
+<l:template name="lot" text="%s"/>
+<l:template name="part" text="%s"/>
+<l:template name="partintro" text="%s"/>
+<l:template name="preface" text="%s"/>
+<l:template name="refentry" text="%s"/>
+<l:template name="reference" text="%s"/>
+<l:template name="refsection" text="%s"/>
+<l:template name="refsect1" text="%s"/>
+<l:template name="refsect2" text="%s"/>
+<l:template name="refsect3" text="%s"/>
+<l:template name="refsynopsisdiv" text="%s"/>
+<l:template name="sect1" text="%s"/>
+<l:template name="sect2" text="%s"/>
+<l:template name="sect3" text="%s"/>
+<l:template name="sect4" text="%s"/>
+<l:template name="sect5" text="%s"/>
+<l:template name="section" text="%s"/>
+<l:template name="set" text="%s"/>
+<l:template name="setindex" text="%s"/>
+<l:template name="sidebar" text="%s"/>
+<l:template name="simplesect" text="%s"/>
+<l:template name="toc" text="%s"/>
+</l:context>
+<l:context name="xref"><l:template name="abstract" text="%t"/>
+<l:template name="acknowledgements" text="%t" lang="en"/>
+<l:template name="answer" text="Antwoord: %n"/>
+<l:template name="appendix" text="%t"/>
+<l:template name="article" text="%t"/>
+<l:template name="authorblurb" text="%t"/>
+<l:template name="bibliodiv" text="%t"/>
+<l:template name="bibliography" text="%t"/>
+<l:template name="bibliomset" text="%t"/>
+<l:template name="biblioset" text="%t"/>
+<l:template name="blockquote" text="%t"/>
+<l:template name="book" text="%t"/>
+<l:template name="calloutlist" text="%t"/>
+<l:template name="caution" text="%t"/>
+<l:template name="chapter" text="%t"/>
+<l:template name="colophon" text="%t"/>
+<l:template name="constraintdef" text="%t"/>
+<l:template name="dedication" text="%t"/>
+<l:template name="equation" text="%t"/>
+<l:template name="example" text="%t"/>
+<l:template name="figure" text="%t"/>
+<l:template name="foil" text="%t" lang="en"/>
+<l:template name="foilgroup" text="%t" lang="en"/>
+<l:template name="formalpara" text="%t"/>
+<l:template name="glossary" text="%t"/>
+<l:template name="glossdiv" text="%t"/>
+<l:template name="important" text="%t"/>
+<l:template name="index" text="%t"/>
+<l:template name="indexdiv" text="%t"/>
+<l:template name="itemizedlist" text="%t"/>
+<l:template name="legalnotice" text="%t"/>
+<l:template name="listitem" text="%n"/>
+<l:template name="lot" text="%t"/>
+<l:template name="msg" text="%t"/>
+<l:template name="msgexplan" text="%t"/>
+<l:template name="msgmain" text="%t"/>
+<l:template name="msgrel" text="%t"/>
+<l:template name="msgset" text="%t"/>
+<l:template name="msgsub" text="%t"/>
+<l:template name="note" text="%t"/>
+<l:template name="orderedlist" text="%t"/>
+<l:template name="part" text="%t"/>
+<l:template name="partintro" text="%t"/>
+<l:template name="preface" text="%t"/>
+<l:template name="procedure" text="%t"/>
+<l:template name="productionset" text="%t"/>
+<l:template name="qandadiv" text="%t"/>
+<l:template name="qandaentry" text="Vraag: %n"/>
+<l:template name="qandaset" text="%t"/>
+<l:template name="question" text="Vraag: %n"/>
+<l:template name="reference" text="%t"/>
+<l:template name="refsynopsisdiv" text="%t"/>
+<l:template name="segmentedlist" text="%t"/>
+<l:template name="set" text="%t"/>
+<l:template name="setindex" text="%t"/>
+<l:template name="sidebar" text="%t"/>
+<l:template name="table" text="%t"/>
+<l:template name="task" text="%t" lang="en"/>
+<l:template name="tip" text="%t"/>
+<l:template name="toc" text="%t"/>
+<l:template name="variablelist" text="%t"/>
+<l:template name="varlistentry" text="%n"/>
+<l:template name="warning" text="%t"/>
+<l:template name="olink.document.citation" text=" in %o" lang="en"/>
+<l:template name="olink.page.citation" text=" (page %p)" lang="en"/>
+<l:template name="page.citation" text=" [%p]"/>
+<l:template name="page" text="(page %p)" lang="en"/>
+<l:template name="docname" text=" in %o" lang="en"/>
+<l:template name="docnamelong" text=" in the document titled %o" lang="en"/>
+<l:template name="pageabbrev" text="(p. %p)" lang="en"/>
+<l:template name="Page" text="Page %p" lang="en"/>
+<l:template name="bridgehead" text="die seksie genaamd “%tâ€"/>
+<l:template name="refsection" text="die seksie genaamd “%tâ€"/>
+<l:template name="refsect1" text="die seksie genaamd “%tâ€"/>
+<l:template name="refsect2" text="die seksie genaamd “%tâ€"/>
+<l:template name="refsect3" text="die seksie genaamd “%tâ€"/>
+<l:template name="sect1" text="die seksie genaamd “%tâ€"/>
+<l:template name="sect2" text="die seksie genaamd “%tâ€"/>
+<l:template name="sect3" text="die seksie genaamd “%tâ€"/>
+<l:template name="sect4" text="die seksie genaamd “%tâ€"/>
+<l:template name="sect5" text="die seksie genaamd “%tâ€"/>
+<l:template name="section" text="die seksie genaamd “%tâ€"/>
+<l:template name="simplesect" text="die seksie genaamd “%tâ€"/>
+</l:context>
+<l:context name="xref-number"><l:template name="answer" text="Antwoord: %n"/>
+<l:template name="appendix" text="Aanhangsel %n"/>
+<l:template name="bridgehead" text="Paragraaf %n"/>
+<l:template name="chapter" text="Hoofdstuk %n"/>
+<l:template name="equation" text="Vergelyking %n"/>
+<l:template name="example" text="Voorbeeld %n"/>
+<l:template name="figure" text="Figuur %n"/>
+<l:template name="part" text="Deel %n"/>
+<l:template name="procedure" text="Prosedure %n"/>
+<l:template name="productionset" text="ProduksieStel %n"/>
+<l:template name="qandadiv" text="Vraag et Antwoord %n"/>
+<l:template name="qandaentry" text="Vraag: %n"/>
+<l:template name="question" text="Vraag: %n"/>
+<l:template name="sect1" text="Paragraaf %n"/>
+<l:template name="sect2" text="Paragraaf %n"/>
+<l:template name="sect3" text="Paragraaf %n"/>
+<l:template name="sect4" text="Paragraaf %n"/>
+<l:template name="sect5" text="Paragraaf %n"/>
+<l:template name="section" text="Paragraaf %n"/>
+<l:template name="table" text="Tabel %n"/>
+</l:context>
+<l:context name="xref-number-and-title"><l:template name="appendix" text="Aanhangsel %n, %t"/>
+<l:template name="bridgehead" text="Paragraaf %n, “%tâ€"/>
+<l:template name="chapter" text="Hoofdstuk %n, %t"/>
+<l:template name="equation" text="Vergelyking %n, “%tâ€"/>
+<l:template name="example" text="Voorbeeld %n, “%tâ€"/>
+<l:template name="figure" text="Figuur %n, “%tâ€"/>
+<l:template name="part" text="Deel %n, “%tâ€"/>
+<l:template name="procedure" text="Prosedure %n, “%tâ€"/>
+<l:template name="productionset" text="ProduksieStel %n, “%tâ€"/>
+<l:template name="qandadiv" text="Vraag et Antwoord %n, “%tâ€"/>
+<l:template name="refsect1" text="die seksie genaamd “%tâ€"/>
+<l:template name="refsect2" text="die seksie genaamd “%tâ€"/>
+<l:template name="refsect3" text="die seksie genaamd “%tâ€"/>
+<l:template name="refsection" text="die seksie genaamd “%tâ€"/>
+<l:template name="sect1" text="Paragraaf %n, “%tâ€"/>
+<l:template name="sect2" text="Paragraaf %n, “%tâ€"/>
+<l:template name="sect3" text="Paragraaf %n, “%tâ€"/>
+<l:template name="sect4" text="Paragraaf %n, “%tâ€"/>
+<l:template name="sect5" text="Paragraaf %n, “%tâ€"/>
+<l:template name="section" text="Paragraaf %n, “%tâ€"/>
+<l:template name="simplesect" text="die seksie genaamd “%tâ€"/>
+<l:template name="table" text="Tabel %n, “%tâ€"/>
+</l:context>
+<l:context name="authorgroup"><l:template name="sep" text=", "/>
+<l:template name="sep2" text=" en "/>
+<l:template name="seplast" text=", en "/>
+</l:context>
+<l:context name="glossary"><l:template name="see" text="WoordelysSien %t."/>
+<l:template name="seealso" text="WoordelysSienOok %t."/>
+<l:template name="seealso-separator" text=", "/>
+</l:context>
+<l:context name="msgset"><l:template name="MsgAud" text="Teikengroep: "/>
+<l:template name="MsgLevel" text="Vlak: "/>
+<l:template name="MsgOrig" text="Herkoms: "/>
+</l:context>
+<l:context name="datetime"><l:template name="format" text="m/d/Y" lang="en"/>
+</l:context>
+<l:context name="termdef"><l:template name="prefix" text="[Definition: " lang="en"/>
+<l:template name="suffix" text="]" lang="en"/>
+</l:context>
+<l:context name="datetime-full"><l:template name="January" text="January" lang="en"/>
+<l:template name="February" text="February" lang="en"/>
+<l:template name="March" text="March" lang="en"/>
+<l:template name="April" text="April" lang="en"/>
+<l:template name="May" text="May" lang="en"/>
+<l:template name="June" text="June" lang="en"/>
+<l:template name="July" text="July" lang="en"/>
+<l:template name="August" text="August" lang="en"/>
+<l:template name="September" text="September" lang="en"/>
+<l:template name="October" text="October" lang="en"/>
+<l:template name="November" text="November" lang="en"/>
+<l:template name="December" text="December" lang="en"/>
+<l:template name="Monday" text="Monday" lang="en"/>
+<l:template name="Tuesday" text="Tuesday" lang="en"/>
+<l:template name="Wednesday" text="Wednesday" lang="en"/>
+<l:template name="Thursday" text="Thursday" lang="en"/>
+<l:template name="Friday" text="Friday" lang="en"/>
+<l:template name="Saturday" text="Saturday" lang="en"/>
+<l:template name="Sunday" text="Sunday" lang="en"/>
+</l:context>
+<l:context name="datetime-abbrev"><l:template name="Jan" text="Jan" lang="en"/>
+<l:template name="Feb" text="Feb" lang="en"/>
+<l:template name="Mar" text="Mar" lang="en"/>
+<l:template name="Apr" text="Apr" lang="en"/>
+<l:template name="May" text="May" lang="en"/>
+<l:template name="Jun" text="Jun" lang="en"/>
+<l:template name="Jul" text="Jul" lang="en"/>
+<l:template name="Aug" text="Aug" lang="en"/>
+<l:template name="Sep" text="Sep" lang="en"/>
+<l:template name="Oct" text="Oct" lang="en"/>
+<l:template name="Nov" text="Nov" lang="en"/>
+<l:template name="Dec" text="Dec" lang="en"/>
+<l:template name="Mon" text="Mon" lang="en"/>
+<l:template name="Tue" text="Tue" lang="en"/>
+<l:template name="Wed" text="Wed" lang="en"/>
+<l:template name="Thu" text="Thu" lang="en"/>
+<l:template name="Fri" text="Fri" lang="en"/>
+<l:template name="Sat" text="Sat" lang="en"/>
+<l:template name="Sun" text="Sun" lang="en"/>
+</l:context>
+<l:context name="htmlhelp"><l:template name="langcode" text="0x0436 Afrikaans"/>
+</l:context>
+<l:context name="index"><l:template name="term-separator" text=", " lang="en"/>
+<l:template name="number-separator" text=", " lang="en"/>
+<l:template name="range-separator" text="-" lang="en"/>
+</l:context>
+<l:context name="iso690"><l:template name="lastfirst.sep" text=", " lang="en"/>
+<l:template name="alt.person.two.sep" text=" – " lang="en"/>
+<l:template name="alt.person.last.sep" text=" – " lang="en"/>
+<l:template name="alt.person.more.sep" text=" – " lang="en"/>
+<l:template name="primary.editor" text=" (ed.)" lang="en"/>
+<l:template name="primary.many" text=", et al." lang="en"/>
+<l:template name="primary.sep" text=". " lang="en"/>
+<l:template name="submaintitle.sep" text=": " lang="en"/>
+<l:template name="title.sep" text=". " lang="en"/>
+<l:template name="othertitle.sep" text=", " lang="en"/>
+<l:template name="medium1" text=" [" lang="en"/>
+<l:template name="medium2" text="]" lang="en"/>
+<l:template name="secondary.person.sep" text="; " lang="en"/>
+<l:template name="secondary.sep" text=". " lang="en"/>
+<l:template name="respons.sep" text=". " lang="en"/>
+<l:template name="edition.sep" text=". " lang="en"/>
+<l:template name="edition.serial.sep" text=", " lang="en"/>
+<l:template name="issuing.range" text="-" lang="en"/>
+<l:template name="issuing.div" text=", " lang="en"/>
+<l:template name="issuing.sep" text=". " lang="en"/>
+<l:template name="partnr.sep" text=". " lang="en"/>
+<l:template name="placepubl.sep" text=": " lang="en"/>
+<l:template name="publyear.sep" text=", " lang="en"/>
+<l:template name="pubinfo.sep" text=". " lang="en"/>
+<l:template name="spec.pubinfo.sep" text=", " lang="en"/>
+<l:template name="upd.sep" text=", " lang="en"/>
+<l:template name="datecit1" text=" [cited " lang="en"/>
+<l:template name="datecit2" text="]" lang="en"/>
+<l:template name="extent.sep" text=". " lang="en"/>
+<l:template name="locs.sep" text=", " lang="en"/>
+<l:template name="location.sep" text=". " lang="en"/>
+<l:template name="serie.sep" text=". " lang="en"/>
+<l:template name="notice.sep" text=". " lang="en"/>
+<l:template name="access" text="Available " lang="en"/>
+<l:template name="acctoo" text="Also available " lang="en"/>
+<l:template name="onwww" text="from World Wide Web" lang="en"/>
+<l:template name="oninet" text="from Internet" lang="en"/>
+<l:template name="access.end" text=": " lang="en"/>
+<l:template name="link1" text="&lt;" lang="en"/>
+<l:template name="link2" text="&gt;" lang="en"/>
+<l:template name="access.sep" text=". " lang="en"/>
+<l:template name="isbn" text="ISBN " lang="en"/>
+<l:template name="issn" text="ISSN " lang="en"/>
+<l:template name="stdnum.sep" text=". " lang="en"/>
+<l:template name="patcountry.sep" text=". " lang="en"/>
+<l:template name="pattype.sep" text=", " lang="en"/>
+<l:template name="patnum.sep" text=". " lang="en"/>
+<l:template name="patdate.sep" text=". " lang="en"/>
+</l:context><l:letters lang="en"><l:l i="-1"/>
+<l:l i="0">Symbols</l:l>
+<l:l i="10">A</l:l>
+<l:l i="10">a</l:l>
+<l:l i="10">À</l:l>
+<l:l i="10">à</l:l>
+<l:l i="10">Ã</l:l>
+<l:l i="10">á</l:l>
+<l:l i="10">Â</l:l>
+<l:l i="10">â</l:l>
+<l:l i="10">Ã</l:l>
+<l:l i="10">ã</l:l>
+<l:l i="10">Ä</l:l>
+<l:l i="10">ä</l:l>
+<l:l i="10">Ã…</l:l>
+<l:l i="10">Ã¥</l:l>
+<l:l i="10">Ä€</l:l>
+<l:l i="10">Ä</l:l>
+<l:l i="10">Ä‚</l:l>
+<l:l i="10">ă</l:l>
+<l:l i="10">Ä„</l:l>
+<l:l i="10">Ä…</l:l>
+<l:l i="10">Ç</l:l>
+<l:l i="10">ÇŽ</l:l>
+<l:l i="10">Çž</l:l>
+<l:l i="10">ÇŸ</l:l>
+<l:l i="10">Ç </l:l>
+<l:l i="10">Ç¡</l:l>
+<l:l i="10">Ǻ</l:l>
+<l:l i="10">Ç»</l:l>
+<l:l i="10">È€</l:l>
+<l:l i="10">È</l:l>
+<l:l i="10">È‚</l:l>
+<l:l i="10">ȃ</l:l>
+<l:l i="10">Ȧ</l:l>
+<l:l i="10">ȧ</l:l>
+<l:l i="10">Ḁ</l:l>
+<l:l i="10">á¸</l:l>
+<l:l i="10">ẚ</l:l>
+<l:l i="10">Ạ</l:l>
+<l:l i="10">ạ</l:l>
+<l:l i="10">Ả</l:l>
+<l:l i="10">ả</l:l>
+<l:l i="10">Ấ</l:l>
+<l:l i="10">ấ</l:l>
+<l:l i="10">Ầ</l:l>
+<l:l i="10">ầ</l:l>
+<l:l i="10">Ẩ</l:l>
+<l:l i="10">ẩ</l:l>
+<l:l i="10">Ẫ</l:l>
+<l:l i="10">ẫ</l:l>
+<l:l i="10">Ậ</l:l>
+<l:l i="10">ậ</l:l>
+<l:l i="10">Ắ</l:l>
+<l:l i="10">ắ</l:l>
+<l:l i="10">Ằ</l:l>
+<l:l i="10">ằ</l:l>
+<l:l i="10">Ẳ</l:l>
+<l:l i="10">ẳ</l:l>
+<l:l i="10">Ẵ</l:l>
+<l:l i="10">ẵ</l:l>
+<l:l i="10">Ặ</l:l>
+<l:l i="10">ặ</l:l>
+<l:l i="20">B</l:l>
+<l:l i="20">b</l:l>
+<l:l i="20">Æ€</l:l>
+<l:l i="20">Æ</l:l>
+<l:l i="20">É“</l:l>
+<l:l i="20">Æ‚</l:l>
+<l:l i="20">ƃ</l:l>
+<l:l i="20">Ḃ</l:l>
+<l:l i="20">ḃ</l:l>
+<l:l i="20">Ḅ</l:l>
+<l:l i="20">ḅ</l:l>
+<l:l i="20">Ḇ</l:l>
+<l:l i="20">ḇ</l:l>
+<l:l i="30">C</l:l>
+<l:l i="30">c</l:l>
+<l:l i="30">Ç</l:l>
+<l:l i="30">ç</l:l>
+<l:l i="30">Ć</l:l>
+<l:l i="30">ć</l:l>
+<l:l i="30">Ĉ</l:l>
+<l:l i="30">ĉ</l:l>
+<l:l i="30">ÄŠ</l:l>
+<l:l i="30">Ä‹</l:l>
+<l:l i="30">Č</l:l>
+<l:l i="30">Ä</l:l>
+<l:l i="30">Ƈ</l:l>
+<l:l i="30">ƈ</l:l>
+<l:l i="30">É•</l:l>
+<l:l i="30">Ḉ</l:l>
+<l:l i="30">ḉ</l:l>
+<l:l i="40">D</l:l>
+<l:l i="40">d</l:l>
+<l:l i="40">ÄŽ</l:l>
+<l:l i="40">Ä</l:l>
+<l:l i="40">Ä</l:l>
+<l:l i="40">Ä‘</l:l>
+<l:l i="40">ÆŠ</l:l>
+<l:l i="40">É—</l:l>
+<l:l i="40">Æ‹</l:l>
+<l:l i="40">ƌ</l:l>
+<l:l i="40">Ç…</l:l>
+<l:l i="40">Dz</l:l>
+<l:l i="40">È¡</l:l>
+<l:l i="40">É–</l:l>
+<l:l i="40">Ḋ</l:l>
+<l:l i="40">ḋ</l:l>
+<l:l i="40">Ḍ</l:l>
+<l:l i="40">á¸</l:l>
+<l:l i="40">Ḏ</l:l>
+<l:l i="40">á¸</l:l>
+<l:l i="40">á¸</l:l>
+<l:l i="40">ḑ</l:l>
+<l:l i="40">Ḓ</l:l>
+<l:l i="40">ḓ</l:l>
+<l:l i="50">E</l:l>
+<l:l i="50">e</l:l>
+<l:l i="50">È</l:l>
+<l:l i="50">è</l:l>
+<l:l i="50">É</l:l>
+<l:l i="50">é</l:l>
+<l:l i="50">Ê</l:l>
+<l:l i="50">ê</l:l>
+<l:l i="50">Ë</l:l>
+<l:l i="50">ë</l:l>
+<l:l i="50">Ä’</l:l>
+<l:l i="50">Ä“</l:l>
+<l:l i="50">Ä”</l:l>
+<l:l i="50">Ä•</l:l>
+<l:l i="50">Ä–</l:l>
+<l:l i="50">Ä—</l:l>
+<l:l i="50">Ę</l:l>
+<l:l i="50">Ä™</l:l>
+<l:l i="50">Äš</l:l>
+<l:l i="50">Ä›</l:l>
+<l:l i="50">È„</l:l>
+<l:l i="50">È…</l:l>
+<l:l i="50">Ȇ</l:l>
+<l:l i="50">ȇ</l:l>
+<l:l i="50">Ȩ</l:l>
+<l:l i="50">È©</l:l>
+<l:l i="50">Ḕ</l:l>
+<l:l i="50">ḕ</l:l>
+<l:l i="50">Ḗ</l:l>
+<l:l i="50">ḗ</l:l>
+<l:l i="50">Ḙ</l:l>
+<l:l i="50">ḙ</l:l>
+<l:l i="50">Ḛ</l:l>
+<l:l i="50">ḛ</l:l>
+<l:l i="50">Ḝ</l:l>
+<l:l i="50">á¸</l:l>
+<l:l i="50">Ẹ</l:l>
+<l:l i="50">ẹ</l:l>
+<l:l i="50">Ẻ</l:l>
+<l:l i="50">ẻ</l:l>
+<l:l i="50">Ẽ</l:l>
+<l:l i="50">ẽ</l:l>
+<l:l i="50">Ế</l:l>
+<l:l i="50">ế</l:l>
+<l:l i="50">Ề</l:l>
+<l:l i="50">á»</l:l>
+<l:l i="50">Ể</l:l>
+<l:l i="50">ể</l:l>
+<l:l i="50">Ễ</l:l>
+<l:l i="50">á»…</l:l>
+<l:l i="50">Ệ</l:l>
+<l:l i="50">ệ</l:l>
+<l:l i="60">F</l:l>
+<l:l i="60">f</l:l>
+<l:l i="60">Æ‘</l:l>
+<l:l i="60">Æ’</l:l>
+<l:l i="60">Ḟ</l:l>
+<l:l i="60">ḟ</l:l>
+<l:l i="70">G</l:l>
+<l:l i="70">g</l:l>
+<l:l i="70">Ĝ</l:l>
+<l:l i="70">Ä</l:l>
+<l:l i="70">Äž</l:l>
+<l:l i="70">ÄŸ</l:l>
+<l:l i="70">Ä </l:l>
+<l:l i="70">Ä¡</l:l>
+<l:l i="70">Ä¢</l:l>
+<l:l i="70">Ä£</l:l>
+<l:l i="70">Æ“</l:l>
+<l:l i="70">É </l:l>
+<l:l i="70">Ǥ</l:l>
+<l:l i="70">Ç¥</l:l>
+<l:l i="70">Ǧ</l:l>
+<l:l i="70">ǧ</l:l>
+<l:l i="70">Ç´</l:l>
+<l:l i="70">ǵ</l:l>
+<l:l i="70">Ḡ</l:l>
+<l:l i="70">ḡ</l:l>
+<l:l i="80">H</l:l>
+<l:l i="80">h</l:l>
+<l:l i="80">Ĥ</l:l>
+<l:l i="80">Ä¥</l:l>
+<l:l i="80">Ħ</l:l>
+<l:l i="80">ħ</l:l>
+<l:l i="80">Èž</l:l>
+<l:l i="80">ÈŸ</l:l>
+<l:l i="80">ɦ</l:l>
+<l:l i="80">Ḣ</l:l>
+<l:l i="80">ḣ</l:l>
+<l:l i="80">Ḥ</l:l>
+<l:l i="80">ḥ</l:l>
+<l:l i="80">Ḧ</l:l>
+<l:l i="80">ḧ</l:l>
+<l:l i="80">Ḩ</l:l>
+<l:l i="80">ḩ</l:l>
+<l:l i="80">Ḫ</l:l>
+<l:l i="80">ḫ</l:l>
+<l:l i="80">ẖ</l:l>
+<l:l i="90">I</l:l>
+<l:l i="90">i</l:l>
+<l:l i="90">Ì</l:l>
+<l:l i="90">ì</l:l>
+<l:l i="90">Ã</l:l>
+<l:l i="90">í</l:l>
+<l:l i="90">ÃŽ</l:l>
+<l:l i="90">î</l:l>
+<l:l i="90">Ã</l:l>
+<l:l i="90">ï</l:l>
+<l:l i="90">Ĩ</l:l>
+<l:l i="90">Ä©</l:l>
+<l:l i="90">Ī</l:l>
+<l:l i="90">Ä«</l:l>
+<l:l i="90">Ĭ</l:l>
+<l:l i="90">Ä­</l:l>
+<l:l i="90">Ä®</l:l>
+<l:l i="90">į</l:l>
+<l:l i="90">Ä°</l:l>
+<l:l i="90">Æ—</l:l>
+<l:l i="90">ɨ</l:l>
+<l:l i="90">Ç</l:l>
+<l:l i="90">Ç</l:l>
+<l:l i="90">Ȉ</l:l>
+<l:l i="90">ȉ</l:l>
+<l:l i="90">ÈŠ</l:l>
+<l:l i="90">È‹</l:l>
+<l:l i="90">Ḭ</l:l>
+<l:l i="90">ḭ</l:l>
+<l:l i="90">Ḯ</l:l>
+<l:l i="90">ḯ</l:l>
+<l:l i="90">Ỉ</l:l>
+<l:l i="90">ỉ</l:l>
+<l:l i="90">Ị</l:l>
+<l:l i="90">ị</l:l>
+<l:l i="100">J</l:l>
+<l:l i="100">j</l:l>
+<l:l i="100">Ä´</l:l>
+<l:l i="100">ĵ</l:l>
+<l:l i="100">Ç°</l:l>
+<l:l i="100">Ê</l:l>
+<l:l i="110">K</l:l>
+<l:l i="110">k</l:l>
+<l:l i="110">Ķ</l:l>
+<l:l i="110">Ä·</l:l>
+<l:l i="110">Ƙ</l:l>
+<l:l i="110">Æ™</l:l>
+<l:l i="110">Ǩ</l:l>
+<l:l i="110">Ç©</l:l>
+<l:l i="110">Ḱ</l:l>
+<l:l i="110">ḱ</l:l>
+<l:l i="110">Ḳ</l:l>
+<l:l i="110">ḳ</l:l>
+<l:l i="110">Ḵ</l:l>
+<l:l i="110">ḵ</l:l>
+<l:l i="120">L</l:l>
+<l:l i="120">l</l:l>
+<l:l i="120">Ĺ</l:l>
+<l:l i="120">ĺ</l:l>
+<l:l i="120">Ä»</l:l>
+<l:l i="120">ļ</l:l>
+<l:l i="120">Ľ</l:l>
+<l:l i="120">ľ</l:l>
+<l:l i="120">Ä¿</l:l>
+<l:l i="120">Å€</l:l>
+<l:l i="120">Å</l:l>
+<l:l i="120">Å‚</l:l>
+<l:l i="120">Æš</l:l>
+<l:l i="120">Lj</l:l>
+<l:l i="120">È´</l:l>
+<l:l i="120">É«</l:l>
+<l:l i="120">ɬ</l:l>
+<l:l i="120">É­</l:l>
+<l:l i="120">Ḷ</l:l>
+<l:l i="120">ḷ</l:l>
+<l:l i="120">Ḹ</l:l>
+<l:l i="120">ḹ</l:l>
+<l:l i="120">Ḻ</l:l>
+<l:l i="120">ḻ</l:l>
+<l:l i="120">Ḽ</l:l>
+<l:l i="120">ḽ</l:l>
+<l:l i="130">M</l:l>
+<l:l i="130">m</l:l>
+<l:l i="130">ɱ</l:l>
+<l:l i="130">Ḿ</l:l>
+<l:l i="130">ḿ</l:l>
+<l:l i="130">á¹€</l:l>
+<l:l i="130">á¹</l:l>
+<l:l i="130">Ṃ</l:l>
+<l:l i="130">ṃ</l:l>
+<l:l i="140">N</l:l>
+<l:l i="140">n</l:l>
+<l:l i="140">Ñ</l:l>
+<l:l i="140">ñ</l:l>
+<l:l i="140">Ń</l:l>
+<l:l i="140">Å„</l:l>
+<l:l i="140">Å…</l:l>
+<l:l i="140">ņ</l:l>
+<l:l i="140">Ň</l:l>
+<l:l i="140">ň</l:l>
+<l:l i="140">Æ</l:l>
+<l:l i="140">ɲ</l:l>
+<l:l i="140">Æž</l:l>
+<l:l i="140">È </l:l>
+<l:l i="140">Ç‹</l:l>
+<l:l i="140">Ǹ</l:l>
+<l:l i="140">ǹ</l:l>
+<l:l i="140">ȵ</l:l>
+<l:l i="140">ɳ</l:l>
+<l:l i="140">Ṅ</l:l>
+<l:l i="140">á¹…</l:l>
+<l:l i="140">Ṇ</l:l>
+<l:l i="140">ṇ</l:l>
+<l:l i="140">Ṉ</l:l>
+<l:l i="140">ṉ</l:l>
+<l:l i="140">Ṋ</l:l>
+<l:l i="140">ṋ</l:l>
+<l:l i="150">O</l:l>
+<l:l i="150">o</l:l>
+<l:l i="150">Ã’</l:l>
+<l:l i="150">ò</l:l>
+<l:l i="150">Ó</l:l>
+<l:l i="150">ó</l:l>
+<l:l i="150">Ô</l:l>
+<l:l i="150">ô</l:l>
+<l:l i="150">Õ</l:l>
+<l:l i="150">õ</l:l>
+<l:l i="150">Ö</l:l>
+<l:l i="150">ö</l:l>
+<l:l i="150">Ø</l:l>
+<l:l i="150">ø</l:l>
+<l:l i="150">Ō</l:l>
+<l:l i="150">Å</l:l>
+<l:l i="150">ÅŽ</l:l>
+<l:l i="150">Å</l:l>
+<l:l i="150">Å</l:l>
+<l:l i="150">Å‘</l:l>
+<l:l i="150">ÆŸ</l:l>
+<l:l i="150">Æ </l:l>
+<l:l i="150">Æ¡</l:l>
+<l:l i="150">Ç‘</l:l>
+<l:l i="150">Ç’</l:l>
+<l:l i="150">Ǫ</l:l>
+<l:l i="150">Ç«</l:l>
+<l:l i="150">Ǭ</l:l>
+<l:l i="150">Ç­</l:l>
+<l:l i="150">Ǿ</l:l>
+<l:l i="150">Ç¿</l:l>
+<l:l i="150">Ȍ</l:l>
+<l:l i="150">È</l:l>
+<l:l i="150">ÈŽ</l:l>
+<l:l i="150">È</l:l>
+<l:l i="150">Ȫ</l:l>
+<l:l i="150">È«</l:l>
+<l:l i="150">Ȭ</l:l>
+<l:l i="150">È­</l:l>
+<l:l i="150">È®</l:l>
+<l:l i="150">ȯ</l:l>
+<l:l i="150">È°</l:l>
+<l:l i="150">ȱ</l:l>
+<l:l i="150">Ṍ</l:l>
+<l:l i="150">á¹</l:l>
+<l:l i="150">Ṏ</l:l>
+<l:l i="150">á¹</l:l>
+<l:l i="150">á¹</l:l>
+<l:l i="150">ṑ</l:l>
+<l:l i="150">á¹’</l:l>
+<l:l i="150">ṓ</l:l>
+<l:l i="150">Ọ</l:l>
+<l:l i="150">á»</l:l>
+<l:l i="150">Ỏ</l:l>
+<l:l i="150">á»</l:l>
+<l:l i="150">á»</l:l>
+<l:l i="150">ố</l:l>
+<l:l i="150">á»’</l:l>
+<l:l i="150">ồ</l:l>
+<l:l i="150">á»”</l:l>
+<l:l i="150">ổ</l:l>
+<l:l i="150">á»–</l:l>
+<l:l i="150">á»—</l:l>
+<l:l i="150">Ộ</l:l>
+<l:l i="150">á»™</l:l>
+<l:l i="150">Ớ</l:l>
+<l:l i="150">á»›</l:l>
+<l:l i="150">Ờ</l:l>
+<l:l i="150">á»</l:l>
+<l:l i="150">Ở</l:l>
+<l:l i="150">ở</l:l>
+<l:l i="150">á» </l:l>
+<l:l i="150">ỡ</l:l>
+<l:l i="150">Ợ</l:l>
+<l:l i="150">ợ</l:l>
+<l:l i="160">P</l:l>
+<l:l i="160">p</l:l>
+<l:l i="160">Ƥ</l:l>
+<l:l i="160">Æ¥</l:l>
+<l:l i="160">á¹”</l:l>
+<l:l i="160">ṕ</l:l>
+<l:l i="160">á¹–</l:l>
+<l:l i="160">á¹—</l:l>
+<l:l i="170">Q</l:l>
+<l:l i="170">q</l:l>
+<l:l i="170">Ê </l:l>
+<l:l i="180">R</l:l>
+<l:l i="180">r</l:l>
+<l:l i="180">Å”</l:l>
+<l:l i="180">Å•</l:l>
+<l:l i="180">Å–</l:l>
+<l:l i="180">Å—</l:l>
+<l:l i="180">Ř</l:l>
+<l:l i="180">Å™</l:l>
+<l:l i="180">È</l:l>
+<l:l i="180">È‘</l:l>
+<l:l i="180">È’</l:l>
+<l:l i="180">È“</l:l>
+<l:l i="180">ɼ</l:l>
+<l:l i="180">ɽ</l:l>
+<l:l i="180">ɾ</l:l>
+<l:l i="180">Ṙ</l:l>
+<l:l i="180">á¹™</l:l>
+<l:l i="180">Ṛ</l:l>
+<l:l i="180">á¹›</l:l>
+<l:l i="180">Ṝ</l:l>
+<l:l i="180">á¹</l:l>
+<l:l i="180">Ṟ</l:l>
+<l:l i="180">ṟ</l:l>
+<l:l i="190">S</l:l>
+<l:l i="190">s</l:l>
+<l:l i="190">Åš</l:l>
+<l:l i="190">Å›</l:l>
+<l:l i="190">Ŝ</l:l>
+<l:l i="190">Å</l:l>
+<l:l i="190">Åž</l:l>
+<l:l i="190">ÅŸ</l:l>
+<l:l i="190">Å </l:l>
+<l:l i="190">Å¡</l:l>
+<l:l i="190">Ș</l:l>
+<l:l i="190">È™</l:l>
+<l:l i="190">Ê‚</l:l>
+<l:l i="190">á¹ </l:l>
+<l:l i="190">ṡ</l:l>
+<l:l i="190">á¹¢</l:l>
+<l:l i="190">á¹£</l:l>
+<l:l i="190">Ṥ</l:l>
+<l:l i="190">á¹¥</l:l>
+<l:l i="190">Ṧ</l:l>
+<l:l i="190">ṧ</l:l>
+<l:l i="190">Ṩ</l:l>
+<l:l i="190">ṩ</l:l>
+<l:l i="200">T</l:l>
+<l:l i="200">t</l:l>
+<l:l i="200">Å¢</l:l>
+<l:l i="200">Å£</l:l>
+<l:l i="200">Ť</l:l>
+<l:l i="200">Å¥</l:l>
+<l:l i="200">Ŧ</l:l>
+<l:l i="200">ŧ</l:l>
+<l:l i="200">Æ«</l:l>
+<l:l i="200">Ƭ</l:l>
+<l:l i="200">Æ­</l:l>
+<l:l i="200">Æ®</l:l>
+<l:l i="200">ʈ</l:l>
+<l:l i="200">Èš</l:l>
+<l:l i="200">È›</l:l>
+<l:l i="200">ȶ</l:l>
+<l:l i="200">Ṫ</l:l>
+<l:l i="200">ṫ</l:l>
+<l:l i="200">Ṭ</l:l>
+<l:l i="200">á¹­</l:l>
+<l:l i="200">á¹®</l:l>
+<l:l i="200">ṯ</l:l>
+<l:l i="200">á¹°</l:l>
+<l:l i="200">á¹±</l:l>
+<l:l i="200">ẗ</l:l>
+<l:l i="210">U</l:l>
+<l:l i="210">u</l:l>
+<l:l i="210">Ù</l:l>
+<l:l i="210">ù</l:l>
+<l:l i="210">Ú</l:l>
+<l:l i="210">ú</l:l>
+<l:l i="210">Û</l:l>
+<l:l i="210">û</l:l>
+<l:l i="210">Ü</l:l>
+<l:l i="210">ü</l:l>
+<l:l i="210">Ũ</l:l>
+<l:l i="210">Å©</l:l>
+<l:l i="210">Ū</l:l>
+<l:l i="210">Å«</l:l>
+<l:l i="210">Ŭ</l:l>
+<l:l i="210">Å­</l:l>
+<l:l i="210">Å®</l:l>
+<l:l i="210">ů</l:l>
+<l:l i="210">Å°</l:l>
+<l:l i="210">ű</l:l>
+<l:l i="210">Ų</l:l>
+<l:l i="210">ų</l:l>
+<l:l i="210">Ư</l:l>
+<l:l i="210">Æ°</l:l>
+<l:l i="210">Ç“</l:l>
+<l:l i="210">Ç”</l:l>
+<l:l i="210">Ç•</l:l>
+<l:l i="210">Ç–</l:l>
+<l:l i="210">Ç—</l:l>
+<l:l i="210">ǘ</l:l>
+<l:l i="210">Ç™</l:l>
+<l:l i="210">Çš</l:l>
+<l:l i="210">Ç›</l:l>
+<l:l i="210">ǜ</l:l>
+<l:l i="210">È”</l:l>
+<l:l i="210">È•</l:l>
+<l:l i="210">È–</l:l>
+<l:l i="210">È—</l:l>
+<l:l i="210">á¹²</l:l>
+<l:l i="210">á¹³</l:l>
+<l:l i="210">á¹´</l:l>
+<l:l i="210">á¹µ</l:l>
+<l:l i="210">Ṷ</l:l>
+<l:l i="210">á¹·</l:l>
+<l:l i="210">Ṹ</l:l>
+<l:l i="210">á¹¹</l:l>
+<l:l i="210">Ṻ</l:l>
+<l:l i="210">á¹»</l:l>
+<l:l i="210">Ụ</l:l>
+<l:l i="210">ụ</l:l>
+<l:l i="210">Ủ</l:l>
+<l:l i="210">ủ</l:l>
+<l:l i="210">Ứ</l:l>
+<l:l i="210">ứ</l:l>
+<l:l i="210">Ừ</l:l>
+<l:l i="210">ừ</l:l>
+<l:l i="210">Ử</l:l>
+<l:l i="210">á»­</l:l>
+<l:l i="210">á»®</l:l>
+<l:l i="210">ữ</l:l>
+<l:l i="210">á»°</l:l>
+<l:l i="210">á»±</l:l>
+<l:l i="220">V</l:l>
+<l:l i="220">v</l:l>
+<l:l i="220">Ʋ</l:l>
+<l:l i="220">Ê‹</l:l>
+<l:l i="220">á¹¼</l:l>
+<l:l i="220">á¹½</l:l>
+<l:l i="220">á¹¾</l:l>
+<l:l i="220">ṿ</l:l>
+<l:l i="230">W</l:l>
+<l:l i="230">w</l:l>
+<l:l i="230">Å´</l:l>
+<l:l i="230">ŵ</l:l>
+<l:l i="230">Ẁ</l:l>
+<l:l i="230">áº</l:l>
+<l:l i="230">Ẃ</l:l>
+<l:l i="230">ẃ</l:l>
+<l:l i="230">Ẅ</l:l>
+<l:l i="230">ẅ</l:l>
+<l:l i="230">Ẇ</l:l>
+<l:l i="230">ẇ</l:l>
+<l:l i="230">Ẉ</l:l>
+<l:l i="230">ẉ</l:l>
+<l:l i="230">ẘ</l:l>
+<l:l i="240">X</l:l>
+<l:l i="240">x</l:l>
+<l:l i="240">Ẋ</l:l>
+<l:l i="240">ẋ</l:l>
+<l:l i="240">Ẍ</l:l>
+<l:l i="240">áº</l:l>
+<l:l i="250">Y</l:l>
+<l:l i="250">y</l:l>
+<l:l i="250">Ã</l:l>
+<l:l i="250">ý</l:l>
+<l:l i="250">ÿ</l:l>
+<l:l i="250">Ÿ</l:l>
+<l:l i="250">Ŷ</l:l>
+<l:l i="250">Å·</l:l>
+<l:l i="250">Ƴ</l:l>
+<l:l i="250">Æ´</l:l>
+<l:l i="250">Ȳ</l:l>
+<l:l i="250">ȳ</l:l>
+<l:l i="250">Ẏ</l:l>
+<l:l i="250">áº</l:l>
+<l:l i="250">ẙ</l:l>
+<l:l i="250">Ỳ</l:l>
+<l:l i="250">ỳ</l:l>
+<l:l i="250">á»´</l:l>
+<l:l i="250">ỵ</l:l>
+<l:l i="250">Ỷ</l:l>
+<l:l i="250">á»·</l:l>
+<l:l i="250">Ỹ</l:l>
+<l:l i="250">ỹ</l:l>
+<l:l i="260">Z</l:l>
+<l:l i="260">z</l:l>
+<l:l i="260">Ź</l:l>
+<l:l i="260">ź</l:l>
+<l:l i="260">Å»</l:l>
+<l:l i="260">ż</l:l>
+<l:l i="260">Ž</l:l>
+<l:l i="260">ž</l:l>
+<l:l i="260">Ƶ</l:l>
+<l:l i="260">ƶ</l:l>
+<l:l i="260">Ȥ</l:l>
+<l:l i="260">È¥</l:l>
+<l:l i="260">Ê</l:l>
+<l:l i="260">Ê‘</l:l>
+<l:l i="260">áº</l:l>
+<l:l i="260">ẑ</l:l>
+<l:l i="260">Ẓ</l:l>
+<l:l i="260">ẓ</l:l>
+<l:l i="260">Ẕ</l:l>
+<l:l i="260">ẕ</l:l>
+</l:letters>
+</l:l10n>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/am.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/am.xml
new file mode 100644
index 0000000..ddb5035
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/am.xml
@@ -0,0 +1,1229 @@
+<?xml version="1.0" encoding="utf-8"?>
+<l:l10n xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0" language="am" english-language-name="Amharic">
+
+<!-- * This file is generated automatically. -->
+<!-- * To submit changes to this file upstream (to the DocBook Project) -->
+<!-- * do not submit an edited version of this file. Instead, submit an -->
+<!-- * edited version of the source file at the following location: -->
+<!-- * -->
+<!-- * https://docbook.svn.sourceforge.net/svnroot/docbook/trunk/gentext/locale/am.xml -->
+<!-- * -->
+<!-- * E-mail the edited am.xml source file to: -->
+<!-- * -->
+<!-- * docbook-developers@lists.sourceforge.net -->
+
+<!-- ******************************************************************** -->
+
+<!-- This file is part of the XSL DocBook Stylesheet distribution. -->
+<!-- See ../README or http://docbook.sf.net/release/xsl/current/ for -->
+<!-- copyright and other information. -->
+
+<!-- ******************************************************************** -->
+<!-- In these files, % with a letter is used for a placeholder: -->
+<!-- %t is the current element's title -->
+<!-- %s is the current element's subtitle (if applicable)-->
+<!-- %n is the current element's number label-->
+<!-- %p is the current element's page number (if applicable)-->
+<!-- ******************************************************************** -->
+
+
+<l:gentext key="Abstract" text="ረቂቅ"/>
+<l:gentext key="abstract" text="ረቂቅ"/>
+<l:gentext key="Acknowledgements" text="Acknowledgements" lang="en"/>
+<l:gentext key="acknowledgements" text="Acknowledgements" lang="en"/>
+<l:gentext key="Answer" text="መá¦"/>
+<l:gentext key="answer" text="መá¦"/>
+<l:gentext key="Appendix" text="ተጨማሪ"/>
+<l:gentext key="appendix" text="ተጨማሪ"/>
+<l:gentext key="Article" text="ጽሑá"/>
+<l:gentext key="article" text="ጽሑá"/>
+<l:gentext key="Author" text="ደራሲ"/>
+<l:gentext key="Bibliography" text="የመጻሕáት á‹áˆ­á‹áˆ­"/>
+<l:gentext key="bibliography" text="የመጻሕáት á‹áˆ­á‹áˆ­"/>
+<l:gentext key="Book" text="መጽáˆá"/>
+<l:gentext key="book" text="መጽáˆá"/>
+<l:gentext key="CAUTION" text="ጥንቃቄ"/>
+<l:gentext key="Caution" text="ጥንቃቄ"/>
+<l:gentext key="caution" text="ጥንቃቄ"/>
+<l:gentext key="Chapter" text="áˆá‹•áˆ«á"/>
+<l:gentext key="chapter" text="áˆá‹•áˆ«á"/>
+<l:gentext key="Colophon" text="Colophon"/>
+<l:gentext key="colophon" text="Colophon"/>
+<l:gentext key="Copyright" text="የቅጂዠመብት"/>
+<l:gentext key="copyright" text="የቅጂዠመብት"/>
+<l:gentext key="Dedication" text="ለአላማ መሰዋት"/>
+<l:gentext key="dedication" text="ለአላማ መሰዋት"/>
+<l:gentext key="Edition" text="ቅጂ"/>
+<l:gentext key="edition" text="ቅጂ"/>
+<l:gentext key="Editor" text="Editor" lang="en"/>
+<l:gentext key="Equation" text="እኩሌታ"/>
+<l:gentext key="equation" text="እኩሌታ"/>
+<l:gentext key="Example" text="ለáˆáˆ³áˆŒ"/>
+<l:gentext key="example" text="ለáˆáˆ³áˆŒ"/>
+<l:gentext key="Figure" text="áˆáˆµáˆ"/>
+<l:gentext key="figure" text="áˆáˆµáˆ"/>
+<l:gentext key="Glossary" text="የቃላቶች áቺ á‹áˆ­á‹áˆ­"/>
+<l:gentext key="glossary" text="የቃላቶች áቺ á‹áˆ­á‹áˆ­"/>
+<l:gentext key="GlossSee" text="ማየት (እይ)"/>
+<l:gentext key="glosssee" text="ማየት (እይ)"/>
+<l:gentext key="GlossSeeAlso" text="…ንሠእይ"/>
+<l:gentext key="glossseealso" text="…ንሠእይ"/>
+<l:gentext key="IMPORTANT" text="አስáˆáˆ‹áŒŠ"/>
+<l:gentext key="important" text="አስáˆáˆ‹áŒŠ"/>
+<l:gentext key="Important" text="አስáˆáˆ‹áŒŠ"/>
+<l:gentext key="Index" text="ማá‹áŒ«"/>
+<l:gentext key="index" text="ማá‹áŒ«"/>
+<l:gentext key="ISBN" text="ISBN"/>
+<l:gentext key="isbn" text="ISBN"/>
+<l:gentext key="LegalNotice" text="ህጋዊ ማስታወቂያ"/>
+<l:gentext key="legalnotice" text="ህጋዊ ማስታወቂያ"/>
+<l:gentext key="MsgAud" text="ተመáˆáŠ«á‰½"/>
+<l:gentext key="msgaud" text="ተመáˆáŠ«á‰½"/>
+<l:gentext key="MsgLevel" text="ደረጃ"/>
+<l:gentext key="msglevel" text="ደረጃ"/>
+<l:gentext key="MsgOrig" text="áˆáŠ•áŒ­"/>
+<l:gentext key="msgorig" text="áˆáŠ•áŒ­"/>
+<l:gentext key="NOTE" text="ማስታወሻ"/>
+<l:gentext key="Note" text="ማስታወሻ"/>
+<l:gentext key="note" text="ማስታወሻ"/>
+<l:gentext key="Part" text="ክááˆ"/>
+<l:gentext key="part" text="ክááˆ"/>
+<l:gentext key="Preface" text="መቅድáˆ"/>
+<l:gentext key="preface" text="መቅድáˆ"/>
+<l:gentext key="Procedure" text="ቅደሠተከተáˆ"/>
+<l:gentext key="procedure" text="ቅደሠተከተáˆ"/>
+<l:gentext key="ProductionSet" text="áˆáˆ­á‰µ"/>
+<l:gentext key="PubDate" text="የታተመበት ቀን"/>
+<l:gentext key="pubdate" text="የታተመበት ቀን"/>
+<l:gentext key="Published" text="ታትሟáˆ"/>
+<l:gentext key="published" text="ታትሟáˆ"/>
+<l:gentext key="Publisher" text="Publisher" lang="en"/>
+<l:gentext key="Qandadiv" text="ጥያቄ እና መáˆáˆµ"/>
+<l:gentext key="qandadiv" text="ጥያቄ እና መáˆáˆµ"/>
+<l:gentext key="QandASet" text="Frequently Asked Questions" lang="en"/>
+<l:gentext key="Question" text="ጥá¦"/>
+<l:gentext key="question" text="ጥá¦"/>
+<l:gentext key="RefEntry" text=""/>
+<l:gentext key="refentry" text=""/>
+<l:gentext key="Reference" text="ማጣቀሻ"/>
+<l:gentext key="reference" text="ማጣቀሻ"/>
+<l:gentext key="References" text="References" lang="en"/>
+<l:gentext key="RefName" text="ስáˆ"/>
+<l:gentext key="refname" text="ስáˆ"/>
+<l:gentext key="RefSection" text=""/>
+<l:gentext key="refsection" text=""/>
+<l:gentext key="RefSynopsisDiv" text="መáŒáˆˆáŒ«"/>
+<l:gentext key="refsynopsisdiv" text="መáŒáˆˆáŒ«"/>
+<l:gentext key="RevHistory" text="የተሻሻለ ታሪክ"/>
+<l:gentext key="revhistory" text="የተሻሻለ ታሪክ"/>
+<l:gentext key="revision" text="የተሻሻለ"/>
+<l:gentext key="Revision" text="የተሻሻለ"/>
+<l:gentext key="sect1" text="ክááˆ"/>
+<l:gentext key="sect2" text="ክááˆ"/>
+<l:gentext key="sect3" text="ክááˆ"/>
+<l:gentext key="sect4" text="ክááˆ"/>
+<l:gentext key="sect5" text="ክááˆ"/>
+<l:gentext key="section" text="ክááˆ"/>
+<l:gentext key="Section" text="ክááˆ"/>
+<l:gentext key="see" text="ማየት (እይ)"/>
+<l:gentext key="See" text="ማየት (እይ)"/>
+<l:gentext key="seealso" text="…ንሠእይ"/>
+<l:gentext key="Seealso" text="…ንሠእይ"/>
+<l:gentext key="SeeAlso" text="…ንሠእይ"/>
+<l:gentext key="set" text="አድርáŒ"/>
+<l:gentext key="Set" text="አድርáŒ"/>
+<l:gentext key="setindex" text="ማá‹áŒ«á‹áŠ• ይመáˆáŠ¨á‰±"/>
+<l:gentext key="SetIndex" text="ማá‹áŒ«á‹áŠ• ይመáˆáŠ¨á‰±"/>
+<l:gentext key="Sidebar" text=""/>
+<l:gentext key="sidebar" text="የጥጠቋሚ"/>
+<l:gentext key="step" text="ደረጃ"/>
+<l:gentext key="Step" text="ደረጃ"/>
+<l:gentext key="table" text="ሠንጠረዥ"/>
+<l:gentext key="Table" text="ሠንጠረዥ"/>
+<l:gentext key="task" text="Task" lang="en"/>
+<l:gentext key="Task" text="Task" lang="en"/>
+<l:gentext key="tip" text="áንጭ"/>
+<l:gentext key="TIP" text="áንጭ"/>
+<l:gentext key="Tip" text="áንጭ"/>
+<l:gentext key="Warning" text="ማስጠንቀቂያ"/>
+<l:gentext key="warning" text="ማስጠንቀቂያ"/>
+<l:gentext key="WARNING" text="ማስጠንቀቂያ"/>
+<l:gentext key="and" text="እና"/>
+<l:gentext key="by" text="በ"/>
+<l:gentext key="Edited" text="የተዘጋጀ"/>
+<l:gentext key="edited" text="የተዘጋጀ"/>
+<l:gentext key="Editedby" text="የተዘጋጀዠበ"/>
+<l:gentext key="editedby" text="የተዘጋጀዠበ"/>
+<l:gentext key="in" text="á‹áˆµáŒ¥"/>
+<l:gentext key="lastlistcomma" text="á£"/>
+<l:gentext key="listcomma" text="á£"/>
+<l:gentext key="notes" text="ማስታወሻዎች"/>
+<l:gentext key="Notes" text="ማስታወሻዎች"/>
+<l:gentext key="Pgs" text="ገጾች"/>
+<l:gentext key="pgs" text="ገጾች"/>
+<l:gentext key="Revisedby" text="የተሻሻለዠበ"/>
+<l:gentext key="revisedby" text="የተሻሻለዠበ"/>
+<l:gentext key="TableNotes" text="ማስታወሻዎች"/>
+<l:gentext key="tablenotes" text="ማስታወሻዎች"/>
+<l:gentext key="TableofContents" text="ማá‹áŒ«"/>
+<l:gentext key="tableofcontents" text="ማá‹áŒ«"/>
+<l:gentext key="unexpectedelementname" text="á‹«áˆá‰°áŒ á‰ á‰€ የመሠረታዊ áŠáŒˆáˆ­ ስáˆ"/>
+<l:gentext key="unsupported" text="á‹«áˆá‰°á‹°áŒˆáˆ"/>
+<l:gentext key="xrefto" text="xref ወደ"/>
+<l:gentext key="Authors" text="Authors" lang="en"/>
+<l:gentext key="copyeditor" text="Copy Editor" lang="en"/>
+<l:gentext key="graphicdesigner" text="Graphic Designer" lang="en"/>
+<l:gentext key="productioneditor" text="Production Editor" lang="en"/>
+<l:gentext key="technicaleditor" text="Technical Editor" lang="en"/>
+<l:gentext key="translator" text="Translator" lang="en"/>
+<l:gentext key="listofequations" text="የእኩሌታዎች á‹áˆ­á‹áˆ­"/>
+<l:gentext key="ListofEquations" text="የእኩሌታዎች á‹áˆ­á‹áˆ­"/>
+<l:gentext key="ListofExamples" text="የáˆáˆ³áˆŒá‹Žá‰½ á‹áˆ­á‹áˆ­"/>
+<l:gentext key="listofexamples" text="የáˆáˆ³áˆŒá‹Žá‰½ á‹áˆ­á‹áˆ­"/>
+<l:gentext key="ListofFigures" text="የáˆáˆµáˆŽá‰½ á‹áˆ­á‹áˆ­"/>
+<l:gentext key="listoffigures" text="የáˆáˆµáˆŽá‰½ á‹áˆ­á‹áˆ­"/>
+<l:gentext key="ListofProcedures" text="የቅደሠተከተሎቹ á‹áˆ­á‹áˆ­"/>
+<l:gentext key="listofprocedures" text="የቅደሠተከተሎቹ á‹áˆ­á‹áˆ­"/>
+<l:gentext key="listoftables" text="የሠንጠረዦቹ á‹áˆ­á‹áˆ­"/>
+<l:gentext key="ListofTables" text="የሠንጠረዦቹ á‹áˆ­á‹áˆ­"/>
+<l:gentext key="ListofUnknown" text="á‹«áˆá‰³á‹ˆá‰ á‹áˆ­á‹áˆ­"/>
+<l:gentext key="listofunknown" text="á‹«áˆá‰³á‹ˆá‰ á‹áˆ­á‹áˆ­"/>
+<l:gentext key="nav-home" text="መጀመሪያ"/>
+<l:gentext key="nav-next" text="የሚቀጥለá‹"/>
+<l:gentext key="nav-next-sibling" text="በáጥáŠá‰µ ወደáŠá‰µ"/>
+<l:gentext key="nav-prev" text="ያለáˆá‹"/>
+<l:gentext key="nav-prev-sibling" text="በáጥáŠá‰µ ወደኋላ"/>
+<l:gentext key="nav-up" text="ወደ ላይ"/>
+<l:gentext key="nav-toc" text="ወደ ሲ"/>
+<l:gentext key="Draft" text="ንድá"/>
+<l:gentext key="above" text="ከላይ"/>
+<l:gentext key="below" text="ከስር"/>
+<l:gentext key="sectioncalled" text="የክáሉ መጠሪያ"/>
+<l:gentext key="index symbols" text="áˆáˆáŠ­á‰¶á‰½"/>
+<l:gentext key="writing-mode" text="lr-tb"/>
+<l:gentext key="lowercase.alpha" text="abcdefghijklmnopqrstuvwxyz"/>
+<l:gentext key="uppercase.alpha" text="ABCDEFGHIJKLMNOPQRSTUVWXYZ"/>
+<l:gentext key="normalize.sort.input" text="AaÀàÃáÂâÃãÄäÅåĀÄĂ㥹ÇǎǞǟǠǡǺǻȀÈȂȃȦȧḀá¸áºšáº áº¡áº¢áº£áº¤áº¥áº¦áº§áº¨áº©áºªáº«áº¬áº­áº®áº¯áº°áº±áº²áº³áº´áºµáº¶áº·BbÆ€ÆɓƂƃḂḃḄḅḆḇCcÇçĆćĈĉĊċČÄƇƈɕḈḉDdÄŽÄÄđƊɗƋƌDžDzȡɖḊḋḌá¸á¸Žá¸á¸á¸‘ḒḓEeÈèÉéÊêËëĒēĔĕĖėĘęĚěȄȅȆȇȨȩḔḕḖḗḘḙḚḛḜá¸áº¸áº¹áººáº»áº¼áº½áº¾áº¿á»€á»á»‚ểỄễỆệFfƑƒḞḟGgÄœÄĞğĠġĢģƓɠǤǥǦǧǴǵḠḡHhĤĥĦħȞȟɦḢḣḤḥḦḧḨḩḪḫẖIiÌìÃíÎîÃïĨĩĪīĬĭĮįİƗɨÇÇȈȉȊȋḬḭḮḯỈỉỊịJjĴĵǰÊKkĶķƘƙǨǩḰḱḲḳḴḵLlĹĺĻļĽľĿŀÅłƚLjȴɫɬɭḶḷḸḹḺḻḼḽMmɱḾḿṀá¹á¹‚ṃNnÑñŃńŅņŇňÆɲƞȠNjǸǹȵɳṄṅṆṇṈṉṊṋOoÒòÓóÔôÕõÖöØøŌÅÅŽÅÅőƟƠơǑǒǪǫǬǭǾǿȌÈÈŽÈȪȫȬȭȮȯȰȱṌá¹á¹Žá¹á¹á¹‘ṒṓỌá»á»Žá»á»á»‘ỒồỔổỖỗỘộỚớỜá»á»žá»Ÿá» á»¡á»¢á»£PpƤƥṔṕṖṗQqÊ RrŔŕŖŗŘřÈȑȒȓɼɽɾṘṙṚṛṜá¹á¹žá¹ŸSsŚśŜÅŞşŠšȘșʂṠṡṢṣṤṥṦṧṨṩTtŢţŤťŦŧƫƬƭƮʈȚțȶṪṫṬṭṮṯṰṱẗUuÙùÚúÛûÜüŨũŪūŬŭŮůŰűŲųƯưǓǔǕǖǗǘǙǚǛǜȔȕȖȗṲṳṴṵṶṷṸṹṺṻỤụỦủỨứỪừỬửỮữỰựVvƲʋṼṽṾṿWwŴŵẀáºáº‚ẃẄẅẆẇẈẉẘXxẊẋẌáºYyÃýÿŸŶŷƳƴȲȳẎáºáº™á»²á»³á»´á»µá»¶á»·á»¸á»¹ZzŹźŻżŽžƵƶȤȥÊÊ‘áºáº‘ẒẓẔẕẕ" lang="en"/>
+<l:gentext key="normalize.sort.output" text="AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBCCCCCCCCCCCCCCCCCDDDDDDDDDDDDDDDDDDDDDDDDEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEFFFFFFGGGGGGGGGGGGGGGGGGGGHHHHHHHHHHHHHHHHHHHHIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIJJJJJJKKKKKKKKKKKKKKLLLLLLLLLLLLLLLLLLLLLLLLLLMMMMMMMMMNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOPPPPPPPPQQQRRRRRRRRRRRRRRRRRRRRRRRSSSSSSSSSSSSSSSSSSSSSSSTTTTTTTTTTTTTTTTTTTTTTTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUVVVVVVVVWWWWWWWWWWWWWWWXXXXXXYYYYYYYYYYYYYYYYYYYYYYYZZZZZZZZZZZZZZZZZZZZZ" lang="en"/>
+<l:dingbat key="startquote" text="“"/>
+<l:dingbat key="endquote" text="â€"/>
+<l:dingbat key="nestedstartquote" text="‘"/>
+<l:dingbat key="nestedendquote" text="’"/>
+<l:dingbat key="singlestartquote" text="‘"/>
+<l:dingbat key="singleendquote" text="’"/>
+<l:dingbat key="bullet" text="•"/>
+<l:gentext key="hyphenation-character" text="-"/>
+<l:gentext key="hyphenation-push-character-count" text="2"/>
+<l:gentext key="hyphenation-remain-character-count" text="2"/>
+<l:context name="styles"><l:template name="person-name" text="first-last"/>
+</l:context>
+<l:context name="title"><l:template name="abstract" text="%t"/>
+<l:template name="acknowledgements" text="%t" lang="en"/>
+<l:template name="answer" text="%t"/>
+<l:template name="appendix" text="ተጨማሪ %n. %t"/>
+<l:template name="article" text="%t"/>
+<l:template name="authorblurb" text="%t"/>
+<l:template name="bibliodiv" text="%t"/>
+<l:template name="biblioentry" text="%t"/>
+<l:template name="bibliography" text="%t"/>
+<l:template name="bibliolist" text="%t"/>
+<l:template name="bibliomixed" text="%t"/>
+<l:template name="bibliomset" text="%t"/>
+<l:template name="biblioset" text="%t"/>
+<l:template name="blockquote" text="%t"/>
+<l:template name="book" text="%t"/>
+<l:template name="calloutlist" text="%t"/>
+<l:template name="caution" text="%t"/>
+<l:template name="chapter" text="áˆá‹•áˆ«á %n. %t"/>
+<l:template name="colophon" text="%t"/>
+<l:template name="dedication" text="%t"/>
+<l:template name="equation" text="እኩሌታ %n. %t"/>
+<l:template name="example" text="ለáˆáˆ³áˆŒÂ %n. %t"/>
+<l:template name="figure" text="áˆáˆµáˆÂ %n. %t"/>
+<l:template name="foil" text="%t"/>
+<l:template name="foilgroup" text="%t"/>
+<l:template name="formalpara" text="%t"/>
+<l:template name="glossary" text="%t"/>
+<l:template name="glossdiv" text="%t"/>
+<l:template name="glosslist" text="%t"/>
+<l:template name="glossentry" text="%t"/>
+<l:template name="important" text="%t"/>
+<l:template name="index" text="%t"/>
+<l:template name="indexdiv" text="%t"/>
+<l:template name="itemizedlist" text="%t"/>
+<l:template name="legalnotice" text="%t"/>
+<l:template name="listitem" text=""/>
+<l:template name="lot" text="%t"/>
+<l:template name="msg" text="%t"/>
+<l:template name="msgexplan" text="%t"/>
+<l:template name="msgmain" text="%t"/>
+<l:template name="msgrel" text="%t"/>
+<l:template name="msgset" text="%t"/>
+<l:template name="msgsub" text="%t"/>
+<l:template name="note" text="%t"/>
+<l:template name="orderedlist" text="%t"/>
+<l:template name="part" text="ክááˆÂ %n. %t"/>
+<l:template name="partintro" text="%t"/>
+<l:template name="preface" text="%t"/>
+<l:template name="procedure" text="%t"/>
+<l:template name="procedure.formal" text="ቅደሠተከተáˆÂ %n. %t"/>
+<l:template name="productionset" text="%t"/>
+<l:template name="productionset.formal" text="áˆáˆ­á‰µÂ %n"/>
+<l:template name="qandadiv" text="%t"/>
+<l:template name="qandaentry" text="%t"/>
+<l:template name="qandaset" text="%t"/>
+<l:template name="question" text="%t"/>
+<l:template name="refentry" text="%t"/>
+<l:template name="reference" text="%t"/>
+<l:template name="refsection" text="%t"/>
+<l:template name="refsect1" text="%t"/>
+<l:template name="refsect2" text="%t"/>
+<l:template name="refsect3" text="%t"/>
+<l:template name="refsynopsisdiv" text="%t"/>
+<l:template name="refsynopsisdivinfo" text="%t"/>
+<l:template name="segmentedlist" text="%t"/>
+<l:template name="set" text="%t"/>
+<l:template name="setindex" text="%t"/>
+<l:template name="sidebar" text="%t"/>
+<l:template name="step" text="%t"/>
+<l:template name="table" text="ሠንጠረዥ %n. %t"/>
+<l:template name="task" text="%t"/>
+<l:template name="tasksummary" text="%t" lang="en"/>
+<l:template name="taskprerequisites" text="%t" lang="en"/>
+<l:template name="taskrelated" text="%t" lang="en"/>
+<l:template name="tip" text="%t"/>
+<l:template name="toc" text="%t"/>
+<l:template name="variablelist" text="%t"/>
+<l:template name="varlistentry" text=""/>
+<l:template name="warning" text="%t"/>
+</l:context>
+<l:context name="title-unnumbered"><l:template name="appendix" text="%t"/>
+<l:template name="article/appendix" text="%t"/>
+<l:template name="bridgehead" text="%t"/>
+<l:template name="chapter" text="%t"/>
+<l:template name="sect1" text="%t"/>
+<l:template name="sect2" text="%t"/>
+<l:template name="sect3" text="%t"/>
+<l:template name="sect4" text="%t"/>
+<l:template name="sect5" text="%t"/>
+<l:template name="section" text="%t"/>
+<l:template name="simplesect" text="%t"/>
+<l:template name="part" text="%t" lang="en"/>
+</l:context>
+<l:context name="title-numbered"><l:template name="appendix" text="ተጨማሪ %n. %t"/>
+<l:template name="article/appendix" text="%n. %t"/>
+<l:template name="bridgehead" text="%n. %t"/>
+<l:template name="chapter" text="áˆá‹•áˆ«á %n. %t"/>
+<l:template name="part" text="ክááˆÂ %n. %t"/>
+<l:template name="sect1" text="%n. %t"/>
+<l:template name="sect2" text="%n. %t"/>
+<l:template name="sect3" text="%n. %t"/>
+<l:template name="sect4" text="%n. %t"/>
+<l:template name="sect5" text="%n. %t"/>
+<l:template name="section" text="%n. %t"/>
+<l:template name="simplesect" text="%t"/>
+</l:context>
+<l:context name="subtitle"><l:template name="appendix" text="%s"/>
+<l:template name="acknowledgements" text="%s" lang="en"/>
+<l:template name="article" text="%s"/>
+<l:template name="bibliodiv" text="%s"/>
+<l:template name="biblioentry" text="%s"/>
+<l:template name="bibliography" text="%s"/>
+<l:template name="bibliomixed" text="%s"/>
+<l:template name="bibliomset" text="%s"/>
+<l:template name="biblioset" text="%s"/>
+<l:template name="book" text="%s"/>
+<l:template name="chapter" text="%s"/>
+<l:template name="colophon" text="%s"/>
+<l:template name="dedication" text="%s"/>
+<l:template name="glossary" text="%s"/>
+<l:template name="glossdiv" text="%s"/>
+<l:template name="index" text="%s"/>
+<l:template name="indexdiv" text="%s"/>
+<l:template name="lot" text="%s"/>
+<l:template name="part" text="%s"/>
+<l:template name="partintro" text="%s"/>
+<l:template name="preface" text="%s"/>
+<l:template name="refentry" text="%s"/>
+<l:template name="reference" text="%s"/>
+<l:template name="refsection" text="%s"/>
+<l:template name="refsect1" text="%s"/>
+<l:template name="refsect2" text="%s"/>
+<l:template name="refsect3" text="%s"/>
+<l:template name="refsynopsisdiv" text="%s"/>
+<l:template name="sect1" text="%s"/>
+<l:template name="sect2" text="%s"/>
+<l:template name="sect3" text="%s"/>
+<l:template name="sect4" text="%s"/>
+<l:template name="sect5" text="%s"/>
+<l:template name="section" text="%s"/>
+<l:template name="set" text="%s"/>
+<l:template name="setindex" text="%s"/>
+<l:template name="sidebar" text="%s"/>
+<l:template name="simplesect" text="%s"/>
+<l:template name="toc" text="%s"/>
+</l:context>
+<l:context name="xref"><l:template name="abstract" text="%t"/>
+<l:template name="acknowledgements" text="%t" lang="en"/>
+<l:template name="answer" text="መá¦Â %n"/>
+<l:template name="appendix" text="%t"/>
+<l:template name="article" text="%t"/>
+<l:template name="authorblurb" text="%t"/>
+<l:template name="bibliodiv" text="%t"/>
+<l:template name="bibliography" text="%t"/>
+<l:template name="bibliomset" text="%t"/>
+<l:template name="biblioset" text="%t"/>
+<l:template name="blockquote" text="%t"/>
+<l:template name="book" text="%t"/>
+<l:template name="calloutlist" text="%t"/>
+<l:template name="caution" text="%t"/>
+<l:template name="chapter" text="%t"/>
+<l:template name="colophon" text="%t"/>
+<l:template name="constraintdef" text="%t"/>
+<l:template name="dedication" text="%t"/>
+<l:template name="equation" text="%t"/>
+<l:template name="example" text="%t"/>
+<l:template name="figure" text="%t"/>
+<l:template name="foil" text="%t"/>
+<l:template name="foilgroup" text="%t"/>
+<l:template name="formalpara" text="%t"/>
+<l:template name="glossary" text="%t"/>
+<l:template name="glossdiv" text="%t"/>
+<l:template name="important" text="%t"/>
+<l:template name="index" text="%t"/>
+<l:template name="indexdiv" text="%t"/>
+<l:template name="itemizedlist" text="%t"/>
+<l:template name="legalnotice" text="%t"/>
+<l:template name="listitem" text="%n"/>
+<l:template name="lot" text="%t"/>
+<l:template name="msg" text="%t"/>
+<l:template name="msgexplan" text="%t"/>
+<l:template name="msgmain" text="%t"/>
+<l:template name="msgrel" text="%t"/>
+<l:template name="msgset" text="%t"/>
+<l:template name="msgsub" text="%t"/>
+<l:template name="note" text="%t"/>
+<l:template name="orderedlist" text="%t"/>
+<l:template name="part" text="%t"/>
+<l:template name="partintro" text="%t"/>
+<l:template name="preface" text="%t"/>
+<l:template name="procedure" text="%t"/>
+<l:template name="productionset" text="%t"/>
+<l:template name="qandadiv" text="%t"/>
+<l:template name="qandaentry" text="ጥá¦Â %n"/>
+<l:template name="qandaset" text="%t"/>
+<l:template name="question" text="ጥá¦Â %n"/>
+<l:template name="reference" text="%t"/>
+<l:template name="refsynopsisdiv" text="%t"/>
+<l:template name="segmentedlist" text="%t"/>
+<l:template name="set" text="%t"/>
+<l:template name="setindex" text="%t"/>
+<l:template name="sidebar" text="%t"/>
+<l:template name="table" text="%t"/>
+<l:template name="task" text="%t" lang="en"/>
+<l:template name="tip" text="%t"/>
+<l:template name="toc" text="%t"/>
+<l:template name="variablelist" text="%t"/>
+<l:template name="varlistentry" text="%n"/>
+<l:template name="warning" text="%t"/>
+<l:template name="olink.document.citation" text=" በ%o"/>
+<l:template name="olink.page.citation" text=" (ገጽ %p)"/>
+<l:template name="page.citation" text=" [%p]"/>
+<l:template name="page" text="(ገጽ %p)"/>
+<l:template name="docname" text=" in %o"/>
+<l:template name="docnamelong" text=" በዶሴዠá‹áˆµáŒ¥ ርዕስ የተሰጠዠ%o"/>
+<l:template name="pageabbrev" text="(ገጽ %p)"/>
+<l:template name="Page" text="ገጽ %p"/>
+<l:template name="bridgehead" text="የክáሉ መጠሪያ “%tâ€"/>
+<l:template name="refsection" text="የክáሉ መጠሪያ “%tâ€"/>
+<l:template name="refsect1" text="የክáሉ መጠሪያ “%tâ€"/>
+<l:template name="refsect2" text="የክáሉ መጠሪያ “%tâ€"/>
+<l:template name="refsect3" text="የክáሉ መጠሪያ “%tâ€"/>
+<l:template name="sect1" text="የክáሉ መጠሪያ “%tâ€"/>
+<l:template name="sect2" text="የክáሉ መጠሪያ “%tâ€"/>
+<l:template name="sect3" text="የክáሉ መጠሪያ “%tâ€"/>
+<l:template name="sect4" text="የክáሉ መጠሪያ “%tâ€"/>
+<l:template name="sect5" text="የክáሉ መጠሪያ “%tâ€"/>
+<l:template name="section" text="የክáሉ መጠሪያ “%tâ€"/>
+<l:template name="simplesect" text="የክáሉ መጠሪያ “%tâ€"/>
+</l:context>
+<l:context name="xref-number"><l:template name="answer" text="መá¦Â %n"/>
+<l:template name="appendix" text="ተጨማሪ %n"/>
+<l:template name="bridgehead" text="ክááˆÂ %n"/>
+<l:template name="chapter" text="áˆá‹•áˆ«á %n"/>
+<l:template name="equation" text="እኩሌታ %n"/>
+<l:template name="example" text="ለáˆáˆ³áˆŒÂ %n"/>
+<l:template name="figure" text="áˆáˆµáˆÂ %n"/>
+<l:template name="part" text="ክááˆÂ %n"/>
+<l:template name="procedure" text="ቅደሠተከተáˆÂ %n"/>
+<l:template name="productionset" text="áˆáˆ­á‰µÂ %n"/>
+<l:template name="qandadiv" text="ጥያቄ እና መáˆáˆµÂ %n"/>
+<l:template name="qandaentry" text="ጥá¦Â %n"/>
+<l:template name="question" text="ጥá¦Â %n"/>
+<l:template name="sect1" text="ክááˆÂ %n"/>
+<l:template name="sect2" text="ክááˆÂ %n"/>
+<l:template name="sect3" text="ክááˆÂ %n"/>
+<l:template name="sect4" text="ክááˆÂ %n"/>
+<l:template name="sect5" text="ክááˆÂ %n"/>
+<l:template name="section" text="ክááˆÂ %n"/>
+<l:template name="table" text="ሠንጠረዥ %n"/>
+</l:context>
+<l:context name="xref-number-and-title"><l:template name="appendix" text="ተጨማሪ %n, %t"/>
+<l:template name="bridgehead" text="ክááˆÂ %n, “%tâ€"/>
+<l:template name="chapter" text="áˆá‹•áˆ«á %n, %t"/>
+<l:template name="equation" text="እኩሌታ %n, “%tâ€"/>
+<l:template name="example" text="ለáˆáˆ³áˆŒÂ %n, “%tâ€"/>
+<l:template name="figure" text="áˆáˆµáˆÂ %n, “%tâ€"/>
+<l:template name="part" text="ክááˆÂ %n, “%tâ€"/>
+<l:template name="procedure" text="ቅደሠተከተáˆÂ %n, “%tâ€"/>
+<l:template name="productionset" text="áˆáˆ­á‰µÂ %n, “%tâ€"/>
+<l:template name="qandadiv" text="ጥያቄ እና መáˆáˆµÂ %n, “%tâ€"/>
+<l:template name="refsect1" text="የክáሉ መጠሪያ “%tâ€"/>
+<l:template name="refsect2" text="የክáሉ መጠሪያ “%tâ€"/>
+<l:template name="refsect3" text="የክáሉ መጠሪያ “%tâ€"/>
+<l:template name="refsection" text="የክáሉ መጠሪያ “%tâ€"/>
+<l:template name="sect1" text="ክááˆÂ %n, “%tâ€"/>
+<l:template name="sect2" text="ክááˆÂ %n, “%tâ€"/>
+<l:template name="sect3" text="ክááˆÂ %n, “%tâ€"/>
+<l:template name="sect4" text="ክááˆÂ %n, “%tâ€"/>
+<l:template name="sect5" text="ክááˆÂ %n, “%tâ€"/>
+<l:template name="section" text="ክááˆÂ %n, “%tâ€"/>
+<l:template name="simplesect" text="የክáሉ መጠሪያ “%tâ€"/>
+<l:template name="table" text="ሠንጠረዥ %n, “%tâ€"/>
+</l:context>
+<l:context name="authorgroup"><l:template name="sep" text="ᣠ"/>
+<l:template name="sep2" text=" እና "/>
+<l:template name="seplast" text="ᣠእና "/>
+</l:context>
+<l:context name="glossary"><l:template name="see" text="ማየት (እይ) %t."/>
+<l:template name="seealso" text="…ንሠእይ %t."/>
+<l:template name="seealso-separator" text=", "/>
+</l:context>
+<l:context name="msgset"><l:template name="MsgAud" text="ተመáˆáŠ«á‰½á¦ "/>
+<l:template name="MsgLevel" text="ደረጃᦠ"/>
+<l:template name="MsgOrig" text="áˆáŠ•áŒ­á¦ "/>
+</l:context>
+<l:context name="datetime"><l:template name="format" text="d B Y"/>
+</l:context>
+<l:context name="termdef"><l:template name="prefix" text="[ትርጉáˆá¦ "/>
+<l:template name="suffix" text="]"/>
+</l:context>
+<l:context name="datetime-full"><l:template name="January" text="ጃንዩወሪ"/>
+<l:template name="February" text="áŒá‰¥áˆ©á‹ˆáˆª"/>
+<l:template name="March" text="ማርች"/>
+<l:template name="April" text="ኤá•áˆ¨áˆ"/>
+<l:template name="May" text="ሜይ"/>
+<l:template name="June" text="áŒáŠ•"/>
+<l:template name="July" text="áŒáˆ‹á‹­"/>
+<l:template name="August" text="ኦገስት"/>
+<l:template name="September" text="ሴá•á‰´áˆá‰ áˆ­"/>
+<l:template name="October" text="ኦክተá‹á‰ áˆ­"/>
+<l:template name="November" text="ኖቬáˆá‰ áˆ­"/>
+<l:template name="December" text="ዲሴáˆá‰ áˆ­"/>
+<l:template name="Monday" text="ሰኞ"/>
+<l:template name="Tuesday" text="ማክሰኞ"/>
+<l:template name="Wednesday" text="ረቡዕ"/>
+<l:template name="Thursday" text="áˆáˆ™áˆµ"/>
+<l:template name="Friday" text="ዓርብ"/>
+<l:template name="Saturday" text="ቅዳሜ"/>
+<l:template name="Sunday" text="እሑድ"/>
+</l:context>
+<l:context name="datetime-abbrev"><l:template name="Jan" text="ጃንዩ"/>
+<l:template name="Feb" text="áŒá‰¥áˆ©"/>
+<l:template name="Mar" text="ማርች"/>
+<l:template name="Apr" text="ኤá•áˆ¨"/>
+<l:template name="May" text="ሜይ "/>
+<l:template name="Jun" text="áŒáŠ• "/>
+<l:template name="Jul" text="áŒáˆ‹á‹­"/>
+<l:template name="Aug" text="ኦገስ"/>
+<l:template name="Sep" text="ሴá•á‰´"/>
+<l:template name="Oct" text="ኦክተ"/>
+<l:template name="Nov" text="ኖቬáˆ"/>
+<l:template name="Dec" text="ዲሴáˆ"/>
+<l:template name="Mon" text="ሰኞ "/>
+<l:template name="Tue" text="ማክሰ"/>
+<l:template name="Wed" text="ረቡዕ"/>
+<l:template name="Thu" text="áˆáˆ™áˆµ"/>
+<l:template name="Fri" text="ዓርብ"/>
+<l:template name="Sat" text="ቅዳሜ"/>
+<l:template name="Sun" text="እሑድ"/>
+</l:context>
+<l:context name="htmlhelp"><l:template name="langcode" text="0x0409 English"/>
+</l:context>
+<l:context name="index"><l:template name="term-separator" text=", " lang="en"/>
+<l:template name="number-separator" text=", " lang="en"/>
+<l:template name="range-separator" text="-" lang="en"/>
+</l:context>
+<l:context name="iso690"><l:template name="lastfirst.sep" text=", " lang="en"/>
+<l:template name="alt.person.two.sep" text=" – " lang="en"/>
+<l:template name="alt.person.last.sep" text=" – " lang="en"/>
+<l:template name="alt.person.more.sep" text=" – " lang="en"/>
+<l:template name="primary.editor" text=" (ed.)" lang="en"/>
+<l:template name="primary.many" text=", et al." lang="en"/>
+<l:template name="primary.sep" text=". " lang="en"/>
+<l:template name="submaintitle.sep" text=": " lang="en"/>
+<l:template name="title.sep" text=". " lang="en"/>
+<l:template name="othertitle.sep" text=", " lang="en"/>
+<l:template name="medium1" text=" [" lang="en"/>
+<l:template name="medium2" text="]" lang="en"/>
+<l:template name="secondary.person.sep" text="; " lang="en"/>
+<l:template name="secondary.sep" text=". " lang="en"/>
+<l:template name="respons.sep" text=". " lang="en"/>
+<l:template name="edition.sep" text=". " lang="en"/>
+<l:template name="edition.serial.sep" text=", " lang="en"/>
+<l:template name="issuing.range" text="-" lang="en"/>
+<l:template name="issuing.div" text=", " lang="en"/>
+<l:template name="issuing.sep" text=". " lang="en"/>
+<l:template name="partnr.sep" text=". " lang="en"/>
+<l:template name="placepubl.sep" text=": " lang="en"/>
+<l:template name="publyear.sep" text=", " lang="en"/>
+<l:template name="pubinfo.sep" text=". " lang="en"/>
+<l:template name="spec.pubinfo.sep" text=", " lang="en"/>
+<l:template name="upd.sep" text=", " lang="en"/>
+<l:template name="datecit1" text=" [cited " lang="en"/>
+<l:template name="datecit2" text="]" lang="en"/>
+<l:template name="extent.sep" text=". " lang="en"/>
+<l:template name="locs.sep" text=", " lang="en"/>
+<l:template name="location.sep" text=". " lang="en"/>
+<l:template name="serie.sep" text=". " lang="en"/>
+<l:template name="notice.sep" text=". " lang="en"/>
+<l:template name="access" text="Available " lang="en"/>
+<l:template name="acctoo" text="Also available " lang="en"/>
+<l:template name="onwww" text="from World Wide Web" lang="en"/>
+<l:template name="oninet" text="from Internet" lang="en"/>
+<l:template name="access.end" text=": " lang="en"/>
+<l:template name="link1" text="&lt;" lang="en"/>
+<l:template name="link2" text="&gt;" lang="en"/>
+<l:template name="access.sep" text=". " lang="en"/>
+<l:template name="isbn" text="ISBN " lang="en"/>
+<l:template name="issn" text="ISSN " lang="en"/>
+<l:template name="stdnum.sep" text=". " lang="en"/>
+<l:template name="patcountry.sep" text=". " lang="en"/>
+<l:template name="pattype.sep" text=", " lang="en"/>
+<l:template name="patnum.sep" text=". " lang="en"/>
+<l:template name="patdate.sep" text=". " lang="en"/>
+</l:context><l:letters><l:l i="-1"/>
+<l:l i="0">áˆáˆáŠ­á‰¶á‰½</l:l>
+<l:l i="10">A</l:l>
+<l:l i="10">a</l:l>
+<l:l i="10">À</l:l>
+<l:l i="10">à</l:l>
+<l:l i="10">Ã</l:l>
+<l:l i="10">á</l:l>
+<l:l i="10">Â</l:l>
+<l:l i="10">â</l:l>
+<l:l i="10">Ã</l:l>
+<l:l i="10">ã</l:l>
+<l:l i="10">Ä</l:l>
+<l:l i="10">ä</l:l>
+<l:l i="10">Ã…</l:l>
+<l:l i="10">Ã¥</l:l>
+<l:l i="10">Ä€</l:l>
+<l:l i="10">Ä</l:l>
+<l:l i="10">Ä‚</l:l>
+<l:l i="10">ă</l:l>
+<l:l i="10">Ä„</l:l>
+<l:l i="10">Ä…</l:l>
+<l:l i="10">Ç</l:l>
+<l:l i="10">ÇŽ</l:l>
+<l:l i="10">Çž</l:l>
+<l:l i="10">ÇŸ</l:l>
+<l:l i="10">Ç </l:l>
+<l:l i="10">Ç¡</l:l>
+<l:l i="10">Ǻ</l:l>
+<l:l i="10">Ç»</l:l>
+<l:l i="10">È€</l:l>
+<l:l i="10">È</l:l>
+<l:l i="10">È‚</l:l>
+<l:l i="10">ȃ</l:l>
+<l:l i="10">Ȧ</l:l>
+<l:l i="10">ȧ</l:l>
+<l:l i="10">Ḁ</l:l>
+<l:l i="10">á¸</l:l>
+<l:l i="10">ẚ</l:l>
+<l:l i="10">Ạ</l:l>
+<l:l i="10">ạ</l:l>
+<l:l i="10">Ả</l:l>
+<l:l i="10">ả</l:l>
+<l:l i="10">Ấ</l:l>
+<l:l i="10">ấ</l:l>
+<l:l i="10">Ầ</l:l>
+<l:l i="10">ầ</l:l>
+<l:l i="10">Ẩ</l:l>
+<l:l i="10">ẩ</l:l>
+<l:l i="10">Ẫ</l:l>
+<l:l i="10">ẫ</l:l>
+<l:l i="10">Ậ</l:l>
+<l:l i="10">ậ</l:l>
+<l:l i="10">Ắ</l:l>
+<l:l i="10">ắ</l:l>
+<l:l i="10">Ằ</l:l>
+<l:l i="10">ằ</l:l>
+<l:l i="10">Ẳ</l:l>
+<l:l i="10">ẳ</l:l>
+<l:l i="10">Ẵ</l:l>
+<l:l i="10">ẵ</l:l>
+<l:l i="10">Ặ</l:l>
+<l:l i="10">ặ</l:l>
+<l:l i="20">B</l:l>
+<l:l i="20">b</l:l>
+<l:l i="20">Æ€</l:l>
+<l:l i="20">Æ</l:l>
+<l:l i="20">É“</l:l>
+<l:l i="20">Æ‚</l:l>
+<l:l i="20">ƃ</l:l>
+<l:l i="20">Ḃ</l:l>
+<l:l i="20">ḃ</l:l>
+<l:l i="20">Ḅ</l:l>
+<l:l i="20">ḅ</l:l>
+<l:l i="20">Ḇ</l:l>
+<l:l i="20">ḇ</l:l>
+<l:l i="30">C</l:l>
+<l:l i="30">c</l:l>
+<l:l i="30">Ç</l:l>
+<l:l i="30">ç</l:l>
+<l:l i="30">Ć</l:l>
+<l:l i="30">ć</l:l>
+<l:l i="30">Ĉ</l:l>
+<l:l i="30">ĉ</l:l>
+<l:l i="30">ÄŠ</l:l>
+<l:l i="30">Ä‹</l:l>
+<l:l i="30">Č</l:l>
+<l:l i="30">Ä</l:l>
+<l:l i="30">Ƈ</l:l>
+<l:l i="30">ƈ</l:l>
+<l:l i="30">É•</l:l>
+<l:l i="30">Ḉ</l:l>
+<l:l i="30">ḉ</l:l>
+<l:l i="40">D</l:l>
+<l:l i="40">d</l:l>
+<l:l i="40">ÄŽ</l:l>
+<l:l i="40">Ä</l:l>
+<l:l i="40">Ä</l:l>
+<l:l i="40">Ä‘</l:l>
+<l:l i="40">ÆŠ</l:l>
+<l:l i="40">É—</l:l>
+<l:l i="40">Æ‹</l:l>
+<l:l i="40">ƌ</l:l>
+<l:l i="40">Ç…</l:l>
+<l:l i="40">Dz</l:l>
+<l:l i="40">È¡</l:l>
+<l:l i="40">É–</l:l>
+<l:l i="40">Ḋ</l:l>
+<l:l i="40">ḋ</l:l>
+<l:l i="40">Ḍ</l:l>
+<l:l i="40">á¸</l:l>
+<l:l i="40">Ḏ</l:l>
+<l:l i="40">á¸</l:l>
+<l:l i="40">á¸</l:l>
+<l:l i="40">ḑ</l:l>
+<l:l i="40">Ḓ</l:l>
+<l:l i="40">ḓ</l:l>
+<l:l i="50">E</l:l>
+<l:l i="50">e</l:l>
+<l:l i="50">È</l:l>
+<l:l i="50">è</l:l>
+<l:l i="50">É</l:l>
+<l:l i="50">é</l:l>
+<l:l i="50">Ê</l:l>
+<l:l i="50">ê</l:l>
+<l:l i="50">Ë</l:l>
+<l:l i="50">ë</l:l>
+<l:l i="50">Ä’</l:l>
+<l:l i="50">Ä“</l:l>
+<l:l i="50">Ä”</l:l>
+<l:l i="50">Ä•</l:l>
+<l:l i="50">Ä–</l:l>
+<l:l i="50">Ä—</l:l>
+<l:l i="50">Ę</l:l>
+<l:l i="50">Ä™</l:l>
+<l:l i="50">Äš</l:l>
+<l:l i="50">Ä›</l:l>
+<l:l i="50">È„</l:l>
+<l:l i="50">È…</l:l>
+<l:l i="50">Ȇ</l:l>
+<l:l i="50">ȇ</l:l>
+<l:l i="50">Ȩ</l:l>
+<l:l i="50">È©</l:l>
+<l:l i="50">Ḕ</l:l>
+<l:l i="50">ḕ</l:l>
+<l:l i="50">Ḗ</l:l>
+<l:l i="50">ḗ</l:l>
+<l:l i="50">Ḙ</l:l>
+<l:l i="50">ḙ</l:l>
+<l:l i="50">Ḛ</l:l>
+<l:l i="50">ḛ</l:l>
+<l:l i="50">Ḝ</l:l>
+<l:l i="50">á¸</l:l>
+<l:l i="50">Ẹ</l:l>
+<l:l i="50">ẹ</l:l>
+<l:l i="50">Ẻ</l:l>
+<l:l i="50">ẻ</l:l>
+<l:l i="50">Ẽ</l:l>
+<l:l i="50">ẽ</l:l>
+<l:l i="50">Ế</l:l>
+<l:l i="50">ế</l:l>
+<l:l i="50">Ề</l:l>
+<l:l i="50">á»</l:l>
+<l:l i="50">Ể</l:l>
+<l:l i="50">ể</l:l>
+<l:l i="50">Ễ</l:l>
+<l:l i="50">á»…</l:l>
+<l:l i="50">Ệ</l:l>
+<l:l i="50">ệ</l:l>
+<l:l i="60">F</l:l>
+<l:l i="60">f</l:l>
+<l:l i="60">Æ‘</l:l>
+<l:l i="60">Æ’</l:l>
+<l:l i="60">Ḟ</l:l>
+<l:l i="60">ḟ</l:l>
+<l:l i="70">G</l:l>
+<l:l i="70">g</l:l>
+<l:l i="70">Ĝ</l:l>
+<l:l i="70">Ä</l:l>
+<l:l i="70">Äž</l:l>
+<l:l i="70">ÄŸ</l:l>
+<l:l i="70">Ä </l:l>
+<l:l i="70">Ä¡</l:l>
+<l:l i="70">Ä¢</l:l>
+<l:l i="70">Ä£</l:l>
+<l:l i="70">Æ“</l:l>
+<l:l i="70">É </l:l>
+<l:l i="70">Ǥ</l:l>
+<l:l i="70">Ç¥</l:l>
+<l:l i="70">Ǧ</l:l>
+<l:l i="70">ǧ</l:l>
+<l:l i="70">Ç´</l:l>
+<l:l i="70">ǵ</l:l>
+<l:l i="70">Ḡ</l:l>
+<l:l i="70">ḡ</l:l>
+<l:l i="80">H</l:l>
+<l:l i="80">h</l:l>
+<l:l i="80">Ĥ</l:l>
+<l:l i="80">Ä¥</l:l>
+<l:l i="80">Ħ</l:l>
+<l:l i="80">ħ</l:l>
+<l:l i="80">Èž</l:l>
+<l:l i="80">ÈŸ</l:l>
+<l:l i="80">ɦ</l:l>
+<l:l i="80">Ḣ</l:l>
+<l:l i="80">ḣ</l:l>
+<l:l i="80">Ḥ</l:l>
+<l:l i="80">ḥ</l:l>
+<l:l i="80">Ḧ</l:l>
+<l:l i="80">ḧ</l:l>
+<l:l i="80">Ḩ</l:l>
+<l:l i="80">ḩ</l:l>
+<l:l i="80">Ḫ</l:l>
+<l:l i="80">ḫ</l:l>
+<l:l i="80">ẖ</l:l>
+<l:l i="90">I</l:l>
+<l:l i="90">i</l:l>
+<l:l i="90">Ì</l:l>
+<l:l i="90">ì</l:l>
+<l:l i="90">Ã</l:l>
+<l:l i="90">í</l:l>
+<l:l i="90">ÃŽ</l:l>
+<l:l i="90">î</l:l>
+<l:l i="90">Ã</l:l>
+<l:l i="90">ï</l:l>
+<l:l i="90">Ĩ</l:l>
+<l:l i="90">Ä©</l:l>
+<l:l i="90">Ī</l:l>
+<l:l i="90">Ä«</l:l>
+<l:l i="90">Ĭ</l:l>
+<l:l i="90">Ä­</l:l>
+<l:l i="90">Ä®</l:l>
+<l:l i="90">į</l:l>
+<l:l i="90">Ä°</l:l>
+<l:l i="90">Æ—</l:l>
+<l:l i="90">ɨ</l:l>
+<l:l i="90">Ç</l:l>
+<l:l i="90">Ç</l:l>
+<l:l i="90">Ȉ</l:l>
+<l:l i="90">ȉ</l:l>
+<l:l i="90">ÈŠ</l:l>
+<l:l i="90">È‹</l:l>
+<l:l i="90">Ḭ</l:l>
+<l:l i="90">ḭ</l:l>
+<l:l i="90">Ḯ</l:l>
+<l:l i="90">ḯ</l:l>
+<l:l i="90">Ỉ</l:l>
+<l:l i="90">ỉ</l:l>
+<l:l i="90">Ị</l:l>
+<l:l i="90">ị</l:l>
+<l:l i="100">J</l:l>
+<l:l i="100">j</l:l>
+<l:l i="100">Ä´</l:l>
+<l:l i="100">ĵ</l:l>
+<l:l i="100">Ç°</l:l>
+<l:l i="100">Ê</l:l>
+<l:l i="110">K</l:l>
+<l:l i="110">k</l:l>
+<l:l i="110">Ķ</l:l>
+<l:l i="110">Ä·</l:l>
+<l:l i="110">Ƙ</l:l>
+<l:l i="110">Æ™</l:l>
+<l:l i="110">Ǩ</l:l>
+<l:l i="110">Ç©</l:l>
+<l:l i="110">Ḱ</l:l>
+<l:l i="110">ḱ</l:l>
+<l:l i="110">Ḳ</l:l>
+<l:l i="110">ḳ</l:l>
+<l:l i="110">Ḵ</l:l>
+<l:l i="110">ḵ</l:l>
+<l:l i="120">L</l:l>
+<l:l i="120">l</l:l>
+<l:l i="120">Ĺ</l:l>
+<l:l i="120">ĺ</l:l>
+<l:l i="120">Ä»</l:l>
+<l:l i="120">ļ</l:l>
+<l:l i="120">Ľ</l:l>
+<l:l i="120">ľ</l:l>
+<l:l i="120">Ä¿</l:l>
+<l:l i="120">Å€</l:l>
+<l:l i="120">Å</l:l>
+<l:l i="120">Å‚</l:l>
+<l:l i="120">Æš</l:l>
+<l:l i="120">Lj</l:l>
+<l:l i="120">È´</l:l>
+<l:l i="120">É«</l:l>
+<l:l i="120">ɬ</l:l>
+<l:l i="120">É­</l:l>
+<l:l i="120">Ḷ</l:l>
+<l:l i="120">ḷ</l:l>
+<l:l i="120">Ḹ</l:l>
+<l:l i="120">ḹ</l:l>
+<l:l i="120">Ḻ</l:l>
+<l:l i="120">ḻ</l:l>
+<l:l i="120">Ḽ</l:l>
+<l:l i="120">ḽ</l:l>
+<l:l i="130">M</l:l>
+<l:l i="130">m</l:l>
+<l:l i="130">ɱ</l:l>
+<l:l i="130">Ḿ</l:l>
+<l:l i="130">ḿ</l:l>
+<l:l i="130">á¹€</l:l>
+<l:l i="130">á¹</l:l>
+<l:l i="130">Ṃ</l:l>
+<l:l i="130">ṃ</l:l>
+<l:l i="140">N</l:l>
+<l:l i="140">n</l:l>
+<l:l i="140">Ñ</l:l>
+<l:l i="140">ñ</l:l>
+<l:l i="140">Ń</l:l>
+<l:l i="140">Å„</l:l>
+<l:l i="140">Å…</l:l>
+<l:l i="140">ņ</l:l>
+<l:l i="140">Ň</l:l>
+<l:l i="140">ň</l:l>
+<l:l i="140">Æ</l:l>
+<l:l i="140">ɲ</l:l>
+<l:l i="140">Æž</l:l>
+<l:l i="140">È </l:l>
+<l:l i="140">Ç‹</l:l>
+<l:l i="140">Ǹ</l:l>
+<l:l i="140">ǹ</l:l>
+<l:l i="140">ȵ</l:l>
+<l:l i="140">ɳ</l:l>
+<l:l i="140">Ṅ</l:l>
+<l:l i="140">á¹…</l:l>
+<l:l i="140">Ṇ</l:l>
+<l:l i="140">ṇ</l:l>
+<l:l i="140">Ṉ</l:l>
+<l:l i="140">ṉ</l:l>
+<l:l i="140">Ṋ</l:l>
+<l:l i="140">ṋ</l:l>
+<l:l i="150">O</l:l>
+<l:l i="150">o</l:l>
+<l:l i="150">Ã’</l:l>
+<l:l i="150">ò</l:l>
+<l:l i="150">Ó</l:l>
+<l:l i="150">ó</l:l>
+<l:l i="150">Ô</l:l>
+<l:l i="150">ô</l:l>
+<l:l i="150">Õ</l:l>
+<l:l i="150">õ</l:l>
+<l:l i="150">Ö</l:l>
+<l:l i="150">ö</l:l>
+<l:l i="150">Ø</l:l>
+<l:l i="150">ø</l:l>
+<l:l i="150">Ō</l:l>
+<l:l i="150">Å</l:l>
+<l:l i="150">ÅŽ</l:l>
+<l:l i="150">Å</l:l>
+<l:l i="150">Å</l:l>
+<l:l i="150">Å‘</l:l>
+<l:l i="150">ÆŸ</l:l>
+<l:l i="150">Æ </l:l>
+<l:l i="150">Æ¡</l:l>
+<l:l i="150">Ç‘</l:l>
+<l:l i="150">Ç’</l:l>
+<l:l i="150">Ǫ</l:l>
+<l:l i="150">Ç«</l:l>
+<l:l i="150">Ǭ</l:l>
+<l:l i="150">Ç­</l:l>
+<l:l i="150">Ǿ</l:l>
+<l:l i="150">Ç¿</l:l>
+<l:l i="150">Ȍ</l:l>
+<l:l i="150">È</l:l>
+<l:l i="150">ÈŽ</l:l>
+<l:l i="150">È</l:l>
+<l:l i="150">Ȫ</l:l>
+<l:l i="150">È«</l:l>
+<l:l i="150">Ȭ</l:l>
+<l:l i="150">È­</l:l>
+<l:l i="150">È®</l:l>
+<l:l i="150">ȯ</l:l>
+<l:l i="150">È°</l:l>
+<l:l i="150">ȱ</l:l>
+<l:l i="150">Ṍ</l:l>
+<l:l i="150">á¹</l:l>
+<l:l i="150">Ṏ</l:l>
+<l:l i="150">á¹</l:l>
+<l:l i="150">á¹</l:l>
+<l:l i="150">ṑ</l:l>
+<l:l i="150">á¹’</l:l>
+<l:l i="150">ṓ</l:l>
+<l:l i="150">Ọ</l:l>
+<l:l i="150">á»</l:l>
+<l:l i="150">Ỏ</l:l>
+<l:l i="150">á»</l:l>
+<l:l i="150">á»</l:l>
+<l:l i="150">ố</l:l>
+<l:l i="150">á»’</l:l>
+<l:l i="150">ồ</l:l>
+<l:l i="150">á»”</l:l>
+<l:l i="150">ổ</l:l>
+<l:l i="150">á»–</l:l>
+<l:l i="150">á»—</l:l>
+<l:l i="150">Ộ</l:l>
+<l:l i="150">á»™</l:l>
+<l:l i="150">Ớ</l:l>
+<l:l i="150">á»›</l:l>
+<l:l i="150">Ờ</l:l>
+<l:l i="150">á»</l:l>
+<l:l i="150">Ở</l:l>
+<l:l i="150">ở</l:l>
+<l:l i="150">á» </l:l>
+<l:l i="150">ỡ</l:l>
+<l:l i="150">Ợ</l:l>
+<l:l i="150">ợ</l:l>
+<l:l i="160">P</l:l>
+<l:l i="160">p</l:l>
+<l:l i="160">Ƥ</l:l>
+<l:l i="160">Æ¥</l:l>
+<l:l i="160">á¹”</l:l>
+<l:l i="160">ṕ</l:l>
+<l:l i="160">á¹–</l:l>
+<l:l i="160">á¹—</l:l>
+<l:l i="170">Q</l:l>
+<l:l i="170">q</l:l>
+<l:l i="170">Ê </l:l>
+<l:l i="180">R</l:l>
+<l:l i="180">r</l:l>
+<l:l i="180">Å”</l:l>
+<l:l i="180">Å•</l:l>
+<l:l i="180">Å–</l:l>
+<l:l i="180">Å—</l:l>
+<l:l i="180">Ř</l:l>
+<l:l i="180">Å™</l:l>
+<l:l i="180">È</l:l>
+<l:l i="180">È‘</l:l>
+<l:l i="180">È’</l:l>
+<l:l i="180">È“</l:l>
+<l:l i="180">ɼ</l:l>
+<l:l i="180">ɽ</l:l>
+<l:l i="180">ɾ</l:l>
+<l:l i="180">Ṙ</l:l>
+<l:l i="180">á¹™</l:l>
+<l:l i="180">Ṛ</l:l>
+<l:l i="180">á¹›</l:l>
+<l:l i="180">Ṝ</l:l>
+<l:l i="180">á¹</l:l>
+<l:l i="180">Ṟ</l:l>
+<l:l i="180">ṟ</l:l>
+<l:l i="190">S</l:l>
+<l:l i="190">s</l:l>
+<l:l i="190">Åš</l:l>
+<l:l i="190">Å›</l:l>
+<l:l i="190">Ŝ</l:l>
+<l:l i="190">Å</l:l>
+<l:l i="190">Åž</l:l>
+<l:l i="190">ÅŸ</l:l>
+<l:l i="190">Å </l:l>
+<l:l i="190">Å¡</l:l>
+<l:l i="190">Ș</l:l>
+<l:l i="190">È™</l:l>
+<l:l i="190">Ê‚</l:l>
+<l:l i="190">á¹ </l:l>
+<l:l i="190">ṡ</l:l>
+<l:l i="190">á¹¢</l:l>
+<l:l i="190">á¹£</l:l>
+<l:l i="190">Ṥ</l:l>
+<l:l i="190">á¹¥</l:l>
+<l:l i="190">Ṧ</l:l>
+<l:l i="190">ṧ</l:l>
+<l:l i="190">Ṩ</l:l>
+<l:l i="190">ṩ</l:l>
+<l:l i="200">T</l:l>
+<l:l i="200">t</l:l>
+<l:l i="200">Å¢</l:l>
+<l:l i="200">Å£</l:l>
+<l:l i="200">Ť</l:l>
+<l:l i="200">Å¥</l:l>
+<l:l i="200">Ŧ</l:l>
+<l:l i="200">ŧ</l:l>
+<l:l i="200">Æ«</l:l>
+<l:l i="200">Ƭ</l:l>
+<l:l i="200">Æ­</l:l>
+<l:l i="200">Æ®</l:l>
+<l:l i="200">ʈ</l:l>
+<l:l i="200">Èš</l:l>
+<l:l i="200">È›</l:l>
+<l:l i="200">ȶ</l:l>
+<l:l i="200">Ṫ</l:l>
+<l:l i="200">ṫ</l:l>
+<l:l i="200">Ṭ</l:l>
+<l:l i="200">á¹­</l:l>
+<l:l i="200">á¹®</l:l>
+<l:l i="200">ṯ</l:l>
+<l:l i="200">á¹°</l:l>
+<l:l i="200">á¹±</l:l>
+<l:l i="200">ẗ</l:l>
+<l:l i="210">U</l:l>
+<l:l i="210">u</l:l>
+<l:l i="210">Ù</l:l>
+<l:l i="210">ù</l:l>
+<l:l i="210">Ú</l:l>
+<l:l i="210">ú</l:l>
+<l:l i="210">Û</l:l>
+<l:l i="210">û</l:l>
+<l:l i="210">Ü</l:l>
+<l:l i="210">ü</l:l>
+<l:l i="210">Ũ</l:l>
+<l:l i="210">Å©</l:l>
+<l:l i="210">Ū</l:l>
+<l:l i="210">Å«</l:l>
+<l:l i="210">Ŭ</l:l>
+<l:l i="210">Å­</l:l>
+<l:l i="210">Å®</l:l>
+<l:l i="210">ů</l:l>
+<l:l i="210">Å°</l:l>
+<l:l i="210">ű</l:l>
+<l:l i="210">Ų</l:l>
+<l:l i="210">ų</l:l>
+<l:l i="210">Ư</l:l>
+<l:l i="210">Æ°</l:l>
+<l:l i="210">Ç“</l:l>
+<l:l i="210">Ç”</l:l>
+<l:l i="210">Ç•</l:l>
+<l:l i="210">Ç–</l:l>
+<l:l i="210">Ç—</l:l>
+<l:l i="210">ǘ</l:l>
+<l:l i="210">Ç™</l:l>
+<l:l i="210">Çš</l:l>
+<l:l i="210">Ç›</l:l>
+<l:l i="210">ǜ</l:l>
+<l:l i="210">È”</l:l>
+<l:l i="210">È•</l:l>
+<l:l i="210">È–</l:l>
+<l:l i="210">È—</l:l>
+<l:l i="210">á¹²</l:l>
+<l:l i="210">á¹³</l:l>
+<l:l i="210">á¹´</l:l>
+<l:l i="210">á¹µ</l:l>
+<l:l i="210">Ṷ</l:l>
+<l:l i="210">á¹·</l:l>
+<l:l i="210">Ṹ</l:l>
+<l:l i="210">á¹¹</l:l>
+<l:l i="210">Ṻ</l:l>
+<l:l i="210">á¹»</l:l>
+<l:l i="210">Ụ</l:l>
+<l:l i="210">ụ</l:l>
+<l:l i="210">Ủ</l:l>
+<l:l i="210">ủ</l:l>
+<l:l i="210">Ứ</l:l>
+<l:l i="210">ứ</l:l>
+<l:l i="210">Ừ</l:l>
+<l:l i="210">ừ</l:l>
+<l:l i="210">Ử</l:l>
+<l:l i="210">á»­</l:l>
+<l:l i="210">á»®</l:l>
+<l:l i="210">ữ</l:l>
+<l:l i="210">á»°</l:l>
+<l:l i="210">á»±</l:l>
+<l:l i="220">V</l:l>
+<l:l i="220">v</l:l>
+<l:l i="220">Ʋ</l:l>
+<l:l i="220">Ê‹</l:l>
+<l:l i="220">á¹¼</l:l>
+<l:l i="220">á¹½</l:l>
+<l:l i="220">á¹¾</l:l>
+<l:l i="220">ṿ</l:l>
+<l:l i="230">W</l:l>
+<l:l i="230">w</l:l>
+<l:l i="230">Å´</l:l>
+<l:l i="230">ŵ</l:l>
+<l:l i="230">Ẁ</l:l>
+<l:l i="230">áº</l:l>
+<l:l i="230">Ẃ</l:l>
+<l:l i="230">ẃ</l:l>
+<l:l i="230">Ẅ</l:l>
+<l:l i="230">ẅ</l:l>
+<l:l i="230">Ẇ</l:l>
+<l:l i="230">ẇ</l:l>
+<l:l i="230">Ẉ</l:l>
+<l:l i="230">ẉ</l:l>
+<l:l i="230">ẘ</l:l>
+<l:l i="240">X</l:l>
+<l:l i="240">x</l:l>
+<l:l i="240">Ẋ</l:l>
+<l:l i="240">ẋ</l:l>
+<l:l i="240">Ẍ</l:l>
+<l:l i="240">áº</l:l>
+<l:l i="250">Y</l:l>
+<l:l i="250">y</l:l>
+<l:l i="250">Ã</l:l>
+<l:l i="250">ý</l:l>
+<l:l i="250">ÿ</l:l>
+<l:l i="250">Ÿ</l:l>
+<l:l i="250">Ŷ</l:l>
+<l:l i="250">Å·</l:l>
+<l:l i="250">Ƴ</l:l>
+<l:l i="250">Æ´</l:l>
+<l:l i="250">Ȳ</l:l>
+<l:l i="250">ȳ</l:l>
+<l:l i="250">Ẏ</l:l>
+<l:l i="250">áº</l:l>
+<l:l i="250">ẙ</l:l>
+<l:l i="250">Ỳ</l:l>
+<l:l i="250">ỳ</l:l>
+<l:l i="250">á»´</l:l>
+<l:l i="250">ỵ</l:l>
+<l:l i="250">Ỷ</l:l>
+<l:l i="250">á»·</l:l>
+<l:l i="250">Ỹ</l:l>
+<l:l i="250">ỹ</l:l>
+<l:l i="260">Z</l:l>
+<l:l i="260">z</l:l>
+<l:l i="260">Ź</l:l>
+<l:l i="260">ź</l:l>
+<l:l i="260">Å»</l:l>
+<l:l i="260">ż</l:l>
+<l:l i="260">Ž</l:l>
+<l:l i="260">ž</l:l>
+<l:l i="260">Ƶ</l:l>
+<l:l i="260">ƶ</l:l>
+<l:l i="260">Ȥ</l:l>
+<l:l i="260">È¥</l:l>
+<l:l i="260">Ê</l:l>
+<l:l i="260">Ê‘</l:l>
+<l:l i="260">áº</l:l>
+<l:l i="260">ẑ</l:l>
+<l:l i="260">Ẓ</l:l>
+<l:l i="260">ẓ</l:l>
+<l:l i="260">Ẕ</l:l>
+<l:l i="260">ẕ</l:l>
+</l:letters>
+</l:l10n>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/ar.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/ar.xml
new file mode 100644
index 0000000..ac55456
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/ar.xml
@@ -0,0 +1,1229 @@
+<?xml version="1.0" encoding="utf-8"?>
+<l:l10n xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0" language="ar" english-language-name="Arabic">
+
+<!-- * This file is generated automatically. -->
+<!-- * To submit changes to this file upstream (to the DocBook Project) -->
+<!-- * do not submit an edited version of this file. Instead, submit an -->
+<!-- * edited version of the source file at the following location: -->
+<!-- * -->
+<!-- * https://docbook.svn.sourceforge.net/svnroot/docbook/trunk/gentext/locale/ar.xml -->
+<!-- * -->
+<!-- * E-mail the edited ar.xml source file to: -->
+<!-- * -->
+<!-- * docbook-developers@lists.sourceforge.net -->
+
+<!-- ******************************************************************** -->
+
+<!-- This file is part of the XSL DocBook Stylesheet distribution. -->
+<!-- See ../README or http://docbook.sf.net/release/xsl/current/ for -->
+<!-- copyright and other information. -->
+
+<!-- ******************************************************************** -->
+<!-- In these files, % with a letter is used for a placeholder: -->
+<!-- %t is the current element's title -->
+<!-- %s is the current element's subtitle (if applicable)-->
+<!-- %n is the current element's number label-->
+<!-- %p is the current element's page number (if applicable)-->
+<!-- ******************************************************************** -->
+
+
+<l:gentext key="Abstract" text="خلاصة"/>
+<l:gentext key="abstract" text="خلاصة"/>
+<l:gentext key="Acknowledgements" text="عرÙان"/>
+<l:gentext key="acknowledgements" text="عرÙان"/>
+<l:gentext key="Answer" text="ج:"/>
+<l:gentext key="answer" text="ج:"/>
+<l:gentext key="Appendix" text="ملحق"/>
+<l:gentext key="appendix" text="ملحق"/>
+<l:gentext key="Article" text="مقال"/>
+<l:gentext key="article" text="مقال"/>
+<l:gentext key="Author" text="مؤلÙ"/>
+<l:gentext key="Bibliography" text="قائمة المراجع"/>
+<l:gentext key="bibliography" text="قائمة المراجع"/>
+<l:gentext key="Book" text="كتاب"/>
+<l:gentext key="book" text="كتاب"/>
+<l:gentext key="CAUTION" text="تحذير"/>
+<l:gentext key="Caution" text="تحذير"/>
+<l:gentext key="caution" text="تحذير"/>
+<l:gentext key="Chapter" text="Ùصل"/>
+<l:gentext key="chapter" text="Ùصل"/>
+<l:gentext key="Colophon" text="الناشر"/>
+<l:gentext key="colophon" text="الناشر"/>
+<l:gentext key="Copyright" text="حقوق النشر"/>
+<l:gentext key="copyright" text="حقوق النشر"/>
+<l:gentext key="Dedication" text="إهداء"/>
+<l:gentext key="dedication" text="إهداء"/>
+<l:gentext key="Edition" text="نسخة"/>
+<l:gentext key="edition" text="نسخة"/>
+<l:gentext key="Editor" text="محرر"/>
+<l:gentext key="Equation" text="معادلة"/>
+<l:gentext key="equation" text="معادلة"/>
+<l:gentext key="Example" text="مثال"/>
+<l:gentext key="example" text="مثال"/>
+<l:gentext key="Figure" text="شكل"/>
+<l:gentext key="figure" text="شكل"/>
+<l:gentext key="Glossary" text="قاموس المÙردات"/>
+<l:gentext key="glossary" text="قاموس المÙردات"/>
+<l:gentext key="GlossSee" text="انظر"/>
+<l:gentext key="glosssee" text="انظر"/>
+<l:gentext key="GlossSeeAlso" text="انظر أيضاً"/>
+<l:gentext key="glossseealso" text="انظر أيضاً"/>
+<l:gentext key="IMPORTANT" text="هام"/>
+<l:gentext key="important" text="هام"/>
+<l:gentext key="Important" text="هام"/>
+<l:gentext key="Index" text="Ùهرس"/>
+<l:gentext key="index" text="Ùهرس"/>
+<l:gentext key="ISBN" text="الترقيم العالمي القياسي للكتاب"/>
+<l:gentext key="isbn" text="الترقيم العالمي القياسي للكتاب"/>
+<l:gentext key="LegalNotice" text="ملاحظة قانونية"/>
+<l:gentext key="legalnotice" text="ملاحظة قانونية"/>
+<l:gentext key="MsgAud" text="الجمهور"/>
+<l:gentext key="msgaud" text="الجمهور"/>
+<l:gentext key="MsgLevel" text="المستوى"/>
+<l:gentext key="msglevel" text="المستوى"/>
+<l:gentext key="MsgOrig" text="المصدر"/>
+<l:gentext key="msgorig" text="المصدر"/>
+<l:gentext key="NOTE" text="ملاحظة"/>
+<l:gentext key="Note" text="ملاحظة"/>
+<l:gentext key="note" text="ملاحظة"/>
+<l:gentext key="Part" text="جزء"/>
+<l:gentext key="part" text="جزء"/>
+<l:gentext key="Preface" text="مقدمة"/>
+<l:gentext key="preface" text="مقدمة"/>
+<l:gentext key="Procedure" text="إجراء"/>
+<l:gentext key="procedure" text="إجراء"/>
+<l:gentext key="ProductionSet" text="منتج"/>
+<l:gentext key="PubDate" text="تاريخ النشر"/>
+<l:gentext key="pubdate" text="تاريخ النشر"/>
+<l:gentext key="Published" text="منشور"/>
+<l:gentext key="published" text="منشور"/>
+<l:gentext key="Publisher" text="الناشر"/>
+<l:gentext key="Qandadiv" text="س و ج"/>
+<l:gentext key="qandadiv" text="س و ج"/>
+<l:gentext key="QandASet" text="Frequently Asked Questions" lang="en"/>
+<l:gentext key="Question" text="س:"/>
+<l:gentext key="question" text="س:"/>
+<l:gentext key="RefEntry" text="صÙحة"/>
+<l:gentext key="refentry" text="صÙحة"/>
+<l:gentext key="Reference" text="مرجع"/>
+<l:gentext key="reference" text="مرجع"/>
+<l:gentext key="References" text="مراجع"/>
+<l:gentext key="RefName" text="الاسم"/>
+<l:gentext key="refname" text="الاسم"/>
+<l:gentext key="RefSection" text="قسم"/>
+<l:gentext key="refsection" text="قسم"/>
+<l:gentext key="RefSynopsisDiv" text="المختصر"/>
+<l:gentext key="refsynopsisdiv" text="المختصر"/>
+<l:gentext key="RevHistory" text="تاريخ المراجعة"/>
+<l:gentext key="revhistory" text="تاريخ المراجعة"/>
+<l:gentext key="revision" text="مراجعة"/>
+<l:gentext key="Revision" text="مراجعة"/>
+<l:gentext key="sect1" text="قسم"/>
+<l:gentext key="sect2" text="قسم"/>
+<l:gentext key="sect3" text="قسم"/>
+<l:gentext key="sect4" text="قسم"/>
+<l:gentext key="sect5" text="قسم"/>
+<l:gentext key="section" text="قسم"/>
+<l:gentext key="Section" text="قسم"/>
+<l:gentext key="see" text="استعرض"/>
+<l:gentext key="See" text="استعرض"/>
+<l:gentext key="seealso" text="استعرض أيضاً"/>
+<l:gentext key="Seealso" text="استعرض أيضاً"/>
+<l:gentext key="SeeAlso" text="استعرض أيضاً"/>
+<l:gentext key="set" text="مجموعة"/>
+<l:gentext key="Set" text="مجموعة"/>
+<l:gentext key="setindex" text="Ùهرس المجموعة"/>
+<l:gentext key="SetIndex" text="Ùهرس المجموعة"/>
+<l:gentext key="Sidebar" text="الشريط الجانبي"/>
+<l:gentext key="sidebar" text="الشريط الجانبي"/>
+<l:gentext key="step" text="خطوة"/>
+<l:gentext key="Step" text="خطوة"/>
+<l:gentext key="table" text="جدول"/>
+<l:gentext key="Table" text="جدول"/>
+<l:gentext key="task" text="مَهمة"/>
+<l:gentext key="Task" text="مَهمة"/>
+<l:gentext key="tip" text="Ùكرة Ù…Ùيدة"/>
+<l:gentext key="TIP" text="Ùكرة Ù…Ùيدة"/>
+<l:gentext key="Tip" text="Ùكرة Ù…Ùيدة"/>
+<l:gentext key="Warning" text="تنبيه"/>
+<l:gentext key="warning" text="تنبيه"/>
+<l:gentext key="WARNING" text="تنبيه"/>
+<l:gentext key="and" text="Ùˆ"/>
+<l:gentext key="by" text="بواسطة"/>
+<l:gentext key="Edited" text="معدل"/>
+<l:gentext key="edited" text="معدل"/>
+<l:gentext key="Editedby" text="معدل بواسطة"/>
+<l:gentext key="editedby" text="معدل بواسطة"/>
+<l:gentext key="in" text="ÙÙŠ"/>
+<l:gentext key="lastlistcomma" text="،"/>
+<l:gentext key="listcomma" text="،"/>
+<l:gentext key="notes" text="ملاحظات"/>
+<l:gentext key="Notes" text="ملاحظات"/>
+<l:gentext key="Pgs" text="صÙحات"/>
+<l:gentext key="pgs" text="صÙحات"/>
+<l:gentext key="Revisedby" text="تمت المراجعة بواسطة: "/>
+<l:gentext key="revisedby" text="تمت المراجعة بواسطة: "/>
+<l:gentext key="TableNotes" text="ملاحظات"/>
+<l:gentext key="tablenotes" text="ملاحظات"/>
+<l:gentext key="TableofContents" text="قائمة المحتويات"/>
+<l:gentext key="tableofcontents" text="قائمة المحتويات"/>
+<l:gentext key="unexpectedelementname" text="اسم عنصر غير متوقع"/>
+<l:gentext key="unsupported" text="غير مدعوم"/>
+<l:gentext key="xrefto" text="إشارة إلى"/>
+<l:gentext key="Authors" text="مؤلÙون"/>
+<l:gentext key="copyeditor" text="محرر النسخة"/>
+<l:gentext key="graphicdesigner" text="مصمم جراÙيكي"/>
+<l:gentext key="productioneditor" text="محرر إنتاج"/>
+<l:gentext key="technicaleditor" text="محرر Ùني"/>
+<l:gentext key="translator" text="مترجم"/>
+<l:gentext key="listofequations" text="قائمة المعادلات"/>
+<l:gentext key="ListofEquations" text="قائمة المعادلات"/>
+<l:gentext key="ListofExamples" text="قائمة الأمثلة"/>
+<l:gentext key="listofexamples" text="قائمة الأمثلة"/>
+<l:gentext key="ListofFigures" text="قائمة الأشكال"/>
+<l:gentext key="listoffigures" text="قائمة الأشكال"/>
+<l:gentext key="ListofProcedures" text="قائمة الإجراءات"/>
+<l:gentext key="listofprocedures" text="قائمة الإجراءات"/>
+<l:gentext key="listoftables" text="قائمة الجداول"/>
+<l:gentext key="ListofTables" text="قائمة الجداول"/>
+<l:gentext key="ListofUnknown" text="قائمة المجهولات"/>
+<l:gentext key="listofunknown" text="قائمة المجهولات"/>
+<l:gentext key="nav-home" text="البداية"/>
+<l:gentext key="nav-next" text="التالي"/>
+<l:gentext key="nav-next-sibling" text="إلى الأمام"/>
+<l:gentext key="nav-prev" text="السابق"/>
+<l:gentext key="nav-prev-sibling" text="إلى الخلÙ"/>
+<l:gentext key="nav-up" text="أعلى"/>
+<l:gentext key="nav-toc" text="الÙهرس"/>
+<l:gentext key="Draft" text="مسودة"/>
+<l:gentext key="above" text="أعلى"/>
+<l:gentext key="below" text="Ùيما يلي"/>
+<l:gentext key="sectioncalled" text="القسم المسمى"/>
+<l:gentext key="index symbols" text="الرموز"/>
+<l:gentext key="writing-mode" text="rl-tb"/>
+<l:gentext key="lowercase.alpha" text="abcdefghijklmnopqrstuvwxyz"/>
+<l:gentext key="uppercase.alpha" text="ABCDEFGHIJKLMNOPQRSTUVWXYZ"/>
+<l:gentext key="normalize.sort.input" text="AaÀàÃáÂâÃãÄäÅåĀÄĂ㥹ÇǎǞǟǠǡǺǻȀÈȂȃȦȧḀá¸áºšáº áº¡áº¢áº£áº¤áº¥áº¦áº§áº¨áº©áºªáº«áº¬áº­áº®áº¯áº°áº±áº²áº³áº´áºµáº¶áº·BbÆ€ÆɓƂƃḂḃḄḅḆḇCcÇçĆćĈĉĊċČÄƇƈɕḈḉDdÄŽÄÄđƊɗƋƌDžDzȡɖḊḋḌá¸á¸Žá¸á¸á¸‘ḒḓEeÈèÉéÊêËëĒēĔĕĖėĘęĚěȄȅȆȇȨȩḔḕḖḗḘḙḚḛḜá¸áº¸áº¹áººáº»áº¼áº½áº¾áº¿á»€á»á»‚ểỄễỆệFfƑƒḞḟGgÄœÄĞğĠġĢģƓɠǤǥǦǧǴǵḠḡHhĤĥĦħȞȟɦḢḣḤḥḦḧḨḩḪḫẖIiÌìÃíÎîÃïĨĩĪīĬĭĮįİƗɨÇÇȈȉȊȋḬḭḮḯỈỉỊịJjĴĵǰÊKkĶķƘƙǨǩḰḱḲḳḴḵLlĹĺĻļĽľĿŀÅłƚLjȴɫɬɭḶḷḸḹḺḻḼḽMmɱḾḿṀá¹á¹‚ṃNnÑñŃńŅņŇňÆɲƞȠNjǸǹȵɳṄṅṆṇṈṉṊṋOoÒòÓóÔôÕõÖöØøŌÅÅŽÅÅőƟƠơǑǒǪǫǬǭǾǿȌÈÈŽÈȪȫȬȭȮȯȰȱṌá¹á¹Žá¹á¹á¹‘ṒṓỌá»á»Žá»á»á»‘ỒồỔổỖỗỘộỚớỜá»á»žá»Ÿá» á»¡á»¢á»£PpƤƥṔṕṖṗQqÊ RrŔŕŖŗŘřÈȑȒȓɼɽɾṘṙṚṛṜá¹á¹žá¹ŸSsŚśŜÅŞşŠšȘșʂṠṡṢṣṤṥṦṧṨṩTtŢţŤťŦŧƫƬƭƮʈȚțȶṪṫṬṭṮṯṰṱẗUuÙùÚúÛûÜüŨũŪūŬŭŮůŰűŲųƯưǓǔǕǖǗǘǙǚǛǜȔȕȖȗṲṳṴṵṶṷṸṹṺṻỤụỦủỨứỪừỬửỮữỰựVvƲʋṼṽṾṿWwŴŵẀáºáº‚ẃẄẅẆẇẈẉẘXxẊẋẌáºYyÃýÿŸŶŷƳƴȲȳẎáºáº™á»²á»³á»´á»µá»¶á»·á»¸á»¹ZzŹźŻżŽžƵƶȤȥÊÊ‘áºáº‘ẒẓẔẕẕ" lang="en"/>
+<l:gentext key="normalize.sort.output" text="AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBCCCCCCCCCCCCCCCCCDDDDDDDDDDDDDDDDDDDDDDDDEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEFFFFFFGGGGGGGGGGGGGGGGGGGGHHHHHHHHHHHHHHHHHHHHIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIJJJJJJKKKKKKKKKKKKKKLLLLLLLLLLLLLLLLLLLLLLLLLLMMMMMMMMMNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOPPPPPPPPQQQRRRRRRRRRRRRRRRRRRRRRRRSSSSSSSSSSSSSSSSSSSSSSSTTTTTTTTTTTTTTTTTTTTTTTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUVVVVVVVVWWWWWWWWWWWWWWWXXXXXXYYYYYYYYYYYYYYYYYYYYYYYZZZZZZZZZZZZZZZZZZZZZ" lang="en"/>
+<l:dingbat key="startquote" text="“"/>
+<l:dingbat key="endquote" text="â€"/>
+<l:dingbat key="nestedstartquote" text="‘"/>
+<l:dingbat key="nestedendquote" text="’"/>
+<l:dingbat key="singlestartquote" text="‘" lang="en"/>
+<l:dingbat key="singleendquote" text="’" lang="en"/>
+<l:dingbat key="bullet" text="•"/>
+<l:gentext key="hyphenation-character" text="â€"/>
+<l:gentext key="hyphenation-push-character-count" text="2"/>
+<l:gentext key="hyphenation-remain-character-count" text="2"/>
+<l:context name="styles"><l:template name="person-name" text="first-last"/>
+</l:context>
+<l:context name="title"><l:template name="abstract" text="%t"/>
+<l:template name="acknowledgements" text="%t" lang="en"/>
+<l:template name="answer" text="%t"/>
+<l:template name="appendix" text="ملحق %n. %t"/>
+<l:template name="article" text="%t"/>
+<l:template name="authorblurb" text="%t"/>
+<l:template name="bibliodiv" text="%t"/>
+<l:template name="biblioentry" text="%t"/>
+<l:template name="bibliography" text="%t"/>
+<l:template name="bibliolist" text="%t" lang="en"/>
+<l:template name="bibliomixed" text="%t"/>
+<l:template name="bibliomset" text="%t"/>
+<l:template name="biblioset" text="%t"/>
+<l:template name="blockquote" text="%t"/>
+<l:template name="book" text="%t"/>
+<l:template name="calloutlist" text="%t"/>
+<l:template name="caution" text="%t"/>
+<l:template name="chapter" text="Ùصل %n. %t"/>
+<l:template name="colophon" text="%t"/>
+<l:template name="dedication" text="%t"/>
+<l:template name="equation" text="معادلة %n. %t"/>
+<l:template name="example" text="مثال %n. %t"/>
+<l:template name="figure" text="شكل %n. %t"/>
+<l:template name="foil" text="%t" lang="en"/>
+<l:template name="foilgroup" text="%t" lang="en"/>
+<l:template name="formalpara" text="%t"/>
+<l:template name="glossary" text="%t"/>
+<l:template name="glossdiv" text="%t"/>
+<l:template name="glosslist" text="%t" lang="en"/>
+<l:template name="glossentry" text="%t"/>
+<l:template name="important" text="%t"/>
+<l:template name="index" text="%t"/>
+<l:template name="indexdiv" text="%t"/>
+<l:template name="itemizedlist" text="%t"/>
+<l:template name="legalnotice" text="%t"/>
+<l:template name="listitem" text=""/>
+<l:template name="lot" text="%t"/>
+<l:template name="msg" text="%t"/>
+<l:template name="msgexplan" text="%t"/>
+<l:template name="msgmain" text="%t"/>
+<l:template name="msgrel" text="%t"/>
+<l:template name="msgset" text="%t"/>
+<l:template name="msgsub" text="%t"/>
+<l:template name="note" text="%t"/>
+<l:template name="orderedlist" text="%t"/>
+<l:template name="part" text="جزء %n. %t"/>
+<l:template name="partintro" text="%t"/>
+<l:template name="preface" text="%t"/>
+<l:template name="procedure" text="%t"/>
+<l:template name="procedure.formal" text="إجراء %n. %t"/>
+<l:template name="productionset" text="%t"/>
+<l:template name="productionset.formal" text="منتج %n"/>
+<l:template name="qandadiv" text="%t"/>
+<l:template name="qandaentry" text="%t"/>
+<l:template name="qandaset" text="%t"/>
+<l:template name="question" text="%t"/>
+<l:template name="refentry" text="%t"/>
+<l:template name="reference" text="%t"/>
+<l:template name="refsection" text="%t"/>
+<l:template name="refsect1" text="%t"/>
+<l:template name="refsect2" text="%t"/>
+<l:template name="refsect3" text="%t"/>
+<l:template name="refsynopsisdiv" text="%t"/>
+<l:template name="refsynopsisdivinfo" text="%t"/>
+<l:template name="segmentedlist" text="%t"/>
+<l:template name="set" text="%t"/>
+<l:template name="setindex" text="%t"/>
+<l:template name="sidebar" text="%t"/>
+<l:template name="step" text="%t"/>
+<l:template name="table" text="جدول %n. %t"/>
+<l:template name="task" text="%t" lang="en"/>
+<l:template name="tasksummary" text="%t" lang="en"/>
+<l:template name="taskprerequisites" text="%t" lang="en"/>
+<l:template name="taskrelated" text="%t" lang="en"/>
+<l:template name="tip" text="%t"/>
+<l:template name="toc" text="%t"/>
+<l:template name="variablelist" text="%t"/>
+<l:template name="varlistentry" text=""/>
+<l:template name="warning" text="%t"/>
+</l:context>
+<l:context name="title-unnumbered"><l:template name="appendix" text="%t"/>
+<l:template name="article/appendix" text="%t"/>
+<l:template name="bridgehead" text="%t"/>
+<l:template name="chapter" text="%t"/>
+<l:template name="sect1" text="%t"/>
+<l:template name="sect2" text="%t"/>
+<l:template name="sect3" text="%t"/>
+<l:template name="sect4" text="%t"/>
+<l:template name="sect5" text="%t"/>
+<l:template name="section" text="%t"/>
+<l:template name="simplesect" text="%t"/>
+<l:template name="part" text="%t" lang="en"/>
+</l:context>
+<l:context name="title-numbered"><l:template name="appendix" text="ملحق %n. %t"/>
+<l:template name="article/appendix" text="%n. %t"/>
+<l:template name="bridgehead" text="%n. %t"/>
+<l:template name="chapter" text="Ùصل %n. %t"/>
+<l:template name="part" text="جزء %n. %t"/>
+<l:template name="sect1" text="%n. %t"/>
+<l:template name="sect2" text="%n. %t"/>
+<l:template name="sect3" text="%n. %t"/>
+<l:template name="sect4" text="%n. %t"/>
+<l:template name="sect5" text="%n. %t"/>
+<l:template name="section" text="%n. %t"/>
+<l:template name="simplesect" text="%t"/>
+</l:context>
+<l:context name="subtitle"><l:template name="appendix" text="%s"/>
+<l:template name="acknowledgements" text="%s" lang="en"/>
+<l:template name="article" text="%s"/>
+<l:template name="bibliodiv" text="%s"/>
+<l:template name="biblioentry" text="%s"/>
+<l:template name="bibliography" text="%s"/>
+<l:template name="bibliomixed" text="%s"/>
+<l:template name="bibliomset" text="%s"/>
+<l:template name="biblioset" text="%s"/>
+<l:template name="book" text="%s"/>
+<l:template name="chapter" text="%s"/>
+<l:template name="colophon" text="%s"/>
+<l:template name="dedication" text="%s"/>
+<l:template name="glossary" text="%s"/>
+<l:template name="glossdiv" text="%s"/>
+<l:template name="index" text="%s"/>
+<l:template name="indexdiv" text="%s"/>
+<l:template name="lot" text="%s"/>
+<l:template name="part" text="%s"/>
+<l:template name="partintro" text="%s"/>
+<l:template name="preface" text="%s"/>
+<l:template name="refentry" text="%s"/>
+<l:template name="reference" text="%s"/>
+<l:template name="refsection" text="%s"/>
+<l:template name="refsect1" text="%s"/>
+<l:template name="refsect2" text="%s"/>
+<l:template name="refsect3" text="%s"/>
+<l:template name="refsynopsisdiv" text="%s"/>
+<l:template name="sect1" text="%s"/>
+<l:template name="sect2" text="%s"/>
+<l:template name="sect3" text="%s"/>
+<l:template name="sect4" text="%s"/>
+<l:template name="sect5" text="%s"/>
+<l:template name="section" text="%s"/>
+<l:template name="set" text="%s"/>
+<l:template name="setindex" text="%s"/>
+<l:template name="sidebar" text="%s"/>
+<l:template name="simplesect" text="%s"/>
+<l:template name="toc" text="%s"/>
+</l:context>
+<l:context name="xref"><l:template name="abstract" text="%t"/>
+<l:template name="acknowledgements" text="%t" lang="en"/>
+<l:template name="answer" text="ج: %n"/>
+<l:template name="appendix" text="%t"/>
+<l:template name="article" text="%t"/>
+<l:template name="authorblurb" text="%t"/>
+<l:template name="bibliodiv" text="%t"/>
+<l:template name="bibliography" text="%t"/>
+<l:template name="bibliomset" text="%t"/>
+<l:template name="biblioset" text="%t"/>
+<l:template name="blockquote" text="%t"/>
+<l:template name="book" text="%t"/>
+<l:template name="calloutlist" text="%t"/>
+<l:template name="caution" text="%t"/>
+<l:template name="chapter" text="%t"/>
+<l:template name="colophon" text="%t"/>
+<l:template name="constraintdef" text="%t"/>
+<l:template name="dedication" text="%t"/>
+<l:template name="equation" text="%t"/>
+<l:template name="example" text="%t"/>
+<l:template name="figure" text="%t"/>
+<l:template name="foil" text="%t" lang="en"/>
+<l:template name="foilgroup" text="%t" lang="en"/>
+<l:template name="formalpara" text="%t"/>
+<l:template name="glossary" text="%t"/>
+<l:template name="glossdiv" text="%t"/>
+<l:template name="important" text="%t"/>
+<l:template name="index" text="%t"/>
+<l:template name="indexdiv" text="%t"/>
+<l:template name="itemizedlist" text="%t"/>
+<l:template name="legalnotice" text="%t"/>
+<l:template name="listitem" text="%n"/>
+<l:template name="lot" text="%t"/>
+<l:template name="msg" text="%t"/>
+<l:template name="msgexplan" text="%t"/>
+<l:template name="msgmain" text="%t"/>
+<l:template name="msgrel" text="%t"/>
+<l:template name="msgset" text="%t"/>
+<l:template name="msgsub" text="%t"/>
+<l:template name="note" text="%t"/>
+<l:template name="orderedlist" text="%t"/>
+<l:template name="part" text="%t"/>
+<l:template name="partintro" text="%t"/>
+<l:template name="preface" text="%t"/>
+<l:template name="procedure" text="%t"/>
+<l:template name="productionset" text="%t"/>
+<l:template name="qandadiv" text="%t"/>
+<l:template name="qandaentry" text="س: %n"/>
+<l:template name="qandaset" text="%t"/>
+<l:template name="question" text="س: %n"/>
+<l:template name="reference" text="%t"/>
+<l:template name="refsynopsisdiv" text="%t"/>
+<l:template name="segmentedlist" text="%t"/>
+<l:template name="set" text="%t"/>
+<l:template name="setindex" text="%t"/>
+<l:template name="sidebar" text="%t"/>
+<l:template name="table" text="%t"/>
+<l:template name="task" text="%t" lang="en"/>
+<l:template name="tip" text="%t"/>
+<l:template name="toc" text="%t"/>
+<l:template name="variablelist" text="%t"/>
+<l:template name="varlistentry" text="%n"/>
+<l:template name="warning" text="%t"/>
+<l:template name="olink.document.citation" text=" in %o" lang="en"/>
+<l:template name="olink.page.citation" text=" (page %p)" lang="en"/>
+<l:template name="page.citation" text=" [%p]"/>
+<l:template name="page" text="(page %p)" lang="en"/>
+<l:template name="docname" text=" in %o" lang="en"/>
+<l:template name="docnamelong" text=" in the document titled %o" lang="en"/>
+<l:template name="pageabbrev" text="(p. %p)" lang="en"/>
+<l:template name="Page" text="Page %p" lang="en"/>
+<l:template name="bridgehead" text="القسم المسمى “%tâ€"/>
+<l:template name="refsection" text="القسم المسمى “%tâ€"/>
+<l:template name="refsect1" text="القسم المسمى “%tâ€"/>
+<l:template name="refsect2" text="القسم المسمى “%tâ€"/>
+<l:template name="refsect3" text="القسم المسمى “%tâ€"/>
+<l:template name="sect1" text="القسم المسمى “%tâ€"/>
+<l:template name="sect2" text="القسم المسمى “%tâ€"/>
+<l:template name="sect3" text="القسم المسمى “%tâ€"/>
+<l:template name="sect4" text="القسم المسمى “%tâ€"/>
+<l:template name="sect5" text="القسم المسمى “%tâ€"/>
+<l:template name="section" text="القسم المسمى “%tâ€"/>
+<l:template name="simplesect" text="القسم المسمى “%tâ€"/>
+</l:context>
+<l:context name="xref-number"><l:template name="answer" text="ج: %n"/>
+<l:template name="appendix" text="ملحق %n"/>
+<l:template name="bridgehead" text="قسم %n"/>
+<l:template name="chapter" text="Ùصل %n"/>
+<l:template name="equation" text="معادلة %n"/>
+<l:template name="example" text="مثال %n"/>
+<l:template name="figure" text="شكل %n"/>
+<l:template name="part" text="جزء %n"/>
+<l:template name="procedure" text="إجراء %n"/>
+<l:template name="productionset" text="منتج %n"/>
+<l:template name="qandadiv" text="س و ج %n"/>
+<l:template name="qandaentry" text="س: %n"/>
+<l:template name="question" text="س: %n"/>
+<l:template name="sect1" text="قسم %n"/>
+<l:template name="sect2" text="قسم %n"/>
+<l:template name="sect3" text="قسم %n"/>
+<l:template name="sect4" text="قسم %n"/>
+<l:template name="sect5" text="قسم %n"/>
+<l:template name="section" text="قسم %n"/>
+<l:template name="table" text="جدول %n"/>
+</l:context>
+<l:context name="xref-number-and-title"><l:template name="appendix" text="ملحق %n, %t"/>
+<l:template name="bridgehead" text="قسم %n, “%tâ€"/>
+<l:template name="chapter" text="Ùصل %n, %t"/>
+<l:template name="equation" text="معادلة %n, “%tâ€"/>
+<l:template name="example" text="مثال %n, “%tâ€"/>
+<l:template name="figure" text="شكل %n, “%tâ€"/>
+<l:template name="part" text="جزء %n, “%tâ€"/>
+<l:template name="procedure" text="إجراء %n, “%tâ€"/>
+<l:template name="productionset" text="منتج %n, “%tâ€"/>
+<l:template name="qandadiv" text="س Ùˆ ج %n, “%tâ€"/>
+<l:template name="refsect1" text="القسم المسمى “%tâ€"/>
+<l:template name="refsect2" text="القسم المسمى “%tâ€"/>
+<l:template name="refsect3" text="القسم المسمى “%tâ€"/>
+<l:template name="refsection" text="القسم المسمى “%tâ€"/>
+<l:template name="sect1" text="قسم %n, “%tâ€"/>
+<l:template name="sect2" text="قسم %n, “%tâ€"/>
+<l:template name="sect3" text="قسم %n, “%tâ€"/>
+<l:template name="sect4" text="قسم %n, “%tâ€"/>
+<l:template name="sect5" text="قسم %n, “%tâ€"/>
+<l:template name="section" text="قسم %n, “%tâ€"/>
+<l:template name="simplesect" text="القسم المسمى “%tâ€"/>
+<l:template name="table" text="جدول %n, “%tâ€"/>
+</l:context>
+<l:context name="authorgroup"><l:template name="sep" text="، "/>
+<l:template name="sep2" text=" Ùˆ "/>
+<l:template name="seplast" text="، و "/>
+</l:context>
+<l:context name="glossary"><l:template name="see" text="انظر %t."/>
+<l:template name="seealso" text="انظر أيضاً %t."/>
+<l:template name="seealso-separator" text=", "/>
+</l:context>
+<l:context name="msgset"><l:template name="MsgAud" text="الجمهور: "/>
+<l:template name="MsgLevel" text="المستوى: "/>
+<l:template name="MsgOrig" text="المصدر: "/>
+</l:context>
+<l:context name="datetime"><l:template name="format" text="d/m/Y"/>
+</l:context>
+<l:context name="termdef"><l:template name="prefix" text="[Definition: " lang="en"/>
+<l:template name="suffix" text="]" lang="en"/>
+</l:context>
+<l:context name="datetime-full"><l:template name="January" text="يناير"/>
+<l:template name="February" text="Ùبراير"/>
+<l:template name="March" text="مارس"/>
+<l:template name="April" text="أبريل"/>
+<l:template name="May" text="مايو"/>
+<l:template name="June" text="يونيو"/>
+<l:template name="July" text="يوليو"/>
+<l:template name="August" text="أغسطس"/>
+<l:template name="September" text="سبتمبر"/>
+<l:template name="October" text="أكتوبر"/>
+<l:template name="November" text="نوÙمبر"/>
+<l:template name="December" text="ديسمبر"/>
+<l:template name="Monday" text="الإثنين"/>
+<l:template name="Tuesday" text="الثلاثاء"/>
+<l:template name="Wednesday" text="الأربعاء"/>
+<l:template name="Thursday" text="الخميس"/>
+<l:template name="Friday" text="الجمعة"/>
+<l:template name="Saturday" text="السبت"/>
+<l:template name="Sunday" text="الأحد"/>
+</l:context>
+<l:context name="datetime-abbrev"><l:template name="Jan" text="يناير"/>
+<l:template name="Feb" text="Ùبراير"/>
+<l:template name="Mar" text="مارس"/>
+<l:template name="Apr" text="أبريل"/>
+<l:template name="May" text="مايو"/>
+<l:template name="Jun" text="يونيو"/>
+<l:template name="Jul" text="يوليو"/>
+<l:template name="Aug" text="أغسطس"/>
+<l:template name="Sep" text="سبتمبر"/>
+<l:template name="Oct" text="أكتوبر"/>
+<l:template name="Nov" text="نوÙمبر"/>
+<l:template name="Dec" text="ديسمبر"/>
+<l:template name="Mon" text="الإثنين"/>
+<l:template name="Tue" text="الثلاثاء"/>
+<l:template name="Wed" text="الأربعاء"/>
+<l:template name="Thu" text="الخميس"/>
+<l:template name="Fri" text="الجمعة"/>
+<l:template name="Sat" text="السبت"/>
+<l:template name="Sun" text="الأحد"/>
+</l:context>
+<l:context name="htmlhelp"><l:template name="langcode" text="0x0409 English (UNITED STATES)" lang="en"/>
+</l:context>
+<l:context name="index"><l:template name="term-separator" text=", " lang="en"/>
+<l:template name="number-separator" text=", " lang="en"/>
+<l:template name="range-separator" text="-" lang="en"/>
+</l:context>
+<l:context name="iso690"><l:template name="lastfirst.sep" text=", " lang="en"/>
+<l:template name="alt.person.two.sep" text=" – " lang="en"/>
+<l:template name="alt.person.last.sep" text=" – " lang="en"/>
+<l:template name="alt.person.more.sep" text=" – " lang="en"/>
+<l:template name="primary.editor" text=" (ed.)" lang="en"/>
+<l:template name="primary.many" text=", et al." lang="en"/>
+<l:template name="primary.sep" text=". " lang="en"/>
+<l:template name="submaintitle.sep" text=": " lang="en"/>
+<l:template name="title.sep" text=". " lang="en"/>
+<l:template name="othertitle.sep" text=", " lang="en"/>
+<l:template name="medium1" text=" [" lang="en"/>
+<l:template name="medium2" text="]" lang="en"/>
+<l:template name="secondary.person.sep" text="; " lang="en"/>
+<l:template name="secondary.sep" text=". " lang="en"/>
+<l:template name="respons.sep" text=". " lang="en"/>
+<l:template name="edition.sep" text=". " lang="en"/>
+<l:template name="edition.serial.sep" text=", " lang="en"/>
+<l:template name="issuing.range" text="-" lang="en"/>
+<l:template name="issuing.div" text=", " lang="en"/>
+<l:template name="issuing.sep" text=". " lang="en"/>
+<l:template name="partnr.sep" text=". " lang="en"/>
+<l:template name="placepubl.sep" text=": " lang="en"/>
+<l:template name="publyear.sep" text=", " lang="en"/>
+<l:template name="pubinfo.sep" text=". " lang="en"/>
+<l:template name="spec.pubinfo.sep" text=", " lang="en"/>
+<l:template name="upd.sep" text=", " lang="en"/>
+<l:template name="datecit1" text=" [cited " lang="en"/>
+<l:template name="datecit2" text="]" lang="en"/>
+<l:template name="extent.sep" text=". " lang="en"/>
+<l:template name="locs.sep" text=", " lang="en"/>
+<l:template name="location.sep" text=". " lang="en"/>
+<l:template name="serie.sep" text=". " lang="en"/>
+<l:template name="notice.sep" text=". " lang="en"/>
+<l:template name="access" text="Available " lang="en"/>
+<l:template name="acctoo" text="Also available " lang="en"/>
+<l:template name="onwww" text="from World Wide Web" lang="en"/>
+<l:template name="oninet" text="from Internet" lang="en"/>
+<l:template name="access.end" text=": " lang="en"/>
+<l:template name="link1" text="&lt;" lang="en"/>
+<l:template name="link2" text="&gt;" lang="en"/>
+<l:template name="access.sep" text=". " lang="en"/>
+<l:template name="isbn" text="ISBN " lang="en"/>
+<l:template name="issn" text="ISSN " lang="en"/>
+<l:template name="stdnum.sep" text=". " lang="en"/>
+<l:template name="patcountry.sep" text=". " lang="en"/>
+<l:template name="pattype.sep" text=", " lang="en"/>
+<l:template name="patnum.sep" text=". " lang="en"/>
+<l:template name="patdate.sep" text=". " lang="en"/>
+</l:context><l:letters lang="en"><l:l i="-1"/>
+<l:l i="0">Symbols</l:l>
+<l:l i="10">A</l:l>
+<l:l i="10">a</l:l>
+<l:l i="10">À</l:l>
+<l:l i="10">à</l:l>
+<l:l i="10">Ã</l:l>
+<l:l i="10">á</l:l>
+<l:l i="10">Â</l:l>
+<l:l i="10">â</l:l>
+<l:l i="10">Ã</l:l>
+<l:l i="10">ã</l:l>
+<l:l i="10">Ä</l:l>
+<l:l i="10">ä</l:l>
+<l:l i="10">Ã…</l:l>
+<l:l i="10">Ã¥</l:l>
+<l:l i="10">Ä€</l:l>
+<l:l i="10">Ä</l:l>
+<l:l i="10">Ä‚</l:l>
+<l:l i="10">ă</l:l>
+<l:l i="10">Ä„</l:l>
+<l:l i="10">Ä…</l:l>
+<l:l i="10">Ç</l:l>
+<l:l i="10">ÇŽ</l:l>
+<l:l i="10">Çž</l:l>
+<l:l i="10">ÇŸ</l:l>
+<l:l i="10">Ç </l:l>
+<l:l i="10">Ç¡</l:l>
+<l:l i="10">Ǻ</l:l>
+<l:l i="10">Ç»</l:l>
+<l:l i="10">È€</l:l>
+<l:l i="10">È</l:l>
+<l:l i="10">È‚</l:l>
+<l:l i="10">ȃ</l:l>
+<l:l i="10">Ȧ</l:l>
+<l:l i="10">ȧ</l:l>
+<l:l i="10">Ḁ</l:l>
+<l:l i="10">á¸</l:l>
+<l:l i="10">ẚ</l:l>
+<l:l i="10">Ạ</l:l>
+<l:l i="10">ạ</l:l>
+<l:l i="10">Ả</l:l>
+<l:l i="10">ả</l:l>
+<l:l i="10">Ấ</l:l>
+<l:l i="10">ấ</l:l>
+<l:l i="10">Ầ</l:l>
+<l:l i="10">ầ</l:l>
+<l:l i="10">Ẩ</l:l>
+<l:l i="10">ẩ</l:l>
+<l:l i="10">Ẫ</l:l>
+<l:l i="10">ẫ</l:l>
+<l:l i="10">Ậ</l:l>
+<l:l i="10">ậ</l:l>
+<l:l i="10">Ắ</l:l>
+<l:l i="10">ắ</l:l>
+<l:l i="10">Ằ</l:l>
+<l:l i="10">ằ</l:l>
+<l:l i="10">Ẳ</l:l>
+<l:l i="10">ẳ</l:l>
+<l:l i="10">Ẵ</l:l>
+<l:l i="10">ẵ</l:l>
+<l:l i="10">Ặ</l:l>
+<l:l i="10">ặ</l:l>
+<l:l i="20">B</l:l>
+<l:l i="20">b</l:l>
+<l:l i="20">Æ€</l:l>
+<l:l i="20">Æ</l:l>
+<l:l i="20">É“</l:l>
+<l:l i="20">Æ‚</l:l>
+<l:l i="20">ƃ</l:l>
+<l:l i="20">Ḃ</l:l>
+<l:l i="20">ḃ</l:l>
+<l:l i="20">Ḅ</l:l>
+<l:l i="20">ḅ</l:l>
+<l:l i="20">Ḇ</l:l>
+<l:l i="20">ḇ</l:l>
+<l:l i="30">C</l:l>
+<l:l i="30">c</l:l>
+<l:l i="30">Ç</l:l>
+<l:l i="30">ç</l:l>
+<l:l i="30">Ć</l:l>
+<l:l i="30">ć</l:l>
+<l:l i="30">Ĉ</l:l>
+<l:l i="30">ĉ</l:l>
+<l:l i="30">ÄŠ</l:l>
+<l:l i="30">Ä‹</l:l>
+<l:l i="30">Č</l:l>
+<l:l i="30">Ä</l:l>
+<l:l i="30">Ƈ</l:l>
+<l:l i="30">ƈ</l:l>
+<l:l i="30">É•</l:l>
+<l:l i="30">Ḉ</l:l>
+<l:l i="30">ḉ</l:l>
+<l:l i="40">D</l:l>
+<l:l i="40">d</l:l>
+<l:l i="40">ÄŽ</l:l>
+<l:l i="40">Ä</l:l>
+<l:l i="40">Ä</l:l>
+<l:l i="40">Ä‘</l:l>
+<l:l i="40">ÆŠ</l:l>
+<l:l i="40">É—</l:l>
+<l:l i="40">Æ‹</l:l>
+<l:l i="40">ƌ</l:l>
+<l:l i="40">Ç…</l:l>
+<l:l i="40">Dz</l:l>
+<l:l i="40">È¡</l:l>
+<l:l i="40">É–</l:l>
+<l:l i="40">Ḋ</l:l>
+<l:l i="40">ḋ</l:l>
+<l:l i="40">Ḍ</l:l>
+<l:l i="40">á¸</l:l>
+<l:l i="40">Ḏ</l:l>
+<l:l i="40">á¸</l:l>
+<l:l i="40">á¸</l:l>
+<l:l i="40">ḑ</l:l>
+<l:l i="40">Ḓ</l:l>
+<l:l i="40">ḓ</l:l>
+<l:l i="50">E</l:l>
+<l:l i="50">e</l:l>
+<l:l i="50">È</l:l>
+<l:l i="50">è</l:l>
+<l:l i="50">É</l:l>
+<l:l i="50">é</l:l>
+<l:l i="50">Ê</l:l>
+<l:l i="50">ê</l:l>
+<l:l i="50">Ë</l:l>
+<l:l i="50">ë</l:l>
+<l:l i="50">Ä’</l:l>
+<l:l i="50">Ä“</l:l>
+<l:l i="50">Ä”</l:l>
+<l:l i="50">Ä•</l:l>
+<l:l i="50">Ä–</l:l>
+<l:l i="50">Ä—</l:l>
+<l:l i="50">Ę</l:l>
+<l:l i="50">Ä™</l:l>
+<l:l i="50">Äš</l:l>
+<l:l i="50">Ä›</l:l>
+<l:l i="50">È„</l:l>
+<l:l i="50">È…</l:l>
+<l:l i="50">Ȇ</l:l>
+<l:l i="50">ȇ</l:l>
+<l:l i="50">Ȩ</l:l>
+<l:l i="50">È©</l:l>
+<l:l i="50">Ḕ</l:l>
+<l:l i="50">ḕ</l:l>
+<l:l i="50">Ḗ</l:l>
+<l:l i="50">ḗ</l:l>
+<l:l i="50">Ḙ</l:l>
+<l:l i="50">ḙ</l:l>
+<l:l i="50">Ḛ</l:l>
+<l:l i="50">ḛ</l:l>
+<l:l i="50">Ḝ</l:l>
+<l:l i="50">á¸</l:l>
+<l:l i="50">Ẹ</l:l>
+<l:l i="50">ẹ</l:l>
+<l:l i="50">Ẻ</l:l>
+<l:l i="50">ẻ</l:l>
+<l:l i="50">Ẽ</l:l>
+<l:l i="50">ẽ</l:l>
+<l:l i="50">Ế</l:l>
+<l:l i="50">ế</l:l>
+<l:l i="50">Ề</l:l>
+<l:l i="50">á»</l:l>
+<l:l i="50">Ể</l:l>
+<l:l i="50">ể</l:l>
+<l:l i="50">Ễ</l:l>
+<l:l i="50">á»…</l:l>
+<l:l i="50">Ệ</l:l>
+<l:l i="50">ệ</l:l>
+<l:l i="60">F</l:l>
+<l:l i="60">f</l:l>
+<l:l i="60">Æ‘</l:l>
+<l:l i="60">Æ’</l:l>
+<l:l i="60">Ḟ</l:l>
+<l:l i="60">ḟ</l:l>
+<l:l i="70">G</l:l>
+<l:l i="70">g</l:l>
+<l:l i="70">Ĝ</l:l>
+<l:l i="70">Ä</l:l>
+<l:l i="70">Äž</l:l>
+<l:l i="70">ÄŸ</l:l>
+<l:l i="70">Ä </l:l>
+<l:l i="70">Ä¡</l:l>
+<l:l i="70">Ä¢</l:l>
+<l:l i="70">Ä£</l:l>
+<l:l i="70">Æ“</l:l>
+<l:l i="70">É </l:l>
+<l:l i="70">Ǥ</l:l>
+<l:l i="70">Ç¥</l:l>
+<l:l i="70">Ǧ</l:l>
+<l:l i="70">ǧ</l:l>
+<l:l i="70">Ç´</l:l>
+<l:l i="70">ǵ</l:l>
+<l:l i="70">Ḡ</l:l>
+<l:l i="70">ḡ</l:l>
+<l:l i="80">H</l:l>
+<l:l i="80">h</l:l>
+<l:l i="80">Ĥ</l:l>
+<l:l i="80">Ä¥</l:l>
+<l:l i="80">Ħ</l:l>
+<l:l i="80">ħ</l:l>
+<l:l i="80">Èž</l:l>
+<l:l i="80">ÈŸ</l:l>
+<l:l i="80">ɦ</l:l>
+<l:l i="80">Ḣ</l:l>
+<l:l i="80">ḣ</l:l>
+<l:l i="80">Ḥ</l:l>
+<l:l i="80">ḥ</l:l>
+<l:l i="80">Ḧ</l:l>
+<l:l i="80">ḧ</l:l>
+<l:l i="80">Ḩ</l:l>
+<l:l i="80">ḩ</l:l>
+<l:l i="80">Ḫ</l:l>
+<l:l i="80">ḫ</l:l>
+<l:l i="80">ẖ</l:l>
+<l:l i="90">I</l:l>
+<l:l i="90">i</l:l>
+<l:l i="90">Ì</l:l>
+<l:l i="90">ì</l:l>
+<l:l i="90">Ã</l:l>
+<l:l i="90">í</l:l>
+<l:l i="90">ÃŽ</l:l>
+<l:l i="90">î</l:l>
+<l:l i="90">Ã</l:l>
+<l:l i="90">ï</l:l>
+<l:l i="90">Ĩ</l:l>
+<l:l i="90">Ä©</l:l>
+<l:l i="90">Ī</l:l>
+<l:l i="90">Ä«</l:l>
+<l:l i="90">Ĭ</l:l>
+<l:l i="90">Ä­</l:l>
+<l:l i="90">Ä®</l:l>
+<l:l i="90">į</l:l>
+<l:l i="90">Ä°</l:l>
+<l:l i="90">Æ—</l:l>
+<l:l i="90">ɨ</l:l>
+<l:l i="90">Ç</l:l>
+<l:l i="90">Ç</l:l>
+<l:l i="90">Ȉ</l:l>
+<l:l i="90">ȉ</l:l>
+<l:l i="90">ÈŠ</l:l>
+<l:l i="90">È‹</l:l>
+<l:l i="90">Ḭ</l:l>
+<l:l i="90">ḭ</l:l>
+<l:l i="90">Ḯ</l:l>
+<l:l i="90">ḯ</l:l>
+<l:l i="90">Ỉ</l:l>
+<l:l i="90">ỉ</l:l>
+<l:l i="90">Ị</l:l>
+<l:l i="90">ị</l:l>
+<l:l i="100">J</l:l>
+<l:l i="100">j</l:l>
+<l:l i="100">Ä´</l:l>
+<l:l i="100">ĵ</l:l>
+<l:l i="100">Ç°</l:l>
+<l:l i="100">Ê</l:l>
+<l:l i="110">K</l:l>
+<l:l i="110">k</l:l>
+<l:l i="110">Ķ</l:l>
+<l:l i="110">Ä·</l:l>
+<l:l i="110">Ƙ</l:l>
+<l:l i="110">Æ™</l:l>
+<l:l i="110">Ǩ</l:l>
+<l:l i="110">Ç©</l:l>
+<l:l i="110">Ḱ</l:l>
+<l:l i="110">ḱ</l:l>
+<l:l i="110">Ḳ</l:l>
+<l:l i="110">ḳ</l:l>
+<l:l i="110">Ḵ</l:l>
+<l:l i="110">ḵ</l:l>
+<l:l i="120">L</l:l>
+<l:l i="120">l</l:l>
+<l:l i="120">Ĺ</l:l>
+<l:l i="120">ĺ</l:l>
+<l:l i="120">Ä»</l:l>
+<l:l i="120">ļ</l:l>
+<l:l i="120">Ľ</l:l>
+<l:l i="120">ľ</l:l>
+<l:l i="120">Ä¿</l:l>
+<l:l i="120">Å€</l:l>
+<l:l i="120">Å</l:l>
+<l:l i="120">Å‚</l:l>
+<l:l i="120">Æš</l:l>
+<l:l i="120">Lj</l:l>
+<l:l i="120">È´</l:l>
+<l:l i="120">É«</l:l>
+<l:l i="120">ɬ</l:l>
+<l:l i="120">É­</l:l>
+<l:l i="120">Ḷ</l:l>
+<l:l i="120">ḷ</l:l>
+<l:l i="120">Ḹ</l:l>
+<l:l i="120">ḹ</l:l>
+<l:l i="120">Ḻ</l:l>
+<l:l i="120">ḻ</l:l>
+<l:l i="120">Ḽ</l:l>
+<l:l i="120">ḽ</l:l>
+<l:l i="130">M</l:l>
+<l:l i="130">m</l:l>
+<l:l i="130">ɱ</l:l>
+<l:l i="130">Ḿ</l:l>
+<l:l i="130">ḿ</l:l>
+<l:l i="130">á¹€</l:l>
+<l:l i="130">á¹</l:l>
+<l:l i="130">Ṃ</l:l>
+<l:l i="130">ṃ</l:l>
+<l:l i="140">N</l:l>
+<l:l i="140">n</l:l>
+<l:l i="140">Ñ</l:l>
+<l:l i="140">ñ</l:l>
+<l:l i="140">Ń</l:l>
+<l:l i="140">Å„</l:l>
+<l:l i="140">Å…</l:l>
+<l:l i="140">ņ</l:l>
+<l:l i="140">Ň</l:l>
+<l:l i="140">ň</l:l>
+<l:l i="140">Æ</l:l>
+<l:l i="140">ɲ</l:l>
+<l:l i="140">Æž</l:l>
+<l:l i="140">È </l:l>
+<l:l i="140">Ç‹</l:l>
+<l:l i="140">Ǹ</l:l>
+<l:l i="140">ǹ</l:l>
+<l:l i="140">ȵ</l:l>
+<l:l i="140">ɳ</l:l>
+<l:l i="140">Ṅ</l:l>
+<l:l i="140">á¹…</l:l>
+<l:l i="140">Ṇ</l:l>
+<l:l i="140">ṇ</l:l>
+<l:l i="140">Ṉ</l:l>
+<l:l i="140">ṉ</l:l>
+<l:l i="140">Ṋ</l:l>
+<l:l i="140">ṋ</l:l>
+<l:l i="150">O</l:l>
+<l:l i="150">o</l:l>
+<l:l i="150">Ã’</l:l>
+<l:l i="150">ò</l:l>
+<l:l i="150">Ó</l:l>
+<l:l i="150">ó</l:l>
+<l:l i="150">Ô</l:l>
+<l:l i="150">ô</l:l>
+<l:l i="150">Õ</l:l>
+<l:l i="150">õ</l:l>
+<l:l i="150">Ö</l:l>
+<l:l i="150">ö</l:l>
+<l:l i="150">Ø</l:l>
+<l:l i="150">ø</l:l>
+<l:l i="150">Ō</l:l>
+<l:l i="150">Å</l:l>
+<l:l i="150">ÅŽ</l:l>
+<l:l i="150">Å</l:l>
+<l:l i="150">Å</l:l>
+<l:l i="150">Å‘</l:l>
+<l:l i="150">ÆŸ</l:l>
+<l:l i="150">Æ </l:l>
+<l:l i="150">Æ¡</l:l>
+<l:l i="150">Ç‘</l:l>
+<l:l i="150">Ç’</l:l>
+<l:l i="150">Ǫ</l:l>
+<l:l i="150">Ç«</l:l>
+<l:l i="150">Ǭ</l:l>
+<l:l i="150">Ç­</l:l>
+<l:l i="150">Ǿ</l:l>
+<l:l i="150">Ç¿</l:l>
+<l:l i="150">Ȍ</l:l>
+<l:l i="150">È</l:l>
+<l:l i="150">ÈŽ</l:l>
+<l:l i="150">È</l:l>
+<l:l i="150">Ȫ</l:l>
+<l:l i="150">È«</l:l>
+<l:l i="150">Ȭ</l:l>
+<l:l i="150">È­</l:l>
+<l:l i="150">È®</l:l>
+<l:l i="150">ȯ</l:l>
+<l:l i="150">È°</l:l>
+<l:l i="150">ȱ</l:l>
+<l:l i="150">Ṍ</l:l>
+<l:l i="150">á¹</l:l>
+<l:l i="150">Ṏ</l:l>
+<l:l i="150">á¹</l:l>
+<l:l i="150">á¹</l:l>
+<l:l i="150">ṑ</l:l>
+<l:l i="150">á¹’</l:l>
+<l:l i="150">ṓ</l:l>
+<l:l i="150">Ọ</l:l>
+<l:l i="150">á»</l:l>
+<l:l i="150">Ỏ</l:l>
+<l:l i="150">á»</l:l>
+<l:l i="150">á»</l:l>
+<l:l i="150">ố</l:l>
+<l:l i="150">á»’</l:l>
+<l:l i="150">ồ</l:l>
+<l:l i="150">á»”</l:l>
+<l:l i="150">ổ</l:l>
+<l:l i="150">á»–</l:l>
+<l:l i="150">á»—</l:l>
+<l:l i="150">Ộ</l:l>
+<l:l i="150">á»™</l:l>
+<l:l i="150">Ớ</l:l>
+<l:l i="150">á»›</l:l>
+<l:l i="150">Ờ</l:l>
+<l:l i="150">á»</l:l>
+<l:l i="150">Ở</l:l>
+<l:l i="150">ở</l:l>
+<l:l i="150">á» </l:l>
+<l:l i="150">ỡ</l:l>
+<l:l i="150">Ợ</l:l>
+<l:l i="150">ợ</l:l>
+<l:l i="160">P</l:l>
+<l:l i="160">p</l:l>
+<l:l i="160">Ƥ</l:l>
+<l:l i="160">Æ¥</l:l>
+<l:l i="160">á¹”</l:l>
+<l:l i="160">ṕ</l:l>
+<l:l i="160">á¹–</l:l>
+<l:l i="160">á¹—</l:l>
+<l:l i="170">Q</l:l>
+<l:l i="170">q</l:l>
+<l:l i="170">Ê </l:l>
+<l:l i="180">R</l:l>
+<l:l i="180">r</l:l>
+<l:l i="180">Å”</l:l>
+<l:l i="180">Å•</l:l>
+<l:l i="180">Å–</l:l>
+<l:l i="180">Å—</l:l>
+<l:l i="180">Ř</l:l>
+<l:l i="180">Å™</l:l>
+<l:l i="180">È</l:l>
+<l:l i="180">È‘</l:l>
+<l:l i="180">È’</l:l>
+<l:l i="180">È“</l:l>
+<l:l i="180">ɼ</l:l>
+<l:l i="180">ɽ</l:l>
+<l:l i="180">ɾ</l:l>
+<l:l i="180">Ṙ</l:l>
+<l:l i="180">á¹™</l:l>
+<l:l i="180">Ṛ</l:l>
+<l:l i="180">á¹›</l:l>
+<l:l i="180">Ṝ</l:l>
+<l:l i="180">á¹</l:l>
+<l:l i="180">Ṟ</l:l>
+<l:l i="180">ṟ</l:l>
+<l:l i="190">S</l:l>
+<l:l i="190">s</l:l>
+<l:l i="190">Åš</l:l>
+<l:l i="190">Å›</l:l>
+<l:l i="190">Ŝ</l:l>
+<l:l i="190">Å</l:l>
+<l:l i="190">Åž</l:l>
+<l:l i="190">ÅŸ</l:l>
+<l:l i="190">Å </l:l>
+<l:l i="190">Å¡</l:l>
+<l:l i="190">Ș</l:l>
+<l:l i="190">È™</l:l>
+<l:l i="190">Ê‚</l:l>
+<l:l i="190">á¹ </l:l>
+<l:l i="190">ṡ</l:l>
+<l:l i="190">á¹¢</l:l>
+<l:l i="190">á¹£</l:l>
+<l:l i="190">Ṥ</l:l>
+<l:l i="190">á¹¥</l:l>
+<l:l i="190">Ṧ</l:l>
+<l:l i="190">ṧ</l:l>
+<l:l i="190">Ṩ</l:l>
+<l:l i="190">ṩ</l:l>
+<l:l i="200">T</l:l>
+<l:l i="200">t</l:l>
+<l:l i="200">Å¢</l:l>
+<l:l i="200">Å£</l:l>
+<l:l i="200">Ť</l:l>
+<l:l i="200">Å¥</l:l>
+<l:l i="200">Ŧ</l:l>
+<l:l i="200">ŧ</l:l>
+<l:l i="200">Æ«</l:l>
+<l:l i="200">Ƭ</l:l>
+<l:l i="200">Æ­</l:l>
+<l:l i="200">Æ®</l:l>
+<l:l i="200">ʈ</l:l>
+<l:l i="200">Èš</l:l>
+<l:l i="200">È›</l:l>
+<l:l i="200">ȶ</l:l>
+<l:l i="200">Ṫ</l:l>
+<l:l i="200">ṫ</l:l>
+<l:l i="200">Ṭ</l:l>
+<l:l i="200">á¹­</l:l>
+<l:l i="200">á¹®</l:l>
+<l:l i="200">ṯ</l:l>
+<l:l i="200">á¹°</l:l>
+<l:l i="200">á¹±</l:l>
+<l:l i="200">ẗ</l:l>
+<l:l i="210">U</l:l>
+<l:l i="210">u</l:l>
+<l:l i="210">Ù</l:l>
+<l:l i="210">ù</l:l>
+<l:l i="210">Ú</l:l>
+<l:l i="210">ú</l:l>
+<l:l i="210">Û</l:l>
+<l:l i="210">û</l:l>
+<l:l i="210">Ü</l:l>
+<l:l i="210">ü</l:l>
+<l:l i="210">Ũ</l:l>
+<l:l i="210">Å©</l:l>
+<l:l i="210">Ū</l:l>
+<l:l i="210">Å«</l:l>
+<l:l i="210">Ŭ</l:l>
+<l:l i="210">Å­</l:l>
+<l:l i="210">Å®</l:l>
+<l:l i="210">ů</l:l>
+<l:l i="210">Å°</l:l>
+<l:l i="210">ű</l:l>
+<l:l i="210">Ų</l:l>
+<l:l i="210">ų</l:l>
+<l:l i="210">Ư</l:l>
+<l:l i="210">Æ°</l:l>
+<l:l i="210">Ç“</l:l>
+<l:l i="210">Ç”</l:l>
+<l:l i="210">Ç•</l:l>
+<l:l i="210">Ç–</l:l>
+<l:l i="210">Ç—</l:l>
+<l:l i="210">ǘ</l:l>
+<l:l i="210">Ç™</l:l>
+<l:l i="210">Çš</l:l>
+<l:l i="210">Ç›</l:l>
+<l:l i="210">ǜ</l:l>
+<l:l i="210">È”</l:l>
+<l:l i="210">È•</l:l>
+<l:l i="210">È–</l:l>
+<l:l i="210">È—</l:l>
+<l:l i="210">á¹²</l:l>
+<l:l i="210">á¹³</l:l>
+<l:l i="210">á¹´</l:l>
+<l:l i="210">á¹µ</l:l>
+<l:l i="210">Ṷ</l:l>
+<l:l i="210">á¹·</l:l>
+<l:l i="210">Ṹ</l:l>
+<l:l i="210">á¹¹</l:l>
+<l:l i="210">Ṻ</l:l>
+<l:l i="210">á¹»</l:l>
+<l:l i="210">Ụ</l:l>
+<l:l i="210">ụ</l:l>
+<l:l i="210">Ủ</l:l>
+<l:l i="210">ủ</l:l>
+<l:l i="210">Ứ</l:l>
+<l:l i="210">ứ</l:l>
+<l:l i="210">Ừ</l:l>
+<l:l i="210">ừ</l:l>
+<l:l i="210">Ử</l:l>
+<l:l i="210">á»­</l:l>
+<l:l i="210">á»®</l:l>
+<l:l i="210">ữ</l:l>
+<l:l i="210">á»°</l:l>
+<l:l i="210">á»±</l:l>
+<l:l i="220">V</l:l>
+<l:l i="220">v</l:l>
+<l:l i="220">Ʋ</l:l>
+<l:l i="220">Ê‹</l:l>
+<l:l i="220">á¹¼</l:l>
+<l:l i="220">á¹½</l:l>
+<l:l i="220">á¹¾</l:l>
+<l:l i="220">ṿ</l:l>
+<l:l i="230">W</l:l>
+<l:l i="230">w</l:l>
+<l:l i="230">Å´</l:l>
+<l:l i="230">ŵ</l:l>
+<l:l i="230">Ẁ</l:l>
+<l:l i="230">áº</l:l>
+<l:l i="230">Ẃ</l:l>
+<l:l i="230">ẃ</l:l>
+<l:l i="230">Ẅ</l:l>
+<l:l i="230">ẅ</l:l>
+<l:l i="230">Ẇ</l:l>
+<l:l i="230">ẇ</l:l>
+<l:l i="230">Ẉ</l:l>
+<l:l i="230">ẉ</l:l>
+<l:l i="230">ẘ</l:l>
+<l:l i="240">X</l:l>
+<l:l i="240">x</l:l>
+<l:l i="240">Ẋ</l:l>
+<l:l i="240">ẋ</l:l>
+<l:l i="240">Ẍ</l:l>
+<l:l i="240">áº</l:l>
+<l:l i="250">Y</l:l>
+<l:l i="250">y</l:l>
+<l:l i="250">Ã</l:l>
+<l:l i="250">ý</l:l>
+<l:l i="250">ÿ</l:l>
+<l:l i="250">Ÿ</l:l>
+<l:l i="250">Ŷ</l:l>
+<l:l i="250">Å·</l:l>
+<l:l i="250">Ƴ</l:l>
+<l:l i="250">Æ´</l:l>
+<l:l i="250">Ȳ</l:l>
+<l:l i="250">ȳ</l:l>
+<l:l i="250">Ẏ</l:l>
+<l:l i="250">áº</l:l>
+<l:l i="250">ẙ</l:l>
+<l:l i="250">Ỳ</l:l>
+<l:l i="250">ỳ</l:l>
+<l:l i="250">á»´</l:l>
+<l:l i="250">ỵ</l:l>
+<l:l i="250">Ỷ</l:l>
+<l:l i="250">á»·</l:l>
+<l:l i="250">Ỹ</l:l>
+<l:l i="250">ỹ</l:l>
+<l:l i="260">Z</l:l>
+<l:l i="260">z</l:l>
+<l:l i="260">Ź</l:l>
+<l:l i="260">ź</l:l>
+<l:l i="260">Å»</l:l>
+<l:l i="260">ż</l:l>
+<l:l i="260">Ž</l:l>
+<l:l i="260">ž</l:l>
+<l:l i="260">Ƶ</l:l>
+<l:l i="260">ƶ</l:l>
+<l:l i="260">Ȥ</l:l>
+<l:l i="260">È¥</l:l>
+<l:l i="260">Ê</l:l>
+<l:l i="260">Ê‘</l:l>
+<l:l i="260">áº</l:l>
+<l:l i="260">ẑ</l:l>
+<l:l i="260">Ẓ</l:l>
+<l:l i="260">ẓ</l:l>
+<l:l i="260">Ẕ</l:l>
+<l:l i="260">ẕ</l:l>
+</l:letters>
+</l:l10n>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/as.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/as.xml
new file mode 100644
index 0000000..28d0b10
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/as.xml
@@ -0,0 +1,660 @@
+<?xml version="1.0" encoding="utf-8"?>
+<l:l10n xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0" language="as" english-language-name="Assamese">
+
+<!-- * This file is generated automatically. -->
+<!-- * To submit changes to this file upstream (to the DocBook Project) -->
+<!-- * do not submit an edited version of this file. Instead, submit an -->
+<!-- * edited version of the source file at the following location: -->
+<!-- * -->
+<!-- * https://docbook.svn.sourceforge.net/svnroot/docbook/trunk/gentext/locale/as.xml -->
+<!-- * -->
+<!-- * E-mail the edited as.xml source file to: -->
+<!-- * -->
+<!-- * docbook-developers@lists.sourceforge.net -->
+
+<!-- ******************************************************************** -->
+
+<!-- This file is part of the XSL DocBook Stylesheet distribution. -->
+<!-- See ../README or http://docbook.sf.net/release/xsl/current/ for -->
+<!-- copyright and other information. -->
+
+<!-- ******************************************************************** -->
+<!-- In these files, % with a letter is used for a placeholder: -->
+<!-- %t is the current element's title -->
+<!-- %s is the current element's subtitle (if applicable)-->
+<!-- %n is the current element's number label-->
+<!-- %p is the current element's page number (if applicable)-->
+<!-- ******************************************************************** -->
+
+
+<l:gentext key="Abstract" text="সাৰাংশ"/>
+<l:gentext key="abstract" text="সাৰাংশ"/>
+<l:gentext key="Acknowledgements" text="সà§à¦¬à§€à¦•à§ƒà¦¤à¦¿"/>
+<l:gentext key="acknowledgements" text="সà§à¦¬à§€à¦•à§ƒà¦¤à¦¿"/>
+<l:gentext key="Answer" text="উ:"/>
+<l:gentext key="answer" text="উ:"/>
+<l:gentext key="Appendix" text="পৰিশিষà§à¦Ÿ"/>
+<l:gentext key="appendix" text="পৰিশিষà§à¦Ÿ"/>
+<l:gentext key="Article" text="পà§à§°à¦¬à¦¨à§à¦§"/>
+<l:gentext key="article" text="পà§à§°à¦¬à¦¨à§à¦§"/>
+<l:gentext key="Author" text="লিখক"/>
+<l:gentext key="Bibliography" text="গà§à§°à¦¨à§à¦¥à¦¸à§‚চী"/>
+<l:gentext key="bibliography" text="গà§à§°à¦¨à§à¦¥à¦¸à§‚চী"/>
+<l:gentext key="Book" text="কিতাপ"/>
+<l:gentext key="book" text="কিতাপ"/>
+<l:gentext key="CAUTION" text="সাৱধান"/>
+<l:gentext key="Caution" text="সাৱধান"/>
+<l:gentext key="caution" text="সাৱধান"/>
+<l:gentext key="Chapter" text="অধà§à¦¯à¦¾à§Ÿ"/>
+<l:gentext key="chapter" text="অধà§à¦¯à¦¾à§Ÿ"/>
+<l:gentext key="Colophon" text="গà§à§°à¦¨à§à¦¥à¦ªà§°à¦¿à¦šà§Ÿ"/>
+<l:gentext key="colophon" text="গà§à§°à¦¨à§à¦¥à¦ªà§°à¦¿à¦šà§Ÿ"/>
+<l:gentext key="Copyright" text="সà§à¦¬à¦¤à§à¦¬à¦¾à¦§à¦¿à¦•à¦¾à§°"/>
+<l:gentext key="copyright" text="সà§à¦¬à¦¤à§à¦¬à¦¾à¦§à¦¿à¦•à¦¾à§°"/>
+<l:gentext key="Dedication" text="উসৰà§à¦—া"/>
+<l:gentext key="dedication" text="উসৰà§à¦—া"/>
+<l:gentext key="Edition" text="সংসà§à¦•à§°à¦£"/>
+<l:gentext key="edition" text="সংসà§à¦•à§°à¦£"/>
+<l:gentext key="Editor" text="সমà§à¦ªà¦¾à¦¦à¦•"/>
+<l:gentext key="Equation" text="সমীকৰণ"/>
+<l:gentext key="equation" text="সমীকৰণ"/>
+<l:gentext key="Example" text="উদাহৰণ"/>
+<l:gentext key="example" text="উদাহৰণ"/>
+<l:gentext key="Figure" text="ছবি"/>
+<l:gentext key="figure" text="ছবি"/>
+<l:gentext key="Glossary" text="শবà§à¦¦à¦•à§‹à¦·"/>
+<l:gentext key="glossary" text="শবà§à¦¦à¦•à§‹à¦·"/>
+<l:gentext key="GlossSee" text="চাওক"/>
+<l:gentext key="glosssee" text="চাওক"/>
+<l:gentext key="GlossSeeAlso" text="ইয়াকো চাওক"/>
+<l:gentext key="glossseealso" text="ইয়াকো চাওক"/>
+<l:gentext key="IMPORTANT" text="গà§à§°à§à¦¤à§à¦¬à¦ªà§‚ৰà§à¦£"/>
+<l:gentext key="important" text="গà§à§°à§à¦¤à§à¦¬à¦ªà§‚ৰà§à¦£"/>
+<l:gentext key="Important" text="গà§à§°à§à¦¤à§à¦¬à¦ªà§‚ৰà§à¦£"/>
+<l:gentext key="Index" text="সূচী"/>
+<l:gentext key="index" text="সূচী"/>
+<l:gentext key="ISBN" text="ISBN"/>
+<l:gentext key="isbn" text="ISBN"/>
+<l:gentext key="LegalNotice" text="আইনসনà§à¦®à¦¤ ঘোষণা"/>
+<l:gentext key="legalnotice" text="আইনসনà§à¦®à¦¤ ঘোষণা"/>
+<l:gentext key="MsgAud" text="শà§à§°à§‹à¦¤à¦¾"/>
+<l:gentext key="msgaud" text="শà§à§°à§‹à¦¤à¦¾"/>
+<l:gentext key="MsgLevel" text="সà§à¦¤à§°"/>
+<l:gentext key="msglevel" text="সà§à¦¤à§°"/>
+<l:gentext key="MsgOrig" text="উৎস"/>
+<l:gentext key="msgorig" text="উৎস"/>
+<l:gentext key="NOTE" text="টোকা"/>
+<l:gentext key="Note" text="টোকা"/>
+<l:gentext key="note" text="টোকা"/>
+<l:gentext key="Part" text="অংশ"/>
+<l:gentext key="part" text="অংশ"/>
+<l:gentext key="Preface" text="পাতনি"/>
+<l:gentext key="preface" text="পাতনি"/>
+<l:gentext key="Procedure" text="পà§à§°à¦•à§à§°à¦¿à§Ÿà¦¾"/>
+<l:gentext key="procedure" text="পà§à§°à¦•à§à§°à¦¿à§Ÿà¦¾"/>
+<l:gentext key="ProductionSet" text="উৎপাদন"/>
+<l:gentext key="PubDate" text="পà§à§°à¦•à¦¾à¦¶à¦¨à§° দিন"/>
+<l:gentext key="pubdate" text="পà§à§°à¦•à¦¾à¦¶à¦¨à§° দিন"/>
+<l:gentext key="Published" text="পà§à§°à¦•à¦¾à¦¶à¦¿à¦¤"/>
+<l:gentext key="published" text="পà§à§°à¦•à¦¾à¦¶à¦¿à¦¤"/>
+<l:gentext key="Publisher" text="পà§à§°à¦•à¦¾à¦¶à¦•"/>
+<l:gentext key="Qandadiv" text="পà§à§°à¦¶à§à¦¨ &amp; উতà§à¦¤à§°"/>
+<l:gentext key="qandadiv" text="পà§à§°à¦¶à§à¦¨ &amp; উতà§à¦¤à§°"/>
+<l:gentext key="QandASet" text="সঘনাই কৰা পà§à§°à¦¶à§à¦¨"/>
+<l:gentext key="Question" text="পà§à§°:"/>
+<l:gentext key="question" text="পà§à§°:"/>
+<l:gentext key="RefEntry" text="পৃষà§à¦ à¦¾"/>
+<l:gentext key="refentry" text="পৃষà§à¦ à¦¾"/>
+<l:gentext key="Reference" text="পà§à§°à¦¸à¦™à§à¦—"/>
+<l:gentext key="reference" text="পà§à§°à¦¸à¦™à§à¦—"/>
+<l:gentext key="References" text="পà§à§°à¦¸à¦™à§à¦—বোৰ"/>
+<l:gentext key="RefName" text="নাম"/>
+<l:gentext key="refname" text="নাম"/>
+<l:gentext key="RefSection" text="বিভাগ"/>
+<l:gentext key="refsection" text="বিভাগ"/>
+<l:gentext key="RefSynopsisDiv" text="সাৰাংশ"/>
+<l:gentext key="refsynopsisdiv" text="সাৰাংশ"/>
+<l:gentext key="RevHistory" text="পà§à¦¨à§°à§€à¦•à§à¦·à¦£à§° ইতিহাস"/>
+<l:gentext key="revhistory" text="পà§à¦¨à§°à§€à¦•à§à¦·à¦£à§° ইতিহাস"/>
+<l:gentext key="revision" text="পà§à¦¨à§°à§€à¦•à§à¦·à¦£"/>
+<l:gentext key="Revision" text="পà§à¦¨à§°à§€à¦•à§à¦·à¦£"/>
+<l:gentext key="sect1" text="বিভাগ"/>
+<l:gentext key="sect2" text="বিভাগ"/>
+<l:gentext key="sect3" text="বিভাগ"/>
+<l:gentext key="sect4" text="বিভাগ"/>
+<l:gentext key="sect5" text="বিভাগ"/>
+<l:gentext key="section" text="বিভাগ"/>
+<l:gentext key="Section" text="বিভাগ"/>
+<l:gentext key="see" text="চাওক"/>
+<l:gentext key="See" text="চাওক"/>
+<l:gentext key="seealso" text="ইয়াকো চাওক"/>
+<l:gentext key="Seealso" text="ইয়াকো চাওক"/>
+<l:gentext key="SeeAlso" text="ইয়াকো চাওক"/>
+<l:gentext key="set" text="গোট"/>
+<l:gentext key="Set" text="গোট"/>
+<l:gentext key="setindex" text="সূচী পà§à§°à¦¤à¦¿à¦·à§à¦ à¦¾ কৰক"/>
+<l:gentext key="SetIndex" text="সূচী পà§à§°à¦¤à¦¿à¦·à§à¦ à¦¾ কৰক"/>
+<l:gentext key="Sidebar" text="চাইডবাৰ"/>
+<l:gentext key="sidebar" text="চাইডবাৰ"/>
+<l:gentext key="step" text="পৰà§à¦¯à¦¾à§Ÿ"/>
+<l:gentext key="Step" text="পৰà§à¦¯à¦¾à§Ÿ"/>
+<l:gentext key="table" text="তালিকা"/>
+<l:gentext key="Table" text="তালিকা"/>
+<l:gentext key="task" text="কাৰà§à¦¯à§à¦¯"/>
+<l:gentext key="Task" text="কাৰà§à¦¯à§à¦¯"/>
+<l:gentext key="tip" text="সঙà§à¦•à§‡à¦¤"/>
+<l:gentext key="TIP" text="সঙà§à¦•à§‡à¦¤"/>
+<l:gentext key="Tip" text="সঙà§à¦•à§‡à¦¤"/>
+<l:gentext key="Warning" text="সকিয়নি"/>
+<l:gentext key="warning" text="সকিয়নি"/>
+<l:gentext key="WARNING" text="সকিয়নি"/>
+<l:gentext key="and" text="আৰà§"/>
+<l:gentext key="by" text="-ৰ দà§à¦¬à¦¾à§°à¦¾"/>
+<l:gentext key="Edited" text="সমà§à¦ªà¦¾à¦¦à¦¿à¦¤"/>
+<l:gentext key="edited" text="সমà§à¦ªà¦¾à¦¦à¦¿à¦¤"/>
+<l:gentext key="Editedby" text="-ৰ দà§à¦¬à¦¾à§°à¦¾ সমà§à¦ªà¦¾à¦¦à¦¿à¦¤"/>
+<l:gentext key="editedby" text="-ৰ দà§à¦¬à¦¾à§°à¦¾ সমà§à¦ªà¦¾à¦¦à¦¿à¦¤"/>
+<l:gentext key="in" text="-ত"/>
+<l:gentext key="lastlistcomma" text=","/>
+<l:gentext key="listcomma" text=","/>
+<l:gentext key="notes" text="টোকা"/>
+<l:gentext key="Notes" text="টোকা"/>
+<l:gentext key="Pgs" text="পৃষà§à¦ à¦¾à¦¸à¦®à§‚হ"/>
+<l:gentext key="pgs" text="পৃষà§à¦ à¦¾à¦¸à¦®à§‚হ"/>
+<l:gentext key="Revisedby" text="পà§à¦¨à§°à§€à¦•à§à¦·à¦£à¦•à§°à§à¦¤à¦¾:"/>
+<l:gentext key="revisedby" text="পà§à¦¨à§°à§€à¦•à§à¦·à¦£à¦•à§°à§à¦¤à¦¾:"/>
+<l:gentext key="TableNotes" text="টোকা"/>
+<l:gentext key="tablenotes" text="টোকা"/>
+<l:gentext key="TableofContents" text="বিষয় সূচী"/>
+<l:gentext key="tableofcontents" text="বিষয় সূচী"/>
+<l:gentext key="unexpectedelementname" text="অপà§à§°à¦¤à§à¦¯à¦¾à¦¶à¦¿à¦¤ পদাৰà§à¦¥à§° নাম"/>
+<l:gentext key="unsupported" text="অসমৰà§à¦¥à¦¿à¦¤"/>
+<l:gentext key="xrefto" text="xref to"/>
+<l:gentext key="Authors" text="লিখকসমূহ"/>
+<l:gentext key="copyeditor" text="নকলৰ সমà§à¦ªà¦¾à¦¦à¦•"/>
+<l:gentext key="graphicdesigner" text="আলেখীৰ পৰিকলà§à¦ªà¦¨à¦¾à¦•à§°à§à¦¤à¦¾"/>
+<l:gentext key="productioneditor" text="উৎপাদন সমà§à¦ªà¦¾à¦¦à¦•"/>
+<l:gentext key="technicaleditor" text="কাৰিকৰী সমà§à¦ªà¦¾à¦¦à¦•"/>
+<l:gentext key="translator" text="অনà§à¦¬à¦¾à¦¦à¦•"/>
+<l:gentext key="listofequations" text="সমীকৰণৰ তালিকা"/>
+<l:gentext key="ListofEquations" text="সমীকৰণৰ তালিকা"/>
+<l:gentext key="ListofExamples" text="উদাহৰণৰ তালিকা"/>
+<l:gentext key="listofexamples" text="উদাহৰণৰ তালিকা"/>
+<l:gentext key="ListofFigures" text="ছবিৰ তালিকা"/>
+<l:gentext key="listoffigures" text="ছবিৰ তালিকা"/>
+<l:gentext key="ListofProcedures" text="পà§à§°à¦•à§à§°à¦¿à§Ÿà¦¾à§° তালিকা"/>
+<l:gentext key="listofprocedures" text="পà§à§°à¦•à§à§°à¦¿à§Ÿà¦¾à§° তালিকা"/>
+<l:gentext key="listoftables" text="টেবà§à¦²à§° তালিকা"/>
+<l:gentext key="ListofTables" text="টেবà§à¦²à§° তালিকা"/>
+<l:gentext key="ListofUnknown" text="অজà§à¦žà¦¾à¦¤à§° তালিকা"/>
+<l:gentext key="listofunknown" text="অজà§à¦žà¦¾à¦¤à§° তালিকা"/>
+<l:gentext key="nav-home" text="আৰমà§à¦­"/>
+<l:gentext key="nav-next" text="পিছলৈ"/>
+<l:gentext key="nav-next-sibling" text="দà§à§°à§à¦¤à¦—তিৰে আগবাà§à¦•"/>
+<l:gentext key="nav-prev" text="আগৰ"/>
+<l:gentext key="nav-prev-sibling" text="দà§à§°à§à¦¤à¦—তিৰে পিছলৈ যাওক"/>
+<l:gentext key="nav-up" text="ওপৰলৈ"/>
+<l:gentext key="nav-toc" text="বিষয়বসà§à¦¤à§à§° তালিকা"/>
+<l:gentext key="Draft" text="ৰূপৰেখা"/>
+<l:gentext key="above" text="ওপৰত"/>
+<l:gentext key="below" text="তলত"/>
+<l:gentext key="sectioncalled" text="মাতি অনা বিভাগ"/>
+<l:gentext key="index symbols" text="চিহà§à¦¨"/>
+<l:gentext key="writing-mode" text="lr-tb"/>
+<l:gentext key="lowercase.alpha" text="abcdefghijklmnopqrstuvwxyz" lang="en"/>
+<l:gentext key="uppercase.alpha" text="ABCDEFGHIJKLMNOPQRSTUVWXYZ" lang="en"/>
+<l:gentext key="normalize.sort.input" text="AaÀàÃáÂâÃãÄäÅåĀÄĂ㥹ÇǎǞǟǠǡǺǻȀÈȂȃȦȧḀá¸áºšáº áº¡áº¢áº£áº¤áº¥áº¦áº§áº¨áº©áºªáº«áº¬áº­áº®áº¯áº°áº±áº²áº³áº´áºµáº¶áº·BbÆ€ÆɓƂƃḂḃḄḅḆḇCcÇçĆćĈĉĊċČÄƇƈɕḈḉDdÄŽÄÄđƊɗƋƌDžDzȡɖḊḋḌá¸á¸Žá¸á¸á¸‘ḒḓEeÈèÉéÊêËëĒēĔĕĖėĘęĚěȄȅȆȇȨȩḔḕḖḗḘḙḚḛḜá¸áº¸áº¹áººáº»áº¼áº½áº¾áº¿á»€á»á»‚ểỄễỆệFfƑƒḞḟGgÄœÄĞğĠġĢģƓɠǤǥǦǧǴǵḠḡHhĤĥĦħȞȟɦḢḣḤḥḦḧḨḩḪḫẖIiÌìÃíÎîÃïĨĩĪīĬĭĮįİƗɨÇÇȈȉȊȋḬḭḮḯỈỉỊịJjĴĵǰÊKkĶķƘƙǨǩḰḱḲḳḴḵLlĹĺĻļĽľĿŀÅłƚLjȴɫɬɭḶḷḸḹḺḻḼḽMmɱḾḿṀá¹á¹‚ṃNnÑñŃńŅņŇňÆɲƞȠNjǸǹȵɳṄṅṆṇṈṉṊṋOoÒòÓóÔôÕõÖöØøŌÅÅŽÅÅőƟƠơǑǒǪǫǬǭǾǿȌÈÈŽÈȪȫȬȭȮȯȰȱṌá¹á¹Žá¹á¹á¹‘ṒṓỌá»á»Žá»á»á»‘ỒồỔổỖỗỘộỚớỜá»á»žá»Ÿá» á»¡á»¢á»£PpƤƥṔṕṖṗQqÊ RrŔŕŖŗŘřÈȑȒȓɼɽɾṘṙṚṛṜá¹á¹žá¹ŸSsŚśŜÅŞşŠšȘșʂṠṡṢṣṤṥṦṧṨṩTtŢţŤťŦŧƫƬƭƮʈȚțȶṪṫṬṭṮṯṰṱẗUuÙùÚúÛûÜüŨũŪūŬŭŮůŰűŲųƯưǓǔǕǖǗǘǙǚǛǜȔȕȖȗṲṳṴṵṶṷṸṹṺṻỤụỦủỨứỪừỬửỮữỰựVvƲʋṼṽṾṿWwŴŵẀáºáº‚ẃẄẅẆẇẈẉẘXxẊẋẌáºYyÃýÿŸŶŷƳƴȲȳẎáºáº™á»²á»³á»´á»µá»¶á»·á»¸á»¹ZzŹźŻżŽžƵƶȤȥÊÊ‘áºáº‘ẒẓẔẕẕ" lang="en"/>
+<l:gentext key="normalize.sort.output" text="AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBCCCCCCCCCCCCCCCCCDDDDDDDDDDDDDDDDDDDDDDDDEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEFFFFFFGGGGGGGGGGGGGGGGGGGGHHHHHHHHHHHHHHHHHHHHIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIJJJJJJKKKKKKKKKKKKKKLLLLLLLLLLLLLLLLLLLLLLLLLLMMMMMMMMMNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOPPPPPPPPQQQRRRRRRRRRRRRRRRRRRRRRRRSSSSSSSSSSSSSSSSSSSSSSSTTTTTTTTTTTTTTTTTTTTTTTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUVVVVVVVVWWWWWWWWWWWWWWWXXXXXXYYYYYYYYYYYYYYYYYYYYYYYZZZZZZZZZZZZZZZZZZZZZ" lang="en"/>
+<l:dingbat key="startquote" text="“"/>
+<l:dingbat key="endquote" text="â€"/>
+<l:dingbat key="nestedstartquote" text="‘"/>
+<l:dingbat key="nestedendquote" text="’"/>
+<l:dingbat key="singlestartquote" text="‘"/>
+<l:dingbat key="singleendquote" text="’"/>
+<l:dingbat key="bullet" text="•"/>
+<l:gentext key="hyphenation-character" text="-"/>
+<l:gentext key="hyphenation-push-character-count" text="2"/>
+<l:gentext key="hyphenation-remain-character-count" text="2"/>
+<l:context name="styles"><l:template name="person-name" text="first-last"/>
+</l:context>
+<l:context name="title"><l:template name="abstract" text="%t"/>
+<l:template name="acknowledgements" text="%t"/>
+<l:template name="answer" text="%t"/>
+<l:template name="appendix" text="পৰিশিষà§à¦ŸÂ %n. %t"/>
+<l:template name="article" text="%t"/>
+<l:template name="authorblurb" text="%t"/>
+<l:template name="bibliodiv" text="%t"/>
+<l:template name="biblioentry" text="%t"/>
+<l:template name="bibliography" text="%t"/>
+<l:template name="bibliolist" text="%t"/>
+<l:template name="bibliomixed" text="%t"/>
+<l:template name="bibliomset" text="%t"/>
+<l:template name="biblioset" text="%t"/>
+<l:template name="blockquote" text="%t"/>
+<l:template name="book" text="%t"/>
+<l:template name="calloutlist" text="%t"/>
+<l:template name="caution" text="%t"/>
+<l:template name="chapter" text="অধà§à¦¯à¦¾à§ŸÂ %n. %t"/>
+<l:template name="colophon" text="%t"/>
+<l:template name="dedication" text="%t"/>
+<l:template name="equation" text="সমীকৰণ %n. %t"/>
+<l:template name="example" text="উদাহৰণ %n. %t"/>
+<l:template name="figure" text="ছবি %n. %t"/>
+<l:template name="foil" text="%t"/>
+<l:template name="foilgroup" text="%t"/>
+<l:template name="formalpara" text="%t"/>
+<l:template name="glossary" text="%t"/>
+<l:template name="glossdiv" text="%t"/>
+<l:template name="glosslist" text="%t"/>
+<l:template name="glossentry" text="%t"/>
+<l:template name="important" text="%t"/>
+<l:template name="index" text="%t"/>
+<l:template name="indexdiv" text="%t"/>
+<l:template name="itemizedlist" text="%t"/>
+<l:template name="legalnotice" text="%t"/>
+<l:template name="listitem" text=""/>
+<l:template name="lot" text="%t"/>
+<l:template name="msg" text="%t"/>
+<l:template name="msgexplan" text="%t"/>
+<l:template name="msgmain" text="%t"/>
+<l:template name="msgrel" text="%t"/>
+<l:template name="msgset" text="%t"/>
+<l:template name="msgsub" text="%t"/>
+<l:template name="note" text="%t"/>
+<l:template name="orderedlist" text="%t"/>
+<l:template name="part" text="অংশ %n. %t"/>
+<l:template name="partintro" text="%t"/>
+<l:template name="preface" text="%t"/>
+<l:template name="procedure" text="%t"/>
+<l:template name="procedure.formal" text="পà§à§°à¦•à§à§°à¦¿à§Ÿà¦¾Â %n. %t"/>
+<l:template name="productionset" text="%t"/>
+<l:template name="productionset.formal" text="উৎপাদন %n"/>
+<l:template name="qandadiv" text="%t"/>
+<l:template name="qandaentry" text="%t"/>
+<l:template name="qandaset" text="%t"/>
+<l:template name="question" text="%t"/>
+<l:template name="refentry" text="%t"/>
+<l:template name="reference" text="%t"/>
+<l:template name="refsection" text="%t"/>
+<l:template name="refsect1" text="%t"/>
+<l:template name="refsect2" text="%t"/>
+<l:template name="refsect3" text="%t"/>
+<l:template name="refsynopsisdiv" text="%t"/>
+<l:template name="refsynopsisdivinfo" text="%t"/>
+<l:template name="segmentedlist" text="%t"/>
+<l:template name="set" text="%t"/>
+<l:template name="setindex" text="%t"/>
+<l:template name="sidebar" text="%t"/>
+<l:template name="step" text="%t"/>
+<l:template name="table" text="তালিকা %n. %t"/>
+<l:template name="task" text="%t"/>
+<l:template name="tasksummary" text="%t"/>
+<l:template name="taskprerequisites" text="%t"/>
+<l:template name="taskrelated" text="%t"/>
+<l:template name="tip" text="%t"/>
+<l:template name="toc" text="%t"/>
+<l:template name="variablelist" text="%t"/>
+<l:template name="varlistentry" text=""/>
+<l:template name="warning" text="%t"/>
+</l:context>
+<l:context name="title-unnumbered"><l:template name="appendix" text="%t"/>
+<l:template name="article/appendix" text="%t"/>
+<l:template name="bridgehead" text="%t"/>
+<l:template name="chapter" text="%t"/>
+<l:template name="sect1" text="%t"/>
+<l:template name="sect2" text="%t"/>
+<l:template name="sect3" text="%t"/>
+<l:template name="sect4" text="%t"/>
+<l:template name="sect5" text="%t"/>
+<l:template name="section" text="%t"/>
+<l:template name="simplesect" text="%t"/>
+<l:template name="part" text="%t"/>
+</l:context>
+<l:context name="title-numbered"><l:template name="appendix" text="পৰিশিষà§à¦ŸÂ %n. %t"/>
+<l:template name="article/appendix" text="%n. %t"/>
+<l:template name="bridgehead" text="%n. %t"/>
+<l:template name="chapter" text="অধà§à¦¯à¦¾à§ŸÂ %n. %t"/>
+<l:template name="part" text="অংশ %n. %t"/>
+<l:template name="sect1" text="%n. %t"/>
+<l:template name="sect2" text="%n. %t"/>
+<l:template name="sect3" text="%n. %t"/>
+<l:template name="sect4" text="%n. %t"/>
+<l:template name="sect5" text="%n. %t"/>
+<l:template name="section" text="%n. %t"/>
+<l:template name="simplesect" text="%t"/>
+</l:context>
+<l:context name="subtitle"><l:template name="appendix" text="%s"/>
+<l:template name="acknowledgements" text="%s"/>
+<l:template name="article" text="%s"/>
+<l:template name="bibliodiv" text="%s"/>
+<l:template name="biblioentry" text="%s"/>
+<l:template name="bibliography" text="%s"/>
+<l:template name="bibliomixed" text="%s"/>
+<l:template name="bibliomset" text="%s"/>
+<l:template name="biblioset" text="%s"/>
+<l:template name="book" text="%s"/>
+<l:template name="chapter" text="%s"/>
+<l:template name="colophon" text="%s"/>
+<l:template name="dedication" text="%s"/>
+<l:template name="glossary" text="%s"/>
+<l:template name="glossdiv" text="%s"/>
+<l:template name="index" text="%s"/>
+<l:template name="indexdiv" text="%s"/>
+<l:template name="lot" text="%s"/>
+<l:template name="part" text="%s"/>
+<l:template name="partintro" text="%s"/>
+<l:template name="preface" text="%s"/>
+<l:template name="refentry" text="%s"/>
+<l:template name="reference" text="%s"/>
+<l:template name="refsection" text="%s"/>
+<l:template name="refsect1" text="%s"/>
+<l:template name="refsect2" text="%s"/>
+<l:template name="refsect3" text="%s"/>
+<l:template name="refsynopsisdiv" text="%s"/>
+<l:template name="sect1" text="%s"/>
+<l:template name="sect2" text="%s"/>
+<l:template name="sect3" text="%s"/>
+<l:template name="sect4" text="%s"/>
+<l:template name="sect5" text="%s"/>
+<l:template name="section" text="%s"/>
+<l:template name="set" text="%s"/>
+<l:template name="setindex" text="%s"/>
+<l:template name="sidebar" text="%s"/>
+<l:template name="simplesect" text="%s"/>
+<l:template name="toc" text="%s"/>
+</l:context>
+<l:context name="xref"><l:template name="abstract" text="%t"/>
+<l:template name="acknowledgements" text="%t"/>
+<l:template name="answer" text="উ: %n"/>
+<l:template name="appendix" text="%t"/>
+<l:template name="article" text="%t"/>
+<l:template name="authorblurb" text="%t"/>
+<l:template name="bibliodiv" text="%t"/>
+<l:template name="bibliography" text="%t"/>
+<l:template name="bibliomset" text="%t"/>
+<l:template name="biblioset" text="%t"/>
+<l:template name="blockquote" text="%t"/>
+<l:template name="book" text="%t"/>
+<l:template name="calloutlist" text="%t"/>
+<l:template name="caution" text="%t"/>
+<l:template name="chapter" text="%t"/>
+<l:template name="colophon" text="%t"/>
+<l:template name="constraintdef" text="%t"/>
+<l:template name="dedication" text="%t"/>
+<l:template name="equation" text="%t"/>
+<l:template name="example" text="%t"/>
+<l:template name="figure" text="%t"/>
+<l:template name="foil" text="%t"/>
+<l:template name="foilgroup" text="%t"/>
+<l:template name="formalpara" text="%t"/>
+<l:template name="glossary" text="%t"/>
+<l:template name="glossdiv" text="%t"/>
+<l:template name="important" text="%t"/>
+<l:template name="index" text="%t"/>
+<l:template name="indexdiv" text="%t"/>
+<l:template name="itemizedlist" text="%t"/>
+<l:template name="legalnotice" text="%t"/>
+<l:template name="listitem" text="%n"/>
+<l:template name="lot" text="%t"/>
+<l:template name="msg" text="%t"/>
+<l:template name="msgexplan" text="%t"/>
+<l:template name="msgmain" text="%t"/>
+<l:template name="msgrel" text="%t"/>
+<l:template name="msgset" text="%t"/>
+<l:template name="msgsub" text="%t"/>
+<l:template name="note" text="%t"/>
+<l:template name="orderedlist" text="%t"/>
+<l:template name="part" text="%t"/>
+<l:template name="partintro" text="%t"/>
+<l:template name="preface" text="%t"/>
+<l:template name="procedure" text="%t"/>
+<l:template name="productionset" text="%t"/>
+<l:template name="qandadiv" text="%t"/>
+<l:template name="qandaentry" text="পà§à§°: %n"/>
+<l:template name="qandaset" text="%t"/>
+<l:template name="question" text="পà§à§°: %n"/>
+<l:template name="reference" text="%t"/>
+<l:template name="refsynopsisdiv" text="%t"/>
+<l:template name="segmentedlist" text="%t"/>
+<l:template name="set" text="%t"/>
+<l:template name="setindex" text="%t"/>
+<l:template name="sidebar" text="%t"/>
+<l:template name="table" text="%t"/>
+<l:template name="task" text="%t"/>
+<l:template name="tip" text="%t"/>
+<l:template name="toc" text="%t"/>
+<l:template name="variablelist" text="%t"/>
+<l:template name="varlistentry" text="%n"/>
+<l:template name="warning" text="%t"/>
+<l:template name="olink.document.citation" text=" in %o"/>
+<l:template name="olink.page.citation" text=" (page %p)"/>
+<l:template name="page.citation" text=" [%p]"/>
+<l:template name="page" text="(page %p)"/>
+<l:template name="docname" text=" in %o"/>
+<l:template name="docnamelong" text=" in the document titled %o"/>
+<l:template name="pageabbrev" text="(p. %p)"/>
+<l:template name="Page" text="Page %p"/>
+<l:template name="bridgehead" text="মাতি অনা বিভাগ “%tâ€"/>
+<l:template name="refsection" text="মাতি অনা বিভাগ “%tâ€"/>
+<l:template name="refsect1" text="মাতি অনা বিভাগ “%tâ€"/>
+<l:template name="refsect2" text="মাতি অনা বিভাগ “%tâ€"/>
+<l:template name="refsect3" text="মাতি অনা বিভাগ “%tâ€"/>
+<l:template name="sect1" text="মাতি অনা বিভাগ “%tâ€"/>
+<l:template name="sect2" text="মাতি অনা বিভাগ “%tâ€"/>
+<l:template name="sect3" text="মাতি অনা বিভাগ “%tâ€"/>
+<l:template name="sect4" text="মাতি অনা বিভাগ “%tâ€"/>
+<l:template name="sect5" text="মাতি অনা বিভাগ “%tâ€"/>
+<l:template name="section" text="মাতি অনা বিভাগ “%tâ€"/>
+<l:template name="simplesect" text="মাতি অনা বিভাগ “%tâ€"/>
+</l:context>
+<l:context name="xref-number"><l:template name="answer" text="উ: %n"/>
+<l:template name="appendix" text="পৰিশিষà§à¦ŸÂ %n"/>
+<l:template name="bridgehead" text="বিভাগ %n"/>
+<l:template name="chapter" text="অধà§à¦¯à¦¾à§ŸÂ %n"/>
+<l:template name="equation" text="সমীকৰণ %n"/>
+<l:template name="example" text="উদাহৰণ %n"/>
+<l:template name="figure" text="ছবি %n"/>
+<l:template name="part" text="অংশ %n"/>
+<l:template name="procedure" text="পà§à§°à¦•à§à§°à¦¿à§Ÿà¦¾Â %n"/>
+<l:template name="productionset" text="উৎপাদন %n"/>
+<l:template name="qandadiv" text="পà§à§°à¦¶à§à¦¨ &amp; উতà§à¦¤à§°Â %n"/>
+<l:template name="qandaentry" text="পà§à§°: %n"/>
+<l:template name="question" text="পà§à§°: %n"/>
+<l:template name="sect1" text="বিভাগ %n"/>
+<l:template name="sect2" text="বিভাগ %n"/>
+<l:template name="sect3" text="বিভাগ %n"/>
+<l:template name="sect4" text="বিভাগ %n"/>
+<l:template name="sect5" text="বিভাগ %n"/>
+<l:template name="section" text="বিভাগ %n"/>
+<l:template name="table" text="তালিকা %n"/>
+</l:context>
+<l:context name="xref-number-and-title"><l:template name="appendix" text="পৰিশিষà§à¦ŸÂ %n, %t"/>
+<l:template name="bridgehead" text="বিভাগ %n, “%tâ€"/>
+<l:template name="chapter" text="অধà§à¦¯à¦¾à§ŸÂ %n, %t"/>
+<l:template name="equation" text="সমীকৰণ %n, “%tâ€"/>
+<l:template name="example" text="উদাহৰণ %n, “%tâ€"/>
+<l:template name="figure" text="ছবি %n, “%tâ€"/>
+<l:template name="part" text="অংশ %n, “%tâ€"/>
+<l:template name="procedure" text="পà§à§°à¦•à§à§°à¦¿à§Ÿà¦¾Â %n, “%tâ€"/>
+<l:template name="productionset" text="উৎপাদন %n, “%tâ€"/>
+<l:template name="qandadiv" text="পà§à§°à¦¶à§à¦¨ &amp; উতà§à¦¤à§°Â %n, “%tâ€"/>
+<l:template name="refsect1" text="মাতি অনা বিভাগ “%tâ€"/>
+<l:template name="refsect2" text="মাতি অনা বিভাগ “%tâ€"/>
+<l:template name="refsect3" text="মাতি অনা বিভাগ “%tâ€"/>
+<l:template name="refsection" text="মাতি অনা বিভাগ “%tâ€"/>
+<l:template name="sect1" text="বিভাগ %n, “%tâ€"/>
+<l:template name="sect2" text="বিভাগ %n, “%tâ€"/>
+<l:template name="sect3" text="বিভাগ %n, “%tâ€"/>
+<l:template name="sect4" text="বিভাগ %n, “%tâ€"/>
+<l:template name="sect5" text="বিভাগ %n, “%tâ€"/>
+<l:template name="section" text="বিভাগ %n, “%tâ€"/>
+<l:template name="simplesect" text="মাতি অনা বিভাগ “%tâ€"/>
+<l:template name="table" text="তালিকা %n, “%tâ€"/>
+</l:context>
+<l:context name="authorgroup"><l:template name="sep" text=", "/>
+<l:template name="sep2" text=" আৰৠ"/>
+<l:template name="seplast" text=", আৰৠ"/>
+</l:context>
+<l:context name="glossary"><l:template name="see" text="চাওক %t."/>
+<l:template name="seealso" text="ইয়াকো চাওক %t."/>
+<l:template name="seealso-separator" text=", "/>
+</l:context>
+<l:context name="msgset"><l:template name="MsgAud" text="শà§à§°à§‹à¦¤à¦¾: "/>
+<l:template name="MsgLevel" text="সà§à¦¤à§°: "/>
+<l:template name="MsgOrig" text="উৎস: "/>
+</l:context>
+<l:context name="datetime"><l:template name="format" text="m/d/Y"/>
+</l:context>
+<l:context name="termdef"><l:template name="prefix" text="[Definition: "/>
+<l:template name="suffix" text="]"/>
+</l:context>
+<l:context name="datetime-full"><l:template name="January" text="জানà§à§±à¦¾à§°à§€"/>
+<l:template name="February" text="ফেবà§à§°à§à§±à¦¾à§°à§€"/>
+<l:template name="March" text="মাৰà§à¦š"/>
+<l:template name="April" text="à¦à¦ªà§à§°à¦¿à¦²"/>
+<l:template name="May" text="মে'"/>
+<l:template name="June" text="জà§à¦¨"/>
+<l:template name="July" text="জà§à¦²à¦¾à¦‡"/>
+<l:template name="August" text="আগষà§à¦Ÿ"/>
+<l:template name="September" text="চেপà§à¦Ÿà§‡à¦®à§à¦¬à§°"/>
+<l:template name="October" text="অকà§à¦Ÿà§‹à¦¬à§°"/>
+<l:template name="November" text="নৱেমà§à¦¬à§°"/>
+<l:template name="December" text="ডিচেমà§à¦¬à§°"/>
+<l:template name="Monday" text="সোমবাৰ"/>
+<l:template name="Tuesday" text="মঙà§à¦—লবাৰ"/>
+<l:template name="Wednesday" text="বà§à¦§à¦¬à¦¾à§°"/>
+<l:template name="Thursday" text="বৃহসà§à¦ªà¦¤à¦¿à¦¬à¦¾à§°"/>
+<l:template name="Friday" text="শà§à¦•à§à§°à¦¬à¦¾à§°"/>
+<l:template name="Saturday" text="শনিবাৰ"/>
+<l:template name="Sunday" text="দেওবাৰ"/>
+</l:context>
+<l:context name="datetime-abbrev"><l:template name="Jan" text="জানà§à§±à¦¾à§°à§€"/>
+<l:template name="Feb" text="ফেবà§à§°à§à§±à¦¾à§°à§€"/>
+<l:template name="Mar" text="মাৰà§à¦š"/>
+<l:template name="Apr" text="à¦à¦ªà§à§°à¦¿à¦²"/>
+<l:template name="May" text="মে'"/>
+<l:template name="Jun" text="জà§à¦¨"/>
+<l:template name="Jul" text="জà§à¦²à¦¾à¦‡"/>
+<l:template name="Aug" text="আগষà§à¦Ÿ"/>
+<l:template name="Sep" text="চেপà§à¦Ÿà§‡à¦®à§à¦¬à§°"/>
+<l:template name="Oct" text="অকà§à¦Ÿà§‹à¦¬à§°"/>
+<l:template name="Nov" text="নৱেমà§à¦¬à§°"/>
+<l:template name="Dec" text="ডিচেমà§à¦¬à§°"/>
+<l:template name="Mon" text="সোম"/>
+<l:template name="Tue" text="মঙà§à¦—ল"/>
+<l:template name="Wed" text="বà§à¦§"/>
+<l:template name="Thu" text="বৃহসà§à¦ªà¦¤à¦¿"/>
+<l:template name="Fri" text="শà§à¦•à§à§°"/>
+<l:template name="Sat" text="শনি"/>
+<l:template name="Sun" text="দেও"/>
+</l:context>
+<l:context name="htmlhelp"><l:template name="langcode" text="0x044d Assamese"/>
+</l:context>
+<l:context name="index"><l:template name="term-separator" text=", "/>
+<l:template name="number-separator" text=", "/>
+<l:template name="range-separator" text="-"/>
+</l:context>
+<l:context name="iso690"><l:template name="lastfirst.sep" text=", "/>
+<l:template name="alt.person.two.sep" text=" – "/>
+<l:template name="alt.person.last.sep" text=" – "/>
+<l:template name="alt.person.more.sep" text=" – "/>
+<l:template name="primary.editor" text=" (ed.)"/>
+<l:template name="primary.many" text=", et al."/>
+<l:template name="primary.sep" text=". "/>
+<l:template name="submaintitle.sep" text=": "/>
+<l:template name="title.sep" text=". "/>
+<l:template name="othertitle.sep" text=", "/>
+<l:template name="medium1" text=" ["/>
+<l:template name="medium2" text="]"/>
+<l:template name="secondary.person.sep" text="; "/>
+<l:template name="secondary.sep" text=". "/>
+<l:template name="respons.sep" text=". "/>
+<l:template name="edition.sep" text=". "/>
+<l:template name="edition.serial.sep" text=", "/>
+<l:template name="issuing.range" text="-"/>
+<l:template name="issuing.div" text=", "/>
+<l:template name="issuing.sep" text=". "/>
+<l:template name="partnr.sep" text=". "/>
+<l:template name="placepubl.sep" text=": "/>
+<l:template name="publyear.sep" text=", "/>
+<l:template name="pubinfo.sep" text=". "/>
+<l:template name="spec.pubinfo.sep" text=", "/>
+<l:template name="upd.sep" text=", "/>
+<l:template name="datecit1" text=" [cited "/>
+<l:template name="datecit2" text="]"/>
+<l:template name="extent.sep" text=". "/>
+<l:template name="locs.sep" text=", "/>
+<l:template name="location.sep" text=". "/>
+<l:template name="serie.sep" text=". "/>
+<l:template name="notice.sep" text=". "/>
+<l:template name="access" text="Available "/>
+<l:template name="acctoo" text="Also available "/>
+<l:template name="onwww" text="from World Wide Web"/>
+<l:template name="oninet" text="from Internet"/>
+<l:template name="access.end" text=": "/>
+<l:template name="link1" text="&lt;"/>
+<l:template name="link2" text="&gt;"/>
+<l:template name="access.sep" text=". "/>
+<l:template name="isbn" text="ISBN "/>
+<l:template name="issn" text="ISSN "/>
+<l:template name="stdnum.sep" text=". "/>
+<l:template name="patcountry.sep" text=". "/>
+<l:template name="pattype.sep" text=", "/>
+<l:template name="patnum.sep" text=". "/>
+<l:template name="patdate.sep" text=". "/>
+</l:context><l:letters><l:l i="-1"/>
+<l:l i="0">চিহà§à¦¨</l:l>
+<l:l i="10">A</l:l>
+<l:l i="10">a</l:l>
+<l:l i="20">B</l:l>
+<l:l i="20">b</l:l>
+<l:l i="30">C</l:l>
+<l:l i="30">c</l:l>
+<l:l i="40">D</l:l>
+<l:l i="40">d</l:l>
+<l:l i="50">E</l:l>
+<l:l i="50">e</l:l>
+<l:l i="60">F</l:l>
+<l:l i="60">f</l:l>
+<l:l i="70">G</l:l>
+<l:l i="70">g</l:l>
+<l:l i="80">H</l:l>
+<l:l i="80">h</l:l>
+<l:l i="90">I</l:l>
+<l:l i="90">i</l:l>
+<l:l i="100">J</l:l>
+<l:l i="100">j</l:l>
+<l:l i="110">K</l:l>
+<l:l i="110">k</l:l>
+<l:l i="120">L</l:l>
+<l:l i="120">l</l:l>
+<l:l i="130">M</l:l>
+<l:l i="130">m</l:l>
+<l:l i="140">N</l:l>
+<l:l i="140">n</l:l>
+<l:l i="150">O</l:l>
+<l:l i="150">o</l:l>
+<l:l i="160">P</l:l>
+<l:l i="160">p</l:l>
+<l:l i="170">Q</l:l>
+<l:l i="170">q</l:l>
+<l:l i="180">R</l:l>
+<l:l i="180">r</l:l>
+<l:l i="190">S</l:l>
+<l:l i="190">s</l:l>
+<l:l i="200">T</l:l>
+<l:l i="200">t</l:l>
+<l:l i="210">U</l:l>
+<l:l i="210">u</l:l>
+<l:l i="220">V</l:l>
+<l:l i="220">v</l:l>
+<l:l i="230">W</l:l>
+<l:l i="230">w</l:l>
+<l:l i="240">X</l:l>
+<l:l i="240">x</l:l>
+<l:l i="250">Y</l:l>
+<l:l i="250">y</l:l>
+<l:l i="260">Z</l:l>
+<l:l i="260">z</l:l>
+</l:letters>
+</l:l10n>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/ast.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/ast.xml
new file mode 100644
index 0000000..26a8e18
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/ast.xml
@@ -0,0 +1,660 @@
+<?xml version="1.0" encoding="utf-8"?>
+<l:l10n xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0" language="ast" english-language-name="Asturian">
+
+<!-- * This file is generated automatically. -->
+<!-- * To submit changes to this file upstream (to the DocBook Project) -->
+<!-- * do not submit an edited version of this file. Instead, submit an -->
+<!-- * edited version of the source file at the following location: -->
+<!-- * -->
+<!-- * https://docbook.svn.sourceforge.net/svnroot/docbook/trunk/gentext/locale/ast.xml -->
+<!-- * -->
+<!-- * E-mail the edited ast.xml source file to: -->
+<!-- * -->
+<!-- * docbook-developers@lists.sourceforge.net -->
+
+<!-- ******************************************************************** -->
+
+<!-- This file is part of the XSL DocBook Stylesheet distribution. -->
+<!-- See ../README or http://docbook.sf.net/release/xsl/current/ for -->
+<!-- copyright and other information. -->
+
+<!-- ******************************************************************** -->
+<!-- In these files, % with a letter is used for a placeholder: -->
+<!-- %t is the current element's title -->
+<!-- %s is the current element's subtitle (if applicable)-->
+<!-- %n is the current element's number label-->
+<!-- %p is the current element's page number (if applicable)-->
+<!-- ******************************************************************** -->
+
+
+<l:gentext key="Abstract" text="Abstrautu"/>
+<l:gentext key="abstract" text="abstrautu"/>
+<l:gentext key="Acknowledgements" text="Gracies fonderes"/>
+<l:gentext key="acknowledgements" text="gracies fonderes"/>
+<l:gentext key="Answer" text="R:"/>
+<l:gentext key="answer" text="r:"/>
+<l:gentext key="Appendix" text="Apéndiz"/>
+<l:gentext key="appendix" text="apéndiz"/>
+<l:gentext key="Article" text="Artículu"/>
+<l:gentext key="article" text="artículu"/>
+<l:gentext key="Author" text="Autor"/>
+<l:gentext key="Bibliography" text="Bibliografía"/>
+<l:gentext key="bibliography" text="bibliografía"/>
+<l:gentext key="Book" text="Llibru"/>
+<l:gentext key="book" text="llibru"/>
+<l:gentext key="CAUTION" text="PRECAUCIÓN"/>
+<l:gentext key="Caution" text="Precaución"/>
+<l:gentext key="caution" text="precaución"/>
+<l:gentext key="Chapter" text="Capítulu"/>
+<l:gentext key="chapter" text="capítulu"/>
+<l:gentext key="Colophon" text="Colofón"/>
+<l:gentext key="colophon" text="colofón"/>
+<l:gentext key="Copyright" text="Copyright"/>
+<l:gentext key="copyright" text="copyright"/>
+<l:gentext key="Dedication" text="Dedicáu"/>
+<l:gentext key="dedication" text="dedicáu"/>
+<l:gentext key="Edition" text="Edición"/>
+<l:gentext key="edition" text="edición"/>
+<l:gentext key="Editor" text="Editor"/>
+<l:gentext key="Equation" text="Ecuación"/>
+<l:gentext key="equation" text="ecuación"/>
+<l:gentext key="Example" text="Exemplu"/>
+<l:gentext key="example" text="exemplu"/>
+<l:gentext key="Figure" text="Figura"/>
+<l:gentext key="figure" text="figura"/>
+<l:gentext key="Glossary" text="Glosariu"/>
+<l:gentext key="glossary" text="glosariu"/>
+<l:gentext key="GlossSee" text="Ver"/>
+<l:gentext key="glosssee" text="ver"/>
+<l:gentext key="GlossSeeAlso" text="Ver Tamién"/>
+<l:gentext key="glossseealso" text="ver tamién"/>
+<l:gentext key="IMPORTANT" text="IMPORTANTE"/>
+<l:gentext key="important" text="Importante"/>
+<l:gentext key="Important" text="Importante"/>
+<l:gentext key="Index" text="Ãndiz"/>
+<l:gentext key="index" text="índiz"/>
+<l:gentext key="ISBN" text="ISBN"/>
+<l:gentext key="isbn" text="ISBN"/>
+<l:gentext key="LegalNotice" text="Noticia Llegal"/>
+<l:gentext key="legalnotice" text="noticia llegal"/>
+<l:gentext key="MsgAud" text="Audiencia"/>
+<l:gentext key="msgaud" text="Audiencia"/>
+<l:gentext key="MsgLevel" text="Nivel"/>
+<l:gentext key="msglevel" text="nivel"/>
+<l:gentext key="MsgOrig" text="Orixe"/>
+<l:gentext key="msgorig" text="Orixe"/>
+<l:gentext key="NOTE" text="NOTA"/>
+<l:gentext key="Note" text="Nota"/>
+<l:gentext key="note" text="nota"/>
+<l:gentext key="Part" text="Parte"/>
+<l:gentext key="part" text="parte"/>
+<l:gentext key="Preface" text="Prefaciu"/>
+<l:gentext key="preface" text="Prefaciu"/>
+<l:gentext key="Procedure" text="Procedimientu"/>
+<l:gentext key="procedure" text="procedimientu"/>
+<l:gentext key="ProductionSet" text="Producción"/>
+<l:gentext key="PubDate" text="Data d'Espublización"/>
+<l:gentext key="pubdate" text="data d'espublización"/>
+<l:gentext key="Published" text="Espublizáu"/>
+<l:gentext key="published" text="espublizáu"/>
+<l:gentext key="Publisher" text="Publisher"/>
+<l:gentext key="Qandadiv" text="E &amp; R"/>
+<l:gentext key="qandadiv" text="e &amp; r"/>
+<l:gentext key="QandASet" text="Entrugues más frecuentes"/>
+<l:gentext key="Question" text="E:"/>
+<l:gentext key="question" text="e:"/>
+<l:gentext key="RefEntry" text="Páxina"/>
+<l:gentext key="refentry" text="páxina"/>
+<l:gentext key="Reference" text="Referencia"/>
+<l:gentext key="reference" text="Referencia"/>
+<l:gentext key="References" text="Referencies"/>
+<l:gentext key="RefName" text="Nome"/>
+<l:gentext key="refname" text="nome"/>
+<l:gentext key="RefSection" text="Seición"/>
+<l:gentext key="refsection" text="seición"/>
+<l:gentext key="RefSynopsisDiv" text="Sinopsis"/>
+<l:gentext key="refsynopsisdiv" text="sinopsis"/>
+<l:gentext key="RevHistory" text="Revision History"/>
+<l:gentext key="revhistory" text="Revision History"/>
+<l:gentext key="revision" text="revisión hestorial"/>
+<l:gentext key="Revision" text="Revisión Hestorial"/>
+<l:gentext key="sect1" text="Seición"/>
+<l:gentext key="sect2" text="Seición"/>
+<l:gentext key="sect3" text="Seición"/>
+<l:gentext key="sect4" text="Seición"/>
+<l:gentext key="sect5" text="Seición"/>
+<l:gentext key="section" text="seición"/>
+<l:gentext key="Section" text="Seición"/>
+<l:gentext key="see" text="ver"/>
+<l:gentext key="See" text="Ver"/>
+<l:gentext key="seealso" text="ver tamién"/>
+<l:gentext key="Seealso" text="Ver tamién"/>
+<l:gentext key="SeeAlso" text="Ver Tamién"/>
+<l:gentext key="set" text="conxuntu"/>
+<l:gentext key="Set" text="Conxuntu"/>
+<l:gentext key="setindex" text="índiz del conxuntu"/>
+<l:gentext key="SetIndex" text="Ãndiz del Conxuntu"/>
+<l:gentext key="Sidebar" text="Panel llateral"/>
+<l:gentext key="sidebar" text="panel llateral"/>
+<l:gentext key="step" text="pasu"/>
+<l:gentext key="Step" text="Pasu"/>
+<l:gentext key="table" text="tabla"/>
+<l:gentext key="Table" text="Tabla"/>
+<l:gentext key="task" text="xera"/>
+<l:gentext key="Task" text="Xera"/>
+<l:gentext key="tip" text="trucu"/>
+<l:gentext key="TIP" text="TRUCU"/>
+<l:gentext key="Tip" text="Trucu"/>
+<l:gentext key="Warning" text="Avisu"/>
+<l:gentext key="warning" text="avisu"/>
+<l:gentext key="WARNING" text="AVISU"/>
+<l:gentext key="and" text="y"/>
+<l:gentext key="by" text="por"/>
+<l:gentext key="Edited" text="Editáu"/>
+<l:gentext key="edited" text="editáu"/>
+<l:gentext key="Editedby" text="Editáu por"/>
+<l:gentext key="editedby" text="editáu por"/>
+<l:gentext key="in" text="en"/>
+<l:gentext key="lastlistcomma" text=","/>
+<l:gentext key="listcomma" text=","/>
+<l:gentext key="notes" text="notes"/>
+<l:gentext key="Notes" text="Notes"/>
+<l:gentext key="Pgs" text="Pxs."/>
+<l:gentext key="pgs" text="pxs."/>
+<l:gentext key="Revisedby" text="Revisáu por: "/>
+<l:gentext key="revisedby" text="revisáu por: "/>
+<l:gentext key="TableNotes" text="Notes"/>
+<l:gentext key="tablenotes" text="Notes"/>
+<l:gentext key="TableofContents" text="Tabla de Conteníos"/>
+<l:gentext key="tableofcontents" text="tabla de conteníos"/>
+<l:gentext key="unexpectedelementname" text="nome d'elementu inesperáu"/>
+<l:gentext key="unsupported" text="ensin sofitu"/>
+<l:gentext key="xrefto" text="xref a"/>
+<l:gentext key="Authors" text="Autores"/>
+<l:gentext key="copyeditor" text="Editor de copia"/>
+<l:gentext key="graphicdesigner" text="Diseñador Gráficu"/>
+<l:gentext key="productioneditor" text="Editor de Producción"/>
+<l:gentext key="technicaleditor" text="Editor téunicu"/>
+<l:gentext key="translator" text="Traductor"/>
+<l:gentext key="listofequations" text="llista d'ecuaciones"/>
+<l:gentext key="ListofEquations" text="Llista d'ecuaciones"/>
+<l:gentext key="ListofExamples" text="Llista d'Exemplos"/>
+<l:gentext key="listofexamples" text="llista d'Exemplos"/>
+<l:gentext key="ListofFigures" text="Llista de Figures"/>
+<l:gentext key="listoffigures" text="llista de Figures"/>
+<l:gentext key="ListofProcedures" text="Llista de Procedimientos"/>
+<l:gentext key="listofprocedures" text="llista de Procedimientos"/>
+<l:gentext key="listoftables" text="llista de Tables"/>
+<l:gentext key="ListofTables" text="Llista de Tables"/>
+<l:gentext key="ListofUnknown" text="Llista de Desconocíu"/>
+<l:gentext key="listofunknown" text="llista de Desconocíu"/>
+<l:gentext key="nav-home" text="Entamu"/>
+<l:gentext key="nav-next" text="Siguiente"/>
+<l:gentext key="nav-next-sibling" text="Rápidu Alantre"/>
+<l:gentext key="nav-prev" text="Previu"/>
+<l:gentext key="nav-prev-sibling" text="Rápidu Atrás"/>
+<l:gentext key="nav-up" text="Arriba"/>
+<l:gentext key="nav-toc" text="TdC"/>
+<l:gentext key="Draft" text="Borrador"/>
+<l:gentext key="above" text="enriba"/>
+<l:gentext key="below" text="baxo"/>
+<l:gentext key="sectioncalled" text="la seición denomada"/>
+<l:gentext key="index symbols" text="Símbolos"/>
+<l:gentext key="writing-mode" text="lr-tb"/>
+<l:gentext key="lowercase.alpha" text="abcdefghijklmnopqrstuvwxyz" lang="en"/>
+<l:gentext key="uppercase.alpha" text="ABCDEFGHIJKLMNOPQRSTUVWXYZ" lang="en"/>
+<l:gentext key="normalize.sort.input" text="AaÀàÃáÂâÃãÄäÅåĀÄĂ㥹ÇǎǞǟǠǡǺǻȀÈȂȃȦȧḀá¸áºšáº áº¡áº¢áº£áº¤áº¥áº¦áº§áº¨áº©áºªáº«áº¬áº­áº®áº¯áº°áº±áº²áº³áº´áºµáº¶áº·BbÆ€ÆɓƂƃḂḃḄḅḆḇCcÇçĆćĈĉĊċČÄƇƈɕḈḉDdÄŽÄÄđƊɗƋƌDžDzȡɖḊḋḌá¸á¸Žá¸á¸á¸‘ḒḓEeÈèÉéÊêËëĒēĔĕĖėĘęĚěȄȅȆȇȨȩḔḕḖḗḘḙḚḛḜá¸áº¸áº¹áººáº»áº¼áº½áº¾áº¿á»€á»á»‚ểỄễỆệFfƑƒḞḟGgÄœÄĞğĠġĢģƓɠǤǥǦǧǴǵḠḡHhĤĥĦħȞȟɦḢḣḤḥḦḧḨḩḪḫẖIiÌìÃíÎîÃïĨĩĪīĬĭĮįİƗɨÇÇȈȉȊȋḬḭḮḯỈỉỊịJjĴĵǰÊKkĶķƘƙǨǩḰḱḲḳḴḵLlĹĺĻļĽľĿŀÅłƚLjȴɫɬɭḶḷḸḹḺḻḼḽMmɱḾḿṀá¹á¹‚ṃNnÑñŃńŅņŇňÆɲƞȠNjǸǹȵɳṄṅṆṇṈṉṊṋOoÒòÓóÔôÕõÖöØøŌÅÅŽÅÅőƟƠơǑǒǪǫǬǭǾǿȌÈÈŽÈȪȫȬȭȮȯȰȱṌá¹á¹Žá¹á¹á¹‘ṒṓỌá»á»Žá»á»á»‘ỒồỔổỖỗỘộỚớỜá»á»žá»Ÿá» á»¡á»¢á»£PpƤƥṔṕṖṗQqÊ RrŔŕŖŗŘřÈȑȒȓɼɽɾṘṙṚṛṜá¹á¹žá¹ŸSsŚśŜÅŞşŠšȘșʂṠṡṢṣṤṥṦṧṨṩTtŢţŤťŦŧƫƬƭƮʈȚțȶṪṫṬṭṮṯṰṱẗUuÙùÚúÛûÜüŨũŪūŬŭŮůŰűŲųƯưǓǔǕǖǗǘǙǚǛǜȔȕȖȗṲṳṴṵṶṷṸṹṺṻỤụỦủỨứỪừỬửỮữỰựVvƲʋṼṽṾṿWwŴŵẀáºáº‚ẃẄẅẆẇẈẉẘXxẊẋẌáºYyÃýÿŸŶŷƳƴȲȳẎáºáº™á»²á»³á»´á»µá»¶á»·á»¸á»¹ZzŹźŻżŽžƵƶȤȥÊÊ‘áºáº‘ẒẓẔẕẕ" lang="en"/>
+<l:gentext key="normalize.sort.output" text="AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBCCCCCCCCCCCCCCCCCDDDDDDDDDDDDDDDDDDDDDDDDEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEFFFFFFGGGGGGGGGGGGGGGGGGGGHHHHHHHHHHHHHHHHHHHHIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIJJJJJJKKKKKKKKKKKKKKLLLLLLLLLLLLLLLLLLLLLLLLLLMMMMMMMMMNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOPPPPPPPPQQQRRRRRRRRRRRRRRRRRRRRRRRSSSSSSSSSSSSSSSSSSSSSSSTTTTTTTTTTTTTTTTTTTTTTTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUVVVVVVVVWWWWWWWWWWWWWWWXXXXXXYYYYYYYYYYYYYYYYYYYYYYYZZZZZZZZZZZZZZZZZZZZZ" lang="en"/>
+<l:dingbat key="startquote" text="“"/>
+<l:dingbat key="endquote" text="â€"/>
+<l:dingbat key="nestedstartquote" text="‘"/>
+<l:dingbat key="nestedendquote" text="’"/>
+<l:dingbat key="singlestartquote" text="‘"/>
+<l:dingbat key="singleendquote" text="’"/>
+<l:dingbat key="bullet" text="•"/>
+<l:gentext key="hyphenation-character" text="-"/>
+<l:gentext key="hyphenation-push-character-count" text="2"/>
+<l:gentext key="hyphenation-remain-character-count" text="2"/>
+<l:context name="styles"><l:template name="person-name" text="first-last"/>
+</l:context>
+<l:context name="title"><l:template name="abstract" text="%t"/>
+<l:template name="acknowledgements" text="%t"/>
+<l:template name="answer" text="%t"/>
+<l:template name="appendix" text="Apéndiz %n. %t"/>
+<l:template name="article" text="%t"/>
+<l:template name="authorblurb" text="%t"/>
+<l:template name="bibliodiv" text="%t"/>
+<l:template name="biblioentry" text="%t"/>
+<l:template name="bibliography" text="%t"/>
+<l:template name="bibliolist" text="%t"/>
+<l:template name="bibliomixed" text="%t"/>
+<l:template name="bibliomset" text="%t"/>
+<l:template name="biblioset" text="%t"/>
+<l:template name="blockquote" text="%t"/>
+<l:template name="book" text="%t"/>
+<l:template name="calloutlist" text="%t"/>
+<l:template name="caution" text="%t"/>
+<l:template name="chapter" text="Capítulu %n. %t"/>
+<l:template name="colophon" text="%t"/>
+<l:template name="dedication" text="%t"/>
+<l:template name="equation" text="Ecuación %n. %t"/>
+<l:template name="example" text="Exemplu %n. %t"/>
+<l:template name="figure" text="Figura %n. %t"/>
+<l:template name="foil" text="%t"/>
+<l:template name="foilgroup" text="%t"/>
+<l:template name="formalpara" text="%t"/>
+<l:template name="glossary" text="%t"/>
+<l:template name="glossdiv" text="%t"/>
+<l:template name="glosslist" text="%t"/>
+<l:template name="glossentry" text="%t"/>
+<l:template name="important" text="%t"/>
+<l:template name="index" text="%t"/>
+<l:template name="indexdiv" text="%t"/>
+<l:template name="itemizedlist" text="%t"/>
+<l:template name="legalnotice" text="%t"/>
+<l:template name="listitem" text=""/>
+<l:template name="lot" text="%t"/>
+<l:template name="msg" text="%t"/>
+<l:template name="msgexplan" text="%t"/>
+<l:template name="msgmain" text="%t"/>
+<l:template name="msgrel" text="%t"/>
+<l:template name="msgset" text="%t"/>
+<l:template name="msgsub" text="%t"/>
+<l:template name="note" text="%t"/>
+<l:template name="orderedlist" text="%t"/>
+<l:template name="part" text="Parte %n. %t"/>
+<l:template name="partintro" text="%t"/>
+<l:template name="preface" text="%t"/>
+<l:template name="procedure" text="%t"/>
+<l:template name="procedure.formal" text="Procedimientu %n. %t"/>
+<l:template name="productionset" text="%t"/>
+<l:template name="productionset.formal" text="Producción %n"/>
+<l:template name="qandadiv" text="%t"/>
+<l:template name="qandaentry" text="%t"/>
+<l:template name="qandaset" text="%t"/>
+<l:template name="question" text="%t"/>
+<l:template name="refentry" text="%t"/>
+<l:template name="reference" text="%t"/>
+<l:template name="refsection" text="%t"/>
+<l:template name="refsect1" text="%t"/>
+<l:template name="refsect2" text="%t"/>
+<l:template name="refsect3" text="%t"/>
+<l:template name="refsynopsisdiv" text="%t"/>
+<l:template name="refsynopsisdivinfo" text="%t"/>
+<l:template name="segmentedlist" text="%t"/>
+<l:template name="set" text="%t"/>
+<l:template name="setindex" text="%t"/>
+<l:template name="sidebar" text="%t"/>
+<l:template name="step" text="%t"/>
+<l:template name="table" text="Tabla %n. %t"/>
+<l:template name="task" text="%t"/>
+<l:template name="tasksummary" text="%t"/>
+<l:template name="taskprerequisites" text="%t"/>
+<l:template name="taskrelated" text="%t"/>
+<l:template name="tip" text="%t"/>
+<l:template name="toc" text="%t"/>
+<l:template name="variablelist" text="%t"/>
+<l:template name="varlistentry" text=""/>
+<l:template name="warning" text="%t"/>
+</l:context>
+<l:context name="title-unnumbered"><l:template name="appendix" text="%t"/>
+<l:template name="article/appendix" text="%t"/>
+<l:template name="bridgehead" text="%t"/>
+<l:template name="chapter" text="%t"/>
+<l:template name="sect1" text="%t"/>
+<l:template name="sect2" text="%t"/>
+<l:template name="sect3" text="%t"/>
+<l:template name="sect4" text="%t"/>
+<l:template name="sect5" text="%t"/>
+<l:template name="section" text="%t"/>
+<l:template name="simplesect" text="%t"/>
+<l:template name="part" text="%t"/>
+</l:context>
+<l:context name="title-numbered"><l:template name="appendix" text="Apéndiz %n. %t"/>
+<l:template name="article/appendix" text="%n. %t"/>
+<l:template name="bridgehead" text="%n. %t"/>
+<l:template name="chapter" text="Capítulu %n. %t"/>
+<l:template name="part" text="Parte %n. %t"/>
+<l:template name="sect1" text="%n. %t"/>
+<l:template name="sect2" text="%n. %t"/>
+<l:template name="sect3" text="%n. %t"/>
+<l:template name="sect4" text="%n. %t"/>
+<l:template name="sect5" text="%n. %t"/>
+<l:template name="section" text="%n. %t"/>
+<l:template name="simplesect" text="%t"/>
+</l:context>
+<l:context name="subtitle"><l:template name="appendix" text="%s"/>
+<l:template name="acknowledgements" text="%s"/>
+<l:template name="article" text="%s"/>
+<l:template name="bibliodiv" text="%s"/>
+<l:template name="biblioentry" text="%s"/>
+<l:template name="bibliography" text="%s"/>
+<l:template name="bibliomixed" text="%s"/>
+<l:template name="bibliomset" text="%s"/>
+<l:template name="biblioset" text="%s"/>
+<l:template name="book" text="%s"/>
+<l:template name="chapter" text="%s"/>
+<l:template name="colophon" text="%s"/>
+<l:template name="dedication" text="%s"/>
+<l:template name="glossary" text="%s"/>
+<l:template name="glossdiv" text="%s"/>
+<l:template name="index" text="%s"/>
+<l:template name="indexdiv" text="%s"/>
+<l:template name="lot" text="%s"/>
+<l:template name="part" text="%s"/>
+<l:template name="partintro" text="%s"/>
+<l:template name="preface" text="%s"/>
+<l:template name="refentry" text="%s"/>
+<l:template name="reference" text="%s"/>
+<l:template name="refsection" text="%s"/>
+<l:template name="refsect1" text="%s"/>
+<l:template name="refsect2" text="%s"/>
+<l:template name="refsect3" text="%s"/>
+<l:template name="refsynopsisdiv" text="%s"/>
+<l:template name="sect1" text="%s"/>
+<l:template name="sect2" text="%s"/>
+<l:template name="sect3" text="%s"/>
+<l:template name="sect4" text="%s"/>
+<l:template name="sect5" text="%s"/>
+<l:template name="section" text="%s"/>
+<l:template name="set" text="%s"/>
+<l:template name="setindex" text="%s"/>
+<l:template name="sidebar" text="%s"/>
+<l:template name="simplesect" text="%s"/>
+<l:template name="toc" text="%s"/>
+</l:context>
+<l:context name="xref"><l:template name="abstract" text="%t"/>
+<l:template name="acknowledgements" text="%t"/>
+<l:template name="answer" text="R: %n"/>
+<l:template name="appendix" text="%t"/>
+<l:template name="article" text="%t"/>
+<l:template name="authorblurb" text="%t"/>
+<l:template name="bibliodiv" text="%t"/>
+<l:template name="bibliography" text="%t"/>
+<l:template name="bibliomset" text="%t"/>
+<l:template name="biblioset" text="%t"/>
+<l:template name="blockquote" text="%t"/>
+<l:template name="book" text="%t"/>
+<l:template name="calloutlist" text="%t"/>
+<l:template name="caution" text="%t"/>
+<l:template name="chapter" text="%t"/>
+<l:template name="colophon" text="%t"/>
+<l:template name="constraintdef" text="%t"/>
+<l:template name="dedication" text="%t"/>
+<l:template name="equation" text="%t"/>
+<l:template name="example" text="%t"/>
+<l:template name="figure" text="%t"/>
+<l:template name="foil" text="%t"/>
+<l:template name="foilgroup" text="%t"/>
+<l:template name="formalpara" text="%t"/>
+<l:template name="glossary" text="%t"/>
+<l:template name="glossdiv" text="%t"/>
+<l:template name="important" text="%t"/>
+<l:template name="index" text="%t"/>
+<l:template name="indexdiv" text="%t"/>
+<l:template name="itemizedlist" text="%t"/>
+<l:template name="legalnotice" text="%t"/>
+<l:template name="listitem" text="%n"/>
+<l:template name="lot" text="%t"/>
+<l:template name="msg" text="%t"/>
+<l:template name="msgexplan" text="%t"/>
+<l:template name="msgmain" text="%t"/>
+<l:template name="msgrel" text="%t"/>
+<l:template name="msgset" text="%t"/>
+<l:template name="msgsub" text="%t"/>
+<l:template name="note" text="%t"/>
+<l:template name="orderedlist" text="%t"/>
+<l:template name="part" text="%t"/>
+<l:template name="partintro" text="%t"/>
+<l:template name="preface" text="%t"/>
+<l:template name="procedure" text="%t"/>
+<l:template name="productionset" text="%t"/>
+<l:template name="qandadiv" text="%t"/>
+<l:template name="qandaentry" text="E: %n"/>
+<l:template name="qandaset" text="%t"/>
+<l:template name="question" text="E: %n"/>
+<l:template name="reference" text="%t"/>
+<l:template name="refsynopsisdiv" text="%t"/>
+<l:template name="segmentedlist" text="%t"/>
+<l:template name="set" text="%t"/>
+<l:template name="setindex" text="%t"/>
+<l:template name="sidebar" text="%t"/>
+<l:template name="table" text="%t"/>
+<l:template name="task" text="%t"/>
+<l:template name="tip" text="%t"/>
+<l:template name="toc" text="%t"/>
+<l:template name="variablelist" text="%t"/>
+<l:template name="varlistentry" text="%n"/>
+<l:template name="warning" text="%t"/>
+<l:template name="olink.document.citation" text=" in %o"/>
+<l:template name="olink.page.citation" text=" (page %p)"/>
+<l:template name="page.citation" text=" [%p]"/>
+<l:template name="page" text="(page %p)"/>
+<l:template name="docname" text=" in %o"/>
+<l:template name="docnamelong" text=" in the document titled %o"/>
+<l:template name="pageabbrev" text="(p. %p)"/>
+<l:template name="Page" text="Page %p"/>
+<l:template name="bridgehead" text="la seición denomada “%tâ€"/>
+<l:template name="refsection" text="la seición denomada “%tâ€"/>
+<l:template name="refsect1" text="la seición denomada “%tâ€"/>
+<l:template name="refsect2" text="la seición denomada “%tâ€"/>
+<l:template name="refsect3" text="la seición denomada “%tâ€"/>
+<l:template name="sect1" text="la seición denomada “%tâ€"/>
+<l:template name="sect2" text="la seición denomada “%tâ€"/>
+<l:template name="sect3" text="la seición denomada “%tâ€"/>
+<l:template name="sect4" text="la seición denomada “%tâ€"/>
+<l:template name="sect5" text="la seición denomada “%tâ€"/>
+<l:template name="section" text="la seición denomada “%tâ€"/>
+<l:template name="simplesect" text="la seición denomada “%tâ€"/>
+</l:context>
+<l:context name="xref-number"><l:template name="answer" text="R: %n"/>
+<l:template name="appendix" text="Apéndiz %n"/>
+<l:template name="bridgehead" text="Seición %n"/>
+<l:template name="chapter" text="Capítulu %n"/>
+<l:template name="equation" text="Ecuación %n"/>
+<l:template name="example" text="Exemplu %n"/>
+<l:template name="figure" text="Figura %n"/>
+<l:template name="part" text="Parte %n"/>
+<l:template name="procedure" text="Procedimientu %n"/>
+<l:template name="productionset" text="Producción %n"/>
+<l:template name="qandadiv" text="E &amp; R %n"/>
+<l:template name="qandaentry" text="E: %n"/>
+<l:template name="question" text="E: %n"/>
+<l:template name="sect1" text="Seición %n"/>
+<l:template name="sect2" text="Seición %n"/>
+<l:template name="sect3" text="Seición %n"/>
+<l:template name="sect4" text="Seición %n"/>
+<l:template name="sect5" text="Seición %n"/>
+<l:template name="section" text="Seición %n"/>
+<l:template name="table" text="Tabla %n"/>
+</l:context>
+<l:context name="xref-number-and-title"><l:template name="appendix" text="Apéndiz %n, %t"/>
+<l:template name="bridgehead" text="Seición %n, “%tâ€"/>
+<l:template name="chapter" text="Capítulu %n, %t"/>
+<l:template name="equation" text="Ecuación %n, “%tâ€"/>
+<l:template name="example" text="Exemplu %n, “%tâ€"/>
+<l:template name="figure" text="Figura %n, “%tâ€"/>
+<l:template name="part" text="Parte %n, “%tâ€"/>
+<l:template name="procedure" text="Procedimientu %n, “%tâ€"/>
+<l:template name="productionset" text="Producción %n, “%tâ€"/>
+<l:template name="qandadiv" text="E &amp; R %n, “%tâ€"/>
+<l:template name="refsect1" text="la seición denomada “%tâ€"/>
+<l:template name="refsect2" text="la seición denomada “%tâ€"/>
+<l:template name="refsect3" text="la seición denomada “%tâ€"/>
+<l:template name="refsection" text="la seición denomada “%tâ€"/>
+<l:template name="sect1" text="Seición %n, “%tâ€"/>
+<l:template name="sect2" text="Seición %n, “%tâ€"/>
+<l:template name="sect3" text="Seición %n, “%tâ€"/>
+<l:template name="sect4" text="Seición %n, “%tâ€"/>
+<l:template name="sect5" text="Seición %n, “%tâ€"/>
+<l:template name="section" text="Seición %n, “%tâ€"/>
+<l:template name="simplesect" text="la seición denomada “%tâ€"/>
+<l:template name="table" text="Tabla %n, “%tâ€"/>
+</l:context>
+<l:context name="authorgroup"><l:template name="sep" text=", "/>
+<l:template name="sep2" text=" y "/>
+<l:template name="seplast" text=", y "/>
+</l:context>
+<l:context name="glossary"><l:template name="see" text="Ver %t."/>
+<l:template name="seealso" text="Ver Tamién %t."/>
+<l:template name="seealso-separator" text=", "/>
+</l:context>
+<l:context name="msgset"><l:template name="MsgAud" text="Audiencia: "/>
+<l:template name="MsgLevel" text="Nivel: "/>
+<l:template name="MsgOrig" text="Orixe: "/>
+</l:context>
+<l:context name="datetime"><l:template name="format" text="d/m/Y"/>
+</l:context>
+<l:context name="termdef"><l:template name="prefix" text="[Definition: "/>
+<l:template name="suffix" text="]"/>
+</l:context>
+<l:context name="datetime-full"><l:template name="January" text="Xineru"/>
+<l:template name="February" text="Febreru"/>
+<l:template name="March" text="Marzu"/>
+<l:template name="April" text="Abril"/>
+<l:template name="May" text="Mayu"/>
+<l:template name="June" text="Xunu"/>
+<l:template name="July" text="Xunetu"/>
+<l:template name="August" text="Agostu"/>
+<l:template name="September" text="Setiembre"/>
+<l:template name="October" text="Ochobre"/>
+<l:template name="November" text="Payares"/>
+<l:template name="December" text="Avientu"/>
+<l:template name="Monday" text="Llunes"/>
+<l:template name="Tuesday" text="Martes"/>
+<l:template name="Wednesday" text="Miércoles"/>
+<l:template name="Thursday" text="Xueves"/>
+<l:template name="Friday" text="Vienres"/>
+<l:template name="Saturday" text="Sábadu"/>
+<l:template name="Sunday" text="Domingu"/>
+</l:context>
+<l:context name="datetime-abbrev"><l:template name="Jan" text="Xin"/>
+<l:template name="Feb" text="Feb"/>
+<l:template name="Mar" text="Mar"/>
+<l:template name="Apr" text="Abr"/>
+<l:template name="May" text="May"/>
+<l:template name="Jun" text="Xun"/>
+<l:template name="Jul" text="Xnt"/>
+<l:template name="Aug" text="Ago"/>
+<l:template name="Sep" text="Set"/>
+<l:template name="Oct" text="Och"/>
+<l:template name="Nov" text="Pay"/>
+<l:template name="Dec" text="Avi"/>
+<l:template name="Mon" text="Llu"/>
+<l:template name="Tue" text="Mié"/>
+<l:template name="Wed" text="Wed"/>
+<l:template name="Thu" text="Xue"/>
+<l:template name="Fri" text="Vie"/>
+<l:template name="Sat" text="Sáb"/>
+<l:template name="Sun" text="Dom"/>
+</l:context>
+<l:context name="htmlhelp"><l:template name="langcode" text="0x0409 English (UNITED STATES)" lang="en"/>
+</l:context>
+<l:context name="index"><l:template name="term-separator" text=", "/>
+<l:template name="number-separator" text=", "/>
+<l:template name="range-separator" text="-"/>
+</l:context>
+<l:context name="iso690"><l:template name="lastfirst.sep" text=", "/>
+<l:template name="alt.person.two.sep" text=" – "/>
+<l:template name="alt.person.last.sep" text=" – "/>
+<l:template name="alt.person.more.sep" text=" – "/>
+<l:template name="primary.editor" text=" (ed.)"/>
+<l:template name="primary.many" text=", et al."/>
+<l:template name="primary.sep" text=". "/>
+<l:template name="submaintitle.sep" text=": "/>
+<l:template name="title.sep" text=". "/>
+<l:template name="othertitle.sep" text=", "/>
+<l:template name="medium1" text=" ["/>
+<l:template name="medium2" text="]"/>
+<l:template name="secondary.person.sep" text="; "/>
+<l:template name="secondary.sep" text=". "/>
+<l:template name="respons.sep" text=". "/>
+<l:template name="edition.sep" text=". "/>
+<l:template name="edition.serial.sep" text=", "/>
+<l:template name="issuing.range" text="-"/>
+<l:template name="issuing.div" text=", "/>
+<l:template name="issuing.sep" text=". "/>
+<l:template name="partnr.sep" text=". "/>
+<l:template name="placepubl.sep" text=": "/>
+<l:template name="publyear.sep" text=", "/>
+<l:template name="pubinfo.sep" text=". "/>
+<l:template name="spec.pubinfo.sep" text=", "/>
+<l:template name="upd.sep" text=", "/>
+<l:template name="datecit1" text=" [cited "/>
+<l:template name="datecit2" text="]"/>
+<l:template name="extent.sep" text=". "/>
+<l:template name="locs.sep" text=", "/>
+<l:template name="location.sep" text=". "/>
+<l:template name="serie.sep" text=". "/>
+<l:template name="notice.sep" text=". "/>
+<l:template name="access" text="Available "/>
+<l:template name="acctoo" text="Also available "/>
+<l:template name="onwww" text="from World Wide Web"/>
+<l:template name="oninet" text="from Internet"/>
+<l:template name="access.end" text=": "/>
+<l:template name="link1" text="&lt;"/>
+<l:template name="link2" text="&gt;"/>
+<l:template name="access.sep" text=". "/>
+<l:template name="isbn" text="ISBN "/>
+<l:template name="issn" text="ISSN "/>
+<l:template name="stdnum.sep" text=". "/>
+<l:template name="patcountry.sep" text=". "/>
+<l:template name="pattype.sep" text=", "/>
+<l:template name="patnum.sep" text=". "/>
+<l:template name="patdate.sep" text=". "/>
+</l:context><l:letters><l:l i="-1"/>
+<l:l i="0">Símbolos</l:l>
+<l:l i="10">A</l:l>
+<l:l i="10">a</l:l>
+<l:l i="20">B</l:l>
+<l:l i="20">b</l:l>
+<l:l i="30">C</l:l>
+<l:l i="30">c</l:l>
+<l:l i="40">D</l:l>
+<l:l i="40">d</l:l>
+<l:l i="50">E</l:l>
+<l:l i="50">e</l:l>
+<l:l i="60">F</l:l>
+<l:l i="60">f</l:l>
+<l:l i="70">G</l:l>
+<l:l i="70">g</l:l>
+<l:l i="80">H</l:l>
+<l:l i="80">h</l:l>
+<l:l i="90">I</l:l>
+<l:l i="90">i</l:l>
+<l:l i="100">J</l:l>
+<l:l i="100">j</l:l>
+<l:l i="110">K</l:l>
+<l:l i="110">k</l:l>
+<l:l i="120">L</l:l>
+<l:l i="120">l</l:l>
+<l:l i="130">M</l:l>
+<l:l i="130">m</l:l>
+<l:l i="140">N</l:l>
+<l:l i="140">n</l:l>
+<l:l i="150">O</l:l>
+<l:l i="150">o</l:l>
+<l:l i="160">P</l:l>
+<l:l i="160">p</l:l>
+<l:l i="170">Q</l:l>
+<l:l i="170">q</l:l>
+<l:l i="180">R</l:l>
+<l:l i="180">r</l:l>
+<l:l i="190">S</l:l>
+<l:l i="190">s</l:l>
+<l:l i="200">T</l:l>
+<l:l i="200">t</l:l>
+<l:l i="210">U</l:l>
+<l:l i="210">u</l:l>
+<l:l i="220">V</l:l>
+<l:l i="220">v</l:l>
+<l:l i="230">W</l:l>
+<l:l i="230">w</l:l>
+<l:l i="240">X</l:l>
+<l:l i="240">x</l:l>
+<l:l i="250">Y</l:l>
+<l:l i="250">y</l:l>
+<l:l i="260">Z</l:l>
+<l:l i="260">z</l:l>
+</l:letters>
+</l:l10n>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/autoidx-kimber.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/autoidx-kimber.xsl
new file mode 100644
index 0000000..45c785d
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/autoidx-kimber.xsl
@@ -0,0 +1,44 @@
+<?xml version="1.0"?>
+<!DOCTYPE xsl:stylesheet [
+<!ENTITY % common.entities SYSTEM "entities.ent">
+%common.entities;
+<!-- Documents using the kimber index method must have a lang attribute -->
+<!-- Only one of these should be present in the entity -->
+
+<!ENTITY lang 'concat(/*/@lang, /*/@xml:lang)'>
+]>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="1.0"
+ xmlns:k="java:com.isogen.saxoni18n.Saxoni18nService"
+ exclude-result-prefixes="k">
+
+<!-- ********************************************************************
+ $Id: autoidx-kimber.xsl 8729 2010-07-15 16:43:56Z bobstayton $
+ ********************************************************************
+
+ This file is part of the DocBook XSL Stylesheet distribution.
+ See ../README or http://docbook.sf.net/ for copyright
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<xsl:param name="kimber.imported">
+ <xsl:variable name="vendor" select="system-property('xsl:vendor')"/>
+ <xsl:choose>
+ <xsl:when test="not(contains($vendor, 'SAXON '))">
+ <xsl:message terminate="yes">
+ <xsl:text>ERROR: the 'kimber' index method requires the </xsl:text>
+ <xsl:text>Saxon version 6 or 8 XSLT processor.</xsl:text>
+ </xsl:message>
+ </xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+</xsl:param>
+
+
+<!-- The following key used in the kimber indexing method. -->
+<xsl:key name="k-group"
+ match="indexterm"
+ use="k:getIndexGroupKey(&lang;, &primary;)"/>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/autoidx-kosek.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/autoidx-kosek.xsl
new file mode 100644
index 0000000..3d755c4
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/autoidx-kosek.xsl
@@ -0,0 +1,154 @@
+<?xml version="1.0"?>
+<!DOCTYPE xsl:stylesheet [
+<!ENTITY % common.entities SYSTEM "entities.ent">
+%common.entities;
+]>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="1.0"
+ xmlns:func="http://exslt.org/functions"
+ xmlns:exslt="http://exslt.org/common"
+ xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0"
+ xmlns:fo="http://www.w3.org/1999/XSL/Format"
+ extension-element-prefixes="func exslt"
+ exclude-result-prefixes="func exslt i l"
+ xmlns:i="urn:cz-kosek:functions:index">
+
+<!-- ********************************************************************
+ $Id: autoidx-kosek.xsl 8759 2010-07-20 21:46:07Z kosek $
+ ********************************************************************
+
+ This file is part of the DocBook XSL Stylesheet distribution.
+ See ../README or http://docbook.sf.net/ for copyright
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<xsl:param name="kosek.imported">
+ <xsl:variable name="vendor" select="system-property('xsl:vendor')"/>
+ <xsl:choose>
+ <xsl:when test="contains($vendor, 'libxslt')">
+ <xsl:message terminate="yes">
+ <xsl:text>ERROR: the 'kosek' index method does not </xsl:text>
+ <xsl:text>work with the xsltproc XSLT processor.</xsl:text>
+ </xsl:message>
+ </xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+</xsl:param>
+
+<!-- Returns index group code for given term -->
+<func:function name="i:group-index">
+ <xsl:param name="term"/>
+
+ <xsl:variable name="letters-rtf">
+ <xsl:variable name="lang">
+ <xsl:call-template name="l10n.language"/>
+ </xsl:variable>
+
+ <xsl:variable name="local.l10n.letters"
+ select="($local.l10n.xml//l:i18n/l:l10n[@language=$lang]/l:letters)[1]"/>
+
+ <xsl:for-each select="$l10n.xml">
+ <xsl:variable name="l10n.letters"
+ select="document(key('l10n-lang', $lang)/@href)/l:l10n/l:letters[1]"/>
+
+ <xsl:choose>
+ <xsl:when test="count($local.l10n.letters) &gt; 0">
+ <xsl:copy-of select="$local.l10n.letters"/>
+ </xsl:when>
+ <xsl:when test="count($l10n.letters) &gt; 0">
+ <xsl:copy-of select="$l10n.letters"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:message>
+ <xsl:text>No "</xsl:text>
+ <xsl:value-of select="$lang"/>
+ <xsl:text>" localization of index grouping letters exists</xsl:text>
+ <xsl:choose>
+ <xsl:when test="$lang = 'en'">
+ <xsl:text>.</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text>; using "en".</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:message>
+
+ <xsl:copy-of select="document(key('l10n-lang', 'en'))/l:l10n/l:letters[1]"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:for-each>
+ </xsl:variable>
+
+ <xsl:variable name="letters" select="exslt:node-set($letters-rtf)/*"/>
+
+ <xsl:variable name="long-letter-index" select="$letters/l:l[. = substring($term,1,2)]/@i"/>
+ <xsl:variable name="short-letter-index" select="$letters/l:l[. = substring($term,1,1)]/@i"/>
+ <xsl:variable name="letter-index">
+ <xsl:choose>
+ <xsl:when test="$long-letter-index">
+ <xsl:value-of select="$long-letter-index"/>
+ </xsl:when>
+ <xsl:when test="$short-letter-index">
+ <xsl:value-of select="$short-letter-index"/>
+ </xsl:when>
+ <xsl:otherwise>0</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <func:result select="number($letter-index)"/>
+</func:function>
+
+<!-- Return index group letter for given group code -->
+<func:function name="i:group-letter">
+ <xsl:param name="index"/>
+
+ <xsl:variable name="letters-rtf">
+ <xsl:variable name="lang">
+ <xsl:call-template name="l10n.language"/>
+ </xsl:variable>
+
+ <xsl:variable name="local.l10n.letters"
+ select="($local.l10n.xml//l:i18n/l:l10n[@language=$lang]/l:letters)[1]"/>
+
+ <xsl:for-each select="$l10n.xml">
+ <xsl:variable name="l10n.letters"
+ select="document(key('l10n-lang', $lang)/@href)/l:l10n/l:letters[1]"/>
+
+ <xsl:choose>
+ <xsl:when test="count($local.l10n.letters) &gt; 0">
+ <xsl:copy-of select="$local.l10n.letters"/>
+ </xsl:when>
+ <xsl:when test="count($l10n.letters) &gt; 0">
+ <xsl:copy-of select="$l10n.letters"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:message>
+ <xsl:text>No "</xsl:text>
+ <xsl:value-of select="$lang"/>
+ <xsl:text>" localization of index grouping letters exists</xsl:text>
+ <xsl:choose>
+ <xsl:when test="$lang = 'en'">
+ <xsl:text>.</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text>; using "en".</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:message>
+
+ <xsl:copy-of select="document(key('l10n-lang', 'en')/@href)/l:l10n/l:letters[1]"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:for-each>
+ </xsl:variable>
+
+ <xsl:variable name="letters" select="exslt:node-set($letters-rtf)/*"/>
+
+ <func:result select="$letters/l:l[@i=$index][1]"/>
+</func:function>
+
+<xsl:key name="group-code"
+ match="indexterm"
+ use="i:group-index(&primary;)"/>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/az.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/az.xml
new file mode 100644
index 0000000..c22ec7b
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/az.xml
@@ -0,0 +1,672 @@
+<?xml version="1.0" encoding="utf-8"?>
+<l:l10n xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0" language="az" english-language-name="Azerbaijani">
+
+<!-- * This file is generated automatically. -->
+<!-- * To submit changes to this file upstream (to the DocBook Project) -->
+<!-- * do not submit an edited version of this file. Instead, submit an -->
+<!-- * edited version of the source file at the following location: -->
+<!-- * -->
+<!-- * https://docbook.svn.sourceforge.net/svnroot/docbook/trunk/gentext/locale/az.xml -->
+<!-- * -->
+<!-- * E-mail the edited az.xml source file to: -->
+<!-- * -->
+<!-- * docbook-developers@lists.sourceforge.net -->
+
+<!-- ******************************************************************** -->
+
+<!-- This file is part of the XSL DocBook Stylesheet distribution. -->
+<!-- See ../README or http://docbook.sf.net/release/xsl/current/ for -->
+<!-- copyright and other information. -->
+
+<!-- ******************************************************************** -->
+<!-- In these files, % with a letter is used for a placeholder: -->
+<!-- %t is the current element's title -->
+<!-- %s is the current element's subtitle (if applicable)-->
+<!-- %n is the current element's number label-->
+<!-- %p is the current element's page number (if applicable)-->
+<!-- ******************************************************************** -->
+
+
+<l:gentext key="Abstract" text="Ä°cmal"/>
+<l:gentext key="abstract" text="Ä°cmal"/>
+<l:gentext key="Acknowledgements" text="Acknowledgements" lang="en"/>
+<l:gentext key="acknowledgements" text="Acknowledgements" lang="en"/>
+<l:gentext key="Answer" text="Cavab:"/>
+<l:gentext key="answer" text="Cavab:"/>
+<l:gentext key="Appendix" text="ÆlavÉ™"/>
+<l:gentext key="appendix" text="ÆlavÉ™"/>
+<l:gentext key="Article" text="Məqalə"/>
+<l:gentext key="article" text="Məqalə"/>
+<l:gentext key="Author" text="Müəllif"/>
+<l:gentext key="Bibliography" text="Qaynaqça"/>
+<l:gentext key="bibliography" text="Qaynaqça"/>
+<l:gentext key="Book" text="Kitab"/>
+<l:gentext key="book" text="Kitab"/>
+<l:gentext key="CAUTION" text="DÄ°QQÆT"/>
+<l:gentext key="Caution" text="Diqqət"/>
+<l:gentext key="caution" text="Diqqət"/>
+<l:gentext key="Chapter" text="Bölüm"/>
+<l:gentext key="chapter" text="Bölüm"/>
+<l:gentext key="Colophon" text="Kitab Haqqında"/>
+<l:gentext key="colophon" text="Kitab Haqqında"/>
+<l:gentext key="Copyright" text="Müəllif Hüququ"/>
+<l:gentext key="copyright" text="Müəllif Hüququ"/>
+<l:gentext key="Dedication" text="Həsr"/>
+<l:gentext key="dedication" text="Həsr"/>
+<l:gentext key="Edition" text="Buraxılış"/>
+<l:gentext key="edition" text="Buraxılış"/>
+<l:gentext key="Editor" text="Editor" lang="en"/>
+<l:gentext key="Equation" text="Tənlik"/>
+<l:gentext key="equation" text="Tənlik"/>
+<l:gentext key="Example" text="Nümunə"/>
+<l:gentext key="example" text="Nümunə"/>
+<l:gentext key="Figure" text="Fiqur"/>
+<l:gentext key="figure" text="Fiqur"/>
+<l:gentext key="Glossary" text="Lüğət"/>
+<l:gentext key="glossary" text="Lüğət"/>
+<l:gentext key="GlossSee" text="Bax"/>
+<l:gentext key="glosssee" text="Bax"/>
+<l:gentext key="GlossSeeAlso" text="Eləcə Də Bax"/>
+<l:gentext key="glossseealso" text="Eləcə Də Bax"/>
+<l:gentext key="IMPORTANT" text="VACÄ°B"/>
+<l:gentext key="important" text="Vacib"/>
+<l:gentext key="Important" text="Vacib"/>
+<l:gentext key="Index" text="Ä°ndeks"/>
+<l:gentext key="index" text="Ä°ndeks"/>
+<l:gentext key="ISBN" text="ISBN"/>
+<l:gentext key="isbn" text="ISBN"/>
+<l:gentext key="LegalNotice" text="Qanuni Qeyd"/>
+<l:gentext key="legalnotice" text="Qanuni Qeyd"/>
+<l:gentext key="MsgAud" text="Hədəf Oxuyucu"/>
+<l:gentext key="msgaud" text="Hədəf Oxuyucu"/>
+<l:gentext key="MsgLevel" text="Səviyyə"/>
+<l:gentext key="msglevel" text="Səviyyə"/>
+<l:gentext key="MsgOrig" text="Mənbə"/>
+<l:gentext key="msgorig" text="Mənbə"/>
+<l:gentext key="NOTE" text="QEYD"/>
+<l:gentext key="Note" text="Qeyd"/>
+<l:gentext key="note" text="Qeyd"/>
+<l:gentext key="Part" text="HissÉ™"/>
+<l:gentext key="part" text="HissÉ™"/>
+<l:gentext key="Preface" text="Önsöz"/>
+<l:gentext key="preface" text="Önsöz"/>
+<l:gentext key="Procedure" text="Ãœsul"/>
+<l:gentext key="procedure" text="Ãœsul"/>
+<l:gentext key="ProductionSet" text="Produksiya"/>
+<l:gentext key="PubDate" text="Yayimlama Tarixi"/>
+<l:gentext key="pubdate" text="Yayimlama Tarixi"/>
+<l:gentext key="Published" text="Yayimlama"/>
+<l:gentext key="published" text="Yayimlama"/>
+<l:gentext key="Publisher" text="Publisher" lang="en"/>
+<l:gentext key="Qandadiv" text="S vÉ™ C"/>
+<l:gentext key="qandadiv" text="S vÉ™ C"/>
+<l:gentext key="QandASet" text="Frequently Asked Questions" lang="en"/>
+<l:gentext key="Question" text="Sual:"/>
+<l:gentext key="question" text="Sual:"/>
+<l:gentext key="RefEntry" text=""/>
+<l:gentext key="refentry" text=""/>
+<l:gentext key="Reference" text="Xatırlatma"/>
+<l:gentext key="reference" text="Xatırlatma"/>
+<l:gentext key="References" text="References" lang="en"/>
+<l:gentext key="RefName" text="Ad"/>
+<l:gentext key="refname" text="Ad"/>
+<l:gentext key="RefSection" text=""/>
+<l:gentext key="refsection" text=""/>
+<l:gentext key="RefSynopsisDiv" text="Ä°cmal"/>
+<l:gentext key="refsynopsisdiv" text="Ä°cmal"/>
+<l:gentext key="RevHistory" text="Nəzərdən Keçirmə Tarixçəsi"/>
+<l:gentext key="revhistory" text="Nəzərdən Keçirmə Tarixçəsi"/>
+<l:gentext key="revision" text="Nəzərdən Keçirmə"/>
+<l:gentext key="Revision" text="Nəzərdən Keçirmə"/>
+<l:gentext key="sect1" text="Qisim"/>
+<l:gentext key="sect2" text="Qisim"/>
+<l:gentext key="sect3" text="Qisim"/>
+<l:gentext key="sect4" text="Qisim"/>
+<l:gentext key="sect5" text="Qisim"/>
+<l:gentext key="section" text="Qisim"/>
+<l:gentext key="Section" text="Qisim"/>
+<l:gentext key="see" text="bax"/>
+<l:gentext key="See" text="Bax"/>
+<l:gentext key="seealso" text="eləcə də bax"/>
+<l:gentext key="Seealso" text="Eləcə Də Bax"/>
+<l:gentext key="SeeAlso" text="Eləcə Də Bax"/>
+<l:gentext key="set" text="Dəstə"/>
+<l:gentext key="Set" text="Dəstə"/>
+<l:gentext key="setindex" text="İndeksi Seç"/>
+<l:gentext key="SetIndex" text="İndeksi Seç"/>
+<l:gentext key="Sidebar" text=""/>
+<l:gentext key="sidebar" text="Kənar Çubuğu"/>
+<l:gentext key="step" text="addım"/>
+<l:gentext key="Step" text="Addım"/>
+<l:gentext key="table" text="cədvəl"/>
+<l:gentext key="Table" text="Cədvəl"/>
+<l:gentext key="task" text="Task" lang="en"/>
+<l:gentext key="Task" text="Task" lang="en"/>
+<l:gentext key="tip" text="məsləhət"/>
+<l:gentext key="TIP" text="MÆSLÆHÆT"/>
+<l:gentext key="Tip" text="Məsləhət"/>
+<l:gentext key="Warning" text="Xəbərdarlıq"/>
+<l:gentext key="warning" text="Xəbərdarlıq"/>
+<l:gentext key="WARNING" text="XÆBÆRDARLIQ"/>
+<l:gentext key="and" text="vÉ™"/>
+<l:gentext key="by" text=""/>
+<l:gentext key="Edited" text="Düzəldildi"/>
+<l:gentext key="edited" text="Düzəldildi"/>
+<l:gentext key="Editedby" text="Düzəliş edən"/>
+<l:gentext key="editedby" text="Düzəliş edən"/>
+<l:gentext key="in" text=""/>
+<l:gentext key="lastlistcomma" text=","/>
+<l:gentext key="listcomma" text=","/>
+<l:gentext key="notes" text="Qeydlər"/>
+<l:gentext key="Notes" text="Qeydlər"/>
+<l:gentext key="Pgs" text="Shflr."/>
+<l:gentext key="pgs" text="Shflr."/>
+<l:gentext key="Revisedby" text="Gözdən keçirən: "/>
+<l:gentext key="revisedby" text="Gözdən keçirən: "/>
+<l:gentext key="TableNotes" text="Qeydlər"/>
+<l:gentext key="tablenotes" text="Qeydlər"/>
+<l:gentext key="TableofContents" text="Məzmun"/>
+<l:gentext key="tableofcontents" text="Məzmun"/>
+<l:gentext key="unexpectedelementname" text="Gözlənməyən element adı"/>
+<l:gentext key="unsupported" text="dəstəklənmir"/>
+<l:gentext key="xrefto" text=""/>
+<l:gentext key="Authors" text="Authors" lang="en"/>
+<l:gentext key="copyeditor" text="Copy Editor" lang="en"/>
+<l:gentext key="graphicdesigner" text="Graphic Designer" lang="en"/>
+<l:gentext key="productioneditor" text="Production Editor" lang="en"/>
+<l:gentext key="technicaleditor" text="Technical Editor" lang="en"/>
+<l:gentext key="translator" text="Translator" lang="en"/>
+<l:gentext key="listofequations" text="Tənliklər"/>
+<l:gentext key="ListofEquations" text="Tənliklər"/>
+<l:gentext key="ListofExamples" text="Nümunələr"/>
+<l:gentext key="listofexamples" text="Nümunələr"/>
+<l:gentext key="ListofFigures" text="Fiqurlar"/>
+<l:gentext key="listoffigures" text="Fiqurlar"/>
+<l:gentext key="ListofProcedures" text="Ãœsullar"/>
+<l:gentext key="listofprocedures" text="Ãœsullar"/>
+<l:gentext key="listoftables" text="Cədvəllər"/>
+<l:gentext key="ListofTables" text="Cədvəllər"/>
+<l:gentext key="ListofUnknown" text="Naməlumlar"/>
+<l:gentext key="listofunknown" text="List of Unknown" lang="en"/>
+<l:gentext key="nav-home" text="Ev"/>
+<l:gentext key="nav-next" text="Sonrakı"/>
+<l:gentext key="nav-next-sibling" text="İrəli"/>
+<l:gentext key="nav-prev" text="ÆvvÉ™lki"/>
+<l:gentext key="nav-prev-sibling" text="Geri"/>
+<l:gentext key="nav-up" text="Yuxarı"/>
+<l:gentext key="nav-toc" text="Məzmun"/>
+<l:gentext key="Draft" text="Åžablon"/>
+<l:gentext key="above" text="Üstündə"/>
+<l:gentext key="below" text="Altında"/>
+<l:gentext key="sectioncalled" text=""/>
+<l:gentext key="index symbols" text="Simvollar"/>
+<l:gentext key="writing-mode" text="lr-tb"/>
+<l:gentext key="lowercase.alpha" text="abcçdeəfgğhxıijkqlmnoöprsştuüvyz"/>
+<l:gentext key="uppercase.alpha" text="ABCÇDEÆFGÄžHXIÄ°JKQLMNOÖPRSÅžTUÃœVYZ"/>
+<l:gentext key="normalize.sort.input" text="AaÀàÃáÂâÃãÄäÅåĀÄĂ㥹ÇǎǞǟǠǡǺǻȀÈȂȃȦȧḀá¸áºšáº áº¡áº¢áº£áº¤áº¥áº¦áº§áº¨áº©áºªáº«áº¬áº­áº®áº¯áº°áº±áº²áº³áº´áºµáº¶áº·BbÆ€ÆɓƂƃḂḃḄḅḆḇCcÇçĆćĈĉĊċČÄƇƈɕḈḉDdÄŽÄÄđƊɗƋƌDžDzȡɖḊḋḌá¸á¸Žá¸á¸á¸‘ḒḓEeÈèÉéÊêËëĒēĔĕĖėĘęĚěȄȅȆȇȨȩḔḕḖḗḘḙḚḛḜá¸áº¸áº¹áººáº»áº¼áº½áº¾áº¿á»€á»á»‚ểỄễỆệFfƑƒḞḟGgÄœÄĞğĠġĢģƓɠǤǥǦǧǴǵḠḡHhĤĥĦħȞȟɦḢḣḤḥḦḧḨḩḪḫẖIiÌìÃíÎîÃïĨĩĪīĬĭĮįİƗɨÇÇȈȉȊȋḬḭḮḯỈỉỊịJjĴĵǰÊKkĶķƘƙǨǩḰḱḲḳḴḵLlĹĺĻļĽľĿŀÅłƚLjȴɫɬɭḶḷḸḹḺḻḼḽMmɱḾḿṀá¹á¹‚ṃNnÑñŃńŅņŇňÆɲƞȠNjǸǹȵɳṄṅṆṇṈṉṊṋOoÒòÓóÔôÕõÖöØøŌÅÅŽÅÅőƟƠơǑǒǪǫǬǭǾǿȌÈÈŽÈȪȫȬȭȮȯȰȱṌá¹á¹Žá¹á¹á¹‘ṒṓỌá»á»Žá»á»á»‘ỒồỔổỖỗỘộỚớỜá»á»žá»Ÿá» á»¡á»¢á»£PpƤƥṔṕṖṗQqÊ RrŔŕŖŗŘřÈȑȒȓɼɽɾṘṙṚṛṜá¹á¹žá¹ŸSsŚśŜÅŞşŠšȘșʂṠṡṢṣṤṥṦṧṨṩTtŢţŤťŦŧƫƬƭƮʈȚțȶṪṫṬṭṮṯṰṱẗUuÙùÚúÛûÜüŨũŪūŬŭŮůŰűŲųƯưǓǔǕǖǗǘǙǚǛǜȔȕȖȗṲṳṴṵṶṷṸṹṺṻỤụỦủỨứỪừỬửỮữỰựVvƲʋṼṽṾṿWwŴŵẀáºáº‚ẃẄẅẆẇẈẉẘXxẊẋẌáºYyÃýÿŸŶŷƳƴȲȳẎáºáº™á»²á»³á»´á»µá»¶á»·á»¸á»¹ZzŹźŻżŽžƵƶȤȥÊÊ‘áºáº‘ẒẓẔẕẕ" lang="en"/>
+<l:gentext key="normalize.sort.output" text="AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBCCCCCCCCCCCCCCCCCDDDDDDDDDDDDDDDDDDDDDDDDEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEFFFFFFGGGGGGGGGGGGGGGGGGGGHHHHHHHHHHHHHHHHHHHHIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIJJJJJJKKKKKKKKKKKKKKLLLLLLLLLLLLLLLLLLLLLLLLLLMMMMMMMMMNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOPPPPPPPPQQQRRRRRRRRRRRRRRRRRRRRRRRSSSSSSSSSSSSSSSSSSSSSSSTTTTTTTTTTTTTTTTTTTTTTTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUVVVVVVVVWWWWWWWWWWWWWWWXXXXXXYYYYYYYYYYYYYYYYYYYYYYYZZZZZZZZZZZZZZZZZZZZZ" lang="en"/>
+<l:dingbat key="startquote" text="“"/>
+<l:dingbat key="endquote" text="â€"/>
+<l:dingbat key="nestedstartquote" text="‘"/>
+<l:dingbat key="nestedendquote" text="’"/>
+<l:dingbat key="singlestartquote" text="‘"/>
+<l:dingbat key="singleendquote" text="’"/>
+<l:dingbat key="bullet" text="•"/>
+<l:gentext key="hyphenation-character" text="-"/>
+<l:gentext key="hyphenation-push-character-count" text="2"/>
+<l:gentext key="hyphenation-remain-character-count" text="2"/>
+<l:context name="styles"><l:template name="person-name" text="first-last"/>
+</l:context>
+<l:context name="title"><l:template name="abstract" text="%t"/>
+<l:template name="acknowledgements" text="%t" lang="en"/>
+<l:template name="answer" text="%t"/>
+<l:template name="appendix" text="Ælavə %n. %t"/>
+<l:template name="article" text="%t"/>
+<l:template name="authorblurb" text="%t"/>
+<l:template name="bibliodiv" text="%t"/>
+<l:template name="biblioentry" text="%t"/>
+<l:template name="bibliography" text="%t"/>
+<l:template name="bibliolist" text="%t"/>
+<l:template name="bibliomixed" text="%t"/>
+<l:template name="bibliomset" text="%t"/>
+<l:template name="biblioset" text="%t"/>
+<l:template name="blockquote" text="%t"/>
+<l:template name="book" text="%t"/>
+<l:template name="calloutlist" text="%t"/>
+<l:template name="caution" text="%t"/>
+<l:template name="chapter" text="Bölüm %n. %t"/>
+<l:template name="colophon" text="%t"/>
+<l:template name="dedication" text="%t"/>
+<l:template name="equation" text="Tənlik %n. %t"/>
+<l:template name="example" text="Nümunə %n. %t"/>
+<l:template name="figure" text="Fiqur %n. %t"/>
+<l:template name="foil" text="%t"/>
+<l:template name="foilgroup" text="%t"/>
+<l:template name="formalpara" text="%t"/>
+<l:template name="glossary" text="%t"/>
+<l:template name="glossdiv" text="%t"/>
+<l:template name="glosslist" text="%t"/>
+<l:template name="glossentry" text="%t"/>
+<l:template name="important" text="%t"/>
+<l:template name="index" text="%t"/>
+<l:template name="indexdiv" text="%t"/>
+<l:template name="itemizedlist" text="%t"/>
+<l:template name="legalnotice" text="%t"/>
+<l:template name="listitem" text=""/>
+<l:template name="lot" text="%t"/>
+<l:template name="msg" text="%t"/>
+<l:template name="msgexplan" text="%t"/>
+<l:template name="msgmain" text="%t"/>
+<l:template name="msgrel" text="%t"/>
+<l:template name="msgset" text="%t"/>
+<l:template name="msgsub" text="%t"/>
+<l:template name="note" text="%t"/>
+<l:template name="orderedlist" text="%t"/>
+<l:template name="part" text="Hissə %n. %t"/>
+<l:template name="partintro" text="%t"/>
+<l:template name="preface" text="%t"/>
+<l:template name="procedure" text="%t"/>
+<l:template name="procedure.formal" text="Üsul %n. %t"/>
+<l:template name="productionset" text="%t"/>
+<l:template name="productionset.formal" text="Produksiya %n"/>
+<l:template name="qandadiv" text="%t"/>
+<l:template name="qandaentry" text="%t"/>
+<l:template name="qandaset" text="%t"/>
+<l:template name="question" text="%t"/>
+<l:template name="refentry" text="%t"/>
+<l:template name="reference" text="%t"/>
+<l:template name="refsection" text="%t"/>
+<l:template name="refsect1" text="%t"/>
+<l:template name="refsect2" text="%t"/>
+<l:template name="refsect3" text="%t"/>
+<l:template name="refsynopsisdiv" text="%t"/>
+<l:template name="refsynopsisdivinfo" text="%t"/>
+<l:template name="segmentedlist" text="%t"/>
+<l:template name="set" text="%t"/>
+<l:template name="setindex" text="%t"/>
+<l:template name="sidebar" text="%t"/>
+<l:template name="step" text="%t"/>
+<l:template name="table" text="Cədvəl %n. %t"/>
+<l:template name="task" text="%t"/>
+<l:template name="tasksummary" text="%t" lang="en"/>
+<l:template name="taskprerequisites" text="%t" lang="en"/>
+<l:template name="taskrelated" text="%t" lang="en"/>
+<l:template name="tip" text="%t"/>
+<l:template name="toc" text="%t"/>
+<l:template name="variablelist" text="%t"/>
+<l:template name="varlistentry" text=""/>
+<l:template name="warning" text="%t"/>
+</l:context>
+<l:context name="title-unnumbered"><l:template name="appendix" text="%t"/>
+<l:template name="article/appendix" text="%t"/>
+<l:template name="bridgehead" text="%t"/>
+<l:template name="chapter" text="%t"/>
+<l:template name="sect1" text="%t"/>
+<l:template name="sect2" text="%t"/>
+<l:template name="sect3" text="%t"/>
+<l:template name="sect4" text="%t"/>
+<l:template name="sect5" text="%t"/>
+<l:template name="section" text="%t"/>
+<l:template name="simplesect" text="%t"/>
+<l:template name="part" text="%t" lang="en"/>
+</l:context>
+<l:context name="title-numbered"><l:template name="appendix" text="Ælavə %n. %t"/>
+<l:template name="article/appendix" text="%n. %t"/>
+<l:template name="bridgehead" text="%n. %t"/>
+<l:template name="chapter" text="Bölüm %n. %t"/>
+<l:template name="part" text="Hissə %n. %t"/>
+<l:template name="sect1" text="%n. %t"/>
+<l:template name="sect2" text="%n. %t"/>
+<l:template name="sect3" text="%n. %t"/>
+<l:template name="sect4" text="%n. %t"/>
+<l:template name="sect5" text="%n. %t"/>
+<l:template name="section" text="%n. %t"/>
+<l:template name="simplesect" text="%t"/>
+</l:context>
+<l:context name="subtitle"><l:template name="appendix" text="%s"/>
+<l:template name="acknowledgements" text="%s" lang="en"/>
+<l:template name="article" text="%s"/>
+<l:template name="bibliodiv" text="%s"/>
+<l:template name="biblioentry" text="%s"/>
+<l:template name="bibliography" text="%s"/>
+<l:template name="bibliomixed" text="%s"/>
+<l:template name="bibliomset" text="%s"/>
+<l:template name="biblioset" text="%s"/>
+<l:template name="book" text="%s"/>
+<l:template name="chapter" text="%s"/>
+<l:template name="colophon" text="%s"/>
+<l:template name="dedication" text="%s"/>
+<l:template name="glossary" text="%s"/>
+<l:template name="glossdiv" text="%s"/>
+<l:template name="index" text="%s"/>
+<l:template name="indexdiv" text="%s"/>
+<l:template name="lot" text="%s"/>
+<l:template name="part" text="%s"/>
+<l:template name="partintro" text="%s"/>
+<l:template name="preface" text="%s"/>
+<l:template name="refentry" text="%s"/>
+<l:template name="reference" text="%s"/>
+<l:template name="refsection" text="%s"/>
+<l:template name="refsect1" text="%s"/>
+<l:template name="refsect2" text="%s"/>
+<l:template name="refsect3" text="%s"/>
+<l:template name="refsynopsisdiv" text="%s"/>
+<l:template name="sect1" text="%s"/>
+<l:template name="sect2" text="%s"/>
+<l:template name="sect3" text="%s"/>
+<l:template name="sect4" text="%s"/>
+<l:template name="sect5" text="%s"/>
+<l:template name="section" text="%s"/>
+<l:template name="set" text="%s"/>
+<l:template name="setindex" text="%s"/>
+<l:template name="sidebar" text="%s"/>
+<l:template name="simplesect" text="%s"/>
+<l:template name="toc" text="%s"/>
+</l:context>
+<l:context name="xref"><l:template name="abstract" text="%t"/>
+<l:template name="acknowledgements" text="%t" lang="en"/>
+<l:template name="answer" text="Cavab: %n"/>
+<l:template name="appendix" text="%t"/>
+<l:template name="article" text="%t"/>
+<l:template name="authorblurb" text="%t"/>
+<l:template name="bibliodiv" text="%t"/>
+<l:template name="bibliography" text="%t"/>
+<l:template name="bibliomset" text="%t"/>
+<l:template name="biblioset" text="%t"/>
+<l:template name="blockquote" text="%t"/>
+<l:template name="book" text="%t"/>
+<l:template name="calloutlist" text="%t"/>
+<l:template name="caution" text="%t"/>
+<l:template name="chapter" text="%t"/>
+<l:template name="colophon" text="%t"/>
+<l:template name="constraintdef" text="%t"/>
+<l:template name="dedication" text="%t"/>
+<l:template name="equation" text="%t"/>
+<l:template name="example" text="%t"/>
+<l:template name="figure" text="%t"/>
+<l:template name="foil" text="%t"/>
+<l:template name="foilgroup" text="%t"/>
+<l:template name="formalpara" text="%t"/>
+<l:template name="glossary" text="%t"/>
+<l:template name="glossdiv" text="%t"/>
+<l:template name="important" text="%t"/>
+<l:template name="index" text="%t"/>
+<l:template name="indexdiv" text="%t"/>
+<l:template name="itemizedlist" text="%t"/>
+<l:template name="legalnotice" text="%t"/>
+<l:template name="listitem" text="%n"/>
+<l:template name="lot" text="%t"/>
+<l:template name="msg" text="%t"/>
+<l:template name="msgexplan" text="%t"/>
+<l:template name="msgmain" text="%t"/>
+<l:template name="msgrel" text="%t"/>
+<l:template name="msgset" text="%t"/>
+<l:template name="msgsub" text="%t"/>
+<l:template name="note" text="%t"/>
+<l:template name="orderedlist" text="%t"/>
+<l:template name="part" text="%t"/>
+<l:template name="partintro" text="%t"/>
+<l:template name="preface" text="%t"/>
+<l:template name="procedure" text="%t"/>
+<l:template name="productionset" text="%t"/>
+<l:template name="qandadiv" text="%t"/>
+<l:template name="qandaentry" text="Sual: %n"/>
+<l:template name="qandaset" text="%t"/>
+<l:template name="question" text="Sual: %n"/>
+<l:template name="reference" text="%t"/>
+<l:template name="refsynopsisdiv" text="%t"/>
+<l:template name="segmentedlist" text="%t"/>
+<l:template name="set" text="%t"/>
+<l:template name="setindex" text="%t"/>
+<l:template name="sidebar" text="%t"/>
+<l:template name="table" text="%t"/>
+<l:template name="task" text="%t" lang="en"/>
+<l:template name="tip" text="%t"/>
+<l:template name="toc" text="%t"/>
+<l:template name="variablelist" text="%t"/>
+<l:template name="varlistentry" text="%n"/>
+<l:template name="warning" text="%t"/>
+<l:template name="olink.document.citation" text=" in %o"/>
+<l:template name="olink.page.citation" text=" (page %p)"/>
+<l:template name="page.citation" text=" [%p]"/>
+<l:template name="page" text="(page %p)"/>
+<l:template name="docname" text=" in %o"/>
+<l:template name="docnamelong" text=" in the document titled %o"/>
+<l:template name="pageabbrev" text="(p. %p)"/>
+<l:template name="Page" text="Page %p"/>
+<l:template name="bridgehead" text=" “%tâ€"/>
+<l:template name="refsection" text=" “%tâ€"/>
+<l:template name="refsect1" text=" “%tâ€"/>
+<l:template name="refsect2" text=" “%tâ€"/>
+<l:template name="refsect3" text=" “%tâ€"/>
+<l:template name="sect1" text=" “%tâ€"/>
+<l:template name="sect2" text=" “%tâ€"/>
+<l:template name="sect3" text=" “%tâ€"/>
+<l:template name="sect4" text=" “%tâ€"/>
+<l:template name="sect5" text=" “%tâ€"/>
+<l:template name="section" text=" “%tâ€"/>
+<l:template name="simplesect" text=" “%tâ€"/>
+</l:context>
+<l:context name="xref-number"><l:template name="answer" text="Cavab: %n"/>
+<l:template name="appendix" text="Ælavə %n"/>
+<l:template name="bridgehead" text="Qisim %n"/>
+<l:template name="chapter" text="Bölüm %n"/>
+<l:template name="equation" text="Tənlik %n"/>
+<l:template name="example" text="Nümunə %n"/>
+<l:template name="figure" text="Fiqur %n"/>
+<l:template name="part" text="Hissə %n"/>
+<l:template name="procedure" text="Üsul %n"/>
+<l:template name="productionset" text="Produksiya %n"/>
+<l:template name="qandadiv" text="S və C %n"/>
+<l:template name="qandaentry" text="Sual: %n"/>
+<l:template name="question" text="Sual: %n"/>
+<l:template name="sect1" text="Qisim %n"/>
+<l:template name="sect2" text="Qisim %n"/>
+<l:template name="sect3" text="Qisim %n"/>
+<l:template name="sect4" text="Qisim %n"/>
+<l:template name="sect5" text="Qisim %n"/>
+<l:template name="section" text="Qisim %n"/>
+<l:template name="table" text="Cədvəl %n"/>
+</l:context>
+<l:context name="xref-number-and-title"><l:template name="appendix" text="Ælavə %n, %t"/>
+<l:template name="bridgehead" text="Qisim %n, “%tâ€"/>
+<l:template name="chapter" text="Bölüm %n, %t"/>
+<l:template name="equation" text="TÉ™nlik %n, “%tâ€"/>
+<l:template name="example" text="Nümunə %n, “%tâ€"/>
+<l:template name="figure" text="Fiqur %n, “%tâ€"/>
+<l:template name="part" text="Hissə %n, “%tâ€"/>
+<l:template name="procedure" text="Ãœsul %n, “%tâ€"/>
+<l:template name="productionset" text="Produksiya %n, “%tâ€"/>
+<l:template name="qandadiv" text="S vÉ™ C %n, “%tâ€"/>
+<l:template name="refsect1" text=" “%tâ€"/>
+<l:template name="refsect2" text=" “%tâ€"/>
+<l:template name="refsect3" text=" “%tâ€"/>
+<l:template name="refsection" text=" “%tâ€"/>
+<l:template name="sect1" text="Qisim %n, “%tâ€"/>
+<l:template name="sect2" text="Qisim %n, “%tâ€"/>
+<l:template name="sect3" text="Qisim %n, “%tâ€"/>
+<l:template name="sect4" text="Qisim %n, “%tâ€"/>
+<l:template name="sect5" text="Qisim %n, “%tâ€"/>
+<l:template name="section" text="Qisim %n, “%tâ€"/>
+<l:template name="simplesect" text=" “%tâ€"/>
+<l:template name="table" text="CÉ™dvÉ™l %n, “%tâ€"/>
+</l:context>
+<l:context name="authorgroup"><l:template name="sep" text=", "/>
+<l:template name="sep2" text=" vÉ™ "/>
+<l:template name="seplast" text=", vÉ™ "/>
+</l:context>
+<l:context name="glossary"><l:template name="see" text="Bax %t."/>
+<l:template name="seealso" text="Eləcə Də Bax %t."/>
+<l:template name="seealso-separator" text=", "/>
+</l:context>
+<l:context name="msgset"><l:template name="MsgAud" text="Hədəf Oxuyucu: "/>
+<l:template name="MsgLevel" text="Səviyyə: "/>
+<l:template name="MsgOrig" text="Mənbə: "/>
+</l:context>
+<l:context name="datetime"><l:template name="format" text="m/d/Y"/>
+</l:context>
+<l:context name="termdef"><l:template name="prefix" text="[Definition: "/>
+<l:template name="suffix" text="]"/>
+</l:context>
+<l:context name="datetime-full"><l:template name="January" text="Janvar"/>
+<l:template name="February" text="Fevral"/>
+<l:template name="March" text="Mart"/>
+<l:template name="April" text="Aprel"/>
+<l:template name="May" text="May"/>
+<l:template name="June" text="Ä°yun"/>
+<l:template name="July" text="Ä°yul"/>
+<l:template name="August" text="Avqust"/>
+<l:template name="September" text="Sentyabr"/>
+<l:template name="October" text="Oktyabr"/>
+<l:template name="November" text="Noyabr"/>
+<l:template name="December" text="Dekabr"/>
+<l:template name="Monday" text="Bazar Ertəsi"/>
+<l:template name="Tuesday" text="Çərşənbə Axşamı "/>
+<l:template name="Wednesday" text="Çərşənbə"/>
+<l:template name="Thursday" text="Cümə Axşamı"/>
+<l:template name="Friday" text="Cümə"/>
+<l:template name="Saturday" text="Şənbə"/>
+<l:template name="Sunday" text="Bazar"/>
+</l:context>
+<l:context name="datetime-abbrev"><l:template name="Jan" text="Yan"/>
+<l:template name="Feb" text="Fev"/>
+<l:template name="Mar" text="Mar"/>
+<l:template name="Apr" text="Apr"/>
+<l:template name="May" text="May"/>
+<l:template name="Jun" text="Ä°yn"/>
+<l:template name="Jul" text="Ä°yl"/>
+<l:template name="Aug" text="Avq"/>
+<l:template name="Sep" text="Sen"/>
+<l:template name="Oct" text="Okt"/>
+<l:template name="Nov" text="Noy"/>
+<l:template name="Dec" text="Dek"/>
+<l:template name="Mon" text="Ber"/>
+<l:template name="Tue" text="Çax"/>
+<l:template name="Wed" text="Çər"/>
+<l:template name="Thu" text="Cax"/>
+<l:template name="Fri" text="Cüm"/>
+<l:template name="Sat" text="Åžnb"/>
+<l:template name="Sun" text="Baz"/>
+</l:context>
+<l:context name="htmlhelp"><l:template name="langcode" text="0x042c Azerbaijani"/>
+</l:context>
+<l:context name="index"><l:template name="term-separator" text=", " lang="en"/>
+<l:template name="number-separator" text=", " lang="en"/>
+<l:template name="range-separator" text="-" lang="en"/>
+</l:context>
+<l:context name="iso690"><l:template name="lastfirst.sep" text=", " lang="en"/>
+<l:template name="alt.person.two.sep" text=" – " lang="en"/>
+<l:template name="alt.person.last.sep" text=" – " lang="en"/>
+<l:template name="alt.person.more.sep" text=" – " lang="en"/>
+<l:template name="primary.editor" text=" (ed.)" lang="en"/>
+<l:template name="primary.many" text=", et al." lang="en"/>
+<l:template name="primary.sep" text=". " lang="en"/>
+<l:template name="submaintitle.sep" text=": " lang="en"/>
+<l:template name="title.sep" text=". " lang="en"/>
+<l:template name="othertitle.sep" text=", " lang="en"/>
+<l:template name="medium1" text=" [" lang="en"/>
+<l:template name="medium2" text="]" lang="en"/>
+<l:template name="secondary.person.sep" text="; " lang="en"/>
+<l:template name="secondary.sep" text=". " lang="en"/>
+<l:template name="respons.sep" text=". " lang="en"/>
+<l:template name="edition.sep" text=". " lang="en"/>
+<l:template name="edition.serial.sep" text=", " lang="en"/>
+<l:template name="issuing.range" text="-" lang="en"/>
+<l:template name="issuing.div" text=", " lang="en"/>
+<l:template name="issuing.sep" text=". " lang="en"/>
+<l:template name="partnr.sep" text=". " lang="en"/>
+<l:template name="placepubl.sep" text=": " lang="en"/>
+<l:template name="publyear.sep" text=", " lang="en"/>
+<l:template name="pubinfo.sep" text=". " lang="en"/>
+<l:template name="spec.pubinfo.sep" text=", " lang="en"/>
+<l:template name="upd.sep" text=", " lang="en"/>
+<l:template name="datecit1" text=" [cited " lang="en"/>
+<l:template name="datecit2" text="]" lang="en"/>
+<l:template name="extent.sep" text=". " lang="en"/>
+<l:template name="locs.sep" text=", " lang="en"/>
+<l:template name="location.sep" text=". " lang="en"/>
+<l:template name="serie.sep" text=". " lang="en"/>
+<l:template name="notice.sep" text=". " lang="en"/>
+<l:template name="access" text="Available " lang="en"/>
+<l:template name="acctoo" text="Also available " lang="en"/>
+<l:template name="onwww" text="from World Wide Web" lang="en"/>
+<l:template name="oninet" text="from Internet" lang="en"/>
+<l:template name="access.end" text=": " lang="en"/>
+<l:template name="link1" text="&lt;" lang="en"/>
+<l:template name="link2" text="&gt;" lang="en"/>
+<l:template name="access.sep" text=". " lang="en"/>
+<l:template name="isbn" text="ISBN " lang="en"/>
+<l:template name="issn" text="ISSN " lang="en"/>
+<l:template name="stdnum.sep" text=". " lang="en"/>
+<l:template name="patcountry.sep" text=". " lang="en"/>
+<l:template name="pattype.sep" text=", " lang="en"/>
+<l:template name="patnum.sep" text=". " lang="en"/>
+<l:template name="patdate.sep" text=". " lang="en"/>
+</l:context><l:letters><l:l i="-1"/>
+<l:l i="0">İşarələr</l:l>
+<l:l i="1">A</l:l>
+<l:l i="1">a</l:l>
+<l:l i="2">B</l:l>
+<l:l i="2">b</l:l>
+<l:l i="3">C</l:l>
+<l:l i="3">c</l:l>
+<l:l i="4">Ç</l:l>
+<l:l i="5">ç</l:l>
+<l:l i="5">D</l:l>
+<l:l i="5">d</l:l>
+<l:l i="6">E</l:l>
+<l:l i="6">e</l:l>
+<l:l i="7">e</l:l>
+<l:l i="7">e</l:l>
+<l:l i="8">Æ</l:l>
+<l:l i="8">É™</l:l>
+<l:l i="9">G</l:l>
+<l:l i="9">g</l:l>
+<l:l i="10">Äž</l:l>
+<l:l i="10">ÄŸ</l:l>
+<l:l i="11">H</l:l>
+<l:l i="11">h</l:l>
+<l:l i="12">X</l:l>
+<l:l i="12">x</l:l>
+<l:l i="13">I</l:l>
+<l:l i="13">ı</l:l>
+<l:l i="14">Ä°</l:l>
+<l:l i="14">i</l:l>
+<l:l i="15">J</l:l>
+<l:l i="15">j</l:l>
+<l:l i="16">K</l:l>
+<l:l i="16">k</l:l>
+<l:l i="17">Q</l:l>
+<l:l i="17">q</l:l>
+<l:l i="18">L</l:l>
+<l:l i="18">l</l:l>
+<l:l i="19">M</l:l>
+<l:l i="19">m</l:l>
+<l:l i="20">N</l:l>
+<l:l i="20">n</l:l>
+<l:l i="21">O</l:l>
+<l:l i="21">o</l:l>
+<l:l i="22">Ö</l:l>
+<l:l i="22">ö</l:l>
+<l:l i="23">P</l:l>
+<l:l i="23">p</l:l>
+<l:l i="24">R</l:l>
+<l:l i="24">r</l:l>
+<l:l i="25">S</l:l>
+<l:l i="25">s</l:l>
+<l:l i="26">Åž</l:l>
+<l:l i="26">ÅŸ</l:l>
+<l:l i="27">T</l:l>
+<l:l i="27">t</l:l>
+<l:l i="28">U</l:l>
+<l:l i="28">u</l:l>
+<l:l i="29">Ü</l:l>
+<l:l i="29">ü</l:l>
+<l:l i="30">V</l:l>
+<l:l i="30">v</l:l>
+<l:l i="31">Y</l:l>
+<l:l i="31">y</l:l>
+<l:l i="32">Z</l:l>
+<l:l i="32">z</l:l>
+</l:letters>
+</l:l10n>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/bg.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/bg.xml
new file mode 100644
index 0000000..10e379f
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/bg.xml
@@ -0,0 +1,724 @@
+<?xml version="1.0" encoding="utf-8"?>
+<l:l10n xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0" language="bg" english-language-name="Bulgarian">
+
+<!-- * This file is generated automatically. -->
+<!-- * To submit changes to this file upstream (to the DocBook Project) -->
+<!-- * do not submit an edited version of this file. Instead, submit an -->
+<!-- * edited version of the source file at the following location: -->
+<!-- * -->
+<!-- * https://docbook.svn.sourceforge.net/svnroot/docbook/trunk/gentext/locale/bg.xml -->
+<!-- * -->
+<!-- * E-mail the edited bg.xml source file to: -->
+<!-- * -->
+<!-- * docbook-developers@lists.sourceforge.net -->
+
+<!-- ******************************************************************** -->
+
+<!-- This file is part of the XSL DocBook Stylesheet distribution. -->
+<!-- See ../README or http://docbook.sf.net/release/xsl/current/ for -->
+<!-- copyright and other information. -->
+
+<!-- ******************************************************************** -->
+<!-- In these files, % with a letter is used for a placeholder: -->
+<!-- %t is the current element's title -->
+<!-- %s is the current element's subtitle (if applicable)-->
+<!-- %n is the current element's number label-->
+<!-- %p is the current element's page number (if applicable)-->
+<!-- ******************************************************************** -->
+
+
+<l:gentext key="Abstract" text="ÐнотациÑ"/>
+<l:gentext key="abstract" text="анотациÑ"/>
+<l:gentext key="Acknowledgements" text="БлагодарноÑти на"/>
+<l:gentext key="acknowledgements" text="благодарноÑти на"/>
+<l:gentext key="Answer" text="О"/>
+<l:gentext key="answer" text="о"/>
+<l:gentext key="Appendix" text="Приложение"/>
+<l:gentext key="appendix" text="приложение"/>
+<l:gentext key="Article" text="СтатиÑ"/>
+<l:gentext key="article" text="ÑтатиÑ"/>
+<l:gentext key="Author" text="Ðвтор"/>
+<l:gentext key="Bibliography" text="Литература"/>
+<l:gentext key="bibliography" text="литература"/>
+<l:gentext key="Book" text="Книга"/>
+<l:gentext key="book" text="книга"/>
+<l:gentext key="CAUTION" text="Ð’ÐИМÐÐИЕ"/>
+<l:gentext key="Caution" text="Внимание"/>
+<l:gentext key="caution" text="внимание"/>
+<l:gentext key="Chapter" text="Глава"/>
+<l:gentext key="chapter" text="глава"/>
+<l:gentext key="Colophon" text="БиблиографÑко каре"/>
+<l:gentext key="colophon" text="БиблиографÑко каре"/>
+<l:gentext key="Copyright" text="ÐвторÑки права"/>
+<l:gentext key="copyright" text="авторÑки права"/>
+<l:gentext key="Dedication" text="ПоÑвещение"/>
+<l:gentext key="dedication" text="поÑвещение"/>
+<l:gentext key="Edition" text="Издание"/>
+<l:gentext key="edition" text="издание"/>
+<l:gentext key="Editor" text="Редактор"/>
+<l:gentext key="Equation" text="Формула"/>
+<l:gentext key="equation" text="формула"/>
+<l:gentext key="Example" text="Пример"/>
+<l:gentext key="example" text="пример"/>
+<l:gentext key="Figure" text="Фигура"/>
+<l:gentext key="figure" text="фигура"/>
+<l:gentext key="Glossary" text="Терминологичен речник"/>
+<l:gentext key="glossary" text="терминологичен речник"/>
+<l:gentext key="GlossSee" text="Вж."/>
+<l:gentext key="glosssee" text="вж."/>
+<l:gentext key="GlossSeeAlso" text="Вж."/>
+<l:gentext key="glossseealso" text="вж."/>
+<l:gentext key="IMPORTANT" text="Ð’ÐЖÐО"/>
+<l:gentext key="important" text="важно"/>
+<l:gentext key="Important" text="Важно"/>
+<l:gentext key="Index" text="Ðзбучен указател"/>
+<l:gentext key="index" text="азбучен указател"/>
+<l:gentext key="ISBN" text="ISBN"/>
+<l:gentext key="isbn" text="ISBN"/>
+<l:gentext key="LegalNotice" text="ÐвторÑки права"/>
+<l:gentext key="legalnotice" text="авторÑки права"/>
+<l:gentext key="MsgAud" text="ÐаÑоченоÑÑ‚"/>
+<l:gentext key="msgaud" text="наÑоченоÑÑ‚"/>
+<l:gentext key="MsgLevel" text="Ðиво"/>
+<l:gentext key="msglevel" text="ниво"/>
+<l:gentext key="MsgOrig" text="Източник"/>
+<l:gentext key="msgorig" text="източник"/>
+<l:gentext key="NOTE" text="ЗÐБЕЛЕЖКÐ"/>
+<l:gentext key="Note" text="Забележка"/>
+<l:gentext key="note" text="забележка"/>
+<l:gentext key="Part" text="ЧаÑÑ‚"/>
+<l:gentext key="part" text="чаÑÑ‚"/>
+<l:gentext key="Preface" text="Предговор"/>
+<l:gentext key="preface" text="предговор"/>
+<l:gentext key="Procedure" text="Процедура"/>
+<l:gentext key="procedure" text="процедура"/>
+<l:gentext key="ProductionSet" text="ПродукциÑ"/>
+<l:gentext key="PubDate" text="Дата на издаване"/>
+<l:gentext key="pubdate" text="дата на издаване"/>
+<l:gentext key="Published" text="Издаден"/>
+<l:gentext key="published" text="издаден"/>
+<l:gentext key="Publisher" text="Издател"/>
+<l:gentext key="Qandadiv" text="ВъпроÑи и отговори"/>
+<l:gentext key="qandadiv" text="въпроÑи и отговори"/>
+<l:gentext key="QandASet" text="ЧеÑто задавани въпроÑи"/>
+<l:gentext key="Question" text="Ð’"/>
+<l:gentext key="question" text="в"/>
+<l:gentext key="RefEntry" text="Страница"/>
+<l:gentext key="refentry" text="Ñтраница"/>
+<l:gentext key="Reference" text="Справочник"/>
+<l:gentext key="reference" text="Ñправочник"/>
+<l:gentext key="References" text="Препратки"/>
+<l:gentext key="RefName" text="Ðазвание"/>
+<l:gentext key="refname" text="название"/>
+<l:gentext key="RefSection" text="Раздел"/>
+<l:gentext key="refsection" text="раздел"/>
+<l:gentext key="RefSynopsisDiv" text="СинтакÑиÑ"/>
+<l:gentext key="refsynopsisdiv" text="ÑинтакÑиÑ"/>
+<l:gentext key="RevHistory" text="Промени"/>
+<l:gentext key="revhistory" text="промени"/>
+<l:gentext key="revision" text="издание"/>
+<l:gentext key="Revision" text="издание"/>
+<l:gentext key="sect1" text="Раздел"/>
+<l:gentext key="sect2" text="Раздел"/>
+<l:gentext key="sect3" text="Раздел"/>
+<l:gentext key="sect4" text="Раздел"/>
+<l:gentext key="sect5" text="Раздел"/>
+<l:gentext key="section" text="раздел"/>
+<l:gentext key="Section" text="Раздел"/>
+<l:gentext key="see" text="вж."/>
+<l:gentext key="See" text="Вж."/>
+<l:gentext key="seealso" text="вж."/>
+<l:gentext key="Seealso" text="Вж."/>
+<l:gentext key="SeeAlso" text="Вж."/>
+<l:gentext key="set" text="група"/>
+<l:gentext key="Set" text="Група"/>
+<l:gentext key="setindex" text="указател"/>
+<l:gentext key="SetIndex" text="Указател"/>
+<l:gentext key="Sidebar" text="Разделител"/>
+<l:gentext key="sidebar" text="разделител"/>
+<l:gentext key="step" text="Ñтъпка"/>
+<l:gentext key="Step" text="Стъпка"/>
+<l:gentext key="table" text="таблица"/>
+<l:gentext key="Table" text="Таблица"/>
+<l:gentext key="task" text="задача"/>
+<l:gentext key="Task" text="Задача"/>
+<l:gentext key="tip" text="подÑказка"/>
+<l:gentext key="TIP" text="ПОДСКÐЗКÐ"/>
+<l:gentext key="Tip" text="ПодÑказка"/>
+<l:gentext key="Warning" text="Внимание"/>
+<l:gentext key="warning" text="внимание"/>
+<l:gentext key="WARNING" text="Ð’ÐИМÐÐИЕ"/>
+<l:gentext key="and" text="и"/>
+<l:gentext key="by" text="от"/>
+<l:gentext key="Edited" text="Редактирано от"/>
+<l:gentext key="edited" text="редактирано от"/>
+<l:gentext key="Editedby" text="Редактирано от"/>
+<l:gentext key="editedby" text="редактирано от"/>
+<l:gentext key="in" text="в"/>
+<l:gentext key="lastlistcomma" text=","/>
+<l:gentext key="listcomma" text=","/>
+<l:gentext key="notes" text="забележки"/>
+<l:gentext key="Notes" text="Забележки"/>
+<l:gentext key="Pgs" text="Стр."/>
+<l:gentext key="pgs" text="ÑÑ‚Ñ€."/>
+<l:gentext key="Revisedby" text="Преработено от"/>
+<l:gentext key="revisedby" text="преработено от"/>
+<l:gentext key="TableNotes" text="Забележки"/>
+<l:gentext key="tablenotes" text="забележки"/>
+<l:gentext key="TableofContents" text="Съдържание"/>
+<l:gentext key="tableofcontents" text="Ñъдържание"/>
+<l:gentext key="unexpectedelementname" text="неочакван елемент"/>
+<l:gentext key="unsupported" text="неподдържан елемент"/>
+<l:gentext key="xrefto" text="вж."/>
+<l:gentext key="Authors" text="Ðвтори"/>
+<l:gentext key="copyeditor" text="Редактор"/>
+<l:gentext key="graphicdesigner" text="Ðвтор на графичното оформление"/>
+<l:gentext key="productioneditor" text="Редактор на изданието"/>
+<l:gentext key="technicaleditor" text="ТехничеÑки редактор"/>
+<l:gentext key="translator" text="Преводач"/>
+<l:gentext key="listofequations" text="ÑпиÑък на формулите"/>
+<l:gentext key="ListofEquations" text="СпиÑък на формулите"/>
+<l:gentext key="ListofExamples" text="СпиÑък на примерите"/>
+<l:gentext key="listofexamples" text="ÑпиÑък на примерите"/>
+<l:gentext key="ListofFigures" text="СпиÑък на фигурите"/>
+<l:gentext key="listoffigures" text="ÑпиÑък на фигурите"/>
+<l:gentext key="ListofProcedures" text="СпиÑък на процедурите"/>
+<l:gentext key="listofprocedures" text="ÑпиÑък на процедурите"/>
+<l:gentext key="listoftables" text="ÑпиÑък на таблиците"/>
+<l:gentext key="ListofTables" text="СпиÑък на таблиците"/>
+<l:gentext key="ListofUnknown" text="СпиÑък Ñ Ð´Ñ€ÑƒÐ³Ð¸ неща"/>
+<l:gentext key="listofunknown" text="ÑпиÑък Ñ Ð´Ñ€ÑƒÐ³Ð¸ неща"/>
+<l:gentext key="nav-home" text="Ðачало"/>
+<l:gentext key="nav-next" text="Ðапред"/>
+<l:gentext key="nav-next-sibling" text="ПреÑкачане напред"/>
+<l:gentext key="nav-prev" text="Ðазад"/>
+<l:gentext key="nav-prev-sibling" text="ПреÑкачане назад"/>
+<l:gentext key="nav-up" text="Ðиво нагоре"/>
+<l:gentext key="nav-toc" text="Съдържание"/>
+<l:gentext key="Draft" text="Чернова"/>
+<l:gentext key="above" text="по-горе"/>
+<l:gentext key="below" text="по-долу"/>
+<l:gentext key="sectioncalled" text="разделът ÑÑŠÑ Ð·Ð°Ð³Ð»Ð°Ð²Ð¸Ðµ"/>
+<l:gentext key="index symbols" text="Ñимволи"/>
+<l:gentext key="writing-mode" text="lr-tb"/>
+<l:gentext key="lowercase.alpha" text="абвгдежзийклмнопрÑтуфхцчшщъыьÑÑŽÑ"/>
+<l:gentext key="uppercase.alpha" text="ÐБВГДЕЖЗИЙКЛМÐОПРСТУФХЦЧШЩЪЫЬЭЮЯ"/>
+<l:gentext key="normalize.sort.input" text="AaÀàÃáÂâÃãÄäÅåĀÄĂ㥹ÇǎǞǟǠǡǺǻȀÈȂȃȦȧḀá¸áºšáº áº¡áº¢áº£áº¤áº¥áº¦áº§áº¨áº©áºªáº«áº¬áº­áº®áº¯áº°áº±áº²áº³áº´áºµáº¶áº·BbÆ€ÆɓƂƃḂḃḄḅḆḇCcÇçĆćĈĉĊċČÄƇƈɕḈḉDdÄŽÄÄđƊɗƋƌDžDzȡɖḊḋḌá¸á¸Žá¸á¸á¸‘ḒḓEeÈèÉéÊêËëĒēĔĕĖėĘęĚěȄȅȆȇȨȩḔḕḖḗḘḙḚḛḜá¸áº¸áº¹áººáº»áº¼áº½áº¾áº¿á»€á»á»‚ểỄễỆệFfƑƒḞḟGgÄœÄĞğĠġĢģƓɠǤǥǦǧǴǵḠḡHhĤĥĦħȞȟɦḢḣḤḥḦḧḨḩḪḫẖIiÌìÃíÎîÃïĨĩĪīĬĭĮįİƗɨÇÇȈȉȊȋḬḭḮḯỈỉỊịJjĴĵǰÊKkĶķƘƙǨǩḰḱḲḳḴḵLlĹĺĻļĽľĿŀÅłƚLjȴɫɬɭḶḷḸḹḺḻḼḽMmɱḾḿṀá¹á¹‚ṃNnÑñŃńŅņŇňÆɲƞȠNjǸǹȵɳṄṅṆṇṈṉṊṋOoÒòÓóÔôÕõÖöØøŌÅÅŽÅÅőƟƠơǑǒǪǫǬǭǾǿȌÈÈŽÈȪȫȬȭȮȯȰȱṌá¹á¹Žá¹á¹á¹‘ṒṓỌá»á»Žá»á»á»‘ỒồỔổỖỗỘộỚớỜá»á»žá»Ÿá» á»¡á»¢á»£PpƤƥṔṕṖṗQqÊ RrŔŕŖŗŘřÈȑȒȓɼɽɾṘṙṚṛṜá¹á¹žá¹ŸSsŚśŜÅŞşŠšȘșʂṠṡṢṣṤṥṦṧṨṩTtŢţŤťŦŧƫƬƭƮʈȚțȶṪṫṬṭṮṯṰṱẗUuÙùÚúÛûÜüŨũŪūŬŭŮůŰűŲųƯưǓǔǕǖǗǘǙǚǛǜȔȕȖȗṲṳṴṵṶṷṸṹṺṻỤụỦủỨứỪừỬửỮữỰựVvƲʋṼṽṾṿWwŴŵẀáºáº‚ẃẄẅẆẇẈẉẘXxẊẋẌáºYyÃýÿŸŶŷƳƴȲȳẎáºáº™á»²á»³á»´á»µá»¶á»·á»¸á»¹ZzŹźŻżŽžƵƶȤȥÊÊ‘áºáº‘ẒẓẔẕẕ" lang="en"/>
+<l:gentext key="normalize.sort.output" text="AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBCCCCCCCCCCCCCCCCCDDDDDDDDDDDDDDDDDDDDDDDDEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEFFFFFFGGGGGGGGGGGGGGGGGGGGHHHHHHHHHHHHHHHHHHHHIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIJJJJJJKKKKKKKKKKKKKKLLLLLLLLLLLLLLLLLLLLLLLLLLMMMMMMMMMNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOPPPPPPPPQQQRRRRRRRRRRRRRRRRRRRRRRRSSSSSSSSSSSSSSSSSSSSSSSTTTTTTTTTTTTTTTTTTTTTTTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUVVVVVVVVWWWWWWWWWWWWWWWXXXXXXYYYYYYYYYYYYYYYYYYYYYYYZZZZZZZZZZZZZZZZZZZZZ" lang="en"/>
+<l:dingbat key="startquote" text="„"/>
+<l:dingbat key="endquote" text="“"/>
+<l:dingbat key="nestedstartquote" text="„"/>
+<l:dingbat key="nestedendquote" text="“"/>
+<l:dingbat key="singlestartquote" text="«"/>
+<l:dingbat key="singleendquote" text="»"/>
+<l:dingbat key="bullet" text="—"/>
+<l:gentext key="hyphenation-character" text="-"/>
+<l:gentext key="hyphenation-push-character-count" text="2"/>
+<l:gentext key="hyphenation-remain-character-count" text="2"/>
+<l:context name="styles"><l:template name="person-name" text="first-last"/>
+</l:context>
+<l:context name="title"><l:template name="abstract" text="%t"/>
+<l:template name="acknowledgements" text="%t" lang="en"/>
+<l:template name="answer" text="%t"/>
+<l:template name="appendix" text="Приложение %n. %t"/>
+<l:template name="article" text="%t"/>
+<l:template name="authorblurb" text="%t"/>
+<l:template name="bibliodiv" text="%t"/>
+<l:template name="biblioentry" text="%t"/>
+<l:template name="bibliography" text="%t"/>
+<l:template name="bibliolist" text="%t"/>
+<l:template name="bibliomixed" text="%t"/>
+<l:template name="bibliomset" text="%t"/>
+<l:template name="biblioset" text="%t"/>
+<l:template name="blockquote" text="%t"/>
+<l:template name="book" text="%t"/>
+<l:template name="calloutlist" text="%t"/>
+<l:template name="caution" text="%t"/>
+<l:template name="chapter" text="Глава %n. %t"/>
+<l:template name="colophon" text="%t"/>
+<l:template name="dedication" text="%t"/>
+<l:template name="equation" text="Формула %n. %t"/>
+<l:template name="example" text="Пример %n. %t"/>
+<l:template name="figure" text="Фигура %n. %t"/>
+<l:template name="foil" text="%t"/>
+<l:template name="foilgroup" text="%t"/>
+<l:template name="formalpara" text="%t"/>
+<l:template name="glossary" text="%t"/>
+<l:template name="glossdiv" text="%t"/>
+<l:template name="glosslist" text="%t"/>
+<l:template name="glossentry" text="%t"/>
+<l:template name="important" text="%t"/>
+<l:template name="index" text="%t"/>
+<l:template name="indexdiv" text="%t"/>
+<l:template name="itemizedlist" text="%t"/>
+<l:template name="legalnotice" text="%t"/>
+<l:template name="listitem" text=""/>
+<l:template name="lot" text="%t"/>
+<l:template name="msg" text="%t"/>
+<l:template name="msgexplan" text="%t"/>
+<l:template name="msgmain" text="%t"/>
+<l:template name="msgrel" text="%t"/>
+<l:template name="msgset" text="%t"/>
+<l:template name="msgsub" text="%t"/>
+<l:template name="note" text="%t"/>
+<l:template name="orderedlist" text="%t"/>
+<l:template name="part" text="ЧаÑт %n. %t"/>
+<l:template name="partintro" text="%t"/>
+<l:template name="preface" text="%t"/>
+<l:template name="procedure" text="%t"/>
+<l:template name="procedure.formal" text="Процедура %n. %t"/>
+<l:template name="productionset" text="%t"/>
+<l:template name="productionset.formal" text="ПродукциÑ %n"/>
+<l:template name="qandadiv" text="%t"/>
+<l:template name="qandaentry" text="%t"/>
+<l:template name="qandaset" text="%t"/>
+<l:template name="question" text="%t"/>
+<l:template name="refentry" text="%t"/>
+<l:template name="reference" text="%t"/>
+<l:template name="refsection" text="%t"/>
+<l:template name="refsect1" text="%t"/>
+<l:template name="refsect2" text="%t"/>
+<l:template name="refsect3" text="%t"/>
+<l:template name="refsynopsisdiv" text="%t"/>
+<l:template name="refsynopsisdivinfo" text="%t"/>
+<l:template name="segmentedlist" text="%t"/>
+<l:template name="set" text="%t"/>
+<l:template name="setindex" text="%t"/>
+<l:template name="sidebar" text="%t"/>
+<l:template name="step" text="%t"/>
+<l:template name="table" text="Таблица %n. %t"/>
+<l:template name="task" text="%t"/>
+<l:template name="tasksummary" text="%t"/>
+<l:template name="taskprerequisites" text="%t"/>
+<l:template name="taskrelated" text="%t"/>
+<l:template name="tip" text="%t"/>
+<l:template name="toc" text="%t"/>
+<l:template name="variablelist" text="%t"/>
+<l:template name="varlistentry" text=""/>
+<l:template name="warning" text="%t"/>
+</l:context>
+<l:context name="title-unnumbered"><l:template name="appendix" text="%t"/>
+<l:template name="article/appendix" text="%t"/>
+<l:template name="bridgehead" text="%t"/>
+<l:template name="chapter" text="%t"/>
+<l:template name="sect1" text="%t"/>
+<l:template name="sect2" text="%t"/>
+<l:template name="sect3" text="%t"/>
+<l:template name="sect4" text="%t"/>
+<l:template name="sect5" text="%t"/>
+<l:template name="section" text="%t"/>
+<l:template name="simplesect" text="%t"/>
+<l:template name="part" text="%t"/>
+</l:context>
+<l:context name="title-numbered"><l:template name="appendix" text="Приложение %n. %t"/>
+<l:template name="article/appendix" text="%n. %t"/>
+<l:template name="bridgehead" text="%n. %t"/>
+<l:template name="chapter" text="Глава %n. %t"/>
+<l:template name="part" text="ЧаÑт %n. %t"/>
+<l:template name="sect1" text="%n. %t"/>
+<l:template name="sect2" text="%n. %t"/>
+<l:template name="sect3" text="%n. %t"/>
+<l:template name="sect4" text="%n. %t"/>
+<l:template name="sect5" text="%n. %t"/>
+<l:template name="section" text="%n. %t"/>
+<l:template name="simplesect" text="%t"/>
+</l:context>
+<l:context name="subtitle"><l:template name="appendix" text="%s"/>
+<l:template name="acknowledgements" text="%s" lang="en"/>
+<l:template name="article" text="%s"/>
+<l:template name="bibliodiv" text="%s"/>
+<l:template name="biblioentry" text="%s"/>
+<l:template name="bibliography" text="%s"/>
+<l:template name="bibliomixed" text="%s"/>
+<l:template name="bibliomset" text="%s"/>
+<l:template name="biblioset" text="%s"/>
+<l:template name="book" text="%s"/>
+<l:template name="chapter" text="%s"/>
+<l:template name="colophon" text="%s"/>
+<l:template name="dedication" text="%s"/>
+<l:template name="glossary" text="%s"/>
+<l:template name="glossdiv" text="%s"/>
+<l:template name="index" text="%s"/>
+<l:template name="indexdiv" text="%s"/>
+<l:template name="lot" text="%s"/>
+<l:template name="part" text="%s"/>
+<l:template name="partintro" text="%s"/>
+<l:template name="preface" text="%s"/>
+<l:template name="refentry" text="%s"/>
+<l:template name="reference" text="%s"/>
+<l:template name="refsection" text="%s"/>
+<l:template name="refsect1" text="%s"/>
+<l:template name="refsect2" text="%s"/>
+<l:template name="refsect3" text="%s"/>
+<l:template name="refsynopsisdiv" text="%s"/>
+<l:template name="sect1" text="%s"/>
+<l:template name="sect2" text="%s"/>
+<l:template name="sect3" text="%s"/>
+<l:template name="sect4" text="%s"/>
+<l:template name="sect5" text="%s"/>
+<l:template name="section" text="%s"/>
+<l:template name="set" text="%s"/>
+<l:template name="setindex" text="%s"/>
+<l:template name="sidebar" text="%s"/>
+<l:template name="simplesect" text="%s"/>
+<l:template name="toc" text="%s"/>
+</l:context>
+<l:context name="xref"><l:template name="abstract" text="%t"/>
+<l:template name="acknowledgements" text="%t" lang="en"/>
+<l:template name="answer" text="О. %n"/>
+<l:template name="appendix" text="%t"/>
+<l:template name="article" text="%t"/>
+<l:template name="authorblurb" text="%t"/>
+<l:template name="bibliodiv" text="%t"/>
+<l:template name="bibliography" text="%t"/>
+<l:template name="bibliomset" text="%t"/>
+<l:template name="biblioset" text="%t"/>
+<l:template name="blockquote" text="%t"/>
+<l:template name="book" text="%t"/>
+<l:template name="calloutlist" text="%t"/>
+<l:template name="caution" text="%t"/>
+<l:template name="chapter" text="%t"/>
+<l:template name="colophon" text="%t"/>
+<l:template name="constraintdef" text="%t"/>
+<l:template name="dedication" text="%t"/>
+<l:template name="equation" text="%t"/>
+<l:template name="example" text="%t"/>
+<l:template name="figure" text="%t"/>
+<l:template name="foil" text="%t"/>
+<l:template name="foilgroup" text="%t"/>
+<l:template name="formalpara" text="%t"/>
+<l:template name="glossary" text="%t"/>
+<l:template name="glossdiv" text="%t"/>
+<l:template name="important" text="%t"/>
+<l:template name="index" text="%t"/>
+<l:template name="indexdiv" text="%t"/>
+<l:template name="itemizedlist" text="%t"/>
+<l:template name="legalnotice" text="%t"/>
+<l:template name="listitem" text="%n"/>
+<l:template name="lot" text="%t"/>
+<l:template name="msg" text="%t"/>
+<l:template name="msgexplan" text="%t"/>
+<l:template name="msgmain" text="%t"/>
+<l:template name="msgrel" text="%t"/>
+<l:template name="msgset" text="%t"/>
+<l:template name="msgsub" text="%t"/>
+<l:template name="note" text="%t"/>
+<l:template name="orderedlist" text="%t"/>
+<l:template name="part" text="%t"/>
+<l:template name="partintro" text="%t"/>
+<l:template name="preface" text="%t"/>
+<l:template name="procedure" text="%t"/>
+<l:template name="productionset" text="%t"/>
+<l:template name="qandadiv" text="%t"/>
+<l:template name="qandaentry" text="В. %n"/>
+<l:template name="qandaset" text="%t"/>
+<l:template name="question" text="В. %n"/>
+<l:template name="reference" text="%t"/>
+<l:template name="refsynopsisdiv" text="%t"/>
+<l:template name="segmentedlist" text="%t"/>
+<l:template name="set" text="%t"/>
+<l:template name="setindex" text="%t"/>
+<l:template name="sidebar" text="%t"/>
+<l:template name="table" text="%t"/>
+<l:template name="task" text="%t"/>
+<l:template name="tip" text="%t"/>
+<l:template name="toc" text="%t"/>
+<l:template name="variablelist" text="%t"/>
+<l:template name="varlistentry" text="%n"/>
+<l:template name="warning" text="%t"/>
+<l:template name="olink.document.citation" text=" in %o"/>
+<l:template name="olink.page.citation" text=" (page %p)"/>
+<l:template name="page.citation" text=" [%p]"/>
+<l:template name="page" text="(page %p)"/>
+<l:template name="docname" text=" in %o"/>
+<l:template name="docnamelong" text=" in the document titled %o"/>
+<l:template name="pageabbrev" text="(p. %p)"/>
+<l:template name="Page" text="Page %p"/>
+<l:template name="bridgehead" text="разделът ÑÑŠÑ Ð·Ð°Ð³Ð»Ð°Ð²Ð¸Ðµ „%t“"/>
+<l:template name="refsection" text="разделът ÑÑŠÑ Ð·Ð°Ð³Ð»Ð°Ð²Ð¸Ðµ „%t“"/>
+<l:template name="refsect1" text="разделът ÑÑŠÑ Ð·Ð°Ð³Ð»Ð°Ð²Ð¸Ðµ „%t“"/>
+<l:template name="refsect2" text="разделът ÑÑŠÑ Ð·Ð°Ð³Ð»Ð°Ð²Ð¸Ðµ „%t“"/>
+<l:template name="refsect3" text="разделът ÑÑŠÑ Ð·Ð°Ð³Ð»Ð°Ð²Ð¸Ðµ „%t“"/>
+<l:template name="sect1" text="разделът ÑÑŠÑ Ð·Ð°Ð³Ð»Ð°Ð²Ð¸Ðµ „%t“"/>
+<l:template name="sect2" text="разделът ÑÑŠÑ Ð·Ð°Ð³Ð»Ð°Ð²Ð¸Ðµ „%t“"/>
+<l:template name="sect3" text="разделът ÑÑŠÑ Ð·Ð°Ð³Ð»Ð°Ð²Ð¸Ðµ „%t“"/>
+<l:template name="sect4" text="разделът ÑÑŠÑ Ð·Ð°Ð³Ð»Ð°Ð²Ð¸Ðµ „%t“"/>
+<l:template name="sect5" text="разделът ÑÑŠÑ Ð·Ð°Ð³Ð»Ð°Ð²Ð¸Ðµ „%t“"/>
+<l:template name="section" text="разделът ÑÑŠÑ Ð·Ð°Ð³Ð»Ð°Ð²Ð¸Ðµ „%t“"/>
+<l:template name="simplesect" text="разделът ÑÑŠÑ Ð·Ð°Ð³Ð»Ð°Ð²Ð¸Ðµ „%t“"/>
+</l:context>
+<l:context name="xref-number"><l:template name="answer" text="О. %n"/>
+<l:template name="appendix" text="Приложение %n"/>
+<l:template name="bridgehead" text="Раздел %n"/>
+<l:template name="chapter" text="Глава %n"/>
+<l:template name="equation" text="Формула %n"/>
+<l:template name="example" text="Пример %n"/>
+<l:template name="figure" text="Фигура %n"/>
+<l:template name="part" text="ЧаÑт %n"/>
+<l:template name="procedure" text="Процедура %n"/>
+<l:template name="productionset" text="ПродукциÑ %n"/>
+<l:template name="qandadiv" text="ВъпроÑи и отговори %n"/>
+<l:template name="qandaentry" text="В. %n"/>
+<l:template name="question" text="В. %n"/>
+<l:template name="sect1" text="Раздел %n"/>
+<l:template name="sect2" text="Раздел %n"/>
+<l:template name="sect3" text="Раздел %n"/>
+<l:template name="sect4" text="Раздел %n"/>
+<l:template name="sect5" text="Раздел %n"/>
+<l:template name="section" text="Раздел %n"/>
+<l:template name="table" text="Таблица %n"/>
+</l:context>
+<l:context name="xref-number-and-title"><l:template name="appendix" text="Приложение %n, %t"/>
+<l:template name="bridgehead" text="Раздел %n, „%t“"/>
+<l:template name="chapter" text="Глава %n, %t"/>
+<l:template name="equation" text="Формула %n, „%t“"/>
+<l:template name="example" text="Пример %n, „%t“"/>
+<l:template name="figure" text="Фигура %n, „%t“"/>
+<l:template name="part" text="ЧаÑт %n, „%t“"/>
+<l:template name="procedure" text="Процедура %n, „%t“"/>
+<l:template name="productionset" text="ПродукциÑ %n, „%t“"/>
+<l:template name="qandadiv" text="ВъпроÑи и отговори %n, „%t“"/>
+<l:template name="refsect1" text="разделът ÑÑŠÑ Ð·Ð°Ð³Ð»Ð°Ð²Ð¸Ðµ „%t“"/>
+<l:template name="refsect2" text="разделът ÑÑŠÑ Ð·Ð°Ð³Ð»Ð°Ð²Ð¸Ðµ „%t“"/>
+<l:template name="refsect3" text="разделът ÑÑŠÑ Ð·Ð°Ð³Ð»Ð°Ð²Ð¸Ðµ „%t“"/>
+<l:template name="refsection" text="разделът ÑÑŠÑ Ð·Ð°Ð³Ð»Ð°Ð²Ð¸Ðµ „%t“"/>
+<l:template name="sect1" text="Раздел %n, „%t“"/>
+<l:template name="sect2" text="Раздел %n, „%t“"/>
+<l:template name="sect3" text="Раздел %n, „%t“"/>
+<l:template name="sect4" text="Раздел %n, „%t“"/>
+<l:template name="sect5" text="Раздел %n, „%t“"/>
+<l:template name="section" text="Раздел %n, „%t“"/>
+<l:template name="simplesect" text="разделът ÑÑŠÑ Ð·Ð°Ð³Ð»Ð°Ð²Ð¸Ðµ „%t“"/>
+<l:template name="table" text="Таблица %n, „%t“"/>
+</l:context>
+<l:context name="authorgroup"><l:template name="sep" text=", "/>
+<l:template name="sep2" text=" и "/>
+<l:template name="seplast" text=" и "/>
+</l:context>
+<l:context name="glossary"><l:template name="see" text="Вж. %t."/>
+<l:template name="seealso" text="Вж. %t."/>
+<l:template name="seealso-separator" text=", "/>
+</l:context>
+<l:context name="msgset"><l:template name="MsgAud" text="ÐаÑоченоÑÑ‚: "/>
+<l:template name="MsgLevel" text="Ðиво: "/>
+<l:template name="MsgOrig" text="Източник: "/>
+</l:context>
+<l:context name="datetime"><l:template name="format" text="d.m.Y г."/>
+</l:context>
+<l:context name="termdef"><l:template name="prefix" text="[Definition: "/>
+<l:template name="suffix" text="]"/>
+</l:context>
+<l:context name="datetime-full"><l:template name="January" text="Ñнуари"/>
+<l:template name="February" text="февруари"/>
+<l:template name="March" text="март"/>
+<l:template name="April" text="април"/>
+<l:template name="May" text="май"/>
+<l:template name="June" text="юни"/>
+<l:template name="July" text="юли"/>
+<l:template name="August" text="авгуÑÑ‚"/>
+<l:template name="September" text="Ñептември"/>
+<l:template name="October" text="октомври"/>
+<l:template name="November" text="ноември"/>
+<l:template name="December" text="декември"/>
+<l:template name="Monday" text="понеделник"/>
+<l:template name="Tuesday" text="вторник"/>
+<l:template name="Wednesday" text="ÑÑ€Ñда"/>
+<l:template name="Thursday" text="четвъртък"/>
+<l:template name="Friday" text="петък"/>
+<l:template name="Saturday" text="Ñъбота"/>
+<l:template name="Sunday" text="неделÑ"/>
+</l:context>
+<l:context name="datetime-abbrev"><l:template name="Jan" text="Ñн."/>
+<l:template name="Feb" text="фев."/>
+<l:template name="Mar" text="март"/>
+<l:template name="Apr" text="апр."/>
+<l:template name="May" text="май"/>
+<l:template name="Jun" text="юни"/>
+<l:template name="Jul" text="юли"/>
+<l:template name="Aug" text="авг."/>
+<l:template name="Sep" text="Ñеп."/>
+<l:template name="Oct" text="окт."/>
+<l:template name="Nov" text="ноем."/>
+<l:template name="Dec" text="дек."/>
+<l:template name="Mon" text="пон."/>
+<l:template name="Tue" text="вт."/>
+<l:template name="Wed" text="ÑÑ€."/>
+<l:template name="Thu" text="чет."/>
+<l:template name="Fri" text="пет."/>
+<l:template name="Sat" text="Ñъб."/>
+<l:template name="Sun" text="нед."/>
+</l:context>
+<l:context name="htmlhelp"><l:template name="langcode" text="0x0402 Bulgarian"/>
+</l:context>
+<l:context name="index"><l:template name="term-separator" text=", "/>
+<l:template name="number-separator" text=", "/>
+<l:template name="range-separator" text="—"/>
+</l:context>
+<l:context name="iso690"><l:template name="lastfirst.sep" text=", " lang="en"/>
+<l:template name="alt.person.two.sep" text=" – " lang="en"/>
+<l:template name="alt.person.last.sep" text=" – " lang="en"/>
+<l:template name="alt.person.more.sep" text=" – " lang="en"/>
+<l:template name="primary.editor" text=" (ed.)" lang="en"/>
+<l:template name="primary.many" text=", et al." lang="en"/>
+<l:template name="primary.sep" text=". " lang="en"/>
+<l:template name="submaintitle.sep" text=": " lang="en"/>
+<l:template name="title.sep" text=". " lang="en"/>
+<l:template name="othertitle.sep" text=", " lang="en"/>
+<l:template name="medium1" text=" [" lang="en"/>
+<l:template name="medium2" text="]" lang="en"/>
+<l:template name="secondary.person.sep" text="; " lang="en"/>
+<l:template name="secondary.sep" text=". " lang="en"/>
+<l:template name="respons.sep" text=". " lang="en"/>
+<l:template name="edition.sep" text=". " lang="en"/>
+<l:template name="edition.serial.sep" text=", " lang="en"/>
+<l:template name="issuing.range" text="-" lang="en"/>
+<l:template name="issuing.div" text=", " lang="en"/>
+<l:template name="issuing.sep" text=". " lang="en"/>
+<l:template name="partnr.sep" text=". " lang="en"/>
+<l:template name="placepubl.sep" text=": " lang="en"/>
+<l:template name="publyear.sep" text=", " lang="en"/>
+<l:template name="pubinfo.sep" text=". " lang="en"/>
+<l:template name="spec.pubinfo.sep" text=", " lang="en"/>
+<l:template name="upd.sep" text=", " lang="en"/>
+<l:template name="datecit1" text=" [cited " lang="en"/>
+<l:template name="datecit2" text="]" lang="en"/>
+<l:template name="extent.sep" text=". " lang="en"/>
+<l:template name="locs.sep" text=", " lang="en"/>
+<l:template name="location.sep" text=". " lang="en"/>
+<l:template name="serie.sep" text=". " lang="en"/>
+<l:template name="notice.sep" text=". " lang="en"/>
+<l:template name="access" text="Available " lang="en"/>
+<l:template name="acctoo" text="Also available " lang="en"/>
+<l:template name="onwww" text="from World Wide Web" lang="en"/>
+<l:template name="oninet" text="from Internet" lang="en"/>
+<l:template name="access.end" text=": " lang="en"/>
+<l:template name="link1" text="&lt;" lang="en"/>
+<l:template name="link2" text="&gt;" lang="en"/>
+<l:template name="access.sep" text=". " lang="en"/>
+<l:template name="isbn" text="ISBN " lang="en"/>
+<l:template name="issn" text="ISSN " lang="en"/>
+<l:template name="stdnum.sep" text=". " lang="en"/>
+<l:template name="patcountry.sep" text=". " lang="en"/>
+<l:template name="pattype.sep" text=", " lang="en"/>
+<l:template name="patnum.sep" text=". " lang="en"/>
+<l:template name="patdate.sep" text=". " lang="en"/>
+</l:context><l:letters><l:l i="-1"/>
+<l:l i="0">Цифри и знаци</l:l>
+<l:l i="10">Ð</l:l>
+<l:l i="10">а</l:l>
+<l:l i="20">Б</l:l>
+<l:l i="20">б</l:l>
+<l:l i="30">Ð’</l:l>
+<l:l i="30">в</l:l>
+<l:l i="40">Г</l:l>
+<l:l i="40">г</l:l>
+<l:l i="50">Д</l:l>
+<l:l i="50">д</l:l>
+<l:l i="60">Е</l:l>
+<l:l i="60">е</l:l>
+<l:l i="70">Ж</l:l>
+<l:l i="70">ж</l:l>
+<l:l i="80">З</l:l>
+<l:l i="80">з</l:l>
+<l:l i="90">И</l:l>
+<l:l i="90">и</l:l>
+<l:l i="100">Й</l:l>
+<l:l i="100">й</l:l>
+<l:l i="110">К</l:l>
+<l:l i="110">к</l:l>
+<l:l i="120">Л</l:l>
+<l:l i="120">л</l:l>
+<l:l i="130">М</l:l>
+<l:l i="130">м</l:l>
+<l:l i="140">Ð</l:l>
+<l:l i="140">н</l:l>
+<l:l i="150">О</l:l>
+<l:l i="150">о</l:l>
+<l:l i="160">П</l:l>
+<l:l i="160">п</l:l>
+<l:l i="170">Р</l:l>
+<l:l i="170">Ñ€</l:l>
+<l:l i="180">С</l:l>
+<l:l i="180">Ñ</l:l>
+<l:l i="190">Т</l:l>
+<l:l i="190">Ñ‚</l:l>
+<l:l i="200">У</l:l>
+<l:l i="200">у</l:l>
+<l:l i="210">Ф</l:l>
+<l:l i="210">Ñ„</l:l>
+<l:l i="220">Ð¥</l:l>
+<l:l i="220">Ñ…</l:l>
+<l:l i="230">Ц</l:l>
+<l:l i="230">ц</l:l>
+<l:l i="240">Ч</l:l>
+<l:l i="240">ч</l:l>
+<l:l i="250">Ш</l:l>
+<l:l i="250">ш</l:l>
+<l:l i="260">Щ</l:l>
+<l:l i="260">щ</l:l>
+<l:l i="270">Ъ</l:l>
+<l:l i="270">ÑŠ</l:l>
+<l:l i="280">Ь</l:l>
+<l:l i="280">ь</l:l>
+<l:l i="290">Ю</l:l>
+<l:l i="290">ÑŽ</l:l>
+<l:l i="300">Я</l:l>
+<l:l i="300">Ñ</l:l>
+<l:l i="310">Э</l:l>
+<l:l i="310">Ñ</l:l>
+<l:l i="320">Ы</l:l>
+<l:l i="320">Ñ‹</l:l>
+<l:l i="410">A</l:l>
+<l:l i="410">a</l:l>
+<l:l i="420">B</l:l>
+<l:l i="420">b</l:l>
+<l:l i="430">C</l:l>
+<l:l i="430">c</l:l>
+<l:l i="440">D</l:l>
+<l:l i="440">d</l:l>
+<l:l i="450">E</l:l>
+<l:l i="450">e</l:l>
+<l:l i="460">F</l:l>
+<l:l i="460">f</l:l>
+<l:l i="470">G</l:l>
+<l:l i="470">g</l:l>
+<l:l i="480">H</l:l>
+<l:l i="480">h</l:l>
+<l:l i="490">I</l:l>
+<l:l i="490">i</l:l>
+<l:l i="500">J</l:l>
+<l:l i="500">j</l:l>
+<l:l i="510">K</l:l>
+<l:l i="510">k</l:l>
+<l:l i="520">L</l:l>
+<l:l i="520">l</l:l>
+<l:l i="530">M</l:l>
+<l:l i="530">m</l:l>
+<l:l i="540">N</l:l>
+<l:l i="540">n</l:l>
+<l:l i="550">O</l:l>
+<l:l i="550">o</l:l>
+<l:l i="560">P</l:l>
+<l:l i="560">p</l:l>
+<l:l i="570">Q</l:l>
+<l:l i="570">q</l:l>
+<l:l i="580">R</l:l>
+<l:l i="580">r</l:l>
+<l:l i="590">S</l:l>
+<l:l i="590">s</l:l>
+<l:l i="600">T</l:l>
+<l:l i="600">t</l:l>
+<l:l i="610">U</l:l>
+<l:l i="610">u</l:l>
+<l:l i="620">V</l:l>
+<l:l i="620">v</l:l>
+<l:l i="630">W</l:l>
+<l:l i="630">w</l:l>
+<l:l i="640">X</l:l>
+<l:l i="640">x</l:l>
+<l:l i="650">Y</l:l>
+<l:l i="650">y</l:l>
+<l:l i="660">Z</l:l>
+<l:l i="660">z</l:l>
+</l:letters>
+</l:l10n>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/bn.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/bn.xml
new file mode 100644
index 0000000..8ca9503
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/bn.xml
@@ -0,0 +1,1229 @@
+<?xml version="1.0" encoding="utf-8"?>
+<l:l10n xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0" language="bn" english-language-name="Bangla">
+
+<!-- * This file is generated automatically. -->
+<!-- * To submit changes to this file upstream (to the DocBook Project) -->
+<!-- * do not submit an edited version of this file. Instead, submit an -->
+<!-- * edited version of the source file at the following location: -->
+<!-- * -->
+<!-- * https://docbook.svn.sourceforge.net/svnroot/docbook/trunk/gentext/locale/bn.xml -->
+<!-- * -->
+<!-- * E-mail the edited bn.xml source file to: -->
+<!-- * -->
+<!-- * docbook-developers@lists.sourceforge.net -->
+
+<!-- ******************************************************************** -->
+
+<!-- This file is part of the XSL DocBook Stylesheet distribution. -->
+<!-- See ../README or http://docbook.sf.net/release/xsl/current/ for -->
+<!-- copyright and other information. -->
+
+<!-- ******************************************************************** -->
+<!-- In these files, % with a letter is used for a placeholder: -->
+<!-- %t is the current element's title -->
+<!-- %s is the current element's subtitle (if applicable)-->
+<!-- %n is the current element's number label-->
+<!-- %p is the current element's page number (if applicable)-->
+<!-- ******************************************************************** -->
+
+
+<l:gentext key="Abstract" text="সারসংকà§à¦·à§‡à¦ª"/>
+<l:gentext key="abstract" text="সারসংকà§à¦·à§‡à¦ª"/>
+<l:gentext key="Acknowledgements" text="Acknowledgements" lang="en"/>
+<l:gentext key="acknowledgements" text="Acknowledgements" lang="en"/>
+<l:gentext key="Answer" text="উতà§à¦¤à¦°:"/>
+<l:gentext key="answer" text="উতà§à¦¤à¦°:"/>
+<l:gentext key="Appendix" text="পরিশিষà§à¦Ÿ"/>
+<l:gentext key="appendix" text="পরিশিষà§à¦Ÿ"/>
+<l:gentext key="Article" text="পà§à¦°à¦¬à¦¨à§à¦§"/>
+<l:gentext key="article" text="পà§à¦°à¦¬à¦¨à§à¦§"/>
+<l:gentext key="Author" text="Author" lang="en"/>
+<l:gentext key="Bibliography" text="গà§à¦°à¦¨à§à¦¥ তালিকা"/>
+<l:gentext key="bibliography" text="গà§à¦°à¦¨à§à¦¥ তালিকা"/>
+<l:gentext key="Book" text="বই"/>
+<l:gentext key="book" text="বই"/>
+<l:gentext key="CAUTION" text="সতরà§à¦•à¦¤à¦¾"/>
+<l:gentext key="Caution" text="সতরà§à¦•à¦¤à¦¾"/>
+<l:gentext key="caution" text="সতরà§à¦•à¦¤à¦¾"/>
+<l:gentext key="Chapter" text="অধà§à¦¯à¦¾à§Ÿ"/>
+<l:gentext key="chapter" text="অধà§à¦¯à¦¾à§Ÿ"/>
+<l:gentext key="Colophon" text="পà§à¦°à¦•à¦¾à¦¶à¦¨à¦¾ তথà§à¦¯ পৃষà§à¦ à¦¾"/>
+<l:gentext key="colophon" text="পà§à¦°à¦•à¦¾à¦¶à¦¨à¦¾ তথà§à¦¯ পৃষà§à¦ à¦¾"/>
+<l:gentext key="Copyright" text="সà§à¦¬à¦¤à§à¦¬"/>
+<l:gentext key="copyright" text="সà§à¦¬à¦¤à§à¦¬"/>
+<l:gentext key="Dedication" text="উতà§â€à¦¸à¦°à§à¦—"/>
+<l:gentext key="dedication" text="উতà§â€à¦¸à¦°à§à¦—"/>
+<l:gentext key="Edition" text="সংসà§à¦•à¦°à¦£"/>
+<l:gentext key="edition" text="সংসà§à¦•à¦°à¦£"/>
+<l:gentext key="Editor" text="Editor" lang="en"/>
+<l:gentext key="Equation" text="সমীকরণ"/>
+<l:gentext key="equation" text="সমীকরণ"/>
+<l:gentext key="Example" text="উদাহরণ"/>
+<l:gentext key="example" text="উদাহরণ"/>
+<l:gentext key="Figure" text="চিতà§à¦°"/>
+<l:gentext key="figure" text="চিতà§à¦°"/>
+<l:gentext key="Glossary" text="নিরà§à¦˜à¦¨à§à¦Ÿ"/>
+<l:gentext key="glossary" text="নিরà§à¦˜à¦¨à§à¦Ÿ"/>
+<l:gentext key="GlossSee" text="দেখà§à¦¨"/>
+<l:gentext key="glosssee" text="দেখà§à¦¨"/>
+<l:gentext key="GlossSeeAlso" text="আরো দেখà§à¦¨"/>
+<l:gentext key="glossseealso" text="আরো দেখà§à¦¨"/>
+<l:gentext key="IMPORTANT" text="গà§à¦°à§à¦¤à§à¦¬à¦ªà§‚রà§à¦£"/>
+<l:gentext key="important" text="গà§à¦°à§à¦¤à§à¦¬à¦ªà§‚রà§à¦£"/>
+<l:gentext key="Important" text="গà§à¦°à§à¦¤à§à¦¬à¦ªà§‚রà§à¦£"/>
+<l:gentext key="Index" text="সূচি"/>
+<l:gentext key="index" text="সূচি"/>
+<l:gentext key="ISBN" text="আইà¦à¦¸à¦¬à¦¿à¦à¦¨ (ISBN)"/>
+<l:gentext key="isbn" text="আইà¦à¦¸à¦¬à¦¿à¦à¦¨ (ISBN)"/>
+<l:gentext key="LegalNotice" text="আইনী বিজà§à¦žà¦ªà§à¦¤à¦¿"/>
+<l:gentext key="legalnotice" text="আইনী বিজà§à¦žà¦ªà§à¦¤à¦¿"/>
+<l:gentext key="MsgAud" text="শà§à¦°à§‹à¦¤à¦¾"/>
+<l:gentext key="msgaud" text="শà§à¦°à§‹à¦¤à¦¾"/>
+<l:gentext key="MsgLevel" text="সà§à¦¤à¦°"/>
+<l:gentext key="msglevel" text="সà§à¦¤à¦°"/>
+<l:gentext key="MsgOrig" text="উতà§â€à¦¸"/>
+<l:gentext key="msgorig" text="উতà§â€à¦¸"/>
+<l:gentext key="NOTE" text="লকà§à¦·à¦£à§€à§Ÿ"/>
+<l:gentext key="Note" text="লকà§à¦·à¦£à§€à§Ÿ"/>
+<l:gentext key="note" text="লকà§à¦·à¦£à§€à§Ÿ"/>
+<l:gentext key="Part" text="খনà§à¦¡"/>
+<l:gentext key="part" text="খনà§à¦¡"/>
+<l:gentext key="Preface" text="মà§à¦–বনà§à¦§"/>
+<l:gentext key="preface" text="মà§à¦–বনà§à¦§"/>
+<l:gentext key="Procedure" text="পদà§à¦§à¦¤à¦¿"/>
+<l:gentext key="procedure" text="পদà§à¦§à¦¤à¦¿"/>
+<l:gentext key="ProductionSet" text="উতà§â€à¦ªà¦¾à¦¦à¦¨"/>
+<l:gentext key="PubDate" text="পà§à¦°à¦•à¦¾à¦¶à¦¨à¦¾à¦° তারিখ"/>
+<l:gentext key="pubdate" text="পà§à¦°à¦•à¦¾à¦¶à¦¨à¦¾à¦° তারিখ"/>
+<l:gentext key="Published" text="পà§à¦°à¦•à¦¾à¦¶à¦¿à¦¤"/>
+<l:gentext key="published" text="পà§à¦°à¦•à¦¾à¦¶à¦¿à¦¤"/>
+<l:gentext key="Publisher" text="Publisher" lang="en"/>
+<l:gentext key="Qandadiv" text="পà§à¦°à¦¶à§à¦¨à¦à¦¬à¦‚উতà§à¦¤à¦°"/>
+<l:gentext key="qandadiv" text="পà§à¦°à¦¶à§à¦¨à¦à¦¬à¦‚উতà§à¦¤à¦°"/>
+<l:gentext key="QandASet" text="Frequently Asked Questions" lang="en"/>
+<l:gentext key="Question" text="পà§à¦°à¦¶à§à¦¨:"/>
+<l:gentext key="question" text="পà§à¦°à¦¶à§à¦¨:"/>
+<l:gentext key="RefEntry" text=""/>
+<l:gentext key="refentry" text=""/>
+<l:gentext key="Reference" text="গà§à¦°à¦¨à§à¦¥à¦¸à§‚তà§à¦°"/>
+<l:gentext key="reference" text="গà§à¦°à¦¨à§à¦¥à¦¸à§‚তà§à¦°"/>
+<l:gentext key="References" text="References" lang="en"/>
+<l:gentext key="RefName" text="নাম"/>
+<l:gentext key="refname" text="নাম"/>
+<l:gentext key="RefSection" text=""/>
+<l:gentext key="refsection" text=""/>
+<l:gentext key="RefSynopsisDiv" text="সারাংশ"/>
+<l:gentext key="refsynopsisdiv" text="সারাংশ"/>
+<l:gentext key="RevHistory" text="পরিবরà§à¦§à¦¨ ও পরিবরà§à¦¤à¦¨ তালিকা"/>
+<l:gentext key="revhistory" text="পরিবরà§à¦§à¦¨ ও পরিবরà§à¦¤à¦¨ তালিকা"/>
+<l:gentext key="revision" text="সংসà§à¦•à¦°à¦£"/>
+<l:gentext key="Revision" text="সংসà§à¦•à¦°à¦£"/>
+<l:gentext key="sect1" text="অনà§à¦šà§à¦›à§‡à¦¦"/>
+<l:gentext key="sect2" text="অনà§à¦šà§à¦›à§‡à¦¦"/>
+<l:gentext key="sect3" text="অনà§à¦šà§à¦›à§‡à¦¦"/>
+<l:gentext key="sect4" text="অনà§à¦šà§à¦›à§‡à¦¦"/>
+<l:gentext key="sect5" text="অনà§à¦šà§à¦›à§‡à¦¦"/>
+<l:gentext key="section" text="অনà§à¦šà§à¦›à§‡à¦¦"/>
+<l:gentext key="Section" text="অনà§à¦šà§à¦›à§‡à¦¦"/>
+<l:gentext key="see" text="দেখà§à¦¨"/>
+<l:gentext key="See" text="দেখà§à¦¨"/>
+<l:gentext key="seealso" text="আরো দেখà§à¦¨"/>
+<l:gentext key="Seealso" text="আরো দেখà§à¦¨"/>
+<l:gentext key="SeeAlso" text="আরো দেখà§à¦¨"/>
+<l:gentext key="set" text="সমষà§à¦Ÿà¦¿"/>
+<l:gentext key="Set" text="সমষà§à¦Ÿà¦¿"/>
+<l:gentext key="setindex" text="সূচিসমষà§à¦Ÿà¦¿"/>
+<l:gentext key="SetIndex" text="সূচিসমষà§à¦Ÿà¦¿"/>
+<l:gentext key="Sidebar" text=""/>
+<l:gentext key="sidebar" text="সাইডবার"/>
+<l:gentext key="step" text="ধাপ"/>
+<l:gentext key="Step" text="ধাপ"/>
+<l:gentext key="table" text="ছক"/>
+<l:gentext key="Table" text="ছক"/>
+<l:gentext key="task" text="Task" lang="en"/>
+<l:gentext key="Task" text="Task" lang="en"/>
+<l:gentext key="tip" text="ইঙà§à¦—িত"/>
+<l:gentext key="TIP" text="ইঙà§à¦—িত"/>
+<l:gentext key="Tip" text="ইঙà§à¦—িত"/>
+<l:gentext key="Warning" text="সতরà§à¦•à¦¬à¦¾à¦£à§€"/>
+<l:gentext key="warning" text="সতরà§à¦•à¦¬à¦¾à¦£à§€"/>
+<l:gentext key="WARNING" text="সতরà§à¦•à¦¬à¦¾à¦£à§€"/>
+<l:gentext key="and" text="à¦à¦¬à¦‚"/>
+<l:gentext key="by" text="দà§à¦¬à¦¾à¦°à¦¾"/>
+<l:gentext key="Edited" text="সমà§à¦ªà¦¾à¦¦à¦¿à¦¤"/>
+<l:gentext key="edited" text="সমà§à¦ªà¦¾à¦¦à¦¿à¦¤"/>
+<l:gentext key="Editedby" text="সমà§à¦ªà¦¾à¦¦à¦•"/>
+<l:gentext key="editedby" text="সমà§à¦ªà¦¾à¦¦à¦•"/>
+<l:gentext key="in" text="মধà§à¦¯à§‡"/>
+<l:gentext key="lastlistcomma" text=","/>
+<l:gentext key="listcomma" text=","/>
+<l:gentext key="notes" text="নোট"/>
+<l:gentext key="Notes" text="নোট"/>
+<l:gentext key="Pgs" text="পৃষà§à¦ à¦¾."/>
+<l:gentext key="pgs" text="পৃষà§à¦ à¦¾."/>
+<l:gentext key="Revisedby" text="পরিমারà§à¦œà¦¨à¦¾à¦•à¦¾à¦°à§€: "/>
+<l:gentext key="revisedby" text="পরিমারà§à¦œà¦¨à¦¾à¦•à¦¾à¦°à§€: "/>
+<l:gentext key="TableNotes" text="নোট"/>
+<l:gentext key="tablenotes" text="নোট"/>
+<l:gentext key="TableofContents" text="সূচিপতà§à¦°"/>
+<l:gentext key="tableofcontents" text="সূচিপতà§à¦°"/>
+<l:gentext key="unexpectedelementname" text="অপà§à¦°à¦¤à§à¦¯à¦¾à¦¶à¦¿à¦¤ উপাদানের নাম"/>
+<l:gentext key="unsupported" text="অসমরà§à¦¥à¦¿à¦¤"/>
+<l:gentext key="xrefto" text="নিরà§à¦¦à§‡à¦¶ করে"/>
+<l:gentext key="Authors" text="Authors" lang="en"/>
+<l:gentext key="copyeditor" text="Copy Editor" lang="en"/>
+<l:gentext key="graphicdesigner" text="Graphic Designer" lang="en"/>
+<l:gentext key="productioneditor" text="Production Editor" lang="en"/>
+<l:gentext key="technicaleditor" text="Technical Editor" lang="en"/>
+<l:gentext key="translator" text="Translator" lang="en"/>
+<l:gentext key="listofequations" text="সমীকরণ তালিকা"/>
+<l:gentext key="ListofEquations" text="সমীকরণ তালিকা"/>
+<l:gentext key="ListofExamples" text="উদাহরণ তালিকা"/>
+<l:gentext key="listofexamples" text="উদাহরণ তালিকা"/>
+<l:gentext key="ListofFigures" text="চিতà§à¦°à¦¤à¦¾à¦²à¦¿à¦•à¦¾"/>
+<l:gentext key="listoffigures" text="চিতà§à¦°à¦¤à¦¾à¦²à¦¿à¦•à¦¾"/>
+<l:gentext key="ListofProcedures" text="পদà§à¦§à¦¤à¦¿à¦° তালিকা"/>
+<l:gentext key="listofprocedures" text="পদà§à¦§à¦¤à¦¿à¦° তালিকা"/>
+<l:gentext key="listoftables" text="ছকের তালিকা"/>
+<l:gentext key="ListofTables" text="ছকের তালিকা"/>
+<l:gentext key="ListofUnknown" text="অজà§à¦žà¦¾à¦¤ বসà§à¦¤à§à¦° তালিকা"/>
+<l:gentext key="listofunknown" text="অজà§à¦žà¦¾à¦¤ বসà§à¦¤à§à¦° তালিকা"/>
+<l:gentext key="nav-home" text="পà§à¦°à¦¥à¦® অবসà§à¦¥à¦¾à¦¨ (Home)"/>
+<l:gentext key="nav-next" text="পরবরà§à¦¤à§€"/>
+<l:gentext key="nav-next-sibling" text="দà§à¦°à§à¦¤ সমà§à¦®à§à¦–ে"/>
+<l:gentext key="nav-prev" text="পূরà§à¦¬à¦¬à¦°à§à¦¤à§€"/>
+<l:gentext key="nav-prev-sibling" text="দà§à¦°à§à¦¤ পশà§à¦šà¦¾à¦¤à§‡"/>
+<l:gentext key="nav-up" text="উপর"/>
+<l:gentext key="nav-toc" text="সূচিপতà§à¦°"/>
+<l:gentext key="Draft" text="খসড়া"/>
+<l:gentext key="above" text="উপর"/>
+<l:gentext key="below" text="নিচ"/>
+<l:gentext key="sectioncalled" text="অনà§à¦šà§à¦›à§‡à¦¦"/>
+<l:gentext key="index symbols" text="পà§à¦°à¦¤à§€à¦•"/>
+<l:gentext key="writing-mode" text="lr-tb"/>
+<l:gentext key="lowercase.alpha" text="অআইঈউঊà¦à¦à¦“ঔঋকখগঘঙচছজà¦à¦žà¦Ÿà¦ à¦¡à¦¢à¦£à¦¤à¦¥à¦¦à¦§à¦¨à¦ªà¦«à¦¬à¦­à¦®à¦¯à¦°à¦²à¦¶à¦·à¦¸à¦¹à¦‚ঃ"/>
+<l:gentext key="uppercase.alpha" text="অআইঈউঊà¦à¦à¦“ঔঋকখগঘঙচছজà¦à¦žà¦Ÿà¦ à¦¡à¦¢à¦£à¦¤à¦¥à¦¦à¦§à¦¨à¦ªà¦«à¦¬à¦­à¦®à¦¯à¦°à¦²à¦¶à¦·à¦¸à¦¹à¦‚ঃ"/>
+<l:gentext key="normalize.sort.input" text="AaÀàÃáÂâÃãÄäÅåĀÄĂ㥹ÇǎǞǟǠǡǺǻȀÈȂȃȦȧḀá¸áºšáº áº¡áº¢áº£áº¤áº¥áº¦áº§áº¨áº©áºªáº«áº¬áº­áº®áº¯áº°áº±áº²áº³áº´áºµáº¶áº·BbÆ€ÆɓƂƃḂḃḄḅḆḇCcÇçĆćĈĉĊċČÄƇƈɕḈḉDdÄŽÄÄđƊɗƋƌDžDzȡɖḊḋḌá¸á¸Žá¸á¸á¸‘ḒḓEeÈèÉéÊêËëĒēĔĕĖėĘęĚěȄȅȆȇȨȩḔḕḖḗḘḙḚḛḜá¸áº¸áº¹áººáº»áº¼áº½áº¾áº¿á»€á»á»‚ểỄễỆệFfƑƒḞḟGgÄœÄĞğĠġĢģƓɠǤǥǦǧǴǵḠḡHhĤĥĦħȞȟɦḢḣḤḥḦḧḨḩḪḫẖIiÌìÃíÎîÃïĨĩĪīĬĭĮįİƗɨÇÇȈȉȊȋḬḭḮḯỈỉỊịJjĴĵǰÊKkĶķƘƙǨǩḰḱḲḳḴḵLlĹĺĻļĽľĿŀÅłƚLjȴɫɬɭḶḷḸḹḺḻḼḽMmɱḾḿṀá¹á¹‚ṃNnÑñŃńŅņŇňÆɲƞȠNjǸǹȵɳṄṅṆṇṈṉṊṋOoÒòÓóÔôÕõÖöØøŌÅÅŽÅÅőƟƠơǑǒǪǫǬǭǾǿȌÈÈŽÈȪȫȬȭȮȯȰȱṌá¹á¹Žá¹á¹á¹‘ṒṓỌá»á»Žá»á»á»‘ỒồỔổỖỗỘộỚớỜá»á»žá»Ÿá» á»¡á»¢á»£PpƤƥṔṕṖṗQqÊ RrŔŕŖŗŘřÈȑȒȓɼɽɾṘṙṚṛṜá¹á¹žá¹ŸSsŚśŜÅŞşŠšȘșʂṠṡṢṣṤṥṦṧṨṩTtŢţŤťŦŧƫƬƭƮʈȚțȶṪṫṬṭṮṯṰṱẗUuÙùÚúÛûÜüŨũŪūŬŭŮůŰűŲųƯưǓǔǕǖǗǘǙǚǛǜȔȕȖȗṲṳṴṵṶṷṸṹṺṻỤụỦủỨứỪừỬửỮữỰựVvƲʋṼṽṾṿWwŴŵẀáºáº‚ẃẄẅẆẇẈẉẘXxẊẋẌáºYyÃýÿŸŶŷƳƴȲȳẎáºáº™á»²á»³á»´á»µá»¶á»·á»¸á»¹ZzŹźŻżŽžƵƶȤȥÊÊ‘áºáº‘ẒẓẔẕẕ" lang="en"/>
+<l:gentext key="normalize.sort.output" text="AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBCCCCCCCCCCCCCCCCCDDDDDDDDDDDDDDDDDDDDDDDDEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEFFFFFFGGGGGGGGGGGGGGGGGGGGHHHHHHHHHHHHHHHHHHHHIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIJJJJJJKKKKKKKKKKKKKKLLLLLLLLLLLLLLLLLLLLLLLLLLMMMMMMMMMNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOPPPPPPPPQQQRRRRRRRRRRRRRRRRRRRRRRRSSSSSSSSSSSSSSSSSSSSSSSTTTTTTTTTTTTTTTTTTTTTTTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUVVVVVVVVWWWWWWWWWWWWWWWXXXXXXYYYYYYYYYYYYYYYYYYYYYYYZZZZZZZZZZZZZZZZZZZZZ" lang="en"/>
+<l:dingbat key="startquote" text="“"/>
+<l:dingbat key="endquote" text="â€"/>
+<l:dingbat key="nestedstartquote" text="‘"/>
+<l:dingbat key="nestedendquote" text="’"/>
+<l:dingbat key="singlestartquote" text="‘"/>
+<l:dingbat key="singleendquote" text="’"/>
+<l:dingbat key="bullet" text="•"/>
+<l:gentext key="hyphenation-character" text="-"/>
+<l:gentext key="hyphenation-push-character-count" text="2"/>
+<l:gentext key="hyphenation-remain-character-count" text="2"/>
+<l:context name="styles"><l:template name="person-name" text="first-last"/>
+</l:context>
+<l:context name="title"><l:template name="abstract" text="%t"/>
+<l:template name="acknowledgements" text="%t" lang="en"/>
+<l:template name="answer" text="%t"/>
+<l:template name="appendix" text="পরিশিষà§à¦ŸÂ %n. %t"/>
+<l:template name="article" text="%t"/>
+<l:template name="authorblurb" text="%t"/>
+<l:template name="bibliodiv" text="%t"/>
+<l:template name="biblioentry" text="%t"/>
+<l:template name="bibliography" text="%t"/>
+<l:template name="bibliolist" text="%t" lang="en"/>
+<l:template name="bibliomixed" text="%t"/>
+<l:template name="bibliomset" text="%t"/>
+<l:template name="biblioset" text="%t"/>
+<l:template name="blockquote" text="%t"/>
+<l:template name="book" text="%t"/>
+<l:template name="calloutlist" text="%t"/>
+<l:template name="caution" text="%t"/>
+<l:template name="chapter" text="অধà§à¦¯à¦¾à§ŸÂ %n. %t"/>
+<l:template name="colophon" text="%t"/>
+<l:template name="dedication" text="%t"/>
+<l:template name="equation" text="সমীকরণ %n. %t"/>
+<l:template name="example" text="উদাহরণ %n. %t"/>
+<l:template name="figure" text="চিতà§à¦°Â %n. %t"/>
+<l:template name="foil" text="%t" lang="en"/>
+<l:template name="foilgroup" text="%t" lang="en"/>
+<l:template name="formalpara" text="%t"/>
+<l:template name="glossary" text="%t"/>
+<l:template name="glossdiv" text="%t"/>
+<l:template name="glosslist" text="%t" lang="en"/>
+<l:template name="glossentry" text="%t"/>
+<l:template name="important" text="%t"/>
+<l:template name="index" text="%t"/>
+<l:template name="indexdiv" text="%t"/>
+<l:template name="itemizedlist" text="%t"/>
+<l:template name="legalnotice" text="%t"/>
+<l:template name="listitem" text=""/>
+<l:template name="lot" text="%t"/>
+<l:template name="msg" text="%t"/>
+<l:template name="msgexplan" text="%t"/>
+<l:template name="msgmain" text="%t"/>
+<l:template name="msgrel" text="%t"/>
+<l:template name="msgset" text="%t"/>
+<l:template name="msgsub" text="%t"/>
+<l:template name="note" text="%t"/>
+<l:template name="orderedlist" text="%t"/>
+<l:template name="part" text="খনà§à¦¡Â %n. %t"/>
+<l:template name="partintro" text="%t"/>
+<l:template name="preface" text="%t"/>
+<l:template name="procedure" text="%t"/>
+<l:template name="procedure.formal" text="পদà§à¦§à¦¤à¦¿Â %n. %t"/>
+<l:template name="productionset" text="%t"/>
+<l:template name="productionset.formal" text="উতà§â€à¦ªà¦¾à¦¦à¦¨Â %n"/>
+<l:template name="qandadiv" text="%t"/>
+<l:template name="qandaentry" text="%t"/>
+<l:template name="qandaset" text="%t"/>
+<l:template name="question" text="%t"/>
+<l:template name="refentry" text="%t"/>
+<l:template name="reference" text="%t"/>
+<l:template name="refsection" text="%t"/>
+<l:template name="refsect1" text="%t"/>
+<l:template name="refsect2" text="%t"/>
+<l:template name="refsect3" text="%t"/>
+<l:template name="refsynopsisdiv" text="%t"/>
+<l:template name="refsynopsisdivinfo" text="%t"/>
+<l:template name="segmentedlist" text="%t"/>
+<l:template name="set" text="%t"/>
+<l:template name="setindex" text="%t"/>
+<l:template name="sidebar" text="%t"/>
+<l:template name="step" text="%t"/>
+<l:template name="table" text="ছক %n. %t"/>
+<l:template name="task" text="%t" lang="en"/>
+<l:template name="tasksummary" text="%t" lang="en"/>
+<l:template name="taskprerequisites" text="%t" lang="en"/>
+<l:template name="taskrelated" text="%t" lang="en"/>
+<l:template name="tip" text="%t"/>
+<l:template name="toc" text="%t"/>
+<l:template name="variablelist" text="%t"/>
+<l:template name="varlistentry" text=""/>
+<l:template name="warning" text="%t"/>
+</l:context>
+<l:context name="title-unnumbered"><l:template name="appendix" text="%t"/>
+<l:template name="article/appendix" text="%t"/>
+<l:template name="bridgehead" text="%t"/>
+<l:template name="chapter" text="%t"/>
+<l:template name="sect1" text="%t"/>
+<l:template name="sect2" text="%t"/>
+<l:template name="sect3" text="%t"/>
+<l:template name="sect4" text="%t"/>
+<l:template name="sect5" text="%t"/>
+<l:template name="section" text="%t"/>
+<l:template name="simplesect" text="%t"/>
+<l:template name="part" text="%t" lang="en"/>
+</l:context>
+<l:context name="title-numbered"><l:template name="appendix" text="পরিশিষà§à¦ŸÂ %n. %t"/>
+<l:template name="article/appendix" text="%n. %t"/>
+<l:template name="bridgehead" text="%n. %t"/>
+<l:template name="chapter" text="অধà§à¦¯à¦¾à§ŸÂ %n. %t"/>
+<l:template name="part" text="খনà§à¦¡Â %n. %t"/>
+<l:template name="sect1" text="%n. %t"/>
+<l:template name="sect2" text="%n. %t"/>
+<l:template name="sect3" text="%n. %t"/>
+<l:template name="sect4" text="%n. %t"/>
+<l:template name="sect5" text="%n. %t"/>
+<l:template name="section" text="%n. %t"/>
+<l:template name="simplesect" text="%t"/>
+</l:context>
+<l:context name="subtitle"><l:template name="appendix" text="%s"/>
+<l:template name="acknowledgements" text="%s" lang="en"/>
+<l:template name="article" text="%s"/>
+<l:template name="bibliodiv" text="%s"/>
+<l:template name="biblioentry" text="%s"/>
+<l:template name="bibliography" text="%s"/>
+<l:template name="bibliomixed" text="%s"/>
+<l:template name="bibliomset" text="%s"/>
+<l:template name="biblioset" text="%s"/>
+<l:template name="book" text="%s"/>
+<l:template name="chapter" text="%s"/>
+<l:template name="colophon" text="%s"/>
+<l:template name="dedication" text="%s"/>
+<l:template name="glossary" text="%s"/>
+<l:template name="glossdiv" text="%s"/>
+<l:template name="index" text="%s"/>
+<l:template name="indexdiv" text="%s"/>
+<l:template name="lot" text="%s"/>
+<l:template name="part" text="%s"/>
+<l:template name="partintro" text="%s"/>
+<l:template name="preface" text="%s"/>
+<l:template name="refentry" text="%s"/>
+<l:template name="reference" text="%s"/>
+<l:template name="refsection" text="%s"/>
+<l:template name="refsect1" text="%s"/>
+<l:template name="refsect2" text="%s"/>
+<l:template name="refsect3" text="%s"/>
+<l:template name="refsynopsisdiv" text="%s"/>
+<l:template name="sect1" text="%s"/>
+<l:template name="sect2" text="%s"/>
+<l:template name="sect3" text="%s"/>
+<l:template name="sect4" text="%s"/>
+<l:template name="sect5" text="%s"/>
+<l:template name="section" text="%s"/>
+<l:template name="set" text="%s"/>
+<l:template name="setindex" text="%s"/>
+<l:template name="sidebar" text="%s"/>
+<l:template name="simplesect" text="%s"/>
+<l:template name="toc" text="%s"/>
+</l:context>
+<l:context name="xref"><l:template name="abstract" text="%t"/>
+<l:template name="acknowledgements" text="%t" lang="en"/>
+<l:template name="answer" text="উতà§à¦¤à¦°: %n"/>
+<l:template name="appendix" text="%t"/>
+<l:template name="article" text="%t"/>
+<l:template name="authorblurb" text="%t"/>
+<l:template name="bibliodiv" text="%t"/>
+<l:template name="bibliography" text="%t"/>
+<l:template name="bibliomset" text="%t"/>
+<l:template name="biblioset" text="%t"/>
+<l:template name="blockquote" text="%t"/>
+<l:template name="book" text="%t"/>
+<l:template name="calloutlist" text="%t"/>
+<l:template name="caution" text="%t"/>
+<l:template name="chapter" text="%t"/>
+<l:template name="colophon" text="%t"/>
+<l:template name="constraintdef" text="%t"/>
+<l:template name="dedication" text="%t"/>
+<l:template name="equation" text="%t"/>
+<l:template name="example" text="%t"/>
+<l:template name="figure" text="%t"/>
+<l:template name="foil" text="%t" lang="en"/>
+<l:template name="foilgroup" text="%t" lang="en"/>
+<l:template name="formalpara" text="%t"/>
+<l:template name="glossary" text="%t"/>
+<l:template name="glossdiv" text="%t"/>
+<l:template name="important" text="%t"/>
+<l:template name="index" text="%t"/>
+<l:template name="indexdiv" text="%t"/>
+<l:template name="itemizedlist" text="%t"/>
+<l:template name="legalnotice" text="%t"/>
+<l:template name="listitem" text="%n"/>
+<l:template name="lot" text="%t"/>
+<l:template name="msg" text="%t"/>
+<l:template name="msgexplan" text="%t"/>
+<l:template name="msgmain" text="%t"/>
+<l:template name="msgrel" text="%t"/>
+<l:template name="msgset" text="%t"/>
+<l:template name="msgsub" text="%t"/>
+<l:template name="note" text="%t"/>
+<l:template name="orderedlist" text="%t"/>
+<l:template name="part" text="%t"/>
+<l:template name="partintro" text="%t"/>
+<l:template name="preface" text="%t"/>
+<l:template name="procedure" text="%t"/>
+<l:template name="productionset" text="%t"/>
+<l:template name="qandadiv" text="%t"/>
+<l:template name="qandaentry" text="পà§à¦°à¦¶à§à¦¨: %n"/>
+<l:template name="qandaset" text="%t"/>
+<l:template name="question" text="পà§à¦°à¦¶à§à¦¨: %n"/>
+<l:template name="reference" text="%t"/>
+<l:template name="refsynopsisdiv" text="%t"/>
+<l:template name="segmentedlist" text="%t"/>
+<l:template name="set" text="%t"/>
+<l:template name="setindex" text="%t"/>
+<l:template name="sidebar" text="%t"/>
+<l:template name="table" text="%t"/>
+<l:template name="task" text="%t" lang="en"/>
+<l:template name="tip" text="%t"/>
+<l:template name="toc" text="%t"/>
+<l:template name="variablelist" text="%t"/>
+<l:template name="varlistentry" text="%n"/>
+<l:template name="warning" text="%t"/>
+<l:template name="olink.document.citation" text=" in %o" lang="en"/>
+<l:template name="olink.page.citation" text=" (page %p)" lang="en"/>
+<l:template name="page.citation" text=" [%p]"/>
+<l:template name="page" text="(page %p)" lang="en"/>
+<l:template name="docname" text=" in %o" lang="en"/>
+<l:template name="docnamelong" text=" in the document titled %o" lang="en"/>
+<l:template name="pageabbrev" text="(p. %p)" lang="en"/>
+<l:template name="Page" text="Page %p" lang="en"/>
+<l:template name="bridgehead" text="অনà§à¦šà§à¦›à§‡à¦¦ “%tâ€"/>
+<l:template name="refsection" text="অনà§à¦šà§à¦›à§‡à¦¦ “%tâ€"/>
+<l:template name="refsect1" text="অনà§à¦šà§à¦›à§‡à¦¦ “%tâ€"/>
+<l:template name="refsect2" text="অনà§à¦šà§à¦›à§‡à¦¦ “%tâ€"/>
+<l:template name="refsect3" text="অনà§à¦šà§à¦›à§‡à¦¦ “%tâ€"/>
+<l:template name="sect1" text="অনà§à¦šà§à¦›à§‡à¦¦ “%tâ€"/>
+<l:template name="sect2" text="অনà§à¦šà§à¦›à§‡à¦¦ “%tâ€"/>
+<l:template name="sect3" text="অনà§à¦šà§à¦›à§‡à¦¦ “%tâ€"/>
+<l:template name="sect4" text="অনà§à¦šà§à¦›à§‡à¦¦ “%tâ€"/>
+<l:template name="sect5" text="অনà§à¦šà§à¦›à§‡à¦¦ “%tâ€"/>
+<l:template name="section" text="অনà§à¦šà§à¦›à§‡à¦¦ “%tâ€"/>
+<l:template name="simplesect" text="অনà§à¦šà§à¦›à§‡à¦¦ “%tâ€"/>
+</l:context>
+<l:context name="xref-number"><l:template name="answer" text="উতà§à¦¤à¦°: %n"/>
+<l:template name="appendix" text="পরিশিষà§à¦ŸÂ %n"/>
+<l:template name="bridgehead" text="অনà§à¦šà§à¦›à§‡à¦¦Â %n"/>
+<l:template name="chapter" text="অধà§à¦¯à¦¾à§ŸÂ %n"/>
+<l:template name="equation" text="সমীকরণ %n"/>
+<l:template name="example" text="উদাহরণ %n"/>
+<l:template name="figure" text="চিতà§à¦°Â %n"/>
+<l:template name="part" text="খনà§à¦¡Â %n"/>
+<l:template name="procedure" text="পদà§à¦§à¦¤à¦¿Â %n"/>
+<l:template name="productionset" text="উতà§â€à¦ªà¦¾à¦¦à¦¨Â %n"/>
+<l:template name="qandadiv" text="পà§à¦°à¦¶à§à¦¨à¦à¦¬à¦‚উতà§à¦¤à¦°Â %n"/>
+<l:template name="qandaentry" text="পà§à¦°à¦¶à§à¦¨: %n"/>
+<l:template name="question" text="পà§à¦°à¦¶à§à¦¨: %n"/>
+<l:template name="sect1" text="অনà§à¦šà§à¦›à§‡à¦¦Â %n"/>
+<l:template name="sect2" text="অনà§à¦šà§à¦›à§‡à¦¦Â %n"/>
+<l:template name="sect3" text="অনà§à¦šà§à¦›à§‡à¦¦Â %n"/>
+<l:template name="sect4" text="অনà§à¦šà§à¦›à§‡à¦¦Â %n"/>
+<l:template name="sect5" text="অনà§à¦šà§à¦›à§‡à¦¦Â %n"/>
+<l:template name="section" text="অনà§à¦šà§à¦›à§‡à¦¦Â %n"/>
+<l:template name="table" text="ছক %n"/>
+</l:context>
+<l:context name="xref-number-and-title"><l:template name="appendix" text="পরিশিষà§à¦ŸÂ %n, %t"/>
+<l:template name="bridgehead" text="অনà§à¦šà§à¦›à§‡à¦¦Â %n, “%tâ€"/>
+<l:template name="chapter" text="অধà§à¦¯à¦¾à§ŸÂ %n, %t"/>
+<l:template name="equation" text="সমীকরণ %n, “%tâ€"/>
+<l:template name="example" text="উদাহরণ %n, “%tâ€"/>
+<l:template name="figure" text="চিতà§à¦°Â %n, “%tâ€"/>
+<l:template name="part" text="খনà§à¦¡Â %n, “%tâ€"/>
+<l:template name="procedure" text="পদà§à¦§à¦¤à¦¿Â %n, “%tâ€"/>
+<l:template name="productionset" text="উতà§â€à¦ªà¦¾à¦¦à¦¨Â %n, “%tâ€"/>
+<l:template name="qandadiv" text="পà§à¦°à¦¶à§à¦¨à¦à¦¬à¦‚উতà§à¦¤à¦°Â %n, “%tâ€"/>
+<l:template name="refsect1" text="অনà§à¦šà§à¦›à§‡à¦¦ “%tâ€"/>
+<l:template name="refsect2" text="অনà§à¦šà§à¦›à§‡à¦¦ “%tâ€"/>
+<l:template name="refsect3" text="অনà§à¦šà§à¦›à§‡à¦¦ “%tâ€"/>
+<l:template name="refsection" text="অনà§à¦šà§à¦›à§‡à¦¦ “%tâ€"/>
+<l:template name="sect1" text="অনà§à¦šà§à¦›à§‡à¦¦Â %n, “%tâ€"/>
+<l:template name="sect2" text="অনà§à¦šà§à¦›à§‡à¦¦Â %n, “%tâ€"/>
+<l:template name="sect3" text="অনà§à¦šà§à¦›à§‡à¦¦Â %n, “%tâ€"/>
+<l:template name="sect4" text="অনà§à¦šà§à¦›à§‡à¦¦Â %n, “%tâ€"/>
+<l:template name="sect5" text="অনà§à¦šà§à¦›à§‡à¦¦Â %n, “%tâ€"/>
+<l:template name="section" text="অনà§à¦šà§à¦›à§‡à¦¦Â %n, “%tâ€"/>
+<l:template name="simplesect" text="অনà§à¦šà§à¦›à§‡à¦¦ “%tâ€"/>
+<l:template name="table" text="ছক %n, “%tâ€"/>
+</l:context>
+<l:context name="authorgroup"><l:template name="sep" text=", "/>
+<l:template name="sep2" text=" à¦à¦¬à¦‚ "/>
+<l:template name="seplast" text=", à¦à¦¬à¦‚ "/>
+</l:context>
+<l:context name="glossary"><l:template name="see" text="দেখà§à¦¨ %t."/>
+<l:template name="seealso" text="আরো দেখà§à¦¨ %t."/>
+<l:template name="seealso-separator" text=", "/>
+</l:context>
+<l:context name="msgset"><l:template name="MsgAud" text="শà§à¦°à§‹à¦¤à¦¾: "/>
+<l:template name="MsgLevel" text="সà§à¦¤à¦°: "/>
+<l:template name="MsgOrig" text="উতà§â€à¦¸: "/>
+</l:context>
+<l:context name="datetime"><l:template name="format" text="d/m/Y"/>
+</l:context>
+<l:context name="termdef"><l:template name="prefix" text="[Definition: " lang="en"/>
+<l:template name="suffix" text="]" lang="en"/>
+</l:context>
+<l:context name="datetime-full"><l:template name="January" text="জানà§à§Ÿà¦¾à¦°à§€"/>
+<l:template name="February" text="ফেবà§à¦°à§à§Ÿà¦¾à¦°à§€"/>
+<l:template name="March" text="মারà§à¦š"/>
+<l:template name="April" text="à¦à¦ªà§à¦°à¦¿à¦²"/>
+<l:template name="May" text="মে"/>
+<l:template name="June" text="জà§à¦¨"/>
+<l:template name="July" text="জà§à¦²à¦¾à¦‡"/>
+<l:template name="August" text="আগসà§à¦Ÿ"/>
+<l:template name="September" text="সেপà§à¦Ÿà§‡à¦®à§à¦¬à¦°"/>
+<l:template name="October" text="অকà§à¦Ÿà§‹à¦¬à¦°"/>
+<l:template name="November" text="নভেমà§à¦¬à¦°"/>
+<l:template name="December" text="ডিসেমà§à¦¬à¦°"/>
+<l:template name="Monday" text="সোমবার"/>
+<l:template name="Tuesday" text="মঙà§à¦—লবার"/>
+<l:template name="Wednesday" text="বà§à¦§à¦¬à¦¾à¦°"/>
+<l:template name="Thursday" text="বৃহঃসà§à¦ªà¦¤à¦¿à¦¬à¦¾à¦°"/>
+<l:template name="Friday" text="শà§à¦•à§à¦°à¦¬à¦¾à¦°"/>
+<l:template name="Saturday" text="শনিবার"/>
+<l:template name="Sunday" text="রবিবার"/>
+</l:context>
+<l:context name="datetime-abbrev"><l:template name="Jan" text="জানà§à§Ÿà¦¾à¦°à§€"/>
+<l:template name="Feb" text="ফেবà§à¦°à§à§Ÿà¦¾à¦°à§€"/>
+<l:template name="Mar" text="মারà§à¦š"/>
+<l:template name="Apr" text="à¦à¦ªà§à¦°à¦¿à¦²"/>
+<l:template name="May" text="মে"/>
+<l:template name="Jun" text="জà§à¦¨"/>
+<l:template name="Jul" text="জà§à¦²à¦¾à¦‡"/>
+<l:template name="Aug" text="আগসà§à¦Ÿ"/>
+<l:template name="Sep" text="সেপà§à¦Ÿà§‡à¦®à§à¦¬à¦°"/>
+<l:template name="Oct" text="অকà§à¦Ÿà§‹à¦¬à¦°"/>
+<l:template name="Nov" text="নভেমà§à¦¬à¦°"/>
+<l:template name="Dec" text="ডিসেমà§à¦¬à¦°"/>
+<l:template name="Mon" text="সোম"/>
+<l:template name="Tue" text="মঙà§à¦—ল"/>
+<l:template name="Wed" text="বà§à¦§"/>
+<l:template name="Thu" text="বৃহঃসà§à¦ªà¦¤à¦¿"/>
+<l:template name="Fri" text="শà§à¦•à§à¦°"/>
+<l:template name="Sat" text="শনি"/>
+<l:template name="Sun" text="রবি"/>
+</l:context>
+<l:context name="htmlhelp"><l:template name="langcode" text="0x0445 Bangla (Bangladesh and India)"/>
+</l:context>
+<l:context name="index"><l:template name="term-separator" text=", " lang="en"/>
+<l:template name="number-separator" text=", " lang="en"/>
+<l:template name="range-separator" text="-" lang="en"/>
+</l:context>
+<l:context name="iso690"><l:template name="lastfirst.sep" text=", " lang="en"/>
+<l:template name="alt.person.two.sep" text=" – " lang="en"/>
+<l:template name="alt.person.last.sep" text=" – " lang="en"/>
+<l:template name="alt.person.more.sep" text=" – " lang="en"/>
+<l:template name="primary.editor" text=" (ed.)" lang="en"/>
+<l:template name="primary.many" text=", et al." lang="en"/>
+<l:template name="primary.sep" text=". " lang="en"/>
+<l:template name="submaintitle.sep" text=": " lang="en"/>
+<l:template name="title.sep" text=". " lang="en"/>
+<l:template name="othertitle.sep" text=", " lang="en"/>
+<l:template name="medium1" text=" [" lang="en"/>
+<l:template name="medium2" text="]" lang="en"/>
+<l:template name="secondary.person.sep" text="; " lang="en"/>
+<l:template name="secondary.sep" text=". " lang="en"/>
+<l:template name="respons.sep" text=". " lang="en"/>
+<l:template name="edition.sep" text=". " lang="en"/>
+<l:template name="edition.serial.sep" text=", " lang="en"/>
+<l:template name="issuing.range" text="-" lang="en"/>
+<l:template name="issuing.div" text=", " lang="en"/>
+<l:template name="issuing.sep" text=". " lang="en"/>
+<l:template name="partnr.sep" text=". " lang="en"/>
+<l:template name="placepubl.sep" text=": " lang="en"/>
+<l:template name="publyear.sep" text=", " lang="en"/>
+<l:template name="pubinfo.sep" text=". " lang="en"/>
+<l:template name="spec.pubinfo.sep" text=", " lang="en"/>
+<l:template name="upd.sep" text=", " lang="en"/>
+<l:template name="datecit1" text=" [cited " lang="en"/>
+<l:template name="datecit2" text="]" lang="en"/>
+<l:template name="extent.sep" text=". " lang="en"/>
+<l:template name="locs.sep" text=", " lang="en"/>
+<l:template name="location.sep" text=". " lang="en"/>
+<l:template name="serie.sep" text=". " lang="en"/>
+<l:template name="notice.sep" text=". " lang="en"/>
+<l:template name="access" text="Available " lang="en"/>
+<l:template name="acctoo" text="Also available " lang="en"/>
+<l:template name="onwww" text="from World Wide Web" lang="en"/>
+<l:template name="oninet" text="from Internet" lang="en"/>
+<l:template name="access.end" text=": " lang="en"/>
+<l:template name="link1" text="&lt;" lang="en"/>
+<l:template name="link2" text="&gt;" lang="en"/>
+<l:template name="access.sep" text=". " lang="en"/>
+<l:template name="isbn" text="ISBN " lang="en"/>
+<l:template name="issn" text="ISSN " lang="en"/>
+<l:template name="stdnum.sep" text=". " lang="en"/>
+<l:template name="patcountry.sep" text=". " lang="en"/>
+<l:template name="pattype.sep" text=", " lang="en"/>
+<l:template name="patnum.sep" text=". " lang="en"/>
+<l:template name="patdate.sep" text=". " lang="en"/>
+</l:context><l:letters lang="en"><l:l i="-1"/>
+<l:l i="0">Symbols</l:l>
+<l:l i="10">A</l:l>
+<l:l i="10">a</l:l>
+<l:l i="10">À</l:l>
+<l:l i="10">à</l:l>
+<l:l i="10">Ã</l:l>
+<l:l i="10">á</l:l>
+<l:l i="10">Â</l:l>
+<l:l i="10">â</l:l>
+<l:l i="10">Ã</l:l>
+<l:l i="10">ã</l:l>
+<l:l i="10">Ä</l:l>
+<l:l i="10">ä</l:l>
+<l:l i="10">Ã…</l:l>
+<l:l i="10">Ã¥</l:l>
+<l:l i="10">Ä€</l:l>
+<l:l i="10">Ä</l:l>
+<l:l i="10">Ä‚</l:l>
+<l:l i="10">ă</l:l>
+<l:l i="10">Ä„</l:l>
+<l:l i="10">Ä…</l:l>
+<l:l i="10">Ç</l:l>
+<l:l i="10">ÇŽ</l:l>
+<l:l i="10">Çž</l:l>
+<l:l i="10">ÇŸ</l:l>
+<l:l i="10">Ç </l:l>
+<l:l i="10">Ç¡</l:l>
+<l:l i="10">Ǻ</l:l>
+<l:l i="10">Ç»</l:l>
+<l:l i="10">È€</l:l>
+<l:l i="10">È</l:l>
+<l:l i="10">È‚</l:l>
+<l:l i="10">ȃ</l:l>
+<l:l i="10">Ȧ</l:l>
+<l:l i="10">ȧ</l:l>
+<l:l i="10">Ḁ</l:l>
+<l:l i="10">á¸</l:l>
+<l:l i="10">ẚ</l:l>
+<l:l i="10">Ạ</l:l>
+<l:l i="10">ạ</l:l>
+<l:l i="10">Ả</l:l>
+<l:l i="10">ả</l:l>
+<l:l i="10">Ấ</l:l>
+<l:l i="10">ấ</l:l>
+<l:l i="10">Ầ</l:l>
+<l:l i="10">ầ</l:l>
+<l:l i="10">Ẩ</l:l>
+<l:l i="10">ẩ</l:l>
+<l:l i="10">Ẫ</l:l>
+<l:l i="10">ẫ</l:l>
+<l:l i="10">Ậ</l:l>
+<l:l i="10">ậ</l:l>
+<l:l i="10">Ắ</l:l>
+<l:l i="10">ắ</l:l>
+<l:l i="10">Ằ</l:l>
+<l:l i="10">ằ</l:l>
+<l:l i="10">Ẳ</l:l>
+<l:l i="10">ẳ</l:l>
+<l:l i="10">Ẵ</l:l>
+<l:l i="10">ẵ</l:l>
+<l:l i="10">Ặ</l:l>
+<l:l i="10">ặ</l:l>
+<l:l i="20">B</l:l>
+<l:l i="20">b</l:l>
+<l:l i="20">Æ€</l:l>
+<l:l i="20">Æ</l:l>
+<l:l i="20">É“</l:l>
+<l:l i="20">Æ‚</l:l>
+<l:l i="20">ƃ</l:l>
+<l:l i="20">Ḃ</l:l>
+<l:l i="20">ḃ</l:l>
+<l:l i="20">Ḅ</l:l>
+<l:l i="20">ḅ</l:l>
+<l:l i="20">Ḇ</l:l>
+<l:l i="20">ḇ</l:l>
+<l:l i="30">C</l:l>
+<l:l i="30">c</l:l>
+<l:l i="30">Ç</l:l>
+<l:l i="30">ç</l:l>
+<l:l i="30">Ć</l:l>
+<l:l i="30">ć</l:l>
+<l:l i="30">Ĉ</l:l>
+<l:l i="30">ĉ</l:l>
+<l:l i="30">ÄŠ</l:l>
+<l:l i="30">Ä‹</l:l>
+<l:l i="30">Č</l:l>
+<l:l i="30">Ä</l:l>
+<l:l i="30">Ƈ</l:l>
+<l:l i="30">ƈ</l:l>
+<l:l i="30">É•</l:l>
+<l:l i="30">Ḉ</l:l>
+<l:l i="30">ḉ</l:l>
+<l:l i="40">D</l:l>
+<l:l i="40">d</l:l>
+<l:l i="40">ÄŽ</l:l>
+<l:l i="40">Ä</l:l>
+<l:l i="40">Ä</l:l>
+<l:l i="40">Ä‘</l:l>
+<l:l i="40">ÆŠ</l:l>
+<l:l i="40">É—</l:l>
+<l:l i="40">Æ‹</l:l>
+<l:l i="40">ƌ</l:l>
+<l:l i="40">Ç…</l:l>
+<l:l i="40">Dz</l:l>
+<l:l i="40">È¡</l:l>
+<l:l i="40">É–</l:l>
+<l:l i="40">Ḋ</l:l>
+<l:l i="40">ḋ</l:l>
+<l:l i="40">Ḍ</l:l>
+<l:l i="40">á¸</l:l>
+<l:l i="40">Ḏ</l:l>
+<l:l i="40">á¸</l:l>
+<l:l i="40">á¸</l:l>
+<l:l i="40">ḑ</l:l>
+<l:l i="40">Ḓ</l:l>
+<l:l i="40">ḓ</l:l>
+<l:l i="50">E</l:l>
+<l:l i="50">e</l:l>
+<l:l i="50">È</l:l>
+<l:l i="50">è</l:l>
+<l:l i="50">É</l:l>
+<l:l i="50">é</l:l>
+<l:l i="50">Ê</l:l>
+<l:l i="50">ê</l:l>
+<l:l i="50">Ë</l:l>
+<l:l i="50">ë</l:l>
+<l:l i="50">Ä’</l:l>
+<l:l i="50">Ä“</l:l>
+<l:l i="50">Ä”</l:l>
+<l:l i="50">Ä•</l:l>
+<l:l i="50">Ä–</l:l>
+<l:l i="50">Ä—</l:l>
+<l:l i="50">Ę</l:l>
+<l:l i="50">Ä™</l:l>
+<l:l i="50">Äš</l:l>
+<l:l i="50">Ä›</l:l>
+<l:l i="50">È„</l:l>
+<l:l i="50">È…</l:l>
+<l:l i="50">Ȇ</l:l>
+<l:l i="50">ȇ</l:l>
+<l:l i="50">Ȩ</l:l>
+<l:l i="50">È©</l:l>
+<l:l i="50">Ḕ</l:l>
+<l:l i="50">ḕ</l:l>
+<l:l i="50">Ḗ</l:l>
+<l:l i="50">ḗ</l:l>
+<l:l i="50">Ḙ</l:l>
+<l:l i="50">ḙ</l:l>
+<l:l i="50">Ḛ</l:l>
+<l:l i="50">ḛ</l:l>
+<l:l i="50">Ḝ</l:l>
+<l:l i="50">á¸</l:l>
+<l:l i="50">Ẹ</l:l>
+<l:l i="50">ẹ</l:l>
+<l:l i="50">Ẻ</l:l>
+<l:l i="50">ẻ</l:l>
+<l:l i="50">Ẽ</l:l>
+<l:l i="50">ẽ</l:l>
+<l:l i="50">Ế</l:l>
+<l:l i="50">ế</l:l>
+<l:l i="50">Ề</l:l>
+<l:l i="50">á»</l:l>
+<l:l i="50">Ể</l:l>
+<l:l i="50">ể</l:l>
+<l:l i="50">Ễ</l:l>
+<l:l i="50">á»…</l:l>
+<l:l i="50">Ệ</l:l>
+<l:l i="50">ệ</l:l>
+<l:l i="60">F</l:l>
+<l:l i="60">f</l:l>
+<l:l i="60">Æ‘</l:l>
+<l:l i="60">Æ’</l:l>
+<l:l i="60">Ḟ</l:l>
+<l:l i="60">ḟ</l:l>
+<l:l i="70">G</l:l>
+<l:l i="70">g</l:l>
+<l:l i="70">Ĝ</l:l>
+<l:l i="70">Ä</l:l>
+<l:l i="70">Äž</l:l>
+<l:l i="70">ÄŸ</l:l>
+<l:l i="70">Ä </l:l>
+<l:l i="70">Ä¡</l:l>
+<l:l i="70">Ä¢</l:l>
+<l:l i="70">Ä£</l:l>
+<l:l i="70">Æ“</l:l>
+<l:l i="70">É </l:l>
+<l:l i="70">Ǥ</l:l>
+<l:l i="70">Ç¥</l:l>
+<l:l i="70">Ǧ</l:l>
+<l:l i="70">ǧ</l:l>
+<l:l i="70">Ç´</l:l>
+<l:l i="70">ǵ</l:l>
+<l:l i="70">Ḡ</l:l>
+<l:l i="70">ḡ</l:l>
+<l:l i="80">H</l:l>
+<l:l i="80">h</l:l>
+<l:l i="80">Ĥ</l:l>
+<l:l i="80">Ä¥</l:l>
+<l:l i="80">Ħ</l:l>
+<l:l i="80">ħ</l:l>
+<l:l i="80">Èž</l:l>
+<l:l i="80">ÈŸ</l:l>
+<l:l i="80">ɦ</l:l>
+<l:l i="80">Ḣ</l:l>
+<l:l i="80">ḣ</l:l>
+<l:l i="80">Ḥ</l:l>
+<l:l i="80">ḥ</l:l>
+<l:l i="80">Ḧ</l:l>
+<l:l i="80">ḧ</l:l>
+<l:l i="80">Ḩ</l:l>
+<l:l i="80">ḩ</l:l>
+<l:l i="80">Ḫ</l:l>
+<l:l i="80">ḫ</l:l>
+<l:l i="80">ẖ</l:l>
+<l:l i="90">I</l:l>
+<l:l i="90">i</l:l>
+<l:l i="90">Ì</l:l>
+<l:l i="90">ì</l:l>
+<l:l i="90">Ã</l:l>
+<l:l i="90">í</l:l>
+<l:l i="90">ÃŽ</l:l>
+<l:l i="90">î</l:l>
+<l:l i="90">Ã</l:l>
+<l:l i="90">ï</l:l>
+<l:l i="90">Ĩ</l:l>
+<l:l i="90">Ä©</l:l>
+<l:l i="90">Ī</l:l>
+<l:l i="90">Ä«</l:l>
+<l:l i="90">Ĭ</l:l>
+<l:l i="90">Ä­</l:l>
+<l:l i="90">Ä®</l:l>
+<l:l i="90">į</l:l>
+<l:l i="90">Ä°</l:l>
+<l:l i="90">Æ—</l:l>
+<l:l i="90">ɨ</l:l>
+<l:l i="90">Ç</l:l>
+<l:l i="90">Ç</l:l>
+<l:l i="90">Ȉ</l:l>
+<l:l i="90">ȉ</l:l>
+<l:l i="90">ÈŠ</l:l>
+<l:l i="90">È‹</l:l>
+<l:l i="90">Ḭ</l:l>
+<l:l i="90">ḭ</l:l>
+<l:l i="90">Ḯ</l:l>
+<l:l i="90">ḯ</l:l>
+<l:l i="90">Ỉ</l:l>
+<l:l i="90">ỉ</l:l>
+<l:l i="90">Ị</l:l>
+<l:l i="90">ị</l:l>
+<l:l i="100">J</l:l>
+<l:l i="100">j</l:l>
+<l:l i="100">Ä´</l:l>
+<l:l i="100">ĵ</l:l>
+<l:l i="100">Ç°</l:l>
+<l:l i="100">Ê</l:l>
+<l:l i="110">K</l:l>
+<l:l i="110">k</l:l>
+<l:l i="110">Ķ</l:l>
+<l:l i="110">Ä·</l:l>
+<l:l i="110">Ƙ</l:l>
+<l:l i="110">Æ™</l:l>
+<l:l i="110">Ǩ</l:l>
+<l:l i="110">Ç©</l:l>
+<l:l i="110">Ḱ</l:l>
+<l:l i="110">ḱ</l:l>
+<l:l i="110">Ḳ</l:l>
+<l:l i="110">ḳ</l:l>
+<l:l i="110">Ḵ</l:l>
+<l:l i="110">ḵ</l:l>
+<l:l i="120">L</l:l>
+<l:l i="120">l</l:l>
+<l:l i="120">Ĺ</l:l>
+<l:l i="120">ĺ</l:l>
+<l:l i="120">Ä»</l:l>
+<l:l i="120">ļ</l:l>
+<l:l i="120">Ľ</l:l>
+<l:l i="120">ľ</l:l>
+<l:l i="120">Ä¿</l:l>
+<l:l i="120">Å€</l:l>
+<l:l i="120">Å</l:l>
+<l:l i="120">Å‚</l:l>
+<l:l i="120">Æš</l:l>
+<l:l i="120">Lj</l:l>
+<l:l i="120">È´</l:l>
+<l:l i="120">É«</l:l>
+<l:l i="120">ɬ</l:l>
+<l:l i="120">É­</l:l>
+<l:l i="120">Ḷ</l:l>
+<l:l i="120">ḷ</l:l>
+<l:l i="120">Ḹ</l:l>
+<l:l i="120">ḹ</l:l>
+<l:l i="120">Ḻ</l:l>
+<l:l i="120">ḻ</l:l>
+<l:l i="120">Ḽ</l:l>
+<l:l i="120">ḽ</l:l>
+<l:l i="130">M</l:l>
+<l:l i="130">m</l:l>
+<l:l i="130">ɱ</l:l>
+<l:l i="130">Ḿ</l:l>
+<l:l i="130">ḿ</l:l>
+<l:l i="130">á¹€</l:l>
+<l:l i="130">á¹</l:l>
+<l:l i="130">Ṃ</l:l>
+<l:l i="130">ṃ</l:l>
+<l:l i="140">N</l:l>
+<l:l i="140">n</l:l>
+<l:l i="140">Ñ</l:l>
+<l:l i="140">ñ</l:l>
+<l:l i="140">Ń</l:l>
+<l:l i="140">Å„</l:l>
+<l:l i="140">Å…</l:l>
+<l:l i="140">ņ</l:l>
+<l:l i="140">Ň</l:l>
+<l:l i="140">ň</l:l>
+<l:l i="140">Æ</l:l>
+<l:l i="140">ɲ</l:l>
+<l:l i="140">Æž</l:l>
+<l:l i="140">È </l:l>
+<l:l i="140">Ç‹</l:l>
+<l:l i="140">Ǹ</l:l>
+<l:l i="140">ǹ</l:l>
+<l:l i="140">ȵ</l:l>
+<l:l i="140">ɳ</l:l>
+<l:l i="140">Ṅ</l:l>
+<l:l i="140">á¹…</l:l>
+<l:l i="140">Ṇ</l:l>
+<l:l i="140">ṇ</l:l>
+<l:l i="140">Ṉ</l:l>
+<l:l i="140">ṉ</l:l>
+<l:l i="140">Ṋ</l:l>
+<l:l i="140">ṋ</l:l>
+<l:l i="150">O</l:l>
+<l:l i="150">o</l:l>
+<l:l i="150">Ã’</l:l>
+<l:l i="150">ò</l:l>
+<l:l i="150">Ó</l:l>
+<l:l i="150">ó</l:l>
+<l:l i="150">Ô</l:l>
+<l:l i="150">ô</l:l>
+<l:l i="150">Õ</l:l>
+<l:l i="150">õ</l:l>
+<l:l i="150">Ö</l:l>
+<l:l i="150">ö</l:l>
+<l:l i="150">Ø</l:l>
+<l:l i="150">ø</l:l>
+<l:l i="150">Ō</l:l>
+<l:l i="150">Å</l:l>
+<l:l i="150">ÅŽ</l:l>
+<l:l i="150">Å</l:l>
+<l:l i="150">Å</l:l>
+<l:l i="150">Å‘</l:l>
+<l:l i="150">ÆŸ</l:l>
+<l:l i="150">Æ </l:l>
+<l:l i="150">Æ¡</l:l>
+<l:l i="150">Ç‘</l:l>
+<l:l i="150">Ç’</l:l>
+<l:l i="150">Ǫ</l:l>
+<l:l i="150">Ç«</l:l>
+<l:l i="150">Ǭ</l:l>
+<l:l i="150">Ç­</l:l>
+<l:l i="150">Ǿ</l:l>
+<l:l i="150">Ç¿</l:l>
+<l:l i="150">Ȍ</l:l>
+<l:l i="150">È</l:l>
+<l:l i="150">ÈŽ</l:l>
+<l:l i="150">È</l:l>
+<l:l i="150">Ȫ</l:l>
+<l:l i="150">È«</l:l>
+<l:l i="150">Ȭ</l:l>
+<l:l i="150">È­</l:l>
+<l:l i="150">È®</l:l>
+<l:l i="150">ȯ</l:l>
+<l:l i="150">È°</l:l>
+<l:l i="150">ȱ</l:l>
+<l:l i="150">Ṍ</l:l>
+<l:l i="150">á¹</l:l>
+<l:l i="150">Ṏ</l:l>
+<l:l i="150">á¹</l:l>
+<l:l i="150">á¹</l:l>
+<l:l i="150">ṑ</l:l>
+<l:l i="150">á¹’</l:l>
+<l:l i="150">ṓ</l:l>
+<l:l i="150">Ọ</l:l>
+<l:l i="150">á»</l:l>
+<l:l i="150">Ỏ</l:l>
+<l:l i="150">á»</l:l>
+<l:l i="150">á»</l:l>
+<l:l i="150">ố</l:l>
+<l:l i="150">á»’</l:l>
+<l:l i="150">ồ</l:l>
+<l:l i="150">á»”</l:l>
+<l:l i="150">ổ</l:l>
+<l:l i="150">á»–</l:l>
+<l:l i="150">á»—</l:l>
+<l:l i="150">Ộ</l:l>
+<l:l i="150">á»™</l:l>
+<l:l i="150">Ớ</l:l>
+<l:l i="150">á»›</l:l>
+<l:l i="150">Ờ</l:l>
+<l:l i="150">á»</l:l>
+<l:l i="150">Ở</l:l>
+<l:l i="150">ở</l:l>
+<l:l i="150">á» </l:l>
+<l:l i="150">ỡ</l:l>
+<l:l i="150">Ợ</l:l>
+<l:l i="150">ợ</l:l>
+<l:l i="160">P</l:l>
+<l:l i="160">p</l:l>
+<l:l i="160">Ƥ</l:l>
+<l:l i="160">Æ¥</l:l>
+<l:l i="160">á¹”</l:l>
+<l:l i="160">ṕ</l:l>
+<l:l i="160">á¹–</l:l>
+<l:l i="160">á¹—</l:l>
+<l:l i="170">Q</l:l>
+<l:l i="170">q</l:l>
+<l:l i="170">Ê </l:l>
+<l:l i="180">R</l:l>
+<l:l i="180">r</l:l>
+<l:l i="180">Å”</l:l>
+<l:l i="180">Å•</l:l>
+<l:l i="180">Å–</l:l>
+<l:l i="180">Å—</l:l>
+<l:l i="180">Ř</l:l>
+<l:l i="180">Å™</l:l>
+<l:l i="180">È</l:l>
+<l:l i="180">È‘</l:l>
+<l:l i="180">È’</l:l>
+<l:l i="180">È“</l:l>
+<l:l i="180">ɼ</l:l>
+<l:l i="180">ɽ</l:l>
+<l:l i="180">ɾ</l:l>
+<l:l i="180">Ṙ</l:l>
+<l:l i="180">á¹™</l:l>
+<l:l i="180">Ṛ</l:l>
+<l:l i="180">á¹›</l:l>
+<l:l i="180">Ṝ</l:l>
+<l:l i="180">á¹</l:l>
+<l:l i="180">Ṟ</l:l>
+<l:l i="180">ṟ</l:l>
+<l:l i="190">S</l:l>
+<l:l i="190">s</l:l>
+<l:l i="190">Åš</l:l>
+<l:l i="190">Å›</l:l>
+<l:l i="190">Ŝ</l:l>
+<l:l i="190">Å</l:l>
+<l:l i="190">Åž</l:l>
+<l:l i="190">ÅŸ</l:l>
+<l:l i="190">Å </l:l>
+<l:l i="190">Å¡</l:l>
+<l:l i="190">Ș</l:l>
+<l:l i="190">È™</l:l>
+<l:l i="190">Ê‚</l:l>
+<l:l i="190">á¹ </l:l>
+<l:l i="190">ṡ</l:l>
+<l:l i="190">á¹¢</l:l>
+<l:l i="190">á¹£</l:l>
+<l:l i="190">Ṥ</l:l>
+<l:l i="190">á¹¥</l:l>
+<l:l i="190">Ṧ</l:l>
+<l:l i="190">ṧ</l:l>
+<l:l i="190">Ṩ</l:l>
+<l:l i="190">ṩ</l:l>
+<l:l i="200">T</l:l>
+<l:l i="200">t</l:l>
+<l:l i="200">Å¢</l:l>
+<l:l i="200">Å£</l:l>
+<l:l i="200">Ť</l:l>
+<l:l i="200">Å¥</l:l>
+<l:l i="200">Ŧ</l:l>
+<l:l i="200">ŧ</l:l>
+<l:l i="200">Æ«</l:l>
+<l:l i="200">Ƭ</l:l>
+<l:l i="200">Æ­</l:l>
+<l:l i="200">Æ®</l:l>
+<l:l i="200">ʈ</l:l>
+<l:l i="200">Èš</l:l>
+<l:l i="200">È›</l:l>
+<l:l i="200">ȶ</l:l>
+<l:l i="200">Ṫ</l:l>
+<l:l i="200">ṫ</l:l>
+<l:l i="200">Ṭ</l:l>
+<l:l i="200">á¹­</l:l>
+<l:l i="200">á¹®</l:l>
+<l:l i="200">ṯ</l:l>
+<l:l i="200">á¹°</l:l>
+<l:l i="200">á¹±</l:l>
+<l:l i="200">ẗ</l:l>
+<l:l i="210">U</l:l>
+<l:l i="210">u</l:l>
+<l:l i="210">Ù</l:l>
+<l:l i="210">ù</l:l>
+<l:l i="210">Ú</l:l>
+<l:l i="210">ú</l:l>
+<l:l i="210">Û</l:l>
+<l:l i="210">û</l:l>
+<l:l i="210">Ü</l:l>
+<l:l i="210">ü</l:l>
+<l:l i="210">Ũ</l:l>
+<l:l i="210">Å©</l:l>
+<l:l i="210">Ū</l:l>
+<l:l i="210">Å«</l:l>
+<l:l i="210">Ŭ</l:l>
+<l:l i="210">Å­</l:l>
+<l:l i="210">Å®</l:l>
+<l:l i="210">ů</l:l>
+<l:l i="210">Å°</l:l>
+<l:l i="210">ű</l:l>
+<l:l i="210">Ų</l:l>
+<l:l i="210">ų</l:l>
+<l:l i="210">Ư</l:l>
+<l:l i="210">Æ°</l:l>
+<l:l i="210">Ç“</l:l>
+<l:l i="210">Ç”</l:l>
+<l:l i="210">Ç•</l:l>
+<l:l i="210">Ç–</l:l>
+<l:l i="210">Ç—</l:l>
+<l:l i="210">ǘ</l:l>
+<l:l i="210">Ç™</l:l>
+<l:l i="210">Çš</l:l>
+<l:l i="210">Ç›</l:l>
+<l:l i="210">ǜ</l:l>
+<l:l i="210">È”</l:l>
+<l:l i="210">È•</l:l>
+<l:l i="210">È–</l:l>
+<l:l i="210">È—</l:l>
+<l:l i="210">á¹²</l:l>
+<l:l i="210">á¹³</l:l>
+<l:l i="210">á¹´</l:l>
+<l:l i="210">á¹µ</l:l>
+<l:l i="210">Ṷ</l:l>
+<l:l i="210">á¹·</l:l>
+<l:l i="210">Ṹ</l:l>
+<l:l i="210">á¹¹</l:l>
+<l:l i="210">Ṻ</l:l>
+<l:l i="210">á¹»</l:l>
+<l:l i="210">Ụ</l:l>
+<l:l i="210">ụ</l:l>
+<l:l i="210">Ủ</l:l>
+<l:l i="210">ủ</l:l>
+<l:l i="210">Ứ</l:l>
+<l:l i="210">ứ</l:l>
+<l:l i="210">Ừ</l:l>
+<l:l i="210">ừ</l:l>
+<l:l i="210">Ử</l:l>
+<l:l i="210">á»­</l:l>
+<l:l i="210">á»®</l:l>
+<l:l i="210">ữ</l:l>
+<l:l i="210">á»°</l:l>
+<l:l i="210">á»±</l:l>
+<l:l i="220">V</l:l>
+<l:l i="220">v</l:l>
+<l:l i="220">Ʋ</l:l>
+<l:l i="220">Ê‹</l:l>
+<l:l i="220">á¹¼</l:l>
+<l:l i="220">á¹½</l:l>
+<l:l i="220">á¹¾</l:l>
+<l:l i="220">ṿ</l:l>
+<l:l i="230">W</l:l>
+<l:l i="230">w</l:l>
+<l:l i="230">Å´</l:l>
+<l:l i="230">ŵ</l:l>
+<l:l i="230">Ẁ</l:l>
+<l:l i="230">áº</l:l>
+<l:l i="230">Ẃ</l:l>
+<l:l i="230">ẃ</l:l>
+<l:l i="230">Ẅ</l:l>
+<l:l i="230">ẅ</l:l>
+<l:l i="230">Ẇ</l:l>
+<l:l i="230">ẇ</l:l>
+<l:l i="230">Ẉ</l:l>
+<l:l i="230">ẉ</l:l>
+<l:l i="230">ẘ</l:l>
+<l:l i="240">X</l:l>
+<l:l i="240">x</l:l>
+<l:l i="240">Ẋ</l:l>
+<l:l i="240">ẋ</l:l>
+<l:l i="240">Ẍ</l:l>
+<l:l i="240">áº</l:l>
+<l:l i="250">Y</l:l>
+<l:l i="250">y</l:l>
+<l:l i="250">Ã</l:l>
+<l:l i="250">ý</l:l>
+<l:l i="250">ÿ</l:l>
+<l:l i="250">Ÿ</l:l>
+<l:l i="250">Ŷ</l:l>
+<l:l i="250">Å·</l:l>
+<l:l i="250">Ƴ</l:l>
+<l:l i="250">Æ´</l:l>
+<l:l i="250">Ȳ</l:l>
+<l:l i="250">ȳ</l:l>
+<l:l i="250">Ẏ</l:l>
+<l:l i="250">áº</l:l>
+<l:l i="250">ẙ</l:l>
+<l:l i="250">Ỳ</l:l>
+<l:l i="250">ỳ</l:l>
+<l:l i="250">á»´</l:l>
+<l:l i="250">ỵ</l:l>
+<l:l i="250">Ỷ</l:l>
+<l:l i="250">á»·</l:l>
+<l:l i="250">Ỹ</l:l>
+<l:l i="250">ỹ</l:l>
+<l:l i="260">Z</l:l>
+<l:l i="260">z</l:l>
+<l:l i="260">Ź</l:l>
+<l:l i="260">ź</l:l>
+<l:l i="260">Å»</l:l>
+<l:l i="260">ż</l:l>
+<l:l i="260">Ž</l:l>
+<l:l i="260">ž</l:l>
+<l:l i="260">Ƶ</l:l>
+<l:l i="260">ƶ</l:l>
+<l:l i="260">Ȥ</l:l>
+<l:l i="260">È¥</l:l>
+<l:l i="260">Ê</l:l>
+<l:l i="260">Ê‘</l:l>
+<l:l i="260">áº</l:l>
+<l:l i="260">ẑ</l:l>
+<l:l i="260">Ẓ</l:l>
+<l:l i="260">ẓ</l:l>
+<l:l i="260">Ẕ</l:l>
+<l:l i="260">ẕ</l:l>
+</l:letters>
+</l:l10n>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/bn_in.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/bn_in.xml
new file mode 100644
index 0000000..88404a0
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/bn_in.xml
@@ -0,0 +1,660 @@
+<?xml version="1.0" encoding="utf-8"?>
+<l:l10n xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0" language="en" english-language-name="English">
+
+<!-- * This file is generated automatically. -->
+<!-- * To submit changes to this file upstream (to the DocBook Project) -->
+<!-- * do not submit an edited version of this file. Instead, submit an -->
+<!-- * edited version of the source file at the following location: -->
+<!-- * -->
+<!-- * https://docbook.svn.sourceforge.net/svnroot/docbook/trunk/gentext/locale/bn_in.xml -->
+<!-- * -->
+<!-- * E-mail the edited bn_in.xml source file to: -->
+<!-- * -->
+<!-- * docbook-developers@lists.sourceforge.net -->
+
+<!-- ******************************************************************** -->
+
+<!-- This file is part of the XSL DocBook Stylesheet distribution. -->
+<!-- See ../README or http://docbook.sf.net/release/xsl/current/ for -->
+<!-- copyright and other information. -->
+
+<!-- ******************************************************************** -->
+<!-- In these files, % with a letter is used for a placeholder: -->
+<!-- %t is the current element's title -->
+<!-- %s is the current element's subtitle (if applicable)-->
+<!-- %n is the current element's number label-->
+<!-- %p is the current element's page number (if applicable)-->
+<!-- ******************************************************************** -->
+
+
+<l:gentext key="Abstract" text="সারসংকà§à¦·à§‡à¦ª"/>
+<l:gentext key="abstract" text="সারসংকà§à¦·à§‡à¦ª"/>
+<l:gentext key="Acknowledgements" text="সà§à¦¬à§€à¦•à§ƒà¦¤à¦¿"/>
+<l:gentext key="acknowledgements" text="সà§à¦¬à§€à¦•à§ƒà¦¤à¦¿"/>
+<l:gentext key="Answer" text="উতà§à¦¤à¦°:"/>
+<l:gentext key="answer" text="উতà§à¦¤à¦°:"/>
+<l:gentext key="Appendix" text="পরিশিষà§à¦Ÿ"/>
+<l:gentext key="appendix" text="পরিশিষà§à¦Ÿ"/>
+<l:gentext key="Article" text="পà§à¦°à¦¬à¦¨à§à¦§"/>
+<l:gentext key="article" text="পà§à¦°à¦¬à¦¨à§à¦§"/>
+<l:gentext key="Author" text="লেখক"/>
+<l:gentext key="Bibliography" text="গà§à¦°à¦¨à§à¦¥à¦ªà¦žà§à¦œà¦¿"/>
+<l:gentext key="bibliography" text="গà§à¦°à¦¨à§à¦¥à¦ªà¦žà§à¦œà¦¿"/>
+<l:gentext key="Book" text="বই"/>
+<l:gentext key="book" text="বই"/>
+<l:gentext key="CAUTION" text="সাবধান"/>
+<l:gentext key="Caution" text="সাবধান"/>
+<l:gentext key="caution" text="সাবধান"/>
+<l:gentext key="Chapter" text="অধà§à¦¯à¦¾à§Ÿ"/>
+<l:gentext key="chapter" text="অধà§à¦¯à¦¾à§Ÿ"/>
+<l:gentext key="Colophon" text="গà§à¦°à¦¨à§à¦¥à¦ªà¦°à¦¿à¦šà§Ÿ"/>
+<l:gentext key="colophon" text="গà§à¦°à¦¨à§à¦¥à¦ªà¦°à¦¿à¦šà§Ÿ"/>
+<l:gentext key="Copyright" text="সà§à¦¬à¦¤à§à¦¬à¦¾à¦§à¦¿à¦•à¦¾à¦°"/>
+<l:gentext key="copyright" text="সà§à¦¬à¦¤à§à¦¬à¦¾à¦§à¦¿à¦•à¦¾à¦°"/>
+<l:gentext key="Dedication" text="উৎসরà§à¦—পতà§à¦°"/>
+<l:gentext key="dedication" text="উৎসরà§à¦—পতà§à¦°"/>
+<l:gentext key="Edition" text="সংসà§à¦•à¦°à¦£"/>
+<l:gentext key="edition" text="সংসà§à¦•à¦°à¦£"/>
+<l:gentext key="Editor" text="সমà§à¦ªà¦¾à¦¦à¦•"/>
+<l:gentext key="Equation" text="সমীকরণ"/>
+<l:gentext key="equation" text="সমীকরণ"/>
+<l:gentext key="Example" text="উদাহরণ"/>
+<l:gentext key="example" text="উদাহরণ"/>
+<l:gentext key="Figure" text="চিতà§à¦°"/>
+<l:gentext key="figure" text="চিতà§à¦°"/>
+<l:gentext key="Glossary" text="পরিভাষাকোষ"/>
+<l:gentext key="glossary" text="পরিভাষাকোষ"/>
+<l:gentext key="GlossSee" text="দà§à¦°à¦·à§à¦Ÿà¦¬à§à¦¯"/>
+<l:gentext key="glosssee" text="দà§à¦°à¦·à§à¦Ÿà¦¬à§à¦¯"/>
+<l:gentext key="GlossSeeAlso" text="অতিরিকà§à¦¤ দà§à¦°à¦·à§à¦Ÿà¦¬à§à¦¯"/>
+<l:gentext key="glossseealso" text="অতিরিকà§à¦¤ দà§à¦°à¦·à§à¦Ÿà¦¬à§à¦¯"/>
+<l:gentext key="IMPORTANT" text="গà§à¦°à§à¦¤à§à¦¬à¦ªà§‚রà§à¦£"/>
+<l:gentext key="important" text="গà§à¦°à§à¦¤à§à¦¬à¦ªà§‚রà§à¦£"/>
+<l:gentext key="Important" text="গà§à¦°à§à¦¤à§à¦¬à¦ªà§‚রà§à¦£"/>
+<l:gentext key="Index" text="বিষয়সূচি"/>
+<l:gentext key="index" text="বিষয়সূচি"/>
+<l:gentext key="ISBN" text="ISBN"/>
+<l:gentext key="isbn" text="ISBN"/>
+<l:gentext key="LegalNotice" text="আইনী বিবৃতি"/>
+<l:gentext key="legalnotice" text="আইনী বিবৃতি"/>
+<l:gentext key="MsgAud" text="উদà§à¦¦à¦¿à¦·à§à¦Ÿ পাঠকবরà§à¦—"/>
+<l:gentext key="msgaud" text="উদà§à¦¦à¦¿à¦·à§à¦Ÿ পাঠকবরà§à¦—"/>
+<l:gentext key="MsgLevel" text="সà§à¦¤à¦°"/>
+<l:gentext key="msglevel" text="সà§à¦¤à¦°"/>
+<l:gentext key="MsgOrig" text="মূল"/>
+<l:gentext key="msgorig" text="মূল"/>
+<l:gentext key="NOTE" text="উলà§à¦²à§‡à¦–à§à¦¯"/>
+<l:gentext key="Note" text="উলà§à¦²à§‡à¦–à§à¦¯"/>
+<l:gentext key="note" text="উলà§à¦²à§‡à¦–à§à¦¯"/>
+<l:gentext key="Part" text="পরিচà§à¦›à§‡à¦¦"/>
+<l:gentext key="part" text="পরিচà§à¦›à§‡à¦¦"/>
+<l:gentext key="Preface" text="মà§à¦–বনà§à¦§"/>
+<l:gentext key="preface" text="মà§à¦–বনà§à¦§"/>
+<l:gentext key="Procedure" text="পদà§à¦§à¦¤à¦¿"/>
+<l:gentext key="procedure" text="পদà§à¦§à¦¤à¦¿"/>
+<l:gentext key="ProductionSet" text="নিরà§à¦®à¦¾à¦£"/>
+<l:gentext key="PubDate" text="পà§à¦°à¦•à¦¾à¦¶à¦¨à¦¾à¦° তারিখ"/>
+<l:gentext key="pubdate" text="পà§à¦°à¦•à¦¾à¦¶à¦¨à¦¾à¦° তারিখ"/>
+<l:gentext key="Published" text="পà§à¦°à¦•à¦¾à¦¶à¦¿à¦¤"/>
+<l:gentext key="published" text="পà§à¦°à¦•à¦¾à¦¶à¦¿à¦¤"/>
+<l:gentext key="Publisher" text="পà§à¦°à¦•à¦¾à¦¶à¦•"/>
+<l:gentext key="Qandadiv" text="পà§à¦°à¦¶à§à¦¨à§‹à¦¤à§à¦¤à¦°"/>
+<l:gentext key="qandadiv" text="পà§à¦°à¦¶à§à¦¨à§‹à¦¤à§à¦¤à¦°"/>
+<l:gentext key="QandASet" text="সাধারণ কিছৠজিজà§à¦žà¦¾à¦¸à¦¾"/>
+<l:gentext key="Question" text="পà§à¦°à¦¶à§à¦¨:"/>
+<l:gentext key="question" text="পà§à¦°à¦¶à§à¦¨:"/>
+<l:gentext key="RefEntry" text="পৃষà§à¦ à¦¾"/>
+<l:gentext key="refentry" text="পৃষà§à¦ à¦¾"/>
+<l:gentext key="Reference" text="পà§à¦°à¦¸à¦™à§à¦— নিরà§à¦¦à§‡à¦¶"/>
+<l:gentext key="reference" text="পà§à¦°à¦¸à¦™à§à¦— নিরà§à¦¦à§‡à¦¶"/>
+<l:gentext key="References" text="পà§à¦°à¦¸à¦™à§à¦— নিরà§à¦¦à§‡à¦¶ তালিকা"/>
+<l:gentext key="RefName" text="নাম"/>
+<l:gentext key="refname" text="নাম"/>
+<l:gentext key="RefSection" text="বিভাগ"/>
+<l:gentext key="refsection" text="বিভাগ"/>
+<l:gentext key="RefSynopsisDiv" text="সারাংশ"/>
+<l:gentext key="refsynopsisdiv" text="সারাংশ"/>
+<l:gentext key="RevHistory" text="পরিমারà§à¦œà¦¨à¦¾à¦° তথà§à¦¯"/>
+<l:gentext key="revhistory" text="পরিমারà§à¦œà¦¨à¦¾à¦° তথà§à¦¯"/>
+<l:gentext key="revision" text="পরিমারà§à¦œà¦¨à¦¾"/>
+<l:gentext key="Revision" text="পরিমারà§à¦œà¦¨à¦¾"/>
+<l:gentext key="sect1" text="বিভাগ"/>
+<l:gentext key="sect2" text="বিভাগ"/>
+<l:gentext key="sect3" text="বিভাগ"/>
+<l:gentext key="sect4" text="বিভাগ"/>
+<l:gentext key="sect5" text="বিভাগ"/>
+<l:gentext key="section" text="বিভাগ"/>
+<l:gentext key="Section" text="বিভাগ"/>
+<l:gentext key="see" text="দà§à¦°à¦·à§à¦Ÿà¦¬à§à¦¯"/>
+<l:gentext key="See" text="দà§à¦°à¦·à§à¦Ÿà¦¬à§à¦¯"/>
+<l:gentext key="seealso" text="অতিরিকà§à¦¤ দà§à¦°à¦·à§à¦Ÿà¦¬à§à¦¯"/>
+<l:gentext key="Seealso" text="অতিরিকà§à¦¤ দà§à¦°à¦·à§à¦Ÿà¦¬à§à¦¯"/>
+<l:gentext key="SeeAlso" text="অতিরিকà§à¦¤ দà§à¦°à¦·à§à¦Ÿà¦¬à§à¦¯"/>
+<l:gentext key="set" text="সংকলন"/>
+<l:gentext key="Set" text="সংকলন"/>
+<l:gentext key="setindex" text="সংকলন সূচি"/>
+<l:gentext key="SetIndex" text="সংকলন সূচি"/>
+<l:gentext key="Sidebar" text="পারà§à¦¶à§à¦¬à¦¬à¦°à§à¦¤à§€ সà§à¦¤à¦®à§à¦­"/>
+<l:gentext key="sidebar" text="পারà§à¦¶à§à¦¬à¦¬à¦°à§à¦¤à§€ সà§à¦¤à¦®à§à¦­"/>
+<l:gentext key="step" text="ধাপ"/>
+<l:gentext key="Step" text="ধাপ"/>
+<l:gentext key="table" text="সারণি"/>
+<l:gentext key="Table" text="সারণি"/>
+<l:gentext key="task" text="করà§à¦®"/>
+<l:gentext key="Task" text="করà§à¦®"/>
+<l:gentext key="tip" text="সূতà§à¦°"/>
+<l:gentext key="TIP" text="সূতà§à¦°"/>
+<l:gentext key="Tip" text="সূতà§à¦°"/>
+<l:gentext key="Warning" text="সতরà§à¦•à¦¬à¦¾à¦°à§à¦¤à¦¾"/>
+<l:gentext key="warning" text="সতরà§à¦•à¦¬à¦¾à¦°à§à¦¤à¦¾"/>
+<l:gentext key="WARNING" text="সতরà§à¦•à¦¬à¦¾à¦°à§à¦¤à¦¾"/>
+<l:gentext key="and" text="à¦à¦¬à¦‚"/>
+<l:gentext key="by" text="দà§à¦¬à¦¾à¦°à¦¾"/>
+<l:gentext key="Edited" text="সমà§à¦ªà¦¾à¦¦à¦¿à¦¤"/>
+<l:gentext key="edited" text="সমà§à¦ªà¦¾à¦¦à¦¿à¦¤"/>
+<l:gentext key="Editedby" text="সমà§à¦ªà¦¾à¦¦à¦•"/>
+<l:gentext key="editedby" text="সমà§à¦ªà¦¾à¦¦à¦•"/>
+<l:gentext key="in" text="অনà§à¦¤à¦°à§à¦­à§à¦•à§à¦¤"/>
+<l:gentext key="lastlistcomma" text=","/>
+<l:gentext key="listcomma" text=","/>
+<l:gentext key="notes" text="টিকা টিপà§à¦ªà¦¨à¦¿"/>
+<l:gentext key="Notes" text="টিকা টিপà§à¦ªà¦¨à¦¿"/>
+<l:gentext key="Pgs" text="পৃষà§à¦ à¦¾"/>
+<l:gentext key="pgs" text="পৃষà§à¦ à¦¾"/>
+<l:gentext key="Revisedby" text="পরিবরà§à¦§à¦•: "/>
+<l:gentext key="revisedby" text="পরিবরà§à¦§à¦•: "/>
+<l:gentext key="TableNotes" text="টিকা টিপà§à¦ªà¦¨à¦¿"/>
+<l:gentext key="tablenotes" text="টিকা টিপà§à¦ªà¦¨à¦¿"/>
+<l:gentext key="TableofContents" text="সূচিপতà§à¦°"/>
+<l:gentext key="tableofcontents" text="সূচিপতà§à¦°"/>
+<l:gentext key="unexpectedelementname" text="অপà§à¦°à¦¤à§à¦¯à¦¾à¦¶à¦¿à¦¤ সতà§à¦¤à§à¦¬à¦¾à¦° নাম"/>
+<l:gentext key="unsupported" text="অসমরà§à¦¥à¦¿à¦¤"/>
+<l:gentext key="xrefto" text="xref নিরà§à¦¦à§‡à¦¶à¦¿à¦•à¦¾"/>
+<l:gentext key="Authors" text="লেখক"/>
+<l:gentext key="copyeditor" text="পà§à¦°à¦¤à¦¿à¦²à¦¿à¦ªà¦¿ সমà§à¦ªà¦¾à¦¦à¦•"/>
+<l:gentext key="graphicdesigner" text="চিতà§à¦° শিলà§à¦ªà§€"/>
+<l:gentext key="productioneditor" text="নিরà§à¦®à¦¾à¦£ সমà§à¦ªà¦¾à¦¦à¦•"/>
+<l:gentext key="technicaleditor" text="পà§à¦°à¦¯à§à¦•à§à¦¤à¦¿à¦¬à¦¿à¦·à§Ÿà¦• সমà§à¦ªà¦¾à¦¦à¦•"/>
+<l:gentext key="translator" text="অনà§à¦¬à¦¾à¦¦à¦•"/>
+<l:gentext key="listofequations" text="সমীকরণের তালিকা"/>
+<l:gentext key="ListofEquations" text="সমীকরণের তালিকা"/>
+<l:gentext key="ListofExamples" text="উদাহরণের তালিকা"/>
+<l:gentext key="listofexamples" text="উদাহরণের তালিকা"/>
+<l:gentext key="ListofFigures" text="ছবির তালিকা"/>
+<l:gentext key="listoffigures" text="ছবির তালিকা"/>
+<l:gentext key="ListofProcedures" text="পদà§à¦§à¦¤à¦¿à¦° তালিকা"/>
+<l:gentext key="listofprocedures" text="পদà§à¦§à¦¤à¦¿à¦° তালিকা"/>
+<l:gentext key="listoftables" text="সারণির তালিকা"/>
+<l:gentext key="ListofTables" text="সারণির তালিকা"/>
+<l:gentext key="ListofUnknown" text="অজানা বসà§à¦¤à§à¦° তালিকা"/>
+<l:gentext key="listofunknown" text="অজানা বসà§à¦¤à§à¦° তালিকা"/>
+<l:gentext key="nav-home" text="পà§à¦°à¦¾à¦°à¦®à§à¦­à¦¿à¦• পৃষà§à¦ à¦¾"/>
+<l:gentext key="nav-next" text="পরবরà§à¦¤à§€"/>
+<l:gentext key="nav-next-sibling" text="অতিবরà§à¦¤à¦¨"/>
+<l:gentext key="nav-prev" text="পূরà§à¦¬à¦¬à¦°à§à¦¤à§€"/>
+<l:gentext key="nav-prev-sibling" text="পশà§à¦šà¦¾à§Žà¦¦à¦¿à¦¶à¦¾à§Ÿ অতিবরà§à¦¤à¦¨"/>
+<l:gentext key="nav-up" text="উপর"/>
+<l:gentext key="nav-toc" text="সূচিপতà§à¦°"/>
+<l:gentext key="Draft" text="খসড়া"/>
+<l:gentext key="above" text="ঊরà§à¦§à§à¦¬"/>
+<l:gentext key="below" text="নিমà§à¦¨"/>
+<l:gentext key="sectioncalled" text="উলà§à¦²à¦¿à¦–িত বিভাগ"/>
+<l:gentext key="index symbols" text="সংকেত"/>
+<l:gentext key="writing-mode" text="lr-tb"/>
+<l:gentext key="lowercase.alpha" text="abcdefghijklmnopqrstuvwxyz" lang="en"/>
+<l:gentext key="uppercase.alpha" text="ABCDEFGHIJKLMNOPQRSTUVWXYZ" lang="en"/>
+<l:gentext key="normalize.sort.input" text="AaÀàÃáÂâÃãÄäÅåĀÄĂ㥹ÇǎǞǟǠǡǺǻȀÈȂȃȦȧḀá¸áºšáº áº¡áº¢áº£áº¤áº¥áº¦áº§áº¨áº©áºªáº«áº¬áº­áº®áº¯áº°áº±áº²áº³áº´áºµáº¶áº·BbÆ€ÆɓƂƃḂḃḄḅḆḇCcÇçĆćĈĉĊċČÄƇƈɕḈḉDdÄŽÄÄđƊɗƋƌDžDzȡɖḊḋḌá¸á¸Žá¸á¸á¸‘ḒḓEeÈèÉéÊêËëĒēĔĕĖėĘęĚěȄȅȆȇȨȩḔḕḖḗḘḙḚḛḜá¸áº¸áº¹áººáº»áº¼áº½áº¾áº¿á»€á»á»‚ểỄễỆệFfƑƒḞḟGgÄœÄĞğĠġĢģƓɠǤǥǦǧǴǵḠḡHhĤĥĦħȞȟɦḢḣḤḥḦḧḨḩḪḫẖIiÌìÃíÎîÃïĨĩĪīĬĭĮįİƗɨÇÇȈȉȊȋḬḭḮḯỈỉỊịJjĴĵǰÊKkĶķƘƙǨǩḰḱḲḳḴḵLlĹĺĻļĽľĿŀÅłƚLjȴɫɬɭḶḷḸḹḺḻḼḽMmɱḾḿṀá¹á¹‚ṃNnÑñŃńŅņŇňÆɲƞȠNjǸǹȵɳṄṅṆṇṈṉṊṋOoÒòÓóÔôÕõÖöØøŌÅÅŽÅÅőƟƠơǑǒǪǫǬǭǾǿȌÈÈŽÈȪȫȬȭȮȯȰȱṌá¹á¹Žá¹á¹á¹‘ṒṓỌá»á»Žá»á»á»‘ỒồỔổỖỗỘộỚớỜá»á»žá»Ÿá» á»¡á»¢á»£PpƤƥṔṕṖṗQqÊ RrŔŕŖŗŘřÈȑȒȓɼɽɾṘṙṚṛṜá¹á¹žá¹ŸSsŚśŜÅŞşŠšȘșʂṠṡṢṣṤṥṦṧṨṩTtŢţŤťŦŧƫƬƭƮʈȚțȶṪṫṬṭṮṯṰṱẗUuÙùÚúÛûÜüŨũŪūŬŭŮůŰűŲųƯưǓǔǕǖǗǘǙǚǛǜȔȕȖȗṲṳṴṵṶṷṸṹṺṻỤụỦủỨứỪừỬửỮữỰựVvƲʋṼṽṾṿWwŴŵẀáºáº‚ẃẄẅẆẇẈẉẘXxẊẋẌáºYyÃýÿŸŶŷƳƴȲȳẎáºáº™á»²á»³á»´á»µá»¶á»·á»¸á»¹ZzŹźŻżŽžƵƶȤȥÊÊ‘áºáº‘ẒẓẔẕẕ" lang="en"/>
+<l:gentext key="normalize.sort.output" text="AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBCCCCCCCCCCCCCCCCCDDDDDDDDDDDDDDDDDDDDDDDDEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEFFFFFFGGGGGGGGGGGGGGGGGGGGHHHHHHHHHHHHHHHHHHHHIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIJJJJJJKKKKKKKKKKKKKKLLLLLLLLLLLLLLLLLLLLLLLLLLMMMMMMMMMNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOPPPPPPPPQQQRRRRRRRRRRRRRRRRRRRRRRRSSSSSSSSSSSSSSSSSSSSSSSTTTTTTTTTTTTTTTTTTTTTTTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUVVVVVVVVWWWWWWWWWWWWWWWXXXXXXYYYYYYYYYYYYYYYYYYYYYYYZZZZZZZZZZZZZZZZZZZZZ" lang="en"/>
+<l:dingbat key="startquote" text="“"/>
+<l:dingbat key="endquote" text="â€"/>
+<l:dingbat key="nestedstartquote" text="‘"/>
+<l:dingbat key="nestedendquote" text="’"/>
+<l:dingbat key="singlestartquote" text="‘"/>
+<l:dingbat key="singleendquote" text="’"/>
+<l:dingbat key="bullet" text="•"/>
+<l:gentext key="hyphenation-character" text="-"/>
+<l:gentext key="hyphenation-push-character-count" text="2"/>
+<l:gentext key="hyphenation-remain-character-count" text="2"/>
+<l:context name="styles"><l:template name="person-name" text="first-last"/>
+</l:context>
+<l:context name="title"><l:template name="abstract" text="%t"/>
+<l:template name="acknowledgements" text="%t"/>
+<l:template name="answer" text="%t"/>
+<l:template name="appendix" text="পরিশিষà§à¦ŸÂ %n. %t"/>
+<l:template name="article" text="%t"/>
+<l:template name="authorblurb" text="%t"/>
+<l:template name="bibliodiv" text="%t"/>
+<l:template name="biblioentry" text="%t"/>
+<l:template name="bibliography" text="%t"/>
+<l:template name="bibliolist" text="%t"/>
+<l:template name="bibliomixed" text="%t"/>
+<l:template name="bibliomset" text="%t"/>
+<l:template name="biblioset" text="%t"/>
+<l:template name="blockquote" text="%t"/>
+<l:template name="book" text="%t"/>
+<l:template name="calloutlist" text="%t"/>
+<l:template name="caution" text="%t"/>
+<l:template name="chapter" text="অধà§à¦¯à¦¾à§ŸÂ %n. %t"/>
+<l:template name="colophon" text="%t"/>
+<l:template name="dedication" text="%t"/>
+<l:template name="equation" text="সমীকরণ %n. %t"/>
+<l:template name="example" text="উদাহরণ %n. %t"/>
+<l:template name="figure" text="চিতà§à¦°Â %n. %t"/>
+<l:template name="foil" text="%t"/>
+<l:template name="foilgroup" text="%t"/>
+<l:template name="formalpara" text="%t"/>
+<l:template name="glossary" text="%t"/>
+<l:template name="glossdiv" text="%t"/>
+<l:template name="glosslist" text="%t"/>
+<l:template name="glossentry" text="%t"/>
+<l:template name="important" text="%t"/>
+<l:template name="index" text="%t"/>
+<l:template name="indexdiv" text="%t"/>
+<l:template name="itemizedlist" text="%t"/>
+<l:template name="legalnotice" text="%t"/>
+<l:template name="listitem" text=""/>
+<l:template name="lot" text="%t"/>
+<l:template name="msg" text="%t"/>
+<l:template name="msgexplan" text="%t"/>
+<l:template name="msgmain" text="%t"/>
+<l:template name="msgrel" text="%t"/>
+<l:template name="msgset" text="%t"/>
+<l:template name="msgsub" text="%t"/>
+<l:template name="note" text="%t"/>
+<l:template name="orderedlist" text="%t"/>
+<l:template name="part" text="পরিচà§à¦›à§‡à¦¦Â %n. %t"/>
+<l:template name="partintro" text="%t"/>
+<l:template name="preface" text="%t"/>
+<l:template name="procedure" text="%t"/>
+<l:template name="procedure.formal" text="পদà§à¦§à¦¤à¦¿Â %n. %t"/>
+<l:template name="productionset" text="%t"/>
+<l:template name="productionset.formal" text="নিরà§à¦®à¦¾à¦£Â %n"/>
+<l:template name="qandadiv" text="%t"/>
+<l:template name="qandaentry" text="%t"/>
+<l:template name="qandaset" text="%t"/>
+<l:template name="question" text="%t"/>
+<l:template name="refentry" text="%t"/>
+<l:template name="reference" text="%t"/>
+<l:template name="refsection" text="%t"/>
+<l:template name="refsect1" text="%t"/>
+<l:template name="refsect2" text="%t"/>
+<l:template name="refsect3" text="%t"/>
+<l:template name="refsynopsisdiv" text="%t"/>
+<l:template name="refsynopsisdivinfo" text="%t"/>
+<l:template name="segmentedlist" text="%t"/>
+<l:template name="set" text="%t"/>
+<l:template name="setindex" text="%t"/>
+<l:template name="sidebar" text="%t"/>
+<l:template name="step" text="%t"/>
+<l:template name="table" text="সারণি %n. %t"/>
+<l:template name="task" text="%t"/>
+<l:template name="tasksummary" text="%t"/>
+<l:template name="taskprerequisites" text="%t"/>
+<l:template name="taskrelated" text="%t"/>
+<l:template name="tip" text="%t"/>
+<l:template name="toc" text="%t"/>
+<l:template name="variablelist" text="%t"/>
+<l:template name="varlistentry" text=""/>
+<l:template name="warning" text="%t"/>
+</l:context>
+<l:context name="title-unnumbered"><l:template name="appendix" text="%t"/>
+<l:template name="article/appendix" text="%t"/>
+<l:template name="bridgehead" text="%t"/>
+<l:template name="chapter" text="%t"/>
+<l:template name="sect1" text="%t"/>
+<l:template name="sect2" text="%t"/>
+<l:template name="sect3" text="%t"/>
+<l:template name="sect4" text="%t"/>
+<l:template name="sect5" text="%t"/>
+<l:template name="section" text="%t"/>
+<l:template name="simplesect" text="%t"/>
+<l:template name="part" text="%t"/>
+</l:context>
+<l:context name="title-numbered"><l:template name="appendix" text="পরিশিষà§à¦ŸÂ %n. %t"/>
+<l:template name="article/appendix" text="%n. %t"/>
+<l:template name="bridgehead" text="%n. %t"/>
+<l:template name="chapter" text="অধà§à¦¯à¦¾à§ŸÂ %n. %t"/>
+<l:template name="part" text="পরিচà§à¦›à§‡à¦¦Â %n. %t"/>
+<l:template name="sect1" text="%n. %t"/>
+<l:template name="sect2" text="%n. %t"/>
+<l:template name="sect3" text="%n. %t"/>
+<l:template name="sect4" text="%n. %t"/>
+<l:template name="sect5" text="%n. %t"/>
+<l:template name="section" text="%n. %t"/>
+<l:template name="simplesect" text="%t"/>
+</l:context>
+<l:context name="subtitle"><l:template name="appendix" text="%s"/>
+<l:template name="acknowledgements" text="%s"/>
+<l:template name="article" text="%s"/>
+<l:template name="bibliodiv" text="%s"/>
+<l:template name="biblioentry" text="%s"/>
+<l:template name="bibliography" text="%s"/>
+<l:template name="bibliomixed" text="%s"/>
+<l:template name="bibliomset" text="%s"/>
+<l:template name="biblioset" text="%s"/>
+<l:template name="book" text="%s"/>
+<l:template name="chapter" text="%s"/>
+<l:template name="colophon" text="%s"/>
+<l:template name="dedication" text="%s"/>
+<l:template name="glossary" text="%s"/>
+<l:template name="glossdiv" text="%s"/>
+<l:template name="index" text="%s"/>
+<l:template name="indexdiv" text="%s"/>
+<l:template name="lot" text="%s"/>
+<l:template name="part" text="%s"/>
+<l:template name="partintro" text="%s"/>
+<l:template name="preface" text="%s"/>
+<l:template name="refentry" text="%s"/>
+<l:template name="reference" text="%s"/>
+<l:template name="refsection" text="%s"/>
+<l:template name="refsect1" text="%s"/>
+<l:template name="refsect2" text="%s"/>
+<l:template name="refsect3" text="%s"/>
+<l:template name="refsynopsisdiv" text="%s"/>
+<l:template name="sect1" text="%s"/>
+<l:template name="sect2" text="%s"/>
+<l:template name="sect3" text="%s"/>
+<l:template name="sect4" text="%s"/>
+<l:template name="sect5" text="%s"/>
+<l:template name="section" text="%s"/>
+<l:template name="set" text="%s"/>
+<l:template name="setindex" text="%s"/>
+<l:template name="sidebar" text="%s"/>
+<l:template name="simplesect" text="%s"/>
+<l:template name="toc" text="%s"/>
+</l:context>
+<l:context name="xref"><l:template name="abstract" text="%t"/>
+<l:template name="acknowledgements" text="%t"/>
+<l:template name="answer" text="উতà§à¦¤à¦°: %n"/>
+<l:template name="appendix" text="%t"/>
+<l:template name="article" text="%t"/>
+<l:template name="authorblurb" text="%t"/>
+<l:template name="bibliodiv" text="%t"/>
+<l:template name="bibliography" text="%t"/>
+<l:template name="bibliomset" text="%t"/>
+<l:template name="biblioset" text="%t"/>
+<l:template name="blockquote" text="%t"/>
+<l:template name="book" text="%t"/>
+<l:template name="calloutlist" text="%t"/>
+<l:template name="caution" text="%t"/>
+<l:template name="chapter" text="%t"/>
+<l:template name="colophon" text="%t"/>
+<l:template name="constraintdef" text="%t"/>
+<l:template name="dedication" text="%t"/>
+<l:template name="equation" text="%t"/>
+<l:template name="example" text="%t"/>
+<l:template name="figure" text="%t"/>
+<l:template name="foil" text="%t"/>
+<l:template name="foilgroup" text="%t"/>
+<l:template name="formalpara" text="%t"/>
+<l:template name="glossary" text="%t"/>
+<l:template name="glossdiv" text="%t"/>
+<l:template name="important" text="%t"/>
+<l:template name="index" text="%t"/>
+<l:template name="indexdiv" text="%t"/>
+<l:template name="itemizedlist" text="%t"/>
+<l:template name="legalnotice" text="%t"/>
+<l:template name="listitem" text="%n"/>
+<l:template name="lot" text="%t"/>
+<l:template name="msg" text="%t"/>
+<l:template name="msgexplan" text="%t"/>
+<l:template name="msgmain" text="%t"/>
+<l:template name="msgrel" text="%t"/>
+<l:template name="msgset" text="%t"/>
+<l:template name="msgsub" text="%t"/>
+<l:template name="note" text="%t"/>
+<l:template name="orderedlist" text="%t"/>
+<l:template name="part" text="%t"/>
+<l:template name="partintro" text="%t"/>
+<l:template name="preface" text="%t"/>
+<l:template name="procedure" text="%t"/>
+<l:template name="productionset" text="%t"/>
+<l:template name="qandadiv" text="%t"/>
+<l:template name="qandaentry" text="পà§à¦°à¦¶à§à¦¨: %n"/>
+<l:template name="qandaset" text="%t"/>
+<l:template name="question" text="পà§à¦°à¦¶à§à¦¨: %n"/>
+<l:template name="reference" text="%t"/>
+<l:template name="refsynopsisdiv" text="%t"/>
+<l:template name="segmentedlist" text="%t"/>
+<l:template name="set" text="%t"/>
+<l:template name="setindex" text="%t"/>
+<l:template name="sidebar" text="%t"/>
+<l:template name="table" text="%t"/>
+<l:template name="task" text="%t"/>
+<l:template name="tip" text="%t"/>
+<l:template name="toc" text="%t"/>
+<l:template name="variablelist" text="%t"/>
+<l:template name="varlistentry" text="%n"/>
+<l:template name="warning" text="%t"/>
+<l:template name="olink.document.citation" text=" in %o"/>
+<l:template name="olink.page.citation" text=" (page %p)"/>
+<l:template name="page.citation" text=" [%p]"/>
+<l:template name="page" text="(page %p)"/>
+<l:template name="docname" text=" in %o"/>
+<l:template name="docnamelong" text=" in the document titled %o"/>
+<l:template name="pageabbrev" text="(p. %p)"/>
+<l:template name="Page" text="Page %p"/>
+<l:template name="bridgehead" text="উলà§à¦²à¦¿à¦–িত বিভাগ “%tâ€"/>
+<l:template name="refsection" text="উলà§à¦²à¦¿à¦–িত বিভাগ “%tâ€"/>
+<l:template name="refsect1" text="উলà§à¦²à¦¿à¦–িত বিভাগ “%tâ€"/>
+<l:template name="refsect2" text="উলà§à¦²à¦¿à¦–িত বিভাগ “%tâ€"/>
+<l:template name="refsect3" text="উলà§à¦²à¦¿à¦–িত বিভাগ “%tâ€"/>
+<l:template name="sect1" text="উলà§à¦²à¦¿à¦–িত বিভাগ “%tâ€"/>
+<l:template name="sect2" text="উলà§à¦²à¦¿à¦–িত বিভাগ “%tâ€"/>
+<l:template name="sect3" text="উলà§à¦²à¦¿à¦–িত বিভাগ “%tâ€"/>
+<l:template name="sect4" text="উলà§à¦²à¦¿à¦–িত বিভাগ “%tâ€"/>
+<l:template name="sect5" text="উলà§à¦²à¦¿à¦–িত বিভাগ “%tâ€"/>
+<l:template name="section" text="উলà§à¦²à¦¿à¦–িত বিভাগ “%tâ€"/>
+<l:template name="simplesect" text="উলà§à¦²à¦¿à¦–িত বিভাগ “%tâ€"/>
+</l:context>
+<l:context name="xref-number"><l:template name="answer" text="উতà§à¦¤à¦°: %n"/>
+<l:template name="appendix" text="পরিশিষà§à¦ŸÂ %n"/>
+<l:template name="bridgehead" text="বিভাগ %n"/>
+<l:template name="chapter" text="অধà§à¦¯à¦¾à§ŸÂ %n"/>
+<l:template name="equation" text="সমীকরণ %n"/>
+<l:template name="example" text="উদাহরণ %n"/>
+<l:template name="figure" text="চিতà§à¦°Â %n"/>
+<l:template name="part" text="পরিচà§à¦›à§‡à¦¦Â %n"/>
+<l:template name="procedure" text="পদà§à¦§à¦¤à¦¿Â %n"/>
+<l:template name="productionset" text="নিরà§à¦®à¦¾à¦£Â %n"/>
+<l:template name="qandadiv" text="পà§à¦°à¦¶à§à¦¨à§‹à¦¤à§à¦¤à¦°Â %n"/>
+<l:template name="qandaentry" text="পà§à¦°à¦¶à§à¦¨: %n"/>
+<l:template name="question" text="পà§à¦°à¦¶à§à¦¨: %n"/>
+<l:template name="sect1" text="বিভাগ %n"/>
+<l:template name="sect2" text="বিভাগ %n"/>
+<l:template name="sect3" text="বিভাগ %n"/>
+<l:template name="sect4" text="বিভাগ %n"/>
+<l:template name="sect5" text="বিভাগ %n"/>
+<l:template name="section" text="বিভাগ %n"/>
+<l:template name="table" text="সারণি %n"/>
+</l:context>
+<l:context name="xref-number-and-title"><l:template name="appendix" text="পরিশিষà§à¦ŸÂ %n, %t"/>
+<l:template name="bridgehead" text="বিভাগ %n, “%tâ€"/>
+<l:template name="chapter" text="অধà§à¦¯à¦¾à§ŸÂ %n, %t"/>
+<l:template name="equation" text="সমীকরণ %n, “%tâ€"/>
+<l:template name="example" text="উদাহরণ %n, “%tâ€"/>
+<l:template name="figure" text="চিতà§à¦°Â %n, “%tâ€"/>
+<l:template name="part" text="পরিচà§à¦›à§‡à¦¦Â %n, “%tâ€"/>
+<l:template name="procedure" text="পদà§à¦§à¦¤à¦¿Â %n, “%tâ€"/>
+<l:template name="productionset" text="নিরà§à¦®à¦¾à¦£Â %n, “%tâ€"/>
+<l:template name="qandadiv" text="পà§à¦°à¦¶à§à¦¨à§‹à¦¤à§à¦¤à¦°Â %n, “%tâ€"/>
+<l:template name="refsect1" text="উলà§à¦²à¦¿à¦–িত বিভাগ “%tâ€"/>
+<l:template name="refsect2" text="উলà§à¦²à¦¿à¦–িত বিভাগ “%tâ€"/>
+<l:template name="refsect3" text="উলà§à¦²à¦¿à¦–িত বিভাগ “%tâ€"/>
+<l:template name="refsection" text="উলà§à¦²à¦¿à¦–িত বিভাগ “%tâ€"/>
+<l:template name="sect1" text="বিভাগ %n, “%tâ€"/>
+<l:template name="sect2" text="বিভাগ %n, “%tâ€"/>
+<l:template name="sect3" text="বিভাগ %n, “%tâ€"/>
+<l:template name="sect4" text="বিভাগ %n, “%tâ€"/>
+<l:template name="sect5" text="বিভাগ %n, “%tâ€"/>
+<l:template name="section" text="বিভাগ %n, “%tâ€"/>
+<l:template name="simplesect" text="উলà§à¦²à¦¿à¦–িত বিভাগ “%tâ€"/>
+<l:template name="table" text="সারণি %n, “%tâ€"/>
+</l:context>
+<l:context name="authorgroup"><l:template name="sep" text=", "/>
+<l:template name="sep2" text=" à¦à¦¬à¦‚ "/>
+<l:template name="seplast" text=", à¦à¦¬à¦‚ "/>
+</l:context>
+<l:context name="glossary"><l:template name="see" text="দà§à¦°à¦·à§à¦Ÿà¦¬à§à¦¯ %t."/>
+<l:template name="seealso" text="অতিরিকà§à¦¤ দà§à¦°à¦·à§à¦Ÿà¦¬à§à¦¯ %t."/>
+<l:template name="seealso-separator" text=", "/>
+</l:context>
+<l:context name="msgset"><l:template name="MsgAud" text="উদà§à¦¦à¦¿à¦·à§à¦Ÿ পাঠকবরà§à¦—: "/>
+<l:template name="MsgLevel" text="সà§à¦¤à¦°: "/>
+<l:template name="MsgOrig" text="মূল: "/>
+</l:context>
+<l:context name="datetime"><l:template name="format" text="m/d/Y"/>
+</l:context>
+<l:context name="termdef"><l:template name="prefix" text="[Definition: "/>
+<l:template name="suffix" text="]"/>
+</l:context>
+<l:context name="datetime-full"><l:template name="January" text="জানà§à§Ÿà¦¾à¦°à¦¿"/>
+<l:template name="February" text="ফেবà§à¦°à§à§Ÿà¦¾à¦°à¦¿"/>
+<l:template name="March" text="মারà§à¦š"/>
+<l:template name="April" text="à¦à¦ªà§à¦°à¦¿à¦²"/>
+<l:template name="May" text="মে"/>
+<l:template name="June" text="জà§à¦¨"/>
+<l:template name="July" text="জà§à¦²à¦¾à¦‡"/>
+<l:template name="August" text="অগাসà§à¦Ÿ"/>
+<l:template name="September" text="সেপটেমà§à¦¬à¦°"/>
+<l:template name="October" text="অকà§à¦Ÿà§‹à¦¬à¦°"/>
+<l:template name="November" text="নভেমà§à¦¬à¦°"/>
+<l:template name="December" text="ডিসেমà§à¦¬à¦°"/>
+<l:template name="Monday" text="সোমবার"/>
+<l:template name="Tuesday" text="মঙà§à¦—লবার"/>
+<l:template name="Wednesday" text="বà§à¦§à¦¬à¦¾à¦°"/>
+<l:template name="Thursday" text="বৃহসà§à¦ªà¦¤à¦¿à¦¬à¦¾à¦°"/>
+<l:template name="Friday" text="শà§à¦•à§à¦°à¦¬à¦¾à¦°"/>
+<l:template name="Saturday" text="শনিবার"/>
+<l:template name="Sunday" text="রবিবার"/>
+</l:context>
+<l:context name="datetime-abbrev"><l:template name="Jan" text="জানà§à§Ÿà¦¾à¦°à¦¿"/>
+<l:template name="Feb" text="ফেবà§à¦°à§à§Ÿà¦¾à¦°à¦¿"/>
+<l:template name="Mar" text="মারà§à¦š"/>
+<l:template name="Apr" text="à¦à¦ªà§à¦°à¦¿à¦²"/>
+<l:template name="May" text="মে"/>
+<l:template name="Jun" text="জà§à¦¨"/>
+<l:template name="Jul" text="জà§à¦²à¦¾à¦‡"/>
+<l:template name="Aug" text="অগাসà§à¦Ÿ"/>
+<l:template name="Sep" text="সেপটেমà§à¦¬à¦°"/>
+<l:template name="Oct" text="অকà§à¦Ÿà§‹à¦¬à¦°"/>
+<l:template name="Nov" text="নভেমà§à¦¬à¦°"/>
+<l:template name="Dec" text="ডিসেমà§à¦¬à¦°"/>
+<l:template name="Mon" text="সোম"/>
+<l:template name="Tue" text="মঙà§à¦—ল"/>
+<l:template name="Wed" text="বà§à¦§"/>
+<l:template name="Thu" text="বৃহঃ"/>
+<l:template name="Fri" text="শà§à¦•à§à¦°"/>
+<l:template name="Sat" text="শনি"/>
+<l:template name="Sun" text="রবি"/>
+</l:context>
+<l:context name="htmlhelp"><l:template name="langcode" text="0x0445 Bangla (Bangladesh and India)"/>
+</l:context>
+<l:context name="index"><l:template name="term-separator" text=", "/>
+<l:template name="number-separator" text=", "/>
+<l:template name="range-separator" text="-"/>
+</l:context>
+<l:context name="iso690"><l:template name="lastfirst.sep" text=", "/>
+<l:template name="alt.person.two.sep" text=" – "/>
+<l:template name="alt.person.last.sep" text=" – "/>
+<l:template name="alt.person.more.sep" text=" – "/>
+<l:template name="primary.editor" text=" (ed.)"/>
+<l:template name="primary.many" text=", et al."/>
+<l:template name="primary.sep" text=". "/>
+<l:template name="submaintitle.sep" text=": "/>
+<l:template name="title.sep" text=". "/>
+<l:template name="othertitle.sep" text=", "/>
+<l:template name="medium1" text=" ["/>
+<l:template name="medium2" text="]"/>
+<l:template name="secondary.person.sep" text="; "/>
+<l:template name="secondary.sep" text=". "/>
+<l:template name="respons.sep" text=". "/>
+<l:template name="edition.sep" text=". "/>
+<l:template name="edition.serial.sep" text=", "/>
+<l:template name="issuing.range" text="-"/>
+<l:template name="issuing.div" text=", "/>
+<l:template name="issuing.sep" text=". "/>
+<l:template name="partnr.sep" text=". "/>
+<l:template name="placepubl.sep" text=": "/>
+<l:template name="publyear.sep" text=", "/>
+<l:template name="pubinfo.sep" text=". "/>
+<l:template name="spec.pubinfo.sep" text=", "/>
+<l:template name="upd.sep" text=", "/>
+<l:template name="datecit1" text=" [cited "/>
+<l:template name="datecit2" text="]"/>
+<l:template name="extent.sep" text=". "/>
+<l:template name="locs.sep" text=", "/>
+<l:template name="location.sep" text=". "/>
+<l:template name="serie.sep" text=". "/>
+<l:template name="notice.sep" text=". "/>
+<l:template name="access" text="Available "/>
+<l:template name="acctoo" text="Also available "/>
+<l:template name="onwww" text="from World Wide Web"/>
+<l:template name="oninet" text="from Internet"/>
+<l:template name="access.end" text=": "/>
+<l:template name="link1" text="&lt;"/>
+<l:template name="link2" text="&gt;"/>
+<l:template name="access.sep" text=". "/>
+<l:template name="isbn" text="ISBN "/>
+<l:template name="issn" text="ISSN "/>
+<l:template name="stdnum.sep" text=". "/>
+<l:template name="patcountry.sep" text=". "/>
+<l:template name="pattype.sep" text=", "/>
+<l:template name="patnum.sep" text=". "/>
+<l:template name="patdate.sep" text=". "/>
+</l:context><l:letters><l:l i="-1"/>
+<l:l i="0">সংকেত</l:l>
+<l:l i="10">A</l:l>
+<l:l i="10">a</l:l>
+<l:l i="20">B</l:l>
+<l:l i="20">b</l:l>
+<l:l i="30">C</l:l>
+<l:l i="30">c</l:l>
+<l:l i="40">D</l:l>
+<l:l i="40">d</l:l>
+<l:l i="50">E</l:l>
+<l:l i="50">e</l:l>
+<l:l i="60">F</l:l>
+<l:l i="60">f</l:l>
+<l:l i="70">G</l:l>
+<l:l i="70">g</l:l>
+<l:l i="80">H</l:l>
+<l:l i="80">h</l:l>
+<l:l i="90">I</l:l>
+<l:l i="90">i</l:l>
+<l:l i="100">J</l:l>
+<l:l i="100">j</l:l>
+<l:l i="110">K</l:l>
+<l:l i="110">k</l:l>
+<l:l i="120">L</l:l>
+<l:l i="120">l</l:l>
+<l:l i="130">M</l:l>
+<l:l i="130">m</l:l>
+<l:l i="140">N</l:l>
+<l:l i="140">n</l:l>
+<l:l i="150">O</l:l>
+<l:l i="150">o</l:l>
+<l:l i="160">P</l:l>
+<l:l i="160">p</l:l>
+<l:l i="170">Q</l:l>
+<l:l i="170">q</l:l>
+<l:l i="180">R</l:l>
+<l:l i="180">r</l:l>
+<l:l i="190">S</l:l>
+<l:l i="190">s</l:l>
+<l:l i="200">T</l:l>
+<l:l i="200">t</l:l>
+<l:l i="210">U</l:l>
+<l:l i="210">u</l:l>
+<l:l i="220">V</l:l>
+<l:l i="220">v</l:l>
+<l:l i="230">W</l:l>
+<l:l i="230">w</l:l>
+<l:l i="240">X</l:l>
+<l:l i="240">x</l:l>
+<l:l i="250">Y</l:l>
+<l:l i="250">y</l:l>
+<l:l i="260">Z</l:l>
+<l:l i="260">z</l:l>
+</l:letters>
+</l:l10n>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/bs.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/bs.xml
new file mode 100644
index 0000000..bd9b281
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/bs.xml
@@ -0,0 +1,662 @@
+<?xml version="1.0" encoding="utf-8"?>
+<l:l10n xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0" language="bs" english-language-name="Bosnian">
+
+<!-- * This file is generated automatically. -->
+<!-- * To submit changes to this file upstream (to the DocBook Project) -->
+<!-- * do not submit an edited version of this file. Instead, submit an -->
+<!-- * edited version of the source file at the following location: -->
+<!-- * -->
+<!-- * https://docbook.svn.sourceforge.net/svnroot/docbook/trunk/gentext/locale/bs.xml -->
+<!-- * -->
+<!-- * E-mail the edited bs.xml source file to: -->
+<!-- * -->
+<!-- * docbook-developers@lists.sourceforge.net -->
+
+<!-- ******************************************************************** -->
+
+<!-- This file is part of the XSL DocBook Stylesheet distribution. -->
+<!-- See ../README or http://docbook.sf.net/release/xsl/current/ for -->
+<!-- copyright and other information. -->
+
+<!-- ******************************************************************** -->
+<!-- In these files, % with a letter is used for a placeholder: -->
+<!-- %t is the current element's title -->
+<!-- %s is the current element's subtitle (if applicable)-->
+<!-- %n is the current element's number label-->
+<!-- %p is the current element's page number (if applicable)-->
+<!-- ******************************************************************** -->
+
+
+<l:gentext key="Abstract" text="Sažetak"/>
+<l:gentext key="abstract" text="sažetak"/>
+<l:gentext key="Acknowledgements" text="Priznanja"/>
+<l:gentext key="acknowledgements" text="priznanja"/>
+<l:gentext key="Answer" text="O:"/>
+<l:gentext key="answer" text="o:"/>
+<l:gentext key="Appendix" text="Dodatak"/>
+<l:gentext key="appendix" text="dodatak"/>
+<l:gentext key="Article" text="ÄŒlanak"/>
+<l:gentext key="article" text="Älanak"/>
+<l:gentext key="Author" text="Autor"/>
+<l:gentext key="Bibliography" text="Literatura"/>
+<l:gentext key="bibliography" text="literatura"/>
+<l:gentext key="Book" text="Knjiga"/>
+<l:gentext key="book" text="knjiga"/>
+<l:gentext key="CAUTION" text="PAŽNJA"/>
+<l:gentext key="Caution" text="Pažnja"/>
+<l:gentext key="caution" text="pažnja"/>
+<l:gentext key="Chapter" text="Poglavlje"/>
+<l:gentext key="chapter" text="poglavlje"/>
+<l:gentext key="Colophon" text="Kolofon"/>
+<l:gentext key="colophon" text="kolofon"/>
+<l:gentext key="Copyright" text="Autorska prava"/>
+<l:gentext key="copyright" text="autorska prava"/>
+<l:gentext key="Dedication" text="Posveta"/>
+<l:gentext key="dedication" text="posveta"/>
+<l:gentext key="Edition" text="Izdanje"/>
+<l:gentext key="edition" text="izdanje"/>
+<l:gentext key="Editor" text="Editor"/>
+<l:gentext key="Equation" text="JednaÄina"/>
+<l:gentext key="equation" text="jednaÄina"/>
+<l:gentext key="Example" text="Primjer"/>
+<l:gentext key="example" text="primjer"/>
+<l:gentext key="Figure" text="Slika"/>
+<l:gentext key="figure" text="slika"/>
+<l:gentext key="Glossary" text="Glosar"/>
+<l:gentext key="glossary" text="glosar"/>
+<l:gentext key="GlossSee" text="Vidi"/>
+<l:gentext key="glosssee" text="vidi"/>
+<l:gentext key="GlossSeeAlso" text="Vidi takođe"/>
+<l:gentext key="glossseealso" text="vidi takođe"/>
+<l:gentext key="IMPORTANT" text="VAŽNO"/>
+<l:gentext key="important" text="važno"/>
+<l:gentext key="Important" text="Važno"/>
+<l:gentext key="Index" text="Indeks"/>
+<l:gentext key="index" text="indeks"/>
+<l:gentext key="ISBN" text="ISBN"/>
+<l:gentext key="isbn" text="ISBN"/>
+<l:gentext key="LegalNotice" text="Pravne odredbe"/>
+<l:gentext key="legalnotice" text="pravne odredbe"/>
+<l:gentext key="MsgAud" text="Primatelji"/>
+<l:gentext key="msgaud" text="primatelji"/>
+<l:gentext key="MsgLevel" text="Nivo"/>
+<l:gentext key="msglevel" text="nivo"/>
+<l:gentext key="MsgOrig" text="Izvor"/>
+<l:gentext key="msgorig" text="izvor"/>
+<l:gentext key="NOTE" text="BILJEÅ KA"/>
+<l:gentext key="Note" text="Bilješka"/>
+<l:gentext key="note" text="Bilješka"/>
+<l:gentext key="Part" text="Dio"/>
+<l:gentext key="part" text="dio"/>
+<l:gentext key="Preface" text="Predgovor"/>
+<l:gentext key="preface" text="predgovor"/>
+<l:gentext key="Procedure" text="Postupak"/>
+<l:gentext key="procedure" text="postupak"/>
+<l:gentext key="ProductionSet" text="Produkcija"/>
+<l:gentext key="PubDate" text="Objavljeno"/>
+<l:gentext key="pubdate" text="objavljeno"/>
+<l:gentext key="Published" text="Objavljeno"/>
+<l:gentext key="published" text="objavljeno"/>
+<l:gentext key="Publisher" text="Objavljeno"/>
+<l:gentext key="Qandadiv" text="P &amp; O"/>
+<l:gentext key="qandadiv" text="P &amp; O"/>
+<l:gentext key="QandASet" text="ÄŒesto Pitana Pitanja"/>
+<l:gentext key="Question" text="P:"/>
+<l:gentext key="question" text="P:"/>
+<l:gentext key="RefEntry" text="Stranica"/>
+<l:gentext key="refentry" text="stranica"/>
+<l:gentext key="Reference" text="Referenca"/>
+<l:gentext key="reference" text="referenca"/>
+<l:gentext key="References" text="Referenca"/>
+<l:gentext key="RefName" text="Ime"/>
+<l:gentext key="refname" text="ime"/>
+<l:gentext key="RefSection" text="Odjeljak"/>
+<l:gentext key="refsection" text="odjeljak"/>
+<l:gentext key="RefSynopsisDiv" text="Pregled"/>
+<l:gentext key="refsynopsisdiv" text="pregled"/>
+<l:gentext key="RevHistory" text="Historija verzija"/>
+<l:gentext key="revhistory" text="historija verzija"/>
+<l:gentext key="revision" text="verzija"/>
+<l:gentext key="Revision" text="Verzija"/>
+<l:gentext key="sect1" text="Odjeljak"/>
+<l:gentext key="sect2" text="Odjeljak"/>
+<l:gentext key="sect3" text="Odjeljak"/>
+<l:gentext key="sect4" text="Odjeljak"/>
+<l:gentext key="sect5" text="Odjeljak"/>
+<l:gentext key="section" text="odjeljak"/>
+<l:gentext key="Section" text="Odjeljak"/>
+<l:gentext key="see" text="vidi"/>
+<l:gentext key="See" text="Vidi"/>
+<l:gentext key="seealso" text="vidi takođe"/>
+<l:gentext key="Seealso" text="Vidi takođe"/>
+<l:gentext key="SeeAlso" text="Vidi takođe"/>
+<l:gentext key="set" text="set"/>
+<l:gentext key="Set" text="Set"/>
+<l:gentext key="setindex" text="indeks"/>
+<l:gentext key="SetIndex" text="Indeks"/>
+<l:gentext key="Sidebar" text="Postrana kolona"/>
+<l:gentext key="sidebar" text="postrana kolona"/>
+<l:gentext key="step" text="korak"/>
+<l:gentext key="Step" text="Korak"/>
+<l:gentext key="table" text="tabela"/>
+<l:gentext key="Table" text="Tabela"/>
+<l:gentext key="task" text="zadatak"/>
+<l:gentext key="Task" text="Zadatak"/>
+<l:gentext key="tip" text="Savjet"/>
+<l:gentext key="TIP" text="SAVJET"/>
+<l:gentext key="Tip" text="Savjet"/>
+<l:gentext key="Warning" text="Upozorenje"/>
+<l:gentext key="warning" text="Upozorenje"/>
+<l:gentext key="WARNING" text="UPOZORENJE"/>
+<l:gentext key="and" text="i"/>
+<l:gentext key="by" text="od"/>
+<l:gentext key="Edited" text="Izdao"/>
+<l:gentext key="edited" text="izdao"/>
+<l:gentext key="Editedby" text="Izdao"/>
+<l:gentext key="editedby" text="izdao"/>
+<l:gentext key="in" text="u"/>
+<l:gentext key="lastlistcomma" text=""/>
+<l:gentext key="listcomma" text=","/>
+<l:gentext key="notes" text="bilješke"/>
+<l:gentext key="Notes" text="Bilješke"/>
+<l:gentext key="Pgs" text="Str."/>
+<l:gentext key="pgs" text="ptr."/>
+<l:gentext key="Revisedby" text="Izmijenjeno od: "/>
+<l:gentext key="revisedby" text="izmijenjeno od: "/>
+<l:gentext key="TableNotes" text="Napomene"/>
+<l:gentext key="tablenotes" text="napomene"/>
+<l:gentext key="TableofContents" text="Sadržaj"/>
+<l:gentext key="tableofcontents" text="sadržaj"/>
+<l:gentext key="unexpectedelementname" text="NeoÄkivano ime elementa"/>
+<l:gentext key="unsupported" text="nepodržano"/>
+<l:gentext key="xrefto" text="xref prema"/>
+<l:gentext key="Authors" text="Autori"/>
+<l:gentext key="copyeditor" text="Autorski Urednik"/>
+<l:gentext key="graphicdesigner" text="Graficki Dizajneri"/>
+<l:gentext key="productioneditor" text="Urednik Produkcije"/>
+<l:gentext key="technicaleditor" text="Tehnicki Editor"/>
+<l:gentext key="translator" text="Prevodilac"/>
+<l:gentext key="listofequations" text="spisak jednaÄina"/>
+<l:gentext key="ListofEquations" text="Spisak jednaÄina"/>
+<l:gentext key="ListofExamples" text="Spisak primjera"/>
+<l:gentext key="listofexamples" text="spisak primjera"/>
+<l:gentext key="ListofFigures" text="Spisak slika"/>
+<l:gentext key="listoffigures" text="spisak slika"/>
+<l:gentext key="ListofProcedures" text="Spisak postupaka"/>
+<l:gentext key="listofprocedures" text="spisak postupaka"/>
+<l:gentext key="listoftables" text="spisak tabela"/>
+<l:gentext key="ListofTables" text="Spisak tabela"/>
+<l:gentext key="ListofUnknown" text="Spisak ???"/>
+<l:gentext key="listofunknown" text="spisak ???"/>
+<l:gentext key="nav-home" text="PoÄetak"/>
+<l:gentext key="nav-next" text="Naprijed"/>
+<l:gentext key="nav-next-sibling" text="Brzo naprijed"/>
+<l:gentext key="nav-prev" text="Nazad"/>
+<l:gentext key="nav-prev-sibling" text="Brzo nazad"/>
+<l:gentext key="nav-up" text="Gore"/>
+<l:gentext key="nav-toc" text="Sadržaj"/>
+<l:gentext key="Draft" text="Nacrt"/>
+<l:gentext key="above" text="iznad"/>
+<l:gentext key="below" text="ispod"/>
+<l:gentext key="sectioncalled" text="odjeljak sa nazivom"/>
+<l:gentext key="index symbols" text="Simboli"/>
+<l:gentext key="writing-mode" text="lr-tb"/>
+<l:gentext key="lowercase.alpha" text="abcÄćdÄ‘efghijklmnoprsÅ¡tuvzž"/>
+<l:gentext key="uppercase.alpha" text="ABCČĆDÄEFGHIJKLMNOPRSÅ TUVZŽ"/>
+<l:gentext key="normalize.sort.input" text="AaÀàÃáÂâÃãÄäÅåĀÄĂ㥹ÇǎǞǟǠǡǺǻȀÈȂȃȦȧḀá¸áºšáº áº¡áº¢áº£áº¤áº¥áº¦áº§áº¨áº©áºªáº«áº¬áº­áº®áº¯áº°áº±áº²áº³áº´áºµáº¶áº·BbÆ€ÆɓƂƃḂḃḄḅḆḇCcÇçĆćĈĉĊċČÄƇƈɕḈḉDdÄŽÄÄđƊɗƋƌDžDzȡɖḊḋḌá¸á¸Žá¸á¸á¸‘ḒḓEeÈèÉéÊêËëĒēĔĕĖėĘęĚěȄȅȆȇȨȩḔḕḖḗḘḙḚḛḜá¸áº¸áº¹áººáº»áº¼áº½áº¾áº¿á»€á»á»‚ểỄễỆệFfƑƒḞḟGgÄœÄĞğĠġĢģƓɠǤǥǦǧǴǵḠḡHhĤĥĦħȞȟɦḢḣḤḥḦḧḨḩḪḫẖIiÌìÃíÎîÃïĨĩĪīĬĭĮįİƗɨÇÇȈȉȊȋḬḭḮḯỈỉỊịJjĴĵǰÊKkĶķƘƙǨǩḰḱḲḳḴḵLlĹĺĻļĽľĿŀÅłƚLjȴɫɬɭḶḷḸḹḺḻḼḽMmɱḾḿṀá¹á¹‚ṃNnÑñŃńŅņŇňÆɲƞȠNjǸǹȵɳṄṅṆṇṈṉṊṋOoÒòÓóÔôÕõÖöØøŌÅÅŽÅÅőƟƠơǑǒǪǫǬǭǾǿȌÈÈŽÈȪȫȬȭȮȯȰȱṌá¹á¹Žá¹á¹á¹‘ṒṓỌá»á»Žá»á»á»‘ỒồỔổỖỗỘộỚớỜá»á»žá»Ÿá» á»¡á»¢á»£PpƤƥṔṕṖṗQqÊ RrŔŕŖŗŘřÈȑȒȓɼɽɾṘṙṚṛṜá¹á¹žá¹ŸSsŚśŜÅŞşŠšȘșʂṠṡṢṣṤṥṦṧṨṩTtŢţŤťŦŧƫƬƭƮʈȚțȶṪṫṬṭṮṯṰṱẗUuÙùÚúÛûÜüŨũŪūŬŭŮůŰűŲųƯưǓǔǕǖǗǘǙǚǛǜȔȕȖȗṲṳṴṵṶṷṸṹṺṻỤụỦủỨứỪừỬửỮữỰựVvƲʋṼṽṾṿWwŴŵẀáºáº‚ẃẄẅẆẇẈẉẘXxẊẋẌáºYyÃýÿŸŶŷƳƴȲȳẎáºáº™á»²á»³á»´á»µá»¶á»·á»¸á»¹ZzŹźŻżŽžƵƶȤȥÊÊ‘áºáº‘ẒẓẔẕẕ" lang="en"/>
+<l:gentext key="normalize.sort.output" text="AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBCCCCCCCCCCCCCCCCCDDDDDDDDDDDDDDDDDDDDDDDDEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEFFFFFFGGGGGGGGGGGGGGGGGGGGHHHHHHHHHHHHHHHHHHHHIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIJJJJJJKKKKKKKKKKKKKKLLLLLLLLLLLLLLLLLLLLLLLLLLMMMMMMMMMNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOPPPPPPPPQQQRRRRRRRRRRRRRRRRRRRRRRRSSSSSSSSSSSSSSSSSSSSSSSTTTTTTTTTTTTTTTTTTTTTTTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUVVVVVVVVWWWWWWWWWWWWWWWXXXXXXYYYYYYYYYYYYYYYYYYYYYYYZZZZZZZZZZZZZZZZZZZZZ" lang="en"/>
+<l:dingbat key="startquote" text="“"/>
+<l:dingbat key="endquote" text="â€"/>
+<l:dingbat key="nestedstartquote" text="‘"/>
+<l:dingbat key="nestedendquote" text="’"/>
+<l:dingbat key="singlestartquote" text="‘"/>
+<l:dingbat key="singleendquote" text="’"/>
+<l:dingbat key="bullet" text="•"/>
+<l:gentext key="hyphenation-character" text="-"/>
+<l:gentext key="hyphenation-push-character-count" text="2"/>
+<l:gentext key="hyphenation-remain-character-count" text="3"/>
+<l:context name="styles"><l:template name="person-name" text="first-last"/>
+</l:context>
+<l:context name="title"><l:template name="abstract" text="%t"/>
+<l:template name="acknowledgements" text="%t"/>
+<l:template name="answer" text="%t"/>
+<l:template name="appendix" text="Dodatak %n. %t"/>
+<l:template name="article" text="%t"/>
+<l:template name="authorblurb" text="%t"/>
+<l:template name="bibliodiv" text="%t"/>
+<l:template name="biblioentry" text="%t"/>
+<l:template name="bibliography" text="%t"/>
+<l:template name="bibliolist" text="%t"/>
+<l:template name="bibliomixed" text="%t"/>
+<l:template name="bibliomset" text="%t"/>
+<l:template name="biblioset" text="%t"/>
+<l:template name="blockquote" text="%t"/>
+<l:template name="book" text="%t"/>
+<l:template name="calloutlist" text="%t"/>
+<l:template name="caution" text="%t"/>
+<l:template name="chapter" text="Poglavlje %n. %t"/>
+<l:template name="colophon" text="%t"/>
+<l:template name="dedication" text="%t"/>
+<l:template name="equation" text="JednaÄina %n. %t"/>
+<l:template name="example" text="Primjer %n. %t"/>
+<l:template name="figure" text="Slika %n. %t"/>
+<l:template name="foil" text="%t"/>
+<l:template name="foilgroup" text="%t"/>
+<l:template name="formalpara" text="%t"/>
+<l:template name="glossary" text="%t"/>
+<l:template name="glossdiv" text="%t"/>
+<l:template name="glosslist" text="%t"/>
+<l:template name="glossentry" text="%t"/>
+<l:template name="important" text="%t"/>
+<l:template name="index" text="%t"/>
+<l:template name="indexdiv" text="%t"/>
+<l:template name="itemizedlist" text="%t"/>
+<l:template name="legalnotice" text="%t"/>
+<l:template name="listitem" text=""/>
+<l:template name="lot" text="%t"/>
+<l:template name="msg" text="%t"/>
+<l:template name="msgexplan" text="%t"/>
+<l:template name="msgmain" text="%t"/>
+<l:template name="msgrel" text="%t"/>
+<l:template name="msgset" text="%t"/>
+<l:template name="msgsub" text="%t"/>
+<l:template name="note" text="%t"/>
+<l:template name="orderedlist" text="%t"/>
+<l:template name="part" text="Dio %n. %t"/>
+<l:template name="partintro" text="%t"/>
+<l:template name="preface" text="%t"/>
+<l:template name="procedure" text="%t"/>
+<l:template name="procedure.formal" text="Postupak %n. %t"/>
+<l:template name="productionset" text="%t"/>
+<l:template name="productionset.formal" text="Produkcija %n"/>
+<l:template name="qandadiv" text="%t"/>
+<l:template name="qandaentry" text="%t"/>
+<l:template name="qandaset" text="%t"/>
+<l:template name="question" text="%t"/>
+<l:template name="refentry" text="%t"/>
+<l:template name="reference" text="%t"/>
+<l:template name="refsection" text="%t"/>
+<l:template name="refsect1" text="%t"/>
+<l:template name="refsect2" text="%t"/>
+<l:template name="refsect3" text="%t"/>
+<l:template name="refsynopsisdiv" text="%t"/>
+<l:template name="refsynopsisdivinfo" text="%t"/>
+<l:template name="segmentedlist" text="%t"/>
+<l:template name="set" text="%t"/>
+<l:template name="setindex" text="%t"/>
+<l:template name="sidebar" text="%t"/>
+<l:template name="step" text="%t"/>
+<l:template name="table" text="Tabela %n. %t"/>
+<l:template name="task" text="%t"/>
+<l:template name="tasksummary" text="%t"/>
+<l:template name="taskprerequisites" text="%t"/>
+<l:template name="taskrelated" text="%t"/>
+<l:template name="tip" text="%t"/>
+<l:template name="toc" text="%t"/>
+<l:template name="variablelist" text="%t"/>
+<l:template name="varlistentry" text=""/>
+<l:template name="warning" text="%t"/>
+</l:context>
+<l:context name="title-unnumbered"><l:template name="appendix" text="%t"/>
+<l:template name="article/appendix" text="%t"/>
+<l:template name="bridgehead" text="%t"/>
+<l:template name="chapter" text="%t"/>
+<l:template name="sect1" text="%t"/>
+<l:template name="sect2" text="%t"/>
+<l:template name="sect3" text="%t"/>
+<l:template name="sect4" text="%t"/>
+<l:template name="sect5" text="%t"/>
+<l:template name="section" text="%t"/>
+<l:template name="simplesect" text="%t"/>
+<l:template name="part" text="%t"/>
+</l:context>
+<l:context name="title-numbered"><l:template name="appendix" text="Dodatak %n. %t"/>
+<l:template name="article/appendix" text="%n. %t"/>
+<l:template name="bridgehead" text="%n. %t"/>
+<l:template name="chapter" text="Poglavlje %n. %t"/>
+<l:template name="part" text="Dio %n. %t"/>
+<l:template name="sect1" text="%n. %t"/>
+<l:template name="sect2" text="%n. %t"/>
+<l:template name="sect3" text="%n. %t"/>
+<l:template name="sect4" text="%n. %t"/>
+<l:template name="sect5" text="%n. %t"/>
+<l:template name="section" text="%n. %t"/>
+<l:template name="simplesect" text="%t"/>
+</l:context>
+<l:context name="subtitle"><l:template name="appendix" text="%s"/>
+<l:template name="acknowledgements" text="%s"/>
+<l:template name="article" text="%s"/>
+<l:template name="bibliodiv" text="%s"/>
+<l:template name="biblioentry" text="%s"/>
+<l:template name="bibliography" text="%s"/>
+<l:template name="bibliomixed" text="%s"/>
+<l:template name="bibliomset" text="%s"/>
+<l:template name="biblioset" text="%s"/>
+<l:template name="book" text="%s"/>
+<l:template name="chapter" text="%s"/>
+<l:template name="colophon" text="%s"/>
+<l:template name="dedication" text="%s"/>
+<l:template name="glossary" text="%s"/>
+<l:template name="glossdiv" text="%s"/>
+<l:template name="index" text="%s"/>
+<l:template name="indexdiv" text="%s"/>
+<l:template name="lot" text="%s"/>
+<l:template name="part" text="%s"/>
+<l:template name="partintro" text="%s"/>
+<l:template name="preface" text="%s"/>
+<l:template name="refentry" text="%s"/>
+<l:template name="reference" text="%s"/>
+<l:template name="refsection" text="%s"/>
+<l:template name="refsect1" text="%s"/>
+<l:template name="refsect2" text="%s"/>
+<l:template name="refsect3" text="%s"/>
+<l:template name="refsynopsisdiv" text="%s"/>
+<l:template name="sect1" text="%s"/>
+<l:template name="sect2" text="%s"/>
+<l:template name="sect3" text="%s"/>
+<l:template name="sect4" text="%s"/>
+<l:template name="sect5" text="%s"/>
+<l:template name="section" text="%s"/>
+<l:template name="set" text="%s"/>
+<l:template name="setindex" text="%s"/>
+<l:template name="sidebar" text="%s"/>
+<l:template name="simplesect" text="%s"/>
+<l:template name="toc" text="%s"/>
+</l:context>
+<l:context name="xref"><l:template name="abstract" text="%t"/>
+<l:template name="acknowledgements" text="%t"/>
+<l:template name="answer" text="O: %n"/>
+<l:template name="appendix" text="%t"/>
+<l:template name="article" text="%t"/>
+<l:template name="authorblurb" text="%t"/>
+<l:template name="bibliodiv" text="%t"/>
+<l:template name="bibliography" text="%t"/>
+<l:template name="bibliomset" text="%t"/>
+<l:template name="biblioset" text="%t"/>
+<l:template name="blockquote" text="%t"/>
+<l:template name="book" text="%t"/>
+<l:template name="calloutlist" text="%t"/>
+<l:template name="caution" text="%t"/>
+<l:template name="chapter" text="%t"/>
+<l:template name="colophon" text="%t"/>
+<l:template name="constraintdef" text="%t"/>
+<l:template name="dedication" text="%t"/>
+<l:template name="equation" text="%t"/>
+<l:template name="example" text="%t"/>
+<l:template name="figure" text="%t"/>
+<l:template name="foil" text="%t"/>
+<l:template name="foilgroup" text="%t"/>
+<l:template name="formalpara" text="%t"/>
+<l:template name="glossary" text="%t"/>
+<l:template name="glossdiv" text="%t"/>
+<l:template name="important" text="%t"/>
+<l:template name="index" text="%t"/>
+<l:template name="indexdiv" text="%t"/>
+<l:template name="itemizedlist" text="%t"/>
+<l:template name="legalnotice" text="%t"/>
+<l:template name="listitem" text="%n"/>
+<l:template name="lot" text="%t"/>
+<l:template name="msg" text="%t"/>
+<l:template name="msgexplan" text="%t"/>
+<l:template name="msgmain" text="%t"/>
+<l:template name="msgrel" text="%t"/>
+<l:template name="msgset" text="%t"/>
+<l:template name="msgsub" text="%t"/>
+<l:template name="note" text="%t"/>
+<l:template name="orderedlist" text="%t"/>
+<l:template name="part" text="%t"/>
+<l:template name="partintro" text="%t"/>
+<l:template name="preface" text="%t"/>
+<l:template name="procedure" text="%t"/>
+<l:template name="productionset" text="%t"/>
+<l:template name="qandadiv" text="%t"/>
+<l:template name="qandaentry" text="P: %n"/>
+<l:template name="qandaset" text="%t"/>
+<l:template name="question" text="P: %n"/>
+<l:template name="reference" text="%t"/>
+<l:template name="refsynopsisdiv" text="%t"/>
+<l:template name="segmentedlist" text="%t"/>
+<l:template name="set" text="%t"/>
+<l:template name="setindex" text="%t"/>
+<l:template name="sidebar" text="%t"/>
+<l:template name="table" text="%t"/>
+<l:template name="task" text="%t"/>
+<l:template name="tip" text="%t"/>
+<l:template name="toc" text="%t"/>
+<l:template name="variablelist" text="%t"/>
+<l:template name="varlistentry" text="%n"/>
+<l:template name="warning" text="%t"/>
+<l:template name="olink.document.citation" text=" in %o"/>
+<l:template name="olink.page.citation" text=" (page %p)"/>
+<l:template name="page.citation" text=" [%p]"/>
+<l:template name="page" text="(page %p)"/>
+<l:template name="docname" text=" in %o"/>
+<l:template name="docnamelong" text=" in the document titled %o"/>
+<l:template name="pageabbrev" text="(p. %p)"/>
+<l:template name="Page" text="Page %p"/>
+<l:template name="bridgehead" text="odjeljak sa nazivom “%tâ€"/>
+<l:template name="refsection" text="odjeljak sa nazivom “%tâ€"/>
+<l:template name="refsect1" text="odjeljak sa nazivom “%tâ€"/>
+<l:template name="refsect2" text="odjeljak sa nazivom “%tâ€"/>
+<l:template name="refsect3" text="odjeljak sa nazivom “%tâ€"/>
+<l:template name="sect1" text="odjeljak sa nazivom “%tâ€"/>
+<l:template name="sect2" text="odjeljak sa nazivom “%tâ€"/>
+<l:template name="sect3" text="odjeljak sa nazivom “%tâ€"/>
+<l:template name="sect4" text="odjeljak sa nazivom “%tâ€"/>
+<l:template name="sect5" text="odjeljak sa nazivom “%tâ€"/>
+<l:template name="section" text="odjeljak sa nazivom “%tâ€"/>
+<l:template name="simplesect" text="odjeljak sa nazivom “%tâ€"/>
+</l:context>
+<l:context name="xref-number"><l:template name="answer" text="O: %n"/>
+<l:template name="appendix" text="Dodatak %n"/>
+<l:template name="bridgehead" text="Odjeljak %n"/>
+<l:template name="chapter" text="Poglavlje %n"/>
+<l:template name="equation" text="JednaÄina %n"/>
+<l:template name="example" text="Primjer %n"/>
+<l:template name="figure" text="Slika %n"/>
+<l:template name="part" text="Dio %n"/>
+<l:template name="procedure" text="Postupak %n"/>
+<l:template name="productionset" text="Produkcija %n"/>
+<l:template name="qandadiv" text="P &amp; O %n"/>
+<l:template name="qandaentry" text="P: %n"/>
+<l:template name="question" text="P: %n"/>
+<l:template name="sect1" text="Odjeljak %n"/>
+<l:template name="sect2" text="Odjeljak %n"/>
+<l:template name="sect3" text="Odjeljak %n"/>
+<l:template name="sect4" text="Odjeljak %n"/>
+<l:template name="sect5" text="Odjeljak %n"/>
+<l:template name="section" text="Odjeljak %n"/>
+<l:template name="table" text="Tabela %n"/>
+</l:context>
+<l:context name="xref-number-and-title"><l:template name="appendix" text="Dodatak %n, %t"/>
+<l:template name="bridgehead" text="Odjeljak %n, “%tâ€"/>
+<l:template name="chapter" text="Poglavlje %n, %t"/>
+<l:template name="equation" text="JednaÄina %n, “%tâ€"/>
+<l:template name="example" text="Primjer %n, “%tâ€"/>
+<l:template name="figure" text="Slika %n, “%tâ€"/>
+<l:template name="part" text="Dio %n, “%tâ€"/>
+<l:template name="procedure" text="Postupak %n, “%tâ€"/>
+<l:template name="productionset" text="Produkcija %n, “%tâ€"/>
+<l:template name="qandadiv" text="P &amp; O %n, “%tâ€"/>
+<l:template name="refsect1" text="odjeljak sa nazivom “%tâ€"/>
+<l:template name="refsect2" text="odjeljak sa nazivom “%tâ€"/>
+<l:template name="refsect3" text="odjeljak sa nazivom “%tâ€"/>
+<l:template name="refsection" text="odjeljak sa nazivom “%tâ€"/>
+<l:template name="sect1" text="Odjeljak %n, “%tâ€"/>
+<l:template name="sect2" text="Odjeljak %n, “%tâ€"/>
+<l:template name="sect3" text="Odjeljak %n, “%tâ€"/>
+<l:template name="sect4" text="Odjeljak %n, “%tâ€"/>
+<l:template name="sect5" text="Odjeljak %n, “%tâ€"/>
+<l:template name="section" text="Odjeljak %n, “%tâ€"/>
+<l:template name="simplesect" text="odjeljak sa nazivom “%tâ€"/>
+<l:template name="table" text="Tabela %n, “%tâ€"/>
+</l:context>
+<l:context name="authorgroup"><l:template name="sep" text=", "/>
+<l:template name="sep2" text=" i "/>
+<l:template name="seplast" text=" i "/>
+</l:context>
+<l:context name="glossary"><l:template name="see" text="Vidi %t."/>
+<l:template name="seealso" text="Vidi takođe %t."/>
+<l:template name="seealso-separator" text=", "/>
+</l:context>
+<l:context name="msgset"><l:template name="MsgAud" text="Primatelji: "/>
+<l:template name="MsgLevel" text="Nivo: "/>
+<l:template name="MsgOrig" text="Izvor: "/>
+</l:context>
+<l:context name="datetime"><l:template name="format" text="d.m.Y"/>
+</l:context>
+<l:context name="termdef"><l:template name="prefix" text="[Definicija: "/>
+<l:template name="suffix" text="]"/>
+</l:context>
+<l:context name="datetime-full"><l:template name="January" text="Januar"/>
+<l:template name="February" text="Februar"/>
+<l:template name="March" text="Mart"/>
+<l:template name="April" text="April"/>
+<l:template name="May" text="Maj"/>
+<l:template name="June" text="Juni"/>
+<l:template name="July" text="Juli"/>
+<l:template name="August" text="August"/>
+<l:template name="September" text="Septembar"/>
+<l:template name="October" text="Oktobar"/>
+<l:template name="November" text="Novembar"/>
+<l:template name="December" text="Decembar"/>
+<l:template name="Monday" text="Ponedeljak"/>
+<l:template name="Tuesday" text="Utorak"/>
+<l:template name="Wednesday" text="Srijeda"/>
+<l:template name="Thursday" text="ÄŒetvrtak"/>
+<l:template name="Friday" text="Petak"/>
+<l:template name="Saturday" text="Subota"/>
+<l:template name="Sunday" text="Nedelja"/>
+</l:context>
+<l:context name="datetime-abbrev"><l:template name="Jan" text="Jan"/>
+<l:template name="Feb" text="Feb"/>
+<l:template name="Mar" text="Mar"/>
+<l:template name="Apr" text="Apr"/>
+<l:template name="May" text="Maj"/>
+<l:template name="Jun" text="Jun"/>
+<l:template name="Jul" text="Jul"/>
+<l:template name="Aug" text="Aug"/>
+<l:template name="Sep" text="Sep"/>
+<l:template name="Oct" text="Okt"/>
+<l:template name="Nov" text="Nov"/>
+<l:template name="Dec" text="Dec"/>
+<l:template name="Mon" text="Pon"/>
+<l:template name="Tue" text="Uto"/>
+<l:template name="Wed" text="Sri"/>
+<l:template name="Thu" text="ÄŒet"/>
+<l:template name="Fri" text="Pet"/>
+<l:template name="Sat" text="Sub"/>
+<l:template name="Sun" text="Ned"/>
+</l:context>
+<l:context name="htmlhelp"><l:template name="langcode" text="0x141A Bosnian (Bosnia/Herzegovina)"/>
+</l:context>
+<l:context name="index"><l:template name="term-separator" text=", "/>
+<l:template name="number-separator" text=", "/>
+<l:template name="range-separator" text="-"/>
+</l:context>
+<l:context name="iso690"><l:template name="lastfirst.sep" text=", "/>
+<l:template name="alt.person.two.sep" text=" – "/>
+<l:template name="alt.person.last.sep" text=" – "/>
+<l:template name="alt.person.more.sep" text=" – "/>
+<l:template name="primary.editor" text=" (ed.)"/>
+<l:template name="primary.many" text=", et al."/>
+<l:template name="primary.sep" text=". "/>
+<l:template name="submaintitle.sep" text=": "/>
+<l:template name="title.sep" text=". "/>
+<l:template name="othertitle.sep" text=", "/>
+<l:template name="medium1" text=" ["/>
+<l:template name="medium2" text="]"/>
+<l:template name="secondary.person.sep" text="; "/>
+<l:template name="secondary.sep" text=". "/>
+<l:template name="respons.sep" text=". "/>
+<l:template name="edition.sep" text=". "/>
+<l:template name="edition.serial.sep" text=", "/>
+<l:template name="issuing.range" text="-"/>
+<l:template name="issuing.div" text=", "/>
+<l:template name="issuing.sep" text=". "/>
+<l:template name="partnr.sep" text=". "/>
+<l:template name="placepubl.sep" text=": "/>
+<l:template name="publyear.sep" text=", "/>
+<l:template name="pubinfo.sep" text=". "/>
+<l:template name="spec.pubinfo.sep" text=", "/>
+<l:template name="upd.sep" text=", "/>
+<l:template name="datecit1" text=" [cited "/>
+<l:template name="datecit2" text="]"/>
+<l:template name="extent.sep" text=". "/>
+<l:template name="locs.sep" text=", "/>
+<l:template name="location.sep" text=". "/>
+<l:template name="serie.sep" text=". "/>
+<l:template name="notice.sep" text=". "/>
+<l:template name="access" text="Available "/>
+<l:template name="acctoo" text="Also available "/>
+<l:template name="onwww" text="from World Wide Web"/>
+<l:template name="oninet" text="from Internet"/>
+<l:template name="access.end" text=": "/>
+<l:template name="link1" text="&lt;"/>
+<l:template name="link2" text="&gt;"/>
+<l:template name="access.sep" text=". "/>
+<l:template name="isbn" text="ISBN "/>
+<l:template name="issn" text="ISSN "/>
+<l:template name="stdnum.sep" text=". "/>
+<l:template name="patcountry.sep" text=". "/>
+<l:template name="pattype.sep" text=", "/>
+<l:template name="patnum.sep" text=". "/>
+<l:template name="patdate.sep" text=". "/>
+</l:context><l:letters><l:l i="-1"/>
+<l:l i="0">Simboli</l:l>
+<l:l i="10">A</l:l>
+<l:l i="10">a</l:l>
+<l:l i="20">B</l:l>
+<l:l i="20">b</l:l>
+<l:l i="30">C</l:l>
+<l:l i="30">c</l:l>
+<l:l i="30">Ć</l:l>
+<l:l i="30">ć</l:l>
+<l:l i="30">Č</l:l>
+<l:l i="30">Ä</l:l>
+<l:l i="40">D</l:l>
+<l:l i="40">d</l:l>
+<l:l i="40">Ä</l:l>
+<l:l i="40">Ä‘</l:l>
+<l:l i="50">E</l:l>
+<l:l i="50">e</l:l>
+<l:l i="60">F</l:l>
+<l:l i="60">f</l:l>
+<l:l i="70">G</l:l>
+<l:l i="70">g</l:l>
+<l:l i="80">H</l:l>
+<l:l i="80">h</l:l>
+<l:l i="90">I</l:l>
+<l:l i="90">i</l:l>
+<l:l i="100">J</l:l>
+<l:l i="100">j</l:l>
+<l:l i="110">K</l:l>
+<l:l i="110">k</l:l>
+<l:l i="120">L</l:l>
+<l:l i="120">l</l:l>
+<l:l i="130">M</l:l>
+<l:l i="130">m</l:l>
+<l:l i="140">N</l:l>
+<l:l i="140">n</l:l>
+<l:l i="150">O</l:l>
+<l:l i="150">o</l:l>
+<l:l i="160">P</l:l>
+<l:l i="160">p</l:l>
+<l:l i="180">R</l:l>
+<l:l i="180">r</l:l>
+<l:l i="190">S</l:l>
+<l:l i="190">s</l:l>
+<l:l i="190">Å </l:l>
+<l:l i="190">Å¡</l:l>
+<l:l i="200">T</l:l>
+<l:l i="200">t</l:l>
+<l:l i="210">U</l:l>
+<l:l i="210">u</l:l>
+<l:l i="220">V</l:l>
+<l:l i="220">v</l:l>
+<l:l i="260">Z</l:l>
+<l:l i="260">z</l:l>
+<l:l i="260">Ž</l:l>
+<l:l i="260">ž</l:l>
+</l:letters>
+</l:l10n>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/ca.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/ca.xml
new file mode 100644
index 0000000..95fd48b
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/ca.xml
@@ -0,0 +1,660 @@
+<?xml version="1.0" encoding="utf-8"?>
+<l:l10n xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0" language="ca" english-language-name="Catalan">
+
+<!-- * This file is generated automatically. -->
+<!-- * To submit changes to this file upstream (to the DocBook Project) -->
+<!-- * do not submit an edited version of this file. Instead, submit an -->
+<!-- * edited version of the source file at the following location: -->
+<!-- * -->
+<!-- * https://docbook.svn.sourceforge.net/svnroot/docbook/trunk/gentext/locale/ca.xml -->
+<!-- * -->
+<!-- * E-mail the edited ca.xml source file to: -->
+<!-- * -->
+<!-- * docbook-developers@lists.sourceforge.net -->
+
+<!-- ******************************************************************** -->
+
+<!-- This file is part of the XSL DocBook Stylesheet distribution. -->
+<!-- See ../README or http://docbook.sf.net/release/xsl/current/ for -->
+<!-- copyright and other information. -->
+
+<!-- ******************************************************************** -->
+<!-- In these files, % with a letter is used for a placeholder: -->
+<!-- %t is the current element's title -->
+<!-- %s is the current element's subtitle (if applicable)-->
+<!-- %n is the current element's number label-->
+<!-- %p is the current element's page number (if applicable)-->
+<!-- ******************************************************************** -->
+
+
+<l:gentext key="Abstract" text="Resum"/>
+<l:gentext key="abstract" text="resum"/>
+<l:gentext key="Acknowledgements" text="Agraïments"/>
+<l:gentext key="acknowledgements" text="agraïments"/>
+<l:gentext key="Answer" text="Resposta"/>
+<l:gentext key="answer" text="resposta"/>
+<l:gentext key="Appendix" text="Apèndix"/>
+<l:gentext key="appendix" text="apèndix"/>
+<l:gentext key="Article" text="Article"/>
+<l:gentext key="article" text="article"/>
+<l:gentext key="Author" text="Autor"/>
+<l:gentext key="Bibliography" text="Bibliografia"/>
+<l:gentext key="bibliography" text="bibliografia"/>
+<l:gentext key="Book" text="Llibre"/>
+<l:gentext key="book" text="llibre"/>
+<l:gentext key="CAUTION" text="ATENCIÓ"/>
+<l:gentext key="Caution" text="Atenció"/>
+<l:gentext key="caution" text="atenció"/>
+<l:gentext key="Chapter" text="Capítol"/>
+<l:gentext key="chapter" text="capítol"/>
+<l:gentext key="Colophon" text="Colofó"/>
+<l:gentext key="colophon" text="colofó"/>
+<l:gentext key="Copyright" text="Dret de reproducció"/>
+<l:gentext key="copyright" text="dret de reproducció"/>
+<l:gentext key="Dedication" text="Dedicatòria"/>
+<l:gentext key="dedication" text="dedicatòria"/>
+<l:gentext key="Edition" text="Edició"/>
+<l:gentext key="edition" text="edició"/>
+<l:gentext key="Editor" text="Editor"/>
+<l:gentext key="Equation" text="Equació"/>
+<l:gentext key="equation" text="equació"/>
+<l:gentext key="Example" text="Exemple"/>
+<l:gentext key="example" text="exemple"/>
+<l:gentext key="Figure" text="Figura"/>
+<l:gentext key="figure" text="figura"/>
+<l:gentext key="Glossary" text="Glossari"/>
+<l:gentext key="glossary" text="glossari"/>
+<l:gentext key="GlossSee" text="Veure"/>
+<l:gentext key="glosssee" text="veure"/>
+<l:gentext key="GlossSeeAlso" text="Veure també"/>
+<l:gentext key="glossseealso" text="veure també"/>
+<l:gentext key="IMPORTANT" text="IMPORTANT"/>
+<l:gentext key="important" text="important"/>
+<l:gentext key="Important" text="Important"/>
+<l:gentext key="Index" text="Ãndex alfabètic"/>
+<l:gentext key="index" text="índex alfabètic"/>
+<l:gentext key="ISBN" text="ISBN"/>
+<l:gentext key="isbn" text="ISBN"/>
+<l:gentext key="LegalNotice" text="Avís legal"/>
+<l:gentext key="legalnotice" text="avís legal"/>
+<l:gentext key="MsgAud" text="Audiència"/>
+<l:gentext key="msgaud" text="audiència"/>
+<l:gentext key="MsgLevel" text="Nivell"/>
+<l:gentext key="msglevel" text="nivell"/>
+<l:gentext key="MsgOrig" text="Origen"/>
+<l:gentext key="msgorig" text="origen"/>
+<l:gentext key="NOTE" text="NOTA"/>
+<l:gentext key="Note" text="Nota"/>
+<l:gentext key="note" text="nota"/>
+<l:gentext key="Part" text="Part"/>
+<l:gentext key="part" text="part"/>
+<l:gentext key="Preface" text="Prefaci"/>
+<l:gentext key="preface" text="prefaci"/>
+<l:gentext key="Procedure" text="Procediment"/>
+<l:gentext key="procedure" text="procediment"/>
+<l:gentext key="ProductionSet" text="Producció"/>
+<l:gentext key="PubDate" text="Data de publicació"/>
+<l:gentext key="pubdate" text="data de publicació"/>
+<l:gentext key="Published" text="Publicat"/>
+<l:gentext key="published" text="publicat"/>
+<l:gentext key="Publisher" text="Editor"/>
+<l:gentext key="Qandadiv" text="Pregunta i Resposta"/>
+<l:gentext key="qandadiv" text="pregunta i resposta"/>
+<l:gentext key="QandASet" text="Preguntes més freqüents"/>
+<l:gentext key="Question" text="Pregunta"/>
+<l:gentext key="question" text="pregunta"/>
+<l:gentext key="RefEntry" text="Pàgina"/>
+<l:gentext key="refentry" text="pàgina"/>
+<l:gentext key="Reference" text="Referència"/>
+<l:gentext key="reference" text="referència"/>
+<l:gentext key="References" text="Referències"/>
+<l:gentext key="RefName" text="Nom"/>
+<l:gentext key="refname" text="nom"/>
+<l:gentext key="RefSection" text="Secció de referència"/>
+<l:gentext key="refsection" text="secció de referència"/>
+<l:gentext key="RefSynopsisDiv" text="Sinopsi"/>
+<l:gentext key="refsynopsisdiv" text="sinopsi"/>
+<l:gentext key="RevHistory" text="Historial de revisions"/>
+<l:gentext key="revhistory" text="historial de revisions"/>
+<l:gentext key="revision" text="revisió"/>
+<l:gentext key="Revision" text="Revisió"/>
+<l:gentext key="sect1" text="Secció"/>
+<l:gentext key="sect2" text="Secció"/>
+<l:gentext key="sect3" text="Secció"/>
+<l:gentext key="sect4" text="Secció"/>
+<l:gentext key="sect5" text="Secció"/>
+<l:gentext key="section" text="secció"/>
+<l:gentext key="Section" text="Secció"/>
+<l:gentext key="see" text="veure"/>
+<l:gentext key="See" text="Veure"/>
+<l:gentext key="seealso" text="veure també"/>
+<l:gentext key="Seealso" text="Veure també"/>
+<l:gentext key="SeeAlso" text="Veure També"/>
+<l:gentext key="set" text="conjunt"/>
+<l:gentext key="Set" text="Conjunt"/>
+<l:gentext key="setindex" text="índex del conjunt"/>
+<l:gentext key="SetIndex" text="Ãndex del conjunt"/>
+<l:gentext key="Sidebar" text="Barra lateral"/>
+<l:gentext key="sidebar" text="barra lateral"/>
+<l:gentext key="step" text="Pas"/>
+<l:gentext key="Step" text="pas"/>
+<l:gentext key="table" text="taula"/>
+<l:gentext key="Table" text="Taula"/>
+<l:gentext key="task" text="tasca"/>
+<l:gentext key="Task" text="Tasca"/>
+<l:gentext key="tip" text="suggeriment"/>
+<l:gentext key="TIP" text="SUGGERIMENT"/>
+<l:gentext key="Tip" text="Suggeriment"/>
+<l:gentext key="Warning" text="Avís"/>
+<l:gentext key="warning" text="avís"/>
+<l:gentext key="WARNING" text="AVÃS"/>
+<l:gentext key="and" text="i"/>
+<l:gentext key="by" text="per"/>
+<l:gentext key="Edited" text="Editat"/>
+<l:gentext key="edited" text="editat"/>
+<l:gentext key="Editedby" text="Editat per"/>
+<l:gentext key="editedby" text="editat per"/>
+<l:gentext key="in" text="a"/>
+<l:gentext key="lastlistcomma" text=","/>
+<l:gentext key="listcomma" text=","/>
+<l:gentext key="notes" text="notes"/>
+<l:gentext key="Notes" text="Notes"/>
+<l:gentext key="Pgs" text="Pàgs."/>
+<l:gentext key="pgs" text="pàgs."/>
+<l:gentext key="Revisedby" text="Revisat per: "/>
+<l:gentext key="revisedby" text="revisat per: "/>
+<l:gentext key="TableNotes" text="Notes de taula"/>
+<l:gentext key="tablenotes" text="notes de taula"/>
+<l:gentext key="TableofContents" text="Sumari"/>
+<l:gentext key="tableofcontents" text="sumari"/>
+<l:gentext key="unexpectedelementname" text="nom d'element inesperat"/>
+<l:gentext key="unsupported" text="no reconeguda"/>
+<l:gentext key="xrefto" text="xref a"/>
+<l:gentext key="Authors" text="Autors"/>
+<l:gentext key="copyeditor" text="Editor de copiat"/>
+<l:gentext key="graphicdesigner" text="Dissenyador gràfic"/>
+<l:gentext key="productioneditor" text="Editor de producció"/>
+<l:gentext key="technicaleditor" text="Editor tècnic"/>
+<l:gentext key="translator" text="Traductor"/>
+<l:gentext key="listofequations" text="llistat d'equacions"/>
+<l:gentext key="ListofEquations" text="Llistat d'equacions"/>
+<l:gentext key="ListofExamples" text="Llistat d'exemples"/>
+<l:gentext key="listofexamples" text="llistat d'exemples"/>
+<l:gentext key="ListofFigures" text="Llistat de figures"/>
+<l:gentext key="listoffigures" text="llistat de figures"/>
+<l:gentext key="ListofProcedures" text="List of Procedures" lang="en"/>
+<l:gentext key="listofprocedures" text="List of Procedures" lang="en"/>
+<l:gentext key="listoftables" text="llistat de taules"/>
+<l:gentext key="ListofTables" text="Llistat de taules"/>
+<l:gentext key="ListofUnknown" text="Llistat de desconegut"/>
+<l:gentext key="listofunknown" text="llistat de desconegut"/>
+<l:gentext key="nav-home" text="Inici"/>
+<l:gentext key="nav-next" text="Següent"/>
+<l:gentext key="nav-next-sibling" text="Avançar"/>
+<l:gentext key="nav-prev" text="Anterior"/>
+<l:gentext key="nav-prev-sibling" text="Retrocedir"/>
+<l:gentext key="nav-up" text="Pujar"/>
+<l:gentext key="nav-toc" text="Taula de continguts"/>
+<l:gentext key="Draft" text="Esborrany"/>
+<l:gentext key="above" text="dalt"/>
+<l:gentext key="below" text="baix"/>
+<l:gentext key="sectioncalled" text="secció anomenada"/>
+<l:gentext key="index symbols" text="Símbols"/>
+<l:gentext key="writing-mode" text="lr-tb"/>
+<l:gentext key="lowercase.alpha" text="abcdefghijklmnopqrstuvwxyzàèéíòóúñç"/>
+<l:gentext key="uppercase.alpha" text="ABCDEFGHIJKLMNOPQRSTUVWXYZÀÈÉÃÒÓÚÑÇ"/>
+<l:gentext key="normalize.sort.input" text="AaÀàÃáÂâÃãÄäÅåĀÄĂ㥹ÇǎǞǟǠǡǺǻȀÈȂȃȦȧḀá¸áºšáº áº¡áº¢áº£áº¤áº¥áº¦áº§áº¨áº©áºªáº«áº¬áº­áº®áº¯áº°áº±áº²áº³áº´áºµáº¶áº·BbÆ€ÆɓƂƃḂḃḄḅḆḇCcÇçĆćĈĉĊċČÄƇƈɕḈḉDdÄŽÄÄđƊɗƋƌDžDzȡɖḊḋḌá¸á¸Žá¸á¸á¸‘ḒḓEeÈèÉéÊêËëĒēĔĕĖėĘęĚěȄȅȆȇȨȩḔḕḖḗḘḙḚḛḜá¸áº¸áº¹áººáº»áº¼áº½áº¾áº¿á»€á»á»‚ểỄễỆệFfƑƒḞḟGgÄœÄĞğĠġĢģƓɠǤǥǦǧǴǵḠḡHhĤĥĦħȞȟɦḢḣḤḥḦḧḨḩḪḫẖIiÌìÃíÎîÃïĨĩĪīĬĭĮįİƗɨÇÇȈȉȊȋḬḭḮḯỈỉỊịJjĴĵǰÊKkĶķƘƙǨǩḰḱḲḳḴḵLlĹĺĻļĽľĿŀÅłƚLjȴɫɬɭḶḷḸḹḺḻḼḽMmɱḾḿṀá¹á¹‚ṃNnÑñŃńŅņŇňÆɲƞȠNjǸǹȵɳṄṅṆṇṈṉṊṋOoÒòÓóÔôÕõÖöØøŌÅÅŽÅÅőƟƠơǑǒǪǫǬǭǾǿȌÈÈŽÈȪȫȬȭȮȯȰȱṌá¹á¹Žá¹á¹á¹‘ṒṓỌá»á»Žá»á»á»‘ỒồỔổỖỗỘộỚớỜá»á»žá»Ÿá» á»¡á»¢á»£PpƤƥṔṕṖṗQqÊ RrŔŕŖŗŘřÈȑȒȓɼɽɾṘṙṚṛṜá¹á¹žá¹ŸSsŚśŜÅŞşŠšȘșʂṠṡṢṣṤṥṦṧṨṩTtŢţŤťŦŧƫƬƭƮʈȚțȶṪṫṬṭṮṯṰṱẗUuÙùÚúÛûÜüŨũŪūŬŭŮůŰűŲųƯưǓǔǕǖǗǘǙǚǛǜȔȕȖȗṲṳṴṵṶṷṸṹṺṻỤụỦủỨứỪừỬửỮữỰựVvƲʋṼṽṾṿWwŴŵẀáºáº‚ẃẄẅẆẇẈẉẘXxẊẋẌáºYyÃýÿŸŶŷƳƴȲȳẎáºáº™á»²á»³á»´á»µá»¶á»·á»¸á»¹ZzŹźŻżŽžƵƶȤȥÊÊ‘áºáº‘ẒẓẔẕẕ" lang="en"/>
+<l:gentext key="normalize.sort.output" text="AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBCCCCCCCCCCCCCCCCCDDDDDDDDDDDDDDDDDDDDDDDDEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEFFFFFFGGGGGGGGGGGGGGGGGGGGHHHHHHHHHHHHHHHHHHHHIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIJJJJJJKKKKKKKKKKKKKKLLLLLLLLLLLLLLLLLLLLLLLLLLMMMMMMMMMNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOPPPPPPPPQQQRRRRRRRRRRRRRRRRRRRRRRRSSSSSSSSSSSSSSSSSSSSSSSTTTTTTTTTTTTTTTTTTTTTTTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUVVVVVVVVWWWWWWWWWWWWWWWXXXXXXYYYYYYYYYYYYYYYYYYYYYYYZZZZZZZZZZZZZZZZZZZZZ" lang="en"/>
+<l:dingbat key="startquote" text="“"/>
+<l:dingbat key="endquote" text="â€"/>
+<l:dingbat key="nestedstartquote" text="‘"/>
+<l:dingbat key="nestedendquote" text="’"/>
+<l:dingbat key="singlestartquote" text="‘" lang="en"/>
+<l:dingbat key="singleendquote" text="’" lang="en"/>
+<l:dingbat key="bullet" text="•"/>
+<l:gentext key="hyphenation-character" text="-" lang="en"/>
+<l:gentext key="hyphenation-push-character-count" text="2" lang="en"/>
+<l:gentext key="hyphenation-remain-character-count" text="2" lang="en"/>
+<l:context name="styles"><l:template name="person-name" text="last-first"/>
+</l:context>
+<l:context name="title"><l:template name="abstract" text="%t"/>
+<l:template name="acknowledgements" text="%t" lang="en"/>
+<l:template name="answer" text="%t"/>
+<l:template name="appendix" text="Apèndix %n. %t"/>
+<l:template name="article" text="%t"/>
+<l:template name="authorblurb" text="%t"/>
+<l:template name="bibliodiv" text="%t"/>
+<l:template name="biblioentry" text="%t"/>
+<l:template name="bibliography" text="%t"/>
+<l:template name="bibliolist" text="%t" lang="en"/>
+<l:template name="bibliomixed" text="%t"/>
+<l:template name="bibliomset" text="%t"/>
+<l:template name="biblioset" text="%t"/>
+<l:template name="blockquote" text="%t"/>
+<l:template name="book" text="%t"/>
+<l:template name="calloutlist" text="%t"/>
+<l:template name="caution" text="%t"/>
+<l:template name="chapter" text="Capítol %n. %t"/>
+<l:template name="colophon" text="%t"/>
+<l:template name="dedication" text="%t"/>
+<l:template name="equation" text="Equació %n. %t"/>
+<l:template name="example" text="Exemple %n. %t"/>
+<l:template name="figure" text="Figura %n. %t"/>
+<l:template name="foil" text="%t" lang="en"/>
+<l:template name="foilgroup" text="%t" lang="en"/>
+<l:template name="formalpara" text="%t"/>
+<l:template name="glossary" text="%t"/>
+<l:template name="glossdiv" text="%t"/>
+<l:template name="glosslist" text="%t" lang="en"/>
+<l:template name="glossentry" text="%t" lang="en"/>
+<l:template name="important" text="%t"/>
+<l:template name="index" text="%t"/>
+<l:template name="indexdiv" text="%t"/>
+<l:template name="itemizedlist" text="%t"/>
+<l:template name="legalnotice" text="%t"/>
+<l:template name="listitem" text=""/>
+<l:template name="lot" text="%t"/>
+<l:template name="msg" text="%t"/>
+<l:template name="msgexplan" text="%t"/>
+<l:template name="msgmain" text="%t"/>
+<l:template name="msgrel" text="%t"/>
+<l:template name="msgset" text="%t"/>
+<l:template name="msgsub" text="%t"/>
+<l:template name="note" text="%t"/>
+<l:template name="orderedlist" text="%t"/>
+<l:template name="part" text="Part %n. %t"/>
+<l:template name="partintro" text="%t"/>
+<l:template name="preface" text="%t"/>
+<l:template name="procedure" text="%t"/>
+<l:template name="procedure.formal" text="Procediment %n. %t"/>
+<l:template name="productionset" text="%t"/>
+<l:template name="productionset.formal" text="Producció %n"/>
+<l:template name="qandadiv" text="%t"/>
+<l:template name="qandaentry" text="%t"/>
+<l:template name="qandaset" text="%t"/>
+<l:template name="question" text="%t"/>
+<l:template name="refentry" text="%t"/>
+<l:template name="reference" text="%t"/>
+<l:template name="refsection" text="%t"/>
+<l:template name="refsect1" text="%t"/>
+<l:template name="refsect2" text="%t"/>
+<l:template name="refsect3" text="%t"/>
+<l:template name="refsynopsisdiv" text="%t"/>
+<l:template name="refsynopsisdivinfo" text="%t"/>
+<l:template name="segmentedlist" text="%t"/>
+<l:template name="set" text="%t"/>
+<l:template name="setindex" text="%t"/>
+<l:template name="sidebar" text="%t"/>
+<l:template name="step" text="%t"/>
+<l:template name="table" text="Taula %n. %t"/>
+<l:template name="task" text="%t" lang="en"/>
+<l:template name="tasksummary" text="%t" lang="en"/>
+<l:template name="taskprerequisites" text="%t" lang="en"/>
+<l:template name="taskrelated" text="%t" lang="en"/>
+<l:template name="tip" text="%t"/>
+<l:template name="toc" text="%t"/>
+<l:template name="variablelist" text="%t"/>
+<l:template name="varlistentry" text="" lang="en"/>
+<l:template name="warning" text="%t"/>
+</l:context>
+<l:context name="title-unnumbered"><l:template name="appendix" text="%t"/>
+<l:template name="article/appendix" text="%t" lang="en"/>
+<l:template name="bridgehead" text="%t"/>
+<l:template name="chapter" text="%t"/>
+<l:template name="sect1" text="%t"/>
+<l:template name="sect2" text="%t"/>
+<l:template name="sect3" text="%t"/>
+<l:template name="sect4" text="%t"/>
+<l:template name="sect5" text="%t"/>
+<l:template name="section" text="%t"/>
+<l:template name="simplesect" text="%t"/>
+<l:template name="part" text="%t" lang="en"/>
+</l:context>
+<l:context name="title-numbered"><l:template name="appendix" text="Apèndix %n. %t"/>
+<l:template name="article/appendix" text="%n. %t" lang="en"/>
+<l:template name="bridgehead" text="%n. %t"/>
+<l:template name="chapter" text="Capítol %n. %t"/>
+<l:template name="part" text="Part %n. %t"/>
+<l:template name="sect1" text="%n. %t"/>
+<l:template name="sect2" text="%n. %t"/>
+<l:template name="sect3" text="%n. %t"/>
+<l:template name="sect4" text="%n. %t"/>
+<l:template name="sect5" text="%n. %t"/>
+<l:template name="section" text="%n. %t"/>
+<l:template name="simplesect" text="%n. %t"/>
+</l:context>
+<l:context name="subtitle"><l:template name="appendix" text="%s"/>
+<l:template name="acknowledgements" text="%s" lang="en"/>
+<l:template name="article" text="%s"/>
+<l:template name="bibliodiv" text="%s"/>
+<l:template name="biblioentry" text="%s"/>
+<l:template name="bibliography" text="%s"/>
+<l:template name="bibliomixed" text="%s"/>
+<l:template name="bibliomset" text="%s"/>
+<l:template name="biblioset" text="%s"/>
+<l:template name="book" text="%s"/>
+<l:template name="chapter" text="%s"/>
+<l:template name="colophon" text="%s"/>
+<l:template name="dedication" text="%s"/>
+<l:template name="glossary" text="%s"/>
+<l:template name="glossdiv" text="%s"/>
+<l:template name="index" text="%s"/>
+<l:template name="indexdiv" text="%s"/>
+<l:template name="lot" text="%s"/>
+<l:template name="part" text="%s"/>
+<l:template name="partintro" text="%s"/>
+<l:template name="preface" text="%s"/>
+<l:template name="refentry" text="%s"/>
+<l:template name="reference" text="%s"/>
+<l:template name="refsection" text="%s"/>
+<l:template name="refsect1" text="%s"/>
+<l:template name="refsect2" text="%s"/>
+<l:template name="refsect3" text="%s"/>
+<l:template name="refsynopsisdiv" text="%s"/>
+<l:template name="sect1" text="%s"/>
+<l:template name="sect2" text="%s"/>
+<l:template name="sect3" text="%s"/>
+<l:template name="sect4" text="%s"/>
+<l:template name="sect5" text="%s"/>
+<l:template name="section" text="%s"/>
+<l:template name="set" text="%s"/>
+<l:template name="setindex" text="%s"/>
+<l:template name="sidebar" text="%s"/>
+<l:template name="simplesect" text="%s"/>
+<l:template name="toc" text="%s"/>
+</l:context>
+<l:context name="xref"><l:template name="abstract" text="%t"/>
+<l:template name="acknowledgements" text="%t" lang="en"/>
+<l:template name="answer" text="Resposta %n"/>
+<l:template name="appendix" text="%t"/>
+<l:template name="article" text="%t"/>
+<l:template name="authorblurb" text="%t"/>
+<l:template name="bibliodiv" text="%t"/>
+<l:template name="bibliography" text="%t"/>
+<l:template name="bibliomset" text="%t"/>
+<l:template name="biblioset" text="%t"/>
+<l:template name="blockquote" text="%t"/>
+<l:template name="book" text="%t"/>
+<l:template name="calloutlist" text="%t"/>
+<l:template name="caution" text="%t"/>
+<l:template name="chapter" text="%t"/>
+<l:template name="colophon" text="%t"/>
+<l:template name="constraintdef" text="%t"/>
+<l:template name="dedication" text="%t"/>
+<l:template name="equation" text="%t"/>
+<l:template name="example" text="%t"/>
+<l:template name="figure" text="%t"/>
+<l:template name="foil" text="%t" lang="en"/>
+<l:template name="foilgroup" text="%t" lang="en"/>
+<l:template name="formalpara" text="%t"/>
+<l:template name="glossary" text="%t"/>
+<l:template name="glossdiv" text="%t"/>
+<l:template name="important" text="%t"/>
+<l:template name="index" text="%t"/>
+<l:template name="indexdiv" text="%t"/>
+<l:template name="itemizedlist" text="%t"/>
+<l:template name="legalnotice" text="%t"/>
+<l:template name="listitem" text="%n"/>
+<l:template name="lot" text="%t"/>
+<l:template name="msg" text="%t"/>
+<l:template name="msgexplan" text="%t"/>
+<l:template name="msgmain" text="%t"/>
+<l:template name="msgrel" text="%t"/>
+<l:template name="msgset" text="%t"/>
+<l:template name="msgsub" text="%t"/>
+<l:template name="note" text="%t"/>
+<l:template name="orderedlist" text="%t"/>
+<l:template name="part" text="%t"/>
+<l:template name="partintro" text="%t"/>
+<l:template name="preface" text="%t"/>
+<l:template name="procedure" text="%t"/>
+<l:template name="productionset" text="%t"/>
+<l:template name="qandadiv" text="%t"/>
+<l:template name="qandaentry" text="Pregunta %n"/>
+<l:template name="qandaset" text="%t"/>
+<l:template name="question" text="Pregunta %n"/>
+<l:template name="reference" text="%t"/>
+<l:template name="refsynopsisdiv" text="%t"/>
+<l:template name="segmentedlist" text="%t"/>
+<l:template name="set" text="%t"/>
+<l:template name="setindex" text="%t"/>
+<l:template name="sidebar" text="%t"/>
+<l:template name="table" text="%t"/>
+<l:template name="task" text="%t" lang="en"/>
+<l:template name="tip" text="%t"/>
+<l:template name="toc" text="%t"/>
+<l:template name="variablelist" text="%t"/>
+<l:template name="varlistentry" text="%n"/>
+<l:template name="warning" text="%t"/>
+<l:template name="olink.document.citation" text=" in %o" lang="en"/>
+<l:template name="olink.page.citation" text=" (page %p)" lang="en"/>
+<l:template name="page.citation" text=" [%p]"/>
+<l:template name="page" text="(page %p)" lang="en"/>
+<l:template name="docname" text=" in %o" lang="en"/>
+<l:template name="docnamelong" text=" in the document titled %o" lang="en"/>
+<l:template name="pageabbrev" text="(p. %p)" lang="en"/>
+<l:template name="Page" text="Page %p" lang="en"/>
+<l:template name="bridgehead" text=" “%tâ€"/>
+<l:template name="refsection" text="“%tâ€"/>
+<l:template name="refsect1" text="“%tâ€"/>
+<l:template name="refsect2" text="“%tâ€"/>
+<l:template name="refsect3" text="“%tâ€"/>
+<l:template name="sect1" text="“%tâ€"/>
+<l:template name="sect2" text="“%tâ€"/>
+<l:template name="sect3" text="“%tâ€"/>
+<l:template name="sect4" text="“%tâ€"/>
+<l:template name="sect5" text="“%tâ€"/>
+<l:template name="section" text="“%tâ€"/>
+<l:template name="simplesect" text="“%tâ€"/>
+</l:context>
+<l:context name="xref-number"><l:template name="answer" text="Resposta %n"/>
+<l:template name="appendix" text="Apèndix %n"/>
+<l:template name="bridgehead" text="Secció %n"/>
+<l:template name="chapter" text="Capítol %n"/>
+<l:template name="equation" text="Equació %n"/>
+<l:template name="example" text="Exemple %n"/>
+<l:template name="figure" text="Figura %n"/>
+<l:template name="part" text="Part %n"/>
+<l:template name="procedure" text="Procediment %n"/>
+<l:template name="productionset" text="Producció %n"/>
+<l:template name="qandadiv" text="Pregunta i Resposta %n"/>
+<l:template name="qandaentry" text="Pregunta %n"/>
+<l:template name="question" text="Pregunta %n"/>
+<l:template name="sect1" text="Secció %n"/>
+<l:template name="sect2" text="Secció %n"/>
+<l:template name="sect3" text="Secció %n"/>
+<l:template name="sect4" text="Secció %n"/>
+<l:template name="sect5" text="Secció %n"/>
+<l:template name="section" text="Secció %n"/>
+<l:template name="table" text="Taula %n"/>
+</l:context>
+<l:context name="xref-number-and-title"><l:template name="appendix" text="Apèndix %n, %t"/>
+<l:template name="bridgehead" text="Secció %n, “%tâ€"/>
+<l:template name="chapter" text="Capítol %n, %t"/>
+<l:template name="equation" text="Equació %n, “%tâ€"/>
+<l:template name="example" text="Exemple %n, “%tâ€"/>
+<l:template name="figure" text="Figura %n, “%tâ€"/>
+<l:template name="part" text="Part %n, “%tâ€"/>
+<l:template name="procedure" text="Procediment %n, “%tâ€"/>
+<l:template name="productionset" text="Producció %n, “%tâ€"/>
+<l:template name="qandadiv" text="Pregunta i Resposta %n, “%tâ€"/>
+<l:template name="refsect1" text="secció anomenada “%tâ€"/>
+<l:template name="refsect2" text="secció anomenada “%tâ€"/>
+<l:template name="refsect3" text="secció anomenada “%tâ€"/>
+<l:template name="refsection" text="secció anomenada “%tâ€"/>
+<l:template name="sect1" text="Secció %n, “%tâ€"/>
+<l:template name="sect2" text="Secció %n, “%tâ€"/>
+<l:template name="sect3" text="Secció %n, “%tâ€"/>
+<l:template name="sect4" text="Secció %n, “%tâ€"/>
+<l:template name="sect5" text="Secció %n, “%tâ€"/>
+<l:template name="section" text="Secció %n, “%tâ€"/>
+<l:template name="simplesect" text="secció anomenada “%tâ€"/>
+<l:template name="table" text="Taula %n, “%tâ€"/>
+</l:context>
+<l:context name="authorgroup"><l:template name="sep" text=", "/>
+<l:template name="sep2" text=" i "/>
+<l:template name="seplast" text=", i "/>
+</l:context>
+<l:context name="glossary"><l:template name="see" text="Veure %t."/>
+<l:template name="seealso" text="Veure també %t."/>
+<l:template name="seealso-separator" text=", "/>
+</l:context>
+<l:context name="msgset"><l:template name="MsgAud" text="Audiència: "/>
+<l:template name="MsgLevel" text="Nivell: "/>
+<l:template name="MsgOrig" text="Origen: "/>
+</l:context>
+<l:context name="datetime"><l:template name="format" text="d/m/Y"/>
+</l:context>
+<l:context name="termdef"><l:template name="prefix" text="[Definition: "/>
+<l:template name="suffix" text="]"/>
+</l:context>
+<l:context name="datetime-full"><l:template name="January" text="Gener"/>
+<l:template name="February" text="Febrer"/>
+<l:template name="March" text="Març"/>
+<l:template name="April" text="Abril"/>
+<l:template name="May" text="Maig"/>
+<l:template name="June" text="Juny"/>
+<l:template name="July" text="Juliol"/>
+<l:template name="August" text="Agost"/>
+<l:template name="September" text="Setembre"/>
+<l:template name="October" text="Octubre"/>
+<l:template name="November" text="Novembre"/>
+<l:template name="December" text="Desembre"/>
+<l:template name="Monday" text="Dilluns"/>
+<l:template name="Tuesday" text="Dimarts"/>
+<l:template name="Wednesday" text="Dimecres"/>
+<l:template name="Thursday" text="Dijous"/>
+<l:template name="Friday" text="Divendres"/>
+<l:template name="Saturday" text="Dissabte"/>
+<l:template name="Sunday" text="Diumenge"/>
+</l:context>
+<l:context name="datetime-abbrev"><l:template name="Jan" text="Gen"/>
+<l:template name="Feb" text="Feb"/>
+<l:template name="Mar" text="Mar"/>
+<l:template name="Apr" text="Abr"/>
+<l:template name="May" text="Maig"/>
+<l:template name="Jun" text="Jun"/>
+<l:template name="Jul" text="Jul"/>
+<l:template name="Aug" text="Ago"/>
+<l:template name="Sep" text="Sep"/>
+<l:template name="Oct" text="Oct"/>
+<l:template name="Nov" text="Nov"/>
+<l:template name="Dec" text="Des"/>
+<l:template name="Mon" text="Dl"/>
+<l:template name="Tue" text="Dt"/>
+<l:template name="Wed" text="Dx"/>
+<l:template name="Thu" text="Dj"/>
+<l:template name="Fri" text="Dv"/>
+<l:template name="Sat" text="Ds"/>
+<l:template name="Sun" text="Dg"/>
+</l:context>
+<l:context name="htmlhelp"><l:template name="langcode" text="0x0403 Catalan"/>
+</l:context>
+<l:context name="index"><l:template name="term-separator" text=", "/>
+<l:template name="number-separator" text=", "/>
+<l:template name="range-separator" text="-"/>
+</l:context>
+<l:context name="iso690"><l:template name="lastfirst.sep" text=", "/>
+<l:template name="alt.person.two.sep" text=" – "/>
+<l:template name="alt.person.last.sep" text=" – "/>
+<l:template name="alt.person.more.sep" text=" – "/>
+<l:template name="primary.editor" text=" (ed.)"/>
+<l:template name="primary.many" text=", et al."/>
+<l:template name="primary.sep" text=". "/>
+<l:template name="submaintitle.sep" text=": "/>
+<l:template name="title.sep" text=". "/>
+<l:template name="othertitle.sep" text=", "/>
+<l:template name="medium1" text=" ["/>
+<l:template name="medium2" text="]"/>
+<l:template name="secondary.person.sep" text="; "/>
+<l:template name="secondary.sep" text=". "/>
+<l:template name="respons.sep" text=". "/>
+<l:template name="edition.sep" text=". "/>
+<l:template name="edition.serial.sep" text=", "/>
+<l:template name="issuing.range" text="-"/>
+<l:template name="issuing.div" text=", "/>
+<l:template name="issuing.sep" text=". "/>
+<l:template name="partnr.sep" text=". "/>
+<l:template name="placepubl.sep" text=": "/>
+<l:template name="publyear.sep" text=", "/>
+<l:template name="pubinfo.sep" text=". "/>
+<l:template name="spec.pubinfo.sep" text=", "/>
+<l:template name="upd.sep" text=", "/>
+<l:template name="datecit1" text=" [cited "/>
+<l:template name="datecit2" text="]"/>
+<l:template name="extent.sep" text=". "/>
+<l:template name="locs.sep" text=", "/>
+<l:template name="location.sep" text=". "/>
+<l:template name="serie.sep" text=". "/>
+<l:template name="notice.sep" text=". "/>
+<l:template name="access" text="Available "/>
+<l:template name="acctoo" text="Also available "/>
+<l:template name="onwww" text="from World Wide Web"/>
+<l:template name="oninet" text="from Internet"/>
+<l:template name="access.end" text=": "/>
+<l:template name="link1" text="&lt;"/>
+<l:template name="link2" text="&gt;"/>
+<l:template name="access.sep" text=". "/>
+<l:template name="isbn" text="ISBN "/>
+<l:template name="issn" text="ISSN "/>
+<l:template name="stdnum.sep" text=". "/>
+<l:template name="patcountry.sep" text=". "/>
+<l:template name="pattype.sep" text=", "/>
+<l:template name="patnum.sep" text=". "/>
+<l:template name="patdate.sep" text=". "/>
+</l:context><l:letters><l:l i="-1"/>
+<l:l i="0">Símbols</l:l>
+<l:l i="10">A</l:l>
+<l:l i="10">a</l:l>
+<l:l i="20">B</l:l>
+<l:l i="20">b</l:l>
+<l:l i="30">C</l:l>
+<l:l i="30">c</l:l>
+<l:l i="40">D</l:l>
+<l:l i="40">d</l:l>
+<l:l i="50">E</l:l>
+<l:l i="50">e</l:l>
+<l:l i="60">F</l:l>
+<l:l i="60">f</l:l>
+<l:l i="70">G</l:l>
+<l:l i="70">g</l:l>
+<l:l i="80">H</l:l>
+<l:l i="80">h</l:l>
+<l:l i="90">I</l:l>
+<l:l i="90">i</l:l>
+<l:l i="100">J</l:l>
+<l:l i="100">j</l:l>
+<l:l i="110">K</l:l>
+<l:l i="110">k</l:l>
+<l:l i="120">L</l:l>
+<l:l i="120">l</l:l>
+<l:l i="130">M</l:l>
+<l:l i="130">m</l:l>
+<l:l i="140">N</l:l>
+<l:l i="140">n</l:l>
+<l:l i="150">O</l:l>
+<l:l i="150">o</l:l>
+<l:l i="160">P</l:l>
+<l:l i="160">p</l:l>
+<l:l i="170">Q</l:l>
+<l:l i="170">q</l:l>
+<l:l i="180">R</l:l>
+<l:l i="180">r</l:l>
+<l:l i="190">S</l:l>
+<l:l i="190">s</l:l>
+<l:l i="200">T</l:l>
+<l:l i="200">t</l:l>
+<l:l i="210">U</l:l>
+<l:l i="210">u</l:l>
+<l:l i="220">V</l:l>
+<l:l i="220">v</l:l>
+<l:l i="230">W</l:l>
+<l:l i="230">w</l:l>
+<l:l i="240">X</l:l>
+<l:l i="240">x</l:l>
+<l:l i="250">Y</l:l>
+<l:l i="250">y</l:l>
+<l:l i="260">Z</l:l>
+<l:l i="260">z</l:l>
+</l:letters>
+</l:l10n>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/charmap.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/charmap.xml
new file mode 100644
index 0000000..a12a84f
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/charmap.xml
@@ -0,0 +1,185 @@
+<?xml version="1.0"?>
+
+<reference xml:id="charmap">
+ <info>
+ <title>Common » Character-Map Template Reference</title>
+ <releaseinfo role="meta">
+ $Id: charmap.xsl 7266 2007-08-22 11:58:42Z xmldoc $
+ </releaseinfo>
+ </info>
+
+ <partintro xml:id="partintro">
+ <title>Introduction</title>
+
+<para>This is technical reference documentation for the
+ character-map templates in the DocBook XSL Stylesheets.</para>
+
+ <note>
+
+<para>These templates are defined in a separate file from the set
+ of “common†templates because some of the common templates
+ reference DocBook XSL stylesheet parameters, requiring the
+ entire set of parameters to be imported/included in any
+ stylesheet that imports/includes the common templates.</para>
+
+
+<para>The character-map templates don’t import or include
+ any DocBook XSL stylesheet parameters, so the
+ character-map templates can be used without importing the
+ whole set of parameters.</para>
+
+ </note>
+
+<para>This is not intended to be user documentation. It is
+ provided for developers writing customization layers for the
+ stylesheets.</para>
+
+ </partintro>
+
+<refentry xmlns:xlink="http://www.w3.org/1999/xlink" xml:id="template.apply-character-map">
+<refnamediv>
+<refname>apply-character-map</refname>
+<refpurpose>Applies an XSLT character map</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+<synopsis>&lt;xsl:template name="apply-character-map"&gt;
+&lt;xsl:param name="content"/&gt;
+&lt;xsl:param name="map.contents"/&gt;
+ ...
+&lt;/xsl:template&gt;</synopsis>
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>This template applies an <link xlink:href="http://www.w3.org/TR/xslt20/#character-maps">XSLT character map</link>; that is, it causes certain
+ individual characters to be substituted with strings of one
+ or more characters. It is useful mainly for replacing
+ multiple “special†characters or symbols in the same target
+ content. It uses the value of
+ <parameter>map.contents</parameter> to do substitution on
+ <parameter>content</parameter>, and then returns the
+ modified contents.</para>
+
+ <note>
+
+<para>This template is a very slightly modified version of
+ Jeni Tennison’s <function>replace_strings</function>
+ template in the <link xlink:href="http://www.dpawson.co.uk/xsl/sect2/StringReplace.html#d9351e13">multiple string replacements</link> section of Dave Pawson’s
+ <link xlink:href="http://www.dpawson.co.uk/xsl/index.html">XSLT FAQ</link>.</para>
+
+
+<para>The <function>apply-string-subst-map</function>
+ template is essentially the same template as the
+ <function>apply-character-map</function> template; the
+ only difference is that in the map that
+ <function>apply-string-subst-map</function> expects, <tag class="attribute">oldstring</tag> and <tag class="attribute">newstring</tag> attributes are used
+ instead of <tag class="attribute">character</tag> and <tag class="attribute">string</tag> attributes.</para>
+
+ </note>
+ </refsect1><refsect1><title>Parameters</title>
+
+<variablelist>
+ <varlistentry><term>content</term>
+ <listitem>
+
+<para>The content on which to perform the character-map
+ substitution.</para>
+
+ </listitem>
+ </varlistentry>
+ <varlistentry><term>map.contents</term>
+ <listitem>
+
+<para>A node set of elements, with each element having
+ the following attributes:
+
+<itemizedlist>
+ <listitem>
+ <simpara><tag class="attribute">character</tag>, a
+ character to be replaced</simpara>
+ </listitem>
+ <listitem>
+ <simpara><tag class="attribute">string</tag>, a
+ string with which to replace <tag class="attribute">character</tag></simpara>
+ </listitem>
+ </itemizedlist>
+
+ </para>
+
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ </refsect1></refentry>
+
+<refentry xmlns:xlink="http://www.w3.org/1999/xlink" xml:id="template.read-character-map">
+<refnamediv>
+<refname>read-character-map</refname>
+<refpurpose>Reads in all or part of an XSLT character map</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+<synopsis>&lt;xsl:template name="read-character-map"&gt;
+&lt;xsl:param name="use.subset"/&gt;
+&lt;xsl:param name="subset.profile"/&gt;
+&lt;xsl:param name="uri"/&gt;
+ ...
+&lt;/xsl:template&gt;</synopsis>
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>The XSLT 2.0 specification describes <link xlink:href="http://www.w3.org/TR/xslt20/#character-maps">character maps</link> and explains how they may be used
+ to allow a specific character appearing in a text or
+ attribute node in a final result tree to be substituted by
+ a specified string of characters during serialization. The
+ <function>read-character-map</function> template provides a
+ means for reading and using character maps with XSLT
+ 1.0-based tools.</para>
+
+
+<para>This template reads the character-map contents from
+ <parameter>uri</parameter> (in full or in part, depending on
+ the value of the <parameter>use.subset</parameter>
+ parameter), then passes those contents to the
+ <function>apply-character-map</function> template, along with
+ <parameter>content</parameter>, the data on which to perform
+ the character substitution.</para>
+
+
+<para>Using the character map “in part†means that it uses only
+ those <tag>output-character</tag> elements that match the
+ XPath expression given in the value of the
+ <parameter>subset.profile</parameter> parameter. The current
+ implementation of that capability here relies on the
+ <function>evaluate</function> extension XSLT function.</para>
+
+ </refsect1><refsect1><title>Parameters</title>
+
+<variablelist>
+ <varlistentry><term>use.subset</term>
+ <listitem>
+
+<para>Specifies whether to use a subset of the character
+ map instead of the whole map; boolean
+ <literal>0</literal> or <literal>1</literal></para>
+
+ </listitem>
+ </varlistentry>
+ <varlistentry><term>subset.profile</term>
+ <listitem>
+
+<para>XPath expression that specifies what subset of the
+ character map to use</para>
+
+ </listitem>
+ </varlistentry>
+ <varlistentry><term>uri</term>
+ <listitem>
+
+<para>URI for a character map</para>
+
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ </refsect1></refentry>
+</reference>
+
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/charmap.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/charmap.xsl
new file mode 100644
index 0000000..3e0f5d4
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/charmap.xsl
@@ -0,0 +1,221 @@
+<?xml version='1.0'?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:doc="http://nwalsh.com/xsl/documentation/1.0"
+ xmlns:dyn="http://exslt.org/dynamic"
+ xmlns:saxon="http://icl.com/saxon"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ exclude-result-prefixes="doc dyn saxon"
+ version='1.0'>
+
+<!-- ********************************************************************
+ $Id: charmap.xsl 7266 2007-08-22 11:58:42Z xmldoc $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+<doc:reference xmlns="" xml:id="charmap">
+ <info>
+ <title>Common » Character-Map Template Reference</title>
+ <releaseinfo role="meta">
+ $Id: charmap.xsl 7266 2007-08-22 11:58:42Z xmldoc $
+ </releaseinfo>
+ </info>
+ <!-- * yes, partintro is a valid child of a reference... -->
+ <partintro xml:id="partintro">
+ <title>Introduction</title>
+ <para>This is technical reference documentation for the
+ character-map templates in the DocBook XSL Stylesheets.</para>
+ <note>
+ <para>These templates are defined in a separate file from the set
+ of “common†templates because some of the common templates
+ reference DocBook XSL stylesheet parameters, requiring the
+ entire set of parameters to be imported/included in any
+ stylesheet that imports/includes the common templates.</para>
+ <para>The character-map templates don’t import or include
+ any DocBook XSL stylesheet parameters, so the
+ character-map templates can be used without importing the
+ whole set of parameters.</para>
+ </note>
+ <para>This is not intended to be user documentation. It is
+ provided for developers writing customization layers for the
+ stylesheets.</para>
+ </partintro>
+</doc:reference>
+
+<!-- ===================================== -->
+<doc:template name="apply-character-map" xmlns="">
+ <refpurpose>Applies an XSLT character map</refpurpose>
+ <refdescription id="apply-character-map-desc">
+ <para>This template applies an <link
+ xlink:href="http://www.w3.org/TR/xslt20/#character-maps"
+ >XSLT character map</link>; that is, it causes certain
+ individual characters to be substituted with strings of one
+ or more characters. It is useful mainly for replacing
+ multiple “special†characters or symbols in the same target
+ content. It uses the value of
+ <parameter>map.contents</parameter> to do substitution on
+ <parameter>content</parameter>, and then returns the
+ modified contents.</para>
+ <note>
+ <para>This template is a very slightly modified version of
+ Jeni Tennison’s <function>replace_strings</function>
+ template in the <link
+ xlink:href="http://www.dpawson.co.uk/xsl/sect2/StringReplace.html#d9351e13"
+ >multiple string replacements</link> section of Dave Pawson’s
+ <link xlink:href="http://www.dpawson.co.uk/xsl/index.html"
+ >XSLT FAQ</link>.</para>
+ <para>The <function>apply-string-subst-map</function>
+ template is essentially the same template as the
+ <function>apply-character-map</function> template; the
+ only difference is that in the map that
+ <function>apply-string-subst-map</function> expects, <tag
+ class="attribute">oldstring</tag> and <tag
+ class="attribute">newstring</tag> attributes are used
+ instead of <tag class="attribute">character</tag> and <tag
+ class="attribute">string</tag> attributes.</para>
+ </note>
+ </refdescription>
+ <refparameter id="apply-character-map-params">
+ <variablelist>
+ <varlistentry><term>content</term>
+ <listitem>
+ <para>The content on which to perform the character-map
+ substitution.</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry><term>map.contents</term>
+ <listitem>
+ <para>A node set of elements, with each element having
+ the following attributes:
+ <itemizedlist>
+ <listitem>
+ <simpara><tag class="attribute">character</tag>, a
+ character to be replaced</simpara>
+ </listitem>
+ <listitem>
+ <simpara><tag class="attribute">string</tag>, a
+ string with which to replace <tag
+ class="attribute">character</tag></simpara>
+ </listitem>
+ </itemizedlist>
+ </para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+</doc:template>
+<xsl:template name="apply-character-map">
+ <xsl:param name="content"/>
+ <xsl:param name="map.contents"/>
+ <xsl:variable name="replaced_text">
+ <xsl:call-template name="string.subst">
+ <xsl:with-param name="string" select="$content" />
+ <xsl:with-param name="target"
+ select="$map.contents[1]/@character" />
+ <xsl:with-param name="replacement"
+ select="$map.contents[1]/@string" />
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:choose>
+ <xsl:when test="$map.contents[2]">
+ <xsl:call-template name="apply-character-map">
+ <xsl:with-param name="content" select="$replaced_text" />
+ <xsl:with-param name="map.contents"
+ select="$map.contents[position() > 1]" />
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$replaced_text" />
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ===================================== -->
+<doc:template name="read-character-map" xmlns="">
+ <refpurpose>Reads in all or part of an XSLT character map</refpurpose>
+ <refdescription id="read-character-map-desc">
+ <para>The XSLT 2.0 specification describes <link
+ xlink:href="http://www.w3.org/TR/xslt20/#character-maps"
+ >character maps</link> and explains how they may be used
+ to allow a specific character appearing in a text or
+ attribute node in a final result tree to be substituted by
+ a specified string of characters during serialization. The
+ <function>read-character-map</function> template provides a
+ means for reading and using character maps with XSLT
+ 1.0-based tools.</para>
+ <para>This template reads the character-map contents from
+ <parameter>uri</parameter> (in full or in part, depending on
+ the value of the <parameter>use.subset</parameter>
+ parameter), then passes those contents to the
+ <function>apply-character-map</function> template, along with
+ <parameter>content</parameter>, the data on which to perform
+ the character substitution.</para>
+ <para>Using the character map “in part†means that it uses only
+ those <tag>output-character</tag> elements that match the
+ XPath expression given in the value of the
+ <parameter>subset.profile</parameter> parameter. The current
+ implementation of that capability here relies on the
+ <function>evaluate</function> extension XSLT function.</para>
+ </refdescription>
+ <refparameter id="read-character-map-params">
+ <variablelist>
+ <varlistentry><term>use.subset</term>
+ <listitem>
+ <para>Specifies whether to use a subset of the character
+ map instead of the whole map; boolean
+ <literal>0</literal> or <literal>1</literal></para>
+ </listitem>
+ </varlistentry>
+ <varlistentry><term>subset.profile</term>
+ <listitem>
+ <para>XPath expression that specifies what subset of the
+ character map to use</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry><term>uri</term>
+ <listitem>
+ <para>URI for a character map</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+</doc:template>
+<xsl:template name="read-character-map">
+ <xsl:param name="use.subset"/>
+ <xsl:param name="subset.profile"/>
+ <xsl:param name="uri"/>
+ <xsl:choose>
+ <xsl:when test="$use.subset != 0">
+ <!-- *use a subset of the character map instead of the full map -->
+ <xsl:choose>
+ <!-- * xsltproc and Xalan both support dyn:evaluate() -->
+ <xsl:when test="function-available('dyn:evaluate')">
+ <xsl:copy-of select="document($uri)//*[local-name()='output-character']
+ [dyn:evaluate($subset.profile)]"/>
+ </xsl:when>
+ <!-- * Saxon has its own evaluate() and doesn't support dyn:evaluate() -->
+ <xsl:when test="function-available('saxon:evaluate')">
+ <xsl:copy-of select="document($uri)//*[local-name()='output-character']
+ [saxon:evaluate($subset.profile)]"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:message terminate="yes"
+>
+Error: To process character-map subsets, you must use an XSLT engine
+that supports the evaluate() XSLT extension function. Your XSLT engine
+does not support it.
+ </xsl:message>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <!-- *value of $use.subset is non-zero, so use the full map -->
+ <xsl:copy-of select="document($uri)//*[local-name()='output-character']"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/common.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/common.xml
new file mode 100644
index 0000000..da79980
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/common.xml
@@ -0,0 +1,622 @@
+<?xml version="1.0"?>
+
+<reference xml:id="base">
+ <info>
+ <title>Common » Base Template Reference</title>
+ <releaseinfo role="meta">
+ $Id: common.xsl 8784 2010-07-28 12:32:54Z mzjn $
+ </releaseinfo>
+ </info>
+
+ <partintro xml:id="partintro">
+ <title>Introduction</title>
+
+<para>This is technical reference documentation for the “baseâ€
+ set of common templates in the DocBook XSL Stylesheets.</para>
+
+
+<para>This is not intended to be user documentation. It is
+ provided for developers writing customization layers for the
+ stylesheets.</para>
+
+ </partintro>
+
+<refentry xmlns:xlink="http://www.w3.org/1999/xlink" xml:id="template.is.component">
+<refnamediv>
+<refname>is.component</refname>
+<refpurpose>Tests if a given node is a component-level element</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+<synopsis>&lt;xsl:template name="is.component"&gt;
+&lt;xsl:param name="node" select="."/&gt;
+ ...
+&lt;/xsl:template&gt;</synopsis>
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>This template returns '1' if the specified node is a component
+(Chapter, Appendix, etc.), and '0' otherwise.</para>
+
+</refsect1><refsect1><title>Parameters</title>
+
+<variablelist>
+<varlistentry><term>node</term>
+<listitem>
+
+<para>The node which is to be tested.</para>
+
+</listitem>
+</varlistentry>
+</variablelist>
+
+</refsect1><refsect1><title>Returns</title>
+
+<para>This template returns '1' if the specified node is a component
+(Chapter, Appendix, etc.), and '0' otherwise.</para>
+
+</refsect1></refentry>
+
+<refentry xmlns:xlink="http://www.w3.org/1999/xlink" xml:id="template.is.section">
+<refnamediv>
+<refname>is.section</refname>
+<refpurpose>Tests if a given node is a section-level element</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+<synopsis>&lt;xsl:template name="is.section"&gt;
+&lt;xsl:param name="node" select="."/&gt;
+ ...
+&lt;/xsl:template&gt;</synopsis>
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>This template returns '1' if the specified node is a section
+(Section, Sect1, Sect2, etc.), and '0' otherwise.</para>
+
+</refsect1><refsect1><title>Parameters</title>
+
+<variablelist>
+<varlistentry><term>node</term>
+<listitem>
+
+<para>The node which is to be tested.</para>
+
+</listitem>
+</varlistentry>
+</variablelist>
+
+</refsect1><refsect1><title>Returns</title>
+
+<para>This template returns '1' if the specified node is a section
+(Section, Sect1, Sect2, etc.), and '0' otherwise.</para>
+
+</refsect1></refentry>
+
+<refentry xmlns:xlink="http://www.w3.org/1999/xlink" xml:id="template.section.level">
+<refnamediv>
+<refname>section.level</refname>
+<refpurpose>Returns the hierarchical level of a section</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+<synopsis>&lt;xsl:template name="section.level"&gt;
+&lt;xsl:param name="node" select="."/&gt;
+ ...
+&lt;/xsl:template&gt;</synopsis>
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>This template calculates the hierarchical level of a section.
+The element <tag>sect1</tag> is at level 1, <tag>sect2</tag> is
+at level 2, etc.</para>
+
+
+
+<para>Recursive sections are calculated down to the fifth level.</para>
+
+</refsect1><refsect1><title>Parameters</title>
+
+<variablelist>
+<varlistentry><term>node</term>
+<listitem>
+
+<para>The section node for which the level should be calculated.
+Defaults to the context node.</para>
+
+</listitem>
+</varlistentry>
+</variablelist>
+
+</refsect1><refsect1><title>Returns</title>
+
+<para>The section level, <quote>1</quote>, <quote>2</quote>, etc.
+</para>
+
+</refsect1></refentry>
+
+<refentry xmlns:xlink="http://www.w3.org/1999/xlink" xml:id="template.qanda.section.level">
+<refnamediv>
+<refname>qanda.section.level</refname>
+<refpurpose>Returns the hierarchical level of a QandASet</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+<synopsis>&lt;xsl:template name="qanda.section.level"/&gt;</synopsis>
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>This template calculates the hierarchical level of a QandASet.
+</para>
+
+</refsect1><refsect1><title>Returns</title>
+
+<para>The level, <quote>1</quote>, <quote>2</quote>, etc.
+</para>
+
+</refsect1></refentry>
+
+<refentry xmlns:xlink="http://www.w3.org/1999/xlink" xml:id="template.select.mediaobject">
+<refnamediv>
+<refname>select.mediaobject</refname>
+<refpurpose>Selects and processes an appropriate media object from a list</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+<synopsis>&lt;xsl:template name="select.mediaobject"&gt;
+&lt;xsl:param name="olist" select="imageobject|imageobjectco |videoobject|audioobject|textobject"/&gt;
+ ...
+&lt;/xsl:template&gt;</synopsis>
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>This template takes a list of media objects (usually the
+children of a mediaobject or inlinemediaobject) and processes
+the "right" object.</para>
+
+
+
+<para>This template relies on a template named
+"select.mediaobject.index" to determine which object
+in the list is appropriate.</para>
+
+
+
+<para>If no acceptable object is located, nothing happens.</para>
+
+</refsect1><refsect1><title>Parameters</title>
+
+<variablelist>
+<varlistentry><term>olist</term>
+<listitem>
+
+<para>The node list of potential objects to examine.</para>
+
+</listitem>
+</varlistentry>
+</variablelist>
+
+</refsect1><refsect1><title>Returns</title>
+
+<para>Calls &lt;xsl:apply-templates&gt; on the selected object.</para>
+
+</refsect1></refentry>
+
+<refentry xmlns:xlink="http://www.w3.org/1999/xlink" xml:id="template.select.mediaobject.index">
+<refnamediv>
+<refname>select.mediaobject.index</refname>
+<refpurpose>Selects the position of the appropriate media object from a list</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+<synopsis>&lt;xsl:template name="select.mediaobject.index"&gt;
+&lt;xsl:param name="olist" select="imageobject|imageobjectco |videoobject|audioobject|textobject"/&gt;
+&lt;xsl:param name="count"&gt;1&lt;/xsl:param&gt;
+ ...
+&lt;/xsl:template&gt;</synopsis>
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>This template takes a list of media objects (usually the
+children of a mediaobject or inlinemediaobject) and determines
+the "right" object. It returns the position of that object
+to be used by the calling template.</para>
+
+
+
+<para>If the parameter <parameter>use.role.for.mediaobject</parameter>
+is nonzero, then it first checks for an object with
+a role attribute of the appropriate value. It takes the first
+of those. Otherwise, it takes the first acceptable object
+through a recursive pass through the list.</para>
+
+
+
+<para>This template relies on a template named "is.acceptable.mediaobject"
+to determine if a given object is an acceptable graphic. The semantics
+of media objects is that the first acceptable graphic should be used.
+</para>
+
+
+
+<para>If no acceptable object is located, no index is returned.</para>
+
+</refsect1><refsect1><title>Parameters</title>
+
+<variablelist>
+<varlistentry><term>olist</term>
+<listitem>
+
+<para>The node list of potential objects to examine.</para>
+
+</listitem>
+</varlistentry>
+<varlistentry><term>count</term>
+<listitem>
+
+<para>The position in the list currently being considered by the
+recursive process.</para>
+
+</listitem>
+</varlistentry>
+</variablelist>
+
+</refsect1><refsect1><title>Returns</title>
+
+<para>Returns the position in the original list of the selected object.</para>
+
+</refsect1></refentry>
+
+<refentry xmlns:xlink="http://www.w3.org/1999/xlink" xml:id="template.is.acceptable.mediaobject">
+<refnamediv>
+<refname>is.acceptable.mediaobject</refname>
+<refpurpose>Returns '1' if the specified media object is recognized</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+<synopsis>&lt;xsl:template name="is.acceptable.mediaobject"&gt;
+&lt;xsl:param name="object"/&gt;
+ ...
+&lt;/xsl:template&gt;</synopsis>
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>This template examines a media object and returns '1' if the
+object is recognized as a graphic.</para>
+
+</refsect1><refsect1><title>Parameters</title>
+
+<variablelist>
+<varlistentry><term>object</term>
+<listitem>
+
+<para>The media object to consider.</para>
+
+</listitem>
+</varlistentry>
+</variablelist>
+
+</refsect1><refsect1><title>Returns</title>
+
+<para>0 or 1</para>
+
+</refsect1></refentry>
+
+<refentry xmlns:xlink="http://www.w3.org/1999/xlink" xml:id="template.check.id.unique">
+<refnamediv>
+<refname>check.id.unique</refname>
+<refpurpose>Warn users about references to non-unique IDs</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+<synopsis>&lt;xsl:template name="check.id.unique"&gt;
+&lt;xsl:param name="linkend"/&gt;
+ ...
+&lt;/xsl:template&gt;</synopsis>
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>If passed an ID in <varname>linkend</varname>,
+<function>check.id.unique</function> prints
+a warning message to the user if either the ID does not exist or
+the ID is not unique.</para>
+
+</refsect1></refentry>
+
+<refentry xmlns:xlink="http://www.w3.org/1999/xlink" xml:id="template.check.idref.targets">
+<refnamediv>
+<refname>check.idref.targets</refname>
+<refpurpose>Warn users about incorrectly typed references</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+<synopsis>&lt;xsl:template name="check.idref.targets"&gt;
+&lt;xsl:param name="linkend"/&gt;
+&lt;xsl:param name="element-list"/&gt;
+ ...
+&lt;/xsl:template&gt;</synopsis>
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>If passed an ID in <varname>linkend</varname>,
+<function>check.idref.targets</function> makes sure that the element
+pointed to by the link is one of the elements listed in
+<varname>element-list</varname> and warns the user otherwise.</para>
+
+</refsect1></refentry>
+
+<refentry xmlns:xlink="http://www.w3.org/1999/xlink" xml:id="template.copyright.years">
+<refnamediv>
+<refname>copyright.years</refname>
+<refpurpose>Print a set of years with collapsed ranges</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+<synopsis>&lt;xsl:template name="copyright.years"&gt;
+&lt;xsl:param name="years"/&gt;
+&lt;xsl:param name="print.ranges" select="1"/&gt;
+&lt;xsl:param name="single.year.ranges" select="0"/&gt;
+&lt;xsl:param name="firstyear" select="0"/&gt;
+&lt;xsl:param name="nextyear" select="0"/&gt;
+ ...
+&lt;/xsl:template&gt;</synopsis>
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>This template prints a list of year elements with consecutive
+years printed as a range. In other words:</para>
+
+
+<screen>&lt;year&gt;1992&lt;/year&gt;
+&lt;year&gt;1993&lt;/year&gt;
+&lt;year&gt;1994&lt;/year&gt;</screen>
+
+
+<para>is printed <quote>1992-1994</quote>, whereas:</para>
+
+
+<screen>&lt;year&gt;1992&lt;/year&gt;
+&lt;year&gt;1994&lt;/year&gt;</screen>
+
+
+<para>is printed <quote>1992, 1994</quote>.</para>
+
+
+
+<para>This template assumes that all the year elements contain only
+decimal year numbers, that the elements are sorted in increasing
+numerical order, that there are no duplicates, and that all the years
+are expressed in full <quote>century+year</quote>
+(<quote>1999</quote> not <quote>99</quote>) notation.</para>
+
+</refsect1><refsect1><title>Parameters</title>
+
+<variablelist>
+<varlistentry><term>years</term>
+<listitem>
+
+<para>The initial set of year elements.</para>
+
+</listitem>
+</varlistentry>
+<varlistentry><term>print.ranges</term>
+<listitem>
+
+<para>If non-zero, multi-year ranges are collapsed. If zero, all years
+are printed discretely.</para>
+
+</listitem>
+</varlistentry>
+<varlistentry><term>single.year.ranges</term>
+<listitem>
+
+<para>If non-zero, two consecutive years will be printed as a range,
+otherwise, they will be printed discretely. In other words, a single
+year range is <quote>1991-1992</quote> but discretely it's
+<quote>1991, 1992</quote>.</para>
+
+</listitem>
+</varlistentry>
+</variablelist>
+
+</refsect1><refsect1><title>Returns</title>
+
+<para>This template returns the formatted list of years.</para>
+
+</refsect1></refentry>
+
+<refentry xmlns:xlink="http://www.w3.org/1999/xlink" xml:id="template.find.path.params">
+<refnamediv>
+<refname>find.path.params</refname>
+<refpurpose>Search in a table for the "best" match for the node</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+<synopsis>&lt;xsl:template name="find.path.params"&gt;
+&lt;xsl:param name="node" select="."/&gt;
+&lt;xsl:param name="table" select="''"/&gt;
+&lt;xsl:param name="location"&gt;
+ &lt;xsl:call-template name="xpath.location"&gt;
+ &lt;xsl:with-param name="node" select="$node"/&gt;
+ &lt;/xsl:call-template&gt;
+ &lt;/xsl:param&gt;
+ ...
+&lt;/xsl:template&gt;</synopsis>
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>This template searches in a table for the value that most-closely
+(in the typical best-match sense of XSLT) matches the current (element)
+node location.</para>
+
+</refsect1></refentry>
+
+<refentry xmlns:xlink="http://www.w3.org/1999/xlink" xml:id="template.string.upper">
+<refnamediv>
+<refname>string.upper</refname>
+<refpurpose>Converts a string to all uppercase letters</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+<synopsis>&lt;xsl:template name="string.upper"&gt;
+&lt;xsl:param name="string" select="''"/&gt;
+ ...
+&lt;/xsl:template&gt;</synopsis>
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>Given a string, this template does a language-aware conversion
+of that string to all uppercase letters, based on the values of the
+<literal>lowercase.alpha</literal> and
+<literal>uppercase.alpha</literal> gentext keys for the current
+locale. It affects only those characters found in the values of
+<literal>lowercase.alpha</literal> and
+<literal>uppercase.alpha</literal>. All other characters are left
+unchanged.</para>
+
+</refsect1><refsect1><title>Parameters</title>
+
+<variablelist>
+<varlistentry><term>string</term>
+<listitem>
+
+<para>The string to convert to uppercase.</para>
+
+</listitem>
+</varlistentry>
+</variablelist>
+
+</refsect1></refentry>
+
+<refentry xmlns:xlink="http://www.w3.org/1999/xlink" xml:id="template.string.lower">
+<refnamediv>
+<refname>string.lower</refname>
+<refpurpose>Converts a string to all lowercase letters</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+<synopsis>&lt;xsl:template name="string.lower"&gt;
+&lt;xsl:param name="string" select="''"/&gt;
+ ...
+&lt;/xsl:template&gt;</synopsis>
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>Given a string, this template does a language-aware conversion
+of that string to all lowercase letters, based on the values of the
+<literal>uppercase.alpha</literal> and
+<literal>lowercase.alpha</literal> gentext keys for the current
+locale. It affects only those characters found in the values of
+<literal>uppercase.alpha</literal> and
+<literal>lowercase.alpha</literal>. All other characters are left
+unchanged.</para>
+
+</refsect1><refsect1><title>Parameters</title>
+
+<variablelist>
+<varlistentry><term>string</term>
+<listitem>
+
+<para>The string to convert to lowercase.</para>
+
+</listitem>
+</varlistentry>
+</variablelist>
+
+</refsect1></refentry>
+
+<refentry xmlns:xlink="http://www.w3.org/1999/xlink" xml:id="template.select.choice.separator">
+<refnamediv>
+<refname>select.choice.separator</refname>
+<refpurpose>Returns localized choice separator</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+<synopsis>&lt;xsl:template name="select.choice.separator"/&gt;</synopsis>
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>This template enables auto-generation of an appropriate
+ localized "choice" separator (for example, "and" or "or") before
+ the final item in an inline list (though it could also be useful
+ for generating choice separators for non-inline lists).</para>
+
+
+<para>It currently works by evaluating a processing instruction
+ (PI) of the form &lt;?dbchoice choice="foo"?&gt; :
+
+<itemizedlist>
+ <listitem>
+ <simpara>if the value of the <tag>choice</tag>
+ pseudo-attribute is "and" or "or", returns a localized "and"
+ or "or"</simpara>
+ </listitem>
+ <listitem>
+ <simpara>otherwise returns the literal value of the
+ <tag>choice</tag> pseudo-attribute</simpara>
+ </listitem>
+ </itemizedlist>
+
+ The latter is provided only as a temporary workaround because the
+ locale files do not currently have translations for the word
+ <wordasword>or</wordasword>. So if you want to generate a a
+ logical "or" separator in French (for example), you currently need
+ to do this:
+ <literallayout>&lt;?dbchoice choice="ou"?&gt;</literallayout>
+ </para>
+
+ <warning>
+
+<para>The <tag>dbchoice</tag> processing instruction is
+ an unfortunate hack; support for it may disappear in the future
+ (particularly if and when a more appropriate means for marking
+ up "choice" lists becomes available in DocBook).</para>
+
+ </warning>
+ </refsect1></refentry>
+
+<refentry xmlns:xlink="http://www.w3.org/1999/xlink" xml:id="template.evaluate.info.profile">
+<refnamediv>
+<refname>evaluate.info.profile</refname>
+<refpurpose>Evaluates an info profile</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+<synopsis>&lt;xsl:template name="evaluate.info.profile"&gt;
+&lt;xsl:param name="profile"/&gt;
+&lt;xsl:param name="info"/&gt;
+ ...
+&lt;/xsl:template&gt;</synopsis>
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>This template evaluates an "info profile" matching the XPath
+ expression given by the <parameter>profile</parameter>
+ parameter. It relies on the XSLT <function>evaluate()</function>
+ extension function.</para>
+
+
+
+<para>The value of the <parameter>profile</parameter> parameter
+ can include the literal string <literal>$info</literal>. If found
+ in the value of the <parameter>profile</parameter> parameter, the
+ literal string <literal>$info</literal> string is replaced with
+ the value of the <parameter>info</parameter> parameter, which
+ should be a set of <replaceable>*info</replaceable> nodes; the
+ expression is then evaluated using the XSLT
+ <function>evaluate()</function> extension function.</para>
+
+ </refsect1><refsect1><title>Parameters</title>
+
+<variablelist>
+ <varlistentry>
+ <term>profile</term>
+ <listitem>
+
+<para>A string representing an XPath expression </para>
+
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>info</term>
+ <listitem>
+
+<para>A set of *info nodes</para>
+
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ </refsect1><refsect1><title>Returns</title>
+
+<para>Returns a node (the result of evaluating the
+ <parameter>profile</parameter> parameter)</para>
+
+ </refsect1></refentry>
+</reference>
+
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/common.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/common.xsl
new file mode 100644
index 0000000..ab8fbb0
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/common.xsl
@@ -0,0 +1,2039 @@
+<?xml version='1.0'?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:doc="http://nwalsh.com/xsl/documentation/1.0"
+ xmlns:dyn="http://exslt.org/dynamic"
+ xmlns:saxon="http://icl.com/saxon"
+ exclude-result-prefixes="doc dyn saxon"
+ version='1.0'>
+
+<!-- ********************************************************************
+ $Id: common.xsl 8784 2010-07-28 12:32:54Z mzjn $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<doc:reference xmlns="" xml:id="base">
+ <info>
+ <title>Common » Base Template Reference</title>
+ <releaseinfo role="meta">
+ $Id: common.xsl 8784 2010-07-28 12:32:54Z mzjn $
+ </releaseinfo>
+ </info>
+ <!-- * yes, partintro is a valid child of a reference... -->
+ <partintro xml:id="partintro">
+ <title>Introduction</title>
+ <para>This is technical reference documentation for the “baseâ€
+ set of common templates in the DocBook XSL Stylesheets.</para>
+ <para>This is not intended to be user documentation. It is
+ provided for developers writing customization layers for the
+ stylesheets.</para>
+ </partintro>
+</doc:reference>
+
+<!-- ==================================================================== -->
+<!-- Establish strip/preserve whitespace rules -->
+
+<xsl:preserve-space elements="*"/>
+
+<xsl:strip-space elements="
+abstract affiliation anchor answer appendix area areaset areaspec
+artheader article audiodata audioobject author authorblurb authorgroup
+beginpage bibliodiv biblioentry bibliography biblioset blockquote book
+bookbiblio bookinfo callout calloutlist caption caution chapter
+citerefentry cmdsynopsis co collab colophon colspec confgroup
+copyright dedication docinfo editor entrytbl epigraph equation
+example figure footnote footnoteref formalpara funcprototype
+funcsynopsis glossary glossdef glossdiv glossentry glosslist graphicco
+group highlights imagedata imageobject imageobjectco important index
+indexdiv indexentry indexterm info informalequation informalexample
+informalfigure informaltable inlineequation inlinemediaobject
+itemizedlist itermset keycombo keywordset legalnotice listitem lot
+mediaobject mediaobjectco menuchoice msg msgentry msgexplan msginfo
+msgmain msgrel msgset msgsub msgtext note objectinfo
+orderedlist othercredit part partintro preface printhistory procedure
+programlistingco publisher qandadiv qandaentry qandaset question
+refentry reference refmeta refnamediv refsection refsect1 refsect1info refsect2
+refsect2info refsect3 refsect3info refsynopsisdiv refsynopsisdivinfo
+revhistory revision row sbr screenco screenshot sect1 sect1info sect2
+sect2info sect3 sect3info sect4 sect4info sect5 sect5info section
+sectioninfo seglistitem segmentedlist seriesinfo set setindex setinfo
+shortcut sidebar simplelist simplesect spanspec step subject
+subjectset substeps synopfragment table tbody textobject tfoot tgroup
+thead tip toc tocchap toclevel1 toclevel2 toclevel3 toclevel4
+toclevel5 tocpart varargs variablelist varlistentry videodata
+videoobject void warning subjectset
+
+classsynopsis
+constructorsynopsis
+destructorsynopsis
+fieldsynopsis
+methodparam
+methodsynopsis
+ooclass
+ooexception
+oointerface
+simplemsgentry
+manvolnum
+"/>
+<!-- ====================================================================== -->
+
+<doc:template name="is.component" xmlns="">
+<refpurpose>Tests if a given node is a component-level element</refpurpose>
+
+<refdescription id="is.component-desc">
+<para>This template returns '1' if the specified node is a component
+(Chapter, Appendix, etc.), and '0' otherwise.</para>
+</refdescription>
+
+<refparameter id="is.component-params">
+<variablelist>
+<varlistentry><term>node</term>
+<listitem>
+<para>The node which is to be tested.</para>
+</listitem>
+</varlistentry>
+</variablelist>
+</refparameter>
+
+<refreturn id="is.component-returns">
+<para>This template returns '1' if the specified node is a component
+(Chapter, Appendix, etc.), and '0' otherwise.</para>
+</refreturn>
+</doc:template>
+
+<xsl:template name="is.component">
+ <xsl:param name="node" select="."/>
+ <xsl:choose>
+ <xsl:when test="local-name($node) = 'appendix'
+ or local-name($node) = 'article'
+ or local-name($node) = 'chapter'
+ or local-name($node) = 'preface'
+ or local-name($node) = 'bibliography'
+ or local-name($node) = 'glossary'
+ or local-name($node) = 'index'">1</xsl:when>
+ <xsl:otherwise>0</xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ====================================================================== -->
+
+<doc:template name="is.section" xmlns="">
+<refpurpose>Tests if a given node is a section-level element</refpurpose>
+
+<refdescription id="is.section-desc">
+<para>This template returns '1' if the specified node is a section
+(Section, Sect1, Sect2, etc.), and '0' otherwise.</para>
+</refdescription>
+
+<refparameter id="is.section-params">
+<variablelist>
+<varlistentry><term>node</term>
+<listitem>
+<para>The node which is to be tested.</para>
+</listitem>
+</varlistentry>
+</variablelist>
+</refparameter>
+
+<refreturn id="is.section-returns">
+<para>This template returns '1' if the specified node is a section
+(Section, Sect1, Sect2, etc.), and '0' otherwise.</para>
+</refreturn>
+</doc:template>
+
+<xsl:template name="is.section">
+ <xsl:param name="node" select="."/>
+ <xsl:choose>
+ <xsl:when test="local-name($node) = 'section'
+ or local-name($node) = 'sect1'
+ or local-name($node) = 'sect2'
+ or local-name($node) = 'sect3'
+ or local-name($node) = 'sect4'
+ or local-name($node) = 'sect5'
+ or local-name($node) = 'refsect1'
+ or local-name($node) = 'refsect2'
+ or local-name($node) = 'refsect3'
+ or local-name($node) = 'simplesect'">1</xsl:when>
+ <xsl:otherwise>0</xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ====================================================================== -->
+
+<doc:template name="section.level" xmlns="">
+<refpurpose>Returns the hierarchical level of a section</refpurpose>
+
+<refdescription id="section.level-desc">
+<para>This template calculates the hierarchical level of a section.
+The element <tag>sect1</tag> is at level 1, <tag>sect2</tag> is
+at level 2, etc.</para>
+
+<para>Recursive sections are calculated down to the fifth level.</para>
+</refdescription>
+
+<refparameter id="section.level-params">
+<variablelist>
+<varlistentry><term>node</term>
+<listitem>
+<para>The section node for which the level should be calculated.
+Defaults to the context node.</para>
+</listitem>
+</varlistentry>
+</variablelist>
+</refparameter>
+
+<refreturn id="section.level-returns">
+<para>The section level, <quote>1</quote>, <quote>2</quote>, etc.
+</para>
+</refreturn>
+</doc:template>
+
+<xsl:template name="section.level">
+ <xsl:param name="node" select="."/>
+ <xsl:choose>
+ <xsl:when test="local-name($node)='sect1'">1</xsl:when>
+ <xsl:when test="local-name($node)='sect2'">2</xsl:when>
+ <xsl:when test="local-name($node)='sect3'">3</xsl:when>
+ <xsl:when test="local-name($node)='sect4'">4</xsl:when>
+ <xsl:when test="local-name($node)='sect5'">5</xsl:when>
+ <xsl:when test="local-name($node)='section'">
+ <xsl:choose>
+ <xsl:when test="$node/../../../../../../section">6</xsl:when>
+ <xsl:when test="$node/../../../../../section">5</xsl:when>
+ <xsl:when test="$node/../../../../section">4</xsl:when>
+ <xsl:when test="$node/../../../section">3</xsl:when>
+ <xsl:when test="$node/../../section">2</xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:when test="local-name($node)='refsect1' or
+ local-name($node)='refsect2' or
+ local-name($node)='refsect3' or
+ local-name($node)='refsection' or
+ local-name($node)='refsynopsisdiv'">
+ <xsl:call-template name="refentry.section.level">
+ <xsl:with-param name="node" select="$node"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="local-name($node)='simplesect'">
+ <xsl:choose>
+ <xsl:when test="$node/../../sect1">2</xsl:when>
+ <xsl:when test="$node/../../sect2">3</xsl:when>
+ <xsl:when test="$node/../../sect3">4</xsl:when>
+ <xsl:when test="$node/../../sect4">5</xsl:when>
+ <xsl:when test="$node/../../sect5">5</xsl:when>
+ <xsl:when test="$node/../../section">
+ <xsl:choose>
+ <xsl:when test="$node/../../../../../section">5</xsl:when>
+ <xsl:when test="$node/../../../../section">4</xsl:when>
+ <xsl:when test="$node/../../../section">3</xsl:when>
+ <xsl:otherwise>2</xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+</xsl:template><!-- section.level -->
+
+<doc:template name="qanda.section.level" xmlns="">
+<refpurpose>Returns the hierarchical level of a QandASet</refpurpose>
+
+<refdescription id="qanda.section.level-desc">
+<para>This template calculates the hierarchical level of a QandASet.
+</para>
+</refdescription>
+
+<refreturn id="qanda.section.level-returns">
+<para>The level, <quote>1</quote>, <quote>2</quote>, etc.
+</para>
+</refreturn>
+</doc:template>
+
+<xsl:template name="qanda.section.level">
+ <xsl:variable name="section"
+ select="(ancestor::section
+ |ancestor::simplesect
+ |ancestor::sect5
+ |ancestor::sect4
+ |ancestor::sect3
+ |ancestor::sect2
+ |ancestor::sect1
+ |ancestor::refsect3
+ |ancestor::refsect2
+ |ancestor::refsect1)[last()]"/>
+
+ <xsl:choose>
+ <xsl:when test="count($section) = '0'">1</xsl:when>
+ <xsl:otherwise>
+ <xsl:variable name="slevel">
+ <xsl:call-template name="section.level">
+ <xsl:with-param name="node" select="$section"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:value-of select="$slevel + 1"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- Finds the total section depth of a section in a refentry -->
+<xsl:template name="refentry.section.level">
+ <xsl:param name="node" select="."/>
+
+ <xsl:variable name="RElevel">
+ <xsl:call-template name="refentry.level">
+ <xsl:with-param name="node" select="$node/ancestor::refentry[1]"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="levelinRE">
+ <xsl:choose>
+ <xsl:when test="local-name($node)='refsynopsisdiv'">1</xsl:when>
+ <xsl:when test="local-name($node)='refsect1'">1</xsl:when>
+ <xsl:when test="local-name($node)='refsect2'">2</xsl:when>
+ <xsl:when test="local-name($node)='refsect3'">3</xsl:when>
+ <xsl:when test="local-name($node)='refsection'">
+ <xsl:choose>
+ <xsl:when test="$node/../../../../../refsection">5</xsl:when>
+ <xsl:when test="$node/../../../../refsection">4</xsl:when>
+ <xsl:when test="$node/../../../refsection">3</xsl:when>
+ <xsl:when test="$node/../../refsection">2</xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:value-of select="$levelinRE + $RElevel"/>
+</xsl:template>
+
+<!-- Finds the section depth of a refentry -->
+<xsl:template name="refentry.level">
+ <xsl:param name="node" select="."/>
+ <xsl:variable name="container"
+ select="($node/ancestor::section |
+ $node/ancestor::sect1 |
+ $node/ancestor::sect2 |
+ $node/ancestor::sect3 |
+ $node/ancestor::sect4 |
+ $node/ancestor::sect5)[last()]"/>
+
+ <xsl:choose>
+ <xsl:when test="$container">
+ <xsl:variable name="slevel">
+ <xsl:call-template name="section.level">
+ <xsl:with-param name="node" select="$container"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:value-of select="$slevel + 1"/>
+ </xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="qandadiv.section.level">
+ <xsl:variable name="section.level">
+ <xsl:call-template name="qanda.section.level"/>
+ </xsl:variable>
+ <xsl:variable name="anc.divs" select="ancestor::qandadiv"/>
+
+ <xsl:value-of select="count($anc.divs) + number($section.level)"/>
+</xsl:template>
+
+<xsl:template name="question.answer.label">
+ <xsl:variable name="deflabel">
+ <xsl:choose>
+ <xsl:when test="ancestor-or-self::*[@defaultlabel]">
+ <xsl:value-of select="(ancestor-or-self::*[@defaultlabel])[last()]
+ /@defaultlabel"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$qanda.defaultlabel"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="label" select="@label"/>
+
+<!--
+ (hnr (hierarchical-number-recursive (normalize "qandadiv") node))
+
+ (parsect (ancestor-member node (section-element-list)))
+
+ (defnum (if (and %qanda-inherit-numeration%
+ %section-autolabel%)
+ (if (node-list-empty? parsect)
+ (section-autolabel-prefix node)
+ (section-autolabel parsect))
+ ""))
+
+ (hnumber (let loop ((numlist hnr) (number defnum)
+ (sep (if (equal? defnum "") "" ".")))
+ (if (null? numlist)
+ number
+ (loop (cdr numlist)
+ (string-append number
+ sep
+ (number->string (car numlist)))
+ "."))))
+ (cnumber (child-number (parent node)))
+ (number (string-append hnumber
+ (if (equal? hnumber "")
+ ""
+ ".")
+ (number->string cnumber))))
+-->
+
+ <xsl:choose>
+ <xsl:when test="$deflabel = 'qanda'">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key">
+ <xsl:choose>
+ <xsl:when test="local-name(.) = 'question'">question</xsl:when>
+ <xsl:when test="local-name(.) = 'answer'">answer</xsl:when>
+ <xsl:when test="local-name(.) = 'qandadiv'">qandadiv</xsl:when>
+ <xsl:otherwise>qandaset</xsl:otherwise>
+ </xsl:choose>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="$deflabel = 'label'">
+ <xsl:value-of select="$label"/>
+ </xsl:when>
+ <xsl:when test="$deflabel = 'number'
+ and local-name(.) = 'question'">
+ <xsl:apply-templates select="ancestor::qandaset[1]"
+ mode="number"/>
+ <xsl:choose>
+ <xsl:when test="ancestor::qandadiv">
+ <xsl:apply-templates select="ancestor::qandadiv[1]"
+ mode="number"/>
+ <xsl:apply-templates select="ancestor::qandaentry"
+ mode="number"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="ancestor::qandaentry"
+ mode="number"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <!-- nothing -->
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="qandaset" mode="number">
+ <!-- FIXME: -->
+</xsl:template>
+
+<xsl:template match="qandadiv" mode="number">
+ <xsl:number level="multiple" from="qandaset" format="1."/>
+</xsl:template>
+
+<xsl:template match="qandaentry" mode="number">
+ <xsl:choose>
+ <xsl:when test="ancestor::qandadiv">
+ <xsl:number level="single" from="qandadiv" format="1."/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:number level="single" from="qandaset" format="1."/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ====================================================================== -->
+
+<xsl:template name="object.id">
+ <xsl:param name="object" select="."/>
+ <xsl:choose>
+ <xsl:when test="$object/@id">
+ <xsl:value-of select="$object/@id"/>
+ </xsl:when>
+ <xsl:when test="$object/@xml:id">
+ <xsl:value-of select="$object/@xml:id"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="generate-id($object)"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="person.name">
+ <!-- Formats a personal name. Handles corpauthor as a special case. -->
+ <xsl:param name="node" select="."/>
+
+ <xsl:variable name="style">
+ <xsl:choose>
+ <xsl:when test="$node/@role">
+ <xsl:value-of select="$node/@role"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="gentext.template">
+ <xsl:with-param name="context" select="'styles'"/>
+ <xsl:with-param name="name" select="'person-name'"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:choose>
+ <!-- the personname element is a specialcase -->
+ <xsl:when test="$node/personname">
+ <xsl:call-template name="person.name">
+ <xsl:with-param name="node" select="$node/personname"/>
+ </xsl:call-template>
+ </xsl:when>
+
+ <!-- handle corpauthor as a special case...-->
+ <!-- * MikeSmith 2007-06: I'm wondering if the person.name template -->
+ <!-- * actually ever gets called to handle corpauthor.. maybe -->
+ <!-- * we don't actually need to check for corpauthor here. -->
+ <xsl:when test="local-name($node)='corpauthor'">
+ <xsl:apply-templates select="$node"/>
+ </xsl:when>
+
+ <xsl:otherwise>
+ <xsl:choose>
+ <!-- Handle case when personname contains only general markup (DocBook 5.0) -->
+ <xsl:when test="$node/self::personname and not($node/firstname or $node/honorific or $node/lineage or $node/othername or $node/surname)">
+ <xsl:apply-templates select="$node/node()"/>
+ </xsl:when>
+ <xsl:when test="$style = 'family-given'">
+ <xsl:call-template name="person.name.family-given">
+ <xsl:with-param name="node" select="$node"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="$style = 'last-first'">
+ <xsl:call-template name="person.name.last-first">
+ <xsl:with-param name="node" select="$node"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="person.name.first-last">
+ <xsl:with-param name="node" select="$node"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="person.name.family-given">
+ <xsl:param name="node" select="."/>
+
+ <!-- The family-given style applies a convention for identifying given -->
+ <!-- and family names in locales where it may be ambiguous -->
+ <xsl:apply-templates select="$node//surname[1]"/>
+
+ <xsl:if test="$node//surname and $node//firstname">
+ <xsl:text> </xsl:text>
+ </xsl:if>
+
+ <xsl:apply-templates select="$node//firstname[1]"/>
+
+ <xsl:text> [FAMILY Given]</xsl:text>
+</xsl:template>
+
+<xsl:template name="person.name.last-first">
+ <xsl:param name="node" select="."/>
+
+ <xsl:apply-templates select="$node//surname[1]"/>
+
+ <xsl:if test="$node//surname and $node//firstname">
+ <xsl:text>, </xsl:text>
+ </xsl:if>
+
+ <xsl:apply-templates select="$node//firstname[1]"/>
+</xsl:template>
+
+<xsl:template name="person.name.first-last">
+ <xsl:param name="node" select="."/>
+
+ <xsl:if test="$node//honorific">
+ <xsl:apply-templates select="$node//honorific[1]"/>
+ <xsl:value-of select="$punct.honorific"/>
+ </xsl:if>
+
+ <xsl:if test="$node//firstname">
+ <xsl:if test="$node//honorific">
+ <xsl:text> </xsl:text>
+ </xsl:if>
+ <xsl:apply-templates select="$node//firstname[1]"/>
+ </xsl:if>
+
+ <xsl:if test="$node//othername and $author.othername.in.middle != 0">
+ <xsl:if test="$node//honorific or $node//firstname">
+ <xsl:text> </xsl:text>
+ </xsl:if>
+ <xsl:apply-templates select="$node//othername[1]"/>
+ </xsl:if>
+
+ <xsl:if test="$node//surname">
+ <xsl:if test="$node//honorific or $node//firstname
+ or ($node//othername and $author.othername.in.middle != 0)">
+ <xsl:text> </xsl:text>
+ </xsl:if>
+ <xsl:apply-templates select="$node//surname[1]"/>
+ </xsl:if>
+
+ <xsl:if test="$node//lineage">
+ <xsl:text>, </xsl:text>
+ <xsl:apply-templates select="$node//lineage[1]"/>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template name="person.name.list">
+ <!-- Return a formatted string representation of the contents of
+ the current element. The current element must contain one or
+ more AUTHORs, CORPAUTHORs, OTHERCREDITs, and/or EDITORs.
+
+ John Doe
+ or
+ John Doe and Jane Doe
+ or
+ John Doe, Jane Doe, and A. Nonymous
+ -->
+ <xsl:param name="person.list"
+ select="author|corpauthor|othercredit|editor"/>
+ <xsl:param name="person.count" select="count($person.list)"/>
+ <xsl:param name="count" select="1"/>
+
+ <xsl:choose>
+ <xsl:when test="$count &gt; $person.count"></xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="person.name">
+ <xsl:with-param name="node" select="$person.list[position()=$count]"/>
+ </xsl:call-template>
+
+ <xsl:choose>
+ <xsl:when test="$person.count = 2 and $count = 1">
+ <xsl:call-template name="gentext.template">
+ <xsl:with-param name="context" select="'authorgroup'"/>
+ <xsl:with-param name="name" select="'sep2'"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="$person.count &gt; 2 and $count+1 = $person.count">
+ <xsl:call-template name="gentext.template">
+ <xsl:with-param name="context" select="'authorgroup'"/>
+ <xsl:with-param name="name" select="'seplast'"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="$count &lt; $person.count">
+ <xsl:call-template name="gentext.template">
+ <xsl:with-param name="context" select="'authorgroup'"/>
+ <xsl:with-param name="name" select="'sep'"/>
+ </xsl:call-template>
+ </xsl:when>
+ </xsl:choose>
+
+ <xsl:call-template name="person.name.list">
+ <xsl:with-param name="person.list" select="$person.list"/>
+ <xsl:with-param name="person.count" select="$person.count"/>
+ <xsl:with-param name="count" select="$count+1"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template><!-- person.name.list -->
+
+<!-- === synopsis ======================================================= -->
+<!-- The following definitions match those given in the reference
+ documentation for DocBook V3.0
+-->
+
+<xsl:variable name="arg.choice.opt.open.str">[</xsl:variable>
+<xsl:variable name="arg.choice.opt.close.str">]</xsl:variable>
+<xsl:variable name="arg.choice.req.open.str">{</xsl:variable>
+<xsl:variable name="arg.choice.req.close.str">}</xsl:variable>
+<xsl:variable name="arg.choice.plain.open.str"><xsl:text> </xsl:text></xsl:variable>
+<xsl:variable name="arg.choice.plain.close.str"><xsl:text> </xsl:text></xsl:variable>
+<xsl:variable name="arg.choice.def.open.str">[</xsl:variable>
+<xsl:variable name="arg.choice.def.close.str">]</xsl:variable>
+<xsl:variable name="arg.rep.repeat.str">...</xsl:variable>
+<xsl:variable name="arg.rep.norepeat.str"></xsl:variable>
+<xsl:variable name="arg.rep.def.str"></xsl:variable>
+<xsl:variable name="arg.or.sep"> | </xsl:variable>
+<xsl:variable name="cmdsynopsis.hanging.indent">4pi</xsl:variable>
+
+<!-- ====================================================================== -->
+
+<!--
+<xsl:template name="xref.g.subst">
+ <xsl:param name="string"></xsl:param>
+ <xsl:param name="target" select="."/>
+ <xsl:variable name="subst">%g</xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="contains($string, $subst)">
+ <xsl:value-of select="substring-before($string, $subst)"/>
+ <xsl:call-template name="gentext.element.name">
+ <xsl:with-param name="element.name" select="local-name($target)"/>
+ </xsl:call-template>
+ <xsl:call-template name="xref.g.subst">
+ <xsl:with-param name="string"
+ select="substring-after($string, $subst)"/>
+ <xsl:with-param name="target" select="$target"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$string"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="xref.t.subst">
+ <xsl:param name="string"></xsl:param>
+ <xsl:param name="target" select="."/>
+ <xsl:variable name="subst">%t</xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="contains($string, $subst)">
+ <xsl:call-template name="xref.g.subst">
+ <xsl:with-param name="string"
+ select="substring-before($string, $subst)"/>
+ <xsl:with-param name="target" select="$target"/>
+ </xsl:call-template>
+ <xsl:call-template name="title.xref">
+ <xsl:with-param name="target" select="$target"/>
+ </xsl:call-template>
+ <xsl:call-template name="xref.t.subst">
+ <xsl:with-param name="string"
+ select="substring-after($string, $subst)"/>
+ <xsl:with-param name="target" select="$target"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="xref.g.subst">
+ <xsl:with-param name="string" select="$string"/>
+ <xsl:with-param name="target" select="$target"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="xref.n.subst">
+ <xsl:param name="string"></xsl:param>
+ <xsl:param name="target" select="."/>
+ <xsl:variable name="subst">%n</xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="contains($string, $subst)">
+ <xsl:call-template name="xref.t.subst">
+ <xsl:with-param name="string"
+ select="substring-before($string, $subst)"/>
+ <xsl:with-param name="target" select="$target"/>
+ </xsl:call-template>
+ <xsl:call-template name="number.xref">
+ <xsl:with-param name="target" select="$target"/>
+ </xsl:call-template>
+ <xsl:call-template name="xref.t.subst">
+ <xsl:with-param name="string"
+ select="substring-after($string, $subst)"/>
+ <xsl:with-param name="target" select="$target"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="xref.t.subst">
+ <xsl:with-param name="string" select="$string"/>
+ <xsl:with-param name="target" select="$target"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="subst.xref.text">
+ <xsl:param name="xref.text"></xsl:param>
+ <xsl:param name="target" select="."/>
+
+ <xsl:call-template name="xref.n.subst">
+ <xsl:with-param name="string" select="$xref.text"/>
+ <xsl:with-param name="target" select="$target"/>
+ </xsl:call-template>
+</xsl:template>
+-->
+
+<!-- ====================================================================== -->
+
+<xsl:template name="filename-basename">
+ <!-- We assume all filenames are really URIs and use "/" -->
+ <xsl:param name="filename"></xsl:param>
+ <xsl:param name="recurse" select="false()"/>
+
+ <xsl:choose>
+ <xsl:when test="substring-after($filename, '/') != ''">
+ <xsl:call-template name="filename-basename">
+ <xsl:with-param name="filename"
+ select="substring-after($filename, '/')"/>
+ <xsl:with-param name="recurse" select="true()"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$filename"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="filename-extension">
+ <xsl:param name="filename"></xsl:param>
+ <xsl:param name="recurse" select="false()"/>
+
+ <!-- Make sure we only look at the base name... -->
+ <xsl:variable name="basefn">
+ <xsl:choose>
+ <xsl:when test="$recurse">
+ <xsl:value-of select="$filename"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="filename-basename">
+ <xsl:with-param name="filename" select="$filename"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="substring-after($basefn, '.') != ''">
+ <xsl:call-template name="filename-extension">
+ <xsl:with-param name="filename"
+ select="substring-after($basefn, '.')"/>
+ <xsl:with-param name="recurse" select="true()"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="$recurse">
+ <xsl:value-of select="$basefn"/>
+ </xsl:when>
+ <xsl:otherwise></xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ====================================================================== -->
+
+<doc:template name="select.mediaobject" xmlns="">
+<refpurpose>Selects and processes an appropriate media object from a list</refpurpose>
+
+<refdescription id="select.mediaobject-desc">
+<para>This template takes a list of media objects (usually the
+children of a mediaobject or inlinemediaobject) and processes
+the "right" object.</para>
+
+<para>This template relies on a template named
+"select.mediaobject.index" to determine which object
+in the list is appropriate.</para>
+
+<para>If no acceptable object is located, nothing happens.</para>
+</refdescription>
+
+<refparameter id="select.mediaobject-params">
+<variablelist>
+<varlistentry><term>olist</term>
+<listitem>
+<para>The node list of potential objects to examine.</para>
+</listitem>
+</varlistentry>
+</variablelist>
+</refparameter>
+
+<refreturn id="select.mediaobject-returns">
+<para>Calls &lt;xsl:apply-templates&gt; on the selected object.</para>
+</refreturn>
+</doc:template>
+
+<xsl:template name="select.mediaobject">
+ <xsl:param name="olist"
+ select="imageobject|imageobjectco
+ |videoobject|audioobject|textobject"/>
+
+ <xsl:variable name="mediaobject.index">
+ <xsl:call-template name="select.mediaobject.index">
+ <xsl:with-param name="olist" select="$olist"/>
+ <xsl:with-param name="count" select="1"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:if test="$mediaobject.index != ''">
+ <xsl:apply-templates select="$olist[position() = $mediaobject.index]"/>
+ </xsl:if>
+</xsl:template>
+
+<!-- ====================================================================== -->
+
+<doc:template name="select.mediaobject.index" xmlns="">
+<refpurpose>Selects the position of the appropriate media object from a list</refpurpose>
+
+<refdescription id="select.mediaobject.index-desc">
+<para>This template takes a list of media objects (usually the
+children of a mediaobject or inlinemediaobject) and determines
+the "right" object. It returns the position of that object
+to be used by the calling template.</para>
+
+<para>If the parameter <parameter>use.role.for.mediaobject</parameter>
+is nonzero, then it first checks for an object with
+a role attribute of the appropriate value. It takes the first
+of those. Otherwise, it takes the first acceptable object
+through a recursive pass through the list.</para>
+
+<para>This template relies on a template named "is.acceptable.mediaobject"
+to determine if a given object is an acceptable graphic. The semantics
+of media objects is that the first acceptable graphic should be used.
+</para>
+
+<para>If no acceptable object is located, no index is returned.</para>
+</refdescription>
+
+<refparameter id="select.mediaobject.index-params">
+<variablelist>
+<varlistentry><term>olist</term>
+<listitem>
+<para>The node list of potential objects to examine.</para>
+</listitem>
+</varlistentry>
+<varlistentry><term>count</term>
+<listitem>
+<para>The position in the list currently being considered by the
+recursive process.</para>
+</listitem>
+</varlistentry>
+</variablelist>
+</refparameter>
+
+<refreturn id="select.mediaobject.index-returns">
+<para>Returns the position in the original list of the selected object.</para>
+</refreturn>
+</doc:template>
+
+<xsl:template name="select.mediaobject.index">
+ <xsl:param name="olist"
+ select="imageobject|imageobjectco
+ |videoobject|audioobject|textobject"/>
+ <xsl:param name="count">1</xsl:param>
+
+ <xsl:choose>
+ <!-- Test for objects preferred by role -->
+ <xsl:when test="$use.role.for.mediaobject != 0
+ and $preferred.mediaobject.role != ''
+ and $olist[@role = $preferred.mediaobject.role]">
+
+ <!-- Get the first hit's position index -->
+ <xsl:for-each select="$olist">
+ <xsl:if test="@role = $preferred.mediaobject.role and
+ not(preceding-sibling::*[@role = $preferred.mediaobject.role])">
+ <xsl:value-of select="position()"/>
+ </xsl:if>
+ </xsl:for-each>
+ </xsl:when>
+
+ <xsl:when test="$use.role.for.mediaobject != 0
+ and $olist[@role = $stylesheet.result.type]">
+ <!-- Get the first hit's position index -->
+ <xsl:for-each select="$olist">
+ <xsl:if test="@role = $stylesheet.result.type and
+ not(preceding-sibling::*[@role = $stylesheet.result.type])">
+ <xsl:value-of select="position()"/>
+ </xsl:if>
+ </xsl:for-each>
+ </xsl:when>
+ <!-- Accept 'html' for $stylesheet.result.type = 'xhtml' -->
+ <xsl:when test="$use.role.for.mediaobject != 0
+ and $stylesheet.result.type = 'xhtml'
+ and $olist[@role = 'html']">
+ <!-- Get the first hit's position index -->
+ <xsl:for-each select="$olist">
+ <xsl:if test="@role = 'html' and
+ not(preceding-sibling::*[@role = 'html'])">
+ <xsl:value-of select="position()"/>
+ </xsl:if>
+ </xsl:for-each>
+ </xsl:when>
+
+ <!-- If no selection by role, and there is only one object, use it -->
+ <xsl:when test="count($olist) = 1 and $count = 1">
+ <xsl:value-of select="$count"/>
+ </xsl:when>
+
+ <xsl:otherwise>
+ <!-- Otherwise select first acceptable object -->
+ <xsl:if test="$count &lt;= count($olist)">
+ <xsl:variable name="object" select="$olist[position()=$count]"/>
+
+ <xsl:variable name="useobject">
+ <xsl:choose>
+ <!-- The phrase is used only when contains TeX Math and output is FO -->
+ <xsl:when test="local-name($object)='textobject' and $object/phrase
+ and $object/@role='tex' and $stylesheet.result.type = 'fo'
+ and $tex.math.in.alt != ''">
+ <xsl:text>1</xsl:text>
+ </xsl:when>
+ <!-- The phrase is never used -->
+ <xsl:when test="local-name($object)='textobject' and $object/phrase">
+ <xsl:text>0</xsl:text>
+ </xsl:when>
+ <xsl:when test="local-name($object)='textobject'
+ and $object/ancestor::equation ">
+ <!-- The first textobject is not a reasonable fallback
+ for equation image -->
+ <xsl:text>0</xsl:text>
+ </xsl:when>
+ <!-- The first textobject is a reasonable fallback -->
+ <xsl:when test="local-name($object)='textobject'
+ and $object[not(@role) or @role!='tex']">
+ <xsl:text>1</xsl:text>
+ </xsl:when>
+ <!-- don't use graphic when output is FO, TeX Math is used
+ and there is math in alt element -->
+ <xsl:when test="$object/ancestor::equation and
+ $object/ancestor::equation/alt[@role='tex']
+ and $stylesheet.result.type = 'fo'
+ and $tex.math.in.alt != ''">
+ <xsl:text>0</xsl:text>
+ </xsl:when>
+ <!-- If there's only one object, use it -->
+ <xsl:when test="$count = 1 and count($olist) = 1">
+ <xsl:text>1</xsl:text>
+ </xsl:when>
+ <!-- Otherwise, see if this one is a useable graphic -->
+ <xsl:otherwise>
+ <xsl:choose>
+ <!-- peek inside imageobjectco to simplify the test -->
+ <xsl:when test="local-name($object) = 'imageobjectco'">
+ <xsl:call-template name="is.acceptable.mediaobject">
+ <xsl:with-param name="object" select="$object/imageobject"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="is.acceptable.mediaobject">
+ <xsl:with-param name="object" select="$object"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="$useobject='1'">
+ <xsl:value-of select="$count"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="select.mediaobject.index">
+ <xsl:with-param name="olist" select="$olist"/>
+ <xsl:with-param name="count" select="$count + 1"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:if>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<doc:template name="is.acceptable.mediaobject" xmlns="">
+<refpurpose>Returns '1' if the specified media object is recognized</refpurpose>
+
+<refdescription id="is.acceptable.mediaobject-desc">
+<para>This template examines a media object and returns '1' if the
+object is recognized as a graphic.</para>
+</refdescription>
+
+<refparameter id="is.acceptable.mediaobject-params">
+<variablelist>
+<varlistentry><term>object</term>
+<listitem>
+<para>The media object to consider.</para>
+</listitem>
+</varlistentry>
+</variablelist>
+</refparameter>
+
+<refreturn id="is.acceptable.mediaobject-returns">
+<para>0 or 1</para>
+</refreturn>
+</doc:template>
+
+<xsl:template name="is.acceptable.mediaobject">
+ <xsl:param name="object"></xsl:param>
+
+ <xsl:variable name="filename">
+ <xsl:call-template name="mediaobject.filename">
+ <xsl:with-param name="object" select="$object"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="ext">
+ <xsl:call-template name="filename-extension">
+ <xsl:with-param name="filename" select="$filename"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <!-- there will only be one -->
+ <xsl:variable name="data" select="$object/videodata
+ |$object/imagedata
+ |$object/audiodata"/>
+
+ <xsl:variable name="format" select="$data/@format"/>
+
+ <xsl:variable name="graphic.format">
+ <xsl:if test="$format">
+ <xsl:call-template name="is.graphic.format">
+ <xsl:with-param name="format" select="$format"/>
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:variable>
+
+ <xsl:variable name="graphic.ext">
+ <xsl:if test="$ext">
+ <xsl:call-template name="is.graphic.extension">
+ <xsl:with-param name="ext" select="$ext"/>
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="$use.svg = 0 and $format = 'SVG'">0</xsl:when>
+ <xsl:when xmlns:svg="http://www.w3.org/2000/svg"
+ test="$use.svg != 0 and $object/svg:*">1</xsl:when>
+ <xsl:when test="$graphic.format = '1'">1</xsl:when>
+ <xsl:when test="$graphic.ext = '1'">1</xsl:when>
+ <xsl:otherwise>0</xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="mediaobject.filename">
+ <xsl:param name="object"></xsl:param>
+
+ <xsl:variable name="data" select="$object/videodata
+ |$object/imagedata
+ |$object/audiodata
+ |$object"/>
+
+ <xsl:variable name="filename">
+ <xsl:choose>
+ <xsl:when test="$data[@fileref]">
+ <xsl:apply-templates select="$data/@fileref"/>
+ </xsl:when>
+ <xsl:when test="$data[@entityref]">
+ <xsl:value-of select="unparsed-entity-uri($data/@entityref)"/>
+ </xsl:when>
+ <xsl:otherwise></xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="real.ext">
+ <xsl:call-template name="filename-extension">
+ <xsl:with-param name="filename" select="$filename"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="ext">
+ <xsl:choose>
+ <xsl:when test="$real.ext != ''">
+ <xsl:value-of select="$real.ext"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$graphic.default.extension"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="graphic.ext">
+ <xsl:call-template name="is.graphic.extension">
+ <xsl:with-param name="ext" select="$ext"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="$real.ext = ''">
+ <xsl:choose>
+ <xsl:when test="$ext != ''">
+ <xsl:value-of select="$filename"/>
+ <xsl:text>.</xsl:text>
+ <xsl:value-of select="$ext"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$filename"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:when test="not($graphic.ext)">
+ <xsl:choose>
+ <xsl:when test="$graphic.default.extension != ''">
+ <xsl:value-of select="$filename"/>
+ <xsl:text>.</xsl:text>
+ <xsl:value-of select="$graphic.default.extension"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$filename"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$filename"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ====================================================================== -->
+
+<doc:template name="check.id.unique" xmlns="">
+<refpurpose>Warn users about references to non-unique IDs</refpurpose>
+<refdescription id="check.id.unique-desc">
+<para>If passed an ID in <varname>linkend</varname>,
+<function>check.id.unique</function> prints
+a warning message to the user if either the ID does not exist or
+the ID is not unique.</para>
+</refdescription>
+</doc:template>
+
+<xsl:template name="check.id.unique">
+ <xsl:param name="linkend"></xsl:param>
+ <xsl:if test="$linkend != ''">
+ <xsl:variable name="targets" select="key('id',$linkend)"/>
+ <xsl:variable name="target" select="$targets[1]"/>
+
+ <xsl:if test="count($targets)=0">
+ <xsl:message>
+ <xsl:text>Error: no ID for constraint linkend: </xsl:text>
+ <xsl:value-of select="$linkend"/>
+ <xsl:text>.</xsl:text>
+ </xsl:message>
+ <!--
+ <xsl:message>
+ <xsl:text>If the ID exists in your document, did your </xsl:text>
+ <xsl:text>XSLT Processor load the DTD?</xsl:text>
+ </xsl:message>
+ -->
+ </xsl:if>
+
+ <xsl:if test="count($targets)>1">
+ <xsl:message>
+ <xsl:text>Warning: multiple "IDs" for constraint linkend: </xsl:text>
+ <xsl:value-of select="$linkend"/>
+ <xsl:text>.</xsl:text>
+ </xsl:message>
+ </xsl:if>
+ </xsl:if>
+</xsl:template>
+
+<doc:template name="check.idref.targets" xmlns="">
+<refpurpose>Warn users about incorrectly typed references</refpurpose>
+<refdescription id="check.idref.targets-desc">
+<para>If passed an ID in <varname>linkend</varname>,
+<function>check.idref.targets</function> makes sure that the element
+pointed to by the link is one of the elements listed in
+<varname>element-list</varname> and warns the user otherwise.</para>
+</refdescription>
+</doc:template>
+
+<xsl:template name="check.idref.targets">
+ <xsl:param name="linkend"></xsl:param>
+ <xsl:param name="element-list"></xsl:param>
+ <xsl:if test="$linkend != ''">
+ <xsl:variable name="targets" select="key('id',$linkend)"/>
+ <xsl:variable name="target" select="$targets[1]"/>
+
+ <xsl:if test="count($target) &gt; 0">
+ <xsl:if test="not(contains(concat(' ', $element-list, ' '), local-name($target)))">
+ <xsl:message>
+ <xsl:text>Error: linkend (</xsl:text>
+ <xsl:value-of select="$linkend"/>
+ <xsl:text>) points to "</xsl:text>
+ <xsl:value-of select="local-name($target)"/>
+ <xsl:text>" not (one of): </xsl:text>
+ <xsl:value-of select="$element-list"/>
+ </xsl:message>
+ </xsl:if>
+ </xsl:if>
+ </xsl:if>
+</xsl:template>
+
+<!-- ====================================================================== -->
+<!-- Procedure Step Numeration -->
+
+<xsl:param name="procedure.step.numeration.formats" select="'1aiAI'"/>
+
+<xsl:template name="procedure.step.numeration">
+ <xsl:param name="context" select="."/>
+ <xsl:variable name="format.length"
+ select="string-length($procedure.step.numeration.formats)"/>
+ <xsl:choose>
+ <xsl:when test="local-name($context) = 'substeps'">
+ <xsl:variable name="ssdepth"
+ select="count($context/ancestor::substeps)"/>
+ <xsl:variable name="sstype" select="($ssdepth mod $format.length)+2"/>
+ <xsl:choose>
+ <xsl:when test="$sstype &gt; $format.length">
+ <xsl:value-of select="substring($procedure.step.numeration.formats,1,1)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="substring($procedure.step.numeration.formats,$sstype,1)"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:when test="local-name($context) = 'step'">
+ <xsl:variable name="sdepth"
+ select="count($context/ancestor::substeps)"/>
+ <xsl:variable name="stype" select="($sdepth mod $format.length)+1"/>
+ <xsl:value-of select="substring($procedure.step.numeration.formats,$stype,1)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:message>
+ <xsl:text>Unexpected context in procedure.step.numeration: </xsl:text>
+ <xsl:value-of select="local-name($context)"/>
+ </xsl:message>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="step" mode="number">
+ <xsl:param name="rest" select="''"/>
+ <xsl:param name="recursive" select="1"/>
+ <xsl:variable name="format">
+ <xsl:call-template name="procedure.step.numeration"/>
+ </xsl:variable>
+ <xsl:variable name="num">
+ <xsl:number count="step" format="{$format}"/>
+ </xsl:variable>
+ <xsl:choose>
+ <xsl:when test="$recursive != 0 and ancestor::step">
+ <xsl:apply-templates select="ancestor::step[1]" mode="number">
+ <xsl:with-param name="rest" select="concat('.', $num, $rest)"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="concat($num, $rest)"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ====================================================================== -->
+<!-- OrderedList Numeration -->
+<xsl:template name="output-orderedlist-starting-number">
+ <xsl:param name="list"/>
+ <xsl:param name="pi-start"/>
+ <xsl:choose>
+ <xsl:when test="not($list/@continuation = 'continues')">
+ <xsl:choose>
+ <xsl:when test="$list/@startingnumber">
+ <xsl:value-of select="$list/@startingnumber"/>
+ </xsl:when>
+ <xsl:when test="$pi-start != ''">
+ <xsl:value-of select="$pi-start"/>
+ </xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:variable name="prevlist"
+ select="$list/preceding::orderedlist[1]"/>
+ <xsl:choose>
+ <xsl:when test="count($prevlist) = 0">2</xsl:when>
+ <xsl:otherwise>
+ <xsl:variable name="prevlength" select="count($prevlist/listitem)"/>
+ <xsl:variable name="prevstart">
+ <xsl:call-template name="orderedlist-starting-number">
+ <xsl:with-param name="list" select="$prevlist"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:value-of select="$prevstart + $prevlength"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="orderedlist-item-number">
+ <!-- context node must be a listitem in an orderedlist -->
+ <xsl:param name="node" select="."/>
+ <xsl:choose>
+ <xsl:when test="$node/@override">
+ <xsl:value-of select="$node/@override"/>
+ </xsl:when>
+ <xsl:when test="$node/preceding-sibling::listitem">
+ <xsl:variable name="pnum">
+ <xsl:call-template name="orderedlist-item-number">
+ <xsl:with-param name="node" select="$node/preceding-sibling::listitem[1]"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:value-of select="$pnum + 1"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="orderedlist-starting-number">
+ <xsl:with-param name="list" select="parent::*"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="next.numeration">
+ <xsl:param name="numeration" select="'default'"/>
+ <xsl:choose>
+ <!-- Change this list if you want to change the order of numerations -->
+ <xsl:when test="$numeration = 'arabic'">loweralpha</xsl:when>
+ <xsl:when test="$numeration = 'loweralpha'">lowerroman</xsl:when>
+ <xsl:when test="$numeration = 'lowerroman'">upperalpha</xsl:when>
+ <xsl:when test="$numeration = 'upperalpha'">upperroman</xsl:when>
+ <xsl:when test="$numeration = 'upperroman'">arabic</xsl:when>
+ <xsl:otherwise>arabic</xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="list.numeration">
+ <xsl:param name="node" select="."/>
+
+ <xsl:choose>
+ <xsl:when test="$node/@numeration">
+ <xsl:value-of select="$node/@numeration"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:choose>
+ <xsl:when test="$node/ancestor::orderedlist">
+ <xsl:call-template name="next.numeration">
+ <xsl:with-param name="numeration">
+ <xsl:call-template name="list.numeration">
+ <xsl:with-param name="node" select="$node/ancestor::orderedlist[1]"/>
+ </xsl:call-template>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="next.numeration"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="orderedlist/listitem" mode="item-number">
+ <xsl:variable name="numeration">
+ <xsl:call-template name="list.numeration">
+ <xsl:with-param name="node" select="parent::orderedlist"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="type">
+ <xsl:choose>
+ <xsl:when test="$numeration='arabic'">1.</xsl:when>
+ <xsl:when test="$numeration='loweralpha'">a.</xsl:when>
+ <xsl:when test="$numeration='lowerroman'">i.</xsl:when>
+ <xsl:when test="$numeration='upperalpha'">A.</xsl:when>
+ <xsl:when test="$numeration='upperroman'">I.</xsl:when>
+ <!-- What!? This should never happen -->
+ <xsl:otherwise>
+ <xsl:message>
+ <xsl:text>Unexpected numeration: </xsl:text>
+ <xsl:value-of select="$numeration"/>
+ </xsl:message>
+ <xsl:value-of select="1."/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="item-number">
+ <xsl:call-template name="orderedlist-item-number"/>
+ </xsl:variable>
+
+ <xsl:if test="parent::orderedlist/@inheritnum='inherit'
+ and ancestor::listitem[parent::orderedlist]">
+ <xsl:apply-templates select="ancestor::listitem[parent::orderedlist][1]"
+ mode="item-number"/>
+ </xsl:if>
+
+ <xsl:number value="$item-number" format="{$type}"/>
+</xsl:template>
+
+<!-- ====================================================================== -->
+<!-- ItemizedList "Numeration" -->
+
+<xsl:template name="next.itemsymbol">
+ <xsl:param name="itemsymbol" select="'default'"/>
+ <xsl:choose>
+ <!-- Change this list if you want to change the order of symbols -->
+ <xsl:when test="$itemsymbol = 'disc'">circle</xsl:when>
+ <xsl:when test="$itemsymbol = 'circle'">square</xsl:when>
+ <xsl:otherwise>disc</xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="list.itemsymbol">
+ <xsl:param name="node" select="."/>
+
+ <xsl:choose>
+ <xsl:when test="@override">
+ <xsl:value-of select="@override"/>
+ </xsl:when>
+ <xsl:when test="$node/@mark">
+ <xsl:value-of select="$node/@mark"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:choose>
+ <xsl:when test="$node/ancestor::itemizedlist">
+ <xsl:call-template name="next.itemsymbol">
+ <xsl:with-param name="itemsymbol">
+ <xsl:call-template name="list.itemsymbol">
+ <xsl:with-param name="node" select="$node/ancestor::itemizedlist[1]"/>
+ </xsl:call-template>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="next.itemsymbol"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ====================================================================== -->
+
+<doc:template name="copyright.years" xmlns="">
+<refpurpose>Print a set of years with collapsed ranges</refpurpose>
+
+<refdescription id="copyright.years-desc">
+<para>This template prints a list of year elements with consecutive
+years printed as a range. In other words:</para>
+
+<screen><![CDATA[<year>1992</year>
+<year>1993</year>
+<year>1994</year>]]></screen>
+
+<para>is printed <quote>1992-1994</quote>, whereas:</para>
+
+<screen><![CDATA[<year>1992</year>
+<year>1994</year>]]></screen>
+
+<para>is printed <quote>1992, 1994</quote>.</para>
+
+<para>This template assumes that all the year elements contain only
+decimal year numbers, that the elements are sorted in increasing
+numerical order, that there are no duplicates, and that all the years
+are expressed in full <quote>century+year</quote>
+(<quote>1999</quote> not <quote>99</quote>) notation.</para>
+</refdescription>
+
+<refparameter id="copyright.years-params">
+<variablelist>
+<varlistentry><term>years</term>
+<listitem>
+<para>The initial set of year elements.</para>
+</listitem>
+</varlistentry>
+<varlistentry><term>print.ranges</term>
+<listitem>
+<para>If non-zero, multi-year ranges are collapsed. If zero, all years
+are printed discretely.</para>
+</listitem>
+</varlistentry>
+<varlistentry><term>single.year.ranges</term>
+<listitem>
+<para>If non-zero, two consecutive years will be printed as a range,
+otherwise, they will be printed discretely. In other words, a single
+year range is <quote>1991-1992</quote> but discretely it's
+<quote>1991, 1992</quote>.</para>
+</listitem>
+</varlistentry>
+</variablelist>
+</refparameter>
+
+<refreturn id="copyright.years-returns">
+<para>This template returns the formatted list of years.</para>
+</refreturn>
+</doc:template>
+
+<xsl:template name="copyright.years">
+ <xsl:param name="years"/>
+ <xsl:param name="print.ranges" select="1"/>
+ <xsl:param name="single.year.ranges" select="0"/>
+ <xsl:param name="firstyear" select="0"/>
+ <xsl:param name="nextyear" select="0"/>
+
+ <!--
+ <xsl:message terminate="no">
+ <xsl:text>CY: </xsl:text>
+ <xsl:value-of select="count($years)"/>
+ <xsl:text>, </xsl:text>
+ <xsl:value-of select="$firstyear"/>
+ <xsl:text>, </xsl:text>
+ <xsl:value-of select="$nextyear"/>
+ <xsl:text>, </xsl:text>
+ <xsl:value-of select="$print.ranges"/>
+ <xsl:text>, </xsl:text>
+ <xsl:value-of select="$single.year.ranges"/>
+ <xsl:text> (</xsl:text>
+ <xsl:value-of select="$years[1]"/>
+ <xsl:text>)</xsl:text>
+ </xsl:message>
+ -->
+
+ <xsl:choose>
+ <xsl:when test="$print.ranges = 0 and count($years) &gt; 0">
+ <xsl:choose>
+ <xsl:when test="count($years) = 1">
+ <xsl:apply-templates select="$years[1]" mode="titlepage.mode"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="$years[1]" mode="titlepage.mode"/>
+ <xsl:text>, </xsl:text>
+ <xsl:call-template name="copyright.years">
+ <xsl:with-param name="years"
+ select="$years[position() &gt; 1]"/>
+ <xsl:with-param name="print.ranges" select="$print.ranges"/>
+ <xsl:with-param name="single.year.ranges"
+ select="$single.year.ranges"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:when test="count($years) = 0">
+ <xsl:variable name="lastyear" select="$nextyear - 1"/>
+ <xsl:choose>
+ <xsl:when test="$firstyear = 0">
+ <!-- there weren't any years at all -->
+ </xsl:when>
+ <!-- Just output a year with range in its text -->
+ <xsl:when test="contains($firstyear, '-') or contains($firstyear, ',')">
+ <xsl:value-of select="$firstyear"/>
+ </xsl:when>
+ <xsl:when test="$firstyear = $lastyear">
+ <xsl:value-of select="$firstyear"/>
+ </xsl:when>
+ <xsl:when test="$single.year.ranges = 0
+ and $lastyear = $firstyear + 1">
+ <xsl:value-of select="$firstyear"/>
+ <xsl:text>, </xsl:text>
+ <xsl:value-of select="$lastyear"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$firstyear"/>
+ <xsl:text>-</xsl:text>
+ <xsl:value-of select="$lastyear"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:when test="contains($firstyear, '-') or contains($firstyear, ',')">
+ <!-- Just output a year with range in its text -->
+ <xsl:value-of select="$firstyear"/>
+ <xsl:if test="count($years) != 0">
+ <xsl:text>, </xsl:text>
+ </xsl:if>
+ <xsl:call-template name="copyright.years">
+ <xsl:with-param name="years"
+ select="$years[position() &gt; 1]"/>
+ <xsl:with-param name="firstyear" select="$years[1]"/>
+ <xsl:with-param name="nextyear" select="$years[1] + 1"/>
+ <xsl:with-param name="print.ranges" select="$print.ranges"/>
+ <xsl:with-param name="single.year.ranges"
+ select="$single.year.ranges"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="$firstyear = 0">
+ <xsl:call-template name="copyright.years">
+ <xsl:with-param name="years"
+ select="$years[position() &gt; 1]"/>
+ <xsl:with-param name="firstyear" select="$years[1]"/>
+ <xsl:with-param name="nextyear" select="$years[1] + 1"/>
+ <xsl:with-param name="print.ranges" select="$print.ranges"/>
+ <xsl:with-param name="single.year.ranges"
+ select="$single.year.ranges"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="$nextyear = $years[1]">
+ <xsl:call-template name="copyright.years">
+ <xsl:with-param name="years"
+ select="$years[position() &gt; 1]"/>
+ <xsl:with-param name="firstyear" select="$firstyear"/>
+ <xsl:with-param name="nextyear" select="$nextyear + 1"/>
+ <xsl:with-param name="print.ranges" select="$print.ranges"/>
+ <xsl:with-param name="single.year.ranges"
+ select="$single.year.ranges"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <!-- we have years left, but they aren't in the current range -->
+ <xsl:choose>
+ <xsl:when test="$nextyear = $firstyear + 1">
+ <xsl:value-of select="$firstyear"/>
+ <xsl:text>, </xsl:text>
+ </xsl:when>
+ <xsl:when test="$single.year.ranges = 0
+ and $nextyear = $firstyear + 2">
+ <xsl:value-of select="$firstyear"/>
+ <xsl:text>, </xsl:text>
+ <xsl:value-of select="$nextyear - 1"/>
+ <xsl:text>, </xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$firstyear"/>
+ <xsl:text>-</xsl:text>
+ <xsl:value-of select="$nextyear - 1"/>
+ <xsl:text>, </xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:call-template name="copyright.years">
+ <xsl:with-param name="years"
+ select="$years[position() &gt; 1]"/>
+ <xsl:with-param name="firstyear" select="$years[1]"/>
+ <xsl:with-param name="nextyear" select="$years[1] + 1"/>
+ <xsl:with-param name="print.ranges" select="$print.ranges"/>
+ <xsl:with-param name="single.year.ranges"
+ select="$single.year.ranges"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ====================================================================== -->
+
+<doc:template name="find.path.params" xmlns="">
+<refpurpose>Search in a table for the "best" match for the node</refpurpose>
+
+<refdescription id="find.path.params-desc">
+<para>This template searches in a table for the value that most-closely
+(in the typical best-match sense of XSLT) matches the current (element)
+node location.</para>
+</refdescription>
+</doc:template>
+
+<xsl:template name="find.path.params">
+ <xsl:param name="node" select="."/>
+ <xsl:param name="table" select="''"/>
+ <xsl:param name="location">
+ <xsl:call-template name="xpath.location">
+ <xsl:with-param name="node" select="$node"/>
+ </xsl:call-template>
+ </xsl:param>
+
+ <xsl:variable name="value">
+ <xsl:call-template name="lookup.key">
+ <xsl:with-param name="key" select="$location"/>
+ <xsl:with-param name="table" select="$table"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="$value != ''">
+ <xsl:value-of select="$value"/>
+ </xsl:when>
+ <xsl:when test="contains($location, '/')">
+ <xsl:call-template name="find.path.params">
+ <xsl:with-param name="node" select="$node"/>
+ <xsl:with-param name="table" select="$table"/>
+ <xsl:with-param name="location" select="substring-after($location, '/')"/>
+ </xsl:call-template>
+ </xsl:when>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="relative-uri">
+ <xsl:param name="filename" select="."/>
+ <xsl:param name="destdir" select="''"/>
+
+ <xsl:variable name="srcurl">
+ <xsl:call-template name="strippath">
+ <xsl:with-param name="filename">
+ <xsl:call-template name="xml.base.dirs">
+ <xsl:with-param name="base.elem"
+ select="$filename/ancestor-or-self::*
+ [@xml:base != ''][1]"/>
+ </xsl:call-template>
+ <xsl:value-of select="$filename"/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="srcurl.trimmed">
+ <xsl:call-template name="trim.common.uri.paths">
+ <xsl:with-param name="uriA" select="$srcurl"/>
+ <xsl:with-param name="uriB" select="$destdir"/>
+ <xsl:with-param name="return" select="'A'"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="destdir.trimmed">
+ <xsl:call-template name="trim.common.uri.paths">
+ <xsl:with-param name="uriA" select="$srcurl"/>
+ <xsl:with-param name="uriB" select="$destdir"/>
+ <xsl:with-param name="return" select="'B'"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="depth">
+ <xsl:call-template name="count.uri.path.depth">
+ <xsl:with-param name="filename" select="$destdir.trimmed"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:call-template name="copy-string">
+ <xsl:with-param name="string" select="'../'"/>
+ <xsl:with-param name="count" select="$depth"/>
+ </xsl:call-template>
+ <xsl:value-of select="$srcurl.trimmed"/>
+
+</xsl:template>
+
+<!-- ===================================== -->
+
+<xsl:template name="xml.base.dirs">
+ <xsl:param name="base.elem" select="NONODE"/>
+
+ <!-- Recursively resolve xml:base attributes, up to a
+ full path with : in uri -->
+ <xsl:if test="$base.elem/ancestor::*[@xml:base != ''] and
+ not(contains($base.elem/@xml:base, ':'))">
+ <xsl:call-template name="xml.base.dirs">
+ <xsl:with-param name="base.elem"
+ select="$base.elem/ancestor::*[@xml:base != ''][1]"/>
+ </xsl:call-template>
+ </xsl:if>
+ <xsl:call-template name="getdir">
+ <xsl:with-param name="filename" select="$base.elem/@xml:base"/>
+ </xsl:call-template>
+
+</xsl:template>
+
+<!-- ===================================== -->
+
+<xsl:template name="strippath">
+ <xsl:param name="filename" select="''"/>
+ <xsl:choose>
+ <!-- Leading .. are not eliminated -->
+ <xsl:when test="starts-with($filename, '../')">
+ <xsl:value-of select="'../'"/>
+ <xsl:call-template name="strippath">
+ <xsl:with-param name="filename" select="substring-after($filename, '../')"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="contains($filename, '/../')">
+ <xsl:call-template name="strippath">
+ <xsl:with-param name="filename">
+ <xsl:call-template name="getdir">
+ <xsl:with-param name="filename" select="substring-before($filename, '/../')"/>
+ </xsl:call-template>
+ <xsl:value-of select="substring-after($filename, '/../')"/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$filename"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ===================================== -->
+
+<xsl:template name="getdir">
+ <xsl:param name="filename" select="''"/>
+ <xsl:if test="contains($filename, '/')">
+ <xsl:value-of select="substring-before($filename, '/')"/>
+ <xsl:text>/</xsl:text>
+ <xsl:call-template name="getdir">
+ <xsl:with-param name="filename" select="substring-after($filename, '/')"/>
+ </xsl:call-template>
+ </xsl:if>
+</xsl:template>
+
+<!-- ===================================== -->
+
+<doc:template name="string.upper" xmlns="">
+<refpurpose>Converts a string to all uppercase letters</refpurpose>
+
+<refdescription id="string.upper-desc">
+<para>Given a string, this template does a language-aware conversion
+of that string to all uppercase letters, based on the values of the
+<literal>lowercase.alpha</literal> and
+<literal>uppercase.alpha</literal> gentext keys for the current
+locale. It affects only those characters found in the values of
+<literal>lowercase.alpha</literal> and
+<literal>uppercase.alpha</literal>. All other characters are left
+unchanged.</para>
+</refdescription>
+
+<refparameter id="string.upper-params">
+<variablelist>
+<varlistentry><term>string</term>
+<listitem>
+<para>The string to convert to uppercase.</para>
+</listitem>
+</varlistentry>
+</variablelist>
+</refparameter>
+</doc:template>
+<xsl:template name="string.upper">
+ <xsl:param name="string" select="''"/>
+ <xsl:variable name="lowercase.alpha">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'lowercase.alpha'"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:variable name="uppercase.alpha">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'uppercase.alpha'"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:value-of select="translate($string,$lowercase.alpha,$uppercase.alpha)"/>
+</xsl:template>
+
+<!-- ===================================== -->
+
+<doc:template name="string.lower" xmlns="">
+<refpurpose>Converts a string to all lowercase letters</refpurpose>
+
+<refdescription id="string.lower-desc">
+<para>Given a string, this template does a language-aware conversion
+of that string to all lowercase letters, based on the values of the
+<literal>uppercase.alpha</literal> and
+<literal>lowercase.alpha</literal> gentext keys for the current
+locale. It affects only those characters found in the values of
+<literal>uppercase.alpha</literal> and
+<literal>lowercase.alpha</literal>. All other characters are left
+unchanged.</para>
+</refdescription>
+
+<refparameter id="string.lower-params">
+<variablelist>
+<varlistentry><term>string</term>
+<listitem>
+<para>The string to convert to lowercase.</para>
+</listitem>
+</varlistentry>
+</variablelist>
+</refparameter>
+</doc:template>
+<xsl:template name="string.lower">
+ <xsl:param name="string" select="''"/>
+ <xsl:variable name="uppercase.alpha">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'uppercase.alpha'"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:variable name="lowercase.alpha">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'lowercase.alpha'"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:value-of select="translate($string,$uppercase.alpha,$lowercase.alpha)"/>
+</xsl:template>
+
+<!-- ===================================== -->
+
+<doc:template name="select.choice.separator" xmlns="">
+ <refpurpose>Returns localized choice separator</refpurpose>
+ <refdescription id="select.choice.separator-desc">
+ <para>This template enables auto-generation of an appropriate
+ localized "choice" separator (for example, "and" or "or") before
+ the final item in an inline list (though it could also be useful
+ for generating choice separators for non-inline lists).</para>
+ <para>It currently works by evaluating a processing instruction
+ (PI) of the form &lt;?dbchoice&#xa0;choice="foo"?> :
+ <itemizedlist>
+ <listitem>
+ <simpara>if the value of the <tag>choice</tag>
+ pseudo-attribute is "and" or "or", returns a localized "and"
+ or "or"</simpara>
+ </listitem>
+ <listitem>
+ <simpara>otherwise returns the literal value of the
+ <tag>choice</tag> pseudo-attribute</simpara>
+ </listitem>
+ </itemizedlist>
+ The latter is provided only as a temporary workaround because the
+ locale files do not currently have translations for the word
+ <wordasword>or</wordasword>. So if you want to generate a a
+ logical "or" separator in French (for example), you currently need
+ to do this:
+ <literallayout>&lt;?dbchoice choice="ou"?></literallayout>
+ </para>
+ <warning>
+ <para>The <tag>dbchoice</tag> processing instruction is
+ an unfortunate hack; support for it may disappear in the future
+ (particularly if and when a more appropriate means for marking
+ up "choice" lists becomes available in DocBook).</para>
+ </warning>
+ </refdescription>
+</doc:template>
+<xsl:template name="select.choice.separator">
+ <xsl:variable name="choice">
+ <xsl:call-template name="pi.dbchoice_choice"/>
+ </xsl:variable>
+ <xsl:choose>
+ <!-- if value of $choice is "and" or "or", translate to equivalent in -->
+ <!-- current locale -->
+ <xsl:when test="$choice = 'and' or $choice = 'or'">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="$choice"/>
+ </xsl:call-template>
+ </xsl:when>
+ <!-- otherwise, just output value of $choice, whatever it is -->
+ <xsl:otherwise>
+ <xsl:value-of select="$choice"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ===================================== -->
+
+<doc:template name="evaluate.info.profile" xmlns="">
+ <refpurpose>Evaluates an info profile</refpurpose>
+ <refdescription id="evaluate.info.profile-desc">
+ <para>This template evaluates an "info profile" matching the XPath
+ expression given by the <parameter>profile</parameter>
+ parameter. It relies on the XSLT <function>evaluate()</function>
+ extension function.</para>
+
+ <para>The value of the <parameter>profile</parameter> parameter
+ can include the literal string <literal>$info</literal>. If found
+ in the value of the <parameter>profile</parameter> parameter, the
+ literal string <literal>$info</literal> string is replaced with
+ the value of the <parameter>info</parameter> parameter, which
+ should be a set of <replaceable>*info</replaceable> nodes; the
+ expression is then evaluated using the XSLT
+ <function>evaluate()</function> extension function.</para>
+ </refdescription>
+ <refparameter id="evaluate.info.profile-params">
+ <variablelist>
+ <varlistentry>
+ <term>profile</term>
+ <listitem>
+ <para>A string representing an XPath expression </para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>info</term>
+ <listitem>
+ <para>A set of *info nodes</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+
+ <refreturn id="evaluate.info.profile-returns">
+ <para>Returns a node (the result of evaluating the
+ <parameter>profile</parameter> parameter)</para>
+ </refreturn>
+</doc:template>
+ <xsl:template name="evaluate.info.profile">
+ <xsl:param name="profile"/>
+ <xsl:param name="info"/>
+ <xsl:choose>
+ <!-- * xsltproc and Xalan both support dyn:evaluate() -->
+ <xsl:when test="function-available('dyn:evaluate')">
+ <xsl:apply-templates
+ select="dyn:evaluate($profile)" mode="get.refentry.metadata"/>
+ </xsl:when>
+ <!-- * Saxon has its own evaluate() & doesn't support dyn:evaluate() -->
+ <xsl:when test="function-available('saxon:evaluate')">
+ <xsl:apply-templates
+ select="saxon:evaluate($profile)" mode="get.refentry.metadata"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:message terminate="yes">
+Error: The "info profiling" mechanism currently requires an XSLT
+engine that supports the evaluate() XSLT extension function. Your XSLT
+engine does not support it.
+</xsl:message>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/cs.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/cs.xml
new file mode 100644
index 0000000..b803f79
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/cs.xml
@@ -0,0 +1,700 @@
+<?xml version="1.0" encoding="utf-8"?>
+<l:l10n xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0" language="cs" english-language-name="Czech">
+
+<!-- * This file is generated automatically. -->
+<!-- * To submit changes to this file upstream (to the DocBook Project) -->
+<!-- * do not submit an edited version of this file. Instead, submit an -->
+<!-- * edited version of the source file at the following location: -->
+<!-- * -->
+<!-- * https://docbook.svn.sourceforge.net/svnroot/docbook/trunk/gentext/locale/cs.xml -->
+<!-- * -->
+<!-- * E-mail the edited cs.xml source file to: -->
+<!-- * -->
+<!-- * docbook-developers@lists.sourceforge.net -->
+
+<!-- ******************************************************************** -->
+
+<!-- This file is part of the XSL DocBook Stylesheet distribution. -->
+<!-- See ../README or http://docbook.sf.net/release/xsl/current/ for -->
+<!-- copyright and other information. -->
+
+<!-- ******************************************************************** -->
+<!-- In these files, % with a letter is used for a placeholder: -->
+<!-- %t is the current element's title -->
+<!-- %s is the current element's subtitle (if applicable)-->
+<!-- %n is the current element's number label-->
+<!-- %p is the current element's page number (if applicable)-->
+<!-- ******************************************************************** -->
+
+
+<l:gentext key="Abstract" text="Abstrakt"/>
+<l:gentext key="abstract" text="Abstrakt"/>
+<l:gentext key="Acknowledgements" text="Poděkování"/>
+<l:gentext key="acknowledgements" text="poděkování"/>
+<l:gentext key="Answer" text="OdpovÄ›Ä:"/>
+<l:gentext key="answer" text="OdpovÄ›Ä:"/>
+<l:gentext key="Appendix" text="Příloha"/>
+<l:gentext key="appendix" text="Příloha"/>
+<l:gentext key="Article" text="Článek"/>
+<l:gentext key="article" text="Článek"/>
+<l:gentext key="Author" text="Autor"/>
+<l:gentext key="Bibliography" text="Bibliografie"/>
+<l:gentext key="bibliography" text="Bibliografie"/>
+<l:gentext key="Book" text="Kniha"/>
+<l:gentext key="book" text="Kniha"/>
+<l:gentext key="CAUTION" text="Výstraha"/>
+<l:gentext key="Caution" text="Výstraha"/>
+<l:gentext key="caution" text="Výstraha"/>
+<l:gentext key="Chapter" text="Kapitola"/>
+<l:gentext key="chapter" text="Kapitola"/>
+<l:gentext key="Colophon" text="Tiráž"/>
+<l:gentext key="colophon" text="Tiráž"/>
+<l:gentext key="Copyright" text="Copyright"/>
+<l:gentext key="copyright" text="Copyright"/>
+<l:gentext key="Dedication" text="Věnování"/>
+<l:gentext key="dedication" text="Věnování"/>
+<l:gentext key="Edition" text="Vydání"/>
+<l:gentext key="edition" text="Vydání"/>
+<l:gentext key="Editor" text="Editor"/>
+<l:gentext key="Equation" text="Rovnice"/>
+<l:gentext key="equation" text="Rovnice"/>
+<l:gentext key="Example" text="Příklad"/>
+<l:gentext key="example" text="Příklad"/>
+<l:gentext key="Figure" text="Obrázek"/>
+<l:gentext key="figure" text="Obrázek"/>
+<l:gentext key="Glossary" text="Slovník"/>
+<l:gentext key="glossary" text="Slovník"/>
+<l:gentext key="GlossSee" text="Viz"/>
+<l:gentext key="glosssee" text="Viz"/>
+<l:gentext key="GlossSeeAlso" text="Viz též"/>
+<l:gentext key="glossseealso" text="Viz též"/>
+<l:gentext key="IMPORTANT" text="Důležité"/>
+<l:gentext key="important" text="Důležité"/>
+<l:gentext key="Important" text="Důležité"/>
+<l:gentext key="Index" text="Rejstřík"/>
+<l:gentext key="index" text="Rejstřík"/>
+<l:gentext key="ISBN" text="ISBN"/>
+<l:gentext key="isbn" text="ISBN"/>
+<l:gentext key="LegalNotice" text="Právní doložka"/>
+<l:gentext key="legalnotice" text="Právní doložka"/>
+<l:gentext key="MsgAud" text="Publikum"/>
+<l:gentext key="msgaud" text="Publikum"/>
+<l:gentext key="MsgLevel" text="Úroveň"/>
+<l:gentext key="msglevel" text="Úroveň"/>
+<l:gentext key="MsgOrig" text="Původ"/>
+<l:gentext key="msgorig" text="Původ"/>
+<l:gentext key="NOTE" text="Poznámka"/>
+<l:gentext key="Note" text="Poznámka"/>
+<l:gentext key="note" text="Poznámka"/>
+<l:gentext key="Part" text="Část"/>
+<l:gentext key="part" text="Část"/>
+<l:gentext key="Preface" text="Předmluva"/>
+<l:gentext key="preface" text="Předmluva"/>
+<l:gentext key="Procedure" text="Postup"/>
+<l:gentext key="procedure" text="Postup"/>
+<l:gentext key="ProductionSet" text="Produkce"/>
+<l:gentext key="PubDate" text="Datum vydání"/>
+<l:gentext key="pubdate" text="Datum vydání"/>
+<l:gentext key="Published" text="Vydáno"/>
+<l:gentext key="published" text="Vydáno"/>
+<l:gentext key="Publisher" text="Vydavatel"/>
+<l:gentext key="Qandadiv" text="Otázky a odpovědi"/>
+<l:gentext key="qandadiv" text="Otázky a odpovědi"/>
+<l:gentext key="QandASet" text="Časté dotazy"/>
+<l:gentext key="Question" text="Otázka:"/>
+<l:gentext key="question" text="Otázka:"/>
+<l:gentext key="RefEntry" text="Strana"/>
+<l:gentext key="refentry" text="strana"/>
+<l:gentext key="Reference" text="Odkaz"/>
+<l:gentext key="reference" text="Odkaz"/>
+<l:gentext key="References" text="Odkazy"/>
+<l:gentext key="RefName" text="Jméno"/>
+<l:gentext key="refname" text="Jméno"/>
+<l:gentext key="RefSection" text="Oddíl"/>
+<l:gentext key="refsection" text="oddíl"/>
+<l:gentext key="RefSynopsisDiv" text="Přehled"/>
+<l:gentext key="refsynopsisdiv" text="Přehled"/>
+<l:gentext key="RevHistory" text="Přehled revizí"/>
+<l:gentext key="revhistory" text="Přehled revizí"/>
+<l:gentext key="revision" text="Revize"/>
+<l:gentext key="Revision" text="Revize"/>
+<l:gentext key="sect1" text="Oddíl"/>
+<l:gentext key="sect2" text="Oddíl"/>
+<l:gentext key="sect3" text="Oddíl"/>
+<l:gentext key="sect4" text="Oddíl"/>
+<l:gentext key="sect5" text="Oddíl"/>
+<l:gentext key="section" text="Oddíl"/>
+<l:gentext key="Section" text="Oddíl"/>
+<l:gentext key="see" text="Viz"/>
+<l:gentext key="See" text="Viz"/>
+<l:gentext key="seealso" text="Viz též"/>
+<l:gentext key="Seealso" text="Viz též"/>
+<l:gentext key="SeeAlso" text="Viz též"/>
+<l:gentext key="set" text="Sada"/>
+<l:gentext key="Set" text="Sada"/>
+<l:gentext key="setindex" text="Rejstřík sady"/>
+<l:gentext key="SetIndex" text="Rejstřík sady"/>
+<l:gentext key="Sidebar" text="Marginálie"/>
+<l:gentext key="sidebar" text="Marginálie"/>
+<l:gentext key="step" text="krok"/>
+<l:gentext key="Step" text="Krok"/>
+<l:gentext key="table" text="Tabulka"/>
+<l:gentext key="Table" text="Tabulka"/>
+<l:gentext key="task" text="úloha"/>
+<l:gentext key="Task" text="Úloha"/>
+<l:gentext key="tip" text="Tip"/>
+<l:gentext key="TIP" text="Tip"/>
+<l:gentext key="Tip" text="Tip"/>
+<l:gentext key="Warning" text="Varování"/>
+<l:gentext key="warning" text="Varování"/>
+<l:gentext key="WARNING" text="Varování"/>
+<l:gentext key="and" text="a"/>
+<l:gentext key="by" text=""/>
+<l:gentext key="Edited" text="Vydáno"/>
+<l:gentext key="edited" text="Vydáno"/>
+<l:gentext key="Editedby" text="Sestavil"/>
+<l:gentext key="editedby" text="Sestavil"/>
+<l:gentext key="in" text="v"/>
+<l:gentext key="lastlistcomma" text=""/>
+<l:gentext key="listcomma" text=","/>
+<l:gentext key="notes" text="Poznámky"/>
+<l:gentext key="Notes" text="Poznámky"/>
+<l:gentext key="Pgs" text="Str."/>
+<l:gentext key="pgs" text="Str."/>
+<l:gentext key="Revisedby" text="Revidoval: "/>
+<l:gentext key="revisedby" text="Revidoval: "/>
+<l:gentext key="TableNotes" text="Poznámky"/>
+<l:gentext key="tablenotes" text="Poznámky"/>
+<l:gentext key="TableofContents" text="Obsah"/>
+<l:gentext key="tableofcontents" text="Obsah"/>
+<l:gentext key="unexpectedelementname" text="NeoÄekávané jméno prvku"/>
+<l:gentext key="unsupported" text="nepodporovaný"/>
+<l:gentext key="xrefto" text="xref k"/>
+<l:gentext key="Authors" text="Autoři"/>
+<l:gentext key="copyeditor" text="Korektor"/>
+<l:gentext key="graphicdesigner" text="Grafický designér"/>
+<l:gentext key="productioneditor" text="Produkce"/>
+<l:gentext key="technicaleditor" text="Technický editor"/>
+<l:gentext key="translator" text="Překladatel"/>
+<l:gentext key="listofequations" text="Seznam rovnic"/>
+<l:gentext key="ListofEquations" text="Seznam rovnic"/>
+<l:gentext key="ListofExamples" text="Seznam příkladů"/>
+<l:gentext key="listofexamples" text="Seznam příkladů"/>
+<l:gentext key="ListofFigures" text="Seznam obrázků"/>
+<l:gentext key="listoffigures" text="Seznam obrázků"/>
+<l:gentext key="ListofProcedures" text="Seznam postupů"/>
+<l:gentext key="listofprocedures" text="Seznam postupů"/>
+<l:gentext key="listoftables" text="Seznam tabulek"/>
+<l:gentext key="ListofTables" text="Seznam tabulek"/>
+<l:gentext key="ListofUnknown" text="Seznam neznámého"/>
+<l:gentext key="listofunknown" text="Seznam neznámého"/>
+<l:gentext key="nav-home" text="Domů"/>
+<l:gentext key="nav-next" text="Další"/>
+<l:gentext key="nav-next-sibling" text="Rychle dopředu"/>
+<l:gentext key="nav-prev" text="Předcházející"/>
+<l:gentext key="nav-prev-sibling" text="Rychle zpět"/>
+<l:gentext key="nav-up" text="Nahoru"/>
+<l:gentext key="nav-toc" text="Obsah"/>
+<l:gentext key="Draft" text="Návrh"/>
+<l:gentext key="above" text="nad"/>
+<l:gentext key="below" text="pod"/>
+<l:gentext key="sectioncalled" text="oddíl nazvaný"/>
+<l:gentext key="index symbols" text="Symboly"/>
+<l:gentext key="writing-mode" text="lr-tb"/>
+<l:gentext key="lowercase.alpha" text="aábcÄdÄeéěfghiíjklmnňoópqrÅ™sÅ¡tÅ¥uúůvwxyýzž"/>
+<l:gentext key="uppercase.alpha" text="AÃBCÄŒDÄŽEÉĚFGHIÃJKLMNŇOÓPQRŘSÅ TŤUÚŮVWXYÃZŽ"/>
+<l:gentext key="normalize.sort.input" text="aábcÄdÄeéěfghiíjklmnňoópqrÅ™sÅ¡tÅ¥uúůvwxyýzž"/>
+<l:gentext key="normalize.sort.output" text="AÃBCÄŒDÄŽEÉĚFGHIÃJKLMNŇOÓPQRŘSÅ TŤUÚŮVWXYÃZŽ"/>
+<l:dingbat key="startquote" text="„"/>
+<l:dingbat key="endquote" text="“"/>
+<l:dingbat key="nestedstartquote" text="‚"/>
+<l:dingbat key="nestedendquote" text="‘"/>
+<l:dingbat key="singlestartquote" text="‚"/>
+<l:dingbat key="singleendquote" text="‘"/>
+<l:dingbat key="bullet" text="•"/>
+<l:gentext key="hyphenation-character" text="-" lang="en"/>
+<l:gentext key="hyphenation-push-character-count" text="2" lang="en"/>
+<l:gentext key="hyphenation-remain-character-count" text="2" lang="en"/>
+<l:context name="styles"><l:template name="person-name" text="first-last"/>
+</l:context>
+<l:context name="title"><l:template name="abstract" text="%t"/>
+<l:template name="acknowledgements" text="%t" lang="en"/>
+<l:template name="answer" text="%t"/>
+<l:template name="appendix" text="Příloha %n. %t"/>
+<l:template name="article" text="%t"/>
+<l:template name="authorblurb" text="%t"/>
+<l:template name="bibliodiv" text="%t"/>
+<l:template name="biblioentry" text="%t"/>
+<l:template name="bibliography" text="%t"/>
+<l:template name="bibliolist" text="%t" lang="en"/>
+<l:template name="bibliomixed" text="%t"/>
+<l:template name="bibliomset" text="%t"/>
+<l:template name="biblioset" text="%t"/>
+<l:template name="blockquote" text="%t"/>
+<l:template name="book" text="%t"/>
+<l:template name="calloutlist" text="%t"/>
+<l:template name="caution" text="%t"/>
+<l:template name="chapter" text="Kapitola %n. %t"/>
+<l:template name="colophon" text="%t"/>
+<l:template name="dedication" text="%t"/>
+<l:template name="equation" text="Rovnice %n. %t"/>
+<l:template name="example" text="Příklad %n. %t"/>
+<l:template name="figure" text="Obrázek %n. %t"/>
+<l:template name="foil" text="%t" lang="en"/>
+<l:template name="foilgroup" text="%t" lang="en"/>
+<l:template name="formalpara" text="%t"/>
+<l:template name="glossary" text="%t"/>
+<l:template name="glossdiv" text="%t"/>
+<l:template name="glosslist" text="%t" lang="en"/>
+<l:template name="glossentry" text="%t" lang="en"/>
+<l:template name="important" text="%t"/>
+<l:template name="index" text="%t"/>
+<l:template name="indexdiv" text="%t"/>
+<l:template name="itemizedlist" text="%t"/>
+<l:template name="legalnotice" text="%t"/>
+<l:template name="listitem" text=""/>
+<l:template name="lot" text="%t"/>
+<l:template name="msg" text="%t"/>
+<l:template name="msgexplan" text="%t"/>
+<l:template name="msgmain" text="%t"/>
+<l:template name="msgrel" text="%t"/>
+<l:template name="msgset" text="%t"/>
+<l:template name="msgsub" text="%t"/>
+<l:template name="note" text="%t"/>
+<l:template name="orderedlist" text="%t"/>
+<l:template name="part" text="Část %n. %t"/>
+<l:template name="partintro" text="%t"/>
+<l:template name="preface" text="%t"/>
+<l:template name="procedure" text="%t"/>
+<l:template name="procedure.formal" text="Postup %n. %t"/>
+<l:template name="productionset" text="%t"/>
+<l:template name="productionset.formal" text="Produkce %n"/>
+<l:template name="qandadiv" text="%t"/>
+<l:template name="qandaentry" text="%t"/>
+<l:template name="qandaset" text="%t"/>
+<l:template name="question" text="%t"/>
+<l:template name="refentry" text="%t"/>
+<l:template name="reference" text="%t"/>
+<l:template name="refsection" text="%t"/>
+<l:template name="refsect1" text="%t"/>
+<l:template name="refsect2" text="%t"/>
+<l:template name="refsect3" text="%t"/>
+<l:template name="refsynopsisdiv" text="%t"/>
+<l:template name="refsynopsisdivinfo" text="%t"/>
+<l:template name="segmentedlist" text="%t"/>
+<l:template name="set" text="%t"/>
+<l:template name="setindex" text="%t"/>
+<l:template name="sidebar" text="%t"/>
+<l:template name="step" text="%t"/>
+<l:template name="table" text="Tabulka %n. %t"/>
+<l:template name="task" text="%t" lang="en"/>
+<l:template name="tasksummary" text="%t" lang="en"/>
+<l:template name="taskprerequisites" text="%t" lang="en"/>
+<l:template name="taskrelated" text="%t" lang="en"/>
+<l:template name="tip" text="%t"/>
+<l:template name="toc" text="%t"/>
+<l:template name="variablelist" text="%t"/>
+<l:template name="varlistentry" text=""/>
+<l:template name="warning" text="%t"/>
+</l:context>
+<l:context name="title-unnumbered"><l:template name="appendix" text="%t"/>
+<l:template name="article/appendix" text="%t" lang="en"/>
+<l:template name="bridgehead" text="%t"/>
+<l:template name="chapter" text="%t"/>
+<l:template name="sect1" text="%t"/>
+<l:template name="sect2" text="%t"/>
+<l:template name="sect3" text="%t"/>
+<l:template name="sect4" text="%t"/>
+<l:template name="sect5" text="%t"/>
+<l:template name="section" text="%t"/>
+<l:template name="simplesect" text="%t"/>
+<l:template name="part" text="%t" lang="en"/>
+</l:context>
+<l:context name="title-numbered"><l:template name="appendix" text="Příloha %n. %t"/>
+<l:template name="article/appendix" text="%n. %t" lang="en"/>
+<l:template name="bridgehead" text="%n. %t"/>
+<l:template name="chapter" text="Kapitola %n. %t"/>
+<l:template name="part" text="Část %n. %t"/>
+<l:template name="sect1" text="%n. %t"/>
+<l:template name="sect2" text="%n. %t"/>
+<l:template name="sect3" text="%n. %t"/>
+<l:template name="sect4" text="%n. %t"/>
+<l:template name="sect5" text="%n. %t"/>
+<l:template name="section" text="%n. %t"/>
+<l:template name="simplesect" text="%n. %t"/>
+</l:context>
+<l:context name="subtitle"><l:template name="appendix" text="%s"/>
+<l:template name="acknowledgements" text="%s" lang="en"/>
+<l:template name="article" text="%s"/>
+<l:template name="bibliodiv" text="%s"/>
+<l:template name="biblioentry" text="%s"/>
+<l:template name="bibliography" text="%s"/>
+<l:template name="bibliomixed" text="%s"/>
+<l:template name="bibliomset" text="%s"/>
+<l:template name="biblioset" text="%s"/>
+<l:template name="book" text="%s"/>
+<l:template name="chapter" text="%s"/>
+<l:template name="colophon" text="%s"/>
+<l:template name="dedication" text="%s"/>
+<l:template name="glossary" text="%s"/>
+<l:template name="glossdiv" text="%s"/>
+<l:template name="index" text="%s"/>
+<l:template name="indexdiv" text="%s"/>
+<l:template name="lot" text="%s"/>
+<l:template name="part" text="%s"/>
+<l:template name="partintro" text="%s"/>
+<l:template name="preface" text="%s"/>
+<l:template name="refentry" text="%s"/>
+<l:template name="reference" text="%s"/>
+<l:template name="refsection" text="%s"/>
+<l:template name="refsect1" text="%s"/>
+<l:template name="refsect2" text="%s"/>
+<l:template name="refsect3" text="%s"/>
+<l:template name="refsynopsisdiv" text="%s"/>
+<l:template name="sect1" text="%s"/>
+<l:template name="sect2" text="%s"/>
+<l:template name="sect3" text="%s"/>
+<l:template name="sect4" text="%s"/>
+<l:template name="sect5" text="%s"/>
+<l:template name="section" text="%s"/>
+<l:template name="set" text="%s"/>
+<l:template name="setindex" text="%s"/>
+<l:template name="sidebar" text="%s"/>
+<l:template name="simplesect" text="%s"/>
+<l:template name="toc" text="%s"/>
+</l:context>
+<l:context name="xref"><l:template name="abstract" text="%t"/>
+<l:template name="acknowledgements" text="%t" lang="en"/>
+<l:template name="answer" text="%n"/>
+<l:template name="appendix" text="%t"/>
+<l:template name="article" text="%t"/>
+<l:template name="authorblurb" text="%t"/>
+<l:template name="bibliodiv" text="%t"/>
+<l:template name="bibliography" text="%t"/>
+<l:template name="bibliomset" text="%t"/>
+<l:template name="biblioset" text="%t"/>
+<l:template name="blockquote" text="%t"/>
+<l:template name="book" text="%t"/>
+<l:template name="calloutlist" text="%t"/>
+<l:template name="caution" text="%t"/>
+<l:template name="chapter" text="%t"/>
+<l:template name="colophon" text="%t"/>
+<l:template name="constraintdef" text="%t"/>
+<l:template name="dedication" text="%t"/>
+<l:template name="equation" text="%t"/>
+<l:template name="example" text="%t"/>
+<l:template name="figure" text="%t"/>
+<l:template name="foil" text="%t" lang="en"/>
+<l:template name="foilgroup" text="%t" lang="en"/>
+<l:template name="formalpara" text="%t"/>
+<l:template name="glossary" text="%t"/>
+<l:template name="glossdiv" text="%t"/>
+<l:template name="important" text="%t"/>
+<l:template name="index" text="%t"/>
+<l:template name="indexdiv" text="%t"/>
+<l:template name="itemizedlist" text="%t"/>
+<l:template name="legalnotice" text="%t"/>
+<l:template name="listitem" text="%n"/>
+<l:template name="lot" text="%t"/>
+<l:template name="msg" text="%t"/>
+<l:template name="msgexplan" text="%t"/>
+<l:template name="msgmain" text="%t"/>
+<l:template name="msgrel" text="%t"/>
+<l:template name="msgset" text="%t"/>
+<l:template name="msgsub" text="%t"/>
+<l:template name="note" text="%t"/>
+<l:template name="orderedlist" text="%t"/>
+<l:template name="part" text="%t"/>
+<l:template name="partintro" text="%t"/>
+<l:template name="preface" text="%t"/>
+<l:template name="procedure" text="%t"/>
+<l:template name="productionset" text="%t"/>
+<l:template name="qandadiv" text="%t"/>
+<l:template name="qandaentry" text="%n"/>
+<l:template name="qandaset" text="%t"/>
+<l:template name="question" text="%n"/>
+<l:template name="reference" text="%t"/>
+<l:template name="refsynopsisdiv" text="%t"/>
+<l:template name="segmentedlist" text="%t"/>
+<l:template name="set" text="%t"/>
+<l:template name="setindex" text="%t"/>
+<l:template name="sidebar" text="%t"/>
+<l:template name="table" text="%t"/>
+<l:template name="task" text="%t" lang="en"/>
+<l:template name="tip" text="%t"/>
+<l:template name="toc" text="%t"/>
+<l:template name="variablelist" text="%t"/>
+<l:template name="varlistentry" text="%n"/>
+<l:template name="warning" text="%t"/>
+<l:template name="olink.document.citation" text="v %o"/>
+<l:template name="olink.page.citation" text=" (strana %p)"/>
+<l:template name="page.citation" text=" [%p]"/>
+<l:template name="page" text="(strana %p)"/>
+<l:template name="docname" text=" v %o"/>
+<l:template name="docnamelong" text=" v dokumentu nazvaném %o"/>
+<l:template name="pageabbrev" text="(str. %p)"/>
+<l:template name="Page" text="Strana %p"/>
+<l:template name="bridgehead" text="„%t“"/>
+<l:template name="refsection" text="„%t“"/>
+<l:template name="refsect1" text="„%t“"/>
+<l:template name="refsect2" text="„%t“"/>
+<l:template name="refsect3" text="„%t“"/>
+<l:template name="sect1" text="„%t“"/>
+<l:template name="sect2" text="„%t“"/>
+<l:template name="sect3" text="„%t“"/>
+<l:template name="sect4" text="„%t“"/>
+<l:template name="sect5" text="„%t“"/>
+<l:template name="section" text="„%t“"/>
+<l:template name="simplesect" text="„%t“"/>
+</l:context>
+<l:context name="xref-number"><l:template name="answer" text="%n"/>
+<l:template name="appendix" text="%n"/>
+<l:template name="bridgehead" text="%n"/>
+<l:template name="chapter" text="%n"/>
+<l:template name="equation" text="%n"/>
+<l:template name="example" text="%n"/>
+<l:template name="figure" text="%n"/>
+<l:template name="part" text="%n"/>
+<l:template name="procedure" text="%n"/>
+<l:template name="productionset" text="%n"/>
+<l:template name="qandadiv" text="%n"/>
+<l:template name="qandaentry" text="%n"/>
+<l:template name="question" text="%n"/>
+<l:template name="sect1" text="%n"/>
+<l:template name="sect2" text="%n"/>
+<l:template name="sect3" text="%n"/>
+<l:template name="sect4" text="%n"/>
+<l:template name="sect5" text="%n"/>
+<l:template name="section" text="%n"/>
+<l:template name="table" text="%n"/>
+</l:context>
+<l:context name="xref-number-and-title"><l:template name="appendix" text="%n – „%t“"/>
+<l:template name="bridgehead" text="%n – „%t“"/>
+<l:template name="chapter" text="%n – „%t“"/>
+<l:template name="equation" text="%n – „%t“"/>
+<l:template name="example" text="%n – „%t“"/>
+<l:template name="figure" text="%n – „%t“"/>
+<l:template name="part" text="%n – „%t“"/>
+<l:template name="procedure" text="%n – „%t“"/>
+<l:template name="productionset" text="%n – „%t“"/>
+<l:template name="qandadiv" text="%n – „%t“"/>
+<l:template name="refsect1" text="„%t“"/>
+<l:template name="refsect2" text="„%t“"/>
+<l:template name="refsect3" text="„%t“"/>
+<l:template name="refsection" text="„%t“"/>
+<l:template name="sect1" text="%n – „%t“"/>
+<l:template name="sect2" text="%n – „%t“"/>
+<l:template name="sect3" text="%n – „%t“"/>
+<l:template name="sect4" text="%n – „%t“"/>
+<l:template name="sect5" text="%n – „%t“"/>
+<l:template name="section" text="%n – „%t“"/>
+<l:template name="simplesect" text="%n – „%t“"/>
+<l:template name="table" text="%n – „%t“"/>
+</l:context>
+<l:context name="authorgroup"><l:template name="sep" text=", "/>
+<l:template name="sep2" text=" a "/>
+<l:template name="seplast" text=" a "/>
+</l:context>
+<l:context name="glossary"><l:template name="see" text="Viz %t."/>
+<l:template name="seealso" text="Viz též %t."/>
+<l:template name="seealso-separator" text=", "/>
+</l:context>
+<l:context name="msgset"><l:template name="MsgAud" text="Publikum: "/>
+<l:template name="MsgLevel" text="Úroveň: "/>
+<l:template name="MsgOrig" text="Původ: "/>
+</l:context>
+<l:context name="datetime"><l:template name="format" text="d. B Y"/>
+</l:context>
+<l:context name="termdef"><l:template name="prefix" text="[Definice: "/>
+<l:template name="suffix" text="]"/>
+</l:context>
+<l:context name="datetime-full"><l:template name="January" text="ledna"/>
+<l:template name="February" text="února"/>
+<l:template name="March" text="března"/>
+<l:template name="April" text="dubna"/>
+<l:template name="May" text="května"/>
+<l:template name="June" text="Äervna"/>
+<l:template name="July" text="Äervence"/>
+<l:template name="August" text="srpna"/>
+<l:template name="September" text="září"/>
+<l:template name="October" text="října"/>
+<l:template name="November" text="listopadu"/>
+<l:template name="December" text="prosince"/>
+<l:template name="Monday" text="pondělí"/>
+<l:template name="Tuesday" text="úterý"/>
+<l:template name="Wednesday" text="středa"/>
+<l:template name="Thursday" text="Ätvrtek"/>
+<l:template name="Friday" text="pátek"/>
+<l:template name="Saturday" text="sobota"/>
+<l:template name="Sunday" text="neděle"/>
+</l:context>
+<l:context name="datetime-abbrev"><l:template name="Jan" text="led"/>
+<l:template name="Feb" text="úno"/>
+<l:template name="Mar" text="bře"/>
+<l:template name="Apr" text="dub"/>
+<l:template name="May" text="kvÄ›"/>
+<l:template name="Jun" text="Äer"/>
+<l:template name="Jul" text="Änc"/>
+<l:template name="Aug" text="srp"/>
+<l:template name="Sep" text="zář"/>
+<l:template name="Oct" text="řij"/>
+<l:template name="Nov" text="lis"/>
+<l:template name="Dec" text="pro"/>
+<l:template name="Mon" text="po"/>
+<l:template name="Tue" text="út"/>
+<l:template name="Wed" text="st"/>
+<l:template name="Thu" text="Ät"/>
+<l:template name="Fri" text="pá"/>
+<l:template name="Sat" text="so"/>
+<l:template name="Sun" text="ne"/>
+</l:context>
+<l:context name="htmlhelp"><l:template name="langcode" text="0x0405 Czech"/>
+</l:context>
+<l:context name="index"><l:template name="term-separator" text=", " lang="en"/>
+<l:template name="number-separator" text=", " lang="en"/>
+<l:template name="range-separator" text="-" lang="en"/>
+</l:context>
+<l:context name="iso690"><l:template name="lastfirst.sep" text=", "/>
+<l:template name="alt.person.two.sep" text=" – "/>
+<l:template name="alt.person.last.sep" text=" – "/>
+<l:template name="alt.person.more.sep" text=" – "/>
+<l:template name="primary.editor" text=" (ed.)"/>
+<l:template name="primary.many" text=", et al."/>
+<l:template name="primary.sep" text=". "/>
+<l:template name="submaintitle.sep" text=": "/>
+<l:template name="title.sep" text=". "/>
+<l:template name="othertitle.sep" text=", "/>
+<l:template name="medium1" text=" ["/>
+<l:template name="medium2" text="]"/>
+<l:template name="secondary.person.sep" text="; "/>
+<l:template name="secondary.sep" text=". "/>
+<l:template name="respons.sep" text=". "/>
+<l:template name="edition.sep" text=". "/>
+<l:template name="edition.serial.sep" text=", "/>
+<l:template name="issuing.range" text="-"/>
+<l:template name="issuing.div" text=", "/>
+<l:template name="issuing.sep" text=". "/>
+<l:template name="partnr.sep" text=". "/>
+<l:template name="placepubl.sep" text=": "/>
+<l:template name="publyear.sep" text=", "/>
+<l:template name="pubinfo.sep" text=". "/>
+<l:template name="spec.pubinfo.sep" text=", "/>
+<l:template name="upd.sep" text=", "/>
+<l:template name="datecit1" text=" [cit. "/>
+<l:template name="datecit2" text="]"/>
+<l:template name="extent.sep" text=". "/>
+<l:template name="locs.sep" text=", "/>
+<l:template name="location.sep" text=". "/>
+<l:template name="serie.sep" text=". "/>
+<l:template name="notice.sep" text=". "/>
+<l:template name="access" text="Dostupné "/>
+<l:template name="acctoo" text="Dostupné také "/>
+<l:template name="onwww" text="na World Wide Web"/>
+<l:template name="oninet" text="na Internetu"/>
+<l:template name="access.end" text=": "/>
+<l:template name="link1" text="&lt;"/>
+<l:template name="link2" text="&gt;"/>
+<l:template name="access.sep" text=". "/>
+<l:template name="isbn" text="ISBN "/>
+<l:template name="issn" text="ISSN "/>
+<l:template name="stdnum.sep" text=". "/>
+<l:template name="patcountry.sep" text=". "/>
+<l:template name="pattype.sep" text=", "/>
+<l:template name="patnum.sep" text=". "/>
+<l:template name="patdate.sep" text=". "/>
+</l:context><l:letters><l:l i="-1"/>
+<l:l i="0">Symboly</l:l>
+<l:l i="1">A</l:l>
+<l:l i="1">a</l:l>
+<l:l i="1">Ã</l:l>
+<l:l i="1">á</l:l>
+<l:l i="2">B</l:l>
+<l:l i="2">b</l:l>
+<l:l i="3">C</l:l>
+<l:l i="3">c</l:l>
+<l:l i="4">Č</l:l>
+<l:l i="4">Ä</l:l>
+<l:l i="5">D</l:l>
+<l:l i="5">d</l:l>
+<l:l i="5">ÄŽ</l:l>
+<l:l i="5">Ä</l:l>
+<l:l i="7">E</l:l>
+<l:l i="7">e</l:l>
+<l:l i="7">É</l:l>
+<l:l i="7">é</l:l>
+<l:l i="7">Äš</l:l>
+<l:l i="7">Ä›</l:l>
+<l:l i="7">Ë</l:l>
+<l:l i="7">ë</l:l>
+<l:l i="8">F</l:l>
+<l:l i="8">f</l:l>
+<l:l i="9">G</l:l>
+<l:l i="9">g</l:l>
+<l:l i="10">H</l:l>
+<l:l i="10">h</l:l>
+<l:l i="11">Ch</l:l>
+<l:l i="11">ch</l:l>
+<l:l i="11">cH</l:l>
+<l:l i="11">CH</l:l>
+<l:l i="12">I</l:l>
+<l:l i="12">i</l:l>
+<l:l i="12">Ã</l:l>
+<l:l i="12">í</l:l>
+<l:l i="13">J</l:l>
+<l:l i="13">j</l:l>
+<l:l i="14">K</l:l>
+<l:l i="14">k</l:l>
+<l:l i="15">L</l:l>
+<l:l i="15">l</l:l>
+<l:l i="16">M</l:l>
+<l:l i="16">m</l:l>
+<l:l i="17">N</l:l>
+<l:l i="17">n</l:l>
+<l:l i="17">Ň</l:l>
+<l:l i="17">ň</l:l>
+<l:l i="19">O</l:l>
+<l:l i="19">o</l:l>
+<l:l i="19">Ó</l:l>
+<l:l i="19">ó</l:l>
+<l:l i="19">Ö</l:l>
+<l:l i="19">ö</l:l>
+<l:l i="20">P</l:l>
+<l:l i="20">p</l:l>
+<l:l i="21">Q</l:l>
+<l:l i="21">q</l:l>
+<l:l i="22">R</l:l>
+<l:l i="22">r</l:l>
+<l:l i="23">Ř</l:l>
+<l:l i="23">Å™</l:l>
+<l:l i="24">S</l:l>
+<l:l i="24">s</l:l>
+<l:l i="25">Å </l:l>
+<l:l i="25">Å¡</l:l>
+<l:l i="26">T</l:l>
+<l:l i="26">t</l:l>
+<l:l i="26">Ť</l:l>
+<l:l i="26">Å¥</l:l>
+<l:l i="28">U</l:l>
+<l:l i="28">u</l:l>
+<l:l i="28">Ú</l:l>
+<l:l i="28">ú</l:l>
+<l:l i="28">Å®</l:l>
+<l:l i="28">ů</l:l>
+<l:l i="28">Ü</l:l>
+<l:l i="28">ü</l:l>
+<l:l i="29">V</l:l>
+<l:l i="29">v</l:l>
+<l:l i="30">W</l:l>
+<l:l i="30">w</l:l>
+<l:l i="31">X</l:l>
+<l:l i="31">x</l:l>
+<l:l i="32">Y</l:l>
+<l:l i="32">y</l:l>
+<l:l i="32">Ã</l:l>
+<l:l i="32">ý</l:l>
+<l:l i="33">Z</l:l>
+<l:l i="33">z</l:l>
+<l:l i="34">Ž</l:l>
+<l:l i="34">ž</l:l>
+</l:letters>
+</l:l10n>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/cy.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/cy.xml
new file mode 100644
index 0000000..bc0f08a
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/cy.xml
@@ -0,0 +1,1245 @@
+<?xml version="1.0" encoding="utf-8"?>
+<l:l10n xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0" language="cy" english-language-name="Welsh">
+
+<!-- * This file is generated automatically. -->
+<!-- * To submit changes to this file upstream (to the DocBook Project) -->
+<!-- * do not submit an edited version of this file. Instead, submit an -->
+<!-- * edited version of the source file at the following location: -->
+<!-- * -->
+<!-- * https://docbook.svn.sourceforge.net/svnroot/docbook/trunk/gentext/locale/cy.xml -->
+<!-- * -->
+<!-- * E-mail the edited cy.xml source file to: -->
+<!-- * -->
+<!-- * docbook-developers@lists.sourceforge.net -->
+
+<!-- ******************************************************************** -->
+
+<!-- This file is part of the XSL DocBook Stylesheet distribution. -->
+<!-- See ../README or http://docbook.sf.net/release/xsl/current/ for -->
+<!-- copyright and other information. -->
+
+<!-- ******************************************************************** -->
+<!-- In these files, % with a letter is used for a placeholder: -->
+<!-- %t is the current element's title -->
+<!-- %s is the current element's subtitle (if applicable)-->
+<!-- %n is the current element's number label-->
+<!-- %p is the current element's page number (if applicable)-->
+<!-- ******************************************************************** -->
+
+
+<l:gentext key="Abstract" text="Crynodeb"/>
+<l:gentext key="abstract" text="Crynodeb"/>
+<l:gentext key="Acknowledgements" text="Acknowledgements" lang="en"/>
+<l:gentext key="acknowledgements" text="Acknowledgements" lang="en"/>
+<l:gentext key="Answer" text="A:"/>
+<l:gentext key="answer" text="A:"/>
+<l:gentext key="Appendix" text="Atodiad"/>
+<l:gentext key="appendix" text="Atodiad"/>
+<l:gentext key="Article" text="Erthygl"/>
+<l:gentext key="article" text="Erthygl"/>
+<l:gentext key="Author" text="Awdur"/>
+<l:gentext key="Bibliography" text="Llyfryddiaeth"/>
+<l:gentext key="bibliography" text="Llyfryddiaeth"/>
+<l:gentext key="Book" text="Llyfr"/>
+<l:gentext key="book" text="Llyfr"/>
+<l:gentext key="CAUTION" text="GOFAL"/>
+<l:gentext key="Caution" text="Gofal"/>
+<l:gentext key="caution" text="Gofal"/>
+<l:gentext key="Chapter" text="Pennod"/>
+<l:gentext key="chapter" text="Pennod"/>
+<l:gentext key="Colophon" text="Coloffon"/>
+<l:gentext key="colophon" text="Coloffon"/>
+<l:gentext key="Copyright" text="Hawlfraint"/>
+<l:gentext key="copyright" text="Hawlfraint"/>
+<l:gentext key="Dedication" text="Cyflwyniad"/>
+<l:gentext key="dedication" text="Cyflwyniad"/>
+<l:gentext key="Edition" text="Argraffiad"/>
+<l:gentext key="edition" text="Argraffiad"/>
+<l:gentext key="Editor" text="Editor" lang="en"/>
+<l:gentext key="Equation" text="Hafaliad"/>
+<l:gentext key="equation" text="Hafaliad"/>
+<l:gentext key="Example" text="Enghraifft"/>
+<l:gentext key="example" text="Enghraifft"/>
+<l:gentext key="Figure" text="Ffigur"/>
+<l:gentext key="figure" text="Ffigur"/>
+<l:gentext key="Glossary" text="Geirfa"/>
+<l:gentext key="glossary" text="Geirfa"/>
+<l:gentext key="GlossSee" text="Gweler"/>
+<l:gentext key="glosssee" text="Gweler"/>
+<l:gentext key="GlossSeeAlso" text="Gweler Hefyd"/>
+<l:gentext key="glossseealso" text="Gweler Hefyd"/>
+<l:gentext key="IMPORTANT" text="PWYSIG"/>
+<l:gentext key="important" text="Pwysig"/>
+<l:gentext key="Important" text="Pwysig"/>
+<l:gentext key="Index" text="Mynegai"/>
+<l:gentext key="index" text="Mynegai"/>
+<l:gentext key="ISBN" text="ISBN"/>
+<l:gentext key="isbn" text="ISBN"/>
+<l:gentext key="LegalNotice" text="Rhybudd Cyfreithiol"/>
+<l:gentext key="legalnotice" text="Rhybudd Cyfreithiol"/>
+<l:gentext key="MsgAud" text="Cynulleidfa"/>
+<l:gentext key="msgaud" text="Cynulleidfa"/>
+<l:gentext key="MsgLevel" text="Lefel"/>
+<l:gentext key="msglevel" text="Lefel"/>
+<l:gentext key="MsgOrig" text="Tarddiad"/>
+<l:gentext key="msgorig" text="Tarddiad"/>
+<l:gentext key="NOTE" text="NODYN"/>
+<l:gentext key="Note" text="Nodyn"/>
+<l:gentext key="note" text="Nodyn"/>
+<l:gentext key="Part" text="Rhan"/>
+<l:gentext key="part" text="Rhan"/>
+<l:gentext key="Preface" text="Rhagair"/>
+<l:gentext key="preface" text="Rhagair"/>
+<l:gentext key="Procedure" text="Trefn"/>
+<l:gentext key="procedure" text="Trefn"/>
+<l:gentext key="ProductionSet" text="Cynhyrchiad"/>
+<l:gentext key="PubDate" text="Dyddiad Cyhoeddi"/>
+<l:gentext key="pubdate" text="Dyddiad Cyhoeddi"/>
+<l:gentext key="Published" text="Cyhoeddwyd"/>
+<l:gentext key="published" text="Cyhoeddwyd"/>
+<l:gentext key="Publisher" text="Publisher" lang="en"/>
+<l:gentext key="Qandadiv" text="C &amp; A"/>
+<l:gentext key="qandadiv" text="C &amp; A"/>
+<l:gentext key="QandASet" text="Frequently Asked Questions" lang="en"/>
+<l:gentext key="Question" text="C:"/>
+<l:gentext key="question" text="C:"/>
+<l:gentext key="RefEntry" text="Cyfeirnod"/>
+<l:gentext key="refentry" text="Cyfeirnod"/>
+<l:gentext key="Reference" text="Cyfeiriad"/>
+<l:gentext key="reference" text="Cyfeiriad"/>
+<l:gentext key="References" text="References" lang="en"/>
+<l:gentext key="RefName" text="Enw"/>
+<l:gentext key="refname" text="Enw"/>
+<l:gentext key="RefSection" text="Adran Gyfeiriad"/>
+<l:gentext key="refsection" text="Adran Gyfeiriad"/>
+<l:gentext key="RefSynopsisDiv" text="Crynodeb"/>
+<l:gentext key="refsynopsisdiv" text="Crynodeb"/>
+<l:gentext key="RevHistory" text="Hanes Adolygu"/>
+<l:gentext key="revhistory" text="Hanes Adolygu"/>
+<l:gentext key="revision" text="Adolygiad"/>
+<l:gentext key="Revision" text="Adolygiad"/>
+<l:gentext key="sect1" text="Adran"/>
+<l:gentext key="sect2" text="Adran"/>
+<l:gentext key="sect3" text="Adran"/>
+<l:gentext key="sect4" text="Adran"/>
+<l:gentext key="sect5" text="Adran"/>
+<l:gentext key="section" text="Adran"/>
+<l:gentext key="Section" text="Adran"/>
+<l:gentext key="see" text="gweler"/>
+<l:gentext key="See" text="Gweler"/>
+<l:gentext key="seealso" text="gweler hefyd"/>
+<l:gentext key="Seealso" text="Gweler hefyd"/>
+<l:gentext key="SeeAlso" text="Gweler Hefyd"/>
+<l:gentext key="set" text="Set"/>
+<l:gentext key="Set" text="Set"/>
+<l:gentext key="setindex" text="Mynegai Set"/>
+<l:gentext key="SetIndex" text="Mynegai Set"/>
+<l:gentext key="Sidebar" text="Bar Ochr"/>
+<l:gentext key="sidebar" text="bar ochr"/>
+<l:gentext key="step" text="cam"/>
+<l:gentext key="Step" text="Cam"/>
+<l:gentext key="table" text="Tabl"/>
+<l:gentext key="Table" text="Tabl"/>
+<l:gentext key="task" text="Task" lang="en"/>
+<l:gentext key="Task" text="Task" lang="en"/>
+<l:gentext key="tip" text="Cynghoryn"/>
+<l:gentext key="TIP" text="CYNGHORYN"/>
+<l:gentext key="Tip" text="Cynghoryn"/>
+<l:gentext key="Warning" text="Rhybudd"/>
+<l:gentext key="warning" text="Rhybudd"/>
+<l:gentext key="WARNING" text="RHYBUDD"/>
+<l:gentext key="and" text="a(c)"/>
+<l:gentext key="by" text="gan"/>
+<l:gentext key="Edited" text="Golygwyd"/>
+<l:gentext key="edited" text="Golygwyd"/>
+<l:gentext key="Editedby" text="Golygwyd:"/>
+<l:gentext key="editedby" text="Golygwyd:"/>
+<l:gentext key="in" text="yn"/>
+<l:gentext key="lastlistcomma" text=","/>
+<l:gentext key="listcomma" text=","/>
+<l:gentext key="notes" text="Nodiadau"/>
+<l:gentext key="Notes" text="Nodiadau"/>
+<l:gentext key="Pgs" text="Tud."/>
+<l:gentext key="pgs" text="Tud."/>
+<l:gentext key="Revisedby" text="Adolygwyd: "/>
+<l:gentext key="revisedby" text="Adolygwyd: "/>
+<l:gentext key="TableNotes" text="Nodiadau"/>
+<l:gentext key="tablenotes" text="Nodiadau"/>
+<l:gentext key="TableofContents" text="Cynnwys"/>
+<l:gentext key="tableofcontents" text="Cynnwys"/>
+<l:gentext key="unexpectedelementname" text="Enw elfen annisgwyl"/>
+<l:gentext key="unsupported" text="ni chynhelir"/>
+<l:gentext key="xrefto" text="xref i"/>
+<l:gentext key="Authors" text="Authors" lang="en"/>
+<l:gentext key="copyeditor" text="Copy Editor" lang="en"/>
+<l:gentext key="graphicdesigner" text="Graphic Designer" lang="en"/>
+<l:gentext key="productioneditor" text="Production Editor" lang="en"/>
+<l:gentext key="technicaleditor" text="Technical Editor" lang="en"/>
+<l:gentext key="translator" text="Translator" lang="en"/>
+<l:gentext key="listofequations" text="Rhestr Hafaliadau"/>
+<l:gentext key="ListofEquations" text="Rhestr Hafaliadau"/>
+<l:gentext key="ListofExamples" text="Rhestr Hafaliadau"/>
+<l:gentext key="listofexamples" text="Rhestr Hafaliadau"/>
+<l:gentext key="ListofFigures" text="Rhestr Hafaliadau"/>
+<l:gentext key="listoffigures" text="Rhestr Hafaliadau"/>
+<l:gentext key="ListofProcedures" text="Dull Gweithredu"/>
+<l:gentext key="listofprocedures" text="Dull Gweithredu"/>
+<l:gentext key="listoftables" text="Rhestr Tablau"/>
+<l:gentext key="ListofTables" text="Rhestr Tablau"/>
+<l:gentext key="ListofUnknown" text="Rhestr Anhysbysion"/>
+<l:gentext key="listofunknown" text="Rhestr Anhysbysion"/>
+<l:gentext key="nav-home" text="Cartref"/>
+<l:gentext key="nav-next" text="Nesaf"/>
+<l:gentext key="nav-next-sibling" text="Ymlaen"/>
+<l:gentext key="nav-prev" text="Cynt"/>
+<l:gentext key="nav-prev-sibling" text="Yn Ôl"/>
+<l:gentext key="nav-up" text="I Fyny"/>
+<l:gentext key="nav-toc" text="Cynnwys"/>
+<l:gentext key="Draft" text="Drafft"/>
+<l:gentext key="above" text="uchod"/>
+<l:gentext key="below" text="isod"/>
+<l:gentext key="sectioncalled" text="yr adran o'r enw"/>
+<l:gentext key="index symbols" text="Symbolau"/>
+<l:gentext key="writing-mode" text="lr-tb"/>
+<l:gentext key="lowercase.alpha" text="abcdefghijklmnopqrstuvwxyz"/>
+<l:gentext key="uppercase.alpha" text="ABCDEFGHIJKLMNOPQRSTUVWXYZ"/>
+<l:gentext key="normalize.sort.input" text="AaÀàÃáÂâÃãÄäÅåĀÄĂ㥹ÇǎǞǟǠǡǺǻȀÈȂȃȦȧḀá¸áºšáº áº¡áº¢áº£áº¤áº¥áº¦áº§áº¨áº©áºªáº«áº¬áº­áº®áº¯áº°áº±áº²áº³áº´áºµáº¶áº·BbÆ€ÆɓƂƃḂḃḄḅḆḇCcÇçĆćĈĉĊċČÄƇƈɕḈḉDdÄŽÄÄđƊɗƋƌDžDzȡɖḊḋḌá¸á¸Žá¸á¸á¸‘ḒḓEeÈèÉéÊêËëĒēĔĕĖėĘęĚěȄȅȆȇȨȩḔḕḖḗḘḙḚḛḜá¸áº¸áº¹áººáº»áº¼áº½áº¾áº¿á»€á»á»‚ểỄễỆệFfƑƒḞḟGgÄœÄĞğĠġĢģƓɠǤǥǦǧǴǵḠḡHhĤĥĦħȞȟɦḢḣḤḥḦḧḨḩḪḫẖIiÌìÃíÎîÃïĨĩĪīĬĭĮįİƗɨÇÇȈȉȊȋḬḭḮḯỈỉỊịJjĴĵǰÊKkĶķƘƙǨǩḰḱḲḳḴḵLlĹĺĻļĽľĿŀÅłƚLjȴɫɬɭḶḷḸḹḺḻḼḽMmɱḾḿṀá¹á¹‚ṃNnÑñŃńŅņŇňÆɲƞȠNjǸǹȵɳṄṅṆṇṈṉṊṋOoÒòÓóÔôÕõÖöØøŌÅÅŽÅÅőƟƠơǑǒǪǫǬǭǾǿȌÈÈŽÈȪȫȬȭȮȯȰȱṌá¹á¹Žá¹á¹á¹‘ṒṓỌá»á»Žá»á»á»‘ỒồỔổỖỗỘộỚớỜá»á»žá»Ÿá» á»¡á»¢á»£PpƤƥṔṕṖṗQqÊ RrŔŕŖŗŘřÈȑȒȓɼɽɾṘṙṚṛṜá¹á¹žá¹ŸSsŚśŜÅŞşŠšȘșʂṠṡṢṣṤṥṦṧṨṩTtŢţŤťŦŧƫƬƭƮʈȚțȶṪṫṬṭṮṯṰṱẗUuÙùÚúÛûÜüŨũŪūŬŭŮůŰűŲųƯưǓǔǕǖǗǘǙǚǛǜȔȕȖȗṲṳṴṵṶṷṸṹṺṻỤụỦủỨứỪừỬửỮữỰựVvƲʋṼṽṾṿWwŴŵẀáºáº‚ẃẄẅẆẇẈẉẘXxẊẋẌáºYyÃýÿŸŶŷƳƴȲȳẎáºáº™á»²á»³á»´á»µá»¶á»·á»¸á»¹ZzŹźŻżŽžƵƶȤȥÊÊ‘áºáº‘ẒẓẔẕẕ" lang="en"/>
+<l:gentext key="normalize.sort.output" text="AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBCCCCCCCCCCCCCCCCCDDDDDDDDDDDDDDDDDDDDDDDDEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEFFFFFFGGGGGGGGGGGGGGGGGGGGHHHHHHHHHHHHHHHHHHHHIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIJJJJJJKKKKKKKKKKKKKKLLLLLLLLLLLLLLLLLLLLLLLLLLMMMMMMMMMNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOPPPPPPPPQQQRRRRRRRRRRRRRRRRRRRRRRRSSSSSSSSSSSSSSSSSSSSSSSTTTTTTTTTTTTTTTTTTTTTTTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUVVVVVVVVWWWWWWWWWWWWWWWXXXXXXYYYYYYYYYYYYYYYYYYYYYYYZZZZZZZZZZZZZZZZZZZZZ" lang="en"/>
+<l:dingbat key="startquote" text="“"/>
+<l:dingbat key="endquote" text="â€"/>
+<l:dingbat key="nestedstartquote" text="‘"/>
+<l:dingbat key="nestedendquote" text="’"/>
+<l:dingbat key="singlestartquote" text="‘"/>
+<l:dingbat key="singleendquote" text="’"/>
+<l:dingbat key="bullet" text="•"/>
+<l:gentext key="hyphenation-character" text="-"/>
+<l:gentext key="hyphenation-push-character-count" text="2"/>
+<l:gentext key="hyphenation-remain-character-count" text="2"/>
+<l:context name="styles"><l:template name="person-name" text="cyntaf-olaf"/>
+</l:context>
+<l:context name="title"><l:template name="abstract" text="%t"/>
+<l:template name="acknowledgements" text="%t" lang="en"/>
+<l:template name="answer" text="%t"/>
+<l:template name="appendix" text="Atodiad %n. %t"/>
+<l:template name="article" text="%t"/>
+<l:template name="authorblurb" text="%t"/>
+<l:template name="bibliodiv" text="%t"/>
+<l:template name="biblioentry" text="%t"/>
+<l:template name="bibliography" text="%t"/>
+<l:template name="bibliolist" text="%t"/>
+<l:template name="bibliomixed" text="%t"/>
+<l:template name="bibliomset" text="%t"/>
+<l:template name="biblioset" text="%t"/>
+<l:template name="blockquote" text="%t"/>
+<l:template name="book" text="%t"/>
+<l:template name="calloutlist" text="%t"/>
+<l:template name="caution" text="%t"/>
+<l:template name="chapter" text="Pennod %n. %t"/>
+<l:template name="colophon" text="%t"/>
+<l:template name="dedication" text="%t"/>
+<l:template name="equation" text="Hafaliad %n. %t"/>
+<l:template name="example" text="Enghraifft %n. %t"/>
+<l:template name="figure" text="Ffigur %n. %t"/>
+<l:template name="foil" text="%t"/>
+<l:template name="foilgroup" text="%t"/>
+<l:template name="formalpara" text="%t"/>
+<l:template name="glossary" text="%t"/>
+<l:template name="glossdiv" text="%t"/>
+<l:template name="glosslist" text="%t"/>
+<l:template name="glossentry" text="%t"/>
+<l:template name="important" text="%t"/>
+<l:template name="index" text="%t"/>
+<l:template name="indexdiv" text="%t"/>
+<l:template name="itemizedlist" text="%t"/>
+<l:template name="legalnotice" text="%t"/>
+<l:template name="listitem" text=""/>
+<l:template name="lot" text="%t"/>
+<l:template name="msg" text="%t"/>
+<l:template name="msgexplan" text="%t"/>
+<l:template name="msgmain" text="%t"/>
+<l:template name="msgrel" text="%t"/>
+<l:template name="msgset" text="%t"/>
+<l:template name="msgsub" text="%t"/>
+<l:template name="note" text="%t"/>
+<l:template name="orderedlist" text="%t"/>
+<l:template name="part" text="Rhan %n. %t"/>
+<l:template name="partintro" text="%t"/>
+<l:template name="preface" text="%t"/>
+<l:template name="procedure" text="%t"/>
+<l:template name="procedure.formal" text="Trefn %n. %t"/>
+<l:template name="productionset" text="%t"/>
+<l:template name="productionset.formal" text="Cynhyrchiad %n"/>
+<l:template name="qandadiv" text="%t"/>
+<l:template name="qandaentry" text="%t"/>
+<l:template name="qandaset" text="%t"/>
+<l:template name="question" text="%t"/>
+<l:template name="refentry" text="%t"/>
+<l:template name="reference" text="%t"/>
+<l:template name="refsection" text="%t"/>
+<l:template name="refsect1" text="%t"/>
+<l:template name="refsect2" text="%t"/>
+<l:template name="refsect3" text="%t"/>
+<l:template name="refsynopsisdiv" text="%t"/>
+<l:template name="refsynopsisdivinfo" text="%t"/>
+<l:template name="segmentedlist" text="%t"/>
+<l:template name="set" text="%t"/>
+<l:template name="setindex" text="%t"/>
+<l:template name="sidebar" text="%t"/>
+<l:template name="step" text="%t"/>
+<l:template name="table" text="Tabl %n. %t"/>
+<l:template name="task" text="%t"/>
+<l:template name="tasksummary" text="%t" lang="en"/>
+<l:template name="taskprerequisites" text="%t" lang="en"/>
+<l:template name="taskrelated" text="%t" lang="en"/>
+<l:template name="tip" text="%t"/>
+<l:template name="toc" text="%t"/>
+<l:template name="variablelist" text="%t"/>
+<l:template name="varlistentry" text=""/>
+<l:template name="warning" text="%t"/>
+</l:context>
+<l:context name="title-unnumbered"><l:template name="appendix" text="%t"/>
+<l:template name="article/appendix" text="%t"/>
+<l:template name="bridgehead" text="%t"/>
+<l:template name="chapter" text="%t"/>
+<l:template name="sect1" text="%t"/>
+<l:template name="sect2" text="%t"/>
+<l:template name="sect3" text="%t"/>
+<l:template name="sect4" text="%t"/>
+<l:template name="sect5" text="%t"/>
+<l:template name="section" text="%t"/>
+<l:template name="simplesect" text="%t"/>
+<l:template name="part" text="%t" lang="en"/>
+</l:context>
+<l:context name="title-numbered"><l:template name="appendix" text="Atodiad %n. %t"/>
+<l:template name="article/appendix" text="%n. %t"/>
+<l:template name="bridgehead" text="%n. %t"/>
+<l:template name="chapter" text="Pennod %n. %t"/>
+<l:template name="part" text="Rhan %n. %t"/>
+<l:template name="sect1" text="%n. %t"/>
+<l:template name="sect2" text="%n. %t"/>
+<l:template name="sect3" text="%n. %t"/>
+<l:template name="sect4" text="%n. %t"/>
+<l:template name="sect5" text="%n. %t"/>
+<l:template name="section" text="%n. %t"/>
+<l:template name="simplesect" text="%t"/>
+</l:context>
+<l:context name="subtitle"><l:template name="appendix" text="%s"/>
+<l:template name="acknowledgements" text="%s" lang="en"/>
+<l:template name="article" text="%s"/>
+<l:template name="bibliodiv" text="%s"/>
+<l:template name="biblioentry" text="%s"/>
+<l:template name="bibliography" text="%s"/>
+<l:template name="bibliomixed" text="%s"/>
+<l:template name="bibliomset" text="%s"/>
+<l:template name="biblioset" text="%s"/>
+<l:template name="book" text="%s"/>
+<l:template name="chapter" text="%s"/>
+<l:template name="colophon" text="%s"/>
+<l:template name="dedication" text="%s"/>
+<l:template name="glossary" text="%s"/>
+<l:template name="glossdiv" text="%s"/>
+<l:template name="index" text="%s"/>
+<l:template name="indexdiv" text="%s"/>
+<l:template name="lot" text="%s"/>
+<l:template name="part" text="%s"/>
+<l:template name="partintro" text="%s"/>
+<l:template name="preface" text="%s"/>
+<l:template name="refentry" text="%s"/>
+<l:template name="reference" text="%s"/>
+<l:template name="refsection" text="%s"/>
+<l:template name="refsect1" text="%s"/>
+<l:template name="refsect2" text="%s"/>
+<l:template name="refsect3" text="%s"/>
+<l:template name="refsynopsisdiv" text="%s"/>
+<l:template name="sect1" text="%s"/>
+<l:template name="sect2" text="%s"/>
+<l:template name="sect3" text="%s"/>
+<l:template name="sect4" text="%s"/>
+<l:template name="sect5" text="%s"/>
+<l:template name="section" text="%s"/>
+<l:template name="set" text="%s"/>
+<l:template name="setindex" text="%s"/>
+<l:template name="sidebar" text="%s"/>
+<l:template name="simplesect" text="%s"/>
+<l:template name="toc" text="%s"/>
+</l:context>
+<l:context name="xref"><l:template name="abstract" text="%t"/>
+<l:template name="acknowledgements" text="%t" lang="en"/>
+<l:template name="answer" text="A: %n"/>
+<l:template name="appendix" text="%t"/>
+<l:template name="article" text="%t"/>
+<l:template name="authorblurb" text="%t"/>
+<l:template name="bibliodiv" text="%t"/>
+<l:template name="bibliography" text="%t"/>
+<l:template name="bibliomset" text="%t"/>
+<l:template name="biblioset" text="%t"/>
+<l:template name="blockquote" text="%t"/>
+<l:template name="book" text="%t"/>
+<l:template name="calloutlist" text="%t"/>
+<l:template name="caution" text="%t"/>
+<l:template name="chapter" text="%t"/>
+<l:template name="colophon" text="%t"/>
+<l:template name="constraintdef" text="%t"/>
+<l:template name="dedication" text="%t"/>
+<l:template name="equation" text="%t"/>
+<l:template name="example" text="%t"/>
+<l:template name="figure" text="%t"/>
+<l:template name="foil" text="%t"/>
+<l:template name="foilgroup" text="%t"/>
+<l:template name="formalpara" text="%t"/>
+<l:template name="glossary" text="%t"/>
+<l:template name="glossdiv" text="%t"/>
+<l:template name="important" text="%t"/>
+<l:template name="index" text="%t"/>
+<l:template name="indexdiv" text="%t"/>
+<l:template name="itemizedlist" text="%t"/>
+<l:template name="legalnotice" text="%t"/>
+<l:template name="listitem" text="%n"/>
+<l:template name="lot" text="%t"/>
+<l:template name="msg" text="%t"/>
+<l:template name="msgexplan" text="%t"/>
+<l:template name="msgmain" text="%t"/>
+<l:template name="msgrel" text="%t"/>
+<l:template name="msgset" text="%t"/>
+<l:template name="msgsub" text="%t"/>
+<l:template name="note" text="%t"/>
+<l:template name="orderedlist" text="%t"/>
+<l:template name="part" text="%t"/>
+<l:template name="partintro" text="%t"/>
+<l:template name="preface" text="%t"/>
+<l:template name="procedure" text="%t"/>
+<l:template name="productionset" text="%t"/>
+<l:template name="qandadiv" text="%t"/>
+<l:template name="qandaentry" text="C: %n"/>
+<l:template name="qandaset" text="%t"/>
+<l:template name="question" text="C: %n"/>
+<l:template name="reference" text="%t"/>
+<l:template name="refsynopsisdiv" text="%t"/>
+<l:template name="segmentedlist" text="%t"/>
+<l:template name="set" text="%t"/>
+<l:template name="setindex" text="%t"/>
+<l:template name="sidebar" text="%t"/>
+<l:template name="table" text="%t"/>
+<l:template name="task" text="%t" lang="en"/>
+<l:template name="tip" text="%t"/>
+<l:template name="toc" text="%t"/>
+<l:template name="variablelist" text="%t"/>
+<l:template name="varlistentry" text="%n"/>
+<l:template name="warning" text="%t"/>
+<l:template name="olink.document.citation" text=" yn %o"/>
+<l:template name="olink.page.citation" text=" (tudalen %p)"/>
+<l:template name="page.citation" text=" [%p]"/>
+<l:template name="page" text="(tudalen %p)"/>
+<l:template name="docname" text=" yn %o"/>
+<l:template name="docnamelong" text=" yn y ddogfen o'r enw %o"/>
+<l:template name="pageabbrev" text="(tud. %p)"/>
+<l:template name="Page" text="Tudalen %p"/>
+<l:template name="bridgehead" text="yr adran o'r enw “%tâ€"/>
+<l:template name="refsection" text="yr adran o'r enw “%tâ€"/>
+<l:template name="refsect1" text="yr adran o'r enw “%tâ€"/>
+<l:template name="refsect2" text="yr adran o'r enw “%tâ€"/>
+<l:template name="refsect3" text="yr adran o'r enw “%tâ€"/>
+<l:template name="sect1" text="yr adran o'r enw “%tâ€"/>
+<l:template name="sect2" text="yr adran o'r enw “%tâ€"/>
+<l:template name="sect3" text="yr adran o'r enw “%tâ€"/>
+<l:template name="sect4" text="yr adran o'r enw “%tâ€"/>
+<l:template name="sect5" text="yr adran o'r enw “%tâ€"/>
+<l:template name="section" text="yr adran o'r enw “%tâ€"/>
+<l:template name="simplesect" text="yr adran o'r enw “%tâ€"/>
+</l:context>
+<l:context name="xref-number"><l:template name="answer" text="A: %n"/>
+<l:template name="appendix" text="Atodiad %n"/>
+<l:template name="bridgehead" text="Adran %n"/>
+<l:template name="chapter" text="Pennod %n"/>
+<l:template name="equation" text="Hafaliad %n"/>
+<l:template name="example" text="Enghraifft %n"/>
+<l:template name="figure" text="Ffigur %n"/>
+<l:template name="part" text="Rhan %n"/>
+<l:template name="procedure" text="Trefn %n"/>
+<l:template name="productionset" text="Cynhyrchiad %n"/>
+<l:template name="qandadiv" text="C &amp; A %n"/>
+<l:template name="qandaentry" text="C: %n"/>
+<l:template name="question" text="C: %n"/>
+<l:template name="sect1" text="Adran %n"/>
+<l:template name="sect2" text="Adran %n"/>
+<l:template name="sect3" text="Adran %n"/>
+<l:template name="sect4" text="Adran %n"/>
+<l:template name="sect5" text="Adran %n"/>
+<l:template name="section" text="Adran %n"/>
+<l:template name="table" text="Tabl %n"/>
+</l:context>
+<l:context name="xref-number-and-title"><l:template name="appendix" text="Atodiad %n, %t"/>
+<l:template name="bridgehead" text="Adran %n, “%tâ€"/>
+<l:template name="chapter" text="Pennod %n, %t"/>
+<l:template name="equation" text="Hafaliad %n, “%tâ€"/>
+<l:template name="example" text="Enghraifft %n, “%tâ€"/>
+<l:template name="figure" text="Ffigur %n, “%tâ€"/>
+<l:template name="part" text="Rhan %n, “%tâ€"/>
+<l:template name="procedure" text="Trefn %n, “%tâ€"/>
+<l:template name="productionset" text="Cynhyrchiad %n, “%tâ€"/>
+<l:template name="qandadiv" text="C &amp; A %n, “%tâ€"/>
+<l:template name="refsect1" text="yr adran o'r enw “%tâ€"/>
+<l:template name="refsect2" text="yr adran o'r enw “%tâ€"/>
+<l:template name="refsect3" text="yr adran o'r enw “%tâ€"/>
+<l:template name="refsection" text="yr adran o'r enw “%tâ€"/>
+<l:template name="sect1" text="Adran %n, “%tâ€"/>
+<l:template name="sect2" text="Adran %n, “%tâ€"/>
+<l:template name="sect3" text="Adran %n, “%tâ€"/>
+<l:template name="sect4" text="Adran %n, “%tâ€"/>
+<l:template name="sect5" text="Adran %n, “%tâ€"/>
+<l:template name="section" text="Adran %n, “%tâ€"/>
+<l:template name="simplesect" text="yr adran o'r enw “%tâ€"/>
+<l:template name="table" text="Tabl %n, “%tâ€"/>
+</l:context>
+<l:context name="authorgroup"><l:template name="sep" text=", "/>
+<l:template name="sep2" text=" a(c) "/>
+<l:template name="seplast" text=", a(c) "/>
+</l:context>
+<l:context name="glossary"><l:template name="see" text="Gweler %t."/>
+<l:template name="seealso" text="Gweler Hefyd %t."/>
+<l:template name="seealso-separator" text=", "/>
+</l:context>
+<l:context name="msgset"><l:template name="MsgAud" text="Cynulleidfa: "/>
+<l:template name="MsgLevel" text="Lefel: "/>
+<l:template name="MsgOrig" text="Tarddiad: "/>
+</l:context>
+<l:context name="datetime"><l:template name="format" text="m/d/B"/>
+</l:context>
+<l:context name="termdef"><l:template name="prefix" text="[Diffiniad: "/>
+<l:template name="suffix" text="]"/>
+</l:context>
+<l:context name="datetime-full"><l:template name="January" text="Ionawr"/>
+<l:template name="February" text="Chwefror"/>
+<l:template name="March" text="Mawrth"/>
+<l:template name="April" text="Ebrill"/>
+<l:template name="May" text="Mai"/>
+<l:template name="June" text="Mehefin"/>
+<l:template name="July" text="Gorffenaf"/>
+<l:template name="August" text="Awst"/>
+<l:template name="September" text="Medi"/>
+<l:template name="October" text="Hydref"/>
+<l:template name="November" text="Tachwedd"/>
+<l:template name="December" text="Rhagfyr"/>
+<l:template name="Monday" text="Dydd Llun"/>
+<l:template name="Tuesday" text="Dydd Mawrth"/>
+<l:template name="Wednesday" text="Dydd Mercher"/>
+<l:template name="Thursday" text="Dydd Iau"/>
+<l:template name="Friday" text="Dydd Gwener"/>
+<l:template name="Saturday" text="Dydd Sadwrn"/>
+<l:template name="Sunday" text="Dydd Sul"/>
+</l:context>
+<l:context name="datetime-abbrev"><l:template name="Jan" text="Ion"/>
+<l:template name="Feb" text="Chwe"/>
+<l:template name="Mar" text="Maw"/>
+<l:template name="Apr" text="Ebr"/>
+<l:template name="May" text="Mai"/>
+<l:template name="Jun" text="Meh"/>
+<l:template name="Jul" text="Gorff"/>
+<l:template name="Aug" text="Awst"/>
+<l:template name="Sep" text="Medi"/>
+<l:template name="Oct" text="Hyd"/>
+<l:template name="Nov" text="Tach"/>
+<l:template name="Dec" text="Rhag"/>
+<l:template name="Mon" text="Llun"/>
+<l:template name="Tue" text="Mawrth"/>
+<l:template name="Wed" text="Mercher"/>
+<l:template name="Thu" text="Iau"/>
+<l:template name="Fri" text="Gwener"/>
+<l:template name="Sat" text="Sadwrn"/>
+<l:template name="Sun" text="Sul"/>
+</l:context>
+<l:context name="htmlhelp"><l:template name="langcode" text="0x0409 Welsh (UNITED KINGDOM)"/>
+</l:context>
+<l:context name="index"><l:template name="term-separator" text=", " lang="en"/>
+<l:template name="number-separator" text=", " lang="en"/>
+<l:template name="range-separator" text="-" lang="en"/>
+</l:context>
+<l:context name="iso690"><l:template name="lastfirst.sep" text=", " lang="en"/>
+<l:template name="alt.person.two.sep" text=" – " lang="en"/>
+<l:template name="alt.person.last.sep" text=" – " lang="en"/>
+<l:template name="alt.person.more.sep" text=" – " lang="en"/>
+<l:template name="primary.editor" text=" (ed.)" lang="en"/>
+<l:template name="primary.many" text=", et al." lang="en"/>
+<l:template name="primary.sep" text=". " lang="en"/>
+<l:template name="submaintitle.sep" text=": " lang="en"/>
+<l:template name="title.sep" text=". " lang="en"/>
+<l:template name="othertitle.sep" text=", " lang="en"/>
+<l:template name="medium1" text=" [" lang="en"/>
+<l:template name="medium2" text="]" lang="en"/>
+<l:template name="secondary.person.sep" text="; " lang="en"/>
+<l:template name="secondary.sep" text=". " lang="en"/>
+<l:template name="respons.sep" text=". " lang="en"/>
+<l:template name="edition.sep" text=". " lang="en"/>
+<l:template name="edition.serial.sep" text=", " lang="en"/>
+<l:template name="issuing.range" text="-" lang="en"/>
+<l:template name="issuing.div" text=", " lang="en"/>
+<l:template name="issuing.sep" text=". " lang="en"/>
+<l:template name="partnr.sep" text=". " lang="en"/>
+<l:template name="placepubl.sep" text=": " lang="en"/>
+<l:template name="publyear.sep" text=", " lang="en"/>
+<l:template name="pubinfo.sep" text=". " lang="en"/>
+<l:template name="spec.pubinfo.sep" text=", " lang="en"/>
+<l:template name="upd.sep" text=", " lang="en"/>
+<l:template name="datecit1" text=" [cited " lang="en"/>
+<l:template name="datecit2" text="]" lang="en"/>
+<l:template name="extent.sep" text=". " lang="en"/>
+<l:template name="locs.sep" text=", " lang="en"/>
+<l:template name="location.sep" text=". " lang="en"/>
+<l:template name="serie.sep" text=". " lang="en"/>
+<l:template name="notice.sep" text=". " lang="en"/>
+<l:template name="access" text="Available " lang="en"/>
+<l:template name="acctoo" text="Also available " lang="en"/>
+<l:template name="onwww" text="from World Wide Web" lang="en"/>
+<l:template name="oninet" text="from Internet" lang="en"/>
+<l:template name="access.end" text=": " lang="en"/>
+<l:template name="link1" text="&lt;" lang="en"/>
+<l:template name="link2" text="&gt;" lang="en"/>
+<l:template name="access.sep" text=". " lang="en"/>
+<l:template name="isbn" text="ISBN " lang="en"/>
+<l:template name="issn" text="ISSN " lang="en"/>
+<l:template name="stdnum.sep" text=". " lang="en"/>
+<l:template name="patcountry.sep" text=". " lang="en"/>
+<l:template name="pattype.sep" text=", " lang="en"/>
+<l:template name="patnum.sep" text=". " lang="en"/>
+<l:template name="patdate.sep" text=". " lang="en"/>
+</l:context><l:letters><l:l i="-1"/>
+<l:l i="0">Symbols</l:l>
+<l:l i="10">A</l:l>
+<l:l i="10">a</l:l>
+<l:l i="10">À</l:l>
+<l:l i="10">à</l:l>
+<l:l i="10">Ã</l:l>
+<l:l i="10">á</l:l>
+<l:l i="10">Â</l:l>
+<l:l i="10">â</l:l>
+<l:l i="10">Ã</l:l>
+<l:l i="10">ã</l:l>
+<l:l i="10">Ä</l:l>
+<l:l i="10">ä</l:l>
+<l:l i="10">Ã…</l:l>
+<l:l i="10">Ã¥</l:l>
+<l:l i="10">Ä€</l:l>
+<l:l i="10">Ä</l:l>
+<l:l i="10">Ä‚</l:l>
+<l:l i="10">ă</l:l>
+<l:l i="10">Ä„</l:l>
+<l:l i="10">Ä…</l:l>
+<l:l i="10">Ç</l:l>
+<l:l i="10">ÇŽ</l:l>
+<l:l i="10">Çž</l:l>
+<l:l i="10">ÇŸ</l:l>
+<l:l i="10">Ç </l:l>
+<l:l i="10">Ç¡</l:l>
+<l:l i="10">Ǻ</l:l>
+<l:l i="10">Ç»</l:l>
+<l:l i="10">È€</l:l>
+<l:l i="10">È</l:l>
+<l:l i="10">È‚</l:l>
+<l:l i="10">ȃ</l:l>
+<l:l i="10">Ȧ</l:l>
+<l:l i="10">ȧ</l:l>
+<l:l i="10">Ḁ</l:l>
+<l:l i="10">á¸</l:l>
+<l:l i="10">ẚ</l:l>
+<l:l i="10">Ạ</l:l>
+<l:l i="10">ạ</l:l>
+<l:l i="10">Ả</l:l>
+<l:l i="10">ả</l:l>
+<l:l i="10">Ấ</l:l>
+<l:l i="10">ấ</l:l>
+<l:l i="10">Ầ</l:l>
+<l:l i="10">ầ</l:l>
+<l:l i="10">Ẩ</l:l>
+<l:l i="10">ẩ</l:l>
+<l:l i="10">Ẫ</l:l>
+<l:l i="10">ẫ</l:l>
+<l:l i="10">Ậ</l:l>
+<l:l i="10">ậ</l:l>
+<l:l i="10">Ắ</l:l>
+<l:l i="10">ắ</l:l>
+<l:l i="10">Ằ</l:l>
+<l:l i="10">ằ</l:l>
+<l:l i="10">Ẳ</l:l>
+<l:l i="10">ẳ</l:l>
+<l:l i="10">Ẵ</l:l>
+<l:l i="10">ẵ</l:l>
+<l:l i="10">Ặ</l:l>
+<l:l i="10">ặ</l:l>
+<l:l i="20">B</l:l>
+<l:l i="20">b</l:l>
+<l:l i="20">Æ€</l:l>
+<l:l i="20">Æ</l:l>
+<l:l i="20">É“</l:l>
+<l:l i="20">Æ‚</l:l>
+<l:l i="20">ƃ</l:l>
+<l:l i="20">Ḃ</l:l>
+<l:l i="20">ḃ</l:l>
+<l:l i="20">Ḅ</l:l>
+<l:l i="20">ḅ</l:l>
+<l:l i="20">Ḇ</l:l>
+<l:l i="20">ḇ</l:l>
+<l:l i="30">C</l:l>
+<l:l i="30">c</l:l>
+<l:l i="30">Ç</l:l>
+<l:l i="30">ç</l:l>
+<l:l i="30">Ć</l:l>
+<l:l i="30">ć</l:l>
+<l:l i="30">Ĉ</l:l>
+<l:l i="30">ĉ</l:l>
+<l:l i="30">ÄŠ</l:l>
+<l:l i="30">Ä‹</l:l>
+<l:l i="30">Č</l:l>
+<l:l i="30">Ä</l:l>
+<l:l i="30">Ƈ</l:l>
+<l:l i="30">ƈ</l:l>
+<l:l i="30">É•</l:l>
+<l:l i="30">Ḉ</l:l>
+<l:l i="30">ḉ</l:l>
+<l:l i="35">Ch</l:l>
+<l:l i="35">ch</l:l>
+<l:l i="40">D</l:l>
+<l:l i="40">d</l:l>
+<l:l i="40">ÄŽ</l:l>
+<l:l i="40">Ä</l:l>
+<l:l i="40">Ä</l:l>
+<l:l i="40">Ä‘</l:l>
+<l:l i="40">ÆŠ</l:l>
+<l:l i="40">É—</l:l>
+<l:l i="40">Æ‹</l:l>
+<l:l i="40">ƌ</l:l>
+<l:l i="40">Ç…</l:l>
+<l:l i="40">Dz</l:l>
+<l:l i="40">È¡</l:l>
+<l:l i="40">É–</l:l>
+<l:l i="40">Ḋ</l:l>
+<l:l i="40">ḋ</l:l>
+<l:l i="40">Ḍ</l:l>
+<l:l i="40">á¸</l:l>
+<l:l i="40">Ḏ</l:l>
+<l:l i="40">á¸</l:l>
+<l:l i="40">á¸</l:l>
+<l:l i="40">ḑ</l:l>
+<l:l i="40">Ḓ</l:l>
+<l:l i="40">ḓ</l:l>
+<l:l i="45">Dd</l:l>
+<l:l i="45">dd</l:l>
+<l:l i="50">E</l:l>
+<l:l i="50">e</l:l>
+<l:l i="50">È</l:l>
+<l:l i="50">è</l:l>
+<l:l i="50">É</l:l>
+<l:l i="50">é</l:l>
+<l:l i="50">Ê</l:l>
+<l:l i="50">ê</l:l>
+<l:l i="50">Ë</l:l>
+<l:l i="50">ë</l:l>
+<l:l i="50">Ä’</l:l>
+<l:l i="50">Ä“</l:l>
+<l:l i="50">Ä”</l:l>
+<l:l i="50">Ä•</l:l>
+<l:l i="50">Ä–</l:l>
+<l:l i="50">Ä—</l:l>
+<l:l i="50">Ę</l:l>
+<l:l i="50">Ä™</l:l>
+<l:l i="50">Äš</l:l>
+<l:l i="50">Ä›</l:l>
+<l:l i="50">È„</l:l>
+<l:l i="50">È…</l:l>
+<l:l i="50">Ȇ</l:l>
+<l:l i="50">ȇ</l:l>
+<l:l i="50">Ȩ</l:l>
+<l:l i="50">È©</l:l>
+<l:l i="50">Ḕ</l:l>
+<l:l i="50">ḕ</l:l>
+<l:l i="50">Ḗ</l:l>
+<l:l i="50">ḗ</l:l>
+<l:l i="50">Ḙ</l:l>
+<l:l i="50">ḙ</l:l>
+<l:l i="50">Ḛ</l:l>
+<l:l i="50">ḛ</l:l>
+<l:l i="50">Ḝ</l:l>
+<l:l i="50">á¸</l:l>
+<l:l i="50">Ẹ</l:l>
+<l:l i="50">ẹ</l:l>
+<l:l i="50">Ẻ</l:l>
+<l:l i="50">ẻ</l:l>
+<l:l i="50">Ẽ</l:l>
+<l:l i="50">ẽ</l:l>
+<l:l i="50">Ế</l:l>
+<l:l i="50">ế</l:l>
+<l:l i="50">Ề</l:l>
+<l:l i="50">á»</l:l>
+<l:l i="50">Ể</l:l>
+<l:l i="50">ể</l:l>
+<l:l i="50">Ễ</l:l>
+<l:l i="50">á»…</l:l>
+<l:l i="50">Ệ</l:l>
+<l:l i="50">ệ</l:l>
+<l:l i="60">F</l:l>
+<l:l i="60">f</l:l>
+<l:l i="60">Æ‘</l:l>
+<l:l i="60">Æ’</l:l>
+<l:l i="60">Ḟ</l:l>
+<l:l i="60">ḟ</l:l>
+<l:l i="65">Ff</l:l>
+<l:l i="65">ff</l:l>
+<l:l i="70">G</l:l>
+<l:l i="70">g</l:l>
+<l:l i="70">Ĝ</l:l>
+<l:l i="70">Ä</l:l>
+<l:l i="70">Äž</l:l>
+<l:l i="70">ÄŸ</l:l>
+<l:l i="70">Ä </l:l>
+<l:l i="70">Ä¡</l:l>
+<l:l i="70">Ä¢</l:l>
+<l:l i="70">Ä£</l:l>
+<l:l i="70">Æ“</l:l>
+<l:l i="70">É </l:l>
+<l:l i="70">Ǥ</l:l>
+<l:l i="70">Ç¥</l:l>
+<l:l i="70">Ǧ</l:l>
+<l:l i="70">ǧ</l:l>
+<l:l i="70">Ç´</l:l>
+<l:l i="70">ǵ</l:l>
+<l:l i="70">Ḡ</l:l>
+<l:l i="70">ḡ</l:l>
+<l:l i="75">Ng</l:l>
+<l:l i="75">ng</l:l>
+<l:l i="80">H</l:l>
+<l:l i="80">h</l:l>
+<l:l i="80">Ĥ</l:l>
+<l:l i="80">Ä¥</l:l>
+<l:l i="80">Ħ</l:l>
+<l:l i="80">ħ</l:l>
+<l:l i="80">Èž</l:l>
+<l:l i="80">ÈŸ</l:l>
+<l:l i="80">ɦ</l:l>
+<l:l i="80">Ḣ</l:l>
+<l:l i="80">ḣ</l:l>
+<l:l i="80">Ḥ</l:l>
+<l:l i="80">ḥ</l:l>
+<l:l i="80">Ḧ</l:l>
+<l:l i="80">ḧ</l:l>
+<l:l i="80">Ḩ</l:l>
+<l:l i="80">ḩ</l:l>
+<l:l i="80">Ḫ</l:l>
+<l:l i="80">ḫ</l:l>
+<l:l i="80">ẖ</l:l>
+<l:l i="90">I</l:l>
+<l:l i="90">i</l:l>
+<l:l i="90">Ì</l:l>
+<l:l i="90">ì</l:l>
+<l:l i="90">Ã</l:l>
+<l:l i="90">í</l:l>
+<l:l i="90">ÃŽ</l:l>
+<l:l i="90">î</l:l>
+<l:l i="90">Ã</l:l>
+<l:l i="90">ï</l:l>
+<l:l i="90">Ĩ</l:l>
+<l:l i="90">Ä©</l:l>
+<l:l i="90">Ī</l:l>
+<l:l i="90">Ä«</l:l>
+<l:l i="90">Ĭ</l:l>
+<l:l i="90">Ä­</l:l>
+<l:l i="90">Ä®</l:l>
+<l:l i="90">į</l:l>
+<l:l i="90">Ä°</l:l>
+<l:l i="90">Æ—</l:l>
+<l:l i="90">ɨ</l:l>
+<l:l i="90">Ç</l:l>
+<l:l i="90">Ç</l:l>
+<l:l i="90">Ȉ</l:l>
+<l:l i="90">ȉ</l:l>
+<l:l i="90">ÈŠ</l:l>
+<l:l i="90">È‹</l:l>
+<l:l i="90">Ḭ</l:l>
+<l:l i="90">ḭ</l:l>
+<l:l i="90">Ḯ</l:l>
+<l:l i="90">ḯ</l:l>
+<l:l i="90">Ỉ</l:l>
+<l:l i="90">ỉ</l:l>
+<l:l i="90">Ị</l:l>
+<l:l i="90">ị</l:l>
+<l:l i="100">J</l:l>
+<l:l i="100">j</l:l>
+<l:l i="100">Ä´</l:l>
+<l:l i="100">ĵ</l:l>
+<l:l i="100">Ç°</l:l>
+<l:l i="100">Ê</l:l>
+<l:l i="110">K</l:l>
+<l:l i="110">k</l:l>
+<l:l i="110">Ķ</l:l>
+<l:l i="110">Ä·</l:l>
+<l:l i="110">Ƙ</l:l>
+<l:l i="110">Æ™</l:l>
+<l:l i="110">Ǩ</l:l>
+<l:l i="110">Ç©</l:l>
+<l:l i="110">Ḱ</l:l>
+<l:l i="110">ḱ</l:l>
+<l:l i="110">Ḳ</l:l>
+<l:l i="110">ḳ</l:l>
+<l:l i="110">Ḵ</l:l>
+<l:l i="110">ḵ</l:l>
+<l:l i="120">L</l:l>
+<l:l i="120">l</l:l>
+<l:l i="120">Ĺ</l:l>
+<l:l i="120">ĺ</l:l>
+<l:l i="120">Ä»</l:l>
+<l:l i="120">ļ</l:l>
+<l:l i="120">Ľ</l:l>
+<l:l i="120">ľ</l:l>
+<l:l i="120">Ä¿</l:l>
+<l:l i="120">Å€</l:l>
+<l:l i="120">Å</l:l>
+<l:l i="120">Å‚</l:l>
+<l:l i="120">Æš</l:l>
+<l:l i="120">Lj</l:l>
+<l:l i="120">È´</l:l>
+<l:l i="120">É«</l:l>
+<l:l i="120">ɬ</l:l>
+<l:l i="120">É­</l:l>
+<l:l i="120">Ḷ</l:l>
+<l:l i="120">ḷ</l:l>
+<l:l i="120">Ḹ</l:l>
+<l:l i="120">ḹ</l:l>
+<l:l i="120">Ḻ</l:l>
+<l:l i="120">ḻ</l:l>
+<l:l i="120">Ḽ</l:l>
+<l:l i="120">ḽ</l:l>
+<l:l i="125">Ll</l:l>
+<l:l i="125">ll</l:l>
+<l:l i="130">M</l:l>
+<l:l i="130">m</l:l>
+<l:l i="130">ɱ</l:l>
+<l:l i="130">Ḿ</l:l>
+<l:l i="130">ḿ</l:l>
+<l:l i="130">á¹€</l:l>
+<l:l i="130">á¹</l:l>
+<l:l i="130">Ṃ</l:l>
+<l:l i="130">ṃ</l:l>
+<l:l i="140">N</l:l>
+<l:l i="140">n</l:l>
+<l:l i="140">Ñ</l:l>
+<l:l i="140">ñ</l:l>
+<l:l i="140">Ń</l:l>
+<l:l i="140">Å„</l:l>
+<l:l i="140">Å…</l:l>
+<l:l i="140">ņ</l:l>
+<l:l i="140">Ň</l:l>
+<l:l i="140">ň</l:l>
+<l:l i="140">Æ</l:l>
+<l:l i="140">ɲ</l:l>
+<l:l i="140">Æž</l:l>
+<l:l i="140">È </l:l>
+<l:l i="140">Ç‹</l:l>
+<l:l i="140">Ǹ</l:l>
+<l:l i="140">ǹ</l:l>
+<l:l i="140">ȵ</l:l>
+<l:l i="140">ɳ</l:l>
+<l:l i="140">Ṅ</l:l>
+<l:l i="140">á¹…</l:l>
+<l:l i="140">Ṇ</l:l>
+<l:l i="140">ṇ</l:l>
+<l:l i="140">Ṉ</l:l>
+<l:l i="140">ṉ</l:l>
+<l:l i="140">Ṋ</l:l>
+<l:l i="140">ṋ</l:l>
+<l:l i="150">O</l:l>
+<l:l i="150">o</l:l>
+<l:l i="150">Ã’</l:l>
+<l:l i="150">ò</l:l>
+<l:l i="150">Ó</l:l>
+<l:l i="150">ó</l:l>
+<l:l i="150">Ô</l:l>
+<l:l i="150">ô</l:l>
+<l:l i="150">Õ</l:l>
+<l:l i="150">õ</l:l>
+<l:l i="150">Ö</l:l>
+<l:l i="150">ö</l:l>
+<l:l i="150">Ø</l:l>
+<l:l i="150">ø</l:l>
+<l:l i="150">Ō</l:l>
+<l:l i="150">Å</l:l>
+<l:l i="150">ÅŽ</l:l>
+<l:l i="150">Å</l:l>
+<l:l i="150">Å</l:l>
+<l:l i="150">Å‘</l:l>
+<l:l i="150">ÆŸ</l:l>
+<l:l i="150">Æ </l:l>
+<l:l i="150">Æ¡</l:l>
+<l:l i="150">Ç‘</l:l>
+<l:l i="150">Ç’</l:l>
+<l:l i="150">Ǫ</l:l>
+<l:l i="150">Ç«</l:l>
+<l:l i="150">Ǭ</l:l>
+<l:l i="150">Ç­</l:l>
+<l:l i="150">Ǿ</l:l>
+<l:l i="150">Ç¿</l:l>
+<l:l i="150">Ȍ</l:l>
+<l:l i="150">È</l:l>
+<l:l i="150">ÈŽ</l:l>
+<l:l i="150">È</l:l>
+<l:l i="150">Ȫ</l:l>
+<l:l i="150">È«</l:l>
+<l:l i="150">Ȭ</l:l>
+<l:l i="150">È­</l:l>
+<l:l i="150">È®</l:l>
+<l:l i="150">ȯ</l:l>
+<l:l i="150">È°</l:l>
+<l:l i="150">ȱ</l:l>
+<l:l i="150">Ṍ</l:l>
+<l:l i="150">á¹</l:l>
+<l:l i="150">Ṏ</l:l>
+<l:l i="150">á¹</l:l>
+<l:l i="150">á¹</l:l>
+<l:l i="150">ṑ</l:l>
+<l:l i="150">á¹’</l:l>
+<l:l i="150">ṓ</l:l>
+<l:l i="150">Ọ</l:l>
+<l:l i="150">á»</l:l>
+<l:l i="150">Ỏ</l:l>
+<l:l i="150">á»</l:l>
+<l:l i="150">á»</l:l>
+<l:l i="150">ố</l:l>
+<l:l i="150">á»’</l:l>
+<l:l i="150">ồ</l:l>
+<l:l i="150">á»”</l:l>
+<l:l i="150">ổ</l:l>
+<l:l i="150">á»–</l:l>
+<l:l i="150">á»—</l:l>
+<l:l i="150">Ộ</l:l>
+<l:l i="150">á»™</l:l>
+<l:l i="150">Ớ</l:l>
+<l:l i="150">á»›</l:l>
+<l:l i="150">Ờ</l:l>
+<l:l i="150">á»</l:l>
+<l:l i="150">Ở</l:l>
+<l:l i="150">ở</l:l>
+<l:l i="150">á» </l:l>
+<l:l i="150">ỡ</l:l>
+<l:l i="150">Ợ</l:l>
+<l:l i="150">ợ</l:l>
+<l:l i="160">P</l:l>
+<l:l i="160">p</l:l>
+<l:l i="160">Ƥ</l:l>
+<l:l i="160">Æ¥</l:l>
+<l:l i="160">á¹”</l:l>
+<l:l i="160">ṕ</l:l>
+<l:l i="160">á¹–</l:l>
+<l:l i="160">á¹—</l:l>
+<l:l i="165">Ph</l:l>
+<l:l i="165">ph</l:l>
+<l:l i="170">Q</l:l>
+<l:l i="170">q</l:l>
+<l:l i="170">Ê </l:l>
+<l:l i="180">R</l:l>
+<l:l i="180">r</l:l>
+<l:l i="180">Å”</l:l>
+<l:l i="180">Å•</l:l>
+<l:l i="180">Å–</l:l>
+<l:l i="180">Å—</l:l>
+<l:l i="180">Ř</l:l>
+<l:l i="180">Å™</l:l>
+<l:l i="180">È</l:l>
+<l:l i="180">È‘</l:l>
+<l:l i="180">È’</l:l>
+<l:l i="180">È“</l:l>
+<l:l i="180">ɼ</l:l>
+<l:l i="180">ɽ</l:l>
+<l:l i="180">ɾ</l:l>
+<l:l i="180">Ṙ</l:l>
+<l:l i="180">á¹™</l:l>
+<l:l i="180">Ṛ</l:l>
+<l:l i="180">á¹›</l:l>
+<l:l i="180">Ṝ</l:l>
+<l:l i="180">á¹</l:l>
+<l:l i="180">Ṟ</l:l>
+<l:l i="180">ṟ</l:l>
+<l:l i="185">Rh</l:l>
+<l:l i="185">rh</l:l>
+<l:l i="190">S</l:l>
+<l:l i="190">s</l:l>
+<l:l i="190">Åš</l:l>
+<l:l i="190">Å›</l:l>
+<l:l i="190">Ŝ</l:l>
+<l:l i="190">Å</l:l>
+<l:l i="190">Åž</l:l>
+<l:l i="190">ÅŸ</l:l>
+<l:l i="190">Å </l:l>
+<l:l i="190">Å¡</l:l>
+<l:l i="190">Ș</l:l>
+<l:l i="190">È™</l:l>
+<l:l i="190">Ê‚</l:l>
+<l:l i="190">á¹ </l:l>
+<l:l i="190">ṡ</l:l>
+<l:l i="190">á¹¢</l:l>
+<l:l i="190">á¹£</l:l>
+<l:l i="190">Ṥ</l:l>
+<l:l i="190">á¹¥</l:l>
+<l:l i="190">Ṧ</l:l>
+<l:l i="190">ṧ</l:l>
+<l:l i="190">Ṩ</l:l>
+<l:l i="190">ṩ</l:l>
+<l:l i="200">T</l:l>
+<l:l i="200">t</l:l>
+<l:l i="200">Å¢</l:l>
+<l:l i="200">Å£</l:l>
+<l:l i="200">Ť</l:l>
+<l:l i="200">Å¥</l:l>
+<l:l i="200">Ŧ</l:l>
+<l:l i="200">ŧ</l:l>
+<l:l i="200">Æ«</l:l>
+<l:l i="200">Ƭ</l:l>
+<l:l i="200">Æ­</l:l>
+<l:l i="200">Æ®</l:l>
+<l:l i="200">ʈ</l:l>
+<l:l i="200">Èš</l:l>
+<l:l i="200">È›</l:l>
+<l:l i="200">ȶ</l:l>
+<l:l i="200">Ṫ</l:l>
+<l:l i="200">ṫ</l:l>
+<l:l i="200">Ṭ</l:l>
+<l:l i="200">á¹­</l:l>
+<l:l i="200">á¹®</l:l>
+<l:l i="200">ṯ</l:l>
+<l:l i="200">á¹°</l:l>
+<l:l i="200">á¹±</l:l>
+<l:l i="200">ẗ</l:l>
+<l:l i="205">Th</l:l>
+<l:l i="205">th</l:l>
+<l:l i="210">U</l:l>
+<l:l i="210">u</l:l>
+<l:l i="210">Ù</l:l>
+<l:l i="210">ù</l:l>
+<l:l i="210">Ú</l:l>
+<l:l i="210">ú</l:l>
+<l:l i="210">Û</l:l>
+<l:l i="210">û</l:l>
+<l:l i="210">Ü</l:l>
+<l:l i="210">ü</l:l>
+<l:l i="210">Ũ</l:l>
+<l:l i="210">Å©</l:l>
+<l:l i="210">Ū</l:l>
+<l:l i="210">Å«</l:l>
+<l:l i="210">Ŭ</l:l>
+<l:l i="210">Å­</l:l>
+<l:l i="210">Å®</l:l>
+<l:l i="210">ů</l:l>
+<l:l i="210">Å°</l:l>
+<l:l i="210">ű</l:l>
+<l:l i="210">Ų</l:l>
+<l:l i="210">ų</l:l>
+<l:l i="210">Ư</l:l>
+<l:l i="210">Æ°</l:l>
+<l:l i="210">Ç“</l:l>
+<l:l i="210">Ç”</l:l>
+<l:l i="210">Ç•</l:l>
+<l:l i="210">Ç–</l:l>
+<l:l i="210">Ç—</l:l>
+<l:l i="210">ǘ</l:l>
+<l:l i="210">Ç™</l:l>
+<l:l i="210">Çš</l:l>
+<l:l i="210">Ç›</l:l>
+<l:l i="210">ǜ</l:l>
+<l:l i="210">È”</l:l>
+<l:l i="210">È•</l:l>
+<l:l i="210">È–</l:l>
+<l:l i="210">È—</l:l>
+<l:l i="210">á¹²</l:l>
+<l:l i="210">á¹³</l:l>
+<l:l i="210">á¹´</l:l>
+<l:l i="210">á¹µ</l:l>
+<l:l i="210">Ṷ</l:l>
+<l:l i="210">á¹·</l:l>
+<l:l i="210">Ṹ</l:l>
+<l:l i="210">á¹¹</l:l>
+<l:l i="210">Ṻ</l:l>
+<l:l i="210">á¹»</l:l>
+<l:l i="210">Ụ</l:l>
+<l:l i="210">ụ</l:l>
+<l:l i="210">Ủ</l:l>
+<l:l i="210">ủ</l:l>
+<l:l i="210">Ứ</l:l>
+<l:l i="210">ứ</l:l>
+<l:l i="210">Ừ</l:l>
+<l:l i="210">ừ</l:l>
+<l:l i="210">Ử</l:l>
+<l:l i="210">á»­</l:l>
+<l:l i="210">á»®</l:l>
+<l:l i="210">ữ</l:l>
+<l:l i="210">á»°</l:l>
+<l:l i="210">á»±</l:l>
+<l:l i="220">V</l:l>
+<l:l i="220">v</l:l>
+<l:l i="220">Ʋ</l:l>
+<l:l i="220">Ê‹</l:l>
+<l:l i="220">á¹¼</l:l>
+<l:l i="220">á¹½</l:l>
+<l:l i="220">á¹¾</l:l>
+<l:l i="220">ṿ</l:l>
+<l:l i="230">W</l:l>
+<l:l i="230">w</l:l>
+<l:l i="230">Å´</l:l>
+<l:l i="230">ŵ</l:l>
+<l:l i="230">Ẁ</l:l>
+<l:l i="230">áº</l:l>
+<l:l i="230">Ẃ</l:l>
+<l:l i="230">ẃ</l:l>
+<l:l i="230">Ẅ</l:l>
+<l:l i="230">ẅ</l:l>
+<l:l i="230">Ẇ</l:l>
+<l:l i="230">ẇ</l:l>
+<l:l i="230">Ẉ</l:l>
+<l:l i="230">ẉ</l:l>
+<l:l i="230">ẘ</l:l>
+<l:l i="240">X</l:l>
+<l:l i="240">x</l:l>
+<l:l i="240">Ẋ</l:l>
+<l:l i="240">ẋ</l:l>
+<l:l i="240">Ẍ</l:l>
+<l:l i="240">áº</l:l>
+<l:l i="250">Y</l:l>
+<l:l i="250">y</l:l>
+<l:l i="250">Ã</l:l>
+<l:l i="250">ý</l:l>
+<l:l i="250">ÿ</l:l>
+<l:l i="250">Ÿ</l:l>
+<l:l i="250">Ŷ</l:l>
+<l:l i="250">Å·</l:l>
+<l:l i="250">Ƴ</l:l>
+<l:l i="250">Æ´</l:l>
+<l:l i="250">Ȳ</l:l>
+<l:l i="250">ȳ</l:l>
+<l:l i="250">Ẏ</l:l>
+<l:l i="250">áº</l:l>
+<l:l i="250">ẙ</l:l>
+<l:l i="250">Ỳ</l:l>
+<l:l i="250">ỳ</l:l>
+<l:l i="250">á»´</l:l>
+<l:l i="250">ỵ</l:l>
+<l:l i="250">Ỷ</l:l>
+<l:l i="250">á»·</l:l>
+<l:l i="250">Ỹ</l:l>
+<l:l i="250">ỹ</l:l>
+<l:l i="260">Z</l:l>
+<l:l i="260">z</l:l>
+<l:l i="260">Ź</l:l>
+<l:l i="260">ź</l:l>
+<l:l i="260">Å»</l:l>
+<l:l i="260">ż</l:l>
+<l:l i="260">Ž</l:l>
+<l:l i="260">ž</l:l>
+<l:l i="260">Ƶ</l:l>
+<l:l i="260">ƶ</l:l>
+<l:l i="260">Ȥ</l:l>
+<l:l i="260">È¥</l:l>
+<l:l i="260">Ê</l:l>
+<l:l i="260">Ê‘</l:l>
+<l:l i="260">áº</l:l>
+<l:l i="260">ẑ</l:l>
+<l:l i="260">Ẓ</l:l>
+<l:l i="260">ẓ</l:l>
+<l:l i="260">Ẕ</l:l>
+<l:l i="260">ẕ</l:l>
+</l:letters>
+</l:l10n>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/da.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/da.xml
new file mode 100644
index 0000000..90eb01c
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/da.xml
@@ -0,0 +1,664 @@
+<?xml version="1.0" encoding="utf-8"?>
+<l:l10n xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0" language="da" english-language-name="Danish">
+
+<!-- * This file is generated automatically. -->
+<!-- * To submit changes to this file upstream (to the DocBook Project) -->
+<!-- * do not submit an edited version of this file. Instead, submit an -->
+<!-- * edited version of the source file at the following location: -->
+<!-- * -->
+<!-- * https://docbook.svn.sourceforge.net/svnroot/docbook/trunk/gentext/locale/da.xml -->
+<!-- * -->
+<!-- * E-mail the edited da.xml source file to: -->
+<!-- * -->
+<!-- * docbook-developers@lists.sourceforge.net -->
+
+<!-- ******************************************************************** -->
+
+<!-- This file is part of the XSL DocBook Stylesheet distribution. -->
+<!-- See ../README or http://docbook.sf.net/release/xsl/current/ for -->
+<!-- copyright and other information. -->
+
+<!-- ******************************************************************** -->
+<!-- In these files, % with a letter is used for a placeholder: -->
+<!-- %t is the current element's title -->
+<!-- %s is the current element's subtitle (if applicable)-->
+<!-- %n is the current element's number label-->
+<!-- %p is the current element's page number (if applicable)-->
+<!-- ******************************************************************** -->
+
+
+<l:gentext key="Abstract" text="Resumé"/>
+<l:gentext key="abstract" text="resumé"/>
+<l:gentext key="Acknowledgements" text="Erkendelser"/>
+<l:gentext key="acknowledgements" text="erkendelser"/>
+<l:gentext key="Answer" text="Svar:"/>
+<l:gentext key="answer" text="svar:"/>
+<l:gentext key="Appendix" text="Appendiks"/>
+<l:gentext key="appendix" text="appendiks"/>
+<l:gentext key="Article" text="Artikel"/>
+<l:gentext key="article" text="artikel"/>
+<l:gentext key="Author" text="Forfatter"/>
+<l:gentext key="Bibliography" text="Litteraturliste"/>
+<l:gentext key="bibliography" text="litteraturliste"/>
+<l:gentext key="Book" text="Bog"/>
+<l:gentext key="book" text="bog"/>
+<l:gentext key="CAUTION" text="PAS PÃ…"/>
+<l:gentext key="Caution" text="Pas på"/>
+<l:gentext key="caution" text="pas på"/>
+<l:gentext key="Chapter" text="Kapitel"/>
+<l:gentext key="chapter" text="kapitel"/>
+<l:gentext key="Colophon" text="Kolofon"/>
+<l:gentext key="colophon" text="kolofon"/>
+<l:gentext key="Copyright" text="Ophavsret"/>
+<l:gentext key="copyright" text="ophavsret"/>
+<l:gentext key="Dedication" text="Tilegnet"/>
+<l:gentext key="dedication" text="tilegnet"/>
+<l:gentext key="Edition" text="Udgave"/>
+<l:gentext key="edition" text="udgave"/>
+<l:gentext key="Editor" text="Redaktør"/>
+<l:gentext key="Equation" text="Ligning"/>
+<l:gentext key="equation" text="ligning"/>
+<l:gentext key="Example" text="Eksempel"/>
+<l:gentext key="example" text="eksempel"/>
+<l:gentext key="Figure" text="Figur"/>
+<l:gentext key="figure" text="figur"/>
+<l:gentext key="Glossary" text="Ordliste"/>
+<l:gentext key="glossary" text="ordliste"/>
+<l:gentext key="GlossSee" text="Se"/>
+<l:gentext key="glosssee" text="se"/>
+<l:gentext key="GlossSeeAlso" text="Se også"/>
+<l:gentext key="glossseealso" text="se også"/>
+<l:gentext key="IMPORTANT" text="VIGTIGT"/>
+<l:gentext key="important" text="vigtigt"/>
+<l:gentext key="Important" text="Vigtigt"/>
+<l:gentext key="Index" text="Stikordsregister"/>
+<l:gentext key="index" text="stikordsregister"/>
+<l:gentext key="ISBN" text="ISBN"/>
+<l:gentext key="isbn" text="ISBN"/>
+<l:gentext key="LegalNotice" text="Retslig note"/>
+<l:gentext key="legalnotice" text="retslig note"/>
+<l:gentext key="MsgAud" text="MÃ¥lgruppe"/>
+<l:gentext key="msgaud" text="målgruppe"/>
+<l:gentext key="MsgLevel" text="Niveau"/>
+<l:gentext key="msglevel" text="niveau"/>
+<l:gentext key="MsgOrig" text="Grundlag"/>
+<l:gentext key="msgorig" text="grundlag"/>
+<l:gentext key="NOTE" text="BEMÆRK"/>
+<l:gentext key="Note" text="Bemærk"/>
+<l:gentext key="note" text="bemærk"/>
+<l:gentext key="Part" text="Del"/>
+<l:gentext key="part" text="del"/>
+<l:gentext key="Preface" text="Forord"/>
+<l:gentext key="preface" text="forord"/>
+<l:gentext key="Procedure" text="Procedure"/>
+<l:gentext key="procedure" text="procedure"/>
+<l:gentext key="ProductionSet" text="Produktion"/>
+<l:gentext key="PubDate" text="Udgivelsesdato"/>
+<l:gentext key="pubdate" text="udgivelsesdato"/>
+<l:gentext key="Published" text="Udgivet"/>
+<l:gentext key="published" text="udgivet"/>
+<l:gentext key="Publisher" text="Udgiver"/>
+<l:gentext key="Qandadiv" text="Spørgsmål og Svar"/>
+<l:gentext key="qandadiv" text="Spørgsmål og Svar"/>
+<l:gentext key="QandASet" text="Ofte stillede spørgsmål"/>
+<l:gentext key="Question" text="Spørgsmål:"/>
+<l:gentext key="question" text="spørgsmål:"/>
+<l:gentext key="RefEntry" text="Side"/>
+<l:gentext key="refentry" text="side"/>
+<l:gentext key="Reference" text="Henvisning"/>
+<l:gentext key="reference" text="henvisning"/>
+<l:gentext key="References" text="Henvisninger"/>
+<l:gentext key="RefName" text="Navn"/>
+<l:gentext key="refname" text="navn"/>
+<l:gentext key="RefSection" text="Afsnit"/>
+<l:gentext key="refsection" text="afsnit"/>
+<l:gentext key="RefSynopsisDiv" text="Synopsis"/>
+<l:gentext key="refsynopsisdiv" text="synopsis"/>
+<l:gentext key="RevHistory" text="Revisionshistorie"/>
+<l:gentext key="revhistory" text="revisionshistorie"/>
+<l:gentext key="revision" text="revision"/>
+<l:gentext key="Revision" text="Revision"/>
+<l:gentext key="sect1" text="Afsnit"/>
+<l:gentext key="sect2" text="Afsnit"/>
+<l:gentext key="sect3" text="Afsnit"/>
+<l:gentext key="sect4" text="Afsnit"/>
+<l:gentext key="sect5" text="Afsnit"/>
+<l:gentext key="section" text="afsnit"/>
+<l:gentext key="Section" text="Afsnit"/>
+<l:gentext key="see" text="se"/>
+<l:gentext key="See" text="Se"/>
+<l:gentext key="seealso" text="se også"/>
+<l:gentext key="Seealso" text="Se også"/>
+<l:gentext key="SeeAlso" text="Se Også"/>
+<l:gentext key="set" text="sæt"/>
+<l:gentext key="Set" text="Sæt"/>
+<l:gentext key="setindex" text="sæt indeks"/>
+<l:gentext key="SetIndex" text="Sæt indeks"/>
+<l:gentext key="Sidebar" text="Sidebjælke"/>
+<l:gentext key="sidebar" text="sidebjælke"/>
+<l:gentext key="step" text="trin"/>
+<l:gentext key="Step" text="Trin"/>
+<l:gentext key="table" text="tabel"/>
+<l:gentext key="Table" text="Tabel"/>
+<l:gentext key="task" text="opgave"/>
+<l:gentext key="Task" text="Opgave"/>
+<l:gentext key="tip" text="vink"/>
+<l:gentext key="TIP" text="VINK"/>
+<l:gentext key="Tip" text="Vink"/>
+<l:gentext key="Warning" text="Advarsel"/>
+<l:gentext key="warning" text="advarsel"/>
+<l:gentext key="WARNING" text="ADVARSEL"/>
+<l:gentext key="and" text="og"/>
+<l:gentext key="by" text="af"/>
+<l:gentext key="Edited" text="Redigeret"/>
+<l:gentext key="edited" text="redigeret"/>
+<l:gentext key="Editedby" text="Redigeret af"/>
+<l:gentext key="editedby" text="redigeret af"/>
+<l:gentext key="in" text="i"/>
+<l:gentext key="lastlistcomma" text=""/>
+<l:gentext key="listcomma" text=", "/>
+<l:gentext key="notes" text="slutbemærkning:"/>
+<l:gentext key="Notes" text="Slutbemærkning:"/>
+<l:gentext key="Pgs" text="Siderne"/>
+<l:gentext key="pgs" text="siderne"/>
+<l:gentext key="Revisedby" text="Revideret af: "/>
+<l:gentext key="revisedby" text="revideret af: "/>
+<l:gentext key="TableNotes" text="Noter:"/>
+<l:gentext key="tablenotes" text="noter:"/>
+<l:gentext key="TableofContents" text="Indholdsfortegnelse"/>
+<l:gentext key="tableofcontents" text="indholdsfortegnelse"/>
+<l:gentext key="unexpectedelementname" text="uventet elementnavn"/>
+<l:gentext key="unsupported" text="ikke understøttet"/>
+<l:gentext key="xrefto" text="krydshenvisning til"/>
+<l:gentext key="Authors" text="Forfattere"/>
+<l:gentext key="copyeditor" text="Kopieringsredaktør"/>
+<l:gentext key="graphicdesigner" text="Grafisk designer"/>
+<l:gentext key="productioneditor" text="Produktionsredaktør"/>
+<l:gentext key="technicaleditor" text="Tekniskredaktør"/>
+<l:gentext key="translator" text="Oversætter"/>
+<l:gentext key="listofequations" text="ligningsliste"/>
+<l:gentext key="ListofEquations" text="Ligningsliste"/>
+<l:gentext key="ListofExamples" text="Eksempelliste"/>
+<l:gentext key="listofexamples" text="eksempelliste"/>
+<l:gentext key="ListofFigures" text="Figurliste"/>
+<l:gentext key="listoffigures" text="figurliste"/>
+<l:gentext key="ListofProcedures" text="Procedureliste"/>
+<l:gentext key="listofprocedures" text="lrocedureliste"/>
+<l:gentext key="listoftables" text="tabelliste"/>
+<l:gentext key="ListofTables" text="Tabelliste"/>
+<l:gentext key="ListofUnknown" text="Liste over ukendte"/>
+<l:gentext key="listofunknown" text="liste over ukendte"/>
+<l:gentext key="nav-home" text="hjem"/>
+<l:gentext key="nav-next" text="næste"/>
+<l:gentext key="nav-next-sibling" text="hurtigt fremad"/>
+<l:gentext key="nav-prev" text="forrige"/>
+<l:gentext key="nav-prev-sibling" text="hurtigt tilbage"/>
+<l:gentext key="nav-up" text="op"/>
+<l:gentext key="nav-toc" text="Indholdsfortegnelse"/>
+<l:gentext key="Draft" text="Kladde"/>
+<l:gentext key="above" text="over"/>
+<l:gentext key="below" text="under"/>
+<l:gentext key="sectioncalled" text="afsnittet der hedder"/>
+<l:gentext key="index symbols" text="symboler"/>
+<l:gentext key="writing-mode" text="lr-tb"/>
+<l:gentext key="lowercase.alpha" text="abcdefghijklmnopqrstuvwxyzæøå"/>
+<l:gentext key="uppercase.alpha" text="ABCDEFGHIJKLMNOPQRSTUVWXYZÆØÅ"/>
+<l:gentext key="normalize.sort.input" text="AaÀàÃáÂâÃãÄäÅåĀÄĂ㥹ÇǎǞǟǠǡǺǻȀÈȂȃȦȧḀá¸áºšáº áº¡áº¢áº£áº¤áº¥áº¦áº§áº¨áº©áºªáº«áº¬áº­áº®áº¯áº°áº±áº²áº³áº´áºµáº¶áº·BbÆ€ÆɓƂƃḂḃḄḅḆḇCcÇçĆćĈĉĊċČÄƇƈɕḈḉDdÄŽÄÄđƊɗƋƌDžDzȡɖḊḋḌá¸á¸Žá¸á¸á¸‘ḒḓEeÈèÉéÊêËëĒēĔĕĖėĘęĚěȄȅȆȇȨȩḔḕḖḗḘḙḚḛḜá¸áº¸áº¹áººáº»áº¼áº½áº¾áº¿á»€á»á»‚ểỄễỆệFfƑƒḞḟGgÄœÄĞğĠġĢģƓɠǤǥǦǧǴǵḠḡHhĤĥĦħȞȟɦḢḣḤḥḦḧḨḩḪḫẖIiÌìÃíÎîÃïĨĩĪīĬĭĮįİƗɨÇÇȈȉȊȋḬḭḮḯỈỉỊịJjĴĵǰÊKkĶķƘƙǨǩḰḱḲḳḴḵLlĹĺĻļĽľĿŀÅłƚLjȴɫɬɭḶḷḸḹḺḻḼḽMmɱḾḿṀá¹á¹‚ṃNnÑñŃńŅņŇňÆɲƞȠNjǸǹȵɳṄṅṆṇṈṉṊṋOoÒòÓóÔôÕõÖöØøŌÅÅŽÅÅőƟƠơǑǒǪǫǬǭǾǿȌÈÈŽÈȪȫȬȭȮȯȰȱṌá¹á¹Žá¹á¹á¹‘ṒṓỌá»á»Žá»á»á»‘ỒồỔổỖỗỘộỚớỜá»á»žá»Ÿá» á»¡á»¢á»£PpƤƥṔṕṖṗQqÊ RrŔŕŖŗŘřÈȑȒȓɼɽɾṘṙṚṛṜá¹á¹žá¹ŸSsŚśŜÅŞşŠšȘșʂṠṡṢṣṤṥṦṧṨṩTtŢţŤťŦŧƫƬƭƮʈȚțȶṪṫṬṭṮṯṰṱẗUuÙùÚúÛûÜüŨũŪūŬŭŮůŰűŲųƯưǓǔǕǖǗǘǙǚǛǜȔȕȖȗṲṳṴṵṶṷṸṹṺṻỤụỦủỨứỪừỬửỮữỰựVvƲʋṼṽṾṿWwŴŵẀáºáº‚ẃẄẅẆẇẈẉẘXxẊẋẌáºYyÃýÿŸŶŷƳƴȲȳẎáºáº™á»²á»³á»´á»µá»¶á»·á»¸á»¹ZzŹźŻżŽžƵƶȤȥÊÊ‘áºáº‘ẒẓẔẕẕ" lang="en"/>
+<l:gentext key="normalize.sort.output" text="AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBCCCCCCCCCCCCCCCCCDDDDDDDDDDDDDDDDDDDDDDDDEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEFFFFFFGGGGGGGGGGGGGGGGGGGGHHHHHHHHHHHHHHHHHHHHIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIJJJJJJKKKKKKKKKKKKKKLLLLLLLLLLLLLLLLLLLLLLLLLLMMMMMMMMMNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOPPPPPPPPQQQRRRRRRRRRRRRRRRRRRRRRRRSSSSSSSSSSSSSSSSSSSSSSSTTTTTTTTTTTTTTTTTTTTTTTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUVVVVVVVVWWWWWWWWWWWWWWWXXXXXXYYYYYYYYYYYYYYYYYYYYYYYZZZZZZZZZZZZZZZZZZZZZ" lang="en"/>
+<l:dingbat key="startquote" text="“"/>
+<l:dingbat key="endquote" text="â€"/>
+<l:dingbat key="nestedstartquote" text="‘"/>
+<l:dingbat key="nestedendquote" text="’"/>
+<l:dingbat key="singlestartquote" text="‘" lang="en"/>
+<l:dingbat key="singleendquote" text="’" lang="en"/>
+<l:dingbat key="bullet" text="•"/>
+<l:gentext key="hyphenation-character" text="-"/>
+<l:gentext key="hyphenation-push-character-count" text="2"/>
+<l:gentext key="hyphenation-remain-character-count" text="2"/>
+<l:context name="styles"><l:template name="person-name" text="first-last"/>
+</l:context>
+<l:context name="title"><l:template name="abstract" text="%t"/>
+<l:template name="acknowledgements" text="%t" lang="en"/>
+<l:template name="answer" text="%t"/>
+<l:template name="appendix" text="Appendiks %n. %t"/>
+<l:template name="article" text="%t"/>
+<l:template name="authorblurb" text="%t"/>
+<l:template name="bibliodiv" text="%t"/>
+<l:template name="biblioentry" text="%t"/>
+<l:template name="bibliography" text="%t"/>
+<l:template name="bibliolist" text="%t" lang="en"/>
+<l:template name="bibliomixed" text="%t"/>
+<l:template name="bibliomset" text="%t"/>
+<l:template name="biblioset" text="%t"/>
+<l:template name="blockquote" text="%t"/>
+<l:template name="book" text="%t"/>
+<l:template name="calloutlist" text="%t"/>
+<l:template name="caution" text="%t"/>
+<l:template name="chapter" text="Kapitel %n. %t"/>
+<l:template name="colophon" text="%t"/>
+<l:template name="dedication" text="%t"/>
+<l:template name="equation" text="Ligning %n. %t"/>
+<l:template name="example" text="Eksempel %n. %t"/>
+<l:template name="figure" text="Figur %n. %t"/>
+<l:template name="foil" text="%t" lang="en"/>
+<l:template name="foilgroup" text="%t" lang="en"/>
+<l:template name="formalpara" text="%t"/>
+<l:template name="glossary" text="%t"/>
+<l:template name="glossdiv" text="%t"/>
+<l:template name="glosslist" text="%t" lang="en"/>
+<l:template name="glossentry" text="%t" lang="en"/>
+<l:template name="important" text="%t"/>
+<l:template name="index" text="%t"/>
+<l:template name="indexdiv" text="%t"/>
+<l:template name="itemizedlist" text="%t"/>
+<l:template name="legalnotice" text="%t"/>
+<l:template name="listitem" text=""/>
+<l:template name="lot" text="%t"/>
+<l:template name="msg" text="%t"/>
+<l:template name="msgexplan" text="%t"/>
+<l:template name="msgmain" text="%t"/>
+<l:template name="msgrel" text="%t"/>
+<l:template name="msgset" text="%t"/>
+<l:template name="msgsub" text="%t"/>
+<l:template name="note" text="%t"/>
+<l:template name="orderedlist" text="%t"/>
+<l:template name="part" text="Del %n. %t"/>
+<l:template name="partintro" text="%t"/>
+<l:template name="preface" text="%t"/>
+<l:template name="procedure" text="%t"/>
+<l:template name="procedure.formal" text="Procedure %n. %t"/>
+<l:template name="productionset" text="%t"/>
+<l:template name="productionset.formal" text="Produktion %n"/>
+<l:template name="qandadiv" text="%t"/>
+<l:template name="qandaentry" text="%t"/>
+<l:template name="qandaset" text="%t"/>
+<l:template name="question" text="Spørgsmål: %n"/>
+<l:template name="refentry" text="%t"/>
+<l:template name="reference" text="%t"/>
+<l:template name="refsection" text="%t"/>
+<l:template name="refsect1" text="%t"/>
+<l:template name="refsect2" text="%t"/>
+<l:template name="refsect3" text="%t"/>
+<l:template name="refsynopsisdiv" text="%t"/>
+<l:template name="refsynopsisdivinfo" text="%t"/>
+<l:template name="segmentedlist" text="%t"/>
+<l:template name="set" text="%t"/>
+<l:template name="setindex" text="%t"/>
+<l:template name="sidebar" text="%t"/>
+<l:template name="step" text="%t"/>
+<l:template name="table" text="Tabel %n. %t"/>
+<l:template name="task" text="%t" lang="en"/>
+<l:template name="tasksummary" text="%t" lang="en"/>
+<l:template name="taskprerequisites" text="%t" lang="en"/>
+<l:template name="taskrelated" text="%t" lang="en"/>
+<l:template name="tip" text="%t"/>
+<l:template name="toc" text="%t"/>
+<l:template name="variablelist" text="%t"/>
+<l:template name="varlistentry" text=""/>
+<l:template name="warning" text="%t"/>
+</l:context>
+<l:context name="title-unnumbered"><l:template name="appendix" text="%t"/>
+<l:template name="article/appendix" text="%t" lang="en"/>
+<l:template name="bridgehead" text="%t"/>
+<l:template name="chapter" text="%t"/>
+<l:template name="sect1" text="%t"/>
+<l:template name="sect2" text="%t"/>
+<l:template name="sect3" text="%t"/>
+<l:template name="sect4" text="%t"/>
+<l:template name="sect5" text="%t"/>
+<l:template name="section" text="%t"/>
+<l:template name="simplesect" text="%t"/>
+<l:template name="part" text="%t" lang="en"/>
+</l:context>
+<l:context name="title-numbered"><l:template name="appendix" text="Appendiks %n. %t"/>
+<l:template name="article/appendix" text="%n. %t" lang="en"/>
+<l:template name="bridgehead" text="%n. %t"/>
+<l:template name="chapter" text="Kapitel %n. %t"/>
+<l:template name="part" text="Del %n. %t"/>
+<l:template name="sect1" text="%n. %t"/>
+<l:template name="sect2" text="%n. %t"/>
+<l:template name="sect3" text="%n. %t"/>
+<l:template name="sect4" text="%n. %t"/>
+<l:template name="sect5" text="%n. %t"/>
+<l:template name="section" text="%n. %t"/>
+<l:template name="simplesect" text="%t"/>
+</l:context>
+<l:context name="subtitle"><l:template name="appendix" text="%s"/>
+<l:template name="acknowledgements" text="%s" lang="en"/>
+<l:template name="article" text="%s"/>
+<l:template name="bibliodiv" text="%s"/>
+<l:template name="biblioentry" text="%s"/>
+<l:template name="bibliography" text="%s"/>
+<l:template name="bibliomixed" text="%s"/>
+<l:template name="bibliomset" text="%s"/>
+<l:template name="biblioset" text="%s"/>
+<l:template name="book" text="%s"/>
+<l:template name="chapter" text="%s"/>
+<l:template name="colophon" text="%s"/>
+<l:template name="dedication" text="%s"/>
+<l:template name="glossary" text="%s"/>
+<l:template name="glossdiv" text="%s"/>
+<l:template name="index" text="%s"/>
+<l:template name="indexdiv" text="%s"/>
+<l:template name="lot" text="%s"/>
+<l:template name="part" text="%s"/>
+<l:template name="partintro" text="%s"/>
+<l:template name="preface" text="%s"/>
+<l:template name="refentry" text="%s"/>
+<l:template name="reference" text="%s"/>
+<l:template name="refsection" text="%s"/>
+<l:template name="refsect1" text="%s"/>
+<l:template name="refsect2" text="%s"/>
+<l:template name="refsect3" text="%s"/>
+<l:template name="refsynopsisdiv" text="%s"/>
+<l:template name="sect1" text="%s"/>
+<l:template name="sect2" text="%s"/>
+<l:template name="sect3" text="%s"/>
+<l:template name="sect4" text="%s"/>
+<l:template name="sect5" text="%s"/>
+<l:template name="section" text="%s"/>
+<l:template name="set" text="%s"/>
+<l:template name="setindex" text="%s"/>
+<l:template name="sidebar" text="%s"/>
+<l:template name="simplesect" text="%s"/>
+<l:template name="toc" text="%s"/>
+</l:context>
+<l:context name="xref"><l:template name="abstract" text="%t"/>
+<l:template name="acknowledgements" text="%t" lang="en"/>
+<l:template name="answer" text="Svar: %n"/>
+<l:template name="appendix" text="%t"/>
+<l:template name="article" text="%t"/>
+<l:template name="authorblurb" text="%t"/>
+<l:template name="bibliodiv" text="%t"/>
+<l:template name="bibliography" text="%t"/>
+<l:template name="bibliomset" text="%t"/>
+<l:template name="biblioset" text="%t"/>
+<l:template name="blockquote" text="%t"/>
+<l:template name="book" text="%t"/>
+<l:template name="calloutlist" text="%t"/>
+<l:template name="caution" text="%t"/>
+<l:template name="chapter" text="%t"/>
+<l:template name="colophon" text="%t"/>
+<l:template name="constraintdef" text="%t"/>
+<l:template name="dedication" text="%t"/>
+<l:template name="equation" text="%t"/>
+<l:template name="example" text="%t"/>
+<l:template name="figure" text="%t"/>
+<l:template name="foil" text="%t" lang="en"/>
+<l:template name="foilgroup" text="%t" lang="en"/>
+<l:template name="formalpara" text="%t"/>
+<l:template name="glossary" text="%t"/>
+<l:template name="glossdiv" text="%t"/>
+<l:template name="important" text="%t"/>
+<l:template name="index" text="%t"/>
+<l:template name="indexdiv" text="%t"/>
+<l:template name="itemizedlist" text="%t"/>
+<l:template name="legalnotice" text="%t"/>
+<l:template name="listitem" text="%n"/>
+<l:template name="lot" text="%t"/>
+<l:template name="msg" text="%t"/>
+<l:template name="msgexplan" text="%t"/>
+<l:template name="msgmain" text="%t"/>
+<l:template name="msgrel" text="%t"/>
+<l:template name="msgset" text="%t"/>
+<l:template name="msgsub" text="%t"/>
+<l:template name="note" text="%t"/>
+<l:template name="orderedlist" text="%t"/>
+<l:template name="part" text="%t"/>
+<l:template name="partintro" text="%t"/>
+<l:template name="preface" text="%t"/>
+<l:template name="procedure" text="%t"/>
+<l:template name="productionset" text="%t"/>
+<l:template name="qandadiv" text="%t"/>
+<l:template name="qandaentry" text="Spørgsmål: %n"/>
+<l:template name="qandaset" text="%t"/>
+<l:template name="question" text="Spørgsmål: %n"/>
+<l:template name="reference" text="%t"/>
+<l:template name="refsynopsisdiv" text="%t"/>
+<l:template name="segmentedlist" text="%t"/>
+<l:template name="set" text="%t"/>
+<l:template name="setindex" text="%t"/>
+<l:template name="sidebar" text="%t"/>
+<l:template name="table" text="%t"/>
+<l:template name="task" text="%t" lang="en"/>
+<l:template name="tip" text="%t"/>
+<l:template name="toc" text="%t"/>
+<l:template name="variablelist" text="%t"/>
+<l:template name="varlistentry" text="%n"/>
+<l:template name="warning" text="%t"/>
+<l:template name="olink.document.citation" text=" in %o" lang="en"/>
+<l:template name="olink.page.citation" text=" (page %p)" lang="en"/>
+<l:template name="page.citation" text=" [%p]"/>
+<l:template name="page" text="(page %p)" lang="en"/>
+<l:template name="docname" text=" in %o" lang="en"/>
+<l:template name="docnamelong" text=" in the document titled %o" lang="en"/>
+<l:template name="pageabbrev" text="(p. %p)" lang="en"/>
+<l:template name="Page" text="Page %p" lang="en"/>
+<l:template name="bridgehead" text="afsnittet der hedder “%tâ€"/>
+<l:template name="refsection" text="“%tâ€"/>
+<l:template name="refsect1" text="“%tâ€"/>
+<l:template name="refsect2" text="“%tâ€"/>
+<l:template name="refsect3" text="“%tâ€"/>
+<l:template name="sect1" text="“%tâ€"/>
+<l:template name="sect2" text="“%tâ€"/>
+<l:template name="sect3" text="“%tâ€"/>
+<l:template name="sect4" text="“%tâ€"/>
+<l:template name="sect5" text="“%tâ€"/>
+<l:template name="section" text="“%tâ€"/>
+<l:template name="simplesect" text="“%tâ€"/>
+</l:context>
+<l:context name="xref-number"><l:template name="answer" text="Svar: %n"/>
+<l:template name="appendix" text="Appendiks %n"/>
+<l:template name="bridgehead" text="Afsnit %n"/>
+<l:template name="chapter" text="Kapitel %n"/>
+<l:template name="equation" text="Ligning %n"/>
+<l:template name="example" text="Eksempel %n"/>
+<l:template name="figure" text="Figur %n"/>
+<l:template name="part" text="Del %n"/>
+<l:template name="procedure" text="Procedure %n"/>
+<l:template name="productionset" text="Produktion %n"/>
+<l:template name="qandadiv" text="Spørgsmål og Svar %n"/>
+<l:template name="qandaentry" text="Spørgsmål: %n"/>
+<l:template name="question" text="Spørgsmål: %n"/>
+<l:template name="sect1" text="Afsnit %n"/>
+<l:template name="sect2" text="Afsnit %n"/>
+<l:template name="sect3" text="Afsnit %n"/>
+<l:template name="sect4" text="Afsnit %n"/>
+<l:template name="sect5" text="Afsnit %n"/>
+<l:template name="section" text="Afsnit %n"/>
+<l:template name="table" text="Tabel %n"/>
+</l:context>
+<l:context name="xref-number-and-title"><l:template name="appendix" text="Appendiks %n, %t"/>
+<l:template name="bridgehead" text="Afsnit %n, “%tâ€"/>
+<l:template name="chapter" text="Kapitel %n, %t"/>
+<l:template name="equation" text="Ligning %n, “%tâ€"/>
+<l:template name="example" text="Eksempel %n, “%tâ€"/>
+<l:template name="figure" text="Figur %n, “%tâ€"/>
+<l:template name="part" text="Del %n, “%tâ€"/>
+<l:template name="procedure" text="Procedure %n, “%tâ€"/>
+<l:template name="productionset" text="Produktion %n, “%tâ€"/>
+<l:template name="qandadiv" text="SpørgsmÃ¥l og Svar %n, “%tâ€"/>
+<l:template name="refsect1" text="afsnittet der hedder “%tâ€"/>
+<l:template name="refsect2" text="afsnittet der hedder “%tâ€"/>
+<l:template name="refsect3" text="afsnittet der hedder “%tâ€"/>
+<l:template name="refsection" text="afsnittet der hedder “%tâ€"/>
+<l:template name="sect1" text="Afsnit %n, “%tâ€"/>
+<l:template name="sect2" text="Afsnit %n, “%tâ€"/>
+<l:template name="sect3" text="Afsnit %n, “%tâ€"/>
+<l:template name="sect4" text="Afsnit %n, “%tâ€"/>
+<l:template name="sect5" text="Afsnit %n, “%tâ€"/>
+<l:template name="section" text="Afsnit %n, “%tâ€"/>
+<l:template name="simplesect" text="afsnittet der hedder “%tâ€"/>
+<l:template name="table" text="Tabel %n, “%tâ€"/>
+</l:context>
+<l:context name="authorgroup"><l:template name="sep" text=", "/>
+<l:template name="sep2" text=" og "/>
+<l:template name="seplast" text=" og "/>
+</l:context>
+<l:context name="glossary"><l:template name="see" text="Se %t."/>
+<l:template name="seealso" text="Se også %t."/>
+<l:template name="seealso-separator" text=", "/>
+</l:context>
+<l:context name="msgset"><l:template name="MsgAud" text="MÃ¥lgruppe: "/>
+<l:template name="MsgLevel" text="Niveau: "/>
+<l:template name="MsgOrig" text="Grundlag: "/>
+</l:context>
+<l:context name="datetime"><l:template name="format" text="d/m/Y"/>
+</l:context>
+<l:context name="termdef"><l:template name="prefix" text="[Definition: "/>
+<l:template name="suffix" text="]"/>
+</l:context>
+<l:context name="datetime-full"><l:template name="January" text="Januar"/>
+<l:template name="February" text="Februar"/>
+<l:template name="March" text="Marts"/>
+<l:template name="April" text="April"/>
+<l:template name="May" text="Maj"/>
+<l:template name="June" text="Juni"/>
+<l:template name="July" text="July"/>
+<l:template name="August" text="August"/>
+<l:template name="September" text="September"/>
+<l:template name="October" text="Oktober"/>
+<l:template name="November" text="November"/>
+<l:template name="December" text="December"/>
+<l:template name="Monday" text="Mandag"/>
+<l:template name="Tuesday" text="Tirsdag"/>
+<l:template name="Wednesday" text="Onsdag"/>
+<l:template name="Thursday" text="Torsdag"/>
+<l:template name="Friday" text="Fredag"/>
+<l:template name="Saturday" text="Lørdag"/>
+<l:template name="Sunday" text="Søndag"/>
+</l:context>
+<l:context name="datetime-abbrev"><l:template name="Jan" text="Jan"/>
+<l:template name="Feb" text="Feb"/>
+<l:template name="Mar" text="Mar"/>
+<l:template name="Apr" text="Apr"/>
+<l:template name="May" text="Maj"/>
+<l:template name="Jun" text="Jun"/>
+<l:template name="Jul" text="Jul"/>
+<l:template name="Aug" text="Aug"/>
+<l:template name="Sep" text="Sep"/>
+<l:template name="Oct" text="Okt"/>
+<l:template name="Nov" text="Nov"/>
+<l:template name="Dec" text="Dec"/>
+<l:template name="Mon" text="Man"/>
+<l:template name="Tue" text="Tir"/>
+<l:template name="Wed" text="ins"/>
+<l:template name="Thu" text="Tor"/>
+<l:template name="Fri" text="Fre"/>
+<l:template name="Sat" text="Lør"/>
+<l:template name="Sun" text="Søn"/>
+</l:context>
+<l:context name="htmlhelp"><l:template name="langcode" text="0x0406 Danish"/>
+</l:context>
+<l:context name="index"><l:template name="term-separator" text=", "/>
+<l:template name="number-separator" text=", "/>
+<l:template name="range-separator" text="-"/>
+</l:context>
+<l:context name="iso690"><l:template name="lastfirst.sep" text=", "/>
+<l:template name="alt.person.two.sep" text=" – "/>
+<l:template name="alt.person.last.sep" text=" – "/>
+<l:template name="alt.person.more.sep" text=" – "/>
+<l:template name="primary.editor" text=" (ed.)"/>
+<l:template name="primary.many" text=", et al."/>
+<l:template name="primary.sep" text=". "/>
+<l:template name="submaintitle.sep" text=": "/>
+<l:template name="title.sep" text=". "/>
+<l:template name="othertitle.sep" text=", "/>
+<l:template name="medium1" text=" ["/>
+<l:template name="medium2" text="]"/>
+<l:template name="secondary.person.sep" text="; "/>
+<l:template name="secondary.sep" text=". "/>
+<l:template name="respons.sep" text=". "/>
+<l:template name="edition.sep" text=". "/>
+<l:template name="edition.serial.sep" text=", "/>
+<l:template name="issuing.range" text="-"/>
+<l:template name="issuing.div" text=", "/>
+<l:template name="issuing.sep" text=". "/>
+<l:template name="partnr.sep" text=". "/>
+<l:template name="placepubl.sep" text=": "/>
+<l:template name="publyear.sep" text=", "/>
+<l:template name="pubinfo.sep" text=". "/>
+<l:template name="spec.pubinfo.sep" text=", "/>
+<l:template name="upd.sep" text=", "/>
+<l:template name="datecit1" text=" [cited "/>
+<l:template name="datecit2" text="]"/>
+<l:template name="extent.sep" text=". "/>
+<l:template name="locs.sep" text=", "/>
+<l:template name="location.sep" text=". "/>
+<l:template name="serie.sep" text=". "/>
+<l:template name="notice.sep" text=". "/>
+<l:template name="access" text="Available "/>
+<l:template name="acctoo" text="Also available "/>
+<l:template name="onwww" text="from World Wide Web"/>
+<l:template name="oninet" text="from Internet"/>
+<l:template name="access.end" text=": "/>
+<l:template name="link1" text="&lt;"/>
+<l:template name="link2" text="&gt;"/>
+<l:template name="access.sep" text=". "/>
+<l:template name="isbn" text="ISBN "/>
+<l:template name="issn" text="ISSN "/>
+<l:template name="stdnum.sep" text=". "/>
+<l:template name="patcountry.sep" text=". "/>
+<l:template name="pattype.sep" text=", "/>
+<l:template name="patnum.sep" text=". "/>
+<l:template name="patdate.sep" text=". "/>
+</l:context><l:letters><l:l i="1">A</l:l>
+<l:l i="1">a</l:l>
+<l:l i="2">B</l:l>
+<l:l i="2">b</l:l>
+<l:l i="3">C</l:l>
+<l:l i="3">c</l:l>
+<l:l i="4">D</l:l>
+<l:l i="4">d</l:l>
+<l:l i="5">E</l:l>
+<l:l i="5">e</l:l>
+<l:l i="6">F</l:l>
+<l:l i="6">f</l:l>
+<l:l i="7">G</l:l>
+<l:l i="7">g</l:l>
+<l:l i="8">H</l:l>
+<l:l i="8">h</l:l>
+<l:l i="9">I</l:l>
+<l:l i="9">i</l:l>
+<l:l i="10">J</l:l>
+<l:l i="10">j</l:l>
+<l:l i="11">K</l:l>
+<l:l i="11">k</l:l>
+<l:l i="12">L</l:l>
+<l:l i="12">l</l:l>
+<l:l i="13">M</l:l>
+<l:l i="13">m</l:l>
+<l:l i="14">N</l:l>
+<l:l i="14">n</l:l>
+<l:l i="15">O</l:l>
+<l:l i="15">o</l:l>
+<l:l i="16">P</l:l>
+<l:l i="16">p</l:l>
+<l:l i="17">Q</l:l>
+<l:l i="17">q</l:l>
+<l:l i="18">R</l:l>
+<l:l i="18">r</l:l>
+<l:l i="19">S</l:l>
+<l:l i="19">s</l:l>
+<l:l i="20">T</l:l>
+<l:l i="20">t</l:l>
+<l:l i="21">U</l:l>
+<l:l i="21">u</l:l>
+<l:l i="22">V</l:l>
+<l:l i="22">v</l:l>
+<l:l i="23">W</l:l>
+<l:l i="23">w</l:l>
+<l:l i="24">X</l:l>
+<l:l i="24">x</l:l>
+<l:l i="25">Y</l:l>
+<l:l i="25">y</l:l>
+<l:l i="26">Z</l:l>
+<l:l i="26">z</l:l>
+<l:l i="27">Æ</l:l>
+<l:l i="27">æ</l:l>
+<l:l i="28">Ø</l:l>
+<l:l i="28">ø</l:l>
+<l:l i="29">Ã…</l:l>
+<l:l i="29">Ã¥</l:l>
+</l:letters>
+</l:l10n>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/de.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/de.xml
new file mode 100644
index 0000000..0403153
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/de.xml
@@ -0,0 +1,666 @@
+<?xml version="1.0" encoding="utf-8"?>
+<l:l10n xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0" language="de" english-language-name="German">
+
+<!-- * This file is generated automatically. -->
+<!-- * To submit changes to this file upstream (to the DocBook Project) -->
+<!-- * do not submit an edited version of this file. Instead, submit an -->
+<!-- * edited version of the source file at the following location: -->
+<!-- * -->
+<!-- * https://docbook.svn.sourceforge.net/svnroot/docbook/trunk/gentext/locale/de.xml -->
+<!-- * -->
+<!-- * E-mail the edited de.xml source file to: -->
+<!-- * -->
+<!-- * docbook-developers@lists.sourceforge.net -->
+
+<!-- ******************************************************************** -->
+
+<!-- This file is part of the XSL DocBook Stylesheet distribution. -->
+<!-- See ../README or http://docbook.sf.net/release/xsl/current/ for -->
+<!-- copyright and other information. -->
+
+<!-- ******************************************************************** -->
+<!-- In these files, % with a letter is used for a placeholder: -->
+<!-- %t is the current element's title -->
+<!-- %s is the current element's subtitle (if applicable)-->
+<!-- %n is the current element's number label-->
+<!-- %p is the current element's page number (if applicable)-->
+<!-- ******************************************************************** -->
+
+
+<l:gentext key="Abstract" text="Zusammenfassung"/>
+<l:gentext key="abstract" text="Zusammenfassung"/>
+<l:gentext key="Acknowledgements" text="Danksagungen"/>
+<l:gentext key="acknowledgements" text="Danksagungen"/>
+<l:gentext key="Answer" text="A:"/>
+<l:gentext key="answer" text="A:"/>
+<l:gentext key="Appendix" text="Anhang"/>
+<l:gentext key="appendix" text="Anhang"/>
+<l:gentext key="Article" text="Artikel"/>
+<l:gentext key="article" text="Artikel"/>
+<l:gentext key="Author" text="Autor"/>
+<l:gentext key="Bibliography" text="Literaturverzeichnis"/>
+<l:gentext key="bibliography" text="Literaturverzeichnis"/>
+<l:gentext key="Book" text="Buch"/>
+<l:gentext key="book" text="Buch"/>
+<l:gentext key="CAUTION" text="ACHTUNG"/>
+<l:gentext key="Caution" text="Achtung"/>
+<l:gentext key="caution" text="Achtung"/>
+<l:gentext key="Chapter" text="Kapitel"/>
+<l:gentext key="chapter" text="Kapitel"/>
+<l:gentext key="Colophon" text="Kolophon"/>
+<l:gentext key="colophon" text="Kolophon"/>
+<l:gentext key="Copyright" text="Copyright"/>
+<l:gentext key="copyright" text="Copyright"/>
+<l:gentext key="Dedication" text="Widmung"/>
+<l:gentext key="dedication" text="Widmung"/>
+<l:gentext key="Edition" text="Ausgabe"/>
+<l:gentext key="edition" text="Ausgabe"/>
+<l:gentext key="Editor" text="Editor" lang="en"/>
+<l:gentext key="Equation" text="Gleichung"/>
+<l:gentext key="equation" text="Gleichung"/>
+<l:gentext key="Example" text="Beispiel"/>
+<l:gentext key="example" text="Beispiel"/>
+<l:gentext key="Figure" text="Abbildung"/>
+<l:gentext key="figure" text="Abbildung"/>
+<l:gentext key="Glossary" text="Glossar"/>
+<l:gentext key="glossary" text="Glossar"/>
+<l:gentext key="GlossSee" text="Siehe"/>
+<l:gentext key="glosssee" text="Siehe"/>
+<l:gentext key="GlossSeeAlso" text="Siehe auch"/>
+<l:gentext key="glossseealso" text="Siehe auch"/>
+<l:gentext key="IMPORTANT" text="WICHTIG"/>
+<l:gentext key="important" text="Wichtig"/>
+<l:gentext key="Important" text="Wichtig"/>
+<l:gentext key="Index" text="Stichwortverzeichnis"/>
+<l:gentext key="index" text="Stichwortverzeichnis"/>
+<l:gentext key="ISBN" text="ISBN"/>
+<l:gentext key="isbn" text="ISBN"/>
+<l:gentext key="LegalNotice" text="Rechtlicher Hinweis"/>
+<l:gentext key="legalnotice" text="Rechtlicher Hinweis"/>
+<l:gentext key="MsgAud" text="Zielgruppe"/>
+<l:gentext key="msgaud" text="Zielgruppe"/>
+<l:gentext key="MsgLevel" text="Dringlichkeit"/>
+<l:gentext key="msglevel" text="Dringlichkeit"/>
+<l:gentext key="MsgOrig" text="Ursprung"/>
+<l:gentext key="msgorig" text="Ursprung"/>
+<l:gentext key="NOTE" text="ANMERKUNG"/>
+<l:gentext key="Note" text="Anmerkung"/>
+<l:gentext key="note" text="Anmerkung"/>
+<l:gentext key="Part" text="Teil"/>
+<l:gentext key="part" text="Teil"/>
+<l:gentext key="Preface" text="Vorwort"/>
+<l:gentext key="preface" text="Vorwort"/>
+<l:gentext key="Procedure" text="Prozedur"/>
+<l:gentext key="procedure" text="Prozedur"/>
+<l:gentext key="ProductionSet" text="Produktion"/>
+<l:gentext key="PubDate" text="Veröffentlicht"/>
+<l:gentext key="pubdate" text="Veröffentlicht"/>
+<l:gentext key="Published" text="Veröffentlicht"/>
+<l:gentext key="published" text="Veröffentlicht"/>
+<l:gentext key="Publisher" text="Herausgeber"/>
+<l:gentext key="Qandadiv" text="F &amp; A"/>
+<l:gentext key="qandadiv" text="F &amp; A"/>
+<l:gentext key="QandASet" text="Häufig gestellte Fragen"/>
+<l:gentext key="Question" text="F:"/>
+<l:gentext key="question" text="F:"/>
+<l:gentext key="RefEntry" text="Seite"/>
+<l:gentext key="refentry" text="seite"/>
+<l:gentext key="Reference" text="Verweis"/>
+<l:gentext key="reference" text="Verweis"/>
+<l:gentext key="References" text="Verweise"/>
+<l:gentext key="RefName" text="Name"/>
+<l:gentext key="refname" text="Name"/>
+<l:gentext key="RefSection" text="Abschnitt"/>
+<l:gentext key="refsection" text="Abschnitt"/>
+<l:gentext key="RefSynopsisDiv" text="Ãœbersicht"/>
+<l:gentext key="refsynopsisdiv" text="Ãœbersicht"/>
+<l:gentext key="RevHistory" text="Versionsgeschichte"/>
+<l:gentext key="revhistory" text="Versionsgeschichte"/>
+<l:gentext key="revision" text="Version"/>
+<l:gentext key="Revision" text="Version"/>
+<l:gentext key="sect1" text="Abschnitt"/>
+<l:gentext key="sect2" text="Abschnitt"/>
+<l:gentext key="sect3" text="Abschnitt"/>
+<l:gentext key="sect4" text="Abschnitt"/>
+<l:gentext key="sect5" text="Abschnitt"/>
+<l:gentext key="section" text="Abschnitt"/>
+<l:gentext key="Section" text="Abschnitt"/>
+<l:gentext key="see" text="Siehe"/>
+<l:gentext key="See" text="Siehe"/>
+<l:gentext key="seealso" text="Siehe auch"/>
+<l:gentext key="Seealso" text="Siehe auch"/>
+<l:gentext key="SeeAlso" text="Siehe auch"/>
+<l:gentext key="set" text="Satz"/>
+<l:gentext key="Set" text="Satz"/>
+<l:gentext key="setindex" text="Stichwortverzeichnis"/>
+<l:gentext key="SetIndex" text="Stichwortverzeichnis"/>
+<l:gentext key="Sidebar" text="Randnotiz"/>
+<l:gentext key="sidebar" text="randnotiz"/>
+<l:gentext key="step" text="Schritt"/>
+<l:gentext key="Step" text="Schritt"/>
+<l:gentext key="table" text="Tabelle"/>
+<l:gentext key="Table" text="Tabelle"/>
+<l:gentext key="task" text="aufgabe"/>
+<l:gentext key="Task" text="Aufgabe"/>
+<l:gentext key="tip" text="Tipp"/>
+<l:gentext key="TIP" text="TIPP"/>
+<l:gentext key="Tip" text="Tipp"/>
+<l:gentext key="Warning" text="Warnung"/>
+<l:gentext key="warning" text="Warnung"/>
+<l:gentext key="WARNING" text="WARNUNG"/>
+<l:gentext key="and" text="und"/>
+<l:gentext key="by" text="von"/>
+<l:gentext key="Edited" text="Herausgegeben"/>
+<l:gentext key="edited" text="Herausgegeben"/>
+<l:gentext key="Editedby" text="Herausgegeben von"/>
+<l:gentext key="editedby" text="Herausgegeben von"/>
+<l:gentext key="in" text="in"/>
+<l:gentext key="lastlistcomma" text=""/>
+<l:gentext key="listcomma" text=","/>
+<l:gentext key="notes" text="Fußnoten"/>
+<l:gentext key="Notes" text="Fußnoten"/>
+<l:gentext key="Pgs" text="Seiten"/>
+<l:gentext key="pgs" text="Seiten"/>
+<l:gentext key="Revisedby" text="Geändert durch: "/>
+<l:gentext key="revisedby" text="Geändert durch: "/>
+<l:gentext key="TableNotes" text="Bemerkungen"/>
+<l:gentext key="tablenotes" text="Bemerkungen"/>
+<l:gentext key="TableofContents" text="Inhaltsverzeichnis"/>
+<l:gentext key="tableofcontents" text="Inhaltsverzeichnis"/>
+<l:gentext key="unexpectedelementname" text="Unerwarteter Elementname"/>
+<l:gentext key="unsupported" text="wird nicht unterstützt"/>
+<l:gentext key="xrefto" text="xref auf"/>
+<l:gentext key="Authors" text="Autoren"/>
+<l:gentext key="copyeditor" text="Korrekteur"/>
+<l:gentext key="graphicdesigner" text="Grafikgestalter"/>
+<l:gentext key="productioneditor" text="Produktions-Verfasser"/>
+<l:gentext key="technicaleditor" text="Technischer Verfasser"/>
+<l:gentext key="translator" text="Ãœbersetzer"/>
+<l:gentext key="listofequations" text="Gleichungen"/>
+<l:gentext key="ListofEquations" text="Gleichungen"/>
+<l:gentext key="ListofExamples" text="Liste der Beispiele"/>
+<l:gentext key="listofexamples" text="Liste der Beispiele"/>
+<l:gentext key="ListofFigures" text="Abbildungsverzeichnis"/>
+<l:gentext key="listoffigures" text="Abbildungsverzeichnis"/>
+<l:gentext key="ListofProcedures" text="Liste der Prozeduren"/>
+<l:gentext key="listofprocedures" text="Liste der Prozeduren"/>
+<l:gentext key="listoftables" text="Tabellenverzeichnis"/>
+<l:gentext key="ListofTables" text="Tabellenverzeichnis"/>
+<l:gentext key="ListofUnknown" text="???-Verzeichnis"/>
+<l:gentext key="listofunknown" text="???-Verzeichnis"/>
+<l:gentext key="nav-home" text="Zum Anfang"/>
+<l:gentext key="nav-next" text="Weiter"/>
+<l:gentext key="nav-next-sibling" text="Schnell weiter"/>
+<l:gentext key="nav-prev" text="Zurück"/>
+<l:gentext key="nav-prev-sibling" text="Schnell zurück"/>
+<l:gentext key="nav-up" text="Nach oben"/>
+<l:gentext key="nav-toc" text="InhV"/>
+<l:gentext key="Draft" text="Entwurf"/>
+<l:gentext key="above" text="oben"/>
+<l:gentext key="below" text="unten"/>
+<l:gentext key="sectioncalled" text="der Abschnitt namens"/>
+<l:gentext key="index symbols" text="Symbole"/>
+<l:gentext key="writing-mode" text="lr-tb"/>
+<l:gentext key="lowercase.alpha" text="abcdefghijklmnopqrstuvwxyzäöüß"/>
+<l:gentext key="uppercase.alpha" text="ABCDEFGHIJKLMNOPQRSTUVWXYZÄÖÜß"/>
+<l:gentext key="normalize.sort.input" text="AaÀàÃáÂâÃãÄäÅåĀÄĂ㥹ÇǎǞǟǠǡǺǻȀÈȂȃȦȧḀá¸áºšáº áº¡áº¢áº£áº¤áº¥áº¦áº§áº¨áº©áºªáº«áº¬áº­áº®áº¯áº°áº±áº²áº³áº´áºµáº¶áº·BbÆ€ÆɓƂƃḂḃḄḅḆḇCcÇçĆćĈĉĊċČÄƇƈɕḈḉDdÄŽÄÄđƊɗƋƌDžDzȡɖḊḋḌá¸á¸Žá¸á¸á¸‘ḒḓEeÈèÉéÊêËëĒēĔĕĖėĘęĚěȄȅȆȇȨȩḔḕḖḗḘḙḚḛḜá¸áº¸áº¹áººáº»áº¼áº½áº¾áº¿á»€á»á»‚ểỄễỆệFfƑƒḞḟGgÄœÄĞğĠġĢģƓɠǤǥǦǧǴǵḠḡHhĤĥĦħȞȟɦḢḣḤḥḦḧḨḩḪḫẖIiÌìÃíÎîÃïĨĩĪīĬĭĮįİƗɨÇÇȈȉȊȋḬḭḮḯỈỉỊịJjĴĵǰÊKkĶķƘƙǨǩḰḱḲḳḴḵLlĹĺĻļĽľĿŀÅłƚLjȴɫɬɭḶḷḸḹḺḻḼḽMmɱḾḿṀá¹á¹‚ṃNnÑñŃńŅņŇňÆɲƞȠNjǸǹȵɳṄṅṆṇṈṉṊṋOoÒòÓóÔôÕõÖöØøŌÅÅŽÅÅőƟƠơǑǒǪǫǬǭǾǿȌÈÈŽÈȪȫȬȭȮȯȰȱṌá¹á¹Žá¹á¹á¹‘ṒṓỌá»á»Žá»á»á»‘ỒồỔổỖỗỘộỚớỜá»á»žá»Ÿá» á»¡á»¢á»£PpƤƥṔṕṖṗQqÊ RrŔŕŖŗŘřÈȑȒȓɼɽɾṘṙṚṛṜá¹á¹žá¹ŸSsŚśŜÅŞşŠšȘșʂṠṡṢṣṤṥṦṧṨṩTtŢţŤťŦŧƫƬƭƮʈȚțȶṪṫṬṭṮṯṰṱẗUuÙùÚúÛûÜüŨũŪūŬŭŮůŰűŲųƯưǓǔǕǖǗǘǙǚǛǜȔȕȖȗṲṳṴṵṶṷṸṹṺṻỤụỦủỨứỪừỬửỮữỰựVvƲʋṼṽṾṿWwŴŵẀáºáº‚ẃẄẅẆẇẈẉẘXxẊẋẌáºYyÃýÿŸŶŷƳƴȲȳẎáºáº™á»²á»³á»´á»µá»¶á»·á»¸á»¹ZzŹźŻżŽžƵƶȤȥÊÊ‘áºáº‘ẒẓẔẕẕ" lang="en"/>
+<l:gentext key="normalize.sort.output" text="AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBCCCCCCCCCCCCCCCCCDDDDDDDDDDDDDDDDDDDDDDDDEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEFFFFFFGGGGGGGGGGGGGGGGGGGGHHHHHHHHHHHHHHHHHHHHIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIJJJJJJKKKKKKKKKKKKKKLLLLLLLLLLLLLLLLLLLLLLLLLLMMMMMMMMMNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOPPPPPPPPQQQRRRRRRRRRRRRRRRRRRRRRRRSSSSSSSSSSSSSSSSSSSSSSSTTTTTTTTTTTTTTTTTTTTTTTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUVVVVVVVVWWWWWWWWWWWWWWWXXXXXXYYYYYYYYYYYYYYYYYYYYYYYZZZZZZZZZZZZZZZZZZZZZ" lang="en"/>
+<l:dingbat key="startquote" text="„"/>
+<l:dingbat key="endquote" text="“"/>
+<l:dingbat key="nestedstartquote" text="‚"/>
+<l:dingbat key="nestedendquote" text="‘"/>
+<l:dingbat key="singlestartquote" text="‚"/>
+<l:dingbat key="singleendquote" text="‘"/>
+<l:dingbat key="bullet" text="•"/>
+<l:gentext key="hyphenation-character" text="-"/>
+<l:gentext key="hyphenation-push-character-count" text="2"/>
+<l:gentext key="hyphenation-remain-character-count" text="3"/>
+<l:context name="styles"><l:template name="person-name" text="first-last"/>
+</l:context>
+<l:context name="title"><l:template name="abstract" text="%t"/>
+<l:template name="acknowledgements" text="%t" lang="en"/>
+<l:template name="answer" text="%t"/>
+<l:template name="appendix" text="Anhang %n. %t"/>
+<l:template name="article" text="%t"/>
+<l:template name="authorblurb" text="%t"/>
+<l:template name="bibliodiv" text="%t"/>
+<l:template name="biblioentry" text="%t"/>
+<l:template name="bibliography" text="%t"/>
+<l:template name="bibliolist" text="%t" lang="en"/>
+<l:template name="bibliomixed" text="%t"/>
+<l:template name="bibliomset" text="%t"/>
+<l:template name="biblioset" text="%t"/>
+<l:template name="blockquote" text="%t"/>
+<l:template name="book" text="%t"/>
+<l:template name="calloutlist" text="%t"/>
+<l:template name="caution" text="%t"/>
+<l:template name="chapter" text="Kapitel %n. %t"/>
+<l:template name="colophon" text="%t"/>
+<l:template name="dedication" text="%t"/>
+<l:template name="equation" text="Gleichung %n. %t"/>
+<l:template name="example" text="Beispiel %n. %t"/>
+<l:template name="figure" text="Abbildung %n. %t"/>
+<l:template name="foil" text="%t" lang="en"/>
+<l:template name="foilgroup" text="%t" lang="en"/>
+<l:template name="formalpara" text="%t"/>
+<l:template name="glossary" text="%t"/>
+<l:template name="glossdiv" text="%t"/>
+<l:template name="glosslist" text="%t" lang="en"/>
+<l:template name="glossentry" text="%t"/>
+<l:template name="important" text="%t"/>
+<l:template name="index" text="%t"/>
+<l:template name="indexdiv" text="%t"/>
+<l:template name="itemizedlist" text="%t"/>
+<l:template name="legalnotice" text="%t"/>
+<l:template name="listitem" text=""/>
+<l:template name="lot" text="%t"/>
+<l:template name="msg" text="%t"/>
+<l:template name="msgexplan" text="%t"/>
+<l:template name="msgmain" text="%t"/>
+<l:template name="msgrel" text="%t"/>
+<l:template name="msgset" text="%t"/>
+<l:template name="msgsub" text="%t"/>
+<l:template name="note" text="%t"/>
+<l:template name="orderedlist" text="%t"/>
+<l:template name="part" text="Teil %n. %t"/>
+<l:template name="partintro" text="%t"/>
+<l:template name="preface" text="%t"/>
+<l:template name="procedure" text="%t"/>
+<l:template name="procedure.formal" text="Prozedur %n. %t"/>
+<l:template name="productionset" text="%t"/>
+<l:template name="productionset.formal" text="Produktion %n"/>
+<l:template name="qandadiv" text="%t"/>
+<l:template name="qandaentry" text="%t"/>
+<l:template name="qandaset" text="%t"/>
+<l:template name="question" text="F: %n"/>
+<l:template name="refentry" text="%t"/>
+<l:template name="reference" text="%t"/>
+<l:template name="refsection" text="%t"/>
+<l:template name="refsect1" text="%t"/>
+<l:template name="refsect2" text="%t"/>
+<l:template name="refsect3" text="%t"/>
+<l:template name="refsynopsisdiv" text="%t"/>
+<l:template name="refsynopsisdivinfo" text="%t"/>
+<l:template name="segmentedlist" text="%t"/>
+<l:template name="set" text="%t"/>
+<l:template name="setindex" text="%t"/>
+<l:template name="sidebar" text="%t"/>
+<l:template name="step" text="%t"/>
+<l:template name="table" text="Tabelle %n. %t"/>
+<l:template name="task" text="%t"/>
+<l:template name="tasksummary" text="%t" lang="en"/>
+<l:template name="taskprerequisites" text="%t" lang="en"/>
+<l:template name="taskrelated" text="%t" lang="en"/>
+<l:template name="tip" text="%t"/>
+<l:template name="toc" text="%t"/>
+<l:template name="variablelist" text="%t"/>
+<l:template name="varlistentry" text="" lang="en"/>
+<l:template name="warning" text="%t"/>
+</l:context>
+<l:context name="title-unnumbered"><l:template name="appendix" text="%t"/>
+<l:template name="article/appendix" text="%t"/>
+<l:template name="bridgehead" text="%t"/>
+<l:template name="chapter" text="%t"/>
+<l:template name="sect1" text="%t"/>
+<l:template name="sect2" text="%t"/>
+<l:template name="sect3" text="%t"/>
+<l:template name="sect4" text="%t"/>
+<l:template name="sect5" text="%t"/>
+<l:template name="section" text="%t"/>
+<l:template name="simplesect" text="%t"/>
+<l:template name="part" text="%t" lang="en"/>
+</l:context>
+<l:context name="title-numbered"><l:template name="appendix" text="Anhang %n. %t"/>
+<l:template name="article/appendix" text="%n. %t"/>
+<l:template name="bridgehead" text="%n. %t"/>
+<l:template name="chapter" text="Kapitel %n. %t"/>
+<l:template name="part" text="Teil %n. %t"/>
+<l:template name="sect1" text="%n. %t"/>
+<l:template name="sect2" text="%n. %t"/>
+<l:template name="sect3" text="%n. %t"/>
+<l:template name="sect4" text="%n. %t"/>
+<l:template name="sect5" text="%n. %t"/>
+<l:template name="section" text="%n. %t"/>
+<l:template name="simplesect" text="%n. %t"/>
+</l:context>
+<l:context name="subtitle"><l:template name="appendix" text="%s"/>
+<l:template name="acknowledgements" text="%s" lang="en"/>
+<l:template name="article" text="%s"/>
+<l:template name="bibliodiv" text="%s"/>
+<l:template name="biblioentry" text="%s"/>
+<l:template name="bibliography" text="%s"/>
+<l:template name="bibliomixed" text="%s"/>
+<l:template name="bibliomset" text="%s"/>
+<l:template name="biblioset" text="%s"/>
+<l:template name="book" text="%s"/>
+<l:template name="chapter" text="%s"/>
+<l:template name="colophon" text="%s"/>
+<l:template name="dedication" text="%s"/>
+<l:template name="glossary" text="%s"/>
+<l:template name="glossdiv" text="%s"/>
+<l:template name="index" text="%s"/>
+<l:template name="indexdiv" text="%s"/>
+<l:template name="lot" text="%s"/>
+<l:template name="part" text="%s"/>
+<l:template name="partintro" text="%s"/>
+<l:template name="preface" text="%s"/>
+<l:template name="refentry" text="%s"/>
+<l:template name="reference" text="%s"/>
+<l:template name="refsection" text="%s"/>
+<l:template name="refsect1" text="%s"/>
+<l:template name="refsect2" text="%s"/>
+<l:template name="refsect3" text="%s"/>
+<l:template name="refsynopsisdiv" text="%s"/>
+<l:template name="sect1" text="%s"/>
+<l:template name="sect2" text="%s"/>
+<l:template name="sect3" text="%s"/>
+<l:template name="sect4" text="%s"/>
+<l:template name="sect5" text="%s"/>
+<l:template name="section" text="%s"/>
+<l:template name="set" text="%s"/>
+<l:template name="setindex" text="%s"/>
+<l:template name="sidebar" text="%s"/>
+<l:template name="simplesect" text="%s"/>
+<l:template name="toc" text="%s"/>
+</l:context>
+<l:context name="xref"><l:template name="abstract" text="%t"/>
+<l:template name="acknowledgements" text="%t" lang="en"/>
+<l:template name="answer" text="A: %n"/>
+<l:template name="appendix" text="%t"/>
+<l:template name="article" text="%t"/>
+<l:template name="authorblurb" text="%t"/>
+<l:template name="bibliodiv" text="%t"/>
+<l:template name="bibliography" text="%t"/>
+<l:template name="bibliomset" text="%t"/>
+<l:template name="biblioset" text="%t"/>
+<l:template name="blockquote" text="%t"/>
+<l:template name="book" text="%t"/>
+<l:template name="calloutlist" text="%t"/>
+<l:template name="caution" text="%t"/>
+<l:template name="chapter" text="%t"/>
+<l:template name="colophon" text="%t"/>
+<l:template name="constraintdef" text="%t"/>
+<l:template name="dedication" text="%t"/>
+<l:template name="equation" text="%t"/>
+<l:template name="example" text="%t"/>
+<l:template name="figure" text="%t"/>
+<l:template name="foil" text="%t" lang="en"/>
+<l:template name="foilgroup" text="%t" lang="en"/>
+<l:template name="formalpara" text="%t"/>
+<l:template name="glossary" text="%t"/>
+<l:template name="glossdiv" text="%t"/>
+<l:template name="important" text="%t"/>
+<l:template name="index" text="%t"/>
+<l:template name="indexdiv" text="%t"/>
+<l:template name="itemizedlist" text="%t"/>
+<l:template name="legalnotice" text="%t"/>
+<l:template name="listitem" text="%n"/>
+<l:template name="lot" text="%t"/>
+<l:template name="msg" text="%t"/>
+<l:template name="msgexplan" text="%t"/>
+<l:template name="msgmain" text="%t"/>
+<l:template name="msgrel" text="%t"/>
+<l:template name="msgset" text="%t"/>
+<l:template name="msgsub" text="%t"/>
+<l:template name="note" text="%t"/>
+<l:template name="orderedlist" text="%t"/>
+<l:template name="part" text="%t"/>
+<l:template name="partintro" text="%t"/>
+<l:template name="preface" text="%t"/>
+<l:template name="procedure" text="%t"/>
+<l:template name="productionset" text="%t"/>
+<l:template name="qandadiv" text="%t"/>
+<l:template name="qandaentry" text="F: %n"/>
+<l:template name="qandaset" text="%t"/>
+<l:template name="question" text="F: %n"/>
+<l:template name="reference" text="%t"/>
+<l:template name="refsynopsisdiv" text="%t"/>
+<l:template name="segmentedlist" text="%t"/>
+<l:template name="set" text="%t"/>
+<l:template name="setindex" text="%t"/>
+<l:template name="sidebar" text="%t"/>
+<l:template name="table" text="%t"/>
+<l:template name="task" text="%t" lang="en"/>
+<l:template name="tip" text="%t"/>
+<l:template name="toc" text="%t"/>
+<l:template name="variablelist" text="%t"/>
+<l:template name="varlistentry" text="%n"/>
+<l:template name="warning" text="%t"/>
+<l:template name="olink.document.citation" text=" in %o" lang="en"/>
+<l:template name="olink.page.citation" text=" (page %p)" lang="en"/>
+<l:template name="page.citation" text=" [%p]"/>
+<l:template name="page" text="(Seite %p)"/>
+<l:template name="docname" text=" in %o" lang="en"/>
+<l:template name="docnamelong" text=" in the document titled %o" lang="en"/>
+<l:template name="pageabbrev" text="(S. %p)"/>
+<l:template name="Page" text="Seite %p"/>
+<l:template name="bridgehead" text="„%t“"/>
+<l:template name="refsection" text="„%t“"/>
+<l:template name="refsect1" text="„%t“"/>
+<l:template name="refsect2" text="„%t“"/>
+<l:template name="refsect3" text="„%t“"/>
+<l:template name="sect1" text="„%t“"/>
+<l:template name="sect2" text="„%t“"/>
+<l:template name="sect3" text="„%t“"/>
+<l:template name="sect4" text="„%t“"/>
+<l:template name="sect5" text="„%t“"/>
+<l:template name="section" text="„%t“"/>
+<l:template name="simplesect" text="„%t“"/>
+</l:context>
+<l:context name="xref-number"><l:template name="answer" text="A: %n"/>
+<l:template name="appendix" text="Anhang %n"/>
+<l:template name="bridgehead" text="Abschnitt %n"/>
+<l:template name="chapter" text="Kapitel %n"/>
+<l:template name="equation" text="Gleichung %n"/>
+<l:template name="example" text="Beispiel %n"/>
+<l:template name="figure" text="Abbildung %n"/>
+<l:template name="part" text="Teil %n"/>
+<l:template name="procedure" text="Prozedur %n"/>
+<l:template name="productionset" text="Produktion %n"/>
+<l:template name="qandadiv" text="F &amp; A %n"/>
+<l:template name="qandaentry" text="F: %n"/>
+<l:template name="question" text="F: %n"/>
+<l:template name="sect1" text="Abschnitt %n"/>
+<l:template name="sect2" text="Abschnitt %n"/>
+<l:template name="sect3" text="Abschnitt %n"/>
+<l:template name="sect4" text="Abschnitt %n"/>
+<l:template name="sect5" text="Abschnitt %n"/>
+<l:template name="section" text="Abschnitt %n"/>
+<l:template name="table" text="Tabelle %n"/>
+</l:context>
+<l:context name="xref-number-and-title"><l:template name="appendix" text="Anhang %n, %t"/>
+<l:template name="bridgehead" text="Abschnitt %n, „%t“"/>
+<l:template name="chapter" text="Kapitel %n, %t"/>
+<l:template name="equation" text="Gleichung %n, „%t“"/>
+<l:template name="example" text="Beispiel %n, „%t“"/>
+<l:template name="figure" text="Abbildung %n, „%t“"/>
+<l:template name="part" text="Teil %n, „%t“"/>
+<l:template name="procedure" text="Prozedur %n, „%t“"/>
+<l:template name="productionset" text="Produktion %n, „%t“"/>
+<l:template name="qandadiv" text="F &amp; A %n, „%t“"/>
+<l:template name="refsect1" text="der Abschnitt namens „%t“"/>
+<l:template name="refsect2" text="der Abschnitt namens „%t“"/>
+<l:template name="refsect3" text="der Abschnitt namens „%t“"/>
+<l:template name="refsection" text="der Abschnitt namens „%t“"/>
+<l:template name="sect1" text="Abschnitt %n, „%t“"/>
+<l:template name="sect2" text="Abschnitt %n, „%t“"/>
+<l:template name="sect3" text="Abschnitt %n, „%t“"/>
+<l:template name="sect4" text="Abschnitt %n, „%t“"/>
+<l:template name="sect5" text="Abschnitt %n, „%t“"/>
+<l:template name="section" text="Abschnitt %n, „%t“"/>
+<l:template name="simplesect" text="der Abschnitt namens „%t“"/>
+<l:template name="table" text="Tabelle %n, „%t“"/>
+</l:context>
+<l:context name="authorgroup"><l:template name="sep" text=", "/>
+<l:template name="sep2" text=" und "/>
+<l:template name="seplast" text=" und "/>
+</l:context>
+<l:context name="glossary"><l:template name="see" text="Siehe %t."/>
+<l:template name="seealso" text="Siehe auch %t."/>
+<l:template name="seealso-separator" text=", "/>
+</l:context>
+<l:context name="msgset"><l:template name="MsgAud" text="Zielgruppe: "/>
+<l:template name="MsgLevel" text="Dringlichkeit: "/>
+<l:template name="MsgOrig" text="Ursprung: "/>
+</l:context>
+<l:context name="datetime"><l:template name="format" text="d.m.Y"/>
+</l:context>
+<l:context name="termdef"><l:template name="prefix" text="[Definition: " lang="en"/>
+<l:template name="suffix" text="]" lang="en"/>
+</l:context>
+<l:context name="datetime-full"><l:template name="January" text="Januar"/>
+<l:template name="February" text="Februar"/>
+<l:template name="March" text="März"/>
+<l:template name="April" text="April"/>
+<l:template name="May" text="Mai"/>
+<l:template name="June" text="Juni"/>
+<l:template name="July" text="Juli"/>
+<l:template name="August" text="August"/>
+<l:template name="September" text="September"/>
+<l:template name="October" text="Oktober"/>
+<l:template name="November" text="November"/>
+<l:template name="December" text="Dezember"/>
+<l:template name="Monday" text="Montag"/>
+<l:template name="Tuesday" text="Dienstag"/>
+<l:template name="Wednesday" text="Mittwoch"/>
+<l:template name="Thursday" text="Donnerstag"/>
+<l:template name="Friday" text="Freitag"/>
+<l:template name="Saturday" text="Samstag"/>
+<l:template name="Sunday" text="Sonntag"/>
+</l:context>
+<l:context name="datetime-abbrev"><l:template name="Jan" text="Jan"/>
+<l:template name="Feb" text="Feb"/>
+<l:template name="Mar" text="Mar"/>
+<l:template name="Apr" text="Apr"/>
+<l:template name="May" text="Mai"/>
+<l:template name="Jun" text="Jun"/>
+<l:template name="Jul" text="Jul"/>
+<l:template name="Aug" text="Aug"/>
+<l:template name="Sep" text="Sep"/>
+<l:template name="Oct" text="Okt"/>
+<l:template name="Nov" text="Nov"/>
+<l:template name="Dec" text="Dez"/>
+<l:template name="Mon" text="Mo"/>
+<l:template name="Tue" text="Di"/>
+<l:template name="Wed" text="Mi"/>
+<l:template name="Thu" text="Do"/>
+<l:template name="Fri" text="Fr"/>
+<l:template name="Sat" text="Sa"/>
+<l:template name="Sun" text="So"/>
+</l:context>
+<l:context name="htmlhelp"><l:template name="langcode" text="0x0407 German (GERMANY)"/>
+</l:context>
+<l:context name="index"><l:template name="term-separator" text=", " lang="en"/>
+<l:template name="number-separator" text=", " lang="en"/>
+<l:template name="range-separator" text="-" lang="en"/>
+</l:context>
+<l:context name="iso690"><l:template name="lastfirst.sep" text=", " lang="en"/>
+<l:template name="alt.person.two.sep" text=" – " lang="en"/>
+<l:template name="alt.person.last.sep" text=" – " lang="en"/>
+<l:template name="alt.person.more.sep" text=" – " lang="en"/>
+<l:template name="primary.editor" text=" (ed.)" lang="en"/>
+<l:template name="primary.many" text=", et al." lang="en"/>
+<l:template name="primary.sep" text=". " lang="en"/>
+<l:template name="submaintitle.sep" text=": " lang="en"/>
+<l:template name="title.sep" text=". " lang="en"/>
+<l:template name="othertitle.sep" text=", " lang="en"/>
+<l:template name="medium1" text=" [" lang="en"/>
+<l:template name="medium2" text="]" lang="en"/>
+<l:template name="secondary.person.sep" text="; " lang="en"/>
+<l:template name="secondary.sep" text=". " lang="en"/>
+<l:template name="respons.sep" text=". " lang="en"/>
+<l:template name="edition.sep" text=". " lang="en"/>
+<l:template name="edition.serial.sep" text=", " lang="en"/>
+<l:template name="issuing.range" text="-" lang="en"/>
+<l:template name="issuing.div" text=", " lang="en"/>
+<l:template name="issuing.sep" text=". " lang="en"/>
+<l:template name="partnr.sep" text=". " lang="en"/>
+<l:template name="placepubl.sep" text=": " lang="en"/>
+<l:template name="publyear.sep" text=", " lang="en"/>
+<l:template name="pubinfo.sep" text=". " lang="en"/>
+<l:template name="spec.pubinfo.sep" text=", " lang="en"/>
+<l:template name="upd.sep" text=", " lang="en"/>
+<l:template name="datecit1" text=" [cited " lang="en"/>
+<l:template name="datecit2" text="]" lang="en"/>
+<l:template name="extent.sep" text=". " lang="en"/>
+<l:template name="locs.sep" text=", " lang="en"/>
+<l:template name="location.sep" text=". " lang="en"/>
+<l:template name="serie.sep" text=". " lang="en"/>
+<l:template name="notice.sep" text=". " lang="en"/>
+<l:template name="access" text="Available " lang="en"/>
+<l:template name="acctoo" text="Also available " lang="en"/>
+<l:template name="onwww" text="from World Wide Web" lang="en"/>
+<l:template name="oninet" text="from Internet" lang="en"/>
+<l:template name="access.end" text=": " lang="en"/>
+<l:template name="link1" text="&lt;" lang="en"/>
+<l:template name="link2" text="&gt;" lang="en"/>
+<l:template name="access.sep" text=". " lang="en"/>
+<l:template name="isbn" text="ISBN " lang="en"/>
+<l:template name="issn" text="ISSN " lang="en"/>
+<l:template name="stdnum.sep" text=". " lang="en"/>
+<l:template name="patcountry.sep" text=". " lang="en"/>
+<l:template name="pattype.sep" text=", " lang="en"/>
+<l:template name="patnum.sep" text=". " lang="en"/>
+<l:template name="patdate.sep" text=". " lang="en"/>
+</l:context><l:letters><l:l i="-1"/>
+<l:l i="0">Symbole</l:l>
+<l:l i="1">A</l:l>
+<l:l i="1">a</l:l>
+<l:l i="1">Ä</l:l>
+<l:l i="1">ä</l:l>
+<l:l i="2">B</l:l>
+<l:l i="2">b</l:l>
+<l:l i="3">C</l:l>
+<l:l i="3">c</l:l>
+<l:l i="4">D</l:l>
+<l:l i="4">d</l:l>
+<l:l i="5">E</l:l>
+<l:l i="5">e</l:l>
+<l:l i="6">F</l:l>
+<l:l i="6">f</l:l>
+<l:l i="7">G</l:l>
+<l:l i="7">g</l:l>
+<l:l i="8">H</l:l>
+<l:l i="8">h</l:l>
+<l:l i="9">I</l:l>
+<l:l i="9">i</l:l>
+<l:l i="10">J</l:l>
+<l:l i="10">j</l:l>
+<l:l i="11">K</l:l>
+<l:l i="11">k</l:l>
+<l:l i="12">L</l:l>
+<l:l i="12">l</l:l>
+<l:l i="13">M</l:l>
+<l:l i="13">m</l:l>
+<l:l i="14">N</l:l>
+<l:l i="14">n</l:l>
+<l:l i="15">O</l:l>
+<l:l i="15">o</l:l>
+<l:l i="15">Ö</l:l>
+<l:l i="15">ö</l:l>
+<l:l i="16">P</l:l>
+<l:l i="16">p</l:l>
+<l:l i="17">Q</l:l>
+<l:l i="17">q</l:l>
+<l:l i="18">R</l:l>
+<l:l i="18">r</l:l>
+<l:l i="19">S</l:l>
+<l:l i="19">s</l:l>
+<l:l i="20">T</l:l>
+<l:l i="20">t</l:l>
+<l:l i="21">U</l:l>
+<l:l i="21">u</l:l>
+<l:l i="21">Ü</l:l>
+<l:l i="21">ü</l:l>
+<l:l i="22">V</l:l>
+<l:l i="22">v</l:l>
+<l:l i="23">W</l:l>
+<l:l i="23">w</l:l>
+<l:l i="24">X</l:l>
+<l:l i="24">x</l:l>
+<l:l i="25">Y</l:l>
+<l:l i="25">y</l:l>
+<l:l i="26">Z</l:l>
+<l:l i="26">z</l:l>
+</l:letters>
+</l:l10n>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/el.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/el.xml
new file mode 100644
index 0000000..f8461d1
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/el.xml
@@ -0,0 +1,729 @@
+<?xml version="1.0" encoding="utf-8"?>
+<l:l10n xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0" language="el" english-language-name="Greek">
+
+<!-- * This file is generated automatically. -->
+<!-- * To submit changes to this file upstream (to the DocBook Project) -->
+<!-- * do not submit an edited version of this file. Instead, submit an -->
+<!-- * edited version of the source file at the following location: -->
+<!-- * -->
+<!-- * https://docbook.svn.sourceforge.net/svnroot/docbook/trunk/gentext/locale/el.xml -->
+<!-- * -->
+<!-- * E-mail the edited el.xml source file to: -->
+<!-- * -->
+<!-- * docbook-developers@lists.sourceforge.net -->
+
+<!-- ******************************************************************** -->
+
+<!-- This file is part of the XSL DocBook Stylesheet distribution. -->
+<!-- See ../README or http://docbook.sf.net/release/xsl/current/ for -->
+<!-- copyright and other information. -->
+
+<!-- ******************************************************************** -->
+<!-- In these files, % with a letter is used for a placeholder: -->
+<!-- %t is the current element's title -->
+<!-- %s is the current element's subtitle (if applicable)-->
+<!-- %n is the current element's number label-->
+<!-- %p is the current element's page number (if applicable)-->
+<!-- ******************************************************************** -->
+
+
+<l:gentext key="Abstract" text="ΠεÏίληψη"/>
+<l:gentext key="abstract" text="πεÏίληψη"/>
+<l:gentext key="Acknowledgements" text="ΑναγνωÏίσεις"/>
+<l:gentext key="acknowledgements" text="αναγνωÏίσεις"/>
+<l:gentext key="Answer" text="Α:"/>
+<l:gentext key="answer" text="α:"/>
+<l:gentext key="Appendix" text="ΠαÏάÏτημα"/>
+<l:gentext key="appendix" text="παÏάÏτημα"/>
+<l:gentext key="Article" text="ΆÏθÏο"/>
+<l:gentext key="article" text="άÏθÏο"/>
+<l:gentext key="Author" text="ΣυγγÏαφέας"/>
+<l:gentext key="Bibliography" text="ΒιβλιογÏαφία"/>
+<l:gentext key="bibliography" text="βιβλιογÏαφία"/>
+<l:gentext key="Book" text="Βιβλίο"/>
+<l:gentext key="book" text="βιβλίο"/>
+<l:gentext key="CAUTION" text="ΠΡΟΣΟΧΗ"/>
+<l:gentext key="Caution" text="ΠÏοσοχή"/>
+<l:gentext key="caution" text="Ï€Ïοσοχή"/>
+<l:gentext key="Chapter" text="Κεφάλαιο"/>
+<l:gentext key="chapter" text="κεφάλαιο"/>
+<l:gentext key="Colophon" text="ΚοÏωνίδα"/>
+<l:gentext key="colophon" text="κοÏωνίδα"/>
+<l:gentext key="Copyright" text="Πνευματικά Δικαιώματα"/>
+<l:gentext key="copyright" text="πνευματικά Δικαιώματα"/>
+<l:gentext key="Dedication" text="ΑφιέÏωση"/>
+<l:gentext key="dedication" text="αφιέÏωση"/>
+<l:gentext key="Edition" text="Έκδοση"/>
+<l:gentext key="edition" text="έκδοση"/>
+<l:gentext key="Editor" text="Εκδότης"/>
+<l:gentext key="Equation" text="Εξίσωση"/>
+<l:gentext key="equation" text="εξίσωση"/>
+<l:gentext key="Example" text="ΠαÏάδειγμα"/>
+<l:gentext key="example" text="παÏάδειγμα"/>
+<l:gentext key="Figure" text="Σχήμα"/>
+<l:gentext key="figure" text="σχήμα"/>
+<l:gentext key="Glossary" text="ΓλωσσάÏιο"/>
+<l:gentext key="glossary" text="γλωσσάÏιο"/>
+<l:gentext key="GlossSee" text="Δείτε"/>
+<l:gentext key="glosssee" text="δείτε"/>
+<l:gentext key="GlossSeeAlso" text="Δείτε Επίσης"/>
+<l:gentext key="glossseealso" text="δείτε Επίσης"/>
+<l:gentext key="IMPORTANT" text="ΣΗΜΑÎΤΙΚΟ"/>
+<l:gentext key="important" text="σημαντικό"/>
+<l:gentext key="Important" text="Σημαντικό"/>
+<l:gentext key="Index" text="ΕυÏετήÏιο"/>
+<l:gentext key="index" text="ευÏετήÏιο"/>
+<l:gentext key="ISBN" text="ISBN"/>
+<l:gentext key="isbn" text="ISBN"/>
+<l:gentext key="LegalNotice" text="Îομική Σημείωση"/>
+<l:gentext key="legalnotice" text="νομική σημείωση"/>
+<l:gentext key="MsgAud" text="ΑκÏοατήÏιο"/>
+<l:gentext key="msgaud" text="ακÏοατήÏιο"/>
+<l:gentext key="MsgLevel" text="Επίπεδο"/>
+<l:gentext key="msglevel" text="επίπεδο"/>
+<l:gentext key="MsgOrig" text="Πηγή"/>
+<l:gentext key="msgorig" text="πηγή"/>
+<l:gentext key="NOTE" text="ΣΗΜΕΙΩΣΗ"/>
+<l:gentext key="Note" text="Σημείωση"/>
+<l:gentext key="note" text="σημείωση"/>
+<l:gentext key="Part" text="ΜέÏος"/>
+<l:gentext key="part" text="μέÏος"/>
+<l:gentext key="Preface" text="Εισαγωγή"/>
+<l:gentext key="preface" text="εισαγωγή"/>
+<l:gentext key="Procedure" text="Διαδικασία"/>
+<l:gentext key="procedure" text="διαδικασία"/>
+<l:gentext key="ProductionSet" text="ΠαÏαγωγή"/>
+<l:gentext key="PubDate" text="ΗμεÏομηνία Δημοσίευσης"/>
+<l:gentext key="pubdate" text="ημεÏομηνία Δημοσίευσης"/>
+<l:gentext key="Published" text="Δημοσιευμένο"/>
+<l:gentext key="published" text="δημοσιευμένο"/>
+<l:gentext key="Publisher" text="Εκδότης"/>
+<l:gentext key="Qandadiv" text="Ε και Α"/>
+<l:gentext key="qandadiv" text="ε και α"/>
+<l:gentext key="QandASet" text="Συχνές ΕÏωτήσεις"/>
+<l:gentext key="Question" text="Ε:"/>
+<l:gentext key="question" text="ε:"/>
+<l:gentext key="RefEntry" text="Σελίδα"/>
+<l:gentext key="refentry" text="σελίδα"/>
+<l:gentext key="Reference" text="ΑναφοÏά"/>
+<l:gentext key="reference" text="αναφοÏά"/>
+<l:gentext key="References" text="ΑναφοÏές"/>
+<l:gentext key="RefName" text="Όνομα"/>
+<l:gentext key="refname" text="όνομα"/>
+<l:gentext key="RefSection" text="Τμήμα"/>
+<l:gentext key="refsection" text="τμήμα"/>
+<l:gentext key="RefSynopsisDiv" text="ΣÏνοψη"/>
+<l:gentext key="refsynopsisdiv" text="σÏνοψη"/>
+<l:gentext key="RevHistory" text="ΙστοÏικό ΑναθεωÏήσεων"/>
+<l:gentext key="revhistory" text="ιστοÏικό αναθεωÏήσεων"/>
+<l:gentext key="revision" text="αναθεώÏηση"/>
+<l:gentext key="Revision" text="ΑναθεώÏηση"/>
+<l:gentext key="sect1" text="Τμήμα"/>
+<l:gentext key="sect2" text="Τμήμα"/>
+<l:gentext key="sect3" text="Τμήμα"/>
+<l:gentext key="sect4" text="Τμήμα"/>
+<l:gentext key="sect5" text="Τμήμα"/>
+<l:gentext key="section" text="τμήμα"/>
+<l:gentext key="Section" text="Τμήμα"/>
+<l:gentext key="see" text="δείτε"/>
+<l:gentext key="See" text="Δείτε"/>
+<l:gentext key="seealso" text="δείτε Επίσης"/>
+<l:gentext key="Seealso" text="Δείτε επίσης"/>
+<l:gentext key="SeeAlso" text="Δείτε Επίσης"/>
+<l:gentext key="set" text="σÏνολο"/>
+<l:gentext key="Set" text="ΣÏνολο"/>
+<l:gentext key="setindex" text="ευÏετήÏιο συνόλων"/>
+<l:gentext key="SetIndex" text="ΕυÏετήÏιο Συνόλων"/>
+<l:gentext key="Sidebar" text="ΠλευÏική γÏαμμή εÏγαλείων"/>
+<l:gentext key="sidebar" text="πλευÏική γÏαμμή εÏγαλείων"/>
+<l:gentext key="step" text="φάση"/>
+<l:gentext key="Step" text="Φάση"/>
+<l:gentext key="table" text="πίνακας"/>
+<l:gentext key="Table" text="Πίνακας"/>
+<l:gentext key="task" text="εÏγασία"/>
+<l:gentext key="Task" text="ΕÏγασία"/>
+<l:gentext key="tip" text="υπόδειξη"/>
+<l:gentext key="TIP" text="ΥΠΟΔΕΙΞΗ"/>
+<l:gentext key="Tip" text="Υπόδειξη"/>
+<l:gentext key="Warning" text="ΠÏοειδοποίηση"/>
+<l:gentext key="warning" text="Ï€Ïοειδοποίηση"/>
+<l:gentext key="WARNING" text="ΠΡΟΕΙΔΟΠΟΙΗΣΗ"/>
+<l:gentext key="and" text="και"/>
+<l:gentext key="by" text="από"/>
+<l:gentext key="Edited" text="Επιμέλεια"/>
+<l:gentext key="edited" text="επιμέλεια"/>
+<l:gentext key="Editedby" text="Επιμέλεια από"/>
+<l:gentext key="editedby" text="επιμέλεια από"/>
+<l:gentext key="in" text="σε"/>
+<l:gentext key="lastlistcomma" text=","/>
+<l:gentext key="listcomma" text=","/>
+<l:gentext key="notes" text="σημειώσεις"/>
+<l:gentext key="Notes" text="Σημειώσεις"/>
+<l:gentext key="Pgs" text="Σλδς."/>
+<l:gentext key="pgs" text="σλδς."/>
+<l:gentext key="Revisedby" text="Επιμέλεια από: "/>
+<l:gentext key="revisedby" text="επιμέλεια από: "/>
+<l:gentext key="TableNotes" text="Σημειώσεις"/>
+<l:gentext key="tablenotes" text="σημειώσεις"/>
+<l:gentext key="TableofContents" text="Πίνακας ΠεÏιεχομένων"/>
+<l:gentext key="tableofcontents" text="πίνακας ΠεÏιεχομένων"/>
+<l:gentext key="unexpectedelementname" text="μη αναμενόμενο όνομα στοιχείου"/>
+<l:gentext key="unsupported" text="μη υποστηÏιζόμενο"/>
+<l:gentext key="xrefto" text="αντιπαÏαπομπή σε"/>
+<l:gentext key="Authors" text="ΣυγγÏαφείς"/>
+<l:gentext key="copyeditor" text="Συντάκτης"/>
+<l:gentext key="graphicdesigner" text="Σχεδιαστής γÏαφικών"/>
+<l:gentext key="productioneditor" text="Εκδότης ΠαÏαγωγής"/>
+<l:gentext key="technicaleditor" text="Τεχνικός Εκδότης"/>
+<l:gentext key="translator" text="ΜεταφÏαστής"/>
+<l:gentext key="listofequations" text="κατάλογος εξισώσεων"/>
+<l:gentext key="ListofEquations" text="Κατάλογος Εξισώσεων"/>
+<l:gentext key="ListofExamples" text="Κατάλογος ΠαÏαδειγμάτων"/>
+<l:gentext key="listofexamples" text="κατάλογος παÏαδειγμάτων"/>
+<l:gentext key="ListofFigures" text="Κατάλογος Σχημάτων"/>
+<l:gentext key="listoffigures" text="κατάλογος σχημάτων"/>
+<l:gentext key="ListofProcedures" text="Κατάλογος Σχημάτων"/>
+<l:gentext key="listofprocedures" text="κατάλογος σχημάτων"/>
+<l:gentext key="listoftables" text="κατάλογος πινάκων"/>
+<l:gentext key="ListofTables" text="Κατάλογος Πινάκων"/>
+<l:gentext key="ListofUnknown" text="Κατάλογος Αγνώστων"/>
+<l:gentext key="listofunknown" text="κατάλογος αγνώστων;"/>
+<l:gentext key="nav-home" text="ΑÏχή"/>
+<l:gentext key="nav-next" text="Επόμενο"/>
+<l:gentext key="nav-next-sibling" text="ΠÏος το τέλος"/>
+<l:gentext key="nav-prev" text="ΠÏοηγ"/>
+<l:gentext key="nav-prev-sibling" text="ΠÏος την αÏχή"/>
+<l:gentext key="nav-up" text="Πάνω"/>
+<l:gentext key="nav-toc" text="Πίνακας πεÏιεχομένων"/>
+<l:gentext key="Draft" text="ΠÏοσχέδιο"/>
+<l:gentext key="above" text="πάνω"/>
+<l:gentext key="below" text="κάτω"/>
+<l:gentext key="sectioncalled" text="το τμήμα ονομάζεται"/>
+<l:gentext key="index symbols" text="ΣÏμβολα"/>
+<l:gentext key="writing-mode" text="lr-tb"/>
+<l:gentext key="lowercase.alpha" text="αβγδεζηθικλμνξοπÏστυφχψω"/>
+<l:gentext key="uppercase.alpha" text="ΑΒΓΔΕΖΗΘΙΚΛΜÎΞΟΠΡΣΤΥΦΧΨΩ"/>
+<l:gentext key="normalize.sort.input" text="ΑαΆάΒβΓγΔδΕεΈέΖζΗηΉήΘθΙιΊίΪϊÎΚκΛλΜμÎνΞξΟοΌόΠπΡÏΣσςΤτΥυΎÏΫϋΰΦφΧχΨψΩωÎÏŽ"/>
+<l:gentext key="normalize.sort.output" text="ΑΑΑΑΒΒΓΓΔΔΕΕΕΕΖΖΗΗΗΗΘΘΙΙΙΙΙΙΙΚΚΛΛΜΜÎÎΞΞΟΟΟΟΠΠΡΡΣΣΣΤΤΥΥΥΥΥΥΥΦΦΧΧΨΨΩΩΩΩ"/>
+<l:dingbat key="startquote" text="&amp;#x201C;"/>
+<l:dingbat key="endquote" text="&amp;#x201D;"/>
+<l:dingbat key="nestedstartquote" text="&amp;#x2018;"/>
+<l:dingbat key="nestedendquote" text="&amp;#x2019;"/>
+<l:dingbat key="singlestartquote" text="‘" lang="en"/>
+<l:dingbat key="singleendquote" text="’" lang="en"/>
+<l:dingbat key="bullet" text="&amp;#x2022;"/>
+<l:gentext key="hyphenation-character" text="-" lang="en"/>
+<l:gentext key="hyphenation-push-character-count" text="2" lang="en"/>
+<l:gentext key="hyphenation-remain-character-count" text="2" lang="en"/>
+<l:context name="styles"><l:template name="person-name" text="first-last"/>
+</l:context>
+<l:context name="title"><l:template name="abstract" text="%t"/>
+<l:template name="acknowledgements" text="%t" lang="en"/>
+<l:template name="answer" text="%t"/>
+<l:template name="appendix" text="ΠαÏάÏτημα %n. %t"/>
+<l:template name="article" text="%t"/>
+<l:template name="authorblurb" text="%t"/>
+<l:template name="bibliodiv" text="%t"/>
+<l:template name="biblioentry" text="%t"/>
+<l:template name="bibliography" text="%t"/>
+<l:template name="bibliolist" text="%t" lang="en"/>
+<l:template name="bibliomixed" text="%t"/>
+<l:template name="bibliomset" text="%t"/>
+<l:template name="biblioset" text="%t"/>
+<l:template name="blockquote" text="%t"/>
+<l:template name="book" text="%t"/>
+<l:template name="calloutlist" text="%t"/>
+<l:template name="caution" text="%t"/>
+<l:template name="chapter" text="Κεφάλαιο %n. %t"/>
+<l:template name="colophon" text="%t"/>
+<l:template name="dedication" text="%t"/>
+<l:template name="equation" text="Εξίσωση %n. %t"/>
+<l:template name="example" text="ΠαÏάδειγμα %n. %t"/>
+<l:template name="figure" text="Σχήμα %n. %t"/>
+<l:template name="foil" text="%t" lang="en"/>
+<l:template name="foilgroup" text="%t" lang="en"/>
+<l:template name="formalpara" text="%t"/>
+<l:template name="glossary" text="%t"/>
+<l:template name="glossdiv" text="%t"/>
+<l:template name="glosslist" text="%t" lang="en"/>
+<l:template name="glossentry" text="%t" lang="en"/>
+<l:template name="important" text="%t"/>
+<l:template name="index" text="%t"/>
+<l:template name="indexdiv" text="%t"/>
+<l:template name="itemizedlist" text="%t"/>
+<l:template name="legalnotice" text="%t"/>
+<l:template name="listitem" text=""/>
+<l:template name="lot" text="%t"/>
+<l:template name="msg" text="%t"/>
+<l:template name="msgexplan" text="%t"/>
+<l:template name="msgmain" text="%t"/>
+<l:template name="msgrel" text="%t"/>
+<l:template name="msgset" text="%t"/>
+<l:template name="msgsub" text="%t"/>
+<l:template name="note" text="%t"/>
+<l:template name="orderedlist" text="%t"/>
+<l:template name="part" text="ΜέÏος %n. %t"/>
+<l:template name="partintro" text="%t"/>
+<l:template name="preface" text="%t"/>
+<l:template name="procedure" text="%t"/>
+<l:template name="procedure.formal" text="Διαδικασία %n. %t"/>
+<l:template name="productionset" text="%t"/>
+<l:template name="productionset.formal" text="ΠαÏαγωγή %n"/>
+<l:template name="qandadiv" text="%t"/>
+<l:template name="qandaentry" text="%t"/>
+<l:template name="qandaset" text="%t"/>
+<l:template name="question" text="%t"/>
+<l:template name="refentry" text="%t"/>
+<l:template name="reference" text="%t"/>
+<l:template name="refsection" text="%t"/>
+<l:template name="refsect1" text="%t"/>
+<l:template name="refsect2" text="%t"/>
+<l:template name="refsect3" text="%t"/>
+<l:template name="refsynopsisdiv" text="%t"/>
+<l:template name="refsynopsisdivinfo" text="%t"/>
+<l:template name="segmentedlist" text="%t"/>
+<l:template name="set" text="%t"/>
+<l:template name="setindex" text="%t"/>
+<l:template name="sidebar" text="%t"/>
+<l:template name="step" text="%t"/>
+<l:template name="table" text="Πίνακας %n. %t"/>
+<l:template name="task" text="%t" lang="en"/>
+<l:template name="tasksummary" text="%t" lang="en"/>
+<l:template name="taskprerequisites" text="%t" lang="en"/>
+<l:template name="taskrelated" text="%t" lang="en"/>
+<l:template name="tip" text="%t"/>
+<l:template name="toc" text="%t"/>
+<l:template name="variablelist" text="%t"/>
+<l:template name="varlistentry" text="" lang="en"/>
+<l:template name="warning" text="%t"/>
+</l:context>
+<l:context name="title-unnumbered"><l:template name="appendix" text="%t"/>
+<l:template name="article/appendix" text="%t" lang="en"/>
+<l:template name="bridgehead" text="%t"/>
+<l:template name="chapter" text="%t"/>
+<l:template name="sect1" text="%t"/>
+<l:template name="sect2" text="%t"/>
+<l:template name="sect3" text="%t"/>
+<l:template name="sect4" text="%t"/>
+<l:template name="sect5" text="%t"/>
+<l:template name="section" text="%t"/>
+<l:template name="simplesect" text="%t"/>
+<l:template name="part" text="%t" lang="en"/>
+</l:context>
+<l:context name="title-numbered"><l:template name="appendix" text="ΠαÏάÏτημα %n. %t"/>
+<l:template name="article/appendix" text="%n. %t" lang="en"/>
+<l:template name="bridgehead" text="%n. %t"/>
+<l:template name="chapter" text="Κεφάλαιο %n. %t"/>
+<l:template name="part" text="ΜέÏος %n. %t"/>
+<l:template name="sect1" text="%n. %t"/>
+<l:template name="sect2" text="%n. %t"/>
+<l:template name="sect3" text="%n. %t"/>
+<l:template name="sect4" text="%n. %t"/>
+<l:template name="sect5" text="%n. %t"/>
+<l:template name="section" text="%n. %t"/>
+<l:template name="simplesect" text="%n. %t"/>
+</l:context>
+<l:context name="subtitle"><l:template name="appendix" text="%s"/>
+<l:template name="acknowledgements" text="%s" lang="en"/>
+<l:template name="article" text="%s"/>
+<l:template name="bibliodiv" text="%s"/>
+<l:template name="biblioentry" text="%s"/>
+<l:template name="bibliography" text="%s"/>
+<l:template name="bibliomixed" text="%s"/>
+<l:template name="bibliomset" text="%s"/>
+<l:template name="biblioset" text="%s"/>
+<l:template name="book" text="%s"/>
+<l:template name="chapter" text="%s"/>
+<l:template name="colophon" text="%s"/>
+<l:template name="dedication" text="%s"/>
+<l:template name="glossary" text="%s"/>
+<l:template name="glossdiv" text="%s"/>
+<l:template name="index" text="%s"/>
+<l:template name="indexdiv" text="%s"/>
+<l:template name="lot" text="%s"/>
+<l:template name="part" text="%s"/>
+<l:template name="partintro" text="%s"/>
+<l:template name="preface" text="%s"/>
+<l:template name="refentry" text="%s"/>
+<l:template name="reference" text="%s"/>
+<l:template name="refsection" text="%s"/>
+<l:template name="refsect1" text="%s"/>
+<l:template name="refsect2" text="%s"/>
+<l:template name="refsect3" text="%s"/>
+<l:template name="refsynopsisdiv" text="%s"/>
+<l:template name="sect1" text="%s"/>
+<l:template name="sect2" text="%s"/>
+<l:template name="sect3" text="%s"/>
+<l:template name="sect4" text="%s"/>
+<l:template name="sect5" text="%s"/>
+<l:template name="section" text="%s"/>
+<l:template name="set" text="%s"/>
+<l:template name="setindex" text="%s"/>
+<l:template name="sidebar" text="%s"/>
+<l:template name="simplesect" text="%s"/>
+<l:template name="toc" text="%s"/>
+</l:context>
+<l:context name="xref"><l:template name="abstract" text="%t"/>
+<l:template name="acknowledgements" text="%t" lang="en"/>
+<l:template name="answer" text="Α: %n"/>
+<l:template name="appendix" text="%t"/>
+<l:template name="article" text="%t"/>
+<l:template name="authorblurb" text="%t"/>
+<l:template name="bibliodiv" text="%t"/>
+<l:template name="bibliography" text="%t"/>
+<l:template name="bibliomset" text="%t"/>
+<l:template name="biblioset" text="%t"/>
+<l:template name="blockquote" text="%t"/>
+<l:template name="book" text="%t"/>
+<l:template name="calloutlist" text="%t"/>
+<l:template name="caution" text="%t"/>
+<l:template name="chapter" text="%t"/>
+<l:template name="colophon" text="%t"/>
+<l:template name="constraintdef" text="%t"/>
+<l:template name="dedication" text="%t"/>
+<l:template name="equation" text="%t"/>
+<l:template name="example" text="%t"/>
+<l:template name="figure" text="%t"/>
+<l:template name="foil" text="%t" lang="en"/>
+<l:template name="foilgroup" text="%t" lang="en"/>
+<l:template name="formalpara" text="%t"/>
+<l:template name="glossary" text="%t"/>
+<l:template name="glossdiv" text="%t"/>
+<l:template name="important" text="%t"/>
+<l:template name="index" text="%t"/>
+<l:template name="indexdiv" text="%t"/>
+<l:template name="itemizedlist" text="%t"/>
+<l:template name="legalnotice" text="%t"/>
+<l:template name="listitem" text="%n"/>
+<l:template name="lot" text="%t"/>
+<l:template name="msg" text="%t"/>
+<l:template name="msgexplan" text="%t"/>
+<l:template name="msgmain" text="%t"/>
+<l:template name="msgrel" text="%t"/>
+<l:template name="msgset" text="%t"/>
+<l:template name="msgsub" text="%t"/>
+<l:template name="note" text="%t"/>
+<l:template name="orderedlist" text="%t"/>
+<l:template name="part" text="%t"/>
+<l:template name="partintro" text="%t"/>
+<l:template name="preface" text="%t"/>
+<l:template name="procedure" text="%t"/>
+<l:template name="productionset" text="%t"/>
+<l:template name="qandadiv" text="%t"/>
+<l:template name="qandaentry" text="Ε: %n"/>
+<l:template name="qandaset" text="%t"/>
+<l:template name="question" text="Ε: %n"/>
+<l:template name="reference" text="%t"/>
+<l:template name="refsynopsisdiv" text="%t"/>
+<l:template name="segmentedlist" text="%t"/>
+<l:template name="set" text="%t"/>
+<l:template name="setindex" text="%t"/>
+<l:template name="sidebar" text="%t"/>
+<l:template name="table" text="%t"/>
+<l:template name="task" text="%t" lang="en"/>
+<l:template name="tip" text="%t"/>
+<l:template name="toc" text="%t"/>
+<l:template name="variablelist" text="%t"/>
+<l:template name="varlistentry" text="%n"/>
+<l:template name="warning" text="%t"/>
+<l:template name="olink.document.citation" text=" in %o" lang="en"/>
+<l:template name="olink.page.citation" text=" (page %p)" lang="en"/>
+<l:template name="page.citation" text=" [%p]"/>
+<l:template name="page" text="(page %p)" lang="en"/>
+<l:template name="docname" text=" in %o" lang="en"/>
+<l:template name="docnamelong" text=" in the document titled %o" lang="en"/>
+<l:template name="pageabbrev" text="(p. %p)" lang="en"/>
+<l:template name="Page" text="Page %p" lang="en"/>
+<l:template name="bridgehead" text="&amp;#x201C;%t&amp;#x201D;"/>
+<l:template name="refsection" text="&amp;#x201C;%t&amp;#x201D;"/>
+<l:template name="refsect1" text="&amp;#x201C;%t&amp;#x201D;"/>
+<l:template name="refsect2" text="&amp;#x201C;%t&amp;#x201D;"/>
+<l:template name="refsect3" text="&amp;#x201C;%t&amp;#x201D;"/>
+<l:template name="sect1" text="&amp;#x201C;%t&amp;#x201D;"/>
+<l:template name="sect2" text="&amp;#x201C;%t&amp;#x201D;"/>
+<l:template name="sect3" text="&amp;#x201C;%t&amp;#x201D;"/>
+<l:template name="sect4" text="&amp;#x201C;%t&amp;#x201D;"/>
+<l:template name="sect5" text="&amp;#x201C;%t&amp;#x201D;"/>
+<l:template name="section" text="&amp;#x201C;%t&amp;#x201D;"/>
+<l:template name="simplesect" text="&amp;#x201C;%t&amp;#x201D;"/>
+</l:context>
+<l:context name="xref-number"><l:template name="answer" text="Α: %n"/>
+<l:template name="appendix" text="ΠαÏάÏτημα %n"/>
+<l:template name="bridgehead" text="Τμήμα %n"/>
+<l:template name="chapter" text="Κεφάλαιο %n"/>
+<l:template name="equation" text="Εξίσωση %n"/>
+<l:template name="example" text="ΠαÏάδειγμα %n"/>
+<l:template name="figure" text="Σχήμα %n"/>
+<l:template name="part" text="ΜέÏος %n"/>
+<l:template name="procedure" text="Διαδικασία %n"/>
+<l:template name="productionset" text="ΠαÏαγωγή %n"/>
+<l:template name="qandadiv" text="Ε και Α %n"/>
+<l:template name="qandaentry" text="Ε: %n"/>
+<l:template name="question" text="Ε: %n"/>
+<l:template name="sect1" text="Τμήμα %n"/>
+<l:template name="sect2" text="Τμήμα %n"/>
+<l:template name="sect3" text="Τμήμα %n"/>
+<l:template name="sect4" text="Τμήμα %n"/>
+<l:template name="sect5" text="Τμήμα %n"/>
+<l:template name="section" text="Τμήμα %n"/>
+<l:template name="table" text="Πίνακας %n"/>
+</l:context>
+<l:context name="xref-number-and-title"><l:template name="appendix" text="ΠαÏάÏτημα %n, %t"/>
+<l:template name="bridgehead" text="Τμήμα %n, &amp;#x201C;%t&amp;#x201D;"/>
+<l:template name="chapter" text="Κεφάλαιο %n, %t"/>
+<l:template name="equation" text="Εξίσωση %n, &amp;#x201C;%t&amp;#x201D;"/>
+<l:template name="example" text="ΠαÏάδειγμα %n, &amp;#x201C;%t&amp;#x201D;"/>
+<l:template name="figure" text="Σχήμα %n, &amp;#x201C;%t&amp;#x201D;"/>
+<l:template name="part" text="ΜέÏος %n, &amp;#x201C;%t&amp;#x201D;"/>
+<l:template name="procedure" text="Διαδικασία %n, &amp;#x201C;%t&amp;#x201D;"/>
+<l:template name="productionset" text="ΠαÏαγωγή %n, &amp;#x201C;%t&amp;#x201D;"/>
+<l:template name="qandadiv" text="Ε και Α %n, &amp;#x201C;%t&amp;#x201D;"/>
+<l:template name="refsect1" text="το τμήμα ονομάζεται &amp;#x201C;%t&amp;#x201D;"/>
+<l:template name="refsect2" text="το τμήμα ονομάζεται &amp;#x201C;%t&amp;#x201D;"/>
+<l:template name="refsect3" text="το τμήμα ονομάζεται &amp;#x201C;%t&amp;#x201D;"/>
+<l:template name="refsection" text="το τμήμα ονομάζεται &amp;#x201C;%t&amp;#x201D;"/>
+<l:template name="sect1" text="Τμήμα %n, &amp;#x201C;%t&amp;#x201D;"/>
+<l:template name="sect2" text="Τμήμα %n, &amp;#x201C;%t&amp;#x201D;"/>
+<l:template name="sect3" text="Τμήμα %n, &amp;#x201C;%t&amp;#x201D;"/>
+<l:template name="sect4" text="Τμήμα %n, &amp;#x201C;%t&amp;#x201D;"/>
+<l:template name="sect5" text="Τμήμα %n, &amp;#x201C;%t&amp;#x201D;"/>
+<l:template name="section" text="Τμήμα %n, &amp;#x201C;%t&amp;#x201D;"/>
+<l:template name="simplesect" text="το τμήμα ονομάζεται &amp;#x201C;%t&amp;#x201D;"/>
+<l:template name="table" text="Πίνακας %n, &amp;#x201C;%t&amp;#x201D;"/>
+</l:context>
+<l:context name="authorgroup"><l:template name="sep" text=", "/>
+<l:template name="sep2" text=" και "/>
+<l:template name="seplast" text=", και "/>
+</l:context>
+<l:context name="glossary"><l:template name="see" text="Δείτε %t."/>
+<l:template name="seealso" text="Δείτε Επίσης %t."/>
+<l:template name="seealso-separator" text=", "/>
+</l:context>
+<l:context name="msgset"><l:template name="MsgAud" text="ΑκÏοατήÏιο: "/>
+<l:template name="MsgLevel" text="Επίπεδο: "/>
+<l:template name="MsgOrig" text="Πηγή: "/>
+</l:context>
+<l:context name="datetime"><l:template name="format" text="d/m/Y"/>
+</l:context>
+<l:context name="termdef"><l:template name="prefix" text="[Definition: "/>
+<l:template name="suffix" text="]"/>
+</l:context>
+<l:context name="datetime-full"><l:template name="January" text="ΙανουάÏιος"/>
+<l:template name="February" text="ΦεβÏουάÏιος"/>
+<l:template name="March" text="ΜάÏτιος"/>
+<l:template name="April" text="ΑπÏίλιος"/>
+<l:template name="May" text="Μάιος"/>
+<l:template name="June" text="ΙοÏνιος"/>
+<l:template name="July" text="ΙοÏλιος"/>
+<l:template name="August" text="ΑÏγουστος"/>
+<l:template name="September" text="ΣεπτέμβÏιος"/>
+<l:template name="October" text="ΟκτώβÏιος"/>
+<l:template name="November" text="ÎοέμβÏιος"/>
+<l:template name="December" text="ΔεκέμβÏιος"/>
+<l:template name="Monday" text="ΔευτέÏα"/>
+<l:template name="Tuesday" text="ΤÏίτη"/>
+<l:template name="Wednesday" text="ΤετάÏτη"/>
+<l:template name="Thursday" text="Πέμπτη"/>
+<l:template name="Friday" text="ΠαÏασκευή"/>
+<l:template name="Saturday" text="Σάββατο"/>
+<l:template name="Sunday" text="ΚυÏιακή"/>
+</l:context>
+<l:context name="datetime-abbrev"><l:template name="Jan" text="Ιαν"/>
+<l:template name="Feb" text="Φλεβ"/>
+<l:template name="Mar" text="ΜάÏ"/>
+<l:template name="Apr" text="ΑπÏ"/>
+<l:template name="May" text="Μάης"/>
+<l:template name="Jun" text="ΙοÏν"/>
+<l:template name="Jul" text="ΙοÏλ"/>
+<l:template name="Aug" text="ΑÏγ"/>
+<l:template name="Sep" text="Σεπτ"/>
+<l:template name="Oct" text="Οκτ"/>
+<l:template name="Nov" text="Îοεμ"/>
+<l:template name="Dec" text="Δεκ"/>
+<l:template name="Mon" text="Δευτ"/>
+<l:template name="Tue" text="ΤÏ"/>
+<l:template name="Wed" text="Τετ"/>
+<l:template name="Thu" text="Πεμ"/>
+<l:template name="Fri" text="ΠαÏ"/>
+<l:template name="Sat" text="Σάβ"/>
+<l:template name="Sun" text="ΚυÏ"/>
+</l:context>
+<l:context name="htmlhelp"><l:template name="langcode" text="0x0408 Greek"/>
+</l:context>
+<l:context name="index"><l:template name="term-separator" text=", "/>
+<l:template name="number-separator" text=", "/>
+<l:template name="range-separator" text="-"/>
+</l:context>
+<l:context name="iso690"><l:template name="lastfirst.sep" text=", "/>
+<l:template name="alt.person.two.sep" text=" – "/>
+<l:template name="alt.person.last.sep" text=" – "/>
+<l:template name="alt.person.more.sep" text=" – "/>
+<l:template name="primary.editor" text=" (ed.)"/>
+<l:template name="primary.many" text=", et al."/>
+<l:template name="primary.sep" text=". "/>
+<l:template name="submaintitle.sep" text=": "/>
+<l:template name="title.sep" text=". "/>
+<l:template name="othertitle.sep" text=", "/>
+<l:template name="medium1" text=" ["/>
+<l:template name="medium2" text="]"/>
+<l:template name="secondary.person.sep" text="; "/>
+<l:template name="secondary.sep" text=". "/>
+<l:template name="respons.sep" text=". "/>
+<l:template name="edition.sep" text=". "/>
+<l:template name="edition.serial.sep" text=", "/>
+<l:template name="issuing.range" text="-"/>
+<l:template name="issuing.div" text=", "/>
+<l:template name="issuing.sep" text=". "/>
+<l:template name="partnr.sep" text=". "/>
+<l:template name="placepubl.sep" text=": "/>
+<l:template name="publyear.sep" text=", "/>
+<l:template name="pubinfo.sep" text=". "/>
+<l:template name="spec.pubinfo.sep" text=", "/>
+<l:template name="upd.sep" text=", "/>
+<l:template name="datecit1" text=" [cited "/>
+<l:template name="datecit2" text="]"/>
+<l:template name="extent.sep" text=". "/>
+<l:template name="locs.sep" text=", "/>
+<l:template name="location.sep" text=". "/>
+<l:template name="serie.sep" text=". "/>
+<l:template name="notice.sep" text=". "/>
+<l:template name="access" text="Available "/>
+<l:template name="acctoo" text="Also available "/>
+<l:template name="onwww" text="from World Wide Web"/>
+<l:template name="oninet" text="from Internet"/>
+<l:template name="access.end" text=": "/>
+<l:template name="link1" text="&lt;"/>
+<l:template name="link2" text="&gt;"/>
+<l:template name="access.sep" text=". "/>
+<l:template name="isbn" text="ISBN "/>
+<l:template name="issn" text="ISSN "/>
+<l:template name="stdnum.sep" text=". "/>
+<l:template name="patcountry.sep" text=". "/>
+<l:template name="pattype.sep" text=", "/>
+<l:template name="patnum.sep" text=". "/>
+<l:template name="patdate.sep" text=". "/>
+</l:context><l:letters><l:l i="-1"/>
+<l:l i="0">ΣÏμβολα</l:l>
+<l:l i="10">A</l:l>
+<l:l i="10">a</l:l>
+<l:l i="20">B</l:l>
+<l:l i="20">b</l:l>
+<l:l i="30">C</l:l>
+<l:l i="30">c</l:l>
+<l:l i="40">D</l:l>
+<l:l i="40">d</l:l>
+<l:l i="50">E</l:l>
+<l:l i="50">e</l:l>
+<l:l i="60">F</l:l>
+<l:l i="60">f</l:l>
+<l:l i="70">G</l:l>
+<l:l i="70">g</l:l>
+<l:l i="80">H</l:l>
+<l:l i="80">h</l:l>
+<l:l i="90">I</l:l>
+<l:l i="90">i</l:l>
+<l:l i="100">J</l:l>
+<l:l i="100">j</l:l>
+<l:l i="110">K</l:l>
+<l:l i="110">k</l:l>
+<l:l i="120">L</l:l>
+<l:l i="120">l</l:l>
+<l:l i="130">M</l:l>
+<l:l i="130">m</l:l>
+<l:l i="140">N</l:l>
+<l:l i="140">n</l:l>
+<l:l i="150">O</l:l>
+<l:l i="150">o</l:l>
+<l:l i="160">P</l:l>
+<l:l i="160">p</l:l>
+<l:l i="170">Q</l:l>
+<l:l i="170">q</l:l>
+<l:l i="180">R</l:l>
+<l:l i="180">r</l:l>
+<l:l i="190">S</l:l>
+<l:l i="190">s</l:l>
+<l:l i="200">T</l:l>
+<l:l i="200">t</l:l>
+<l:l i="210">U</l:l>
+<l:l i="210">u</l:l>
+<l:l i="220">V</l:l>
+<l:l i="220">v</l:l>
+<l:l i="230">W</l:l>
+<l:l i="230">w</l:l>
+<l:l i="240">X</l:l>
+<l:l i="240">x</l:l>
+<l:l i="250">Y</l:l>
+<l:l i="250">y</l:l>
+<l:l i="260">Z</l:l>
+<l:l i="260">z</l:l>
+<l:l i="270">Α</l:l>
+<l:l i="270">α</l:l>
+<l:l i="270">Ά</l:l>
+<l:l i="270">ά</l:l>
+<l:l i="280">Î’</l:l>
+<l:l i="280">β</l:l>
+<l:l i="290">Γ</l:l>
+<l:l i="290">γ</l:l>
+<l:l i="300">Δ</l:l>
+<l:l i="300">δ</l:l>
+<l:l i="310">Ε</l:l>
+<l:l i="310">ε</l:l>
+<l:l i="310">Έ</l:l>
+<l:l i="310">έ</l:l>
+<l:l i="320">Ζ</l:l>
+<l:l i="320">ζ</l:l>
+<l:l i="330">Η</l:l>
+<l:l i="330">η</l:l>
+<l:l i="330">Ή</l:l>
+<l:l i="330">ή</l:l>
+<l:l i="340">Θ</l:l>
+<l:l i="340">θ</l:l>
+<l:l i="350">Ι</l:l>
+<l:l i="350">ι</l:l>
+<l:l i="350">Ί</l:l>
+<l:l i="350">ί</l:l>
+<l:l i="350">Ϊ</l:l>
+<l:l i="350">ÏŠ</l:l>
+<l:l i="350">Î</l:l>
+<l:l i="360">Κ</l:l>
+<l:l i="360">κ</l:l>
+<l:l i="370">Λ</l:l>
+<l:l i="370">λ</l:l>
+<l:l i="380">Μ</l:l>
+<l:l i="380">μ</l:l>
+<l:l i="390">Î</l:l>
+<l:l i="390">ν</l:l>
+<l:l i="400">Ξ</l:l>
+<l:l i="400">ξ</l:l>
+<l:l i="410">Ο</l:l>
+<l:l i="410">ο</l:l>
+<l:l i="410">Ό</l:l>
+<l:l i="410">ό</l:l>
+<l:l i="420">Π</l:l>
+<l:l i="420">Ï€</l:l>
+<l:l i="430">Ρ</l:l>
+<l:l i="430">Ï</l:l>
+<l:l i="440">Σ</l:l>
+<l:l i="440">σ</l:l>
+<l:l i="440">Ï‚</l:l>
+<l:l i="450">Τ</l:l>
+<l:l i="450">Ï„</l:l>
+<l:l i="460">Î¥</l:l>
+<l:l i="460">Ï…</l:l>
+<l:l i="460">ÎŽ</l:l>
+<l:l i="460">Ï</l:l>
+<l:l i="460">Ϋ</l:l>
+<l:l i="460">Ï‹</l:l>
+<l:l i="460">ΰ</l:l>
+<l:l i="470">Φ</l:l>
+<l:l i="470">φ</l:l>
+<l:l i="480">Χ</l:l>
+<l:l i="480">χ</l:l>
+<l:l i="490">Ψ</l:l>
+<l:l i="490">ψ</l:l>
+<l:l i="500">Ω</l:l>
+<l:l i="500">ω</l:l>
+<l:l i="500">Î</l:l>
+<l:l i="500">ÏŽ</l:l>
+</l:letters>
+</l:l10n>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/en.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/en.xml
new file mode 100644
index 0000000..b77f2c2
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/en.xml
@@ -0,0 +1,1229 @@
+<?xml version="1.0" encoding="utf-8"?>
+<l:l10n xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0" language="en" english-language-name="English">
+
+<!-- * This file is generated automatically. -->
+<!-- * To submit changes to this file upstream (to the DocBook Project) -->
+<!-- * do not submit an edited version of this file. Instead, submit an -->
+<!-- * edited version of the source file at the following location: -->
+<!-- * -->
+<!-- * https://docbook.svn.sourceforge.net/svnroot/docbook/trunk/gentext/locale/en.xml -->
+<!-- * -->
+<!-- * E-mail the edited en.xml source file to: -->
+<!-- * -->
+<!-- * docbook-developers@lists.sourceforge.net -->
+
+<!-- ******************************************************************** -->
+
+<!-- This file is part of the XSL DocBook Stylesheet distribution. -->
+<!-- See ../README or http://docbook.sf.net/release/xsl/current/ for -->
+<!-- copyright and other information. -->
+
+<!-- ******************************************************************** -->
+<!-- In these files, % with a letter is used for a placeholder: -->
+<!-- %t is the current element's title -->
+<!-- %s is the current element's subtitle (if applicable)-->
+<!-- %n is the current element's number label-->
+<!-- %p is the current element's page number (if applicable)-->
+<!-- ******************************************************************** -->
+
+
+<l:gentext key="Abstract" text="Abstract"/>
+<l:gentext key="abstract" text="Abstract"/>
+<l:gentext key="Acknowledgements" text="Acknowledgements"/>
+<l:gentext key="acknowledgements" text="Acknowledgements"/>
+<l:gentext key="Answer" text="A:"/>
+<l:gentext key="answer" text="A:"/>
+<l:gentext key="Appendix" text="Appendix"/>
+<l:gentext key="appendix" text="Appendix"/>
+<l:gentext key="Article" text="Article"/>
+<l:gentext key="article" text="Article"/>
+<l:gentext key="Author" text="Author"/>
+<l:gentext key="Bibliography" text="Bibliography"/>
+<l:gentext key="bibliography" text="Bibliography"/>
+<l:gentext key="Book" text="Book"/>
+<l:gentext key="book" text="Book"/>
+<l:gentext key="CAUTION" text="CAUTION"/>
+<l:gentext key="Caution" text="Caution"/>
+<l:gentext key="caution" text="Caution"/>
+<l:gentext key="Chapter" text="Chapter"/>
+<l:gentext key="chapter" text="Chapter"/>
+<l:gentext key="Colophon" text="Colophon"/>
+<l:gentext key="colophon" text="Colophon"/>
+<l:gentext key="Copyright" text="Copyright"/>
+<l:gentext key="copyright" text="Copyright"/>
+<l:gentext key="Dedication" text="Dedication"/>
+<l:gentext key="dedication" text="Dedication"/>
+<l:gentext key="Edition" text="Edition"/>
+<l:gentext key="edition" text="Edition"/>
+<l:gentext key="Editor" text="Editor"/>
+<l:gentext key="Equation" text="Equation"/>
+<l:gentext key="equation" text="Equation"/>
+<l:gentext key="Example" text="Example"/>
+<l:gentext key="example" text="Example"/>
+<l:gentext key="Figure" text="Figure"/>
+<l:gentext key="figure" text="Figure"/>
+<l:gentext key="Glossary" text="Glossary"/>
+<l:gentext key="glossary" text="Glossary"/>
+<l:gentext key="GlossSee" text="See"/>
+<l:gentext key="glosssee" text="See"/>
+<l:gentext key="GlossSeeAlso" text="See Also"/>
+<l:gentext key="glossseealso" text="See Also"/>
+<l:gentext key="IMPORTANT" text="IMPORTANT"/>
+<l:gentext key="important" text="Important"/>
+<l:gentext key="Important" text="Important"/>
+<l:gentext key="Index" text="Index"/>
+<l:gentext key="index" text="Index"/>
+<l:gentext key="ISBN" text="ISBN"/>
+<l:gentext key="isbn" text="ISBN"/>
+<l:gentext key="LegalNotice" text="Legal Notice"/>
+<l:gentext key="legalnotice" text="Legal Notice"/>
+<l:gentext key="MsgAud" text="Audience"/>
+<l:gentext key="msgaud" text="Audience"/>
+<l:gentext key="MsgLevel" text="Level"/>
+<l:gentext key="msglevel" text="Level"/>
+<l:gentext key="MsgOrig" text="Origin"/>
+<l:gentext key="msgorig" text="Origin"/>
+<l:gentext key="NOTE" text="NOTE"/>
+<l:gentext key="Note" text="Note"/>
+<l:gentext key="note" text="Note"/>
+<l:gentext key="Part" text="Part"/>
+<l:gentext key="part" text="Part"/>
+<l:gentext key="Preface" text="Preface"/>
+<l:gentext key="preface" text="Preface"/>
+<l:gentext key="Procedure" text="Procedure"/>
+<l:gentext key="procedure" text="Procedure"/>
+<l:gentext key="ProductionSet" text="Production"/>
+<l:gentext key="PubDate" text="Publication Date"/>
+<l:gentext key="pubdate" text="Publication date"/>
+<l:gentext key="Published" text="Published"/>
+<l:gentext key="published" text="Published"/>
+<l:gentext key="Publisher" text="Publisher"/>
+<l:gentext key="Qandadiv" text="Q &amp; A"/>
+<l:gentext key="qandadiv" text="Q &amp; A"/>
+<l:gentext key="QandASet" text="Frequently Asked Questions"/>
+<l:gentext key="Question" text="Q:"/>
+<l:gentext key="question" text="Q:"/>
+<l:gentext key="RefEntry" text=""/>
+<l:gentext key="refentry" text=""/>
+<l:gentext key="Reference" text="Reference"/>
+<l:gentext key="reference" text="Reference"/>
+<l:gentext key="References" text="References"/>
+<l:gentext key="RefName" text="Name"/>
+<l:gentext key="refname" text="Name"/>
+<l:gentext key="RefSection" text=""/>
+<l:gentext key="refsection" text=""/>
+<l:gentext key="RefSynopsisDiv" text="Synopsis"/>
+<l:gentext key="refsynopsisdiv" text="Synopsis"/>
+<l:gentext key="RevHistory" text="Revision History"/>
+<l:gentext key="revhistory" text="Revision History"/>
+<l:gentext key="revision" text="Revision"/>
+<l:gentext key="Revision" text="Revision"/>
+<l:gentext key="sect1" text="Section"/>
+<l:gentext key="sect2" text="Section"/>
+<l:gentext key="sect3" text="Section"/>
+<l:gentext key="sect4" text="Section"/>
+<l:gentext key="sect5" text="Section"/>
+<l:gentext key="section" text="Section"/>
+<l:gentext key="Section" text="Section"/>
+<l:gentext key="see" text="see"/>
+<l:gentext key="See" text="See"/>
+<l:gentext key="seealso" text="see also"/>
+<l:gentext key="Seealso" text="See also"/>
+<l:gentext key="SeeAlso" text="See Also"/>
+<l:gentext key="set" text="Set"/>
+<l:gentext key="Set" text="Set"/>
+<l:gentext key="setindex" text="Set Index"/>
+<l:gentext key="SetIndex" text="Set Index"/>
+<l:gentext key="Sidebar" text=""/>
+<l:gentext key="sidebar" text="sidebar"/>
+<l:gentext key="step" text="step"/>
+<l:gentext key="Step" text="Step"/>
+<l:gentext key="table" text="Table"/>
+<l:gentext key="Table" text="Table"/>
+<l:gentext key="task" text="Task"/>
+<l:gentext key="Task" text="Task"/>
+<l:gentext key="tip" text="Tip"/>
+<l:gentext key="TIP" text="TIP"/>
+<l:gentext key="Tip" text="Tip"/>
+<l:gentext key="Warning" text="Warning"/>
+<l:gentext key="warning" text="Warning"/>
+<l:gentext key="WARNING" text="WARNING"/>
+<l:gentext key="and" text="and"/>
+<l:gentext key="by" text="by"/>
+<l:gentext key="Edited" text="Edited"/>
+<l:gentext key="edited" text="Edited"/>
+<l:gentext key="Editedby" text="Edited by"/>
+<l:gentext key="editedby" text="Edited by"/>
+<l:gentext key="in" text="in"/>
+<l:gentext key="lastlistcomma" text=","/>
+<l:gentext key="listcomma" text=","/>
+<l:gentext key="notes" text="Notes"/>
+<l:gentext key="Notes" text="Notes"/>
+<l:gentext key="Pgs" text="Pgs."/>
+<l:gentext key="pgs" text="Pgs."/>
+<l:gentext key="Revisedby" text="Revised by: "/>
+<l:gentext key="revisedby" text="Revised by: "/>
+<l:gentext key="TableNotes" text="Notes"/>
+<l:gentext key="tablenotes" text="Notes"/>
+<l:gentext key="TableofContents" text="Table of Contents"/>
+<l:gentext key="tableofcontents" text="Table of Contents"/>
+<l:gentext key="unexpectedelementname" text="Unexpected element name"/>
+<l:gentext key="unsupported" text="unsupported"/>
+<l:gentext key="xrefto" text="xref to"/>
+<l:gentext key="Authors" text="Authors"/>
+<l:gentext key="copyeditor" text="Copy Editor"/>
+<l:gentext key="graphicdesigner" text="Graphic Designer"/>
+<l:gentext key="productioneditor" text="Production Editor"/>
+<l:gentext key="technicaleditor" text="Technical Editor"/>
+<l:gentext key="translator" text="Translator"/>
+<l:gentext key="listofequations" text="List of Equations"/>
+<l:gentext key="ListofEquations" text="List of Equations"/>
+<l:gentext key="ListofExamples" text="List of Examples"/>
+<l:gentext key="listofexamples" text="List of Examples"/>
+<l:gentext key="ListofFigures" text="List of Figures"/>
+<l:gentext key="listoffigures" text="List of Figures"/>
+<l:gentext key="ListofProcedures" text="List of Procedures"/>
+<l:gentext key="listofprocedures" text="List of Procedures"/>
+<l:gentext key="listoftables" text="List of Tables"/>
+<l:gentext key="ListofTables" text="List of Tables"/>
+<l:gentext key="ListofUnknown" text="List of Unknown"/>
+<l:gentext key="listofunknown" text="List of Unknown"/>
+<l:gentext key="nav-home" text="Home"/>
+<l:gentext key="nav-next" text="Next"/>
+<l:gentext key="nav-next-sibling" text="Fast Forward"/>
+<l:gentext key="nav-prev" text="Prev"/>
+<l:gentext key="nav-prev-sibling" text="Fast Backward"/>
+<l:gentext key="nav-up" text="Up"/>
+<l:gentext key="nav-toc" text="ToC"/>
+<l:gentext key="Draft" text="Draft"/>
+<l:gentext key="above" text="above"/>
+<l:gentext key="below" text="below"/>
+<l:gentext key="sectioncalled" text="the section called"/>
+<l:gentext key="index symbols" text="Symbols"/>
+<l:gentext key="writing-mode" text="lr-tb"/>
+<l:gentext key="lowercase.alpha" text="abcdefghijklmnopqrstuvwxyz"/>
+<l:gentext key="uppercase.alpha" text="ABCDEFGHIJKLMNOPQRSTUVWXYZ"/>
+<l:gentext key="normalize.sort.input" text="AaÀàÃáÂâÃãÄäÅåĀÄĂ㥹ÇǎǞǟǠǡǺǻȀÈȂȃȦȧḀá¸áºšáº áº¡áº¢áº£áº¤áº¥áº¦áº§áº¨áº©áºªáº«áº¬áº­áº®áº¯áº°áº±áº²áº³áº´áºµáº¶áº·BbÆ€ÆɓƂƃḂḃḄḅḆḇCcÇçĆćĈĉĊċČÄƇƈɕḈḉDdÄŽÄÄđƊɗƋƌDžDzȡɖḊḋḌá¸á¸Žá¸á¸á¸‘ḒḓEeÈèÉéÊêËëĒēĔĕĖėĘęĚěȄȅȆȇȨȩḔḕḖḗḘḙḚḛḜá¸áº¸áº¹áººáº»áº¼áº½áº¾áº¿á»€á»á»‚ểỄễỆệFfƑƒḞḟGgÄœÄĞğĠġĢģƓɠǤǥǦǧǴǵḠḡHhĤĥĦħȞȟɦḢḣḤḥḦḧḨḩḪḫẖIiÌìÃíÎîÃïĨĩĪīĬĭĮįİƗɨÇÇȈȉȊȋḬḭḮḯỈỉỊịJjĴĵǰÊKkĶķƘƙǨǩḰḱḲḳḴḵLlĹĺĻļĽľĿŀÅłƚLjȴɫɬɭḶḷḸḹḺḻḼḽMmɱḾḿṀá¹á¹‚ṃNnÑñŃńŅņŇňÆɲƞȠNjǸǹȵɳṄṅṆṇṈṉṊṋOoÒòÓóÔôÕõÖöØøŌÅÅŽÅÅőƟƠơǑǒǪǫǬǭǾǿȌÈÈŽÈȪȫȬȭȮȯȰȱṌá¹á¹Žá¹á¹á¹‘ṒṓỌá»á»Žá»á»á»‘ỒồỔổỖỗỘộỚớỜá»á»žá»Ÿá» á»¡á»¢á»£PpƤƥṔṕṖṗQqÊ RrŔŕŖŗŘřÈȑȒȓɼɽɾṘṙṚṛṜá¹á¹žá¹ŸSsŚśŜÅŞşŠšȘșʂṠṡṢṣṤṥṦṧṨṩTtŢţŤťŦŧƫƬƭƮʈȚțȶṪṫṬṭṮṯṰṱẗUuÙùÚúÛûÜüŨũŪūŬŭŮůŰűŲųƯưǓǔǕǖǗǘǙǚǛǜȔȕȖȗṲṳṴṵṶṷṸṹṺṻỤụỦủỨứỪừỬửỮữỰựVvƲʋṼṽṾṿWwŴŵẀáºáº‚ẃẄẅẆẇẈẉẘXxẊẋẌáºYyÃýÿŸŶŷƳƴȲȳẎáºáº™á»²á»³á»´á»µá»¶á»·á»¸á»¹ZzŹźŻżŽžƵƶȤȥÊÊ‘áºáº‘ẒẓẔẕẕ"/>
+<l:gentext key="normalize.sort.output" text="AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBCCCCCCCCCCCCCCCCCDDDDDDDDDDDDDDDDDDDDDDDDEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEFFFFFFGGGGGGGGGGGGGGGGGGGGHHHHHHHHHHHHHHHHHHHHIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIJJJJJJKKKKKKKKKKKKKKLLLLLLLLLLLLLLLLLLLLLLLLLLMMMMMMMMMNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOPPPPPPPPQQQRRRRRRRRRRRRRRRRRRRRRRRSSSSSSSSSSSSSSSSSSSSSSSTTTTTTTTTTTTTTTTTTTTTTTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUVVVVVVVVWWWWWWWWWWWWWWWXXXXXXYYYYYYYYYYYYYYYYYYYYYYYZZZZZZZZZZZZZZZZZZZZZ"/>
+<l:dingbat key="startquote" text="“"/>
+<l:dingbat key="endquote" text="â€"/>
+<l:dingbat key="nestedstartquote" text="‘"/>
+<l:dingbat key="nestedendquote" text="’"/>
+<l:dingbat key="singlestartquote" text="‘"/>
+<l:dingbat key="singleendquote" text="’"/>
+<l:dingbat key="bullet" text="•"/>
+<l:gentext key="hyphenation-character" text="-"/>
+<l:gentext key="hyphenation-push-character-count" text="2"/>
+<l:gentext key="hyphenation-remain-character-count" text="2"/>
+<l:context name="styles"><l:template name="person-name" text="first-last"/>
+</l:context>
+<l:context name="title"><l:template name="abstract" text="%t"/>
+<l:template name="acknowledgements" text="%t"/>
+<l:template name="answer" text="%t"/>
+<l:template name="appendix" text="Appendix %n. %t"/>
+<l:template name="article" text="%t"/>
+<l:template name="authorblurb" text="%t"/>
+<l:template name="bibliodiv" text="%t"/>
+<l:template name="biblioentry" text="%t"/>
+<l:template name="bibliography" text="%t"/>
+<l:template name="bibliolist" text="%t"/>
+<l:template name="bibliomixed" text="%t"/>
+<l:template name="bibliomset" text="%t"/>
+<l:template name="biblioset" text="%t"/>
+<l:template name="blockquote" text="%t"/>
+<l:template name="book" text="%t"/>
+<l:template name="calloutlist" text="%t"/>
+<l:template name="caution" text="%t"/>
+<l:template name="chapter" text="Chapter %n. %t"/>
+<l:template name="colophon" text="%t"/>
+<l:template name="dedication" text="%t"/>
+<l:template name="equation" text="Equation %n. %t"/>
+<l:template name="example" text="Example %n. %t"/>
+<l:template name="figure" text="Figure %n. %t"/>
+<l:template name="foil" text="%t"/>
+<l:template name="foilgroup" text="%t"/>
+<l:template name="formalpara" text="%t"/>
+<l:template name="glossary" text="%t"/>
+<l:template name="glossdiv" text="%t"/>
+<l:template name="glosslist" text="%t"/>
+<l:template name="glossentry" text="%t"/>
+<l:template name="important" text="%t"/>
+<l:template name="index" text="%t"/>
+<l:template name="indexdiv" text="%t"/>
+<l:template name="itemizedlist" text="%t"/>
+<l:template name="legalnotice" text="%t"/>
+<l:template name="listitem" text=""/>
+<l:template name="lot" text="%t"/>
+<l:template name="msg" text="%t"/>
+<l:template name="msgexplan" text="%t"/>
+<l:template name="msgmain" text="%t"/>
+<l:template name="msgrel" text="%t"/>
+<l:template name="msgset" text="%t"/>
+<l:template name="msgsub" text="%t"/>
+<l:template name="note" text="%t"/>
+<l:template name="orderedlist" text="%t"/>
+<l:template name="part" text="Part %n. %t"/>
+<l:template name="partintro" text="%t"/>
+<l:template name="preface" text="%t"/>
+<l:template name="procedure" text="%t"/>
+<l:template name="procedure.formal" text="Procedure %n. %t"/>
+<l:template name="productionset" text="%t"/>
+<l:template name="productionset.formal" text="Production %n"/>
+<l:template name="qandadiv" text="%t"/>
+<l:template name="qandaentry" text="%t"/>
+<l:template name="qandaset" text="%t"/>
+<l:template name="question" text="%t"/>
+<l:template name="refentry" text="%t"/>
+<l:template name="reference" text="%t"/>
+<l:template name="refsection" text="%t"/>
+<l:template name="refsect1" text="%t"/>
+<l:template name="refsect2" text="%t"/>
+<l:template name="refsect3" text="%t"/>
+<l:template name="refsynopsisdiv" text="%t"/>
+<l:template name="refsynopsisdivinfo" text="%t"/>
+<l:template name="segmentedlist" text="%t"/>
+<l:template name="set" text="%t"/>
+<l:template name="setindex" text="%t"/>
+<l:template name="sidebar" text="%t"/>
+<l:template name="step" text="%t"/>
+<l:template name="table" text="Table %n. %t"/>
+<l:template name="task" text="%t"/>
+<l:template name="tasksummary" text="%t"/>
+<l:template name="taskprerequisites" text="%t"/>
+<l:template name="taskrelated" text="%t"/>
+<l:template name="tip" text="%t"/>
+<l:template name="toc" text="%t"/>
+<l:template name="variablelist" text="%t"/>
+<l:template name="varlistentry" text=""/>
+<l:template name="warning" text="%t"/>
+</l:context>
+<l:context name="title-unnumbered"><l:template name="appendix" text="%t"/>
+<l:template name="article/appendix" text="%t"/>
+<l:template name="bridgehead" text="%t"/>
+<l:template name="chapter" text="%t"/>
+<l:template name="sect1" text="%t"/>
+<l:template name="sect2" text="%t"/>
+<l:template name="sect3" text="%t"/>
+<l:template name="sect4" text="%t"/>
+<l:template name="sect5" text="%t"/>
+<l:template name="section" text="%t"/>
+<l:template name="simplesect" text="%t"/>
+<l:template name="part" text="%t"/>
+</l:context>
+<l:context name="title-numbered"><l:template name="appendix" text="Appendix %n. %t"/>
+<l:template name="article/appendix" text="%n. %t"/>
+<l:template name="bridgehead" text="%n. %t"/>
+<l:template name="chapter" text="Chapter %n. %t"/>
+<l:template name="part" text="Part %n. %t"/>
+<l:template name="sect1" text="%n. %t"/>
+<l:template name="sect2" text="%n. %t"/>
+<l:template name="sect3" text="%n. %t"/>
+<l:template name="sect4" text="%n. %t"/>
+<l:template name="sect5" text="%n. %t"/>
+<l:template name="section" text="%n. %t"/>
+<l:template name="simplesect" text="%t"/>
+</l:context>
+<l:context name="subtitle"><l:template name="appendix" text="%s"/>
+<l:template name="acknowledgements" text="%s"/>
+<l:template name="article" text="%s"/>
+<l:template name="bibliodiv" text="%s"/>
+<l:template name="biblioentry" text="%s"/>
+<l:template name="bibliography" text="%s"/>
+<l:template name="bibliomixed" text="%s"/>
+<l:template name="bibliomset" text="%s"/>
+<l:template name="biblioset" text="%s"/>
+<l:template name="book" text="%s"/>
+<l:template name="chapter" text="%s"/>
+<l:template name="colophon" text="%s"/>
+<l:template name="dedication" text="%s"/>
+<l:template name="glossary" text="%s"/>
+<l:template name="glossdiv" text="%s"/>
+<l:template name="index" text="%s"/>
+<l:template name="indexdiv" text="%s"/>
+<l:template name="lot" text="%s"/>
+<l:template name="part" text="%s"/>
+<l:template name="partintro" text="%s"/>
+<l:template name="preface" text="%s"/>
+<l:template name="refentry" text="%s"/>
+<l:template name="reference" text="%s"/>
+<l:template name="refsection" text="%s"/>
+<l:template name="refsect1" text="%s"/>
+<l:template name="refsect2" text="%s"/>
+<l:template name="refsect3" text="%s"/>
+<l:template name="refsynopsisdiv" text="%s"/>
+<l:template name="sect1" text="%s"/>
+<l:template name="sect2" text="%s"/>
+<l:template name="sect3" text="%s"/>
+<l:template name="sect4" text="%s"/>
+<l:template name="sect5" text="%s"/>
+<l:template name="section" text="%s"/>
+<l:template name="set" text="%s"/>
+<l:template name="setindex" text="%s"/>
+<l:template name="sidebar" text="%s"/>
+<l:template name="simplesect" text="%s"/>
+<l:template name="toc" text="%s"/>
+</l:context>
+<l:context name="xref"><l:template name="abstract" text="%t"/>
+<l:template name="acknowledgements" text="%t"/>
+<l:template name="answer" text="A: %n"/>
+<l:template name="appendix" text="%t"/>
+<l:template name="article" text="%t"/>
+<l:template name="authorblurb" text="%t"/>
+<l:template name="bibliodiv" text="%t"/>
+<l:template name="bibliography" text="%t"/>
+<l:template name="bibliomset" text="%t"/>
+<l:template name="biblioset" text="%t"/>
+<l:template name="blockquote" text="%t"/>
+<l:template name="book" text="%t"/>
+<l:template name="calloutlist" text="%t"/>
+<l:template name="caution" text="%t"/>
+<l:template name="chapter" text="%t"/>
+<l:template name="colophon" text="%t"/>
+<l:template name="constraintdef" text="%t"/>
+<l:template name="dedication" text="%t"/>
+<l:template name="equation" text="%t"/>
+<l:template name="example" text="%t"/>
+<l:template name="figure" text="%t"/>
+<l:template name="foil" text="%t"/>
+<l:template name="foilgroup" text="%t"/>
+<l:template name="formalpara" text="%t"/>
+<l:template name="glossary" text="%t"/>
+<l:template name="glossdiv" text="%t"/>
+<l:template name="important" text="%t"/>
+<l:template name="index" text="%t"/>
+<l:template name="indexdiv" text="%t"/>
+<l:template name="itemizedlist" text="%t"/>
+<l:template name="legalnotice" text="%t"/>
+<l:template name="listitem" text="%n"/>
+<l:template name="lot" text="%t"/>
+<l:template name="msg" text="%t"/>
+<l:template name="msgexplan" text="%t"/>
+<l:template name="msgmain" text="%t"/>
+<l:template name="msgrel" text="%t"/>
+<l:template name="msgset" text="%t"/>
+<l:template name="msgsub" text="%t"/>
+<l:template name="note" text="%t"/>
+<l:template name="orderedlist" text="%t"/>
+<l:template name="part" text="%t"/>
+<l:template name="partintro" text="%t"/>
+<l:template name="preface" text="%t"/>
+<l:template name="procedure" text="%t"/>
+<l:template name="productionset" text="%t"/>
+<l:template name="qandadiv" text="%t"/>
+<l:template name="qandaentry" text="Q: %n"/>
+<l:template name="qandaset" text="%t"/>
+<l:template name="question" text="Q: %n"/>
+<l:template name="reference" text="%t"/>
+<l:template name="refsynopsisdiv" text="%t"/>
+<l:template name="segmentedlist" text="%t"/>
+<l:template name="set" text="%t"/>
+<l:template name="setindex" text="%t"/>
+<l:template name="sidebar" text="%t"/>
+<l:template name="table" text="%t"/>
+<l:template name="task" text="%t"/>
+<l:template name="tip" text="%t"/>
+<l:template name="toc" text="%t"/>
+<l:template name="variablelist" text="%t"/>
+<l:template name="varlistentry" text="%n"/>
+<l:template name="warning" text="%t"/>
+<l:template name="olink.document.citation" text=" in %o"/>
+<l:template name="olink.page.citation" text=" (page %p)"/>
+<l:template name="page.citation" text=" [%p]"/>
+<l:template name="page" text="(page %p)"/>
+<l:template name="docname" text=" in %o"/>
+<l:template name="docnamelong" text=" in the document titled %o"/>
+<l:template name="pageabbrev" text="(p. %p)"/>
+<l:template name="Page" text="Page %p"/>
+<l:template name="bridgehead" text="the section called “%tâ€"/>
+<l:template name="refsection" text="the section called “%tâ€"/>
+<l:template name="refsect1" text="the section called “%tâ€"/>
+<l:template name="refsect2" text="the section called “%tâ€"/>
+<l:template name="refsect3" text="the section called “%tâ€"/>
+<l:template name="sect1" text="the section called “%tâ€"/>
+<l:template name="sect2" text="the section called “%tâ€"/>
+<l:template name="sect3" text="the section called “%tâ€"/>
+<l:template name="sect4" text="the section called “%tâ€"/>
+<l:template name="sect5" text="the section called “%tâ€"/>
+<l:template name="section" text="the section called “%tâ€"/>
+<l:template name="simplesect" text="the section called “%tâ€"/>
+</l:context>
+<l:context name="xref-number"><l:template name="answer" text="A: %n"/>
+<l:template name="appendix" text="Appendix %n"/>
+<l:template name="bridgehead" text="Section %n"/>
+<l:template name="chapter" text="Chapter %n"/>
+<l:template name="equation" text="Equation %n"/>
+<l:template name="example" text="Example %n"/>
+<l:template name="figure" text="Figure %n"/>
+<l:template name="part" text="Part %n"/>
+<l:template name="procedure" text="Procedure %n"/>
+<l:template name="productionset" text="Production %n"/>
+<l:template name="qandadiv" text="Q &amp; A %n"/>
+<l:template name="qandaentry" text="Q: %n"/>
+<l:template name="question" text="Q: %n"/>
+<l:template name="sect1" text="Section %n"/>
+<l:template name="sect2" text="Section %n"/>
+<l:template name="sect3" text="Section %n"/>
+<l:template name="sect4" text="Section %n"/>
+<l:template name="sect5" text="Section %n"/>
+<l:template name="section" text="Section %n"/>
+<l:template name="table" text="Table %n"/>
+</l:context>
+<l:context name="xref-number-and-title"><l:template name="appendix" text="Appendix %n, %t"/>
+<l:template name="bridgehead" text="Section %n, “%tâ€"/>
+<l:template name="chapter" text="Chapter %n, %t"/>
+<l:template name="equation" text="Equation %n, “%tâ€"/>
+<l:template name="example" text="Example %n, “%tâ€"/>
+<l:template name="figure" text="Figure %n, “%tâ€"/>
+<l:template name="part" text="Part %n, “%tâ€"/>
+<l:template name="procedure" text="Procedure %n, “%tâ€"/>
+<l:template name="productionset" text="Production %n, “%tâ€"/>
+<l:template name="qandadiv" text="Q &amp; A %n, “%tâ€"/>
+<l:template name="refsect1" text="the section called “%tâ€"/>
+<l:template name="refsect2" text="the section called “%tâ€"/>
+<l:template name="refsect3" text="the section called “%tâ€"/>
+<l:template name="refsection" text="the section called “%tâ€"/>
+<l:template name="sect1" text="Section %n, “%tâ€"/>
+<l:template name="sect2" text="Section %n, “%tâ€"/>
+<l:template name="sect3" text="Section %n, “%tâ€"/>
+<l:template name="sect4" text="Section %n, “%tâ€"/>
+<l:template name="sect5" text="Section %n, “%tâ€"/>
+<l:template name="section" text="Section %n, “%tâ€"/>
+<l:template name="simplesect" text="the section called “%tâ€"/>
+<l:template name="table" text="Table %n, “%tâ€"/>
+</l:context>
+<l:context name="authorgroup"><l:template name="sep" text=", "/>
+<l:template name="sep2" text=" and "/>
+<l:template name="seplast" text=", and "/>
+</l:context>
+<l:context name="glossary"><l:template name="see" text="See %t."/>
+<l:template name="seealso" text="See Also %t."/>
+<l:template name="seealso-separator" text=", "/>
+</l:context>
+<l:context name="msgset"><l:template name="MsgAud" text="Audience: "/>
+<l:template name="MsgLevel" text="Level: "/>
+<l:template name="MsgOrig" text="Origin: "/>
+</l:context>
+<l:context name="datetime"><l:template name="format" text="m/d/Y"/>
+</l:context>
+<l:context name="termdef"><l:template name="prefix" text="[Definition: "/>
+<l:template name="suffix" text="]"/>
+</l:context>
+<l:context name="datetime-full"><l:template name="January" text="January"/>
+<l:template name="February" text="February"/>
+<l:template name="March" text="March"/>
+<l:template name="April" text="April"/>
+<l:template name="May" text="May"/>
+<l:template name="June" text="June"/>
+<l:template name="July" text="July"/>
+<l:template name="August" text="August"/>
+<l:template name="September" text="September"/>
+<l:template name="October" text="October"/>
+<l:template name="November" text="November"/>
+<l:template name="December" text="December"/>
+<l:template name="Monday" text="Monday"/>
+<l:template name="Tuesday" text="Tuesday"/>
+<l:template name="Wednesday" text="Wednesday"/>
+<l:template name="Thursday" text="Thursday"/>
+<l:template name="Friday" text="Friday"/>
+<l:template name="Saturday" text="Saturday"/>
+<l:template name="Sunday" text="Sunday"/>
+</l:context>
+<l:context name="datetime-abbrev"><l:template name="Jan" text="Jan"/>
+<l:template name="Feb" text="Feb"/>
+<l:template name="Mar" text="Mar"/>
+<l:template name="Apr" text="Apr"/>
+<l:template name="May" text="May"/>
+<l:template name="Jun" text="Jun"/>
+<l:template name="Jul" text="Jul"/>
+<l:template name="Aug" text="Aug"/>
+<l:template name="Sep" text="Sep"/>
+<l:template name="Oct" text="Oct"/>
+<l:template name="Nov" text="Nov"/>
+<l:template name="Dec" text="Dec"/>
+<l:template name="Mon" text="Mon"/>
+<l:template name="Tue" text="Tue"/>
+<l:template name="Wed" text="Wed"/>
+<l:template name="Thu" text="Thu"/>
+<l:template name="Fri" text="Fri"/>
+<l:template name="Sat" text="Sat"/>
+<l:template name="Sun" text="Sun"/>
+</l:context>
+<l:context name="htmlhelp"><l:template name="langcode" text="0x0409 English (UNITED STATES)"/>
+</l:context>
+<l:context name="index"><l:template name="term-separator" text=", "/>
+<l:template name="number-separator" text=", "/>
+<l:template name="range-separator" text="-"/>
+</l:context>
+<l:context name="iso690"><l:template name="lastfirst.sep" text=", "/>
+<l:template name="alt.person.two.sep" text=" – "/>
+<l:template name="alt.person.last.sep" text=" – "/>
+<l:template name="alt.person.more.sep" text=" – "/>
+<l:template name="primary.editor" text=" (ed.)"/>
+<l:template name="primary.many" text=", et al."/>
+<l:template name="primary.sep" text=". "/>
+<l:template name="submaintitle.sep" text=": "/>
+<l:template name="title.sep" text=". "/>
+<l:template name="othertitle.sep" text=", "/>
+<l:template name="medium1" text=" ["/>
+<l:template name="medium2" text="]"/>
+<l:template name="secondary.person.sep" text="; "/>
+<l:template name="secondary.sep" text=". "/>
+<l:template name="respons.sep" text=". "/>
+<l:template name="edition.sep" text=". "/>
+<l:template name="edition.serial.sep" text=", "/>
+<l:template name="issuing.range" text="-"/>
+<l:template name="issuing.div" text=", "/>
+<l:template name="issuing.sep" text=". "/>
+<l:template name="partnr.sep" text=". "/>
+<l:template name="placepubl.sep" text=": "/>
+<l:template name="publyear.sep" text=", "/>
+<l:template name="pubinfo.sep" text=". "/>
+<l:template name="spec.pubinfo.sep" text=", "/>
+<l:template name="upd.sep" text=", "/>
+<l:template name="datecit1" text=" [cited "/>
+<l:template name="datecit2" text="]"/>
+<l:template name="extent.sep" text=". "/>
+<l:template name="locs.sep" text=", "/>
+<l:template name="location.sep" text=". "/>
+<l:template name="serie.sep" text=". "/>
+<l:template name="notice.sep" text=". "/>
+<l:template name="access" text="Available "/>
+<l:template name="acctoo" text="Also available "/>
+<l:template name="onwww" text="from World Wide Web"/>
+<l:template name="oninet" text="from Internet"/>
+<l:template name="access.end" text=": "/>
+<l:template name="link1" text="&lt;"/>
+<l:template name="link2" text="&gt;"/>
+<l:template name="access.sep" text=". "/>
+<l:template name="isbn" text="ISBN "/>
+<l:template name="issn" text="ISSN "/>
+<l:template name="stdnum.sep" text=". "/>
+<l:template name="patcountry.sep" text=". "/>
+<l:template name="pattype.sep" text=", "/>
+<l:template name="patnum.sep" text=". "/>
+<l:template name="patdate.sep" text=". "/>
+</l:context><l:letters><l:l i="-1"/>
+<l:l i="0">Symbols</l:l>
+<l:l i="10">A</l:l>
+<l:l i="10">a</l:l>
+<l:l i="10">À</l:l>
+<l:l i="10">à</l:l>
+<l:l i="10">Ã</l:l>
+<l:l i="10">á</l:l>
+<l:l i="10">Â</l:l>
+<l:l i="10">â</l:l>
+<l:l i="10">Ã</l:l>
+<l:l i="10">ã</l:l>
+<l:l i="10">Ä</l:l>
+<l:l i="10">ä</l:l>
+<l:l i="10">Ã…</l:l>
+<l:l i="10">Ã¥</l:l>
+<l:l i="10">Ä€</l:l>
+<l:l i="10">Ä</l:l>
+<l:l i="10">Ä‚</l:l>
+<l:l i="10">ă</l:l>
+<l:l i="10">Ä„</l:l>
+<l:l i="10">Ä…</l:l>
+<l:l i="10">Ç</l:l>
+<l:l i="10">ÇŽ</l:l>
+<l:l i="10">Çž</l:l>
+<l:l i="10">ÇŸ</l:l>
+<l:l i="10">Ç </l:l>
+<l:l i="10">Ç¡</l:l>
+<l:l i="10">Ǻ</l:l>
+<l:l i="10">Ç»</l:l>
+<l:l i="10">È€</l:l>
+<l:l i="10">È</l:l>
+<l:l i="10">È‚</l:l>
+<l:l i="10">ȃ</l:l>
+<l:l i="10">Ȧ</l:l>
+<l:l i="10">ȧ</l:l>
+<l:l i="10">Ḁ</l:l>
+<l:l i="10">á¸</l:l>
+<l:l i="10">ẚ</l:l>
+<l:l i="10">Ạ</l:l>
+<l:l i="10">ạ</l:l>
+<l:l i="10">Ả</l:l>
+<l:l i="10">ả</l:l>
+<l:l i="10">Ấ</l:l>
+<l:l i="10">ấ</l:l>
+<l:l i="10">Ầ</l:l>
+<l:l i="10">ầ</l:l>
+<l:l i="10">Ẩ</l:l>
+<l:l i="10">ẩ</l:l>
+<l:l i="10">Ẫ</l:l>
+<l:l i="10">ẫ</l:l>
+<l:l i="10">Ậ</l:l>
+<l:l i="10">ậ</l:l>
+<l:l i="10">Ắ</l:l>
+<l:l i="10">ắ</l:l>
+<l:l i="10">Ằ</l:l>
+<l:l i="10">ằ</l:l>
+<l:l i="10">Ẳ</l:l>
+<l:l i="10">ẳ</l:l>
+<l:l i="10">Ẵ</l:l>
+<l:l i="10">ẵ</l:l>
+<l:l i="10">Ặ</l:l>
+<l:l i="10">ặ</l:l>
+<l:l i="20">B</l:l>
+<l:l i="20">b</l:l>
+<l:l i="20">Æ€</l:l>
+<l:l i="20">Æ</l:l>
+<l:l i="20">É“</l:l>
+<l:l i="20">Æ‚</l:l>
+<l:l i="20">ƃ</l:l>
+<l:l i="20">Ḃ</l:l>
+<l:l i="20">ḃ</l:l>
+<l:l i="20">Ḅ</l:l>
+<l:l i="20">ḅ</l:l>
+<l:l i="20">Ḇ</l:l>
+<l:l i="20">ḇ</l:l>
+<l:l i="30">C</l:l>
+<l:l i="30">c</l:l>
+<l:l i="30">Ç</l:l>
+<l:l i="30">ç</l:l>
+<l:l i="30">Ć</l:l>
+<l:l i="30">ć</l:l>
+<l:l i="30">Ĉ</l:l>
+<l:l i="30">ĉ</l:l>
+<l:l i="30">ÄŠ</l:l>
+<l:l i="30">Ä‹</l:l>
+<l:l i="30">Č</l:l>
+<l:l i="30">Ä</l:l>
+<l:l i="30">Ƈ</l:l>
+<l:l i="30">ƈ</l:l>
+<l:l i="30">É•</l:l>
+<l:l i="30">Ḉ</l:l>
+<l:l i="30">ḉ</l:l>
+<l:l i="40">D</l:l>
+<l:l i="40">d</l:l>
+<l:l i="40">ÄŽ</l:l>
+<l:l i="40">Ä</l:l>
+<l:l i="40">Ä</l:l>
+<l:l i="40">Ä‘</l:l>
+<l:l i="40">ÆŠ</l:l>
+<l:l i="40">É—</l:l>
+<l:l i="40">Æ‹</l:l>
+<l:l i="40">ƌ</l:l>
+<l:l i="40">Ç…</l:l>
+<l:l i="40">Dz</l:l>
+<l:l i="40">È¡</l:l>
+<l:l i="40">É–</l:l>
+<l:l i="40">Ḋ</l:l>
+<l:l i="40">ḋ</l:l>
+<l:l i="40">Ḍ</l:l>
+<l:l i="40">á¸</l:l>
+<l:l i="40">Ḏ</l:l>
+<l:l i="40">á¸</l:l>
+<l:l i="40">á¸</l:l>
+<l:l i="40">ḑ</l:l>
+<l:l i="40">Ḓ</l:l>
+<l:l i="40">ḓ</l:l>
+<l:l i="50">E</l:l>
+<l:l i="50">e</l:l>
+<l:l i="50">È</l:l>
+<l:l i="50">è</l:l>
+<l:l i="50">É</l:l>
+<l:l i="50">é</l:l>
+<l:l i="50">Ê</l:l>
+<l:l i="50">ê</l:l>
+<l:l i="50">Ë</l:l>
+<l:l i="50">ë</l:l>
+<l:l i="50">Ä’</l:l>
+<l:l i="50">Ä“</l:l>
+<l:l i="50">Ä”</l:l>
+<l:l i="50">Ä•</l:l>
+<l:l i="50">Ä–</l:l>
+<l:l i="50">Ä—</l:l>
+<l:l i="50">Ę</l:l>
+<l:l i="50">Ä™</l:l>
+<l:l i="50">Äš</l:l>
+<l:l i="50">Ä›</l:l>
+<l:l i="50">È„</l:l>
+<l:l i="50">È…</l:l>
+<l:l i="50">Ȇ</l:l>
+<l:l i="50">ȇ</l:l>
+<l:l i="50">Ȩ</l:l>
+<l:l i="50">È©</l:l>
+<l:l i="50">Ḕ</l:l>
+<l:l i="50">ḕ</l:l>
+<l:l i="50">Ḗ</l:l>
+<l:l i="50">ḗ</l:l>
+<l:l i="50">Ḙ</l:l>
+<l:l i="50">ḙ</l:l>
+<l:l i="50">Ḛ</l:l>
+<l:l i="50">ḛ</l:l>
+<l:l i="50">Ḝ</l:l>
+<l:l i="50">á¸</l:l>
+<l:l i="50">Ẹ</l:l>
+<l:l i="50">ẹ</l:l>
+<l:l i="50">Ẻ</l:l>
+<l:l i="50">ẻ</l:l>
+<l:l i="50">Ẽ</l:l>
+<l:l i="50">ẽ</l:l>
+<l:l i="50">Ế</l:l>
+<l:l i="50">ế</l:l>
+<l:l i="50">Ề</l:l>
+<l:l i="50">á»</l:l>
+<l:l i="50">Ể</l:l>
+<l:l i="50">ể</l:l>
+<l:l i="50">Ễ</l:l>
+<l:l i="50">á»…</l:l>
+<l:l i="50">Ệ</l:l>
+<l:l i="50">ệ</l:l>
+<l:l i="60">F</l:l>
+<l:l i="60">f</l:l>
+<l:l i="60">Æ‘</l:l>
+<l:l i="60">Æ’</l:l>
+<l:l i="60">Ḟ</l:l>
+<l:l i="60">ḟ</l:l>
+<l:l i="70">G</l:l>
+<l:l i="70">g</l:l>
+<l:l i="70">Ĝ</l:l>
+<l:l i="70">Ä</l:l>
+<l:l i="70">Äž</l:l>
+<l:l i="70">ÄŸ</l:l>
+<l:l i="70">Ä </l:l>
+<l:l i="70">Ä¡</l:l>
+<l:l i="70">Ä¢</l:l>
+<l:l i="70">Ä£</l:l>
+<l:l i="70">Æ“</l:l>
+<l:l i="70">É </l:l>
+<l:l i="70">Ǥ</l:l>
+<l:l i="70">Ç¥</l:l>
+<l:l i="70">Ǧ</l:l>
+<l:l i="70">ǧ</l:l>
+<l:l i="70">Ç´</l:l>
+<l:l i="70">ǵ</l:l>
+<l:l i="70">Ḡ</l:l>
+<l:l i="70">ḡ</l:l>
+<l:l i="80">H</l:l>
+<l:l i="80">h</l:l>
+<l:l i="80">Ĥ</l:l>
+<l:l i="80">Ä¥</l:l>
+<l:l i="80">Ħ</l:l>
+<l:l i="80">ħ</l:l>
+<l:l i="80">Èž</l:l>
+<l:l i="80">ÈŸ</l:l>
+<l:l i="80">ɦ</l:l>
+<l:l i="80">Ḣ</l:l>
+<l:l i="80">ḣ</l:l>
+<l:l i="80">Ḥ</l:l>
+<l:l i="80">ḥ</l:l>
+<l:l i="80">Ḧ</l:l>
+<l:l i="80">ḧ</l:l>
+<l:l i="80">Ḩ</l:l>
+<l:l i="80">ḩ</l:l>
+<l:l i="80">Ḫ</l:l>
+<l:l i="80">ḫ</l:l>
+<l:l i="80">ẖ</l:l>
+<l:l i="90">I</l:l>
+<l:l i="90">i</l:l>
+<l:l i="90">Ì</l:l>
+<l:l i="90">ì</l:l>
+<l:l i="90">Ã</l:l>
+<l:l i="90">í</l:l>
+<l:l i="90">ÃŽ</l:l>
+<l:l i="90">î</l:l>
+<l:l i="90">Ã</l:l>
+<l:l i="90">ï</l:l>
+<l:l i="90">Ĩ</l:l>
+<l:l i="90">Ä©</l:l>
+<l:l i="90">Ī</l:l>
+<l:l i="90">Ä«</l:l>
+<l:l i="90">Ĭ</l:l>
+<l:l i="90">Ä­</l:l>
+<l:l i="90">Ä®</l:l>
+<l:l i="90">į</l:l>
+<l:l i="90">Ä°</l:l>
+<l:l i="90">Æ—</l:l>
+<l:l i="90">ɨ</l:l>
+<l:l i="90">Ç</l:l>
+<l:l i="90">Ç</l:l>
+<l:l i="90">Ȉ</l:l>
+<l:l i="90">ȉ</l:l>
+<l:l i="90">ÈŠ</l:l>
+<l:l i="90">È‹</l:l>
+<l:l i="90">Ḭ</l:l>
+<l:l i="90">ḭ</l:l>
+<l:l i="90">Ḯ</l:l>
+<l:l i="90">ḯ</l:l>
+<l:l i="90">Ỉ</l:l>
+<l:l i="90">ỉ</l:l>
+<l:l i="90">Ị</l:l>
+<l:l i="90">ị</l:l>
+<l:l i="100">J</l:l>
+<l:l i="100">j</l:l>
+<l:l i="100">Ä´</l:l>
+<l:l i="100">ĵ</l:l>
+<l:l i="100">Ç°</l:l>
+<l:l i="100">Ê</l:l>
+<l:l i="110">K</l:l>
+<l:l i="110">k</l:l>
+<l:l i="110">Ķ</l:l>
+<l:l i="110">Ä·</l:l>
+<l:l i="110">Ƙ</l:l>
+<l:l i="110">Æ™</l:l>
+<l:l i="110">Ǩ</l:l>
+<l:l i="110">Ç©</l:l>
+<l:l i="110">Ḱ</l:l>
+<l:l i="110">ḱ</l:l>
+<l:l i="110">Ḳ</l:l>
+<l:l i="110">ḳ</l:l>
+<l:l i="110">Ḵ</l:l>
+<l:l i="110">ḵ</l:l>
+<l:l i="120">L</l:l>
+<l:l i="120">l</l:l>
+<l:l i="120">Ĺ</l:l>
+<l:l i="120">ĺ</l:l>
+<l:l i="120">Ä»</l:l>
+<l:l i="120">ļ</l:l>
+<l:l i="120">Ľ</l:l>
+<l:l i="120">ľ</l:l>
+<l:l i="120">Ä¿</l:l>
+<l:l i="120">Å€</l:l>
+<l:l i="120">Å</l:l>
+<l:l i="120">Å‚</l:l>
+<l:l i="120">Æš</l:l>
+<l:l i="120">Lj</l:l>
+<l:l i="120">È´</l:l>
+<l:l i="120">É«</l:l>
+<l:l i="120">ɬ</l:l>
+<l:l i="120">É­</l:l>
+<l:l i="120">Ḷ</l:l>
+<l:l i="120">ḷ</l:l>
+<l:l i="120">Ḹ</l:l>
+<l:l i="120">ḹ</l:l>
+<l:l i="120">Ḻ</l:l>
+<l:l i="120">ḻ</l:l>
+<l:l i="120">Ḽ</l:l>
+<l:l i="120">ḽ</l:l>
+<l:l i="130">M</l:l>
+<l:l i="130">m</l:l>
+<l:l i="130">ɱ</l:l>
+<l:l i="130">Ḿ</l:l>
+<l:l i="130">ḿ</l:l>
+<l:l i="130">á¹€</l:l>
+<l:l i="130">á¹</l:l>
+<l:l i="130">Ṃ</l:l>
+<l:l i="130">ṃ</l:l>
+<l:l i="140">N</l:l>
+<l:l i="140">n</l:l>
+<l:l i="140">Ñ</l:l>
+<l:l i="140">ñ</l:l>
+<l:l i="140">Ń</l:l>
+<l:l i="140">Å„</l:l>
+<l:l i="140">Å…</l:l>
+<l:l i="140">ņ</l:l>
+<l:l i="140">Ň</l:l>
+<l:l i="140">ň</l:l>
+<l:l i="140">Æ</l:l>
+<l:l i="140">ɲ</l:l>
+<l:l i="140">Æž</l:l>
+<l:l i="140">È </l:l>
+<l:l i="140">Ç‹</l:l>
+<l:l i="140">Ǹ</l:l>
+<l:l i="140">ǹ</l:l>
+<l:l i="140">ȵ</l:l>
+<l:l i="140">ɳ</l:l>
+<l:l i="140">Ṅ</l:l>
+<l:l i="140">á¹…</l:l>
+<l:l i="140">Ṇ</l:l>
+<l:l i="140">ṇ</l:l>
+<l:l i="140">Ṉ</l:l>
+<l:l i="140">ṉ</l:l>
+<l:l i="140">Ṋ</l:l>
+<l:l i="140">ṋ</l:l>
+<l:l i="150">O</l:l>
+<l:l i="150">o</l:l>
+<l:l i="150">Ã’</l:l>
+<l:l i="150">ò</l:l>
+<l:l i="150">Ó</l:l>
+<l:l i="150">ó</l:l>
+<l:l i="150">Ô</l:l>
+<l:l i="150">ô</l:l>
+<l:l i="150">Õ</l:l>
+<l:l i="150">õ</l:l>
+<l:l i="150">Ö</l:l>
+<l:l i="150">ö</l:l>
+<l:l i="150">Ø</l:l>
+<l:l i="150">ø</l:l>
+<l:l i="150">Ō</l:l>
+<l:l i="150">Å</l:l>
+<l:l i="150">ÅŽ</l:l>
+<l:l i="150">Å</l:l>
+<l:l i="150">Å</l:l>
+<l:l i="150">Å‘</l:l>
+<l:l i="150">ÆŸ</l:l>
+<l:l i="150">Æ </l:l>
+<l:l i="150">Æ¡</l:l>
+<l:l i="150">Ç‘</l:l>
+<l:l i="150">Ç’</l:l>
+<l:l i="150">Ǫ</l:l>
+<l:l i="150">Ç«</l:l>
+<l:l i="150">Ǭ</l:l>
+<l:l i="150">Ç­</l:l>
+<l:l i="150">Ǿ</l:l>
+<l:l i="150">Ç¿</l:l>
+<l:l i="150">Ȍ</l:l>
+<l:l i="150">È</l:l>
+<l:l i="150">ÈŽ</l:l>
+<l:l i="150">È</l:l>
+<l:l i="150">Ȫ</l:l>
+<l:l i="150">È«</l:l>
+<l:l i="150">Ȭ</l:l>
+<l:l i="150">È­</l:l>
+<l:l i="150">È®</l:l>
+<l:l i="150">ȯ</l:l>
+<l:l i="150">È°</l:l>
+<l:l i="150">ȱ</l:l>
+<l:l i="150">Ṍ</l:l>
+<l:l i="150">á¹</l:l>
+<l:l i="150">Ṏ</l:l>
+<l:l i="150">á¹</l:l>
+<l:l i="150">á¹</l:l>
+<l:l i="150">ṑ</l:l>
+<l:l i="150">á¹’</l:l>
+<l:l i="150">ṓ</l:l>
+<l:l i="150">Ọ</l:l>
+<l:l i="150">á»</l:l>
+<l:l i="150">Ỏ</l:l>
+<l:l i="150">á»</l:l>
+<l:l i="150">á»</l:l>
+<l:l i="150">ố</l:l>
+<l:l i="150">á»’</l:l>
+<l:l i="150">ồ</l:l>
+<l:l i="150">á»”</l:l>
+<l:l i="150">ổ</l:l>
+<l:l i="150">á»–</l:l>
+<l:l i="150">á»—</l:l>
+<l:l i="150">Ộ</l:l>
+<l:l i="150">á»™</l:l>
+<l:l i="150">Ớ</l:l>
+<l:l i="150">á»›</l:l>
+<l:l i="150">Ờ</l:l>
+<l:l i="150">á»</l:l>
+<l:l i="150">Ở</l:l>
+<l:l i="150">ở</l:l>
+<l:l i="150">á» </l:l>
+<l:l i="150">ỡ</l:l>
+<l:l i="150">Ợ</l:l>
+<l:l i="150">ợ</l:l>
+<l:l i="160">P</l:l>
+<l:l i="160">p</l:l>
+<l:l i="160">Ƥ</l:l>
+<l:l i="160">Æ¥</l:l>
+<l:l i="160">á¹”</l:l>
+<l:l i="160">ṕ</l:l>
+<l:l i="160">á¹–</l:l>
+<l:l i="160">á¹—</l:l>
+<l:l i="170">Q</l:l>
+<l:l i="170">q</l:l>
+<l:l i="170">Ê </l:l>
+<l:l i="180">R</l:l>
+<l:l i="180">r</l:l>
+<l:l i="180">Å”</l:l>
+<l:l i="180">Å•</l:l>
+<l:l i="180">Å–</l:l>
+<l:l i="180">Å—</l:l>
+<l:l i="180">Ř</l:l>
+<l:l i="180">Å™</l:l>
+<l:l i="180">È</l:l>
+<l:l i="180">È‘</l:l>
+<l:l i="180">È’</l:l>
+<l:l i="180">È“</l:l>
+<l:l i="180">ɼ</l:l>
+<l:l i="180">ɽ</l:l>
+<l:l i="180">ɾ</l:l>
+<l:l i="180">Ṙ</l:l>
+<l:l i="180">á¹™</l:l>
+<l:l i="180">Ṛ</l:l>
+<l:l i="180">á¹›</l:l>
+<l:l i="180">Ṝ</l:l>
+<l:l i="180">á¹</l:l>
+<l:l i="180">Ṟ</l:l>
+<l:l i="180">ṟ</l:l>
+<l:l i="190">S</l:l>
+<l:l i="190">s</l:l>
+<l:l i="190">Åš</l:l>
+<l:l i="190">Å›</l:l>
+<l:l i="190">Ŝ</l:l>
+<l:l i="190">Å</l:l>
+<l:l i="190">Åž</l:l>
+<l:l i="190">ÅŸ</l:l>
+<l:l i="190">Å </l:l>
+<l:l i="190">Å¡</l:l>
+<l:l i="190">Ș</l:l>
+<l:l i="190">È™</l:l>
+<l:l i="190">Ê‚</l:l>
+<l:l i="190">á¹ </l:l>
+<l:l i="190">ṡ</l:l>
+<l:l i="190">á¹¢</l:l>
+<l:l i="190">á¹£</l:l>
+<l:l i="190">Ṥ</l:l>
+<l:l i="190">á¹¥</l:l>
+<l:l i="190">Ṧ</l:l>
+<l:l i="190">ṧ</l:l>
+<l:l i="190">Ṩ</l:l>
+<l:l i="190">ṩ</l:l>
+<l:l i="200">T</l:l>
+<l:l i="200">t</l:l>
+<l:l i="200">Å¢</l:l>
+<l:l i="200">Å£</l:l>
+<l:l i="200">Ť</l:l>
+<l:l i="200">Å¥</l:l>
+<l:l i="200">Ŧ</l:l>
+<l:l i="200">ŧ</l:l>
+<l:l i="200">Æ«</l:l>
+<l:l i="200">Ƭ</l:l>
+<l:l i="200">Æ­</l:l>
+<l:l i="200">Æ®</l:l>
+<l:l i="200">ʈ</l:l>
+<l:l i="200">Èš</l:l>
+<l:l i="200">È›</l:l>
+<l:l i="200">ȶ</l:l>
+<l:l i="200">Ṫ</l:l>
+<l:l i="200">ṫ</l:l>
+<l:l i="200">Ṭ</l:l>
+<l:l i="200">á¹­</l:l>
+<l:l i="200">á¹®</l:l>
+<l:l i="200">ṯ</l:l>
+<l:l i="200">á¹°</l:l>
+<l:l i="200">á¹±</l:l>
+<l:l i="200">ẗ</l:l>
+<l:l i="210">U</l:l>
+<l:l i="210">u</l:l>
+<l:l i="210">Ù</l:l>
+<l:l i="210">ù</l:l>
+<l:l i="210">Ú</l:l>
+<l:l i="210">ú</l:l>
+<l:l i="210">Û</l:l>
+<l:l i="210">û</l:l>
+<l:l i="210">Ü</l:l>
+<l:l i="210">ü</l:l>
+<l:l i="210">Ũ</l:l>
+<l:l i="210">Å©</l:l>
+<l:l i="210">Ū</l:l>
+<l:l i="210">Å«</l:l>
+<l:l i="210">Ŭ</l:l>
+<l:l i="210">Å­</l:l>
+<l:l i="210">Å®</l:l>
+<l:l i="210">ů</l:l>
+<l:l i="210">Å°</l:l>
+<l:l i="210">ű</l:l>
+<l:l i="210">Ų</l:l>
+<l:l i="210">ų</l:l>
+<l:l i="210">Ư</l:l>
+<l:l i="210">Æ°</l:l>
+<l:l i="210">Ç“</l:l>
+<l:l i="210">Ç”</l:l>
+<l:l i="210">Ç•</l:l>
+<l:l i="210">Ç–</l:l>
+<l:l i="210">Ç—</l:l>
+<l:l i="210">ǘ</l:l>
+<l:l i="210">Ç™</l:l>
+<l:l i="210">Çš</l:l>
+<l:l i="210">Ç›</l:l>
+<l:l i="210">ǜ</l:l>
+<l:l i="210">È”</l:l>
+<l:l i="210">È•</l:l>
+<l:l i="210">È–</l:l>
+<l:l i="210">È—</l:l>
+<l:l i="210">á¹²</l:l>
+<l:l i="210">á¹³</l:l>
+<l:l i="210">á¹´</l:l>
+<l:l i="210">á¹µ</l:l>
+<l:l i="210">Ṷ</l:l>
+<l:l i="210">á¹·</l:l>
+<l:l i="210">Ṹ</l:l>
+<l:l i="210">á¹¹</l:l>
+<l:l i="210">Ṻ</l:l>
+<l:l i="210">á¹»</l:l>
+<l:l i="210">Ụ</l:l>
+<l:l i="210">ụ</l:l>
+<l:l i="210">Ủ</l:l>
+<l:l i="210">ủ</l:l>
+<l:l i="210">Ứ</l:l>
+<l:l i="210">ứ</l:l>
+<l:l i="210">Ừ</l:l>
+<l:l i="210">ừ</l:l>
+<l:l i="210">Ử</l:l>
+<l:l i="210">á»­</l:l>
+<l:l i="210">á»®</l:l>
+<l:l i="210">ữ</l:l>
+<l:l i="210">á»°</l:l>
+<l:l i="210">á»±</l:l>
+<l:l i="220">V</l:l>
+<l:l i="220">v</l:l>
+<l:l i="220">Ʋ</l:l>
+<l:l i="220">Ê‹</l:l>
+<l:l i="220">á¹¼</l:l>
+<l:l i="220">á¹½</l:l>
+<l:l i="220">á¹¾</l:l>
+<l:l i="220">ṿ</l:l>
+<l:l i="230">W</l:l>
+<l:l i="230">w</l:l>
+<l:l i="230">Å´</l:l>
+<l:l i="230">ŵ</l:l>
+<l:l i="230">Ẁ</l:l>
+<l:l i="230">áº</l:l>
+<l:l i="230">Ẃ</l:l>
+<l:l i="230">ẃ</l:l>
+<l:l i="230">Ẅ</l:l>
+<l:l i="230">ẅ</l:l>
+<l:l i="230">Ẇ</l:l>
+<l:l i="230">ẇ</l:l>
+<l:l i="230">Ẉ</l:l>
+<l:l i="230">ẉ</l:l>
+<l:l i="230">ẘ</l:l>
+<l:l i="240">X</l:l>
+<l:l i="240">x</l:l>
+<l:l i="240">Ẋ</l:l>
+<l:l i="240">ẋ</l:l>
+<l:l i="240">Ẍ</l:l>
+<l:l i="240">áº</l:l>
+<l:l i="250">Y</l:l>
+<l:l i="250">y</l:l>
+<l:l i="250">Ã</l:l>
+<l:l i="250">ý</l:l>
+<l:l i="250">ÿ</l:l>
+<l:l i="250">Ÿ</l:l>
+<l:l i="250">Ŷ</l:l>
+<l:l i="250">Å·</l:l>
+<l:l i="250">Ƴ</l:l>
+<l:l i="250">Æ´</l:l>
+<l:l i="250">Ȳ</l:l>
+<l:l i="250">ȳ</l:l>
+<l:l i="250">Ẏ</l:l>
+<l:l i="250">áº</l:l>
+<l:l i="250">ẙ</l:l>
+<l:l i="250">Ỳ</l:l>
+<l:l i="250">ỳ</l:l>
+<l:l i="250">á»´</l:l>
+<l:l i="250">ỵ</l:l>
+<l:l i="250">Ỷ</l:l>
+<l:l i="250">á»·</l:l>
+<l:l i="250">Ỹ</l:l>
+<l:l i="250">ỹ</l:l>
+<l:l i="260">Z</l:l>
+<l:l i="260">z</l:l>
+<l:l i="260">Ź</l:l>
+<l:l i="260">ź</l:l>
+<l:l i="260">Å»</l:l>
+<l:l i="260">ż</l:l>
+<l:l i="260">Ž</l:l>
+<l:l i="260">ž</l:l>
+<l:l i="260">Ƶ</l:l>
+<l:l i="260">ƶ</l:l>
+<l:l i="260">Ȥ</l:l>
+<l:l i="260">È¥</l:l>
+<l:l i="260">Ê</l:l>
+<l:l i="260">Ê‘</l:l>
+<l:l i="260">áº</l:l>
+<l:l i="260">ẑ</l:l>
+<l:l i="260">Ẓ</l:l>
+<l:l i="260">ẓ</l:l>
+<l:l i="260">Ẕ</l:l>
+<l:l i="260">ẕ</l:l>
+</l:letters>
+</l:l10n>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/entities.ent b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/entities.ent
new file mode 100644
index 0000000..fb3e932
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/entities.ent
@@ -0,0 +1,67 @@
+<!-- ********************************************************************
+ $Id: entities.ent 8725 2010-07-15 08:08:04Z kosek $
+ ********************************************************************
+
+ This file contains common entity declarations used for
+ sorting (and other things) by various templates.
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<!-- ==================================================================== -->
+
+<!ENTITY lowercase "'Aa&#192;&#224;&#193;&#225;&#194;&#226;&#195;&#227;&#196;&#228;&#197;&#229;&#256;&#257;&#258;&#259;&#260;&#261;&#461;&#462;&#478;&#479;&#480;&#481;&#506;&#507;&#512;&#513;&#514;&#515;&#550;&#551;&#7680;&#7681;&#7834;&#7840;&#7841;&#7842;&#7843;&#7844;&#7845;&#7846;&#7847;&#7848;&#7849;&#7850;&#7851;&#7852;&#7853;&#7854;&#7855;&#7856;&#7857;&#7858;&#7859;&#7860;&#7861;&#7862;&#7863;Bb&#384;&#385;&#595;&#386;&#387;&#7682;&#7683;&#7684;&#7685;&#7686;&#7687;Cc&#199;&#231;&#262;&#263;&#264;&#265;&#266;&#267;&#268;&#269;&#391;&#392;&#597;&#7688;&#7689;Dd&#270;&#271;&#272;&#273;&#394;&#599;&#395;&#396;&#453;&#498;&#545;&#598;&#7690;&#7691;&#7692;&#7693;&#7694;&#7695;&#7696;&#7697;&#7698;&#7699;Ee&#200;&#232;&#201;&#233;&#202;&#234;&#203;&#235;&#274;&#275;&#276;&#277;&#278;&#279;&#280;&#281;&#282;&#283;&#516;&#517;&#518;&#519;&#552;&#553;&#7700;&#7701;&#7702;&#7703;&#7704;&#7705;&#7706;&#7707;&#7708;&#7709;&#7864;&#7865;&#7866;&#7867;&#7868;&#7869;&#7870;&#7871;&#7872;&#7873;&#7874;&#7875;&#7876;&#7877;&#7878;&#7879;Ff&#401;&#402;&#7710;&#7711;Gg&#284;&#285;&#286;&#287;&#288;&#289;&#290;&#291;&#403;&#608;&#484;&#485;&#486;&#487;&#500;&#501;&#7712;&#7713;Hh&#292;&#293;&#294;&#295;&#542;&#543;&#614;&#7714;&#7715;&#7716;&#7717;&#7718;&#7719;&#7720;&#7721;&#7722;&#7723;&#7830;Ii&#204;&#236;&#205;&#237;&#206;&#238;&#207;&#239;&#296;&#297;&#298;&#299;&#300;&#301;&#302;&#303;&#304;&#407;&#616;&#463;&#464;&#520;&#521;&#522;&#523;&#7724;&#7725;&#7726;&#7727;&#7880;&#7881;&#7882;&#7883;Jj&#308;&#309;&#496;&#669;Kk&#310;&#311;&#408;&#409;&#488;&#489;&#7728;&#7729;&#7730;&#7731;&#7732;&#7733;Ll&#313;&#314;&#315;&#316;&#317;&#318;&#319;&#320;&#321;&#322;&#410;&#456;&#564;&#619;&#620;&#621;&#7734;&#7735;&#7736;&#7737;&#7738;&#7739;&#7740;&#7741;Mm&#625;&#7742;&#7743;&#7744;&#7745;&#7746;&#7747;Nn&#209;&#241;&#323;&#324;&#325;&#326;&#327;&#328;&#413;&#626;&#414;&#544;&#459;&#504;&#505;&#565;&#627;&#7748;&#7749;&#7750;&#7751;&#7752;&#7753;&#7754;&#7755;Oo&#210;&#242;&#211;&#243;&#212;&#244;&#213;&#245;&#214;&#246;&#216;&#248;&#332;&#333;&#334;&#335;&#336;&#337;&#415;&#416;&#417;&#465;&#466;&#490;&#491;&#492;&#493;&#510;&#511;&#524;&#525;&#526;&#527;&#554;&#555;&#556;&#557;&#558;&#559;&#560;&#561;&#7756;&#7757;&#7758;&#7759;&#7760;&#7761;&#7762;&#7763;&#7884;&#7885;&#7886;&#7887;&#7888;&#7889;&#7890;&#7891;&#7892;&#7893;&#7894;&#7895;&#7896;&#7897;&#7898;&#7899;&#7900;&#7901;&#7902;&#7903;&#7904;&#7905;&#7906;&#7907;Pp&#420;&#421;&#7764;&#7765;&#7766;&#7767;Qq&#672;Rr&#340;&#341;&#342;&#343;&#344;&#345;&#528;&#529;&#530;&#531;&#636;&#637;&#638;&#7768;&#7769;&#7770;&#7771;&#7772;&#7773;&#7774;&#7775;Ss&#346;&#347;&#348;&#349;&#350;&#351;&#352;&#353;&#536;&#537;&#642;&#7776;&#7777;&#7778;&#7779;&#7780;&#7781;&#7782;&#7783;&#7784;&#7785;Tt&#354;&#355;&#356;&#357;&#358;&#359;&#427;&#428;&#429;&#430;&#648;&#538;&#539;&#566;&#7786;&#7787;&#7788;&#7789;&#7790;&#7791;&#7792;&#7793;&#7831;Uu&#217;&#249;&#218;&#250;&#219;&#251;&#220;&#252;&#360;&#361;&#362;&#363;&#364;&#365;&#366;&#367;&#368;&#369;&#370;&#371;&#431;&#432;&#467;&#468;&#469;&#470;&#471;&#472;&#473;&#474;&#475;&#476;&#532;&#533;&#534;&#535;&#7794;&#7795;&#7796;&#7797;&#7798;&#7799;&#7800;&#7801;&#7802;&#7803;&#7908;&#7909;&#7910;&#7911;&#7912;&#7913;&#7914;&#7915;&#7916;&#7917;&#7918;&#7919;&#7920;&#7921;Vv&#434;&#651;&#7804;&#7805;&#7806;&#7807;Ww&#372;&#373;&#7808;&#7809;&#7810;&#7811;&#7812;&#7813;&#7814;&#7815;&#7816;&#7817;&#7832;Xx&#7818;&#7819;&#7820;&#7821;Yy&#221;&#253;&#255;&#376;&#374;&#375;&#435;&#436;&#562;&#563;&#7822;&#7823;&#7833;&#7922;&#7923;&#7924;&#7925;&#7926;&#7927;&#7928;&#7929;Zz&#377;&#378;&#379;&#380;&#381;&#382;&#437;&#438;&#548;&#549;&#656;&#657;&#7824;&#7825;&#7826;&#7827;&#7828;&#7829;&#7829;'">
+<!ENTITY uppercase "'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBCCCCCCCCCCCCCCCCCDDDDDDDDDDDDDDDDDDDDDDDDEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEFFFFFFGGGGGGGGGGGGGGGGGGGGHHHHHHHHHHHHHHHHHHHHIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIJJJJJJKKKKKKKKKKKKKKLLLLLLLLLLLLLLLLLLLLLLLLLLMMMMMMMMMNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOPPPPPPPPQQQRRRRRRRRRRRRRRRRRRRRRRRSSSSSSSSSSSSSSSSSSSSSSSTTTTTTTTTTTTTTTTTTTTTTTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUVVVVVVVVWWWWWWWWWWWWWWWXXXXXXYYYYYYYYYYYYYYYYYYYYYYYZZZZZZZZZZZZZZZZZZZZZ'">
+
+<!-- The following three entities are used for sorting and grouping
+ indexterms, not in presentation of them. -->
+<!-- If @sortas is present, sort and group by combination of
+ @sortas, space and entry to keep it separate from other entries
+ with the same @sortas.
+ If @sortas is not present, the first item is empty, and the added space
+ is removed when normalize-space is applied, leaving just the entry -->
+
+<!ENTITY primary 'normalize-space(concat(primary/@sortas, " ", primary))'>
+<!ENTITY secondary 'normalize-space(concat(secondary/@sortas, " ", secondary))'>
+<!ENTITY tertiary 'normalize-space(concat(tertiary/@sortas, " ", tertiary))'>
+
+<!ENTITY section '(ancestor-or-self::set|ancestor-or-self::book|ancestor-or-self::part|ancestor-or-self::reference|ancestor-or-self::partintro|ancestor-or-self::chapter|ancestor-or-self::appendix|ancestor-or-self::preface|ancestor-or-self::article|ancestor-or-self::section|ancestor-or-self::sect1|ancestor-or-self::sect2|ancestor-or-self::sect3|ancestor-or-self::sect4|ancestor-or-self::sect5|ancestor-or-self::refentry|ancestor-or-self::refsect1|ancestor-or-self::refsect2|ancestor-or-self::refsect3|ancestor-or-self::simplesect|ancestor-or-self::bibliography|ancestor-or-self::glossary|ancestor-or-self::index|ancestor-or-self::webpage)[last()]'>
+
+<!ENTITY section.id 'generate-id(&section;)'>
+<!ENTITY sep '" "'>
+
+<!ENTITY scope 'count(ancestor::node()|$scope) = count(ancestor::node()) and ($role = @role or $type = @type or (string-length($role) = 0 and string-length($type) = 0))'>
+
+<!ENTITY setup-language-variable '
+<xsl:variable name="language" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+ <xsl:call-template name="l10n.language"/>
+</xsl:variable>
+
+<xsl:variable name="lowercase" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key">normalize.sort.input</xsl:with-param>
+ </xsl:call-template>
+</xsl:variable>
+
+<xsl:variable name="uppercase" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key">normalize.sort.output</xsl:with-param>
+ </xsl:call-template>
+</xsl:variable>
+'>
+
+<!-- Entity used in html/inline.xsl and fo/inline.xsl -->
+<!ENTITY comment.block.parents "parent::answer|parent::appendix|parent::article|parent::bibliodiv|
+ parent::bibliography|parent::blockquote|parent::caution|parent::chapter|
+ parent::glossary|parent::glossdiv|parent::important|parent::index|
+ parent::indexdiv|parent::listitem|parent::note|parent::orderedlist|
+ parent::partintro|parent::preface|parent::procedure|parent::qandadiv|
+ parent::qandaset|parent::question|parent::refentry|parent::refnamediv|
+ parent::refsect1|parent::refsect2|parent::refsect3|parent::refsection|
+ parent::refsynopsisdiv|parent::sect1|parent::sect2|parent::sect3|parent::sect4|
+ parent::sect5|parent::section|parent::setindex|parent::sidebar|
+ parent::simplesect|parent::taskprerequisites|parent::taskrelated|
+ parent::tasksummary|parent::warning">
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/eo.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/eo.xml
new file mode 100644
index 0000000..c6b95d0
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/eo.xml
@@ -0,0 +1,1229 @@
+<?xml version="1.0" encoding="utf-8"?>
+<l:l10n xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0" language="eo" english-language-name="Esperanto">
+
+<!-- * This file is generated automatically. -->
+<!-- * To submit changes to this file upstream (to the DocBook Project) -->
+<!-- * do not submit an edited version of this file. Instead, submit an -->
+<!-- * edited version of the source file at the following location: -->
+<!-- * -->
+<!-- * https://docbook.svn.sourceforge.net/svnroot/docbook/trunk/gentext/locale/eo.xml -->
+<!-- * -->
+<!-- * E-mail the edited eo.xml source file to: -->
+<!-- * -->
+<!-- * docbook-developers@lists.sourceforge.net -->
+
+<!-- ******************************************************************** -->
+
+<!-- This file is part of the XSL DocBook Stylesheet distribution. -->
+<!-- See ../README or http://docbook.sf.net/release/xsl/current/ for -->
+<!-- copyright and other information. -->
+
+<!-- ******************************************************************** -->
+<!-- In these files, % with a letter is used for a placeholder: -->
+<!-- %t is the current element's title -->
+<!-- %s is the current element's subtitle (if applicable)-->
+<!-- %n is the current element's number label-->
+<!-- %p is the current element's page number (if applicable)-->
+<!-- ******************************************************************** -->
+
+
+<l:gentext key="Abstract" text="Resumo"/>
+<l:gentext key="abstract" text="Resumo"/>
+<l:gentext key="Acknowledgements" text="Acknowledgements" lang="en"/>
+<l:gentext key="acknowledgements" text="Acknowledgements" lang="en"/>
+<l:gentext key="Answer" text="R:"/>
+<l:gentext key="answer" text="R:"/>
+<l:gentext key="Appendix" text="Apendico"/>
+<l:gentext key="appendix" text="Apendico"/>
+<l:gentext key="Article" text="Artikolo"/>
+<l:gentext key="article" text="Artikolo"/>
+<l:gentext key="Author" text="AÅ­toro"/>
+<l:gentext key="Bibliography" text="Bibliografio"/>
+<l:gentext key="bibliography" text="Bibliografio"/>
+<l:gentext key="Book" text="Libro"/>
+<l:gentext key="book" text="Libro"/>
+<l:gentext key="CAUTION" text="ATENTU"/>
+<l:gentext key="Caution" text="Atentu"/>
+<l:gentext key="caution" text="Atentu"/>
+<l:gentext key="Chapter" text="Ĉapitro"/>
+<l:gentext key="chapter" text="Ĉapitro"/>
+<l:gentext key="Colophon" text="Kolofono"/>
+<l:gentext key="colophon" text="Kolofono"/>
+<l:gentext key="Copyright" text="Kopirajto"/>
+<l:gentext key="copyright" text="Kopirajto"/>
+<l:gentext key="Dedication" text="Dediĉo"/>
+<l:gentext key="dedication" text="Dediĉo"/>
+<l:gentext key="Edition" text="Eldono"/>
+<l:gentext key="edition" text="Eldono"/>
+<l:gentext key="Editor" text="Redaktoro"/>
+<l:gentext key="Equation" text="Ekvacio"/>
+<l:gentext key="equation" text="Ekvacio"/>
+<l:gentext key="Example" text="Ekzemplo"/>
+<l:gentext key="example" text="Ekzemplo"/>
+<l:gentext key="Figure" text="Figuro"/>
+<l:gentext key="figure" text="Figuro"/>
+<l:gentext key="Glossary" text="Glosaro"/>
+<l:gentext key="glossary" text="Glosaro"/>
+<l:gentext key="GlossSee" text="Vidu"/>
+<l:gentext key="glosssee" text="Vidu"/>
+<l:gentext key="GlossSeeAlso" text="Vidu ankaÅ­"/>
+<l:gentext key="glossseealso" text="Vidu ankaÅ­"/>
+<l:gentext key="IMPORTANT" text="GRAVA"/>
+<l:gentext key="important" text="Grava"/>
+<l:gentext key="Important" text="Grava"/>
+<l:gentext key="Index" text="Indekso"/>
+<l:gentext key="index" text="Indekso"/>
+<l:gentext key="ISBN" text="ISBN"/>
+<l:gentext key="isbn" text="ISBN"/>
+<l:gentext key="LegalNotice" text="LeÄa Avizo"/>
+<l:gentext key="legalnotice" text="LeÄa Avizo"/>
+<l:gentext key="MsgAud" text="Cela legantaro"/>
+<l:gentext key="msgaud" text="Cela legantaro"/>
+<l:gentext key="MsgLevel" text="Nivelo"/>
+<l:gentext key="msglevel" text="Nivelo"/>
+<l:gentext key="MsgOrig" text="Origino"/>
+<l:gentext key="msgorig" text="Origino"/>
+<l:gentext key="NOTE" text="RIMARKO"/>
+<l:gentext key="Note" text="Rimarko"/>
+<l:gentext key="note" text="Rimarko"/>
+<l:gentext key="Part" text="Parto"/>
+<l:gentext key="part" text="Parto"/>
+<l:gentext key="Preface" text="AntaÅ­parolo"/>
+<l:gentext key="preface" text="AntaÅ­parolo"/>
+<l:gentext key="Procedure" text="Procezo"/>
+<l:gentext key="procedure" text="Procezo"/>
+<l:gentext key="ProductionSet" text="Produktaĵo"/>
+<l:gentext key="PubDate" text="Eldona Dato"/>
+<l:gentext key="pubdate" text="Eldona Dato"/>
+<l:gentext key="Published" text="Eldonita "/>
+<l:gentext key="published" text="Eldonita"/>
+<l:gentext key="Publisher" text="Eldonita"/>
+<l:gentext key="Qandadiv" text="Demandoj &amp; Respondoj"/>
+<l:gentext key="qandadiv" text="Demandoj &amp; Respondoj"/>
+<l:gentext key="QandASet" text="Oftaj Demandoj"/>
+<l:gentext key="Question" text="D:"/>
+<l:gentext key="question" text="D:"/>
+<l:gentext key="RefEntry" text=""/>
+<l:gentext key="refentry" text=""/>
+<l:gentext key="Reference" text="Referenco"/>
+<l:gentext key="reference" text="Referenco"/>
+<l:gentext key="References" text="Referencoj"/>
+<l:gentext key="RefName" text="Nomo"/>
+<l:gentext key="refname" text="Nomo"/>
+<l:gentext key="RefSection" text=""/>
+<l:gentext key="refsection" text=""/>
+<l:gentext key="RefSynopsisDiv" text="Resumo"/>
+<l:gentext key="refsynopsisdiv" text="Resumo"/>
+<l:gentext key="RevHistory" text="Historio de Versioj"/>
+<l:gentext key="revhistory" text="Historio de Versioj"/>
+<l:gentext key="revision" text="Versio"/>
+<l:gentext key="Revision" text="Versio"/>
+<l:gentext key="sect1" text="Sekcio"/>
+<l:gentext key="sect2" text="Sekcio"/>
+<l:gentext key="sect3" text="Sekcio"/>
+<l:gentext key="sect4" text="Sekcio"/>
+<l:gentext key="sect5" text="Sekcio"/>
+<l:gentext key="section" text="Sekcio"/>
+<l:gentext key="Section" text="Sekcio"/>
+<l:gentext key="see" text="vidu"/>
+<l:gentext key="See" text="Vidu"/>
+<l:gentext key="seealso" text="vidu ankaÅ­"/>
+<l:gentext key="Seealso" text="Vidu ankaÅ­"/>
+<l:gentext key="SeeAlso" text="Vidu AnkaÅ­"/>
+<l:gentext key="set" text="Libraro"/>
+<l:gentext key="Set" text="Libraro"/>
+<l:gentext key="setindex" text="Indekso de Libraro"/>
+<l:gentext key="SetIndex" text="Indesko de Libraro"/>
+<l:gentext key="Sidebar" text=""/>
+<l:gentext key="sidebar" text="flankaĵo"/>
+<l:gentext key="step" text="Åtupo"/>
+<l:gentext key="Step" text="Åœtupo"/>
+<l:gentext key="table" text="Tabelo"/>
+<l:gentext key="Table" text="Tabelo"/>
+<l:gentext key="task" text="Tasko"/>
+<l:gentext key="Task" text="Tasko"/>
+<l:gentext key="tip" text="Sugesto"/>
+<l:gentext key="TIP" text="SUGESTO"/>
+<l:gentext key="Tip" text="Sugesto"/>
+<l:gentext key="Warning" text="Averto"/>
+<l:gentext key="warning" text="Averto"/>
+<l:gentext key="WARNING" text="AVERTO"/>
+<l:gentext key="and" text="kaj"/>
+<l:gentext key="by" text="fare de"/>
+<l:gentext key="Edited" text="Redaktita"/>
+<l:gentext key="edited" text="Redaktita"/>
+<l:gentext key="Editedby" text="Redaktita de"/>
+<l:gentext key="editedby" text="Redaktita de"/>
+<l:gentext key="in" text="en"/>
+<l:gentext key="lastlistcomma" text=","/>
+<l:gentext key="listcomma" text=","/>
+<l:gentext key="notes" text="Notoj"/>
+<l:gentext key="Notes" text="Notoj"/>
+<l:gentext key="Pgs" text="p."/>
+<l:gentext key="pgs" text="p."/>
+<l:gentext key="Revisedby" text="Reviziita de: "/>
+<l:gentext key="revisedby" text="Reviziita de: "/>
+<l:gentext key="TableNotes" text="Notoj"/>
+<l:gentext key="tablenotes" text="Notoj"/>
+<l:gentext key="TableofContents" text="Enhavo"/>
+<l:gentext key="tableofcontents" text="Enhavo"/>
+<l:gentext key="unexpectedelementname" text="NeantaÅ­vidita nomo de elemento"/>
+<l:gentext key="unsupported" text="netraktebla"/>
+<l:gentext key="xrefto" text="aludo al"/>
+<l:gentext key="Authors" text="AÅ­toroj"/>
+<l:gentext key="copyeditor" text="Provredaktinto"/>
+<l:gentext key="graphicdesigner" text="Grafikisto"/>
+<l:gentext key="productioneditor" text="Produkta Redaktoro"/>
+<l:gentext key="technicaleditor" text="Teknika Redaktoro"/>
+<l:gentext key="translator" text="Tradukisto"/>
+<l:gentext key="listofequations" text="Listo de Ekvacioj"/>
+<l:gentext key="ListofEquations" text="Listo de Ekvacioj"/>
+<l:gentext key="ListofExamples" text="Listo de Ekzemploj"/>
+<l:gentext key="listofexamples" text="Listo de Ekzemploj"/>
+<l:gentext key="ListofFigures" text="Listo de Figuroj"/>
+<l:gentext key="listoffigures" text="Listo de Figuroj"/>
+<l:gentext key="ListofProcedures" text="Listo de Procedoj"/>
+<l:gentext key="listofprocedures" text="Listo de Procedoj"/>
+<l:gentext key="listoftables" text="Listo de Tabeloj"/>
+<l:gentext key="ListofTables" text="Listo de Tabeloj"/>
+<l:gentext key="ListofUnknown" text="Listo de Nesciatoj"/>
+<l:gentext key="listofunknown" text="Listo de Nesciatoj"/>
+<l:gentext key="nav-home" text="Hejmen"/>
+<l:gentext key="nav-next" text="Sekven"/>
+<l:gentext key="nav-next-sibling" text="Pli sekven"/>
+<l:gentext key="nav-prev" text="AntaÅ­en"/>
+<l:gentext key="nav-prev-sibling" text="Pli antaÅ­en"/>
+<l:gentext key="nav-up" text="Supren"/>
+<l:gentext key="nav-toc" text="Enhavlisten"/>
+<l:gentext key="Draft" text="Malneto"/>
+<l:gentext key="above" text="supra"/>
+<l:gentext key="below" text="suba"/>
+<l:gentext key="sectioncalled" text="la sekcio nomata"/>
+<l:gentext key="index symbols" text="Simboloj"/>
+<l:gentext key="writing-mode" text="lr-tb"/>
+<l:gentext key="lowercase.alpha" text="abcĉdefgÄhÄ¥ijĵklmnopqrsÅtuÅ­vyz"/>
+<l:gentext key="uppercase.alpha" text="ABCĈDEFGĜHĤIJĴKLMNOPQRSŜTUŬVYZ"/>
+<l:gentext key="normalize.sort.input" text="AaÀàÃáÂâÃãÄäÅåĀÄĂ㥹ÇǎǞǟǠǡǺǻȀÈȂȃȦȧḀá¸áºšáº áº¡áº¢áº£áº¤áº¥áº¦áº§áº¨áº©áºªáº«áº¬áº­áº®áº¯áº°áº±áº²áº³áº´áºµáº¶áº·BbÆ€ÆɓƂƃḂḃḄḅḆḇCcÇçĆćĈĉĊċČÄƇƈɕḈḉDdÄŽÄÄđƊɗƋƌDžDzȡɖḊḋḌá¸á¸Žá¸á¸á¸‘ḒḓEeÈèÉéÊêËëĒēĔĕĖėĘęĚěȄȅȆȇȨȩḔḕḖḗḘḙḚḛḜá¸áº¸áº¹áººáº»áº¼áº½áº¾áº¿á»€á»á»‚ểỄễỆệFfƑƒḞḟGgÄœÄĞğĠġĢģƓɠǤǥǦǧǴǵḠḡHhĤĥĦħȞȟɦḢḣḤḥḦḧḨḩḪḫẖIiÌìÃíÎîÃïĨĩĪīĬĭĮįİƗɨÇÇȈȉȊȋḬḭḮḯỈỉỊịJjĴĵǰÊKkĶķƘƙǨǩḰḱḲḳḴḵLlĹĺĻļĽľĿŀÅłƚLjȴɫɬɭḶḷḸḹḺḻḼḽMmɱḾḿṀá¹á¹‚ṃNnÑñŃńŅņŇňÆɲƞȠNjǸǹȵɳṄṅṆṇṈṉṊṋOoÒòÓóÔôÕõÖöØøŌÅÅŽÅÅőƟƠơǑǒǪǫǬǭǾǿȌÈÈŽÈȪȫȬȭȮȯȰȱṌá¹á¹Žá¹á¹á¹‘ṒṓỌá»á»Žá»á»á»‘ỒồỔổỖỗỘộỚớỜá»á»žá»Ÿá» á»¡á»¢á»£PpƤƥṔṕṖṗQqÊ RrŔŕŖŗŘřÈȑȒȓɼɽɾṘṙṚṛṜá¹á¹žá¹ŸSsŚśŜÅŞşŠšȘșʂṠṡṢṣṤṥṦṧṨṩTtŢţŤťŦŧƫƬƭƮʈȚțȶṪṫṬṭṮṯṰṱẗUuÙùÚúÛûÜüŨũŪūŬŭŮůŰűŲųƯưǓǔǕǖǗǘǙǚǛǜȔȕȖȗṲṳṴṵṶṷṸṹṺṻỤụỦủỨứỪừỬửỮữỰựVvƲʋṼṽṾṿWwŴŵẀáºáº‚ẃẄẅẆẇẈẉẘXxẊẋẌáºYyÃýÿŸŶŷƳƴȲȳẎáºáº™á»²á»³á»´á»µá»¶á»·á»¸á»¹ZzŹźŻżŽžƵƶȤȥÊÊ‘áºáº‘ẒẓẔẕẕ" lang="en"/>
+<l:gentext key="normalize.sort.output" text="AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBCCCCCCCCCCCCCCCCCDDDDDDDDDDDDDDDDDDDDDDDDEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEFFFFFFGGGGGGGGGGGGGGGGGGGGHHHHHHHHHHHHHHHHHHHHIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIJJJJJJKKKKKKKKKKKKKKLLLLLLLLLLLLLLLLLLLLLLLLLLMMMMMMMMMNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOPPPPPPPPQQQRRRRRRRRRRRRRRRRRRRRRRRSSSSSSSSSSSSSSSSSSSSSSSTTTTTTTTTTTTTTTTTTTTTTTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUVVVVVVVVWWWWWWWWWWWWWWWXXXXXXYYYYYYYYYYYYYYYYYYYYYYYZZZZZZZZZZZZZZZZZZZZZ" lang="en"/>
+<l:dingbat key="startquote" text="“"/>
+<l:dingbat key="endquote" text="â€"/>
+<l:dingbat key="nestedstartquote" text="‘"/>
+<l:dingbat key="nestedendquote" text="’"/>
+<l:dingbat key="singlestartquote" text="‘"/>
+<l:dingbat key="singleendquote" text="’"/>
+<l:dingbat key="bullet" text="•"/>
+<l:gentext key="hyphenation-character" text="-"/>
+<l:gentext key="hyphenation-push-character-count" text="2"/>
+<l:gentext key="hyphenation-remain-character-count" text="2"/>
+<l:context name="styles"><l:template name="person-name" text="first-last"/>
+</l:context>
+<l:context name="title"><l:template name="abstract" text="%t"/>
+<l:template name="acknowledgements" text="%t" lang="en"/>
+<l:template name="answer" text="%t"/>
+<l:template name="appendix" text="Apendico %n. %t"/>
+<l:template name="article" text="%t"/>
+<l:template name="authorblurb" text="%t"/>
+<l:template name="bibliodiv" text="%t"/>
+<l:template name="biblioentry" text="%t"/>
+<l:template name="bibliography" text="%t"/>
+<l:template name="bibliolist" text="%t"/>
+<l:template name="bibliomixed" text="%t"/>
+<l:template name="bibliomset" text="%t"/>
+<l:template name="biblioset" text="%t"/>
+<l:template name="blockquote" text="%t"/>
+<l:template name="book" text="%t"/>
+<l:template name="calloutlist" text="%t"/>
+<l:template name="caution" text="%t"/>
+<l:template name="chapter" text="Ĉapitro %n. %t&quot;"/>
+<l:template name="colophon" text="%t"/>
+<l:template name="dedication" text="%t"/>
+<l:template name="equation" text="Ekvacio %n. %t"/>
+<l:template name="example" text="Ekzemplo %n. %t"/>
+<l:template name="figure" text="Figuro %n. %t"/>
+<l:template name="foil" text="%t"/>
+<l:template name="foilgroup" text="%t"/>
+<l:template name="formalpara" text="%t"/>
+<l:template name="glossary" text="%t"/>
+<l:template name="glossdiv" text="%t"/>
+<l:template name="glosslist" text="%t"/>
+<l:template name="glossentry" text="%t"/>
+<l:template name="important" text="%t"/>
+<l:template name="index" text="%t"/>
+<l:template name="indexdiv" text="%t"/>
+<l:template name="itemizedlist" text="%t"/>
+<l:template name="legalnotice" text="%t"/>
+<l:template name="listitem" text=""/>
+<l:template name="lot" text="%t"/>
+<l:template name="msg" text="%t"/>
+<l:template name="msgexplan" text="%t"/>
+<l:template name="msgmain" text="%t"/>
+<l:template name="msgrel" text="%t"/>
+<l:template name="msgset" text="%t"/>
+<l:template name="msgsub" text="%t"/>
+<l:template name="note" text="%t"/>
+<l:template name="orderedlist" text="%t"/>
+<l:template name="part" text="Parto %n. %t"/>
+<l:template name="partintro" text="%t"/>
+<l:template name="preface" text="%t"/>
+<l:template name="procedure" text="%t"/>
+<l:template name="procedure.formal" text="Procezo %n. %t"/>
+<l:template name="productionset" text="%t"/>
+<l:template name="productionset.formal" text="Produktaĵo %n"/>
+<l:template name="qandadiv" text="%t"/>
+<l:template name="qandaentry" text="%t"/>
+<l:template name="qandaset" text="%t"/>
+<l:template name="question" text="%t"/>
+<l:template name="refentry" text="%t"/>
+<l:template name="reference" text="%t"/>
+<l:template name="refsection" text="%t"/>
+<l:template name="refsect1" text="%t"/>
+<l:template name="refsect2" text="%t"/>
+<l:template name="refsect3" text="%t"/>
+<l:template name="refsynopsisdiv" text="%t"/>
+<l:template name="refsynopsisdivinfo" text="%t"/>
+<l:template name="segmentedlist" text="%t"/>
+<l:template name="set" text="%t"/>
+<l:template name="setindex" text="%t"/>
+<l:template name="sidebar" text="%t"/>
+<l:template name="step" text="%t"/>
+<l:template name="table" text="Tabelo %n. %t"/>
+<l:template name="task" text="%t"/>
+<l:template name="tasksummary" text="%t"/>
+<l:template name="taskprerequisites" text="%t"/>
+<l:template name="taskrelated" text="%t"/>
+<l:template name="tip" text="%t"/>
+<l:template name="toc" text="%t"/>
+<l:template name="variablelist" text="%t"/>
+<l:template name="varlistentry" text=""/>
+<l:template name="warning" text="%t"/>
+</l:context>
+<l:context name="title-unnumbered"><l:template name="appendix" text="%t"/>
+<l:template name="article/appendix" text="%t"/>
+<l:template name="bridgehead" text="%t"/>
+<l:template name="chapter" text="%t"/>
+<l:template name="sect1" text="%t"/>
+<l:template name="sect2" text="%t"/>
+<l:template name="sect3" text="%t"/>
+<l:template name="sect4" text="%t"/>
+<l:template name="sect5" text="%t"/>
+<l:template name="section" text="%t"/>
+<l:template name="simplesect" text="%t"/>
+<l:template name="part" text="%t"/>
+</l:context>
+<l:context name="title-numbered"><l:template name="appendix" text="Apendico %n. %t"/>
+<l:template name="article/appendix" text="%n. %t"/>
+<l:template name="bridgehead" text="%n. %t"/>
+<l:template name="chapter" text="Ĉapitro %n. %t"/>
+<l:template name="part" text="Parto %n. %t"/>
+<l:template name="sect1" text="%n. %t"/>
+<l:template name="sect2" text="%n. %t"/>
+<l:template name="sect3" text="%n. %t"/>
+<l:template name="sect4" text="%n. %t"/>
+<l:template name="sect5" text="%n. %t"/>
+<l:template name="section" text="%n. %t"/>
+<l:template name="simplesect" text="%t"/>
+</l:context>
+<l:context name="subtitle"><l:template name="appendix" text="%s"/>
+<l:template name="acknowledgements" text="%s" lang="en"/>
+<l:template name="article" text="%s"/>
+<l:template name="bibliodiv" text="%s"/>
+<l:template name="biblioentry" text="%s"/>
+<l:template name="bibliography" text="%s"/>
+<l:template name="bibliomixed" text="%s"/>
+<l:template name="bibliomset" text="%s"/>
+<l:template name="biblioset" text="%s"/>
+<l:template name="book" text="%s"/>
+<l:template name="chapter" text="%s"/>
+<l:template name="colophon" text="%s"/>
+<l:template name="dedication" text="%s"/>
+<l:template name="glossary" text="%s"/>
+<l:template name="glossdiv" text="%s"/>
+<l:template name="index" text="%s"/>
+<l:template name="indexdiv" text="%s"/>
+<l:template name="lot" text="%s"/>
+<l:template name="part" text="%s"/>
+<l:template name="partintro" text="%s"/>
+<l:template name="preface" text="%s"/>
+<l:template name="refentry" text="%s"/>
+<l:template name="reference" text="%s"/>
+<l:template name="refsection" text="%s"/>
+<l:template name="refsect1" text="%s"/>
+<l:template name="refsect2" text="%s"/>
+<l:template name="refsect3" text="%s"/>
+<l:template name="refsynopsisdiv" text="%s"/>
+<l:template name="sect1" text="%s"/>
+<l:template name="sect2" text="%s"/>
+<l:template name="sect3" text="%s"/>
+<l:template name="sect4" text="%s"/>
+<l:template name="sect5" text="%s"/>
+<l:template name="section" text="%s"/>
+<l:template name="set" text="%s"/>
+<l:template name="setindex" text="%s"/>
+<l:template name="sidebar" text="%s"/>
+<l:template name="simplesect" text="%s"/>
+<l:template name="toc" text="%s"/>
+</l:context>
+<l:context name="xref"><l:template name="abstract" text="%t"/>
+<l:template name="acknowledgements" text="%t" lang="en"/>
+<l:template name="answer" text="R: %n"/>
+<l:template name="appendix" text="%t"/>
+<l:template name="article" text="%t"/>
+<l:template name="authorblurb" text="%t"/>
+<l:template name="bibliodiv" text="%t"/>
+<l:template name="bibliography" text="%t"/>
+<l:template name="bibliomset" text="%t"/>
+<l:template name="biblioset" text="%t"/>
+<l:template name="blockquote" text="%t"/>
+<l:template name="book" text="%t"/>
+<l:template name="calloutlist" text="%t"/>
+<l:template name="caution" text="%t"/>
+<l:template name="chapter" text="%t"/>
+<l:template name="colophon" text="%t"/>
+<l:template name="constraintdef" text="%t"/>
+<l:template name="dedication" text="%t"/>
+<l:template name="equation" text="%t"/>
+<l:template name="example" text="%t"/>
+<l:template name="figure" text="%t"/>
+<l:template name="foil" text="%t"/>
+<l:template name="foilgroup" text="%t"/>
+<l:template name="formalpara" text="%t"/>
+<l:template name="glossary" text="%t"/>
+<l:template name="glossdiv" text="%t"/>
+<l:template name="important" text="%t"/>
+<l:template name="index" text="%t"/>
+<l:template name="indexdiv" text="%t"/>
+<l:template name="itemizedlist" text="%t"/>
+<l:template name="legalnotice" text="%t"/>
+<l:template name="listitem" text="%n"/>
+<l:template name="lot" text="%t"/>
+<l:template name="msg" text="%t"/>
+<l:template name="msgexplan" text="%t"/>
+<l:template name="msgmain" text="%t"/>
+<l:template name="msgrel" text="%t"/>
+<l:template name="msgset" text="%t"/>
+<l:template name="msgsub" text="%t"/>
+<l:template name="note" text="%t"/>
+<l:template name="orderedlist" text="%t"/>
+<l:template name="part" text="%t"/>
+<l:template name="partintro" text="%t"/>
+<l:template name="preface" text="%t"/>
+<l:template name="procedure" text="%t"/>
+<l:template name="productionset" text="%t"/>
+<l:template name="qandadiv" text="%t"/>
+<l:template name="qandaentry" text="Demando %n"/>
+<l:template name="qandaset" text="%t"/>
+<l:template name="question" text="Demando %n"/>
+<l:template name="reference" text="%t"/>
+<l:template name="refsynopsisdiv" text="%t"/>
+<l:template name="segmentedlist" text="%t"/>
+<l:template name="set" text="%t"/>
+<l:template name="setindex" text="%t"/>
+<l:template name="sidebar" text="%t"/>
+<l:template name="table" text="%t"/>
+<l:template name="task" text="%t"/>
+<l:template name="tip" text="%t"/>
+<l:template name="toc" text="%t"/>
+<l:template name="variablelist" text="%t"/>
+<l:template name="varlistentry" text="%n"/>
+<l:template name="warning" text="%t"/>
+<l:template name="olink.document.citation" text=" in %o"/>
+<l:template name="olink.page.citation" text=" (paÄo %p)"/>
+<l:template name="page.citation" text=" [%p]"/>
+<l:template name="page" text="(paÄo %p)"/>
+<l:template name="docname" text=" en %o"/>
+<l:template name="docnamelong" text=" en la dokumento titolata %o"/>
+<l:template name="pageabbrev" text="(p. %p)"/>
+<l:template name="Page" text="PaÄo %p"/>
+<l:template name="bridgehead" text="la sekcio nomata “%tâ€"/>
+<l:template name="refsection" text="la sekcio nomata “%tâ€"/>
+<l:template name="refsect1" text="la sekcio nomata “%tâ€"/>
+<l:template name="refsect2" text="la sekcio nomata “%tâ€"/>
+<l:template name="refsect3" text="la sekcio nomata “%tâ€"/>
+<l:template name="sect1" text="la sekcio nomata “%tâ€"/>
+<l:template name="sect2" text="la sekcio nomata “%tâ€"/>
+<l:template name="sect3" text="la sekcio nomata “%tâ€"/>
+<l:template name="sect4" text="la sekcio nomata “%tâ€"/>
+<l:template name="sect5" text="la sekcio nomata “%tâ€"/>
+<l:template name="section" text="la sekcio nomata “%tâ€"/>
+<l:template name="simplesect" text="la sekcio nomata “%tâ€"/>
+</l:context>
+<l:context name="xref-number"><l:template name="answer" text="R: %n"/>
+<l:template name="appendix" text="Apendico %n"/>
+<l:template name="bridgehead" text="Sekcio %n"/>
+<l:template name="chapter" text="Ĉapitro %n"/>
+<l:template name="equation" text="Ekvacio %n"/>
+<l:template name="example" text="Ekzemplo %n"/>
+<l:template name="figure" text="Figuro %n"/>
+<l:template name="part" text="Parto %n"/>
+<l:template name="procedure" text="Procezo %n"/>
+<l:template name="productionset" text="Produktaĵo %n"/>
+<l:template name="qandadiv" text="Demandoj &amp; Respondoj %n"/>
+<l:template name="qandaentry" text="D: %n"/>
+<l:template name="question" text="D: %n"/>
+<l:template name="sect1" text="Sekcio %n"/>
+<l:template name="sect2" text="Sekcio %n"/>
+<l:template name="sect3" text="Sekcio %n"/>
+<l:template name="sect4" text="Sekcio %n"/>
+<l:template name="sect5" text="Sekcio %n"/>
+<l:template name="section" text="Sekcio %n"/>
+<l:template name="table" text="Tabelo %n"/>
+</l:context>
+<l:context name="xref-number-and-title"><l:template name="appendix" text="Apendico %n, %t"/>
+<l:template name="bridgehead" text="Sekcio %n, “%tâ€"/>
+<l:template name="chapter" text="Ĉapitro %n, %t"/>
+<l:template name="equation" text="Ekvacio %n, “%tâ€"/>
+<l:template name="example" text="Ekzemplo %n, “%tâ€"/>
+<l:template name="figure" text="Figuro %n, “%tâ€"/>
+<l:template name="part" text="Parto %n, “%tâ€"/>
+<l:template name="procedure" text="Procezo %n, “%tâ€"/>
+<l:template name="productionset" text="Produktaĵo %n, “%tâ€"/>
+<l:template name="qandadiv" text="Demandoj &amp; Respondoj %n, “%tâ€"/>
+<l:template name="refsect1" text="la sekcio nomata “%tâ€"/>
+<l:template name="refsect2" text="la sekcio nomata “%tâ€"/>
+<l:template name="refsect3" text="la sekcio nomata “%tâ€"/>
+<l:template name="refsection" text="la sekcio nomata “%tâ€"/>
+<l:template name="sect1" text="Sekcio %n, “%tâ€"/>
+<l:template name="sect2" text="Sekcio %n, “%tâ€"/>
+<l:template name="sect3" text="Sekcio %n, “%tâ€"/>
+<l:template name="sect4" text="Sekcio %n, “%tâ€"/>
+<l:template name="sect5" text="Sekcio %n, “%tâ€"/>
+<l:template name="section" text="Sekcio %n, “%tâ€"/>
+<l:template name="simplesect" text="la sekcio nomata “%tâ€"/>
+<l:template name="table" text="Tabelo %n, “%tâ€"/>
+</l:context>
+<l:context name="authorgroup"><l:template name="sep" text=", "/>
+<l:template name="sep2" text=" kaj "/>
+<l:template name="seplast" text=", kaj "/>
+</l:context>
+<l:context name="glossary"><l:template name="see" text="Vidu %t."/>
+<l:template name="seealso" text="Vidu ankaÅ­ %t."/>
+<l:template name="seealso-separator" text=", "/>
+</l:context>
+<l:context name="msgset"><l:template name="MsgAud" text="Cela legantaro: "/>
+<l:template name="MsgLevel" text="Nivelo: "/>
+<l:template name="MsgOrig" text="Origino: "/>
+</l:context>
+<l:context name="datetime"><l:template name="format" text="m/d/Y"/>
+</l:context>
+<l:context name="termdef"><l:template name="prefix" text="[Difino: "/>
+<l:template name="suffix" text="]"/>
+</l:context>
+<l:context name="datetime-full"><l:template name="January" text="januaro"/>
+<l:template name="February" text="februaro"/>
+<l:template name="March" text="marto"/>
+<l:template name="April" text="aprilo"/>
+<l:template name="May" text="majo"/>
+<l:template name="June" text="junio"/>
+<l:template name="July" text="julio"/>
+<l:template name="August" text="aÅ­gusto"/>
+<l:template name="September" text="septembro"/>
+<l:template name="October" text="oktobro"/>
+<l:template name="November" text="novembro"/>
+<l:template name="December" text="decembro"/>
+<l:template name="Monday" text="lundo"/>
+<l:template name="Tuesday" text="mardo"/>
+<l:template name="Wednesday" text="merkredo"/>
+<l:template name="Thursday" text="ĵaudo"/>
+<l:template name="Friday" text="vendredo"/>
+<l:template name="Saturday" text="sabato"/>
+<l:template name="Sunday" text="dimanĉo"/>
+</l:context>
+<l:context name="datetime-abbrev"><l:template name="Jan" text="jan"/>
+<l:template name="Feb" text="feb"/>
+<l:template name="Mar" text="mar"/>
+<l:template name="Apr" text="apr"/>
+<l:template name="May" text="maj"/>
+<l:template name="Jun" text="jun"/>
+<l:template name="Jul" text="jul"/>
+<l:template name="Aug" text="aÅ­g"/>
+<l:template name="Sep" text="sep"/>
+<l:template name="Oct" text="okt"/>
+<l:template name="Nov" text="nov"/>
+<l:template name="Dec" text="dec"/>
+<l:template name="Mon" text="lun"/>
+<l:template name="Tue" text="mar"/>
+<l:template name="Wed" text="mer"/>
+<l:template name="Thu" text="ĵau"/>
+<l:template name="Fri" text="ven"/>
+<l:template name="Sat" text="sab"/>
+<l:template name="Sun" text="dim"/>
+</l:context>
+<l:context name="htmlhelp"><l:template name="langcode" text="0x0409 Esperanto"/>
+</l:context>
+<l:context name="index"><l:template name="term-separator" text=", "/>
+<l:template name="number-separator" text=", "/>
+<l:template name="range-separator" text="-"/>
+</l:context>
+<l:context name="iso690"><l:template name="lastfirst.sep" text=", "/>
+<l:template name="alt.person.two.sep" text=" – "/>
+<l:template name="alt.person.last.sep" text=" – "/>
+<l:template name="alt.person.more.sep" text=" – "/>
+<l:template name="primary.editor" text=" (red.)"/>
+<l:template name="primary.many" text=", k.a."/>
+<l:template name="primary.sep" text=". "/>
+<l:template name="submaintitle.sep" text=": "/>
+<l:template name="title.sep" text=". "/>
+<l:template name="othertitle.sep" text=", "/>
+<l:template name="medium1" text=" ["/>
+<l:template name="medium2" text="]"/>
+<l:template name="secondary.person.sep" text="; "/>
+<l:template name="secondary.sep" text=". "/>
+<l:template name="respons.sep" text=". "/>
+<l:template name="edition.sep" text=". "/>
+<l:template name="edition.serial.sep" text=", "/>
+<l:template name="issuing.range" text="-"/>
+<l:template name="issuing.div" text=", "/>
+<l:template name="issuing.sep" text=". "/>
+<l:template name="partnr.sep" text=". "/>
+<l:template name="placepubl.sep" text=": "/>
+<l:template name="publyear.sep" text=", "/>
+<l:template name="pubinfo.sep" text=". "/>
+<l:template name="spec.pubinfo.sep" text=", "/>
+<l:template name="upd.sep" text=", "/>
+<l:template name="datecit1" text=" [referencita "/>
+<l:template name="datecit2" text="]"/>
+<l:template name="extent.sep" text=". "/>
+<l:template name="locs.sep" text=", "/>
+<l:template name="location.sep" text=". "/>
+<l:template name="serie.sep" text=". "/>
+<l:template name="notice.sep" text=". "/>
+<l:template name="access" text="Havebla "/>
+<l:template name="acctoo" text="AnkaÅ­ havebla "/>
+<l:template name="onwww" text="de la Tut-Tera Teksaĵo"/>
+<l:template name="oninet" text="de la Interreto"/>
+<l:template name="access.end" text=": "/>
+<l:template name="link1" text="&lt;"/>
+<l:template name="link2" text="&gt;"/>
+<l:template name="access.sep" text=". "/>
+<l:template name="isbn" text="ISBN "/>
+<l:template name="issn" text="ISSN "/>
+<l:template name="stdnum.sep" text=". "/>
+<l:template name="patcountry.sep" text=". "/>
+<l:template name="pattype.sep" text=", "/>
+<l:template name="patnum.sep" text=". "/>
+<l:template name="patdate.sep" text=". "/>
+</l:context><l:letters><l:l i="-1"/>
+<l:l i="0">Symbols</l:l>
+<l:l i="10">A</l:l>
+<l:l i="10">a</l:l>
+<l:l i="10">À</l:l>
+<l:l i="10">à</l:l>
+<l:l i="10">Ã</l:l>
+<l:l i="10">á</l:l>
+<l:l i="10">Â</l:l>
+<l:l i="10">â</l:l>
+<l:l i="10">Ã</l:l>
+<l:l i="10">ã</l:l>
+<l:l i="10">Ä</l:l>
+<l:l i="10">ä</l:l>
+<l:l i="10">Ã…</l:l>
+<l:l i="10">Ã¥</l:l>
+<l:l i="10">Ä€</l:l>
+<l:l i="10">Ä</l:l>
+<l:l i="10">Ä‚</l:l>
+<l:l i="10">ă</l:l>
+<l:l i="10">Ä„</l:l>
+<l:l i="10">Ä…</l:l>
+<l:l i="10">Ç</l:l>
+<l:l i="10">ÇŽ</l:l>
+<l:l i="10">Çž</l:l>
+<l:l i="10">ÇŸ</l:l>
+<l:l i="10">Ç </l:l>
+<l:l i="10">Ç¡</l:l>
+<l:l i="10">Ǻ</l:l>
+<l:l i="10">Ç»</l:l>
+<l:l i="10">È€</l:l>
+<l:l i="10">È</l:l>
+<l:l i="10">È‚</l:l>
+<l:l i="10">ȃ</l:l>
+<l:l i="10">Ȧ</l:l>
+<l:l i="10">ȧ</l:l>
+<l:l i="10">Ḁ</l:l>
+<l:l i="10">á¸</l:l>
+<l:l i="10">ẚ</l:l>
+<l:l i="10">Ạ</l:l>
+<l:l i="10">ạ</l:l>
+<l:l i="10">Ả</l:l>
+<l:l i="10">ả</l:l>
+<l:l i="10">Ấ</l:l>
+<l:l i="10">ấ</l:l>
+<l:l i="10">Ầ</l:l>
+<l:l i="10">ầ</l:l>
+<l:l i="10">Ẩ</l:l>
+<l:l i="10">ẩ</l:l>
+<l:l i="10">Ẫ</l:l>
+<l:l i="10">ẫ</l:l>
+<l:l i="10">Ậ</l:l>
+<l:l i="10">ậ</l:l>
+<l:l i="10">Ắ</l:l>
+<l:l i="10">ắ</l:l>
+<l:l i="10">Ằ</l:l>
+<l:l i="10">ằ</l:l>
+<l:l i="10">Ẳ</l:l>
+<l:l i="10">ẳ</l:l>
+<l:l i="10">Ẵ</l:l>
+<l:l i="10">ẵ</l:l>
+<l:l i="10">Ặ</l:l>
+<l:l i="10">ặ</l:l>
+<l:l i="20">B</l:l>
+<l:l i="20">b</l:l>
+<l:l i="20">Æ€</l:l>
+<l:l i="20">Æ</l:l>
+<l:l i="20">É“</l:l>
+<l:l i="20">Æ‚</l:l>
+<l:l i="20">ƃ</l:l>
+<l:l i="20">Ḃ</l:l>
+<l:l i="20">ḃ</l:l>
+<l:l i="20">Ḅ</l:l>
+<l:l i="20">ḅ</l:l>
+<l:l i="20">Ḇ</l:l>
+<l:l i="20">ḇ</l:l>
+<l:l i="30">C</l:l>
+<l:l i="30">c</l:l>
+<l:l i="30">Ç</l:l>
+<l:l i="30">ç</l:l>
+<l:l i="30">Ć</l:l>
+<l:l i="30">ć</l:l>
+<l:l i="30">Ĉ</l:l>
+<l:l i="30">ĉ</l:l>
+<l:l i="30">ÄŠ</l:l>
+<l:l i="30">Ä‹</l:l>
+<l:l i="30">Č</l:l>
+<l:l i="30">Ä</l:l>
+<l:l i="30">Ƈ</l:l>
+<l:l i="30">ƈ</l:l>
+<l:l i="30">É•</l:l>
+<l:l i="30">Ḉ</l:l>
+<l:l i="30">ḉ</l:l>
+<l:l i="40">D</l:l>
+<l:l i="40">d</l:l>
+<l:l i="40">ÄŽ</l:l>
+<l:l i="40">Ä</l:l>
+<l:l i="40">Ä</l:l>
+<l:l i="40">Ä‘</l:l>
+<l:l i="40">ÆŠ</l:l>
+<l:l i="40">É—</l:l>
+<l:l i="40">Æ‹</l:l>
+<l:l i="40">ƌ</l:l>
+<l:l i="40">Ç…</l:l>
+<l:l i="40">Dz</l:l>
+<l:l i="40">È¡</l:l>
+<l:l i="40">É–</l:l>
+<l:l i="40">Ḋ</l:l>
+<l:l i="40">ḋ</l:l>
+<l:l i="40">Ḍ</l:l>
+<l:l i="40">á¸</l:l>
+<l:l i="40">Ḏ</l:l>
+<l:l i="40">á¸</l:l>
+<l:l i="40">á¸</l:l>
+<l:l i="40">ḑ</l:l>
+<l:l i="40">Ḓ</l:l>
+<l:l i="40">ḓ</l:l>
+<l:l i="50">E</l:l>
+<l:l i="50">e</l:l>
+<l:l i="50">È</l:l>
+<l:l i="50">è</l:l>
+<l:l i="50">É</l:l>
+<l:l i="50">é</l:l>
+<l:l i="50">Ê</l:l>
+<l:l i="50">ê</l:l>
+<l:l i="50">Ë</l:l>
+<l:l i="50">ë</l:l>
+<l:l i="50">Ä’</l:l>
+<l:l i="50">Ä“</l:l>
+<l:l i="50">Ä”</l:l>
+<l:l i="50">Ä•</l:l>
+<l:l i="50">Ä–</l:l>
+<l:l i="50">Ä—</l:l>
+<l:l i="50">Ę</l:l>
+<l:l i="50">Ä™</l:l>
+<l:l i="50">Äš</l:l>
+<l:l i="50">Ä›</l:l>
+<l:l i="50">È„</l:l>
+<l:l i="50">È…</l:l>
+<l:l i="50">Ȇ</l:l>
+<l:l i="50">ȇ</l:l>
+<l:l i="50">Ȩ</l:l>
+<l:l i="50">È©</l:l>
+<l:l i="50">Ḕ</l:l>
+<l:l i="50">ḕ</l:l>
+<l:l i="50">Ḗ</l:l>
+<l:l i="50">ḗ</l:l>
+<l:l i="50">Ḙ</l:l>
+<l:l i="50">ḙ</l:l>
+<l:l i="50">Ḛ</l:l>
+<l:l i="50">ḛ</l:l>
+<l:l i="50">Ḝ</l:l>
+<l:l i="50">á¸</l:l>
+<l:l i="50">Ẹ</l:l>
+<l:l i="50">ẹ</l:l>
+<l:l i="50">Ẻ</l:l>
+<l:l i="50">ẻ</l:l>
+<l:l i="50">Ẽ</l:l>
+<l:l i="50">ẽ</l:l>
+<l:l i="50">Ế</l:l>
+<l:l i="50">ế</l:l>
+<l:l i="50">Ề</l:l>
+<l:l i="50">á»</l:l>
+<l:l i="50">Ể</l:l>
+<l:l i="50">ể</l:l>
+<l:l i="50">Ễ</l:l>
+<l:l i="50">á»…</l:l>
+<l:l i="50">Ệ</l:l>
+<l:l i="50">ệ</l:l>
+<l:l i="60">F</l:l>
+<l:l i="60">f</l:l>
+<l:l i="60">Æ‘</l:l>
+<l:l i="60">Æ’</l:l>
+<l:l i="60">Ḟ</l:l>
+<l:l i="60">ḟ</l:l>
+<l:l i="70">G</l:l>
+<l:l i="70">g</l:l>
+<l:l i="70">Ĝ</l:l>
+<l:l i="70">Ä</l:l>
+<l:l i="70">Äž</l:l>
+<l:l i="70">ÄŸ</l:l>
+<l:l i="70">Ä </l:l>
+<l:l i="70">Ä¡</l:l>
+<l:l i="70">Ä¢</l:l>
+<l:l i="70">Ä£</l:l>
+<l:l i="70">Æ“</l:l>
+<l:l i="70">É </l:l>
+<l:l i="70">Ǥ</l:l>
+<l:l i="70">Ç¥</l:l>
+<l:l i="70">Ǧ</l:l>
+<l:l i="70">ǧ</l:l>
+<l:l i="70">Ç´</l:l>
+<l:l i="70">ǵ</l:l>
+<l:l i="70">Ḡ</l:l>
+<l:l i="70">ḡ</l:l>
+<l:l i="80">H</l:l>
+<l:l i="80">h</l:l>
+<l:l i="80">Ĥ</l:l>
+<l:l i="80">Ä¥</l:l>
+<l:l i="80">Ħ</l:l>
+<l:l i="80">ħ</l:l>
+<l:l i="80">Èž</l:l>
+<l:l i="80">ÈŸ</l:l>
+<l:l i="80">ɦ</l:l>
+<l:l i="80">Ḣ</l:l>
+<l:l i="80">ḣ</l:l>
+<l:l i="80">Ḥ</l:l>
+<l:l i="80">ḥ</l:l>
+<l:l i="80">Ḧ</l:l>
+<l:l i="80">ḧ</l:l>
+<l:l i="80">Ḩ</l:l>
+<l:l i="80">ḩ</l:l>
+<l:l i="80">Ḫ</l:l>
+<l:l i="80">ḫ</l:l>
+<l:l i="80">ẖ</l:l>
+<l:l i="90">I</l:l>
+<l:l i="90">i</l:l>
+<l:l i="90">Ì</l:l>
+<l:l i="90">ì</l:l>
+<l:l i="90">Ã</l:l>
+<l:l i="90">í</l:l>
+<l:l i="90">ÃŽ</l:l>
+<l:l i="90">î</l:l>
+<l:l i="90">Ã</l:l>
+<l:l i="90">ï</l:l>
+<l:l i="90">Ĩ</l:l>
+<l:l i="90">Ä©</l:l>
+<l:l i="90">Ī</l:l>
+<l:l i="90">Ä«</l:l>
+<l:l i="90">Ĭ</l:l>
+<l:l i="90">Ä­</l:l>
+<l:l i="90">Ä®</l:l>
+<l:l i="90">į</l:l>
+<l:l i="90">Ä°</l:l>
+<l:l i="90">Æ—</l:l>
+<l:l i="90">ɨ</l:l>
+<l:l i="90">Ç</l:l>
+<l:l i="90">Ç</l:l>
+<l:l i="90">Ȉ</l:l>
+<l:l i="90">ȉ</l:l>
+<l:l i="90">ÈŠ</l:l>
+<l:l i="90">È‹</l:l>
+<l:l i="90">Ḭ</l:l>
+<l:l i="90">ḭ</l:l>
+<l:l i="90">Ḯ</l:l>
+<l:l i="90">ḯ</l:l>
+<l:l i="90">Ỉ</l:l>
+<l:l i="90">ỉ</l:l>
+<l:l i="90">Ị</l:l>
+<l:l i="90">ị</l:l>
+<l:l i="100">J</l:l>
+<l:l i="100">j</l:l>
+<l:l i="100">Ä´</l:l>
+<l:l i="100">ĵ</l:l>
+<l:l i="100">Ç°</l:l>
+<l:l i="100">Ê</l:l>
+<l:l i="110">K</l:l>
+<l:l i="110">k</l:l>
+<l:l i="110">Ķ</l:l>
+<l:l i="110">Ä·</l:l>
+<l:l i="110">Ƙ</l:l>
+<l:l i="110">Æ™</l:l>
+<l:l i="110">Ǩ</l:l>
+<l:l i="110">Ç©</l:l>
+<l:l i="110">Ḱ</l:l>
+<l:l i="110">ḱ</l:l>
+<l:l i="110">Ḳ</l:l>
+<l:l i="110">ḳ</l:l>
+<l:l i="110">Ḵ</l:l>
+<l:l i="110">ḵ</l:l>
+<l:l i="120">L</l:l>
+<l:l i="120">l</l:l>
+<l:l i="120">Ĺ</l:l>
+<l:l i="120">ĺ</l:l>
+<l:l i="120">Ä»</l:l>
+<l:l i="120">ļ</l:l>
+<l:l i="120">Ľ</l:l>
+<l:l i="120">ľ</l:l>
+<l:l i="120">Ä¿</l:l>
+<l:l i="120">Å€</l:l>
+<l:l i="120">Å</l:l>
+<l:l i="120">Å‚</l:l>
+<l:l i="120">Æš</l:l>
+<l:l i="120">Lj</l:l>
+<l:l i="120">È´</l:l>
+<l:l i="120">É«</l:l>
+<l:l i="120">ɬ</l:l>
+<l:l i="120">É­</l:l>
+<l:l i="120">Ḷ</l:l>
+<l:l i="120">ḷ</l:l>
+<l:l i="120">Ḹ</l:l>
+<l:l i="120">ḹ</l:l>
+<l:l i="120">Ḻ</l:l>
+<l:l i="120">ḻ</l:l>
+<l:l i="120">Ḽ</l:l>
+<l:l i="120">ḽ</l:l>
+<l:l i="130">M</l:l>
+<l:l i="130">m</l:l>
+<l:l i="130">ɱ</l:l>
+<l:l i="130">Ḿ</l:l>
+<l:l i="130">ḿ</l:l>
+<l:l i="130">á¹€</l:l>
+<l:l i="130">á¹</l:l>
+<l:l i="130">Ṃ</l:l>
+<l:l i="130">ṃ</l:l>
+<l:l i="140">N</l:l>
+<l:l i="140">n</l:l>
+<l:l i="140">Ñ</l:l>
+<l:l i="140">ñ</l:l>
+<l:l i="140">Ń</l:l>
+<l:l i="140">Å„</l:l>
+<l:l i="140">Å…</l:l>
+<l:l i="140">ņ</l:l>
+<l:l i="140">Ň</l:l>
+<l:l i="140">ň</l:l>
+<l:l i="140">Æ</l:l>
+<l:l i="140">ɲ</l:l>
+<l:l i="140">Æž</l:l>
+<l:l i="140">È </l:l>
+<l:l i="140">Ç‹</l:l>
+<l:l i="140">Ǹ</l:l>
+<l:l i="140">ǹ</l:l>
+<l:l i="140">ȵ</l:l>
+<l:l i="140">ɳ</l:l>
+<l:l i="140">Ṅ</l:l>
+<l:l i="140">á¹…</l:l>
+<l:l i="140">Ṇ</l:l>
+<l:l i="140">ṇ</l:l>
+<l:l i="140">Ṉ</l:l>
+<l:l i="140">ṉ</l:l>
+<l:l i="140">Ṋ</l:l>
+<l:l i="140">ṋ</l:l>
+<l:l i="150">O</l:l>
+<l:l i="150">o</l:l>
+<l:l i="150">Ã’</l:l>
+<l:l i="150">ò</l:l>
+<l:l i="150">Ó</l:l>
+<l:l i="150">ó</l:l>
+<l:l i="150">Ô</l:l>
+<l:l i="150">ô</l:l>
+<l:l i="150">Õ</l:l>
+<l:l i="150">õ</l:l>
+<l:l i="150">Ö</l:l>
+<l:l i="150">ö</l:l>
+<l:l i="150">Ø</l:l>
+<l:l i="150">ø</l:l>
+<l:l i="150">Ō</l:l>
+<l:l i="150">Å</l:l>
+<l:l i="150">ÅŽ</l:l>
+<l:l i="150">Å</l:l>
+<l:l i="150">Å</l:l>
+<l:l i="150">Å‘</l:l>
+<l:l i="150">ÆŸ</l:l>
+<l:l i="150">Æ </l:l>
+<l:l i="150">Æ¡</l:l>
+<l:l i="150">Ç‘</l:l>
+<l:l i="150">Ç’</l:l>
+<l:l i="150">Ǫ</l:l>
+<l:l i="150">Ç«</l:l>
+<l:l i="150">Ǭ</l:l>
+<l:l i="150">Ç­</l:l>
+<l:l i="150">Ǿ</l:l>
+<l:l i="150">Ç¿</l:l>
+<l:l i="150">Ȍ</l:l>
+<l:l i="150">È</l:l>
+<l:l i="150">ÈŽ</l:l>
+<l:l i="150">È</l:l>
+<l:l i="150">Ȫ</l:l>
+<l:l i="150">È«</l:l>
+<l:l i="150">Ȭ</l:l>
+<l:l i="150">È­</l:l>
+<l:l i="150">È®</l:l>
+<l:l i="150">ȯ</l:l>
+<l:l i="150">È°</l:l>
+<l:l i="150">ȱ</l:l>
+<l:l i="150">Ṍ</l:l>
+<l:l i="150">á¹</l:l>
+<l:l i="150">Ṏ</l:l>
+<l:l i="150">á¹</l:l>
+<l:l i="150">á¹</l:l>
+<l:l i="150">ṑ</l:l>
+<l:l i="150">á¹’</l:l>
+<l:l i="150">ṓ</l:l>
+<l:l i="150">Ọ</l:l>
+<l:l i="150">á»</l:l>
+<l:l i="150">Ỏ</l:l>
+<l:l i="150">á»</l:l>
+<l:l i="150">á»</l:l>
+<l:l i="150">ố</l:l>
+<l:l i="150">á»’</l:l>
+<l:l i="150">ồ</l:l>
+<l:l i="150">á»”</l:l>
+<l:l i="150">ổ</l:l>
+<l:l i="150">á»–</l:l>
+<l:l i="150">á»—</l:l>
+<l:l i="150">Ộ</l:l>
+<l:l i="150">á»™</l:l>
+<l:l i="150">Ớ</l:l>
+<l:l i="150">á»›</l:l>
+<l:l i="150">Ờ</l:l>
+<l:l i="150">á»</l:l>
+<l:l i="150">Ở</l:l>
+<l:l i="150">ở</l:l>
+<l:l i="150">á» </l:l>
+<l:l i="150">ỡ</l:l>
+<l:l i="150">Ợ</l:l>
+<l:l i="150">ợ</l:l>
+<l:l i="160">P</l:l>
+<l:l i="160">p</l:l>
+<l:l i="160">Ƥ</l:l>
+<l:l i="160">Æ¥</l:l>
+<l:l i="160">á¹”</l:l>
+<l:l i="160">ṕ</l:l>
+<l:l i="160">á¹–</l:l>
+<l:l i="160">á¹—</l:l>
+<l:l i="170">Q</l:l>
+<l:l i="170">q</l:l>
+<l:l i="170">Ê </l:l>
+<l:l i="180">R</l:l>
+<l:l i="180">r</l:l>
+<l:l i="180">Å”</l:l>
+<l:l i="180">Å•</l:l>
+<l:l i="180">Å–</l:l>
+<l:l i="180">Å—</l:l>
+<l:l i="180">Ř</l:l>
+<l:l i="180">Å™</l:l>
+<l:l i="180">È</l:l>
+<l:l i="180">È‘</l:l>
+<l:l i="180">È’</l:l>
+<l:l i="180">È“</l:l>
+<l:l i="180">ɼ</l:l>
+<l:l i="180">ɽ</l:l>
+<l:l i="180">ɾ</l:l>
+<l:l i="180">Ṙ</l:l>
+<l:l i="180">á¹™</l:l>
+<l:l i="180">Ṛ</l:l>
+<l:l i="180">á¹›</l:l>
+<l:l i="180">Ṝ</l:l>
+<l:l i="180">á¹</l:l>
+<l:l i="180">Ṟ</l:l>
+<l:l i="180">ṟ</l:l>
+<l:l i="190">S</l:l>
+<l:l i="190">s</l:l>
+<l:l i="190">Åš</l:l>
+<l:l i="190">Å›</l:l>
+<l:l i="190">Ŝ</l:l>
+<l:l i="190">Å</l:l>
+<l:l i="190">Åž</l:l>
+<l:l i="190">ÅŸ</l:l>
+<l:l i="190">Å </l:l>
+<l:l i="190">Å¡</l:l>
+<l:l i="190">Ș</l:l>
+<l:l i="190">È™</l:l>
+<l:l i="190">Ê‚</l:l>
+<l:l i="190">á¹ </l:l>
+<l:l i="190">ṡ</l:l>
+<l:l i="190">á¹¢</l:l>
+<l:l i="190">á¹£</l:l>
+<l:l i="190">Ṥ</l:l>
+<l:l i="190">á¹¥</l:l>
+<l:l i="190">Ṧ</l:l>
+<l:l i="190">ṧ</l:l>
+<l:l i="190">Ṩ</l:l>
+<l:l i="190">ṩ</l:l>
+<l:l i="200">T</l:l>
+<l:l i="200">t</l:l>
+<l:l i="200">Å¢</l:l>
+<l:l i="200">Å£</l:l>
+<l:l i="200">Ť</l:l>
+<l:l i="200">Å¥</l:l>
+<l:l i="200">Ŧ</l:l>
+<l:l i="200">ŧ</l:l>
+<l:l i="200">Æ«</l:l>
+<l:l i="200">Ƭ</l:l>
+<l:l i="200">Æ­</l:l>
+<l:l i="200">Æ®</l:l>
+<l:l i="200">ʈ</l:l>
+<l:l i="200">Èš</l:l>
+<l:l i="200">È›</l:l>
+<l:l i="200">ȶ</l:l>
+<l:l i="200">Ṫ</l:l>
+<l:l i="200">ṫ</l:l>
+<l:l i="200">Ṭ</l:l>
+<l:l i="200">á¹­</l:l>
+<l:l i="200">á¹®</l:l>
+<l:l i="200">ṯ</l:l>
+<l:l i="200">á¹°</l:l>
+<l:l i="200">á¹±</l:l>
+<l:l i="200">ẗ</l:l>
+<l:l i="210">U</l:l>
+<l:l i="210">u</l:l>
+<l:l i="210">Ù</l:l>
+<l:l i="210">ù</l:l>
+<l:l i="210">Ú</l:l>
+<l:l i="210">ú</l:l>
+<l:l i="210">Û</l:l>
+<l:l i="210">û</l:l>
+<l:l i="210">Ü</l:l>
+<l:l i="210">ü</l:l>
+<l:l i="210">Ũ</l:l>
+<l:l i="210">Å©</l:l>
+<l:l i="210">Ū</l:l>
+<l:l i="210">Å«</l:l>
+<l:l i="210">Ŭ</l:l>
+<l:l i="210">Å­</l:l>
+<l:l i="210">Å®</l:l>
+<l:l i="210">ů</l:l>
+<l:l i="210">Å°</l:l>
+<l:l i="210">ű</l:l>
+<l:l i="210">Ų</l:l>
+<l:l i="210">ų</l:l>
+<l:l i="210">Ư</l:l>
+<l:l i="210">Æ°</l:l>
+<l:l i="210">Ç“</l:l>
+<l:l i="210">Ç”</l:l>
+<l:l i="210">Ç•</l:l>
+<l:l i="210">Ç–</l:l>
+<l:l i="210">Ç—</l:l>
+<l:l i="210">ǘ</l:l>
+<l:l i="210">Ç™</l:l>
+<l:l i="210">Çš</l:l>
+<l:l i="210">Ç›</l:l>
+<l:l i="210">ǜ</l:l>
+<l:l i="210">È”</l:l>
+<l:l i="210">È•</l:l>
+<l:l i="210">È–</l:l>
+<l:l i="210">È—</l:l>
+<l:l i="210">á¹²</l:l>
+<l:l i="210">á¹³</l:l>
+<l:l i="210">á¹´</l:l>
+<l:l i="210">á¹µ</l:l>
+<l:l i="210">Ṷ</l:l>
+<l:l i="210">á¹·</l:l>
+<l:l i="210">Ṹ</l:l>
+<l:l i="210">á¹¹</l:l>
+<l:l i="210">Ṻ</l:l>
+<l:l i="210">á¹»</l:l>
+<l:l i="210">Ụ</l:l>
+<l:l i="210">ụ</l:l>
+<l:l i="210">Ủ</l:l>
+<l:l i="210">ủ</l:l>
+<l:l i="210">Ứ</l:l>
+<l:l i="210">ứ</l:l>
+<l:l i="210">Ừ</l:l>
+<l:l i="210">ừ</l:l>
+<l:l i="210">Ử</l:l>
+<l:l i="210">á»­</l:l>
+<l:l i="210">á»®</l:l>
+<l:l i="210">ữ</l:l>
+<l:l i="210">á»°</l:l>
+<l:l i="210">á»±</l:l>
+<l:l i="220">V</l:l>
+<l:l i="220">v</l:l>
+<l:l i="220">Ʋ</l:l>
+<l:l i="220">Ê‹</l:l>
+<l:l i="220">á¹¼</l:l>
+<l:l i="220">á¹½</l:l>
+<l:l i="220">á¹¾</l:l>
+<l:l i="220">ṿ</l:l>
+<l:l i="230">W</l:l>
+<l:l i="230">w</l:l>
+<l:l i="230">Å´</l:l>
+<l:l i="230">ŵ</l:l>
+<l:l i="230">Ẁ</l:l>
+<l:l i="230">áº</l:l>
+<l:l i="230">Ẃ</l:l>
+<l:l i="230">ẃ</l:l>
+<l:l i="230">Ẅ</l:l>
+<l:l i="230">ẅ</l:l>
+<l:l i="230">Ẇ</l:l>
+<l:l i="230">ẇ</l:l>
+<l:l i="230">Ẉ</l:l>
+<l:l i="230">ẉ</l:l>
+<l:l i="230">ẘ</l:l>
+<l:l i="240">X</l:l>
+<l:l i="240">x</l:l>
+<l:l i="240">Ẋ</l:l>
+<l:l i="240">ẋ</l:l>
+<l:l i="240">Ẍ</l:l>
+<l:l i="240">áº</l:l>
+<l:l i="250">Y</l:l>
+<l:l i="250">y</l:l>
+<l:l i="250">Ã</l:l>
+<l:l i="250">ý</l:l>
+<l:l i="250">ÿ</l:l>
+<l:l i="250">Ÿ</l:l>
+<l:l i="250">Ŷ</l:l>
+<l:l i="250">Å·</l:l>
+<l:l i="250">Ƴ</l:l>
+<l:l i="250">Æ´</l:l>
+<l:l i="250">Ȳ</l:l>
+<l:l i="250">ȳ</l:l>
+<l:l i="250">Ẏ</l:l>
+<l:l i="250">áº</l:l>
+<l:l i="250">ẙ</l:l>
+<l:l i="250">Ỳ</l:l>
+<l:l i="250">ỳ</l:l>
+<l:l i="250">á»´</l:l>
+<l:l i="250">ỵ</l:l>
+<l:l i="250">Ỷ</l:l>
+<l:l i="250">á»·</l:l>
+<l:l i="250">Ỹ</l:l>
+<l:l i="250">ỹ</l:l>
+<l:l i="260">Z</l:l>
+<l:l i="260">z</l:l>
+<l:l i="260">Ź</l:l>
+<l:l i="260">ź</l:l>
+<l:l i="260">Å»</l:l>
+<l:l i="260">ż</l:l>
+<l:l i="260">Ž</l:l>
+<l:l i="260">ž</l:l>
+<l:l i="260">Ƶ</l:l>
+<l:l i="260">ƶ</l:l>
+<l:l i="260">Ȥ</l:l>
+<l:l i="260">È¥</l:l>
+<l:l i="260">Ê</l:l>
+<l:l i="260">Ê‘</l:l>
+<l:l i="260">áº</l:l>
+<l:l i="260">ẑ</l:l>
+<l:l i="260">Ẓ</l:l>
+<l:l i="260">ẓ</l:l>
+<l:l i="260">Ẕ</l:l>
+<l:l i="260">ẕ</l:l>
+</l:letters>
+</l:l10n>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/es.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/es.xml
new file mode 100644
index 0000000..aad1980
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/es.xml
@@ -0,0 +1,676 @@
+<?xml version="1.0" encoding="utf-8"?>
+<l:l10n xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0" language="es" english-language-name="Spanish">
+
+<!-- * This file is generated automatically. -->
+<!-- * To submit changes to this file upstream (to the DocBook Project) -->
+<!-- * do not submit an edited version of this file. Instead, submit an -->
+<!-- * edited version of the source file at the following location: -->
+<!-- * -->
+<!-- * https://docbook.svn.sourceforge.net/svnroot/docbook/trunk/gentext/locale/es.xml -->
+<!-- * -->
+<!-- * E-mail the edited es.xml source file to: -->
+<!-- * -->
+<!-- * docbook-developers@lists.sourceforge.net -->
+
+<!-- ******************************************************************** -->
+
+<!-- This file is part of the XSL DocBook Stylesheet distribution. -->
+<!-- See ../README or http://docbook.sf.net/release/xsl/current/ for -->
+<!-- copyright and other information. -->
+
+<!-- ******************************************************************** -->
+<!-- In these files, % with a letter is used for a placeholder: -->
+<!-- %t is the current element's title -->
+<!-- %s is the current element's subtitle (if applicable)-->
+<!-- %n is the current element's number label-->
+<!-- %p is the current element's page number (if applicable)-->
+<!-- ******************************************************************** -->
+
+
+<l:gentext key="Abstract" text="Resumen"/>
+<l:gentext key="abstract" text="resumen"/>
+<l:gentext key="Acknowledgements" text="Agradecimientos"/>
+<l:gentext key="acknowledgements" text="agradecimientos"/>
+<l:gentext key="Answer" text="R:"/>
+<l:gentext key="answer" text="r:"/>
+<l:gentext key="Appendix" text="Apéndice"/>
+<l:gentext key="appendix" text="apéndice"/>
+<l:gentext key="Article" text="Artículo"/>
+<l:gentext key="article" text="artículo"/>
+<l:gentext key="Author" text="Autor"/>
+<l:gentext key="Bibliography" text="Bibliografía"/>
+<l:gentext key="bibliography" text="bibliografía"/>
+<l:gentext key="Book" text="Libro"/>
+<l:gentext key="book" text="libro"/>
+<l:gentext key="CAUTION" text="ATENCIÓN"/>
+<l:gentext key="Caution" text="Atención"/>
+<l:gentext key="caution" text="atención"/>
+<l:gentext key="Chapter" text="Capítulo"/>
+<l:gentext key="chapter" text="capítulo"/>
+<l:gentext key="Colophon" text="Colofón"/>
+<l:gentext key="colophon" text="colofón"/>
+<l:gentext key="Copyright" text="Copyright"/>
+<l:gentext key="copyright" text="copyright"/>
+<l:gentext key="Dedication" text="Dedicatoria"/>
+<l:gentext key="dedication" text="dedicatoria"/>
+<l:gentext key="Edition" text="Edición"/>
+<l:gentext key="edition" text="edición"/>
+<l:gentext key="Editor" text="Editor" lang="en"/>
+<l:gentext key="Equation" text="Ecuación"/>
+<l:gentext key="equation" text="ecuación"/>
+<l:gentext key="Example" text="Ejemplo"/>
+<l:gentext key="example" text="ejemplo"/>
+<l:gentext key="Figure" text="Figura"/>
+<l:gentext key="figure" text="figura"/>
+<l:gentext key="Glossary" text="Glosario"/>
+<l:gentext key="glossary" text="glosario"/>
+<l:gentext key="GlossSee" text="Ver"/>
+<l:gentext key="glosssee" text="ver"/>
+<l:gentext key="GlossSeeAlso" text="Ver también"/>
+<l:gentext key="glossseealso" text="ver también"/>
+<l:gentext key="IMPORTANT" text="IMPORTANTE"/>
+<l:gentext key="important" text="importante"/>
+<l:gentext key="Important" text="Importante"/>
+<l:gentext key="Index" text="Ãndice"/>
+<l:gentext key="index" text="índice"/>
+<l:gentext key="ISBN" text="ISBN"/>
+<l:gentext key="isbn" text="isbn"/>
+<l:gentext key="LegalNotice" text="Aviso Legal"/>
+<l:gentext key="legalnotice" text="aviso legal"/>
+<l:gentext key="MsgAud" text="Audiencia"/>
+<l:gentext key="msgaud" text="audiencia"/>
+<l:gentext key="MsgLevel" text="Nivel"/>
+<l:gentext key="msglevel" text="nivel"/>
+<l:gentext key="MsgOrig" text="Origen"/>
+<l:gentext key="msgorig" text="origen"/>
+<l:gentext key="NOTE" text="NOTA"/>
+<l:gentext key="Note" text="Nota"/>
+<l:gentext key="note" text="nota"/>
+<l:gentext key="Part" text="Parte"/>
+<l:gentext key="part" text="parte"/>
+<l:gentext key="Preface" text="Prefacio"/>
+<l:gentext key="preface" text="prefacio"/>
+<l:gentext key="Procedure" text="Procedimiento"/>
+<l:gentext key="procedure" text="procedimiento"/>
+<l:gentext key="ProductionSet" text="Producción"/>
+<l:gentext key="PubDate" text="Fecha de publicación"/>
+<l:gentext key="pubdate" text="fecha de publicación"/>
+<l:gentext key="Published" text="Publicado"/>
+<l:gentext key="published" text="publicado"/>
+<l:gentext key="Publisher" text="Editor"/>
+<l:gentext key="Qandadiv" text="P y R"/>
+<l:gentext key="qandadiv" text="P y R"/>
+<l:gentext key="QandASet" text="Preguntas más frecuentes"/>
+<l:gentext key="Question" text="P:"/>
+<l:gentext key="question" text="p:"/>
+<l:gentext key="RefEntry" text="Página"/>
+<l:gentext key="refentry" text="página"/>
+<l:gentext key="Reference" text="Referencia"/>
+<l:gentext key="reference" text="referencia"/>
+<l:gentext key="References" text="Referencias"/>
+<l:gentext key="RefName" text="Nombre de referencia"/>
+<l:gentext key="refname" text="nombre de referencia"/>
+<l:gentext key="RefSection" text="Sección de referencia"/>
+<l:gentext key="refsection" text="sección de referencia"/>
+<l:gentext key="RefSynopsisDiv" text="Sinopsis"/>
+<l:gentext key="refsynopsisdiv" text="sinopsis"/>
+<l:gentext key="RevHistory" text="Historial de revisiones"/>
+<l:gentext key="revhistory" text="Historial de revisiones"/>
+<l:gentext key="revision" text="revisión"/>
+<l:gentext key="Revision" text="Revisión"/>
+<l:gentext key="sect1" text="Sección"/>
+<l:gentext key="sect2" text="Sección"/>
+<l:gentext key="sect3" text="Sección"/>
+<l:gentext key="sect4" text="Sección"/>
+<l:gentext key="sect5" text="Sección"/>
+<l:gentext key="section" text="sección"/>
+<l:gentext key="Section" text="Sección"/>
+<l:gentext key="see" text="ver"/>
+<l:gentext key="See" text="Ver"/>
+<l:gentext key="seealso" text="ver también"/>
+<l:gentext key="Seealso" text="Ver también"/>
+<l:gentext key="SeeAlso" text="Ver También"/>
+<l:gentext key="set" text="conjunto"/>
+<l:gentext key="Set" text="Conjunto"/>
+<l:gentext key="setindex" text="índice del conjunto"/>
+<l:gentext key="SetIndex" text="Ãndice del Conjunto"/>
+<l:gentext key="Sidebar" text="Barra lateral"/>
+<l:gentext key="sidebar" text="barra lateral"/>
+<l:gentext key="step" text="paso"/>
+<l:gentext key="Step" text="Paso"/>
+<l:gentext key="table" text="tabla"/>
+<l:gentext key="Table" text="Tabla"/>
+<l:gentext key="task" text="tarea"/>
+<l:gentext key="Task" text="Tarea"/>
+<l:gentext key="tip" text="sugerencia"/>
+<l:gentext key="TIP" text="SUGERENCIA"/>
+<l:gentext key="Tip" text="Sugerencia"/>
+<l:gentext key="Warning" text="Aviso"/>
+<l:gentext key="warning" text="aviso"/>
+<l:gentext key="WARNING" text="AVISO"/>
+<l:gentext key="and" text="y"/>
+<l:gentext key="by" text="por"/>
+<l:gentext key="Edited" text="Editado"/>
+<l:gentext key="edited" text="editado"/>
+<l:gentext key="Editedby" text="Editado por"/>
+<l:gentext key="editedby" text="editado por"/>
+<l:gentext key="in" text="en"/>
+<l:gentext key="lastlistcomma" text=","/>
+<l:gentext key="listcomma" text=","/>
+<l:gentext key="notes" text="notas"/>
+<l:gentext key="Notes" text="Notas"/>
+<l:gentext key="Pgs" text="Págs."/>
+<l:gentext key="pgs" text="págs."/>
+<l:gentext key="Revisedby" text="Revisado por: "/>
+<l:gentext key="revisedby" text="revisado por: "/>
+<l:gentext key="TableNotes" text="Notas de tabla"/>
+<l:gentext key="tablenotes" text="notas de tabla"/>
+<l:gentext key="TableofContents" text="Tabla de contenidos"/>
+<l:gentext key="tableofcontents" text="tabla de contenidos"/>
+<l:gentext key="unexpectedelementname" text="nombre de elemento inesperado"/>
+<l:gentext key="unsupported" text="no soportado"/>
+<l:gentext key="xrefto" text="referencia a"/>
+<l:gentext key="Authors" text="Autores"/>
+<l:gentext key="copyeditor" text="Editor de copiado"/>
+<l:gentext key="graphicdesigner" text="Diseñador gráfico"/>
+<l:gentext key="productioneditor" text="Editor de producción"/>
+<l:gentext key="technicaleditor" text="Editor técnico"/>
+<l:gentext key="translator" text="Traductor"/>
+<l:gentext key="listofequations" text="lista de ecuaciones"/>
+<l:gentext key="ListofEquations" text="Lista de ecuaciones"/>
+<l:gentext key="ListofExamples" text="Lista de ejemplos"/>
+<l:gentext key="listofexamples" text="lista de ejemplos"/>
+<l:gentext key="ListofFigures" text="Lista de figuras"/>
+<l:gentext key="listoffigures" text="lista de figuras"/>
+<l:gentext key="ListofProcedures" text="Lista de procedimientos"/>
+<l:gentext key="listofprocedures" text="lista de procedimientos"/>
+<l:gentext key="listoftables" text="lista de tablas"/>
+<l:gentext key="ListofTables" text="Lista de tablas"/>
+<l:gentext key="ListofUnknown" text="Lista de desconocido"/>
+<l:gentext key="listofunknown" text="lista de desconocido"/>
+<l:gentext key="nav-home" text="Inicio"/>
+<l:gentext key="nav-next" text="Siguiente"/>
+<l:gentext key="nav-next-sibling" text="Avanzar"/>
+<l:gentext key="nav-prev" text="Anterior"/>
+<l:gentext key="nav-prev-sibling" text="Retroceder"/>
+<l:gentext key="nav-up" text="Subir"/>
+<l:gentext key="nav-toc" text="TdC"/>
+<l:gentext key="Draft" text="Borrador"/>
+<l:gentext key="above" text="arriba"/>
+<l:gentext key="below" text="abajo"/>
+<l:gentext key="sectioncalled" text="sección llamada"/>
+<l:gentext key="index symbols" text="Símbolos"/>
+<l:gentext key="writing-mode" text="lr-tb"/>
+<l:gentext key="lowercase.alpha" text="abcdefghijklmnopqrstuvwxyzáéíóúñ"/>
+<l:gentext key="uppercase.alpha" text="ABCDEFGHIJKLMNOPQRSTUVWXYZÃÉÃÓÚÑ"/>
+<l:gentext key="normalize.sort.input" text="AaÀàÃáÂâÃãÄäÅåĀÄĂ㥹ÇǎǞǟǠǡǺǻȀÈȂȃȦȧḀá¸áºšáº áº¡áº¢áº£áº¤áº¥áº¦áº§áº¨áº©áºªáº«áº¬áº­áº®áº¯áº°áº±áº²áº³áº´áºµáº¶áº·BbÆ€ÆɓƂƃḂḃḄḅḆḇCcÇçĆćĈĉĊċČÄƇƈɕḈḉDdÄŽÄÄđƊɗƋƌDžDzȡɖḊḋḌá¸á¸Žá¸á¸á¸‘ḒḓEeÈèÉéÊêËëĒēĔĕĖėĘęĚěȄȅȆȇȨȩḔḕḖḗḘḙḚḛḜá¸áº¸áº¹áººáº»áº¼áº½áº¾áº¿á»€á»á»‚ểỄễỆệFfƑƒḞḟGgÄœÄĞğĠġĢģƓɠǤǥǦǧǴǵḠḡHhĤĥĦħȞȟɦḢḣḤḥḦḧḨḩḪḫẖIiÌìÃíÎîÃïĨĩĪīĬĭĮįİƗɨÇÇȈȉȊȋḬḭḮḯỈỉỊịJjĴĵǰÊKkĶķƘƙǨǩḰḱḲḳḴḵLlĹĺĻļĽľĿŀÅłƚLjȴɫɬɭḶḷḸḹḺḻḼḽMmɱḾḿṀá¹á¹‚ṃNnÑñŃńŅņŇňÆɲƞȠNjǸǹȵɳṄṅṆṇṈṉṊṋOoÒòÓóÔôÕõÖöØøŌÅÅŽÅÅőƟƠơǑǒǪǫǬǭǾǿȌÈÈŽÈȪȫȬȭȮȯȰȱṌá¹á¹Žá¹á¹á¹‘ṒṓỌá»á»Žá»á»á»‘ỒồỔổỖỗỘộỚớỜá»á»žá»Ÿá» á»¡á»¢á»£PpƤƥṔṕṖṗQqÊ RrŔŕŖŗŘřÈȑȒȓɼɽɾṘṙṚṛṜá¹á¹žá¹ŸSsŚśŜÅŞşŠšȘșʂṠṡṢṣṤṥṦṧṨṩTtŢţŤťŦŧƫƬƭƮʈȚțȶṪṫṬṭṮṯṰṱẗUuÙùÚúÛûÜüŨũŪūŬŭŮůŰűŲųƯưǓǔǕǖǗǘǙǚǛǜȔȕȖȗṲṳṴṵṶṷṸṹṺṻỤụỦủỨứỪừỬửỮữỰựVvƲʋṼṽṾṿWwŴŵẀáºáº‚ẃẄẅẆẇẈẉẘXxẊẋẌáºYyÃýÿŸŶŷƳƴȲȳẎáºáº™á»²á»³á»´á»µá»¶á»·á»¸á»¹ZzŹźŻżŽžƵƶȤȥÊÊ‘áºáº‘ẒẓẔẕẕ" lang="en"/>
+<l:gentext key="normalize.sort.output" text="AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBCCCCCCCCCCCCCCCCCDDDDDDDDDDDDDDDDDDDDDDDDEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEFFFFFFGGGGGGGGGGGGGGGGGGGGHHHHHHHHHHHHHHHHHHHHIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIJJJJJJKKKKKKKKKKKKKKLLLLLLLLLLLLLLLLLLLLLLLLLLMMMMMMMMMNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOPPPPPPPPQQQRRRRRRRRRRRRRRRRRRRRRRRSSSSSSSSSSSSSSSSSSSSSSSTTTTTTTTTTTTTTTTTTTTTTTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUVVVVVVVVWWWWWWWWWWWWWWWXXXXXXYYYYYYYYYYYYYYYYYYYYYYYZZZZZZZZZZZZZZZZZZZZZ" lang="en"/>
+<l:dingbat key="startquote" text="“"/>
+<l:dingbat key="endquote" text="â€"/>
+<l:dingbat key="nestedstartquote" text="‘"/>
+<l:dingbat key="nestedendquote" text="’"/>
+<l:dingbat key="singlestartquote" text="‘" lang="en"/>
+<l:dingbat key="singleendquote" text="’" lang="en"/>
+<l:dingbat key="bullet" text="•"/>
+<l:gentext key="hyphenation-character" text="-" lang="en"/>
+<l:gentext key="hyphenation-push-character-count" text="2" lang="en"/>
+<l:gentext key="hyphenation-remain-character-count" text="2" lang="en"/>
+<l:context name="styles"><l:template name="person-name" text="first-last"/>
+</l:context>
+<l:context name="title"><l:template name="abstract" text="%t"/>
+<l:template name="acknowledgements" text="%t" lang="en"/>
+<l:template name="answer" text="%t"/>
+<l:template name="appendix" text="Apéndice %n. %t"/>
+<l:template name="article" text="%t"/>
+<l:template name="authorblurb" text="%t"/>
+<l:template name="bibliodiv" text="%t"/>
+<l:template name="biblioentry" text="%t"/>
+<l:template name="bibliography" text="%t"/>
+<l:template name="bibliolist" text="%t" lang="en"/>
+<l:template name="bibliomixed" text="%t"/>
+<l:template name="bibliomset" text="%t"/>
+<l:template name="biblioset" text="%t"/>
+<l:template name="blockquote" text="%t"/>
+<l:template name="book" text="%t"/>
+<l:template name="calloutlist" text="%t"/>
+<l:template name="caution" text="%t"/>
+<l:template name="chapter" text="Capítulo %n. %t"/>
+<l:template name="colophon" text="%t"/>
+<l:template name="dedication" text="%t"/>
+<l:template name="equation" text="Ecuación %n. %t"/>
+<l:template name="example" text="Ejemplo %n. %t"/>
+<l:template name="figure" text="Figura %n. %t"/>
+<l:template name="foil" text="%t" lang="en"/>
+<l:template name="foilgroup" text="%t" lang="en"/>
+<l:template name="formalpara" text="%t"/>
+<l:template name="glossary" text="%t"/>
+<l:template name="glossdiv" text="%t"/>
+<l:template name="glosslist" text="%t" lang="en"/>
+<l:template name="glossentry" text="%t" lang="en"/>
+<l:template name="important" text="%t"/>
+<l:template name="index" text="%t"/>
+<l:template name="indexdiv" text="%t"/>
+<l:template name="itemizedlist" text="%t"/>
+<l:template name="legalnotice" text="%t"/>
+<l:template name="listitem" text=""/>
+<l:template name="lot" text="%t"/>
+<l:template name="msg" text="%t"/>
+<l:template name="msgexplan" text="%t"/>
+<l:template name="msgmain" text="%t"/>
+<l:template name="msgrel" text="%t"/>
+<l:template name="msgset" text="%t"/>
+<l:template name="msgsub" text="%t"/>
+<l:template name="note" text="%t"/>
+<l:template name="orderedlist" text="%t"/>
+<l:template name="part" text="Parte %n. %t"/>
+<l:template name="partintro" text="%t"/>
+<l:template name="preface" text="%t"/>
+<l:template name="procedure" text="%t"/>
+<l:template name="procedure.formal" text="Procedimiento %n. %t"/>
+<l:template name="productionset" text="%t"/>
+<l:template name="productionset.formal" text="Producción %n"/>
+<l:template name="qandadiv" text="%t"/>
+<l:template name="qandaentry" text="%t"/>
+<l:template name="qandaset" text="%t"/>
+<l:template name="question" text="%t"/>
+<l:template name="refentry" text="%t"/>
+<l:template name="reference" text="%t"/>
+<l:template name="refsection" text="%t"/>
+<l:template name="refsect1" text="%t"/>
+<l:template name="refsect2" text="%t"/>
+<l:template name="refsect3" text="%t"/>
+<l:template name="refsynopsisdiv" text="%t"/>
+<l:template name="refsynopsisdivinfo" text="%t"/>
+<l:template name="segmentedlist" text="%t"/>
+<l:template name="set" text="%t"/>
+<l:template name="setindex" text="%t"/>
+<l:template name="sidebar" text="%t"/>
+<l:template name="step" text="%t"/>
+<l:template name="table" text="Tabla %n. %t"/>
+<l:template name="task" text="%t" lang="en"/>
+<l:template name="tasksummary" text="%t" lang="en"/>
+<l:template name="taskprerequisites" text="%t" lang="en"/>
+<l:template name="taskrelated" text="%t" lang="en"/>
+<l:template name="tip" text="%t"/>
+<l:template name="toc" text="%t"/>
+<l:template name="variablelist" text="%t"/>
+<l:template name="varlistentry" text="" lang="en"/>
+<l:template name="warning" text="%t"/>
+</l:context>
+<l:context name="title-unnumbered"><l:template name="appendix" text="%t"/>
+<l:template name="article/appendix" text="%t" lang="en"/>
+<l:template name="bridgehead" text="%t"/>
+<l:template name="chapter" text="%t"/>
+<l:template name="sect1" text="%t"/>
+<l:template name="sect2" text="%t"/>
+<l:template name="sect3" text="%t"/>
+<l:template name="sect4" text="%t"/>
+<l:template name="sect5" text="%t"/>
+<l:template name="section" text="%t"/>
+<l:template name="simplesect" text="%t"/>
+<l:template name="part" text="%t" lang="en"/>
+</l:context>
+<l:context name="title-numbered"><l:template name="appendix" text="Apéndice %n. %t"/>
+<l:template name="article/appendix" text="%n. %t" lang="en"/>
+<l:template name="bridgehead" text="%n. %t"/>
+<l:template name="chapter" text="Capítulo %n. %t"/>
+<l:template name="part" text="Parte %n. %t"/>
+<l:template name="sect1" text="%n. %t"/>
+<l:template name="sect2" text="%n. %t"/>
+<l:template name="sect3" text="%n. %t"/>
+<l:template name="sect4" text="%n. %t"/>
+<l:template name="sect5" text="%n. %t"/>
+<l:template name="section" text="%n. %t"/>
+<l:template name="simplesect" text="%t"/>
+</l:context>
+<l:context name="subtitle"><l:template name="appendix" text="%s"/>
+<l:template name="acknowledgements" text="%s" lang="en"/>
+<l:template name="article" text="%s"/>
+<l:template name="bibliodiv" text="%s"/>
+<l:template name="biblioentry" text="%s"/>
+<l:template name="bibliography" text="%s"/>
+<l:template name="bibliomixed" text="%s"/>
+<l:template name="bibliomset" text="%s"/>
+<l:template name="biblioset" text="%s"/>
+<l:template name="book" text="%s"/>
+<l:template name="chapter" text="%s"/>
+<l:template name="colophon" text="%s"/>
+<l:template name="dedication" text="%s"/>
+<l:template name="glossary" text="%s"/>
+<l:template name="glossdiv" text="%s"/>
+<l:template name="index" text="%s"/>
+<l:template name="indexdiv" text="%s"/>
+<l:template name="lot" text="%s"/>
+<l:template name="part" text="%s"/>
+<l:template name="partintro" text="%s"/>
+<l:template name="preface" text="%s"/>
+<l:template name="refentry" text="%s"/>
+<l:template name="reference" text="%s"/>
+<l:template name="refsection" text="%s"/>
+<l:template name="refsect1" text="%s"/>
+<l:template name="refsect2" text="%s"/>
+<l:template name="refsect3" text="%s"/>
+<l:template name="refsynopsisdiv" text="%s"/>
+<l:template name="sect1" text="%s"/>
+<l:template name="sect2" text="%s"/>
+<l:template name="sect3" text="%s"/>
+<l:template name="sect4" text="%s"/>
+<l:template name="sect5" text="%s"/>
+<l:template name="section" text="%s"/>
+<l:template name="set" text="%s"/>
+<l:template name="setindex" text="%s"/>
+<l:template name="sidebar" text="%s"/>
+<l:template name="simplesect" text="%s"/>
+<l:template name="toc" text="%s"/>
+</l:context>
+<l:context name="xref"><l:template name="abstract" text="%t"/>
+<l:template name="acknowledgements" text="%t" lang="en"/>
+<l:template name="answer" text="R: %n"/>
+<l:template name="appendix" text="%t"/>
+<l:template name="article" text="%t"/>
+<l:template name="authorblurb" text="%t"/>
+<l:template name="bibliodiv" text="%t"/>
+<l:template name="bibliography" text="%t"/>
+<l:template name="bibliomset" text="%t"/>
+<l:template name="biblioset" text="%t"/>
+<l:template name="blockquote" text="%t"/>
+<l:template name="book" text="%t"/>
+<l:template name="calloutlist" text="%t"/>
+<l:template name="caution" text="%t"/>
+<l:template name="chapter" text="%t"/>
+<l:template name="colophon" text="%t"/>
+<l:template name="constraintdef" text="%t"/>
+<l:template name="dedication" text="%t"/>
+<l:template name="equation" text="%t"/>
+<l:template name="example" text="%t"/>
+<l:template name="figure" text="%t"/>
+<l:template name="foil" text="%t" lang="en"/>
+<l:template name="foilgroup" text="%t" lang="en"/>
+<l:template name="formalpara" text="%t"/>
+<l:template name="glossary" text="%t"/>
+<l:template name="glossdiv" text="%t"/>
+<l:template name="important" text="%t"/>
+<l:template name="index" text="%t"/>
+<l:template name="indexdiv" text="%t"/>
+<l:template name="itemizedlist" text="%t"/>
+<l:template name="legalnotice" text="%t"/>
+<l:template name="listitem" text="%n"/>
+<l:template name="lot" text="%t"/>
+<l:template name="msg" text="%t"/>
+<l:template name="msgexplan" text="%t"/>
+<l:template name="msgmain" text="%t"/>
+<l:template name="msgrel" text="%t"/>
+<l:template name="msgset" text="%t"/>
+<l:template name="msgsub" text="%t"/>
+<l:template name="note" text="%t"/>
+<l:template name="orderedlist" text="%t"/>
+<l:template name="part" text="%t"/>
+<l:template name="partintro" text="%t"/>
+<l:template name="preface" text="%t"/>
+<l:template name="procedure" text="%t"/>
+<l:template name="productionset" text="%t"/>
+<l:template name="qandadiv" text="%t"/>
+<l:template name="qandaentry" text="P: %n"/>
+<l:template name="qandaset" text="%t"/>
+<l:template name="question" text="P: %n"/>
+<l:template name="reference" text="%t"/>
+<l:template name="refsynopsisdiv" text="%t"/>
+<l:template name="segmentedlist" text="%t"/>
+<l:template name="set" text="%t"/>
+<l:template name="setindex" text="%t"/>
+<l:template name="sidebar" text="%t"/>
+<l:template name="table" text="%t"/>
+<l:template name="task" text="%t" lang="en"/>
+<l:template name="tip" text="%t"/>
+<l:template name="toc" text="%t"/>
+<l:template name="variablelist" text="%t"/>
+<l:template name="varlistentry" text="%n"/>
+<l:template name="warning" text="%t"/>
+<l:template name="olink.document.citation" text=" in %o" lang="en"/>
+<l:template name="olink.page.citation" text=" (page %p)" lang="en"/>
+<l:template name="page.citation" text=" [%p]"/>
+<l:template name="page" text="(page %p)" lang="en"/>
+<l:template name="docname" text=" in %o" lang="en"/>
+<l:template name="docnamelong" text=" in the document titled %o" lang="en"/>
+<l:template name="pageabbrev" text="(p. %p)" lang="en"/>
+<l:template name="Page" text="Page %p" lang="en"/>
+<l:template name="bridgehead" text="“%tâ€"/>
+<l:template name="refsection" text="“%tâ€"/>
+<l:template name="refsect1" text="“%tâ€"/>
+<l:template name="refsect2" text="“%tâ€"/>
+<l:template name="refsect3" text="“%tâ€"/>
+<l:template name="sect1" text="“%tâ€"/>
+<l:template name="sect2" text="“%tâ€"/>
+<l:template name="sect3" text="“%tâ€"/>
+<l:template name="sect4" text="“%tâ€"/>
+<l:template name="sect5" text="“%tâ€"/>
+<l:template name="section" text="“%tâ€"/>
+<l:template name="simplesect" text="“%tâ€"/>
+</l:context>
+<l:context name="xref-number"><l:template name="answer" text="R: %n"/>
+<l:template name="appendix" text="Apéndice %n"/>
+<l:template name="bridgehead" text="Sección %n"/>
+<l:template name="chapter" text="Capítulo %n"/>
+<l:template name="equation" text="Ecuación %n"/>
+<l:template name="example" text="Ejemplo %n"/>
+<l:template name="figure" text="Figura %n"/>
+<l:template name="part" text="Parte %n"/>
+<l:template name="procedure" text="Procedimiento %n"/>
+<l:template name="productionset" text="Producción %n"/>
+<l:template name="qandadiv" text="P y R %n"/>
+<l:template name="qandaentry" text="P: %n"/>
+<l:template name="question" text="P: %n"/>
+<l:template name="sect1" text="Sección %n"/>
+<l:template name="sect2" text="Sección %n"/>
+<l:template name="sect3" text="Sección %n"/>
+<l:template name="sect4" text="Sección %n"/>
+<l:template name="sect5" text="Sección %n"/>
+<l:template name="section" text="Sección %n"/>
+<l:template name="table" text="Tabla %n"/>
+</l:context>
+<l:context name="xref-number-and-title"><l:template name="appendix" text="Apéndice %n, %t"/>
+<l:template name="bridgehead" text="Sección %n, “%tâ€"/>
+<l:template name="chapter" text="Capítulo %n, %t"/>
+<l:template name="equation" text="Ecuación %n, “%tâ€"/>
+<l:template name="example" text="Ejemplo %n, “%tâ€"/>
+<l:template name="figure" text="Figura %n, “%tâ€"/>
+<l:template name="part" text="Parte %n, “%tâ€"/>
+<l:template name="procedure" text="Procedimiento %n, “%tâ€"/>
+<l:template name="productionset" text="Producción %n, “%tâ€"/>
+<l:template name="qandadiv" text="P y R %n, “%tâ€"/>
+<l:template name="refsect1" text="sección llamada “%tâ€"/>
+<l:template name="refsect2" text="sección llamada “%tâ€"/>
+<l:template name="refsect3" text="sección llamada “%tâ€"/>
+<l:template name="refsection" text="sección llamada “%tâ€"/>
+<l:template name="sect1" text="Sección %n, “%tâ€"/>
+<l:template name="sect2" text="Sección %n, “%tâ€"/>
+<l:template name="sect3" text="Sección %n, “%tâ€"/>
+<l:template name="sect4" text="Sección %n, “%tâ€"/>
+<l:template name="sect5" text="Sección %n, “%tâ€"/>
+<l:template name="section" text="Sección %n, “%tâ€"/>
+<l:template name="simplesect" text="sección llamada “%tâ€"/>
+<l:template name="table" text="Tabla %n, “%tâ€"/>
+</l:context>
+<l:context name="authorgroup"><l:template name="sep" text=", "/>
+<l:template name="sep2" text=" y "/>
+<l:template name="seplast" text=", y "/>
+</l:context>
+<l:context name="glossary"><l:template name="see" text="Ver %t."/>
+<l:template name="seealso" text="Ver también %t."/>
+<l:template name="seealso-separator" text=", "/>
+</l:context>
+<l:context name="msgset"><l:template name="MsgAud" text="Audiencia: "/>
+<l:template name="MsgLevel" text="Nivel: "/>
+<l:template name="MsgOrig" text="Origen: "/>
+</l:context>
+<l:context name="datetime"><l:template name="format" text="d/m/Y"/>
+</l:context>
+<l:context name="termdef"><l:template name="prefix" text="[Definición: "/>
+<l:template name="suffix" text="]"/>
+</l:context>
+<l:context name="datetime-full"><l:template name="January" text="Enero"/>
+<l:template name="February" text="Febrero"/>
+<l:template name="March" text="Marzo"/>
+<l:template name="April" text="Abril"/>
+<l:template name="May" text="Mayo"/>
+<l:template name="June" text="Junio"/>
+<l:template name="July" text="Julio"/>
+<l:template name="August" text="Agosto"/>
+<l:template name="September" text="Septiembre"/>
+<l:template name="October" text="Octubre"/>
+<l:template name="November" text="Noviembre"/>
+<l:template name="December" text="Diciembre"/>
+<l:template name="Monday" text="Lunes"/>
+<l:template name="Tuesday" text="Martes"/>
+<l:template name="Wednesday" text="Miércoles"/>
+<l:template name="Thursday" text="Jueves"/>
+<l:template name="Friday" text="Viernes"/>
+<l:template name="Saturday" text="Sábado"/>
+<l:template name="Sunday" text="Domingo"/>
+</l:context>
+<l:context name="datetime-abbrev"><l:template name="Jan" text="Ene"/>
+<l:template name="Feb" text="Feb"/>
+<l:template name="Mar" text="Mar"/>
+<l:template name="Apr" text="Apr" lang="en"/>
+<l:template name="May" text="May"/>
+<l:template name="Jun" text="Jun"/>
+<l:template name="Jul" text="Jul"/>
+<l:template name="Aug" text="Ago"/>
+<l:template name="Sep" text="Sep"/>
+<l:template name="Oct" text="Oct"/>
+<l:template name="Nov" text="Nov"/>
+<l:template name="Dec" text="Dic"/>
+<l:template name="Mon" text="Lun"/>
+<l:template name="Tue" text="Mar"/>
+<l:template name="Wed" text="Mie"/>
+<l:template name="Thu" text="Jue"/>
+<l:template name="Fri" text="Vie"/>
+<l:template name="Sat" text="Sab"/>
+<l:template name="Sun" text="Dom"/>
+</l:context>
+<l:context name="htmlhelp"><l:template name="langcode" text="0x040a Spanish (Traditional Sort)"/>
+</l:context>
+<l:context name="index"><l:template name="term-separator" text=", " lang="en"/>
+<l:template name="number-separator" text=", " lang="en"/>
+<l:template name="range-separator" text="-" lang="en"/>
+</l:context>
+<l:context name="iso690"><l:template name="lastfirst.sep" text=", " lang="en"/>
+<l:template name="alt.person.two.sep" text=" – " lang="en"/>
+<l:template name="alt.person.last.sep" text=" – " lang="en"/>
+<l:template name="alt.person.more.sep" text=" – " lang="en"/>
+<l:template name="primary.editor" text=" (ed.)" lang="en"/>
+<l:template name="primary.many" text=", et al." lang="en"/>
+<l:template name="primary.sep" text=". " lang="en"/>
+<l:template name="submaintitle.sep" text=": " lang="en"/>
+<l:template name="title.sep" text=". " lang="en"/>
+<l:template name="othertitle.sep" text=", " lang="en"/>
+<l:template name="medium1" text=" [" lang="en"/>
+<l:template name="medium2" text="]" lang="en"/>
+<l:template name="secondary.person.sep" text="; " lang="en"/>
+<l:template name="secondary.sep" text=". " lang="en"/>
+<l:template name="respons.sep" text=". " lang="en"/>
+<l:template name="edition.sep" text=". " lang="en"/>
+<l:template name="edition.serial.sep" text=", " lang="en"/>
+<l:template name="issuing.range" text="-" lang="en"/>
+<l:template name="issuing.div" text=", " lang="en"/>
+<l:template name="issuing.sep" text=". " lang="en"/>
+<l:template name="partnr.sep" text=". " lang="en"/>
+<l:template name="placepubl.sep" text=": " lang="en"/>
+<l:template name="publyear.sep" text=", " lang="en"/>
+<l:template name="pubinfo.sep" text=". " lang="en"/>
+<l:template name="spec.pubinfo.sep" text=", " lang="en"/>
+<l:template name="upd.sep" text=", " lang="en"/>
+<l:template name="datecit1" text=" [cited " lang="en"/>
+<l:template name="datecit2" text="]" lang="en"/>
+<l:template name="extent.sep" text=". " lang="en"/>
+<l:template name="locs.sep" text=", " lang="en"/>
+<l:template name="location.sep" text=". " lang="en"/>
+<l:template name="serie.sep" text=". " lang="en"/>
+<l:template name="notice.sep" text=". " lang="en"/>
+<l:template name="access" text="Available " lang="en"/>
+<l:template name="acctoo" text="Also available " lang="en"/>
+<l:template name="onwww" text="from World Wide Web" lang="en"/>
+<l:template name="oninet" text="from Internet" lang="en"/>
+<l:template name="access.end" text=": " lang="en"/>
+<l:template name="link1" text="&lt;" lang="en"/>
+<l:template name="link2" text="&gt;" lang="en"/>
+<l:template name="access.sep" text=". " lang="en"/>
+<l:template name="isbn" text="ISBN " lang="en"/>
+<l:template name="issn" text="ISSN " lang="en"/>
+<l:template name="stdnum.sep" text=". " lang="en"/>
+<l:template name="patcountry.sep" text=". " lang="en"/>
+<l:template name="pattype.sep" text=", " lang="en"/>
+<l:template name="patnum.sep" text=". " lang="en"/>
+<l:template name="patdate.sep" text=". " lang="en"/>
+</l:context><l:letters><l:l i="-1"/>
+<l:l i="0">Símbolos</l:l>
+<l:l i="1">A</l:l>
+<l:l i="1">a</l:l>
+<l:l i="1">á</l:l>
+<l:l i="1">Ã</l:l>
+<l:l i="2">B</l:l>
+<l:l i="2">b</l:l>
+<l:l i="3">C</l:l>
+<l:l i="3">c</l:l>
+<l:l i="4">CH</l:l>
+<l:l i="4">ch</l:l>
+<l:l i="5">D</l:l>
+<l:l i="5">d</l:l>
+<l:l i="6">E</l:l>
+<l:l i="6">e</l:l>
+<l:l i="6">É</l:l>
+<l:l i="6">é</l:l>
+<l:l i="7">F</l:l>
+<l:l i="7">f</l:l>
+<l:l i="8">G</l:l>
+<l:l i="8">g</l:l>
+<l:l i="9">H</l:l>
+<l:l i="9">h</l:l>
+<l:l i="10">I</l:l>
+<l:l i="10">i</l:l>
+<l:l i="10">Ã</l:l>
+<l:l i="10">í</l:l>
+<l:l i="11">J</l:l>
+<l:l i="11">j</l:l>
+<l:l i="12">K</l:l>
+<l:l i="12">k</l:l>
+<l:l i="13">L</l:l>
+<l:l i="13">l</l:l>
+<l:l i="14">LL</l:l>
+<l:l i="14">ll</l:l>
+<l:l i="15">M</l:l>
+<l:l i="15">m</l:l>
+<l:l i="16">N</l:l>
+<l:l i="16">n</l:l>
+<l:l i="17">Ñ</l:l>
+<l:l i="17">ñ</l:l>
+<l:l i="18">O</l:l>
+<l:l i="18">o</l:l>
+<l:l i="18">Ó</l:l>
+<l:l i="18">ó</l:l>
+<l:l i="19">P</l:l>
+<l:l i="19">p</l:l>
+<l:l i="20">Q</l:l>
+<l:l i="20">q</l:l>
+<l:l i="21">R</l:l>
+<l:l i="21">r</l:l>
+<l:l i="22">S</l:l>
+<l:l i="22">s</l:l>
+<l:l i="23">T</l:l>
+<l:l i="23">t</l:l>
+<l:l i="24">U</l:l>
+<l:l i="24">u</l:l>
+<l:l i="24">Ú</l:l>
+<l:l i="24">ú</l:l>
+<l:l i="25">V</l:l>
+<l:l i="25">v</l:l>
+<l:l i="26">W</l:l>
+<l:l i="26">w</l:l>
+<l:l i="27">X</l:l>
+<l:l i="27">x</l:l>
+<l:l i="28">Y</l:l>
+<l:l i="28">y</l:l>
+<l:l i="29">Z</l:l>
+<l:l i="29">z</l:l>
+</l:letters>
+</l:l10n>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/et.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/et.xml
new file mode 100644
index 0000000..b7d224f
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/et.xml
@@ -0,0 +1,1229 @@
+<?xml version="1.0" encoding="utf-8"?>
+<l:l10n xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0" language="et" english-language-name="Estonian">
+
+<!-- * This file is generated automatically. -->
+<!-- * To submit changes to this file upstream (to the DocBook Project) -->
+<!-- * do not submit an edited version of this file. Instead, submit an -->
+<!-- * edited version of the source file at the following location: -->
+<!-- * -->
+<!-- * https://docbook.svn.sourceforge.net/svnroot/docbook/trunk/gentext/locale/et.xml -->
+<!-- * -->
+<!-- * E-mail the edited et.xml source file to: -->
+<!-- * -->
+<!-- * docbook-developers@lists.sourceforge.net -->
+
+<!-- ******************************************************************** -->
+
+<!-- This file is part of the XSL DocBook Stylesheet distribution. -->
+<!-- See ../README or http://docbook.sf.net/release/xsl/current/ for -->
+<!-- copyright and other information. -->
+
+<!-- ******************************************************************** -->
+<!-- In these files, % with a letter is used for a placeholder: -->
+<!-- %t is the current element's title -->
+<!-- %s is the current element's subtitle (if applicable)-->
+<!-- %n is the current element's number label-->
+<!-- %p is the current element's page number (if applicable)-->
+<!-- ******************************************************************** -->
+
+
+<l:gentext key="Abstract" text="Ãœlevaade"/>
+<l:gentext key="abstract" text="Ãœlevaade"/>
+<l:gentext key="Acknowledgements" text="Acknowledgements" lang="en"/>
+<l:gentext key="acknowledgements" text="Acknowledgements" lang="en"/>
+<l:gentext key="Answer" text="V:"/>
+<l:gentext key="answer" text="V:"/>
+<l:gentext key="Appendix" text="Lisa"/>
+<l:gentext key="appendix" text="lisa"/>
+<l:gentext key="Article" text="Artikkel"/>
+<l:gentext key="article" text="Artikkel"/>
+<l:gentext key="Author" text="Author" lang="en"/>
+<l:gentext key="Bibliography" text="Bibliograafia"/>
+<l:gentext key="bibliography" text="Bibliograafia"/>
+<l:gentext key="Book" text="Raamat"/>
+<l:gentext key="book" text="Raamat"/>
+<l:gentext key="CAUTION" text="ETTEVAATUST"/>
+<l:gentext key="Caution" text="Ettevaatust"/>
+<l:gentext key="caution" text="Ettevaatust"/>
+<l:gentext key="Chapter" text="Peatükk"/>
+<l:gentext key="chapter" text="peatükk"/>
+<l:gentext key="Colophon" text="Lõpumärgis"/>
+<l:gentext key="colophon" text="Lõpumärgis"/>
+<l:gentext key="Copyright" text="Autoriõigus"/>
+<l:gentext key="copyright" text="Autoriõigus"/>
+<l:gentext key="Dedication" text="Pühendus"/>
+<l:gentext key="dedication" text="Pühendus"/>
+<l:gentext key="Edition" text="Väljaanne"/>
+<l:gentext key="edition" text="Väljaanne"/>
+<l:gentext key="Editor" text="Editor" lang="en"/>
+<l:gentext key="Equation" text="Valem"/>
+<l:gentext key="equation" text="Valem"/>
+<l:gentext key="Example" text="Näide"/>
+<l:gentext key="example" text="Näide"/>
+<l:gentext key="Figure" text="Joonis"/>
+<l:gentext key="figure" text="Joonis"/>
+<l:gentext key="Glossary" text="Sõnastik"/>
+<l:gentext key="glossary" text="Sõnastik"/>
+<l:gentext key="GlossSee" text="Vt."/>
+<l:gentext key="glosssee" text="Vt."/>
+<l:gentext key="GlossSeeAlso" text="Vt. ka"/>
+<l:gentext key="glossseealso" text="Vt. ka"/>
+<l:gentext key="IMPORTANT" text="OLULINE"/>
+<l:gentext key="important" text="Oluline"/>
+<l:gentext key="Important" text="Oluline"/>
+<l:gentext key="Index" text="Aineregister"/>
+<l:gentext key="index" text="Aineregister"/>
+<l:gentext key="ISBN" text="ISBN"/>
+<l:gentext key="isbn" text="ISBN"/>
+<l:gentext key="LegalNotice" text="Autoriõiguse märge"/>
+<l:gentext key="legalnotice" text="Autoriõiguse märge"/>
+<l:gentext key="MsgAud" text="Auditoorium"/>
+<l:gentext key="msgaud" text="Auditoorium"/>
+<l:gentext key="MsgLevel" text="Tase"/>
+<l:gentext key="msglevel" text="Tase"/>
+<l:gentext key="MsgOrig" text="Algallikas"/>
+<l:gentext key="msgorig" text="Algallikas"/>
+<l:gentext key="NOTE" text="MÄRKUS"/>
+<l:gentext key="Note" text="Märkus"/>
+<l:gentext key="note" text="Märkus"/>
+<l:gentext key="Part" text="Osa"/>
+<l:gentext key="part" text="Osa"/>
+<l:gentext key="Preface" text="Eessõna"/>
+<l:gentext key="preface" text="Eessõna"/>
+<l:gentext key="Procedure" text="Protseduur"/>
+<l:gentext key="procedure" text="Protseduur"/>
+<l:gentext key="ProductionSet" text="Production"/>
+<l:gentext key="PubDate" text="Publication Date" lang="en"/>
+<l:gentext key="pubdate" text="Publication date" lang="en"/>
+<l:gentext key="Published" text="Avaldatud"/>
+<l:gentext key="published" text="Avaldatud"/>
+<l:gentext key="Publisher" text="Publisher" lang="en"/>
+<l:gentext key="Qandadiv" text="K ja V"/>
+<l:gentext key="qandadiv" text="K ja V"/>
+<l:gentext key="QandASet" text="Frequently Asked Questions" lang="en"/>
+<l:gentext key="Question" text="K:"/>
+<l:gentext key="question" text="K:"/>
+<l:gentext key="RefEntry" text=""/>
+<l:gentext key="refentry" text=""/>
+<l:gentext key="Reference" text="Viide"/>
+<l:gentext key="reference" text="Viide"/>
+<l:gentext key="References" text="References" lang="en"/>
+<l:gentext key="RefName" text="Nimi"/>
+<l:gentext key="refname" text="Nimi"/>
+<l:gentext key="RefSection" text="Lõik"/>
+<l:gentext key="refsection" text="Lõik"/>
+<l:gentext key="RefSynopsisDiv" text="Sünopsis"/>
+<l:gentext key="refsynopsisdiv" text="Sünopsis"/>
+<l:gentext key="RevHistory" text="Vigade paranduste ajalugu"/>
+<l:gentext key="revhistory" text="Vigade paranduste ajalugu"/>
+<l:gentext key="revision" text="Vigade parandus"/>
+<l:gentext key="Revision" text="Vigade parandus"/>
+<l:gentext key="sect1" text="Section"/>
+<l:gentext key="sect2" text="Section"/>
+<l:gentext key="sect3" text="Section"/>
+<l:gentext key="sect4" text="Section"/>
+<l:gentext key="sect5" text="Section"/>
+<l:gentext key="section" text="lõik"/>
+<l:gentext key="Section" text="Sektsioon"/>
+<l:gentext key="see" text="Vt."/>
+<l:gentext key="See" text="Vt."/>
+<l:gentext key="seealso" text="Vt. ka"/>
+<l:gentext key="Seealso" text="Vt. ka"/>
+<l:gentext key="SeeAlso" text="Vt. ka"/>
+<l:gentext key="set" text="Sea"/>
+<l:gentext key="Set" text="Sea"/>
+<l:gentext key="setindex" text="Sea indeks"/>
+<l:gentext key="SetIndex" text="Sea indeks"/>
+<l:gentext key="Sidebar" text=""/>
+<l:gentext key="sidebar" text="külgriba"/>
+<l:gentext key="step" text="samm"/>
+<l:gentext key="Step" text="Samm"/>
+<l:gentext key="table" text="Tabel"/>
+<l:gentext key="Table" text="Tabel"/>
+<l:gentext key="task" text="Task" lang="en"/>
+<l:gentext key="Task" text="Task" lang="en"/>
+<l:gentext key="tip" text="Vihje"/>
+<l:gentext key="TIP" text="VIHJE"/>
+<l:gentext key="Tip" text="Vihje"/>
+<l:gentext key="Warning" text="Hoiatus"/>
+<l:gentext key="warning" text="Hoiatus"/>
+<l:gentext key="WARNING" text="HOIATUS"/>
+<l:gentext key="and" text="ja"/>
+<l:gentext key="by" text=""/>
+<l:gentext key="Edited" text="Redaktsioon"/>
+<l:gentext key="edited" text="Redaktsioon"/>
+<l:gentext key="Editedby" text="Redaktsiooni autor(id)"/>
+<l:gentext key="editedby" text="Redaktsiooni autor(id)"/>
+<l:gentext key="in" text=""/>
+<l:gentext key="lastlistcomma" text=","/>
+<l:gentext key="listcomma" text=","/>
+<l:gentext key="notes" text="Märkused"/>
+<l:gentext key="Notes" text="Märkused"/>
+<l:gentext key="Pgs" text="Lk."/>
+<l:gentext key="pgs" text="Lk."/>
+<l:gentext key="Revisedby" text="Ãœle vaadanud: "/>
+<l:gentext key="revisedby" text="Ãœle vaadanud: "/>
+<l:gentext key="TableNotes" text="Märkused"/>
+<l:gentext key="tablenotes" text="Märkused"/>
+<l:gentext key="TableofContents" text="Sisukord"/>
+<l:gentext key="tableofcontents" text="Sisukord"/>
+<l:gentext key="unexpectedelementname" text="Ootamatu elemendi nimi"/>
+<l:gentext key="unsupported" text="toetuseta"/>
+<l:gentext key="xrefto" text="viide"/>
+<l:gentext key="Authors" text="Authors" lang="en"/>
+<l:gentext key="copyeditor" text="Copy Editor" lang="en"/>
+<l:gentext key="graphicdesigner" text="Graphic Designer" lang="en"/>
+<l:gentext key="productioneditor" text="Production Editor" lang="en"/>
+<l:gentext key="technicaleditor" text="Technical Editor" lang="en"/>
+<l:gentext key="translator" text="Translator" lang="en"/>
+<l:gentext key="listofequations" text="Valemite nimekiri"/>
+<l:gentext key="ListofEquations" text="Valemite nimekiri"/>
+<l:gentext key="ListofExamples" text="Näidete nimekiri"/>
+<l:gentext key="listofexamples" text="Näidete nimekiri"/>
+<l:gentext key="ListofFigures" text="Jooniste nimekiri"/>
+<l:gentext key="listoffigures" text="Jooniste nimekiri"/>
+<l:gentext key="ListofProcedures" text="List of Procedures" lang="en"/>
+<l:gentext key="listofprocedures" text="List of Procedures" lang="en"/>
+<l:gentext key="listoftables" text="Tabelite nimekiri"/>
+<l:gentext key="ListofTables" text="Tabelite nimekiri"/>
+<l:gentext key="ListofUnknown" text="Tundmatute nimekiri"/>
+<l:gentext key="listofunknown" text="Tundmatute nimekiri"/>
+<l:gentext key="nav-home" text="Koju"/>
+<l:gentext key="nav-next" text="Järgmine"/>
+<l:gentext key="nav-next-sibling" text="Kiiresti edasi"/>
+<l:gentext key="nav-prev" text="Eelmine"/>
+<l:gentext key="nav-prev-sibling" text="Kiiresti tagasi"/>
+<l:gentext key="nav-up" text="Ãœles"/>
+<l:gentext key="nav-toc" text="ToC" lang="en"/>
+<l:gentext key="Draft" text="Draft"/>
+<l:gentext key="above" text="above"/>
+<l:gentext key="below" text="below"/>
+<l:gentext key="sectioncalled" text="the section called"/>
+<l:gentext key="index symbols" text="Symbols"/>
+<l:gentext key="writing-mode" text="lr-tb"/>
+<l:gentext key="lowercase.alpha" text="abcdefghijklmnopqrstuvwxyz"/>
+<l:gentext key="uppercase.alpha" text="ABCDEFGHIJKLMNOPQRSTUVWXYZ"/>
+<l:gentext key="normalize.sort.input" text="AaÀàÃáÂâÃãÄäÅåĀÄĂ㥹ÇǎǞǟǠǡǺǻȀÈȂȃȦȧḀá¸áºšáº áº¡áº¢áº£áº¤áº¥áº¦áº§áº¨áº©áºªáº«áº¬áº­áº®áº¯áº°áº±áº²áº³áº´áºµáº¶áº·BbÆ€ÆɓƂƃḂḃḄḅḆḇCcÇçĆćĈĉĊċČÄƇƈɕḈḉDdÄŽÄÄđƊɗƋƌDžDzȡɖḊḋḌá¸á¸Žá¸á¸á¸‘ḒḓEeÈèÉéÊêËëĒēĔĕĖėĘęĚěȄȅȆȇȨȩḔḕḖḗḘḙḚḛḜá¸áº¸áº¹áººáº»áº¼áº½áº¾áº¿á»€á»á»‚ểỄễỆệFfƑƒḞḟGgÄœÄĞğĠġĢģƓɠǤǥǦǧǴǵḠḡHhĤĥĦħȞȟɦḢḣḤḥḦḧḨḩḪḫẖIiÌìÃíÎîÃïĨĩĪīĬĭĮįİƗɨÇÇȈȉȊȋḬḭḮḯỈỉỊịJjĴĵǰÊKkĶķƘƙǨǩḰḱḲḳḴḵLlĹĺĻļĽľĿŀÅłƚLjȴɫɬɭḶḷḸḹḺḻḼḽMmɱḾḿṀá¹á¹‚ṃNnÑñŃńŅņŇňÆɲƞȠNjǸǹȵɳṄṅṆṇṈṉṊṋOoÒòÓóÔôÕõÖöØøŌÅÅŽÅÅőƟƠơǑǒǪǫǬǭǾǿȌÈÈŽÈȪȫȬȭȮȯȰȱṌá¹á¹Žá¹á¹á¹‘ṒṓỌá»á»Žá»á»á»‘ỒồỔổỖỗỘộỚớỜá»á»žá»Ÿá» á»¡á»¢á»£PpƤƥṔṕṖṗQqÊ RrŔŕŖŗŘřÈȑȒȓɼɽɾṘṙṚṛṜá¹á¹žá¹ŸSsŚśŜÅŞşŠšȘșʂṠṡṢṣṤṥṦṧṨṩTtŢţŤťŦŧƫƬƭƮʈȚțȶṪṫṬṭṮṯṰṱẗUuÙùÚúÛûÜüŨũŪūŬŭŮůŰűŲųƯưǓǔǕǖǗǘǙǚǛǜȔȕȖȗṲṳṴṵṶṷṸṹṺṻỤụỦủỨứỪừỬửỮữỰựVvƲʋṼṽṾṿWwŴŵẀáºáº‚ẃẄẅẆẇẈẉẘXxẊẋẌáºYyÃýÿŸŶŷƳƴȲȳẎáºáº™á»²á»³á»´á»µá»¶á»·á»¸á»¹ZzŹźŻżŽžƵƶȤȥÊÊ‘áºáº‘ẒẓẔẕẕ" lang="en"/>
+<l:gentext key="normalize.sort.output" text="AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBCCCCCCCCCCCCCCCCCDDDDDDDDDDDDDDDDDDDDDDDDEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEFFFFFFGGGGGGGGGGGGGGGGGGGGHHHHHHHHHHHHHHHHHHHHIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIJJJJJJKKKKKKKKKKKKKKLLLLLLLLLLLLLLLLLLLLLLLLLLMMMMMMMMMNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOPPPPPPPPQQQRRRRRRRRRRRRRRRRRRRRRRRSSSSSSSSSSSSSSSSSSSSSSSTTTTTTTTTTTTTTTTTTTTTTTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUVVVVVVVVWWWWWWWWWWWWWWWXXXXXXYYYYYYYYYYYYYYYYYYYYYYYZZZZZZZZZZZZZZZZZZZZZ" lang="en"/>
+<l:dingbat key="startquote" text="“"/>
+<l:dingbat key="endquote" text="â€"/>
+<l:dingbat key="nestedstartquote" text="‘"/>
+<l:dingbat key="nestedendquote" text="’"/>
+<l:dingbat key="singlestartquote" text="‘" lang="en"/>
+<l:dingbat key="singleendquote" text="’" lang="en"/>
+<l:dingbat key="bullet" text="•"/>
+<l:gentext key="hyphenation-character" text="-" lang="en"/>
+<l:gentext key="hyphenation-push-character-count" text="2" lang="en"/>
+<l:gentext key="hyphenation-remain-character-count" text="2" lang="en"/>
+<l:context name="styles"><l:template name="person-name" text="first-last"/>
+</l:context>
+<l:context name="title"><l:template name="abstract" text="%t"/>
+<l:template name="acknowledgements" text="%t" lang="en"/>
+<l:template name="answer" text="%t"/>
+<l:template name="appendix" text="Lisa %n. %t"/>
+<l:template name="article" text="%t"/>
+<l:template name="authorblurb" text="%t"/>
+<l:template name="bibliodiv" text="%t"/>
+<l:template name="biblioentry" text="%t"/>
+<l:template name="bibliography" text="%t"/>
+<l:template name="bibliolist" text="%t" lang="en"/>
+<l:template name="bibliomixed" text="%t"/>
+<l:template name="bibliomset" text="%t"/>
+<l:template name="biblioset" text="%t"/>
+<l:template name="blockquote" text="%t"/>
+<l:template name="book" text="%t"/>
+<l:template name="calloutlist" text="%t"/>
+<l:template name="caution" text="%t"/>
+<l:template name="chapter" text="Peatükk %n. %t"/>
+<l:template name="colophon" text="%t"/>
+<l:template name="dedication" text="%t"/>
+<l:template name="equation" text="Valem %n. %t"/>
+<l:template name="example" text="Näide %n. %t"/>
+<l:template name="figure" text="Joonis %n. %t"/>
+<l:template name="foil" text="%t" lang="en"/>
+<l:template name="foilgroup" text="%t" lang="en"/>
+<l:template name="formalpara" text="%t"/>
+<l:template name="glossary" text="%t"/>
+<l:template name="glossdiv" text="%t"/>
+<l:template name="glosslist" text="%t" lang="en"/>
+<l:template name="glossentry" text="%t" lang="en"/>
+<l:template name="important" text="%t"/>
+<l:template name="index" text="%t"/>
+<l:template name="indexdiv" text="%t"/>
+<l:template name="itemizedlist" text="%t"/>
+<l:template name="legalnotice" text="%t"/>
+<l:template name="listitem" text=""/>
+<l:template name="lot" text="%t"/>
+<l:template name="msg" text="%t"/>
+<l:template name="msgexplan" text="%t"/>
+<l:template name="msgmain" text="%t"/>
+<l:template name="msgrel" text="%t"/>
+<l:template name="msgset" text="%t"/>
+<l:template name="msgsub" text="%t"/>
+<l:template name="note" text="%t"/>
+<l:template name="orderedlist" text="%t"/>
+<l:template name="part" text="Osa %n. %t"/>
+<l:template name="partintro" text="%t"/>
+<l:template name="preface" text="%t"/>
+<l:template name="procedure" text="%t"/>
+<l:template name="procedure.formal" text="Protseduur %n. %t"/>
+<l:template name="productionset" text="%t"/>
+<l:template name="productionset.formal" text="Production %n"/>
+<l:template name="qandadiv" text="%t"/>
+<l:template name="qandaentry" text="%t"/>
+<l:template name="qandaset" text="%t"/>
+<l:template name="question" text="%t"/>
+<l:template name="refentry" text="%t"/>
+<l:template name="reference" text="%t"/>
+<l:template name="refsection" text="%t"/>
+<l:template name="refsect1" text="%t"/>
+<l:template name="refsect2" text="%t"/>
+<l:template name="refsect3" text="%t"/>
+<l:template name="refsynopsisdiv" text="%t"/>
+<l:template name="refsynopsisdivinfo" text="%t"/>
+<l:template name="segmentedlist" text="%t"/>
+<l:template name="set" text="%t"/>
+<l:template name="setindex" text="%t"/>
+<l:template name="sidebar" text="%t"/>
+<l:template name="step" text="%t"/>
+<l:template name="table" text="Tabel %n. %t"/>
+<l:template name="task" text="%t" lang="en"/>
+<l:template name="tasksummary" text="%t" lang="en"/>
+<l:template name="taskprerequisites" text="%t" lang="en"/>
+<l:template name="taskrelated" text="%t" lang="en"/>
+<l:template name="tip" text="%t"/>
+<l:template name="toc" text="%t"/>
+<l:template name="variablelist" text="%t"/>
+<l:template name="varlistentry" text="" lang="en"/>
+<l:template name="warning" text="%t"/>
+</l:context>
+<l:context name="title-unnumbered"><l:template name="appendix" text="%t"/>
+<l:template name="article/appendix" text="%t" lang="en"/>
+<l:template name="bridgehead" text="%t"/>
+<l:template name="chapter" text="%t"/>
+<l:template name="sect1" text="%t"/>
+<l:template name="sect2" text="%t"/>
+<l:template name="sect3" text="%t"/>
+<l:template name="sect4" text="%t"/>
+<l:template name="sect5" text="%t"/>
+<l:template name="section" text="%t"/>
+<l:template name="simplesect" text="%t"/>
+<l:template name="part" text="%t" lang="en"/>
+</l:context>
+<l:context name="title-numbered"><l:template name="appendix" text="Lisa %n. %t"/>
+<l:template name="article/appendix" text="%n. %t" lang="en"/>
+<l:template name="bridgehead" text="%n. %t"/>
+<l:template name="chapter" text="Peatükk %n. %t"/>
+<l:template name="part" text="Osa %n. %t"/>
+<l:template name="sect1" text="%n. %t"/>
+<l:template name="sect2" text="%n. %t"/>
+<l:template name="sect3" text="%n. %t"/>
+<l:template name="sect4" text="%n. %t"/>
+<l:template name="sect5" text="%n. %t"/>
+<l:template name="section" text="%n. %t"/>
+<l:template name="simplesect" text="%n. %t"/>
+</l:context>
+<l:context name="subtitle"><l:template name="appendix" text="%s"/>
+<l:template name="acknowledgements" text="%s" lang="en"/>
+<l:template name="article" text="%s"/>
+<l:template name="bibliodiv" text="%s"/>
+<l:template name="biblioentry" text="%s"/>
+<l:template name="bibliography" text="%s"/>
+<l:template name="bibliomixed" text="%s"/>
+<l:template name="bibliomset" text="%s"/>
+<l:template name="biblioset" text="%s"/>
+<l:template name="book" text="%s"/>
+<l:template name="chapter" text="%s"/>
+<l:template name="colophon" text="%s"/>
+<l:template name="dedication" text="%s"/>
+<l:template name="glossary" text="%s"/>
+<l:template name="glossdiv" text="%s"/>
+<l:template name="index" text="%s"/>
+<l:template name="indexdiv" text="%s"/>
+<l:template name="lot" text="%s"/>
+<l:template name="part" text="%s"/>
+<l:template name="partintro" text="%s"/>
+<l:template name="preface" text="%s"/>
+<l:template name="refentry" text="%s"/>
+<l:template name="reference" text="%s"/>
+<l:template name="refsection" text="%s"/>
+<l:template name="refsect1" text="%s"/>
+<l:template name="refsect2" text="%s"/>
+<l:template name="refsect3" text="%s"/>
+<l:template name="refsynopsisdiv" text="%s"/>
+<l:template name="sect1" text="%s"/>
+<l:template name="sect2" text="%s"/>
+<l:template name="sect3" text="%s"/>
+<l:template name="sect4" text="%s"/>
+<l:template name="sect5" text="%s"/>
+<l:template name="section" text="%s"/>
+<l:template name="set" text="%s"/>
+<l:template name="setindex" text="%s"/>
+<l:template name="sidebar" text="%s"/>
+<l:template name="simplesect" text="%s"/>
+<l:template name="toc" text="%s"/>
+</l:context>
+<l:context name="xref"><l:template name="abstract" text="%t"/>
+<l:template name="acknowledgements" text="%t" lang="en"/>
+<l:template name="answer" text="V: %n"/>
+<l:template name="appendix" text="%t"/>
+<l:template name="article" text="%t"/>
+<l:template name="authorblurb" text="%t"/>
+<l:template name="bibliodiv" text="%t"/>
+<l:template name="bibliography" text="%t"/>
+<l:template name="bibliomset" text="%t"/>
+<l:template name="biblioset" text="%t"/>
+<l:template name="blockquote" text="%t"/>
+<l:template name="book" text="%t"/>
+<l:template name="calloutlist" text="%t"/>
+<l:template name="caution" text="%t"/>
+<l:template name="chapter" text="%t"/>
+<l:template name="colophon" text="%t"/>
+<l:template name="constraintdef" text="%t"/>
+<l:template name="dedication" text="%t"/>
+<l:template name="equation" text="%t"/>
+<l:template name="example" text="%t"/>
+<l:template name="figure" text="%t"/>
+<l:template name="foil" text="%t" lang="en"/>
+<l:template name="foilgroup" text="%t" lang="en"/>
+<l:template name="formalpara" text="%t"/>
+<l:template name="glossary" text="%t"/>
+<l:template name="glossdiv" text="%t"/>
+<l:template name="important" text="%t"/>
+<l:template name="index" text="%t"/>
+<l:template name="indexdiv" text="%t"/>
+<l:template name="itemizedlist" text="%t"/>
+<l:template name="legalnotice" text="%t"/>
+<l:template name="listitem" text="%n"/>
+<l:template name="lot" text="%t"/>
+<l:template name="msg" text="%t"/>
+<l:template name="msgexplan" text="%t"/>
+<l:template name="msgmain" text="%t"/>
+<l:template name="msgrel" text="%t"/>
+<l:template name="msgset" text="%t"/>
+<l:template name="msgsub" text="%t"/>
+<l:template name="note" text="%t"/>
+<l:template name="orderedlist" text="%t"/>
+<l:template name="part" text="%t"/>
+<l:template name="partintro" text="%t"/>
+<l:template name="preface" text="%t"/>
+<l:template name="procedure" text="%t"/>
+<l:template name="productionset" text="%t"/>
+<l:template name="qandadiv" text="%t"/>
+<l:template name="qandaentry" text="K: %n"/>
+<l:template name="qandaset" text="%t"/>
+<l:template name="question" text="K: %n"/>
+<l:template name="reference" text="%t"/>
+<l:template name="refsynopsisdiv" text="%t"/>
+<l:template name="segmentedlist" text="%t"/>
+<l:template name="set" text="%t"/>
+<l:template name="setindex" text="%t"/>
+<l:template name="sidebar" text="%t"/>
+<l:template name="table" text="%t"/>
+<l:template name="task" text="%t" lang="en"/>
+<l:template name="tip" text="%t"/>
+<l:template name="toc" text="%t"/>
+<l:template name="variablelist" text="%t"/>
+<l:template name="varlistentry" text="%n"/>
+<l:template name="warning" text="%t"/>
+<l:template name="olink.document.citation" text=" in %o" lang="en"/>
+<l:template name="olink.page.citation" text=" (page %p)" lang="en"/>
+<l:template name="page.citation" text=" [%p]"/>
+<l:template name="page" text="(page %p)" lang="en"/>
+<l:template name="docname" text=" in %o" lang="en"/>
+<l:template name="docnamelong" text=" in the document titled %o" lang="en"/>
+<l:template name="pageabbrev" text="(p. %p)" lang="en"/>
+<l:template name="Page" text="Page %p" lang="en"/>
+<l:template name="bridgehead" text="“%tâ€"/>
+<l:template name="refsection" text="“%tâ€"/>
+<l:template name="refsect1" text="“%tâ€"/>
+<l:template name="refsect2" text="“%tâ€"/>
+<l:template name="refsect3" text="“%tâ€"/>
+<l:template name="sect1" text="“%tâ€"/>
+<l:template name="sect2" text="“%tâ€"/>
+<l:template name="sect3" text="“%tâ€"/>
+<l:template name="sect4" text="“%tâ€"/>
+<l:template name="sect5" text="“%tâ€"/>
+<l:template name="section" text="“%tâ€"/>
+<l:template name="simplesect" text="“%tâ€"/>
+</l:context>
+<l:context name="xref-number"><l:template name="answer" text="V: %n"/>
+<l:template name="appendix" text="Lisa %n"/>
+<l:template name="bridgehead" text="Sektsioon %n"/>
+<l:template name="chapter" text="Peatükk %n"/>
+<l:template name="equation" text="Valem %n"/>
+<l:template name="example" text="Näide %n"/>
+<l:template name="figure" text="Joonis %n"/>
+<l:template name="part" text="Osa %n"/>
+<l:template name="procedure" text="Protseduur %n"/>
+<l:template name="productionset" text="Production %n"/>
+<l:template name="qandadiv" text="K ja V %n"/>
+<l:template name="qandaentry" text="K: %n"/>
+<l:template name="question" text="K: %n"/>
+<l:template name="sect1" text="Sektsioon %n"/>
+<l:template name="sect2" text="Sektsioon %n"/>
+<l:template name="sect3" text="Sektsioon %n"/>
+<l:template name="sect4" text="Sektsioon %n"/>
+<l:template name="sect5" text="Sektsioon %n"/>
+<l:template name="section" text="Sektsioon %n"/>
+<l:template name="table" text="Tabel %n"/>
+</l:context>
+<l:context name="xref-number-and-title"><l:template name="appendix" text="Lisa %n, %t"/>
+<l:template name="bridgehead" text="Sektsioon %n, “%tâ€"/>
+<l:template name="chapter" text="Peatükk %n, %t"/>
+<l:template name="equation" text="Valem %n, “%tâ€"/>
+<l:template name="example" text="Näide %n, “%tâ€"/>
+<l:template name="figure" text="Joonis %n, “%tâ€"/>
+<l:template name="part" text="Osa %n, “%tâ€"/>
+<l:template name="procedure" text="Protseduur %n, “%tâ€"/>
+<l:template name="productionset" text="Production %n, “%tâ€"/>
+<l:template name="qandadiv" text="K ja V %n, “%tâ€"/>
+<l:template name="refsect1" text="the section called “%tâ€"/>
+<l:template name="refsect2" text="the section called “%tâ€"/>
+<l:template name="refsect3" text="the section called “%tâ€"/>
+<l:template name="refsection" text="the section called “%tâ€"/>
+<l:template name="sect1" text="Sektsioon %n, “%tâ€"/>
+<l:template name="sect2" text="Sektsioon %n, “%tâ€"/>
+<l:template name="sect3" text="Sektsioon %n, “%tâ€"/>
+<l:template name="sect4" text="Sektsioon %n, “%tâ€"/>
+<l:template name="sect5" text="Sektsioon %n, “%tâ€"/>
+<l:template name="section" text="Sektsioon %n, “%tâ€"/>
+<l:template name="simplesect" text="the section called “%tâ€"/>
+<l:template name="table" text="Tabel %n, “%tâ€"/>
+</l:context>
+<l:context name="authorgroup"><l:template name="sep" text=", "/>
+<l:template name="sep2" text=" ja "/>
+<l:template name="seplast" text=", ja "/>
+</l:context>
+<l:context name="glossary"><l:template name="see" text="Vt. %t."/>
+<l:template name="seealso" text="Vt. ka %t."/>
+<l:template name="seealso-separator" text=", "/>
+</l:context>
+<l:context name="msgset"><l:template name="MsgAud" text="Auditoorium: "/>
+<l:template name="MsgLevel" text="Tase: "/>
+<l:template name="MsgOrig" text="Algallikas: "/>
+</l:context>
+<l:context name="datetime"><l:template name="format" text="m/d/Y" lang="en"/>
+</l:context>
+<l:context name="termdef"><l:template name="prefix" text="[Definition: " lang="en"/>
+<l:template name="suffix" text="]" lang="en"/>
+</l:context>
+<l:context name="datetime-full"><l:template name="January" text="January" lang="en"/>
+<l:template name="February" text="February" lang="en"/>
+<l:template name="March" text="March" lang="en"/>
+<l:template name="April" text="April" lang="en"/>
+<l:template name="May" text="May" lang="en"/>
+<l:template name="June" text="June" lang="en"/>
+<l:template name="July" text="July" lang="en"/>
+<l:template name="August" text="August" lang="en"/>
+<l:template name="September" text="September" lang="en"/>
+<l:template name="October" text="October" lang="en"/>
+<l:template name="November" text="November" lang="en"/>
+<l:template name="December" text="December" lang="en"/>
+<l:template name="Monday" text="Monday" lang="en"/>
+<l:template name="Tuesday" text="Tuesday" lang="en"/>
+<l:template name="Wednesday" text="Wednesday" lang="en"/>
+<l:template name="Thursday" text="Thursday" lang="en"/>
+<l:template name="Friday" text="Friday" lang="en"/>
+<l:template name="Saturday" text="Saturday" lang="en"/>
+<l:template name="Sunday" text="Sunday" lang="en"/>
+</l:context>
+<l:context name="datetime-abbrev"><l:template name="Jan" text="Jan" lang="en"/>
+<l:template name="Feb" text="Feb" lang="en"/>
+<l:template name="Mar" text="Mar" lang="en"/>
+<l:template name="Apr" text="Apr" lang="en"/>
+<l:template name="May" text="May" lang="en"/>
+<l:template name="Jun" text="Jun" lang="en"/>
+<l:template name="Jul" text="Jul" lang="en"/>
+<l:template name="Aug" text="Aug" lang="en"/>
+<l:template name="Sep" text="Sep" lang="en"/>
+<l:template name="Oct" text="Oct" lang="en"/>
+<l:template name="Nov" text="Nov" lang="en"/>
+<l:template name="Dec" text="Dec" lang="en"/>
+<l:template name="Mon" text="Mon" lang="en"/>
+<l:template name="Tue" text="Tue" lang="en"/>
+<l:template name="Wed" text="Wed" lang="en"/>
+<l:template name="Thu" text="Thu" lang="en"/>
+<l:template name="Fri" text="Fri" lang="en"/>
+<l:template name="Sat" text="Sat" lang="en"/>
+<l:template name="Sun" text="Sun" lang="en"/>
+</l:context>
+<l:context name="htmlhelp"><l:template name="langcode" text="0x0425 Estonian"/>
+</l:context>
+<l:context name="index"><l:template name="term-separator" text=", " lang="en"/>
+<l:template name="number-separator" text=", " lang="en"/>
+<l:template name="range-separator" text="-" lang="en"/>
+</l:context>
+<l:context name="iso690"><l:template name="lastfirst.sep" text=", " lang="en"/>
+<l:template name="alt.person.two.sep" text=" – " lang="en"/>
+<l:template name="alt.person.last.sep" text=" – " lang="en"/>
+<l:template name="alt.person.more.sep" text=" – " lang="en"/>
+<l:template name="primary.editor" text=" (ed.)" lang="en"/>
+<l:template name="primary.many" text=", et al." lang="en"/>
+<l:template name="primary.sep" text=". " lang="en"/>
+<l:template name="submaintitle.sep" text=": " lang="en"/>
+<l:template name="title.sep" text=". " lang="en"/>
+<l:template name="othertitle.sep" text=", " lang="en"/>
+<l:template name="medium1" text=" [" lang="en"/>
+<l:template name="medium2" text="]" lang="en"/>
+<l:template name="secondary.person.sep" text="; " lang="en"/>
+<l:template name="secondary.sep" text=". " lang="en"/>
+<l:template name="respons.sep" text=". " lang="en"/>
+<l:template name="edition.sep" text=". " lang="en"/>
+<l:template name="edition.serial.sep" text=", " lang="en"/>
+<l:template name="issuing.range" text="-" lang="en"/>
+<l:template name="issuing.div" text=", " lang="en"/>
+<l:template name="issuing.sep" text=". " lang="en"/>
+<l:template name="partnr.sep" text=". " lang="en"/>
+<l:template name="placepubl.sep" text=": " lang="en"/>
+<l:template name="publyear.sep" text=", " lang="en"/>
+<l:template name="pubinfo.sep" text=". " lang="en"/>
+<l:template name="spec.pubinfo.sep" text=", " lang="en"/>
+<l:template name="upd.sep" text=", " lang="en"/>
+<l:template name="datecit1" text=" [cited " lang="en"/>
+<l:template name="datecit2" text="]" lang="en"/>
+<l:template name="extent.sep" text=". " lang="en"/>
+<l:template name="locs.sep" text=", " lang="en"/>
+<l:template name="location.sep" text=". " lang="en"/>
+<l:template name="serie.sep" text=". " lang="en"/>
+<l:template name="notice.sep" text=". " lang="en"/>
+<l:template name="access" text="Available " lang="en"/>
+<l:template name="acctoo" text="Also available " lang="en"/>
+<l:template name="onwww" text="from World Wide Web" lang="en"/>
+<l:template name="oninet" text="from Internet" lang="en"/>
+<l:template name="access.end" text=": " lang="en"/>
+<l:template name="link1" text="&lt;" lang="en"/>
+<l:template name="link2" text="&gt;" lang="en"/>
+<l:template name="access.sep" text=". " lang="en"/>
+<l:template name="isbn" text="ISBN " lang="en"/>
+<l:template name="issn" text="ISSN " lang="en"/>
+<l:template name="stdnum.sep" text=". " lang="en"/>
+<l:template name="patcountry.sep" text=". " lang="en"/>
+<l:template name="pattype.sep" text=", " lang="en"/>
+<l:template name="patnum.sep" text=". " lang="en"/>
+<l:template name="patdate.sep" text=". " lang="en"/>
+</l:context><l:letters lang="en"><l:l i="-1"/>
+<l:l i="0">Symbols</l:l>
+<l:l i="10">A</l:l>
+<l:l i="10">a</l:l>
+<l:l i="10">À</l:l>
+<l:l i="10">à</l:l>
+<l:l i="10">Ã</l:l>
+<l:l i="10">á</l:l>
+<l:l i="10">Â</l:l>
+<l:l i="10">â</l:l>
+<l:l i="10">Ã</l:l>
+<l:l i="10">ã</l:l>
+<l:l i="10">Ä</l:l>
+<l:l i="10">ä</l:l>
+<l:l i="10">Ã…</l:l>
+<l:l i="10">Ã¥</l:l>
+<l:l i="10">Ä€</l:l>
+<l:l i="10">Ä</l:l>
+<l:l i="10">Ä‚</l:l>
+<l:l i="10">ă</l:l>
+<l:l i="10">Ä„</l:l>
+<l:l i="10">Ä…</l:l>
+<l:l i="10">Ç</l:l>
+<l:l i="10">ÇŽ</l:l>
+<l:l i="10">Çž</l:l>
+<l:l i="10">ÇŸ</l:l>
+<l:l i="10">Ç </l:l>
+<l:l i="10">Ç¡</l:l>
+<l:l i="10">Ǻ</l:l>
+<l:l i="10">Ç»</l:l>
+<l:l i="10">È€</l:l>
+<l:l i="10">È</l:l>
+<l:l i="10">È‚</l:l>
+<l:l i="10">ȃ</l:l>
+<l:l i="10">Ȧ</l:l>
+<l:l i="10">ȧ</l:l>
+<l:l i="10">Ḁ</l:l>
+<l:l i="10">á¸</l:l>
+<l:l i="10">ẚ</l:l>
+<l:l i="10">Ạ</l:l>
+<l:l i="10">ạ</l:l>
+<l:l i="10">Ả</l:l>
+<l:l i="10">ả</l:l>
+<l:l i="10">Ấ</l:l>
+<l:l i="10">ấ</l:l>
+<l:l i="10">Ầ</l:l>
+<l:l i="10">ầ</l:l>
+<l:l i="10">Ẩ</l:l>
+<l:l i="10">ẩ</l:l>
+<l:l i="10">Ẫ</l:l>
+<l:l i="10">ẫ</l:l>
+<l:l i="10">Ậ</l:l>
+<l:l i="10">ậ</l:l>
+<l:l i="10">Ắ</l:l>
+<l:l i="10">ắ</l:l>
+<l:l i="10">Ằ</l:l>
+<l:l i="10">ằ</l:l>
+<l:l i="10">Ẳ</l:l>
+<l:l i="10">ẳ</l:l>
+<l:l i="10">Ẵ</l:l>
+<l:l i="10">ẵ</l:l>
+<l:l i="10">Ặ</l:l>
+<l:l i="10">ặ</l:l>
+<l:l i="20">B</l:l>
+<l:l i="20">b</l:l>
+<l:l i="20">Æ€</l:l>
+<l:l i="20">Æ</l:l>
+<l:l i="20">É“</l:l>
+<l:l i="20">Æ‚</l:l>
+<l:l i="20">ƃ</l:l>
+<l:l i="20">Ḃ</l:l>
+<l:l i="20">ḃ</l:l>
+<l:l i="20">Ḅ</l:l>
+<l:l i="20">ḅ</l:l>
+<l:l i="20">Ḇ</l:l>
+<l:l i="20">ḇ</l:l>
+<l:l i="30">C</l:l>
+<l:l i="30">c</l:l>
+<l:l i="30">Ç</l:l>
+<l:l i="30">ç</l:l>
+<l:l i="30">Ć</l:l>
+<l:l i="30">ć</l:l>
+<l:l i="30">Ĉ</l:l>
+<l:l i="30">ĉ</l:l>
+<l:l i="30">ÄŠ</l:l>
+<l:l i="30">Ä‹</l:l>
+<l:l i="30">Č</l:l>
+<l:l i="30">Ä</l:l>
+<l:l i="30">Ƈ</l:l>
+<l:l i="30">ƈ</l:l>
+<l:l i="30">É•</l:l>
+<l:l i="30">Ḉ</l:l>
+<l:l i="30">ḉ</l:l>
+<l:l i="40">D</l:l>
+<l:l i="40">d</l:l>
+<l:l i="40">ÄŽ</l:l>
+<l:l i="40">Ä</l:l>
+<l:l i="40">Ä</l:l>
+<l:l i="40">Ä‘</l:l>
+<l:l i="40">ÆŠ</l:l>
+<l:l i="40">É—</l:l>
+<l:l i="40">Æ‹</l:l>
+<l:l i="40">ƌ</l:l>
+<l:l i="40">Ç…</l:l>
+<l:l i="40">Dz</l:l>
+<l:l i="40">È¡</l:l>
+<l:l i="40">É–</l:l>
+<l:l i="40">Ḋ</l:l>
+<l:l i="40">ḋ</l:l>
+<l:l i="40">Ḍ</l:l>
+<l:l i="40">á¸</l:l>
+<l:l i="40">Ḏ</l:l>
+<l:l i="40">á¸</l:l>
+<l:l i="40">á¸</l:l>
+<l:l i="40">ḑ</l:l>
+<l:l i="40">Ḓ</l:l>
+<l:l i="40">ḓ</l:l>
+<l:l i="50">E</l:l>
+<l:l i="50">e</l:l>
+<l:l i="50">È</l:l>
+<l:l i="50">è</l:l>
+<l:l i="50">É</l:l>
+<l:l i="50">é</l:l>
+<l:l i="50">Ê</l:l>
+<l:l i="50">ê</l:l>
+<l:l i="50">Ë</l:l>
+<l:l i="50">ë</l:l>
+<l:l i="50">Ä’</l:l>
+<l:l i="50">Ä“</l:l>
+<l:l i="50">Ä”</l:l>
+<l:l i="50">Ä•</l:l>
+<l:l i="50">Ä–</l:l>
+<l:l i="50">Ä—</l:l>
+<l:l i="50">Ę</l:l>
+<l:l i="50">Ä™</l:l>
+<l:l i="50">Äš</l:l>
+<l:l i="50">Ä›</l:l>
+<l:l i="50">È„</l:l>
+<l:l i="50">È…</l:l>
+<l:l i="50">Ȇ</l:l>
+<l:l i="50">ȇ</l:l>
+<l:l i="50">Ȩ</l:l>
+<l:l i="50">È©</l:l>
+<l:l i="50">Ḕ</l:l>
+<l:l i="50">ḕ</l:l>
+<l:l i="50">Ḗ</l:l>
+<l:l i="50">ḗ</l:l>
+<l:l i="50">Ḙ</l:l>
+<l:l i="50">ḙ</l:l>
+<l:l i="50">Ḛ</l:l>
+<l:l i="50">ḛ</l:l>
+<l:l i="50">Ḝ</l:l>
+<l:l i="50">á¸</l:l>
+<l:l i="50">Ẹ</l:l>
+<l:l i="50">ẹ</l:l>
+<l:l i="50">Ẻ</l:l>
+<l:l i="50">ẻ</l:l>
+<l:l i="50">Ẽ</l:l>
+<l:l i="50">ẽ</l:l>
+<l:l i="50">Ế</l:l>
+<l:l i="50">ế</l:l>
+<l:l i="50">Ề</l:l>
+<l:l i="50">á»</l:l>
+<l:l i="50">Ể</l:l>
+<l:l i="50">ể</l:l>
+<l:l i="50">Ễ</l:l>
+<l:l i="50">á»…</l:l>
+<l:l i="50">Ệ</l:l>
+<l:l i="50">ệ</l:l>
+<l:l i="60">F</l:l>
+<l:l i="60">f</l:l>
+<l:l i="60">Æ‘</l:l>
+<l:l i="60">Æ’</l:l>
+<l:l i="60">Ḟ</l:l>
+<l:l i="60">ḟ</l:l>
+<l:l i="70">G</l:l>
+<l:l i="70">g</l:l>
+<l:l i="70">Ĝ</l:l>
+<l:l i="70">Ä</l:l>
+<l:l i="70">Äž</l:l>
+<l:l i="70">ÄŸ</l:l>
+<l:l i="70">Ä </l:l>
+<l:l i="70">Ä¡</l:l>
+<l:l i="70">Ä¢</l:l>
+<l:l i="70">Ä£</l:l>
+<l:l i="70">Æ“</l:l>
+<l:l i="70">É </l:l>
+<l:l i="70">Ǥ</l:l>
+<l:l i="70">Ç¥</l:l>
+<l:l i="70">Ǧ</l:l>
+<l:l i="70">ǧ</l:l>
+<l:l i="70">Ç´</l:l>
+<l:l i="70">ǵ</l:l>
+<l:l i="70">Ḡ</l:l>
+<l:l i="70">ḡ</l:l>
+<l:l i="80">H</l:l>
+<l:l i="80">h</l:l>
+<l:l i="80">Ĥ</l:l>
+<l:l i="80">Ä¥</l:l>
+<l:l i="80">Ħ</l:l>
+<l:l i="80">ħ</l:l>
+<l:l i="80">Èž</l:l>
+<l:l i="80">ÈŸ</l:l>
+<l:l i="80">ɦ</l:l>
+<l:l i="80">Ḣ</l:l>
+<l:l i="80">ḣ</l:l>
+<l:l i="80">Ḥ</l:l>
+<l:l i="80">ḥ</l:l>
+<l:l i="80">Ḧ</l:l>
+<l:l i="80">ḧ</l:l>
+<l:l i="80">Ḩ</l:l>
+<l:l i="80">ḩ</l:l>
+<l:l i="80">Ḫ</l:l>
+<l:l i="80">ḫ</l:l>
+<l:l i="80">ẖ</l:l>
+<l:l i="90">I</l:l>
+<l:l i="90">i</l:l>
+<l:l i="90">Ì</l:l>
+<l:l i="90">ì</l:l>
+<l:l i="90">Ã</l:l>
+<l:l i="90">í</l:l>
+<l:l i="90">ÃŽ</l:l>
+<l:l i="90">î</l:l>
+<l:l i="90">Ã</l:l>
+<l:l i="90">ï</l:l>
+<l:l i="90">Ĩ</l:l>
+<l:l i="90">Ä©</l:l>
+<l:l i="90">Ī</l:l>
+<l:l i="90">Ä«</l:l>
+<l:l i="90">Ĭ</l:l>
+<l:l i="90">Ä­</l:l>
+<l:l i="90">Ä®</l:l>
+<l:l i="90">į</l:l>
+<l:l i="90">Ä°</l:l>
+<l:l i="90">Æ—</l:l>
+<l:l i="90">ɨ</l:l>
+<l:l i="90">Ç</l:l>
+<l:l i="90">Ç</l:l>
+<l:l i="90">Ȉ</l:l>
+<l:l i="90">ȉ</l:l>
+<l:l i="90">ÈŠ</l:l>
+<l:l i="90">È‹</l:l>
+<l:l i="90">Ḭ</l:l>
+<l:l i="90">ḭ</l:l>
+<l:l i="90">Ḯ</l:l>
+<l:l i="90">ḯ</l:l>
+<l:l i="90">Ỉ</l:l>
+<l:l i="90">ỉ</l:l>
+<l:l i="90">Ị</l:l>
+<l:l i="90">ị</l:l>
+<l:l i="100">J</l:l>
+<l:l i="100">j</l:l>
+<l:l i="100">Ä´</l:l>
+<l:l i="100">ĵ</l:l>
+<l:l i="100">Ç°</l:l>
+<l:l i="100">Ê</l:l>
+<l:l i="110">K</l:l>
+<l:l i="110">k</l:l>
+<l:l i="110">Ķ</l:l>
+<l:l i="110">Ä·</l:l>
+<l:l i="110">Ƙ</l:l>
+<l:l i="110">Æ™</l:l>
+<l:l i="110">Ǩ</l:l>
+<l:l i="110">Ç©</l:l>
+<l:l i="110">Ḱ</l:l>
+<l:l i="110">ḱ</l:l>
+<l:l i="110">Ḳ</l:l>
+<l:l i="110">ḳ</l:l>
+<l:l i="110">Ḵ</l:l>
+<l:l i="110">ḵ</l:l>
+<l:l i="120">L</l:l>
+<l:l i="120">l</l:l>
+<l:l i="120">Ĺ</l:l>
+<l:l i="120">ĺ</l:l>
+<l:l i="120">Ä»</l:l>
+<l:l i="120">ļ</l:l>
+<l:l i="120">Ľ</l:l>
+<l:l i="120">ľ</l:l>
+<l:l i="120">Ä¿</l:l>
+<l:l i="120">Å€</l:l>
+<l:l i="120">Å</l:l>
+<l:l i="120">Å‚</l:l>
+<l:l i="120">Æš</l:l>
+<l:l i="120">Lj</l:l>
+<l:l i="120">È´</l:l>
+<l:l i="120">É«</l:l>
+<l:l i="120">ɬ</l:l>
+<l:l i="120">É­</l:l>
+<l:l i="120">Ḷ</l:l>
+<l:l i="120">ḷ</l:l>
+<l:l i="120">Ḹ</l:l>
+<l:l i="120">ḹ</l:l>
+<l:l i="120">Ḻ</l:l>
+<l:l i="120">ḻ</l:l>
+<l:l i="120">Ḽ</l:l>
+<l:l i="120">ḽ</l:l>
+<l:l i="130">M</l:l>
+<l:l i="130">m</l:l>
+<l:l i="130">ɱ</l:l>
+<l:l i="130">Ḿ</l:l>
+<l:l i="130">ḿ</l:l>
+<l:l i="130">á¹€</l:l>
+<l:l i="130">á¹</l:l>
+<l:l i="130">Ṃ</l:l>
+<l:l i="130">ṃ</l:l>
+<l:l i="140">N</l:l>
+<l:l i="140">n</l:l>
+<l:l i="140">Ñ</l:l>
+<l:l i="140">ñ</l:l>
+<l:l i="140">Ń</l:l>
+<l:l i="140">Å„</l:l>
+<l:l i="140">Å…</l:l>
+<l:l i="140">ņ</l:l>
+<l:l i="140">Ň</l:l>
+<l:l i="140">ň</l:l>
+<l:l i="140">Æ</l:l>
+<l:l i="140">ɲ</l:l>
+<l:l i="140">Æž</l:l>
+<l:l i="140">È </l:l>
+<l:l i="140">Ç‹</l:l>
+<l:l i="140">Ǹ</l:l>
+<l:l i="140">ǹ</l:l>
+<l:l i="140">ȵ</l:l>
+<l:l i="140">ɳ</l:l>
+<l:l i="140">Ṅ</l:l>
+<l:l i="140">á¹…</l:l>
+<l:l i="140">Ṇ</l:l>
+<l:l i="140">ṇ</l:l>
+<l:l i="140">Ṉ</l:l>
+<l:l i="140">ṉ</l:l>
+<l:l i="140">Ṋ</l:l>
+<l:l i="140">ṋ</l:l>
+<l:l i="150">O</l:l>
+<l:l i="150">o</l:l>
+<l:l i="150">Ã’</l:l>
+<l:l i="150">ò</l:l>
+<l:l i="150">Ó</l:l>
+<l:l i="150">ó</l:l>
+<l:l i="150">Ô</l:l>
+<l:l i="150">ô</l:l>
+<l:l i="150">Õ</l:l>
+<l:l i="150">õ</l:l>
+<l:l i="150">Ö</l:l>
+<l:l i="150">ö</l:l>
+<l:l i="150">Ø</l:l>
+<l:l i="150">ø</l:l>
+<l:l i="150">Ō</l:l>
+<l:l i="150">Å</l:l>
+<l:l i="150">ÅŽ</l:l>
+<l:l i="150">Å</l:l>
+<l:l i="150">Å</l:l>
+<l:l i="150">Å‘</l:l>
+<l:l i="150">ÆŸ</l:l>
+<l:l i="150">Æ </l:l>
+<l:l i="150">Æ¡</l:l>
+<l:l i="150">Ç‘</l:l>
+<l:l i="150">Ç’</l:l>
+<l:l i="150">Ǫ</l:l>
+<l:l i="150">Ç«</l:l>
+<l:l i="150">Ǭ</l:l>
+<l:l i="150">Ç­</l:l>
+<l:l i="150">Ǿ</l:l>
+<l:l i="150">Ç¿</l:l>
+<l:l i="150">Ȍ</l:l>
+<l:l i="150">È</l:l>
+<l:l i="150">ÈŽ</l:l>
+<l:l i="150">È</l:l>
+<l:l i="150">Ȫ</l:l>
+<l:l i="150">È«</l:l>
+<l:l i="150">Ȭ</l:l>
+<l:l i="150">È­</l:l>
+<l:l i="150">È®</l:l>
+<l:l i="150">ȯ</l:l>
+<l:l i="150">È°</l:l>
+<l:l i="150">ȱ</l:l>
+<l:l i="150">Ṍ</l:l>
+<l:l i="150">á¹</l:l>
+<l:l i="150">Ṏ</l:l>
+<l:l i="150">á¹</l:l>
+<l:l i="150">á¹</l:l>
+<l:l i="150">ṑ</l:l>
+<l:l i="150">á¹’</l:l>
+<l:l i="150">ṓ</l:l>
+<l:l i="150">Ọ</l:l>
+<l:l i="150">á»</l:l>
+<l:l i="150">Ỏ</l:l>
+<l:l i="150">á»</l:l>
+<l:l i="150">á»</l:l>
+<l:l i="150">ố</l:l>
+<l:l i="150">á»’</l:l>
+<l:l i="150">ồ</l:l>
+<l:l i="150">á»”</l:l>
+<l:l i="150">ổ</l:l>
+<l:l i="150">á»–</l:l>
+<l:l i="150">á»—</l:l>
+<l:l i="150">Ộ</l:l>
+<l:l i="150">á»™</l:l>
+<l:l i="150">Ớ</l:l>
+<l:l i="150">á»›</l:l>
+<l:l i="150">Ờ</l:l>
+<l:l i="150">á»</l:l>
+<l:l i="150">Ở</l:l>
+<l:l i="150">ở</l:l>
+<l:l i="150">á» </l:l>
+<l:l i="150">ỡ</l:l>
+<l:l i="150">Ợ</l:l>
+<l:l i="150">ợ</l:l>
+<l:l i="160">P</l:l>
+<l:l i="160">p</l:l>
+<l:l i="160">Ƥ</l:l>
+<l:l i="160">Æ¥</l:l>
+<l:l i="160">á¹”</l:l>
+<l:l i="160">ṕ</l:l>
+<l:l i="160">á¹–</l:l>
+<l:l i="160">á¹—</l:l>
+<l:l i="170">Q</l:l>
+<l:l i="170">q</l:l>
+<l:l i="170">Ê </l:l>
+<l:l i="180">R</l:l>
+<l:l i="180">r</l:l>
+<l:l i="180">Å”</l:l>
+<l:l i="180">Å•</l:l>
+<l:l i="180">Å–</l:l>
+<l:l i="180">Å—</l:l>
+<l:l i="180">Ř</l:l>
+<l:l i="180">Å™</l:l>
+<l:l i="180">È</l:l>
+<l:l i="180">È‘</l:l>
+<l:l i="180">È’</l:l>
+<l:l i="180">È“</l:l>
+<l:l i="180">ɼ</l:l>
+<l:l i="180">ɽ</l:l>
+<l:l i="180">ɾ</l:l>
+<l:l i="180">Ṙ</l:l>
+<l:l i="180">á¹™</l:l>
+<l:l i="180">Ṛ</l:l>
+<l:l i="180">á¹›</l:l>
+<l:l i="180">Ṝ</l:l>
+<l:l i="180">á¹</l:l>
+<l:l i="180">Ṟ</l:l>
+<l:l i="180">ṟ</l:l>
+<l:l i="190">S</l:l>
+<l:l i="190">s</l:l>
+<l:l i="190">Åš</l:l>
+<l:l i="190">Å›</l:l>
+<l:l i="190">Ŝ</l:l>
+<l:l i="190">Å</l:l>
+<l:l i="190">Åž</l:l>
+<l:l i="190">ÅŸ</l:l>
+<l:l i="190">Å </l:l>
+<l:l i="190">Å¡</l:l>
+<l:l i="190">Ș</l:l>
+<l:l i="190">È™</l:l>
+<l:l i="190">Ê‚</l:l>
+<l:l i="190">á¹ </l:l>
+<l:l i="190">ṡ</l:l>
+<l:l i="190">á¹¢</l:l>
+<l:l i="190">á¹£</l:l>
+<l:l i="190">Ṥ</l:l>
+<l:l i="190">á¹¥</l:l>
+<l:l i="190">Ṧ</l:l>
+<l:l i="190">ṧ</l:l>
+<l:l i="190">Ṩ</l:l>
+<l:l i="190">ṩ</l:l>
+<l:l i="200">T</l:l>
+<l:l i="200">t</l:l>
+<l:l i="200">Å¢</l:l>
+<l:l i="200">Å£</l:l>
+<l:l i="200">Ť</l:l>
+<l:l i="200">Å¥</l:l>
+<l:l i="200">Ŧ</l:l>
+<l:l i="200">ŧ</l:l>
+<l:l i="200">Æ«</l:l>
+<l:l i="200">Ƭ</l:l>
+<l:l i="200">Æ­</l:l>
+<l:l i="200">Æ®</l:l>
+<l:l i="200">ʈ</l:l>
+<l:l i="200">Èš</l:l>
+<l:l i="200">È›</l:l>
+<l:l i="200">ȶ</l:l>
+<l:l i="200">Ṫ</l:l>
+<l:l i="200">ṫ</l:l>
+<l:l i="200">Ṭ</l:l>
+<l:l i="200">á¹­</l:l>
+<l:l i="200">á¹®</l:l>
+<l:l i="200">ṯ</l:l>
+<l:l i="200">á¹°</l:l>
+<l:l i="200">á¹±</l:l>
+<l:l i="200">ẗ</l:l>
+<l:l i="210">U</l:l>
+<l:l i="210">u</l:l>
+<l:l i="210">Ù</l:l>
+<l:l i="210">ù</l:l>
+<l:l i="210">Ú</l:l>
+<l:l i="210">ú</l:l>
+<l:l i="210">Û</l:l>
+<l:l i="210">û</l:l>
+<l:l i="210">Ü</l:l>
+<l:l i="210">ü</l:l>
+<l:l i="210">Ũ</l:l>
+<l:l i="210">Å©</l:l>
+<l:l i="210">Ū</l:l>
+<l:l i="210">Å«</l:l>
+<l:l i="210">Ŭ</l:l>
+<l:l i="210">Å­</l:l>
+<l:l i="210">Å®</l:l>
+<l:l i="210">ů</l:l>
+<l:l i="210">Å°</l:l>
+<l:l i="210">ű</l:l>
+<l:l i="210">Ų</l:l>
+<l:l i="210">ų</l:l>
+<l:l i="210">Ư</l:l>
+<l:l i="210">Æ°</l:l>
+<l:l i="210">Ç“</l:l>
+<l:l i="210">Ç”</l:l>
+<l:l i="210">Ç•</l:l>
+<l:l i="210">Ç–</l:l>
+<l:l i="210">Ç—</l:l>
+<l:l i="210">ǘ</l:l>
+<l:l i="210">Ç™</l:l>
+<l:l i="210">Çš</l:l>
+<l:l i="210">Ç›</l:l>
+<l:l i="210">ǜ</l:l>
+<l:l i="210">È”</l:l>
+<l:l i="210">È•</l:l>
+<l:l i="210">È–</l:l>
+<l:l i="210">È—</l:l>
+<l:l i="210">á¹²</l:l>
+<l:l i="210">á¹³</l:l>
+<l:l i="210">á¹´</l:l>
+<l:l i="210">á¹µ</l:l>
+<l:l i="210">Ṷ</l:l>
+<l:l i="210">á¹·</l:l>
+<l:l i="210">Ṹ</l:l>
+<l:l i="210">á¹¹</l:l>
+<l:l i="210">Ṻ</l:l>
+<l:l i="210">á¹»</l:l>
+<l:l i="210">Ụ</l:l>
+<l:l i="210">ụ</l:l>
+<l:l i="210">Ủ</l:l>
+<l:l i="210">ủ</l:l>
+<l:l i="210">Ứ</l:l>
+<l:l i="210">ứ</l:l>
+<l:l i="210">Ừ</l:l>
+<l:l i="210">ừ</l:l>
+<l:l i="210">Ử</l:l>
+<l:l i="210">á»­</l:l>
+<l:l i="210">á»®</l:l>
+<l:l i="210">ữ</l:l>
+<l:l i="210">á»°</l:l>
+<l:l i="210">á»±</l:l>
+<l:l i="220">V</l:l>
+<l:l i="220">v</l:l>
+<l:l i="220">Ʋ</l:l>
+<l:l i="220">Ê‹</l:l>
+<l:l i="220">á¹¼</l:l>
+<l:l i="220">á¹½</l:l>
+<l:l i="220">á¹¾</l:l>
+<l:l i="220">ṿ</l:l>
+<l:l i="230">W</l:l>
+<l:l i="230">w</l:l>
+<l:l i="230">Å´</l:l>
+<l:l i="230">ŵ</l:l>
+<l:l i="230">Ẁ</l:l>
+<l:l i="230">áº</l:l>
+<l:l i="230">Ẃ</l:l>
+<l:l i="230">ẃ</l:l>
+<l:l i="230">Ẅ</l:l>
+<l:l i="230">ẅ</l:l>
+<l:l i="230">Ẇ</l:l>
+<l:l i="230">ẇ</l:l>
+<l:l i="230">Ẉ</l:l>
+<l:l i="230">ẉ</l:l>
+<l:l i="230">ẘ</l:l>
+<l:l i="240">X</l:l>
+<l:l i="240">x</l:l>
+<l:l i="240">Ẋ</l:l>
+<l:l i="240">ẋ</l:l>
+<l:l i="240">Ẍ</l:l>
+<l:l i="240">áº</l:l>
+<l:l i="250">Y</l:l>
+<l:l i="250">y</l:l>
+<l:l i="250">Ã</l:l>
+<l:l i="250">ý</l:l>
+<l:l i="250">ÿ</l:l>
+<l:l i="250">Ÿ</l:l>
+<l:l i="250">Ŷ</l:l>
+<l:l i="250">Å·</l:l>
+<l:l i="250">Ƴ</l:l>
+<l:l i="250">Æ´</l:l>
+<l:l i="250">Ȳ</l:l>
+<l:l i="250">ȳ</l:l>
+<l:l i="250">Ẏ</l:l>
+<l:l i="250">áº</l:l>
+<l:l i="250">ẙ</l:l>
+<l:l i="250">Ỳ</l:l>
+<l:l i="250">ỳ</l:l>
+<l:l i="250">á»´</l:l>
+<l:l i="250">ỵ</l:l>
+<l:l i="250">Ỷ</l:l>
+<l:l i="250">á»·</l:l>
+<l:l i="250">Ỹ</l:l>
+<l:l i="250">ỹ</l:l>
+<l:l i="260">Z</l:l>
+<l:l i="260">z</l:l>
+<l:l i="260">Ź</l:l>
+<l:l i="260">ź</l:l>
+<l:l i="260">Å»</l:l>
+<l:l i="260">ż</l:l>
+<l:l i="260">Ž</l:l>
+<l:l i="260">ž</l:l>
+<l:l i="260">Ƶ</l:l>
+<l:l i="260">ƶ</l:l>
+<l:l i="260">Ȥ</l:l>
+<l:l i="260">È¥</l:l>
+<l:l i="260">Ê</l:l>
+<l:l i="260">Ê‘</l:l>
+<l:l i="260">áº</l:l>
+<l:l i="260">ẑ</l:l>
+<l:l i="260">Ẓ</l:l>
+<l:l i="260">ẓ</l:l>
+<l:l i="260">Ẕ</l:l>
+<l:l i="260">ẕ</l:l>
+</l:letters>
+</l:l10n>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/eu.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/eu.xml
new file mode 100644
index 0000000..3841d3f
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/eu.xml
@@ -0,0 +1,1229 @@
+<?xml version="1.0" encoding="utf-8"?>
+<l:l10n xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0" language="eu" english-language-name="Basque">
+
+<!-- * This file is generated automatically. -->
+<!-- * To submit changes to this file upstream (to the DocBook Project) -->
+<!-- * do not submit an edited version of this file. Instead, submit an -->
+<!-- * edited version of the source file at the following location: -->
+<!-- * -->
+<!-- * https://docbook.svn.sourceforge.net/svnroot/docbook/trunk/gentext/locale/eu.xml -->
+<!-- * -->
+<!-- * E-mail the edited eu.xml source file to: -->
+<!-- * -->
+<!-- * docbook-developers@lists.sourceforge.net -->
+
+<!-- ******************************************************************** -->
+
+<!-- This file is part of the XSL DocBook Stylesheet distribution. -->
+<!-- See ../README or http://docbook.sf.net/release/xsl/current/ for -->
+<!-- copyright and other information. -->
+
+<!-- ******************************************************************** -->
+<!-- In these files, % with a letter is used for a placeholder: -->
+<!-- %t is the current element's title -->
+<!-- %s is the current element's subtitle (if applicable)-->
+<!-- %n is the current element's number label-->
+<!-- %p is the current element's page number (if applicable)-->
+<!-- ******************************************************************** -->
+
+
+<l:gentext key="Abstract" text="Laburpena"/>
+<l:gentext key="abstract" text="Laburpena"/>
+<l:gentext key="Acknowledgements" text="Acknowledgements" lang="en"/>
+<l:gentext key="acknowledgements" text="Acknowledgements" lang="en"/>
+<l:gentext key="Answer" text="E:"/>
+<l:gentext key="answer" text="E:"/>
+<l:gentext key="Appendix" text="Eranskina"/>
+<l:gentext key="appendix" text="eranskina"/>
+<l:gentext key="Article" text="Artikulua"/>
+<l:gentext key="article" text="Artikulua"/>
+<l:gentext key="Author" text="Author" lang="en"/>
+<l:gentext key="Bibliography" text="Bibliografia"/>
+<l:gentext key="bibliography" text="Bibliografia"/>
+<l:gentext key="Book" text="Liburua"/>
+<l:gentext key="book" text="Liburua"/>
+<l:gentext key="CAUTION" text="KONTUZ"/>
+<l:gentext key="Caution" text="Kontuz"/>
+<l:gentext key="caution" text="Kontuz"/>
+<l:gentext key="Chapter" text="Atala"/>
+<l:gentext key="chapter" text="atala"/>
+<l:gentext key="Colophon" text="Azken ohar"/>
+<l:gentext key="colophon" text="Azken ohar"/>
+<l:gentext key="Copyright" text="Copyright"/>
+<l:gentext key="copyright" text="Copyright"/>
+<l:gentext key="Dedication" text="Eskaintza"/>
+<l:gentext key="dedication" text="Eskaintza"/>
+<l:gentext key="Edition" text="Edizioa"/>
+<l:gentext key="edition" text="Edizioa"/>
+<l:gentext key="Editor" text="Editor" lang="en"/>
+<l:gentext key="Equation" text="Ekuazioa"/>
+<l:gentext key="equation" text="Ekuazioa"/>
+<l:gentext key="Example" text="Adibidea"/>
+<l:gentext key="example" text="Adibidea"/>
+<l:gentext key="Figure" text="Irudia"/>
+<l:gentext key="figure" text="Irudia"/>
+<l:gentext key="Glossary" text="Glosarioa"/>
+<l:gentext key="glossary" text="Glosarioa"/>
+<l:gentext key="GlossSee" text="Ikus"/>
+<l:gentext key="glosssee" text="Ikus"/>
+<l:gentext key="GlossSeeAlso" text="Ikus baita ere"/>
+<l:gentext key="glossseealso" text="Ikus baita ere"/>
+<l:gentext key="IMPORTANT" text="GARRANTZITSUA"/>
+<l:gentext key="important" text="Garrantzitsua"/>
+<l:gentext key="Important" text="Garrantzitsua"/>
+<l:gentext key="Index" text="Indizea"/>
+<l:gentext key="index" text="Indizea"/>
+<l:gentext key="ISBN" text="ISBN"/>
+<l:gentext key="isbn" text="ISBN"/>
+<l:gentext key="LegalNotice" text="Legezko abisua"/>
+<l:gentext key="legalnotice" text="Legezko abisua"/>
+<l:gentext key="MsgAud" text="Audientzia"/>
+<l:gentext key="msgaud" text="Audientzia"/>
+<l:gentext key="MsgLevel" text="Maila"/>
+<l:gentext key="msglevel" text="Maila"/>
+<l:gentext key="MsgOrig" text="Jatorria"/>
+<l:gentext key="msgorig" text="Jatorria"/>
+<l:gentext key="NOTE" text="OHARRA"/>
+<l:gentext key="Note" text="Oharra"/>
+<l:gentext key="note" text="Oharra"/>
+<l:gentext key="Part" text="Zatia"/>
+<l:gentext key="part" text="Zatia"/>
+<l:gentext key="Preface" text="Hitzaurrea"/>
+<l:gentext key="preface" text="Hitzaurrea"/>
+<l:gentext key="Procedure" text="Prozedura"/>
+<l:gentext key="procedure" text="Prozedura"/>
+<l:gentext key="ProductionSet" text="Ekoizpena"/>
+<l:gentext key="PubDate" text="Publication Date" lang="en"/>
+<l:gentext key="pubdate" text="Publication date" lang="en"/>
+<l:gentext key="Published" text="Argitaratua"/>
+<l:gentext key="published" text="Argitaratua"/>
+<l:gentext key="Publisher" text="Publisher" lang="en"/>
+<l:gentext key="Qandadiv" text="Galdera eta E"/>
+<l:gentext key="qandadiv" text="Galdera eta E"/>
+<l:gentext key="QandASet" text="Frequently Asked Questions" lang="en"/>
+<l:gentext key="Question" text="Galdera"/>
+<l:gentext key="question" text="galdera"/>
+<l:gentext key="RefEntry" text="Sarrera"/>
+<l:gentext key="refentry" text="Sarrera"/>
+<l:gentext key="Reference" text="Erreferentzia"/>
+<l:gentext key="reference" text="Erreferentzia"/>
+<l:gentext key="References" text="References" lang="en"/>
+<l:gentext key="RefName" text="Izena"/>
+<l:gentext key="refname" text="Izena"/>
+<l:gentext key="RefSection" text="Sekzioa"/>
+<l:gentext key="refsection" text="sekzioa"/>
+<l:gentext key="RefSynopsisDiv" text="Laburpena"/>
+<l:gentext key="refsynopsisdiv" text="Laburpena"/>
+<l:gentext key="RevHistory" text="Berrikuspenaren historia"/>
+<l:gentext key="revhistory" text="Berrikuspenaren historia"/>
+<l:gentext key="revision" text="Berrikuspena"/>
+<l:gentext key="Revision" text="Berrikuspena"/>
+<l:gentext key="sect1" text="Atala"/>
+<l:gentext key="sect2" text="Atala"/>
+<l:gentext key="sect3" text="Atala"/>
+<l:gentext key="sect4" text="Atala"/>
+<l:gentext key="sect5" text="Atala"/>
+<l:gentext key="section" text="Atala"/>
+<l:gentext key="Section" text="Atala"/>
+<l:gentext key="see" text="Ikus"/>
+<l:gentext key="See" text="Ikus"/>
+<l:gentext key="seealso" text="Ikus baita ere"/>
+<l:gentext key="Seealso" text="Ikus baita ere"/>
+<l:gentext key="SeeAlso" text="Ikus baita ere"/>
+<l:gentext key="set" text="Konfiguratu"/>
+<l:gentext key="Set" text="Konfiguratu"/>
+<l:gentext key="setindex" text="Konfiguratu indizea"/>
+<l:gentext key="SetIndex" text="Konfiguratu indizea"/>
+<l:gentext key="Sidebar" text="Alboko barra"/>
+<l:gentext key="sidebar" text="alboko barra"/>
+<l:gentext key="step" text="urratsa"/>
+<l:gentext key="Step" text="Urratsa"/>
+<l:gentext key="table" text="Taula"/>
+<l:gentext key="Table" text="Taula"/>
+<l:gentext key="task" text="Task" lang="en"/>
+<l:gentext key="Task" text="Task" lang="en"/>
+<l:gentext key="tip" text="Iradokizuna"/>
+<l:gentext key="TIP" text="IRADOKIZUNA"/>
+<l:gentext key="Tip" text="Iradokizuna"/>
+<l:gentext key="Warning" text="Abisua"/>
+<l:gentext key="warning" text="Abisua"/>
+<l:gentext key="WARNING" text="ABISUA"/>
+<l:gentext key="and" text="eta"/>
+<l:gentext key="by" text="Honek"/>
+<l:gentext key="Edited" text="editatua"/>
+<l:gentext key="edited" text="editatua"/>
+<l:gentext key="Editedby" text="Honek editatua"/>
+<l:gentext key="editedby" text="Honek editatua"/>
+<l:gentext key="in" text="non"/>
+<l:gentext key="lastlistcomma" text=","/>
+<l:gentext key="listcomma" text=","/>
+<l:gentext key="notes" text="Oharrak"/>
+<l:gentext key="Notes" text="Oharrak"/>
+<l:gentext key="Pgs" text="Orr."/>
+<l:gentext key="pgs" text="Orr."/>
+<l:gentext key="Revisedby" text="Berrikuspena: "/>
+<l:gentext key="revisedby" text="Berrikuspena: "/>
+<l:gentext key="TableNotes" text="Oharrak"/>
+<l:gentext key="tablenotes" text="Oharrak"/>
+<l:gentext key="TableofContents" text="Edukien aurkibidea"/>
+<l:gentext key="tableofcontents" text="Edukien aurkibidea"/>
+<l:gentext key="unexpectedelementname" text="Ustekabeko elemetu-izena"/>
+<l:gentext key="unsupported" text="onartzen ez den"/>
+<l:gentext key="xrefto" text="xref honi"/>
+<l:gentext key="Authors" text="Authors" lang="en"/>
+<l:gentext key="copyeditor" text="Copy Editor" lang="en"/>
+<l:gentext key="graphicdesigner" text="Graphic Designer" lang="en"/>
+<l:gentext key="productioneditor" text="Production Editor" lang="en"/>
+<l:gentext key="technicaleditor" text="Technical Editor" lang="en"/>
+<l:gentext key="translator" text="Translator" lang="en"/>
+<l:gentext key="listofequations" text="Ekuazioen zerrenda"/>
+<l:gentext key="ListofEquations" text="Ekuazioen zerrenda"/>
+<l:gentext key="ListofExamples" text="Adibideen zerrenda"/>
+<l:gentext key="listofexamples" text="Adibideen zerrenda"/>
+<l:gentext key="ListofFigures" text="Irudien zerrenda"/>
+<l:gentext key="listoffigures" text="Irudien zerrenda"/>
+<l:gentext key="ListofProcedures" text="List of Procedures" lang="en"/>
+<l:gentext key="listofprocedures" text="List of Procedures" lang="en"/>
+<l:gentext key="listoftables" text="Taulen zerrenda"/>
+<l:gentext key="ListofTables" text="Taulen zerrenda"/>
+<l:gentext key="ListofUnknown" text="Ezezagunen zerrenda"/>
+<l:gentext key="listofunknown" text="Ezazagunen zerrenda"/>
+<l:gentext key="nav-home" text="Etxea"/>
+<l:gentext key="nav-next" text="Hurrengoa"/>
+<l:gentext key="nav-next-sibling" text="Aurreratze azkarra"/>
+<l:gentext key="nav-prev" text="Aurrekoa"/>
+<l:gentext key="nav-prev-sibling" text="Atzeratze azkarra"/>
+<l:gentext key="nav-up" text="Gora"/>
+<l:gentext key="nav-toc" text="ToC" lang="en"/>
+<l:gentext key="Draft" text="Zirriborroa"/>
+<l:gentext key="above" text="goian"/>
+<l:gentext key="below" text="behean"/>
+<l:gentext key="sectioncalled" text="honela deritzon atala"/>
+<l:gentext key="index symbols" text="Ikurrak"/>
+<l:gentext key="writing-mode" text="lr-tb"/>
+<l:gentext key="lowercase.alpha" text="abcdefghijklmnopqrstuvwxyz"/>
+<l:gentext key="uppercase.alpha" text="ABCDEFGHIJKLMNOPQRSTUVWXYZ"/>
+<l:gentext key="normalize.sort.input" text="AaÀàÃáÂâÃãÄäÅåĀÄĂ㥹ÇǎǞǟǠǡǺǻȀÈȂȃȦȧḀá¸áºšáº áº¡áº¢áº£áº¤áº¥áº¦áº§áº¨áº©áºªáº«áº¬áº­áº®áº¯áº°áº±áº²áº³áº´áºµáº¶áº·BbÆ€ÆɓƂƃḂḃḄḅḆḇCcÇçĆćĈĉĊċČÄƇƈɕḈḉDdÄŽÄÄđƊɗƋƌDžDzȡɖḊḋḌá¸á¸Žá¸á¸á¸‘ḒḓEeÈèÉéÊêËëĒēĔĕĖėĘęĚěȄȅȆȇȨȩḔḕḖḗḘḙḚḛḜá¸áº¸áº¹áººáº»áº¼áº½áº¾áº¿á»€á»á»‚ểỄễỆệFfƑƒḞḟGgÄœÄĞğĠġĢģƓɠǤǥǦǧǴǵḠḡHhĤĥĦħȞȟɦḢḣḤḥḦḧḨḩḪḫẖIiÌìÃíÎîÃïĨĩĪīĬĭĮįİƗɨÇÇȈȉȊȋḬḭḮḯỈỉỊịJjĴĵǰÊKkĶķƘƙǨǩḰḱḲḳḴḵLlĹĺĻļĽľĿŀÅłƚLjȴɫɬɭḶḷḸḹḺḻḼḽMmɱḾḿṀá¹á¹‚ṃNnÑñŃńŅņŇňÆɲƞȠNjǸǹȵɳṄṅṆṇṈṉṊṋOoÒòÓóÔôÕõÖöØøŌÅÅŽÅÅőƟƠơǑǒǪǫǬǭǾǿȌÈÈŽÈȪȫȬȭȮȯȰȱṌá¹á¹Žá¹á¹á¹‘ṒṓỌá»á»Žá»á»á»‘ỒồỔổỖỗỘộỚớỜá»á»žá»Ÿá» á»¡á»¢á»£PpƤƥṔṕṖṗQqÊ RrŔŕŖŗŘřÈȑȒȓɼɽɾṘṙṚṛṜá¹á¹žá¹ŸSsŚśŜÅŞşŠšȘșʂṠṡṢṣṤṥṦṧṨṩTtŢţŤťŦŧƫƬƭƮʈȚțȶṪṫṬṭṮṯṰṱẗUuÙùÚúÛûÜüŨũŪūŬŭŮůŰűŲųƯưǓǔǕǖǗǘǙǚǛǜȔȕȖȗṲṳṴṵṶṷṸṹṺṻỤụỦủỨứỪừỬửỮữỰựVvƲʋṼṽṾṿWwŴŵẀáºáº‚ẃẄẅẆẇẈẉẘXxẊẋẌáºYyÃýÿŸŶŷƳƴȲȳẎáºáº™á»²á»³á»´á»µá»¶á»·á»¸á»¹ZzŹźŻżŽžƵƶȤȥÊÊ‘áºáº‘ẒẓẔẕẕ" lang="en"/>
+<l:gentext key="normalize.sort.output" text="AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBCCCCCCCCCCCCCCCCCDDDDDDDDDDDDDDDDDDDDDDDDEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEFFFFFFGGGGGGGGGGGGGGGGGGGGHHHHHHHHHHHHHHHHHHHHIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIJJJJJJKKKKKKKKKKKKKKLLLLLLLLLLLLLLLLLLLLLLLLLLMMMMMMMMMNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOPPPPPPPPQQQRRRRRRRRRRRRRRRRRRRRRRRSSSSSSSSSSSSSSSSSSSSSSSTTTTTTTTTTTTTTTTTTTTTTTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUVVVVVVVVWWWWWWWWWWWWWWWXXXXXXYYYYYYYYYYYYYYYYYYYYYYYZZZZZZZZZZZZZZZZZZZZZ" lang="en"/>
+<l:dingbat key="startquote" text="“"/>
+<l:dingbat key="endquote" text="â€"/>
+<l:dingbat key="nestedstartquote" text="‘"/>
+<l:dingbat key="nestedendquote" text="’"/>
+<l:dingbat key="singlestartquote" text="‘" lang="en"/>
+<l:dingbat key="singleendquote" text="’" lang="en"/>
+<l:dingbat key="bullet" text="•"/>
+<l:gentext key="hyphenation-character" text="-" lang="en"/>
+<l:gentext key="hyphenation-push-character-count" text="2" lang="en"/>
+<l:gentext key="hyphenation-remain-character-count" text="2" lang="en"/>
+<l:context name="styles"><l:template name="person-name" text="first-last"/>
+</l:context>
+<l:context name="title"><l:template name="abstract" text="%t"/>
+<l:template name="acknowledgements" text="%t" lang="en"/>
+<l:template name="answer" text="%t"/>
+<l:template name="appendix" text="Eranskina %n. %t"/>
+<l:template name="article" text="%t"/>
+<l:template name="authorblurb" text="%t"/>
+<l:template name="bibliodiv" text="%t"/>
+<l:template name="biblioentry" text="%t"/>
+<l:template name="bibliography" text="%t"/>
+<l:template name="bibliolist" text="%t" lang="en"/>
+<l:template name="bibliomixed" text="%t"/>
+<l:template name="bibliomset" text="%t"/>
+<l:template name="biblioset" text="%t"/>
+<l:template name="blockquote" text="%t"/>
+<l:template name="book" text="%t"/>
+<l:template name="calloutlist" text="%t"/>
+<l:template name="caution" text="%t"/>
+<l:template name="chapter" text="Atala %n. %t"/>
+<l:template name="colophon" text="%t"/>
+<l:template name="dedication" text="%t"/>
+<l:template name="equation" text="Ekuazioa %n. %t"/>
+<l:template name="example" text="Adibidea %n. %t"/>
+<l:template name="figure" text="Irudia %n. %t"/>
+<l:template name="foil" text="%t" lang="en"/>
+<l:template name="foilgroup" text="%t" lang="en"/>
+<l:template name="formalpara" text="%t"/>
+<l:template name="glossary" text="%t"/>
+<l:template name="glossdiv" text="%t"/>
+<l:template name="glosslist" text="%t" lang="en"/>
+<l:template name="glossentry" text="%t" lang="en"/>
+<l:template name="important" text="%t"/>
+<l:template name="index" text="%t"/>
+<l:template name="indexdiv" text="%t"/>
+<l:template name="itemizedlist" text="%t"/>
+<l:template name="legalnotice" text="%t"/>
+<l:template name="listitem" text=""/>
+<l:template name="lot" text="%t"/>
+<l:template name="msg" text="%t"/>
+<l:template name="msgexplan" text="%t"/>
+<l:template name="msgmain" text="%t"/>
+<l:template name="msgrel" text="%t"/>
+<l:template name="msgset" text="%t"/>
+<l:template name="msgsub" text="%t"/>
+<l:template name="note" text="%t"/>
+<l:template name="orderedlist" text="%t"/>
+<l:template name="part" text="Zatia %n. %t"/>
+<l:template name="partintro" text="%t"/>
+<l:template name="preface" text="%t"/>
+<l:template name="procedure" text="%t"/>
+<l:template name="procedure.formal" text="Prozedura %n. %t"/>
+<l:template name="productionset" text="%t"/>
+<l:template name="productionset.formal" text="Ekoizpena %n"/>
+<l:template name="qandadiv" text="%t"/>
+<l:template name="qandaentry" text="%t"/>
+<l:template name="qandaset" text="%t"/>
+<l:template name="question" text="%t"/>
+<l:template name="refentry" text="%t"/>
+<l:template name="reference" text="%t"/>
+<l:template name="refsection" text="%t"/>
+<l:template name="refsect1" text="%t"/>
+<l:template name="refsect2" text="%t"/>
+<l:template name="refsect3" text="%t"/>
+<l:template name="refsynopsisdiv" text="%t"/>
+<l:template name="refsynopsisdivinfo" text="%t"/>
+<l:template name="segmentedlist" text="%t"/>
+<l:template name="set" text="%t"/>
+<l:template name="setindex" text="%t"/>
+<l:template name="sidebar" text="%t"/>
+<l:template name="step" text="%t"/>
+<l:template name="table" text="Taula %n. %t"/>
+<l:template name="task" text="%t" lang="en"/>
+<l:template name="tasksummary" text="%t" lang="en"/>
+<l:template name="taskprerequisites" text="%t" lang="en"/>
+<l:template name="taskrelated" text="%t" lang="en"/>
+<l:template name="tip" text="%t"/>
+<l:template name="toc" text="%t"/>
+<l:template name="variablelist" text="%t"/>
+<l:template name="varlistentry" text=""/>
+<l:template name="warning" text="%t"/>
+</l:context>
+<l:context name="title-unnumbered"><l:template name="appendix" text="%t"/>
+<l:template name="article/appendix" text="%t" lang="en"/>
+<l:template name="bridgehead" text="%t"/>
+<l:template name="chapter" text="%t"/>
+<l:template name="sect1" text="%t"/>
+<l:template name="sect2" text="%t"/>
+<l:template name="sect3" text="%t"/>
+<l:template name="sect4" text="%t"/>
+<l:template name="sect5" text="%t"/>
+<l:template name="section" text="%t"/>
+<l:template name="simplesect" text="%t"/>
+<l:template name="part" text="%t" lang="en"/>
+</l:context>
+<l:context name="title-numbered"><l:template name="appendix" text="Eranskina %n. %t"/>
+<l:template name="article/appendix" text="%n. %t" lang="en"/>
+<l:template name="bridgehead" text="%n. %t"/>
+<l:template name="chapter" text="Atala %n. %t"/>
+<l:template name="part" text="Zatia %n. %t"/>
+<l:template name="sect1" text="%n. %t"/>
+<l:template name="sect2" text="%n. %t"/>
+<l:template name="sect3" text="%n. %t"/>
+<l:template name="sect4" text="%n. %t"/>
+<l:template name="sect5" text="%n. %t"/>
+<l:template name="section" text="%n. %t"/>
+<l:template name="simplesect" text="%t"/>
+</l:context>
+<l:context name="subtitle"><l:template name="appendix" text="%s"/>
+<l:template name="acknowledgements" text="%s" lang="en"/>
+<l:template name="article" text="%s"/>
+<l:template name="bibliodiv" text="%s"/>
+<l:template name="biblioentry" text="%s"/>
+<l:template name="bibliography" text="%s"/>
+<l:template name="bibliomixed" text="%s"/>
+<l:template name="bibliomset" text="%s"/>
+<l:template name="biblioset" text="%s"/>
+<l:template name="book" text="%s"/>
+<l:template name="chapter" text="%s"/>
+<l:template name="colophon" text="%s"/>
+<l:template name="dedication" text="%s"/>
+<l:template name="glossary" text="%s"/>
+<l:template name="glossdiv" text="%s"/>
+<l:template name="index" text="%s"/>
+<l:template name="indexdiv" text="%s"/>
+<l:template name="lot" text="%s"/>
+<l:template name="part" text="%s"/>
+<l:template name="partintro" text="%s"/>
+<l:template name="preface" text="%s"/>
+<l:template name="refentry" text="%s"/>
+<l:template name="reference" text="%s"/>
+<l:template name="refsection" text="%s"/>
+<l:template name="refsect1" text="%s"/>
+<l:template name="refsect2" text="%s"/>
+<l:template name="refsect3" text="%s"/>
+<l:template name="refsynopsisdiv" text="%s"/>
+<l:template name="sect1" text="%s"/>
+<l:template name="sect2" text="%s"/>
+<l:template name="sect3" text="%s"/>
+<l:template name="sect4" text="%s"/>
+<l:template name="sect5" text="%s"/>
+<l:template name="section" text="%s"/>
+<l:template name="set" text="%s"/>
+<l:template name="setindex" text="%s"/>
+<l:template name="sidebar" text="%s"/>
+<l:template name="simplesect" text="%s"/>
+<l:template name="toc" text="%s"/>
+</l:context>
+<l:context name="xref"><l:template name="abstract" text="%t"/>
+<l:template name="acknowledgements" text="%t" lang="en"/>
+<l:template name="answer" text="E: %n"/>
+<l:template name="appendix" text="%t"/>
+<l:template name="article" text="%t"/>
+<l:template name="authorblurb" text="%t"/>
+<l:template name="bibliodiv" text="%t"/>
+<l:template name="bibliography" text="%t"/>
+<l:template name="bibliomset" text="%t"/>
+<l:template name="biblioset" text="%t"/>
+<l:template name="blockquote" text="%t"/>
+<l:template name="book" text="%t"/>
+<l:template name="calloutlist" text="%t"/>
+<l:template name="caution" text="%t"/>
+<l:template name="chapter" text="%t"/>
+<l:template name="colophon" text="%t"/>
+<l:template name="constraintdef" text="%t"/>
+<l:template name="dedication" text="%t"/>
+<l:template name="equation" text="%t"/>
+<l:template name="example" text="%t"/>
+<l:template name="figure" text="%t"/>
+<l:template name="foil" text="%t" lang="en"/>
+<l:template name="foilgroup" text="%t" lang="en"/>
+<l:template name="formalpara" text="%t"/>
+<l:template name="glossary" text="%t"/>
+<l:template name="glossdiv" text="%t"/>
+<l:template name="important" text="%t"/>
+<l:template name="index" text="%t"/>
+<l:template name="indexdiv" text="%t"/>
+<l:template name="itemizedlist" text="%t"/>
+<l:template name="legalnotice" text="%t"/>
+<l:template name="listitem" text="%n"/>
+<l:template name="lot" text="%t"/>
+<l:template name="msg" text="%t"/>
+<l:template name="msgexplan" text="%t"/>
+<l:template name="msgmain" text="%t"/>
+<l:template name="msgrel" text="%t"/>
+<l:template name="msgset" text="%t"/>
+<l:template name="msgsub" text="%t"/>
+<l:template name="note" text="%t"/>
+<l:template name="orderedlist" text="%t"/>
+<l:template name="part" text="%t"/>
+<l:template name="partintro" text="%t"/>
+<l:template name="preface" text="%t"/>
+<l:template name="procedure" text="%t"/>
+<l:template name="productionset" text="%t"/>
+<l:template name="qandadiv" text="%t"/>
+<l:template name="qandaentry" text="Galdera %n"/>
+<l:template name="qandaset" text="%t"/>
+<l:template name="question" text="Galdera %n"/>
+<l:template name="reference" text="%t"/>
+<l:template name="refsynopsisdiv" text="%t"/>
+<l:template name="segmentedlist" text="%t"/>
+<l:template name="set" text="%t"/>
+<l:template name="setindex" text="%t"/>
+<l:template name="sidebar" text="%t"/>
+<l:template name="table" text="%t"/>
+<l:template name="task" text="%t" lang="en"/>
+<l:template name="tip" text="%t"/>
+<l:template name="toc" text="%t"/>
+<l:template name="variablelist" text="%t"/>
+<l:template name="varlistentry" text="%n"/>
+<l:template name="warning" text="%t"/>
+<l:template name="olink.document.citation" text=" in %o" lang="en"/>
+<l:template name="olink.page.citation" text=" (page %p)" lang="en"/>
+<l:template name="page.citation" text=" [%p]"/>
+<l:template name="page" text="(page %p)" lang="en"/>
+<l:template name="docname" text=" in %o" lang="en"/>
+<l:template name="docnamelong" text=" in the document titled %o" lang="en"/>
+<l:template name="pageabbrev" text="(p. %p)" lang="en"/>
+<l:template name="Page" text="Page %p" lang="en"/>
+<l:template name="bridgehead" text="honela deritzon atala “%tâ€"/>
+<l:template name="refsection" text="honela deritzon atala “%tâ€"/>
+<l:template name="refsect1" text="honela deritzon atala “%tâ€"/>
+<l:template name="refsect2" text="honela deritzon atala “%tâ€"/>
+<l:template name="refsect3" text="honela deritzon atala “%tâ€"/>
+<l:template name="sect1" text="honela deritzon atala “%tâ€"/>
+<l:template name="sect2" text="honela deritzon atala “%tâ€"/>
+<l:template name="sect3" text="honela deritzon atala “%tâ€"/>
+<l:template name="sect4" text="honela deritzon atala “%tâ€"/>
+<l:template name="sect5" text="honela deritzon atala “%tâ€"/>
+<l:template name="section" text="honela deritzon atala “%tâ€"/>
+<l:template name="simplesect" text="honela deritzon atala “%tâ€"/>
+</l:context>
+<l:context name="xref-number"><l:template name="answer" text="E: %n"/>
+<l:template name="appendix" text="Eranskina %n"/>
+<l:template name="bridgehead" text="Atala %n"/>
+<l:template name="chapter" text="Atala %n"/>
+<l:template name="equation" text="Ekuazioa %n"/>
+<l:template name="example" text="Adibidea %n"/>
+<l:template name="figure" text="Irudia %n"/>
+<l:template name="part" text="Zatia %n"/>
+<l:template name="procedure" text="Prozedura %n"/>
+<l:template name="productionset" text="Ekoizpena %n"/>
+<l:template name="qandadiv" text="Galdera eta E %n"/>
+<l:template name="qandaentry" text="Galdera %n"/>
+<l:template name="question" text="Galdera %n"/>
+<l:template name="sect1" text="Atala %n"/>
+<l:template name="sect2" text="Atala %n"/>
+<l:template name="sect3" text="Atala %n"/>
+<l:template name="sect4" text="Atala %n"/>
+<l:template name="sect5" text="Atala %n"/>
+<l:template name="section" text="Atala %n"/>
+<l:template name="table" text="Taula %n"/>
+</l:context>
+<l:context name="xref-number-and-title"><l:template name="appendix" text="Eranskina %n, %t"/>
+<l:template name="bridgehead" text="Atala %n, “%tâ€"/>
+<l:template name="chapter" text="Atala %n, %t"/>
+<l:template name="equation" text="Ekuazioa %n, “%tâ€"/>
+<l:template name="example" text="Adibidea %n, “%tâ€"/>
+<l:template name="figure" text="Irudia %n, “%tâ€"/>
+<l:template name="part" text="Zatia %n, “%tâ€"/>
+<l:template name="procedure" text="Prozedura %n, “%tâ€"/>
+<l:template name="productionset" text="Ekoizpena %n, “%tâ€"/>
+<l:template name="qandadiv" text="Galdera eta E %n, “%tâ€"/>
+<l:template name="refsect1" text="honela deritzon atala “%tâ€"/>
+<l:template name="refsect2" text="honela deritzon atala “%tâ€"/>
+<l:template name="refsect3" text="honela deritzon atala “%tâ€"/>
+<l:template name="refsection" text="honela deritzon atala “%tâ€"/>
+<l:template name="sect1" text="Atala %n, “%tâ€"/>
+<l:template name="sect2" text="Atala %n, “%tâ€"/>
+<l:template name="sect3" text="Atala %n, “%tâ€"/>
+<l:template name="sect4" text="Atala %n, “%tâ€"/>
+<l:template name="sect5" text="Atala %n, “%tâ€"/>
+<l:template name="section" text="Atala %n, “%tâ€"/>
+<l:template name="simplesect" text="honela deritzon atala “%tâ€"/>
+<l:template name="table" text="Taula %n, “%tâ€"/>
+</l:context>
+<l:context name="authorgroup"><l:template name="sep" text=", "/>
+<l:template name="sep2" text=" eta "/>
+<l:template name="seplast" text=", eta "/>
+</l:context>
+<l:context name="glossary"><l:template name="see" text="Ikus %t."/>
+<l:template name="seealso" text="Ikus baita ere %t."/>
+<l:template name="seealso-separator" text=", "/>
+</l:context>
+<l:context name="msgset"><l:template name="MsgAud" text="Audientzia: "/>
+<l:template name="MsgLevel" text="Maila: "/>
+<l:template name="MsgOrig" text="Jatorria: "/>
+</l:context>
+<l:context name="datetime"><l:template name="format" text="m/d/Y" lang="en"/>
+</l:context>
+<l:context name="termdef"><l:template name="prefix" text="[Definition: " lang="en"/>
+<l:template name="suffix" text="]" lang="en"/>
+</l:context>
+<l:context name="datetime-full"><l:template name="January" text="January" lang="en"/>
+<l:template name="February" text="February" lang="en"/>
+<l:template name="March" text="March" lang="en"/>
+<l:template name="April" text="April" lang="en"/>
+<l:template name="May" text="May" lang="en"/>
+<l:template name="June" text="June" lang="en"/>
+<l:template name="July" text="July" lang="en"/>
+<l:template name="August" text="August" lang="en"/>
+<l:template name="September" text="September" lang="en"/>
+<l:template name="October" text="October" lang="en"/>
+<l:template name="November" text="November" lang="en"/>
+<l:template name="December" text="December" lang="en"/>
+<l:template name="Monday" text="Monday" lang="en"/>
+<l:template name="Tuesday" text="Tuesday" lang="en"/>
+<l:template name="Wednesday" text="Wednesday" lang="en"/>
+<l:template name="Thursday" text="Thursday" lang="en"/>
+<l:template name="Friday" text="Friday" lang="en"/>
+<l:template name="Saturday" text="Saturday" lang="en"/>
+<l:template name="Sunday" text="Sunday" lang="en"/>
+</l:context>
+<l:context name="datetime-abbrev"><l:template name="Jan" text="Jan" lang="en"/>
+<l:template name="Feb" text="Feb" lang="en"/>
+<l:template name="Mar" text="Mar" lang="en"/>
+<l:template name="Apr" text="Apr" lang="en"/>
+<l:template name="May" text="May" lang="en"/>
+<l:template name="Jun" text="Jun" lang="en"/>
+<l:template name="Jul" text="Jul" lang="en"/>
+<l:template name="Aug" text="Aug" lang="en"/>
+<l:template name="Sep" text="Sep" lang="en"/>
+<l:template name="Oct" text="Oct" lang="en"/>
+<l:template name="Nov" text="Nov" lang="en"/>
+<l:template name="Dec" text="Dec" lang="en"/>
+<l:template name="Mon" text="Mon" lang="en"/>
+<l:template name="Tue" text="Tue" lang="en"/>
+<l:template name="Wed" text="Wed" lang="en"/>
+<l:template name="Thu" text="Thu" lang="en"/>
+<l:template name="Fri" text="Fri" lang="en"/>
+<l:template name="Sat" text="Sat" lang="en"/>
+<l:template name="Sun" text="Sun" lang="en"/>
+</l:context>
+<l:context name="htmlhelp"><l:template name="langcode" text="0x042d Basque"/>
+</l:context>
+<l:context name="index"><l:template name="term-separator" text=", " lang="en"/>
+<l:template name="number-separator" text=", " lang="en"/>
+<l:template name="range-separator" text="-" lang="en"/>
+</l:context>
+<l:context name="iso690"><l:template name="lastfirst.sep" text=", " lang="en"/>
+<l:template name="alt.person.two.sep" text=" – " lang="en"/>
+<l:template name="alt.person.last.sep" text=" – " lang="en"/>
+<l:template name="alt.person.more.sep" text=" – " lang="en"/>
+<l:template name="primary.editor" text=" (ed.)" lang="en"/>
+<l:template name="primary.many" text=", et al." lang="en"/>
+<l:template name="primary.sep" text=". " lang="en"/>
+<l:template name="submaintitle.sep" text=": " lang="en"/>
+<l:template name="title.sep" text=". " lang="en"/>
+<l:template name="othertitle.sep" text=", " lang="en"/>
+<l:template name="medium1" text=" [" lang="en"/>
+<l:template name="medium2" text="]" lang="en"/>
+<l:template name="secondary.person.sep" text="; " lang="en"/>
+<l:template name="secondary.sep" text=". " lang="en"/>
+<l:template name="respons.sep" text=". " lang="en"/>
+<l:template name="edition.sep" text=". " lang="en"/>
+<l:template name="edition.serial.sep" text=", " lang="en"/>
+<l:template name="issuing.range" text="-" lang="en"/>
+<l:template name="issuing.div" text=", " lang="en"/>
+<l:template name="issuing.sep" text=". " lang="en"/>
+<l:template name="partnr.sep" text=". " lang="en"/>
+<l:template name="placepubl.sep" text=": " lang="en"/>
+<l:template name="publyear.sep" text=", " lang="en"/>
+<l:template name="pubinfo.sep" text=". " lang="en"/>
+<l:template name="spec.pubinfo.sep" text=", " lang="en"/>
+<l:template name="upd.sep" text=", " lang="en"/>
+<l:template name="datecit1" text=" [cited " lang="en"/>
+<l:template name="datecit2" text="]" lang="en"/>
+<l:template name="extent.sep" text=". " lang="en"/>
+<l:template name="locs.sep" text=", " lang="en"/>
+<l:template name="location.sep" text=". " lang="en"/>
+<l:template name="serie.sep" text=". " lang="en"/>
+<l:template name="notice.sep" text=". " lang="en"/>
+<l:template name="access" text="Available " lang="en"/>
+<l:template name="acctoo" text="Also available " lang="en"/>
+<l:template name="onwww" text="from World Wide Web" lang="en"/>
+<l:template name="oninet" text="from Internet" lang="en"/>
+<l:template name="access.end" text=": " lang="en"/>
+<l:template name="link1" text="&lt;" lang="en"/>
+<l:template name="link2" text="&gt;" lang="en"/>
+<l:template name="access.sep" text=". " lang="en"/>
+<l:template name="isbn" text="ISBN " lang="en"/>
+<l:template name="issn" text="ISSN " lang="en"/>
+<l:template name="stdnum.sep" text=". " lang="en"/>
+<l:template name="patcountry.sep" text=". " lang="en"/>
+<l:template name="pattype.sep" text=", " lang="en"/>
+<l:template name="patnum.sep" text=". " lang="en"/>
+<l:template name="patdate.sep" text=". " lang="en"/>
+</l:context><l:letters lang="en"><l:l i="-1"/>
+<l:l i="0">Symbols</l:l>
+<l:l i="10">A</l:l>
+<l:l i="10">a</l:l>
+<l:l i="10">À</l:l>
+<l:l i="10">à</l:l>
+<l:l i="10">Ã</l:l>
+<l:l i="10">á</l:l>
+<l:l i="10">Â</l:l>
+<l:l i="10">â</l:l>
+<l:l i="10">Ã</l:l>
+<l:l i="10">ã</l:l>
+<l:l i="10">Ä</l:l>
+<l:l i="10">ä</l:l>
+<l:l i="10">Ã…</l:l>
+<l:l i="10">Ã¥</l:l>
+<l:l i="10">Ä€</l:l>
+<l:l i="10">Ä</l:l>
+<l:l i="10">Ä‚</l:l>
+<l:l i="10">ă</l:l>
+<l:l i="10">Ä„</l:l>
+<l:l i="10">Ä…</l:l>
+<l:l i="10">Ç</l:l>
+<l:l i="10">ÇŽ</l:l>
+<l:l i="10">Çž</l:l>
+<l:l i="10">ÇŸ</l:l>
+<l:l i="10">Ç </l:l>
+<l:l i="10">Ç¡</l:l>
+<l:l i="10">Ǻ</l:l>
+<l:l i="10">Ç»</l:l>
+<l:l i="10">È€</l:l>
+<l:l i="10">È</l:l>
+<l:l i="10">È‚</l:l>
+<l:l i="10">ȃ</l:l>
+<l:l i="10">Ȧ</l:l>
+<l:l i="10">ȧ</l:l>
+<l:l i="10">Ḁ</l:l>
+<l:l i="10">á¸</l:l>
+<l:l i="10">ẚ</l:l>
+<l:l i="10">Ạ</l:l>
+<l:l i="10">ạ</l:l>
+<l:l i="10">Ả</l:l>
+<l:l i="10">ả</l:l>
+<l:l i="10">Ấ</l:l>
+<l:l i="10">ấ</l:l>
+<l:l i="10">Ầ</l:l>
+<l:l i="10">ầ</l:l>
+<l:l i="10">Ẩ</l:l>
+<l:l i="10">ẩ</l:l>
+<l:l i="10">Ẫ</l:l>
+<l:l i="10">ẫ</l:l>
+<l:l i="10">Ậ</l:l>
+<l:l i="10">ậ</l:l>
+<l:l i="10">Ắ</l:l>
+<l:l i="10">ắ</l:l>
+<l:l i="10">Ằ</l:l>
+<l:l i="10">ằ</l:l>
+<l:l i="10">Ẳ</l:l>
+<l:l i="10">ẳ</l:l>
+<l:l i="10">Ẵ</l:l>
+<l:l i="10">ẵ</l:l>
+<l:l i="10">Ặ</l:l>
+<l:l i="10">ặ</l:l>
+<l:l i="20">B</l:l>
+<l:l i="20">b</l:l>
+<l:l i="20">Æ€</l:l>
+<l:l i="20">Æ</l:l>
+<l:l i="20">É“</l:l>
+<l:l i="20">Æ‚</l:l>
+<l:l i="20">ƃ</l:l>
+<l:l i="20">Ḃ</l:l>
+<l:l i="20">ḃ</l:l>
+<l:l i="20">Ḅ</l:l>
+<l:l i="20">ḅ</l:l>
+<l:l i="20">Ḇ</l:l>
+<l:l i="20">ḇ</l:l>
+<l:l i="30">C</l:l>
+<l:l i="30">c</l:l>
+<l:l i="30">Ç</l:l>
+<l:l i="30">ç</l:l>
+<l:l i="30">Ć</l:l>
+<l:l i="30">ć</l:l>
+<l:l i="30">Ĉ</l:l>
+<l:l i="30">ĉ</l:l>
+<l:l i="30">ÄŠ</l:l>
+<l:l i="30">Ä‹</l:l>
+<l:l i="30">Č</l:l>
+<l:l i="30">Ä</l:l>
+<l:l i="30">Ƈ</l:l>
+<l:l i="30">ƈ</l:l>
+<l:l i="30">É•</l:l>
+<l:l i="30">Ḉ</l:l>
+<l:l i="30">ḉ</l:l>
+<l:l i="40">D</l:l>
+<l:l i="40">d</l:l>
+<l:l i="40">ÄŽ</l:l>
+<l:l i="40">Ä</l:l>
+<l:l i="40">Ä</l:l>
+<l:l i="40">Ä‘</l:l>
+<l:l i="40">ÆŠ</l:l>
+<l:l i="40">É—</l:l>
+<l:l i="40">Æ‹</l:l>
+<l:l i="40">ƌ</l:l>
+<l:l i="40">Ç…</l:l>
+<l:l i="40">Dz</l:l>
+<l:l i="40">È¡</l:l>
+<l:l i="40">É–</l:l>
+<l:l i="40">Ḋ</l:l>
+<l:l i="40">ḋ</l:l>
+<l:l i="40">Ḍ</l:l>
+<l:l i="40">á¸</l:l>
+<l:l i="40">Ḏ</l:l>
+<l:l i="40">á¸</l:l>
+<l:l i="40">á¸</l:l>
+<l:l i="40">ḑ</l:l>
+<l:l i="40">Ḓ</l:l>
+<l:l i="40">ḓ</l:l>
+<l:l i="50">E</l:l>
+<l:l i="50">e</l:l>
+<l:l i="50">È</l:l>
+<l:l i="50">è</l:l>
+<l:l i="50">É</l:l>
+<l:l i="50">é</l:l>
+<l:l i="50">Ê</l:l>
+<l:l i="50">ê</l:l>
+<l:l i="50">Ë</l:l>
+<l:l i="50">ë</l:l>
+<l:l i="50">Ä’</l:l>
+<l:l i="50">Ä“</l:l>
+<l:l i="50">Ä”</l:l>
+<l:l i="50">Ä•</l:l>
+<l:l i="50">Ä–</l:l>
+<l:l i="50">Ä—</l:l>
+<l:l i="50">Ę</l:l>
+<l:l i="50">Ä™</l:l>
+<l:l i="50">Äš</l:l>
+<l:l i="50">Ä›</l:l>
+<l:l i="50">È„</l:l>
+<l:l i="50">È…</l:l>
+<l:l i="50">Ȇ</l:l>
+<l:l i="50">ȇ</l:l>
+<l:l i="50">Ȩ</l:l>
+<l:l i="50">È©</l:l>
+<l:l i="50">Ḕ</l:l>
+<l:l i="50">ḕ</l:l>
+<l:l i="50">Ḗ</l:l>
+<l:l i="50">ḗ</l:l>
+<l:l i="50">Ḙ</l:l>
+<l:l i="50">ḙ</l:l>
+<l:l i="50">Ḛ</l:l>
+<l:l i="50">ḛ</l:l>
+<l:l i="50">Ḝ</l:l>
+<l:l i="50">á¸</l:l>
+<l:l i="50">Ẹ</l:l>
+<l:l i="50">ẹ</l:l>
+<l:l i="50">Ẻ</l:l>
+<l:l i="50">ẻ</l:l>
+<l:l i="50">Ẽ</l:l>
+<l:l i="50">ẽ</l:l>
+<l:l i="50">Ế</l:l>
+<l:l i="50">ế</l:l>
+<l:l i="50">Ề</l:l>
+<l:l i="50">á»</l:l>
+<l:l i="50">Ể</l:l>
+<l:l i="50">ể</l:l>
+<l:l i="50">Ễ</l:l>
+<l:l i="50">á»…</l:l>
+<l:l i="50">Ệ</l:l>
+<l:l i="50">ệ</l:l>
+<l:l i="60">F</l:l>
+<l:l i="60">f</l:l>
+<l:l i="60">Æ‘</l:l>
+<l:l i="60">Æ’</l:l>
+<l:l i="60">Ḟ</l:l>
+<l:l i="60">ḟ</l:l>
+<l:l i="70">G</l:l>
+<l:l i="70">g</l:l>
+<l:l i="70">Ĝ</l:l>
+<l:l i="70">Ä</l:l>
+<l:l i="70">Äž</l:l>
+<l:l i="70">ÄŸ</l:l>
+<l:l i="70">Ä </l:l>
+<l:l i="70">Ä¡</l:l>
+<l:l i="70">Ä¢</l:l>
+<l:l i="70">Ä£</l:l>
+<l:l i="70">Æ“</l:l>
+<l:l i="70">É </l:l>
+<l:l i="70">Ǥ</l:l>
+<l:l i="70">Ç¥</l:l>
+<l:l i="70">Ǧ</l:l>
+<l:l i="70">ǧ</l:l>
+<l:l i="70">Ç´</l:l>
+<l:l i="70">ǵ</l:l>
+<l:l i="70">Ḡ</l:l>
+<l:l i="70">ḡ</l:l>
+<l:l i="80">H</l:l>
+<l:l i="80">h</l:l>
+<l:l i="80">Ĥ</l:l>
+<l:l i="80">Ä¥</l:l>
+<l:l i="80">Ħ</l:l>
+<l:l i="80">ħ</l:l>
+<l:l i="80">Èž</l:l>
+<l:l i="80">ÈŸ</l:l>
+<l:l i="80">ɦ</l:l>
+<l:l i="80">Ḣ</l:l>
+<l:l i="80">ḣ</l:l>
+<l:l i="80">Ḥ</l:l>
+<l:l i="80">ḥ</l:l>
+<l:l i="80">Ḧ</l:l>
+<l:l i="80">ḧ</l:l>
+<l:l i="80">Ḩ</l:l>
+<l:l i="80">ḩ</l:l>
+<l:l i="80">Ḫ</l:l>
+<l:l i="80">ḫ</l:l>
+<l:l i="80">ẖ</l:l>
+<l:l i="90">I</l:l>
+<l:l i="90">i</l:l>
+<l:l i="90">Ì</l:l>
+<l:l i="90">ì</l:l>
+<l:l i="90">Ã</l:l>
+<l:l i="90">í</l:l>
+<l:l i="90">ÃŽ</l:l>
+<l:l i="90">î</l:l>
+<l:l i="90">Ã</l:l>
+<l:l i="90">ï</l:l>
+<l:l i="90">Ĩ</l:l>
+<l:l i="90">Ä©</l:l>
+<l:l i="90">Ī</l:l>
+<l:l i="90">Ä«</l:l>
+<l:l i="90">Ĭ</l:l>
+<l:l i="90">Ä­</l:l>
+<l:l i="90">Ä®</l:l>
+<l:l i="90">į</l:l>
+<l:l i="90">Ä°</l:l>
+<l:l i="90">Æ—</l:l>
+<l:l i="90">ɨ</l:l>
+<l:l i="90">Ç</l:l>
+<l:l i="90">Ç</l:l>
+<l:l i="90">Ȉ</l:l>
+<l:l i="90">ȉ</l:l>
+<l:l i="90">ÈŠ</l:l>
+<l:l i="90">È‹</l:l>
+<l:l i="90">Ḭ</l:l>
+<l:l i="90">ḭ</l:l>
+<l:l i="90">Ḯ</l:l>
+<l:l i="90">ḯ</l:l>
+<l:l i="90">Ỉ</l:l>
+<l:l i="90">ỉ</l:l>
+<l:l i="90">Ị</l:l>
+<l:l i="90">ị</l:l>
+<l:l i="100">J</l:l>
+<l:l i="100">j</l:l>
+<l:l i="100">Ä´</l:l>
+<l:l i="100">ĵ</l:l>
+<l:l i="100">Ç°</l:l>
+<l:l i="100">Ê</l:l>
+<l:l i="110">K</l:l>
+<l:l i="110">k</l:l>
+<l:l i="110">Ķ</l:l>
+<l:l i="110">Ä·</l:l>
+<l:l i="110">Ƙ</l:l>
+<l:l i="110">Æ™</l:l>
+<l:l i="110">Ǩ</l:l>
+<l:l i="110">Ç©</l:l>
+<l:l i="110">Ḱ</l:l>
+<l:l i="110">ḱ</l:l>
+<l:l i="110">Ḳ</l:l>
+<l:l i="110">ḳ</l:l>
+<l:l i="110">Ḵ</l:l>
+<l:l i="110">ḵ</l:l>
+<l:l i="120">L</l:l>
+<l:l i="120">l</l:l>
+<l:l i="120">Ĺ</l:l>
+<l:l i="120">ĺ</l:l>
+<l:l i="120">Ä»</l:l>
+<l:l i="120">ļ</l:l>
+<l:l i="120">Ľ</l:l>
+<l:l i="120">ľ</l:l>
+<l:l i="120">Ä¿</l:l>
+<l:l i="120">Å€</l:l>
+<l:l i="120">Å</l:l>
+<l:l i="120">Å‚</l:l>
+<l:l i="120">Æš</l:l>
+<l:l i="120">Lj</l:l>
+<l:l i="120">È´</l:l>
+<l:l i="120">É«</l:l>
+<l:l i="120">ɬ</l:l>
+<l:l i="120">É­</l:l>
+<l:l i="120">Ḷ</l:l>
+<l:l i="120">ḷ</l:l>
+<l:l i="120">Ḹ</l:l>
+<l:l i="120">ḹ</l:l>
+<l:l i="120">Ḻ</l:l>
+<l:l i="120">ḻ</l:l>
+<l:l i="120">Ḽ</l:l>
+<l:l i="120">ḽ</l:l>
+<l:l i="130">M</l:l>
+<l:l i="130">m</l:l>
+<l:l i="130">ɱ</l:l>
+<l:l i="130">Ḿ</l:l>
+<l:l i="130">ḿ</l:l>
+<l:l i="130">á¹€</l:l>
+<l:l i="130">á¹</l:l>
+<l:l i="130">Ṃ</l:l>
+<l:l i="130">ṃ</l:l>
+<l:l i="140">N</l:l>
+<l:l i="140">n</l:l>
+<l:l i="140">Ñ</l:l>
+<l:l i="140">ñ</l:l>
+<l:l i="140">Ń</l:l>
+<l:l i="140">Å„</l:l>
+<l:l i="140">Å…</l:l>
+<l:l i="140">ņ</l:l>
+<l:l i="140">Ň</l:l>
+<l:l i="140">ň</l:l>
+<l:l i="140">Æ</l:l>
+<l:l i="140">ɲ</l:l>
+<l:l i="140">Æž</l:l>
+<l:l i="140">È </l:l>
+<l:l i="140">Ç‹</l:l>
+<l:l i="140">Ǹ</l:l>
+<l:l i="140">ǹ</l:l>
+<l:l i="140">ȵ</l:l>
+<l:l i="140">ɳ</l:l>
+<l:l i="140">Ṅ</l:l>
+<l:l i="140">á¹…</l:l>
+<l:l i="140">Ṇ</l:l>
+<l:l i="140">ṇ</l:l>
+<l:l i="140">Ṉ</l:l>
+<l:l i="140">ṉ</l:l>
+<l:l i="140">Ṋ</l:l>
+<l:l i="140">ṋ</l:l>
+<l:l i="150">O</l:l>
+<l:l i="150">o</l:l>
+<l:l i="150">Ã’</l:l>
+<l:l i="150">ò</l:l>
+<l:l i="150">Ó</l:l>
+<l:l i="150">ó</l:l>
+<l:l i="150">Ô</l:l>
+<l:l i="150">ô</l:l>
+<l:l i="150">Õ</l:l>
+<l:l i="150">õ</l:l>
+<l:l i="150">Ö</l:l>
+<l:l i="150">ö</l:l>
+<l:l i="150">Ø</l:l>
+<l:l i="150">ø</l:l>
+<l:l i="150">Ō</l:l>
+<l:l i="150">Å</l:l>
+<l:l i="150">ÅŽ</l:l>
+<l:l i="150">Å</l:l>
+<l:l i="150">Å</l:l>
+<l:l i="150">Å‘</l:l>
+<l:l i="150">ÆŸ</l:l>
+<l:l i="150">Æ </l:l>
+<l:l i="150">Æ¡</l:l>
+<l:l i="150">Ç‘</l:l>
+<l:l i="150">Ç’</l:l>
+<l:l i="150">Ǫ</l:l>
+<l:l i="150">Ç«</l:l>
+<l:l i="150">Ǭ</l:l>
+<l:l i="150">Ç­</l:l>
+<l:l i="150">Ǿ</l:l>
+<l:l i="150">Ç¿</l:l>
+<l:l i="150">Ȍ</l:l>
+<l:l i="150">È</l:l>
+<l:l i="150">ÈŽ</l:l>
+<l:l i="150">È</l:l>
+<l:l i="150">Ȫ</l:l>
+<l:l i="150">È«</l:l>
+<l:l i="150">Ȭ</l:l>
+<l:l i="150">È­</l:l>
+<l:l i="150">È®</l:l>
+<l:l i="150">ȯ</l:l>
+<l:l i="150">È°</l:l>
+<l:l i="150">ȱ</l:l>
+<l:l i="150">Ṍ</l:l>
+<l:l i="150">á¹</l:l>
+<l:l i="150">Ṏ</l:l>
+<l:l i="150">á¹</l:l>
+<l:l i="150">á¹</l:l>
+<l:l i="150">ṑ</l:l>
+<l:l i="150">á¹’</l:l>
+<l:l i="150">ṓ</l:l>
+<l:l i="150">Ọ</l:l>
+<l:l i="150">á»</l:l>
+<l:l i="150">Ỏ</l:l>
+<l:l i="150">á»</l:l>
+<l:l i="150">á»</l:l>
+<l:l i="150">ố</l:l>
+<l:l i="150">á»’</l:l>
+<l:l i="150">ồ</l:l>
+<l:l i="150">á»”</l:l>
+<l:l i="150">ổ</l:l>
+<l:l i="150">á»–</l:l>
+<l:l i="150">á»—</l:l>
+<l:l i="150">Ộ</l:l>
+<l:l i="150">á»™</l:l>
+<l:l i="150">Ớ</l:l>
+<l:l i="150">á»›</l:l>
+<l:l i="150">Ờ</l:l>
+<l:l i="150">á»</l:l>
+<l:l i="150">Ở</l:l>
+<l:l i="150">ở</l:l>
+<l:l i="150">á» </l:l>
+<l:l i="150">ỡ</l:l>
+<l:l i="150">Ợ</l:l>
+<l:l i="150">ợ</l:l>
+<l:l i="160">P</l:l>
+<l:l i="160">p</l:l>
+<l:l i="160">Ƥ</l:l>
+<l:l i="160">Æ¥</l:l>
+<l:l i="160">á¹”</l:l>
+<l:l i="160">ṕ</l:l>
+<l:l i="160">á¹–</l:l>
+<l:l i="160">á¹—</l:l>
+<l:l i="170">Q</l:l>
+<l:l i="170">q</l:l>
+<l:l i="170">Ê </l:l>
+<l:l i="180">R</l:l>
+<l:l i="180">r</l:l>
+<l:l i="180">Å”</l:l>
+<l:l i="180">Å•</l:l>
+<l:l i="180">Å–</l:l>
+<l:l i="180">Å—</l:l>
+<l:l i="180">Ř</l:l>
+<l:l i="180">Å™</l:l>
+<l:l i="180">È</l:l>
+<l:l i="180">È‘</l:l>
+<l:l i="180">È’</l:l>
+<l:l i="180">È“</l:l>
+<l:l i="180">ɼ</l:l>
+<l:l i="180">ɽ</l:l>
+<l:l i="180">ɾ</l:l>
+<l:l i="180">Ṙ</l:l>
+<l:l i="180">á¹™</l:l>
+<l:l i="180">Ṛ</l:l>
+<l:l i="180">á¹›</l:l>
+<l:l i="180">Ṝ</l:l>
+<l:l i="180">á¹</l:l>
+<l:l i="180">Ṟ</l:l>
+<l:l i="180">ṟ</l:l>
+<l:l i="190">S</l:l>
+<l:l i="190">s</l:l>
+<l:l i="190">Åš</l:l>
+<l:l i="190">Å›</l:l>
+<l:l i="190">Ŝ</l:l>
+<l:l i="190">Å</l:l>
+<l:l i="190">Åž</l:l>
+<l:l i="190">ÅŸ</l:l>
+<l:l i="190">Å </l:l>
+<l:l i="190">Å¡</l:l>
+<l:l i="190">Ș</l:l>
+<l:l i="190">È™</l:l>
+<l:l i="190">Ê‚</l:l>
+<l:l i="190">á¹ </l:l>
+<l:l i="190">ṡ</l:l>
+<l:l i="190">á¹¢</l:l>
+<l:l i="190">á¹£</l:l>
+<l:l i="190">Ṥ</l:l>
+<l:l i="190">á¹¥</l:l>
+<l:l i="190">Ṧ</l:l>
+<l:l i="190">ṧ</l:l>
+<l:l i="190">Ṩ</l:l>
+<l:l i="190">ṩ</l:l>
+<l:l i="200">T</l:l>
+<l:l i="200">t</l:l>
+<l:l i="200">Å¢</l:l>
+<l:l i="200">Å£</l:l>
+<l:l i="200">Ť</l:l>
+<l:l i="200">Å¥</l:l>
+<l:l i="200">Ŧ</l:l>
+<l:l i="200">ŧ</l:l>
+<l:l i="200">Æ«</l:l>
+<l:l i="200">Ƭ</l:l>
+<l:l i="200">Æ­</l:l>
+<l:l i="200">Æ®</l:l>
+<l:l i="200">ʈ</l:l>
+<l:l i="200">Èš</l:l>
+<l:l i="200">È›</l:l>
+<l:l i="200">ȶ</l:l>
+<l:l i="200">Ṫ</l:l>
+<l:l i="200">ṫ</l:l>
+<l:l i="200">Ṭ</l:l>
+<l:l i="200">á¹­</l:l>
+<l:l i="200">á¹®</l:l>
+<l:l i="200">ṯ</l:l>
+<l:l i="200">á¹°</l:l>
+<l:l i="200">á¹±</l:l>
+<l:l i="200">ẗ</l:l>
+<l:l i="210">U</l:l>
+<l:l i="210">u</l:l>
+<l:l i="210">Ù</l:l>
+<l:l i="210">ù</l:l>
+<l:l i="210">Ú</l:l>
+<l:l i="210">ú</l:l>
+<l:l i="210">Û</l:l>
+<l:l i="210">û</l:l>
+<l:l i="210">Ü</l:l>
+<l:l i="210">ü</l:l>
+<l:l i="210">Ũ</l:l>
+<l:l i="210">Å©</l:l>
+<l:l i="210">Ū</l:l>
+<l:l i="210">Å«</l:l>
+<l:l i="210">Ŭ</l:l>
+<l:l i="210">Å­</l:l>
+<l:l i="210">Å®</l:l>
+<l:l i="210">ů</l:l>
+<l:l i="210">Å°</l:l>
+<l:l i="210">ű</l:l>
+<l:l i="210">Ų</l:l>
+<l:l i="210">ų</l:l>
+<l:l i="210">Ư</l:l>
+<l:l i="210">Æ°</l:l>
+<l:l i="210">Ç“</l:l>
+<l:l i="210">Ç”</l:l>
+<l:l i="210">Ç•</l:l>
+<l:l i="210">Ç–</l:l>
+<l:l i="210">Ç—</l:l>
+<l:l i="210">ǘ</l:l>
+<l:l i="210">Ç™</l:l>
+<l:l i="210">Çš</l:l>
+<l:l i="210">Ç›</l:l>
+<l:l i="210">ǜ</l:l>
+<l:l i="210">È”</l:l>
+<l:l i="210">È•</l:l>
+<l:l i="210">È–</l:l>
+<l:l i="210">È—</l:l>
+<l:l i="210">á¹²</l:l>
+<l:l i="210">á¹³</l:l>
+<l:l i="210">á¹´</l:l>
+<l:l i="210">á¹µ</l:l>
+<l:l i="210">Ṷ</l:l>
+<l:l i="210">á¹·</l:l>
+<l:l i="210">Ṹ</l:l>
+<l:l i="210">á¹¹</l:l>
+<l:l i="210">Ṻ</l:l>
+<l:l i="210">á¹»</l:l>
+<l:l i="210">Ụ</l:l>
+<l:l i="210">ụ</l:l>
+<l:l i="210">Ủ</l:l>
+<l:l i="210">ủ</l:l>
+<l:l i="210">Ứ</l:l>
+<l:l i="210">ứ</l:l>
+<l:l i="210">Ừ</l:l>
+<l:l i="210">ừ</l:l>
+<l:l i="210">Ử</l:l>
+<l:l i="210">á»­</l:l>
+<l:l i="210">á»®</l:l>
+<l:l i="210">ữ</l:l>
+<l:l i="210">á»°</l:l>
+<l:l i="210">á»±</l:l>
+<l:l i="220">V</l:l>
+<l:l i="220">v</l:l>
+<l:l i="220">Ʋ</l:l>
+<l:l i="220">Ê‹</l:l>
+<l:l i="220">á¹¼</l:l>
+<l:l i="220">á¹½</l:l>
+<l:l i="220">á¹¾</l:l>
+<l:l i="220">ṿ</l:l>
+<l:l i="230">W</l:l>
+<l:l i="230">w</l:l>
+<l:l i="230">Å´</l:l>
+<l:l i="230">ŵ</l:l>
+<l:l i="230">Ẁ</l:l>
+<l:l i="230">áº</l:l>
+<l:l i="230">Ẃ</l:l>
+<l:l i="230">ẃ</l:l>
+<l:l i="230">Ẅ</l:l>
+<l:l i="230">ẅ</l:l>
+<l:l i="230">Ẇ</l:l>
+<l:l i="230">ẇ</l:l>
+<l:l i="230">Ẉ</l:l>
+<l:l i="230">ẉ</l:l>
+<l:l i="230">ẘ</l:l>
+<l:l i="240">X</l:l>
+<l:l i="240">x</l:l>
+<l:l i="240">Ẋ</l:l>
+<l:l i="240">ẋ</l:l>
+<l:l i="240">Ẍ</l:l>
+<l:l i="240">áº</l:l>
+<l:l i="250">Y</l:l>
+<l:l i="250">y</l:l>
+<l:l i="250">Ã</l:l>
+<l:l i="250">ý</l:l>
+<l:l i="250">ÿ</l:l>
+<l:l i="250">Ÿ</l:l>
+<l:l i="250">Ŷ</l:l>
+<l:l i="250">Å·</l:l>
+<l:l i="250">Ƴ</l:l>
+<l:l i="250">Æ´</l:l>
+<l:l i="250">Ȳ</l:l>
+<l:l i="250">ȳ</l:l>
+<l:l i="250">Ẏ</l:l>
+<l:l i="250">áº</l:l>
+<l:l i="250">ẙ</l:l>
+<l:l i="250">Ỳ</l:l>
+<l:l i="250">ỳ</l:l>
+<l:l i="250">á»´</l:l>
+<l:l i="250">ỵ</l:l>
+<l:l i="250">Ỷ</l:l>
+<l:l i="250">á»·</l:l>
+<l:l i="250">Ỹ</l:l>
+<l:l i="250">ỹ</l:l>
+<l:l i="260">Z</l:l>
+<l:l i="260">z</l:l>
+<l:l i="260">Ź</l:l>
+<l:l i="260">ź</l:l>
+<l:l i="260">Å»</l:l>
+<l:l i="260">ż</l:l>
+<l:l i="260">Ž</l:l>
+<l:l i="260">ž</l:l>
+<l:l i="260">Ƶ</l:l>
+<l:l i="260">ƶ</l:l>
+<l:l i="260">Ȥ</l:l>
+<l:l i="260">È¥</l:l>
+<l:l i="260">Ê</l:l>
+<l:l i="260">Ê‘</l:l>
+<l:l i="260">áº</l:l>
+<l:l i="260">ẑ</l:l>
+<l:l i="260">Ẓ</l:l>
+<l:l i="260">ẓ</l:l>
+<l:l i="260">Ẕ</l:l>
+<l:l i="260">ẕ</l:l>
+</l:letters>
+</l:l10n>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/fa.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/fa.xml
new file mode 100644
index 0000000..257dc0b
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/fa.xml
@@ -0,0 +1,660 @@
+<?xml version="1.0" encoding="utf-8"?>
+<l:l10n xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0" language="fa" english-language-name="Farsi">
+
+<!-- * This file is generated automatically. -->
+<!-- * To submit changes to this file upstream (to the DocBook Project) -->
+<!-- * do not submit an edited version of this file. Instead, submit an -->
+<!-- * edited version of the source file at the following location: -->
+<!-- * -->
+<!-- * https://docbook.svn.sourceforge.net/svnroot/docbook/trunk/gentext/locale/fa.xml -->
+<!-- * -->
+<!-- * E-mail the edited fa.xml source file to: -->
+<!-- * -->
+<!-- * docbook-developers@lists.sourceforge.net -->
+
+<!-- ******************************************************************** -->
+
+<!-- This file is part of the XSL DocBook Stylesheet distribution. -->
+<!-- See ../README or http://docbook.sf.net/release/xsl/current/ for -->
+<!-- copyright and other information. -->
+
+<!-- ******************************************************************** -->
+<!-- In these files, % with a letter is used for a placeholder: -->
+<!-- %t is the current element's title -->
+<!-- %s is the current element's subtitle (if applicable)-->
+<!-- %n is the current element's number label-->
+<!-- %p is the current element's page number (if applicable)-->
+<!-- ******************************************************************** -->
+
+
+<l:gentext key="Abstract" text="چكيده"/>
+<l:gentext key="abstract" text="چكيده"/>
+<l:gentext key="Acknowledgements" text="تقدیرنامه ها"/>
+<l:gentext key="acknowledgements" text="تقدیرنامه ها"/>
+<l:gentext key="Answer" text="ج:"/>
+<l:gentext key="answer" text="ج:"/>
+<l:gentext key="Appendix" text="پيوست"/>
+<l:gentext key="appendix" text="پيوست"/>
+<l:gentext key="Article" text="مقاله"/>
+<l:gentext key="article" text="مقاله"/>
+<l:gentext key="Author" text="نویسنده"/>
+<l:gentext key="Bibliography" text="كتاب‌شناسی"/>
+<l:gentext key="bibliography" text="كتاب‌شناسی"/>
+<l:gentext key="Book" text="كتاب"/>
+<l:gentext key="book" text="كتاب"/>
+<l:gentext key="CAUTION" text="احتياط"/>
+<l:gentext key="Caution" text="احتياط"/>
+<l:gentext key="caution" text="احتياط"/>
+<l:gentext key="Chapter" text="Ùصل"/>
+<l:gentext key="chapter" text="Ùصل"/>
+<l:gentext key="Colophon" text="درباره‌ی نشريه"/>
+<l:gentext key="colophon" text="درباره‌ی نشريه"/>
+<l:gentext key="Copyright" text="حق طبع ونشر"/>
+<l:gentext key="copyright" text="حق طبع ونشر"/>
+<l:gentext key="Dedication" text="اهداء"/>
+<l:gentext key="dedication" text="اهداء"/>
+<l:gentext key="Edition" text="ويرايش"/>
+<l:gentext key="edition" text="ويرايش"/>
+<l:gentext key="Editor" text="ويرايش"/>
+<l:gentext key="Equation" text="معادله"/>
+<l:gentext key="equation" text="معادله"/>
+<l:gentext key="Example" text="مثال"/>
+<l:gentext key="example" text="مثال"/>
+<l:gentext key="Figure" text="شكل"/>
+<l:gentext key="figure" text="شكل"/>
+<l:gentext key="Glossary" text="واژه‌نامه"/>
+<l:gentext key="glossary" text="واژه‌نامه"/>
+<l:gentext key="GlossSee" text="ببیند"/>
+<l:gentext key="glosssee" text="ببیند"/>
+<l:gentext key="GlossSeeAlso" text="همچنین ببیند"/>
+<l:gentext key="glossseealso" text="همچنین ببیند"/>
+<l:gentext key="IMPORTANT" text="مهم"/>
+<l:gentext key="important" text="مهم"/>
+<l:gentext key="Important" text="مهم"/>
+<l:gentext key="Index" text="راهنما"/>
+<l:gentext key="index" text="راهنما"/>
+<l:gentext key="ISBN" text="شابک"/>
+<l:gentext key="isbn" text="شابک"/>
+<l:gentext key="LegalNotice" text="اخطار قانونی"/>
+<l:gentext key="legalnotice" text="اخطار قانونی"/>
+<l:gentext key="MsgAud" text="شنودگان"/>
+<l:gentext key="msgaud" text="شنودگان"/>
+<l:gentext key="MsgLevel" text="سطح پیام"/>
+<l:gentext key="msglevel" text="سطح پیام"/>
+<l:gentext key="MsgOrig" text="اصل"/>
+<l:gentext key="msgorig" text="اصل"/>
+<l:gentext key="NOTE" text="ياداشت"/>
+<l:gentext key="Note" text="ياداشت"/>
+<l:gentext key="note" text="ياداشت"/>
+<l:gentext key="Part" text="بخش"/>
+<l:gentext key="part" text="بخش"/>
+<l:gentext key="Preface" text="ديباچه"/>
+<l:gentext key="preface" text="ديباچه"/>
+<l:gentext key="Procedure" text="رويه"/>
+<l:gentext key="procedure" text="رويه"/>
+<l:gentext key="ProductionSet" text="توليد"/>
+<l:gentext key="PubDate" text="تاریخ انتشار"/>
+<l:gentext key="pubdate" text="تاریخ انتشار"/>
+<l:gentext key="Published" text="منتشر‌شده"/>
+<l:gentext key="published" text="منتشر‌شده"/>
+<l:gentext key="Publisher" text="منتشر‌شده"/>
+<l:gentext key="Qandadiv" text="پرسش و‌ پاسخ"/>
+<l:gentext key="qandadiv" text="پرسش و پاسخ"/>
+<l:gentext key="QandASet" text="سوالات متداول"/>
+<l:gentext key="Question" text=":پرسش"/>
+<l:gentext key="question" text=":پرسش"/>
+<l:gentext key="RefEntry" text="Ùقره"/>
+<l:gentext key="refentry" text="Ùقره"/>
+<l:gentext key="Reference" text="ارجاع"/>
+<l:gentext key="reference" text="ارجاع"/>
+<l:gentext key="References" text="ارجاع"/>
+<l:gentext key="RefName" text="نام"/>
+<l:gentext key="refname" text="نام"/>
+<l:gentext key="RefSection" text="قسمت"/>
+<l:gentext key="refsection" text="قسمت"/>
+<l:gentext key="RefSynopsisDiv" text="مختصر"/>
+<l:gentext key="refsynopsisdiv" text="مختصر"/>
+<l:gentext key="RevHistory" text="تاريخ بازبينی"/>
+<l:gentext key="revhistory" text="تاريخ بازبينی"/>
+<l:gentext key="revision" text="بازبينی"/>
+<l:gentext key="Revision" text="باز بينی"/>
+<l:gentext key="sect1" text="قسمت"/>
+<l:gentext key="sect2" text="قسمت"/>
+<l:gentext key="sect3" text="قسمت"/>
+<l:gentext key="sect4" text="قسمت"/>
+<l:gentext key="sect5" text="قسمت"/>
+<l:gentext key="section" text="قسمت"/>
+<l:gentext key="Section" text="قسمت"/>
+<l:gentext key="see" text="ببیند"/>
+<l:gentext key="See" text="ببیند"/>
+<l:gentext key="seealso" text="همچنین ببیند"/>
+<l:gentext key="Seealso" text="همچنین ببیند"/>
+<l:gentext key="SeeAlso" text="همچنین ببیند"/>
+<l:gentext key="set" text="مجموعه"/>
+<l:gentext key="Set" text="مجموعه"/>
+<l:gentext key="setindex" text="راهنمای مجموعه"/>
+<l:gentext key="SetIndex" text="راهنمای مجموعه"/>
+<l:gentext key="Sidebar" text="نوار کناری"/>
+<l:gentext key="sidebar" text="نوار کناری"/>
+<l:gentext key="step" text="گام"/>
+<l:gentext key="Step" text="گام"/>
+<l:gentext key="table" text="جدول"/>
+<l:gentext key="Table" text="جدول"/>
+<l:gentext key="task" text="وظیÙÙ‡"/>
+<l:gentext key="Task" text="وظیÙÙ‡"/>
+<l:gentext key="tip" text="نکته"/>
+<l:gentext key="TIP" text="نکته"/>
+<l:gentext key="Tip" text="نکته"/>
+<l:gentext key="Warning" text="هشدار"/>
+<l:gentext key="warning" text="هشدار"/>
+<l:gentext key="WARNING" text="هشدار"/>
+<l:gentext key="and" text="Ùˆ"/>
+<l:gentext key="by" text="توسط"/>
+<l:gentext key="Edited" text="ویرایش شده"/>
+<l:gentext key="edited" text="ویرایش شده"/>
+<l:gentext key="Editedby" text="ویرایستار"/>
+<l:gentext key="editedby" text="ویرایستار"/>
+<l:gentext key="in" text="در"/>
+<l:gentext key="lastlistcomma" text="،"/>
+<l:gentext key="listcomma" text="،"/>
+<l:gentext key="notes" text="ياداشت‌ها"/>
+<l:gentext key="Notes" text="ياداشت‌ها"/>
+<l:gentext key="Pgs" text="صÙحه"/>
+<l:gentext key="pgs" text="صÙحه"/>
+<l:gentext key="Revisedby" text=" :بازبينی شده بوسیله‌ی"/>
+<l:gentext key="revisedby" text=" :بازبينس شده بوسیله‌ی"/>
+<l:gentext key="TableNotes" text="ياداشت‌ها"/>
+<l:gentext key="tablenotes" text="ياداشت‌ها"/>
+<l:gentext key="TableofContents" text="Ùهرست"/>
+<l:gentext key="tableofcontents" text="Ùهرست"/>
+<l:gentext key="unexpectedelementname" text="نام عنصرغيرمنتظره"/>
+<l:gentext key="unsupported" text="پشتيبانی نشده"/>
+<l:gentext key="xrefto" text="ارجاع به"/>
+<l:gentext key="Authors" text="نویسندگان"/>
+<l:gentext key="copyeditor" text="اصلاح کننده کپی"/>
+<l:gentext key="graphicdesigner" text="طراحی گراÙیکی"/>
+<l:gentext key="productioneditor" text="اصلاح کننده محصول"/>
+<l:gentext key="technicaleditor" text="اصلاح کننده تکنیکی"/>
+<l:gentext key="translator" text="مترجم"/>
+<l:gentext key="listofequations" text="Ùهرست معادلات"/>
+<l:gentext key="ListofEquations" text="Ùهرست معادلات"/>
+<l:gentext key="ListofExamples" text="Ùهرست امثال"/>
+<l:gentext key="listofexamples" text="Ùهرست امثال"/>
+<l:gentext key="ListofFigures" text="Ùهرست اشکال"/>
+<l:gentext key="listoffigures" text="Ùهرست اشکال"/>
+<l:gentext key="ListofProcedures" text="Ùهرست روند‌ها"/>
+<l:gentext key="listofprocedures" text="Ùهرست روند‌ها"/>
+<l:gentext key="listoftables" text="Ùهرست جدول‌ها"/>
+<l:gentext key="ListofTables" text="Ùهرست جدول‌ها"/>
+<l:gentext key="ListofUnknown" text="Ùهرست نادانسته‌ها"/>
+<l:gentext key="listofunknown" text="Ùهرست نادانسته‌ها"/>
+<l:gentext key="nav-home" text="خانه"/>
+<l:gentext key="nav-next" text="بعدی"/>
+<l:gentext key="nav-next-sibling" text="هم‌نيای بعدی"/>
+<l:gentext key="nav-prev" text="قبلی"/>
+<l:gentext key="nav-prev-sibling" text="هم‌نيای قبلی"/>
+<l:gentext key="nav-up" text="بالا"/>
+<l:gentext key="nav-toc" text="Ùهرست"/>
+<l:gentext key="Draft" text="پيش‌نويس"/>
+<l:gentext key="above" text="در‌بالا"/>
+<l:gentext key="below" text="در‌پایین"/>
+<l:gentext key="sectioncalled" text="بخشی بنام"/>
+<l:gentext key="index symbols" text="سمبل‌های راهنما"/>
+<l:gentext key="writing-mode" text="rl-tb"/>
+<l:gentext key="lowercase.alpha" text="ا ب پ ت ث ج چ ح خ د ذ ر ز ژس ش ص ض ع غ ٠ق ک گ ل م ن و ه ی"/>
+<l:gentext key="uppercase.alpha" text="ا ب پ ت ث ج چ ح خ د ذ ر ز ژس ش ص ض ع غ ٠ق ک گ ل م ن و ه ی"/>
+<l:gentext key="normalize.sort.input" text="AaÀàÃáÂâÃãÄäÅåĀÄĂ㥹ÇǎǞǟǠǡǺǻȀÈȂȃȦȧḀá¸áºšáº áº¡áº¢áº£áº¤áº¥áº¦áº§áº¨áº©áºªáº«áº¬áº­áº®áº¯áº°áº±áº²áº³áº´áºµáº¶áº·BbÆ€ÆɓƂƃḂḃḄḅḆḇCcÇçĆćĈĉĊċČÄƇƈɕḈḉDdÄŽÄÄđƊɗƋƌDžDzȡɖḊḋḌá¸á¸Žá¸á¸á¸‘ḒḓEeÈèÉéÊêËëĒēĔĕĖėĘęĚěȄȅȆȇȨȩḔḕḖḗḘḙḚḛḜá¸áº¸áº¹áººáº»áº¼áº½áº¾áº¿á»€á»á»‚ểỄễỆệFfƑƒḞḟGgÄœÄĞğĠġĢģƓɠǤǥǦǧǴǵḠḡHhĤĥĦħȞȟɦḢḣḤḥḦḧḨḩḪḫẖIiÌìÃíÎîÃïĨĩĪīĬĭĮįİƗɨÇÇȈȉȊȋḬḭḮḯỈỉỊịJjĴĵǰÊKkĶķƘƙǨǩḰḱḲḳḴḵLlĹĺĻļĽľĿŀÅłƚLjȴɫɬɭḶḷḸḹḺḻḼḽMmɱḾḿṀá¹á¹‚ṃNnÑñŃńŅņŇňÆɲƞȠNjǸǹȵɳṄṅṆṇṈṉṊṋOoÒòÓóÔôÕõÖöØøŌÅÅŽÅÅőƟƠơǑǒǪǫǬǭǾǿȌÈÈŽÈȪȫȬȭȮȯȰȱṌá¹á¹Žá¹á¹á¹‘ṒṓỌá»á»Žá»á»á»‘ỒồỔổỖỗỘộỚớỜá»á»žá»Ÿá» á»¡á»¢á»£PpƤƥṔṕṖṗQqÊ RrŔŕŖŗŘřÈȑȒȓɼɽɾṘṙṚṛṜá¹á¹žá¹ŸSsŚśŜÅŞşŠšȘșʂṠṡṢṣṤṥṦṧṨṩTtŢţŤťŦŧƫƬƭƮʈȚțȶṪṫṬṭṮṯṰṱẗUuÙùÚúÛûÜüŨũŪūŬŭŮůŰűŲųƯưǓǔǕǖǗǘǙǚǛǜȔȕȖȗṲṳṴṵṶṷṸṹṺṻỤụỦủỨứỪừỬửỮữỰựVvƲʋṼṽṾṿWwŴŵẀáºáº‚ẃẄẅẆẇẈẉẘXxẊẋẌáºYyÃýÿŸŶŷƳƴȲȳẎáºáº™á»²á»³á»´á»µá»¶á»·á»¸á»¹ZzŹźŻżŽžƵƶȤȥÊÊ‘áºáº‘ẒẓẔẕẕ" lang="en"/>
+<l:gentext key="normalize.sort.output" text="AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBCCCCCCCCCCCCCCCCCDDDDDDDDDDDDDDDDDDDDDDDDEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEFFFFFFGGGGGGGGGGGGGGGGGGGGHHHHHHHHHHHHHHHHHHHHIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIJJJJJJKKKKKKKKKKKKKKLLLLLLLLLLLLLLLLLLLLLLLLLLMMMMMMMMMNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOPPPPPPPPQQQRRRRRRRRRRRRRRRRRRRRRRRSSSSSSSSSSSSSSSSSSSSSSSTTTTTTTTTTTTTTTTTTTTTTTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUVVVVVVVVWWWWWWWWWWWWWWWXXXXXXYYYYYYYYYYYYYYYYYYYYYYYZZZZZZZZZZZZZZZZZZZZZ" lang="en"/>
+<l:dingbat key="startquote" text="“"/>
+<l:dingbat key="endquote" text="â€"/>
+<l:dingbat key="nestedstartquote" text="‘"/>
+<l:dingbat key="nestedendquote" text="’"/>
+<l:dingbat key="singlestartquote" text="‘"/>
+<l:dingbat key="singleendquote" text="’"/>
+<l:dingbat key="bullet" text="•"/>
+<l:gentext key="hyphenation-character" text="-"/>
+<l:gentext key="hyphenation-push-character-count" text="2"/>
+<l:gentext key="hyphenation-remain-character-count" text="2"/>
+<l:context name="styles"><l:template name="person-name" text="first-last"/>
+</l:context>
+<l:context name="title"><l:template name="abstract" text="%t"/>
+<l:template name="acknowledgements" text="%t" lang="en"/>
+<l:template name="answer" text="%t"/>
+<l:template name="appendix" text="&#10; پيوست %n. %t"/>
+<l:template name="article" text="%t"/>
+<l:template name="authorblurb" text="%t"/>
+<l:template name="bibliodiv" text="%t"/>
+<l:template name="biblioentry" text="%t"/>
+<l:template name="bibliography" text="%t"/>
+<l:template name="bibliolist" text="%t"/>
+<l:template name="bibliomixed" text="%t"/>
+<l:template name="bibliomset" text="%t"/>
+<l:template name="biblioset" text="%t"/>
+<l:template name="blockquote" text="%t"/>
+<l:template name="book" text="%t"/>
+<l:template name="calloutlist" text="%t"/>
+<l:template name="caution" text="%t"/>
+<l:template name="chapter" text="&#10; Ùصل %n. %t"/>
+<l:template name="colophon" text="%t"/>
+<l:template name="dedication" text="%t"/>
+<l:template name="equation" text="&#10; معادله %n. %t"/>
+<l:template name="example" text="&#10; مثال %n. %t"/>
+<l:template name="figure" text="&#10; شكل %n. %t"/>
+<l:template name="foil" text="%t"/>
+<l:template name="foilgroup" text="%t"/>
+<l:template name="formalpara" text="%t"/>
+<l:template name="glossary" text="%t"/>
+<l:template name="glossdiv" text="%t"/>
+<l:template name="glosslist" text="%t"/>
+<l:template name="glossentry" text="%t"/>
+<l:template name="important" text="%t"/>
+<l:template name="index" text="%t"/>
+<l:template name="indexdiv" text="%t"/>
+<l:template name="itemizedlist" text="%t"/>
+<l:template name="legalnotice" text="%t"/>
+<l:template name="listitem" text=""/>
+<l:template name="lot" text="%t"/>
+<l:template name="msg" text="%t"/>
+<l:template name="msgexplan" text="%t"/>
+<l:template name="msgmain" text="%t"/>
+<l:template name="msgrel" text="%t"/>
+<l:template name="msgset" text="%t"/>
+<l:template name="msgsub" text="%t"/>
+<l:template name="note" text="%t"/>
+<l:template name="orderedlist" text="%t"/>
+<l:template name="part" text="&#10; بخش %n. %t"/>
+<l:template name="partintro" text="%t"/>
+<l:template name="preface" text="%t"/>
+<l:template name="procedure" text="%t"/>
+<l:template name="procedure.formal" text="&#10; رويه %n. %t"/>
+<l:template name="productionset" text="%t"/>
+<l:template name="productionset.formal" text="&#10; توليد %n"/>
+<l:template name="qandadiv" text="%t"/>
+<l:template name="qandaentry" text="%t"/>
+<l:template name="qandaset" text="%t"/>
+<l:template name="question" text="%t"/>
+<l:template name="refentry" text="%t"/>
+<l:template name="reference" text="%t"/>
+<l:template name="refsection" text="%t"/>
+<l:template name="refsect1" text="%t"/>
+<l:template name="refsect2" text="%t"/>
+<l:template name="refsect3" text="%t"/>
+<l:template name="refsynopsisdiv" text="%t"/>
+<l:template name="refsynopsisdivinfo" text="%t"/>
+<l:template name="segmentedlist" text="%t"/>
+<l:template name="set" text="%t"/>
+<l:template name="setindex" text="%t"/>
+<l:template name="sidebar" text="%t"/>
+<l:template name="step" text="%t"/>
+<l:template name="table" text="&#10; جدول %n. %t"/>
+<l:template name="task" text="%t"/>
+<l:template name="tasksummary" text="%t" lang="en"/>
+<l:template name="taskprerequisites" text="%t" lang="en"/>
+<l:template name="taskrelated" text="%t" lang="en"/>
+<l:template name="tip" text="%t"/>
+<l:template name="toc" text="%t"/>
+<l:template name="variablelist" text="%t"/>
+<l:template name="varlistentry" text=""/>
+<l:template name="warning" text="%t"/>
+</l:context>
+<l:context name="title-unnumbered"><l:template name="appendix" text="%t"/>
+<l:template name="article/appendix" text="%t"/>
+<l:template name="bridgehead" text="%t"/>
+<l:template name="chapter" text="%t"/>
+<l:template name="sect1" text="%t"/>
+<l:template name="sect2" text="%t"/>
+<l:template name="sect3" text="%t"/>
+<l:template name="sect4" text="%t"/>
+<l:template name="sect5" text="%t"/>
+<l:template name="section" text="%t"/>
+<l:template name="simplesect" text="%t"/>
+<l:template name="part" text="%t" lang="en"/>
+</l:context>
+<l:context name="title-numbered"><l:template name="appendix" text="&#10; پيوست %n. %t"/>
+<l:template name="article/appendix" text="%n. %t"/>
+<l:template name="bridgehead" text="%n. %t"/>
+<l:template name="chapter" text="&#10; Ùصل %n. %t"/>
+<l:template name="part" text="&#10; بخش %n. %t"/>
+<l:template name="sect1" text="%n. %t"/>
+<l:template name="sect2" text="%n. %t"/>
+<l:template name="sect3" text="%n. %t"/>
+<l:template name="sect4" text="%n. %t"/>
+<l:template name="sect5" text="%n. %t"/>
+<l:template name="section" text="%n. %t"/>
+<l:template name="simplesect" text="%t"/>
+</l:context>
+<l:context name="subtitle"><l:template name="appendix" text="%s"/>
+<l:template name="acknowledgements" text="%s" lang="en"/>
+<l:template name="article" text="%s"/>
+<l:template name="bibliodiv" text="%s"/>
+<l:template name="biblioentry" text="%s"/>
+<l:template name="bibliography" text="%s"/>
+<l:template name="bibliomixed" text="%s"/>
+<l:template name="bibliomset" text="%s"/>
+<l:template name="biblioset" text="%s"/>
+<l:template name="book" text="%s"/>
+<l:template name="chapter" text="%s"/>
+<l:template name="colophon" text="%s"/>
+<l:template name="dedication" text="%s"/>
+<l:template name="glossary" text="%s"/>
+<l:template name="glossdiv" text="%s"/>
+<l:template name="index" text="%s"/>
+<l:template name="indexdiv" text="%s"/>
+<l:template name="lot" text="%s"/>
+<l:template name="part" text="%s"/>
+<l:template name="partintro" text="%s"/>
+<l:template name="preface" text="%s"/>
+<l:template name="refentry" text="%s"/>
+<l:template name="reference" text="%s"/>
+<l:template name="refsection" text="%s"/>
+<l:template name="refsect1" text="%s"/>
+<l:template name="refsect2" text="%s"/>
+<l:template name="refsect3" text="%s"/>
+<l:template name="refsynopsisdiv" text="%s"/>
+<l:template name="sect1" text="%s"/>
+<l:template name="sect2" text="%s"/>
+<l:template name="sect3" text="%s"/>
+<l:template name="sect4" text="%s"/>
+<l:template name="sect5" text="%s"/>
+<l:template name="section" text="%s"/>
+<l:template name="set" text="%s"/>
+<l:template name="setindex" text="%s"/>
+<l:template name="sidebar" text="%s"/>
+<l:template name="simplesect" text="%s"/>
+<l:template name="toc" text="%s"/>
+</l:context>
+<l:context name="xref"><l:template name="abstract" text="%t"/>
+<l:template name="acknowledgements" text="%t" lang="en"/>
+<l:template name="answer" text="&#10; ج: %n"/>
+<l:template name="appendix" text="%t"/>
+<l:template name="article" text="%t"/>
+<l:template name="authorblurb" text="%t"/>
+<l:template name="bibliodiv" text="%t"/>
+<l:template name="bibliography" text="%t"/>
+<l:template name="bibliomset" text="%t"/>
+<l:template name="biblioset" text="%t"/>
+<l:template name="blockquote" text="%t"/>
+<l:template name="book" text="%t"/>
+<l:template name="calloutlist" text="%t"/>
+<l:template name="caution" text="%t"/>
+<l:template name="chapter" text="%t"/>
+<l:template name="colophon" text="%t"/>
+<l:template name="constraintdef" text="%t"/>
+<l:template name="dedication" text="%t"/>
+<l:template name="equation" text="%t"/>
+<l:template name="example" text="%t"/>
+<l:template name="figure" text="%t"/>
+<l:template name="foil" text="%t"/>
+<l:template name="foilgroup" text="%t"/>
+<l:template name="formalpara" text="%t"/>
+<l:template name="glossary" text="%t"/>
+<l:template name="glossdiv" text="%t"/>
+<l:template name="important" text="%t"/>
+<l:template name="index" text="%t"/>
+<l:template name="indexdiv" text="%t"/>
+<l:template name="itemizedlist" text="%t"/>
+<l:template name="legalnotice" text="%t"/>
+<l:template name="listitem" text="%n"/>
+<l:template name="lot" text="%t"/>
+<l:template name="msg" text="%t"/>
+<l:template name="msgexplan" text="%t"/>
+<l:template name="msgmain" text="%t"/>
+<l:template name="msgrel" text="%t"/>
+<l:template name="msgset" text="%t"/>
+<l:template name="msgsub" text="%t"/>
+<l:template name="note" text="%t"/>
+<l:template name="orderedlist" text="%t"/>
+<l:template name="part" text="%t"/>
+<l:template name="partintro" text="%t"/>
+<l:template name="preface" text="%t"/>
+<l:template name="procedure" text="%t"/>
+<l:template name="productionset" text="%t"/>
+<l:template name="qandadiv" text="%t"/>
+<l:template name="qandaentry" text="&#10; :پرسش %n"/>
+<l:template name="qandaset" text="%t"/>
+<l:template name="question" text="&#10; :پرسش %n"/>
+<l:template name="reference" text="%t"/>
+<l:template name="refsynopsisdiv" text="%t"/>
+<l:template name="segmentedlist" text="%t"/>
+<l:template name="set" text="%t"/>
+<l:template name="setindex" text="%t"/>
+<l:template name="sidebar" text="%t"/>
+<l:template name="table" text="%t"/>
+<l:template name="task" text="%t" lang="en"/>
+<l:template name="tip" text="%t"/>
+<l:template name="toc" text="%t"/>
+<l:template name="variablelist" text="%t"/>
+<l:template name="varlistentry" text="%n"/>
+<l:template name="warning" text="%t"/>
+<l:template name="olink.document.citation" text=" in %o"/>
+<l:template name="olink.page.citation" text=" (%p صÙحه‌ی)"/>
+<l:template name="page.citation" text=" [%p]"/>
+<l:template name="page" text="(%p صÙحه‌ی)"/>
+<l:template name="docname" text=" %oدر "/>
+<l:template name="docnamelong" text="%o در مستندی بنام "/>
+<l:template name="pageabbrev" text="(%p ص)"/>
+<l:template name="Page" text="%p صÙحه‌ی"/>
+<l:template name="bridgehead" text="&#10; بخشی بنام&#10; “%tâ€&#10; "/>
+<l:template name="refsection" text="&#10; بخشی بنام&#10; “%tâ€&#10; "/>
+<l:template name="refsect1" text="&#10; بخشی بنام&#10; “%tâ€&#10; "/>
+<l:template name="refsect2" text="&#10; بخشی بنام&#10; “%tâ€&#10; "/>
+<l:template name="refsect3" text="&#10; بخشی بنام&#10; “%tâ€&#10; "/>
+<l:template name="sect1" text="&#10; بخشی بنام&#10; “%tâ€&#10; "/>
+<l:template name="sect2" text="&#10; بخشی بنام&#10; “%tâ€&#10; "/>
+<l:template name="sect3" text="&#10; بخشی بنام&#10; “%tâ€&#10; "/>
+<l:template name="sect4" text="&#10; بخشی بنام&#10; “%tâ€&#10; "/>
+<l:template name="sect5" text="&#10; بخشی بنام&#10; “%tâ€&#10; "/>
+<l:template name="section" text="&#10; بخشی بنام&#10; “%tâ€&#10; "/>
+<l:template name="simplesect" text="&#10; بخشی بنام&#10; “%tâ€&#10; "/>
+</l:context>
+<l:context name="xref-number"><l:template name="answer" text="&#10; ج: %n"/>
+<l:template name="appendix" text="&#10; پيوست %n"/>
+<l:template name="bridgehead" text="&#10; قسمت %n"/>
+<l:template name="chapter" text="&#10; Ùصل %n"/>
+<l:template name="equation" text="&#10; معادله %n"/>
+<l:template name="example" text="&#10; مثال %n"/>
+<l:template name="figure" text="&#10; شكل %n"/>
+<l:template name="part" text="&#10; بخش %n"/>
+<l:template name="procedure" text="&#10; رويه %n"/>
+<l:template name="productionset" text="&#10; توليد %n"/>
+<l:template name="qandadiv" text="&#10; پرسش و‌ پاسخ %n"/>
+<l:template name="qandaentry" text="&#10; :پرسش %n"/>
+<l:template name="question" text="&#10; :پرسش %n"/>
+<l:template name="sect1" text="&#10; قسمت %n"/>
+<l:template name="sect2" text="&#10; قسمت %n"/>
+<l:template name="sect3" text="&#10; قسمت %n"/>
+<l:template name="sect4" text="&#10; قسمت %n"/>
+<l:template name="sect5" text="&#10; قسمت %n"/>
+<l:template name="section" text="&#10; قسمت %n"/>
+<l:template name="table" text="&#10; جدول %n"/>
+</l:context>
+<l:context name="xref-number-and-title"><l:template name="appendix" text="&#10; پيوست %n, %t"/>
+<l:template name="bridgehead" text="&#10; قسمت %n, “%tâ€&#10; "/>
+<l:template name="chapter" text="&#10; Ùصل %n, %t"/>
+<l:template name="equation" text="&#10; معادله %n, “%tâ€&#10; "/>
+<l:template name="example" text="&#10; مثال %n, “%tâ€&#10; "/>
+<l:template name="figure" text="&#10; شكل %n, “%tâ€&#10; "/>
+<l:template name="part" text="&#10; بخش %n, “%tâ€&#10; "/>
+<l:template name="procedure" text="&#10; رويه %n, “%tâ€&#10; "/>
+<l:template name="productionset" text="&#10; توليد %n, “%tâ€&#10; "/>
+<l:template name="qandadiv" text="&#10; پرسش و‌ پاسخ %n, “%tâ€&#10; "/>
+<l:template name="refsect1" text="&#10; بخشی بنام&#10; “%tâ€&#10; "/>
+<l:template name="refsect2" text="&#10; بخشی بنام&#10; “%tâ€&#10; "/>
+<l:template name="refsect3" text="&#10; بخشی بنام&#10; “%tâ€&#10; "/>
+<l:template name="refsection" text="&#10; بخشی بنام&#10; “%tâ€&#10; "/>
+<l:template name="sect1" text="&#10; قسمت %n, “%tâ€&#10; "/>
+<l:template name="sect2" text="&#10; قسمت %n, “%tâ€&#10; "/>
+<l:template name="sect3" text="&#10; قسمت %n, “%tâ€&#10; "/>
+<l:template name="sect4" text="&#10; قسمت %n, “%tâ€&#10; "/>
+<l:template name="sect5" text="&#10; قسمت %n, “%tâ€&#10; "/>
+<l:template name="section" text="&#10; قسمت %n, “%tâ€&#10; "/>
+<l:template name="simplesect" text="&#10; بخشی بنام&#10; “%tâ€&#10; "/>
+<l:template name="table" text="&#10; جدول %n, “%tâ€&#10; "/>
+</l:context>
+<l:context name="authorgroup"><l:template name="sep" text="&#10; ،&#10; "/>
+<l:template name="sep2" text="&#10; Ùˆ&#10; "/>
+<l:template name="seplast" text="&#10; ،&#10; و&#10; "/>
+</l:context>
+<l:context name="glossary"><l:template name="see" text=" %t ببیند."/>
+<l:template name="seealso" text="%t همچنین ببیند."/>
+<l:template name="seealso-separator" text=", "/>
+</l:context>
+<l:context name="msgset"><l:template name="MsgAud" text="&#10; شنودگان: "/>
+<l:template name="MsgLevel" text="&#10; سطح پیام: "/>
+<l:template name="MsgOrig" text="&#10; اصل: "/>
+</l:context>
+<l:context name="datetime"><l:template name="format" text="m/d/Y"/>
+</l:context>
+<l:context name="termdef"><l:template name="prefix" text="[تعری٠"/>
+<l:template name="suffix" text="]"/>
+</l:context>
+<l:context name="datetime-full"><l:template name="January" text="ژانويه"/>
+<l:template name="February" text="Ùوريه"/>
+<l:template name="March" text="مارس"/>
+<l:template name="April" text="اوريل"/>
+<l:template name="May" text="مه"/>
+<l:template name="June" text="ژوئن"/>
+<l:template name="July" text="ژوئیه"/>
+<l:template name="August" text="اوت"/>
+<l:template name="September" text="سپتامبر"/>
+<l:template name="October" text="اكتبر"/>
+<l:template name="November" text="نوامبر"/>
+<l:template name="December" text="دسامبر"/>
+<l:template name="Monday" text="دوشنبه"/>
+<l:template name="Tuesday" text="سه شنبه"/>
+<l:template name="Wednesday" text="چهار‌شنبه"/>
+<l:template name="Thursday" text="پنج‌شنبه"/>
+<l:template name="Friday" text="جمعه"/>
+<l:template name="Saturday" text="شنبه"/>
+<l:template name="Sunday" text="يك‌شنبه"/>
+</l:context>
+<l:context name="datetime-abbrev"><l:template name="Jan" text="ژانويه"/>
+<l:template name="Feb" text="Ùوريه"/>
+<l:template name="Mar" text="مارس"/>
+<l:template name="Apr" text="اوريل"/>
+<l:template name="May" text="مه"/>
+<l:template name="Jun" text="ژوئن"/>
+<l:template name="Jul" text="ژوئيه"/>
+<l:template name="Aug" text="اوت"/>
+<l:template name="Sep" text="سپتامبر"/>
+<l:template name="Oct" text="اكتبر"/>
+<l:template name="Nov" text="نوامبر"/>
+<l:template name="Dec" text="دسامبر"/>
+<l:template name="Mon" text="دو‌شنبه"/>
+<l:template name="Tue" text="سه‌شنبه"/>
+<l:template name="Wed" text="چهار‌شنبه"/>
+<l:template name="Thu" text="پنج‌شنبه"/>
+<l:template name="Fri" text="جمعه"/>
+<l:template name="Sat" text="شنبه"/>
+<l:template name="Sun" text="يك‌شنبه"/>
+</l:context>
+<l:context name="htmlhelp"><l:template name="langcode" text="0x0429 Farsi"/>
+</l:context>
+<l:context name="index"><l:template name="term-separator" text=", "/>
+<l:template name="number-separator" text=", "/>
+<l:template name="range-separator" text="-"/>
+</l:context>
+<l:context name="iso690"><l:template name="lastfirst.sep" text=", "/>
+<l:template name="alt.person.two.sep" text=" – "/>
+<l:template name="alt.person.last.sep" text=" – "/>
+<l:template name="alt.person.more.sep" text=" – "/>
+<l:template name="primary.editor" text=" (ed.)"/>
+<l:template name="primary.many" text=", et al."/>
+<l:template name="primary.sep" text=". "/>
+<l:template name="submaintitle.sep" text=": "/>
+<l:template name="title.sep" text=". "/>
+<l:template name="othertitle.sep" text=", "/>
+<l:template name="medium1" text=" ["/>
+<l:template name="medium2" text="]"/>
+<l:template name="secondary.person.sep" text="; "/>
+<l:template name="secondary.sep" text=". "/>
+<l:template name="respons.sep" text=". "/>
+<l:template name="edition.sep" text=". "/>
+<l:template name="edition.serial.sep" text=", "/>
+<l:template name="issuing.range" text="-"/>
+<l:template name="issuing.div" text=", "/>
+<l:template name="issuing.sep" text=". "/>
+<l:template name="partnr.sep" text=". "/>
+<l:template name="placepubl.sep" text=": "/>
+<l:template name="publyear.sep" text=", "/>
+<l:template name="pubinfo.sep" text=". "/>
+<l:template name="spec.pubinfo.sep" text=", "/>
+<l:template name="upd.sep" text=", "/>
+<l:template name="datecit1" text=" [cited "/>
+<l:template name="datecit2" text="]"/>
+<l:template name="extent.sep" text=". "/>
+<l:template name="locs.sep" text=", "/>
+<l:template name="location.sep" text=". "/>
+<l:template name="serie.sep" text=". "/>
+<l:template name="notice.sep" text=". "/>
+<l:template name="access" text="Available "/>
+<l:template name="acctoo" text="Also available "/>
+<l:template name="onwww" text="from World Wide Web"/>
+<l:template name="oninet" text="from Internet"/>
+<l:template name="access.end" text=": "/>
+<l:template name="link1" text="&lt;"/>
+<l:template name="link2" text="&gt;"/>
+<l:template name="access.sep" text=". "/>
+<l:template name="isbn" text="ISBN "/>
+<l:template name="issn" text="ISSN "/>
+<l:template name="stdnum.sep" text=". "/>
+<l:template name="patcountry.sep" text=". "/>
+<l:template name="pattype.sep" text=", "/>
+<l:template name="patnum.sep" text=". "/>
+<l:template name="patdate.sep" text=". "/>
+</l:context><l:letters><l:l i="-1"/>
+<l:l i="0">سمبل‌های راهنم</l:l>
+<l:l i="10">A</l:l>
+<l:l i="10">a</l:l>
+<l:l i="20">B</l:l>
+<l:l i="20">b</l:l>
+<l:l i="30">C</l:l>
+<l:l i="30">c</l:l>
+<l:l i="40">D</l:l>
+<l:l i="40">d</l:l>
+<l:l i="50">E</l:l>
+<l:l i="50">e</l:l>
+<l:l i="60">F</l:l>
+<l:l i="60">f</l:l>
+<l:l i="70">G</l:l>
+<l:l i="70">g</l:l>
+<l:l i="80">H</l:l>
+<l:l i="80">h</l:l>
+<l:l i="90">I</l:l>
+<l:l i="90">i</l:l>
+<l:l i="100">J</l:l>
+<l:l i="100">j</l:l>
+<l:l i="110">K</l:l>
+<l:l i="110">k</l:l>
+<l:l i="120">L</l:l>
+<l:l i="120">l</l:l>
+<l:l i="130">M</l:l>
+<l:l i="130">m</l:l>
+<l:l i="140">N</l:l>
+<l:l i="140">n</l:l>
+<l:l i="150">O</l:l>
+<l:l i="150">o</l:l>
+<l:l i="160">P</l:l>
+<l:l i="160">p</l:l>
+<l:l i="170">Q</l:l>
+<l:l i="170">q</l:l>
+<l:l i="180">R</l:l>
+<l:l i="180">r</l:l>
+<l:l i="190">S</l:l>
+<l:l i="190">s</l:l>
+<l:l i="200">T</l:l>
+<l:l i="200">t</l:l>
+<l:l i="210">U</l:l>
+<l:l i="210">u</l:l>
+<l:l i="220">V</l:l>
+<l:l i="220">v</l:l>
+<l:l i="230">W</l:l>
+<l:l i="230">w</l:l>
+<l:l i="240">X</l:l>
+<l:l i="240">x</l:l>
+<l:l i="250">Y</l:l>
+<l:l i="250">y</l:l>
+<l:l i="260">Z</l:l>
+<l:l i="260">z</l:l>
+</l:letters>
+</l:l10n>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/fi.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/fi.xml
new file mode 100644
index 0000000..232d057
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/fi.xml
@@ -0,0 +1,670 @@
+<?xml version="1.0" encoding="utf-8"?>
+<l:l10n xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0" language="fi" english-language-name="Finnish">
+
+<!-- * This file is generated automatically. -->
+<!-- * To submit changes to this file upstream (to the DocBook Project) -->
+<!-- * do not submit an edited version of this file. Instead, submit an -->
+<!-- * edited version of the source file at the following location: -->
+<!-- * -->
+<!-- * https://docbook.svn.sourceforge.net/svnroot/docbook/trunk/gentext/locale/fi.xml -->
+<!-- * -->
+<!-- * E-mail the edited fi.xml source file to: -->
+<!-- * -->
+<!-- * docbook-developers@lists.sourceforge.net -->
+
+<!-- ******************************************************************** -->
+
+<!-- This file is part of the XSL DocBook Stylesheet distribution. -->
+<!-- See ../README or http://docbook.sf.net/release/xsl/current/ for -->
+<!-- copyright and other information. -->
+
+<!-- ******************************************************************** -->
+<!-- In these files, % with a letter is used for a placeholder: -->
+<!-- %t is the current element's title -->
+<!-- %s is the current element's subtitle (if applicable)-->
+<!-- %n is the current element's number label-->
+<!-- %p is the current element's page number (if applicable)-->
+<!-- ******************************************************************** -->
+
+
+<l:gentext key="Abstract" text="Tiivistelmä"/>
+<l:gentext key="abstract" text="tiivistelmä"/>
+<l:gentext key="Acknowledgements" text="Kiitokset"/>
+<l:gentext key="acknowledgements" text="kiitokset"/>
+<l:gentext key="Answer" text="V:"/>
+<l:gentext key="answer" text="v:"/>
+<l:gentext key="Appendix" text="Liite"/>
+<l:gentext key="appendix" text="liite"/>
+<l:gentext key="Article" text="Artikkeli"/>
+<l:gentext key="article" text="artikkeli"/>
+<l:gentext key="Author" text="Tekijä"/>
+<l:gentext key="Bibliography" text="Lähteet"/>
+<l:gentext key="bibliography" text="lähteet"/>
+<l:gentext key="Book" text="Kirja"/>
+<l:gentext key="book" text="kirja"/>
+<l:gentext key="CAUTION" text="VARO"/>
+<l:gentext key="Caution" text="Varo"/>
+<l:gentext key="caution" text="varo"/>
+<l:gentext key="Chapter" text="Luku"/>
+<l:gentext key="chapter" text="luku"/>
+<l:gentext key="Colophon" text="Tuontantotavat"/>
+<l:gentext key="colophon" text="tuontantotavat"/>
+<l:gentext key="Copyright" text="Tekijänoikeudet"/>
+<l:gentext key="copyright" text="tekijänoikeudet"/>
+<l:gentext key="Dedication" text="Omistus"/>
+<l:gentext key="dedication" text="omistus"/>
+<l:gentext key="Edition" text="Edition"/>
+<l:gentext key="edition" text="edition"/>
+<l:gentext key="Editor" text="Toimittaja"/>
+<l:gentext key="Equation" text="Kaava"/>
+<l:gentext key="equation" text="kaava"/>
+<l:gentext key="Example" text="Esimerkki"/>
+<l:gentext key="example" text="esimerkki"/>
+<l:gentext key="Figure" text="Kuva"/>
+<l:gentext key="figure" text="kuva"/>
+<l:gentext key="Glossary" text="Sanasto"/>
+<l:gentext key="glossary" text="sanasto"/>
+<l:gentext key="GlossSee" text="Katso"/>
+<l:gentext key="glosssee" text="katso"/>
+<l:gentext key="GlossSeeAlso" text="Katso myös"/>
+<l:gentext key="glossseealso" text="katso myös"/>
+<l:gentext key="IMPORTANT" text="TÄRKEÄÄ"/>
+<l:gentext key="important" text="tärkeää"/>
+<l:gentext key="Important" text="Tärkeää"/>
+<l:gentext key="Index" text="Indeksi"/>
+<l:gentext key="index" text="indeksi"/>
+<l:gentext key="ISBN" text="ISBN"/>
+<l:gentext key="isbn" text="ISBN"/>
+<l:gentext key="LegalNotice" text="Oikeudellinen ilmoitus"/>
+<l:gentext key="legalnotice" text="oikeudellinen ilmoitus"/>
+<l:gentext key="MsgAud" text="Yleisö"/>
+<l:gentext key="msgaud" text="yleisö"/>
+<l:gentext key="MsgLevel" text="Taso"/>
+<l:gentext key="msglevel" text="taso"/>
+<l:gentext key="MsgOrig" text="Alkuperä"/>
+<l:gentext key="msgorig" text="alkuperä"/>
+<l:gentext key="NOTE" text="HUOMAA"/>
+<l:gentext key="Note" text="Huomaa"/>
+<l:gentext key="note" text="huomaa"/>
+<l:gentext key="Part" text="Osa"/>
+<l:gentext key="part" text="osa"/>
+<l:gentext key="Preface" text="Esipuhe"/>
+<l:gentext key="preface" text="esipuhe"/>
+<l:gentext key="Procedure" text="Aliohjelma"/>
+<l:gentext key="procedure" text="aliohjelma"/>
+<l:gentext key="ProductionSet" text="Tuotanto"/>
+<l:gentext key="PubDate" text="Julkaisupäivä"/>
+<l:gentext key="pubdate" text="julkaisupäivä"/>
+<l:gentext key="Published" text="Julkaistu"/>
+<l:gentext key="published" text="julkaistu"/>
+<l:gentext key="Publisher" text="Julkaisija"/>
+<l:gentext key="Qandadiv" text="K ja V"/>
+<l:gentext key="qandadiv" text="k ja v"/>
+<l:gentext key="QandASet" text="Usein kysytyt kysymykset"/>
+<l:gentext key="Question" text="K:"/>
+<l:gentext key="question" text="k:"/>
+<l:gentext key="RefEntry" text="Sivu"/>
+<l:gentext key="refentry" text="sivu"/>
+<l:gentext key="Reference" text="Lähdeluettelo"/>
+<l:gentext key="reference" text="lähdeluettelo"/>
+<l:gentext key="References" text="References"/>
+<l:gentext key="RefName" text="Nimi"/>
+<l:gentext key="refname" text="nimi"/>
+<l:gentext key="RefSection" text="Kohta"/>
+<l:gentext key="refsection" text="kohta"/>
+<l:gentext key="RefSynopsisDiv" text="Yhteenveto"/>
+<l:gentext key="refsynopsisdiv" text="yhteenveto"/>
+<l:gentext key="RevHistory" text="Versiohistoria"/>
+<l:gentext key="revhistory" text="versiohistoria"/>
+<l:gentext key="revision" text="versio"/>
+<l:gentext key="Revision" text="Versio"/>
+<l:gentext key="sect1" text="Kohta"/>
+<l:gentext key="sect2" text="Kohta"/>
+<l:gentext key="sect3" text="Kohta"/>
+<l:gentext key="sect4" text="Kohta"/>
+<l:gentext key="sect5" text="Kohta"/>
+<l:gentext key="section" text="kohta"/>
+<l:gentext key="Section" text="Kohta"/>
+<l:gentext key="see" text="katso"/>
+<l:gentext key="See" text="Katso"/>
+<l:gentext key="seealso" text="katso myös"/>
+<l:gentext key="Seealso" text="Katso myös"/>
+<l:gentext key="SeeAlso" text="Katso myös"/>
+<l:gentext key="set" text="Kokoelma"/>
+<l:gentext key="Set" text="Kokoelma"/>
+<l:gentext key="setindex" text="kokoelman indeksi"/>
+<l:gentext key="SetIndex" text="Kokoelman indeksi"/>
+<l:gentext key="Sidebar" text="Sivupalkki"/>
+<l:gentext key="sidebar" text="sivupalkki"/>
+<l:gentext key="step" text="toimenpide"/>
+<l:gentext key="Step" text="Toimenpide"/>
+<l:gentext key="table" text="taulu"/>
+<l:gentext key="Table" text="Taulu"/>
+<l:gentext key="task" text="tehtävä"/>
+<l:gentext key="Task" text="Tehtävä"/>
+<l:gentext key="tip" text="vihje"/>
+<l:gentext key="TIP" text="VIHJE"/>
+<l:gentext key="Tip" text="Vihje"/>
+<l:gentext key="Warning" text="Varoitus"/>
+<l:gentext key="warning" text="varoitus"/>
+<l:gentext key="WARNING" text="VAROITUS"/>
+<l:gentext key="and" text="ja"/>
+<l:gentext key="by" text=""/>
+<l:gentext key="Edited" text="Toim."/>
+<l:gentext key="edited" text="toim."/>
+<l:gentext key="Editedby" text="Toimittanut"/>
+<l:gentext key="editedby" text="toimittanut"/>
+<l:gentext key="in" text="teoksessa"/>
+<l:gentext key="lastlistcomma" text=","/>
+<l:gentext key="listcomma" text=","/>
+<l:gentext key="notes" text="viitteet"/>
+<l:gentext key="Notes" text="Viitteet"/>
+<l:gentext key="Pgs" text="Sivut"/>
+<l:gentext key="pgs" text="sivut"/>
+<l:gentext key="Revisedby" text="Muokannut: "/>
+<l:gentext key="revisedby" text="muokannut: "/>
+<l:gentext key="TableNotes" text="Viitteet"/>
+<l:gentext key="tablenotes" text="viitteet"/>
+<l:gentext key="TableofContents" text="Sisällys"/>
+<l:gentext key="tableofcontents" text="sisällys"/>
+<l:gentext key="unexpectedelementname" text="Odottamaton elementin nimi"/>
+<l:gentext key="unsupported" text="ei tueta"/>
+<l:gentext key="xrefto" text="xref johonkin"/>
+<l:gentext key="Authors" text="Tekijät"/>
+<l:gentext key="copyeditor" text="Copy Editor"/>
+<l:gentext key="graphicdesigner" text="Graafinen suunnittelija"/>
+<l:gentext key="productioneditor" text="Production Editor"/>
+<l:gentext key="technicaleditor" text="Tekninen toimittaja"/>
+<l:gentext key="translator" text="Kääntäjä"/>
+<l:gentext key="listofequations" text="luettelo esimerkeistä"/>
+<l:gentext key="ListofEquations" text="Luettelo esimerkeistä"/>
+<l:gentext key="ListofExamples" text="Luettelo esimerkeistä"/>
+<l:gentext key="listofexamples" text="luettelo esimerkeistä"/>
+<l:gentext key="ListofFigures" text="Luettelo kuvista"/>
+<l:gentext key="listoffigures" text="luettelo kuvista"/>
+<l:gentext key="ListofProcedures" text="Luettelo aliohjelmista"/>
+<l:gentext key="listofprocedures" text="luettelo aliohjelmista"/>
+<l:gentext key="listoftables" text="luettelo tauluista"/>
+<l:gentext key="ListofTables" text="Luettelo tauluista"/>
+<l:gentext key="ListofUnknown" text="Luettelo tuntemattomista"/>
+<l:gentext key="listofunknown" text="luettelo tuntemattomista"/>
+<l:gentext key="nav-home" text="Alkuun"/>
+<l:gentext key="nav-next" text="Seuraava"/>
+<l:gentext key="nav-next-sibling" text="Nopeasti eteenpäin"/>
+<l:gentext key="nav-prev" text="Edellinen"/>
+<l:gentext key="nav-prev-sibling" text="Nopeasti taaksepäin"/>
+<l:gentext key="nav-up" text="Ylös"/>
+<l:gentext key="nav-toc" text="Sisällysluettelo"/>
+<l:gentext key="Draft" text="Luonnos"/>
+<l:gentext key="above" text="yllä"/>
+<l:gentext key="below" text="alla"/>
+<l:gentext key="sectioncalled" text="kohta nimeltä"/>
+<l:gentext key="index symbols" text="Symbolit"/>
+<l:gentext key="writing-mode" text="lr-tb"/>
+<l:gentext key="lowercase.alpha" text="abcdefghijklmnopqrstuvwxyzåäöšž"/>
+<l:gentext key="uppercase.alpha" text="ABCDEFGHIJKLMNOPQRSTUVWXYZÅÄÖŠŽ"/>
+<l:gentext key="normalize.sort.input" text="AaÀàÃáÂâÃãÄäÅåĀÄĂ㥹ÇǎǞǟǠǡǺǻȀÈȂȃȦȧḀá¸áºšáº áº¡áº¢áº£áº¤áº¥áº¦áº§áº¨áº©áºªáº«áº¬áº­áº®áº¯áº°áº±áº²áº³áº´áºµáº¶áº·BbÆ€ÆɓƂƃḂḃḄḅḆḇCcÇçĆćĈĉĊċČÄƇƈɕḈḉDdÄŽÄÄđƊɗƋƌDžDzȡɖḊḋḌá¸á¸Žá¸á¸á¸‘ḒḓEeÈèÉéÊêËëĒēĔĕĖėĘęĚěȄȅȆȇȨȩḔḕḖḗḘḙḚḛḜá¸áº¸áº¹áººáº»áº¼áº½áº¾áº¿á»€á»á»‚ểỄễỆệFfƑƒḞḟGgÄœÄĞğĠġĢģƓɠǤǥǦǧǴǵḠḡHhĤĥĦħȞȟɦḢḣḤḥḦḧḨḩḪḫẖIiÌìÃíÎîÃïĨĩĪīĬĭĮįİƗɨÇÇȈȉȊȋḬḭḮḯỈỉỊịJjĴĵǰÊKkĶķƘƙǨǩḰḱḲḳḴḵLlĹĺĻļĽľĿŀÅłƚLjȴɫɬɭḶḷḸḹḺḻḼḽMmɱḾḿṀá¹á¹‚ṃNnÑñŃńŅņŇňÆɲƞȠNjǸǹȵɳṄṅṆṇṈṉṊṋOoÒòÓóÔôÕõÖöØøŌÅÅŽÅÅőƟƠơǑǒǪǫǬǭǾǿȌÈÈŽÈȪȫȬȭȮȯȰȱṌá¹á¹Žá¹á¹á¹‘ṒṓỌá»á»Žá»á»á»‘ỒồỔổỖỗỘộỚớỜá»á»žá»Ÿá» á»¡á»¢á»£PpƤƥṔṕṖṗQqÊ RrŔŕŖŗŘřÈȑȒȓɼɽɾṘṙṚṛṜá¹á¹žá¹ŸSsŚśŜÅŞşŠšȘșʂṠṡṢṣṤṥṦṧṨṩTtŢţŤťŦŧƫƬƭƮʈȚțȶṪṫṬṭṮṯṰṱẗUuÙùÚúÛûÜüŨũŪūŬŭŮůŰűŲųƯưǓǔǕǖǗǘǙǚǛǜȔȕȖȗṲṳṴṵṶṷṸṹṺṻỤụỦủỨứỪừỬửỮữỰựVvƲʋṼṽṾṿWwŴŵẀáºáº‚ẃẄẅẆẇẈẉẘXxẊẋẌáºYyÃýÿŸŶŷƳƴȲȳẎáºáº™á»²á»³á»´á»µá»¶á»·á»¸á»¹ZzŹźŻżŽžƵƶȤȥÊÊ‘áºáº‘ẒẓẔẕẕ" lang="en"/>
+<l:gentext key="normalize.sort.output" text="AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBCCCCCCCCCCCCCCCCCDDDDDDDDDDDDDDDDDDDDDDDDEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEFFFFFFGGGGGGGGGGGGGGGGGGGGHHHHHHHHHHHHHHHHHHHHIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIJJJJJJKKKKKKKKKKKKKKLLLLLLLLLLLLLLLLLLLLLLLLLLMMMMMMMMMNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOPPPPPPPPQQQRRRRRRRRRRRRRRRRRRRRRRRSSSSSSSSSSSSSSSSSSSSSSSTTTTTTTTTTTTTTTTTTTTTTTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUVVVVVVVVWWWWWWWWWWWWWWWXXXXXXYYYYYYYYYYYYYYYYYYYYYYYZZZZZZZZZZZZZZZZZZZZZ" lang="en"/>
+<l:dingbat key="startquote" text="â€"/>
+<l:dingbat key="endquote" text="â€"/>
+<l:dingbat key="nestedstartquote" text="’"/>
+<l:dingbat key="nestedendquote" text="’"/>
+<l:dingbat key="singlestartquote" text="‘" lang="en"/>
+<l:dingbat key="singleendquote" text="’" lang="en"/>
+<l:dingbat key="bullet" text="•"/>
+<l:gentext key="hyphenation-character" text="-" lang="en"/>
+<l:gentext key="hyphenation-push-character-count" text="2" lang="en"/>
+<l:gentext key="hyphenation-remain-character-count" text="2" lang="en"/>
+<l:context name="styles"><l:template name="person-name" text="first-last"/>
+</l:context>
+<l:context name="title"><l:template name="abstract" text="%t"/>
+<l:template name="acknowledgements" text="%t" lang="en"/>
+<l:template name="answer" text="%t"/>
+<l:template name="appendix" text="Liite %n. %t"/>
+<l:template name="article" text="%t"/>
+<l:template name="authorblurb" text="%t"/>
+<l:template name="bibliodiv" text="%t"/>
+<l:template name="biblioentry" text="%t"/>
+<l:template name="bibliography" text="%t"/>
+<l:template name="bibliolist" text="%t" lang="en"/>
+<l:template name="bibliomixed" text="%t"/>
+<l:template name="bibliomset" text="%t"/>
+<l:template name="biblioset" text="%t"/>
+<l:template name="blockquote" text="%t"/>
+<l:template name="book" text="%t"/>
+<l:template name="calloutlist" text="%t"/>
+<l:template name="caution" text="%t"/>
+<l:template name="chapter" text="Luku %n. %t"/>
+<l:template name="colophon" text="%t"/>
+<l:template name="dedication" text="%t"/>
+<l:template name="equation" text="Kaava %n. %t"/>
+<l:template name="example" text="Esimerkki %n. %t"/>
+<l:template name="figure" text="Kuva %n. %t"/>
+<l:template name="foil" text="%t" lang="en"/>
+<l:template name="foilgroup" text="%t" lang="en"/>
+<l:template name="formalpara" text="%t"/>
+<l:template name="glossary" text="%t"/>
+<l:template name="glossdiv" text="%t"/>
+<l:template name="glosslist" text="%t" lang="en"/>
+<l:template name="glossentry" text="%t" lang="en"/>
+<l:template name="important" text="%t"/>
+<l:template name="index" text="%t"/>
+<l:template name="indexdiv" text="%t"/>
+<l:template name="itemizedlist" text="%t"/>
+<l:template name="legalnotice" text="%t"/>
+<l:template name="listitem" text=""/>
+<l:template name="lot" text="%t"/>
+<l:template name="msg" text="%t"/>
+<l:template name="msgexplan" text="%t"/>
+<l:template name="msgmain" text="%t"/>
+<l:template name="msgrel" text="%t"/>
+<l:template name="msgset" text="%t"/>
+<l:template name="msgsub" text="%t"/>
+<l:template name="note" text="%t"/>
+<l:template name="orderedlist" text="%t"/>
+<l:template name="part" text="Osa %n. %t"/>
+<l:template name="partintro" text="%t"/>
+<l:template name="preface" text="%t"/>
+<l:template name="procedure" text="%t"/>
+<l:template name="procedure.formal" text="Aliohjelma %n. %t"/>
+<l:template name="productionset" text="%t"/>
+<l:template name="productionset.formal" text="Tuotanto %n"/>
+<l:template name="qandadiv" text="%t"/>
+<l:template name="qandaentry" text="%t"/>
+<l:template name="qandaset" text="%t"/>
+<l:template name="question" text="%t"/>
+<l:template name="refentry" text="%t"/>
+<l:template name="reference" text="%t"/>
+<l:template name="refsection" text="%t"/>
+<l:template name="refsect1" text="%t"/>
+<l:template name="refsect2" text="%t"/>
+<l:template name="refsect3" text="%t"/>
+<l:template name="refsynopsisdiv" text="%t"/>
+<l:template name="refsynopsisdivinfo" text="%t"/>
+<l:template name="segmentedlist" text="%t"/>
+<l:template name="set" text="%t"/>
+<l:template name="setindex" text="%t"/>
+<l:template name="sidebar" text="%t"/>
+<l:template name="step" text="%t"/>
+<l:template name="table" text="Taulu %n. %t"/>
+<l:template name="task" text="%t" lang="en"/>
+<l:template name="tasksummary" text="%t" lang="en"/>
+<l:template name="taskprerequisites" text="%t" lang="en"/>
+<l:template name="taskrelated" text="%t" lang="en"/>
+<l:template name="tip" text="%t"/>
+<l:template name="toc" text="%t"/>
+<l:template name="variablelist" text="%t"/>
+<l:template name="varlistentry" text="" lang="en"/>
+<l:template name="warning" text="%t"/>
+</l:context>
+<l:context name="title-unnumbered"><l:template name="appendix" text="%t"/>
+<l:template name="article/appendix" text="%t" lang="en"/>
+<l:template name="bridgehead" text="%t"/>
+<l:template name="chapter" text="%t"/>
+<l:template name="sect1" text="%t"/>
+<l:template name="sect2" text="%t"/>
+<l:template name="sect3" text="%t"/>
+<l:template name="sect4" text="%t"/>
+<l:template name="sect5" text="%t"/>
+<l:template name="section" text="%t"/>
+<l:template name="simplesect" text="%t"/>
+<l:template name="part" text="%t" lang="en"/>
+</l:context>
+<l:context name="title-numbered"><l:template name="appendix" text="Liite %n. %t"/>
+<l:template name="article/appendix" text="%n. %t" lang="en"/>
+<l:template name="bridgehead" text="%t"/>
+<l:template name="chapter" text="Luku %n. %t"/>
+<l:template name="part" text="Osa %n. %t"/>
+<l:template name="sect1" text="%n. %t"/>
+<l:template name="sect2" text="%n. %t"/>
+<l:template name="sect3" text="%n. %t"/>
+<l:template name="sect4" text="%n. %t"/>
+<l:template name="sect5" text="%n. %t"/>
+<l:template name="section" text="%n. %t"/>
+<l:template name="simplesect" text="%n. %t"/>
+</l:context>
+<l:context name="subtitle"><l:template name="appendix" text="%s"/>
+<l:template name="acknowledgements" text="%s" lang="en"/>
+<l:template name="article" text="%s"/>
+<l:template name="bibliodiv" text="%s"/>
+<l:template name="biblioentry" text="%s"/>
+<l:template name="bibliography" text="%s"/>
+<l:template name="bibliomixed" text="%s"/>
+<l:template name="bibliomset" text="%s"/>
+<l:template name="biblioset" text="%s"/>
+<l:template name="book" text="%s"/>
+<l:template name="chapter" text="%s"/>
+<l:template name="colophon" text="%s"/>
+<l:template name="dedication" text="%s"/>
+<l:template name="glossary" text="%s"/>
+<l:template name="glossdiv" text="%s"/>
+<l:template name="index" text="%s"/>
+<l:template name="indexdiv" text="%s"/>
+<l:template name="lot" text="%s"/>
+<l:template name="part" text="%s"/>
+<l:template name="partintro" text="%s"/>
+<l:template name="preface" text="%s"/>
+<l:template name="refentry" text="%s"/>
+<l:template name="reference" text="%s"/>
+<l:template name="refsection" text="%s"/>
+<l:template name="refsect1" text="%s"/>
+<l:template name="refsect2" text="%s"/>
+<l:template name="refsect3" text="%s"/>
+<l:template name="refsynopsisdiv" text="%s"/>
+<l:template name="sect1" text="%s"/>
+<l:template name="sect2" text="%s"/>
+<l:template name="sect3" text="%s"/>
+<l:template name="sect4" text="%s"/>
+<l:template name="sect5" text="%s"/>
+<l:template name="section" text="%s"/>
+<l:template name="set" text="%s"/>
+<l:template name="setindex" text="%s"/>
+<l:template name="sidebar" text="%s"/>
+<l:template name="simplesect" text="%s"/>
+<l:template name="toc" text="%s"/>
+</l:context>
+<l:context name="xref"><l:template name="abstract" text="%t"/>
+<l:template name="acknowledgements" text="%t" lang="en"/>
+<l:template name="answer" text="V: %n"/>
+<l:template name="appendix" text="%t"/>
+<l:template name="article" text="%t"/>
+<l:template name="authorblurb" text="%t"/>
+<l:template name="bibliodiv" text="%t"/>
+<l:template name="bibliography" text="%t"/>
+<l:template name="bibliomset" text="%t"/>
+<l:template name="biblioset" text="%t"/>
+<l:template name="blockquote" text="%t"/>
+<l:template name="book" text="%t"/>
+<l:template name="calloutlist" text="%t"/>
+<l:template name="caution" text="%t"/>
+<l:template name="chapter" text="%t"/>
+<l:template name="colophon" text="%t"/>
+<l:template name="constraintdef" text="%t"/>
+<l:template name="dedication" text="%t"/>
+<l:template name="equation" text="%t"/>
+<l:template name="example" text="%t"/>
+<l:template name="figure" text="%t"/>
+<l:template name="foil" text="%t" lang="en"/>
+<l:template name="foilgroup" text="%t" lang="en"/>
+<l:template name="formalpara" text="%t"/>
+<l:template name="glossary" text="%t"/>
+<l:template name="glossdiv" text="%t"/>
+<l:template name="important" text="%t"/>
+<l:template name="index" text="%t"/>
+<l:template name="indexdiv" text="%t"/>
+<l:template name="itemizedlist" text="%t"/>
+<l:template name="legalnotice" text="%t"/>
+<l:template name="listitem" text="%n"/>
+<l:template name="lot" text="%t"/>
+<l:template name="msg" text="%t"/>
+<l:template name="msgexplan" text="%t"/>
+<l:template name="msgmain" text="%t"/>
+<l:template name="msgrel" text="%t"/>
+<l:template name="msgset" text="%t"/>
+<l:template name="msgsub" text="%t"/>
+<l:template name="note" text="%t"/>
+<l:template name="orderedlist" text="%t"/>
+<l:template name="part" text="%t"/>
+<l:template name="partintro" text="%t"/>
+<l:template name="preface" text="%t"/>
+<l:template name="procedure" text="%t"/>
+<l:template name="productionset" text="%t"/>
+<l:template name="qandadiv" text="%t"/>
+<l:template name="qandaentry" text="K: %n"/>
+<l:template name="qandaset" text="%t"/>
+<l:template name="question" text="K: %n"/>
+<l:template name="reference" text="%t"/>
+<l:template name="refsynopsisdiv" text="%t"/>
+<l:template name="segmentedlist" text="%t"/>
+<l:template name="set" text="%t"/>
+<l:template name="setindex" text="%t"/>
+<l:template name="sidebar" text="%t"/>
+<l:template name="table" text="%t"/>
+<l:template name="task" text="%t" lang="en"/>
+<l:template name="tip" text="%t"/>
+<l:template name="toc" text="%t"/>
+<l:template name="variablelist" text="%t"/>
+<l:template name="varlistentry" text="%n"/>
+<l:template name="warning" text="%t"/>
+<l:template name="olink.document.citation" text=" in %o" lang="en"/>
+<l:template name="olink.page.citation" text=" (page %p)" lang="en"/>
+<l:template name="page.citation" text=" [%p]"/>
+<l:template name="page" text="(sivu %p)"/>
+<l:template name="docname" text=" kirjoitelmassa %o"/>
+<l:template name="docnamelong" text=" kirjoitelmassa otsikoltaan %o"/>
+<l:template name="pageabbrev" text="(s. %p)"/>
+<l:template name="Page" text="Sivu %p"/>
+<l:template name="bridgehead" text="â€%tâ€"/>
+<l:template name="refsection" text="â€%tâ€"/>
+<l:template name="refsect1" text="â€%tâ€"/>
+<l:template name="refsect2" text="â€%tâ€"/>
+<l:template name="refsect3" text="â€%tâ€"/>
+<l:template name="sect1" text="â€%tâ€"/>
+<l:template name="sect2" text="â€%tâ€"/>
+<l:template name="sect3" text="â€%tâ€"/>
+<l:template name="sect4" text="â€%tâ€"/>
+<l:template name="sect5" text="â€%tâ€"/>
+<l:template name="section" text="â€%tâ€"/>
+<l:template name="simplesect" text="â€%tâ€"/>
+</l:context>
+<l:context name="xref-number"><l:template name="answer" text="V: %n"/>
+<l:template name="appendix" text="Liite %n"/>
+<l:template name="bridgehead" text="Kohta %n"/>
+<l:template name="chapter" text="Luku %n"/>
+<l:template name="equation" text="Kaava %n"/>
+<l:template name="example" text="Esimerkki %n"/>
+<l:template name="figure" text="Kuva %n"/>
+<l:template name="part" text="Osa %n"/>
+<l:template name="procedure" text="Aliohjelma %n"/>
+<l:template name="productionset" text="Tuotanto %n"/>
+<l:template name="qandadiv" text="K ja V %n"/>
+<l:template name="qandaentry" text="K: %n"/>
+<l:template name="question" text="K: %n"/>
+<l:template name="sect1" text="Kohta %n"/>
+<l:template name="sect2" text="Kohta %n"/>
+<l:template name="sect3" text="Kohta %n"/>
+<l:template name="sect4" text="Kohta %n"/>
+<l:template name="sect5" text="Kohta %n"/>
+<l:template name="section" text="Kohta %n"/>
+<l:template name="table" text="Taulu %n"/>
+</l:context>
+<l:context name="xref-number-and-title"><l:template name="appendix" text="Liite %n, %t"/>
+<l:template name="bridgehead" text="Kohta %n, â€%tâ€"/>
+<l:template name="chapter" text="Luku %n, %t"/>
+<l:template name="equation" text="Kaava %n, â€%tâ€"/>
+<l:template name="example" text="Esimerkki %n, â€%tâ€"/>
+<l:template name="figure" text="Kuva %n, â€%tâ€"/>
+<l:template name="part" text="Osa %n, â€%tâ€"/>
+<l:template name="procedure" text="Aliohjelma %n, â€%tâ€"/>
+<l:template name="productionset" text="Tuotanto %n, â€%tâ€"/>
+<l:template name="qandadiv" text="K ja V %n, â€%tâ€"/>
+<l:template name="refsect1" text="kohta nimeltä â€%tâ€"/>
+<l:template name="refsect2" text="kohta nimeltä â€%tâ€"/>
+<l:template name="refsect3" text="kohta nimeltä â€%tâ€"/>
+<l:template name="refsection" text="kohta nimeltä â€%tâ€"/>
+<l:template name="sect1" text="Kohta %n, â€%tâ€"/>
+<l:template name="sect2" text="Kohta %n, â€%tâ€"/>
+<l:template name="sect3" text="Kohta %n, â€%tâ€"/>
+<l:template name="sect4" text="Kohta %n, â€%tâ€"/>
+<l:template name="sect5" text="Kohta %n, â€%tâ€"/>
+<l:template name="section" text="Kohta %n, â€%tâ€"/>
+<l:template name="simplesect" text="kohta nimeltä â€%tâ€"/>
+<l:template name="table" text="Taulu %n, â€%tâ€"/>
+</l:context>
+<l:context name="authorgroup"><l:template name="sep" text=", "/>
+<l:template name="sep2" text=" ja "/>
+<l:template name="seplast" text=", ja "/>
+</l:context>
+<l:context name="glossary"><l:template name="see" text="Katso %t."/>
+<l:template name="seealso" text="Katso myös %t."/>
+<l:template name="seealso-separator" text=", "/>
+</l:context>
+<l:context name="msgset"><l:template name="MsgAud" text="Yleisö: "/>
+<l:template name="MsgLevel" text="Taso: "/>
+<l:template name="MsgOrig" text="Alkuperä: "/>
+</l:context>
+<l:context name="datetime"><l:template name="format" text=""/>
+</l:context>
+<l:context name="termdef"><l:template name="prefix" text="[Definition: " lang="en"/>
+<l:template name="suffix" text="]" lang="en"/>
+</l:context>
+<l:context name="datetime-full"><l:template name="January" text=""/>
+<l:template name="February" text=""/>
+<l:template name="March" text=""/>
+<l:template name="April" text=""/>
+<l:template name="May" text=""/>
+<l:template name="June" text=""/>
+<l:template name="July" text=""/>
+<l:template name="August" text=""/>
+<l:template name="September" text=""/>
+<l:template name="October" text=""/>
+<l:template name="November" text=""/>
+<l:template name="December" text=""/>
+<l:template name="Monday" text=""/>
+<l:template name="Tuesday" text=""/>
+<l:template name="Wednesday" text=""/>
+<l:template name="Thursday" text=""/>
+<l:template name="Friday" text=""/>
+<l:template name="Saturday" text=""/>
+<l:template name="Sunday" text=""/>
+</l:context>
+<l:context name="datetime-abbrev"><l:template name="Jan" text=""/>
+<l:template name="Feb" text=""/>
+<l:template name="Mar" text=""/>
+<l:template name="Apr" text=""/>
+<l:template name="May" text=""/>
+<l:template name="Jun" text=""/>
+<l:template name="Jul" text=""/>
+<l:template name="Aug" text=""/>
+<l:template name="Sep" text=""/>
+<l:template name="Oct" text=""/>
+<l:template name="Nov" text=""/>
+<l:template name="Dec" text=""/>
+<l:template name="Mon" text=""/>
+<l:template name="Tue" text=""/>
+<l:template name="Wed" text=""/>
+<l:template name="Thu" text=""/>
+<l:template name="Fri" text=""/>
+<l:template name="Sat" text=""/>
+<l:template name="Sun" text=""/>
+</l:context>
+<l:context name="htmlhelp"><l:template name="langcode" text="0x040b Finnish"/>
+</l:context>
+<l:context name="index"><l:template name="term-separator" text=", " lang="en"/>
+<l:template name="number-separator" text=", " lang="en"/>
+<l:template name="range-separator" text="-" lang="en"/>
+</l:context>
+<l:context name="iso690"><l:template name="lastfirst.sep" text=", " lang="en"/>
+<l:template name="alt.person.two.sep" text=" – " lang="en"/>
+<l:template name="alt.person.last.sep" text=" – " lang="en"/>
+<l:template name="alt.person.more.sep" text=" – " lang="en"/>
+<l:template name="primary.editor" text=" (ed.)" lang="en"/>
+<l:template name="primary.many" text=", et al." lang="en"/>
+<l:template name="primary.sep" text=". " lang="en"/>
+<l:template name="submaintitle.sep" text=": " lang="en"/>
+<l:template name="title.sep" text=". " lang="en"/>
+<l:template name="othertitle.sep" text=", " lang="en"/>
+<l:template name="medium1" text=" [" lang="en"/>
+<l:template name="medium2" text="]" lang="en"/>
+<l:template name="secondary.person.sep" text="; " lang="en"/>
+<l:template name="secondary.sep" text=". " lang="en"/>
+<l:template name="respons.sep" text=". " lang="en"/>
+<l:template name="edition.sep" text=". " lang="en"/>
+<l:template name="edition.serial.sep" text=", " lang="en"/>
+<l:template name="issuing.range" text="-" lang="en"/>
+<l:template name="issuing.div" text=", " lang="en"/>
+<l:template name="issuing.sep" text=". " lang="en"/>
+<l:template name="partnr.sep" text=". " lang="en"/>
+<l:template name="placepubl.sep" text=": " lang="en"/>
+<l:template name="publyear.sep" text=", " lang="en"/>
+<l:template name="pubinfo.sep" text=". " lang="en"/>
+<l:template name="spec.pubinfo.sep" text=", " lang="en"/>
+<l:template name="upd.sep" text=", " lang="en"/>
+<l:template name="datecit1" text=" [cited " lang="en"/>
+<l:template name="datecit2" text="]" lang="en"/>
+<l:template name="extent.sep" text=". " lang="en"/>
+<l:template name="locs.sep" text=", " lang="en"/>
+<l:template name="location.sep" text=". " lang="en"/>
+<l:template name="serie.sep" text=". " lang="en"/>
+<l:template name="notice.sep" text=". " lang="en"/>
+<l:template name="access" text="Available " lang="en"/>
+<l:template name="acctoo" text="Also available " lang="en"/>
+<l:template name="onwww" text="from World Wide Web" lang="en"/>
+<l:template name="oninet" text="from Internet" lang="en"/>
+<l:template name="access.end" text=": " lang="en"/>
+<l:template name="link1" text="&lt;" lang="en"/>
+<l:template name="link2" text="&gt;" lang="en"/>
+<l:template name="access.sep" text=". " lang="en"/>
+<l:template name="isbn" text="ISBN " lang="en"/>
+<l:template name="issn" text="ISSN " lang="en"/>
+<l:template name="stdnum.sep" text=". " lang="en"/>
+<l:template name="patcountry.sep" text=". " lang="en"/>
+<l:template name="pattype.sep" text=", " lang="en"/>
+<l:template name="patnum.sep" text=". " lang="en"/>
+<l:template name="patdate.sep" text=". " lang="en"/>
+</l:context><l:letters><l:l i="-1"/>
+<l:l i="0">Symbole</l:l>
+<l:l i="1">A</l:l>
+<l:l i="1">a</l:l>
+<l:l i="2">B</l:l>
+<l:l i="2">b</l:l>
+<l:l i="3">C</l:l>
+<l:l i="3">c</l:l>
+<l:l i="4">D</l:l>
+<l:l i="4">d</l:l>
+<l:l i="5">E</l:l>
+<l:l i="5">e</l:l>
+<l:l i="6">F</l:l>
+<l:l i="6">f</l:l>
+<l:l i="7">G</l:l>
+<l:l i="7">g</l:l>
+<l:l i="8">H</l:l>
+<l:l i="8">h</l:l>
+<l:l i="9">I</l:l>
+<l:l i="9">i</l:l>
+<l:l i="10">J</l:l>
+<l:l i="10">j</l:l>
+<l:l i="11">K</l:l>
+<l:l i="11">k</l:l>
+<l:l i="12">L</l:l>
+<l:l i="12">l</l:l>
+<l:l i="13">M</l:l>
+<l:l i="13">m</l:l>
+<l:l i="14">N</l:l>
+<l:l i="14">n</l:l>
+<l:l i="15">O</l:l>
+<l:l i="15">o</l:l>
+<l:l i="16">P</l:l>
+<l:l i="16">p</l:l>
+<l:l i="17">Q</l:l>
+<l:l i="17">q</l:l>
+<l:l i="18">R</l:l>
+<l:l i="18">r</l:l>
+<l:l i="19">S</l:l>
+<l:l i="19">s</l:l>
+<l:l i="20">Å </l:l>
+<l:l i="20">Å¡</l:l>
+<l:l i="21">T</l:l>
+<l:l i="21">t</l:l>
+<l:l i="22">U</l:l>
+<l:l i="22">u</l:l>
+<l:l i="23">V</l:l>
+<l:l i="23">v</l:l>
+<l:l i="24">W</l:l>
+<l:l i="24">w</l:l>
+<l:l i="25">X</l:l>
+<l:l i="25">x</l:l>
+<l:l i="26">Y</l:l>
+<l:l i="26">y</l:l>
+<l:l i="27">Z</l:l>
+<l:l i="27">z</l:l>
+<l:l i="28">Ž</l:l>
+<l:l i="28">ž</l:l>
+<l:l i="29">Ã…</l:l>
+<l:l i="29">Ã¥</l:l>
+<l:l i="30">Ä</l:l>
+<l:l i="30">ä</l:l>
+<l:l i="31">Ö</l:l>
+<l:l i="31">ö</l:l>
+</l:letters>
+</l:l10n>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/fr.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/fr.xml
new file mode 100644
index 0000000..5ca5248
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/fr.xml
@@ -0,0 +1,690 @@
+<?xml version="1.0" encoding="utf-8"?>
+<l:l10n xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0" language="fr" english-language-name="French">
+
+<!-- * This file is generated automatically. -->
+<!-- * To submit changes to this file upstream (to the DocBook Project) -->
+<!-- * do not submit an edited version of this file. Instead, submit an -->
+<!-- * edited version of the source file at the following location: -->
+<!-- * -->
+<!-- * https://docbook.svn.sourceforge.net/svnroot/docbook/trunk/gentext/locale/fr.xml -->
+<!-- * -->
+<!-- * E-mail the edited fr.xml source file to: -->
+<!-- * -->
+<!-- * docbook-developers@lists.sourceforge.net -->
+
+<!-- ******************************************************************** -->
+
+<!-- This file is part of the XSL DocBook Stylesheet distribution. -->
+<!-- See ../README or http://docbook.sf.net/release/xsl/current/ for -->
+<!-- copyright and other information. -->
+
+<!-- ******************************************************************** -->
+<!-- In these files, % with a letter is used for a placeholder: -->
+<!-- %t is the current element's title -->
+<!-- %s is the current element's subtitle (if applicable)-->
+<!-- %n is the current element's number label-->
+<!-- %p is the current element's page number (if applicable)-->
+<!-- ******************************************************************** -->
+
+
+<l:gentext key="Abstract" text="Résumé"/>
+<l:gentext key="abstract" text="Résumé"/>
+<l:gentext key="Acknowledgements" text="Remerciements"/>
+<l:gentext key="acknowledgements" text="Remerciements"/>
+<l:gentext key="Answer" text="R :"/>
+<l:gentext key="answer" text="R :"/>
+<l:gentext key="Appendix" text="Annexe"/>
+<l:gentext key="appendix" text="annexe"/>
+<l:gentext key="Article" text="Article"/>
+<l:gentext key="article" text="Article"/>
+<l:gentext key="Author" text="Auteur"/>
+<l:gentext key="Bibliography" text="Bibliographie"/>
+<l:gentext key="bibliography" text="Bibliographie"/>
+<l:gentext key="Book" text="Livre"/>
+<l:gentext key="book" text="Livre"/>
+<l:gentext key="CAUTION" text="ATTENTION"/>
+<l:gentext key="Caution" text="Attention"/>
+<l:gentext key="caution" text="Attention"/>
+<l:gentext key="Chapter" text="Chapitre"/>
+<l:gentext key="chapter" text="chapitre"/>
+<l:gentext key="Colophon" text="Achevé d'imprimer"/>
+<l:gentext key="colophon" text="Achevé d'imprimer"/>
+<l:gentext key="Copyright" text="Copyright"/>
+<l:gentext key="copyright" text="Copyright"/>
+<l:gentext key="Dedication" text="Dédicace"/>
+<l:gentext key="dedication" text="Dédicace"/>
+<l:gentext key="Edition" text="Édition"/>
+<l:gentext key="edition" text="Édition"/>
+<l:gentext key="Editor" text="Éditeur"/>
+<l:gentext key="Equation" text="Équation"/>
+<l:gentext key="equation" text="Équation"/>
+<l:gentext key="Example" text="Exemple"/>
+<l:gentext key="example" text="Exemple"/>
+<l:gentext key="Figure" text="Figure"/>
+<l:gentext key="figure" text="Figure"/>
+<l:gentext key="Glossary" text="Glossaire"/>
+<l:gentext key="glossary" text="Glossaire"/>
+<l:gentext key="GlossSee" text="Voir"/>
+<l:gentext key="glosssee" text="Voir"/>
+<l:gentext key="GlossSeeAlso" text="Voir aussi"/>
+<l:gentext key="glossseealso" text="Voir aussi"/>
+<l:gentext key="IMPORTANT" text="IMPORTANT"/>
+<l:gentext key="important" text="Important"/>
+<l:gentext key="Important" text="Important"/>
+<l:gentext key="Index" text="Index"/>
+<l:gentext key="index" text="Index"/>
+<l:gentext key="ISBN" text="ISBN"/>
+<l:gentext key="isbn" text="ISBN"/>
+<l:gentext key="LegalNotice" text="Note légale"/>
+<l:gentext key="legalnotice" text="Note légale"/>
+<l:gentext key="MsgAud" text="Public visé"/>
+<l:gentext key="msgaud" text="Public visé"/>
+<l:gentext key="MsgLevel" text="Niveau"/>
+<l:gentext key="msglevel" text="Niveau"/>
+<l:gentext key="MsgOrig" text="Origine"/>
+<l:gentext key="msgorig" text="Origine"/>
+<l:gentext key="NOTE" text="NOTE"/>
+<l:gentext key="Note" text="Note"/>
+<l:gentext key="note" text="Note"/>
+<l:gentext key="Part" text="Partie"/>
+<l:gentext key="part" text="Partie"/>
+<l:gentext key="Preface" text="Préface"/>
+<l:gentext key="preface" text="Préface"/>
+<l:gentext key="Procedure" text="Procédure"/>
+<l:gentext key="procedure" text="Procédure"/>
+<l:gentext key="ProductionSet" text="Production"/>
+<l:gentext key="PubDate" text="Date de publication"/>
+<l:gentext key="pubdate" text="Date de publication"/>
+<l:gentext key="Published" text="Publié le"/>
+<l:gentext key="published" text="Publié le"/>
+<l:gentext key="Publisher" text="Éditeur"/>
+<l:gentext key="Qandadiv" text="Q &amp; R"/>
+<l:gentext key="qandadiv" text="Q &amp; R"/>
+<l:gentext key="QandASet" text="Questions fréquemment posées"/>
+<l:gentext key="Question" text="Q :"/>
+<l:gentext key="question" text="Q :"/>
+<l:gentext key="RefEntry" text=""/>
+<l:gentext key="refentry" text=""/>
+<l:gentext key="Reference" text="Référence"/>
+<l:gentext key="reference" text="Référence"/>
+<l:gentext key="References" text="Références"/>
+<l:gentext key="RefName" text="Nom"/>
+<l:gentext key="refname" text="Nom"/>
+<l:gentext key="RefSection" text=""/>
+<l:gentext key="refsection" text=""/>
+<l:gentext key="RefSynopsisDiv" text="Synopsis"/>
+<l:gentext key="refsynopsisdiv" text="Synopsis"/>
+<l:gentext key="RevHistory" text="Historique des versions"/>
+<l:gentext key="revhistory" text="Historique des versions"/>
+<l:gentext key="revision" text="Version"/>
+<l:gentext key="Revision" text="Version"/>
+<l:gentext key="sect1" text="Section"/>
+<l:gentext key="sect2" text="Section"/>
+<l:gentext key="sect3" text="Section"/>
+<l:gentext key="sect4" text="Section"/>
+<l:gentext key="sect5" text="Section"/>
+<l:gentext key="section" text="section"/>
+<l:gentext key="Section" text="Section"/>
+<l:gentext key="see" text="voir"/>
+<l:gentext key="See" text="Voir"/>
+<l:gentext key="seealso" text="voir aussi"/>
+<l:gentext key="Seealso" text="Voir aussi"/>
+<l:gentext key="SeeAlso" text="Voir Aussi"/>
+<l:gentext key="set" text="Ensemble"/>
+<l:gentext key="Set" text="Ensemble"/>
+<l:gentext key="setindex" text="Index"/>
+<l:gentext key="SetIndex" text="Index"/>
+<l:gentext key="Sidebar" text="Filet vertical"/>
+<l:gentext key="sidebar" text="Filet vertical"/>
+<l:gentext key="step" text="étape"/>
+<l:gentext key="Step" text="Étape"/>
+<l:gentext key="table" text="Tableau"/>
+<l:gentext key="Table" text="Tableau"/>
+<l:gentext key="task" text="Tâche"/>
+<l:gentext key="Task" text="Tâche"/>
+<l:gentext key="tip" text="Astuce"/>
+<l:gentext key="TIP" text="ASTUCE"/>
+<l:gentext key="Tip" text="Astuce"/>
+<l:gentext key="Warning" text="Avertissement"/>
+<l:gentext key="warning" text="Avertissement"/>
+<l:gentext key="WARNING" text="AVERTISSEMENT"/>
+<l:gentext key="and" text="et"/>
+<l:gentext key="by" text="par"/>
+<l:gentext key="Edited" text="Publié"/>
+<l:gentext key="edited" text="Publié"/>
+<l:gentext key="Editedby" text="Publié par"/>
+<l:gentext key="editedby" text="Publié par"/>
+<l:gentext key="in" text="dans"/>
+<l:gentext key="lastlistcomma" text=","/>
+<l:gentext key="listcomma" text=","/>
+<l:gentext key="notes" text="Notes"/>
+<l:gentext key="Notes" text="Notes"/>
+<l:gentext key="Pgs" text="Pages"/>
+<l:gentext key="pgs" text="Pages"/>
+<l:gentext key="Revisedby" text="Revu et corrigé par : "/>
+<l:gentext key="revisedby" text="Revu et corrigé par : "/>
+<l:gentext key="TableNotes" text="Remarques"/>
+<l:gentext key="tablenotes" text="Remarques"/>
+<l:gentext key="TableofContents" text="Table des matières"/>
+<l:gentext key="tableofcontents" text="Table des matières"/>
+<l:gentext key="unexpectedelementname" text="Nom d'élément inattendu"/>
+<l:gentext key="unsupported" text="Non reconnu par le système"/>
+<l:gentext key="xrefto" text="Référence vers"/>
+<l:gentext key="Authors" text="Auteurs"/>
+<l:gentext key="copyeditor" text="Relecteur"/>
+<l:gentext key="graphicdesigner" text="Graphiste"/>
+<l:gentext key="productioneditor" text="Directeur de la production"/>
+<l:gentext key="technicaleditor" text="Rédacteur technique"/>
+<l:gentext key="translator" text="Traducteur"/>
+<l:gentext key="listofequations" text="Liste des équations"/>
+<l:gentext key="ListofEquations" text="Liste des équations"/>
+<l:gentext key="ListofExamples" text="Liste des exemples"/>
+<l:gentext key="listofexamples" text="Liste des exemples"/>
+<l:gentext key="ListofFigures" text="Liste des illustrations"/>
+<l:gentext key="listoffigures" text="Liste des illustrations"/>
+<l:gentext key="ListofProcedures" text="Liste des procédures"/>
+<l:gentext key="listofprocedures" text="Liste des procédures"/>
+<l:gentext key="listoftables" text="Liste des tableaux"/>
+<l:gentext key="ListofTables" text="Liste des tableaux"/>
+<l:gentext key="ListofUnknown" text="Liste inconnue"/>
+<l:gentext key="listofunknown" text="Liste inconnue"/>
+<l:gentext key="nav-home" text="Sommaire"/>
+<l:gentext key="nav-next" text="Suivant"/>
+<l:gentext key="nav-next-sibling" text="Avance rapide"/>
+<l:gentext key="nav-prev" text="Précédent"/>
+<l:gentext key="nav-prev-sibling" text="Arrière rapide"/>
+<l:gentext key="nav-up" text="Niveau supérieur"/>
+<l:gentext key="nav-toc" text="TdM"/>
+<l:gentext key="Draft" text="Brouillon"/>
+<l:gentext key="above" text="au-dessus"/>
+<l:gentext key="below" text="au-dessous"/>
+<l:gentext key="sectioncalled" text="la section intitulée"/>
+<l:gentext key="index symbols" text="Symboles"/>
+<l:gentext key="writing-mode" text="lr-tb"/>
+<l:gentext key="lowercase.alpha" text="abcdefghijklmnopqrstuvwxyzâêîôûëïüàèùéçæœ"/>
+<l:gentext key="uppercase.alpha" text="ABCDEFGHIJKLMNOPQRSTUVWXYZÂÊÎÔÛËÃÜÀÈÙÉÇÆŒ"/>
+<l:gentext key="normalize.sort.input" text="AaÀàÃáÂâÃãÄäÅåĀÄĂ㥹ÇǎǞǟǠǡǺǻȀÈȂȃȦȧḀá¸áºšáº áº¡áº¢áº£áº¤áº¥áº¦áº§áº¨áº©áºªáº«áº¬áº­áº®áº¯áº°áº±áº²áº³áº´áºµáº¶áº·BbÆ€ÆɓƂƃḂḃḄḅḆḇCcÇçĆćĈĉĊċČÄƇƈɕḈḉDdÄŽÄÄđƊɗƋƌDžDzȡɖḊḋḌá¸á¸Žá¸á¸á¸‘ḒḓEeÈèÉéÊêËëĒēĔĕĖėĘęĚěȄȅȆȇȨȩḔḕḖḗḘḙḚḛḜá¸áº¸áº¹áººáº»áº¼áº½áº¾áº¿á»€á»á»‚ểỄễỆệFfƑƒḞḟGgÄœÄĞğĠġĢģƓɠǤǥǦǧǴǵḠḡHhĤĥĦħȞȟɦḢḣḤḥḦḧḨḩḪḫẖIiÌìÃíÎîÃïĨĩĪīĬĭĮįİƗɨÇÇȈȉȊȋḬḭḮḯỈỉỊịJjĴĵǰÊKkĶķƘƙǨǩḰḱḲḳḴḵLlĹĺĻļĽľĿŀÅłƚLjȴɫɬɭḶḷḸḹḺḻḼḽMmɱḾḿṀá¹á¹‚ṃNnÑñŃńŅņŇňÆɲƞȠNjǸǹȵɳṄṅṆṇṈṉṊṋOoÒòÓóÔôÕõÖöØøŌÅÅŽÅÅőƟƠơǑǒǪǫǬǭǾǿȌÈÈŽÈȪȫȬȭȮȯȰȱṌá¹á¹Žá¹á¹á¹‘ṒṓỌá»á»Žá»á»á»‘ỒồỔổỖỗỘộỚớỜá»á»žá»Ÿá» á»¡á»¢á»£PpƤƥṔṕṖṗQqÊ RrŔŕŖŗŘřÈȑȒȓɼɽɾṘṙṚṛṜá¹á¹žá¹ŸSsŚśŜÅŞşŠšȘșʂṠṡṢṣṤṥṦṧṨṩTtŢţŤťŦŧƫƬƭƮʈȚțȶṪṫṬṭṮṯṰṱẗUuÙùÚúÛûÜüŨũŪūŬŭŮůŰűŲųƯưǓǔǕǖǗǘǙǚǛǜȔȕȖȗṲṳṴṵṶṷṸṹṺṻỤụỦủỨứỪừỬửỮữỰựVvƲʋṼṽṾṿWwŴŵẀáºáº‚ẃẄẅẆẇẈẉẘXxẊẋẌáºYyÃýÿŸŶŷƳƴȲȳẎáºáº™á»²á»³á»´á»µá»¶á»·á»¸á»¹ZzŹźŻżŽžƵƶȤȥÊÊ‘áºáº‘ẒẓẔẕẕ"/>
+<l:gentext key="normalize.sort.output" text="AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBCCCCCCCCCCCCCCCCCDDDDDDDDDDDDDDDDDDDDDDDDEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEFFFFFFGGGGGGGGGGGGGGGGGGGGHHHHHHHHHHHHHHHHHHHHIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIJJJJJJKKKKKKKKKKKKKKLLLLLLLLLLLLLLLLLLLLLLLLLLMMMMMMMMMNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOPPPPPPPPQQQRRRRRRRRRRRRRRRRRRRRRRRSSSSSSSSSSSSSSSSSSSSSSSTTTTTTTTTTTTTTTTTTTTTTTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUVVVVVVVVWWWWWWWWWWWWWWWXXXXXXYYYYYYYYYYYYYYYYYYYYYYYZZZZZZZZZZZZZZZZZZZZZ"/>
+<l:dingbat key="startquote" text="« "/>
+<l:dingbat key="endquote" text=" »"/>
+<l:dingbat key="nestedstartquote" text="“"/>
+<l:dingbat key="nestedendquote" text="â€"/>
+<l:dingbat key="singlestartquote" text="‹"/>
+<l:dingbat key="singleendquote" text="›"/>
+<l:dingbat key="bullet" text="•"/>
+<l:gentext key="hyphenation-character" text="-"/>
+<l:gentext key="hyphenation-push-character-count" text="2"/>
+<l:gentext key="hyphenation-remain-character-count" text="2"/>
+<l:context name="styles"><l:template name="person-name" text="first-last"/>
+</l:context>
+<l:context name="title"><l:template name="abstract" text="%t"/>
+<l:template name="acknowledgements" text="%t"/>
+<l:template name="answer" text="%t"/>
+<l:template name="appendix" text="Annexe %n. %t"/>
+<l:template name="article" text="%t"/>
+<l:template name="authorblurb" text="%t"/>
+<l:template name="bibliodiv" text="%t"/>
+<l:template name="biblioentry" text="%t"/>
+<l:template name="bibliography" text="%t"/>
+<l:template name="bibliolist" text="%t"/>
+<l:template name="bibliomixed" text="%t"/>
+<l:template name="bibliomset" text="%t"/>
+<l:template name="biblioset" text="%t"/>
+<l:template name="blockquote" text="%t"/>
+<l:template name="book" text="%t"/>
+<l:template name="calloutlist" text="%t"/>
+<l:template name="caution" text="%t"/>
+<l:template name="chapter" text="Chapitre %n. %t"/>
+<l:template name="colophon" text="%t"/>
+<l:template name="dedication" text="%t"/>
+<l:template name="equation" text="Équation %n. %t"/>
+<l:template name="example" text="Exemple %n. %t"/>
+<l:template name="figure" text="Figure %n. %t"/>
+<l:template name="foil" text="%t"/>
+<l:template name="foilgroup" text="%t"/>
+<l:template name="formalpara" text="%t"/>
+<l:template name="glossary" text="%t"/>
+<l:template name="glossdiv" text="%t"/>
+<l:template name="glosslist" text="%t"/>
+<l:template name="glossentry" text="%t"/>
+<l:template name="important" text="%t"/>
+<l:template name="index" text="%t"/>
+<l:template name="indexdiv" text="%t"/>
+<l:template name="itemizedlist" text="%t"/>
+<l:template name="legalnotice" text="%t"/>
+<l:template name="listitem" text=""/>
+<l:template name="lot" text="%t"/>
+<l:template name="msg" text="%t"/>
+<l:template name="msgexplan" text="%t"/>
+<l:template name="msgmain" text="%t"/>
+<l:template name="msgrel" text="%t"/>
+<l:template name="msgset" text="%t"/>
+<l:template name="msgsub" text="%t"/>
+<l:template name="note" text="%t"/>
+<l:template name="orderedlist" text="%t"/>
+<l:template name="part" text="%t"/>
+<l:template name="partintro" text="%t"/>
+<l:template name="preface" text="%t"/>
+<l:template name="procedure" text="%t"/>
+<l:template name="procedure.formal" text="Procédure %n. %t"/>
+<l:template name="productionset" text="%t"/>
+<l:template name="productionset.formal" text="Production %n"/>
+<l:template name="qandadiv" text="%t"/>
+<l:template name="qandaentry" text="%t"/>
+<l:template name="qandaset" text="%t"/>
+<l:template name="question" text="%t"/>
+<l:template name="refentry" text="%t"/>
+<l:template name="reference" text="%t"/>
+<l:template name="refsection" text="%t"/>
+<l:template name="refsect1" text="%t"/>
+<l:template name="refsect2" text="%t"/>
+<l:template name="refsect3" text="%t"/>
+<l:template name="refsynopsisdiv" text="%t"/>
+<l:template name="refsynopsisdivinfo" text="%t"/>
+<l:template name="segmentedlist" text="%t"/>
+<l:template name="set" text="%t"/>
+<l:template name="setindex" text="%t"/>
+<l:template name="sidebar" text="%t"/>
+<l:template name="step" text="%t"/>
+<l:template name="table" text="Tableau %n. %t"/>
+<l:template name="task" text="%t"/>
+<l:template name="tasksummary" text="%t"/>
+<l:template name="taskprerequisites" text="%t"/>
+<l:template name="taskrelated" text="%t"/>
+<l:template name="tip" text="%t"/>
+<l:template name="toc" text="%t"/>
+<l:template name="variablelist" text="%t"/>
+<l:template name="varlistentry" text=""/>
+<l:template name="warning" text="%t"/>
+</l:context>
+<l:context name="title-unnumbered"><l:template name="appendix" text="%t"/>
+<l:template name="article/appendix" text="%t"/>
+<l:template name="bridgehead" text="%t"/>
+<l:template name="chapter" text="%t"/>
+<l:template name="sect1" text="%t"/>
+<l:template name="sect2" text="%t"/>
+<l:template name="sect3" text="%t"/>
+<l:template name="sect4" text="%t"/>
+<l:template name="sect5" text="%t"/>
+<l:template name="section" text="%t"/>
+<l:template name="simplesect" text="%t"/>
+<l:template name="part" text="%t"/>
+</l:context>
+<l:context name="title-numbered"><l:template name="appendix" text="Annexe %n. %t"/>
+<l:template name="article/appendix" text="%n. %t"/>
+<l:template name="bridgehead" text="%n. %t"/>
+<l:template name="chapter" text="Chapitre %n. %t"/>
+<l:template name="part" text="Partie %n. %t"/>
+<l:template name="sect1" text="%n. %t"/>
+<l:template name="sect2" text="%n. %t"/>
+<l:template name="sect3" text="%n. %t"/>
+<l:template name="sect4" text="%n. %t"/>
+<l:template name="sect5" text="%n. %t"/>
+<l:template name="section" text="%n. %t"/>
+<l:template name="simplesect" text="%t"/>
+</l:context>
+<l:context name="subtitle"><l:template name="appendix" text="%s"/>
+<l:template name="acknowledgements" text="%s"/>
+<l:template name="article" text="%s"/>
+<l:template name="bibliodiv" text="%s"/>
+<l:template name="biblioentry" text="%s"/>
+<l:template name="bibliography" text="%s"/>
+<l:template name="bibliomixed" text="%s"/>
+<l:template name="bibliomset" text="%s"/>
+<l:template name="biblioset" text="%s"/>
+<l:template name="book" text="%s"/>
+<l:template name="chapter" text="%s"/>
+<l:template name="colophon" text="%s"/>
+<l:template name="dedication" text="%s"/>
+<l:template name="glossary" text="%s"/>
+<l:template name="glossdiv" text="%s"/>
+<l:template name="index" text="%s"/>
+<l:template name="indexdiv" text="%s"/>
+<l:template name="lot" text="%s"/>
+<l:template name="part" text="%s"/>
+<l:template name="partintro" text="%s"/>
+<l:template name="preface" text="%s"/>
+<l:template name="refentry" text="%s"/>
+<l:template name="reference" text="%s"/>
+<l:template name="refsection" text="%s"/>
+<l:template name="refsect1" text="%s"/>
+<l:template name="refsect2" text="%s"/>
+<l:template name="refsect3" text="%s"/>
+<l:template name="refsynopsisdiv" text="%s"/>
+<l:template name="sect1" text="%s"/>
+<l:template name="sect2" text="%s"/>
+<l:template name="sect3" text="%s"/>
+<l:template name="sect4" text="%s"/>
+<l:template name="sect5" text="%s"/>
+<l:template name="section" text="%s"/>
+<l:template name="set" text="%s"/>
+<l:template name="setindex" text="%s"/>
+<l:template name="sidebar" text="%s"/>
+<l:template name="simplesect" text="%s"/>
+<l:template name="toc" text="%s"/>
+</l:context>
+<l:context name="xref"><l:template name="abstract" text="%t"/>
+<l:template name="acknowledgements" text="%t"/>
+<l:template name="answer" text="R : %n"/>
+<l:template name="appendix" text="%t"/>
+<l:template name="article" text="%t"/>
+<l:template name="authorblurb" text="%t"/>
+<l:template name="bibliodiv" text="%t"/>
+<l:template name="bibliography" text="%t"/>
+<l:template name="bibliomset" text="%t"/>
+<l:template name="biblioset" text="%t"/>
+<l:template name="blockquote" text="%t"/>
+<l:template name="book" text="%t"/>
+<l:template name="calloutlist" text="%t"/>
+<l:template name="caution" text="%t"/>
+<l:template name="chapter" text="%t"/>
+<l:template name="colophon" text="%t"/>
+<l:template name="constraintdef" text="%t"/>
+<l:template name="dedication" text="%t"/>
+<l:template name="equation" text="%t"/>
+<l:template name="example" text="%t"/>
+<l:template name="figure" text="%t"/>
+<l:template name="foil" text="%t"/>
+<l:template name="foilgroup" text="%t"/>
+<l:template name="formalpara" text="%t"/>
+<l:template name="glossary" text="%t"/>
+<l:template name="glossdiv" text="%t"/>
+<l:template name="important" text="%t"/>
+<l:template name="index" text="%t"/>
+<l:template name="indexdiv" text="%t"/>
+<l:template name="itemizedlist" text="%t"/>
+<l:template name="legalnotice" text="%t"/>
+<l:template name="listitem" text="%n"/>
+<l:template name="lot" text="%t"/>
+<l:template name="msg" text="%t"/>
+<l:template name="msgexplan" text="%t"/>
+<l:template name="msgmain" text="%t"/>
+<l:template name="msgrel" text="%t"/>
+<l:template name="msgset" text="%t"/>
+<l:template name="msgsub" text="%t"/>
+<l:template name="note" text="%t"/>
+<l:template name="orderedlist" text="%t"/>
+<l:template name="part" text="%t"/>
+<l:template name="partintro" text="%t"/>
+<l:template name="preface" text="%t"/>
+<l:template name="procedure" text="%t"/>
+<l:template name="productionset" text="%t"/>
+<l:template name="qandadiv" text="%t"/>
+<l:template name="qandaentry" text="Q : %n"/>
+<l:template name="qandaset" text="%t"/>
+<l:template name="question" text="Q : %n"/>
+<l:template name="reference" text="%t"/>
+<l:template name="refsynopsisdiv" text="%t"/>
+<l:template name="segmentedlist" text="%t"/>
+<l:template name="set" text="%t"/>
+<l:template name="setindex" text="%t"/>
+<l:template name="sidebar" text="%t"/>
+<l:template name="table" text="%t"/>
+<l:template name="task" text="%t"/>
+<l:template name="tip" text="%t"/>
+<l:template name="toc" text="%t"/>
+<l:template name="variablelist" text="%t"/>
+<l:template name="varlistentry" text="%n"/>
+<l:template name="warning" text="%t"/>
+<l:template name="olink.document.citation" text=" in %o"/>
+<l:template name="olink.page.citation" text=" (page %p)"/>
+<l:template name="page.citation" text=" [%p]"/>
+<l:template name="page" text="(page %p)"/>
+<l:template name="docname" text=" dans %o"/>
+<l:template name="docnamelong" text=" dans le document intitulé %o"/>
+<l:template name="pageabbrev" text="(p. %p)"/>
+<l:template name="Page" text="Page %p"/>
+<l:template name="bridgehead" text="la section intitulée « %t »"/>
+<l:template name="refsection" text="la section intitulée « %t »"/>
+<l:template name="refsect1" text="la section intitulée « %t »"/>
+<l:template name="refsect2" text="la section intitulée « %t »"/>
+<l:template name="refsect3" text="la section intitulée « %t »"/>
+<l:template name="sect1" text="la section intitulée « %t »"/>
+<l:template name="sect2" text="la section intitulée « %t »"/>
+<l:template name="sect3" text="la section intitulée « %t »"/>
+<l:template name="sect4" text="la section intitulée « %t »"/>
+<l:template name="sect5" text="la section intitulée « %t »"/>
+<l:template name="section" text="la section intitulée « %t »"/>
+<l:template name="simplesect" text="la section intitulée « %t »"/>
+</l:context>
+<l:context name="xref-number"><l:template name="answer" text="R : %n"/>
+<l:template name="appendix" text="Annexe %n"/>
+<l:template name="bridgehead" text="Section %n"/>
+<l:template name="chapter" text="Chapitre %n"/>
+<l:template name="equation" text="Équation %n"/>
+<l:template name="example" text="Exemple %n"/>
+<l:template name="figure" text="Figure %n"/>
+<l:template name="part" text="Partie %n"/>
+<l:template name="procedure" text="Procédure %n"/>
+<l:template name="productionset" text="Production %n"/>
+<l:template name="qandadiv" text="Q &amp; R %n"/>
+<l:template name="qandaentry" text="Q : %n"/>
+<l:template name="question" text="Q : %n"/>
+<l:template name="sect1" text="Section %n"/>
+<l:template name="sect2" text="Section %n"/>
+<l:template name="sect3" text="Section %n"/>
+<l:template name="sect4" text="Section %n"/>
+<l:template name="sect5" text="Section %n"/>
+<l:template name="section" text="Section %n"/>
+<l:template name="table" text="Tableau %n"/>
+</l:context>
+<l:context name="xref-number-and-title"><l:template name="appendix" text="Annexe %n, %t"/>
+<l:template name="bridgehead" text="Section %n, « %t »"/>
+<l:template name="chapter" text="Chapitre %n, %t"/>
+<l:template name="equation" text="Équation %n, « %t »"/>
+<l:template name="example" text="Exemple %n, « %t »"/>
+<l:template name="figure" text="Figure %n, « %t »"/>
+<l:template name="part" text="Partie %n, « %t »"/>
+<l:template name="procedure" text="Procédure %n, « %t »"/>
+<l:template name="productionset" text="Production %n, « %t »"/>
+<l:template name="qandadiv" text="Q &amp; R %n, « %t »"/>
+<l:template name="refsect1" text="la section intitulée « %t »"/>
+<l:template name="refsect2" text="la section intitulée « %t »"/>
+<l:template name="refsect3" text="la section intitulée « %t »"/>
+<l:template name="refsection" text="la section intitulée « %t »"/>
+<l:template name="sect1" text="Section %n, « %t »"/>
+<l:template name="sect2" text="Section %n, « %t »"/>
+<l:template name="sect3" text="Section %n, « %t »"/>
+<l:template name="sect4" text="Section %n, « %t »"/>
+<l:template name="sect5" text="Section %n, « %t »"/>
+<l:template name="section" text="Section %n, « %t »"/>
+<l:template name="simplesect" text="la section intitulée « %t »"/>
+<l:template name="table" text="Tableau %n, « %t »"/>
+</l:context>
+<l:context name="authorgroup"><l:template name="sep" text=", "/>
+<l:template name="sep2" text=" et "/>
+<l:template name="seplast" text=", et "/>
+</l:context>
+<l:context name="glossary"><l:template name="see" text="Voir %t."/>
+<l:template name="seealso" text="Voir aussi %t."/>
+<l:template name="seealso-separator" text=", "/>
+</l:context>
+<l:context name="msgset"><l:template name="MsgAud" text="Public visé: "/>
+<l:template name="MsgLevel" text="Niveau: "/>
+<l:template name="MsgOrig" text="Origine: "/>
+</l:context>
+<l:context name="datetime"><l:template name="format" text="d/m/Y"/>
+</l:context>
+<l:context name="termdef"><l:template name="prefix" text="[Définition : "/>
+<l:template name="suffix" text="]"/>
+</l:context>
+<l:context name="datetime-full"><l:template name="January" text="janvier"/>
+<l:template name="February" text="février"/>
+<l:template name="March" text="mars"/>
+<l:template name="April" text="avril"/>
+<l:template name="May" text="mai"/>
+<l:template name="June" text="juin"/>
+<l:template name="July" text="juillet"/>
+<l:template name="August" text="août"/>
+<l:template name="September" text="septembre"/>
+<l:template name="October" text="octobre"/>
+<l:template name="November" text="novembre"/>
+<l:template name="December" text="décembre"/>
+<l:template name="Monday" text="lundi"/>
+<l:template name="Tuesday" text="mardi"/>
+<l:template name="Wednesday" text="mercredi"/>
+<l:template name="Thursday" text="jeudi"/>
+<l:template name="Friday" text="vendredi"/>
+<l:template name="Saturday" text="samedi"/>
+<l:template name="Sunday" text="dimanche"/>
+</l:context>
+<l:context name="datetime-abbrev"><l:template name="Jan" text="jan"/>
+<l:template name="Feb" text="fév"/>
+<l:template name="Mar" text="mar"/>
+<l:template name="Apr" text="avr"/>
+<l:template name="May" text="mai"/>
+<l:template name="Jun" text="jun"/>
+<l:template name="Jul" text="jui"/>
+<l:template name="Aug" text="aoû"/>
+<l:template name="Sep" text="sep"/>
+<l:template name="Oct" text="oct"/>
+<l:template name="Nov" text="nov"/>
+<l:template name="Dec" text="déc"/>
+<l:template name="Mon" text="lun"/>
+<l:template name="Tue" text="mar"/>
+<l:template name="Wed" text="mer"/>
+<l:template name="Thu" text="jeu"/>
+<l:template name="Fri" text="ven"/>
+<l:template name="Sat" text="sam"/>
+<l:template name="Sun" text="dim"/>
+</l:context>
+<l:context name="htmlhelp"><l:template name="langcode" text="0x040c French (FRANCE)"/>
+</l:context>
+<l:context name="index"><l:template name="term-separator" text=", "/>
+<l:template name="number-separator" text=", "/>
+<l:template name="range-separator" text="-"/>
+</l:context>
+<l:context name="iso690"><l:template name="lastfirst.sep" text=", "/>
+<l:template name="alt.person.two.sep" text=" – "/>
+<l:template name="alt.person.last.sep" text=" – "/>
+<l:template name="alt.person.more.sep" text=" – "/>
+<l:template name="primary.editor" text=" (éd.)"/>
+<l:template name="primary.many" text=", et al."/>
+<l:template name="primary.sep" text=". "/>
+<l:template name="submaintitle.sep" text=": "/>
+<l:template name="title.sep" text=". "/>
+<l:template name="othertitle.sep" text=", "/>
+<l:template name="medium1" text=" ["/>
+<l:template name="medium2" text="]"/>
+<l:template name="secondary.person.sep" text="; "/>
+<l:template name="secondary.sep" text=". "/>
+<l:template name="respons.sep" text=". "/>
+<l:template name="edition.sep" text=". "/>
+<l:template name="edition.serial.sep" text=", "/>
+<l:template name="issuing.range" text="-"/>
+<l:template name="issuing.div" text=", "/>
+<l:template name="issuing.sep" text=". "/>
+<l:template name="partnr.sep" text=". "/>
+<l:template name="placepubl.sep" text=": "/>
+<l:template name="publyear.sep" text=", "/>
+<l:template name="pubinfo.sep" text=". "/>
+<l:template name="spec.pubinfo.sep" text=", "/>
+<l:template name="upd.sep" text=", "/>
+<l:template name="datecit1" text=" [cited "/>
+<l:template name="datecit2" text="]"/>
+<l:template name="extent.sep" text=". "/>
+<l:template name="locs.sep" text=", "/>
+<l:template name="location.sep" text=". "/>
+<l:template name="serie.sep" text=". "/>
+<l:template name="notice.sep" text=". "/>
+<l:template name="access" text="Disponible "/>
+<l:template name="acctoo" text="Également disponible "/>
+<l:template name="onwww" text="sur World Wide Web"/>
+<l:template name="oninet" text="sur Internet"/>
+<l:template name="access.end" text=": "/>
+<l:template name="link1" text="&lt;"/>
+<l:template name="link2" text="&gt;"/>
+<l:template name="access.sep" text=". "/>
+<l:template name="isbn" text="ISBN "/>
+<l:template name="issn" text="ISSN "/>
+<l:template name="stdnum.sep" text=". "/>
+<l:template name="patcountry.sep" text=". "/>
+<l:template name="pattype.sep" text=", "/>
+<l:template name="patnum.sep" text=". "/>
+<l:template name="patdate.sep" text=". "/>
+</l:context><l:letters><l:l i="-1"/>
+<l:l i="0">Symboles</l:l>
+<l:l i="1">A</l:l>
+<l:l i="1">a</l:l>
+<l:l i="1">à</l:l>
+<l:l i="1">À</l:l>
+<l:l i="1">â</l:l>
+<l:l i="1">Â</l:l>
+<l:l i="1">Æ</l:l>
+<l:l i="1">æ</l:l>
+<l:l i="2">B</l:l>
+<l:l i="2">b</l:l>
+<l:l i="3">C</l:l>
+<l:l i="3">c</l:l>
+<l:l i="3">ç</l:l>
+<l:l i="4">D</l:l>
+<l:l i="4">d</l:l>
+<l:l i="5">E</l:l>
+<l:l i="5">e</l:l>
+<l:l i="5">ê</l:l>
+<l:l i="5">Ê</l:l>
+<l:l i="5">é</l:l>
+<l:l i="5">É</l:l>
+<l:l i="5">è</l:l>
+<l:l i="5">È</l:l>
+<l:l i="5">ë</l:l>
+<l:l i="5">Ë</l:l>
+<l:l i="5">€</l:l>
+<l:l i="6">F</l:l>
+<l:l i="6">f</l:l>
+<l:l i="7">G</l:l>
+<l:l i="7">g</l:l>
+<l:l i="8">H</l:l>
+<l:l i="8">h</l:l>
+<l:l i="9">I</l:l>
+<l:l i="9">i</l:l>
+<l:l i="9">ÃŽ</l:l>
+<l:l i="9">î</l:l>
+<l:l i="9">Ã</l:l>
+<l:l i="9">ï</l:l>
+<l:l i="10">J</l:l>
+<l:l i="10">j</l:l>
+<l:l i="11">K</l:l>
+<l:l i="11">k</l:l>
+<l:l i="12">L</l:l>
+<l:l i="12">l</l:l>
+<l:l i="13">M</l:l>
+<l:l i="13">m</l:l>
+<l:l i="14">N</l:l>
+<l:l i="14">n</l:l>
+<l:l i="15">O</l:l>
+<l:l i="15">o</l:l>
+<l:l i="15">Ö</l:l>
+<l:l i="15">ö</l:l>
+<l:l i="15">Å’</l:l>
+<l:l i="15">Å“</l:l>
+<l:l i="16">P</l:l>
+<l:l i="16">p</l:l>
+<l:l i="17">Q</l:l>
+<l:l i="17">q</l:l>
+<l:l i="18">R</l:l>
+<l:l i="18">r</l:l>
+<l:l i="19">S</l:l>
+<l:l i="19">s</l:l>
+<l:l i="20">T</l:l>
+<l:l i="20">t</l:l>
+<l:l i="21">U</l:l>
+<l:l i="21">u</l:l>
+<l:l i="21">Ù</l:l>
+<l:l i="21">ù</l:l>
+<l:l i="21">Û</l:l>
+<l:l i="21">û</l:l>
+<l:l i="21">Ü</l:l>
+<l:l i="21">ü</l:l>
+<l:l i="22">V</l:l>
+<l:l i="22">v</l:l>
+<l:l i="23">W</l:l>
+<l:l i="23">w</l:l>
+<l:l i="24">X</l:l>
+<l:l i="24">x</l:l>
+<l:l i="25">Y</l:l>
+<l:l i="25">y</l:l>
+<l:l i="26">Z</l:l>
+<l:l i="26">z</l:l>
+</l:letters>
+</l:l10n>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/ga.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/ga.xml
new file mode 100644
index 0000000..054036b
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/ga.xml
@@ -0,0 +1,1229 @@
+<?xml version="1.0" encoding="utf-8"?>
+<l:l10n xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0" language="ga" english-language-name="Irish">
+
+<!-- * This file is generated automatically. -->
+<!-- * To submit changes to this file upstream (to the DocBook Project) -->
+<!-- * do not submit an edited version of this file. Instead, submit an -->
+<!-- * edited version of the source file at the following location: -->
+<!-- * -->
+<!-- * https://docbook.svn.sourceforge.net/svnroot/docbook/trunk/gentext/locale/ga.xml -->
+<!-- * -->
+<!-- * E-mail the edited ga.xml source file to: -->
+<!-- * -->
+<!-- * docbook-developers@lists.sourceforge.net -->
+
+<!-- ******************************************************************** -->
+
+<!-- This file is part of the XSL DocBook Stylesheet distribution. -->
+<!-- See ../README or http://docbook.sf.net/release/xsl/current/ for -->
+<!-- copyright and other information. -->
+
+<!-- ******************************************************************** -->
+<!-- In these files, % with a letter is used for a placeholder: -->
+<!-- %t is the current element's title -->
+<!-- %s is the current element's subtitle (if applicable)-->
+<!-- %n is the current element's number label-->
+<!-- %p is the current element's page number (if applicable)-->
+<!-- ******************************************************************** -->
+
+
+<l:gentext key="Abstract" text="Achoimre"/>
+<l:gentext key="abstract" text="Achoimre"/>
+<l:gentext key="Acknowledgements" text="Acknowledgements" lang="en"/>
+<l:gentext key="acknowledgements" text="Acknowledgements" lang="en"/>
+<l:gentext key="Answer" text="F:"/>
+<l:gentext key="answer" text="F:"/>
+<l:gentext key="Appendix" text="Aguisín"/>
+<l:gentext key="appendix" text="Aguisín"/>
+<l:gentext key="Article" text="Alt"/>
+<l:gentext key="article" text="Alt"/>
+<l:gentext key="Author" text="Údar"/>
+<l:gentext key="Bibliography" text="Leabharliosta"/>
+<l:gentext key="bibliography" text="Leabharliosta"/>
+<l:gentext key="Book" text="Leabhar"/>
+<l:gentext key="book" text="Leabhar"/>
+<l:gentext key="CAUTION" text="FAINIC"/>
+<l:gentext key="Caution" text="Fainic"/>
+<l:gentext key="caution" text="Fainic"/>
+<l:gentext key="Chapter" text="Caibidil"/>
+<l:gentext key="chapter" text="Caibidil"/>
+<l:gentext key="Colophon" text="Colafan"/>
+<l:gentext key="colophon" text="Colafan"/>
+<l:gentext key="Copyright" text="Cóipcheart"/>
+<l:gentext key="copyright" text="Cóipcheart"/>
+<l:gentext key="Dedication" text="Tíolacadh"/>
+<l:gentext key="dedication" text="Tíolacadh"/>
+<l:gentext key="Edition" text="Eagrán"/>
+<l:gentext key="edition" text="Eagrán"/>
+<l:gentext key="Editor" text="Editor" lang="en"/>
+<l:gentext key="Equation" text="Cothromóid"/>
+<l:gentext key="equation" text="Cothromóid"/>
+<l:gentext key="Example" text="Sampla"/>
+<l:gentext key="example" text="Sampla"/>
+<l:gentext key="Figure" text="Léaráid"/>
+<l:gentext key="figure" text="Léaráid"/>
+<l:gentext key="Glossary" text="Gluais"/>
+<l:gentext key="glossary" text="Gluais"/>
+<l:gentext key="GlossSee" text="Féach"/>
+<l:gentext key="glosssee" text="Féach"/>
+<l:gentext key="GlossSeeAlso" text="Féach Freisin"/>
+<l:gentext key="glossseealso" text="Féach Freisin"/>
+<l:gentext key="IMPORTANT" text="TÃBHACHTACH"/>
+<l:gentext key="important" text="Tábhachtach"/>
+<l:gentext key="Important" text="Tábhachtach"/>
+<l:gentext key="Index" text="Innéacs"/>
+<l:gentext key="index" text="Innéacs"/>
+<l:gentext key="ISBN" text="ISBN"/>
+<l:gentext key="isbn" text="ISBN"/>
+<l:gentext key="LegalNotice" text="Fógra Dlí"/>
+<l:gentext key="legalnotice" text="Fógra Dlí"/>
+<l:gentext key="MsgAud" text="Sprioclucht"/>
+<l:gentext key="msgaud" text="Sprioclucht"/>
+<l:gentext key="MsgLevel" text="Leibhéal"/>
+<l:gentext key="msglevel" text="Leibhéal"/>
+<l:gentext key="MsgOrig" text="Foinse"/>
+<l:gentext key="msgorig" text="Foinse"/>
+<l:gentext key="NOTE" text="NÓTA"/>
+<l:gentext key="Note" text="Nóta"/>
+<l:gentext key="note" text="Nóta"/>
+<l:gentext key="Part" text="Cuid"/>
+<l:gentext key="part" text="Cuid"/>
+<l:gentext key="Preface" text="Réamhrá"/>
+<l:gentext key="preface" text="Réamhrá"/>
+<l:gentext key="Procedure" text="Gnás"/>
+<l:gentext key="procedure" text="Gnás"/>
+<l:gentext key="ProductionSet" text="Rialacha Táirgthe"/>
+<l:gentext key="PubDate" text="Dáta Foilsithe"/>
+<l:gentext key="pubdate" text="Dáta foilsithe"/>
+<l:gentext key="Published" text="Foilsithe"/>
+<l:gentext key="published" text="Foilsithe"/>
+<l:gentext key="Publisher" text="Publisher" lang="en"/>
+<l:gentext key="Qandadiv" text="C &amp; F"/>
+<l:gentext key="qandadiv" text="C &amp; F"/>
+<l:gentext key="QandASet" text="Frequently Asked Questions" lang="en"/>
+<l:gentext key="Question" text="C:"/>
+<l:gentext key="question" text="C:"/>
+<l:gentext key="RefEntry" text=""/>
+<l:gentext key="refentry" text=""/>
+<l:gentext key="Reference" text="Tagairt"/>
+<l:gentext key="reference" text="Tagairt"/>
+<l:gentext key="References" text="References" lang="en"/>
+<l:gentext key="RefName" text="Ainm"/>
+<l:gentext key="refname" text="Ainm"/>
+<l:gentext key="RefSection" text=""/>
+<l:gentext key="refsection" text=""/>
+<l:gentext key="RefSynopsisDiv" text="Achoimre"/>
+<l:gentext key="refsynopsisdiv" text="Achoimre"/>
+<l:gentext key="RevHistory" text="Stair Leasaithe"/>
+<l:gentext key="revhistory" text="Stair Leasaithe"/>
+<l:gentext key="revision" text="Leasú"/>
+<l:gentext key="Revision" text="Leasú"/>
+<l:gentext key="sect1" text="Rannán"/>
+<l:gentext key="sect2" text="Rannán"/>
+<l:gentext key="sect3" text="Rannán"/>
+<l:gentext key="sect4" text="Rannán"/>
+<l:gentext key="sect5" text="Rannán"/>
+<l:gentext key="section" text="Rannán"/>
+<l:gentext key="Section" text="Rannán"/>
+<l:gentext key="see" text="féach"/>
+<l:gentext key="See" text="Féach"/>
+<l:gentext key="seealso" text="féach freisin"/>
+<l:gentext key="Seealso" text="Féach freisin"/>
+<l:gentext key="SeeAlso" text="Féach Freisin"/>
+<l:gentext key="set" text="Tacar"/>
+<l:gentext key="Set" text="Tacar"/>
+<l:gentext key="setindex" text="Innéacs"/>
+<l:gentext key="SetIndex" text="Innéacs"/>
+<l:gentext key="Sidebar" text=""/>
+<l:gentext key="sidebar" text="taobhbharra"/>
+<l:gentext key="step" text="céim"/>
+<l:gentext key="Step" text="Céim"/>
+<l:gentext key="table" text="Tábla"/>
+<l:gentext key="Table" text="Tábla"/>
+<l:gentext key="task" text="Task" lang="en"/>
+<l:gentext key="Task" text="Task" lang="en"/>
+<l:gentext key="tip" text="Leid"/>
+<l:gentext key="TIP" text="LEID"/>
+<l:gentext key="Tip" text="Leid"/>
+<l:gentext key="Warning" text="Rabhadh"/>
+<l:gentext key="warning" text="Rabhadh"/>
+<l:gentext key="WARNING" text="RABHADH"/>
+<l:gentext key="and" text="agus"/>
+<l:gentext key="by" text="le"/>
+<l:gentext key="Edited" text="Curtha in eagar"/>
+<l:gentext key="edited" text="Curtha in eagar"/>
+<l:gentext key="Editedby" text="Curtha in eagar ag"/>
+<l:gentext key="editedby" text="Curtha in eagar ag"/>
+<l:gentext key="in" text="i"/>
+<l:gentext key="lastlistcomma" text=","/>
+<l:gentext key="listcomma" text=","/>
+<l:gentext key="notes" text="Nótaí"/>
+<l:gentext key="Notes" text="Nótaí"/>
+<l:gentext key="Pgs" text="Lgh."/>
+<l:gentext key="pgs" text="Lgh."/>
+<l:gentext key="Revisedby" text="Leasaithe ag: "/>
+<l:gentext key="revisedby" text="Leasaithe ag: "/>
+<l:gentext key="TableNotes" text="Nótaí"/>
+<l:gentext key="tablenotes" text="Nótaí"/>
+<l:gentext key="TableofContents" text="Clár Ãbhair"/>
+<l:gentext key="tableofcontents" text="Clár Ãbhair"/>
+<l:gentext key="unexpectedelementname" text="Ainm eiliminte gan choinne"/>
+<l:gentext key="unsupported" text="gan tacaíocht"/>
+<l:gentext key="xrefto" text="xref go"/>
+<l:gentext key="Authors" text="Authors" lang="en"/>
+<l:gentext key="copyeditor" text="Copy Editor" lang="en"/>
+<l:gentext key="graphicdesigner" text="Graphic Designer" lang="en"/>
+<l:gentext key="productioneditor" text="Production Editor" lang="en"/>
+<l:gentext key="technicaleditor" text="Technical Editor" lang="en"/>
+<l:gentext key="translator" text="Translator" lang="en"/>
+<l:gentext key="listofequations" text="Liosta Cothromóidí"/>
+<l:gentext key="ListofEquations" text="Liosta Cothromóidí"/>
+<l:gentext key="ListofExamples" text="Liosta Samplaí"/>
+<l:gentext key="listofexamples" text="Liosta Samplaí"/>
+<l:gentext key="ListofFigures" text="Liosta Léaráidí"/>
+<l:gentext key="listoffigures" text="Liosta Léaráidí"/>
+<l:gentext key="ListofProcedures" text="Liosta Gnás"/>
+<l:gentext key="listofprocedures" text="Liosta Gnás"/>
+<l:gentext key="listoftables" text="Liosta Táblaí"/>
+<l:gentext key="ListofTables" text="Liosta Táblaí"/>
+<l:gentext key="ListofUnknown" text="Liosta Rudaí Anaithnide"/>
+<l:gentext key="listofunknown" text="Liosta Rudaí Anaithnide"/>
+<l:gentext key="nav-home" text="Baile"/>
+<l:gentext key="nav-next" text="Ar Aghaidh"/>
+<l:gentext key="nav-next-sibling" text="Ar Aghaidh Go Tapa"/>
+<l:gentext key="nav-prev" text="Ar Ais"/>
+<l:gentext key="nav-prev-sibling" text="Ar Ais Go Tapa"/>
+<l:gentext key="nav-up" text="Suas"/>
+<l:gentext key="nav-toc" text="CÃ"/>
+<l:gentext key="Draft" text="Dréacht"/>
+<l:gentext key="above" text="thuas"/>
+<l:gentext key="below" text="thíos"/>
+<l:gentext key="sectioncalled" text="an rannán dar teideal"/>
+<l:gentext key="index symbols" text="Siombailí"/>
+<l:gentext key="writing-mode" text="lr-tb"/>
+<l:gentext key="lowercase.alpha" text="abcdefghijklmnopqrstuvwxyzáéíóú"/>
+<l:gentext key="uppercase.alpha" text="ABCDEFGHIJKLMNOPQRSTUVWXYZÃÉÃÓÚ"/>
+<l:gentext key="normalize.sort.input" text="AaÀàÃáÂâÃãÄäÅåĀÄĂ㥹ÇǎǞǟǠǡǺǻȀÈȂȃȦȧḀá¸áºšáº áº¡áº¢áº£áº¤áº¥áº¦áº§áº¨áº©áºªáº«áº¬áº­áº®áº¯áº°áº±áº²áº³áº´áºµáº¶áº·BbÆ€ÆɓƂƃḂḃḄḅḆḇCcÇçĆćĈĉĊċČÄƇƈɕḈḉDdÄŽÄÄđƊɗƋƌDžDzȡɖḊḋḌá¸á¸Žá¸á¸á¸‘ḒḓEeÈèÉéÊêËëĒēĔĕĖėĘęĚěȄȅȆȇȨȩḔḕḖḗḘḙḚḛḜá¸áº¸áº¹áººáº»áº¼áº½áº¾áº¿á»€á»á»‚ểỄễỆệFfƑƒḞḟGgÄœÄĞğĠġĢģƓɠǤǥǦǧǴǵḠḡHhĤĥĦħȞȟɦḢḣḤḥḦḧḨḩḪḫẖIiÌìÃíÎîÃïĨĩĪīĬĭĮįİƗɨÇÇȈȉȊȋḬḭḮḯỈỉỊịJjĴĵǰÊKkĶķƘƙǨǩḰḱḲḳḴḵLlĹĺĻļĽľĿŀÅłƚLjȴɫɬɭḶḷḸḹḺḻḼḽMmɱḾḿṀá¹á¹‚ṃNnÑñŃńŅņŇňÆɲƞȠNjǸǹȵɳṄṅṆṇṈṉṊṋOoÒòÓóÔôÕõÖöØøŌÅÅŽÅÅőƟƠơǑǒǪǫǬǭǾǿȌÈÈŽÈȪȫȬȭȮȯȰȱṌá¹á¹Žá¹á¹á¹‘ṒṓỌá»á»Žá»á»á»‘ỒồỔổỖỗỘộỚớỜá»á»žá»Ÿá» á»¡á»¢á»£PpƤƥṔṕṖṗQqÊ RrŔŕŖŗŘřÈȑȒȓɼɽɾṘṙṚṛṜá¹á¹žá¹ŸSsŚśŜÅŞşŠšȘșʂṠṡṢṣṤṥṦṧṨṩTtŢţŤťŦŧƫƬƭƮʈȚțȶṪṫṬṭṮṯṰṱẗUuÙùÚúÛûÜüŨũŪūŬŭŮůŰűŲųƯưǓǔǕǖǗǘǙǚǛǜȔȕȖȗṲṳṴṵṶṷṸṹṺṻỤụỦủỨứỪừỬửỮữỰựVvƲʋṼṽṾṿWwŴŵẀáºáº‚ẃẄẅẆẇẈẉẘXxẊẋẌáºYyÃýÿŸŶŷƳƴȲȳẎáºáº™á»²á»³á»´á»µá»¶á»·á»¸á»¹ZzŹźŻżŽžƵƶȤȥÊÊ‘áºáº‘ẒẓẔẕẕ" lang="en"/>
+<l:gentext key="normalize.sort.output" text="AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBCCCCCCCCCCCCCCCCCDDDDDDDDDDDDDDDDDDDDDDDDEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEFFFFFFGGGGGGGGGGGGGGGGGGGGHHHHHHHHHHHHHHHHHHHHIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIJJJJJJKKKKKKKKKKKKKKLLLLLLLLLLLLLLLLLLLLLLLLLLMMMMMMMMMNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOPPPPPPPPQQQRRRRRRRRRRRRRRRRRRRRRRRSSSSSSSSSSSSSSSSSSSSSSSTTTTTTTTTTTTTTTTTTTTTTTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUVVVVVVVVWWWWWWWWWWWWWWWXXXXXXYYYYYYYYYYYYYYYYYYYYYYYZZZZZZZZZZZZZZZZZZZZZ" lang="en"/>
+<l:dingbat key="startquote" text="“"/>
+<l:dingbat key="endquote" text="â€"/>
+<l:dingbat key="nestedstartquote" text="‘"/>
+<l:dingbat key="nestedendquote" text="’"/>
+<l:dingbat key="singlestartquote" text="‘"/>
+<l:dingbat key="singleendquote" text="’"/>
+<l:dingbat key="bullet" text="•"/>
+<l:gentext key="hyphenation-character" text="-"/>
+<l:gentext key="hyphenation-push-character-count" text="2"/>
+<l:gentext key="hyphenation-remain-character-count" text="2"/>
+<l:context name="styles"><l:template name="person-name" text="first-last"/>
+</l:context>
+<l:context name="title"><l:template name="abstract" text="%t"/>
+<l:template name="acknowledgements" text="%t" lang="en"/>
+<l:template name="answer" text="%t"/>
+<l:template name="appendix" text="Aguisín %n. %t"/>
+<l:template name="article" text="%t"/>
+<l:template name="authorblurb" text="%t"/>
+<l:template name="bibliodiv" text="%t"/>
+<l:template name="biblioentry" text="%t"/>
+<l:template name="bibliography" text="%t"/>
+<l:template name="bibliolist" text="%t"/>
+<l:template name="bibliomixed" text="%t"/>
+<l:template name="bibliomset" text="%t"/>
+<l:template name="biblioset" text="%t"/>
+<l:template name="blockquote" text="%t"/>
+<l:template name="book" text="%t"/>
+<l:template name="calloutlist" text="%t"/>
+<l:template name="caution" text="%t"/>
+<l:template name="chapter" text="Caibidil %n. %t"/>
+<l:template name="colophon" text="%t"/>
+<l:template name="dedication" text="%t"/>
+<l:template name="equation" text="Cothromóid %n. %t"/>
+<l:template name="example" text="Sampla %n. %t"/>
+<l:template name="figure" text="Léaráid %n. %t"/>
+<l:template name="foil" text="%t"/>
+<l:template name="foilgroup" text="%t"/>
+<l:template name="formalpara" text="%t"/>
+<l:template name="glossary" text="%t"/>
+<l:template name="glossdiv" text="%t"/>
+<l:template name="glosslist" text="%t"/>
+<l:template name="glossentry" text="%t"/>
+<l:template name="important" text="%t"/>
+<l:template name="index" text="%t"/>
+<l:template name="indexdiv" text="%t"/>
+<l:template name="itemizedlist" text="%t"/>
+<l:template name="legalnotice" text="%t"/>
+<l:template name="listitem" text=""/>
+<l:template name="lot" text="%t"/>
+<l:template name="msg" text="%t"/>
+<l:template name="msgexplan" text="%t"/>
+<l:template name="msgmain" text="%t"/>
+<l:template name="msgrel" text="%t"/>
+<l:template name="msgset" text="%t"/>
+<l:template name="msgsub" text="%t"/>
+<l:template name="note" text="%t"/>
+<l:template name="orderedlist" text="%t"/>
+<l:template name="part" text="Cuid %n. %t"/>
+<l:template name="partintro" text="%t"/>
+<l:template name="preface" text="%t"/>
+<l:template name="procedure" text="%t"/>
+<l:template name="procedure.formal" text="Gnás %n. %t"/>
+<l:template name="productionset" text="%t"/>
+<l:template name="productionset.formal" text="Rialacha Táirgthe %n"/>
+<l:template name="qandadiv" text="%t"/>
+<l:template name="qandaentry" text="%t"/>
+<l:template name="qandaset" text="%t"/>
+<l:template name="question" text="%t"/>
+<l:template name="refentry" text="%t"/>
+<l:template name="reference" text="%t"/>
+<l:template name="refsection" text="%t"/>
+<l:template name="refsect1" text="%t"/>
+<l:template name="refsect2" text="%t"/>
+<l:template name="refsect3" text="%t"/>
+<l:template name="refsynopsisdiv" text="%t"/>
+<l:template name="refsynopsisdivinfo" text="%t"/>
+<l:template name="segmentedlist" text="%t"/>
+<l:template name="set" text="%t"/>
+<l:template name="setindex" text="%t"/>
+<l:template name="sidebar" text="%t"/>
+<l:template name="step" text="%t"/>
+<l:template name="table" text="Tábla %n. %t"/>
+<l:template name="task" text="%t"/>
+<l:template name="tasksummary" text="%t" lang="en"/>
+<l:template name="taskprerequisites" text="%t" lang="en"/>
+<l:template name="taskrelated" text="%t" lang="en"/>
+<l:template name="tip" text="%t"/>
+<l:template name="toc" text="%t"/>
+<l:template name="variablelist" text="%t"/>
+<l:template name="varlistentry" text=""/>
+<l:template name="warning" text="%t"/>
+</l:context>
+<l:context name="title-unnumbered"><l:template name="appendix" text="%t"/>
+<l:template name="article/appendix" text="%t"/>
+<l:template name="bridgehead" text="%t"/>
+<l:template name="chapter" text="%t"/>
+<l:template name="sect1" text="%t"/>
+<l:template name="sect2" text="%t"/>
+<l:template name="sect3" text="%t"/>
+<l:template name="sect4" text="%t"/>
+<l:template name="sect5" text="%t"/>
+<l:template name="section" text="%t"/>
+<l:template name="simplesect" text="%t"/>
+<l:template name="part" text="%t" lang="en"/>
+</l:context>
+<l:context name="title-numbered"><l:template name="appendix" text="Aguisín %n. %t"/>
+<l:template name="article/appendix" text="%n. %t"/>
+<l:template name="bridgehead" text="%n. %t"/>
+<l:template name="chapter" text="Caibidil %n. %t"/>
+<l:template name="part" text="Cuid %n. %t"/>
+<l:template name="sect1" text="%n. %t"/>
+<l:template name="sect2" text="%n. %t"/>
+<l:template name="sect3" text="%n. %t"/>
+<l:template name="sect4" text="%n. %t"/>
+<l:template name="sect5" text="%n. %t"/>
+<l:template name="section" text="%n. %t"/>
+<l:template name="simplesect" text="%t"/>
+</l:context>
+<l:context name="subtitle"><l:template name="appendix" text="%s"/>
+<l:template name="acknowledgements" text="%s" lang="en"/>
+<l:template name="article" text="%s"/>
+<l:template name="bibliodiv" text="%s"/>
+<l:template name="biblioentry" text="%s"/>
+<l:template name="bibliography" text="%s"/>
+<l:template name="bibliomixed" text="%s"/>
+<l:template name="bibliomset" text="%s"/>
+<l:template name="biblioset" text="%s"/>
+<l:template name="book" text="%s"/>
+<l:template name="chapter" text="%s"/>
+<l:template name="colophon" text="%s"/>
+<l:template name="dedication" text="%s"/>
+<l:template name="glossary" text="%s"/>
+<l:template name="glossdiv" text="%s"/>
+<l:template name="index" text="%s"/>
+<l:template name="indexdiv" text="%s"/>
+<l:template name="lot" text="%s"/>
+<l:template name="part" text="%s"/>
+<l:template name="partintro" text="%s"/>
+<l:template name="preface" text="%s"/>
+<l:template name="refentry" text="%s"/>
+<l:template name="reference" text="%s"/>
+<l:template name="refsection" text="%s"/>
+<l:template name="refsect1" text="%s"/>
+<l:template name="refsect2" text="%s"/>
+<l:template name="refsect3" text="%s"/>
+<l:template name="refsynopsisdiv" text="%s"/>
+<l:template name="sect1" text="%s"/>
+<l:template name="sect2" text="%s"/>
+<l:template name="sect3" text="%s"/>
+<l:template name="sect4" text="%s"/>
+<l:template name="sect5" text="%s"/>
+<l:template name="section" text="%s"/>
+<l:template name="set" text="%s"/>
+<l:template name="setindex" text="%s"/>
+<l:template name="sidebar" text="%s"/>
+<l:template name="simplesect" text="%s"/>
+<l:template name="toc" text="%s"/>
+</l:context>
+<l:context name="xref"><l:template name="abstract" text="%t"/>
+<l:template name="acknowledgements" text="%t" lang="en"/>
+<l:template name="answer" text="F: %n"/>
+<l:template name="appendix" text="%t"/>
+<l:template name="article" text="%t"/>
+<l:template name="authorblurb" text="%t"/>
+<l:template name="bibliodiv" text="%t"/>
+<l:template name="bibliography" text="%t"/>
+<l:template name="bibliomset" text="%t"/>
+<l:template name="biblioset" text="%t"/>
+<l:template name="blockquote" text="%t"/>
+<l:template name="book" text="%t"/>
+<l:template name="calloutlist" text="%t"/>
+<l:template name="caution" text="%t"/>
+<l:template name="chapter" text="%t"/>
+<l:template name="colophon" text="%t"/>
+<l:template name="constraintdef" text="%t"/>
+<l:template name="dedication" text="%t"/>
+<l:template name="equation" text="%t"/>
+<l:template name="example" text="%t"/>
+<l:template name="figure" text="%t"/>
+<l:template name="foil" text="%t"/>
+<l:template name="foilgroup" text="%t"/>
+<l:template name="formalpara" text="%t"/>
+<l:template name="glossary" text="%t"/>
+<l:template name="glossdiv" text="%t"/>
+<l:template name="important" text="%t"/>
+<l:template name="index" text="%t"/>
+<l:template name="indexdiv" text="%t"/>
+<l:template name="itemizedlist" text="%t"/>
+<l:template name="legalnotice" text="%t"/>
+<l:template name="listitem" text="%n"/>
+<l:template name="lot" text="%t"/>
+<l:template name="msg" text="%t"/>
+<l:template name="msgexplan" text="%t"/>
+<l:template name="msgmain" text="%t"/>
+<l:template name="msgrel" text="%t"/>
+<l:template name="msgset" text="%t"/>
+<l:template name="msgsub" text="%t"/>
+<l:template name="note" text="%t"/>
+<l:template name="orderedlist" text="%t"/>
+<l:template name="part" text="%t"/>
+<l:template name="partintro" text="%t"/>
+<l:template name="preface" text="%t"/>
+<l:template name="procedure" text="%t"/>
+<l:template name="productionset" text="%t"/>
+<l:template name="qandadiv" text="%t"/>
+<l:template name="qandaentry" text="C: %n"/>
+<l:template name="qandaset" text="%t"/>
+<l:template name="question" text="C: %n"/>
+<l:template name="reference" text="%t"/>
+<l:template name="refsynopsisdiv" text="%t"/>
+<l:template name="segmentedlist" text="%t"/>
+<l:template name="set" text="%t"/>
+<l:template name="setindex" text="%t"/>
+<l:template name="sidebar" text="%t"/>
+<l:template name="table" text="%t"/>
+<l:template name="task" text="%t" lang="en"/>
+<l:template name="tip" text="%t"/>
+<l:template name="toc" text="%t"/>
+<l:template name="variablelist" text="%t"/>
+<l:template name="varlistentry" text="%n"/>
+<l:template name="warning" text="%t"/>
+<l:template name="olink.document.citation" text=" i %o"/>
+<l:template name="olink.page.citation" text=" (leathanach %p)"/>
+<l:template name="page.citation" text=" [%p]"/>
+<l:template name="page" text="(leathanach %p)"/>
+<l:template name="docname" text=" i %o"/>
+<l:template name="docnamelong" text=" in the document titled %o"/>
+<l:template name="pageabbrev" text="(lch. %p)"/>
+<l:template name="Page" text="Leathanach %p"/>
+<l:template name="bridgehead" text="an rannán dar teideal “%tâ€"/>
+<l:template name="refsection" text="an rannán dar teideal “%tâ€"/>
+<l:template name="refsect1" text="an rannán dar teideal “%tâ€"/>
+<l:template name="refsect2" text="an rannán dar teideal “%tâ€"/>
+<l:template name="refsect3" text="an rannán dar teideal “%tâ€"/>
+<l:template name="sect1" text="an rannán dar teideal “%tâ€"/>
+<l:template name="sect2" text="an rannán dar teideal “%tâ€"/>
+<l:template name="sect3" text="an rannán dar teideal “%tâ€"/>
+<l:template name="sect4" text="an rannán dar teideal “%tâ€"/>
+<l:template name="sect5" text="an rannán dar teideal “%tâ€"/>
+<l:template name="section" text="an rannán dar teideal “%tâ€"/>
+<l:template name="simplesect" text="an rannán dar teideal “%tâ€"/>
+</l:context>
+<l:context name="xref-number"><l:template name="answer" text="F: %n"/>
+<l:template name="appendix" text="Aguisín %n"/>
+<l:template name="bridgehead" text="Rannán %n"/>
+<l:template name="chapter" text="Caibidil %n"/>
+<l:template name="equation" text="Cothromóid %n"/>
+<l:template name="example" text="Sampla %n"/>
+<l:template name="figure" text="Léaráid %n"/>
+<l:template name="part" text="Cuid %n"/>
+<l:template name="procedure" text="Gnás %n"/>
+<l:template name="productionset" text="Rialacha Táirgthe %n"/>
+<l:template name="qandadiv" text="C &amp; F %n"/>
+<l:template name="qandaentry" text="C: %n"/>
+<l:template name="question" text="C: %n"/>
+<l:template name="sect1" text="Rannán %n"/>
+<l:template name="sect2" text="Rannán %n"/>
+<l:template name="sect3" text="Rannán %n"/>
+<l:template name="sect4" text="Rannán %n"/>
+<l:template name="sect5" text="Rannán %n"/>
+<l:template name="section" text="Rannán %n"/>
+<l:template name="table" text="Tábla %n"/>
+</l:context>
+<l:context name="xref-number-and-title"><l:template name="appendix" text="Aguisín %n, %t"/>
+<l:template name="bridgehead" text="Rannán %n, “%tâ€"/>
+<l:template name="chapter" text="Caibidil %n, %t"/>
+<l:template name="equation" text="Cothromóid %n, “%tâ€"/>
+<l:template name="example" text="Sampla %n, “%tâ€"/>
+<l:template name="figure" text="Léaráid %n, “%tâ€"/>
+<l:template name="part" text="Cuid %n, “%tâ€"/>
+<l:template name="procedure" text="Gnás %n, “%tâ€"/>
+<l:template name="productionset" text="Rialacha Táirgthe %n, “%tâ€"/>
+<l:template name="qandadiv" text="C &amp; F %n, “%tâ€"/>
+<l:template name="refsect1" text="an rannán dar teideal “%tâ€"/>
+<l:template name="refsect2" text="an rannán dar teideal “%tâ€"/>
+<l:template name="refsect3" text="an rannán dar teideal “%tâ€"/>
+<l:template name="refsection" text="an rannán dar teideal “%tâ€"/>
+<l:template name="sect1" text="Rannán %n, “%tâ€"/>
+<l:template name="sect2" text="Rannán %n, “%tâ€"/>
+<l:template name="sect3" text="Rannán %n, “%tâ€"/>
+<l:template name="sect4" text="Rannán %n, “%tâ€"/>
+<l:template name="sect5" text="Rannán %n, “%tâ€"/>
+<l:template name="section" text="Rannán %n, “%tâ€"/>
+<l:template name="simplesect" text="an rannán dar teideal “%tâ€"/>
+<l:template name="table" text="Tábla %n, “%tâ€"/>
+</l:context>
+<l:context name="authorgroup"><l:template name="sep" text=", "/>
+<l:template name="sep2" text=" agus "/>
+<l:template name="seplast" text=", agus "/>
+</l:context>
+<l:context name="glossary"><l:template name="see" text="Féach %t."/>
+<l:template name="seealso" text="Féach Freisin %t."/>
+<l:template name="seealso-separator" text=", "/>
+</l:context>
+<l:context name="msgset"><l:template name="MsgAud" text="Sprioclucht: "/>
+<l:template name="MsgLevel" text="Leibhéal: "/>
+<l:template name="MsgOrig" text="Foinse: "/>
+</l:context>
+<l:context name="datetime"><l:template name="format" text="m/d/Y"/>
+</l:context>
+<l:context name="termdef"><l:template name="prefix" text="[Sainmhíniú: "/>
+<l:template name="suffix" text="]"/>
+</l:context>
+<l:context name="datetime-full"><l:template name="January" text="Eanáir"/>
+<l:template name="February" text="Feabhra"/>
+<l:template name="March" text="Márta"/>
+<l:template name="April" text="Aibreán"/>
+<l:template name="May" text="Bealtaine"/>
+<l:template name="June" text="Meitheamh"/>
+<l:template name="July" text="Iúil"/>
+<l:template name="August" text="Lúnasa"/>
+<l:template name="September" text="Meán Fómhair"/>
+<l:template name="October" text="Deireadh Fómhair"/>
+<l:template name="November" text="Samhain"/>
+<l:template name="December" text="Nollaig"/>
+<l:template name="Monday" text="Dé Luain"/>
+<l:template name="Tuesday" text="Dé Máirt"/>
+<l:template name="Wednesday" text="Dé Céadaoin"/>
+<l:template name="Thursday" text="Déardaoin"/>
+<l:template name="Friday" text="Dé hAoine"/>
+<l:template name="Saturday" text="Dé Sathairn"/>
+<l:template name="Sunday" text="Dé Domhnaigh"/>
+</l:context>
+<l:context name="datetime-abbrev"><l:template name="Jan" text="Ean"/>
+<l:template name="Feb" text="Feabh"/>
+<l:template name="Mar" text="Márta"/>
+<l:template name="Apr" text="Aib"/>
+<l:template name="May" text="Beal"/>
+<l:template name="Jun" text="Meith"/>
+<l:template name="Jul" text="Iúil"/>
+<l:template name="Aug" text="Lún"/>
+<l:template name="Sep" text="MFómh"/>
+<l:template name="Oct" text="DFómh"/>
+<l:template name="Nov" text="Samh"/>
+<l:template name="Dec" text="Noll"/>
+<l:template name="Mon" text="Luan"/>
+<l:template name="Tue" text="Máirt"/>
+<l:template name="Wed" text="Céad"/>
+<l:template name="Thu" text="Déar"/>
+<l:template name="Fri" text="Aoine"/>
+<l:template name="Sat" text="Sath"/>
+<l:template name="Sun" text="Domh"/>
+</l:context>
+<l:context name="htmlhelp"><l:template name="langcode" text="0x083C Gaelic (IRELAND)"/>
+</l:context>
+<l:context name="index"><l:template name="term-separator" text=", " lang="en"/>
+<l:template name="number-separator" text=", " lang="en"/>
+<l:template name="range-separator" text="-" lang="en"/>
+</l:context>
+<l:context name="iso690"><l:template name="lastfirst.sep" text=", " lang="en"/>
+<l:template name="alt.person.two.sep" text=" – " lang="en"/>
+<l:template name="alt.person.last.sep" text=" – " lang="en"/>
+<l:template name="alt.person.more.sep" text=" – " lang="en"/>
+<l:template name="primary.editor" text=" (ed.)" lang="en"/>
+<l:template name="primary.many" text=", et al." lang="en"/>
+<l:template name="primary.sep" text=". " lang="en"/>
+<l:template name="submaintitle.sep" text=": " lang="en"/>
+<l:template name="title.sep" text=". " lang="en"/>
+<l:template name="othertitle.sep" text=", " lang="en"/>
+<l:template name="medium1" text=" [" lang="en"/>
+<l:template name="medium2" text="]" lang="en"/>
+<l:template name="secondary.person.sep" text="; " lang="en"/>
+<l:template name="secondary.sep" text=". " lang="en"/>
+<l:template name="respons.sep" text=". " lang="en"/>
+<l:template name="edition.sep" text=". " lang="en"/>
+<l:template name="edition.serial.sep" text=", " lang="en"/>
+<l:template name="issuing.range" text="-" lang="en"/>
+<l:template name="issuing.div" text=", " lang="en"/>
+<l:template name="issuing.sep" text=". " lang="en"/>
+<l:template name="partnr.sep" text=". " lang="en"/>
+<l:template name="placepubl.sep" text=": " lang="en"/>
+<l:template name="publyear.sep" text=", " lang="en"/>
+<l:template name="pubinfo.sep" text=". " lang="en"/>
+<l:template name="spec.pubinfo.sep" text=", " lang="en"/>
+<l:template name="upd.sep" text=", " lang="en"/>
+<l:template name="datecit1" text=" [cited " lang="en"/>
+<l:template name="datecit2" text="]" lang="en"/>
+<l:template name="extent.sep" text=". " lang="en"/>
+<l:template name="locs.sep" text=", " lang="en"/>
+<l:template name="location.sep" text=". " lang="en"/>
+<l:template name="serie.sep" text=". " lang="en"/>
+<l:template name="notice.sep" text=". " lang="en"/>
+<l:template name="access" text="Available " lang="en"/>
+<l:template name="acctoo" text="Also available " lang="en"/>
+<l:template name="onwww" text="from World Wide Web" lang="en"/>
+<l:template name="oninet" text="from Internet" lang="en"/>
+<l:template name="access.end" text=": " lang="en"/>
+<l:template name="link1" text="&lt;" lang="en"/>
+<l:template name="link2" text="&gt;" lang="en"/>
+<l:template name="access.sep" text=". " lang="en"/>
+<l:template name="isbn" text="ISBN " lang="en"/>
+<l:template name="issn" text="ISSN " lang="en"/>
+<l:template name="stdnum.sep" text=". " lang="en"/>
+<l:template name="patcountry.sep" text=". " lang="en"/>
+<l:template name="pattype.sep" text=", " lang="en"/>
+<l:template name="patnum.sep" text=". " lang="en"/>
+<l:template name="patdate.sep" text=". " lang="en"/>
+</l:context><l:letters><l:l i="-1"/>
+<l:l i="0">Siombailí</l:l>
+<l:l i="10">A</l:l>
+<l:l i="10">a</l:l>
+<l:l i="10">À</l:l>
+<l:l i="10">à</l:l>
+<l:l i="10">Ã</l:l>
+<l:l i="10">á</l:l>
+<l:l i="10">Â</l:l>
+<l:l i="10">â</l:l>
+<l:l i="10">Ã</l:l>
+<l:l i="10">ã</l:l>
+<l:l i="10">Ä</l:l>
+<l:l i="10">ä</l:l>
+<l:l i="10">Ã…</l:l>
+<l:l i="10">Ã¥</l:l>
+<l:l i="10">Ä€</l:l>
+<l:l i="10">Ä</l:l>
+<l:l i="10">Ä‚</l:l>
+<l:l i="10">ă</l:l>
+<l:l i="10">Ä„</l:l>
+<l:l i="10">Ä…</l:l>
+<l:l i="10">Ç</l:l>
+<l:l i="10">ÇŽ</l:l>
+<l:l i="10">Çž</l:l>
+<l:l i="10">ÇŸ</l:l>
+<l:l i="10">Ç </l:l>
+<l:l i="10">Ç¡</l:l>
+<l:l i="10">Ǻ</l:l>
+<l:l i="10">Ç»</l:l>
+<l:l i="10">È€</l:l>
+<l:l i="10">È</l:l>
+<l:l i="10">È‚</l:l>
+<l:l i="10">ȃ</l:l>
+<l:l i="10">Ȧ</l:l>
+<l:l i="10">ȧ</l:l>
+<l:l i="10">Ḁ</l:l>
+<l:l i="10">á¸</l:l>
+<l:l i="10">ẚ</l:l>
+<l:l i="10">Ạ</l:l>
+<l:l i="10">ạ</l:l>
+<l:l i="10">Ả</l:l>
+<l:l i="10">ả</l:l>
+<l:l i="10">Ấ</l:l>
+<l:l i="10">ấ</l:l>
+<l:l i="10">Ầ</l:l>
+<l:l i="10">ầ</l:l>
+<l:l i="10">Ẩ</l:l>
+<l:l i="10">ẩ</l:l>
+<l:l i="10">Ẫ</l:l>
+<l:l i="10">ẫ</l:l>
+<l:l i="10">Ậ</l:l>
+<l:l i="10">ậ</l:l>
+<l:l i="10">Ắ</l:l>
+<l:l i="10">ắ</l:l>
+<l:l i="10">Ằ</l:l>
+<l:l i="10">ằ</l:l>
+<l:l i="10">Ẳ</l:l>
+<l:l i="10">ẳ</l:l>
+<l:l i="10">Ẵ</l:l>
+<l:l i="10">ẵ</l:l>
+<l:l i="10">Ặ</l:l>
+<l:l i="10">ặ</l:l>
+<l:l i="20">B</l:l>
+<l:l i="20">b</l:l>
+<l:l i="20">Æ€</l:l>
+<l:l i="20">Æ</l:l>
+<l:l i="20">É“</l:l>
+<l:l i="20">Æ‚</l:l>
+<l:l i="20">ƃ</l:l>
+<l:l i="20">Ḃ</l:l>
+<l:l i="20">ḃ</l:l>
+<l:l i="20">Ḅ</l:l>
+<l:l i="20">ḅ</l:l>
+<l:l i="20">Ḇ</l:l>
+<l:l i="20">ḇ</l:l>
+<l:l i="30">C</l:l>
+<l:l i="30">c</l:l>
+<l:l i="30">Ç</l:l>
+<l:l i="30">ç</l:l>
+<l:l i="30">Ć</l:l>
+<l:l i="30">ć</l:l>
+<l:l i="30">Ĉ</l:l>
+<l:l i="30">ĉ</l:l>
+<l:l i="30">ÄŠ</l:l>
+<l:l i="30">Ä‹</l:l>
+<l:l i="30">Č</l:l>
+<l:l i="30">Ä</l:l>
+<l:l i="30">Ƈ</l:l>
+<l:l i="30">ƈ</l:l>
+<l:l i="30">É•</l:l>
+<l:l i="30">Ḉ</l:l>
+<l:l i="30">ḉ</l:l>
+<l:l i="40">D</l:l>
+<l:l i="40">d</l:l>
+<l:l i="40">ÄŽ</l:l>
+<l:l i="40">Ä</l:l>
+<l:l i="40">Ä</l:l>
+<l:l i="40">Ä‘</l:l>
+<l:l i="40">ÆŠ</l:l>
+<l:l i="40">É—</l:l>
+<l:l i="40">Æ‹</l:l>
+<l:l i="40">ƌ</l:l>
+<l:l i="40">Ç…</l:l>
+<l:l i="40">Dz</l:l>
+<l:l i="40">È¡</l:l>
+<l:l i="40">É–</l:l>
+<l:l i="40">Ḋ</l:l>
+<l:l i="40">ḋ</l:l>
+<l:l i="40">Ḍ</l:l>
+<l:l i="40">á¸</l:l>
+<l:l i="40">Ḏ</l:l>
+<l:l i="40">á¸</l:l>
+<l:l i="40">á¸</l:l>
+<l:l i="40">ḑ</l:l>
+<l:l i="40">Ḓ</l:l>
+<l:l i="40">ḓ</l:l>
+<l:l i="50">E</l:l>
+<l:l i="50">e</l:l>
+<l:l i="50">È</l:l>
+<l:l i="50">è</l:l>
+<l:l i="50">É</l:l>
+<l:l i="50">é</l:l>
+<l:l i="50">Ê</l:l>
+<l:l i="50">ê</l:l>
+<l:l i="50">Ë</l:l>
+<l:l i="50">ë</l:l>
+<l:l i="50">Ä’</l:l>
+<l:l i="50">Ä“</l:l>
+<l:l i="50">Ä”</l:l>
+<l:l i="50">Ä•</l:l>
+<l:l i="50">Ä–</l:l>
+<l:l i="50">Ä—</l:l>
+<l:l i="50">Ę</l:l>
+<l:l i="50">Ä™</l:l>
+<l:l i="50">Äš</l:l>
+<l:l i="50">Ä›</l:l>
+<l:l i="50">È„</l:l>
+<l:l i="50">È…</l:l>
+<l:l i="50">Ȇ</l:l>
+<l:l i="50">ȇ</l:l>
+<l:l i="50">Ȩ</l:l>
+<l:l i="50">È©</l:l>
+<l:l i="50">Ḕ</l:l>
+<l:l i="50">ḕ</l:l>
+<l:l i="50">Ḗ</l:l>
+<l:l i="50">ḗ</l:l>
+<l:l i="50">Ḙ</l:l>
+<l:l i="50">ḙ</l:l>
+<l:l i="50">Ḛ</l:l>
+<l:l i="50">ḛ</l:l>
+<l:l i="50">Ḝ</l:l>
+<l:l i="50">á¸</l:l>
+<l:l i="50">Ẹ</l:l>
+<l:l i="50">ẹ</l:l>
+<l:l i="50">Ẻ</l:l>
+<l:l i="50">ẻ</l:l>
+<l:l i="50">Ẽ</l:l>
+<l:l i="50">ẽ</l:l>
+<l:l i="50">Ế</l:l>
+<l:l i="50">ế</l:l>
+<l:l i="50">Ề</l:l>
+<l:l i="50">á»</l:l>
+<l:l i="50">Ể</l:l>
+<l:l i="50">ể</l:l>
+<l:l i="50">Ễ</l:l>
+<l:l i="50">á»…</l:l>
+<l:l i="50">Ệ</l:l>
+<l:l i="50">ệ</l:l>
+<l:l i="60">F</l:l>
+<l:l i="60">f</l:l>
+<l:l i="60">Æ‘</l:l>
+<l:l i="60">Æ’</l:l>
+<l:l i="60">Ḟ</l:l>
+<l:l i="60">ḟ</l:l>
+<l:l i="70">G</l:l>
+<l:l i="70">g</l:l>
+<l:l i="70">Ĝ</l:l>
+<l:l i="70">Ä</l:l>
+<l:l i="70">Äž</l:l>
+<l:l i="70">ÄŸ</l:l>
+<l:l i="70">Ä </l:l>
+<l:l i="70">Ä¡</l:l>
+<l:l i="70">Ä¢</l:l>
+<l:l i="70">Ä£</l:l>
+<l:l i="70">Æ“</l:l>
+<l:l i="70">É </l:l>
+<l:l i="70">Ǥ</l:l>
+<l:l i="70">Ç¥</l:l>
+<l:l i="70">Ǧ</l:l>
+<l:l i="70">ǧ</l:l>
+<l:l i="70">Ç´</l:l>
+<l:l i="70">ǵ</l:l>
+<l:l i="70">Ḡ</l:l>
+<l:l i="70">ḡ</l:l>
+<l:l i="80">H</l:l>
+<l:l i="80">h</l:l>
+<l:l i="80">Ĥ</l:l>
+<l:l i="80">Ä¥</l:l>
+<l:l i="80">Ħ</l:l>
+<l:l i="80">ħ</l:l>
+<l:l i="80">Èž</l:l>
+<l:l i="80">ÈŸ</l:l>
+<l:l i="80">ɦ</l:l>
+<l:l i="80">Ḣ</l:l>
+<l:l i="80">ḣ</l:l>
+<l:l i="80">Ḥ</l:l>
+<l:l i="80">ḥ</l:l>
+<l:l i="80">Ḧ</l:l>
+<l:l i="80">ḧ</l:l>
+<l:l i="80">Ḩ</l:l>
+<l:l i="80">ḩ</l:l>
+<l:l i="80">Ḫ</l:l>
+<l:l i="80">ḫ</l:l>
+<l:l i="80">ẖ</l:l>
+<l:l i="90">I</l:l>
+<l:l i="90">i</l:l>
+<l:l i="90">Ì</l:l>
+<l:l i="90">ì</l:l>
+<l:l i="90">Ã</l:l>
+<l:l i="90">í</l:l>
+<l:l i="90">ÃŽ</l:l>
+<l:l i="90">î</l:l>
+<l:l i="90">Ã</l:l>
+<l:l i="90">ï</l:l>
+<l:l i="90">Ĩ</l:l>
+<l:l i="90">Ä©</l:l>
+<l:l i="90">Ī</l:l>
+<l:l i="90">Ä«</l:l>
+<l:l i="90">Ĭ</l:l>
+<l:l i="90">Ä­</l:l>
+<l:l i="90">Ä®</l:l>
+<l:l i="90">į</l:l>
+<l:l i="90">Ä°</l:l>
+<l:l i="90">Æ—</l:l>
+<l:l i="90">ɨ</l:l>
+<l:l i="90">Ç</l:l>
+<l:l i="90">Ç</l:l>
+<l:l i="90">Ȉ</l:l>
+<l:l i="90">ȉ</l:l>
+<l:l i="90">ÈŠ</l:l>
+<l:l i="90">È‹</l:l>
+<l:l i="90">Ḭ</l:l>
+<l:l i="90">ḭ</l:l>
+<l:l i="90">Ḯ</l:l>
+<l:l i="90">ḯ</l:l>
+<l:l i="90">Ỉ</l:l>
+<l:l i="90">ỉ</l:l>
+<l:l i="90">Ị</l:l>
+<l:l i="90">ị</l:l>
+<l:l i="100">J</l:l>
+<l:l i="100">j</l:l>
+<l:l i="100">Ä´</l:l>
+<l:l i="100">ĵ</l:l>
+<l:l i="100">Ç°</l:l>
+<l:l i="100">Ê</l:l>
+<l:l i="110">K</l:l>
+<l:l i="110">k</l:l>
+<l:l i="110">Ķ</l:l>
+<l:l i="110">Ä·</l:l>
+<l:l i="110">Ƙ</l:l>
+<l:l i="110">Æ™</l:l>
+<l:l i="110">Ǩ</l:l>
+<l:l i="110">Ç©</l:l>
+<l:l i="110">Ḱ</l:l>
+<l:l i="110">ḱ</l:l>
+<l:l i="110">Ḳ</l:l>
+<l:l i="110">ḳ</l:l>
+<l:l i="110">Ḵ</l:l>
+<l:l i="110">ḵ</l:l>
+<l:l i="120">L</l:l>
+<l:l i="120">l</l:l>
+<l:l i="120">Ĺ</l:l>
+<l:l i="120">ĺ</l:l>
+<l:l i="120">Ä»</l:l>
+<l:l i="120">ļ</l:l>
+<l:l i="120">Ľ</l:l>
+<l:l i="120">ľ</l:l>
+<l:l i="120">Ä¿</l:l>
+<l:l i="120">Å€</l:l>
+<l:l i="120">Å</l:l>
+<l:l i="120">Å‚</l:l>
+<l:l i="120">Æš</l:l>
+<l:l i="120">Lj</l:l>
+<l:l i="120">È´</l:l>
+<l:l i="120">É«</l:l>
+<l:l i="120">ɬ</l:l>
+<l:l i="120">É­</l:l>
+<l:l i="120">Ḷ</l:l>
+<l:l i="120">ḷ</l:l>
+<l:l i="120">Ḹ</l:l>
+<l:l i="120">ḹ</l:l>
+<l:l i="120">Ḻ</l:l>
+<l:l i="120">ḻ</l:l>
+<l:l i="120">Ḽ</l:l>
+<l:l i="120">ḽ</l:l>
+<l:l i="130">M</l:l>
+<l:l i="130">m</l:l>
+<l:l i="130">ɱ</l:l>
+<l:l i="130">Ḿ</l:l>
+<l:l i="130">ḿ</l:l>
+<l:l i="130">á¹€</l:l>
+<l:l i="130">á¹</l:l>
+<l:l i="130">Ṃ</l:l>
+<l:l i="130">ṃ</l:l>
+<l:l i="140">N</l:l>
+<l:l i="140">n</l:l>
+<l:l i="140">Ñ</l:l>
+<l:l i="140">ñ</l:l>
+<l:l i="140">Ń</l:l>
+<l:l i="140">Å„</l:l>
+<l:l i="140">Å…</l:l>
+<l:l i="140">ņ</l:l>
+<l:l i="140">Ň</l:l>
+<l:l i="140">ň</l:l>
+<l:l i="140">Æ</l:l>
+<l:l i="140">ɲ</l:l>
+<l:l i="140">Æž</l:l>
+<l:l i="140">È </l:l>
+<l:l i="140">Ç‹</l:l>
+<l:l i="140">Ǹ</l:l>
+<l:l i="140">ǹ</l:l>
+<l:l i="140">ȵ</l:l>
+<l:l i="140">ɳ</l:l>
+<l:l i="140">Ṅ</l:l>
+<l:l i="140">á¹…</l:l>
+<l:l i="140">Ṇ</l:l>
+<l:l i="140">ṇ</l:l>
+<l:l i="140">Ṉ</l:l>
+<l:l i="140">ṉ</l:l>
+<l:l i="140">Ṋ</l:l>
+<l:l i="140">ṋ</l:l>
+<l:l i="150">O</l:l>
+<l:l i="150">o</l:l>
+<l:l i="150">Ã’</l:l>
+<l:l i="150">ò</l:l>
+<l:l i="150">Ó</l:l>
+<l:l i="150">ó</l:l>
+<l:l i="150">Ô</l:l>
+<l:l i="150">ô</l:l>
+<l:l i="150">Õ</l:l>
+<l:l i="150">õ</l:l>
+<l:l i="150">Ö</l:l>
+<l:l i="150">ö</l:l>
+<l:l i="150">Ø</l:l>
+<l:l i="150">ø</l:l>
+<l:l i="150">Ō</l:l>
+<l:l i="150">Å</l:l>
+<l:l i="150">ÅŽ</l:l>
+<l:l i="150">Å</l:l>
+<l:l i="150">Å</l:l>
+<l:l i="150">Å‘</l:l>
+<l:l i="150">ÆŸ</l:l>
+<l:l i="150">Æ </l:l>
+<l:l i="150">Æ¡</l:l>
+<l:l i="150">Ç‘</l:l>
+<l:l i="150">Ç’</l:l>
+<l:l i="150">Ǫ</l:l>
+<l:l i="150">Ç«</l:l>
+<l:l i="150">Ǭ</l:l>
+<l:l i="150">Ç­</l:l>
+<l:l i="150">Ǿ</l:l>
+<l:l i="150">Ç¿</l:l>
+<l:l i="150">Ȍ</l:l>
+<l:l i="150">È</l:l>
+<l:l i="150">ÈŽ</l:l>
+<l:l i="150">È</l:l>
+<l:l i="150">Ȫ</l:l>
+<l:l i="150">È«</l:l>
+<l:l i="150">Ȭ</l:l>
+<l:l i="150">È­</l:l>
+<l:l i="150">È®</l:l>
+<l:l i="150">ȯ</l:l>
+<l:l i="150">È°</l:l>
+<l:l i="150">ȱ</l:l>
+<l:l i="150">Ṍ</l:l>
+<l:l i="150">á¹</l:l>
+<l:l i="150">Ṏ</l:l>
+<l:l i="150">á¹</l:l>
+<l:l i="150">á¹</l:l>
+<l:l i="150">ṑ</l:l>
+<l:l i="150">á¹’</l:l>
+<l:l i="150">ṓ</l:l>
+<l:l i="150">Ọ</l:l>
+<l:l i="150">á»</l:l>
+<l:l i="150">Ỏ</l:l>
+<l:l i="150">á»</l:l>
+<l:l i="150">á»</l:l>
+<l:l i="150">ố</l:l>
+<l:l i="150">á»’</l:l>
+<l:l i="150">ồ</l:l>
+<l:l i="150">á»”</l:l>
+<l:l i="150">ổ</l:l>
+<l:l i="150">á»–</l:l>
+<l:l i="150">á»—</l:l>
+<l:l i="150">Ộ</l:l>
+<l:l i="150">á»™</l:l>
+<l:l i="150">Ớ</l:l>
+<l:l i="150">á»›</l:l>
+<l:l i="150">Ờ</l:l>
+<l:l i="150">á»</l:l>
+<l:l i="150">Ở</l:l>
+<l:l i="150">ở</l:l>
+<l:l i="150">á» </l:l>
+<l:l i="150">ỡ</l:l>
+<l:l i="150">Ợ</l:l>
+<l:l i="150">ợ</l:l>
+<l:l i="160">P</l:l>
+<l:l i="160">p</l:l>
+<l:l i="160">Ƥ</l:l>
+<l:l i="160">Æ¥</l:l>
+<l:l i="160">á¹”</l:l>
+<l:l i="160">ṕ</l:l>
+<l:l i="160">á¹–</l:l>
+<l:l i="160">á¹—</l:l>
+<l:l i="170">Q</l:l>
+<l:l i="170">q</l:l>
+<l:l i="170">Ê </l:l>
+<l:l i="180">R</l:l>
+<l:l i="180">r</l:l>
+<l:l i="180">Å”</l:l>
+<l:l i="180">Å•</l:l>
+<l:l i="180">Å–</l:l>
+<l:l i="180">Å—</l:l>
+<l:l i="180">Ř</l:l>
+<l:l i="180">Å™</l:l>
+<l:l i="180">È</l:l>
+<l:l i="180">È‘</l:l>
+<l:l i="180">È’</l:l>
+<l:l i="180">È“</l:l>
+<l:l i="180">ɼ</l:l>
+<l:l i="180">ɽ</l:l>
+<l:l i="180">ɾ</l:l>
+<l:l i="180">Ṙ</l:l>
+<l:l i="180">á¹™</l:l>
+<l:l i="180">Ṛ</l:l>
+<l:l i="180">á¹›</l:l>
+<l:l i="180">Ṝ</l:l>
+<l:l i="180">á¹</l:l>
+<l:l i="180">Ṟ</l:l>
+<l:l i="180">ṟ</l:l>
+<l:l i="190">S</l:l>
+<l:l i="190">s</l:l>
+<l:l i="190">Åš</l:l>
+<l:l i="190">Å›</l:l>
+<l:l i="190">Ŝ</l:l>
+<l:l i="190">Å</l:l>
+<l:l i="190">Åž</l:l>
+<l:l i="190">ÅŸ</l:l>
+<l:l i="190">Å </l:l>
+<l:l i="190">Å¡</l:l>
+<l:l i="190">Ș</l:l>
+<l:l i="190">È™</l:l>
+<l:l i="190">Ê‚</l:l>
+<l:l i="190">á¹ </l:l>
+<l:l i="190">ṡ</l:l>
+<l:l i="190">á¹¢</l:l>
+<l:l i="190">á¹£</l:l>
+<l:l i="190">Ṥ</l:l>
+<l:l i="190">á¹¥</l:l>
+<l:l i="190">Ṧ</l:l>
+<l:l i="190">ṧ</l:l>
+<l:l i="190">Ṩ</l:l>
+<l:l i="190">ṩ</l:l>
+<l:l i="200">T</l:l>
+<l:l i="200">t</l:l>
+<l:l i="200">Å¢</l:l>
+<l:l i="200">Å£</l:l>
+<l:l i="200">Ť</l:l>
+<l:l i="200">Å¥</l:l>
+<l:l i="200">Ŧ</l:l>
+<l:l i="200">ŧ</l:l>
+<l:l i="200">Æ«</l:l>
+<l:l i="200">Ƭ</l:l>
+<l:l i="200">Æ­</l:l>
+<l:l i="200">Æ®</l:l>
+<l:l i="200">ʈ</l:l>
+<l:l i="200">Èš</l:l>
+<l:l i="200">È›</l:l>
+<l:l i="200">ȶ</l:l>
+<l:l i="200">Ṫ</l:l>
+<l:l i="200">ṫ</l:l>
+<l:l i="200">Ṭ</l:l>
+<l:l i="200">á¹­</l:l>
+<l:l i="200">á¹®</l:l>
+<l:l i="200">ṯ</l:l>
+<l:l i="200">á¹°</l:l>
+<l:l i="200">á¹±</l:l>
+<l:l i="200">ẗ</l:l>
+<l:l i="210">U</l:l>
+<l:l i="210">u</l:l>
+<l:l i="210">Ù</l:l>
+<l:l i="210">ù</l:l>
+<l:l i="210">Ú</l:l>
+<l:l i="210">ú</l:l>
+<l:l i="210">Û</l:l>
+<l:l i="210">û</l:l>
+<l:l i="210">Ü</l:l>
+<l:l i="210">ü</l:l>
+<l:l i="210">Ũ</l:l>
+<l:l i="210">Å©</l:l>
+<l:l i="210">Ū</l:l>
+<l:l i="210">Å«</l:l>
+<l:l i="210">Ŭ</l:l>
+<l:l i="210">Å­</l:l>
+<l:l i="210">Å®</l:l>
+<l:l i="210">ů</l:l>
+<l:l i="210">Å°</l:l>
+<l:l i="210">ű</l:l>
+<l:l i="210">Ų</l:l>
+<l:l i="210">ų</l:l>
+<l:l i="210">Ư</l:l>
+<l:l i="210">Æ°</l:l>
+<l:l i="210">Ç“</l:l>
+<l:l i="210">Ç”</l:l>
+<l:l i="210">Ç•</l:l>
+<l:l i="210">Ç–</l:l>
+<l:l i="210">Ç—</l:l>
+<l:l i="210">ǘ</l:l>
+<l:l i="210">Ç™</l:l>
+<l:l i="210">Çš</l:l>
+<l:l i="210">Ç›</l:l>
+<l:l i="210">ǜ</l:l>
+<l:l i="210">È”</l:l>
+<l:l i="210">È•</l:l>
+<l:l i="210">È–</l:l>
+<l:l i="210">È—</l:l>
+<l:l i="210">á¹²</l:l>
+<l:l i="210">á¹³</l:l>
+<l:l i="210">á¹´</l:l>
+<l:l i="210">á¹µ</l:l>
+<l:l i="210">Ṷ</l:l>
+<l:l i="210">á¹·</l:l>
+<l:l i="210">Ṹ</l:l>
+<l:l i="210">á¹¹</l:l>
+<l:l i="210">Ṻ</l:l>
+<l:l i="210">á¹»</l:l>
+<l:l i="210">Ụ</l:l>
+<l:l i="210">ụ</l:l>
+<l:l i="210">Ủ</l:l>
+<l:l i="210">ủ</l:l>
+<l:l i="210">Ứ</l:l>
+<l:l i="210">ứ</l:l>
+<l:l i="210">Ừ</l:l>
+<l:l i="210">ừ</l:l>
+<l:l i="210">Ử</l:l>
+<l:l i="210">á»­</l:l>
+<l:l i="210">á»®</l:l>
+<l:l i="210">ữ</l:l>
+<l:l i="210">á»°</l:l>
+<l:l i="210">á»±</l:l>
+<l:l i="220">V</l:l>
+<l:l i="220">v</l:l>
+<l:l i="220">Ʋ</l:l>
+<l:l i="220">Ê‹</l:l>
+<l:l i="220">á¹¼</l:l>
+<l:l i="220">á¹½</l:l>
+<l:l i="220">á¹¾</l:l>
+<l:l i="220">ṿ</l:l>
+<l:l i="230">W</l:l>
+<l:l i="230">w</l:l>
+<l:l i="230">Å´</l:l>
+<l:l i="230">ŵ</l:l>
+<l:l i="230">Ẁ</l:l>
+<l:l i="230">áº</l:l>
+<l:l i="230">Ẃ</l:l>
+<l:l i="230">ẃ</l:l>
+<l:l i="230">Ẅ</l:l>
+<l:l i="230">ẅ</l:l>
+<l:l i="230">Ẇ</l:l>
+<l:l i="230">ẇ</l:l>
+<l:l i="230">Ẉ</l:l>
+<l:l i="230">ẉ</l:l>
+<l:l i="230">ẘ</l:l>
+<l:l i="240">X</l:l>
+<l:l i="240">x</l:l>
+<l:l i="240">Ẋ</l:l>
+<l:l i="240">ẋ</l:l>
+<l:l i="240">Ẍ</l:l>
+<l:l i="240">áº</l:l>
+<l:l i="250">Y</l:l>
+<l:l i="250">y</l:l>
+<l:l i="250">Ã</l:l>
+<l:l i="250">ý</l:l>
+<l:l i="250">ÿ</l:l>
+<l:l i="250">Ÿ</l:l>
+<l:l i="250">Ŷ</l:l>
+<l:l i="250">Å·</l:l>
+<l:l i="250">Ƴ</l:l>
+<l:l i="250">Æ´</l:l>
+<l:l i="250">Ȳ</l:l>
+<l:l i="250">ȳ</l:l>
+<l:l i="250">Ẏ</l:l>
+<l:l i="250">áº</l:l>
+<l:l i="250">ẙ</l:l>
+<l:l i="250">Ỳ</l:l>
+<l:l i="250">ỳ</l:l>
+<l:l i="250">á»´</l:l>
+<l:l i="250">ỵ</l:l>
+<l:l i="250">Ỷ</l:l>
+<l:l i="250">á»·</l:l>
+<l:l i="250">Ỹ</l:l>
+<l:l i="250">ỹ</l:l>
+<l:l i="260">Z</l:l>
+<l:l i="260">z</l:l>
+<l:l i="260">Ź</l:l>
+<l:l i="260">ź</l:l>
+<l:l i="260">Å»</l:l>
+<l:l i="260">ż</l:l>
+<l:l i="260">Ž</l:l>
+<l:l i="260">ž</l:l>
+<l:l i="260">Ƶ</l:l>
+<l:l i="260">ƶ</l:l>
+<l:l i="260">Ȥ</l:l>
+<l:l i="260">È¥</l:l>
+<l:l i="260">Ê</l:l>
+<l:l i="260">Ê‘</l:l>
+<l:l i="260">áº</l:l>
+<l:l i="260">ẑ</l:l>
+<l:l i="260">Ẓ</l:l>
+<l:l i="260">ẓ</l:l>
+<l:l i="260">Ẕ</l:l>
+<l:l i="260">ẕ</l:l>
+</l:letters>
+</l:l10n>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/gentext.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/gentext.xsl
new file mode 100644
index 0000000..2417e77
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/gentext.xsl
@@ -0,0 +1,839 @@
+<?xml version='1.0'?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:doc="http://nwalsh.com/xsl/documentation/1.0"
+ exclude-result-prefixes="doc"
+ version='1.0'>
+
+<!-- ********************************************************************
+ $Id: gentext.xsl 8769 2010-07-26 17:38:32Z mzjn $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<!-- ==================================================================== -->
+
+
+<xsl:template match="*" mode="object.title.template">
+ <xsl:call-template name="gentext.template">
+ <xsl:with-param name="context" select="'title'"/>
+ <xsl:with-param name="name">
+ <xsl:call-template name="xpath.location"/>
+ </xsl:with-param>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="chapter" mode="object.title.template">
+ <xsl:choose>
+ <xsl:when test="string($chapter.autolabel) != 0">
+ <xsl:call-template name="gentext.template">
+ <xsl:with-param name="context" select="'title-numbered'"/>
+ <xsl:with-param name="name">
+ <xsl:call-template name="xpath.location"/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="gentext.template">
+ <xsl:with-param name="context" select="'title-unnumbered'"/>
+ <xsl:with-param name="name">
+ <xsl:call-template name="xpath.location"/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="appendix" mode="object.title.template">
+ <xsl:choose>
+ <xsl:when test="string($appendix.autolabel) != 0">
+ <xsl:call-template name="gentext.template">
+ <xsl:with-param name="context" select="'title-numbered'"/>
+ <xsl:with-param name="name">
+ <xsl:call-template name="xpath.location"/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="gentext.template">
+ <xsl:with-param name="context" select="'title-unnumbered'"/>
+ <xsl:with-param name="name">
+ <xsl:call-template name="xpath.location"/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="part" mode="object.title.template">
+ <xsl:choose>
+ <xsl:when test="string($part.autolabel) != 0">
+ <xsl:call-template name="gentext.template">
+ <xsl:with-param name="context" select="'title-numbered'"/>
+ <xsl:with-param name="name">
+ <xsl:call-template name="xpath.location"/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="gentext.template">
+ <xsl:with-param name="context" select="'title-unnumbered'"/>
+ <xsl:with-param name="name">
+ <xsl:call-template name="xpath.location"/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="section|sect1|sect2|sect3|sect4|sect5|simplesect
+ |bridgehead"
+ mode="object.title.template">
+ <xsl:variable name="is.numbered">
+ <xsl:call-template name="label.this.section"/>
+ </xsl:variable>
+ <xsl:choose>
+ <xsl:when test="$is.numbered != 0">
+ <xsl:call-template name="gentext.template">
+ <xsl:with-param name="context" select="'title-numbered'"/>
+ <xsl:with-param name="name">
+ <xsl:call-template name="xpath.location"/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="gentext.template">
+ <xsl:with-param name="context" select="'title-unnumbered'"/>
+ <xsl:with-param name="name">
+ <xsl:call-template name="xpath.location"/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="procedure" mode="object.title.template">
+ <xsl:choose>
+ <xsl:when test="$formal.procedures != 0 and title">
+ <xsl:call-template name="gentext.template">
+ <xsl:with-param name="context" select="'title'"/>
+ <xsl:with-param name="name">
+ <xsl:call-template name="xpath.location"/>
+ <xsl:text>.formal</xsl:text>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="gentext.template">
+ <xsl:with-param name="context" select="'title'"/>
+ <xsl:with-param name="name">
+ <xsl:call-template name="xpath.location"/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ============================================================ -->
+
+<xsl:template match="*" mode="object.subtitle.template">
+ <xsl:call-template name="gentext.template">
+ <xsl:with-param name="context" select="'subtitle'"/>
+ <xsl:with-param name="name">
+ <xsl:call-template name="xpath.location"/>
+ </xsl:with-param>
+ </xsl:call-template>
+</xsl:template>
+
+<!-- ============================================================ -->
+
+<xsl:template match="*" mode="is.autonumber">
+ <xsl:value-of select="'0'"/>
+</xsl:template>
+
+<xsl:template match="section|sect1|sect2|sect3|sect4|sect5"
+ mode="is.autonumber">
+ <xsl:call-template name="label.this.section"/>
+</xsl:template>
+
+<xsl:template match="figure|example|table|equation" mode="is.autonumber">
+ <xsl:value-of select="'1'"/>
+</xsl:template>
+
+<xsl:template match="appendix" mode="is.autonumber">
+ <xsl:value-of select="$appendix.autolabel"/>
+</xsl:template>
+
+<xsl:template match="chapter" mode="is.autonumber">
+ <xsl:value-of select="$chapter.autolabel"/>
+</xsl:template>
+
+<xsl:template match="part" mode="is.autonumber">
+ <xsl:value-of select="$part.autolabel"/>
+</xsl:template>
+
+<xsl:template match="preface" mode="is.autonumber">
+ <xsl:value-of select="$preface.autolabel"/>
+</xsl:template>
+
+<xsl:template match="question|answer" mode="is.autonumber">
+ <xsl:choose>
+ <xsl:when test="$qanda.defaultlabel = 'number'
+ and not(label)">
+ <xsl:value-of select="'1'"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="'0'"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="qandadiv" mode="is.autonumber">
+ <xsl:value-of select="$qandadiv.autolabel"/>
+</xsl:template>
+
+<xsl:template match="bridgehead" mode="is.autonumber">
+ <xsl:value-of select="$section.autolabel"/>
+</xsl:template>
+
+<xsl:template match="procedure" mode="is.autonumber">
+ <xsl:value-of select="$formal.procedures"/>
+</xsl:template>
+
+
+<xsl:template match="*" mode="object.xref.template">
+ <xsl:param name="purpose"/>
+ <xsl:param name="xrefstyle"/>
+ <xsl:param name="referrer"/>
+
+ <!-- Is autonumbering on? -->
+ <xsl:variable name="autonumber">
+ <xsl:apply-templates select="." mode="is.autonumber"/>
+ </xsl:variable>
+
+ <xsl:variable name="number-and-title-template">
+ <xsl:call-template name="gentext.template.exists">
+ <xsl:with-param name="context" select="'xref-number-and-title'"/>
+ <xsl:with-param name="name">
+ <xsl:call-template name="xpath.location"/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="number-template">
+ <xsl:call-template name="gentext.template.exists">
+ <xsl:with-param name="context" select="'xref-number'"/>
+ <xsl:with-param name="name">
+ <xsl:call-template name="xpath.location"/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="context">
+ <xsl:choose>
+ <xsl:when test="self::equation and not(title) and not(info/title)">
+ <xsl:value-of select="'xref-number'"/>
+ </xsl:when>
+ <xsl:when test="string($autonumber) != 0
+ and $number-and-title-template != 0
+ and $xref.with.number.and.title != 0">
+ <xsl:value-of select="'xref-number-and-title'"/>
+ </xsl:when>
+ <xsl:when test="string($autonumber) != 0
+ and $number-template != 0">
+ <xsl:value-of select="'xref-number'"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="'xref'"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:call-template name="gentext.template">
+ <xsl:with-param name="context" select="$context"/>
+ <xsl:with-param name="name">
+ <xsl:call-template name="xpath.location"/>
+ </xsl:with-param>
+ <xsl:with-param name="purpose" select="$purpose"/>
+ <xsl:with-param name="xrefstyle" select="$xrefstyle"/>
+ <xsl:with-param name="referrer" select="$referrer"/>
+ </xsl:call-template>
+
+</xsl:template>
+
+
+<!-- ============================================================ -->
+
+<xsl:template match="*" mode="object.title.markup">
+ <xsl:param name="allow-anchors" select="0"/>
+ <xsl:variable name="template">
+ <xsl:apply-templates select="." mode="object.title.template"/>
+ </xsl:variable>
+
+<!--
+ <xsl:message>
+ <xsl:text>object.title.markup: </xsl:text>
+ <xsl:value-of select="local-name(.)"/>
+ <xsl:text>: </xsl:text>
+ <xsl:value-of select="$template"/>
+ </xsl:message>
+-->
+
+ <xsl:call-template name="substitute-markup">
+ <xsl:with-param name="allow-anchors" select="$allow-anchors"/>
+ <xsl:with-param name="template" select="$template"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="*" mode="object.title.markup.textonly">
+ <xsl:variable name="title">
+ <xsl:apply-templates select="." mode="object.title.markup"/>
+ </xsl:variable>
+ <xsl:value-of select="normalize-space($title)"/>
+</xsl:template>
+
+<!-- ============================================================ -->
+
+<xsl:template match="*" mode="object.titleabbrev.markup">
+ <xsl:param name="allow-anchors" select="0"/>
+
+ <!-- Just for consistency in template naming -->
+
+ <xsl:apply-templates select="." mode="titleabbrev.markup">
+ <xsl:with-param name="allow-anchors" select="$allow-anchors"/>
+ </xsl:apply-templates>
+</xsl:template>
+
+<!-- ============================================================ -->
+
+<xsl:template match="*" mode="object.subtitle.markup">
+ <xsl:variable name="template">
+ <xsl:apply-templates select="." mode="object.subtitle.template"/>
+ </xsl:variable>
+
+ <xsl:call-template name="substitute-markup">
+ <xsl:with-param name="template" select="$template"/>
+ </xsl:call-template>
+</xsl:template>
+
+<!-- ============================================================ -->
+
+<xsl:template match="*" mode="object.xref.markup">
+ <xsl:param name="purpose"/>
+ <xsl:param name="xrefstyle"/>
+ <xsl:param name="referrer"/>
+ <xsl:param name="verbose" select="1"/>
+
+ <xsl:variable name="template">
+ <xsl:choose>
+ <xsl:when test="starts-with(normalize-space($xrefstyle), 'select:')">
+ <xsl:call-template name="make.gentext.template">
+ <xsl:with-param name="xrefstyle" select="$xrefstyle"/>
+ <xsl:with-param name="purpose" select="$purpose"/>
+ <xsl:with-param name="referrer" select="$referrer"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="starts-with(normalize-space($xrefstyle), 'template:')">
+ <xsl:value-of select="substring-after(normalize-space($xrefstyle), 'template:')"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="." mode="object.xref.template">
+ <xsl:with-param name="purpose" select="$purpose"/>
+ <xsl:with-param name="xrefstyle" select="$xrefstyle"/>
+ <xsl:with-param name="referrer" select="$referrer"/>
+ </xsl:apply-templates>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+<!--
+ <xsl:message>
+ <xsl:text>object.xref.markup: </xsl:text>
+ <xsl:value-of select="local-name(.)"/>
+ <xsl:text>(</xsl:text>
+ <xsl:value-of select="$xrefstyle"/>
+ <xsl:text>, </xsl:text>
+ <xsl:value-of select="$purpose"/>
+ <xsl:text>)</xsl:text>
+ <xsl:text>: [</xsl:text>
+ <xsl:value-of select="$template"/>
+ <xsl:text>]</xsl:text>
+ </xsl:message>
+-->
+
+ <xsl:if test="$template = '' and $verbose != 0">
+ <xsl:message>
+ <xsl:text>object.xref.markup: empty xref template</xsl:text>
+ <xsl:text> for linkend="</xsl:text>
+ <xsl:value-of select="@id|@xml:id"/>
+ <xsl:text>" and @xrefstyle="</xsl:text>
+ <xsl:value-of select="$xrefstyle"/>
+ <xsl:text>"</xsl:text>
+ </xsl:message>
+ </xsl:if>
+
+ <xsl:call-template name="substitute-markup">
+ <xsl:with-param name="purpose" select="$purpose"/>
+ <xsl:with-param name="xrefstyle" select="$xrefstyle"/>
+ <xsl:with-param name="referrer" select="$referrer"/>
+ <xsl:with-param name="template" select="$template"/>
+ <xsl:with-param name="verbose" select="$verbose"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="listitem" mode="object.xref.markup">
+ <xsl:param name="verbose" select="1"/>
+
+ <xsl:choose>
+ <xsl:when test="parent::orderedlist">
+ <xsl:variable name="template">
+ <xsl:apply-templates select="." mode="object.xref.template"/>
+ </xsl:variable>
+ <xsl:call-template name="substitute-markup">
+ <xsl:with-param name="template" select="$template"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="$verbose != 0">
+ <xsl:message>
+ <xsl:text>Xref is only supported to listitems in an</xsl:text>
+ <xsl:text> orderedlist: </xsl:text>
+ <xsl:value-of select=".//@id|.//@xml:id"/>
+ </xsl:message>
+ <xsl:text>???</xsl:text>
+ </xsl:when>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="question" mode="object.xref.markup">
+ <xsl:param name="purpose"/>
+ <xsl:param name="xrefstyle"/>
+ <xsl:param name="referrer"/>
+
+ <xsl:variable name="deflabel">
+ <xsl:choose>
+ <xsl:when test="ancestor-or-self::*[@defaultlabel]">
+ <xsl:value-of select="(ancestor-or-self::*[@defaultlabel])[last()]
+ /@defaultlabel"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$qanda.defaultlabel"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="template">
+ <xsl:choose>
+ <!-- This avoids double Q: Q: in xref when defaultlabel=qanda -->
+ <xsl:when test="$deflabel = 'qanda' and not(label)">%n</xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="." mode="object.xref.template">
+ <xsl:with-param name="purpose" select="$purpose"/>
+ <xsl:with-param name="xrefstyle" select="$xrefstyle"/>
+ <xsl:with-param name="referrer" select="$referrer"/>
+ </xsl:apply-templates>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:call-template name="substitute-markup">
+ <xsl:with-param name="purpose" select="$purpose"/>
+ <xsl:with-param name="xrefstyle" select="$xrefstyle"/>
+ <xsl:with-param name="referrer" select="$referrer"/>
+ <xsl:with-param name="template" select="$template"/>
+ </xsl:call-template>
+</xsl:template>
+
+<!-- ============================================================ -->
+
+<xsl:template name="substitute-markup">
+ <xsl:param name="template" select="''"/>
+ <xsl:param name="allow-anchors" select="'0'"/>
+ <xsl:param name="title" select="''"/>
+ <xsl:param name="subtitle" select="''"/>
+ <xsl:param name="docname" select="''"/>
+ <xsl:param name="label" select="''"/>
+ <xsl:param name="pagenumber" select="''"/>
+ <xsl:param name="purpose"/>
+ <xsl:param name="xrefstyle"/>
+ <xsl:param name="referrer"/>
+ <xsl:param name="verbose"/>
+
+ <xsl:choose>
+ <xsl:when test="contains($template, '%')">
+ <xsl:value-of select="substring-before($template, '%')"/>
+ <xsl:variable name="candidate"
+ select="substring(substring-after($template, '%'), 1, 1)"/>
+ <xsl:choose>
+ <xsl:when test="$candidate = 't'">
+ <xsl:apply-templates select="." mode="insert.title.markup">
+ <xsl:with-param name="purpose" select="$purpose"/>
+ <xsl:with-param name="xrefstyle" select="$xrefstyle"/>
+ <xsl:with-param name="title">
+ <xsl:choose>
+ <xsl:when test="$title != ''">
+ <xsl:copy-of select="$title"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="." mode="title.markup">
+ <xsl:with-param name="allow-anchors" select="$allow-anchors"/>
+ <xsl:with-param name="verbose" select="$verbose"/>
+ </xsl:apply-templates>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:with-param>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:when test="$candidate = 's'">
+ <xsl:apply-templates select="." mode="insert.subtitle.markup">
+ <xsl:with-param name="purpose" select="$purpose"/>
+ <xsl:with-param name="xrefstyle" select="$xrefstyle"/>
+ <xsl:with-param name="subtitle">
+ <xsl:choose>
+ <xsl:when test="$subtitle != ''">
+ <xsl:copy-of select="$subtitle"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="." mode="subtitle.markup">
+ <xsl:with-param name="allow-anchors" select="$allow-anchors"/>
+ </xsl:apply-templates>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:with-param>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:when test="$candidate = 'n'">
+ <xsl:apply-templates select="." mode="insert.label.markup">
+ <xsl:with-param name="purpose" select="$purpose"/>
+ <xsl:with-param name="xrefstyle" select="$xrefstyle"/>
+ <xsl:with-param name="label">
+ <xsl:choose>
+ <xsl:when test="$label != ''">
+ <xsl:copy-of select="$label"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="." mode="label.markup"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:with-param>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:when test="$candidate = 'p'">
+ <xsl:apply-templates select="." mode="insert.pagenumber.markup">
+ <xsl:with-param name="purpose" select="$purpose"/>
+ <xsl:with-param name="xrefstyle" select="$xrefstyle"/>
+ <xsl:with-param name="pagenumber">
+ <xsl:choose>
+ <xsl:when test="$pagenumber != ''">
+ <xsl:copy-of select="$pagenumber"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="." mode="pagenumber.markup"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:with-param>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:when test="$candidate = 'o'">
+ <!-- olink target document title -->
+ <xsl:apply-templates select="." mode="insert.olink.docname.markup">
+ <xsl:with-param name="purpose" select="$purpose"/>
+ <xsl:with-param name="xrefstyle" select="$xrefstyle"/>
+ <xsl:with-param name="docname">
+ <xsl:choose>
+ <xsl:when test="$docname != ''">
+ <xsl:copy-of select="$docname"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="." mode="olink.docname.markup"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:with-param>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:when test="$candidate = 'd'">
+ <xsl:apply-templates select="." mode="insert.direction.markup">
+ <xsl:with-param name="purpose" select="$purpose"/>
+ <xsl:with-param name="xrefstyle" select="$xrefstyle"/>
+ <xsl:with-param name="direction">
+ <xsl:choose>
+ <xsl:when test="$referrer">
+ <xsl:variable name="referent-is-below">
+ <xsl:for-each select="preceding::xref">
+ <xsl:if test="generate-id(.) = generate-id($referrer)">1</xsl:if>
+ </xsl:for-each>
+ </xsl:variable>
+ <xsl:choose>
+ <xsl:when test="$referent-is-below = ''">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'above'"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'below'"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:message>Attempt to use %d in gentext with no referrer!</xsl:message>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:with-param>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:when test="$candidate = '%' ">
+ <xsl:text>%</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text>%</xsl:text><xsl:value-of select="$candidate"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ <!-- recurse with the rest of the template string -->
+ <xsl:variable name="rest"
+ select="substring($template,
+ string-length(substring-before($template, '%'))+3)"/>
+ <xsl:call-template name="substitute-markup">
+ <xsl:with-param name="template" select="$rest"/>
+ <xsl:with-param name="allow-anchors" select="$allow-anchors"/>
+ <xsl:with-param name="title" select="$title"/>
+ <xsl:with-param name="subtitle" select="$subtitle"/>
+ <xsl:with-param name="docname" select="$docname"/>
+ <xsl:with-param name="label" select="$label"/>
+ <xsl:with-param name="pagenumber" select="$pagenumber"/>
+ <xsl:with-param name="purpose" select="$purpose"/>
+ <xsl:with-param name="xrefstyle" select="$xrefstyle"/>
+ <xsl:with-param name="referrer" select="$referrer"/>
+ <xsl:with-param name="verbose" select="$verbose"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$template"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ============================================================ -->
+
+<xsl:template name="make.gentext.template">
+ <xsl:param name="xrefstyle" select="''"/>
+ <xsl:param name="purpose"/>
+ <xsl:param name="referrer"/>
+ <xsl:param name="lang">
+ <xsl:call-template name="l10n.language"/>
+ </xsl:param>
+ <xsl:param name="target.elem" select="local-name(.)"/>
+
+ <!-- parse xrefstyle to get parts -->
+ <xsl:variable name="parts"
+ select="substring-after(normalize-space($xrefstyle), 'select:')"/>
+
+ <xsl:variable name="labeltype">
+ <xsl:choose>
+ <xsl:when test="contains($parts, 'labelnumber')">
+ <xsl:text>labelnumber</xsl:text>
+ </xsl:when>
+ <xsl:when test="contains($parts, 'labelname')">
+ <xsl:text>labelname</xsl:text>
+ </xsl:when>
+ <xsl:when test="contains($parts, 'label')">
+ <xsl:text>label</xsl:text>
+ </xsl:when>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="titletype">
+ <xsl:choose>
+ <xsl:when test="contains($parts, 'quotedtitle')">
+ <xsl:text>quotedtitle</xsl:text>
+ </xsl:when>
+ <xsl:when test="contains($parts, 'title')">
+ <xsl:text>title</xsl:text>
+ </xsl:when>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="pagetype">
+ <xsl:choose>
+ <xsl:when test="$insert.olink.page.number = 'no' and
+ local-name($referrer) = 'olink'">
+ <!-- suppress page numbers -->
+ </xsl:when>
+ <xsl:when test="$insert.xref.page.number = 'no' and
+ local-name($referrer) != 'olink'">
+ <!-- suppress page numbers -->
+ </xsl:when>
+ <xsl:when test="contains($parts, 'nopage')">
+ <xsl:text>nopage</xsl:text>
+ </xsl:when>
+ <xsl:when test="contains($parts, 'pagenumber')">
+ <xsl:text>pagenumber</xsl:text>
+ </xsl:when>
+ <xsl:when test="contains($parts, 'pageabbrev')">
+ <xsl:text>pageabbrev</xsl:text>
+ </xsl:when>
+ <xsl:when test="contains($parts, 'Page')">
+ <xsl:text>Page</xsl:text>
+ </xsl:when>
+ <xsl:when test="contains($parts, 'page')">
+ <xsl:text>page</xsl:text>
+ </xsl:when>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="docnametype">
+ <xsl:choose>
+ <xsl:when test="($olink.doctitle = 0 or
+ $olink.doctitle = 'no') and
+ local-name($referrer) = 'olink'">
+ <!-- suppress docname -->
+ </xsl:when>
+ <xsl:when test="contains($parts, 'nodocname')">
+ <xsl:text>nodocname</xsl:text>
+ </xsl:when>
+ <xsl:when test="contains($parts, 'docnamelong')">
+ <xsl:text>docnamelong</xsl:text>
+ </xsl:when>
+ <xsl:when test="contains($parts, 'docname')">
+ <xsl:text>docname</xsl:text>
+ </xsl:when>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:if test="$labeltype != ''">
+ <xsl:choose>
+ <xsl:when test="$labeltype = 'labelname'">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key">
+ <xsl:choose>
+ <xsl:when test="local-name($referrer) = 'olink'">
+ <xsl:value-of select="$target.elem"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="local-name(.)"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="$labeltype = 'labelnumber'">
+ <xsl:text>%n</xsl:text>
+ </xsl:when>
+ <xsl:when test="$labeltype = 'label'">
+ <xsl:call-template name="gentext.template">
+ <xsl:with-param name="context" select="'xref-number'"/>
+ <xsl:with-param name="name">
+ <xsl:choose>
+ <xsl:when test="local-name($referrer) = 'olink'">
+ <xsl:value-of select="$target.elem"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="xpath.location"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:with-param>
+ <xsl:with-param name="purpose" select="$purpose"/>
+ <xsl:with-param name="xrefstyle" select="$xrefstyle"/>
+ <xsl:with-param name="referrer" select="$referrer"/>
+ </xsl:call-template>
+ </xsl:when>
+ </xsl:choose>
+
+ <xsl:choose>
+ <xsl:when test="$titletype != ''">
+ <xsl:value-of select="$xref.label-title.separator"/>
+ </xsl:when>
+ <xsl:when test="$pagetype != '' and $pagetype != 'nopage'">
+ <xsl:value-of select="$xref.label-page.separator"/>
+ </xsl:when>
+ </xsl:choose>
+ </xsl:if>
+
+ <xsl:if test="$titletype != ''">
+ <xsl:choose>
+ <xsl:when test="$titletype = 'title'">
+ <xsl:text>%t</xsl:text>
+ </xsl:when>
+ <xsl:when test="$titletype = 'quotedtitle'">
+ <xsl:call-template name="gentext.dingbat">
+ <xsl:with-param name="dingbat" select="'startquote'"/>
+ </xsl:call-template>
+ <xsl:text>%t</xsl:text>
+ <xsl:call-template name="gentext.dingbat">
+ <xsl:with-param name="dingbat" select="'endquote'"/>
+ </xsl:call-template>
+ </xsl:when>
+ </xsl:choose>
+
+ <xsl:choose>
+ <xsl:when test="$pagetype != '' and $pagetype != 'nopage'">
+ <xsl:value-of select="$xref.title-page.separator"/>
+ </xsl:when>
+ </xsl:choose>
+ </xsl:if>
+
+ <!-- special case: use regular xref template if just turning off page -->
+ <xsl:if test="($pagetype = 'nopage' or $docnametype = 'nodocname')
+ and local-name($referrer) != 'olink'
+ and $labeltype = ''
+ and $titletype = ''">
+ <xsl:apply-templates select="." mode="object.xref.template">
+ <xsl:with-param name="purpose" select="$purpose"/>
+ <xsl:with-param name="xrefstyle" select="$xrefstyle"/>
+ <xsl:with-param name="referrer" select="$referrer"/>
+ </xsl:apply-templates>
+ </xsl:if>
+
+ <xsl:if test="$pagetype != ''">
+ <xsl:choose>
+ <xsl:when test="$pagetype = 'page'">
+ <xsl:call-template name="gentext.template">
+ <xsl:with-param name="context" select="'xref'"/>
+ <xsl:with-param name="name" select="'page'"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="$pagetype = 'Page'">
+ <xsl:call-template name="gentext.template">
+ <xsl:with-param name="context" select="'xref'"/>
+ <xsl:with-param name="name" select="'Page'"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="$pagetype = 'pageabbrev'">
+ <xsl:call-template name="gentext.template">
+ <xsl:with-param name="context" select="'xref'"/>
+ <xsl:with-param name="name" select="'pageabbrev'"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="$pagetype = 'pagenumber'">
+ <xsl:text>%p</xsl:text>
+ </xsl:when>
+ </xsl:choose>
+
+ </xsl:if>
+
+ <!-- Add reference to other document title -->
+ <xsl:if test="$docnametype != '' and local-name($referrer) = 'olink'">
+ <!-- Any separator should be in the gentext template -->
+ <xsl:choose>
+ <xsl:when test="$docnametype = 'docnamelong'">
+ <xsl:call-template name="gentext.template">
+ <xsl:with-param name="context" select="'xref'"/>
+ <xsl:with-param name="name" select="'docnamelong'"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="$docnametype = 'docname'">
+ <xsl:call-template name="gentext.template">
+ <xsl:with-param name="context" select="'xref'"/>
+ <xsl:with-param name="name" select="'docname'"/>
+ </xsl:call-template>
+ </xsl:when>
+ </xsl:choose>
+
+ </xsl:if>
+
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/gl.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/gl.xml
new file mode 100644
index 0000000..7346088
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/gl.xml
@@ -0,0 +1,1229 @@
+<?xml version="1.0" encoding="utf-8"?>
+<l:l10n xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0" language="gl" english-language-name="Galician">
+
+<!-- * This file is generated automatically. -->
+<!-- * To submit changes to this file upstream (to the DocBook Project) -->
+<!-- * do not submit an edited version of this file. Instead, submit an -->
+<!-- * edited version of the source file at the following location: -->
+<!-- * -->
+<!-- * https://docbook.svn.sourceforge.net/svnroot/docbook/trunk/gentext/locale/gl.xml -->
+<!-- * -->
+<!-- * E-mail the edited gl.xml source file to: -->
+<!-- * -->
+<!-- * docbook-developers@lists.sourceforge.net -->
+
+<!-- ******************************************************************** -->
+
+<!-- This file is part of the XSL DocBook Stylesheet distribution. -->
+<!-- See ../README or http://docbook.sf.net/release/xsl/current/ for -->
+<!-- copyright and other information. -->
+
+<!-- ******************************************************************** -->
+<!-- In these files, % with a letter is used for a placeholder: -->
+<!-- %t is the current element's title -->
+<!-- %s is the current element's subtitle (if applicable)-->
+<!-- %n is the current element's number label-->
+<!-- %p is the current element's page number (if applicable)-->
+<!-- ******************************************************************** -->
+
+
+<l:gentext key="Abstract" text="Resumo"/>
+<l:gentext key="abstract" text="Resumo"/>
+<l:gentext key="Acknowledgements" text="Acknowledgements" lang="en"/>
+<l:gentext key="acknowledgements" text="Acknowledgements" lang="en"/>
+<l:gentext key="Answer" text="R:"/>
+<l:gentext key="answer" text="R:"/>
+<l:gentext key="Appendix" text="Apêndice"/>
+<l:gentext key="appendix" text="Apêndice"/>
+<l:gentext key="Article" text="Artigo"/>
+<l:gentext key="article" text="Artigo"/>
+<l:gentext key="Author" text="Autor"/>
+<l:gentext key="Bibliography" text="Bibliografía"/>
+<l:gentext key="bibliography" text="Bibliografía"/>
+<l:gentext key="Book" text="Libro"/>
+<l:gentext key="book" text="Libro"/>
+<l:gentext key="CAUTION" text="CUIDADO"/>
+<l:gentext key="Caution" text="Cuidado"/>
+<l:gentext key="caution" text="Cuidado"/>
+<l:gentext key="Chapter" text="Capítulo"/>
+<l:gentext key="chapter" text="capítulo"/>
+<l:gentext key="Colophon" text="Colofón"/>
+<l:gentext key="colophon" text="Colofón"/>
+<l:gentext key="Copyright" text="Copyright"/>
+<l:gentext key="copyright" text="Copyright"/>
+<l:gentext key="Dedication" text="Dedicatoria"/>
+<l:gentext key="dedication" text="Dedicatoria"/>
+<l:gentext key="Edition" text="Edición"/>
+<l:gentext key="edition" text="Edición"/>
+<l:gentext key="Editor" text="Editor" lang="en"/>
+<l:gentext key="Equation" text="Ecuación"/>
+<l:gentext key="equation" text="Ecuación"/>
+<l:gentext key="Example" text="Exemplo"/>
+<l:gentext key="example" text="Exemplo"/>
+<l:gentext key="Figure" text="Figura"/>
+<l:gentext key="figure" text="Figura"/>
+<l:gentext key="Glossary" text="Glosario"/>
+<l:gentext key="glossary" text="Glosario"/>
+<l:gentext key="GlossSee" text="Consulte"/>
+<l:gentext key="glosssee" text="Consulte"/>
+<l:gentext key="GlossSeeAlso" text="Vexa Tamén"/>
+<l:gentext key="glossseealso" text="Vexa Tamén"/>
+<l:gentext key="IMPORTANT" text="IMPORTANTE"/>
+<l:gentext key="important" text="Importante"/>
+<l:gentext key="Important" text="Importante"/>
+<l:gentext key="Index" text="Ãndice"/>
+<l:gentext key="index" text="Ãndice"/>
+<l:gentext key="ISBN" text="ISBN"/>
+<l:gentext key="isbn" text="ISBN"/>
+<l:gentext key="LegalNotice" text="Aviso Legal"/>
+<l:gentext key="legalnotice" text="Aviso Legal"/>
+<l:gentext key="MsgAud" text="Audiencia"/>
+<l:gentext key="msgaud" text="Audiencia"/>
+<l:gentext key="MsgLevel" text="Nível"/>
+<l:gentext key="msglevel" text="Nível"/>
+<l:gentext key="MsgOrig" text="Orixen"/>
+<l:gentext key="msgorig" text="Orixen"/>
+<l:gentext key="NOTE" text="NOTA"/>
+<l:gentext key="Note" text="Nota"/>
+<l:gentext key="note" text="Nota"/>
+<l:gentext key="Part" text="Parte"/>
+<l:gentext key="part" text="Parte"/>
+<l:gentext key="Preface" text="Prefacio"/>
+<l:gentext key="preface" text="Prefacio"/>
+<l:gentext key="Procedure" text="Procedimento"/>
+<l:gentext key="procedure" text="Procedimento"/>
+<l:gentext key="ProductionSet" text="Produción"/>
+<l:gentext key="PubDate" text="Data de Publicación"/>
+<l:gentext key="pubdate" text="Data de Publicación"/>
+<l:gentext key="Published" text="Publicado"/>
+<l:gentext key="published" text="Publicado"/>
+<l:gentext key="Publisher" text="Publisher" lang="en"/>
+<l:gentext key="Qandadiv" text="P &amp; R"/>
+<l:gentext key="qandadiv" text="P &amp; R"/>
+<l:gentext key="QandASet" text="Frequently Asked Questions" lang="en"/>
+<l:gentext key="Question" text="P:"/>
+<l:gentext key="question" text="P:"/>
+<l:gentext key="RefEntry" text="Entrada de Referencia"/>
+<l:gentext key="refentry" text="Entrada de Referencia"/>
+<l:gentext key="Reference" text="Referencia"/>
+<l:gentext key="reference" text="Referencia"/>
+<l:gentext key="References" text="References" lang="en"/>
+<l:gentext key="RefName" text="Nome"/>
+<l:gentext key="refname" text="Nome"/>
+<l:gentext key="RefSection" text="Sección"/>
+<l:gentext key="refsection" text="sección"/>
+<l:gentext key="RefSynopsisDiv" text="Sinopse"/>
+<l:gentext key="refsynopsisdiv" text="Sinopse"/>
+<l:gentext key="RevHistory" text="Historial de Revisións"/>
+<l:gentext key="revhistory" text="Historial de Revisións"/>
+<l:gentext key="revision" text="Revisión"/>
+<l:gentext key="Revision" text="Revisión"/>
+<l:gentext key="sect1" text="Sección"/>
+<l:gentext key="sect2" text="Sección"/>
+<l:gentext key="sect3" text="Sección"/>
+<l:gentext key="sect4" text="Sección"/>
+<l:gentext key="sect5" text="Sección"/>
+<l:gentext key="section" text="sección"/>
+<l:gentext key="Section" text="Sección"/>
+<l:gentext key="see" text="vexa"/>
+<l:gentext key="See" text="Vexa"/>
+<l:gentext key="seealso" text="Consulte Tamén"/>
+<l:gentext key="Seealso" text="Consulte tamén"/>
+<l:gentext key="SeeAlso" text="Consulte Tamén"/>
+<l:gentext key="set" text="Conxunto"/>
+<l:gentext key="Set" text="Conxunto"/>
+<l:gentext key="setindex" text="Ãndice de Conxuntos"/>
+<l:gentext key="SetIndex" text="Ãndice de Conxuntos"/>
+<l:gentext key="Sidebar" text="Barra Lateral"/>
+<l:gentext key="sidebar" text="barra lateral"/>
+<l:gentext key="step" text="paso"/>
+<l:gentext key="Step" text="Paso"/>
+<l:gentext key="table" text="Táboa"/>
+<l:gentext key="Table" text="Táboa"/>
+<l:gentext key="task" text="Task" lang="en"/>
+<l:gentext key="Task" text="Task" lang="en"/>
+<l:gentext key="tip" text="Axuda"/>
+<l:gentext key="TIP" text="AXUDA"/>
+<l:gentext key="Tip" text="Axuda"/>
+<l:gentext key="Warning" text="Atención"/>
+<l:gentext key="warning" text="Atención"/>
+<l:gentext key="WARNING" text="ATENCIÓn"/>
+<l:gentext key="and" text="e"/>
+<l:gentext key="by" text="por"/>
+<l:gentext key="Edited" text="Editado"/>
+<l:gentext key="edited" text="Editado"/>
+<l:gentext key="Editedby" text="Editado por"/>
+<l:gentext key="editedby" text="Editado por"/>
+<l:gentext key="in" text="en"/>
+<l:gentext key="lastlistcomma" text=","/>
+<l:gentext key="listcomma" text=","/>
+<l:gentext key="notes" text="Notas"/>
+<l:gentext key="Notes" text="Notas"/>
+<l:gentext key="Pgs" text="Páxinas"/>
+<l:gentext key="pgs" text="Páxinas"/>
+<l:gentext key="Revisedby" text="Revisado por: "/>
+<l:gentext key="revisedby" text="Revisado por: "/>
+<l:gentext key="TableNotes" text="Notas"/>
+<l:gentext key="tablenotes" text="Notas"/>
+<l:gentext key="TableofContents" text="Ãndice"/>
+<l:gentext key="tableofcontents" text="Ãndice"/>
+<l:gentext key="unexpectedelementname" text="Nome de ítem inesperado"/>
+<l:gentext key="unsupported" text="non soportado"/>
+<l:gentext key="xrefto" text="referencia para"/>
+<l:gentext key="Authors" text="Autores"/>
+<l:gentext key="copyeditor" text="Editor de Cópia"/>
+<l:gentext key="graphicdesigner" text="Deseñador Gráfico"/>
+<l:gentext key="productioneditor" text="Editor de Produción"/>
+<l:gentext key="technicaleditor" text="Editor Técnico"/>
+<l:gentext key="translator" text="Trandutor"/>
+<l:gentext key="listofequations" text="Lista de Ecuacións"/>
+<l:gentext key="ListofEquations" text="Lista de Ecuacións"/>
+<l:gentext key="ListofExamples" text="Lista de Exemplos"/>
+<l:gentext key="listofexamples" text="Lista de Exemplos"/>
+<l:gentext key="ListofFigures" text="Lista de Figuras"/>
+<l:gentext key="listoffigures" text="Lista de Figuras"/>
+<l:gentext key="ListofProcedures" text="Lista de Procedimentos"/>
+<l:gentext key="listofprocedures" text="Lista de Procedimentos"/>
+<l:gentext key="listoftables" text="Lista de Táboas"/>
+<l:gentext key="ListofTables" text="Lista de Táboas"/>
+<l:gentext key="ListofUnknown" text="Lista de Descoñecido"/>
+<l:gentext key="listofunknown" text="Lista de Descoñecido"/>
+<l:gentext key="nav-home" text="Inicio"/>
+<l:gentext key="nav-next" text="Próximo"/>
+<l:gentext key="nav-next-sibling" text="Próxima Parte"/>
+<l:gentext key="nav-prev" text="Anterior"/>
+<l:gentext key="nav-prev-sibling" text="Parte Anterior"/>
+<l:gentext key="nav-up" text="Subir"/>
+<l:gentext key="nav-toc" text="Ãndice"/>
+<l:gentext key="Draft" text="Borrador"/>
+<l:gentext key="above" text="acima"/>
+<l:gentext key="below" text="abaixo"/>
+<l:gentext key="sectioncalled" text="a sección chamada"/>
+<l:gentext key="index symbols" text="Símbolos"/>
+<l:gentext key="writing-mode" text="lr-tb"/>
+<l:gentext key="lowercase.alpha" text="abcdefghijklmnopqrstuvwxyzáéíóúñ"/>
+<l:gentext key="uppercase.alpha" text="ABCDEFGHIJKLMNOPQRSTUVWXYZÃÉÃÓÚÑ"/>
+<l:gentext key="normalize.sort.input" text="AaÀàÃáÂâÃãÄäÅåĀÄĂ㥹ÇǎǞǟǠǡǺǻȀÈȂȃȦȧḀá¸áºšáº áº¡áº¢áº£áº¤áº¥áº¦áº§áº¨áº©áºªáº«áº¬áº­áº®áº¯áº°áº±áº²áº³áº´áºµáº¶áº·BbÆ€ÆɓƂƃḂḃḄḅḆḇCcÇçĆćĈĉĊċČÄƇƈɕḈḉDdÄŽÄÄđƊɗƋƌDžDzȡɖḊḋḌá¸á¸Žá¸á¸á¸‘ḒḓEeÈèÉéÊêËëĒēĔĕĖėĘęĚěȄȅȆȇȨȩḔḕḖḗḘḙḚḛḜá¸áº¸áº¹áººáº»áº¼áº½áº¾áº¿á»€á»á»‚ểỄễỆệFfƑƒḞḟGgÄœÄĞğĠġĢģƓɠǤǥǦǧǴǵḠḡHhĤĥĦħȞȟɦḢḣḤḥḦḧḨḩḪḫẖIiÌìÃíÎîÃïĨĩĪīĬĭĮįİƗɨÇÇȈȉȊȋḬḭḮḯỈỉỊịJjĴĵǰÊKkĶķƘƙǨǩḰḱḲḳḴḵLlĹĺĻļĽľĿŀÅłƚLjȴɫɬɭḶḷḸḹḺḻḼḽMmɱḾḿṀá¹á¹‚ṃNnÑñŃńŅņŇňÆɲƞȠNjǸǹȵɳṄṅṆṇṈṉṊṋOoÒòÓóÔôÕõÖöØøŌÅÅŽÅÅőƟƠơǑǒǪǫǬǭǾǿȌÈÈŽÈȪȫȬȭȮȯȰȱṌá¹á¹Žá¹á¹á¹‘ṒṓỌá»á»Žá»á»á»‘ỒồỔổỖỗỘộỚớỜá»á»žá»Ÿá» á»¡á»¢á»£PpƤƥṔṕṖṗQqÊ RrŔŕŖŗŘřÈȑȒȓɼɽɾṘṙṚṛṜá¹á¹žá¹ŸSsŚśŜÅŞşŠšȘșʂṠṡṢṣṤṥṦṧṨṩTtŢţŤťŦŧƫƬƭƮʈȚțȶṪṫṬṭṮṯṰṱẗUuÙùÚúÛûÜüŨũŪūŬŭŮůŰűŲųƯưǓǔǕǖǗǘǙǚǛǜȔȕȖȗṲṳṴṵṶṷṸṹṺṻỤụỦủỨứỪừỬửỮữỰựVvƲʋṼṽṾṿWwŴŵẀáºáº‚ẃẄẅẆẇẈẉẘXxẊẋẌáºYyÃýÿŸŶŷƳƴȲȳẎáºáº™á»²á»³á»´á»µá»¶á»·á»¸á»¹ZzŹźŻżŽžƵƶȤȥÊÊ‘áºáº‘ẒẓẔẕẕ" lang="en"/>
+<l:gentext key="normalize.sort.output" text="AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBCCCCCCCCCCCCCCCCCDDDDDDDDDDDDDDDDDDDDDDDDEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEFFFFFFGGGGGGGGGGGGGGGGGGGGHHHHHHHHHHHHHHHHHHHHIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIJJJJJJKKKKKKKKKKKKKKLLLLLLLLLLLLLLLLLLLLLLLLLLMMMMMMMMMNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOPPPPPPPPQQQRRRRRRRRRRRRRRRRRRRRRRRSSSSSSSSSSSSSSSSSSSSSSSTTTTTTTTTTTTTTTTTTTTTTTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUVVVVVVVVWWWWWWWWWWWWWWWXXXXXXYYYYYYYYYYYYYYYYYYYYYYYZZZZZZZZZZZZZZZZZZZZZ" lang="en"/>
+<l:dingbat key="startquote" text="« "/>
+<l:dingbat key="endquote" text=" »"/>
+<l:dingbat key="nestedstartquote" text="« "/>
+<l:dingbat key="nestedendquote" text=" »"/>
+<l:dingbat key="singlestartquote" text="‹"/>
+<l:dingbat key="singleendquote" text="›"/>
+<l:dingbat key="bullet" text="•"/>
+<l:gentext key="hyphenation-character" text="-"/>
+<l:gentext key="hyphenation-push-character-count" text="2"/>
+<l:gentext key="hyphenation-remain-character-count" text="2"/>
+<l:context name="styles"><l:template name="person-name" text="first-last"/>
+</l:context>
+<l:context name="title"><l:template name="abstract" text="%t"/>
+<l:template name="acknowledgements" text="%t" lang="en"/>
+<l:template name="answer" text="%t"/>
+<l:template name="appendix" text="Apêndice %n. %t"/>
+<l:template name="article" text="%t"/>
+<l:template name="authorblurb" text="%t"/>
+<l:template name="bibliodiv" text="%t"/>
+<l:template name="biblioentry" text="%t"/>
+<l:template name="bibliography" text="%t"/>
+<l:template name="bibliolist" text="%t" lang="en"/>
+<l:template name="bibliomixed" text="%t"/>
+<l:template name="bibliomset" text="%t"/>
+<l:template name="biblioset" text="%t"/>
+<l:template name="blockquote" text="%t"/>
+<l:template name="book" text="%t"/>
+<l:template name="calloutlist" text="%t"/>
+<l:template name="caution" text="%t"/>
+<l:template name="chapter" text="Capítulo %n. %t"/>
+<l:template name="colophon" text="%t"/>
+<l:template name="dedication" text="%t"/>
+<l:template name="equation" text="Ecuación %n. %t"/>
+<l:template name="example" text="Exemplo %n. %t"/>
+<l:template name="figure" text="Figura %n. %t"/>
+<l:template name="foil" text="%t" lang="en"/>
+<l:template name="foilgroup" text="%t" lang="en"/>
+<l:template name="formalpara" text="%t"/>
+<l:template name="glossary" text="%t"/>
+<l:template name="glossdiv" text="%t"/>
+<l:template name="glosslist" text="%t" lang="en"/>
+<l:template name="glossentry" text="%t" lang="en"/>
+<l:template name="important" text="%t"/>
+<l:template name="index" text="%t"/>
+<l:template name="indexdiv" text="%t"/>
+<l:template name="itemizedlist" text="%t"/>
+<l:template name="legalnotice" text="%t"/>
+<l:template name="listitem" text=""/>
+<l:template name="lot" text="%t"/>
+<l:template name="msg" text="%t"/>
+<l:template name="msgexplan" text="%t"/>
+<l:template name="msgmain" text="%t"/>
+<l:template name="msgrel" text="%t"/>
+<l:template name="msgset" text="%t"/>
+<l:template name="msgsub" text="%t"/>
+<l:template name="note" text="%t"/>
+<l:template name="orderedlist" text="%t"/>
+<l:template name="part" text="Parte %n. %t"/>
+<l:template name="partintro" text="%t"/>
+<l:template name="preface" text="%t"/>
+<l:template name="procedure" text="%t"/>
+<l:template name="procedure.formal" text="Procedimento %n. %t"/>
+<l:template name="productionset" text="%t"/>
+<l:template name="productionset.formal" text="Produción %n"/>
+<l:template name="qandadiv" text="%t"/>
+<l:template name="qandaentry" text="%t"/>
+<l:template name="qandaset" text="%t"/>
+<l:template name="question" text="Pergunta %n"/>
+<l:template name="refentry" text="%t"/>
+<l:template name="reference" text="%t"/>
+<l:template name="refsection" text="%t"/>
+<l:template name="refsect1" text="%t"/>
+<l:template name="refsect2" text="%t"/>
+<l:template name="refsect3" text="%t"/>
+<l:template name="refsynopsisdiv" text="%t"/>
+<l:template name="refsynopsisdivinfo" text="%t"/>
+<l:template name="segmentedlist" text="%t"/>
+<l:template name="set" text="%t"/>
+<l:template name="setindex" text="%t"/>
+<l:template name="sidebar" text="%t"/>
+<l:template name="step" text="%t"/>
+<l:template name="table" text="TáboaTáboa %n. %t"/>
+<l:template name="task" text="%t" lang="en"/>
+<l:template name="tasksummary" text="%t" lang="en"/>
+<l:template name="taskprerequisites" text="%t" lang="en"/>
+<l:template name="taskrelated" text="%t" lang="en"/>
+<l:template name="tip" text="%t"/>
+<l:template name="toc" text="%t"/>
+<l:template name="variablelist" text="%t"/>
+<l:template name="varlistentry" text="" lang="en"/>
+<l:template name="warning" text="%t"/>
+</l:context>
+<l:context name="title-unnumbered"><l:template name="appendix" text="%t"/>
+<l:template name="article/appendix" text="%t" lang="en"/>
+<l:template name="bridgehead" text="%t"/>
+<l:template name="chapter" text="%t"/>
+<l:template name="sect1" text="%t"/>
+<l:template name="sect2" text="%t"/>
+<l:template name="sect3" text="%t"/>
+<l:template name="sect4" text="%t"/>
+<l:template name="sect5" text="%t"/>
+<l:template name="section" text="%t"/>
+<l:template name="simplesect" text="%t"/>
+<l:template name="part" text="%t" lang="en"/>
+</l:context>
+<l:context name="title-numbered"><l:template name="appendix" text="Apêndice %n. %t"/>
+<l:template name="article/appendix" text="%n. %t" lang="en"/>
+<l:template name="bridgehead" text="%t"/>
+<l:template name="chapter" text="Capítulo %n. %t"/>
+<l:template name="part" text="Parte %n. %t"/>
+<l:template name="sect1" text="%n. %t"/>
+<l:template name="sect2" text="%n. %t"/>
+<l:template name="sect3" text="%n. %t"/>
+<l:template name="sect4" text="%n. %t"/>
+<l:template name="sect5" text="%n. %t"/>
+<l:template name="section" text="%n. %t"/>
+<l:template name="simplesect" text="%n. %t"/>
+</l:context>
+<l:context name="subtitle"><l:template name="appendix" text="%s"/>
+<l:template name="acknowledgements" text="%s" lang="en"/>
+<l:template name="article" text="%s"/>
+<l:template name="bibliodiv" text="%s"/>
+<l:template name="biblioentry" text="%s"/>
+<l:template name="bibliography" text="%s"/>
+<l:template name="bibliomixed" text="%s"/>
+<l:template name="bibliomset" text="%s"/>
+<l:template name="biblioset" text="%s"/>
+<l:template name="book" text="%s"/>
+<l:template name="chapter" text="%s"/>
+<l:template name="colophon" text="%s"/>
+<l:template name="dedication" text="%s"/>
+<l:template name="glossary" text="%s"/>
+<l:template name="glossdiv" text="%s"/>
+<l:template name="index" text="%s"/>
+<l:template name="indexdiv" text="%s"/>
+<l:template name="lot" text="%s"/>
+<l:template name="part" text="%s"/>
+<l:template name="partintro" text="%s"/>
+<l:template name="preface" text="%s"/>
+<l:template name="refentry" text="%s"/>
+<l:template name="reference" text="%s"/>
+<l:template name="refsection" text="%s"/>
+<l:template name="refsect1" text="%s"/>
+<l:template name="refsect2" text="%s"/>
+<l:template name="refsect3" text="%s"/>
+<l:template name="refsynopsisdiv" text="%s"/>
+<l:template name="sect1" text="%s"/>
+<l:template name="sect2" text="%s"/>
+<l:template name="sect3" text="%s"/>
+<l:template name="sect4" text="%s"/>
+<l:template name="sect5" text="%s"/>
+<l:template name="section" text="%s"/>
+<l:template name="set" text="%s"/>
+<l:template name="setindex" text="%s"/>
+<l:template name="sidebar" text="%s"/>
+<l:template name="simplesect" text="%s"/>
+<l:template name="toc" text="%s"/>
+</l:context>
+<l:context name="xref"><l:template name="abstract" text="%t"/>
+<l:template name="acknowledgements" text="%t" lang="en"/>
+<l:template name="answer" text="R: %n"/>
+<l:template name="appendix" text="%t"/>
+<l:template name="article" text="%t"/>
+<l:template name="authorblurb" text="%t"/>
+<l:template name="bibliodiv" text="%t"/>
+<l:template name="bibliography" text="%t"/>
+<l:template name="bibliomset" text="%t"/>
+<l:template name="biblioset" text="%t"/>
+<l:template name="blockquote" text="%t"/>
+<l:template name="book" text="%t"/>
+<l:template name="calloutlist" text="%t"/>
+<l:template name="caution" text="%t"/>
+<l:template name="chapter" text="%t"/>
+<l:template name="colophon" text="%t"/>
+<l:template name="constraintdef" text="%t"/>
+<l:template name="dedication" text="%t"/>
+<l:template name="equation" text="%t"/>
+<l:template name="example" text="%t"/>
+<l:template name="figure" text="%t"/>
+<l:template name="foil" text="%t" lang="en"/>
+<l:template name="foilgroup" text="%t" lang="en"/>
+<l:template name="formalpara" text="%t"/>
+<l:template name="glossary" text="%t"/>
+<l:template name="glossdiv" text="%t"/>
+<l:template name="important" text="%t"/>
+<l:template name="index" text="%t"/>
+<l:template name="indexdiv" text="%t"/>
+<l:template name="itemizedlist" text="%t"/>
+<l:template name="legalnotice" text="%t"/>
+<l:template name="listitem" text="%n"/>
+<l:template name="lot" text="%t"/>
+<l:template name="msg" text="%t"/>
+<l:template name="msgexplan" text="%t"/>
+<l:template name="msgmain" text="%t"/>
+<l:template name="msgrel" text="%t"/>
+<l:template name="msgset" text="%t"/>
+<l:template name="msgsub" text="%t"/>
+<l:template name="note" text="%t"/>
+<l:template name="orderedlist" text="%t"/>
+<l:template name="part" text="%t"/>
+<l:template name="partintro" text="%t"/>
+<l:template name="preface" text="%t"/>
+<l:template name="procedure" text="%t"/>
+<l:template name="productionset" text="%t"/>
+<l:template name="qandadiv" text="%t"/>
+<l:template name="qandaentry" text="P: %n"/>
+<l:template name="qandaset" text="%t"/>
+<l:template name="question" text="P: %n"/>
+<l:template name="reference" text="%t"/>
+<l:template name="refsynopsisdiv" text="%t"/>
+<l:template name="segmentedlist" text="%t"/>
+<l:template name="set" text="%t"/>
+<l:template name="setindex" text="%t"/>
+<l:template name="sidebar" text="%t"/>
+<l:template name="table" text="%t"/>
+<l:template name="task" text="%t" lang="en"/>
+<l:template name="tip" text="%t"/>
+<l:template name="toc" text="%t"/>
+<l:template name="variablelist" text="%t"/>
+<l:template name="varlistentry" text=""/>
+<l:template name="warning" text="%t"/>
+<l:template name="olink.document.citation" text=" in %o" lang="en"/>
+<l:template name="olink.page.citation" text=" (page %p)" lang="en"/>
+<l:template name="page.citation" text=" [%p]"/>
+<l:template name="page" text="(page %p)" lang="en"/>
+<l:template name="docname" text=" in %o" lang="en"/>
+<l:template name="docnamelong" text=" in the document titled %o" lang="en"/>
+<l:template name="pageabbrev" text="(p. %p)" lang="en"/>
+<l:template name="Page" text="Page %p" lang="en"/>
+<l:template name="bridgehead" text="« %t »"/>
+<l:template name="refsection" text="« %t »"/>
+<l:template name="refsect1" text="« %t »"/>
+<l:template name="refsect2" text="« %t »"/>
+<l:template name="refsect3" text="« %t »"/>
+<l:template name="sect1" text="« %t »"/>
+<l:template name="sect2" text="« %t »"/>
+<l:template name="sect3" text="« %t »"/>
+<l:template name="sect4" text="« %t »"/>
+<l:template name="sect5" text="« %t »"/>
+<l:template name="section" text="« %t »"/>
+<l:template name="simplesect" text="« %t »"/>
+</l:context>
+<l:context name="xref-number"><l:template name="answer" text="R: %n"/>
+<l:template name="appendix" text="Apêndice %n"/>
+<l:template name="bridgehead" text="Sección %n"/>
+<l:template name="chapter" text="Capítulo %n"/>
+<l:template name="equation" text="Ecuación %n"/>
+<l:template name="example" text="Exemplo %n"/>
+<l:template name="figure" text="Figura %n"/>
+<l:template name="part" text="Parte %n"/>
+<l:template name="procedure" text="Procedimento %n"/>
+<l:template name="productionset" text="Produción %n"/>
+<l:template name="qandadiv" text="P &amp; R %n"/>
+<l:template name="qandaentry" text="P: %n"/>
+<l:template name="question" text="P: %n"/>
+<l:template name="sect1" text="Sección %n"/>
+<l:template name="sect2" text="Sección %n"/>
+<l:template name="sect3" text="Sección %n"/>
+<l:template name="sect4" text="Sección %n"/>
+<l:template name="sect5" text="Sección %n"/>
+<l:template name="section" text="Sección %n"/>
+<l:template name="table" text="Táboa %n"/>
+</l:context>
+<l:context name="xref-number-and-title"><l:template name="appendix" text="Apêndice %n, %t"/>
+<l:template name="bridgehead" text="Sección %n, « %t »"/>
+<l:template name="chapter" text="Capítulo %n, %t"/>
+<l:template name="equation" text="Ecuación %n, « %t »"/>
+<l:template name="example" text="Exemplo %n, « %t »"/>
+<l:template name="figure" text="Figura %n, « %t »"/>
+<l:template name="part" text="Parte %n, « %t »"/>
+<l:template name="procedure" text="Procedimento %n, « %t »"/>
+<l:template name="productionset" text="Produción %n, « %t »"/>
+<l:template name="qandadiv" text="P &amp; R %n, « %t »"/>
+<l:template name="refsect1" text="a sección chamada « %t »"/>
+<l:template name="refsect2" text="a sección chamada « %t »"/>
+<l:template name="refsect3" text="a sección chamada « %t »"/>
+<l:template name="refsection" text="a sección chamada « %t »"/>
+<l:template name="sect1" text="Sección %n, « %t »"/>
+<l:template name="sect2" text="Sección %n, « %t »"/>
+<l:template name="sect3" text="Sección %n, « %t »"/>
+<l:template name="sect4" text="Sección %n, « %t »"/>
+<l:template name="sect5" text="Sección %n, « %t »"/>
+<l:template name="section" text="Sección %n, « %t »"/>
+<l:template name="simplesect" text="a sección chamada « %t »"/>
+<l:template name="table" text="Táboa %n, « %t »"/>
+</l:context>
+<l:context name="authorgroup"><l:template name="sep" text=", "/>
+<l:template name="sep2" text=" e "/>
+<l:template name="seplast" text=", e "/>
+</l:context>
+<l:context name="glossary"><l:template name="see" text="Consulte %t."/>
+<l:template name="seealso" text="Vexa Tamén %t."/>
+<l:template name="seealso-separator" text=", "/>
+</l:context>
+<l:context name="msgset"><l:template name="MsgAud" text="Audiencia: "/>
+<l:template name="MsgLevel" text="Nível: "/>
+<l:template name="MsgOrig" text="Orixen: "/>
+</l:context>
+<l:context name="datetime"><l:template name="format" text="d/m/Y"/>
+</l:context>
+<l:context name="termdef"><l:template name="prefix" text="[Definición: "/>
+<l:template name="suffix" text="]"/>
+</l:context>
+<l:context name="datetime-full"><l:template name="January" text="Xaneiro"/>
+<l:template name="February" text="Febreiro"/>
+<l:template name="March" text="Marzo"/>
+<l:template name="April" text="Abril"/>
+<l:template name="May" text="Maio"/>
+<l:template name="June" text="Xuño"/>
+<l:template name="July" text="Xullo"/>
+<l:template name="August" text="Agosto"/>
+<l:template name="September" text="Setembro"/>
+<l:template name="October" text="Outubro"/>
+<l:template name="November" text="Novembro"/>
+<l:template name="December" text="Decembro"/>
+<l:template name="Monday" text="Luns"/>
+<l:template name="Tuesday" text="Martes"/>
+<l:template name="Wednesday" text="Mércores"/>
+<l:template name="Thursday" text="Xoves"/>
+<l:template name="Friday" text="Venres"/>
+<l:template name="Saturday" text="Sábado"/>
+<l:template name="Sunday" text="Domingo"/>
+</l:context>
+<l:context name="datetime-abbrev"><l:template name="Jan" text="Xan"/>
+<l:template name="Feb" text="Feb"/>
+<l:template name="Mar" text="Mar"/>
+<l:template name="Apr" text="Abr"/>
+<l:template name="May" text="Mai"/>
+<l:template name="Jun" text="Xuñ"/>
+<l:template name="Jul" text="Xul"/>
+<l:template name="Aug" text="Ago"/>
+<l:template name="Sep" text="Set"/>
+<l:template name="Oct" text="Out"/>
+<l:template name="Nov" text="Nov"/>
+<l:template name="Dec" text="Dec"/>
+<l:template name="Mon" text="Lun"/>
+<l:template name="Tue" text="Mar"/>
+<l:template name="Wed" text="Mer"/>
+<l:template name="Thu" text="Xov"/>
+<l:template name="Fri" text="Ven"/>
+<l:template name="Sat" text="Sab"/>
+<l:template name="Sun" text="Dom"/>
+</l:context>
+<l:context name="htmlhelp"><l:template name="langcode" text="0x0456 Galician"/>
+</l:context>
+<l:context name="index"><l:template name="term-separator" text=", " lang="en"/>
+<l:template name="number-separator" text=", " lang="en"/>
+<l:template name="range-separator" text="-" lang="en"/>
+</l:context>
+<l:context name="iso690"><l:template name="lastfirst.sep" text=", " lang="en"/>
+<l:template name="alt.person.two.sep" text=" – " lang="en"/>
+<l:template name="alt.person.last.sep" text=" – " lang="en"/>
+<l:template name="alt.person.more.sep" text=" – " lang="en"/>
+<l:template name="primary.editor" text=" (ed.)" lang="en"/>
+<l:template name="primary.many" text=", et al." lang="en"/>
+<l:template name="primary.sep" text=". " lang="en"/>
+<l:template name="submaintitle.sep" text=": " lang="en"/>
+<l:template name="title.sep" text=". " lang="en"/>
+<l:template name="othertitle.sep" text=", " lang="en"/>
+<l:template name="medium1" text=" [" lang="en"/>
+<l:template name="medium2" text="]" lang="en"/>
+<l:template name="secondary.person.sep" text="; " lang="en"/>
+<l:template name="secondary.sep" text=". " lang="en"/>
+<l:template name="respons.sep" text=". " lang="en"/>
+<l:template name="edition.sep" text=". " lang="en"/>
+<l:template name="edition.serial.sep" text=", " lang="en"/>
+<l:template name="issuing.range" text="-" lang="en"/>
+<l:template name="issuing.div" text=", " lang="en"/>
+<l:template name="issuing.sep" text=". " lang="en"/>
+<l:template name="partnr.sep" text=". " lang="en"/>
+<l:template name="placepubl.sep" text=": " lang="en"/>
+<l:template name="publyear.sep" text=", " lang="en"/>
+<l:template name="pubinfo.sep" text=". " lang="en"/>
+<l:template name="spec.pubinfo.sep" text=", " lang="en"/>
+<l:template name="upd.sep" text=", " lang="en"/>
+<l:template name="datecit1" text=" [cited " lang="en"/>
+<l:template name="datecit2" text="]" lang="en"/>
+<l:template name="extent.sep" text=". " lang="en"/>
+<l:template name="locs.sep" text=", " lang="en"/>
+<l:template name="location.sep" text=". " lang="en"/>
+<l:template name="serie.sep" text=". " lang="en"/>
+<l:template name="notice.sep" text=". " lang="en"/>
+<l:template name="access" text="Available " lang="en"/>
+<l:template name="acctoo" text="Also available " lang="en"/>
+<l:template name="onwww" text="from World Wide Web" lang="en"/>
+<l:template name="oninet" text="from Internet" lang="en"/>
+<l:template name="access.end" text=": " lang="en"/>
+<l:template name="link1" text="&lt;" lang="en"/>
+<l:template name="link2" text="&gt;" lang="en"/>
+<l:template name="access.sep" text=". " lang="en"/>
+<l:template name="isbn" text="ISBN " lang="en"/>
+<l:template name="issn" text="ISSN " lang="en"/>
+<l:template name="stdnum.sep" text=". " lang="en"/>
+<l:template name="patcountry.sep" text=". " lang="en"/>
+<l:template name="pattype.sep" text=", " lang="en"/>
+<l:template name="patnum.sep" text=". " lang="en"/>
+<l:template name="patdate.sep" text=". " lang="en"/>
+</l:context><l:letters lang="en"><l:l i="-1"/>
+<l:l i="0">Symbols</l:l>
+<l:l i="10">A</l:l>
+<l:l i="10">a</l:l>
+<l:l i="10">À</l:l>
+<l:l i="10">à</l:l>
+<l:l i="10">Ã</l:l>
+<l:l i="10">á</l:l>
+<l:l i="10">Â</l:l>
+<l:l i="10">â</l:l>
+<l:l i="10">Ã</l:l>
+<l:l i="10">ã</l:l>
+<l:l i="10">Ä</l:l>
+<l:l i="10">ä</l:l>
+<l:l i="10">Ã…</l:l>
+<l:l i="10">Ã¥</l:l>
+<l:l i="10">Ä€</l:l>
+<l:l i="10">Ä</l:l>
+<l:l i="10">Ä‚</l:l>
+<l:l i="10">ă</l:l>
+<l:l i="10">Ä„</l:l>
+<l:l i="10">Ä…</l:l>
+<l:l i="10">Ç</l:l>
+<l:l i="10">ÇŽ</l:l>
+<l:l i="10">Çž</l:l>
+<l:l i="10">ÇŸ</l:l>
+<l:l i="10">Ç </l:l>
+<l:l i="10">Ç¡</l:l>
+<l:l i="10">Ǻ</l:l>
+<l:l i="10">Ç»</l:l>
+<l:l i="10">È€</l:l>
+<l:l i="10">È</l:l>
+<l:l i="10">È‚</l:l>
+<l:l i="10">ȃ</l:l>
+<l:l i="10">Ȧ</l:l>
+<l:l i="10">ȧ</l:l>
+<l:l i="10">Ḁ</l:l>
+<l:l i="10">á¸</l:l>
+<l:l i="10">ẚ</l:l>
+<l:l i="10">Ạ</l:l>
+<l:l i="10">ạ</l:l>
+<l:l i="10">Ả</l:l>
+<l:l i="10">ả</l:l>
+<l:l i="10">Ấ</l:l>
+<l:l i="10">ấ</l:l>
+<l:l i="10">Ầ</l:l>
+<l:l i="10">ầ</l:l>
+<l:l i="10">Ẩ</l:l>
+<l:l i="10">ẩ</l:l>
+<l:l i="10">Ẫ</l:l>
+<l:l i="10">ẫ</l:l>
+<l:l i="10">Ậ</l:l>
+<l:l i="10">ậ</l:l>
+<l:l i="10">Ắ</l:l>
+<l:l i="10">ắ</l:l>
+<l:l i="10">Ằ</l:l>
+<l:l i="10">ằ</l:l>
+<l:l i="10">Ẳ</l:l>
+<l:l i="10">ẳ</l:l>
+<l:l i="10">Ẵ</l:l>
+<l:l i="10">ẵ</l:l>
+<l:l i="10">Ặ</l:l>
+<l:l i="10">ặ</l:l>
+<l:l i="20">B</l:l>
+<l:l i="20">b</l:l>
+<l:l i="20">Æ€</l:l>
+<l:l i="20">Æ</l:l>
+<l:l i="20">É“</l:l>
+<l:l i="20">Æ‚</l:l>
+<l:l i="20">ƃ</l:l>
+<l:l i="20">Ḃ</l:l>
+<l:l i="20">ḃ</l:l>
+<l:l i="20">Ḅ</l:l>
+<l:l i="20">ḅ</l:l>
+<l:l i="20">Ḇ</l:l>
+<l:l i="20">ḇ</l:l>
+<l:l i="30">C</l:l>
+<l:l i="30">c</l:l>
+<l:l i="30">Ç</l:l>
+<l:l i="30">ç</l:l>
+<l:l i="30">Ć</l:l>
+<l:l i="30">ć</l:l>
+<l:l i="30">Ĉ</l:l>
+<l:l i="30">ĉ</l:l>
+<l:l i="30">ÄŠ</l:l>
+<l:l i="30">Ä‹</l:l>
+<l:l i="30">Č</l:l>
+<l:l i="30">Ä</l:l>
+<l:l i="30">Ƈ</l:l>
+<l:l i="30">ƈ</l:l>
+<l:l i="30">É•</l:l>
+<l:l i="30">Ḉ</l:l>
+<l:l i="30">ḉ</l:l>
+<l:l i="40">D</l:l>
+<l:l i="40">d</l:l>
+<l:l i="40">ÄŽ</l:l>
+<l:l i="40">Ä</l:l>
+<l:l i="40">Ä</l:l>
+<l:l i="40">Ä‘</l:l>
+<l:l i="40">ÆŠ</l:l>
+<l:l i="40">É—</l:l>
+<l:l i="40">Æ‹</l:l>
+<l:l i="40">ƌ</l:l>
+<l:l i="40">Ç…</l:l>
+<l:l i="40">Dz</l:l>
+<l:l i="40">È¡</l:l>
+<l:l i="40">É–</l:l>
+<l:l i="40">Ḋ</l:l>
+<l:l i="40">ḋ</l:l>
+<l:l i="40">Ḍ</l:l>
+<l:l i="40">á¸</l:l>
+<l:l i="40">Ḏ</l:l>
+<l:l i="40">á¸</l:l>
+<l:l i="40">á¸</l:l>
+<l:l i="40">ḑ</l:l>
+<l:l i="40">Ḓ</l:l>
+<l:l i="40">ḓ</l:l>
+<l:l i="50">E</l:l>
+<l:l i="50">e</l:l>
+<l:l i="50">È</l:l>
+<l:l i="50">è</l:l>
+<l:l i="50">É</l:l>
+<l:l i="50">é</l:l>
+<l:l i="50">Ê</l:l>
+<l:l i="50">ê</l:l>
+<l:l i="50">Ë</l:l>
+<l:l i="50">ë</l:l>
+<l:l i="50">Ä’</l:l>
+<l:l i="50">Ä“</l:l>
+<l:l i="50">Ä”</l:l>
+<l:l i="50">Ä•</l:l>
+<l:l i="50">Ä–</l:l>
+<l:l i="50">Ä—</l:l>
+<l:l i="50">Ę</l:l>
+<l:l i="50">Ä™</l:l>
+<l:l i="50">Äš</l:l>
+<l:l i="50">Ä›</l:l>
+<l:l i="50">È„</l:l>
+<l:l i="50">È…</l:l>
+<l:l i="50">Ȇ</l:l>
+<l:l i="50">ȇ</l:l>
+<l:l i="50">Ȩ</l:l>
+<l:l i="50">È©</l:l>
+<l:l i="50">Ḕ</l:l>
+<l:l i="50">ḕ</l:l>
+<l:l i="50">Ḗ</l:l>
+<l:l i="50">ḗ</l:l>
+<l:l i="50">Ḙ</l:l>
+<l:l i="50">ḙ</l:l>
+<l:l i="50">Ḛ</l:l>
+<l:l i="50">ḛ</l:l>
+<l:l i="50">Ḝ</l:l>
+<l:l i="50">á¸</l:l>
+<l:l i="50">Ẹ</l:l>
+<l:l i="50">ẹ</l:l>
+<l:l i="50">Ẻ</l:l>
+<l:l i="50">ẻ</l:l>
+<l:l i="50">Ẽ</l:l>
+<l:l i="50">ẽ</l:l>
+<l:l i="50">Ế</l:l>
+<l:l i="50">ế</l:l>
+<l:l i="50">Ề</l:l>
+<l:l i="50">á»</l:l>
+<l:l i="50">Ể</l:l>
+<l:l i="50">ể</l:l>
+<l:l i="50">Ễ</l:l>
+<l:l i="50">á»…</l:l>
+<l:l i="50">Ệ</l:l>
+<l:l i="50">ệ</l:l>
+<l:l i="60">F</l:l>
+<l:l i="60">f</l:l>
+<l:l i="60">Æ‘</l:l>
+<l:l i="60">Æ’</l:l>
+<l:l i="60">Ḟ</l:l>
+<l:l i="60">ḟ</l:l>
+<l:l i="70">G</l:l>
+<l:l i="70">g</l:l>
+<l:l i="70">Ĝ</l:l>
+<l:l i="70">Ä</l:l>
+<l:l i="70">Äž</l:l>
+<l:l i="70">ÄŸ</l:l>
+<l:l i="70">Ä </l:l>
+<l:l i="70">Ä¡</l:l>
+<l:l i="70">Ä¢</l:l>
+<l:l i="70">Ä£</l:l>
+<l:l i="70">Æ“</l:l>
+<l:l i="70">É </l:l>
+<l:l i="70">Ǥ</l:l>
+<l:l i="70">Ç¥</l:l>
+<l:l i="70">Ǧ</l:l>
+<l:l i="70">ǧ</l:l>
+<l:l i="70">Ç´</l:l>
+<l:l i="70">ǵ</l:l>
+<l:l i="70">Ḡ</l:l>
+<l:l i="70">ḡ</l:l>
+<l:l i="80">H</l:l>
+<l:l i="80">h</l:l>
+<l:l i="80">Ĥ</l:l>
+<l:l i="80">Ä¥</l:l>
+<l:l i="80">Ħ</l:l>
+<l:l i="80">ħ</l:l>
+<l:l i="80">Èž</l:l>
+<l:l i="80">ÈŸ</l:l>
+<l:l i="80">ɦ</l:l>
+<l:l i="80">Ḣ</l:l>
+<l:l i="80">ḣ</l:l>
+<l:l i="80">Ḥ</l:l>
+<l:l i="80">ḥ</l:l>
+<l:l i="80">Ḧ</l:l>
+<l:l i="80">ḧ</l:l>
+<l:l i="80">Ḩ</l:l>
+<l:l i="80">ḩ</l:l>
+<l:l i="80">Ḫ</l:l>
+<l:l i="80">ḫ</l:l>
+<l:l i="80">ẖ</l:l>
+<l:l i="90">I</l:l>
+<l:l i="90">i</l:l>
+<l:l i="90">Ì</l:l>
+<l:l i="90">ì</l:l>
+<l:l i="90">Ã</l:l>
+<l:l i="90">í</l:l>
+<l:l i="90">ÃŽ</l:l>
+<l:l i="90">î</l:l>
+<l:l i="90">Ã</l:l>
+<l:l i="90">ï</l:l>
+<l:l i="90">Ĩ</l:l>
+<l:l i="90">Ä©</l:l>
+<l:l i="90">Ī</l:l>
+<l:l i="90">Ä«</l:l>
+<l:l i="90">Ĭ</l:l>
+<l:l i="90">Ä­</l:l>
+<l:l i="90">Ä®</l:l>
+<l:l i="90">į</l:l>
+<l:l i="90">Ä°</l:l>
+<l:l i="90">Æ—</l:l>
+<l:l i="90">ɨ</l:l>
+<l:l i="90">Ç</l:l>
+<l:l i="90">Ç</l:l>
+<l:l i="90">Ȉ</l:l>
+<l:l i="90">ȉ</l:l>
+<l:l i="90">ÈŠ</l:l>
+<l:l i="90">È‹</l:l>
+<l:l i="90">Ḭ</l:l>
+<l:l i="90">ḭ</l:l>
+<l:l i="90">Ḯ</l:l>
+<l:l i="90">ḯ</l:l>
+<l:l i="90">Ỉ</l:l>
+<l:l i="90">ỉ</l:l>
+<l:l i="90">Ị</l:l>
+<l:l i="90">ị</l:l>
+<l:l i="100">J</l:l>
+<l:l i="100">j</l:l>
+<l:l i="100">Ä´</l:l>
+<l:l i="100">ĵ</l:l>
+<l:l i="100">Ç°</l:l>
+<l:l i="100">Ê</l:l>
+<l:l i="110">K</l:l>
+<l:l i="110">k</l:l>
+<l:l i="110">Ķ</l:l>
+<l:l i="110">Ä·</l:l>
+<l:l i="110">Ƙ</l:l>
+<l:l i="110">Æ™</l:l>
+<l:l i="110">Ǩ</l:l>
+<l:l i="110">Ç©</l:l>
+<l:l i="110">Ḱ</l:l>
+<l:l i="110">ḱ</l:l>
+<l:l i="110">Ḳ</l:l>
+<l:l i="110">ḳ</l:l>
+<l:l i="110">Ḵ</l:l>
+<l:l i="110">ḵ</l:l>
+<l:l i="120">L</l:l>
+<l:l i="120">l</l:l>
+<l:l i="120">Ĺ</l:l>
+<l:l i="120">ĺ</l:l>
+<l:l i="120">Ä»</l:l>
+<l:l i="120">ļ</l:l>
+<l:l i="120">Ľ</l:l>
+<l:l i="120">ľ</l:l>
+<l:l i="120">Ä¿</l:l>
+<l:l i="120">Å€</l:l>
+<l:l i="120">Å</l:l>
+<l:l i="120">Å‚</l:l>
+<l:l i="120">Æš</l:l>
+<l:l i="120">Lj</l:l>
+<l:l i="120">È´</l:l>
+<l:l i="120">É«</l:l>
+<l:l i="120">ɬ</l:l>
+<l:l i="120">É­</l:l>
+<l:l i="120">Ḷ</l:l>
+<l:l i="120">ḷ</l:l>
+<l:l i="120">Ḹ</l:l>
+<l:l i="120">ḹ</l:l>
+<l:l i="120">Ḻ</l:l>
+<l:l i="120">ḻ</l:l>
+<l:l i="120">Ḽ</l:l>
+<l:l i="120">ḽ</l:l>
+<l:l i="130">M</l:l>
+<l:l i="130">m</l:l>
+<l:l i="130">ɱ</l:l>
+<l:l i="130">Ḿ</l:l>
+<l:l i="130">ḿ</l:l>
+<l:l i="130">á¹€</l:l>
+<l:l i="130">á¹</l:l>
+<l:l i="130">Ṃ</l:l>
+<l:l i="130">ṃ</l:l>
+<l:l i="140">N</l:l>
+<l:l i="140">n</l:l>
+<l:l i="140">Ñ</l:l>
+<l:l i="140">ñ</l:l>
+<l:l i="140">Ń</l:l>
+<l:l i="140">Å„</l:l>
+<l:l i="140">Å…</l:l>
+<l:l i="140">ņ</l:l>
+<l:l i="140">Ň</l:l>
+<l:l i="140">ň</l:l>
+<l:l i="140">Æ</l:l>
+<l:l i="140">ɲ</l:l>
+<l:l i="140">Æž</l:l>
+<l:l i="140">È </l:l>
+<l:l i="140">Ç‹</l:l>
+<l:l i="140">Ǹ</l:l>
+<l:l i="140">ǹ</l:l>
+<l:l i="140">ȵ</l:l>
+<l:l i="140">ɳ</l:l>
+<l:l i="140">Ṅ</l:l>
+<l:l i="140">á¹…</l:l>
+<l:l i="140">Ṇ</l:l>
+<l:l i="140">ṇ</l:l>
+<l:l i="140">Ṉ</l:l>
+<l:l i="140">ṉ</l:l>
+<l:l i="140">Ṋ</l:l>
+<l:l i="140">ṋ</l:l>
+<l:l i="150">O</l:l>
+<l:l i="150">o</l:l>
+<l:l i="150">Ã’</l:l>
+<l:l i="150">ò</l:l>
+<l:l i="150">Ó</l:l>
+<l:l i="150">ó</l:l>
+<l:l i="150">Ô</l:l>
+<l:l i="150">ô</l:l>
+<l:l i="150">Õ</l:l>
+<l:l i="150">õ</l:l>
+<l:l i="150">Ö</l:l>
+<l:l i="150">ö</l:l>
+<l:l i="150">Ø</l:l>
+<l:l i="150">ø</l:l>
+<l:l i="150">Ō</l:l>
+<l:l i="150">Å</l:l>
+<l:l i="150">ÅŽ</l:l>
+<l:l i="150">Å</l:l>
+<l:l i="150">Å</l:l>
+<l:l i="150">Å‘</l:l>
+<l:l i="150">ÆŸ</l:l>
+<l:l i="150">Æ </l:l>
+<l:l i="150">Æ¡</l:l>
+<l:l i="150">Ç‘</l:l>
+<l:l i="150">Ç’</l:l>
+<l:l i="150">Ǫ</l:l>
+<l:l i="150">Ç«</l:l>
+<l:l i="150">Ǭ</l:l>
+<l:l i="150">Ç­</l:l>
+<l:l i="150">Ǿ</l:l>
+<l:l i="150">Ç¿</l:l>
+<l:l i="150">Ȍ</l:l>
+<l:l i="150">È</l:l>
+<l:l i="150">ÈŽ</l:l>
+<l:l i="150">È</l:l>
+<l:l i="150">Ȫ</l:l>
+<l:l i="150">È«</l:l>
+<l:l i="150">Ȭ</l:l>
+<l:l i="150">È­</l:l>
+<l:l i="150">È®</l:l>
+<l:l i="150">ȯ</l:l>
+<l:l i="150">È°</l:l>
+<l:l i="150">ȱ</l:l>
+<l:l i="150">Ṍ</l:l>
+<l:l i="150">á¹</l:l>
+<l:l i="150">Ṏ</l:l>
+<l:l i="150">á¹</l:l>
+<l:l i="150">á¹</l:l>
+<l:l i="150">ṑ</l:l>
+<l:l i="150">á¹’</l:l>
+<l:l i="150">ṓ</l:l>
+<l:l i="150">Ọ</l:l>
+<l:l i="150">á»</l:l>
+<l:l i="150">Ỏ</l:l>
+<l:l i="150">á»</l:l>
+<l:l i="150">á»</l:l>
+<l:l i="150">ố</l:l>
+<l:l i="150">á»’</l:l>
+<l:l i="150">ồ</l:l>
+<l:l i="150">á»”</l:l>
+<l:l i="150">ổ</l:l>
+<l:l i="150">á»–</l:l>
+<l:l i="150">á»—</l:l>
+<l:l i="150">Ộ</l:l>
+<l:l i="150">á»™</l:l>
+<l:l i="150">Ớ</l:l>
+<l:l i="150">á»›</l:l>
+<l:l i="150">Ờ</l:l>
+<l:l i="150">á»</l:l>
+<l:l i="150">Ở</l:l>
+<l:l i="150">ở</l:l>
+<l:l i="150">á» </l:l>
+<l:l i="150">ỡ</l:l>
+<l:l i="150">Ợ</l:l>
+<l:l i="150">ợ</l:l>
+<l:l i="160">P</l:l>
+<l:l i="160">p</l:l>
+<l:l i="160">Ƥ</l:l>
+<l:l i="160">Æ¥</l:l>
+<l:l i="160">á¹”</l:l>
+<l:l i="160">ṕ</l:l>
+<l:l i="160">á¹–</l:l>
+<l:l i="160">á¹—</l:l>
+<l:l i="170">Q</l:l>
+<l:l i="170">q</l:l>
+<l:l i="170">Ê </l:l>
+<l:l i="180">R</l:l>
+<l:l i="180">r</l:l>
+<l:l i="180">Å”</l:l>
+<l:l i="180">Å•</l:l>
+<l:l i="180">Å–</l:l>
+<l:l i="180">Å—</l:l>
+<l:l i="180">Ř</l:l>
+<l:l i="180">Å™</l:l>
+<l:l i="180">È</l:l>
+<l:l i="180">È‘</l:l>
+<l:l i="180">È’</l:l>
+<l:l i="180">È“</l:l>
+<l:l i="180">ɼ</l:l>
+<l:l i="180">ɽ</l:l>
+<l:l i="180">ɾ</l:l>
+<l:l i="180">Ṙ</l:l>
+<l:l i="180">á¹™</l:l>
+<l:l i="180">Ṛ</l:l>
+<l:l i="180">á¹›</l:l>
+<l:l i="180">Ṝ</l:l>
+<l:l i="180">á¹</l:l>
+<l:l i="180">Ṟ</l:l>
+<l:l i="180">ṟ</l:l>
+<l:l i="190">S</l:l>
+<l:l i="190">s</l:l>
+<l:l i="190">Åš</l:l>
+<l:l i="190">Å›</l:l>
+<l:l i="190">Ŝ</l:l>
+<l:l i="190">Å</l:l>
+<l:l i="190">Åž</l:l>
+<l:l i="190">ÅŸ</l:l>
+<l:l i="190">Å </l:l>
+<l:l i="190">Å¡</l:l>
+<l:l i="190">Ș</l:l>
+<l:l i="190">È™</l:l>
+<l:l i="190">Ê‚</l:l>
+<l:l i="190">á¹ </l:l>
+<l:l i="190">ṡ</l:l>
+<l:l i="190">á¹¢</l:l>
+<l:l i="190">á¹£</l:l>
+<l:l i="190">Ṥ</l:l>
+<l:l i="190">á¹¥</l:l>
+<l:l i="190">Ṧ</l:l>
+<l:l i="190">ṧ</l:l>
+<l:l i="190">Ṩ</l:l>
+<l:l i="190">ṩ</l:l>
+<l:l i="200">T</l:l>
+<l:l i="200">t</l:l>
+<l:l i="200">Å¢</l:l>
+<l:l i="200">Å£</l:l>
+<l:l i="200">Ť</l:l>
+<l:l i="200">Å¥</l:l>
+<l:l i="200">Ŧ</l:l>
+<l:l i="200">ŧ</l:l>
+<l:l i="200">Æ«</l:l>
+<l:l i="200">Ƭ</l:l>
+<l:l i="200">Æ­</l:l>
+<l:l i="200">Æ®</l:l>
+<l:l i="200">ʈ</l:l>
+<l:l i="200">Èš</l:l>
+<l:l i="200">È›</l:l>
+<l:l i="200">ȶ</l:l>
+<l:l i="200">Ṫ</l:l>
+<l:l i="200">ṫ</l:l>
+<l:l i="200">Ṭ</l:l>
+<l:l i="200">á¹­</l:l>
+<l:l i="200">á¹®</l:l>
+<l:l i="200">ṯ</l:l>
+<l:l i="200">á¹°</l:l>
+<l:l i="200">á¹±</l:l>
+<l:l i="200">ẗ</l:l>
+<l:l i="210">U</l:l>
+<l:l i="210">u</l:l>
+<l:l i="210">Ù</l:l>
+<l:l i="210">ù</l:l>
+<l:l i="210">Ú</l:l>
+<l:l i="210">ú</l:l>
+<l:l i="210">Û</l:l>
+<l:l i="210">û</l:l>
+<l:l i="210">Ü</l:l>
+<l:l i="210">ü</l:l>
+<l:l i="210">Ũ</l:l>
+<l:l i="210">Å©</l:l>
+<l:l i="210">Ū</l:l>
+<l:l i="210">Å«</l:l>
+<l:l i="210">Ŭ</l:l>
+<l:l i="210">Å­</l:l>
+<l:l i="210">Å®</l:l>
+<l:l i="210">ů</l:l>
+<l:l i="210">Å°</l:l>
+<l:l i="210">ű</l:l>
+<l:l i="210">Ų</l:l>
+<l:l i="210">ų</l:l>
+<l:l i="210">Ư</l:l>
+<l:l i="210">Æ°</l:l>
+<l:l i="210">Ç“</l:l>
+<l:l i="210">Ç”</l:l>
+<l:l i="210">Ç•</l:l>
+<l:l i="210">Ç–</l:l>
+<l:l i="210">Ç—</l:l>
+<l:l i="210">ǘ</l:l>
+<l:l i="210">Ç™</l:l>
+<l:l i="210">Çš</l:l>
+<l:l i="210">Ç›</l:l>
+<l:l i="210">ǜ</l:l>
+<l:l i="210">È”</l:l>
+<l:l i="210">È•</l:l>
+<l:l i="210">È–</l:l>
+<l:l i="210">È—</l:l>
+<l:l i="210">á¹²</l:l>
+<l:l i="210">á¹³</l:l>
+<l:l i="210">á¹´</l:l>
+<l:l i="210">á¹µ</l:l>
+<l:l i="210">Ṷ</l:l>
+<l:l i="210">á¹·</l:l>
+<l:l i="210">Ṹ</l:l>
+<l:l i="210">á¹¹</l:l>
+<l:l i="210">Ṻ</l:l>
+<l:l i="210">á¹»</l:l>
+<l:l i="210">Ụ</l:l>
+<l:l i="210">ụ</l:l>
+<l:l i="210">Ủ</l:l>
+<l:l i="210">ủ</l:l>
+<l:l i="210">Ứ</l:l>
+<l:l i="210">ứ</l:l>
+<l:l i="210">Ừ</l:l>
+<l:l i="210">ừ</l:l>
+<l:l i="210">Ử</l:l>
+<l:l i="210">á»­</l:l>
+<l:l i="210">á»®</l:l>
+<l:l i="210">ữ</l:l>
+<l:l i="210">á»°</l:l>
+<l:l i="210">á»±</l:l>
+<l:l i="220">V</l:l>
+<l:l i="220">v</l:l>
+<l:l i="220">Ʋ</l:l>
+<l:l i="220">Ê‹</l:l>
+<l:l i="220">á¹¼</l:l>
+<l:l i="220">á¹½</l:l>
+<l:l i="220">á¹¾</l:l>
+<l:l i="220">ṿ</l:l>
+<l:l i="230">W</l:l>
+<l:l i="230">w</l:l>
+<l:l i="230">Å´</l:l>
+<l:l i="230">ŵ</l:l>
+<l:l i="230">Ẁ</l:l>
+<l:l i="230">áº</l:l>
+<l:l i="230">Ẃ</l:l>
+<l:l i="230">ẃ</l:l>
+<l:l i="230">Ẅ</l:l>
+<l:l i="230">ẅ</l:l>
+<l:l i="230">Ẇ</l:l>
+<l:l i="230">ẇ</l:l>
+<l:l i="230">Ẉ</l:l>
+<l:l i="230">ẉ</l:l>
+<l:l i="230">ẘ</l:l>
+<l:l i="240">X</l:l>
+<l:l i="240">x</l:l>
+<l:l i="240">Ẋ</l:l>
+<l:l i="240">ẋ</l:l>
+<l:l i="240">Ẍ</l:l>
+<l:l i="240">áº</l:l>
+<l:l i="250">Y</l:l>
+<l:l i="250">y</l:l>
+<l:l i="250">Ã</l:l>
+<l:l i="250">ý</l:l>
+<l:l i="250">ÿ</l:l>
+<l:l i="250">Ÿ</l:l>
+<l:l i="250">Ŷ</l:l>
+<l:l i="250">Å·</l:l>
+<l:l i="250">Ƴ</l:l>
+<l:l i="250">Æ´</l:l>
+<l:l i="250">Ȳ</l:l>
+<l:l i="250">ȳ</l:l>
+<l:l i="250">Ẏ</l:l>
+<l:l i="250">áº</l:l>
+<l:l i="250">ẙ</l:l>
+<l:l i="250">Ỳ</l:l>
+<l:l i="250">ỳ</l:l>
+<l:l i="250">á»´</l:l>
+<l:l i="250">ỵ</l:l>
+<l:l i="250">Ỷ</l:l>
+<l:l i="250">á»·</l:l>
+<l:l i="250">Ỹ</l:l>
+<l:l i="250">ỹ</l:l>
+<l:l i="260">Z</l:l>
+<l:l i="260">z</l:l>
+<l:l i="260">Ź</l:l>
+<l:l i="260">ź</l:l>
+<l:l i="260">Å»</l:l>
+<l:l i="260">ż</l:l>
+<l:l i="260">Ž</l:l>
+<l:l i="260">ž</l:l>
+<l:l i="260">Ƶ</l:l>
+<l:l i="260">ƶ</l:l>
+<l:l i="260">Ȥ</l:l>
+<l:l i="260">È¥</l:l>
+<l:l i="260">Ê</l:l>
+<l:l i="260">Ê‘</l:l>
+<l:l i="260">áº</l:l>
+<l:l i="260">ẑ</l:l>
+<l:l i="260">Ẓ</l:l>
+<l:l i="260">ẓ</l:l>
+<l:l i="260">Ẕ</l:l>
+<l:l i="260">ẕ</l:l>
+</l:letters>
+</l:l10n>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/gu.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/gu.xml
new file mode 100644
index 0000000..ae7ae2e
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/gu.xml
@@ -0,0 +1,660 @@
+<?xml version="1.0" encoding="utf-8"?>
+<l:l10n xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0" language="gu" english-language-name="Gujarati">
+
+<!-- * This file is generated automatically. -->
+<!-- * To submit changes to this file upstream (to the DocBook Project) -->
+<!-- * do not submit an edited version of this file. Instead, submit an -->
+<!-- * edited version of the source file at the following location: -->
+<!-- * -->
+<!-- * https://docbook.svn.sourceforge.net/svnroot/docbook/trunk/gentext/locale/gu.xml -->
+<!-- * -->
+<!-- * E-mail the edited gu.xml source file to: -->
+<!-- * -->
+<!-- * docbook-developers@lists.sourceforge.net -->
+
+<!-- ******************************************************************** -->
+
+<!-- This file is part of the XSL DocBook Stylesheet distribution. -->
+<!-- See ../README or http://docbook.sf.net/release/xsl/current/ for -->
+<!-- copyright and other information. -->
+
+<!-- ******************************************************************** -->
+<!-- In these files, % with a letter is used for a placeholder: -->
+<!-- %t is the current element's title -->
+<!-- %s is the current element's subtitle (if applicable)-->
+<!-- %n is the current element's number label-->
+<!-- %p is the current element's page number (if applicable)-->
+<!-- ******************************************************************** -->
+
+
+<l:gentext key="Abstract" text="સાર"/>
+<l:gentext key="abstract" text="સાર"/>
+<l:gentext key="Acknowledgements" text="પà«àª°àª¤à«àª¯à«àª¤à«àª¤àª°"/>
+<l:gentext key="acknowledgements" text="પà«àª°àª¤à«àª¯à«àª¤à«àª¤àª°"/>
+<l:gentext key="Answer" text="જ:"/>
+<l:gentext key="answer" text="જ:"/>
+<l:gentext key="Appendix" text="પરિશિષà«àªŸ"/>
+<l:gentext key="appendix" text="પરિશિષà«àªŸ"/>
+<l:gentext key="Article" text="લેખ"/>
+<l:gentext key="article" text="લેખ"/>
+<l:gentext key="Author" text="લેખક"/>
+<l:gentext key="Bibliography" text="સંદરà«àª­àª—à«àª°àª‚થ"/>
+<l:gentext key="bibliography" text="સંદરà«àª­àª—à«àª°àª‚થ"/>
+<l:gentext key="Book" text="પà«àª¸à«àª¤àª•"/>
+<l:gentext key="book" text="પà«àª¸à«àª¤àª•"/>
+<l:gentext key="CAUTION" text="સાવધાન"/>
+<l:gentext key="Caution" text="સાવધાન"/>
+<l:gentext key="caution" text="સાવધાન"/>
+<l:gentext key="Chapter" text="પà«àª°àª•àª°àª£"/>
+<l:gentext key="chapter" text="પà«àª°àª•àª°àª£"/>
+<l:gentext key="Colophon" text="ગà«àª°àª‚થપરિચય"/>
+<l:gentext key="colophon" text="ગà«àª°àª‚થપરિચય"/>
+<l:gentext key="Copyright" text="કૉપિરાઇટ"/>
+<l:gentext key="copyright" text="કૉપિરાઇટ"/>
+<l:gentext key="Dedication" text="સમરà«àªªàª£"/>
+<l:gentext key="dedication" text="સમરà«àªªàª£"/>
+<l:gentext key="Edition" text="પà«àª°àª•àª¾àª¶àª¨"/>
+<l:gentext key="edition" text="પà«àª°àª•àª¾àª¶àª¨"/>
+<l:gentext key="Editor" text="સંપાદક"/>
+<l:gentext key="Equation" text="સમીકરણ"/>
+<l:gentext key="equation" text="સમીકરણ"/>
+<l:gentext key="Example" text="ઉદાહરણ"/>
+<l:gentext key="example" text="ઉદાહરણ"/>
+<l:gentext key="Figure" text="આકૃતિ"/>
+<l:gentext key="figure" text="આકૃતિ"/>
+<l:gentext key="Glossary" text="શબà«àª¦àª¾àªµàª²à«€"/>
+<l:gentext key="glossary" text="શબà«àª¦àª¾àªµàª²à«€"/>
+<l:gentext key="GlossSee" text="જà«àª“"/>
+<l:gentext key="glosssee" text="જà«àª“"/>
+<l:gentext key="GlossSeeAlso" text="આપણજà«àª“"/>
+<l:gentext key="glossseealso" text="આપણજà«àª“"/>
+<l:gentext key="IMPORTANT" text="મહતà«àªµàª¨à«àª‚"/>
+<l:gentext key="important" text="મહતà«àªµàª¨à«àª‚"/>
+<l:gentext key="Important" text="મહતà«àªµàª¨à«àª‚"/>
+<l:gentext key="Index" text="અનà«àª•à«àª°àª®àª£àª¿àª•àª¾"/>
+<l:gentext key="index" text="અનà«àª•à«àª°àª®àª£àª¿àª•àª¾"/>
+<l:gentext key="ISBN" text="ISBN"/>
+<l:gentext key="isbn" text="ISBN"/>
+<l:gentext key="LegalNotice" text="માનà«àª¯àª¸à«‚ચન"/>
+<l:gentext key="legalnotice" text="માનà«àª¯àª¸à«‚ચન"/>
+<l:gentext key="MsgAud" text="શà«àª°à«‹àª¤àª¾"/>
+<l:gentext key="msgaud" text="શà«àª°à«‹àª¤àª¾"/>
+<l:gentext key="MsgLevel" text="સà«àª¤àª°"/>
+<l:gentext key="msglevel" text="સà«àª¤àª°"/>
+<l:gentext key="MsgOrig" text="મૂળ"/>
+<l:gentext key="msgorig" text="મૂળ"/>
+<l:gentext key="NOTE" text="નોંધ"/>
+<l:gentext key="Note" text="નોંધ"/>
+<l:gentext key="note" text="નોંધ"/>
+<l:gentext key="Part" text="ભાગ"/>
+<l:gentext key="part" text="ભાગ"/>
+<l:gentext key="Preface" text="પà«àª°àª¸à«àª¤àª¾àªµàª¨àª¾"/>
+<l:gentext key="preface" text="પà«àª°àª¸à«àª¤àª¾àªµàª¨àª¾"/>
+<l:gentext key="Procedure" text="પà«àª°àª•à«àª°àª¿àª¯àª¾"/>
+<l:gentext key="procedure" text="પà«àª°àª•à«àª°àª¿àª¯àª¾"/>
+<l:gentext key="ProductionSet" text="ઉતà«àªªàª¾àª¦àª¨"/>
+<l:gentext key="PubDate" text="પà«àª°àª•àª¾àª¶àª¨ તારીખ"/>
+<l:gentext key="pubdate" text="પà«àª°àª•àª¾àª¶àª¨ તારીખ"/>
+<l:gentext key="Published" text="પà«àª°àª•àª¾àª¶àª¿àª¤"/>
+<l:gentext key="published" text="પà«àª°àª•àª¾àª¶àª¿àª¤"/>
+<l:gentext key="Publisher" text="પà«àª°àª•àª¾àª¶àª•"/>
+<l:gentext key="Qandadiv" text="પà«àª°. અને જ."/>
+<l:gentext key="qandadiv" text="પà«àª°. અને જ."/>
+<l:gentext key="QandASet" text="વારંવાર પૂછવામાં આવતા પà«àª°àª¶à«àª°à«àª¨à«‹"/>
+<l:gentext key="Question" text="જ:"/>
+<l:gentext key="question" text="જ:"/>
+<l:gentext key="RefEntry" text="પાનà«àª‚"/>
+<l:gentext key="refentry" text="પાનà«àª‚"/>
+<l:gentext key="Reference" text="સંદરà«àª­"/>
+<l:gentext key="reference" text="સંદરà«àª­"/>
+<l:gentext key="References" text="સંદરà«àª­à«‹"/>
+<l:gentext key="RefName" text="નામ"/>
+<l:gentext key="refname" text="નામ"/>
+<l:gentext key="RefSection" text="વિભાગ"/>
+<l:gentext key="refsection" text="વિભાગ"/>
+<l:gentext key="RefSynopsisDiv" text="સારાંશ"/>
+<l:gentext key="refsynopsisdiv" text="સારાંશ"/>
+<l:gentext key="RevHistory" text="પà«àª¨àª°àª¾àªµàª°à«àª¤àª¨àªˆàª¤àª¿àª¹àª¾àª¸"/>
+<l:gentext key="revhistory" text="પà«àª¨àª°àª¾àªµàª°à«àª¤àª¨àªˆàª¤àª¿àª¹àª¾àª¸"/>
+<l:gentext key="revision" text="પà«àª¨àª°àª¾àªµàª°à«àª¤àª¨"/>
+<l:gentext key="Revision" text="પà«àª¨àª°àª¾àªµàª°à«àª¤àª¨"/>
+<l:gentext key="sect1" text="વિભાગ"/>
+<l:gentext key="sect2" text="વિભાગ"/>
+<l:gentext key="sect3" text="વિભાગ"/>
+<l:gentext key="sect4" text="વિભાગ"/>
+<l:gentext key="sect5" text="વિભાગ"/>
+<l:gentext key="section" text="વિભાગ"/>
+<l:gentext key="Section" text="વિભાગ"/>
+<l:gentext key="see" text="જà«àª“"/>
+<l:gentext key="See" text="જà«àª“"/>
+<l:gentext key="seealso" text="આપણજà«àª“"/>
+<l:gentext key="Seealso" text="આપણજà«àª“"/>
+<l:gentext key="SeeAlso" text="આપણજà«àª“"/>
+<l:gentext key="set" text="સà«àª¯à«‹àªœàª¿àª¤àª•àª°à«‹"/>
+<l:gentext key="Set" text="સà«àª¯à«‹àªœàª¿àª¤àª•àª°à«‹"/>
+<l:gentext key="setindex" text="અનà«àª•à«àª°àª®àª£àª¿àª•àª¾àª¸à«àª¯à«‹àªœàª¿àª¤àª•àª°à«‹"/>
+<l:gentext key="SetIndex" text="અનà«àª•à«àª°àª®àª£àª¿àª•àª¾àª¸à«àª¯à«‹àªœàª¿àª¤àª•àª°à«‹"/>
+<l:gentext key="Sidebar" text="બાજà«àªªàªŸà«àªŸà«€"/>
+<l:gentext key="sidebar" text="બાજà«àªªàªŸà«àªŸà«€"/>
+<l:gentext key="step" text="પગલà«àª‚"/>
+<l:gentext key="Step" text="પગલà«àª‚"/>
+<l:gentext key="table" text="કોષà«àªŸàª•"/>
+<l:gentext key="Table" text="કોષà«àªŸàª•"/>
+<l:gentext key="task" text="કારà«àª¯"/>
+<l:gentext key="Task" text="કારà«àª¯"/>
+<l:gentext key="tip" text="મદદ"/>
+<l:gentext key="TIP" text="મદદ"/>
+<l:gentext key="Tip" text="મદદ"/>
+<l:gentext key="Warning" text="ચેતવણી"/>
+<l:gentext key="warning" text="ચેતવણી"/>
+<l:gentext key="WARNING" text="ચેતવણી"/>
+<l:gentext key="and" text="અને"/>
+<l:gentext key="by" text="દà«àª¦àª¾àª°àª¾"/>
+<l:gentext key="Edited" text="ફેરફારથયેલછે"/>
+<l:gentext key="edited" text="ફેરફારથયેલછે"/>
+<l:gentext key="Editedby" text="દà«àªµàª¾àª°àª¾àª«à«‡àª°àª«àª¾àª°àª¥àª¯à«‡àª²àª›à«‡"/>
+<l:gentext key="editedby" text="દà«àªµàª¾àª°àª¾àª«à«‡àª°àª«àª¾àª°àª¥àª¯à«‡àª²àª›à«‡"/>
+<l:gentext key="in" text="અંદર"/>
+<l:gentext key="lastlistcomma" text=","/>
+<l:gentext key="listcomma" text=","/>
+<l:gentext key="notes" text="નોંધો"/>
+<l:gentext key="Notes" text="નોંધો"/>
+<l:gentext key="Pgs" text="પાનાંઓ."/>
+<l:gentext key="pgs" text="પાનાંઓ."/>
+<l:gentext key="Revisedby" text="દà«àªµàª¾àª°àª¾àªªà«àª¨àª°àª¾àªµàª°à«àª¤àª¨àª¥àª¯à«‡àª²: "/>
+<l:gentext key="revisedby" text="દà«àªµàª¾àª°àª¾àªªà«àª¨àª°àª¾àªµàª°à«àª¤àª¨àª¥àª¯à«‡àª²: "/>
+<l:gentext key="TableNotes" text="નોંધો"/>
+<l:gentext key="tablenotes" text="નોંધો"/>
+<l:gentext key="TableofContents" text="વિષયસà«àªšà«€àª•à«‹àª·à«àªŸàª•"/>
+<l:gentext key="tableofcontents" text="વિષયસà«àªšà«€àª•à«‹àª·à«àªŸàª•"/>
+<l:gentext key="unexpectedelementname" text="અનિચà«àª›àª¨àª¿àª¯àª¸àª­à«àª¯àª¨àª¾àª®"/>
+<l:gentext key="unsupported" text="બિનઆધારભૂત"/>
+<l:gentext key="xrefto" text=""/>
+<l:gentext key="Authors" text="લેખકો"/>
+<l:gentext key="copyeditor" text="કૉપી સંપાદન"/>
+<l:gentext key="graphicdesigner" text="ગà«àª°àª¾àª«àª¿àª• રચિયતા"/>
+<l:gentext key="productioneditor" text="ઉતà«àªªàª¾àª¦àª¨ સંપાદક"/>
+<l:gentext key="technicaleditor" text="તકનીકી સંપાદક"/>
+<l:gentext key="translator" text="અનà«àªµàª¾àª¦àª•"/>
+<l:gentext key="listofequations" text="સમીકરણોનીયાદી"/>
+<l:gentext key="ListofEquations" text="સમીકરણોનીયાદી"/>
+<l:gentext key="ListofExamples" text="ઉદાહરણોનીયાદી"/>
+<l:gentext key="listofexamples" text="ઉદાહરણોનીયાદી"/>
+<l:gentext key="ListofFigures" text="આકૃતિઓનીયાદી"/>
+<l:gentext key="listoffigures" text="આકૃતિઓનીયાદી"/>
+<l:gentext key="ListofProcedures" text="પà«àª°àª•à«àª°àª¿àª¯àª¾àª“નીયાદી"/>
+<l:gentext key="listofprocedures" text="પà«àª°àª•à«àª°àª¿àª¯àª¾àª“નીયાદી"/>
+<l:gentext key="listoftables" text="કોષà«àªŸàª•à«‹àª¨à«€àª¯àª¾àª¦à«€"/>
+<l:gentext key="ListofTables" text="કોષà«àªŸàª•à«‹àª¨à«€àª¯àª¾àª¦à«€"/>
+<l:gentext key="ListofUnknown" text="અજાણોનીયાદી"/>
+<l:gentext key="listofunknown" text="અજાણોનીયાદી"/>
+<l:gentext key="nav-home" text="ઘર"/>
+<l:gentext key="nav-next" text="આગળવધો"/>
+<l:gentext key="nav-next-sibling" text="àªàª¡àªªà«€àª†àª—ળધપાવો"/>
+<l:gentext key="nav-prev" text="પહેલાનà«àª‚"/>
+<l:gentext key="nav-prev-sibling" text="àªàª¡àªªà«€àªªàª¾àª›àª³àª§àªªàª¾àªµà«‹"/>
+<l:gentext key="nav-up" text="ઉપર"/>
+<l:gentext key="nav-toc" text="વિષયસà«àªšà«€àª•à«‹àª·à«àªŸàª•"/>
+<l:gentext key="Draft" text="ડà«àª°àª¾àª«à«àªŸ"/>
+<l:gentext key="above" text="ઉપર"/>
+<l:gentext key="below" text="નીચે"/>
+<l:gentext key="sectioncalled" text="બોલાવાયેલવિભાગ"/>
+<l:gentext key="index symbols" text="સંકેતો"/>
+<l:gentext key="writing-mode" text="lr-tb"/>
+<l:gentext key="lowercase.alpha" text="કખગઘચછજàªàªŸàª àª¡àª¢àª¨àª£àª¯àª°àª²àªµàª¸àª¶àª·àª¹"/>
+<l:gentext key="uppercase.alpha" text="કખગઘચછજàªàªŸàª àª¡àª¢àª¨àª£àª¯àª°àª²àªµàª¸àª¶àª·àª¹"/>
+<l:gentext key="normalize.sort.input" text="AaÀàÃáÂâÃãÄäÅåĀÄĂ㥹ÇǎǞǟǠǡǺǻȀÈȂȃȦȧḀá¸áºšáº áº¡áº¢áº£áº¤áº¥áº¦áº§áº¨áº©áºªáº«áº¬áº­áº®áº¯áº°áº±áº²áº³áº´áºµáº¶áº·BbÆ€ÆɓƂƃḂḃḄḅḆḇCcÇçĆćĈĉĊċČÄƇƈɕḈḉDdÄŽÄÄđƊɗƋƌDžDzȡɖḊḋḌá¸á¸Žá¸á¸á¸‘ḒḓEeÈèÉéÊêËëĒēĔĕĖėĘęĚěȄȅȆȇȨȩḔḕḖḗḘḙḚḛḜá¸áº¸áº¹áººáº»áº¼áº½áº¾áº¿á»€á»á»‚ểỄễỆệFfƑƒḞḟGgÄœÄĞğĠġĢģƓɠǤǥǦǧǴǵḠḡHhĤĥĦħȞȟɦḢḣḤḥḦḧḨḩḪḫẖIiÌìÃíÎîÃïĨĩĪīĬĭĮįİƗɨÇÇȈȉȊȋḬḭḮḯỈỉỊịJjĴĵǰÊKkĶķƘƙǨǩḰḱḲḳḴḵLlĹĺĻļĽľĿŀÅłƚLjȴɫɬɭḶḷḸḹḺḻḼḽMmɱḾḿṀá¹á¹‚ṃNnÑñŃńŅņŇňÆɲƞȠNjǸǹȵɳṄṅṆṇṈṉṊṋOoÒòÓóÔôÕõÖöØøŌÅÅŽÅÅőƟƠơǑǒǪǫǬǭǾǿȌÈÈŽÈȪȫȬȭȮȯȰȱṌá¹á¹Žá¹á¹á¹‘ṒṓỌá»á»Žá»á»á»‘ỒồỔổỖỗỘộỚớỜá»á»žá»Ÿá» á»¡á»¢á»£PpƤƥṔṕṖṗQqÊ RrŔŕŖŗŘřÈȑȒȓɼɽɾṘṙṚṛṜá¹á¹žá¹ŸSsŚśŜÅŞşŠšȘșʂṠṡṢṣṤṥṦṧṨṩTtŢţŤťŦŧƫƬƭƮʈȚțȶṪṫṬṭṮṯṰṱẗUuÙùÚúÛûÜüŨũŪūŬŭŮůŰűŲųƯưǓǔǕǖǗǘǙǚǛǜȔȕȖȗṲṳṴṵṶṷṸṹṺṻỤụỦủỨứỪừỬửỮữỰựVvƲʋṼṽṾṿWwŴŵẀáºáº‚ẃẄẅẆẇẈẉẘXxẊẋẌáºYyÃýÿŸŶŷƳƴȲȳẎáºáº™á»²á»³á»´á»µá»¶á»·á»¸á»¹ZzŹźŻżŽžƵƶȤȥÊÊ‘áºáº‘ẒẓẔẕẕ" lang="en"/>
+<l:gentext key="normalize.sort.output" text="AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBCCCCCCCCCCCCCCCCCDDDDDDDDDDDDDDDDDDDDDDDDEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEFFFFFFGGGGGGGGGGGGGGGGGGGGHHHHHHHHHHHHHHHHHHHHIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIJJJJJJKKKKKKKKKKKKKKLLLLLLLLLLLLLLLLLLLLLLLLLLMMMMMMMMMNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOPPPPPPPPQQQRRRRRRRRRRRRRRRRRRRRRRRSSSSSSSSSSSSSSSSSSSSSSSTTTTTTTTTTTTTTTTTTTTTTTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUVVVVVVVVWWWWWWWWWWWWWWWXXXXXXYYYYYYYYYYYYYYYYYYYYYYYZZZZZZZZZZZZZZZZZZZZZ" lang="en"/>
+<l:dingbat key="startquote" text="“"/>
+<l:dingbat key="endquote" text="â€"/>
+<l:dingbat key="nestedstartquote" text="‘"/>
+<l:dingbat key="nestedendquote" text="’"/>
+<l:dingbat key="singlestartquote" text="‘"/>
+<l:dingbat key="singleendquote" text="’"/>
+<l:dingbat key="bullet" text="•"/>
+<l:gentext key="hyphenation-character" text="-"/>
+<l:gentext key="hyphenation-push-character-count" text="2"/>
+<l:gentext key="hyphenation-remain-character-count" text="2"/>
+<l:context name="styles"><l:template name="person-name" text="first-last"/>
+</l:context>
+<l:context name="title"><l:template name="abstract" text="%t"/>
+<l:template name="acknowledgements" text="%t" lang="en"/>
+<l:template name="answer" text="%t"/>
+<l:template name="appendix" text="પરિશિષà«àªŸÂ %n. %t"/>
+<l:template name="article" text="%t"/>
+<l:template name="authorblurb" text="%t"/>
+<l:template name="bibliodiv" text="%t"/>
+<l:template name="biblioentry" text="%t"/>
+<l:template name="bibliography" text="%t"/>
+<l:template name="bibliolist" text="%t"/>
+<l:template name="bibliomixed" text="%t"/>
+<l:template name="bibliomset" text="%t"/>
+<l:template name="biblioset" text="%t"/>
+<l:template name="blockquote" text="%t"/>
+<l:template name="book" text="%t"/>
+<l:template name="calloutlist" text="%t"/>
+<l:template name="caution" text="%t"/>
+<l:template name="chapter" text="પà«àª°àª•àª°àª£Â %n. %t"/>
+<l:template name="colophon" text="%t"/>
+<l:template name="dedication" text="%t"/>
+<l:template name="equation" text="સમીકરણ %n. %t"/>
+<l:template name="example" text="ઉદાહરણ %n. %t"/>
+<l:template name="figure" text="આકૃતિ %n. %t"/>
+<l:template name="foil" text="%t"/>
+<l:template name="foilgroup" text="%t"/>
+<l:template name="formalpara" text="%t"/>
+<l:template name="glossary" text="%t"/>
+<l:template name="glossdiv" text="%t"/>
+<l:template name="glosslist" text="%t"/>
+<l:template name="glossentry" text="%t"/>
+<l:template name="important" text="%t"/>
+<l:template name="index" text="%t"/>
+<l:template name="indexdiv" text="%t"/>
+<l:template name="itemizedlist" text="%t"/>
+<l:template name="legalnotice" text="%t"/>
+<l:template name="listitem" text=""/>
+<l:template name="lot" text="%t"/>
+<l:template name="msg" text="%t"/>
+<l:template name="msgexplan" text="%t"/>
+<l:template name="msgmain" text="%t"/>
+<l:template name="msgrel" text="%t"/>
+<l:template name="msgset" text="%t"/>
+<l:template name="msgsub" text="%t"/>
+<l:template name="note" text="%t"/>
+<l:template name="orderedlist" text="%t"/>
+<l:template name="part" text="ભાગ %n. %t"/>
+<l:template name="partintro" text="%t"/>
+<l:template name="preface" text="%t"/>
+<l:template name="procedure" text="%t"/>
+<l:template name="procedure.formal" text="પà«àª°àª•à«àª°àª¿àª¯àª¾Â %n. %t"/>
+<l:template name="productionset" text="%t"/>
+<l:template name="productionset.formal" text="ઉતà«àªªàª¾àª¦àª¨Â %n"/>
+<l:template name="qandadiv" text="%t"/>
+<l:template name="qandaentry" text="%t"/>
+<l:template name="qandaset" text="%t"/>
+<l:template name="question" text="%t"/>
+<l:template name="refentry" text="%t"/>
+<l:template name="reference" text="%t"/>
+<l:template name="refsection" text="%t"/>
+<l:template name="refsect1" text="%t"/>
+<l:template name="refsect2" text="%t"/>
+<l:template name="refsect3" text="%t"/>
+<l:template name="refsynopsisdiv" text="%t"/>
+<l:template name="refsynopsisdivinfo" text="%t"/>
+<l:template name="segmentedlist" text="%t"/>
+<l:template name="set" text="%t"/>
+<l:template name="setindex" text="%t"/>
+<l:template name="sidebar" text="%t"/>
+<l:template name="step" text="%t"/>
+<l:template name="table" text="કોષà«àªŸàª•Â %n. %t"/>
+<l:template name="task" text="%t"/>
+<l:template name="tasksummary" text="%t" lang="en"/>
+<l:template name="taskprerequisites" text="%t" lang="en"/>
+<l:template name="taskrelated" text="%t" lang="en"/>
+<l:template name="tip" text="%t"/>
+<l:template name="toc" text="%t"/>
+<l:template name="variablelist" text="%t"/>
+<l:template name="varlistentry" text=""/>
+<l:template name="warning" text="%t"/>
+</l:context>
+<l:context name="title-unnumbered"><l:template name="appendix" text="%t"/>
+<l:template name="article/appendix" text="%t"/>
+<l:template name="bridgehead" text="%t"/>
+<l:template name="chapter" text="%t"/>
+<l:template name="sect1" text="%t"/>
+<l:template name="sect2" text="%t"/>
+<l:template name="sect3" text="%t"/>
+<l:template name="sect4" text="%t"/>
+<l:template name="sect5" text="%t"/>
+<l:template name="section" text="%t"/>
+<l:template name="simplesect" text="%t"/>
+<l:template name="part" text="%t" lang="en"/>
+</l:context>
+<l:context name="title-numbered"><l:template name="appendix" text="પરિશિષà«àªŸÂ %n. %t"/>
+<l:template name="article/appendix" text="%n. %t"/>
+<l:template name="bridgehead" text="%n. %t"/>
+<l:template name="chapter" text="પà«àª°àª•àª°àª£Â %n. %t"/>
+<l:template name="part" text="ભાગ %n. %t"/>
+<l:template name="sect1" text="%n. %t"/>
+<l:template name="sect2" text="%n. %t"/>
+<l:template name="sect3" text="%n. %t"/>
+<l:template name="sect4" text="%n. %t"/>
+<l:template name="sect5" text="%n. %t"/>
+<l:template name="section" text="%n. %t"/>
+<l:template name="simplesect" text="%t"/>
+</l:context>
+<l:context name="subtitle"><l:template name="appendix" text="%s"/>
+<l:template name="acknowledgements" text="%s" lang="en"/>
+<l:template name="article" text="%s"/>
+<l:template name="bibliodiv" text="%s"/>
+<l:template name="biblioentry" text="%s"/>
+<l:template name="bibliography" text="%s"/>
+<l:template name="bibliomixed" text="%s"/>
+<l:template name="bibliomset" text="%s"/>
+<l:template name="biblioset" text="%s"/>
+<l:template name="book" text="%s"/>
+<l:template name="chapter" text="%s"/>
+<l:template name="colophon" text="%s"/>
+<l:template name="dedication" text="%s"/>
+<l:template name="glossary" text="%s"/>
+<l:template name="glossdiv" text="%s"/>
+<l:template name="index" text="%s"/>
+<l:template name="indexdiv" text="%s"/>
+<l:template name="lot" text="%s"/>
+<l:template name="part" text="%s"/>
+<l:template name="partintro" text="%s"/>
+<l:template name="preface" text="%s"/>
+<l:template name="refentry" text="%s"/>
+<l:template name="reference" text="%s"/>
+<l:template name="refsection" text="%s"/>
+<l:template name="refsect1" text="%s"/>
+<l:template name="refsect2" text="%s"/>
+<l:template name="refsect3" text="%s"/>
+<l:template name="refsynopsisdiv" text="%s"/>
+<l:template name="sect1" text="%s"/>
+<l:template name="sect2" text="%s"/>
+<l:template name="sect3" text="%s"/>
+<l:template name="sect4" text="%s"/>
+<l:template name="sect5" text="%s"/>
+<l:template name="section" text="%s"/>
+<l:template name="set" text="%s"/>
+<l:template name="setindex" text="%s"/>
+<l:template name="sidebar" text="%s"/>
+<l:template name="simplesect" text="%s"/>
+<l:template name="toc" text="%s"/>
+</l:context>
+<l:context name="xref"><l:template name="abstract" text="%t"/>
+<l:template name="acknowledgements" text="%t" lang="en"/>
+<l:template name="answer" text="જ: %n"/>
+<l:template name="appendix" text="%t"/>
+<l:template name="article" text="%t"/>
+<l:template name="authorblurb" text="%t"/>
+<l:template name="bibliodiv" text="%t"/>
+<l:template name="bibliography" text="%t"/>
+<l:template name="bibliomset" text="%t"/>
+<l:template name="biblioset" text="%t"/>
+<l:template name="blockquote" text="%t"/>
+<l:template name="book" text="%t"/>
+<l:template name="calloutlist" text="%t"/>
+<l:template name="caution" text="%t"/>
+<l:template name="chapter" text="%t"/>
+<l:template name="colophon" text="%t"/>
+<l:template name="constraintdef" text="%t"/>
+<l:template name="dedication" text="%t"/>
+<l:template name="equation" text="%t"/>
+<l:template name="example" text="%t"/>
+<l:template name="figure" text="%t"/>
+<l:template name="foil" text="%t"/>
+<l:template name="foilgroup" text="%t"/>
+<l:template name="formalpara" text="%t"/>
+<l:template name="glossary" text="%t"/>
+<l:template name="glossdiv" text="%t"/>
+<l:template name="important" text="%t"/>
+<l:template name="index" text="%t"/>
+<l:template name="indexdiv" text="%t"/>
+<l:template name="itemizedlist" text="%t"/>
+<l:template name="legalnotice" text="%t"/>
+<l:template name="listitem" text="%n"/>
+<l:template name="lot" text="%t"/>
+<l:template name="msg" text="%t"/>
+<l:template name="msgexplan" text="%t"/>
+<l:template name="msgmain" text="%t"/>
+<l:template name="msgrel" text="%t"/>
+<l:template name="msgset" text="%t"/>
+<l:template name="msgsub" text="%t"/>
+<l:template name="note" text="%t"/>
+<l:template name="orderedlist" text="%t"/>
+<l:template name="part" text="%t"/>
+<l:template name="partintro" text="%t"/>
+<l:template name="preface" text="%t"/>
+<l:template name="procedure" text="%t"/>
+<l:template name="productionset" text="%t"/>
+<l:template name="qandadiv" text="%t"/>
+<l:template name="qandaentry" text="જ: %n"/>
+<l:template name="qandaset" text="%t"/>
+<l:template name="question" text="જ: %n"/>
+<l:template name="reference" text="%t"/>
+<l:template name="refsynopsisdiv" text="%t"/>
+<l:template name="segmentedlist" text="%t"/>
+<l:template name="set" text="%t"/>
+<l:template name="setindex" text="%t"/>
+<l:template name="sidebar" text="%t"/>
+<l:template name="table" text="%t"/>
+<l:template name="task" text="%t" lang="en"/>
+<l:template name="tip" text="%t"/>
+<l:template name="toc" text="%t"/>
+<l:template name="variablelist" text="%t"/>
+<l:template name="varlistentry" text="%n"/>
+<l:template name="warning" text="%t"/>
+<l:template name="olink.document.citation" text=" in %o"/>
+<l:template name="olink.page.citation" text=" (page %p)"/>
+<l:template name="page.citation" text=" [%p]"/>
+<l:template name="page" text="(page %p)"/>
+<l:template name="docname" text=" in %o"/>
+<l:template name="docnamelong" text=" in the document titled %o"/>
+<l:template name="pageabbrev" text="(p. %p)"/>
+<l:template name="Page" text="Page %p"/>
+<l:template name="bridgehead" text="બોલાવાયેલવિભાગ “%tâ€"/>
+<l:template name="refsection" text="બોલાવાયેલવિભાગ “%tâ€"/>
+<l:template name="refsect1" text="બોલાવાયેલવિભાગ “%tâ€"/>
+<l:template name="refsect2" text="બોલાવાયેલવિભાગ “%tâ€"/>
+<l:template name="refsect3" text="બોલાવાયેલવિભાગ “%tâ€"/>
+<l:template name="sect1" text="બોલાવાયેલવિભાગ “%tâ€"/>
+<l:template name="sect2" text="બોલાવાયેલવિભાગ “%tâ€"/>
+<l:template name="sect3" text="બોલાવાયેલવિભાગ “%tâ€"/>
+<l:template name="sect4" text="બોલાવાયેલવિભાગ “%tâ€"/>
+<l:template name="sect5" text="બોલાવાયેલવિભાગ “%tâ€"/>
+<l:template name="section" text="બોલાવાયેલવિભાગ “%tâ€"/>
+<l:template name="simplesect" text="બોલાવાયેલવિભાગ “%tâ€"/>
+</l:context>
+<l:context name="xref-number"><l:template name="answer" text="જ: %n"/>
+<l:template name="appendix" text="પરિશિષà«àªŸÂ %n"/>
+<l:template name="bridgehead" text="વિભાગ %n"/>
+<l:template name="chapter" text="પà«àª°àª•àª°àª£Â %n"/>
+<l:template name="equation" text="સમીકરણ %n"/>
+<l:template name="example" text="ઉદાહરણ %n"/>
+<l:template name="figure" text="આકૃતિ %n"/>
+<l:template name="part" text="ભાગ %n"/>
+<l:template name="procedure" text="પà«àª°àª•à«àª°àª¿àª¯àª¾Â %n"/>
+<l:template name="productionset" text="ઉતà«àªªàª¾àª¦àª¨Â %n"/>
+<l:template name="qandadiv" text="પà«àª°. અને જ. %n"/>
+<l:template name="qandaentry" text="જ: %n"/>
+<l:template name="question" text="જ: %n"/>
+<l:template name="sect1" text="વિભાગ %n"/>
+<l:template name="sect2" text="વિભાગ %n"/>
+<l:template name="sect3" text="વિભાગ %n"/>
+<l:template name="sect4" text="વિભાગ %n"/>
+<l:template name="sect5" text="વિભાગ %n"/>
+<l:template name="section" text="વિભાગ %n"/>
+<l:template name="table" text="કોષà«àªŸàª•Â %n"/>
+</l:context>
+<l:context name="xref-number-and-title"><l:template name="appendix" text="પરિશિષà«àªŸÂ %n, %t"/>
+<l:template name="bridgehead" text="વિભાગ %n, “%tâ€"/>
+<l:template name="chapter" text="પà«àª°àª•àª°àª£Â %n, %t"/>
+<l:template name="equation" text="સમીકરણ %n, “%tâ€"/>
+<l:template name="example" text="ઉદાહરણ %n, “%tâ€"/>
+<l:template name="figure" text="આકૃતિ %n, “%tâ€"/>
+<l:template name="part" text="ભાગ %n, “%tâ€"/>
+<l:template name="procedure" text="પà«àª°àª•à«àª°àª¿àª¯àª¾Â %n, “%tâ€"/>
+<l:template name="productionset" text="ઉતà«àªªàª¾àª¦àª¨Â %n, “%tâ€"/>
+<l:template name="qandadiv" text="પà«àª°. અને જ. %n, “%tâ€"/>
+<l:template name="refsect1" text="બોલાવાયેલવિભાગ “%tâ€"/>
+<l:template name="refsect2" text="બોલાવાયેલવિભાગ “%tâ€"/>
+<l:template name="refsect3" text="બોલાવાયેલવિભાગ “%tâ€"/>
+<l:template name="refsection" text="બોલાવાયેલવિભાગ “%tâ€"/>
+<l:template name="sect1" text="વિભાગ %n, “%tâ€"/>
+<l:template name="sect2" text="વિભાગ %n, “%tâ€"/>
+<l:template name="sect3" text="વિભાગ %n, “%tâ€"/>
+<l:template name="sect4" text="વિભાગ %n, “%tâ€"/>
+<l:template name="sect5" text="વિભાગ %n, “%tâ€"/>
+<l:template name="section" text="વિભાગ %n, “%tâ€"/>
+<l:template name="simplesect" text="બોલાવાયેલવિભાગ “%tâ€"/>
+<l:template name="table" text="કોષà«àªŸàª•Â %n, “%tâ€"/>
+</l:context>
+<l:context name="authorgroup"><l:template name="sep" text=", "/>
+<l:template name="sep2" text=" અને "/>
+<l:template name="seplast" text=", અને "/>
+</l:context>
+<l:context name="glossary"><l:template name="see" text="જà«àª“ %t."/>
+<l:template name="seealso" text="આપણજà«àª“ %t."/>
+<l:template name="seealso-separator" text=", "/>
+</l:context>
+<l:context name="msgset"><l:template name="MsgAud" text="શà«àª°à«‹àª¤àª¾: "/>
+<l:template name="MsgLevel" text="સà«àª¤àª°: "/>
+<l:template name="MsgOrig" text="મૂળ: "/>
+</l:context>
+<l:context name="datetime"><l:template name="format" text="m/d/Y"/>
+</l:context>
+<l:context name="termdef"><l:template name="prefix" text="[વà«àª¯àª¾àª–à«àª¯àª¾: "/>
+<l:template name="suffix" text="]"/>
+</l:context>
+<l:context name="datetime-full"><l:template name="January" text="જાનà«àª¯à«àª†àª°à«€"/>
+<l:template name="February" text="ફેબà«àª°à«àª†àª°à«€"/>
+<l:template name="March" text="મારà«àªš"/>
+<l:template name="April" text="àªàªªà«àª°àª¿àª²"/>
+<l:template name="May" text="મે"/>
+<l:template name="June" text="જૂન"/>
+<l:template name="July" text="જà«àª²àª¾àª‡"/>
+<l:template name="August" text="ઑગસà«àªŸ"/>
+<l:template name="September" text="સપà«àªŸà«‡àª®à«àª¬àª°"/>
+<l:template name="October" text="ઑકà«àªŸà«‹àª¬àª°"/>
+<l:template name="November" text="નવેમà«àª¬àª°"/>
+<l:template name="December" text="ડિસેમà«àª¬àª°"/>
+<l:template name="Monday" text="સોમવાર"/>
+<l:template name="Tuesday" text="મંગળવાર"/>
+<l:template name="Wednesday" text="બà«àª§àªµàª¾àª°"/>
+<l:template name="Thursday" text="ગà«àª°à«àªµàª¾àª°"/>
+<l:template name="Friday" text="શà«àª•à«àª°àªµàª¾àª°"/>
+<l:template name="Saturday" text="શનિવાર"/>
+<l:template name="Sunday" text="રવિવાર"/>
+</l:context>
+<l:context name="datetime-abbrev"><l:template name="Jan" text="જાન"/>
+<l:template name="Feb" text="ફેબ"/>
+<l:template name="Mar" text="મારà«àªš"/>
+<l:template name="Apr" text="àªàªªà«àª°"/>
+<l:template name="May" text="મે"/>
+<l:template name="Jun" text="જૂન"/>
+<l:template name="Jul" text="જà«àª²àª¾"/>
+<l:template name="Aug" text="ઑગ"/>
+<l:template name="Sep" text="સપà«àªŸà«‡"/>
+<l:template name="Oct" text="ઑકà«àªŸà«‹"/>
+<l:template name="Nov" text="નવે"/>
+<l:template name="Dec" text="ડિસ"/>
+<l:template name="Mon" text="સોમ"/>
+<l:template name="Tue" text="મંગળ"/>
+<l:template name="Wed" text="બà«àª§"/>
+<l:template name="Thu" text="ગà«àª°à«"/>
+<l:template name="Fri" text="શà«àª•à«àª°"/>
+<l:template name="Sat" text="શનિ"/>
+<l:template name="Sun" text="રવિ"/>
+</l:context>
+<l:context name="htmlhelp"><l:template name="langcode" text="0x0447 Gujarati"/>
+</l:context>
+<l:context name="index"><l:template name="term-separator" text=", "/>
+<l:template name="number-separator" text=", "/>
+<l:template name="range-separator" text="-"/>
+</l:context>
+<l:context name="iso690"><l:template name="lastfirst.sep" text=", "/>
+<l:template name="alt.person.two.sep" text=" – "/>
+<l:template name="alt.person.last.sep" text=" – "/>
+<l:template name="alt.person.more.sep" text=" – "/>
+<l:template name="primary.editor" text=" (ed.)"/>
+<l:template name="primary.many" text=", et al."/>
+<l:template name="primary.sep" text=". "/>
+<l:template name="submaintitle.sep" text=": "/>
+<l:template name="title.sep" text=". "/>
+<l:template name="othertitle.sep" text=", "/>
+<l:template name="medium1" text=" ["/>
+<l:template name="medium2" text="]"/>
+<l:template name="secondary.person.sep" text="; "/>
+<l:template name="secondary.sep" text=". "/>
+<l:template name="respons.sep" text=". "/>
+<l:template name="edition.sep" text=". "/>
+<l:template name="edition.serial.sep" text=", "/>
+<l:template name="issuing.range" text="-"/>
+<l:template name="issuing.div" text=", "/>
+<l:template name="issuing.sep" text=". "/>
+<l:template name="partnr.sep" text=". "/>
+<l:template name="placepubl.sep" text=": "/>
+<l:template name="publyear.sep" text=", "/>
+<l:template name="pubinfo.sep" text=". "/>
+<l:template name="spec.pubinfo.sep" text=", "/>
+<l:template name="upd.sep" text=", "/>
+<l:template name="datecit1" text=" [cited "/>
+<l:template name="datecit2" text="]"/>
+<l:template name="extent.sep" text=". "/>
+<l:template name="locs.sep" text=", "/>
+<l:template name="location.sep" text=". "/>
+<l:template name="serie.sep" text=". "/>
+<l:template name="notice.sep" text=". "/>
+<l:template name="access" text="Available "/>
+<l:template name="acctoo" text="Also available "/>
+<l:template name="onwww" text="from World Wide Web"/>
+<l:template name="oninet" text="from Internet"/>
+<l:template name="access.end" text=": "/>
+<l:template name="link1" text="&lt;"/>
+<l:template name="link2" text="&gt;"/>
+<l:template name="access.sep" text=". "/>
+<l:template name="isbn" text="ISBN "/>
+<l:template name="issn" text="ISSN "/>
+<l:template name="stdnum.sep" text=". "/>
+<l:template name="patcountry.sep" text=". "/>
+<l:template name="pattype.sep" text=", "/>
+<l:template name="patnum.sep" text=". "/>
+<l:template name="patdate.sep" text=". "/>
+</l:context><l:letters><l:l i="-1"/>
+<l:l i="0">સંકેતો</l:l>
+<l:l i="10">A</l:l>
+<l:l i="10">a</l:l>
+<l:l i="20">B</l:l>
+<l:l i="20">b</l:l>
+<l:l i="30">C</l:l>
+<l:l i="30">c</l:l>
+<l:l i="40">D</l:l>
+<l:l i="40">d</l:l>
+<l:l i="50">E</l:l>
+<l:l i="50">e</l:l>
+<l:l i="60">F</l:l>
+<l:l i="60">f</l:l>
+<l:l i="70">G</l:l>
+<l:l i="70">g</l:l>
+<l:l i="80">H</l:l>
+<l:l i="80">h</l:l>
+<l:l i="90">I</l:l>
+<l:l i="90">i</l:l>
+<l:l i="100">J</l:l>
+<l:l i="100">j</l:l>
+<l:l i="110">K</l:l>
+<l:l i="110">k</l:l>
+<l:l i="120">L</l:l>
+<l:l i="120">l</l:l>
+<l:l i="130">M</l:l>
+<l:l i="130">m</l:l>
+<l:l i="140">N</l:l>
+<l:l i="140">n</l:l>
+<l:l i="150">O</l:l>
+<l:l i="150">o</l:l>
+<l:l i="160">P</l:l>
+<l:l i="160">p</l:l>
+<l:l i="170">Q</l:l>
+<l:l i="170">q</l:l>
+<l:l i="180">R</l:l>
+<l:l i="180">r</l:l>
+<l:l i="190">S</l:l>
+<l:l i="190">s</l:l>
+<l:l i="200">T</l:l>
+<l:l i="200">t</l:l>
+<l:l i="210">U</l:l>
+<l:l i="210">u</l:l>
+<l:l i="220">V</l:l>
+<l:l i="220">v</l:l>
+<l:l i="230">W</l:l>
+<l:l i="230">w</l:l>
+<l:l i="240">X</l:l>
+<l:l i="240">x</l:l>
+<l:l i="250">Y</l:l>
+<l:l i="250">y</l:l>
+<l:l i="260">Z</l:l>
+<l:l i="260">z</l:l>
+</l:letters>
+</l:l10n>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/he.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/he.xml
new file mode 100644
index 0000000..d084df4
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/he.xml
@@ -0,0 +1,1229 @@
+<?xml version="1.0" encoding="utf-8"?>
+<l:l10n xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0" language="he" english-language-name="Hebrew">
+
+<!-- * This file is generated automatically. -->
+<!-- * To submit changes to this file upstream (to the DocBook Project) -->
+<!-- * do not submit an edited version of this file. Instead, submit an -->
+<!-- * edited version of the source file at the following location: -->
+<!-- * -->
+<!-- * https://docbook.svn.sourceforge.net/svnroot/docbook/trunk/gentext/locale/he.xml -->
+<!-- * -->
+<!-- * E-mail the edited he.xml source file to: -->
+<!-- * -->
+<!-- * docbook-developers@lists.sourceforge.net -->
+
+<!-- ******************************************************************** -->
+
+<!-- This file is part of the XSL DocBook Stylesheet distribution. -->
+<!-- See ../README or http://docbook.sf.net/release/xsl/current/ for -->
+<!-- copyright and other information. -->
+
+<!-- ******************************************************************** -->
+<!-- In these files, % with a letter is used for a placeholder: -->
+<!-- %t is the current element's title -->
+<!-- %s is the current element's subtitle (if applicable)-->
+<!-- %n is the current element's number label-->
+<!-- %p is the current element's page number (if applicable)-->
+<!-- ******************************************************************** -->
+
+
+<l:gentext key="Abstract" text="סיכו×"/>
+<l:gentext key="abstract" text="סיכו×"/>
+<l:gentext key="Acknowledgements" text="Acknowledgements" lang="en"/>
+<l:gentext key="acknowledgements" text="Acknowledgements" lang="en"/>
+<l:gentext key="Answer" text="ת:"/>
+<l:gentext key="answer" text="ת:"/>
+<l:gentext key="Appendix" text="נספח"/>
+<l:gentext key="appendix" text="נספח"/>
+<l:gentext key="Article" text="מ×מר"/>
+<l:gentext key="article" text="מ×מר"/>
+<l:gentext key="Author" text="Author" lang="en"/>
+<l:gentext key="Bibliography" text="ביבליוגרפיה"/>
+<l:gentext key="bibliography" text="ביבליוגרפיה"/>
+<l:gentext key="Book" text="ספר"/>
+<l:gentext key="book" text="ספר"/>
+<l:gentext key="CAUTION" text="×זהרה"/>
+<l:gentext key="Caution" text="×זהרה"/>
+<l:gentext key="caution" text="×זהרה"/>
+<l:gentext key="Chapter" text="פרק"/>
+<l:gentext key="chapter" text="פרק"/>
+<l:gentext key="Colophon" text="קולופון"/>
+<l:gentext key="colophon" text="קולופון"/>
+<l:gentext key="Copyright" text="זכויות יוצרי×"/>
+<l:gentext key="copyright" text="זכויות יוצרי×"/>
+<l:gentext key="Dedication" text="הקדשה"/>
+<l:gentext key="dedication" text="הקדשה"/>
+<l:gentext key="Edition" text="מהדורה"/>
+<l:gentext key="edition" text="מהדורה"/>
+<l:gentext key="Editor" text="Editor" lang="en"/>
+<l:gentext key="Equation" text="משוו××”"/>
+<l:gentext key="equation" text="משוו××”"/>
+<l:gentext key="Example" text="דוגמה"/>
+<l:gentext key="example" text="דוגמה"/>
+<l:gentext key="Figure" text="×יור"/>
+<l:gentext key="figure" text="×יור"/>
+<l:gentext key="Glossary" text="מילון מונחי×"/>
+<l:gentext key="glossary" text="מילון מונחי×"/>
+<l:gentext key="GlossSee" text="ר××”"/>
+<l:gentext key="glosssee" text="ר××”"/>
+<l:gentext key="GlossSeeAlso" text="ר××” ×’×"/>
+<l:gentext key="glossseealso" text="ר××” ×’×"/>
+<l:gentext key="IMPORTANT" text="חשוב"/>
+<l:gentext key="important" text="חשוב"/>
+<l:gentext key="Important" text="חשוב"/>
+<l:gentext key="Index" text="×ינדקס"/>
+<l:gentext key="index" text="×ינדקס"/>
+<l:gentext key="ISBN" text="מספר ספר סטנדרטי בינל×ומי"/>
+<l:gentext key="isbn" text="מספר ספר סטנדרטי בינל×ומי"/>
+<l:gentext key="LegalNotice" text="הודעה משפטית"/>
+<l:gentext key="legalnotice" text="הודעה משפטית"/>
+<l:gentext key="MsgAud" text="קהל יעד"/>
+<l:gentext key="msgaud" text="קהל יעד"/>
+<l:gentext key="MsgLevel" text="רמה"/>
+<l:gentext key="msglevel" text="רמה"/>
+<l:gentext key="MsgOrig" text="מקור"/>
+<l:gentext key="msgorig" text="מקור"/>
+<l:gentext key="NOTE" text="×©×™× ×œ×‘"/>
+<l:gentext key="Note" text="×©×™× ×œ×‘"/>
+<l:gentext key="note" text="×©×™× ×œ×‘"/>
+<l:gentext key="Part" text="חלק"/>
+<l:gentext key="part" text="חלק"/>
+<l:gentext key="Preface" text="מבו×"/>
+<l:gentext key="preface" text="מבו×"/>
+<l:gentext key="Procedure" text="הליך"/>
+<l:gentext key="procedure" text="הליך"/>
+<l:gentext key="ProductionSet" text="ייצור"/>
+<l:gentext key="PubDate" text="Publication Date" lang="en"/>
+<l:gentext key="pubdate" text="Publication date" lang="en"/>
+<l:gentext key="Published" text="×”×•×¦× ×œ×ור"/>
+<l:gentext key="published" text="×”×•×¦× ×œ×ור"/>
+<l:gentext key="Publisher" text="Publisher" lang="en"/>
+<l:gentext key="Qandadiv" text="ת ו ש"/>
+<l:gentext key="qandadiv" text="ת ו ש"/>
+<l:gentext key="QandASet" text="Frequently Asked Questions" lang="en"/>
+<l:gentext key="Question" text="ש:"/>
+<l:gentext key="question" text="ש:"/>
+<l:gentext key="RefEntry" text=""/>
+<l:gentext key="refentry" text=""/>
+<l:gentext key="Reference" text="מר××” מקו×"/>
+<l:gentext key="reference" text="מר××” מקו×"/>
+<l:gentext key="References" text="References" lang="en"/>
+<l:gentext key="RefName" text="ש×"/>
+<l:gentext key="refname" text="ש×"/>
+<l:gentext key="RefSection" text=""/>
+<l:gentext key="refsection" text=""/>
+<l:gentext key="RefSynopsisDiv" text="תמצית"/>
+<l:gentext key="refsynopsisdiv" text="תמצית"/>
+<l:gentext key="RevHistory" text="היסטוריית גירס×ות"/>
+<l:gentext key="revhistory" text="היסטוריית גירס×ות"/>
+<l:gentext key="revision" text="גירסה"/>
+<l:gentext key="Revision" text="גירסה"/>
+<l:gentext key="sect1" text="סעיף"/>
+<l:gentext key="sect2" text="סעיף"/>
+<l:gentext key="sect3" text="סעיף"/>
+<l:gentext key="sect4" text="סעיף"/>
+<l:gentext key="sect5" text="סעיף"/>
+<l:gentext key="section" text="סעיף"/>
+<l:gentext key="Section" text="סעיף"/>
+<l:gentext key="see" text="ר××”"/>
+<l:gentext key="See" text="ר××”"/>
+<l:gentext key="seealso" text="ר××” ×’×"/>
+<l:gentext key="Seealso" text="ר××” ×’×"/>
+<l:gentext key="SeeAlso" text="ר××” ×’×"/>
+<l:gentext key="set" text="סידרה"/>
+<l:gentext key="Set" text="סידרה"/>
+<l:gentext key="setindex" text="×ינקדקס סדרות"/>
+<l:gentext key="SetIndex" text="×ינדקס סדרות"/>
+<l:gentext key="Sidebar" text=""/>
+<l:gentext key="sidebar" text="פס צדדי"/>
+<l:gentext key="step" text="צעד"/>
+<l:gentext key="Step" text="צעד"/>
+<l:gentext key="table" text="טבלה"/>
+<l:gentext key="Table" text="טבלה"/>
+<l:gentext key="task" text="Task" lang="en"/>
+<l:gentext key="Task" text="Task" lang="en"/>
+<l:gentext key="tip" text="עצה"/>
+<l:gentext key="TIP" text="עצה"/>
+<l:gentext key="Tip" text="עצה"/>
+<l:gentext key="Warning" text="×זהרה"/>
+<l:gentext key="warning" text="×זהרה"/>
+<l:gentext key="WARNING" text="×זהרה"/>
+<l:gentext key="and" text="ו"/>
+<l:gentext key="by" text="מ×ת"/>
+<l:gentext key="Edited" text="נערך"/>
+<l:gentext key="edited" text="נערך"/>
+<l:gentext key="Editedby" text="נערך על ידי"/>
+<l:gentext key="editedby" text="נערך על ידי"/>
+<l:gentext key="in" text="ב"/>
+<l:gentext key="lastlistcomma" text=","/>
+<l:gentext key="listcomma" text=","/>
+<l:gentext key="notes" text="הערות"/>
+<l:gentext key="Notes" text="הערות"/>
+<l:gentext key="Pgs" text="עמודי×"/>
+<l:gentext key="pgs" text="עמודי×"/>
+<l:gentext key="Revisedby" text="הוגה על ידי: "/>
+<l:gentext key="revisedby" text="הוגה על ידי: "/>
+<l:gentext key="TableNotes" text="הערות"/>
+<l:gentext key="tablenotes" text="הערות"/>
+<l:gentext key="TableofContents" text="תוכן ×”×¢× ×™×™× ×™×"/>
+<l:gentext key="tableofcontents" text="תוכן ×”×¢× ×™×™× ×™×"/>
+<l:gentext key="unexpectedelementname" text="×©× ×ž×¨×›×™×‘ בלתי צפוי"/>
+<l:gentext key="unsupported" text="×œ× × ×ª×ž×š"/>
+<l:gentext key="xrefto" text="התייחסות צולבת ×ל"/>
+<l:gentext key="Authors" text="Authors" lang="en"/>
+<l:gentext key="copyeditor" text="Copy Editor" lang="en"/>
+<l:gentext key="graphicdesigner" text="Graphic Designer" lang="en"/>
+<l:gentext key="productioneditor" text="Production Editor" lang="en"/>
+<l:gentext key="technicaleditor" text="Technical Editor" lang="en"/>
+<l:gentext key="translator" text="Translator" lang="en"/>
+<l:gentext key="listofequations" text="רשימת משוו×ות"/>
+<l:gentext key="ListofEquations" text="רשימת משוו×ות"/>
+<l:gentext key="ListofExamples" text="רשימת דוגמ×ות"/>
+<l:gentext key="listofexamples" text="רשימת דוגמ×ות"/>
+<l:gentext key="ListofFigures" text="רשימת ×יורי×"/>
+<l:gentext key="listoffigures" text="רשימת ×יורי×"/>
+<l:gentext key="ListofProcedures" text="List of Procedures" lang="en"/>
+<l:gentext key="listofprocedures" text="List of Procedures" lang="en"/>
+<l:gentext key="listoftables" text="רשימת טבל×ות"/>
+<l:gentext key="ListofTables" text="רשימת טבל×ות"/>
+<l:gentext key="ListofUnknown" text="רשימה של ×ž×¨×›×™×‘×™× ×œ× ×™×“×•×¢×™×"/>
+<l:gentext key="listofunknown" text="רשימה של ×ž×¨×›×™×‘×™× ×œ× ×™×“×•×¢×™×"/>
+<l:gentext key="nav-home" text="ר×שי"/>
+<l:gentext key="nav-next" text="הב×"/>
+<l:gentext key="nav-next-sibling" text="דלג לסוף"/>
+<l:gentext key="nav-prev" text="הקוד×"/>
+<l:gentext key="nav-prev-sibling" text="חזור להתחלה"/>
+<l:gentext key="nav-up" text="למעלה"/>
+<l:gentext key="nav-toc" text="ToC" lang="en"/>
+<l:gentext key="Draft" text="טיוטה"/>
+<l:gentext key="above" text="למעלה"/>
+<l:gentext key="below" text="למטה"/>
+<l:gentext key="sectioncalled" text="הסעיף שנקר×"/>
+<l:gentext key="index symbols" text="סמלי×"/>
+<l:gentext key="writing-mode" text="rl-tb"/>
+<l:gentext key="lowercase.alpha" text="abcdefghijklmnopqrstuvwxyz"/>
+<l:gentext key="uppercase.alpha" text="ABCDEFGHIJKLMNOPQRSTUVWXYZ"/>
+<l:gentext key="normalize.sort.input" text="AaÀàÃáÂâÃãÄäÅåĀÄĂ㥹ÇǎǞǟǠǡǺǻȀÈȂȃȦȧḀá¸áºšáº áº¡áº¢áº£áº¤áº¥áº¦áº§áº¨áº©áºªáº«áº¬áº­áº®áº¯áº°áº±áº²áº³áº´áºµáº¶áº·BbÆ€ÆɓƂƃḂḃḄḅḆḇCcÇçĆćĈĉĊċČÄƇƈɕḈḉDdÄŽÄÄđƊɗƋƌDžDzȡɖḊḋḌá¸á¸Žá¸á¸á¸‘ḒḓEeÈèÉéÊêËëĒēĔĕĖėĘęĚěȄȅȆȇȨȩḔḕḖḗḘḙḚḛḜá¸áº¸áº¹áººáº»áº¼áº½áº¾áº¿á»€á»á»‚ểỄễỆệFfƑƒḞḟGgÄœÄĞğĠġĢģƓɠǤǥǦǧǴǵḠḡHhĤĥĦħȞȟɦḢḣḤḥḦḧḨḩḪḫẖIiÌìÃíÎîÃïĨĩĪīĬĭĮįİƗɨÇÇȈȉȊȋḬḭḮḯỈỉỊịJjĴĵǰÊKkĶķƘƙǨǩḰḱḲḳḴḵLlĹĺĻļĽľĿŀÅłƚLjȴɫɬɭḶḷḸḹḺḻḼḽMmɱḾḿṀá¹á¹‚ṃNnÑñŃńŅņŇňÆɲƞȠNjǸǹȵɳṄṅṆṇṈṉṊṋOoÒòÓóÔôÕõÖöØøŌÅÅŽÅÅőƟƠơǑǒǪǫǬǭǾǿȌÈÈŽÈȪȫȬȭȮȯȰȱṌá¹á¹Žá¹á¹á¹‘ṒṓỌá»á»Žá»á»á»‘ỒồỔổỖỗỘộỚớỜá»á»žá»Ÿá» á»¡á»¢á»£PpƤƥṔṕṖṗQqÊ RrŔŕŖŗŘřÈȑȒȓɼɽɾṘṙṚṛṜá¹á¹žá¹ŸSsŚśŜÅŞşŠšȘșʂṠṡṢṣṤṥṦṧṨṩTtŢţŤťŦŧƫƬƭƮʈȚțȶṪṫṬṭṮṯṰṱẗUuÙùÚúÛûÜüŨũŪūŬŭŮůŰűŲųƯưǓǔǕǖǗǘǙǚǛǜȔȕȖȗṲṳṴṵṶṷṸṹṺṻỤụỦủỨứỪừỬửỮữỰựVvƲʋṼṽṾṿWwŴŵẀáºáº‚ẃẄẅẆẇẈẉẘXxẊẋẌáºYyÃýÿŸŶŷƳƴȲȳẎáºáº™á»²á»³á»´á»µá»¶á»·á»¸á»¹ZzŹźŻżŽžƵƶȤȥÊÊ‘áºáº‘ẒẓẔẕẕ" lang="en"/>
+<l:gentext key="normalize.sort.output" text="AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBCCCCCCCCCCCCCCCCCDDDDDDDDDDDDDDDDDDDDDDDDEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEFFFFFFGGGGGGGGGGGGGGGGGGGGHHHHHHHHHHHHHHHHHHHHIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIJJJJJJKKKKKKKKKKKKKKLLLLLLLLLLLLLLLLLLLLLLLLLLMMMMMMMMMNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOPPPPPPPPQQQRRRRRRRRRRRRRRRRRRRRRRRSSSSSSSSSSSSSSSSSSSSSSSTTTTTTTTTTTTTTTTTTTTTTTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUVVVVVVVVWWWWWWWWWWWWWWWXXXXXXYYYYYYYYYYYYYYYYYYYYYYYZZZZZZZZZZZZZZZZZZZZZ" lang="en"/>
+<l:dingbat key="startquote" text="“"/>
+<l:dingbat key="endquote" text="â€"/>
+<l:dingbat key="nestedstartquote" text="‘"/>
+<l:dingbat key="nestedendquote" text="’"/>
+<l:dingbat key="singlestartquote" text="‘" lang="en"/>
+<l:dingbat key="singleendquote" text="’" lang="en"/>
+<l:dingbat key="bullet" text="•"/>
+<l:gentext key="hyphenation-character" text="-" lang="en"/>
+<l:gentext key="hyphenation-push-character-count" text="2" lang="en"/>
+<l:gentext key="hyphenation-remain-character-count" text="2" lang="en"/>
+<l:context name="styles"><l:template name="person-name" text="first-last"/>
+</l:context>
+<l:context name="title"><l:template name="abstract" text="%t"/>
+<l:template name="acknowledgements" text="%t" lang="en"/>
+<l:template name="answer" text="%t"/>
+<l:template name="appendix" text="נספח %n. %t"/>
+<l:template name="article" text="%t"/>
+<l:template name="authorblurb" text="%t"/>
+<l:template name="bibliodiv" text="%t"/>
+<l:template name="biblioentry" text="%t"/>
+<l:template name="bibliography" text="%t"/>
+<l:template name="bibliolist" text="%t" lang="en"/>
+<l:template name="bibliomixed" text="%t"/>
+<l:template name="bibliomset" text="%t"/>
+<l:template name="biblioset" text="%t"/>
+<l:template name="blockquote" text="%t"/>
+<l:template name="book" text="%t"/>
+<l:template name="calloutlist" text="%t"/>
+<l:template name="caution" text="%t"/>
+<l:template name="chapter" text="פרק %n. %t"/>
+<l:template name="colophon" text="%t"/>
+<l:template name="dedication" text="%t"/>
+<l:template name="equation" text="משוו××” %n. %t"/>
+<l:template name="example" text="דוגמה %n. %t"/>
+<l:template name="figure" text="×יור %n. %t"/>
+<l:template name="foil" text="%t" lang="en"/>
+<l:template name="foilgroup" text="%t" lang="en"/>
+<l:template name="formalpara" text="%t"/>
+<l:template name="glossary" text="%t"/>
+<l:template name="glossdiv" text="%t"/>
+<l:template name="glosslist" text="%t" lang="en"/>
+<l:template name="glossentry" text="%t" lang="en"/>
+<l:template name="important" text="%t"/>
+<l:template name="index" text="%t"/>
+<l:template name="indexdiv" text="%t"/>
+<l:template name="itemizedlist" text="%t"/>
+<l:template name="legalnotice" text="%t"/>
+<l:template name="listitem" text=""/>
+<l:template name="lot" text="%t"/>
+<l:template name="msg" text="%t"/>
+<l:template name="msgexplan" text="%t"/>
+<l:template name="msgmain" text="%t"/>
+<l:template name="msgrel" text="%t"/>
+<l:template name="msgset" text="%t"/>
+<l:template name="msgsub" text="%t"/>
+<l:template name="note" text="%t"/>
+<l:template name="orderedlist" text="%t"/>
+<l:template name="part" text="חלק %n. %t"/>
+<l:template name="partintro" text="%t"/>
+<l:template name="preface" text="%t"/>
+<l:template name="procedure" text="%t"/>
+<l:template name="procedure.formal" text="הליך %n. %t"/>
+<l:template name="productionset" text="%t"/>
+<l:template name="productionset.formal" text="ייצור %n"/>
+<l:template name="qandadiv" text="%t"/>
+<l:template name="qandaentry" text="%t"/>
+<l:template name="qandaset" text="%t"/>
+<l:template name="question" text="%t"/>
+<l:template name="refentry" text="%t"/>
+<l:template name="reference" text="%t"/>
+<l:template name="refsection" text="%t"/>
+<l:template name="refsect1" text="%t"/>
+<l:template name="refsect2" text="%t"/>
+<l:template name="refsect3" text="%t"/>
+<l:template name="refsynopsisdiv" text="%t"/>
+<l:template name="refsynopsisdivinfo" text="%t"/>
+<l:template name="segmentedlist" text="%t"/>
+<l:template name="set" text="%t"/>
+<l:template name="setindex" text="%t"/>
+<l:template name="sidebar" text="%t"/>
+<l:template name="step" text="%t"/>
+<l:template name="table" text="טבלה %n. %t"/>
+<l:template name="task" text="%t" lang="en"/>
+<l:template name="tasksummary" text="%t" lang="en"/>
+<l:template name="taskprerequisites" text="%t" lang="en"/>
+<l:template name="taskrelated" text="%t" lang="en"/>
+<l:template name="tip" text="%t"/>
+<l:template name="toc" text="%t"/>
+<l:template name="variablelist" text="%t"/>
+<l:template name="varlistentry" text=""/>
+<l:template name="warning" text="%t"/>
+</l:context>
+<l:context name="title-unnumbered"><l:template name="appendix" text="%t"/>
+<l:template name="article/appendix" text="%t" lang="en"/>
+<l:template name="bridgehead" text="%t"/>
+<l:template name="chapter" text="%t"/>
+<l:template name="sect1" text="%t"/>
+<l:template name="sect2" text="%t"/>
+<l:template name="sect3" text="%t"/>
+<l:template name="sect4" text="%t"/>
+<l:template name="sect5" text="%t"/>
+<l:template name="section" text="%t"/>
+<l:template name="simplesect" text="%t"/>
+<l:template name="part" text="%t" lang="en"/>
+</l:context>
+<l:context name="title-numbered"><l:template name="appendix" text="נספח %n. %t"/>
+<l:template name="article/appendix" text="%n. %t" lang="en"/>
+<l:template name="bridgehead" text="%n. %t"/>
+<l:template name="chapter" text="פרק %n. %t"/>
+<l:template name="part" text="חלק %n. %t"/>
+<l:template name="sect1" text="%n. %t"/>
+<l:template name="sect2" text="%n. %t"/>
+<l:template name="sect3" text="%n. %t"/>
+<l:template name="sect4" text="%n. %t"/>
+<l:template name="sect5" text="%n. %t"/>
+<l:template name="section" text="%n. %t"/>
+<l:template name="simplesect" text="%t"/>
+</l:context>
+<l:context name="subtitle"><l:template name="appendix" text="%s"/>
+<l:template name="acknowledgements" text="%s" lang="en"/>
+<l:template name="article" text="%s"/>
+<l:template name="bibliodiv" text="%s"/>
+<l:template name="biblioentry" text="%s"/>
+<l:template name="bibliography" text="%s"/>
+<l:template name="bibliomixed" text="%s"/>
+<l:template name="bibliomset" text="%s"/>
+<l:template name="biblioset" text="%s"/>
+<l:template name="book" text="%s"/>
+<l:template name="chapter" text="%s"/>
+<l:template name="colophon" text="%s"/>
+<l:template name="dedication" text="%s"/>
+<l:template name="glossary" text="%s"/>
+<l:template name="glossdiv" text="%s"/>
+<l:template name="index" text="%s"/>
+<l:template name="indexdiv" text="%s"/>
+<l:template name="lot" text="%s"/>
+<l:template name="part" text="%s"/>
+<l:template name="partintro" text="%s"/>
+<l:template name="preface" text="%s"/>
+<l:template name="refentry" text="%s"/>
+<l:template name="reference" text="%s"/>
+<l:template name="refsection" text="%s"/>
+<l:template name="refsect1" text="%s"/>
+<l:template name="refsect2" text="%s"/>
+<l:template name="refsect3" text="%s"/>
+<l:template name="refsynopsisdiv" text="%s"/>
+<l:template name="sect1" text="%s"/>
+<l:template name="sect2" text="%s"/>
+<l:template name="sect3" text="%s"/>
+<l:template name="sect4" text="%s"/>
+<l:template name="sect5" text="%s"/>
+<l:template name="section" text="%s"/>
+<l:template name="set" text="%s"/>
+<l:template name="setindex" text="%s"/>
+<l:template name="sidebar" text="%s"/>
+<l:template name="simplesect" text="%s"/>
+<l:template name="toc" text="%s"/>
+</l:context>
+<l:context name="xref"><l:template name="abstract" text="%t"/>
+<l:template name="acknowledgements" text="%t" lang="en"/>
+<l:template name="answer" text="ת: %n"/>
+<l:template name="appendix" text="%t"/>
+<l:template name="article" text="%t"/>
+<l:template name="authorblurb" text="%t"/>
+<l:template name="bibliodiv" text="%t"/>
+<l:template name="bibliography" text="%t"/>
+<l:template name="bibliomset" text="%t"/>
+<l:template name="biblioset" text="%t"/>
+<l:template name="blockquote" text="%t"/>
+<l:template name="book" text="%t"/>
+<l:template name="calloutlist" text="%t"/>
+<l:template name="caution" text="%t"/>
+<l:template name="chapter" text="%t"/>
+<l:template name="colophon" text="%t"/>
+<l:template name="constraintdef" text="%t"/>
+<l:template name="dedication" text="%t"/>
+<l:template name="equation" text="%t"/>
+<l:template name="example" text="%t"/>
+<l:template name="figure" text="%t"/>
+<l:template name="foil" text="%t" lang="en"/>
+<l:template name="foilgroup" text="%t" lang="en"/>
+<l:template name="formalpara" text="%t"/>
+<l:template name="glossary" text="%t"/>
+<l:template name="glossdiv" text="%t"/>
+<l:template name="important" text="%t"/>
+<l:template name="index" text="%t"/>
+<l:template name="indexdiv" text="%t"/>
+<l:template name="itemizedlist" text="%t"/>
+<l:template name="legalnotice" text="%t"/>
+<l:template name="listitem" text="%n"/>
+<l:template name="lot" text="%t"/>
+<l:template name="msg" text="%t"/>
+<l:template name="msgexplan" text="%t"/>
+<l:template name="msgmain" text="%t"/>
+<l:template name="msgrel" text="%t"/>
+<l:template name="msgset" text="%t"/>
+<l:template name="msgsub" text="%t"/>
+<l:template name="note" text="%t"/>
+<l:template name="orderedlist" text="%t"/>
+<l:template name="part" text="%t"/>
+<l:template name="partintro" text="%t"/>
+<l:template name="preface" text="%t"/>
+<l:template name="procedure" text="%t"/>
+<l:template name="productionset" text="%t"/>
+<l:template name="qandadiv" text="%t"/>
+<l:template name="qandaentry" text="ש: %n"/>
+<l:template name="qandaset" text="%t"/>
+<l:template name="question" text="ש: %n"/>
+<l:template name="reference" text="%t"/>
+<l:template name="refsynopsisdiv" text="%t"/>
+<l:template name="segmentedlist" text="%t"/>
+<l:template name="set" text="%t"/>
+<l:template name="setindex" text="%t"/>
+<l:template name="sidebar" text="%t"/>
+<l:template name="table" text="%t"/>
+<l:template name="task" text="%t" lang="en"/>
+<l:template name="tip" text="%t"/>
+<l:template name="toc" text="%t"/>
+<l:template name="variablelist" text="%t"/>
+<l:template name="varlistentry" text="%n"/>
+<l:template name="warning" text="%t"/>
+<l:template name="olink.document.citation" text=" in %o" lang="en"/>
+<l:template name="olink.page.citation" text=" (page %p)" lang="en"/>
+<l:template name="page.citation" text=" [%p]"/>
+<l:template name="page" text="(page %p)" lang="en"/>
+<l:template name="docname" text=" in %o" lang="en"/>
+<l:template name="docnamelong" text=" in the document titled %o" lang="en"/>
+<l:template name="pageabbrev" text="(p. %p)" lang="en"/>
+<l:template name="Page" text="Page %p" lang="en"/>
+<l:template name="bridgehead" text="הסעיף ×©× ×§×¨× â€œ%tâ€"/>
+<l:template name="refsection" text="הסעיף ×©× ×§×¨× â€œ%tâ€"/>
+<l:template name="refsect1" text="הסעיף ×©× ×§×¨× â€œ%tâ€"/>
+<l:template name="refsect2" text="הסעיף ×©× ×§×¨× â€œ%tâ€"/>
+<l:template name="refsect3" text="הסעיף ×©× ×§×¨× â€œ%tâ€"/>
+<l:template name="sect1" text="הסעיף ×©× ×§×¨× â€œ%tâ€"/>
+<l:template name="sect2" text="הסעיף ×©× ×§×¨× â€œ%tâ€"/>
+<l:template name="sect3" text="הסעיף ×©× ×§×¨× â€œ%tâ€"/>
+<l:template name="sect4" text="הסעיף ×©× ×§×¨× â€œ%tâ€"/>
+<l:template name="sect5" text="הסעיף ×©× ×§×¨× â€œ%tâ€"/>
+<l:template name="section" text="הסעיף ×©× ×§×¨× â€œ%tâ€"/>
+<l:template name="simplesect" text="הסעיף ×©× ×§×¨× â€œ%tâ€"/>
+</l:context>
+<l:context name="xref-number"><l:template name="answer" text="ת: %n"/>
+<l:template name="appendix" text="נספח %n"/>
+<l:template name="bridgehead" text="סעיף %n"/>
+<l:template name="chapter" text="פרק %n"/>
+<l:template name="equation" text="משוו×ה %n"/>
+<l:template name="example" text="דוגמה %n"/>
+<l:template name="figure" text="×יור %n"/>
+<l:template name="part" text="חלק %n"/>
+<l:template name="procedure" text="הליך %n"/>
+<l:template name="productionset" text="ייצור %n"/>
+<l:template name="qandadiv" text="ת ו ש %n"/>
+<l:template name="qandaentry" text="ש: %n"/>
+<l:template name="question" text="ש: %n"/>
+<l:template name="sect1" text="סעיף %n"/>
+<l:template name="sect2" text="סעיף %n"/>
+<l:template name="sect3" text="סעיף %n"/>
+<l:template name="sect4" text="סעיף %n"/>
+<l:template name="sect5" text="סעיף %n"/>
+<l:template name="section" text="סעיף %n"/>
+<l:template name="table" text="טבלה %n"/>
+</l:context>
+<l:context name="xref-number-and-title"><l:template name="appendix" text="נספח %n, %t"/>
+<l:template name="bridgehead" text="סעיף %n, “%tâ€"/>
+<l:template name="chapter" text="פרק %n, %t"/>
+<l:template name="equation" text="משוו×ה %n, “%tâ€"/>
+<l:template name="example" text="דוגמה %n, “%tâ€"/>
+<l:template name="figure" text="×יור %n, “%tâ€"/>
+<l:template name="part" text="חלק %n, “%tâ€"/>
+<l:template name="procedure" text="הליך %n, “%tâ€"/>
+<l:template name="productionset" text="ייצור %n, “%tâ€"/>
+<l:template name="qandadiv" text="ת ו ש %n, “%tâ€"/>
+<l:template name="refsect1" text="הסעיף ×©× ×§×¨× â€œ%tâ€"/>
+<l:template name="refsect2" text="הסעיף ×©× ×§×¨× â€œ%tâ€"/>
+<l:template name="refsect3" text="הסעיף ×©× ×§×¨× â€œ%tâ€"/>
+<l:template name="refsection" text="הסעיף ×©× ×§×¨× â€œ%tâ€"/>
+<l:template name="sect1" text="סעיף %n, “%tâ€"/>
+<l:template name="sect2" text="סעיף %n, “%tâ€"/>
+<l:template name="sect3" text="סעיף %n, “%tâ€"/>
+<l:template name="sect4" text="סעיף %n, “%tâ€"/>
+<l:template name="sect5" text="סעיף %n, “%tâ€"/>
+<l:template name="section" text="סעיף %n, “%tâ€"/>
+<l:template name="simplesect" text="הסעיף ×©× ×§×¨× â€œ%tâ€"/>
+<l:template name="table" text="טבלה %n, “%tâ€"/>
+</l:context>
+<l:context name="authorgroup"><l:template name="sep" text=", "/>
+<l:template name="sep2" text=" ו "/>
+<l:template name="seplast" text=", ו "/>
+</l:context>
+<l:context name="glossary"><l:template name="see" text="ר××” %t."/>
+<l:template name="seealso" text="ר××” ×’× %t."/>
+<l:template name="seealso-separator" text=", "/>
+</l:context>
+<l:context name="msgset"><l:template name="MsgAud" text="קהל יעד: "/>
+<l:template name="MsgLevel" text="רמה: "/>
+<l:template name="MsgOrig" text="מקור: "/>
+</l:context>
+<l:context name="datetime"><l:template name="format" text="m/d/Y" lang="en"/>
+</l:context>
+<l:context name="termdef"><l:template name="prefix" text="[Definition: " lang="en"/>
+<l:template name="suffix" text="]" lang="en"/>
+</l:context>
+<l:context name="datetime-full"><l:template name="January" text="January" lang="en"/>
+<l:template name="February" text="February" lang="en"/>
+<l:template name="March" text="March" lang="en"/>
+<l:template name="April" text="April" lang="en"/>
+<l:template name="May" text="May" lang="en"/>
+<l:template name="June" text="June" lang="en"/>
+<l:template name="July" text="July" lang="en"/>
+<l:template name="August" text="August" lang="en"/>
+<l:template name="September" text="September" lang="en"/>
+<l:template name="October" text="October" lang="en"/>
+<l:template name="November" text="November" lang="en"/>
+<l:template name="December" text="December" lang="en"/>
+<l:template name="Monday" text="Monday" lang="en"/>
+<l:template name="Tuesday" text="Tuesday" lang="en"/>
+<l:template name="Wednesday" text="Wednesday" lang="en"/>
+<l:template name="Thursday" text="Thursday" lang="en"/>
+<l:template name="Friday" text="Friday" lang="en"/>
+<l:template name="Saturday" text="Saturday" lang="en"/>
+<l:template name="Sunday" text="Sunday" lang="en"/>
+</l:context>
+<l:context name="datetime-abbrev"><l:template name="Jan" text="Jan" lang="en"/>
+<l:template name="Feb" text="Feb" lang="en"/>
+<l:template name="Mar" text="Mar" lang="en"/>
+<l:template name="Apr" text="Apr" lang="en"/>
+<l:template name="May" text="May" lang="en"/>
+<l:template name="Jun" text="Jun" lang="en"/>
+<l:template name="Jul" text="Jul" lang="en"/>
+<l:template name="Aug" text="Aug" lang="en"/>
+<l:template name="Sep" text="Sep" lang="en"/>
+<l:template name="Oct" text="Oct" lang="en"/>
+<l:template name="Nov" text="Nov" lang="en"/>
+<l:template name="Dec" text="Dec" lang="en"/>
+<l:template name="Mon" text="Mon" lang="en"/>
+<l:template name="Tue" text="Tue" lang="en"/>
+<l:template name="Wed" text="Wed" lang="en"/>
+<l:template name="Thu" text="Thu" lang="en"/>
+<l:template name="Fri" text="Fri" lang="en"/>
+<l:template name="Sat" text="Sat" lang="en"/>
+<l:template name="Sun" text="Sun" lang="en"/>
+</l:context>
+<l:context name="htmlhelp"><l:template name="langcode" text="0x040d Hebrew (ISRAEL)"/>
+</l:context>
+<l:context name="index"><l:template name="term-separator" text=", " lang="en"/>
+<l:template name="number-separator" text=", " lang="en"/>
+<l:template name="range-separator" text="-" lang="en"/>
+</l:context>
+<l:context name="iso690"><l:template name="lastfirst.sep" text=", " lang="en"/>
+<l:template name="alt.person.two.sep" text=" – " lang="en"/>
+<l:template name="alt.person.last.sep" text=" – " lang="en"/>
+<l:template name="alt.person.more.sep" text=" – " lang="en"/>
+<l:template name="primary.editor" text=" (ed.)" lang="en"/>
+<l:template name="primary.many" text=", et al." lang="en"/>
+<l:template name="primary.sep" text=". " lang="en"/>
+<l:template name="submaintitle.sep" text=": " lang="en"/>
+<l:template name="title.sep" text=". " lang="en"/>
+<l:template name="othertitle.sep" text=", " lang="en"/>
+<l:template name="medium1" text=" [" lang="en"/>
+<l:template name="medium2" text="]" lang="en"/>
+<l:template name="secondary.person.sep" text="; " lang="en"/>
+<l:template name="secondary.sep" text=". " lang="en"/>
+<l:template name="respons.sep" text=". " lang="en"/>
+<l:template name="edition.sep" text=". " lang="en"/>
+<l:template name="edition.serial.sep" text=", " lang="en"/>
+<l:template name="issuing.range" text="-" lang="en"/>
+<l:template name="issuing.div" text=", " lang="en"/>
+<l:template name="issuing.sep" text=". " lang="en"/>
+<l:template name="partnr.sep" text=". " lang="en"/>
+<l:template name="placepubl.sep" text=": " lang="en"/>
+<l:template name="publyear.sep" text=", " lang="en"/>
+<l:template name="pubinfo.sep" text=". " lang="en"/>
+<l:template name="spec.pubinfo.sep" text=", " lang="en"/>
+<l:template name="upd.sep" text=", " lang="en"/>
+<l:template name="datecit1" text=" [cited " lang="en"/>
+<l:template name="datecit2" text="]" lang="en"/>
+<l:template name="extent.sep" text=". " lang="en"/>
+<l:template name="locs.sep" text=", " lang="en"/>
+<l:template name="location.sep" text=". " lang="en"/>
+<l:template name="serie.sep" text=". " lang="en"/>
+<l:template name="notice.sep" text=". " lang="en"/>
+<l:template name="access" text="Available " lang="en"/>
+<l:template name="acctoo" text="Also available " lang="en"/>
+<l:template name="onwww" text="from World Wide Web" lang="en"/>
+<l:template name="oninet" text="from Internet" lang="en"/>
+<l:template name="access.end" text=": " lang="en"/>
+<l:template name="link1" text="&lt;" lang="en"/>
+<l:template name="link2" text="&gt;" lang="en"/>
+<l:template name="access.sep" text=". " lang="en"/>
+<l:template name="isbn" text="ISBN " lang="en"/>
+<l:template name="issn" text="ISSN " lang="en"/>
+<l:template name="stdnum.sep" text=". " lang="en"/>
+<l:template name="patcountry.sep" text=". " lang="en"/>
+<l:template name="pattype.sep" text=", " lang="en"/>
+<l:template name="patnum.sep" text=". " lang="en"/>
+<l:template name="patdate.sep" text=". " lang="en"/>
+</l:context><l:letters lang="en"><l:l i="-1"/>
+<l:l i="0">Symbols</l:l>
+<l:l i="10">A</l:l>
+<l:l i="10">a</l:l>
+<l:l i="10">À</l:l>
+<l:l i="10">à</l:l>
+<l:l i="10">Ã</l:l>
+<l:l i="10">á</l:l>
+<l:l i="10">Â</l:l>
+<l:l i="10">â</l:l>
+<l:l i="10">Ã</l:l>
+<l:l i="10">ã</l:l>
+<l:l i="10">Ä</l:l>
+<l:l i="10">ä</l:l>
+<l:l i="10">Ã…</l:l>
+<l:l i="10">Ã¥</l:l>
+<l:l i="10">Ä€</l:l>
+<l:l i="10">Ä</l:l>
+<l:l i="10">Ä‚</l:l>
+<l:l i="10">ă</l:l>
+<l:l i="10">Ä„</l:l>
+<l:l i="10">Ä…</l:l>
+<l:l i="10">Ç</l:l>
+<l:l i="10">ÇŽ</l:l>
+<l:l i="10">Çž</l:l>
+<l:l i="10">ÇŸ</l:l>
+<l:l i="10">Ç </l:l>
+<l:l i="10">Ç¡</l:l>
+<l:l i="10">Ǻ</l:l>
+<l:l i="10">Ç»</l:l>
+<l:l i="10">È€</l:l>
+<l:l i="10">È</l:l>
+<l:l i="10">È‚</l:l>
+<l:l i="10">ȃ</l:l>
+<l:l i="10">Ȧ</l:l>
+<l:l i="10">ȧ</l:l>
+<l:l i="10">Ḁ</l:l>
+<l:l i="10">á¸</l:l>
+<l:l i="10">ẚ</l:l>
+<l:l i="10">Ạ</l:l>
+<l:l i="10">ạ</l:l>
+<l:l i="10">Ả</l:l>
+<l:l i="10">ả</l:l>
+<l:l i="10">Ấ</l:l>
+<l:l i="10">ấ</l:l>
+<l:l i="10">Ầ</l:l>
+<l:l i="10">ầ</l:l>
+<l:l i="10">Ẩ</l:l>
+<l:l i="10">ẩ</l:l>
+<l:l i="10">Ẫ</l:l>
+<l:l i="10">ẫ</l:l>
+<l:l i="10">Ậ</l:l>
+<l:l i="10">ậ</l:l>
+<l:l i="10">Ắ</l:l>
+<l:l i="10">ắ</l:l>
+<l:l i="10">Ằ</l:l>
+<l:l i="10">ằ</l:l>
+<l:l i="10">Ẳ</l:l>
+<l:l i="10">ẳ</l:l>
+<l:l i="10">Ẵ</l:l>
+<l:l i="10">ẵ</l:l>
+<l:l i="10">Ặ</l:l>
+<l:l i="10">ặ</l:l>
+<l:l i="20">B</l:l>
+<l:l i="20">b</l:l>
+<l:l i="20">Æ€</l:l>
+<l:l i="20">Æ</l:l>
+<l:l i="20">É“</l:l>
+<l:l i="20">Æ‚</l:l>
+<l:l i="20">ƃ</l:l>
+<l:l i="20">Ḃ</l:l>
+<l:l i="20">ḃ</l:l>
+<l:l i="20">Ḅ</l:l>
+<l:l i="20">ḅ</l:l>
+<l:l i="20">Ḇ</l:l>
+<l:l i="20">ḇ</l:l>
+<l:l i="30">C</l:l>
+<l:l i="30">c</l:l>
+<l:l i="30">Ç</l:l>
+<l:l i="30">ç</l:l>
+<l:l i="30">Ć</l:l>
+<l:l i="30">ć</l:l>
+<l:l i="30">Ĉ</l:l>
+<l:l i="30">ĉ</l:l>
+<l:l i="30">ÄŠ</l:l>
+<l:l i="30">Ä‹</l:l>
+<l:l i="30">Č</l:l>
+<l:l i="30">Ä</l:l>
+<l:l i="30">Ƈ</l:l>
+<l:l i="30">ƈ</l:l>
+<l:l i="30">É•</l:l>
+<l:l i="30">Ḉ</l:l>
+<l:l i="30">ḉ</l:l>
+<l:l i="40">D</l:l>
+<l:l i="40">d</l:l>
+<l:l i="40">ÄŽ</l:l>
+<l:l i="40">Ä</l:l>
+<l:l i="40">Ä</l:l>
+<l:l i="40">Ä‘</l:l>
+<l:l i="40">ÆŠ</l:l>
+<l:l i="40">É—</l:l>
+<l:l i="40">Æ‹</l:l>
+<l:l i="40">ƌ</l:l>
+<l:l i="40">Ç…</l:l>
+<l:l i="40">Dz</l:l>
+<l:l i="40">È¡</l:l>
+<l:l i="40">É–</l:l>
+<l:l i="40">Ḋ</l:l>
+<l:l i="40">ḋ</l:l>
+<l:l i="40">Ḍ</l:l>
+<l:l i="40">á¸</l:l>
+<l:l i="40">Ḏ</l:l>
+<l:l i="40">á¸</l:l>
+<l:l i="40">á¸</l:l>
+<l:l i="40">ḑ</l:l>
+<l:l i="40">Ḓ</l:l>
+<l:l i="40">ḓ</l:l>
+<l:l i="50">E</l:l>
+<l:l i="50">e</l:l>
+<l:l i="50">È</l:l>
+<l:l i="50">è</l:l>
+<l:l i="50">É</l:l>
+<l:l i="50">é</l:l>
+<l:l i="50">Ê</l:l>
+<l:l i="50">ê</l:l>
+<l:l i="50">Ë</l:l>
+<l:l i="50">ë</l:l>
+<l:l i="50">Ä’</l:l>
+<l:l i="50">Ä“</l:l>
+<l:l i="50">Ä”</l:l>
+<l:l i="50">Ä•</l:l>
+<l:l i="50">Ä–</l:l>
+<l:l i="50">Ä—</l:l>
+<l:l i="50">Ę</l:l>
+<l:l i="50">Ä™</l:l>
+<l:l i="50">Äš</l:l>
+<l:l i="50">Ä›</l:l>
+<l:l i="50">È„</l:l>
+<l:l i="50">È…</l:l>
+<l:l i="50">Ȇ</l:l>
+<l:l i="50">ȇ</l:l>
+<l:l i="50">Ȩ</l:l>
+<l:l i="50">È©</l:l>
+<l:l i="50">Ḕ</l:l>
+<l:l i="50">ḕ</l:l>
+<l:l i="50">Ḗ</l:l>
+<l:l i="50">ḗ</l:l>
+<l:l i="50">Ḙ</l:l>
+<l:l i="50">ḙ</l:l>
+<l:l i="50">Ḛ</l:l>
+<l:l i="50">ḛ</l:l>
+<l:l i="50">Ḝ</l:l>
+<l:l i="50">á¸</l:l>
+<l:l i="50">Ẹ</l:l>
+<l:l i="50">ẹ</l:l>
+<l:l i="50">Ẻ</l:l>
+<l:l i="50">ẻ</l:l>
+<l:l i="50">Ẽ</l:l>
+<l:l i="50">ẽ</l:l>
+<l:l i="50">Ế</l:l>
+<l:l i="50">ế</l:l>
+<l:l i="50">Ề</l:l>
+<l:l i="50">á»</l:l>
+<l:l i="50">Ể</l:l>
+<l:l i="50">ể</l:l>
+<l:l i="50">Ễ</l:l>
+<l:l i="50">á»…</l:l>
+<l:l i="50">Ệ</l:l>
+<l:l i="50">ệ</l:l>
+<l:l i="60">F</l:l>
+<l:l i="60">f</l:l>
+<l:l i="60">Æ‘</l:l>
+<l:l i="60">Æ’</l:l>
+<l:l i="60">Ḟ</l:l>
+<l:l i="60">ḟ</l:l>
+<l:l i="70">G</l:l>
+<l:l i="70">g</l:l>
+<l:l i="70">Ĝ</l:l>
+<l:l i="70">Ä</l:l>
+<l:l i="70">Äž</l:l>
+<l:l i="70">ÄŸ</l:l>
+<l:l i="70">Ä </l:l>
+<l:l i="70">Ä¡</l:l>
+<l:l i="70">Ä¢</l:l>
+<l:l i="70">Ä£</l:l>
+<l:l i="70">Æ“</l:l>
+<l:l i="70">É </l:l>
+<l:l i="70">Ǥ</l:l>
+<l:l i="70">Ç¥</l:l>
+<l:l i="70">Ǧ</l:l>
+<l:l i="70">ǧ</l:l>
+<l:l i="70">Ç´</l:l>
+<l:l i="70">ǵ</l:l>
+<l:l i="70">Ḡ</l:l>
+<l:l i="70">ḡ</l:l>
+<l:l i="80">H</l:l>
+<l:l i="80">h</l:l>
+<l:l i="80">Ĥ</l:l>
+<l:l i="80">Ä¥</l:l>
+<l:l i="80">Ħ</l:l>
+<l:l i="80">ħ</l:l>
+<l:l i="80">Èž</l:l>
+<l:l i="80">ÈŸ</l:l>
+<l:l i="80">ɦ</l:l>
+<l:l i="80">Ḣ</l:l>
+<l:l i="80">ḣ</l:l>
+<l:l i="80">Ḥ</l:l>
+<l:l i="80">ḥ</l:l>
+<l:l i="80">Ḧ</l:l>
+<l:l i="80">ḧ</l:l>
+<l:l i="80">Ḩ</l:l>
+<l:l i="80">ḩ</l:l>
+<l:l i="80">Ḫ</l:l>
+<l:l i="80">ḫ</l:l>
+<l:l i="80">ẖ</l:l>
+<l:l i="90">I</l:l>
+<l:l i="90">i</l:l>
+<l:l i="90">Ì</l:l>
+<l:l i="90">ì</l:l>
+<l:l i="90">Ã</l:l>
+<l:l i="90">í</l:l>
+<l:l i="90">ÃŽ</l:l>
+<l:l i="90">î</l:l>
+<l:l i="90">Ã</l:l>
+<l:l i="90">ï</l:l>
+<l:l i="90">Ĩ</l:l>
+<l:l i="90">Ä©</l:l>
+<l:l i="90">Ī</l:l>
+<l:l i="90">Ä«</l:l>
+<l:l i="90">Ĭ</l:l>
+<l:l i="90">Ä­</l:l>
+<l:l i="90">Ä®</l:l>
+<l:l i="90">į</l:l>
+<l:l i="90">Ä°</l:l>
+<l:l i="90">Æ—</l:l>
+<l:l i="90">ɨ</l:l>
+<l:l i="90">Ç</l:l>
+<l:l i="90">Ç</l:l>
+<l:l i="90">Ȉ</l:l>
+<l:l i="90">ȉ</l:l>
+<l:l i="90">ÈŠ</l:l>
+<l:l i="90">È‹</l:l>
+<l:l i="90">Ḭ</l:l>
+<l:l i="90">ḭ</l:l>
+<l:l i="90">Ḯ</l:l>
+<l:l i="90">ḯ</l:l>
+<l:l i="90">Ỉ</l:l>
+<l:l i="90">ỉ</l:l>
+<l:l i="90">Ị</l:l>
+<l:l i="90">ị</l:l>
+<l:l i="100">J</l:l>
+<l:l i="100">j</l:l>
+<l:l i="100">Ä´</l:l>
+<l:l i="100">ĵ</l:l>
+<l:l i="100">Ç°</l:l>
+<l:l i="100">Ê</l:l>
+<l:l i="110">K</l:l>
+<l:l i="110">k</l:l>
+<l:l i="110">Ķ</l:l>
+<l:l i="110">Ä·</l:l>
+<l:l i="110">Ƙ</l:l>
+<l:l i="110">Æ™</l:l>
+<l:l i="110">Ǩ</l:l>
+<l:l i="110">Ç©</l:l>
+<l:l i="110">Ḱ</l:l>
+<l:l i="110">ḱ</l:l>
+<l:l i="110">Ḳ</l:l>
+<l:l i="110">ḳ</l:l>
+<l:l i="110">Ḵ</l:l>
+<l:l i="110">ḵ</l:l>
+<l:l i="120">L</l:l>
+<l:l i="120">l</l:l>
+<l:l i="120">Ĺ</l:l>
+<l:l i="120">ĺ</l:l>
+<l:l i="120">Ä»</l:l>
+<l:l i="120">ļ</l:l>
+<l:l i="120">Ľ</l:l>
+<l:l i="120">ľ</l:l>
+<l:l i="120">Ä¿</l:l>
+<l:l i="120">Å€</l:l>
+<l:l i="120">Å</l:l>
+<l:l i="120">Å‚</l:l>
+<l:l i="120">Æš</l:l>
+<l:l i="120">Lj</l:l>
+<l:l i="120">È´</l:l>
+<l:l i="120">É«</l:l>
+<l:l i="120">ɬ</l:l>
+<l:l i="120">É­</l:l>
+<l:l i="120">Ḷ</l:l>
+<l:l i="120">ḷ</l:l>
+<l:l i="120">Ḹ</l:l>
+<l:l i="120">ḹ</l:l>
+<l:l i="120">Ḻ</l:l>
+<l:l i="120">ḻ</l:l>
+<l:l i="120">Ḽ</l:l>
+<l:l i="120">ḽ</l:l>
+<l:l i="130">M</l:l>
+<l:l i="130">m</l:l>
+<l:l i="130">ɱ</l:l>
+<l:l i="130">Ḿ</l:l>
+<l:l i="130">ḿ</l:l>
+<l:l i="130">á¹€</l:l>
+<l:l i="130">á¹</l:l>
+<l:l i="130">Ṃ</l:l>
+<l:l i="130">ṃ</l:l>
+<l:l i="140">N</l:l>
+<l:l i="140">n</l:l>
+<l:l i="140">Ñ</l:l>
+<l:l i="140">ñ</l:l>
+<l:l i="140">Ń</l:l>
+<l:l i="140">Å„</l:l>
+<l:l i="140">Å…</l:l>
+<l:l i="140">ņ</l:l>
+<l:l i="140">Ň</l:l>
+<l:l i="140">ň</l:l>
+<l:l i="140">Æ</l:l>
+<l:l i="140">ɲ</l:l>
+<l:l i="140">Æž</l:l>
+<l:l i="140">È </l:l>
+<l:l i="140">Ç‹</l:l>
+<l:l i="140">Ǹ</l:l>
+<l:l i="140">ǹ</l:l>
+<l:l i="140">ȵ</l:l>
+<l:l i="140">ɳ</l:l>
+<l:l i="140">Ṅ</l:l>
+<l:l i="140">á¹…</l:l>
+<l:l i="140">Ṇ</l:l>
+<l:l i="140">ṇ</l:l>
+<l:l i="140">Ṉ</l:l>
+<l:l i="140">ṉ</l:l>
+<l:l i="140">Ṋ</l:l>
+<l:l i="140">ṋ</l:l>
+<l:l i="150">O</l:l>
+<l:l i="150">o</l:l>
+<l:l i="150">Ã’</l:l>
+<l:l i="150">ò</l:l>
+<l:l i="150">Ó</l:l>
+<l:l i="150">ó</l:l>
+<l:l i="150">Ô</l:l>
+<l:l i="150">ô</l:l>
+<l:l i="150">Õ</l:l>
+<l:l i="150">õ</l:l>
+<l:l i="150">Ö</l:l>
+<l:l i="150">ö</l:l>
+<l:l i="150">Ø</l:l>
+<l:l i="150">ø</l:l>
+<l:l i="150">Ō</l:l>
+<l:l i="150">Å</l:l>
+<l:l i="150">ÅŽ</l:l>
+<l:l i="150">Å</l:l>
+<l:l i="150">Å</l:l>
+<l:l i="150">Å‘</l:l>
+<l:l i="150">ÆŸ</l:l>
+<l:l i="150">Æ </l:l>
+<l:l i="150">Æ¡</l:l>
+<l:l i="150">Ç‘</l:l>
+<l:l i="150">Ç’</l:l>
+<l:l i="150">Ǫ</l:l>
+<l:l i="150">Ç«</l:l>
+<l:l i="150">Ǭ</l:l>
+<l:l i="150">Ç­</l:l>
+<l:l i="150">Ǿ</l:l>
+<l:l i="150">Ç¿</l:l>
+<l:l i="150">Ȍ</l:l>
+<l:l i="150">È</l:l>
+<l:l i="150">ÈŽ</l:l>
+<l:l i="150">È</l:l>
+<l:l i="150">Ȫ</l:l>
+<l:l i="150">È«</l:l>
+<l:l i="150">Ȭ</l:l>
+<l:l i="150">È­</l:l>
+<l:l i="150">È®</l:l>
+<l:l i="150">ȯ</l:l>
+<l:l i="150">È°</l:l>
+<l:l i="150">ȱ</l:l>
+<l:l i="150">Ṍ</l:l>
+<l:l i="150">á¹</l:l>
+<l:l i="150">Ṏ</l:l>
+<l:l i="150">á¹</l:l>
+<l:l i="150">á¹</l:l>
+<l:l i="150">ṑ</l:l>
+<l:l i="150">á¹’</l:l>
+<l:l i="150">ṓ</l:l>
+<l:l i="150">Ọ</l:l>
+<l:l i="150">á»</l:l>
+<l:l i="150">Ỏ</l:l>
+<l:l i="150">á»</l:l>
+<l:l i="150">á»</l:l>
+<l:l i="150">ố</l:l>
+<l:l i="150">á»’</l:l>
+<l:l i="150">ồ</l:l>
+<l:l i="150">á»”</l:l>
+<l:l i="150">ổ</l:l>
+<l:l i="150">á»–</l:l>
+<l:l i="150">á»—</l:l>
+<l:l i="150">Ộ</l:l>
+<l:l i="150">á»™</l:l>
+<l:l i="150">Ớ</l:l>
+<l:l i="150">á»›</l:l>
+<l:l i="150">Ờ</l:l>
+<l:l i="150">á»</l:l>
+<l:l i="150">Ở</l:l>
+<l:l i="150">ở</l:l>
+<l:l i="150">á» </l:l>
+<l:l i="150">ỡ</l:l>
+<l:l i="150">Ợ</l:l>
+<l:l i="150">ợ</l:l>
+<l:l i="160">P</l:l>
+<l:l i="160">p</l:l>
+<l:l i="160">Ƥ</l:l>
+<l:l i="160">Æ¥</l:l>
+<l:l i="160">á¹”</l:l>
+<l:l i="160">ṕ</l:l>
+<l:l i="160">á¹–</l:l>
+<l:l i="160">á¹—</l:l>
+<l:l i="170">Q</l:l>
+<l:l i="170">q</l:l>
+<l:l i="170">Ê </l:l>
+<l:l i="180">R</l:l>
+<l:l i="180">r</l:l>
+<l:l i="180">Å”</l:l>
+<l:l i="180">Å•</l:l>
+<l:l i="180">Å–</l:l>
+<l:l i="180">Å—</l:l>
+<l:l i="180">Ř</l:l>
+<l:l i="180">Å™</l:l>
+<l:l i="180">È</l:l>
+<l:l i="180">È‘</l:l>
+<l:l i="180">È’</l:l>
+<l:l i="180">È“</l:l>
+<l:l i="180">ɼ</l:l>
+<l:l i="180">ɽ</l:l>
+<l:l i="180">ɾ</l:l>
+<l:l i="180">Ṙ</l:l>
+<l:l i="180">á¹™</l:l>
+<l:l i="180">Ṛ</l:l>
+<l:l i="180">á¹›</l:l>
+<l:l i="180">Ṝ</l:l>
+<l:l i="180">á¹</l:l>
+<l:l i="180">Ṟ</l:l>
+<l:l i="180">ṟ</l:l>
+<l:l i="190">S</l:l>
+<l:l i="190">s</l:l>
+<l:l i="190">Åš</l:l>
+<l:l i="190">Å›</l:l>
+<l:l i="190">Ŝ</l:l>
+<l:l i="190">Å</l:l>
+<l:l i="190">Åž</l:l>
+<l:l i="190">ÅŸ</l:l>
+<l:l i="190">Å </l:l>
+<l:l i="190">Å¡</l:l>
+<l:l i="190">Ș</l:l>
+<l:l i="190">È™</l:l>
+<l:l i="190">Ê‚</l:l>
+<l:l i="190">á¹ </l:l>
+<l:l i="190">ṡ</l:l>
+<l:l i="190">á¹¢</l:l>
+<l:l i="190">á¹£</l:l>
+<l:l i="190">Ṥ</l:l>
+<l:l i="190">á¹¥</l:l>
+<l:l i="190">Ṧ</l:l>
+<l:l i="190">ṧ</l:l>
+<l:l i="190">Ṩ</l:l>
+<l:l i="190">ṩ</l:l>
+<l:l i="200">T</l:l>
+<l:l i="200">t</l:l>
+<l:l i="200">Å¢</l:l>
+<l:l i="200">Å£</l:l>
+<l:l i="200">Ť</l:l>
+<l:l i="200">Å¥</l:l>
+<l:l i="200">Ŧ</l:l>
+<l:l i="200">ŧ</l:l>
+<l:l i="200">Æ«</l:l>
+<l:l i="200">Ƭ</l:l>
+<l:l i="200">Æ­</l:l>
+<l:l i="200">Æ®</l:l>
+<l:l i="200">ʈ</l:l>
+<l:l i="200">Èš</l:l>
+<l:l i="200">È›</l:l>
+<l:l i="200">ȶ</l:l>
+<l:l i="200">Ṫ</l:l>
+<l:l i="200">ṫ</l:l>
+<l:l i="200">Ṭ</l:l>
+<l:l i="200">á¹­</l:l>
+<l:l i="200">á¹®</l:l>
+<l:l i="200">ṯ</l:l>
+<l:l i="200">á¹°</l:l>
+<l:l i="200">á¹±</l:l>
+<l:l i="200">ẗ</l:l>
+<l:l i="210">U</l:l>
+<l:l i="210">u</l:l>
+<l:l i="210">Ù</l:l>
+<l:l i="210">ù</l:l>
+<l:l i="210">Ú</l:l>
+<l:l i="210">ú</l:l>
+<l:l i="210">Û</l:l>
+<l:l i="210">û</l:l>
+<l:l i="210">Ü</l:l>
+<l:l i="210">ü</l:l>
+<l:l i="210">Ũ</l:l>
+<l:l i="210">Å©</l:l>
+<l:l i="210">Ū</l:l>
+<l:l i="210">Å«</l:l>
+<l:l i="210">Ŭ</l:l>
+<l:l i="210">Å­</l:l>
+<l:l i="210">Å®</l:l>
+<l:l i="210">ů</l:l>
+<l:l i="210">Å°</l:l>
+<l:l i="210">ű</l:l>
+<l:l i="210">Ų</l:l>
+<l:l i="210">ų</l:l>
+<l:l i="210">Ư</l:l>
+<l:l i="210">Æ°</l:l>
+<l:l i="210">Ç“</l:l>
+<l:l i="210">Ç”</l:l>
+<l:l i="210">Ç•</l:l>
+<l:l i="210">Ç–</l:l>
+<l:l i="210">Ç—</l:l>
+<l:l i="210">ǘ</l:l>
+<l:l i="210">Ç™</l:l>
+<l:l i="210">Çš</l:l>
+<l:l i="210">Ç›</l:l>
+<l:l i="210">ǜ</l:l>
+<l:l i="210">È”</l:l>
+<l:l i="210">È•</l:l>
+<l:l i="210">È–</l:l>
+<l:l i="210">È—</l:l>
+<l:l i="210">á¹²</l:l>
+<l:l i="210">á¹³</l:l>
+<l:l i="210">á¹´</l:l>
+<l:l i="210">á¹µ</l:l>
+<l:l i="210">Ṷ</l:l>
+<l:l i="210">á¹·</l:l>
+<l:l i="210">Ṹ</l:l>
+<l:l i="210">á¹¹</l:l>
+<l:l i="210">Ṻ</l:l>
+<l:l i="210">á¹»</l:l>
+<l:l i="210">Ụ</l:l>
+<l:l i="210">ụ</l:l>
+<l:l i="210">Ủ</l:l>
+<l:l i="210">ủ</l:l>
+<l:l i="210">Ứ</l:l>
+<l:l i="210">ứ</l:l>
+<l:l i="210">Ừ</l:l>
+<l:l i="210">ừ</l:l>
+<l:l i="210">Ử</l:l>
+<l:l i="210">á»­</l:l>
+<l:l i="210">á»®</l:l>
+<l:l i="210">ữ</l:l>
+<l:l i="210">á»°</l:l>
+<l:l i="210">á»±</l:l>
+<l:l i="220">V</l:l>
+<l:l i="220">v</l:l>
+<l:l i="220">Ʋ</l:l>
+<l:l i="220">Ê‹</l:l>
+<l:l i="220">á¹¼</l:l>
+<l:l i="220">á¹½</l:l>
+<l:l i="220">á¹¾</l:l>
+<l:l i="220">ṿ</l:l>
+<l:l i="230">W</l:l>
+<l:l i="230">w</l:l>
+<l:l i="230">Å´</l:l>
+<l:l i="230">ŵ</l:l>
+<l:l i="230">Ẁ</l:l>
+<l:l i="230">áº</l:l>
+<l:l i="230">Ẃ</l:l>
+<l:l i="230">ẃ</l:l>
+<l:l i="230">Ẅ</l:l>
+<l:l i="230">ẅ</l:l>
+<l:l i="230">Ẇ</l:l>
+<l:l i="230">ẇ</l:l>
+<l:l i="230">Ẉ</l:l>
+<l:l i="230">ẉ</l:l>
+<l:l i="230">ẘ</l:l>
+<l:l i="240">X</l:l>
+<l:l i="240">x</l:l>
+<l:l i="240">Ẋ</l:l>
+<l:l i="240">ẋ</l:l>
+<l:l i="240">Ẍ</l:l>
+<l:l i="240">áº</l:l>
+<l:l i="250">Y</l:l>
+<l:l i="250">y</l:l>
+<l:l i="250">Ã</l:l>
+<l:l i="250">ý</l:l>
+<l:l i="250">ÿ</l:l>
+<l:l i="250">Ÿ</l:l>
+<l:l i="250">Ŷ</l:l>
+<l:l i="250">Å·</l:l>
+<l:l i="250">Ƴ</l:l>
+<l:l i="250">Æ´</l:l>
+<l:l i="250">Ȳ</l:l>
+<l:l i="250">ȳ</l:l>
+<l:l i="250">Ẏ</l:l>
+<l:l i="250">áº</l:l>
+<l:l i="250">ẙ</l:l>
+<l:l i="250">Ỳ</l:l>
+<l:l i="250">ỳ</l:l>
+<l:l i="250">á»´</l:l>
+<l:l i="250">ỵ</l:l>
+<l:l i="250">Ỷ</l:l>
+<l:l i="250">á»·</l:l>
+<l:l i="250">Ỹ</l:l>
+<l:l i="250">ỹ</l:l>
+<l:l i="260">Z</l:l>
+<l:l i="260">z</l:l>
+<l:l i="260">Ź</l:l>
+<l:l i="260">ź</l:l>
+<l:l i="260">Å»</l:l>
+<l:l i="260">ż</l:l>
+<l:l i="260">Ž</l:l>
+<l:l i="260">ž</l:l>
+<l:l i="260">Ƶ</l:l>
+<l:l i="260">ƶ</l:l>
+<l:l i="260">Ȥ</l:l>
+<l:l i="260">È¥</l:l>
+<l:l i="260">Ê</l:l>
+<l:l i="260">Ê‘</l:l>
+<l:l i="260">áº</l:l>
+<l:l i="260">ẑ</l:l>
+<l:l i="260">Ẓ</l:l>
+<l:l i="260">ẓ</l:l>
+<l:l i="260">Ẕ</l:l>
+<l:l i="260">ẕ</l:l>
+</l:letters>
+</l:l10n>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/hi.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/hi.xml
new file mode 100644
index 0000000..76a075f
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/hi.xml
@@ -0,0 +1,660 @@
+<?xml version="1.0" encoding="utf-8"?>
+<l:l10n xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0" language="hi" english-language-name="Hindi">
+
+<!-- * This file is generated automatically. -->
+<!-- * To submit changes to this file upstream (to the DocBook Project) -->
+<!-- * do not submit an edited version of this file. Instead, submit an -->
+<!-- * edited version of the source file at the following location: -->
+<!-- * -->
+<!-- * https://docbook.svn.sourceforge.net/svnroot/docbook/trunk/gentext/locale/hi.xml -->
+<!-- * -->
+<!-- * E-mail the edited hi.xml source file to: -->
+<!-- * -->
+<!-- * docbook-developers@lists.sourceforge.net -->
+
+<!-- ******************************************************************** -->
+
+<!-- This file is part of the XSL DocBook Stylesheet distribution. -->
+<!-- See ../README or http://docbook.sf.net/release/xsl/current/ for -->
+<!-- copyright and other information. -->
+
+<!-- ******************************************************************** -->
+<!-- In these files, % with a letter is used for a placeholder: -->
+<!-- %t is the current element's title -->
+<!-- %s is the current element's subtitle (if applicable)-->
+<!-- %n is the current element's number label-->
+<!-- %p is the current element's page number (if applicable)-->
+<!-- ******************************************************************** -->
+
+
+<l:gentext key="Abstract" text="सार"/>
+<l:gentext key="abstract" text="सार"/>
+<l:gentext key="Acknowledgements" text="जà¥à¤žà¤¾à¤ªà¤¨"/>
+<l:gentext key="acknowledgements" text="जà¥à¤žà¤¾à¤ªà¤¨"/>
+<l:gentext key="Answer" text="उ:"/>
+<l:gentext key="answer" text="उ:"/>
+<l:gentext key="Appendix" text="परिशिषà¥à¤Ÿ"/>
+<l:gentext key="appendix" text="परिशिषà¥à¤Ÿ"/>
+<l:gentext key="Article" text="आलेख"/>
+<l:gentext key="article" text="आलेख"/>
+<l:gentext key="Author" text="लेखक"/>
+<l:gentext key="Bibliography" text="गà¥à¤°à¤‚थ-सूची"/>
+<l:gentext key="bibliography" text="गà¥à¤°à¤‚थ-सूची"/>
+<l:gentext key="Book" text="पà¥à¤¸à¥à¤¤à¤•"/>
+<l:gentext key="book" text="पà¥à¤¸à¥à¤¤à¤•"/>
+<l:gentext key="CAUTION" text="सावधानी"/>
+<l:gentext key="Caution" text="सावधानी"/>
+<l:gentext key="caution" text="सावधानी"/>
+<l:gentext key="Chapter" text="अधà¥à¤¯à¤¾à¤¯"/>
+<l:gentext key="chapter" text="अधà¥à¤¯à¤¾à¤¯"/>
+<l:gentext key="Colophon" text="पà¥à¤¸à¥à¤¤à¤• परिचय"/>
+<l:gentext key="colophon" text="पà¥à¤¸à¥à¤¤à¤• परिचय"/>
+<l:gentext key="Copyright" text="कॉपीराइट"/>
+<l:gentext key="copyright" text="कॉपीराइट"/>
+<l:gentext key="Dedication" text="समरà¥à¤ªà¤£"/>
+<l:gentext key="dedication" text="समरà¥à¤ªà¤£"/>
+<l:gentext key="Edition" text="संसà¥à¤•à¤°à¤£"/>
+<l:gentext key="edition" text="संसà¥à¤•à¤°à¤£"/>
+<l:gentext key="Editor" text="संपादक"/>
+<l:gentext key="Equation" text="समीकरण"/>
+<l:gentext key="equation" text="समीकरण"/>
+<l:gentext key="Example" text="उदाहरण"/>
+<l:gentext key="example" text="उदाहरण"/>
+<l:gentext key="Figure" text="चितà¥à¤°"/>
+<l:gentext key="figure" text="चितà¥à¤°"/>
+<l:gentext key="Glossary" text="शबà¥à¤¦à¤•à¥‹à¤¶"/>
+<l:gentext key="glossary" text="शबà¥à¤¦à¤•à¥‹à¤¶"/>
+<l:gentext key="GlossSee" text="देखें"/>
+<l:gentext key="glosssee" text="देखें"/>
+<l:gentext key="GlossSeeAlso" text="इसे भी देखें"/>
+<l:gentext key="glossseealso" text="इसे भी देखें"/>
+<l:gentext key="IMPORTANT" text="महतà¥à¤µà¤ªà¥‚रà¥à¤£"/>
+<l:gentext key="important" text="महतà¥à¤µà¤ªà¥‚रà¥à¤£"/>
+<l:gentext key="Important" text="महतà¥à¤µà¤ªà¥‚रà¥à¤£"/>
+<l:gentext key="Index" text="सूची"/>
+<l:gentext key="index" text="सूची"/>
+<l:gentext key="ISBN" text="ISBN"/>
+<l:gentext key="isbn" text="ISBN"/>
+<l:gentext key="LegalNotice" text="वैधानिक सूचना"/>
+<l:gentext key="legalnotice" text="वैधानिक सूचना"/>
+<l:gentext key="MsgAud" text="शà¥à¤°à¥‹à¤¤à¤¾"/>
+<l:gentext key="msgaud" text="शà¥à¤°à¥‹à¤¤à¤¾"/>
+<l:gentext key="MsgLevel" text="सà¥à¤¤à¤°"/>
+<l:gentext key="msglevel" text="सà¥à¤¤à¤°"/>
+<l:gentext key="MsgOrig" text="मूल"/>
+<l:gentext key="msgorig" text="मूल"/>
+<l:gentext key="NOTE" text="नोट"/>
+<l:gentext key="Note" text="नोट"/>
+<l:gentext key="note" text="नोट"/>
+<l:gentext key="Part" text="हिसà¥à¤¸à¤¾"/>
+<l:gentext key="part" text="हिसà¥à¤¸à¤¾"/>
+<l:gentext key="Preface" text="पà¥à¤°à¤¸à¥à¤¤à¤¾à¤µà¤¨à¤¾"/>
+<l:gentext key="preface" text="पà¥à¤°à¤¸à¥à¤¤à¤¾à¤µà¤¨à¤¾"/>
+<l:gentext key="Procedure" text="पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾"/>
+<l:gentext key="procedure" text="पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾"/>
+<l:gentext key="ProductionSet" text="उतà¥à¤ªà¤¾à¤¦à¤¨"/>
+<l:gentext key="PubDate" text="पà¥à¤°à¤•à¤¾à¤¶à¤¨ तिथि"/>
+<l:gentext key="pubdate" text="पà¥à¤°à¤•à¤¾à¤¶à¤¨ तिथि"/>
+<l:gentext key="Published" text="पà¥à¤°à¤•à¤¾à¤¶à¤¿à¤¤"/>
+<l:gentext key="published" text="पà¥à¤°à¤•à¤¾à¤¶à¤¿à¤¤"/>
+<l:gentext key="Publisher" text="पà¥à¤°à¤•à¤¾à¤¶à¤•"/>
+<l:gentext key="Qandadiv" text="पà¥à¤°. व उ."/>
+<l:gentext key="qandadiv" text="पà¥à¤°. व उ."/>
+<l:gentext key="QandASet" text="बारंबार पूछे जाने वाले पà¥à¤°à¤¶à¥à¤¨"/>
+<l:gentext key="Question" text="पà¥à¤°:"/>
+<l:gentext key="question" text="पà¥à¤°:"/>
+<l:gentext key="RefEntry" text="पृषà¥à¤ "/>
+<l:gentext key="refentry" text="पृषà¥à¤ "/>
+<l:gentext key="Reference" text="संदरà¥à¤­"/>
+<l:gentext key="reference" text="संदरà¥à¤­"/>
+<l:gentext key="References" text="संदरà¥à¤­"/>
+<l:gentext key="RefName" text="नाम"/>
+<l:gentext key="refname" text="नाम"/>
+<l:gentext key="RefSection" text="खंड"/>
+<l:gentext key="refsection" text="खंड"/>
+<l:gentext key="RefSynopsisDiv" text="सारांश"/>
+<l:gentext key="refsynopsisdiv" text="सारांश"/>
+<l:gentext key="RevHistory" text="पà¥à¤¨à¤°à¥€à¤•à¥à¤·à¤£ इतिहास"/>
+<l:gentext key="revhistory" text="पà¥à¤¨à¤°à¥€à¤•à¥à¤·à¤£ इतिहास"/>
+<l:gentext key="revision" text="पà¥à¤¨à¤°à¥€à¤•à¥à¤·à¤£"/>
+<l:gentext key="Revision" text="पà¥à¤¨à¤°à¥€à¤•à¥à¤·à¤£"/>
+<l:gentext key="sect1" text="खंड"/>
+<l:gentext key="sect2" text="खंड"/>
+<l:gentext key="sect3" text="खंड"/>
+<l:gentext key="sect4" text="खंड"/>
+<l:gentext key="sect5" text="खंड"/>
+<l:gentext key="section" text="खंड"/>
+<l:gentext key="Section" text="खंड"/>
+<l:gentext key="see" text="देखें"/>
+<l:gentext key="See" text="देखें"/>
+<l:gentext key="seealso" text="इसे भी देखें"/>
+<l:gentext key="Seealso" text="इसे भी देखें"/>
+<l:gentext key="SeeAlso" text="इसे भी देखें"/>
+<l:gentext key="set" text="सेट करें"/>
+<l:gentext key="Set" text="सेट करें"/>
+<l:gentext key="setindex" text="विषय सूची सेट करें"/>
+<l:gentext key="SetIndex" text="विषय सूची सेट करें"/>
+<l:gentext key="Sidebar" text="बाज़ू पटà¥à¤Ÿà¥€"/>
+<l:gentext key="sidebar" text="बाज़ू पटà¥à¤Ÿà¥€"/>
+<l:gentext key="step" text="चरण"/>
+<l:gentext key="Step" text="चरण"/>
+<l:gentext key="table" text="तालिका"/>
+<l:gentext key="Table" text="तालिका"/>
+<l:gentext key="task" text="कारà¥à¤¯"/>
+<l:gentext key="Task" text="कारà¥à¤¯"/>
+<l:gentext key="tip" text="संकेत"/>
+<l:gentext key="TIP" text="संकेत"/>
+<l:gentext key="Tip" text="संकेत"/>
+<l:gentext key="Warning" text="चेतावनी"/>
+<l:gentext key="warning" text="चेतावनी"/>
+<l:gentext key="WARNING" text="चेतावनी"/>
+<l:gentext key="and" text="और"/>
+<l:gentext key="by" text="दà¥à¤µà¤¾à¤°à¤¾"/>
+<l:gentext key="Edited" text="संपादित"/>
+<l:gentext key="edited" text="संपादित"/>
+<l:gentext key="Editedby" text="इनके दà¥à¤µà¤¾à¤°à¤¾ संपादित"/>
+<l:gentext key="editedby" text="इनके दà¥à¤µà¤¾à¤°à¤¾ संपादित"/>
+<l:gentext key="in" text="अंदर"/>
+<l:gentext key="lastlistcomma" text=","/>
+<l:gentext key="listcomma" text=","/>
+<l:gentext key="notes" text="नोटà¥à¤¸"/>
+<l:gentext key="Notes" text="नोटà¥à¤¸"/>
+<l:gentext key="Pgs" text="पृषà¥à¤ "/>
+<l:gentext key="pgs" text="पृषà¥à¤ "/>
+<l:gentext key="Revisedby" text="पà¥à¤¨à¤°à¥€à¤•à¥à¤·à¤£à¤•à¤°à¥à¤¤à¤¾: "/>
+<l:gentext key="revisedby" text="पà¥à¤¨à¤°à¥€à¤•à¥à¤·à¤£à¤•à¤°à¥à¤¤à¤¾: "/>
+<l:gentext key="TableNotes" text="नोटà¥à¤¸"/>
+<l:gentext key="tablenotes" text="नोटà¥à¤¸"/>
+<l:gentext key="TableofContents" text="विषय-सूची"/>
+<l:gentext key="tableofcontents" text="विषय-सूची"/>
+<l:gentext key="unexpectedelementname" text="अपà¥à¤°à¤¤à¥à¤¯à¤¾à¤¶à¤¿à¤¤ ततà¥à¤µ नाम"/>
+<l:gentext key="unsupported" text="असमरà¥à¤¥à¤¿à¤¤"/>
+<l:gentext key="xrefto" text=""/>
+<l:gentext key="Authors" text="लेखक"/>
+<l:gentext key="copyeditor" text="कॉपी संपादक"/>
+<l:gentext key="graphicdesigner" text="आलेखी डिजायनर"/>
+<l:gentext key="productioneditor" text="उतà¥à¤ªà¤¾à¤¦à¤¨ संपादक"/>
+<l:gentext key="technicaleditor" text="तकनीकी संपादक"/>
+<l:gentext key="translator" text="अनà¥à¤µà¤¾à¤¦à¤•"/>
+<l:gentext key="listofequations" text="समीकरण सूची"/>
+<l:gentext key="ListofEquations" text="समीकरण सूची"/>
+<l:gentext key="ListofExamples" text="उदाहरण सूची"/>
+<l:gentext key="listofexamples" text="उदाहरण सूची"/>
+<l:gentext key="ListofFigures" text="चितà¥à¤° सूची"/>
+<l:gentext key="listoffigures" text="चितà¥à¤° सूची"/>
+<l:gentext key="ListofProcedures" text="पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾ सूची"/>
+<l:gentext key="listofprocedures" text="पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾ सूची"/>
+<l:gentext key="listoftables" text="सारणी सूची"/>
+<l:gentext key="ListofTables" text="सारणी सूची"/>
+<l:gentext key="ListofUnknown" text="अजà¥à¤žà¤¾à¤¤ सूची"/>
+<l:gentext key="listofunknown" text="अजà¥à¤žà¤¾à¤¤ सूची"/>
+<l:gentext key="nav-home" text="घर"/>
+<l:gentext key="nav-next" text="आगे"/>
+<l:gentext key="nav-next-sibling" text="दà¥à¤°à¥à¤¤ अगà¥à¤°à¥‡à¤·à¤£"/>
+<l:gentext key="nav-prev" text="पीछे"/>
+<l:gentext key="nav-prev-sibling" text="दà¥à¤°à¥à¤¤ पशà¥à¤šà¤°à¤£"/>
+<l:gentext key="nav-up" text="ऊपर"/>
+<l:gentext key="nav-toc" text="विषय सूची"/>
+<l:gentext key="Draft" text="मसौदा"/>
+<l:gentext key="above" text="ऊपर"/>
+<l:gentext key="below" text="नीचे"/>
+<l:gentext key="sectioncalled" text="यह खंड कहलाता है"/>
+<l:gentext key="index symbols" text="संकेत"/>
+<l:gentext key="writing-mode" text="lr-tb"/>
+<l:gentext key="lowercase.alpha" text="abcdefghijklmnopqrstuvwxyz"/>
+<l:gentext key="uppercase.alpha" text="ABCDEFGHIJKLMNOPQRSTUVWXYZ"/>
+<l:gentext key="normalize.sort.input" text="AaÀàÃáÂâÃãÄäÅåĀÄĂ㥹ÇǎǞǟǠǡǺǻȀÈȂȃȦȧḀá¸áºšáº áº¡áº¢áº£áº¤áº¥áº¦áº§áº¨áº©áºªáº«áº¬áº­áº®áº¯áº°áº±áº²áº³áº´áºµáº¶áº·BbÆ€ÆɓƂƃḂḃḄḅḆḇCcÇçĆćĈĉĊċČÄƇƈɕḈḉDdÄŽÄÄđƊɗƋƌDžDzȡɖḊḋḌá¸á¸Žá¸á¸á¸‘ḒḓEeÈèÉéÊêËëĒēĔĕĖėĘęĚěȄȅȆȇȨȩḔḕḖḗḘḙḚḛḜá¸áº¸áº¹áººáº»áº¼áº½áº¾áº¿á»€á»á»‚ểỄễỆệFfƑƒḞḟGgÄœÄĞğĠġĢģƓɠǤǥǦǧǴǵḠḡHhĤĥĦħȞȟɦḢḣḤḥḦḧḨḩḪḫẖIiÌìÃíÎîÃïĨĩĪīĬĭĮįİƗɨÇÇȈȉȊȋḬḭḮḯỈỉỊịJjĴĵǰÊKkĶķƘƙǨǩḰḱḲḳḴḵLlĹĺĻļĽľĿŀÅłƚLjȴɫɬɭḶḷḸḹḺḻḼḽMmɱḾḿṀá¹á¹‚ṃNnÑñŃńŅņŇňÆɲƞȠNjǸǹȵɳṄṅṆṇṈṉṊṋOoÒòÓóÔôÕõÖöØøŌÅÅŽÅÅőƟƠơǑǒǪǫǬǭǾǿȌÈÈŽÈȪȫȬȭȮȯȰȱṌá¹á¹Žá¹á¹á¹‘ṒṓỌá»á»Žá»á»á»‘ỒồỔổỖỗỘộỚớỜá»á»žá»Ÿá» á»¡á»¢á»£PpƤƥṔṕṖṗQqÊ RrŔŕŖŗŘřÈȑȒȓɼɽɾṘṙṚṛṜá¹á¹žá¹ŸSsŚśŜÅŞşŠšȘșʂṠṡṢṣṤṥṦṧṨṩTtŢţŤťŦŧƫƬƭƮʈȚțȶṪṫṬṭṮṯṰṱẗUuÙùÚúÛûÜüŨũŪūŬŭŮůŰűŲųƯưǓǔǕǖǗǘǙǚǛǜȔȕȖȗṲṳṴṵṶṷṸṹṺṻỤụỦủỨứỪừỬửỮữỰựVvƲʋṼṽṾṿWwŴŵẀáºáº‚ẃẄẅẆẇẈẉẘXxẊẋẌáºYyÃýÿŸŶŷƳƴȲȳẎáºáº™á»²á»³á»´á»µá»¶á»·á»¸á»¹ZzŹźŻżŽžƵƶȤȥÊÊ‘áºáº‘ẒẓẔẕẕ" lang="en"/>
+<l:gentext key="normalize.sort.output" text="AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBCCCCCCCCCCCCCCCCCDDDDDDDDDDDDDDDDDDDDDDDDEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEFFFFFFGGGGGGGGGGGGGGGGGGGGHHHHHHHHHHHHHHHHHHHHIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIJJJJJJKKKKKKKKKKKKKKLLLLLLLLLLLLLLLLLLLLLLLLLLMMMMMMMMMNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOPPPPPPPPQQQRRRRRRRRRRRRRRRRRRRRRRRSSSSSSSSSSSSSSSSSSSSSSSTTTTTTTTTTTTTTTTTTTTTTTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUVVVVVVVVWWWWWWWWWWWWWWWXXXXXXYYYYYYYYYYYYYYYYYYYYYYYZZZZZZZZZZZZZZZZZZZZZ" lang="en"/>
+<l:dingbat key="startquote" text="“"/>
+<l:dingbat key="endquote" text="â€"/>
+<l:dingbat key="nestedstartquote" text="‘"/>
+<l:dingbat key="nestedendquote" text="’"/>
+<l:dingbat key="singlestartquote" text="‘"/>
+<l:dingbat key="singleendquote" text="’"/>
+<l:dingbat key="bullet" text="•"/>
+<l:gentext key="hyphenation-character" text="-"/>
+<l:gentext key="hyphenation-push-character-count" text="2"/>
+<l:gentext key="hyphenation-remain-character-count" text="2"/>
+<l:context name="styles"><l:template name="person-name" text="first-last"/>
+</l:context>
+<l:context name="title"><l:template name="abstract" text="%t"/>
+<l:template name="acknowledgements" text="%t" lang="en"/>
+<l:template name="answer" text="%t"/>
+<l:template name="appendix" text="परिशिषà¥à¤ŸÂ %n. %t"/>
+<l:template name="article" text="%t"/>
+<l:template name="authorblurb" text="%t"/>
+<l:template name="bibliodiv" text="%t"/>
+<l:template name="biblioentry" text="%t"/>
+<l:template name="bibliography" text="%t"/>
+<l:template name="bibliolist" text="%t"/>
+<l:template name="bibliomixed" text="%t"/>
+<l:template name="bibliomset" text="%t"/>
+<l:template name="biblioset" text="%t"/>
+<l:template name="blockquote" text="%t"/>
+<l:template name="book" text="%t"/>
+<l:template name="calloutlist" text="%t"/>
+<l:template name="caution" text="%t"/>
+<l:template name="chapter" text="अधà¥à¤¯à¤¾à¤¯Â %n. %t"/>
+<l:template name="colophon" text="%t"/>
+<l:template name="dedication" text="%t"/>
+<l:template name="equation" text="समीकरण %n. %t"/>
+<l:template name="example" text="उदाहरण %n. %t"/>
+<l:template name="figure" text="चितà¥à¤°Â %n. %t"/>
+<l:template name="foil" text="%t"/>
+<l:template name="foilgroup" text="%t"/>
+<l:template name="formalpara" text="%t"/>
+<l:template name="glossary" text="%t"/>
+<l:template name="glossdiv" text="%t"/>
+<l:template name="glosslist" text="%t"/>
+<l:template name="glossentry" text="%t"/>
+<l:template name="important" text="%t"/>
+<l:template name="index" text="%t"/>
+<l:template name="indexdiv" text="%t"/>
+<l:template name="itemizedlist" text="%t"/>
+<l:template name="legalnotice" text="%t"/>
+<l:template name="listitem" text=""/>
+<l:template name="lot" text="%t"/>
+<l:template name="msg" text="%t"/>
+<l:template name="msgexplan" text="%t"/>
+<l:template name="msgmain" text="%t"/>
+<l:template name="msgrel" text="%t"/>
+<l:template name="msgset" text="%t"/>
+<l:template name="msgsub" text="%t"/>
+<l:template name="note" text="%t"/>
+<l:template name="orderedlist" text="%t"/>
+<l:template name="part" text="हिसà¥à¤¸à¤¾Â %n. %t"/>
+<l:template name="partintro" text="%t"/>
+<l:template name="preface" text="%t"/>
+<l:template name="procedure" text="%t"/>
+<l:template name="procedure.formal" text="पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾Â %n. %t"/>
+<l:template name="productionset" text="%t"/>
+<l:template name="productionset.formal" text="उतà¥à¤ªà¤¾à¤¦à¤¨Â %n"/>
+<l:template name="qandadiv" text="%t"/>
+<l:template name="qandaentry" text="%t"/>
+<l:template name="qandaset" text="%t"/>
+<l:template name="question" text="%t"/>
+<l:template name="refentry" text="%t"/>
+<l:template name="reference" text="%t"/>
+<l:template name="refsection" text="%t"/>
+<l:template name="refsect1" text="%t"/>
+<l:template name="refsect2" text="%t"/>
+<l:template name="refsect3" text="%t"/>
+<l:template name="refsynopsisdiv" text="%t"/>
+<l:template name="refsynopsisdivinfo" text="%t"/>
+<l:template name="segmentedlist" text="%t"/>
+<l:template name="set" text="%t"/>
+<l:template name="setindex" text="%t"/>
+<l:template name="sidebar" text="%t"/>
+<l:template name="step" text="%t"/>
+<l:template name="table" text="तालिका %n. %t"/>
+<l:template name="task" text="%t"/>
+<l:template name="tasksummary" text="%t" lang="en"/>
+<l:template name="taskprerequisites" text="%t" lang="en"/>
+<l:template name="taskrelated" text="%t" lang="en"/>
+<l:template name="tip" text="%t"/>
+<l:template name="toc" text="%t"/>
+<l:template name="variablelist" text="%t"/>
+<l:template name="varlistentry" text=""/>
+<l:template name="warning" text="%t"/>
+</l:context>
+<l:context name="title-unnumbered"><l:template name="appendix" text="%t"/>
+<l:template name="article/appendix" text="%t"/>
+<l:template name="bridgehead" text="%t"/>
+<l:template name="chapter" text="%t"/>
+<l:template name="sect1" text="%t"/>
+<l:template name="sect2" text="%t"/>
+<l:template name="sect3" text="%t"/>
+<l:template name="sect4" text="%t"/>
+<l:template name="sect5" text="%t"/>
+<l:template name="section" text="%t"/>
+<l:template name="simplesect" text="%t"/>
+<l:template name="part" text="%t" lang="en"/>
+</l:context>
+<l:context name="title-numbered"><l:template name="appendix" text="परिशिषà¥à¤ŸÂ %n. %t"/>
+<l:template name="article/appendix" text="%n. %t"/>
+<l:template name="bridgehead" text="%n. %t"/>
+<l:template name="chapter" text="अधà¥à¤¯à¤¾à¤¯Â %n. %t"/>
+<l:template name="part" text="हिसà¥à¤¸à¤¾Â %n. %t"/>
+<l:template name="sect1" text="%n. %t"/>
+<l:template name="sect2" text="%n. %t"/>
+<l:template name="sect3" text="%n. %t"/>
+<l:template name="sect4" text="%n. %t"/>
+<l:template name="sect5" text="%n. %t"/>
+<l:template name="section" text="%n. %t"/>
+<l:template name="simplesect" text="%t"/>
+</l:context>
+<l:context name="subtitle"><l:template name="appendix" text="%s"/>
+<l:template name="acknowledgements" text="%s" lang="en"/>
+<l:template name="article" text="%s"/>
+<l:template name="bibliodiv" text="%s"/>
+<l:template name="biblioentry" text="%s"/>
+<l:template name="bibliography" text="%s"/>
+<l:template name="bibliomixed" text="%s"/>
+<l:template name="bibliomset" text="%s"/>
+<l:template name="biblioset" text="%s"/>
+<l:template name="book" text="%s"/>
+<l:template name="chapter" text="%s"/>
+<l:template name="colophon" text="%s"/>
+<l:template name="dedication" text="%s"/>
+<l:template name="glossary" text="%s"/>
+<l:template name="glossdiv" text="%s"/>
+<l:template name="index" text="%s"/>
+<l:template name="indexdiv" text="%s"/>
+<l:template name="lot" text="%s"/>
+<l:template name="part" text="%s"/>
+<l:template name="partintro" text="%s"/>
+<l:template name="preface" text="%s"/>
+<l:template name="refentry" text="%s"/>
+<l:template name="reference" text="%s"/>
+<l:template name="refsection" text="%s"/>
+<l:template name="refsect1" text="%s"/>
+<l:template name="refsect2" text="%s"/>
+<l:template name="refsect3" text="%s"/>
+<l:template name="refsynopsisdiv" text="%s"/>
+<l:template name="sect1" text="%s"/>
+<l:template name="sect2" text="%s"/>
+<l:template name="sect3" text="%s"/>
+<l:template name="sect4" text="%s"/>
+<l:template name="sect5" text="%s"/>
+<l:template name="section" text="%s"/>
+<l:template name="set" text="%s"/>
+<l:template name="setindex" text="%s"/>
+<l:template name="sidebar" text="%s"/>
+<l:template name="simplesect" text="%s"/>
+<l:template name="toc" text="%s"/>
+</l:context>
+<l:context name="xref"><l:template name="abstract" text="%t"/>
+<l:template name="acknowledgements" text="%t" lang="en"/>
+<l:template name="answer" text="उ: %n"/>
+<l:template name="appendix" text="%t"/>
+<l:template name="article" text="%t"/>
+<l:template name="authorblurb" text="%t"/>
+<l:template name="bibliodiv" text="%t"/>
+<l:template name="bibliography" text="%t"/>
+<l:template name="bibliomset" text="%t"/>
+<l:template name="biblioset" text="%t"/>
+<l:template name="blockquote" text="%t"/>
+<l:template name="book" text="%t"/>
+<l:template name="calloutlist" text="%t"/>
+<l:template name="caution" text="%t"/>
+<l:template name="chapter" text="%t"/>
+<l:template name="colophon" text="%t"/>
+<l:template name="constraintdef" text="%t"/>
+<l:template name="dedication" text="%t"/>
+<l:template name="equation" text="%t"/>
+<l:template name="example" text="%t"/>
+<l:template name="figure" text="%t"/>
+<l:template name="foil" text="%t"/>
+<l:template name="foilgroup" text="%t"/>
+<l:template name="formalpara" text="%t"/>
+<l:template name="glossary" text="%t"/>
+<l:template name="glossdiv" text="%t"/>
+<l:template name="important" text="%t"/>
+<l:template name="index" text="%t"/>
+<l:template name="indexdiv" text="%t"/>
+<l:template name="itemizedlist" text="%t"/>
+<l:template name="legalnotice" text="%t"/>
+<l:template name="listitem" text="%n"/>
+<l:template name="lot" text="%t"/>
+<l:template name="msg" text="%t"/>
+<l:template name="msgexplan" text="%t"/>
+<l:template name="msgmain" text="%t"/>
+<l:template name="msgrel" text="%t"/>
+<l:template name="msgset" text="%t"/>
+<l:template name="msgsub" text="%t"/>
+<l:template name="note" text="%t"/>
+<l:template name="orderedlist" text="%t"/>
+<l:template name="part" text="%t"/>
+<l:template name="partintro" text="%t"/>
+<l:template name="preface" text="%t"/>
+<l:template name="procedure" text="%t"/>
+<l:template name="productionset" text="%t"/>
+<l:template name="qandadiv" text="%t"/>
+<l:template name="qandaentry" text="पà¥à¤°: %n"/>
+<l:template name="qandaset" text="%t"/>
+<l:template name="question" text="पà¥à¤°: %n"/>
+<l:template name="reference" text="%t"/>
+<l:template name="refsynopsisdiv" text="%t"/>
+<l:template name="segmentedlist" text="%t"/>
+<l:template name="set" text="%t"/>
+<l:template name="setindex" text="%t"/>
+<l:template name="sidebar" text="%t"/>
+<l:template name="table" text="%t"/>
+<l:template name="task" text="%t" lang="en"/>
+<l:template name="tip" text="%t"/>
+<l:template name="toc" text="%t"/>
+<l:template name="variablelist" text="%t"/>
+<l:template name="varlistentry" text="%n"/>
+<l:template name="warning" text="%t"/>
+<l:template name="olink.document.citation" text=" in %o"/>
+<l:template name="olink.page.citation" text=" (page %p)"/>
+<l:template name="page.citation" text=" [%p]"/>
+<l:template name="page" text="(page %p)"/>
+<l:template name="docname" text=" in %o"/>
+<l:template name="docnamelong" text=" in the document titled %o"/>
+<l:template name="pageabbrev" text="(p. %p)"/>
+<l:template name="Page" text="Page %p"/>
+<l:template name="bridgehead" text="यह खंड कहलाता है “%tâ€"/>
+<l:template name="refsection" text="यह खंड कहलाता है “%tâ€"/>
+<l:template name="refsect1" text="यह खंड कहलाता है “%tâ€"/>
+<l:template name="refsect2" text="यह खंड कहलाता है “%tâ€"/>
+<l:template name="refsect3" text="यह खंड कहलाता है “%tâ€"/>
+<l:template name="sect1" text="यह खंड कहलाता है “%tâ€"/>
+<l:template name="sect2" text="यह खंड कहलाता है “%tâ€"/>
+<l:template name="sect3" text="यह खंड कहलाता है “%tâ€"/>
+<l:template name="sect4" text="यह खंड कहलाता है “%tâ€"/>
+<l:template name="sect5" text="यह खंड कहलाता है “%tâ€"/>
+<l:template name="section" text="यह खंड कहलाता है “%tâ€"/>
+<l:template name="simplesect" text="यह खंड कहलाता है “%tâ€"/>
+</l:context>
+<l:context name="xref-number"><l:template name="answer" text="उ: %n"/>
+<l:template name="appendix" text="परिशिषà¥à¤ŸÂ %n"/>
+<l:template name="bridgehead" text="खंड %n"/>
+<l:template name="chapter" text="अधà¥à¤¯à¤¾à¤¯Â %n"/>
+<l:template name="equation" text="समीकरण %n"/>
+<l:template name="example" text="उदाहरण %n"/>
+<l:template name="figure" text="चितà¥à¤°Â %n"/>
+<l:template name="part" text="हिसà¥à¤¸à¤¾Â %n"/>
+<l:template name="procedure" text="पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾Â %n"/>
+<l:template name="productionset" text="उतà¥à¤ªà¤¾à¤¦à¤¨Â %n"/>
+<l:template name="qandadiv" text="पà¥à¤°. व उ. %n"/>
+<l:template name="qandaentry" text="पà¥à¤°: %n"/>
+<l:template name="question" text="पà¥à¤°: %n"/>
+<l:template name="sect1" text="खंड %n"/>
+<l:template name="sect2" text="खंड %n"/>
+<l:template name="sect3" text="खंड %n"/>
+<l:template name="sect4" text="खंड %n"/>
+<l:template name="sect5" text="खंड %n"/>
+<l:template name="section" text="खंड %n"/>
+<l:template name="table" text="तालिका %n"/>
+</l:context>
+<l:context name="xref-number-and-title"><l:template name="appendix" text="परिशिषà¥à¤ŸÂ %n, %t"/>
+<l:template name="bridgehead" text="खंड %n, “%tâ€"/>
+<l:template name="chapter" text="अधà¥à¤¯à¤¾à¤¯Â %n, %t"/>
+<l:template name="equation" text="समीकरण %n, “%tâ€"/>
+<l:template name="example" text="उदाहरण %n, “%tâ€"/>
+<l:template name="figure" text="चितà¥à¤°Â %n, “%tâ€"/>
+<l:template name="part" text="हिसà¥à¤¸à¤¾Â %n, “%tâ€"/>
+<l:template name="procedure" text="पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾Â %n, “%tâ€"/>
+<l:template name="productionset" text="उतà¥à¤ªà¤¾à¤¦à¤¨Â %n, “%tâ€"/>
+<l:template name="qandadiv" text="पà¥à¤°. व उ. %n, “%tâ€"/>
+<l:template name="refsect1" text="यह खंड कहलाता है “%tâ€"/>
+<l:template name="refsect2" text="यह खंड कहलाता है “%tâ€"/>
+<l:template name="refsect3" text="यह खंड कहलाता है “%tâ€"/>
+<l:template name="refsection" text="यह खंड कहलाता है “%tâ€"/>
+<l:template name="sect1" text="खंड %n, “%tâ€"/>
+<l:template name="sect2" text="खंड %n, “%tâ€"/>
+<l:template name="sect3" text="खंड %n, “%tâ€"/>
+<l:template name="sect4" text="खंड %n, “%tâ€"/>
+<l:template name="sect5" text="खंड %n, “%tâ€"/>
+<l:template name="section" text="खंड %n, “%tâ€"/>
+<l:template name="simplesect" text="यह खंड कहलाता है “%tâ€"/>
+<l:template name="table" text="तालिका %n, “%tâ€"/>
+</l:context>
+<l:context name="authorgroup"><l:template name="sep" text=", "/>
+<l:template name="sep2" text=" और "/>
+<l:template name="seplast" text=", और "/>
+</l:context>
+<l:context name="glossary"><l:template name="see" text="देखें %t."/>
+<l:template name="seealso" text="इसे भी देखें %t."/>
+<l:template name="seealso-separator" text=", "/>
+</l:context>
+<l:context name="msgset"><l:template name="MsgAud" text="शà¥à¤°à¥‹à¤¤à¤¾: "/>
+<l:template name="MsgLevel" text="सà¥à¤¤à¤°: "/>
+<l:template name="MsgOrig" text="मूल: "/>
+</l:context>
+<l:context name="datetime"><l:template name="format" text="m/d/Y"/>
+</l:context>
+<l:context name="termdef"><l:template name="prefix" text="[Definition: "/>
+<l:template name="suffix" text="]"/>
+</l:context>
+<l:context name="datetime-full"><l:template name="January" text="जनवरी"/>
+<l:template name="February" text="फरवरी"/>
+<l:template name="March" text="मारà¥à¤š"/>
+<l:template name="April" text="अपà¥à¤°à¥ˆà¤²"/>
+<l:template name="May" text="मई"/>
+<l:template name="June" text="जून"/>
+<l:template name="July" text="जà¥à¤²à¤¾à¤ˆ"/>
+<l:template name="August" text="अगसà¥à¤¤"/>
+<l:template name="September" text="सितंबर"/>
+<l:template name="October" text="अकà¥à¤Ÿà¥‚बर"/>
+<l:template name="November" text="नवंबर"/>
+<l:template name="December" text="दिसंबर"/>
+<l:template name="Monday" text="सोमवार"/>
+<l:template name="Tuesday" text="मंगलवार"/>
+<l:template name="Wednesday" text="बà¥à¤§à¤µà¤¾à¤°"/>
+<l:template name="Thursday" text="गà¥à¤°à¥à¤µà¤¾à¤°"/>
+<l:template name="Friday" text="शà¥à¤•à¥à¤°à¤µà¤¾à¤°"/>
+<l:template name="Saturday" text="शनिवार"/>
+<l:template name="Sunday" text="रविवार"/>
+</l:context>
+<l:context name="datetime-abbrev"><l:template name="Jan" text="जन"/>
+<l:template name="Feb" text="फर"/>
+<l:template name="Mar" text="मारà¥à¤š"/>
+<l:template name="Apr" text="अपà¥à¤°à¥ˆ"/>
+<l:template name="May" text="मई"/>
+<l:template name="Jun" text="जून"/>
+<l:template name="Jul" text="जà¥à¤²à¤¾"/>
+<l:template name="Aug" text="अग"/>
+<l:template name="Sep" text="सितं"/>
+<l:template name="Oct" text="अकà¥à¤Ÿà¥‚"/>
+<l:template name="Nov" text="नवं"/>
+<l:template name="Dec" text="दिस"/>
+<l:template name="Mon" text="सोम"/>
+<l:template name="Tue" text="मंगल"/>
+<l:template name="Wed" text="बà¥à¤§"/>
+<l:template name="Thu" text="गà¥à¤°à¥"/>
+<l:template name="Fri" text="शà¥à¤•à¥à¤°"/>
+<l:template name="Sat" text="शनि"/>
+<l:template name="Sun" text="रवि"/>
+</l:context>
+<l:context name="htmlhelp"><l:template name="langcode" text="0x0439 Hindi"/>
+</l:context>
+<l:context name="index"><l:template name="term-separator" text=", "/>
+<l:template name="number-separator" text=", "/>
+<l:template name="range-separator" text="-"/>
+</l:context>
+<l:context name="iso690"><l:template name="lastfirst.sep" text=", "/>
+<l:template name="alt.person.two.sep" text=" – "/>
+<l:template name="alt.person.last.sep" text=" – "/>
+<l:template name="alt.person.more.sep" text=" – "/>
+<l:template name="primary.editor" text=" (ed.)"/>
+<l:template name="primary.many" text=", et al."/>
+<l:template name="primary.sep" text=". "/>
+<l:template name="submaintitle.sep" text=": "/>
+<l:template name="title.sep" text=". "/>
+<l:template name="othertitle.sep" text=", "/>
+<l:template name="medium1" text=" ["/>
+<l:template name="medium2" text="]"/>
+<l:template name="secondary.person.sep" text="; "/>
+<l:template name="secondary.sep" text=". "/>
+<l:template name="respons.sep" text=". "/>
+<l:template name="edition.sep" text=". "/>
+<l:template name="edition.serial.sep" text=", "/>
+<l:template name="issuing.range" text="-"/>
+<l:template name="issuing.div" text=", "/>
+<l:template name="issuing.sep" text=". "/>
+<l:template name="partnr.sep" text=". "/>
+<l:template name="placepubl.sep" text=": "/>
+<l:template name="publyear.sep" text=", "/>
+<l:template name="pubinfo.sep" text=". "/>
+<l:template name="spec.pubinfo.sep" text=", "/>
+<l:template name="upd.sep" text=", "/>
+<l:template name="datecit1" text=" [cited "/>
+<l:template name="datecit2" text="]"/>
+<l:template name="extent.sep" text=". "/>
+<l:template name="locs.sep" text=", "/>
+<l:template name="location.sep" text=". "/>
+<l:template name="serie.sep" text=". "/>
+<l:template name="notice.sep" text=". "/>
+<l:template name="access" text="Available "/>
+<l:template name="acctoo" text="Also available "/>
+<l:template name="onwww" text="from World Wide Web"/>
+<l:template name="oninet" text="from Internet"/>
+<l:template name="access.end" text=": "/>
+<l:template name="link1" text="&lt;"/>
+<l:template name="link2" text="&gt;"/>
+<l:template name="access.sep" text=". "/>
+<l:template name="isbn" text="ISBN "/>
+<l:template name="issn" text="ISSN "/>
+<l:template name="stdnum.sep" text=". "/>
+<l:template name="patcountry.sep" text=". "/>
+<l:template name="pattype.sep" text=", "/>
+<l:template name="patnum.sep" text=". "/>
+<l:template name="patdate.sep" text=". "/>
+</l:context><l:letters><l:l i="-1"/>
+<l:l i="0">संकेत</l:l>
+<l:l i="10">A</l:l>
+<l:l i="10">a</l:l>
+<l:l i="20">B</l:l>
+<l:l i="20">b</l:l>
+<l:l i="30">C</l:l>
+<l:l i="30">c</l:l>
+<l:l i="40">D</l:l>
+<l:l i="40">d</l:l>
+<l:l i="50">E</l:l>
+<l:l i="50">e</l:l>
+<l:l i="60">F</l:l>
+<l:l i="60">f</l:l>
+<l:l i="70">G</l:l>
+<l:l i="70">g</l:l>
+<l:l i="80">H</l:l>
+<l:l i="80">h</l:l>
+<l:l i="90">I</l:l>
+<l:l i="90">i</l:l>
+<l:l i="100">J</l:l>
+<l:l i="100">j</l:l>
+<l:l i="110">K</l:l>
+<l:l i="110">k</l:l>
+<l:l i="120">L</l:l>
+<l:l i="120">l</l:l>
+<l:l i="130">M</l:l>
+<l:l i="130">m</l:l>
+<l:l i="140">N</l:l>
+<l:l i="140">n</l:l>
+<l:l i="150">O</l:l>
+<l:l i="150">o</l:l>
+<l:l i="160">P</l:l>
+<l:l i="160">p</l:l>
+<l:l i="170">Q</l:l>
+<l:l i="170">q</l:l>
+<l:l i="180">R</l:l>
+<l:l i="180">r</l:l>
+<l:l i="190">S</l:l>
+<l:l i="190">s</l:l>
+<l:l i="200">T</l:l>
+<l:l i="200">t</l:l>
+<l:l i="210">U</l:l>
+<l:l i="210">u</l:l>
+<l:l i="220">V</l:l>
+<l:l i="220">v</l:l>
+<l:l i="230">W</l:l>
+<l:l i="230">w</l:l>
+<l:l i="240">X</l:l>
+<l:l i="240">x</l:l>
+<l:l i="250">Y</l:l>
+<l:l i="250">y</l:l>
+<l:l i="260">Z</l:l>
+<l:l i="260">z</l:l>
+</l:letters>
+</l:l10n>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/hr.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/hr.xml
new file mode 100644
index 0000000..2db7030
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/hr.xml
@@ -0,0 +1,662 @@
+<?xml version="1.0" encoding="utf-8"?>
+<l:l10n xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0" language="hr" english-language-name="Croatian">
+
+<!-- * This file is generated automatically. -->
+<!-- * To submit changes to this file upstream (to the DocBook Project) -->
+<!-- * do not submit an edited version of this file. Instead, submit an -->
+<!-- * edited version of the source file at the following location: -->
+<!-- * -->
+<!-- * https://docbook.svn.sourceforge.net/svnroot/docbook/trunk/gentext/locale/hr.xml -->
+<!-- * -->
+<!-- * E-mail the edited hr.xml source file to: -->
+<!-- * -->
+<!-- * docbook-developers@lists.sourceforge.net -->
+
+<!-- ******************************************************************** -->
+
+<!-- This file is part of the XSL DocBook Stylesheet distribution. -->
+<!-- See ../README or http://docbook.sf.net/release/xsl/current/ for -->
+<!-- copyright and other information. -->
+
+<!-- ******************************************************************** -->
+<!-- In these files, % with a letter is used for a placeholder: -->
+<!-- %t is the current element's title -->
+<!-- %s is the current element's subtitle (if applicable)-->
+<!-- %n is the current element's number label-->
+<!-- %p is the current element's page number (if applicable)-->
+<!-- ******************************************************************** -->
+
+
+<l:gentext key="Abstract" text="Sažetak"/>
+<l:gentext key="abstract" text="sažetak"/>
+<l:gentext key="Acknowledgements" text="Acknowledgements"/>
+<l:gentext key="acknowledgements" text="acknowledgements"/>
+<l:gentext key="Answer" text="Odgovor:"/>
+<l:gentext key="answer" text="odgovor:"/>
+<l:gentext key="Appendix" text="Dodatak"/>
+<l:gentext key="appendix" text="dodatak"/>
+<l:gentext key="Article" text="ÄŒlanak"/>
+<l:gentext key="article" text="Älanak"/>
+<l:gentext key="Author" text="Author"/>
+<l:gentext key="Bibliography" text="Literatura"/>
+<l:gentext key="bibliography" text="literatura"/>
+<l:gentext key="Book" text="Knjiga"/>
+<l:gentext key="book" text="knjiga"/>
+<l:gentext key="CAUTION" text="OPREZ"/>
+<l:gentext key="Caution" text="Oprez"/>
+<l:gentext key="caution" text="oprez"/>
+<l:gentext key="Chapter" text="Poglavlje"/>
+<l:gentext key="chapter" text="poglavlje"/>
+<l:gentext key="Colophon" text="Impresum"/>
+<l:gentext key="colophon" text="impresum"/>
+<l:gentext key="Copyright" text="Autorska prava"/>
+<l:gentext key="copyright" text="autorska prava"/>
+<l:gentext key="Dedication" text="Posveta"/>
+<l:gentext key="dedication" text="posveta"/>
+<l:gentext key="Edition" text="Izdanje"/>
+<l:gentext key="edition" text="izdanje"/>
+<l:gentext key="Editor" text="Editor"/>
+<l:gentext key="Equation" text="Jednadžba"/>
+<l:gentext key="equation" text="jednadžba"/>
+<l:gentext key="Example" text="Primjer"/>
+<l:gentext key="example" text="primjer"/>
+<l:gentext key="Figure" text="Slika"/>
+<l:gentext key="figure" text="slika"/>
+<l:gentext key="Glossary" text="RjeÄnik"/>
+<l:gentext key="glossary" text="rjeÄnik"/>
+<l:gentext key="GlossSee" text="Vidi"/>
+<l:gentext key="glosssee" text="vidi"/>
+<l:gentext key="GlossSeeAlso" text="Vidi i"/>
+<l:gentext key="glossseealso" text="vidi i"/>
+<l:gentext key="IMPORTANT" text="VAŽNO"/>
+<l:gentext key="important" text="važno"/>
+<l:gentext key="Important" text="Važno"/>
+<l:gentext key="Index" text="Kazalo"/>
+<l:gentext key="index" text="kazalo"/>
+<l:gentext key="ISBN" text="ISBN"/>
+<l:gentext key="isbn" text="ISBN"/>
+<l:gentext key="LegalNotice" text="Pravne odredbe"/>
+<l:gentext key="legalnotice" text="pravne odredbe"/>
+<l:gentext key="MsgAud" text="Primatelji"/>
+<l:gentext key="msgaud" text="primatelji"/>
+<l:gentext key="MsgLevel" text="Razina"/>
+<l:gentext key="msglevel" text="razina"/>
+<l:gentext key="MsgOrig" text="Izvor"/>
+<l:gentext key="msgorig" text="izvor"/>
+<l:gentext key="NOTE" text="BILJEÅ KA"/>
+<l:gentext key="Note" text="Bilješka"/>
+<l:gentext key="note" text="bilješka"/>
+<l:gentext key="Part" text="Dio"/>
+<l:gentext key="part" text="dio"/>
+<l:gentext key="Preface" text="Predgovor"/>
+<l:gentext key="preface" text="predgovor"/>
+<l:gentext key="Procedure" text="Postupak"/>
+<l:gentext key="procedure" text="postupak"/>
+<l:gentext key="ProductionSet" text="Produkcija"/>
+<l:gentext key="PubDate" text="Datum publikacije"/>
+<l:gentext key="pubdate" text="datum publikacije"/>
+<l:gentext key="Published" text="Objavljeno"/>
+<l:gentext key="published" text="objavljeno"/>
+<l:gentext key="Publisher" text="Nakladnik"/>
+<l:gentext key="Qandadiv" text="Pitanje i Odgovor"/>
+<l:gentext key="qandadiv" text="pitanje i Odgovor"/>
+<l:gentext key="QandASet" text="ÄŒesti Upiti"/>
+<l:gentext key="Question" text="Pitanje:"/>
+<l:gentext key="question" text="pitanje:"/>
+<l:gentext key="RefEntry" text="Stranica"/>
+<l:gentext key="refentry" text="stranica"/>
+<l:gentext key="Reference" text="Referenca"/>
+<l:gentext key="reference" text="referenca"/>
+<l:gentext key="References" text="Reference"/>
+<l:gentext key="RefName" text="Ime"/>
+<l:gentext key="refname" text="Ime"/>
+<l:gentext key="RefSection" text="Odjeljak"/>
+<l:gentext key="refsection" text="odjeljak"/>
+<l:gentext key="RefSynopsisDiv" text="Pregled"/>
+<l:gentext key="refsynopsisdiv" text="Pregled"/>
+<l:gentext key="RevHistory" text="Povijest preinaka"/>
+<l:gentext key="revhistory" text="Povijest preinaka"/>
+<l:gentext key="revision" text="Preinaka"/>
+<l:gentext key="Revision" text="Preinaka"/>
+<l:gentext key="sect1" text="Odjeljak"/>
+<l:gentext key="sect2" text="Odjeljak"/>
+<l:gentext key="sect3" text="Odjeljak"/>
+<l:gentext key="sect4" text="Odjeljak"/>
+<l:gentext key="sect5" text="Odjeljak"/>
+<l:gentext key="section" text="odjeljak"/>
+<l:gentext key="Section" text="Odjeljak"/>
+<l:gentext key="see" text="vidi"/>
+<l:gentext key="See" text="Vidi"/>
+<l:gentext key="seealso" text="vidi i"/>
+<l:gentext key="Seealso" text="Vidi i"/>
+<l:gentext key="SeeAlso" text="Vidi i"/>
+<l:gentext key="set" text="set"/>
+<l:gentext key="Set" text="Set"/>
+<l:gentext key="setindex" text="kazalo"/>
+<l:gentext key="SetIndex" text="Kazalo"/>
+<l:gentext key="Sidebar" text="Rubni stupac"/>
+<l:gentext key="sidebar" text="rubni stupac"/>
+<l:gentext key="step" text="korak"/>
+<l:gentext key="Step" text="Korak"/>
+<l:gentext key="table" text="tablica"/>
+<l:gentext key="Table" text="Tablica"/>
+<l:gentext key="task" text="zadatak"/>
+<l:gentext key="Task" text="Zadatak"/>
+<l:gentext key="tip" text="Savjet"/>
+<l:gentext key="TIP" text="SAVJET"/>
+<l:gentext key="Tip" text="Savjet"/>
+<l:gentext key="Warning" text="Upozorenje"/>
+<l:gentext key="warning" text="upozorenje"/>
+<l:gentext key="WARNING" text="UPOZORENJE"/>
+<l:gentext key="and" text="i"/>
+<l:gentext key="by" text="po"/>
+<l:gentext key="Edited" text="Uredio/la"/>
+<l:gentext key="edited" text="uredio/la"/>
+<l:gentext key="Editedby" text="Uredio/la"/>
+<l:gentext key="editedby" text="uredio/la"/>
+<l:gentext key="in" text="u"/>
+<l:gentext key="lastlistcomma" text=","/>
+<l:gentext key="listcomma" text=","/>
+<l:gentext key="notes" text="bilješke"/>
+<l:gentext key="Notes" text="Bilješke"/>
+<l:gentext key="Pgs" text="Str."/>
+<l:gentext key="pgs" text="str."/>
+<l:gentext key="Revisedby" text="Promijenjeno po: "/>
+<l:gentext key="revisedby" text="promijenjeno po: "/>
+<l:gentext key="TableNotes" text="Napomene"/>
+<l:gentext key="tablenotes" text="napomene"/>
+<l:gentext key="TableofContents" text="Sadržaj"/>
+<l:gentext key="tableofcontents" text="sadržaj"/>
+<l:gentext key="unexpectedelementname" text="NeoÄekivano ime elementa"/>
+<l:gentext key="unsupported" text="nepodržano"/>
+<l:gentext key="xrefto" text="xref za"/>
+<l:gentext key="Authors" text="Autori"/>
+<l:gentext key="copyeditor" text="Urdenik za autorska prava"/>
+<l:gentext key="graphicdesigner" text="GrafiÄki dizajner"/>
+<l:gentext key="productioneditor" text="Urednik produkcija"/>
+<l:gentext key="technicaleditor" text="TehniÄki urednik"/>
+<l:gentext key="translator" text="Prevodilac"/>
+<l:gentext key="listofequations" text="popis jednadžbi"/>
+<l:gentext key="ListofEquations" text="Popis jednadžbi"/>
+<l:gentext key="ListofExamples" text="Popis primjera"/>
+<l:gentext key="listofexamples" text="popis primjera"/>
+<l:gentext key="ListofFigures" text="Popis slika"/>
+<l:gentext key="listoffigures" text="popis slika"/>
+<l:gentext key="ListofProcedures" text="Popis postupaka"/>
+<l:gentext key="listofprocedures" text="popis postupaka"/>
+<l:gentext key="listoftables" text="popis tablica"/>
+<l:gentext key="ListofTables" text="Popis tablica "/>
+<l:gentext key="ListofUnknown" text="Popis nepoznanica"/>
+<l:gentext key="listofunknown" text="popis nepoznanica"/>
+<l:gentext key="nav-home" text="PoÄetak"/>
+<l:gentext key="nav-next" text="Naprijed"/>
+<l:gentext key="nav-next-sibling" text="SkoÄi unaprijed"/>
+<l:gentext key="nav-prev" text="Natrag"/>
+<l:gentext key="nav-prev-sibling" text="SkoÄi unatrag"/>
+<l:gentext key="nav-up" text="Gore"/>
+<l:gentext key="nav-toc" text="Sadržaj"/>
+<l:gentext key="Draft" text="Nacrt"/>
+<l:gentext key="above" text="iznad"/>
+<l:gentext key="below" text="ispod"/>
+<l:gentext key="sectioncalled" text="the section called"/>
+<l:gentext key="index symbols" text="Oznake"/>
+<l:gentext key="writing-mode" text="lr-tb"/>
+<l:gentext key="lowercase.alpha" text="abcÄćdÄ‘efghijklmnopqrsÅ¡tuvwxyzž"/>
+<l:gentext key="uppercase.alpha" text="ABCČĆDÄEFGHIJKLMNOPQRSÅ TUVWXYZŽ"/>
+<l:gentext key="normalize.sort.input" text="AaÀàÃáÂâÃãÄäÅåĀÄĂ㥹ÇǎǞǟǠǡǺǻȀÈȂȃȦȧḀá¸áºšáº áº¡áº¢áº£áº¤áº¥áº¦áº§áº¨áº©áºªáº«áº¬áº­áº®áº¯áº°áº±áº²áº³áº´áºµáº¶áº·BbÆ€ÆɓƂƃḂḃḄḅḆḇCcÇçĆćĈĉĊċČÄƇƈɕḈḉDdÄŽÄÄđƊɗƋƌDžDzȡɖḊḋḌá¸á¸Žá¸á¸á¸‘ḒḓEeÈèÉéÊêËëĒēĔĕĖėĘęĚěȄȅȆȇȨȩḔḕḖḗḘḙḚḛḜá¸áº¸áº¹áººáº»áº¼áº½áº¾áº¿á»€á»á»‚ểỄễỆệFfƑƒḞḟGgÄœÄĞğĠġĢģƓɠǤǥǦǧǴǵḠḡHhĤĥĦħȞȟɦḢḣḤḥḦḧḨḩḪḫẖIiÌìÃíÎîÃïĨĩĪīĬĭĮįİƗɨÇÇȈȉȊȋḬḭḮḯỈỉỊịJjĴĵǰÊKkĶķƘƙǨǩḰḱḲḳḴḵLlĹĺĻļĽľĿŀÅłƚLjȴɫɬɭḶḷḸḹḺḻḼḽMmɱḾḿṀá¹á¹‚ṃNnÑñŃńŅņŇňÆɲƞȠNjǸǹȵɳṄṅṆṇṈṉṊṋOoÒòÓóÔôÕõÖöØøŌÅÅŽÅÅőƟƠơǑǒǪǫǬǭǾǿȌÈÈŽÈȪȫȬȭȮȯȰȱṌá¹á¹Žá¹á¹á¹‘ṒṓỌá»á»Žá»á»á»‘ỒồỔổỖỗỘộỚớỜá»á»žá»Ÿá» á»¡á»¢á»£PpƤƥṔṕṖṗQqÊ RrŔŕŖŗŘřÈȑȒȓɼɽɾṘṙṚṛṜá¹á¹žá¹ŸSsŚśŜÅŞşŠšȘșʂṠṡṢṣṤṥṦṧṨṩTtŢţŤťŦŧƫƬƭƮʈȚțȶṪṫṬṭṮṯṰṱẗUuÙùÚúÛûÜüŨũŪūŬŭŮůŰűŲųƯưǓǔǕǖǗǘǙǚǛǜȔȕȖȗṲṳṴṵṶṷṸṹṺṻỤụỦủỨứỪừỬửỮữỰựVvƲʋṼṽṾṿWwŴŵẀáºáº‚ẃẄẅẆẇẈẉẘXxẊẋẌáºYyÃýÿŸŶŷƳƴȲȳẎáºáº™á»²á»³á»´á»µá»¶á»·á»¸á»¹ZzŹźŻżŽžƵƶȤȥÊÊ‘áºáº‘ẒẓẔẕẕ" lang="en"/>
+<l:gentext key="normalize.sort.output" text="AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBCCCCCCCCCCCCCCCCCDDDDDDDDDDDDDDDDDDDDDDDDEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEFFFFFFGGGGGGGGGGGGGGGGGGGGHHHHHHHHHHHHHHHHHHHHIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIJJJJJJKKKKKKKKKKKKKKLLLLLLLLLLLLLLLLLLLLLLLLLLMMMMMMMMMNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOPPPPPPPPQQQRRRRRRRRRRRRRRRRRRRRRRRSSSSSSSSSSSSSSSSSSSSSSSTTTTTTTTTTTTTTTTTTTTTTTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUVVVVVVVVWWWWWWWWWWWWWWWXXXXXXYYYYYYYYYYYYYYYYYYYYYYYZZZZZZZZZZZZZZZZZZZZZ" lang="en"/>
+<l:dingbat key="startquote" text="“"/>
+<l:dingbat key="endquote" text="â€"/>
+<l:dingbat key="nestedstartquote" text="‘"/>
+<l:dingbat key="nestedendquote" text="’"/>
+<l:dingbat key="singlestartquote" text="‘"/>
+<l:dingbat key="singleendquote" text="’"/>
+<l:dingbat key="bullet" text="•"/>
+<l:gentext key="hyphenation-character" text="-"/>
+<l:gentext key="hyphenation-push-character-count" text="2"/>
+<l:gentext key="hyphenation-remain-character-count" text="2"/>
+<l:context name="styles"><l:template name="person-name" text="first-last"/>
+</l:context>
+<l:context name="title"><l:template name="abstract" text="%t"/>
+<l:template name="acknowledgements" text="%t"/>
+<l:template name="answer" text="%t"/>
+<l:template name="appendix" text="Dodatak %n. %t"/>
+<l:template name="article" text="%t"/>
+<l:template name="authorblurb" text="%t"/>
+<l:template name="bibliodiv" text="%t"/>
+<l:template name="biblioentry" text="%t"/>
+<l:template name="bibliography" text="%t"/>
+<l:template name="bibliolist" text="%t"/>
+<l:template name="bibliomixed" text="%t"/>
+<l:template name="bibliomset" text="%t"/>
+<l:template name="biblioset" text="%t"/>
+<l:template name="blockquote" text="%t"/>
+<l:template name="book" text="%t"/>
+<l:template name="calloutlist" text="%t"/>
+<l:template name="caution" text="%t"/>
+<l:template name="chapter" text="Poglavlje %n. %t"/>
+<l:template name="colophon" text="%t"/>
+<l:template name="dedication" text="%t"/>
+<l:template name="equation" text="Jednadžba %n. %t"/>
+<l:template name="example" text="Primjer %n. %t"/>
+<l:template name="figure" text="Slika %n. %t"/>
+<l:template name="foil" text="%t"/>
+<l:template name="foilgroup" text="%t"/>
+<l:template name="formalpara" text="%t"/>
+<l:template name="glossary" text="%t"/>
+<l:template name="glossdiv" text="%t"/>
+<l:template name="glosslist" text="%t"/>
+<l:template name="glossentry" text="%t"/>
+<l:template name="important" text="%t"/>
+<l:template name="index" text="%t"/>
+<l:template name="indexdiv" text="%t"/>
+<l:template name="itemizedlist" text="%t"/>
+<l:template name="legalnotice" text="%t"/>
+<l:template name="listitem" text=""/>
+<l:template name="lot" text="%t"/>
+<l:template name="msg" text="%t"/>
+<l:template name="msgexplan" text="%t"/>
+<l:template name="msgmain" text="%t"/>
+<l:template name="msgrel" text="%t"/>
+<l:template name="msgset" text="%t"/>
+<l:template name="msgsub" text="%t"/>
+<l:template name="note" text="%t"/>
+<l:template name="orderedlist" text="%t"/>
+<l:template name="part" text="Dio %n. %t"/>
+<l:template name="partintro" text="%t"/>
+<l:template name="preface" text="%t"/>
+<l:template name="procedure" text="%t"/>
+<l:template name="procedure.formal" text="Postupak %n. %t"/>
+<l:template name="productionset" text="%t"/>
+<l:template name="productionset.formal" text="Produkcija %n"/>
+<l:template name="qandadiv" text="%t"/>
+<l:template name="qandaentry" text="%t"/>
+<l:template name="qandaset" text="%t"/>
+<l:template name="question" text="%t"/>
+<l:template name="refentry" text="%t"/>
+<l:template name="reference" text="%t"/>
+<l:template name="refsection" text="%t"/>
+<l:template name="refsect1" text="%t"/>
+<l:template name="refsect2" text="%t"/>
+<l:template name="refsect3" text="%t"/>
+<l:template name="refsynopsisdiv" text="%t"/>
+<l:template name="refsynopsisdivinfo" text="%t"/>
+<l:template name="segmentedlist" text="%t"/>
+<l:template name="set" text="%t"/>
+<l:template name="setindex" text="%t"/>
+<l:template name="sidebar" text="%t"/>
+<l:template name="step" text="%t"/>
+<l:template name="table" text="Tablica %n. %t"/>
+<l:template name="task" text="%t"/>
+<l:template name="tasksummary" text="%t"/>
+<l:template name="taskprerequisites" text="%t"/>
+<l:template name="taskrelated" text="%t"/>
+<l:template name="tip" text="%t"/>
+<l:template name="toc" text="%t"/>
+<l:template name="variablelist" text="%t"/>
+<l:template name="varlistentry" text=""/>
+<l:template name="warning" text="%t"/>
+</l:context>
+<l:context name="title-unnumbered"><l:template name="appendix" text="%t"/>
+<l:template name="article/appendix" text="%t"/>
+<l:template name="bridgehead" text="%t"/>
+<l:template name="chapter" text="%t"/>
+<l:template name="sect1" text="%t"/>
+<l:template name="sect2" text="%t"/>
+<l:template name="sect3" text="%t"/>
+<l:template name="sect4" text="%t"/>
+<l:template name="sect5" text="%t"/>
+<l:template name="section" text="%t"/>
+<l:template name="simplesect" text="%t"/>
+<l:template name="part" text="%t"/>
+</l:context>
+<l:context name="title-numbered"><l:template name="appendix" text="Dodatak %n. %t"/>
+<l:template name="article/appendix" text="%n. %t"/>
+<l:template name="bridgehead" text="%n. %t"/>
+<l:template name="chapter" text="Poglavlje %n. %t"/>
+<l:template name="part" text="Dio %n. %t"/>
+<l:template name="sect1" text="%n. %t"/>
+<l:template name="sect2" text="%n. %t"/>
+<l:template name="sect3" text="%n. %t"/>
+<l:template name="sect4" text="%n. %t"/>
+<l:template name="sect5" text="%n. %t"/>
+<l:template name="section" text="%n. %t"/>
+<l:template name="simplesect" text="%t"/>
+</l:context>
+<l:context name="subtitle"><l:template name="appendix" text="%s"/>
+<l:template name="acknowledgements" text="%s"/>
+<l:template name="article" text="%s"/>
+<l:template name="bibliodiv" text="%s"/>
+<l:template name="biblioentry" text="%s"/>
+<l:template name="bibliography" text="%s"/>
+<l:template name="bibliomixed" text="%s"/>
+<l:template name="bibliomset" text="%s"/>
+<l:template name="biblioset" text="%s"/>
+<l:template name="book" text="%s"/>
+<l:template name="chapter" text="%s"/>
+<l:template name="colophon" text="%s"/>
+<l:template name="dedication" text="%s"/>
+<l:template name="glossary" text="%s"/>
+<l:template name="glossdiv" text="%s"/>
+<l:template name="index" text="%s"/>
+<l:template name="indexdiv" text="%s"/>
+<l:template name="lot" text="%s"/>
+<l:template name="part" text="%s"/>
+<l:template name="partintro" text="%s"/>
+<l:template name="preface" text="%s"/>
+<l:template name="refentry" text="%s"/>
+<l:template name="reference" text="%s"/>
+<l:template name="refsection" text="%s"/>
+<l:template name="refsect1" text="%s"/>
+<l:template name="refsect2" text="%s"/>
+<l:template name="refsect3" text="%s"/>
+<l:template name="refsynopsisdiv" text="%s"/>
+<l:template name="sect1" text="%s"/>
+<l:template name="sect2" text="%s"/>
+<l:template name="sect3" text="%s"/>
+<l:template name="sect4" text="%s"/>
+<l:template name="sect5" text="%s"/>
+<l:template name="section" text="%s"/>
+<l:template name="set" text="%s"/>
+<l:template name="setindex" text="%s"/>
+<l:template name="sidebar" text="%s"/>
+<l:template name="simplesect" text="%s"/>
+<l:template name="toc" text="%s"/>
+</l:context>
+<l:context name="xref"><l:template name="abstract" text="%t"/>
+<l:template name="acknowledgements" text="%t"/>
+<l:template name="answer" text="Odgovor: %n"/>
+<l:template name="appendix" text="%t"/>
+<l:template name="article" text="%t"/>
+<l:template name="authorblurb" text="%t"/>
+<l:template name="bibliodiv" text="%t"/>
+<l:template name="bibliography" text="%t"/>
+<l:template name="bibliomset" text="%t"/>
+<l:template name="biblioset" text="%t"/>
+<l:template name="blockquote" text="%t"/>
+<l:template name="book" text="%t"/>
+<l:template name="calloutlist" text="%t"/>
+<l:template name="caution" text="%t"/>
+<l:template name="chapter" text="%t"/>
+<l:template name="colophon" text="%t"/>
+<l:template name="constraintdef" text="%t"/>
+<l:template name="dedication" text="%t"/>
+<l:template name="equation" text="%t"/>
+<l:template name="example" text="%t"/>
+<l:template name="figure" text="%t"/>
+<l:template name="foil" text="%t"/>
+<l:template name="foilgroup" text="%t"/>
+<l:template name="formalpara" text="%t"/>
+<l:template name="glossary" text="%t"/>
+<l:template name="glossdiv" text="%t"/>
+<l:template name="important" text="%t"/>
+<l:template name="index" text="%t"/>
+<l:template name="indexdiv" text="%t"/>
+<l:template name="itemizedlist" text="%t"/>
+<l:template name="legalnotice" text="%t"/>
+<l:template name="listitem" text="%n"/>
+<l:template name="lot" text="%t"/>
+<l:template name="msg" text="%t"/>
+<l:template name="msgexplan" text="%t"/>
+<l:template name="msgmain" text="%t"/>
+<l:template name="msgrel" text="%t"/>
+<l:template name="msgset" text="%t"/>
+<l:template name="msgsub" text="%t"/>
+<l:template name="note" text="%t"/>
+<l:template name="orderedlist" text="%t"/>
+<l:template name="part" text="%t"/>
+<l:template name="partintro" text="%t"/>
+<l:template name="preface" text="%t"/>
+<l:template name="procedure" text="%t"/>
+<l:template name="productionset" text="%t"/>
+<l:template name="qandadiv" text="%t"/>
+<l:template name="qandaentry" text="Pitanje: %n"/>
+<l:template name="qandaset" text="%t"/>
+<l:template name="question" text="Pitanje: %n"/>
+<l:template name="reference" text="%t"/>
+<l:template name="refsynopsisdiv" text="%t"/>
+<l:template name="segmentedlist" text="%t"/>
+<l:template name="set" text="%t"/>
+<l:template name="setindex" text="%t"/>
+<l:template name="sidebar" text="%t"/>
+<l:template name="table" text="%t"/>
+<l:template name="task" text="%t"/>
+<l:template name="tip" text="%t"/>
+<l:template name="toc" text="%t"/>
+<l:template name="variablelist" text="%t"/>
+<l:template name="varlistentry" text="%n"/>
+<l:template name="warning" text="%t"/>
+<l:template name="olink.document.citation" text=" in %o"/>
+<l:template name="olink.page.citation" text=" (page %p)"/>
+<l:template name="page.citation" text=" [%p]"/>
+<l:template name="page" text="(page %p)"/>
+<l:template name="docname" text=" in %o"/>
+<l:template name="docnamelong" text=" in the document titled %o"/>
+<l:template name="pageabbrev" text="(p. %p)"/>
+<l:template name="Page" text="Page %p"/>
+<l:template name="bridgehead" text="the section called “%tâ€"/>
+<l:template name="refsection" text="the section called “%tâ€"/>
+<l:template name="refsect1" text="the section called “%tâ€"/>
+<l:template name="refsect2" text="the section called “%tâ€"/>
+<l:template name="refsect3" text="the section called “%tâ€"/>
+<l:template name="sect1" text="the section called “%tâ€"/>
+<l:template name="sect2" text="the section called “%tâ€"/>
+<l:template name="sect3" text="the section called “%tâ€"/>
+<l:template name="sect4" text="the section called “%tâ€"/>
+<l:template name="sect5" text="the section called “%tâ€"/>
+<l:template name="section" text="the section called “%tâ€"/>
+<l:template name="simplesect" text="the section called “%tâ€"/>
+</l:context>
+<l:context name="xref-number"><l:template name="answer" text="Odgovor: %n"/>
+<l:template name="appendix" text="Dodatak %n"/>
+<l:template name="bridgehead" text="Odjeljak %n"/>
+<l:template name="chapter" text="Poglavlje %n"/>
+<l:template name="equation" text="Jednadžba %n"/>
+<l:template name="example" text="Primjer %n"/>
+<l:template name="figure" text="Slika %n"/>
+<l:template name="part" text="Dio %n"/>
+<l:template name="procedure" text="Postupak %n"/>
+<l:template name="productionset" text="Produkcija %n"/>
+<l:template name="qandadiv" text="Pitanje i Odgovor %n"/>
+<l:template name="qandaentry" text="Pitanje: %n"/>
+<l:template name="question" text="Pitanje: %n"/>
+<l:template name="sect1" text="Odjeljak %n"/>
+<l:template name="sect2" text="Odjeljak %n"/>
+<l:template name="sect3" text="Odjeljak %n"/>
+<l:template name="sect4" text="Odjeljak %n"/>
+<l:template name="sect5" text="Odjeljak %n"/>
+<l:template name="section" text="Odjeljak %n"/>
+<l:template name="table" text="Tablica %n"/>
+</l:context>
+<l:context name="xref-number-and-title"><l:template name="appendix" text="Dodatak %n, %t"/>
+<l:template name="bridgehead" text="Odjeljak %n, “%tâ€"/>
+<l:template name="chapter" text="Poglavlje %n, %t"/>
+<l:template name="equation" text="Jednadžba %n, “%tâ€"/>
+<l:template name="example" text="Primjer %n, “%tâ€"/>
+<l:template name="figure" text="Slika %n, “%tâ€"/>
+<l:template name="part" text="Dio %n, “%tâ€"/>
+<l:template name="procedure" text="Postupak %n, “%tâ€"/>
+<l:template name="productionset" text="Produkcija %n, “%tâ€"/>
+<l:template name="qandadiv" text="Pitanje i Odgovor %n, “%tâ€"/>
+<l:template name="refsect1" text="the section called “%tâ€"/>
+<l:template name="refsect2" text="the section called “%tâ€"/>
+<l:template name="refsect3" text="the section called “%tâ€"/>
+<l:template name="refsection" text="the section called “%tâ€"/>
+<l:template name="sect1" text="Odjeljak %n, “%tâ€"/>
+<l:template name="sect2" text="Odjeljak %n, “%tâ€"/>
+<l:template name="sect3" text="Odjeljak %n, “%tâ€"/>
+<l:template name="sect4" text="Odjeljak %n, “%tâ€"/>
+<l:template name="sect5" text="Odjeljak %n, “%tâ€"/>
+<l:template name="section" text="Odjeljak %n, “%tâ€"/>
+<l:template name="simplesect" text="the section called “%tâ€"/>
+<l:template name="table" text="Tablica %n, “%tâ€"/>
+</l:context>
+<l:context name="authorgroup"><l:template name="sep" text=", "/>
+<l:template name="sep2" text=" i "/>
+<l:template name="seplast" text=", i "/>
+</l:context>
+<l:context name="glossary"><l:template name="see" text="Vidi %t."/>
+<l:template name="seealso" text="Vidi i %t."/>
+<l:template name="seealso-separator" text=", "/>
+</l:context>
+<l:context name="msgset"><l:template name="MsgAud" text="Primatelji: "/>
+<l:template name="MsgLevel" text="Razina: "/>
+<l:template name="MsgOrig" text="Izvor: "/>
+</l:context>
+<l:context name="datetime"><l:template name="format" text="m/d/Y"/>
+</l:context>
+<l:context name="termdef"><l:template name="prefix" text="[Definicija: "/>
+<l:template name="suffix" text="]"/>
+</l:context>
+<l:context name="datetime-full"><l:template name="January" text="SijeÄanj"/>
+<l:template name="February" text="VeljaÄa"/>
+<l:template name="March" text="Ožujak"/>
+<l:template name="April" text="Travanj"/>
+<l:template name="May" text="Svibanj"/>
+<l:template name="June" text="Lipanj"/>
+<l:template name="July" text="Srpanj"/>
+<l:template name="August" text="Kolovoz"/>
+<l:template name="September" text="Rujan"/>
+<l:template name="October" text="Listopad"/>
+<l:template name="November" text="Studeni"/>
+<l:template name="December" text="Prosinac"/>
+<l:template name="Monday" text="Ponedjeljak"/>
+<l:template name="Tuesday" text="Utorak"/>
+<l:template name="Wednesday" text="Srijeda"/>
+<l:template name="Thursday" text="ÄŒetvrtak"/>
+<l:template name="Friday" text="Petak"/>
+<l:template name="Saturday" text="Subota"/>
+<l:template name="Sunday" text="Nedjelja"/>
+</l:context>
+<l:context name="datetime-abbrev"><l:template name="Jan" text="Sij"/>
+<l:template name="Feb" text="Velj"/>
+<l:template name="Mar" text="Ožu"/>
+<l:template name="Apr" text="Tra"/>
+<l:template name="May" text="Svi"/>
+<l:template name="Jun" text="Lip"/>
+<l:template name="Jul" text="Srp"/>
+<l:template name="Aug" text="Kol"/>
+<l:template name="Sep" text="Ruj"/>
+<l:template name="Oct" text="Lis"/>
+<l:template name="Nov" text="Stu"/>
+<l:template name="Dec" text="Pro"/>
+<l:template name="Mon" text="Pon"/>
+<l:template name="Tue" text="Uto"/>
+<l:template name="Wed" text="Sri"/>
+<l:template name="Thu" text="ÄŒet"/>
+<l:template name="Fri" text="Pet"/>
+<l:template name="Sat" text="Sub"/>
+<l:template name="Sun" text="Ned"/>
+</l:context>
+<l:context name="htmlhelp"><l:template name="langcode" text="0x041a Croatian"/>
+</l:context>
+<l:context name="index"><l:template name="term-separator" text=", "/>
+<l:template name="number-separator" text=", "/>
+<l:template name="range-separator" text="-"/>
+</l:context>
+<l:context name="iso690"><l:template name="lastfirst.sep" text=", "/>
+<l:template name="alt.person.two.sep" text=" – "/>
+<l:template name="alt.person.last.sep" text=" – "/>
+<l:template name="alt.person.more.sep" text=" – "/>
+<l:template name="primary.editor" text=" (ed.)"/>
+<l:template name="primary.many" text=", et al."/>
+<l:template name="primary.sep" text=". "/>
+<l:template name="submaintitle.sep" text=": "/>
+<l:template name="title.sep" text=". "/>
+<l:template name="othertitle.sep" text=", "/>
+<l:template name="medium1" text=" ["/>
+<l:template name="medium2" text="]"/>
+<l:template name="secondary.person.sep" text="; "/>
+<l:template name="secondary.sep" text=". "/>
+<l:template name="respons.sep" text=". "/>
+<l:template name="edition.sep" text=". "/>
+<l:template name="edition.serial.sep" text=", "/>
+<l:template name="issuing.range" text="-"/>
+<l:template name="issuing.div" text=", "/>
+<l:template name="issuing.sep" text=". "/>
+<l:template name="partnr.sep" text=". "/>
+<l:template name="placepubl.sep" text=": "/>
+<l:template name="publyear.sep" text=", "/>
+<l:template name="pubinfo.sep" text=". "/>
+<l:template name="spec.pubinfo.sep" text=", "/>
+<l:template name="upd.sep" text=", "/>
+<l:template name="datecit1" text=" [cited "/>
+<l:template name="datecit2" text="]"/>
+<l:template name="extent.sep" text=". "/>
+<l:template name="locs.sep" text=", "/>
+<l:template name="location.sep" text=". "/>
+<l:template name="serie.sep" text=". "/>
+<l:template name="notice.sep" text=". "/>
+<l:template name="access" text="Available "/>
+<l:template name="acctoo" text="Also available "/>
+<l:template name="onwww" text="from World Wide Web"/>
+<l:template name="oninet" text="from Internet"/>
+<l:template name="access.end" text=": "/>
+<l:template name="link1" text="&lt;"/>
+<l:template name="link2" text="&gt;"/>
+<l:template name="access.sep" text=". "/>
+<l:template name="isbn" text="ISBN "/>
+<l:template name="issn" text="ISSN "/>
+<l:template name="stdnum.sep" text=". "/>
+<l:template name="patcountry.sep" text=". "/>
+<l:template name="pattype.sep" text=", "/>
+<l:template name="patnum.sep" text=". "/>
+<l:template name="patdate.sep" text=". "/>
+</l:context><l:letters><l:l i="-1"/>
+<l:l i="0">Oznake</l:l>
+<l:l i="10">A</l:l>
+<l:l i="10">a</l:l>
+<l:l i="20">B</l:l>
+<l:l i="20">b</l:l>
+<l:l i="30">C</l:l>
+<l:l i="30">c</l:l>
+<l:l i="30">Ć</l:l>
+<l:l i="30">ć</l:l>
+<l:l i="30">Č</l:l>
+<l:l i="30">Ä</l:l>
+<l:l i="40">D</l:l>
+<l:l i="40">d</l:l>
+<l:l i="40">Ä</l:l>
+<l:l i="40">Ä‘</l:l>
+<l:l i="50">E</l:l>
+<l:l i="50">e</l:l>
+<l:l i="60">F</l:l>
+<l:l i="60">f</l:l>
+<l:l i="70">G</l:l>
+<l:l i="70">g</l:l>
+<l:l i="80">H</l:l>
+<l:l i="80">h</l:l>
+<l:l i="90">I</l:l>
+<l:l i="90">i</l:l>
+<l:l i="100">J</l:l>
+<l:l i="100">j</l:l>
+<l:l i="110">K</l:l>
+<l:l i="110">k</l:l>
+<l:l i="120">L</l:l>
+<l:l i="120">l</l:l>
+<l:l i="130">M</l:l>
+<l:l i="130">m</l:l>
+<l:l i="140">N</l:l>
+<l:l i="140">n</l:l>
+<l:l i="150">O</l:l>
+<l:l i="150">o</l:l>
+<l:l i="160">P</l:l>
+<l:l i="160">p</l:l>
+<l:l i="180">R</l:l>
+<l:l i="180">r</l:l>
+<l:l i="190">S</l:l>
+<l:l i="190">s</l:l>
+<l:l i="190">Å </l:l>
+<l:l i="190">Å¡</l:l>
+<l:l i="200">T</l:l>
+<l:l i="200">t</l:l>
+<l:l i="210">U</l:l>
+<l:l i="210">u</l:l>
+<l:l i="220">V</l:l>
+<l:l i="220">v</l:l>
+<l:l i="260">Z</l:l>
+<l:l i="260">z</l:l>
+<l:l i="260">Ž</l:l>
+<l:l i="260">ž</l:l>
+</l:letters>
+</l:l10n>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/hu.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/hu.xml
new file mode 100644
index 0000000..ab90c94
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/hu.xml
@@ -0,0 +1,678 @@
+<?xml version="1.0" encoding="utf-8"?>
+<l:l10n xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0" language="hu" english-language-name="Hungarian">
+
+<!-- * This file is generated automatically. -->
+<!-- * To submit changes to this file upstream (to the DocBook Project) -->
+<!-- * do not submit an edited version of this file. Instead, submit an -->
+<!-- * edited version of the source file at the following location: -->
+<!-- * -->
+<!-- * https://docbook.svn.sourceforge.net/svnroot/docbook/trunk/gentext/locale/hu.xml -->
+<!-- * -->
+<!-- * E-mail the edited hu.xml source file to: -->
+<!-- * -->
+<!-- * docbook-developers@lists.sourceforge.net -->
+
+<!-- ******************************************************************** -->
+
+<!-- This file is part of the XSL DocBook Stylesheet distribution. -->
+<!-- See ../README or http://docbook.sf.net/release/xsl/current/ for -->
+<!-- copyright and other information. -->
+
+<!-- ******************************************************************** -->
+<!-- In these files, % with a letter is used for a placeholder: -->
+<!-- %t is the current element's title -->
+<!-- %s is the current element's subtitle (if applicable)-->
+<!-- %n is the current element's number label-->
+<!-- %p is the current element's page number (if applicable)-->
+<!-- ******************************************************************** -->
+
+
+<l:gentext key="Abstract" text="Kivonat"/>
+<l:gentext key="abstract" text="kivonat"/>
+<l:gentext key="Acknowledgements" text="Köszönetnyilvánítás"/>
+<l:gentext key="acknowledgements" text="köszönetnyilvánítás"/>
+<l:gentext key="Answer" text="V:"/>
+<l:gentext key="answer" text="v:"/>
+<l:gentext key="Appendix" text="Függelék"/>
+<l:gentext key="appendix" text="függelék"/>
+<l:gentext key="Article" text="Cikk"/>
+<l:gentext key="article" text="cikk"/>
+<l:gentext key="Author" text="Szerz"/>
+<l:gentext key="Bibliography" text="Irodalomjegyzék"/>
+<l:gentext key="bibliography" text="irodalomjegyzék"/>
+<l:gentext key="Book" text="Könyv"/>
+<l:gentext key="book" text="könyv"/>
+<l:gentext key="CAUTION" text="FIGYELEM"/>
+<l:gentext key="Caution" text="Figyelem"/>
+<l:gentext key="caution" text="figyelem"/>
+<l:gentext key="Chapter" text="Fejezet"/>
+<l:gentext key="chapter" text="fejezet"/>
+<l:gentext key="Colophon" text="Végszó"/>
+<l:gentext key="colophon" text="végszó"/>
+<l:gentext key="Copyright" text="Szerzői jog"/>
+<l:gentext key="copyright" text="szerzői jog"/>
+<l:gentext key="Dedication" text="Ajánlás"/>
+<l:gentext key="dedication" text="ajánlás"/>
+<l:gentext key="Edition" text="Kiadás"/>
+<l:gentext key="edition" text="kiadás"/>
+<l:gentext key="Editor" text="Szerkesztő"/>
+<l:gentext key="Equation" text="Egyenlet"/>
+<l:gentext key="equation" text="egyenlet"/>
+<l:gentext key="Example" text="Példa"/>
+<l:gentext key="example" text="példa"/>
+<l:gentext key="Figure" text="Ãbra"/>
+<l:gentext key="figure" text="ábra"/>
+<l:gentext key="Glossary" text="Szójegyzék"/>
+<l:gentext key="glossary" text="szójegyzék"/>
+<l:gentext key="GlossSee" text="Lásd"/>
+<l:gentext key="glosssee" text="lásd"/>
+<l:gentext key="GlossSeeAlso" text="Lásd még"/>
+<l:gentext key="glossseealso" text="lásd még"/>
+<l:gentext key="IMPORTANT" text="FONTOS"/>
+<l:gentext key="important" text="fontos"/>
+<l:gentext key="Important" text="Fontos"/>
+<l:gentext key="Index" text="Tárgymutató"/>
+<l:gentext key="index" text="tárgymutató"/>
+<l:gentext key="ISBN" text="ISBN"/>
+<l:gentext key="isbn" text="isbn"/>
+<l:gentext key="LegalNotice" text="Jogi közlemény"/>
+<l:gentext key="legalnotice" text="jogi közlemény"/>
+<l:gentext key="MsgAud" text="Célközönség"/>
+<l:gentext key="msgaud" text="célközönség"/>
+<l:gentext key="MsgLevel" text="Szint"/>
+<l:gentext key="msglevel" text="szint"/>
+<l:gentext key="MsgOrig" text="Eredet"/>
+<l:gentext key="msgorig" text="eredet"/>
+<l:gentext key="NOTE" text="MEGJEGYZÉS"/>
+<l:gentext key="Note" text="Megjegyzés"/>
+<l:gentext key="note" text="megjegyzés"/>
+<l:gentext key="Part" text="Rész"/>
+<l:gentext key="part" text="rész"/>
+<l:gentext key="Preface" text="Előszó"/>
+<l:gentext key="preface" text="előszó"/>
+<l:gentext key="Procedure" text="Eljárás"/>
+<l:gentext key="procedure" text="eljárás"/>
+<l:gentext key="ProductionSet" text="Elemcsoport"/>
+<l:gentext key="PubDate" text="Publication Date"/>
+<l:gentext key="pubdate" text="Publication date"/>
+<l:gentext key="Published" text="Megjelent"/>
+<l:gentext key="published" text="megjelent"/>
+<l:gentext key="Publisher" text="Kiadó"/>
+<l:gentext key="Qandadiv" text="K és V"/>
+<l:gentext key="qandadiv" text="K és V"/>
+<l:gentext key="QandASet" text="Gyakran feltett kérdések"/>
+<l:gentext key="Question" text="K:"/>
+<l:gentext key="question" text="k:"/>
+<l:gentext key="RefEntry" text="Oldal"/>
+<l:gentext key="refentry" text="oldal"/>
+<l:gentext key="Reference" text="Hivatkozás"/>
+<l:gentext key="reference" text="hivatkozás"/>
+<l:gentext key="References" text="Hivatkozások"/>
+<l:gentext key="RefName" text="Név"/>
+<l:gentext key="refname" text="név"/>
+<l:gentext key="RefSection" text="Szakasz"/>
+<l:gentext key="refsection" text="szakasz"/>
+<l:gentext key="RefSynopsisDiv" text="Ãttekintés"/>
+<l:gentext key="refsynopsisdiv" text="áttekintés"/>
+<l:gentext key="RevHistory" text="Verziótörténet"/>
+<l:gentext key="revhistory" text="verziótörténet"/>
+<l:gentext key="revision" text="verzió"/>
+<l:gentext key="Revision" text="Verzió"/>
+<l:gentext key="sect1" text="Szakasz"/>
+<l:gentext key="sect2" text="Szakasz"/>
+<l:gentext key="sect3" text="Szakasz"/>
+<l:gentext key="sect4" text="Szakasz"/>
+<l:gentext key="sect5" text="Szakasz"/>
+<l:gentext key="section" text="szakasz"/>
+<l:gentext key="Section" text="Szakasz"/>
+<l:gentext key="see" text="lásd"/>
+<l:gentext key="See" text="Lásd"/>
+<l:gentext key="seealso" text="lásd még"/>
+<l:gentext key="Seealso" text="Lásd még"/>
+<l:gentext key="SeeAlso" text="Lásd még"/>
+<l:gentext key="set" text="csoport"/>
+<l:gentext key="Set" text="Csoport"/>
+<l:gentext key="setindex" text="csoportmutató"/>
+<l:gentext key="SetIndex" text="Csoportmutató"/>
+<l:gentext key="Sidebar" text="Széljegyzet"/>
+<l:gentext key="sidebar" text="széljegyzet"/>
+<l:gentext key="step" text="lépés"/>
+<l:gentext key="Step" text="Lépés"/>
+<l:gentext key="table" text="táblázat"/>
+<l:gentext key="Table" text="Táblázat"/>
+<l:gentext key="task" text="feladat"/>
+<l:gentext key="Task" text="Feladat"/>
+<l:gentext key="tip" text="tipp"/>
+<l:gentext key="TIP" text="TIPP"/>
+<l:gentext key="Tip" text="Tipp"/>
+<l:gentext key="Warning" text="Figyelem"/>
+<l:gentext key="warning" text="figyelem"/>
+<l:gentext key="WARNING" text="FIGYELEM"/>
+<l:gentext key="and" text="és"/>
+<l:gentext key="by" text="írta"/>
+<l:gentext key="Edited" text="Szerk."/>
+<l:gentext key="edited" text="szerk."/>
+<l:gentext key="Editedby" text="Szerkesztette"/>
+<l:gentext key="editedby" text="szerkesztette"/>
+<l:gentext key="in" text="in"/>
+<l:gentext key="lastlistcomma" text=","/>
+<l:gentext key="listcomma" text=","/>
+<l:gentext key="notes" text="megjegyzések"/>
+<l:gentext key="Notes" text="Megjegyzések"/>
+<l:gentext key="Pgs" text="Old."/>
+<l:gentext key="pgs" text="old."/>
+<l:gentext key="Revisedby" text="Felülvizsgálta"/>
+<l:gentext key="revisedby" text="felülvizsgálta"/>
+<l:gentext key="TableNotes" text="Megjegyzések"/>
+<l:gentext key="tablenotes" text="megjegyzések"/>
+<l:gentext key="TableofContents" text="Tartalom"/>
+<l:gentext key="tableofcontents" text="tartalom"/>
+<l:gentext key="unexpectedelementname" text="nem várt elemnév"/>
+<l:gentext key="unsupported" text="nem támogatott"/>
+<l:gentext key="xrefto" text="kereszthiv"/>
+<l:gentext key="Authors" text="Szerzők"/>
+<l:gentext key="copyeditor" text="Kiadás szerkesztő"/>
+<l:gentext key="graphicdesigner" text="Grafikus tervező"/>
+<l:gentext key="productioneditor" text="Főszerkesztőr"/>
+<l:gentext key="technicaleditor" text="Szakszerkesztő"/>
+<l:gentext key="translator" text="Fordító"/>
+<l:gentext key="listofequations" text="az egyenletek listája"/>
+<l:gentext key="ListofEquations" text="Az egyenletek listája"/>
+<l:gentext key="ListofExamples" text="A példák listája"/>
+<l:gentext key="listofexamples" text="a példák listája"/>
+<l:gentext key="ListofFigures" text="Az ábrák listája"/>
+<l:gentext key="listoffigures" text="az ábrák listája"/>
+<l:gentext key="ListofProcedures" text="Eljárások listája"/>
+<l:gentext key="listofprocedures" text="eljárások listája"/>
+<l:gentext key="listoftables" text="a táblázatok listája"/>
+<l:gentext key="ListofTables" text="A táblázatok listája"/>
+<l:gentext key="ListofUnknown" text="Az egyéb elemek listája"/>
+<l:gentext key="listofunknown" text="az egyéb elemek listája"/>
+<l:gentext key="nav-home" text="FÅ‘oldal"/>
+<l:gentext key="nav-next" text="Előre"/>
+<l:gentext key="nav-next-sibling" text="Gyors előre"/>
+<l:gentext key="nav-prev" text="Vissza"/>
+<l:gentext key="nav-prev-sibling" text="Gyors vissza"/>
+<l:gentext key="nav-up" text="Fel"/>
+<l:gentext key="nav-toc" text="Tartalom"/>
+<l:gentext key="Draft" text="Piszkozat"/>
+<l:gentext key="above" text="fent"/>
+<l:gentext key="below" text="alább"/>
+<l:gentext key="sectioncalled" text="a szakasz:"/>
+<l:gentext key="index symbols" text="Jelzések"/>
+<l:gentext key="writing-mode" text="lr-tb"/>
+<l:gentext key="lowercase.alpha" text="aábcdeéfghiíjklmnoóöőpqrstuúüűvwxyz"/>
+<l:gentext key="uppercase.alpha" text="AÃBCDEÉFGHIÃJKLMNOÓÖÅPQRSTUÚÜŰVWXYZ"/>
+<l:gentext key="normalize.sort.input" text="AaÀàÃáÂâÃãÄäÅåĀÄĂ㥹ÇǎǞǟǠǡǺǻȀÈȂȃȦȧḀá¸áºšáº áº¡áº¢áº£áº¤áº¥áº¦áº§áº¨áº©áºªáº«áº¬áº­áº®áº¯áº°áº±áº²áº³áº´áºµáº¶áº·BbÆ€ÆɓƂƃḂḃḄḅḆḇCcÇçĆćĈĉĊċČÄƇƈɕḈḉDdÄŽÄÄđƊɗƋƌDžDzȡɖḊḋḌá¸á¸Žá¸á¸á¸‘ḒḓEeÈèÉéÊêËëĒēĔĕĖėĘęĚěȄȅȆȇȨȩḔḕḖḗḘḙḚḛḜá¸áº¸áº¹áººáº»áº¼áº½áº¾áº¿á»€á»á»‚ểỄễỆệFfƑƒḞḟGgÄœÄĞğĠġĢģƓɠǤǥǦǧǴǵḠḡHhĤĥĦħȞȟɦḢḣḤḥḦḧḨḩḪḫẖIiÌìÃíÎîÃïĨĩĪīĬĭĮįİƗɨÇÇȈȉȊȋḬḭḮḯỈỉỊịJjĴĵǰÊKkĶķƘƙǨǩḰḱḲḳḴḵLlĹĺĻļĽľĿŀÅłƚLjȴɫɬɭḶḷḸḹḺḻḼḽMmɱḾḿṀá¹á¹‚ṃNnÑñŃńŅņŇňÆɲƞȠNjǸǹȵɳṄṅṆṇṈṉṊṋOoÒòÓóÔôÕõÖöØøŌÅÅŽÅÅőƟƠơǑǒǪǫǬǭǾǿȌÈÈŽÈȪȫȬȭȮȯȰȱṌá¹á¹Žá¹á¹á¹‘ṒṓỌá»á»Žá»á»á»‘ỒồỔổỖỗỘộỚớỜá»á»žá»Ÿá» á»¡á»¢á»£PpƤƥṔṕṖṗQqÊ RrŔŕŖŗŘřÈȑȒȓɼɽɾṘṙṚṛṜá¹á¹žá¹ŸSsŚśŜÅŞşŠšȘșʂṠṡṢṣṤṥṦṧṨṩTtŢţŤťŦŧƫƬƭƮʈȚțȶṪṫṬṭṮṯṰṱẗUuÙùÚúÛûÜüŨũŪūŬŭŮůŰűŲųƯưǓǔǕǖǗǘǙǚǛǜȔȕȖȗṲṳṴṵṶṷṸṹṺṻỤụỦủỨứỪừỬửỮữỰựVvƲʋṼṽṾṿWwŴŵẀáºáº‚ẃẄẅẆẇẈẉẘXxẊẋẌáºYyÃýÿŸŶŷƳƴȲȳẎáºáº™á»²á»³á»´á»µá»¶á»·á»¸á»¹ZzŹźŻżŽžƵƶȤȥÊÊ‘áºáº‘ẒẓẔẕẕ" lang="en"/>
+<l:gentext key="normalize.sort.output" text="AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBCCCCCCCCCCCCCCCCCDDDDDDDDDDDDDDDDDDDDDDDDEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEFFFFFFGGGGGGGGGGGGGGGGGGGGHHHHHHHHHHHHHHHHHHHHIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIJJJJJJKKKKKKKKKKKKKKLLLLLLLLLLLLLLLLLLLLLLLLLLMMMMMMMMMNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOPPPPPPPPQQQRRRRRRRRRRRRRRRRRRRRRRRSSSSSSSSSSSSSSSSSSSSSSSTTTTTTTTTTTTTTTTTTTTTTTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUVVVVVVVVWWWWWWWWWWWWWWWXXXXXXYYYYYYYYYYYYYYYYYYYYYYYZZZZZZZZZZZZZZZZZZZZZ" lang="en"/>
+<l:dingbat key="startquote" text="„"/>
+<l:dingbat key="endquote" text="â€"/>
+<l:dingbat key="nestedstartquote" text="»"/>
+<l:dingbat key="nestedendquote" text="«"/>
+<l:dingbat key="singlestartquote" text="‘" lang="en"/>
+<l:dingbat key="singleendquote" text="’" lang="en"/>
+<l:dingbat key="bullet" text="•"/>
+<l:gentext key="hyphenation-character" text="-" lang="en"/>
+<l:gentext key="hyphenation-push-character-count" text="2" lang="en"/>
+<l:gentext key="hyphenation-remain-character-count" text="2" lang="en"/>
+<l:context name="styles"><l:template name="person-name" text="last-first"/>
+</l:context>
+<l:context name="title"><l:template name="abstract" text="%t"/>
+<l:template name="acknowledgements" text="%t" lang="en"/>
+<l:template name="answer" text="%t"/>
+<l:template name="appendix" text="%n. függelék - %t"/>
+<l:template name="article" text="%t"/>
+<l:template name="authorblurb" text="%t"/>
+<l:template name="bibliodiv" text="%t"/>
+<l:template name="biblioentry" text="%t"/>
+<l:template name="bibliography" text="%t"/>
+<l:template name="bibliolist" text="%t" lang="en"/>
+<l:template name="bibliomixed" text="%t"/>
+<l:template name="bibliomset" text="%t"/>
+<l:template name="biblioset" text="%t"/>
+<l:template name="blockquote" text="%t"/>
+<l:template name="book" text="%t"/>
+<l:template name="calloutlist" text="%t"/>
+<l:template name="caution" text="%t"/>
+<l:template name="chapter" text="%n. fejezet - %t"/>
+<l:template name="colophon" text="%t"/>
+<l:template name="dedication" text="%t"/>
+<l:template name="equation" text="%n. egyenlet - %t"/>
+<l:template name="example" text="%n. példa - %t"/>
+<l:template name="figure" text="%n. ábra - %t"/>
+<l:template name="foil" text="%t" lang="en"/>
+<l:template name="foilgroup" text="%t" lang="en"/>
+<l:template name="formalpara" text="%t"/>
+<l:template name="glossary" text="%t"/>
+<l:template name="glossdiv" text="%t"/>
+<l:template name="glosslist" text="%t" lang="en"/>
+<l:template name="glossentry" text="%t" lang="en"/>
+<l:template name="important" text="%t"/>
+<l:template name="index" text="%t"/>
+<l:template name="indexdiv" text="%t"/>
+<l:template name="itemizedlist" text="%t"/>
+<l:template name="legalnotice" text="%t"/>
+<l:template name="listitem" text=""/>
+<l:template name="lot" text="%t"/>
+<l:template name="msg" text="%t"/>
+<l:template name="msgexplan" text="%t"/>
+<l:template name="msgmain" text="%t"/>
+<l:template name="msgrel" text="%t"/>
+<l:template name="msgset" text="%t"/>
+<l:template name="msgsub" text="%t"/>
+<l:template name="note" text="%t"/>
+<l:template name="orderedlist" text="%t"/>
+<l:template name="part" text="%n. rész - %t"/>
+<l:template name="partintro" text="%t"/>
+<l:template name="preface" text="%t"/>
+<l:template name="procedure" text="%t"/>
+<l:template name="procedure.formal" text="Eljárás %n. %t"/>
+<l:template name="productionset" text="%t"/>
+<l:template name="productionset.formal" text="Elemcsoport %n"/>
+<l:template name="qandadiv" text="%t"/>
+<l:template name="qandaentry" text="%t"/>
+<l:template name="qandaset" text="%t"/>
+<l:template name="question" text="%t"/>
+<l:template name="refentry" text="%t"/>
+<l:template name="reference" text="%t"/>
+<l:template name="refsection" text="%t"/>
+<l:template name="refsect1" text="%t"/>
+<l:template name="refsect2" text="%t"/>
+<l:template name="refsect3" text="%t"/>
+<l:template name="refsynopsisdiv" text="%t"/>
+<l:template name="refsynopsisdivinfo" text="%t"/>
+<l:template name="segmentedlist" text="%t"/>
+<l:template name="set" text="%t"/>
+<l:template name="setindex" text="%t"/>
+<l:template name="sidebar" text="%t"/>
+<l:template name="step" text="%t"/>
+<l:template name="table" text="%n. táblázat - %t"/>
+<l:template name="task" text="%t" lang="en"/>
+<l:template name="tasksummary" text="%t" lang="en"/>
+<l:template name="taskprerequisites" text="%t" lang="en"/>
+<l:template name="taskrelated" text="%t" lang="en"/>
+<l:template name="tip" text="%t"/>
+<l:template name="toc" text="%t"/>
+<l:template name="variablelist" text="%t"/>
+<l:template name="varlistentry" text="" lang="en"/>
+<l:template name="warning" text="%t"/>
+</l:context>
+<l:context name="title-unnumbered"><l:template name="appendix" text="%t"/>
+<l:template name="article/appendix" text="%t" lang="en"/>
+<l:template name="bridgehead" text="%t"/>
+<l:template name="chapter" text="%t"/>
+<l:template name="sect1" text="%t"/>
+<l:template name="sect2" text="%t"/>
+<l:template name="sect3" text="%t"/>
+<l:template name="sect4" text="%t"/>
+<l:template name="sect5" text="%t"/>
+<l:template name="section" text="%t"/>
+<l:template name="simplesect" text="%t"/>
+<l:template name="part" text="%t" lang="en"/>
+</l:context>
+<l:context name="title-numbered"><l:template name="appendix" text="%n. függelék - %t"/>
+<l:template name="article/appendix" text="%n. %t" lang="en"/>
+<l:template name="bridgehead" text="%t"/>
+<l:template name="chapter" text="%n. fejezet - %t"/>
+<l:template name="part" text="%n. rész - %t"/>
+<l:template name="sect1" text="%n. %t"/>
+<l:template name="sect2" text="%n. %t"/>
+<l:template name="sect3" text="%n. %t"/>
+<l:template name="sect4" text="%n. %t"/>
+<l:template name="sect5" text="%n. %t"/>
+<l:template name="section" text="%n. %t"/>
+<l:template name="simplesect" text="%n. %t"/>
+</l:context>
+<l:context name="subtitle"><l:template name="appendix" text="%s"/>
+<l:template name="acknowledgements" text="%s" lang="en"/>
+<l:template name="article" text="%s"/>
+<l:template name="bibliodiv" text="%s"/>
+<l:template name="biblioentry" text="%s"/>
+<l:template name="bibliography" text="%s"/>
+<l:template name="bibliomixed" text="%s"/>
+<l:template name="bibliomset" text="%s"/>
+<l:template name="biblioset" text="%s"/>
+<l:template name="book" text="%s"/>
+<l:template name="chapter" text="%s"/>
+<l:template name="colophon" text="%s"/>
+<l:template name="dedication" text="%s"/>
+<l:template name="glossary" text="%s"/>
+<l:template name="glossdiv" text="%s"/>
+<l:template name="index" text="%s"/>
+<l:template name="indexdiv" text="%s"/>
+<l:template name="lot" text="%s"/>
+<l:template name="part" text="%s"/>
+<l:template name="partintro" text="%s"/>
+<l:template name="preface" text="%s"/>
+<l:template name="refentry" text="%s"/>
+<l:template name="reference" text="%s"/>
+<l:template name="refsection" text="%s"/>
+<l:template name="refsect1" text="%s"/>
+<l:template name="refsect2" text="%s"/>
+<l:template name="refsect3" text="%s"/>
+<l:template name="refsynopsisdiv" text="%s"/>
+<l:template name="sect1" text="%s"/>
+<l:template name="sect2" text="%s"/>
+<l:template name="sect3" text="%s"/>
+<l:template name="sect4" text="%s"/>
+<l:template name="sect5" text="%s"/>
+<l:template name="section" text="%s"/>
+<l:template name="set" text="%s"/>
+<l:template name="setindex" text="%s"/>
+<l:template name="sidebar" text="%s"/>
+<l:template name="simplesect" text="%s"/>
+<l:template name="toc" text="%s"/>
+</l:context>
+<l:context name="xref"><l:template name="abstract" text="%t"/>
+<l:template name="acknowledgements" text="%t" lang="en"/>
+<l:template name="answer" text="V: %n"/>
+<l:template name="appendix" text="%t"/>
+<l:template name="article" text="%t"/>
+<l:template name="authorblurb" text="%t"/>
+<l:template name="bibliodiv" text="%t"/>
+<l:template name="bibliography" text="%t"/>
+<l:template name="bibliomset" text="%t"/>
+<l:template name="biblioset" text="%t"/>
+<l:template name="blockquote" text="%t"/>
+<l:template name="book" text="%t"/>
+<l:template name="calloutlist" text="%t"/>
+<l:template name="caution" text="%t"/>
+<l:template name="chapter" text="%t"/>
+<l:template name="colophon" text="%t"/>
+<l:template name="constraintdef" text="%t"/>
+<l:template name="dedication" text="%t"/>
+<l:template name="equation" text="%t"/>
+<l:template name="example" text="%t"/>
+<l:template name="figure" text="%t"/>
+<l:template name="foil" text="%t" lang="en"/>
+<l:template name="foilgroup" text="%t" lang="en"/>
+<l:template name="formalpara" text="%t"/>
+<l:template name="glossary" text="%t"/>
+<l:template name="glossdiv" text="%t"/>
+<l:template name="important" text="%t"/>
+<l:template name="index" text="%t"/>
+<l:template name="indexdiv" text="%t"/>
+<l:template name="itemizedlist" text="%t"/>
+<l:template name="legalnotice" text="%t"/>
+<l:template name="listitem" text="%n"/>
+<l:template name="lot" text="%t"/>
+<l:template name="msg" text="%t"/>
+<l:template name="msgexplan" text="%t"/>
+<l:template name="msgmain" text="%t"/>
+<l:template name="msgrel" text="%t"/>
+<l:template name="msgset" text="%t"/>
+<l:template name="msgsub" text="%t"/>
+<l:template name="note" text="%t"/>
+<l:template name="orderedlist" text="%t"/>
+<l:template name="part" text="%t"/>
+<l:template name="partintro" text="%t"/>
+<l:template name="preface" text="%t"/>
+<l:template name="procedure" text="%t"/>
+<l:template name="productionset" text="%t"/>
+<l:template name="qandadiv" text="%t"/>
+<l:template name="qandaentry" text="K: %n"/>
+<l:template name="qandaset" text="%t"/>
+<l:template name="question" text="K: %n"/>
+<l:template name="reference" text="%t"/>
+<l:template name="refsynopsisdiv" text="%t"/>
+<l:template name="segmentedlist" text="%t"/>
+<l:template name="set" text="%t"/>
+<l:template name="setindex" text="%t"/>
+<l:template name="sidebar" text="%t"/>
+<l:template name="table" text="%t"/>
+<l:template name="task" text="%t" lang="en"/>
+<l:template name="tip" text="%t"/>
+<l:template name="toc" text="%t"/>
+<l:template name="variablelist" text="%t"/>
+<l:template name="varlistentry" text="%n"/>
+<l:template name="warning" text="%t"/>
+<l:template name="olink.document.citation" text=" in %o" lang="en"/>
+<l:template name="olink.page.citation" text=" (page %p)" lang="en"/>
+<l:template name="page.citation" text=" [%p]"/>
+<l:template name="page" text="(page %p)" lang="en"/>
+<l:template name="docname" text=" in %o" lang="en"/>
+<l:template name="docnamelong" text=" in the document titled %o" lang="en"/>
+<l:template name="pageabbrev" text="(p. %p)" lang="en"/>
+<l:template name="Page" text="Page %p" lang="en"/>
+<l:template name="bridgehead" text="„%tâ€"/>
+<l:template name="refsection" text="„%tâ€"/>
+<l:template name="refsect1" text="„%tâ€"/>
+<l:template name="refsect2" text="„%tâ€"/>
+<l:template name="refsect3" text="„%tâ€"/>
+<l:template name="sect1" text="„%tâ€"/>
+<l:template name="sect2" text="„%tâ€"/>
+<l:template name="sect3" text="„%tâ€"/>
+<l:template name="sect4" text="„%tâ€"/>
+<l:template name="sect5" text="„%tâ€"/>
+<l:template name="section" text="„%tâ€"/>
+<l:template name="simplesect" text="„%tâ€"/>
+</l:context>
+<l:context name="xref-number"><l:template name="answer" text="V: %n"/>
+<l:template name="appendix" text="%n. függelék"/>
+<l:template name="bridgehead" text="Szakasz %n"/>
+<l:template name="chapter" text="%n. fejezet"/>
+<l:template name="equation" text="Egyenlet %n"/>
+<l:template name="example" text="%n. példa"/>
+<l:template name="figure" text="%n. ábra"/>
+<l:template name="part" text="%n. rész"/>
+<l:template name="procedure" text="Eljárás %n"/>
+<l:template name="productionset" text="Elemcsoport %n"/>
+<l:template name="qandadiv" text="K és V %n"/>
+<l:template name="qandaentry" text="K: %n"/>
+<l:template name="question" text="K: %n"/>
+<l:template name="sect1" text="%n. szakasz"/>
+<l:template name="sect2" text="%n. szakasz"/>
+<l:template name="sect3" text="%n. szakasz"/>
+<l:template name="sect4" text="%n. szakasz"/>
+<l:template name="sect5" text="%n. szakasz"/>
+<l:template name="section" text="%n. szakasz"/>
+<l:template name="table" text="Táblázat %n"/>
+</l:context>
+<l:context name="xref-number-and-title"><l:template name="appendix" text="%n. függelék - %t"/>
+<l:template name="bridgehead" text="Szakasz %n, „%tâ€"/>
+<l:template name="chapter" text="%n. fejezet - %t"/>
+<l:template name="equation" text="Egyenlet %n, „%tâ€"/>
+<l:template name="example" text="%n. példa - %t"/>
+<l:template name="figure" text="%n. ábra - %t"/>
+<l:template name="part" text="%n. rész - %t"/>
+<l:template name="procedure" text="Eljárás %n, „%tâ€"/>
+<l:template name="productionset" text="Elemcsoport %n, „%tâ€"/>
+<l:template name="qandadiv" text="K és V %n, „%tâ€"/>
+<l:template name="refsect1" text="„%tâ€"/>
+<l:template name="refsect2" text="„%tâ€"/>
+<l:template name="refsect3" text="„%tâ€"/>
+<l:template name="refsection" text="„%tâ€"/>
+<l:template name="sect1" text="%n. szakasz - %t"/>
+<l:template name="sect2" text="%n. szakasz - %t"/>
+<l:template name="sect3" text="%n. szakasz - %t"/>
+<l:template name="sect4" text="%n. szakasz - %t"/>
+<l:template name="sect5" text="%n. szakasz - %t"/>
+<l:template name="section" text="%n. szakasz - %t"/>
+<l:template name="simplesect" text="„%tâ€"/>
+<l:template name="table" text="%n. táblázat - %t"/>
+</l:context>
+<l:context name="authorgroup"><l:template name="sep" text=", "/>
+<l:template name="sep2" text=" és "/>
+<l:template name="seplast" text=", és "/>
+</l:context>
+<l:context name="glossary"><l:template name="see" text="Lásd %t."/>
+<l:template name="seealso" text="Lásd még %t."/>
+<l:template name="seealso-separator" text=", "/>
+</l:context>
+<l:context name="msgset"><l:template name="MsgAud" text="Célközönség: "/>
+<l:template name="MsgLevel" text="Szint: "/>
+<l:template name="MsgOrig" text="Eredet: "/>
+</l:context>
+<l:context name="datetime"><l:template name="format" text="d/m/Y"/>
+</l:context>
+<l:context name="termdef"><l:template name="prefix" text="[Definition: "/>
+<l:template name="suffix" text="]"/>
+</l:context>
+<l:context name="datetime-full"><l:template name="January" text="január"/>
+<l:template name="February" text="február"/>
+<l:template name="March" text="március"/>
+<l:template name="April" text="április"/>
+<l:template name="May" text="május"/>
+<l:template name="June" text="június"/>
+<l:template name="July" text="július"/>
+<l:template name="August" text="augusztus"/>
+<l:template name="September" text="szeptember"/>
+<l:template name="October" text="október"/>
+<l:template name="November" text="november"/>
+<l:template name="December" text="december"/>
+<l:template name="Monday" text="hétfő"/>
+<l:template name="Tuesday" text="kedd"/>
+<l:template name="Wednesday" text="szerda"/>
+<l:template name="Thursday" text="csütörtök"/>
+<l:template name="Friday" text="péntek"/>
+<l:template name="Saturday" text="szombat"/>
+<l:template name="Sunday" text="vasárnap"/>
+</l:context>
+<l:context name="datetime-abbrev"><l:template name="Jan" text="jan"/>
+<l:template name="Feb" text="feb"/>
+<l:template name="Mar" text="már"/>
+<l:template name="Apr" text="ápr"/>
+<l:template name="May" text="máj"/>
+<l:template name="Jun" text="jún"/>
+<l:template name="Jul" text="júl"/>
+<l:template name="Aug" text="aug"/>
+<l:template name="Sep" text="szep"/>
+<l:template name="Oct" text="okt"/>
+<l:template name="Nov" text="nov"/>
+<l:template name="Dec" text="dec"/>
+<l:template name="Mon" text="hfő"/>
+<l:template name="Tue" text="ked"/>
+<l:template name="Wed" text="sze"/>
+<l:template name="Thu" text="csü"/>
+<l:template name="Fri" text="pén"/>
+<l:template name="Sat" text="szo"/>
+<l:template name="Sun" text="vas"/>
+</l:context>
+<l:context name="htmlhelp"><l:template name="langcode" text="0x040e Hungarian"/>
+</l:context>
+<l:context name="index"><l:template name="term-separator" text=", "/>
+<l:template name="number-separator" text=", "/>
+<l:template name="range-separator" text="-"/>
+</l:context>
+<l:context name="iso690"><l:template name="lastfirst.sep" text=", "/>
+<l:template name="alt.person.two.sep" text=" – "/>
+<l:template name="alt.person.last.sep" text=" – "/>
+<l:template name="alt.person.more.sep" text=" – "/>
+<l:template name="primary.editor" text=" (ed.)"/>
+<l:template name="primary.many" text=", et al."/>
+<l:template name="primary.sep" text=". "/>
+<l:template name="submaintitle.sep" text=": "/>
+<l:template name="title.sep" text=". "/>
+<l:template name="othertitle.sep" text=", "/>
+<l:template name="medium1" text=" ["/>
+<l:template name="medium2" text="]"/>
+<l:template name="secondary.person.sep" text="; "/>
+<l:template name="secondary.sep" text=". "/>
+<l:template name="respons.sep" text=". "/>
+<l:template name="edition.sep" text=". "/>
+<l:template name="edition.serial.sep" text=", "/>
+<l:template name="issuing.range" text="-"/>
+<l:template name="issuing.div" text=", "/>
+<l:template name="issuing.sep" text=". "/>
+<l:template name="partnr.sep" text=". "/>
+<l:template name="placepubl.sep" text=": "/>
+<l:template name="publyear.sep" text=", "/>
+<l:template name="pubinfo.sep" text=". "/>
+<l:template name="spec.pubinfo.sep" text=", "/>
+<l:template name="upd.sep" text=", "/>
+<l:template name="datecit1" text=" [cited "/>
+<l:template name="datecit2" text="]"/>
+<l:template name="extent.sep" text=". "/>
+<l:template name="locs.sep" text=", "/>
+<l:template name="location.sep" text=". "/>
+<l:template name="serie.sep" text=". "/>
+<l:template name="notice.sep" text=". "/>
+<l:template name="access" text="Available "/>
+<l:template name="acctoo" text="Also available "/>
+<l:template name="onwww" text="from World Wide Web"/>
+<l:template name="oninet" text="from Internet"/>
+<l:template name="access.end" text=": "/>
+<l:template name="link1" text="&lt;"/>
+<l:template name="link2" text="&gt;"/>
+<l:template name="access.sep" text=". "/>
+<l:template name="isbn" text="ISBN "/>
+<l:template name="issn" text="ISSN "/>
+<l:template name="stdnum.sep" text=". "/>
+<l:template name="patcountry.sep" text=". "/>
+<l:template name="pattype.sep" text=", "/>
+<l:template name="patnum.sep" text=". "/>
+<l:template name="patdate.sep" text=". "/>
+</l:context><l:letters><l:l i="-1"/>
+<l:l i="0">Jelzések</l:l>
+<l:l i="10">A</l:l>
+<l:l i="10">a</l:l>
+<l:l i="10">Ã</l:l>
+<l:l i="10">á</l:l>
+<l:l i="20">B</l:l>
+<l:l i="20">b</l:l>
+<l:l i="30">C</l:l>
+<l:l i="30">c</l:l>
+<l:l i="40">D</l:l>
+<l:l i="40">d</l:l>
+<l:l i="50">E</l:l>
+<l:l i="50">e</l:l>
+<l:l i="50">É</l:l>
+<l:l i="50">é</l:l>
+<l:l i="60">F</l:l>
+<l:l i="60">f</l:l>
+<l:l i="70">G</l:l>
+<l:l i="70">g</l:l>
+<l:l i="80">H</l:l>
+<l:l i="80">h</l:l>
+<l:l i="90">I</l:l>
+<l:l i="90">i</l:l>
+<l:l i="90">Ã</l:l>
+<l:l i="90">í</l:l>
+<l:l i="100">J</l:l>
+<l:l i="100">j</l:l>
+<l:l i="110">K</l:l>
+<l:l i="110">k</l:l>
+<l:l i="120">L</l:l>
+<l:l i="120">l</l:l>
+<l:l i="130">M</l:l>
+<l:l i="130">m</l:l>
+<l:l i="140">N</l:l>
+<l:l i="140">n</l:l>
+<l:l i="150">O</l:l>
+<l:l i="150">o</l:l>
+<l:l i="150">Ó</l:l>
+<l:l i="150">ó</l:l>
+<l:l i="160">Ö</l:l>
+<l:l i="160">ö</l:l>
+<l:l i="160">Å</l:l>
+<l:l i="160">Å‘</l:l>
+<l:l i="170">P</l:l>
+<l:l i="170">p</l:l>
+<l:l i="180">Q</l:l>
+<l:l i="180">q</l:l>
+<l:l i="190">R</l:l>
+<l:l i="190">r</l:l>
+<l:l i="200">S</l:l>
+<l:l i="200">s</l:l>
+<l:l i="210">T</l:l>
+<l:l i="210">t</l:l>
+<l:l i="220">U</l:l>
+<l:l i="220">u</l:l>
+<l:l i="220">Ú</l:l>
+<l:l i="220">ú</l:l>
+<l:l i="230">Ü</l:l>
+<l:l i="230">ü</l:l>
+<l:l i="230">Å°</l:l>
+<l:l i="230">ű</l:l>
+<l:l i="240">V</l:l>
+<l:l i="240">v</l:l>
+<l:l i="250">W</l:l>
+<l:l i="250">w</l:l>
+<l:l i="260">X</l:l>
+<l:l i="260">x</l:l>
+<l:l i="270">Y</l:l>
+<l:l i="270">y</l:l>
+<l:l i="280">Z</l:l>
+<l:l i="280">z</l:l>
+</l:letters>
+</l:l10n>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/id.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/id.xml
new file mode 100644
index 0000000..b730ad8
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/id.xml
@@ -0,0 +1,1229 @@
+<?xml version="1.0" encoding="utf-8"?>
+<l:l10n xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0" language="id" english-language-name="Indonesian">
+
+<!-- * This file is generated automatically. -->
+<!-- * To submit changes to this file upstream (to the DocBook Project) -->
+<!-- * do not submit an edited version of this file. Instead, submit an -->
+<!-- * edited version of the source file at the following location: -->
+<!-- * -->
+<!-- * https://docbook.svn.sourceforge.net/svnroot/docbook/trunk/gentext/locale/id.xml -->
+<!-- * -->
+<!-- * E-mail the edited id.xml source file to: -->
+<!-- * -->
+<!-- * docbook-developers@lists.sourceforge.net -->
+
+<!-- ******************************************************************** -->
+
+<!-- This file is part of the XSL DocBook Stylesheet distribution. -->
+<!-- See ../README or http://docbook.sf.net/release/xsl/current/ for -->
+<!-- copyright and other information. -->
+
+<!-- ******************************************************************** -->
+<!-- In these files, % with a letter is used for a placeholder: -->
+<!-- %t is the current element's title -->
+<!-- %s is the current element's subtitle (if applicable)-->
+<!-- %n is the current element's number label-->
+<!-- %p is the current element's page number (if applicable)-->
+<!-- ******************************************************************** -->
+
+
+<l:gentext key="Abstract" text="Abstrak"/>
+<l:gentext key="abstract" text="abstrak"/>
+<l:gentext key="Acknowledgements" text="Penghargaan"/>
+<l:gentext key="acknowledgements" text="penghargaan"/>
+<l:gentext key="Answer" text="Jawab:"/>
+<l:gentext key="answer" text="jawab:"/>
+<l:gentext key="Appendix" text="Lampiran"/>
+<l:gentext key="appendix" text="lampiran"/>
+<l:gentext key="Article" text="Artikel"/>
+<l:gentext key="article" text="artikel"/>
+<l:gentext key="Author" text="Penulis"/>
+<l:gentext key="Bibliography" text="Bibliografi"/>
+<l:gentext key="bibliography" text="bibliografi"/>
+<l:gentext key="Book" text="Buku"/>
+<l:gentext key="book" text="buku"/>
+<l:gentext key="CAUTION" text="PERHATIAN"/>
+<l:gentext key="Caution" text="Perhatian"/>
+<l:gentext key="caution" text="perhatian"/>
+<l:gentext key="Chapter" text="Bab"/>
+<l:gentext key="chapter" text="bab"/>
+<l:gentext key="Colophon" text="Kolofon"/>
+<l:gentext key="colophon" text="kolofon"/>
+<l:gentext key="Copyright" text="Hak Cipta"/>
+<l:gentext key="copyright" text="hak cipta"/>
+<l:gentext key="Dedication" text="Dedikasi"/>
+<l:gentext key="dedication" text="dedikasi"/>
+<l:gentext key="Edition" text="Edisi"/>
+<l:gentext key="edition" text="edisi"/>
+<l:gentext key="Editor" text="Penyunting"/>
+<l:gentext key="Equation" text="Persamaan"/>
+<l:gentext key="equation" text="persamaan"/>
+<l:gentext key="Example" text="Contoh"/>
+<l:gentext key="example" text="contoh"/>
+<l:gentext key="Figure" text="Gambar"/>
+<l:gentext key="figure" text="gambar"/>
+<l:gentext key="Glossary" text="Daftar Istilah"/>
+<l:gentext key="glossary" text="daftar istilah"/>
+<l:gentext key="GlossSee" text="Lihat"/>
+<l:gentext key="glosssee" text="lihat"/>
+<l:gentext key="GlossSeeAlso" text="Lihat Juga"/>
+<l:gentext key="glossseealso" text="lihat juga"/>
+<l:gentext key="IMPORTANT" text="PENTING"/>
+<l:gentext key="important" text="penting"/>
+<l:gentext key="Important" text="Penting"/>
+<l:gentext key="Index" text="Indeks"/>
+<l:gentext key="index" text="indeks"/>
+<l:gentext key="ISBN" text="ISBN"/>
+<l:gentext key="isbn" text="isbn"/>
+<l:gentext key="LegalNotice" text="Aspek Hukum"/>
+<l:gentext key="legalnotice" text="aspek hukum"/>
+<l:gentext key="MsgAud" text="Pemirsa"/>
+<l:gentext key="msgaud" text="pemirsa"/>
+<l:gentext key="MsgLevel" text="Tingkatan"/>
+<l:gentext key="msglevel" text="tingkatan"/>
+<l:gentext key="MsgOrig" text="Asal"/>
+<l:gentext key="msgorig" text="asal"/>
+<l:gentext key="NOTE" text="CATATAN"/>
+<l:gentext key="Note" text="Catatan"/>
+<l:gentext key="note" text="catatan"/>
+<l:gentext key="Part" text="Bagian"/>
+<l:gentext key="part" text="bagian"/>
+<l:gentext key="Preface" text="Kata Pengantar"/>
+<l:gentext key="preface" text="kata pengantar"/>
+<l:gentext key="Procedure" text="Prosedur"/>
+<l:gentext key="procedure" text="Prosedur"/>
+<l:gentext key="ProductionSet" text="produksi"/>
+<l:gentext key="PubDate" text="Tanggal Publikasi"/>
+<l:gentext key="pubdate" text="tanggal publikasi"/>
+<l:gentext key="Published" text="Diterbitkan"/>
+<l:gentext key="published" text="diterbitkan"/>
+<l:gentext key="Publisher" text="Penerbit"/>
+<l:gentext key="Qandadiv" text="Tanya dan Jawab"/>
+<l:gentext key="qandadiv" text="Tanya dan Jawab"/>
+<l:gentext key="QandASet" text="Pertanyaan yang Sering Diajukan"/>
+<l:gentext key="Question" text="Tanya:"/>
+<l:gentext key="question" text="Tanya:"/>
+<l:gentext key="RefEntry" text="Halaman"/>
+<l:gentext key="refentry" text="halaman"/>
+<l:gentext key="Reference" text="Rujukan"/>
+<l:gentext key="reference" text="Rujukan"/>
+<l:gentext key="References" text="Rujukan-rujukan"/>
+<l:gentext key="RefName" text="Nama"/>
+<l:gentext key="refname" text="Nama"/>
+<l:gentext key="RefSection" text="Bagian"/>
+<l:gentext key="refsection" text="bagian"/>
+<l:gentext key="RefSynopsisDiv" text="Sinopsis"/>
+<l:gentext key="refsynopsisdiv" text="Sinopsis"/>
+<l:gentext key="RevHistory" text="Riwayat Revisi"/>
+<l:gentext key="revhistory" text="ciwayat revisi"/>
+<l:gentext key="revision" text="revisi"/>
+<l:gentext key="Revision" text="Revisi"/>
+<l:gentext key="sect1" text="Bagian"/>
+<l:gentext key="sect2" text="Bagian"/>
+<l:gentext key="sect3" text="Bagian"/>
+<l:gentext key="sect4" text="Bagian"/>
+<l:gentext key="sect5" text="Bagian"/>
+<l:gentext key="section" text="bagian"/>
+<l:gentext key="Section" text="Bagian"/>
+<l:gentext key="see" text="lihat"/>
+<l:gentext key="See" text="Lihat"/>
+<l:gentext key="seealso" text="lihat juga"/>
+<l:gentext key="Seealso" text="Lihat juga"/>
+<l:gentext key="SeeAlso" text="Lihat Juga"/>
+<l:gentext key="set" text="set"/>
+<l:gentext key="Set" text="Set"/>
+<l:gentext key="setindex" text="indeks set"/>
+<l:gentext key="SetIndex" text="Indeks Set"/>
+<l:gentext key="Sidebar" text="Panel Sisi"/>
+<l:gentext key="sidebar" text="panel sisi"/>
+<l:gentext key="step" text="tahap"/>
+<l:gentext key="Step" text="Tahap"/>
+<l:gentext key="table" text="Tabel"/>
+<l:gentext key="Table" text="Tabel"/>
+<l:gentext key="task" text="tugas"/>
+<l:gentext key="Task" text="Tugas"/>
+<l:gentext key="tip" text="Tip"/>
+<l:gentext key="TIP" text="TIP"/>
+<l:gentext key="Tip" text="Tip"/>
+<l:gentext key="Warning" text="Awas"/>
+<l:gentext key="warning" text="Awas"/>
+<l:gentext key="WARNING" text="AWAS"/>
+<l:gentext key="and" text="dan"/>
+<l:gentext key="by" text="oleh"/>
+<l:gentext key="Edited" text="Disunting"/>
+<l:gentext key="edited" text="disunting"/>
+<l:gentext key="Editedby" text="Disunting oleh"/>
+<l:gentext key="editedby" text="disunting oleh"/>
+<l:gentext key="in" text="di"/>
+<l:gentext key="lastlistcomma" text=","/>
+<l:gentext key="listcomma" text=","/>
+<l:gentext key="notes" text="Catatan"/>
+<l:gentext key="Notes" text="catatan"/>
+<l:gentext key="Pgs" text="Hal."/>
+<l:gentext key="pgs" text="hal."/>
+<l:gentext key="Revisedby" text="Direvisi oleh: "/>
+<l:gentext key="revisedby" text="direvisi oleh: "/>
+<l:gentext key="TableNotes" text="Catatan"/>
+<l:gentext key="tablenotes" text="catatan"/>
+<l:gentext key="TableofContents" text="Daftar Isi"/>
+<l:gentext key="tableofcontents" text="daftar isi"/>
+<l:gentext key="unexpectedelementname" text="Nama elemen tak terduga"/>
+<l:gentext key="unsupported" text="tidak didukung"/>
+<l:gentext key="xrefto" text="xref ke"/>
+<l:gentext key="Authors" text="Penulis"/>
+<l:gentext key="copyeditor" text="Pemeriksa Naskah"/>
+<l:gentext key="graphicdesigner" text="Perancang Grafis"/>
+<l:gentext key="productioneditor" text="Penyunting Produksi"/>
+<l:gentext key="technicaleditor" text="Penyunting Teknis"/>
+<l:gentext key="translator" text="Penerjemah"/>
+<l:gentext key="listofequations" text="daftar persamaan"/>
+<l:gentext key="ListofEquations" text="Daftar Persamaan"/>
+<l:gentext key="ListofExamples" text="Daftar Contoh"/>
+<l:gentext key="listofexamples" text="daftar contoh"/>
+<l:gentext key="ListofFigures" text="Daftar Gambar"/>
+<l:gentext key="listoffigures" text="daftar gambar"/>
+<l:gentext key="ListofProcedures" text="Daftar Prosedur"/>
+<l:gentext key="listofprocedures" text="daftar prosedur"/>
+<l:gentext key="listoftables" text="daftar tabel"/>
+<l:gentext key="ListofTables" text="Daftar Tabel"/>
+<l:gentext key="ListofUnknown" text="Daftar Tidak Dikenal"/>
+<l:gentext key="listofunknown" text="daftar tidak dikenal"/>
+<l:gentext key="nav-home" text="Depan"/>
+<l:gentext key="nav-next" text="Lanjut"/>
+<l:gentext key="nav-next-sibling" text="Lompat ke Depan"/>
+<l:gentext key="nav-prev" text="Sebelumnya"/>
+<l:gentext key="nav-prev-sibling" text="Lompat ke Belakang"/>
+<l:gentext key="nav-up" text="Induk"/>
+<l:gentext key="nav-toc" text="Daftar Isi"/>
+<l:gentext key="Draft" text="Draf"/>
+<l:gentext key="above" text="di atas"/>
+<l:gentext key="below" text="di bawah"/>
+<l:gentext key="sectioncalled" text="bagian bernama"/>
+<l:gentext key="index symbols" text="Simbol"/>
+<l:gentext key="writing-mode" text="lr-tb"/>
+<l:gentext key="lowercase.alpha" text="abcdefghijklmnopqrstuvwxyz"/>
+<l:gentext key="uppercase.alpha" text="ABCDEFGHIJKLMNOPQRSTUVWXYZ"/>
+<l:gentext key="normalize.sort.input" text="AaÀàÃáÂâÃãÄäÅåĀÄĂ㥹ÇǎǞǟǠǡǺǻȀÈȂȃȦȧḀá¸áºšáº áº¡áº¢áº£áº¤áº¥áº¦áº§áº¨áº©áºªáº«áº¬áº­áº®áº¯áº°áº±áº²áº³áº´áºµáº¶áº·BbÆ€ÆɓƂƃḂḃḄḅḆḇCcÇçĆćĈĉĊċČÄƇƈɕḈḉDdÄŽÄÄđƊɗƋƌDžDzȡɖḊḋḌá¸á¸Žá¸á¸á¸‘ḒḓEeÈèÉéÊêËëĒēĔĕĖėĘęĚěȄȅȆȇȨȩḔḕḖḗḘḙḚḛḜá¸áº¸áº¹áººáº»áº¼áº½áº¾áº¿á»€á»á»‚ểỄễỆệFfƑƒḞḟGgÄœÄĞğĠġĢģƓɠǤǥǦǧǴǵḠḡHhĤĥĦħȞȟɦḢḣḤḥḦḧḨḩḪḫẖIiÌìÃíÎîÃïĨĩĪīĬĭĮįİƗɨÇÇȈȉȊȋḬḭḮḯỈỉỊịJjĴĵǰÊKkĶķƘƙǨǩḰḱḲḳḴḵLlĹĺĻļĽľĿŀÅłƚLjȴɫɬɭḶḷḸḹḺḻḼḽMmɱḾḿṀá¹á¹‚ṃNnÑñŃńŅņŇňÆɲƞȠNjǸǹȵɳṄṅṆṇṈṉṊṋOoÒòÓóÔôÕõÖöØøŌÅÅŽÅÅőƟƠơǑǒǪǫǬǭǾǿȌÈÈŽÈȪȫȬȭȮȯȰȱṌá¹á¹Žá¹á¹á¹‘ṒṓỌá»á»Žá»á»á»‘ỒồỔổỖỗỘộỚớỜá»á»žá»Ÿá» á»¡á»¢á»£PpƤƥṔṕṖṗQqÊ RrŔŕŖŗŘřÈȑȒȓɼɽɾṘṙṚṛṜá¹á¹žá¹ŸSsŚśŜÅŞşŠšȘșʂṠṡṢṣṤṥṦṧṨṩTtŢţŤťŦŧƫƬƭƮʈȚțȶṪṫṬṭṮṯṰṱẗUuÙùÚúÛûÜüŨũŪūŬŭŮůŰűŲųƯưǓǔǕǖǗǘǙǚǛǜȔȕȖȗṲṳṴṵṶṷṸṹṺṻỤụỦủỨứỪừỬửỮữỰựVvƲʋṼṽṾṿWwŴŵẀáºáº‚ẃẄẅẆẇẈẉẘXxẊẋẌáºYyÃýÿŸŶŷƳƴȲȳẎáºáº™á»²á»³á»´á»µá»¶á»·á»¸á»¹ZzŹźŻżŽžƵƶȤȥÊÊ‘áºáº‘ẒẓẔẕẕ" lang="en"/>
+<l:gentext key="normalize.sort.output" text="AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBCCCCCCCCCCCCCCCCCDDDDDDDDDDDDDDDDDDDDDDDDEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEFFFFFFGGGGGGGGGGGGGGGGGGGGHHHHHHHHHHHHHHHHHHHHIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIJJJJJJKKKKKKKKKKKKKKLLLLLLLLLLLLLLLLLLLLLLLLLLMMMMMMMMMNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOPPPPPPPPQQQRRRRRRRRRRRRRRRRRRRRRRRSSSSSSSSSSSSSSSSSSSSSSSTTTTTTTTTTTTTTTTTTTTTTTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUVVVVVVVVWWWWWWWWWWWWWWWXXXXXXYYYYYYYYYYYYYYYYYYYYYYYZZZZZZZZZZZZZZZZZZZZZ" lang="en"/>
+<l:dingbat key="startquote" text="“"/>
+<l:dingbat key="endquote" text="â€"/>
+<l:dingbat key="nestedstartquote" text="‘"/>
+<l:dingbat key="nestedendquote" text="’"/>
+<l:dingbat key="singlestartquote" text="‘"/>
+<l:dingbat key="singleendquote" text="’"/>
+<l:dingbat key="bullet" text="•"/>
+<l:gentext key="hyphenation-character" text="-"/>
+<l:gentext key="hyphenation-push-character-count" text="2"/>
+<l:gentext key="hyphenation-remain-character-count" text="2"/>
+<l:context name="styles"><l:template name="person-name" text="first-last"/>
+</l:context>
+<l:context name="title"><l:template name="abstract" text="%t"/>
+<l:template name="acknowledgements" text="%t" lang="en"/>
+<l:template name="answer" text="%t"/>
+<l:template name="appendix" text="Lampiran %n. %t"/>
+<l:template name="article" text="%t"/>
+<l:template name="authorblurb" text="%t"/>
+<l:template name="bibliodiv" text="%t"/>
+<l:template name="biblioentry" text="%t"/>
+<l:template name="bibliography" text="%t"/>
+<l:template name="bibliolist" text="%t"/>
+<l:template name="bibliomixed" text="%t"/>
+<l:template name="bibliomset" text="%t"/>
+<l:template name="biblioset" text="%t"/>
+<l:template name="blockquote" text="%t"/>
+<l:template name="book" text="%t"/>
+<l:template name="calloutlist" text="%t"/>
+<l:template name="caution" text="%t"/>
+<l:template name="chapter" text="Bab %n. %t"/>
+<l:template name="colophon" text="%t"/>
+<l:template name="dedication" text="%t"/>
+<l:template name="equation" text="Persamaan %n. %t"/>
+<l:template name="example" text="Contoh %n. %t"/>
+<l:template name="figure" text="Gambar %n. %t"/>
+<l:template name="foil" text="%t"/>
+<l:template name="foilgroup" text="%t"/>
+<l:template name="formalpara" text="%t"/>
+<l:template name="glossary" text="%t"/>
+<l:template name="glossdiv" text="%t"/>
+<l:template name="glosslist" text="%t"/>
+<l:template name="glossentry" text="%t"/>
+<l:template name="important" text="%t"/>
+<l:template name="index" text="%t"/>
+<l:template name="indexdiv" text="%t"/>
+<l:template name="itemizedlist" text="%t"/>
+<l:template name="legalnotice" text="%t"/>
+<l:template name="listitem" text=""/>
+<l:template name="lot" text="%t"/>
+<l:template name="msg" text="%t"/>
+<l:template name="msgexplan" text="%t"/>
+<l:template name="msgmain" text="%t"/>
+<l:template name="msgrel" text="%t"/>
+<l:template name="msgset" text="%t"/>
+<l:template name="msgsub" text="%t"/>
+<l:template name="note" text="%t"/>
+<l:template name="orderedlist" text="%t"/>
+<l:template name="part" text="Bagian %n. %t"/>
+<l:template name="partintro" text="%t"/>
+<l:template name="preface" text="%t"/>
+<l:template name="procedure" text="%t"/>
+<l:template name="procedure.formal" text="Prosedur %n. %t"/>
+<l:template name="productionset" text="%t"/>
+<l:template name="productionset.formal" text="produksi %n"/>
+<l:template name="qandadiv" text="%t"/>
+<l:template name="qandaentry" text="%t"/>
+<l:template name="qandaset" text="%t"/>
+<l:template name="question" text="%t"/>
+<l:template name="refentry" text="%t"/>
+<l:template name="reference" text="%t"/>
+<l:template name="refsection" text="%t"/>
+<l:template name="refsect1" text="%t"/>
+<l:template name="refsect2" text="%t"/>
+<l:template name="refsect3" text="%t"/>
+<l:template name="refsynopsisdiv" text="%t"/>
+<l:template name="refsynopsisdivinfo" text="%t"/>
+<l:template name="segmentedlist" text="%t"/>
+<l:template name="set" text="%t"/>
+<l:template name="setindex" text="%t"/>
+<l:template name="sidebar" text="%t"/>
+<l:template name="step" text="%t"/>
+<l:template name="table" text="Tabel %n. %t"/>
+<l:template name="task" text="%t"/>
+<l:template name="tasksummary" text="%t" lang="en"/>
+<l:template name="taskprerequisites" text="%t" lang="en"/>
+<l:template name="taskrelated" text="%t" lang="en"/>
+<l:template name="tip" text="%t"/>
+<l:template name="toc" text="%t"/>
+<l:template name="variablelist" text="%t"/>
+<l:template name="varlistentry" text="" lang="en"/>
+<l:template name="warning" text="%t"/>
+</l:context>
+<l:context name="title-unnumbered"><l:template name="appendix" text="%t"/>
+<l:template name="article/appendix" text="%t"/>
+<l:template name="bridgehead" text="%t"/>
+<l:template name="chapter" text="%t"/>
+<l:template name="sect1" text="%t"/>
+<l:template name="sect2" text="%t"/>
+<l:template name="sect3" text="%t"/>
+<l:template name="sect4" text="%t"/>
+<l:template name="sect5" text="%t"/>
+<l:template name="section" text="%t"/>
+<l:template name="simplesect" text="%t"/>
+<l:template name="part" text="%t"/>
+</l:context>
+<l:context name="title-numbered"><l:template name="appendix" text="Lampiran %n. %t"/>
+<l:template name="article/appendix" text="%n. %t"/>
+<l:template name="bridgehead" text="%t"/>
+<l:template name="chapter" text="Bab %n. %t"/>
+<l:template name="part" text="Bagian %n. %t"/>
+<l:template name="sect1" text="%n. %t"/>
+<l:template name="sect2" text="%n. %t"/>
+<l:template name="sect3" text="%n. %t"/>
+<l:template name="sect4" text="%n. %t"/>
+<l:template name="sect5" text="%n. %t"/>
+<l:template name="section" text="%n. %t"/>
+<l:template name="simplesect" text="%n. %t"/>
+</l:context>
+<l:context name="subtitle"><l:template name="appendix" text="%s"/>
+<l:template name="acknowledgements" text="%s" lang="en"/>
+<l:template name="article" text="%s"/>
+<l:template name="bibliodiv" text="%s"/>
+<l:template name="biblioentry" text="%s"/>
+<l:template name="bibliography" text="%s"/>
+<l:template name="bibliomixed" text="%s"/>
+<l:template name="bibliomset" text="%s"/>
+<l:template name="biblioset" text="%s"/>
+<l:template name="book" text="%s"/>
+<l:template name="chapter" text="%s"/>
+<l:template name="colophon" text="%s"/>
+<l:template name="dedication" text="%s"/>
+<l:template name="glossary" text="%s"/>
+<l:template name="glossdiv" text="%s"/>
+<l:template name="index" text="%s"/>
+<l:template name="indexdiv" text="%s"/>
+<l:template name="lot" text="%s"/>
+<l:template name="part" text="%s"/>
+<l:template name="partintro" text="%s"/>
+<l:template name="preface" text="%s"/>
+<l:template name="refentry" text="%s"/>
+<l:template name="reference" text="%s"/>
+<l:template name="refsection" text="%s"/>
+<l:template name="refsect1" text="%s"/>
+<l:template name="refsect2" text="%s"/>
+<l:template name="refsect3" text="%s"/>
+<l:template name="refsynopsisdiv" text="%s"/>
+<l:template name="sect1" text="%s"/>
+<l:template name="sect2" text="%s"/>
+<l:template name="sect3" text="%s"/>
+<l:template name="sect4" text="%s"/>
+<l:template name="sect5" text="%s"/>
+<l:template name="section" text="%s"/>
+<l:template name="set" text="%s"/>
+<l:template name="setindex" text="%s"/>
+<l:template name="sidebar" text="%s"/>
+<l:template name="simplesect" text="%s"/>
+<l:template name="toc" text="%s"/>
+</l:context>
+<l:context name="xref"><l:template name="abstract" text="%t"/>
+<l:template name="acknowledgements" text="%t" lang="en"/>
+<l:template name="answer" text="Jawab: %n"/>
+<l:template name="appendix" text="%t"/>
+<l:template name="article" text="%t"/>
+<l:template name="authorblurb" text="%t"/>
+<l:template name="bibliodiv" text="%t"/>
+<l:template name="bibliography" text="%t"/>
+<l:template name="bibliomset" text="%t"/>
+<l:template name="biblioset" text="%t"/>
+<l:template name="blockquote" text="%t"/>
+<l:template name="book" text="%t"/>
+<l:template name="calloutlist" text="%t"/>
+<l:template name="caution" text="%t"/>
+<l:template name="chapter" text="%t"/>
+<l:template name="colophon" text="%t"/>
+<l:template name="constraintdef" text="%t"/>
+<l:template name="dedication" text="%t"/>
+<l:template name="equation" text="%t"/>
+<l:template name="example" text="%t"/>
+<l:template name="figure" text="%t"/>
+<l:template name="foil" text="%t"/>
+<l:template name="foilgroup" text="%t"/>
+<l:template name="formalpara" text="%t"/>
+<l:template name="glossary" text="%t"/>
+<l:template name="glossdiv" text="%t"/>
+<l:template name="important" text="%t"/>
+<l:template name="index" text="%t"/>
+<l:template name="indexdiv" text="%t"/>
+<l:template name="itemizedlist" text="%t"/>
+<l:template name="legalnotice" text="%t"/>
+<l:template name="listitem" text="%n"/>
+<l:template name="lot" text="%t"/>
+<l:template name="msg" text="%t"/>
+<l:template name="msgexplan" text="%t"/>
+<l:template name="msgmain" text="%t"/>
+<l:template name="msgrel" text="%t"/>
+<l:template name="msgset" text="%t"/>
+<l:template name="msgsub" text="%t"/>
+<l:template name="note" text="%t"/>
+<l:template name="orderedlist" text="%t"/>
+<l:template name="part" text="%t"/>
+<l:template name="partintro" text="%t"/>
+<l:template name="preface" text="%t"/>
+<l:template name="procedure" text="%t"/>
+<l:template name="productionset" text="%t"/>
+<l:template name="qandadiv" text="%t"/>
+<l:template name="qandaentry" text="Tanya: %n"/>
+<l:template name="qandaset" text="%t"/>
+<l:template name="question" text="Tanya: %n"/>
+<l:template name="reference" text="%t"/>
+<l:template name="refsynopsisdiv" text="%t"/>
+<l:template name="segmentedlist" text="%t"/>
+<l:template name="set" text="%t"/>
+<l:template name="setindex" text="%t"/>
+<l:template name="sidebar" text="%t"/>
+<l:template name="table" text="%t"/>
+<l:template name="task" text="%t" lang="en"/>
+<l:template name="tip" text="%t"/>
+<l:template name="toc" text="%t"/>
+<l:template name="variablelist" text="%t"/>
+<l:template name="varlistentry" text="%n"/>
+<l:template name="warning" text="%t"/>
+<l:template name="olink.document.citation" text=" di %o"/>
+<l:template name="olink.page.citation" text=" (halaman %p)"/>
+<l:template name="page.citation" text=" [%p]"/>
+<l:template name="page" text="(halaman %p)"/>
+<l:template name="docname" text=" di %o"/>
+<l:template name="docnamelong" text=" pada dokumen berjudul %o"/>
+<l:template name="pageabbrev" text="(h. %p)"/>
+<l:template name="Page" text="Halaman %p"/>
+<l:template name="bridgehead" text="bagian bernama “%tâ€"/>
+<l:template name="refsection" text="bagian bernama “%tâ€"/>
+<l:template name="refsect1" text="bagian bernama “%tâ€"/>
+<l:template name="refsect2" text="bagian bernama “%tâ€"/>
+<l:template name="refsect3" text="bagian bernama “%tâ€"/>
+<l:template name="sect1" text="bagian bernama “%tâ€"/>
+<l:template name="sect2" text="bagian bernama “%tâ€"/>
+<l:template name="sect3" text="bagian bernama “%tâ€"/>
+<l:template name="sect4" text="bagian bernama “%tâ€"/>
+<l:template name="sect5" text="bagian bernama “%tâ€"/>
+<l:template name="section" text="bagian bernama “%tâ€"/>
+<l:template name="simplesect" text="bagian bernama “%tâ€"/>
+</l:context>
+<l:context name="xref-number"><l:template name="answer" text="Jawab: %n"/>
+<l:template name="appendix" text="Lampiran %n"/>
+<l:template name="bridgehead" text="Bagian %n"/>
+<l:template name="chapter" text="Bab %n"/>
+<l:template name="equation" text="Persamaan %n"/>
+<l:template name="example" text="Contoh %n"/>
+<l:template name="figure" text="Gambar %n"/>
+<l:template name="part" text="Bagian %n"/>
+<l:template name="procedure" text="Prosedur %n"/>
+<l:template name="productionset" text="produksi %n"/>
+<l:template name="qandadiv" text="Tanya dan Jawab %n"/>
+<l:template name="qandaentry" text="Tanya: %n"/>
+<l:template name="question" text="Tanya: %n"/>
+<l:template name="sect1" text="Bagian %n"/>
+<l:template name="sect2" text="Bagian %n"/>
+<l:template name="sect3" text="Bagian %n"/>
+<l:template name="sect4" text="Bagian %n"/>
+<l:template name="sect5" text="Bagian %n"/>
+<l:template name="section" text="Bagian %n"/>
+<l:template name="table" text="Tabel %n"/>
+</l:context>
+<l:context name="xref-number-and-title"><l:template name="appendix" text="Lampiran %n, %t"/>
+<l:template name="bridgehead" text="Bagian %n, “%tâ€"/>
+<l:template name="chapter" text="Bab %n, %t"/>
+<l:template name="equation" text="Persamaan %n, “%tâ€"/>
+<l:template name="example" text="Contoh %n, “%tâ€"/>
+<l:template name="figure" text="Gambar %n, “%tâ€"/>
+<l:template name="part" text="Bagian %n, “%tâ€"/>
+<l:template name="procedure" text="Prosedur %n, “%tâ€"/>
+<l:template name="productionset" text="produksi %n, “%tâ€"/>
+<l:template name="qandadiv" text="Tanya dan Jawab %n, “%tâ€"/>
+<l:template name="refsect1" text="bagian bernama “%tâ€"/>
+<l:template name="refsect2" text="bagian bernama “%tâ€"/>
+<l:template name="refsect3" text="bagian bernama “%tâ€"/>
+<l:template name="refsection" text="bagian bernama “%tâ€"/>
+<l:template name="sect1" text="Bagian %n, “%tâ€"/>
+<l:template name="sect2" text="Bagian %n, “%tâ€"/>
+<l:template name="sect3" text="Bagian %n, “%tâ€"/>
+<l:template name="sect4" text="Bagian %n, “%tâ€"/>
+<l:template name="sect5" text="Bagian %n, “%tâ€"/>
+<l:template name="section" text="Bagian %n, “%tâ€"/>
+<l:template name="simplesect" text="bagian bernama “%tâ€"/>
+<l:template name="table" text="Tabel %n, “%tâ€"/>
+</l:context>
+<l:context name="authorgroup"><l:template name="sep" text=", "/>
+<l:template name="sep2" text=" dan "/>
+<l:template name="seplast" text=", dan "/>
+</l:context>
+<l:context name="glossary"><l:template name="see" text="Lihat %t."/>
+<l:template name="seealso" text="Lihat Juga %t."/>
+<l:template name="seealso-separator" text=", "/>
+</l:context>
+<l:context name="msgset"><l:template name="MsgAud" text="Pemirsa: "/>
+<l:template name="MsgLevel" text="Tingkatan: "/>
+<l:template name="MsgOrig" text="Asal: "/>
+</l:context>
+<l:context name="datetime"><l:template name="format" text="m/d/Y"/>
+</l:context>
+<l:context name="termdef"><l:template name="prefix" text="[Definition: "/>
+<l:template name="suffix" text="]"/>
+</l:context>
+<l:context name="datetime-full"><l:template name="January" text="Januari"/>
+<l:template name="February" text="Februari"/>
+<l:template name="March" text="Maret"/>
+<l:template name="April" text="April"/>
+<l:template name="May" text="Mei"/>
+<l:template name="June" text="Juni"/>
+<l:template name="July" text="Juli"/>
+<l:template name="August" text="Agustus"/>
+<l:template name="September" text="September"/>
+<l:template name="October" text="Oktober"/>
+<l:template name="November" text="November"/>
+<l:template name="December" text="Desember"/>
+<l:template name="Monday" text="Senin"/>
+<l:template name="Tuesday" text="Selasa"/>
+<l:template name="Wednesday" text="Rabu"/>
+<l:template name="Thursday" text="Kamis"/>
+<l:template name="Friday" text="Jumat"/>
+<l:template name="Saturday" text="Sabtu"/>
+<l:template name="Sunday" text="Ahad"/>
+</l:context>
+<l:context name="datetime-abbrev"><l:template name="Jan" text="Jan"/>
+<l:template name="Feb" text="Feb"/>
+<l:template name="Mar" text="Mar"/>
+<l:template name="Apr" text="Apr"/>
+<l:template name="May" text="Mei"/>
+<l:template name="Jun" text="Jun"/>
+<l:template name="Jul" text="Jul"/>
+<l:template name="Aug" text="Aug"/>
+<l:template name="Sep" text="Sep"/>
+<l:template name="Oct" text="Okt"/>
+<l:template name="Nov" text="Nov"/>
+<l:template name="Dec" text="Des"/>
+<l:template name="Mon" text="Sen"/>
+<l:template name="Tue" text="Sel"/>
+<l:template name="Wed" text="Rab"/>
+<l:template name="Thu" text="Kam"/>
+<l:template name="Fri" text="Jum"/>
+<l:template name="Sat" text="Sab"/>
+<l:template name="Sun" text="Aha"/>
+</l:context>
+<l:context name="htmlhelp"><l:template name="langcode" text="0x0421 Bahasa Indonesia (INDONESIA)"/>
+</l:context>
+<l:context name="index"><l:template name="term-separator" text=", " lang="en"/>
+<l:template name="number-separator" text=", " lang="en"/>
+<l:template name="range-separator" text="-" lang="en"/>
+</l:context>
+<l:context name="iso690"><l:template name="lastfirst.sep" text=", " lang="en"/>
+<l:template name="alt.person.two.sep" text=" – " lang="en"/>
+<l:template name="alt.person.last.sep" text=" – " lang="en"/>
+<l:template name="alt.person.more.sep" text=" – " lang="en"/>
+<l:template name="primary.editor" text=" (ed.)" lang="en"/>
+<l:template name="primary.many" text=", et al." lang="en"/>
+<l:template name="primary.sep" text=". " lang="en"/>
+<l:template name="submaintitle.sep" text=": " lang="en"/>
+<l:template name="title.sep" text=". " lang="en"/>
+<l:template name="othertitle.sep" text=", " lang="en"/>
+<l:template name="medium1" text=" [" lang="en"/>
+<l:template name="medium2" text="]" lang="en"/>
+<l:template name="secondary.person.sep" text="; " lang="en"/>
+<l:template name="secondary.sep" text=". " lang="en"/>
+<l:template name="respons.sep" text=". " lang="en"/>
+<l:template name="edition.sep" text=". " lang="en"/>
+<l:template name="edition.serial.sep" text=", " lang="en"/>
+<l:template name="issuing.range" text="-" lang="en"/>
+<l:template name="issuing.div" text=", " lang="en"/>
+<l:template name="issuing.sep" text=". " lang="en"/>
+<l:template name="partnr.sep" text=". " lang="en"/>
+<l:template name="placepubl.sep" text=": " lang="en"/>
+<l:template name="publyear.sep" text=", " lang="en"/>
+<l:template name="pubinfo.sep" text=". " lang="en"/>
+<l:template name="spec.pubinfo.sep" text=", " lang="en"/>
+<l:template name="upd.sep" text=", " lang="en"/>
+<l:template name="datecit1" text=" [cited " lang="en"/>
+<l:template name="datecit2" text="]" lang="en"/>
+<l:template name="extent.sep" text=". " lang="en"/>
+<l:template name="locs.sep" text=", " lang="en"/>
+<l:template name="location.sep" text=". " lang="en"/>
+<l:template name="serie.sep" text=". " lang="en"/>
+<l:template name="notice.sep" text=". " lang="en"/>
+<l:template name="access" text="Available " lang="en"/>
+<l:template name="acctoo" text="Also available " lang="en"/>
+<l:template name="onwww" text="from World Wide Web" lang="en"/>
+<l:template name="oninet" text="from Internet" lang="en"/>
+<l:template name="access.end" text=": " lang="en"/>
+<l:template name="link1" text="&lt;" lang="en"/>
+<l:template name="link2" text="&gt;" lang="en"/>
+<l:template name="access.sep" text=". " lang="en"/>
+<l:template name="isbn" text="ISBN " lang="en"/>
+<l:template name="issn" text="ISSN " lang="en"/>
+<l:template name="stdnum.sep" text=". " lang="en"/>
+<l:template name="patcountry.sep" text=". " lang="en"/>
+<l:template name="pattype.sep" text=", " lang="en"/>
+<l:template name="patnum.sep" text=". " lang="en"/>
+<l:template name="patdate.sep" text=". " lang="en"/>
+</l:context><l:letters><l:l i="-1"/>
+<l:l i="0">Simbol</l:l>
+<l:l i="10">A</l:l>
+<l:l i="10">a</l:l>
+<l:l i="10">À</l:l>
+<l:l i="10">à</l:l>
+<l:l i="10">Ã</l:l>
+<l:l i="10">á</l:l>
+<l:l i="10">Â</l:l>
+<l:l i="10">â</l:l>
+<l:l i="10">Ã</l:l>
+<l:l i="10">ã</l:l>
+<l:l i="10">Ä</l:l>
+<l:l i="10">ä</l:l>
+<l:l i="10">Ã…</l:l>
+<l:l i="10">Ã¥</l:l>
+<l:l i="10">Ä€</l:l>
+<l:l i="10">Ä</l:l>
+<l:l i="10">Ä‚</l:l>
+<l:l i="10">ă</l:l>
+<l:l i="10">Ä„</l:l>
+<l:l i="10">Ä…</l:l>
+<l:l i="10">Ç</l:l>
+<l:l i="10">ÇŽ</l:l>
+<l:l i="10">Çž</l:l>
+<l:l i="10">ÇŸ</l:l>
+<l:l i="10">Ç </l:l>
+<l:l i="10">Ç¡</l:l>
+<l:l i="10">Ǻ</l:l>
+<l:l i="10">Ç»</l:l>
+<l:l i="10">È€</l:l>
+<l:l i="10">È</l:l>
+<l:l i="10">È‚</l:l>
+<l:l i="10">ȃ</l:l>
+<l:l i="10">Ȧ</l:l>
+<l:l i="10">ȧ</l:l>
+<l:l i="10">Ḁ</l:l>
+<l:l i="10">á¸</l:l>
+<l:l i="10">ẚ</l:l>
+<l:l i="10">Ạ</l:l>
+<l:l i="10">ạ</l:l>
+<l:l i="10">Ả</l:l>
+<l:l i="10">ả</l:l>
+<l:l i="10">Ấ</l:l>
+<l:l i="10">ấ</l:l>
+<l:l i="10">Ầ</l:l>
+<l:l i="10">ầ</l:l>
+<l:l i="10">Ẩ</l:l>
+<l:l i="10">ẩ</l:l>
+<l:l i="10">Ẫ</l:l>
+<l:l i="10">ẫ</l:l>
+<l:l i="10">Ậ</l:l>
+<l:l i="10">ậ</l:l>
+<l:l i="10">Ắ</l:l>
+<l:l i="10">ắ</l:l>
+<l:l i="10">Ằ</l:l>
+<l:l i="10">ằ</l:l>
+<l:l i="10">Ẳ</l:l>
+<l:l i="10">ẳ</l:l>
+<l:l i="10">Ẵ</l:l>
+<l:l i="10">ẵ</l:l>
+<l:l i="10">Ặ</l:l>
+<l:l i="10">ặ</l:l>
+<l:l i="20">B</l:l>
+<l:l i="20">b</l:l>
+<l:l i="20">Æ€</l:l>
+<l:l i="20">Æ</l:l>
+<l:l i="20">É“</l:l>
+<l:l i="20">Æ‚</l:l>
+<l:l i="20">ƃ</l:l>
+<l:l i="20">Ḃ</l:l>
+<l:l i="20">ḃ</l:l>
+<l:l i="20">Ḅ</l:l>
+<l:l i="20">ḅ</l:l>
+<l:l i="20">Ḇ</l:l>
+<l:l i="20">ḇ</l:l>
+<l:l i="30">C</l:l>
+<l:l i="30">c</l:l>
+<l:l i="30">Ç</l:l>
+<l:l i="30">ç</l:l>
+<l:l i="30">Ć</l:l>
+<l:l i="30">ć</l:l>
+<l:l i="30">Ĉ</l:l>
+<l:l i="30">ĉ</l:l>
+<l:l i="30">ÄŠ</l:l>
+<l:l i="30">Ä‹</l:l>
+<l:l i="30">Č</l:l>
+<l:l i="30">Ä</l:l>
+<l:l i="30">Ƈ</l:l>
+<l:l i="30">ƈ</l:l>
+<l:l i="30">É•</l:l>
+<l:l i="30">Ḉ</l:l>
+<l:l i="30">ḉ</l:l>
+<l:l i="40">D</l:l>
+<l:l i="40">d</l:l>
+<l:l i="40">ÄŽ</l:l>
+<l:l i="40">Ä</l:l>
+<l:l i="40">Ä</l:l>
+<l:l i="40">Ä‘</l:l>
+<l:l i="40">ÆŠ</l:l>
+<l:l i="40">É—</l:l>
+<l:l i="40">Æ‹</l:l>
+<l:l i="40">ƌ</l:l>
+<l:l i="40">Ç…</l:l>
+<l:l i="40">Dz</l:l>
+<l:l i="40">È¡</l:l>
+<l:l i="40">É–</l:l>
+<l:l i="40">Ḋ</l:l>
+<l:l i="40">ḋ</l:l>
+<l:l i="40">Ḍ</l:l>
+<l:l i="40">á¸</l:l>
+<l:l i="40">Ḏ</l:l>
+<l:l i="40">á¸</l:l>
+<l:l i="40">á¸</l:l>
+<l:l i="40">ḑ</l:l>
+<l:l i="40">Ḓ</l:l>
+<l:l i="40">ḓ</l:l>
+<l:l i="50">E</l:l>
+<l:l i="50">e</l:l>
+<l:l i="50">È</l:l>
+<l:l i="50">è</l:l>
+<l:l i="50">É</l:l>
+<l:l i="50">é</l:l>
+<l:l i="50">Ê</l:l>
+<l:l i="50">ê</l:l>
+<l:l i="50">Ë</l:l>
+<l:l i="50">ë</l:l>
+<l:l i="50">Ä’</l:l>
+<l:l i="50">Ä“</l:l>
+<l:l i="50">Ä”</l:l>
+<l:l i="50">Ä•</l:l>
+<l:l i="50">Ä–</l:l>
+<l:l i="50">Ä—</l:l>
+<l:l i="50">Ę</l:l>
+<l:l i="50">Ä™</l:l>
+<l:l i="50">Äš</l:l>
+<l:l i="50">Ä›</l:l>
+<l:l i="50">È„</l:l>
+<l:l i="50">È…</l:l>
+<l:l i="50">Ȇ</l:l>
+<l:l i="50">ȇ</l:l>
+<l:l i="50">Ȩ</l:l>
+<l:l i="50">È©</l:l>
+<l:l i="50">Ḕ</l:l>
+<l:l i="50">ḕ</l:l>
+<l:l i="50">Ḗ</l:l>
+<l:l i="50">ḗ</l:l>
+<l:l i="50">Ḙ</l:l>
+<l:l i="50">ḙ</l:l>
+<l:l i="50">Ḛ</l:l>
+<l:l i="50">ḛ</l:l>
+<l:l i="50">Ḝ</l:l>
+<l:l i="50">á¸</l:l>
+<l:l i="50">Ẹ</l:l>
+<l:l i="50">ẹ</l:l>
+<l:l i="50">Ẻ</l:l>
+<l:l i="50">ẻ</l:l>
+<l:l i="50">Ẽ</l:l>
+<l:l i="50">ẽ</l:l>
+<l:l i="50">Ế</l:l>
+<l:l i="50">ế</l:l>
+<l:l i="50">Ề</l:l>
+<l:l i="50">á»</l:l>
+<l:l i="50">Ể</l:l>
+<l:l i="50">ể</l:l>
+<l:l i="50">Ễ</l:l>
+<l:l i="50">á»…</l:l>
+<l:l i="50">Ệ</l:l>
+<l:l i="50">ệ</l:l>
+<l:l i="60">F</l:l>
+<l:l i="60">f</l:l>
+<l:l i="60">Æ‘</l:l>
+<l:l i="60">Æ’</l:l>
+<l:l i="60">Ḟ</l:l>
+<l:l i="60">ḟ</l:l>
+<l:l i="70">G</l:l>
+<l:l i="70">g</l:l>
+<l:l i="70">Ĝ</l:l>
+<l:l i="70">Ä</l:l>
+<l:l i="70">Äž</l:l>
+<l:l i="70">ÄŸ</l:l>
+<l:l i="70">Ä </l:l>
+<l:l i="70">Ä¡</l:l>
+<l:l i="70">Ä¢</l:l>
+<l:l i="70">Ä£</l:l>
+<l:l i="70">Æ“</l:l>
+<l:l i="70">É </l:l>
+<l:l i="70">Ǥ</l:l>
+<l:l i="70">Ç¥</l:l>
+<l:l i="70">Ǧ</l:l>
+<l:l i="70">ǧ</l:l>
+<l:l i="70">Ç´</l:l>
+<l:l i="70">ǵ</l:l>
+<l:l i="70">Ḡ</l:l>
+<l:l i="70">ḡ</l:l>
+<l:l i="80">H</l:l>
+<l:l i="80">h</l:l>
+<l:l i="80">Ĥ</l:l>
+<l:l i="80">Ä¥</l:l>
+<l:l i="80">Ħ</l:l>
+<l:l i="80">ħ</l:l>
+<l:l i="80">Èž</l:l>
+<l:l i="80">ÈŸ</l:l>
+<l:l i="80">ɦ</l:l>
+<l:l i="80">Ḣ</l:l>
+<l:l i="80">ḣ</l:l>
+<l:l i="80">Ḥ</l:l>
+<l:l i="80">ḥ</l:l>
+<l:l i="80">Ḧ</l:l>
+<l:l i="80">ḧ</l:l>
+<l:l i="80">Ḩ</l:l>
+<l:l i="80">ḩ</l:l>
+<l:l i="80">Ḫ</l:l>
+<l:l i="80">ḫ</l:l>
+<l:l i="80">ẖ</l:l>
+<l:l i="90">I</l:l>
+<l:l i="90">i</l:l>
+<l:l i="90">Ì</l:l>
+<l:l i="90">ì</l:l>
+<l:l i="90">Ã</l:l>
+<l:l i="90">í</l:l>
+<l:l i="90">ÃŽ</l:l>
+<l:l i="90">î</l:l>
+<l:l i="90">Ã</l:l>
+<l:l i="90">ï</l:l>
+<l:l i="90">Ĩ</l:l>
+<l:l i="90">Ä©</l:l>
+<l:l i="90">Ī</l:l>
+<l:l i="90">Ä«</l:l>
+<l:l i="90">Ĭ</l:l>
+<l:l i="90">Ä­</l:l>
+<l:l i="90">Ä®</l:l>
+<l:l i="90">į</l:l>
+<l:l i="90">Ä°</l:l>
+<l:l i="90">Æ—</l:l>
+<l:l i="90">ɨ</l:l>
+<l:l i="90">Ç</l:l>
+<l:l i="90">Ç</l:l>
+<l:l i="90">Ȉ</l:l>
+<l:l i="90">ȉ</l:l>
+<l:l i="90">ÈŠ</l:l>
+<l:l i="90">È‹</l:l>
+<l:l i="90">Ḭ</l:l>
+<l:l i="90">ḭ</l:l>
+<l:l i="90">Ḯ</l:l>
+<l:l i="90">ḯ</l:l>
+<l:l i="90">Ỉ</l:l>
+<l:l i="90">ỉ</l:l>
+<l:l i="90">Ị</l:l>
+<l:l i="90">ị</l:l>
+<l:l i="100">J</l:l>
+<l:l i="100">j</l:l>
+<l:l i="100">Ä´</l:l>
+<l:l i="100">ĵ</l:l>
+<l:l i="100">Ç°</l:l>
+<l:l i="100">Ê</l:l>
+<l:l i="110">K</l:l>
+<l:l i="110">k</l:l>
+<l:l i="110">Ķ</l:l>
+<l:l i="110">Ä·</l:l>
+<l:l i="110">Ƙ</l:l>
+<l:l i="110">Æ™</l:l>
+<l:l i="110">Ǩ</l:l>
+<l:l i="110">Ç©</l:l>
+<l:l i="110">Ḱ</l:l>
+<l:l i="110">ḱ</l:l>
+<l:l i="110">Ḳ</l:l>
+<l:l i="110">ḳ</l:l>
+<l:l i="110">Ḵ</l:l>
+<l:l i="110">ḵ</l:l>
+<l:l i="120">L</l:l>
+<l:l i="120">l</l:l>
+<l:l i="120">Ĺ</l:l>
+<l:l i="120">ĺ</l:l>
+<l:l i="120">Ä»</l:l>
+<l:l i="120">ļ</l:l>
+<l:l i="120">Ľ</l:l>
+<l:l i="120">ľ</l:l>
+<l:l i="120">Ä¿</l:l>
+<l:l i="120">Å€</l:l>
+<l:l i="120">Å</l:l>
+<l:l i="120">Å‚</l:l>
+<l:l i="120">Æš</l:l>
+<l:l i="120">Lj</l:l>
+<l:l i="120">È´</l:l>
+<l:l i="120">É«</l:l>
+<l:l i="120">ɬ</l:l>
+<l:l i="120">É­</l:l>
+<l:l i="120">Ḷ</l:l>
+<l:l i="120">ḷ</l:l>
+<l:l i="120">Ḹ</l:l>
+<l:l i="120">ḹ</l:l>
+<l:l i="120">Ḻ</l:l>
+<l:l i="120">ḻ</l:l>
+<l:l i="120">Ḽ</l:l>
+<l:l i="120">ḽ</l:l>
+<l:l i="130">M</l:l>
+<l:l i="130">m</l:l>
+<l:l i="130">ɱ</l:l>
+<l:l i="130">Ḿ</l:l>
+<l:l i="130">ḿ</l:l>
+<l:l i="130">á¹€</l:l>
+<l:l i="130">á¹</l:l>
+<l:l i="130">Ṃ</l:l>
+<l:l i="130">ṃ</l:l>
+<l:l i="140">N</l:l>
+<l:l i="140">n</l:l>
+<l:l i="140">Ñ</l:l>
+<l:l i="140">ñ</l:l>
+<l:l i="140">Ń</l:l>
+<l:l i="140">Å„</l:l>
+<l:l i="140">Å…</l:l>
+<l:l i="140">ņ</l:l>
+<l:l i="140">Ň</l:l>
+<l:l i="140">ň</l:l>
+<l:l i="140">Æ</l:l>
+<l:l i="140">ɲ</l:l>
+<l:l i="140">Æž</l:l>
+<l:l i="140">È </l:l>
+<l:l i="140">Ç‹</l:l>
+<l:l i="140">Ǹ</l:l>
+<l:l i="140">ǹ</l:l>
+<l:l i="140">ȵ</l:l>
+<l:l i="140">ɳ</l:l>
+<l:l i="140">Ṅ</l:l>
+<l:l i="140">á¹…</l:l>
+<l:l i="140">Ṇ</l:l>
+<l:l i="140">ṇ</l:l>
+<l:l i="140">Ṉ</l:l>
+<l:l i="140">ṉ</l:l>
+<l:l i="140">Ṋ</l:l>
+<l:l i="140">ṋ</l:l>
+<l:l i="150">O</l:l>
+<l:l i="150">o</l:l>
+<l:l i="150">Ã’</l:l>
+<l:l i="150">ò</l:l>
+<l:l i="150">Ó</l:l>
+<l:l i="150">ó</l:l>
+<l:l i="150">Ô</l:l>
+<l:l i="150">ô</l:l>
+<l:l i="150">Õ</l:l>
+<l:l i="150">õ</l:l>
+<l:l i="150">Ö</l:l>
+<l:l i="150">ö</l:l>
+<l:l i="150">Ø</l:l>
+<l:l i="150">ø</l:l>
+<l:l i="150">Ō</l:l>
+<l:l i="150">Å</l:l>
+<l:l i="150">ÅŽ</l:l>
+<l:l i="150">Å</l:l>
+<l:l i="150">Å</l:l>
+<l:l i="150">Å‘</l:l>
+<l:l i="150">ÆŸ</l:l>
+<l:l i="150">Æ </l:l>
+<l:l i="150">Æ¡</l:l>
+<l:l i="150">Ç‘</l:l>
+<l:l i="150">Ç’</l:l>
+<l:l i="150">Ǫ</l:l>
+<l:l i="150">Ç«</l:l>
+<l:l i="150">Ǭ</l:l>
+<l:l i="150">Ç­</l:l>
+<l:l i="150">Ǿ</l:l>
+<l:l i="150">Ç¿</l:l>
+<l:l i="150">Ȍ</l:l>
+<l:l i="150">È</l:l>
+<l:l i="150">ÈŽ</l:l>
+<l:l i="150">È</l:l>
+<l:l i="150">Ȫ</l:l>
+<l:l i="150">È«</l:l>
+<l:l i="150">Ȭ</l:l>
+<l:l i="150">È­</l:l>
+<l:l i="150">È®</l:l>
+<l:l i="150">ȯ</l:l>
+<l:l i="150">È°</l:l>
+<l:l i="150">ȱ</l:l>
+<l:l i="150">Ṍ</l:l>
+<l:l i="150">á¹</l:l>
+<l:l i="150">Ṏ</l:l>
+<l:l i="150">á¹</l:l>
+<l:l i="150">á¹</l:l>
+<l:l i="150">ṑ</l:l>
+<l:l i="150">á¹’</l:l>
+<l:l i="150">ṓ</l:l>
+<l:l i="150">Ọ</l:l>
+<l:l i="150">á»</l:l>
+<l:l i="150">Ỏ</l:l>
+<l:l i="150">á»</l:l>
+<l:l i="150">á»</l:l>
+<l:l i="150">ố</l:l>
+<l:l i="150">á»’</l:l>
+<l:l i="150">ồ</l:l>
+<l:l i="150">á»”</l:l>
+<l:l i="150">ổ</l:l>
+<l:l i="150">á»–</l:l>
+<l:l i="150">á»—</l:l>
+<l:l i="150">Ộ</l:l>
+<l:l i="150">á»™</l:l>
+<l:l i="150">Ớ</l:l>
+<l:l i="150">á»›</l:l>
+<l:l i="150">Ờ</l:l>
+<l:l i="150">á»</l:l>
+<l:l i="150">Ở</l:l>
+<l:l i="150">ở</l:l>
+<l:l i="150">á» </l:l>
+<l:l i="150">ỡ</l:l>
+<l:l i="150">Ợ</l:l>
+<l:l i="150">ợ</l:l>
+<l:l i="160">P</l:l>
+<l:l i="160">p</l:l>
+<l:l i="160">Ƥ</l:l>
+<l:l i="160">Æ¥</l:l>
+<l:l i="160">á¹”</l:l>
+<l:l i="160">ṕ</l:l>
+<l:l i="160">á¹–</l:l>
+<l:l i="160">á¹—</l:l>
+<l:l i="170">Q</l:l>
+<l:l i="170">q</l:l>
+<l:l i="170">Ê </l:l>
+<l:l i="180">R</l:l>
+<l:l i="180">r</l:l>
+<l:l i="180">Å”</l:l>
+<l:l i="180">Å•</l:l>
+<l:l i="180">Å–</l:l>
+<l:l i="180">Å—</l:l>
+<l:l i="180">Ř</l:l>
+<l:l i="180">Å™</l:l>
+<l:l i="180">È</l:l>
+<l:l i="180">È‘</l:l>
+<l:l i="180">È’</l:l>
+<l:l i="180">È“</l:l>
+<l:l i="180">ɼ</l:l>
+<l:l i="180">ɽ</l:l>
+<l:l i="180">ɾ</l:l>
+<l:l i="180">Ṙ</l:l>
+<l:l i="180">á¹™</l:l>
+<l:l i="180">Ṛ</l:l>
+<l:l i="180">á¹›</l:l>
+<l:l i="180">Ṝ</l:l>
+<l:l i="180">á¹</l:l>
+<l:l i="180">Ṟ</l:l>
+<l:l i="180">ṟ</l:l>
+<l:l i="190">S</l:l>
+<l:l i="190">s</l:l>
+<l:l i="190">Åš</l:l>
+<l:l i="190">Å›</l:l>
+<l:l i="190">Ŝ</l:l>
+<l:l i="190">Å</l:l>
+<l:l i="190">Åž</l:l>
+<l:l i="190">ÅŸ</l:l>
+<l:l i="190">Å </l:l>
+<l:l i="190">Å¡</l:l>
+<l:l i="190">Ș</l:l>
+<l:l i="190">È™</l:l>
+<l:l i="190">Ê‚</l:l>
+<l:l i="190">á¹ </l:l>
+<l:l i="190">ṡ</l:l>
+<l:l i="190">á¹¢</l:l>
+<l:l i="190">á¹£</l:l>
+<l:l i="190">Ṥ</l:l>
+<l:l i="190">á¹¥</l:l>
+<l:l i="190">Ṧ</l:l>
+<l:l i="190">ṧ</l:l>
+<l:l i="190">Ṩ</l:l>
+<l:l i="190">ṩ</l:l>
+<l:l i="200">T</l:l>
+<l:l i="200">t</l:l>
+<l:l i="200">Å¢</l:l>
+<l:l i="200">Å£</l:l>
+<l:l i="200">Ť</l:l>
+<l:l i="200">Å¥</l:l>
+<l:l i="200">Ŧ</l:l>
+<l:l i="200">ŧ</l:l>
+<l:l i="200">Æ«</l:l>
+<l:l i="200">Ƭ</l:l>
+<l:l i="200">Æ­</l:l>
+<l:l i="200">Æ®</l:l>
+<l:l i="200">ʈ</l:l>
+<l:l i="200">Èš</l:l>
+<l:l i="200">È›</l:l>
+<l:l i="200">ȶ</l:l>
+<l:l i="200">Ṫ</l:l>
+<l:l i="200">ṫ</l:l>
+<l:l i="200">Ṭ</l:l>
+<l:l i="200">á¹­</l:l>
+<l:l i="200">á¹®</l:l>
+<l:l i="200">ṯ</l:l>
+<l:l i="200">á¹°</l:l>
+<l:l i="200">á¹±</l:l>
+<l:l i="200">ẗ</l:l>
+<l:l i="210">U</l:l>
+<l:l i="210">u</l:l>
+<l:l i="210">Ù</l:l>
+<l:l i="210">ù</l:l>
+<l:l i="210">Ú</l:l>
+<l:l i="210">ú</l:l>
+<l:l i="210">Û</l:l>
+<l:l i="210">û</l:l>
+<l:l i="210">Ü</l:l>
+<l:l i="210">ü</l:l>
+<l:l i="210">Ũ</l:l>
+<l:l i="210">Å©</l:l>
+<l:l i="210">Ū</l:l>
+<l:l i="210">Å«</l:l>
+<l:l i="210">Ŭ</l:l>
+<l:l i="210">Å­</l:l>
+<l:l i="210">Å®</l:l>
+<l:l i="210">ů</l:l>
+<l:l i="210">Å°</l:l>
+<l:l i="210">ű</l:l>
+<l:l i="210">Ų</l:l>
+<l:l i="210">ų</l:l>
+<l:l i="210">Ư</l:l>
+<l:l i="210">Æ°</l:l>
+<l:l i="210">Ç“</l:l>
+<l:l i="210">Ç”</l:l>
+<l:l i="210">Ç•</l:l>
+<l:l i="210">Ç–</l:l>
+<l:l i="210">Ç—</l:l>
+<l:l i="210">ǘ</l:l>
+<l:l i="210">Ç™</l:l>
+<l:l i="210">Çš</l:l>
+<l:l i="210">Ç›</l:l>
+<l:l i="210">ǜ</l:l>
+<l:l i="210">È”</l:l>
+<l:l i="210">È•</l:l>
+<l:l i="210">È–</l:l>
+<l:l i="210">È—</l:l>
+<l:l i="210">á¹²</l:l>
+<l:l i="210">á¹³</l:l>
+<l:l i="210">á¹´</l:l>
+<l:l i="210">á¹µ</l:l>
+<l:l i="210">Ṷ</l:l>
+<l:l i="210">á¹·</l:l>
+<l:l i="210">Ṹ</l:l>
+<l:l i="210">á¹¹</l:l>
+<l:l i="210">Ṻ</l:l>
+<l:l i="210">á¹»</l:l>
+<l:l i="210">Ụ</l:l>
+<l:l i="210">ụ</l:l>
+<l:l i="210">Ủ</l:l>
+<l:l i="210">ủ</l:l>
+<l:l i="210">Ứ</l:l>
+<l:l i="210">ứ</l:l>
+<l:l i="210">Ừ</l:l>
+<l:l i="210">ừ</l:l>
+<l:l i="210">Ử</l:l>
+<l:l i="210">á»­</l:l>
+<l:l i="210">á»®</l:l>
+<l:l i="210">ữ</l:l>
+<l:l i="210">á»°</l:l>
+<l:l i="210">á»±</l:l>
+<l:l i="220">V</l:l>
+<l:l i="220">v</l:l>
+<l:l i="220">Ʋ</l:l>
+<l:l i="220">Ê‹</l:l>
+<l:l i="220">á¹¼</l:l>
+<l:l i="220">á¹½</l:l>
+<l:l i="220">á¹¾</l:l>
+<l:l i="220">ṿ</l:l>
+<l:l i="230">W</l:l>
+<l:l i="230">w</l:l>
+<l:l i="230">Å´</l:l>
+<l:l i="230">ŵ</l:l>
+<l:l i="230">Ẁ</l:l>
+<l:l i="230">áº</l:l>
+<l:l i="230">Ẃ</l:l>
+<l:l i="230">ẃ</l:l>
+<l:l i="230">Ẅ</l:l>
+<l:l i="230">ẅ</l:l>
+<l:l i="230">Ẇ</l:l>
+<l:l i="230">ẇ</l:l>
+<l:l i="230">Ẉ</l:l>
+<l:l i="230">ẉ</l:l>
+<l:l i="230">ẘ</l:l>
+<l:l i="240">X</l:l>
+<l:l i="240">x</l:l>
+<l:l i="240">Ẋ</l:l>
+<l:l i="240">ẋ</l:l>
+<l:l i="240">Ẍ</l:l>
+<l:l i="240">áº</l:l>
+<l:l i="250">Y</l:l>
+<l:l i="250">y</l:l>
+<l:l i="250">Ã</l:l>
+<l:l i="250">ý</l:l>
+<l:l i="250">ÿ</l:l>
+<l:l i="250">Ÿ</l:l>
+<l:l i="250">Ŷ</l:l>
+<l:l i="250">Å·</l:l>
+<l:l i="250">Ƴ</l:l>
+<l:l i="250">Æ´</l:l>
+<l:l i="250">Ȳ</l:l>
+<l:l i="250">ȳ</l:l>
+<l:l i="250">Ẏ</l:l>
+<l:l i="250">áº</l:l>
+<l:l i="250">ẙ</l:l>
+<l:l i="250">Ỳ</l:l>
+<l:l i="250">ỳ</l:l>
+<l:l i="250">á»´</l:l>
+<l:l i="250">ỵ</l:l>
+<l:l i="250">Ỷ</l:l>
+<l:l i="250">á»·</l:l>
+<l:l i="250">Ỹ</l:l>
+<l:l i="250">ỹ</l:l>
+<l:l i="260">Z</l:l>
+<l:l i="260">z</l:l>
+<l:l i="260">Ź</l:l>
+<l:l i="260">ź</l:l>
+<l:l i="260">Å»</l:l>
+<l:l i="260">ż</l:l>
+<l:l i="260">Ž</l:l>
+<l:l i="260">ž</l:l>
+<l:l i="260">Ƶ</l:l>
+<l:l i="260">ƶ</l:l>
+<l:l i="260">Ȥ</l:l>
+<l:l i="260">È¥</l:l>
+<l:l i="260">Ê</l:l>
+<l:l i="260">Ê‘</l:l>
+<l:l i="260">áº</l:l>
+<l:l i="260">ẑ</l:l>
+<l:l i="260">Ẓ</l:l>
+<l:l i="260">ẓ</l:l>
+<l:l i="260">Ẕ</l:l>
+<l:l i="260">ẕ</l:l>
+</l:letters>
+</l:l10n>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/insertfile.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/insertfile.xsl
new file mode 100644
index 0000000..66bcf41
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/insertfile.xsl
@@ -0,0 +1,111 @@
+<?xml version='1.0'?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ version='1.0'>
+
+<!-- ********************************************************************
+ $Id: insertfile.xsl 5262 2005-10-12 14:58:42Z xmldoc $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<xsl:param name="textdata.default.encoding"></xsl:param>
+
+<!-- * This stylesheet makes a copy of a source tree, replacing all -->
+<!-- * instances of the following with corresponding Xinclude instances -->
+<!-- * in the result tree. -->
+<!-- * -->
+<!-- * <textobject><textdata fileref="foo.txt"> -->
+<!-- * <imagedata format="linespecific" fileref="foo.txt"> -->
+<!-- * <inlinegraphic format="linespecific" fileref="foo.txt"> -->
+<!-- * -->
+<!-- * Those become: -->
+<!-- * -->
+<!-- * <xi:include href="foo.txt" parse="text"/> -->
+<!-- * -->
+<!-- * It also works as expected with entityref in place of fileref, -->
+<!-- * and copies over the value of the <textdata>“encoding†atrribute (if -->
+<!-- * found). It is basically intended as an alternative to using the -->
+<!-- * DocBook XSLT Java insertfile() extension. -->
+
+<!-- ==================================================================== -->
+
+<xsl:template name="get.external.filename">
+ <xsl:choose>
+ <xsl:when test="@entityref">
+ <xsl:value-of select="unparsed-entity-uri(@entityref)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="@fileref"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="textobject[child::textdata[@entityref|@fileref]]">
+ <xsl:apply-templates select="textdata"/>
+</xsl:template>
+
+<xsl:template match="textdata[@entityref|@fileref]">
+ <xsl:variable name="filename">
+ <xsl:call-template name="get.external.filename"/>
+ </xsl:variable>
+ <xsl:variable name="encoding">
+ <xsl:choose>
+ <xsl:when test="@encoding">
+ <xsl:value-of select="@encoding"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$textdata.default.encoding"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xi:include href="{$filename}" parse="text" encoding="{$encoding}"/>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template
+ match="inlinemediaobject
+ [child::imageobject
+ [child::imagedata
+ [@format = 'linespecific' and
+ (@entityref|@fileref)]]]">
+ <xsl:apply-templates select="imageobject/imagedata"/>
+</xsl:template>
+
+<xsl:template match="imagedata
+ [@format = 'linespecific' and
+ (@entityref|@fileref)]">
+ <xsl:variable name="filename">
+ <xsl:call-template name="get.external.filename"/>
+ </xsl:variable>
+ <xi:include href="{$filename}" parse="text" encoding="{$textdata.default.encoding}"/>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="inlinegraphic
+ [@format = 'linespecific' and
+ (@entityref|@fileref)]">
+ <xsl:variable name="filename">
+ <xsl:call-template name="get.external.filename"/>
+ </xsl:variable>
+ <xi:include href="{$filename}" parse="text" encoding="{$textdata.default.encoding}"/>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<!-- * copy everything else into result tree as-is -->
+<xsl:template match="node() | @*">
+ <xsl:copy>
+ <xsl:apply-templates select="@* | node()"/>
+ </xsl:copy>
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/is.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/is.xml
new file mode 100644
index 0000000..6a5b07f
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/is.xml
@@ -0,0 +1,672 @@
+<?xml version="1.0" encoding="utf-8"?>
+<l:l10n xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0" language="is" english-language-name="Icelandic">
+
+<!-- * This file is generated automatically. -->
+<!-- * To submit changes to this file upstream (to the DocBook Project) -->
+<!-- * do not submit an edited version of this file. Instead, submit an -->
+<!-- * edited version of the source file at the following location: -->
+<!-- * -->
+<!-- * https://docbook.svn.sourceforge.net/svnroot/docbook/trunk/gentext/locale/is.xml -->
+<!-- * -->
+<!-- * E-mail the edited is.xml source file to: -->
+<!-- * -->
+<!-- * docbook-developers@lists.sourceforge.net -->
+
+<!-- ******************************************************************** -->
+
+<!-- This file is part of the XSL DocBook Stylesheet distribution. -->
+<!-- See ../README or http://docbook.sf.net/release/xsl/current/ for -->
+<!-- copyright and other information. -->
+
+<!-- ******************************************************************** -->
+<!-- In these files, % with a letter is used for a placeholder: -->
+<!-- %t is the current element's title -->
+<!-- %s is the current element's subtitle (if applicable)-->
+<!-- %n is the current element's number label-->
+<!-- %p is the current element's page number (if applicable)-->
+<!-- ******************************************************************** -->
+
+
+<l:gentext key="Abstract" text="Ãgrip"/>
+<l:gentext key="abstract" text="ágrip"/>
+<l:gentext key="Acknowledgements" text="Þakkarorð"/>
+<l:gentext key="acknowledgements" text="þakkarorð"/>
+<l:gentext key="Answer" text="Svar"/>
+<l:gentext key="answer" text="svar"/>
+<l:gentext key="Appendix" text="Viðauki"/>
+<l:gentext key="appendix" text="viðauki"/>
+<l:gentext key="Article" text="Grein"/>
+<l:gentext key="article" text="grein"/>
+<l:gentext key="Author" text="Höfundur"/>
+<l:gentext key="Bibliography" text="Heimildaskrá"/>
+<l:gentext key="bibliography" text="heimildaskrá"/>
+<l:gentext key="Book" text="Bók"/>
+<l:gentext key="book" text="bók"/>
+<l:gentext key="CAUTION" text="ATH"/>
+<l:gentext key="Caution" text="Athugið"/>
+<l:gentext key="caution" text="athugið"/>
+<l:gentext key="Chapter" text="Kafli"/>
+<l:gentext key="chapter" text="kafli"/>
+<l:gentext key="Colophon" text="Útgáfuupplýsingar"/>
+<l:gentext key="colophon" text="Útgáfuupplýsingar"/>
+<l:gentext key="Copyright" text="Höfundaréttur"/>
+<l:gentext key="copyright" text="höfundaréttur"/>
+<l:gentext key="Dedication" text="Tileinkun"/>
+<l:gentext key="dedication" text="tileinkun"/>
+<l:gentext key="Edition" text="Útgáfa"/>
+<l:gentext key="edition" text="útgáfa"/>
+<l:gentext key="Editor" text="Ritstjórn"/>
+<l:gentext key="Equation" text="Formúla"/>
+<l:gentext key="equation" text="formúla"/>
+<l:gentext key="Example" text="Dæmi"/>
+<l:gentext key="example" text="dæmi"/>
+<l:gentext key="Figure" text="Skýringamynd"/>
+<l:gentext key="figure" text="skýringamynd"/>
+<l:gentext key="Glossary" text="Orðalisti"/>
+<l:gentext key="glossary" text="orðalisti"/>
+<l:gentext key="GlossSee" text="Sjá"/>
+<l:gentext key="glosssee" text="sjá"/>
+<l:gentext key="GlossSeeAlso" text="Sjá einnig"/>
+<l:gentext key="glossseealso" text="sjá einnig"/>
+<l:gentext key="IMPORTANT" text="MIKILVÆGT"/>
+<l:gentext key="important" text="mikilvægt"/>
+<l:gentext key="Important" text="Mikilvægt"/>
+<l:gentext key="Index" text="Atriðaskrá"/>
+<l:gentext key="index" text="atriðaskrá"/>
+<l:gentext key="ISBN" text="ISBN"/>
+<l:gentext key="isbn" text="isbn"/>
+<l:gentext key="LegalNotice" text="Lagalegur fyrirvari"/>
+<l:gentext key="legalnotice" text="lagalegur fyrirvari"/>
+<l:gentext key="MsgAud" text="Markhópur"/>
+<l:gentext key="msgaud" text="markhópur"/>
+<l:gentext key="MsgLevel" text="Stig"/>
+<l:gentext key="msglevel" text="stig"/>
+<l:gentext key="MsgOrig" text="Uppruni"/>
+<l:gentext key="msgorig" text="uppruni"/>
+<l:gentext key="NOTE" text="ATHUGASEMD"/>
+<l:gentext key="Note" text="Athugasemd"/>
+<l:gentext key="note" text="athugasemd"/>
+<l:gentext key="Part" text="Hluti"/>
+<l:gentext key="part" text="hluti"/>
+<l:gentext key="Preface" text="Formáli"/>
+<l:gentext key="preface" text="formáli"/>
+<l:gentext key="Procedure" text="Vinnuferli"/>
+<l:gentext key="procedure" text="vinnuferli"/>
+<l:gentext key="ProductionSet" text="Framleiðsla"/>
+<l:gentext key="PubDate" text="Birtingardagur"/>
+<l:gentext key="pubdate" text="birtingardagur"/>
+<l:gentext key="Published" text="Útgefið"/>
+<l:gentext key="published" text="útgefið"/>
+<l:gentext key="Publisher" text="Útgefandi"/>
+<l:gentext key="Qandadiv" text="Spurning og svör"/>
+<l:gentext key="qandadiv" text="spurning og svör"/>
+<l:gentext key="QandASet" text="Algengar Spurningar"/>
+<l:gentext key="Question" text="Spurning"/>
+<l:gentext key="question" text="spurning"/>
+<l:gentext key="RefEntry" text="Færsla"/>
+<l:gentext key="refentry" text="færsla"/>
+<l:gentext key="Reference" text="Heimild"/>
+<l:gentext key="reference" text="heimild"/>
+<l:gentext key="References" text="Heimildir"/>
+<l:gentext key="RefName" text="Heiti"/>
+<l:gentext key="refname" text="heiti"/>
+<l:gentext key="RefSection" text="Grein"/>
+<l:gentext key="refsection" text="grein"/>
+<l:gentext key="RefSynopsisDiv" text="Samantekt"/>
+<l:gentext key="refsynopsisdiv" text="samantekt"/>
+<l:gentext key="RevHistory" text="Yfirferðarferill"/>
+<l:gentext key="revhistory" text="yfirferðarferill"/>
+<l:gentext key="revision" text="yfirfarið"/>
+<l:gentext key="Revision" text="Yfirfarið"/>
+<l:gentext key="sect1" text="grein"/>
+<l:gentext key="sect2" text="grein"/>
+<l:gentext key="sect3" text="grein"/>
+<l:gentext key="sect4" text="grein"/>
+<l:gentext key="sect5" text="grein"/>
+<l:gentext key="section" text="grein"/>
+<l:gentext key="Section" text="Grein"/>
+<l:gentext key="see" text="sjá"/>
+<l:gentext key="See" text="Sjá"/>
+<l:gentext key="seealso" text="sjá einnig"/>
+<l:gentext key="Seealso" text="Sjá einnig"/>
+<l:gentext key="SeeAlso" text="Sjá einnig"/>
+<l:gentext key="set" text="setja"/>
+<l:gentext key="Set" text="Setja"/>
+<l:gentext key="setindex" text="stilla yfirlit"/>
+<l:gentext key="SetIndex" text="Stilla yfirlit"/>
+<l:gentext key="Sidebar" text="Hliðarslá"/>
+<l:gentext key="sidebar" text="hliðarslá"/>
+<l:gentext key="step" text="skref"/>
+<l:gentext key="Step" text="Skref"/>
+<l:gentext key="table" text="tafla"/>
+<l:gentext key="Table" text="Tafla"/>
+<l:gentext key="task" text="Verk"/>
+<l:gentext key="Task" text="verk"/>
+<l:gentext key="tip" text="ábending"/>
+<l:gentext key="TIP" text="ÃBENDING"/>
+<l:gentext key="Tip" text="Ãbending"/>
+<l:gentext key="Warning" text="Aðvörun"/>
+<l:gentext key="warning" text="aðvörun"/>
+<l:gentext key="WARNING" text="AÄVÖRUN"/>
+<l:gentext key="and" text="og"/>
+<l:gentext key="by" text="af"/>
+<l:gentext key="Edited" text="Ritstýrt"/>
+<l:gentext key="edited" text="ritstýrt"/>
+<l:gentext key="Editedby" text="Ritstýrt af"/>
+<l:gentext key="editedby" text="ritstýrt af"/>
+<l:gentext key="in" text="í"/>
+<l:gentext key="lastlistcomma" text=","/>
+<l:gentext key="listcomma" text=","/>
+<l:gentext key="notes" text="athugasemdir"/>
+<l:gentext key="Notes" text="Athugasemdir"/>
+<l:gentext key="Pgs" text="Bls."/>
+<l:gentext key="pgs" text="bls."/>
+<l:gentext key="Revisedby" text="Yfirfarið af: "/>
+<l:gentext key="revisedby" text="yfirfarið af: "/>
+<l:gentext key="TableNotes" text="athugasemdir"/>
+<l:gentext key="tablenotes" text="Athugasemdir"/>
+<l:gentext key="TableofContents" text="Efnisyfirlit"/>
+<l:gentext key="tableofcontents" text="efnisyfirlit"/>
+<l:gentext key="unexpectedelementname" text="óvænt heiti á einingu"/>
+<l:gentext key="unsupported" text="óstutt"/>
+<l:gentext key="xrefto" text="xref í"/>
+<l:gentext key="Authors" text="Höfundar"/>
+<l:gentext key="copyeditor" text=""/>
+<l:gentext key="graphicdesigner" text=""/>
+<l:gentext key="productioneditor" text=""/>
+<l:gentext key="technicaleditor" text=""/>
+<l:gentext key="translator" text="þýðandi"/>
+<l:gentext key="listofequations" text="yfirlit yfir formúlur"/>
+<l:gentext key="ListofEquations" text="Yfirlit yfir formúlur"/>
+<l:gentext key="ListofExamples" text="Yfirlit yfir dæmi"/>
+<l:gentext key="listofexamples" text="yfirlit yfir dæmi"/>
+<l:gentext key="ListofFigures" text="Yfirlit yfir myndir"/>
+<l:gentext key="listoffigures" text="yfirlit yfir myndir"/>
+<l:gentext key="ListofProcedures" text="Yfirlit yfir verklag"/>
+<l:gentext key="listofprocedures" text="yfirlit yfir verklag"/>
+<l:gentext key="listoftables" text="yfirlit yfir töflur"/>
+<l:gentext key="ListofTables" text="Yfirlit yfir töflur"/>
+<l:gentext key="ListofUnknown" text="Yfirlit yfir óskilgreint"/>
+<l:gentext key="listofunknown" text="yfirlit yfir óskilgreint"/>
+<l:gentext key="nav-home" text="Heim"/>
+<l:gentext key="nav-next" text="Næsta"/>
+<l:gentext key="nav-next-sibling" text=""/>
+<l:gentext key="nav-prev" text="Fyrra"/>
+<l:gentext key="nav-prev-sibling" text=""/>
+<l:gentext key="nav-up" text="Upp"/>
+<l:gentext key="nav-toc" text="Efnisyfirlit"/>
+<l:gentext key="Draft" text="Uppkast"/>
+<l:gentext key="above" text="ofan"/>
+<l:gentext key="below" text="neðar"/>
+<l:gentext key="sectioncalled" text=""/>
+<l:gentext key="index symbols" text="tákn"/>
+<l:gentext key="writing-mode" text="lr-tb"/>
+<l:gentext key="lowercase.alpha" text="aábdðeéfghiíjklmnoóprstuúvxyýþæö"/>
+<l:gentext key="uppercase.alpha" text="AÃBDÄEÉFGHIÃJKLMNOÓPRSTUÚVXYÃÞÆÖ"/>
+<l:gentext key="normalize.sort.input" text="AaÃáBbCcDdÄðEeÉéFfGgHhIiÃíJjKkLlMmNnOoÓóPpQqRrSsTtUuÚúVvWwXxYyÃýZzÞþÆæÖö"/>
+<l:gentext key="normalize.sort.output" text="AAÃÃBBCCDDÄÄEEÉÉFFGGHHIIÃÃJJKKLLMMNNOOÓÓPPQQRRSSTTUUÚÚVVWWXXYYÃÃZZÞÞÆÆÖÖ"/>
+<l:dingbat key="startquote" text="“"/>
+<l:dingbat key="endquote" text="â€"/>
+<l:dingbat key="nestedstartquote" text="‘"/>
+<l:dingbat key="nestedendquote" text="’"/>
+<l:dingbat key="singlestartquote" text="‘"/>
+<l:dingbat key="singleendquote" text="’"/>
+<l:dingbat key="bullet" text="•"/>
+<l:gentext key="hyphenation-character" text="-"/>
+<l:gentext key="hyphenation-push-character-count" text="2"/>
+<l:gentext key="hyphenation-remain-character-count" text="2"/>
+<l:context name="styles"><l:template name="person-name" text="first-last"/>
+</l:context>
+<l:context name="title"><l:template name="abstract" text="%t"/>
+<l:template name="acknowledgements" text="%t"/>
+<l:template name="answer" text="%t"/>
+<l:template name="appendix" text="Viðauki %n. %t"/>
+<l:template name="article" text="%t"/>
+<l:template name="authorblurb" text="%t"/>
+<l:template name="bibliodiv" text="%t"/>
+<l:template name="biblioentry" text="%t"/>
+<l:template name="bibliography" text="%t"/>
+<l:template name="bibliolist" text="%t"/>
+<l:template name="bibliomixed" text="%t"/>
+<l:template name="bibliomset" text="%t"/>
+<l:template name="biblioset" text="%t"/>
+<l:template name="blockquote" text="%t"/>
+<l:template name="book" text="%t"/>
+<l:template name="calloutlist" text="%t"/>
+<l:template name="caution" text="%t"/>
+<l:template name="chapter" text="Kafli %n. %t"/>
+<l:template name="colophon" text="%t"/>
+<l:template name="dedication" text="%t"/>
+<l:template name="equation" text="Formúla %n. %t"/>
+<l:template name="example" text="Dæmi %n. %t"/>
+<l:template name="figure" text="Skýringamynd %n. %t"/>
+<l:template name="foil" text="%t"/>
+<l:template name="foilgroup" text="%t"/>
+<l:template name="formalpara" text="%t"/>
+<l:template name="glossary" text="%t"/>
+<l:template name="glossdiv" text="%t"/>
+<l:template name="glosslist" text="%t"/>
+<l:template name="glossentry" text="%t"/>
+<l:template name="important" text="%t"/>
+<l:template name="index" text="%t"/>
+<l:template name="indexdiv" text="%t"/>
+<l:template name="itemizedlist" text="%t"/>
+<l:template name="legalnotice" text="%t"/>
+<l:template name="listitem" text=""/>
+<l:template name="lot" text="%t"/>
+<l:template name="msg" text="%t"/>
+<l:template name="msgexplan" text="%t"/>
+<l:template name="msgmain" text="%t"/>
+<l:template name="msgrel" text="%t"/>
+<l:template name="msgset" text="%t"/>
+<l:template name="msgsub" text="%t"/>
+<l:template name="note" text="%t"/>
+<l:template name="orderedlist" text="%t"/>
+<l:template name="part" text="Hluti %n. %t"/>
+<l:template name="partintro" text="%t"/>
+<l:template name="preface" text="%t"/>
+<l:template name="procedure" text="%t"/>
+<l:template name="procedure.formal" text="Vinnuferli %n. %t"/>
+<l:template name="productionset" text="%t"/>
+<l:template name="productionset.formal" text="Framleiðsla %n"/>
+<l:template name="qandadiv" text="%t"/>
+<l:template name="qandaentry" text="%t"/>
+<l:template name="qandaset" text="%t"/>
+<l:template name="question" text="%t"/>
+<l:template name="refentry" text="%t"/>
+<l:template name="reference" text="%t"/>
+<l:template name="refsection" text="%t"/>
+<l:template name="refsect1" text="%t"/>
+<l:template name="refsect2" text="%t"/>
+<l:template name="refsect3" text="%t"/>
+<l:template name="refsynopsisdiv" text="%t"/>
+<l:template name="refsynopsisdivinfo" text="%t"/>
+<l:template name="segmentedlist" text="%t"/>
+<l:template name="set" text="%t"/>
+<l:template name="setindex" text="%t"/>
+<l:template name="sidebar" text="%t"/>
+<l:template name="step" text="%t"/>
+<l:template name="table" text="Tafla %n. %t"/>
+<l:template name="task" text="%t"/>
+<l:template name="tasksummary" text="%t"/>
+<l:template name="taskprerequisites" text="%t"/>
+<l:template name="taskrelated" text="%t"/>
+<l:template name="tip" text="%t"/>
+<l:template name="toc" text="%t"/>
+<l:template name="variablelist" text="%t"/>
+<l:template name="varlistentry" text=""/>
+<l:template name="warning" text="%t"/>
+</l:context>
+<l:context name="title-unnumbered"><l:template name="appendix" text="%t"/>
+<l:template name="article/appendix" text="%t"/>
+<l:template name="bridgehead" text="%t"/>
+<l:template name="chapter" text="%t"/>
+<l:template name="sect1" text="%t"/>
+<l:template name="sect2" text="%t"/>
+<l:template name="sect3" text="%t"/>
+<l:template name="sect4" text="%t"/>
+<l:template name="sect5" text="%t"/>
+<l:template name="section" text="%t"/>
+<l:template name="simplesect" text="%t"/>
+<l:template name="part" text="%t"/>
+</l:context>
+<l:context name="title-numbered"><l:template name="appendix" text="Viðauki %n. %t"/>
+<l:template name="article/appendix" text="%n. %t"/>
+<l:template name="bridgehead" text="%n. %t"/>
+<l:template name="chapter" text="Kafli %n. %t"/>
+<l:template name="part" text="Hluti %n. %t"/>
+<l:template name="sect1" text="%n. %t"/>
+<l:template name="sect2" text="%n. %t"/>
+<l:template name="sect3" text="%n. %t"/>
+<l:template name="sect4" text="%n. %t"/>
+<l:template name="sect5" text="%n. %t"/>
+<l:template name="section" text="%n. %t"/>
+<l:template name="simplesect" text="%t"/>
+</l:context>
+<l:context name="subtitle"><l:template name="appendix" text="%s"/>
+<l:template name="acknowledgements" text="%s"/>
+<l:template name="article" text="%s"/>
+<l:template name="bibliodiv" text="%s"/>
+<l:template name="biblioentry" text="%s"/>
+<l:template name="bibliography" text="%s"/>
+<l:template name="bibliomixed" text="%s"/>
+<l:template name="bibliomset" text="%s"/>
+<l:template name="biblioset" text="%s"/>
+<l:template name="book" text="%s"/>
+<l:template name="chapter" text="%s"/>
+<l:template name="colophon" text="%s"/>
+<l:template name="dedication" text="%s"/>
+<l:template name="glossary" text="%s"/>
+<l:template name="glossdiv" text="%s"/>
+<l:template name="index" text="%s"/>
+<l:template name="indexdiv" text="%s"/>
+<l:template name="lot" text="%s"/>
+<l:template name="part" text="%s"/>
+<l:template name="partintro" text="%s"/>
+<l:template name="preface" text="%s"/>
+<l:template name="refentry" text="%s"/>
+<l:template name="reference" text="%s"/>
+<l:template name="refsection" text="%s"/>
+<l:template name="refsect1" text="%s"/>
+<l:template name="refsect2" text="%s"/>
+<l:template name="refsect3" text="%s"/>
+<l:template name="refsynopsisdiv" text="%s"/>
+<l:template name="sect1" text="%s"/>
+<l:template name="sect2" text="%s"/>
+<l:template name="sect3" text="%s"/>
+<l:template name="sect4" text="%s"/>
+<l:template name="sect5" text="%s"/>
+<l:template name="section" text="%s"/>
+<l:template name="set" text="%s"/>
+<l:template name="setindex" text="%s"/>
+<l:template name="sidebar" text="%s"/>
+<l:template name="simplesect" text="%s"/>
+<l:template name="toc" text="%s"/>
+</l:context>
+<l:context name="xref"><l:template name="abstract" text="%t"/>
+<l:template name="acknowledgements" text="%t"/>
+<l:template name="answer" text="Svar %n"/>
+<l:template name="appendix" text="%t"/>
+<l:template name="article" text="%t"/>
+<l:template name="authorblurb" text="%t"/>
+<l:template name="bibliodiv" text="%t"/>
+<l:template name="bibliography" text="%t"/>
+<l:template name="bibliomset" text="%t"/>
+<l:template name="biblioset" text="%t"/>
+<l:template name="blockquote" text="%t"/>
+<l:template name="book" text="%t"/>
+<l:template name="calloutlist" text="%t"/>
+<l:template name="caution" text="%t"/>
+<l:template name="chapter" text="%t"/>
+<l:template name="colophon" text="%t"/>
+<l:template name="constraintdef" text="%t"/>
+<l:template name="dedication" text="%t"/>
+<l:template name="equation" text="%t"/>
+<l:template name="example" text="%t"/>
+<l:template name="figure" text="%t"/>
+<l:template name="foil" text="%t"/>
+<l:template name="foilgroup" text="%t"/>
+<l:template name="formalpara" text="%t"/>
+<l:template name="glossary" text="%t"/>
+<l:template name="glossdiv" text="%t"/>
+<l:template name="important" text="%t"/>
+<l:template name="index" text="%t"/>
+<l:template name="indexdiv" text="%t"/>
+<l:template name="itemizedlist" text="%t"/>
+<l:template name="legalnotice" text="%t"/>
+<l:template name="listitem" text="%n"/>
+<l:template name="lot" text="%t"/>
+<l:template name="msg" text="%t"/>
+<l:template name="msgexplan" text="%t"/>
+<l:template name="msgmain" text="%t"/>
+<l:template name="msgrel" text="%t"/>
+<l:template name="msgset" text="%t"/>
+<l:template name="msgsub" text="%t"/>
+<l:template name="note" text="%t"/>
+<l:template name="orderedlist" text="%t"/>
+<l:template name="part" text="%t"/>
+<l:template name="partintro" text="%t"/>
+<l:template name="preface" text="%t"/>
+<l:template name="procedure" text="%t"/>
+<l:template name="productionset" text="%t"/>
+<l:template name="qandadiv" text="%t"/>
+<l:template name="qandaentry" text="Spurning %n"/>
+<l:template name="qandaset" text="%t"/>
+<l:template name="question" text="Spurning %n"/>
+<l:template name="reference" text="%t"/>
+<l:template name="refsynopsisdiv" text="%t"/>
+<l:template name="segmentedlist" text="%t"/>
+<l:template name="set" text="%t"/>
+<l:template name="setindex" text="%t"/>
+<l:template name="sidebar" text="%t"/>
+<l:template name="table" text="%t"/>
+<l:template name="task" text="%t"/>
+<l:template name="tip" text="%t"/>
+<l:template name="toc" text="%t"/>
+<l:template name="variablelist" text="%t"/>
+<l:template name="varlistentry" text="%n"/>
+<l:template name="warning" text="%t"/>
+<l:template name="olink.document.citation" text=" in %o"/>
+<l:template name="olink.page.citation" text=" (page %p)"/>
+<l:template name="page.citation" text=" [%p]"/>
+<l:template name="page" text="(blaðsíða %p)"/>
+<l:template name="docname" text=" í %o"/>
+<l:template name="docnamelong" text=" in the document titled %o" lang="en"/>
+<l:template name="pageabbrev" text="(bls. %p)"/>
+<l:template name="Page" text="Blaðsíða %p"/>
+<l:template name="bridgehead" text=" “%tâ€"/>
+<l:template name="refsection" text=" “%tâ€"/>
+<l:template name="refsect1" text=" “%tâ€"/>
+<l:template name="refsect2" text=" “%tâ€"/>
+<l:template name="refsect3" text=" “%tâ€"/>
+<l:template name="sect1" text=" “%tâ€"/>
+<l:template name="sect2" text=" “%tâ€"/>
+<l:template name="sect3" text=" “%tâ€"/>
+<l:template name="sect4" text=" “%tâ€"/>
+<l:template name="sect5" text=" “%tâ€"/>
+<l:template name="section" text=" “%tâ€"/>
+<l:template name="simplesect" text=" “%tâ€"/>
+</l:context>
+<l:context name="xref-number"><l:template name="answer" text="Svar %n"/>
+<l:template name="appendix" text="Viðauki %n"/>
+<l:template name="bridgehead" text="Grein %n"/>
+<l:template name="chapter" text="Kafli %n"/>
+<l:template name="equation" text="Formúla %n"/>
+<l:template name="example" text="Dæmi %n"/>
+<l:template name="figure" text="Skýringamynd %n"/>
+<l:template name="part" text="Hluti %n"/>
+<l:template name="procedure" text="Vinnuferli %n"/>
+<l:template name="productionset" text="Framleiðsla %n"/>
+<l:template name="qandadiv" text="Spurning og svör %n"/>
+<l:template name="qandaentry" text="Spurning %n"/>
+<l:template name="question" text="Spurning %n"/>
+<l:template name="sect1" text="Grein %n"/>
+<l:template name="sect2" text="Grein %n"/>
+<l:template name="sect3" text="Grein %n"/>
+<l:template name="sect4" text="Grein %n"/>
+<l:template name="sect5" text="Grein %n"/>
+<l:template name="section" text="Grein %n"/>
+<l:template name="table" text="Tafla %n"/>
+</l:context>
+<l:context name="xref-number-and-title"><l:template name="appendix" text="Viðauki %n, %t"/>
+<l:template name="bridgehead" text="Grein %n, “%tâ€"/>
+<l:template name="chapter" text="Kafli %n, %t"/>
+<l:template name="equation" text="Formúla %n, “%tâ€"/>
+<l:template name="example" text="Dæmi %n, “%tâ€"/>
+<l:template name="figure" text="Skýringamynd %n, “%tâ€"/>
+<l:template name="part" text="Hluti %n, “%tâ€"/>
+<l:template name="procedure" text="Vinnuferli %n, “%tâ€"/>
+<l:template name="productionset" text="Framleiðsla %n, “%tâ€"/>
+<l:template name="qandadiv" text="Spurning og svör %n, “%tâ€"/>
+<l:template name="refsect1" text=" “%tâ€"/>
+<l:template name="refsect2" text=" “%tâ€"/>
+<l:template name="refsect3" text=" “%tâ€"/>
+<l:template name="refsection" text=" “%tâ€"/>
+<l:template name="sect1" text="Grein %n, “%tâ€"/>
+<l:template name="sect2" text="Grein %n, “%tâ€"/>
+<l:template name="sect3" text="Grein %n, “%tâ€"/>
+<l:template name="sect4" text="Grein %n, “%tâ€"/>
+<l:template name="sect5" text="Grein %n, “%tâ€"/>
+<l:template name="section" text="Grein %n, “%tâ€"/>
+<l:template name="simplesect" text=" “%tâ€"/>
+<l:template name="table" text="Tafla %n, “%tâ€"/>
+</l:context>
+<l:context name="authorgroup"><l:template name="sep" text=", "/>
+<l:template name="sep2" text=" og "/>
+<l:template name="seplast" text=", og "/>
+</l:context>
+<l:context name="glossary"><l:template name="see" text="Sjá %t."/>
+<l:template name="seealso" text="Sjá einnig %t."/>
+<l:template name="seealso-separator" text=", "/>
+</l:context>
+<l:context name="msgset"><l:template name="MsgAud" text="Markhópur: "/>
+<l:template name="MsgLevel" text="Stig: "/>
+<l:template name="MsgOrig" text="Uppruni: "/>
+</l:context>
+<l:context name="datetime"><l:template name="format" text="d-m-Y"/>
+</l:context>
+<l:context name="termdef"><l:template name="prefix" text="[Definition: "/>
+<l:template name="suffix" text="]"/>
+</l:context>
+<l:context name="datetime-full"><l:template name="January" text="Janúar"/>
+<l:template name="February" text="Febrúar"/>
+<l:template name="March" text="Mars"/>
+<l:template name="April" text="Apríl"/>
+<l:template name="May" text="Maí"/>
+<l:template name="June" text="Júní"/>
+<l:template name="July" text="Júlí"/>
+<l:template name="August" text="Ãgúst"/>
+<l:template name="September" text="September"/>
+<l:template name="October" text="Október"/>
+<l:template name="November" text="Nóvember"/>
+<l:template name="December" text="Desember"/>
+<l:template name="Monday" text="Mánudagur"/>
+<l:template name="Tuesday" text="Þriðjudagur"/>
+<l:template name="Wednesday" text="Miðvikudagur"/>
+<l:template name="Thursday" text="Fimmtudagur"/>
+<l:template name="Friday" text="Föstudagur"/>
+<l:template name="Saturday" text="Laugardagur"/>
+<l:template name="Sunday" text="Sunnudagur"/>
+</l:context>
+<l:context name="datetime-abbrev"><l:template name="Jan" text="Jan"/>
+<l:template name="Feb" text="Feb"/>
+<l:template name="Mar" text="Mar"/>
+<l:template name="Apr" text="Apr"/>
+<l:template name="May" text="Maí"/>
+<l:template name="Jun" text="Jún"/>
+<l:template name="Jul" text="Júl"/>
+<l:template name="Aug" text="Ãgú"/>
+<l:template name="Sep" text="Sep"/>
+<l:template name="Oct" text="Okt"/>
+<l:template name="Nov" text="Nóv"/>
+<l:template name="Dec" text="Des"/>
+<l:template name="Mon" text="Mán"/>
+<l:template name="Tue" text="Þri"/>
+<l:template name="Wed" text="Mið"/>
+<l:template name="Thu" text="Fim"/>
+<l:template name="Fri" text="Fös"/>
+<l:template name="Sat" text="Lau"/>
+<l:template name="Sun" text="Sun"/>
+</l:context>
+<l:context name="htmlhelp"><l:template name="langcode" text="0x040F Icelandic"/>
+</l:context>
+<l:context name="index"><l:template name="term-separator" text=", "/>
+<l:template name="number-separator" text=", "/>
+<l:template name="range-separator" text="-"/>
+</l:context>
+<l:context name="iso690"><l:template name="lastfirst.sep" text=", "/>
+<l:template name="alt.person.two.sep" text=" – "/>
+<l:template name="alt.person.last.sep" text=" – "/>
+<l:template name="alt.person.more.sep" text=" – "/>
+<l:template name="primary.editor" text=" (ed.)"/>
+<l:template name="primary.many" text=", et al."/>
+<l:template name="primary.sep" text=". "/>
+<l:template name="submaintitle.sep" text=": "/>
+<l:template name="title.sep" text=". "/>
+<l:template name="othertitle.sep" text=", "/>
+<l:template name="medium1" text=" ["/>
+<l:template name="medium2" text="]"/>
+<l:template name="secondary.person.sep" text="; "/>
+<l:template name="secondary.sep" text=". "/>
+<l:template name="respons.sep" text=". "/>
+<l:template name="edition.sep" text=". "/>
+<l:template name="edition.serial.sep" text=", "/>
+<l:template name="issuing.range" text="-"/>
+<l:template name="issuing.div" text=", "/>
+<l:template name="issuing.sep" text=". "/>
+<l:template name="partnr.sep" text=". "/>
+<l:template name="placepubl.sep" text=": "/>
+<l:template name="publyear.sep" text=", "/>
+<l:template name="pubinfo.sep" text=". "/>
+<l:template name="spec.pubinfo.sep" text=", "/>
+<l:template name="upd.sep" text=", "/>
+<l:template name="datecit1" text=" [cited "/>
+<l:template name="datecit2" text="]"/>
+<l:template name="extent.sep" text=". "/>
+<l:template name="locs.sep" text=", "/>
+<l:template name="location.sep" text=". "/>
+<l:template name="serie.sep" text=". "/>
+<l:template name="notice.sep" text=". "/>
+<l:template name="access" text="Available "/>
+<l:template name="acctoo" text="Also available "/>
+<l:template name="onwww" text="from World Wide Web"/>
+<l:template name="oninet" text="from Internet"/>
+<l:template name="access.end" text=": "/>
+<l:template name="link1" text="&lt;"/>
+<l:template name="link2" text="&gt;"/>
+<l:template name="access.sep" text=". "/>
+<l:template name="isbn" text="ISBN "/>
+<l:template name="issn" text="ISSN "/>
+<l:template name="stdnum.sep" text=". "/>
+<l:template name="patcountry.sep" text=". "/>
+<l:template name="pattype.sep" text=", "/>
+<l:template name="patnum.sep" text=". "/>
+<l:template name="patdate.sep" text=". "/>
+</l:context><l:letters><l:l i="-1"/>
+<l:l i="0">tákn</l:l>
+<l:l i="10">A</l:l>
+<l:l i="10">a</l:l>
+<l:l i="20">Ã</l:l>
+<l:l i="20">á</l:l>
+<l:l i="30">B</l:l>
+<l:l i="30">b</l:l>
+<l:l i="40">D</l:l>
+<l:l i="40">d</l:l>
+<l:l i="50">Ä</l:l>
+<l:l i="50">ð</l:l>
+<l:l i="60">E</l:l>
+<l:l i="60">e</l:l>
+<l:l i="70">É</l:l>
+<l:l i="70">é</l:l>
+<l:l i="80">F</l:l>
+<l:l i="80">f</l:l>
+<l:l i="90">G</l:l>
+<l:l i="90">g</l:l>
+<l:l i="100">H</l:l>
+<l:l i="100">h</l:l>
+<l:l i="110">I</l:l>
+<l:l i="110">i</l:l>
+<l:l i="120">Ã</l:l>
+<l:l i="120">í</l:l>
+<l:l i="130">J</l:l>
+<l:l i="130">j</l:l>
+<l:l i="140">K</l:l>
+<l:l i="140">k</l:l>
+<l:l i="150">L</l:l>
+<l:l i="150">l</l:l>
+<l:l i="160">M</l:l>
+<l:l i="160">m</l:l>
+<l:l i="170">N</l:l>
+<l:l i="170">n</l:l>
+<l:l i="180">O</l:l>
+<l:l i="180">o</l:l>
+<l:l i="190">Ó</l:l>
+<l:l i="190">ó</l:l>
+<l:l i="200">P</l:l>
+<l:l i="200">p</l:l>
+<l:l i="210">R</l:l>
+<l:l i="210">r</l:l>
+<l:l i="220">S</l:l>
+<l:l i="220">s</l:l>
+<l:l i="230">T</l:l>
+<l:l i="230">t</l:l>
+<l:l i="240">U</l:l>
+<l:l i="240">u</l:l>
+<l:l i="250">Ú</l:l>
+<l:l i="250">ú</l:l>
+<l:l i="260">V</l:l>
+<l:l i="260">v</l:l>
+<l:l i="270">X</l:l>
+<l:l i="270">x</l:l>
+<l:l i="280">Y</l:l>
+<l:l i="280">y</l:l>
+<l:l i="290">Ã</l:l>
+<l:l i="290">ý</l:l>
+<l:l i="300">Þ</l:l>
+<l:l i="300">þ</l:l>
+<l:l i="310">Æ</l:l>
+<l:l i="310">æ</l:l>
+<l:l i="320">Ö</l:l>
+<l:l i="320">ö</l:l>
+</l:letters>
+</l:l10n>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/it.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/it.xml
new file mode 100644
index 0000000..691e4d2
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/it.xml
@@ -0,0 +1,1229 @@
+<?xml version="1.0" encoding="utf-8"?>
+<l:l10n xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0" language="it" english-language-name="Italian">
+
+<!-- * This file is generated automatically. -->
+<!-- * To submit changes to this file upstream (to the DocBook Project) -->
+<!-- * do not submit an edited version of this file. Instead, submit an -->
+<!-- * edited version of the source file at the following location: -->
+<!-- * -->
+<!-- * https://docbook.svn.sourceforge.net/svnroot/docbook/trunk/gentext/locale/it.xml -->
+<!-- * -->
+<!-- * E-mail the edited it.xml source file to: -->
+<!-- * -->
+<!-- * docbook-developers@lists.sourceforge.net -->
+
+<!-- ******************************************************************** -->
+
+<!-- This file is part of the XSL DocBook Stylesheet distribution. -->
+<!-- See ../README or http://docbook.sf.net/release/xsl/current/ for -->
+<!-- copyright and other information. -->
+
+<!-- ******************************************************************** -->
+<!-- In these files, % with a letter is used for a placeholder: -->
+<!-- %t is the current element's title -->
+<!-- %s is the current element's subtitle (if applicable)-->
+<!-- %n is the current element's number label-->
+<!-- %p is the current element's page number (if applicable)-->
+<!-- ******************************************************************** -->
+
+
+<l:gentext key="Abstract" text="Sommario"/>
+<l:gentext key="abstract" text="Sommario"/>
+<l:gentext key="Acknowledgements" text="Acknowledgements" lang="en"/>
+<l:gentext key="acknowledgements" text="Acknowledgements" lang="en"/>
+<l:gentext key="Answer" text="Risposta:"/>
+<l:gentext key="answer" text="Risposta:"/>
+<l:gentext key="Appendix" text="Appendice"/>
+<l:gentext key="appendix" text="Appendice"/>
+<l:gentext key="Article" text="Articolo"/>
+<l:gentext key="article" text="Articolo"/>
+<l:gentext key="Author" text="Autore"/>
+<l:gentext key="Bibliography" text="Bibliografia"/>
+<l:gentext key="bibliography" text="Bibliografia"/>
+<l:gentext key="Book" text="Libro"/>
+<l:gentext key="book" text="Libro"/>
+<l:gentext key="CAUTION" text="ATTENZIONE"/>
+<l:gentext key="Caution" text="Attenzione"/>
+<l:gentext key="caution" text="Attenzione"/>
+<l:gentext key="Chapter" text="Capitolo"/>
+<l:gentext key="chapter" text="Capitolo"/>
+<l:gentext key="Colophon" text="Colofone"/>
+<l:gentext key="colophon" text="Colofone"/>
+<l:gentext key="Copyright" text="Diritto d'autore"/>
+<l:gentext key="copyright" text="Diritto d'autore"/>
+<l:gentext key="Dedication" text="Dedica"/>
+<l:gentext key="dedication" text="Dedica"/>
+<l:gentext key="Edition" text="Edizione"/>
+<l:gentext key="edition" text="Edizione"/>
+<l:gentext key="Editor" text="Editor"/>
+<l:gentext key="Equation" text="Equazione"/>
+<l:gentext key="equation" text="Equazione"/>
+<l:gentext key="Example" text="Esempio"/>
+<l:gentext key="example" text="Esempio"/>
+<l:gentext key="Figure" text="Figura"/>
+<l:gentext key="figure" text="Figura"/>
+<l:gentext key="Glossary" text="Glossario"/>
+<l:gentext key="glossary" text="Glossario"/>
+<l:gentext key="GlossSee" text="Vedi"/>
+<l:gentext key="glosssee" text="Vedi"/>
+<l:gentext key="GlossSeeAlso" text="Vedi anche"/>
+<l:gentext key="glossseealso" text="Vedi anche"/>
+<l:gentext key="IMPORTANT" text="IMPORTANTE"/>
+<l:gentext key="important" text="Importante"/>
+<l:gentext key="Important" text="Importante"/>
+<l:gentext key="Index" text="Indice analitico"/>
+<l:gentext key="index" text="Indice analitico"/>
+<l:gentext key="ISBN" text="ISBN"/>
+<l:gentext key="isbn" text="ISBN"/>
+<l:gentext key="LegalNotice" text="Nota Legale"/>
+<l:gentext key="legalnotice" text="Nota Legale"/>
+<l:gentext key="MsgAud" text="Pubblico"/>
+<l:gentext key="msgaud" text="Pubblico"/>
+<l:gentext key="MsgLevel" text="Livello"/>
+<l:gentext key="msglevel" text="Livello"/>
+<l:gentext key="MsgOrig" text="Origine"/>
+<l:gentext key="msgorig" text="Origine"/>
+<l:gentext key="NOTE" text="NOTA"/>
+<l:gentext key="Note" text="Nota"/>
+<l:gentext key="note" text="Nota"/>
+<l:gentext key="Part" text="Parte"/>
+<l:gentext key="part" text="Parte"/>
+<l:gentext key="Preface" text="Prefazione"/>
+<l:gentext key="preface" text="Prefazione"/>
+<l:gentext key="Procedure" text="Procedura"/>
+<l:gentext key="procedure" text="Procedura"/>
+<l:gentext key="ProductionSet" text="Produzione"/>
+<l:gentext key="PubDate" text="Data di pubblicazione"/>
+<l:gentext key="pubdate" text="Data di pubblicazione"/>
+<l:gentext key="Published" text="Pubblicato"/>
+<l:gentext key="published" text="Pubblicato"/>
+<l:gentext key="Publisher" text="Editore"/>
+<l:gentext key="Qandadiv" text="Domande e risposte"/>
+<l:gentext key="qandadiv" text="Domande e risposte"/>
+<l:gentext key="QandASet" text="Domande ricorrenti"/>
+<l:gentext key="Question" text="Domanda:"/>
+<l:gentext key="question" text="Domanda:"/>
+<l:gentext key="RefEntry" text=""/>
+<l:gentext key="refentry" text=""/>
+<l:gentext key="Reference" text="Riferimento"/>
+<l:gentext key="reference" text="Riferimento"/>
+<l:gentext key="References" text="Riferimenti"/>
+<l:gentext key="RefName" text="Nome"/>
+<l:gentext key="refname" text="Nome"/>
+<l:gentext key="RefSection" text=""/>
+<l:gentext key="refsection" text=""/>
+<l:gentext key="RefSynopsisDiv" text="Sinossi"/>
+<l:gentext key="refsynopsisdiv" text="Sinossi"/>
+<l:gentext key="RevHistory" text="Diario delle Revisioni"/>
+<l:gentext key="revhistory" text="Diario delle Revisioni"/>
+<l:gentext key="revision" text="Revisione"/>
+<l:gentext key="Revision" text="Revisione"/>
+<l:gentext key="sect1" text="Sezione"/>
+<l:gentext key="sect2" text="Sezione"/>
+<l:gentext key="sect3" text="Sezione"/>
+<l:gentext key="sect4" text="Sezione"/>
+<l:gentext key="sect5" text="Sezione"/>
+<l:gentext key="section" text="Sezione"/>
+<l:gentext key="Section" text="Sezione"/>
+<l:gentext key="see" text="vedi"/>
+<l:gentext key="See" text="Vedi"/>
+<l:gentext key="seealso" text="vedi anche"/>
+<l:gentext key="Seealso" text="Vedi anche"/>
+<l:gentext key="SeeAlso" text="Vedi Anche"/>
+<l:gentext key="set" text="Raccolta"/>
+<l:gentext key="Set" text="Raccolta"/>
+<l:gentext key="setindex" text="Indice della raccolta"/>
+<l:gentext key="SetIndex" text="Indice della raccolta"/>
+<l:gentext key="Sidebar" text=""/>
+<l:gentext key="sidebar" text="nota a margine"/>
+<l:gentext key="step" text="passo"/>
+<l:gentext key="Step" text="Passo"/>
+<l:gentext key="table" text="Tabella"/>
+<l:gentext key="Table" text="Tabella"/>
+<l:gentext key="task" text="Attività"/>
+<l:gentext key="Task" text="Attività"/>
+<l:gentext key="tip" text="Suggerimento"/>
+<l:gentext key="TIP" text="SUGGERIMENTO"/>
+<l:gentext key="Tip" text="Suggerimento"/>
+<l:gentext key="Warning" text="Avvertimento"/>
+<l:gentext key="warning" text="avvertimento"/>
+<l:gentext key="WARNING" text="AVVERTIMENTO"/>
+<l:gentext key="and" text="e"/>
+<l:gentext key="by" text="di"/>
+<l:gentext key="Edited" text="A cura"/>
+<l:gentext key="edited" text="A cura"/>
+<l:gentext key="Editedby" text="A cura di"/>
+<l:gentext key="editedby" text="A cura di"/>
+<l:gentext key="in" text="in"/>
+<l:gentext key="lastlistcomma" text=","/>
+<l:gentext key="listcomma" text=","/>
+<l:gentext key="notes" text="Note"/>
+<l:gentext key="Notes" text="Note"/>
+<l:gentext key="Pgs" text="pp."/>
+<l:gentext key="pgs" text="pp."/>
+<l:gentext key="Revisedby" text="Revisionato da: "/>
+<l:gentext key="revisedby" text="Revisionato da: "/>
+<l:gentext key="TableNotes" text="Note"/>
+<l:gentext key="tablenotes" text="Note"/>
+<l:gentext key="TableofContents" text="Indice"/>
+<l:gentext key="tableofcontents" text="Indice"/>
+<l:gentext key="unexpectedelementname" text="Nome di elemento inatteso"/>
+<l:gentext key="unsupported" text="non supportato"/>
+<l:gentext key="xrefto" text="riferimento a"/>
+<l:gentext key="Authors" text="Autori"/>
+<l:gentext key="copyeditor" text="Correttore di bozze"/>
+<l:gentext key="graphicdesigner" text="Progettista grafico"/>
+<l:gentext key="productioneditor" text="Montatore"/>
+<l:gentext key="technicaleditor" text="Revisore tecnico"/>
+<l:gentext key="translator" text="Traduttore"/>
+<l:gentext key="listofequations" text="Lista delle equazioni"/>
+<l:gentext key="ListofEquations" text="Lista delle equazioni"/>
+<l:gentext key="ListofExamples" text="Lista degli esempi"/>
+<l:gentext key="listofexamples" text="Lista degli esempi"/>
+<l:gentext key="ListofFigures" text="Lista delle figure"/>
+<l:gentext key="listoffigures" text="Lista delle figure"/>
+<l:gentext key="ListofProcedures" text="Lista delle procedure"/>
+<l:gentext key="listofprocedures" text="Lista delle procedure"/>
+<l:gentext key="listoftables" text="Lista delle tabelle"/>
+<l:gentext key="ListofTables" text="Lista delle tabelle"/>
+<l:gentext key="ListofUnknown" text="Lista degli sconosciuti"/>
+<l:gentext key="listofunknown" text="Lista degli sconosciuti"/>
+<l:gentext key="nav-home" text="Partenza"/>
+<l:gentext key="nav-next" text="Avanti"/>
+<l:gentext key="nav-next-sibling" text="Salta Avanti"/>
+<l:gentext key="nav-prev" text="Indietro"/>
+<l:gentext key="nav-prev-sibling" text="Salta Indietro"/>
+<l:gentext key="nav-up" text="Risali"/>
+<l:gentext key="nav-toc" text="Sommario"/>
+<l:gentext key="Draft" text="Bozza"/>
+<l:gentext key="above" text="sopra"/>
+<l:gentext key="below" text="sotto"/>
+<l:gentext key="sectioncalled" text="sezione chiamata"/>
+<l:gentext key="index symbols" text="Simboli"/>
+<l:gentext key="writing-mode" text="lr-tb"/>
+<l:gentext key="lowercase.alpha" text="abcdefghijklmnopqrstuvwxyz"/>
+<l:gentext key="uppercase.alpha" text="ABCDEFGHIJKLMNOPQRSTUVWXYZ"/>
+<l:gentext key="normalize.sort.input" text="AaÀàÃáÂâÃãÄäÅåĀÄĂ㥹ÇǎǞǟǠǡǺǻȀÈȂȃȦȧḀá¸áºšáº áº¡áº¢áº£áº¤áº¥áº¦áº§áº¨áº©áºªáº«áº¬áº­áº®áº¯áº°áº±áº²áº³áº´áºµáº¶áº·BbÆ€ÆɓƂƃḂḃḄḅḆḇCcÇçĆćĈĉĊċČÄƇƈɕḈḉDdÄŽÄÄđƊɗƋƌDžDzȡɖḊḋḌá¸á¸Žá¸á¸á¸‘ḒḓEeÈèÉéÊêËëĒēĔĕĖėĘęĚěȄȅȆȇȨȩḔḕḖḗḘḙḚḛḜá¸áº¸áº¹áººáº»áº¼áº½áº¾áº¿á»€á»á»‚ểỄễỆệFfƑƒḞḟGgÄœÄĞğĠġĢģƓɠǤǥǦǧǴǵḠḡHhĤĥĦħȞȟɦḢḣḤḥḦḧḨḩḪḫẖIiÌìÃíÎîÃïĨĩĪīĬĭĮįİƗɨÇÇȈȉȊȋḬḭḮḯỈỉỊịJjĴĵǰÊKkĶķƘƙǨǩḰḱḲḳḴḵLlĹĺĻļĽľĿŀÅłƚLjȴɫɬɭḶḷḸḹḺḻḼḽMmɱḾḿṀá¹á¹‚ṃNnÑñŃńŅņŇňÆɲƞȠNjǸǹȵɳṄṅṆṇṈṉṊṋOoÒòÓóÔôÕõÖöØøŌÅÅŽÅÅőƟƠơǑǒǪǫǬǭǾǿȌÈÈŽÈȪȫȬȭȮȯȰȱṌá¹á¹Žá¹á¹á¹‘ṒṓỌá»á»Žá»á»á»‘ỒồỔổỖỗỘộỚớỜá»á»žá»Ÿá» á»¡á»¢á»£PpƤƥṔṕṖṗQqÊ RrŔŕŖŗŘřÈȑȒȓɼɽɾṘṙṚṛṜá¹á¹žá¹ŸSsŚśŜÅŞşŠšȘșʂṠṡṢṣṤṥṦṧṨṩTtŢţŤťŦŧƫƬƭƮʈȚțȶṪṫṬṭṮṯṰṱẗUuÙùÚúÛûÜüŨũŪūŬŭŮůŰűŲųƯưǓǔǕǖǗǘǙǚǛǜȔȕȖȗṲṳṴṵṶṷṸṹṺṻỤụỦủỨứỪừỬửỮữỰựVvƲʋṼṽṾṿWwŴŵẀáºáº‚ẃẄẅẆẇẈẉẘXxẊẋẌáºYyÃýÿŸŶŷƳƴȲȳẎáºáº™á»²á»³á»´á»µá»¶á»·á»¸á»¹ZzŹźŻżŽžƵƶȤȥÊÊ‘áºáº‘ẒẓẔẕẕ"/>
+<l:gentext key="normalize.sort.output" text="AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBCCCCCCCCCCCCCCCCCDDDDDDDDDDDDDDDDDDDDDDDDEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEFFFFFFGGGGGGGGGGGGGGGGGGGGHHHHHHHHHHHHHHHHHHHHIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIJJJJJJKKKKKKKKKKKKKKLLLLLLLLLLLLLLLLLLLLLLLLLLMMMMMMMMMNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOPPPPPPPPQQQRRRRRRRRRRRRRRRRRRRRRRRSSSSSSSSSSSSSSSSSSSSSSSTTTTTTTTTTTTTTTTTTTTTTTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUVVVVVVVVWWWWWWWWWWWWWWWXXXXXXYYYYYYYYYYYYYYYYYYYYYYYZZZZZZZZZZZZZZZZZZZZZ"/>
+<l:dingbat key="startquote" text="«"/>
+<l:dingbat key="endquote" text="»"/>
+<l:dingbat key="nestedstartquote" text="“"/>
+<l:dingbat key="nestedendquote" text="â€"/>
+<l:dingbat key="singlestartquote" text="‘"/>
+<l:dingbat key="singleendquote" text="’"/>
+<l:dingbat key="bullet" text="•"/>
+<l:gentext key="hyphenation-character" text="-"/>
+<l:gentext key="hyphenation-push-character-count" text="2"/>
+<l:gentext key="hyphenation-remain-character-count" text="2"/>
+<l:context name="styles"><l:template name="person-name" text="first-last"/>
+</l:context>
+<l:context name="title"><l:template name="abstract" text="%t"/>
+<l:template name="acknowledgements" text="%t" lang="en"/>
+<l:template name="answer" text="%t"/>
+<l:template name="appendix" text="Appendice %n. %t"/>
+<l:template name="article" text="%t"/>
+<l:template name="authorblurb" text="%t"/>
+<l:template name="bibliodiv" text="%t"/>
+<l:template name="biblioentry" text="%t"/>
+<l:template name="bibliography" text="%t"/>
+<l:template name="bibliolist" text="%t"/>
+<l:template name="bibliomixed" text="%t"/>
+<l:template name="bibliomset" text="%t"/>
+<l:template name="biblioset" text="%t"/>
+<l:template name="blockquote" text="%t"/>
+<l:template name="book" text="%t"/>
+<l:template name="calloutlist" text="%t"/>
+<l:template name="caution" text="%t"/>
+<l:template name="chapter" text="Capitolo %n. %t"/>
+<l:template name="colophon" text="%t"/>
+<l:template name="dedication" text="%t"/>
+<l:template name="equation" text="Equazione %n. %t"/>
+<l:template name="example" text="Esempio %n. %t"/>
+<l:template name="figure" text="Figura %n. %t"/>
+<l:template name="foil" text="%t"/>
+<l:template name="foilgroup" text="%t"/>
+<l:template name="formalpara" text="%t"/>
+<l:template name="glossary" text="%t"/>
+<l:template name="glossdiv" text="%t"/>
+<l:template name="glosslist" text="%t"/>
+<l:template name="glossentry" text="%t"/>
+<l:template name="important" text="%t"/>
+<l:template name="index" text="%t"/>
+<l:template name="indexdiv" text="%t"/>
+<l:template name="itemizedlist" text="%t"/>
+<l:template name="legalnotice" text="%t"/>
+<l:template name="listitem" text=""/>
+<l:template name="lot" text="%t"/>
+<l:template name="msg" text="%t"/>
+<l:template name="msgexplan" text="%t"/>
+<l:template name="msgmain" text="%t"/>
+<l:template name="msgrel" text="%t"/>
+<l:template name="msgset" text="%t"/>
+<l:template name="msgsub" text="%t"/>
+<l:template name="note" text="%t"/>
+<l:template name="orderedlist" text="%t"/>
+<l:template name="part" text="Parte %n. %t"/>
+<l:template name="partintro" text="%t"/>
+<l:template name="preface" text="%t"/>
+<l:template name="procedure" text="%t"/>
+<l:template name="procedure.formal" text="Procedura %n. %t"/>
+<l:template name="productionset" text="%t"/>
+<l:template name="productionset.formal" text="Produzione %n"/>
+<l:template name="qandadiv" text="%t"/>
+<l:template name="qandaentry" text="%t"/>
+<l:template name="qandaset" text="%t"/>
+<l:template name="question" text="%t"/>
+<l:template name="refentry" text="%t"/>
+<l:template name="reference" text="%t"/>
+<l:template name="refsection" text="%t"/>
+<l:template name="refsect1" text="%t"/>
+<l:template name="refsect2" text="%t"/>
+<l:template name="refsect3" text="%t"/>
+<l:template name="refsynopsisdiv" text="%t"/>
+<l:template name="refsynopsisdivinfo" text="%t"/>
+<l:template name="segmentedlist" text="%t"/>
+<l:template name="set" text="%t"/>
+<l:template name="setindex" text="%t"/>
+<l:template name="sidebar" text="%t"/>
+<l:template name="step" text="%t"/>
+<l:template name="table" text="Tabella %n. %t"/>
+<l:template name="task" text="%t"/>
+<l:template name="tasksummary" text="%t"/>
+<l:template name="taskprerequisites" text="%t"/>
+<l:template name="taskrelated" text="%t"/>
+<l:template name="tip" text="%t"/>
+<l:template name="toc" text="%t"/>
+<l:template name="variablelist" text="%t"/>
+<l:template name="varlistentry" text=""/>
+<l:template name="warning" text="%t"/>
+</l:context>
+<l:context name="title-unnumbered"><l:template name="appendix" text="%t"/>
+<l:template name="article/appendix" text="%t"/>
+<l:template name="bridgehead" text="%t"/>
+<l:template name="chapter" text="%t"/>
+<l:template name="sect1" text="%t"/>
+<l:template name="sect2" text="%t"/>
+<l:template name="sect3" text="%t"/>
+<l:template name="sect4" text="%t"/>
+<l:template name="sect5" text="%t"/>
+<l:template name="section" text="%t"/>
+<l:template name="simplesect" text="%t"/>
+<l:template name="part" text="%t"/>
+</l:context>
+<l:context name="title-numbered"><l:template name="appendix" text="Appendice %n. %t"/>
+<l:template name="article/appendix" text="%n. %t"/>
+<l:template name="bridgehead" text="%n. %t"/>
+<l:template name="chapter" text="Capitolo %n. %t"/>
+<l:template name="part" text="Parte %n. %t"/>
+<l:template name="sect1" text="%n. %t"/>
+<l:template name="sect2" text="%n. %t"/>
+<l:template name="sect3" text="%n. %t"/>
+<l:template name="sect4" text="%n. %t"/>
+<l:template name="sect5" text="%n. %t"/>
+<l:template name="section" text="%n. %t"/>
+<l:template name="simplesect" text="%t"/>
+</l:context>
+<l:context name="subtitle"><l:template name="appendix" text="%s"/>
+<l:template name="acknowledgements" text="%s" lang="en"/>
+<l:template name="article" text="%s"/>
+<l:template name="bibliodiv" text="%s"/>
+<l:template name="biblioentry" text="%s"/>
+<l:template name="bibliography" text="%s"/>
+<l:template name="bibliomixed" text="%s"/>
+<l:template name="bibliomset" text="%s"/>
+<l:template name="biblioset" text="%s"/>
+<l:template name="book" text="%s"/>
+<l:template name="chapter" text="%s"/>
+<l:template name="colophon" text="%s"/>
+<l:template name="dedication" text="%s"/>
+<l:template name="glossary" text="%s"/>
+<l:template name="glossdiv" text="%s"/>
+<l:template name="index" text="%s"/>
+<l:template name="indexdiv" text="%s"/>
+<l:template name="lot" text="%s"/>
+<l:template name="part" text="%s"/>
+<l:template name="partintro" text="%s"/>
+<l:template name="preface" text="%s"/>
+<l:template name="refentry" text="%s"/>
+<l:template name="reference" text="%s"/>
+<l:template name="refsection" text="%s"/>
+<l:template name="refsect1" text="%s"/>
+<l:template name="refsect2" text="%s"/>
+<l:template name="refsect3" text="%s"/>
+<l:template name="refsynopsisdiv" text="%s"/>
+<l:template name="sect1" text="%s"/>
+<l:template name="sect2" text="%s"/>
+<l:template name="sect3" text="%s"/>
+<l:template name="sect4" text="%s"/>
+<l:template name="sect5" text="%s"/>
+<l:template name="section" text="%s"/>
+<l:template name="set" text="%s"/>
+<l:template name="setindex" text="%s"/>
+<l:template name="sidebar" text="%s"/>
+<l:template name="simplesect" text="%s"/>
+<l:template name="toc" text="%s"/>
+</l:context>
+<l:context name="xref"><l:template name="abstract" text="%t"/>
+<l:template name="acknowledgements" text="%t" lang="en"/>
+<l:template name="answer" text="Risposta: %n"/>
+<l:template name="appendix" text="%t"/>
+<l:template name="article" text="%t"/>
+<l:template name="authorblurb" text="%t"/>
+<l:template name="bibliodiv" text="%t"/>
+<l:template name="bibliography" text="%t"/>
+<l:template name="bibliomset" text="%t"/>
+<l:template name="biblioset" text="%t"/>
+<l:template name="blockquote" text="%t"/>
+<l:template name="book" text="%t"/>
+<l:template name="calloutlist" text="%t"/>
+<l:template name="caution" text="%t"/>
+<l:template name="chapter" text="%t"/>
+<l:template name="colophon" text="%t"/>
+<l:template name="constraintdef" text="%t"/>
+<l:template name="dedication" text="%t"/>
+<l:template name="equation" text="%t"/>
+<l:template name="example" text="%t"/>
+<l:template name="figure" text="%t"/>
+<l:template name="foil" text="%t"/>
+<l:template name="foilgroup" text="%t"/>
+<l:template name="formalpara" text="%t"/>
+<l:template name="glossary" text="%t"/>
+<l:template name="glossdiv" text="%t"/>
+<l:template name="important" text="%t"/>
+<l:template name="index" text="%t"/>
+<l:template name="indexdiv" text="%t"/>
+<l:template name="itemizedlist" text="%t"/>
+<l:template name="legalnotice" text="%t"/>
+<l:template name="listitem" text="%n"/>
+<l:template name="lot" text="%t"/>
+<l:template name="msg" text="%t"/>
+<l:template name="msgexplan" text="%t"/>
+<l:template name="msgmain" text="%t"/>
+<l:template name="msgrel" text="%t"/>
+<l:template name="msgset" text="%t"/>
+<l:template name="msgsub" text="%t"/>
+<l:template name="note" text="%t"/>
+<l:template name="orderedlist" text="%t"/>
+<l:template name="part" text="%t"/>
+<l:template name="partintro" text="%t"/>
+<l:template name="preface" text="%t"/>
+<l:template name="procedure" text="%t"/>
+<l:template name="productionset" text="%t"/>
+<l:template name="qandadiv" text="%t"/>
+<l:template name="qandaentry" text="Domanda: %n"/>
+<l:template name="qandaset" text="%t"/>
+<l:template name="question" text="Domanda: %n"/>
+<l:template name="reference" text="%t"/>
+<l:template name="refsynopsisdiv" text="%t"/>
+<l:template name="segmentedlist" text="%t"/>
+<l:template name="set" text="%t"/>
+<l:template name="setindex" text="%t"/>
+<l:template name="sidebar" text="%t"/>
+<l:template name="table" text="%t"/>
+<l:template name="task" text="%t"/>
+<l:template name="tip" text="%t"/>
+<l:template name="toc" text="%t"/>
+<l:template name="variablelist" text="%t"/>
+<l:template name="varlistentry" text="%n"/>
+<l:template name="warning" text="%t"/>
+<l:template name="olink.document.citation" text=" in %o"/>
+<l:template name="olink.page.citation" text=" (pagina %p)"/>
+<l:template name="page.citation" text=" [%p]"/>
+<l:template name="page" text="(pagina %p)"/>
+<l:template name="docname" text=" in %o"/>
+<l:template name="docnamelong" text=" nel documento dal titolo %o"/>
+<l:template name="pageabbrev" text="(p. %p)"/>
+<l:template name="Page" text="Pagina %p"/>
+<l:template name="bridgehead" text="sezione chiamata «%t»"/>
+<l:template name="refsection" text="sezione chiamata «%t»"/>
+<l:template name="refsect1" text="sezione chiamata «%t»"/>
+<l:template name="refsect2" text="sezione chiamata «%t»"/>
+<l:template name="refsect3" text="sezione chiamata «%t»"/>
+<l:template name="sect1" text="sezione chiamata «%t»"/>
+<l:template name="sect2" text="sezione chiamata «%t»"/>
+<l:template name="sect3" text="sezione chiamata «%t»"/>
+<l:template name="sect4" text="sezione chiamata «%t»"/>
+<l:template name="sect5" text="sezione chiamata «%t»"/>
+<l:template name="section" text="sezione chiamata «%t»"/>
+<l:template name="simplesect" text="sezione chiamata «%t»"/>
+</l:context>
+<l:context name="xref-number"><l:template name="answer" text="Risposta: %n"/>
+<l:template name="appendix" text="Appendice %n"/>
+<l:template name="bridgehead" text="Sezione %n"/>
+<l:template name="chapter" text="Capitolo %n"/>
+<l:template name="equation" text="Equazione %n"/>
+<l:template name="example" text="Esempio %n"/>
+<l:template name="figure" text="Figura %n"/>
+<l:template name="part" text="Parte %n"/>
+<l:template name="procedure" text="Procedura %n"/>
+<l:template name="productionset" text="Produzione %n"/>
+<l:template name="qandadiv" text="Domande e risposte %n"/>
+<l:template name="qandaentry" text="Domanda: %n"/>
+<l:template name="question" text="Domanda: %n"/>
+<l:template name="sect1" text="Sezione %n"/>
+<l:template name="sect2" text="Sezione %n"/>
+<l:template name="sect3" text="Sezione %n"/>
+<l:template name="sect4" text="Sezione %n"/>
+<l:template name="sect5" text="Sezione %n"/>
+<l:template name="section" text="Sezione %n"/>
+<l:template name="table" text="Tabella %n"/>
+</l:context>
+<l:context name="xref-number-and-title"><l:template name="appendix" text="Appendice %n, %t"/>
+<l:template name="bridgehead" text="Sezione %n, «%t»"/>
+<l:template name="chapter" text="Capitolo %n, %t"/>
+<l:template name="equation" text="Equazione %n, «%t»"/>
+<l:template name="example" text="Esempio %n, «%t»"/>
+<l:template name="figure" text="Figura %n, «%t»"/>
+<l:template name="part" text="Parte %n, «%t»"/>
+<l:template name="procedure" text="Procedura %n, «%t»"/>
+<l:template name="productionset" text="Produzione %n, «%t»"/>
+<l:template name="qandadiv" text="Domande e risposte %n, «%t»"/>
+<l:template name="refsect1" text="sezione chiamata «%t»"/>
+<l:template name="refsect2" text="sezione chiamata «%t»"/>
+<l:template name="refsect3" text="sezione chiamata «%t»"/>
+<l:template name="refsection" text="sezione chiamata «%t»"/>
+<l:template name="sect1" text="Sezione %n, «%t»"/>
+<l:template name="sect2" text="Sezione %n, «%t»"/>
+<l:template name="sect3" text="Sezione %n, «%t»"/>
+<l:template name="sect4" text="Sezione %n, «%t»"/>
+<l:template name="sect5" text="Sezione %n, «%t»"/>
+<l:template name="section" text="Sezione %n, «%t»"/>
+<l:template name="simplesect" text="sezione chiamata «%t»"/>
+<l:template name="table" text="Tabella %n, «%t»"/>
+</l:context>
+<l:context name="authorgroup"><l:template name="sep" text=", "/>
+<l:template name="sep2" text=" e "/>
+<l:template name="seplast" text=", e "/>
+</l:context>
+<l:context name="glossary"><l:template name="see" text="Vedi %t."/>
+<l:template name="seealso" text="Vedi anche %t."/>
+<l:template name="seealso-separator" text=", "/>
+</l:context>
+<l:context name="msgset"><l:template name="MsgAud" text="Pubblico: "/>
+<l:template name="MsgLevel" text="Livello: "/>
+<l:template name="MsgOrig" text="Origine: "/>
+</l:context>
+<l:context name="datetime"><l:template name="format" text="d/m/Y"/>
+</l:context>
+<l:context name="termdef"><l:template name="prefix" text="[Definizione: "/>
+<l:template name="suffix" text="]"/>
+</l:context>
+<l:context name="datetime-full"><l:template name="January" text="gennaio"/>
+<l:template name="February" text="febbraio"/>
+<l:template name="March" text="marzo"/>
+<l:template name="April" text="aprile"/>
+<l:template name="May" text="maggio"/>
+<l:template name="June" text="giugno"/>
+<l:template name="July" text="luglio"/>
+<l:template name="August" text="agosto"/>
+<l:template name="September" text="settembre"/>
+<l:template name="October" text="ottobre"/>
+<l:template name="November" text="novembre"/>
+<l:template name="December" text="dicembre"/>
+<l:template name="Monday" text="lunedì"/>
+<l:template name="Tuesday" text="martedì"/>
+<l:template name="Wednesday" text="mercoledì"/>
+<l:template name="Thursday" text="giovedì"/>
+<l:template name="Friday" text="venerdì"/>
+<l:template name="Saturday" text="sabato"/>
+<l:template name="Sunday" text="domenica"/>
+</l:context>
+<l:context name="datetime-abbrev"><l:template name="Jan" text="gen"/>
+<l:template name="Feb" text="feb"/>
+<l:template name="Mar" text="mar"/>
+<l:template name="Apr" text="apr"/>
+<l:template name="May" text="mag"/>
+<l:template name="Jun" text="giu"/>
+<l:template name="Jul" text="lug"/>
+<l:template name="Aug" text="ago"/>
+<l:template name="Sep" text="set"/>
+<l:template name="Oct" text="ott"/>
+<l:template name="Nov" text="nov"/>
+<l:template name="Dec" text="dic"/>
+<l:template name="Mon" text="lun"/>
+<l:template name="Tue" text="mar"/>
+<l:template name="Wed" text="mer"/>
+<l:template name="Thu" text="gio"/>
+<l:template name="Fri" text="ven"/>
+<l:template name="Sat" text="sab"/>
+<l:template name="Sun" text="dom"/>
+</l:context>
+<l:context name="htmlhelp"><l:template name="langcode" text="0x0410 Italian"/>
+</l:context>
+<l:context name="index"><l:template name="term-separator" text=", "/>
+<l:template name="number-separator" text=", "/>
+<l:template name="range-separator" text="-"/>
+</l:context>
+<l:context name="iso690"><l:template name="lastfirst.sep" text=", "/>
+<l:template name="alt.person.two.sep" text=" – "/>
+<l:template name="alt.person.last.sep" text=" – "/>
+<l:template name="alt.person.more.sep" text=" – "/>
+<l:template name="primary.editor" text=" (ed.)"/>
+<l:template name="primary.many" text=", et al."/>
+<l:template name="primary.sep" text=". "/>
+<l:template name="submaintitle.sep" text=": "/>
+<l:template name="title.sep" text=". "/>
+<l:template name="othertitle.sep" text=", "/>
+<l:template name="medium1" text=" ["/>
+<l:template name="medium2" text="]"/>
+<l:template name="secondary.person.sep" text="; "/>
+<l:template name="secondary.sep" text=". "/>
+<l:template name="respons.sep" text=". "/>
+<l:template name="edition.sep" text=". "/>
+<l:template name="edition.serial.sep" text=", "/>
+<l:template name="issuing.range" text="-"/>
+<l:template name="issuing.div" text=", "/>
+<l:template name="issuing.sep" text=". "/>
+<l:template name="partnr.sep" text=". "/>
+<l:template name="placepubl.sep" text=": "/>
+<l:template name="publyear.sep" text=", "/>
+<l:template name="pubinfo.sep" text=". "/>
+<l:template name="spec.pubinfo.sep" text=", "/>
+<l:template name="upd.sep" text=", "/>
+<l:template name="datecit1" text=" [cit.: "/>
+<l:template name="datecit2" text="]"/>
+<l:template name="extent.sep" text=". "/>
+<l:template name="locs.sep" text=", "/>
+<l:template name="location.sep" text=". "/>
+<l:template name="serie.sep" text=". "/>
+<l:template name="notice.sep" text=". "/>
+<l:template name="access" text="Disponibile "/>
+<l:template name="acctoo" text="Disponibile anche "/>
+<l:template name="onwww" text="sul Web"/>
+<l:template name="oninet" text="su Internet"/>
+<l:template name="access.end" text=": "/>
+<l:template name="link1" text="&lt;"/>
+<l:template name="link2" text="&gt;"/>
+<l:template name="access.sep" text=". "/>
+<l:template name="isbn" text="ISBN "/>
+<l:template name="issn" text="ISSN "/>
+<l:template name="stdnum.sep" text=". "/>
+<l:template name="patcountry.sep" text=". "/>
+<l:template name="pattype.sep" text=", "/>
+<l:template name="patnum.sep" text=". "/>
+<l:template name="patdate.sep" text=". "/>
+</l:context><l:letters><l:l i="-1"/>
+<l:l i="0">Simboli</l:l>
+<l:l i="10">A</l:l>
+<l:l i="10">a</l:l>
+<l:l i="10">À</l:l>
+<l:l i="10">à</l:l>
+<l:l i="10">Ã</l:l>
+<l:l i="10">á</l:l>
+<l:l i="10">Â</l:l>
+<l:l i="10">â</l:l>
+<l:l i="10">Ã</l:l>
+<l:l i="10">ã</l:l>
+<l:l i="10">Ä</l:l>
+<l:l i="10">ä</l:l>
+<l:l i="10">Ã…</l:l>
+<l:l i="10">Ã¥</l:l>
+<l:l i="10">Ä€</l:l>
+<l:l i="10">Ä</l:l>
+<l:l i="10">Ä‚</l:l>
+<l:l i="10">ă</l:l>
+<l:l i="10">Ä„</l:l>
+<l:l i="10">Ä…</l:l>
+<l:l i="10">Ç</l:l>
+<l:l i="10">ÇŽ</l:l>
+<l:l i="10">Çž</l:l>
+<l:l i="10">ÇŸ</l:l>
+<l:l i="10">Ç </l:l>
+<l:l i="10">Ç¡</l:l>
+<l:l i="10">Ǻ</l:l>
+<l:l i="10">Ç»</l:l>
+<l:l i="10">È€</l:l>
+<l:l i="10">È</l:l>
+<l:l i="10">È‚</l:l>
+<l:l i="10">ȃ</l:l>
+<l:l i="10">Ȧ</l:l>
+<l:l i="10">ȧ</l:l>
+<l:l i="10">Ḁ</l:l>
+<l:l i="10">á¸</l:l>
+<l:l i="10">ẚ</l:l>
+<l:l i="10">Ạ</l:l>
+<l:l i="10">ạ</l:l>
+<l:l i="10">Ả</l:l>
+<l:l i="10">ả</l:l>
+<l:l i="10">Ấ</l:l>
+<l:l i="10">ấ</l:l>
+<l:l i="10">Ầ</l:l>
+<l:l i="10">ầ</l:l>
+<l:l i="10">Ẩ</l:l>
+<l:l i="10">ẩ</l:l>
+<l:l i="10">Ẫ</l:l>
+<l:l i="10">ẫ</l:l>
+<l:l i="10">Ậ</l:l>
+<l:l i="10">ậ</l:l>
+<l:l i="10">Ắ</l:l>
+<l:l i="10">ắ</l:l>
+<l:l i="10">Ằ</l:l>
+<l:l i="10">ằ</l:l>
+<l:l i="10">Ẳ</l:l>
+<l:l i="10">ẳ</l:l>
+<l:l i="10">Ẵ</l:l>
+<l:l i="10">ẵ</l:l>
+<l:l i="10">Ặ</l:l>
+<l:l i="10">ặ</l:l>
+<l:l i="20">B</l:l>
+<l:l i="20">b</l:l>
+<l:l i="20">Æ€</l:l>
+<l:l i="20">Æ</l:l>
+<l:l i="20">É“</l:l>
+<l:l i="20">Æ‚</l:l>
+<l:l i="20">ƃ</l:l>
+<l:l i="20">Ḃ</l:l>
+<l:l i="20">ḃ</l:l>
+<l:l i="20">Ḅ</l:l>
+<l:l i="20">ḅ</l:l>
+<l:l i="20">Ḇ</l:l>
+<l:l i="20">ḇ</l:l>
+<l:l i="30">C</l:l>
+<l:l i="30">c</l:l>
+<l:l i="30">Ç</l:l>
+<l:l i="30">ç</l:l>
+<l:l i="30">Ć</l:l>
+<l:l i="30">ć</l:l>
+<l:l i="30">Ĉ</l:l>
+<l:l i="30">ĉ</l:l>
+<l:l i="30">ÄŠ</l:l>
+<l:l i="30">Ä‹</l:l>
+<l:l i="30">Č</l:l>
+<l:l i="30">Ä</l:l>
+<l:l i="30">Ƈ</l:l>
+<l:l i="30">ƈ</l:l>
+<l:l i="30">É•</l:l>
+<l:l i="30">Ḉ</l:l>
+<l:l i="30">ḉ</l:l>
+<l:l i="40">D</l:l>
+<l:l i="40">d</l:l>
+<l:l i="40">ÄŽ</l:l>
+<l:l i="40">Ä</l:l>
+<l:l i="40">Ä</l:l>
+<l:l i="40">Ä‘</l:l>
+<l:l i="40">ÆŠ</l:l>
+<l:l i="40">É—</l:l>
+<l:l i="40">Æ‹</l:l>
+<l:l i="40">ƌ</l:l>
+<l:l i="40">Ç…</l:l>
+<l:l i="40">Dz</l:l>
+<l:l i="40">È¡</l:l>
+<l:l i="40">É–</l:l>
+<l:l i="40">Ḋ</l:l>
+<l:l i="40">ḋ</l:l>
+<l:l i="40">Ḍ</l:l>
+<l:l i="40">á¸</l:l>
+<l:l i="40">Ḏ</l:l>
+<l:l i="40">á¸</l:l>
+<l:l i="40">á¸</l:l>
+<l:l i="40">ḑ</l:l>
+<l:l i="40">Ḓ</l:l>
+<l:l i="40">ḓ</l:l>
+<l:l i="50">E</l:l>
+<l:l i="50">e</l:l>
+<l:l i="50">È</l:l>
+<l:l i="50">è</l:l>
+<l:l i="50">É</l:l>
+<l:l i="50">é</l:l>
+<l:l i="50">Ê</l:l>
+<l:l i="50">ê</l:l>
+<l:l i="50">Ë</l:l>
+<l:l i="50">ë</l:l>
+<l:l i="50">Ä’</l:l>
+<l:l i="50">Ä“</l:l>
+<l:l i="50">Ä”</l:l>
+<l:l i="50">Ä•</l:l>
+<l:l i="50">Ä–</l:l>
+<l:l i="50">Ä—</l:l>
+<l:l i="50">Ę</l:l>
+<l:l i="50">Ä™</l:l>
+<l:l i="50">Äš</l:l>
+<l:l i="50">Ä›</l:l>
+<l:l i="50">È„</l:l>
+<l:l i="50">È…</l:l>
+<l:l i="50">Ȇ</l:l>
+<l:l i="50">ȇ</l:l>
+<l:l i="50">Ȩ</l:l>
+<l:l i="50">È©</l:l>
+<l:l i="50">Ḕ</l:l>
+<l:l i="50">ḕ</l:l>
+<l:l i="50">Ḗ</l:l>
+<l:l i="50">ḗ</l:l>
+<l:l i="50">Ḙ</l:l>
+<l:l i="50">ḙ</l:l>
+<l:l i="50">Ḛ</l:l>
+<l:l i="50">ḛ</l:l>
+<l:l i="50">Ḝ</l:l>
+<l:l i="50">á¸</l:l>
+<l:l i="50">Ẹ</l:l>
+<l:l i="50">ẹ</l:l>
+<l:l i="50">Ẻ</l:l>
+<l:l i="50">ẻ</l:l>
+<l:l i="50">Ẽ</l:l>
+<l:l i="50">ẽ</l:l>
+<l:l i="50">Ế</l:l>
+<l:l i="50">ế</l:l>
+<l:l i="50">Ề</l:l>
+<l:l i="50">á»</l:l>
+<l:l i="50">Ể</l:l>
+<l:l i="50">ể</l:l>
+<l:l i="50">Ễ</l:l>
+<l:l i="50">á»…</l:l>
+<l:l i="50">Ệ</l:l>
+<l:l i="50">ệ</l:l>
+<l:l i="60">F</l:l>
+<l:l i="60">f</l:l>
+<l:l i="60">Æ‘</l:l>
+<l:l i="60">Æ’</l:l>
+<l:l i="60">Ḟ</l:l>
+<l:l i="60">ḟ</l:l>
+<l:l i="70">G</l:l>
+<l:l i="70">g</l:l>
+<l:l i="70">Ĝ</l:l>
+<l:l i="70">Ä</l:l>
+<l:l i="70">Äž</l:l>
+<l:l i="70">ÄŸ</l:l>
+<l:l i="70">Ä </l:l>
+<l:l i="70">Ä¡</l:l>
+<l:l i="70">Ä¢</l:l>
+<l:l i="70">Ä£</l:l>
+<l:l i="70">Æ“</l:l>
+<l:l i="70">É </l:l>
+<l:l i="70">Ǥ</l:l>
+<l:l i="70">Ç¥</l:l>
+<l:l i="70">Ǧ</l:l>
+<l:l i="70">ǧ</l:l>
+<l:l i="70">Ç´</l:l>
+<l:l i="70">ǵ</l:l>
+<l:l i="70">Ḡ</l:l>
+<l:l i="70">ḡ</l:l>
+<l:l i="80">H</l:l>
+<l:l i="80">h</l:l>
+<l:l i="80">Ĥ</l:l>
+<l:l i="80">Ä¥</l:l>
+<l:l i="80">Ħ</l:l>
+<l:l i="80">ħ</l:l>
+<l:l i="80">Èž</l:l>
+<l:l i="80">ÈŸ</l:l>
+<l:l i="80">ɦ</l:l>
+<l:l i="80">Ḣ</l:l>
+<l:l i="80">ḣ</l:l>
+<l:l i="80">Ḥ</l:l>
+<l:l i="80">ḥ</l:l>
+<l:l i="80">Ḧ</l:l>
+<l:l i="80">ḧ</l:l>
+<l:l i="80">Ḩ</l:l>
+<l:l i="80">ḩ</l:l>
+<l:l i="80">Ḫ</l:l>
+<l:l i="80">ḫ</l:l>
+<l:l i="80">ẖ</l:l>
+<l:l i="90">I</l:l>
+<l:l i="90">i</l:l>
+<l:l i="90">Ì</l:l>
+<l:l i="90">ì</l:l>
+<l:l i="90">Ã</l:l>
+<l:l i="90">í</l:l>
+<l:l i="90">ÃŽ</l:l>
+<l:l i="90">î</l:l>
+<l:l i="90">Ã</l:l>
+<l:l i="90">ï</l:l>
+<l:l i="90">Ĩ</l:l>
+<l:l i="90">Ä©</l:l>
+<l:l i="90">Ī</l:l>
+<l:l i="90">Ä«</l:l>
+<l:l i="90">Ĭ</l:l>
+<l:l i="90">Ä­</l:l>
+<l:l i="90">Ä®</l:l>
+<l:l i="90">į</l:l>
+<l:l i="90">Ä°</l:l>
+<l:l i="90">Æ—</l:l>
+<l:l i="90">ɨ</l:l>
+<l:l i="90">Ç</l:l>
+<l:l i="90">Ç</l:l>
+<l:l i="90">Ȉ</l:l>
+<l:l i="90">ȉ</l:l>
+<l:l i="90">ÈŠ</l:l>
+<l:l i="90">È‹</l:l>
+<l:l i="90">Ḭ</l:l>
+<l:l i="90">ḭ</l:l>
+<l:l i="90">Ḯ</l:l>
+<l:l i="90">ḯ</l:l>
+<l:l i="90">Ỉ</l:l>
+<l:l i="90">ỉ</l:l>
+<l:l i="90">Ị</l:l>
+<l:l i="90">ị</l:l>
+<l:l i="100">J</l:l>
+<l:l i="100">j</l:l>
+<l:l i="100">Ä´</l:l>
+<l:l i="100">ĵ</l:l>
+<l:l i="100">Ç°</l:l>
+<l:l i="100">Ê</l:l>
+<l:l i="110">K</l:l>
+<l:l i="110">k</l:l>
+<l:l i="110">Ķ</l:l>
+<l:l i="110">Ä·</l:l>
+<l:l i="110">Ƙ</l:l>
+<l:l i="110">Æ™</l:l>
+<l:l i="110">Ǩ</l:l>
+<l:l i="110">Ç©</l:l>
+<l:l i="110">Ḱ</l:l>
+<l:l i="110">ḱ</l:l>
+<l:l i="110">Ḳ</l:l>
+<l:l i="110">ḳ</l:l>
+<l:l i="110">Ḵ</l:l>
+<l:l i="110">ḵ</l:l>
+<l:l i="120">L</l:l>
+<l:l i="120">l</l:l>
+<l:l i="120">Ĺ</l:l>
+<l:l i="120">ĺ</l:l>
+<l:l i="120">Ä»</l:l>
+<l:l i="120">ļ</l:l>
+<l:l i="120">Ľ</l:l>
+<l:l i="120">ľ</l:l>
+<l:l i="120">Ä¿</l:l>
+<l:l i="120">Å€</l:l>
+<l:l i="120">Å</l:l>
+<l:l i="120">Å‚</l:l>
+<l:l i="120">Æš</l:l>
+<l:l i="120">Lj</l:l>
+<l:l i="120">È´</l:l>
+<l:l i="120">É«</l:l>
+<l:l i="120">ɬ</l:l>
+<l:l i="120">É­</l:l>
+<l:l i="120">Ḷ</l:l>
+<l:l i="120">ḷ</l:l>
+<l:l i="120">Ḹ</l:l>
+<l:l i="120">ḹ</l:l>
+<l:l i="120">Ḻ</l:l>
+<l:l i="120">ḻ</l:l>
+<l:l i="120">Ḽ</l:l>
+<l:l i="120">ḽ</l:l>
+<l:l i="130">M</l:l>
+<l:l i="130">m</l:l>
+<l:l i="130">ɱ</l:l>
+<l:l i="130">Ḿ</l:l>
+<l:l i="130">ḿ</l:l>
+<l:l i="130">á¹€</l:l>
+<l:l i="130">á¹</l:l>
+<l:l i="130">Ṃ</l:l>
+<l:l i="130">ṃ</l:l>
+<l:l i="140">N</l:l>
+<l:l i="140">n</l:l>
+<l:l i="140">Ñ</l:l>
+<l:l i="140">ñ</l:l>
+<l:l i="140">Ń</l:l>
+<l:l i="140">Å„</l:l>
+<l:l i="140">Å…</l:l>
+<l:l i="140">ņ</l:l>
+<l:l i="140">Ň</l:l>
+<l:l i="140">ň</l:l>
+<l:l i="140">Æ</l:l>
+<l:l i="140">ɲ</l:l>
+<l:l i="140">Æž</l:l>
+<l:l i="140">È </l:l>
+<l:l i="140">Ç‹</l:l>
+<l:l i="140">Ǹ</l:l>
+<l:l i="140">ǹ</l:l>
+<l:l i="140">ȵ</l:l>
+<l:l i="140">ɳ</l:l>
+<l:l i="140">Ṅ</l:l>
+<l:l i="140">á¹…</l:l>
+<l:l i="140">Ṇ</l:l>
+<l:l i="140">ṇ</l:l>
+<l:l i="140">Ṉ</l:l>
+<l:l i="140">ṉ</l:l>
+<l:l i="140">Ṋ</l:l>
+<l:l i="140">ṋ</l:l>
+<l:l i="150">O</l:l>
+<l:l i="150">o</l:l>
+<l:l i="150">Ã’</l:l>
+<l:l i="150">ò</l:l>
+<l:l i="150">Ó</l:l>
+<l:l i="150">ó</l:l>
+<l:l i="150">Ô</l:l>
+<l:l i="150">ô</l:l>
+<l:l i="150">Õ</l:l>
+<l:l i="150">õ</l:l>
+<l:l i="150">Ö</l:l>
+<l:l i="150">ö</l:l>
+<l:l i="150">Ø</l:l>
+<l:l i="150">ø</l:l>
+<l:l i="150">Ō</l:l>
+<l:l i="150">Å</l:l>
+<l:l i="150">ÅŽ</l:l>
+<l:l i="150">Å</l:l>
+<l:l i="150">Å</l:l>
+<l:l i="150">Å‘</l:l>
+<l:l i="150">ÆŸ</l:l>
+<l:l i="150">Æ </l:l>
+<l:l i="150">Æ¡</l:l>
+<l:l i="150">Ç‘</l:l>
+<l:l i="150">Ç’</l:l>
+<l:l i="150">Ǫ</l:l>
+<l:l i="150">Ç«</l:l>
+<l:l i="150">Ǭ</l:l>
+<l:l i="150">Ç­</l:l>
+<l:l i="150">Ǿ</l:l>
+<l:l i="150">Ç¿</l:l>
+<l:l i="150">Ȍ</l:l>
+<l:l i="150">È</l:l>
+<l:l i="150">ÈŽ</l:l>
+<l:l i="150">È</l:l>
+<l:l i="150">Ȫ</l:l>
+<l:l i="150">È«</l:l>
+<l:l i="150">Ȭ</l:l>
+<l:l i="150">È­</l:l>
+<l:l i="150">È®</l:l>
+<l:l i="150">ȯ</l:l>
+<l:l i="150">È°</l:l>
+<l:l i="150">ȱ</l:l>
+<l:l i="150">Ṍ</l:l>
+<l:l i="150">á¹</l:l>
+<l:l i="150">Ṏ</l:l>
+<l:l i="150">á¹</l:l>
+<l:l i="150">á¹</l:l>
+<l:l i="150">ṑ</l:l>
+<l:l i="150">á¹’</l:l>
+<l:l i="150">ṓ</l:l>
+<l:l i="150">Ọ</l:l>
+<l:l i="150">á»</l:l>
+<l:l i="150">Ỏ</l:l>
+<l:l i="150">á»</l:l>
+<l:l i="150">á»</l:l>
+<l:l i="150">ố</l:l>
+<l:l i="150">á»’</l:l>
+<l:l i="150">ồ</l:l>
+<l:l i="150">á»”</l:l>
+<l:l i="150">ổ</l:l>
+<l:l i="150">á»–</l:l>
+<l:l i="150">á»—</l:l>
+<l:l i="150">Ộ</l:l>
+<l:l i="150">á»™</l:l>
+<l:l i="150">Ớ</l:l>
+<l:l i="150">á»›</l:l>
+<l:l i="150">Ờ</l:l>
+<l:l i="150">á»</l:l>
+<l:l i="150">Ở</l:l>
+<l:l i="150">ở</l:l>
+<l:l i="150">á» </l:l>
+<l:l i="150">ỡ</l:l>
+<l:l i="150">Ợ</l:l>
+<l:l i="150">ợ</l:l>
+<l:l i="160">P</l:l>
+<l:l i="160">p</l:l>
+<l:l i="160">Ƥ</l:l>
+<l:l i="160">Æ¥</l:l>
+<l:l i="160">á¹”</l:l>
+<l:l i="160">ṕ</l:l>
+<l:l i="160">á¹–</l:l>
+<l:l i="160">á¹—</l:l>
+<l:l i="170">Q</l:l>
+<l:l i="170">q</l:l>
+<l:l i="170">Ê </l:l>
+<l:l i="180">R</l:l>
+<l:l i="180">r</l:l>
+<l:l i="180">Å”</l:l>
+<l:l i="180">Å•</l:l>
+<l:l i="180">Å–</l:l>
+<l:l i="180">Å—</l:l>
+<l:l i="180">Ř</l:l>
+<l:l i="180">Å™</l:l>
+<l:l i="180">È</l:l>
+<l:l i="180">È‘</l:l>
+<l:l i="180">È’</l:l>
+<l:l i="180">È“</l:l>
+<l:l i="180">ɼ</l:l>
+<l:l i="180">ɽ</l:l>
+<l:l i="180">ɾ</l:l>
+<l:l i="180">Ṙ</l:l>
+<l:l i="180">á¹™</l:l>
+<l:l i="180">Ṛ</l:l>
+<l:l i="180">á¹›</l:l>
+<l:l i="180">Ṝ</l:l>
+<l:l i="180">á¹</l:l>
+<l:l i="180">Ṟ</l:l>
+<l:l i="180">ṟ</l:l>
+<l:l i="190">S</l:l>
+<l:l i="190">s</l:l>
+<l:l i="190">Åš</l:l>
+<l:l i="190">Å›</l:l>
+<l:l i="190">Ŝ</l:l>
+<l:l i="190">Å</l:l>
+<l:l i="190">Åž</l:l>
+<l:l i="190">ÅŸ</l:l>
+<l:l i="190">Å </l:l>
+<l:l i="190">Å¡</l:l>
+<l:l i="190">Ș</l:l>
+<l:l i="190">È™</l:l>
+<l:l i="190">Ê‚</l:l>
+<l:l i="190">á¹ </l:l>
+<l:l i="190">ṡ</l:l>
+<l:l i="190">á¹¢</l:l>
+<l:l i="190">á¹£</l:l>
+<l:l i="190">Ṥ</l:l>
+<l:l i="190">á¹¥</l:l>
+<l:l i="190">Ṧ</l:l>
+<l:l i="190">ṧ</l:l>
+<l:l i="190">Ṩ</l:l>
+<l:l i="190">ṩ</l:l>
+<l:l i="200">T</l:l>
+<l:l i="200">t</l:l>
+<l:l i="200">Å¢</l:l>
+<l:l i="200">Å£</l:l>
+<l:l i="200">Ť</l:l>
+<l:l i="200">Å¥</l:l>
+<l:l i="200">Ŧ</l:l>
+<l:l i="200">ŧ</l:l>
+<l:l i="200">Æ«</l:l>
+<l:l i="200">Ƭ</l:l>
+<l:l i="200">Æ­</l:l>
+<l:l i="200">Æ®</l:l>
+<l:l i="200">ʈ</l:l>
+<l:l i="200">Èš</l:l>
+<l:l i="200">È›</l:l>
+<l:l i="200">ȶ</l:l>
+<l:l i="200">Ṫ</l:l>
+<l:l i="200">ṫ</l:l>
+<l:l i="200">Ṭ</l:l>
+<l:l i="200">á¹­</l:l>
+<l:l i="200">á¹®</l:l>
+<l:l i="200">ṯ</l:l>
+<l:l i="200">á¹°</l:l>
+<l:l i="200">á¹±</l:l>
+<l:l i="200">ẗ</l:l>
+<l:l i="210">U</l:l>
+<l:l i="210">u</l:l>
+<l:l i="210">Ù</l:l>
+<l:l i="210">ù</l:l>
+<l:l i="210">Ú</l:l>
+<l:l i="210">ú</l:l>
+<l:l i="210">Û</l:l>
+<l:l i="210">û</l:l>
+<l:l i="210">Ü</l:l>
+<l:l i="210">ü</l:l>
+<l:l i="210">Ũ</l:l>
+<l:l i="210">Å©</l:l>
+<l:l i="210">Ū</l:l>
+<l:l i="210">Å«</l:l>
+<l:l i="210">Ŭ</l:l>
+<l:l i="210">Å­</l:l>
+<l:l i="210">Å®</l:l>
+<l:l i="210">ů</l:l>
+<l:l i="210">Å°</l:l>
+<l:l i="210">ű</l:l>
+<l:l i="210">Ų</l:l>
+<l:l i="210">ų</l:l>
+<l:l i="210">Ư</l:l>
+<l:l i="210">Æ°</l:l>
+<l:l i="210">Ç“</l:l>
+<l:l i="210">Ç”</l:l>
+<l:l i="210">Ç•</l:l>
+<l:l i="210">Ç–</l:l>
+<l:l i="210">Ç—</l:l>
+<l:l i="210">ǘ</l:l>
+<l:l i="210">Ç™</l:l>
+<l:l i="210">Çš</l:l>
+<l:l i="210">Ç›</l:l>
+<l:l i="210">ǜ</l:l>
+<l:l i="210">È”</l:l>
+<l:l i="210">È•</l:l>
+<l:l i="210">È–</l:l>
+<l:l i="210">È—</l:l>
+<l:l i="210">á¹²</l:l>
+<l:l i="210">á¹³</l:l>
+<l:l i="210">á¹´</l:l>
+<l:l i="210">á¹µ</l:l>
+<l:l i="210">Ṷ</l:l>
+<l:l i="210">á¹·</l:l>
+<l:l i="210">Ṹ</l:l>
+<l:l i="210">á¹¹</l:l>
+<l:l i="210">Ṻ</l:l>
+<l:l i="210">á¹»</l:l>
+<l:l i="210">Ụ</l:l>
+<l:l i="210">ụ</l:l>
+<l:l i="210">Ủ</l:l>
+<l:l i="210">ủ</l:l>
+<l:l i="210">Ứ</l:l>
+<l:l i="210">ứ</l:l>
+<l:l i="210">Ừ</l:l>
+<l:l i="210">ừ</l:l>
+<l:l i="210">Ử</l:l>
+<l:l i="210">á»­</l:l>
+<l:l i="210">á»®</l:l>
+<l:l i="210">ữ</l:l>
+<l:l i="210">á»°</l:l>
+<l:l i="210">á»±</l:l>
+<l:l i="220">V</l:l>
+<l:l i="220">v</l:l>
+<l:l i="220">Ʋ</l:l>
+<l:l i="220">Ê‹</l:l>
+<l:l i="220">á¹¼</l:l>
+<l:l i="220">á¹½</l:l>
+<l:l i="220">á¹¾</l:l>
+<l:l i="220">ṿ</l:l>
+<l:l i="230">W</l:l>
+<l:l i="230">w</l:l>
+<l:l i="230">Å´</l:l>
+<l:l i="230">ŵ</l:l>
+<l:l i="230">Ẁ</l:l>
+<l:l i="230">áº</l:l>
+<l:l i="230">Ẃ</l:l>
+<l:l i="230">ẃ</l:l>
+<l:l i="230">Ẅ</l:l>
+<l:l i="230">ẅ</l:l>
+<l:l i="230">Ẇ</l:l>
+<l:l i="230">ẇ</l:l>
+<l:l i="230">Ẉ</l:l>
+<l:l i="230">ẉ</l:l>
+<l:l i="230">ẘ</l:l>
+<l:l i="240">X</l:l>
+<l:l i="240">x</l:l>
+<l:l i="240">Ẋ</l:l>
+<l:l i="240">ẋ</l:l>
+<l:l i="240">Ẍ</l:l>
+<l:l i="240">áº</l:l>
+<l:l i="250">Y</l:l>
+<l:l i="250">y</l:l>
+<l:l i="250">Ã</l:l>
+<l:l i="250">ý</l:l>
+<l:l i="250">ÿ</l:l>
+<l:l i="250">Ÿ</l:l>
+<l:l i="250">Ŷ</l:l>
+<l:l i="250">Å·</l:l>
+<l:l i="250">Ƴ</l:l>
+<l:l i="250">Æ´</l:l>
+<l:l i="250">Ȳ</l:l>
+<l:l i="250">ȳ</l:l>
+<l:l i="250">Ẏ</l:l>
+<l:l i="250">áº</l:l>
+<l:l i="250">ẙ</l:l>
+<l:l i="250">Ỳ</l:l>
+<l:l i="250">ỳ</l:l>
+<l:l i="250">á»´</l:l>
+<l:l i="250">ỵ</l:l>
+<l:l i="250">Ỷ</l:l>
+<l:l i="250">á»·</l:l>
+<l:l i="250">Ỹ</l:l>
+<l:l i="250">ỹ</l:l>
+<l:l i="260">Z</l:l>
+<l:l i="260">z</l:l>
+<l:l i="260">Ź</l:l>
+<l:l i="260">ź</l:l>
+<l:l i="260">Å»</l:l>
+<l:l i="260">ż</l:l>
+<l:l i="260">Ž</l:l>
+<l:l i="260">ž</l:l>
+<l:l i="260">Ƶ</l:l>
+<l:l i="260">ƶ</l:l>
+<l:l i="260">Ȥ</l:l>
+<l:l i="260">È¥</l:l>
+<l:l i="260">Ê</l:l>
+<l:l i="260">Ê‘</l:l>
+<l:l i="260">áº</l:l>
+<l:l i="260">ẑ</l:l>
+<l:l i="260">Ẓ</l:l>
+<l:l i="260">ẓ</l:l>
+<l:l i="260">Ẕ</l:l>
+<l:l i="260">ẕ</l:l>
+</l:letters>
+</l:l10n>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/ja.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/ja.xml
new file mode 100644
index 0000000..4dd809b
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/ja.xml
@@ -0,0 +1,660 @@
+<?xml version="1.0" encoding="utf-8"?>
+<l:l10n xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0" language="ja" english-language-name="Japanese">
+
+<!-- * This file is generated automatically. -->
+<!-- * To submit changes to this file upstream (to the DocBook Project) -->
+<!-- * do not submit an edited version of this file. Instead, submit an -->
+<!-- * edited version of the source file at the following location: -->
+<!-- * -->
+<!-- * https://docbook.svn.sourceforge.net/svnroot/docbook/trunk/gentext/locale/ja.xml -->
+<!-- * -->
+<!-- * E-mail the edited ja.xml source file to: -->
+<!-- * -->
+<!-- * docbook-developers@lists.sourceforge.net -->
+
+<!-- ******************************************************************** -->
+
+<!-- This file is part of the XSL DocBook Stylesheet distribution. -->
+<!-- See ../README or http://docbook.sf.net/release/xsl/current/ for -->
+<!-- copyright and other information. -->
+
+<!-- ******************************************************************** -->
+<!-- In these files, % with a letter is used for a placeholder: -->
+<!-- %t is the current element's title -->
+<!-- %s is the current element's subtitle (if applicable)-->
+<!-- %n is the current element's number label-->
+<!-- %p is the current element's page number (if applicable)-->
+<!-- ******************************************************************** -->
+
+
+<l:gentext key="Abstract" text="概è¦"/>
+<l:gentext key="abstract" text="概è¦"/>
+<l:gentext key="Acknowledgements" text="è¬è¾ž"/>
+<l:gentext key="acknowledgements" text="è¬è¾ž"/>
+<l:gentext key="Answer" text="答:"/>
+<l:gentext key="answer" text="答:"/>
+<l:gentext key="Appendix" text="付録"/>
+<l:gentext key="appendix" text="付録"/>
+<l:gentext key="Article" text="é …ç›®"/>
+<l:gentext key="article" text="é …ç›®"/>
+<l:gentext key="Author" text="著者"/>
+<l:gentext key="Bibliography" text="å‚考文献"/>
+<l:gentext key="bibliography" text="å‚考文献"/>
+<l:gentext key="Book" text="ブック"/>
+<l:gentext key="book" text="ブック"/>
+<l:gentext key="CAUTION" text="注æ„"/>
+<l:gentext key="Caution" text="注æ„"/>
+<l:gentext key="caution" text="注æ„"/>
+<l:gentext key="Chapter" text="ç« "/>
+<l:gentext key="chapter" text="ç« "/>
+<l:gentext key="Colophon" text="奥付"/>
+<l:gentext key="colophon" text="奥付"/>
+<l:gentext key="Copyright" text="製作著作"/>
+<l:gentext key="copyright" text="製作著作"/>
+<l:gentext key="Dedication" text="è¬è¾ž"/>
+<l:gentext key="dedication" text="è¬è¾ž"/>
+<l:gentext key="Edition" text="エディッション"/>
+<l:gentext key="edition" text="エディッション"/>
+<l:gentext key="Editor" text="編集者"/>
+<l:gentext key="Equation" text="å¼"/>
+<l:gentext key="equation" text="å¼"/>
+<l:gentext key="Example" text="例"/>
+<l:gentext key="example" text="例"/>
+<l:gentext key="Figure" text="図"/>
+<l:gentext key="figure" text="図"/>
+<l:gentext key="Glossary" text="用語集"/>
+<l:gentext key="glossary" text="用語集"/>
+<l:gentext key="GlossSee" text="å‚ç…§"/>
+<l:gentext key="glosssee" text="å‚ç…§"/>
+<l:gentext key="GlossSeeAlso" text="å‚ç…§"/>
+<l:gentext key="glossseealso" text="å‚ç…§"/>
+<l:gentext key="IMPORTANT" text="é‡è¦"/>
+<l:gentext key="important" text="é‡è¦"/>
+<l:gentext key="Important" text="é‡è¦"/>
+<l:gentext key="Index" text="索引"/>
+<l:gentext key="index" text="索引"/>
+<l:gentext key="ISBN" text="ISBN"/>
+<l:gentext key="isbn" text="ISBN"/>
+<l:gentext key="LegalNotice" text="法律上ã®é€šçŸ¥"/>
+<l:gentext key="legalnotice" text="法律上ã®é€šçŸ¥"/>
+<l:gentext key="MsgAud" text="対象者"/>
+<l:gentext key="msgaud" text="対象者"/>
+<l:gentext key="MsgLevel" text="レベル"/>
+<l:gentext key="msglevel" text="レベル"/>
+<l:gentext key="MsgOrig" text="出所"/>
+<l:gentext key="msgorig" text="出所"/>
+<l:gentext key="NOTE" text="注記"/>
+<l:gentext key="Note" text="注記"/>
+<l:gentext key="note" text="注記"/>
+<l:gentext key="Part" text="パート"/>
+<l:gentext key="part" text="パート"/>
+<l:gentext key="Preface" text="å‰æ›¸ã"/>
+<l:gentext key="preface" text="å‰æ›¸ã"/>
+<l:gentext key="Procedure" text="手順"/>
+<l:gentext key="procedure" text="手順"/>
+<l:gentext key="ProductionSet" text="プロダクション"/>
+<l:gentext key="PubDate" text="発行日"/>
+<l:gentext key="pubdate" text="発行日"/>
+<l:gentext key="Published" text="発行"/>
+<l:gentext key="published" text="発行"/>
+<l:gentext key="Publisher" text="発行元"/>
+<l:gentext key="Qandadiv" text="質å•ã¨ç­”ãˆ"/>
+<l:gentext key="qandadiv" text="質å•ã¨ç­”ãˆ"/>
+<l:gentext key="QandASet" text="よãã‚る質å•"/>
+<l:gentext key="Question" text="å•ï¼š"/>
+<l:gentext key="question" text="å•ï¼š"/>
+<l:gentext key="RefEntry" text="ページ"/>
+<l:gentext key="refentry" text="ページ"/>
+<l:gentext key="Reference" text="å‚ç…§"/>
+<l:gentext key="reference" text="å‚ç…§"/>
+<l:gentext key="References" text="å‚ç…§"/>
+<l:gentext key="RefName" text="åå‰"/>
+<l:gentext key="refname" text="åå‰"/>
+<l:gentext key="RefSection" text="é …"/>
+<l:gentext key="refsection" text="é …"/>
+<l:gentext key="RefSynopsisDiv" text="概è¦"/>
+<l:gentext key="refsynopsisdiv" text="概è¦"/>
+<l:gentext key="RevHistory" text="改訂履歴"/>
+<l:gentext key="revhistory" text="改訂履歴"/>
+<l:gentext key="revision" text="改訂"/>
+<l:gentext key="Revision" text="改訂"/>
+<l:gentext key="sect1" text="é …"/>
+<l:gentext key="sect2" text="é …"/>
+<l:gentext key="sect3" text="é …"/>
+<l:gentext key="sect4" text="é …"/>
+<l:gentext key="sect5" text="é …"/>
+<l:gentext key="section" text="é …"/>
+<l:gentext key="Section" text="é …"/>
+<l:gentext key="see" text="å‚ç…§"/>
+<l:gentext key="See" text="å‚ç…§"/>
+<l:gentext key="seealso" text="å‚ç…§"/>
+<l:gentext key="Seealso" text="å‚ç…§"/>
+<l:gentext key="SeeAlso" text="å‚ç…§"/>
+<l:gentext key="set" text="セット"/>
+<l:gentext key="Set" text="セット"/>
+<l:gentext key="setindex" text="セット目次"/>
+<l:gentext key="SetIndex" text="セット目次"/>
+<l:gentext key="Sidebar" text="サイドãƒãƒ¼"/>
+<l:gentext key="sidebar" text="サイドãƒãƒ¼"/>
+<l:gentext key="step" text="ステップ"/>
+<l:gentext key="Step" text="ステップ"/>
+<l:gentext key="table" text="表"/>
+<l:gentext key="Table" text="表"/>
+<l:gentext key="task" text="タスク"/>
+<l:gentext key="Task" text="タスク"/>
+<l:gentext key="tip" text="ヒント"/>
+<l:gentext key="TIP" text="ヒント"/>
+<l:gentext key="Tip" text="ヒント"/>
+<l:gentext key="Warning" text="警告"/>
+<l:gentext key="warning" text="警告"/>
+<l:gentext key="WARNING" text="警告"/>
+<l:gentext key="and" text="ã€"/>
+<l:gentext key="by" text=":"/>
+<l:gentext key="Edited" text="編集者"/>
+<l:gentext key="edited" text="編集者"/>
+<l:gentext key="Editedby" text="編集者"/>
+<l:gentext key="editedby" text="編集者"/>
+<l:gentext key="in" text=""/>
+<l:gentext key="lastlistcomma" text=","/>
+<l:gentext key="listcomma" text=","/>
+<l:gentext key="notes" text="注記"/>
+<l:gentext key="Notes" text="注記"/>
+<l:gentext key="Pgs" text="ページ"/>
+<l:gentext key="pgs" text="ページ"/>
+<l:gentext key="Revisedby" text="校正者:"/>
+<l:gentext key="revisedby" text="校正者: "/>
+<l:gentext key="TableNotes" text="注æ„"/>
+<l:gentext key="tablenotes" text="注æ„"/>
+<l:gentext key="TableofContents" text="目次"/>
+<l:gentext key="tableofcontents" text="目次"/>
+<l:gentext key="unexpectedelementname" text="予期ã—ãªã„è¦ç´ åã§ã™"/>
+<l:gentext key="unsupported" text="サãƒãƒ¼ãƒˆã•ã‚Œã¾ã›ã‚“"/>
+<l:gentext key="xrefto" text="xref "/>
+<l:gentext key="Authors" text="著者"/>
+<l:gentext key="copyeditor" text="コピーエディター"/>
+<l:gentext key="graphicdesigner" text="グラフィックデザイナー"/>
+<l:gentext key="productioneditor" text="プロダクションエディター"/>
+<l:gentext key="technicaleditor" text="テクニカルエディター"/>
+<l:gentext key="translator" text="翻訳者"/>
+<l:gentext key="listofequations" text="å¼ã®ä¸€è¦§"/>
+<l:gentext key="ListofEquations" text="å¼ã®ä¸€è¦§"/>
+<l:gentext key="ListofExamples" text="例ã®ä¸€è¦§"/>
+<l:gentext key="listofexamples" text="例ã®ä¸€è¦§"/>
+<l:gentext key="ListofFigures" text="図ã®ä¸€è¦§"/>
+<l:gentext key="listoffigures" text="図ã®ä¸€è¦§"/>
+<l:gentext key="ListofProcedures" text="手順ã®ä¸€è¦§"/>
+<l:gentext key="listofprocedures" text="手順ã®ä¸€è¦§"/>
+<l:gentext key="listoftables" text="表ã®ä¸€è¦§"/>
+<l:gentext key="ListofTables" text="表ã®ä¸€è¦§"/>
+<l:gentext key="ListofUnknown" text="ä¸æ˜Žã®ä¸€è¦§"/>
+<l:gentext key="listofunknown" text="ä¸æ˜Žã®ä¸€è¦§"/>
+<l:gentext key="nav-home" text="ホーム"/>
+<l:gentext key="nav-next" text="次ã¸"/>
+<l:gentext key="nav-next-sibling" text="æ—©é€ã‚Š"/>
+<l:gentext key="nav-prev" text="戻る"/>
+<l:gentext key="nav-prev-sibling" text="巻戻ã—"/>
+<l:gentext key="nav-up" text="上ã«æˆ»ã‚‹"/>
+<l:gentext key="nav-toc" text="目次"/>
+<l:gentext key="Draft" text="ドラフト"/>
+<l:gentext key="above" text="上"/>
+<l:gentext key="below" text="下"/>
+<l:gentext key="sectioncalled" text="セクションå"/>
+<l:gentext key="index symbols" text="シンボル"/>
+<l:gentext key="writing-mode" text="lr-tb"/>
+<l:gentext key="lowercase.alpha" text="abcdefghijklmnopqrstuvwxyz" lang="en"/>
+<l:gentext key="uppercase.alpha" text="ABCDEFGHIJKLMNOPQRSTUVWXYZ" lang="en"/>
+<l:gentext key="normalize.sort.input" text="AaÀàÃáÂâÃãÄäÅåĀÄĂ㥹ÇǎǞǟǠǡǺǻȀÈȂȃȦȧḀá¸áºšáº áº¡áº¢áº£áº¤áº¥áº¦áº§áº¨áº©áºªáº«áº¬áº­áº®áº¯áº°áº±áº²áº³áº´áºµáº¶áº·BbÆ€ÆɓƂƃḂḃḄḅḆḇCcÇçĆćĈĉĊċČÄƇƈɕḈḉDdÄŽÄÄđƊɗƋƌDžDzȡɖḊḋḌá¸á¸Žá¸á¸á¸‘ḒḓEeÈèÉéÊêËëĒēĔĕĖėĘęĚěȄȅȆȇȨȩḔḕḖḗḘḙḚḛḜá¸áº¸áº¹áººáº»áº¼áº½áº¾áº¿á»€á»á»‚ểỄễỆệFfƑƒḞḟGgÄœÄĞğĠġĢģƓɠǤǥǦǧǴǵḠḡHhĤĥĦħȞȟɦḢḣḤḥḦḧḨḩḪḫẖIiÌìÃíÎîÃïĨĩĪīĬĭĮįİƗɨÇÇȈȉȊȋḬḭḮḯỈỉỊịJjĴĵǰÊKkĶķƘƙǨǩḰḱḲḳḴḵLlĹĺĻļĽľĿŀÅłƚLjȴɫɬɭḶḷḸḹḺḻḼḽMmɱḾḿṀá¹á¹‚ṃNnÑñŃńŅņŇňÆɲƞȠNjǸǹȵɳṄṅṆṇṈṉṊṋOoÒòÓóÔôÕõÖöØøŌÅÅŽÅÅőƟƠơǑǒǪǫǬǭǾǿȌÈÈŽÈȪȫȬȭȮȯȰȱṌá¹á¹Žá¹á¹á¹‘ṒṓỌá»á»Žá»á»á»‘ỒồỔổỖỗỘộỚớỜá»á»žá»Ÿá» á»¡á»¢á»£PpƤƥṔṕṖṗQqÊ RrŔŕŖŗŘřÈȑȒȓɼɽɾṘṙṚṛṜá¹á¹žá¹ŸSsŚśŜÅŞşŠšȘșʂṠṡṢṣṤṥṦṧṨṩTtŢţŤťŦŧƫƬƭƮʈȚțȶṪṫṬṭṮṯṰṱẗUuÙùÚúÛûÜüŨũŪūŬŭŮůŰűŲųƯưǓǔǕǖǗǘǙǚǛǜȔȕȖȗṲṳṴṵṶṷṸṹṺṻỤụỦủỨứỪừỬửỮữỰựVvƲʋṼṽṾṿWwŴŵẀáºáº‚ẃẄẅẆẇẈẉẘXxẊẋẌáºYyÃýÿŸŶŷƳƴȲȳẎáºáº™á»²á»³á»´á»µá»¶á»·á»¸á»¹ZzŹźŻżŽžƵƶȤȥÊÊ‘áºáº‘ẒẓẔẕẕ" lang="en"/>
+<l:gentext key="normalize.sort.output" text="AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBCCCCCCCCCCCCCCCCCDDDDDDDDDDDDDDDDDDDDDDDDEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEFFFFFFGGGGGGGGGGGGGGGGGGGGHHHHHHHHHHHHHHHHHHHHIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIJJJJJJKKKKKKKKKKKKKKLLLLLLLLLLLLLLLLLLLLLLLLLLMMMMMMMMMNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOPPPPPPPPQQQRRRRRRRRRRRRRRRRRRRRRRRSSSSSSSSSSSSSSSSSSSSSSSTTTTTTTTTTTTTTTTTTTTTTTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUVVVVVVVVWWWWWWWWWWWWWWWXXXXXXYYYYYYYYYYYYYYYYYYYYYYYZZZZZZZZZZZZZZZZZZZZZ" lang="en"/>
+<l:dingbat key="startquote" text="「"/>
+<l:dingbat key="endquote" text="ã€"/>
+<l:dingbat key="nestedstartquote" text="『"/>
+<l:dingbat key="nestedendquote" text="ã€"/>
+<l:dingbat key="singlestartquote" text="‘" lang="en"/>
+<l:dingbat key="singleendquote" text="’" lang="en"/>
+<l:dingbat key="bullet" text="â—"/>
+<l:gentext key="hyphenation-character" text="-" lang="en"/>
+<l:gentext key="hyphenation-push-character-count" text="2" lang="en"/>
+<l:gentext key="hyphenation-remain-character-count" text="2" lang="en"/>
+<l:context name="styles"><l:template name="person-name" text="family-given"/>
+</l:context>
+<l:context name="title"><l:template name="abstract" text="%t"/>
+<l:template name="acknowledgements" text="%t" lang="en"/>
+<l:template name="answer" text="%t"/>
+<l:template name="appendix" text="付録%n %t"/>
+<l:template name="article" text="%t"/>
+<l:template name="authorblurb" text="%t"/>
+<l:template name="bibliodiv" text="%t"/>
+<l:template name="biblioentry" text="%t"/>
+<l:template name="bibliography" text="%t"/>
+<l:template name="bibliolist" text="%t" lang="en"/>
+<l:template name="bibliomixed" text="%t"/>
+<l:template name="bibliomset" text="%t"/>
+<l:template name="biblioset" text="%t"/>
+<l:template name="blockquote" text="%t"/>
+<l:template name="book" text="%t"/>
+<l:template name="calloutlist" text="%t"/>
+<l:template name="caution" text="%t"/>
+<l:template name="chapter" text="第%n章%t"/>
+<l:template name="colophon" text="%t"/>
+<l:template name="dedication" text="%t"/>
+<l:template name="equation" text="å¼%n %t"/>
+<l:template name="example" text="例%n %t"/>
+<l:template name="figure" text="図%n %t"/>
+<l:template name="foil" text="%t" lang="en"/>
+<l:template name="foilgroup" text="%t" lang="en"/>
+<l:template name="formalpara" text="%t"/>
+<l:template name="glossary" text="%t"/>
+<l:template name="glossdiv" text="%t"/>
+<l:template name="glosslist" text="%t" lang="en"/>
+<l:template name="glossentry" text="%t" lang="en"/>
+<l:template name="important" text="%t"/>
+<l:template name="index" text="%t"/>
+<l:template name="indexdiv" text="%t"/>
+<l:template name="itemizedlist" text="%t"/>
+<l:template name="legalnotice" text="%t"/>
+<l:template name="listitem" text=""/>
+<l:template name="lot" text="%t"/>
+<l:template name="msg" text="%t"/>
+<l:template name="msgexplan" text="%t"/>
+<l:template name="msgmain" text="%t"/>
+<l:template name="msgrel" text="%t"/>
+<l:template name="msgset" text="%t"/>
+<l:template name="msgsub" text="%t"/>
+<l:template name="note" text="%t"/>
+<l:template name="orderedlist" text="%t"/>
+<l:template name="part" text="パート%n %t"/>
+<l:template name="partintro" text="%t"/>
+<l:template name="preface" text="%t"/>
+<l:template name="procedure" text="%t"/>
+<l:template name="procedure.formal" text="手順%n %t"/>
+<l:template name="productionset" text="%t"/>
+<l:template name="productionset.formal" text="プロダクション %n"/>
+<l:template name="qandadiv" text="%t"/>
+<l:template name="qandaentry" text="%t"/>
+<l:template name="qandaset" text="%t"/>
+<l:template name="question" text="%t"/>
+<l:template name="refentry" text="%t"/>
+<l:template name="reference" text="%t"/>
+<l:template name="refsection" text="%t"/>
+<l:template name="refsect1" text="%t"/>
+<l:template name="refsect2" text="%t"/>
+<l:template name="refsect3" text="%t"/>
+<l:template name="refsynopsisdiv" text="%t"/>
+<l:template name="refsynopsisdivinfo" text="%t"/>
+<l:template name="segmentedlist" text="%t"/>
+<l:template name="set" text="%t"/>
+<l:template name="setindex" text="%t"/>
+<l:template name="sidebar" text="%t"/>
+<l:template name="step" text="%t"/>
+<l:template name="table" text="表%n %t"/>
+<l:template name="task" text="%t" lang="en"/>
+<l:template name="tasksummary" text="%t" lang="en"/>
+<l:template name="taskprerequisites" text="%t" lang="en"/>
+<l:template name="taskrelated" text="%t" lang="en"/>
+<l:template name="tip" text="%t"/>
+<l:template name="toc" text="%t"/>
+<l:template name="variablelist" text="%t"/>
+<l:template name="varlistentry" text="" lang="en"/>
+<l:template name="warning" text="%t"/>
+</l:context>
+<l:context name="title-unnumbered"><l:template name="appendix" text="%t"/>
+<l:template name="article/appendix" text="%t" lang="en"/>
+<l:template name="bridgehead" text="%t"/>
+<l:template name="chapter" text="%t"/>
+<l:template name="sect1" text="%t"/>
+<l:template name="sect2" text="%t"/>
+<l:template name="sect3" text="%t"/>
+<l:template name="sect4" text="%t"/>
+<l:template name="sect5" text="%t"/>
+<l:template name="section" text="%t"/>
+<l:template name="simplesect" text="%t"/>
+<l:template name="part" text="%t" lang="en"/>
+</l:context>
+<l:context name="title-numbered"><l:template name="appendix" text="付録%n %t"/>
+<l:template name="article/appendix" text="%n. %t" lang="en"/>
+<l:template name="bridgehead" text="%n %t"/>
+<l:template name="chapter" text="第%n章 %t"/>
+<l:template name="part" text="パート %n. %t"/>
+<l:template name="sect1" text="%n. %t"/>
+<l:template name="sect2" text="%n. %t"/>
+<l:template name="sect3" text="%n. %t"/>
+<l:template name="sect4" text="%n. %t"/>
+<l:template name="sect5" text="%n. %t"/>
+<l:template name="section" text="%n. %t"/>
+<l:template name="simplesect" text="%t"/>
+</l:context>
+<l:context name="subtitle"><l:template name="appendix" text="%s"/>
+<l:template name="acknowledgements" text="%s" lang="en"/>
+<l:template name="article" text="%s"/>
+<l:template name="bibliodiv" text="%s"/>
+<l:template name="biblioentry" text="%s"/>
+<l:template name="bibliography" text="%s"/>
+<l:template name="bibliomixed" text="%s"/>
+<l:template name="bibliomset" text="%s"/>
+<l:template name="biblioset" text="%s"/>
+<l:template name="book" text="%s"/>
+<l:template name="chapter" text="%s"/>
+<l:template name="colophon" text="%s"/>
+<l:template name="dedication" text="%s"/>
+<l:template name="glossary" text="%s"/>
+<l:template name="glossdiv" text="%s"/>
+<l:template name="index" text="%s"/>
+<l:template name="indexdiv" text="%s"/>
+<l:template name="lot" text="%s"/>
+<l:template name="part" text="%s"/>
+<l:template name="partintro" text="%s"/>
+<l:template name="preface" text="%s"/>
+<l:template name="refentry" text="%s"/>
+<l:template name="reference" text="%s"/>
+<l:template name="refsection" text="%s"/>
+<l:template name="refsect1" text="%s"/>
+<l:template name="refsect2" text="%s"/>
+<l:template name="refsect3" text="%s"/>
+<l:template name="refsynopsisdiv" text="%s"/>
+<l:template name="sect1" text="%s"/>
+<l:template name="sect2" text="%s"/>
+<l:template name="sect3" text="%s"/>
+<l:template name="sect4" text="%s"/>
+<l:template name="sect5" text="%s"/>
+<l:template name="section" text="%s"/>
+<l:template name="set" text="%s"/>
+<l:template name="setindex" text="%s"/>
+<l:template name="sidebar" text="%s"/>
+<l:template name="simplesect" text="%s"/>
+<l:template name="toc" text="%s"/>
+</l:context>
+<l:context name="xref"><l:template name="abstract" text="%t"/>
+<l:template name="acknowledgements" text="%t" lang="en"/>
+<l:template name="answer" text="答: %n"/>
+<l:template name="appendix" text="%t"/>
+<l:template name="article" text="%t"/>
+<l:template name="authorblurb" text="%t"/>
+<l:template name="bibliodiv" text="%t"/>
+<l:template name="bibliography" text="%t"/>
+<l:template name="bibliomset" text="%t"/>
+<l:template name="biblioset" text="%t"/>
+<l:template name="blockquote" text="%t"/>
+<l:template name="book" text="%t"/>
+<l:template name="calloutlist" text="%t"/>
+<l:template name="caution" text="%t"/>
+<l:template name="chapter" text="%t"/>
+<l:template name="colophon" text="%t"/>
+<l:template name="constraintdef" text="%t"/>
+<l:template name="dedication" text="%t"/>
+<l:template name="equation" text="%t"/>
+<l:template name="example" text="%t"/>
+<l:template name="figure" text="%t"/>
+<l:template name="foil" text="%t" lang="en"/>
+<l:template name="foilgroup" text="%t" lang="en"/>
+<l:template name="formalpara" text="%t"/>
+<l:template name="glossary" text="%t"/>
+<l:template name="glossdiv" text="%t"/>
+<l:template name="important" text="%t"/>
+<l:template name="index" text="%t"/>
+<l:template name="indexdiv" text="%t"/>
+<l:template name="itemizedlist" text="%t"/>
+<l:template name="legalnotice" text="%t"/>
+<l:template name="listitem" text="%n"/>
+<l:template name="lot" text="%t"/>
+<l:template name="msg" text="%t"/>
+<l:template name="msgexplan" text="%t"/>
+<l:template name="msgmain" text="%t"/>
+<l:template name="msgrel" text="%t"/>
+<l:template name="msgset" text="%t"/>
+<l:template name="msgsub" text="%t"/>
+<l:template name="note" text="%t"/>
+<l:template name="orderedlist" text="%t"/>
+<l:template name="part" text="%t"/>
+<l:template name="partintro" text="%t"/>
+<l:template name="preface" text="%t"/>
+<l:template name="procedure" text="%t"/>
+<l:template name="productionset" text="%t"/>
+<l:template name="qandadiv" text="%t"/>
+<l:template name="qandaentry" text="å•ï¼šÂ %n"/>
+<l:template name="qandaset" text="%t"/>
+<l:template name="question" text="å•ï¼šÂ %n"/>
+<l:template name="reference" text="%t"/>
+<l:template name="refsynopsisdiv" text="%t"/>
+<l:template name="segmentedlist" text="%t"/>
+<l:template name="set" text="%t"/>
+<l:template name="setindex" text="%t"/>
+<l:template name="sidebar" text="%t"/>
+<l:template name="table" text="%t"/>
+<l:template name="task" text="%t" lang="en"/>
+<l:template name="tip" text="%t"/>
+<l:template name="toc" text="%t"/>
+<l:template name="variablelist" text="%t"/>
+<l:template name="varlistentry" text="%n"/>
+<l:template name="warning" text="%t"/>
+<l:template name="olink.document.citation" text=" in %o" lang="en"/>
+<l:template name="olink.page.citation" text=" (page %p)" lang="en"/>
+<l:template name="page.citation" text=" [%p]"/>
+<l:template name="page" text="(page %p)" lang="en"/>
+<l:template name="docname" text=" in %o" lang="en"/>
+<l:template name="docnamelong" text=" in the document titled %o" lang="en"/>
+<l:template name="pageabbrev" text="(p. %p)" lang="en"/>
+<l:template name="Page" text="Page %p" lang="en"/>
+<l:template name="bridgehead" text="「%tã€"/>
+<l:template name="refsection" text="「%tã€"/>
+<l:template name="refsect1" text="「%tã€"/>
+<l:template name="refsect2" text="「%tã€t"/>
+<l:template name="refsect3" text="「%tã€"/>
+<l:template name="sect1" text="「%tã€"/>
+<l:template name="sect2" text="「%tã€"/>
+<l:template name="sect3" text="「%tã€"/>
+<l:template name="sect4" text="「%tã€"/>
+<l:template name="sect5" text="「%tã€"/>
+<l:template name="section" text="「%tã€"/>
+<l:template name="simplesect" text="「%tã€"/>
+</l:context>
+<l:context name="xref-number"><l:template name="answer" text="答: %n"/>
+<l:template name="appendix" text="付録%n"/>
+<l:template name="bridgehead" text="項 %n"/>
+<l:template name="chapter" text="第%n章"/>
+<l:template name="equation" text="å¼Â %n"/>
+<l:template name="example" text="例 %n"/>
+<l:template name="figure" text="図 %n"/>
+<l:template name="part" text="パート %n"/>
+<l:template name="procedure" text="手順 %n"/>
+<l:template name="productionset" text="プロダクション %n"/>
+<l:template name="qandadiv" text="質å•ã¨ç­”ãˆÂ %n"/>
+<l:template name="qandaentry" text="å•ï¼šÂ %n"/>
+<l:template name="question" text="å•ï¼šÂ %n"/>
+<l:template name="sect1" text="%n"/>
+<l:template name="sect2" text="%n"/>
+<l:template name="sect3" text="%n"/>
+<l:template name="sect4" text="%n"/>
+<l:template name="sect5" text="%n"/>
+<l:template name="section" text="%n"/>
+<l:template name="table" text="表 %n"/>
+</l:context>
+<l:context name="xref-number-and-title"><l:template name="appendix" text="付録%n %t"/>
+<l:template name="bridgehead" text="%n項「%tã€"/>
+<l:template name="chapter" text="%nç« %t"/>
+<l:template name="equation" text="å¼%n「%tã€"/>
+<l:template name="example" text="例%n「%tã€"/>
+<l:template name="figure" text="図%n「%tã€"/>
+<l:template name="part" text="パート%n「%tã€"/>
+<l:template name="procedure" text="手順%n「%tã€"/>
+<l:template name="productionset" text="プロダクション%n「%tã€"/>
+<l:template name="qandadiv" text="質å•ã¨ç­”ãˆ%n「%tã€"/>
+<l:template name="refsect1" text="「%tã€"/>
+<l:template name="refsect2" text="「%tã€"/>
+<l:template name="refsect3" text="「%tã€"/>
+<l:template name="refsection" text="「%tã€"/>
+<l:template name="sect1" text="「%tã€"/>
+<l:template name="sect2" text="「%tã€"/>
+<l:template name="sect3" text="「%tã€"/>
+<l:template name="sect4" text="「%tã€"/>
+<l:template name="sect5" text="「%tã€"/>
+<l:template name="section" text="「%tã€"/>
+<l:template name="simplesect" text="「%tã€"/>
+<l:template name="table" text="表%n「%tã€"/>
+</l:context>
+<l:context name="authorgroup"><l:template name="sep" text=", "/>
+<l:template name="sep2" text=" 〠"/>
+<l:template name="seplast" text=", 〠"/>
+</l:context>
+<l:context name="glossary"><l:template name="see" text="%tå‚ç…§"/>
+<l:template name="seealso" text="%tå‚ç…§"/>
+<l:template name="seealso-separator" text=", "/>
+</l:context>
+<l:context name="msgset"><l:template name="MsgAud" text="対象者: "/>
+<l:template name="MsgLevel" text="レベル: "/>
+<l:template name="MsgOrig" text="出所: "/>
+</l:context>
+<l:context name="datetime"><l:template name="format" text="d/m/Y"/>
+</l:context>
+<l:context name="termdef"><l:template name="prefix" text="[定義: "/>
+<l:template name="suffix" text="]"/>
+</l:context>
+<l:context name="datetime-full"><l:template name="January" text="1 月"/>
+<l:template name="February" text="2 月"/>
+<l:template name="March" text="3 月"/>
+<l:template name="April" text="4 月"/>
+<l:template name="May" text="5 月"/>
+<l:template name="June" text="6 月"/>
+<l:template name="July" text="7 月"/>
+<l:template name="August" text="8 月"/>
+<l:template name="September" text="9 月"/>
+<l:template name="October" text="10 月"/>
+<l:template name="November" text="11 月"/>
+<l:template name="December" text="12 月"/>
+<l:template name="Monday" text="月曜日"/>
+<l:template name="Tuesday" text="ç«æ›œæ—¥"/>
+<l:template name="Wednesday" text="水曜日"/>
+<l:template name="Thursday" text="木曜日"/>
+<l:template name="Friday" text="金曜日"/>
+<l:template name="Saturday" text="土曜日"/>
+<l:template name="Sunday" text="日曜日"/>
+</l:context>
+<l:context name="datetime-abbrev"><l:template name="Jan" text="1 月"/>
+<l:template name="Feb" text="2 月"/>
+<l:template name="Mar" text="3 月"/>
+<l:template name="Apr" text="4 月"/>
+<l:template name="May" text="5 月"/>
+<l:template name="Jun" text="6 月"/>
+<l:template name="Jul" text="7 月"/>
+<l:template name="Aug" text="8 月"/>
+<l:template name="Sep" text="9 月"/>
+<l:template name="Oct" text="10 月"/>
+<l:template name="Nov" text="11 月"/>
+<l:template name="Dec" text="12 月"/>
+<l:template name="Mon" text="月"/>
+<l:template name="Tue" text="ç«"/>
+<l:template name="Wed" text="æ°´"/>
+<l:template name="Thu" text="木"/>
+<l:template name="Fri" text="金"/>
+<l:template name="Sat" text="土"/>
+<l:template name="Sun" text="æ—¥"/>
+</l:context>
+<l:context name="htmlhelp"><l:template name="langcode" text="0x0411 Japanese"/>
+</l:context>
+<l:context name="index"><l:template name="term-separator" text=", "/>
+<l:template name="number-separator" text=", "/>
+<l:template name="range-separator" text="-"/>
+</l:context>
+<l:context name="iso690"><l:template name="lastfirst.sep" text=", "/>
+<l:template name="alt.person.two.sep" text=" – "/>
+<l:template name="alt.person.last.sep" text=" – "/>
+<l:template name="alt.person.more.sep" text=" – "/>
+<l:template name="primary.editor" text=" (ed.)"/>
+<l:template name="primary.many" text=", et al."/>
+<l:template name="primary.sep" text=". "/>
+<l:template name="submaintitle.sep" text=": "/>
+<l:template name="title.sep" text=". "/>
+<l:template name="othertitle.sep" text=", "/>
+<l:template name="medium1" text=" ["/>
+<l:template name="medium2" text="]"/>
+<l:template name="secondary.person.sep" text="; "/>
+<l:template name="secondary.sep" text=". "/>
+<l:template name="respons.sep" text=". "/>
+<l:template name="edition.sep" text=". "/>
+<l:template name="edition.serial.sep" text=", "/>
+<l:template name="issuing.range" text="-"/>
+<l:template name="issuing.div" text=", "/>
+<l:template name="issuing.sep" text=". "/>
+<l:template name="partnr.sep" text=". "/>
+<l:template name="placepubl.sep" text=": "/>
+<l:template name="publyear.sep" text=", "/>
+<l:template name="pubinfo.sep" text=". "/>
+<l:template name="spec.pubinfo.sep" text=", "/>
+<l:template name="upd.sep" text=", "/>
+<l:template name="datecit1" text=" [cited "/>
+<l:template name="datecit2" text="]"/>
+<l:template name="extent.sep" text=". "/>
+<l:template name="locs.sep" text=", "/>
+<l:template name="location.sep" text=". "/>
+<l:template name="serie.sep" text=". "/>
+<l:template name="notice.sep" text=". "/>
+<l:template name="access" text="Available "/>
+<l:template name="acctoo" text="Also available "/>
+<l:template name="onwww" text="from World Wide Web"/>
+<l:template name="oninet" text="from Internet"/>
+<l:template name="access.end" text=": "/>
+<l:template name="link1" text="&lt;"/>
+<l:template name="link2" text="&gt;"/>
+<l:template name="access.sep" text=". "/>
+<l:template name="isbn" text="ISBN "/>
+<l:template name="issn" text="ISSN "/>
+<l:template name="stdnum.sep" text=". "/>
+<l:template name="patcountry.sep" text=". "/>
+<l:template name="pattype.sep" text=", "/>
+<l:template name="patnum.sep" text=". "/>
+<l:template name="patdate.sep" text=". "/>
+</l:context><l:letters><l:l i="-1"/>
+<l:l i="0">シンボル</l:l>
+<l:l i="10">A</l:l>
+<l:l i="10">a</l:l>
+<l:l i="20">B</l:l>
+<l:l i="20">b</l:l>
+<l:l i="30">C</l:l>
+<l:l i="30">c</l:l>
+<l:l i="40">D</l:l>
+<l:l i="40">d</l:l>
+<l:l i="50">E</l:l>
+<l:l i="50">e</l:l>
+<l:l i="60">F</l:l>
+<l:l i="60">f</l:l>
+<l:l i="70">G</l:l>
+<l:l i="70">g</l:l>
+<l:l i="80">H</l:l>
+<l:l i="80">h</l:l>
+<l:l i="90">I</l:l>
+<l:l i="90">i</l:l>
+<l:l i="100">J</l:l>
+<l:l i="100">j</l:l>
+<l:l i="110">K</l:l>
+<l:l i="110">k</l:l>
+<l:l i="120">L</l:l>
+<l:l i="120">l</l:l>
+<l:l i="130">M</l:l>
+<l:l i="130">m</l:l>
+<l:l i="140">N</l:l>
+<l:l i="140">n</l:l>
+<l:l i="150">O</l:l>
+<l:l i="150">o</l:l>
+<l:l i="160">P</l:l>
+<l:l i="160">p</l:l>
+<l:l i="170">Q</l:l>
+<l:l i="170">q</l:l>
+<l:l i="180">R</l:l>
+<l:l i="180">r</l:l>
+<l:l i="190">S</l:l>
+<l:l i="190">s</l:l>
+<l:l i="200">T</l:l>
+<l:l i="200">t</l:l>
+<l:l i="210">U</l:l>
+<l:l i="210">u</l:l>
+<l:l i="220">V</l:l>
+<l:l i="220">v</l:l>
+<l:l i="230">W</l:l>
+<l:l i="230">w</l:l>
+<l:l i="240">X</l:l>
+<l:l i="240">x</l:l>
+<l:l i="250">Y</l:l>
+<l:l i="250">y</l:l>
+<l:l i="260">Z</l:l>
+<l:l i="260">z</l:l>
+</l:letters>
+</l:l10n>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/ka.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/ka.xml
new file mode 100644
index 0000000..bd6d29c
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/ka.xml
@@ -0,0 +1,700 @@
+<?xml version="1.0" encoding="utf-8"?>
+<l:l10n xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0" language="ka" english-language-name="Georgian">
+
+<!-- * This file is generated automatically. -->
+<!-- * To submit changes to this file upstream (to the DocBook Project) -->
+<!-- * do not submit an edited version of this file. Instead, submit an -->
+<!-- * edited version of the source file at the following location: -->
+<!-- * -->
+<!-- * https://docbook.svn.sourceforge.net/svnroot/docbook/trunk/gentext/locale/ka.xml -->
+<!-- * -->
+<!-- * E-mail the edited ka.xml source file to: -->
+<!-- * -->
+<!-- * docbook-developers@lists.sourceforge.net -->
+
+<!-- ******************************************************************** -->
+
+<!-- This file is part of the XSL DocBook Stylesheet distribution. -->
+<!-- See ../README or http://docbook.sf.net/release/xsl/current/ for -->
+<!-- copyright and other information. -->
+
+<!-- ******************************************************************** -->
+<!-- In these files, % with a letter is used for a placeholder: -->
+<!-- %t is the current element's title -->
+<!-- %s is the current element's subtitle (if applicable)-->
+<!-- %n is the current element's number label-->
+<!-- %p is the current element's page number (if applicable)-->
+<!-- ******************************************************************** -->
+
+
+<l:gentext key="Abstract" text="áƒáƒœáƒáƒ¢áƒáƒªáƒ˜áƒ"/>
+<l:gentext key="abstract" text="áƒáƒœáƒáƒ¢áƒáƒªáƒ˜áƒ"/>
+<l:gentext key="Acknowledgements" text="áƒáƒ¦áƒ˜áƒáƒ áƒ”ბáƒ"/>
+<l:gentext key="acknowledgements" text="áƒáƒ¦áƒ˜áƒáƒ áƒ”ბáƒ"/>
+<l:gentext key="Answer" text="პ:"/>
+<l:gentext key="answer" text="პ:"/>
+<l:gentext key="Appendix" text="დáƒáƒœáƒáƒ áƒ—ი"/>
+<l:gentext key="appendix" text="დáƒáƒœáƒáƒ áƒ—ი"/>
+<l:gentext key="Article" text="სტáƒáƒ¢áƒ˜áƒ"/>
+<l:gentext key="article" text="სტáƒáƒ¢áƒ˜áƒ"/>
+<l:gentext key="Author" text="áƒáƒ•áƒ¢áƒáƒ áƒ˜"/>
+<l:gentext key="Bibliography" text="ბიბლიáƒáƒ’რáƒáƒ¤áƒ˜áƒ"/>
+<l:gentext key="bibliography" text="ბიბლიáƒáƒ’რáƒáƒ¤áƒ˜áƒ"/>
+<l:gentext key="Book" text="წიგნი"/>
+<l:gentext key="book" text="წიგნი"/>
+<l:gentext key="CAUTION" text="გáƒáƒ¤áƒ áƒ—ხილებáƒ"/>
+<l:gentext key="Caution" text="გáƒáƒ¤áƒ áƒ—ხილებáƒ"/>
+<l:gentext key="caution" text="გáƒáƒ¤áƒ áƒ—ხილებáƒ"/>
+<l:gentext key="Chapter" text="თáƒáƒ•áƒ˜"/>
+<l:gentext key="chapter" text="თáƒáƒ•áƒ˜"/>
+<l:gentext key="Colophon" text="კáƒáƒšáƒáƒ¤áƒáƒœáƒ˜"/>
+<l:gentext key="colophon" text="კáƒáƒšáƒáƒ¤áƒáƒœáƒ˜"/>
+<l:gentext key="Copyright" text="Copyright"/>
+<l:gentext key="copyright" text="Copyright"/>
+<l:gentext key="Dedication" text="მიძღვნáƒ"/>
+<l:gentext key="dedication" text="მიძღვნáƒ"/>
+<l:gentext key="Edition" text="გáƒáƒ›áƒáƒªáƒ”მáƒ"/>
+<l:gentext key="edition" text="გáƒáƒ›áƒáƒªáƒ”მáƒ"/>
+<l:gentext key="Editor" text="რედáƒáƒ¥áƒ¢áƒáƒ áƒ˜"/>
+<l:gentext key="Equation" text="გáƒáƒœáƒ¢áƒáƒšáƒ”ბáƒ"/>
+<l:gentext key="equation" text="გáƒáƒœáƒ¢áƒáƒšáƒ”ბáƒ"/>
+<l:gentext key="Example" text="მáƒáƒ’áƒáƒšáƒ˜áƒ—ი"/>
+<l:gentext key="example" text="მáƒáƒ’áƒáƒšáƒ˜áƒ—ი"/>
+<l:gentext key="Figure" text="სურáƒáƒ—ი"/>
+<l:gentext key="figure" text="სურáƒáƒ—ი"/>
+<l:gentext key="Glossary" text="ტერმინáƒáƒšáƒáƒ’იáƒ"/>
+<l:gentext key="glossary" text="ტერმინáƒáƒšáƒáƒ’იáƒ"/>
+<l:gentext key="GlossSee" text="იხ."/>
+<l:gentext key="glosssee" text="იხ."/>
+<l:gentext key="GlossSeeAlso" text="იხ. áƒáƒ¡áƒ”ვე"/>
+<l:gentext key="glossseealso" text="იხ. áƒáƒ¡áƒ”ვე"/>
+<l:gentext key="IMPORTANT" text="მნიშვნელáƒáƒ•áƒáƒœáƒ˜áƒ"/>
+<l:gentext key="important" text="მნიშვნელáƒáƒ•áƒáƒœáƒ˜áƒ"/>
+<l:gentext key="Important" text="მნიშვნელáƒáƒ•áƒáƒœáƒ˜áƒ"/>
+<l:gentext key="Index" text="áƒáƒœáƒ‘áƒáƒœáƒ£áƒ áƒ˜ სáƒáƒ«áƒ˜áƒ”ბელი"/>
+<l:gentext key="index" text="áƒáƒœáƒ‘áƒáƒœáƒ£áƒ áƒ˜ სáƒáƒ«áƒ˜áƒ”ბელი"/>
+<l:gentext key="ISBN" text="ISBN"/>
+<l:gentext key="isbn" text="ISBN"/>
+<l:gentext key="LegalNotice" text="სáƒáƒáƒ•áƒ¢áƒáƒ áƒ უფლებáƒ"/>
+<l:gentext key="legalnotice" text="სáƒáƒáƒ•áƒ¢áƒáƒ áƒ უფლებáƒ"/>
+<l:gentext key="MsgAud" text="áƒáƒ£áƒ“იტáƒáƒ áƒ˜áƒ"/>
+<l:gentext key="msgaud" text="áƒáƒ£áƒ“იტáƒáƒ áƒ˜áƒ"/>
+<l:gentext key="MsgLevel" text="დáƒáƒœáƒ”"/>
+<l:gentext key="msglevel" text="დáƒáƒœáƒ”"/>
+<l:gentext key="MsgOrig" text="წყáƒáƒ áƒ"/>
+<l:gentext key="msgorig" text="წყáƒáƒ áƒ"/>
+<l:gentext key="NOTE" text="შენიშვნáƒ"/>
+<l:gentext key="Note" text="შენიშვნáƒ"/>
+<l:gentext key="note" text="შენიშვნáƒ"/>
+<l:gentext key="Part" text="ნáƒáƒ¬áƒ˜áƒšáƒ˜"/>
+<l:gentext key="part" text="ნáƒáƒ¬áƒ˜áƒšáƒ˜"/>
+<l:gentext key="Preface" text="წინáƒáƒ¡áƒ˜áƒ¢áƒ§áƒ•áƒáƒáƒ‘áƒ"/>
+<l:gentext key="preface" text="წინáƒáƒ¡áƒ˜áƒ¢áƒ§áƒ•áƒáƒáƒ‘áƒ"/>
+<l:gentext key="Procedure" text="პრáƒáƒªáƒ”დურáƒ"/>
+<l:gentext key="procedure" text="პრáƒáƒªáƒ”დურáƒ"/>
+<l:gentext key="ProductionSet" text="გáƒáƒ›áƒáƒ¨áƒ•áƒ”ბáƒ"/>
+<l:gentext key="PubDate" text="გáƒáƒ›áƒáƒªáƒ”მის თáƒáƒ áƒ˜áƒ¦áƒ˜"/>
+<l:gentext key="pubdate" text="გáƒáƒ›áƒáƒªáƒ”მის თáƒáƒ áƒ˜áƒ¦áƒ˜"/>
+<l:gentext key="Published" text="გáƒáƒ›áƒáƒªáƒ”მულიáƒ"/>
+<l:gentext key="published" text="გáƒáƒ›áƒáƒªáƒ”მულიáƒ"/>
+<l:gentext key="Publisher" text="გáƒáƒ›áƒáƒ›áƒªáƒ”მელი"/>
+<l:gentext key="Qandadiv" text="კითხვრდრპáƒáƒ¡áƒ£áƒ®áƒ˜"/>
+<l:gentext key="qandadiv" text="კითხვრდრპáƒáƒ¡áƒ£áƒ®áƒ˜"/>
+<l:gentext key="QandASet" text="ხშირáƒáƒ“ დáƒáƒ¡áƒ›áƒ£áƒšáƒ˜ შეკითხვები"/>
+<l:gentext key="Question" text="კ:"/>
+<l:gentext key="question" text="კ:"/>
+<l:gentext key="RefEntry" text=""/>
+<l:gentext key="refentry" text=""/>
+<l:gentext key="Reference" text="მითითებáƒ"/>
+<l:gentext key="reference" text="მითითებáƒ"/>
+<l:gentext key="References" text="მითითებები"/>
+<l:gentext key="RefName" text="დáƒáƒ¡áƒáƒ®áƒ”ლებáƒ"/>
+<l:gentext key="refname" text="დáƒáƒ¡áƒáƒ®áƒ”ლებáƒ"/>
+<l:gentext key="RefSection" text="ნáƒáƒ¬áƒ˜áƒšáƒ˜"/>
+<l:gentext key="refsection" text="ნáƒáƒ¬áƒ˜áƒšáƒ˜"/>
+<l:gentext key="RefSynopsisDiv" text="სინáƒáƒžáƒ¡áƒ˜áƒ¡áƒ˜"/>
+<l:gentext key="refsynopsisdiv" text="სინáƒáƒžáƒ¡áƒ˜áƒ¡áƒ˜"/>
+<l:gentext key="RevHistory" text="რევიზიების ისტáƒáƒ áƒ˜áƒ"/>
+<l:gentext key="revhistory" text="რევიზიების ისტáƒáƒ áƒ˜áƒ"/>
+<l:gentext key="revision" text="რევიზიáƒ"/>
+<l:gentext key="Revision" text="რევიზიáƒ"/>
+<l:gentext key="sect1" text="ნáƒáƒ¬áƒ˜áƒšáƒ˜"/>
+<l:gentext key="sect2" text="ნáƒáƒ¬áƒ˜áƒšáƒ˜"/>
+<l:gentext key="sect3" text="ნáƒáƒ¬áƒ˜áƒšáƒ˜"/>
+<l:gentext key="sect4" text="ნáƒáƒ¬áƒ˜áƒšáƒ˜"/>
+<l:gentext key="sect5" text="ნáƒáƒ¬áƒ˜áƒšáƒ˜"/>
+<l:gentext key="section" text="ნáƒáƒ¬áƒ˜áƒšáƒ˜"/>
+<l:gentext key="Section" text="ნáƒáƒ¬áƒ˜áƒšáƒ˜"/>
+<l:gentext key="see" text="იხ."/>
+<l:gentext key="See" text="იხ."/>
+<l:gentext key="seealso" text="იხ. áƒáƒ¡áƒ”ვე"/>
+<l:gentext key="Seealso" text="იხ. áƒáƒ¡áƒ”ვე"/>
+<l:gentext key="SeeAlso" text="იხ. áƒáƒ¡áƒ”ვე"/>
+<l:gentext key="set" text="ნáƒáƒ™áƒ áƒ”ბი"/>
+<l:gentext key="Set" text="ნáƒáƒ™áƒ áƒ”ბი"/>
+<l:gentext key="setindex" text="ნáƒáƒ™áƒ áƒ”ბის ინდექსი"/>
+<l:gentext key="SetIndex" text="ნáƒáƒ™áƒ áƒ”ბის ინდექსი"/>
+<l:gentext key="Sidebar" text=""/>
+<l:gentext key="sidebar" text=""/>
+<l:gentext key="step" text="ბიჯი"/>
+<l:gentext key="Step" text="ბიჯი"/>
+<l:gentext key="table" text="ცხრილი"/>
+<l:gentext key="Table" text="ცხრილი"/>
+<l:gentext key="task" text="áƒáƒ›áƒáƒªáƒáƒœáƒ"/>
+<l:gentext key="Task" text="áƒáƒ›áƒáƒªáƒáƒœáƒ"/>
+<l:gentext key="tip" text="მითითებáƒ"/>
+<l:gentext key="TIP" text="მითითებáƒ"/>
+<l:gentext key="Tip" text="მითითებáƒ"/>
+<l:gentext key="Warning" text="გáƒáƒ¤áƒ áƒ—ხილებáƒ"/>
+<l:gentext key="warning" text="გáƒáƒ¤áƒ áƒ—ხილებáƒ"/>
+<l:gentext key="WARNING" text="გáƒáƒ¤áƒ áƒ—ხილებáƒ"/>
+<l:gentext key="and" text="დáƒ"/>
+<l:gentext key="by" text=""/>
+<l:gentext key="Edited" text="გáƒáƒ›áƒáƒ áƒ—ულიáƒ"/>
+<l:gentext key="edited" text="გáƒáƒ›áƒáƒ áƒ—ულიáƒ"/>
+<l:gentext key="Editedby" text="გáƒáƒ›áƒáƒ áƒ—áƒ:"/>
+<l:gentext key="editedby" text="გáƒáƒ›áƒáƒ áƒ—áƒ:"/>
+<l:gentext key="in" text=""/>
+<l:gentext key="lastlistcomma" text=","/>
+<l:gentext key="listcomma" text=","/>
+<l:gentext key="notes" text="შენიშვნები"/>
+<l:gentext key="Notes" text="შენიშვნები"/>
+<l:gentext key="Pgs" text="გვ. გვ."/>
+<l:gentext key="pgs" text="გვ. გვ."/>
+<l:gentext key="Revisedby" text="გáƒáƒ“áƒáƒáƒ›áƒáƒ¬áƒ›áƒ: "/>
+<l:gentext key="revisedby" text="გáƒáƒ“áƒáƒáƒ›áƒáƒ¬áƒ›áƒ: "/>
+<l:gentext key="TableNotes" text="შენიშვნები"/>
+<l:gentext key="tablenotes" text="შენიშვნები"/>
+<l:gentext key="TableofContents" text="სáƒáƒ áƒ©áƒ”ვი"/>
+<l:gentext key="tableofcontents" text="სáƒáƒ áƒ©áƒ”ვი"/>
+<l:gentext key="unexpectedelementname" text="მáƒáƒ£áƒšáƒáƒ“ნელი ელემენტის სáƒáƒ®áƒ”ლი"/>
+<l:gentext key="unsupported" text="მხáƒáƒ áƒ“áƒáƒ­áƒ”რრáƒáƒ  áƒáƒ áƒ˜áƒ¡"/>
+<l:gentext key="xrefto" text="მითითებáƒ"/>
+<l:gentext key="Authors" text="áƒáƒ•áƒ¢áƒáƒ áƒ”ბი"/>
+<l:gentext key="copyeditor" text="რედáƒáƒ¥áƒ¢áƒáƒ áƒ˜"/>
+<l:gentext key="graphicdesigner" text="დიზáƒáƒ˜áƒœáƒ”რი"/>
+<l:gentext key="productioneditor" text="მთáƒáƒ•áƒáƒ áƒ˜ რედáƒáƒ¥áƒ¢áƒáƒ áƒ˜"/>
+<l:gentext key="technicaleditor" text="ტექნიკური რედáƒáƒ¥áƒ¢áƒáƒ áƒ˜"/>
+<l:gentext key="translator" text="მთáƒáƒ áƒ’მნელი"/>
+<l:gentext key="listofequations" text="გáƒáƒœáƒ¢áƒáƒšáƒ”ბების სიáƒ"/>
+<l:gentext key="ListofEquations" text="გáƒáƒœáƒ¢áƒáƒšáƒ”ბების სიáƒ"/>
+<l:gentext key="ListofExamples" text="მáƒáƒ’áƒáƒšáƒ˜áƒ—ების სიáƒ"/>
+<l:gentext key="listofexamples" text="მáƒáƒ’áƒáƒšáƒ˜áƒ—ების სიáƒ"/>
+<l:gentext key="ListofFigures" text="სურáƒáƒ—ების სიáƒ"/>
+<l:gentext key="listoffigures" text="სურáƒáƒ—ების სიáƒ"/>
+<l:gentext key="ListofProcedures" text="პრáƒáƒªáƒ”დურების სიáƒ"/>
+<l:gentext key="listofprocedures" text="პრáƒáƒªáƒ”დურების სიáƒ"/>
+<l:gentext key="listoftables" text="ცხრილების სიáƒ"/>
+<l:gentext key="ListofTables" text="ცხრილების სიáƒ"/>
+<l:gentext key="ListofUnknown" text="უცნáƒáƒ‘ი ელემენტების სიáƒ"/>
+<l:gentext key="listofunknown" text="უცნáƒáƒ‘ი ელემენტების სიáƒ"/>
+<l:gentext key="nav-home" text="დáƒáƒ¡áƒáƒ¬áƒ§áƒ˜áƒ¡áƒ¨áƒ˜"/>
+<l:gentext key="nav-next" text="წინ"/>
+<l:gentext key="nav-next-sibling" text="წინ სწრáƒáƒ¤áƒáƒ“"/>
+<l:gentext key="nav-prev" text="უკáƒáƒœ"/>
+<l:gentext key="nav-prev-sibling" text="სწრáƒáƒ¤áƒáƒ“ უკáƒáƒœ"/>
+<l:gentext key="nav-up" text="ზემáƒáƒ—"/>
+<l:gentext key="nav-toc" text="სáƒáƒ áƒ©áƒ”ვი"/>
+<l:gentext key="Draft" text="მáƒáƒœáƒáƒ®áƒáƒ–ი"/>
+<l:gentext key="above" text="ზემáƒáƒ—"/>
+<l:gentext key="below" text="ქვემáƒáƒ—"/>
+<l:gentext key="sectioncalled" text="ნáƒáƒ¬áƒ˜áƒšáƒ˜"/>
+<l:gentext key="index symbols" text="სიმბáƒáƒšáƒáƒ”ბი"/>
+<l:gentext key="writing-mode" text="lr-tb"/>
+<l:gentext key="lowercase.alpha" text="abcdefghijklmnopqrstuvwxyzáƒáƒ‘გდევზჱთიკლმნჲáƒáƒžáƒŸáƒ áƒ¡áƒ¢áƒ³áƒ£áƒ¤áƒ¥áƒ¦áƒ§áƒ¨áƒ©áƒªáƒ«áƒ¬áƒ­áƒ®áƒ´áƒ¯áƒ°áƒµáƒ¶áƒ·"/>
+<l:gentext key="uppercase.alpha" text="ABCDEFGHIJKLMNOPQRSTUVWXYZáƒáƒ‘გდევზჱთიკლმნჲáƒáƒžáƒŸáƒ áƒ¡áƒ¢áƒ³áƒ£áƒ¤áƒ¥áƒ¦áƒ§áƒ¨áƒ©áƒªáƒ«áƒ¬áƒ­áƒ®áƒ´áƒ¯áƒ°áƒµáƒ¶áƒ·"/>
+<l:gentext key="normalize.sort.input" text="AaÀàÃáÂâÃãÄäÅåĀÄĂ㥹ÇǎǞǟǠǡǺǻȀÈȂȃȦȧḀá¸áºšáº áº¡áº¢áº£áº¤áº¥áº¦áº§áº¨áº©áºªáº«áº¬áº­áº®áº¯áº°áº±áº²áº³áº´áºµáº¶áº·BbÆ€ÆɓƂƃḂḃḄḅḆḇCcÇçĆćĈĉĊċČÄƇƈɕḈḉDdÄŽÄÄđƊɗƋƌDžDzȡɖḊḋḌá¸á¸Žá¸á¸á¸‘ḒḓEeÈèÉéÊêËëĒēĔĕĖėĘęĚěȄȅȆȇȨȩḔḕḖḗḘḙḚḛḜá¸áº¸áº¹áººáº»áº¼áº½áº¾áº¿á»€á»á»‚ểỄễỆệFfƑƒḞḟGgÄœÄĞğĠġĢģƓɠǤǥǦǧǴǵḠḡHhĤĥĦħȞȟɦḢḣḤḥḦḧḨḩḪḫẖIiÌìÃíÎîÃïĨĩĪīĬĭĮįİƗɨÇÇȈȉȊȋḬḭḮḯỈỉỊịJjĴĵǰÊKkĶķƘƙǨǩḰḱḲḳḴḵLlĹĺĻļĽľĿŀÅłƚLjȴɫɬɭḶḷḸḹḺḻḼḽMmɱḾḿṀá¹á¹‚ṃNnÑñŃńŅņŇňÆɲƞȠNjǸǹȵɳṄṅṆṇṈṉṊṋOoÒòÓóÔôÕõÖöØøŌÅÅŽÅÅőƟƠơǑǒǪǫǬǭǾǿȌÈÈŽÈȪȫȬȭȮȯȰȱṌá¹á¹Žá¹á¹á¹‘ṒṓỌá»á»Žá»á»á»‘ỒồỔổỖỗỘộỚớỜá»á»žá»Ÿá» á»¡á»¢á»£PpƤƥṔṕṖṗQqÊ RrŔŕŖŗŘřÈȑȒȓɼɽɾṘṙṚṛṜá¹á¹žá¹ŸSsŚśŜÅŞşŠšȘșʂṠṡṢṣṤṥṦṧṨṩTtŢţŤťŦŧƫƬƭƮʈȚțȶṪṫṬṭṮṯṰṱẗUuÙùÚúÛûÜüŨũŪūŬŭŮůŰűŲųƯưǓǔǕǖǗǘǙǚǛǜȔȕȖȗṲṳṴṵṶṷṸṹṺṻỤụỦủỨứỪừỬửỮữỰựVvƲʋṼṽṾṿWwŴŵẀáºáº‚ẃẄẅẆẇẈẉẘXxẊẋẌáºYyÃýÿŸŶŷƳƴȲȳẎáºáº™á»²á»³á»´á»µá»¶á»·á»¸á»¹ZzŹźŻżŽžƵƶȤȥÊÊ‘áºáº‘ẒẓẔẕẕáƒáƒ‘გდევზჱთიკლმნჲáƒáƒžáƒŸáƒ áƒ¡áƒ¢áƒ³áƒ£áƒ¤áƒ¥áƒ¦áƒ§áƒ¨áƒ©áƒªáƒ«áƒ¬áƒ­áƒ®áƒ´áƒ¯áƒ°áƒµáƒ¶áƒ·"/>
+<l:gentext key="normalize.sort.output" text="AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBCCCCCCCCCCCCCCCCCDDDDDDDDDDDDDDDDDDDDDDDDEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEFFFFFFGGGGGGGGGGGGGGGGGGGGHHHHHHHHHHHHHHHHHHHHIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIJJJJJJKKKKKKKKKKKKKKLLLLLLLLLLLLLLLLLLLLLLLLLLMMMMMMMMMNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOPPPPPPPPQQQRRRRRRRRRRRRRRRRRRRRRRRSSSSSSSSSSSSSSSSSSSSSSSTTTTTTTTTTTTTTTTTTTTTTTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUVVVVVVVVWWWWWWWWWWWWWWWXXXXXXYYYYYYYYYYYYYYYYYYYYYYYZZZZZZZZZZZZZZZZZZZZZáƒáƒ‘გდევზჱთიკლმნჲáƒáƒžáƒŸáƒ áƒ¡áƒ¢áƒ³áƒ£áƒ¤áƒ¥áƒ¦áƒ§áƒ¨áƒ©áƒªáƒ«áƒ¬áƒ­áƒ®áƒ´áƒ¯áƒ°áƒµáƒ¶áƒ·"/>
+<l:dingbat key="startquote" text="“"/>
+<l:dingbat key="endquote" text="â€"/>
+<l:dingbat key="nestedstartquote" text="‘"/>
+<l:dingbat key="nestedendquote" text="’"/>
+<l:dingbat key="singlestartquote" text="‘"/>
+<l:dingbat key="singleendquote" text="’"/>
+<l:dingbat key="bullet" text="•"/>
+<l:gentext key="hyphenation-character" text="-"/>
+<l:gentext key="hyphenation-push-character-count" text="2"/>
+<l:gentext key="hyphenation-remain-character-count" text="2"/>
+<l:context name="styles"><l:template name="person-name" text="first-last"/>
+</l:context>
+<l:context name="title"><l:template name="abstract" text="%t"/>
+<l:template name="acknowledgements" text="%t"/>
+<l:template name="answer" text="%t"/>
+<l:template name="appendix" text="დáƒáƒœáƒáƒ áƒ—ი %n. %t"/>
+<l:template name="article" text="%t"/>
+<l:template name="authorblurb" text="%t"/>
+<l:template name="bibliodiv" text="%t"/>
+<l:template name="biblioentry" text="%t"/>
+<l:template name="bibliography" text="%t"/>
+<l:template name="bibliolist" text="%t"/>
+<l:template name="bibliomixed" text="%t"/>
+<l:template name="bibliomset" text="%t"/>
+<l:template name="biblioset" text="%t"/>
+<l:template name="blockquote" text="%t"/>
+<l:template name="book" text="%t"/>
+<l:template name="calloutlist" text="%t"/>
+<l:template name="caution" text="%t"/>
+<l:template name="chapter" text="თáƒáƒ•áƒ˜Â %n. %t"/>
+<l:template name="colophon" text="%t"/>
+<l:template name="dedication" text="%t"/>
+<l:template name="equation" text="გáƒáƒœáƒ¢áƒáƒšáƒ”ბáƒÂ %n. %t"/>
+<l:template name="example" text="მáƒáƒ’áƒáƒšáƒ˜áƒ—ი %n. %t"/>
+<l:template name="figure" text="სურáƒáƒ—ი %n. %t"/>
+<l:template name="foil" text="%t"/>
+<l:template name="foilgroup" text="%t"/>
+<l:template name="formalpara" text="%t"/>
+<l:template name="glossary" text="%t"/>
+<l:template name="glossdiv" text="%t"/>
+<l:template name="glosslist" text="%t"/>
+<l:template name="glossentry" text="%t"/>
+<l:template name="important" text="%t"/>
+<l:template name="index" text="%t"/>
+<l:template name="indexdiv" text="%t"/>
+<l:template name="itemizedlist" text="%t"/>
+<l:template name="legalnotice" text="%t"/>
+<l:template name="listitem" text=""/>
+<l:template name="lot" text="%t"/>
+<l:template name="msg" text="%t"/>
+<l:template name="msgexplan" text="%t"/>
+<l:template name="msgmain" text="%t"/>
+<l:template name="msgrel" text="%t"/>
+<l:template name="msgset" text="%t"/>
+<l:template name="msgsub" text="%t"/>
+<l:template name="note" text="%t"/>
+<l:template name="orderedlist" text="%t"/>
+<l:template name="part" text="ნáƒáƒ¬áƒ˜áƒšáƒ˜Â %n. %t"/>
+<l:template name="partintro" text="%t"/>
+<l:template name="preface" text="%t"/>
+<l:template name="procedure" text="%t"/>
+<l:template name="procedure.formal" text="პრáƒáƒªáƒ”დურáƒÂ %n. %t"/>
+<l:template name="productionset" text="%t"/>
+<l:template name="productionset.formal" text="გáƒáƒ›áƒáƒ¨áƒ•áƒ”ბáƒÂ %n"/>
+<l:template name="qandadiv" text="%t"/>
+<l:template name="qandaentry" text="%t"/>
+<l:template name="qandaset" text="%t"/>
+<l:template name="question" text="%t"/>
+<l:template name="refentry" text="%t"/>
+<l:template name="reference" text="%t"/>
+<l:template name="refsection" text="%t"/>
+<l:template name="refsect1" text="%t"/>
+<l:template name="refsect2" text="%t"/>
+<l:template name="refsect3" text="%t"/>
+<l:template name="refsynopsisdiv" text="%t"/>
+<l:template name="refsynopsisdivinfo" text="%t"/>
+<l:template name="segmentedlist" text="%t"/>
+<l:template name="set" text="%t"/>
+<l:template name="setindex" text="%t"/>
+<l:template name="sidebar" text="%t"/>
+<l:template name="step" text="%t"/>
+<l:template name="table" text="ცხრილი %n. %t"/>
+<l:template name="task" text="%t"/>
+<l:template name="tasksummary" text="%t"/>
+<l:template name="taskprerequisites" text="%t"/>
+<l:template name="taskrelated" text="%t"/>
+<l:template name="tip" text="%t"/>
+<l:template name="toc" text="%t"/>
+<l:template name="variablelist" text="%t"/>
+<l:template name="varlistentry" text=""/>
+<l:template name="warning" text="%t"/>
+</l:context>
+<l:context name="title-unnumbered"><l:template name="appendix" text="%t"/>
+<l:template name="article/appendix" text="%t"/>
+<l:template name="bridgehead" text="%t"/>
+<l:template name="chapter" text="%t"/>
+<l:template name="sect1" text="%t"/>
+<l:template name="sect2" text="%t"/>
+<l:template name="sect3" text="%t"/>
+<l:template name="sect4" text="%t"/>
+<l:template name="sect5" text="%t"/>
+<l:template name="section" text="%t"/>
+<l:template name="simplesect" text="%t"/>
+<l:template name="part" text="%t"/>
+</l:context>
+<l:context name="title-numbered"><l:template name="appendix" text="დáƒáƒœáƒáƒ áƒ—ი %n. %t"/>
+<l:template name="article/appendix" text="%n. %t"/>
+<l:template name="bridgehead" text="%n. %t"/>
+<l:template name="chapter" text="თáƒáƒ•áƒ˜Â %n. %t"/>
+<l:template name="part" text="ნáƒáƒ¬áƒ˜áƒšáƒ˜Â %n. %t"/>
+<l:template name="sect1" text="%n. %t"/>
+<l:template name="sect2" text="%n. %t"/>
+<l:template name="sect3" text="%n. %t"/>
+<l:template name="sect4" text="%n. %t"/>
+<l:template name="sect5" text="%n. %t"/>
+<l:template name="section" text="%n. %t"/>
+<l:template name="simplesect" text="%t"/>
+</l:context>
+<l:context name="subtitle"><l:template name="appendix" text="%s"/>
+<l:template name="acknowledgements" text="%s"/>
+<l:template name="article" text="%s"/>
+<l:template name="bibliodiv" text="%s"/>
+<l:template name="biblioentry" text="%s"/>
+<l:template name="bibliography" text="%s"/>
+<l:template name="bibliomixed" text="%s"/>
+<l:template name="bibliomset" text="%s"/>
+<l:template name="biblioset" text="%s"/>
+<l:template name="book" text="%s"/>
+<l:template name="chapter" text="%s"/>
+<l:template name="colophon" text="%s"/>
+<l:template name="dedication" text="%s"/>
+<l:template name="glossary" text="%s"/>
+<l:template name="glossdiv" text="%s"/>
+<l:template name="index" text="%s"/>
+<l:template name="indexdiv" text="%s"/>
+<l:template name="lot" text="%s"/>
+<l:template name="part" text="%s"/>
+<l:template name="partintro" text="%s"/>
+<l:template name="preface" text="%s"/>
+<l:template name="refentry" text="%s"/>
+<l:template name="reference" text="%s"/>
+<l:template name="refsection" text="%s"/>
+<l:template name="refsect1" text="%s"/>
+<l:template name="refsect2" text="%s"/>
+<l:template name="refsect3" text="%s"/>
+<l:template name="refsynopsisdiv" text="%s"/>
+<l:template name="sect1" text="%s"/>
+<l:template name="sect2" text="%s"/>
+<l:template name="sect3" text="%s"/>
+<l:template name="sect4" text="%s"/>
+<l:template name="sect5" text="%s"/>
+<l:template name="section" text="%s"/>
+<l:template name="set" text="%s"/>
+<l:template name="setindex" text="%s"/>
+<l:template name="sidebar" text="%s"/>
+<l:template name="simplesect" text="%s"/>
+<l:template name="toc" text="%s"/>
+</l:context>
+<l:context name="xref"><l:template name="abstract" text="%t"/>
+<l:template name="acknowledgements" text="%t"/>
+<l:template name="answer" text="პ: %n"/>
+<l:template name="appendix" text="%t"/>
+<l:template name="article" text="%t"/>
+<l:template name="authorblurb" text="%t"/>
+<l:template name="bibliodiv" text="%t"/>
+<l:template name="bibliography" text="%t"/>
+<l:template name="bibliomset" text="%t"/>
+<l:template name="biblioset" text="%t"/>
+<l:template name="blockquote" text="%t"/>
+<l:template name="book" text="%t"/>
+<l:template name="calloutlist" text="%t"/>
+<l:template name="caution" text="%t"/>
+<l:template name="chapter" text="%t"/>
+<l:template name="colophon" text="%t"/>
+<l:template name="constraintdef" text="%t"/>
+<l:template name="dedication" text="%t"/>
+<l:template name="equation" text="%t"/>
+<l:template name="example" text="%t"/>
+<l:template name="figure" text="%t"/>
+<l:template name="foil" text="%t"/>
+<l:template name="foilgroup" text="%t"/>
+<l:template name="formalpara" text="%t"/>
+<l:template name="glossary" text="%t"/>
+<l:template name="glossdiv" text="%t"/>
+<l:template name="important" text="%t"/>
+<l:template name="index" text="%t"/>
+<l:template name="indexdiv" text="%t"/>
+<l:template name="itemizedlist" text="%t"/>
+<l:template name="legalnotice" text="%t"/>
+<l:template name="listitem" text="%n"/>
+<l:template name="lot" text="%t"/>
+<l:template name="msg" text="%t"/>
+<l:template name="msgexplan" text="%t"/>
+<l:template name="msgmain" text="%t"/>
+<l:template name="msgrel" text="%t"/>
+<l:template name="msgset" text="%t"/>
+<l:template name="msgsub" text="%t"/>
+<l:template name="note" text="%t"/>
+<l:template name="orderedlist" text="%t"/>
+<l:template name="part" text="%t"/>
+<l:template name="partintro" text="%t"/>
+<l:template name="preface" text="%t"/>
+<l:template name="procedure" text="%t"/>
+<l:template name="productionset" text="%t"/>
+<l:template name="qandadiv" text="%t"/>
+<l:template name="qandaentry" text="კ: %n"/>
+<l:template name="qandaset" text="%t"/>
+<l:template name="question" text="კ: %n"/>
+<l:template name="reference" text="%t"/>
+<l:template name="refsynopsisdiv" text="%t"/>
+<l:template name="segmentedlist" text="%t"/>
+<l:template name="set" text="%t"/>
+<l:template name="setindex" text="%t"/>
+<l:template name="sidebar" text="%t"/>
+<l:template name="table" text="%t"/>
+<l:template name="task" text="%t"/>
+<l:template name="tip" text="%t"/>
+<l:template name="toc" text="%t"/>
+<l:template name="variablelist" text="%t"/>
+<l:template name="varlistentry" text="%n"/>
+<l:template name="warning" text="%t"/>
+<l:template name="olink.document.citation" text=" in %o"/>
+<l:template name="olink.page.citation" text=" (page %p)"/>
+<l:template name="page.citation" text=" [%p]"/>
+<l:template name="page" text="(page %p)"/>
+<l:template name="docname" text=" in %o"/>
+<l:template name="docnamelong" text=" in the document titled %o"/>
+<l:template name="pageabbrev" text="(p. %p)"/>
+<l:template name="Page" text="Page %p"/>
+<l:template name="bridgehead" text="ნáƒáƒ¬áƒ˜áƒšáƒ˜ “%tâ€"/>
+<l:template name="refsection" text="ნáƒáƒ¬áƒ˜áƒšáƒ˜ “%tâ€"/>
+<l:template name="refsect1" text="ნáƒáƒ¬áƒ˜áƒšáƒ˜ “%tâ€"/>
+<l:template name="refsect2" text="ნáƒáƒ¬áƒ˜áƒšáƒ˜ “%tâ€"/>
+<l:template name="refsect3" text="ნáƒáƒ¬áƒ˜áƒšáƒ˜ “%tâ€"/>
+<l:template name="sect1" text="ნáƒáƒ¬áƒ˜áƒšáƒ˜ “%tâ€"/>
+<l:template name="sect2" text="ნáƒáƒ¬áƒ˜áƒšáƒ˜ “%tâ€"/>
+<l:template name="sect3" text="ნáƒáƒ¬áƒ˜áƒšáƒ˜ “%tâ€"/>
+<l:template name="sect4" text="ნáƒáƒ¬áƒ˜áƒšáƒ˜ “%tâ€"/>
+<l:template name="sect5" text="ნáƒáƒ¬áƒ˜áƒšáƒ˜ “%tâ€"/>
+<l:template name="section" text="ნáƒáƒ¬áƒ˜áƒšáƒ˜ “%tâ€"/>
+<l:template name="simplesect" text="ნáƒáƒ¬áƒ˜áƒšáƒ˜ “%tâ€"/>
+</l:context>
+<l:context name="xref-number"><l:template name="answer" text="პ: %n"/>
+<l:template name="appendix" text="დáƒáƒœáƒáƒ áƒ—ი %n"/>
+<l:template name="bridgehead" text="ნáƒáƒ¬áƒ˜áƒšáƒ˜Â %n"/>
+<l:template name="chapter" text="თáƒáƒ•áƒ˜Â %n"/>
+<l:template name="equation" text="გáƒáƒœáƒ¢áƒáƒšáƒ”ბáƒÂ %n"/>
+<l:template name="example" text="მáƒáƒ’áƒáƒšáƒ˜áƒ—ი %n"/>
+<l:template name="figure" text="სურáƒáƒ—ი %n"/>
+<l:template name="part" text="ნáƒáƒ¬áƒ˜áƒšáƒ˜Â %n"/>
+<l:template name="procedure" text="პრáƒáƒªáƒ”დურáƒÂ %n"/>
+<l:template name="productionset" text="გáƒáƒ›áƒáƒ¨áƒ•áƒ”ბáƒÂ %n"/>
+<l:template name="qandadiv" text="კითხვრდრპáƒáƒ¡áƒ£áƒ®áƒ˜Â %n"/>
+<l:template name="qandaentry" text="კ: %n"/>
+<l:template name="question" text="კ: %n"/>
+<l:template name="sect1" text="ნáƒáƒ¬áƒ˜áƒšáƒ˜Â %n"/>
+<l:template name="sect2" text="ნáƒáƒ¬áƒ˜áƒšáƒ˜Â %n"/>
+<l:template name="sect3" text="ნáƒáƒ¬áƒ˜áƒšáƒ˜Â %n"/>
+<l:template name="sect4" text="ნáƒáƒ¬áƒ˜áƒšáƒ˜Â %n"/>
+<l:template name="sect5" text="ნáƒáƒ¬áƒ˜áƒšáƒ˜Â %n"/>
+<l:template name="section" text="ნáƒáƒ¬áƒ˜áƒšáƒ˜Â %n"/>
+<l:template name="table" text="ცხრილი %n"/>
+</l:context>
+<l:context name="xref-number-and-title"><l:template name="appendix" text="დáƒáƒœáƒáƒ áƒ—ი %n, %t"/>
+<l:template name="bridgehead" text="ნáƒáƒ¬áƒ˜áƒšáƒ˜Â %n, “%tâ€"/>
+<l:template name="chapter" text="თáƒáƒ•áƒ˜Â %n, %t"/>
+<l:template name="equation" text="გáƒáƒœáƒ¢áƒáƒšáƒ”ბáƒÂ %n, “%tâ€"/>
+<l:template name="example" text="მáƒáƒ’áƒáƒšáƒ˜áƒ—ი %n, “%tâ€"/>
+<l:template name="figure" text="სურáƒáƒ—ი %n, “%tâ€"/>
+<l:template name="part" text="ნáƒáƒ¬áƒ˜áƒšáƒ˜Â %n, “%tâ€"/>
+<l:template name="procedure" text="პრáƒáƒªáƒ”დურáƒÂ %n, “%tâ€"/>
+<l:template name="productionset" text="გáƒáƒ›áƒáƒ¨áƒ•áƒ”ბáƒÂ %n, “%tâ€"/>
+<l:template name="qandadiv" text="კითხვრდრპáƒáƒ¡áƒ£áƒ®áƒ˜Â %n, “%tâ€"/>
+<l:template name="refsect1" text="ნáƒáƒ¬áƒ˜áƒšáƒ˜ “%tâ€"/>
+<l:template name="refsect2" text="ნáƒáƒ¬áƒ˜áƒšáƒ˜ “%tâ€"/>
+<l:template name="refsect3" text="ნáƒáƒ¬áƒ˜áƒšáƒ˜ “%tâ€"/>
+<l:template name="refsection" text="ნáƒáƒ¬áƒ˜áƒšáƒ˜ “%tâ€"/>
+<l:template name="sect1" text="ნáƒáƒ¬áƒ˜áƒšáƒ˜Â %n, “%tâ€"/>
+<l:template name="sect2" text="ნáƒáƒ¬áƒ˜áƒšáƒ˜Â %n, “%tâ€"/>
+<l:template name="sect3" text="ნáƒáƒ¬áƒ˜áƒšáƒ˜Â %n, “%tâ€"/>
+<l:template name="sect4" text="ნáƒáƒ¬áƒ˜áƒšáƒ˜Â %n, “%tâ€"/>
+<l:template name="sect5" text="ნáƒáƒ¬áƒ˜áƒšáƒ˜Â %n, “%tâ€"/>
+<l:template name="section" text="ნáƒáƒ¬áƒ˜áƒšáƒ˜Â %n, “%tâ€"/>
+<l:template name="simplesect" text="ნáƒáƒ¬áƒ˜áƒšáƒ˜ “%tâ€"/>
+<l:template name="table" text="ცხრილი %n, “%tâ€"/>
+</l:context>
+<l:context name="authorgroup"><l:template name="sep" text=", "/>
+<l:template name="sep2" text=" დრ"/>
+<l:template name="seplast" text=", დრ"/>
+</l:context>
+<l:context name="glossary"><l:template name="see" text="იხ. %t."/>
+<l:template name="seealso" text="იხ. áƒáƒ¡áƒ”ვე %t."/>
+<l:template name="seealso-separator" text=", "/>
+</l:context>
+<l:context name="msgset"><l:template name="MsgAud" text="áƒáƒ£áƒ“იტáƒáƒ áƒ˜áƒ: "/>
+<l:template name="MsgLevel" text="დáƒáƒœáƒ”: "/>
+<l:template name="MsgOrig" text="წყáƒáƒ áƒ: "/>
+</l:context>
+<l:context name="datetime"><l:template name="format" text="d.m.Y"/>
+</l:context>
+<l:context name="termdef"><l:template name="prefix" text="[გáƒáƒœáƒ¡áƒáƒ–ღვრებáƒ: "/>
+<l:template name="suffix" text="]"/>
+</l:context>
+<l:context name="datetime-full"><l:template name="January" text="იáƒáƒœáƒ•áƒáƒ "/>
+<l:template name="February" text="თებერვáƒáƒšáƒ˜"/>
+<l:template name="March" text="მáƒáƒ áƒ¢áƒ˜"/>
+<l:template name="April" text="áƒáƒžáƒ áƒ˜áƒšáƒ˜"/>
+<l:template name="May" text="მáƒáƒ˜áƒ¡áƒ˜"/>
+<l:template name="June" text="ივნისი"/>
+<l:template name="July" text="ივლისი"/>
+<l:template name="August" text="áƒáƒ’ვისტáƒ"/>
+<l:template name="September" text="სექტემბერი"/>
+<l:template name="October" text="áƒáƒ¥áƒ¢áƒáƒ›áƒ‘ერი"/>
+<l:template name="November" text="ნáƒáƒ”მბერი"/>
+<l:template name="December" text="დეკემბერი"/>
+<l:template name="Monday" text="áƒáƒ áƒ¨áƒáƒ‘áƒáƒ—ი"/>
+<l:template name="Tuesday" text="სáƒáƒ›áƒ¨áƒáƒ‘áƒáƒ—ი"/>
+<l:template name="Wednesday" text="áƒáƒ—ხშáƒáƒ‘áƒáƒ—ი"/>
+<l:template name="Thursday" text="ხუთშáƒáƒ‘áƒáƒ—ი"/>
+<l:template name="Friday" text="პáƒáƒ áƒáƒ¡áƒ™áƒ”ვი"/>
+<l:template name="Saturday" text="შáƒáƒ‘áƒáƒ—ი"/>
+<l:template name="Sunday" text="კვირáƒ"/>
+</l:context>
+<l:context name="datetime-abbrev"><l:template name="Jan" text="იáƒáƒœ"/>
+<l:template name="Feb" text="თებ"/>
+<l:template name="Mar" text="მáƒáƒ "/>
+<l:template name="Apr" text="áƒáƒžáƒ "/>
+<l:template name="May" text="მáƒáƒ˜"/>
+<l:template name="Jun" text="ივნ"/>
+<l:template name="Jul" text="ივლ"/>
+<l:template name="Aug" text="áƒáƒ’ვ"/>
+<l:template name="Sep" text="სექ"/>
+<l:template name="Oct" text="áƒáƒ¥áƒ¢"/>
+<l:template name="Nov" text="ნáƒáƒ”"/>
+<l:template name="Dec" text="დეკ"/>
+<l:template name="Mon" text="áƒáƒ áƒ¨"/>
+<l:template name="Tue" text="სáƒáƒ›"/>
+<l:template name="Wed" text="áƒáƒ—ხ"/>
+<l:template name="Thu" text="ხუთ"/>
+<l:template name="Fri" text="პáƒáƒ "/>
+<l:template name="Sat" text="შáƒáƒ‘"/>
+<l:template name="Sun" text="კვი"/>
+</l:context>
+<l:context name="htmlhelp"><l:template name="langcode" text="0x0409 English (UNITED STATES)"/>
+</l:context>
+<l:context name="index"><l:template name="term-separator" text=", "/>
+<l:template name="number-separator" text=", "/>
+<l:template name="range-separator" text="-"/>
+</l:context>
+<l:context name="iso690"><l:template name="lastfirst.sep" text=", "/>
+<l:template name="alt.person.two.sep" text=" დრ"/>
+<l:template name="alt.person.last.sep" text=" დრ"/>
+<l:template name="alt.person.more.sep" text="; "/>
+<l:template name="primary.editor" text=" (რედ.)"/>
+<l:template name="primary.many" text=" დრსხვ."/>
+<l:template name="primary.sep" text=". "/>
+<l:template name="submaintitle.sep" text=": "/>
+<l:template name="title.sep" text=". "/>
+<l:template name="othertitle.sep" text=", "/>
+<l:template name="medium1" text=" ["/>
+<l:template name="medium2" text="]"/>
+<l:template name="secondary.person.sep" text="; "/>
+<l:template name="secondary.sep" text=". "/>
+<l:template name="respons.sep" text=". "/>
+<l:template name="edition.sep" text=". "/>
+<l:template name="edition.serial.sep" text=", "/>
+<l:template name="issuing.range" text="-"/>
+<l:template name="issuing.div" text=", "/>
+<l:template name="issuing.sep" text=". "/>
+<l:template name="partnr.sep" text=". "/>
+<l:template name="placepubl.sep" text=": "/>
+<l:template name="publyear.sep" text=", "/>
+<l:template name="pubinfo.sep" text=". "/>
+<l:template name="spec.pubinfo.sep" text=", "/>
+<l:template name="upd.sep" text=", "/>
+<l:template name="datecit1" text=" [ციტáƒáƒ¢áƒ "/>
+<l:template name="datecit2" text="]"/>
+<l:template name="extent.sep" text=". "/>
+<l:template name="locs.sep" text=", "/>
+<l:template name="location.sep" text=". "/>
+<l:template name="serie.sep" text=". "/>
+<l:template name="notice.sep" text=". "/>
+<l:template name="access" text="მისáƒáƒ¬áƒ•áƒ“áƒáƒ›áƒ˜áƒ "/>
+<l:template name="acctoo" text="მისáƒáƒ¬áƒ•áƒ“áƒáƒ›áƒ˜áƒ áƒáƒ¡áƒ”ვე "/>
+<l:template name="onwww" text="გლáƒáƒ‘áƒáƒšáƒ£áƒ  ქსელში"/>
+<l:template name="oninet" text="ინტერნეტში"/>
+<l:template name="access.end" text=": "/>
+<l:template name="link1" text="&lt;"/>
+<l:template name="link2" text="&gt;"/>
+<l:template name="access.sep" text=". "/>
+<l:template name="isbn" text="ISBN "/>
+<l:template name="issn" text="ISSN "/>
+<l:template name="stdnum.sep" text=". "/>
+<l:template name="patcountry.sep" text=". "/>
+<l:template name="pattype.sep" text=", "/>
+<l:template name="patnum.sep" text=". "/>
+<l:template name="patdate.sep" text=". "/>
+</l:context><l:letters><l:l i="-1"/>
+<l:l i="0">სიმბáƒáƒšáƒáƒ”ბი</l:l>
+<l:l i="10">A</l:l>
+<l:l i="10">a</l:l>
+<l:l i="20">B</l:l>
+<l:l i="20">b</l:l>
+<l:l i="30">C</l:l>
+<l:l i="30">c</l:l>
+<l:l i="40">D</l:l>
+<l:l i="40">d</l:l>
+<l:l i="50">E</l:l>
+<l:l i="50">e</l:l>
+<l:l i="60">F</l:l>
+<l:l i="60">f</l:l>
+<l:l i="70">G</l:l>
+<l:l i="70">g</l:l>
+<l:l i="80">H</l:l>
+<l:l i="80">h</l:l>
+<l:l i="90">I</l:l>
+<l:l i="90">i</l:l>
+<l:l i="100">J</l:l>
+<l:l i="100">j</l:l>
+<l:l i="110">K</l:l>
+<l:l i="110">k</l:l>
+<l:l i="120">L</l:l>
+<l:l i="120">l</l:l>
+<l:l i="130">M</l:l>
+<l:l i="130">m</l:l>
+<l:l i="140">N</l:l>
+<l:l i="140">n</l:l>
+<l:l i="150">O</l:l>
+<l:l i="150">o</l:l>
+<l:l i="160">P</l:l>
+<l:l i="160">p</l:l>
+<l:l i="170">Q</l:l>
+<l:l i="170">q</l:l>
+<l:l i="180">R</l:l>
+<l:l i="180">r</l:l>
+<l:l i="190">S</l:l>
+<l:l i="190">s</l:l>
+<l:l i="200">T</l:l>
+<l:l i="200">t</l:l>
+<l:l i="210">U</l:l>
+<l:l i="210">u</l:l>
+<l:l i="220">V</l:l>
+<l:l i="220">v</l:l>
+<l:l i="230">W</l:l>
+<l:l i="230">w</l:l>
+<l:l i="240">X</l:l>
+<l:l i="240">x</l:l>
+<l:l i="250">Y</l:l>
+<l:l i="250">y</l:l>
+<l:l i="260">Z</l:l>
+<l:l i="260">z</l:l>
+<l:l i="270">áƒ</l:l>
+<l:l i="280">ბ</l:l>
+<l:l i="290">გ</l:l>
+<l:l i="300">დ</l:l>
+<l:l i="310">ე</l:l>
+<l:l i="320">ვ</l:l>
+<l:l i="330">ზ</l:l>
+<l:l i="340">ჱ</l:l>
+<l:l i="350">თ</l:l>
+<l:l i="360">ი</l:l>
+<l:l i="370">კ</l:l>
+<l:l i="380">ლ</l:l>
+<l:l i="390">მ</l:l>
+<l:l i="400">ნ</l:l>
+<l:l i="410">ჲ</l:l>
+<l:l i="420">áƒ</l:l>
+<l:l i="430">პ</l:l>
+<l:l i="440">ჟ</l:l>
+<l:l i="450">რ</l:l>
+<l:l i="460">ს</l:l>
+<l:l i="470">ტ</l:l>
+<l:l i="480">ჳ</l:l>
+<l:l i="490">უ</l:l>
+<l:l i="500">ფ</l:l>
+<l:l i="510">ქ</l:l>
+<l:l i="520">ღ</l:l>
+<l:l i="530">ყ</l:l>
+<l:l i="540">შ</l:l>
+<l:l i="550">ჩ</l:l>
+<l:l i="560">ც</l:l>
+<l:l i="570">ძ</l:l>
+<l:l i="580">წ</l:l>
+<l:l i="590">ჭ</l:l>
+<l:l i="600">ხ</l:l>
+<l:l i="610">ჴ</l:l>
+<l:l i="620">ჯ</l:l>
+<l:l i="630">ჰ</l:l>
+<l:l i="640">ჵ</l:l>
+<l:l i="650">ჶ</l:l>
+<l:l i="660">ჷ</l:l>
+</l:letters>
+</l:l10n>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/kn.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/kn.xml
new file mode 100644
index 0000000..5c246f1
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/kn.xml
@@ -0,0 +1,1229 @@
+<?xml version="1.0" encoding="utf-8"?>
+<l:l10n xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0" language="kn" english-language-name="Kannada">
+
+<!-- * This file is generated automatically. -->
+<!-- * To submit changes to this file upstream (to the DocBook Project) -->
+<!-- * do not submit an edited version of this file. Instead, submit an -->
+<!-- * edited version of the source file at the following location: -->
+<!-- * -->
+<!-- * https://docbook.svn.sourceforge.net/svnroot/docbook/trunk/gentext/locale/kn.xml -->
+<!-- * -->
+<!-- * E-mail the edited kn.xml source file to: -->
+<!-- * -->
+<!-- * docbook-developers@lists.sourceforge.net -->
+
+<!-- ******************************************************************** -->
+
+<!-- This file is part of the XSL DocBook Stylesheet distribution. -->
+<!-- See ../README or http://docbook.sf.net/release/xsl/current/ for -->
+<!-- copyright and other information. -->
+
+<!-- ******************************************************************** -->
+<!-- In these files, % with a letter is used for a placeholder: -->
+<!-- %t is the current element's title -->
+<!-- %s is the current element's subtitle (if applicable)-->
+<!-- %n is the current element's number label-->
+<!-- %p is the current element's page number (if applicable)-->
+<!-- ******************************************************************** -->
+
+
+<l:gentext key="Abstract" text="ಸಾರಾಂಶ"/>
+<l:gentext key="abstract" text="ಸಾರಾಂಶ"/>
+<l:gentext key="Acknowledgements" text="ಇವರಿಗೆ ಧನà³à²¯à²µà²¾à²¦à²—ಳà³"/>
+<l:gentext key="acknowledgements" text="ಇವರಿಗೆ ಧನà³à²¯à²µà²¾à²¦à²—ಳà³"/>
+<l:gentext key="Answer" text="ಉ:"/>
+<l:gentext key="answer" text="ಉ:"/>
+<l:gentext key="Appendix" text="ಅನà³à²¬à²‚ಧ"/>
+<l:gentext key="appendix" text="ಅನà³à²¬à²‚ಧ"/>
+<l:gentext key="Article" text="ಲೇಖನ"/>
+<l:gentext key="article" text="ಲೇಖನ"/>
+<l:gentext key="Author" text="ಲೇಖಕ"/>
+<l:gentext key="Bibliography" text="ಗà³à²°à²‚ಥಸೂಚಿ"/>
+<l:gentext key="bibliography" text="ಗà³à²°à²‚ಥಸೂಚಿ"/>
+<l:gentext key="Book" text="ಪà³à²¸à³à²¤à²•"/>
+<l:gentext key="book" text="ಪà³à²¸à³à²¤à²•"/>
+<l:gentext key="CAUTION" text="ಎಚà³à²šà²°à²¿à²•à³†"/>
+<l:gentext key="Caution" text="ಎಚà³à²šà²°à²¿à²•à³†"/>
+<l:gentext key="caution" text="ಎಚà³à²šà²°à²¿à²•à³†"/>
+<l:gentext key="Chapter" text="ಅಧà³à²¯à²¾à²¯"/>
+<l:gentext key="chapter" text="ಅಧà³à²¯à²¾à²¯"/>
+<l:gentext key="Colophon" text="ಮà³à²¦à³à²°à²£ ಸಂಕೇತ"/>
+<l:gentext key="colophon" text="ಮà³à²¦à³à²°à²£ ಸಂಕೇತ"/>
+<l:gentext key="Copyright" text="ಕೃತಿಸà³à²µà²¾à²®à³à²¯"/>
+<l:gentext key="copyright" text="ಕೃತಿಸà³à²µà²¾à²®à³à²¯"/>
+<l:gentext key="Dedication" text="ಸಮರà³à²ªà²£à³†"/>
+<l:gentext key="dedication" text="ಸಮರà³à²ªà²£à³†"/>
+<l:gentext key="Edition" text="ಆವೃತà³à²¤à²¿"/>
+<l:gentext key="edition" text="ಆವೃತà³à²¤à²¿"/>
+<l:gentext key="Editor" text="ಸಂಪಾದಕ"/>
+<l:gentext key="Equation" text="ಸಮೀಕರಣ"/>
+<l:gentext key="equation" text="ಸಮೀಕರಣ"/>
+<l:gentext key="Example" text="ಉದಾಹರಣೆ"/>
+<l:gentext key="example" text="ಉದಾಹರಣೆ"/>
+<l:gentext key="Figure" text="ಚಿತà³à²°"/>
+<l:gentext key="figure" text="ಚಿತà³à²°"/>
+<l:gentext key="Glossary" text="ಪಾರಿಭಾಷಿಕಕೋಶ"/>
+<l:gentext key="glossary" text="ಪಾರಿಭಾಷಿಕಕೋಶ"/>
+<l:gentext key="GlossSee" text="ಇದನà³à²¨à³ ನೋಡಿ"/>
+<l:gentext key="glosssee" text="ಇದನà³à²¨à³ ನೋಡಿ"/>
+<l:gentext key="GlossSeeAlso" text="ಇದನà³à²¨à³‚ ಸಹ ನೋಡಿ"/>
+<l:gentext key="glossseealso" text="ಇದನà³à²¨à³‚ ಸಹ ನೋಡಿ"/>
+<l:gentext key="IMPORTANT" text="ಮಹತà³à²µ"/>
+<l:gentext key="important" text="ಮಹತà³à²µ"/>
+<l:gentext key="Important" text="ಮಹತà³à²µ"/>
+<l:gentext key="Index" text="ಅನà³à²•à³à²°à²®à²£à²¿à²•à³†"/>
+<l:gentext key="index" text="ಅನà³à²•à³à²°à²®à²£à²¿à²•à³†"/>
+<l:gentext key="ISBN" text="ISBN"/>
+<l:gentext key="isbn" text="ISBN"/>
+<l:gentext key="LegalNotice" text="ಲೀಗಲೠನೋಟೀಸà³"/>
+<l:gentext key="legalnotice" text="ಲೀಗಲೠನೋಟೀಸà³"/>
+<l:gentext key="MsgAud" text="ಶà³à²°à³‹à²¤à³ƒà²—ಳà³"/>
+<l:gentext key="msgaud" text="ಶà³à²°à³‹à²¤à³ƒà²—ಳà³"/>
+<l:gentext key="MsgLevel" text="ಸà³à²¤à²°"/>
+<l:gentext key="msglevel" text="ಸà³à²¤à²°"/>
+<l:gentext key="MsgOrig" text="ಮೂಲ"/>
+<l:gentext key="msgorig" text="ಮೂಲ"/>
+<l:gentext key="NOTE" text="ಸೂಚನೆ"/>
+<l:gentext key="Note" text="ಸೂಚನೆ"/>
+<l:gentext key="note" text="ಸೂಚನೆ"/>
+<l:gentext key="Part" text="ಭಾಗ"/>
+<l:gentext key="part" text="ಭಾಗ"/>
+<l:gentext key="Preface" text="ಪೀಠಿಕೆ"/>
+<l:gentext key="preface" text="ಪೀಠಿಕೆ"/>
+<l:gentext key="Procedure" text="ಕಾರà³à²¯à²µà²¿à²§à²¾à²¨"/>
+<l:gentext key="procedure" text="ಕಾರà³à²¯à²µà²¿à²§à²¾à²¨"/>
+<l:gentext key="ProductionSet" text="ನಿರà³à²®à²¾à²£"/>
+<l:gentext key="PubDate" text="ಪà³à²°à²•à²Ÿà²¨à³† ದಿನಾಂಕ"/>
+<l:gentext key="pubdate" text="ಪà³à²°à²•à²Ÿà²¨à³† ದಿನಾಂಕ"/>
+<l:gentext key="Published" text="ಪà³à²°à²•à²¾à²¶à²ªà²¡à²¿à²¸à²¿à²¦"/>
+<l:gentext key="published" text="ಪà³à²°à²•à²¾à²¶à²ªà²¡à²¿à²¸à²¿à²¦"/>
+<l:gentext key="Publisher" text="ಪà³à²°à²•à²¾à²¶à²•"/>
+<l:gentext key="Qandadiv" text="ಪà³à²°à²¶à³à²¨à³† ಮತà³à²¤à³ ಉತà³à²¤à²°"/>
+<l:gentext key="qandadiv" text="ಪà³à²°à²¶à³à²¨à³† ಮತà³à²¤à³ ಉತà³à²¤à²°"/>
+<l:gentext key="QandASet" text="ಪದೆ ಪದೆ ಕೇಳಲಾಗà³à²µ ಪà³à²°à²¶à³à²¨à³†à²—ಳà³"/>
+<l:gentext key="Question" text="ಪà³à²°à²¶à³à²¨à³†:"/>
+<l:gentext key="question" text="ಪà³à²°à²¶à³à²¨à³†:"/>
+<l:gentext key="RefEntry" text="ಪà³à²Ÿ"/>
+<l:gentext key="refentry" text="ಪà³à²Ÿ"/>
+<l:gentext key="Reference" text="ಉಲà³à²²à³‡à²–"/>
+<l:gentext key="reference" text="ಉಲà³à²²à³‡à²–"/>
+<l:gentext key="References" text="ಉಲà³à²²à³‡à²–ಗಳà³"/>
+<l:gentext key="RefName" text="ಹೆಸರà³"/>
+<l:gentext key="refname" text="ಹೆಸರà³"/>
+<l:gentext key="RefSection" text="ವಿಭಾಗ"/>
+<l:gentext key="refsection" text="ವಿಭಾಗ"/>
+<l:gentext key="RefSynopsisDiv" text="ಸಾರಾಂಶ"/>
+<l:gentext key="refsynopsisdiv" text="ಸಾರಾಂಶ"/>
+<l:gentext key="RevHistory" text="ಪರಿಷà³à²•à²°à²£à³†à²¯ ಇತಿಹಾಸ"/>
+<l:gentext key="revhistory" text="ಪರಿಷà³à²•à²°à²£à³†à²¯ ಇತಿಹಾಸ"/>
+<l:gentext key="revision" text="ಪರಿಷà³à²•à²°à²£à³†"/>
+<l:gentext key="Revision" text="ಪರಿಷà³à²•à²°à²£à³†"/>
+<l:gentext key="sect1" text="ವಿಭಾಗ"/>
+<l:gentext key="sect2" text="ವಿಭಾಗ"/>
+<l:gentext key="sect3" text="ವಿಭಾಗ"/>
+<l:gentext key="sect4" text="ವಿಭಾಗ"/>
+<l:gentext key="sect5" text="ವಿಭಾಗ"/>
+<l:gentext key="section" text="ವಿಭಾಗ"/>
+<l:gentext key="Section" text="ವಿಭಾಗ"/>
+<l:gentext key="see" text="ಇದನà³à²¨à³ ನೋಡಿ"/>
+<l:gentext key="See" text="ಇದನà³à²¨à³ ನೋಡಿ"/>
+<l:gentext key="seealso" text="ಇದನà³à²¨à³‚ ಸಹ ನೋಡಿ"/>
+<l:gentext key="Seealso" text="ಇದನà³à²¨à³‚ ಸಹ ನೋಡಿ"/>
+<l:gentext key="SeeAlso" text="ಇದನà³à²¨à³‚ ಸಹ ನೋಡಿ"/>
+<l:gentext key="set" text="ಹೊಂದಿಸà³"/>
+<l:gentext key="Set" text="ಹೊಂದಿಸà³"/>
+<l:gentext key="setindex" text="ಅನà³à²•à³à²°à²®à²£à²¿à²•à³† ಹೊಂದಿಸà³"/>
+<l:gentext key="SetIndex" text="ಅನà³à²•à³à²°à²®à²£à²¿à²•à³† ಹೊಂದಿಸà³"/>
+<l:gentext key="Sidebar" text="ಬದಿಪಟà³à²Ÿà²¿à²•à³†"/>
+<l:gentext key="sidebar" text="ಬದಿಪಟà³à²Ÿà²¿à²•à³†"/>
+<l:gentext key="step" text="ಹಂತ"/>
+<l:gentext key="Step" text="ಹಂತ"/>
+<l:gentext key="table" text="ಕೋಷà³à²Ÿà²•"/>
+<l:gentext key="Table" text="ಕೋಷà³à²Ÿà²•"/>
+<l:gentext key="task" text="ಕಾರà³à²¯"/>
+<l:gentext key="Task" text="ಕಾರà³à²¯"/>
+<l:gentext key="tip" text="ಕಿವಿಮಾತà³"/>
+<l:gentext key="TIP" text="ಕಿವಿಮಾತà³"/>
+<l:gentext key="Tip" text="ಕಿವಿಮಾತà³"/>
+<l:gentext key="Warning" text="ಎಚà³à²šà²°à²¿à²•à³†"/>
+<l:gentext key="warning" text="ಎಚà³à²šà²°à²¿à²•à³†"/>
+<l:gentext key="WARNING" text="ಎಚà³à²šà²°à²¿à²•à³†"/>
+<l:gentext key="and" text="ಮತà³à²¤à³"/>
+<l:gentext key="by" text="ಯಿಂದ"/>
+<l:gentext key="Edited" text="ಸಂಪಾದಿಸಿದ"/>
+<l:gentext key="edited" text="ಸಂಪಾದಿಸಿದ"/>
+<l:gentext key="Editedby" text="ಸಂಪಾದಕ"/>
+<l:gentext key="editedby" text="ಸಂಪಾದಕ"/>
+<l:gentext key="in" text="in"/>
+<l:gentext key="lastlistcomma" text=","/>
+<l:gentext key="listcomma" text=","/>
+<l:gentext key="notes" text="ಟಿಪà³à²ªà²£à²¿à²—ಳà³"/>
+<l:gentext key="Notes" text="ಟಿಪà³à²ªà²£à²¿à²—ಳà³"/>
+<l:gentext key="Pgs" text="ಪà³à²Ÿà²—ಳà³."/>
+<l:gentext key="pgs" text="ಪà³à²Ÿà²—ಳà³."/>
+<l:gentext key="Revisedby" text="ಪರಿಷà³à²•à²°à²¿à²¸à²¿à²¦à²µà²°à³: "/>
+<l:gentext key="revisedby" text="ಪರಿಷà³à²•à²°à²¿à²¸à²¿à²¦à²µà²°à³: "/>
+<l:gentext key="TableNotes" text="ಟಿಪà³à²ªà²£à²¿à²—ಳà³"/>
+<l:gentext key="tablenotes" text="ಟಿಪà³à²ªà²£à²¿à²—ಳà³"/>
+<l:gentext key="TableofContents" text="ವಿಷಯಾನà³à²•à³à²°à²®à²£à²¿à²•à³†"/>
+<l:gentext key="tableofcontents" text="ವಿಷಯಾನà³à²•à³à²°à²®à²£à²¿à²•à³†"/>
+<l:gentext key="unexpectedelementname" text="ಅನಿರೀಕà³à²·à²¿à²¤ ವಸà³à²¤à³à²µà²¿à²¨ ಹೆಸರà³"/>
+<l:gentext key="unsupported" text="ಬೆಂಬಲವಿರದ"/>
+<l:gentext key="xrefto" text="xref ಗಾಗಿ"/>
+<l:gentext key="Authors" text="ಕತೃಗಳà³"/>
+<l:gentext key="copyeditor" text="ಪà³à²°à²¤à²¿à²¯ ಸಂಪಾದಕ"/>
+<l:gentext key="graphicdesigner" text="ಗà³à²°à²¾à²«à²¿à²•à³ ವಿನà³à²¯à²¾à²¸à²—ಾರ"/>
+<l:gentext key="productioneditor" text="ನಿರà³à²®à²¾à²£ ಸಂಪಾದಕ"/>
+<l:gentext key="technicaleditor" text="ತಾಂತà³à²°à²¿à²• ಸಂಪಾದಕ"/>
+<l:gentext key="translator" text="ಅನà³à²µà²¾à²¦à²•"/>
+<l:gentext key="listofequations" text="ಸಮೀಕರಣಪಟà³à²Ÿà²¿ "/>
+<l:gentext key="ListofEquations" text="ಸಮೀಕರಣಪಟà³à²Ÿà²¿ "/>
+<l:gentext key="ListofExamples" text="ಉದಾಹರಣೆಗಳ ಪಟà³à²Ÿà²¿"/>
+<l:gentext key="listofexamples" text="ಉದಾಹರಣೆಗಳ ಪಟà³à²Ÿà²¿"/>
+<l:gentext key="ListofFigures" text="ಆಕೃತಿಗಳ ಪಟà³à²Ÿà²¿"/>
+<l:gentext key="listoffigures" text="ಆಕೃತಿಗಳ ಪಟà³à²Ÿà²¿"/>
+<l:gentext key="ListofProcedures" text="ಕಾರà³à²¯à²µà²¿à²§à²¾à²¨à²—ಳ ಪಟà³à²Ÿà²¿"/>
+<l:gentext key="listofprocedures" text="ಕಾರà³à²¯à²µà²¿à²§à²¾à²¨à²—ಳ ಪಟà³à²Ÿà²¿"/>
+<l:gentext key="listoftables" text="ಕೋಷà³à²Ÿà²•à²—ಳ ಪಟà³à²Ÿà²¿"/>
+<l:gentext key="ListofTables" text="ಕೋಷà³à²Ÿà²•à²—ಳ ಪಟà³à²Ÿà²¿"/>
+<l:gentext key="ListofUnknown" text="ತಿಳಿಯದೆ ಇರà³à²µà²µà³à²—ಳ ಪಟà³à²Ÿà²¿"/>
+<l:gentext key="listofunknown" text="ತಿಳಿಯದೆ ಇರà³à²µà²µà³à²—ಳ ಪಟà³à²Ÿà²¿"/>
+<l:gentext key="nav-home" text="ಮನೆ"/>
+<l:gentext key="nav-next" text="ಮà³à²‚ದಿನ"/>
+<l:gentext key="nav-next-sibling" text="ಮà³à²‚ದಕà³à²•à³† ಓಡಿಸà³"/>
+<l:gentext key="nav-prev" text="ಹಿಂದಿನ"/>
+<l:gentext key="nav-prev-sibling" text="ಹಿಂದಕà³à²•à³† ಓಡಿಸà³"/>
+<l:gentext key="nav-up" text="ಮೇಲೆ"/>
+<l:gentext key="nav-toc" text="ವಿಷಯ ಸೂಚಿ"/>
+<l:gentext key="Draft" text="ಕರಡೠಪà³à²°à²¤à²¿"/>
+<l:gentext key="above" text="ಮೇಲೆ"/>
+<l:gentext key="below" text="ಕೆಳಗೆ"/>
+<l:gentext key="sectioncalled" text="ಕೋರಲಾದ ವಿಭಾಗ"/>
+<l:gentext key="index symbols" text="ಸಂಕೇತಗಳà³"/>
+<l:gentext key="writing-mode" text="lr-tb"/>
+<l:gentext key="lowercase.alpha" text="abcdefghijklmnopqrstuvwxyz"/>
+<l:gentext key="uppercase.alpha" text="ABCDEFGHIJKLMNOPQRSTUVWXYZ"/>
+<l:gentext key="normalize.sort.input" text="AaÀàÃáÂâÃãÄäÅåĀÄĂ㥹ÇǎǞǟǠǡǺǻȀÈȂȃȦȧḀá¸áºšáº áº¡áº¢áº£áº¤áº¥áº¦áº§áº¨áº©áºªáº«áº¬áº­áº®áº¯áº°áº±áº²áº³áº´áºµáº¶áº·BbÆ€ÆɓƂƃḂḃḄḅḆḇCcÇçĆćĈĉĊċČÄƇƈɕḈḉDdÄŽÄÄđƊɗƋƌDžDzȡɖḊḋḌá¸á¸Žá¸á¸á¸‘ḒḓEeÈèÉéÊêËëĒēĔĕĖėĘęĚěȄȅȆȇȨȩḔḕḖḗḘḙḚḛḜá¸áº¸áº¹áººáº»áº¼áº½áº¾áº¿á»€á»á»‚ểỄễỆệFfƑƒḞḟGgÄœÄĞğĠġĢģƓɠǤǥǦǧǴǵḠḡHhĤĥĦħȞȟɦḢḣḤḥḦḧḨḩḪḫẖIiÌìÃíÎîÃïĨĩĪīĬĭĮįİƗɨÇÇȈȉȊȋḬḭḮḯỈỉỊịJjĴĵǰÊKkĶķƘƙǨǩḰḱḲḳḴḵLlĹĺĻļĽľĿŀÅłƚLjȴɫɬɭḶḷḸḹḺḻḼḽMmɱḾḿṀá¹á¹‚ṃNnÑñŃńŅņŇňÆɲƞȠNjǸǹȵɳṄṅṆṇṈṉṊṋOoÒòÓóÔôÕõÖöØøŌÅÅŽÅÅőƟƠơǑǒǪǫǬǭǾǿȌÈÈŽÈȪȫȬȭȮȯȰȱṌá¹á¹Žá¹á¹á¹‘ṒṓỌá»á»Žá»á»á»‘ỒồỔổỖỗỘộỚớỜá»á»žá»Ÿá» á»¡á»¢á»£PpƤƥṔṕṖṗQqÊ RrŔŕŖŗŘřÈȑȒȓɼɽɾṘṙṚṛṜá¹á¹žá¹ŸSsŚśŜÅŞşŠšȘșʂṠṡṢṣṤṥṦṧṨṩTtŢţŤťŦŧƫƬƭƮʈȚțȶṪṫṬṭṮṯṰṱẗUuÙùÚúÛûÜüŨũŪūŬŭŮůŰűŲųƯưǓǔǕǖǗǘǙǚǛǜȔȕȖȗṲṳṴṵṶṷṸṹṺṻỤụỦủỨứỪừỬửỮữỰựVvƲʋṼṽṾṿWwŴŵẀáºáº‚ẃẄẅẆẇẈẉẘXxẊẋẌáºYyÃýÿŸŶŷƳƴȲȳẎáºáº™á»²á»³á»´á»µá»¶á»·á»¸á»¹ZzŹźŻżŽžƵƶȤȥÊÊ‘áºáº‘ẒẓẔẕẕ" lang="en"/>
+<l:gentext key="normalize.sort.output" text="AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBCCCCCCCCCCCCCCCCCDDDDDDDDDDDDDDDDDDDDDDDDEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEFFFFFFGGGGGGGGGGGGGGGGGGGGHHHHHHHHHHHHHHHHHHHHIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIJJJJJJKKKKKKKKKKKKKKLLLLLLLLLLLLLLLLLLLLLLLLLLMMMMMMMMMNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOPPPPPPPPQQQRRRRRRRRRRRRRRRRRRRRRRRSSSSSSSSSSSSSSSSSSSSSSSTTTTTTTTTTTTTTTTTTTTTTTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUVVVVVVVVWWWWWWWWWWWWWWWXXXXXXYYYYYYYYYYYYYYYYYYYYYYYZZZZZZZZZZZZZZZZZZZZZ" lang="en"/>
+<l:dingbat key="startquote" text="“"/>
+<l:dingbat key="endquote" text="â€"/>
+<l:dingbat key="nestedstartquote" text="‘"/>
+<l:dingbat key="nestedendquote" text="’"/>
+<l:dingbat key="singlestartquote" text="‘"/>
+<l:dingbat key="singleendquote" text="’"/>
+<l:dingbat key="bullet" text="•"/>
+<l:gentext key="hyphenation-character" text="-"/>
+<l:gentext key="hyphenation-push-character-count" text="2"/>
+<l:gentext key="hyphenation-remain-character-count" text="2"/>
+<l:context name="styles"><l:template name="person-name" text="first-last"/>
+</l:context>
+<l:context name="title"><l:template name="abstract" text="%t"/>
+<l:template name="acknowledgements" text="%t" lang="en"/>
+<l:template name="answer" text="%t"/>
+<l:template name="appendix" text="ಅನà³à²¬à²‚ಧ %n. %t"/>
+<l:template name="article" text="%t"/>
+<l:template name="authorblurb" text="%t"/>
+<l:template name="bibliodiv" text="%t"/>
+<l:template name="biblioentry" text="%t"/>
+<l:template name="bibliography" text="%t"/>
+<l:template name="bibliolist" text="%t"/>
+<l:template name="bibliomixed" text="%t"/>
+<l:template name="bibliomset" text="%t"/>
+<l:template name="biblioset" text="%t"/>
+<l:template name="blockquote" text="%t"/>
+<l:template name="book" text="%t"/>
+<l:template name="calloutlist" text="%t"/>
+<l:template name="caution" text="%t"/>
+<l:template name="chapter" text="ಅಧà³à²¯à²¾à²¯Â %n. %t"/>
+<l:template name="colophon" text="%t"/>
+<l:template name="dedication" text="%t"/>
+<l:template name="equation" text="ಸಮೀಕರಣ %n. %t"/>
+<l:template name="example" text="ಉದಾಹರಣೆ %n. %t"/>
+<l:template name="figure" text="ಚಿತà³à²°Â %n. %t"/>
+<l:template name="foil" text="%t"/>
+<l:template name="foilgroup" text="%t"/>
+<l:template name="formalpara" text="%t"/>
+<l:template name="glossary" text="%t"/>
+<l:template name="glossdiv" text="%t"/>
+<l:template name="glosslist" text="%t"/>
+<l:template name="glossentry" text="%t"/>
+<l:template name="important" text="%t"/>
+<l:template name="index" text="%t"/>
+<l:template name="indexdiv" text="%t"/>
+<l:template name="itemizedlist" text="%t"/>
+<l:template name="legalnotice" text="%t"/>
+<l:template name="listitem" text=""/>
+<l:template name="lot" text="%t"/>
+<l:template name="msg" text="%t"/>
+<l:template name="msgexplan" text="%t"/>
+<l:template name="msgmain" text="%t"/>
+<l:template name="msgrel" text="%t"/>
+<l:template name="msgset" text="%t"/>
+<l:template name="msgsub" text="%t"/>
+<l:template name="note" text="%t"/>
+<l:template name="orderedlist" text="%t"/>
+<l:template name="part" text="ಭಾಗ %n. %t"/>
+<l:template name="partintro" text="%t"/>
+<l:template name="preface" text="%t"/>
+<l:template name="procedure" text="%t"/>
+<l:template name="procedure.formal" text="ಕಾರà³à²¯à²µà²¿à²§à²¾à²¨Â %n. %t"/>
+<l:template name="productionset" text="%t"/>
+<l:template name="productionset.formal" text="ನಿರà³à²®à²¾à²£Â %n"/>
+<l:template name="qandadiv" text="%t"/>
+<l:template name="qandaentry" text="%t"/>
+<l:template name="qandaset" text="%t"/>
+<l:template name="question" text="%t"/>
+<l:template name="refentry" text="%t"/>
+<l:template name="reference" text="%t"/>
+<l:template name="refsection" text="%t"/>
+<l:template name="refsect1" text="%t"/>
+<l:template name="refsect2" text="%t"/>
+<l:template name="refsect3" text="%t"/>
+<l:template name="refsynopsisdiv" text="%t"/>
+<l:template name="refsynopsisdivinfo" text="%t"/>
+<l:template name="segmentedlist" text="%t"/>
+<l:template name="set" text="%t"/>
+<l:template name="setindex" text="%t"/>
+<l:template name="sidebar" text="%t"/>
+<l:template name="step" text="%t"/>
+<l:template name="table" text="ಕೋಷà³à²Ÿà²•Â %n. %t"/>
+<l:template name="task" text="%t"/>
+<l:template name="tasksummary" text="%t" lang="en"/>
+<l:template name="taskprerequisites" text="%t" lang="en"/>
+<l:template name="taskrelated" text="%t" lang="en"/>
+<l:template name="tip" text="%t"/>
+<l:template name="toc" text="%t"/>
+<l:template name="variablelist" text="%t"/>
+<l:template name="varlistentry" text=""/>
+<l:template name="warning" text="%t"/>
+</l:context>
+<l:context name="title-unnumbered"><l:template name="appendix" text="%t"/>
+<l:template name="article/appendix" text="%t"/>
+<l:template name="bridgehead" text="%t"/>
+<l:template name="chapter" text="%t"/>
+<l:template name="sect1" text="%t"/>
+<l:template name="sect2" text="%t"/>
+<l:template name="sect3" text="%t"/>
+<l:template name="sect4" text="%t"/>
+<l:template name="sect5" text="%t"/>
+<l:template name="section" text="%t"/>
+<l:template name="simplesect" text="%t"/>
+<l:template name="part" text="%t" lang="en"/>
+</l:context>
+<l:context name="title-numbered"><l:template name="appendix" text="ಅನà³à²¬à²‚ಧ %n. %t"/>
+<l:template name="article/appendix" text="%n. %t"/>
+<l:template name="bridgehead" text="%n. %t"/>
+<l:template name="chapter" text="ಅಧà³à²¯à²¾à²¯Â %n. %t"/>
+<l:template name="part" text="ಭಾಗ %n. %t"/>
+<l:template name="sect1" text="%n. %t"/>
+<l:template name="sect2" text="%n. %t"/>
+<l:template name="sect3" text="%n. %t"/>
+<l:template name="sect4" text="%n. %t"/>
+<l:template name="sect5" text="%n. %t"/>
+<l:template name="section" text="%n. %t"/>
+<l:template name="simplesect" text="%t"/>
+</l:context>
+<l:context name="subtitle"><l:template name="appendix" text="%s"/>
+<l:template name="acknowledgements" text="%s" lang="en"/>
+<l:template name="article" text="%s"/>
+<l:template name="bibliodiv" text="%s"/>
+<l:template name="biblioentry" text="%s"/>
+<l:template name="bibliography" text="%s"/>
+<l:template name="bibliomixed" text="%s"/>
+<l:template name="bibliomset" text="%s"/>
+<l:template name="biblioset" text="%s"/>
+<l:template name="book" text="%s"/>
+<l:template name="chapter" text="%s"/>
+<l:template name="colophon" text="%s"/>
+<l:template name="dedication" text="%s"/>
+<l:template name="glossary" text="%s"/>
+<l:template name="glossdiv" text="%s"/>
+<l:template name="index" text="%s"/>
+<l:template name="indexdiv" text="%s"/>
+<l:template name="lot" text="%s"/>
+<l:template name="part" text="%s"/>
+<l:template name="partintro" text="%s"/>
+<l:template name="preface" text="%s"/>
+<l:template name="refentry" text="%s"/>
+<l:template name="reference" text="%s"/>
+<l:template name="refsection" text="%s"/>
+<l:template name="refsect1" text="%s"/>
+<l:template name="refsect2" text="%s"/>
+<l:template name="refsect3" text="%s"/>
+<l:template name="refsynopsisdiv" text="%s"/>
+<l:template name="sect1" text="%s"/>
+<l:template name="sect2" text="%s"/>
+<l:template name="sect3" text="%s"/>
+<l:template name="sect4" text="%s"/>
+<l:template name="sect5" text="%s"/>
+<l:template name="section" text="%s"/>
+<l:template name="set" text="%s"/>
+<l:template name="setindex" text="%s"/>
+<l:template name="sidebar" text="%s"/>
+<l:template name="simplesect" text="%s"/>
+<l:template name="toc" text="%s"/>
+</l:context>
+<l:context name="xref"><l:template name="abstract" text="%t"/>
+<l:template name="acknowledgements" text="%t" lang="en"/>
+<l:template name="answer" text="ಉ: %n"/>
+<l:template name="appendix" text="%t"/>
+<l:template name="article" text="%t"/>
+<l:template name="authorblurb" text="%t"/>
+<l:template name="bibliodiv" text="%t"/>
+<l:template name="bibliography" text="%t"/>
+<l:template name="bibliomset" text="%t"/>
+<l:template name="biblioset" text="%t"/>
+<l:template name="blockquote" text="%t"/>
+<l:template name="book" text="%t"/>
+<l:template name="calloutlist" text="%t"/>
+<l:template name="caution" text="%t"/>
+<l:template name="chapter" text="%t"/>
+<l:template name="colophon" text="%t"/>
+<l:template name="constraintdef" text="%t"/>
+<l:template name="dedication" text="%t"/>
+<l:template name="equation" text="%t"/>
+<l:template name="example" text="%t"/>
+<l:template name="figure" text="%t"/>
+<l:template name="foil" text="%t"/>
+<l:template name="foilgroup" text="%t"/>
+<l:template name="formalpara" text="%t"/>
+<l:template name="glossary" text="%t"/>
+<l:template name="glossdiv" text="%t"/>
+<l:template name="important" text="%t"/>
+<l:template name="index" text="%t"/>
+<l:template name="indexdiv" text="%t"/>
+<l:template name="itemizedlist" text="%t"/>
+<l:template name="legalnotice" text="%t"/>
+<l:template name="listitem" text="%n"/>
+<l:template name="lot" text="%t"/>
+<l:template name="msg" text="%t"/>
+<l:template name="msgexplan" text="%t"/>
+<l:template name="msgmain" text="%t"/>
+<l:template name="msgrel" text="%t"/>
+<l:template name="msgset" text="%t"/>
+<l:template name="msgsub" text="%t"/>
+<l:template name="note" text="%t"/>
+<l:template name="orderedlist" text="%t"/>
+<l:template name="part" text="%t"/>
+<l:template name="partintro" text="%t"/>
+<l:template name="preface" text="%t"/>
+<l:template name="procedure" text="%t"/>
+<l:template name="productionset" text="%t"/>
+<l:template name="qandadiv" text="%t"/>
+<l:template name="qandaentry" text="ಪà³à²°à²¶à³à²¨à³†: %n"/>
+<l:template name="qandaset" text="%t"/>
+<l:template name="question" text="ಪà³à²°à²¶à³à²¨à³†: %n"/>
+<l:template name="reference" text="%t"/>
+<l:template name="refsynopsisdiv" text="%t"/>
+<l:template name="segmentedlist" text="%t"/>
+<l:template name="set" text="%t"/>
+<l:template name="setindex" text="%t"/>
+<l:template name="sidebar" text="%t"/>
+<l:template name="table" text="%t"/>
+<l:template name="task" text="%t" lang="en"/>
+<l:template name="tip" text="%t"/>
+<l:template name="toc" text="%t"/>
+<l:template name="variablelist" text="%t"/>
+<l:template name="varlistentry" text="%n"/>
+<l:template name="warning" text="%t"/>
+<l:template name="olink.document.citation" text=" in %o"/>
+<l:template name="olink.page.citation" text=" (page %p)"/>
+<l:template name="page.citation" text=" [%p]"/>
+<l:template name="page" text="(page %p)"/>
+<l:template name="docname" text=" in %o"/>
+<l:template name="docnamelong" text=" in the document titled %o"/>
+<l:template name="pageabbrev" text="(p. %p)"/>
+<l:template name="Page" text="Page %p"/>
+<l:template name="bridgehead" text="ಕೋರಲಾದ ವಿಭಾಗ “%tâ€"/>
+<l:template name="refsection" text="ಕೋರಲಾದ ವಿಭಾಗ “%tâ€"/>
+<l:template name="refsect1" text="ಕೋರಲಾದ ವಿಭಾಗ “%tâ€"/>
+<l:template name="refsect2" text="ಕೋರಲಾದ ವಿಭಾಗ “%tâ€"/>
+<l:template name="refsect3" text="ಕೋರಲಾದ ವಿಭಾಗ “%tâ€"/>
+<l:template name="sect1" text="ಕೋರಲಾದ ವಿಭಾಗ “%tâ€"/>
+<l:template name="sect2" text="ಕೋರಲಾದ ವಿಭಾಗ “%tâ€"/>
+<l:template name="sect3" text="ಕೋರಲಾದ ವಿಭಾಗ “%tâ€"/>
+<l:template name="sect4" text="ಕೋರಲಾದ ವಿಭಾಗ “%tâ€"/>
+<l:template name="sect5" text="ಕೋರಲಾದ ವಿಭಾಗ “%tâ€"/>
+<l:template name="section" text="ಕೋರಲಾದ ವಿಭಾಗ “%tâ€"/>
+<l:template name="simplesect" text="ಕೋರಲಾದ ವಿಭಾಗ “%tâ€"/>
+</l:context>
+<l:context name="xref-number"><l:template name="answer" text="ಉ: %n"/>
+<l:template name="appendix" text="ಅನà³à²¬à²‚ಧ %n"/>
+<l:template name="bridgehead" text="ವಿಭಾಗ %n"/>
+<l:template name="chapter" text="ಅಧà³à²¯à²¾à²¯Â %n"/>
+<l:template name="equation" text="ಸಮೀಕರಣ %n"/>
+<l:template name="example" text="ಉದಾಹರಣೆ %n"/>
+<l:template name="figure" text="ಚಿತà³à²°Â %n"/>
+<l:template name="part" text="ಭಾಗ %n"/>
+<l:template name="procedure" text="ಕಾರà³à²¯à²µà²¿à²§à²¾à²¨Â %n"/>
+<l:template name="productionset" text="ನಿರà³à²®à²¾à²£Â %n"/>
+<l:template name="qandadiv" text="ಪà³à²°à²¶à³à²¨à³† ಮತà³à²¤à³ ಉತà³à²¤à²°Â %n"/>
+<l:template name="qandaentry" text="ಪà³à²°à²¶à³à²¨à³†: %n"/>
+<l:template name="question" text="ಪà³à²°à²¶à³à²¨à³†: %n"/>
+<l:template name="sect1" text="ವಿಭಾಗ %n"/>
+<l:template name="sect2" text="ವಿಭಾಗ %n"/>
+<l:template name="sect3" text="ವಿಭಾಗ %n"/>
+<l:template name="sect4" text="ವಿಭಾಗ %n"/>
+<l:template name="sect5" text="ವಿಭಾಗ %n"/>
+<l:template name="section" text="ವಿಭಾಗ %n"/>
+<l:template name="table" text="ಕೋಷà³à²Ÿà²•Â %n"/>
+</l:context>
+<l:context name="xref-number-and-title"><l:template name="appendix" text="ಅನà³à²¬à²‚ಧ %n, %t"/>
+<l:template name="bridgehead" text="ವಿಭಾಗ %n, “%tâ€"/>
+<l:template name="chapter" text="ಅಧà³à²¯à²¾à²¯Â %n, %t"/>
+<l:template name="equation" text="ಸಮೀಕರಣ %n, “%tâ€"/>
+<l:template name="example" text="ಉದಾಹರಣೆ %n, “%tâ€"/>
+<l:template name="figure" text="ಚಿತà³à²°Â %n, “%tâ€"/>
+<l:template name="part" text="ಭಾಗ %n, “%tâ€"/>
+<l:template name="procedure" text="ಕಾರà³à²¯à²µà²¿à²§à²¾à²¨Â %n, “%tâ€"/>
+<l:template name="productionset" text="ನಿರà³à²®à²¾à²£Â %n, “%tâ€"/>
+<l:template name="qandadiv" text="ಪà³à²°à²¶à³à²¨à³† ಮತà³à²¤à³ ಉತà³à²¤à²°Â %n, “%tâ€"/>
+<l:template name="refsect1" text="ಕೋರಲಾದ ವಿಭಾಗ “%tâ€"/>
+<l:template name="refsect2" text="ಕೋರಲಾದ ವಿಭಾಗ “%tâ€"/>
+<l:template name="refsect3" text="ಕೋರಲಾದ ವಿಭಾಗ “%tâ€"/>
+<l:template name="refsection" text="ಕೋರಲಾದ ವಿಭಾಗ “%tâ€"/>
+<l:template name="sect1" text="ವಿಭಾಗ %n, “%tâ€"/>
+<l:template name="sect2" text="ವಿಭಾಗ %n, “%tâ€"/>
+<l:template name="sect3" text="ವಿಭಾಗ %n, “%tâ€"/>
+<l:template name="sect4" text="ವಿಭಾಗ %n, “%tâ€"/>
+<l:template name="sect5" text="ವಿಭಾಗ %n, “%tâ€"/>
+<l:template name="section" text="ವಿಭಾಗ %n, “%tâ€"/>
+<l:template name="simplesect" text="ಕೋರಲಾದ ವಿಭಾಗ “%tâ€"/>
+<l:template name="table" text="ಕೋಷà³à²Ÿà²•Â %n, “%tâ€"/>
+</l:context>
+<l:context name="authorgroup"><l:template name="sep" text=", "/>
+<l:template name="sep2" text=" ಮತà³à²¤à³ "/>
+<l:template name="seplast" text=", ಮತà³à²¤à³ "/>
+</l:context>
+<l:context name="glossary"><l:template name="see" text="ಇದನà³à²¨à³ ನೋಡಿ %t"/>
+<l:template name="seealso" text="ಇದನà³à²¨à³‚ ಸಹ ನೋಡಿ %t"/>
+<l:template name="seealso-separator" text=", " lang="en"/>
+</l:context>
+<l:context name="msgset"><l:template name="MsgAud" text="ಶà³à²°à³‹à²¤à³ƒà²—ಳà³: "/>
+<l:template name="MsgLevel" text="ಸà³à²¤à²°: "/>
+<l:template name="MsgOrig" text="ಮೂಲ: "/>
+</l:context>
+<l:context name="datetime"><l:template name="format" text="d/m/Y"/>
+</l:context>
+<l:context name="termdef"><l:template name="prefix" text="[Definition: "/>
+<l:template name="suffix" text="]"/>
+</l:context>
+<l:context name="datetime-full"><l:template name="January" text="ಜನೆವರಿ"/>
+<l:template name="February" text="ಫೆಬà³à²°à³à²µà²°à²¿"/>
+<l:template name="March" text="ಮಾರà³à²šà³"/>
+<l:template name="April" text="à²à²ªà³à²°à²²à³"/>
+<l:template name="May" text="ಮೇ"/>
+<l:template name="June" text="ಜೂನà³"/>
+<l:template name="July" text="ಜà³à²²à³ˆ"/>
+<l:template name="August" text="ಅಗಷà³à²Ÿ"/>
+<l:template name="September" text="ಸೆಪà³à²Ÿà³†à²‚ಬರà³"/>
+<l:template name="October" text="ಅಕà³à²Ÿà³‹à²¬à²°à³"/>
+<l:template name="November" text="ನವೆಂಬರà³"/>
+<l:template name="December" text="ಡಿಸೆಂಬರà³"/>
+<l:template name="Monday" text="ಸೋಮವಾರ"/>
+<l:template name="Tuesday" text="ಮಂಗಳವಾರ"/>
+<l:template name="Wednesday" text="ಬà³à²§à²µà²¾à²°"/>
+<l:template name="Thursday" text="ಗà³à²°à³à²µà²¾à²°"/>
+<l:template name="Friday" text="ಶà³à²•à³à²°à²µà²¾à²°"/>
+<l:template name="Saturday" text="ಶನಿವಾರ"/>
+<l:template name="Sunday" text="ರವಿವಾರ"/>
+</l:context>
+<l:context name="datetime-abbrev"><l:template name="Jan" text="ಜನೆವರಿ"/>
+<l:template name="Feb" text="ಫೆಬà³à²°à³à²µà²°à²¿"/>
+<l:template name="Mar" text="ಮಾರà³à²šà³"/>
+<l:template name="Apr" text="à²à²ªà³à²°à²¿à²²à³"/>
+<l:template name="May" text="ಮೇ"/>
+<l:template name="Jun" text="ಜೂನà³"/>
+<l:template name="Jul" text="ಜà³à²²à³ˆ"/>
+<l:template name="Aug" text="ಅಗಷà³à²Ÿ"/>
+<l:template name="Sep" text="ಸೆಪà³à²Ÿà³†à²‚ಬರà³"/>
+<l:template name="Oct" text="ಅಕà³à²Ÿà³‹à²¬à²°à³"/>
+<l:template name="Nov" text="ನವೆಂಬರà³"/>
+<l:template name="Dec" text="ಡಿಸೆಂಬರà³"/>
+<l:template name="Mon" text="ಸೋಮ"/>
+<l:template name="Tue" text="ಮಂಗಳ"/>
+<l:template name="Wed" text="ಬà³à²§"/>
+<l:template name="Thu" text="ಗà³à²°à³"/>
+<l:template name="Fri" text="ಶà³à²•à³à²°"/>
+<l:template name="Sat" text="ಶನಿ"/>
+<l:template name="Sun" text="ರವಿ"/>
+</l:context>
+<l:context name="htmlhelp"><l:template name="langcode" text="0x044b Kannada (INDIA)"/>
+</l:context>
+<l:context name="index"><l:template name="term-separator" text=", " lang="en"/>
+<l:template name="number-separator" text=", " lang="en"/>
+<l:template name="range-separator" text="-" lang="en"/>
+</l:context>
+<l:context name="iso690"><l:template name="lastfirst.sep" text=", " lang="en"/>
+<l:template name="alt.person.two.sep" text=" – " lang="en"/>
+<l:template name="alt.person.last.sep" text=" – " lang="en"/>
+<l:template name="alt.person.more.sep" text=" – " lang="en"/>
+<l:template name="primary.editor" text=" (ed.)" lang="en"/>
+<l:template name="primary.many" text=", et al." lang="en"/>
+<l:template name="primary.sep" text=". " lang="en"/>
+<l:template name="submaintitle.sep" text=": " lang="en"/>
+<l:template name="title.sep" text=". " lang="en"/>
+<l:template name="othertitle.sep" text=", " lang="en"/>
+<l:template name="medium1" text=" [" lang="en"/>
+<l:template name="medium2" text="]" lang="en"/>
+<l:template name="secondary.person.sep" text="; " lang="en"/>
+<l:template name="secondary.sep" text=". " lang="en"/>
+<l:template name="respons.sep" text=". " lang="en"/>
+<l:template name="edition.sep" text=". " lang="en"/>
+<l:template name="edition.serial.sep" text=", " lang="en"/>
+<l:template name="issuing.range" text="-" lang="en"/>
+<l:template name="issuing.div" text=", " lang="en"/>
+<l:template name="issuing.sep" text=". " lang="en"/>
+<l:template name="partnr.sep" text=". " lang="en"/>
+<l:template name="placepubl.sep" text=": " lang="en"/>
+<l:template name="publyear.sep" text=", " lang="en"/>
+<l:template name="pubinfo.sep" text=". " lang="en"/>
+<l:template name="spec.pubinfo.sep" text=", " lang="en"/>
+<l:template name="upd.sep" text=", " lang="en"/>
+<l:template name="datecit1" text=" [cited " lang="en"/>
+<l:template name="datecit2" text="]" lang="en"/>
+<l:template name="extent.sep" text=". " lang="en"/>
+<l:template name="locs.sep" text=", " lang="en"/>
+<l:template name="location.sep" text=". " lang="en"/>
+<l:template name="serie.sep" text=". " lang="en"/>
+<l:template name="notice.sep" text=". " lang="en"/>
+<l:template name="access" text="Available " lang="en"/>
+<l:template name="acctoo" text="Also available " lang="en"/>
+<l:template name="onwww" text="from World Wide Web" lang="en"/>
+<l:template name="oninet" text="from Internet" lang="en"/>
+<l:template name="access.end" text=": " lang="en"/>
+<l:template name="link1" text="&lt;" lang="en"/>
+<l:template name="link2" text="&gt;" lang="en"/>
+<l:template name="access.sep" text=". " lang="en"/>
+<l:template name="isbn" text="ISBN " lang="en"/>
+<l:template name="issn" text="ISSN " lang="en"/>
+<l:template name="stdnum.sep" text=". " lang="en"/>
+<l:template name="patcountry.sep" text=". " lang="en"/>
+<l:template name="pattype.sep" text=", " lang="en"/>
+<l:template name="patnum.sep" text=". " lang="en"/>
+<l:template name="patdate.sep" text=". " lang="en"/>
+</l:context><l:letters><l:l i="-1"/>
+<l:l i="0">ಸಂಕೇತಗಳà³</l:l>
+<l:l i="10">A</l:l>
+<l:l i="10">a</l:l>
+<l:l i="10">À</l:l>
+<l:l i="10">à</l:l>
+<l:l i="10">Ã</l:l>
+<l:l i="10">á</l:l>
+<l:l i="10">Â</l:l>
+<l:l i="10">â</l:l>
+<l:l i="10">Ã</l:l>
+<l:l i="10">ã</l:l>
+<l:l i="10">Ä</l:l>
+<l:l i="10">ä</l:l>
+<l:l i="10">Ã…</l:l>
+<l:l i="10">Ã¥</l:l>
+<l:l i="10">Ä€</l:l>
+<l:l i="10">Ä</l:l>
+<l:l i="10">Ä‚</l:l>
+<l:l i="10">ă</l:l>
+<l:l i="10">Ä„</l:l>
+<l:l i="10">Ä…</l:l>
+<l:l i="10">Ç</l:l>
+<l:l i="10">ÇŽ</l:l>
+<l:l i="10">Çž</l:l>
+<l:l i="10">ÇŸ</l:l>
+<l:l i="10">Ç </l:l>
+<l:l i="10">Ç¡</l:l>
+<l:l i="10">Ǻ</l:l>
+<l:l i="10">Ç»</l:l>
+<l:l i="10">È€</l:l>
+<l:l i="10">È</l:l>
+<l:l i="10">È‚</l:l>
+<l:l i="10">ȃ</l:l>
+<l:l i="10">Ȧ</l:l>
+<l:l i="10">ȧ</l:l>
+<l:l i="10">Ḁ</l:l>
+<l:l i="10">á¸</l:l>
+<l:l i="10">ẚ</l:l>
+<l:l i="10">Ạ</l:l>
+<l:l i="10">ạ</l:l>
+<l:l i="10">Ả</l:l>
+<l:l i="10">ả</l:l>
+<l:l i="10">Ấ</l:l>
+<l:l i="10">ấ</l:l>
+<l:l i="10">Ầ</l:l>
+<l:l i="10">ầ</l:l>
+<l:l i="10">Ẩ</l:l>
+<l:l i="10">ẩ</l:l>
+<l:l i="10">Ẫ</l:l>
+<l:l i="10">ẫ</l:l>
+<l:l i="10">Ậ</l:l>
+<l:l i="10">ậ</l:l>
+<l:l i="10">Ắ</l:l>
+<l:l i="10">ắ</l:l>
+<l:l i="10">Ằ</l:l>
+<l:l i="10">ằ</l:l>
+<l:l i="10">Ẳ</l:l>
+<l:l i="10">ẳ</l:l>
+<l:l i="10">Ẵ</l:l>
+<l:l i="10">ẵ</l:l>
+<l:l i="10">Ặ</l:l>
+<l:l i="10">ặ</l:l>
+<l:l i="20">B</l:l>
+<l:l i="20">b</l:l>
+<l:l i="20">Æ€</l:l>
+<l:l i="20">Æ</l:l>
+<l:l i="20">É“</l:l>
+<l:l i="20">Æ‚</l:l>
+<l:l i="20">ƃ</l:l>
+<l:l i="20">Ḃ</l:l>
+<l:l i="20">ḃ</l:l>
+<l:l i="20">Ḅ</l:l>
+<l:l i="20">ḅ</l:l>
+<l:l i="20">Ḇ</l:l>
+<l:l i="20">ḇ</l:l>
+<l:l i="30">C</l:l>
+<l:l i="30">c</l:l>
+<l:l i="30">Ç</l:l>
+<l:l i="30">ç</l:l>
+<l:l i="30">Ć</l:l>
+<l:l i="30">ć</l:l>
+<l:l i="30">Ĉ</l:l>
+<l:l i="30">ĉ</l:l>
+<l:l i="30">ÄŠ</l:l>
+<l:l i="30">Ä‹</l:l>
+<l:l i="30">Č</l:l>
+<l:l i="30">Ä</l:l>
+<l:l i="30">Ƈ</l:l>
+<l:l i="30">ƈ</l:l>
+<l:l i="30">É•</l:l>
+<l:l i="30">Ḉ</l:l>
+<l:l i="30">ḉ</l:l>
+<l:l i="40">D</l:l>
+<l:l i="40">d</l:l>
+<l:l i="40">ÄŽ</l:l>
+<l:l i="40">Ä</l:l>
+<l:l i="40">Ä</l:l>
+<l:l i="40">Ä‘</l:l>
+<l:l i="40">ÆŠ</l:l>
+<l:l i="40">É—</l:l>
+<l:l i="40">Æ‹</l:l>
+<l:l i="40">ƌ</l:l>
+<l:l i="40">Ç…</l:l>
+<l:l i="40">Dz</l:l>
+<l:l i="40">È¡</l:l>
+<l:l i="40">É–</l:l>
+<l:l i="40">Ḋ</l:l>
+<l:l i="40">ḋ</l:l>
+<l:l i="40">Ḍ</l:l>
+<l:l i="40">á¸</l:l>
+<l:l i="40">Ḏ</l:l>
+<l:l i="40">á¸</l:l>
+<l:l i="40">á¸</l:l>
+<l:l i="40">ḑ</l:l>
+<l:l i="40">Ḓ</l:l>
+<l:l i="40">ḓ</l:l>
+<l:l i="50">E</l:l>
+<l:l i="50">e</l:l>
+<l:l i="50">È</l:l>
+<l:l i="50">è</l:l>
+<l:l i="50">É</l:l>
+<l:l i="50">é</l:l>
+<l:l i="50">Ê</l:l>
+<l:l i="50">ê</l:l>
+<l:l i="50">Ë</l:l>
+<l:l i="50">ë</l:l>
+<l:l i="50">Ä’</l:l>
+<l:l i="50">Ä“</l:l>
+<l:l i="50">Ä”</l:l>
+<l:l i="50">Ä•</l:l>
+<l:l i="50">Ä–</l:l>
+<l:l i="50">Ä—</l:l>
+<l:l i="50">Ę</l:l>
+<l:l i="50">Ä™</l:l>
+<l:l i="50">Äš</l:l>
+<l:l i="50">Ä›</l:l>
+<l:l i="50">È„</l:l>
+<l:l i="50">È…</l:l>
+<l:l i="50">Ȇ</l:l>
+<l:l i="50">ȇ</l:l>
+<l:l i="50">Ȩ</l:l>
+<l:l i="50">È©</l:l>
+<l:l i="50">Ḕ</l:l>
+<l:l i="50">ḕ</l:l>
+<l:l i="50">Ḗ</l:l>
+<l:l i="50">ḗ</l:l>
+<l:l i="50">Ḙ</l:l>
+<l:l i="50">ḙ</l:l>
+<l:l i="50">Ḛ</l:l>
+<l:l i="50">ḛ</l:l>
+<l:l i="50">Ḝ</l:l>
+<l:l i="50">á¸</l:l>
+<l:l i="50">Ẹ</l:l>
+<l:l i="50">ẹ</l:l>
+<l:l i="50">Ẻ</l:l>
+<l:l i="50">ẻ</l:l>
+<l:l i="50">Ẽ</l:l>
+<l:l i="50">ẽ</l:l>
+<l:l i="50">Ế</l:l>
+<l:l i="50">ế</l:l>
+<l:l i="50">Ề</l:l>
+<l:l i="50">á»</l:l>
+<l:l i="50">Ể</l:l>
+<l:l i="50">ể</l:l>
+<l:l i="50">Ễ</l:l>
+<l:l i="50">á»…</l:l>
+<l:l i="50">Ệ</l:l>
+<l:l i="50">ệ</l:l>
+<l:l i="60">F</l:l>
+<l:l i="60">f</l:l>
+<l:l i="60">Æ‘</l:l>
+<l:l i="60">Æ’</l:l>
+<l:l i="60">Ḟ</l:l>
+<l:l i="60">ḟ</l:l>
+<l:l i="70">G</l:l>
+<l:l i="70">g</l:l>
+<l:l i="70">Ĝ</l:l>
+<l:l i="70">Ä</l:l>
+<l:l i="70">Äž</l:l>
+<l:l i="70">ÄŸ</l:l>
+<l:l i="70">Ä </l:l>
+<l:l i="70">Ä¡</l:l>
+<l:l i="70">Ä¢</l:l>
+<l:l i="70">Ä£</l:l>
+<l:l i="70">Æ“</l:l>
+<l:l i="70">É </l:l>
+<l:l i="70">Ǥ</l:l>
+<l:l i="70">Ç¥</l:l>
+<l:l i="70">Ǧ</l:l>
+<l:l i="70">ǧ</l:l>
+<l:l i="70">Ç´</l:l>
+<l:l i="70">ǵ</l:l>
+<l:l i="70">Ḡ</l:l>
+<l:l i="70">ḡ</l:l>
+<l:l i="80">H</l:l>
+<l:l i="80">h</l:l>
+<l:l i="80">Ĥ</l:l>
+<l:l i="80">Ä¥</l:l>
+<l:l i="80">Ħ</l:l>
+<l:l i="80">ħ</l:l>
+<l:l i="80">Èž</l:l>
+<l:l i="80">ÈŸ</l:l>
+<l:l i="80">ɦ</l:l>
+<l:l i="80">Ḣ</l:l>
+<l:l i="80">ḣ</l:l>
+<l:l i="80">Ḥ</l:l>
+<l:l i="80">ḥ</l:l>
+<l:l i="80">Ḧ</l:l>
+<l:l i="80">ḧ</l:l>
+<l:l i="80">Ḩ</l:l>
+<l:l i="80">ḩ</l:l>
+<l:l i="80">Ḫ</l:l>
+<l:l i="80">ḫ</l:l>
+<l:l i="80">ẖ</l:l>
+<l:l i="90">I</l:l>
+<l:l i="90">i</l:l>
+<l:l i="90">Ì</l:l>
+<l:l i="90">ì</l:l>
+<l:l i="90">Ã</l:l>
+<l:l i="90">í</l:l>
+<l:l i="90">ÃŽ</l:l>
+<l:l i="90">î</l:l>
+<l:l i="90">Ã</l:l>
+<l:l i="90">ï</l:l>
+<l:l i="90">Ĩ</l:l>
+<l:l i="90">Ä©</l:l>
+<l:l i="90">Ī</l:l>
+<l:l i="90">Ä«</l:l>
+<l:l i="90">Ĭ</l:l>
+<l:l i="90">Ä­</l:l>
+<l:l i="90">Ä®</l:l>
+<l:l i="90">į</l:l>
+<l:l i="90">Ä°</l:l>
+<l:l i="90">Æ—</l:l>
+<l:l i="90">ɨ</l:l>
+<l:l i="90">Ç</l:l>
+<l:l i="90">Ç</l:l>
+<l:l i="90">Ȉ</l:l>
+<l:l i="90">ȉ</l:l>
+<l:l i="90">ÈŠ</l:l>
+<l:l i="90">È‹</l:l>
+<l:l i="90">Ḭ</l:l>
+<l:l i="90">ḭ</l:l>
+<l:l i="90">Ḯ</l:l>
+<l:l i="90">ḯ</l:l>
+<l:l i="90">Ỉ</l:l>
+<l:l i="90">ỉ</l:l>
+<l:l i="90">Ị</l:l>
+<l:l i="90">ị</l:l>
+<l:l i="100">J</l:l>
+<l:l i="100">j</l:l>
+<l:l i="100">Ä´</l:l>
+<l:l i="100">ĵ</l:l>
+<l:l i="100">Ç°</l:l>
+<l:l i="100">Ê</l:l>
+<l:l i="110">K</l:l>
+<l:l i="110">k</l:l>
+<l:l i="110">Ķ</l:l>
+<l:l i="110">Ä·</l:l>
+<l:l i="110">Ƙ</l:l>
+<l:l i="110">Æ™</l:l>
+<l:l i="110">Ǩ</l:l>
+<l:l i="110">Ç©</l:l>
+<l:l i="110">Ḱ</l:l>
+<l:l i="110">ḱ</l:l>
+<l:l i="110">Ḳ</l:l>
+<l:l i="110">ḳ</l:l>
+<l:l i="110">Ḵ</l:l>
+<l:l i="110">ḵ</l:l>
+<l:l i="120">L</l:l>
+<l:l i="120">l</l:l>
+<l:l i="120">Ĺ</l:l>
+<l:l i="120">ĺ</l:l>
+<l:l i="120">Ä»</l:l>
+<l:l i="120">ļ</l:l>
+<l:l i="120">Ľ</l:l>
+<l:l i="120">ľ</l:l>
+<l:l i="120">Ä¿</l:l>
+<l:l i="120">Å€</l:l>
+<l:l i="120">Å</l:l>
+<l:l i="120">Å‚</l:l>
+<l:l i="120">Æš</l:l>
+<l:l i="120">Lj</l:l>
+<l:l i="120">È´</l:l>
+<l:l i="120">É«</l:l>
+<l:l i="120">ɬ</l:l>
+<l:l i="120">É­</l:l>
+<l:l i="120">Ḷ</l:l>
+<l:l i="120">ḷ</l:l>
+<l:l i="120">Ḹ</l:l>
+<l:l i="120">ḹ</l:l>
+<l:l i="120">Ḻ</l:l>
+<l:l i="120">ḻ</l:l>
+<l:l i="120">Ḽ</l:l>
+<l:l i="120">ḽ</l:l>
+<l:l i="130">M</l:l>
+<l:l i="130">m</l:l>
+<l:l i="130">ɱ</l:l>
+<l:l i="130">Ḿ</l:l>
+<l:l i="130">ḿ</l:l>
+<l:l i="130">á¹€</l:l>
+<l:l i="130">á¹</l:l>
+<l:l i="130">Ṃ</l:l>
+<l:l i="130">ṃ</l:l>
+<l:l i="140">N</l:l>
+<l:l i="140">n</l:l>
+<l:l i="140">Ñ</l:l>
+<l:l i="140">ñ</l:l>
+<l:l i="140">Ń</l:l>
+<l:l i="140">Å„</l:l>
+<l:l i="140">Å…</l:l>
+<l:l i="140">ņ</l:l>
+<l:l i="140">Ň</l:l>
+<l:l i="140">ň</l:l>
+<l:l i="140">Æ</l:l>
+<l:l i="140">ɲ</l:l>
+<l:l i="140">Æž</l:l>
+<l:l i="140">È </l:l>
+<l:l i="140">Ç‹</l:l>
+<l:l i="140">Ǹ</l:l>
+<l:l i="140">ǹ</l:l>
+<l:l i="140">ȵ</l:l>
+<l:l i="140">ɳ</l:l>
+<l:l i="140">Ṅ</l:l>
+<l:l i="140">á¹…</l:l>
+<l:l i="140">Ṇ</l:l>
+<l:l i="140">ṇ</l:l>
+<l:l i="140">Ṉ</l:l>
+<l:l i="140">ṉ</l:l>
+<l:l i="140">Ṋ</l:l>
+<l:l i="140">ṋ</l:l>
+<l:l i="150">O</l:l>
+<l:l i="150">o</l:l>
+<l:l i="150">Ã’</l:l>
+<l:l i="150">ò</l:l>
+<l:l i="150">Ó</l:l>
+<l:l i="150">ó</l:l>
+<l:l i="150">Ô</l:l>
+<l:l i="150">ô</l:l>
+<l:l i="150">Õ</l:l>
+<l:l i="150">õ</l:l>
+<l:l i="150">Ö</l:l>
+<l:l i="150">ö</l:l>
+<l:l i="150">Ø</l:l>
+<l:l i="150">ø</l:l>
+<l:l i="150">Ō</l:l>
+<l:l i="150">Å</l:l>
+<l:l i="150">ÅŽ</l:l>
+<l:l i="150">Å</l:l>
+<l:l i="150">Å</l:l>
+<l:l i="150">Å‘</l:l>
+<l:l i="150">ÆŸ</l:l>
+<l:l i="150">Æ </l:l>
+<l:l i="150">Æ¡</l:l>
+<l:l i="150">Ç‘</l:l>
+<l:l i="150">Ç’</l:l>
+<l:l i="150">Ǫ</l:l>
+<l:l i="150">Ç«</l:l>
+<l:l i="150">Ǭ</l:l>
+<l:l i="150">Ç­</l:l>
+<l:l i="150">Ǿ</l:l>
+<l:l i="150">Ç¿</l:l>
+<l:l i="150">Ȍ</l:l>
+<l:l i="150">È</l:l>
+<l:l i="150">ÈŽ</l:l>
+<l:l i="150">È</l:l>
+<l:l i="150">Ȫ</l:l>
+<l:l i="150">È«</l:l>
+<l:l i="150">Ȭ</l:l>
+<l:l i="150">È­</l:l>
+<l:l i="150">È®</l:l>
+<l:l i="150">ȯ</l:l>
+<l:l i="150">È°</l:l>
+<l:l i="150">ȱ</l:l>
+<l:l i="150">Ṍ</l:l>
+<l:l i="150">á¹</l:l>
+<l:l i="150">Ṏ</l:l>
+<l:l i="150">á¹</l:l>
+<l:l i="150">á¹</l:l>
+<l:l i="150">ṑ</l:l>
+<l:l i="150">á¹’</l:l>
+<l:l i="150">ṓ</l:l>
+<l:l i="150">Ọ</l:l>
+<l:l i="150">á»</l:l>
+<l:l i="150">Ỏ</l:l>
+<l:l i="150">á»</l:l>
+<l:l i="150">á»</l:l>
+<l:l i="150">ố</l:l>
+<l:l i="150">á»’</l:l>
+<l:l i="150">ồ</l:l>
+<l:l i="150">á»”</l:l>
+<l:l i="150">ổ</l:l>
+<l:l i="150">á»–</l:l>
+<l:l i="150">á»—</l:l>
+<l:l i="150">Ộ</l:l>
+<l:l i="150">á»™</l:l>
+<l:l i="150">Ớ</l:l>
+<l:l i="150">á»›</l:l>
+<l:l i="150">Ờ</l:l>
+<l:l i="150">á»</l:l>
+<l:l i="150">Ở</l:l>
+<l:l i="150">ở</l:l>
+<l:l i="150">á» </l:l>
+<l:l i="150">ỡ</l:l>
+<l:l i="150">Ợ</l:l>
+<l:l i="150">ợ</l:l>
+<l:l i="160">P</l:l>
+<l:l i="160">p</l:l>
+<l:l i="160">Ƥ</l:l>
+<l:l i="160">Æ¥</l:l>
+<l:l i="160">á¹”</l:l>
+<l:l i="160">ṕ</l:l>
+<l:l i="160">á¹–</l:l>
+<l:l i="160">á¹—</l:l>
+<l:l i="170">Q</l:l>
+<l:l i="170">q</l:l>
+<l:l i="170">Ê </l:l>
+<l:l i="180">R</l:l>
+<l:l i="180">r</l:l>
+<l:l i="180">Å”</l:l>
+<l:l i="180">Å•</l:l>
+<l:l i="180">Å–</l:l>
+<l:l i="180">Å—</l:l>
+<l:l i="180">Ř</l:l>
+<l:l i="180">Å™</l:l>
+<l:l i="180">È</l:l>
+<l:l i="180">È‘</l:l>
+<l:l i="180">È’</l:l>
+<l:l i="180">È“</l:l>
+<l:l i="180">ɼ</l:l>
+<l:l i="180">ɽ</l:l>
+<l:l i="180">ɾ</l:l>
+<l:l i="180">Ṙ</l:l>
+<l:l i="180">á¹™</l:l>
+<l:l i="180">Ṛ</l:l>
+<l:l i="180">á¹›</l:l>
+<l:l i="180">Ṝ</l:l>
+<l:l i="180">á¹</l:l>
+<l:l i="180">Ṟ</l:l>
+<l:l i="180">ṟ</l:l>
+<l:l i="190">S</l:l>
+<l:l i="190">s</l:l>
+<l:l i="190">Åš</l:l>
+<l:l i="190">Å›</l:l>
+<l:l i="190">Ŝ</l:l>
+<l:l i="190">Å</l:l>
+<l:l i="190">Åž</l:l>
+<l:l i="190">ÅŸ</l:l>
+<l:l i="190">Å </l:l>
+<l:l i="190">Å¡</l:l>
+<l:l i="190">Ș</l:l>
+<l:l i="190">È™</l:l>
+<l:l i="190">Ê‚</l:l>
+<l:l i="190">á¹ </l:l>
+<l:l i="190">ṡ</l:l>
+<l:l i="190">á¹¢</l:l>
+<l:l i="190">á¹£</l:l>
+<l:l i="190">Ṥ</l:l>
+<l:l i="190">á¹¥</l:l>
+<l:l i="190">Ṧ</l:l>
+<l:l i="190">ṧ</l:l>
+<l:l i="190">Ṩ</l:l>
+<l:l i="190">ṩ</l:l>
+<l:l i="200">T</l:l>
+<l:l i="200">t</l:l>
+<l:l i="200">Å¢</l:l>
+<l:l i="200">Å£</l:l>
+<l:l i="200">Ť</l:l>
+<l:l i="200">Å¥</l:l>
+<l:l i="200">Ŧ</l:l>
+<l:l i="200">ŧ</l:l>
+<l:l i="200">Æ«</l:l>
+<l:l i="200">Ƭ</l:l>
+<l:l i="200">Æ­</l:l>
+<l:l i="200">Æ®</l:l>
+<l:l i="200">ʈ</l:l>
+<l:l i="200">Èš</l:l>
+<l:l i="200">È›</l:l>
+<l:l i="200">ȶ</l:l>
+<l:l i="200">Ṫ</l:l>
+<l:l i="200">ṫ</l:l>
+<l:l i="200">Ṭ</l:l>
+<l:l i="200">á¹­</l:l>
+<l:l i="200">á¹®</l:l>
+<l:l i="200">ṯ</l:l>
+<l:l i="200">á¹°</l:l>
+<l:l i="200">á¹±</l:l>
+<l:l i="200">ẗ</l:l>
+<l:l i="210">U</l:l>
+<l:l i="210">u</l:l>
+<l:l i="210">Ù</l:l>
+<l:l i="210">ù</l:l>
+<l:l i="210">Ú</l:l>
+<l:l i="210">ú</l:l>
+<l:l i="210">Û</l:l>
+<l:l i="210">û</l:l>
+<l:l i="210">Ü</l:l>
+<l:l i="210">ü</l:l>
+<l:l i="210">Ũ</l:l>
+<l:l i="210">Å©</l:l>
+<l:l i="210">Ū</l:l>
+<l:l i="210">Å«</l:l>
+<l:l i="210">Ŭ</l:l>
+<l:l i="210">Å­</l:l>
+<l:l i="210">Å®</l:l>
+<l:l i="210">ů</l:l>
+<l:l i="210">Å°</l:l>
+<l:l i="210">ű</l:l>
+<l:l i="210">Ų</l:l>
+<l:l i="210">ų</l:l>
+<l:l i="210">Ư</l:l>
+<l:l i="210">Æ°</l:l>
+<l:l i="210">Ç“</l:l>
+<l:l i="210">Ç”</l:l>
+<l:l i="210">Ç•</l:l>
+<l:l i="210">Ç–</l:l>
+<l:l i="210">Ç—</l:l>
+<l:l i="210">ǘ</l:l>
+<l:l i="210">Ç™</l:l>
+<l:l i="210">Çš</l:l>
+<l:l i="210">Ç›</l:l>
+<l:l i="210">ǜ</l:l>
+<l:l i="210">È”</l:l>
+<l:l i="210">È•</l:l>
+<l:l i="210">È–</l:l>
+<l:l i="210">È—</l:l>
+<l:l i="210">á¹²</l:l>
+<l:l i="210">á¹³</l:l>
+<l:l i="210">á¹´</l:l>
+<l:l i="210">á¹µ</l:l>
+<l:l i="210">Ṷ</l:l>
+<l:l i="210">á¹·</l:l>
+<l:l i="210">Ṹ</l:l>
+<l:l i="210">á¹¹</l:l>
+<l:l i="210">Ṻ</l:l>
+<l:l i="210">á¹»</l:l>
+<l:l i="210">Ụ</l:l>
+<l:l i="210">ụ</l:l>
+<l:l i="210">Ủ</l:l>
+<l:l i="210">ủ</l:l>
+<l:l i="210">Ứ</l:l>
+<l:l i="210">ứ</l:l>
+<l:l i="210">Ừ</l:l>
+<l:l i="210">ừ</l:l>
+<l:l i="210">Ử</l:l>
+<l:l i="210">á»­</l:l>
+<l:l i="210">á»®</l:l>
+<l:l i="210">ữ</l:l>
+<l:l i="210">á»°</l:l>
+<l:l i="210">á»±</l:l>
+<l:l i="220">V</l:l>
+<l:l i="220">v</l:l>
+<l:l i="220">Ʋ</l:l>
+<l:l i="220">Ê‹</l:l>
+<l:l i="220">á¹¼</l:l>
+<l:l i="220">á¹½</l:l>
+<l:l i="220">á¹¾</l:l>
+<l:l i="220">ṿ</l:l>
+<l:l i="230">W</l:l>
+<l:l i="230">w</l:l>
+<l:l i="230">Å´</l:l>
+<l:l i="230">ŵ</l:l>
+<l:l i="230">Ẁ</l:l>
+<l:l i="230">áº</l:l>
+<l:l i="230">Ẃ</l:l>
+<l:l i="230">ẃ</l:l>
+<l:l i="230">Ẅ</l:l>
+<l:l i="230">ẅ</l:l>
+<l:l i="230">Ẇ</l:l>
+<l:l i="230">ẇ</l:l>
+<l:l i="230">Ẉ</l:l>
+<l:l i="230">ẉ</l:l>
+<l:l i="230">ẘ</l:l>
+<l:l i="240">X</l:l>
+<l:l i="240">x</l:l>
+<l:l i="240">Ẋ</l:l>
+<l:l i="240">ẋ</l:l>
+<l:l i="240">Ẍ</l:l>
+<l:l i="240">áº</l:l>
+<l:l i="250">Y</l:l>
+<l:l i="250">y</l:l>
+<l:l i="250">Ã</l:l>
+<l:l i="250">ý</l:l>
+<l:l i="250">ÿ</l:l>
+<l:l i="250">Ÿ</l:l>
+<l:l i="250">Ŷ</l:l>
+<l:l i="250">Å·</l:l>
+<l:l i="250">Ƴ</l:l>
+<l:l i="250">Æ´</l:l>
+<l:l i="250">Ȳ</l:l>
+<l:l i="250">ȳ</l:l>
+<l:l i="250">Ẏ</l:l>
+<l:l i="250">áº</l:l>
+<l:l i="250">ẙ</l:l>
+<l:l i="250">Ỳ</l:l>
+<l:l i="250">ỳ</l:l>
+<l:l i="250">á»´</l:l>
+<l:l i="250">ỵ</l:l>
+<l:l i="250">Ỷ</l:l>
+<l:l i="250">á»·</l:l>
+<l:l i="250">Ỹ</l:l>
+<l:l i="250">ỹ</l:l>
+<l:l i="260">Z</l:l>
+<l:l i="260">z</l:l>
+<l:l i="260">Ź</l:l>
+<l:l i="260">ź</l:l>
+<l:l i="260">Å»</l:l>
+<l:l i="260">ż</l:l>
+<l:l i="260">Ž</l:l>
+<l:l i="260">ž</l:l>
+<l:l i="260">Ƶ</l:l>
+<l:l i="260">ƶ</l:l>
+<l:l i="260">Ȥ</l:l>
+<l:l i="260">È¥</l:l>
+<l:l i="260">Ê</l:l>
+<l:l i="260">Ê‘</l:l>
+<l:l i="260">áº</l:l>
+<l:l i="260">ẑ</l:l>
+<l:l i="260">Ẓ</l:l>
+<l:l i="260">ẓ</l:l>
+<l:l i="260">Ẕ</l:l>
+<l:l i="260">ẕ</l:l>
+</l:letters>
+</l:l10n>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/ko.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/ko.xml
new file mode 100644
index 0000000..5264077
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/ko.xml
@@ -0,0 +1,1229 @@
+<?xml version="1.0" encoding="utf-8"?>
+<l:l10n xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0" language="ko" english-language-name="Korean">
+
+<!-- * This file is generated automatically. -->
+<!-- * To submit changes to this file upstream (to the DocBook Project) -->
+<!-- * do not submit an edited version of this file. Instead, submit an -->
+<!-- * edited version of the source file at the following location: -->
+<!-- * -->
+<!-- * https://docbook.svn.sourceforge.net/svnroot/docbook/trunk/gentext/locale/ko.xml -->
+<!-- * -->
+<!-- * E-mail the edited ko.xml source file to: -->
+<!-- * -->
+<!-- * docbook-developers@lists.sourceforge.net -->
+
+<!-- ******************************************************************** -->
+
+<!-- This file is part of the XSL DocBook Stylesheet distribution. -->
+<!-- See ../README or http://docbook.sf.net/release/xsl/current/ for -->
+<!-- copyright and other information. -->
+
+<!-- ******************************************************************** -->
+<!-- In these files, % with a letter is used for a placeholder: -->
+<!-- %t is the current element's title -->
+<!-- %s is the current element's subtitle (if applicable)-->
+<!-- %n is the current element's number label-->
+<!-- %p is the current element's page number (if applicable)-->
+<!-- ******************************************************************** -->
+
+
+<l:gentext key="Abstract" text="ì´ˆë¡"/>
+<l:gentext key="abstract" text="ì´ˆë¡"/>
+<l:gentext key="Acknowledgements" text="Acknowledgements" lang="en"/>
+<l:gentext key="acknowledgements" text="Acknowledgements" lang="en"/>
+<l:gentext key="Answer" text="답변"/>
+<l:gentext key="answer" text="답변"/>
+<l:gentext key="Appendix" text="부ë¡"/>
+<l:gentext key="appendix" text="부ë¡"/>
+<l:gentext key="Article" text="문서"/>
+<l:gentext key="article" text="문서"/>
+<l:gentext key="Author" text="Author" lang="en"/>
+<l:gentext key="Bibliography" text="서지사항"/>
+<l:gentext key="bibliography" text="서지사항"/>
+<l:gentext key="Book" text="ì±…"/>
+<l:gentext key="book" text="ì±…"/>
+<l:gentext key="CAUTION" text="[경고]"/>
+<l:gentext key="Caution" text="경고"/>
+<l:gentext key="caution" text="경고"/>
+<l:gentext key="Chapter" text="장"/>
+<l:gentext key="chapter" text="장"/>
+<l:gentext key="Colophon" text="íŒê¶Œ"/>
+<l:gentext key="colophon" text="íŒê¶Œ"/>
+<l:gentext key="Copyright" text="저작권"/>
+<l:gentext key="copyright" text="저작권"/>
+<l:gentext key="Dedication" text="바치는 글"/>
+<l:gentext key="dedication" text="바치는 글"/>
+<l:gentext key="Edition" text="ì—®ìŒ"/>
+<l:gentext key="edition" text="ì—®ìŒ"/>
+<l:gentext key="Editor" text="Editor" lang="en"/>
+<l:gentext key="Equation" text="수ì‹"/>
+<l:gentext key="equation" text="수ì‹"/>
+<l:gentext key="Example" text="예"/>
+<l:gentext key="example" text="예"/>
+<l:gentext key="Figure" text="그림"/>
+<l:gentext key="figure" text="그림"/>
+<l:gentext key="Glossary" text="용어해설"/>
+<l:gentext key="glossary" text="용어해설"/>
+<l:gentext key="GlossSee" text="살펴볼 내용"/>
+<l:gentext key="glosssee" text="살펴볼 내용"/>
+<l:gentext key="GlossSeeAlso" text="다른 살펴볼 내용"/>
+<l:gentext key="glossseealso" text="다른 살펴볼 내용"/>
+<l:gentext key="IMPORTANT" text="[중요]"/>
+<l:gentext key="important" text="중요"/>
+<l:gentext key="Important" text="중요"/>
+<l:gentext key="Index" text="색ì¸"/>
+<l:gentext key="index" text="색ì¸"/>
+<l:gentext key="ISBN" text="ISBN"/>
+<l:gentext key="isbn" text="ISBN"/>
+<l:gentext key="LegalNotice" text="ë²•ì  ê³µì§€"/>
+<l:gentext key="legalnotice" text="ë²•ì  ê³µì§€"/>
+<l:gentext key="MsgAud" text="받는 ì´"/>
+<l:gentext key="msgaud" text="받는 ì´"/>
+<l:gentext key="MsgLevel" text="중요ë„"/>
+<l:gentext key="msglevel" text="중요ë„"/>
+<l:gentext key="MsgOrig" text="보내는 ì´"/>
+<l:gentext key="msgorig" text="보내는 ì´"/>
+<l:gentext key="NOTE" text="[참고]"/>
+<l:gentext key="Note" text="참고"/>
+<l:gentext key="note" text="참고"/>
+<l:gentext key="Part" text="부"/>
+<l:gentext key="part" text="부"/>
+<l:gentext key="Preface" text="서문"/>
+<l:gentext key="preface" text="서문"/>
+<l:gentext key="Procedure" text="절차"/>
+<l:gentext key="procedure" text="절차"/>
+<l:gentext key="ProductionSet" text="Production"/>
+<l:gentext key="PubDate" text="Publication Date" lang="en"/>
+<l:gentext key="pubdate" text="Publication date" lang="en"/>
+<l:gentext key="Published" text="펴냄"/>
+<l:gentext key="published" text="펴냄"/>
+<l:gentext key="Publisher" text="Publisher" lang="en"/>
+<l:gentext key="Qandadiv" text="질문그리고답변"/>
+<l:gentext key="qandadiv" text="질문그리고답변"/>
+<l:gentext key="QandASet" text="Frequently Asked Questions" lang="en"/>
+<l:gentext key="Question" text="질문"/>
+<l:gentext key="question" text="질문"/>
+<l:gentext key="RefEntry" text=""/>
+<l:gentext key="refentry" text=""/>
+<l:gentext key="Reference" text="참고문헌"/>
+<l:gentext key="reference" text="참고문헌"/>
+<l:gentext key="References" text="References" lang="en"/>
+<l:gentext key="RefName" text="제목"/>
+<l:gentext key="refname" text="제목"/>
+<l:gentext key="RefSection" text=""/>
+<l:gentext key="refsection" text=""/>
+<l:gentext key="RefSynopsisDiv" text="요약"/>
+<l:gentext key="refsynopsisdiv" text="요약"/>
+<l:gentext key="RevHistory" text="고친 과정"/>
+<l:gentext key="revhistory" text="고친 과정"/>
+<l:gentext key="revision" text="고침"/>
+<l:gentext key="Revision" text="고침"/>
+<l:gentext key="sect1" text="Section"/>
+<l:gentext key="sect2" text="Section"/>
+<l:gentext key="sect3" text="Section"/>
+<l:gentext key="sect4" text="Section"/>
+<l:gentext key="sect5" text="Section"/>
+<l:gentext key="section" text="ì ˆ"/>
+<l:gentext key="Section" text="ì ˆ"/>
+<l:gentext key="see" text="살펴볼 내용"/>
+<l:gentext key="See" text="살펴볼 내용"/>
+<l:gentext key="seealso" text="[살펴볼 다른 내용]"/>
+<l:gentext key="Seealso" text="살펴볼 다른 내용"/>
+<l:gentext key="SeeAlso" text="[살펴볼 다른 내용]"/>
+<l:gentext key="set" text="전집"/>
+<l:gentext key="Set" text="전집"/>
+<l:gentext key="setindex" text="전집 색ì¸"/>
+<l:gentext key="SetIndex" text="전집 색ì¸"/>
+<l:gentext key="Sidebar" text=""/>
+<l:gentext key="sidebar" text="ë§ë¶™ìž„"/>
+<l:gentext key="step" text="단계"/>
+<l:gentext key="Step" text="단계"/>
+<l:gentext key="table" text="표"/>
+<l:gentext key="Table" text="표"/>
+<l:gentext key="task" text="Task" lang="en"/>
+<l:gentext key="Task" text="Task" lang="en"/>
+<l:gentext key="tip" text="ìž‘ì€ ì •ë³´"/>
+<l:gentext key="TIP" text="[ìž‘ì€ ì •ë³´]"/>
+<l:gentext key="Tip" text="ìž‘ì€ ì •ë³´"/>
+<l:gentext key="Warning" text="주ì˜"/>
+<l:gentext key="warning" text="주ì˜"/>
+<l:gentext key="WARNING" text="주ì˜!"/>
+<l:gentext key="and" text="그리고"/>
+<l:gentext key="by" text="지ì€ì´"/>
+<l:gentext key="Edited" text="ì—®ìŒ"/>
+<l:gentext key="edited" text="ì—®ìŒ"/>
+<l:gentext key="Editedby" text="ì—®ì€ì´"/>
+<l:gentext key="editedby" text="ì—®ì€ì´"/>
+<l:gentext key="in" text="-"/>
+<l:gentext key="lastlistcomma" text=","/>
+<l:gentext key="listcomma" text=","/>
+<l:gentext key="notes" text="주ì„"/>
+<l:gentext key="Notes" text="주ì„"/>
+<l:gentext key="Pgs" text="Pgs."/>
+<l:gentext key="pgs" text="Pgs."/>
+<l:gentext key="Revisedby" text="ê³ ì¹œì´ "/>
+<l:gentext key="revisedby" text="ê³ ì¹œì´ "/>
+<l:gentext key="TableNotes" text="참고"/>
+<l:gentext key="tablenotes" text="참고"/>
+<l:gentext key="TableofContents" text="차례"/>
+<l:gentext key="tableofcontents" text="차례"/>
+<l:gentext key="unexpectedelementname" text="ì•Œ 수 없는 기초요소 ì´ë¦„입니다"/>
+<l:gentext key="unsupported" text="지ì›ë˜ì§€ 않습니다"/>
+<l:gentext key="xrefto" text="ì´ ê³³ì„ ì°¸ì¡°í•˜ì„¸ìš” : "/>
+<l:gentext key="Authors" text="Authors" lang="en"/>
+<l:gentext key="copyeditor" text="Copy Editor" lang="en"/>
+<l:gentext key="graphicdesigner" text="Graphic Designer" lang="en"/>
+<l:gentext key="productioneditor" text="Production Editor" lang="en"/>
+<l:gentext key="technicaleditor" text="Technical Editor" lang="en"/>
+<l:gentext key="translator" text="Translator" lang="en"/>
+<l:gentext key="listofequations" text="ìˆ˜ì‹ ëª©ë¡"/>
+<l:gentext key="ListofEquations" text="ìˆ˜ì‹ ëª©ë¡"/>
+<l:gentext key="ListofExamples" text="예 목ë¡"/>
+<l:gentext key="listofexamples" text="예 목ë¡"/>
+<l:gentext key="ListofFigures" text="그림 목ë¡"/>
+<l:gentext key="listoffigures" text="그림 목ë¡"/>
+<l:gentext key="ListofProcedures" text="List of Procedures" lang="en"/>
+<l:gentext key="listofprocedures" text="List of Procedures" lang="en"/>
+<l:gentext key="listoftables" text="í‘œ 목ë¡"/>
+<l:gentext key="ListofTables" text="í‘œ 목ë¡"/>
+<l:gentext key="ListofUnknown" text="기타 목ë¡"/>
+<l:gentext key="listofunknown" text="기타 목ë¡"/>
+<l:gentext key="nav-home" text="처ìŒìœ¼ë¡œ"/>
+<l:gentext key="nav-next" text="다ìŒ"/>
+<l:gentext key="nav-next-sibling" text="다ìŒìœ¼ë¡œ 건너뜀"/>
+<l:gentext key="nav-prev" text="ì´ì „"/>
+<l:gentext key="nav-prev-sibling" text="ì´ì „으로 건너뜀"/>
+<l:gentext key="nav-up" text="위로"/>
+<l:gentext key="nav-toc" text="ToC" lang="en"/>
+<l:gentext key="Draft" text="Draft"/>
+<l:gentext key="above" text="above"/>
+<l:gentext key="below" text="below"/>
+<l:gentext key="sectioncalled" text="the section called"/>
+<l:gentext key="index symbols" text="Symbols"/>
+<l:gentext key="writing-mode" text="lr-tb"/>
+<l:gentext key="lowercase.alpha" text="abcdefghijklmnopqrstuvwxyz" lang="en"/>
+<l:gentext key="uppercase.alpha" text="ABCDEFGHIJKLMNOPQRSTUVWXYZ" lang="en"/>
+<l:gentext key="normalize.sort.input" text="AaÀàÃáÂâÃãÄäÅåĀÄĂ㥹ÇǎǞǟǠǡǺǻȀÈȂȃȦȧḀá¸áºšáº áº¡áº¢áº£áº¤áº¥áº¦áº§áº¨áº©áºªáº«áº¬áº­áº®áº¯áº°áº±áº²áº³áº´áºµáº¶áº·BbÆ€ÆɓƂƃḂḃḄḅḆḇCcÇçĆćĈĉĊċČÄƇƈɕḈḉDdÄŽÄÄđƊɗƋƌDžDzȡɖḊḋḌá¸á¸Žá¸á¸á¸‘ḒḓEeÈèÉéÊêËëĒēĔĕĖėĘęĚěȄȅȆȇȨȩḔḕḖḗḘḙḚḛḜá¸áº¸áº¹áººáº»áº¼áº½áº¾áº¿á»€á»á»‚ểỄễỆệFfƑƒḞḟGgÄœÄĞğĠġĢģƓɠǤǥǦǧǴǵḠḡHhĤĥĦħȞȟɦḢḣḤḥḦḧḨḩḪḫẖIiÌìÃíÎîÃïĨĩĪīĬĭĮįİƗɨÇÇȈȉȊȋḬḭḮḯỈỉỊịJjĴĵǰÊKkĶķƘƙǨǩḰḱḲḳḴḵLlĹĺĻļĽľĿŀÅłƚLjȴɫɬɭḶḷḸḹḺḻḼḽMmɱḾḿṀá¹á¹‚ṃNnÑñŃńŅņŇňÆɲƞȠNjǸǹȵɳṄṅṆṇṈṉṊṋOoÒòÓóÔôÕõÖöØøŌÅÅŽÅÅőƟƠơǑǒǪǫǬǭǾǿȌÈÈŽÈȪȫȬȭȮȯȰȱṌá¹á¹Žá¹á¹á¹‘ṒṓỌá»á»Žá»á»á»‘ỒồỔổỖỗỘộỚớỜá»á»žá»Ÿá» á»¡á»¢á»£PpƤƥṔṕṖṗQqÊ RrŔŕŖŗŘřÈȑȒȓɼɽɾṘṙṚṛṜá¹á¹žá¹ŸSsŚśŜÅŞşŠšȘșʂṠṡṢṣṤṥṦṧṨṩTtŢţŤťŦŧƫƬƭƮʈȚțȶṪṫṬṭṮṯṰṱẗUuÙùÚúÛûÜüŨũŪūŬŭŮůŰűŲųƯưǓǔǕǖǗǘǙǚǛǜȔȕȖȗṲṳṴṵṶṷṸṹṺṻỤụỦủỨứỪừỬửỮữỰựVvƲʋṼṽṾṿWwŴŵẀáºáº‚ẃẄẅẆẇẈẉẘXxẊẋẌáºYyÃýÿŸŶŷƳƴȲȳẎáºáº™á»²á»³á»´á»µá»¶á»·á»¸á»¹ZzŹźŻżŽžƵƶȤȥÊÊ‘áºáº‘ẒẓẔẕẕ" lang="en"/>
+<l:gentext key="normalize.sort.output" text="AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBCCCCCCCCCCCCCCCCCDDDDDDDDDDDDDDDDDDDDDDDDEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEFFFFFFGGGGGGGGGGGGGGGGGGGGHHHHHHHHHHHHHHHHHHHHIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIJJJJJJKKKKKKKKKKKKKKLLLLLLLLLLLLLLLLLLLLLLLLLLMMMMMMMMMNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOPPPPPPPPQQQRRRRRRRRRRRRRRRRRRRRRRRSSSSSSSSSSSSSSSSSSSSSSSTTTTTTTTTTTTTTTTTTTTTTTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUVVVVVVVVWWWWWWWWWWWWWWWXXXXXXYYYYYYYYYYYYYYYYYYYYYYYZZZZZZZZZZZZZZZZZZZZZ" lang="en"/>
+<l:dingbat key="startquote" text="“"/>
+<l:dingbat key="endquote" text="â€"/>
+<l:dingbat key="nestedstartquote" text="‘"/>
+<l:dingbat key="nestedendquote" text="’"/>
+<l:dingbat key="singlestartquote" text="‘" lang="en"/>
+<l:dingbat key="singleendquote" text="’" lang="en"/>
+<l:dingbat key="bullet" text="•"/>
+<l:gentext key="hyphenation-character" text="-" lang="en"/>
+<l:gentext key="hyphenation-push-character-count" text="2" lang="en"/>
+<l:gentext key="hyphenation-remain-character-count" text="2" lang="en"/>
+<l:context name="styles"><l:template name="person-name" text="first-last"/>
+</l:context>
+<l:context name="title"><l:template name="abstract" text="%t"/>
+<l:template name="acknowledgements" text="%t" lang="en"/>
+<l:template name="answer" text="%t"/>
+<l:template name="appendix" text="ë¶€ë¡ %n. %t"/>
+<l:template name="article" text="%t"/>
+<l:template name="authorblurb" text="%t"/>
+<l:template name="bibliodiv" text="%t"/>
+<l:template name="biblioentry" text="%t"/>
+<l:template name="bibliography" text="%t"/>
+<l:template name="bibliolist" text="%t"/>
+<l:template name="bibliomixed" text="%t"/>
+<l:template name="bibliomset" text="%t"/>
+<l:template name="biblioset" text="%t"/>
+<l:template name="blockquote" text="%t"/>
+<l:template name="book" text="%t"/>
+<l:template name="calloutlist" text="%t"/>
+<l:template name="caution" text="%t"/>
+<l:template name="chapter" text="%n장. %t"/>
+<l:template name="colophon" text="%t"/>
+<l:template name="dedication" text="%t"/>
+<l:template name="equation" text="ìˆ˜ì‹ %n. %t"/>
+<l:template name="example" text="예 %n. %t"/>
+<l:template name="figure" text="그림 %n. %t"/>
+<l:template name="foil" text="%t"/>
+<l:template name="foilgroup" text="%t"/>
+<l:template name="formalpara" text="%t"/>
+<l:template name="glossary" text="%t"/>
+<l:template name="glossdiv" text="%t"/>
+<l:template name="glosslist" text="%t"/>
+<l:template name="glossentry" text="%t"/>
+<l:template name="important" text="%t"/>
+<l:template name="index" text="%t"/>
+<l:template name="indexdiv" text="%t"/>
+<l:template name="itemizedlist" text="%t"/>
+<l:template name="legalnotice" text="%t"/>
+<l:template name="listitem" text=""/>
+<l:template name="lot" text="%t"/>
+<l:template name="msg" text="%t"/>
+<l:template name="msgexplan" text="%t"/>
+<l:template name="msgmain" text="%t"/>
+<l:template name="msgrel" text="%t"/>
+<l:template name="msgset" text="%t"/>
+<l:template name="msgsub" text="%t"/>
+<l:template name="note" text="%t"/>
+<l:template name="orderedlist" text="%t"/>
+<l:template name="part" text="%n부. %t"/>
+<l:template name="partintro" text="%t"/>
+<l:template name="preface" text="%t"/>
+<l:template name="procedure" text="%t"/>
+<l:template name="procedure.formal" text="절차 %n. %t"/>
+<l:template name="productionset" text="%t"/>
+<l:template name="productionset.formal" text="Production %n"/>
+<l:template name="qandadiv" text="%t"/>
+<l:template name="qandaentry" text="%t"/>
+<l:template name="qandaset" text="%t"/>
+<l:template name="question" text="%t"/>
+<l:template name="refentry" text="%t"/>
+<l:template name="reference" text="%t"/>
+<l:template name="refsection" text="%t"/>
+<l:template name="refsect1" text="%t"/>
+<l:template name="refsect2" text="%t"/>
+<l:template name="refsect3" text="%t"/>
+<l:template name="refsynopsisdiv" text="%t"/>
+<l:template name="refsynopsisdivinfo" text="%t"/>
+<l:template name="segmentedlist" text="%t"/>
+<l:template name="set" text="%t"/>
+<l:template name="setindex" text="%t"/>
+<l:template name="sidebar" text="%t"/>
+<l:template name="step" text="%t"/>
+<l:template name="table" text="표 %n. %t"/>
+<l:template name="task" text="%t"/>
+<l:template name="tasksummary" text="%t" lang="en"/>
+<l:template name="taskprerequisites" text="%t" lang="en"/>
+<l:template name="taskrelated" text="%t" lang="en"/>
+<l:template name="tip" text="%t"/>
+<l:template name="toc" text="%t"/>
+<l:template name="variablelist" text="%t"/>
+<l:template name="varlistentry" text=""/>
+<l:template name="warning" text="%t"/>
+</l:context>
+<l:context name="title-unnumbered"><l:template name="appendix" text="%t"/>
+<l:template name="article/appendix" text="%t"/>
+<l:template name="bridgehead" text="%t"/>
+<l:template name="chapter" text="%t"/>
+<l:template name="sect1" text="%t"/>
+<l:template name="sect2" text="%t"/>
+<l:template name="sect3" text="%t"/>
+<l:template name="sect4" text="%t"/>
+<l:template name="sect5" text="%t"/>
+<l:template name="section" text="%t"/>
+<l:template name="simplesect" text="%t"/>
+<l:template name="part" text="%t"/>
+</l:context>
+<l:context name="title-numbered"><l:template name="appendix" text="ë¶€ë¡ %n. %t"/>
+<l:template name="article/appendix" text="%n. %t"/>
+<l:template name="bridgehead" text="%n. %t"/>
+<l:template name="chapter" text="%n장. %t"/>
+<l:template name="part" text="부 %n. %t"/>
+<l:template name="sect1" text="%n. %t"/>
+<l:template name="sect2" text="%n. %t"/>
+<l:template name="sect3" text="%n. %t"/>
+<l:template name="sect4" text="%n. %t"/>
+<l:template name="sect5" text="%n. %t"/>
+<l:template name="section" text="%n. %t"/>
+<l:template name="simplesect" text="%n. %t"/>
+</l:context>
+<l:context name="subtitle"><l:template name="appendix" text="%s"/>
+<l:template name="acknowledgements" text="%s" lang="en"/>
+<l:template name="article" text="%s"/>
+<l:template name="bibliodiv" text="%s"/>
+<l:template name="biblioentry" text="%s"/>
+<l:template name="bibliography" text="%s"/>
+<l:template name="bibliomixed" text="%s"/>
+<l:template name="bibliomset" text="%s"/>
+<l:template name="biblioset" text="%s"/>
+<l:template name="book" text="%s"/>
+<l:template name="chapter" text="%s"/>
+<l:template name="colophon" text="%s"/>
+<l:template name="dedication" text="%s"/>
+<l:template name="glossary" text="%s"/>
+<l:template name="glossdiv" text="%s"/>
+<l:template name="index" text="%s"/>
+<l:template name="indexdiv" text="%s"/>
+<l:template name="lot" text="%s"/>
+<l:template name="part" text="%s"/>
+<l:template name="partintro" text="%s"/>
+<l:template name="preface" text="%s"/>
+<l:template name="refentry" text="%s"/>
+<l:template name="reference" text="%s"/>
+<l:template name="refsection" text="%s"/>
+<l:template name="refsect1" text="%s"/>
+<l:template name="refsect2" text="%s"/>
+<l:template name="refsect3" text="%s"/>
+<l:template name="refsynopsisdiv" text="%s"/>
+<l:template name="sect1" text="%s"/>
+<l:template name="sect2" text="%s"/>
+<l:template name="sect3" text="%s"/>
+<l:template name="sect4" text="%s"/>
+<l:template name="sect5" text="%s"/>
+<l:template name="section" text="%s"/>
+<l:template name="set" text="%s"/>
+<l:template name="setindex" text="%s"/>
+<l:template name="sidebar" text="%s"/>
+<l:template name="simplesect" text="%s"/>
+<l:template name="toc" text="%s"/>
+</l:context>
+<l:context name="xref"><l:template name="abstract" text="%t"/>
+<l:template name="acknowledgements" text="%t" lang="en"/>
+<l:template name="answer" text="답변 %n"/>
+<l:template name="appendix" text="%t"/>
+<l:template name="article" text="%t"/>
+<l:template name="authorblurb" text="%t"/>
+<l:template name="bibliodiv" text="%t"/>
+<l:template name="bibliography" text="%t"/>
+<l:template name="bibliomset" text="%t"/>
+<l:template name="biblioset" text="%t"/>
+<l:template name="blockquote" text="%t"/>
+<l:template name="book" text="%t"/>
+<l:template name="calloutlist" text="%t"/>
+<l:template name="caution" text="%t"/>
+<l:template name="chapter" text="%t"/>
+<l:template name="colophon" text="%t"/>
+<l:template name="constraintdef" text="%t"/>
+<l:template name="dedication" text="%t"/>
+<l:template name="equation" text="%t"/>
+<l:template name="example" text="%t"/>
+<l:template name="figure" text="%t"/>
+<l:template name="foil" text="%t"/>
+<l:template name="foilgroup" text="%t"/>
+<l:template name="formalpara" text="%t"/>
+<l:template name="glossary" text="%t"/>
+<l:template name="glossdiv" text="%t"/>
+<l:template name="important" text="%t"/>
+<l:template name="index" text="%t"/>
+<l:template name="indexdiv" text="%t"/>
+<l:template name="itemizedlist" text="%t"/>
+<l:template name="legalnotice" text="%t"/>
+<l:template name="listitem" text="%n"/>
+<l:template name="lot" text="%t"/>
+<l:template name="msg" text="%t"/>
+<l:template name="msgexplan" text="%t"/>
+<l:template name="msgmain" text="%t"/>
+<l:template name="msgrel" text="%t"/>
+<l:template name="msgset" text="%t"/>
+<l:template name="msgsub" text="%t"/>
+<l:template name="note" text="%t"/>
+<l:template name="orderedlist" text="%t"/>
+<l:template name="part" text="%t"/>
+<l:template name="partintro" text="%t"/>
+<l:template name="preface" text="%t"/>
+<l:template name="procedure" text="%t"/>
+<l:template name="productionset" text="%t"/>
+<l:template name="qandadiv" text="%t"/>
+<l:template name="qandaentry" text="질문 %n"/>
+<l:template name="qandaset" text="%t"/>
+<l:template name="question" text="질문 %n"/>
+<l:template name="reference" text="%t"/>
+<l:template name="refsynopsisdiv" text="%t"/>
+<l:template name="segmentedlist" text="%t"/>
+<l:template name="set" text="%t"/>
+<l:template name="setindex" text="%t"/>
+<l:template name="sidebar" text="%t"/>
+<l:template name="table" text="%t"/>
+<l:template name="task" text="%t"/>
+<l:template name="tip" text="%t"/>
+<l:template name="toc" text="%t"/>
+<l:template name="variablelist" text="%t"/>
+<l:template name="varlistentry" text="%n"/>
+<l:template name="warning" text="%t"/>
+<l:template name="olink.document.citation" text=" in %o" lang="en"/>
+<l:template name="olink.page.citation" text=" (page %p)" lang="en"/>
+<l:template name="page.citation" text=" [%p]"/>
+<l:template name="page" text="(page %p)" lang="en"/>
+<l:template name="docname" text=" in %o" lang="en"/>
+<l:template name="docnamelong" text=" in the document titled %o" lang="en"/>
+<l:template name="pageabbrev" text="(p. %p)" lang="en"/>
+<l:template name="Page" text="Page %p" lang="en"/>
+<l:template name="bridgehead" text="“%tâ€"/>
+<l:template name="refsection" text="“%tâ€"/>
+<l:template name="refsect1" text="“%tâ€"/>
+<l:template name="refsect2" text="“%tâ€"/>
+<l:template name="refsect3" text="“%tâ€"/>
+<l:template name="sect1" text="“%tâ€"/>
+<l:template name="sect2" text="“%tâ€"/>
+<l:template name="sect3" text="“%tâ€"/>
+<l:template name="sect4" text="“%tâ€"/>
+<l:template name="sect5" text="“%tâ€"/>
+<l:template name="section" text="“%tâ€"/>
+<l:template name="simplesect" text="“%tâ€"/>
+</l:context>
+<l:context name="xref-number"><l:template name="answer" text="답변 %n"/>
+<l:template name="appendix" text="부ë¡Â %n"/>
+<l:template name="bridgehead" text="절 %n"/>
+<l:template name="chapter" text="%n장"/>
+<l:template name="equation" text="수ì‹Â %n"/>
+<l:template name="example" text="예 %n"/>
+<l:template name="figure" text="그림 %n"/>
+<l:template name="part" text="%n부"/>
+<l:template name="procedure" text="절차 %n"/>
+<l:template name="productionset" text="Production %n"/>
+<l:template name="qandadiv" text="질문그리고답변 %n"/>
+<l:template name="qandaentry" text="질문 %n"/>
+<l:template name="question" text="질문 %n"/>
+<l:template name="sect1" text="%nì ˆ"/>
+<l:template name="sect2" text="%nì ˆ"/>
+<l:template name="sect3" text="%nì ˆ"/>
+<l:template name="sect4" text="%nì ˆ"/>
+<l:template name="sect5" text="%nì ˆ"/>
+<l:template name="section" text="%nì ˆ"/>
+<l:template name="table" text="표 %n"/>
+</l:context>
+<l:context name="xref-number-and-title"><l:template name="appendix" text="부ë¡Â %n. %t"/>
+<l:template name="bridgehead" text="절 %n. “%tâ€"/>
+<l:template name="chapter" text="%n장. %t"/>
+<l:template name="equation" text="수ì‹Â %n. “%tâ€"/>
+<l:template name="example" text="예 %n. “%tâ€"/>
+<l:template name="figure" text="그림 %n. “%tâ€"/>
+<l:template name="part" text="%n부. %t"/>
+<l:template name="procedure" text="절차 %n. “%tâ€"/>
+<l:template name="productionset" text="Production %n. “%tâ€"/>
+<l:template name="qandadiv" text="질문그리고답변 %n. “%tâ€"/>
+<l:template name="refsect1" text="“%tâ€"/>
+<l:template name="refsect2" text="“%tâ€"/>
+<l:template name="refsect3" text="“%tâ€"/>
+<l:template name="refsection" text="“%tâ€"/>
+<l:template name="sect1" text="%nì ˆ. “%tâ€"/>
+<l:template name="sect2" text="%nì ˆ. “%tâ€"/>
+<l:template name="sect3" text="%nì ˆ. “%tâ€"/>
+<l:template name="sect4" text="%nì ˆ. “%tâ€"/>
+<l:template name="sect5" text="%nì ˆ. “%tâ€"/>
+<l:template name="section" text="%nì ˆ. “%tâ€"/>
+<l:template name="simplesect" text="“%tâ€"/>
+<l:template name="table" text="표 %n. “%tâ€"/>
+</l:context>
+<l:context name="authorgroup"><l:template name="sep" text=", "/>
+<l:template name="sep2" text=" 그리고 "/>
+<l:template name="seplast" text=", 그리고 "/>
+</l:context>
+<l:context name="glossary"><l:template name="see" text="살펴볼 내용 %t."/>
+<l:template name="seealso" text="다른 살펴볼 내용 %t."/>
+<l:template name="seealso-separator" text=", "/>
+</l:context>
+<l:context name="msgset"><l:template name="MsgAud" text="받는 ì´: "/>
+<l:template name="MsgLevel" text="중요ë„: "/>
+<l:template name="MsgOrig" text="보내는 ì´: "/>
+</l:context>
+<l:context name="datetime"><l:template name="format" text="m/d/Y" lang="en"/>
+</l:context>
+<l:context name="termdef"><l:template name="prefix" text="[Definition: " lang="en"/>
+<l:template name="suffix" text="]" lang="en"/>
+</l:context>
+<l:context name="datetime-full"><l:template name="January" text="January" lang="en"/>
+<l:template name="February" text="February" lang="en"/>
+<l:template name="March" text="March" lang="en"/>
+<l:template name="April" text="April" lang="en"/>
+<l:template name="May" text="May" lang="en"/>
+<l:template name="June" text="June" lang="en"/>
+<l:template name="July" text="July" lang="en"/>
+<l:template name="August" text="August" lang="en"/>
+<l:template name="September" text="September" lang="en"/>
+<l:template name="October" text="October" lang="en"/>
+<l:template name="November" text="November" lang="en"/>
+<l:template name="December" text="December" lang="en"/>
+<l:template name="Monday" text="Monday" lang="en"/>
+<l:template name="Tuesday" text="Tuesday" lang="en"/>
+<l:template name="Wednesday" text="Wednesday" lang="en"/>
+<l:template name="Thursday" text="Thursday" lang="en"/>
+<l:template name="Friday" text="Friday" lang="en"/>
+<l:template name="Saturday" text="Saturday" lang="en"/>
+<l:template name="Sunday" text="Sunday" lang="en"/>
+</l:context>
+<l:context name="datetime-abbrev"><l:template name="Jan" text="Jan" lang="en"/>
+<l:template name="Feb" text="Feb" lang="en"/>
+<l:template name="Mar" text="Mar" lang="en"/>
+<l:template name="Apr" text="Apr" lang="en"/>
+<l:template name="May" text="May" lang="en"/>
+<l:template name="Jun" text="Jun" lang="en"/>
+<l:template name="Jul" text="Jul" lang="en"/>
+<l:template name="Aug" text="Aug" lang="en"/>
+<l:template name="Sep" text="Sep" lang="en"/>
+<l:template name="Oct" text="Oct" lang="en"/>
+<l:template name="Nov" text="Nov" lang="en"/>
+<l:template name="Dec" text="Dec" lang="en"/>
+<l:template name="Mon" text="Mon" lang="en"/>
+<l:template name="Tue" text="Tue" lang="en"/>
+<l:template name="Wed" text="Wed" lang="en"/>
+<l:template name="Thu" text="Thu" lang="en"/>
+<l:template name="Fri" text="Fri" lang="en"/>
+<l:template name="Sat" text="Sat" lang="en"/>
+<l:template name="Sun" text="Sun" lang="en"/>
+</l:context>
+<l:context name="htmlhelp"><l:template name="langcode" text="0x0412 Korean"/>
+</l:context>
+<l:context name="index"><l:template name="term-separator" text=", " lang="en"/>
+<l:template name="number-separator" text=", " lang="en"/>
+<l:template name="range-separator" text="-" lang="en"/>
+</l:context>
+<l:context name="iso690"><l:template name="lastfirst.sep" text=", " lang="en"/>
+<l:template name="alt.person.two.sep" text=" – " lang="en"/>
+<l:template name="alt.person.last.sep" text=" – " lang="en"/>
+<l:template name="alt.person.more.sep" text=" – " lang="en"/>
+<l:template name="primary.editor" text=" (ed.)" lang="en"/>
+<l:template name="primary.many" text=", et al." lang="en"/>
+<l:template name="primary.sep" text=". " lang="en"/>
+<l:template name="submaintitle.sep" text=": " lang="en"/>
+<l:template name="title.sep" text=". " lang="en"/>
+<l:template name="othertitle.sep" text=", " lang="en"/>
+<l:template name="medium1" text=" [" lang="en"/>
+<l:template name="medium2" text="]" lang="en"/>
+<l:template name="secondary.person.sep" text="; " lang="en"/>
+<l:template name="secondary.sep" text=". " lang="en"/>
+<l:template name="respons.sep" text=". " lang="en"/>
+<l:template name="edition.sep" text=". " lang="en"/>
+<l:template name="edition.serial.sep" text=", " lang="en"/>
+<l:template name="issuing.range" text="-" lang="en"/>
+<l:template name="issuing.div" text=", " lang="en"/>
+<l:template name="issuing.sep" text=". " lang="en"/>
+<l:template name="partnr.sep" text=". " lang="en"/>
+<l:template name="placepubl.sep" text=": " lang="en"/>
+<l:template name="publyear.sep" text=", " lang="en"/>
+<l:template name="pubinfo.sep" text=". " lang="en"/>
+<l:template name="spec.pubinfo.sep" text=", " lang="en"/>
+<l:template name="upd.sep" text=", " lang="en"/>
+<l:template name="datecit1" text=" [cited " lang="en"/>
+<l:template name="datecit2" text="]" lang="en"/>
+<l:template name="extent.sep" text=". " lang="en"/>
+<l:template name="locs.sep" text=", " lang="en"/>
+<l:template name="location.sep" text=". " lang="en"/>
+<l:template name="serie.sep" text=". " lang="en"/>
+<l:template name="notice.sep" text=". " lang="en"/>
+<l:template name="access" text="Available " lang="en"/>
+<l:template name="acctoo" text="Also available " lang="en"/>
+<l:template name="onwww" text="from World Wide Web" lang="en"/>
+<l:template name="oninet" text="from Internet" lang="en"/>
+<l:template name="access.end" text=": " lang="en"/>
+<l:template name="link1" text="&lt;" lang="en"/>
+<l:template name="link2" text="&gt;" lang="en"/>
+<l:template name="access.sep" text=". " lang="en"/>
+<l:template name="isbn" text="ISBN " lang="en"/>
+<l:template name="issn" text="ISSN " lang="en"/>
+<l:template name="stdnum.sep" text=". " lang="en"/>
+<l:template name="patcountry.sep" text=". " lang="en"/>
+<l:template name="pattype.sep" text=", " lang="en"/>
+<l:template name="patnum.sep" text=". " lang="en"/>
+<l:template name="patdate.sep" text=". " lang="en"/>
+</l:context><l:letters lang="en"><l:l i="-1"/>
+<l:l i="0">Symbols</l:l>
+<l:l i="10">A</l:l>
+<l:l i="10">a</l:l>
+<l:l i="10">À</l:l>
+<l:l i="10">à</l:l>
+<l:l i="10">Ã</l:l>
+<l:l i="10">á</l:l>
+<l:l i="10">Â</l:l>
+<l:l i="10">â</l:l>
+<l:l i="10">Ã</l:l>
+<l:l i="10">ã</l:l>
+<l:l i="10">Ä</l:l>
+<l:l i="10">ä</l:l>
+<l:l i="10">Ã…</l:l>
+<l:l i="10">Ã¥</l:l>
+<l:l i="10">Ä€</l:l>
+<l:l i="10">Ä</l:l>
+<l:l i="10">Ä‚</l:l>
+<l:l i="10">ă</l:l>
+<l:l i="10">Ä„</l:l>
+<l:l i="10">Ä…</l:l>
+<l:l i="10">Ç</l:l>
+<l:l i="10">ÇŽ</l:l>
+<l:l i="10">Çž</l:l>
+<l:l i="10">ÇŸ</l:l>
+<l:l i="10">Ç </l:l>
+<l:l i="10">Ç¡</l:l>
+<l:l i="10">Ǻ</l:l>
+<l:l i="10">Ç»</l:l>
+<l:l i="10">È€</l:l>
+<l:l i="10">È</l:l>
+<l:l i="10">È‚</l:l>
+<l:l i="10">ȃ</l:l>
+<l:l i="10">Ȧ</l:l>
+<l:l i="10">ȧ</l:l>
+<l:l i="10">Ḁ</l:l>
+<l:l i="10">á¸</l:l>
+<l:l i="10">ẚ</l:l>
+<l:l i="10">Ạ</l:l>
+<l:l i="10">ạ</l:l>
+<l:l i="10">Ả</l:l>
+<l:l i="10">ả</l:l>
+<l:l i="10">Ấ</l:l>
+<l:l i="10">ấ</l:l>
+<l:l i="10">Ầ</l:l>
+<l:l i="10">ầ</l:l>
+<l:l i="10">Ẩ</l:l>
+<l:l i="10">ẩ</l:l>
+<l:l i="10">Ẫ</l:l>
+<l:l i="10">ẫ</l:l>
+<l:l i="10">Ậ</l:l>
+<l:l i="10">ậ</l:l>
+<l:l i="10">Ắ</l:l>
+<l:l i="10">ắ</l:l>
+<l:l i="10">Ằ</l:l>
+<l:l i="10">ằ</l:l>
+<l:l i="10">Ẳ</l:l>
+<l:l i="10">ẳ</l:l>
+<l:l i="10">Ẵ</l:l>
+<l:l i="10">ẵ</l:l>
+<l:l i="10">Ặ</l:l>
+<l:l i="10">ặ</l:l>
+<l:l i="20">B</l:l>
+<l:l i="20">b</l:l>
+<l:l i="20">Æ€</l:l>
+<l:l i="20">Æ</l:l>
+<l:l i="20">É“</l:l>
+<l:l i="20">Æ‚</l:l>
+<l:l i="20">ƃ</l:l>
+<l:l i="20">Ḃ</l:l>
+<l:l i="20">ḃ</l:l>
+<l:l i="20">Ḅ</l:l>
+<l:l i="20">ḅ</l:l>
+<l:l i="20">Ḇ</l:l>
+<l:l i="20">ḇ</l:l>
+<l:l i="30">C</l:l>
+<l:l i="30">c</l:l>
+<l:l i="30">Ç</l:l>
+<l:l i="30">ç</l:l>
+<l:l i="30">Ć</l:l>
+<l:l i="30">ć</l:l>
+<l:l i="30">Ĉ</l:l>
+<l:l i="30">ĉ</l:l>
+<l:l i="30">ÄŠ</l:l>
+<l:l i="30">Ä‹</l:l>
+<l:l i="30">Č</l:l>
+<l:l i="30">Ä</l:l>
+<l:l i="30">Ƈ</l:l>
+<l:l i="30">ƈ</l:l>
+<l:l i="30">É•</l:l>
+<l:l i="30">Ḉ</l:l>
+<l:l i="30">ḉ</l:l>
+<l:l i="40">D</l:l>
+<l:l i="40">d</l:l>
+<l:l i="40">ÄŽ</l:l>
+<l:l i="40">Ä</l:l>
+<l:l i="40">Ä</l:l>
+<l:l i="40">Ä‘</l:l>
+<l:l i="40">ÆŠ</l:l>
+<l:l i="40">É—</l:l>
+<l:l i="40">Æ‹</l:l>
+<l:l i="40">ƌ</l:l>
+<l:l i="40">Ç…</l:l>
+<l:l i="40">Dz</l:l>
+<l:l i="40">È¡</l:l>
+<l:l i="40">É–</l:l>
+<l:l i="40">Ḋ</l:l>
+<l:l i="40">ḋ</l:l>
+<l:l i="40">Ḍ</l:l>
+<l:l i="40">á¸</l:l>
+<l:l i="40">Ḏ</l:l>
+<l:l i="40">á¸</l:l>
+<l:l i="40">á¸</l:l>
+<l:l i="40">ḑ</l:l>
+<l:l i="40">Ḓ</l:l>
+<l:l i="40">ḓ</l:l>
+<l:l i="50">E</l:l>
+<l:l i="50">e</l:l>
+<l:l i="50">È</l:l>
+<l:l i="50">è</l:l>
+<l:l i="50">É</l:l>
+<l:l i="50">é</l:l>
+<l:l i="50">Ê</l:l>
+<l:l i="50">ê</l:l>
+<l:l i="50">Ë</l:l>
+<l:l i="50">ë</l:l>
+<l:l i="50">Ä’</l:l>
+<l:l i="50">Ä“</l:l>
+<l:l i="50">Ä”</l:l>
+<l:l i="50">Ä•</l:l>
+<l:l i="50">Ä–</l:l>
+<l:l i="50">Ä—</l:l>
+<l:l i="50">Ę</l:l>
+<l:l i="50">Ä™</l:l>
+<l:l i="50">Äš</l:l>
+<l:l i="50">Ä›</l:l>
+<l:l i="50">È„</l:l>
+<l:l i="50">È…</l:l>
+<l:l i="50">Ȇ</l:l>
+<l:l i="50">ȇ</l:l>
+<l:l i="50">Ȩ</l:l>
+<l:l i="50">È©</l:l>
+<l:l i="50">Ḕ</l:l>
+<l:l i="50">ḕ</l:l>
+<l:l i="50">Ḗ</l:l>
+<l:l i="50">ḗ</l:l>
+<l:l i="50">Ḙ</l:l>
+<l:l i="50">ḙ</l:l>
+<l:l i="50">Ḛ</l:l>
+<l:l i="50">ḛ</l:l>
+<l:l i="50">Ḝ</l:l>
+<l:l i="50">á¸</l:l>
+<l:l i="50">Ẹ</l:l>
+<l:l i="50">ẹ</l:l>
+<l:l i="50">Ẻ</l:l>
+<l:l i="50">ẻ</l:l>
+<l:l i="50">Ẽ</l:l>
+<l:l i="50">ẽ</l:l>
+<l:l i="50">Ế</l:l>
+<l:l i="50">ế</l:l>
+<l:l i="50">Ề</l:l>
+<l:l i="50">á»</l:l>
+<l:l i="50">Ể</l:l>
+<l:l i="50">ể</l:l>
+<l:l i="50">Ễ</l:l>
+<l:l i="50">á»…</l:l>
+<l:l i="50">Ệ</l:l>
+<l:l i="50">ệ</l:l>
+<l:l i="60">F</l:l>
+<l:l i="60">f</l:l>
+<l:l i="60">Æ‘</l:l>
+<l:l i="60">Æ’</l:l>
+<l:l i="60">Ḟ</l:l>
+<l:l i="60">ḟ</l:l>
+<l:l i="70">G</l:l>
+<l:l i="70">g</l:l>
+<l:l i="70">Ĝ</l:l>
+<l:l i="70">Ä</l:l>
+<l:l i="70">Äž</l:l>
+<l:l i="70">ÄŸ</l:l>
+<l:l i="70">Ä </l:l>
+<l:l i="70">Ä¡</l:l>
+<l:l i="70">Ä¢</l:l>
+<l:l i="70">Ä£</l:l>
+<l:l i="70">Æ“</l:l>
+<l:l i="70">É </l:l>
+<l:l i="70">Ǥ</l:l>
+<l:l i="70">Ç¥</l:l>
+<l:l i="70">Ǧ</l:l>
+<l:l i="70">ǧ</l:l>
+<l:l i="70">Ç´</l:l>
+<l:l i="70">ǵ</l:l>
+<l:l i="70">Ḡ</l:l>
+<l:l i="70">ḡ</l:l>
+<l:l i="80">H</l:l>
+<l:l i="80">h</l:l>
+<l:l i="80">Ĥ</l:l>
+<l:l i="80">Ä¥</l:l>
+<l:l i="80">Ħ</l:l>
+<l:l i="80">ħ</l:l>
+<l:l i="80">Èž</l:l>
+<l:l i="80">ÈŸ</l:l>
+<l:l i="80">ɦ</l:l>
+<l:l i="80">Ḣ</l:l>
+<l:l i="80">ḣ</l:l>
+<l:l i="80">Ḥ</l:l>
+<l:l i="80">ḥ</l:l>
+<l:l i="80">Ḧ</l:l>
+<l:l i="80">ḧ</l:l>
+<l:l i="80">Ḩ</l:l>
+<l:l i="80">ḩ</l:l>
+<l:l i="80">Ḫ</l:l>
+<l:l i="80">ḫ</l:l>
+<l:l i="80">ẖ</l:l>
+<l:l i="90">I</l:l>
+<l:l i="90">i</l:l>
+<l:l i="90">Ì</l:l>
+<l:l i="90">ì</l:l>
+<l:l i="90">Ã</l:l>
+<l:l i="90">í</l:l>
+<l:l i="90">ÃŽ</l:l>
+<l:l i="90">î</l:l>
+<l:l i="90">Ã</l:l>
+<l:l i="90">ï</l:l>
+<l:l i="90">Ĩ</l:l>
+<l:l i="90">Ä©</l:l>
+<l:l i="90">Ī</l:l>
+<l:l i="90">Ä«</l:l>
+<l:l i="90">Ĭ</l:l>
+<l:l i="90">Ä­</l:l>
+<l:l i="90">Ä®</l:l>
+<l:l i="90">į</l:l>
+<l:l i="90">Ä°</l:l>
+<l:l i="90">Æ—</l:l>
+<l:l i="90">ɨ</l:l>
+<l:l i="90">Ç</l:l>
+<l:l i="90">Ç</l:l>
+<l:l i="90">Ȉ</l:l>
+<l:l i="90">ȉ</l:l>
+<l:l i="90">ÈŠ</l:l>
+<l:l i="90">È‹</l:l>
+<l:l i="90">Ḭ</l:l>
+<l:l i="90">ḭ</l:l>
+<l:l i="90">Ḯ</l:l>
+<l:l i="90">ḯ</l:l>
+<l:l i="90">Ỉ</l:l>
+<l:l i="90">ỉ</l:l>
+<l:l i="90">Ị</l:l>
+<l:l i="90">ị</l:l>
+<l:l i="100">J</l:l>
+<l:l i="100">j</l:l>
+<l:l i="100">Ä´</l:l>
+<l:l i="100">ĵ</l:l>
+<l:l i="100">Ç°</l:l>
+<l:l i="100">Ê</l:l>
+<l:l i="110">K</l:l>
+<l:l i="110">k</l:l>
+<l:l i="110">Ķ</l:l>
+<l:l i="110">Ä·</l:l>
+<l:l i="110">Ƙ</l:l>
+<l:l i="110">Æ™</l:l>
+<l:l i="110">Ǩ</l:l>
+<l:l i="110">Ç©</l:l>
+<l:l i="110">Ḱ</l:l>
+<l:l i="110">ḱ</l:l>
+<l:l i="110">Ḳ</l:l>
+<l:l i="110">ḳ</l:l>
+<l:l i="110">Ḵ</l:l>
+<l:l i="110">ḵ</l:l>
+<l:l i="120">L</l:l>
+<l:l i="120">l</l:l>
+<l:l i="120">Ĺ</l:l>
+<l:l i="120">ĺ</l:l>
+<l:l i="120">Ä»</l:l>
+<l:l i="120">ļ</l:l>
+<l:l i="120">Ľ</l:l>
+<l:l i="120">ľ</l:l>
+<l:l i="120">Ä¿</l:l>
+<l:l i="120">Å€</l:l>
+<l:l i="120">Å</l:l>
+<l:l i="120">Å‚</l:l>
+<l:l i="120">Æš</l:l>
+<l:l i="120">Lj</l:l>
+<l:l i="120">È´</l:l>
+<l:l i="120">É«</l:l>
+<l:l i="120">ɬ</l:l>
+<l:l i="120">É­</l:l>
+<l:l i="120">Ḷ</l:l>
+<l:l i="120">ḷ</l:l>
+<l:l i="120">Ḹ</l:l>
+<l:l i="120">ḹ</l:l>
+<l:l i="120">Ḻ</l:l>
+<l:l i="120">ḻ</l:l>
+<l:l i="120">Ḽ</l:l>
+<l:l i="120">ḽ</l:l>
+<l:l i="130">M</l:l>
+<l:l i="130">m</l:l>
+<l:l i="130">ɱ</l:l>
+<l:l i="130">Ḿ</l:l>
+<l:l i="130">ḿ</l:l>
+<l:l i="130">á¹€</l:l>
+<l:l i="130">á¹</l:l>
+<l:l i="130">Ṃ</l:l>
+<l:l i="130">ṃ</l:l>
+<l:l i="140">N</l:l>
+<l:l i="140">n</l:l>
+<l:l i="140">Ñ</l:l>
+<l:l i="140">ñ</l:l>
+<l:l i="140">Ń</l:l>
+<l:l i="140">Å„</l:l>
+<l:l i="140">Å…</l:l>
+<l:l i="140">ņ</l:l>
+<l:l i="140">Ň</l:l>
+<l:l i="140">ň</l:l>
+<l:l i="140">Æ</l:l>
+<l:l i="140">ɲ</l:l>
+<l:l i="140">Æž</l:l>
+<l:l i="140">È </l:l>
+<l:l i="140">Ç‹</l:l>
+<l:l i="140">Ǹ</l:l>
+<l:l i="140">ǹ</l:l>
+<l:l i="140">ȵ</l:l>
+<l:l i="140">ɳ</l:l>
+<l:l i="140">Ṅ</l:l>
+<l:l i="140">á¹…</l:l>
+<l:l i="140">Ṇ</l:l>
+<l:l i="140">ṇ</l:l>
+<l:l i="140">Ṉ</l:l>
+<l:l i="140">ṉ</l:l>
+<l:l i="140">Ṋ</l:l>
+<l:l i="140">ṋ</l:l>
+<l:l i="150">O</l:l>
+<l:l i="150">o</l:l>
+<l:l i="150">Ã’</l:l>
+<l:l i="150">ò</l:l>
+<l:l i="150">Ó</l:l>
+<l:l i="150">ó</l:l>
+<l:l i="150">Ô</l:l>
+<l:l i="150">ô</l:l>
+<l:l i="150">Õ</l:l>
+<l:l i="150">õ</l:l>
+<l:l i="150">Ö</l:l>
+<l:l i="150">ö</l:l>
+<l:l i="150">Ø</l:l>
+<l:l i="150">ø</l:l>
+<l:l i="150">Ō</l:l>
+<l:l i="150">Å</l:l>
+<l:l i="150">ÅŽ</l:l>
+<l:l i="150">Å</l:l>
+<l:l i="150">Å</l:l>
+<l:l i="150">Å‘</l:l>
+<l:l i="150">ÆŸ</l:l>
+<l:l i="150">Æ </l:l>
+<l:l i="150">Æ¡</l:l>
+<l:l i="150">Ç‘</l:l>
+<l:l i="150">Ç’</l:l>
+<l:l i="150">Ǫ</l:l>
+<l:l i="150">Ç«</l:l>
+<l:l i="150">Ǭ</l:l>
+<l:l i="150">Ç­</l:l>
+<l:l i="150">Ǿ</l:l>
+<l:l i="150">Ç¿</l:l>
+<l:l i="150">Ȍ</l:l>
+<l:l i="150">È</l:l>
+<l:l i="150">ÈŽ</l:l>
+<l:l i="150">È</l:l>
+<l:l i="150">Ȫ</l:l>
+<l:l i="150">È«</l:l>
+<l:l i="150">Ȭ</l:l>
+<l:l i="150">È­</l:l>
+<l:l i="150">È®</l:l>
+<l:l i="150">ȯ</l:l>
+<l:l i="150">È°</l:l>
+<l:l i="150">ȱ</l:l>
+<l:l i="150">Ṍ</l:l>
+<l:l i="150">á¹</l:l>
+<l:l i="150">Ṏ</l:l>
+<l:l i="150">á¹</l:l>
+<l:l i="150">á¹</l:l>
+<l:l i="150">ṑ</l:l>
+<l:l i="150">á¹’</l:l>
+<l:l i="150">ṓ</l:l>
+<l:l i="150">Ọ</l:l>
+<l:l i="150">á»</l:l>
+<l:l i="150">Ỏ</l:l>
+<l:l i="150">á»</l:l>
+<l:l i="150">á»</l:l>
+<l:l i="150">ố</l:l>
+<l:l i="150">á»’</l:l>
+<l:l i="150">ồ</l:l>
+<l:l i="150">á»”</l:l>
+<l:l i="150">ổ</l:l>
+<l:l i="150">á»–</l:l>
+<l:l i="150">á»—</l:l>
+<l:l i="150">Ộ</l:l>
+<l:l i="150">á»™</l:l>
+<l:l i="150">Ớ</l:l>
+<l:l i="150">á»›</l:l>
+<l:l i="150">Ờ</l:l>
+<l:l i="150">á»</l:l>
+<l:l i="150">Ở</l:l>
+<l:l i="150">ở</l:l>
+<l:l i="150">á» </l:l>
+<l:l i="150">ỡ</l:l>
+<l:l i="150">Ợ</l:l>
+<l:l i="150">ợ</l:l>
+<l:l i="160">P</l:l>
+<l:l i="160">p</l:l>
+<l:l i="160">Ƥ</l:l>
+<l:l i="160">Æ¥</l:l>
+<l:l i="160">á¹”</l:l>
+<l:l i="160">ṕ</l:l>
+<l:l i="160">á¹–</l:l>
+<l:l i="160">á¹—</l:l>
+<l:l i="170">Q</l:l>
+<l:l i="170">q</l:l>
+<l:l i="170">Ê </l:l>
+<l:l i="180">R</l:l>
+<l:l i="180">r</l:l>
+<l:l i="180">Å”</l:l>
+<l:l i="180">Å•</l:l>
+<l:l i="180">Å–</l:l>
+<l:l i="180">Å—</l:l>
+<l:l i="180">Ř</l:l>
+<l:l i="180">Å™</l:l>
+<l:l i="180">È</l:l>
+<l:l i="180">È‘</l:l>
+<l:l i="180">È’</l:l>
+<l:l i="180">È“</l:l>
+<l:l i="180">ɼ</l:l>
+<l:l i="180">ɽ</l:l>
+<l:l i="180">ɾ</l:l>
+<l:l i="180">Ṙ</l:l>
+<l:l i="180">á¹™</l:l>
+<l:l i="180">Ṛ</l:l>
+<l:l i="180">á¹›</l:l>
+<l:l i="180">Ṝ</l:l>
+<l:l i="180">á¹</l:l>
+<l:l i="180">Ṟ</l:l>
+<l:l i="180">ṟ</l:l>
+<l:l i="190">S</l:l>
+<l:l i="190">s</l:l>
+<l:l i="190">Åš</l:l>
+<l:l i="190">Å›</l:l>
+<l:l i="190">Ŝ</l:l>
+<l:l i="190">Å</l:l>
+<l:l i="190">Åž</l:l>
+<l:l i="190">ÅŸ</l:l>
+<l:l i="190">Å </l:l>
+<l:l i="190">Å¡</l:l>
+<l:l i="190">Ș</l:l>
+<l:l i="190">È™</l:l>
+<l:l i="190">Ê‚</l:l>
+<l:l i="190">á¹ </l:l>
+<l:l i="190">ṡ</l:l>
+<l:l i="190">á¹¢</l:l>
+<l:l i="190">á¹£</l:l>
+<l:l i="190">Ṥ</l:l>
+<l:l i="190">á¹¥</l:l>
+<l:l i="190">Ṧ</l:l>
+<l:l i="190">ṧ</l:l>
+<l:l i="190">Ṩ</l:l>
+<l:l i="190">ṩ</l:l>
+<l:l i="200">T</l:l>
+<l:l i="200">t</l:l>
+<l:l i="200">Å¢</l:l>
+<l:l i="200">Å£</l:l>
+<l:l i="200">Ť</l:l>
+<l:l i="200">Å¥</l:l>
+<l:l i="200">Ŧ</l:l>
+<l:l i="200">ŧ</l:l>
+<l:l i="200">Æ«</l:l>
+<l:l i="200">Ƭ</l:l>
+<l:l i="200">Æ­</l:l>
+<l:l i="200">Æ®</l:l>
+<l:l i="200">ʈ</l:l>
+<l:l i="200">Èš</l:l>
+<l:l i="200">È›</l:l>
+<l:l i="200">ȶ</l:l>
+<l:l i="200">Ṫ</l:l>
+<l:l i="200">ṫ</l:l>
+<l:l i="200">Ṭ</l:l>
+<l:l i="200">á¹­</l:l>
+<l:l i="200">á¹®</l:l>
+<l:l i="200">ṯ</l:l>
+<l:l i="200">á¹°</l:l>
+<l:l i="200">á¹±</l:l>
+<l:l i="200">ẗ</l:l>
+<l:l i="210">U</l:l>
+<l:l i="210">u</l:l>
+<l:l i="210">Ù</l:l>
+<l:l i="210">ù</l:l>
+<l:l i="210">Ú</l:l>
+<l:l i="210">ú</l:l>
+<l:l i="210">Û</l:l>
+<l:l i="210">û</l:l>
+<l:l i="210">Ü</l:l>
+<l:l i="210">ü</l:l>
+<l:l i="210">Ũ</l:l>
+<l:l i="210">Å©</l:l>
+<l:l i="210">Ū</l:l>
+<l:l i="210">Å«</l:l>
+<l:l i="210">Ŭ</l:l>
+<l:l i="210">Å­</l:l>
+<l:l i="210">Å®</l:l>
+<l:l i="210">ů</l:l>
+<l:l i="210">Å°</l:l>
+<l:l i="210">ű</l:l>
+<l:l i="210">Ų</l:l>
+<l:l i="210">ų</l:l>
+<l:l i="210">Ư</l:l>
+<l:l i="210">Æ°</l:l>
+<l:l i="210">Ç“</l:l>
+<l:l i="210">Ç”</l:l>
+<l:l i="210">Ç•</l:l>
+<l:l i="210">Ç–</l:l>
+<l:l i="210">Ç—</l:l>
+<l:l i="210">ǘ</l:l>
+<l:l i="210">Ç™</l:l>
+<l:l i="210">Çš</l:l>
+<l:l i="210">Ç›</l:l>
+<l:l i="210">ǜ</l:l>
+<l:l i="210">È”</l:l>
+<l:l i="210">È•</l:l>
+<l:l i="210">È–</l:l>
+<l:l i="210">È—</l:l>
+<l:l i="210">á¹²</l:l>
+<l:l i="210">á¹³</l:l>
+<l:l i="210">á¹´</l:l>
+<l:l i="210">á¹µ</l:l>
+<l:l i="210">Ṷ</l:l>
+<l:l i="210">á¹·</l:l>
+<l:l i="210">Ṹ</l:l>
+<l:l i="210">á¹¹</l:l>
+<l:l i="210">Ṻ</l:l>
+<l:l i="210">á¹»</l:l>
+<l:l i="210">Ụ</l:l>
+<l:l i="210">ụ</l:l>
+<l:l i="210">Ủ</l:l>
+<l:l i="210">ủ</l:l>
+<l:l i="210">Ứ</l:l>
+<l:l i="210">ứ</l:l>
+<l:l i="210">Ừ</l:l>
+<l:l i="210">ừ</l:l>
+<l:l i="210">Ử</l:l>
+<l:l i="210">á»­</l:l>
+<l:l i="210">á»®</l:l>
+<l:l i="210">ữ</l:l>
+<l:l i="210">á»°</l:l>
+<l:l i="210">á»±</l:l>
+<l:l i="220">V</l:l>
+<l:l i="220">v</l:l>
+<l:l i="220">Ʋ</l:l>
+<l:l i="220">Ê‹</l:l>
+<l:l i="220">á¹¼</l:l>
+<l:l i="220">á¹½</l:l>
+<l:l i="220">á¹¾</l:l>
+<l:l i="220">ṿ</l:l>
+<l:l i="230">W</l:l>
+<l:l i="230">w</l:l>
+<l:l i="230">Å´</l:l>
+<l:l i="230">ŵ</l:l>
+<l:l i="230">Ẁ</l:l>
+<l:l i="230">áº</l:l>
+<l:l i="230">Ẃ</l:l>
+<l:l i="230">ẃ</l:l>
+<l:l i="230">Ẅ</l:l>
+<l:l i="230">ẅ</l:l>
+<l:l i="230">Ẇ</l:l>
+<l:l i="230">ẇ</l:l>
+<l:l i="230">Ẉ</l:l>
+<l:l i="230">ẉ</l:l>
+<l:l i="230">ẘ</l:l>
+<l:l i="240">X</l:l>
+<l:l i="240">x</l:l>
+<l:l i="240">Ẋ</l:l>
+<l:l i="240">ẋ</l:l>
+<l:l i="240">Ẍ</l:l>
+<l:l i="240">áº</l:l>
+<l:l i="250">Y</l:l>
+<l:l i="250">y</l:l>
+<l:l i="250">Ã</l:l>
+<l:l i="250">ý</l:l>
+<l:l i="250">ÿ</l:l>
+<l:l i="250">Ÿ</l:l>
+<l:l i="250">Ŷ</l:l>
+<l:l i="250">Å·</l:l>
+<l:l i="250">Ƴ</l:l>
+<l:l i="250">Æ´</l:l>
+<l:l i="250">Ȳ</l:l>
+<l:l i="250">ȳ</l:l>
+<l:l i="250">Ẏ</l:l>
+<l:l i="250">áº</l:l>
+<l:l i="250">ẙ</l:l>
+<l:l i="250">Ỳ</l:l>
+<l:l i="250">ỳ</l:l>
+<l:l i="250">á»´</l:l>
+<l:l i="250">ỵ</l:l>
+<l:l i="250">Ỷ</l:l>
+<l:l i="250">á»·</l:l>
+<l:l i="250">Ỹ</l:l>
+<l:l i="250">ỹ</l:l>
+<l:l i="260">Z</l:l>
+<l:l i="260">z</l:l>
+<l:l i="260">Ź</l:l>
+<l:l i="260">ź</l:l>
+<l:l i="260">Å»</l:l>
+<l:l i="260">ż</l:l>
+<l:l i="260">Ž</l:l>
+<l:l i="260">ž</l:l>
+<l:l i="260">Ƶ</l:l>
+<l:l i="260">ƶ</l:l>
+<l:l i="260">Ȥ</l:l>
+<l:l i="260">È¥</l:l>
+<l:l i="260">Ê</l:l>
+<l:l i="260">Ê‘</l:l>
+<l:l i="260">áº</l:l>
+<l:l i="260">ẑ</l:l>
+<l:l i="260">Ẓ</l:l>
+<l:l i="260">ẓ</l:l>
+<l:l i="260">Ẕ</l:l>
+<l:l i="260">ẕ</l:l>
+</l:letters>
+</l:l10n>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/ky.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/ky.xml
new file mode 100644
index 0000000..eb2e50e
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/ky.xml
@@ -0,0 +1,732 @@
+<?xml version="1.0" encoding="utf-8"?>
+<l:l10n xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0" language="ky" english-language-name="Kirghiz">
+
+<!-- * This file is generated automatically. -->
+<!-- * To submit changes to this file upstream (to the DocBook Project) -->
+<!-- * do not submit an edited version of this file. Instead, submit an -->
+<!-- * edited version of the source file at the following location: -->
+<!-- * -->
+<!-- * https://docbook.svn.sourceforge.net/svnroot/docbook/trunk/gentext/locale/ky.xml -->
+<!-- * -->
+<!-- * E-mail the edited ky.xml source file to: -->
+<!-- * -->
+<!-- * docbook-developers@lists.sourceforge.net -->
+
+<!-- ******************************************************************** -->
+
+<!-- This file is part of the XSL DocBook Stylesheet distribution. -->
+<!-- See ../README or http://docbook.sf.net/release/xsl/current/ for -->
+<!-- copyright and other information. -->
+
+<!-- ******************************************************************** -->
+<!-- In these files, % with a letter is used for a placeholder: -->
+<!-- %t is the current element's title -->
+<!-- %s is the current element's subtitle (if applicable)-->
+<!-- %n is the current element's number label-->
+<!-- %p is the current element's page number (if applicable)-->
+<!-- ******************************************************************** -->
+
+
+<l:gentext key="Abstract" text="ÐннотациÑ"/>
+<l:gentext key="abstract" text="ÐннотациÑ"/>
+<l:gentext key="Acknowledgements" text="Acknowledgements" lang="en"/>
+<l:gentext key="acknowledgements" text="Acknowledgements" lang="en"/>
+<l:gentext key="Answer" text="Жооп:"/>
+<l:gentext key="answer" text="Жооп:"/>
+<l:gentext key="Appendix" text="Тиркеме"/>
+<l:gentext key="appendix" text="Тиркеме"/>
+<l:gentext key="Article" text="Макала"/>
+<l:gentext key="article" text="Макала"/>
+<l:gentext key="Author" text="Ðвтор"/>
+<l:gentext key="Bibliography" text="ÐдабиÑÑ‚"/>
+<l:gentext key="bibliography" text="ÐдабиÑÑ‚"/>
+<l:gentext key="Book" text="Китеп"/>
+<l:gentext key="book" text="Китеп"/>
+<l:gentext key="CAUTION" text="ЭСКЕРТҮҮ"/>
+<l:gentext key="Caution" text="ЭÑкертүү"/>
+<l:gentext key="caution" text="ЭÑкертүү"/>
+<l:gentext key="Chapter" text="Бөлүм"/>
+<l:gentext key="chapter" text="Бөлүм"/>
+<l:gentext key="Colophon" text="Китеп жөнүндө"/>
+<l:gentext key="colophon" text="Китеп жөнүндө"/>
+<l:gentext key="Copyright" text="Copyright"/>
+<l:gentext key="copyright" text="Copyright"/>
+<l:gentext key="Dedication" text="Ðрноо"/>
+<l:gentext key="dedication" text="Ðрноо"/>
+<l:gentext key="Edition" text="РедакциÑ"/>
+<l:gentext key="edition" text="РедакциÑ"/>
+<l:gentext key="Editor" text="Editor" lang="en"/>
+<l:gentext key="Equation" text="Формула"/>
+<l:gentext key="equation" text="Формула"/>
+<l:gentext key="Example" text="МиÑал"/>
+<l:gentext key="example" text="МиÑал"/>
+<l:gentext key="Figure" text="Сүрөт"/>
+<l:gentext key="figure" text="Сүрөт"/>
+<l:gentext key="Glossary" text="Сөздүк"/>
+<l:gentext key="glossary" text="Сөздүк"/>
+<l:gentext key="GlossSee" text="Караңыз"/>
+<l:gentext key="glosssee" text="Караңыз"/>
+<l:gentext key="GlossSeeAlso" text="Дагы караңыз"/>
+<l:gentext key="glossseealso" text="Дагы караңыз"/>
+<l:gentext key="IMPORTANT" text="ÐœÐÐÐИЛҮҮ"/>
+<l:gentext key="important" text="Маанилүү"/>
+<l:gentext key="Important" text="Маанилүү"/>
+<l:gentext key="Index" text="ИндекÑ"/>
+<l:gentext key="index" text="ИндекÑ"/>
+<l:gentext key="ISBN" text="ISBN"/>
+<l:gentext key="isbn" text="ISBN"/>
+<l:gentext key="LegalNotice" text="Ðвтордук укуктар"/>
+<l:gentext key="legalnotice" text="Ðвтордук укуктар"/>
+<l:gentext key="MsgAud" text="Audience"/>
+<l:gentext key="msgaud" text="Audience"/>
+<l:gentext key="MsgLevel" text="ДеңгÑÑл"/>
+<l:gentext key="msglevel" text="ДеңгÑÑл"/>
+<l:gentext key="MsgOrig" text="Булак"/>
+<l:gentext key="msgorig" text="Булак"/>
+<l:gentext key="NOTE" text="ЭСКЕРҮҮ"/>
+<l:gentext key="Note" text="ЭÑкерүү"/>
+<l:gentext key="note" text="ЭÑкерүү"/>
+<l:gentext key="Part" text="Түркүм"/>
+<l:gentext key="part" text="Түркүм"/>
+<l:gentext key="Preface" text="Кириш Ñөз"/>
+<l:gentext key="preface" text="Кириш Ñөз"/>
+<l:gentext key="Procedure" text="Процедура"/>
+<l:gentext key="procedure" text="Процедура"/>
+<l:gentext key="ProductionSet" text="Production"/>
+<l:gentext key="PubDate" text="Publication Date" lang="en"/>
+<l:gentext key="pubdate" text="Publication date" lang="en"/>
+<l:gentext key="Published" text="ЖариÑланган"/>
+<l:gentext key="published" text="ЖариÑланган"/>
+<l:gentext key="Publisher" text="Publisher" lang="en"/>
+<l:gentext key="Qandadiv" text="С жана Ж"/>
+<l:gentext key="qandadiv" text="С жана Ж"/>
+<l:gentext key="QandASet" text="Frequently Asked Questions" lang="en"/>
+<l:gentext key="Question" text="Суроо:"/>
+<l:gentext key="question" text="Суроо:"/>
+<l:gentext key="RefEntry" text=""/>
+<l:gentext key="refentry" text=""/>
+<l:gentext key="Reference" text="Шилтеме"/>
+<l:gentext key="reference" text="Шилтеме"/>
+<l:gentext key="References" text="References" lang="en"/>
+<l:gentext key="RefName" text="Ðталышы"/>
+<l:gentext key="refname" text="Ðталышы"/>
+<l:gentext key="RefSection" text=""/>
+<l:gentext key="refsection" text=""/>
+<l:gentext key="RefSynopsisDiv" text="СинтакÑиÑ"/>
+<l:gentext key="refsynopsisdiv" text="СинтакÑиÑ"/>
+<l:gentext key="RevHistory" text="БаÑылыш тарыхы"/>
+<l:gentext key="revhistory" text="БаÑылыш тарыхы"/>
+<l:gentext key="revision" text="БаÑылышы"/>
+<l:gentext key="Revision" text="БаÑылышы"/>
+<l:gentext key="sect1" text="Бөлүк"/>
+<l:gentext key="sect2" text="Бөлүк"/>
+<l:gentext key="sect3" text="Бөлүк"/>
+<l:gentext key="sect4" text="Бөлүк"/>
+<l:gentext key="sect5" text="Бөлүк"/>
+<l:gentext key="section" text="бөлүк"/>
+<l:gentext key="Section" text="Бөлүк"/>
+<l:gentext key="see" text="караңыз"/>
+<l:gentext key="See" text="Караңыз"/>
+<l:gentext key="seealso" text="Дагы караңыз"/>
+<l:gentext key="Seealso" text="Дагы караңыз"/>
+<l:gentext key="SeeAlso" text="Дагы караңыз"/>
+<l:gentext key="set" text="Тизме"/>
+<l:gentext key="Set" text="Тизме"/>
+<l:gentext key="setindex" text="Ылгап алынган тизме"/>
+<l:gentext key="SetIndex" text="Ылгап алынган тизме"/>
+<l:gentext key="Sidebar" text="Белгилөө"/>
+<l:gentext key="sidebar" text="белгилөө"/>
+<l:gentext key="step" text="кадам"/>
+<l:gentext key="Step" text="Кадам"/>
+<l:gentext key="table" text="таблица"/>
+<l:gentext key="Table" text="Таблица"/>
+<l:gentext key="task" text="Task" lang="en"/>
+<l:gentext key="Task" text="Task" lang="en"/>
+<l:gentext key="tip" text="шыбыроо"/>
+<l:gentext key="TIP" text="ШЫБЫРОО"/>
+<l:gentext key="Tip" text="Шыбыроо"/>
+<l:gentext key="Warning" text="Көңүл бургула"/>
+<l:gentext key="warning" text="Көңүл бургула"/>
+<l:gentext key="WARNING" text="КӨҢҮЛ БУРГУЛÐ"/>
+<l:gentext key="and" text=""/>
+<l:gentext key="by" text=""/>
+<l:gentext key="Edited" text="РедакциÑга даÑрдаган"/>
+<l:gentext key="edited" text="РедакциÑга даÑрдаган"/>
+<l:gentext key="Editedby" text="РедакциÑга даÑрдаган"/>
+<l:gentext key="editedby" text="РедакциÑга даÑрдаган"/>
+<l:gentext key="in" text=""/>
+<l:gentext key="lastlistcomma" text=","/>
+<l:gentext key="listcomma" text=","/>
+<l:gentext key="notes" text="ЭÑкертүү"/>
+<l:gentext key="Notes" text="ЭÑкертүү"/>
+<l:gentext key="Pgs" text="Барак"/>
+<l:gentext key="pgs" text="Барак"/>
+<l:gentext key="Revisedby" text="Оңдоолор: "/>
+<l:gentext key="revisedby" text="Оңдоолор: "/>
+<l:gentext key="TableNotes" text="ЭÑкертүү"/>
+<l:gentext key="tablenotes" text="ЭÑкертүү"/>
+<l:gentext key="TableofContents" text="Мазмун"/>
+<l:gentext key="tableofcontents" text="Мазмун"/>
+<l:gentext key="unexpectedelementname" text="unexpected element name"/>
+<l:gentext key="unsupported" text="unsupported"/>
+<l:gentext key="xrefto" text="xref to"/>
+<l:gentext key="Authors" text="Authors" lang="en"/>
+<l:gentext key="copyeditor" text="Copy Editor" lang="en"/>
+<l:gentext key="graphicdesigner" text="Graphic Designer" lang="en"/>
+<l:gentext key="productioneditor" text="Production Editor" lang="en"/>
+<l:gentext key="technicaleditor" text="Technical Editor" lang="en"/>
+<l:gentext key="translator" text="Translator" lang="en"/>
+<l:gentext key="listofequations" text="Формулалар"/>
+<l:gentext key="ListofEquations" text="Формулалар"/>
+<l:gentext key="ListofExamples" text="МиÑалдар"/>
+<l:gentext key="listofexamples" text="МиÑалдар"/>
+<l:gentext key="ListofFigures" text="Сүрөттөр"/>
+<l:gentext key="listoffigures" text="Сүрөттөр"/>
+<l:gentext key="ListofProcedures" text="List of Procedures" lang="en"/>
+<l:gentext key="listofprocedures" text="List of Procedures" lang="en"/>
+<l:gentext key="listoftables" text="Таблицалар"/>
+<l:gentext key="ListofTables" text="Таблицалар"/>
+<l:gentext key="ListofUnknown" text="БелгиÑиз"/>
+<l:gentext key="listofunknown" text="БелгиÑиз"/>
+<l:gentext key="nav-home" text="Башы"/>
+<l:gentext key="nav-next" text="Кийинки"/>
+<l:gentext key="nav-next-sibling" text="Кийинки бөлүм"/>
+<l:gentext key="nav-prev" text="Мурунку"/>
+<l:gentext key="nav-prev-sibling" text="Мурунку бөлүм"/>
+<l:gentext key="nav-up" text="ДеңгÑÑлге жогору"/>
+<l:gentext key="nav-toc" text="ToC" lang="en"/>
+<l:gentext key="Draft" text="Кол жазма"/>
+<l:gentext key="above" text="жогору"/>
+<l:gentext key="below" text="ылдый"/>
+<l:gentext key="sectioncalled" text="the section called"/>
+<l:gentext key="index symbols" text="Символдор"/>
+<l:gentext key="writing-mode" text="lr-tb"/>
+<l:gentext key="lowercase.alpha" text="абвгдеёжзийклмнңоөпрÑтуүфхцчшщъыьÑÑŽÑ"/>
+<l:gentext key="uppercase.alpha" text="ÐБВГДЕÐЖЗИЙКЛМÐҢОӨПРСТУҮФХЦЧШЩЪЫЬЭЮЯ"/>
+<l:gentext key="normalize.sort.input" text="AaÀàÃáÂâÃãÄäÅåĀÄĂ㥹ÇǎǞǟǠǡǺǻȀÈȂȃȦȧḀá¸áºšáº áº¡áº¢áº£áº¤áº¥áº¦áº§áº¨áº©áºªáº«áº¬áº­áº®áº¯áº°áº±áº²áº³áº´áºµáº¶áº·BbÆ€ÆɓƂƃḂḃḄḅḆḇCcÇçĆćĈĉĊċČÄƇƈɕḈḉDdÄŽÄÄđƊɗƋƌDžDzȡɖḊḋḌá¸á¸Žá¸á¸á¸‘ḒḓEeÈèÉéÊêËëĒēĔĕĖėĘęĚěȄȅȆȇȨȩḔḕḖḗḘḙḚḛḜá¸áº¸áº¹áººáº»áº¼áº½áº¾áº¿á»€á»á»‚ểỄễỆệFfƑƒḞḟGgÄœÄĞğĠġĢģƓɠǤǥǦǧǴǵḠḡHhĤĥĦħȞȟɦḢḣḤḥḦḧḨḩḪḫẖIiÌìÃíÎîÃïĨĩĪīĬĭĮįİƗɨÇÇȈȉȊȋḬḭḮḯỈỉỊịJjĴĵǰÊKkĶķƘƙǨǩḰḱḲḳḴḵLlĹĺĻļĽľĿŀÅłƚLjȴɫɬɭḶḷḸḹḺḻḼḽMmɱḾḿṀá¹á¹‚ṃNnÑñŃńŅņŇňÆɲƞȠNjǸǹȵɳṄṅṆṇṈṉṊṋOoÒòÓóÔôÕõÖöØøŌÅÅŽÅÅőƟƠơǑǒǪǫǬǭǾǿȌÈÈŽÈȪȫȬȭȮȯȰȱṌá¹á¹Žá¹á¹á¹‘ṒṓỌá»á»Žá»á»á»‘ỒồỔổỖỗỘộỚớỜá»á»žá»Ÿá» á»¡á»¢á»£PpƤƥṔṕṖṗQqÊ RrŔŕŖŗŘřÈȑȒȓɼɽɾṘṙṚṛṜá¹á¹žá¹ŸSsŚśŜÅŞşŠšȘșʂṠṡṢṣṤṥṦṧṨṩTtŢţŤťŦŧƫƬƭƮʈȚțȶṪṫṬṭṮṯṰṱẗUuÙùÚúÛûÜüŨũŪūŬŭŮůŰűŲųƯưǓǔǕǖǗǘǙǚǛǜȔȕȖȗṲṳṴṵṶṷṸṹṺṻỤụỦủỨứỪừỬửỮữỰựVvƲʋṼṽṾṿWwŴŵẀáºáº‚ẃẄẅẆẇẈẉẘXxẊẋẌáºYyÃýÿŸŶŷƳƴȲȳẎáºáº™á»²á»³á»´á»µá»¶á»·á»¸á»¹ZzŹźŻżŽžƵƶȤȥÊÊ‘áºáº‘ẒẓẔẕẕ" lang="en"/>
+<l:gentext key="normalize.sort.output" text="AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBCCCCCCCCCCCCCCCCCDDDDDDDDDDDDDDDDDDDDDDDDEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEFFFFFFGGGGGGGGGGGGGGGGGGGGHHHHHHHHHHHHHHHHHHHHIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIJJJJJJKKKKKKKKKKKKKKLLLLLLLLLLLLLLLLLLLLLLLLLLMMMMMMMMMNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOPPPPPPPPQQQRRRRRRRRRRRRRRRRRRRRRRRSSSSSSSSSSSSSSSSSSSSSSSTTTTTTTTTTTTTTTTTTTTTTTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUVVVVVVVVWWWWWWWWWWWWWWWXXXXXXYYYYYYYYYYYYYYYYYYYYYYYZZZZZZZZZZZZZZZZZZZZZ" lang="en"/>
+<l:dingbat key="startquote" text="«"/>
+<l:dingbat key="endquote" text="»"/>
+<l:dingbat key="nestedstartquote" text="„"/>
+<l:dingbat key="nestedendquote" text="“"/>
+<l:dingbat key="singlestartquote" text="‘" lang="en"/>
+<l:dingbat key="singleendquote" text="’" lang="en"/>
+<l:dingbat key="bullet" text="•"/>
+<l:gentext key="hyphenation-character" text="-" lang="en"/>
+<l:gentext key="hyphenation-push-character-count" text="2" lang="en"/>
+<l:gentext key="hyphenation-remain-character-count" text="2" lang="en"/>
+<l:context name="styles"><l:template name="person-name" text="first-last"/>
+</l:context>
+<l:context name="title"><l:template name="abstract" text="%t"/>
+<l:template name="acknowledgements" text="%t" lang="en"/>
+<l:template name="answer" text="%t"/>
+<l:template name="appendix" text="Тиркеме %n. %t"/>
+<l:template name="article" text="%t"/>
+<l:template name="authorblurb" text="%t"/>
+<l:template name="bibliodiv" text="%t"/>
+<l:template name="biblioentry" text="%t"/>
+<l:template name="bibliography" text="%t"/>
+<l:template name="bibliolist" text="%t" lang="en"/>
+<l:template name="bibliomixed" text="%t"/>
+<l:template name="bibliomset" text="%t"/>
+<l:template name="biblioset" text="%t"/>
+<l:template name="blockquote" text="%t"/>
+<l:template name="book" text="%t"/>
+<l:template name="calloutlist" text="%t"/>
+<l:template name="caution" text="%t"/>
+<l:template name="chapter" text="Бөлүм %n. %t"/>
+<l:template name="colophon" text="%t"/>
+<l:template name="dedication" text="%t"/>
+<l:template name="equation" text="Формула %n. %t"/>
+<l:template name="example" text="МиÑал %n. %t"/>
+<l:template name="figure" text="Сүрөт %n. %t"/>
+<l:template name="foil" text="%t" lang="en"/>
+<l:template name="foilgroup" text="%t" lang="en"/>
+<l:template name="formalpara" text="%t"/>
+<l:template name="glossary" text="%t"/>
+<l:template name="glossdiv" text="%t"/>
+<l:template name="glosslist" text="%t" lang="en"/>
+<l:template name="glossentry" text="%t" lang="en"/>
+<l:template name="important" text="%t"/>
+<l:template name="index" text="%t"/>
+<l:template name="indexdiv" text="%t"/>
+<l:template name="itemizedlist" text="%t"/>
+<l:template name="legalnotice" text="%t"/>
+<l:template name="listitem" text=""/>
+<l:template name="lot" text="%t"/>
+<l:template name="msg" text="%t"/>
+<l:template name="msgexplan" text="%t"/>
+<l:template name="msgmain" text="%t"/>
+<l:template name="msgrel" text="%t"/>
+<l:template name="msgset" text="%t"/>
+<l:template name="msgsub" text="%t"/>
+<l:template name="note" text="%t"/>
+<l:template name="orderedlist" text="%t"/>
+<l:template name="part" text="Түркүм %n. %t"/>
+<l:template name="partintro" text="%t"/>
+<l:template name="preface" text="%t"/>
+<l:template name="procedure" text="%t"/>
+<l:template name="procedure.formal" text="Процедура %n. %t"/>
+<l:template name="productionset" text="%t"/>
+<l:template name="productionset.formal" text="Production %n"/>
+<l:template name="qandadiv" text="%t"/>
+<l:template name="qandaentry" text="%t"/>
+<l:template name="qandaset" text="%t"/>
+<l:template name="question" text="%t"/>
+<l:template name="refentry" text="%t"/>
+<l:template name="reference" text="%t"/>
+<l:template name="refsection" text="%t"/>
+<l:template name="refsect1" text="%t"/>
+<l:template name="refsect2" text="%t"/>
+<l:template name="refsect3" text="%t"/>
+<l:template name="refsynopsisdiv" text="%t"/>
+<l:template name="refsynopsisdivinfo" text="%t"/>
+<l:template name="segmentedlist" text="%t"/>
+<l:template name="set" text="%t"/>
+<l:template name="setindex" text="%t"/>
+<l:template name="sidebar" text="%t"/>
+<l:template name="step" text="%t"/>
+<l:template name="table" text="Таблица %n. %t"/>
+<l:template name="task" text="%t" lang="en"/>
+<l:template name="tasksummary" text="%t" lang="en"/>
+<l:template name="taskprerequisites" text="%t" lang="en"/>
+<l:template name="taskrelated" text="%t" lang="en"/>
+<l:template name="tip" text="%t"/>
+<l:template name="toc" text="%t"/>
+<l:template name="variablelist" text="%t"/>
+<l:template name="varlistentry" text="" lang="en"/>
+<l:template name="warning" text="%t"/>
+</l:context>
+<l:context name="title-unnumbered"><l:template name="appendix" text="%t"/>
+<l:template name="article/appendix" text="%t" lang="en"/>
+<l:template name="bridgehead" text="%t"/>
+<l:template name="chapter" text="%t"/>
+<l:template name="sect1" text="%t"/>
+<l:template name="sect2" text="%t"/>
+<l:template name="sect3" text="%t"/>
+<l:template name="sect4" text="%t"/>
+<l:template name="sect5" text="%t"/>
+<l:template name="section" text="%t"/>
+<l:template name="simplesect" text="%t"/>
+<l:template name="part" text="%t" lang="en"/>
+</l:context>
+<l:context name="title-numbered"><l:template name="appendix" text="Тиркеме %n. %t"/>
+<l:template name="article/appendix" text="%n. %t" lang="en"/>
+<l:template name="bridgehead" text="%t"/>
+<l:template name="chapter" text="Бөлүм %n. %t"/>
+<l:template name="part" text="Түркүм %n. %t"/>
+<l:template name="sect1" text="%n. %t"/>
+<l:template name="sect2" text="%n. %t"/>
+<l:template name="sect3" text="%n. %t"/>
+<l:template name="sect4" text="%n. %t"/>
+<l:template name="sect5" text="%n. %t"/>
+<l:template name="section" text="%n. %t"/>
+<l:template name="simplesect" text="%n. %t"/>
+</l:context>
+<l:context name="subtitle"><l:template name="appendix" text="%s"/>
+<l:template name="acknowledgements" text="%s" lang="en"/>
+<l:template name="article" text="%s"/>
+<l:template name="bibliodiv" text="%s"/>
+<l:template name="biblioentry" text="%s"/>
+<l:template name="bibliography" text="%s"/>
+<l:template name="bibliomixed" text="%s"/>
+<l:template name="bibliomset" text="%s"/>
+<l:template name="biblioset" text="%s"/>
+<l:template name="book" text="%s"/>
+<l:template name="chapter" text="%s"/>
+<l:template name="colophon" text="%s"/>
+<l:template name="dedication" text="%s"/>
+<l:template name="glossary" text="%s"/>
+<l:template name="glossdiv" text="%s"/>
+<l:template name="index" text="%s"/>
+<l:template name="indexdiv" text="%s"/>
+<l:template name="lot" text="%s"/>
+<l:template name="part" text="%s"/>
+<l:template name="partintro" text="%s"/>
+<l:template name="preface" text="%s"/>
+<l:template name="refentry" text="%s"/>
+<l:template name="reference" text="%s"/>
+<l:template name="refsection" text="%s"/>
+<l:template name="refsect1" text="%s"/>
+<l:template name="refsect2" text="%s"/>
+<l:template name="refsect3" text="%s"/>
+<l:template name="refsynopsisdiv" text="%s"/>
+<l:template name="sect1" text="%s"/>
+<l:template name="sect2" text="%s"/>
+<l:template name="sect3" text="%s"/>
+<l:template name="sect4" text="%s"/>
+<l:template name="sect5" text="%s"/>
+<l:template name="section" text="%s"/>
+<l:template name="set" text="%s"/>
+<l:template name="setindex" text="%s"/>
+<l:template name="sidebar" text="%s"/>
+<l:template name="simplesect" text="%s"/>
+<l:template name="toc" text="%s"/>
+</l:context>
+<l:context name="xref"><l:template name="abstract" text="%t"/>
+<l:template name="acknowledgements" text="%t" lang="en"/>
+<l:template name="answer" text="Жооп: %n"/>
+<l:template name="appendix" text="%t"/>
+<l:template name="article" text="%t"/>
+<l:template name="authorblurb" text="%t"/>
+<l:template name="bibliodiv" text="%t"/>
+<l:template name="bibliography" text="%t"/>
+<l:template name="bibliomset" text="%t"/>
+<l:template name="biblioset" text="%t"/>
+<l:template name="blockquote" text="%t"/>
+<l:template name="book" text="%t"/>
+<l:template name="calloutlist" text="%t"/>
+<l:template name="caution" text="%t"/>
+<l:template name="chapter" text="%t"/>
+<l:template name="colophon" text="%t"/>
+<l:template name="constraintdef" text="%t"/>
+<l:template name="dedication" text="%t"/>
+<l:template name="equation" text="%t"/>
+<l:template name="example" text="%t"/>
+<l:template name="figure" text="%t"/>
+<l:template name="foil" text="%t" lang="en"/>
+<l:template name="foilgroup" text="%t" lang="en"/>
+<l:template name="formalpara" text="%t"/>
+<l:template name="glossary" text="%t"/>
+<l:template name="glossdiv" text="%t"/>
+<l:template name="important" text="%t"/>
+<l:template name="index" text="%t"/>
+<l:template name="indexdiv" text="%t"/>
+<l:template name="itemizedlist" text="%t"/>
+<l:template name="legalnotice" text="%t"/>
+<l:template name="listitem" text="%n"/>
+<l:template name="lot" text="%t"/>
+<l:template name="msg" text="%t"/>
+<l:template name="msgexplan" text="%t"/>
+<l:template name="msgmain" text="%t"/>
+<l:template name="msgrel" text="%t"/>
+<l:template name="msgset" text="%t"/>
+<l:template name="msgsub" text="%t"/>
+<l:template name="note" text="%t"/>
+<l:template name="orderedlist" text="%t"/>
+<l:template name="part" text="%t"/>
+<l:template name="partintro" text="%t"/>
+<l:template name="preface" text="%t"/>
+<l:template name="procedure" text="%t"/>
+<l:template name="productionset" text="%t"/>
+<l:template name="qandadiv" text="%t"/>
+<l:template name="qandaentry" text="Суроо: %n"/>
+<l:template name="qandaset" text="%t"/>
+<l:template name="question" text="Суроо: %n"/>
+<l:template name="reference" text="%t"/>
+<l:template name="refsynopsisdiv" text="%t"/>
+<l:template name="segmentedlist" text="%t"/>
+<l:template name="set" text="%t"/>
+<l:template name="setindex" text="%t"/>
+<l:template name="sidebar" text="%t"/>
+<l:template name="table" text="%t"/>
+<l:template name="task" text="%t" lang="en"/>
+<l:template name="tip" text="%t"/>
+<l:template name="toc" text="%t"/>
+<l:template name="variablelist" text="%t"/>
+<l:template name="varlistentry" text="%n"/>
+<l:template name="warning" text="%t"/>
+<l:template name="olink.document.citation" text=" in %o" lang="en"/>
+<l:template name="olink.page.citation" text=" (page %p)" lang="en"/>
+<l:template name="page.citation" text=" [%p]"/>
+<l:template name="page" text="(page %p)" lang="en"/>
+<l:template name="docname" text=" in %o" lang="en"/>
+<l:template name="docnamelong" text=" in the document titled %o" lang="en"/>
+<l:template name="pageabbrev" text="(p. %p)" lang="en"/>
+<l:template name="Page" text="Page %p" lang="en"/>
+<l:template name="bridgehead" text="«%t»"/>
+<l:template name="refsection" text="«%t»"/>
+<l:template name="refsect1" text="«%t»"/>
+<l:template name="refsect2" text="«%t»"/>
+<l:template name="refsect3" text="«%t»"/>
+<l:template name="sect1" text="«%t»"/>
+<l:template name="sect2" text="«%t»"/>
+<l:template name="sect3" text="«%t»"/>
+<l:template name="sect4" text="«%t»"/>
+<l:template name="sect5" text="«%t»"/>
+<l:template name="section" text="«%t»"/>
+<l:template name="simplesect" text="«%t»"/>
+</l:context>
+<l:context name="xref-number"><l:template name="answer" text="Жооп: %n"/>
+<l:template name="appendix" text="Тиркеме %n"/>
+<l:template name="bridgehead" text="Бөлүк %n"/>
+<l:template name="chapter" text="Бөлүм %n"/>
+<l:template name="equation" text="Формула %n"/>
+<l:template name="example" text="МиÑал %n"/>
+<l:template name="figure" text="Сүрөт %n"/>
+<l:template name="part" text="Түркүм %n"/>
+<l:template name="procedure" text="Процедура %n"/>
+<l:template name="productionset" text="Production %n"/>
+<l:template name="qandadiv" text="С жана Ж %n"/>
+<l:template name="qandaentry" text="Суроо: %n"/>
+<l:template name="question" text="Суроо: %n"/>
+<l:template name="sect1" text="Бөлүк %n"/>
+<l:template name="sect2" text="Бөлүк %n"/>
+<l:template name="sect3" text="Бөлүк %n"/>
+<l:template name="sect4" text="Бөлүк %n"/>
+<l:template name="sect5" text="Бөлүк %n"/>
+<l:template name="section" text="Бөлүк %n"/>
+<l:template name="table" text="Таблица %n"/>
+</l:context>
+<l:context name="xref-number-and-title"><l:template name="appendix" text="Тиркеме %n, %t"/>
+<l:template name="bridgehead" text="Бөлүк %n, «%t»"/>
+<l:template name="chapter" text="Бөлүм %n, %t"/>
+<l:template name="equation" text="Формула %n, «%t»"/>
+<l:template name="example" text="МиÑал %n, «%t»"/>
+<l:template name="figure" text="Сүрөт %n, «%t»"/>
+<l:template name="part" text="Түркүм %n, «%t»"/>
+<l:template name="procedure" text="Процедура %n, «%t»"/>
+<l:template name="productionset" text="Production %n, «%t»"/>
+<l:template name="qandadiv" text="С жана Ж %n, «%t»"/>
+<l:template name="refsect1" text="the section called «%t»"/>
+<l:template name="refsect2" text="the section called «%t»"/>
+<l:template name="refsect3" text="the section called «%t»"/>
+<l:template name="refsection" text="the section called «%t»"/>
+<l:template name="sect1" text="Бөлүк %n, «%t»"/>
+<l:template name="sect2" text="Бөлүк %n, «%t»"/>
+<l:template name="sect3" text="Бөлүк %n, «%t»"/>
+<l:template name="sect4" text="Бөлүк %n, «%t»"/>
+<l:template name="sect5" text="Бөлүк %n, «%t»"/>
+<l:template name="section" text="Бөлүк %n, «%t»"/>
+<l:template name="simplesect" text="the section called «%t»"/>
+<l:template name="table" text="Таблица %n, «%t»"/>
+</l:context>
+<l:context name="authorgroup"><l:template name="sep" text=", "/>
+<l:template name="sep2" text=" "/>
+<l:template name="seplast" text=", "/>
+</l:context>
+<l:context name="glossary"><l:template name="see" text="Караңыз %t."/>
+<l:template name="seealso" text="Дагы караңыз %t."/>
+<l:template name="seealso-separator" text=", "/>
+</l:context>
+<l:context name="msgset"><l:template name="MsgAud" text="Audience: "/>
+<l:template name="MsgLevel" text="ДеңгÑÑл: "/>
+<l:template name="MsgOrig" text="Булак: "/>
+</l:context>
+<l:context name="datetime"><l:template name="format" text="d/m/Y"/>
+</l:context>
+<l:context name="termdef"><l:template name="prefix" text="[Definition: " lang="en"/>
+<l:template name="suffix" text="]" lang="en"/>
+</l:context>
+<l:context name="datetime-full"><l:template name="January" text="Январь"/>
+<l:template name="February" text="Февраль"/>
+<l:template name="March" text="Март"/>
+<l:template name="April" text="Ðпрель"/>
+<l:template name="May" text="Май"/>
+<l:template name="June" text="Июнь"/>
+<l:template name="July" text="Июль"/>
+<l:template name="August" text="ÐвгуÑÑ‚"/>
+<l:template name="September" text="СентÑбрь"/>
+<l:template name="October" text="ОктÑбрь"/>
+<l:template name="November" text="ÐоÑбрь"/>
+<l:template name="December" text="Декабрь"/>
+<l:template name="Monday" text="Дүйшөмбү"/>
+<l:template name="Tuesday" text="Шейшемби"/>
+<l:template name="Wednesday" text="Шаршемби"/>
+<l:template name="Thursday" text="Бейшемби"/>
+<l:template name="Friday" text="Жума"/>
+<l:template name="Saturday" text="Ишемби"/>
+<l:template name="Sunday" text="Жекшемби"/>
+</l:context>
+<l:context name="datetime-abbrev"><l:template name="Jan" text="Янв"/>
+<l:template name="Feb" text="Фев"/>
+<l:template name="Mar" text="Мар"/>
+<l:template name="Apr" text="Ðпр"/>
+<l:template name="May" text="Май"/>
+<l:template name="Jun" text="Июн"/>
+<l:template name="Jul" text="Июл"/>
+<l:template name="Aug" text="Ðвг"/>
+<l:template name="Sep" text="Сен"/>
+<l:template name="Oct" text="Окт"/>
+<l:template name="Nov" text="ÐоÑ"/>
+<l:template name="Dec" text="Дек"/>
+<l:template name="Mon" text="Дүй"/>
+<l:template name="Tue" text="Шей"/>
+<l:template name="Wed" text="Шар"/>
+<l:template name="Thu" text="Бей"/>
+<l:template name="Fri" text="Жум"/>
+<l:template name="Sat" text="Ише"/>
+<l:template name="Sun" text="Жек"/>
+</l:context>
+<l:context name="htmlhelp"><l:template name="langcode" text="0x0440 Kirghiz"/>
+</l:context>
+<l:context name="index"><l:template name="term-separator" text=", " lang="en"/>
+<l:template name="number-separator" text=", " lang="en"/>
+<l:template name="range-separator" text="-" lang="en"/>
+</l:context>
+<l:context name="iso690"><l:template name="lastfirst.sep" text=", " lang="en"/>
+<l:template name="alt.person.two.sep" text=" – " lang="en"/>
+<l:template name="alt.person.last.sep" text=" – " lang="en"/>
+<l:template name="alt.person.more.sep" text=" – " lang="en"/>
+<l:template name="primary.editor" text=" (ed.)" lang="en"/>
+<l:template name="primary.many" text=", et al." lang="en"/>
+<l:template name="primary.sep" text=". " lang="en"/>
+<l:template name="submaintitle.sep" text=": " lang="en"/>
+<l:template name="title.sep" text=". " lang="en"/>
+<l:template name="othertitle.sep" text=", " lang="en"/>
+<l:template name="medium1" text=" [" lang="en"/>
+<l:template name="medium2" text="]" lang="en"/>
+<l:template name="secondary.person.sep" text="; " lang="en"/>
+<l:template name="secondary.sep" text=". " lang="en"/>
+<l:template name="respons.sep" text=". " lang="en"/>
+<l:template name="edition.sep" text=". " lang="en"/>
+<l:template name="edition.serial.sep" text=", " lang="en"/>
+<l:template name="issuing.range" text="-" lang="en"/>
+<l:template name="issuing.div" text=", " lang="en"/>
+<l:template name="issuing.sep" text=". " lang="en"/>
+<l:template name="partnr.sep" text=". " lang="en"/>
+<l:template name="placepubl.sep" text=": " lang="en"/>
+<l:template name="publyear.sep" text=", " lang="en"/>
+<l:template name="pubinfo.sep" text=". " lang="en"/>
+<l:template name="spec.pubinfo.sep" text=", " lang="en"/>
+<l:template name="upd.sep" text=", " lang="en"/>
+<l:template name="datecit1" text=" [cited " lang="en"/>
+<l:template name="datecit2" text="]" lang="en"/>
+<l:template name="extent.sep" text=". " lang="en"/>
+<l:template name="locs.sep" text=", " lang="en"/>
+<l:template name="location.sep" text=". " lang="en"/>
+<l:template name="serie.sep" text=". " lang="en"/>
+<l:template name="notice.sep" text=". " lang="en"/>
+<l:template name="access" text="Available " lang="en"/>
+<l:template name="acctoo" text="Also available " lang="en"/>
+<l:template name="onwww" text="from World Wide Web" lang="en"/>
+<l:template name="oninet" text="from Internet" lang="en"/>
+<l:template name="access.end" text=": " lang="en"/>
+<l:template name="link1" text="&lt;" lang="en"/>
+<l:template name="link2" text="&gt;" lang="en"/>
+<l:template name="access.sep" text=". " lang="en"/>
+<l:template name="isbn" text="ISBN " lang="en"/>
+<l:template name="issn" text="ISSN " lang="en"/>
+<l:template name="stdnum.sep" text=". " lang="en"/>
+<l:template name="patcountry.sep" text=". " lang="en"/>
+<l:template name="pattype.sep" text=", " lang="en"/>
+<l:template name="patnum.sep" text=". " lang="en"/>
+<l:template name="patdate.sep" text=". " lang="en"/>
+</l:context><l:letters><l:l i="-1"/>
+<l:l i="0">Символдор</l:l>
+<l:l i="10">A</l:l>
+<l:l i="10">a</l:l>
+<l:l i="20">B</l:l>
+<l:l i="20">b</l:l>
+<l:l i="30">C</l:l>
+<l:l i="30">c</l:l>
+<l:l i="40">D</l:l>
+<l:l i="40">d</l:l>
+<l:l i="50">E</l:l>
+<l:l i="50">e</l:l>
+<l:l i="60">F</l:l>
+<l:l i="60">f</l:l>
+<l:l i="70">G</l:l>
+<l:l i="70">g</l:l>
+<l:l i="80">H</l:l>
+<l:l i="80">h</l:l>
+<l:l i="90">I</l:l>
+<l:l i="90">i</l:l>
+<l:l i="100">J</l:l>
+<l:l i="100">j</l:l>
+<l:l i="110">K</l:l>
+<l:l i="110">k</l:l>
+<l:l i="120">L</l:l>
+<l:l i="120">l</l:l>
+<l:l i="130">M</l:l>
+<l:l i="130">m</l:l>
+<l:l i="140">N</l:l>
+<l:l i="140">n</l:l>
+<l:l i="150">O</l:l>
+<l:l i="150">o</l:l>
+<l:l i="160">P</l:l>
+<l:l i="160">p</l:l>
+<l:l i="170">Q</l:l>
+<l:l i="170">q</l:l>
+<l:l i="180">R</l:l>
+<l:l i="180">r</l:l>
+<l:l i="190">S</l:l>
+<l:l i="190">s</l:l>
+<l:l i="200">T</l:l>
+<l:l i="200">t</l:l>
+<l:l i="210">U</l:l>
+<l:l i="210">u</l:l>
+<l:l i="220">V</l:l>
+<l:l i="220">v</l:l>
+<l:l i="230">W</l:l>
+<l:l i="230">w</l:l>
+<l:l i="240">X</l:l>
+<l:l i="240">x</l:l>
+<l:l i="250">Y</l:l>
+<l:l i="250">y</l:l>
+<l:l i="260">Z</l:l>
+<l:l i="260">z</l:l>
+<l:l i="270">Ð</l:l>
+<l:l i="270">а</l:l>
+<l:l i="280">Б</l:l>
+<l:l i="280">б</l:l>
+<l:l i="290">Ð’</l:l>
+<l:l i="290">в</l:l>
+<l:l i="300">Г</l:l>
+<l:l i="300">г</l:l>
+<l:l i="310">Д</l:l>
+<l:l i="310">д</l:l>
+<l:l i="320">Е</l:l>
+<l:l i="320">е</l:l>
+<l:l i="320">Ð</l:l>
+<l:l i="320">Ñ‘</l:l>
+<l:l i="330">Ж</l:l>
+<l:l i="330">ж</l:l>
+<l:l i="340">З</l:l>
+<l:l i="340">з</l:l>
+<l:l i="350">И</l:l>
+<l:l i="350">и</l:l>
+<l:l i="360">Й</l:l>
+<l:l i="360">й</l:l>
+<l:l i="370">К</l:l>
+<l:l i="370">к</l:l>
+<l:l i="380">Л</l:l>
+<l:l i="380">л</l:l>
+<l:l i="390">М</l:l>
+<l:l i="390">м</l:l>
+<l:l i="400">Ð</l:l>
+<l:l i="400">н</l:l>
+<l:l i="410">Ò¢</l:l>
+<l:l i="410">Ò£</l:l>
+<l:l i="420">О</l:l>
+<l:l i="420">о</l:l>
+<l:l i="430">Ó¨</l:l>
+<l:l i="430">Ó©</l:l>
+<l:l i="440">П</l:l>
+<l:l i="440">п</l:l>
+<l:l i="450">Р</l:l>
+<l:l i="450">Ñ€</l:l>
+<l:l i="460">С</l:l>
+<l:l i="460">Ñ</l:l>
+<l:l i="470">Т</l:l>
+<l:l i="470">Ñ‚</l:l>
+<l:l i="480">У</l:l>
+<l:l i="480">у</l:l>
+<l:l i="490">Ò®</l:l>
+<l:l i="490">Ò¯</l:l>
+<l:l i="500">Ф</l:l>
+<l:l i="500">Ñ„</l:l>
+<l:l i="510">Ð¥</l:l>
+<l:l i="510">Ñ…</l:l>
+<l:l i="520">Ц</l:l>
+<l:l i="520">ц</l:l>
+<l:l i="530">Ч</l:l>
+<l:l i="530">ч</l:l>
+<l:l i="540">Ш</l:l>
+<l:l i="540">ш</l:l>
+<l:l i="550">Щ</l:l>
+<l:l i="550">щ</l:l>
+<l:l i="560">Ъ</l:l>
+<l:l i="560">ÑŠ</l:l>
+<l:l i="570">Ы</l:l>
+<l:l i="570">Ñ‹</l:l>
+<l:l i="580">Ь</l:l>
+<l:l i="580">ь</l:l>
+<l:l i="590">Э</l:l>
+<l:l i="590">Ñ</l:l>
+<l:l i="600">Ю</l:l>
+<l:l i="600">ÑŽ</l:l>
+<l:l i="610">Я</l:l>
+<l:l i="610">Ñ</l:l>
+</l:letters>
+</l:l10n>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/l10n.dtd b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/l10n.dtd
new file mode 100644
index 0000000..9bf2f66
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/l10n.dtd
@@ -0,0 +1,64 @@
+<!ENTITY % prefix "l">
+
+<!ENTITY % xmlns "xmlns:%prefix;">
+<!ENTITY % uri "'http://docbook.sourceforge.net/xmlns/l10n/1.0'">
+
+<!ENTITY % i18n "%prefix;:i18n">
+<!ENTITY % l10n "%prefix;:l10n">
+<!ENTITY % gentext "%prefix;:gentext">
+<!ENTITY % dingbat "%prefix;:dingbat">
+<!ENTITY % context "%prefix;:context">
+<!ENTITY % template "%prefix;:template">
+<!ENTITY % letters "%prefix;:letters">
+<!ENTITY % l "%prefix;:l">
+<!ENTITY % lang "lang NMTOKEN #IMPLIED">
+
+<!ELEMENT %i18n; ((%l10n;)+)>
+<!ATTLIST %i18n;
+ %xmlns; CDATA #FIXED %uri;
+>
+
+<!ELEMENT %l10n; (%gentext;|%dingbat;|%context;|%letters;)*>
+<!ATTLIST %l10n;
+ %xmlns; CDATA #FIXED %uri;
+ language CDATA #REQUIRED
+ english-language-name CDATA #IMPLIED
+ href CDATA #IMPLIED
+>
+
+<!ELEMENT %gentext; EMPTY>
+<!ATTLIST %gentext;
+ %lang;
+ key CDATA #REQUIRED
+ text CDATA #REQUIRED
+>
+
+<!ELEMENT %dingbat; EMPTY>
+<!ATTLIST %dingbat;
+ %lang;
+ key CDATA #REQUIRED
+ text CDATA #REQUIRED
+>
+
+<!ELEMENT %context; ((%template;)+)>
+<!ATTLIST %context;
+ name CDATA #REQUIRED
+>
+
+<!ELEMENT %template; EMPTY>
+<!ATTLIST %template;
+ %lang;
+ name CDATA #REQUIRED
+ text CDATA #REQUIRED
+ style CDATA #IMPLIED
+>
+
+<!ELEMENT %letters; ((%l;)+)>
+<!ATTLIST %letters;
+ %lang;
+>
+
+<!ELEMENT %l; (#PCDATA)>
+<!ATTLIST %l;
+ i CDATA #REQUIRED
+>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/l10n.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/l10n.xml
new file mode 100644
index 0000000..da3df27
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/l10n.xml
@@ -0,0 +1,77 @@
+<?xml version='1.0'?>
+<!DOCTYPE l:i18n SYSTEM "l10n.dtd">
+<l:i18n xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0">
+<l:l10n language="af" href="af.xml"/>
+<l:l10n language="am" href="am.xml"/>
+<l:l10n language="ar" href="ar.xml"/>
+<l:l10n language="as" href="as.xml"/>
+<l:l10n language="ast" href="ast.xml"/>
+<l:l10n language="az" href="az.xml"/>
+<l:l10n language="bg" href="bg.xml"/>
+<l:l10n language="bn" href="bn.xml"/>
+<l:l10n language="bn_in" href="bn_in.xml"/>
+<l:l10n language="bs" href="bs.xml"/>
+<l:l10n language="ca" href="ca.xml"/>
+<l:l10n language="cs" href="cs.xml"/>
+<l:l10n language="cy" href="cy.xml"/>
+<l:l10n language="da" href="da.xml"/>
+<l:l10n language="de" href="de.xml"/>
+<l:l10n language="el" href="el.xml"/>
+<l:l10n language="en" href="en.xml"/>
+<l:l10n language="eo" href="eo.xml"/>
+<l:l10n language="es" href="es.xml"/>
+<l:l10n language="et" href="et.xml"/>
+<l:l10n language="eu" href="eu.xml"/>
+<l:l10n language="fa" href="fa.xml"/>
+<l:l10n language="fi" href="fi.xml"/>
+<l:l10n language="fr" href="fr.xml"/>
+<l:l10n language="ga" href="ga.xml"/>
+<l:l10n language="gl" href="gl.xml"/>
+<l:l10n language="gu" href="gu.xml"/>
+<l:l10n language="he" href="he.xml"/>
+<l:l10n language="hi" href="hi.xml"/>
+<l:l10n language="hr" href="hr.xml"/>
+<l:l10n language="hu" href="hu.xml"/>
+<l:l10n language="id" href="id.xml"/>
+<l:l10n language="is" href="is.xml"/>
+<l:l10n language="it" href="it.xml"/>
+<l:l10n language="ja" href="ja.xml"/>
+<l:l10n language="ka" href="ka.xml"/>
+<l:l10n language="kn" href="kn.xml"/>
+<l:l10n language="ko" href="ko.xml"/>
+<l:l10n language="ky" href="ky.xml"/>
+<l:l10n language="la" href="la.xml"/>
+<l:l10n language="lt" href="lt.xml"/>
+<l:l10n language="lv" href="lv.xml"/>
+<l:l10n language="ml" href="ml.xml"/>
+<l:l10n language="mn" href="mn.xml"/>
+<l:l10n language="mr" href="mr.xml"/>
+<l:l10n language="nb" href="nb.xml"/>
+<l:l10n language="nds" href="nds.xml"/>
+<l:l10n language="nl" href="nl.xml"/>
+<l:l10n language="nn" href="nn.xml"/>
+<l:l10n language="or" href="or.xml"/>
+<l:l10n language="pa" href="pa.xml"/>
+<l:l10n language="pl" href="pl.xml"/>
+<l:l10n language="pt" href="pt.xml"/>
+<l:l10n language="pt_br" href="pt_br.xml"/>
+<l:l10n language="ro" href="ro.xml"/>
+<l:l10n language="ru" href="ru.xml"/>
+<l:l10n language="sk" href="sk.xml"/>
+<l:l10n language="sl" href="sl.xml"/>
+<l:l10n language="sq" href="sq.xml"/>
+<l:l10n language="sr" href="sr.xml"/>
+<l:l10n language="sr_latn" href="sr_Latn.xml"/>
+<l:l10n language="sv" href="sv.xml"/>
+<l:l10n language="ta" href="ta.xml"/>
+<l:l10n language="te" href="te.xml"/>
+<l:l10n language="th" href="th.xml"/>
+<l:l10n language="tl" href="tl.xml"/>
+<l:l10n language="tr" href="tr.xml"/>
+<l:l10n language="uk" href="uk.xml"/>
+<l:l10n language="vi" href="vi.xml"/>
+<l:l10n language="xh" href="xh.xml"/>
+<l:l10n language="zh" href="zh.xml"/>
+<l:l10n language="zh_cn" href="zh_cn.xml"/>
+<l:l10n language="zh_tw" href="zh_tw.xml"/>
+</l:i18n>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/l10n.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/l10n.xsl
new file mode 100644
index 0000000..f35a0b6
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/l10n.xsl
@@ -0,0 +1,593 @@
+<?xml version='1.0'?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0"
+ exclude-result-prefixes="l"
+ version='1.0'>
+
+<!-- ********************************************************************
+ $Id: l10n.xsl 8904 2010-09-11 01:56:22Z kosek $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ This file contains localization templates (for internationalization)
+ ******************************************************************** -->
+
+<xsl:param name="l10n.xml" select="document('../common/l10n.xml')"/>
+<xsl:param name="local.l10n.xml" select="document('')"/>
+<xsl:param name="empty.local.l10n.xml" select="not($local.l10n.xml//l:l10n)"/>
+
+<xsl:key name="l10n-lang" match="l:l10n" use="@language"/>
+<xsl:key name="l10n-gentext" match="l:l10n/l:gentext" use="@key"/>
+<xsl:key name="l10n-dingbat" match="l:l10n/l:dingbat" use="@key"/>
+<xsl:key name="l10n-context" match="l:l10n/l:context" use="@name"/>
+<xsl:key name="l10n-template" match="l:l10n/l:context/l:template[not(@style)]" use="concat(../@name, '#', @name)"/>
+<xsl:key name="l10n-template-style" match="l:l10n/l:context/l:template[@style]" use="concat(../@name, '#', @name, '#', @style)"/>
+
+<xsl:template name="l10n.language">
+ <xsl:param name="target" select="."/>
+ <xsl:param name="xref-context" select="false()"/>
+
+ <xsl:variable name="mc-language">
+ <xsl:choose>
+ <xsl:when test="$l10n.gentext.language != ''">
+ <xsl:value-of select="$l10n.gentext.language"/>
+ </xsl:when>
+
+ <xsl:when test="$xref-context or $l10n.gentext.use.xref.language != 0">
+ <!-- can't do this one step: attributes are unordered! -->
+ <xsl:variable name="lang-scope"
+ select="$target/ancestor-or-self::*
+ [@lang or @xml:lang][1]"/>
+ <xsl:variable name="lang-attr"
+ select="($lang-scope/@lang | $lang-scope/@xml:lang)[1]"/>
+ <xsl:choose>
+ <xsl:when test="string($lang-attr) = ''">
+ <xsl:value-of select="$l10n.gentext.default.language"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$lang-attr"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+
+ <xsl:otherwise>
+ <!-- can't do this one step: attributes are unordered! -->
+ <xsl:variable name="lang-scope"
+ select="$target/ancestor-or-self::*
+ [@lang or @xml:lang][1]"/>
+ <xsl:variable name="lang-attr"
+ select="($lang-scope/@lang | $lang-scope/@xml:lang)[1]"/>
+
+ <xsl:choose>
+ <xsl:when test="string($lang-attr) = ''">
+ <xsl:value-of select="$l10n.gentext.default.language"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$lang-attr"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="language" select="translate($mc-language,
+ 'ABCDEFGHIJKLMNOPQRSTUVWXYZ-',
+ 'abcdefghijklmnopqrstuvwxyz_')"/>
+
+ <xsl:for-each select="$l10n.xml"> <!-- We need to change context in order to get key work -->
+ <xsl:choose>
+ <xsl:when test="key('l10n-lang', $language)">
+ <xsl:value-of select="$language"/>
+ </xsl:when>
+ <!-- try just the lang code without country -->
+ <xsl:when test="key('l10n-lang', substring-before($language,'_'))">
+ <xsl:value-of select="substring-before($language,'_')"/>
+ </xsl:when>
+ <!-- or use the default -->
+ <xsl:otherwise>
+ <xsl:message>
+ <xsl:text>No localization exists for "</xsl:text>
+ <xsl:value-of select="$language"/>
+ <xsl:text>" or "</xsl:text>
+ <xsl:value-of select="substring-before($language,'_')"/>
+ <xsl:text>". Using default "</xsl:text>
+ <xsl:value-of select="$l10n.gentext.default.language"/>
+ <xsl:text>".</xsl:text>
+ </xsl:message>
+ <xsl:value-of select="$l10n.gentext.default.language"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:for-each>
+</xsl:template>
+
+<xsl:template name="l10n.language.name">
+ <xsl:param name="lang">
+ <xsl:call-template name="l10n.language"/>
+ </xsl:param>
+
+ <xsl:for-each select="$l10n.xml">
+ <xsl:value-of
+ select="document(key('l10n-lang', $lang)/@href)/l:l10n/@english-language-name"/>
+ </xsl:for-each>
+</xsl:template>
+
+<xsl:template name="language.attribute">
+ <xsl:param name="node" select="."/>
+
+ <xsl:variable name="language">
+ <xsl:choose>
+ <xsl:when test="$l10n.gentext.language != ''">
+ <xsl:value-of select="$l10n.gentext.language"/>
+ </xsl:when>
+
+ <xsl:otherwise>
+ <!-- can't do this one step: attributes are unordered! -->
+ <xsl:variable name="lang-scope"
+ select="$node/ancestor-or-self::*
+ [@lang or @xml:lang][1]"/>
+ <xsl:variable name="lang-attr"
+ select="($lang-scope/@lang | $lang-scope/@xml:lang)[1]"/>
+
+ <xsl:choose>
+ <xsl:when test="string($lang-attr) = ''">
+ <xsl:value-of select="$l10n.gentext.default.language"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$lang-attr"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:if test="$language != ''">
+ <xsl:attribute name="lang">
+ <xsl:choose>
+ <xsl:when test="$l10n.lang.value.rfc.compliant != 0">
+ <xsl:value-of select="translate($language, '_', '-')"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$language"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:attribute>
+ </xsl:if>
+
+ <!-- FIXME: This is sort of hack, but it was the easiest way to add at least partial support for dir attribute -->
+ <xsl:copy-of select="ancestor-or-self::*[@dir][1]/@dir"/>
+</xsl:template>
+
+<!-- Duplication of language.attribute template to allow for xml:lang attribute
+ creation for XHTML 1.1 and epub target -->
+<xsl:template name="xml.language.attribute">
+ <xsl:param name="node" select="."/>
+
+ <xsl:variable name="language">
+ <xsl:choose>
+ <xsl:when test="$l10n.gentext.language != ''">
+ <xsl:value-of select="$l10n.gentext.language"/>
+ </xsl:when>
+
+ <xsl:otherwise>
+ <!-- can't do this one step: attributes are unordered! -->
+ <xsl:variable name="lang-scope"
+ select="$node/ancestor-or-self::*
+ [@lang or @xml:lang][1]"/>
+ <xsl:variable name="lang-attr"
+ select="($lang-scope/@lang | $lang-scope/@xml:lang)[1]"/>
+
+ <xsl:choose>
+ <xsl:when test="string($lang-attr) = ''">
+ <xsl:value-of select="$l10n.gentext.default.language"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$lang-attr"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:if test="$language != ''">
+ <xsl:attribute name="xml:lang">
+ <xsl:choose>
+ <xsl:when test="$l10n.lang.value.rfc.compliant != 0">
+ <xsl:value-of select="translate($language, '_', '-')"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$language"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:attribute>
+ </xsl:if>
+
+ <!-- FIXME: This is sort of hack, but it was the easiest way to add at least partial support for dir attribute -->
+ <xsl:copy-of select="ancestor-or-self::*[@dir][1]/@dir"/>
+</xsl:template>
+
+<xsl:template name="gentext">
+ <xsl:param name="key" select="local-name(.)"/>
+ <xsl:param name="lang">
+ <xsl:call-template name="l10n.language"/>
+ </xsl:param>
+
+ <xsl:for-each select="$l10n.xml"> <!-- We need to switch context in order to make key() work -->
+ <xsl:for-each select="document(key('l10n-lang', $lang)/@href)">
+ <xsl:variable name="local.l10n.gentext"
+ select="($local.l10n.xml//l:i18n/l:l10n[@language=$lang]/l:gentext[@key=$key])[1]"/>
+
+ <xsl:variable name="l10n.gentext"
+ select="key('l10n-gentext', $key)[1]"/>
+
+ <xsl:choose>
+ <xsl:when test="$local.l10n.gentext">
+ <xsl:value-of select="$local.l10n.gentext/@text"/>
+ </xsl:when>
+ <xsl:when test="$l10n.gentext">
+ <xsl:value-of select="$l10n.gentext/@text"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:message>
+ <xsl:text>No "</xsl:text>
+ <xsl:value-of select="$lang"/>
+ <xsl:text>" localization of "</xsl:text>
+ <xsl:value-of select="$key"/>
+ <xsl:text>" exists</xsl:text>
+ <xsl:choose>
+ <xsl:when test="$lang = 'en'">
+ <xsl:text>.</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text>; using "en".</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:message>
+
+ <xsl:for-each select="$l10n.xml"> <!-- We need to switch context in order to make key() work -->
+ <xsl:for-each select="document(key('l10n-lang', 'en')/@href)">
+ <xsl:value-of select="key('l10n-gentext', $key)[1]/@text"/>
+ </xsl:for-each>
+ </xsl:for-each>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:for-each>
+ </xsl:for-each>
+</xsl:template>
+
+<xsl:template name="gentext.element.name">
+ <xsl:param name="element.name" select="local-name(.)"/>
+ <xsl:param name="lang">
+ <xsl:call-template name="l10n.language"/>
+ </xsl:param>
+
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="$element.name"/>
+ <xsl:with-param name="lang" select="$lang"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template name="gentext.space">
+ <xsl:text> </xsl:text>
+</xsl:template>
+
+<xsl:template name="gentext.edited.by">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'Editedby'"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template name="gentext.by">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'by'"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template name="gentext.dingbat">
+ <xsl:param name="dingbat">bullet</xsl:param>
+ <xsl:param name="lang">
+ <xsl:call-template name="l10n.language"/>
+ </xsl:param>
+
+ <xsl:for-each select="$l10n.xml"> <!-- We need to switch context in order to make key() work -->
+ <xsl:for-each select="document(key('l10n-lang', $lang)/@href)">
+ <xsl:variable name="local.l10n.dingbat"
+ select="($local.l10n.xml//l:i18n/l:l10n[@language=$lang]/l:dingbat[@key=$dingbat])[1]"/>
+
+ <xsl:variable name="l10n.dingbat"
+ select="key('l10n-dingbat', $dingbat)[1]"/>
+
+ <xsl:choose>
+ <xsl:when test="$local.l10n.dingbat">
+ <xsl:value-of select="$local.l10n.dingbat/@text"/>
+ </xsl:when>
+ <xsl:when test="$l10n.dingbat">
+ <xsl:value-of select="$l10n.dingbat/@text"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:message>
+ <xsl:text>No "</xsl:text>
+ <xsl:value-of select="$lang"/>
+ <xsl:text>" localization of dingbat </xsl:text>
+ <xsl:value-of select="$dingbat"/>
+ <xsl:text> exists; using "en".</xsl:text>
+ </xsl:message>
+
+ <xsl:for-each select="$l10n.xml"> <!-- We need to switch context in order to make key() work -->
+ <xsl:for-each select="document(key('l10n-lang', 'en')/@href)">
+ <xsl:value-of select="key('l10n-dingbat', $dingbat)[1]/@text"/>
+ </xsl:for-each>
+ </xsl:for-each>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:for-each>
+ </xsl:for-each>
+</xsl:template>
+
+<xsl:template name="gentext.startquote">
+ <xsl:call-template name="gentext.dingbat">
+ <xsl:with-param name="dingbat">startquote</xsl:with-param>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template name="gentext.endquote">
+ <xsl:call-template name="gentext.dingbat">
+ <xsl:with-param name="dingbat">endquote</xsl:with-param>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template name="gentext.nestedstartquote">
+ <xsl:call-template name="gentext.dingbat">
+ <xsl:with-param name="dingbat">nestedstartquote</xsl:with-param>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template name="gentext.nestedendquote">
+ <xsl:call-template name="gentext.dingbat">
+ <xsl:with-param name="dingbat">nestedendquote</xsl:with-param>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template name="gentext.nav.prev">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'nav-prev'"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template name="gentext.nav.next">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'nav-next'"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template name="gentext.nav.home">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'nav-home'"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template name="gentext.nav.up">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'nav-up'"/>
+ </xsl:call-template>
+</xsl:template>
+
+<!-- ============================================================ -->
+
+<xsl:template name="gentext.template">
+ <xsl:param name="context" select="'default'"/>
+ <xsl:param name="name" select="'default'"/>
+ <xsl:param name="origname" select="$name"/>
+ <xsl:param name="purpose"/>
+ <xsl:param name="xrefstyle"/>
+ <xsl:param name="referrer"/>
+ <xsl:param name="lang">
+ <xsl:call-template name="l10n.language"/>
+ </xsl:param>
+ <xsl:param name="verbose" select="1"/>
+
+ <xsl:choose>
+ <xsl:when test="$empty.local.l10n.xml">
+ <xsl:for-each select="$l10n.xml"> <!-- We need to switch context in order to make key() work -->
+ <xsl:for-each select="document(key('l10n-lang', $lang)/@href)">
+
+ <xsl:variable name="localization.node"
+ select="key('l10n-lang', $lang)[1]"/>
+
+ <xsl:if test="count($localization.node) = 0
+ and $verbose != 0">
+ <xsl:message>
+ <xsl:text>No "</xsl:text>
+ <xsl:value-of select="$lang"/>
+ <xsl:text>" localization exists.</xsl:text>
+ </xsl:message>
+ </xsl:if>
+
+ <xsl:variable name="context.node"
+ select="key('l10n-context', $context)[1]"/>
+
+ <xsl:if test="count($context.node) = 0
+ and $verbose != 0">
+ <xsl:message>
+ <xsl:text>No context named "</xsl:text>
+ <xsl:value-of select="$context"/>
+ <xsl:text>" exists in the "</xsl:text>
+ <xsl:value-of select="$lang"/>
+ <xsl:text>" localization.</xsl:text>
+ </xsl:message>
+ </xsl:if>
+
+ <xsl:for-each select="$context.node">
+ <xsl:variable name="template.node"
+ select="(key('l10n-template-style', concat($context, '#', $name, '#', $xrefstyle))
+ |key('l10n-template', concat($context, '#', $name)))[1]"/>
+
+ <xsl:choose>
+ <xsl:when test="$template.node/@text">
+ <xsl:value-of select="$template.node/@text"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:choose>
+ <xsl:when test="contains($name, '/')">
+ <xsl:call-template name="gentext.template">
+ <xsl:with-param name="context" select="$context"/>
+ <xsl:with-param name="name" select="substring-after($name, '/')"/>
+ <xsl:with-param name="origname" select="$origname"/>
+ <xsl:with-param name="purpose" select="$purpose"/>
+ <xsl:with-param name="xrefstyle" select="$xrefstyle"/>
+ <xsl:with-param name="referrer" select="$referrer"/>
+ <xsl:with-param name="lang" select="$lang"/>
+ <xsl:with-param name="verbose" select="$verbose"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="$verbose = 0">
+ <!-- silence -->
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:message>
+ <xsl:text>No template for "</xsl:text>
+ <xsl:value-of select="$origname"/>
+ <xsl:text>" (or any of its leaves) exists in the context named "</xsl:text>
+ <xsl:value-of select="$context"/>
+ <xsl:text>" in the "</xsl:text>
+ <xsl:value-of select="$lang"/>
+ <xsl:text>" localization.</xsl:text>
+ </xsl:message>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:for-each>
+ </xsl:for-each>
+ </xsl:for-each>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:for-each select="$l10n.xml"> <!-- We need to switch context in order to make key() work -->
+ <xsl:for-each select="document(key('l10n-lang', $lang)/@href)">
+
+ <xsl:variable name="local.localization.node"
+ select="($local.l10n.xml//l:i18n/l:l10n[@language=$lang])[1]"/>
+
+ <xsl:variable name="localization.node"
+ select="key('l10n-lang', $lang)[1]"/>
+
+ <xsl:if test="count($localization.node) = 0
+ and count($local.localization.node) = 0
+ and $verbose != 0">
+ <xsl:message>
+ <xsl:text>No "</xsl:text>
+ <xsl:value-of select="$lang"/>
+ <xsl:text>" localization exists.</xsl:text>
+ </xsl:message>
+ </xsl:if>
+
+ <xsl:variable name="local.context.node"
+ select="$local.localization.node/l:context[@name=$context]"/>
+
+ <xsl:variable name="context.node"
+ select="key('l10n-context', $context)[1]"/>
+
+ <xsl:if test="count($context.node) = 0
+ and count($local.context.node) = 0
+ and $verbose != 0">
+ <xsl:message>
+ <xsl:text>No context named "</xsl:text>
+ <xsl:value-of select="$context"/>
+ <xsl:text>" exists in the "</xsl:text>
+ <xsl:value-of select="$lang"/>
+ <xsl:text>" localization.</xsl:text>
+ </xsl:message>
+ </xsl:if>
+
+ <xsl:variable name="local.template.node"
+ select="($local.context.node/l:template[@name=$name
+ and @style
+ and @style=$xrefstyle]
+ |$local.context.node/l:template[@name=$name
+ and not(@style)])[1]"/>
+
+ <xsl:for-each select="$context.node">
+ <xsl:variable name="template.node"
+ select="(key('l10n-template-style', concat($context, '#', $name, '#', $xrefstyle))
+ |key('l10n-template', concat($context, '#', $name)))[1]"/>
+
+ <xsl:choose>
+ <xsl:when test="$local.template.node/@text">
+ <xsl:value-of select="$local.template.node/@text"/>
+ </xsl:when>
+ <xsl:when test="$template.node/@text">
+ <xsl:value-of select="$template.node/@text"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:choose>
+ <xsl:when test="contains($name, '/')">
+ <xsl:call-template name="gentext.template">
+ <xsl:with-param name="context" select="$context"/>
+ <xsl:with-param name="name" select="substring-after($name, '/')"/>
+ <xsl:with-param name="origname" select="$origname"/>
+ <xsl:with-param name="purpose" select="$purpose"/>
+ <xsl:with-param name="xrefstyle" select="$xrefstyle"/>
+ <xsl:with-param name="referrer" select="$referrer"/>
+ <xsl:with-param name="lang" select="$lang"/>
+ <xsl:with-param name="verbose" select="$verbose"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="$verbose = 0">
+ <!-- silence -->
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:message>
+ <xsl:text>No template for "</xsl:text>
+ <xsl:value-of select="$origname"/>
+ <xsl:text>" (or any of its leaves) exists in the context named "</xsl:text>
+ <xsl:value-of select="$context"/>
+ <xsl:text>" in the "</xsl:text>
+ <xsl:value-of select="$lang"/>
+ <xsl:text>" localization.</xsl:text>
+ </xsl:message>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:for-each>
+ </xsl:for-each>
+ </xsl:for-each>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- silently test if a gentext template exists -->
+
+<xsl:template name="gentext.template.exists">
+ <xsl:param name="context" select="'default'"/>
+ <xsl:param name="name" select="'default'"/>
+ <xsl:param name="origname" select="$name"/>
+ <xsl:param name="purpose"/>
+ <xsl:param name="xrefstyle"/>
+ <xsl:param name="referrer"/>
+ <xsl:param name="lang">
+ <xsl:call-template name="l10n.language"/>
+ </xsl:param>
+
+ <xsl:variable name="template">
+ <xsl:call-template name="gentext.template">
+ <xsl:with-param name="context" select="$context"/>
+ <xsl:with-param name="name" select="$name"/>
+ <xsl:with-param name="origname" select="$origname"/>
+ <xsl:with-param name="purpose" select="$purpose"/>
+ <xsl:with-param name="xrefstyle" select="$xrefstyle"/>
+ <xsl:with-param name="referrer" select="$referrer"/>
+ <xsl:with-param name="lang" select="$lang"/>
+ <xsl:with-param name="verbose" select="0"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="string-length($template) != 0">1</xsl:when>
+ <xsl:otherwise>0</xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+</xsl:stylesheet> \ No newline at end of file
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/la.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/la.xml
new file mode 100644
index 0000000..f8a7013
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/la.xml
@@ -0,0 +1,1229 @@
+<?xml version="1.0" encoding="utf-8"?>
+<l:l10n xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0" language="la" english-language-name="Latin">
+
+<!-- * This file is generated automatically. -->
+<!-- * To submit changes to this file upstream (to the DocBook Project) -->
+<!-- * do not submit an edited version of this file. Instead, submit an -->
+<!-- * edited version of the source file at the following location: -->
+<!-- * -->
+<!-- * https://docbook.svn.sourceforge.net/svnroot/docbook/trunk/gentext/locale/la.xml -->
+<!-- * -->
+<!-- * E-mail the edited la.xml source file to: -->
+<!-- * -->
+<!-- * docbook-developers@lists.sourceforge.net -->
+
+<!-- ******************************************************************** -->
+
+<!-- This file is part of the XSL DocBook Stylesheet distribution. -->
+<!-- See ../README or http://docbook.sf.net/release/xsl/current/ for -->
+<!-- copyright and other information. -->
+
+<!-- ******************************************************************** -->
+<!-- In these files, % with a letter is used for a placeholder: -->
+<!-- %t is the current element's title -->
+<!-- %s is the current element's subtitle (if applicable)-->
+<!-- %n is the current element's number label-->
+<!-- %p is the current element's page number (if applicable)-->
+<!-- ******************************************************************** -->
+
+
+<l:gentext key="Abstract" text="Summarium"/>
+<l:gentext key="abstract" text="summarium"/>
+<l:gentext key="Acknowledgements" text="Acknowledgements" lang="en"/>
+<l:gentext key="acknowledgements" text="Acknowledgements" lang="en"/>
+<l:gentext key="Answer" text="R:"/>
+<l:gentext key="answer" text="r:"/>
+<l:gentext key="Appendix" text="Additamentum"/>
+<l:gentext key="appendix" text="additamentum"/>
+<l:gentext key="Article" text="Articulus"/>
+<l:gentext key="article" text="articulus"/>
+<l:gentext key="Author" text="Author" lang="en"/>
+<l:gentext key="Bibliography" text="Conspectus librorum"/>
+<l:gentext key="bibliography" text="conspectus librorum"/>
+<l:gentext key="Book" text="Liber"/>
+<l:gentext key="book" text="liber"/>
+<l:gentext key="CAUTION" text="Caveat"/>
+<l:gentext key="Caution" text="Caveat"/>
+<l:gentext key="caution" text="caveat"/>
+<l:gentext key="Chapter" text="Capitulum"/>
+<l:gentext key="chapter" text="capitulum"/>
+<l:gentext key="Colophon" text="Colophon"/>
+<l:gentext key="colophon" text="colophon"/>
+<l:gentext key="Copyright" text="Copyright"/>
+<l:gentext key="copyright" text="copyright"/>
+<l:gentext key="Dedication" text="Dedicatoria"/>
+<l:gentext key="dedication" text="dedicatoria"/>
+<l:gentext key="Edition" text="Editio"/>
+<l:gentext key="edition" text="editio"/>
+<l:gentext key="Editor" text="Editor" lang="en"/>
+<l:gentext key="Equation" text="Equatio"/>
+<l:gentext key="equation" text="equatio"/>
+<l:gentext key="Example" text="Exemplum"/>
+<l:gentext key="example" text="exemplum"/>
+<l:gentext key="Figure" text="Descriptio"/>
+<l:gentext key="figure" text="descriptio"/>
+<l:gentext key="Glossary" text="Glossarium"/>
+<l:gentext key="glossary" text="glossarium"/>
+<l:gentext key="GlossSee" text="Cfr."/>
+<l:gentext key="glosssee" text="Cfr."/>
+<l:gentext key="GlossSeeAlso" text="Cfr. autem"/>
+<l:gentext key="glossseealso" text="cfr. autem"/>
+<l:gentext key="IMPORTANT" text="GRAVE"/>
+<l:gentext key="important" text="grave"/>
+<l:gentext key="Important" text="Grave"/>
+<l:gentext key="Index" text="Index"/>
+<l:gentext key="index" text="index"/>
+<l:gentext key="ISBN" text="ISBN"/>
+<l:gentext key="isbn" text="isbn"/>
+<l:gentext key="LegalNotice" text="Nuntius legalis"/>
+<l:gentext key="legalnotice" text="nuntius legalis"/>
+<l:gentext key="MsgAud" text="Legentes"/>
+<l:gentext key="msgaud" text="legentes"/>
+<l:gentext key="MsgLevel" text="Libra"/>
+<l:gentext key="msglevel" text="libra"/>
+<l:gentext key="MsgOrig" text="Fons"/>
+<l:gentext key="msgorig" text="fons"/>
+<l:gentext key="NOTE" text="NOTA"/>
+<l:gentext key="Note" text="Nota"/>
+<l:gentext key="note" text="nota"/>
+<l:gentext key="Part" text="Pars"/>
+<l:gentext key="part" text="pars"/>
+<l:gentext key="Preface" text="Praefatio"/>
+<l:gentext key="preface" text="praefatio"/>
+<l:gentext key="Procedure" text="Progressio"/>
+<l:gentext key="procedure" text="progressio"/>
+<l:gentext key="ProductionSet" text="Compositio"/>
+<l:gentext key="PubDate" text="Publication Date" lang="en"/>
+<l:gentext key="pubdate" text="Publication date" lang="en"/>
+<l:gentext key="Published" text="Editum"/>
+<l:gentext key="published" text="editum"/>
+<l:gentext key="Publisher" text="Publisher" lang="en"/>
+<l:gentext key="Qandadiv" text="Q &amp; R"/>
+<l:gentext key="qandadiv" text="Q &amp; R"/>
+<l:gentext key="QandASet" text="Frequently Asked Questions" lang="en"/>
+<l:gentext key="Question" text="Q:"/>
+<l:gentext key="question" text="q:"/>
+<l:gentext key="RefEntry" text="Mentionis descriptio"/>
+<l:gentext key="refentry" text="mentionis descriptio"/>
+<l:gentext key="Reference" text="Mentio"/>
+<l:gentext key="reference" text="mentio"/>
+<l:gentext key="References" text="References" lang="en"/>
+<l:gentext key="RefName" text="Mentionis signum"/>
+<l:gentext key="refname" text="mentionis signum"/>
+<l:gentext key="RefSection" text="Mentionis pars"/>
+<l:gentext key="refsection" text="mentionis pars"/>
+<l:gentext key="RefSynopsisDiv" text="Synopsis"/>
+<l:gentext key="refsynopsisdiv" text="Synopsis"/>
+<l:gentext key="RevHistory" text="Revisionum historia"/>
+<l:gentext key="revhistory" text="revisionum historia"/>
+<l:gentext key="revision" text="Revisio"/>
+<l:gentext key="Revision" text="revisio"/>
+<l:gentext key="sect1" text="Sectio"/>
+<l:gentext key="sect2" text="Sectio"/>
+<l:gentext key="sect3" text="Sectio"/>
+<l:gentext key="sect4" text="Sectio"/>
+<l:gentext key="sect5" text="Sectio"/>
+<l:gentext key="section" text="Sectio"/>
+<l:gentext key="Section" text="Sectio"/>
+<l:gentext key="see" text="videtur"/>
+<l:gentext key="See" text="See" lang="en"/>
+<l:gentext key="seealso" text="videtur autem"/>
+<l:gentext key="Seealso" text="See also" lang="en"/>
+<l:gentext key="SeeAlso" text="See Also" lang="en"/>
+<l:gentext key="set" text="complexus"/>
+<l:gentext key="Set" text="Complexus"/>
+<l:gentext key="setindex" text="complexi index"/>
+<l:gentext key="SetIndex" text="Complexi index"/>
+<l:gentext key="Sidebar" text="Linea a latere posita"/>
+<l:gentext key="sidebar" text="linea a latere posita"/>
+<l:gentext key="step" text="peractio"/>
+<l:gentext key="Step" text="Peractio"/>
+<l:gentext key="table" text="tabula"/>
+<l:gentext key="Table" text="Tabula"/>
+<l:gentext key="task" text="Task" lang="en"/>
+<l:gentext key="Task" text="Task" lang="en"/>
+<l:gentext key="tip" text="consilium"/>
+<l:gentext key="TIP" text="CONSILIUM"/>
+<l:gentext key="Tip" text="Consilium"/>
+<l:gentext key="Warning" text="MONITUS"/>
+<l:gentext key="warning" text="monitus"/>
+<l:gentext key="WARNING" text="MONITUS"/>
+<l:gentext key="and" text="et"/>
+<l:gentext key="by" text="a"/>
+<l:gentext key="Edited" text="Editum"/>
+<l:gentext key="edited" text="editum"/>
+<l:gentext key="Editedby" text="Editum a"/>
+<l:gentext key="editedby" text="editum a"/>
+<l:gentext key="in" text="in"/>
+<l:gentext key="lastlistcomma" text=","/>
+<l:gentext key="listcomma" text=","/>
+<l:gentext key="notes" text="commentaria"/>
+<l:gentext key="Notes" text="Commentaria"/>
+<l:gentext key="Pgs" text="Pag."/>
+<l:gentext key="pgs" text="pag."/>
+<l:gentext key="Revisedby" text="Excussum a: "/>
+<l:gentext key="revisedby" text="excussum a: "/>
+<l:gentext key="TableNotes" text="Tabulae commentaria"/>
+<l:gentext key="tablenotes" text="tabulae commentaria"/>
+<l:gentext key="TableofContents" text="Index rerum notabilium"/>
+<l:gentext key="tableofcontents" text="index rerum notabilium"/>
+<l:gentext key="unexpectedelementname" text="necopinatum nomen"/>
+<l:gentext key="unsupported" text="non sustentatus"/>
+<l:gentext key="xrefto" text="mentio"/>
+<l:gentext key="Authors" text="Authors" lang="en"/>
+<l:gentext key="copyeditor" text="Copy Editor" lang="en"/>
+<l:gentext key="graphicdesigner" text="Graphic Designer" lang="en"/>
+<l:gentext key="productioneditor" text="Production Editor" lang="en"/>
+<l:gentext key="technicaleditor" text="Technical Editor" lang="en"/>
+<l:gentext key="translator" text="Translator" lang="en"/>
+<l:gentext key="listofequations" text="index aequationum"/>
+<l:gentext key="ListofEquations" text="Index aequationum"/>
+<l:gentext key="ListofExamples" text="Index exemplorum"/>
+<l:gentext key="listofexamples" text="index exemplorum"/>
+<l:gentext key="ListofFigures" text="Index descriptionum"/>
+<l:gentext key="listoffigures" text="index descriptionum"/>
+<l:gentext key="ListofProcedures" text="Index progressiorum"/>
+<l:gentext key="listofprocedures" text="index progressiorum"/>
+<l:gentext key="listoftables" text="index tabularum"/>
+<l:gentext key="ListofTables" text="Index tabularum"/>
+<l:gentext key="ListofUnknown" text="Index ignotorum"/>
+<l:gentext key="listofunknown" text="index ignotorum"/>
+<l:gentext key="nav-home" text="Initium"/>
+<l:gentext key="nav-next" text="Sequens"/>
+<l:gentext key="nav-next-sibling" text="Procede"/>
+<l:gentext key="nav-prev" text="Praecedens"/>
+<l:gentext key="nav-prev-sibling" text="Recede"/>
+<l:gentext key="nav-up" text="Ascende"/>
+<l:gentext key="nav-toc" text="Index"/>
+<l:gentext key="Draft" text="Plagula"/>
+<l:gentext key="above" text="supra"/>
+<l:gentext key="below" text="sub"/>
+<l:gentext key="sectioncalled" text="sectio vocata"/>
+<l:gentext key="index symbols" text="signa"/>
+<l:gentext key="writing-mode" text="lr-tb"/>
+<l:gentext key="lowercase.alpha" text="abcdefghijklmnopqrstuvwxyz"/>
+<l:gentext key="uppercase.alpha" text="ABCDEFGHIJKLMNOPQRSTUVWXYZ"/>
+<l:gentext key="normalize.sort.input" text="AaÀàÃáÂâÃãÄäÅåĀÄĂ㥹ÇǎǞǟǠǡǺǻȀÈȂȃȦȧḀá¸áºšáº áº¡áº¢áº£áº¤áº¥áº¦áº§áº¨áº©áºªáº«áº¬áº­áº®áº¯áº°áº±áº²áº³áº´áºµáº¶áº·BbÆ€ÆɓƂƃḂḃḄḅḆḇCcÇçĆćĈĉĊċČÄƇƈɕḈḉDdÄŽÄÄđƊɗƋƌDžDzȡɖḊḋḌá¸á¸Žá¸á¸á¸‘ḒḓEeÈèÉéÊêËëĒēĔĕĖėĘęĚěȄȅȆȇȨȩḔḕḖḗḘḙḚḛḜá¸áº¸áº¹áººáº»áº¼áº½áº¾áº¿á»€á»á»‚ểỄễỆệFfƑƒḞḟGgÄœÄĞğĠġĢģƓɠǤǥǦǧǴǵḠḡHhĤĥĦħȞȟɦḢḣḤḥḦḧḨḩḪḫẖIiÌìÃíÎîÃïĨĩĪīĬĭĮįİƗɨÇÇȈȉȊȋḬḭḮḯỈỉỊịJjĴĵǰÊKkĶķƘƙǨǩḰḱḲḳḴḵLlĹĺĻļĽľĿŀÅłƚLjȴɫɬɭḶḷḸḹḺḻḼḽMmɱḾḿṀá¹á¹‚ṃNnÑñŃńŅņŇňÆɲƞȠNjǸǹȵɳṄṅṆṇṈṉṊṋOoÒòÓóÔôÕõÖöØøŌÅÅŽÅÅőƟƠơǑǒǪǫǬǭǾǿȌÈÈŽÈȪȫȬȭȮȯȰȱṌá¹á¹Žá¹á¹á¹‘ṒṓỌá»á»Žá»á»á»‘ỒồỔổỖỗỘộỚớỜá»á»žá»Ÿá» á»¡á»¢á»£PpƤƥṔṕṖṗQqÊ RrŔŕŖŗŘřÈȑȒȓɼɽɾṘṙṚṛṜá¹á¹žá¹ŸSsŚśŜÅŞşŠšȘșʂṠṡṢṣṤṥṦṧṨṩTtŢţŤťŦŧƫƬƭƮʈȚțȶṪṫṬṭṮṯṰṱẗUuÙùÚúÛûÜüŨũŪūŬŭŮůŰűŲųƯưǓǔǕǖǗǘǙǚǛǜȔȕȖȗṲṳṴṵṶṷṸṹṺṻỤụỦủỨứỪừỬửỮữỰựVvƲʋṼṽṾṿWwŴŵẀáºáº‚ẃẄẅẆẇẈẉẘXxẊẋẌáºYyÃýÿŸŶŷƳƴȲȳẎáºáº™á»²á»³á»´á»µá»¶á»·á»¸á»¹ZzŹźŻżŽžƵƶȤȥÊÊ‘áºáº‘ẒẓẔẕẕ" lang="en"/>
+<l:gentext key="normalize.sort.output" text="AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBCCCCCCCCCCCCCCCCCDDDDDDDDDDDDDDDDDDDDDDDDEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEFFFFFFGGGGGGGGGGGGGGGGGGGGHHHHHHHHHHHHHHHHHHHHIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIJJJJJJKKKKKKKKKKKKKKLLLLLLLLLLLLLLLLLLLLLLLLLLMMMMMMMMMNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOPPPPPPPPQQQRRRRRRRRRRRRRRRRRRRRRRRSSSSSSSSSSSSSSSSSSSSSSSTTTTTTTTTTTTTTTTTTTTTTTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUVVVVVVVVWWWWWWWWWWWWWWWXXXXXXYYYYYYYYYYYYYYYYYYYYYYYZZZZZZZZZZZZZZZZZZZZZ" lang="en"/>
+<l:dingbat key="startquote" text="Ë¢"/>
+<l:dingbat key="endquote" text="Û¢"/>
+<l:dingbat key="nestedstartquote" text="‹"/>
+<l:dingbat key="nestedendquote" text="›"/>
+<l:dingbat key="singlestartquote" text="‘" lang="en"/>
+<l:dingbat key="singleendquote" text="’" lang="en"/>
+<l:dingbat key="bullet" text="•"/>
+<l:gentext key="hyphenation-character" text="â€"/>
+<l:gentext key="hyphenation-push-character-count" text="2"/>
+<l:gentext key="hyphenation-remain-character-count" text="2"/>
+<l:context name="styles"><l:template name="person-name" text="first-last"/>
+</l:context>
+<l:context name="title"><l:template name="abstract" text="%t"/>
+<l:template name="acknowledgements" text="%t" lang="en"/>
+<l:template name="answer" text="%t"/>
+<l:template name="appendix" text="Additamentum%n.%t"/>
+<l:template name="article" text="%t"/>
+<l:template name="authorblurb" text="%t"/>
+<l:template name="bibliodiv" text="%t"/>
+<l:template name="biblioentry" text="%t"/>
+<l:template name="bibliography" text="%t"/>
+<l:template name="bibliolist" text="%t" lang="en"/>
+<l:template name="bibliomixed" text="%t"/>
+<l:template name="bibliomset" text="%t"/>
+<l:template name="biblioset" text="%t"/>
+<l:template name="blockquote" text="%t"/>
+<l:template name="book" text="%t"/>
+<l:template name="calloutlist" text="%t"/>
+<l:template name="caution" text="%t"/>
+<l:template name="chapter" text="Capitulum%n.%t"/>
+<l:template name="colophon" text="%t"/>
+<l:template name="dedication" text="%t"/>
+<l:template name="equation" text="Equatio%n.%t"/>
+<l:template name="example" text="Exemplum%n.%t"/>
+<l:template name="figure" text="Descriptio%n.%t"/>
+<l:template name="foil" text="%t" lang="en"/>
+<l:template name="foilgroup" text="%t" lang="en"/>
+<l:template name="formalpara" text="%t"/>
+<l:template name="glossary" text="%t"/>
+<l:template name="glossdiv" text="%t"/>
+<l:template name="glosslist" text="%t" lang="en"/>
+<l:template name="glossentry" text="%t"/>
+<l:template name="important" text="%t"/>
+<l:template name="index" text="%t"/>
+<l:template name="indexdiv" text="%t"/>
+<l:template name="itemizedlist" text="%t"/>
+<l:template name="legalnotice" text="%t"/>
+<l:template name="listitem" text=""/>
+<l:template name="lot" text="%t"/>
+<l:template name="msg" text="%t"/>
+<l:template name="msgexplan" text="%t"/>
+<l:template name="msgmain" text="%t"/>
+<l:template name="msgrel" text="%t"/>
+<l:template name="msgset" text="%t"/>
+<l:template name="msgsub" text="%t"/>
+<l:template name="note" text="%t"/>
+<l:template name="orderedlist" text="%t"/>
+<l:template name="part" text="Pars%n.%t"/>
+<l:template name="partintro" text="%t"/>
+<l:template name="preface" text="%t"/>
+<l:template name="procedure" text="%t"/>
+<l:template name="procedure.formal" text="Progressio%n.%t"/>
+<l:template name="productionset" text="%t"/>
+<l:template name="productionset.formal" text="Compositio%n"/>
+<l:template name="qandadiv" text="%t"/>
+<l:template name="qandaentry" text="%t"/>
+<l:template name="qandaset" text="%t"/>
+<l:template name="question" text="%t"/>
+<l:template name="refentry" text="%t"/>
+<l:template name="reference" text="%t"/>
+<l:template name="refsection" text="%t"/>
+<l:template name="refsect1" text="%t"/>
+<l:template name="refsect2" text="%t"/>
+<l:template name="refsect3" text="%t"/>
+<l:template name="refsynopsisdiv" text="%t"/>
+<l:template name="refsynopsisdivinfo" text="%t"/>
+<l:template name="segmentedlist" text="%t"/>
+<l:template name="set" text="%t"/>
+<l:template name="setindex" text="%t"/>
+<l:template name="sidebar" text="%t"/>
+<l:template name="step" text="%t"/>
+<l:template name="table" text="Tabula%n.%t"/>
+<l:template name="task" text="%t" lang="en"/>
+<l:template name="tasksummary" text="%t" lang="en"/>
+<l:template name="taskprerequisites" text="%t" lang="en"/>
+<l:template name="taskrelated" text="%t" lang="en"/>
+<l:template name="tip" text="%t"/>
+<l:template name="toc" text="%t"/>
+<l:template name="variablelist" text="%t"/>
+<l:template name="varlistentry" text=""/>
+<l:template name="warning" text="%t"/>
+</l:context>
+<l:context name="title-unnumbered"><l:template name="appendix" text="%t"/>
+<l:template name="article/appendix" text="%t"/>
+<l:template name="bridgehead" text="%t"/>
+<l:template name="chapter" text="%t"/>
+<l:template name="sect1" text="%t"/>
+<l:template name="sect2" text="%t"/>
+<l:template name="sect3" text="%t"/>
+<l:template name="sect4" text="%t"/>
+<l:template name="sect5" text="%t"/>
+<l:template name="section" text="%t"/>
+<l:template name="simplesect" text="%t"/>
+<l:template name="part" text="%t" lang="en"/>
+</l:context>
+<l:context name="title-numbered"><l:template name="appendix" text="Additamentum%n.%t"/>
+<l:template name="article/appendix" text="%n.%t"/>
+<l:template name="bridgehead" text="%n.%t"/>
+<l:template name="chapter" text="Capitulum%n.%t"/>
+<l:template name="part" text="Pars%n.%t"/>
+<l:template name="sect1" text="%n.%t"/>
+<l:template name="sect2" text="%n.%t"/>
+<l:template name="sect3" text="%n.%t"/>
+<l:template name="sect4" text="%n.%t"/>
+<l:template name="sect5" text="%n.%t"/>
+<l:template name="section" text="%n.%t"/>
+<l:template name="simplesect" text="%t"/>
+</l:context>
+<l:context name="subtitle"><l:template name="appendix" text="%s"/>
+<l:template name="acknowledgements" text="%s" lang="en"/>
+<l:template name="article" text="%s"/>
+<l:template name="bibliodiv" text="%s"/>
+<l:template name="biblioentry" text="%s"/>
+<l:template name="bibliography" text="%s"/>
+<l:template name="bibliomixed" text="%s"/>
+<l:template name="bibliomset" text="%s"/>
+<l:template name="biblioset" text="%s"/>
+<l:template name="book" text="%s"/>
+<l:template name="chapter" text="%s"/>
+<l:template name="colophon" text="%s"/>
+<l:template name="dedication" text="%s"/>
+<l:template name="glossary" text="%s"/>
+<l:template name="glossdiv" text="%s"/>
+<l:template name="index" text="%s"/>
+<l:template name="indexdiv" text="%s"/>
+<l:template name="lot" text="%s"/>
+<l:template name="part" text="%s"/>
+<l:template name="partintro" text="%s"/>
+<l:template name="preface" text="%s"/>
+<l:template name="refentry" text="%s"/>
+<l:template name="reference" text="%s"/>
+<l:template name="refsection" text="%s"/>
+<l:template name="refsect1" text="%s"/>
+<l:template name="refsect2" text="%s"/>
+<l:template name="refsect3" text="%s"/>
+<l:template name="refsynopsisdiv" text="%s"/>
+<l:template name="sect1" text="%s"/>
+<l:template name="sect2" text="%s"/>
+<l:template name="sect3" text="%s"/>
+<l:template name="sect4" text="%s"/>
+<l:template name="sect5" text="%s"/>
+<l:template name="section" text="%s"/>
+<l:template name="set" text="%s"/>
+<l:template name="setindex" text="%s"/>
+<l:template name="sidebar" text="%s"/>
+<l:template name="simplesect" text="%s"/>
+<l:template name="toc" text="%s"/>
+</l:context>
+<l:context name="xref"><l:template name="abstract" text="%t"/>
+<l:template name="acknowledgements" text="%t" lang="en"/>
+<l:template name="answer" text="R:%n"/>
+<l:template name="appendix" text="%t"/>
+<l:template name="article" text="%t"/>
+<l:template name="authorblurb" text="%t"/>
+<l:template name="bibliodiv" text="%t"/>
+<l:template name="bibliography" text="%t"/>
+<l:template name="bibliomset" text="%t"/>
+<l:template name="biblioset" text="%t"/>
+<l:template name="blockquote" text="%t"/>
+<l:template name="book" text="%t"/>
+<l:template name="calloutlist" text="%t"/>
+<l:template name="caution" text="%t"/>
+<l:template name="chapter" text="%t"/>
+<l:template name="colophon" text="%t"/>
+<l:template name="constraintdef" text="%t"/>
+<l:template name="dedication" text="%t"/>
+<l:template name="equation" text="%t"/>
+<l:template name="example" text="%t"/>
+<l:template name="figure" text="%t"/>
+<l:template name="foil" text="%t" lang="en"/>
+<l:template name="foilgroup" text="%t" lang="en"/>
+<l:template name="formalpara" text="%t"/>
+<l:template name="glossary" text="%t"/>
+<l:template name="glossdiv" text="%t"/>
+<l:template name="important" text="%t"/>
+<l:template name="index" text="%t"/>
+<l:template name="indexdiv" text="%t"/>
+<l:template name="itemizedlist" text="%t"/>
+<l:template name="legalnotice" text="%t"/>
+<l:template name="listitem" text="%n"/>
+<l:template name="lot" text="%t"/>
+<l:template name="msg" text="%t"/>
+<l:template name="msgexplan" text="%t"/>
+<l:template name="msgmain" text="%t"/>
+<l:template name="msgrel" text="%t"/>
+<l:template name="msgset" text="%t"/>
+<l:template name="msgsub" text="%t"/>
+<l:template name="note" text="%t"/>
+<l:template name="orderedlist" text="%t"/>
+<l:template name="part" text="%t"/>
+<l:template name="partintro" text="%t"/>
+<l:template name="preface" text="%t"/>
+<l:template name="procedure" text="%t"/>
+<l:template name="productionset" text="%t"/>
+<l:template name="qandadiv" text="%t"/>
+<l:template name="qandaentry" text="Q:%n"/>
+<l:template name="qandaset" text="%t"/>
+<l:template name="question" text="Q:%n"/>
+<l:template name="reference" text="%t"/>
+<l:template name="refsynopsisdiv" text="%t"/>
+<l:template name="segmentedlist" text="%t"/>
+<l:template name="set" text="%t"/>
+<l:template name="setindex" text="%t"/>
+<l:template name="sidebar" text="%t"/>
+<l:template name="table" text="%t"/>
+<l:template name="task" text="%t" lang="en"/>
+<l:template name="tip" text="%t"/>
+<l:template name="toc" text="%t"/>
+<l:template name="variablelist" text="%t"/>
+<l:template name="varlistentry" text="%n"/>
+<l:template name="warning" text="%t"/>
+<l:template name="olink.document.citation" text=" in %o" lang="en"/>
+<l:template name="olink.page.citation" text=" (page %p)" lang="en"/>
+<l:template name="page.citation" text=" [%p]"/>
+<l:template name="page" text="(page %p)" lang="en"/>
+<l:template name="docname" text=" in %o" lang="en"/>
+<l:template name="docnamelong" text=" in the document titled %o" lang="en"/>
+<l:template name="pageabbrev" text="(p. %p)" lang="en"/>
+<l:template name="Page" text="Page %p" lang="en"/>
+<l:template name="bridgehead" text="sectio vocata ˢ%tۢ"/>
+<l:template name="refsection" text="sectio vocata ˢ%tۢ"/>
+<l:template name="refsect1" text="sectio vocata ˢ%tۢ"/>
+<l:template name="refsect2" text="sectio vocata ˢ%tۢ"/>
+<l:template name="refsect3" text="sectio vocata ˢ%tۢ"/>
+<l:template name="sect1" text="sectio vocata ˢ%tۢ"/>
+<l:template name="sect2" text="sectio vocata ˢ%tۢ"/>
+<l:template name="sect3" text="sectio vocata ˢ%tۢ"/>
+<l:template name="sect4" text="sectio vocata ˢ%tۢ"/>
+<l:template name="sect5" text="sectio vocata ˢ%tۢ"/>
+<l:template name="section" text="sectio vocata ˢ%tۢ"/>
+<l:template name="simplesect" text="sectio vocata ˢ%tۢ"/>
+</l:context>
+<l:context name="xref-number"><l:template name="answer" text="R:%n"/>
+<l:template name="appendix" text="Additamentum%n"/>
+<l:template name="bridgehead" text="Sectio%n"/>
+<l:template name="chapter" text="Capitulum%n"/>
+<l:template name="equation" text="Equatio%n"/>
+<l:template name="example" text="Exemplum%n"/>
+<l:template name="figure" text="Descriptio%n"/>
+<l:template name="part" text="Pars%n"/>
+<l:template name="procedure" text="Progressio%n"/>
+<l:template name="productionset" text="Compositio%n"/>
+<l:template name="qandadiv" text="Q &amp; R%n"/>
+<l:template name="qandaentry" text="Q:%n"/>
+<l:template name="question" text="Q:%n"/>
+<l:template name="sect1" text="Sectio%n"/>
+<l:template name="sect2" text="Sectio%n"/>
+<l:template name="sect3" text="Sectio%n"/>
+<l:template name="sect4" text="Sectio%n"/>
+<l:template name="sect5" text="Sectio%n"/>
+<l:template name="section" text="Sectio%n"/>
+<l:template name="table" text="Tabula%n"/>
+</l:context>
+<l:context name="xref-number-and-title"><l:template name="appendix" text="Additamentum%n, %t"/>
+<l:template name="bridgehead" text="Sectio%n, ˢ%tۢ"/>
+<l:template name="chapter" text="Capitulum%n, %t"/>
+<l:template name="equation" text="Equatio%n, ˢ%tۢ"/>
+<l:template name="example" text="Exemplum%n, ˢ%tۢ"/>
+<l:template name="figure" text="Descriptio%n, ˢ%tۢ"/>
+<l:template name="part" text="Pars%n, ˢ%tۢ"/>
+<l:template name="procedure" text="Progressio%n, ˢ%tۢ"/>
+<l:template name="productionset" text="Compositio%n, ˢ%tۢ"/>
+<l:template name="qandadiv" text="Q &amp; R%n, ˢ%tۢ"/>
+<l:template name="refsect1" text="sectio vocata ˢ%tۢ"/>
+<l:template name="refsect2" text="sectio vocata ˢ%tۢ"/>
+<l:template name="refsect3" text="sectio vocata ˢ%tۢ"/>
+<l:template name="refsection" text="sectio vocata ˢ%tۢ"/>
+<l:template name="sect1" text="Sectio%n, ˢ%tۢ"/>
+<l:template name="sect2" text="Sectio%n, ˢ%tۢ"/>
+<l:template name="sect3" text="Sectio%n, ˢ%tۢ"/>
+<l:template name="sect4" text="Sectio%n, ˢ%tۢ"/>
+<l:template name="sect5" text="Sectio%n, ˢ%tۢ"/>
+<l:template name="section" text="Sectio%n, ˢ%tۢ"/>
+<l:template name="simplesect" text="sectio vocata ˢ%tۢ"/>
+<l:template name="table" text="Tabula%n, ˢ%tۢ"/>
+</l:context>
+<l:context name="authorgroup"><l:template name="sep" text=", "/>
+<l:template name="sep2" text=" et "/>
+<l:template name="seplast" text=", et "/>
+</l:context>
+<l:context name="glossary"><l:template name="see" text="Cfr. %t."/>
+<l:template name="seealso" text="Cfr. autem %t."/>
+<l:template name="seealso-separator" text=", "/>
+</l:context>
+<l:context name="msgset"><l:template name="MsgAud" text="Legentes: "/>
+<l:template name="MsgLevel" text="Libra: "/>
+<l:template name="MsgOrig" text="Fons: "/>
+</l:context>
+<l:context name="datetime"><l:template name="format" text="d/m/Y"/>
+</l:context>
+<l:context name="termdef"><l:template name="prefix" text="[Definition: " lang="en"/>
+<l:template name="suffix" text="]" lang="en"/>
+</l:context>
+<l:context name="datetime-full"><l:template name="January" text="Ianuarii"/>
+<l:template name="February" text="Februarii"/>
+<l:template name="March" text="Martii"/>
+<l:template name="April" text="Aprilis"/>
+<l:template name="May" text="Maii"/>
+<l:template name="June" text="Iunii"/>
+<l:template name="July" text="Iulii"/>
+<l:template name="August" text="Augusti"/>
+<l:template name="September" text="Septembris"/>
+<l:template name="October" text="Octobris"/>
+<l:template name="November" text="Novembris"/>
+<l:template name="December" text="Decembris"/>
+<l:template name="Monday" text="Lunae"/>
+<l:template name="Tuesday" text="Martis"/>
+<l:template name="Wednesday" text="Mercurii"/>
+<l:template name="Thursday" text="Iovis"/>
+<l:template name="Friday" text="Veneris"/>
+<l:template name="Saturday" text="Sabathi"/>
+<l:template name="Sunday" text="Dominica"/>
+</l:context>
+<l:context name="datetime-abbrev"><l:template name="Jan" text="Ian"/>
+<l:template name="Feb" text="Feb"/>
+<l:template name="Mar" text="Mar"/>
+<l:template name="Apr" text="Apr"/>
+<l:template name="May" text="Mai"/>
+<l:template name="Jun" text="Iun"/>
+<l:template name="Jul" text="Iul"/>
+<l:template name="Aug" text="Aug"/>
+<l:template name="Sep" text="Sep"/>
+<l:template name="Oct" text="Oct"/>
+<l:template name="Nov" text="Nov"/>
+<l:template name="Dec" text="Dec"/>
+<l:template name="Mon" text="Lun"/>
+<l:template name="Tue" text="Mar"/>
+<l:template name="Wed" text="Mer"/>
+<l:template name="Thu" text="Iov"/>
+<l:template name="Fri" text="Ven"/>
+<l:template name="Sat" text="Sab"/>
+<l:template name="Sun" text="Dom"/>
+</l:context>
+<l:context name="htmlhelp"><l:template name="langcode" text="0x0409 English (UNITED STATES)" lang="en"/>
+</l:context>
+<l:context name="index"><l:template name="term-separator" text=", " lang="en"/>
+<l:template name="number-separator" text=", " lang="en"/>
+<l:template name="range-separator" text="-" lang="en"/>
+</l:context>
+<l:context name="iso690"><l:template name="lastfirst.sep" text=", " lang="en"/>
+<l:template name="alt.person.two.sep" text=" – " lang="en"/>
+<l:template name="alt.person.last.sep" text=" – " lang="en"/>
+<l:template name="alt.person.more.sep" text=" – " lang="en"/>
+<l:template name="primary.editor" text=" (ed.)" lang="en"/>
+<l:template name="primary.many" text=", et al." lang="en"/>
+<l:template name="primary.sep" text=". " lang="en"/>
+<l:template name="submaintitle.sep" text=": " lang="en"/>
+<l:template name="title.sep" text=". " lang="en"/>
+<l:template name="othertitle.sep" text=", " lang="en"/>
+<l:template name="medium1" text=" [" lang="en"/>
+<l:template name="medium2" text="]" lang="en"/>
+<l:template name="secondary.person.sep" text="; " lang="en"/>
+<l:template name="secondary.sep" text=". " lang="en"/>
+<l:template name="respons.sep" text=". " lang="en"/>
+<l:template name="edition.sep" text=". " lang="en"/>
+<l:template name="edition.serial.sep" text=", " lang="en"/>
+<l:template name="issuing.range" text="-" lang="en"/>
+<l:template name="issuing.div" text=", " lang="en"/>
+<l:template name="issuing.sep" text=". " lang="en"/>
+<l:template name="partnr.sep" text=". " lang="en"/>
+<l:template name="placepubl.sep" text=": " lang="en"/>
+<l:template name="publyear.sep" text=", " lang="en"/>
+<l:template name="pubinfo.sep" text=". " lang="en"/>
+<l:template name="spec.pubinfo.sep" text=", " lang="en"/>
+<l:template name="upd.sep" text=", " lang="en"/>
+<l:template name="datecit1" text=" [cited " lang="en"/>
+<l:template name="datecit2" text="]" lang="en"/>
+<l:template name="extent.sep" text=". " lang="en"/>
+<l:template name="locs.sep" text=", " lang="en"/>
+<l:template name="location.sep" text=". " lang="en"/>
+<l:template name="serie.sep" text=". " lang="en"/>
+<l:template name="notice.sep" text=". " lang="en"/>
+<l:template name="access" text="Available " lang="en"/>
+<l:template name="acctoo" text="Also available " lang="en"/>
+<l:template name="onwww" text="from World Wide Web" lang="en"/>
+<l:template name="oninet" text="from Internet" lang="en"/>
+<l:template name="access.end" text=": " lang="en"/>
+<l:template name="link1" text="&lt;" lang="en"/>
+<l:template name="link2" text="&gt;" lang="en"/>
+<l:template name="access.sep" text=". " lang="en"/>
+<l:template name="isbn" text="ISBN " lang="en"/>
+<l:template name="issn" text="ISSN " lang="en"/>
+<l:template name="stdnum.sep" text=". " lang="en"/>
+<l:template name="patcountry.sep" text=". " lang="en"/>
+<l:template name="pattype.sep" text=", " lang="en"/>
+<l:template name="patnum.sep" text=". " lang="en"/>
+<l:template name="patdate.sep" text=". " lang="en"/>
+</l:context><l:letters lang="en"><l:l i="-1"/>
+<l:l i="0">Symbols</l:l>
+<l:l i="10">A</l:l>
+<l:l i="10">a</l:l>
+<l:l i="10">À</l:l>
+<l:l i="10">à</l:l>
+<l:l i="10">Ã</l:l>
+<l:l i="10">á</l:l>
+<l:l i="10">Â</l:l>
+<l:l i="10">â</l:l>
+<l:l i="10">Ã</l:l>
+<l:l i="10">ã</l:l>
+<l:l i="10">Ä</l:l>
+<l:l i="10">ä</l:l>
+<l:l i="10">Ã…</l:l>
+<l:l i="10">Ã¥</l:l>
+<l:l i="10">Ä€</l:l>
+<l:l i="10">Ä</l:l>
+<l:l i="10">Ä‚</l:l>
+<l:l i="10">ă</l:l>
+<l:l i="10">Ä„</l:l>
+<l:l i="10">Ä…</l:l>
+<l:l i="10">Ç</l:l>
+<l:l i="10">ÇŽ</l:l>
+<l:l i="10">Çž</l:l>
+<l:l i="10">ÇŸ</l:l>
+<l:l i="10">Ç </l:l>
+<l:l i="10">Ç¡</l:l>
+<l:l i="10">Ǻ</l:l>
+<l:l i="10">Ç»</l:l>
+<l:l i="10">È€</l:l>
+<l:l i="10">È</l:l>
+<l:l i="10">È‚</l:l>
+<l:l i="10">ȃ</l:l>
+<l:l i="10">Ȧ</l:l>
+<l:l i="10">ȧ</l:l>
+<l:l i="10">Ḁ</l:l>
+<l:l i="10">á¸</l:l>
+<l:l i="10">ẚ</l:l>
+<l:l i="10">Ạ</l:l>
+<l:l i="10">ạ</l:l>
+<l:l i="10">Ả</l:l>
+<l:l i="10">ả</l:l>
+<l:l i="10">Ấ</l:l>
+<l:l i="10">ấ</l:l>
+<l:l i="10">Ầ</l:l>
+<l:l i="10">ầ</l:l>
+<l:l i="10">Ẩ</l:l>
+<l:l i="10">ẩ</l:l>
+<l:l i="10">Ẫ</l:l>
+<l:l i="10">ẫ</l:l>
+<l:l i="10">Ậ</l:l>
+<l:l i="10">ậ</l:l>
+<l:l i="10">Ắ</l:l>
+<l:l i="10">ắ</l:l>
+<l:l i="10">Ằ</l:l>
+<l:l i="10">ằ</l:l>
+<l:l i="10">Ẳ</l:l>
+<l:l i="10">ẳ</l:l>
+<l:l i="10">Ẵ</l:l>
+<l:l i="10">ẵ</l:l>
+<l:l i="10">Ặ</l:l>
+<l:l i="10">ặ</l:l>
+<l:l i="20">B</l:l>
+<l:l i="20">b</l:l>
+<l:l i="20">Æ€</l:l>
+<l:l i="20">Æ</l:l>
+<l:l i="20">É“</l:l>
+<l:l i="20">Æ‚</l:l>
+<l:l i="20">ƃ</l:l>
+<l:l i="20">Ḃ</l:l>
+<l:l i="20">ḃ</l:l>
+<l:l i="20">Ḅ</l:l>
+<l:l i="20">ḅ</l:l>
+<l:l i="20">Ḇ</l:l>
+<l:l i="20">ḇ</l:l>
+<l:l i="30">C</l:l>
+<l:l i="30">c</l:l>
+<l:l i="30">Ç</l:l>
+<l:l i="30">ç</l:l>
+<l:l i="30">Ć</l:l>
+<l:l i="30">ć</l:l>
+<l:l i="30">Ĉ</l:l>
+<l:l i="30">ĉ</l:l>
+<l:l i="30">ÄŠ</l:l>
+<l:l i="30">Ä‹</l:l>
+<l:l i="30">Č</l:l>
+<l:l i="30">Ä</l:l>
+<l:l i="30">Ƈ</l:l>
+<l:l i="30">ƈ</l:l>
+<l:l i="30">É•</l:l>
+<l:l i="30">Ḉ</l:l>
+<l:l i="30">ḉ</l:l>
+<l:l i="40">D</l:l>
+<l:l i="40">d</l:l>
+<l:l i="40">ÄŽ</l:l>
+<l:l i="40">Ä</l:l>
+<l:l i="40">Ä</l:l>
+<l:l i="40">Ä‘</l:l>
+<l:l i="40">ÆŠ</l:l>
+<l:l i="40">É—</l:l>
+<l:l i="40">Æ‹</l:l>
+<l:l i="40">ƌ</l:l>
+<l:l i="40">Ç…</l:l>
+<l:l i="40">Dz</l:l>
+<l:l i="40">È¡</l:l>
+<l:l i="40">É–</l:l>
+<l:l i="40">Ḋ</l:l>
+<l:l i="40">ḋ</l:l>
+<l:l i="40">Ḍ</l:l>
+<l:l i="40">á¸</l:l>
+<l:l i="40">Ḏ</l:l>
+<l:l i="40">á¸</l:l>
+<l:l i="40">á¸</l:l>
+<l:l i="40">ḑ</l:l>
+<l:l i="40">Ḓ</l:l>
+<l:l i="40">ḓ</l:l>
+<l:l i="50">E</l:l>
+<l:l i="50">e</l:l>
+<l:l i="50">È</l:l>
+<l:l i="50">è</l:l>
+<l:l i="50">É</l:l>
+<l:l i="50">é</l:l>
+<l:l i="50">Ê</l:l>
+<l:l i="50">ê</l:l>
+<l:l i="50">Ë</l:l>
+<l:l i="50">ë</l:l>
+<l:l i="50">Ä’</l:l>
+<l:l i="50">Ä“</l:l>
+<l:l i="50">Ä”</l:l>
+<l:l i="50">Ä•</l:l>
+<l:l i="50">Ä–</l:l>
+<l:l i="50">Ä—</l:l>
+<l:l i="50">Ę</l:l>
+<l:l i="50">Ä™</l:l>
+<l:l i="50">Äš</l:l>
+<l:l i="50">Ä›</l:l>
+<l:l i="50">È„</l:l>
+<l:l i="50">È…</l:l>
+<l:l i="50">Ȇ</l:l>
+<l:l i="50">ȇ</l:l>
+<l:l i="50">Ȩ</l:l>
+<l:l i="50">È©</l:l>
+<l:l i="50">Ḕ</l:l>
+<l:l i="50">ḕ</l:l>
+<l:l i="50">Ḗ</l:l>
+<l:l i="50">ḗ</l:l>
+<l:l i="50">Ḙ</l:l>
+<l:l i="50">ḙ</l:l>
+<l:l i="50">Ḛ</l:l>
+<l:l i="50">ḛ</l:l>
+<l:l i="50">Ḝ</l:l>
+<l:l i="50">á¸</l:l>
+<l:l i="50">Ẹ</l:l>
+<l:l i="50">ẹ</l:l>
+<l:l i="50">Ẻ</l:l>
+<l:l i="50">ẻ</l:l>
+<l:l i="50">Ẽ</l:l>
+<l:l i="50">ẽ</l:l>
+<l:l i="50">Ế</l:l>
+<l:l i="50">ế</l:l>
+<l:l i="50">Ề</l:l>
+<l:l i="50">á»</l:l>
+<l:l i="50">Ể</l:l>
+<l:l i="50">ể</l:l>
+<l:l i="50">Ễ</l:l>
+<l:l i="50">á»…</l:l>
+<l:l i="50">Ệ</l:l>
+<l:l i="50">ệ</l:l>
+<l:l i="60">F</l:l>
+<l:l i="60">f</l:l>
+<l:l i="60">Æ‘</l:l>
+<l:l i="60">Æ’</l:l>
+<l:l i="60">Ḟ</l:l>
+<l:l i="60">ḟ</l:l>
+<l:l i="70">G</l:l>
+<l:l i="70">g</l:l>
+<l:l i="70">Ĝ</l:l>
+<l:l i="70">Ä</l:l>
+<l:l i="70">Äž</l:l>
+<l:l i="70">ÄŸ</l:l>
+<l:l i="70">Ä </l:l>
+<l:l i="70">Ä¡</l:l>
+<l:l i="70">Ä¢</l:l>
+<l:l i="70">Ä£</l:l>
+<l:l i="70">Æ“</l:l>
+<l:l i="70">É </l:l>
+<l:l i="70">Ǥ</l:l>
+<l:l i="70">Ç¥</l:l>
+<l:l i="70">Ǧ</l:l>
+<l:l i="70">ǧ</l:l>
+<l:l i="70">Ç´</l:l>
+<l:l i="70">ǵ</l:l>
+<l:l i="70">Ḡ</l:l>
+<l:l i="70">ḡ</l:l>
+<l:l i="80">H</l:l>
+<l:l i="80">h</l:l>
+<l:l i="80">Ĥ</l:l>
+<l:l i="80">Ä¥</l:l>
+<l:l i="80">Ħ</l:l>
+<l:l i="80">ħ</l:l>
+<l:l i="80">Èž</l:l>
+<l:l i="80">ÈŸ</l:l>
+<l:l i="80">ɦ</l:l>
+<l:l i="80">Ḣ</l:l>
+<l:l i="80">ḣ</l:l>
+<l:l i="80">Ḥ</l:l>
+<l:l i="80">ḥ</l:l>
+<l:l i="80">Ḧ</l:l>
+<l:l i="80">ḧ</l:l>
+<l:l i="80">Ḩ</l:l>
+<l:l i="80">ḩ</l:l>
+<l:l i="80">Ḫ</l:l>
+<l:l i="80">ḫ</l:l>
+<l:l i="80">ẖ</l:l>
+<l:l i="90">I</l:l>
+<l:l i="90">i</l:l>
+<l:l i="90">Ì</l:l>
+<l:l i="90">ì</l:l>
+<l:l i="90">Ã</l:l>
+<l:l i="90">í</l:l>
+<l:l i="90">ÃŽ</l:l>
+<l:l i="90">î</l:l>
+<l:l i="90">Ã</l:l>
+<l:l i="90">ï</l:l>
+<l:l i="90">Ĩ</l:l>
+<l:l i="90">Ä©</l:l>
+<l:l i="90">Ī</l:l>
+<l:l i="90">Ä«</l:l>
+<l:l i="90">Ĭ</l:l>
+<l:l i="90">Ä­</l:l>
+<l:l i="90">Ä®</l:l>
+<l:l i="90">į</l:l>
+<l:l i="90">Ä°</l:l>
+<l:l i="90">Æ—</l:l>
+<l:l i="90">ɨ</l:l>
+<l:l i="90">Ç</l:l>
+<l:l i="90">Ç</l:l>
+<l:l i="90">Ȉ</l:l>
+<l:l i="90">ȉ</l:l>
+<l:l i="90">ÈŠ</l:l>
+<l:l i="90">È‹</l:l>
+<l:l i="90">Ḭ</l:l>
+<l:l i="90">ḭ</l:l>
+<l:l i="90">Ḯ</l:l>
+<l:l i="90">ḯ</l:l>
+<l:l i="90">Ỉ</l:l>
+<l:l i="90">ỉ</l:l>
+<l:l i="90">Ị</l:l>
+<l:l i="90">ị</l:l>
+<l:l i="100">J</l:l>
+<l:l i="100">j</l:l>
+<l:l i="100">Ä´</l:l>
+<l:l i="100">ĵ</l:l>
+<l:l i="100">Ç°</l:l>
+<l:l i="100">Ê</l:l>
+<l:l i="110">K</l:l>
+<l:l i="110">k</l:l>
+<l:l i="110">Ķ</l:l>
+<l:l i="110">Ä·</l:l>
+<l:l i="110">Ƙ</l:l>
+<l:l i="110">Æ™</l:l>
+<l:l i="110">Ǩ</l:l>
+<l:l i="110">Ç©</l:l>
+<l:l i="110">Ḱ</l:l>
+<l:l i="110">ḱ</l:l>
+<l:l i="110">Ḳ</l:l>
+<l:l i="110">ḳ</l:l>
+<l:l i="110">Ḵ</l:l>
+<l:l i="110">ḵ</l:l>
+<l:l i="120">L</l:l>
+<l:l i="120">l</l:l>
+<l:l i="120">Ĺ</l:l>
+<l:l i="120">ĺ</l:l>
+<l:l i="120">Ä»</l:l>
+<l:l i="120">ļ</l:l>
+<l:l i="120">Ľ</l:l>
+<l:l i="120">ľ</l:l>
+<l:l i="120">Ä¿</l:l>
+<l:l i="120">Å€</l:l>
+<l:l i="120">Å</l:l>
+<l:l i="120">Å‚</l:l>
+<l:l i="120">Æš</l:l>
+<l:l i="120">Lj</l:l>
+<l:l i="120">È´</l:l>
+<l:l i="120">É«</l:l>
+<l:l i="120">ɬ</l:l>
+<l:l i="120">É­</l:l>
+<l:l i="120">Ḷ</l:l>
+<l:l i="120">ḷ</l:l>
+<l:l i="120">Ḹ</l:l>
+<l:l i="120">ḹ</l:l>
+<l:l i="120">Ḻ</l:l>
+<l:l i="120">ḻ</l:l>
+<l:l i="120">Ḽ</l:l>
+<l:l i="120">ḽ</l:l>
+<l:l i="130">M</l:l>
+<l:l i="130">m</l:l>
+<l:l i="130">ɱ</l:l>
+<l:l i="130">Ḿ</l:l>
+<l:l i="130">ḿ</l:l>
+<l:l i="130">á¹€</l:l>
+<l:l i="130">á¹</l:l>
+<l:l i="130">Ṃ</l:l>
+<l:l i="130">ṃ</l:l>
+<l:l i="140">N</l:l>
+<l:l i="140">n</l:l>
+<l:l i="140">Ñ</l:l>
+<l:l i="140">ñ</l:l>
+<l:l i="140">Ń</l:l>
+<l:l i="140">Å„</l:l>
+<l:l i="140">Å…</l:l>
+<l:l i="140">ņ</l:l>
+<l:l i="140">Ň</l:l>
+<l:l i="140">ň</l:l>
+<l:l i="140">Æ</l:l>
+<l:l i="140">ɲ</l:l>
+<l:l i="140">Æž</l:l>
+<l:l i="140">È </l:l>
+<l:l i="140">Ç‹</l:l>
+<l:l i="140">Ǹ</l:l>
+<l:l i="140">ǹ</l:l>
+<l:l i="140">ȵ</l:l>
+<l:l i="140">ɳ</l:l>
+<l:l i="140">Ṅ</l:l>
+<l:l i="140">á¹…</l:l>
+<l:l i="140">Ṇ</l:l>
+<l:l i="140">ṇ</l:l>
+<l:l i="140">Ṉ</l:l>
+<l:l i="140">ṉ</l:l>
+<l:l i="140">Ṋ</l:l>
+<l:l i="140">ṋ</l:l>
+<l:l i="150">O</l:l>
+<l:l i="150">o</l:l>
+<l:l i="150">Ã’</l:l>
+<l:l i="150">ò</l:l>
+<l:l i="150">Ó</l:l>
+<l:l i="150">ó</l:l>
+<l:l i="150">Ô</l:l>
+<l:l i="150">ô</l:l>
+<l:l i="150">Õ</l:l>
+<l:l i="150">õ</l:l>
+<l:l i="150">Ö</l:l>
+<l:l i="150">ö</l:l>
+<l:l i="150">Ø</l:l>
+<l:l i="150">ø</l:l>
+<l:l i="150">Ō</l:l>
+<l:l i="150">Å</l:l>
+<l:l i="150">ÅŽ</l:l>
+<l:l i="150">Å</l:l>
+<l:l i="150">Å</l:l>
+<l:l i="150">Å‘</l:l>
+<l:l i="150">ÆŸ</l:l>
+<l:l i="150">Æ </l:l>
+<l:l i="150">Æ¡</l:l>
+<l:l i="150">Ç‘</l:l>
+<l:l i="150">Ç’</l:l>
+<l:l i="150">Ǫ</l:l>
+<l:l i="150">Ç«</l:l>
+<l:l i="150">Ǭ</l:l>
+<l:l i="150">Ç­</l:l>
+<l:l i="150">Ǿ</l:l>
+<l:l i="150">Ç¿</l:l>
+<l:l i="150">Ȍ</l:l>
+<l:l i="150">È</l:l>
+<l:l i="150">ÈŽ</l:l>
+<l:l i="150">È</l:l>
+<l:l i="150">Ȫ</l:l>
+<l:l i="150">È«</l:l>
+<l:l i="150">Ȭ</l:l>
+<l:l i="150">È­</l:l>
+<l:l i="150">È®</l:l>
+<l:l i="150">ȯ</l:l>
+<l:l i="150">È°</l:l>
+<l:l i="150">ȱ</l:l>
+<l:l i="150">Ṍ</l:l>
+<l:l i="150">á¹</l:l>
+<l:l i="150">Ṏ</l:l>
+<l:l i="150">á¹</l:l>
+<l:l i="150">á¹</l:l>
+<l:l i="150">ṑ</l:l>
+<l:l i="150">á¹’</l:l>
+<l:l i="150">ṓ</l:l>
+<l:l i="150">Ọ</l:l>
+<l:l i="150">á»</l:l>
+<l:l i="150">Ỏ</l:l>
+<l:l i="150">á»</l:l>
+<l:l i="150">á»</l:l>
+<l:l i="150">ố</l:l>
+<l:l i="150">á»’</l:l>
+<l:l i="150">ồ</l:l>
+<l:l i="150">á»”</l:l>
+<l:l i="150">ổ</l:l>
+<l:l i="150">á»–</l:l>
+<l:l i="150">á»—</l:l>
+<l:l i="150">Ộ</l:l>
+<l:l i="150">á»™</l:l>
+<l:l i="150">Ớ</l:l>
+<l:l i="150">á»›</l:l>
+<l:l i="150">Ờ</l:l>
+<l:l i="150">á»</l:l>
+<l:l i="150">Ở</l:l>
+<l:l i="150">ở</l:l>
+<l:l i="150">á» </l:l>
+<l:l i="150">ỡ</l:l>
+<l:l i="150">Ợ</l:l>
+<l:l i="150">ợ</l:l>
+<l:l i="160">P</l:l>
+<l:l i="160">p</l:l>
+<l:l i="160">Ƥ</l:l>
+<l:l i="160">Æ¥</l:l>
+<l:l i="160">á¹”</l:l>
+<l:l i="160">ṕ</l:l>
+<l:l i="160">á¹–</l:l>
+<l:l i="160">á¹—</l:l>
+<l:l i="170">Q</l:l>
+<l:l i="170">q</l:l>
+<l:l i="170">Ê </l:l>
+<l:l i="180">R</l:l>
+<l:l i="180">r</l:l>
+<l:l i="180">Å”</l:l>
+<l:l i="180">Å•</l:l>
+<l:l i="180">Å–</l:l>
+<l:l i="180">Å—</l:l>
+<l:l i="180">Ř</l:l>
+<l:l i="180">Å™</l:l>
+<l:l i="180">È</l:l>
+<l:l i="180">È‘</l:l>
+<l:l i="180">È’</l:l>
+<l:l i="180">È“</l:l>
+<l:l i="180">ɼ</l:l>
+<l:l i="180">ɽ</l:l>
+<l:l i="180">ɾ</l:l>
+<l:l i="180">Ṙ</l:l>
+<l:l i="180">á¹™</l:l>
+<l:l i="180">Ṛ</l:l>
+<l:l i="180">á¹›</l:l>
+<l:l i="180">Ṝ</l:l>
+<l:l i="180">á¹</l:l>
+<l:l i="180">Ṟ</l:l>
+<l:l i="180">ṟ</l:l>
+<l:l i="190">S</l:l>
+<l:l i="190">s</l:l>
+<l:l i="190">Åš</l:l>
+<l:l i="190">Å›</l:l>
+<l:l i="190">Ŝ</l:l>
+<l:l i="190">Å</l:l>
+<l:l i="190">Åž</l:l>
+<l:l i="190">ÅŸ</l:l>
+<l:l i="190">Å </l:l>
+<l:l i="190">Å¡</l:l>
+<l:l i="190">Ș</l:l>
+<l:l i="190">È™</l:l>
+<l:l i="190">Ê‚</l:l>
+<l:l i="190">á¹ </l:l>
+<l:l i="190">ṡ</l:l>
+<l:l i="190">á¹¢</l:l>
+<l:l i="190">á¹£</l:l>
+<l:l i="190">Ṥ</l:l>
+<l:l i="190">á¹¥</l:l>
+<l:l i="190">Ṧ</l:l>
+<l:l i="190">ṧ</l:l>
+<l:l i="190">Ṩ</l:l>
+<l:l i="190">ṩ</l:l>
+<l:l i="200">T</l:l>
+<l:l i="200">t</l:l>
+<l:l i="200">Å¢</l:l>
+<l:l i="200">Å£</l:l>
+<l:l i="200">Ť</l:l>
+<l:l i="200">Å¥</l:l>
+<l:l i="200">Ŧ</l:l>
+<l:l i="200">ŧ</l:l>
+<l:l i="200">Æ«</l:l>
+<l:l i="200">Ƭ</l:l>
+<l:l i="200">Æ­</l:l>
+<l:l i="200">Æ®</l:l>
+<l:l i="200">ʈ</l:l>
+<l:l i="200">Èš</l:l>
+<l:l i="200">È›</l:l>
+<l:l i="200">ȶ</l:l>
+<l:l i="200">Ṫ</l:l>
+<l:l i="200">ṫ</l:l>
+<l:l i="200">Ṭ</l:l>
+<l:l i="200">á¹­</l:l>
+<l:l i="200">á¹®</l:l>
+<l:l i="200">ṯ</l:l>
+<l:l i="200">á¹°</l:l>
+<l:l i="200">á¹±</l:l>
+<l:l i="200">ẗ</l:l>
+<l:l i="210">U</l:l>
+<l:l i="210">u</l:l>
+<l:l i="210">Ù</l:l>
+<l:l i="210">ù</l:l>
+<l:l i="210">Ú</l:l>
+<l:l i="210">ú</l:l>
+<l:l i="210">Û</l:l>
+<l:l i="210">û</l:l>
+<l:l i="210">Ü</l:l>
+<l:l i="210">ü</l:l>
+<l:l i="210">Ũ</l:l>
+<l:l i="210">Å©</l:l>
+<l:l i="210">Ū</l:l>
+<l:l i="210">Å«</l:l>
+<l:l i="210">Ŭ</l:l>
+<l:l i="210">Å­</l:l>
+<l:l i="210">Å®</l:l>
+<l:l i="210">ů</l:l>
+<l:l i="210">Å°</l:l>
+<l:l i="210">ű</l:l>
+<l:l i="210">Ų</l:l>
+<l:l i="210">ų</l:l>
+<l:l i="210">Ư</l:l>
+<l:l i="210">Æ°</l:l>
+<l:l i="210">Ç“</l:l>
+<l:l i="210">Ç”</l:l>
+<l:l i="210">Ç•</l:l>
+<l:l i="210">Ç–</l:l>
+<l:l i="210">Ç—</l:l>
+<l:l i="210">ǘ</l:l>
+<l:l i="210">Ç™</l:l>
+<l:l i="210">Çš</l:l>
+<l:l i="210">Ç›</l:l>
+<l:l i="210">ǜ</l:l>
+<l:l i="210">È”</l:l>
+<l:l i="210">È•</l:l>
+<l:l i="210">È–</l:l>
+<l:l i="210">È—</l:l>
+<l:l i="210">á¹²</l:l>
+<l:l i="210">á¹³</l:l>
+<l:l i="210">á¹´</l:l>
+<l:l i="210">á¹µ</l:l>
+<l:l i="210">Ṷ</l:l>
+<l:l i="210">á¹·</l:l>
+<l:l i="210">Ṹ</l:l>
+<l:l i="210">á¹¹</l:l>
+<l:l i="210">Ṻ</l:l>
+<l:l i="210">á¹»</l:l>
+<l:l i="210">Ụ</l:l>
+<l:l i="210">ụ</l:l>
+<l:l i="210">Ủ</l:l>
+<l:l i="210">ủ</l:l>
+<l:l i="210">Ứ</l:l>
+<l:l i="210">ứ</l:l>
+<l:l i="210">Ừ</l:l>
+<l:l i="210">ừ</l:l>
+<l:l i="210">Ử</l:l>
+<l:l i="210">á»­</l:l>
+<l:l i="210">á»®</l:l>
+<l:l i="210">ữ</l:l>
+<l:l i="210">á»°</l:l>
+<l:l i="210">á»±</l:l>
+<l:l i="220">V</l:l>
+<l:l i="220">v</l:l>
+<l:l i="220">Ʋ</l:l>
+<l:l i="220">Ê‹</l:l>
+<l:l i="220">á¹¼</l:l>
+<l:l i="220">á¹½</l:l>
+<l:l i="220">á¹¾</l:l>
+<l:l i="220">ṿ</l:l>
+<l:l i="230">W</l:l>
+<l:l i="230">w</l:l>
+<l:l i="230">Å´</l:l>
+<l:l i="230">ŵ</l:l>
+<l:l i="230">Ẁ</l:l>
+<l:l i="230">áº</l:l>
+<l:l i="230">Ẃ</l:l>
+<l:l i="230">ẃ</l:l>
+<l:l i="230">Ẅ</l:l>
+<l:l i="230">ẅ</l:l>
+<l:l i="230">Ẇ</l:l>
+<l:l i="230">ẇ</l:l>
+<l:l i="230">Ẉ</l:l>
+<l:l i="230">ẉ</l:l>
+<l:l i="230">ẘ</l:l>
+<l:l i="240">X</l:l>
+<l:l i="240">x</l:l>
+<l:l i="240">Ẋ</l:l>
+<l:l i="240">ẋ</l:l>
+<l:l i="240">Ẍ</l:l>
+<l:l i="240">áº</l:l>
+<l:l i="250">Y</l:l>
+<l:l i="250">y</l:l>
+<l:l i="250">Ã</l:l>
+<l:l i="250">ý</l:l>
+<l:l i="250">ÿ</l:l>
+<l:l i="250">Ÿ</l:l>
+<l:l i="250">Ŷ</l:l>
+<l:l i="250">Å·</l:l>
+<l:l i="250">Ƴ</l:l>
+<l:l i="250">Æ´</l:l>
+<l:l i="250">Ȳ</l:l>
+<l:l i="250">ȳ</l:l>
+<l:l i="250">Ẏ</l:l>
+<l:l i="250">áº</l:l>
+<l:l i="250">ẙ</l:l>
+<l:l i="250">Ỳ</l:l>
+<l:l i="250">ỳ</l:l>
+<l:l i="250">á»´</l:l>
+<l:l i="250">ỵ</l:l>
+<l:l i="250">Ỷ</l:l>
+<l:l i="250">á»·</l:l>
+<l:l i="250">Ỹ</l:l>
+<l:l i="250">ỹ</l:l>
+<l:l i="260">Z</l:l>
+<l:l i="260">z</l:l>
+<l:l i="260">Ź</l:l>
+<l:l i="260">ź</l:l>
+<l:l i="260">Å»</l:l>
+<l:l i="260">ż</l:l>
+<l:l i="260">Ž</l:l>
+<l:l i="260">ž</l:l>
+<l:l i="260">Ƶ</l:l>
+<l:l i="260">ƶ</l:l>
+<l:l i="260">Ȥ</l:l>
+<l:l i="260">È¥</l:l>
+<l:l i="260">Ê</l:l>
+<l:l i="260">Ê‘</l:l>
+<l:l i="260">áº</l:l>
+<l:l i="260">ẑ</l:l>
+<l:l i="260">Ẓ</l:l>
+<l:l i="260">ẓ</l:l>
+<l:l i="260">Ẕ</l:l>
+<l:l i="260">ẕ</l:l>
+</l:letters>
+</l:l10n>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/labels.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/labels.xsl
new file mode 100644
index 0000000..c5f74f3
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/labels.xsl
@@ -0,0 +1,890 @@
+<?xml version='1.0'?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:doc="http://nwalsh.com/xsl/documentation/1.0"
+ exclude-result-prefixes="doc"
+ version='1.0'>
+
+<!-- ********************************************************************
+ $Id: labels.xsl 8540 2009-12-02 05:28:09Z bobstayton $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<!-- ==================================================================== -->
+
+<!-- label markup -->
+
+<doc:mode mode="label.markup" xmlns="">
+<refpurpose>Provides access to element labels</refpurpose>
+<refdescription id="label.markup-desc">
+<para>Processing an element in the
+<literal role="mode">label.markup</literal> mode produces the
+element label.</para>
+<para>Trailing punctuation is not added to the label.
+</para>
+</refdescription>
+</doc:mode>
+
+<xsl:template match="*" mode="intralabel.punctuation">
+ <xsl:text>.</xsl:text>
+</xsl:template>
+
+<xsl:template match="*" mode="label.markup">
+ <xsl:param name="verbose" select="1"/>
+ <xsl:if test="$verbose">
+ <xsl:message>
+ <xsl:text>Request for label of unexpected element: </xsl:text>
+ <xsl:value-of select="local-name(.)"/>
+ </xsl:message>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="set|book" mode="label.markup">
+ <xsl:if test="@label">
+ <xsl:value-of select="@label"/>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="part" mode="label.markup">
+ <xsl:choose>
+ <xsl:when test="@label">
+ <xsl:value-of select="@label"/>
+ </xsl:when>
+ <xsl:when test="string($part.autolabel) != 0">
+ <xsl:variable name="format">
+ <xsl:call-template name="autolabel.format">
+ <xsl:with-param name="format" select="$part.autolabel"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:number from="book" count="part" format="{$format}"/>
+ </xsl:when>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="partintro" mode="label.markup">
+ <!-- no label -->
+</xsl:template>
+
+<xsl:template match="preface" mode="label.markup">
+ <xsl:choose>
+ <xsl:when test="@label">
+ <xsl:value-of select="@label"/>
+ </xsl:when>
+ <xsl:when test="string($preface.autolabel) != 0">
+ <xsl:if test="$component.label.includes.part.label != 0 and
+ ancestor::part">
+ <xsl:variable name="part.label">
+ <xsl:apply-templates select="ancestor::part"
+ mode="label.markup"/>
+ </xsl:variable>
+ <xsl:if test="$part.label != ''">
+ <xsl:value-of select="$part.label"/>
+ <xsl:apply-templates select="ancestor::part"
+ mode="intralabel.punctuation"/>
+ </xsl:if>
+ </xsl:if>
+ <xsl:variable name="format">
+ <xsl:call-template name="autolabel.format">
+ <xsl:with-param name="format" select="$preface.autolabel"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:choose>
+ <xsl:when test="$label.from.part != 0 and ancestor::part">
+ <xsl:number from="part" count="preface" format="{$format}" level="any"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:number from="book" count="preface" format="{$format}" level="any"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="chapter" mode="label.markup">
+ <xsl:choose>
+ <xsl:when test="@label">
+ <xsl:value-of select="@label"/>
+ </xsl:when>
+ <xsl:when test="string($chapter.autolabel) != 0">
+ <xsl:if test="$component.label.includes.part.label != 0 and
+ ancestor::part">
+ <xsl:variable name="part.label">
+ <xsl:apply-templates select="ancestor::part"
+ mode="label.markup"/>
+ </xsl:variable>
+ <xsl:if test="$part.label != ''">
+ <xsl:value-of select="$part.label"/>
+ <xsl:apply-templates select="ancestor::part"
+ mode="intralabel.punctuation"/>
+ </xsl:if>
+ </xsl:if>
+ <xsl:variable name="format">
+ <xsl:call-template name="autolabel.format">
+ <xsl:with-param name="format" select="$chapter.autolabel"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:choose>
+ <xsl:when test="$label.from.part != 0 and ancestor::part">
+ <xsl:number from="part" count="chapter" format="{$format}" level="any"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:number from="book" count="chapter" format="{$format}" level="any"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="appendix" mode="label.markup">
+ <xsl:choose>
+ <xsl:when test="@label">
+ <xsl:value-of select="@label"/>
+ </xsl:when>
+ <xsl:when test="string($appendix.autolabel) != 0">
+ <xsl:if test="$component.label.includes.part.label != 0 and
+ ancestor::part">
+ <xsl:variable name="part.label">
+ <xsl:apply-templates select="ancestor::part"
+ mode="label.markup"/>
+ </xsl:variable>
+ <xsl:if test="$part.label != ''">
+ <xsl:value-of select="$part.label"/>
+ <xsl:apply-templates select="ancestor::part"
+ mode="intralabel.punctuation"/>
+ </xsl:if>
+ </xsl:if>
+ <xsl:variable name="format">
+ <xsl:call-template name="autolabel.format">
+ <xsl:with-param name="format" select="$appendix.autolabel"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:choose>
+ <xsl:when test="$label.from.part != 0 and ancestor::part">
+ <xsl:number from="part" count="appendix" format="{$format}" level="any"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:number from="book|article"
+ count="appendix" format="{$format}" level="any"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="article" mode="label.markup">
+ <xsl:if test="@label">
+ <xsl:value-of select="@label"/>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="dedication|colophon" mode="label.markup">
+ <xsl:if test="@label">
+ <xsl:value-of select="@label"/>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="reference" mode="label.markup">
+ <xsl:choose>
+ <xsl:when test="@label">
+ <xsl:value-of select="@label"/>
+ </xsl:when>
+ <xsl:when test="string($reference.autolabel) != 0">
+ <xsl:if test="$component.label.includes.part.label != 0 and
+ ancestor::part">
+ <xsl:variable name="part.label">
+ <xsl:apply-templates select="ancestor::part"
+ mode="label.markup"/>
+ </xsl:variable>
+ <xsl:if test="$part.label != ''">
+ <xsl:value-of select="$part.label"/>
+ <xsl:apply-templates select="ancestor::part"
+ mode="intralabel.punctuation"/>
+ </xsl:if>
+ </xsl:if>
+ <xsl:variable name="format">
+ <xsl:call-template name="autolabel.format">
+ <xsl:with-param name="format" select="$reference.autolabel"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:choose>
+ <xsl:when test="$label.from.part != 0 and ancestor::part">
+ <xsl:number from="part" count="reference" format="{$format}" level="any"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:number from="book" count="reference" format="{$format}" level="any"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="refentry" mode="label.markup">
+ <xsl:if test="@label">
+ <xsl:value-of select="@label"/>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="section" mode="label.markup">
+ <!-- if this is a nested section, label the parent -->
+ <xsl:if test="local-name(..) = 'section'">
+ <xsl:variable name="parent.section.label">
+ <xsl:call-template name="label.this.section">
+ <xsl:with-param name="section" select=".."/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:if test="$parent.section.label != '0'">
+ <xsl:apply-templates select=".." mode="label.markup"/>
+ <xsl:apply-templates select=".." mode="intralabel.punctuation"/>
+ </xsl:if>
+ </xsl:if>
+
+ <!-- if the parent is a component, maybe label that too -->
+ <xsl:variable name="parent.is.component">
+ <xsl:call-template name="is.component">
+ <xsl:with-param name="node" select=".."/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <!-- does this section get labelled? -->
+ <xsl:variable name="label">
+ <xsl:call-template name="label.this.section">
+ <xsl:with-param name="section" select="."/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:if test="$section.label.includes.component.label != 0
+ and $parent.is.component != 0">
+ <xsl:variable name="parent.label">
+ <xsl:apply-templates select=".." mode="label.markup"/>
+ </xsl:variable>
+ <xsl:if test="$parent.label != ''">
+ <xsl:apply-templates select=".." mode="label.markup"/>
+ <xsl:apply-templates select=".." mode="intralabel.punctuation"/>
+ </xsl:if>
+ </xsl:if>
+
+<!--
+ <xsl:message>
+ test: <xsl:value-of select="$label"/>, <xsl:number count="section"/>
+ </xsl:message>
+-->
+
+ <xsl:choose>
+ <xsl:when test="@label">
+ <xsl:value-of select="@label"/>
+ </xsl:when>
+ <xsl:when test="$label != 0">
+ <xsl:variable name="format">
+ <xsl:call-template name="autolabel.format">
+ <xsl:with-param name="format" select="$section.autolabel"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:number format="{$format}" count="section"/>
+ </xsl:when>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="sect1" mode="label.markup">
+ <!-- if the parent is a component, maybe label that too -->
+ <xsl:variable name="parent.is.component">
+ <xsl:call-template name="is.component">
+ <xsl:with-param name="node" select=".."/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="component.label">
+ <xsl:if test="$section.label.includes.component.label != 0
+ and $parent.is.component != 0">
+ <xsl:variable name="parent.label">
+ <xsl:apply-templates select=".." mode="label.markup"/>
+ </xsl:variable>
+ <xsl:if test="$parent.label != ''">
+ <xsl:apply-templates select=".." mode="label.markup"/>
+ <xsl:apply-templates select=".." mode="intralabel.punctuation"/>
+ </xsl:if>
+ </xsl:if>
+ </xsl:variable>
+
+
+ <xsl:variable name="is.numbered">
+ <xsl:call-template name="label.this.section"/>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="@label">
+ <xsl:value-of select="@label"/>
+ </xsl:when>
+ <xsl:when test="$is.numbered != 0">
+ <xsl:variable name="format">
+ <xsl:call-template name="autolabel.format">
+ <xsl:with-param name="format" select="$section.autolabel"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:copy-of select="$component.label"/>
+ <xsl:number format="{$format}" count="sect1"/>
+ </xsl:when>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="sect2|sect3|sect4|sect5" mode="label.markup">
+ <!-- label the parent -->
+ <xsl:variable name="parent.section.label">
+ <xsl:call-template name="label.this.section">
+ <xsl:with-param name="section" select=".."/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:if test="$parent.section.label != '0'">
+ <xsl:apply-templates select=".." mode="label.markup"/>
+ <xsl:apply-templates select=".." mode="intralabel.punctuation"/>
+ </xsl:if>
+
+ <xsl:variable name="is.numbered">
+ <xsl:call-template name="label.this.section"/>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="@label">
+ <xsl:value-of select="@label"/>
+ </xsl:when>
+ <xsl:when test="$is.numbered != 0">
+ <xsl:variable name="format">
+ <xsl:call-template name="autolabel.format">
+ <xsl:with-param name="format" select="$section.autolabel"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:choose>
+ <xsl:when test="local-name(.) = 'sect2'">
+ <xsl:number format="{$format}" count="sect2"/>
+ </xsl:when>
+ <xsl:when test="local-name(.) = 'sect3'">
+ <xsl:number format="{$format}" count="sect3"/>
+ </xsl:when>
+ <xsl:when test="local-name(.) = 'sect4'">
+ <xsl:number format="{$format}" count="sect4"/>
+ </xsl:when>
+ <xsl:when test="local-name(.) = 'sect5'">
+ <xsl:number format="{$format}" count="sect5"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:message>label.markup: this can't happen!</xsl:message>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="bridgehead" mode="label.markup">
+ <!-- FIXME: could we do a better job here? -->
+ <xsl:variable name="contsec"
+ select="(ancestor::section
+ |ancestor::simplesect
+ |ancestor::sect1
+ |ancestor::sect2
+ |ancestor::sect3
+ |ancestor::sect4
+ |ancestor::sect5
+ |ancestor::refsect1
+ |ancestor::refsect2
+ |ancestor::refsect3
+ |ancestor::chapter
+ |ancestor::appendix
+ |ancestor::preface)[last()]"/>
+
+ <xsl:apply-templates select="$contsec" mode="label.markup"/>
+</xsl:template>
+
+<xsl:template match="refsect1" mode="label.markup">
+ <xsl:choose>
+ <xsl:when test="@label">
+ <xsl:value-of select="@label"/>
+ </xsl:when>
+ <xsl:when test="$section.autolabel != 0">
+ <xsl:variable name="format">
+ <xsl:call-template name="autolabel.format">
+ <xsl:with-param name="format" select="$section.autolabel"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:number count="refsect1" format="{$format}"/>
+ </xsl:when>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="refsect2|refsect3" mode="label.markup">
+ <!-- label the parent -->
+ <xsl:variable name="parent.label">
+ <xsl:apply-templates select=".." mode="label.markup"/>
+ </xsl:variable>
+ <xsl:if test="$parent.label != ''">
+ <xsl:apply-templates select=".." mode="label.markup"/>
+ <xsl:apply-templates select=".." mode="intralabel.punctuation"/>
+ </xsl:if>
+
+ <xsl:choose>
+ <xsl:when test="@label">
+ <xsl:value-of select="@label"/>
+ </xsl:when>
+ <xsl:when test="$section.autolabel != 0">
+ <xsl:variable name="format">
+ <xsl:call-template name="autolabel.format">
+ <xsl:with-param name="format" select="$section.autolabel"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:choose>
+ <xsl:when test="local-name(.) = 'refsect2'">
+ <xsl:number count="refsect2" format="{$format}"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:number count="refsect3" format="{$format}"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="simplesect" mode="label.markup">
+ <!-- if this is a nested section, label the parent -->
+ <xsl:if test="local-name(..) = 'section'
+ or local-name(..) = 'sect1'
+ or local-name(..) = 'sect2'
+ or local-name(..) = 'sect3'
+ or local-name(..) = 'sect4'
+ or local-name(..) = 'sect5'">
+ <xsl:variable name="parent.section.label">
+ <xsl:apply-templates select=".." mode="label.markup"/>
+ </xsl:variable>
+ <xsl:if test="$parent.section.label != ''">
+ <xsl:apply-templates select=".." mode="label.markup"/>
+ <xsl:apply-templates select=".." mode="intralabel.punctuation"/>
+ </xsl:if>
+ </xsl:if>
+
+ <!-- if the parent is a component, maybe label that too -->
+ <xsl:variable name="parent.is.component">
+ <xsl:call-template name="is.component">
+ <xsl:with-param name="node" select=".."/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <!-- does this section get labelled? -->
+ <xsl:variable name="label">
+ <xsl:call-template name="label.this.section">
+ <xsl:with-param name="section" select="."/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:if test="$section.label.includes.component.label != 0
+ and $parent.is.component != 0">
+ <xsl:variable name="parent.label">
+ <xsl:apply-templates select=".." mode="label.markup"/>
+ </xsl:variable>
+ <xsl:if test="$parent.label != ''">
+ <xsl:apply-templates select=".." mode="label.markup"/>
+ <xsl:apply-templates select=".." mode="intralabel.punctuation"/>
+ </xsl:if>
+ </xsl:if>
+
+ <xsl:choose>
+ <xsl:when test="@label">
+ <xsl:value-of select="@label"/>
+ </xsl:when>
+ <xsl:when test="$label != 0">
+ <xsl:variable name="format">
+ <xsl:call-template name="autolabel.format">
+ <xsl:with-param name="format" select="$section.autolabel"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:number format="{$format}" count="simplesect"/>
+ </xsl:when>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="qandadiv" mode="label.markup">
+ <xsl:variable name="lparent" select="(ancestor::set
+ |ancestor::book
+ |ancestor::chapter
+ |ancestor::appendix
+ |ancestor::preface
+ |ancestor::section
+ |ancestor::simplesect
+ |ancestor::sect1
+ |ancestor::sect2
+ |ancestor::sect3
+ |ancestor::sect4
+ |ancestor::sect5
+ |ancestor::refsect1
+ |ancestor::refsect2
+ |ancestor::refsect3)[last()]"/>
+
+ <xsl:variable name="lparent.prefix">
+ <xsl:apply-templates select="$lparent" mode="label.markup"/>
+ </xsl:variable>
+
+ <xsl:variable name="prefix">
+ <xsl:if test="$qanda.inherit.numeration != 0">
+ <xsl:if test="$lparent.prefix != ''">
+ <xsl:apply-templates select="$lparent" mode="label.markup"/>
+ <xsl:apply-templates select="$lparent" mode="intralabel.punctuation"/>
+ </xsl:if>
+ </xsl:if>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="$qandadiv.autolabel != 0">
+ <xsl:variable name="format">
+ <xsl:call-template name="autolabel.format">
+ <xsl:with-param name="format" select="$qandadiv.autolabel"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:value-of select="$prefix"/>
+ <xsl:number level="multiple" count="qandadiv" format="{$format}"/>
+ </xsl:when>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="question|answer" mode="label.markup">
+ <xsl:variable name="lparent" select="(ancestor::set
+ |ancestor::book
+ |ancestor::chapter
+ |ancestor::appendix
+ |ancestor::preface
+ |ancestor::section
+ |ancestor::simplesect
+ |ancestor::sect1
+ |ancestor::sect2
+ |ancestor::sect3
+ |ancestor::sect4
+ |ancestor::sect5
+ |ancestor::refsect1
+ |ancestor::refsect2
+ |ancestor::refsect3)[last()]"/>
+
+ <xsl:variable name="lparent.prefix">
+ <xsl:apply-templates select="$lparent" mode="label.markup"/>
+ </xsl:variable>
+
+ <xsl:variable name="prefix">
+ <xsl:if test="$qanda.inherit.numeration != 0">
+ <xsl:choose>
+ <xsl:when test="ancestor::qandadiv">
+ <xsl:variable name="div.label">
+ <xsl:apply-templates select="ancestor::qandadiv[1]" mode="label.markup"/>
+ </xsl:variable>
+ <xsl:if test="string-length($div.label) != 0">
+ <xsl:copy-of select="$div.label"/>
+ <xsl:apply-templates select="ancestor::qandadiv[1]"
+ mode="intralabel.punctuation"/>
+ </xsl:if>
+ </xsl:when>
+ <xsl:when test="$lparent.prefix != ''">
+ <xsl:apply-templates select="$lparent" mode="label.markup"/>
+ <xsl:apply-templates select="$lparent" mode="intralabel.punctuation"/>
+ </xsl:when>
+ </xsl:choose>
+ </xsl:if>
+ </xsl:variable>
+
+ <xsl:variable name="inhlabel"
+ select="ancestor-or-self::qandaset/@defaultlabel[1]"/>
+
+ <xsl:variable name="deflabel">
+ <xsl:choose>
+ <xsl:when test="$inhlabel != ''">
+ <xsl:value-of select="$inhlabel"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$qanda.defaultlabel"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="label" select="label"/>
+
+ <xsl:choose>
+ <xsl:when test="count($label)>0">
+ <xsl:apply-templates select="$label"/>
+ </xsl:when>
+
+ <xsl:when test="$deflabel = 'qanda' and self::question">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'Question'"/>
+ </xsl:call-template>
+ </xsl:when>
+
+ <xsl:when test="$deflabel = 'qanda' and self::answer">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'Answer'"/>
+ </xsl:call-template>
+ </xsl:when>
+
+ <xsl:when test="($deflabel = 'qnumber' or
+ $deflabel = 'qnumberanda') and self::question">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'Question'"/>
+ </xsl:call-template>
+ <xsl:text>&#xA0;</xsl:text>
+ <xsl:value-of select="$prefix"/>
+ <xsl:number level="multiple" count="qandaentry" format="1"/>
+ </xsl:when>
+
+ <xsl:when test="$deflabel = 'qnumberanda' and self::answer">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'Answer'"/>
+ </xsl:call-template>
+ </xsl:when>
+
+ <xsl:when test="$deflabel = 'number' and self::question">
+ <xsl:value-of select="$prefix"/>
+ <xsl:number level="multiple" count="qandaentry" format="1"/>
+ </xsl:when>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="bibliography|glossary|
+ qandaset|index|setindex" mode="label.markup">
+ <xsl:if test="@label">
+ <xsl:value-of select="@label"/>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="figure|table|example" mode="label.markup">
+ <xsl:variable name="pchap"
+ select="(ancestor::chapter
+ |ancestor::appendix
+ |ancestor::article[ancestor::book])[last()]"/>
+
+ <xsl:variable name="prefix">
+ <xsl:if test="count($pchap) &gt; 0">
+ <xsl:apply-templates select="$pchap" mode="label.markup"/>
+ </xsl:if>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="@label">
+ <xsl:value-of select="@label"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:choose>
+ <xsl:when test="$prefix != ''">
+ <xsl:apply-templates select="$pchap" mode="label.markup"/>
+ <xsl:apply-templates select="$pchap" mode="intralabel.punctuation"/>
+ <xsl:number format="1" from="chapter|appendix" level="any"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:number format="1" from="book|article" level="any"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="procedure" mode="label.markup">
+ <xsl:variable name="pchap"
+ select="ancestor::chapter
+ |ancestor::appendix
+ |ancestor::article[ancestor::book]"/>
+
+ <xsl:variable name="prefix">
+ <xsl:if test="count($pchap) &gt; 0">
+ <xsl:apply-templates select="$pchap" mode="label.markup"/>
+ </xsl:if>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="@label">
+ <xsl:value-of select="@label"/>
+ </xsl:when>
+ <xsl:when test="$formal.procedures = 0">
+ <!-- No label -->
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:choose>
+ <xsl:when test="count($pchap)>0">
+ <xsl:if test="$prefix != ''">
+ <xsl:apply-templates select="$pchap" mode="label.markup"/>
+ <xsl:apply-templates select="$pchap" mode="intralabel.punctuation"/>
+ </xsl:if>
+ <xsl:number count="procedure[title]" format="1"
+ from="chapter|appendix" level="any"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:number count="procedure[title]" format="1"
+ from="book|article" level="any"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="equation" mode="label.markup">
+ <xsl:variable name="pchap"
+ select="ancestor::chapter
+ |ancestor::appendix
+ |ancestor::article[ancestor::book]"/>
+
+ <xsl:variable name="prefix">
+ <xsl:if test="count($pchap) &gt; 0">
+ <xsl:apply-templates select="$pchap" mode="label.markup"/>
+ </xsl:if>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="@label">
+ <xsl:value-of select="@label"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:choose>
+ <xsl:when test="count($pchap)>0">
+ <xsl:if test="$prefix != ''">
+ <xsl:apply-templates select="$pchap" mode="label.markup"/>
+ <xsl:apply-templates select="$pchap" mode="intralabel.punctuation"/>
+ </xsl:if>
+ <xsl:number format="1" count="equation"
+ from="chapter|appendix" level="any"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:number format="1" count="equation"
+ from="book|article" level="any"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="orderedlist/listitem" mode="label.markup">
+ <xsl:variable name="numeration">
+ <xsl:call-template name="list.numeration">
+ <xsl:with-param name="node" select="parent::orderedlist"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="type">
+ <xsl:choose>
+ <xsl:when test="$numeration='arabic'">1</xsl:when>
+ <xsl:when test="$numeration='loweralpha'">a</xsl:when>
+ <xsl:when test="$numeration='lowerroman'">i</xsl:when>
+ <xsl:when test="$numeration='upperalpha'">A</xsl:when>
+ <xsl:when test="$numeration='upperroman'">I</xsl:when>
+ <!-- What!? This should never happen -->
+ <xsl:otherwise>
+ <xsl:message>
+ <xsl:text>Unexpected numeration: </xsl:text>
+ <xsl:value-of select="$numeration"/>
+ </xsl:message>
+ <xsl:value-of select="1."/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="item-number">
+ <xsl:call-template name="orderedlist-item-number"/>
+ </xsl:variable>
+
+ <xsl:number value="$item-number" format="{$type}"/>
+</xsl:template>
+
+<xsl:template match="abstract" mode="label.markup">
+ <!-- nop -->
+</xsl:template>
+
+<xsl:template match="sidebar" mode="label.markup">
+ <!-- nop -->
+</xsl:template>
+
+<!-- ============================================================ -->
+
+<xsl:template name="label.this.section">
+ <xsl:param name="section" select="."/>
+
+ <xsl:variable name="level">
+ <xsl:call-template name="section.level"/>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="$level &lt;= $section.autolabel.max.depth">
+ <xsl:value-of select="$section.autolabel"/>
+ </xsl:when>
+ <xsl:otherwise>0</xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<doc:template name="label.this.section" xmlns="">
+<refpurpose>Returns true if $section should be labelled</refpurpose>
+<refdescription id="label.this.section-desc">
+<para>Returns true if the specified section should be labelled.
+By default, this template returns zero unless
+the section level is less than or equal to the value of the
+<literal>$section.autolabel.max.depth</literal> parameter, in
+which case it returns
+<literal>$section.autolabel</literal>.
+Custom stylesheets may override it to get more selective behavior.</para>
+</refdescription>
+</doc:template>
+
+<!-- ============================================================ -->
+
+<xsl:template name="default.autolabel.format">
+ <xsl:param name="context" select="."/>
+ <xsl:choose>
+ <xsl:when test="local-name($context) = 'appendix'">
+ <xsl:value-of select="'A'"/>
+ </xsl:when>
+ <xsl:when test="local-name($context) = 'part'">
+ <xsl:value-of select="'I'"/>
+ </xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="autolabel.format">
+ <xsl:param name="context" select="."/>
+ <xsl:param name="format"/>
+
+ <xsl:choose>
+ <xsl:when test="string($format) != 0">
+ <xsl:choose>
+ <xsl:when test="string($format)='arabic' or $format='1'">1</xsl:when>
+ <xsl:when test="$format='loweralpha' or $format='a'">
+ <xsl:value-of select="'a'"/>
+ </xsl:when>
+ <xsl:when test="$format='lowerroman' or $format='i'">
+ <xsl:value-of select="'i'"/>
+ </xsl:when>
+ <xsl:when test="$format='upperalpha' or $format='A'">
+ <xsl:value-of select="'A'"/>
+ </xsl:when>
+ <xsl:when test="$format='upperroman' or $format='I'">
+ <xsl:value-of select="'I'"/>
+ </xsl:when>
+ <xsl:when test="$format='arabicindic' or $format='&#x661;'">
+ <xsl:value-of select="'&#x661;'"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:message>
+ <xsl:text>Unexpected </xsl:text><xsl:value-of select="local-name(.)"/><xsl:text>.autolabel value: </xsl:text>
+ <xsl:value-of select="$format"/><xsl:text>; using default.</xsl:text>
+ </xsl:message>
+ <xsl:call-template name="default.autolabel.format"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ </xsl:choose>
+</xsl:template>
+
+<doc:template name="autolabel.format" xmlns="">
+<refpurpose>Returns format for autolabel parameters</refpurpose>
+<refdescription id="autolabel.format-desc">
+<para>Returns format passed as parameter if non zero. Supported
+ format are 'arabic' or '1', 'loweralpha' or 'a', 'lowerroman' or 'i',
+ 'upperlapha' or 'A', 'upperroman' or 'I', 'arabicindic' or '&#x661;'.
+ If its not one of these then
+ returns the default format.</para>
+</refdescription>
+</doc:template>
+
+<!-- ============================================================ -->
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/lt.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/lt.xml
new file mode 100644
index 0000000..9f9a545
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/lt.xml
@@ -0,0 +1,678 @@
+<?xml version="1.0" encoding="utf-8"?>
+<l:l10n xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0" language="lt" english-language-name="Lithuanian">
+
+<!-- * This file is generated automatically. -->
+<!-- * To submit changes to this file upstream (to the DocBook Project) -->
+<!-- * do not submit an edited version of this file. Instead, submit an -->
+<!-- * edited version of the source file at the following location: -->
+<!-- * -->
+<!-- * https://docbook.svn.sourceforge.net/svnroot/docbook/trunk/gentext/locale/lt.xml -->
+<!-- * -->
+<!-- * E-mail the edited lt.xml source file to: -->
+<!-- * -->
+<!-- * docbook-developers@lists.sourceforge.net -->
+
+<!-- ******************************************************************** -->
+
+<!-- This file is part of the XSL DocBook Stylesheet distribution. -->
+<!-- See ../README or http://docbook.sf.net/release/xsl/current/ for -->
+<!-- copyright and other information. -->
+
+<!-- ******************************************************************** -->
+<!-- In these files, % with a letter is used for a placeholder: -->
+<!-- %t is the current element's title -->
+<!-- %s is the current element's subtitle (if applicable)-->
+<!-- %n is the current element's number label-->
+<!-- %p is the current element's page number (if applicable)-->
+<!-- ******************************************************************** -->
+
+
+<l:gentext key="Abstract" text="Santrauka"/>
+<l:gentext key="abstract" text="Santrauka"/>
+<l:gentext key="Acknowledgements" text="Acknowledgements" lang="en"/>
+<l:gentext key="acknowledgements" text="Acknowledgements" lang="en"/>
+<l:gentext key="Answer" text="Ats:"/>
+<l:gentext key="answer" text="Ats:"/>
+<l:gentext key="Appendix" text="Priedas"/>
+<l:gentext key="appendix" text="Priedas"/>
+<l:gentext key="Article" text="Straipsnis"/>
+<l:gentext key="article" text="Straipsnis"/>
+<l:gentext key="Author" text="Autorius"/>
+<l:gentext key="Bibliography" text="Bibliografija"/>
+<l:gentext key="bibliography" text="Bibliografija"/>
+<l:gentext key="Book" text="Knyga"/>
+<l:gentext key="book" text="Knyga"/>
+<l:gentext key="CAUTION" text="ATSARGIAI"/>
+<l:gentext key="Caution" text="Atsargiai"/>
+<l:gentext key="caution" text="Atsargiai"/>
+<l:gentext key="Chapter" text="Skyrius"/>
+<l:gentext key="chapter" text="Skyrius"/>
+<l:gentext key="Colophon" text="Knygos metrika"/>
+<l:gentext key="colophon" text="Knygos metrika"/>
+<l:gentext key="Copyright" text="AutorinÄ—s teisÄ—s"/>
+<l:gentext key="copyright" text="AutorinÄ—s teisÄ—s"/>
+<l:gentext key="Dedication" text="Dedikacija"/>
+<l:gentext key="dedication" text="Dedikacija"/>
+<l:gentext key="Edition" text="Leidimas"/>
+<l:gentext key="edition" text="Leidimas"/>
+<l:gentext key="Editor" text="Editor" lang="en"/>
+<l:gentext key="Equation" text="Lygtis"/>
+<l:gentext key="equation" text="Lygtis"/>
+<l:gentext key="Example" text="Pavyzdys"/>
+<l:gentext key="example" text="Pavyzdys"/>
+<l:gentext key="Figure" text="Pav."/>
+<l:gentext key="figure" text="Pav."/>
+<l:gentext key="Glossary" text="Terminų žodynas"/>
+<l:gentext key="glossary" text="Terminų žodynas"/>
+<l:gentext key="GlossSee" text="Žr."/>
+<l:gentext key="glosssee" text="Žr."/>
+<l:gentext key="GlossSeeAlso" text="Taip pat žr."/>
+<l:gentext key="glossseealso" text="Taip pat žr."/>
+<l:gentext key="IMPORTANT" text="SVARBU"/>
+<l:gentext key="important" text="Svarbu"/>
+<l:gentext key="Important" text="Svarbu"/>
+<l:gentext key="Index" text="RodyklÄ—"/>
+<l:gentext key="index" text="RodyklÄ—"/>
+<l:gentext key="ISBN" text="ISBN"/>
+<l:gentext key="isbn" text="ISBN"/>
+<l:gentext key="LegalNotice" text="TeisinÄ— pastaba"/>
+<l:gentext key="legalnotice" text="TeisinÄ— pastaba"/>
+<l:gentext key="MsgAud" text="Auditorija"/>
+<l:gentext key="msgaud" text="Auditorija"/>
+<l:gentext key="MsgLevel" text="Lygmuo"/>
+<l:gentext key="msglevel" text="Lygmuo"/>
+<l:gentext key="MsgOrig" text="KilmÄ—"/>
+<l:gentext key="msgorig" text="KilmÄ—"/>
+<l:gentext key="NOTE" text="PASTABA"/>
+<l:gentext key="Note" text="Pastaba"/>
+<l:gentext key="note" text="Pastaba"/>
+<l:gentext key="Part" text="Dalis"/>
+<l:gentext key="part" text="Dalis"/>
+<l:gentext key="Preface" text="Įvadas"/>
+<l:gentext key="preface" text="Įvadas"/>
+<l:gentext key="Procedure" text="Procedūra"/>
+<l:gentext key="procedure" text="Procedūra"/>
+<l:gentext key="ProductionSet" text="Produkcija"/>
+<l:gentext key="PubDate" text="IÅ¡leidimo data"/>
+<l:gentext key="pubdate" text="IÅ¡leidimo data"/>
+<l:gentext key="Published" text="IÅ¡leistas"/>
+<l:gentext key="published" text="IÅ¡leistas"/>
+<l:gentext key="Publisher" text="Publisher" lang="en"/>
+<l:gentext key="Qandadiv" text="Klaus. ir Ats."/>
+<l:gentext key="qandadiv" text="Klaus. ir Ats."/>
+<l:gentext key="QandASet" text="Frequently Asked Questions" lang="en"/>
+<l:gentext key="Question" text="Klaus.:"/>
+<l:gentext key="question" text="Klaus.:"/>
+<l:gentext key="RefEntry" text=""/>
+<l:gentext key="refentry" text=""/>
+<l:gentext key="Reference" text="Nuoroda"/>
+<l:gentext key="reference" text="Nuoroda"/>
+<l:gentext key="References" text="Nuorodos"/>
+<l:gentext key="RefName" text="Pavadinimas"/>
+<l:gentext key="refname" text="Pavadinimas"/>
+<l:gentext key="RefSection" text=""/>
+<l:gentext key="refsection" text=""/>
+<l:gentext key="RefSynopsisDiv" text="Trumpa apžvalga"/>
+<l:gentext key="refsynopsisdiv" text="Trumpa apžvalga"/>
+<l:gentext key="RevHistory" text="Pataisymų istorija"/>
+<l:gentext key="revhistory" text="Pataisymų istorija"/>
+<l:gentext key="revision" text="Pataisytas leidimas"/>
+<l:gentext key="Revision" text="Pataisytas leidimas"/>
+<l:gentext key="sect1" text="Skyrius"/>
+<l:gentext key="sect2" text="Skyrius"/>
+<l:gentext key="sect3" text="Skyrius"/>
+<l:gentext key="sect4" text="Skyrius"/>
+<l:gentext key="sect5" text="Skyrius"/>
+<l:gentext key="section" text="Skyrius"/>
+<l:gentext key="Section" text="Skyrius"/>
+<l:gentext key="see" text="žr."/>
+<l:gentext key="See" text="Žr."/>
+<l:gentext key="seealso" text="taip pat žr."/>
+<l:gentext key="Seealso" text="Taip pat žr."/>
+<l:gentext key="SeeAlso" text="Taip pat žr."/>
+<l:gentext key="set" text="Set"/>
+<l:gentext key="Set" text="Set"/>
+<l:gentext key="setindex" text="Set Index"/>
+<l:gentext key="SetIndex" text="Set Index"/>
+<l:gentext key="Sidebar" text=""/>
+<l:gentext key="sidebar" text="sidebar"/>
+<l:gentext key="step" text="žingsnis"/>
+<l:gentext key="Step" text="Žingsnis"/>
+<l:gentext key="table" text="LentelÄ—"/>
+<l:gentext key="Table" text="LentelÄ—"/>
+<l:gentext key="task" text="Task" lang="en"/>
+<l:gentext key="Task" text="Task" lang="en"/>
+<l:gentext key="tip" text="Patarimas"/>
+<l:gentext key="TIP" text="PATARIMAS"/>
+<l:gentext key="Tip" text="Patarimas"/>
+<l:gentext key="Warning" text="Įspėjimas"/>
+<l:gentext key="warning" text="Įspėjimas"/>
+<l:gentext key="WARNING" text="ĮSPĖJIMAS"/>
+<l:gentext key="and" text="ir"/>
+<l:gentext key="by" text=""/>
+<l:gentext key="Edited" text="Redaguotas"/>
+<l:gentext key="edited" text="Redaguotas"/>
+<l:gentext key="Editedby" text="Redagavo"/>
+<l:gentext key="editedby" text="Redagavo"/>
+<l:gentext key="in" text=""/>
+<l:gentext key="lastlistcomma" text=","/>
+<l:gentext key="listcomma" text=","/>
+<l:gentext key="notes" text="Pastabos"/>
+<l:gentext key="Notes" text="Pastabos"/>
+<l:gentext key="Pgs" text="P."/>
+<l:gentext key="pgs" text="P."/>
+<l:gentext key="Revisedby" text="PataisÄ—: "/>
+<l:gentext key="revisedby" text="PataisÄ—: "/>
+<l:gentext key="TableNotes" text="Pastabos"/>
+<l:gentext key="tablenotes" text="Pastabos"/>
+<l:gentext key="TableofContents" text="Turinys"/>
+<l:gentext key="tableofcontents" text="Turinys"/>
+<l:gentext key="unexpectedelementname" text="Nenumatyto elemento pavadinimas"/>
+<l:gentext key="unsupported" text="nepalaikomas"/>
+<l:gentext key="xrefto" text="xref į"/>
+<l:gentext key="Authors" text="Authors" lang="en"/>
+<l:gentext key="copyeditor" text="Copy Editor" lang="en"/>
+<l:gentext key="graphicdesigner" text="Graphic Designer" lang="en"/>
+<l:gentext key="productioneditor" text="Production Editor" lang="en"/>
+<l:gentext key="technicaleditor" text="Technical Editor" lang="en"/>
+<l:gentext key="translator" text="Translator" lang="en"/>
+<l:gentext key="listofequations" text="LygÄių sÄ…raÅ¡as"/>
+<l:gentext key="ListofEquations" text="LygÄių sÄ…raÅ¡as"/>
+<l:gentext key="ListofExamples" text="Pavyzdžių sąrašas"/>
+<l:gentext key="listofexamples" text="Pavyzdžių sąrašas"/>
+<l:gentext key="ListofFigures" text="Paveikslų sąrašas"/>
+<l:gentext key="listoffigures" text="Paveikslų sąrašas"/>
+<l:gentext key="ListofProcedures" text="Procedūrų sąrašas"/>
+<l:gentext key="listofprocedures" text="Procedūrų sąrašas"/>
+<l:gentext key="listoftables" text="Lentelių sąrašas"/>
+<l:gentext key="ListofTables" text="Lentelių sąrašas"/>
+<l:gentext key="ListofUnknown" text="Nežinomas sąrašas"/>
+<l:gentext key="listofunknown" text="Nežinomas sąrašas"/>
+<l:gentext key="nav-home" text="Į pradžią"/>
+<l:gentext key="nav-next" text="Tolesnis"/>
+<l:gentext key="nav-next-sibling" text="Spartus pirmyn"/>
+<l:gentext key="nav-prev" text="Ankstesnis"/>
+<l:gentext key="nav-prev-sibling" text="Spartus atgal"/>
+<l:gentext key="nav-up" text="Aukštyn"/>
+<l:gentext key="nav-toc" text="Turinys"/>
+<l:gentext key="Draft" text="Planas"/>
+<l:gentext key="above" text="aukÅ¡Äiau"/>
+<l:gentext key="below" text="žemiau"/>
+<l:gentext key="sectioncalled" text="skyrius pavadinimu"/>
+<l:gentext key="index symbols" text="Simboliai"/>
+<l:gentext key="writing-mode" text="lr-tb"/>
+<l:gentext key="lowercase.alpha" text="aÄ…bcÄdeęėfghiįyjklmnoprsÅ¡tuųūvzžqwx"/>
+<l:gentext key="uppercase.alpha" text="AĄBCČDEĘĖFGHIĮYJKLMNOPRSŠTUŲŪVZŽQWX"/>
+<l:gentext key="normalize.sort.input" text="AaÀàÃáÂâÃãÄäÅåĀÄĂ㥹ÇǎǞǟǠǡǺǻȀÈȂȃȦȧḀá¸áºšáº áº¡áº¢áº£áº¤áº¥áº¦áº§áº¨áº©áºªáº«áº¬áº­áº®áº¯áº°áº±áº²áº³áº´áºµáº¶áº·BbÆ€ÆɓƂƃḂḃḄḅḆḇCcÇçĆćĈĉĊċČÄƇƈɕḈḉDdÄŽÄÄđƊɗƋƌDžDzȡɖḊḋḌá¸á¸Žá¸á¸á¸‘ḒḓEeÈèÉéÊêËëĒēĔĕĖėĘęĚěȄȅȆȇȨȩḔḕḖḗḘḙḚḛḜá¸áº¸áº¹áººáº»áº¼áº½áº¾áº¿á»€á»á»‚ểỄễỆệFfƑƒḞḟGgÄœÄĞğĠġĢģƓɠǤǥǦǧǴǵḠḡHhĤĥĦħȞȟɦḢḣḤḥḦḧḨḩḪḫẖIiÌìÃíÎîÃïĨĩĪīĬĭĮįİƗɨÇÇȈȉȊȋḬḭḮḯỈỉỊịJjĴĵǰÊKkĶķƘƙǨǩḰḱḲḳḴḵLlĹĺĻļĽľĿŀÅłƚLjȴɫɬɭḶḷḸḹḺḻḼḽMmɱḾḿṀá¹á¹‚ṃNnÑñŃńŅņŇňÆɲƞȠNjǸǹȵɳṄṅṆṇṈṉṊṋOoÒòÓóÔôÕõÖöØøŌÅÅŽÅÅőƟƠơǑǒǪǫǬǭǾǿȌÈÈŽÈȪȫȬȭȮȯȰȱṌá¹á¹Žá¹á¹á¹‘ṒṓỌá»á»Žá»á»á»‘ỒồỔổỖỗỘộỚớỜá»á»žá»Ÿá» á»¡á»¢á»£PpƤƥṔṕṖṗQqÊ RrŔŕŖŗŘřÈȑȒȓɼɽɾṘṙṚṛṜá¹á¹žá¹ŸSsŚśŜÅŞşŠšȘșʂṠṡṢṣṤṥṦṧṨṩTtŢţŤťŦŧƫƬƭƮʈȚțȶṪṫṬṭṮṯṰṱẗUuÙùÚúÛûÜüŨũŪūŬŭŮůŰűŲųƯưǓǔǕǖǗǘǙǚǛǜȔȕȖȗṲṳṴṵṶṷṸṹṺṻỤụỦủỨứỪừỬửỮữỰựVvƲʋṼṽṾṿWwŴŵẀáºáº‚ẃẄẅẆẇẈẉẘXxẊẋẌáºYyÃýÿŸŶŷƳƴȲȳẎáºáº™á»²á»³á»´á»µá»¶á»·á»¸á»¹ZzŹźŻżŽžƵƶȤȥÊÊ‘áºáº‘ẒẓẔẕẕ" lang="en"/>
+<l:gentext key="normalize.sort.output" text="AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBCCCCCCCCCCCCCCCCCDDDDDDDDDDDDDDDDDDDDDDDDEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEFFFFFFGGGGGGGGGGGGGGGGGGGGHHHHHHHHHHHHHHHHHHHHIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIJJJJJJKKKKKKKKKKKKKKLLLLLLLLLLLLLLLLLLLLLLLLLLMMMMMMMMMNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOPPPPPPPPQQQRRRRRRRRRRRRRRRRRRRRRRRSSSSSSSSSSSSSSSSSSSSSSSTTTTTTTTTTTTTTTTTTTTTTTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUVVVVVVVVWWWWWWWWWWWWWWWXXXXXXYYYYYYYYYYYYYYYYYYYYYYYZZZZZZZZZZZZZZZZZZZZZ" lang="en"/>
+<l:dingbat key="startquote" text="„"/>
+<l:dingbat key="endquote" text="“"/>
+<l:dingbat key="nestedstartquote" text="‘"/>
+<l:dingbat key="nestedendquote" text="’"/>
+<l:dingbat key="singlestartquote" text="‘"/>
+<l:dingbat key="singleendquote" text="’"/>
+<l:dingbat key="bullet" text="•"/>
+<l:gentext key="hyphenation-character" text="-"/>
+<l:gentext key="hyphenation-push-character-count" text="2"/>
+<l:gentext key="hyphenation-remain-character-count" text="2"/>
+<l:context name="styles"><l:template name="person-name" text="first-last"/>
+</l:context>
+<l:context name="title"><l:template name="abstract" text="%t"/>
+<l:template name="acknowledgements" text="%t" lang="en"/>
+<l:template name="answer" text="%t"/>
+<l:template name="appendix" text="Priedas %n. %t"/>
+<l:template name="article" text="%t"/>
+<l:template name="authorblurb" text="%t"/>
+<l:template name="bibliodiv" text="%t"/>
+<l:template name="biblioentry" text="%t"/>
+<l:template name="bibliography" text="%t"/>
+<l:template name="bibliolist" text="%t"/>
+<l:template name="bibliomixed" text="%t"/>
+<l:template name="bibliomset" text="%t"/>
+<l:template name="biblioset" text="%t"/>
+<l:template name="blockquote" text="%t"/>
+<l:template name="book" text="%t"/>
+<l:template name="calloutlist" text="%t"/>
+<l:template name="caution" text="%t"/>
+<l:template name="chapter" text="Skyrius %n. %t"/>
+<l:template name="colophon" text="%t"/>
+<l:template name="dedication" text="%t"/>
+<l:template name="equation" text="Lygtis %n. %t"/>
+<l:template name="example" text="Pavyzdys %n. %t"/>
+<l:template name="figure" text="Pav. %n. %t"/>
+<l:template name="foil" text="%t"/>
+<l:template name="foilgroup" text="%t"/>
+<l:template name="formalpara" text="%t"/>
+<l:template name="glossary" text="%t"/>
+<l:template name="glossdiv" text="%t"/>
+<l:template name="glosslist" text="%t"/>
+<l:template name="glossentry" text="%t"/>
+<l:template name="important" text="%t"/>
+<l:template name="index" text="%t"/>
+<l:template name="indexdiv" text="%t"/>
+<l:template name="itemizedlist" text="%t"/>
+<l:template name="legalnotice" text="%t"/>
+<l:template name="listitem" text=""/>
+<l:template name="lot" text="%t"/>
+<l:template name="msg" text="%t"/>
+<l:template name="msgexplan" text="%t"/>
+<l:template name="msgmain" text="%t"/>
+<l:template name="msgrel" text="%t"/>
+<l:template name="msgset" text="%t"/>
+<l:template name="msgsub" text="%t"/>
+<l:template name="note" text="%t"/>
+<l:template name="orderedlist" text="%t"/>
+<l:template name="part" text="Dalis %n. %t"/>
+<l:template name="partintro" text="%t"/>
+<l:template name="preface" text="%t"/>
+<l:template name="procedure" text="%t"/>
+<l:template name="procedure.formal" text="Procedūra %n. %t"/>
+<l:template name="productionset" text="%t"/>
+<l:template name="productionset.formal" text="Produkcija %n"/>
+<l:template name="qandadiv" text="%t"/>
+<l:template name="qandaentry" text="%t"/>
+<l:template name="qandaset" text="%t"/>
+<l:template name="question" text="%t"/>
+<l:template name="refentry" text="%t"/>
+<l:template name="reference" text="%t"/>
+<l:template name="refsection" text="%t"/>
+<l:template name="refsect1" text="%t"/>
+<l:template name="refsect2" text="%t"/>
+<l:template name="refsect3" text="%t"/>
+<l:template name="refsynopsisdiv" text="%t"/>
+<l:template name="refsynopsisdivinfo" text="%t"/>
+<l:template name="segmentedlist" text="%t"/>
+<l:template name="set" text="%t"/>
+<l:template name="setindex" text="%t"/>
+<l:template name="sidebar" text="%t"/>
+<l:template name="step" text="%t"/>
+<l:template name="table" text="Lentelė %n. %t"/>
+<l:template name="task" text="%t"/>
+<l:template name="tasksummary" text="%t" lang="en"/>
+<l:template name="taskprerequisites" text="%t" lang="en"/>
+<l:template name="taskrelated" text="%t" lang="en"/>
+<l:template name="tip" text="%t"/>
+<l:template name="toc" text="%t"/>
+<l:template name="variablelist" text="%t"/>
+<l:template name="varlistentry" text=""/>
+<l:template name="warning" text="%t"/>
+</l:context>
+<l:context name="title-unnumbered"><l:template name="appendix" text="%t"/>
+<l:template name="article/appendix" text="%t"/>
+<l:template name="bridgehead" text="%t"/>
+<l:template name="chapter" text="%t"/>
+<l:template name="sect1" text="%t"/>
+<l:template name="sect2" text="%t"/>
+<l:template name="sect3" text="%t"/>
+<l:template name="sect4" text="%t"/>
+<l:template name="sect5" text="%t"/>
+<l:template name="section" text="%t"/>
+<l:template name="simplesect" text="%t"/>
+<l:template name="part" text="%t"/>
+</l:context>
+<l:context name="title-numbered"><l:template name="appendix" text="Priedas %n. %t"/>
+<l:template name="article/appendix" text="%n. %t"/>
+<l:template name="bridgehead" text="%n. %t"/>
+<l:template name="chapter" text="Skyrius %n. %t"/>
+<l:template name="part" text="Dalis %n. %t"/>
+<l:template name="sect1" text="%n. %t"/>
+<l:template name="sect2" text="%n. %t"/>
+<l:template name="sect3" text="%n. %t"/>
+<l:template name="sect4" text="%n. %t"/>
+<l:template name="sect5" text="%n. %t"/>
+<l:template name="section" text="%n. %t"/>
+<l:template name="simplesect" text="%t"/>
+</l:context>
+<l:context name="subtitle"><l:template name="appendix" text="%s"/>
+<l:template name="acknowledgements" text="%s" lang="en"/>
+<l:template name="article" text="%s"/>
+<l:template name="bibliodiv" text="%s"/>
+<l:template name="biblioentry" text="%s"/>
+<l:template name="bibliography" text="%s"/>
+<l:template name="bibliomixed" text="%s"/>
+<l:template name="bibliomset" text="%s"/>
+<l:template name="biblioset" text="%s"/>
+<l:template name="book" text="%s"/>
+<l:template name="chapter" text="%s"/>
+<l:template name="colophon" text="%s"/>
+<l:template name="dedication" text="%s"/>
+<l:template name="glossary" text="%s"/>
+<l:template name="glossdiv" text="%s"/>
+<l:template name="index" text="%s"/>
+<l:template name="indexdiv" text="%s"/>
+<l:template name="lot" text="%s"/>
+<l:template name="part" text="%s"/>
+<l:template name="partintro" text="%s"/>
+<l:template name="preface" text="%s"/>
+<l:template name="refentry" text="%s"/>
+<l:template name="reference" text="%s"/>
+<l:template name="refsection" text="%s"/>
+<l:template name="refsect1" text="%s"/>
+<l:template name="refsect2" text="%s"/>
+<l:template name="refsect3" text="%s"/>
+<l:template name="refsynopsisdiv" text="%s"/>
+<l:template name="sect1" text="%s"/>
+<l:template name="sect2" text="%s"/>
+<l:template name="sect3" text="%s"/>
+<l:template name="sect4" text="%s"/>
+<l:template name="sect5" text="%s"/>
+<l:template name="section" text="%s"/>
+<l:template name="set" text="%s"/>
+<l:template name="setindex" text="%s"/>
+<l:template name="sidebar" text="%s"/>
+<l:template name="simplesect" text="%s"/>
+<l:template name="toc" text="%s"/>
+</l:context>
+<l:context name="xref"><l:template name="abstract" text="%t"/>
+<l:template name="acknowledgements" text="%t" lang="en"/>
+<l:template name="answer" text="Ats: %n"/>
+<l:template name="appendix" text="%t"/>
+<l:template name="article" text="%t"/>
+<l:template name="authorblurb" text="%t"/>
+<l:template name="bibliodiv" text="%t"/>
+<l:template name="bibliography" text="%t"/>
+<l:template name="bibliomset" text="%t"/>
+<l:template name="biblioset" text="%t"/>
+<l:template name="blockquote" text="%t"/>
+<l:template name="book" text="%t"/>
+<l:template name="calloutlist" text="%t"/>
+<l:template name="caution" text="%t"/>
+<l:template name="chapter" text="%t"/>
+<l:template name="colophon" text="%t"/>
+<l:template name="constraintdef" text="%t"/>
+<l:template name="dedication" text="%t"/>
+<l:template name="equation" text="%t"/>
+<l:template name="example" text="%t"/>
+<l:template name="figure" text="%t"/>
+<l:template name="foil" text="%t"/>
+<l:template name="foilgroup" text="%t"/>
+<l:template name="formalpara" text="%t"/>
+<l:template name="glossary" text="%t"/>
+<l:template name="glossdiv" text="%t"/>
+<l:template name="important" text="%t"/>
+<l:template name="index" text="%t"/>
+<l:template name="indexdiv" text="%t"/>
+<l:template name="itemizedlist" text="%t"/>
+<l:template name="legalnotice" text="%t"/>
+<l:template name="listitem" text="%n"/>
+<l:template name="lot" text="%t"/>
+<l:template name="msg" text="%t"/>
+<l:template name="msgexplan" text="%t"/>
+<l:template name="msgmain" text="%t"/>
+<l:template name="msgrel" text="%t"/>
+<l:template name="msgset" text="%t"/>
+<l:template name="msgsub" text="%t"/>
+<l:template name="note" text="%t"/>
+<l:template name="orderedlist" text="%t"/>
+<l:template name="part" text="%t"/>
+<l:template name="partintro" text="%t"/>
+<l:template name="preface" text="%t"/>
+<l:template name="procedure" text="%t"/>
+<l:template name="productionset" text="%t"/>
+<l:template name="qandadiv" text="%t"/>
+<l:template name="qandaentry" text="Klaus.: %n"/>
+<l:template name="qandaset" text="%t"/>
+<l:template name="question" text="Klaus.: %n"/>
+<l:template name="reference" text="%t"/>
+<l:template name="refsynopsisdiv" text="%t"/>
+<l:template name="segmentedlist" text="%t"/>
+<l:template name="set" text="%t"/>
+<l:template name="setindex" text="%t"/>
+<l:template name="sidebar" text="%t"/>
+<l:template name="table" text="%t"/>
+<l:template name="task" text="%t" lang="en"/>
+<l:template name="tip" text="%t"/>
+<l:template name="toc" text="%t"/>
+<l:template name="variablelist" text="%t"/>
+<l:template name="varlistentry" text="%n"/>
+<l:template name="warning" text="%t"/>
+<l:template name="olink.document.citation" text=" in %o"/>
+<l:template name="olink.page.citation" text=" (page %p)"/>
+<l:template name="page.citation" text=" [%p]"/>
+<l:template name="page" text="(%p puslapis)"/>
+<l:template name="docname" text=" dokumente %o"/>
+<l:template name="docnamelong" text=" dokumente %o"/>
+<l:template name="pageabbrev" text="(%p p.)"/>
+<l:template name="Page" text="%p puslapis"/>
+<l:template name="bridgehead" text="skyrius pavadinimu „%t“"/>
+<l:template name="refsection" text="skyrius pavadinimu „%t“"/>
+<l:template name="refsect1" text="skyrius pavadinimu „%t“"/>
+<l:template name="refsect2" text="skyrius pavadinimu „%t“"/>
+<l:template name="refsect3" text="skyrius pavadinimu „%t“"/>
+<l:template name="sect1" text="skyrius pavadinimu „%t“"/>
+<l:template name="sect2" text="skyrius pavadinimu „%t“"/>
+<l:template name="sect3" text="skyrius pavadinimu „%t“"/>
+<l:template name="sect4" text="skyrius pavadinimu „%t“"/>
+<l:template name="sect5" text="skyrius pavadinimu „%t“"/>
+<l:template name="section" text="skyrius pavadinimu „%t“"/>
+<l:template name="simplesect" text="skyrius pavadinimu „%t“"/>
+</l:context>
+<l:context name="xref-number"><l:template name="answer" text="Ats: %n"/>
+<l:template name="appendix" text="Priedas %n"/>
+<l:template name="bridgehead" text="Skyrius %n"/>
+<l:template name="chapter" text="Skyrius %n"/>
+<l:template name="equation" text="Lygtis %n"/>
+<l:template name="example" text="Pavyzdys %n"/>
+<l:template name="figure" text="Pav. %n"/>
+<l:template name="part" text="Dalis %n"/>
+<l:template name="procedure" text="Procedūra %n"/>
+<l:template name="productionset" text="Produkcija %n"/>
+<l:template name="qandadiv" text="Klaus. ir Ats. %n"/>
+<l:template name="qandaentry" text="Klaus.: %n"/>
+<l:template name="question" text="Klaus.: %n"/>
+<l:template name="sect1" text="Skyrius %n"/>
+<l:template name="sect2" text="Skyrius %n"/>
+<l:template name="sect3" text="Skyrius %n"/>
+<l:template name="sect4" text="Skyrius %n"/>
+<l:template name="sect5" text="Skyrius %n"/>
+<l:template name="section" text="Skyrius %n"/>
+<l:template name="table" text="Lentelė %n"/>
+</l:context>
+<l:context name="xref-number-and-title"><l:template name="appendix" text="Priedas %n, %t"/>
+<l:template name="bridgehead" text="Skyrius %n, „%t“"/>
+<l:template name="chapter" text="Skyrius %n, %t"/>
+<l:template name="equation" text="Lygtis %n, „%t“"/>
+<l:template name="example" text="Pavyzdys %n, „%t“"/>
+<l:template name="figure" text="Pav. %n, „%t“"/>
+<l:template name="part" text="Dalis %n, „%t“"/>
+<l:template name="procedure" text="Procedūra %n, „%t“"/>
+<l:template name="productionset" text="Produkcija %n, „%t“"/>
+<l:template name="qandadiv" text="Klaus. ir Ats. %n, „%t“"/>
+<l:template name="refsect1" text="skyrius pavadinimu „%t“"/>
+<l:template name="refsect2" text="skyrius pavadinimu „%t“"/>
+<l:template name="refsect3" text="skyrius pavadinimu „%t“"/>
+<l:template name="refsection" text="skyrius pavadinimu „%t“"/>
+<l:template name="sect1" text="Skyrius %n, „%t“"/>
+<l:template name="sect2" text="Skyrius %n, „%t“"/>
+<l:template name="sect3" text="Skyrius %n, „%t“"/>
+<l:template name="sect4" text="Skyrius %n, „%t“"/>
+<l:template name="sect5" text="Skyrius %n, „%t“"/>
+<l:template name="section" text="Skyrius %n, „%t“"/>
+<l:template name="simplesect" text="skyrius pavadinimu „%t“"/>
+<l:template name="table" text="Lentelė %n, „%t“"/>
+</l:context>
+<l:context name="authorgroup"><l:template name="sep" text=", "/>
+<l:template name="sep2" text=" ir "/>
+<l:template name="seplast" text=", ir "/>
+</l:context>
+<l:context name="glossary"><l:template name="see" text="Žr. %t."/>
+<l:template name="seealso" text="Taip pat žr. %t."/>
+<l:template name="seealso-separator" text=", "/>
+</l:context>
+<l:context name="msgset"><l:template name="MsgAud" text="Auditorija: "/>
+<l:template name="MsgLevel" text="Lygmuo: "/>
+<l:template name="MsgOrig" text="KilmÄ—: "/>
+</l:context>
+<l:context name="datetime"><l:template name="format" text="Y-m-d"/>
+</l:context>
+<l:context name="termdef"><l:template name="prefix" text="[Apibrėžimas: "/>
+<l:template name="suffix" text="]"/>
+</l:context>
+<l:context name="datetime-full"><l:template name="January" text="Sausis"/>
+<l:template name="February" text="Vasaris"/>
+<l:template name="March" text="Kovas"/>
+<l:template name="April" text="Balandis"/>
+<l:template name="May" text="Gegužė"/>
+<l:template name="June" text="Birželis"/>
+<l:template name="July" text="Liepa"/>
+<l:template name="August" text="Rugpjūtis"/>
+<l:template name="September" text="RugsÄ—jis"/>
+<l:template name="October" text="Spalis"/>
+<l:template name="November" text="Lapkritis"/>
+<l:template name="December" text="Gruodis"/>
+<l:template name="Monday" text="Pirmadienis"/>
+<l:template name="Tuesday" text="Antradienis"/>
+<l:template name="Wednesday" text="TreÄiadienis"/>
+<l:template name="Thursday" text="Ketvirtadienis"/>
+<l:template name="Friday" text="Penktadienis"/>
+<l:template name="Saturday" text="Šeštadienis"/>
+<l:template name="Sunday" text="Sekmadienis"/>
+</l:context>
+<l:context name="datetime-abbrev"><l:template name="Jan" text="Sau"/>
+<l:template name="Feb" text="Vas"/>
+<l:template name="Mar" text="Kov"/>
+<l:template name="Apr" text="Bal"/>
+<l:template name="May" text="Geg"/>
+<l:template name="Jun" text="Bir"/>
+<l:template name="Jul" text="Lie"/>
+<l:template name="Aug" text="Rugp"/>
+<l:template name="Sep" text="Rugs"/>
+<l:template name="Oct" text="Spa"/>
+<l:template name="Nov" text="Lap"/>
+<l:template name="Dec" text="Gru"/>
+<l:template name="Mon" text="Pr"/>
+<l:template name="Tue" text="An"/>
+<l:template name="Wed" text="Tr"/>
+<l:template name="Thu" text="Kt"/>
+<l:template name="Fri" text="Pn"/>
+<l:template name="Sat" text="Å t"/>
+<l:template name="Sun" text="Sk"/>
+</l:context>
+<l:context name="htmlhelp"><l:template name="langcode" text="0x0427 Lithuanian"/>
+</l:context>
+<l:context name="index"><l:template name="term-separator" text=", "/>
+<l:template name="number-separator" text=", "/>
+<l:template name="range-separator" text="-"/>
+</l:context>
+<l:context name="iso690"><l:template name="lastfirst.sep" text=", " lang="en"/>
+<l:template name="alt.person.two.sep" text=" – " lang="en"/>
+<l:template name="alt.person.last.sep" text=" – " lang="en"/>
+<l:template name="alt.person.more.sep" text=" – " lang="en"/>
+<l:template name="primary.editor" text=" (ed.)" lang="en"/>
+<l:template name="primary.many" text=", et al." lang="en"/>
+<l:template name="primary.sep" text=". " lang="en"/>
+<l:template name="submaintitle.sep" text=": " lang="en"/>
+<l:template name="title.sep" text=". " lang="en"/>
+<l:template name="othertitle.sep" text=", " lang="en"/>
+<l:template name="medium1" text=" [" lang="en"/>
+<l:template name="medium2" text="]" lang="en"/>
+<l:template name="secondary.person.sep" text="; " lang="en"/>
+<l:template name="secondary.sep" text=". " lang="en"/>
+<l:template name="respons.sep" text=". " lang="en"/>
+<l:template name="edition.sep" text=". " lang="en"/>
+<l:template name="edition.serial.sep" text=", " lang="en"/>
+<l:template name="issuing.range" text="-" lang="en"/>
+<l:template name="issuing.div" text=", " lang="en"/>
+<l:template name="issuing.sep" text=". " lang="en"/>
+<l:template name="partnr.sep" text=". " lang="en"/>
+<l:template name="placepubl.sep" text=": " lang="en"/>
+<l:template name="publyear.sep" text=", " lang="en"/>
+<l:template name="pubinfo.sep" text=". " lang="en"/>
+<l:template name="spec.pubinfo.sep" text=", " lang="en"/>
+<l:template name="upd.sep" text=", " lang="en"/>
+<l:template name="datecit1" text=" [cited " lang="en"/>
+<l:template name="datecit2" text="]" lang="en"/>
+<l:template name="extent.sep" text=". " lang="en"/>
+<l:template name="locs.sep" text=", " lang="en"/>
+<l:template name="location.sep" text=". " lang="en"/>
+<l:template name="serie.sep" text=". " lang="en"/>
+<l:template name="notice.sep" text=". " lang="en"/>
+<l:template name="access" text="Available " lang="en"/>
+<l:template name="acctoo" text="Also available " lang="en"/>
+<l:template name="onwww" text="from World Wide Web" lang="en"/>
+<l:template name="oninet" text="from Internet" lang="en"/>
+<l:template name="access.end" text=": " lang="en"/>
+<l:template name="link1" text="&lt;" lang="en"/>
+<l:template name="link2" text="&gt;" lang="en"/>
+<l:template name="access.sep" text=". " lang="en"/>
+<l:template name="isbn" text="ISBN " lang="en"/>
+<l:template name="issn" text="ISSN " lang="en"/>
+<l:template name="stdnum.sep" text=". " lang="en"/>
+<l:template name="patcountry.sep" text=". " lang="en"/>
+<l:template name="pattype.sep" text=", " lang="en"/>
+<l:template name="patnum.sep" text=". " lang="en"/>
+<l:template name="patdate.sep" text=". " lang="en"/>
+</l:context><l:letters><l:l i="-1"/>
+<l:l i="0">Simboliai</l:l>
+<l:l i="1">A</l:l>
+<l:l i="1">a</l:l>
+<l:l i="1">Ä„</l:l>
+<l:l i="1">Ä…</l:l>
+<l:l i="2">B</l:l>
+<l:l i="2">b</l:l>
+<l:l i="3">C</l:l>
+<l:l i="3">c</l:l>
+<l:l i="3">Č</l:l>
+<l:l i="3">Ä</l:l>
+<l:l i="4">D</l:l>
+<l:l i="4">d</l:l>
+<l:l i="5">E</l:l>
+<l:l i="5">e</l:l>
+<l:l i="5">Ę</l:l>
+<l:l i="5">Ä™</l:l>
+<l:l i="5">Ä–</l:l>
+<l:l i="5">Ä—</l:l>
+<l:l i="6">F</l:l>
+<l:l i="6">f</l:l>
+<l:l i="7">G</l:l>
+<l:l i="7">g</l:l>
+<l:l i="8">H</l:l>
+<l:l i="8">h</l:l>
+<l:l i="9">I</l:l>
+<l:l i="9">i</l:l>
+<l:l i="9">Ä®</l:l>
+<l:l i="9">į</l:l>
+<l:l i="10">Y</l:l>
+<l:l i="10">y</l:l>
+<l:l i="11">J</l:l>
+<l:l i="11">j</l:l>
+<l:l i="12">K</l:l>
+<l:l i="12">k</l:l>
+<l:l i="13">L</l:l>
+<l:l i="13">l</l:l>
+<l:l i="14">M</l:l>
+<l:l i="14">m</l:l>
+<l:l i="15">N</l:l>
+<l:l i="15">n</l:l>
+<l:l i="16">O</l:l>
+<l:l i="16">o</l:l>
+<l:l i="17">P</l:l>
+<l:l i="17">p</l:l>
+<l:l i="18">R</l:l>
+<l:l i="18">r</l:l>
+<l:l i="19">S</l:l>
+<l:l i="19">s</l:l>
+<l:l i="19">Å </l:l>
+<l:l i="19">Å¡</l:l>
+<l:l i="20">T</l:l>
+<l:l i="20">t</l:l>
+<l:l i="21">U</l:l>
+<l:l i="21">u</l:l>
+<l:l i="21">Ų</l:l>
+<l:l i="21">ų</l:l>
+<l:l i="21">Ū</l:l>
+<l:l i="21">Å«</l:l>
+<l:l i="22">V</l:l>
+<l:l i="22">v</l:l>
+<l:l i="23">Z</l:l>
+<l:l i="23">z</l:l>
+<l:l i="23">Ž</l:l>
+<l:l i="23">ž</l:l>
+<l:l i="24">Q</l:l>
+<l:l i="24">q</l:l>
+<l:l i="25">W</l:l>
+<l:l i="25">w</l:l>
+<l:l i="26">X</l:l>
+<l:l i="26">x</l:l>
+</l:letters>
+</l:l10n>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/lv.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/lv.xml
new file mode 100644
index 0000000..ce6ba49
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/lv.xml
@@ -0,0 +1,1229 @@
+<?xml version="1.0" encoding="utf-8"?>
+<l:l10n xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0" language="lv" english-language-name="Latvian">
+
+<!-- * This file is generated automatically. -->
+<!-- * To submit changes to this file upstream (to the DocBook Project) -->
+<!-- * do not submit an edited version of this file. Instead, submit an -->
+<!-- * edited version of the source file at the following location: -->
+<!-- * -->
+<!-- * https://docbook.svn.sourceforge.net/svnroot/docbook/trunk/gentext/locale/lv.xml -->
+<!-- * -->
+<!-- * E-mail the edited lv.xml source file to: -->
+<!-- * -->
+<!-- * docbook-developers@lists.sourceforge.net -->
+
+<!-- ******************************************************************** -->
+
+<!-- This file is part of the XSL DocBook Stylesheet distribution. -->
+<!-- See ../README or http://docbook.sf.net/release/xsl/current/ for -->
+<!-- copyright and other information. -->
+
+<!-- ******************************************************************** -->
+<!-- In these files, % with a letter is used for a placeholder: -->
+<!-- %t is the current element's title -->
+<!-- %s is the current element's subtitle (if applicable)-->
+<!-- %n is the current element's number label-->
+<!-- %p is the current element's page number (if applicable)-->
+<!-- ******************************************************************** -->
+
+
+<l:gentext key="Abstract" text="AnotÄcija"/>
+<l:gentext key="abstract" text="anotÄcija"/>
+<l:gentext key="Acknowledgements" text="Acknowledgements" lang="en"/>
+<l:gentext key="acknowledgements" text="Acknowledgements" lang="en"/>
+<l:gentext key="Answer" text="A:"/>
+<l:gentext key="answer" text="a:"/>
+<l:gentext key="Appendix" text="Pielikums"/>
+<l:gentext key="appendix" text="pielikums"/>
+<l:gentext key="Article" text="Raksts"/>
+<l:gentext key="article" text="raksts"/>
+<l:gentext key="Author" text="Autors"/>
+<l:gentext key="Bibliography" text="BibliogrÄfija"/>
+<l:gentext key="bibliography" text="bibliogrÄfija"/>
+<l:gentext key="Book" text="GrÄmata"/>
+<l:gentext key="book" text="grÄmata"/>
+<l:gentext key="CAUTION" text="UZMANĪBU"/>
+<l:gentext key="Caution" text="Uzmanību"/>
+<l:gentext key="caution" text="uzmanību"/>
+<l:gentext key="Chapter" text="Nodaļa"/>
+<l:gentext key="chapter" text="nodaļa"/>
+<l:gentext key="Colophon" text="PÄ“cvÄrds"/>
+<l:gentext key="colophon" text="pÄ“cvÄrds"/>
+<l:gentext key="Copyright" text="Autortiesības"/>
+<l:gentext key="copyright" text="autortiesības"/>
+<l:gentext key="Dedication" text="Veltījums"/>
+<l:gentext key="dedication" text="veltījums"/>
+<l:gentext key="Edition" text="Izdevums"/>
+<l:gentext key="edition" text="izdevums"/>
+<l:gentext key="Editor" text="Redaktors"/>
+<l:gentext key="Equation" text="VienÄdojums"/>
+<l:gentext key="equation" text="vienÄdojums"/>
+<l:gentext key="Example" text="Piemērs"/>
+<l:gentext key="example" text="piemērs"/>
+<l:gentext key="Figure" text="IlustrÄcija"/>
+<l:gentext key="figure" text="ilustrÄcija"/>
+<l:gentext key="Glossary" text="GlosÄrijs"/>
+<l:gentext key="glossary" text="glosÄrijs"/>
+<l:gentext key="GlossSee" text="Skatīties"/>
+<l:gentext key="glosssee" text="skatīties"/>
+<l:gentext key="GlossSeeAlso" text="Skatīt arī"/>
+<l:gentext key="glossseealso" text="skatīt arī"/>
+<l:gentext key="IMPORTANT" text="SVARĪGI"/>
+<l:gentext key="important" text="svarīgi"/>
+<l:gentext key="Important" text="svarīgs"/>
+<l:gentext key="Index" text="Indekss"/>
+<l:gentext key="index" text="indekss"/>
+<l:gentext key="ISBN" text="ISBN"/>
+<l:gentext key="isbn" text="ISBN"/>
+<l:gentext key="LegalNotice" text="Autortiesības"/>
+<l:gentext key="legalnotice" text="autortiesības"/>
+<l:gentext key="MsgAud" text="Auditorija"/>
+<l:gentext key="msgaud" text="auditorija"/>
+<l:gentext key="MsgLevel" text="Ziņ.līmenis"/>
+<l:gentext key="msglevel" text="ziņ.līmenis"/>
+<l:gentext key="MsgOrig" text="Ziņ.izcelsme"/>
+<l:gentext key="msgorig" text="Ziņ.izcelsme"/>
+<l:gentext key="NOTE" text="PIEZĪME"/>
+<l:gentext key="Note" text="Piezīme"/>
+<l:gentext key="note" text="piezīme"/>
+<l:gentext key="Part" text="Daļa"/>
+<l:gentext key="part" text="daļa"/>
+<l:gentext key="Preface" text="Ievads"/>
+<l:gentext key="preface" text="ievads"/>
+<l:gentext key="Procedure" text="Procedūra"/>
+<l:gentext key="procedure" text="Procedūra"/>
+<l:gentext key="ProductionSet" text="Produkta"/>
+<l:gentext key="PubDate" text="Izdošanas datums"/>
+<l:gentext key="pubdate" text="Izdošanas datums"/>
+<l:gentext key="Published" text="Izdots"/>
+<l:gentext key="published" text="izdots"/>
+<l:gentext key="Publisher" text="Izdevējs"/>
+<l:gentext key="Qandadiv" text="J un A"/>
+<l:gentext key="qandadiv" text="J un A"/>
+<l:gentext key="QandASet" text="Bieži uzdotie jautÄjumi"/>
+<l:gentext key="Question" text="J:"/>
+<l:gentext key="question" text="J:"/>
+<l:gentext key="RefEntry" text=""/>
+<l:gentext key="refentry" text=""/>
+<l:gentext key="Reference" text="Atsauce"/>
+<l:gentext key="reference" text="atsauce"/>
+<l:gentext key="References" text="NorÄdes"/>
+<l:gentext key="RefName" text="Nosaukums"/>
+<l:gentext key="refname" text="nosaukums"/>
+<l:gentext key="RefSection" text=""/>
+<l:gentext key="refsection" text=""/>
+<l:gentext key="RefSynopsisDiv" text="Sinopse"/>
+<l:gentext key="refsynopsisdiv" text="sinopse"/>
+<l:gentext key="RevHistory" text="Izmaiņu vēsture"/>
+<l:gentext key="revhistory" text="izmaiņu vēsture"/>
+<l:gentext key="revision" text="versija"/>
+<l:gentext key="Revision" text="Versija"/>
+<l:gentext key="sect1" text="Sadaļa"/>
+<l:gentext key="sect2" text="Sadaļa"/>
+<l:gentext key="sect3" text="Sadaļa"/>
+<l:gentext key="sect4" text="Sadaļa"/>
+<l:gentext key="sect5" text="Sadaļa"/>
+<l:gentext key="section" text="sadaļa"/>
+<l:gentext key="Section" text="Sadaļa"/>
+<l:gentext key="see" text="skatīt"/>
+<l:gentext key="See" text="Skatīt"/>
+<l:gentext key="seealso" text="skatīt arī"/>
+<l:gentext key="Seealso" text="skatīt arī"/>
+<l:gentext key="SeeAlso" text="Skatīt arī"/>
+<l:gentext key="set" text="Kolekcija"/>
+<l:gentext key="Set" text="Kolekcija"/>
+<l:gentext key="setindex" text="kolekcijas indekss"/>
+<l:gentext key="SetIndex" text="Kolekcijas indekss"/>
+<l:gentext key="Sidebar" text="AtkÄpe"/>
+<l:gentext key="sidebar" text="atkÄpe"/>
+<l:gentext key="step" text="solis"/>
+<l:gentext key="Step" text="Solis"/>
+<l:gentext key="table" text="Tabula"/>
+<l:gentext key="Table" text="Tabula"/>
+<l:gentext key="task" text="Uzdevums"/>
+<l:gentext key="Task" text="Uzdevums"/>
+<l:gentext key="tip" text="Ieteikums"/>
+<l:gentext key="TIP" text="IETEIKUMS"/>
+<l:gentext key="Tip" text="Ieteikums"/>
+<l:gentext key="Warning" text="BrÄ«dinÄjums"/>
+<l:gentext key="warning" text="brÄ«dinÄjums"/>
+<l:gentext key="WARNING" text="BRĪDINĀJUMS"/>
+<l:gentext key="and" text="un"/>
+<l:gentext key="by" text=""/>
+<l:gentext key="Edited" text="Rediģēts"/>
+<l:gentext key="edited" text="rediģēts"/>
+<l:gentext key="Editedby" text="Rediģējis"/>
+<l:gentext key="editedby" text="rediģējis"/>
+<l:gentext key="in" text="iekš"/>
+<l:gentext key="lastlistcomma" text=","/>
+<l:gentext key="listcomma" text=","/>
+<l:gentext key="notes" text="piezīmes"/>
+<l:gentext key="Notes" text="Piezīmes"/>
+<l:gentext key="Pgs" text="Lpp."/>
+<l:gentext key="pgs" text="lpp."/>
+<l:gentext key="Revisedby" text="PÄrskatÄ«jis: "/>
+<l:gentext key="revisedby" text="PÄrskatÄ«jis: "/>
+<l:gentext key="TableNotes" text="Piezīmes"/>
+<l:gentext key="tablenotes" text="piezīmes"/>
+<l:gentext key="TableofContents" text="Saturs "/>
+<l:gentext key="tableofcontents" text="saturs"/>
+<l:gentext key="unexpectedelementname" text="Negaidīts elementa nosaukums"/>
+<l:gentext key="unsupported" text="neatbalstīts"/>
+<l:gentext key="xrefto" text="saite uz"/>
+<l:gentext key="Authors" text="Autori"/>
+<l:gentext key="copyeditor" text="Kopijas redaktors"/>
+<l:gentext key="graphicdesigner" text="Grafikas dizaineris"/>
+<l:gentext key="productioneditor" text="Produkta redaktors"/>
+<l:gentext key="technicaleditor" text="Tehniskais redaktors"/>
+<l:gentext key="translator" text="Tulks"/>
+<l:gentext key="listofequations" text="vienÄdojumu saraksts"/>
+<l:gentext key="ListofEquations" text="VienÄdojumu saraksts"/>
+<l:gentext key="ListofExamples" text="Piemēru saraksts"/>
+<l:gentext key="listofexamples" text="piemēru saraksts"/>
+<l:gentext key="ListofFigures" text="IlustrÄciju saraksts"/>
+<l:gentext key="listoffigures" text="ilustrÄciju saraksts"/>
+<l:gentext key="ListofProcedures" text="Procesu saraksts"/>
+<l:gentext key="listofprocedures" text="procesu saraksts"/>
+<l:gentext key="listoftables" text="tabulu saraksts"/>
+<l:gentext key="ListofTables" text="Tabulu saraksts"/>
+<l:gentext key="ListofUnknown" text="NezinÄmo saraksts"/>
+<l:gentext key="listofunknown" text="NezinÄmo saraksts"/>
+<l:gentext key="nav-home" text="SÄkums"/>
+<l:gentext key="nav-next" text="NÄkamais"/>
+<l:gentext key="nav-next-sibling" text="Ātri uz priekšu"/>
+<l:gentext key="nav-prev" text="Priekšskatījums"/>
+<l:gentext key="nav-prev-sibling" text="Ātri atpakaļ"/>
+<l:gentext key="nav-up" text="Uz augšu"/>
+<l:gentext key="nav-toc" text="Saturs"/>
+<l:gentext key="Draft" text="Uzmetums"/>
+<l:gentext key="above" text="virs"/>
+<l:gentext key="below" text="zem"/>
+<l:gentext key="sectioncalled" text="sadaļa ar nosaukumu"/>
+<l:gentext key="index symbols" text="Simboli"/>
+<l:gentext key="writing-mode" text="lr-tb"/>
+<l:gentext key="lowercase.alpha" text="aÄbcÄdeÄ“fgÄ£hiÄ«jkÄ·lļmnņoprsÅ¡tuÅ«vzž"/>
+<l:gentext key="uppercase.alpha" text="AĀBCČDEĒFGĢHIĪJKĶLĻMNŅOPRSŠTUŪVZŽ"/>
+<l:gentext key="normalize.sort.input" text="AaÀàÃáÂâÃãÄäÅåĀÄĂ㥹ÇǎǞǟǠǡǺǻȀÈȂȃȦȧḀá¸áºšáº áº¡áº¢áº£áº¤áº¥áº¦áº§áº¨áº©áºªáº«áº¬áº­áº®áº¯áº°áº±áº²áº³áº´áºµáº¶áº·BbÆ€ÆɓƂƃḂḃḄḅḆḇCcÇçĆćĈĉĊċČÄƇƈɕḈḉDdÄŽÄÄđƊɗƋƌDžDzȡɖḊḋḌá¸á¸Žá¸á¸á¸‘ḒḓEeÈèÉéÊêËëĒēĔĕĖėĘęĚěȄȅȆȇȨȩḔḕḖḗḘḙḚḛḜá¸áº¸áº¹áººáº»áº¼áº½áº¾áº¿á»€á»á»‚ểỄễỆệFfƑƒḞḟGgÄœÄĞğĠġĢģƓɠǤǥǦǧǴǵḠḡHhĤĥĦħȞȟɦḢḣḤḥḦḧḨḩḪḫẖIiÌìÃíÎîÃïĨĩĪīĬĭĮįİƗɨÇÇȈȉȊȋḬḭḮḯỈỉỊịJjĴĵǰÊKkĶķƘƙǨǩḰḱḲḳḴḵLlĹĺĻļĽľĿŀÅłƚLjȴɫɬɭḶḷḸḹḺḻḼḽMmɱḾḿṀá¹á¹‚ṃNnÑñŃńŅņŇňÆɲƞȠNjǸǹȵɳṄṅṆṇṈṉṊṋOoÒòÓóÔôÕõÖöØøŌÅÅŽÅÅőƟƠơǑǒǪǫǬǭǾǿȌÈÈŽÈȪȫȬȭȮȯȰȱṌá¹á¹Žá¹á¹á¹‘ṒṓỌá»á»Žá»á»á»‘ỒồỔổỖỗỘộỚớỜá»á»žá»Ÿá» á»¡á»¢á»£PpƤƥṔṕṖṗQqÊ RrŔŕŖŗŘřÈȑȒȓɼɽɾṘṙṚṛṜá¹á¹žá¹ŸSsŚśŜÅŞşŠšȘșʂṠṡṢṣṤṥṦṧṨṩTtŢţŤťŦŧƫƬƭƮʈȚțȶṪṫṬṭṮṯṰṱẗUuÙùÚúÛûÜüŨũŪūŬŭŮůŰűŲųƯưǓǔǕǖǗǘǙǚǛǜȔȕȖȗṲṳṴṵṶṷṸṹṺṻỤụỦủỨứỪừỬửỮữỰựVvƲʋṼṽṾṿWwŴŵẀáºáº‚ẃẄẅẆẇẈẉẘXxẊẋẌáºYyÃýÿŸŶŷƳƴȲȳẎáºáº™á»²á»³á»´á»µá»¶á»·á»¸á»¹ZzŹźŻżŽžƵƶȤȥÊÊ‘áºáº‘ẒẓẔẕẕ"/>
+<l:gentext key="normalize.sort.output" text="AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBCCCCCCCCCCCCCCCCCDDDDDDDDDDDDDDDDDDDDDDDDEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEFFFFFFGGGGGGGGGGGGGGGGGGGGHHHHHHHHHHHHHHHHHHHHIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIJJJJJJKKKKKKKKKKKKKKLLLLLLLLLLLLLLLLLLLLLLLLLLMMMMMMMMMNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOPPPPPPPPQQQRRRRRRRRRRRRRRRRRRRRRRRSSSSSSSSSSSSSSSSSSSSSSSTTTTTTTTTTTTTTTTTTTTTTTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUVVVVVVVVWWWWWWWWWWWWWWWXXXXXXYYYYYYYYYYYYYYYYYYYYYYYZZZZZZZZZZZZZZZZZZZZZ"/>
+<l:dingbat key="startquote" text="“"/>
+<l:dingbat key="endquote" text="â€"/>
+<l:dingbat key="nestedstartquote" text="‘"/>
+<l:dingbat key="nestedendquote" text="’"/>
+<l:dingbat key="singlestartquote" text="‘"/>
+<l:dingbat key="singleendquote" text="’"/>
+<l:dingbat key="bullet" text="•"/>
+<l:gentext key="hyphenation-character" text="-"/>
+<l:gentext key="hyphenation-push-character-count" text="2"/>
+<l:gentext key="hyphenation-remain-character-count" text="2"/>
+<l:context name="styles"><l:template name="person-name" text="first-last"/>
+</l:context>
+<l:context name="title"><l:template name="abstract" text="%t"/>
+<l:template name="acknowledgements" text="%t" lang="en"/>
+<l:template name="answer" text="%t"/>
+<l:template name="appendix" text="Pielikums %n. %t"/>
+<l:template name="article" text="%t"/>
+<l:template name="authorblurb" text="%t"/>
+<l:template name="bibliodiv" text="%t"/>
+<l:template name="biblioentry" text="%t"/>
+<l:template name="bibliography" text="%t"/>
+<l:template name="bibliolist" text="%t"/>
+<l:template name="bibliomixed" text="%t"/>
+<l:template name="bibliomset" text="%t"/>
+<l:template name="biblioset" text="%t"/>
+<l:template name="blockquote" text="%t"/>
+<l:template name="book" text="%t"/>
+<l:template name="calloutlist" text="%t"/>
+<l:template name="caution" text="%t"/>
+<l:template name="chapter" text="Nodaļa %n. %t"/>
+<l:template name="colophon" text="%t"/>
+<l:template name="dedication" text="%t"/>
+<l:template name="equation" text="VienÄdojums %n. %t"/>
+<l:template name="example" text="Piemērs %n. %t"/>
+<l:template name="figure" text="IlustrÄcija %n. %t"/>
+<l:template name="foil" text="%t"/>
+<l:template name="foilgroup" text="%t"/>
+<l:template name="formalpara" text="%t"/>
+<l:template name="glossary" text="%t"/>
+<l:template name="glossdiv" text="%t"/>
+<l:template name="glosslist" text="%t"/>
+<l:template name="glossentry" text="%t"/>
+<l:template name="important" text="%t"/>
+<l:template name="index" text="%t"/>
+<l:template name="indexdiv" text="%t"/>
+<l:template name="itemizedlist" text="%t"/>
+<l:template name="legalnotice" text="%t"/>
+<l:template name="listitem" text=""/>
+<l:template name="lot" text="%t"/>
+<l:template name="msg" text="%t"/>
+<l:template name="msgexplan" text="%t"/>
+<l:template name="msgmain" text="%t"/>
+<l:template name="msgrel" text="%t"/>
+<l:template name="msgset" text="%t"/>
+<l:template name="msgsub" text="%t"/>
+<l:template name="note" text="%t"/>
+<l:template name="orderedlist" text="%t"/>
+<l:template name="part" text="Daļa %n. %t"/>
+<l:template name="partintro" text="%t"/>
+<l:template name="preface" text="%t"/>
+<l:template name="procedure" text="%t"/>
+<l:template name="procedure.formal" text="Procedūra %n. %t"/>
+<l:template name="productionset" text="%t"/>
+<l:template name="productionset.formal" text="Produkta %n"/>
+<l:template name="qandadiv" text="%t"/>
+<l:template name="qandaentry" text="%t"/>
+<l:template name="qandaset" text="%t"/>
+<l:template name="question" text="%t"/>
+<l:template name="refentry" text="%t"/>
+<l:template name="reference" text="%t"/>
+<l:template name="refsection" text="%t"/>
+<l:template name="refsect1" text="%t"/>
+<l:template name="refsect2" text="%t"/>
+<l:template name="refsect3" text="%t"/>
+<l:template name="refsynopsisdiv" text="%t"/>
+<l:template name="refsynopsisdivinfo" text="%t"/>
+<l:template name="segmentedlist" text="%t"/>
+<l:template name="set" text="%t"/>
+<l:template name="setindex" text="%t"/>
+<l:template name="sidebar" text="%t"/>
+<l:template name="step" text="%t"/>
+<l:template name="table" text="Tabula %n. %t"/>
+<l:template name="task" text="%t"/>
+<l:template name="tasksummary" text="%t"/>
+<l:template name="taskprerequisites" text="%t"/>
+<l:template name="taskrelated" text="%t"/>
+<l:template name="tip" text="%t"/>
+<l:template name="toc" text="%t"/>
+<l:template name="variablelist" text="%t"/>
+<l:template name="varlistentry" text=""/>
+<l:template name="warning" text="%t"/>
+</l:context>
+<l:context name="title-unnumbered"><l:template name="appendix" text="%t"/>
+<l:template name="article/appendix" text="%t"/>
+<l:template name="bridgehead" text="%t"/>
+<l:template name="chapter" text="%t"/>
+<l:template name="sect1" text="%t"/>
+<l:template name="sect2" text="%t"/>
+<l:template name="sect3" text="%t"/>
+<l:template name="sect4" text="%t"/>
+<l:template name="sect5" text="%t"/>
+<l:template name="section" text="%t"/>
+<l:template name="simplesect" text="%t"/>
+<l:template name="part" text="%t"/>
+</l:context>
+<l:context name="title-numbered"><l:template name="appendix" text="Pielikums %n. %t"/>
+<l:template name="article/appendix" text="%n. %t"/>
+<l:template name="bridgehead" text="%n. %t"/>
+<l:template name="chapter" text="Nodaļa %n. %t"/>
+<l:template name="part" text="Daļa %n. %t"/>
+<l:template name="sect1" text="%n. %t"/>
+<l:template name="sect2" text="%n. %t"/>
+<l:template name="sect3" text="%n. %t"/>
+<l:template name="sect4" text="%n. %t"/>
+<l:template name="sect5" text="%n. %t"/>
+<l:template name="section" text="%n. %t"/>
+<l:template name="simplesect" text="%t"/>
+</l:context>
+<l:context name="subtitle"><l:template name="appendix" text="%s"/>
+<l:template name="acknowledgements" text="%s" lang="en"/>
+<l:template name="article" text="%s"/>
+<l:template name="bibliodiv" text="%s"/>
+<l:template name="biblioentry" text="%s"/>
+<l:template name="bibliography" text="%s"/>
+<l:template name="bibliomixed" text="%s"/>
+<l:template name="bibliomset" text="%s"/>
+<l:template name="biblioset" text="%s"/>
+<l:template name="book" text="%s"/>
+<l:template name="chapter" text="%s"/>
+<l:template name="colophon" text="%s"/>
+<l:template name="dedication" text="%s"/>
+<l:template name="glossary" text="%s"/>
+<l:template name="glossdiv" text="%s"/>
+<l:template name="index" text="%s"/>
+<l:template name="indexdiv" text="%s"/>
+<l:template name="lot" text="%s"/>
+<l:template name="part" text="%s"/>
+<l:template name="partintro" text="%s"/>
+<l:template name="preface" text="%s"/>
+<l:template name="refentry" text="%s"/>
+<l:template name="reference" text="%s"/>
+<l:template name="refsection" text="%s"/>
+<l:template name="refsect1" text="%s"/>
+<l:template name="refsect2" text="%s"/>
+<l:template name="refsect3" text="%s"/>
+<l:template name="refsynopsisdiv" text="%s"/>
+<l:template name="sect1" text="%s"/>
+<l:template name="sect2" text="%s"/>
+<l:template name="sect3" text="%s"/>
+<l:template name="sect4" text="%s"/>
+<l:template name="sect5" text="%s"/>
+<l:template name="section" text="%s"/>
+<l:template name="set" text="%s"/>
+<l:template name="setindex" text="%s"/>
+<l:template name="sidebar" text="%s"/>
+<l:template name="simplesect" text="%s"/>
+<l:template name="toc" text="%s"/>
+</l:context>
+<l:context name="xref"><l:template name="abstract" text="%t"/>
+<l:template name="acknowledgements" text="%t" lang="en"/>
+<l:template name="answer" text="A: %n"/>
+<l:template name="appendix" text="%t"/>
+<l:template name="article" text="%t"/>
+<l:template name="authorblurb" text="%t"/>
+<l:template name="bibliodiv" text="%t"/>
+<l:template name="bibliography" text="%t"/>
+<l:template name="bibliomset" text="%t"/>
+<l:template name="biblioset" text="%t"/>
+<l:template name="blockquote" text="%t"/>
+<l:template name="book" text="%t"/>
+<l:template name="calloutlist" text="%t"/>
+<l:template name="caution" text="%t"/>
+<l:template name="chapter" text="%t"/>
+<l:template name="colophon" text="%t"/>
+<l:template name="constraintdef" text="%t"/>
+<l:template name="dedication" text="%t"/>
+<l:template name="equation" text="%t"/>
+<l:template name="example" text="%t"/>
+<l:template name="figure" text="%t"/>
+<l:template name="foil" text="%t"/>
+<l:template name="foilgroup" text="%t"/>
+<l:template name="formalpara" text="%t"/>
+<l:template name="glossary" text="%t"/>
+<l:template name="glossdiv" text="%t"/>
+<l:template name="important" text="%t"/>
+<l:template name="index" text="%t"/>
+<l:template name="indexdiv" text="%t"/>
+<l:template name="itemizedlist" text="%t"/>
+<l:template name="legalnotice" text="%t"/>
+<l:template name="listitem" text="%n"/>
+<l:template name="lot" text="%t"/>
+<l:template name="msg" text="%t"/>
+<l:template name="msgexplan" text="%t"/>
+<l:template name="msgmain" text="%t"/>
+<l:template name="msgrel" text="%t"/>
+<l:template name="msgset" text="%t"/>
+<l:template name="msgsub" text="%t"/>
+<l:template name="note" text="%t"/>
+<l:template name="orderedlist" text="%t"/>
+<l:template name="part" text="%t"/>
+<l:template name="partintro" text="%t"/>
+<l:template name="preface" text="%t"/>
+<l:template name="procedure" text="%t"/>
+<l:template name="productionset" text="%t"/>
+<l:template name="qandadiv" text="%t"/>
+<l:template name="qandaentry" text="J: %n"/>
+<l:template name="qandaset" text="%t"/>
+<l:template name="question" text="J: %n"/>
+<l:template name="reference" text="%t"/>
+<l:template name="refsynopsisdiv" text="%t"/>
+<l:template name="segmentedlist" text="%t"/>
+<l:template name="set" text="%t"/>
+<l:template name="setindex" text="%t"/>
+<l:template name="sidebar" text="%t"/>
+<l:template name="table" text="%t"/>
+<l:template name="task" text="%t"/>
+<l:template name="tip" text="%t"/>
+<l:template name="toc" text="%t"/>
+<l:template name="variablelist" text="%t"/>
+<l:template name="varlistentry" text="%n"/>
+<l:template name="warning" text="%t"/>
+<l:template name="olink.document.citation" text=" (%o)"/>
+<l:template name="olink.page.citation" text=" (lpp. %p)"/>
+<l:template name="page.citation" text=" [%p]"/>
+<l:template name="page" text="(lpp. %p)"/>
+<l:template name="docname" text=" ( %o)"/>
+<l:template name="docnamelong" text=" dokumentÄ ar nosaukumu %o"/>
+<l:template name="pageabbrev" text="(lpp. %p)"/>
+<l:template name="Page" text="Lappuse %p"/>
+<l:template name="bridgehead" text="sadaļa ar nosaukumu “%tâ€"/>
+<l:template name="refsection" text="sadaļa ar nosaukumu “%tâ€"/>
+<l:template name="refsect1" text="sadaļa ar nosaukumu “%tâ€"/>
+<l:template name="refsect2" text="sadaļa ar nosaukumu “%tâ€"/>
+<l:template name="refsect3" text="sadaļa ar nosaukumu “%tâ€"/>
+<l:template name="sect1" text="sadaļa ar nosaukumu “%tâ€"/>
+<l:template name="sect2" text="sadaļa ar nosaukumu “%tâ€"/>
+<l:template name="sect3" text="sadaļa ar nosaukumu “%tâ€"/>
+<l:template name="sect4" text="sadaļa ar nosaukumu “%tâ€"/>
+<l:template name="sect5" text="sadaļa ar nosaukumu “%tâ€"/>
+<l:template name="section" text="sadaļa ar nosaukumu “%tâ€"/>
+<l:template name="simplesect" text="sadaļa ar nosaukumu “%tâ€"/>
+</l:context>
+<l:context name="xref-number"><l:template name="answer" text="A: %n"/>
+<l:template name="appendix" text="Pielikums %n"/>
+<l:template name="bridgehead" text="Sadaļa %n"/>
+<l:template name="chapter" text="Nodaļa %n"/>
+<l:template name="equation" text="VienÄdojums %n"/>
+<l:template name="example" text="Piemērs %n"/>
+<l:template name="figure" text="IlustrÄcija %n"/>
+<l:template name="part" text="Daļa %n"/>
+<l:template name="procedure" text="Procedūra %n"/>
+<l:template name="productionset" text="Produkta %n"/>
+<l:template name="qandadiv" text="J un A %n"/>
+<l:template name="qandaentry" text="J: %n"/>
+<l:template name="question" text="J: %n"/>
+<l:template name="sect1" text="Sadaļa %n"/>
+<l:template name="sect2" text="Sadaļa %n"/>
+<l:template name="sect3" text="Sadaļa %n"/>
+<l:template name="sect4" text="Sadaļa %n"/>
+<l:template name="sect5" text="Sadaļa %n"/>
+<l:template name="section" text="Sadaļa %n"/>
+<l:template name="table" text="Tabula %n"/>
+</l:context>
+<l:context name="xref-number-and-title"><l:template name="appendix" text="Pielikums %n, %t"/>
+<l:template name="bridgehead" text="Sadaļa %n, “%tâ€"/>
+<l:template name="chapter" text="Nodaļa %n, %t"/>
+<l:template name="equation" text="VienÄdojums %n, “%tâ€"/>
+<l:template name="example" text="PiemÄ“rs %n, “%tâ€"/>
+<l:template name="figure" text="IlustrÄcija %n, “%tâ€"/>
+<l:template name="part" text="Daļa %n, “%tâ€"/>
+<l:template name="procedure" text="ProcedÅ«ra %n, “%tâ€"/>
+<l:template name="productionset" text="Produkta %n, “%tâ€"/>
+<l:template name="qandadiv" text="J un A %n, “%tâ€"/>
+<l:template name="refsect1" text="sadaļa ar nosaukumu “%tâ€"/>
+<l:template name="refsect2" text="sadaļa ar nosaukumu “%tâ€"/>
+<l:template name="refsect3" text="sadaļa ar nosaukumu “%tâ€"/>
+<l:template name="refsection" text="sadaļa ar nosaukumu “%tâ€"/>
+<l:template name="sect1" text="Sadaļa %n, “%tâ€"/>
+<l:template name="sect2" text="Sadaļa %n, “%tâ€"/>
+<l:template name="sect3" text="Sadaļa %n, “%tâ€"/>
+<l:template name="sect4" text="Sadaļa %n, “%tâ€"/>
+<l:template name="sect5" text="Sadaļa %n, “%tâ€"/>
+<l:template name="section" text="Sadaļa %n, “%tâ€"/>
+<l:template name="simplesect" text="sadaļa ar nosaukumu “%tâ€"/>
+<l:template name="table" text="Tabula %n, “%tâ€"/>
+</l:context>
+<l:context name="authorgroup"><l:template name="sep" text=", "/>
+<l:template name="sep2" text=" un "/>
+<l:template name="seplast" text=", un "/>
+</l:context>
+<l:context name="glossary"><l:template name="see" text="Skatīties %t."/>
+<l:template name="seealso" text="Skatīt arī %t."/>
+<l:template name="seealso-separator" text=", "/>
+</l:context>
+<l:context name="msgset"><l:template name="MsgAud" text="Auditorija: "/>
+<l:template name="MsgLevel" text="Ziņ.līmenis: "/>
+<l:template name="MsgOrig" text="Ziņ.izcelsme: "/>
+</l:context>
+<l:context name="datetime"><l:template name="format" text="m/d/Y"/>
+</l:context>
+<l:context name="termdef"><l:template name="prefix" text="[Definition: "/>
+<l:template name="suffix" text="]"/>
+</l:context>
+<l:context name="datetime-full"><l:template name="January" text="January" lang="en"/>
+<l:template name="February" text="February" lang="en"/>
+<l:template name="March" text="March" lang="en"/>
+<l:template name="April" text="April" lang="en"/>
+<l:template name="May" text="Maijs"/>
+<l:template name="June" text="JÅ«nijs"/>
+<l:template name="July" text="JÅ«lijs"/>
+<l:template name="August" text="Augusts"/>
+<l:template name="September" text="Septembris"/>
+<l:template name="October" text="Octobris"/>
+<l:template name="November" text="Novembris"/>
+<l:template name="December" text="Decembris"/>
+<l:template name="Monday" text="Pirmdiena"/>
+<l:template name="Tuesday" text="Otrdiena"/>
+<l:template name="Wednesday" text="Trešdiena"/>
+<l:template name="Thursday" text="Ceturtdiena"/>
+<l:template name="Friday" text="Piektdiena"/>
+<l:template name="Saturday" text="Sestdiena"/>
+<l:template name="Sunday" text="Svētdiena"/>
+</l:context>
+<l:context name="datetime-abbrev"><l:template name="Jan" text="Jan"/>
+<l:template name="Feb" text="Feb"/>
+<l:template name="Mar" text="Mar"/>
+<l:template name="Apr" text="Apr"/>
+<l:template name="May" text="Mai"/>
+<l:template name="Jun" text="Jun"/>
+<l:template name="Jul" text="JÅ«l"/>
+<l:template name="Aug" text="Aug"/>
+<l:template name="Sep" text="Sep"/>
+<l:template name="Oct" text="Okt"/>
+<l:template name="Nov" text="Nov"/>
+<l:template name="Dec" text="Dec"/>
+<l:template name="Mon" text="Pr"/>
+<l:template name="Tue" text="Ot"/>
+<l:template name="Wed" text="Tr"/>
+<l:template name="Thu" text="Ce"/>
+<l:template name="Fri" text="Pk"/>
+<l:template name="Sat" text="Se"/>
+<l:template name="Sun" text="Sv"/>
+</l:context>
+<l:context name="htmlhelp"><l:template name="langcode" text="0x0427 Latvian"/>
+</l:context>
+<l:context name="index"><l:template name="term-separator" text=", "/>
+<l:template name="number-separator" text=", "/>
+<l:template name="range-separator" text="-"/>
+</l:context>
+<l:context name="iso690"><l:template name="lastfirst.sep" text=", "/>
+<l:template name="alt.person.two.sep" text=" – "/>
+<l:template name="alt.person.last.sep" text=" – "/>
+<l:template name="alt.person.more.sep" text=" – "/>
+<l:template name="primary.editor" text=" (ed.)"/>
+<l:template name="primary.many" text=", et al."/>
+<l:template name="primary.sep" text=". "/>
+<l:template name="submaintitle.sep" text=": "/>
+<l:template name="title.sep" text=". "/>
+<l:template name="othertitle.sep" text=", "/>
+<l:template name="medium1" text=" ["/>
+<l:template name="medium2" text="]"/>
+<l:template name="secondary.person.sep" text="; "/>
+<l:template name="secondary.sep" text=". "/>
+<l:template name="respons.sep" text=". "/>
+<l:template name="edition.sep" text=". "/>
+<l:template name="edition.serial.sep" text=", "/>
+<l:template name="issuing.range" text="-"/>
+<l:template name="issuing.div" text=", "/>
+<l:template name="issuing.sep" text=". "/>
+<l:template name="partnr.sep" text=". "/>
+<l:template name="placepubl.sep" text=": "/>
+<l:template name="publyear.sep" text=", "/>
+<l:template name="pubinfo.sep" text=". "/>
+<l:template name="spec.pubinfo.sep" text=", "/>
+<l:template name="upd.sep" text=", "/>
+<l:template name="datecit1" text=" [cited "/>
+<l:template name="datecit2" text="]"/>
+<l:template name="extent.sep" text=". "/>
+<l:template name="locs.sep" text=", "/>
+<l:template name="location.sep" text=". "/>
+<l:template name="serie.sep" text=". "/>
+<l:template name="notice.sep" text=". "/>
+<l:template name="access" text="Pieejams "/>
+<l:template name="acctoo" text="Arī pieejams "/>
+<l:template name="onwww" text=" www"/>
+<l:template name="oninet" text="internetÄ"/>
+<l:template name="access.end" text=": "/>
+<l:template name="link1" text="&lt;"/>
+<l:template name="link2" text="&gt;"/>
+<l:template name="access.sep" text=". "/>
+<l:template name="isbn" text="ISBN "/>
+<l:template name="issn" text="ISSN "/>
+<l:template name="stdnum.sep" text=". "/>
+<l:template name="patcountry.sep" text=". "/>
+<l:template name="pattype.sep" text=", "/>
+<l:template name="patnum.sep" text=". "/>
+<l:template name="patdate.sep" text=". "/>
+</l:context><l:letters><l:l i="-1"/>
+<l:l i="0">Symbols</l:l>
+<l:l i="10">A</l:l>
+<l:l i="10">a</l:l>
+<l:l i="10">À</l:l>
+<l:l i="10">à</l:l>
+<l:l i="10">Ã</l:l>
+<l:l i="10">á</l:l>
+<l:l i="10">Â</l:l>
+<l:l i="10">â</l:l>
+<l:l i="10">Ã</l:l>
+<l:l i="10">ã</l:l>
+<l:l i="10">Ä</l:l>
+<l:l i="10">ä</l:l>
+<l:l i="10">Ã…</l:l>
+<l:l i="10">Ã¥</l:l>
+<l:l i="10">Ä€</l:l>
+<l:l i="10">Ä</l:l>
+<l:l i="10">Ä‚</l:l>
+<l:l i="10">ă</l:l>
+<l:l i="10">Ä„</l:l>
+<l:l i="10">Ä…</l:l>
+<l:l i="10">Ç</l:l>
+<l:l i="10">ÇŽ</l:l>
+<l:l i="10">Çž</l:l>
+<l:l i="10">ÇŸ</l:l>
+<l:l i="10">Ç </l:l>
+<l:l i="10">Ç¡</l:l>
+<l:l i="10">Ǻ</l:l>
+<l:l i="10">Ç»</l:l>
+<l:l i="10">È€</l:l>
+<l:l i="10">È</l:l>
+<l:l i="10">È‚</l:l>
+<l:l i="10">ȃ</l:l>
+<l:l i="10">Ȧ</l:l>
+<l:l i="10">ȧ</l:l>
+<l:l i="10">Ḁ</l:l>
+<l:l i="10">á¸</l:l>
+<l:l i="10">ẚ</l:l>
+<l:l i="10">Ạ</l:l>
+<l:l i="10">ạ</l:l>
+<l:l i="10">Ả</l:l>
+<l:l i="10">ả</l:l>
+<l:l i="10">Ấ</l:l>
+<l:l i="10">ấ</l:l>
+<l:l i="10">Ầ</l:l>
+<l:l i="10">ầ</l:l>
+<l:l i="10">Ẩ</l:l>
+<l:l i="10">ẩ</l:l>
+<l:l i="10">Ẫ</l:l>
+<l:l i="10">ẫ</l:l>
+<l:l i="10">Ậ</l:l>
+<l:l i="10">ậ</l:l>
+<l:l i="10">Ắ</l:l>
+<l:l i="10">ắ</l:l>
+<l:l i="10">Ằ</l:l>
+<l:l i="10">ằ</l:l>
+<l:l i="10">Ẳ</l:l>
+<l:l i="10">ẳ</l:l>
+<l:l i="10">Ẵ</l:l>
+<l:l i="10">ẵ</l:l>
+<l:l i="10">Ặ</l:l>
+<l:l i="10">ặ</l:l>
+<l:l i="20">B</l:l>
+<l:l i="20">b</l:l>
+<l:l i="20">Æ€</l:l>
+<l:l i="20">Æ</l:l>
+<l:l i="20">É“</l:l>
+<l:l i="20">Æ‚</l:l>
+<l:l i="20">ƃ</l:l>
+<l:l i="20">Ḃ</l:l>
+<l:l i="20">ḃ</l:l>
+<l:l i="20">Ḅ</l:l>
+<l:l i="20">ḅ</l:l>
+<l:l i="20">Ḇ</l:l>
+<l:l i="20">ḇ</l:l>
+<l:l i="30">C</l:l>
+<l:l i="30">c</l:l>
+<l:l i="30">Ç</l:l>
+<l:l i="30">ç</l:l>
+<l:l i="30">Ć</l:l>
+<l:l i="30">ć</l:l>
+<l:l i="30">Ĉ</l:l>
+<l:l i="30">ĉ</l:l>
+<l:l i="30">ÄŠ</l:l>
+<l:l i="30">Ä‹</l:l>
+<l:l i="30">Č</l:l>
+<l:l i="30">Ä</l:l>
+<l:l i="30">Ƈ</l:l>
+<l:l i="30">ƈ</l:l>
+<l:l i="30">É•</l:l>
+<l:l i="30">Ḉ</l:l>
+<l:l i="30">ḉ</l:l>
+<l:l i="40">D</l:l>
+<l:l i="40">d</l:l>
+<l:l i="40">ÄŽ</l:l>
+<l:l i="40">Ä</l:l>
+<l:l i="40">Ä</l:l>
+<l:l i="40">Ä‘</l:l>
+<l:l i="40">ÆŠ</l:l>
+<l:l i="40">É—</l:l>
+<l:l i="40">Æ‹</l:l>
+<l:l i="40">ƌ</l:l>
+<l:l i="40">Ç…</l:l>
+<l:l i="40">Dz</l:l>
+<l:l i="40">È¡</l:l>
+<l:l i="40">É–</l:l>
+<l:l i="40">Ḋ</l:l>
+<l:l i="40">ḋ</l:l>
+<l:l i="40">Ḍ</l:l>
+<l:l i="40">á¸</l:l>
+<l:l i="40">Ḏ</l:l>
+<l:l i="40">á¸</l:l>
+<l:l i="40">á¸</l:l>
+<l:l i="40">ḑ</l:l>
+<l:l i="40">Ḓ</l:l>
+<l:l i="40">ḓ</l:l>
+<l:l i="50">E</l:l>
+<l:l i="50">e</l:l>
+<l:l i="50">È</l:l>
+<l:l i="50">è</l:l>
+<l:l i="50">É</l:l>
+<l:l i="50">é</l:l>
+<l:l i="50">Ê</l:l>
+<l:l i="50">ê</l:l>
+<l:l i="50">Ë</l:l>
+<l:l i="50">ë</l:l>
+<l:l i="50">Ä’</l:l>
+<l:l i="50">Ä“</l:l>
+<l:l i="50">Ä”</l:l>
+<l:l i="50">Ä•</l:l>
+<l:l i="50">Ä–</l:l>
+<l:l i="50">Ä—</l:l>
+<l:l i="50">Ę</l:l>
+<l:l i="50">Ä™</l:l>
+<l:l i="50">Äš</l:l>
+<l:l i="50">Ä›</l:l>
+<l:l i="50">È„</l:l>
+<l:l i="50">È…</l:l>
+<l:l i="50">Ȇ</l:l>
+<l:l i="50">ȇ</l:l>
+<l:l i="50">Ȩ</l:l>
+<l:l i="50">È©</l:l>
+<l:l i="50">Ḕ</l:l>
+<l:l i="50">ḕ</l:l>
+<l:l i="50">Ḗ</l:l>
+<l:l i="50">ḗ</l:l>
+<l:l i="50">Ḙ</l:l>
+<l:l i="50">ḙ</l:l>
+<l:l i="50">Ḛ</l:l>
+<l:l i="50">ḛ</l:l>
+<l:l i="50">Ḝ</l:l>
+<l:l i="50">á¸</l:l>
+<l:l i="50">Ẹ</l:l>
+<l:l i="50">ẹ</l:l>
+<l:l i="50">Ẻ</l:l>
+<l:l i="50">ẻ</l:l>
+<l:l i="50">Ẽ</l:l>
+<l:l i="50">ẽ</l:l>
+<l:l i="50">Ế</l:l>
+<l:l i="50">ế</l:l>
+<l:l i="50">Ề</l:l>
+<l:l i="50">á»</l:l>
+<l:l i="50">Ể</l:l>
+<l:l i="50">ể</l:l>
+<l:l i="50">Ễ</l:l>
+<l:l i="50">á»…</l:l>
+<l:l i="50">Ệ</l:l>
+<l:l i="50">ệ</l:l>
+<l:l i="60">F</l:l>
+<l:l i="60">f</l:l>
+<l:l i="60">Æ‘</l:l>
+<l:l i="60">Æ’</l:l>
+<l:l i="60">Ḟ</l:l>
+<l:l i="60">ḟ</l:l>
+<l:l i="70">G</l:l>
+<l:l i="70">g</l:l>
+<l:l i="70">Ĝ</l:l>
+<l:l i="70">Ä</l:l>
+<l:l i="70">Äž</l:l>
+<l:l i="70">ÄŸ</l:l>
+<l:l i="70">Ä </l:l>
+<l:l i="70">Ä¡</l:l>
+<l:l i="70">Ä¢</l:l>
+<l:l i="70">Ä£</l:l>
+<l:l i="70">Æ“</l:l>
+<l:l i="70">É </l:l>
+<l:l i="70">Ǥ</l:l>
+<l:l i="70">Ç¥</l:l>
+<l:l i="70">Ǧ</l:l>
+<l:l i="70">ǧ</l:l>
+<l:l i="70">Ç´</l:l>
+<l:l i="70">ǵ</l:l>
+<l:l i="70">Ḡ</l:l>
+<l:l i="70">ḡ</l:l>
+<l:l i="80">H</l:l>
+<l:l i="80">h</l:l>
+<l:l i="80">Ĥ</l:l>
+<l:l i="80">Ä¥</l:l>
+<l:l i="80">Ħ</l:l>
+<l:l i="80">ħ</l:l>
+<l:l i="80">Èž</l:l>
+<l:l i="80">ÈŸ</l:l>
+<l:l i="80">ɦ</l:l>
+<l:l i="80">Ḣ</l:l>
+<l:l i="80">ḣ</l:l>
+<l:l i="80">Ḥ</l:l>
+<l:l i="80">ḥ</l:l>
+<l:l i="80">Ḧ</l:l>
+<l:l i="80">ḧ</l:l>
+<l:l i="80">Ḩ</l:l>
+<l:l i="80">ḩ</l:l>
+<l:l i="80">Ḫ</l:l>
+<l:l i="80">ḫ</l:l>
+<l:l i="80">ẖ</l:l>
+<l:l i="90">I</l:l>
+<l:l i="90">i</l:l>
+<l:l i="90">Ì</l:l>
+<l:l i="90">ì</l:l>
+<l:l i="90">Ã</l:l>
+<l:l i="90">í</l:l>
+<l:l i="90">ÃŽ</l:l>
+<l:l i="90">î</l:l>
+<l:l i="90">Ã</l:l>
+<l:l i="90">ï</l:l>
+<l:l i="90">Ĩ</l:l>
+<l:l i="90">Ä©</l:l>
+<l:l i="90">Ī</l:l>
+<l:l i="90">Ä«</l:l>
+<l:l i="90">Ĭ</l:l>
+<l:l i="90">Ä­</l:l>
+<l:l i="90">Ä®</l:l>
+<l:l i="90">į</l:l>
+<l:l i="90">Ä°</l:l>
+<l:l i="90">Æ—</l:l>
+<l:l i="90">ɨ</l:l>
+<l:l i="90">Ç</l:l>
+<l:l i="90">Ç</l:l>
+<l:l i="90">Ȉ</l:l>
+<l:l i="90">ȉ</l:l>
+<l:l i="90">ÈŠ</l:l>
+<l:l i="90">È‹</l:l>
+<l:l i="90">Ḭ</l:l>
+<l:l i="90">ḭ</l:l>
+<l:l i="90">Ḯ</l:l>
+<l:l i="90">ḯ</l:l>
+<l:l i="90">Ỉ</l:l>
+<l:l i="90">ỉ</l:l>
+<l:l i="90">Ị</l:l>
+<l:l i="90">ị</l:l>
+<l:l i="100">J</l:l>
+<l:l i="100">j</l:l>
+<l:l i="100">Ä´</l:l>
+<l:l i="100">ĵ</l:l>
+<l:l i="100">Ç°</l:l>
+<l:l i="100">Ê</l:l>
+<l:l i="110">K</l:l>
+<l:l i="110">k</l:l>
+<l:l i="110">Ķ</l:l>
+<l:l i="110">Ä·</l:l>
+<l:l i="110">Ƙ</l:l>
+<l:l i="110">Æ™</l:l>
+<l:l i="110">Ǩ</l:l>
+<l:l i="110">Ç©</l:l>
+<l:l i="110">Ḱ</l:l>
+<l:l i="110">ḱ</l:l>
+<l:l i="110">Ḳ</l:l>
+<l:l i="110">ḳ</l:l>
+<l:l i="110">Ḵ</l:l>
+<l:l i="110">ḵ</l:l>
+<l:l i="120">L</l:l>
+<l:l i="120">l</l:l>
+<l:l i="120">Ĺ</l:l>
+<l:l i="120">ĺ</l:l>
+<l:l i="120">Ä»</l:l>
+<l:l i="120">ļ</l:l>
+<l:l i="120">Ľ</l:l>
+<l:l i="120">ľ</l:l>
+<l:l i="120">Ä¿</l:l>
+<l:l i="120">Å€</l:l>
+<l:l i="120">Å</l:l>
+<l:l i="120">Å‚</l:l>
+<l:l i="120">Æš</l:l>
+<l:l i="120">Lj</l:l>
+<l:l i="120">È´</l:l>
+<l:l i="120">É«</l:l>
+<l:l i="120">ɬ</l:l>
+<l:l i="120">É­</l:l>
+<l:l i="120">Ḷ</l:l>
+<l:l i="120">ḷ</l:l>
+<l:l i="120">Ḹ</l:l>
+<l:l i="120">ḹ</l:l>
+<l:l i="120">Ḻ</l:l>
+<l:l i="120">ḻ</l:l>
+<l:l i="120">Ḽ</l:l>
+<l:l i="120">ḽ</l:l>
+<l:l i="130">M</l:l>
+<l:l i="130">m</l:l>
+<l:l i="130">ɱ</l:l>
+<l:l i="130">Ḿ</l:l>
+<l:l i="130">ḿ</l:l>
+<l:l i="130">á¹€</l:l>
+<l:l i="130">á¹</l:l>
+<l:l i="130">Ṃ</l:l>
+<l:l i="130">ṃ</l:l>
+<l:l i="140">N</l:l>
+<l:l i="140">n</l:l>
+<l:l i="140">Ñ</l:l>
+<l:l i="140">ñ</l:l>
+<l:l i="140">Ń</l:l>
+<l:l i="140">Å„</l:l>
+<l:l i="140">Å…</l:l>
+<l:l i="140">ņ</l:l>
+<l:l i="140">Ň</l:l>
+<l:l i="140">ň</l:l>
+<l:l i="140">Æ</l:l>
+<l:l i="140">ɲ</l:l>
+<l:l i="140">Æž</l:l>
+<l:l i="140">È </l:l>
+<l:l i="140">Ç‹</l:l>
+<l:l i="140">Ǹ</l:l>
+<l:l i="140">ǹ</l:l>
+<l:l i="140">ȵ</l:l>
+<l:l i="140">ɳ</l:l>
+<l:l i="140">Ṅ</l:l>
+<l:l i="140">á¹…</l:l>
+<l:l i="140">Ṇ</l:l>
+<l:l i="140">ṇ</l:l>
+<l:l i="140">Ṉ</l:l>
+<l:l i="140">ṉ</l:l>
+<l:l i="140">Ṋ</l:l>
+<l:l i="140">ṋ</l:l>
+<l:l i="150">O</l:l>
+<l:l i="150">o</l:l>
+<l:l i="150">Ã’</l:l>
+<l:l i="150">ò</l:l>
+<l:l i="150">Ó</l:l>
+<l:l i="150">ó</l:l>
+<l:l i="150">Ô</l:l>
+<l:l i="150">ô</l:l>
+<l:l i="150">Õ</l:l>
+<l:l i="150">õ</l:l>
+<l:l i="150">Ö</l:l>
+<l:l i="150">ö</l:l>
+<l:l i="150">Ø</l:l>
+<l:l i="150">ø</l:l>
+<l:l i="150">Ō</l:l>
+<l:l i="150">Å</l:l>
+<l:l i="150">ÅŽ</l:l>
+<l:l i="150">Å</l:l>
+<l:l i="150">Å</l:l>
+<l:l i="150">Å‘</l:l>
+<l:l i="150">ÆŸ</l:l>
+<l:l i="150">Æ </l:l>
+<l:l i="150">Æ¡</l:l>
+<l:l i="150">Ç‘</l:l>
+<l:l i="150">Ç’</l:l>
+<l:l i="150">Ǫ</l:l>
+<l:l i="150">Ç«</l:l>
+<l:l i="150">Ǭ</l:l>
+<l:l i="150">Ç­</l:l>
+<l:l i="150">Ǿ</l:l>
+<l:l i="150">Ç¿</l:l>
+<l:l i="150">Ȍ</l:l>
+<l:l i="150">È</l:l>
+<l:l i="150">ÈŽ</l:l>
+<l:l i="150">È</l:l>
+<l:l i="150">Ȫ</l:l>
+<l:l i="150">È«</l:l>
+<l:l i="150">Ȭ</l:l>
+<l:l i="150">È­</l:l>
+<l:l i="150">È®</l:l>
+<l:l i="150">ȯ</l:l>
+<l:l i="150">È°</l:l>
+<l:l i="150">ȱ</l:l>
+<l:l i="150">Ṍ</l:l>
+<l:l i="150">á¹</l:l>
+<l:l i="150">Ṏ</l:l>
+<l:l i="150">á¹</l:l>
+<l:l i="150">á¹</l:l>
+<l:l i="150">ṑ</l:l>
+<l:l i="150">á¹’</l:l>
+<l:l i="150">ṓ</l:l>
+<l:l i="150">Ọ</l:l>
+<l:l i="150">á»</l:l>
+<l:l i="150">Ỏ</l:l>
+<l:l i="150">á»</l:l>
+<l:l i="150">á»</l:l>
+<l:l i="150">ố</l:l>
+<l:l i="150">á»’</l:l>
+<l:l i="150">ồ</l:l>
+<l:l i="150">á»”</l:l>
+<l:l i="150">ổ</l:l>
+<l:l i="150">á»–</l:l>
+<l:l i="150">á»—</l:l>
+<l:l i="150">Ộ</l:l>
+<l:l i="150">á»™</l:l>
+<l:l i="150">Ớ</l:l>
+<l:l i="150">á»›</l:l>
+<l:l i="150">Ờ</l:l>
+<l:l i="150">á»</l:l>
+<l:l i="150">Ở</l:l>
+<l:l i="150">ở</l:l>
+<l:l i="150">á» </l:l>
+<l:l i="150">ỡ</l:l>
+<l:l i="150">Ợ</l:l>
+<l:l i="150">ợ</l:l>
+<l:l i="160">P</l:l>
+<l:l i="160">p</l:l>
+<l:l i="160">Ƥ</l:l>
+<l:l i="160">Æ¥</l:l>
+<l:l i="160">á¹”</l:l>
+<l:l i="160">ṕ</l:l>
+<l:l i="160">á¹–</l:l>
+<l:l i="160">á¹—</l:l>
+<l:l i="170">Q</l:l>
+<l:l i="170">q</l:l>
+<l:l i="170">Ê </l:l>
+<l:l i="180">R</l:l>
+<l:l i="180">r</l:l>
+<l:l i="180">Å”</l:l>
+<l:l i="180">Å•</l:l>
+<l:l i="180">Å–</l:l>
+<l:l i="180">Å—</l:l>
+<l:l i="180">Ř</l:l>
+<l:l i="180">Å™</l:l>
+<l:l i="180">È</l:l>
+<l:l i="180">È‘</l:l>
+<l:l i="180">È’</l:l>
+<l:l i="180">È“</l:l>
+<l:l i="180">ɼ</l:l>
+<l:l i="180">ɽ</l:l>
+<l:l i="180">ɾ</l:l>
+<l:l i="180">Ṙ</l:l>
+<l:l i="180">á¹™</l:l>
+<l:l i="180">Ṛ</l:l>
+<l:l i="180">á¹›</l:l>
+<l:l i="180">Ṝ</l:l>
+<l:l i="180">á¹</l:l>
+<l:l i="180">Ṟ</l:l>
+<l:l i="180">ṟ</l:l>
+<l:l i="190">S</l:l>
+<l:l i="190">s</l:l>
+<l:l i="190">Åš</l:l>
+<l:l i="190">Å›</l:l>
+<l:l i="190">Ŝ</l:l>
+<l:l i="190">Å</l:l>
+<l:l i="190">Åž</l:l>
+<l:l i="190">ÅŸ</l:l>
+<l:l i="190">Å </l:l>
+<l:l i="190">Å¡</l:l>
+<l:l i="190">Ș</l:l>
+<l:l i="190">È™</l:l>
+<l:l i="190">Ê‚</l:l>
+<l:l i="190">á¹ </l:l>
+<l:l i="190">ṡ</l:l>
+<l:l i="190">á¹¢</l:l>
+<l:l i="190">á¹£</l:l>
+<l:l i="190">Ṥ</l:l>
+<l:l i="190">á¹¥</l:l>
+<l:l i="190">Ṧ</l:l>
+<l:l i="190">ṧ</l:l>
+<l:l i="190">Ṩ</l:l>
+<l:l i="190">ṩ</l:l>
+<l:l i="200">T</l:l>
+<l:l i="200">t</l:l>
+<l:l i="200">Å¢</l:l>
+<l:l i="200">Å£</l:l>
+<l:l i="200">Ť</l:l>
+<l:l i="200">Å¥</l:l>
+<l:l i="200">Ŧ</l:l>
+<l:l i="200">ŧ</l:l>
+<l:l i="200">Æ«</l:l>
+<l:l i="200">Ƭ</l:l>
+<l:l i="200">Æ­</l:l>
+<l:l i="200">Æ®</l:l>
+<l:l i="200">ʈ</l:l>
+<l:l i="200">Èš</l:l>
+<l:l i="200">È›</l:l>
+<l:l i="200">ȶ</l:l>
+<l:l i="200">Ṫ</l:l>
+<l:l i="200">ṫ</l:l>
+<l:l i="200">Ṭ</l:l>
+<l:l i="200">á¹­</l:l>
+<l:l i="200">á¹®</l:l>
+<l:l i="200">ṯ</l:l>
+<l:l i="200">á¹°</l:l>
+<l:l i="200">á¹±</l:l>
+<l:l i="200">ẗ</l:l>
+<l:l i="210">U</l:l>
+<l:l i="210">u</l:l>
+<l:l i="210">Ù</l:l>
+<l:l i="210">ù</l:l>
+<l:l i="210">Ú</l:l>
+<l:l i="210">ú</l:l>
+<l:l i="210">Û</l:l>
+<l:l i="210">û</l:l>
+<l:l i="210">Ü</l:l>
+<l:l i="210">ü</l:l>
+<l:l i="210">Ũ</l:l>
+<l:l i="210">Å©</l:l>
+<l:l i="210">Ū</l:l>
+<l:l i="210">Å«</l:l>
+<l:l i="210">Ŭ</l:l>
+<l:l i="210">Å­</l:l>
+<l:l i="210">Å®</l:l>
+<l:l i="210">ů</l:l>
+<l:l i="210">Å°</l:l>
+<l:l i="210">ű</l:l>
+<l:l i="210">Ų</l:l>
+<l:l i="210">ų</l:l>
+<l:l i="210">Ư</l:l>
+<l:l i="210">Æ°</l:l>
+<l:l i="210">Ç“</l:l>
+<l:l i="210">Ç”</l:l>
+<l:l i="210">Ç•</l:l>
+<l:l i="210">Ç–</l:l>
+<l:l i="210">Ç—</l:l>
+<l:l i="210">ǘ</l:l>
+<l:l i="210">Ç™</l:l>
+<l:l i="210">Çš</l:l>
+<l:l i="210">Ç›</l:l>
+<l:l i="210">ǜ</l:l>
+<l:l i="210">È”</l:l>
+<l:l i="210">È•</l:l>
+<l:l i="210">È–</l:l>
+<l:l i="210">È—</l:l>
+<l:l i="210">á¹²</l:l>
+<l:l i="210">á¹³</l:l>
+<l:l i="210">á¹´</l:l>
+<l:l i="210">á¹µ</l:l>
+<l:l i="210">Ṷ</l:l>
+<l:l i="210">á¹·</l:l>
+<l:l i="210">Ṹ</l:l>
+<l:l i="210">á¹¹</l:l>
+<l:l i="210">Ṻ</l:l>
+<l:l i="210">á¹»</l:l>
+<l:l i="210">Ụ</l:l>
+<l:l i="210">ụ</l:l>
+<l:l i="210">Ủ</l:l>
+<l:l i="210">ủ</l:l>
+<l:l i="210">Ứ</l:l>
+<l:l i="210">ứ</l:l>
+<l:l i="210">Ừ</l:l>
+<l:l i="210">ừ</l:l>
+<l:l i="210">Ử</l:l>
+<l:l i="210">á»­</l:l>
+<l:l i="210">á»®</l:l>
+<l:l i="210">ữ</l:l>
+<l:l i="210">á»°</l:l>
+<l:l i="210">á»±</l:l>
+<l:l i="220">V</l:l>
+<l:l i="220">v</l:l>
+<l:l i="220">Ʋ</l:l>
+<l:l i="220">Ê‹</l:l>
+<l:l i="220">á¹¼</l:l>
+<l:l i="220">á¹½</l:l>
+<l:l i="220">á¹¾</l:l>
+<l:l i="220">ṿ</l:l>
+<l:l i="230">W</l:l>
+<l:l i="230">w</l:l>
+<l:l i="230">Å´</l:l>
+<l:l i="230">ŵ</l:l>
+<l:l i="230">Ẁ</l:l>
+<l:l i="230">áº</l:l>
+<l:l i="230">Ẃ</l:l>
+<l:l i="230">ẃ</l:l>
+<l:l i="230">Ẅ</l:l>
+<l:l i="230">ẅ</l:l>
+<l:l i="230">Ẇ</l:l>
+<l:l i="230">ẇ</l:l>
+<l:l i="230">Ẉ</l:l>
+<l:l i="230">ẉ</l:l>
+<l:l i="230">ẘ</l:l>
+<l:l i="240">X</l:l>
+<l:l i="240">x</l:l>
+<l:l i="240">Ẋ</l:l>
+<l:l i="240">ẋ</l:l>
+<l:l i="240">Ẍ</l:l>
+<l:l i="240">áº</l:l>
+<l:l i="250">Y</l:l>
+<l:l i="250">y</l:l>
+<l:l i="250">Ã</l:l>
+<l:l i="250">ý</l:l>
+<l:l i="250">ÿ</l:l>
+<l:l i="250">Ÿ</l:l>
+<l:l i="250">Ŷ</l:l>
+<l:l i="250">Å·</l:l>
+<l:l i="250">Ƴ</l:l>
+<l:l i="250">Æ´</l:l>
+<l:l i="250">Ȳ</l:l>
+<l:l i="250">ȳ</l:l>
+<l:l i="250">Ẏ</l:l>
+<l:l i="250">áº</l:l>
+<l:l i="250">ẙ</l:l>
+<l:l i="250">Ỳ</l:l>
+<l:l i="250">ỳ</l:l>
+<l:l i="250">á»´</l:l>
+<l:l i="250">ỵ</l:l>
+<l:l i="250">Ỷ</l:l>
+<l:l i="250">á»·</l:l>
+<l:l i="250">Ỹ</l:l>
+<l:l i="250">ỹ</l:l>
+<l:l i="260">Z</l:l>
+<l:l i="260">z</l:l>
+<l:l i="260">Ź</l:l>
+<l:l i="260">ź</l:l>
+<l:l i="260">Å»</l:l>
+<l:l i="260">ż</l:l>
+<l:l i="260">Ž</l:l>
+<l:l i="260">ž</l:l>
+<l:l i="260">Ƶ</l:l>
+<l:l i="260">ƶ</l:l>
+<l:l i="260">Ȥ</l:l>
+<l:l i="260">È¥</l:l>
+<l:l i="260">Ê</l:l>
+<l:l i="260">Ê‘</l:l>
+<l:l i="260">áº</l:l>
+<l:l i="260">ẑ</l:l>
+<l:l i="260">Ẓ</l:l>
+<l:l i="260">ẓ</l:l>
+<l:l i="260">Ẕ</l:l>
+<l:l i="260">ẕ</l:l>
+</l:letters>
+</l:l10n>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/ml.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/ml.xml
new file mode 100644
index 0000000..280e7db
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/ml.xml
@@ -0,0 +1,660 @@
+<?xml version="1.0" encoding="utf-8"?>
+<l:l10n xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0" language="ml" english-language-name="Malayalam">
+
+<!-- * This file is generated automatically. -->
+<!-- * To submit changes to this file upstream (to the DocBook Project) -->
+<!-- * do not submit an edited version of this file. Instead, submit an -->
+<!-- * edited version of the source file at the following location: -->
+<!-- * -->
+<!-- * https://docbook.svn.sourceforge.net/svnroot/docbook/trunk/gentext/locale/ml.xml -->
+<!-- * -->
+<!-- * E-mail the edited ml.xml source file to: -->
+<!-- * -->
+<!-- * docbook-developers@lists.sourceforge.net -->
+
+<!-- ******************************************************************** -->
+
+<!-- This file is part of the XSL DocBook Stylesheet distribution. -->
+<!-- See ../README or http://docbook.sf.net/release/xsl/current/ for -->
+<!-- copyright and other information. -->
+
+<!-- ******************************************************************** -->
+<!-- In these files, % with a letter is used for a placeholder: -->
+<!-- %t is the current element's title -->
+<!-- %s is the current element's subtitle (if applicable)-->
+<!-- %n is the current element's number label-->
+<!-- %p is the current element's page number (if applicable)-->
+<!-- ******************************************************************** -->
+
+
+<l:gentext key="Abstract" text="സംഗàµà´°à´¹à´‚"/>
+<l:gentext key="abstract" text="സംഗàµà´°à´¹à´‚"/>
+<l:gentext key="Acknowledgements" text="നനàµà´¦à´¿"/>
+<l:gentext key="acknowledgements" text="നനàµà´¦à´¿"/>
+<l:gentext key="Answer" text="à´‰:"/>
+<l:gentext key="answer" text="à´‰:"/>
+<l:gentext key="Appendix" text="à´…à´¨àµà´¬à´¨àµà´§à´‚"/>
+<l:gentext key="appendix" text="à´…à´¨àµà´¬à´¨àµà´§à´‚"/>
+<l:gentext key="Article" text="ലേഖനം"/>
+<l:gentext key="article" text="ലേഖനം"/>
+<l:gentext key="Author" text="രചയിതാവàµàµ"/>
+<l:gentext key="Bibliography" text="à´—àµà´°à´¨àµà´¥à´¸àµ‚à´šà´¿"/>
+<l:gentext key="bibliography" text="à´—àµà´°à´¨àµà´¥à´¸àµ‚à´šà´¿"/>
+<l:gentext key="Book" text="à´ªàµà´¸àµà´¤à´•à´‚"/>
+<l:gentext key="book" text="à´ªàµà´¸àµà´¤à´•à´‚"/>
+<l:gentext key="CAUTION" text="à´¶àµà´°à´¦àµà´§à´¿à´•àµà´•àµà´•"/>
+<l:gentext key="Caution" text="à´¶àµà´°à´¦àµà´§à´¿à´•àµà´•àµà´•"/>
+<l:gentext key="caution" text="à´¶àµà´°à´¦àµà´§à´¿à´•àµà´•àµà´•"/>
+<l:gentext key="Chapter" text="പാഠം"/>
+<l:gentext key="chapter" text="പാഠം"/>
+<l:gentext key="Colophon" text="കോളോഫോണàµâ€"/>
+<l:gentext key="colophon" text="കോളോഫോണàµâ€"/>
+<l:gentext key="Copyright" text="പകരàµâ€à´ªàµà´ªà´µà´•à´¾à´¶à´‚"/>
+<l:gentext key="copyright" text="പകരàµâ€à´ªàµà´ªà´µà´•à´¾à´¶à´‚"/>
+<l:gentext key="Dedication" text="à´…à´°àµâ€à´ªàµà´ªà´£à´‚"/>
+<l:gentext key="dedication" text="à´…à´°àµâ€à´ªàµà´ªà´£à´‚"/>
+<l:gentext key="Edition" text="à´ªàµà´°à´¸à´¦àµà´§àµ€à´•à´°à´£à´‚"/>
+<l:gentext key="edition" text="à´ªàµà´°à´¸à´¦àµà´§àµ€à´•à´°à´£à´‚"/>
+<l:gentext key="Editor" text="à´Žà´¡à´¿à´±àµà´±à´°àµâ€"/>
+<l:gentext key="Equation" text="സമവാകàµà´¯à´‚"/>
+<l:gentext key="equation" text="സമവാകàµà´¯à´‚"/>
+<l:gentext key="Example" text="ഉദാഹരണം"/>
+<l:gentext key="example" text="ഉദാഹരണം"/>
+<l:gentext key="Figure" text="à´šà´¿à´¤àµà´°à´‚"/>
+<l:gentext key="figure" text="à´šà´¿à´¤àµà´°à´‚"/>
+<l:gentext key="Glossary" text="à´—àµà´²àµ‹à´¸àµà´¸à´±à´¿"/>
+<l:gentext key="glossary" text="à´—àµà´²àµ‹à´¸àµà´¸à´±à´¿"/>
+<l:gentext key="GlossSee" text="കാണàµà´•"/>
+<l:gentext key="glosssee" text="കാണàµà´•"/>
+<l:gentext key="GlossSeeAlso" text="ഇതàµà´‚ കാണàµà´•"/>
+<l:gentext key="glossseealso" text="ഇതàµà´‚ കാണàµà´•"/>
+<l:gentext key="IMPORTANT" text="à´ªàµà´°à´§à´¾à´¨à´‚"/>
+<l:gentext key="important" text="à´ªàµà´°à´§à´¾à´¨à´‚"/>
+<l:gentext key="Important" text="à´ªàµà´°à´§à´¾à´¨à´‚"/>
+<l:gentext key="Index" text="സൂചിക"/>
+<l:gentext key="index" text="സൂചിക"/>
+<l:gentext key="ISBN" text="ISBN"/>
+<l:gentext key="isbn" text="ISBN"/>
+<l:gentext key="LegalNotice" text="നിയമപരമായ à´•àµà´±à´¿à´ªàµà´ªàµàµ"/>
+<l:gentext key="legalnotice" text="നിയമപരമായ à´•àµà´±à´¿à´ªàµà´ªàµàµ"/>
+<l:gentext key="MsgAud" text="വായനകàµà´•à´¾à´°àµâ€"/>
+<l:gentext key="msgaud" text="വായനകàµà´•à´¾à´°àµâ€"/>
+<l:gentext key="MsgLevel" text="നില"/>
+<l:gentext key="msglevel" text="നില"/>
+<l:gentext key="MsgOrig" text="à´¤àµà´Ÿà´•àµà´•à´‚"/>
+<l:gentext key="msgorig" text="à´¤àµà´Ÿà´•àµà´•à´‚"/>
+<l:gentext key="NOTE" text="à´•àµà´±à´¿à´ªàµà´ªàµàµ"/>
+<l:gentext key="Note" text="à´•àµà´±à´¿à´ªàµà´ªàµàµ"/>
+<l:gentext key="note" text="à´•àµà´±à´¿à´ªàµà´ªàµàµ"/>
+<l:gentext key="Part" text="ഭാഗം"/>
+<l:gentext key="part" text="ഭാഗം"/>
+<l:gentext key="Preface" text="ആമàµà´–à´‚"/>
+<l:gentext key="preface" text="ആമàµà´–à´‚"/>
+<l:gentext key="Procedure" text="à´ªàµà´°à´•àµà´°à´¿à´¯"/>
+<l:gentext key="procedure" text="à´ªàµà´°à´•àµà´°à´¿à´¯"/>
+<l:gentext key="ProductionSet" text="നിരàµâ€à´®àµà´®à´¾à´£à´‚"/>
+<l:gentext key="PubDate" text="à´ªàµà´°à´¸à´¿à´¦àµà´§àµ€à´•à´°à´£ തീയതി"/>
+<l:gentext key="pubdate" text="à´ªàµà´°à´¸à´¿à´¦àµà´§àµ€à´•à´°à´£ തീയതി"/>
+<l:gentext key="Published" text="à´ªàµà´°à´¸à´¿à´¦àµà´§àµ€à´•à´°à´¿à´šàµà´šà´¤àµàµ"/>
+<l:gentext key="published" text="à´ªàµà´°à´¸à´¿à´¦àµà´§àµ€à´•à´°à´¿à´šàµà´šà´¤àµàµ"/>
+<l:gentext key="Publisher" text="à´ªàµà´°à´¸à´¿à´¦àµà´§àµ€à´•à´°àµâ€à´¤àµà´¤à´¾à´µàµ"/>
+<l:gentext key="Qandadiv" text="ചോ &amp; ഉ"/>
+<l:gentext key="qandadiv" text="ചോ &amp; ഉ"/>
+<l:gentext key="QandASet" text="സംശയങàµà´™à´³àµâ€à´•àµà´•àµà´‚ ചോദàµà´¯à´™àµà´™à´³àµâ€à´•àµà´•àµà´®àµà´³àµà´³ മറàµà´ªà´Ÿà´¿à´•à´³àµâ€"/>
+<l:gentext key="Question" text="ചോ:"/>
+<l:gentext key="question" text="ചോ:"/>
+<l:gentext key="RefEntry" text="താളàµâ€"/>
+<l:gentext key="refentry" text="താളàµâ€"/>
+<l:gentext key="Reference" text="സൂചന"/>
+<l:gentext key="reference" text="സൂചന"/>
+<l:gentext key="References" text="സൂചനകളàµâ€"/>
+<l:gentext key="RefName" text="നാമം"/>
+<l:gentext key="refname" text="നാമം"/>
+<l:gentext key="RefSection" text="വിഭാഗം"/>
+<l:gentext key="refsection" text="വിഭാഗം"/>
+<l:gentext key="RefSynopsisDiv" text="à´šàµà´°àµà´•àµà´•à´‚"/>
+<l:gentext key="refsynopsisdiv" text="à´šàµà´°àµà´•àµà´•à´‚"/>
+<l:gentext key="RevHistory" text="à´ªàµà´¨à´°àµâ€à´¨à´¿à´°àµ€à´•àµà´·à´£ à´šà´°à´¿à´¤àµà´°à´‚"/>
+<l:gentext key="revhistory" text="à´ªàµà´¨à´°àµâ€à´¨à´¿à´°àµ€à´•àµà´·à´£ à´šà´°à´¿à´¤àµà´°à´‚"/>
+<l:gentext key="revision" text="à´ªàµà´¨à´°àµâ€à´¨à´¿à´°àµ€à´•àµà´·à´£à´‚"/>
+<l:gentext key="Revision" text="à´ªàµà´¨à´°àµâ€à´¨à´¿à´°àµ€à´•àµà´·à´£à´‚"/>
+<l:gentext key="sect1" text="വിഭാഗം"/>
+<l:gentext key="sect2" text="വിഭാഗം"/>
+<l:gentext key="sect3" text="വിഭാഗം"/>
+<l:gentext key="sect4" text="വിഭാഗം"/>
+<l:gentext key="sect5" text="വിഭാഗം"/>
+<l:gentext key="section" text="വിഭാഗം"/>
+<l:gentext key="Section" text="വിഭാഗം"/>
+<l:gentext key="see" text="കാണàµà´•"/>
+<l:gentext key="See" text="കാണàµà´•"/>
+<l:gentext key="seealso" text="ഇതàµà´‚ കാണàµà´•"/>
+<l:gentext key="Seealso" text="ഇതàµà´‚ കാണàµà´•"/>
+<l:gentext key="SeeAlso" text="ഇതàµà´‚ കാണàµà´•"/>
+<l:gentext key="set" text="à´—àµà´°àµ‚à´ªàµà´ªàµ"/>
+<l:gentext key="Set" text="à´—àµà´°àµ‚à´ªàµà´ªàµ"/>
+<l:gentext key="setindex" text="à´—àµà´°àµ‚à´ªàµà´ªà´¿à´¨àµà´³àµà´³ സൂചിക"/>
+<l:gentext key="SetIndex" text="à´—àµà´°àµ‚à´ªàµà´ªà´¿à´¨àµà´³àµà´³ സൂചിക"/>
+<l:gentext key="Sidebar" text="സൈഡàµà´¬à´¾à´°àµâ€"/>
+<l:gentext key="sidebar" text="സൈഡàµà´¬à´¾à´°àµâ€"/>
+<l:gentext key="step" text="നടപടി"/>
+<l:gentext key="Step" text="നടപടി"/>
+<l:gentext key="table" text="പടàµà´Ÿà´¿à´•"/>
+<l:gentext key="Table" text="പടàµà´Ÿà´¿à´•"/>
+<l:gentext key="task" text="ജോലി"/>
+<l:gentext key="Task" text="ജോലി"/>
+<l:gentext key="tip" text="സൂചന"/>
+<l:gentext key="TIP" text="സൂചന"/>
+<l:gentext key="Tip" text="സൂചന"/>
+<l:gentext key="Warning" text="à´®àµà´¨àµà´¨à´±à´¿à´¯à´¿à´ªàµà´ªàµàµ"/>
+<l:gentext key="warning" text="à´®àµà´¨àµà´¨à´±à´¿à´¯à´¿à´ªàµà´ªàµàµ"/>
+<l:gentext key="WARNING" text="à´®àµà´¨àµà´¨à´±à´¿à´¯à´¿à´ªàµà´ªàµàµ"/>
+<l:gentext key="and" text=","/>
+<l:gentext key="by" text="."/>
+<l:gentext key="Edited" text="à´šà´¿à´Ÿàµà´Ÿà´ªàµà´ªàµ†à´Ÿàµà´¤àµà´¤à´¿à´¯à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ"/>
+<l:gentext key="edited" text="à´šà´¿à´Ÿàµà´Ÿà´ªàµà´ªàµ†à´Ÿàµà´¤àµà´¤à´¿à´¯à´¿à´°à´¿à´•àµà´•àµà´¨àµà´¨àµ"/>
+<l:gentext key="Editedby" text="à´šà´¿à´Ÿàµà´Ÿà´ªàµà´ªàµ†à´Ÿàµà´¤àµà´¤à´¿à´¯à´¤àµàµ"/>
+<l:gentext key="editedby" text="à´šà´¿à´Ÿàµà´Ÿà´ªàµà´ªàµ†à´Ÿàµà´¤àµà´¤à´¿à´¯à´¤àµàµ"/>
+<l:gentext key="in" text=" "/>
+<l:gentext key="lastlistcomma" text=","/>
+<l:gentext key="listcomma" text=","/>
+<l:gentext key="notes" text="à´•àµà´±à´¿à´ªàµà´ªàµà´•à´³àµâ€"/>
+<l:gentext key="Notes" text="à´•àµà´±à´¿à´ªàµà´ªàµà´•à´³àµâ€"/>
+<l:gentext key="Pgs" text="താളàµà´•à´³àµâ€."/>
+<l:gentext key="pgs" text="താളàµà´•à´³àµâ€."/>
+<l:gentext key="Revisedby" text="à´ªàµà´¨à´ƒà´ªà´°à´¿à´¶àµ‹à´§à´¿à´šàµà´šà´¤àµàµ: "/>
+<l:gentext key="revisedby" text="à´ªàµà´¨à´ƒà´ªà´°à´¿à´¶àµ‹à´§à´¿à´šàµà´šà´¤àµàµ: "/>
+<l:gentext key="TableNotes" text="à´•àµà´±à´¿à´ªàµà´ªàµà´•à´³àµâ€"/>
+<l:gentext key="tablenotes" text="à´•àµà´±à´¿à´ªàµà´ªàµà´•à´³àµâ€"/>
+<l:gentext key="TableofContents" text="ഉളàµà´³à´Ÿà´•àµà´•à´¤àµà´¤à´¿à´¨àµà´±àµ† പടàµà´Ÿà´¿à´•"/>
+<l:gentext key="tableofcontents" text="ഉളàµà´³à´Ÿà´•àµà´•à´¤àµà´¤à´¿à´¨àµà´±àµ† പടàµà´Ÿà´¿à´•"/>
+<l:gentext key="unexpectedelementname" text="à´…à´ªàµà´°à´¤àµ€à´•àµà´·à´¿à´¤à´®à´¾à´¯ എലമെനàµà´±àµ നാമം"/>
+<l:gentext key="unsupported" text="പിനàµà´¤àµà´£à´¯à´¿à´²àµà´²à´¾à´¤àµà´¤"/>
+<l:gentext key="xrefto" text="xref "/>
+<l:gentext key="Authors" text="രചയിതാകàµà´•à´³àµâ€"/>
+<l:gentext key="copyeditor" text="കോപàµà´ªà´¿ à´Žà´¡à´¿à´±àµà´±à´°àµâ€"/>
+<l:gentext key="graphicdesigner" text="à´—àµà´°à´¾à´«à´¿à´•àµ ഡിസൈനരàµâ€"/>
+<l:gentext key="productioneditor" text="à´ªàµà´°àµŠà´¡à´•àµà´·à´¨àµâ€ à´Žà´¡à´¿à´±àµà´±à´°àµâ€"/>
+<l:gentext key="technicaleditor" text="ടെകàµà´¨à´¿à´•àµà´•à´²àµâ€ à´Žà´¡à´¿à´±àµà´±à´°àµâ€"/>
+<l:gentext key="translator" text="പരിഭാഷകനàµâ€"/>
+<l:gentext key="listofequations" text="സമവാകàµà´¯à´™àµà´™à´³àµà´Ÿàµ† പടàµà´Ÿà´¿à´•"/>
+<l:gentext key="ListofEquations" text="സമവാകàµà´¯à´™àµà´™à´³àµà´Ÿàµ† പടàµà´Ÿà´¿à´•"/>
+<l:gentext key="ListofExamples" text="ഉദാഹരണങàµà´™à´³àµà´Ÿàµ† പടàµà´Ÿà´¿à´•"/>
+<l:gentext key="listofexamples" text="ഉദാഹരണങàµà´™à´³àµà´Ÿàµ† പടàµà´Ÿà´¿à´•"/>
+<l:gentext key="ListofFigures" text="à´šà´¿à´¤àµà´°à´™àµà´™à´³àµà´Ÿàµ† പടàµà´Ÿà´¿à´•"/>
+<l:gentext key="listoffigures" text="à´šà´¿à´¤àµà´°à´™àµà´™à´³àµà´Ÿàµ† പടàµà´Ÿà´¿à´•"/>
+<l:gentext key="ListofProcedures" text="à´ªàµà´°à´•àµà´°à´¿à´¯à´•à´³àµà´Ÿàµ† പടàµà´Ÿà´¿à´•"/>
+<l:gentext key="listofprocedures" text="à´ªàµà´°à´•àµà´°à´¿à´¯à´•à´³àµà´Ÿàµ† പടàµà´Ÿà´¿à´•"/>
+<l:gentext key="listoftables" text="പടàµà´Ÿà´¿à´•à´•à´³àµà´Ÿàµ† വിവരം"/>
+<l:gentext key="ListofTables" text="പടàµà´Ÿà´¿à´•à´•à´³àµà´Ÿàµ† വിവരം"/>
+<l:gentext key="ListofUnknown" text="അപരിചിതമായവàµà´Ÿàµ† പടàµà´Ÿà´¿à´•"/>
+<l:gentext key="listofunknown" text="അപരിചിതമായവàµà´Ÿàµ† പടàµà´Ÿà´¿à´•"/>
+<l:gentext key="nav-home" text="ആസàµà´¥à´¾à´¨à´‚"/>
+<l:gentext key="nav-next" text="à´…à´Ÿàµà´¤àµà´¤à´¤àµàµ"/>
+<l:gentext key="nav-next-sibling" text="à´à´±àµà´±à´µàµà´‚ à´®àµà´®àµà´ªàµ‹à´Ÿàµà´Ÿàµ"/>
+<l:gentext key="nav-prev" text="à´®àµà´®àµà´ªàµà´³àµà´³à´¤àµàµ"/>
+<l:gentext key="nav-prev-sibling" text="à´à´±àµà´±à´µàµà´‚ à´ªàµà´±à´•àµ‹à´Ÿàµà´Ÿàµ"/>
+<l:gentext key="nav-up" text="à´®àµà´•à´³à´¿à´²àµ‡à´•àµà´•àµ"/>
+<l:gentext key="nav-toc" text="ഉളàµà´³à´Ÿà´•àµà´•à´¤àµà´¤à´¿à´¨àµà´±àµ† പടàµà´Ÿà´¿à´•"/>
+<l:gentext key="Draft" text="പൂരàµâ€à´¤àµà´¤à´¿à´¯à´¾à´•à´¾à´¤àµà´¤ രേഖ"/>
+<l:gentext key="above" text="à´®àµà´•à´³à´¿à´²àµâ€"/>
+<l:gentext key="below" text="താഴെ"/>
+<l:gentext key="sectioncalled" text="വിഭാഗം"/>
+<l:gentext key="index symbols" text="à´šà´¿à´¹àµà´¨à´™àµà´™à´³àµâ€"/>
+<l:gentext key="writing-mode" text="lr-tb"/>
+<l:gentext key="lowercase.alpha" text="abcdefghijklmnopqrstuvwxyz" lang="en"/>
+<l:gentext key="uppercase.alpha" text="ABCDEFGHIJKLMNOPQRSTUVWXYZ" lang="en"/>
+<l:gentext key="normalize.sort.input" text="AaÀàÃáÂâÃãÄäÅåĀÄĂ㥹ÇǎǞǟǠǡǺǻȀÈȂȃȦȧḀá¸áºšáº áº¡áº¢áº£áº¤áº¥áº¦áº§áº¨áº©áºªáº«áº¬áº­áº®áº¯áº°áº±áº²áº³áº´áºµáº¶áº·BbÆ€ÆɓƂƃḂḃḄḅḆḇCcÇçĆćĈĉĊċČÄƇƈɕḈḉDdÄŽÄÄđƊɗƋƌDžDzȡɖḊḋḌá¸á¸Žá¸á¸á¸‘ḒḓEeÈèÉéÊêËëĒēĔĕĖėĘęĚěȄȅȆȇȨȩḔḕḖḗḘḙḚḛḜá¸áº¸áº¹áººáº»áº¼áº½áº¾áº¿á»€á»á»‚ểỄễỆệFfƑƒḞḟGgÄœÄĞğĠġĢģƓɠǤǥǦǧǴǵḠḡHhĤĥĦħȞȟɦḢḣḤḥḦḧḨḩḪḫẖIiÌìÃíÎîÃïĨĩĪīĬĭĮįİƗɨÇÇȈȉȊȋḬḭḮḯỈỉỊịJjĴĵǰÊKkĶķƘƙǨǩḰḱḲḳḴḵLlĹĺĻļĽľĿŀÅłƚLjȴɫɬɭḶḷḸḹḺḻḼḽMmɱḾḿṀá¹á¹‚ṃNnÑñŃńŅņŇňÆɲƞȠNjǸǹȵɳṄṅṆṇṈṉṊṋOoÒòÓóÔôÕõÖöØøŌÅÅŽÅÅőƟƠơǑǒǪǫǬǭǾǿȌÈÈŽÈȪȫȬȭȮȯȰȱṌá¹á¹Žá¹á¹á¹‘ṒṓỌá»á»Žá»á»á»‘ỒồỔổỖỗỘộỚớỜá»á»žá»Ÿá» á»¡á»¢á»£PpƤƥṔṕṖṗQqÊ RrŔŕŖŗŘřÈȑȒȓɼɽɾṘṙṚṛṜá¹á¹žá¹ŸSsŚśŜÅŞşŠšȘșʂṠṡṢṣṤṥṦṧṨṩTtŢţŤťŦŧƫƬƭƮʈȚțȶṪṫṬṭṮṯṰṱẗUuÙùÚúÛûÜüŨũŪūŬŭŮůŰűŲųƯưǓǔǕǖǗǘǙǚǛǜȔȕȖȗṲṳṴṵṶṷṸṹṺṻỤụỦủỨứỪừỬửỮữỰựVvƲʋṼṽṾṿWwŴŵẀáºáº‚ẃẄẅẆẇẈẉẘXxẊẋẌáºYyÃýÿŸŶŷƳƴȲȳẎáºáº™á»²á»³á»´á»µá»¶á»·á»¸á»¹ZzŹźŻżŽžƵƶȤȥÊÊ‘áºáº‘ẒẓẔẕẕ" lang="en"/>
+<l:gentext key="normalize.sort.output" text="AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBCCCCCCCCCCCCCCCCCDDDDDDDDDDDDDDDDDDDDDDDDEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEFFFFFFGGGGGGGGGGGGGGGGGGGGHHHHHHHHHHHHHHHHHHHHIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIJJJJJJKKKKKKKKKKKKKKLLLLLLLLLLLLLLLLLLLLLLLLLLMMMMMMMMMNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOPPPPPPPPQQQRRRRRRRRRRRRRRRRRRRRRRRSSSSSSSSSSSSSSSSSSSSSSSTTTTTTTTTTTTTTTTTTTTTTTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUVVVVVVVVWWWWWWWWWWWWWWWXXXXXXYYYYYYYYYYYYYYYYYYYYYYYZZZZZZZZZZZZZZZZZZZZZ" lang="en"/>
+<l:dingbat key="startquote" text="“"/>
+<l:dingbat key="endquote" text="â€"/>
+<l:dingbat key="nestedstartquote" text="‘"/>
+<l:dingbat key="nestedendquote" text="’"/>
+<l:dingbat key="singlestartquote" text="‘"/>
+<l:dingbat key="singleendquote" text="’"/>
+<l:dingbat key="bullet" text="•"/>
+<l:gentext key="hyphenation-character" text="-"/>
+<l:gentext key="hyphenation-push-character-count" text="2"/>
+<l:gentext key="hyphenation-remain-character-count" text="2"/>
+<l:context name="styles"><l:template name="person-name" text="first-last"/>
+</l:context>
+<l:context name="title"><l:template name="abstract" text="%t"/>
+<l:template name="acknowledgements" text="%t"/>
+<l:template name="answer" text="%t"/>
+<l:template name="appendix" text="à´…à´¨àµà´¬à´¨àµà´§à´‚ %n. %t"/>
+<l:template name="article" text="%t"/>
+<l:template name="authorblurb" text="%t"/>
+<l:template name="bibliodiv" text="%t"/>
+<l:template name="biblioentry" text="%t"/>
+<l:template name="bibliography" text="%t"/>
+<l:template name="bibliolist" text="%t"/>
+<l:template name="bibliomixed" text="%t"/>
+<l:template name="bibliomset" text="%t"/>
+<l:template name="biblioset" text="%t"/>
+<l:template name="blockquote" text="%t"/>
+<l:template name="book" text="%t"/>
+<l:template name="calloutlist" text="%t"/>
+<l:template name="caution" text="%t"/>
+<l:template name="chapter" text="പാഠം %n. %t"/>
+<l:template name="colophon" text="%t"/>
+<l:template name="dedication" text="%t"/>
+<l:template name="equation" text="സമവാകàµà´¯à´‚ %n. %t"/>
+<l:template name="example" text="ഉദാഹരണം %n. %t"/>
+<l:template name="figure" text="à´šà´¿à´¤àµà´°à´‚ %n. %t"/>
+<l:template name="foil" text="%t"/>
+<l:template name="foilgroup" text="%t"/>
+<l:template name="formalpara" text="%t"/>
+<l:template name="glossary" text="%t"/>
+<l:template name="glossdiv" text="%t"/>
+<l:template name="glosslist" text="%t"/>
+<l:template name="glossentry" text="%t"/>
+<l:template name="important" text="%t"/>
+<l:template name="index" text="%t"/>
+<l:template name="indexdiv" text="%t"/>
+<l:template name="itemizedlist" text="%t"/>
+<l:template name="legalnotice" text="%t"/>
+<l:template name="listitem" text=""/>
+<l:template name="lot" text="%t"/>
+<l:template name="msg" text="%t"/>
+<l:template name="msgexplan" text="%t"/>
+<l:template name="msgmain" text="%t"/>
+<l:template name="msgrel" text="%t"/>
+<l:template name="msgset" text="%t"/>
+<l:template name="msgsub" text="%t"/>
+<l:template name="note" text="%t"/>
+<l:template name="orderedlist" text="%t"/>
+<l:template name="part" text="ഭാഗം %n. %t"/>
+<l:template name="partintro" text="%t"/>
+<l:template name="preface" text="%t"/>
+<l:template name="procedure" text="%t"/>
+<l:template name="procedure.formal" text="à´ªàµà´°à´•àµà´°à´¿à´¯Â %n. %t"/>
+<l:template name="productionset" text="%t"/>
+<l:template name="productionset.formal" text="നിരàµâ€à´®àµà´®à´¾à´£à´‚ %n"/>
+<l:template name="qandadiv" text="%t"/>
+<l:template name="qandaentry" text="%t"/>
+<l:template name="qandaset" text="%t"/>
+<l:template name="question" text="%t"/>
+<l:template name="refentry" text="%t"/>
+<l:template name="reference" text="%t"/>
+<l:template name="refsection" text="%t"/>
+<l:template name="refsect1" text="%t"/>
+<l:template name="refsect2" text="%t"/>
+<l:template name="refsect3" text="%t"/>
+<l:template name="refsynopsisdiv" text="%t"/>
+<l:template name="refsynopsisdivinfo" text="%t"/>
+<l:template name="segmentedlist" text="%t"/>
+<l:template name="set" text="%t"/>
+<l:template name="setindex" text="%t"/>
+<l:template name="sidebar" text="%t"/>
+<l:template name="step" text="%t"/>
+<l:template name="table" text="പടàµà´Ÿà´¿à´•Â %n. %t"/>
+<l:template name="task" text="%t"/>
+<l:template name="tasksummary" text="%t"/>
+<l:template name="taskprerequisites" text="%t"/>
+<l:template name="taskrelated" text="%t"/>
+<l:template name="tip" text="%t"/>
+<l:template name="toc" text="%t"/>
+<l:template name="variablelist" text="%t"/>
+<l:template name="varlistentry" text=""/>
+<l:template name="warning" text="%t"/>
+</l:context>
+<l:context name="title-unnumbered"><l:template name="appendix" text="%t"/>
+<l:template name="article/appendix" text="%t"/>
+<l:template name="bridgehead" text="%t"/>
+<l:template name="chapter" text="%t"/>
+<l:template name="sect1" text="%t"/>
+<l:template name="sect2" text="%t"/>
+<l:template name="sect3" text="%t"/>
+<l:template name="sect4" text="%t"/>
+<l:template name="sect5" text="%t"/>
+<l:template name="section" text="%t"/>
+<l:template name="simplesect" text="%t"/>
+<l:template name="part" text="%t"/>
+</l:context>
+<l:context name="title-numbered"><l:template name="appendix" text="à´…à´¨àµà´¬à´¨àµà´§à´‚ %n. %t"/>
+<l:template name="article/appendix" text="%n. %t"/>
+<l:template name="bridgehead" text="%n. %t"/>
+<l:template name="chapter" text="പാഠം %n. %t"/>
+<l:template name="part" text="ഭാഗം %n. %t"/>
+<l:template name="sect1" text="%n. %t"/>
+<l:template name="sect2" text="%n. %t"/>
+<l:template name="sect3" text="%n. %t"/>
+<l:template name="sect4" text="%n. %t"/>
+<l:template name="sect5" text="%n. %t"/>
+<l:template name="section" text="%n. %t"/>
+<l:template name="simplesect" text="%t"/>
+</l:context>
+<l:context name="subtitle"><l:template name="appendix" text="%s"/>
+<l:template name="acknowledgements" text="%s"/>
+<l:template name="article" text="%s"/>
+<l:template name="bibliodiv" text="%s"/>
+<l:template name="biblioentry" text="%s"/>
+<l:template name="bibliography" text="%s"/>
+<l:template name="bibliomixed" text="%s"/>
+<l:template name="bibliomset" text="%s"/>
+<l:template name="biblioset" text="%s"/>
+<l:template name="book" text="%s"/>
+<l:template name="chapter" text="%s"/>
+<l:template name="colophon" text="%s"/>
+<l:template name="dedication" text="%s"/>
+<l:template name="glossary" text="%s"/>
+<l:template name="glossdiv" text="%s"/>
+<l:template name="index" text="%s"/>
+<l:template name="indexdiv" text="%s"/>
+<l:template name="lot" text="%s"/>
+<l:template name="part" text="%s"/>
+<l:template name="partintro" text="%s"/>
+<l:template name="preface" text="%s"/>
+<l:template name="refentry" text="%s"/>
+<l:template name="reference" text="%s"/>
+<l:template name="refsection" text="%s"/>
+<l:template name="refsect1" text="%s"/>
+<l:template name="refsect2" text="%s"/>
+<l:template name="refsect3" text="%s"/>
+<l:template name="refsynopsisdiv" text="%s"/>
+<l:template name="sect1" text="%s"/>
+<l:template name="sect2" text="%s"/>
+<l:template name="sect3" text="%s"/>
+<l:template name="sect4" text="%s"/>
+<l:template name="sect5" text="%s"/>
+<l:template name="section" text="%s"/>
+<l:template name="set" text="%s"/>
+<l:template name="setindex" text="%s"/>
+<l:template name="sidebar" text="%s"/>
+<l:template name="simplesect" text="%s"/>
+<l:template name="toc" text="%s"/>
+</l:context>
+<l:context name="xref"><l:template name="abstract" text="%t"/>
+<l:template name="acknowledgements" text="%t"/>
+<l:template name="answer" text="ഉ: %n"/>
+<l:template name="appendix" text="%t"/>
+<l:template name="article" text="%t"/>
+<l:template name="authorblurb" text="%t"/>
+<l:template name="bibliodiv" text="%t"/>
+<l:template name="bibliography" text="%t"/>
+<l:template name="bibliomset" text="%t"/>
+<l:template name="biblioset" text="%t"/>
+<l:template name="blockquote" text="%t"/>
+<l:template name="book" text="%t"/>
+<l:template name="calloutlist" text="%t"/>
+<l:template name="caution" text="%t"/>
+<l:template name="chapter" text="%t"/>
+<l:template name="colophon" text="%t"/>
+<l:template name="constraintdef" text="%t"/>
+<l:template name="dedication" text="%t"/>
+<l:template name="equation" text="%t"/>
+<l:template name="example" text="%t"/>
+<l:template name="figure" text="%t"/>
+<l:template name="foil" text="%t"/>
+<l:template name="foilgroup" text="%t"/>
+<l:template name="formalpara" text="%t"/>
+<l:template name="glossary" text="%t"/>
+<l:template name="glossdiv" text="%t"/>
+<l:template name="important" text="%t"/>
+<l:template name="index" text="%t"/>
+<l:template name="indexdiv" text="%t"/>
+<l:template name="itemizedlist" text="%t"/>
+<l:template name="legalnotice" text="%t"/>
+<l:template name="listitem" text="%n"/>
+<l:template name="lot" text="%t"/>
+<l:template name="msg" text="%t"/>
+<l:template name="msgexplan" text="%t"/>
+<l:template name="msgmain" text="%t"/>
+<l:template name="msgrel" text="%t"/>
+<l:template name="msgset" text="%t"/>
+<l:template name="msgsub" text="%t"/>
+<l:template name="note" text="%t"/>
+<l:template name="orderedlist" text="%t"/>
+<l:template name="part" text="%t"/>
+<l:template name="partintro" text="%t"/>
+<l:template name="preface" text="%t"/>
+<l:template name="procedure" text="%t"/>
+<l:template name="productionset" text="%t"/>
+<l:template name="qandadiv" text="%t"/>
+<l:template name="qandaentry" text="ചോ: %n"/>
+<l:template name="qandaset" text="%t"/>
+<l:template name="question" text="ചോ: %n"/>
+<l:template name="reference" text="%t"/>
+<l:template name="refsynopsisdiv" text="%t"/>
+<l:template name="segmentedlist" text="%t"/>
+<l:template name="set" text="%t"/>
+<l:template name="setindex" text="%t"/>
+<l:template name="sidebar" text="%t"/>
+<l:template name="table" text="%t"/>
+<l:template name="task" text="%t"/>
+<l:template name="tip" text="%t"/>
+<l:template name="toc" text="%t"/>
+<l:template name="variablelist" text="%t"/>
+<l:template name="varlistentry" text="%n"/>
+<l:template name="warning" text="%t"/>
+<l:template name="olink.document.citation" text=" in %o"/>
+<l:template name="olink.page.citation" text=" (page %p)"/>
+<l:template name="page.citation" text=" [%p]"/>
+<l:template name="page" text="(page %p)"/>
+<l:template name="docname" text=" in %o"/>
+<l:template name="docnamelong" text=" in the document titled %o"/>
+<l:template name="pageabbrev" text="(p. %p)"/>
+<l:template name="Page" text="Page %p"/>
+<l:template name="bridgehead" text="വിഭാഗം “%tâ€"/>
+<l:template name="refsection" text="വിഭാഗം “%tâ€"/>
+<l:template name="refsect1" text="വിഭാഗം “%tâ€"/>
+<l:template name="refsect2" text="വിഭാഗം “%tâ€"/>
+<l:template name="refsect3" text="വിഭാഗം “%tâ€"/>
+<l:template name="sect1" text="വിഭാഗം “%tâ€"/>
+<l:template name="sect2" text="വിഭാഗം “%tâ€"/>
+<l:template name="sect3" text="വിഭാഗം “%tâ€"/>
+<l:template name="sect4" text="വിഭാഗം “%tâ€"/>
+<l:template name="sect5" text="വിഭാഗം “%tâ€"/>
+<l:template name="section" text="വിഭാഗം “%tâ€"/>
+<l:template name="simplesect" text="വിഭാഗം “%tâ€"/>
+</l:context>
+<l:context name="xref-number"><l:template name="answer" text="ഉ: %n"/>
+<l:template name="appendix" text="à´…à´¨àµà´¬à´¨àµà´§à´‚ %n"/>
+<l:template name="bridgehead" text="വിഭാഗം %n"/>
+<l:template name="chapter" text="പാഠം %n"/>
+<l:template name="equation" text="സമവാകàµà´¯à´‚ %n"/>
+<l:template name="example" text="ഉദാഹരണം %n"/>
+<l:template name="figure" text="à´šà´¿à´¤àµà´°à´‚ %n"/>
+<l:template name="part" text="ഭാഗം %n"/>
+<l:template name="procedure" text="à´ªàµà´°à´•àµà´°à´¿à´¯Â %n"/>
+<l:template name="productionset" text="നിരàµâ€à´®àµà´®à´¾à´£à´‚ %n"/>
+<l:template name="qandadiv" text="ചോ &amp; ഉ %n"/>
+<l:template name="qandaentry" text="ചോ: %n"/>
+<l:template name="question" text="ചോ: %n"/>
+<l:template name="sect1" text="വിഭാഗം %n"/>
+<l:template name="sect2" text="വിഭാഗം %n"/>
+<l:template name="sect3" text="വിഭാഗം %n"/>
+<l:template name="sect4" text="വിഭാഗം %n"/>
+<l:template name="sect5" text="വിഭാഗം %n"/>
+<l:template name="section" text="വിഭാഗം %n"/>
+<l:template name="table" text="പടàµà´Ÿà´¿à´•Â %n"/>
+</l:context>
+<l:context name="xref-number-and-title"><l:template name="appendix" text="à´…à´¨àµà´¬à´¨àµà´§à´‚ %n, %t"/>
+<l:template name="bridgehead" text="വിഭാഗം %n, “%tâ€"/>
+<l:template name="chapter" text="പാഠം %n, %t"/>
+<l:template name="equation" text="സമവാകàµà´¯à´‚ %n, “%tâ€"/>
+<l:template name="example" text="ഉദാഹരണം %n, “%tâ€"/>
+<l:template name="figure" text="à´šà´¿à´¤àµà´°à´‚ %n, “%tâ€"/>
+<l:template name="part" text="ഭാഗം %n, “%tâ€"/>
+<l:template name="procedure" text="à´ªàµà´°à´•àµà´°à´¿à´¯Â %n, “%tâ€"/>
+<l:template name="productionset" text="നിരàµâ€à´®àµà´®à´¾à´£à´‚ %n, “%tâ€"/>
+<l:template name="qandadiv" text="ചോ &amp; ഉ %n, “%tâ€"/>
+<l:template name="refsect1" text="വിഭാഗം “%tâ€"/>
+<l:template name="refsect2" text="വിഭാഗം “%tâ€"/>
+<l:template name="refsect3" text="വിഭാഗം “%tâ€"/>
+<l:template name="refsection" text="വിഭാഗം “%tâ€"/>
+<l:template name="sect1" text="വിഭാഗം %n, “%tâ€"/>
+<l:template name="sect2" text="വിഭാഗം %n, “%tâ€"/>
+<l:template name="sect3" text="വിഭാഗം %n, “%tâ€"/>
+<l:template name="sect4" text="വിഭാഗം %n, “%tâ€"/>
+<l:template name="sect5" text="വിഭാഗം %n, “%tâ€"/>
+<l:template name="section" text="വിഭാഗം %n, “%tâ€"/>
+<l:template name="simplesect" text="വിഭാഗം “%tâ€"/>
+<l:template name="table" text="പടàµà´Ÿà´¿à´•Â %n, “%tâ€"/>
+</l:context>
+<l:context name="authorgroup"><l:template name="sep" text=", "/>
+<l:template name="sep2" text=" , "/>
+<l:template name="seplast" text=", , "/>
+</l:context>
+<l:context name="glossary"><l:template name="see" text="കാണàµà´• %t."/>
+<l:template name="seealso" text="ഇതàµà´‚ കാണàµà´• %t."/>
+<l:template name="seealso-separator" text=", "/>
+</l:context>
+<l:context name="msgset"><l:template name="MsgAud" text="വായനകàµà´•à´¾à´°àµâ€: "/>
+<l:template name="MsgLevel" text="നില: "/>
+<l:template name="MsgOrig" text="à´¤àµà´Ÿà´•àµà´•à´‚: "/>
+</l:context>
+<l:context name="datetime"><l:template name="format" text="m/d/Y"/>
+</l:context>
+<l:context name="termdef"><l:template name="prefix" text="[Definition: "/>
+<l:template name="suffix" text="]"/>
+</l:context>
+<l:context name="datetime-full"><l:template name="January" text="ജനàµà´µà´°à´¿"/>
+<l:template name="February" text="ഫെബàµà´°àµà´µà´°à´¿"/>
+<l:template name="March" text="മാരàµâ€à´šàµà´šàµ"/>
+<l:template name="April" text="à´à´ªàµà´°à´¿à´²àµâ€"/>
+<l:template name="May" text="മെയàµ"/>
+<l:template name="June" text="ജൂണàµâ€"/>
+<l:template name="July" text="ജൂലൈ"/>
+<l:template name="August" text="à´“à´—à´¸àµà´±àµà´±àµ"/>
+<l:template name="September" text="സെപàµà´±àµà´±à´‚ബരàµâ€"/>
+<l:template name="October" text="à´’à´•àµà´Ÿàµ‹à´¬à´°àµâ€"/>
+<l:template name="November" text="നവംബരàµâ€"/>
+<l:template name="December" text="ഡിസംബരàµâ€"/>
+<l:template name="Monday" text="തിങàµà´•à´³àµâ€"/>
+<l:template name="Tuesday" text="ചൊവàµà´µ"/>
+<l:template name="Wednesday" text="à´¬àµà´§à´¨àµâ€"/>
+<l:template name="Thursday" text="à´µàµà´¯à´¾à´´à´‚"/>
+<l:template name="Friday" text="വെളàµà´³à´¿"/>
+<l:template name="Saturday" text="ശനി"/>
+<l:template name="Sunday" text="ഞായരàµâ€"/>
+</l:context>
+<l:context name="datetime-abbrev"><l:template name="Jan" text="ജനàµ"/>
+<l:template name="Feb" text="ഫെബàµà´°àµ"/>
+<l:template name="Mar" text="മാരàµâ€"/>
+<l:template name="Apr" text="à´à´ªàµà´°à´¿"/>
+<l:template name="May" text="മെയàµ"/>
+<l:template name="Jun" text="ജൂണàµâ€"/>
+<l:template name="Jul" text="ജൂലൈ"/>
+<l:template name="Aug" text="à´“à´—"/>
+<l:template name="Sep" text="സെപàµ"/>
+<l:template name="Oct" text="à´’à´•àµà´Ÿàµ"/>
+<l:template name="Nov" text="നവം"/>
+<l:template name="Dec" text="ഡിസം"/>
+<l:template name="Mon" text="തി"/>
+<l:template name="Tue" text="ചൊ"/>
+<l:template name="Wed" text="à´¬àµ"/>
+<l:template name="Thu" text="à´µàµà´¯à´¾"/>
+<l:template name="Fri" text="വെ"/>
+<l:template name="Sat" text="à´¶"/>
+<l:template name="Sun" text="à´žà´¾"/>
+</l:context>
+<l:context name="htmlhelp"><l:template name="langcode" text="0x044c Malayalam"/>
+</l:context>
+<l:context name="index"><l:template name="term-separator" text=", "/>
+<l:template name="number-separator" text=", "/>
+<l:template name="range-separator" text="-"/>
+</l:context>
+<l:context name="iso690"><l:template name="lastfirst.sep" text=", "/>
+<l:template name="alt.person.two.sep" text=" – "/>
+<l:template name="alt.person.last.sep" text=" – "/>
+<l:template name="alt.person.more.sep" text=" – "/>
+<l:template name="primary.editor" text=" (ed.)"/>
+<l:template name="primary.many" text=", et al."/>
+<l:template name="primary.sep" text=". "/>
+<l:template name="submaintitle.sep" text=": "/>
+<l:template name="title.sep" text=". "/>
+<l:template name="othertitle.sep" text=", "/>
+<l:template name="medium1" text=" ["/>
+<l:template name="medium2" text="]"/>
+<l:template name="secondary.person.sep" text="; "/>
+<l:template name="secondary.sep" text=". "/>
+<l:template name="respons.sep" text=". "/>
+<l:template name="edition.sep" text=". "/>
+<l:template name="edition.serial.sep" text=", "/>
+<l:template name="issuing.range" text="-"/>
+<l:template name="issuing.div" text=", "/>
+<l:template name="issuing.sep" text=". "/>
+<l:template name="partnr.sep" text=". "/>
+<l:template name="placepubl.sep" text=": "/>
+<l:template name="publyear.sep" text=", "/>
+<l:template name="pubinfo.sep" text=". "/>
+<l:template name="spec.pubinfo.sep" text=", "/>
+<l:template name="upd.sep" text=", "/>
+<l:template name="datecit1" text=" [cited "/>
+<l:template name="datecit2" text="]"/>
+<l:template name="extent.sep" text=". "/>
+<l:template name="locs.sep" text=", "/>
+<l:template name="location.sep" text=". "/>
+<l:template name="serie.sep" text=". "/>
+<l:template name="notice.sep" text=". "/>
+<l:template name="access" text="Available "/>
+<l:template name="acctoo" text="Also available "/>
+<l:template name="onwww" text="from World Wide Web"/>
+<l:template name="oninet" text="from Internet"/>
+<l:template name="access.end" text=": "/>
+<l:template name="link1" text="&lt;"/>
+<l:template name="link2" text="&gt;"/>
+<l:template name="access.sep" text=". "/>
+<l:template name="isbn" text="ISBN "/>
+<l:template name="issn" text="ISSN "/>
+<l:template name="stdnum.sep" text=". "/>
+<l:template name="patcountry.sep" text=". "/>
+<l:template name="pattype.sep" text=", "/>
+<l:template name="patnum.sep" text=". "/>
+<l:template name="patdate.sep" text=". "/>
+</l:context><l:letters><l:l i="-1"/>
+<l:l i="0">à´šà´¿à´¹àµà´¨à´™àµà´™à´³àµâ€</l:l>
+<l:l i="10">A</l:l>
+<l:l i="10">a</l:l>
+<l:l i="20">B</l:l>
+<l:l i="20">b</l:l>
+<l:l i="30">C</l:l>
+<l:l i="30">c</l:l>
+<l:l i="40">D</l:l>
+<l:l i="40">d</l:l>
+<l:l i="50">E</l:l>
+<l:l i="50">e</l:l>
+<l:l i="60">F</l:l>
+<l:l i="60">f</l:l>
+<l:l i="70">G</l:l>
+<l:l i="70">g</l:l>
+<l:l i="80">H</l:l>
+<l:l i="80">h</l:l>
+<l:l i="90">I</l:l>
+<l:l i="90">i</l:l>
+<l:l i="100">J</l:l>
+<l:l i="100">j</l:l>
+<l:l i="110">K</l:l>
+<l:l i="110">k</l:l>
+<l:l i="120">L</l:l>
+<l:l i="120">l</l:l>
+<l:l i="130">M</l:l>
+<l:l i="130">m</l:l>
+<l:l i="140">N</l:l>
+<l:l i="140">n</l:l>
+<l:l i="150">O</l:l>
+<l:l i="150">o</l:l>
+<l:l i="160">P</l:l>
+<l:l i="160">p</l:l>
+<l:l i="170">Q</l:l>
+<l:l i="170">q</l:l>
+<l:l i="180">R</l:l>
+<l:l i="180">r</l:l>
+<l:l i="190">S</l:l>
+<l:l i="190">s</l:l>
+<l:l i="200">T</l:l>
+<l:l i="200">t</l:l>
+<l:l i="210">U</l:l>
+<l:l i="210">u</l:l>
+<l:l i="220">V</l:l>
+<l:l i="220">v</l:l>
+<l:l i="230">W</l:l>
+<l:l i="230">w</l:l>
+<l:l i="240">X</l:l>
+<l:l i="240">x</l:l>
+<l:l i="250">Y</l:l>
+<l:l i="250">y</l:l>
+<l:l i="260">Z</l:l>
+<l:l i="260">z</l:l>
+</l:letters>
+</l:l10n>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/mn.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/mn.xml
new file mode 100644
index 0000000..ef95526
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/mn.xml
@@ -0,0 +1,730 @@
+<?xml version="1.0" encoding="utf-8"?>
+<l:l10n xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0" language="mn" english-language-name="Mongolian">
+
+<!-- * This file is generated automatically. -->
+<!-- * To submit changes to this file upstream (to the DocBook Project) -->
+<!-- * do not submit an edited version of this file. Instead, submit an -->
+<!-- * edited version of the source file at the following location: -->
+<!-- * -->
+<!-- * https://docbook.svn.sourceforge.net/svnroot/docbook/trunk/gentext/locale/mn.xml -->
+<!-- * -->
+<!-- * E-mail the edited mn.xml source file to: -->
+<!-- * -->
+<!-- * docbook-developers@lists.sourceforge.net -->
+
+<!-- ******************************************************************** -->
+
+<!-- This file is part of the XSL DocBook Stylesheet distribution. -->
+<!-- See ../README or http://docbook.sf.net/release/xsl/current/ for -->
+<!-- copyright and other information. -->
+
+<!-- ******************************************************************** -->
+<!-- In these files, % with a letter is used for a placeholder: -->
+<!-- %t is the current element's title -->
+<!-- %s is the current element's subtitle (if applicable)-->
+<!-- %n is the current element's number label-->
+<!-- %p is the current element's page number (if applicable)-->
+<!-- ******************************************************************** -->
+
+
+<l:gentext key="Abstract" text="Товч агуулга"/>
+<l:gentext key="abstract" text="товч агуулга"/>
+<l:gentext key="Acknowledgements" text="Acknowledgements" lang="en"/>
+<l:gentext key="acknowledgements" text="Acknowledgements" lang="en"/>
+<l:gentext key="Answer" text="Ð¥:"/>
+<l:gentext key="answer" text="Ð¥:"/>
+<l:gentext key="Appendix" text="ХавÑралт"/>
+<l:gentext key="appendix" text="хавÑралт"/>
+<l:gentext key="Article" text="ӨгүүлÑл"/>
+<l:gentext key="article" text="өгүүлÑл"/>
+<l:gentext key="Author" text="Зохиогч"/>
+<l:gentext key="Bibliography" text="Ðом зүй"/>
+<l:gentext key="bibliography" text="ном зүй"/>
+<l:gentext key="Book" text="Ðом"/>
+<l:gentext key="book" text="ном"/>
+<l:gentext key="CAUTION" text="ÐÐÐ¥ÐÐРУУЛГÐ"/>
+<l:gentext key="Caution" text="Ðнхааруулга"/>
+<l:gentext key="caution" text="анхааруулга"/>
+<l:gentext key="Chapter" text="БүлÑг"/>
+<l:gentext key="chapter" text="бүлÑг"/>
+<l:gentext key="Colophon" text="Сүүл тайлбар"/>
+<l:gentext key="colophon" text="Ñүүл тайлбар"/>
+<l:gentext key="Copyright" text="Зохиогчийн Ñрх"/>
+<l:gentext key="copyright" text="зохиогчийн Ñрх"/>
+<l:gentext key="Dedication" text="Зохиогчийн үг"/>
+<l:gentext key="dedication" text="зохиогчийн үг"/>
+<l:gentext key="Edition" text="Ð¥ÑвлÑл"/>
+<l:gentext key="edition" text="Ñ…ÑвлÑл"/>
+<l:gentext key="Editor" text="Ð¥Ñнан тохиолдуулагч"/>
+<l:gentext key="Equation" text="ТÑгшитгÑл"/>
+<l:gentext key="equation" text="Ñ‚ÑгшитгÑл"/>
+<l:gentext key="Example" text="ЖишÑÑ"/>
+<l:gentext key="example" text="жишÑÑ"/>
+<l:gentext key="Figure" text="Зураг"/>
+<l:gentext key="figure" text="зураг"/>
+<l:gentext key="Glossary" text="ÐÑÑ€ томъёо"/>
+<l:gentext key="glossary" text="нÑÑ€ томъёо"/>
+<l:gentext key="GlossSee" text="харна уу"/>
+<l:gentext key="glosssee" text="харна уу"/>
+<l:gentext key="GlossSeeAlso" text="Ð‘Ð°Ñ Ñ…Ð°Ñ€Ð½Ð° уу"/>
+<l:gentext key="glossseealso" text="Ð±Ð°Ñ Ñ…Ð°Ñ€Ð½Ð° уу"/>
+<l:gentext key="IMPORTANT" text="ЧУХÐЛ"/>
+<l:gentext key="important" text="чухал"/>
+<l:gentext key="Important" text="Чухал"/>
+<l:gentext key="Index" text="Үгийн жагÑаалт"/>
+<l:gentext key="index" text="үгийн жагÑаалт"/>
+<l:gentext key="ISBN" text="ISBN"/>
+<l:gentext key="isbn" text="ISBN"/>
+<l:gentext key="LegalNotice" text="Хуулийн заалт"/>
+<l:gentext key="legalnotice" text="хуулийн заалт"/>
+<l:gentext key="MsgAud" text="Зориулалт"/>
+<l:gentext key="msgaud" text="зориулалт"/>
+<l:gentext key="MsgLevel" text="Түвшин"/>
+<l:gentext key="msglevel" text="түвшин"/>
+<l:gentext key="MsgOrig" text="Ò®Ò¯ÑÑл"/>
+<l:gentext key="msgorig" text="Ò¯Ò¯ÑÑл"/>
+<l:gentext key="NOTE" text="ТЭМДЭГЛЭЛ"/>
+<l:gentext key="Note" text="ТÑмдÑглÑл"/>
+<l:gentext key="note" text="Ñ‚ÑмдÑглÑл"/>
+<l:gentext key="Part" text="Ñ…ÑÑÑг"/>
+<l:gentext key="part" text="Ð¥ÑÑÑг"/>
+<l:gentext key="Preface" text="Өмнөх үг"/>
+<l:gentext key="preface" text="өмнөх үг"/>
+<l:gentext key="Procedure" text="ГүйцÑтгÑл"/>
+<l:gentext key="procedure" text="гүйцÑтгÑл"/>
+<l:gentext key="ProductionSet" text="БүтÑÑгдÑхүүн"/>
+<l:gentext key="PubDate" text="Ð¥ÑвлÑгдÑÑн огноо"/>
+<l:gentext key="pubdate" text="Ñ…ÑвлÑгдÑÑн огноо"/>
+<l:gentext key="Published" text="Ð¥ÑвлÑгдÑÑн"/>
+<l:gentext key="published" text="Ñ…ÑвлÑгдÑÑн"/>
+<l:gentext key="Publisher" text="Ð¥ÑвлÑÑÑн компани"/>
+<l:gentext key="Qandadiv" text="Рба Х"/>
+<l:gentext key="qandadiv" text="Рба Х"/>
+<l:gentext key="QandASet" text="ТүгÑÑмÑл тавигддаг аÑуултууд"/>
+<l:gentext key="Question" text="Ð:"/>
+<l:gentext key="question" text="Ð:"/>
+<l:gentext key="RefEntry" text=""/>
+<l:gentext key="refentry" text=""/>
+<l:gentext key="Reference" text="ÐшиглаÑан ном"/>
+<l:gentext key="reference" text="ашиглаÑан ном"/>
+<l:gentext key="References" text="ÐшиглаÑан номнууд"/>
+<l:gentext key="RefName" text="ÐÑÑ€"/>
+<l:gentext key="refname" text="нÑÑ€"/>
+<l:gentext key="RefSection" text=""/>
+<l:gentext key="refsection" text=""/>
+<l:gentext key="RefSynopsisDiv" text="Ерөнхий агуулга"/>
+<l:gentext key="refsynopsisdiv" text="ерөнхий агуулга"/>
+<l:gentext key="RevHistory" text="Залруулалтын түүх"/>
+<l:gentext key="revhistory" text="залруулалтын түүх"/>
+<l:gentext key="revision" text="залруулалт"/>
+<l:gentext key="Revision" text="Залруулалт"/>
+<l:gentext key="sect1" text="Ð¥ÑÑÑг"/>
+<l:gentext key="sect2" text="Ð¥ÑÑÑг"/>
+<l:gentext key="sect3" text="Ð¥ÑÑÑг"/>
+<l:gentext key="sect4" text="Ð¥ÑÑÑг"/>
+<l:gentext key="sect5" text="Ð¥ÑÑÑг"/>
+<l:gentext key="section" text="Ð¥ÑÑÑг"/>
+<l:gentext key="Section" text="Ð¥ÑÑÑг"/>
+<l:gentext key="see" text="Харна уу"/>
+<l:gentext key="See" text="харна уу"/>
+<l:gentext key="seealso" text="Ð±Ð°Ñ Ñ…Ð°Ñ€Ð½Ð° уу"/>
+<l:gentext key="Seealso" text="Ð‘Ð°Ñ Ñ…Ð°Ñ€Ð½Ð° уу"/>
+<l:gentext key="SeeAlso" text="Ð‘Ð°Ñ Ñ…Ð°Ñ€Ð½Ð° уу"/>
+<l:gentext key="set" text="цуглуулга"/>
+<l:gentext key="Set" text="Цуглуулга"/>
+<l:gentext key="setindex" text="цуглуулгын жагÑаалт"/>
+<l:gentext key="SetIndex" text="Цуглуулгын жагÑаалт"/>
+<l:gentext key="Sidebar" text="Хажуу Ñамбар"/>
+<l:gentext key="sidebar" text="хажуу Ñамбар"/>
+<l:gentext key="step" text="алхам"/>
+<l:gentext key="Step" text="Ðлхам"/>
+<l:gentext key="table" text="Ñ…Ò¯ÑнÑгт"/>
+<l:gentext key="Table" text="Ð¥Ò¯ÑнÑгт"/>
+<l:gentext key="task" text="даалгавар"/>
+<l:gentext key="Task" text="Даалгавар"/>
+<l:gentext key="tip" text="зөвлөгөө"/>
+<l:gentext key="TIP" text="ЗӨВЛӨГӨӨ"/>
+<l:gentext key="Tip" text="Зөвлөгөө"/>
+<l:gentext key="Warning" text="Сануулга"/>
+<l:gentext key="warning" text="Ñануулга"/>
+<l:gentext key="WARNING" text="СÐÐУУЛГÐ"/>
+<l:gentext key="and" text="ба"/>
+<l:gentext key="by" text=""/>
+<l:gentext key="Edited" text="Ð¥ÑнаÑан"/>
+<l:gentext key="edited" text="Ñ…ÑнаÑан"/>
+<l:gentext key="Editedby" text="Ð¥Ñнан тохиолдуулÑан"/>
+<l:gentext key="editedby" text="Ñ…Ñнан тохиолдуулÑан"/>
+<l:gentext key="in" text="дотор"/>
+<l:gentext key="lastlistcomma" text=","/>
+<l:gentext key="listcomma" text=","/>
+<l:gentext key="notes" text="тайлбар"/>
+<l:gentext key="Notes" text="Тайлбар"/>
+<l:gentext key="Pgs" text="ХуудаÑ"/>
+<l:gentext key="pgs" text="хуудаÑ"/>
+<l:gentext key="Revisedby" text="ЗалруулÑан: "/>
+<l:gentext key="revisedby" text="залруулÑан: "/>
+<l:gentext key="TableNotes" text="Тайлбар"/>
+<l:gentext key="tablenotes" text="тайлбар"/>
+<l:gentext key="TableofContents" text="Гарчиг"/>
+<l:gentext key="tableofcontents" text="гарчиг"/>
+<l:gentext key="unexpectedelementname" text="СанамÑаргүй Ñлемент"/>
+<l:gentext key="unsupported" text="дÑмжигдÑÑгүй"/>
+<l:gentext key="xrefto" text="xref руу"/>
+<l:gentext key="Authors" text="Зохиогчид"/>
+<l:gentext key="copyeditor" text="Хуулбар Ñ…Ñнан тохиолдуулагч"/>
+<l:gentext key="graphicdesigner" text="График дизайнч"/>
+<l:gentext key="productioneditor" text="БүтÑÑгдÑхүүн Ñ…Ñнан тохиолдуулагч"/>
+<l:gentext key="technicaleditor" text="Техникийн Ñ…Ñнан тохиолдуулагч"/>
+<l:gentext key="translator" text="Орчуулагч"/>
+<l:gentext key="listofequations" text="Ñ‚ÑгшитгÑлийн жагÑаалт"/>
+<l:gentext key="ListofEquations" text="ТÑгшитгÑлийн жагÑаалт"/>
+<l:gentext key="ListofExamples" text="ЖишÑÑний жагÑаалт"/>
+<l:gentext key="listofexamples" text="жишÑÑний жагÑаалт"/>
+<l:gentext key="ListofFigures" text="Зургийн жагÑаалт"/>
+<l:gentext key="listoffigures" text="зургийн жагÑаалт"/>
+<l:gentext key="ListofProcedures" text="ГүйцÑтгÑлийн жагÑаалт"/>
+<l:gentext key="listofprocedures" text="гүйцÑтгÑлийн жагÑаалт"/>
+<l:gentext key="listoftables" text="Ñ…Ò¯ÑнÑгтийн жагÑаалт"/>
+<l:gentext key="ListofTables" text="Ð¥Ò¯ÑнÑгтийн жагÑаалт"/>
+<l:gentext key="ListofUnknown" text="Тодорхойгүй жагÑаалт"/>
+<l:gentext key="listofunknown" text="тодорхойгүй жагÑаалт"/>
+<l:gentext key="nav-home" text="ЭхлÑл"/>
+<l:gentext key="nav-next" text="Дараах"/>
+<l:gentext key="nav-next-sibling" text="Дараах"/>
+<l:gentext key="nav-prev" text="Өмнөх"/>
+<l:gentext key="nav-prev-sibling" text="Өмнөх"/>
+<l:gentext key="nav-up" text="ДÑÑш"/>
+<l:gentext key="nav-toc" text="Гарчиг"/>
+<l:gentext key="Draft" text="Ðоорог"/>
+<l:gentext key="above" text="дÑÑÑ€"/>
+<l:gentext key="below" text="доор"/>
+<l:gentext key="sectioncalled" text="Ð¥ÑÑгийн нÑÑ€"/>
+<l:gentext key="index symbols" text="Ñ‚ÑмдÑгтүүд"/>
+<l:gentext key="writing-mode" text="lr-tb"/>
+<l:gentext key="lowercase.alpha" text="абвгдеёжзийклмноөпрÑтуүфхцчшщъыьÑÑŽÑ"/>
+<l:gentext key="uppercase.alpha" text="ÐБВГДЕÐЖЗИЙКЛМÐОӨПРСТУҮФХЦЧШЩЪЫЬЭЮЯ"/>
+<l:gentext key="normalize.sort.input" text="AaÀàÃáÂâÃãÄäÅåĀÄĂ㥹ÇǎǞǟǠǡǺǻȀÈȂȃȦȧḀá¸áºšáº áº¡áº¢áº£áº¤áº¥áº¦áº§áº¨áº©áºªáº«áº¬áº­áº®áº¯áº°áº±áº²áº³áº´áºµáº¶áº·BbÆ€ÆɓƂƃḂḃḄḅḆḇCcÇçĆćĈĉĊċČÄƇƈɕḈḉDdÄŽÄÄđƊɗƋƌDžDzȡɖḊḋḌá¸á¸Žá¸á¸á¸‘ḒḓEeÈèÉéÊêËëĒēĔĕĖėĘęĚěȄȅȆȇȨȩḔḕḖḗḘḙḚḛḜá¸áº¸áº¹áººáº»áº¼áº½áº¾áº¿á»€á»á»‚ểỄễỆệFfƑƒḞḟGgÄœÄĞğĠġĢģƓɠǤǥǦǧǴǵḠḡHhĤĥĦħȞȟɦḢḣḤḥḦḧḨḩḪḫẖIiÌìÃíÎîÃïĨĩĪīĬĭĮįİƗɨÇÇȈȉȊȋḬḭḮḯỈỉỊịJjĴĵǰÊKkĶķƘƙǨǩḰḱḲḳḴḵLlĹĺĻļĽľĿŀÅłƚLjȴɫɬɭḶḷḸḹḺḻḼḽMmɱḾḿṀá¹á¹‚ṃNnÑñŃńŅņŇňÆɲƞȠNjǸǹȵɳṄṅṆṇṈṉṊṋOoÒòÓóÔôÕõÖöØøŌÅÅŽÅÅőƟƠơǑǒǪǫǬǭǾǿȌÈÈŽÈȪȫȬȭȮȯȰȱṌá¹á¹Žá¹á¹á¹‘ṒṓỌá»á»Žá»á»á»‘ỒồỔổỖỗỘộỚớỜá»á»žá»Ÿá» á»¡á»¢á»£PpƤƥṔṕṖṗQqÊ RrŔŕŖŗŘřÈȑȒȓɼɽɾṘṙṚṛṜá¹á¹žá¹ŸSsŚśŜÅŞşŠšȘșʂṠṡṢṣṤṥṦṧṨṩTtŢţŤťŦŧƫƬƭƮʈȚțȶṪṫṬṭṮṯṰṱẗUuÙùÚúÛûÜüŨũŪūŬŭŮůŰűŲųƯưǓǔǕǖǗǘǙǚǛǜȔȕȖȗṲṳṴṵṶṷṸṹṺṻỤụỦủỨứỪừỬửỮữỰựVvƲʋṼṽṾṿWwŴŵẀáºáº‚ẃẄẅẆẇẈẉẘXxẊẋẌáºYyÃýÿŸŶŷƳƴȲȳẎáºáº™á»²á»³á»´á»µá»¶á»·á»¸á»¹ZzŹźŻżŽžƵƶȤȥÊÊ‘áºáº‘ẒẓẔẕẕ" lang="en"/>
+<l:gentext key="normalize.sort.output" text="AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBCCCCCCCCCCCCCCCCCDDDDDDDDDDDDDDDDDDDDDDDDEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEFFFFFFGGGGGGGGGGGGGGGGGGGGHHHHHHHHHHHHHHHHHHHHIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIJJJJJJKKKKKKKKKKKKKKLLLLLLLLLLLLLLLLLLLLLLLLLLMMMMMMMMMNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOPPPPPPPPQQQRRRRRRRRRRRRRRRRRRRRRRRSSSSSSSSSSSSSSSSSSSSSSSTTTTTTTTTTTTTTTTTTTTTTTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUVVVVVVVVWWWWWWWWWWWWWWWXXXXXXYYYYYYYYYYYYYYYYYYYYYYYZZZZZZZZZZZZZZZZZZZZZ" lang="en"/>
+<l:dingbat key="startquote" text="«"/>
+<l:dingbat key="endquote" text="»"/>
+<l:dingbat key="nestedstartquote" text="„"/>
+<l:dingbat key="nestedendquote" text="“"/>
+<l:dingbat key="singlestartquote" text="‚"/>
+<l:dingbat key="singleendquote" text="‘"/>
+<l:dingbat key="bullet" text="•"/>
+<l:gentext key="hyphenation-character" text="-"/>
+<l:gentext key="hyphenation-push-character-count" text="2"/>
+<l:gentext key="hyphenation-remain-character-count" text="3"/>
+<l:context name="styles"><l:template name="person-name" text="овог-нÑÑ€"/>
+</l:context>
+<l:context name="title"><l:template name="abstract" text="%t"/>
+<l:template name="acknowledgements" text="%t" lang="en"/>
+<l:template name="answer" text="%t"/>
+<l:template name="appendix" text="ХавÑралт %n. %t"/>
+<l:template name="article" text="%t"/>
+<l:template name="authorblurb" text="%t"/>
+<l:template name="bibliodiv" text="%t"/>
+<l:template name="biblioentry" text="%t"/>
+<l:template name="bibliography" text="%t"/>
+<l:template name="bibliolist" text="%t"/>
+<l:template name="bibliomixed" text="%t"/>
+<l:template name="bibliomset" text="%t"/>
+<l:template name="biblioset" text="%t"/>
+<l:template name="blockquote" text="%t"/>
+<l:template name="book" text="%t"/>
+<l:template name="calloutlist" text="%t"/>
+<l:template name="caution" text="%t"/>
+<l:template name="chapter" text="БүлÑг %n. %t"/>
+<l:template name="colophon" text="%t"/>
+<l:template name="dedication" text="%t"/>
+<l:template name="equation" text="ТÑгшитгÑл %n. %t"/>
+<l:template name="example" text="ЖишÑÑ %n. %t"/>
+<l:template name="figure" text="Зураг %n. %t"/>
+<l:template name="foil" text="%t"/>
+<l:template name="foilgroup" text="%t"/>
+<l:template name="formalpara" text="%t"/>
+<l:template name="glossary" text="%t"/>
+<l:template name="glossdiv" text="%t"/>
+<l:template name="glosslist" text="%t"/>
+<l:template name="glossentry" text="%t"/>
+<l:template name="important" text="%t"/>
+<l:template name="index" text="%t"/>
+<l:template name="indexdiv" text="%t"/>
+<l:template name="itemizedlist" text="%t"/>
+<l:template name="legalnotice" text="%t"/>
+<l:template name="listitem" text=""/>
+<l:template name="lot" text="%t"/>
+<l:template name="msg" text="%t"/>
+<l:template name="msgexplan" text="%t"/>
+<l:template name="msgmain" text="%t"/>
+<l:template name="msgrel" text="%t"/>
+<l:template name="msgset" text="%t"/>
+<l:template name="msgsub" text="%t"/>
+<l:template name="note" text="%t"/>
+<l:template name="orderedlist" text="%t"/>
+<l:template name="part" text="Ñ…ÑÑÑг %n. %t"/>
+<l:template name="partintro" text="%t"/>
+<l:template name="preface" text="%t"/>
+<l:template name="procedure" text="%t"/>
+<l:template name="procedure.formal" text="ГүйцÑтгÑл %n. %t"/>
+<l:template name="productionset" text="%t"/>
+<l:template name="productionset.formal" text="БүтÑÑгдÑхүүн %n"/>
+<l:template name="qandadiv" text="%t"/>
+<l:template name="qandaentry" text="%t"/>
+<l:template name="qandaset" text="%t"/>
+<l:template name="question" text="Ð: %n"/>
+<l:template name="refentry" text="%t"/>
+<l:template name="reference" text="%t"/>
+<l:template name="refsection" text="%t"/>
+<l:template name="refsect1" text="%t"/>
+<l:template name="refsect2" text="%t"/>
+<l:template name="refsect3" text="%t"/>
+<l:template name="refsynopsisdiv" text="%t"/>
+<l:template name="refsynopsisdivinfo" text="%t"/>
+<l:template name="segmentedlist" text="%t"/>
+<l:template name="set" text="%t"/>
+<l:template name="setindex" text="%t"/>
+<l:template name="sidebar" text="%t"/>
+<l:template name="step" text="%t"/>
+<l:template name="table" text="Ð¥Ò¯ÑнÑгт %n. %t"/>
+<l:template name="task" text="%t"/>
+<l:template name="tasksummary" text="%t"/>
+<l:template name="taskprerequisites" text="%t"/>
+<l:template name="taskrelated" text="%t"/>
+<l:template name="tip" text="%t"/>
+<l:template name="toc" text="%t"/>
+<l:template name="variablelist" text="%t"/>
+<l:template name="varlistentry" text="" lang="en"/>
+<l:template name="warning" text="%t"/>
+</l:context>
+<l:context name="title-unnumbered"><l:template name="appendix" text="%t"/>
+<l:template name="article/appendix" text="%t"/>
+<l:template name="bridgehead" text="%t"/>
+<l:template name="chapter" text="%t"/>
+<l:template name="sect1" text="%t"/>
+<l:template name="sect2" text="%t"/>
+<l:template name="sect3" text="%t"/>
+<l:template name="sect4" text="%t"/>
+<l:template name="sect5" text="%t"/>
+<l:template name="section" text="%t"/>
+<l:template name="simplesect" text="%t"/>
+<l:template name="part" text="%t"/>
+</l:context>
+<l:context name="title-numbered"><l:template name="appendix" text="ХавÑралт %n. %t"/>
+<l:template name="article/appendix" text="%n. %t"/>
+<l:template name="bridgehead" text="%n. %t"/>
+<l:template name="chapter" text="БүлÑг %n. %t"/>
+<l:template name="part" text="Ñ…ÑÑÑг %n. %t"/>
+<l:template name="sect1" text="%n. %t"/>
+<l:template name="sect2" text="%n. %t"/>
+<l:template name="sect3" text="%n. %t"/>
+<l:template name="sect4" text="%n. %t"/>
+<l:template name="sect5" text="%n. %t"/>
+<l:template name="section" text="%n. %t"/>
+<l:template name="simplesect" text="%n. %t"/>
+</l:context>
+<l:context name="subtitle"><l:template name="appendix" text="%s"/>
+<l:template name="acknowledgements" text="%s" lang="en"/>
+<l:template name="article" text="%s"/>
+<l:template name="bibliodiv" text="%s"/>
+<l:template name="biblioentry" text="%s"/>
+<l:template name="bibliography" text="%s"/>
+<l:template name="bibliomixed" text="%s"/>
+<l:template name="bibliomset" text="%s"/>
+<l:template name="biblioset" text="%s"/>
+<l:template name="book" text="%s"/>
+<l:template name="chapter" text="%s"/>
+<l:template name="colophon" text="%s"/>
+<l:template name="dedication" text="%s"/>
+<l:template name="glossary" text="%s"/>
+<l:template name="glossdiv" text="%s"/>
+<l:template name="index" text="%s"/>
+<l:template name="indexdiv" text="%s"/>
+<l:template name="lot" text="%s"/>
+<l:template name="part" text="%s"/>
+<l:template name="partintro" text="%s"/>
+<l:template name="preface" text="%s"/>
+<l:template name="refentry" text="%s"/>
+<l:template name="reference" text="%s"/>
+<l:template name="refsection" text="%s"/>
+<l:template name="refsect1" text="%s"/>
+<l:template name="refsect2" text="%s"/>
+<l:template name="refsect3" text="%s"/>
+<l:template name="refsynopsisdiv" text="%s"/>
+<l:template name="sect1" text="%s"/>
+<l:template name="sect2" text="%s"/>
+<l:template name="sect3" text="%s"/>
+<l:template name="sect4" text="%s"/>
+<l:template name="sect5" text="%s"/>
+<l:template name="section" text="%s"/>
+<l:template name="set" text="%s"/>
+<l:template name="setindex" text="%s"/>
+<l:template name="sidebar" text="%s"/>
+<l:template name="simplesect" text="%s"/>
+<l:template name="toc" text="%s"/>
+</l:context>
+<l:context name="xref"><l:template name="abstract" text="%t"/>
+<l:template name="acknowledgements" text="%t" lang="en"/>
+<l:template name="answer" text="Х: %n"/>
+<l:template name="appendix" text="%t"/>
+<l:template name="article" text="%t"/>
+<l:template name="authorblurb" text="%t"/>
+<l:template name="bibliodiv" text="%t"/>
+<l:template name="bibliography" text="%t"/>
+<l:template name="bibliomset" text="%t"/>
+<l:template name="biblioset" text="%t"/>
+<l:template name="blockquote" text="%t"/>
+<l:template name="book" text="%t"/>
+<l:template name="calloutlist" text="%t"/>
+<l:template name="caution" text="%t"/>
+<l:template name="chapter" text="%t"/>
+<l:template name="colophon" text="%t"/>
+<l:template name="constraintdef" text="%t"/>
+<l:template name="dedication" text="%t"/>
+<l:template name="equation" text="%t"/>
+<l:template name="example" text="%t"/>
+<l:template name="figure" text="%t"/>
+<l:template name="foil" text="%t"/>
+<l:template name="foilgroup" text="%t"/>
+<l:template name="formalpara" text="%t"/>
+<l:template name="glossary" text="%t"/>
+<l:template name="glossdiv" text="%t"/>
+<l:template name="important" text="%t"/>
+<l:template name="index" text="%t"/>
+<l:template name="indexdiv" text="%t"/>
+<l:template name="itemizedlist" text="%t"/>
+<l:template name="legalnotice" text="%t"/>
+<l:template name="listitem" text="%n"/>
+<l:template name="lot" text="%t"/>
+<l:template name="msg" text="%t"/>
+<l:template name="msgexplan" text="%t"/>
+<l:template name="msgmain" text="%t"/>
+<l:template name="msgrel" text="%t"/>
+<l:template name="msgset" text="%t"/>
+<l:template name="msgsub" text="%t"/>
+<l:template name="note" text="%t"/>
+<l:template name="orderedlist" text="%t"/>
+<l:template name="part" text="%t"/>
+<l:template name="partintro" text="%t"/>
+<l:template name="preface" text="%t"/>
+<l:template name="procedure" text="%t"/>
+<l:template name="productionset" text="%t"/>
+<l:template name="qandadiv" text="%t"/>
+<l:template name="qandaentry" text="Ð: %n"/>
+<l:template name="qandaset" text="%t"/>
+<l:template name="question" text="Ð: %n"/>
+<l:template name="reference" text="%t"/>
+<l:template name="refsynopsisdiv" text="%t"/>
+<l:template name="segmentedlist" text="%t"/>
+<l:template name="set" text="%t"/>
+<l:template name="setindex" text="%t"/>
+<l:template name="sidebar" text="%t"/>
+<l:template name="table" text="%t"/>
+<l:template name="task" text="%t"/>
+<l:template name="tip" text="%t"/>
+<l:template name="toc" text="%t"/>
+<l:template name="variablelist" text="%t"/>
+<l:template name="varlistentry" text="%n"/>
+<l:template name="warning" text="%t"/>
+<l:template name="olink.document.citation" text=" %o "/>
+<l:template name="olink.page.citation" text=" (Ñ…ÑƒÑƒÐ´Ð°Ñ %p)"/>
+<l:template name="page.citation" text=" [%p]"/>
+<l:template name="page" text="(Ð¥ÑƒÑƒÐ´Ð°Ñ %p)"/>
+<l:template name="docname" text=" %o "/>
+<l:template name="docnamelong" text=" %o гарчигтай баримтад"/>
+<l:template name="pageabbrev" text="(Ð¥. %p)"/>
+<l:template name="Page" text="Ð¥ÑƒÑƒÐ´Ð°Ñ %p"/>
+<l:template name="bridgehead" text="«%t»"/>
+<l:template name="refsection" text="«%t»"/>
+<l:template name="refsect1" text="«%t»"/>
+<l:template name="refsect2" text="«%t»"/>
+<l:template name="refsect3" text="«%t»"/>
+<l:template name="sect1" text="«%t»"/>
+<l:template name="sect2" text="«%t»"/>
+<l:template name="sect3" text="«%t»"/>
+<l:template name="sect4" text="«%t»"/>
+<l:template name="sect5" text="«%t»"/>
+<l:template name="section" text="«%t»"/>
+<l:template name="simplesect" text="«%t»"/>
+</l:context>
+<l:context name="xref-number"><l:template name="answer" text="Х: %n"/>
+<l:template name="appendix" text="ХавÑралт %n"/>
+<l:template name="bridgehead" text="Ð¥ÑÑÑг %n"/>
+<l:template name="chapter" text="БүлÑг %n"/>
+<l:template name="equation" text="ТÑгшитгÑл %n"/>
+<l:template name="example" text="ЖишÑÑ %n"/>
+<l:template name="figure" text="Зураг %n"/>
+<l:template name="part" text="Ñ…ÑÑÑг %n"/>
+<l:template name="procedure" text="ГүйцÑтгÑл %n"/>
+<l:template name="productionset" text="БүтÑÑгдÑхүүн %n"/>
+<l:template name="qandadiv" text="Рба Х %n"/>
+<l:template name="qandaentry" text="Ð: %n"/>
+<l:template name="question" text="Ð: %n"/>
+<l:template name="sect1" text="Ð¥ÑÑÑг %n"/>
+<l:template name="sect2" text="Ð¥ÑÑÑг %n"/>
+<l:template name="sect3" text="Ð¥ÑÑÑг %n"/>
+<l:template name="sect4" text="Ð¥ÑÑÑг %n"/>
+<l:template name="sect5" text="Ð¥ÑÑÑг %n"/>
+<l:template name="section" text="Ð¥ÑÑÑг %n"/>
+<l:template name="table" text="Ð¥Ò¯ÑнÑгт %n"/>
+</l:context>
+<l:context name="xref-number-and-title"><l:template name="appendix" text="ХавÑралт %n, %t"/>
+<l:template name="bridgehead" text="Ð¥ÑÑÑг %n, «%t»"/>
+<l:template name="chapter" text="БүлÑг %n, %t"/>
+<l:template name="equation" text="ТÑгшитгÑл %n, «%t»"/>
+<l:template name="example" text="ЖишÑÑ %n, «%t»"/>
+<l:template name="figure" text="Зураг %n, «%t»"/>
+<l:template name="part" text="Ñ…ÑÑÑг %n, «%t»"/>
+<l:template name="procedure" text="ГүйцÑтгÑл %n, «%t»"/>
+<l:template name="productionset" text="БүтÑÑгдÑхүүн %n, «%t»"/>
+<l:template name="qandadiv" text="Рба Х %n, «%t»"/>
+<l:template name="refsect1" text="Ð¥ÑÑгийн нÑÑ€ «%t»"/>
+<l:template name="refsect2" text="Ð¥ÑÑгийн нÑÑ€ «%t»"/>
+<l:template name="refsect3" text="Ð¥ÑÑгийн нÑÑ€ «%t»"/>
+<l:template name="refsection" text="Ð¥ÑÑгийн нÑÑ€ «%t»"/>
+<l:template name="sect1" text="Ð¥ÑÑÑг %n, «%t»"/>
+<l:template name="sect2" text="Ð¥ÑÑÑг %n, «%t»"/>
+<l:template name="sect3" text="Ð¥ÑÑÑг %n, «%t»"/>
+<l:template name="sect4" text="Ð¥ÑÑÑг %n, «%t»"/>
+<l:template name="sect5" text="Ð¥ÑÑÑг %n, «%t»"/>
+<l:template name="section" text="Ð¥ÑÑÑг %n, «%t»"/>
+<l:template name="simplesect" text="Ð¥ÑÑгийн нÑÑ€ «%t»"/>
+<l:template name="table" text="Ð¥Ò¯ÑнÑгт %n, «%t»"/>
+</l:context>
+<l:context name="authorgroup"><l:template name="sep" text=", "/>
+<l:template name="sep2" text=" ба "/>
+<l:template name="seplast" text=", ба "/>
+</l:context>
+<l:context name="glossary"><l:template name="see" text="харна уу %t."/>
+<l:template name="seealso" text="Ð‘Ð°Ñ Ñ…Ð°Ñ€Ð½Ð° уу %t."/>
+<l:template name="seealso-separator" text=", "/>
+</l:context>
+<l:context name="msgset"><l:template name="MsgAud" text="Зориулалт: "/>
+<l:template name="MsgLevel" text="Түвшин: "/>
+<l:template name="MsgOrig" text="Ò®Ò¯ÑÑл: "/>
+</l:context>
+<l:context name="datetime"><l:template name="format" text="Y/m/d"/>
+</l:context>
+<l:context name="termdef"><l:template name="prefix" text="[Тодорхойлолт: "/>
+<l:template name="suffix" text="]"/>
+</l:context>
+<l:context name="datetime-full"><l:template name="January" text="Хулгана Ñарын"/>
+<l:template name="February" text="ҮхÑÑ€ Ñарын"/>
+<l:template name="March" text="Бар Ñарын"/>
+<l:template name="April" text="Туулай Ñарын"/>
+<l:template name="May" text="Луу Ñарын"/>
+<l:template name="June" text="Могой Ñарын"/>
+<l:template name="July" text="Морь Ñарын"/>
+<l:template name="August" text="Хонь Ñарын"/>
+<l:template name="September" text="Бич Ñарын"/>
+<l:template name="October" text="Тахиа Ñарын"/>
+<l:template name="November" text="Ðохой Ñарын"/>
+<l:template name="December" text="Гахай Ñарын"/>
+<l:template name="Monday" text="Даваа"/>
+<l:template name="Tuesday" text="ÐœÑгмар"/>
+<l:template name="Wednesday" text="Лхагва"/>
+<l:template name="Thursday" text="ПүрÑв"/>
+<l:template name="Friday" text="БааÑан"/>
+<l:template name="Saturday" text="БÑмба"/>
+<l:template name="Sunday" text="ÐÑм"/>
+</l:context>
+<l:context name="datetime-abbrev"><l:template name="Jan" text="Хул"/>
+<l:template name="Feb" text="ҮхÑ"/>
+<l:template name="Mar" text="Бар"/>
+<l:template name="Apr" text="Туу"/>
+<l:template name="May" text="Луу"/>
+<l:template name="Jun" text="Мог"/>
+<l:template name="Jul" text="Мор"/>
+<l:template name="Aug" text="Хон"/>
+<l:template name="Sep" text="Бич"/>
+<l:template name="Oct" text="Тах"/>
+<l:template name="Nov" text="Ðох"/>
+<l:template name="Dec" text="Гах"/>
+<l:template name="Mon" text="Да"/>
+<l:template name="Tue" text="ÐœÑ"/>
+<l:template name="Wed" text="Лх"/>
+<l:template name="Thu" text="Пү"/>
+<l:template name="Fri" text="Ба"/>
+<l:template name="Sat" text="БÑ"/>
+<l:template name="Sun" text="ÐÑ"/>
+</l:context>
+<l:context name="htmlhelp"><l:template name="langcode" text="0x0450 Mongolian (MONGOLIA)"/>
+</l:context>
+<l:context name="index"><l:template name="term-separator" text=", "/>
+<l:template name="number-separator" text=", "/>
+<l:template name="range-separator" text="-"/>
+</l:context>
+<l:context name="iso690"><l:template name="lastfirst.sep" text=", " lang="en"/>
+<l:template name="alt.person.two.sep" text=" – " lang="en"/>
+<l:template name="alt.person.last.sep" text=" – " lang="en"/>
+<l:template name="alt.person.more.sep" text=" – " lang="en"/>
+<l:template name="primary.editor" text=" (ed.)" lang="en"/>
+<l:template name="primary.many" text=", et al." lang="en"/>
+<l:template name="primary.sep" text=". " lang="en"/>
+<l:template name="submaintitle.sep" text=": " lang="en"/>
+<l:template name="title.sep" text=". " lang="en"/>
+<l:template name="othertitle.sep" text=", " lang="en"/>
+<l:template name="medium1" text=" [" lang="en"/>
+<l:template name="medium2" text="]" lang="en"/>
+<l:template name="secondary.person.sep" text="; " lang="en"/>
+<l:template name="secondary.sep" text=". " lang="en"/>
+<l:template name="respons.sep" text=". " lang="en"/>
+<l:template name="edition.sep" text=". " lang="en"/>
+<l:template name="edition.serial.sep" text=", " lang="en"/>
+<l:template name="issuing.range" text="-" lang="en"/>
+<l:template name="issuing.div" text=", " lang="en"/>
+<l:template name="issuing.sep" text=". " lang="en"/>
+<l:template name="partnr.sep" text=". " lang="en"/>
+<l:template name="placepubl.sep" text=": " lang="en"/>
+<l:template name="publyear.sep" text=", " lang="en"/>
+<l:template name="pubinfo.sep" text=". " lang="en"/>
+<l:template name="spec.pubinfo.sep" text=", " lang="en"/>
+<l:template name="upd.sep" text=", " lang="en"/>
+<l:template name="datecit1" text=" [cited " lang="en"/>
+<l:template name="datecit2" text="]" lang="en"/>
+<l:template name="extent.sep" text=". " lang="en"/>
+<l:template name="locs.sep" text=", " lang="en"/>
+<l:template name="location.sep" text=". " lang="en"/>
+<l:template name="serie.sep" text=". " lang="en"/>
+<l:template name="notice.sep" text=". " lang="en"/>
+<l:template name="access" text="Available " lang="en"/>
+<l:template name="acctoo" text="Also available " lang="en"/>
+<l:template name="onwww" text="from World Wide Web" lang="en"/>
+<l:template name="oninet" text="from Internet" lang="en"/>
+<l:template name="access.end" text=": " lang="en"/>
+<l:template name="link1" text="&lt;" lang="en"/>
+<l:template name="link2" text="&gt;" lang="en"/>
+<l:template name="access.sep" text=". " lang="en"/>
+<l:template name="isbn" text="ISBN " lang="en"/>
+<l:template name="issn" text="ISSN " lang="en"/>
+<l:template name="stdnum.sep" text=". " lang="en"/>
+<l:template name="patcountry.sep" text=". " lang="en"/>
+<l:template name="pattype.sep" text=", " lang="en"/>
+<l:template name="patnum.sep" text=". " lang="en"/>
+<l:template name="patdate.sep" text=". " lang="en"/>
+</l:context><l:letters><l:l i="-1"/>
+<l:l i="0">ТÑмдÑгтүүд</l:l>
+<l:l i="10">A</l:l>
+<l:l i="10">a</l:l>
+<l:l i="20">B</l:l>
+<l:l i="20">b</l:l>
+<l:l i="30">C</l:l>
+<l:l i="30">c</l:l>
+<l:l i="40">D</l:l>
+<l:l i="40">d</l:l>
+<l:l i="50">E</l:l>
+<l:l i="50">e</l:l>
+<l:l i="60">F</l:l>
+<l:l i="60">f</l:l>
+<l:l i="70">G</l:l>
+<l:l i="70">g</l:l>
+<l:l i="80">H</l:l>
+<l:l i="80">h</l:l>
+<l:l i="90">I</l:l>
+<l:l i="90">i</l:l>
+<l:l i="100">J</l:l>
+<l:l i="100">j</l:l>
+<l:l i="110">K</l:l>
+<l:l i="110">k</l:l>
+<l:l i="120">L</l:l>
+<l:l i="120">l</l:l>
+<l:l i="130">M</l:l>
+<l:l i="130">m</l:l>
+<l:l i="140">N</l:l>
+<l:l i="140">n</l:l>
+<l:l i="150">O</l:l>
+<l:l i="150">o</l:l>
+<l:l i="160">P</l:l>
+<l:l i="160">p</l:l>
+<l:l i="170">Q</l:l>
+<l:l i="170">q</l:l>
+<l:l i="180">R</l:l>
+<l:l i="180">r</l:l>
+<l:l i="190">S</l:l>
+<l:l i="190">s</l:l>
+<l:l i="200">T</l:l>
+<l:l i="200">t</l:l>
+<l:l i="210">U</l:l>
+<l:l i="210">u</l:l>
+<l:l i="220">V</l:l>
+<l:l i="220">v</l:l>
+<l:l i="230">W</l:l>
+<l:l i="230">w</l:l>
+<l:l i="240">X</l:l>
+<l:l i="240">x</l:l>
+<l:l i="250">Y</l:l>
+<l:l i="250">y</l:l>
+<l:l i="260">Z</l:l>
+<l:l i="260">z</l:l>
+<l:l i="270">Ð</l:l>
+<l:l i="270">а</l:l>
+<l:l i="280">Б</l:l>
+<l:l i="280">б</l:l>
+<l:l i="290">Ð’</l:l>
+<l:l i="290">в</l:l>
+<l:l i="300">Г</l:l>
+<l:l i="300">г</l:l>
+<l:l i="310">Д</l:l>
+<l:l i="310">д</l:l>
+<l:l i="320">Е</l:l>
+<l:l i="320">е</l:l>
+<l:l i="330">Ð</l:l>
+<l:l i="330">Ñ‘</l:l>
+<l:l i="340">Ж</l:l>
+<l:l i="340">ж</l:l>
+<l:l i="350">З</l:l>
+<l:l i="350">з</l:l>
+<l:l i="360">И</l:l>
+<l:l i="360">и</l:l>
+<l:l i="370">Й</l:l>
+<l:l i="370">й</l:l>
+<l:l i="380">К</l:l>
+<l:l i="380">к</l:l>
+<l:l i="390">Л</l:l>
+<l:l i="390">л</l:l>
+<l:l i="400">М</l:l>
+<l:l i="400">м</l:l>
+<l:l i="410">Ð</l:l>
+<l:l i="410">н</l:l>
+<l:l i="420">О</l:l>
+<l:l i="420">о</l:l>
+<l:l i="430">Ó¨</l:l>
+<l:l i="430">Ó©</l:l>
+<l:l i="440">П</l:l>
+<l:l i="440">п</l:l>
+<l:l i="450">Р</l:l>
+<l:l i="450">Ñ€</l:l>
+<l:l i="460">С</l:l>
+<l:l i="460">Ñ</l:l>
+<l:l i="470">Т</l:l>
+<l:l i="470">Ñ‚</l:l>
+<l:l i="480">У</l:l>
+<l:l i="480">у</l:l>
+<l:l i="490">Ò®</l:l>
+<l:l i="490">Ò¯</l:l>
+<l:l i="500">Ф</l:l>
+<l:l i="500">Ñ„</l:l>
+<l:l i="510">Ð¥</l:l>
+<l:l i="510">Ñ…</l:l>
+<l:l i="520">Ц</l:l>
+<l:l i="520">ц</l:l>
+<l:l i="530">Ч</l:l>
+<l:l i="530">ч</l:l>
+<l:l i="540">Ш</l:l>
+<l:l i="540">ш</l:l>
+<l:l i="550">Щ</l:l>
+<l:l i="550">щ</l:l>
+<l:l i="560">Ъ</l:l>
+<l:l i="560">ÑŠ</l:l>
+<l:l i="570">Ы</l:l>
+<l:l i="570">Ñ‹</l:l>
+<l:l i="580">Ь</l:l>
+<l:l i="580">ь</l:l>
+<l:l i="590">Э</l:l>
+<l:l i="590">Ñ</l:l>
+<l:l i="600">Ю</l:l>
+<l:l i="600">ÑŽ</l:l>
+<l:l i="610">Я</l:l>
+<l:l i="610">Ñ</l:l>
+</l:letters>
+</l:l10n>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/mr.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/mr.xml
new file mode 100644
index 0000000..798fff5
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/mr.xml
@@ -0,0 +1,660 @@
+<?xml version="1.0" encoding="utf-8"?>
+<l:l10n xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0" language="mr" english-language-name="Marathi">
+
+<!-- * This file is generated automatically. -->
+<!-- * To submit changes to this file upstream (to the DocBook Project) -->
+<!-- * do not submit an edited version of this file. Instead, submit an -->
+<!-- * edited version of the source file at the following location: -->
+<!-- * -->
+<!-- * https://docbook.svn.sourceforge.net/svnroot/docbook/trunk/gentext/locale/mr.xml -->
+<!-- * -->
+<!-- * E-mail the edited mr.xml source file to: -->
+<!-- * -->
+<!-- * docbook-developers@lists.sourceforge.net -->
+
+<!-- ******************************************************************** -->
+
+<!-- This file is part of the XSL DocBook Stylesheet distribution. -->
+<!-- See ../README or http://docbook.sf.net/release/xsl/current/ for -->
+<!-- copyright and other information. -->
+
+<!-- ******************************************************************** -->
+<!-- In these files, % with a letter is used for a placeholder: -->
+<!-- %t is the current element's title -->
+<!-- %s is the current element's subtitle (if applicable)-->
+<!-- %n is the current element's number label-->
+<!-- %p is the current element's page number (if applicable)-->
+<!-- ******************************************************************** -->
+
+
+<l:gentext key="Abstract" text="सारांश"/>
+<l:gentext key="abstract" text="सारांश"/>
+<l:gentext key="Acknowledgements" text="आभार"/>
+<l:gentext key="acknowledgements" text="आभार"/>
+<l:gentext key="Answer" text="A:"/>
+<l:gentext key="answer" text="a:"/>
+<l:gentext key="Appendix" text="परिशिषà¥à¤Ÿ"/>
+<l:gentext key="appendix" text="परिशिषà¥à¤Ÿ"/>
+<l:gentext key="Article" text="लेख"/>
+<l:gentext key="article" text="लेख"/>
+<l:gentext key="Author" text="लेखक"/>
+<l:gentext key="Bibliography" text="गà¥à¤°à¤‚थसूची"/>
+<l:gentext key="bibliography" text="गà¥à¤°à¤‚थसूची"/>
+<l:gentext key="Book" text="पà¥à¤¸à¥à¤¤à¤•"/>
+<l:gentext key="book" text="पà¥à¤¸à¥à¤¤à¤•"/>
+<l:gentext key="CAUTION" text="सावधगिरी"/>
+<l:gentext key="Caution" text="सावधगिरी"/>
+<l:gentext key="caution" text="सावधगिरी"/>
+<l:gentext key="Chapter" text="धडा"/>
+<l:gentext key="chapter" text="धडा"/>
+<l:gentext key="Colophon" text="कोलोफोन"/>
+<l:gentext key="colophon" text="कोलोफोन"/>
+<l:gentext key="Copyright" text="सरà¥à¤µà¤¾à¤¹à¤•à¥à¤•à¤¾à¤§à¤¿à¤•à¤¾à¤°"/>
+<l:gentext key="copyright" text="सरà¥à¤µà¤¾à¤¹à¤•à¥à¤•à¤¾à¤§à¤¿à¤•à¤¾à¤°"/>
+<l:gentext key="Dedication" text="समरà¥à¤ªà¤£"/>
+<l:gentext key="dedication" text="समरà¥à¤ªà¤£"/>
+<l:gentext key="Edition" text="आवृतà¥à¤¤à¥€"/>
+<l:gentext key="edition" text="आवृतà¥à¤¤à¥€"/>
+<l:gentext key="Editor" text="संपादक"/>
+<l:gentext key="Equation" text="समीकरण"/>
+<l:gentext key="equation" text="समीकरण"/>
+<l:gentext key="Example" text="उदाहरण"/>
+<l:gentext key="example" text="उदाहरण"/>
+<l:gentext key="Figure" text="आकृती"/>
+<l:gentext key="figure" text="आकृती"/>
+<l:gentext key="Glossary" text="शबà¥à¤¦à¤•à¥‹à¤·"/>
+<l:gentext key="glossary" text="शबà¥à¤¦à¤•à¥‹à¤·"/>
+<l:gentext key="GlossSee" text="पहा"/>
+<l:gentext key="glosssee" text="पहा"/>
+<l:gentext key="GlossSeeAlso" text="हे ही पहा"/>
+<l:gentext key="glossseealso" text="हे ही पहा"/>
+<l:gentext key="IMPORTANT" text="महतà¥à¤¤à¤¾à¤µà¤šà¥‡"/>
+<l:gentext key="important" text="महतà¥à¤¤à¤¾à¤µà¤šà¥‡"/>
+<l:gentext key="Important" text="महतà¥à¤¤à¤¾à¤µà¤šà¥‡"/>
+<l:gentext key="Index" text="इंडेकà¥à¤¸à¥"/>
+<l:gentext key="index" text="इंडेकà¥à¤¸à¥"/>
+<l:gentext key="ISBN" text="ISBN"/>
+<l:gentext key="isbn" text="isbn"/>
+<l:gentext key="LegalNotice" text="कायदेशीर सूचना"/>
+<l:gentext key="legalnotice" text="कायदेशीर सूचना"/>
+<l:gentext key="MsgAud" text="पà¥à¤°à¤•à¥à¤·à¥‡à¤•"/>
+<l:gentext key="msgaud" text="पà¥à¤°à¤•à¥à¤·à¥‡à¤•"/>
+<l:gentext key="MsgLevel" text="सà¥à¤¤à¤°"/>
+<l:gentext key="msglevel" text="सà¥à¤¤à¤°"/>
+<l:gentext key="MsgOrig" text="मà¥à¤³"/>
+<l:gentext key="msgorig" text="मà¥à¤³"/>
+<l:gentext key="NOTE" text="टीप"/>
+<l:gentext key="Note" text="टीप"/>
+<l:gentext key="note" text="टीप"/>
+<l:gentext key="Part" text="भाग"/>
+<l:gentext key="part" text="भाग"/>
+<l:gentext key="Preface" text="पà¥à¤°à¤¸à¥à¤¤à¤¾à¤µà¤¨à¤¾"/>
+<l:gentext key="preface" text="पà¥à¤°à¤¸à¥à¤¤à¤¾à¤µà¤¨à¤¾"/>
+<l:gentext key="Procedure" text="कारà¥à¤¯à¤ªà¤¦à¥à¤§à¤¤"/>
+<l:gentext key="procedure" text="कारà¥à¤¯à¤ªà¤¦à¥à¤§à¤¤"/>
+<l:gentext key="ProductionSet" text="पà¥à¤°à¤¸à¥à¤¤à¥à¤¤à¤¿"/>
+<l:gentext key="PubDate" text="पà¥à¤°à¤•à¤¾à¤¶à¤¨ दिनांक"/>
+<l:gentext key="pubdate" text="पà¥à¤°à¤•à¤¾à¤¶à¤¨ दिनांक"/>
+<l:gentext key="Published" text="पà¥à¤°à¤•à¤¾à¤¶à¥€à¤¤"/>
+<l:gentext key="published" text="पà¥à¤°à¤•à¤¾à¤¶à¥€à¤¤"/>
+<l:gentext key="Publisher" text="पà¥à¤°à¤•à¤¾à¤¶à¤•"/>
+<l:gentext key="Qandadiv" text="Q &amp; A"/>
+<l:gentext key="qandadiv" text="Q &amp; A"/>
+<l:gentext key="QandASet" text="नेहमी विचारलेली पà¥à¤°à¤¶à¥à¤¨"/>
+<l:gentext key="Question" text="Q:"/>
+<l:gentext key="question" text="q:"/>
+<l:gentext key="RefEntry" text="पान"/>
+<l:gentext key="refentry" text="पान"/>
+<l:gentext key="Reference" text="संदरà¥à¤­"/>
+<l:gentext key="reference" text="संदरà¥à¤­"/>
+<l:gentext key="References" text="संदरà¥à¤­"/>
+<l:gentext key="RefName" text="नाव"/>
+<l:gentext key="refname" text="नाव"/>
+<l:gentext key="RefSection" text="विभाग"/>
+<l:gentext key="refsection" text="विभाग"/>
+<l:gentext key="RefSynopsisDiv" text="रूपरेशा"/>
+<l:gentext key="refsynopsisdiv" text="रूपरेशा"/>
+<l:gentext key="RevHistory" text="आवृतà¥à¤¤à¥€ हतिहास"/>
+<l:gentext key="revhistory" text="आवृतà¥à¤¤à¥€ हतिहास"/>
+<l:gentext key="revision" text="आवृतà¥à¤¤à¥€"/>
+<l:gentext key="Revision" text="आवृतà¥à¤¤à¥€"/>
+<l:gentext key="sect1" text="विभाग"/>
+<l:gentext key="sect2" text="विभाग"/>
+<l:gentext key="sect3" text="विभाग"/>
+<l:gentext key="sect4" text="विभाग"/>
+<l:gentext key="sect5" text="विभाग"/>
+<l:gentext key="section" text="विभाग"/>
+<l:gentext key="Section" text="विभाग"/>
+<l:gentext key="see" text="पहा"/>
+<l:gentext key="See" text="पहा"/>
+<l:gentext key="seealso" text="हे ही पहा"/>
+<l:gentext key="Seealso" text="हे ही पहा"/>
+<l:gentext key="SeeAlso" text="हे ही पहा"/>
+<l:gentext key="set" text="गट"/>
+<l:gentext key="Set" text="गट"/>
+<l:gentext key="setindex" text="इंडेकà¥à¤¸à¥ गट"/>
+<l:gentext key="SetIndex" text="इंडेकà¥à¤¸à¥ गट"/>
+<l:gentext key="Sidebar" text="बाजूची पटà¥à¤Ÿà¥€"/>
+<l:gentext key="sidebar" text="बाजूची पटà¥à¤Ÿà¥€"/>
+<l:gentext key="step" text="कारà¥à¤¯"/>
+<l:gentext key="Step" text="कारà¥à¤¯"/>
+<l:gentext key="table" text="तकà¥à¤¤à¤¾"/>
+<l:gentext key="Table" text="तकà¥à¤¤à¤¾"/>
+<l:gentext key="task" text="कारà¥à¤¯"/>
+<l:gentext key="Task" text="कारà¥à¤¯"/>
+<l:gentext key="tip" text="टीप"/>
+<l:gentext key="TIP" text="टीप"/>
+<l:gentext key="Tip" text="टीप"/>
+<l:gentext key="Warning" text="सावधानता"/>
+<l:gentext key="warning" text="सावधानता"/>
+<l:gentext key="WARNING" text="सावधानता"/>
+<l:gentext key="and" text="व"/>
+<l:gentext key="by" text="दà¥à¤µà¤¾à¤°à¥‡"/>
+<l:gentext key="Edited" text="संपादीत"/>
+<l:gentext key="edited" text="संपादीत"/>
+<l:gentext key="Editedby" text="दà¥à¤µà¤¾à¤°à¥‡ संपादीत"/>
+<l:gentext key="editedby" text="दà¥à¤µà¤¾à¤°à¥‡ संपादीत"/>
+<l:gentext key="in" text="मधील"/>
+<l:gentext key="lastlistcomma" text=","/>
+<l:gentext key="listcomma" text=","/>
+<l:gentext key="notes" text="टीपा"/>
+<l:gentext key="Notes" text="टीपा"/>
+<l:gentext key="Pgs" text="पाने"/>
+<l:gentext key="pgs" text="पाने"/>
+<l:gentext key="Revisedby" text="दà¥à¤µà¤¾à¤°à¥‡ सà¥à¤§à¤¾à¤°à¥€à¤¤: "/>
+<l:gentext key="revisedby" text="दà¥à¤µà¤¾à¤°à¥‡ सà¥à¤§à¤¾à¤°à¥€à¤¤: "/>
+<l:gentext key="TableNotes" text="टीपा"/>
+<l:gentext key="tablenotes" text="टीपा"/>
+<l:gentext key="TableofContents" text="अनà¥à¤•à¥à¤°à¤®à¤£à¤¿à¤•à¤¾"/>
+<l:gentext key="tableofcontents" text="अनà¥à¤•à¥à¤°à¤®à¤£à¤¿à¤•à¤¾"/>
+<l:gentext key="unexpectedelementname" text="अनपेकà¥à¤·à¥€à¤¤ घटकाचे नाव"/>
+<l:gentext key="unsupported" text="असमरà¥à¤¥à¥€à¤¤"/>
+<l:gentext key="xrefto" text="xref"/>
+<l:gentext key="Authors" text="लेखक"/>
+<l:gentext key="copyeditor" text="पà¥à¤°à¤¤ संपादक"/>
+<l:gentext key="graphicdesigner" text="गà¥à¤°à¤¾à¤«à¤¿à¤•à¥à¤¸à¥ डिजाइनर"/>
+<l:gentext key="productioneditor" text="पà¥à¤°à¥‹à¤¡à¤•à¥à¤¶à¤¨ संपादक"/>
+<l:gentext key="technicaleditor" text="तांतà¥à¤°à¤¿à¤• संपादक"/>
+<l:gentext key="translator" text="भाषांतरनकरà¥à¤¤à¤¾"/>
+<l:gentext key="listofequations" text="समीकरणांची सूची"/>
+<l:gentext key="ListofEquations" text="समीकरणांची सूची"/>
+<l:gentext key="ListofExamples" text="उदाहरणांची सूची"/>
+<l:gentext key="listofexamples" text="उदाहरणांची सूची"/>
+<l:gentext key="ListofFigures" text="आकृतींची सूची"/>
+<l:gentext key="listoffigures" text="आकृतींची सूची"/>
+<l:gentext key="ListofProcedures" text="कारà¥à¤¯à¤ªà¤¦à¥à¤§à¤¤à¥€à¤‚ची सूची"/>
+<l:gentext key="listofprocedures" text="कारà¥à¤¯à¤ªà¤¦à¥à¤§à¤¤à¥€à¤‚ची सूची"/>
+<l:gentext key="listoftables" text="तकà¥à¤¤à¥à¤¯à¤¾à¤‚ची सूची"/>
+<l:gentext key="ListofTables" text="तकà¥à¤¤à¥à¤¯à¤¾à¤‚ची सूची"/>
+<l:gentext key="ListofUnknown" text="अपरिचीतांची सूची"/>
+<l:gentext key="listofunknown" text="अपरिचीतांची सूची"/>
+<l:gentext key="nav-home" text="होम"/>
+<l:gentext key="nav-next" text="पà¥à¤¢à¥€à¤²"/>
+<l:gentext key="nav-next-sibling" text="पटकन पà¥à¤¢à¥‡ चला"/>
+<l:gentext key="nav-prev" text="मागील"/>
+<l:gentext key="nav-prev-sibling" text="पटकन माघे चला"/>
+<l:gentext key="nav-up" text="वर"/>
+<l:gentext key="nav-toc" text="अनà¥à¤•à¥à¤°à¤®à¤£à¤¿à¤•à¤¾"/>
+<l:gentext key="Draft" text="मसà¥à¤¦à¤¾"/>
+<l:gentext key="above" text="वरील"/>
+<l:gentext key="below" text="खालील"/>
+<l:gentext key="sectioncalled" text="...नामक विभाग"/>
+<l:gentext key="index symbols" text="पà¥à¤°à¤¤à¥€à¤•"/>
+<l:gentext key="writing-mode" text="lr-tb"/>
+<l:gentext key="lowercase.alpha" text="abcdefghijklmnopqrstuvwxyz"/>
+<l:gentext key="uppercase.alpha" text="ABCDEFGHIJKLMNOPQRSTUVWXYZ"/>
+<l:gentext key="normalize.sort.input" text="AaÀàÃáÂâÃãÄäÅåĀÄĂ㥹ÇǎǞǟǠǡǺǻȀÈȂȃȦȧḀá¸áºšáº áº¡áº¢áº£áº¤áº¥áº¦áº§áº¨áº©áºªáº«áº¬áº­áº®áº¯áº°áº±áº²áº³áº´áºµáº¶áº·BbÆ€ÆɓƂƃḂḃḄḅḆḇCcÇçĆćĈĉĊċČÄƇƈɕḈḉDdÄŽÄÄđƊɗƋƌDžDzȡɖḊḋḌá¸á¸Žá¸á¸á¸‘ḒḓEeÈèÉéÊêËëĒēĔĕĖėĘęĚěȄȅȆȇȨȩḔḕḖḗḘḙḚḛḜá¸áº¸áº¹áººáº»áº¼áº½áº¾áº¿á»€á»á»‚ểỄễỆệFfƑƒḞḟGgÄœÄĞğĠġĢģƓɠǤǥǦǧǴǵḠḡHhĤĥĦħȞȟɦḢḣḤḥḦḧḨḩḪḫẖIiÌìÃíÎîÃïĨĩĪīĬĭĮįİƗɨÇÇȈȉȊȋḬḭḮḯỈỉỊịJjĴĵǰÊKkĶķƘƙǨǩḰḱḲḳḴḵLlĹĺĻļĽľĿŀÅłƚLjȴɫɬɭḶḷḸḹḺḻḼḽMmɱḾḿṀá¹á¹‚ṃNnÑñŃńŅņŇňÆɲƞȠNjǸǹȵɳṄṅṆṇṈṉṊṋOoÒòÓóÔôÕõÖöØøŌÅÅŽÅÅőƟƠơǑǒǪǫǬǭǾǿȌÈÈŽÈȪȫȬȭȮȯȰȱṌá¹á¹Žá¹á¹á¹‘ṒṓỌá»á»Žá»á»á»‘ỒồỔổỖỗỘộỚớỜá»á»žá»Ÿá» á»¡á»¢á»£PpƤƥṔṕṖṗQqÊ RrŔŕŖŗŘřÈȑȒȓɼɽɾṘṙṚṛṜá¹á¹žá¹ŸSsŚśŜÅŞşŠšȘșʂṠṡṢṣṤṥṦṧṨṩTtŢţŤťŦŧƫƬƭƮʈȚțȶṪṫṬṭṮṯṰṱẗUuÙùÚúÛûÜüŨũŪūŬŭŮůŰűŲųƯưǓǔǕǖǗǘǙǚǛǜȔȕȖȗṲṳṴṵṶṷṸṹṺṻỤụỦủỨứỪừỬửỮữỰựVvƲʋṼṽṾṿWwŴŵẀáºáº‚ẃẄẅẆẇẈẉẘXxẊẋẌáºYyÃýÿŸŶŷƳƴȲȳẎáºáº™á»²á»³á»´á»µá»¶á»·á»¸á»¹ZzŹźŻżŽžƵƶȤȥÊÊ‘áºáº‘ẒẓẔẕẕ" lang="en"/>
+<l:gentext key="normalize.sort.output" text="AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBCCCCCCCCCCCCCCCCCDDDDDDDDDDDDDDDDDDDDDDDDEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEFFFFFFGGGGGGGGGGGGGGGGGGGGHHHHHHHHHHHHHHHHHHHHIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIJJJJJJKKKKKKKKKKKKKKLLLLLLLLLLLLLLLLLLLLLLLLLLMMMMMMMMMNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOPPPPPPPPQQQRRRRRRRRRRRRRRRRRRRRRRRSSSSSSSSSSSSSSSSSSSSSSSTTTTTTTTTTTTTTTTTTTTTTTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUVVVVVVVVWWWWWWWWWWWWWWWXXXXXXYYYYYYYYYYYYYYYYYYYYYYYZZZZZZZZZZZZZZZZZZZZZ" lang="en"/>
+<l:dingbat key="startquote" text="“"/>
+<l:dingbat key="endquote" text="â€"/>
+<l:dingbat key="nestedstartquote" text="‘"/>
+<l:dingbat key="nestedendquote" text="’"/>
+<l:dingbat key="singlestartquote" text="‘"/>
+<l:dingbat key="singleendquote" text="’"/>
+<l:dingbat key="bullet" text="•"/>
+<l:gentext key="hyphenation-character" text="-"/>
+<l:gentext key="hyphenation-push-character-count" text="2"/>
+<l:gentext key="hyphenation-remain-character-count" text="2"/>
+<l:context name="styles"><l:template name="person-name" text="first-last"/>
+</l:context>
+<l:context name="title"><l:template name="abstract" text="%t"/>
+<l:template name="acknowledgements" text="%t"/>
+<l:template name="answer" text="%t"/>
+<l:template name="appendix" text="परिशिषà¥à¤ŸÂ %n. %t"/>
+<l:template name="article" text="%t"/>
+<l:template name="authorblurb" text="%t"/>
+<l:template name="bibliodiv" text="%t"/>
+<l:template name="biblioentry" text="%t"/>
+<l:template name="bibliography" text="%t"/>
+<l:template name="bibliolist" text="%t"/>
+<l:template name="bibliomixed" text="%t"/>
+<l:template name="bibliomset" text="%t"/>
+<l:template name="biblioset" text="%t"/>
+<l:template name="blockquote" text="%t"/>
+<l:template name="book" text="%t"/>
+<l:template name="calloutlist" text="%t"/>
+<l:template name="caution" text="%t"/>
+<l:template name="chapter" text="धडा %n. %t"/>
+<l:template name="colophon" text="%t"/>
+<l:template name="dedication" text="%t"/>
+<l:template name="equation" text="समीकरण %n. %t"/>
+<l:template name="example" text="उदाहरण %n. %t"/>
+<l:template name="figure" text="आकृती %n. %t"/>
+<l:template name="foil" text="%t"/>
+<l:template name="foilgroup" text="%t"/>
+<l:template name="formalpara" text="%t"/>
+<l:template name="glossary" text="%t"/>
+<l:template name="glossdiv" text="%t"/>
+<l:template name="glosslist" text="%t"/>
+<l:template name="glossentry" text="%t"/>
+<l:template name="important" text="%t"/>
+<l:template name="index" text="%t"/>
+<l:template name="indexdiv" text="%t"/>
+<l:template name="itemizedlist" text="%t"/>
+<l:template name="legalnotice" text="%t"/>
+<l:template name="listitem" text=""/>
+<l:template name="lot" text="%t"/>
+<l:template name="msg" text="%t"/>
+<l:template name="msgexplan" text="%t"/>
+<l:template name="msgmain" text="%t"/>
+<l:template name="msgrel" text="%t"/>
+<l:template name="msgset" text="%t"/>
+<l:template name="msgsub" text="%t"/>
+<l:template name="note" text="%t"/>
+<l:template name="orderedlist" text="%t"/>
+<l:template name="part" text="भाग %n. %t"/>
+<l:template name="partintro" text="%t"/>
+<l:template name="preface" text="%t"/>
+<l:template name="procedure" text="%t"/>
+<l:template name="procedure.formal" text="कारà¥à¤¯à¤ªà¤¦à¥à¤§à¤¤Â %n. %t"/>
+<l:template name="productionset" text="%t"/>
+<l:template name="productionset.formal" text="पà¥à¤°à¤¸à¥à¤¤à¥à¤¤à¤¿Â %n"/>
+<l:template name="qandadiv" text="%t"/>
+<l:template name="qandaentry" text="%t"/>
+<l:template name="qandaset" text="%t"/>
+<l:template name="question" text="%t"/>
+<l:template name="refentry" text="%t"/>
+<l:template name="reference" text="%t"/>
+<l:template name="refsection" text="%t"/>
+<l:template name="refsect1" text="%t"/>
+<l:template name="refsect2" text="%t"/>
+<l:template name="refsect3" text="%t"/>
+<l:template name="refsynopsisdiv" text="%t"/>
+<l:template name="refsynopsisdivinfo" text="%t"/>
+<l:template name="segmentedlist" text="%t"/>
+<l:template name="set" text="%t"/>
+<l:template name="setindex" text="%t"/>
+<l:template name="sidebar" text="%t"/>
+<l:template name="step" text="%t"/>
+<l:template name="table" text="तकà¥à¤¤à¤¾Â %n. %t"/>
+<l:template name="task" text="%t"/>
+<l:template name="tasksummary" text="%t"/>
+<l:template name="taskprerequisites" text="%t"/>
+<l:template name="taskrelated" text="%t"/>
+<l:template name="tip" text="%t"/>
+<l:template name="toc" text="%t"/>
+<l:template name="variablelist" text="%t"/>
+<l:template name="varlistentry" text=""/>
+<l:template name="warning" text="%t"/>
+</l:context>
+<l:context name="title-unnumbered"><l:template name="appendix" text="%t"/>
+<l:template name="article/appendix" text="%t"/>
+<l:template name="bridgehead" text="%t"/>
+<l:template name="chapter" text="%t"/>
+<l:template name="sect1" text="%t"/>
+<l:template name="sect2" text="%t"/>
+<l:template name="sect3" text="%t"/>
+<l:template name="sect4" text="%t"/>
+<l:template name="sect5" text="%t"/>
+<l:template name="section" text="%t"/>
+<l:template name="simplesect" text="%t"/>
+<l:template name="part" text="%t"/>
+</l:context>
+<l:context name="title-numbered"><l:template name="appendix" text="परिशिषà¥à¤ŸÂ %n. %t"/>
+<l:template name="article/appendix" text="%n. %t"/>
+<l:template name="bridgehead" text="%n. %t"/>
+<l:template name="chapter" text="धडा %n. %t"/>
+<l:template name="part" text="भाग %n. %t"/>
+<l:template name="sect1" text="%n. %t"/>
+<l:template name="sect2" text="%n. %t"/>
+<l:template name="sect3" text="%n. %t"/>
+<l:template name="sect4" text="%n. %t"/>
+<l:template name="sect5" text="%n. %t"/>
+<l:template name="section" text="%n. %t"/>
+<l:template name="simplesect" text="%t"/>
+</l:context>
+<l:context name="subtitle"><l:template name="appendix" text="%s"/>
+<l:template name="acknowledgements" text="%s"/>
+<l:template name="article" text="%s"/>
+<l:template name="bibliodiv" text="%s"/>
+<l:template name="biblioentry" text="%s"/>
+<l:template name="bibliography" text="%s"/>
+<l:template name="bibliomixed" text="%s"/>
+<l:template name="bibliomset" text="%s"/>
+<l:template name="biblioset" text="%s"/>
+<l:template name="book" text="%s"/>
+<l:template name="chapter" text="%s"/>
+<l:template name="colophon" text="%s"/>
+<l:template name="dedication" text="%s"/>
+<l:template name="glossary" text="%s"/>
+<l:template name="glossdiv" text="%s"/>
+<l:template name="index" text="%s"/>
+<l:template name="indexdiv" text="%s"/>
+<l:template name="lot" text="%s"/>
+<l:template name="part" text="%s"/>
+<l:template name="partintro" text="%s"/>
+<l:template name="preface" text="%s"/>
+<l:template name="refentry" text="%s"/>
+<l:template name="reference" text="%s"/>
+<l:template name="refsection" text="%s"/>
+<l:template name="refsect1" text="%s"/>
+<l:template name="refsect2" text="%s"/>
+<l:template name="refsect3" text="%s"/>
+<l:template name="refsynopsisdiv" text="%s"/>
+<l:template name="sect1" text="%s"/>
+<l:template name="sect2" text="%s"/>
+<l:template name="sect3" text="%s"/>
+<l:template name="sect4" text="%s"/>
+<l:template name="sect5" text="%s"/>
+<l:template name="section" text="%s"/>
+<l:template name="set" text="%s"/>
+<l:template name="setindex" text="%s"/>
+<l:template name="sidebar" text="%s"/>
+<l:template name="simplesect" text="%s"/>
+<l:template name="toc" text="%s"/>
+</l:context>
+<l:context name="xref"><l:template name="abstract" text="%t"/>
+<l:template name="acknowledgements" text="%t"/>
+<l:template name="answer" text="A: %n"/>
+<l:template name="appendix" text="%t"/>
+<l:template name="article" text="%t"/>
+<l:template name="authorblurb" text="%t"/>
+<l:template name="bibliodiv" text="%t"/>
+<l:template name="bibliography" text="%t"/>
+<l:template name="bibliomset" text="%t"/>
+<l:template name="biblioset" text="%t"/>
+<l:template name="blockquote" text="%t"/>
+<l:template name="book" text="%t"/>
+<l:template name="calloutlist" text="%t"/>
+<l:template name="caution" text="%t"/>
+<l:template name="chapter" text="%t"/>
+<l:template name="colophon" text="%t"/>
+<l:template name="constraintdef" text="%t"/>
+<l:template name="dedication" text="%t"/>
+<l:template name="equation" text="%t"/>
+<l:template name="example" text="%t"/>
+<l:template name="figure" text="%t"/>
+<l:template name="foil" text="%t"/>
+<l:template name="foilgroup" text="%t"/>
+<l:template name="formalpara" text="%t"/>
+<l:template name="glossary" text="%t"/>
+<l:template name="glossdiv" text="%t"/>
+<l:template name="important" text="%t"/>
+<l:template name="index" text="%t"/>
+<l:template name="indexdiv" text="%t"/>
+<l:template name="itemizedlist" text="%t"/>
+<l:template name="legalnotice" text="%t"/>
+<l:template name="listitem" text="%n"/>
+<l:template name="lot" text="%t"/>
+<l:template name="msg" text="%t"/>
+<l:template name="msgexplan" text="%t"/>
+<l:template name="msgmain" text="%t"/>
+<l:template name="msgrel" text="%t"/>
+<l:template name="msgset" text="%t"/>
+<l:template name="msgsub" text="%t"/>
+<l:template name="note" text="%t"/>
+<l:template name="orderedlist" text="%t"/>
+<l:template name="part" text="%t"/>
+<l:template name="partintro" text="%t"/>
+<l:template name="preface" text="%t"/>
+<l:template name="procedure" text="%t"/>
+<l:template name="productionset" text="%t"/>
+<l:template name="qandadiv" text="%t"/>
+<l:template name="qandaentry" text="Q: %n"/>
+<l:template name="qandaset" text="%t"/>
+<l:template name="question" text="Q: %n"/>
+<l:template name="reference" text="%t"/>
+<l:template name="refsynopsisdiv" text="%t"/>
+<l:template name="segmentedlist" text="%t"/>
+<l:template name="set" text="%t"/>
+<l:template name="setindex" text="%t"/>
+<l:template name="sidebar" text="%t"/>
+<l:template name="table" text="%t"/>
+<l:template name="task" text="%t"/>
+<l:template name="tip" text="%t"/>
+<l:template name="toc" text="%t"/>
+<l:template name="variablelist" text="%t"/>
+<l:template name="varlistentry" text="%n"/>
+<l:template name="warning" text="%t"/>
+<l:template name="olink.document.citation" text=" in %o"/>
+<l:template name="olink.page.citation" text=" (page %p)"/>
+<l:template name="page.citation" text=" [%p]"/>
+<l:template name="page" text="(page %p)"/>
+<l:template name="docname" text=" in %o"/>
+<l:template name="docnamelong" text=" in the document titled %o"/>
+<l:template name="pageabbrev" text="(p. %p)"/>
+<l:template name="Page" text="Page %p"/>
+<l:template name="bridgehead" text="...नामक विभाग “%tâ€"/>
+<l:template name="refsection" text="...नामक विभाग “%tâ€"/>
+<l:template name="refsect1" text="...नामक विभाग “%tâ€"/>
+<l:template name="refsect2" text="...नामक विभाग “%tâ€"/>
+<l:template name="refsect3" text="...नामक विभाग “%tâ€"/>
+<l:template name="sect1" text="...नामक विभाग “%tâ€"/>
+<l:template name="sect2" text="...नामक विभाग “%tâ€"/>
+<l:template name="sect3" text="...नामक विभाग “%tâ€"/>
+<l:template name="sect4" text="...नामक विभाग “%tâ€"/>
+<l:template name="sect5" text="...नामक विभाग “%tâ€"/>
+<l:template name="section" text="...नामक विभाग “%tâ€"/>
+<l:template name="simplesect" text="...नामक विभाग “%tâ€"/>
+</l:context>
+<l:context name="xref-number"><l:template name="answer" text="A: %n"/>
+<l:template name="appendix" text="परिशिषà¥à¤ŸÂ %n"/>
+<l:template name="bridgehead" text="विभाग %n"/>
+<l:template name="chapter" text="धडा %n"/>
+<l:template name="equation" text="समीकरण %n"/>
+<l:template name="example" text="उदाहरण %n"/>
+<l:template name="figure" text="आकृती %n"/>
+<l:template name="part" text="भाग %n"/>
+<l:template name="procedure" text="कारà¥à¤¯à¤ªà¤¦à¥à¤§à¤¤Â %n"/>
+<l:template name="productionset" text="पà¥à¤°à¤¸à¥à¤¤à¥à¤¤à¤¿Â %n"/>
+<l:template name="qandadiv" text="Q &amp; A %n"/>
+<l:template name="qandaentry" text="Q: %n"/>
+<l:template name="question" text="Q: %n"/>
+<l:template name="sect1" text="विभाग %n"/>
+<l:template name="sect2" text="विभाग %n"/>
+<l:template name="sect3" text="विभाग %n"/>
+<l:template name="sect4" text="विभाग %n"/>
+<l:template name="sect5" text="विभाग %n"/>
+<l:template name="section" text="विभाग %n"/>
+<l:template name="table" text="तकà¥à¤¤à¤¾Â %n"/>
+</l:context>
+<l:context name="xref-number-and-title"><l:template name="appendix" text="परिशिषà¥à¤ŸÂ %n, %t"/>
+<l:template name="bridgehead" text="विभाग %n, “%tâ€"/>
+<l:template name="chapter" text="धडा %n, %t"/>
+<l:template name="equation" text="समीकरण %n, “%tâ€"/>
+<l:template name="example" text="उदाहरण %n, “%tâ€"/>
+<l:template name="figure" text="आकृती %n, “%tâ€"/>
+<l:template name="part" text="भाग %n, “%tâ€"/>
+<l:template name="procedure" text="कारà¥à¤¯à¤ªà¤¦à¥à¤§à¤¤Â %n, “%tâ€"/>
+<l:template name="productionset" text="पà¥à¤°à¤¸à¥à¤¤à¥à¤¤à¤¿Â %n, “%tâ€"/>
+<l:template name="qandadiv" text="Q &amp; A %n, “%tâ€"/>
+<l:template name="refsect1" text="...नामक विभाग “%tâ€"/>
+<l:template name="refsect2" text="...नामक विभाग “%tâ€"/>
+<l:template name="refsect3" text="...नामक विभाग “%tâ€"/>
+<l:template name="refsection" text="...नामक विभाग “%tâ€"/>
+<l:template name="sect1" text="विभाग %n, “%tâ€"/>
+<l:template name="sect2" text="विभाग %n, “%tâ€"/>
+<l:template name="sect3" text="विभाग %n, “%tâ€"/>
+<l:template name="sect4" text="विभाग %n, “%tâ€"/>
+<l:template name="sect5" text="विभाग %n, “%tâ€"/>
+<l:template name="section" text="विभाग %n, “%tâ€"/>
+<l:template name="simplesect" text="...नामक विभाग “%tâ€"/>
+<l:template name="table" text="तकà¥à¤¤à¤¾Â %n, “%tâ€"/>
+</l:context>
+<l:context name="authorgroup"><l:template name="sep" text=", "/>
+<l:template name="sep2" text=" व "/>
+<l:template name="seplast" text=", व "/>
+</l:context>
+<l:context name="glossary"><l:template name="see" text="पहा %t."/>
+<l:template name="seealso" text="हे ही पहा %t."/>
+<l:template name="seealso-separator" text=", "/>
+</l:context>
+<l:context name="msgset"><l:template name="MsgAud" text="पà¥à¤°à¤•à¥à¤·à¥‡à¤•: "/>
+<l:template name="MsgLevel" text="सà¥à¤¤à¤°: "/>
+<l:template name="MsgOrig" text="मà¥à¤³: "/>
+</l:context>
+<l:context name="datetime"><l:template name="format" text="m/d/Y"/>
+</l:context>
+<l:context name="termdef"><l:template name="prefix" text="[Definition: "/>
+<l:template name="suffix" text="]"/>
+</l:context>
+<l:context name="datetime-full"><l:template name="January" text="जानेवारी"/>
+<l:template name="February" text="फेबà¥à¤°à¥à¤µà¤¾à¤°à¥€"/>
+<l:template name="March" text="मारà¥à¤š"/>
+<l:template name="April" text="à¤à¤ªà¥à¤°à¤¿à¤²"/>
+<l:template name="May" text="मे"/>
+<l:template name="June" text="जून"/>
+<l:template name="July" text="जà¥à¤²à¥ˆ"/>
+<l:template name="August" text="ऑगसà¥à¤Ÿ"/>
+<l:template name="September" text="सपà¥à¤Ÿà¥‡à¤‚बर"/>
+<l:template name="October" text="ऑकà¥à¤Ÿà¥‹à¤¬à¤°"/>
+<l:template name="November" text="नोवà¥à¤¹à¥‡à¤‚बर"/>
+<l:template name="December" text="डिसेंबर"/>
+<l:template name="Monday" text="सोमवार"/>
+<l:template name="Tuesday" text="मंगळवार"/>
+<l:template name="Wednesday" text="बà¥à¤§à¤µà¤¾à¤°"/>
+<l:template name="Thursday" text="गà¥à¤°à¥‚वार"/>
+<l:template name="Friday" text="शà¥à¤•à¥à¤°à¤µà¤¾à¤°"/>
+<l:template name="Saturday" text="शनिवार"/>
+<l:template name="Sunday" text="रविवार"/>
+</l:context>
+<l:context name="datetime-abbrev"><l:template name="Jan" text="जा"/>
+<l:template name="Feb" text="फेबà¥à¤°à¥à¤µà¤¾à¤°à¥€"/>
+<l:template name="Mar" text="मारà¥à¤š"/>
+<l:template name="Apr" text="à¤à¤ªà¥à¤°à¤¿à¤²"/>
+<l:template name="May" text="मे"/>
+<l:template name="Jun" text="जून"/>
+<l:template name="Jul" text="जà¥à¤²à¥ˆ"/>
+<l:template name="Aug" text="ऑगसà¥à¤Ÿ"/>
+<l:template name="Sep" text="सपà¥à¤Ÿà¥‡à¤‚"/>
+<l:template name="Oct" text="ऑकà¥à¤Ÿà¥‹"/>
+<l:template name="Nov" text="नोवà¥à¤¹à¥‡à¤‚बर"/>
+<l:template name="Dec" text="डिसेंबर"/>
+<l:template name="Mon" text="सोम"/>
+<l:template name="Tue" text="मंगळ"/>
+<l:template name="Wed" text="बà¥à¤§"/>
+<l:template name="Thu" text="गà¥à¤°à¥‚"/>
+<l:template name="Fri" text="शà¥à¤•à¥à¤°"/>
+<l:template name="Sat" text="शनि"/>
+<l:template name="Sun" text="रवि"/>
+</l:context>
+<l:context name="htmlhelp"><l:template name="langcode" text="0x044e Marathi"/>
+</l:context>
+<l:context name="index"><l:template name="term-separator" text=", "/>
+<l:template name="number-separator" text=", "/>
+<l:template name="range-separator" text="-"/>
+</l:context>
+<l:context name="iso690"><l:template name="lastfirst.sep" text=", "/>
+<l:template name="alt.person.two.sep" text=" – "/>
+<l:template name="alt.person.last.sep" text=" – "/>
+<l:template name="alt.person.more.sep" text=" – "/>
+<l:template name="primary.editor" text=" (ed.)"/>
+<l:template name="primary.many" text=", et al."/>
+<l:template name="primary.sep" text=". "/>
+<l:template name="submaintitle.sep" text=": "/>
+<l:template name="title.sep" text=". "/>
+<l:template name="othertitle.sep" text=", "/>
+<l:template name="medium1" text=" ["/>
+<l:template name="medium2" text="]"/>
+<l:template name="secondary.person.sep" text="; "/>
+<l:template name="secondary.sep" text=". "/>
+<l:template name="respons.sep" text=". "/>
+<l:template name="edition.sep" text=". "/>
+<l:template name="edition.serial.sep" text=", "/>
+<l:template name="issuing.range" text="-"/>
+<l:template name="issuing.div" text=", "/>
+<l:template name="issuing.sep" text=". "/>
+<l:template name="partnr.sep" text=". "/>
+<l:template name="placepubl.sep" text=": "/>
+<l:template name="publyear.sep" text=", "/>
+<l:template name="pubinfo.sep" text=". "/>
+<l:template name="spec.pubinfo.sep" text=", "/>
+<l:template name="upd.sep" text=", "/>
+<l:template name="datecit1" text=" [cited "/>
+<l:template name="datecit2" text="]"/>
+<l:template name="extent.sep" text=". "/>
+<l:template name="locs.sep" text=", "/>
+<l:template name="location.sep" text=". "/>
+<l:template name="serie.sep" text=". "/>
+<l:template name="notice.sep" text=". "/>
+<l:template name="access" text="Available "/>
+<l:template name="acctoo" text="Also available "/>
+<l:template name="onwww" text="from World Wide Web"/>
+<l:template name="oninet" text="from Internet"/>
+<l:template name="access.end" text=": "/>
+<l:template name="link1" text="&lt;"/>
+<l:template name="link2" text="&gt;"/>
+<l:template name="access.sep" text=". "/>
+<l:template name="isbn" text="ISBN "/>
+<l:template name="issn" text="ISSN "/>
+<l:template name="stdnum.sep" text=". "/>
+<l:template name="patcountry.sep" text=". "/>
+<l:template name="pattype.sep" text=", "/>
+<l:template name="patnum.sep" text=". "/>
+<l:template name="patdate.sep" text=". "/>
+</l:context><l:letters><l:l i="-1"/>
+<l:l i="0">पà¥à¤°à¤¤à¥€à¤•</l:l>
+<l:l i="10">A</l:l>
+<l:l i="10">a</l:l>
+<l:l i="20">B</l:l>
+<l:l i="20">b</l:l>
+<l:l i="30">C</l:l>
+<l:l i="30">c</l:l>
+<l:l i="40">D</l:l>
+<l:l i="40">d</l:l>
+<l:l i="50">E</l:l>
+<l:l i="50">e</l:l>
+<l:l i="60">F</l:l>
+<l:l i="60">f</l:l>
+<l:l i="70">G</l:l>
+<l:l i="70">g</l:l>
+<l:l i="80">H</l:l>
+<l:l i="80">h</l:l>
+<l:l i="90">I</l:l>
+<l:l i="90">i</l:l>
+<l:l i="100">J</l:l>
+<l:l i="100">j</l:l>
+<l:l i="110">K</l:l>
+<l:l i="110">k</l:l>
+<l:l i="120">L</l:l>
+<l:l i="120">l</l:l>
+<l:l i="130">M</l:l>
+<l:l i="130">m</l:l>
+<l:l i="140">N</l:l>
+<l:l i="140">n</l:l>
+<l:l i="150">O</l:l>
+<l:l i="150">o</l:l>
+<l:l i="160">P</l:l>
+<l:l i="160">p</l:l>
+<l:l i="170">Q</l:l>
+<l:l i="170">q</l:l>
+<l:l i="180">R</l:l>
+<l:l i="180">r</l:l>
+<l:l i="190">S</l:l>
+<l:l i="190">s</l:l>
+<l:l i="200">T</l:l>
+<l:l i="200">t</l:l>
+<l:l i="210">U</l:l>
+<l:l i="210">u</l:l>
+<l:l i="220">V</l:l>
+<l:l i="220">v</l:l>
+<l:l i="230">W</l:l>
+<l:l i="230">w</l:l>
+<l:l i="240">X</l:l>
+<l:l i="240">x</l:l>
+<l:l i="250">Y</l:l>
+<l:l i="250">y</l:l>
+<l:l i="260">Z</l:l>
+<l:l i="260">z</l:l>
+</l:letters>
+</l:l10n>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/nb.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/nb.xml
new file mode 100644
index 0000000..b9d8a4f
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/nb.xml
@@ -0,0 +1,1229 @@
+<?xml version="1.0" encoding="utf-8"?>
+<l:l10n xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0" language="nb" english-language-name="Norwegian Bokmål">
+
+<!-- * This file is generated automatically. -->
+<!-- * To submit changes to this file upstream (to the DocBook Project) -->
+<!-- * do not submit an edited version of this file. Instead, submit an -->
+<!-- * edited version of the source file at the following location: -->
+<!-- * -->
+<!-- * https://docbook.svn.sourceforge.net/svnroot/docbook/trunk/gentext/locale/nb.xml -->
+<!-- * -->
+<!-- * E-mail the edited nb.xml source file to: -->
+<!-- * -->
+<!-- * docbook-developers@lists.sourceforge.net -->
+
+<!-- ******************************************************************** -->
+
+<!-- This file is part of the XSL DocBook Stylesheet distribution. -->
+<!-- See ../README or http://docbook.sf.net/release/xsl/current/ for -->
+<!-- copyright and other information. -->
+
+<!-- ******************************************************************** -->
+<!-- In these files, % with a letter is used for a placeholder: -->
+<!-- %t is the current element's title -->
+<!-- %s is the current element's subtitle (if applicable)-->
+<!-- %n is the current element's number label-->
+<!-- %p is the current element's page number (if applicable)-->
+<!-- ******************************************************************** -->
+
+
+<l:gentext key="Abstract" text="Sammendrag"/>
+<l:gentext key="abstract" text="Sammendrag"/>
+<l:gentext key="Acknowledgements" text="Acknowledgements" lang="en"/>
+<l:gentext key="acknowledgements" text="Acknowledgements" lang="en"/>
+<l:gentext key="Answer" text="Svar"/>
+<l:gentext key="answer" text="svar"/>
+<l:gentext key="Appendix" text="Tillegg"/>
+<l:gentext key="appendix" text="Tillegg"/>
+<l:gentext key="Article" text="Artikkel"/>
+<l:gentext key="article" text="artikkel"/>
+<l:gentext key="Author" text="Author" lang="en"/>
+<l:gentext key="Bibliography" text="Bibliografi"/>
+<l:gentext key="bibliography" text="Bibliografi"/>
+<l:gentext key="Book" text="Bok"/>
+<l:gentext key="book" text="bok"/>
+<l:gentext key="CAUTION" text="OBS"/>
+<l:gentext key="Caution" text="Obs"/>
+<l:gentext key="caution" text="obs"/>
+<l:gentext key="Chapter" text="Kapittel"/>
+<l:gentext key="chapter" text="Kapittel"/>
+<l:gentext key="Colophon" text="Kolofon"/>
+<l:gentext key="colophon" text="kolofon"/>
+<l:gentext key="Copyright" text="Opphavsrett"/>
+<l:gentext key="copyright" text="opphavsrett"/>
+<l:gentext key="Dedication" text="Dedikasjon"/>
+<l:gentext key="dedication" text="Dedikasjon"/>
+<l:gentext key="Edition" text="Utgave"/>
+<l:gentext key="edition" text="utgave"/>
+<l:gentext key="Editor" text="Editor" lang="en"/>
+<l:gentext key="Equation" text="Formel"/>
+<l:gentext key="equation" text="Formel"/>
+<l:gentext key="Example" text="Eksempel"/>
+<l:gentext key="example" text="Eksempel"/>
+<l:gentext key="Figure" text="Figur"/>
+<l:gentext key="figure" text="Figur"/>
+<l:gentext key="Glossary" text="Ordliste"/>
+<l:gentext key="glossary" text="Ordliste"/>
+<l:gentext key="GlossSee" text="Se"/>
+<l:gentext key="glosssee" text="Se"/>
+<l:gentext key="GlossSeeAlso" text="Se også"/>
+<l:gentext key="glossseealso" text="se også"/>
+<l:gentext key="IMPORTANT" text="VIKTIG"/>
+<l:gentext key="important" text="viktig"/>
+<l:gentext key="Important" text="Viktig"/>
+<l:gentext key="Index" text="Indeks"/>
+<l:gentext key="index" text="Indeks"/>
+<l:gentext key="ISBN" text="ISBN"/>
+<l:gentext key="isbn" text="ISBN"/>
+<l:gentext key="LegalNotice" text="Rettslig merknad"/>
+<l:gentext key="legalnotice" text="rettslig merknad"/>
+<l:gentext key="MsgAud" text="Publikum"/>
+<l:gentext key="msgaud" text="Publikum"/>
+<l:gentext key="MsgLevel" text="Nivå"/>
+<l:gentext key="msglevel" text="Nivå"/>
+<l:gentext key="MsgOrig" text="Opphav"/>
+<l:gentext key="msgorig" text="Opphav"/>
+<l:gentext key="NOTE" text="NOTAT"/>
+<l:gentext key="Note" text="Notat"/>
+<l:gentext key="note" text="notat"/>
+<l:gentext key="Part" text="Del"/>
+<l:gentext key="part" text="del"/>
+<l:gentext key="Preface" text="Forord"/>
+<l:gentext key="preface" text="forord"/>
+<l:gentext key="Procedure" text="Prosedyre"/>
+<l:gentext key="procedure" text="prosedyre"/>
+<l:gentext key="ProductionSet" text="Produksjon"/>
+<l:gentext key="PubDate" text="Publication Date" lang="en"/>
+<l:gentext key="pubdate" text="Publication date" lang="en"/>
+<l:gentext key="Published" text="Publisert"/>
+<l:gentext key="published" text="publisert"/>
+<l:gentext key="Publisher" text="Publisher" lang="en"/>
+<l:gentext key="Qandadiv" text="Spørsmål og svar"/>
+<l:gentext key="qandadiv" text="spørsmål og svar"/>
+<l:gentext key="QandASet" text="Frequently Asked Questions" lang="en"/>
+<l:gentext key="Question" text="Spørsmål"/>
+<l:gentext key="question" text="spørsmål"/>
+<l:gentext key="RefEntry" text=""/>
+<l:gentext key="refentry" text=""/>
+<l:gentext key="Reference" text="Referanse"/>
+<l:gentext key="reference" text="referanse"/>
+<l:gentext key="References" text="References" lang="en"/>
+<l:gentext key="RefName" text="Navn"/>
+<l:gentext key="refname" text="navn"/>
+<l:gentext key="RefSection" text=""/>
+<l:gentext key="refsection" text=""/>
+<l:gentext key="RefSynopsisDiv" text="Synopsis"/>
+<l:gentext key="refsynopsisdiv" text="Synopsis"/>
+<l:gentext key="RevHistory" text="Revisjonshistorie"/>
+<l:gentext key="revhistory" text="revisjonshistorie"/>
+<l:gentext key="revision" text="revisjon"/>
+<l:gentext key="Revision" text="Revisjon"/>
+<l:gentext key="sect1" text="Seksjon"/>
+<l:gentext key="sect2" text="Seksjon"/>
+<l:gentext key="sect3" text="Seksjon"/>
+<l:gentext key="sect4" text="Seksjon"/>
+<l:gentext key="sect5" text="Seksjon"/>
+<l:gentext key="section" text="seksjon"/>
+<l:gentext key="Section" text="Seksjon"/>
+<l:gentext key="see" text="Se"/>
+<l:gentext key="See" text="Se"/>
+<l:gentext key="seealso" text="se også"/>
+<l:gentext key="Seealso" text="Se også"/>
+<l:gentext key="SeeAlso" text="Se også"/>
+<l:gentext key="set" text="sett"/>
+<l:gentext key="Set" text="Sett"/>
+<l:gentext key="setindex" text="settindeks"/>
+<l:gentext key="SetIndex" text="Settindeks"/>
+<l:gentext key="Sidebar" text=""/>
+<l:gentext key="sidebar" text=""/>
+<l:gentext key="step" text="steg"/>
+<l:gentext key="Step" text="Steg"/>
+<l:gentext key="table" text="tabell"/>
+<l:gentext key="Table" text="Tabell"/>
+<l:gentext key="task" text="Task" lang="en"/>
+<l:gentext key="Task" text="Task" lang="en"/>
+<l:gentext key="tip" text="Tips"/>
+<l:gentext key="TIP" text="TIPS"/>
+<l:gentext key="Tip" text="Tips"/>
+<l:gentext key="Warning" text="Advarsel"/>
+<l:gentext key="warning" text="advarsel"/>
+<l:gentext key="WARNING" text="ADVARSEL"/>
+<l:gentext key="and" text="og"/>
+<l:gentext key="by" text="av"/>
+<l:gentext key="Edited" text="Redigert"/>
+<l:gentext key="edited" text="redigert"/>
+<l:gentext key="Editedby" text="Redigert av"/>
+<l:gentext key="editedby" text="redigert av"/>
+<l:gentext key="in" text="i"/>
+<l:gentext key="lastlistcomma" text=","/>
+<l:gentext key="listcomma" text=","/>
+<l:gentext key="notes" text="Sluttnotater"/>
+<l:gentext key="Notes" text="sluttnotater"/>
+<l:gentext key="Pgs" text="Sider"/>
+<l:gentext key="pgs" text="sider"/>
+<l:gentext key="Revisedby" text="Gjennomgått av: "/>
+<l:gentext key="revisedby" text="gjennomgått av: "/>
+<l:gentext key="TableNotes" text="Notater"/>
+<l:gentext key="tablenotes" text="notater"/>
+<l:gentext key="TableofContents" text="Innholdsfortegnelse"/>
+<l:gentext key="tableofcontents" text="innholdsfortegnelse"/>
+<l:gentext key="unexpectedelementname" text="UVENTET-ELEMENTNAVN"/>
+<l:gentext key="unsupported" text="ikke støttet"/>
+<l:gentext key="xrefto" text="xref til"/>
+<l:gentext key="Authors" text="Authors" lang="en"/>
+<l:gentext key="copyeditor" text="Copy Editor" lang="en"/>
+<l:gentext key="graphicdesigner" text="Graphic Designer" lang="en"/>
+<l:gentext key="productioneditor" text="Production Editor" lang="en"/>
+<l:gentext key="technicaleditor" text="Technical Editor" lang="en"/>
+<l:gentext key="translator" text="Translator" lang="en"/>
+<l:gentext key="listofequations" text="Formeloversikt"/>
+<l:gentext key="ListofEquations" text="formeloversikt"/>
+<l:gentext key="ListofExamples" text="Eksempeloversikt"/>
+<l:gentext key="listofexamples" text="eksempeloversikt"/>
+<l:gentext key="ListofFigures" text="Figuroversikt"/>
+<l:gentext key="listoffigures" text="figuroversikt"/>
+<l:gentext key="ListofProcedures" text="List of Procedures" lang="en"/>
+<l:gentext key="listofprocedures" text="List of Procedures" lang="en"/>
+<l:gentext key="listoftables" text="Tabelloversikt"/>
+<l:gentext key="ListofTables" text="tabelloversikt"/>
+<l:gentext key="ListofUnknown" text="???-oversikt"/>
+<l:gentext key="listofunknown" text="???-oversikt"/>
+<l:gentext key="nav-home" text="Hjem"/>
+<l:gentext key="nav-next" text="Neste"/>
+<l:gentext key="nav-next-sibling" text="Raskt fremover"/>
+<l:gentext key="nav-prev" text="Forrige"/>
+<l:gentext key="nav-prev-sibling" text="Raskt bakover"/>
+<l:gentext key="nav-up" text="Opp"/>
+<l:gentext key="nav-toc" text="ToC" lang="en"/>
+<l:gentext key="Draft" text="Utkast"/>
+<l:gentext key="above" text="over"/>
+<l:gentext key="below" text="under"/>
+<l:gentext key="sectioncalled" text="Seksjonen kalt"/>
+<l:gentext key="index symbols" text="Symboler"/>
+<l:gentext key="writing-mode" text="lr-tb"/>
+<l:gentext key="lowercase.alpha" text="abcdefghijklmnopqrstuvwxyzæøå"/>
+<l:gentext key="uppercase.alpha" text="ABCDEFGHIJKLMNOPQRSTUVWXYZÆØÅ"/>
+<l:gentext key="normalize.sort.input" text="AaÀàÃáÂâÃãÄäÅåĀÄĂ㥹ÇǎǞǟǠǡǺǻȀÈȂȃȦȧḀá¸áºšáº áº¡áº¢áº£áº¤áº¥áº¦áº§áº¨áº©áºªáº«áº¬áº­áº®áº¯áº°áº±áº²áº³áº´áºµáº¶áº·BbÆ€ÆɓƂƃḂḃḄḅḆḇCcÇçĆćĈĉĊċČÄƇƈɕḈḉDdÄŽÄÄđƊɗƋƌDžDzȡɖḊḋḌá¸á¸Žá¸á¸á¸‘ḒḓEeÈèÉéÊêËëĒēĔĕĖėĘęĚěȄȅȆȇȨȩḔḕḖḗḘḙḚḛḜá¸áº¸áº¹áººáº»áº¼áº½áº¾áº¿á»€á»á»‚ểỄễỆệFfƑƒḞḟGgÄœÄĞğĠġĢģƓɠǤǥǦǧǴǵḠḡHhĤĥĦħȞȟɦḢḣḤḥḦḧḨḩḪḫẖIiÌìÃíÎîÃïĨĩĪīĬĭĮįİƗɨÇÇȈȉȊȋḬḭḮḯỈỉỊịJjĴĵǰÊKkĶķƘƙǨǩḰḱḲḳḴḵLlĹĺĻļĽľĿŀÅłƚLjȴɫɬɭḶḷḸḹḺḻḼḽMmɱḾḿṀá¹á¹‚ṃNnÑñŃńŅņŇňÆɲƞȠNjǸǹȵɳṄṅṆṇṈṉṊṋOoÒòÓóÔôÕõÖöØøŌÅÅŽÅÅőƟƠơǑǒǪǫǬǭǾǿȌÈÈŽÈȪȫȬȭȮȯȰȱṌá¹á¹Žá¹á¹á¹‘ṒṓỌá»á»Žá»á»á»‘ỒồỔổỖỗỘộỚớỜá»á»žá»Ÿá» á»¡á»¢á»£PpƤƥṔṕṖṗQqÊ RrŔŕŖŗŘřÈȑȒȓɼɽɾṘṙṚṛṜá¹á¹žá¹ŸSsŚśŜÅŞşŠšȘșʂṠṡṢṣṤṥṦṧṨṩTtŢţŤťŦŧƫƬƭƮʈȚțȶṪṫṬṭṮṯṰṱẗUuÙùÚúÛûÜüŨũŪūŬŭŮůŰűŲųƯưǓǔǕǖǗǘǙǚǛǜȔȕȖȗṲṳṴṵṶṷṸṹṺṻỤụỦủỨứỪừỬửỮữỰựVvƲʋṼṽṾṿWwŴŵẀáºáº‚ẃẄẅẆẇẈẉẘXxẊẋẌáºYyÃýÿŸŶŷƳƴȲȳẎáºáº™á»²á»³á»´á»µá»¶á»·á»¸á»¹ZzŹźŻżŽžƵƶȤȥÊÊ‘áºáº‘ẒẓẔẕẕ" lang="en"/>
+<l:gentext key="normalize.sort.output" text="AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBCCCCCCCCCCCCCCCCCDDDDDDDDDDDDDDDDDDDDDDDDEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEFFFFFFGGGGGGGGGGGGGGGGGGGGHHHHHHHHHHHHHHHHHHHHIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIJJJJJJKKKKKKKKKKKKKKLLLLLLLLLLLLLLLLLLLLLLLLLLMMMMMMMMMNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOPPPPPPPPQQQRRRRRRRRRRRRRRRRRRRRRRRSSSSSSSSSSSSSSSSSSSSSSSTTTTTTTTTTTTTTTTTTTTTTTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUVVVVVVVVWWWWWWWWWWWWWWWXXXXXXYYYYYYYYYYYYYYYYYYYYYYYZZZZZZZZZZZZZZZZZZZZZ" lang="en"/>
+<l:dingbat key="startquote" text="“"/>
+<l:dingbat key="endquote" text="â€"/>
+<l:dingbat key="nestedstartquote" text="‘"/>
+<l:dingbat key="nestedendquote" text="’"/>
+<l:dingbat key="singlestartquote" text="‘" lang="en"/>
+<l:dingbat key="singleendquote" text="’" lang="en"/>
+<l:dingbat key="bullet" text="•"/>
+<l:gentext key="hyphenation-character" text="-" lang="en"/>
+<l:gentext key="hyphenation-push-character-count" text="2" lang="en"/>
+<l:gentext key="hyphenation-remain-character-count" text="2" lang="en"/>
+<l:context name="styles"><l:template name="person-name" text="first-last"/>
+</l:context>
+<l:context name="title"><l:template name="abstract" text="%t"/>
+<l:template name="acknowledgements" text="%t" lang="en"/>
+<l:template name="answer" text="%t"/>
+<l:template name="appendix" text="Tillegg %n. %t"/>
+<l:template name="article" text="%t"/>
+<l:template name="authorblurb" text="%t"/>
+<l:template name="bibliodiv" text="%t"/>
+<l:template name="biblioentry" text="%t"/>
+<l:template name="bibliography" text="%t"/>
+<l:template name="bibliolist" text="%t" lang="en"/>
+<l:template name="bibliomixed" text="%t"/>
+<l:template name="bibliomset" text="%t"/>
+<l:template name="biblioset" text="%t"/>
+<l:template name="blockquote" text="%t"/>
+<l:template name="book" text="%t"/>
+<l:template name="calloutlist" text="%t"/>
+<l:template name="caution" text="%t"/>
+<l:template name="chapter" text="Kapittel %n. %t"/>
+<l:template name="colophon" text="%t"/>
+<l:template name="dedication" text="%t"/>
+<l:template name="equation" text="Formel %n. %t"/>
+<l:template name="example" text="Eksempel %n. %t"/>
+<l:template name="figure" text="Figur %n. %t"/>
+<l:template name="foil" text="%t" lang="en"/>
+<l:template name="foilgroup" text="%t" lang="en"/>
+<l:template name="formalpara" text="%t"/>
+<l:template name="glossary" text="%t"/>
+<l:template name="glossdiv" text="%t"/>
+<l:template name="glosslist" text="%t" lang="en"/>
+<l:template name="glossentry" text="%t" lang="en"/>
+<l:template name="important" text="%t"/>
+<l:template name="index" text="%t"/>
+<l:template name="indexdiv" text="%t"/>
+<l:template name="itemizedlist" text="%t"/>
+<l:template name="legalnotice" text="%t"/>
+<l:template name="listitem" text=""/>
+<l:template name="lot" text="%t"/>
+<l:template name="msg" text="%t"/>
+<l:template name="msgexplan" text="%t"/>
+<l:template name="msgmain" text="%t"/>
+<l:template name="msgrel" text="%t"/>
+<l:template name="msgset" text="%t"/>
+<l:template name="msgsub" text="%t"/>
+<l:template name="note" text="%t"/>
+<l:template name="orderedlist" text="%t"/>
+<l:template name="part" text="Del %n. %t"/>
+<l:template name="partintro" text="%t"/>
+<l:template name="preface" text="%t"/>
+<l:template name="procedure" text="%t"/>
+<l:template name="procedure.formal" text="Prosedyre %n. %t"/>
+<l:template name="productionset" text="%t"/>
+<l:template name="productionset.formal" text="Produksjon %n"/>
+<l:template name="qandadiv" text="%t"/>
+<l:template name="qandaentry" text="%t"/>
+<l:template name="qandaset" text="%t"/>
+<l:template name="question" text="%t"/>
+<l:template name="refentry" text="%t"/>
+<l:template name="reference" text="%t"/>
+<l:template name="refsection" text="%t"/>
+<l:template name="refsect1" text="%t"/>
+<l:template name="refsect2" text="%t"/>
+<l:template name="refsect3" text="%t"/>
+<l:template name="refsynopsisdiv" text="%t"/>
+<l:template name="refsynopsisdivinfo" text="%t"/>
+<l:template name="segmentedlist" text="%t"/>
+<l:template name="set" text="%t"/>
+<l:template name="setindex" text="%t"/>
+<l:template name="sidebar" text="%t"/>
+<l:template name="step" text="%t"/>
+<l:template name="table" text="Tabell %n. %t"/>
+<l:template name="task" text="%t" lang="en"/>
+<l:template name="tasksummary" text="%t" lang="en"/>
+<l:template name="taskprerequisites" text="%t" lang="en"/>
+<l:template name="taskrelated" text="%t" lang="en"/>
+<l:template name="tip" text="%t"/>
+<l:template name="toc" text="%t"/>
+<l:template name="variablelist" text="%t"/>
+<l:template name="varlistentry" text="" lang="en"/>
+<l:template name="warning" text="%t"/>
+</l:context>
+<l:context name="title-unnumbered"><l:template name="appendix" text="%t"/>
+<l:template name="article/appendix" text="%t" lang="en"/>
+<l:template name="bridgehead" text="%t"/>
+<l:template name="chapter" text="%t"/>
+<l:template name="sect1" text="%t"/>
+<l:template name="sect2" text="%t"/>
+<l:template name="sect3" text="%t"/>
+<l:template name="sect4" text="%t"/>
+<l:template name="sect5" text="%t"/>
+<l:template name="section" text="%t"/>
+<l:template name="simplesect" text="%t"/>
+<l:template name="part" text="%t" lang="en"/>
+</l:context>
+<l:context name="title-numbered"><l:template name="appendix" text="Tillegg %n. %t"/>
+<l:template name="article/appendix" text="%n. %t" lang="en"/>
+<l:template name="bridgehead" text="%t"/>
+<l:template name="chapter" text="Kapittel %n. %t"/>
+<l:template name="part" text="Del %n. %t"/>
+<l:template name="sect1" text="%n. %t"/>
+<l:template name="sect2" text="%n. %t"/>
+<l:template name="sect3" text="%n. %t"/>
+<l:template name="sect4" text="%n. %t"/>
+<l:template name="sect5" text="%n. %t"/>
+<l:template name="section" text="%n. %t"/>
+<l:template name="simplesect" text="%n. %t"/>
+</l:context>
+<l:context name="subtitle"><l:template name="appendix" text="%s"/>
+<l:template name="acknowledgements" text="%s" lang="en"/>
+<l:template name="article" text="%s"/>
+<l:template name="bibliodiv" text="%s"/>
+<l:template name="biblioentry" text="%s"/>
+<l:template name="bibliography" text="%s"/>
+<l:template name="bibliomixed" text="%s"/>
+<l:template name="bibliomset" text="%s"/>
+<l:template name="biblioset" text="%s"/>
+<l:template name="book" text="%s"/>
+<l:template name="chapter" text="%s"/>
+<l:template name="colophon" text="%s"/>
+<l:template name="dedication" text="%s"/>
+<l:template name="glossary" text="%s"/>
+<l:template name="glossdiv" text="%s"/>
+<l:template name="index" text="%s"/>
+<l:template name="indexdiv" text="%s"/>
+<l:template name="lot" text="%s"/>
+<l:template name="part" text="%s"/>
+<l:template name="partintro" text="%s"/>
+<l:template name="preface" text="%s"/>
+<l:template name="refentry" text="%s"/>
+<l:template name="reference" text="%s"/>
+<l:template name="refsection" text="%s"/>
+<l:template name="refsect1" text="%s"/>
+<l:template name="refsect2" text="%s"/>
+<l:template name="refsect3" text="%s"/>
+<l:template name="refsynopsisdiv" text="%s"/>
+<l:template name="sect1" text="%s"/>
+<l:template name="sect2" text="%s"/>
+<l:template name="sect3" text="%s"/>
+<l:template name="sect4" text="%s"/>
+<l:template name="sect5" text="%s"/>
+<l:template name="section" text="%s"/>
+<l:template name="set" text="%s"/>
+<l:template name="setindex" text="%s"/>
+<l:template name="sidebar" text="%s"/>
+<l:template name="simplesect" text="%s"/>
+<l:template name="toc" text="%s"/>
+</l:context>
+<l:context name="xref"><l:template name="abstract" text="%t"/>
+<l:template name="acknowledgements" text="%t" lang="en"/>
+<l:template name="answer" text="Svar %n"/>
+<l:template name="appendix" text="%t"/>
+<l:template name="article" text="%t"/>
+<l:template name="authorblurb" text="%t"/>
+<l:template name="bibliodiv" text="%t"/>
+<l:template name="bibliography" text="%t"/>
+<l:template name="bibliomset" text="%t"/>
+<l:template name="biblioset" text="%t"/>
+<l:template name="blockquote" text="%t"/>
+<l:template name="book" text="%t"/>
+<l:template name="calloutlist" text="%t"/>
+<l:template name="caution" text="%t"/>
+<l:template name="chapter" text="%t"/>
+<l:template name="colophon" text="%t"/>
+<l:template name="constraintdef" text="%t"/>
+<l:template name="dedication" text="%t"/>
+<l:template name="equation" text="%t"/>
+<l:template name="example" text="%t"/>
+<l:template name="figure" text="%t"/>
+<l:template name="foil" text="%t" lang="en"/>
+<l:template name="foilgroup" text="%t" lang="en"/>
+<l:template name="formalpara" text="%t"/>
+<l:template name="glossary" text="%t"/>
+<l:template name="glossdiv" text="%t"/>
+<l:template name="important" text="%t"/>
+<l:template name="index" text="%t"/>
+<l:template name="indexdiv" text="%t"/>
+<l:template name="itemizedlist" text="%t"/>
+<l:template name="legalnotice" text="%t"/>
+<l:template name="listitem" text="%n"/>
+<l:template name="lot" text="%t"/>
+<l:template name="msg" text="%t"/>
+<l:template name="msgexplan" text="%t"/>
+<l:template name="msgmain" text="%t"/>
+<l:template name="msgrel" text="%t"/>
+<l:template name="msgset" text="%t"/>
+<l:template name="msgsub" text="%t"/>
+<l:template name="note" text="%t"/>
+<l:template name="orderedlist" text="%t"/>
+<l:template name="part" text="%t"/>
+<l:template name="partintro" text="%t"/>
+<l:template name="preface" text="%t"/>
+<l:template name="procedure" text="%t"/>
+<l:template name="productionset" text="%t"/>
+<l:template name="qandadiv" text="%t"/>
+<l:template name="qandaentry" text="Spørsmål %n"/>
+<l:template name="qandaset" text="%t"/>
+<l:template name="question" text="Spørsmål %n"/>
+<l:template name="reference" text="%t"/>
+<l:template name="refsynopsisdiv" text="%t"/>
+<l:template name="segmentedlist" text="%t"/>
+<l:template name="set" text="%t"/>
+<l:template name="setindex" text="%t"/>
+<l:template name="sidebar" text="%t"/>
+<l:template name="table" text="%t"/>
+<l:template name="task" text="%t" lang="en"/>
+<l:template name="tip" text="%t"/>
+<l:template name="toc" text="%t"/>
+<l:template name="variablelist" text="%t"/>
+<l:template name="varlistentry" text="%n"/>
+<l:template name="warning" text="%t"/>
+<l:template name="olink.document.citation" text=" in %o" lang="en"/>
+<l:template name="olink.page.citation" text=" (page %p)" lang="en"/>
+<l:template name="page.citation" text=" [%p]"/>
+<l:template name="page" text="(page %p)" lang="en"/>
+<l:template name="docname" text=" in %o" lang="en"/>
+<l:template name="docnamelong" text=" in the document titled %o" lang="en"/>
+<l:template name="pageabbrev" text="(p. %p)" lang="en"/>
+<l:template name="Page" text="Page %p" lang="en"/>
+<l:template name="bridgehead" text="“%tâ€"/>
+<l:template name="refsection" text="“%tâ€"/>
+<l:template name="refsect1" text="“%tâ€"/>
+<l:template name="refsect2" text="“%tâ€"/>
+<l:template name="refsect3" text="“%tâ€"/>
+<l:template name="sect1" text="“%tâ€"/>
+<l:template name="sect2" text="“%tâ€"/>
+<l:template name="sect3" text="“%tâ€"/>
+<l:template name="sect4" text="“%tâ€"/>
+<l:template name="sect5" text="“%tâ€"/>
+<l:template name="section" text="“%tâ€"/>
+<l:template name="simplesect" text="“%tâ€"/>
+</l:context>
+<l:context name="xref-number"><l:template name="answer" text="Svar %n"/>
+<l:template name="appendix" text="Tillegg %n"/>
+<l:template name="bridgehead" text="Seksjon %n"/>
+<l:template name="chapter" text="Kapittel %n"/>
+<l:template name="equation" text="Formel %n"/>
+<l:template name="example" text="Eksempel %n"/>
+<l:template name="figure" text="Figur %n"/>
+<l:template name="part" text="Del %n"/>
+<l:template name="procedure" text="Prosedyre %n"/>
+<l:template name="productionset" text="Produksjon %n"/>
+<l:template name="qandadiv" text="Spørsmål og svar %n"/>
+<l:template name="qandaentry" text="Spørsmål %n"/>
+<l:template name="question" text="Spørsmål %n"/>
+<l:template name="sect1" text="Seksjon %n"/>
+<l:template name="sect2" text="Seksjon %n"/>
+<l:template name="sect3" text="Seksjon %n"/>
+<l:template name="sect4" text="Seksjon %n"/>
+<l:template name="sect5" text="Seksjon %n"/>
+<l:template name="section" text="Seksjon %n"/>
+<l:template name="table" text="Tabell %n"/>
+</l:context>
+<l:context name="xref-number-and-title"><l:template name="appendix" text="Tillegg %n, %t"/>
+<l:template name="bridgehead" text="Seksjon %n, “%tâ€"/>
+<l:template name="chapter" text="Kapittel %n, %t"/>
+<l:template name="equation" text="Formel %n, “%tâ€"/>
+<l:template name="example" text="Eksempel %n, “%tâ€"/>
+<l:template name="figure" text="Figur %n, “%tâ€"/>
+<l:template name="part" text="Del %n, “%tâ€"/>
+<l:template name="procedure" text="Prosedyre %n, “%tâ€"/>
+<l:template name="productionset" text="Produksjon %n, “%tâ€"/>
+<l:template name="qandadiv" text="SpørsmÃ¥l og svar %n, “%tâ€"/>
+<l:template name="refsect1" text="Seksjonen kalt “%tâ€"/>
+<l:template name="refsect2" text="Seksjonen kalt “%tâ€"/>
+<l:template name="refsect3" text="Seksjonen kalt “%tâ€"/>
+<l:template name="refsection" text="Seksjonen kalt “%tâ€"/>
+<l:template name="sect1" text="Seksjon %n, “%tâ€"/>
+<l:template name="sect2" text="Seksjon %n, “%tâ€"/>
+<l:template name="sect3" text="Seksjon %n, “%tâ€"/>
+<l:template name="sect4" text="Seksjon %n, “%tâ€"/>
+<l:template name="sect5" text="Seksjon %n, “%tâ€"/>
+<l:template name="section" text="Seksjon %n, “%tâ€"/>
+<l:template name="simplesect" text="Seksjonen kalt “%tâ€"/>
+<l:template name="table" text="Tabell %n, “%tâ€"/>
+</l:context>
+<l:context name="authorgroup"><l:template name="sep" text=", "/>
+<l:template name="sep2" text=" og "/>
+<l:template name="seplast" text=", og "/>
+</l:context>
+<l:context name="glossary"><l:template name="see" text="Se %t."/>
+<l:template name="seealso" text="Se også %t."/>
+<l:template name="seealso-separator" text=", "/>
+</l:context>
+<l:context name="msgset"><l:template name="MsgAud" text="Publikum: "/>
+<l:template name="MsgLevel" text="Nivå: "/>
+<l:template name="MsgOrig" text="Opphav: "/>
+</l:context>
+<l:context name="datetime"><l:template name="format" text="m/d/Y" lang="en"/>
+</l:context>
+<l:context name="termdef"><l:template name="prefix" text="[Definition: " lang="en"/>
+<l:template name="suffix" text="]" lang="en"/>
+</l:context>
+<l:context name="datetime-full"><l:template name="January" text="January" lang="en"/>
+<l:template name="February" text="February" lang="en"/>
+<l:template name="March" text="March" lang="en"/>
+<l:template name="April" text="April" lang="en"/>
+<l:template name="May" text="May" lang="en"/>
+<l:template name="June" text="June" lang="en"/>
+<l:template name="July" text="July" lang="en"/>
+<l:template name="August" text="August" lang="en"/>
+<l:template name="September" text="September" lang="en"/>
+<l:template name="October" text="October" lang="en"/>
+<l:template name="November" text="November" lang="en"/>
+<l:template name="December" text="December" lang="en"/>
+<l:template name="Monday" text="Monday" lang="en"/>
+<l:template name="Tuesday" text="Tuesday" lang="en"/>
+<l:template name="Wednesday" text="Wednesday" lang="en"/>
+<l:template name="Thursday" text="Thursday" lang="en"/>
+<l:template name="Friday" text="Friday" lang="en"/>
+<l:template name="Saturday" text="Saturday" lang="en"/>
+<l:template name="Sunday" text="Sunday" lang="en"/>
+</l:context>
+<l:context name="datetime-abbrev"><l:template name="Jan" text="Jan" lang="en"/>
+<l:template name="Feb" text="Feb" lang="en"/>
+<l:template name="Mar" text="Mar" lang="en"/>
+<l:template name="Apr" text="Apr" lang="en"/>
+<l:template name="May" text="May" lang="en"/>
+<l:template name="Jun" text="Jun" lang="en"/>
+<l:template name="Jul" text="Jul" lang="en"/>
+<l:template name="Aug" text="Aug" lang="en"/>
+<l:template name="Sep" text="Sep" lang="en"/>
+<l:template name="Oct" text="Oct" lang="en"/>
+<l:template name="Nov" text="Nov" lang="en"/>
+<l:template name="Dec" text="Dec" lang="en"/>
+<l:template name="Mon" text="Mon" lang="en"/>
+<l:template name="Tue" text="Tue" lang="en"/>
+<l:template name="Wed" text="Wed" lang="en"/>
+<l:template name="Thu" text="Thu" lang="en"/>
+<l:template name="Fri" text="Fri" lang="en"/>
+<l:template name="Sat" text="Sat" lang="en"/>
+<l:template name="Sun" text="Sun" lang="en"/>
+</l:context>
+<l:context name="htmlhelp"><l:template name="langcode" text="0x0414 Norwegian Bokmål"/>
+</l:context>
+<l:context name="index"><l:template name="term-separator" text=", " lang="en"/>
+<l:template name="number-separator" text=", " lang="en"/>
+<l:template name="range-separator" text="-" lang="en"/>
+</l:context>
+<l:context name="iso690"><l:template name="lastfirst.sep" text=", " lang="en"/>
+<l:template name="alt.person.two.sep" text=" – " lang="en"/>
+<l:template name="alt.person.last.sep" text=" – " lang="en"/>
+<l:template name="alt.person.more.sep" text=" – " lang="en"/>
+<l:template name="primary.editor" text=" (ed.)" lang="en"/>
+<l:template name="primary.many" text=", et al." lang="en"/>
+<l:template name="primary.sep" text=". " lang="en"/>
+<l:template name="submaintitle.sep" text=": " lang="en"/>
+<l:template name="title.sep" text=". " lang="en"/>
+<l:template name="othertitle.sep" text=", " lang="en"/>
+<l:template name="medium1" text=" [" lang="en"/>
+<l:template name="medium2" text="]" lang="en"/>
+<l:template name="secondary.person.sep" text="; " lang="en"/>
+<l:template name="secondary.sep" text=". " lang="en"/>
+<l:template name="respons.sep" text=". " lang="en"/>
+<l:template name="edition.sep" text=". " lang="en"/>
+<l:template name="edition.serial.sep" text=", " lang="en"/>
+<l:template name="issuing.range" text="-" lang="en"/>
+<l:template name="issuing.div" text=", " lang="en"/>
+<l:template name="issuing.sep" text=". " lang="en"/>
+<l:template name="partnr.sep" text=". " lang="en"/>
+<l:template name="placepubl.sep" text=": " lang="en"/>
+<l:template name="publyear.sep" text=", " lang="en"/>
+<l:template name="pubinfo.sep" text=". " lang="en"/>
+<l:template name="spec.pubinfo.sep" text=", " lang="en"/>
+<l:template name="upd.sep" text=", " lang="en"/>
+<l:template name="datecit1" text=" [cited " lang="en"/>
+<l:template name="datecit2" text="]" lang="en"/>
+<l:template name="extent.sep" text=". " lang="en"/>
+<l:template name="locs.sep" text=", " lang="en"/>
+<l:template name="location.sep" text=". " lang="en"/>
+<l:template name="serie.sep" text=". " lang="en"/>
+<l:template name="notice.sep" text=". " lang="en"/>
+<l:template name="access" text="Available " lang="en"/>
+<l:template name="acctoo" text="Also available " lang="en"/>
+<l:template name="onwww" text="from World Wide Web" lang="en"/>
+<l:template name="oninet" text="from Internet" lang="en"/>
+<l:template name="access.end" text=": " lang="en"/>
+<l:template name="link1" text="&lt;" lang="en"/>
+<l:template name="link2" text="&gt;" lang="en"/>
+<l:template name="access.sep" text=". " lang="en"/>
+<l:template name="isbn" text="ISBN " lang="en"/>
+<l:template name="issn" text="ISSN " lang="en"/>
+<l:template name="stdnum.sep" text=". " lang="en"/>
+<l:template name="patcountry.sep" text=". " lang="en"/>
+<l:template name="pattype.sep" text=", " lang="en"/>
+<l:template name="patnum.sep" text=". " lang="en"/>
+<l:template name="patdate.sep" text=". " lang="en"/>
+</l:context><l:letters lang="en"><l:l i="-1"/>
+<l:l i="0">Symbols</l:l>
+<l:l i="10">A</l:l>
+<l:l i="10">a</l:l>
+<l:l i="10">À</l:l>
+<l:l i="10">à</l:l>
+<l:l i="10">Ã</l:l>
+<l:l i="10">á</l:l>
+<l:l i="10">Â</l:l>
+<l:l i="10">â</l:l>
+<l:l i="10">Ã</l:l>
+<l:l i="10">ã</l:l>
+<l:l i="10">Ä</l:l>
+<l:l i="10">ä</l:l>
+<l:l i="10">Ã…</l:l>
+<l:l i="10">Ã¥</l:l>
+<l:l i="10">Ä€</l:l>
+<l:l i="10">Ä</l:l>
+<l:l i="10">Ä‚</l:l>
+<l:l i="10">ă</l:l>
+<l:l i="10">Ä„</l:l>
+<l:l i="10">Ä…</l:l>
+<l:l i="10">Ç</l:l>
+<l:l i="10">ÇŽ</l:l>
+<l:l i="10">Çž</l:l>
+<l:l i="10">ÇŸ</l:l>
+<l:l i="10">Ç </l:l>
+<l:l i="10">Ç¡</l:l>
+<l:l i="10">Ǻ</l:l>
+<l:l i="10">Ç»</l:l>
+<l:l i="10">È€</l:l>
+<l:l i="10">È</l:l>
+<l:l i="10">È‚</l:l>
+<l:l i="10">ȃ</l:l>
+<l:l i="10">Ȧ</l:l>
+<l:l i="10">ȧ</l:l>
+<l:l i="10">Ḁ</l:l>
+<l:l i="10">á¸</l:l>
+<l:l i="10">ẚ</l:l>
+<l:l i="10">Ạ</l:l>
+<l:l i="10">ạ</l:l>
+<l:l i="10">Ả</l:l>
+<l:l i="10">ả</l:l>
+<l:l i="10">Ấ</l:l>
+<l:l i="10">ấ</l:l>
+<l:l i="10">Ầ</l:l>
+<l:l i="10">ầ</l:l>
+<l:l i="10">Ẩ</l:l>
+<l:l i="10">ẩ</l:l>
+<l:l i="10">Ẫ</l:l>
+<l:l i="10">ẫ</l:l>
+<l:l i="10">Ậ</l:l>
+<l:l i="10">ậ</l:l>
+<l:l i="10">Ắ</l:l>
+<l:l i="10">ắ</l:l>
+<l:l i="10">Ằ</l:l>
+<l:l i="10">ằ</l:l>
+<l:l i="10">Ẳ</l:l>
+<l:l i="10">ẳ</l:l>
+<l:l i="10">Ẵ</l:l>
+<l:l i="10">ẵ</l:l>
+<l:l i="10">Ặ</l:l>
+<l:l i="10">ặ</l:l>
+<l:l i="20">B</l:l>
+<l:l i="20">b</l:l>
+<l:l i="20">Æ€</l:l>
+<l:l i="20">Æ</l:l>
+<l:l i="20">É“</l:l>
+<l:l i="20">Æ‚</l:l>
+<l:l i="20">ƃ</l:l>
+<l:l i="20">Ḃ</l:l>
+<l:l i="20">ḃ</l:l>
+<l:l i="20">Ḅ</l:l>
+<l:l i="20">ḅ</l:l>
+<l:l i="20">Ḇ</l:l>
+<l:l i="20">ḇ</l:l>
+<l:l i="30">C</l:l>
+<l:l i="30">c</l:l>
+<l:l i="30">Ç</l:l>
+<l:l i="30">ç</l:l>
+<l:l i="30">Ć</l:l>
+<l:l i="30">ć</l:l>
+<l:l i="30">Ĉ</l:l>
+<l:l i="30">ĉ</l:l>
+<l:l i="30">ÄŠ</l:l>
+<l:l i="30">Ä‹</l:l>
+<l:l i="30">Č</l:l>
+<l:l i="30">Ä</l:l>
+<l:l i="30">Ƈ</l:l>
+<l:l i="30">ƈ</l:l>
+<l:l i="30">É•</l:l>
+<l:l i="30">Ḉ</l:l>
+<l:l i="30">ḉ</l:l>
+<l:l i="40">D</l:l>
+<l:l i="40">d</l:l>
+<l:l i="40">ÄŽ</l:l>
+<l:l i="40">Ä</l:l>
+<l:l i="40">Ä</l:l>
+<l:l i="40">Ä‘</l:l>
+<l:l i="40">ÆŠ</l:l>
+<l:l i="40">É—</l:l>
+<l:l i="40">Æ‹</l:l>
+<l:l i="40">ƌ</l:l>
+<l:l i="40">Ç…</l:l>
+<l:l i="40">Dz</l:l>
+<l:l i="40">È¡</l:l>
+<l:l i="40">É–</l:l>
+<l:l i="40">Ḋ</l:l>
+<l:l i="40">ḋ</l:l>
+<l:l i="40">Ḍ</l:l>
+<l:l i="40">á¸</l:l>
+<l:l i="40">Ḏ</l:l>
+<l:l i="40">á¸</l:l>
+<l:l i="40">á¸</l:l>
+<l:l i="40">ḑ</l:l>
+<l:l i="40">Ḓ</l:l>
+<l:l i="40">ḓ</l:l>
+<l:l i="50">E</l:l>
+<l:l i="50">e</l:l>
+<l:l i="50">È</l:l>
+<l:l i="50">è</l:l>
+<l:l i="50">É</l:l>
+<l:l i="50">é</l:l>
+<l:l i="50">Ê</l:l>
+<l:l i="50">ê</l:l>
+<l:l i="50">Ë</l:l>
+<l:l i="50">ë</l:l>
+<l:l i="50">Ä’</l:l>
+<l:l i="50">Ä“</l:l>
+<l:l i="50">Ä”</l:l>
+<l:l i="50">Ä•</l:l>
+<l:l i="50">Ä–</l:l>
+<l:l i="50">Ä—</l:l>
+<l:l i="50">Ę</l:l>
+<l:l i="50">Ä™</l:l>
+<l:l i="50">Äš</l:l>
+<l:l i="50">Ä›</l:l>
+<l:l i="50">È„</l:l>
+<l:l i="50">È…</l:l>
+<l:l i="50">Ȇ</l:l>
+<l:l i="50">ȇ</l:l>
+<l:l i="50">Ȩ</l:l>
+<l:l i="50">È©</l:l>
+<l:l i="50">Ḕ</l:l>
+<l:l i="50">ḕ</l:l>
+<l:l i="50">Ḗ</l:l>
+<l:l i="50">ḗ</l:l>
+<l:l i="50">Ḙ</l:l>
+<l:l i="50">ḙ</l:l>
+<l:l i="50">Ḛ</l:l>
+<l:l i="50">ḛ</l:l>
+<l:l i="50">Ḝ</l:l>
+<l:l i="50">á¸</l:l>
+<l:l i="50">Ẹ</l:l>
+<l:l i="50">ẹ</l:l>
+<l:l i="50">Ẻ</l:l>
+<l:l i="50">ẻ</l:l>
+<l:l i="50">Ẽ</l:l>
+<l:l i="50">ẽ</l:l>
+<l:l i="50">Ế</l:l>
+<l:l i="50">ế</l:l>
+<l:l i="50">Ề</l:l>
+<l:l i="50">á»</l:l>
+<l:l i="50">Ể</l:l>
+<l:l i="50">ể</l:l>
+<l:l i="50">Ễ</l:l>
+<l:l i="50">á»…</l:l>
+<l:l i="50">Ệ</l:l>
+<l:l i="50">ệ</l:l>
+<l:l i="60">F</l:l>
+<l:l i="60">f</l:l>
+<l:l i="60">Æ‘</l:l>
+<l:l i="60">Æ’</l:l>
+<l:l i="60">Ḟ</l:l>
+<l:l i="60">ḟ</l:l>
+<l:l i="70">G</l:l>
+<l:l i="70">g</l:l>
+<l:l i="70">Ĝ</l:l>
+<l:l i="70">Ä</l:l>
+<l:l i="70">Äž</l:l>
+<l:l i="70">ÄŸ</l:l>
+<l:l i="70">Ä </l:l>
+<l:l i="70">Ä¡</l:l>
+<l:l i="70">Ä¢</l:l>
+<l:l i="70">Ä£</l:l>
+<l:l i="70">Æ“</l:l>
+<l:l i="70">É </l:l>
+<l:l i="70">Ǥ</l:l>
+<l:l i="70">Ç¥</l:l>
+<l:l i="70">Ǧ</l:l>
+<l:l i="70">ǧ</l:l>
+<l:l i="70">Ç´</l:l>
+<l:l i="70">ǵ</l:l>
+<l:l i="70">Ḡ</l:l>
+<l:l i="70">ḡ</l:l>
+<l:l i="80">H</l:l>
+<l:l i="80">h</l:l>
+<l:l i="80">Ĥ</l:l>
+<l:l i="80">Ä¥</l:l>
+<l:l i="80">Ħ</l:l>
+<l:l i="80">ħ</l:l>
+<l:l i="80">Èž</l:l>
+<l:l i="80">ÈŸ</l:l>
+<l:l i="80">ɦ</l:l>
+<l:l i="80">Ḣ</l:l>
+<l:l i="80">ḣ</l:l>
+<l:l i="80">Ḥ</l:l>
+<l:l i="80">ḥ</l:l>
+<l:l i="80">Ḧ</l:l>
+<l:l i="80">ḧ</l:l>
+<l:l i="80">Ḩ</l:l>
+<l:l i="80">ḩ</l:l>
+<l:l i="80">Ḫ</l:l>
+<l:l i="80">ḫ</l:l>
+<l:l i="80">ẖ</l:l>
+<l:l i="90">I</l:l>
+<l:l i="90">i</l:l>
+<l:l i="90">Ì</l:l>
+<l:l i="90">ì</l:l>
+<l:l i="90">Ã</l:l>
+<l:l i="90">í</l:l>
+<l:l i="90">ÃŽ</l:l>
+<l:l i="90">î</l:l>
+<l:l i="90">Ã</l:l>
+<l:l i="90">ï</l:l>
+<l:l i="90">Ĩ</l:l>
+<l:l i="90">Ä©</l:l>
+<l:l i="90">Ī</l:l>
+<l:l i="90">Ä«</l:l>
+<l:l i="90">Ĭ</l:l>
+<l:l i="90">Ä­</l:l>
+<l:l i="90">Ä®</l:l>
+<l:l i="90">į</l:l>
+<l:l i="90">Ä°</l:l>
+<l:l i="90">Æ—</l:l>
+<l:l i="90">ɨ</l:l>
+<l:l i="90">Ç</l:l>
+<l:l i="90">Ç</l:l>
+<l:l i="90">Ȉ</l:l>
+<l:l i="90">ȉ</l:l>
+<l:l i="90">ÈŠ</l:l>
+<l:l i="90">È‹</l:l>
+<l:l i="90">Ḭ</l:l>
+<l:l i="90">ḭ</l:l>
+<l:l i="90">Ḯ</l:l>
+<l:l i="90">ḯ</l:l>
+<l:l i="90">Ỉ</l:l>
+<l:l i="90">ỉ</l:l>
+<l:l i="90">Ị</l:l>
+<l:l i="90">ị</l:l>
+<l:l i="100">J</l:l>
+<l:l i="100">j</l:l>
+<l:l i="100">Ä´</l:l>
+<l:l i="100">ĵ</l:l>
+<l:l i="100">Ç°</l:l>
+<l:l i="100">Ê</l:l>
+<l:l i="110">K</l:l>
+<l:l i="110">k</l:l>
+<l:l i="110">Ķ</l:l>
+<l:l i="110">Ä·</l:l>
+<l:l i="110">Ƙ</l:l>
+<l:l i="110">Æ™</l:l>
+<l:l i="110">Ǩ</l:l>
+<l:l i="110">Ç©</l:l>
+<l:l i="110">Ḱ</l:l>
+<l:l i="110">ḱ</l:l>
+<l:l i="110">Ḳ</l:l>
+<l:l i="110">ḳ</l:l>
+<l:l i="110">Ḵ</l:l>
+<l:l i="110">ḵ</l:l>
+<l:l i="120">L</l:l>
+<l:l i="120">l</l:l>
+<l:l i="120">Ĺ</l:l>
+<l:l i="120">ĺ</l:l>
+<l:l i="120">Ä»</l:l>
+<l:l i="120">ļ</l:l>
+<l:l i="120">Ľ</l:l>
+<l:l i="120">ľ</l:l>
+<l:l i="120">Ä¿</l:l>
+<l:l i="120">Å€</l:l>
+<l:l i="120">Å</l:l>
+<l:l i="120">Å‚</l:l>
+<l:l i="120">Æš</l:l>
+<l:l i="120">Lj</l:l>
+<l:l i="120">È´</l:l>
+<l:l i="120">É«</l:l>
+<l:l i="120">ɬ</l:l>
+<l:l i="120">É­</l:l>
+<l:l i="120">Ḷ</l:l>
+<l:l i="120">ḷ</l:l>
+<l:l i="120">Ḹ</l:l>
+<l:l i="120">ḹ</l:l>
+<l:l i="120">Ḻ</l:l>
+<l:l i="120">ḻ</l:l>
+<l:l i="120">Ḽ</l:l>
+<l:l i="120">ḽ</l:l>
+<l:l i="130">M</l:l>
+<l:l i="130">m</l:l>
+<l:l i="130">ɱ</l:l>
+<l:l i="130">Ḿ</l:l>
+<l:l i="130">ḿ</l:l>
+<l:l i="130">á¹€</l:l>
+<l:l i="130">á¹</l:l>
+<l:l i="130">Ṃ</l:l>
+<l:l i="130">ṃ</l:l>
+<l:l i="140">N</l:l>
+<l:l i="140">n</l:l>
+<l:l i="140">Ñ</l:l>
+<l:l i="140">ñ</l:l>
+<l:l i="140">Ń</l:l>
+<l:l i="140">Å„</l:l>
+<l:l i="140">Å…</l:l>
+<l:l i="140">ņ</l:l>
+<l:l i="140">Ň</l:l>
+<l:l i="140">ň</l:l>
+<l:l i="140">Æ</l:l>
+<l:l i="140">ɲ</l:l>
+<l:l i="140">Æž</l:l>
+<l:l i="140">È </l:l>
+<l:l i="140">Ç‹</l:l>
+<l:l i="140">Ǹ</l:l>
+<l:l i="140">ǹ</l:l>
+<l:l i="140">ȵ</l:l>
+<l:l i="140">ɳ</l:l>
+<l:l i="140">Ṅ</l:l>
+<l:l i="140">á¹…</l:l>
+<l:l i="140">Ṇ</l:l>
+<l:l i="140">ṇ</l:l>
+<l:l i="140">Ṉ</l:l>
+<l:l i="140">ṉ</l:l>
+<l:l i="140">Ṋ</l:l>
+<l:l i="140">ṋ</l:l>
+<l:l i="150">O</l:l>
+<l:l i="150">o</l:l>
+<l:l i="150">Ã’</l:l>
+<l:l i="150">ò</l:l>
+<l:l i="150">Ó</l:l>
+<l:l i="150">ó</l:l>
+<l:l i="150">Ô</l:l>
+<l:l i="150">ô</l:l>
+<l:l i="150">Õ</l:l>
+<l:l i="150">õ</l:l>
+<l:l i="150">Ö</l:l>
+<l:l i="150">ö</l:l>
+<l:l i="150">Ø</l:l>
+<l:l i="150">ø</l:l>
+<l:l i="150">Ō</l:l>
+<l:l i="150">Å</l:l>
+<l:l i="150">ÅŽ</l:l>
+<l:l i="150">Å</l:l>
+<l:l i="150">Å</l:l>
+<l:l i="150">Å‘</l:l>
+<l:l i="150">ÆŸ</l:l>
+<l:l i="150">Æ </l:l>
+<l:l i="150">Æ¡</l:l>
+<l:l i="150">Ç‘</l:l>
+<l:l i="150">Ç’</l:l>
+<l:l i="150">Ǫ</l:l>
+<l:l i="150">Ç«</l:l>
+<l:l i="150">Ǭ</l:l>
+<l:l i="150">Ç­</l:l>
+<l:l i="150">Ǿ</l:l>
+<l:l i="150">Ç¿</l:l>
+<l:l i="150">Ȍ</l:l>
+<l:l i="150">È</l:l>
+<l:l i="150">ÈŽ</l:l>
+<l:l i="150">È</l:l>
+<l:l i="150">Ȫ</l:l>
+<l:l i="150">È«</l:l>
+<l:l i="150">Ȭ</l:l>
+<l:l i="150">È­</l:l>
+<l:l i="150">È®</l:l>
+<l:l i="150">ȯ</l:l>
+<l:l i="150">È°</l:l>
+<l:l i="150">ȱ</l:l>
+<l:l i="150">Ṍ</l:l>
+<l:l i="150">á¹</l:l>
+<l:l i="150">Ṏ</l:l>
+<l:l i="150">á¹</l:l>
+<l:l i="150">á¹</l:l>
+<l:l i="150">ṑ</l:l>
+<l:l i="150">á¹’</l:l>
+<l:l i="150">ṓ</l:l>
+<l:l i="150">Ọ</l:l>
+<l:l i="150">á»</l:l>
+<l:l i="150">Ỏ</l:l>
+<l:l i="150">á»</l:l>
+<l:l i="150">á»</l:l>
+<l:l i="150">ố</l:l>
+<l:l i="150">á»’</l:l>
+<l:l i="150">ồ</l:l>
+<l:l i="150">á»”</l:l>
+<l:l i="150">ổ</l:l>
+<l:l i="150">á»–</l:l>
+<l:l i="150">á»—</l:l>
+<l:l i="150">Ộ</l:l>
+<l:l i="150">á»™</l:l>
+<l:l i="150">Ớ</l:l>
+<l:l i="150">á»›</l:l>
+<l:l i="150">Ờ</l:l>
+<l:l i="150">á»</l:l>
+<l:l i="150">Ở</l:l>
+<l:l i="150">ở</l:l>
+<l:l i="150">á» </l:l>
+<l:l i="150">ỡ</l:l>
+<l:l i="150">Ợ</l:l>
+<l:l i="150">ợ</l:l>
+<l:l i="160">P</l:l>
+<l:l i="160">p</l:l>
+<l:l i="160">Ƥ</l:l>
+<l:l i="160">Æ¥</l:l>
+<l:l i="160">á¹”</l:l>
+<l:l i="160">ṕ</l:l>
+<l:l i="160">á¹–</l:l>
+<l:l i="160">á¹—</l:l>
+<l:l i="170">Q</l:l>
+<l:l i="170">q</l:l>
+<l:l i="170">Ê </l:l>
+<l:l i="180">R</l:l>
+<l:l i="180">r</l:l>
+<l:l i="180">Å”</l:l>
+<l:l i="180">Å•</l:l>
+<l:l i="180">Å–</l:l>
+<l:l i="180">Å—</l:l>
+<l:l i="180">Ř</l:l>
+<l:l i="180">Å™</l:l>
+<l:l i="180">È</l:l>
+<l:l i="180">È‘</l:l>
+<l:l i="180">È’</l:l>
+<l:l i="180">È“</l:l>
+<l:l i="180">ɼ</l:l>
+<l:l i="180">ɽ</l:l>
+<l:l i="180">ɾ</l:l>
+<l:l i="180">Ṙ</l:l>
+<l:l i="180">á¹™</l:l>
+<l:l i="180">Ṛ</l:l>
+<l:l i="180">á¹›</l:l>
+<l:l i="180">Ṝ</l:l>
+<l:l i="180">á¹</l:l>
+<l:l i="180">Ṟ</l:l>
+<l:l i="180">ṟ</l:l>
+<l:l i="190">S</l:l>
+<l:l i="190">s</l:l>
+<l:l i="190">Åš</l:l>
+<l:l i="190">Å›</l:l>
+<l:l i="190">Ŝ</l:l>
+<l:l i="190">Å</l:l>
+<l:l i="190">Åž</l:l>
+<l:l i="190">ÅŸ</l:l>
+<l:l i="190">Å </l:l>
+<l:l i="190">Å¡</l:l>
+<l:l i="190">Ș</l:l>
+<l:l i="190">È™</l:l>
+<l:l i="190">Ê‚</l:l>
+<l:l i="190">á¹ </l:l>
+<l:l i="190">ṡ</l:l>
+<l:l i="190">á¹¢</l:l>
+<l:l i="190">á¹£</l:l>
+<l:l i="190">Ṥ</l:l>
+<l:l i="190">á¹¥</l:l>
+<l:l i="190">Ṧ</l:l>
+<l:l i="190">ṧ</l:l>
+<l:l i="190">Ṩ</l:l>
+<l:l i="190">ṩ</l:l>
+<l:l i="200">T</l:l>
+<l:l i="200">t</l:l>
+<l:l i="200">Å¢</l:l>
+<l:l i="200">Å£</l:l>
+<l:l i="200">Ť</l:l>
+<l:l i="200">Å¥</l:l>
+<l:l i="200">Ŧ</l:l>
+<l:l i="200">ŧ</l:l>
+<l:l i="200">Æ«</l:l>
+<l:l i="200">Ƭ</l:l>
+<l:l i="200">Æ­</l:l>
+<l:l i="200">Æ®</l:l>
+<l:l i="200">ʈ</l:l>
+<l:l i="200">Èš</l:l>
+<l:l i="200">È›</l:l>
+<l:l i="200">ȶ</l:l>
+<l:l i="200">Ṫ</l:l>
+<l:l i="200">ṫ</l:l>
+<l:l i="200">Ṭ</l:l>
+<l:l i="200">á¹­</l:l>
+<l:l i="200">á¹®</l:l>
+<l:l i="200">ṯ</l:l>
+<l:l i="200">á¹°</l:l>
+<l:l i="200">á¹±</l:l>
+<l:l i="200">ẗ</l:l>
+<l:l i="210">U</l:l>
+<l:l i="210">u</l:l>
+<l:l i="210">Ù</l:l>
+<l:l i="210">ù</l:l>
+<l:l i="210">Ú</l:l>
+<l:l i="210">ú</l:l>
+<l:l i="210">Û</l:l>
+<l:l i="210">û</l:l>
+<l:l i="210">Ü</l:l>
+<l:l i="210">ü</l:l>
+<l:l i="210">Ũ</l:l>
+<l:l i="210">Å©</l:l>
+<l:l i="210">Ū</l:l>
+<l:l i="210">Å«</l:l>
+<l:l i="210">Ŭ</l:l>
+<l:l i="210">Å­</l:l>
+<l:l i="210">Å®</l:l>
+<l:l i="210">ů</l:l>
+<l:l i="210">Å°</l:l>
+<l:l i="210">ű</l:l>
+<l:l i="210">Ų</l:l>
+<l:l i="210">ų</l:l>
+<l:l i="210">Ư</l:l>
+<l:l i="210">Æ°</l:l>
+<l:l i="210">Ç“</l:l>
+<l:l i="210">Ç”</l:l>
+<l:l i="210">Ç•</l:l>
+<l:l i="210">Ç–</l:l>
+<l:l i="210">Ç—</l:l>
+<l:l i="210">ǘ</l:l>
+<l:l i="210">Ç™</l:l>
+<l:l i="210">Çš</l:l>
+<l:l i="210">Ç›</l:l>
+<l:l i="210">ǜ</l:l>
+<l:l i="210">È”</l:l>
+<l:l i="210">È•</l:l>
+<l:l i="210">È–</l:l>
+<l:l i="210">È—</l:l>
+<l:l i="210">á¹²</l:l>
+<l:l i="210">á¹³</l:l>
+<l:l i="210">á¹´</l:l>
+<l:l i="210">á¹µ</l:l>
+<l:l i="210">Ṷ</l:l>
+<l:l i="210">á¹·</l:l>
+<l:l i="210">Ṹ</l:l>
+<l:l i="210">á¹¹</l:l>
+<l:l i="210">Ṻ</l:l>
+<l:l i="210">á¹»</l:l>
+<l:l i="210">Ụ</l:l>
+<l:l i="210">ụ</l:l>
+<l:l i="210">Ủ</l:l>
+<l:l i="210">ủ</l:l>
+<l:l i="210">Ứ</l:l>
+<l:l i="210">ứ</l:l>
+<l:l i="210">Ừ</l:l>
+<l:l i="210">ừ</l:l>
+<l:l i="210">Ử</l:l>
+<l:l i="210">á»­</l:l>
+<l:l i="210">á»®</l:l>
+<l:l i="210">ữ</l:l>
+<l:l i="210">á»°</l:l>
+<l:l i="210">á»±</l:l>
+<l:l i="220">V</l:l>
+<l:l i="220">v</l:l>
+<l:l i="220">Ʋ</l:l>
+<l:l i="220">Ê‹</l:l>
+<l:l i="220">á¹¼</l:l>
+<l:l i="220">á¹½</l:l>
+<l:l i="220">á¹¾</l:l>
+<l:l i="220">ṿ</l:l>
+<l:l i="230">W</l:l>
+<l:l i="230">w</l:l>
+<l:l i="230">Å´</l:l>
+<l:l i="230">ŵ</l:l>
+<l:l i="230">Ẁ</l:l>
+<l:l i="230">áº</l:l>
+<l:l i="230">Ẃ</l:l>
+<l:l i="230">ẃ</l:l>
+<l:l i="230">Ẅ</l:l>
+<l:l i="230">ẅ</l:l>
+<l:l i="230">Ẇ</l:l>
+<l:l i="230">ẇ</l:l>
+<l:l i="230">Ẉ</l:l>
+<l:l i="230">ẉ</l:l>
+<l:l i="230">ẘ</l:l>
+<l:l i="240">X</l:l>
+<l:l i="240">x</l:l>
+<l:l i="240">Ẋ</l:l>
+<l:l i="240">ẋ</l:l>
+<l:l i="240">Ẍ</l:l>
+<l:l i="240">áº</l:l>
+<l:l i="250">Y</l:l>
+<l:l i="250">y</l:l>
+<l:l i="250">Ã</l:l>
+<l:l i="250">ý</l:l>
+<l:l i="250">ÿ</l:l>
+<l:l i="250">Ÿ</l:l>
+<l:l i="250">Ŷ</l:l>
+<l:l i="250">Å·</l:l>
+<l:l i="250">Ƴ</l:l>
+<l:l i="250">Æ´</l:l>
+<l:l i="250">Ȳ</l:l>
+<l:l i="250">ȳ</l:l>
+<l:l i="250">Ẏ</l:l>
+<l:l i="250">áº</l:l>
+<l:l i="250">ẙ</l:l>
+<l:l i="250">Ỳ</l:l>
+<l:l i="250">ỳ</l:l>
+<l:l i="250">á»´</l:l>
+<l:l i="250">ỵ</l:l>
+<l:l i="250">Ỷ</l:l>
+<l:l i="250">á»·</l:l>
+<l:l i="250">Ỹ</l:l>
+<l:l i="250">ỹ</l:l>
+<l:l i="260">Z</l:l>
+<l:l i="260">z</l:l>
+<l:l i="260">Ź</l:l>
+<l:l i="260">ź</l:l>
+<l:l i="260">Å»</l:l>
+<l:l i="260">ż</l:l>
+<l:l i="260">Ž</l:l>
+<l:l i="260">ž</l:l>
+<l:l i="260">Ƶ</l:l>
+<l:l i="260">ƶ</l:l>
+<l:l i="260">Ȥ</l:l>
+<l:l i="260">È¥</l:l>
+<l:l i="260">Ê</l:l>
+<l:l i="260">Ê‘</l:l>
+<l:l i="260">áº</l:l>
+<l:l i="260">ẑ</l:l>
+<l:l i="260">Ẓ</l:l>
+<l:l i="260">ẓ</l:l>
+<l:l i="260">Ẕ</l:l>
+<l:l i="260">ẕ</l:l>
+</l:letters>
+</l:l10n>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/nds.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/nds.xml
new file mode 100644
index 0000000..af4b296
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/nds.xml
@@ -0,0 +1,666 @@
+<?xml version="1.0" encoding="utf-8"?>
+<l:l10n xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0" language="nds" english-language-name="Low German">
+
+<!-- * This file is generated automatically. -->
+<!-- * To submit changes to this file upstream (to the DocBook Project) -->
+<!-- * do not submit an edited version of this file. Instead, submit an -->
+<!-- * edited version of the source file at the following location: -->
+<!-- * -->
+<!-- * https://docbook.svn.sourceforge.net/svnroot/docbook/trunk/gentext/locale/nds.xml -->
+<!-- * -->
+<!-- * E-mail the edited nds.xml source file to: -->
+<!-- * -->
+<!-- * docbook-developers@lists.sourceforge.net -->
+
+<!-- ******************************************************************** -->
+
+<!-- This file is part of the XSL DocBook Stylesheet distribution. -->
+<!-- See ../README or http://docbook.sf.net/release/xsl/current/ for -->
+<!-- copyright and other information. -->
+
+<!-- ******************************************************************** -->
+<!-- In these files, % with a letter is used for a placeholder: -->
+<!-- %t is the current element's title -->
+<!-- %s is the current element's subtitle (if applicable)-->
+<!-- %n is the current element's number label-->
+<!-- %p is the current element's page number (if applicable)-->
+<!-- ******************************************************************** -->
+
+
+<l:gentext key="Abstract" text="Tosammenfaten"/>
+<l:gentext key="abstract" text="Tosammenfaten"/>
+<l:gentext key="Acknowledgements" text="Danksagungen"/>
+<l:gentext key="acknowledgements" text="Danksagungen"/>
+<l:gentext key="Answer" text="A:"/>
+<l:gentext key="answer" text="a:"/>
+<l:gentext key="Appendix" text="Anhang"/>
+<l:gentext key="appendix" text="Anhang"/>
+<l:gentext key="Article" text="Artikel"/>
+<l:gentext key="article" text="Artikel"/>
+<l:gentext key="Author" text="Schriever"/>
+<l:gentext key="Bibliography" text="Literaturverteeknis"/>
+<l:gentext key="bibliography" text="Literaturverteeknis"/>
+<l:gentext key="Book" text="Book"/>
+<l:gentext key="book" text="Book"/>
+<l:gentext key="CAUTION" text="ACHTUNG"/>
+<l:gentext key="Caution" text="Achtung"/>
+<l:gentext key="caution" text="Achtung"/>
+<l:gentext key="Chapter" text="Kapitel"/>
+<l:gentext key="chapter" text="Kapitel"/>
+<l:gentext key="Colophon" text="Kolophon"/>
+<l:gentext key="colophon" text="Kolophon"/>
+<l:gentext key="Copyright" text="Koperschood"/>
+<l:gentext key="copyright" text="Koperschood"/>
+<l:gentext key="Dedication" text="Widmung"/>
+<l:gentext key="dedication" text="Widmung"/>
+<l:gentext key="Edition" text="Utgav"/>
+<l:gentext key="edition" text="Utgav"/>
+<l:gentext key="Editor" text="Bewarker"/>
+<l:gentext key="Equation" text="Glieken"/>
+<l:gentext key="equation" text="Glieken"/>
+<l:gentext key="Example" text="Bispeel"/>
+<l:gentext key="example" text="Bispeel"/>
+<l:gentext key="Figure" text="Avbillen"/>
+<l:gentext key="figure" text="Avbillen"/>
+<l:gentext key="Glossary" text="Glossar"/>
+<l:gentext key="glossary" text="Glossar"/>
+<l:gentext key="GlossSee" text="Kiek"/>
+<l:gentext key="glosssee" text="kiek"/>
+<l:gentext key="GlossSeeAlso" text="Kiek ook"/>
+<l:gentext key="glossseealso" text="kiek ook"/>
+<l:gentext key="IMPORTANT" text="WICHTIG"/>
+<l:gentext key="important" text="Wichtig"/>
+<l:gentext key="Important" text="Wichtig"/>
+<l:gentext key="Index" text="Index"/>
+<l:gentext key="index" text="Index"/>
+<l:gentext key="ISBN" text="ISBN"/>
+<l:gentext key="isbn" text="ISBN"/>
+<l:gentext key="LegalNotice" text="Rechtlicher Henwies"/>
+<l:gentext key="legalnotice" text="rechtlicher Henwies"/>
+<l:gentext key="MsgAud" text="Täälgrupp"/>
+<l:gentext key="msgaud" text="Täälgrupp"/>
+<l:gentext key="MsgLevel" text="Ebene"/>
+<l:gentext key="msglevel" text="Ebene"/>
+<l:gentext key="MsgOrig" text="Ursprung"/>
+<l:gentext key="msgorig" text="Ursprung"/>
+<l:gentext key="NOTE" text="NOTIZ"/>
+<l:gentext key="Note" text="Notiz"/>
+<l:gentext key="note" text="Notiz"/>
+<l:gentext key="Part" text="Deel"/>
+<l:gentext key="part" text="Deel"/>
+<l:gentext key="Preface" text="Vorwoord"/>
+<l:gentext key="preface" text="Vorwoord"/>
+<l:gentext key="Procedure" text="Prozedur"/>
+<l:gentext key="procedure" text="Prozedur"/>
+<l:gentext key="ProductionSet" text="Produktschoon"/>
+<l:gentext key="PubDate" text="Veröpenlichendag"/>
+<l:gentext key="pubdate" text="Veröpenlichendag"/>
+<l:gentext key="Published" text="Veröpenlicht"/>
+<l:gentext key="published" text="Veröpenlicht"/>
+<l:gentext key="Publisher" text="Veröpenlicher"/>
+<l:gentext key="Qandadiv" text="F &amp; A"/>
+<l:gentext key="qandadiv" text="F &amp; A"/>
+<l:gentext key="QandASet" text="Oft stellte Fragen"/>
+<l:gentext key="Question" text="F:"/>
+<l:gentext key="question" text="F:"/>
+<l:gentext key="RefEntry" text="Siet"/>
+<l:gentext key="refentry" text="Siet"/>
+<l:gentext key="Reference" text="Verwies"/>
+<l:gentext key="reference" text="Verwies"/>
+<l:gentext key="References" text="Verwiese"/>
+<l:gentext key="RefName" text="Naam"/>
+<l:gentext key="refname" text="Naam"/>
+<l:gentext key="RefSection" text="Rebeet"/>
+<l:gentext key="refsection" text="Rebeet"/>
+<l:gentext key="RefSynopsisDiv" text="Synopsis"/>
+<l:gentext key="refsynopsisdiv" text="Synopsis"/>
+<l:gentext key="RevHistory" text="Verschoonshistorie"/>
+<l:gentext key="revhistory" text="Verschoonshistorie"/>
+<l:gentext key="revision" text="Verschoon"/>
+<l:gentext key="Revision" text="Verschoon"/>
+<l:gentext key="sect1" text="Rebeet"/>
+<l:gentext key="sect2" text="Rebeet"/>
+<l:gentext key="sect3" text="Rebeet"/>
+<l:gentext key="sect4" text="Rebeet"/>
+<l:gentext key="sect5" text="Rebeet"/>
+<l:gentext key="section" text="Rebeet"/>
+<l:gentext key="Section" text="Rebeet"/>
+<l:gentext key="see" text="kiek"/>
+<l:gentext key="See" text="Kiek"/>
+<l:gentext key="seealso" text="kiek ook"/>
+<l:gentext key="Seealso" text="Kiek ook"/>
+<l:gentext key="SeeAlso" text="Kiek ook"/>
+<l:gentext key="set" text="Satt"/>
+<l:gentext key="Set" text="Satt"/>
+<l:gentext key="setindex" text="Stickwoordverteeknis"/>
+<l:gentext key="SetIndex" text="Stickwoordverteeknis"/>
+<l:gentext key="Sidebar" text="Randnotiz"/>
+<l:gentext key="sidebar" text="Randnotiz"/>
+<l:gentext key="step" text="Schritt"/>
+<l:gentext key="Step" text="Schritt"/>
+<l:gentext key="table" text="Tabell"/>
+<l:gentext key="Table" text="Tabell"/>
+<l:gentext key="task" text="Opgav"/>
+<l:gentext key="Task" text="Opgav"/>
+<l:gentext key="tip" text="Henwies"/>
+<l:gentext key="TIP" text="Henwies"/>
+<l:gentext key="Tip" text="Henwies"/>
+<l:gentext key="Warning" text="Warnung"/>
+<l:gentext key="warning" text="Warnung"/>
+<l:gentext key="WARNING" text="WARNUNG"/>
+<l:gentext key="and" text="un"/>
+<l:gentext key="by" text="vun"/>
+<l:gentext key="Edited" text="Bewarkt"/>
+<l:gentext key="edited" text="bewarkt"/>
+<l:gentext key="Editedby" text="Bewarkt vun"/>
+<l:gentext key="editedby" text="bewarkt vun"/>
+<l:gentext key="in" text="in"/>
+<l:gentext key="lastlistcomma" text=","/>
+<l:gentext key="listcomma" text=","/>
+<l:gentext key="notes" text="Notizen"/>
+<l:gentext key="Notes" text="Notizen"/>
+<l:gentext key="Pgs" text="Sieten"/>
+<l:gentext key="pgs" text="Sieten"/>
+<l:gentext key="Revisedby" text="Ännert vun: "/>
+<l:gentext key="revisedby" text="ännert vun: "/>
+<l:gentext key="TableNotes" text="Notizen"/>
+<l:gentext key="tablenotes" text="Notizen"/>
+<l:gentext key="TableofContents" text="Inholltabell"/>
+<l:gentext key="tableofcontents" text="Inholltabell"/>
+<l:gentext key="unexpectedelementname" text="Unerwarteter Elementnaam"/>
+<l:gentext key="unsupported" text="nich unnerstütt"/>
+<l:gentext key="xrefto" text="xref op"/>
+<l:gentext key="Authors" text="Schrievers"/>
+<l:gentext key="copyeditor" text="Korrekteur"/>
+<l:gentext key="graphicdesigner" text="Grafikdesigner"/>
+<l:gentext key="productioneditor" text="Produktschoonsbewarker"/>
+<l:gentext key="technicaleditor" text="Technischer Bewarker"/>
+<l:gentext key="translator" text="Översetter"/>
+<l:gentext key="listofequations" text="Gliekenlist"/>
+<l:gentext key="ListofEquations" text="Gliekenlist"/>
+<l:gentext key="ListofExamples" text="Bispeellist"/>
+<l:gentext key="listofexamples" text="Bispeellist"/>
+<l:gentext key="ListofFigures" text="Avbillenlist"/>
+<l:gentext key="listoffigures" text="Avbillenlist"/>
+<l:gentext key="ListofProcedures" text="Prozedurlist"/>
+<l:gentext key="listofprocedures" text="Prozedurlist"/>
+<l:gentext key="listoftables" text="Tabelllist"/>
+<l:gentext key="ListofTables" text="Tabelllist"/>
+<l:gentext key="ListofUnknown" text="Unbekanntenlist"/>
+<l:gentext key="listofunknown" text="Unbekanntenlist"/>
+<l:gentext key="nav-home" text="Heem"/>
+<l:gentext key="nav-next" text="Nähster"/>
+<l:gentext key="nav-next-sibling" text="Foorts nah vorn"/>
+<l:gentext key="nav-prev" text="Voriger"/>
+<l:gentext key="nav-prev-sibling" text="Foorts torügg"/>
+<l:gentext key="nav-up" text="Op"/>
+<l:gentext key="nav-toc" text="ToC"/>
+<l:gentext key="Draft" text="Entwurf"/>
+<l:gentext key="above" text="över"/>
+<l:gentext key="below" text="unner"/>
+<l:gentext key="sectioncalled" text="avröpter Rebeet"/>
+<l:gentext key="index symbols" text="Symbole"/>
+<l:gentext key="writing-mode" text="lr-tb"/>
+<l:gentext key="lowercase.alpha" text="abcdefghijklmnopqrstuvwxyzäöüß"/>
+<l:gentext key="uppercase.alpha" text="ABCDEFGHIJKLMNOPQRSTUVWXYZÄÖÜß"/>
+<l:gentext key="normalize.sort.input" text="AaÀàÃáÂâÃãÄäÅåĀÄĂ㥹ÇǎǞǟǠǡǺǻȀÈȂȃȦȧḀá¸áºšáº áº¡áº¢áº£áº¤áº¥áº¦áº§áº¨áº©áºªáº«áº¬áº­áº®áº¯áº°áº±áº²áº³áº´áºµáº¶áº·BbÆ€ÆɓƂƃḂḃḄḅḆḇCcÇçĆćĈĉĊċČÄƇƈɕḈḉDdÄŽÄÄđƊɗƋƌDžDzȡɖḊḋḌá¸á¸Žá¸á¸á¸‘ḒḓEeÈèÉéÊêËëĒēĔĕĖėĘęĚěȄȅȆȇȨȩḔḕḖḗḘḙḚḛḜá¸áº¸áº¹áººáº»áº¼áº½áº¾áº¿á»€á»á»‚ểỄễỆệFfƑƒḞḟGgÄœÄĞğĠġĢģƓɠǤǥǦǧǴǵḠḡHhĤĥĦħȞȟɦḢḣḤḥḦḧḨḩḪḫẖIiÌìÃíÎîÃïĨĩĪīĬĭĮįİƗɨÇÇȈȉȊȋḬḭḮḯỈỉỊịJjĴĵǰÊKkĶķƘƙǨǩḰḱḲḳḴḵLlĹĺĻļĽľĿŀÅłƚLjȴɫɬɭḶḷḸḹḺḻḼḽMmɱḾḿṀá¹á¹‚ṃNnÑñŃńŅņŇňÆɲƞȠNjǸǹȵɳṄṅṆṇṈṉṊṋOoÒòÓóÔôÕõÖöØøŌÅÅŽÅÅőƟƠơǑǒǪǫǬǭǾǿȌÈÈŽÈȪȫȬȭȮȯȰȱṌá¹á¹Žá¹á¹á¹‘ṒṓỌá»á»Žá»á»á»‘ỒồỔổỖỗỘộỚớỜá»á»žá»Ÿá» á»¡á»¢á»£PpƤƥṔṕṖṗQqÊ RrŔŕŖŗŘřÈȑȒȓɼɽɾṘṙṚṛṜá¹á¹žá¹ŸSsŚśŜÅŞşŠšȘșʂṠṡṢṣṤṥṦṧṨṩTtŢţŤťŦŧƫƬƭƮʈȚțȶṪṫṬṭṮṯṰṱẗUuÙùÚúÛûÜüŨũŪūŬŭŮůŰűŲųƯưǓǔǕǖǗǘǙǚǛǜȔȕȖȗṲṳṴṵṶṷṸṹṺṻỤụỦủỨứỪừỬửỮữỰựVvƲʋṼṽṾṿWwŴŵẀáºáº‚ẃẄẅẆẇẈẉẘXxẊẋẌáºYyÃýÿŸŶŷƳƴȲȳẎáºáº™á»²á»³á»´á»µá»¶á»·á»¸á»¹ZzŹźŻżŽžƵƶȤȥÊÊ‘áºáº‘ẒẓẔẕẕ" lang="en"/>
+<l:gentext key="normalize.sort.output" text="AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBCCCCCCCCCCCCCCCCCDDDDDDDDDDDDDDDDDDDDDDDDEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEFFFFFFGGGGGGGGGGGGGGGGGGGGHHHHHHHHHHHHHHHHHHHHIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIJJJJJJKKKKKKKKKKKKKKLLLLLLLLLLLLLLLLLLLLLLLLLLMMMMMMMMMNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOPPPPPPPPQQQRRRRRRRRRRRRRRRRRRRRRRRSSSSSSSSSSSSSSSSSSSSSSSTTTTTTTTTTTTTTTTTTTTTTTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUVVVVVVVVWWWWWWWWWWWWWWWXXXXXXYYYYYYYYYYYYYYYYYYYYYYYZZZZZZZZZZZZZZZZZZZZZ" lang="en"/>
+<l:dingbat key="startquote" text="“"/>
+<l:dingbat key="endquote" text="â€"/>
+<l:dingbat key="nestedstartquote" text="‘"/>
+<l:dingbat key="nestedendquote" text="’"/>
+<l:dingbat key="singlestartquote" text="‘"/>
+<l:dingbat key="singleendquote" text="’"/>
+<l:dingbat key="bullet" text="•"/>
+<l:gentext key="hyphenation-character" text="-"/>
+<l:gentext key="hyphenation-push-character-count" text="2"/>
+<l:gentext key="hyphenation-remain-character-count" text="2"/>
+<l:context name="styles"><l:template name="person-name" text="first-last"/>
+</l:context>
+<l:context name="title"><l:template name="abstract" text="%t"/>
+<l:template name="acknowledgements" text="%t"/>
+<l:template name="answer" text="%t"/>
+<l:template name="appendix" text="Anhang %n. %t"/>
+<l:template name="article" text="%t"/>
+<l:template name="authorblurb" text="%t"/>
+<l:template name="bibliodiv" text="%t"/>
+<l:template name="biblioentry" text="%t"/>
+<l:template name="bibliography" text="%t"/>
+<l:template name="bibliolist" text="%t"/>
+<l:template name="bibliomixed" text="%t"/>
+<l:template name="bibliomset" text="%t"/>
+<l:template name="biblioset" text="%t"/>
+<l:template name="blockquote" text="%t"/>
+<l:template name="book" text="%t"/>
+<l:template name="calloutlist" text="%t"/>
+<l:template name="caution" text="%t"/>
+<l:template name="chapter" text="Kapitel %n. %t"/>
+<l:template name="colophon" text="%t"/>
+<l:template name="dedication" text="%t"/>
+<l:template name="equation" text="Glieken %n. %t"/>
+<l:template name="example" text="Bispeel %n. %t"/>
+<l:template name="figure" text="Avbillen %n. %t"/>
+<l:template name="foil" text="%t"/>
+<l:template name="foilgroup" text="%t"/>
+<l:template name="formalpara" text="%t"/>
+<l:template name="glossary" text="%t"/>
+<l:template name="glossdiv" text="%t"/>
+<l:template name="glosslist" text="%t"/>
+<l:template name="glossentry" text="%t"/>
+<l:template name="important" text="%t"/>
+<l:template name="index" text="%t"/>
+<l:template name="indexdiv" text="%t"/>
+<l:template name="itemizedlist" text="%t"/>
+<l:template name="legalnotice" text="%t"/>
+<l:template name="listitem" text=""/>
+<l:template name="lot" text="%t"/>
+<l:template name="msg" text="%t"/>
+<l:template name="msgexplan" text="%t"/>
+<l:template name="msgmain" text="%t"/>
+<l:template name="msgrel" text="%t"/>
+<l:template name="msgset" text="%t"/>
+<l:template name="msgsub" text="%t"/>
+<l:template name="note" text="%t"/>
+<l:template name="orderedlist" text="%t"/>
+<l:template name="part" text="Deel %n. %t"/>
+<l:template name="partintro" text="%t"/>
+<l:template name="preface" text="%t"/>
+<l:template name="procedure" text="%t"/>
+<l:template name="procedure.formal" text="Prozedur %n. %t"/>
+<l:template name="productionset" text="%t"/>
+<l:template name="productionset.formal" text="Produktschoon %n"/>
+<l:template name="qandadiv" text="%t"/>
+<l:template name="qandaentry" text="%t"/>
+<l:template name="qandaset" text="%t"/>
+<l:template name="question" text="%t"/>
+<l:template name="refentry" text="%t"/>
+<l:template name="reference" text="%t"/>
+<l:template name="refsection" text="%t"/>
+<l:template name="refsect1" text="%t"/>
+<l:template name="refsect2" text="%t"/>
+<l:template name="refsect3" text="%t"/>
+<l:template name="refsynopsisdiv" text="%t"/>
+<l:template name="refsynopsisdivinfo" text="%t"/>
+<l:template name="segmentedlist" text="%t"/>
+<l:template name="set" text="%t"/>
+<l:template name="setindex" text="%t"/>
+<l:template name="sidebar" text="%t"/>
+<l:template name="step" text="%t"/>
+<l:template name="table" text="Tabell %n. %t"/>
+<l:template name="task" text="%t"/>
+<l:template name="tasksummary" text="%t"/>
+<l:template name="taskprerequisites" text="%t"/>
+<l:template name="taskrelated" text="%t"/>
+<l:template name="tip" text="%t"/>
+<l:template name="toc" text="%t"/>
+<l:template name="variablelist" text="%t"/>
+<l:template name="varlistentry" text=""/>
+<l:template name="warning" text="%t"/>
+</l:context>
+<l:context name="title-unnumbered"><l:template name="appendix" text="%t"/>
+<l:template name="article/appendix" text="%t"/>
+<l:template name="bridgehead" text="%t"/>
+<l:template name="chapter" text="%t"/>
+<l:template name="sect1" text="%t"/>
+<l:template name="sect2" text="%t"/>
+<l:template name="sect3" text="%t"/>
+<l:template name="sect4" text="%t"/>
+<l:template name="sect5" text="%t"/>
+<l:template name="section" text="%t"/>
+<l:template name="simplesect" text="%t"/>
+<l:template name="part" text="%t"/>
+</l:context>
+<l:context name="title-numbered"><l:template name="appendix" text="Anhang %n. %t"/>
+<l:template name="article/appendix" text="%n. %t"/>
+<l:template name="bridgehead" text="%n. %t"/>
+<l:template name="chapter" text="Kapitel %n. %t"/>
+<l:template name="part" text="Deel %n. %t"/>
+<l:template name="sect1" text="%n. %t"/>
+<l:template name="sect2" text="%n. %t"/>
+<l:template name="sect3" text="%n. %t"/>
+<l:template name="sect4" text="%n. %t"/>
+<l:template name="sect5" text="%n. %t"/>
+<l:template name="section" text="%n. %t"/>
+<l:template name="simplesect" text="%t"/>
+</l:context>
+<l:context name="subtitle"><l:template name="appendix" text="%s"/>
+<l:template name="acknowledgements" text="%s"/>
+<l:template name="article" text="%s"/>
+<l:template name="bibliodiv" text="%s"/>
+<l:template name="biblioentry" text="%s"/>
+<l:template name="bibliography" text="%s"/>
+<l:template name="bibliomixed" text="%s"/>
+<l:template name="bibliomset" text="%s"/>
+<l:template name="biblioset" text="%s"/>
+<l:template name="book" text="%s"/>
+<l:template name="chapter" text="%s"/>
+<l:template name="colophon" text="%s"/>
+<l:template name="dedication" text="%s"/>
+<l:template name="glossary" text="%s"/>
+<l:template name="glossdiv" text="%s"/>
+<l:template name="index" text="%s"/>
+<l:template name="indexdiv" text="%s"/>
+<l:template name="lot" text="%s"/>
+<l:template name="part" text="%s"/>
+<l:template name="partintro" text="%s"/>
+<l:template name="preface" text="%s"/>
+<l:template name="refentry" text="%s"/>
+<l:template name="reference" text="%s"/>
+<l:template name="refsection" text="%s"/>
+<l:template name="refsect1" text="%s"/>
+<l:template name="refsect2" text="%s"/>
+<l:template name="refsect3" text="%s"/>
+<l:template name="refsynopsisdiv" text="%s"/>
+<l:template name="sect1" text="%s"/>
+<l:template name="sect2" text="%s"/>
+<l:template name="sect3" text="%s"/>
+<l:template name="sect4" text="%s"/>
+<l:template name="sect5" text="%s"/>
+<l:template name="section" text="%s"/>
+<l:template name="set" text="%s"/>
+<l:template name="setindex" text="%s"/>
+<l:template name="sidebar" text="%s"/>
+<l:template name="simplesect" text="%s"/>
+<l:template name="toc" text="%s"/>
+</l:context>
+<l:context name="xref"><l:template name="abstract" text="%t"/>
+<l:template name="acknowledgements" text="%t"/>
+<l:template name="answer" text="A: %n"/>
+<l:template name="appendix" text="%t"/>
+<l:template name="article" text="%t"/>
+<l:template name="authorblurb" text="%t"/>
+<l:template name="bibliodiv" text="%t"/>
+<l:template name="bibliography" text="%t"/>
+<l:template name="bibliomset" text="%t"/>
+<l:template name="biblioset" text="%t"/>
+<l:template name="blockquote" text="%t"/>
+<l:template name="book" text="%t"/>
+<l:template name="calloutlist" text="%t"/>
+<l:template name="caution" text="%t"/>
+<l:template name="chapter" text="%t"/>
+<l:template name="colophon" text="%t"/>
+<l:template name="constraintdef" text="%t"/>
+<l:template name="dedication" text="%t"/>
+<l:template name="equation" text="%t"/>
+<l:template name="example" text="%t"/>
+<l:template name="figure" text="%t"/>
+<l:template name="foil" text="%t"/>
+<l:template name="foilgroup" text="%t"/>
+<l:template name="formalpara" text="%t"/>
+<l:template name="glossary" text="%t"/>
+<l:template name="glossdiv" text="%t"/>
+<l:template name="important" text="%t"/>
+<l:template name="index" text="%t"/>
+<l:template name="indexdiv" text="%t"/>
+<l:template name="itemizedlist" text="%t"/>
+<l:template name="legalnotice" text="%t"/>
+<l:template name="listitem" text="%n"/>
+<l:template name="lot" text="%t"/>
+<l:template name="msg" text="%t"/>
+<l:template name="msgexplan" text="%t"/>
+<l:template name="msgmain" text="%t"/>
+<l:template name="msgrel" text="%t"/>
+<l:template name="msgset" text="%t"/>
+<l:template name="msgsub" text="%t"/>
+<l:template name="note" text="%t"/>
+<l:template name="orderedlist" text="%t"/>
+<l:template name="part" text="%t"/>
+<l:template name="partintro" text="%t"/>
+<l:template name="preface" text="%t"/>
+<l:template name="procedure" text="%t"/>
+<l:template name="productionset" text="%t"/>
+<l:template name="qandadiv" text="%t"/>
+<l:template name="qandaentry" text="F: %n"/>
+<l:template name="qandaset" text="%t"/>
+<l:template name="question" text="F: %n"/>
+<l:template name="reference" text="%t"/>
+<l:template name="refsynopsisdiv" text="%t"/>
+<l:template name="segmentedlist" text="%t"/>
+<l:template name="set" text="%t"/>
+<l:template name="setindex" text="%t"/>
+<l:template name="sidebar" text="%t"/>
+<l:template name="table" text="%t"/>
+<l:template name="task" text="%t"/>
+<l:template name="tip" text="%t"/>
+<l:template name="toc" text="%t"/>
+<l:template name="variablelist" text="%t"/>
+<l:template name="varlistentry" text="%n"/>
+<l:template name="warning" text="%t"/>
+<l:template name="olink.document.citation" text=" in %o"/>
+<l:template name="olink.page.citation" text=" (page %p)"/>
+<l:template name="page.citation" text=" [%p]"/>
+<l:template name="page" text="(page %p)"/>
+<l:template name="docname" text=" in %o"/>
+<l:template name="docnamelong" text=" in the document titled %o"/>
+<l:template name="pageabbrev" text="(p. %p)"/>
+<l:template name="Page" text="Page %p"/>
+<l:template name="bridgehead" text="avröpter Rebeet “%tâ€"/>
+<l:template name="refsection" text="avröpter Rebeet “%tâ€"/>
+<l:template name="refsect1" text="avröpter Rebeet “%tâ€"/>
+<l:template name="refsect2" text="avröpter Rebeet “%tâ€"/>
+<l:template name="refsect3" text="avröpter Rebeet “%tâ€"/>
+<l:template name="sect1" text="avröpter Rebeet “%tâ€"/>
+<l:template name="sect2" text="avröpter Rebeet “%tâ€"/>
+<l:template name="sect3" text="avröpter Rebeet “%tâ€"/>
+<l:template name="sect4" text="avröpter Rebeet “%tâ€"/>
+<l:template name="sect5" text="avröpter Rebeet “%tâ€"/>
+<l:template name="section" text="avröpter Rebeet “%tâ€"/>
+<l:template name="simplesect" text="avröpter Rebeet “%tâ€"/>
+</l:context>
+<l:context name="xref-number"><l:template name="answer" text="A: %n"/>
+<l:template name="appendix" text="Anhang %n"/>
+<l:template name="bridgehead" text="Rebeet %n"/>
+<l:template name="chapter" text="Kapitel %n"/>
+<l:template name="equation" text="Glieken %n"/>
+<l:template name="example" text="Bispeel %n"/>
+<l:template name="figure" text="Avbillen %n"/>
+<l:template name="part" text="Deel %n"/>
+<l:template name="procedure" text="Prozedur %n"/>
+<l:template name="productionset" text="Produktschoon %n"/>
+<l:template name="qandadiv" text="F &amp; A %n"/>
+<l:template name="qandaentry" text="F: %n"/>
+<l:template name="question" text="F: %n"/>
+<l:template name="sect1" text="Rebeet %n"/>
+<l:template name="sect2" text="Rebeet %n"/>
+<l:template name="sect3" text="Rebeet %n"/>
+<l:template name="sect4" text="Rebeet %n"/>
+<l:template name="sect5" text="Rebeet %n"/>
+<l:template name="section" text="Rebeet %n"/>
+<l:template name="table" text="Tabell %n"/>
+</l:context>
+<l:context name="xref-number-and-title"><l:template name="appendix" text="Anhang %n, %t"/>
+<l:template name="bridgehead" text="Rebeet %n, “%tâ€"/>
+<l:template name="chapter" text="Kapitel %n, %t"/>
+<l:template name="equation" text="Glieken %n, “%tâ€"/>
+<l:template name="example" text="Bispeel %n, “%tâ€"/>
+<l:template name="figure" text="Avbillen %n, “%tâ€"/>
+<l:template name="part" text="Deel %n, “%tâ€"/>
+<l:template name="procedure" text="Prozedur %n, “%tâ€"/>
+<l:template name="productionset" text="Produktschoon %n, “%tâ€"/>
+<l:template name="qandadiv" text="F &amp; A %n, “%tâ€"/>
+<l:template name="refsect1" text="avröpter Rebeet “%tâ€"/>
+<l:template name="refsect2" text="avröpter Rebeet “%tâ€"/>
+<l:template name="refsect3" text="avröpter Rebeet “%tâ€"/>
+<l:template name="refsection" text="avröpter Rebeet “%tâ€"/>
+<l:template name="sect1" text="Rebeet %n, “%tâ€"/>
+<l:template name="sect2" text="Rebeet %n, “%tâ€"/>
+<l:template name="sect3" text="Rebeet %n, “%tâ€"/>
+<l:template name="sect4" text="Rebeet %n, “%tâ€"/>
+<l:template name="sect5" text="Rebeet %n, “%tâ€"/>
+<l:template name="section" text="Rebeet %n, “%tâ€"/>
+<l:template name="simplesect" text="avröpter Rebeet “%tâ€"/>
+<l:template name="table" text="Tabell %n, “%tâ€"/>
+</l:context>
+<l:context name="authorgroup"><l:template name="sep" text=", "/>
+<l:template name="sep2" text=" un "/>
+<l:template name="seplast" text=", un "/>
+</l:context>
+<l:context name="glossary"><l:template name="see" text="Kiek %t."/>
+<l:template name="seealso" text="Kiek ook %t."/>
+<l:template name="seealso-separator" text=", "/>
+</l:context>
+<l:context name="msgset"><l:template name="MsgAud" text="Täälgrupp: "/>
+<l:template name="MsgLevel" text="Ebene: "/>
+<l:template name="MsgOrig" text="Ursprung: "/>
+</l:context>
+<l:context name="datetime"><l:template name="format" text="d/m/Y"/>
+</l:context>
+<l:context name="termdef"><l:template name="prefix" text="[Definitschoon: "/>
+<l:template name="suffix" text="]"/>
+</l:context>
+<l:context name="datetime-full"><l:template name="January" text="Januar"/>
+<l:template name="February" text="Februar"/>
+<l:template name="March" text="März"/>
+<l:template name="April" text="April"/>
+<l:template name="May" text="Mai"/>
+<l:template name="June" text="Juni"/>
+<l:template name="July" text="Juli"/>
+<l:template name="August" text="August"/>
+<l:template name="September" text="September"/>
+<l:template name="October" text="Oktober"/>
+<l:template name="November" text="November"/>
+<l:template name="December" text="Dezember"/>
+<l:template name="Monday" text="Mondag"/>
+<l:template name="Tuesday" text="Deensdag"/>
+<l:template name="Wednesday" text="Middeweeken"/>
+<l:template name="Thursday" text="Dünnersdag"/>
+<l:template name="Friday" text="Friedag"/>
+<l:template name="Saturday" text="Sünnavend"/>
+<l:template name="Sunday" text="Sünndag"/>
+</l:context>
+<l:context name="datetime-abbrev"><l:template name="Jan" text="Jan"/>
+<l:template name="Feb" text="Feb"/>
+<l:template name="Mar" text="Mär"/>
+<l:template name="Apr" text="Apr"/>
+<l:template name="May" text="Mai"/>
+<l:template name="Jun" text="Jun"/>
+<l:template name="Jul" text="Jul"/>
+<l:template name="Aug" text="Aug"/>
+<l:template name="Sep" text="Sep"/>
+<l:template name="Oct" text="Okt"/>
+<l:template name="Nov" text="Nov"/>
+<l:template name="Dec" text="Dez"/>
+<l:template name="Mon" text="Mon"/>
+<l:template name="Tue" text="Dee"/>
+<l:template name="Wed" text="Mid"/>
+<l:template name="Thu" text="Dün"/>
+<l:template name="Fri" text="Fri"/>
+<l:template name="Sat" text="Svd"/>
+<l:template name="Sun" text="Sün"/>
+</l:context>
+<l:context name="htmlhelp"><l:template name="langcode" text="0x0409 English (UNITED STATES)" lang="en"/>
+</l:context>
+<l:context name="index"><l:template name="term-separator" text=", "/>
+<l:template name="number-separator" text=", "/>
+<l:template name="range-separator" text="-"/>
+</l:context>
+<l:context name="iso690"><l:template name="lastfirst.sep" text=", "/>
+<l:template name="alt.person.two.sep" text=" – "/>
+<l:template name="alt.person.last.sep" text=" – "/>
+<l:template name="alt.person.more.sep" text=" – "/>
+<l:template name="primary.editor" text=" (ed.)"/>
+<l:template name="primary.many" text=", et al."/>
+<l:template name="primary.sep" text=". "/>
+<l:template name="submaintitle.sep" text=": "/>
+<l:template name="title.sep" text=". "/>
+<l:template name="othertitle.sep" text=", "/>
+<l:template name="medium1" text=" ["/>
+<l:template name="medium2" text="]"/>
+<l:template name="secondary.person.sep" text="; "/>
+<l:template name="secondary.sep" text=". "/>
+<l:template name="respons.sep" text=". "/>
+<l:template name="edition.sep" text=". "/>
+<l:template name="edition.serial.sep" text=", "/>
+<l:template name="issuing.range" text="-"/>
+<l:template name="issuing.div" text=", "/>
+<l:template name="issuing.sep" text=". "/>
+<l:template name="partnr.sep" text=". "/>
+<l:template name="placepubl.sep" text=": "/>
+<l:template name="publyear.sep" text=", "/>
+<l:template name="pubinfo.sep" text=". "/>
+<l:template name="spec.pubinfo.sep" text=", "/>
+<l:template name="upd.sep" text=", "/>
+<l:template name="datecit1" text=" [cited "/>
+<l:template name="datecit2" text="]"/>
+<l:template name="extent.sep" text=". "/>
+<l:template name="locs.sep" text=", "/>
+<l:template name="location.sep" text=". "/>
+<l:template name="serie.sep" text=". "/>
+<l:template name="notice.sep" text=". "/>
+<l:template name="access" text="Available "/>
+<l:template name="acctoo" text="Also available "/>
+<l:template name="onwww" text="from World Wide Web"/>
+<l:template name="oninet" text="from Internet"/>
+<l:template name="access.end" text=": "/>
+<l:template name="link1" text="&lt;"/>
+<l:template name="link2" text="&gt;"/>
+<l:template name="access.sep" text=". "/>
+<l:template name="isbn" text="ISBN "/>
+<l:template name="issn" text="ISSN "/>
+<l:template name="stdnum.sep" text=". "/>
+<l:template name="patcountry.sep" text=". "/>
+<l:template name="pattype.sep" text=", "/>
+<l:template name="patnum.sep" text=". "/>
+<l:template name="patdate.sep" text=". "/>
+</l:context><l:letters><l:l i="-1"/>
+<l:l i="0">Symbole</l:l>
+<l:l i="1">A</l:l>
+<l:l i="1">a</l:l>
+<l:l i="1">Ä</l:l>
+<l:l i="1">ä</l:l>
+<l:l i="2">B</l:l>
+<l:l i="2">b</l:l>
+<l:l i="3">C</l:l>
+<l:l i="3">c</l:l>
+<l:l i="4">D</l:l>
+<l:l i="4">d</l:l>
+<l:l i="5">E</l:l>
+<l:l i="5">e</l:l>
+<l:l i="6">F</l:l>
+<l:l i="6">f</l:l>
+<l:l i="7">G</l:l>
+<l:l i="7">g</l:l>
+<l:l i="8">H</l:l>
+<l:l i="8">h</l:l>
+<l:l i="9">I</l:l>
+<l:l i="9">i</l:l>
+<l:l i="10">J</l:l>
+<l:l i="10">j</l:l>
+<l:l i="11">K</l:l>
+<l:l i="11">k</l:l>
+<l:l i="12">L</l:l>
+<l:l i="12">l</l:l>
+<l:l i="13">M</l:l>
+<l:l i="13">m</l:l>
+<l:l i="14">N</l:l>
+<l:l i="14">n</l:l>
+<l:l i="15">O</l:l>
+<l:l i="15">o</l:l>
+<l:l i="15">Ö</l:l>
+<l:l i="15">ö</l:l>
+<l:l i="16">P</l:l>
+<l:l i="16">p</l:l>
+<l:l i="17">Q</l:l>
+<l:l i="17">q</l:l>
+<l:l i="18">R</l:l>
+<l:l i="18">r</l:l>
+<l:l i="19">S</l:l>
+<l:l i="19">s</l:l>
+<l:l i="20">T</l:l>
+<l:l i="20">t</l:l>
+<l:l i="21">U</l:l>
+<l:l i="21">u</l:l>
+<l:l i="21">Ü</l:l>
+<l:l i="21">ü</l:l>
+<l:l i="22">V</l:l>
+<l:l i="22">v</l:l>
+<l:l i="23">W</l:l>
+<l:l i="23">w</l:l>
+<l:l i="24">X</l:l>
+<l:l i="24">x</l:l>
+<l:l i="25">Y</l:l>
+<l:l i="25">y</l:l>
+<l:l i="26">Z</l:l>
+<l:l i="26">z</l:l>
+</l:letters>
+</l:l10n>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/nl.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/nl.xml
new file mode 100644
index 0000000..33fb1f4
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/nl.xml
@@ -0,0 +1,660 @@
+<?xml version="1.0" encoding="utf-8"?>
+<l:l10n xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0" language="nl" english-language-name="Dutch">
+
+<!-- * This file is generated automatically. -->
+<!-- * To submit changes to this file upstream (to the DocBook Project) -->
+<!-- * do not submit an edited version of this file. Instead, submit an -->
+<!-- * edited version of the source file at the following location: -->
+<!-- * -->
+<!-- * https://docbook.svn.sourceforge.net/svnroot/docbook/trunk/gentext/locale/nl.xml -->
+<!-- * -->
+<!-- * E-mail the edited nl.xml source file to: -->
+<!-- * -->
+<!-- * docbook-developers@lists.sourceforge.net -->
+
+<!-- ******************************************************************** -->
+
+<!-- This file is part of the XSL DocBook Stylesheet distribution. -->
+<!-- See ../README or http://docbook.sf.net/release/xsl/current/ for -->
+<!-- copyright and other information. -->
+
+<!-- ******************************************************************** -->
+<!-- In these files, % with a letter is used for a placeholder: -->
+<!-- %t is the current element's title -->
+<!-- %s is the current element's subtitle (if applicable)-->
+<!-- %n is the current element's number label-->
+<!-- %p is the current element's page number (if applicable)-->
+<!-- ******************************************************************** -->
+
+
+<l:gentext key="Abstract" text="Samenvatting"/>
+<l:gentext key="abstract" text="samenvatting"/>
+<l:gentext key="Acknowledgements" text="Erkenning"/>
+<l:gentext key="acknowledgements" text="erkenning"/>
+<l:gentext key="Answer" text="Antwoord:"/>
+<l:gentext key="answer" text="antwoord:"/>
+<l:gentext key="Appendix" text="Bijlage"/>
+<l:gentext key="appendix" text="bijlage"/>
+<l:gentext key="Article" text="Artikel"/>
+<l:gentext key="article" text="artikel"/>
+<l:gentext key="Author" text="Auteur"/>
+<l:gentext key="Bibliography" text="Literatuurlijst"/>
+<l:gentext key="bibliography" text="literatuurlijst"/>
+<l:gentext key="Book" text="Boek"/>
+<l:gentext key="book" text="boek"/>
+<l:gentext key="CAUTION" text="LET OP"/>
+<l:gentext key="Caution" text="Let op"/>
+<l:gentext key="caution" text="let op"/>
+<l:gentext key="Chapter" text="Hoofdstuk"/>
+<l:gentext key="chapter" text="hoofdstuk"/>
+<l:gentext key="Colophon" text="Colofon"/>
+<l:gentext key="colophon" text="colofon"/>
+<l:gentext key="Copyright" text="Copyright"/>
+<l:gentext key="copyright" text="copyright"/>
+<l:gentext key="Dedication" text="Opdracht"/>
+<l:gentext key="dedication" text="opdracht"/>
+<l:gentext key="Edition" text="Uitgave"/>
+<l:gentext key="edition" text="uitgave"/>
+<l:gentext key="Editor" text="Redacteur"/>
+<l:gentext key="Equation" text="Vergelijking"/>
+<l:gentext key="equation" text="vergelijking"/>
+<l:gentext key="Example" text="Voorbeeld"/>
+<l:gentext key="example" text="voorbeeld"/>
+<l:gentext key="Figure" text="Afbeelding"/>
+<l:gentext key="figure" text="afbeelding"/>
+<l:gentext key="Glossary" text="Woordenlijst"/>
+<l:gentext key="glossary" text="woordenlijst"/>
+<l:gentext key="GlossSee" text="Zie"/>
+<l:gentext key="glosssee" text="zie"/>
+<l:gentext key="GlossSeeAlso" text="Zie ook"/>
+<l:gentext key="glossseealso" text="zie ook"/>
+<l:gentext key="IMPORTANT" text="BELANGRIJK"/>
+<l:gentext key="important" text="Belangrijk"/>
+<l:gentext key="Important" text="Belangrijk"/>
+<l:gentext key="Index" text="Register"/>
+<l:gentext key="index" text="Register"/>
+<l:gentext key="ISBN" text="ISBN"/>
+<l:gentext key="isbn" text="isbn"/>
+<l:gentext key="LegalNotice" text="Juridische kennisgeving"/>
+<l:gentext key="legalnotice" text="juridische kennisgeving"/>
+<l:gentext key="MsgAud" text="Doelgroep"/>
+<l:gentext key="msgaud" text="doelgroep"/>
+<l:gentext key="MsgLevel" text="Niveau"/>
+<l:gentext key="msglevel" text="niveau"/>
+<l:gentext key="MsgOrig" text="Herkomst"/>
+<l:gentext key="msgorig" text="herkomst"/>
+<l:gentext key="NOTE" text="OPMERKING"/>
+<l:gentext key="Note" text="Opmerking"/>
+<l:gentext key="note" text="opmerking"/>
+<l:gentext key="Part" text="Deel"/>
+<l:gentext key="part" text="deel"/>
+<l:gentext key="Preface" text="Voorwoord"/>
+<l:gentext key="preface" text="voorwoord"/>
+<l:gentext key="Procedure" text="Procedure"/>
+<l:gentext key="procedure" text="procedure"/>
+<l:gentext key="ProductionSet" text="Productie"/>
+<l:gentext key="PubDate" text="Publicatie datum"/>
+<l:gentext key="pubdate" text="publicatie datum"/>
+<l:gentext key="Published" text="Uitgegeven"/>
+<l:gentext key="published" text="uitgegeven"/>
+<l:gentext key="Publisher" text="Uitgever"/>
+<l:gentext key="Qandadiv" text="Vraag en antwoord"/>
+<l:gentext key="qandadiv" text="vraag en antwoord"/>
+<l:gentext key="QandASet" text="Vaak gestelde vragen"/>
+<l:gentext key="Question" text="Vraag:"/>
+<l:gentext key="question" text="vraag:"/>
+<l:gentext key="RefEntry" text="Pagina"/>
+<l:gentext key="refentry" text="pagina"/>
+<l:gentext key="Reference" text="Referentie"/>
+<l:gentext key="reference" text="referentie"/>
+<l:gentext key="References" text="Referenties"/>
+<l:gentext key="RefName" text="Name"/>
+<l:gentext key="refname" text="name"/>
+<l:gentext key="RefSection" text="Paragraaf"/>
+<l:gentext key="refsection" text="paragraaf"/>
+<l:gentext key="RefSynopsisDiv" text="Samenvatting"/>
+<l:gentext key="refsynopsisdiv" text="samenvatting"/>
+<l:gentext key="RevHistory" text="Wijzigingsgeschiedenis"/>
+<l:gentext key="revhistory" text="wijzigingsgeschiedenis"/>
+<l:gentext key="revision" text="herziening"/>
+<l:gentext key="Revision" text="Herziening"/>
+<l:gentext key="sect1" text="Paragraaf"/>
+<l:gentext key="sect2" text="Paragraaf"/>
+<l:gentext key="sect3" text="Paragraaf"/>
+<l:gentext key="sect4" text="Paragraaf"/>
+<l:gentext key="sect5" text="Paragraaf"/>
+<l:gentext key="section" text="paragraaf"/>
+<l:gentext key="Section" text="Paragraaf"/>
+<l:gentext key="see" text="zie"/>
+<l:gentext key="See" text="Zie"/>
+<l:gentext key="seealso" text="zie ook"/>
+<l:gentext key="Seealso" text="Zie ook"/>
+<l:gentext key="SeeAlso" text="Zie ook"/>
+<l:gentext key="set" text="verzameling"/>
+<l:gentext key="Set" text="Verzameling"/>
+<l:gentext key="setindex" text="hoofdregister"/>
+<l:gentext key="SetIndex" text="Hoofdregister"/>
+<l:gentext key="Sidebar" text="Zijbalk"/>
+<l:gentext key="sidebar" text="zijbalk"/>
+<l:gentext key="step" text="stap"/>
+<l:gentext key="Step" text="Stap"/>
+<l:gentext key="table" text="tabel"/>
+<l:gentext key="Table" text="Tabel"/>
+<l:gentext key="task" text="taap"/>
+<l:gentext key="Task" text="Taap"/>
+<l:gentext key="tip" text="tip"/>
+<l:gentext key="TIP" text="TIP"/>
+<l:gentext key="Tip" text="Tip"/>
+<l:gentext key="Warning" text="Waarschuwing"/>
+<l:gentext key="warning" text="waarschuwing"/>
+<l:gentext key="WARNING" text="WAARSCHUWING"/>
+<l:gentext key="and" text="en"/>
+<l:gentext key="by" text="door"/>
+<l:gentext key="Edited" text="Redactie"/>
+<l:gentext key="edited" text="redactie"/>
+<l:gentext key="Editedby" text="Onder redactie van"/>
+<l:gentext key="editedby" text="onder redactie van"/>
+<l:gentext key="in" text="in"/>
+<l:gentext key="lastlistcomma" text=","/>
+<l:gentext key="listcomma" text=","/>
+<l:gentext key="notes" text="opmerkingen"/>
+<l:gentext key="Notes" text="Opmerkingen"/>
+<l:gentext key="Pgs" text="Blz."/>
+<l:gentext key="pgs" text="blz."/>
+<l:gentext key="Revisedby" text="Herzien door: "/>
+<l:gentext key="revisedby" text="Herzien door: "/>
+<l:gentext key="TableNotes" text="Opmerkingen"/>
+<l:gentext key="tablenotes" text="opmerkingen"/>
+<l:gentext key="TableofContents" text="Inhoudsopgave"/>
+<l:gentext key="tableofcontents" text="inhoudsopgave"/>
+<l:gentext key="unexpectedelementname" text="Onverwachte element naam"/>
+<l:gentext key="unsupported" text="niet ondersteund"/>
+<l:gentext key="xrefto" text="xref naar"/>
+<l:gentext key="Authors" text="Auteurs"/>
+<l:gentext key="copyeditor" text="Copy redacteur"/>
+<l:gentext key="graphicdesigner" text="Grafisch ontwerper"/>
+<l:gentext key="productioneditor" text="Productie redacteur"/>
+<l:gentext key="technicaleditor" text="Technische redacteur"/>
+<l:gentext key="translator" text="Vertaler"/>
+<l:gentext key="listofequations" text="lijst van vergelijkingen"/>
+<l:gentext key="ListofEquations" text="Lijst van vergelijkingen"/>
+<l:gentext key="ListofExamples" text="Lijst van voorbeelden"/>
+<l:gentext key="listofexamples" text="lijst van voorbeelden"/>
+<l:gentext key="ListofFigures" text="Lijst van afbeeldingen"/>
+<l:gentext key="listoffigures" text="lijst van afbeeldingen"/>
+<l:gentext key="ListofProcedures" text="Lijst van procedures"/>
+<l:gentext key="listofprocedures" text="lijst van procedures"/>
+<l:gentext key="listoftables" text="lijst van tabellen"/>
+<l:gentext key="ListofTables" text="Lijst van tabellen"/>
+<l:gentext key="ListofUnknown" text="Lijst van onbekenden"/>
+<l:gentext key="listofunknown" text="lijst van onbekenden"/>
+<l:gentext key="nav-home" text="Begin"/>
+<l:gentext key="nav-next" text="Volgende"/>
+<l:gentext key="nav-next-sibling" text="Snel vooruit"/>
+<l:gentext key="nav-prev" text="Terug"/>
+<l:gentext key="nav-prev-sibling" text="Snel terug"/>
+<l:gentext key="nav-up" text="Omhoog"/>
+<l:gentext key="nav-toc" text="Inhoudsopgave"/>
+<l:gentext key="Draft" text="Ontwerp"/>
+<l:gentext key="above" text="boven"/>
+<l:gentext key="below" text="onder"/>
+<l:gentext key="sectioncalled" text="de paragraaf met de naam"/>
+<l:gentext key="index symbols" text="Symbolen"/>
+<l:gentext key="writing-mode" text="lr-tb"/>
+<l:gentext key="lowercase.alpha" text="abcdefghijklmnopqrstuvwxyzëïé"/>
+<l:gentext key="uppercase.alpha" text="ABCDEFGHIJKLMNOPQRSTUVWXYZËÃÉ"/>
+<l:gentext key="normalize.sort.input" text="AaÀàÃáÂâÃãÄäÅåĀÄĂ㥹ÇǎǞǟǠǡǺǻȀÈȂȃȦȧḀá¸áºšáº áº¡áº¢áº£áº¤áº¥áº¦áº§áº¨áº©áºªáº«áº¬áº­áº®áº¯áº°áº±áº²áº³áº´áºµáº¶áº·BbÆ€ÆɓƂƃḂḃḄḅḆḇCcÇçĆćĈĉĊċČÄƇƈɕḈḉDdÄŽÄÄđƊɗƋƌDžDzȡɖḊḋḌá¸á¸Žá¸á¸á¸‘ḒḓEeÈèÉéÊêËëĒēĔĕĖėĘęĚěȄȅȆȇȨȩḔḕḖḗḘḙḚḛḜá¸áº¸áº¹áººáº»áº¼áº½áº¾áº¿á»€á»á»‚ểỄễỆệFfƑƒḞḟGgÄœÄĞğĠġĢģƓɠǤǥǦǧǴǵḠḡHhĤĥĦħȞȟɦḢḣḤḥḦḧḨḩḪḫẖIiÌìÃíÎîÃïĨĩĪīĬĭĮįİƗɨÇÇȈȉȊȋḬḭḮḯỈỉỊịJjĴĵǰÊKkĶķƘƙǨǩḰḱḲḳḴḵLlĹĺĻļĽľĿŀÅłƚLjȴɫɬɭḶḷḸḹḺḻḼḽMmɱḾḿṀá¹á¹‚ṃNnÑñŃńŅņŇňÆɲƞȠNjǸǹȵɳṄṅṆṇṈṉṊṋOoÒòÓóÔôÕõÖöØøŌÅÅŽÅÅőƟƠơǑǒǪǫǬǭǾǿȌÈÈŽÈȪȫȬȭȮȯȰȱṌá¹á¹Žá¹á¹á¹‘ṒṓỌá»á»Žá»á»á»‘ỒồỔổỖỗỘộỚớỜá»á»žá»Ÿá» á»¡á»¢á»£PpƤƥṔṕṖṗQqÊ RrŔŕŖŗŘřÈȑȒȓɼɽɾṘṙṚṛṜá¹á¹žá¹ŸSsŚśŜÅŞşŠšȘșʂṠṡṢṣṤṥṦṧṨṩTtŢţŤťŦŧƫƬƭƮʈȚțȶṪṫṬṭṮṯṰṱẗUuÙùÚúÛûÜüŨũŪūŬŭŮůŰűŲųƯưǓǔǕǖǗǘǙǚǛǜȔȕȖȗṲṳṴṵṶṷṸṹṺṻỤụỦủỨứỪừỬửỮữỰựVvƲʋṼṽṾṿWwŴŵẀáºáº‚ẃẄẅẆẇẈẉẘXxẊẋẌáºYyÃýÿŸŶŷƳƴȲȳẎáºáº™á»²á»³á»´á»µá»¶á»·á»¸á»¹ZzŹźŻżŽžƵƶȤȥÊÊ‘áºáº‘ẒẓẔẕẕ" lang="en"/>
+<l:gentext key="normalize.sort.output" text="AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBCCCCCCCCCCCCCCCCCDDDDDDDDDDDDDDDDDDDDDDDDEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEFFFFFFGGGGGGGGGGGGGGGGGGGGHHHHHHHHHHHHHHHHHHHHIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIJJJJJJKKKKKKKKKKKKKKLLLLLLLLLLLLLLLLLLLLLLLLLLMMMMMMMMMNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOPPPPPPPPQQQRRRRRRRRRRRRRRRRRRRRRRRSSSSSSSSSSSSSSSSSSSSSSSTTTTTTTTTTTTTTTTTTTTTTTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUVVVVVVVVWWWWWWWWWWWWWWWXXXXXXYYYYYYYYYYYYYYYYYYYYYYYZZZZZZZZZZZZZZZZZZZZZ" lang="en"/>
+<l:dingbat key="startquote" text="“"/>
+<l:dingbat key="endquote" text="â€"/>
+<l:dingbat key="nestedstartquote" text="‘"/>
+<l:dingbat key="nestedendquote" text="’"/>
+<l:dingbat key="singlestartquote" text="‘" lang="en"/>
+<l:dingbat key="singleendquote" text="’" lang="en"/>
+<l:dingbat key="bullet" text="•"/>
+<l:gentext key="hyphenation-character" text="-" lang="en"/>
+<l:gentext key="hyphenation-push-character-count" text="2" lang="en"/>
+<l:gentext key="hyphenation-remain-character-count" text="2" lang="en"/>
+<l:context name="styles"><l:template name="person-name" text="first-last"/>
+</l:context>
+<l:context name="title"><l:template name="abstract" text="%t"/>
+<l:template name="acknowledgements" text="%t" lang="en"/>
+<l:template name="answer" text="%t"/>
+<l:template name="appendix" text="Bijlage %n. %t"/>
+<l:template name="article" text="%t"/>
+<l:template name="authorblurb" text="%t"/>
+<l:template name="bibliodiv" text="%t"/>
+<l:template name="biblioentry" text="%t"/>
+<l:template name="bibliography" text="%t"/>
+<l:template name="bibliolist" text="%t" lang="en"/>
+<l:template name="bibliomixed" text="%t"/>
+<l:template name="bibliomset" text="%t"/>
+<l:template name="biblioset" text="%t"/>
+<l:template name="blockquote" text="%t"/>
+<l:template name="book" text="%t"/>
+<l:template name="calloutlist" text="%t"/>
+<l:template name="caution" text="%t"/>
+<l:template name="chapter" text="Hoofdstuk %n. %t"/>
+<l:template name="colophon" text="%t"/>
+<l:template name="dedication" text="%t"/>
+<l:template name="equation" text="Vergelijking %n. %t"/>
+<l:template name="example" text="Voorbeeld %n. %t"/>
+<l:template name="figure" text="Afbeelding %n. %t"/>
+<l:template name="foil" text="%t" lang="en"/>
+<l:template name="foilgroup" text="%t" lang="en"/>
+<l:template name="formalpara" text="%t"/>
+<l:template name="glossary" text="%t"/>
+<l:template name="glossdiv" text="%t"/>
+<l:template name="glosslist" text="%t" lang="en"/>
+<l:template name="glossentry" text="%t" lang="en"/>
+<l:template name="important" text="%t"/>
+<l:template name="index" text="%t"/>
+<l:template name="indexdiv" text="%t"/>
+<l:template name="itemizedlist" text="%t"/>
+<l:template name="legalnotice" text="%t"/>
+<l:template name="listitem" text=""/>
+<l:template name="lot" text="%t"/>
+<l:template name="msg" text="%t"/>
+<l:template name="msgexplan" text="%t"/>
+<l:template name="msgmain" text="%t"/>
+<l:template name="msgrel" text="%t"/>
+<l:template name="msgset" text="%t"/>
+<l:template name="msgsub" text="%t"/>
+<l:template name="note" text="%t"/>
+<l:template name="orderedlist" text="%t"/>
+<l:template name="part" text="Deel %n. %t"/>
+<l:template name="partintro" text="%t"/>
+<l:template name="preface" text="%t"/>
+<l:template name="procedure" text="%t"/>
+<l:template name="procedure.formal" text="Procedure %n. %t"/>
+<l:template name="productionset" text="%t"/>
+<l:template name="productionset.formal" text="Productie %n"/>
+<l:template name="qandadiv" text="%t"/>
+<l:template name="qandaentry" text="%t"/>
+<l:template name="qandaset" text="%t"/>
+<l:template name="question" text="%t"/>
+<l:template name="refentry" text="%t"/>
+<l:template name="reference" text="%t"/>
+<l:template name="refsection" text="%t"/>
+<l:template name="refsect1" text="%t"/>
+<l:template name="refsect2" text="%t"/>
+<l:template name="refsect3" text="%t"/>
+<l:template name="refsynopsisdiv" text="%t"/>
+<l:template name="refsynopsisdivinfo" text="%t"/>
+<l:template name="segmentedlist" text="%t"/>
+<l:template name="set" text="%t"/>
+<l:template name="setindex" text="%t"/>
+<l:template name="sidebar" text="%t"/>
+<l:template name="step" text="%t"/>
+<l:template name="table" text="Tabel %n. %t"/>
+<l:template name="task" text="%t" lang="en"/>
+<l:template name="tasksummary" text="%t" lang="en"/>
+<l:template name="taskprerequisites" text="%t" lang="en"/>
+<l:template name="taskrelated" text="%t" lang="en"/>
+<l:template name="tip" text="%t"/>
+<l:template name="toc" text="%t"/>
+<l:template name="variablelist" text="%t"/>
+<l:template name="varlistentry" text="" lang="en"/>
+<l:template name="warning" text="%t"/>
+</l:context>
+<l:context name="title-unnumbered"><l:template name="appendix" text="%t"/>
+<l:template name="article/appendix" text="%t" lang="en"/>
+<l:template name="bridgehead" text="%t"/>
+<l:template name="chapter" text="%t"/>
+<l:template name="sect1" text="%t"/>
+<l:template name="sect2" text="%t"/>
+<l:template name="sect3" text="%t"/>
+<l:template name="sect4" text="%t"/>
+<l:template name="sect5" text="%t"/>
+<l:template name="section" text="%t"/>
+<l:template name="simplesect" text="%t"/>
+<l:template name="part" text="%t" lang="en"/>
+</l:context>
+<l:context name="title-numbered"><l:template name="appendix" text="Bijlage %n. %t"/>
+<l:template name="article/appendix" text="%n. %t" lang="en"/>
+<l:template name="bridgehead" text="%n. %t"/>
+<l:template name="chapter" text="Hoofdstuk %n. %t"/>
+<l:template name="part" text="Deel %n. %t"/>
+<l:template name="sect1" text="%n. %t"/>
+<l:template name="sect2" text="%n. %t"/>
+<l:template name="sect3" text="%n. %t"/>
+<l:template name="sect4" text="%n. %t"/>
+<l:template name="sect5" text="%n. %t"/>
+<l:template name="section" text="%n. %t"/>
+<l:template name="simplesect" text="%n. %t"/>
+</l:context>
+<l:context name="subtitle"><l:template name="appendix" text="%s"/>
+<l:template name="acknowledgements" text="%s" lang="en"/>
+<l:template name="article" text="%s"/>
+<l:template name="bibliodiv" text="%s"/>
+<l:template name="biblioentry" text="%s"/>
+<l:template name="bibliography" text="%s"/>
+<l:template name="bibliomixed" text="%s"/>
+<l:template name="bibliomset" text="%s"/>
+<l:template name="biblioset" text="%s"/>
+<l:template name="book" text="%s"/>
+<l:template name="chapter" text="%s"/>
+<l:template name="colophon" text="%s"/>
+<l:template name="dedication" text="%s"/>
+<l:template name="glossary" text="%s"/>
+<l:template name="glossdiv" text="%s"/>
+<l:template name="index" text="%s"/>
+<l:template name="indexdiv" text="%s"/>
+<l:template name="lot" text="%s"/>
+<l:template name="part" text="%s"/>
+<l:template name="partintro" text="%s"/>
+<l:template name="preface" text="%s"/>
+<l:template name="refentry" text="%s"/>
+<l:template name="reference" text="%s"/>
+<l:template name="refsection" text="%s"/>
+<l:template name="refsect1" text="%s"/>
+<l:template name="refsect2" text="%s"/>
+<l:template name="refsect3" text="%s"/>
+<l:template name="refsynopsisdiv" text="%s"/>
+<l:template name="sect1" text="%s"/>
+<l:template name="sect2" text="%s"/>
+<l:template name="sect3" text="%s"/>
+<l:template name="sect4" text="%s"/>
+<l:template name="sect5" text="%s"/>
+<l:template name="section" text="%s"/>
+<l:template name="set" text="%s"/>
+<l:template name="setindex" text="%s"/>
+<l:template name="sidebar" text="%s"/>
+<l:template name="simplesect" text="%s"/>
+<l:template name="toc" text="%s"/>
+</l:context>
+<l:context name="xref"><l:template name="abstract" text="%t"/>
+<l:template name="acknowledgements" text="%t" lang="en"/>
+<l:template name="answer" text="Antwoord: %n"/>
+<l:template name="appendix" text="%t"/>
+<l:template name="article" text="%t"/>
+<l:template name="authorblurb" text="%t"/>
+<l:template name="bibliodiv" text="%t"/>
+<l:template name="bibliography" text="%t"/>
+<l:template name="bibliomset" text="%t"/>
+<l:template name="biblioset" text="%t"/>
+<l:template name="blockquote" text="%t"/>
+<l:template name="book" text="%t"/>
+<l:template name="calloutlist" text="%t"/>
+<l:template name="caution" text="%t"/>
+<l:template name="chapter" text="%t"/>
+<l:template name="colophon" text="%t"/>
+<l:template name="constraintdef" text="%t"/>
+<l:template name="dedication" text="%t"/>
+<l:template name="equation" text="%t"/>
+<l:template name="example" text="%t"/>
+<l:template name="figure" text="%t"/>
+<l:template name="foil" text="%t" lang="en"/>
+<l:template name="foilgroup" text="%t" lang="en"/>
+<l:template name="formalpara" text="%t"/>
+<l:template name="glossary" text="%t"/>
+<l:template name="glossdiv" text="%t"/>
+<l:template name="important" text="%t"/>
+<l:template name="index" text="%t"/>
+<l:template name="indexdiv" text="%t"/>
+<l:template name="itemizedlist" text="%t"/>
+<l:template name="legalnotice" text="%t"/>
+<l:template name="listitem" text="%n"/>
+<l:template name="lot" text="%t"/>
+<l:template name="msg" text="%t"/>
+<l:template name="msgexplan" text="%t"/>
+<l:template name="msgmain" text="%t"/>
+<l:template name="msgrel" text="%t"/>
+<l:template name="msgset" text="%t"/>
+<l:template name="msgsub" text="%t"/>
+<l:template name="note" text="%t"/>
+<l:template name="orderedlist" text="%t"/>
+<l:template name="part" text="%t"/>
+<l:template name="partintro" text="%t"/>
+<l:template name="preface" text="%t"/>
+<l:template name="procedure" text="%t"/>
+<l:template name="productionset" text="%t"/>
+<l:template name="qandadiv" text="%t"/>
+<l:template name="qandaentry" text="Vraag: %n"/>
+<l:template name="qandaset" text="%t"/>
+<l:template name="question" text="Vraag: %n"/>
+<l:template name="reference" text="%t"/>
+<l:template name="refsynopsisdiv" text="%t"/>
+<l:template name="segmentedlist" text="%t"/>
+<l:template name="set" text="%t"/>
+<l:template name="setindex" text="%t"/>
+<l:template name="sidebar" text="%t"/>
+<l:template name="table" text="%t"/>
+<l:template name="task" text="%t" lang="en"/>
+<l:template name="tip" text="%t"/>
+<l:template name="toc" text="%t"/>
+<l:template name="variablelist" text="%t"/>
+<l:template name="varlistentry" text="%n"/>
+<l:template name="warning" text="%t"/>
+<l:template name="olink.document.citation" text=" in %o" lang="en"/>
+<l:template name="olink.page.citation" text=" (page %p)" lang="en"/>
+<l:template name="page.citation" text=" [%p]"/>
+<l:template name="page" text="(page %p)" lang="en"/>
+<l:template name="docname" text=" in %o" lang="en"/>
+<l:template name="docnamelong" text=" in the document titled %o" lang="en"/>
+<l:template name="pageabbrev" text="(p. %p)" lang="en"/>
+<l:template name="Page" text="Page %p" lang="en"/>
+<l:template name="bridgehead" text="de paragraaf met de naam “%tâ€"/>
+<l:template name="refsection" text="de paragraaf met de naam “%tâ€"/>
+<l:template name="refsect1" text="de paragraaf met de naam “%tâ€"/>
+<l:template name="refsect2" text="de paragraaf met de naam “%tâ€"/>
+<l:template name="refsect3" text="de paragraaf met de naam “%tâ€"/>
+<l:template name="sect1" text="de paragraaf met de naam “%tâ€"/>
+<l:template name="sect2" text="de paragraaf met de naam “%tâ€"/>
+<l:template name="sect3" text="de paragraaf met de naam “%tâ€"/>
+<l:template name="sect4" text="de paragraaf met de naam “%tâ€"/>
+<l:template name="sect5" text="de paragraaf met de naam “%tâ€"/>
+<l:template name="section" text="de paragraaf met de naam “%tâ€"/>
+<l:template name="simplesect" text="de paragraaf met de naam “%tâ€"/>
+</l:context>
+<l:context name="xref-number"><l:template name="answer" text="Antwoord: %n"/>
+<l:template name="appendix" text="Bijlage %n"/>
+<l:template name="bridgehead" text="Paragraaf %n"/>
+<l:template name="chapter" text="Hoofdstuk %n"/>
+<l:template name="equation" text="Vergelijking %n"/>
+<l:template name="example" text="Voorbeeld %n"/>
+<l:template name="figure" text="Afbeelding %n"/>
+<l:template name="part" text="Deel %n"/>
+<l:template name="procedure" text="Procedure %n"/>
+<l:template name="productionset" text="Productie %n"/>
+<l:template name="qandadiv" text="Vraag en antwoord %n"/>
+<l:template name="qandaentry" text="Vraag: %n"/>
+<l:template name="question" text="Vraag: %n"/>
+<l:template name="sect1" text="Paragraaf %n"/>
+<l:template name="sect2" text="Paragraaf %n"/>
+<l:template name="sect3" text="Paragraaf %n"/>
+<l:template name="sect4" text="Paragraaf %n"/>
+<l:template name="sect5" text="Paragraaf %n"/>
+<l:template name="section" text="Paragraaf %n"/>
+<l:template name="table" text="Tabel %n"/>
+</l:context>
+<l:context name="xref-number-and-title"><l:template name="appendix" text="Bijlage %n, %t"/>
+<l:template name="bridgehead" text="Paragraaf %n, “%tâ€"/>
+<l:template name="chapter" text="Hoofdstuk %n, %t"/>
+<l:template name="equation" text="Vergelijking %n, “%tâ€"/>
+<l:template name="example" text="Voorbeeld %n, “%tâ€"/>
+<l:template name="figure" text="Afbeelding %n, “%tâ€"/>
+<l:template name="part" text="Deel %n, “%tâ€"/>
+<l:template name="procedure" text="Procedure %n, “%tâ€"/>
+<l:template name="productionset" text="Productie %n, “%tâ€"/>
+<l:template name="qandadiv" text="Vraag en antwoord %n, “%tâ€"/>
+<l:template name="refsect1" text="de paragraaf met de naam “%tâ€"/>
+<l:template name="refsect2" text="de paragraaf met de naam “%tâ€"/>
+<l:template name="refsect3" text="de paragraaf met de naam “%tâ€"/>
+<l:template name="refsection" text="de paragraaf met de naam “%tâ€"/>
+<l:template name="sect1" text="Paragraaf %n, “%tâ€"/>
+<l:template name="sect2" text="Paragraaf %n, “%tâ€"/>
+<l:template name="sect3" text="Paragraaf %n, “%tâ€"/>
+<l:template name="sect4" text="Paragraaf %n, “%tâ€"/>
+<l:template name="sect5" text="Paragraaf %n, “%tâ€"/>
+<l:template name="section" text="Paragraaf %n, “%tâ€"/>
+<l:template name="simplesect" text="de paragraaf met de naam “%tâ€"/>
+<l:template name="table" text="Tabel %n, “%tâ€"/>
+</l:context>
+<l:context name="authorgroup"><l:template name="sep" text=", "/>
+<l:template name="sep2" text=" en "/>
+<l:template name="seplast" text=", en "/>
+</l:context>
+<l:context name="glossary"><l:template name="see" text="Zie %t."/>
+<l:template name="seealso" text="Zie ook %t."/>
+<l:template name="seealso-separator" text=", "/>
+</l:context>
+<l:context name="msgset"><l:template name="MsgAud" text="Doelgroep: "/>
+<l:template name="MsgLevel" text="Niveau: "/>
+<l:template name="MsgOrig" text="Herkomst: "/>
+</l:context>
+<l:context name="datetime"><l:template name="format" text="d/m/Y"/>
+</l:context>
+<l:context name="termdef"><l:template name="prefix" text="[Definitie: "/>
+<l:template name="suffix" text="]"/>
+</l:context>
+<l:context name="datetime-full"><l:template name="January" text="januari"/>
+<l:template name="February" text="februari"/>
+<l:template name="March" text="maart"/>
+<l:template name="April" text="april"/>
+<l:template name="May" text="mei"/>
+<l:template name="June" text="juni"/>
+<l:template name="July" text="juli"/>
+<l:template name="August" text="augustus"/>
+<l:template name="September" text="september"/>
+<l:template name="October" text="october"/>
+<l:template name="November" text="november"/>
+<l:template name="December" text="december"/>
+<l:template name="Monday" text="maandag"/>
+<l:template name="Tuesday" text="dinsdag"/>
+<l:template name="Wednesday" text="woensdag"/>
+<l:template name="Thursday" text="donderdag"/>
+<l:template name="Friday" text="vrijdag"/>
+<l:template name="Saturday" text="zaterdag"/>
+<l:template name="Sunday" text="zondag"/>
+</l:context>
+<l:context name="datetime-abbrev"><l:template name="Jan" text="jan"/>
+<l:template name="Feb" text="feb"/>
+<l:template name="Mar" text="maa"/>
+<l:template name="Apr" text="apr"/>
+<l:template name="May" text="mei"/>
+<l:template name="Jun" text="jun"/>
+<l:template name="Jul" text="jul"/>
+<l:template name="Aug" text="aug"/>
+<l:template name="Sep" text="sep"/>
+<l:template name="Oct" text="oct"/>
+<l:template name="Nov" text="nov"/>
+<l:template name="Dec" text="dec"/>
+<l:template name="Mon" text="maa"/>
+<l:template name="Tue" text="din"/>
+<l:template name="Wed" text="woe"/>
+<l:template name="Thu" text="don"/>
+<l:template name="Fri" text="vrij"/>
+<l:template name="Sat" text="zat"/>
+<l:template name="Sun" text="zon"/>
+</l:context>
+<l:context name="htmlhelp"><l:template name="langcode" text="0x0413 Dutch"/>
+</l:context>
+<l:context name="index"><l:template name="term-separator" text=", "/>
+<l:template name="number-separator" text=", "/>
+<l:template name="range-separator" text="-"/>
+</l:context>
+<l:context name="iso690"><l:template name="lastfirst.sep" text=", "/>
+<l:template name="alt.person.two.sep" text=" – "/>
+<l:template name="alt.person.last.sep" text=" – "/>
+<l:template name="alt.person.more.sep" text=" – "/>
+<l:template name="primary.editor" text=" (ed.)"/>
+<l:template name="primary.many" text=", et al."/>
+<l:template name="primary.sep" text=". "/>
+<l:template name="submaintitle.sep" text=": "/>
+<l:template name="title.sep" text=". "/>
+<l:template name="othertitle.sep" text=", "/>
+<l:template name="medium1" text=" ["/>
+<l:template name="medium2" text="]"/>
+<l:template name="secondary.person.sep" text="; "/>
+<l:template name="secondary.sep" text=". "/>
+<l:template name="respons.sep" text=". "/>
+<l:template name="edition.sep" text=". "/>
+<l:template name="edition.serial.sep" text=", "/>
+<l:template name="issuing.range" text="-"/>
+<l:template name="issuing.div" text=", "/>
+<l:template name="issuing.sep" text=". "/>
+<l:template name="partnr.sep" text=". "/>
+<l:template name="placepubl.sep" text=": "/>
+<l:template name="publyear.sep" text=", "/>
+<l:template name="pubinfo.sep" text=". "/>
+<l:template name="spec.pubinfo.sep" text=", "/>
+<l:template name="upd.sep" text=", "/>
+<l:template name="datecit1" text=" [cited "/>
+<l:template name="datecit2" text="]"/>
+<l:template name="extent.sep" text=". "/>
+<l:template name="locs.sep" text=", "/>
+<l:template name="location.sep" text=". "/>
+<l:template name="serie.sep" text=". "/>
+<l:template name="notice.sep" text=". "/>
+<l:template name="access" text="Available "/>
+<l:template name="acctoo" text="Also available "/>
+<l:template name="onwww" text="from World Wide Web"/>
+<l:template name="oninet" text="from Internet"/>
+<l:template name="access.end" text=": "/>
+<l:template name="link1" text="&lt;"/>
+<l:template name="link2" text="&gt;"/>
+<l:template name="access.sep" text=". "/>
+<l:template name="isbn" text="ISBN "/>
+<l:template name="issn" text="ISSN "/>
+<l:template name="stdnum.sep" text=". "/>
+<l:template name="patcountry.sep" text=". "/>
+<l:template name="pattype.sep" text=", "/>
+<l:template name="patnum.sep" text=". "/>
+<l:template name="patdate.sep" text=". "/>
+</l:context><l:letters><l:l i="-1"/>
+<l:l i="0">Symbolen</l:l>
+<l:l i="10">A</l:l>
+<l:l i="10">a</l:l>
+<l:l i="20">B</l:l>
+<l:l i="20">b</l:l>
+<l:l i="30">C</l:l>
+<l:l i="30">c</l:l>
+<l:l i="40">D</l:l>
+<l:l i="40">d</l:l>
+<l:l i="50">E</l:l>
+<l:l i="50">e</l:l>
+<l:l i="60">F</l:l>
+<l:l i="60">f</l:l>
+<l:l i="70">G</l:l>
+<l:l i="70">g</l:l>
+<l:l i="80">H</l:l>
+<l:l i="80">h</l:l>
+<l:l i="90">I</l:l>
+<l:l i="90">i</l:l>
+<l:l i="100">J</l:l>
+<l:l i="100">j</l:l>
+<l:l i="110">K</l:l>
+<l:l i="110">k</l:l>
+<l:l i="120">L</l:l>
+<l:l i="120">l</l:l>
+<l:l i="130">M</l:l>
+<l:l i="130">m</l:l>
+<l:l i="140">N</l:l>
+<l:l i="140">n</l:l>
+<l:l i="150">O</l:l>
+<l:l i="150">o</l:l>
+<l:l i="160">P</l:l>
+<l:l i="160">p</l:l>
+<l:l i="170">Q</l:l>
+<l:l i="170">q</l:l>
+<l:l i="180">R</l:l>
+<l:l i="180">r</l:l>
+<l:l i="190">S</l:l>
+<l:l i="190">s</l:l>
+<l:l i="200">T</l:l>
+<l:l i="200">t</l:l>
+<l:l i="210">U</l:l>
+<l:l i="210">u</l:l>
+<l:l i="220">V</l:l>
+<l:l i="220">v</l:l>
+<l:l i="230">W</l:l>
+<l:l i="230">w</l:l>
+<l:l i="240">X</l:l>
+<l:l i="240">x</l:l>
+<l:l i="250">Y</l:l>
+<l:l i="250">y</l:l>
+<l:l i="260">Z</l:l>
+<l:l i="260">z</l:l>
+</l:letters>
+</l:l10n>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/nn.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/nn.xml
new file mode 100644
index 0000000..4898d42
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/nn.xml
@@ -0,0 +1,1229 @@
+<?xml version="1.0" encoding="utf-8"?>
+<l:l10n xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0" language="nn" english-language-name="Nynorsk">
+
+<!-- * This file is generated automatically. -->
+<!-- * To submit changes to this file upstream (to the DocBook Project) -->
+<!-- * do not submit an edited version of this file. Instead, submit an -->
+<!-- * edited version of the source file at the following location: -->
+<!-- * -->
+<!-- * https://docbook.svn.sourceforge.net/svnroot/docbook/trunk/gentext/locale/nn.xml -->
+<!-- * -->
+<!-- * E-mail the edited nn.xml source file to: -->
+<!-- * -->
+<!-- * docbook-developers@lists.sourceforge.net -->
+
+<!-- ******************************************************************** -->
+
+<!-- This file is part of the XSL DocBook Stylesheet distribution. -->
+<!-- See ../README or http://docbook.sf.net/release/xsl/current/ for -->
+<!-- copyright and other information. -->
+
+<!-- ******************************************************************** -->
+<!-- In these files, % with a letter is used for a placeholder: -->
+<!-- %t is the current element's title -->
+<!-- %s is the current element's subtitle (if applicable)-->
+<!-- %n is the current element's number label-->
+<!-- %p is the current element's page number (if applicable)-->
+<!-- ******************************************************************** -->
+
+
+<l:gentext key="Abstract" text="Samandrag"/>
+<l:gentext key="abstract" text="Samandrag"/>
+<l:gentext key="Acknowledgements" text="Acknowledgements" lang="en"/>
+<l:gentext key="acknowledgements" text="Acknowledgements" lang="en"/>
+<l:gentext key="Answer" text="Svar"/>
+<l:gentext key="answer" text="svar"/>
+<l:gentext key="Appendix" text="Tillegg"/>
+<l:gentext key="appendix" text="tillegg"/>
+<l:gentext key="Article" text="Artikkel"/>
+<l:gentext key="article" text="artikkel"/>
+<l:gentext key="Author" text="Author" lang="en"/>
+<l:gentext key="Bibliography" text="Bibliografi"/>
+<l:gentext key="bibliography" text="bibliografi"/>
+<l:gentext key="Book" text="Bok"/>
+<l:gentext key="book" text="bok"/>
+<l:gentext key="CAUTION" text="OBS"/>
+<l:gentext key="Caution" text="Obs"/>
+<l:gentext key="caution" text="OBS"/>
+<l:gentext key="Chapter" text="Kapittel"/>
+<l:gentext key="chapter" text="kapittel"/>
+<l:gentext key="Colophon" text="Kolofon"/>
+<l:gentext key="colophon" text="kolofon"/>
+<l:gentext key="Copyright" text="Opphavsrett"/>
+<l:gentext key="copyright" text="opphavsrett"/>
+<l:gentext key="Dedication" text="Dedikasjon"/>
+<l:gentext key="dedication" text="dedikasjon"/>
+<l:gentext key="Edition" text="Utgåve"/>
+<l:gentext key="edition" text="utgåve"/>
+<l:gentext key="Editor" text="Editor" lang="en"/>
+<l:gentext key="Equation" text="Formel"/>
+<l:gentext key="equation" text="formel"/>
+<l:gentext key="Example" text="Døme"/>
+<l:gentext key="example" text="døme"/>
+<l:gentext key="Figure" text="Figur"/>
+<l:gentext key="figure" text="figur"/>
+<l:gentext key="Glossary" text="Ordliste"/>
+<l:gentext key="glossary" text="ordliste"/>
+<l:gentext key="GlossSee" text="Sjå"/>
+<l:gentext key="glosssee" text="sjå"/>
+<l:gentext key="GlossSeeAlso" text="Sjå òg"/>
+<l:gentext key="glossseealso" text="sjå òg"/>
+<l:gentext key="IMPORTANT" text="VIKTIG"/>
+<l:gentext key="important" text="viktig"/>
+<l:gentext key="Important" text="Viktig"/>
+<l:gentext key="Index" text="Indeks"/>
+<l:gentext key="index" text="indeks"/>
+<l:gentext key="ISBN" text="ISBN"/>
+<l:gentext key="isbn" text="ISBN"/>
+<l:gentext key="LegalNotice" text=""/>
+<l:gentext key="legalnotice" text=""/>
+<l:gentext key="MsgAud" text="Publikum"/>
+<l:gentext key="msgaud" text="publikum"/>
+<l:gentext key="MsgLevel" text="Nivå"/>
+<l:gentext key="msglevel" text="nivå"/>
+<l:gentext key="MsgOrig" text="Opphav"/>
+<l:gentext key="msgorig" text="Opphav"/>
+<l:gentext key="NOTE" text="NOTAT"/>
+<l:gentext key="Note" text="Notat"/>
+<l:gentext key="note" text="NOTAT"/>
+<l:gentext key="Part" text="Del"/>
+<l:gentext key="part" text="del"/>
+<l:gentext key="Preface" text="Forord"/>
+<l:gentext key="preface" text="forord"/>
+<l:gentext key="Procedure" text="Prosedyre"/>
+<l:gentext key="procedure" text="prosedyre"/>
+<l:gentext key="ProductionSet" text="Production"/>
+<l:gentext key="PubDate" text="Publication Date" lang="en"/>
+<l:gentext key="pubdate" text="Publication date" lang="en"/>
+<l:gentext key="Published" text="Utgitt"/>
+<l:gentext key="published" text="utgitt"/>
+<l:gentext key="Publisher" text="Publisher" lang="en"/>
+<l:gentext key="Qandadiv" text="Spørsmål og Svar"/>
+<l:gentext key="qandadiv" text="Spørsmål og Svar"/>
+<l:gentext key="QandASet" text="Frequently Asked Questions" lang="en"/>
+<l:gentext key="Question" text="Spørsmål"/>
+<l:gentext key="question" text="spørsmål"/>
+<l:gentext key="RefEntry" text=""/>
+<l:gentext key="refentry" text=""/>
+<l:gentext key="Reference" text="Referanse"/>
+<l:gentext key="reference" text="referanse"/>
+<l:gentext key="References" text="References" lang="en"/>
+<l:gentext key="RefName" text="Namn"/>
+<l:gentext key="refname" text="namn"/>
+<l:gentext key="RefSection" text="Del"/>
+<l:gentext key="refsection" text="del"/>
+<l:gentext key="RefSynopsisDiv" text="Oversyn"/>
+<l:gentext key="refsynopsisdiv" text="oversyn"/>
+<l:gentext key="RevHistory" text="Revisjonshistorie"/>
+<l:gentext key="revhistory" text="revisjonshistorie"/>
+<l:gentext key="revision" text="revisjon"/>
+<l:gentext key="Revision" text="Revisjon"/>
+<l:gentext key="sect1" text="Section"/>
+<l:gentext key="sect2" text="Section"/>
+<l:gentext key="sect3" text="Section"/>
+<l:gentext key="sect4" text="Section"/>
+<l:gentext key="sect5" text="Section"/>
+<l:gentext key="section" text="del"/>
+<l:gentext key="Section" text="Del"/>
+<l:gentext key="see" text="sjå"/>
+<l:gentext key="See" text="Sjå"/>
+<l:gentext key="seealso" text="sjå òg"/>
+<l:gentext key="Seealso" text="Sjå òg"/>
+<l:gentext key="SeeAlso" text="Sjå òg"/>
+<l:gentext key="set" text="set"/>
+<l:gentext key="Set" text="Set"/>
+<l:gentext key="setindex" text="Indeks"/>
+<l:gentext key="SetIndex" text="Indeks"/>
+<l:gentext key="Sidebar" text="Sidestolpe"/>
+<l:gentext key="sidebar" text="sidestolpe"/>
+<l:gentext key="step" text="steg"/>
+<l:gentext key="Step" text="Steg"/>
+<l:gentext key="table" text="tabell"/>
+<l:gentext key="Table" text="Tabell"/>
+<l:gentext key="task" text="Task" lang="en"/>
+<l:gentext key="Task" text="Task" lang="en"/>
+<l:gentext key="tip" text="tips"/>
+<l:gentext key="TIP" text="TIPS"/>
+<l:gentext key="Tip" text="Tips"/>
+<l:gentext key="Warning" text="Ã…tvaring"/>
+<l:gentext key="warning" text="Ã¥tvaring"/>
+<l:gentext key="WARNING" text="Ã…TVARING"/>
+<l:gentext key="and" text="og"/>
+<l:gentext key="by" text="av"/>
+<l:gentext key="Edited" text="Redigert"/>
+<l:gentext key="edited" text="redigert"/>
+<l:gentext key="Editedby" text="Redigert av"/>
+<l:gentext key="editedby" text="redigert av"/>
+<l:gentext key="in" text="i"/>
+<l:gentext key="lastlistcomma" text=","/>
+<l:gentext key="listcomma" text=","/>
+<l:gentext key="notes" text="merknader"/>
+<l:gentext key="Notes" text="Merknader"/>
+<l:gentext key="Pgs" text="Sider"/>
+<l:gentext key="pgs" text="sider"/>
+<l:gentext key="Revisedby" text="Revidert av: "/>
+<l:gentext key="revisedby" text="revidert av: "/>
+<l:gentext key="TableNotes" text="Merknader"/>
+<l:gentext key="tablenotes" text="merknader"/>
+<l:gentext key="TableofContents" text="Innhald"/>
+<l:gentext key="tableofcontents" text="Innhald"/>
+<l:gentext key="unexpectedelementname" text="UVENTA-ELEMENTNAVN"/>
+<l:gentext key="unsupported" text="ikkje støtta"/>
+<l:gentext key="xrefto" text="xref til"/>
+<l:gentext key="Authors" text="Authors" lang="en"/>
+<l:gentext key="copyeditor" text="Copy Editor" lang="en"/>
+<l:gentext key="graphicdesigner" text="Graphic Designer" lang="en"/>
+<l:gentext key="productioneditor" text="Production Editor" lang="en"/>
+<l:gentext key="technicaleditor" text="Technical Editor" lang="en"/>
+<l:gentext key="translator" text="Translator" lang="en"/>
+<l:gentext key="listofequations" text="formeloversikt"/>
+<l:gentext key="ListofEquations" text="Formeloversikt"/>
+<l:gentext key="ListofExamples" text="Dømeoversikt"/>
+<l:gentext key="listofexamples" text="dømeoversikt"/>
+<l:gentext key="ListofFigures" text="Figuroversikt"/>
+<l:gentext key="listoffigures" text="figuroversikt"/>
+<l:gentext key="ListofProcedures" text="List of Procedures" lang="en"/>
+<l:gentext key="listofprocedures" text="List of Procedures" lang="en"/>
+<l:gentext key="listoftables" text="tabelloversikt"/>
+<l:gentext key="ListofTables" text="Tabelloversikt"/>
+<l:gentext key="ListofUnknown" text="???-oversikt"/>
+<l:gentext key="listofunknown" text="???-oversikt"/>
+<l:gentext key="nav-home" text="Heim"/>
+<l:gentext key="nav-next" text="Fram"/>
+<l:gentext key="nav-next-sibling" text="Raskt framover"/>
+<l:gentext key="nav-prev" text="Att"/>
+<l:gentext key="nav-prev-sibling" text="Raskt bakover"/>
+<l:gentext key="nav-up" text="Opp"/>
+<l:gentext key="nav-toc" text="ToC" lang="en"/>
+<l:gentext key="Draft" text="Draft"/>
+<l:gentext key="above" text="above"/>
+<l:gentext key="below" text="below"/>
+<l:gentext key="sectioncalled" text="the section called"/>
+<l:gentext key="index symbols" text="Symbols"/>
+<l:gentext key="writing-mode" text="lr-tb"/>
+<l:gentext key="lowercase.alpha" text="abcdefghijklmnopqrstuvwxyz"/>
+<l:gentext key="uppercase.alpha" text="ABCDEFGHIJKLMNOPQRSTUVWXYZ"/>
+<l:gentext key="normalize.sort.input" text="AaÀàÃáÂâÃãÄäÅåĀÄĂ㥹ÇǎǞǟǠǡǺǻȀÈȂȃȦȧḀá¸áºšáº áº¡áº¢áº£áº¤áº¥áº¦áº§áº¨áº©áºªáº«áº¬áº­áº®áº¯áº°áº±áº²áº³áº´áºµáº¶áº·BbÆ€ÆɓƂƃḂḃḄḅḆḇCcÇçĆćĈĉĊċČÄƇƈɕḈḉDdÄŽÄÄđƊɗƋƌDžDzȡɖḊḋḌá¸á¸Žá¸á¸á¸‘ḒḓEeÈèÉéÊêËëĒēĔĕĖėĘęĚěȄȅȆȇȨȩḔḕḖḗḘḙḚḛḜá¸áº¸áº¹áººáº»áº¼áº½áº¾áº¿á»€á»á»‚ểỄễỆệFfƑƒḞḟGgÄœÄĞğĠġĢģƓɠǤǥǦǧǴǵḠḡHhĤĥĦħȞȟɦḢḣḤḥḦḧḨḩḪḫẖIiÌìÃíÎîÃïĨĩĪīĬĭĮįİƗɨÇÇȈȉȊȋḬḭḮḯỈỉỊịJjĴĵǰÊKkĶķƘƙǨǩḰḱḲḳḴḵLlĹĺĻļĽľĿŀÅłƚLjȴɫɬɭḶḷḸḹḺḻḼḽMmɱḾḿṀá¹á¹‚ṃNnÑñŃńŅņŇňÆɲƞȠNjǸǹȵɳṄṅṆṇṈṉṊṋOoÒòÓóÔôÕõÖöØøŌÅÅŽÅÅőƟƠơǑǒǪǫǬǭǾǿȌÈÈŽÈȪȫȬȭȮȯȰȱṌá¹á¹Žá¹á¹á¹‘ṒṓỌá»á»Žá»á»á»‘ỒồỔổỖỗỘộỚớỜá»á»žá»Ÿá» á»¡á»¢á»£PpƤƥṔṕṖṗQqÊ RrŔŕŖŗŘřÈȑȒȓɼɽɾṘṙṚṛṜá¹á¹žá¹ŸSsŚśŜÅŞşŠšȘșʂṠṡṢṣṤṥṦṧṨṩTtŢţŤťŦŧƫƬƭƮʈȚțȶṪṫṬṭṮṯṰṱẗUuÙùÚúÛûÜüŨũŪūŬŭŮůŰűŲųƯưǓǔǕǖǗǘǙǚǛǜȔȕȖȗṲṳṴṵṶṷṸṹṺṻỤụỦủỨứỪừỬửỮữỰựVvƲʋṼṽṾṿWwŴŵẀáºáº‚ẃẄẅẆẇẈẉẘXxẊẋẌáºYyÃýÿŸŶŷƳƴȲȳẎáºáº™á»²á»³á»´á»µá»¶á»·á»¸á»¹ZzŹźŻżŽžƵƶȤȥÊÊ‘áºáº‘ẒẓẔẕẕ" lang="en"/>
+<l:gentext key="normalize.sort.output" text="AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBCCCCCCCCCCCCCCCCCDDDDDDDDDDDDDDDDDDDDDDDDEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEFFFFFFGGGGGGGGGGGGGGGGGGGGHHHHHHHHHHHHHHHHHHHHIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIJJJJJJKKKKKKKKKKKKKKLLLLLLLLLLLLLLLLLLLLLLLLLLMMMMMMMMMNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOPPPPPPPPQQQRRRRRRRRRRRRRRRRRRRRRRRSSSSSSSSSSSSSSSSSSSSSSSTTTTTTTTTTTTTTTTTTTTTTTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUVVVVVVVVWWWWWWWWWWWWWWWXXXXXXYYYYYYYYYYYYYYYYYYYYYYYZZZZZZZZZZZZZZZZZZZZZ" lang="en"/>
+<l:dingbat key="startquote" text="“"/>
+<l:dingbat key="endquote" text="â€"/>
+<l:dingbat key="nestedstartquote" text="‘"/>
+<l:dingbat key="nestedendquote" text="’"/>
+<l:dingbat key="singlestartquote" text="‘" lang="en"/>
+<l:dingbat key="singleendquote" text="’" lang="en"/>
+<l:dingbat key="bullet" text="•"/>
+<l:gentext key="hyphenation-character" text="-" lang="en"/>
+<l:gentext key="hyphenation-push-character-count" text="2" lang="en"/>
+<l:gentext key="hyphenation-remain-character-count" text="2" lang="en"/>
+<l:context name="styles"><l:template name="person-name" text="first-last"/>
+</l:context>
+<l:context name="title"><l:template name="abstract" text="%t"/>
+<l:template name="acknowledgements" text="%t" lang="en"/>
+<l:template name="answer" text="%t"/>
+<l:template name="appendix" text="Tillegg %n. %t"/>
+<l:template name="article" text="%t"/>
+<l:template name="authorblurb" text="%t"/>
+<l:template name="bibliodiv" text="%t"/>
+<l:template name="biblioentry" text="%t"/>
+<l:template name="bibliography" text="%t"/>
+<l:template name="bibliolist" text="%t" lang="en"/>
+<l:template name="bibliomixed" text="%t"/>
+<l:template name="bibliomset" text="%t"/>
+<l:template name="biblioset" text="%t"/>
+<l:template name="blockquote" text="%t"/>
+<l:template name="book" text="%t"/>
+<l:template name="calloutlist" text="%t"/>
+<l:template name="caution" text="%t"/>
+<l:template name="chapter" text="Kapittel %n. %t"/>
+<l:template name="colophon" text="%t"/>
+<l:template name="dedication" text="%t"/>
+<l:template name="equation" text="Formel %n. %t"/>
+<l:template name="example" text="Døme %n. %t"/>
+<l:template name="figure" text="Figur %n. %t"/>
+<l:template name="foil" text="%t" lang="en"/>
+<l:template name="foilgroup" text="%t" lang="en"/>
+<l:template name="formalpara" text="%t"/>
+<l:template name="glossary" text="%t"/>
+<l:template name="glossdiv" text="%t"/>
+<l:template name="glosslist" text="%t" lang="en"/>
+<l:template name="glossentry" text="%t" lang="en"/>
+<l:template name="important" text="%t"/>
+<l:template name="index" text="%t"/>
+<l:template name="indexdiv" text="%t"/>
+<l:template name="itemizedlist" text="%t"/>
+<l:template name="legalnotice" text="%t"/>
+<l:template name="listitem" text=""/>
+<l:template name="lot" text="%t"/>
+<l:template name="msg" text="%t"/>
+<l:template name="msgexplan" text="%t"/>
+<l:template name="msgmain" text="%t"/>
+<l:template name="msgrel" text="%t"/>
+<l:template name="msgset" text="%t"/>
+<l:template name="msgsub" text="%t"/>
+<l:template name="note" text="%t"/>
+<l:template name="orderedlist" text="%t"/>
+<l:template name="part" text="Del %n. %t"/>
+<l:template name="partintro" text="%t"/>
+<l:template name="preface" text="%t"/>
+<l:template name="procedure" text="%t"/>
+<l:template name="procedure.formal" text="Prosedyre %n. %t"/>
+<l:template name="productionset" text="%t"/>
+<l:template name="productionset.formal" text="Production %n"/>
+<l:template name="qandadiv" text="%t"/>
+<l:template name="qandaentry" text="%t"/>
+<l:template name="qandaset" text="%t"/>
+<l:template name="question" text="%t"/>
+<l:template name="refentry" text="%t"/>
+<l:template name="reference" text="%t"/>
+<l:template name="refsection" text="%t"/>
+<l:template name="refsect1" text="%t"/>
+<l:template name="refsect2" text="%t"/>
+<l:template name="refsect3" text="%t"/>
+<l:template name="refsynopsisdiv" text="%t"/>
+<l:template name="refsynopsisdivinfo" text="%t"/>
+<l:template name="segmentedlist" text="%t"/>
+<l:template name="set" text="%t"/>
+<l:template name="setindex" text="%t"/>
+<l:template name="sidebar" text="%t"/>
+<l:template name="step" text="%t"/>
+<l:template name="table" text="Tabell %n. %t"/>
+<l:template name="task" text="%t" lang="en"/>
+<l:template name="tasksummary" text="%t" lang="en"/>
+<l:template name="taskprerequisites" text="%t" lang="en"/>
+<l:template name="taskrelated" text="%t" lang="en"/>
+<l:template name="tip" text="%t"/>
+<l:template name="toc" text="%t"/>
+<l:template name="variablelist" text="%t"/>
+<l:template name="varlistentry" text="" lang="en"/>
+<l:template name="warning" text="%t"/>
+</l:context>
+<l:context name="title-unnumbered"><l:template name="appendix" text="%t"/>
+<l:template name="article/appendix" text="%t" lang="en"/>
+<l:template name="bridgehead" text="%t"/>
+<l:template name="chapter" text="%t"/>
+<l:template name="sect1" text="%t"/>
+<l:template name="sect2" text="%t"/>
+<l:template name="sect3" text="%t"/>
+<l:template name="sect4" text="%t"/>
+<l:template name="sect5" text="%t"/>
+<l:template name="section" text="%t"/>
+<l:template name="simplesect" text="%t"/>
+<l:template name="part" text="%t" lang="en"/>
+</l:context>
+<l:context name="title-numbered"><l:template name="appendix" text="Tillegg %n. %t"/>
+<l:template name="article/appendix" text="%n. %t" lang="en"/>
+<l:template name="bridgehead" text="%t"/>
+<l:template name="chapter" text="Kapittel %n. %t"/>
+<l:template name="part" text="Del %n. %t"/>
+<l:template name="sect1" text="%n. %t"/>
+<l:template name="sect2" text="%n. %t"/>
+<l:template name="sect3" text="%n. %t"/>
+<l:template name="sect4" text="%n. %t"/>
+<l:template name="sect5" text="%n. %t"/>
+<l:template name="section" text="%n. %t"/>
+<l:template name="simplesect" text="%n. %t"/>
+</l:context>
+<l:context name="subtitle"><l:template name="appendix" text="%s"/>
+<l:template name="acknowledgements" text="%s" lang="en"/>
+<l:template name="article" text="%s"/>
+<l:template name="bibliodiv" text="%s"/>
+<l:template name="biblioentry" text="%s"/>
+<l:template name="bibliography" text="%s"/>
+<l:template name="bibliomixed" text="%s"/>
+<l:template name="bibliomset" text="%s"/>
+<l:template name="biblioset" text="%s"/>
+<l:template name="book" text="%s"/>
+<l:template name="chapter" text="%s"/>
+<l:template name="colophon" text="%s"/>
+<l:template name="dedication" text="%s"/>
+<l:template name="glossary" text="%s"/>
+<l:template name="glossdiv" text="%s"/>
+<l:template name="index" text="%s"/>
+<l:template name="indexdiv" text="%s"/>
+<l:template name="lot" text="%s"/>
+<l:template name="part" text="%s"/>
+<l:template name="partintro" text="%s"/>
+<l:template name="preface" text="%s"/>
+<l:template name="refentry" text="%s"/>
+<l:template name="reference" text="%s"/>
+<l:template name="refsection" text="%s"/>
+<l:template name="refsect1" text="%s"/>
+<l:template name="refsect2" text="%s"/>
+<l:template name="refsect3" text="%s"/>
+<l:template name="refsynopsisdiv" text="%s"/>
+<l:template name="sect1" text="%s"/>
+<l:template name="sect2" text="%s"/>
+<l:template name="sect3" text="%s"/>
+<l:template name="sect4" text="%s"/>
+<l:template name="sect5" text="%s"/>
+<l:template name="section" text="%s"/>
+<l:template name="set" text="%s"/>
+<l:template name="setindex" text="%s"/>
+<l:template name="sidebar" text="%s"/>
+<l:template name="simplesect" text="%s"/>
+<l:template name="toc" text="%s"/>
+</l:context>
+<l:context name="xref"><l:template name="abstract" text="%t"/>
+<l:template name="acknowledgements" text="%t" lang="en"/>
+<l:template name="answer" text="Svar %n"/>
+<l:template name="appendix" text="%t"/>
+<l:template name="article" text="%t"/>
+<l:template name="authorblurb" text="%t"/>
+<l:template name="bibliodiv" text="%t"/>
+<l:template name="bibliography" text="%t"/>
+<l:template name="bibliomset" text="%t"/>
+<l:template name="biblioset" text="%t"/>
+<l:template name="blockquote" text="%t"/>
+<l:template name="book" text="%t"/>
+<l:template name="calloutlist" text="%t"/>
+<l:template name="caution" text="%t"/>
+<l:template name="chapter" text="%t"/>
+<l:template name="colophon" text="%t"/>
+<l:template name="constraintdef" text="%t"/>
+<l:template name="dedication" text="%t"/>
+<l:template name="equation" text="%t"/>
+<l:template name="example" text="%t"/>
+<l:template name="figure" text="%t"/>
+<l:template name="foil" text="%t" lang="en"/>
+<l:template name="foilgroup" text="%t" lang="en"/>
+<l:template name="formalpara" text="%t"/>
+<l:template name="glossary" text="%t"/>
+<l:template name="glossdiv" text="%t"/>
+<l:template name="important" text="%t"/>
+<l:template name="index" text="%t"/>
+<l:template name="indexdiv" text="%t"/>
+<l:template name="itemizedlist" text="%t"/>
+<l:template name="legalnotice" text="%t"/>
+<l:template name="listitem" text="%n"/>
+<l:template name="lot" text="%t"/>
+<l:template name="msg" text="%t"/>
+<l:template name="msgexplan" text="%t"/>
+<l:template name="msgmain" text="%t"/>
+<l:template name="msgrel" text="%t"/>
+<l:template name="msgset" text="%t"/>
+<l:template name="msgsub" text="%t"/>
+<l:template name="note" text="%t"/>
+<l:template name="orderedlist" text="%t"/>
+<l:template name="part" text="%t"/>
+<l:template name="partintro" text="%t"/>
+<l:template name="preface" text="%t"/>
+<l:template name="procedure" text="%t"/>
+<l:template name="productionset" text="%t"/>
+<l:template name="qandadiv" text="%t"/>
+<l:template name="qandaentry" text="Spørsmål %n"/>
+<l:template name="qandaset" text="%t"/>
+<l:template name="question" text="Spørsmål %n"/>
+<l:template name="reference" text="%t"/>
+<l:template name="refsynopsisdiv" text="%t"/>
+<l:template name="segmentedlist" text="%t"/>
+<l:template name="set" text="%t"/>
+<l:template name="setindex" text="%t"/>
+<l:template name="sidebar" text="%t"/>
+<l:template name="table" text="%t"/>
+<l:template name="task" text="%t" lang="en"/>
+<l:template name="tip" text="%t"/>
+<l:template name="toc" text="%t"/>
+<l:template name="variablelist" text="%t"/>
+<l:template name="varlistentry" text="%n"/>
+<l:template name="warning" text="%t"/>
+<l:template name="olink.document.citation" text=" in %o" lang="en"/>
+<l:template name="olink.page.citation" text=" (page %p)" lang="en"/>
+<l:template name="page.citation" text=" [%p]"/>
+<l:template name="page" text="(page %p)" lang="en"/>
+<l:template name="docname" text=" in %o" lang="en"/>
+<l:template name="docnamelong" text=" in the document titled %o" lang="en"/>
+<l:template name="pageabbrev" text="(p. %p)" lang="en"/>
+<l:template name="Page" text="Page %p" lang="en"/>
+<l:template name="bridgehead" text="“%tâ€"/>
+<l:template name="refsection" text="“%tâ€"/>
+<l:template name="refsect1" text="“%tâ€"/>
+<l:template name="refsect2" text="“%tâ€"/>
+<l:template name="refsect3" text="“%tâ€"/>
+<l:template name="sect1" text="“%tâ€"/>
+<l:template name="sect2" text="“%tâ€"/>
+<l:template name="sect3" text="“%tâ€"/>
+<l:template name="sect4" text="“%tâ€"/>
+<l:template name="sect5" text="“%tâ€"/>
+<l:template name="section" text="“%tâ€"/>
+<l:template name="simplesect" text="“%tâ€"/>
+</l:context>
+<l:context name="xref-number"><l:template name="answer" text="Svar %n"/>
+<l:template name="appendix" text="Tillegg %n"/>
+<l:template name="bridgehead" text="Del %n"/>
+<l:template name="chapter" text="Kapittel %n"/>
+<l:template name="equation" text="Formel %n"/>
+<l:template name="example" text="Døme %n"/>
+<l:template name="figure" text="Figur %n"/>
+<l:template name="part" text="Del %n"/>
+<l:template name="procedure" text="Prosedyre %n"/>
+<l:template name="productionset" text="Production %n"/>
+<l:template name="qandadiv" text="Spørsmål og Svar %n"/>
+<l:template name="qandaentry" text="Spørsmål %n"/>
+<l:template name="question" text="Spørsmål %n"/>
+<l:template name="sect1" text="Del %n"/>
+<l:template name="sect2" text="Del %n"/>
+<l:template name="sect3" text="Del %n"/>
+<l:template name="sect4" text="Del %n"/>
+<l:template name="sect5" text="Del %n"/>
+<l:template name="section" text="Del %n"/>
+<l:template name="table" text="Tabell %n"/>
+</l:context>
+<l:context name="xref-number-and-title"><l:template name="appendix" text="Tillegg %n, %t"/>
+<l:template name="bridgehead" text="Del %n, “%tâ€"/>
+<l:template name="chapter" text="Kapittel %n, %t"/>
+<l:template name="equation" text="Formel %n, “%tâ€"/>
+<l:template name="example" text="Døme %n, “%tâ€"/>
+<l:template name="figure" text="Figur %n, “%tâ€"/>
+<l:template name="part" text="Del %n, “%tâ€"/>
+<l:template name="procedure" text="Prosedyre %n, “%tâ€"/>
+<l:template name="productionset" text="Production %n, “%tâ€"/>
+<l:template name="qandadiv" text="SpørsmÃ¥l og Svar %n, “%tâ€"/>
+<l:template name="refsect1" text="the section called “%tâ€"/>
+<l:template name="refsect2" text="the section called “%tâ€"/>
+<l:template name="refsect3" text="the section called “%tâ€"/>
+<l:template name="refsection" text="the section called “%tâ€"/>
+<l:template name="sect1" text="Del %n, “%tâ€"/>
+<l:template name="sect2" text="Del %n, “%tâ€"/>
+<l:template name="sect3" text="Del %n, “%tâ€"/>
+<l:template name="sect4" text="Del %n, “%tâ€"/>
+<l:template name="sect5" text="Del %n, “%tâ€"/>
+<l:template name="section" text="Del %n, “%tâ€"/>
+<l:template name="simplesect" text="the section called “%tâ€"/>
+<l:template name="table" text="Tabell %n, “%tâ€"/>
+</l:context>
+<l:context name="authorgroup"><l:template name="sep" text=", "/>
+<l:template name="sep2" text=" og "/>
+<l:template name="seplast" text=", og "/>
+</l:context>
+<l:context name="glossary"><l:template name="see" text="Sjå %t."/>
+<l:template name="seealso" text="Sjå òg %t."/>
+<l:template name="seealso-separator" text=", "/>
+</l:context>
+<l:context name="msgset"><l:template name="MsgAud" text="Publikum: "/>
+<l:template name="MsgLevel" text="Nivå: "/>
+<l:template name="MsgOrig" text="Opphav: "/>
+</l:context>
+<l:context name="datetime"><l:template name="format" text="m/d/Y" lang="en"/>
+</l:context>
+<l:context name="termdef"><l:template name="prefix" text="[Definition: " lang="en"/>
+<l:template name="suffix" text="]" lang="en"/>
+</l:context>
+<l:context name="datetime-full"><l:template name="January" text="January" lang="en"/>
+<l:template name="February" text="February" lang="en"/>
+<l:template name="March" text="March" lang="en"/>
+<l:template name="April" text="April" lang="en"/>
+<l:template name="May" text="May" lang="en"/>
+<l:template name="June" text="June" lang="en"/>
+<l:template name="July" text="July" lang="en"/>
+<l:template name="August" text="August" lang="en"/>
+<l:template name="September" text="September" lang="en"/>
+<l:template name="October" text="October" lang="en"/>
+<l:template name="November" text="November" lang="en"/>
+<l:template name="December" text="December" lang="en"/>
+<l:template name="Monday" text="Monday" lang="en"/>
+<l:template name="Tuesday" text="Tuesday" lang="en"/>
+<l:template name="Wednesday" text="Wednesday" lang="en"/>
+<l:template name="Thursday" text="Thursday" lang="en"/>
+<l:template name="Friday" text="Friday" lang="en"/>
+<l:template name="Saturday" text="Saturday" lang="en"/>
+<l:template name="Sunday" text="Sunday" lang="en"/>
+</l:context>
+<l:context name="datetime-abbrev"><l:template name="Jan" text="Jan" lang="en"/>
+<l:template name="Feb" text="Feb" lang="en"/>
+<l:template name="Mar" text="Mar" lang="en"/>
+<l:template name="Apr" text="Apr" lang="en"/>
+<l:template name="May" text="May" lang="en"/>
+<l:template name="Jun" text="Jun" lang="en"/>
+<l:template name="Jul" text="Jul" lang="en"/>
+<l:template name="Aug" text="Aug" lang="en"/>
+<l:template name="Sep" text="Sep" lang="en"/>
+<l:template name="Oct" text="Oct" lang="en"/>
+<l:template name="Nov" text="Nov" lang="en"/>
+<l:template name="Dec" text="Dec" lang="en"/>
+<l:template name="Mon" text="Mon" lang="en"/>
+<l:template name="Tue" text="Tue" lang="en"/>
+<l:template name="Wed" text="Wed" lang="en"/>
+<l:template name="Thu" text="Thu" lang="en"/>
+<l:template name="Fri" text="Fri" lang="en"/>
+<l:template name="Sat" text="Sat" lang="en"/>
+<l:template name="Sun" text="Sun" lang="en"/>
+</l:context>
+<l:context name="htmlhelp"><l:template name="langcode" text="0x0814 Norwegian (Nynorsk)"/>
+</l:context>
+<l:context name="index"><l:template name="term-separator" text=", " lang="en"/>
+<l:template name="number-separator" text=", " lang="en"/>
+<l:template name="range-separator" text="-" lang="en"/>
+</l:context>
+<l:context name="iso690"><l:template name="lastfirst.sep" text=", " lang="en"/>
+<l:template name="alt.person.two.sep" text=" – " lang="en"/>
+<l:template name="alt.person.last.sep" text=" – " lang="en"/>
+<l:template name="alt.person.more.sep" text=" – " lang="en"/>
+<l:template name="primary.editor" text=" (ed.)" lang="en"/>
+<l:template name="primary.many" text=", et al." lang="en"/>
+<l:template name="primary.sep" text=". " lang="en"/>
+<l:template name="submaintitle.sep" text=": " lang="en"/>
+<l:template name="title.sep" text=". " lang="en"/>
+<l:template name="othertitle.sep" text=", " lang="en"/>
+<l:template name="medium1" text=" [" lang="en"/>
+<l:template name="medium2" text="]" lang="en"/>
+<l:template name="secondary.person.sep" text="; " lang="en"/>
+<l:template name="secondary.sep" text=". " lang="en"/>
+<l:template name="respons.sep" text=". " lang="en"/>
+<l:template name="edition.sep" text=". " lang="en"/>
+<l:template name="edition.serial.sep" text=", " lang="en"/>
+<l:template name="issuing.range" text="-" lang="en"/>
+<l:template name="issuing.div" text=", " lang="en"/>
+<l:template name="issuing.sep" text=". " lang="en"/>
+<l:template name="partnr.sep" text=". " lang="en"/>
+<l:template name="placepubl.sep" text=": " lang="en"/>
+<l:template name="publyear.sep" text=", " lang="en"/>
+<l:template name="pubinfo.sep" text=". " lang="en"/>
+<l:template name="spec.pubinfo.sep" text=", " lang="en"/>
+<l:template name="upd.sep" text=", " lang="en"/>
+<l:template name="datecit1" text=" [cited " lang="en"/>
+<l:template name="datecit2" text="]" lang="en"/>
+<l:template name="extent.sep" text=". " lang="en"/>
+<l:template name="locs.sep" text=", " lang="en"/>
+<l:template name="location.sep" text=". " lang="en"/>
+<l:template name="serie.sep" text=". " lang="en"/>
+<l:template name="notice.sep" text=". " lang="en"/>
+<l:template name="access" text="Available " lang="en"/>
+<l:template name="acctoo" text="Also available " lang="en"/>
+<l:template name="onwww" text="from World Wide Web" lang="en"/>
+<l:template name="oninet" text="from Internet" lang="en"/>
+<l:template name="access.end" text=": " lang="en"/>
+<l:template name="link1" text="&lt;" lang="en"/>
+<l:template name="link2" text="&gt;" lang="en"/>
+<l:template name="access.sep" text=". " lang="en"/>
+<l:template name="isbn" text="ISBN " lang="en"/>
+<l:template name="issn" text="ISSN " lang="en"/>
+<l:template name="stdnum.sep" text=". " lang="en"/>
+<l:template name="patcountry.sep" text=". " lang="en"/>
+<l:template name="pattype.sep" text=", " lang="en"/>
+<l:template name="patnum.sep" text=". " lang="en"/>
+<l:template name="patdate.sep" text=". " lang="en"/>
+</l:context><l:letters lang="en"><l:l i="-1"/>
+<l:l i="0">Symbols</l:l>
+<l:l i="10">A</l:l>
+<l:l i="10">a</l:l>
+<l:l i="10">À</l:l>
+<l:l i="10">à</l:l>
+<l:l i="10">Ã</l:l>
+<l:l i="10">á</l:l>
+<l:l i="10">Â</l:l>
+<l:l i="10">â</l:l>
+<l:l i="10">Ã</l:l>
+<l:l i="10">ã</l:l>
+<l:l i="10">Ä</l:l>
+<l:l i="10">ä</l:l>
+<l:l i="10">Ã…</l:l>
+<l:l i="10">Ã¥</l:l>
+<l:l i="10">Ä€</l:l>
+<l:l i="10">Ä</l:l>
+<l:l i="10">Ä‚</l:l>
+<l:l i="10">ă</l:l>
+<l:l i="10">Ä„</l:l>
+<l:l i="10">Ä…</l:l>
+<l:l i="10">Ç</l:l>
+<l:l i="10">ÇŽ</l:l>
+<l:l i="10">Çž</l:l>
+<l:l i="10">ÇŸ</l:l>
+<l:l i="10">Ç </l:l>
+<l:l i="10">Ç¡</l:l>
+<l:l i="10">Ǻ</l:l>
+<l:l i="10">Ç»</l:l>
+<l:l i="10">È€</l:l>
+<l:l i="10">È</l:l>
+<l:l i="10">È‚</l:l>
+<l:l i="10">ȃ</l:l>
+<l:l i="10">Ȧ</l:l>
+<l:l i="10">ȧ</l:l>
+<l:l i="10">Ḁ</l:l>
+<l:l i="10">á¸</l:l>
+<l:l i="10">ẚ</l:l>
+<l:l i="10">Ạ</l:l>
+<l:l i="10">ạ</l:l>
+<l:l i="10">Ả</l:l>
+<l:l i="10">ả</l:l>
+<l:l i="10">Ấ</l:l>
+<l:l i="10">ấ</l:l>
+<l:l i="10">Ầ</l:l>
+<l:l i="10">ầ</l:l>
+<l:l i="10">Ẩ</l:l>
+<l:l i="10">ẩ</l:l>
+<l:l i="10">Ẫ</l:l>
+<l:l i="10">ẫ</l:l>
+<l:l i="10">Ậ</l:l>
+<l:l i="10">ậ</l:l>
+<l:l i="10">Ắ</l:l>
+<l:l i="10">ắ</l:l>
+<l:l i="10">Ằ</l:l>
+<l:l i="10">ằ</l:l>
+<l:l i="10">Ẳ</l:l>
+<l:l i="10">ẳ</l:l>
+<l:l i="10">Ẵ</l:l>
+<l:l i="10">ẵ</l:l>
+<l:l i="10">Ặ</l:l>
+<l:l i="10">ặ</l:l>
+<l:l i="20">B</l:l>
+<l:l i="20">b</l:l>
+<l:l i="20">Æ€</l:l>
+<l:l i="20">Æ</l:l>
+<l:l i="20">É“</l:l>
+<l:l i="20">Æ‚</l:l>
+<l:l i="20">ƃ</l:l>
+<l:l i="20">Ḃ</l:l>
+<l:l i="20">ḃ</l:l>
+<l:l i="20">Ḅ</l:l>
+<l:l i="20">ḅ</l:l>
+<l:l i="20">Ḇ</l:l>
+<l:l i="20">ḇ</l:l>
+<l:l i="30">C</l:l>
+<l:l i="30">c</l:l>
+<l:l i="30">Ç</l:l>
+<l:l i="30">ç</l:l>
+<l:l i="30">Ć</l:l>
+<l:l i="30">ć</l:l>
+<l:l i="30">Ĉ</l:l>
+<l:l i="30">ĉ</l:l>
+<l:l i="30">ÄŠ</l:l>
+<l:l i="30">Ä‹</l:l>
+<l:l i="30">Č</l:l>
+<l:l i="30">Ä</l:l>
+<l:l i="30">Ƈ</l:l>
+<l:l i="30">ƈ</l:l>
+<l:l i="30">É•</l:l>
+<l:l i="30">Ḉ</l:l>
+<l:l i="30">ḉ</l:l>
+<l:l i="40">D</l:l>
+<l:l i="40">d</l:l>
+<l:l i="40">ÄŽ</l:l>
+<l:l i="40">Ä</l:l>
+<l:l i="40">Ä</l:l>
+<l:l i="40">Ä‘</l:l>
+<l:l i="40">ÆŠ</l:l>
+<l:l i="40">É—</l:l>
+<l:l i="40">Æ‹</l:l>
+<l:l i="40">ƌ</l:l>
+<l:l i="40">Ç…</l:l>
+<l:l i="40">Dz</l:l>
+<l:l i="40">È¡</l:l>
+<l:l i="40">É–</l:l>
+<l:l i="40">Ḋ</l:l>
+<l:l i="40">ḋ</l:l>
+<l:l i="40">Ḍ</l:l>
+<l:l i="40">á¸</l:l>
+<l:l i="40">Ḏ</l:l>
+<l:l i="40">á¸</l:l>
+<l:l i="40">á¸</l:l>
+<l:l i="40">ḑ</l:l>
+<l:l i="40">Ḓ</l:l>
+<l:l i="40">ḓ</l:l>
+<l:l i="50">E</l:l>
+<l:l i="50">e</l:l>
+<l:l i="50">È</l:l>
+<l:l i="50">è</l:l>
+<l:l i="50">É</l:l>
+<l:l i="50">é</l:l>
+<l:l i="50">Ê</l:l>
+<l:l i="50">ê</l:l>
+<l:l i="50">Ë</l:l>
+<l:l i="50">ë</l:l>
+<l:l i="50">Ä’</l:l>
+<l:l i="50">Ä“</l:l>
+<l:l i="50">Ä”</l:l>
+<l:l i="50">Ä•</l:l>
+<l:l i="50">Ä–</l:l>
+<l:l i="50">Ä—</l:l>
+<l:l i="50">Ę</l:l>
+<l:l i="50">Ä™</l:l>
+<l:l i="50">Äš</l:l>
+<l:l i="50">Ä›</l:l>
+<l:l i="50">È„</l:l>
+<l:l i="50">È…</l:l>
+<l:l i="50">Ȇ</l:l>
+<l:l i="50">ȇ</l:l>
+<l:l i="50">Ȩ</l:l>
+<l:l i="50">È©</l:l>
+<l:l i="50">Ḕ</l:l>
+<l:l i="50">ḕ</l:l>
+<l:l i="50">Ḗ</l:l>
+<l:l i="50">ḗ</l:l>
+<l:l i="50">Ḙ</l:l>
+<l:l i="50">ḙ</l:l>
+<l:l i="50">Ḛ</l:l>
+<l:l i="50">ḛ</l:l>
+<l:l i="50">Ḝ</l:l>
+<l:l i="50">á¸</l:l>
+<l:l i="50">Ẹ</l:l>
+<l:l i="50">ẹ</l:l>
+<l:l i="50">Ẻ</l:l>
+<l:l i="50">ẻ</l:l>
+<l:l i="50">Ẽ</l:l>
+<l:l i="50">ẽ</l:l>
+<l:l i="50">Ế</l:l>
+<l:l i="50">ế</l:l>
+<l:l i="50">Ề</l:l>
+<l:l i="50">á»</l:l>
+<l:l i="50">Ể</l:l>
+<l:l i="50">ể</l:l>
+<l:l i="50">Ễ</l:l>
+<l:l i="50">á»…</l:l>
+<l:l i="50">Ệ</l:l>
+<l:l i="50">ệ</l:l>
+<l:l i="60">F</l:l>
+<l:l i="60">f</l:l>
+<l:l i="60">Æ‘</l:l>
+<l:l i="60">Æ’</l:l>
+<l:l i="60">Ḟ</l:l>
+<l:l i="60">ḟ</l:l>
+<l:l i="70">G</l:l>
+<l:l i="70">g</l:l>
+<l:l i="70">Ĝ</l:l>
+<l:l i="70">Ä</l:l>
+<l:l i="70">Äž</l:l>
+<l:l i="70">ÄŸ</l:l>
+<l:l i="70">Ä </l:l>
+<l:l i="70">Ä¡</l:l>
+<l:l i="70">Ä¢</l:l>
+<l:l i="70">Ä£</l:l>
+<l:l i="70">Æ“</l:l>
+<l:l i="70">É </l:l>
+<l:l i="70">Ǥ</l:l>
+<l:l i="70">Ç¥</l:l>
+<l:l i="70">Ǧ</l:l>
+<l:l i="70">ǧ</l:l>
+<l:l i="70">Ç´</l:l>
+<l:l i="70">ǵ</l:l>
+<l:l i="70">Ḡ</l:l>
+<l:l i="70">ḡ</l:l>
+<l:l i="80">H</l:l>
+<l:l i="80">h</l:l>
+<l:l i="80">Ĥ</l:l>
+<l:l i="80">Ä¥</l:l>
+<l:l i="80">Ħ</l:l>
+<l:l i="80">ħ</l:l>
+<l:l i="80">Èž</l:l>
+<l:l i="80">ÈŸ</l:l>
+<l:l i="80">ɦ</l:l>
+<l:l i="80">Ḣ</l:l>
+<l:l i="80">ḣ</l:l>
+<l:l i="80">Ḥ</l:l>
+<l:l i="80">ḥ</l:l>
+<l:l i="80">Ḧ</l:l>
+<l:l i="80">ḧ</l:l>
+<l:l i="80">Ḩ</l:l>
+<l:l i="80">ḩ</l:l>
+<l:l i="80">Ḫ</l:l>
+<l:l i="80">ḫ</l:l>
+<l:l i="80">ẖ</l:l>
+<l:l i="90">I</l:l>
+<l:l i="90">i</l:l>
+<l:l i="90">Ì</l:l>
+<l:l i="90">ì</l:l>
+<l:l i="90">Ã</l:l>
+<l:l i="90">í</l:l>
+<l:l i="90">ÃŽ</l:l>
+<l:l i="90">î</l:l>
+<l:l i="90">Ã</l:l>
+<l:l i="90">ï</l:l>
+<l:l i="90">Ĩ</l:l>
+<l:l i="90">Ä©</l:l>
+<l:l i="90">Ī</l:l>
+<l:l i="90">Ä«</l:l>
+<l:l i="90">Ĭ</l:l>
+<l:l i="90">Ä­</l:l>
+<l:l i="90">Ä®</l:l>
+<l:l i="90">į</l:l>
+<l:l i="90">Ä°</l:l>
+<l:l i="90">Æ—</l:l>
+<l:l i="90">ɨ</l:l>
+<l:l i="90">Ç</l:l>
+<l:l i="90">Ç</l:l>
+<l:l i="90">Ȉ</l:l>
+<l:l i="90">ȉ</l:l>
+<l:l i="90">ÈŠ</l:l>
+<l:l i="90">È‹</l:l>
+<l:l i="90">Ḭ</l:l>
+<l:l i="90">ḭ</l:l>
+<l:l i="90">Ḯ</l:l>
+<l:l i="90">ḯ</l:l>
+<l:l i="90">Ỉ</l:l>
+<l:l i="90">ỉ</l:l>
+<l:l i="90">Ị</l:l>
+<l:l i="90">ị</l:l>
+<l:l i="100">J</l:l>
+<l:l i="100">j</l:l>
+<l:l i="100">Ä´</l:l>
+<l:l i="100">ĵ</l:l>
+<l:l i="100">Ç°</l:l>
+<l:l i="100">Ê</l:l>
+<l:l i="110">K</l:l>
+<l:l i="110">k</l:l>
+<l:l i="110">Ķ</l:l>
+<l:l i="110">Ä·</l:l>
+<l:l i="110">Ƙ</l:l>
+<l:l i="110">Æ™</l:l>
+<l:l i="110">Ǩ</l:l>
+<l:l i="110">Ç©</l:l>
+<l:l i="110">Ḱ</l:l>
+<l:l i="110">ḱ</l:l>
+<l:l i="110">Ḳ</l:l>
+<l:l i="110">ḳ</l:l>
+<l:l i="110">Ḵ</l:l>
+<l:l i="110">ḵ</l:l>
+<l:l i="120">L</l:l>
+<l:l i="120">l</l:l>
+<l:l i="120">Ĺ</l:l>
+<l:l i="120">ĺ</l:l>
+<l:l i="120">Ä»</l:l>
+<l:l i="120">ļ</l:l>
+<l:l i="120">Ľ</l:l>
+<l:l i="120">ľ</l:l>
+<l:l i="120">Ä¿</l:l>
+<l:l i="120">Å€</l:l>
+<l:l i="120">Å</l:l>
+<l:l i="120">Å‚</l:l>
+<l:l i="120">Æš</l:l>
+<l:l i="120">Lj</l:l>
+<l:l i="120">È´</l:l>
+<l:l i="120">É«</l:l>
+<l:l i="120">ɬ</l:l>
+<l:l i="120">É­</l:l>
+<l:l i="120">Ḷ</l:l>
+<l:l i="120">ḷ</l:l>
+<l:l i="120">Ḹ</l:l>
+<l:l i="120">ḹ</l:l>
+<l:l i="120">Ḻ</l:l>
+<l:l i="120">ḻ</l:l>
+<l:l i="120">Ḽ</l:l>
+<l:l i="120">ḽ</l:l>
+<l:l i="130">M</l:l>
+<l:l i="130">m</l:l>
+<l:l i="130">ɱ</l:l>
+<l:l i="130">Ḿ</l:l>
+<l:l i="130">ḿ</l:l>
+<l:l i="130">á¹€</l:l>
+<l:l i="130">á¹</l:l>
+<l:l i="130">Ṃ</l:l>
+<l:l i="130">ṃ</l:l>
+<l:l i="140">N</l:l>
+<l:l i="140">n</l:l>
+<l:l i="140">Ñ</l:l>
+<l:l i="140">ñ</l:l>
+<l:l i="140">Ń</l:l>
+<l:l i="140">Å„</l:l>
+<l:l i="140">Å…</l:l>
+<l:l i="140">ņ</l:l>
+<l:l i="140">Ň</l:l>
+<l:l i="140">ň</l:l>
+<l:l i="140">Æ</l:l>
+<l:l i="140">ɲ</l:l>
+<l:l i="140">Æž</l:l>
+<l:l i="140">È </l:l>
+<l:l i="140">Ç‹</l:l>
+<l:l i="140">Ǹ</l:l>
+<l:l i="140">ǹ</l:l>
+<l:l i="140">ȵ</l:l>
+<l:l i="140">ɳ</l:l>
+<l:l i="140">Ṅ</l:l>
+<l:l i="140">á¹…</l:l>
+<l:l i="140">Ṇ</l:l>
+<l:l i="140">ṇ</l:l>
+<l:l i="140">Ṉ</l:l>
+<l:l i="140">ṉ</l:l>
+<l:l i="140">Ṋ</l:l>
+<l:l i="140">ṋ</l:l>
+<l:l i="150">O</l:l>
+<l:l i="150">o</l:l>
+<l:l i="150">Ã’</l:l>
+<l:l i="150">ò</l:l>
+<l:l i="150">Ó</l:l>
+<l:l i="150">ó</l:l>
+<l:l i="150">Ô</l:l>
+<l:l i="150">ô</l:l>
+<l:l i="150">Õ</l:l>
+<l:l i="150">õ</l:l>
+<l:l i="150">Ö</l:l>
+<l:l i="150">ö</l:l>
+<l:l i="150">Ø</l:l>
+<l:l i="150">ø</l:l>
+<l:l i="150">Ō</l:l>
+<l:l i="150">Å</l:l>
+<l:l i="150">ÅŽ</l:l>
+<l:l i="150">Å</l:l>
+<l:l i="150">Å</l:l>
+<l:l i="150">Å‘</l:l>
+<l:l i="150">ÆŸ</l:l>
+<l:l i="150">Æ </l:l>
+<l:l i="150">Æ¡</l:l>
+<l:l i="150">Ç‘</l:l>
+<l:l i="150">Ç’</l:l>
+<l:l i="150">Ǫ</l:l>
+<l:l i="150">Ç«</l:l>
+<l:l i="150">Ǭ</l:l>
+<l:l i="150">Ç­</l:l>
+<l:l i="150">Ǿ</l:l>
+<l:l i="150">Ç¿</l:l>
+<l:l i="150">Ȍ</l:l>
+<l:l i="150">È</l:l>
+<l:l i="150">ÈŽ</l:l>
+<l:l i="150">È</l:l>
+<l:l i="150">Ȫ</l:l>
+<l:l i="150">È«</l:l>
+<l:l i="150">Ȭ</l:l>
+<l:l i="150">È­</l:l>
+<l:l i="150">È®</l:l>
+<l:l i="150">ȯ</l:l>
+<l:l i="150">È°</l:l>
+<l:l i="150">ȱ</l:l>
+<l:l i="150">Ṍ</l:l>
+<l:l i="150">á¹</l:l>
+<l:l i="150">Ṏ</l:l>
+<l:l i="150">á¹</l:l>
+<l:l i="150">á¹</l:l>
+<l:l i="150">ṑ</l:l>
+<l:l i="150">á¹’</l:l>
+<l:l i="150">ṓ</l:l>
+<l:l i="150">Ọ</l:l>
+<l:l i="150">á»</l:l>
+<l:l i="150">Ỏ</l:l>
+<l:l i="150">á»</l:l>
+<l:l i="150">á»</l:l>
+<l:l i="150">ố</l:l>
+<l:l i="150">á»’</l:l>
+<l:l i="150">ồ</l:l>
+<l:l i="150">á»”</l:l>
+<l:l i="150">ổ</l:l>
+<l:l i="150">á»–</l:l>
+<l:l i="150">á»—</l:l>
+<l:l i="150">Ộ</l:l>
+<l:l i="150">á»™</l:l>
+<l:l i="150">Ớ</l:l>
+<l:l i="150">á»›</l:l>
+<l:l i="150">Ờ</l:l>
+<l:l i="150">á»</l:l>
+<l:l i="150">Ở</l:l>
+<l:l i="150">ở</l:l>
+<l:l i="150">á» </l:l>
+<l:l i="150">ỡ</l:l>
+<l:l i="150">Ợ</l:l>
+<l:l i="150">ợ</l:l>
+<l:l i="160">P</l:l>
+<l:l i="160">p</l:l>
+<l:l i="160">Ƥ</l:l>
+<l:l i="160">Æ¥</l:l>
+<l:l i="160">á¹”</l:l>
+<l:l i="160">ṕ</l:l>
+<l:l i="160">á¹–</l:l>
+<l:l i="160">á¹—</l:l>
+<l:l i="170">Q</l:l>
+<l:l i="170">q</l:l>
+<l:l i="170">Ê </l:l>
+<l:l i="180">R</l:l>
+<l:l i="180">r</l:l>
+<l:l i="180">Å”</l:l>
+<l:l i="180">Å•</l:l>
+<l:l i="180">Å–</l:l>
+<l:l i="180">Å—</l:l>
+<l:l i="180">Ř</l:l>
+<l:l i="180">Å™</l:l>
+<l:l i="180">È</l:l>
+<l:l i="180">È‘</l:l>
+<l:l i="180">È’</l:l>
+<l:l i="180">È“</l:l>
+<l:l i="180">ɼ</l:l>
+<l:l i="180">ɽ</l:l>
+<l:l i="180">ɾ</l:l>
+<l:l i="180">Ṙ</l:l>
+<l:l i="180">á¹™</l:l>
+<l:l i="180">Ṛ</l:l>
+<l:l i="180">á¹›</l:l>
+<l:l i="180">Ṝ</l:l>
+<l:l i="180">á¹</l:l>
+<l:l i="180">Ṟ</l:l>
+<l:l i="180">ṟ</l:l>
+<l:l i="190">S</l:l>
+<l:l i="190">s</l:l>
+<l:l i="190">Åš</l:l>
+<l:l i="190">Å›</l:l>
+<l:l i="190">Ŝ</l:l>
+<l:l i="190">Å</l:l>
+<l:l i="190">Åž</l:l>
+<l:l i="190">ÅŸ</l:l>
+<l:l i="190">Å </l:l>
+<l:l i="190">Å¡</l:l>
+<l:l i="190">Ș</l:l>
+<l:l i="190">È™</l:l>
+<l:l i="190">Ê‚</l:l>
+<l:l i="190">á¹ </l:l>
+<l:l i="190">ṡ</l:l>
+<l:l i="190">á¹¢</l:l>
+<l:l i="190">á¹£</l:l>
+<l:l i="190">Ṥ</l:l>
+<l:l i="190">á¹¥</l:l>
+<l:l i="190">Ṧ</l:l>
+<l:l i="190">ṧ</l:l>
+<l:l i="190">Ṩ</l:l>
+<l:l i="190">ṩ</l:l>
+<l:l i="200">T</l:l>
+<l:l i="200">t</l:l>
+<l:l i="200">Å¢</l:l>
+<l:l i="200">Å£</l:l>
+<l:l i="200">Ť</l:l>
+<l:l i="200">Å¥</l:l>
+<l:l i="200">Ŧ</l:l>
+<l:l i="200">ŧ</l:l>
+<l:l i="200">Æ«</l:l>
+<l:l i="200">Ƭ</l:l>
+<l:l i="200">Æ­</l:l>
+<l:l i="200">Æ®</l:l>
+<l:l i="200">ʈ</l:l>
+<l:l i="200">Èš</l:l>
+<l:l i="200">È›</l:l>
+<l:l i="200">ȶ</l:l>
+<l:l i="200">Ṫ</l:l>
+<l:l i="200">ṫ</l:l>
+<l:l i="200">Ṭ</l:l>
+<l:l i="200">á¹­</l:l>
+<l:l i="200">á¹®</l:l>
+<l:l i="200">ṯ</l:l>
+<l:l i="200">á¹°</l:l>
+<l:l i="200">á¹±</l:l>
+<l:l i="200">ẗ</l:l>
+<l:l i="210">U</l:l>
+<l:l i="210">u</l:l>
+<l:l i="210">Ù</l:l>
+<l:l i="210">ù</l:l>
+<l:l i="210">Ú</l:l>
+<l:l i="210">ú</l:l>
+<l:l i="210">Û</l:l>
+<l:l i="210">û</l:l>
+<l:l i="210">Ü</l:l>
+<l:l i="210">ü</l:l>
+<l:l i="210">Ũ</l:l>
+<l:l i="210">Å©</l:l>
+<l:l i="210">Ū</l:l>
+<l:l i="210">Å«</l:l>
+<l:l i="210">Ŭ</l:l>
+<l:l i="210">Å­</l:l>
+<l:l i="210">Å®</l:l>
+<l:l i="210">ů</l:l>
+<l:l i="210">Å°</l:l>
+<l:l i="210">ű</l:l>
+<l:l i="210">Ų</l:l>
+<l:l i="210">ų</l:l>
+<l:l i="210">Ư</l:l>
+<l:l i="210">Æ°</l:l>
+<l:l i="210">Ç“</l:l>
+<l:l i="210">Ç”</l:l>
+<l:l i="210">Ç•</l:l>
+<l:l i="210">Ç–</l:l>
+<l:l i="210">Ç—</l:l>
+<l:l i="210">ǘ</l:l>
+<l:l i="210">Ç™</l:l>
+<l:l i="210">Çš</l:l>
+<l:l i="210">Ç›</l:l>
+<l:l i="210">ǜ</l:l>
+<l:l i="210">È”</l:l>
+<l:l i="210">È•</l:l>
+<l:l i="210">È–</l:l>
+<l:l i="210">È—</l:l>
+<l:l i="210">á¹²</l:l>
+<l:l i="210">á¹³</l:l>
+<l:l i="210">á¹´</l:l>
+<l:l i="210">á¹µ</l:l>
+<l:l i="210">Ṷ</l:l>
+<l:l i="210">á¹·</l:l>
+<l:l i="210">Ṹ</l:l>
+<l:l i="210">á¹¹</l:l>
+<l:l i="210">Ṻ</l:l>
+<l:l i="210">á¹»</l:l>
+<l:l i="210">Ụ</l:l>
+<l:l i="210">ụ</l:l>
+<l:l i="210">Ủ</l:l>
+<l:l i="210">ủ</l:l>
+<l:l i="210">Ứ</l:l>
+<l:l i="210">ứ</l:l>
+<l:l i="210">Ừ</l:l>
+<l:l i="210">ừ</l:l>
+<l:l i="210">Ử</l:l>
+<l:l i="210">á»­</l:l>
+<l:l i="210">á»®</l:l>
+<l:l i="210">ữ</l:l>
+<l:l i="210">á»°</l:l>
+<l:l i="210">á»±</l:l>
+<l:l i="220">V</l:l>
+<l:l i="220">v</l:l>
+<l:l i="220">Ʋ</l:l>
+<l:l i="220">Ê‹</l:l>
+<l:l i="220">á¹¼</l:l>
+<l:l i="220">á¹½</l:l>
+<l:l i="220">á¹¾</l:l>
+<l:l i="220">ṿ</l:l>
+<l:l i="230">W</l:l>
+<l:l i="230">w</l:l>
+<l:l i="230">Å´</l:l>
+<l:l i="230">ŵ</l:l>
+<l:l i="230">Ẁ</l:l>
+<l:l i="230">áº</l:l>
+<l:l i="230">Ẃ</l:l>
+<l:l i="230">ẃ</l:l>
+<l:l i="230">Ẅ</l:l>
+<l:l i="230">ẅ</l:l>
+<l:l i="230">Ẇ</l:l>
+<l:l i="230">ẇ</l:l>
+<l:l i="230">Ẉ</l:l>
+<l:l i="230">ẉ</l:l>
+<l:l i="230">ẘ</l:l>
+<l:l i="240">X</l:l>
+<l:l i="240">x</l:l>
+<l:l i="240">Ẋ</l:l>
+<l:l i="240">ẋ</l:l>
+<l:l i="240">Ẍ</l:l>
+<l:l i="240">áº</l:l>
+<l:l i="250">Y</l:l>
+<l:l i="250">y</l:l>
+<l:l i="250">Ã</l:l>
+<l:l i="250">ý</l:l>
+<l:l i="250">ÿ</l:l>
+<l:l i="250">Ÿ</l:l>
+<l:l i="250">Ŷ</l:l>
+<l:l i="250">Å·</l:l>
+<l:l i="250">Ƴ</l:l>
+<l:l i="250">Æ´</l:l>
+<l:l i="250">Ȳ</l:l>
+<l:l i="250">ȳ</l:l>
+<l:l i="250">Ẏ</l:l>
+<l:l i="250">áº</l:l>
+<l:l i="250">ẙ</l:l>
+<l:l i="250">Ỳ</l:l>
+<l:l i="250">ỳ</l:l>
+<l:l i="250">á»´</l:l>
+<l:l i="250">ỵ</l:l>
+<l:l i="250">Ỷ</l:l>
+<l:l i="250">á»·</l:l>
+<l:l i="250">Ỹ</l:l>
+<l:l i="250">ỹ</l:l>
+<l:l i="260">Z</l:l>
+<l:l i="260">z</l:l>
+<l:l i="260">Ź</l:l>
+<l:l i="260">ź</l:l>
+<l:l i="260">Å»</l:l>
+<l:l i="260">ż</l:l>
+<l:l i="260">Ž</l:l>
+<l:l i="260">ž</l:l>
+<l:l i="260">Ƶ</l:l>
+<l:l i="260">ƶ</l:l>
+<l:l i="260">Ȥ</l:l>
+<l:l i="260">È¥</l:l>
+<l:l i="260">Ê</l:l>
+<l:l i="260">Ê‘</l:l>
+<l:l i="260">áº</l:l>
+<l:l i="260">ẑ</l:l>
+<l:l i="260">Ẓ</l:l>
+<l:l i="260">ẓ</l:l>
+<l:l i="260">Ẕ</l:l>
+<l:l i="260">ẕ</l:l>
+</l:letters>
+</l:l10n>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/olink.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/olink.xsl
new file mode 100644
index 0000000..a790eb7
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/olink.xsl
@@ -0,0 +1,1225 @@
+<?xml version="1.0"?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="1.0">
+
+<!-- ********************************************************************
+ $Id: olink.xsl 8592 2010-03-16 16:40:43Z bobstayton $
+ ********************************************************************
+
+ This file is part of the DocBook XSL Stylesheet distribution.
+ See ../README or http://docbook.sf.net/ for copyright
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<!-- Create keys for quickly looking up olink targets -->
+<xsl:key name="targetdoc-key" match="document" use="@targetdoc" />
+<xsl:key name="targetptr-key" match="div|obj"
+ use="concat(ancestor::document/@targetdoc, '/',
+ @targetptr, '/', ancestor::document/@lang)" />
+
+<!-- Return filename of database -->
+<xsl:template name="select.target.database">
+ <xsl:param name="targetdoc.att" select="''"/>
+ <xsl:param name="targetptr.att" select="''"/>
+ <xsl:param name="olink.lang" select="''"/>
+
+ <!-- use root's xml:base if exists -->
+ <xsl:variable name="xml.base" select="/*/@xml:base"/>
+
+ <!-- This selection can be customized if needed -->
+ <xsl:variable name="target.database.filename">
+ <xsl:choose>
+ <xsl:when test="$xml.base != '' and
+ not(starts-with($target.database.document, 'file:/')) and
+ not(starts-with($target.database.document, '/'))">
+ <xsl:call-template name="systemIdToBaseURI">
+ <xsl:with-param name="systemId" select="$xml.base"/>
+ </xsl:call-template>
+ <xsl:value-of select="$target.database.document"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$target.database.document"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="target.database"
+ select="document($target.database.filename,/)"/>
+
+ <xsl:choose>
+ <!-- Was the database document parameter not set? -->
+ <xsl:when test="$target.database.document = ''">
+ <xsl:message>
+ <xsl:text>Olinks not processed: must specify a </xsl:text>
+ <xsl:text>$target.database.document parameter&#10;</xsl:text>
+ <xsl:text>when using olinks with targetdoc </xsl:text>
+ <xsl:text>and targetptr attributes.</xsl:text>
+ </xsl:message>
+ </xsl:when>
+ <!-- Did it not open? Should be a targetset element -->
+ <xsl:when test="not($target.database/*)">
+ <xsl:message>
+ <xsl:text>Olink error: could not open target database '</xsl:text>
+ <xsl:value-of select="$target.database.filename"/>
+ <xsl:text>'.</xsl:text>
+ </xsl:message>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$target.database.filename"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="select.olink.key">
+ <xsl:param name="targetdoc.att" select="''"/>
+ <xsl:param name="targetptr.att" select="''"/>
+ <xsl:param name="olink.lang" select="''"/>
+ <xsl:param name="target.database"/>
+
+ <xsl:if test="$target.database/*">
+ <xsl:variable name="olink.fallback.sequence">
+ <xsl:call-template name="select.olink.lang.fallback">
+ <xsl:with-param name="olink.lang" select="$olink.lang"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <!-- Recurse through the languages until you find a match -->
+ <xsl:call-template name="select.olink.key.in.lang">
+ <xsl:with-param name="targetdoc.att" select="$targetdoc.att"/>
+ <xsl:with-param name="targetptr.att" select="$targetptr.att"/>
+ <xsl:with-param name="olink.lang" select="$olink.lang"/>
+ <xsl:with-param name="target.database" select="$target.database"/>
+ <xsl:with-param name="fallback.index" select="1"/>
+ <xsl:with-param name="olink.fallback.sequence"
+ select="$olink.fallback.sequence"/>
+ </xsl:call-template>
+ </xsl:if>
+
+</xsl:template>
+
+<!-- Locate olink key in a particular language -->
+<xsl:template name="select.olink.key.in.lang">
+ <xsl:param name="targetdoc.att" select="''"/>
+ <xsl:param name="targetptr.att" select="''"/>
+ <xsl:param name="olink.lang" select="''"/>
+ <xsl:param name="target.database"/>
+ <xsl:param name="fallback.index" select="1"/>
+ <xsl:param name="olink.fallback.sequence" select="''"/>
+
+ <xsl:variable name="target.lang">
+ <xsl:call-template name="select.target.lang">
+ <xsl:with-param name="fallback.index" select="$fallback.index"/>
+ <xsl:with-param name="olink.fallback.sequence"
+ select="$olink.fallback.sequence"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:if test="$olink.debug != 0">
+ <xsl:message><xsl:text>Olink debug: cases for targetdoc='</xsl:text>
+ <xsl:value-of select="$targetdoc.att"/>
+ <xsl:text>' and targetptr='</xsl:text>
+ <xsl:value-of select="$targetptr.att"/>
+ <xsl:text>' in language '</xsl:text>
+ <xsl:value-of select="$target.lang"/>
+ <xsl:text>'.</xsl:text>
+ </xsl:message>
+ </xsl:if>
+
+ <!-- Customize these cases if you want different selection logic -->
+ <xsl:variable name="CaseA">
+ <!-- targetdoc.att = not blank
+ targetptr.att = not blank
+ -->
+ <xsl:if test="$targetdoc.att != '' and
+ $targetptr.att != ''">
+ <xsl:for-each select="$target.database">
+ <xsl:variable name="key"
+ select="concat($targetdoc.att, '/',
+ $targetptr.att, '/',
+ $target.lang)"/>
+ <xsl:choose>
+ <xsl:when test="key('targetptr-key', $key)[1]/@href != ''">
+ <xsl:value-of select="$key"/>
+ <xsl:if test="$olink.debug != 0">
+ <xsl:message>Olink debug: CaseA matched.</xsl:message>
+ </xsl:if>
+ </xsl:when>
+ <xsl:when test="$olink.debug != 0">
+ <xsl:message>Olink debug: CaseA NOT matched</xsl:message>
+ </xsl:when>
+ </xsl:choose>
+ </xsl:for-each>
+ </xsl:if>
+ </xsl:variable>
+
+ <xsl:variable name="CaseB">
+ <!-- targetdoc.att = not blank
+ targetptr.att = not blank
+ prefer.internal.olink = not zero
+ current.docid = not blank
+ -->
+ <xsl:if test="$targetdoc.att != '' and
+ $targetptr.att != '' and
+ $current.docid != '' and
+ $prefer.internal.olink != 0">
+ <xsl:for-each select="$target.database">
+ <xsl:variable name="key"
+ select="concat($current.docid, '/',
+ $targetptr.att, '/',
+ $target.lang)"/>
+ <xsl:choose>
+ <xsl:when test="key('targetptr-key', $key)[1]/@href != ''">
+ <xsl:value-of select="$key"/>
+ <xsl:if test="$olink.debug != 0">
+ <xsl:message>Olink debug: CaseB matched.</xsl:message>
+ </xsl:if>
+ </xsl:when>
+ <xsl:when test="$olink.debug != 0">
+ <xsl:message>Olink debug: CaseB NOT matched</xsl:message>
+ </xsl:when>
+ </xsl:choose>
+ </xsl:for-each>
+ </xsl:if>
+ </xsl:variable>
+
+ <xsl:variable name="CaseC">
+ <!-- targetdoc.att = blank
+ targetptr.att = not blank
+ current.docid = not blank
+ -->
+ <xsl:if test="string-length($targetdoc.att) = 0 and
+ $targetptr.att != '' and
+ $current.docid != ''">
+ <!-- Must use a for-each to change context for keys to work -->
+ <xsl:for-each select="$target.database">
+ <xsl:variable name="key"
+ select="concat($current.docid, '/',
+ $targetptr.att, '/',
+ $target.lang)"/>
+ <xsl:choose>
+ <xsl:when test="key('targetptr-key', $key)[1]/@href != ''">
+ <xsl:value-of select="$key"/>
+ <xsl:if test="$olink.debug != 0">
+ <xsl:message>Olink debug: CaseC matched.</xsl:message>
+ </xsl:if>
+ </xsl:when>
+ <xsl:when test="$olink.debug != 0">
+ <xsl:message>Olink debug: CaseC NOT matched.</xsl:message>
+ </xsl:when>
+ </xsl:choose>
+ </xsl:for-each>
+ </xsl:if>
+ </xsl:variable>
+
+ <xsl:variable name="CaseD">
+ <!-- targetdoc.att = blank
+ targetptr.att = not blank
+ current.docid = blank
+ -->
+ <!-- This is possible if only one document in the database -->
+ <xsl:if test="string-length($targetdoc.att) = 0 and
+ $targetptr.att != '' and
+ string-length($current.docid) = 0 and
+ count($target.database//document) = 1">
+ <xsl:for-each select="$target.database">
+ <xsl:variable name="key"
+ select="concat(.//document/@targetdoc, '/',
+ $targetptr.att, '/',
+ $target.lang)"/>
+ <xsl:choose>
+ <xsl:when test="key('targetptr-key', $key)[1]/@href != ''">
+ <xsl:value-of select="$key"/>
+ <xsl:if test="$olink.debug != 0">
+ <xsl:message>Olink debug: CaseD matched.</xsl:message>
+ </xsl:if>
+ </xsl:when>
+ <xsl:when test="$olink.debug != 0">
+ <xsl:message>Olink debug: CaseD NOT matched</xsl:message>
+ </xsl:when>
+ </xsl:choose>
+ </xsl:for-each>
+ </xsl:if>
+ </xsl:variable>
+
+ <xsl:variable name="CaseE">
+ <!-- targetdoc.att = not blank
+ targetptr.att = blank
+ -->
+ <xsl:if test="$targetdoc.att != '' and
+ string-length($targetptr.att) = 0">
+
+ <!-- Try the document's root element id -->
+ <xsl:variable name="rootid">
+ <xsl:choose>
+ <xsl:when test="$target.lang != ''">
+ <xsl:value-of select="$target.database//document[@targetdoc = $targetdoc.att and @lang = $target.lang]/*[1]/@targetptr"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$target.database//document[@targetdoc = $targetdoc.att and not(@lang)]/*[1]/@targetptr"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:for-each select="$target.database">
+ <xsl:variable name="key"
+ select="concat($targetdoc.att, '/',
+ $rootid, '/',
+ $target.lang)"/>
+ <xsl:choose>
+ <xsl:when test="key('targetptr-key', $key)[1]/@href != ''">
+ <xsl:value-of select="$key"/>
+ <xsl:if test="$olink.debug != 0">
+ <xsl:message>Olink debug: CaseE matched.</xsl:message>
+ </xsl:if>
+ </xsl:when>
+ <xsl:when test="$olink.debug != 0">
+ <xsl:message>Olink debug: CaseE NOT matched.</xsl:message>
+ </xsl:when>
+ </xsl:choose>
+ </xsl:for-each>
+ </xsl:if>
+ </xsl:variable>
+
+ <xsl:variable name="CaseF">
+ <!-- targetdoc.att = not blank
+ targetptr.att = blank
+ prefer.internal.olink = not zero
+ current.docid = not blank
+ -->
+ <xsl:if test="$targetdoc.att != '' and
+ string-length($targetptr.att) = 0 and
+ $current.docid != '' and
+ $prefer.internal.olink != 0">
+ <!-- Try the document's root element id -->
+ <xsl:variable name="rootid">
+ <xsl:choose>
+ <xsl:when test="$target.lang != ''">
+ <xsl:value-of select="$target.database//document[@targetdoc = $current.docid and @lang = $target.lang]/*[1]/@targetptr"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$target.database//document[@targetdoc = $current.docid and not(@lang)]/*[1]/@targetptr"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:for-each select="$target.database">
+ <xsl:variable name="key"
+ select="concat($current.docid, '/',
+ $rootid, '/',
+ $target.lang)"/>
+ <xsl:choose>
+ <xsl:when test="key('targetptr-key', $key)[1]/@href != ''">
+ <xsl:value-of select="$key"/>
+ <xsl:if test="$olink.debug != 0">
+ <xsl:message>Olink debug: CaseF matched.</xsl:message>
+ </xsl:if>
+ </xsl:when>
+ <xsl:when test="$olink.debug != 0">
+ <xsl:message>Olink debug: CaseF NOT matched.</xsl:message>
+ </xsl:when>
+ </xsl:choose>
+ </xsl:for-each>
+ </xsl:if>
+ </xsl:variable>
+
+ <!-- Now select the best match. Customize the order if needed -->
+ <xsl:variable name="selected.key">
+ <xsl:choose>
+ <xsl:when test="$CaseB != ''">
+ <xsl:value-of select="$CaseB"/>
+ <xsl:if test="$olink.debug != 0">
+ <xsl:message>
+ <xsl:text>Olink debug: CaseB key is the final selection: </xsl:text>
+ <xsl:value-of select="$CaseB"/>
+ </xsl:message>
+ </xsl:if>
+ </xsl:when>
+ <xsl:when test="$CaseA != ''">
+ <xsl:value-of select="$CaseA"/>
+ <xsl:if test="$olink.debug != 0">
+ <xsl:message>
+ <xsl:text>Olink debug: CaseA key is the final selection: </xsl:text>
+ <xsl:value-of select="$CaseA"/>
+ </xsl:message>
+ </xsl:if>
+ </xsl:when>
+ <xsl:when test="$CaseC != ''">
+ <xsl:value-of select="$CaseC"/>
+ <xsl:if test="$olink.debug != 0">
+ <xsl:message>
+ <xsl:text>Olink debug: CaseC key is the final selection: </xsl:text>
+ <xsl:value-of select="$CaseC"/>
+ </xsl:message>
+ </xsl:if>
+ </xsl:when>
+ <xsl:when test="$CaseD != ''">
+ <xsl:value-of select="$CaseD"/>
+ <xsl:if test="$olink.debug != 0">
+ <xsl:message>
+ <xsl:text>Olink debug: CaseD key is the final selection: </xsl:text>
+ <xsl:value-of select="$CaseD"/>
+ </xsl:message>
+ </xsl:if>
+ </xsl:when>
+ <xsl:when test="$CaseF != ''">
+ <xsl:value-of select="$CaseF"/>
+ <xsl:if test="$olink.debug != 0">
+ <xsl:message>
+ <xsl:text>Olink debug: CaseF key is the final selection: </xsl:text>
+ <xsl:value-of select="$CaseF"/>
+ </xsl:message>
+ </xsl:if>
+ </xsl:when>
+ <xsl:when test="$CaseE != ''">
+ <xsl:value-of select="$CaseE"/>
+ <xsl:if test="$olink.debug != 0">
+ <xsl:message>
+ <xsl:text>Olink debug: CaseE key is the final selection: </xsl:text>
+ <xsl:value-of select="$CaseE"/>
+ </xsl:message>
+ </xsl:if>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:if test="$olink.debug != 0">
+ <xsl:message>
+ <xsl:text>Olink debug: No case matched for lang '</xsl:text>
+ <xsl:value-of select="$target.lang"/>
+ <xsl:text>'.</xsl:text>
+ </xsl:message>
+ </xsl:if>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="$selected.key != ''">
+ <xsl:value-of select="$selected.key"/>
+ </xsl:when>
+ <xsl:when test="string-length($selected.key) = 0 and
+ string-length($target.lang) = 0">
+ <!-- No match on last try, and we are done -->
+ </xsl:when>
+ <xsl:otherwise>
+ <!-- Recurse through next language -->
+ <xsl:call-template name="select.olink.key.in.lang">
+ <xsl:with-param name="targetdoc.att" select="$targetdoc.att"/>
+ <xsl:with-param name="targetptr.att" select="$targetptr.att"/>
+ <xsl:with-param name="olink.lang" select="$olink.lang"/>
+ <xsl:with-param name="target.database" select="$target.database"/>
+ <xsl:with-param name="fallback.index" select="$fallback.index + 1"/>
+ <xsl:with-param name="olink.fallback.sequence"
+ select="$olink.fallback.sequence"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+
+</xsl:template>
+
+<xsl:template name="select.target.lang">
+ <xsl:param name="fallback.index" select="1"/>
+ <xsl:param name="olink.fallback.sequence" select="''"/>
+
+ <!-- recurse backwards to find the lang matching the index -->
+ <xsl:variable name="firstlang"
+ select="substring-before($olink.fallback.sequence, ' ')"/>
+ <xsl:variable name="rest"
+ select="substring-after($olink.fallback.sequence, ' ')"/>
+ <xsl:choose>
+ <xsl:when test="$fallback.index = 1">
+ <xsl:value-of select="$firstlang"/>
+ </xsl:when>
+ <xsl:when test="$fallback.index &gt; 1">
+ <xsl:call-template name="select.target.lang">
+ <xsl:with-param name="fallback.index" select="$fallback.index - 1"/>
+ <xsl:with-param name="olink.fallback.sequence"
+ select="$rest"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="select.olink.lang.fallback">
+ <xsl:param name="olink.lang" select="''"/>
+
+ <!-- Prefer language of the olink element -->
+ <xsl:value-of select="concat(normalize-space(concat($olink.lang, ' ',
+ $olink.lang.fallback.sequence)), ' ')"/>
+</xsl:template>
+
+<!-- Returns the complete olink href value if found -->
+<xsl:template name="make.olink.href">
+ <xsl:param name="olink.key" select="''"/>
+ <xsl:param name="target.database"/>
+
+ <xsl:if test="$olink.key != ''">
+ <xsl:variable name="target.href" >
+ <xsl:for-each select="$target.database" >
+ <xsl:value-of select="key('targetptr-key', $olink.key)[1]/@href" />
+ </xsl:for-each>
+ </xsl:variable>
+
+ <xsl:variable name="targetdoc">
+ <xsl:value-of select="substring-before($olink.key, '/')"/>
+ </xsl:variable>
+
+ <!-- Does the target database use a sitemap? -->
+ <xsl:variable name="use.sitemap">
+ <xsl:choose>
+ <xsl:when test="$target.database//sitemap">1</xsl:when>
+ <xsl:otherwise>0</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+
+ <!-- Get the baseuri for this targetptr -->
+ <xsl:variable name="baseuri" >
+ <xsl:choose>
+ <!-- Does the database use a sitemap? -->
+ <xsl:when test="$use.sitemap != 0" >
+ <xsl:choose>
+ <!-- Was current.docid parameter set? -->
+ <xsl:when test="$current.docid != ''">
+ <!-- Was it found in the database? -->
+ <xsl:variable name="currentdoc.key" >
+ <xsl:for-each select="$target.database" >
+ <xsl:value-of select="key('targetdoc-key',
+ $current.docid)[1]/@targetdoc" />
+ </xsl:for-each>
+ </xsl:variable>
+ <xsl:choose>
+ <xsl:when test="$currentdoc.key != ''">
+ <xsl:for-each select="$target.database" >
+ <xsl:call-template name="targetpath" >
+ <xsl:with-param name="dirnode"
+ select="key('targetdoc-key', $current.docid)[1]/parent::dir"/>
+ <xsl:with-param name="targetdoc" select="$targetdoc"/>
+ </xsl:call-template>
+ </xsl:for-each >
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:message>
+ <xsl:text>Olink error: cannot compute relative </xsl:text>
+ <xsl:text>sitemap path because $current.docid '</xsl:text>
+ <xsl:value-of select="$current.docid"/>
+ <xsl:text>' not found in target database.</xsl:text>
+ </xsl:message>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:message>
+ <xsl:text>Olink warning: cannot compute relative </xsl:text>
+ <xsl:text>sitemap path without $current.docid parameter</xsl:text>
+ </xsl:message>
+ </xsl:otherwise>
+ </xsl:choose>
+ <!-- In either case, add baseuri from its document entry-->
+ <xsl:variable name="docbaseuri">
+ <xsl:for-each select="$target.database" >
+ <xsl:value-of select="key('targetdoc-key', $targetdoc)[1]/@baseuri" />
+ </xsl:for-each>
+ </xsl:variable>
+ <xsl:if test="$docbaseuri != ''" >
+ <xsl:value-of select="$docbaseuri"/>
+ </xsl:if>
+ </xsl:when>
+ <!-- No database sitemap in use -->
+ <xsl:otherwise>
+ <!-- Just use any baseuri from its document entry -->
+ <xsl:variable name="docbaseuri">
+ <xsl:for-each select="$target.database" >
+ <xsl:value-of select="key('targetdoc-key', $targetdoc)[1]/@baseuri" />
+ </xsl:for-each>
+ </xsl:variable>
+ <xsl:if test="$docbaseuri != ''" >
+ <xsl:value-of select="$docbaseuri"/>
+ </xsl:if>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <!-- Form the href information -->
+ <xsl:if test="$baseuri != ''">
+ <xsl:value-of select="$baseuri"/>
+ <xsl:if test="substring($target.href,1,1) != '#'">
+ <!--xsl:text>/</xsl:text-->
+ </xsl:if>
+ </xsl:if>
+ <!-- optionally turn off frag for PDF references -->
+ <xsl:if test="not($insert.olink.pdf.frag = 0 and
+ translate(substring($baseuri, string-length($baseuri) - 3),
+ 'PDF', 'pdf') = '.pdf'
+ and starts-with($target.href, '#') )">
+ <xsl:value-of select="$target.href"/>
+ </xsl:if>
+ </xsl:if>
+</xsl:template>
+
+<!-- Computes the href of the object containing the olink element -->
+<xsl:template name="olink.from.uri">
+ <xsl:param name="target.database"/>
+ <xsl:param name="object" select="NotAnElement"/>
+ <xsl:param name="object.targetdoc" select="$current.docid"/>
+ <xsl:param name="object.lang"
+ select="concat($object/ancestor::*[last()]/@lang,
+ $object/ancestor::*[last()]/@xml:lang)"/>
+
+ <xsl:variable name="parent.id">
+ <xsl:call-template name="object.id">
+ <xsl:with-param name="object" select="$object"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <!-- Get the olink key for the parent of olink element -->
+ <xsl:variable name="from.key">
+ <xsl:call-template name="select.olink.key">
+ <xsl:with-param name="targetdoc.att" select="$object.targetdoc"/>
+ <xsl:with-param name="targetptr.att" select="$parent.id"/>
+ <xsl:with-param name="olink.lang" select="$object.lang"/>
+ <xsl:with-param name="target.database" select="$target.database"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="from.olink.href">
+ <xsl:for-each select="$target.database" >
+ <xsl:value-of select="key('targetptr-key', $from.key)[1]/@href" />
+ </xsl:for-each>
+ </xsl:variable>
+
+ <xsl:choose>
+ <!-- we found the olink object -->
+ <xsl:when test="$from.olink.href != ''">
+ <xsl:value-of select="$from.olink.href"/>
+ </xsl:when>
+ <xsl:when test="not($object/parent::*)">
+ <xsl:value-of select="$from.olink.href"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <!-- recurse upward in current document -->
+ <xsl:call-template name="olink.from.uri">
+ <xsl:with-param name="target.database" select="$target.database"/>
+ <xsl:with-param name="object" select="$object/parent::*"/>
+ <xsl:with-param name="object.targetdoc" select="$object.targetdoc"/>
+ <xsl:with-param name="object.lang" select="$object.lang"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+
+</xsl:template>
+
+<xsl:template name="olink.hottext">
+ <xsl:param name="target.database"/>
+ <xsl:param name="olink.lang" select="''"/>
+ <xsl:param name="olink.key" select="''"/>
+ <xsl:param name="referrer" select="."/>
+ <xsl:param name="xrefstyle">
+ <xsl:choose>
+ <xsl:when test="@role and not(@xrefstyle)
+ and $use.role.as.xrefstyle != 0">
+ <xsl:value-of select="@role"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="@xrefstyle"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:param>
+
+ <xsl:choose>
+ <!-- If it has elements or text (not just PI or comment) -->
+ <xsl:when test="child::text() or child::*">
+ <xsl:apply-templates/>
+ </xsl:when>
+ <xsl:when test="$olink.key != ''">
+ <!-- Get the xref text for this record -->
+ <xsl:variable name="xref.text" >
+ <xsl:for-each select="$target.database" >
+ <xsl:call-template name="insert.targetdb.data">
+ <xsl:with-param name="data"
+ select="key('targetptr-key', $olink.key)[1]/xreftext/node()" />
+ </xsl:call-template>
+ </xsl:for-each>
+ </xsl:variable>
+
+ <xsl:variable name="xref.number" >
+ <xsl:for-each select="$target.database" >
+ <xsl:value-of select="key('targetptr-key', $olink.key)[1]/@number" />
+ </xsl:for-each>
+ </xsl:variable>
+
+ <xsl:variable name="target.elem" >
+ <xsl:for-each select="$target.database" >
+ <xsl:value-of select="key('targetptr-key', $olink.key)[1]/@element" />
+ </xsl:for-each>
+ </xsl:variable>
+
+ <xsl:variable name="lang">
+ <xsl:variable name="candidate">
+ <xsl:for-each select="$target.database" >
+ <xsl:value-of
+ select="key('targetptr-key', $olink.key)[1]/@lang" />
+ </xsl:for-each>
+ </xsl:variable>
+ <xsl:choose>
+ <xsl:when test="$candidate != ''">
+ <xsl:value-of select="$candidate"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$olink.lang"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="targetdoc">
+ <xsl:value-of select="substring-before($olink.key, '/')"/>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="$xrefstyle != '' and
+ starts-with(normalize-space($xrefstyle), 'select:') and
+ (contains($xrefstyle, 'nodocname') or
+ contains($xrefstyle, 'nopage')) and
+ not(contains($xrefstyle, 'title')) and
+ not(contains($xrefstyle, 'label'))">
+ <xsl:copy-of select="$xref.text"/>
+ </xsl:when>
+ <xsl:when test="$xrefstyle != ''">
+ <xsl:if test="$olink.debug != 0">
+ <xsl:message>
+ <xsl:text>xrefstyle is '</xsl:text>
+ <xsl:value-of select="$xrefstyle"/>
+ <xsl:text>'.</xsl:text>
+ </xsl:message>
+ </xsl:if>
+ <xsl:variable name="template">
+ <xsl:choose>
+ <xsl:when test="starts-with(normalize-space($xrefstyle),
+ 'select:')">
+ <xsl:call-template name="make.gentext.template">
+ <xsl:with-param name="xrefstyle" select="$xrefstyle"/>
+ <xsl:with-param name="purpose" select="'olink'"/>
+ <xsl:with-param name="referrer" select="."/>
+ <xsl:with-param name="target.elem" select="$target.elem"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="starts-with(normalize-space($xrefstyle),
+ 'template:')">
+ <xsl:value-of select="substring-after(
+ normalize-space($xrefstyle), 'template:')"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <!-- Look for Gentext template with @style attribute -->
+ <!-- Must compare to no style value because gentext.template
+ falls back to no style -->
+
+ <xsl:variable name="xref-context">
+ <xsl:call-template name="gentext.template">
+ <xsl:with-param name="context" select="'xref'"/>
+ <xsl:with-param name="name" select="$target.elem"/>
+ <xsl:with-param name="lang" select="$lang"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="styled-xref-context">
+ <xsl:call-template name="gentext.template">
+ <xsl:with-param name="context" select="'xref'"/>
+ <xsl:with-param name="name" select="$target.elem"/>
+ <xsl:with-param name="lang" select="$lang"/>
+ <xsl:with-param name="xrefstyle" select="$xrefstyle"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="xref-number-context">
+ <xsl:call-template name="gentext.template">
+ <xsl:with-param name="context" select="'xref-number'"/>
+ <xsl:with-param name="name" select="$target.elem"/>
+ <xsl:with-param name="lang" select="$lang"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="styled-xref-number-context">
+ <xsl:call-template name="gentext.template">
+ <xsl:with-param name="context" select="'xref-number'"/>
+ <xsl:with-param name="name" select="$target.elem"/>
+ <xsl:with-param name="lang" select="$lang"/>
+ <xsl:with-param name="xrefstyle" select="$xrefstyle"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="xref-number-and-title-context">
+ <xsl:call-template name="gentext.template">
+ <xsl:with-param name="context"
+ select="'xref-number-and-title'"/>
+ <xsl:with-param name="name" select="$target.elem"/>
+ <xsl:with-param name="lang" select="$lang"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="styled-xref-number-and-title-context">
+ <xsl:call-template name="gentext.template">
+ <xsl:with-param name="context"
+ select="'xref-number-and-title'"/>
+ <xsl:with-param name="name" select="$target.elem"/>
+ <xsl:with-param name="lang" select="$lang"/>
+ <xsl:with-param name="xrefstyle" select="$xrefstyle"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="$xref-number-and-title-context !=
+ $styled-xref-number-and-title-context and
+ $xref.number != '' and
+ $xref.with.number.and.title != 0">
+ <xsl:value-of
+ select="$styled-xref-number-and-title-context"/>
+ </xsl:when>
+ <xsl:when test="$xref-number-context !=
+ $styled-xref-number-context and
+ $xref.number != ''">
+ <xsl:value-of select="$styled-xref-number-context"/>
+ </xsl:when>
+ <xsl:when test="$xref-context != $styled-xref-context">
+ <xsl:value-of select="$styled-xref-context"/>
+ </xsl:when>
+ <xsl:when test="$xref-number-and-title-context != '' and
+ $xref.number != '' and
+ $xref.with.number.and.title != 0">
+ <xsl:value-of
+ select="$xref-number-and-title-context"/>
+ <xsl:if test="$olink.debug">
+ <xsl:message>
+ <xsl:text>Olink error: no gentext template</xsl:text>
+ <xsl:text> exists for xrefstyle '</xsl:text>
+ <xsl:value-of select="$xrefstyle"/>
+ <xsl:text>' for element '</xsl:text>
+ <xsl:value-of select="$target.elem"/>
+ <xsl:text>' in language '</xsl:text>
+ <xsl:value-of select="$lang"/>
+ <xsl:text>' in context 'xref-number-and-title</xsl:text>
+ <xsl:text>'. Using template without @style.</xsl:text>
+ </xsl:message>
+ </xsl:if>
+ </xsl:when>
+ <xsl:when test="$xref-number-context != '' and
+ $xref.number != ''">
+ <xsl:value-of select="$xref-number-context"/>
+ <xsl:if test="$olink.debug">
+ <xsl:message>
+ <xsl:text>Olink error: no gentext template</xsl:text>
+ <xsl:text> exists for xrefstyle '</xsl:text>
+ <xsl:value-of select="$xrefstyle"/>
+ <xsl:text>' for element '</xsl:text>
+ <xsl:value-of select="$target.elem"/>
+ <xsl:text>' in language '</xsl:text>
+ <xsl:value-of select="$lang"/>
+ <xsl:text>' in context 'xref-number</xsl:text>
+ <xsl:text>'. Using template without @style.</xsl:text>
+ </xsl:message>
+ </xsl:if>
+ </xsl:when>
+ <xsl:when test="$xref-context != ''">
+ <xsl:value-of select="$xref-context"/>
+ <xsl:if test="$olink.debug">
+ <xsl:message>
+ <xsl:text>Olink error: no gentext template</xsl:text>
+ <xsl:text> exists for xrefstyle '</xsl:text>
+ <xsl:value-of select="$xrefstyle"/>
+ <xsl:text>' for element '</xsl:text>
+ <xsl:value-of select="$target.elem"/>
+ <xsl:text>' in language '</xsl:text>
+ <xsl:value-of select="$lang"/>
+ <xsl:text>' in context 'xref</xsl:text>
+ <xsl:text>'. Using template without @style.</xsl:text>
+ </xsl:message>
+ </xsl:if>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:message>
+ <xsl:text>Olink error: no gentext template</xsl:text>
+ <xsl:text> exists for xrefstyle '</xsl:text>
+ <xsl:value-of select="$xrefstyle"/>
+ <xsl:text>' for element '</xsl:text>
+ <xsl:value-of select="$target.elem"/>
+ <xsl:text>' in language '</xsl:text>
+ <xsl:value-of select="$lang"/>
+ <xsl:text>'. Trying '%t'.</xsl:text>
+ </xsl:message>
+ <xsl:value-of select="'%t'"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:if test="$olink.debug != 0">
+ <xsl:message>
+ <xsl:text>Olink debug: xrefstyle template is '</xsl:text>
+ <xsl:value-of select="$template"/>
+ <xsl:text>'.</xsl:text>
+ </xsl:message>
+ </xsl:if>
+
+ <xsl:call-template name="substitute-markup">
+ <xsl:with-param name="template" select="$template"/>
+ <xsl:with-param name="title">
+ <xsl:for-each select="$target.database" >
+ <xsl:call-template name="insert.targetdb.data">
+ <xsl:with-param name="data"
+ select="key('targetptr-key', $olink.key)/ttl/node()"/>
+ </xsl:call-template>
+ </xsl:for-each>
+ </xsl:with-param>
+ <xsl:with-param name="label">
+ <xsl:for-each select="$target.database" >
+ <xsl:value-of
+ select="key('targetptr-key', $olink.key)[1]/@number" />
+ </xsl:for-each>
+ </xsl:with-param>
+ <xsl:with-param name="pagenumber">
+ <xsl:for-each select="$target.database" >
+ <xsl:value-of
+ select="key('targetptr-key', $olink.key)[1]/@page" />
+ </xsl:for-each>
+ </xsl:with-param>
+ <xsl:with-param name="docname">
+ <xsl:for-each select="$target.database" >
+ <xsl:call-template name="insert.targetdb.data">
+ <xsl:with-param name="data"
+ select="key('targetdoc-key', $targetdoc)[1]/div[1]/ttl/node()" />
+ </xsl:call-template>
+ </xsl:for-each>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:when>
+
+ <xsl:when test="$use.local.olink.style != 0">
+
+ <!-- Is autonumbering on? -->
+ <xsl:variable name="target.number">
+ <xsl:for-each select="$target.database" >
+ <xsl:value-of
+ select="key('targetptr-key', $olink.key)[1]/@number" />
+ </xsl:for-each>
+ </xsl:variable>
+
+ <xsl:variable name="autonumber">
+ <xsl:choose>
+ <xsl:when test="$target.number != ''">1</xsl:when>
+ <xsl:otherwise>0</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="number-and-title-template">
+ <xsl:call-template name="gentext.template.exists">
+ <xsl:with-param name="context" select="'xref-number-and-title'"/>
+ <xsl:with-param name="name" select="$target.elem"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="number-template">
+ <xsl:call-template name="gentext.template.exists">
+ <xsl:with-param name="context" select="'xref-number'"/>
+ <xsl:with-param name="name" select="$target.elem"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="context">
+ <xsl:choose>
+ <xsl:when test="string($autonumber) != 0
+ and $number-and-title-template != 0
+ and $xref.with.number.and.title != 0">
+ <xsl:value-of select="'xref-number-and-title'"/>
+ </xsl:when>
+ <xsl:when test="string($autonumber) != 0
+ and $number-template != 0">
+ <xsl:value-of select="'xref-number'"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="'xref'"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="template">
+ <xsl:call-template name="gentext.template">
+ <xsl:with-param name="context" select="$context"/>
+ <xsl:with-param name="name" select="$target.elem"/>
+ <xsl:with-param name="lang" select="$lang"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:call-template name="substitute-markup">
+ <xsl:with-param name="template" select="$template"/>
+ <xsl:with-param name="title">
+ <xsl:for-each select="$target.database" >
+ <xsl:call-template name="insert.targetdb.data">
+ <xsl:with-param name="data"
+ select="key('targetptr-key', $olink.key)[1]/ttl/node()" />
+ </xsl:call-template>
+ </xsl:for-each>
+ </xsl:with-param>
+ <xsl:with-param name="label">
+ <xsl:for-each select="$target.database" >
+ <xsl:call-template name="insert.targetdb.data">
+ <xsl:with-param name="data"
+ select="key('targetptr-key', $olink.key)[1]/@number" />
+ </xsl:call-template>
+ </xsl:for-each>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="$xref.text !=''">
+ <xsl:copy-of select="$xref.text"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:message>
+ <xsl:text>Olink error: no generated text for </xsl:text>
+ <xsl:text>targetdoc/targetptr/lang = '</xsl:text>
+ <xsl:value-of select="$olink.key"/>
+ <xsl:text>'.</xsl:text>
+ </xsl:message>
+ <xsl:text>????</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:when test="@targetdoc != '' or @targetptr != ''">
+ <xsl:if test="$olink.key != ''">
+ <xsl:message>
+ <xsl:text>Olink error: no generated text for </xsl:text>
+ <xsl:text>targetdoc/targetptr/lang = '</xsl:text>
+ <xsl:value-of select="$olink.key"/>
+ <xsl:text>'.</xsl:text>
+ </xsl:message>
+ </xsl:if>
+ <xsl:text>????</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <!-- old style olink -->
+ <xsl:call-template name="olink.outline">
+ <xsl:with-param name="outline.base.uri"
+ select="unparsed-entity-uri(@targetdocent)"/>
+ <xsl:with-param name="localinfo" select="@localinfo"/>
+ <xsl:with-param name="return" select="'xreftext'"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="insert.targetdb.data">
+ <xsl:param name="data"/>
+ <!-- Customize this to massage data further -->
+ <xsl:copy-of select="$data"/>
+</xsl:template>
+
+<xsl:template match="*" mode="olink.docname.markup">
+ <!-- No-op for now -->
+</xsl:template>
+
+<xsl:template name="targetpath">
+ <xsl:param name="dirnode" />
+ <xsl:param name="targetdoc" select="''"/>
+
+<!--
+<xsl:message>dirnode is <xsl:value-of select="$dirnode/@name"/></xsl:message>
+<xsl:message>targetdoc is <xsl:value-of select="$targetdoc"/></xsl:message>
+-->
+ <!-- recursive template generates path to olink target directory -->
+ <xsl:choose>
+ <!-- Have we arrived at the final path step? -->
+ <xsl:when test="$dirnode/child::document[@targetdoc = $targetdoc]">
+ <!-- We are done -->
+ </xsl:when>
+ <!-- Have we reached the top without a match? -->
+ <xsl:when test="local-name($dirnode) != 'dir'" >
+ <xsl:message>Olink error: cannot locate targetdoc <xsl:value-of select="$targetdoc"/> in sitemap</xsl:message>
+ </xsl:when>
+ <!-- Is the target in a descendant? -->
+ <xsl:when test="$dirnode/descendant::document/@targetdoc = $targetdoc">
+ <xsl:variable name="step" select="$dirnode/child::dir[descendant::document/@targetdoc = $targetdoc]"/>
+ <xsl:if test = "$step">
+ <xsl:value-of select="$step/@name"/>
+ <xsl:text>/</xsl:text>
+ </xsl:if>
+ <!-- Now recurse with the child -->
+ <xsl:call-template name="targetpath" >
+ <xsl:with-param name="dirnode" select="$step"/>
+ <xsl:with-param name="targetdoc" select="$targetdoc"/>
+ </xsl:call-template>
+ </xsl:when>
+ <!-- Otherwise we need to move up a step -->
+ <xsl:otherwise>
+ <xsl:if test="$dirnode/parent::dir">
+ <xsl:text>../</xsl:text>
+ </xsl:if>
+ <xsl:call-template name="targetpath" >
+ <xsl:with-param name="dirnode" select="$dirnode/parent::*"/>
+ <xsl:with-param name="targetdoc" select="$targetdoc"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="olink.page.citation">
+ <xsl:param name="olink.key" select="''"/>
+ <xsl:param name="olink.lang" select="'en'"/>
+ <xsl:param name="target.database"/>
+ <xsl:param name="linkend" select="''"/>
+ <xsl:param name="xrefstyle">
+ <xsl:choose>
+ <xsl:when test="@role and not(@xrefstyle)
+ and $use.role.as.xrefstyle != 0">
+ <xsl:value-of select="@role"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="@xrefstyle"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:param>
+
+ <xsl:variable name="targetdoc">
+ <xsl:value-of select="substring-before($olink.key, '/')"/>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="$linkend != ''">
+ <xsl:call-template name="xref.page.citation">
+ <xsl:with-param name="linkend" select="$linkend"/>
+ <xsl:with-param name="target" select="key('id', $linkend)"/>
+ <xsl:with-param name="xrefstyle" select="$xrefstyle"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="not(starts-with(normalize-space($xrefstyle),
+ 'select:')
+ and (contains($xrefstyle, 'page')
+ or contains($xrefstyle, 'Page')))
+ and $current.docid != ''
+ and $current.docid != $targetdoc
+ and $insert.olink.page.number = 'yes' ">
+
+ <xsl:variable name="page-number">
+ <xsl:for-each select="$target.database" >
+ <xsl:value-of
+ select="key('targetptr-key', $olink.key)[1]/@page" />
+ </xsl:for-each>
+ </xsl:variable>
+
+ <xsl:if test="$page-number != ''">
+ <xsl:call-template name="substitute-markup">
+ <xsl:with-param name="template">
+ <xsl:call-template name="gentext.template">
+ <xsl:with-param name="name" select="'olink.page.citation'"/>
+ <xsl:with-param name="context" select="'xref'"/>
+ <xsl:with-param name="lang" select="$olink.lang"/>
+ </xsl:call-template>
+ </xsl:with-param>
+ <xsl:with-param name="pagenumber" select="$page-number"/>
+ </xsl:call-template>
+ </xsl:if>
+
+ </xsl:when>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="olink.document.citation">
+ <xsl:param name="olink.key" select="''"/>
+ <xsl:param name="olink.lang" select="'en'"/>
+ <xsl:param name="target.database"/>
+ <xsl:param name="xrefstyle">
+ <xsl:choose>
+ <xsl:when test="@role and not(@xrefstyle)
+ and $use.role.as.xrefstyle != 0">
+ <xsl:value-of select="@role"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="@xrefstyle"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:param>
+
+ <xsl:variable name="page">
+ <xsl:for-each select="$target.database" >
+ <xsl:value-of
+ select="key('targetptr-key', $olink.key)[1]/@page" />
+ </xsl:for-each>
+ </xsl:variable>
+
+ <xsl:variable name="targetdoc">
+ <xsl:value-of select="substring-before($olink.key, '/')"/>
+ </xsl:variable>
+
+ <xsl:variable name="targetptr">
+ <xsl:value-of
+ select="substring-before(substring-after($olink.key, '/'), '/')"/>
+ </xsl:variable>
+
+ <!-- Don't add docname if pointing to root element -->
+ <xsl:variable name="rootptr">
+ <xsl:for-each select="$target.database" >
+ <xsl:value-of
+ select="key('targetdoc-key', $targetdoc)[1]/div[1]/@targetptr" />
+ </xsl:for-each>
+ </xsl:variable>
+
+ <xsl:variable name="docname">
+ <xsl:for-each select="$target.database" >
+ <xsl:call-template name="insert.targetdb.data">
+ <xsl:with-param name="data"
+ select="key('targetdoc-key', $targetdoc)[1]/div[1]/ttl/node()" />
+ </xsl:call-template>
+ </xsl:for-each>
+ </xsl:variable>
+
+ <xsl:if test="not(starts-with(normalize-space($xrefstyle), 'select:')
+ and (contains($xrefstyle, 'docname')))
+ and ($olink.doctitle = 'yes' or $olink.doctitle = '1')
+ and $current.docid != ''
+ and $rootptr != $targetptr
+ and $current.docid != $targetdoc
+ and $docname != ''">
+ <xsl:call-template name="substitute-markup">
+ <xsl:with-param name="template">
+ <xsl:call-template name="gentext.template">
+ <xsl:with-param name="name" select="'olink.document.citation'"/>
+ <xsl:with-param name="context" select="'xref'"/>
+ <xsl:with-param name="lang" select="$olink.lang"/>
+ </xsl:call-template>
+ </xsl:with-param>
+ <xsl:with-param name="docname" select="$docname"/>
+ <xsl:with-param name="pagenumber" select="$page"/>
+ </xsl:call-template>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template name="xref.page.citation">
+ <!-- Determine if this xref should have a page citation.
+ Context node is the xref or local olink element -->
+ <xsl:param name="linkend" select="@linkend"/>
+ <xsl:param name="target" select="key('id', $linkend)"/>
+ <xsl:param name="xrefstyle">
+ <xsl:choose>
+ <xsl:when test="@role and not(@xrefstyle)
+ and $use.role.as.xrefstyle != 0">
+ <xsl:value-of select="@role"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="@xrefstyle"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:param>
+
+ <xsl:if test="not(starts-with(normalize-space($xrefstyle),'select:')
+ and (contains($xrefstyle, 'page')
+ or contains($xrefstyle, 'Page')))
+ and ( $insert.xref.page.number = 'yes'
+ or $insert.xref.page.number = '1')
+ or local-name($target) = 'para'">
+ <xsl:apply-templates select="$target" mode="page.citation">
+ <xsl:with-param name="id" select="$linkend"/>
+ </xsl:apply-templates>
+ </xsl:if>
+</xsl:template>
+
+</xsl:stylesheet>
+
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/or.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/or.xml
new file mode 100644
index 0000000..2995ac0
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/or.xml
@@ -0,0 +1,1229 @@
+<?xml version="1.0" encoding="utf-8"?>
+<l:l10n xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0" language="or" english-language-name="Oriya">
+
+<!-- * This file is generated automatically. -->
+<!-- * To submit changes to this file upstream (to the DocBook Project) -->
+<!-- * do not submit an edited version of this file. Instead, submit an -->
+<!-- * edited version of the source file at the following location: -->
+<!-- * -->
+<!-- * https://docbook.svn.sourceforge.net/svnroot/docbook/trunk/gentext/locale/or.xml -->
+<!-- * -->
+<!-- * E-mail the edited or.xml source file to: -->
+<!-- * -->
+<!-- * docbook-developers@lists.sourceforge.net -->
+
+<!-- ******************************************************************** -->
+
+<!-- This file is part of the XSL DocBook Stylesheet distribution. -->
+<!-- See ../README or http://docbook.sf.net/release/xsl/current/ for -->
+<!-- copyright and other information. -->
+
+<!-- ******************************************************************** -->
+<!-- In these files, % with a letter is used for a placeholder: -->
+<!-- %t is the current element's title -->
+<!-- %s is the current element's subtitle (if applicable)-->
+<!-- %n is the current element's number label-->
+<!-- %p is the current element's page number (if applicable)-->
+<!-- ******************************************************************** -->
+
+
+<l:gentext key="Abstract" text="ସାରାଂଶ"/>
+<l:gentext key="abstract" text="ସାରାଂଶ"/>
+<l:gentext key="Acknowledgements" text="ପà­à¬°à¬¾à¬ªà­à¬¤à¬¿ ସୂଚନା"/>
+<l:gentext key="acknowledgements" text="ପà­à¬°à¬¾à¬ªà­à¬¤à¬¿ ସୂଚନା"/>
+<l:gentext key="Answer" text="ଉ:"/>
+<l:gentext key="answer" text="ଉ:"/>
+<l:gentext key="Appendix" text="ପରିଶିଷà­à¬ "/>
+<l:gentext key="appendix" text="ପରିଶିଷà­à¬ "/>
+<l:gentext key="Article" text="ନିବନà­à¬§"/>
+<l:gentext key="article" text="ନିବନà­à¬§"/>
+<l:gentext key="Author" text="ଲେଖକ"/>
+<l:gentext key="Bibliography" text="ଗà­à¬°à¬¨à­à¬¥à¬¸à­‚ଚୀ"/>
+<l:gentext key="bibliography" text="ଗà­à¬°à¬¨à­à¬¥à¬¸à­‚ଚୀ"/>
+<l:gentext key="Book" text="ପà­à¬¸à­à¬¤à¬•"/>
+<l:gentext key="book" text="ପà­à¬¸à­à¬¤à¬•"/>
+<l:gentext key="CAUTION" text="ସାବଧାନ"/>
+<l:gentext key="Caution" text="ସାବଧାନ"/>
+<l:gentext key="caution" text="ସାବଧାନ"/>
+<l:gentext key="Chapter" text="ଅଧà­à¬¯à¬¾à­Ÿ"/>
+<l:gentext key="chapter" text="ଅଧà­à¬¯à¬¾à­Ÿ"/>
+<l:gentext key="Colophon" text="ପà­à¬¸à­à¬¤à¬• ପରିଚୟ"/>
+<l:gentext key="colophon" text="ପà­à¬¸à­à¬¤à¬• ପରିଚୟ"/>
+<l:gentext key="Copyright" text="ସà­à¬¬à¬¤à­à¬¤à­à¬¬à¬¾à¬§à­€à¬•à¬¾à¬°"/>
+<l:gentext key="copyright" text="ସà­à¬¬à¬¤à­à¬¤à­à¬¬à¬¾à¬§à­€à¬•à¬¾à¬°"/>
+<l:gentext key="Dedication" text="ସମରà­à¬ªà¬£"/>
+<l:gentext key="dedication" text="ସମରà­à¬ªà¬£"/>
+<l:gentext key="Edition" text="ସଂସକରଣ"/>
+<l:gentext key="edition" text="ସଂସକରଣ"/>
+<l:gentext key="Editor" text="ସମà­à¬ªà¬¾à¬¦à¬•"/>
+<l:gentext key="Equation" text="ସମୀକରଣ"/>
+<l:gentext key="equation" text="ସମୀକରଣ"/>
+<l:gentext key="Example" text="ଉଦାହରଣ"/>
+<l:gentext key="example" text="ଉଦାହରଣ"/>
+<l:gentext key="Figure" text="ଚିତà­à¬°"/>
+<l:gentext key="figure" text="ଚିତà­à¬°"/>
+<l:gentext key="Glossary" text="ଶବà­à¬¦à¬•à­‹à¬·"/>
+<l:gentext key="glossary" text="ଶବà­à¬¦à¬•à­‹à¬·"/>
+<l:gentext key="GlossSee" text="ଦେଖନà­à¬¤à­"/>
+<l:gentext key="glosssee" text="ଦେଖନà­à¬¤à­"/>
+<l:gentext key="GlossSeeAlso" text="à¬à¬¹à¬¾ ଭି ଦେଖନà­à¬¤à­"/>
+<l:gentext key="glossseealso" text="à¬à¬¹à¬¾ ଭି ଦେଖନà­à¬¤à­"/>
+<l:gentext key="IMPORTANT" text="ଗà­à¬°à­à¬¤à­à¬¬à¬ªà­‚ରà­à¬£à­à¬£"/>
+<l:gentext key="important" text="ଗà­à¬°à­à¬¤à­à¬¬à¬ªà­‚ରà­à¬£à­à¬£"/>
+<l:gentext key="Important" text="ଗà­à¬°à­à¬¤à­à¬¬à¬ªà­‚ରà­à¬£à­à¬£"/>
+<l:gentext key="Index" text="ଅନà­à¬•à­à¬°à¬®à¬£à¬¿à¬•à¬¾"/>
+<l:gentext key="index" text="ଅନà­à¬•à­à¬°à¬®à¬£à¬¿à¬•à¬¾"/>
+<l:gentext key="ISBN" text="ଆଇ.à¬à¬¸.ବି.à¬à¬¨."/>
+<l:gentext key="isbn" text="ଆଇ.à¬à¬¸.ବି.à¬à¬¨."/>
+<l:gentext key="LegalNotice" text="ବୈଧାନିକ ସୂଚନା"/>
+<l:gentext key="legalnotice" text="ବୈଧାନିକ ସୂଚନା"/>
+<l:gentext key="MsgAud" text="ଶà­à¬°à­‹à¬¤à­ƒà¬¬à¬°à­à¬—"/>
+<l:gentext key="msgaud" text="ଶà­à¬°à­‹à¬¤à­ƒà¬¬à¬°à­à¬—"/>
+<l:gentext key="MsgLevel" text="ସà­à¬¤à¬°"/>
+<l:gentext key="msglevel" text="ସà­à¬¤à¬°"/>
+<l:gentext key="MsgOrig" text="ଉତà­à¬ªà¬¤à­à¬¤à¬¿"/>
+<l:gentext key="msgorig" text="ଉତà­à¬ªà¬¤à­à¬¤à¬¿"/>
+<l:gentext key="NOTE" text="ଟୀକା"/>
+<l:gentext key="Note" text="ଟୀକା"/>
+<l:gentext key="note" text="ଟୀକା"/>
+<l:gentext key="Part" text="ଭାଗ"/>
+<l:gentext key="part" text="ଭାଗ"/>
+<l:gentext key="Preface" text="ଭୂମିକା"/>
+<l:gentext key="preface" text="ଭୂମିକା"/>
+<l:gentext key="Procedure" text="କାରà­à¬¯à­à¬¯à¬¬à¬¿à¬§à¬¿"/>
+<l:gentext key="procedure" text="କାରà­à¬¯à­à¬¯à¬¬à¬¿à¬§à¬¿"/>
+<l:gentext key="ProductionSet" text="ଉତà­à¬ªà¬¾à¬¦à¬¨"/>
+<l:gentext key="PubDate" text="ପà­à¬°à¬•à¬¾à¬¶à¬¨ ତାରୀଖ"/>
+<l:gentext key="pubdate" text="ପà­à¬°à¬•à¬¾à¬¶à¬¨ ତାରୀଖ"/>
+<l:gentext key="Published" text="ପà­à¬°à¬•à¬¾à¬¶à¬¿à¬¤"/>
+<l:gentext key="published" text="ପà­à¬°à¬•à¬¾à¬¶à¬¿à¬¤"/>
+<l:gentext key="Publisher" text="ପà­à¬°à¬•à¬¾à¬¶à¬•"/>
+<l:gentext key="Qandadiv" text="ପà­à¬° &amp; ଉ"/>
+<l:gentext key="qandadiv" text="ପà­à¬° &amp; ଉ"/>
+<l:gentext key="QandASet" text="ବାରମà­à¬¬à¬¾à¬° ପଚରାଯାଉଥିବା ପà­à¬°à¬¶à­à¬¨à¬—à­à¬¡à¬¼à¬¿à¬•"/>
+<l:gentext key="Question" text="ପà­à¬°:"/>
+<l:gentext key="question" text="ପà­à¬°:"/>
+<l:gentext key="RefEntry" text="ପୃଷà­à¬ à¬¾"/>
+<l:gentext key="refentry" text="ପୃଷà­à¬ à¬¾"/>
+<l:gentext key="Reference" text="ସନà­à¬¦à¬°à­à¬­"/>
+<l:gentext key="reference" text="ସନà­à¬¦à¬°à­à¬­"/>
+<l:gentext key="References" text="ସନà­à¬¦à¬°à­à¬­"/>
+<l:gentext key="RefName" text="ନାମ"/>
+<l:gentext key="refname" text="ନାମ"/>
+<l:gentext key="RefSection" text="ଅଂଶ"/>
+<l:gentext key="refsection" text="ଅଂଶ"/>
+<l:gentext key="RefSynopsisDiv" text="ସାରାଂଶ"/>
+<l:gentext key="refsynopsisdiv" text="ସାରାଂଶ"/>
+<l:gentext key="RevHistory" text="ସଂଶୋଧନ ଇତିହାସ"/>
+<l:gentext key="revhistory" text="ସଂଶୋଧନ ଇତିହାସ"/>
+<l:gentext key="revision" text="ସଂଶୋଧନ"/>
+<l:gentext key="Revision" text="ସଂଶୋଧନ"/>
+<l:gentext key="sect1" text="ଅଂଶ"/>
+<l:gentext key="sect2" text="ଅଂଶ"/>
+<l:gentext key="sect3" text="ଅଂଶ"/>
+<l:gentext key="sect4" text="ଅଂଶ"/>
+<l:gentext key="sect5" text="ଅଂଶ"/>
+<l:gentext key="section" text="ଅଂଶ"/>
+<l:gentext key="Section" text="ଅଂଶ"/>
+<l:gentext key="see" text="ଦେଖନà­à¬¤à­"/>
+<l:gentext key="See" text="ଦେଖନà­à¬¤à­"/>
+<l:gentext key="seealso" text="à¬à¬¹à¬¾ ଭି ଦେଖନà­à¬¤à­"/>
+<l:gentext key="Seealso" text="à¬à¬¹à¬¾ ଭି ଦେଖନà­à¬¤à­"/>
+<l:gentext key="SeeAlso" text="à¬à¬¹à¬¾ ଭି ଦେଖନà­à¬¤à­"/>
+<l:gentext key="set" text="ବିନà­à¬¯à¬¾à¬¸ କରନà­à¬¤à­"/>
+<l:gentext key="Set" text="ବିନà­à¬¯à¬¾à¬¸ କରନà­à¬¤à­"/>
+<l:gentext key="setindex" text="ଅନà­à¬•à­à¬°à¬®à¬£à¬¿à¬•à¬¾ ବିନà­à¬¯à¬¾à¬¸ କରନà­à¬¤à­"/>
+<l:gentext key="SetIndex" text="ଅନà­à¬•à­à¬°à¬®à¬£à¬¿à¬•à¬¾ ବିନà­à¬¯à¬¾à¬¸ କରନà­à¬¤à­"/>
+<l:gentext key="Sidebar" text="ପାରà­à¬¶à­à¬¬à¬ªà¬Ÿà¬¿"/>
+<l:gentext key="sidebar" text="ପାରà­à¬¶à­à¬¬à¬ªà¬Ÿà¬¿"/>
+<l:gentext key="step" text="ପଦକà­à¬·à­‡à¬ª"/>
+<l:gentext key="Step" text="ପଦକà­à¬·à­‡à¬ª"/>
+<l:gentext key="table" text="ସାରଣୀ"/>
+<l:gentext key="Table" text="ସାରଣୀ"/>
+<l:gentext key="task" text="କାରà­à¬¯à­à­Ÿà¬¸à­‚ଚୀ"/>
+<l:gentext key="Task" text="କାରà­à¬¯à­à­Ÿà¬¸à­‚ଚୀ"/>
+<l:gentext key="tip" text="ସଂକେତ"/>
+<l:gentext key="TIP" text="ସଂକେତ"/>
+<l:gentext key="Tip" text="ସଂକେତ"/>
+<l:gentext key="Warning" text="ଚେତାବନୀ"/>
+<l:gentext key="warning" text="ଚେତାବନୀ"/>
+<l:gentext key="WARNING" text="ଚେତାବନୀ"/>
+<l:gentext key="and" text="ଓ"/>
+<l:gentext key="by" text="ଦà­à¬¬à¬¾à¬°à¬¾"/>
+<l:gentext key="Edited" text="ସମà­à¬ªà¬¾à¬¦à¬¿à¬¤"/>
+<l:gentext key="edited" text="ସମà­à¬ªà¬¾à¬¦à¬¿à¬¤"/>
+<l:gentext key="Editedby" text="ଦà­à¬¬à¬¾à¬°à¬¾ ସମà­à¬ªà¬¾à¬¦à¬¿à¬¤"/>
+<l:gentext key="editedby" text="ଦà­à¬¬à¬¾à¬°à¬¾ ସମà­à¬ªà¬¾à¬¦à¬¿à¬¤"/>
+<l:gentext key="in" text="ଭିତରେ"/>
+<l:gentext key="lastlistcomma" text=","/>
+<l:gentext key="listcomma" text=","/>
+<l:gentext key="notes" text="ଟୀକା"/>
+<l:gentext key="Notes" text="ଟୀକା"/>
+<l:gentext key="Pgs" text="ପୃଷà­à¬ à¬¾"/>
+<l:gentext key="pgs" text="ପୃଷà­à¬ à¬¾"/>
+<l:gentext key="Revisedby" text="ଦà­à¬¬à¬¾à¬°à¬¾ ସଂଶୋଧିତ: "/>
+<l:gentext key="revisedby" text="ଦà­à¬¬à¬¾à¬°à¬¾ ସଂଶୋଧିତ: "/>
+<l:gentext key="TableNotes" text="ଟୀକା"/>
+<l:gentext key="tablenotes" text="ଟୀକା"/>
+<l:gentext key="TableofContents" text="ସୂଚୀପତà­à¬°"/>
+<l:gentext key="tableofcontents" text="ସୂଚୀପତà­à¬°"/>
+<l:gentext key="unexpectedelementname" text="ଅପà­à¬°à¬¤à­à¬¯à¬¾à¬¶à¬¿à¬¤ ଉପାଦାନ ନାମ"/>
+<l:gentext key="unsupported" text="ଅସହାୟକ"/>
+<l:gentext key="xrefto" text="ସହିତ ପà­à¬°à¬¾à¬¸à¬™à­à¬—ିକ ସନà­à¬¦à¬°à­à¬­ କରନà­à¬¤à­"/>
+<l:gentext key="Authors" text="ଲେଖକ"/>
+<l:gentext key="copyeditor" text="ନକଲ ସମà­à¬ªà¬¾à¬¦à¬•"/>
+<l:gentext key="graphicdesigner" text="ଆଲେଖୀ ରଚନାକାରୀ"/>
+<l:gentext key="productioneditor" text="ଉତà­à¬ªà¬¾à¬¦à¬¨ ସମà­à¬ªà¬¾à¬¦à¬•"/>
+<l:gentext key="technicaleditor" text="ଯାନà­à¬¤à­à¬°à¬¿à¬• ସମà­à¬ªà¬¾à¬¦à¬•"/>
+<l:gentext key="translator" text="ଅନà­à¬¬à¬¾à¬¦à¬•"/>
+<l:gentext key="listofequations" text="ସମୀକରଣ ତାଲିକା"/>
+<l:gentext key="ListofEquations" text="ସମୀକରଣ ତାଲିକା"/>
+<l:gentext key="ListofExamples" text="ଉଦାହରଣ ତାଲିକା"/>
+<l:gentext key="listofexamples" text="ଉଦାହରଣ ତାଲିକା"/>
+<l:gentext key="ListofFigures" text="ଚିତà­à¬° ତାଲିକା"/>
+<l:gentext key="listoffigures" text="ଚିତà­à¬° ତାଲିକା"/>
+<l:gentext key="ListofProcedures" text="କାରà­à¬¯à­à¬¯à¬¬à¬¿à¬§à¬¿ ତାଲିକା"/>
+<l:gentext key="listofprocedures" text="କାରà­à¬¯à­à¬¯à¬¬à¬¿à¬§à¬¿ ତାଲିକା"/>
+<l:gentext key="listoftables" text="ସାରଣୀ ତାଲିକା"/>
+<l:gentext key="ListofTables" text="ସାରଣୀ ତାଲିକା"/>
+<l:gentext key="ListofUnknown" text="ଅଜଣାର ତାଲିକା"/>
+<l:gentext key="listofunknown" text="ଅଜଣାର ତାଲିକା"/>
+<l:gentext key="nav-home" text="ମୂଳ ସà­à¬¥à¬¾à¬¨"/>
+<l:gentext key="nav-next" text="ପରବରà­à¬¤à­à¬¤à­€"/>
+<l:gentext key="nav-next-sibling" text="ଦà­à¬°à­à¬¤ ଆଗକà­"/>
+<l:gentext key="nav-prev" text="ପୂରà­à¬¬"/>
+<l:gentext key="nav-prev-sibling" text="ଦà­à¬°à­à¬¤ ପଛକà­"/>
+<l:gentext key="nav-up" text="ଉପରକà­"/>
+<l:gentext key="nav-toc" text="ସୂଚୀପତà­à¬°"/>
+<l:gentext key="Draft" text="ଡà­à¬°à¬¾à¬«à­à¬Ÿ"/>
+<l:gentext key="above" text="ଉପରେ"/>
+<l:gentext key="below" text="ତଳେ"/>
+<l:gentext key="sectioncalled" text="à¬à¬¹à¬¿ ଅଂଶର ନାମ"/>
+<l:gentext key="index symbols" text="ପà­à¬°à¬¤à­€à¬•"/>
+<l:gentext key="writing-mode" text="lr-tb"/>
+<l:gentext key="lowercase.alpha" text="ଅଆଇଈଉଊଋà¬à¬à¬“ଔକଖଗଘଙଚଛଜà¬à¬žà¬Ÿà¬ à¬¡à¬¢à¬£à¬¤à¬¥à¬¦à¬§à¬¨à¬ªà¬«à¬¬à¬­à¬®à¬¯à­Ÿà¬°à¬²à¬³à­±à¬¶à¬·à¬¸à¬¹"/>
+<l:gentext key="uppercase.alpha" text="ଅଆଇଈଉଊଋà¬à¬à¬“ଔକଖଗଘଙଚଛଜà¬à¬žà¬Ÿà¬ à¬¡à¬¢à¬£à¬¤à¬¥à¬¦à¬§à¬¨à¬ªà¬«à¬¬à¬­à¬®à¬¯à­Ÿà¬°à¬²à¬³à­±à¬¶à¬·à¬¸à¬¹"/>
+<l:gentext key="normalize.sort.input" text="AaÀàÃáÂâÃãÄäÅåĀÄĂ㥹ÇǎǞǟǠǡǺǻȀÈȂȃȦȧḀá¸áºšáº áº¡áº¢áº£áº¤áº¥áº¦áº§áº¨áº©áºªáº«áº¬áº­áº®áº¯áº°áº±áº²áº³áº´áºµáº¶áº·BbÆ€ÆɓƂƃḂḃḄḅḆḇCcÇçĆćĈĉĊċČÄƇƈɕḈḉDdÄŽÄÄđƊɗƋƌDžDzȡɖḊḋḌá¸á¸Žá¸á¸á¸‘ḒḓEeÈèÉéÊêËëĒēĔĕĖėĘęĚěȄȅȆȇȨȩḔḕḖḗḘḙḚḛḜá¸áº¸áº¹áººáº»áº¼áº½áº¾áº¿á»€á»á»‚ểỄễỆệFfƑƒḞḟGgÄœÄĞğĠġĢģƓɠǤǥǦǧǴǵḠḡHhĤĥĦħȞȟɦḢḣḤḥḦḧḨḩḪḫẖIiÌìÃíÎîÃïĨĩĪīĬĭĮįİƗɨÇÇȈȉȊȋḬḭḮḯỈỉỊịJjĴĵǰÊKkĶķƘƙǨǩḰḱḲḳḴḵLlĹĺĻļĽľĿŀÅłƚLjȴɫɬɭḶḷḸḹḺḻḼḽMmɱḾḿṀá¹á¹‚ṃNnÑñŃńŅņŇňÆɲƞȠNjǸǹȵɳṄṅṆṇṈṉṊṋOoÒòÓóÔôÕõÖöØøŌÅÅŽÅÅőƟƠơǑǒǪǫǬǭǾǿȌÈÈŽÈȪȫȬȭȮȯȰȱṌá¹á¹Žá¹á¹á¹‘ṒṓỌá»á»Žá»á»á»‘ỒồỔổỖỗỘộỚớỜá»á»žá»Ÿá» á»¡á»¢á»£PpƤƥṔṕṖṗQqÊ RrŔŕŖŗŘřÈȑȒȓɼɽɾṘṙṚṛṜá¹á¹žá¹ŸSsŚśŜÅŞşŠšȘșʂṠṡṢṣṤṥṦṧṨṩTtŢţŤťŦŧƫƬƭƮʈȚțȶṪṫṬṭṮṯṰṱẗUuÙùÚúÛûÜüŨũŪūŬŭŮůŰűŲųƯưǓǔǕǖǗǘǙǚǛǜȔȕȖȗṲṳṴṵṶṷṸṹṺṻỤụỦủỨứỪừỬửỮữỰựVvƲʋṼṽṾṿWwŴŵẀáºáº‚ẃẄẅẆẇẈẉẘXxẊẋẌáºYyÃýÿŸŶŷƳƴȲȳẎáºáº™á»²á»³á»´á»µá»¶á»·á»¸á»¹ZzŹźŻżŽžƵƶȤȥÊÊ‘áºáº‘ẒẓẔẕẕ" lang="en"/>
+<l:gentext key="normalize.sort.output" text="AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBCCCCCCCCCCCCCCCCCDDDDDDDDDDDDDDDDDDDDDDDDEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEFFFFFFGGGGGGGGGGGGGGGGGGGGHHHHHHHHHHHHHHHHHHHHIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIJJJJJJKKKKKKKKKKKKKKLLLLLLLLLLLLLLLLLLLLLLLLLLMMMMMMMMMNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOPPPPPPPPQQQRRRRRRRRRRRRRRRRRRRRRRRSSSSSSSSSSSSSSSSSSSSSSSTTTTTTTTTTTTTTTTTTTTTTTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUVVVVVVVVWWWWWWWWWWWWWWWXXXXXXYYYYYYYYYYYYYYYYYYYYYYYZZZZZZZZZZZZZZZZZZZZZ" lang="en"/>
+<l:dingbat key="startquote" text="“"/>
+<l:dingbat key="endquote" text="â€"/>
+<l:dingbat key="nestedstartquote" text="‘"/>
+<l:dingbat key="nestedendquote" text="’"/>
+<l:dingbat key="singlestartquote" text="‘"/>
+<l:dingbat key="singleendquote" text="’"/>
+<l:dingbat key="bullet" text="•"/>
+<l:gentext key="hyphenation-character" text="-"/>
+<l:gentext key="hyphenation-push-character-count" text="2"/>
+<l:gentext key="hyphenation-remain-character-count" text="2"/>
+<l:context name="styles"><l:template name="person-name" text="ପà­à¬°à¬¥à¬®-ଶେଷ"/>
+</l:context>
+<l:context name="title"><l:template name="abstract" text="%t"/>
+<l:template name="acknowledgements" text="%t" lang="en"/>
+<l:template name="answer" text="%t"/>
+<l:template name="appendix" text="ପରିଶିଷà­à¬ Â %n. %t"/>
+<l:template name="article" text="%t"/>
+<l:template name="authorblurb" text="%t"/>
+<l:template name="bibliodiv" text="%t"/>
+<l:template name="biblioentry" text="%t"/>
+<l:template name="bibliography" text="%t"/>
+<l:template name="bibliolist" text="%t"/>
+<l:template name="bibliomixed" text="%t"/>
+<l:template name="bibliomset" text="%t"/>
+<l:template name="biblioset" text="%t"/>
+<l:template name="blockquote" text="%t"/>
+<l:template name="book" text="%t"/>
+<l:template name="calloutlist" text="%t"/>
+<l:template name="caution" text="%t"/>
+<l:template name="chapter" text="ଅଧà­à¬¯à¬¾à­ŸÂ %n. %t"/>
+<l:template name="colophon" text="%t"/>
+<l:template name="dedication" text="%t"/>
+<l:template name="equation" text="ସମୀକରଣ %n. %t"/>
+<l:template name="example" text="ଉଦାହରଣ %n. %t"/>
+<l:template name="figure" text="ଚିତà­à¬°Â %n. %t"/>
+<l:template name="foil" text="%t"/>
+<l:template name="foilgroup" text="%t"/>
+<l:template name="formalpara" text="%t"/>
+<l:template name="glossary" text="%t"/>
+<l:template name="glossdiv" text="%t"/>
+<l:template name="glosslist" text="%t"/>
+<l:template name="glossentry" text="%t"/>
+<l:template name="important" text="%t"/>
+<l:template name="index" text="%t"/>
+<l:template name="indexdiv" text="%t"/>
+<l:template name="itemizedlist" text="%t"/>
+<l:template name="legalnotice" text="%t"/>
+<l:template name="listitem" text=""/>
+<l:template name="lot" text="%t"/>
+<l:template name="msg" text="%t"/>
+<l:template name="msgexplan" text="%t"/>
+<l:template name="msgmain" text="%t"/>
+<l:template name="msgrel" text="%t"/>
+<l:template name="msgset" text="%t"/>
+<l:template name="msgsub" text="%t"/>
+<l:template name="note" text="%t"/>
+<l:template name="orderedlist" text="%t"/>
+<l:template name="part" text="ଭାଗ %n. %t"/>
+<l:template name="partintro" text="%t"/>
+<l:template name="preface" text="%t"/>
+<l:template name="procedure" text="%t"/>
+<l:template name="procedure.formal" text="କାରà­à¬¯à­à¬¯à¬¬à¬¿à¬§à¬¿Â %n. %t"/>
+<l:template name="productionset" text="%t"/>
+<l:template name="productionset.formal" text="ଉତà­à¬ªà¬¾à¬¦à¬¨Â %n"/>
+<l:template name="qandadiv" text="%t"/>
+<l:template name="qandaentry" text="%t"/>
+<l:template name="qandaset" text="%t"/>
+<l:template name="question" text="%t"/>
+<l:template name="refentry" text="%t"/>
+<l:template name="reference" text="%t"/>
+<l:template name="refsection" text="%t"/>
+<l:template name="refsect1" text="%t"/>
+<l:template name="refsect2" text="%t"/>
+<l:template name="refsect3" text="%t"/>
+<l:template name="refsynopsisdiv" text="%t"/>
+<l:template name="refsynopsisdivinfo" text="%t"/>
+<l:template name="segmentedlist" text="%t"/>
+<l:template name="set" text="%t"/>
+<l:template name="setindex" text="%t"/>
+<l:template name="sidebar" text="%t"/>
+<l:template name="step" text="%t"/>
+<l:template name="table" text="ସାରଣୀ %n. %t"/>
+<l:template name="task" text="%t"/>
+<l:template name="tasksummary" text="%t" lang="en"/>
+<l:template name="taskprerequisites" text="%t" lang="en"/>
+<l:template name="taskrelated" text="%t" lang="en"/>
+<l:template name="tip" text="%t"/>
+<l:template name="toc" text="%t"/>
+<l:template name="variablelist" text="%t"/>
+<l:template name="varlistentry" text=""/>
+<l:template name="warning" text="%t"/>
+</l:context>
+<l:context name="title-unnumbered"><l:template name="appendix" text="%t"/>
+<l:template name="article/appendix" text="%t"/>
+<l:template name="bridgehead" text="%t"/>
+<l:template name="chapter" text="%t"/>
+<l:template name="sect1" text="%t"/>
+<l:template name="sect2" text="%t"/>
+<l:template name="sect3" text="%t"/>
+<l:template name="sect4" text="%t"/>
+<l:template name="sect5" text="%t"/>
+<l:template name="section" text="%t"/>
+<l:template name="simplesect" text="%t"/>
+<l:template name="part" text="%t" lang="en"/>
+</l:context>
+<l:context name="title-numbered"><l:template name="appendix" text="ପରିଶିଷà­à¬ Â %n. %t"/>
+<l:template name="article/appendix" text="%n. %t"/>
+<l:template name="bridgehead" text="%n. %t"/>
+<l:template name="chapter" text="ଅଧà­à¬¯à¬¾à­ŸÂ %n. %t"/>
+<l:template name="part" text="ଭାଗ %n. %t"/>
+<l:template name="sect1" text="%n. %t"/>
+<l:template name="sect2" text="%n. %t"/>
+<l:template name="sect3" text="%n. %t"/>
+<l:template name="sect4" text="%n. %t"/>
+<l:template name="sect5" text="%n. %t"/>
+<l:template name="section" text="%n. %t"/>
+<l:template name="simplesect" text="%t"/>
+</l:context>
+<l:context name="subtitle"><l:template name="appendix" text="%s"/>
+<l:template name="acknowledgements" text="%s" lang="en"/>
+<l:template name="article" text="%s"/>
+<l:template name="bibliodiv" text="%s"/>
+<l:template name="biblioentry" text="%s"/>
+<l:template name="bibliography" text="%s"/>
+<l:template name="bibliomixed" text="%s"/>
+<l:template name="bibliomset" text="%s"/>
+<l:template name="biblioset" text="%s"/>
+<l:template name="book" text="%s"/>
+<l:template name="chapter" text="%s"/>
+<l:template name="colophon" text="%s"/>
+<l:template name="dedication" text="%s"/>
+<l:template name="glossary" text="%s"/>
+<l:template name="glossdiv" text="%s"/>
+<l:template name="index" text="%s"/>
+<l:template name="indexdiv" text="%s"/>
+<l:template name="lot" text="%s"/>
+<l:template name="part" text="%s"/>
+<l:template name="partintro" text="%s"/>
+<l:template name="preface" text="%s"/>
+<l:template name="refentry" text="%s"/>
+<l:template name="reference" text="%s"/>
+<l:template name="refsection" text="%s"/>
+<l:template name="refsect1" text="%s"/>
+<l:template name="refsect2" text="%s"/>
+<l:template name="refsect3" text="%s"/>
+<l:template name="refsynopsisdiv" text="%s"/>
+<l:template name="sect1" text="%s"/>
+<l:template name="sect2" text="%s"/>
+<l:template name="sect3" text="%s"/>
+<l:template name="sect4" text="%s"/>
+<l:template name="sect5" text="%s"/>
+<l:template name="section" text="%s"/>
+<l:template name="set" text="%s"/>
+<l:template name="setindex" text="%s"/>
+<l:template name="sidebar" text="%s"/>
+<l:template name="simplesect" text="%s"/>
+<l:template name="toc" text="%s"/>
+</l:context>
+<l:context name="xref"><l:template name="abstract" text="%t"/>
+<l:template name="acknowledgements" text="%t" lang="en"/>
+<l:template name="answer" text="ଉ: %n"/>
+<l:template name="appendix" text="%t"/>
+<l:template name="article" text="%t"/>
+<l:template name="authorblurb" text="%t"/>
+<l:template name="bibliodiv" text="%t"/>
+<l:template name="bibliography" text="%t"/>
+<l:template name="bibliomset" text="%t"/>
+<l:template name="biblioset" text="%t"/>
+<l:template name="blockquote" text="%t"/>
+<l:template name="book" text="%t"/>
+<l:template name="calloutlist" text="%t"/>
+<l:template name="caution" text="%t"/>
+<l:template name="chapter" text="%t"/>
+<l:template name="colophon" text="%t"/>
+<l:template name="constraintdef" text="%t"/>
+<l:template name="dedication" text="%t"/>
+<l:template name="equation" text="%t"/>
+<l:template name="example" text="%t"/>
+<l:template name="figure" text="%t"/>
+<l:template name="foil" text="%t"/>
+<l:template name="foilgroup" text="%t"/>
+<l:template name="formalpara" text="%t"/>
+<l:template name="glossary" text="%t"/>
+<l:template name="glossdiv" text="%t"/>
+<l:template name="important" text="%t"/>
+<l:template name="index" text="%t"/>
+<l:template name="indexdiv" text="%t"/>
+<l:template name="itemizedlist" text="%t"/>
+<l:template name="legalnotice" text="%t"/>
+<l:template name="listitem" text="%n"/>
+<l:template name="lot" text="%t"/>
+<l:template name="msg" text="%t"/>
+<l:template name="msgexplan" text="%t"/>
+<l:template name="msgmain" text="%t"/>
+<l:template name="msgrel" text="%t"/>
+<l:template name="msgset" text="%t"/>
+<l:template name="msgsub" text="%t"/>
+<l:template name="note" text="%t"/>
+<l:template name="orderedlist" text="%t"/>
+<l:template name="part" text="%t"/>
+<l:template name="partintro" text="%t"/>
+<l:template name="preface" text="%t"/>
+<l:template name="procedure" text="%t"/>
+<l:template name="productionset" text="%t"/>
+<l:template name="qandadiv" text="%t"/>
+<l:template name="qandaentry" text="ପà­à¬°: %n"/>
+<l:template name="qandaset" text="%t"/>
+<l:template name="question" text="ପà­à¬°: %n"/>
+<l:template name="reference" text="%t"/>
+<l:template name="refsynopsisdiv" text="%t"/>
+<l:template name="segmentedlist" text="%t"/>
+<l:template name="set" text="%t"/>
+<l:template name="setindex" text="%t"/>
+<l:template name="sidebar" text="%t"/>
+<l:template name="table" text="%t"/>
+<l:template name="task" text="%t" lang="en"/>
+<l:template name="tip" text="%t"/>
+<l:template name="toc" text="%t"/>
+<l:template name="variablelist" text="%t"/>
+<l:template name="varlistentry" text="%n"/>
+<l:template name="warning" text="%t"/>
+<l:template name="olink.document.citation" text="%oରେ"/>
+<l:template name="olink.page.citation" text=" (ପୃଷà­à¬ à¬¾ %p)"/>
+<l:template name="page.citation" text=" [%p]"/>
+<l:template name="page" text="(ପୃଷà­à¬ à¬¾ %p)"/>
+<l:template name="docname" text="%oରେ"/>
+<l:template name="docnamelong" text="%o ନାମକ ଦଲିଲରେ"/>
+<l:template name="pageabbrev" text="(ପୃ. %p)"/>
+<l:template name="Page" text="ପୃଷà­à¬ à¬¾ %p"/>
+<l:template name="bridgehead" text="à¬à¬¹à¬¿ ଅଂଶର ନାମ “%tâ€"/>
+<l:template name="refsection" text="à¬à¬¹à¬¿ ଅଂଶର ନାମ “%tâ€"/>
+<l:template name="refsect1" text="à¬à¬¹à¬¿ ଅଂଶର ନାମ “%tâ€"/>
+<l:template name="refsect2" text="à¬à¬¹à¬¿ ଅଂଶର ନାମ “%tâ€"/>
+<l:template name="refsect3" text="à¬à¬¹à¬¿ ଅଂଶର ନାମ “%tâ€"/>
+<l:template name="sect1" text="à¬à¬¹à¬¿ ଅଂଶର ନାମ “%tâ€"/>
+<l:template name="sect2" text="à¬à¬¹à¬¿ ଅଂଶର ନାମ “%tâ€"/>
+<l:template name="sect3" text="à¬à¬¹à¬¿ ଅଂଶର ନାମ “%tâ€"/>
+<l:template name="sect4" text="à¬à¬¹à¬¿ ଅଂଶର ନାମ “%tâ€"/>
+<l:template name="sect5" text="à¬à¬¹à¬¿ ଅଂଶର ନାମ “%tâ€"/>
+<l:template name="section" text="à¬à¬¹à¬¿ ଅଂଶର ନାମ “%tâ€"/>
+<l:template name="simplesect" text="à¬à¬¹à¬¿ ଅଂଶର ନାମ “%tâ€"/>
+</l:context>
+<l:context name="xref-number"><l:template name="answer" text="ଉ: %n"/>
+<l:template name="appendix" text="ପରିଶିଷà­à¬ Â %n"/>
+<l:template name="bridgehead" text="ଅଂଶ %n"/>
+<l:template name="chapter" text="ଅଧà­à¬¯à¬¾à­ŸÂ %n"/>
+<l:template name="equation" text="ସମୀକରଣ %n"/>
+<l:template name="example" text="ଉଦାହରଣ %n"/>
+<l:template name="figure" text="ଚିତà­à¬°Â %n"/>
+<l:template name="part" text="ଭାଗ %n"/>
+<l:template name="procedure" text="କାରà­à¬¯à­à¬¯à¬¬à¬¿à¬§à¬¿Â %n"/>
+<l:template name="productionset" text="ଉତà­à¬ªà¬¾à¬¦à¬¨Â %n"/>
+<l:template name="qandadiv" text="ପà­à¬° &amp; ଉ %n"/>
+<l:template name="qandaentry" text="ପà­à¬°: %n"/>
+<l:template name="question" text="ପà­à¬°: %n"/>
+<l:template name="sect1" text="ଅଂଶ %n"/>
+<l:template name="sect2" text="ଅଂଶ %n"/>
+<l:template name="sect3" text="ଅଂଶ %n"/>
+<l:template name="sect4" text="ଅଂଶ %n"/>
+<l:template name="sect5" text="ଅଂଶ %n"/>
+<l:template name="section" text="ଅଂଶ %n"/>
+<l:template name="table" text="ସାରଣୀ %n"/>
+</l:context>
+<l:context name="xref-number-and-title"><l:template name="appendix" text="ପରିଶିଷà­à¬ Â %n, %t"/>
+<l:template name="bridgehead" text="ଅଂଶ %n, “%tâ€"/>
+<l:template name="chapter" text="ଅଧà­à¬¯à¬¾à­ŸÂ %n, %t"/>
+<l:template name="equation" text="ସମୀକରଣ %n, “%tâ€"/>
+<l:template name="example" text="ଉଦାହରଣ %n, “%tâ€"/>
+<l:template name="figure" text="ଚିତà­à¬°Â %n, “%tâ€"/>
+<l:template name="part" text="ଭାଗ %n, “%tâ€"/>
+<l:template name="procedure" text="କାରà­à¬¯à­à¬¯à¬¬à¬¿à¬§à¬¿Â %n, “%tâ€"/>
+<l:template name="productionset" text="ଉତà­à¬ªà¬¾à¬¦à¬¨Â %n, “%tâ€"/>
+<l:template name="qandadiv" text="ପà­à¬° &amp; ଉ %n, “%tâ€"/>
+<l:template name="refsect1" text="à¬à¬¹à¬¿ ଅଂଶର ନାମ “%tâ€"/>
+<l:template name="refsect2" text="à¬à¬¹à¬¿ ଅଂଶର ନାମ “%tâ€"/>
+<l:template name="refsect3" text="à¬à¬¹à¬¿ ଅଂଶର ନାମ “%tâ€"/>
+<l:template name="refsection" text="à¬à¬¹à¬¿ ଅଂଶର ନାମ “%tâ€"/>
+<l:template name="sect1" text="ଅଂଶ %n, “%tâ€"/>
+<l:template name="sect2" text="ଅଂଶ %n, “%tâ€"/>
+<l:template name="sect3" text="ଅଂଶ %n, “%tâ€"/>
+<l:template name="sect4" text="ଅଂଶ %n, “%tâ€"/>
+<l:template name="sect5" text="ଅଂଶ %n, “%tâ€"/>
+<l:template name="section" text="ଅଂଶ %n, “%tâ€"/>
+<l:template name="simplesect" text="à¬à¬¹à¬¿ ଅଂଶର ନାମ “%tâ€"/>
+<l:template name="table" text="ସାରଣୀ %n, “%tâ€"/>
+</l:context>
+<l:context name="authorgroup"><l:template name="sep" text=", "/>
+<l:template name="sep2" text=" ଓ "/>
+<l:template name="seplast" text=", ଓ "/>
+</l:context>
+<l:context name="glossary"><l:template name="see" text="ଦେଖନà­à¬¤à­ %t."/>
+<l:template name="seealso" text="à¬à¬¹à¬¾ ଭି ଦେଖନà­à¬¤à­ %t."/>
+<l:template name="seealso-separator" text=", "/>
+</l:context>
+<l:context name="msgset"><l:template name="MsgAud" text="ଶà­à¬°à­‹à¬¤à­ƒà¬¬à¬°à­à¬—: "/>
+<l:template name="MsgLevel" text="ସà­à¬¤à¬°: "/>
+<l:template name="MsgOrig" text="ଉତà­à¬ªà¬¤à­à¬¤à¬¿: "/>
+</l:context>
+<l:context name="datetime"><l:template name="format" text="ମାସ/ଦିନ/ବରà­à¬·"/>
+</l:context>
+<l:context name="termdef"><l:template name="prefix" text="[ବà­à¬¯à¬¾à¬–à­à¬¯à¬¾: "/>
+<l:template name="suffix" text="]"/>
+</l:context>
+<l:context name="datetime-full"><l:template name="January" text="ଜାନà­à¬†à¬°à¬¿"/>
+<l:template name="February" text="ଫେବà­à¬°à­à¬†à¬°à¬¿"/>
+<l:template name="March" text="ମାରà­à¬šà­à¬š"/>
+<l:template name="April" text="à¬à¬ªà­à¬°à¬¿à¬²"/>
+<l:template name="May" text="ମେ"/>
+<l:template name="June" text="ଜà­à¬¨"/>
+<l:template name="July" text="ଜà­à¬²à¬¾à¬‡"/>
+<l:template name="August" text="ଅଗଷà­à¬Ÿ"/>
+<l:template name="September" text="ସେପà­à¬Ÿà­‡à¬®à­à¬¬à¬°"/>
+<l:template name="October" text="ଅକà­à¬Ÿà­‹à¬¬à¬°"/>
+<l:template name="November" text="ନଭେମà­à¬¬à¬°"/>
+<l:template name="December" text="ଡିସେମà­à¬¬à¬°"/>
+<l:template name="Monday" text="ସୋମବାର"/>
+<l:template name="Tuesday" text="ମଙà­à¬—ଳବାର"/>
+<l:template name="Wednesday" text="ବà­à¬§à¬¬à¬¾à¬°"/>
+<l:template name="Thursday" text="ଗà­à¬°à­à¬¬à¬¾à¬°"/>
+<l:template name="Friday" text="ଶà­à¬•à­à¬°à¬¬à¬¾à¬°"/>
+<l:template name="Saturday" text="ଶନିବାର"/>
+<l:template name="Sunday" text="ରବିବାର"/>
+</l:context>
+<l:context name="datetime-abbrev"><l:template name="Jan" text="ଜାନ"/>
+<l:template name="Feb" text="ଫେବ"/>
+<l:template name="Mar" text="ମାର"/>
+<l:template name="Apr" text="à¬à¬ªà­à¬°"/>
+<l:template name="May" text="ମେ"/>
+<l:template name="Jun" text="ଜà­à¬¨"/>
+<l:template name="Jul" text="ଜà­à¬²"/>
+<l:template name="Aug" text="ଅଗ"/>
+<l:template name="Sep" text="ସେପ"/>
+<l:template name="Oct" text="ଅକà­à¬Ÿ"/>
+<l:template name="Nov" text="ନଭ"/>
+<l:template name="Dec" text="ଡିସ"/>
+<l:template name="Mon" text="ସୋମ"/>
+<l:template name="Tue" text="ମଂଗଳ"/>
+<l:template name="Wed" text="ବà­à¬§"/>
+<l:template name="Thu" text="ଗà­à¬°à­"/>
+<l:template name="Fri" text="ଶà­à¬•à­à¬°"/>
+<l:template name="Sat" text="ଶନି"/>
+<l:template name="Sun" text="ରବି"/>
+</l:context>
+<l:context name="htmlhelp"><l:template name="langcode" text="0x0448 Oriya"/>
+</l:context>
+<l:context name="index"><l:template name="term-separator" text=", " lang="en"/>
+<l:template name="number-separator" text=", " lang="en"/>
+<l:template name="range-separator" text="-" lang="en"/>
+</l:context>
+<l:context name="iso690"><l:template name="lastfirst.sep" text=", " lang="en"/>
+<l:template name="alt.person.two.sep" text=" – " lang="en"/>
+<l:template name="alt.person.last.sep" text=" – " lang="en"/>
+<l:template name="alt.person.more.sep" text=" – " lang="en"/>
+<l:template name="primary.editor" text=" (ed.)" lang="en"/>
+<l:template name="primary.many" text=", et al." lang="en"/>
+<l:template name="primary.sep" text=". " lang="en"/>
+<l:template name="submaintitle.sep" text=": " lang="en"/>
+<l:template name="title.sep" text=". " lang="en"/>
+<l:template name="othertitle.sep" text=", " lang="en"/>
+<l:template name="medium1" text=" [" lang="en"/>
+<l:template name="medium2" text="]" lang="en"/>
+<l:template name="secondary.person.sep" text="; " lang="en"/>
+<l:template name="secondary.sep" text=". " lang="en"/>
+<l:template name="respons.sep" text=". " lang="en"/>
+<l:template name="edition.sep" text=". " lang="en"/>
+<l:template name="edition.serial.sep" text=", " lang="en"/>
+<l:template name="issuing.range" text="-" lang="en"/>
+<l:template name="issuing.div" text=", " lang="en"/>
+<l:template name="issuing.sep" text=". " lang="en"/>
+<l:template name="partnr.sep" text=". " lang="en"/>
+<l:template name="placepubl.sep" text=": " lang="en"/>
+<l:template name="publyear.sep" text=", " lang="en"/>
+<l:template name="pubinfo.sep" text=". " lang="en"/>
+<l:template name="spec.pubinfo.sep" text=", " lang="en"/>
+<l:template name="upd.sep" text=", " lang="en"/>
+<l:template name="datecit1" text=" [cited " lang="en"/>
+<l:template name="datecit2" text="]" lang="en"/>
+<l:template name="extent.sep" text=". " lang="en"/>
+<l:template name="locs.sep" text=", " lang="en"/>
+<l:template name="location.sep" text=". " lang="en"/>
+<l:template name="serie.sep" text=". " lang="en"/>
+<l:template name="notice.sep" text=". " lang="en"/>
+<l:template name="access" text="Available " lang="en"/>
+<l:template name="acctoo" text="Also available " lang="en"/>
+<l:template name="onwww" text="from World Wide Web" lang="en"/>
+<l:template name="oninet" text="from Internet" lang="en"/>
+<l:template name="access.end" text=": " lang="en"/>
+<l:template name="link1" text="&lt;" lang="en"/>
+<l:template name="link2" text="&gt;" lang="en"/>
+<l:template name="access.sep" text=". " lang="en"/>
+<l:template name="isbn" text="ISBN " lang="en"/>
+<l:template name="issn" text="ISSN " lang="en"/>
+<l:template name="stdnum.sep" text=". " lang="en"/>
+<l:template name="patcountry.sep" text=". " lang="en"/>
+<l:template name="pattype.sep" text=", " lang="en"/>
+<l:template name="patnum.sep" text=". " lang="en"/>
+<l:template name="patdate.sep" text=". " lang="en"/>
+</l:context><l:letters><l:l i="-1"/>
+<l:l i="0">ପà­à¬°à¬¤à­€à¬•</l:l>
+<l:l i="10">A</l:l>
+<l:l i="10">a</l:l>
+<l:l i="10">À</l:l>
+<l:l i="10">à</l:l>
+<l:l i="10">Ã</l:l>
+<l:l i="10">á</l:l>
+<l:l i="10">Â</l:l>
+<l:l i="10">â</l:l>
+<l:l i="10">Ã</l:l>
+<l:l i="10">ã</l:l>
+<l:l i="10">Ä</l:l>
+<l:l i="10">ä</l:l>
+<l:l i="10">Ã…</l:l>
+<l:l i="10">Ã¥</l:l>
+<l:l i="10">Ä€</l:l>
+<l:l i="10">Ä</l:l>
+<l:l i="10">Ä‚</l:l>
+<l:l i="10">ă</l:l>
+<l:l i="10">Ä„</l:l>
+<l:l i="10">Ä…</l:l>
+<l:l i="10">Ç</l:l>
+<l:l i="10">ÇŽ</l:l>
+<l:l i="10">Çž</l:l>
+<l:l i="10">ÇŸ</l:l>
+<l:l i="10">Ç </l:l>
+<l:l i="10">Ç¡</l:l>
+<l:l i="10">Ǻ</l:l>
+<l:l i="10">Ç»</l:l>
+<l:l i="10">È€</l:l>
+<l:l i="10">È</l:l>
+<l:l i="10">È‚</l:l>
+<l:l i="10">ȃ</l:l>
+<l:l i="10">Ȧ</l:l>
+<l:l i="10">ȧ</l:l>
+<l:l i="10">Ḁ</l:l>
+<l:l i="10">á¸</l:l>
+<l:l i="10">ẚ</l:l>
+<l:l i="10">Ạ</l:l>
+<l:l i="10">ạ</l:l>
+<l:l i="10">Ả</l:l>
+<l:l i="10">ả</l:l>
+<l:l i="10">Ấ</l:l>
+<l:l i="10">ấ</l:l>
+<l:l i="10">Ầ</l:l>
+<l:l i="10">ầ</l:l>
+<l:l i="10">Ẩ</l:l>
+<l:l i="10">ẩ</l:l>
+<l:l i="10">Ẫ</l:l>
+<l:l i="10">ẫ</l:l>
+<l:l i="10">Ậ</l:l>
+<l:l i="10">ậ</l:l>
+<l:l i="10">Ắ</l:l>
+<l:l i="10">ắ</l:l>
+<l:l i="10">Ằ</l:l>
+<l:l i="10">ằ</l:l>
+<l:l i="10">Ẳ</l:l>
+<l:l i="10">ẳ</l:l>
+<l:l i="10">Ẵ</l:l>
+<l:l i="10">ẵ</l:l>
+<l:l i="10">Ặ</l:l>
+<l:l i="10">ặ</l:l>
+<l:l i="20">B</l:l>
+<l:l i="20">b</l:l>
+<l:l i="20">Æ€</l:l>
+<l:l i="20">Æ</l:l>
+<l:l i="20">É“</l:l>
+<l:l i="20">Æ‚</l:l>
+<l:l i="20">ƃ</l:l>
+<l:l i="20">Ḃ</l:l>
+<l:l i="20">ḃ</l:l>
+<l:l i="20">Ḅ</l:l>
+<l:l i="20">ḅ</l:l>
+<l:l i="20">Ḇ</l:l>
+<l:l i="20">ḇ</l:l>
+<l:l i="30">C</l:l>
+<l:l i="30">c</l:l>
+<l:l i="30">Ç</l:l>
+<l:l i="30">ç</l:l>
+<l:l i="30">Ć</l:l>
+<l:l i="30">ć</l:l>
+<l:l i="30">Ĉ</l:l>
+<l:l i="30">ĉ</l:l>
+<l:l i="30">ÄŠ</l:l>
+<l:l i="30">Ä‹</l:l>
+<l:l i="30">Č</l:l>
+<l:l i="30">Ä</l:l>
+<l:l i="30">Ƈ</l:l>
+<l:l i="30">ƈ</l:l>
+<l:l i="30">É•</l:l>
+<l:l i="30">Ḉ</l:l>
+<l:l i="30">ḉ</l:l>
+<l:l i="40">D</l:l>
+<l:l i="40">d</l:l>
+<l:l i="40">ÄŽ</l:l>
+<l:l i="40">Ä</l:l>
+<l:l i="40">Ä</l:l>
+<l:l i="40">Ä‘</l:l>
+<l:l i="40">ÆŠ</l:l>
+<l:l i="40">É—</l:l>
+<l:l i="40">Æ‹</l:l>
+<l:l i="40">ƌ</l:l>
+<l:l i="40">Ç…</l:l>
+<l:l i="40">Dz</l:l>
+<l:l i="40">È¡</l:l>
+<l:l i="40">É–</l:l>
+<l:l i="40">Ḋ</l:l>
+<l:l i="40">ḋ</l:l>
+<l:l i="40">Ḍ</l:l>
+<l:l i="40">á¸</l:l>
+<l:l i="40">Ḏ</l:l>
+<l:l i="40">á¸</l:l>
+<l:l i="40">á¸</l:l>
+<l:l i="40">ḑ</l:l>
+<l:l i="40">Ḓ</l:l>
+<l:l i="40">ḓ</l:l>
+<l:l i="50">E</l:l>
+<l:l i="50">e</l:l>
+<l:l i="50">È</l:l>
+<l:l i="50">è</l:l>
+<l:l i="50">É</l:l>
+<l:l i="50">é</l:l>
+<l:l i="50">Ê</l:l>
+<l:l i="50">ê</l:l>
+<l:l i="50">Ë</l:l>
+<l:l i="50">ë</l:l>
+<l:l i="50">Ä’</l:l>
+<l:l i="50">Ä“</l:l>
+<l:l i="50">Ä”</l:l>
+<l:l i="50">Ä•</l:l>
+<l:l i="50">Ä–</l:l>
+<l:l i="50">Ä—</l:l>
+<l:l i="50">Ę</l:l>
+<l:l i="50">Ä™</l:l>
+<l:l i="50">Äš</l:l>
+<l:l i="50">Ä›</l:l>
+<l:l i="50">È„</l:l>
+<l:l i="50">È…</l:l>
+<l:l i="50">Ȇ</l:l>
+<l:l i="50">ȇ</l:l>
+<l:l i="50">Ȩ</l:l>
+<l:l i="50">È©</l:l>
+<l:l i="50">Ḕ</l:l>
+<l:l i="50">ḕ</l:l>
+<l:l i="50">Ḗ</l:l>
+<l:l i="50">ḗ</l:l>
+<l:l i="50">Ḙ</l:l>
+<l:l i="50">ḙ</l:l>
+<l:l i="50">Ḛ</l:l>
+<l:l i="50">ḛ</l:l>
+<l:l i="50">Ḝ</l:l>
+<l:l i="50">á¸</l:l>
+<l:l i="50">Ẹ</l:l>
+<l:l i="50">ẹ</l:l>
+<l:l i="50">Ẻ</l:l>
+<l:l i="50">ẻ</l:l>
+<l:l i="50">Ẽ</l:l>
+<l:l i="50">ẽ</l:l>
+<l:l i="50">Ế</l:l>
+<l:l i="50">ế</l:l>
+<l:l i="50">Ề</l:l>
+<l:l i="50">á»</l:l>
+<l:l i="50">Ể</l:l>
+<l:l i="50">ể</l:l>
+<l:l i="50">Ễ</l:l>
+<l:l i="50">á»…</l:l>
+<l:l i="50">Ệ</l:l>
+<l:l i="50">ệ</l:l>
+<l:l i="60">F</l:l>
+<l:l i="60">f</l:l>
+<l:l i="60">Æ‘</l:l>
+<l:l i="60">Æ’</l:l>
+<l:l i="60">Ḟ</l:l>
+<l:l i="60">ḟ</l:l>
+<l:l i="70">G</l:l>
+<l:l i="70">g</l:l>
+<l:l i="70">Ĝ</l:l>
+<l:l i="70">Ä</l:l>
+<l:l i="70">Äž</l:l>
+<l:l i="70">ÄŸ</l:l>
+<l:l i="70">Ä </l:l>
+<l:l i="70">Ä¡</l:l>
+<l:l i="70">Ä¢</l:l>
+<l:l i="70">Ä£</l:l>
+<l:l i="70">Æ“</l:l>
+<l:l i="70">É </l:l>
+<l:l i="70">Ǥ</l:l>
+<l:l i="70">Ç¥</l:l>
+<l:l i="70">Ǧ</l:l>
+<l:l i="70">ǧ</l:l>
+<l:l i="70">Ç´</l:l>
+<l:l i="70">ǵ</l:l>
+<l:l i="70">Ḡ</l:l>
+<l:l i="70">ḡ</l:l>
+<l:l i="80">H</l:l>
+<l:l i="80">h</l:l>
+<l:l i="80">Ĥ</l:l>
+<l:l i="80">Ä¥</l:l>
+<l:l i="80">Ħ</l:l>
+<l:l i="80">ħ</l:l>
+<l:l i="80">Èž</l:l>
+<l:l i="80">ÈŸ</l:l>
+<l:l i="80">ɦ</l:l>
+<l:l i="80">Ḣ</l:l>
+<l:l i="80">ḣ</l:l>
+<l:l i="80">Ḥ</l:l>
+<l:l i="80">ḥ</l:l>
+<l:l i="80">Ḧ</l:l>
+<l:l i="80">ḧ</l:l>
+<l:l i="80">Ḩ</l:l>
+<l:l i="80">ḩ</l:l>
+<l:l i="80">Ḫ</l:l>
+<l:l i="80">ḫ</l:l>
+<l:l i="80">ẖ</l:l>
+<l:l i="90">I</l:l>
+<l:l i="90">i</l:l>
+<l:l i="90">Ì</l:l>
+<l:l i="90">ì</l:l>
+<l:l i="90">Ã</l:l>
+<l:l i="90">í</l:l>
+<l:l i="90">ÃŽ</l:l>
+<l:l i="90">î</l:l>
+<l:l i="90">Ã</l:l>
+<l:l i="90">ï</l:l>
+<l:l i="90">Ĩ</l:l>
+<l:l i="90">Ä©</l:l>
+<l:l i="90">Ī</l:l>
+<l:l i="90">Ä«</l:l>
+<l:l i="90">Ĭ</l:l>
+<l:l i="90">Ä­</l:l>
+<l:l i="90">Ä®</l:l>
+<l:l i="90">į</l:l>
+<l:l i="90">Ä°</l:l>
+<l:l i="90">Æ—</l:l>
+<l:l i="90">ɨ</l:l>
+<l:l i="90">Ç</l:l>
+<l:l i="90">Ç</l:l>
+<l:l i="90">Ȉ</l:l>
+<l:l i="90">ȉ</l:l>
+<l:l i="90">ÈŠ</l:l>
+<l:l i="90">È‹</l:l>
+<l:l i="90">Ḭ</l:l>
+<l:l i="90">ḭ</l:l>
+<l:l i="90">Ḯ</l:l>
+<l:l i="90">ḯ</l:l>
+<l:l i="90">Ỉ</l:l>
+<l:l i="90">ỉ</l:l>
+<l:l i="90">Ị</l:l>
+<l:l i="90">ị</l:l>
+<l:l i="100">J</l:l>
+<l:l i="100">j</l:l>
+<l:l i="100">Ä´</l:l>
+<l:l i="100">ĵ</l:l>
+<l:l i="100">Ç°</l:l>
+<l:l i="100">Ê</l:l>
+<l:l i="110">K</l:l>
+<l:l i="110">k</l:l>
+<l:l i="110">Ķ</l:l>
+<l:l i="110">Ä·</l:l>
+<l:l i="110">Ƙ</l:l>
+<l:l i="110">Æ™</l:l>
+<l:l i="110">Ǩ</l:l>
+<l:l i="110">Ç©</l:l>
+<l:l i="110">Ḱ</l:l>
+<l:l i="110">ḱ</l:l>
+<l:l i="110">Ḳ</l:l>
+<l:l i="110">ḳ</l:l>
+<l:l i="110">Ḵ</l:l>
+<l:l i="110">ḵ</l:l>
+<l:l i="120">L</l:l>
+<l:l i="120">l</l:l>
+<l:l i="120">Ĺ</l:l>
+<l:l i="120">ĺ</l:l>
+<l:l i="120">Ä»</l:l>
+<l:l i="120">ļ</l:l>
+<l:l i="120">Ľ</l:l>
+<l:l i="120">ľ</l:l>
+<l:l i="120">Ä¿</l:l>
+<l:l i="120">Å€</l:l>
+<l:l i="120">Å</l:l>
+<l:l i="120">Å‚</l:l>
+<l:l i="120">Æš</l:l>
+<l:l i="120">Lj</l:l>
+<l:l i="120">È´</l:l>
+<l:l i="120">É«</l:l>
+<l:l i="120">ɬ</l:l>
+<l:l i="120">É­</l:l>
+<l:l i="120">Ḷ</l:l>
+<l:l i="120">ḷ</l:l>
+<l:l i="120">Ḹ</l:l>
+<l:l i="120">ḹ</l:l>
+<l:l i="120">Ḻ</l:l>
+<l:l i="120">ḻ</l:l>
+<l:l i="120">Ḽ</l:l>
+<l:l i="120">ḽ</l:l>
+<l:l i="130">M</l:l>
+<l:l i="130">m</l:l>
+<l:l i="130">ɱ</l:l>
+<l:l i="130">Ḿ</l:l>
+<l:l i="130">ḿ</l:l>
+<l:l i="130">á¹€</l:l>
+<l:l i="130">á¹</l:l>
+<l:l i="130">Ṃ</l:l>
+<l:l i="130">ṃ</l:l>
+<l:l i="140">N</l:l>
+<l:l i="140">n</l:l>
+<l:l i="140">Ñ</l:l>
+<l:l i="140">ñ</l:l>
+<l:l i="140">Ń</l:l>
+<l:l i="140">Å„</l:l>
+<l:l i="140">Å…</l:l>
+<l:l i="140">ņ</l:l>
+<l:l i="140">Ň</l:l>
+<l:l i="140">ň</l:l>
+<l:l i="140">Æ</l:l>
+<l:l i="140">ɲ</l:l>
+<l:l i="140">Æž</l:l>
+<l:l i="140">È </l:l>
+<l:l i="140">Ç‹</l:l>
+<l:l i="140">Ǹ</l:l>
+<l:l i="140">ǹ</l:l>
+<l:l i="140">ȵ</l:l>
+<l:l i="140">ɳ</l:l>
+<l:l i="140">Ṅ</l:l>
+<l:l i="140">á¹…</l:l>
+<l:l i="140">Ṇ</l:l>
+<l:l i="140">ṇ</l:l>
+<l:l i="140">Ṉ</l:l>
+<l:l i="140">ṉ</l:l>
+<l:l i="140">Ṋ</l:l>
+<l:l i="140">ṋ</l:l>
+<l:l i="150">O</l:l>
+<l:l i="150">o</l:l>
+<l:l i="150">Ã’</l:l>
+<l:l i="150">ò</l:l>
+<l:l i="150">Ó</l:l>
+<l:l i="150">ó</l:l>
+<l:l i="150">Ô</l:l>
+<l:l i="150">ô</l:l>
+<l:l i="150">Õ</l:l>
+<l:l i="150">õ</l:l>
+<l:l i="150">Ö</l:l>
+<l:l i="150">ö</l:l>
+<l:l i="150">Ø</l:l>
+<l:l i="150">ø</l:l>
+<l:l i="150">Ō</l:l>
+<l:l i="150">Å</l:l>
+<l:l i="150">ÅŽ</l:l>
+<l:l i="150">Å</l:l>
+<l:l i="150">Å</l:l>
+<l:l i="150">Å‘</l:l>
+<l:l i="150">ÆŸ</l:l>
+<l:l i="150">Æ </l:l>
+<l:l i="150">Æ¡</l:l>
+<l:l i="150">Ç‘</l:l>
+<l:l i="150">Ç’</l:l>
+<l:l i="150">Ǫ</l:l>
+<l:l i="150">Ç«</l:l>
+<l:l i="150">Ǭ</l:l>
+<l:l i="150">Ç­</l:l>
+<l:l i="150">Ǿ</l:l>
+<l:l i="150">Ç¿</l:l>
+<l:l i="150">Ȍ</l:l>
+<l:l i="150">È</l:l>
+<l:l i="150">ÈŽ</l:l>
+<l:l i="150">È</l:l>
+<l:l i="150">Ȫ</l:l>
+<l:l i="150">È«</l:l>
+<l:l i="150">Ȭ</l:l>
+<l:l i="150">È­</l:l>
+<l:l i="150">È®</l:l>
+<l:l i="150">ȯ</l:l>
+<l:l i="150">È°</l:l>
+<l:l i="150">ȱ</l:l>
+<l:l i="150">Ṍ</l:l>
+<l:l i="150">á¹</l:l>
+<l:l i="150">Ṏ</l:l>
+<l:l i="150">á¹</l:l>
+<l:l i="150">á¹</l:l>
+<l:l i="150">ṑ</l:l>
+<l:l i="150">á¹’</l:l>
+<l:l i="150">ṓ</l:l>
+<l:l i="150">Ọ</l:l>
+<l:l i="150">á»</l:l>
+<l:l i="150">Ỏ</l:l>
+<l:l i="150">á»</l:l>
+<l:l i="150">á»</l:l>
+<l:l i="150">ố</l:l>
+<l:l i="150">á»’</l:l>
+<l:l i="150">ồ</l:l>
+<l:l i="150">á»”</l:l>
+<l:l i="150">ổ</l:l>
+<l:l i="150">á»–</l:l>
+<l:l i="150">á»—</l:l>
+<l:l i="150">Ộ</l:l>
+<l:l i="150">á»™</l:l>
+<l:l i="150">Ớ</l:l>
+<l:l i="150">á»›</l:l>
+<l:l i="150">Ờ</l:l>
+<l:l i="150">á»</l:l>
+<l:l i="150">Ở</l:l>
+<l:l i="150">ở</l:l>
+<l:l i="150">á» </l:l>
+<l:l i="150">ỡ</l:l>
+<l:l i="150">Ợ</l:l>
+<l:l i="150">ợ</l:l>
+<l:l i="160">P</l:l>
+<l:l i="160">p</l:l>
+<l:l i="160">Ƥ</l:l>
+<l:l i="160">Æ¥</l:l>
+<l:l i="160">á¹”</l:l>
+<l:l i="160">ṕ</l:l>
+<l:l i="160">á¹–</l:l>
+<l:l i="160">á¹—</l:l>
+<l:l i="170">Q</l:l>
+<l:l i="170">q</l:l>
+<l:l i="170">Ê </l:l>
+<l:l i="180">R</l:l>
+<l:l i="180">r</l:l>
+<l:l i="180">Å”</l:l>
+<l:l i="180">Å•</l:l>
+<l:l i="180">Å–</l:l>
+<l:l i="180">Å—</l:l>
+<l:l i="180">Ř</l:l>
+<l:l i="180">Å™</l:l>
+<l:l i="180">È</l:l>
+<l:l i="180">È‘</l:l>
+<l:l i="180">È’</l:l>
+<l:l i="180">È“</l:l>
+<l:l i="180">ɼ</l:l>
+<l:l i="180">ɽ</l:l>
+<l:l i="180">ɾ</l:l>
+<l:l i="180">Ṙ</l:l>
+<l:l i="180">á¹™</l:l>
+<l:l i="180">Ṛ</l:l>
+<l:l i="180">á¹›</l:l>
+<l:l i="180">Ṝ</l:l>
+<l:l i="180">á¹</l:l>
+<l:l i="180">Ṟ</l:l>
+<l:l i="180">ṟ</l:l>
+<l:l i="190">S</l:l>
+<l:l i="190">s</l:l>
+<l:l i="190">Åš</l:l>
+<l:l i="190">Å›</l:l>
+<l:l i="190">Ŝ</l:l>
+<l:l i="190">Å</l:l>
+<l:l i="190">Åž</l:l>
+<l:l i="190">ÅŸ</l:l>
+<l:l i="190">Å </l:l>
+<l:l i="190">Å¡</l:l>
+<l:l i="190">Ș</l:l>
+<l:l i="190">È™</l:l>
+<l:l i="190">Ê‚</l:l>
+<l:l i="190">á¹ </l:l>
+<l:l i="190">ṡ</l:l>
+<l:l i="190">á¹¢</l:l>
+<l:l i="190">á¹£</l:l>
+<l:l i="190">Ṥ</l:l>
+<l:l i="190">á¹¥</l:l>
+<l:l i="190">Ṧ</l:l>
+<l:l i="190">ṧ</l:l>
+<l:l i="190">Ṩ</l:l>
+<l:l i="190">ṩ</l:l>
+<l:l i="200">T</l:l>
+<l:l i="200">t</l:l>
+<l:l i="200">Å¢</l:l>
+<l:l i="200">Å£</l:l>
+<l:l i="200">Ť</l:l>
+<l:l i="200">Å¥</l:l>
+<l:l i="200">Ŧ</l:l>
+<l:l i="200">ŧ</l:l>
+<l:l i="200">Æ«</l:l>
+<l:l i="200">Ƭ</l:l>
+<l:l i="200">Æ­</l:l>
+<l:l i="200">Æ®</l:l>
+<l:l i="200">ʈ</l:l>
+<l:l i="200">Èš</l:l>
+<l:l i="200">È›</l:l>
+<l:l i="200">ȶ</l:l>
+<l:l i="200">Ṫ</l:l>
+<l:l i="200">ṫ</l:l>
+<l:l i="200">Ṭ</l:l>
+<l:l i="200">á¹­</l:l>
+<l:l i="200">á¹®</l:l>
+<l:l i="200">ṯ</l:l>
+<l:l i="200">á¹°</l:l>
+<l:l i="200">á¹±</l:l>
+<l:l i="200">ẗ</l:l>
+<l:l i="210">U</l:l>
+<l:l i="210">u</l:l>
+<l:l i="210">Ù</l:l>
+<l:l i="210">ù</l:l>
+<l:l i="210">Ú</l:l>
+<l:l i="210">ú</l:l>
+<l:l i="210">Û</l:l>
+<l:l i="210">û</l:l>
+<l:l i="210">Ü</l:l>
+<l:l i="210">ü</l:l>
+<l:l i="210">Ũ</l:l>
+<l:l i="210">Å©</l:l>
+<l:l i="210">Ū</l:l>
+<l:l i="210">Å«</l:l>
+<l:l i="210">Ŭ</l:l>
+<l:l i="210">Å­</l:l>
+<l:l i="210">Å®</l:l>
+<l:l i="210">ů</l:l>
+<l:l i="210">Å°</l:l>
+<l:l i="210">ű</l:l>
+<l:l i="210">Ų</l:l>
+<l:l i="210">ų</l:l>
+<l:l i="210">Ư</l:l>
+<l:l i="210">Æ°</l:l>
+<l:l i="210">Ç“</l:l>
+<l:l i="210">Ç”</l:l>
+<l:l i="210">Ç•</l:l>
+<l:l i="210">Ç–</l:l>
+<l:l i="210">Ç—</l:l>
+<l:l i="210">ǘ</l:l>
+<l:l i="210">Ç™</l:l>
+<l:l i="210">Çš</l:l>
+<l:l i="210">Ç›</l:l>
+<l:l i="210">ǜ</l:l>
+<l:l i="210">È”</l:l>
+<l:l i="210">È•</l:l>
+<l:l i="210">È–</l:l>
+<l:l i="210">È—</l:l>
+<l:l i="210">á¹²</l:l>
+<l:l i="210">á¹³</l:l>
+<l:l i="210">á¹´</l:l>
+<l:l i="210">á¹µ</l:l>
+<l:l i="210">Ṷ</l:l>
+<l:l i="210">á¹·</l:l>
+<l:l i="210">Ṹ</l:l>
+<l:l i="210">á¹¹</l:l>
+<l:l i="210">Ṻ</l:l>
+<l:l i="210">á¹»</l:l>
+<l:l i="210">Ụ</l:l>
+<l:l i="210">ụ</l:l>
+<l:l i="210">Ủ</l:l>
+<l:l i="210">ủ</l:l>
+<l:l i="210">Ứ</l:l>
+<l:l i="210">ứ</l:l>
+<l:l i="210">Ừ</l:l>
+<l:l i="210">ừ</l:l>
+<l:l i="210">Ử</l:l>
+<l:l i="210">á»­</l:l>
+<l:l i="210">á»®</l:l>
+<l:l i="210">ữ</l:l>
+<l:l i="210">á»°</l:l>
+<l:l i="210">á»±</l:l>
+<l:l i="220">V</l:l>
+<l:l i="220">v</l:l>
+<l:l i="220">Ʋ</l:l>
+<l:l i="220">Ê‹</l:l>
+<l:l i="220">á¹¼</l:l>
+<l:l i="220">á¹½</l:l>
+<l:l i="220">á¹¾</l:l>
+<l:l i="220">ṿ</l:l>
+<l:l i="230">W</l:l>
+<l:l i="230">w</l:l>
+<l:l i="230">Å´</l:l>
+<l:l i="230">ŵ</l:l>
+<l:l i="230">Ẁ</l:l>
+<l:l i="230">áº</l:l>
+<l:l i="230">Ẃ</l:l>
+<l:l i="230">ẃ</l:l>
+<l:l i="230">Ẅ</l:l>
+<l:l i="230">ẅ</l:l>
+<l:l i="230">Ẇ</l:l>
+<l:l i="230">ẇ</l:l>
+<l:l i="230">Ẉ</l:l>
+<l:l i="230">ẉ</l:l>
+<l:l i="230">ẘ</l:l>
+<l:l i="240">X</l:l>
+<l:l i="240">x</l:l>
+<l:l i="240">Ẋ</l:l>
+<l:l i="240">ẋ</l:l>
+<l:l i="240">Ẍ</l:l>
+<l:l i="240">áº</l:l>
+<l:l i="250">Y</l:l>
+<l:l i="250">y</l:l>
+<l:l i="250">Ã</l:l>
+<l:l i="250">ý</l:l>
+<l:l i="250">ÿ</l:l>
+<l:l i="250">Ÿ</l:l>
+<l:l i="250">Ŷ</l:l>
+<l:l i="250">Å·</l:l>
+<l:l i="250">Ƴ</l:l>
+<l:l i="250">Æ´</l:l>
+<l:l i="250">Ȳ</l:l>
+<l:l i="250">ȳ</l:l>
+<l:l i="250">Ẏ</l:l>
+<l:l i="250">áº</l:l>
+<l:l i="250">ẙ</l:l>
+<l:l i="250">Ỳ</l:l>
+<l:l i="250">ỳ</l:l>
+<l:l i="250">á»´</l:l>
+<l:l i="250">ỵ</l:l>
+<l:l i="250">Ỷ</l:l>
+<l:l i="250">á»·</l:l>
+<l:l i="250">Ỹ</l:l>
+<l:l i="250">ỹ</l:l>
+<l:l i="260">Z</l:l>
+<l:l i="260">z</l:l>
+<l:l i="260">Ź</l:l>
+<l:l i="260">ź</l:l>
+<l:l i="260">Å»</l:l>
+<l:l i="260">ż</l:l>
+<l:l i="260">Ž</l:l>
+<l:l i="260">ž</l:l>
+<l:l i="260">Ƶ</l:l>
+<l:l i="260">ƶ</l:l>
+<l:l i="260">Ȥ</l:l>
+<l:l i="260">È¥</l:l>
+<l:l i="260">Ê</l:l>
+<l:l i="260">Ê‘</l:l>
+<l:l i="260">áº</l:l>
+<l:l i="260">ẑ</l:l>
+<l:l i="260">Ẓ</l:l>
+<l:l i="260">ẓ</l:l>
+<l:l i="260">Ẕ</l:l>
+<l:l i="260">ẕ</l:l>
+</l:letters>
+</l:l10n>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/pa.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/pa.xml
new file mode 100644
index 0000000..08ef771
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/pa.xml
@@ -0,0 +1,660 @@
+<?xml version="1.0" encoding="utf-8"?>
+<l:l10n xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0" language="pa" english-language-name="Punjabi">
+
+<!-- * This file is generated automatically. -->
+<!-- * To submit changes to this file upstream (to the DocBook Project) -->
+<!-- * do not submit an edited version of this file. Instead, submit an -->
+<!-- * edited version of the source file at the following location: -->
+<!-- * -->
+<!-- * https://docbook.svn.sourceforge.net/svnroot/docbook/trunk/gentext/locale/pa.xml -->
+<!-- * -->
+<!-- * E-mail the edited pa.xml source file to: -->
+<!-- * -->
+<!-- * docbook-developers@lists.sourceforge.net -->
+
+<!-- ******************************************************************** -->
+
+<!-- This file is part of the XSL DocBook Stylesheet distribution. -->
+<!-- See ../README or http://docbook.sf.net/release/xsl/current/ for -->
+<!-- copyright and other information. -->
+
+<!-- ******************************************************************** -->
+<!-- In these files, % with a letter is used for a placeholder: -->
+<!-- %t is the current element's title -->
+<!-- %s is the current element's subtitle (if applicable)-->
+<!-- %n is the current element's number label-->
+<!-- %p is the current element's page number (if applicable)-->
+<!-- ******************************************************************** -->
+
+
+<l:gentext key="Abstract" text="ਸਾਰ"/>
+<l:gentext key="abstract" text="ਸਾਰ"/>
+<l:gentext key="Acknowledgements" text="ਰਸੀਦਾਂ"/>
+<l:gentext key="acknowledgements" text="ਰਸੀਦਾਂ"/>
+<l:gentext key="Answer" text="A:"/>
+<l:gentext key="answer" text="a:"/>
+<l:gentext key="Appendix" text="ਅੰਤਿਕਾ"/>
+<l:gentext key="appendix" text="ਅੰਤਿਕਾ"/>
+<l:gentext key="Article" text="ਲੇਖ"/>
+<l:gentext key="article" text="ਲੇਖ"/>
+<l:gentext key="Author" text="ਲੇਖਕ"/>
+<l:gentext key="Bibliography" text="ਪà©à¨¸à¨¤à¨•-ਸੂਚੀ"/>
+<l:gentext key="bibliography" text="ਪà©à¨¸à¨¤à¨•-ਸੂਚੀ"/>
+<l:gentext key="Book" text="ਪà©à¨¸à¨¤à¨•"/>
+<l:gentext key="book" text="ਪà©à¨¸à¨¤à¨•"/>
+<l:gentext key="CAUTION" text="ਸਾਵਧਾਨ"/>
+<l:gentext key="Caution" text="ਸਾਵਧਾਨ"/>
+<l:gentext key="caution" text="ਸਾਵਧਾਨ"/>
+<l:gentext key="Chapter" text="ਅਧਿਆਇ"/>
+<l:gentext key="chapter" text="ਅਧਿਆਇ"/>
+<l:gentext key="Colophon" text="ਲੇਖਕਾਂਬਾਰੇ"/>
+<l:gentext key="colophon" text="ਲੇਖਕਾਂਬਾਰੇ"/>
+<l:gentext key="Copyright" text="ਹੱਕਰਾਖਵੇਂਹਨ"/>
+<l:gentext key="copyright" text="ਹੱਕਰਾਖਵੇਂਹਨ"/>
+<l:gentext key="Dedication" text="ਸਮਰਪਣ"/>
+<l:gentext key="dedication" text="ਸਮਰਪਣ"/>
+<l:gentext key="Edition" text="ਪà©à¨°à¨•à¨¾à¨¶à¨¨"/>
+<l:gentext key="edition" text="ਪà©à¨°à¨•à¨¾à¨¶à¨¨"/>
+<l:gentext key="Editor" text="ਪà©à¨°à¨•à¨¾à¨¶à¨•"/>
+<l:gentext key="Equation" text="ਸਮੀਕਰਨ"/>
+<l:gentext key="equation" text="ਸਮੀਕਰਨ"/>
+<l:gentext key="Example" text="ਉਦਾਹਰਨ"/>
+<l:gentext key="example" text="ਉਦਾਹਰਨ"/>
+<l:gentext key="Figure" text="ਚਿੱਤਰ"/>
+<l:gentext key="figure" text="ਚਿੱਤਰ"/>
+<l:gentext key="Glossary" text="ਸ਼ਬਦਾਵਲੀ"/>
+<l:gentext key="glossary" text="ਸ਼ਬਦਾਵਲੀ"/>
+<l:gentext key="GlossSee" text="ਵੇਖੋ"/>
+<l:gentext key="glosssee" text="ਵੇਖੋ"/>
+<l:gentext key="GlossSeeAlso" text="ਇਹਵੀਵੇਖੋ"/>
+<l:gentext key="glossseealso" text="ਇਹਵੀਵੇਖੋ"/>
+<l:gentext key="IMPORTANT" text="ਖਾਸ"/>
+<l:gentext key="important" text="ਖਾਸ"/>
+<l:gentext key="Important" text="ਖਾਸ"/>
+<l:gentext key="Index" text="ਤਤਕਰਾ"/>
+<l:gentext key="index" text="ਤਤਕਰਾ"/>
+<l:gentext key="ISBN" text="ISBN"/>
+<l:gentext key="isbn" text="ISBN"/>
+<l:gentext key="LegalNotice" text="ਕਾਨੂੰਨੀ ਸੂਚਨਾ"/>
+<l:gentext key="legalnotice" text="ਕਾਨੂੰਨੀ ਸੂਚਨਾ"/>
+<l:gentext key="MsgAud" text="ਪਾਠਕ"/>
+<l:gentext key="msgaud" text="ਪਾਠਕ"/>
+<l:gentext key="MsgLevel" text="ਪੱਧਰ"/>
+<l:gentext key="msglevel" text="ਪੱਧਰ"/>
+<l:gentext key="MsgOrig" text="ਮà©à©±à¨¢"/>
+<l:gentext key="msgorig" text="ਮà©à©±à¨¢"/>
+<l:gentext key="NOTE" text="ਸੂਚਨਾ"/>
+<l:gentext key="Note" text="ਸੂਚਨਾ"/>
+<l:gentext key="note" text="ਸੂਚਨਾ"/>
+<l:gentext key="Part" text="ਭਾਗ"/>
+<l:gentext key="part" text="ਭਾਗ"/>
+<l:gentext key="Preface" text="ਭੂਮਿਕਾ"/>
+<l:gentext key="preface" text="ਭੂਮਿਕਾ"/>
+<l:gentext key="Procedure" text="ਤਰੀਕਾ"/>
+<l:gentext key="procedure" text="ਤਰੀਕਾ"/>
+<l:gentext key="ProductionSet" text="ਉਤਪਾਦਨ"/>
+<l:gentext key="PubDate" text="ਪà©à¨°à¨•à¨¾à¨¶à¨¨ ਮਿਤੀ"/>
+<l:gentext key="pubdate" text="ਪà©à¨°à¨•à¨¾à¨¶à¨¨ ਮਿਤੀ"/>
+<l:gentext key="Published" text="ਪà©à¨°à¨•à¨¾à¨¶à¨¿à¨¤"/>
+<l:gentext key="published" text="ਪà©à¨°à¨•à¨¾à¨¶à¨¿à¨¤"/>
+<l:gentext key="Publisher" text="ਪà©à¨°à¨•à¨¾à¨¶à¨•"/>
+<l:gentext key="Qandadiv" text="Q &amp; A"/>
+<l:gentext key="qandadiv" text="q &amp; a"/>
+<l:gentext key="QandASet" text="ਆਮ ਸਵਾਲ ਜਵਾਬ"/>
+<l:gentext key="Question" text="Q:"/>
+<l:gentext key="question" text="q:"/>
+<l:gentext key="RefEntry" text="ਸਫਾ"/>
+<l:gentext key="refentry" text="ਸਫਾ"/>
+<l:gentext key="Reference" text="ਹਵਾਲਾ"/>
+<l:gentext key="reference" text="ਹਵਾਲਾ"/>
+<l:gentext key="References" text="ਹਵਾਲਾ"/>
+<l:gentext key="RefName" text="ਨਾਂ"/>
+<l:gentext key="refname" text="ਨਾਂ"/>
+<l:gentext key="RefSection" text="ਹਿੱਸਾ"/>
+<l:gentext key="refsection" text="ਹਿੱਸਾ"/>
+<l:gentext key="RefSynopsisDiv" text="ਖà©à¨²à¨¾à¨¸à¨¾"/>
+<l:gentext key="refsynopsisdiv" text="ਖà©à¨²à¨¾à¨¸à¨¾"/>
+<l:gentext key="RevHistory" text="ਸà©à¨§à¨¾à¨ˆ ਅਤੀਤ"/>
+<l:gentext key="revhistory" text="ਸà©à¨§à¨¾à¨ˆ ਅਤੀਤ"/>
+<l:gentext key="revision" text="ਸà©à¨§à¨¾à¨ˆ"/>
+<l:gentext key="Revision" text="ਸà©à¨§à¨¾à¨ˆ"/>
+<l:gentext key="sect1" text="ਹਿੱਸਾ"/>
+<l:gentext key="sect2" text="ਹਿੱਸਾ"/>
+<l:gentext key="sect3" text="ਹਿੱਸਾ"/>
+<l:gentext key="sect4" text="ਹਿੱਸਾ"/>
+<l:gentext key="sect5" text="ਹਿੱਸਾ"/>
+<l:gentext key="section" text="ਹਿੱਸਾ"/>
+<l:gentext key="Section" text="ਹਿੱਸਾ"/>
+<l:gentext key="see" text="ਵੇਖੋ"/>
+<l:gentext key="See" text="ਵੇਖੋ"/>
+<l:gentext key="seealso" text="ਇਹਵੀਵੇਖੋ"/>
+<l:gentext key="Seealso" text="ਇਹਵੀਵੇਖੋ"/>
+<l:gentext key="SeeAlso" text="ਇਹਵੀਵੇਖੋ"/>
+<l:gentext key="set" text="ਨਿਰਧਾਰਿਤ"/>
+<l:gentext key="Set" text="ਨਿਰਧਾਰਿਤ"/>
+<l:gentext key="setindex" text="ਤਤਕਰਾ ਨਿਰਧਾਰਨ"/>
+<l:gentext key="SetIndex" text="ਤਤਕਰਾ ਨਿਰਧਾਰਨ"/>
+<l:gentext key="Sidebar" text="ਬਾਹੀ"/>
+<l:gentext key="sidebar" text="ਬਾਹੀ"/>
+<l:gentext key="step" text="ਪਗ਼"/>
+<l:gentext key="Step" text="ਪਗ਼"/>
+<l:gentext key="table" text="ਸਾਰਣੀ"/>
+<l:gentext key="Table" text="ਸਾਰਣੀ"/>
+<l:gentext key="task" text="ਕਾਰਜ"/>
+<l:gentext key="Task" text="ਕਾਰਜ"/>
+<l:gentext key="tip" text="ਸੰਕੇਤ"/>
+<l:gentext key="TIP" text="ਸੰਕੇਤ"/>
+<l:gentext key="Tip" text="ਸੰਕੇਤ"/>
+<l:gentext key="Warning" text="ਸਾਵਧਾਨ"/>
+<l:gentext key="warning" text="ਸਾਵਧਾਨ"/>
+<l:gentext key="WARNING" text="ਸਾਵਧਾਨ"/>
+<l:gentext key="and" text="ਅਤੇ"/>
+<l:gentext key="by" text="ਲਈ"/>
+<l:gentext key="Edited" text="ਸੰਪਾਦਨ"/>
+<l:gentext key="edited" text="ਸੰਪਾਦਨ"/>
+<l:gentext key="Editedby" text="ਸੰਪਾਦਨ ਕੀਤਾ"/>
+<l:gentext key="editedby" text="ਸੰਪਾਦਨ ਕੀਤਾ"/>
+<l:gentext key="in" text="ਵਿੱਚ"/>
+<l:gentext key="lastlistcomma" text=","/>
+<l:gentext key="listcomma" text=","/>
+<l:gentext key="notes" text="ਸੂਚਨਾ"/>
+<l:gentext key="Notes" text="ਸੂਚਨਾ"/>
+<l:gentext key="Pgs" text="ਸਫ਼ੇ"/>
+<l:gentext key="pgs" text="ਸਫ਼ੇ"/>
+<l:gentext key="Revisedby" text="ਸà©à¨§à¨¾à¨ˆ ਕੀਤੀ: "/>
+<l:gentext key="revisedby" text="ਸà©à¨§à¨¾à¨ˆ ਕੀਤੀ: "/>
+<l:gentext key="TableNotes" text="ਸੂਚਨਾ"/>
+<l:gentext key="tablenotes" text="ਸੂਚਨਾ"/>
+<l:gentext key="TableofContents" text="ਭਾਗ ਸਾਰਣੀ"/>
+<l:gentext key="tableofcontents" text="ਭਾਗ ਸਾਰਣੀ"/>
+<l:gentext key="unexpectedelementname" text="ਨਾ-ਲੋੜੀਦਾ ਇਕਾਈ ਨਾਂ"/>
+<l:gentext key="unsupported" text="ਨਾ-ਸਹਾਇਕ"/>
+<l:gentext key="xrefto" text="xref ਨੂੰ"/>
+<l:gentext key="Authors" text="ਲੇਖਕ"/>
+<l:gentext key="copyeditor" text="ਨਕਲ ਸੰਪਾਦਕ"/>
+<l:gentext key="graphicdesigner" text="ਗਰਾਫਿਕ ਡਿਜ਼ਾਈਨਰ"/>
+<l:gentext key="productioneditor" text="ਉਤਪਾਦਨ ਸੰਪਾਦਕ"/>
+<l:gentext key="technicaleditor" text="ਤਕਨੀਕੀ ਸੰਪਾਦਕ"/>
+<l:gentext key="translator" text="ਅਨà©à¨µà¨¾à¨¦à¨•"/>
+<l:gentext key="listofequations" text="ਸਮੀਕਰਨ ਸੂਚੀ"/>
+<l:gentext key="ListofEquations" text="ਸਮੀਕਰਨ ਸੂਚੀ"/>
+<l:gentext key="ListofExamples" text="ਉਦਾਹਰਨ ਸੂਚੀ"/>
+<l:gentext key="listofexamples" text="ਉਦਾਹਰਨ ਸੂਚੀ"/>
+<l:gentext key="ListofFigures" text="ਚਿੱਤਰ ਸੂਚੀ"/>
+<l:gentext key="listoffigures" text="ਚਿੱਤਰ ਸੂਚੀ"/>
+<l:gentext key="ListofProcedures" text="ਕਾਰਵਾਈ ਸੂਚੀ"/>
+<l:gentext key="listofprocedures" text="ਕਾਰਵਾਈ ਸੂਚੀ"/>
+<l:gentext key="listoftables" text="ਸਾਰਣੀ ਸੂਚੀ"/>
+<l:gentext key="ListofTables" text="ਸਾਰਣੀ ਸੂਚੀ"/>
+<l:gentext key="ListofUnknown" text="ਅਣਜਾਣ ਸੂਚੀ"/>
+<l:gentext key="listofunknown" text="ਅਣਜਾਣ ਸੂਚੀ"/>
+<l:gentext key="nav-home" text="ਘਰ"/>
+<l:gentext key="nav-next" text="ਅੱਗੇ"/>
+<l:gentext key="nav-next-sibling" text="ਤੇਜ਼ ਅੱਗੇ"/>
+<l:gentext key="nav-prev" text="ਪਿੱਛੇ"/>
+<l:gentext key="nav-prev-sibling" text="ਤੇਜ਼ ਪਿੱਛੇ"/>
+<l:gentext key="nav-up" text="ਉੱਪਰ"/>
+<l:gentext key="nav-toc" text="ਸਾਰਣੀ"/>
+<l:gentext key="Draft" text="ਡਰਾਫਟ"/>
+<l:gentext key="above" text="ਉੱਪਰ"/>
+<l:gentext key="below" text="ਹੇਠਾਂ"/>
+<l:gentext key="sectioncalled" text="ਭਾਗ ਕਹਿੰਦੇ ਨੇ"/>
+<l:gentext key="index symbols" text="ਚਿੰਨ"/>
+<l:gentext key="writing-mode" text="lr-tb"/>
+<l:gentext key="lowercase.alpha" text="abcdefghijklmnopqrstuvwxyz"/>
+<l:gentext key="uppercase.alpha" text="ABCDEFGHIJKLMNOPQRSTUVWXYZ"/>
+<l:gentext key="normalize.sort.input" text="AaÀàÃáÂâÃãÄäÅåĀÄĂ㥹ÇǎǞǟǠǡǺǻȀÈȂȃȦȧḀá¸áºšáº áº¡áº¢áº£áº¤áº¥áº¦áº§áº¨áº©áºªáº«áº¬áº­áº®áº¯áº°áº±áº²áº³áº´áºµáº¶áº·BbÆ€ÆɓƂƃḂḃḄḅḆḇCcÇçĆćĈĉĊċČÄƇƈɕḈḉDdÄŽÄÄđƊɗƋƌDžDzȡɖḊḋḌá¸á¸Žá¸á¸á¸‘ḒḓEeÈèÉéÊêËëĒēĔĕĖėĘęĚěȄȅȆȇȨȩḔḕḖḗḘḙḚḛḜá¸áº¸áº¹áººáº»áº¼áº½áº¾áº¿á»€á»á»‚ểỄễỆệFfƑƒḞḟGgÄœÄĞğĠġĢģƓɠǤǥǦǧǴǵḠḡHhĤĥĦħȞȟɦḢḣḤḥḦḧḨḩḪḫẖIiÌìÃíÎîÃïĨĩĪīĬĭĮįİƗɨÇÇȈȉȊȋḬḭḮḯỈỉỊịJjĴĵǰÊKkĶķƘƙǨǩḰḱḲḳḴḵLlĹĺĻļĽľĿŀÅłƚLjȴɫɬɭḶḷḸḹḺḻḼḽMmɱḾḿṀá¹á¹‚ṃNnÑñŃńŅņŇňÆɲƞȠNjǸǹȵɳṄṅṆṇṈṉṊṋOoÒòÓóÔôÕõÖöØøŌÅÅŽÅÅőƟƠơǑǒǪǫǬǭǾǿȌÈÈŽÈȪȫȬȭȮȯȰȱṌá¹á¹Žá¹á¹á¹‘ṒṓỌá»á»Žá»á»á»‘ỒồỔổỖỗỘộỚớỜá»á»žá»Ÿá» á»¡á»¢á»£PpƤƥṔṕṖṗQqÊ RrŔŕŖŗŘřÈȑȒȓɼɽɾṘṙṚṛṜá¹á¹žá¹ŸSsŚśŜÅŞşŠšȘșʂṠṡṢṣṤṥṦṧṨṩTtŢţŤťŦŧƫƬƭƮʈȚțȶṪṫṬṭṮṯṰṱẗUuÙùÚúÛûÜüŨũŪūŬŭŮůŰűŲųƯưǓǔǕǖǗǘǙǚǛǜȔȕȖȗṲṳṴṵṶṷṸṹṺṻỤụỦủỨứỪừỬửỮữỰựVvƲʋṼṽṾṿWwŴŵẀáºáº‚ẃẄẅẆẇẈẉẘXxẊẋẌáºYyÃýÿŸŶŷƳƴȲȳẎáºáº™á»²á»³á»´á»µá»¶á»·á»¸á»¹ZzŹźŻżŽžƵƶȤȥÊÊ‘áºáº‘ẒẓẔẕẕ" lang="en"/>
+<l:gentext key="normalize.sort.output" text="AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBCCCCCCCCCCCCCCCCCDDDDDDDDDDDDDDDDDDDDDDDDEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEFFFFFFGGGGGGGGGGGGGGGGGGGGHHHHHHHHHHHHHHHHHHHHIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIJJJJJJKKKKKKKKKKKKKKLLLLLLLLLLLLLLLLLLLLLLLLLLMMMMMMMMMNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOPPPPPPPPQQQRRRRRRRRRRRRRRRRRRRRRRRSSSSSSSSSSSSSSSSSSSSSSSTTTTTTTTTTTTTTTTTTTTTTTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUVVVVVVVVWWWWWWWWWWWWWWWXXXXXXYYYYYYYYYYYYYYYYYYYYYYYZZZZZZZZZZZZZZZZZZZZZ" lang="en"/>
+<l:dingbat key="startquote" text="“"/>
+<l:dingbat key="endquote" text="â€"/>
+<l:dingbat key="nestedstartquote" text="‘"/>
+<l:dingbat key="nestedendquote" text="’"/>
+<l:dingbat key="singlestartquote" text="‘"/>
+<l:dingbat key="singleendquote" text="’"/>
+<l:dingbat key="bullet" text="•"/>
+<l:gentext key="hyphenation-character" text="-"/>
+<l:gentext key="hyphenation-push-character-count" text="2"/>
+<l:gentext key="hyphenation-remain-character-count" text="2"/>
+<l:context name="styles"><l:template name="person-name" text="first-last"/>
+</l:context>
+<l:context name="title"><l:template name="abstract" text="%t"/>
+<l:template name="acknowledgements" text="%t" lang="en"/>
+<l:template name="answer" text="%t"/>
+<l:template name="appendix" text="ਅੰਤਿਕਾ %n. %t"/>
+<l:template name="article" text="%t"/>
+<l:template name="authorblurb" text="%t"/>
+<l:template name="bibliodiv" text="%t"/>
+<l:template name="biblioentry" text="%t"/>
+<l:template name="bibliography" text="%t"/>
+<l:template name="bibliolist" text="%t"/>
+<l:template name="bibliomixed" text="%t"/>
+<l:template name="bibliomset" text="%t"/>
+<l:template name="biblioset" text="%t"/>
+<l:template name="blockquote" text="%t"/>
+<l:template name="book" text="%t"/>
+<l:template name="calloutlist" text="%t"/>
+<l:template name="caution" text="%t"/>
+<l:template name="chapter" text="ਅਧਿਆਇ %n. %t"/>
+<l:template name="colophon" text="%t"/>
+<l:template name="dedication" text="%t"/>
+<l:template name="equation" text="ਸਮੀਕਰਨ %n. %t"/>
+<l:template name="example" text="ਉਦਾਹਰਨ %n. %t"/>
+<l:template name="figure" text="ਚਿੱਤਰ %n. %t"/>
+<l:template name="foil" text="%t"/>
+<l:template name="foilgroup" text="%t"/>
+<l:template name="formalpara" text="%t"/>
+<l:template name="glossary" text="%t"/>
+<l:template name="glossdiv" text="%t"/>
+<l:template name="glosslist" text="%t"/>
+<l:template name="glossentry" text="%t"/>
+<l:template name="important" text="%t"/>
+<l:template name="index" text="%t"/>
+<l:template name="indexdiv" text="%t"/>
+<l:template name="itemizedlist" text="%t"/>
+<l:template name="legalnotice" text="%t"/>
+<l:template name="listitem" text=""/>
+<l:template name="lot" text="%t"/>
+<l:template name="msg" text="%t"/>
+<l:template name="msgexplan" text="%t"/>
+<l:template name="msgmain" text="%t"/>
+<l:template name="msgrel" text="%t"/>
+<l:template name="msgset" text="%t"/>
+<l:template name="msgsub" text="%t"/>
+<l:template name="note" text="%t"/>
+<l:template name="orderedlist" text="%t"/>
+<l:template name="part" text="ਭਾਗ %n. %t"/>
+<l:template name="partintro" text="%t"/>
+<l:template name="preface" text="%t"/>
+<l:template name="procedure" text="%t"/>
+<l:template name="procedure.formal" text="ਤਰੀਕਾ %n. %t"/>
+<l:template name="productionset" text="%t"/>
+<l:template name="productionset.formal" text="ਉਤਪਾਦਨ %n"/>
+<l:template name="qandadiv" text="%t"/>
+<l:template name="qandaentry" text="%t"/>
+<l:template name="qandaset" text="%t"/>
+<l:template name="question" text="%t"/>
+<l:template name="refentry" text="%t"/>
+<l:template name="reference" text="%t"/>
+<l:template name="refsection" text="%t"/>
+<l:template name="refsect1" text="%t"/>
+<l:template name="refsect2" text="%t"/>
+<l:template name="refsect3" text="%t"/>
+<l:template name="refsynopsisdiv" text="%t"/>
+<l:template name="refsynopsisdivinfo" text="%t"/>
+<l:template name="segmentedlist" text="%t"/>
+<l:template name="set" text="%t"/>
+<l:template name="setindex" text="%t"/>
+<l:template name="sidebar" text="%t"/>
+<l:template name="step" text="%t"/>
+<l:template name="table" text="ਸਾਰਣੀ %n. %t"/>
+<l:template name="task" text="%t"/>
+<l:template name="tasksummary" text="%t" lang="en"/>
+<l:template name="taskprerequisites" text="%t" lang="en"/>
+<l:template name="taskrelated" text="%t" lang="en"/>
+<l:template name="tip" text="%t"/>
+<l:template name="toc" text="%t"/>
+<l:template name="variablelist" text="%t"/>
+<l:template name="varlistentry" text=""/>
+<l:template name="warning" text="%t"/>
+</l:context>
+<l:context name="title-unnumbered"><l:template name="appendix" text="%t"/>
+<l:template name="article/appendix" text="%t"/>
+<l:template name="bridgehead" text="%t"/>
+<l:template name="chapter" text="%t"/>
+<l:template name="sect1" text="%t"/>
+<l:template name="sect2" text="%t"/>
+<l:template name="sect3" text="%t"/>
+<l:template name="sect4" text="%t"/>
+<l:template name="sect5" text="%t"/>
+<l:template name="section" text="%t"/>
+<l:template name="simplesect" text="%t"/>
+<l:template name="part" text="%t" lang="en"/>
+</l:context>
+<l:context name="title-numbered"><l:template name="appendix" text="ਅੰਤਿਕਾ %n. %t"/>
+<l:template name="article/appendix" text="%n. %t"/>
+<l:template name="bridgehead" text="%n. %t"/>
+<l:template name="chapter" text="ਅਧਿਆਇ %n. %t"/>
+<l:template name="part" text="ਭਾਗ %n. %t"/>
+<l:template name="sect1" text="%n. %t"/>
+<l:template name="sect2" text="%n. %t"/>
+<l:template name="sect3" text="%n. %t"/>
+<l:template name="sect4" text="%n. %t"/>
+<l:template name="sect5" text="%n. %t"/>
+<l:template name="section" text="%n. %t"/>
+<l:template name="simplesect" text="%t"/>
+</l:context>
+<l:context name="subtitle"><l:template name="appendix" text="%s"/>
+<l:template name="acknowledgements" text="%s" lang="en"/>
+<l:template name="article" text="%s"/>
+<l:template name="bibliodiv" text="%s"/>
+<l:template name="biblioentry" text="%s"/>
+<l:template name="bibliography" text="%s"/>
+<l:template name="bibliomixed" text="%s"/>
+<l:template name="bibliomset" text="%s"/>
+<l:template name="biblioset" text="%s"/>
+<l:template name="book" text="%s"/>
+<l:template name="chapter" text="%s"/>
+<l:template name="colophon" text="%s"/>
+<l:template name="dedication" text="%s"/>
+<l:template name="glossary" text="%s"/>
+<l:template name="glossdiv" text="%s"/>
+<l:template name="index" text="%s"/>
+<l:template name="indexdiv" text="%s"/>
+<l:template name="lot" text="%s"/>
+<l:template name="part" text="%s"/>
+<l:template name="partintro" text="%s"/>
+<l:template name="preface" text="%s"/>
+<l:template name="refentry" text="%s"/>
+<l:template name="reference" text="%s"/>
+<l:template name="refsection" text="%s"/>
+<l:template name="refsect1" text="%s"/>
+<l:template name="refsect2" text="%s"/>
+<l:template name="refsect3" text="%s"/>
+<l:template name="refsynopsisdiv" text="%s"/>
+<l:template name="sect1" text="%s"/>
+<l:template name="sect2" text="%s"/>
+<l:template name="sect3" text="%s"/>
+<l:template name="sect4" text="%s"/>
+<l:template name="sect5" text="%s"/>
+<l:template name="section" text="%s"/>
+<l:template name="set" text="%s"/>
+<l:template name="setindex" text="%s"/>
+<l:template name="sidebar" text="%s"/>
+<l:template name="simplesect" text="%s"/>
+<l:template name="toc" text="%s"/>
+</l:context>
+<l:context name="xref"><l:template name="abstract" text="%t"/>
+<l:template name="acknowledgements" text="%t" lang="en"/>
+<l:template name="answer" text="A: %n"/>
+<l:template name="appendix" text="%t"/>
+<l:template name="article" text="%t"/>
+<l:template name="authorblurb" text="%t"/>
+<l:template name="bibliodiv" text="%t"/>
+<l:template name="bibliography" text="%t"/>
+<l:template name="bibliomset" text="%t"/>
+<l:template name="biblioset" text="%t"/>
+<l:template name="blockquote" text="%t"/>
+<l:template name="book" text="%t"/>
+<l:template name="calloutlist" text="%t"/>
+<l:template name="caution" text="%t"/>
+<l:template name="chapter" text="%t"/>
+<l:template name="colophon" text="%t"/>
+<l:template name="constraintdef" text="%t"/>
+<l:template name="dedication" text="%t"/>
+<l:template name="equation" text="%t"/>
+<l:template name="example" text="%t"/>
+<l:template name="figure" text="%t"/>
+<l:template name="foil" text="%t"/>
+<l:template name="foilgroup" text="%t"/>
+<l:template name="formalpara" text="%t"/>
+<l:template name="glossary" text="%t"/>
+<l:template name="glossdiv" text="%t"/>
+<l:template name="important" text="%t"/>
+<l:template name="index" text="%t"/>
+<l:template name="indexdiv" text="%t"/>
+<l:template name="itemizedlist" text="%t"/>
+<l:template name="legalnotice" text="%t"/>
+<l:template name="listitem" text="%n"/>
+<l:template name="lot" text="%t"/>
+<l:template name="msg" text="%t"/>
+<l:template name="msgexplan" text="%t"/>
+<l:template name="msgmain" text="%t"/>
+<l:template name="msgrel" text="%t"/>
+<l:template name="msgset" text="%t"/>
+<l:template name="msgsub" text="%t"/>
+<l:template name="note" text="%t"/>
+<l:template name="orderedlist" text="%t"/>
+<l:template name="part" text="%t"/>
+<l:template name="partintro" text="%t"/>
+<l:template name="preface" text="%t"/>
+<l:template name="procedure" text="%t"/>
+<l:template name="productionset" text="%t"/>
+<l:template name="qandadiv" text="%t"/>
+<l:template name="qandaentry" text="Q: %n"/>
+<l:template name="qandaset" text="%t"/>
+<l:template name="question" text="Q: %n"/>
+<l:template name="reference" text="%t"/>
+<l:template name="refsynopsisdiv" text="%t"/>
+<l:template name="segmentedlist" text="%t"/>
+<l:template name="set" text="%t"/>
+<l:template name="setindex" text="%t"/>
+<l:template name="sidebar" text="%t"/>
+<l:template name="table" text="%t"/>
+<l:template name="task" text="%t" lang="en"/>
+<l:template name="tip" text="%t"/>
+<l:template name="toc" text="%t"/>
+<l:template name="variablelist" text="%t"/>
+<l:template name="varlistentry" text="%n"/>
+<l:template name="warning" text="%t"/>
+<l:template name="olink.document.citation" text=" in %o"/>
+<l:template name="olink.page.citation" text=" (page %p)"/>
+<l:template name="page.citation" text=" [%p]"/>
+<l:template name="page" text="(page %p)"/>
+<l:template name="docname" text=" in %o"/>
+<l:template name="docnamelong" text=" in the document titled %o"/>
+<l:template name="pageabbrev" text="(p. %p)"/>
+<l:template name="Page" text="Page %p"/>
+<l:template name="bridgehead" text="ਭਾਗ ਕਹਿੰਦੇ ਨੇ “%tâ€"/>
+<l:template name="refsection" text="ਭਾਗ ਕਹਿੰਦੇ ਨੇ “%tâ€"/>
+<l:template name="refsect1" text="ਭਾਗ ਕਹਿੰਦੇ ਨੇ “%tâ€"/>
+<l:template name="refsect2" text="ਭਾਗ ਕਹਿੰਦੇ ਨੇ “%tâ€"/>
+<l:template name="refsect3" text="ਭਾਗ ਕਹਿੰਦੇ ਨੇ “%tâ€"/>
+<l:template name="sect1" text="ਭਾਗ ਕਹਿੰਦੇ ਨੇ “%tâ€"/>
+<l:template name="sect2" text="ਭਾਗ ਕਹਿੰਦੇ ਨੇ “%tâ€"/>
+<l:template name="sect3" text="ਭਾਗ ਕਹਿੰਦੇ ਨੇ “%tâ€"/>
+<l:template name="sect4" text="ਭਾਗ ਕਹਿੰਦੇ ਨੇ “%tâ€"/>
+<l:template name="sect5" text="ਭਾਗ ਕਹਿੰਦੇ ਨੇ “%tâ€"/>
+<l:template name="section" text="ਭਾਗ ਕਹਿੰਦੇ ਨੇ “%tâ€"/>
+<l:template name="simplesect" text="ਭਾਗ ਕਹਿੰਦੇ ਨੇ “%tâ€"/>
+</l:context>
+<l:context name="xref-number"><l:template name="answer" text="A: %n"/>
+<l:template name="appendix" text="ਅੰਤਿਕਾ %n"/>
+<l:template name="bridgehead" text="ਹਿੱਸਾ %n"/>
+<l:template name="chapter" text="ਅਧਿਆਇ %n"/>
+<l:template name="equation" text="ਸਮੀਕਰਨ %n"/>
+<l:template name="example" text="ਉਦਾਹਰਨ %n"/>
+<l:template name="figure" text="ਚਿੱਤਰ %n"/>
+<l:template name="part" text="ਭਾਗ %n"/>
+<l:template name="procedure" text="ਤਰੀਕਾ %n"/>
+<l:template name="productionset" text="ਉਤਪਾਦਨ %n"/>
+<l:template name="qandadiv" text="Q &amp; A %n"/>
+<l:template name="qandaentry" text="Q: %n"/>
+<l:template name="question" text="Q: %n"/>
+<l:template name="sect1" text="ਹਿੱਸਾ %n"/>
+<l:template name="sect2" text="ਹਿੱਸਾ %n"/>
+<l:template name="sect3" text="ਹਿੱਸਾ %n"/>
+<l:template name="sect4" text="ਹਿੱਸਾ %n"/>
+<l:template name="sect5" text="ਹਿੱਸਾ %n"/>
+<l:template name="section" text="ਹਿੱਸਾ %n"/>
+<l:template name="table" text="ਸਾਰਣੀ %n"/>
+</l:context>
+<l:context name="xref-number-and-title"><l:template name="appendix" text="ਅੰਤਿਕਾ %n, %t"/>
+<l:template name="bridgehead" text="ਹਿੱਸਾ %n, “%tâ€"/>
+<l:template name="chapter" text="ਅਧਿਆਇ %n, %t"/>
+<l:template name="equation" text="ਸਮੀਕਰਨ %n, “%tâ€"/>
+<l:template name="example" text="ਉਦਾਹਰਨ %n, “%tâ€"/>
+<l:template name="figure" text="ਚਿੱਤਰ %n, “%tâ€"/>
+<l:template name="part" text="ਭਾਗ %n, “%tâ€"/>
+<l:template name="procedure" text="ਤਰੀਕਾ %n, “%tâ€"/>
+<l:template name="productionset" text="ਉਤਪਾਦਨ %n, “%tâ€"/>
+<l:template name="qandadiv" text="Q &amp; A %n, “%tâ€"/>
+<l:template name="refsect1" text="ਭਾਗ ਕਹਿੰਦੇ ਨੇ “%tâ€"/>
+<l:template name="refsect2" text="ਭਾਗ ਕਹਿੰਦੇ ਨੇ “%tâ€"/>
+<l:template name="refsect3" text="ਭਾਗ ਕਹਿੰਦੇ ਨੇ “%tâ€"/>
+<l:template name="refsection" text="ਭਾਗ ਕਹਿੰਦੇ ਨੇ “%tâ€"/>
+<l:template name="sect1" text="ਹਿੱਸਾ %n, “%tâ€"/>
+<l:template name="sect2" text="ਹਿੱਸਾ %n, “%tâ€"/>
+<l:template name="sect3" text="ਹਿੱਸਾ %n, “%tâ€"/>
+<l:template name="sect4" text="ਹਿੱਸਾ %n, “%tâ€"/>
+<l:template name="sect5" text="ਹਿੱਸਾ %n, “%tâ€"/>
+<l:template name="section" text="ਹਿੱਸਾ %n, “%tâ€"/>
+<l:template name="simplesect" text="ਭਾਗ ਕਹਿੰਦੇ ਨੇ “%tâ€"/>
+<l:template name="table" text="ਸਾਰਣੀ %n, “%tâ€"/>
+</l:context>
+<l:context name="authorgroup"><l:template name="sep" text=", "/>
+<l:template name="sep2" text=" ਅਤੇ "/>
+<l:template name="seplast" text=", ਅਤੇ "/>
+</l:context>
+<l:context name="glossary"><l:template name="see" text="ਵੇਖੋ %t."/>
+<l:template name="seealso" text="ਇਹਵੀਵੇਖੋ %t."/>
+<l:template name="seealso-separator" text=", "/>
+</l:context>
+<l:context name="msgset"><l:template name="MsgAud" text="ਪਾਠਕ: "/>
+<l:template name="MsgLevel" text="ਪੱਧਰ: "/>
+<l:template name="MsgOrig" text="ਮà©à©±à¨¢: "/>
+</l:context>
+<l:context name="datetime"><l:template name="format" text="m/d/Y"/>
+</l:context>
+<l:context name="termdef"><l:template name="prefix" text="[Definition: "/>
+<l:template name="suffix" text="]"/>
+</l:context>
+<l:context name="datetime-full"><l:template name="January" text="ਜਨਵਰੀ"/>
+<l:template name="February" text="ਫਰਵਰੀ"/>
+<l:template name="March" text="ਮਾਰਚ"/>
+<l:template name="April" text="ਅਪà©à¨°à©ˆà¨²"/>
+<l:template name="May" text="ਮਈ"/>
+<l:template name="June" text="ਜੂਨ"/>
+<l:template name="July" text="ਜà©à¨²à¨¾à¨ˆ"/>
+<l:template name="August" text="ਅਗਸਤ"/>
+<l:template name="September" text="ਸਤੰਬਰ"/>
+<l:template name="October" text="ਅਕਤੂਬਰ"/>
+<l:template name="November" text="ਨਵੰਬਰ"/>
+<l:template name="December" text="ਦਸੰਬਰ"/>
+<l:template name="Monday" text="ਸੋਮਵਾਰ"/>
+<l:template name="Tuesday" text="ਮੰਗਲਵਾਰ"/>
+<l:template name="Wednesday" text="ਬà©à©±à¨§à¨µà¨¾à¨°"/>
+<l:template name="Thursday" text="ਵੀਰਵਾਰ"/>
+<l:template name="Friday" text="ਸ਼à©à©±à¨•à¨°à¨µà¨¾à¨°"/>
+<l:template name="Saturday" text="ਸ਼ਨੀਵਾਰ"/>
+<l:template name="Sunday" text="à¨à¨¤à¨µà¨¾à¨°"/>
+</l:context>
+<l:context name="datetime-abbrev"><l:template name="Jan" text="ਜੈਨ"/>
+<l:template name="Feb" text="ਫੈਬ"/>
+<l:template name="Mar" text="ਮਾਰ"/>
+<l:template name="Apr" text="ਅਪà©à¨°à©ˆ"/>
+<l:template name="May" text="ਮਈ"/>
+<l:template name="Jun" text="ਜੂਨ"/>
+<l:template name="Jul" text="ਜà©à¨²"/>
+<l:template name="Aug" text="ਅਗ"/>
+<l:template name="Sep" text="ਸਤੰ"/>
+<l:template name="Oct" text="ਅਕਤੂ"/>
+<l:template name="Nov" text="ਨਵੰ"/>
+<l:template name="Dec" text="ਦਸੰ"/>
+<l:template name="Mon" text="ਸੋਮ"/>
+<l:template name="Tue" text="ਮੰਗਲ"/>
+<l:template name="Wed" text="ਬà©à©±à¨§"/>
+<l:template name="Thu" text="ਵੀਰ"/>
+<l:template name="Fri" text="ਸ਼à©à©±à¨•à¨°"/>
+<l:template name="Sat" text="ਸ਼ਨੀ"/>
+<l:template name="Sun" text="à¨à¨¤"/>
+</l:context>
+<l:context name="htmlhelp"><l:template name="langcode" text="0x0446 Punjabi"/>
+</l:context>
+<l:context name="index"><l:template name="term-separator" text=", "/>
+<l:template name="number-separator" text=", "/>
+<l:template name="range-separator" text="-"/>
+</l:context>
+<l:context name="iso690"><l:template name="lastfirst.sep" text=", "/>
+<l:template name="alt.person.two.sep" text=" – "/>
+<l:template name="alt.person.last.sep" text=" – "/>
+<l:template name="alt.person.more.sep" text=" – "/>
+<l:template name="primary.editor" text=" (ed.)"/>
+<l:template name="primary.many" text=", et al."/>
+<l:template name="primary.sep" text=". "/>
+<l:template name="submaintitle.sep" text=": "/>
+<l:template name="title.sep" text=". "/>
+<l:template name="othertitle.sep" text=", "/>
+<l:template name="medium1" text=" ["/>
+<l:template name="medium2" text="]"/>
+<l:template name="secondary.person.sep" text="; "/>
+<l:template name="secondary.sep" text=". "/>
+<l:template name="respons.sep" text=". "/>
+<l:template name="edition.sep" text=". "/>
+<l:template name="edition.serial.sep" text=", "/>
+<l:template name="issuing.range" text="-"/>
+<l:template name="issuing.div" text=", "/>
+<l:template name="issuing.sep" text=". "/>
+<l:template name="partnr.sep" text=". "/>
+<l:template name="placepubl.sep" text=": "/>
+<l:template name="publyear.sep" text=", "/>
+<l:template name="pubinfo.sep" text=". "/>
+<l:template name="spec.pubinfo.sep" text=", "/>
+<l:template name="upd.sep" text=", "/>
+<l:template name="datecit1" text=" [cited "/>
+<l:template name="datecit2" text="]"/>
+<l:template name="extent.sep" text=". "/>
+<l:template name="locs.sep" text=", "/>
+<l:template name="location.sep" text=". "/>
+<l:template name="serie.sep" text=". "/>
+<l:template name="notice.sep" text=". "/>
+<l:template name="access" text="Available "/>
+<l:template name="acctoo" text="Also available "/>
+<l:template name="onwww" text="from World Wide Web"/>
+<l:template name="oninet" text="from Internet"/>
+<l:template name="access.end" text=": "/>
+<l:template name="link1" text="&lt;"/>
+<l:template name="link2" text="&gt;"/>
+<l:template name="access.sep" text=". "/>
+<l:template name="isbn" text="ISBN "/>
+<l:template name="issn" text="ISSN "/>
+<l:template name="stdnum.sep" text=". "/>
+<l:template name="patcountry.sep" text=". "/>
+<l:template name="pattype.sep" text=", "/>
+<l:template name="patnum.sep" text=". "/>
+<l:template name="patdate.sep" text=". "/>
+</l:context><l:letters><l:l i="-1"/>
+<l:l i="0">ਚਿੰਨ</l:l>
+<l:l i="10">A</l:l>
+<l:l i="10">a</l:l>
+<l:l i="20">B</l:l>
+<l:l i="20">b</l:l>
+<l:l i="30">C</l:l>
+<l:l i="30">c</l:l>
+<l:l i="40">D</l:l>
+<l:l i="40">d</l:l>
+<l:l i="50">E</l:l>
+<l:l i="50">e</l:l>
+<l:l i="60">F</l:l>
+<l:l i="60">f</l:l>
+<l:l i="70">G</l:l>
+<l:l i="70">g</l:l>
+<l:l i="80">H</l:l>
+<l:l i="80">h</l:l>
+<l:l i="90">I</l:l>
+<l:l i="90">i</l:l>
+<l:l i="100">J</l:l>
+<l:l i="100">j</l:l>
+<l:l i="110">K</l:l>
+<l:l i="110">k</l:l>
+<l:l i="120">L</l:l>
+<l:l i="120">l</l:l>
+<l:l i="130">M</l:l>
+<l:l i="130">m</l:l>
+<l:l i="140">N</l:l>
+<l:l i="140">n</l:l>
+<l:l i="150">O</l:l>
+<l:l i="150">o</l:l>
+<l:l i="160">P</l:l>
+<l:l i="160">p</l:l>
+<l:l i="170">Q</l:l>
+<l:l i="170">q</l:l>
+<l:l i="180">R</l:l>
+<l:l i="180">r</l:l>
+<l:l i="190">S</l:l>
+<l:l i="190">s</l:l>
+<l:l i="200">T</l:l>
+<l:l i="200">t</l:l>
+<l:l i="210">U</l:l>
+<l:l i="210">u</l:l>
+<l:l i="220">V</l:l>
+<l:l i="220">v</l:l>
+<l:l i="230">W</l:l>
+<l:l i="230">w</l:l>
+<l:l i="240">X</l:l>
+<l:l i="240">x</l:l>
+<l:l i="250">Y</l:l>
+<l:l i="250">y</l:l>
+<l:l i="260">Z</l:l>
+<l:l i="260">z</l:l>
+</l:letters>
+</l:l10n>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/pi.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/pi.xml
new file mode 100644
index 0000000..64efdca
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/pi.xml
@@ -0,0 +1,168 @@
+<?xml version="1.0"?>
+
+<reference><info><title>Common Processing Instruction Reference</title>
+ <releaseinfo role="meta">
+ $Id: pi.xsl 8782 2010-07-27 21:15:17Z mzjn $
+ </releaseinfo>
+ </info>
+ <partintro xml:id="partintro">
+ <title>Introduction</title>
+
+<para>This is generated reference documentation for all
+ user-specifiable processing instructions (PIs) in the
+ “common†part of the DocBook XSL stylesheets.
+ <note>
+
+<para>You add these PIs at particular points in a document to
+ cause specific “exceptions†to formatting/output behavior. To
+ make global changes in formatting/output behavior across an
+ entire document, it’s better to do it by setting an
+ appropriate stylesheet parameter (if there is one).</para>
+
+ </note>
+ </para>
+
+ </partintro>
+
+<refentry xmlns:xlink="http://www.w3.org/1999/xlink" xml:id="dbchoice_choice">
+<refnamediv>
+<refname>dbchoice_choice</refname>
+<refpurpose>Generates a localized choice separator</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+
+ <synopsis><tag class="xmlpi">dbchoice choice="and"|"or"|<replaceable>string</replaceable>"</tag></synopsis>
+
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>Use the <tag class="xmlpi">dbchoice choice</tag> PI to
+ generate an appropriate localized “choice†separator (for
+ example, <literal>and</literal> or <literal>or</literal>)
+ before the final item in an inline <tag>simplelist</tag></para>
+
+ <warning>
+
+<para>This PI is a less-than-ideal hack; support for it may
+ disappear in the future (particularly if and when a more
+ appropriate means for marking up "choice" lists becomes
+ available in DocBook).</para>
+
+ </warning>
+ </refsect1><refsect1><title>Parameters</title>
+
+<variablelist>
+ <varlistentry><term>choice="and"</term>
+ <listitem>
+
+<para>generates a localized <literal>and</literal> separator</para>
+
+ </listitem>
+ </varlistentry>
+ <varlistentry><term>choice="or"</term>
+ <listitem>
+
+<para>generates a localized <literal>or</literal> separator</para>
+
+ </listitem>
+ </varlistentry>
+ <varlistentry><term>choice="<replaceable>string</replaceable>"</term>
+ <listitem>
+
+<para>generates a literal <replaceable>string</replaceable> separator</para>
+
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ </refsect1></refentry>
+
+<refentry xmlns:xlink="http://www.w3.org/1999/xlink" xml:id="dbtimestamp">
+<refnamediv>
+<refname>dbtimestamp</refname>
+<refpurpose>Inserts a date timestamp</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+
+ <synopsis><tag class="xmlpi">dbtimestamp format="<replaceable>formatstring</replaceable>" [padding="0"|"1"]</tag></synopsis>
+
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>Use the <tag class="xmlpi">dbtimestamp</tag> PI at any point in a
+ source document to cause a date timestamp (a formatted
+ string representing the current date and time) to be
+ inserted in output of the document.</para>
+
+ </refsect1><refsect1><title>Parameters</title>
+
+<variablelist>
+ <varlistentry><term>format="<replaceable>formatstring</replaceable>"</term>
+ <listitem>
+
+<para>Specifies format in which the date and time are
+ output</para>
+
+ <note>
+
+<para>For details of the content of the format string,
+ see <link role="tcg" xlink:href="Datetime.html">Date and time</link>.</para>
+
+ </note>
+ </listitem>
+ </varlistentry>
+ <varlistentry><term>padding="0"|"1"</term>
+ <listitem>
+
+<para>Specifies padding behavior; if non-zero, padding is is added</para>
+
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ </refsect1></refentry>
+
+<refentry xmlns:xlink="http://www.w3.org/1999/xlink" xml:id="dbtex_delims">
+<refnamediv>
+<refname>dbtex_delims</refname>
+<refpurpose>Generates delimiters around embedded TeX equations
+ in output</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+
+ <synopsis><tag class="xmlpi">dbtex delims="no"|"yes"</tag></synopsis>
+
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>Use the <tag class="xmlpi">dbtex delims</tag> PI as a
+ child of a <tag>textobject</tag> containing embedded TeX
+ markup, to cause that markup to be surrounded by
+ <literal>$</literal> delimiter characters in output.</para>
+
+ <warning>
+
+<para>This feature is useful for print/PDF output only if you
+ use the obsolete and now unsupported PassiveTeX XSL-FO
+ engine.</para>
+
+ </warning>
+ </refsect1><refsect1><title>Parameters</title>
+
+<variablelist>
+ <varlistentry><term>dbtex delims="no"|"yes"</term>
+ <listitem>
+
+<para>Specifies whether delimiters are output</para>
+
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ </refsect1><refsect1 role="params"><title>Related Global Parameters</title>
+
+<para><parameter>tex.math.delims</parameter></para>
+
+ </refsect1></refentry>
+</reference>
+
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/pi.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/pi.xsl
new file mode 100644
index 0000000..42aac0d
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/pi.xsl
@@ -0,0 +1,346 @@
+<?xml version='1.0'?>
+<xsl:stylesheet
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:doc="http://nwalsh.com/xsl/documentation/1.0"
+ xmlns:date="http://exslt.org/dates-and-times"
+ xmlns:exsl="http://exslt.org/common"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ exclude-result-prefixes="doc date exsl"
+ extension-element-prefixes="date exsl"
+ version='1.0'>
+
+<!-- ********************************************************************
+ $Id: pi.xsl 8782 2010-07-27 21:15:17Z mzjn $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<doc:reference xmlns=""><info><title>Common Processing Instruction Reference</title>
+ <releaseinfo role="meta">
+ $Id: pi.xsl 8782 2010-07-27 21:15:17Z mzjn $
+ </releaseinfo>
+ </info>
+ <partintro id="partintro">
+ <title>Introduction</title>
+ <para>This is generated reference documentation for all
+ user-specifiable processing instructions (PIs) in the
+ “common†part of the DocBook XSL stylesheets.
+ <note>
+ <para>You add these PIs at particular points in a document to
+ cause specific “exceptions†to formatting/output behavior. To
+ make global changes in formatting/output behavior across an
+ entire document, it’s better to do it by setting an
+ appropriate stylesheet parameter (if there is one).</para>
+ </note>
+ </para>
+ </partintro>
+</doc:reference>
+
+<!-- ==================================================================== -->
+<doc:pi name="dbchoice_choice" xmlns="">
+ <refpurpose>Generates a localized choice separator</refpurpose>
+ <refdescription id="select.choice.separator-desc">
+ <para>Use the <tag class="xmlpi">dbchoice choice</tag> PI to
+ generate an appropriate localized “choice†separator (for
+ example, <literal>and</literal> or <literal>or</literal>)
+ before the final item in an inline <tag>simplelist</tag></para>
+ <warning>
+ <para>This PI is a less-than-ideal hack; support for it may
+ disappear in the future (particularly if and when a more
+ appropriate means for marking up "choice" lists becomes
+ available in DocBook).</para>
+ </warning>
+ </refdescription>
+ <refsynopsisdiv>
+ <synopsis><tag class="xmlpi">dbchoice choice="and"|"or"|<replaceable>string</replaceable>"</tag></synopsis>
+ </refsynopsisdiv>
+ <refparameter>
+ <variablelist>
+ <varlistentry><term>choice="and"</term>
+ <listitem>
+ <para>generates a localized <literal>and</literal> separator</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry><term>choice="or"</term>
+ <listitem>
+ <para>generates a localized <literal>or</literal> separator</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry><term>choice="<replaceable>string</replaceable>"</term>
+ <listitem>
+ <para>generates a literal <replaceable>string</replaceable> separator</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+</doc:pi>
+<xsl:template name="pi.dbchoice_choice">
+ <xsl:param name="node" select="."/>
+ <xsl:call-template name="pi-attribute">
+ <xsl:with-param name="pis" select="$node/processing-instruction('dbchoice')"/>
+ <xsl:with-param name="attribute">choice</xsl:with-param>
+ </xsl:call-template>
+</xsl:template>
+
+<doc:pi name="dbtimestamp" xmlns="">
+ <refpurpose>Inserts a date timestamp</refpurpose>
+ <refdescription>
+ <para>Use the <tag class="xmlpi">dbtimestamp</tag> PI at any point in a
+ source document to cause a date timestamp (a formatted
+ string representing the current date and time) to be
+ inserted in output of the document.</para>
+ </refdescription>
+ <refsynopsisdiv>
+ <synopsis><tag class="xmlpi">dbtimestamp format="<replaceable>formatstring</replaceable>" [padding="0"|"1"]</tag></synopsis>
+ </refsynopsisdiv>
+ <refparameter>
+ <variablelist>
+ <varlistentry><term>format="<replaceable>formatstring</replaceable>"</term>
+ <listitem>
+ <para>Specifies format in which the date and time are
+ output</para>
+ <note>
+ <para>For details of the content of the format string,
+ see <link role="tcg" xlink:href="Datetime.html"
+ >Date and time</link>.</para>
+ </note>
+ </listitem>
+ </varlistentry>
+ <varlistentry><term>padding="0"|"1"</term>
+ <listitem>
+ <para>Specifies padding behavior; if non-zero, padding is is added</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+</doc:pi>
+<xsl:template name="pi.dbtimestamp">
+ <xsl:variable name="format">
+ <xsl:variable name="pi-format">
+ <xsl:call-template name="pi-attribute">
+ <xsl:with-param name="pis" select="."/>
+ <xsl:with-param name="attribute">format</xsl:with-param>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:choose>
+ <xsl:when test="$pi-format != ''">
+ <xsl:value-of select="$pi-format"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="gentext.template">
+ <xsl:with-param name="context" select="'datetime'"/>
+ <xsl:with-param name="name" select="'format'"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:variable name="padding">
+ <xsl:variable name="pi-padding">
+ <xsl:call-template name="pi-attribute">
+ <xsl:with-param name="pis" select="."/>
+ <xsl:with-param name="attribute">padding</xsl:with-param>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:choose>
+ <xsl:when test="$pi-padding != ''">
+ <xsl:value-of select="$pi-padding"/>
+ </xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:variable name="date">
+ <xsl:choose>
+ <xsl:when test="function-available('date:date-time')">
+ <xsl:value-of select="date:date-time()"/>
+ </xsl:when>
+ <xsl:when test="function-available('date:dateTime')">
+ <!-- Xalan quirk -->
+ <xsl:value-of select="date:dateTime()"/>
+ </xsl:when>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:choose>
+ <xsl:when test="function-available('date:date-time') or
+ function-available('date:dateTime')">
+ <xsl:call-template name="datetime.format">
+ <xsl:with-param name="date" select="$date"/>
+ <xsl:with-param name="format" select="$format"/>
+ <xsl:with-param name="padding" select="$padding"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:message>
+ Timestamp processing requires XSLT processor with EXSLT date support.
+ </xsl:message>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<doc:pi name="dbtex_delims" xmlns="">
+ <refpurpose>Generates delimiters around embedded TeX equations
+ in output</refpurpose>
+ <refdescription>
+ <para>Use the <tag class="xmlpi">dbtex delims</tag> PI as a
+ child of a <tag>textobject</tag> containing embedded TeX
+ markup, to cause that markup to be surrounded by
+ <literal>$</literal> delimiter characters in output.</para>
+ <warning>
+ <para>This feature is useful for print/PDF output only if you
+ use the obsolete and now unsupported PassiveTeX XSL-FO
+ engine.</para>
+ </warning>
+ </refdescription>
+ <refsynopsisdiv>
+ <synopsis><tag class="xmlpi">dbtex delims="no"|"yes"</tag></synopsis>
+ </refsynopsisdiv>
+ <refparameter>
+ <variablelist>
+ <varlistentry><term>dbtex delims="no"|"yes"</term>
+ <listitem>
+ <para>Specifies whether delimiters are output</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+
+ <refsee role="params">
+ <para><parameter>tex.math.delims</parameter></para>
+ </refsee>
+
+</doc:pi>
+<xsl:template name="pi.dbtex_delims">
+ <xsl:param name="node" select="."/>
+ <xsl:call-template name="pi-attribute">
+ <xsl:with-param name="pis" select="$node/processing-instruction('dbtex')"/>
+ <xsl:with-param name="attribute" select="'delims'"/>
+ </xsl:call-template>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="processing-instruction()" mode="titlepage.mode">
+ <!-- * Als process PIs on title pages -->
+ <xsl:apply-templates select="."/>
+</xsl:template>
+
+<xsl:template match="processing-instruction('dbtimestamp')">
+ <xsl:call-template name="pi.dbtimestamp"/>
+</xsl:template>
+
+<xsl:template name="datetime.format">
+ <xsl:param name="date"/>
+ <xsl:param name="format"/>
+ <xsl:param name="padding" select="1"/>
+ <xsl:if test="$format != ''">
+ <!-- replace any whitespace in the format string with a non-breaking space -->
+ <xsl:variable name="format-nbsp"
+ select="translate($format,
+ '&#x20;&#x9;&#xd;&#xa;',
+ '&#xa0;&#xa0;&#xa0;&#xa0;')"/>
+ <xsl:variable name="tokenized-format-string">
+ <xsl:call-template name="str.tokenize.keep.delimiters">
+ <xsl:with-param name="string" select="$format-nbsp"/>
+ <xsl:with-param name="delimiters" select="'&#xa0;,./-()[]:'"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:choose>
+ <xsl:when test="$exsl.node.set.available != 0">
+ <!-- We must preserve context node in order to get valid language -->
+ <xsl:variable name="context" select="."/>
+ <xsl:for-each select="exsl:node-set($tokenized-format-string)/node()">
+ <xsl:variable name="token">
+ <xsl:value-of select="."/>
+ </xsl:variable>
+ <!-- Restore context node -->
+ <xsl:for-each select="$context">
+ <xsl:choose>
+ <xsl:when test="$token = 'a'">
+ <xsl:call-template name="gentext.template">
+ <xsl:with-param name="context" select="'datetime-abbrev'"/>
+ <xsl:with-param name="name" select="date:day-abbreviation($date)"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="$token = 'A'">
+ <xsl:call-template name="gentext.template">
+ <xsl:with-param name="context" select="'datetime-full'"/>
+ <xsl:with-param name="name" select="date:day-name($date)"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="$token = 'b'">
+ <xsl:call-template name="gentext.template">
+ <xsl:with-param name="context" select="'datetime-abbrev'"/>
+ <xsl:with-param name="name" select="date:month-abbreviation($date)"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="$token = 'c'">
+ <xsl:value-of select="date:date($date)"/>
+ <xsl:text> </xsl:text>
+ <xsl:value-of select="date:time($date)"/>
+ </xsl:when>
+ <xsl:when test="$token = 'B'">
+ <xsl:call-template name="gentext.template">
+ <xsl:with-param name="context" select="'datetime-full'"/>
+ <xsl:with-param name="name" select="date:month-name($date)"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="$token = 'd'">
+ <xsl:if test="$padding = 1 and
+ string-length(date:day-in-month($date)) = 1">0</xsl:if>
+ <xsl:value-of select="date:day-in-month($date)"/>
+ </xsl:when>
+ <xsl:when test="$token = 'H'">
+ <xsl:if test="$padding = 1 and string-length(date:hour-in-day($date)) = 1">0</xsl:if>
+ <xsl:value-of select="date:hour-in-day($date)"/>
+ </xsl:when>
+ <xsl:when test="$token = 'j'">
+ <xsl:value-of select="date:day-in-year($date)"/>
+ </xsl:when>
+ <xsl:when test="$token = 'm'">
+ <xsl:if test="$padding = 1 and string-length(date:month-in-year($date)) = 1">0</xsl:if>
+ <xsl:value-of select="date:month-in-year($date)"/>
+ </xsl:when>
+ <xsl:when test="$token = 'M'">
+ <xsl:if test="string-length(date:minute-in-hour($date)) = 1">0</xsl:if>
+ <xsl:value-of select="date:minute-in-hour($date)"/>
+ </xsl:when>
+ <xsl:when test="$token = 'S'">
+ <xsl:if test="string-length(date:second-in-minute($date)) = 1">0</xsl:if>
+ <xsl:value-of select="date:second-in-minute($date)"/>
+ </xsl:when>
+ <xsl:when test="$token = 'U'">
+ <xsl:value-of select="date:week-in-year($date)"/>
+ </xsl:when>
+ <xsl:when test="$token = 'w'">
+ <xsl:value-of select="date:day-in-week($date)"/>
+ </xsl:when>
+ <xsl:when test="$token = 'x'">
+ <xsl:value-of select="date:date($date)"/>
+ </xsl:when>
+ <xsl:when test="$token = 'X'">
+ <xsl:value-of select="date:time($date)"/>
+ </xsl:when>
+ <xsl:when test="$token = 'Y'">
+ <xsl:value-of select="date:year($date)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$token"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:for-each>
+ </xsl:for-each>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:message>
+ Timestamp processing requires an XSLT processor with support
+ for the EXSLT node-set() function.
+ </xsl:message>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:if>
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/pl.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/pl.xml
new file mode 100644
index 0000000..186ed3b
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/pl.xml
@@ -0,0 +1,678 @@
+<?xml version="1.0" encoding="utf-8"?>
+<l:l10n xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0" language="pl" english-language-name="Polish">
+
+<!-- * This file is generated automatically. -->
+<!-- * To submit changes to this file upstream (to the DocBook Project) -->
+<!-- * do not submit an edited version of this file. Instead, submit an -->
+<!-- * edited version of the source file at the following location: -->
+<!-- * -->
+<!-- * https://docbook.svn.sourceforge.net/svnroot/docbook/trunk/gentext/locale/pl.xml -->
+<!-- * -->
+<!-- * E-mail the edited pl.xml source file to: -->
+<!-- * -->
+<!-- * docbook-developers@lists.sourceforge.net -->
+
+<!-- ******************************************************************** -->
+
+<!-- This file is part of the XSL DocBook Stylesheet distribution. -->
+<!-- See ../README or http://docbook.sf.net/release/xsl/current/ for -->
+<!-- copyright and other information. -->
+
+<!-- ******************************************************************** -->
+<!-- In these files, % with a letter is used for a placeholder: -->
+<!-- %t is the current element's title -->
+<!-- %s is the current element's subtitle (if applicable)-->
+<!-- %n is the current element's number label-->
+<!-- %p is the current element's page number (if applicable)-->
+<!-- ******************************************************************** -->
+
+
+<l:gentext key="Abstract" text="Abstrakt"/>
+<l:gentext key="abstract" text="abstrakt"/>
+<l:gentext key="Acknowledgements" text="Podziękowania"/>
+<l:gentext key="acknowledgements" text="podziękowania"/>
+<l:gentext key="Answer" text="Odp.:"/>
+<l:gentext key="answer" text="odp.:"/>
+<l:gentext key="Appendix" text="Dodatek"/>
+<l:gentext key="appendix" text="dodatek"/>
+<l:gentext key="Article" text="Artykuł"/>
+<l:gentext key="article" text="artykuł"/>
+<l:gentext key="Author" text="Autor"/>
+<l:gentext key="Bibliography" text="Bibliografia"/>
+<l:gentext key="bibliography" text="bibliografia"/>
+<l:gentext key="Book" text="Książka"/>
+<l:gentext key="book" text="książka"/>
+<l:gentext key="CAUTION" text="OSTRZEŻENIE"/>
+<l:gentext key="Caution" text="Ostrzeżenie"/>
+<l:gentext key="caution" text="ostrzeżenie"/>
+<l:gentext key="Chapter" text="Rozdział"/>
+<l:gentext key="chapter" text="rozdział"/>
+<l:gentext key="Colophon" text="Kolofon"/>
+<l:gentext key="colophon" text="kolofon"/>
+<l:gentext key="Copyright" text="Copyright"/>
+<l:gentext key="copyright" text="Copyright"/>
+<l:gentext key="Dedication" text="Dedykacja"/>
+<l:gentext key="dedication" text="dedykacja"/>
+<l:gentext key="Edition" text="Wydanie"/>
+<l:gentext key="edition" text="wydanie"/>
+<l:gentext key="Editor" text="Redaktor"/>
+<l:gentext key="Equation" text="Równanie"/>
+<l:gentext key="equation" text="równanie"/>
+<l:gentext key="Example" text="Przykład"/>
+<l:gentext key="example" text="przykład"/>
+<l:gentext key="Figure" text="Rysunek"/>
+<l:gentext key="figure" text="rysunek"/>
+<l:gentext key="Glossary" text="Glosariusz"/>
+<l:gentext key="glossary" text="glosariusz"/>
+<l:gentext key="GlossSee" text="Patrz"/>
+<l:gentext key="glosssee" text="patrz"/>
+<l:gentext key="GlossSeeAlso" text="Patrz też"/>
+<l:gentext key="glossseealso" text="patrz też"/>
+<l:gentext key="IMPORTANT" text="WAŻNE"/>
+<l:gentext key="important" text="ważne"/>
+<l:gentext key="Important" text="Ważne"/>
+<l:gentext key="Index" text="Indeks"/>
+<l:gentext key="index" text="indeks"/>
+<l:gentext key="ISBN" text="ISBN"/>
+<l:gentext key="isbn" text="ISBN"/>
+<l:gentext key="LegalNotice" text="Informacja Prawna"/>
+<l:gentext key="legalnotice" text="informacja prawna"/>
+<l:gentext key="MsgAud" text="Odbiorcy"/>
+<l:gentext key="msgaud" text="odbiorcy"/>
+<l:gentext key="MsgLevel" text="Poziom"/>
+<l:gentext key="msglevel" text="poziom"/>
+<l:gentext key="MsgOrig" text="Nadawca"/>
+<l:gentext key="msgorig" text="nadawca"/>
+<l:gentext key="NOTE" text="UWAGA"/>
+<l:gentext key="Note" text="Uwaga"/>
+<l:gentext key="note" text="uwaga"/>
+<l:gentext key="Part" text="Część"/>
+<l:gentext key="part" text="część"/>
+<l:gentext key="Preface" text="Przedmowa"/>
+<l:gentext key="preface" text="przedmowa"/>
+<l:gentext key="Procedure" text="Procedura"/>
+<l:gentext key="procedure" text="procedura"/>
+<l:gentext key="ProductionSet" text="Produkcja"/>
+<l:gentext key="PubDate" text="Data wydania"/>
+<l:gentext key="pubdate" text="data wydania"/>
+<l:gentext key="Published" text="Wydano"/>
+<l:gentext key="published" text="wydano"/>
+<l:gentext key="Publisher" text="Wydawca"/>
+<l:gentext key="Qandadiv" text="Pytania i odpowiedzi"/>
+<l:gentext key="qandadiv" text="Pytania i odpowiedzi"/>
+<l:gentext key="QandASet" text="Najczęściej zadawane pytania"/>
+<l:gentext key="Question" text="Pyt.:"/>
+<l:gentext key="question" text="Pyt.:"/>
+<l:gentext key="RefEntry" text="Strona"/>
+<l:gentext key="refentry" text="strona"/>
+<l:gentext key="Reference" text="Materiały źródłowe"/>
+<l:gentext key="reference" text="Materiały źródłowe"/>
+<l:gentext key="References" text="Materiały źródłowe"/>
+<l:gentext key="RefName" text="Nazwa"/>
+<l:gentext key="refname" text="nazwa"/>
+<l:gentext key="RefSection" text="Sekcja"/>
+<l:gentext key="refsection" text="sekcja"/>
+<l:gentext key="RefSynopsisDiv" text="Streszczenie"/>
+<l:gentext key="refsynopsisdiv" text="streszczenie"/>
+<l:gentext key="RevHistory" text="Historia zmian"/>
+<l:gentext key="revhistory" text="Historia zmian"/>
+<l:gentext key="revision" text="Zmiana"/>
+<l:gentext key="Revision" text="Zmiana"/>
+<l:gentext key="sect1" text="Sekcja"/>
+<l:gentext key="sect2" text="Sekcja"/>
+<l:gentext key="sect3" text="Sekcja"/>
+<l:gentext key="sect4" text="Sekcja"/>
+<l:gentext key="sect5" text="Sekcja"/>
+<l:gentext key="section" text="sekcja"/>
+<l:gentext key="Section" text="Sekcja"/>
+<l:gentext key="see" text="patrz"/>
+<l:gentext key="See" text="Patrz"/>
+<l:gentext key="seealso" text="patrz też"/>
+<l:gentext key="Seealso" text="Patrz też"/>
+<l:gentext key="SeeAlso" text="Patrz też"/>
+<l:gentext key="set" text="zestaw"/>
+<l:gentext key="Set" text="Zestaw"/>
+<l:gentext key="setindex" text="Indeks"/>
+<l:gentext key="SetIndex" text="Indeks"/>
+<l:gentext key="Sidebar" text="Panel boczny"/>
+<l:gentext key="sidebar" text="panel boczny"/>
+<l:gentext key="step" text="krok"/>
+<l:gentext key="Step" text="Krok"/>
+<l:gentext key="table" text="Tabela"/>
+<l:gentext key="Table" text="Tabela"/>
+<l:gentext key="task" text="zadanie"/>
+<l:gentext key="Task" text="Zadanie"/>
+<l:gentext key="tip" text="podpowiedź"/>
+<l:gentext key="TIP" text="PODPOWIEDŹ"/>
+<l:gentext key="Tip" text="Podpowiedź"/>
+<l:gentext key="Warning" text="Ostrzeżenie"/>
+<l:gentext key="warning" text="ostrzeżenie"/>
+<l:gentext key="WARNING" text="OSTRZEŻENIE"/>
+<l:gentext key="and" text="i"/>
+<l:gentext key="by" text="autorstwa"/>
+<l:gentext key="Edited" text="Redakcja"/>
+<l:gentext key="edited" text="redakcja"/>
+<l:gentext key="Editedby" text="Redakcja: "/>
+<l:gentext key="editedby" text="Redakcja: "/>
+<l:gentext key="in" text="w"/>
+<l:gentext key="lastlistcomma" text=","/>
+<l:gentext key="listcomma" text=","/>
+<l:gentext key="notes" text="przypisy"/>
+<l:gentext key="Notes" text="Przypisy"/>
+<l:gentext key="Pgs" text="S."/>
+<l:gentext key="pgs" text="s."/>
+<l:gentext key="Revisedby" text="Korekta: "/>
+<l:gentext key="revisedby" text="korekta: "/>
+<l:gentext key="TableNotes" text="Przypisy"/>
+<l:gentext key="tablenotes" text="przypisy"/>
+<l:gentext key="TableofContents" text="Spis treści"/>
+<l:gentext key="tableofcontents" text="spis treści"/>
+<l:gentext key="unexpectedelementname" text="Nieoczekiwana nazwa elementu"/>
+<l:gentext key="unsupported" text="niewspierane"/>
+<l:gentext key="xrefto" text="xref do"/>
+<l:gentext key="Authors" text="Autorzy"/>
+<l:gentext key="copyeditor" text="Redaktor kopii"/>
+<l:gentext key="graphicdesigner" text="Projektant graficzny"/>
+<l:gentext key="productioneditor" text="Redaktor produkcji"/>
+<l:gentext key="technicaleditor" text="Redaktor techniczny"/>
+<l:gentext key="translator" text="TÅ‚umacz"/>
+<l:gentext key="listofequations" text="spis równań"/>
+<l:gentext key="ListofEquations" text="Spis równań"/>
+<l:gentext key="ListofExamples" text="Spis przykładów"/>
+<l:gentext key="listofexamples" text="spis przykładów"/>
+<l:gentext key="ListofFigures" text="Spis rysunków"/>
+<l:gentext key="listoffigures" text="spis rysunków"/>
+<l:gentext key="ListofProcedures" text="Spis procedur"/>
+<l:gentext key="listofprocedures" text="spis procedur"/>
+<l:gentext key="listoftables" text="spis tabel"/>
+<l:gentext key="ListofTables" text="Spis tabel"/>
+<l:gentext key="ListofUnknown" text="Spis nieznanych"/>
+<l:gentext key="listofunknown" text="spis nieznanych"/>
+<l:gentext key="nav-home" text="Spis treści"/>
+<l:gentext key="nav-next" text="Następny"/>
+<l:gentext key="nav-next-sibling" text="Następny rozdział"/>
+<l:gentext key="nav-prev" text="Poprzedni"/>
+<l:gentext key="nav-prev-sibling" text="Poprzedni rozdział"/>
+<l:gentext key="nav-up" text="Początek rozdziału"/>
+<l:gentext key="nav-toc" text="Spis treści"/>
+<l:gentext key="Draft" text="Szkic"/>
+<l:gentext key="above" text="powyżej"/>
+<l:gentext key="below" text="poniżej"/>
+<l:gentext key="sectioncalled" text="sekcja o nazwie"/>
+<l:gentext key="index symbols" text="Symbole"/>
+<l:gentext key="writing-mode" text="lr-tb"/>
+<l:gentext key="lowercase.alpha" text="aąbcćdeęfghijklłmnńoópqrsśtuvwxyzźż"/>
+<l:gentext key="uppercase.alpha" text="AÄ„BCĆDEĘFGHIJKLÅMNŃOÓPQRSÅšTUVWXYZŹŻ"/>
+<l:gentext key="normalize.sort.input" text="AaÀàÃáÂâÃãÄäÅåĀÄĂ㥹ÇǎǞǟǠǡǺǻȀÈȂȃȦȧḀá¸áºšáº áº¡áº¢áº£áº¤áº¥áº¦áº§áº¨áº©áºªáº«áº¬áº­áº®áº¯áº°áº±áº²áº³áº´áºµáº¶áº·BbÆ€ÆɓƂƃḂḃḄḅḆḇCcÇçĆćĈĉĊċČÄƇƈɕḈḉDdÄŽÄÄđƊɗƋƌDžDzȡɖḊḋḌá¸á¸Žá¸á¸á¸‘ḒḓEeÈèÉéÊêËëĒēĔĕĖėĘęĚěȄȅȆȇȨȩḔḕḖḗḘḙḚḛḜá¸áº¸áº¹áººáº»áº¼áº½áº¾áº¿á»€á»á»‚ểỄễỆệFfƑƒḞḟGgÄœÄĞğĠġĢģƓɠǤǥǦǧǴǵḠḡHhĤĥĦħȞȟɦḢḣḤḥḦḧḨḩḪḫẖIiÌìÃíÎîÃïĨĩĪīĬĭĮįİƗɨÇÇȈȉȊȋḬḭḮḯỈỉỊịJjĴĵǰÊKkĶķƘƙǨǩḰḱḲḳḴḵLlĹĺĻļĽľĿŀÅłƚLjȴɫɬɭḶḷḸḹḺḻḼḽMmɱḾḿṀá¹á¹‚ṃNnÑñŃńŅņŇňÆɲƞȠNjǸǹȵɳṄṅṆṇṈṉṊṋOoÒòÓóÔôÕõÖöØøŌÅÅŽÅÅőƟƠơǑǒǪǫǬǭǾǿȌÈÈŽÈȪȫȬȭȮȯȰȱṌá¹á¹Žá¹á¹á¹‘ṒṓỌá»á»Žá»á»á»‘ỒồỔổỖỗỘộỚớỜá»á»žá»Ÿá» á»¡á»¢á»£PpƤƥṔṕṖṗQqÊ RrŔŕŖŗŘřÈȑȒȓɼɽɾṘṙṚṛṜá¹á¹žá¹ŸSsŚśŜÅŞşŠšȘșʂṠṡṢṣṤṥṦṧṨṩTtŢţŤťŦŧƫƬƭƮʈȚțȶṪṫṬṭṮṯṰṱẗUuÙùÚúÛûÜüŨũŪūŬŭŮůŰűŲųƯưǓǔǕǖǗǘǙǚǛǜȔȕȖȗṲṳṴṵṶṷṸṹṺṻỤụỦủỨứỪừỬửỮữỰựVvƲʋṼṽṾṿWwŴŵẀáºáº‚ẃẄẅẆẇẈẉẘXxẊẋẌáºYyÃýÿŸŶŷƳƴȲȳẎáºáº™á»²á»³á»´á»µá»¶á»·á»¸á»¹ZzŹźŻżŽžƵƶȤȥÊÊ‘áºáº‘ẒẓẔẕẕ" lang="en"/>
+<l:gentext key="normalize.sort.output" text="AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBCCCCCCCCCCCCCCCCCDDDDDDDDDDDDDDDDDDDDDDDDEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEFFFFFFGGGGGGGGGGGGGGGGGGGGHHHHHHHHHHHHHHHHHHHHIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIJJJJJJKKKKKKKKKKKKKKLLLLLLLLLLLLLLLLLLLLLLLLLLMMMMMMMMMNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOPPPPPPPPQQQRRRRRRRRRRRRRRRRRRRRRRRSSSSSSSSSSSSSSSSSSSSSSSTTTTTTTTTTTTTTTTTTTTTTTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUVVVVVVVVWWWWWWWWWWWWWWWXXXXXXYYYYYYYYYYYYYYYYYYYYYYYZZZZZZZZZZZZZZZZZZZZZ" lang="en"/>
+<l:dingbat key="startquote" text="„"/>
+<l:dingbat key="endquote" text="â€"/>
+<l:dingbat key="nestedstartquote" text="«"/>
+<l:dingbat key="nestedendquote" text="»"/>
+<l:dingbat key="singlestartquote" text="‘" lang="en"/>
+<l:dingbat key="singleendquote" text="’" lang="en"/>
+<l:dingbat key="bullet" text="ߦ"/>
+<l:gentext key="hyphenation-character" text="-" lang="en"/>
+<l:gentext key="hyphenation-push-character-count" text="2" lang="en"/>
+<l:gentext key="hyphenation-remain-character-count" text="2" lang="en"/>
+<l:context name="styles"><l:template name="person-name" text="first-last"/>
+</l:context>
+<l:context name="title"><l:template name="abstract" text="%t"/>
+<l:template name="acknowledgements" text="%t" lang="en"/>
+<l:template name="answer" text="%t"/>
+<l:template name="appendix" text="Dodatek %n. %t"/>
+<l:template name="article" text="%t"/>
+<l:template name="authorblurb" text="%t"/>
+<l:template name="bibliodiv" text="%t"/>
+<l:template name="biblioentry" text="%t"/>
+<l:template name="bibliography" text="%t"/>
+<l:template name="bibliolist" text="%t" lang="en"/>
+<l:template name="bibliomixed" text="%t"/>
+<l:template name="bibliomset" text="%t"/>
+<l:template name="biblioset" text="%t"/>
+<l:template name="blockquote" text="%t"/>
+<l:template name="book" text="%t"/>
+<l:template name="calloutlist" text="%t"/>
+<l:template name="caution" text="%t"/>
+<l:template name="chapter" text="Rozdział %n. %t"/>
+<l:template name="colophon" text="%t"/>
+<l:template name="dedication" text="%t"/>
+<l:template name="equation" text="Równanie %n. %t"/>
+<l:template name="example" text="Przykład %n. %t"/>
+<l:template name="figure" text="Rysunek %n. %t"/>
+<l:template name="foil" text="%t" lang="en"/>
+<l:template name="foilgroup" text="%t" lang="en"/>
+<l:template name="formalpara" text="%t"/>
+<l:template name="glossary" text="%t"/>
+<l:template name="glossdiv" text="%t"/>
+<l:template name="glosslist" text="%t" lang="en"/>
+<l:template name="glossentry" text="%t" lang="en"/>
+<l:template name="important" text="%t"/>
+<l:template name="index" text="%t"/>
+<l:template name="indexdiv" text="%t"/>
+<l:template name="itemizedlist" text="%t"/>
+<l:template name="legalnotice" text="%t"/>
+<l:template name="listitem" text=""/>
+<l:template name="lot" text="%t"/>
+<l:template name="msg" text="%t"/>
+<l:template name="msgexplan" text="%t"/>
+<l:template name="msgmain" text="%t"/>
+<l:template name="msgrel" text="%t"/>
+<l:template name="msgset" text="%t"/>
+<l:template name="msgsub" text="%t"/>
+<l:template name="note" text="%t"/>
+<l:template name="orderedlist" text="%t"/>
+<l:template name="part" text="Część %n. %t"/>
+<l:template name="partintro" text="%t"/>
+<l:template name="preface" text="%t"/>
+<l:template name="procedure" text="%t"/>
+<l:template name="procedure.formal" text="Procedura %n. %t"/>
+<l:template name="productionset" text="%t"/>
+<l:template name="productionset.formal" text="Produkcja %n"/>
+<l:template name="qandadiv" text="%t"/>
+<l:template name="qandaentry" text="%t"/>
+<l:template name="qandaset" text="%t"/>
+<l:template name="question" text="%t"/>
+<l:template name="refentry" text="%t"/>
+<l:template name="reference" text="%t"/>
+<l:template name="refsection" text="%t"/>
+<l:template name="refsect1" text="%t"/>
+<l:template name="refsect2" text="%t"/>
+<l:template name="refsect3" text="%t"/>
+<l:template name="refsynopsisdiv" text="%t"/>
+<l:template name="refsynopsisdivinfo" text="%t"/>
+<l:template name="segmentedlist" text="%t"/>
+<l:template name="set" text="%t"/>
+<l:template name="setindex" text="%t"/>
+<l:template name="sidebar" text="%t"/>
+<l:template name="step" text="%t"/>
+<l:template name="table" text="Tabela %n. %t"/>
+<l:template name="task" text="%t" lang="en"/>
+<l:template name="tasksummary" text="%t" lang="en"/>
+<l:template name="taskprerequisites" text="%t" lang="en"/>
+<l:template name="taskrelated" text="%t" lang="en"/>
+<l:template name="tip" text="%t"/>
+<l:template name="toc" text="%t"/>
+<l:template name="variablelist" text="%t"/>
+<l:template name="varlistentry" text="" lang="en"/>
+<l:template name="warning" text="%t"/>
+</l:context>
+<l:context name="title-unnumbered"><l:template name="appendix" text="%t"/>
+<l:template name="article/appendix" text="%t" lang="en"/>
+<l:template name="bridgehead" text="%t"/>
+<l:template name="chapter" text="%t"/>
+<l:template name="sect1" text="%t"/>
+<l:template name="sect2" text="%t"/>
+<l:template name="sect3" text="%t"/>
+<l:template name="sect4" text="%t"/>
+<l:template name="sect5" text="%t"/>
+<l:template name="section" text="%t"/>
+<l:template name="simplesect" text="%t"/>
+<l:template name="part" text="%t" lang="en"/>
+</l:context>
+<l:context name="title-numbered"><l:template name="appendix" text="Dodatek %n. %t"/>
+<l:template name="article/appendix" text="%n. %t" lang="en"/>
+<l:template name="bridgehead" text="%t"/>
+<l:template name="chapter" text="Rozdział %n. %t"/>
+<l:template name="part" text="Część %n. %t"/>
+<l:template name="sect1" text="%n. %t"/>
+<l:template name="sect2" text="%n. %t"/>
+<l:template name="sect3" text="%n. %t"/>
+<l:template name="sect4" text="%n. %t"/>
+<l:template name="sect5" text="%n. %t"/>
+<l:template name="section" text="%n. %t"/>
+<l:template name="simplesect" text="%n. %t"/>
+</l:context>
+<l:context name="subtitle"><l:template name="appendix" text="%s"/>
+<l:template name="acknowledgements" text="%s" lang="en"/>
+<l:template name="article" text="%s"/>
+<l:template name="bibliodiv" text="%s"/>
+<l:template name="biblioentry" text="%s"/>
+<l:template name="bibliography" text="%s"/>
+<l:template name="bibliomixed" text="%s"/>
+<l:template name="bibliomset" text="%s"/>
+<l:template name="biblioset" text="%s"/>
+<l:template name="book" text="%s"/>
+<l:template name="chapter" text="%s"/>
+<l:template name="colophon" text="%s"/>
+<l:template name="dedication" text="%s"/>
+<l:template name="glossary" text="%s"/>
+<l:template name="glossdiv" text="%s"/>
+<l:template name="index" text="%s"/>
+<l:template name="indexdiv" text="%s"/>
+<l:template name="lot" text="%s"/>
+<l:template name="part" text="%s"/>
+<l:template name="partintro" text="%s"/>
+<l:template name="preface" text="%s"/>
+<l:template name="refentry" text="%s"/>
+<l:template name="reference" text="%s"/>
+<l:template name="refsection" text="%s"/>
+<l:template name="refsect1" text="%s"/>
+<l:template name="refsect2" text="%s"/>
+<l:template name="refsect3" text="%s"/>
+<l:template name="refsynopsisdiv" text="%s"/>
+<l:template name="sect1" text="%s"/>
+<l:template name="sect2" text="%s"/>
+<l:template name="sect3" text="%s"/>
+<l:template name="sect4" text="%s"/>
+<l:template name="sect5" text="%s"/>
+<l:template name="section" text="%s"/>
+<l:template name="set" text="%s"/>
+<l:template name="setindex" text="%s"/>
+<l:template name="sidebar" text="%s"/>
+<l:template name="simplesect" text="%s"/>
+<l:template name="toc" text="%s"/>
+</l:context>
+<l:context name="xref"><l:template name="abstract" text="%t"/>
+<l:template name="acknowledgements" text="%t" lang="en"/>
+<l:template name="answer" text="Odp.: %n"/>
+<l:template name="appendix" text="%t"/>
+<l:template name="article" text="%t"/>
+<l:template name="authorblurb" text="%t"/>
+<l:template name="bibliodiv" text="%t"/>
+<l:template name="bibliography" text="%t"/>
+<l:template name="bibliomset" text="%t"/>
+<l:template name="biblioset" text="%t"/>
+<l:template name="blockquote" text="%t"/>
+<l:template name="book" text="%t"/>
+<l:template name="calloutlist" text="%t"/>
+<l:template name="caution" text="%t"/>
+<l:template name="chapter" text="%t"/>
+<l:template name="colophon" text="%t"/>
+<l:template name="constraintdef" text="%t"/>
+<l:template name="dedication" text="%t"/>
+<l:template name="equation" text="%t"/>
+<l:template name="example" text="%t"/>
+<l:template name="figure" text="%t"/>
+<l:template name="foil" text="%t" lang="en"/>
+<l:template name="foilgroup" text="%t" lang="en"/>
+<l:template name="formalpara" text="%t"/>
+<l:template name="glossary" text="%t"/>
+<l:template name="glossdiv" text="%t"/>
+<l:template name="important" text="%t"/>
+<l:template name="index" text="%t"/>
+<l:template name="indexdiv" text="%t"/>
+<l:template name="itemizedlist" text="%t"/>
+<l:template name="legalnotice" text="%t"/>
+<l:template name="listitem" text="%n"/>
+<l:template name="lot" text="%t"/>
+<l:template name="msg" text="%t"/>
+<l:template name="msgexplan" text="%t"/>
+<l:template name="msgmain" text="%t"/>
+<l:template name="msgrel" text="%t"/>
+<l:template name="msgset" text="%t"/>
+<l:template name="msgsub" text="%t"/>
+<l:template name="note" text="%t"/>
+<l:template name="orderedlist" text="%t"/>
+<l:template name="part" text="%t"/>
+<l:template name="partintro" text="%t"/>
+<l:template name="preface" text="%t"/>
+<l:template name="procedure" text="%t"/>
+<l:template name="productionset" text="%t"/>
+<l:template name="qandadiv" text="%t"/>
+<l:template name="qandaentry" text="Pyt.: %n"/>
+<l:template name="qandaset" text="%t"/>
+<l:template name="question" text="Pyt.: %n"/>
+<l:template name="reference" text="%t"/>
+<l:template name="refsynopsisdiv" text="%t"/>
+<l:template name="segmentedlist" text="%t"/>
+<l:template name="set" text="%t"/>
+<l:template name="setindex" text="%t"/>
+<l:template name="sidebar" text="%t"/>
+<l:template name="table" text="%t"/>
+<l:template name="task" text="%t" lang="en"/>
+<l:template name="tip" text="%t"/>
+<l:template name="toc" text="%t"/>
+<l:template name="variablelist" text="%t"/>
+<l:template name="varlistentry" text="%n"/>
+<l:template name="warning" text="%t"/>
+<l:template name="olink.document.citation" text=" in %o" lang="en"/>
+<l:template name="olink.page.citation" text=" (page %p)" lang="en"/>
+<l:template name="page.citation" text=" [%p]"/>
+<l:template name="page" text="(page %p)" lang="en"/>
+<l:template name="docname" text=" in %o" lang="en"/>
+<l:template name="docnamelong" text=" in the document titled %o" lang="en"/>
+<l:template name="pageabbrev" text="(p. %p)" lang="en"/>
+<l:template name="Page" text="Page %p" lang="en"/>
+<l:template name="bridgehead" text="„%tâ€"/>
+<l:template name="refsection" text="„%tâ€"/>
+<l:template name="refsect1" text="„%tâ€"/>
+<l:template name="refsect2" text="„%tâ€"/>
+<l:template name="refsect3" text="„%tâ€"/>
+<l:template name="sect1" text="„%tâ€"/>
+<l:template name="sect2" text="„%tâ€"/>
+<l:template name="sect3" text="„%tâ€"/>
+<l:template name="sect4" text="„%tâ€"/>
+<l:template name="sect5" text="„%tâ€"/>
+<l:template name="section" text="„%tâ€"/>
+<l:template name="simplesect" text="„%tâ€"/>
+</l:context>
+<l:context name="xref-number"><l:template name="answer" text="Odp.: %n"/>
+<l:template name="appendix" text="Dodatek %n"/>
+<l:template name="bridgehead" text="Sekcja %n"/>
+<l:template name="chapter" text="Rozdział %n"/>
+<l:template name="equation" text="Równanie %n"/>
+<l:template name="example" text="Przykład %n"/>
+<l:template name="figure" text="Rysunek %n"/>
+<l:template name="part" text="Część %n"/>
+<l:template name="procedure" text="Procedura %n"/>
+<l:template name="productionset" text="Produkcja %n"/>
+<l:template name="qandadiv" text="Pytania i odpowiedzi %n"/>
+<l:template name="qandaentry" text="Pyt.: %n"/>
+<l:template name="question" text="Pyt.: %n"/>
+<l:template name="sect1" text="Sekcja %n"/>
+<l:template name="sect2" text="Sekcja %n"/>
+<l:template name="sect3" text="Sekcja %n"/>
+<l:template name="sect4" text="Sekcja %n"/>
+<l:template name="sect5" text="Sekcja %n"/>
+<l:template name="section" text="Sekcja %n"/>
+<l:template name="table" text="Tabela %n"/>
+</l:context>
+<l:context name="xref-number-and-title"><l:template name="appendix" text="Dodatek %n, %t"/>
+<l:template name="bridgehead" text="Sekcja %n, „%tâ€"/>
+<l:template name="chapter" text="Rozdział %n, %t"/>
+<l:template name="equation" text="Równanie %n, „%tâ€"/>
+<l:template name="example" text="PrzykÅ‚ad %n, „%tâ€"/>
+<l:template name="figure" text="Rysunek %n, „%tâ€"/>
+<l:template name="part" text="Część %n, „%tâ€"/>
+<l:template name="procedure" text="Procedura %n, „%tâ€"/>
+<l:template name="productionset" text="Produkcja %n, „%tâ€"/>
+<l:template name="qandadiv" text="Pytania i odpowiedzi %n, „%tâ€"/>
+<l:template name="refsect1" text="sekcja o nazwie „%tâ€"/>
+<l:template name="refsect2" text="sekcja o nazwie „%tâ€"/>
+<l:template name="refsect3" text="sekcja o nazwie „%tâ€"/>
+<l:template name="refsection" text="sekcja o nazwie „%tâ€"/>
+<l:template name="sect1" text="Sekcja %n, „%tâ€"/>
+<l:template name="sect2" text="Sekcja %n, „%tâ€"/>
+<l:template name="sect3" text="Sekcja %n, „%tâ€"/>
+<l:template name="sect4" text="Sekcja %n, „%tâ€"/>
+<l:template name="sect5" text="Sekcja %n, „%tâ€"/>
+<l:template name="section" text="Sekcja %n, „%tâ€"/>
+<l:template name="simplesect" text="sekcja o nazwie „%tâ€"/>
+<l:template name="table" text="Tabela %n, „%tâ€"/>
+</l:context>
+<l:context name="authorgroup"><l:template name="sep" text=", "/>
+<l:template name="sep2" text=" i "/>
+<l:template name="seplast" text=", i "/>
+</l:context>
+<l:context name="glossary"><l:template name="see" text="Patrz %t."/>
+<l:template name="seealso" text="Patrz też %t."/>
+<l:template name="seealso-separator" text=", "/>
+</l:context>
+<l:context name="msgset"><l:template name="MsgAud" text="Odbiorcy: "/>
+<l:template name="MsgLevel" text="Poziom: "/>
+<l:template name="MsgOrig" text="Nadawca: "/>
+</l:context>
+<l:context name="datetime"><l:template name="format" text="m/d/Y"/>
+</l:context>
+<l:context name="termdef"><l:template name="prefix" text="[Definicja: "/>
+<l:template name="suffix" text="]"/>
+</l:context>
+<l:context name="datetime-full"><l:template name="January" text="styczeń"/>
+<l:template name="February" text="luty"/>
+<l:template name="March" text="marzec"/>
+<l:template name="April" text="kwiecień"/>
+<l:template name="May" text="maj"/>
+<l:template name="June" text="czerwiec"/>
+<l:template name="July" text="lipiec"/>
+<l:template name="August" text="sierpień"/>
+<l:template name="September" text="wrzesień"/>
+<l:template name="October" text="październik"/>
+<l:template name="November" text="listopad"/>
+<l:template name="December" text="grudzień"/>
+<l:template name="Monday" text="poniedziałek"/>
+<l:template name="Tuesday" text="wtorek"/>
+<l:template name="Wednesday" text="środa"/>
+<l:template name="Thursday" text="czwartek"/>
+<l:template name="Friday" text="piÄ…tek"/>
+<l:template name="Saturday" text="sobota"/>
+<l:template name="Sunday" text="niedziela"/>
+</l:context>
+<l:context name="datetime-abbrev"><l:template name="Jan" text="sty"/>
+<l:template name="Feb" text="lut"/>
+<l:template name="Mar" text="mar"/>
+<l:template name="Apr" text="kwi"/>
+<l:template name="May" text="maj"/>
+<l:template name="Jun" text="cze"/>
+<l:template name="Jul" text="lip"/>
+<l:template name="Aug" text="sie"/>
+<l:template name="Sep" text="wrz"/>
+<l:template name="Oct" text="paź"/>
+<l:template name="Nov" text="lis"/>
+<l:template name="Dec" text="gru"/>
+<l:template name="Mon" text="pon"/>
+<l:template name="Tue" text="wto"/>
+<l:template name="Wed" text="śro"/>
+<l:template name="Thu" text="czw"/>
+<l:template name="Fri" text="piÄ…"/>
+<l:template name="Sat" text="sob"/>
+<l:template name="Sun" text="nie"/>
+</l:context>
+<l:context name="htmlhelp"><l:template name="langcode" text="0x0415 Polish"/>
+</l:context>
+<l:context name="index"><l:template name="term-separator" text=", "/>
+<l:template name="number-separator" text=", "/>
+<l:template name="range-separator" text="-"/>
+</l:context>
+<l:context name="iso690"><l:template name="lastfirst.sep" text=", "/>
+<l:template name="alt.person.two.sep" text=" – "/>
+<l:template name="alt.person.last.sep" text=" – "/>
+<l:template name="alt.person.more.sep" text=" – "/>
+<l:template name="primary.editor" text=" (ed.)"/>
+<l:template name="primary.many" text=", et al."/>
+<l:template name="primary.sep" text=". "/>
+<l:template name="submaintitle.sep" text=": "/>
+<l:template name="title.sep" text=". "/>
+<l:template name="othertitle.sep" text=", "/>
+<l:template name="medium1" text=" ["/>
+<l:template name="medium2" text="]"/>
+<l:template name="secondary.person.sep" text="; "/>
+<l:template name="secondary.sep" text=". "/>
+<l:template name="respons.sep" text=". "/>
+<l:template name="edition.sep" text=". "/>
+<l:template name="edition.serial.sep" text=", "/>
+<l:template name="issuing.range" text="-"/>
+<l:template name="issuing.div" text=", "/>
+<l:template name="issuing.sep" text=". "/>
+<l:template name="partnr.sep" text=". "/>
+<l:template name="placepubl.sep" text=": "/>
+<l:template name="publyear.sep" text=", "/>
+<l:template name="pubinfo.sep" text=". "/>
+<l:template name="spec.pubinfo.sep" text=", "/>
+<l:template name="upd.sep" text=", "/>
+<l:template name="datecit1" text=" [cited "/>
+<l:template name="datecit2" text="]"/>
+<l:template name="extent.sep" text=". "/>
+<l:template name="locs.sep" text=", "/>
+<l:template name="location.sep" text=". "/>
+<l:template name="serie.sep" text=". "/>
+<l:template name="notice.sep" text=". "/>
+<l:template name="access" text="Available "/>
+<l:template name="acctoo" text="Also available "/>
+<l:template name="onwww" text="from World Wide Web"/>
+<l:template name="oninet" text="from Internet"/>
+<l:template name="access.end" text=": "/>
+<l:template name="link1" text="&lt;"/>
+<l:template name="link2" text="&gt;"/>
+<l:template name="access.sep" text=". "/>
+<l:template name="isbn" text="ISBN "/>
+<l:template name="issn" text="ISSN "/>
+<l:template name="stdnum.sep" text=". "/>
+<l:template name="patcountry.sep" text=". "/>
+<l:template name="pattype.sep" text=", "/>
+<l:template name="patnum.sep" text=". "/>
+<l:template name="patdate.sep" text=". "/>
+</l:context><l:letters><l:l i="-1"/>
+<l:l i="0">Symbole</l:l>
+<l:l i="10">A</l:l>
+<l:l i="10">a</l:l>
+<l:l i="20">Ä„</l:l>
+<l:l i="20">Ä…</l:l>
+<l:l i="30">B</l:l>
+<l:l i="30">b</l:l>
+<l:l i="40">C</l:l>
+<l:l i="40">c</l:l>
+<l:l i="50">Ć</l:l>
+<l:l i="50">ć</l:l>
+<l:l i="60">D</l:l>
+<l:l i="60">d</l:l>
+<l:l i="70">E</l:l>
+<l:l i="70">e</l:l>
+<l:l i="80">Ę</l:l>
+<l:l i="80">Ä™</l:l>
+<l:l i="90">F</l:l>
+<l:l i="90">f</l:l>
+<l:l i="100">G</l:l>
+<l:l i="100">g</l:l>
+<l:l i="110">H</l:l>
+<l:l i="110">h</l:l>
+<l:l i="120">I</l:l>
+<l:l i="120">i</l:l>
+<l:l i="130">J</l:l>
+<l:l i="130">j</l:l>
+<l:l i="140">K</l:l>
+<l:l i="140">k</l:l>
+<l:l i="150">L</l:l>
+<l:l i="150">l</l:l>
+<l:l i="160">Å</l:l>
+<l:l i="160">Å‚</l:l>
+<l:l i="170">M</l:l>
+<l:l i="170">m</l:l>
+<l:l i="180">N</l:l>
+<l:l i="180">n</l:l>
+<l:l i="190">Ń</l:l>
+<l:l i="190">Å„</l:l>
+<l:l i="200">O</l:l>
+<l:l i="200">o</l:l>
+<l:l i="210">Ó</l:l>
+<l:l i="210">ó</l:l>
+<l:l i="220">P</l:l>
+<l:l i="220">p</l:l>
+<l:l i="230">Q</l:l>
+<l:l i="230">q</l:l>
+<l:l i="240">R</l:l>
+<l:l i="240">r</l:l>
+<l:l i="250">S</l:l>
+<l:l i="250">s</l:l>
+<l:l i="260">Åš</l:l>
+<l:l i="260">Å›</l:l>
+<l:l i="270">T</l:l>
+<l:l i="270">t</l:l>
+<l:l i="280">U</l:l>
+<l:l i="280">u</l:l>
+<l:l i="290">V</l:l>
+<l:l i="290">v</l:l>
+<l:l i="300">W</l:l>
+<l:l i="300">w</l:l>
+<l:l i="310">X</l:l>
+<l:l i="310">x</l:l>
+<l:l i="320">Y</l:l>
+<l:l i="320">y</l:l>
+<l:l i="330">Z</l:l>
+<l:l i="330">z</l:l>
+<l:l i="340">Ź</l:l>
+<l:l i="340">ź</l:l>
+<l:l i="350">Å»</l:l>
+<l:l i="350">ż</l:l>
+</l:letters>
+</l:l10n>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/pt.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/pt.xml
new file mode 100644
index 0000000..4a07359
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/pt.xml
@@ -0,0 +1,1229 @@
+<?xml version="1.0" encoding="utf-8"?>
+<l:l10n xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0" language="pt" english-language-name="Portuguese">
+
+<!-- * This file is generated automatically. -->
+<!-- * To submit changes to this file upstream (to the DocBook Project) -->
+<!-- * do not submit an edited version of this file. Instead, submit an -->
+<!-- * edited version of the source file at the following location: -->
+<!-- * -->
+<!-- * https://docbook.svn.sourceforge.net/svnroot/docbook/trunk/gentext/locale/pt.xml -->
+<!-- * -->
+<!-- * E-mail the edited pt.xml source file to: -->
+<!-- * -->
+<!-- * docbook-developers@lists.sourceforge.net -->
+
+<!-- ******************************************************************** -->
+
+<!-- This file is part of the XSL DocBook Stylesheet distribution. -->
+<!-- See ../README or http://docbook.sf.net/release/xsl/current/ for -->
+<!-- copyright and other information. -->
+
+<!-- ******************************************************************** -->
+<!-- In these files, % with a letter is used for a placeholder: -->
+<!-- %t is the current element's title -->
+<!-- %s is the current element's subtitle (if applicable)-->
+<!-- %n is the current element's number label-->
+<!-- %p is the current element's page number (if applicable)-->
+<!-- ******************************************************************** -->
+
+
+<l:gentext key="Abstract" text="Resumo"/>
+<l:gentext key="abstract" text="resumo"/>
+<l:gentext key="Acknowledgements" text="Agradecimentos"/>
+<l:gentext key="acknowledgements" text="agradecimentos"/>
+<l:gentext key="Answer" text="R:"/>
+<l:gentext key="answer" text="r:"/>
+<l:gentext key="Appendix" text="Apêndice"/>
+<l:gentext key="appendix" text="apêndice"/>
+<l:gentext key="Article" text="Artigo"/>
+<l:gentext key="article" text="artigo"/>
+<l:gentext key="Author" text="Autor"/>
+<l:gentext key="Bibliography" text="Bibliografia"/>
+<l:gentext key="bibliography" text="bibliografia"/>
+<l:gentext key="Book" text="Livro"/>
+<l:gentext key="book" text="Livro"/>
+<l:gentext key="CAUTION" text="CUIDADO"/>
+<l:gentext key="Caution" text="Cuidado"/>
+<l:gentext key="caution" text="buidado"/>
+<l:gentext key="Chapter" text="Capítulo"/>
+<l:gentext key="chapter" text="bapítulo"/>
+<l:gentext key="Colophon" text="Ficha Técnica"/>
+<l:gentext key="colophon" text="ficha técnica"/>
+<l:gentext key="Copyright" text="Copyright"/>
+<l:gentext key="copyright" text="copyright"/>
+<l:gentext key="Dedication" text="Dedicatória"/>
+<l:gentext key="dedication" text="dedicatória"/>
+<l:gentext key="Edition" text="Edição"/>
+<l:gentext key="edition" text="edição"/>
+<l:gentext key="Editor" text="Editor"/>
+<l:gentext key="Equation" text="Equação"/>
+<l:gentext key="equation" text="equação"/>
+<l:gentext key="Example" text="Exemplo"/>
+<l:gentext key="example" text="exemplo"/>
+<l:gentext key="Figure" text="Figura"/>
+<l:gentext key="figure" text="figura"/>
+<l:gentext key="Glossary" text="Glossário"/>
+<l:gentext key="glossary" text="glossário"/>
+<l:gentext key="GlossSee" text="Ver"/>
+<l:gentext key="glosssee" text="ver"/>
+<l:gentext key="GlossSeeAlso" text="Ver Também"/>
+<l:gentext key="glossseealso" text="ver também"/>
+<l:gentext key="IMPORTANT" text="IMPORTANTE"/>
+<l:gentext key="important" text="importante"/>
+<l:gentext key="Important" text="Importante"/>
+<l:gentext key="Index" text="Ãndice Remissivo"/>
+<l:gentext key="index" text="índice remissivo"/>
+<l:gentext key="ISBN" text="ISBN"/>
+<l:gentext key="isbn" text="isbn"/>
+<l:gentext key="LegalNotice" text="Aviso Legal"/>
+<l:gentext key="legalnotice" text="aviso legal"/>
+<l:gentext key="MsgAud" text="Audiência"/>
+<l:gentext key="msgaud" text="audiência"/>
+<l:gentext key="MsgLevel" text="Nível"/>
+<l:gentext key="msglevel" text="nível"/>
+<l:gentext key="MsgOrig" text="Origem"/>
+<l:gentext key="msgorig" text="origem"/>
+<l:gentext key="NOTE" text="NOTA"/>
+<l:gentext key="Note" text="Nota"/>
+<l:gentext key="note" text="nota"/>
+<l:gentext key="Part" text="Parte"/>
+<l:gentext key="part" text="parte"/>
+<l:gentext key="Preface" text="Prefácio"/>
+<l:gentext key="preface" text="prefácio"/>
+<l:gentext key="Procedure" text="Procedimento"/>
+<l:gentext key="procedure" text="procedimento"/>
+<l:gentext key="ProductionSet" text="produção"/>
+<l:gentext key="PubDate" text="Data de Publicação"/>
+<l:gentext key="pubdate" text="data de publicação"/>
+<l:gentext key="Published" text="Publicado"/>
+<l:gentext key="published" text="publicado"/>
+<l:gentext key="Publisher" text="Editor"/>
+<l:gentext key="Qandadiv" text="P &amp; R"/>
+<l:gentext key="qandadiv" text="P &amp; R"/>
+<l:gentext key="QandASet" text="Questões Frequentes"/>
+<l:gentext key="Question" text="P:"/>
+<l:gentext key="question" text="P:"/>
+<l:gentext key="RefEntry" text="Página"/>
+<l:gentext key="refentry" text="página"/>
+<l:gentext key="Reference" text="Referência"/>
+<l:gentext key="reference" text="referência"/>
+<l:gentext key="References" text="Referências"/>
+<l:gentext key="RefName" text="Nome"/>
+<l:gentext key="refname" text="nome"/>
+<l:gentext key="RefSection" text="Secção"/>
+<l:gentext key="refsection" text="secção"/>
+<l:gentext key="RefSynopsisDiv" text="Sinopse"/>
+<l:gentext key="refsynopsisdiv" text="sinopse"/>
+<l:gentext key="RevHistory" text="Historial de Revisões"/>
+<l:gentext key="revhistory" text="historial de revisões"/>
+<l:gentext key="revision" text="revisão"/>
+<l:gentext key="Revision" text="Revisão"/>
+<l:gentext key="sect1" text="Secção"/>
+<l:gentext key="sect2" text="Secção"/>
+<l:gentext key="sect3" text="Secção"/>
+<l:gentext key="sect4" text="Secção"/>
+<l:gentext key="sect5" text="Secção"/>
+<l:gentext key="section" text="secção"/>
+<l:gentext key="Section" text="Secção"/>
+<l:gentext key="see" text="ver"/>
+<l:gentext key="See" text="Ver"/>
+<l:gentext key="seealso" text="ver também"/>
+<l:gentext key="Seealso" text="Ver também"/>
+<l:gentext key="SeeAlso" text="Ver Também"/>
+<l:gentext key="set" text="conjunto"/>
+<l:gentext key="Set" text="Conjunto"/>
+<l:gentext key="setindex" text="índice de Conjuntos"/>
+<l:gentext key="SetIndex" text="Ãndice de Conjuntos"/>
+<l:gentext key="Sidebar" text="Barra Lateral"/>
+<l:gentext key="sidebar" text="barra lateral"/>
+<l:gentext key="step" text="passo"/>
+<l:gentext key="Step" text="Passo"/>
+<l:gentext key="table" text="Tabela"/>
+<l:gentext key="Table" text="Tabela"/>
+<l:gentext key="task" text="tarefa"/>
+<l:gentext key="Task" text="Tarefa"/>
+<l:gentext key="tip" text="dica"/>
+<l:gentext key="TIP" text="DICA"/>
+<l:gentext key="Tip" text="Dica"/>
+<l:gentext key="Warning" text="Atenção"/>
+<l:gentext key="warning" text="Atenção"/>
+<l:gentext key="WARNING" text="ATENÇÃO"/>
+<l:gentext key="and" text="e"/>
+<l:gentext key="by" text="por"/>
+<l:gentext key="Edited" text="Editado"/>
+<l:gentext key="edited" text="Editado"/>
+<l:gentext key="Editedby" text="Editado por"/>
+<l:gentext key="editedby" text="Editado por"/>
+<l:gentext key="in" text="em"/>
+<l:gentext key="lastlistcomma" text=""/>
+<l:gentext key="listcomma" text=","/>
+<l:gentext key="notes" text="notas"/>
+<l:gentext key="Notes" text="Notas"/>
+<l:gentext key="Pgs" text="Páginas"/>
+<l:gentext key="pgs" text="páginas"/>
+<l:gentext key="Revisedby" text="Revisto por: "/>
+<l:gentext key="revisedby" text="Revisto por: "/>
+<l:gentext key="TableNotes" text="Notas"/>
+<l:gentext key="tablenotes" text="Notas"/>
+<l:gentext key="TableofContents" text="Ãndice"/>
+<l:gentext key="tableofcontents" text="índice"/>
+<l:gentext key="unexpectedelementname" text="Nome de elemento inesperado"/>
+<l:gentext key="unsupported" text="não suportado"/>
+<l:gentext key="xrefto" text="referência cruzada para"/>
+<l:gentext key="Authors" text="Autores"/>
+<l:gentext key="copyeditor" text="Editor"/>
+<l:gentext key="graphicdesigner" text="Designer"/>
+<l:gentext key="productioneditor" text="Produtor"/>
+<l:gentext key="technicaleditor" text="Editor Técnico"/>
+<l:gentext key="translator" text="Tradutor"/>
+<l:gentext key="listofequations" text="lista de equações"/>
+<l:gentext key="ListofEquations" text="Lista de Equações"/>
+<l:gentext key="ListofExamples" text="Lista de Exemplos"/>
+<l:gentext key="listofexamples" text="lista de exemplos"/>
+<l:gentext key="ListofFigures" text="Lista de Figuras"/>
+<l:gentext key="listoffigures" text="lista de figuras"/>
+<l:gentext key="ListofProcedures" text="Lista de Procedimentos"/>
+<l:gentext key="listofprocedures" text="lista de procedimentos"/>
+<l:gentext key="listoftables" text="lista de tabelas"/>
+<l:gentext key="ListofTables" text="Lista de Tabelas"/>
+<l:gentext key="ListofUnknown" text="Lista de Desconhecido"/>
+<l:gentext key="listofunknown" text="lista de desconhecido"/>
+<l:gentext key="nav-home" text="Início"/>
+<l:gentext key="nav-next" text="Próximo"/>
+<l:gentext key="nav-next-sibling" text="Avanço Rápido"/>
+<l:gentext key="nav-prev" text="Anterior"/>
+<l:gentext key="nav-prev-sibling" text="Recuo Rápido"/>
+<l:gentext key="nav-up" text="Subir"/>
+<l:gentext key="nav-toc" text="Ãndice"/>
+<l:gentext key="Draft" text="Rascunho"/>
+<l:gentext key="above" text="acima"/>
+<l:gentext key="below" text="abaixo"/>
+<l:gentext key="sectioncalled" text="a secção chamada"/>
+<l:gentext key="index symbols" text="Símbolos"/>
+<l:gentext key="writing-mode" text="lr-tb"/>
+<l:gentext key="lowercase.alpha" text="abcdefghijklmnopqrstuvwxyz"/>
+<l:gentext key="uppercase.alpha" text="ABCDEFGHIJKLMNOPQRSTUVWXYZ"/>
+<l:gentext key="normalize.sort.input" text="AaÀàÃáÂâÃãÄäÅåĀÄĂ㥹ÇǎǞǟǠǡǺǻȀÈȂȃȦȧḀá¸áºšáº áº¡áº¢áº£áº¤áº¥áº¦áº§áº¨áº©áºªáº«áº¬áº­áº®áº¯áº°áº±áº²áº³áº´áºµáº¶áº·BbÆ€ÆɓƂƃḂḃḄḅḆḇCcÇçĆćĈĉĊċČÄƇƈɕḈḉDdÄŽÄÄđƊɗƋƌDžDzȡɖḊḋḌá¸á¸Žá¸á¸á¸‘ḒḓEeÈèÉéÊêËëĒēĔĕĖėĘęĚěȄȅȆȇȨȩḔḕḖḗḘḙḚḛḜá¸áº¸áº¹áººáº»áº¼áº½áº¾áº¿á»€á»á»‚ểỄễỆệFfƑƒḞḟGgÄœÄĞğĠġĢģƓɠǤǥǦǧǴǵḠḡHhĤĥĦħȞȟɦḢḣḤḥḦḧḨḩḪḫẖIiÌìÃíÎîÃïĨĩĪīĬĭĮįİƗɨÇÇȈȉȊȋḬḭḮḯỈỉỊịJjĴĵǰÊKkĶķƘƙǨǩḰḱḲḳḴḵLlĹĺĻļĽľĿŀÅłƚLjȴɫɬɭḶḷḸḹḺḻḼḽMmɱḾḿṀá¹á¹‚ṃNnÑñŃńŅņŇňÆɲƞȠNjǸǹȵɳṄṅṆṇṈṉṊṋOoÒòÓóÔôÕõÖöØøŌÅÅŽÅÅőƟƠơǑǒǪǫǬǭǾǿȌÈÈŽÈȪȫȬȭȮȯȰȱṌá¹á¹Žá¹á¹á¹‘ṒṓỌá»á»Žá»á»á»‘ỒồỔổỖỗỘộỚớỜá»á»žá»Ÿá» á»¡á»¢á»£PpƤƥṔṕṖṗQqÊ RrŔŕŖŗŘřÈȑȒȓɼɽɾṘṙṚṛṜá¹á¹žá¹ŸSsŚśŜÅŞşŠšȘșʂṠṡṢṣṤṥṦṧṨṩTtŢţŤťŦŧƫƬƭƮʈȚțȶṪṫṬṭṮṯṰṱẗUuÙùÚúÛûÜüŨũŪūŬŭŮůŰűŲųƯưǓǔǕǖǗǘǙǚǛǜȔȕȖȗṲṳṴṵṶṷṸṹṺṻỤụỦủỨứỪừỬửỮữỰựVvƲʋṼṽṾṿWwŴŵẀáºáº‚ẃẄẅẆẇẈẉẘXxẊẋẌáºYyÃýÿŸŶŷƳƴȲȳẎáºáº™á»²á»³á»´á»µá»¶á»·á»¸á»¹ZzŹźŻżŽžƵƶȤȥÊÊ‘áºáº‘ẒẓẔẕẕ" lang="en"/>
+<l:gentext key="normalize.sort.output" text="AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBCCCCCCCCCCCCCCCCCDDDDDDDDDDDDDDDDDDDDDDDDEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEFFFFFFGGGGGGGGGGGGGGGGGGGGHHHHHHHHHHHHHHHHHHHHIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIJJJJJJKKKKKKKKKKKKKKLLLLLLLLLLLLLLLLLLLLLLLLLLMMMMMMMMMNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOPPPPPPPPQQQRRRRRRRRRRRRRRRRRRRRRRRSSSSSSSSSSSSSSSSSSSSSSSTTTTTTTTTTTTTTTTTTTTTTTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUVVVVVVVVWWWWWWWWWWWWWWWXXXXXXYYYYYYYYYYYYYYYYYYYYYYYZZZZZZZZZZZZZZZZZZZZZ" lang="en"/>
+<l:dingbat key="startquote" text="“"/>
+<l:dingbat key="endquote" text="â€"/>
+<l:dingbat key="nestedstartquote" text="‘"/>
+<l:dingbat key="nestedendquote" text="’"/>
+<l:dingbat key="singlestartquote" text="‘"/>
+<l:dingbat key="singleendquote" text="’"/>
+<l:dingbat key="bullet" text="•"/>
+<l:gentext key="hyphenation-character" text="-"/>
+<l:gentext key="hyphenation-push-character-count" text="2"/>
+<l:gentext key="hyphenation-remain-character-count" text="2"/>
+<l:context name="styles"><l:template name="person-name" text="first-last"/>
+</l:context>
+<l:context name="title"><l:template name="abstract" text="%t"/>
+<l:template name="acknowledgements" text="%t" lang="en"/>
+<l:template name="answer" text="%t"/>
+<l:template name="appendix" text="Apêndice %n. %t"/>
+<l:template name="article" text="%t"/>
+<l:template name="authorblurb" text="%t"/>
+<l:template name="bibliodiv" text="%t"/>
+<l:template name="biblioentry" text="%t"/>
+<l:template name="bibliography" text="%t"/>
+<l:template name="bibliolist" text="%t" lang="en"/>
+<l:template name="bibliomixed" text="%t"/>
+<l:template name="bibliomset" text="%t"/>
+<l:template name="biblioset" text="%t"/>
+<l:template name="blockquote" text="%t"/>
+<l:template name="book" text="%t"/>
+<l:template name="calloutlist" text="%t"/>
+<l:template name="caution" text="%t"/>
+<l:template name="chapter" text="Capítulo %n. %t"/>
+<l:template name="colophon" text="%t"/>
+<l:template name="dedication" text="%t"/>
+<l:template name="equation" text="Equação %n. %t"/>
+<l:template name="example" text="Exemplo %n. %t"/>
+<l:template name="figure" text="Figura %n. %t"/>
+<l:template name="foil" text="%t" lang="en"/>
+<l:template name="foilgroup" text="%t" lang="en"/>
+<l:template name="formalpara" text="%t"/>
+<l:template name="glossary" text="%t"/>
+<l:template name="glossdiv" text="%t"/>
+<l:template name="glosslist" text="%t" lang="en"/>
+<l:template name="glossentry" text="%t" lang="en"/>
+<l:template name="important" text="%t"/>
+<l:template name="index" text="%t"/>
+<l:template name="indexdiv" text="%t"/>
+<l:template name="itemizedlist" text="%t"/>
+<l:template name="legalnotice" text="%t"/>
+<l:template name="listitem" text=""/>
+<l:template name="lot" text="%t"/>
+<l:template name="msg" text="%t"/>
+<l:template name="msgexplan" text="%t"/>
+<l:template name="msgmain" text="%t"/>
+<l:template name="msgrel" text="%t"/>
+<l:template name="msgset" text="%t"/>
+<l:template name="msgsub" text="%t"/>
+<l:template name="note" text="%t"/>
+<l:template name="orderedlist" text="%t"/>
+<l:template name="part" text="Parte %n. %t"/>
+<l:template name="partintro" text="%t"/>
+<l:template name="preface" text="%t"/>
+<l:template name="procedure" text="%t"/>
+<l:template name="procedure.formal" text="Procedimento %n. %t"/>
+<l:template name="productionset" text="%t"/>
+<l:template name="productionset.formal" text="produção %n"/>
+<l:template name="qandadiv" text="%t"/>
+<l:template name="qandaentry" text="%t"/>
+<l:template name="qandaset" text="%t"/>
+<l:template name="question" text="Pergunta %n"/>
+<l:template name="refentry" text="%t"/>
+<l:template name="reference" text="%t"/>
+<l:template name="refsection" text="%t"/>
+<l:template name="refsect1" text="%t"/>
+<l:template name="refsect2" text="%t"/>
+<l:template name="refsect3" text="%t"/>
+<l:template name="refsynopsisdiv" text="%t"/>
+<l:template name="refsynopsisdivinfo" text="%t"/>
+<l:template name="segmentedlist" text="%t"/>
+<l:template name="set" text="%t"/>
+<l:template name="setindex" text="%t"/>
+<l:template name="sidebar" text="%t"/>
+<l:template name="step" text="%t"/>
+<l:template name="table" text="Tabela %n. %t"/>
+<l:template name="task" text="%t" lang="en"/>
+<l:template name="tasksummary" text="%t" lang="en"/>
+<l:template name="taskprerequisites" text="%t" lang="en"/>
+<l:template name="taskrelated" text="%t" lang="en"/>
+<l:template name="tip" text="%t"/>
+<l:template name="toc" text="%t"/>
+<l:template name="variablelist" text="%t"/>
+<l:template name="varlistentry" text="" lang="en"/>
+<l:template name="warning" text="%t"/>
+</l:context>
+<l:context name="title-unnumbered"><l:template name="appendix" text="%t"/>
+<l:template name="article/appendix" text="%t" lang="en"/>
+<l:template name="bridgehead" text="%t"/>
+<l:template name="chapter" text="%t"/>
+<l:template name="sect1" text="%t"/>
+<l:template name="sect2" text="%t"/>
+<l:template name="sect3" text="%t"/>
+<l:template name="sect4" text="%t"/>
+<l:template name="sect5" text="%t"/>
+<l:template name="section" text="%t"/>
+<l:template name="simplesect" text="%t"/>
+<l:template name="part" text="%t" lang="en"/>
+</l:context>
+<l:context name="title-numbered"><l:template name="appendix" text="Apêndice %n. %t"/>
+<l:template name="article/appendix" text="%n. %t" lang="en"/>
+<l:template name="bridgehead" text="%t"/>
+<l:template name="chapter" text="Capítulo %n. %t"/>
+<l:template name="part" text="Parte %n. %t"/>
+<l:template name="sect1" text="%n. %t"/>
+<l:template name="sect2" text="%n. %t"/>
+<l:template name="sect3" text="%n. %t"/>
+<l:template name="sect4" text="%n. %t"/>
+<l:template name="sect5" text="%n. %t"/>
+<l:template name="section" text="%n. %t"/>
+<l:template name="simplesect" text="%n. %t"/>
+</l:context>
+<l:context name="subtitle"><l:template name="appendix" text="%s"/>
+<l:template name="acknowledgements" text="%s" lang="en"/>
+<l:template name="article" text="%s"/>
+<l:template name="bibliodiv" text="%s"/>
+<l:template name="biblioentry" text="%s"/>
+<l:template name="bibliography" text="%s"/>
+<l:template name="bibliomixed" text="%s"/>
+<l:template name="bibliomset" text="%s"/>
+<l:template name="biblioset" text="%s"/>
+<l:template name="book" text="%s"/>
+<l:template name="chapter" text="%s"/>
+<l:template name="colophon" text="%s"/>
+<l:template name="dedication" text="%s"/>
+<l:template name="glossary" text="%s"/>
+<l:template name="glossdiv" text="%s"/>
+<l:template name="index" text="%s"/>
+<l:template name="indexdiv" text="%s"/>
+<l:template name="lot" text="%s"/>
+<l:template name="part" text="%s"/>
+<l:template name="partintro" text="%s"/>
+<l:template name="preface" text="%s"/>
+<l:template name="refentry" text="%s"/>
+<l:template name="reference" text="%s"/>
+<l:template name="refsection" text="%s"/>
+<l:template name="refsect1" text="%s"/>
+<l:template name="refsect2" text="%s"/>
+<l:template name="refsect3" text="%s"/>
+<l:template name="refsynopsisdiv" text="%s"/>
+<l:template name="sect1" text="%s"/>
+<l:template name="sect2" text="%s"/>
+<l:template name="sect3" text="%s"/>
+<l:template name="sect4" text="%s"/>
+<l:template name="sect5" text="%s"/>
+<l:template name="section" text="%s"/>
+<l:template name="set" text="%s"/>
+<l:template name="setindex" text="%s"/>
+<l:template name="sidebar" text="%s"/>
+<l:template name="simplesect" text="%s"/>
+<l:template name="toc" text="%s"/>
+</l:context>
+<l:context name="xref"><l:template name="abstract" text="%t"/>
+<l:template name="acknowledgements" text="%t" lang="en"/>
+<l:template name="answer" text="R: %n"/>
+<l:template name="appendix" text="%t"/>
+<l:template name="article" text="%t"/>
+<l:template name="authorblurb" text="%t"/>
+<l:template name="bibliodiv" text="%t"/>
+<l:template name="bibliography" text="%t"/>
+<l:template name="bibliomset" text="%t"/>
+<l:template name="biblioset" text="%t"/>
+<l:template name="blockquote" text="%t"/>
+<l:template name="book" text="%t"/>
+<l:template name="calloutlist" text="%t"/>
+<l:template name="caution" text="%t"/>
+<l:template name="chapter" text="%t"/>
+<l:template name="colophon" text="%t"/>
+<l:template name="constraintdef" text="%t"/>
+<l:template name="dedication" text="%t"/>
+<l:template name="equation" text="%t"/>
+<l:template name="example" text="%t"/>
+<l:template name="figure" text="%t"/>
+<l:template name="foil" text="%t" lang="en"/>
+<l:template name="foilgroup" text="%t" lang="en"/>
+<l:template name="formalpara" text="%t"/>
+<l:template name="glossary" text="%t"/>
+<l:template name="glossdiv" text="%t"/>
+<l:template name="important" text="%t"/>
+<l:template name="index" text="%t"/>
+<l:template name="indexdiv" text="%t"/>
+<l:template name="itemizedlist" text="%t"/>
+<l:template name="legalnotice" text="%t"/>
+<l:template name="listitem" text="%n"/>
+<l:template name="lot" text="%t"/>
+<l:template name="msg" text="%t"/>
+<l:template name="msgexplan" text="%t"/>
+<l:template name="msgmain" text="%t"/>
+<l:template name="msgrel" text="%t"/>
+<l:template name="msgset" text="%t"/>
+<l:template name="msgsub" text="%t"/>
+<l:template name="note" text="%t"/>
+<l:template name="orderedlist" text="%t"/>
+<l:template name="part" text="%t"/>
+<l:template name="partintro" text="%t"/>
+<l:template name="preface" text="%t"/>
+<l:template name="procedure" text="%t"/>
+<l:template name="productionset" text="%t"/>
+<l:template name="qandadiv" text="%t"/>
+<l:template name="qandaentry" text="P: %n"/>
+<l:template name="qandaset" text="%t"/>
+<l:template name="question" text="P: %n"/>
+<l:template name="reference" text="%t"/>
+<l:template name="refsynopsisdiv" text="%t"/>
+<l:template name="segmentedlist" text="%t"/>
+<l:template name="set" text="%t"/>
+<l:template name="setindex" text="%t"/>
+<l:template name="sidebar" text="%t"/>
+<l:template name="table" text="%t"/>
+<l:template name="task" text="%t" lang="en"/>
+<l:template name="tip" text="%t"/>
+<l:template name="toc" text="%t"/>
+<l:template name="variablelist" text="%t"/>
+<l:template name="varlistentry" text=""/>
+<l:template name="warning" text="%t"/>
+<l:template name="olink.document.citation" text=" in %o" lang="en"/>
+<l:template name="olink.page.citation" text=" (page %p)" lang="en"/>
+<l:template name="page.citation" text=" [%p]"/>
+<l:template name="page" text="(page %p)" lang="en"/>
+<l:template name="docname" text=" in %o" lang="en"/>
+<l:template name="docnamelong" text=" in the document titled %o" lang="en"/>
+<l:template name="pageabbrev" text="(p. %p)" lang="en"/>
+<l:template name="Page" text="Page %p" lang="en"/>
+<l:template name="bridgehead" text="“%tâ€"/>
+<l:template name="refsection" text="“%tâ€"/>
+<l:template name="refsect1" text="“%tâ€"/>
+<l:template name="refsect2" text="“%tâ€"/>
+<l:template name="refsect3" text="“%tâ€"/>
+<l:template name="sect1" text="“%tâ€"/>
+<l:template name="sect2" text="“%tâ€"/>
+<l:template name="sect3" text="“%tâ€"/>
+<l:template name="sect4" text="“%tâ€"/>
+<l:template name="sect5" text="“%tâ€"/>
+<l:template name="section" text="“%tâ€"/>
+<l:template name="simplesect" text="“%tâ€"/>
+</l:context>
+<l:context name="xref-number"><l:template name="answer" text="R: %n"/>
+<l:template name="appendix" text="Apêndice %n"/>
+<l:template name="bridgehead" text="Secção %n"/>
+<l:template name="chapter" text="Capítulo %n"/>
+<l:template name="equation" text="Equação %n"/>
+<l:template name="example" text="Exemplo %n"/>
+<l:template name="figure" text="Figura %n"/>
+<l:template name="part" text="Parte %n"/>
+<l:template name="procedure" text="Procedimento %n"/>
+<l:template name="productionset" text="produção %n"/>
+<l:template name="qandadiv" text="P &amp; R %n"/>
+<l:template name="qandaentry" text="P: %n"/>
+<l:template name="question" text="P: %n"/>
+<l:template name="sect1" text="Secção %n"/>
+<l:template name="sect2" text="Secção %n"/>
+<l:template name="sect3" text="Secção %n"/>
+<l:template name="sect4" text="Secção %n"/>
+<l:template name="sect5" text="Secção %n"/>
+<l:template name="section" text="Secção %n"/>
+<l:template name="table" text="Tabela %n"/>
+</l:context>
+<l:context name="xref-number-and-title"><l:template name="appendix" text="Apêndice %n, %t"/>
+<l:template name="bridgehead" text="Secção %n, “%tâ€"/>
+<l:template name="chapter" text="Capítulo %n, %t"/>
+<l:template name="equation" text="Equação %n, “%tâ€"/>
+<l:template name="example" text="Exemplo %n, “%tâ€"/>
+<l:template name="figure" text="Figura %n, “%tâ€"/>
+<l:template name="part" text="Parte %n, “%tâ€"/>
+<l:template name="procedure" text="Procedimento %n, “%tâ€"/>
+<l:template name="productionset" text="produção %n, “%tâ€"/>
+<l:template name="qandadiv" text="P &amp; R %n, “%tâ€"/>
+<l:template name="refsect1" text="a secção chamada “%tâ€"/>
+<l:template name="refsect2" text="a secção chamada “%tâ€"/>
+<l:template name="refsect3" text="a secção chamada “%tâ€"/>
+<l:template name="refsection" text="a secção chamada “%tâ€"/>
+<l:template name="sect1" text="Secção %n, “%tâ€"/>
+<l:template name="sect2" text="Secção %n, “%tâ€"/>
+<l:template name="sect3" text="Secção %n, “%tâ€"/>
+<l:template name="sect4" text="Secção %n, “%tâ€"/>
+<l:template name="sect5" text="Secção %n, “%tâ€"/>
+<l:template name="section" text="Secção %n, “%tâ€"/>
+<l:template name="simplesect" text="a secção chamada “%tâ€"/>
+<l:template name="table" text="Tabela %n, “%tâ€"/>
+</l:context>
+<l:context name="authorgroup"><l:template name="sep" text=", "/>
+<l:template name="sep2" text=" e "/>
+<l:template name="seplast" text=" e "/>
+</l:context>
+<l:context name="glossary"><l:template name="see" text="Ver %t."/>
+<l:template name="seealso" text="Ver Também %t."/>
+<l:template name="seealso-separator" text=", "/>
+</l:context>
+<l:context name="msgset"><l:template name="MsgAud" text="Audiência: "/>
+<l:template name="MsgLevel" text="Nível: "/>
+<l:template name="MsgOrig" text="Origem: "/>
+</l:context>
+<l:context name="datetime"><l:template name="format" text="d/m/Y"/>
+</l:context>
+<l:context name="termdef"><l:template name="prefix" text="[Definição: "/>
+<l:template name="suffix" text="]"/>
+</l:context>
+<l:context name="datetime-full"><l:template name="January" text="Janeiro"/>
+<l:template name="February" text="Fevereiro"/>
+<l:template name="March" text="Março"/>
+<l:template name="April" text="Abril"/>
+<l:template name="May" text="Maio"/>
+<l:template name="June" text="Junho"/>
+<l:template name="July" text="Julho"/>
+<l:template name="August" text="Agosto"/>
+<l:template name="September" text="Setembro"/>
+<l:template name="October" text="Outubro"/>
+<l:template name="November" text="Novembro"/>
+<l:template name="December" text="Dezembro"/>
+<l:template name="Monday" text="Segunda-Feira"/>
+<l:template name="Tuesday" text="Terça-Feira"/>
+<l:template name="Wednesday" text="Quarta-Feira"/>
+<l:template name="Thursday" text="Quinta-Feira"/>
+<l:template name="Friday" text="Sexta-Feira"/>
+<l:template name="Saturday" text="Sábado"/>
+<l:template name="Sunday" text="Domingo"/>
+</l:context>
+<l:context name="datetime-abbrev"><l:template name="Jan" text="Jan"/>
+<l:template name="Feb" text="Fev"/>
+<l:template name="Mar" text="Mar"/>
+<l:template name="Apr" text="Abr"/>
+<l:template name="May" text="Mai"/>
+<l:template name="Jun" text="Jun"/>
+<l:template name="Jul" text="Jul"/>
+<l:template name="Aug" text="Ago"/>
+<l:template name="Sep" text="Set"/>
+<l:template name="Oct" text="Out"/>
+<l:template name="Nov" text="Nov"/>
+<l:template name="Dec" text="Dez"/>
+<l:template name="Mon" text="Seg"/>
+<l:template name="Tue" text="Ter"/>
+<l:template name="Wed" text="Qua"/>
+<l:template name="Thu" text="Qui"/>
+<l:template name="Fri" text="Sex"/>
+<l:template name="Sat" text="Sab"/>
+<l:template name="Sun" text="Dom"/>
+</l:context>
+<l:context name="htmlhelp"><l:template name="langcode" text="0x0816 Portuguese (PORTUGAL)"/>
+</l:context>
+<l:context name="index"><l:template name="term-separator" text=", " lang="en"/>
+<l:template name="number-separator" text=", " lang="en"/>
+<l:template name="range-separator" text="-" lang="en"/>
+</l:context>
+<l:context name="iso690"><l:template name="lastfirst.sep" text=", " lang="en"/>
+<l:template name="alt.person.two.sep" text=" – " lang="en"/>
+<l:template name="alt.person.last.sep" text=" – " lang="en"/>
+<l:template name="alt.person.more.sep" text=" – " lang="en"/>
+<l:template name="primary.editor" text=" (ed.)" lang="en"/>
+<l:template name="primary.many" text=", et al." lang="en"/>
+<l:template name="primary.sep" text=". " lang="en"/>
+<l:template name="submaintitle.sep" text=": " lang="en"/>
+<l:template name="title.sep" text=". " lang="en"/>
+<l:template name="othertitle.sep" text=", " lang="en"/>
+<l:template name="medium1" text=" [" lang="en"/>
+<l:template name="medium2" text="]" lang="en"/>
+<l:template name="secondary.person.sep" text="; " lang="en"/>
+<l:template name="secondary.sep" text=". " lang="en"/>
+<l:template name="respons.sep" text=". " lang="en"/>
+<l:template name="edition.sep" text=". " lang="en"/>
+<l:template name="edition.serial.sep" text=", " lang="en"/>
+<l:template name="issuing.range" text="-" lang="en"/>
+<l:template name="issuing.div" text=", " lang="en"/>
+<l:template name="issuing.sep" text=". " lang="en"/>
+<l:template name="partnr.sep" text=". " lang="en"/>
+<l:template name="placepubl.sep" text=": " lang="en"/>
+<l:template name="publyear.sep" text=", " lang="en"/>
+<l:template name="pubinfo.sep" text=". " lang="en"/>
+<l:template name="spec.pubinfo.sep" text=", " lang="en"/>
+<l:template name="upd.sep" text=", " lang="en"/>
+<l:template name="datecit1" text=" [cited " lang="en"/>
+<l:template name="datecit2" text="]" lang="en"/>
+<l:template name="extent.sep" text=". " lang="en"/>
+<l:template name="locs.sep" text=", " lang="en"/>
+<l:template name="location.sep" text=". " lang="en"/>
+<l:template name="serie.sep" text=". " lang="en"/>
+<l:template name="notice.sep" text=". " lang="en"/>
+<l:template name="access" text="Available " lang="en"/>
+<l:template name="acctoo" text="Also available " lang="en"/>
+<l:template name="onwww" text="from World Wide Web" lang="en"/>
+<l:template name="oninet" text="from Internet" lang="en"/>
+<l:template name="access.end" text=": " lang="en"/>
+<l:template name="link1" text="&lt;" lang="en"/>
+<l:template name="link2" text="&gt;" lang="en"/>
+<l:template name="access.sep" text=". " lang="en"/>
+<l:template name="isbn" text="ISBN " lang="en"/>
+<l:template name="issn" text="ISSN " lang="en"/>
+<l:template name="stdnum.sep" text=". " lang="en"/>
+<l:template name="patcountry.sep" text=". " lang="en"/>
+<l:template name="pattype.sep" text=", " lang="en"/>
+<l:template name="patnum.sep" text=". " lang="en"/>
+<l:template name="patdate.sep" text=". " lang="en"/>
+</l:context><l:letters><l:l i="-1"/>
+<l:l i="0">Símbolos</l:l>
+<l:l i="10">A</l:l>
+<l:l i="10">a</l:l>
+<l:l i="10">À</l:l>
+<l:l i="10">à</l:l>
+<l:l i="10">Ã</l:l>
+<l:l i="10">á</l:l>
+<l:l i="10">Â</l:l>
+<l:l i="10">â</l:l>
+<l:l i="10">Ã</l:l>
+<l:l i="10">ã</l:l>
+<l:l i="10">Ä</l:l>
+<l:l i="10">ä</l:l>
+<l:l i="10">Ã…</l:l>
+<l:l i="10">Ã¥</l:l>
+<l:l i="10">Ä€</l:l>
+<l:l i="10">Ä</l:l>
+<l:l i="10">Ä‚</l:l>
+<l:l i="10">ă</l:l>
+<l:l i="10">Ä„</l:l>
+<l:l i="10">Ä…</l:l>
+<l:l i="10">Ç</l:l>
+<l:l i="10">ÇŽ</l:l>
+<l:l i="10">Çž</l:l>
+<l:l i="10">ÇŸ</l:l>
+<l:l i="10">Ç </l:l>
+<l:l i="10">Ç¡</l:l>
+<l:l i="10">Ǻ</l:l>
+<l:l i="10">Ç»</l:l>
+<l:l i="10">È€</l:l>
+<l:l i="10">È</l:l>
+<l:l i="10">È‚</l:l>
+<l:l i="10">ȃ</l:l>
+<l:l i="10">Ȧ</l:l>
+<l:l i="10">ȧ</l:l>
+<l:l i="10">Ḁ</l:l>
+<l:l i="10">á¸</l:l>
+<l:l i="10">ẚ</l:l>
+<l:l i="10">Ạ</l:l>
+<l:l i="10">ạ</l:l>
+<l:l i="10">Ả</l:l>
+<l:l i="10">ả</l:l>
+<l:l i="10">Ấ</l:l>
+<l:l i="10">ấ</l:l>
+<l:l i="10">Ầ</l:l>
+<l:l i="10">ầ</l:l>
+<l:l i="10">Ẩ</l:l>
+<l:l i="10">ẩ</l:l>
+<l:l i="10">Ẫ</l:l>
+<l:l i="10">ẫ</l:l>
+<l:l i="10">Ậ</l:l>
+<l:l i="10">ậ</l:l>
+<l:l i="10">Ắ</l:l>
+<l:l i="10">ắ</l:l>
+<l:l i="10">Ằ</l:l>
+<l:l i="10">ằ</l:l>
+<l:l i="10">Ẳ</l:l>
+<l:l i="10">ẳ</l:l>
+<l:l i="10">Ẵ</l:l>
+<l:l i="10">ẵ</l:l>
+<l:l i="10">Ặ</l:l>
+<l:l i="10">ặ</l:l>
+<l:l i="20">B</l:l>
+<l:l i="20">b</l:l>
+<l:l i="20">Æ€</l:l>
+<l:l i="20">Æ</l:l>
+<l:l i="20">É“</l:l>
+<l:l i="20">Æ‚</l:l>
+<l:l i="20">ƃ</l:l>
+<l:l i="20">Ḃ</l:l>
+<l:l i="20">ḃ</l:l>
+<l:l i="20">Ḅ</l:l>
+<l:l i="20">ḅ</l:l>
+<l:l i="20">Ḇ</l:l>
+<l:l i="20">ḇ</l:l>
+<l:l i="30">C</l:l>
+<l:l i="30">c</l:l>
+<l:l i="30">Ç</l:l>
+<l:l i="30">ç</l:l>
+<l:l i="30">Ć</l:l>
+<l:l i="30">ć</l:l>
+<l:l i="30">Ĉ</l:l>
+<l:l i="30">ĉ</l:l>
+<l:l i="30">ÄŠ</l:l>
+<l:l i="30">Ä‹</l:l>
+<l:l i="30">Č</l:l>
+<l:l i="30">Ä</l:l>
+<l:l i="30">Ƈ</l:l>
+<l:l i="30">ƈ</l:l>
+<l:l i="30">É•</l:l>
+<l:l i="30">Ḉ</l:l>
+<l:l i="30">ḉ</l:l>
+<l:l i="40">D</l:l>
+<l:l i="40">d</l:l>
+<l:l i="40">ÄŽ</l:l>
+<l:l i="40">Ä</l:l>
+<l:l i="40">Ä</l:l>
+<l:l i="40">Ä‘</l:l>
+<l:l i="40">ÆŠ</l:l>
+<l:l i="40">É—</l:l>
+<l:l i="40">Æ‹</l:l>
+<l:l i="40">ƌ</l:l>
+<l:l i="40">Ç…</l:l>
+<l:l i="40">Dz</l:l>
+<l:l i="40">È¡</l:l>
+<l:l i="40">É–</l:l>
+<l:l i="40">Ḋ</l:l>
+<l:l i="40">ḋ</l:l>
+<l:l i="40">Ḍ</l:l>
+<l:l i="40">á¸</l:l>
+<l:l i="40">Ḏ</l:l>
+<l:l i="40">á¸</l:l>
+<l:l i="40">á¸</l:l>
+<l:l i="40">ḑ</l:l>
+<l:l i="40">Ḓ</l:l>
+<l:l i="40">ḓ</l:l>
+<l:l i="50">E</l:l>
+<l:l i="50">e</l:l>
+<l:l i="50">È</l:l>
+<l:l i="50">è</l:l>
+<l:l i="50">É</l:l>
+<l:l i="50">é</l:l>
+<l:l i="50">Ê</l:l>
+<l:l i="50">ê</l:l>
+<l:l i="50">Ë</l:l>
+<l:l i="50">ë</l:l>
+<l:l i="50">Ä’</l:l>
+<l:l i="50">Ä“</l:l>
+<l:l i="50">Ä”</l:l>
+<l:l i="50">Ä•</l:l>
+<l:l i="50">Ä–</l:l>
+<l:l i="50">Ä—</l:l>
+<l:l i="50">Ę</l:l>
+<l:l i="50">Ä™</l:l>
+<l:l i="50">Äš</l:l>
+<l:l i="50">Ä›</l:l>
+<l:l i="50">È„</l:l>
+<l:l i="50">È…</l:l>
+<l:l i="50">Ȇ</l:l>
+<l:l i="50">ȇ</l:l>
+<l:l i="50">Ȩ</l:l>
+<l:l i="50">È©</l:l>
+<l:l i="50">Ḕ</l:l>
+<l:l i="50">ḕ</l:l>
+<l:l i="50">Ḗ</l:l>
+<l:l i="50">ḗ</l:l>
+<l:l i="50">Ḙ</l:l>
+<l:l i="50">ḙ</l:l>
+<l:l i="50">Ḛ</l:l>
+<l:l i="50">ḛ</l:l>
+<l:l i="50">Ḝ</l:l>
+<l:l i="50">á¸</l:l>
+<l:l i="50">Ẹ</l:l>
+<l:l i="50">ẹ</l:l>
+<l:l i="50">Ẻ</l:l>
+<l:l i="50">ẻ</l:l>
+<l:l i="50">Ẽ</l:l>
+<l:l i="50">ẽ</l:l>
+<l:l i="50">Ế</l:l>
+<l:l i="50">ế</l:l>
+<l:l i="50">Ề</l:l>
+<l:l i="50">á»</l:l>
+<l:l i="50">Ể</l:l>
+<l:l i="50">ể</l:l>
+<l:l i="50">Ễ</l:l>
+<l:l i="50">á»…</l:l>
+<l:l i="50">Ệ</l:l>
+<l:l i="50">ệ</l:l>
+<l:l i="60">F</l:l>
+<l:l i="60">f</l:l>
+<l:l i="60">Æ‘</l:l>
+<l:l i="60">Æ’</l:l>
+<l:l i="60">Ḟ</l:l>
+<l:l i="60">ḟ</l:l>
+<l:l i="70">G</l:l>
+<l:l i="70">g</l:l>
+<l:l i="70">Ĝ</l:l>
+<l:l i="70">Ä</l:l>
+<l:l i="70">Äž</l:l>
+<l:l i="70">ÄŸ</l:l>
+<l:l i="70">Ä </l:l>
+<l:l i="70">Ä¡</l:l>
+<l:l i="70">Ä¢</l:l>
+<l:l i="70">Ä£</l:l>
+<l:l i="70">Æ“</l:l>
+<l:l i="70">É </l:l>
+<l:l i="70">Ǥ</l:l>
+<l:l i="70">Ç¥</l:l>
+<l:l i="70">Ǧ</l:l>
+<l:l i="70">ǧ</l:l>
+<l:l i="70">Ç´</l:l>
+<l:l i="70">ǵ</l:l>
+<l:l i="70">Ḡ</l:l>
+<l:l i="70">ḡ</l:l>
+<l:l i="80">H</l:l>
+<l:l i="80">h</l:l>
+<l:l i="80">Ĥ</l:l>
+<l:l i="80">Ä¥</l:l>
+<l:l i="80">Ħ</l:l>
+<l:l i="80">ħ</l:l>
+<l:l i="80">Èž</l:l>
+<l:l i="80">ÈŸ</l:l>
+<l:l i="80">ɦ</l:l>
+<l:l i="80">Ḣ</l:l>
+<l:l i="80">ḣ</l:l>
+<l:l i="80">Ḥ</l:l>
+<l:l i="80">ḥ</l:l>
+<l:l i="80">Ḧ</l:l>
+<l:l i="80">ḧ</l:l>
+<l:l i="80">Ḩ</l:l>
+<l:l i="80">ḩ</l:l>
+<l:l i="80">Ḫ</l:l>
+<l:l i="80">ḫ</l:l>
+<l:l i="80">ẖ</l:l>
+<l:l i="90">I</l:l>
+<l:l i="90">i</l:l>
+<l:l i="90">Ì</l:l>
+<l:l i="90">ì</l:l>
+<l:l i="90">Ã</l:l>
+<l:l i="90">í</l:l>
+<l:l i="90">ÃŽ</l:l>
+<l:l i="90">î</l:l>
+<l:l i="90">Ã</l:l>
+<l:l i="90">ï</l:l>
+<l:l i="90">Ĩ</l:l>
+<l:l i="90">Ä©</l:l>
+<l:l i="90">Ī</l:l>
+<l:l i="90">Ä«</l:l>
+<l:l i="90">Ĭ</l:l>
+<l:l i="90">Ä­</l:l>
+<l:l i="90">Ä®</l:l>
+<l:l i="90">į</l:l>
+<l:l i="90">Ä°</l:l>
+<l:l i="90">Æ—</l:l>
+<l:l i="90">ɨ</l:l>
+<l:l i="90">Ç</l:l>
+<l:l i="90">Ç</l:l>
+<l:l i="90">Ȉ</l:l>
+<l:l i="90">ȉ</l:l>
+<l:l i="90">ÈŠ</l:l>
+<l:l i="90">È‹</l:l>
+<l:l i="90">Ḭ</l:l>
+<l:l i="90">ḭ</l:l>
+<l:l i="90">Ḯ</l:l>
+<l:l i="90">ḯ</l:l>
+<l:l i="90">Ỉ</l:l>
+<l:l i="90">ỉ</l:l>
+<l:l i="90">Ị</l:l>
+<l:l i="90">ị</l:l>
+<l:l i="100">J</l:l>
+<l:l i="100">j</l:l>
+<l:l i="100">Ä´</l:l>
+<l:l i="100">ĵ</l:l>
+<l:l i="100">Ç°</l:l>
+<l:l i="100">Ê</l:l>
+<l:l i="110">K</l:l>
+<l:l i="110">k</l:l>
+<l:l i="110">Ķ</l:l>
+<l:l i="110">Ä·</l:l>
+<l:l i="110">Ƙ</l:l>
+<l:l i="110">Æ™</l:l>
+<l:l i="110">Ǩ</l:l>
+<l:l i="110">Ç©</l:l>
+<l:l i="110">Ḱ</l:l>
+<l:l i="110">ḱ</l:l>
+<l:l i="110">Ḳ</l:l>
+<l:l i="110">ḳ</l:l>
+<l:l i="110">Ḵ</l:l>
+<l:l i="110">ḵ</l:l>
+<l:l i="120">L</l:l>
+<l:l i="120">l</l:l>
+<l:l i="120">Ĺ</l:l>
+<l:l i="120">ĺ</l:l>
+<l:l i="120">Ä»</l:l>
+<l:l i="120">ļ</l:l>
+<l:l i="120">Ľ</l:l>
+<l:l i="120">ľ</l:l>
+<l:l i="120">Ä¿</l:l>
+<l:l i="120">Å€</l:l>
+<l:l i="120">Å</l:l>
+<l:l i="120">Å‚</l:l>
+<l:l i="120">Æš</l:l>
+<l:l i="120">Lj</l:l>
+<l:l i="120">È´</l:l>
+<l:l i="120">É«</l:l>
+<l:l i="120">ɬ</l:l>
+<l:l i="120">É­</l:l>
+<l:l i="120">Ḷ</l:l>
+<l:l i="120">ḷ</l:l>
+<l:l i="120">Ḹ</l:l>
+<l:l i="120">ḹ</l:l>
+<l:l i="120">Ḻ</l:l>
+<l:l i="120">ḻ</l:l>
+<l:l i="120">Ḽ</l:l>
+<l:l i="120">ḽ</l:l>
+<l:l i="130">M</l:l>
+<l:l i="130">m</l:l>
+<l:l i="130">ɱ</l:l>
+<l:l i="130">Ḿ</l:l>
+<l:l i="130">ḿ</l:l>
+<l:l i="130">á¹€</l:l>
+<l:l i="130">á¹</l:l>
+<l:l i="130">Ṃ</l:l>
+<l:l i="130">ṃ</l:l>
+<l:l i="140">N</l:l>
+<l:l i="140">n</l:l>
+<l:l i="140">Ñ</l:l>
+<l:l i="140">ñ</l:l>
+<l:l i="140">Ń</l:l>
+<l:l i="140">Å„</l:l>
+<l:l i="140">Å…</l:l>
+<l:l i="140">ņ</l:l>
+<l:l i="140">Ň</l:l>
+<l:l i="140">ň</l:l>
+<l:l i="140">Æ</l:l>
+<l:l i="140">ɲ</l:l>
+<l:l i="140">Æž</l:l>
+<l:l i="140">È </l:l>
+<l:l i="140">Ç‹</l:l>
+<l:l i="140">Ǹ</l:l>
+<l:l i="140">ǹ</l:l>
+<l:l i="140">ȵ</l:l>
+<l:l i="140">ɳ</l:l>
+<l:l i="140">Ṅ</l:l>
+<l:l i="140">á¹…</l:l>
+<l:l i="140">Ṇ</l:l>
+<l:l i="140">ṇ</l:l>
+<l:l i="140">Ṉ</l:l>
+<l:l i="140">ṉ</l:l>
+<l:l i="140">Ṋ</l:l>
+<l:l i="140">ṋ</l:l>
+<l:l i="150">O</l:l>
+<l:l i="150">o</l:l>
+<l:l i="150">Ã’</l:l>
+<l:l i="150">ò</l:l>
+<l:l i="150">Ó</l:l>
+<l:l i="150">ó</l:l>
+<l:l i="150">Ô</l:l>
+<l:l i="150">ô</l:l>
+<l:l i="150">Õ</l:l>
+<l:l i="150">õ</l:l>
+<l:l i="150">Ö</l:l>
+<l:l i="150">ö</l:l>
+<l:l i="150">Ø</l:l>
+<l:l i="150">ø</l:l>
+<l:l i="150">Ō</l:l>
+<l:l i="150">Å</l:l>
+<l:l i="150">ÅŽ</l:l>
+<l:l i="150">Å</l:l>
+<l:l i="150">Å</l:l>
+<l:l i="150">Å‘</l:l>
+<l:l i="150">ÆŸ</l:l>
+<l:l i="150">Æ </l:l>
+<l:l i="150">Æ¡</l:l>
+<l:l i="150">Ç‘</l:l>
+<l:l i="150">Ç’</l:l>
+<l:l i="150">Ǫ</l:l>
+<l:l i="150">Ç«</l:l>
+<l:l i="150">Ǭ</l:l>
+<l:l i="150">Ç­</l:l>
+<l:l i="150">Ǿ</l:l>
+<l:l i="150">Ç¿</l:l>
+<l:l i="150">Ȍ</l:l>
+<l:l i="150">È</l:l>
+<l:l i="150">ÈŽ</l:l>
+<l:l i="150">È</l:l>
+<l:l i="150">Ȫ</l:l>
+<l:l i="150">È«</l:l>
+<l:l i="150">Ȭ</l:l>
+<l:l i="150">È­</l:l>
+<l:l i="150">È®</l:l>
+<l:l i="150">ȯ</l:l>
+<l:l i="150">È°</l:l>
+<l:l i="150">ȱ</l:l>
+<l:l i="150">Ṍ</l:l>
+<l:l i="150">á¹</l:l>
+<l:l i="150">Ṏ</l:l>
+<l:l i="150">á¹</l:l>
+<l:l i="150">á¹</l:l>
+<l:l i="150">ṑ</l:l>
+<l:l i="150">á¹’</l:l>
+<l:l i="150">ṓ</l:l>
+<l:l i="150">Ọ</l:l>
+<l:l i="150">á»</l:l>
+<l:l i="150">Ỏ</l:l>
+<l:l i="150">á»</l:l>
+<l:l i="150">á»</l:l>
+<l:l i="150">ố</l:l>
+<l:l i="150">á»’</l:l>
+<l:l i="150">ồ</l:l>
+<l:l i="150">á»”</l:l>
+<l:l i="150">ổ</l:l>
+<l:l i="150">á»–</l:l>
+<l:l i="150">á»—</l:l>
+<l:l i="150">Ộ</l:l>
+<l:l i="150">á»™</l:l>
+<l:l i="150">Ớ</l:l>
+<l:l i="150">á»›</l:l>
+<l:l i="150">Ờ</l:l>
+<l:l i="150">á»</l:l>
+<l:l i="150">Ở</l:l>
+<l:l i="150">ở</l:l>
+<l:l i="150">á» </l:l>
+<l:l i="150">ỡ</l:l>
+<l:l i="150">Ợ</l:l>
+<l:l i="150">ợ</l:l>
+<l:l i="160">P</l:l>
+<l:l i="160">p</l:l>
+<l:l i="160">Ƥ</l:l>
+<l:l i="160">Æ¥</l:l>
+<l:l i="160">á¹”</l:l>
+<l:l i="160">ṕ</l:l>
+<l:l i="160">á¹–</l:l>
+<l:l i="160">á¹—</l:l>
+<l:l i="170">Q</l:l>
+<l:l i="170">q</l:l>
+<l:l i="170">Ê </l:l>
+<l:l i="180">R</l:l>
+<l:l i="180">r</l:l>
+<l:l i="180">Å”</l:l>
+<l:l i="180">Å•</l:l>
+<l:l i="180">Å–</l:l>
+<l:l i="180">Å—</l:l>
+<l:l i="180">Ř</l:l>
+<l:l i="180">Å™</l:l>
+<l:l i="180">È</l:l>
+<l:l i="180">È‘</l:l>
+<l:l i="180">È’</l:l>
+<l:l i="180">È“</l:l>
+<l:l i="180">ɼ</l:l>
+<l:l i="180">ɽ</l:l>
+<l:l i="180">ɾ</l:l>
+<l:l i="180">Ṙ</l:l>
+<l:l i="180">á¹™</l:l>
+<l:l i="180">Ṛ</l:l>
+<l:l i="180">á¹›</l:l>
+<l:l i="180">Ṝ</l:l>
+<l:l i="180">á¹</l:l>
+<l:l i="180">Ṟ</l:l>
+<l:l i="180">ṟ</l:l>
+<l:l i="190">S</l:l>
+<l:l i="190">s</l:l>
+<l:l i="190">Åš</l:l>
+<l:l i="190">Å›</l:l>
+<l:l i="190">Ŝ</l:l>
+<l:l i="190">Å</l:l>
+<l:l i="190">Åž</l:l>
+<l:l i="190">ÅŸ</l:l>
+<l:l i="190">Å </l:l>
+<l:l i="190">Å¡</l:l>
+<l:l i="190">Ș</l:l>
+<l:l i="190">È™</l:l>
+<l:l i="190">Ê‚</l:l>
+<l:l i="190">á¹ </l:l>
+<l:l i="190">ṡ</l:l>
+<l:l i="190">á¹¢</l:l>
+<l:l i="190">á¹£</l:l>
+<l:l i="190">Ṥ</l:l>
+<l:l i="190">á¹¥</l:l>
+<l:l i="190">Ṧ</l:l>
+<l:l i="190">ṧ</l:l>
+<l:l i="190">Ṩ</l:l>
+<l:l i="190">ṩ</l:l>
+<l:l i="200">T</l:l>
+<l:l i="200">t</l:l>
+<l:l i="200">Å¢</l:l>
+<l:l i="200">Å£</l:l>
+<l:l i="200">Ť</l:l>
+<l:l i="200">Å¥</l:l>
+<l:l i="200">Ŧ</l:l>
+<l:l i="200">ŧ</l:l>
+<l:l i="200">Æ«</l:l>
+<l:l i="200">Ƭ</l:l>
+<l:l i="200">Æ­</l:l>
+<l:l i="200">Æ®</l:l>
+<l:l i="200">ʈ</l:l>
+<l:l i="200">Èš</l:l>
+<l:l i="200">È›</l:l>
+<l:l i="200">ȶ</l:l>
+<l:l i="200">Ṫ</l:l>
+<l:l i="200">ṫ</l:l>
+<l:l i="200">Ṭ</l:l>
+<l:l i="200">á¹­</l:l>
+<l:l i="200">á¹®</l:l>
+<l:l i="200">ṯ</l:l>
+<l:l i="200">á¹°</l:l>
+<l:l i="200">á¹±</l:l>
+<l:l i="200">ẗ</l:l>
+<l:l i="210">U</l:l>
+<l:l i="210">u</l:l>
+<l:l i="210">Ù</l:l>
+<l:l i="210">ù</l:l>
+<l:l i="210">Ú</l:l>
+<l:l i="210">ú</l:l>
+<l:l i="210">Û</l:l>
+<l:l i="210">û</l:l>
+<l:l i="210">Ü</l:l>
+<l:l i="210">ü</l:l>
+<l:l i="210">Ũ</l:l>
+<l:l i="210">Å©</l:l>
+<l:l i="210">Ū</l:l>
+<l:l i="210">Å«</l:l>
+<l:l i="210">Ŭ</l:l>
+<l:l i="210">Å­</l:l>
+<l:l i="210">Å®</l:l>
+<l:l i="210">ů</l:l>
+<l:l i="210">Å°</l:l>
+<l:l i="210">ű</l:l>
+<l:l i="210">Ų</l:l>
+<l:l i="210">ų</l:l>
+<l:l i="210">Ư</l:l>
+<l:l i="210">Æ°</l:l>
+<l:l i="210">Ç“</l:l>
+<l:l i="210">Ç”</l:l>
+<l:l i="210">Ç•</l:l>
+<l:l i="210">Ç–</l:l>
+<l:l i="210">Ç—</l:l>
+<l:l i="210">ǘ</l:l>
+<l:l i="210">Ç™</l:l>
+<l:l i="210">Çš</l:l>
+<l:l i="210">Ç›</l:l>
+<l:l i="210">ǜ</l:l>
+<l:l i="210">È”</l:l>
+<l:l i="210">È•</l:l>
+<l:l i="210">È–</l:l>
+<l:l i="210">È—</l:l>
+<l:l i="210">á¹²</l:l>
+<l:l i="210">á¹³</l:l>
+<l:l i="210">á¹´</l:l>
+<l:l i="210">á¹µ</l:l>
+<l:l i="210">Ṷ</l:l>
+<l:l i="210">á¹·</l:l>
+<l:l i="210">Ṹ</l:l>
+<l:l i="210">á¹¹</l:l>
+<l:l i="210">Ṻ</l:l>
+<l:l i="210">á¹»</l:l>
+<l:l i="210">Ụ</l:l>
+<l:l i="210">ụ</l:l>
+<l:l i="210">Ủ</l:l>
+<l:l i="210">ủ</l:l>
+<l:l i="210">Ứ</l:l>
+<l:l i="210">ứ</l:l>
+<l:l i="210">Ừ</l:l>
+<l:l i="210">ừ</l:l>
+<l:l i="210">Ử</l:l>
+<l:l i="210">á»­</l:l>
+<l:l i="210">á»®</l:l>
+<l:l i="210">ữ</l:l>
+<l:l i="210">á»°</l:l>
+<l:l i="210">á»±</l:l>
+<l:l i="220">V</l:l>
+<l:l i="220">v</l:l>
+<l:l i="220">Ʋ</l:l>
+<l:l i="220">Ê‹</l:l>
+<l:l i="220">á¹¼</l:l>
+<l:l i="220">á¹½</l:l>
+<l:l i="220">á¹¾</l:l>
+<l:l i="220">ṿ</l:l>
+<l:l i="230">W</l:l>
+<l:l i="230">w</l:l>
+<l:l i="230">Å´</l:l>
+<l:l i="230">ŵ</l:l>
+<l:l i="230">Ẁ</l:l>
+<l:l i="230">áº</l:l>
+<l:l i="230">Ẃ</l:l>
+<l:l i="230">ẃ</l:l>
+<l:l i="230">Ẅ</l:l>
+<l:l i="230">ẅ</l:l>
+<l:l i="230">Ẇ</l:l>
+<l:l i="230">ẇ</l:l>
+<l:l i="230">Ẉ</l:l>
+<l:l i="230">ẉ</l:l>
+<l:l i="230">ẘ</l:l>
+<l:l i="240">X</l:l>
+<l:l i="240">x</l:l>
+<l:l i="240">Ẋ</l:l>
+<l:l i="240">ẋ</l:l>
+<l:l i="240">Ẍ</l:l>
+<l:l i="240">áº</l:l>
+<l:l i="250">Y</l:l>
+<l:l i="250">y</l:l>
+<l:l i="250">Ã</l:l>
+<l:l i="250">ý</l:l>
+<l:l i="250">ÿ</l:l>
+<l:l i="250">Ÿ</l:l>
+<l:l i="250">Ŷ</l:l>
+<l:l i="250">Å·</l:l>
+<l:l i="250">Ƴ</l:l>
+<l:l i="250">Æ´</l:l>
+<l:l i="250">Ȳ</l:l>
+<l:l i="250">ȳ</l:l>
+<l:l i="250">Ẏ</l:l>
+<l:l i="250">áº</l:l>
+<l:l i="250">ẙ</l:l>
+<l:l i="250">Ỳ</l:l>
+<l:l i="250">ỳ</l:l>
+<l:l i="250">á»´</l:l>
+<l:l i="250">ỵ</l:l>
+<l:l i="250">Ỷ</l:l>
+<l:l i="250">á»·</l:l>
+<l:l i="250">Ỹ</l:l>
+<l:l i="250">ỹ</l:l>
+<l:l i="260">Z</l:l>
+<l:l i="260">z</l:l>
+<l:l i="260">Ź</l:l>
+<l:l i="260">ź</l:l>
+<l:l i="260">Å»</l:l>
+<l:l i="260">ż</l:l>
+<l:l i="260">Ž</l:l>
+<l:l i="260">ž</l:l>
+<l:l i="260">Ƶ</l:l>
+<l:l i="260">ƶ</l:l>
+<l:l i="260">Ȥ</l:l>
+<l:l i="260">È¥</l:l>
+<l:l i="260">Ê</l:l>
+<l:l i="260">Ê‘</l:l>
+<l:l i="260">áº</l:l>
+<l:l i="260">ẑ</l:l>
+<l:l i="260">Ẓ</l:l>
+<l:l i="260">ẓ</l:l>
+<l:l i="260">Ẕ</l:l>
+<l:l i="260">ẕ</l:l>
+</l:letters>
+</l:l10n>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/pt_br.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/pt_br.xml
new file mode 100644
index 0000000..3e71821
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/pt_br.xml
@@ -0,0 +1,1229 @@
+<?xml version="1.0" encoding="utf-8"?>
+<l:l10n xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0" language="pt_br" english-language-name="Portuguese (Brazil)">
+
+<!-- * This file is generated automatically. -->
+<!-- * To submit changes to this file upstream (to the DocBook Project) -->
+<!-- * do not submit an edited version of this file. Instead, submit an -->
+<!-- * edited version of the source file at the following location: -->
+<!-- * -->
+<!-- * https://docbook.svn.sourceforge.net/svnroot/docbook/trunk/gentext/locale/pt_br.xml -->
+<!-- * -->
+<!-- * E-mail the edited pt_br.xml source file to: -->
+<!-- * -->
+<!-- * docbook-developers@lists.sourceforge.net -->
+
+<!-- ******************************************************************** -->
+
+<!-- This file is part of the XSL DocBook Stylesheet distribution. -->
+<!-- See ../README or http://docbook.sf.net/release/xsl/current/ for -->
+<!-- copyright and other information. -->
+
+<!-- ******************************************************************** -->
+<!-- In these files, % with a letter is used for a placeholder: -->
+<!-- %t is the current element's title -->
+<!-- %s is the current element's subtitle (if applicable)-->
+<!-- %n is the current element's number label-->
+<!-- %p is the current element's page number (if applicable)-->
+<!-- ******************************************************************** -->
+
+
+<l:gentext key="Abstract" text="Resumo"/>
+<l:gentext key="abstract" text="resumo"/>
+<l:gentext key="Acknowledgements" text="Agradecimentos"/>
+<l:gentext key="acknowledgements" text="agradecimentos"/>
+<l:gentext key="Answer" text="R:"/>
+<l:gentext key="answer" text="r:"/>
+<l:gentext key="Appendix" text="Apêndice"/>
+<l:gentext key="appendix" text="apêndice"/>
+<l:gentext key="Article" text="Artigo"/>
+<l:gentext key="article" text="artigo"/>
+<l:gentext key="Author" text="Autor"/>
+<l:gentext key="Bibliography" text="Bibliografia"/>
+<l:gentext key="bibliography" text="bibliografia"/>
+<l:gentext key="Book" text="Livro"/>
+<l:gentext key="book" text="livro"/>
+<l:gentext key="CAUTION" text="CUIDADO"/>
+<l:gentext key="Caution" text="Cuidado"/>
+<l:gentext key="caution" text="cuidado"/>
+<l:gentext key="Chapter" text="Capítulo"/>
+<l:gentext key="chapter" text="capítulo"/>
+<l:gentext key="Colophon" text="Considerações finais"/>
+<l:gentext key="colophon" text="considerações finais"/>
+<l:gentext key="Copyright" text="Copyright"/>
+<l:gentext key="copyright" text="copyright"/>
+<l:gentext key="Dedication" text="Dedicatória"/>
+<l:gentext key="dedication" text="dedicatória"/>
+<l:gentext key="Edition" text="Edição"/>
+<l:gentext key="edition" text="edição"/>
+<l:gentext key="Editor" text="Editor"/>
+<l:gentext key="Equation" text="Equação"/>
+<l:gentext key="equation" text="equação"/>
+<l:gentext key="Example" text="Exemplo"/>
+<l:gentext key="example" text="exemplo"/>
+<l:gentext key="Figure" text="Figura"/>
+<l:gentext key="figure" text="figura"/>
+<l:gentext key="Glossary" text="Glossário"/>
+<l:gentext key="glossary" text="glossário"/>
+<l:gentext key="GlossSee" text="Ver"/>
+<l:gentext key="glosssee" text="ver"/>
+<l:gentext key="GlossSeeAlso" text="Ver Também"/>
+<l:gentext key="glossseealso" text="ver também"/>
+<l:gentext key="IMPORTANT" text="IMPORTANTE"/>
+<l:gentext key="important" text="Importante"/>
+<l:gentext key="Important" text="Importante"/>
+<l:gentext key="Index" text="Ãndice Remissivo"/>
+<l:gentext key="index" text="índice remissivo"/>
+<l:gentext key="ISBN" text="ISBN"/>
+<l:gentext key="isbn" text="ISBN"/>
+<l:gentext key="LegalNotice" text="Nota Legal"/>
+<l:gentext key="legalnotice" text="nota legal"/>
+<l:gentext key="MsgAud" text="Audiência"/>
+<l:gentext key="msgaud" text="audiência"/>
+<l:gentext key="MsgLevel" text="Nível"/>
+<l:gentext key="msglevel" text="nível"/>
+<l:gentext key="MsgOrig" text="Origem"/>
+<l:gentext key="msgorig" text="origem"/>
+<l:gentext key="NOTE" text="NOTA"/>
+<l:gentext key="Note" text="Nota"/>
+<l:gentext key="note" text="nota"/>
+<l:gentext key="Part" text="Parte"/>
+<l:gentext key="part" text="parte"/>
+<l:gentext key="Preface" text="Prefácio"/>
+<l:gentext key="preface" text="prefácio"/>
+<l:gentext key="Procedure" text="Procedimento"/>
+<l:gentext key="procedure" text="procedimento"/>
+<l:gentext key="ProductionSet" text="Produção"/>
+<l:gentext key="PubDate" text="Data de Publicação"/>
+<l:gentext key="pubdate" text="data de publicação"/>
+<l:gentext key="Published" text="Publicado"/>
+<l:gentext key="published" text="publicado"/>
+<l:gentext key="Publisher" text="Publicador"/>
+<l:gentext key="Qandadiv" text="P &amp; R"/>
+<l:gentext key="qandadiv" text="P &amp; R"/>
+<l:gentext key="QandASet" text="Perguntas Frequentes"/>
+<l:gentext key="Question" text="P:"/>
+<l:gentext key="question" text="P:"/>
+<l:gentext key="RefEntry" text="Página"/>
+<l:gentext key="refentry" text="página"/>
+<l:gentext key="Reference" text="Referência"/>
+<l:gentext key="reference" text="referência"/>
+<l:gentext key="References" text="Referências"/>
+<l:gentext key="RefName" text="Nome"/>
+<l:gentext key="refname" text="nome"/>
+<l:gentext key="RefSection" text="Seção"/>
+<l:gentext key="refsection" text="seção"/>
+<l:gentext key="RefSynopsisDiv" text="Sinopse"/>
+<l:gentext key="refsynopsisdiv" text="sinopse"/>
+<l:gentext key="RevHistory" text="Histórico de Revisões"/>
+<l:gentext key="revhistory" text="histórico de revisões"/>
+<l:gentext key="revision" text="revisão"/>
+<l:gentext key="Revision" text="Revisão"/>
+<l:gentext key="sect1" text="Seção"/>
+<l:gentext key="sect2" text="Seção"/>
+<l:gentext key="sect3" text="Seção"/>
+<l:gentext key="sect4" text="Seção"/>
+<l:gentext key="sect5" text="Seção"/>
+<l:gentext key="section" text="seção"/>
+<l:gentext key="Section" text="Seção"/>
+<l:gentext key="see" text="ver"/>
+<l:gentext key="See" text="Ver"/>
+<l:gentext key="seealso" text="ver também"/>
+<l:gentext key="Seealso" text="Ver também"/>
+<l:gentext key="SeeAlso" text="Ver Também"/>
+<l:gentext key="set" text="Conjunto"/>
+<l:gentext key="Set" text="Conjunto"/>
+<l:gentext key="setindex" text="Ãndice do Conjunto"/>
+<l:gentext key="SetIndex" text="Ãndice do Conjunto"/>
+<l:gentext key="Sidebar" text="Quadro Lateral"/>
+<l:gentext key="sidebar" text="quadro lateral"/>
+<l:gentext key="step" text="passo"/>
+<l:gentext key="Step" text="Passo"/>
+<l:gentext key="table" text="tabela"/>
+<l:gentext key="Table" text="Tabela"/>
+<l:gentext key="task" text="tarefa"/>
+<l:gentext key="Task" text="Tarefa"/>
+<l:gentext key="tip" text="dica"/>
+<l:gentext key="TIP" text="DICA"/>
+<l:gentext key="Tip" text="Dica"/>
+<l:gentext key="Warning" text="Atenção"/>
+<l:gentext key="warning" text="Atenção"/>
+<l:gentext key="WARNING" text="ATENÇÃO"/>
+<l:gentext key="and" text="e"/>
+<l:gentext key="by" text="por"/>
+<l:gentext key="Edited" text="Editado"/>
+<l:gentext key="edited" text="editado"/>
+<l:gentext key="Editedby" text="Editado por"/>
+<l:gentext key="editedby" text="editado por"/>
+<l:gentext key="in" text="dentro"/>
+<l:gentext key="lastlistcomma" text=","/>
+<l:gentext key="listcomma" text=","/>
+<l:gentext key="notes" text="notas"/>
+<l:gentext key="Notes" text="Notas"/>
+<l:gentext key="Pgs" text="Páginas"/>
+<l:gentext key="pgs" text="páginas"/>
+<l:gentext key="Revisedby" text="Revisado por: "/>
+<l:gentext key="revisedby" text="revisado por: "/>
+<l:gentext key="TableNotes" text="Notas"/>
+<l:gentext key="tablenotes" text="notas"/>
+<l:gentext key="TableofContents" text="Ãndice"/>
+<l:gentext key="tableofcontents" text="índice"/>
+<l:gentext key="unexpectedelementname" text="Nome de elemento inesperado"/>
+<l:gentext key="unsupported" text="não suportado"/>
+<l:gentext key="xrefto" text="xref para"/>
+<l:gentext key="Authors" text="Autores"/>
+<l:gentext key="copyeditor" text="Copidesque"/>
+<l:gentext key="graphicdesigner" text="Designer Gráfico"/>
+<l:gentext key="productioneditor" text="Editor de Produção"/>
+<l:gentext key="technicaleditor" text="Editor Técnico"/>
+<l:gentext key="translator" text="Tradutor"/>
+<l:gentext key="listofequations" text="lista de equações"/>
+<l:gentext key="ListofEquations" text="Lista de Equações"/>
+<l:gentext key="ListofExamples" text="Lista de Exemplos"/>
+<l:gentext key="listofexamples" text="lista de exemplos"/>
+<l:gentext key="ListofFigures" text="Lista de Figuras"/>
+<l:gentext key="listoffigures" text="lista de figuras"/>
+<l:gentext key="ListofProcedures" text="Lista de Procedimentos"/>
+<l:gentext key="listofprocedures" text="lista de procedimentos"/>
+<l:gentext key="listoftables" text="lista de tabelas"/>
+<l:gentext key="ListofTables" text="Lista de Tabelas"/>
+<l:gentext key="ListofUnknown" text="Lista de ???"/>
+<l:gentext key="listofunknown" text="Lista de ???"/>
+<l:gentext key="nav-home" text="Principal"/>
+<l:gentext key="nav-next" text="Próxima"/>
+<l:gentext key="nav-next-sibling" text="Fim"/>
+<l:gentext key="nav-prev" text="Anterior"/>
+<l:gentext key="nav-prev-sibling" text="Início"/>
+<l:gentext key="nav-up" text="Acima"/>
+<l:gentext key="nav-toc" text="TdC"/>
+<l:gentext key="Draft" text="Rascunho"/>
+<l:gentext key="above" text="acima"/>
+<l:gentext key="below" text="abaixo"/>
+<l:gentext key="sectioncalled" text="A seção chamada"/>
+<l:gentext key="index symbols" text="Símbolos"/>
+<l:gentext key="writing-mode" text="lr-tb"/>
+<l:gentext key="lowercase.alpha" text="abcdefghijklmnopqrstuvwxyz"/>
+<l:gentext key="uppercase.alpha" text="ABCDEFGHIJKLMNOPQRSTUVWXYZ"/>
+<l:gentext key="normalize.sort.input" text="AaÀàÃáÂâÃãÄäÅåĀÄĂ㥹ÇǎǞǟǠǡǺǻȀÈȂȃȦȧḀá¸áºšáº áº¡áº¢áº£áº¤áº¥áº¦áº§áº¨áº©áºªáº«áº¬áº­áº®áº¯áº°áº±áº²áº³áº´áºµáº¶áº·BbÆ€ÆɓƂƃḂḃḄḅḆḇCcÇçĆćĈĉĊċČÄƇƈɕḈḉDdÄŽÄÄđƊɗƋƌDžDzȡɖḊḋḌá¸á¸Žá¸á¸á¸‘ḒḓEeÈèÉéÊêËëĒēĔĕĖėĘęĚěȄȅȆȇȨȩḔḕḖḗḘḙḚḛḜá¸áº¸áº¹áººáº»áº¼áº½áº¾áº¿á»€á»á»‚ểỄễỆệFfƑƒḞḟGgÄœÄĞğĠġĢģƓɠǤǥǦǧǴǵḠḡHhĤĥĦħȞȟɦḢḣḤḥḦḧḨḩḪḫẖIiÌìÃíÎîÃïĨĩĪīĬĭĮįİƗɨÇÇȈȉȊȋḬḭḮḯỈỉỊịJjĴĵǰÊKkĶķƘƙǨǩḰḱḲḳḴḵLlĹĺĻļĽľĿŀÅłƚLjȴɫɬɭḶḷḸḹḺḻḼḽMmɱḾḿṀá¹á¹‚ṃNnÑñŃńŅņŇňÆɲƞȠNjǸǹȵɳṄṅṆṇṈṉṊṋOoÒòÓóÔôÕõÖöØøŌÅÅŽÅÅőƟƠơǑǒǪǫǬǭǾǿȌÈÈŽÈȪȫȬȭȮȯȰȱṌá¹á¹Žá¹á¹á¹‘ṒṓỌá»á»Žá»á»á»‘ỒồỔổỖỗỘộỚớỜá»á»žá»Ÿá» á»¡á»¢á»£PpƤƥṔṕṖṗQqÊ RrŔŕŖŗŘřÈȑȒȓɼɽɾṘṙṚṛṜá¹á¹žá¹ŸSsŚśŜÅŞşŠšȘșʂṠṡṢṣṤṥṦṧṨṩTtŢţŤťŦŧƫƬƭƮʈȚțȶṪṫṬṭṮṯṰṱẗUuÙùÚúÛûÜüŨũŪūŬŭŮůŰűŲųƯưǓǔǕǖǗǘǙǚǛǜȔȕȖȗṲṳṴṵṶṷṸṹṺṻỤụỦủỨứỪừỬửỮữỰựVvƲʋṼṽṾṿWwŴŵẀáºáº‚ẃẄẅẆẇẈẉẘXxẊẋẌáºYyÃýÿŸŶŷƳƴȲȳẎáºáº™á»²á»³á»´á»µá»¶á»·á»¸á»¹ZzŹźŻżŽžƵƶȤȥÊÊ‘áºáº‘ẒẓẔẕẕ" lang="en"/>
+<l:gentext key="normalize.sort.output" text="AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBCCCCCCCCCCCCCCCCCDDDDDDDDDDDDDDDDDDDDDDDDEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEFFFFFFGGGGGGGGGGGGGGGGGGGGHHHHHHHHHHHHHHHHHHHHIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIJJJJJJKKKKKKKKKKKKKKLLLLLLLLLLLLLLLLLLLLLLLLLLMMMMMMMMMNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOPPPPPPPPQQQRRRRRRRRRRRRRRRRRRRRRRRSSSSSSSSSSSSSSSSSSSSSSSTTTTTTTTTTTTTTTTTTTTTTTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUVVVVVVVVWWWWWWWWWWWWWWWXXXXXXYYYYYYYYYYYYYYYYYYYYYYYZZZZZZZZZZZZZZZZZZZZZ" lang="en"/>
+<l:dingbat key="startquote" text="“"/>
+<l:dingbat key="endquote" text="â€"/>
+<l:dingbat key="nestedstartquote" text="‘"/>
+<l:dingbat key="nestedendquote" text="’"/>
+<l:dingbat key="singlestartquote" text="‘" lang="en"/>
+<l:dingbat key="singleendquote" text="’" lang="en"/>
+<l:dingbat key="bullet" text="•"/>
+<l:gentext key="hyphenation-character" text="-" lang="en"/>
+<l:gentext key="hyphenation-push-character-count" text="2" lang="en"/>
+<l:gentext key="hyphenation-remain-character-count" text="2" lang="en"/>
+<l:context name="styles"><l:template name="person-name" text="first-last"/>
+</l:context>
+<l:context name="title"><l:template name="abstract" text="%t"/>
+<l:template name="acknowledgements" text="%t" lang="en"/>
+<l:template name="answer" text="%t"/>
+<l:template name="appendix" text="Apêndice %n. %t"/>
+<l:template name="article" text="%t"/>
+<l:template name="authorblurb" text="%t"/>
+<l:template name="bibliodiv" text="%t"/>
+<l:template name="biblioentry" text="%t"/>
+<l:template name="bibliography" text="%t"/>
+<l:template name="bibliolist" text="%t" lang="en"/>
+<l:template name="bibliomixed" text="%t"/>
+<l:template name="bibliomset" text="%t"/>
+<l:template name="biblioset" text="%t"/>
+<l:template name="blockquote" text="%t"/>
+<l:template name="book" text="%t"/>
+<l:template name="calloutlist" text="%t"/>
+<l:template name="caution" text="%t"/>
+<l:template name="chapter" text="Capítulo %n. %t"/>
+<l:template name="colophon" text="%t"/>
+<l:template name="dedication" text="%t"/>
+<l:template name="equation" text="Equação %n. %t"/>
+<l:template name="example" text="Exemplo %n. %t"/>
+<l:template name="figure" text="Figura %n. %t"/>
+<l:template name="foil" text="%t" lang="en"/>
+<l:template name="foilgroup" text="%t" lang="en"/>
+<l:template name="formalpara" text="%t"/>
+<l:template name="glossary" text="%t"/>
+<l:template name="glossdiv" text="%t"/>
+<l:template name="glosslist" text="%t" lang="en"/>
+<l:template name="glossentry" text="%t" lang="en"/>
+<l:template name="important" text="%t"/>
+<l:template name="index" text="%t"/>
+<l:template name="indexdiv" text="%t"/>
+<l:template name="itemizedlist" text="%t"/>
+<l:template name="legalnotice" text="%t"/>
+<l:template name="listitem" text=""/>
+<l:template name="lot" text="%t"/>
+<l:template name="msg" text="%t"/>
+<l:template name="msgexplan" text="%t"/>
+<l:template name="msgmain" text="%t"/>
+<l:template name="msgrel" text="%t"/>
+<l:template name="msgset" text="%t"/>
+<l:template name="msgsub" text="%t"/>
+<l:template name="note" text="%t"/>
+<l:template name="orderedlist" text="%t"/>
+<l:template name="part" text="Parte %n. %t"/>
+<l:template name="partintro" text="%t"/>
+<l:template name="preface" text="%t"/>
+<l:template name="procedure" text="%t"/>
+<l:template name="procedure.formal" text="Procedimento %n. %t"/>
+<l:template name="productionset" text="%t"/>
+<l:template name="productionset.formal" text="Produção %n"/>
+<l:template name="qandadiv" text="%t"/>
+<l:template name="qandaentry" text="%t"/>
+<l:template name="qandaset" text="%t"/>
+<l:template name="question" text="%t"/>
+<l:template name="refentry" text="%t"/>
+<l:template name="reference" text="%t"/>
+<l:template name="refsection" text="%t" lang="en"/>
+<l:template name="refsect1" text="%t"/>
+<l:template name="refsect2" text="%t"/>
+<l:template name="refsect3" text="%t"/>
+<l:template name="refsynopsisdiv" text="%t"/>
+<l:template name="refsynopsisdivinfo" text="%t"/>
+<l:template name="segmentedlist" text="%t"/>
+<l:template name="set" text="%t"/>
+<l:template name="setindex" text="%t"/>
+<l:template name="sidebar" text="%t"/>
+<l:template name="step" text="%t"/>
+<l:template name="table" text="Tabela %n. %t"/>
+<l:template name="task" text="%t" lang="en"/>
+<l:template name="tasksummary" text="%t" lang="en"/>
+<l:template name="taskprerequisites" text="%t" lang="en"/>
+<l:template name="taskrelated" text="%t" lang="en"/>
+<l:template name="tip" text="%t"/>
+<l:template name="toc" text="%t"/>
+<l:template name="variablelist" text="%t"/>
+<l:template name="varlistentry" text="" lang="en"/>
+<l:template name="warning" text="%t"/>
+</l:context>
+<l:context name="title-unnumbered"><l:template name="appendix" text="%t"/>
+<l:template name="article/appendix" text="%t" lang="en"/>
+<l:template name="bridgehead" text="%t"/>
+<l:template name="chapter" text="%t"/>
+<l:template name="sect1" text="%t"/>
+<l:template name="sect2" text="%t"/>
+<l:template name="sect3" text="%t"/>
+<l:template name="sect4" text="%t"/>
+<l:template name="sect5" text="%t"/>
+<l:template name="section" text="%t"/>
+<l:template name="simplesect" text="%t"/>
+<l:template name="part" text="%t" lang="en"/>
+</l:context>
+<l:context name="title-numbered"><l:template name="appendix" text="Apêndice %n. %t"/>
+<l:template name="article/appendix" text="%n. %t" lang="en"/>
+<l:template name="bridgehead" text="%t"/>
+<l:template name="chapter" text="Capítulo %n. %t"/>
+<l:template name="part" text="Parte %n. %t"/>
+<l:template name="sect1" text="%n. %t"/>
+<l:template name="sect2" text="%n. %t"/>
+<l:template name="sect3" text="%n. %t"/>
+<l:template name="sect4" text="%n. %t"/>
+<l:template name="sect5" text="%n. %t"/>
+<l:template name="section" text="%n. %t"/>
+<l:template name="simplesect" text="%n. %t"/>
+</l:context>
+<l:context name="subtitle"><l:template name="appendix" text="%s"/>
+<l:template name="acknowledgements" text="%s" lang="en"/>
+<l:template name="article" text="%s"/>
+<l:template name="bibliodiv" text="%s"/>
+<l:template name="biblioentry" text="%s"/>
+<l:template name="bibliography" text="%s"/>
+<l:template name="bibliomixed" text="%s"/>
+<l:template name="bibliomset" text="%s"/>
+<l:template name="biblioset" text="%s"/>
+<l:template name="book" text="%s"/>
+<l:template name="chapter" text="%s"/>
+<l:template name="colophon" text="%s"/>
+<l:template name="dedication" text="%s"/>
+<l:template name="glossary" text="%s"/>
+<l:template name="glossdiv" text="%s"/>
+<l:template name="index" text="%s"/>
+<l:template name="indexdiv" text="%s"/>
+<l:template name="lot" text="%s"/>
+<l:template name="part" text="%s"/>
+<l:template name="partintro" text="%s"/>
+<l:template name="preface" text="%s"/>
+<l:template name="refentry" text="%s"/>
+<l:template name="reference" text="%s"/>
+<l:template name="refsection" text="%s" lang="en"/>
+<l:template name="refsect1" text="%s"/>
+<l:template name="refsect2" text="%s"/>
+<l:template name="refsect3" text="%s"/>
+<l:template name="refsynopsisdiv" text="%s"/>
+<l:template name="sect1" text="%s"/>
+<l:template name="sect2" text="%s"/>
+<l:template name="sect3" text="%s"/>
+<l:template name="sect4" text="%s"/>
+<l:template name="sect5" text="%s"/>
+<l:template name="section" text="%s"/>
+<l:template name="set" text="%s"/>
+<l:template name="setindex" text="%s"/>
+<l:template name="sidebar" text="%s"/>
+<l:template name="simplesect" text="%s"/>
+<l:template name="toc" text="%s"/>
+</l:context>
+<l:context name="xref"><l:template name="abstract" text="%t"/>
+<l:template name="acknowledgements" text="%t" lang="en"/>
+<l:template name="answer" text="R: %n"/>
+<l:template name="appendix" text="%t"/>
+<l:template name="article" text="%t"/>
+<l:template name="authorblurb" text="%t"/>
+<l:template name="bibliodiv" text="%t"/>
+<l:template name="bibliography" text="%t"/>
+<l:template name="bibliomset" text="%t"/>
+<l:template name="biblioset" text="%t"/>
+<l:template name="blockquote" text="%t"/>
+<l:template name="book" text="%t"/>
+<l:template name="calloutlist" text="%t"/>
+<l:template name="caution" text="%t"/>
+<l:template name="chapter" text="%t"/>
+<l:template name="colophon" text="%t"/>
+<l:template name="constraintdef" text="%t"/>
+<l:template name="dedication" text="%t"/>
+<l:template name="equation" text="%t"/>
+<l:template name="example" text="%t"/>
+<l:template name="figure" text="%t"/>
+<l:template name="foil" text="%t" lang="en"/>
+<l:template name="foilgroup" text="%t" lang="en"/>
+<l:template name="formalpara" text="%t"/>
+<l:template name="glossary" text="%t"/>
+<l:template name="glossdiv" text="%t"/>
+<l:template name="important" text="%t"/>
+<l:template name="index" text="%t"/>
+<l:template name="indexdiv" text="%t"/>
+<l:template name="itemizedlist" text="%t"/>
+<l:template name="legalnotice" text="%t"/>
+<l:template name="listitem" text="%n"/>
+<l:template name="lot" text="%t"/>
+<l:template name="msg" text="%t"/>
+<l:template name="msgexplan" text="%t"/>
+<l:template name="msgmain" text="%t"/>
+<l:template name="msgrel" text="%t"/>
+<l:template name="msgset" text="%t"/>
+<l:template name="msgsub" text="%t"/>
+<l:template name="note" text="%t"/>
+<l:template name="orderedlist" text="%t"/>
+<l:template name="part" text="%t"/>
+<l:template name="partintro" text="%t"/>
+<l:template name="preface" text="%t"/>
+<l:template name="procedure" text="%t"/>
+<l:template name="productionset" text="%t"/>
+<l:template name="qandadiv" text="%t"/>
+<l:template name="qandaentry" text="P: %n"/>
+<l:template name="qandaset" text="%t"/>
+<l:template name="question" text="P: %n"/>
+<l:template name="reference" text="%t"/>
+<l:template name="refsynopsisdiv" text="%t"/>
+<l:template name="segmentedlist" text="%t"/>
+<l:template name="set" text="%t"/>
+<l:template name="setindex" text="%t"/>
+<l:template name="sidebar" text="%t"/>
+<l:template name="table" text="%t"/>
+<l:template name="task" text="%t" lang="en"/>
+<l:template name="tip" text="%t"/>
+<l:template name="toc" text="%t"/>
+<l:template name="variablelist" text="%t"/>
+<l:template name="varlistentry" text="%n"/>
+<l:template name="warning" text="%t"/>
+<l:template name="olink.document.citation" text=" in %o" lang="en"/>
+<l:template name="olink.page.citation" text=" (page %p)" lang="en"/>
+<l:template name="page.citation" text=" [%p]"/>
+<l:template name="page" text="(page %p)" lang="en"/>
+<l:template name="docname" text=" in %o" lang="en"/>
+<l:template name="docnamelong" text=" in the document titled %o" lang="en"/>
+<l:template name="pageabbrev" text="(p. %p)" lang="en"/>
+<l:template name="Page" text="Page %p" lang="en"/>
+<l:template name="bridgehead" text="“%tâ€"/>
+<l:template name="refsection" text="“%tâ€"/>
+<l:template name="refsect1" text="“%tâ€"/>
+<l:template name="refsect2" text="“%tâ€"/>
+<l:template name="refsect3" text="“%tâ€"/>
+<l:template name="sect1" text="“%tâ€"/>
+<l:template name="sect2" text="“%tâ€"/>
+<l:template name="sect3" text="“%tâ€"/>
+<l:template name="sect4" text="“%tâ€"/>
+<l:template name="sect5" text="“%tâ€"/>
+<l:template name="section" text="“%tâ€"/>
+<l:template name="simplesect" text="“%tâ€"/>
+</l:context>
+<l:context name="xref-number"><l:template name="answer" text="R: %n"/>
+<l:template name="appendix" text="Apêndice %n"/>
+<l:template name="bridgehead" text="Seção %n"/>
+<l:template name="chapter" text="Capítulo %n"/>
+<l:template name="equation" text="Equação %n"/>
+<l:template name="example" text="Exemplo %n"/>
+<l:template name="figure" text="Figura %n"/>
+<l:template name="part" text="Parte %n"/>
+<l:template name="procedure" text="Procedimento %n"/>
+<l:template name="productionset" text="Produção %n"/>
+<l:template name="qandadiv" text="P &amp; R %n"/>
+<l:template name="qandaentry" text="P: %n"/>
+<l:template name="question" text="P: %n"/>
+<l:template name="sect1" text="Seção %n"/>
+<l:template name="sect2" text="Seção %n"/>
+<l:template name="sect3" text="Seção %n"/>
+<l:template name="sect4" text="Seção %n"/>
+<l:template name="sect5" text="Seção %n"/>
+<l:template name="section" text="Seção %n"/>
+<l:template name="table" text="Tabela %n"/>
+</l:context>
+<l:context name="xref-number-and-title"><l:template name="appendix" text="Apêndice %n, %t"/>
+<l:template name="bridgehead" text="Seção %n, “%tâ€"/>
+<l:template name="chapter" text="Capítulo %n, %t"/>
+<l:template name="equation" text="Equação %n, “%tâ€"/>
+<l:template name="example" text="Exemplo %n, “%tâ€"/>
+<l:template name="figure" text="Figura %n, “%tâ€"/>
+<l:template name="part" text="Parte %n, “%tâ€"/>
+<l:template name="procedure" text="Procedimento %n, “%tâ€"/>
+<l:template name="productionset" text="Produção %n, “%tâ€"/>
+<l:template name="qandadiv" text="P &amp; R %n, “%tâ€"/>
+<l:template name="refsect1" text="A seção chamada “%tâ€"/>
+<l:template name="refsect2" text="A seção chamada “%tâ€"/>
+<l:template name="refsect3" text="A seção chamada “%tâ€"/>
+<l:template name="refsection" text="A seção chamada “%tâ€"/>
+<l:template name="sect1" text="Seção %n, “%tâ€"/>
+<l:template name="sect2" text="Seção %n, “%tâ€"/>
+<l:template name="sect3" text="Seção %n, “%tâ€"/>
+<l:template name="sect4" text="Seção %n, “%tâ€"/>
+<l:template name="sect5" text="Seção %n, “%tâ€"/>
+<l:template name="section" text="Seção %n, “%tâ€"/>
+<l:template name="simplesect" text="A seção chamada “%tâ€"/>
+<l:template name="table" text="Tabela %n, “%tâ€"/>
+</l:context>
+<l:context name="authorgroup"><l:template name="sep" text=", "/>
+<l:template name="sep2" text=" e "/>
+<l:template name="seplast" text=", e "/>
+</l:context>
+<l:context name="glossary"><l:template name="see" text="Ver %t."/>
+<l:template name="seealso" text="Ver Também %t."/>
+<l:template name="seealso-separator" text=", "/>
+</l:context>
+<l:context name="msgset"><l:template name="MsgAud" text="Audiência: "/>
+<l:template name="MsgLevel" text="Nível: "/>
+<l:template name="MsgOrig" text="Origem: "/>
+</l:context>
+<l:context name="datetime"><l:template name="format" text="d/m/Y"/>
+</l:context>
+<l:context name="termdef"><l:template name="prefix" text="[Definition: "/>
+<l:template name="suffix" text="]"/>
+</l:context>
+<l:context name="datetime-full"><l:template name="January" text="Janeiro"/>
+<l:template name="February" text="Fevereiri"/>
+<l:template name="March" text="Março"/>
+<l:template name="April" text="Abril"/>
+<l:template name="May" text="Maio"/>
+<l:template name="June" text="Junho"/>
+<l:template name="July" text="Jullho"/>
+<l:template name="August" text="Agosto"/>
+<l:template name="September" text="Setembro"/>
+<l:template name="October" text="Outubro"/>
+<l:template name="November" text="Novembro"/>
+<l:template name="December" text="Dezembro"/>
+<l:template name="Monday" text="Segunda-feira"/>
+<l:template name="Tuesday" text="Terça-feira"/>
+<l:template name="Wednesday" text="Quarta-feira"/>
+<l:template name="Thursday" text="Quinta-feira"/>
+<l:template name="Friday" text="Sexta-feira"/>
+<l:template name="Saturday" text="Sabado"/>
+<l:template name="Sunday" text="Domingo"/>
+</l:context>
+<l:context name="datetime-abbrev"><l:template name="Jan" text="Jan"/>
+<l:template name="Feb" text="Fev"/>
+<l:template name="Mar" text="Mar"/>
+<l:template name="Apr" text="Abr"/>
+<l:template name="May" text="Maio"/>
+<l:template name="Jun" text="Jun"/>
+<l:template name="Jul" text="Jul"/>
+<l:template name="Aug" text="Ago"/>
+<l:template name="Sep" text="Set"/>
+<l:template name="Oct" text="Out"/>
+<l:template name="Nov" text="Nov"/>
+<l:template name="Dec" text="Dez"/>
+<l:template name="Mon" text="Seg"/>
+<l:template name="Tue" text="Ter"/>
+<l:template name="Wed" text="Qua"/>
+<l:template name="Thu" text="Qui"/>
+<l:template name="Fri" text="Sex"/>
+<l:template name="Sat" text="Sab"/>
+<l:template name="Sun" text="Dom"/>
+</l:context>
+<l:context name="htmlhelp"><l:template name="langcode" text="0x0416 Portuguese (BRAZIL)"/>
+</l:context>
+<l:context name="index"><l:template name="term-separator" text=", "/>
+<l:template name="number-separator" text=", "/>
+<l:template name="range-separator" text="-"/>
+</l:context>
+<l:context name="iso690"><l:template name="lastfirst.sep" text=", "/>
+<l:template name="alt.person.two.sep" text=" – "/>
+<l:template name="alt.person.last.sep" text=" – "/>
+<l:template name="alt.person.more.sep" text=" – "/>
+<l:template name="primary.editor" text=" (ed.)"/>
+<l:template name="primary.many" text=", et al."/>
+<l:template name="primary.sep" text=". "/>
+<l:template name="submaintitle.sep" text=": "/>
+<l:template name="title.sep" text=". "/>
+<l:template name="othertitle.sep" text=", "/>
+<l:template name="medium1" text=" ["/>
+<l:template name="medium2" text="]"/>
+<l:template name="secondary.person.sep" text="; "/>
+<l:template name="secondary.sep" text=". "/>
+<l:template name="respons.sep" text=". "/>
+<l:template name="edition.sep" text=". "/>
+<l:template name="edition.serial.sep" text=", "/>
+<l:template name="issuing.range" text="-"/>
+<l:template name="issuing.div" text=", "/>
+<l:template name="issuing.sep" text=". "/>
+<l:template name="partnr.sep" text=". "/>
+<l:template name="placepubl.sep" text=": "/>
+<l:template name="publyear.sep" text=", "/>
+<l:template name="pubinfo.sep" text=". "/>
+<l:template name="spec.pubinfo.sep" text=", "/>
+<l:template name="upd.sep" text=", "/>
+<l:template name="datecit1" text=" [cited "/>
+<l:template name="datecit2" text="]"/>
+<l:template name="extent.sep" text=". "/>
+<l:template name="locs.sep" text=", "/>
+<l:template name="location.sep" text=". "/>
+<l:template name="serie.sep" text=". "/>
+<l:template name="notice.sep" text=". "/>
+<l:template name="access" text="Available "/>
+<l:template name="acctoo" text="Also available "/>
+<l:template name="onwww" text="from World Wide Web"/>
+<l:template name="oninet" text="from Internet"/>
+<l:template name="access.end" text=": "/>
+<l:template name="link1" text="&lt;"/>
+<l:template name="link2" text="&gt;"/>
+<l:template name="access.sep" text=". "/>
+<l:template name="isbn" text="ISBN "/>
+<l:template name="issn" text="ISSN "/>
+<l:template name="stdnum.sep" text=". "/>
+<l:template name="patcountry.sep" text=". "/>
+<l:template name="pattype.sep" text=", "/>
+<l:template name="patnum.sep" text=". "/>
+<l:template name="patdate.sep" text=". "/>
+</l:context><l:letters><l:l i="-1"/>
+<l:l i="0">Símbolos</l:l>
+<l:l i="10">A</l:l>
+<l:l i="10">a</l:l>
+<l:l i="10">À</l:l>
+<l:l i="10">à</l:l>
+<l:l i="10">Ã</l:l>
+<l:l i="10">á</l:l>
+<l:l i="10">Â</l:l>
+<l:l i="10">â</l:l>
+<l:l i="10">Ã</l:l>
+<l:l i="10">ã</l:l>
+<l:l i="10">Ä</l:l>
+<l:l i="10">ä</l:l>
+<l:l i="10">Ã…</l:l>
+<l:l i="10">Ã¥</l:l>
+<l:l i="10">Ä€</l:l>
+<l:l i="10">Ä</l:l>
+<l:l i="10">Ä‚</l:l>
+<l:l i="10">ă</l:l>
+<l:l i="10">Ä„</l:l>
+<l:l i="10">Ä…</l:l>
+<l:l i="10">Ç</l:l>
+<l:l i="10">ÇŽ</l:l>
+<l:l i="10">Çž</l:l>
+<l:l i="10">ÇŸ</l:l>
+<l:l i="10">Ç </l:l>
+<l:l i="10">Ç¡</l:l>
+<l:l i="10">Ǻ</l:l>
+<l:l i="10">Ç»</l:l>
+<l:l i="10">È€</l:l>
+<l:l i="10">È</l:l>
+<l:l i="10">È‚</l:l>
+<l:l i="10">ȃ</l:l>
+<l:l i="10">Ȧ</l:l>
+<l:l i="10">ȧ</l:l>
+<l:l i="10">Ḁ</l:l>
+<l:l i="10">á¸</l:l>
+<l:l i="10">ẚ</l:l>
+<l:l i="10">Ạ</l:l>
+<l:l i="10">ạ</l:l>
+<l:l i="10">Ả</l:l>
+<l:l i="10">ả</l:l>
+<l:l i="10">Ấ</l:l>
+<l:l i="10">ấ</l:l>
+<l:l i="10">Ầ</l:l>
+<l:l i="10">ầ</l:l>
+<l:l i="10">Ẩ</l:l>
+<l:l i="10">ẩ</l:l>
+<l:l i="10">Ẫ</l:l>
+<l:l i="10">ẫ</l:l>
+<l:l i="10">Ậ</l:l>
+<l:l i="10">ậ</l:l>
+<l:l i="10">Ắ</l:l>
+<l:l i="10">ắ</l:l>
+<l:l i="10">Ằ</l:l>
+<l:l i="10">ằ</l:l>
+<l:l i="10">Ẳ</l:l>
+<l:l i="10">ẳ</l:l>
+<l:l i="10">Ẵ</l:l>
+<l:l i="10">ẵ</l:l>
+<l:l i="10">Ặ</l:l>
+<l:l i="10">ặ</l:l>
+<l:l i="20">B</l:l>
+<l:l i="20">b</l:l>
+<l:l i="20">Æ€</l:l>
+<l:l i="20">Æ</l:l>
+<l:l i="20">É“</l:l>
+<l:l i="20">Æ‚</l:l>
+<l:l i="20">ƃ</l:l>
+<l:l i="20">Ḃ</l:l>
+<l:l i="20">ḃ</l:l>
+<l:l i="20">Ḅ</l:l>
+<l:l i="20">ḅ</l:l>
+<l:l i="20">Ḇ</l:l>
+<l:l i="20">ḇ</l:l>
+<l:l i="30">C</l:l>
+<l:l i="30">c</l:l>
+<l:l i="30">Ç</l:l>
+<l:l i="30">ç</l:l>
+<l:l i="30">Ć</l:l>
+<l:l i="30">ć</l:l>
+<l:l i="30">Ĉ</l:l>
+<l:l i="30">ĉ</l:l>
+<l:l i="30">ÄŠ</l:l>
+<l:l i="30">Ä‹</l:l>
+<l:l i="30">Č</l:l>
+<l:l i="30">Ä</l:l>
+<l:l i="30">Ƈ</l:l>
+<l:l i="30">ƈ</l:l>
+<l:l i="30">É•</l:l>
+<l:l i="30">Ḉ</l:l>
+<l:l i="30">ḉ</l:l>
+<l:l i="40">D</l:l>
+<l:l i="40">d</l:l>
+<l:l i="40">ÄŽ</l:l>
+<l:l i="40">Ä</l:l>
+<l:l i="40">Ä</l:l>
+<l:l i="40">Ä‘</l:l>
+<l:l i="40">ÆŠ</l:l>
+<l:l i="40">É—</l:l>
+<l:l i="40">Æ‹</l:l>
+<l:l i="40">ƌ</l:l>
+<l:l i="40">Ç…</l:l>
+<l:l i="40">Dz</l:l>
+<l:l i="40">È¡</l:l>
+<l:l i="40">É–</l:l>
+<l:l i="40">Ḋ</l:l>
+<l:l i="40">ḋ</l:l>
+<l:l i="40">Ḍ</l:l>
+<l:l i="40">á¸</l:l>
+<l:l i="40">Ḏ</l:l>
+<l:l i="40">á¸</l:l>
+<l:l i="40">á¸</l:l>
+<l:l i="40">ḑ</l:l>
+<l:l i="40">Ḓ</l:l>
+<l:l i="40">ḓ</l:l>
+<l:l i="50">E</l:l>
+<l:l i="50">e</l:l>
+<l:l i="50">È</l:l>
+<l:l i="50">è</l:l>
+<l:l i="50">É</l:l>
+<l:l i="50">é</l:l>
+<l:l i="50">Ê</l:l>
+<l:l i="50">ê</l:l>
+<l:l i="50">Ë</l:l>
+<l:l i="50">ë</l:l>
+<l:l i="50">Ä’</l:l>
+<l:l i="50">Ä“</l:l>
+<l:l i="50">Ä”</l:l>
+<l:l i="50">Ä•</l:l>
+<l:l i="50">Ä–</l:l>
+<l:l i="50">Ä—</l:l>
+<l:l i="50">Ę</l:l>
+<l:l i="50">Ä™</l:l>
+<l:l i="50">Äš</l:l>
+<l:l i="50">Ä›</l:l>
+<l:l i="50">È„</l:l>
+<l:l i="50">È…</l:l>
+<l:l i="50">Ȇ</l:l>
+<l:l i="50">ȇ</l:l>
+<l:l i="50">Ȩ</l:l>
+<l:l i="50">È©</l:l>
+<l:l i="50">Ḕ</l:l>
+<l:l i="50">ḕ</l:l>
+<l:l i="50">Ḗ</l:l>
+<l:l i="50">ḗ</l:l>
+<l:l i="50">Ḙ</l:l>
+<l:l i="50">ḙ</l:l>
+<l:l i="50">Ḛ</l:l>
+<l:l i="50">ḛ</l:l>
+<l:l i="50">Ḝ</l:l>
+<l:l i="50">á¸</l:l>
+<l:l i="50">Ẹ</l:l>
+<l:l i="50">ẹ</l:l>
+<l:l i="50">Ẻ</l:l>
+<l:l i="50">ẻ</l:l>
+<l:l i="50">Ẽ</l:l>
+<l:l i="50">ẽ</l:l>
+<l:l i="50">Ế</l:l>
+<l:l i="50">ế</l:l>
+<l:l i="50">Ề</l:l>
+<l:l i="50">á»</l:l>
+<l:l i="50">Ể</l:l>
+<l:l i="50">ể</l:l>
+<l:l i="50">Ễ</l:l>
+<l:l i="50">á»…</l:l>
+<l:l i="50">Ệ</l:l>
+<l:l i="50">ệ</l:l>
+<l:l i="60">F</l:l>
+<l:l i="60">f</l:l>
+<l:l i="60">Æ‘</l:l>
+<l:l i="60">Æ’</l:l>
+<l:l i="60">Ḟ</l:l>
+<l:l i="60">ḟ</l:l>
+<l:l i="70">G</l:l>
+<l:l i="70">g</l:l>
+<l:l i="70">Ĝ</l:l>
+<l:l i="70">Ä</l:l>
+<l:l i="70">Äž</l:l>
+<l:l i="70">ÄŸ</l:l>
+<l:l i="70">Ä </l:l>
+<l:l i="70">Ä¡</l:l>
+<l:l i="70">Ä¢</l:l>
+<l:l i="70">Ä£</l:l>
+<l:l i="70">Æ“</l:l>
+<l:l i="70">É </l:l>
+<l:l i="70">Ǥ</l:l>
+<l:l i="70">Ç¥</l:l>
+<l:l i="70">Ǧ</l:l>
+<l:l i="70">ǧ</l:l>
+<l:l i="70">Ç´</l:l>
+<l:l i="70">ǵ</l:l>
+<l:l i="70">Ḡ</l:l>
+<l:l i="70">ḡ</l:l>
+<l:l i="80">H</l:l>
+<l:l i="80">h</l:l>
+<l:l i="80">Ĥ</l:l>
+<l:l i="80">Ä¥</l:l>
+<l:l i="80">Ħ</l:l>
+<l:l i="80">ħ</l:l>
+<l:l i="80">Èž</l:l>
+<l:l i="80">ÈŸ</l:l>
+<l:l i="80">ɦ</l:l>
+<l:l i="80">Ḣ</l:l>
+<l:l i="80">ḣ</l:l>
+<l:l i="80">Ḥ</l:l>
+<l:l i="80">ḥ</l:l>
+<l:l i="80">Ḧ</l:l>
+<l:l i="80">ḧ</l:l>
+<l:l i="80">Ḩ</l:l>
+<l:l i="80">ḩ</l:l>
+<l:l i="80">Ḫ</l:l>
+<l:l i="80">ḫ</l:l>
+<l:l i="80">ẖ</l:l>
+<l:l i="90">I</l:l>
+<l:l i="90">i</l:l>
+<l:l i="90">Ì</l:l>
+<l:l i="90">ì</l:l>
+<l:l i="90">Ã</l:l>
+<l:l i="90">í</l:l>
+<l:l i="90">ÃŽ</l:l>
+<l:l i="90">î</l:l>
+<l:l i="90">Ã</l:l>
+<l:l i="90">ï</l:l>
+<l:l i="90">Ĩ</l:l>
+<l:l i="90">Ä©</l:l>
+<l:l i="90">Ī</l:l>
+<l:l i="90">Ä«</l:l>
+<l:l i="90">Ĭ</l:l>
+<l:l i="90">Ä­</l:l>
+<l:l i="90">Ä®</l:l>
+<l:l i="90">į</l:l>
+<l:l i="90">Ä°</l:l>
+<l:l i="90">Æ—</l:l>
+<l:l i="90">ɨ</l:l>
+<l:l i="90">Ç</l:l>
+<l:l i="90">Ç</l:l>
+<l:l i="90">Ȉ</l:l>
+<l:l i="90">ȉ</l:l>
+<l:l i="90">ÈŠ</l:l>
+<l:l i="90">È‹</l:l>
+<l:l i="90">Ḭ</l:l>
+<l:l i="90">ḭ</l:l>
+<l:l i="90">Ḯ</l:l>
+<l:l i="90">ḯ</l:l>
+<l:l i="90">Ỉ</l:l>
+<l:l i="90">ỉ</l:l>
+<l:l i="90">Ị</l:l>
+<l:l i="90">ị</l:l>
+<l:l i="100">J</l:l>
+<l:l i="100">j</l:l>
+<l:l i="100">Ä´</l:l>
+<l:l i="100">ĵ</l:l>
+<l:l i="100">Ç°</l:l>
+<l:l i="100">Ê</l:l>
+<l:l i="110">K</l:l>
+<l:l i="110">k</l:l>
+<l:l i="110">Ķ</l:l>
+<l:l i="110">Ä·</l:l>
+<l:l i="110">Ƙ</l:l>
+<l:l i="110">Æ™</l:l>
+<l:l i="110">Ǩ</l:l>
+<l:l i="110">Ç©</l:l>
+<l:l i="110">Ḱ</l:l>
+<l:l i="110">ḱ</l:l>
+<l:l i="110">Ḳ</l:l>
+<l:l i="110">ḳ</l:l>
+<l:l i="110">Ḵ</l:l>
+<l:l i="110">ḵ</l:l>
+<l:l i="120">L</l:l>
+<l:l i="120">l</l:l>
+<l:l i="120">Ĺ</l:l>
+<l:l i="120">ĺ</l:l>
+<l:l i="120">Ä»</l:l>
+<l:l i="120">ļ</l:l>
+<l:l i="120">Ľ</l:l>
+<l:l i="120">ľ</l:l>
+<l:l i="120">Ä¿</l:l>
+<l:l i="120">Å€</l:l>
+<l:l i="120">Å</l:l>
+<l:l i="120">Å‚</l:l>
+<l:l i="120">Æš</l:l>
+<l:l i="120">Lj</l:l>
+<l:l i="120">È´</l:l>
+<l:l i="120">É«</l:l>
+<l:l i="120">ɬ</l:l>
+<l:l i="120">É­</l:l>
+<l:l i="120">Ḷ</l:l>
+<l:l i="120">ḷ</l:l>
+<l:l i="120">Ḹ</l:l>
+<l:l i="120">ḹ</l:l>
+<l:l i="120">Ḻ</l:l>
+<l:l i="120">ḻ</l:l>
+<l:l i="120">Ḽ</l:l>
+<l:l i="120">ḽ</l:l>
+<l:l i="130">M</l:l>
+<l:l i="130">m</l:l>
+<l:l i="130">ɱ</l:l>
+<l:l i="130">Ḿ</l:l>
+<l:l i="130">ḿ</l:l>
+<l:l i="130">á¹€</l:l>
+<l:l i="130">á¹</l:l>
+<l:l i="130">Ṃ</l:l>
+<l:l i="130">ṃ</l:l>
+<l:l i="140">N</l:l>
+<l:l i="140">n</l:l>
+<l:l i="140">Ñ</l:l>
+<l:l i="140">ñ</l:l>
+<l:l i="140">Ń</l:l>
+<l:l i="140">Å„</l:l>
+<l:l i="140">Å…</l:l>
+<l:l i="140">ņ</l:l>
+<l:l i="140">Ň</l:l>
+<l:l i="140">ň</l:l>
+<l:l i="140">Æ</l:l>
+<l:l i="140">ɲ</l:l>
+<l:l i="140">Æž</l:l>
+<l:l i="140">È </l:l>
+<l:l i="140">Ç‹</l:l>
+<l:l i="140">Ǹ</l:l>
+<l:l i="140">ǹ</l:l>
+<l:l i="140">ȵ</l:l>
+<l:l i="140">ɳ</l:l>
+<l:l i="140">Ṅ</l:l>
+<l:l i="140">á¹…</l:l>
+<l:l i="140">Ṇ</l:l>
+<l:l i="140">ṇ</l:l>
+<l:l i="140">Ṉ</l:l>
+<l:l i="140">ṉ</l:l>
+<l:l i="140">Ṋ</l:l>
+<l:l i="140">ṋ</l:l>
+<l:l i="150">O</l:l>
+<l:l i="150">o</l:l>
+<l:l i="150">Ã’</l:l>
+<l:l i="150">ò</l:l>
+<l:l i="150">Ó</l:l>
+<l:l i="150">ó</l:l>
+<l:l i="150">Ô</l:l>
+<l:l i="150">ô</l:l>
+<l:l i="150">Õ</l:l>
+<l:l i="150">õ</l:l>
+<l:l i="150">Ö</l:l>
+<l:l i="150">ö</l:l>
+<l:l i="150">Ø</l:l>
+<l:l i="150">ø</l:l>
+<l:l i="150">Ō</l:l>
+<l:l i="150">Å</l:l>
+<l:l i="150">ÅŽ</l:l>
+<l:l i="150">Å</l:l>
+<l:l i="150">Å</l:l>
+<l:l i="150">Å‘</l:l>
+<l:l i="150">ÆŸ</l:l>
+<l:l i="150">Æ </l:l>
+<l:l i="150">Æ¡</l:l>
+<l:l i="150">Ç‘</l:l>
+<l:l i="150">Ç’</l:l>
+<l:l i="150">Ǫ</l:l>
+<l:l i="150">Ç«</l:l>
+<l:l i="150">Ǭ</l:l>
+<l:l i="150">Ç­</l:l>
+<l:l i="150">Ǿ</l:l>
+<l:l i="150">Ç¿</l:l>
+<l:l i="150">Ȍ</l:l>
+<l:l i="150">È</l:l>
+<l:l i="150">ÈŽ</l:l>
+<l:l i="150">È</l:l>
+<l:l i="150">Ȫ</l:l>
+<l:l i="150">È«</l:l>
+<l:l i="150">Ȭ</l:l>
+<l:l i="150">È­</l:l>
+<l:l i="150">È®</l:l>
+<l:l i="150">ȯ</l:l>
+<l:l i="150">È°</l:l>
+<l:l i="150">ȱ</l:l>
+<l:l i="150">Ṍ</l:l>
+<l:l i="150">á¹</l:l>
+<l:l i="150">Ṏ</l:l>
+<l:l i="150">á¹</l:l>
+<l:l i="150">á¹</l:l>
+<l:l i="150">ṑ</l:l>
+<l:l i="150">á¹’</l:l>
+<l:l i="150">ṓ</l:l>
+<l:l i="150">Ọ</l:l>
+<l:l i="150">á»</l:l>
+<l:l i="150">Ỏ</l:l>
+<l:l i="150">á»</l:l>
+<l:l i="150">á»</l:l>
+<l:l i="150">ố</l:l>
+<l:l i="150">á»’</l:l>
+<l:l i="150">ồ</l:l>
+<l:l i="150">á»”</l:l>
+<l:l i="150">ổ</l:l>
+<l:l i="150">á»–</l:l>
+<l:l i="150">á»—</l:l>
+<l:l i="150">Ộ</l:l>
+<l:l i="150">á»™</l:l>
+<l:l i="150">Ớ</l:l>
+<l:l i="150">á»›</l:l>
+<l:l i="150">Ờ</l:l>
+<l:l i="150">á»</l:l>
+<l:l i="150">Ở</l:l>
+<l:l i="150">ở</l:l>
+<l:l i="150">á» </l:l>
+<l:l i="150">ỡ</l:l>
+<l:l i="150">Ợ</l:l>
+<l:l i="150">ợ</l:l>
+<l:l i="160">P</l:l>
+<l:l i="160">p</l:l>
+<l:l i="160">Ƥ</l:l>
+<l:l i="160">Æ¥</l:l>
+<l:l i="160">á¹”</l:l>
+<l:l i="160">ṕ</l:l>
+<l:l i="160">á¹–</l:l>
+<l:l i="160">á¹—</l:l>
+<l:l i="170">Q</l:l>
+<l:l i="170">q</l:l>
+<l:l i="170">Ê </l:l>
+<l:l i="180">R</l:l>
+<l:l i="180">r</l:l>
+<l:l i="180">Å”</l:l>
+<l:l i="180">Å•</l:l>
+<l:l i="180">Å–</l:l>
+<l:l i="180">Å—</l:l>
+<l:l i="180">Ř</l:l>
+<l:l i="180">Å™</l:l>
+<l:l i="180">È</l:l>
+<l:l i="180">È‘</l:l>
+<l:l i="180">È’</l:l>
+<l:l i="180">È“</l:l>
+<l:l i="180">ɼ</l:l>
+<l:l i="180">ɽ</l:l>
+<l:l i="180">ɾ</l:l>
+<l:l i="180">Ṙ</l:l>
+<l:l i="180">á¹™</l:l>
+<l:l i="180">Ṛ</l:l>
+<l:l i="180">á¹›</l:l>
+<l:l i="180">Ṝ</l:l>
+<l:l i="180">á¹</l:l>
+<l:l i="180">Ṟ</l:l>
+<l:l i="180">ṟ</l:l>
+<l:l i="190">S</l:l>
+<l:l i="190">s</l:l>
+<l:l i="190">Åš</l:l>
+<l:l i="190">Å›</l:l>
+<l:l i="190">Ŝ</l:l>
+<l:l i="190">Å</l:l>
+<l:l i="190">Åž</l:l>
+<l:l i="190">ÅŸ</l:l>
+<l:l i="190">Å </l:l>
+<l:l i="190">Å¡</l:l>
+<l:l i="190">Ș</l:l>
+<l:l i="190">È™</l:l>
+<l:l i="190">Ê‚</l:l>
+<l:l i="190">á¹ </l:l>
+<l:l i="190">ṡ</l:l>
+<l:l i="190">á¹¢</l:l>
+<l:l i="190">á¹£</l:l>
+<l:l i="190">Ṥ</l:l>
+<l:l i="190">á¹¥</l:l>
+<l:l i="190">Ṧ</l:l>
+<l:l i="190">ṧ</l:l>
+<l:l i="190">Ṩ</l:l>
+<l:l i="190">ṩ</l:l>
+<l:l i="200">T</l:l>
+<l:l i="200">t</l:l>
+<l:l i="200">Å¢</l:l>
+<l:l i="200">Å£</l:l>
+<l:l i="200">Ť</l:l>
+<l:l i="200">Å¥</l:l>
+<l:l i="200">Ŧ</l:l>
+<l:l i="200">ŧ</l:l>
+<l:l i="200">Æ«</l:l>
+<l:l i="200">Ƭ</l:l>
+<l:l i="200">Æ­</l:l>
+<l:l i="200">Æ®</l:l>
+<l:l i="200">ʈ</l:l>
+<l:l i="200">Èš</l:l>
+<l:l i="200">È›</l:l>
+<l:l i="200">ȶ</l:l>
+<l:l i="200">Ṫ</l:l>
+<l:l i="200">ṫ</l:l>
+<l:l i="200">Ṭ</l:l>
+<l:l i="200">á¹­</l:l>
+<l:l i="200">á¹®</l:l>
+<l:l i="200">ṯ</l:l>
+<l:l i="200">á¹°</l:l>
+<l:l i="200">á¹±</l:l>
+<l:l i="200">ẗ</l:l>
+<l:l i="210">U</l:l>
+<l:l i="210">u</l:l>
+<l:l i="210">Ù</l:l>
+<l:l i="210">ù</l:l>
+<l:l i="210">Ú</l:l>
+<l:l i="210">ú</l:l>
+<l:l i="210">Û</l:l>
+<l:l i="210">û</l:l>
+<l:l i="210">Ü</l:l>
+<l:l i="210">ü</l:l>
+<l:l i="210">Ũ</l:l>
+<l:l i="210">Å©</l:l>
+<l:l i="210">Ū</l:l>
+<l:l i="210">Å«</l:l>
+<l:l i="210">Ŭ</l:l>
+<l:l i="210">Å­</l:l>
+<l:l i="210">Å®</l:l>
+<l:l i="210">ů</l:l>
+<l:l i="210">Å°</l:l>
+<l:l i="210">ű</l:l>
+<l:l i="210">Ų</l:l>
+<l:l i="210">ų</l:l>
+<l:l i="210">Ư</l:l>
+<l:l i="210">Æ°</l:l>
+<l:l i="210">Ç“</l:l>
+<l:l i="210">Ç”</l:l>
+<l:l i="210">Ç•</l:l>
+<l:l i="210">Ç–</l:l>
+<l:l i="210">Ç—</l:l>
+<l:l i="210">ǘ</l:l>
+<l:l i="210">Ç™</l:l>
+<l:l i="210">Çš</l:l>
+<l:l i="210">Ç›</l:l>
+<l:l i="210">ǜ</l:l>
+<l:l i="210">È”</l:l>
+<l:l i="210">È•</l:l>
+<l:l i="210">È–</l:l>
+<l:l i="210">È—</l:l>
+<l:l i="210">á¹²</l:l>
+<l:l i="210">á¹³</l:l>
+<l:l i="210">á¹´</l:l>
+<l:l i="210">á¹µ</l:l>
+<l:l i="210">Ṷ</l:l>
+<l:l i="210">á¹·</l:l>
+<l:l i="210">Ṹ</l:l>
+<l:l i="210">á¹¹</l:l>
+<l:l i="210">Ṻ</l:l>
+<l:l i="210">á¹»</l:l>
+<l:l i="210">Ụ</l:l>
+<l:l i="210">ụ</l:l>
+<l:l i="210">Ủ</l:l>
+<l:l i="210">ủ</l:l>
+<l:l i="210">Ứ</l:l>
+<l:l i="210">ứ</l:l>
+<l:l i="210">Ừ</l:l>
+<l:l i="210">ừ</l:l>
+<l:l i="210">Ử</l:l>
+<l:l i="210">á»­</l:l>
+<l:l i="210">á»®</l:l>
+<l:l i="210">ữ</l:l>
+<l:l i="210">á»°</l:l>
+<l:l i="210">á»±</l:l>
+<l:l i="220">V</l:l>
+<l:l i="220">v</l:l>
+<l:l i="220">Ʋ</l:l>
+<l:l i="220">Ê‹</l:l>
+<l:l i="220">á¹¼</l:l>
+<l:l i="220">á¹½</l:l>
+<l:l i="220">á¹¾</l:l>
+<l:l i="220">ṿ</l:l>
+<l:l i="230">W</l:l>
+<l:l i="230">w</l:l>
+<l:l i="230">Å´</l:l>
+<l:l i="230">ŵ</l:l>
+<l:l i="230">Ẁ</l:l>
+<l:l i="230">áº</l:l>
+<l:l i="230">Ẃ</l:l>
+<l:l i="230">ẃ</l:l>
+<l:l i="230">Ẅ</l:l>
+<l:l i="230">ẅ</l:l>
+<l:l i="230">Ẇ</l:l>
+<l:l i="230">ẇ</l:l>
+<l:l i="230">Ẉ</l:l>
+<l:l i="230">ẉ</l:l>
+<l:l i="230">ẘ</l:l>
+<l:l i="240">X</l:l>
+<l:l i="240">x</l:l>
+<l:l i="240">Ẋ</l:l>
+<l:l i="240">ẋ</l:l>
+<l:l i="240">Ẍ</l:l>
+<l:l i="240">áº</l:l>
+<l:l i="250">Y</l:l>
+<l:l i="250">y</l:l>
+<l:l i="250">Ã</l:l>
+<l:l i="250">ý</l:l>
+<l:l i="250">ÿ</l:l>
+<l:l i="250">Ÿ</l:l>
+<l:l i="250">Ŷ</l:l>
+<l:l i="250">Å·</l:l>
+<l:l i="250">Ƴ</l:l>
+<l:l i="250">Æ´</l:l>
+<l:l i="250">Ȳ</l:l>
+<l:l i="250">ȳ</l:l>
+<l:l i="250">Ẏ</l:l>
+<l:l i="250">áº</l:l>
+<l:l i="250">ẙ</l:l>
+<l:l i="250">Ỳ</l:l>
+<l:l i="250">ỳ</l:l>
+<l:l i="250">á»´</l:l>
+<l:l i="250">ỵ</l:l>
+<l:l i="250">Ỷ</l:l>
+<l:l i="250">á»·</l:l>
+<l:l i="250">Ỹ</l:l>
+<l:l i="250">ỹ</l:l>
+<l:l i="260">Z</l:l>
+<l:l i="260">z</l:l>
+<l:l i="260">Ź</l:l>
+<l:l i="260">ź</l:l>
+<l:l i="260">Å»</l:l>
+<l:l i="260">ż</l:l>
+<l:l i="260">Ž</l:l>
+<l:l i="260">ž</l:l>
+<l:l i="260">Ƶ</l:l>
+<l:l i="260">ƶ</l:l>
+<l:l i="260">Ȥ</l:l>
+<l:l i="260">È¥</l:l>
+<l:l i="260">Ê</l:l>
+<l:l i="260">Ê‘</l:l>
+<l:l i="260">áº</l:l>
+<l:l i="260">ẑ</l:l>
+<l:l i="260">Ẓ</l:l>
+<l:l i="260">ẓ</l:l>
+<l:l i="260">Ẕ</l:l>
+<l:l i="260">ẕ</l:l>
+</l:letters>
+</l:l10n>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/refentry.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/refentry.xml
new file mode 100644
index 0000000..4741ce0
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/refentry.xml
@@ -0,0 +1,781 @@
+<?xml version="1.0"?>
+
+<reference xml:id="refentry">
+ <info>
+ <title>Common » Refentry Metadata Template Reference</title>
+ <releaseinfo role="meta">
+ $Id: refentry.xsl 7867 2008-03-07 09:54:25Z xmldoc $
+ </releaseinfo>
+ </info>
+
+ <partintro xml:id="partintro">
+ <title>Introduction</title>
+
+<para>This is technical reference documentation for the “refentry
+ metadata†templates in the DocBook XSL Stylesheets.</para>
+
+
+<para>This is not intended to be user documentation. It is provided
+ for developers writing customization layers for the stylesheets.</para>
+
+ <note>
+
+<para>Currently, only the manpages stylesheets make use of these
+ templates. They are, however, potentially useful elsewhere.</para>
+
+ </note>
+ </partintro>
+
+<refentry xmlns:xlink="http://www.w3.org/1999/xlink" xml:id="template.get.refentry.metadata">
+<refnamediv>
+<refname>get.refentry.metadata</refname>
+<refpurpose>Gathers metadata from a refentry and its ancestors</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+<synopsis>&lt;xsl:template name="get.refentry.metadata"&gt;
+&lt;xsl:param name="refname"/&gt;
+&lt;xsl:param name="info"/&gt;
+&lt;xsl:param name="prefs"/&gt;
+ ...
+&lt;/xsl:template&gt;</synopsis>
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>Reference documentation for particular commands, functions,
+ etc., is sometimes viewed in isolation from its greater "context". For
+ example, users view Unix man pages as, well, individual pages, not as
+ part of a "book" of some kind. Therefore, it is sometimes necessary to
+ embed "context" information in output for each <tag>refentry</tag>.</para>
+
+
+
+<para>However, one problem is that different users mark up that
+ context information in different ways. Often (usually), the
+ context information is not actually part of the content of the
+ <tag>refentry</tag> itself, but instead part of the content of a
+ parent or ancestor element to the <tag>refentry</tag>. And
+ even then, DocBook provides a variety of elements that users might
+ potentially use to mark up the same kind of information. One user
+ might use the <tag>productnumber</tag> element to mark up version
+ information about a particular product, while another might use
+ the <tag>releaseinfo</tag> element.</para>
+
+
+
+<para>Taking all that in mind, the
+ <function>get.refentry.metadata</function> template tries to gather
+ metadata from a <tag>refentry</tag> element and its ancestor
+ elements in an intelligent and user-configurable way. The basic
+ mechanism used in the XPath expressions throughout this stylesheet
+ is to select the relevant metadata from the *info element that is
+ closest to the actual <tag>refentry</tag> – either on the
+ <tag>refentry</tag> itself, or on its nearest ancestor.</para>
+
+
+ <note>
+
+<para>The <function>get.refentry.metadata</function>
+ template is actually just sort of a "driver" template; it
+ calls other templates that do the actual data collection,
+ then returns the data as a set.</para>
+
+ </note>
+
+ </refsect1><refsect1><title>Parameters</title>
+
+<variablelist>
+ <varlistentry>
+ <term>refname</term>
+ <listitem>
+
+<para>The first <tag>refname</tag> in the refentry</para>
+
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>info</term>
+ <listitem>
+
+<para>A set of info nodes (from a <tag>refentry</tag>
+ element and its ancestors)</para>
+
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>prefs</term>
+ <listitem>
+
+<para>A node containing user preferences (from global
+ stylesheet parameters)</para>
+
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ </refsect1><refsect1><title>Returns</title>
+
+<para>Returns a node set with the following elements. The
+ descriptions are verbatim from the <literal>man(7)</literal> man
+ page.
+
+<variablelist>
+ <varlistentry>
+ <term>title</term>
+ <listitem>
+
+<para>the title of the man page (e.g., <literal>MAN</literal>)</para>
+
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>section</term>
+ <listitem>
+
+<para>the section number the man page should be placed in (e.g.,
+ <literal>7</literal>)</para>
+
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>date</term>
+ <listitem>
+
+<para>the date of the last revision</para>
+
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>source</term>
+ <listitem>
+
+<para>the source of the command</para>
+
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>manual</term>
+ <listitem>
+
+<para>the title of the manual (e.g., <citetitle>Linux
+ Programmer's Manual</citetitle>)</para>
+
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ </para>
+
+ </refsect1></refentry>
+
+<refentry xmlns:xlink="http://www.w3.org/1999/xlink" xml:id="template.get.refentry.title">
+<refnamediv>
+<refname>get.refentry.title</refname>
+<refpurpose>Gets title metadata for a refentry</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+<synopsis>&lt;xsl:template name="get.refentry.title"&gt;
+&lt;xsl:param name="refname"/&gt;
+ ...
+&lt;/xsl:template&gt;</synopsis>
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>The <literal>man(7)</literal> man page describes this as "the
+ title of the man page (e.g., <literal>MAN</literal>). This differs
+ from <tag>refname</tag> in that, if the <tag>refentry</tag> has a
+ <tag>refentrytitle</tag>, we use that as the <tag>title</tag>;
+ otherwise, we just use first <tag>refname</tag> in the first
+ <tag>refnamediv</tag> in the source.</para>
+
+ </refsect1><refsect1><title>Parameters</title>
+
+<variablelist>
+ <varlistentry>
+ <term>refname</term>
+ <listitem>
+
+<para>The first <tag>refname</tag> in the refentry</para>
+
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ </refsect1><refsect1><title>Returns</title>
+
+<para>Returns a <tag>title</tag> node.</para>
+</refsect1></refentry>
+
+<refentry xmlns:xlink="http://www.w3.org/1999/xlink" xml:id="template.get.refentry.section">
+<refnamediv>
+<refname>get.refentry.section</refname>
+<refpurpose>Gets section metadata for a refentry</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+<synopsis>&lt;xsl:template name="get.refentry.section"&gt;
+&lt;xsl:param name="refname"/&gt;
+&lt;xsl:param name="quiet" select="0"/&gt;
+ ...
+&lt;/xsl:template&gt;</synopsis>
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>The <literal>man(7)</literal> man page describes this as "the
+ section number the man page should be placed in (e.g.,
+ <literal>7</literal>)". If we do not find a <tag>manvolnum</tag>
+ specified in the source, and we find that the <tag>refentry</tag> is
+ for a function, we use the section number <literal>3</literal>
+ ["Library calls (functions within program libraries)"]; otherwise, we
+ default to using <literal>1</literal> ["Executable programs or shell
+ commands"].</para>
+
+ </refsect1><refsect1><title>Parameters</title>
+
+<variablelist>
+ <varlistentry>
+ <term>refname</term>
+ <listitem>
+
+<para>The first <tag>refname</tag> in the refentry</para>
+
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>quiet</term>
+ <listitem>
+
+<para>If non-zero, no "missing" message is emitted</para>
+
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ </refsect1><refsect1><title>Returns</title>
+
+<para>Returns a string representing a section number.</para>
+</refsect1></refentry>
+
+<refentry xmlns:xlink="http://www.w3.org/1999/xlink" xml:id="template.get.refentry.date">
+<refnamediv>
+<refname>get.refentry.date</refname>
+<refpurpose>Gets date metadata for a refentry</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+<synopsis>&lt;xsl:template name="get.refentry.date"&gt;
+&lt;xsl:param name="refname"/&gt;
+&lt;xsl:param name="info"/&gt;
+&lt;xsl:param name="prefs"/&gt;
+ ...
+&lt;/xsl:template&gt;</synopsis>
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>The <literal>man(7)</literal> man page describes this as "the
+ date of the last revision". If we cannot find a date in the source, we
+ generate one.</para>
+
+ </refsect1><refsect1><title>Parameters</title>
+
+<variablelist>
+ <varlistentry>
+ <term>refname</term>
+ <listitem>
+
+<para>The first <tag>refname</tag> in the refentry</para>
+
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>info</term>
+ <listitem>
+
+<para>A set of info nodes (from a <tag>refentry</tag>
+ element and its ancestors)</para>
+
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>prefs</term>
+ <listitem>
+
+<para>A node containing users preferences (from global stylesheet parameters)</para>
+
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ </refsect1><refsect1><title>Returns</title>
+
+<para>Returns a <tag>date</tag> node.</para>
+
+ </refsect1></refentry>
+
+<refentry xmlns:xlink="http://www.w3.org/1999/xlink" xml:id="template.get.refentry.source">
+<refnamediv>
+<refname>get.refentry.source</refname>
+<refpurpose>Gets source metadata for a refentry</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+<synopsis>&lt;xsl:template name="get.refentry.source"&gt;
+&lt;xsl:param name="refname"/&gt;
+&lt;xsl:param name="info"/&gt;
+&lt;xsl:param name="prefs"/&gt;
+ ...
+&lt;/xsl:template&gt;</synopsis>
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>The <literal>man(7)</literal> man page describes this as "the
+ source of the command", and provides the following examples:
+
+<itemizedlist>
+ <listitem>
+
+<para>For binaries, use something like: GNU, NET-2, SLS
+ Distribution, MCC Distribution.</para>
+
+ </listitem>
+ <listitem>
+
+<para>For system calls, use the version of the kernel that you are
+ currently looking at: Linux 0.99.11.</para>
+
+ </listitem>
+ <listitem>
+
+<para>For library calls, use the source of the function: GNU, BSD
+ 4.3, Linux DLL 4.4.1.</para>
+
+ </listitem>
+ </itemizedlist>
+
+ </para>
+
+
+
+<para>The <literal>solbook(5)</literal> man page describes
+ something very much like what <literal>man(7)</literal> calls
+ "source", except that <literal>solbook(5)</literal> names it
+ "software" and describes it like this:
+ <blockquote>
+
+<para>This is the name of the software product that the topic
+ discussed on the reference page belongs to. For example UNIX
+ commands are part of the <literal>SunOS x.x</literal>
+ release.</para>
+
+ </blockquote>
+ </para>
+
+
+
+<para>In practice, there are many pages that simply have a version
+ number in the "source" field. So, it looks like what we have is a
+ two-part field,
+ <replaceable>Name</replaceable> <replaceable>Version</replaceable>,
+ where:
+
+<variablelist>
+ <varlistentry>
+ <term>Name</term>
+ <listitem>
+
+<para>product name (e.g., BSD) or org. name (e.g., GNU)</para>
+
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>Version</term>
+ <listitem>
+
+<para>version name</para>
+
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ Each part is optional. If the <replaceable>Name</replaceable> is a
+ product name, then the <replaceable>Version</replaceable> is probably
+ the version of the product. Or there may be no
+ <replaceable>Name</replaceable>, in which case, if there is a
+ <replaceable>Version</replaceable>, it is probably the version of the
+ item itself, not the product it is part of. Or, if the
+ <replaceable>Name</replaceable> is an organization name, then there
+ probably will be no <replaceable>Version</replaceable>.
+ </para>
+
+ </refsect1><refsect1><title>Parameters</title>
+
+<variablelist>
+ <varlistentry>
+ <term>refname</term>
+ <listitem>
+
+<para>The first <tag>refname</tag> in the refentry</para>
+
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>info</term>
+ <listitem>
+
+<para>A set of info nodes (from a <tag>refentry</tag>
+ element and its ancestors)</para>
+
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>prefs</term>
+ <listitem>
+
+<para>A node containing users preferences (from global
+ stylesheet parameters)</para>
+
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ </refsect1><refsect1><title>Returns</title>
+
+<para>Returns a <tag>source</tag> node.</para>
+
+ </refsect1></refentry>
+
+<refentry xmlns:xlink="http://www.w3.org/1999/xlink" xml:id="template.get.refentry.source.name">
+<refnamediv>
+<refname>get.refentry.source.name</refname>
+<refpurpose>Gets source-name metadata for a refentry</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+<synopsis>&lt;xsl:template name="get.refentry.source.name"&gt;
+&lt;xsl:param name="refname"/&gt;
+&lt;xsl:param name="info"/&gt;
+&lt;xsl:param name="prefs"/&gt;
+ ...
+&lt;/xsl:template&gt;</synopsis>
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>A "source name" is one part of a (potentially) two-part
+ <replaceable>Name</replaceable> <replaceable>Version</replaceable>
+ source field. For more details, see the documentation for the
+ <function>get.refentry.source</function> template.</para>
+
+ </refsect1><refsect1><title>Parameters</title>
+
+<variablelist>
+ <varlistentry>
+ <term>refname</term>
+ <listitem>
+
+<para>The first <tag>refname</tag> in the refentry</para>
+
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>info</term>
+ <listitem>
+
+<para>A set of info nodes (from a <tag>refentry</tag>
+ element and its ancestors)</para>
+
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>prefs</term>
+ <listitem>
+
+<para>A node containing users preferences (from global
+ stylesheet parameters)</para>
+
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ </refsect1><refsect1><title>Returns</title>
+
+<para>Depending on what output method is used for the
+ current stylesheet, either returns a text node or possibly an element
+ node, containing "source name" data.</para>
+
+ </refsect1></refentry>
+
+<refentry xmlns:xlink="http://www.w3.org/1999/xlink" xml:id="template.get.refentry.version">
+<refnamediv>
+<refname>get.refentry.version</refname>
+<refpurpose>Gets version metadata for a refentry</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+<synopsis>&lt;xsl:template name="get.refentry.version"&gt;
+&lt;xsl:param name="refname"/&gt;
+&lt;xsl:param name="info"/&gt;
+&lt;xsl:param name="prefs"/&gt;
+ ...
+&lt;/xsl:template&gt;</synopsis>
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>A "version" is one part of a (potentially) two-part
+ <replaceable>Name</replaceable> <replaceable>Version</replaceable>
+ source field. For more details, see the documentation for the
+ <function>get.refentry.source</function> template.</para>
+
+ </refsect1><refsect1><title>Parameters</title>
+
+<variablelist>
+ <varlistentry>
+ <term>refname</term>
+ <listitem>
+
+<para>The first <tag>refname</tag> in the refentry</para>
+
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>info</term>
+ <listitem>
+
+<para>A set of info nodes (from a <tag>refentry</tag>
+ element and its ancestors)</para>
+
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>prefs</term>
+ <listitem>
+
+<para>A node containing users preferences (from global
+ stylesheet parameters)</para>
+
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ </refsect1><refsect1><title>Returns</title>
+
+<para>Depending on what output method is used for the
+ current stylesheet, either returns a text node or possibly an element
+ node, containing "version" data.</para>
+
+ </refsect1></refentry>
+
+<refentry xmlns:xlink="http://www.w3.org/1999/xlink" xml:id="template.get.refentry.manual">
+<refnamediv>
+<refname>get.refentry.manual</refname>
+<refpurpose>Gets source metadata for a refentry</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+<synopsis>&lt;xsl:template name="get.refentry.manual"&gt;
+&lt;xsl:param name="refname"/&gt;
+&lt;xsl:param name="info"/&gt;
+&lt;xsl:param name="prefs"/&gt;
+ ...
+&lt;/xsl:template&gt;</synopsis>
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>The <literal>man(7)</literal> man page describes this as "the
+ title of the manual (e.g., <citetitle>Linux Programmer's
+ Manual</citetitle>)". Here are some examples from existing man pages:
+
+<itemizedlist>
+ <listitem>
+
+<para><citetitle>dpkg utilities</citetitle>
+ (<command>dpkg-name</command>)</para>
+
+ </listitem>
+ <listitem>
+
+<para><citetitle>User Contributed Perl Documentation</citetitle>
+ (<command>GET</command>)</para>
+
+ </listitem>
+ <listitem>
+
+<para><citetitle>GNU Development Tools</citetitle>
+ (<command>ld</command>)</para>
+
+ </listitem>
+ <listitem>
+
+<para><citetitle>Emperor Norton Utilities</citetitle>
+ (<command>ddate</command>)</para>
+
+ </listitem>
+ <listitem>
+
+<para><citetitle>Debian GNU/Linux manual</citetitle>
+ (<command>faked</command>)</para>
+
+ </listitem>
+ <listitem>
+
+<para><citetitle>GIMP Manual Pages</citetitle>
+ (<command>gimp</command>)</para>
+
+ </listitem>
+ <listitem>
+
+<para><citetitle>KDOC Documentation System</citetitle>
+ (<command>qt2kdoc</command>)</para>
+
+ </listitem>
+ </itemizedlist>
+
+ </para>
+
+
+
+<para>The <literal>solbook(5)</literal> man page describes
+ something very much like what <literal>man(7)</literal> calls
+ "manual", except that <literal>solbook(5)</literal> names it
+ "sectdesc" and describes it like this:
+ <blockquote>
+
+<para>This is the section title of the reference page; for
+ example <literal>User Commands</literal>.</para>
+
+ </blockquote>
+ </para>
+
+
+ </refsect1><refsect1><title>Parameters</title>
+
+<variablelist>
+ <varlistentry>
+ <term>refname</term>
+ <listitem>
+
+<para>The first <tag>refname</tag> in the refentry</para>
+
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>info</term>
+ <listitem>
+
+<para>A set of info nodes (from a <tag>refentry</tag>
+ element and its ancestors)</para>
+
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>prefs</term>
+ <listitem>
+
+<para>A node containing users preferences (from global
+ stylesheet parameters)</para>
+
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ </refsect1><refsect1><title>Returns</title>
+
+<para>Returns a <tag>manual</tag> node.</para>
+
+ </refsect1></refentry>
+
+<refentry xmlns:xlink="http://www.w3.org/1999/xlink" xml:id="template.get.refentry.metadata.prefs">
+<refnamediv>
+<refname>get.refentry.metadata.prefs</refname>
+<refpurpose>Gets user preferences for refentry metadata gathering</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+<synopsis>&lt;xsl:template name="get.refentry.metadata.prefs"/&gt;</synopsis>
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>The DocBook XSL stylesheets include several user-configurable
+ global stylesheet parameters for controlling <tag>refentry</tag>
+ metadata gathering. Those parameters are not read directly by the
+ other <tag>refentry</tag> metadata-gathering
+ templates. Instead, they are read only by the
+ <function>get.refentry.metadata.prefs</function> template,
+ which assembles them into a structure that is then passed to
+ the other <tag>refentry</tag> metadata-gathering
+ templates.</para>
+
+
+
+<para>So the, <function>get.refentry.metadata.prefs</function>
+ template is the only interface to collecting stylesheet parameters for
+ controlling <tag>refentry</tag> metadata gathering.</para>
+
+ </refsect1><refsect1><title>Parameters</title>
+
+<para>There are no local parameters for this template; however, it
+ does rely on a number of global parameters.</para>
+
+ </refsect1><refsect1><title>Returns</title>
+
+<para>Returns a <tag>manual</tag> node.</para>
+
+ </refsect1></refentry>
+
+<refentry xmlns:xlink="http://www.w3.org/1999/xlink" xml:id="template.set.refentry.metadata">
+<refnamediv>
+<refname>set.refentry.metadata</refname>
+<refpurpose>Sets content of a refentry metadata item</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+<synopsis>&lt;xsl:template name="set.refentry.metadata"&gt;
+&lt;xsl:param name="refname"/&gt;
+&lt;xsl:param name="info"/&gt;
+&lt;xsl:param name="contents"/&gt;
+&lt;xsl:param name="context"/&gt;
+&lt;xsl:param name="preferred"/&gt;
+ ...
+&lt;/xsl:template&gt;</synopsis>
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>The <function>set.refentry.metadata</function> template is
+ called each time a suitable source element is found for a certain
+ metadata field.</para>
+
+ </refsect1><refsect1><title>Parameters</title>
+
+<variablelist>
+ <varlistentry>
+ <term>refname</term>
+ <listitem>
+
+<para>The first <tag>refname</tag> in the refentry</para>
+
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>info</term>
+ <listitem>
+
+<para>A single *info node that contains the selected source element.</para>
+
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>contents</term>
+ <listitem>
+
+<para>A node containing the selected source element.</para>
+
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>context</term>
+ <listitem>
+
+<para>A string describing the metadata context in which the
+ <function>set.refentry.metadata</function> template was
+ called: either "date", "source", "version", or "manual".</para>
+
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ </refsect1><refsect1><title>Returns</title>
+
+<para>Returns formatted contents of a selected source element.</para>
+</refsect1></refentry>
+</reference>
+
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/refentry.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/refentry.xsl
new file mode 100644
index 0000000..5a04b60
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/refentry.xsl
@@ -0,0 +1,1352 @@
+<?xml version='1.0'?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:doc="http://nwalsh.com/xsl/documentation/1.0"
+ xmlns:date="http://exslt.org/dates-and-times"
+ exclude-result-prefixes="doc date"
+ version='1.0'>
+
+<!-- ********************************************************************
+ $Id: refentry.xsl 7867 2008-03-07 09:54:25Z xmldoc $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<!-- ==================================================================== -->
+<doc:reference xmlns="" xml:id="refentry">
+ <info>
+ <title>Common » Refentry Metadata Template Reference</title>
+ <releaseinfo role="meta">
+ $Id: refentry.xsl 7867 2008-03-07 09:54:25Z xmldoc $
+ </releaseinfo>
+ </info>
+ <!-- * yes, partintro is a valid child of a reference... -->
+ <partintro xml:id="partintro">
+ <title>Introduction</title>
+ <para>This is technical reference documentation for the “refentry
+ metadata†templates in the DocBook XSL Stylesheets.</para>
+ <para>This is not intended to be user documentation. It is provided
+ for developers writing customization layers for the stylesheets.</para>
+ <note>
+ <para>Currently, only the manpages stylesheets make use of these
+ templates. They are, however, potentially useful elsewhere.</para>
+ </note>
+ </partintro>
+</doc:reference>
+
+<!-- ==================================================================== -->
+<doc:template name="get.refentry.metadata" xmlns="">
+ <refpurpose>Gathers metadata from a refentry and its ancestors</refpurpose>
+ <refdescription id="get.refentry.metadata-desc">
+ <para>Reference documentation for particular commands, functions,
+ etc., is sometimes viewed in isolation from its greater "context". For
+ example, users view Unix man pages as, well, individual pages, not as
+ part of a "book" of some kind. Therefore, it is sometimes necessary to
+ embed "context" information in output for each <tag>refentry</tag>.</para>
+
+ <para>However, one problem is that different users mark up that
+ context information in different ways. Often (usually), the
+ context information is not actually part of the content of the
+ <tag>refentry</tag> itself, but instead part of the content of a
+ parent or ancestor element to the <tag>refentry</tag>. And
+ even then, DocBook provides a variety of elements that users might
+ potentially use to mark up the same kind of information. One user
+ might use the <tag>productnumber</tag> element to mark up version
+ information about a particular product, while another might use
+ the <tag>releaseinfo</tag> element.</para>
+
+ <para>Taking all that in mind, the
+ <function>get.refentry.metadata</function> template tries to gather
+ metadata from a <tag>refentry</tag> element and its ancestor
+ elements in an intelligent and user-configurable way. The basic
+ mechanism used in the XPath expressions throughout this stylesheet
+ is to select the relevant metadata from the *info element that is
+ closest to the actual <tag>refentry</tag>&#160;– either on the
+ <tag>refentry</tag> itself, or on its nearest ancestor.</para>
+
+ <note>
+ <para>The <function>get.refentry.metadata</function>
+ template is actually just sort of a "driver" template; it
+ calls other templates that do the actual data collection,
+ then returns the data as a set.</para>
+ </note>
+
+ </refdescription>
+ <refparameter id="get.refentry.metadata-params">
+ <variablelist>
+ <varlistentry>
+ <term>refname</term>
+ <listitem>
+ <para>The first <tag>refname</tag> in the refentry</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>info</term>
+ <listitem>
+ <para>A set of info nodes (from a <tag>refentry</tag>
+ element and its ancestors)</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>prefs</term>
+ <listitem>
+ <para>A node containing user preferences (from global
+ stylesheet parameters)</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+ <refreturn id="get.refentry.metadata-returns">
+ <para>Returns a node set with the following elements. The
+ descriptions are verbatim from the <literal>man(7)</literal> man
+ page.
+ <variablelist>
+ <varlistentry>
+ <term>title</term>
+ <listitem>
+ <para>the title of the man page (e.g., <literal>MAN</literal>)</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>section</term>
+ <listitem>
+ <para>the section number the man page should be placed in (e.g.,
+ <literal>7</literal>)</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>date</term>
+ <listitem>
+ <para>the date of the last revision</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>source</term>
+ <listitem>
+ <para>the source of the command</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>manual</term>
+ <listitem>
+ <para>the title of the manual (e.g., <citetitle>Linux
+ Programmer's Manual</citetitle>)</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </para>
+ </refreturn>
+</doc:template>
+<xsl:template name="get.refentry.metadata">
+ <xsl:param name="refname"/>
+ <xsl:param name="info"/>
+ <xsl:param name="prefs"/>
+ <title>
+ <xsl:call-template name="get.refentry.title">
+ <xsl:with-param name="refname" select="$refname"/>
+ </xsl:call-template>
+ </title>
+ <section>
+ <xsl:call-template name="get.refentry.section">
+ <xsl:with-param name="refname" select="$refname"/>
+ </xsl:call-template>
+ </section>
+ <date>
+ <xsl:call-template name="get.refentry.date">
+ <xsl:with-param name="info" select="$info"/>
+ <xsl:with-param name="refname" select="$refname"/>
+ <xsl:with-param name="prefs" select="$prefs/DatePrefs"/>
+ </xsl:call-template>
+ </date>
+ <source>
+ <xsl:call-template name="get.refentry.source">
+ <xsl:with-param name="info" select="$info"/>
+ <xsl:with-param name="refname" select="$refname"/>
+ <xsl:with-param name="prefs" select="$prefs/SourcePrefs"/>
+ </xsl:call-template>
+ </source>
+ <manual>
+ <xsl:call-template name="get.refentry.manual">
+ <xsl:with-param name="info" select="$info"/>
+ <xsl:with-param name="refname" select="$refname"/>
+ <xsl:with-param name="prefs" select="$prefs/ManualPrefs"/>
+ </xsl:call-template>
+ </manual>
+</xsl:template>
+
+<!-- ====================================================================== -->
+<doc:template name="get.refentry.title" xmlns="">
+ <refpurpose>Gets title metadata for a refentry</refpurpose>
+ <refdescription id="get.refentry.title-desc">
+ <para>The <literal>man(7)</literal> man page describes this as "the
+ title of the man page (e.g., <literal>MAN</literal>). This differs
+ from <tag>refname</tag> in that, if the <tag>refentry</tag> has a
+ <tag>refentrytitle</tag>, we use that as the <tag>title</tag>;
+ otherwise, we just use first <tag>refname</tag> in the first
+ <tag>refnamediv</tag> in the source.</para>
+ </refdescription>
+ <refparameter id="get.refentry.title-params">
+ <variablelist>
+ <varlistentry>
+ <term>refname</term>
+ <listitem>
+ <para>The first <tag>refname</tag> in the refentry</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+ <refreturn id="get.refentry.title-returns">
+ <para>Returns a <tag>title</tag> node.</para></refreturn>
+</doc:template>
+<xsl:template name="get.refentry.title">
+ <xsl:param name="refname"/>
+ <xsl:choose>
+ <xsl:when test="refmeta/refentrytitle">
+ <xsl:copy>
+ <xsl:apply-templates select="refmeta/refentrytitle/node()"/>
+ </xsl:copy>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:copy-of select="$refname"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ==================================================================== -->
+<doc:template name="get.refentry.section" xmlns="">
+ <refpurpose>Gets section metadata for a refentry</refpurpose>
+ <refdescription id="get.refentry.section-desc">
+ <para>The <literal>man(7)</literal> man page describes this as "the
+ section number the man page should be placed in (e.g.,
+ <literal>7</literal>)". If we do not find a <tag>manvolnum</tag>
+ specified in the source, and we find that the <tag>refentry</tag> is
+ for a function, we use the section number <literal>3</literal>
+ ["Library calls (functions within program libraries)"]; otherwise, we
+ default to using <literal>1</literal> ["Executable programs or shell
+ commands"].</para>
+ </refdescription>
+ <refparameter id="get.refentry.section-params">
+ <variablelist>
+ <varlistentry>
+ <term>refname</term>
+ <listitem>
+ <para>The first <tag>refname</tag> in the refentry</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>quiet</term>
+ <listitem>
+ <para>If non-zero, no "missing" message is emitted</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+ <refreturn id="get.refentry.section-returns">
+ <para>Returns a string representing a section number.</para></refreturn>
+</doc:template>
+<xsl:template name="get.refentry.section">
+ <xsl:param name="refname"/>
+ <xsl:param name="quiet" select="0"/>
+ <xsl:choose>
+ <xsl:when test="refmeta/manvolnum">
+ <xsl:value-of select="refmeta/manvolnum"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:if test="$quiet = 0">
+ <xsl:if test="$refentry.meta.get.quietly = 0">
+ <xsl:call-template name="log.message">
+ <xsl:with-param name="level">Note</xsl:with-param>
+ <xsl:with-param name="source" select="$refname"/>
+ <xsl:with-param name="context-desc">meta manvol</xsl:with-param>
+ <xsl:with-param name="message">
+ <xsl:text>no refentry/refmeta/manvolnum</xsl:text>
+ </xsl:with-param>
+ </xsl:call-template>
+ <xsl:call-template name="log.message">
+ <xsl:with-param name="level">Note</xsl:with-param>
+ <xsl:with-param name="source" select="$refname"/>
+ <xsl:with-param name="context-desc">meta manvol</xsl:with-param>
+ <xsl:with-param name="message">
+ <xsl:text>see http://docbook.sf.net/el/manvolnum</xsl:text>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:if>
+ <xsl:choose>
+ <xsl:when test=".//funcsynopsis">
+ <xsl:if test="$quiet = 0">
+ <xsl:if test="$refentry.meta.get.quietly = 0">
+ <xsl:call-template name="log.message">
+ <xsl:with-param name="level">Note</xsl:with-param>
+ <xsl:with-param name="source" select="$refname"/>
+ <xsl:with-param name="context-desc">meta manvol</xsl:with-param>
+ <xsl:with-param name="message">
+ <xsl:text>Setting man section to 3</xsl:text>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:if>
+ <xsl:text>3</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text>1</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ==================================================================== -->
+<doc:template name="get.refentry.date" xmlns="">
+ <refpurpose>Gets date metadata for a refentry</refpurpose>
+ <refdescription id="get.refentry.date-desc">
+ <para>The <literal>man(7)</literal> man page describes this as "the
+ date of the last revision". If we cannot find a date in the source, we
+ generate one.</para>
+ </refdescription>
+ <refparameter id="get.refentry.date-params">
+ <variablelist>
+ <varlistentry>
+ <term>refname</term>
+ <listitem>
+ <para>The first <tag>refname</tag> in the refentry</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>info</term>
+ <listitem>
+ <para>A set of info nodes (from a <tag>refentry</tag>
+ element and its ancestors)</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>prefs</term>
+ <listitem>
+ <para>A node containing users preferences (from global stylesheet parameters)</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+ <refreturn id="get.refentry.date-returns">
+ <para>Returns a <tag>date</tag> node.</para>
+ </refreturn>
+</doc:template>
+<xsl:template name="get.refentry.date">
+ <xsl:param name="refname"/>
+ <xsl:param name="info"/>
+ <xsl:param name="prefs"/>
+ <xsl:variable name="Date">
+ <xsl:choose>
+ <!-- * if profiling is enabled for date, and the date -->
+ <!-- * profile is non-empty, use it -->
+ <xsl:when test="not($prefs/@profileEnabled = 0) and
+ not($prefs/@profile = '')">
+ <xsl:call-template name="evaluate.info.profile">
+ <xsl:with-param name="profile" select="$prefs/@profile"/>
+ <xsl:with-param name="info" select="$info"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <!-- * either profiling is not enabled for date, or the-->
+ <!-- * date profile is empty, so we need to look for date -->
+ <!-- * in *info -->
+ <xsl:choose>
+ <!-- * look for date or pubdate in *info -->
+ <xsl:when test="$info/date/node()
+ |$info/pubdate/node()">
+ <xsl:apply-templates
+ select="(($info[date])[last()]/date)[1]|
+ (($info[pubdate])[last()]/pubdate)[1]"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <!-- * found no Date or Pubdate -->
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:choose>
+ <xsl:when test="not($Date = '')">
+ <xsl:value-of select="$Date"/>
+ </xsl:when>
+ <!-- * We couldn't find a date, so we generate a date. -->
+ <!-- * And we make it an appropriately localized date. -->
+ <xsl:otherwise>
+ <!-- * The following block is commented out because: -->
+ <!-- * -->
+ <!-- * - having a missing date in the source doesn’t result in -->
+ <!-- * any information being missing from the generated man -->
+ <!-- * page (since we generate the needed date) -->
+ <!-- * -->
+ <!-- * - experience has shown the many users omit the date -->
+ <!-- * intentionally, because they want to be it generated -->
+ <!-- * -->
+ <!-- * - in practice it’s not really a condition that most users -->
+ <!-- * want reported to them -->
+ <!-- * -->
+ <!-- * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -->
+ <!-- * <xsl:if test="$refentry.meta.get.quietly = 0"> -->
+ <!-- * <xsl:call-template name="log.message"> -->
+ <!-- * <xsl:with-param name="level">Note</xsl:with-param> -->
+ <!-- * <xsl:with-param name="source" select="$refname"/> -->
+ <!-- * <xsl:with-param name="context-desc">meta date</xsl:with-param> -->
+ <!-- * <xsl:with-param name="message"> -->
+ <!-- * <xsl:text>no date; using generated date</xsl:text> -->
+ <!-- * </xsl:with-param> -->
+ <!-- * </xsl:call-template> -->
+ <!-- * <xsl:call-template name="log.message"> -->
+ <!-- * <xsl:with-param name="level">Note</xsl:with-param> -->
+ <!-- * <xsl:with-param name="source" select="$refname"/> -->
+ <!-- * <xsl:with-param name="context-desc">meta date</xsl:with-param> -->
+ <!-- * <xsl:with-param name="message"> -->
+ <!-- * <xsl:text>see http://docbook.sf.net/el/date</xsl:text> -->
+ <!-- * </xsl:with-param> -->
+ <!-- * </xsl:call-template> -->
+ <!-- * </xsl:if> -->
+ <!-- * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -->
+ <xsl:call-template name="datetime.format">
+ <xsl:with-param name="date">
+ <xsl:choose>
+ <xsl:when test="function-available('date:date-time')">
+ <xsl:value-of select="date:date-time()"/>
+ </xsl:when>
+ <xsl:when test="function-available('date:dateTime')">
+ <!-- Xalan quirk -->
+ <xsl:value-of select="date:dateTime()"/>
+ </xsl:when>
+ </xsl:choose>
+ </xsl:with-param>
+ <xsl:with-param name="format">
+ <xsl:call-template name="gentext.template">
+ <xsl:with-param name="context" select="'datetime'"/>
+ <xsl:with-param name="name" select="'format'"/>
+ </xsl:call-template>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ==================================================================== -->
+<doc:template name="get.refentry.source" xmlns="">
+ <refpurpose>Gets source metadata for a refentry</refpurpose>
+ <refdescription id="get.refentry.source-desc">
+ <para>The <literal>man(7)</literal> man page describes this as "the
+ source of the command", and provides the following examples:
+ <itemizedlist>
+ <listitem>
+ <para>For binaries, use something like: GNU, NET-2, SLS
+ Distribution, MCC Distribution.</para>
+ </listitem>
+ <listitem>
+ <para>For system calls, use the version of the kernel that you are
+ currently looking at: Linux 0.99.11.</para>
+ </listitem>
+ <listitem>
+ <para>For library calls, use the source of the function: GNU, BSD
+ 4.3, Linux DLL 4.4.1.</para>
+ </listitem>
+ </itemizedlist>
+ </para>
+
+ <para>The <literal>solbook(5)</literal> man page describes
+ something very much like what <literal>man(7)</literal> calls
+ "source", except that <literal>solbook(5)</literal> names it
+ "software" and describes it like this:
+ <blockquote>
+ <para>This is the name of the software product that the topic
+ discussed on the reference page belongs to. For example UNIX
+ commands are part of the <literal>SunOS x.x</literal>
+ release.</para>
+ </blockquote>
+ </para>
+
+ <para>In practice, there are many pages that simply have a version
+ number in the "source" field. So, it looks like what we have is a
+ two-part field,
+ <replaceable>Name</replaceable>&#160;<replaceable>Version</replaceable>,
+ where:
+ <variablelist>
+ <varlistentry>
+ <term>Name</term>
+ <listitem>
+ <para>product name (e.g., BSD) or org. name (e.g., GNU)</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>Version</term>
+ <listitem>
+ <para>version name</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ Each part is optional. If the <replaceable>Name</replaceable> is a
+ product name, then the <replaceable>Version</replaceable> is probably
+ the version of the product. Or there may be no
+ <replaceable>Name</replaceable>, in which case, if there is a
+ <replaceable>Version</replaceable>, it is probably the version of the
+ item itself, not the product it is part of. Or, if the
+ <replaceable>Name</replaceable> is an organization name, then there
+ probably will be no <replaceable>Version</replaceable>.
+ </para>
+ </refdescription>
+ <refparameter id="get.refentry.source-params">
+ <variablelist>
+ <varlistentry>
+ <term>refname</term>
+ <listitem>
+ <para>The first <tag>refname</tag> in the refentry</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>info</term>
+ <listitem>
+ <para>A set of info nodes (from a <tag>refentry</tag>
+ element and its ancestors)</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>prefs</term>
+ <listitem>
+ <para>A node containing users preferences (from global
+ stylesheet parameters)</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+ <refreturn id="get.refentry.source-returns">
+ <para>Returns a <tag>source</tag> node.</para>
+ </refreturn>
+</doc:template>
+<xsl:template name="get.refentry.source">
+ <xsl:param name="refname"/>
+ <xsl:param name="info"/>
+ <xsl:param name="prefs"/>
+ <xsl:variable name="Name">
+ <xsl:if test="$prefs/Name/@suppress = 0">
+ <xsl:call-template name="get.refentry.source.name">
+ <xsl:with-param name="info" select="$info"/>
+ <xsl:with-param name="refname" select="$refname"/>
+ <xsl:with-param name="prefs" select="$prefs/Name"/>
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:variable>
+ <xsl:variable name="Version">
+ <xsl:if test="$prefs/Version/@suppress = 0">
+ <xsl:call-template name="get.refentry.version">
+ <xsl:with-param name="info" select="$info"/>
+ <xsl:with-param name="refname" select="$refname"/>
+ <xsl:with-param name="prefs" select="$prefs/Version"/>
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:variable>
+ <xsl:choose>
+ <!-- * if we have a Name and/or Version, use either or both -->
+ <!-- * of those, in the form "Name Version" or just "Name" -->
+ <!-- * or just "Version" -->
+ <xsl:when test="not($Name = '') or not($Version = '')">
+ <xsl:choose>
+ <xsl:when test="not($Name = '') and not($Version = '')">
+ <xsl:copy-of select="$Name"/>
+ <xsl:text> </xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:copy-of select="$Name"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:copy-of select="$Version"/>
+ </xsl:when>
+ <!-- * if no Name and no Version, use fallback (if any) -->
+ <xsl:when test="not($prefs/@fallback = '')">
+ <xsl:variable name="source.fallback">
+ <xsl:call-template name="evaluate.info.profile">
+ <xsl:with-param name="profile" select="$prefs/@fallback"/>
+ <xsl:with-param name="info" select="$info"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <!-- * At this point, we know that we don't have properly marked-up -->
+ <!-- * source metadata, so even if we do have source fallback -->
+ <!-- * content, we still report to the user that it should be -->
+ <!-- * marked up properly instead. -->
+ <xsl:if test="$refentry.meta.get.quietly = 0">
+ <xsl:call-template name="report.missing.source.name">
+ <xsl:with-param name="refname" select="$refname"/>
+ </xsl:call-template>
+ <xsl:call-template name="report.missing.version">
+ <xsl:with-param name="refname" select="$refname"/>
+ </xsl:call-template>
+ </xsl:if>
+ <xsl:choose>
+ <xsl:when test="not($source.fallback = '')">
+ <xsl:value-of select="$source.fallback"/>
+ <xsl:if test="$refentry.meta.get.quietly = 0">
+ <xsl:call-template name="log.message">
+ <xsl:with-param name="level">Warn</xsl:with-param>
+ <xsl:with-param name="source" select="$refname"/>
+ <xsl:with-param name="context-desc">meta source</xsl:with-param>
+ <xsl:with-param name="message">
+ <xsl:text>using</xsl:text>
+ <xsl:text> "</xsl:text>
+ <xsl:value-of select="$source.fallback"/>
+ <xsl:text>" </xsl:text>
+ <xsl:text>for "source"</xsl:text>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:when>
+ <xsl:otherwise>
+ <!-- * we have no Name, no Version, and no fallback content, so -->
+ <!-- * insert a fixme -->
+ <xsl:text>[FIXME: source]</xsl:text>
+ <xsl:if test="$refentry.meta.get.quietly = 0">
+ <xsl:call-template name="log.message">
+ <xsl:with-param name="level">Warn</xsl:with-param>
+ <xsl:with-param name="source" select="$refname"/>
+ <xsl:with-param name="context-desc">meta source</xsl:with-param>
+ <xsl:with-param name="message">
+ <xsl:text>no fallback for source, so inserted a fixme</xsl:text>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <!-- * we have no Name, no Version, and no fallback given, so -->
+ <!-- * insert a fixme -->
+ <xsl:text>[FIXME: source]</xsl:text>
+ <xsl:if test="$refentry.meta.get.quietly = 0">
+ <xsl:call-template name="log.message">
+ <xsl:with-param name="level">Warn</xsl:with-param>
+ <xsl:with-param name="source" select="$refname"/>
+ <xsl:with-param name="context-desc">meta source</xsl:with-param>
+ <xsl:with-param name="message">
+ <xsl:text>no source fallback given, so inserted a fixme</xsl:text>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ==================================================================== -->
+<doc:template name="get.refentry.source.name" xmlns="">
+ <refpurpose>Gets source-name metadata for a refentry</refpurpose>
+ <refdescription id="get.refentry.source.name-desc">
+ <para>A "source name" is one part of a (potentially) two-part
+ <replaceable>Name</replaceable>&#160;<replaceable>Version</replaceable>
+ source field. For more details, see the documentation for the
+ <function>get.refentry.source</function> template.</para>
+ </refdescription>
+ <refparameter id="get.refentry.source.name-params">
+ <variablelist>
+ <varlistentry>
+ <term>refname</term>
+ <listitem>
+ <para>The first <tag>refname</tag> in the refentry</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>info</term>
+ <listitem>
+ <para>A set of info nodes (from a <tag>refentry</tag>
+ element and its ancestors)</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>prefs</term>
+ <listitem>
+ <para>A node containing users preferences (from global
+ stylesheet parameters)</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+ <refreturn id="get.refentry.source.name-returns">
+ <para>Depending on what output method is used for the
+ current stylesheet, either returns a text node or possibly an element
+ node, containing "source name" data.</para>
+ </refreturn>
+</doc:template>
+<xsl:template name="get.refentry.source.name">
+ <xsl:param name="refname"/>
+ <xsl:param name="info"/>
+ <xsl:param name="prefs"/>
+ <xsl:choose>
+ <!-- * if profiling is enabled for source.name, and the -->
+ <!-- * source.name profile is non-empty, use it -->
+ <xsl:when test="not($prefs/@profileEnabled = 0) and
+ not($prefs/@profile = '')">
+ <xsl:call-template name="evaluate.info.profile">
+ <xsl:with-param name="profile" select="$prefs/@profile"/>
+ <xsl:with-param name="info" select="$info"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <!-- * either profiling for source.name is not enabled, or-->
+ <!-- * the source.name profile is empty; so we need to look -->
+ <!-- * for a name to use -->
+ <xsl:choose>
+ <xsl:when test="refmeta/refmiscinfo[@class = 'source' or @class = 'software']">
+ <xsl:apply-templates
+ select="refmeta/refmiscinfo[@class = 'source' or @class='software'][1]/node()"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:choose>
+ <xsl:when test="$info/productname">
+ <xsl:call-template name="set.refentry.metadata">
+ <xsl:with-param name="refname" select="$refname"/>
+ <xsl:with-param
+ name="info"
+ select="($info[productname])[last()]"/>
+ <xsl:with-param
+ name="contents"
+ select="(($info[productname])[last()]/productname)[1]"/>
+ <xsl:with-param name="context">source</xsl:with-param>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="$info/corpname">
+ <xsl:call-template name="set.refentry.metadata">
+ <xsl:with-param name="refname" select="$refname"/>
+ <xsl:with-param
+ name="info"
+ select="($info[corpname])[last()]"/>
+ <xsl:with-param
+ name="contents"
+ select="(($info[corpname])[last()]/corpname)[1]"/>
+ <xsl:with-param name="context">source</xsl:with-param>
+ <xsl:with-param name="preferred">productname</xsl:with-param>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="$info/corpcredit">
+ <xsl:call-template name="set.refentry.metadata">
+ <xsl:with-param name="refname" select="$refname"/>
+ <xsl:with-param
+ name="info"
+ select="($info[corpcredit])[last()]"/>
+ <xsl:with-param
+ name="contents"
+ select="(($info[corpcredit])[last()]/corpcredit)[1]"/>
+ <xsl:with-param name="context">source</xsl:with-param>
+ <xsl:with-param name="preferred">productname</xsl:with-param>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="$info/corpauthor">
+ <xsl:call-template name="set.refentry.metadata">
+ <xsl:with-param name="refname" select="$refname"/>
+ <xsl:with-param
+ name="info"
+ select="($info[corpauthor])[last()]"/>
+ <xsl:with-param
+ name="contents"
+ select="(($info[corpauthor])[last()]/corpauthor)[1]"/>
+ <xsl:with-param name="context">source</xsl:with-param>
+ <xsl:with-param name="preferred">productname</xsl:with-param>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="$info//orgname">
+ <xsl:call-template name="set.refentry.metadata">
+ <xsl:with-param name="refname" select="$refname"/>
+ <xsl:with-param
+ name="info"
+ select="($info[//orgname])[last()]"/>
+ <xsl:with-param
+ name="contents"
+ select="(($info[//orgname])[last()]//orgname)[1]"/>
+ <xsl:with-param name="context">source</xsl:with-param>
+ <xsl:with-param name="preferred">productname</xsl:with-param>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="$info//publishername">
+ <xsl:call-template name="set.refentry.metadata">
+ <xsl:with-param name="refname" select="$refname"/>
+ <xsl:with-param
+ name="info"
+ select="($info[//publishername])[last()]"/>
+ <xsl:with-param
+ name="contents"
+ select="(($info[//publishername])[last()]//publishername)[1]"/>
+ <xsl:with-param name="context">source</xsl:with-param>
+ <xsl:with-param name="preferred">productname</xsl:with-param>
+ </xsl:call-template>
+ </xsl:when>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="report.missing.source.name">
+ <xsl:param name="refname"/>
+ <xsl:call-template name="log.message">
+ <xsl:with-param name="level">Note</xsl:with-param>
+ <xsl:with-param name="source" select="$refname"/>
+ <xsl:with-param name="context-desc">meta source</xsl:with-param>
+ <xsl:with-param name="message">
+ <xsl:text>no *info/productname or alternative</xsl:text>
+ </xsl:with-param>
+ </xsl:call-template>
+ <xsl:call-template name="log.message">
+ <xsl:with-param name="level">Note</xsl:with-param>
+ <xsl:with-param name="source" select="$refname"/>
+ <xsl:with-param name="context-desc">meta source</xsl:with-param>
+ <xsl:with-param name="message">
+ <xsl:text>see http://docbook.sf.net/el/productname</xsl:text>
+ </xsl:with-param>
+ </xsl:call-template>
+ <xsl:call-template name="log.message">
+ <xsl:with-param name="level">Note</xsl:with-param>
+ <xsl:with-param name="source" select="$refname"/>
+ <xsl:with-param name="context-desc">meta source</xsl:with-param>
+ <xsl:with-param name="message">
+ <xsl:text>no refentry/refmeta/refmiscinfo@class=source</xsl:text>
+ </xsl:with-param>
+ </xsl:call-template>
+ <xsl:call-template name="log.message">
+ <xsl:with-param name="level">Note</xsl:with-param>
+ <xsl:with-param name="source" select="$refname"/>
+ <xsl:with-param name="context-desc">meta source</xsl:with-param>
+ <xsl:with-param name="message">
+ <xsl:text>see http://docbook.sf.net/el/refmiscinfo</xsl:text>
+ </xsl:with-param>
+ </xsl:call-template>
+</xsl:template>
+
+<!-- ==================================================================== -->
+<doc:template name="get.refentry.version" xmlns="">
+ <refpurpose>Gets version metadata for a refentry</refpurpose>
+ <refdescription id="get.refentry.version-desc">
+ <para>A "version" is one part of a (potentially) two-part
+ <replaceable>Name</replaceable>&#160;<replaceable>Version</replaceable>
+ source field. For more details, see the documentation for the
+ <function>get.refentry.source</function> template.</para>
+ </refdescription>
+ <refparameter id="get.refentry.version-params">
+ <variablelist>
+ <varlistentry>
+ <term>refname</term>
+ <listitem>
+ <para>The first <tag>refname</tag> in the refentry</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>info</term>
+ <listitem>
+ <para>A set of info nodes (from a <tag>refentry</tag>
+ element and its ancestors)</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>prefs</term>
+ <listitem>
+ <para>A node containing users preferences (from global
+ stylesheet parameters)</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+ <refreturn id="get.refentry.version-returns">
+ <para>Depending on what output method is used for the
+ current stylesheet, either returns a text node or possibly an element
+ node, containing "version" data.</para>
+ </refreturn>
+</doc:template>
+<xsl:template name="get.refentry.version">
+ <xsl:param name="refname"/>
+ <xsl:param name="info"/>
+ <xsl:param name="prefs"/>
+ <xsl:choose>
+ <!-- * if profiling is enabled for version, and the -->
+ <!-- * version profile is non-empty, use it -->
+ <xsl:when test="not($prefs/@profileEnabled = 0) and
+ not($prefs/@profile = '')">
+ <xsl:call-template name="evaluate.info.profile">
+ <xsl:with-param name="profile" select="$prefs/@profile"/>
+ <xsl:with-param name="info" select="$info"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <!-- * either profiling for source.name is not enabled, or-->
+ <!-- * the source.name profile is empty; so we need to look -->
+ <!-- * for a name to use -->
+ <xsl:choose>
+ <xsl:when test="refmeta/refmiscinfo[@class = 'version']">
+ <xsl:apply-templates
+ select="refmeta/refmiscinfo[@class = 'version'][1]/node()"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:choose>
+ <xsl:when test="$info/productnumber">
+ <xsl:call-template name="set.refentry.metadata">
+ <xsl:with-param name="refname" select="$refname"/>
+ <xsl:with-param
+ name="info"
+ select="($info[productnumber])[last()]"/>
+ <xsl:with-param
+ name="contents"
+ select="(($info[productnumber])[last()]/productnumber)[1]"/>
+ <xsl:with-param name="context">version</xsl:with-param>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="$info/edition">
+ <xsl:call-template name="set.refentry.metadata">
+ <xsl:with-param name="refname" select="$refname"/>
+ <xsl:with-param
+ name="info"
+ select="($info[edition])[last()]"/>
+ <xsl:with-param
+ name="contents"
+ select="(($info[edition])[last()]/edition)[1]"/>
+ <xsl:with-param name="context">version</xsl:with-param>
+ <xsl:with-param name="preferred">productnumber</xsl:with-param>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="$info/releaseinfo">
+ <xsl:call-template name="set.refentry.metadata">
+ <xsl:with-param name="refname" select="$refname"/>
+ <xsl:with-param
+ name="info"
+ select="($info[releaseinfo])[last()]"/>
+ <xsl:with-param
+ name="contents"
+ select="(($info[releaseinfo])[last()]/releaseinfo)[1]"/>
+ <xsl:with-param name="context">version</xsl:with-param>
+ <xsl:with-param name="preferred">productnumber</xsl:with-param>
+ </xsl:call-template>
+ </xsl:when>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="report.missing.version">
+ <xsl:param name="refname"/>
+ <xsl:call-template name="log.message">
+ <xsl:with-param name="level">Note</xsl:with-param>
+ <xsl:with-param name="source" select="$refname"/>
+ <xsl:with-param name="context-desc">meta version</xsl:with-param>
+ <xsl:with-param name="message">
+ <xsl:text>no *info/productnumber or alternative</xsl:text>
+ </xsl:with-param>
+ </xsl:call-template>
+ <xsl:call-template name="log.message">
+ <xsl:with-param name="level">Note</xsl:with-param>
+ <xsl:with-param name="source" select="$refname"/>
+ <xsl:with-param name="context-desc">meta version</xsl:with-param>
+ <xsl:with-param name="message">
+ <xsl:text>see http://docbook.sf.net/el/productnumber</xsl:text>
+ </xsl:with-param>
+ </xsl:call-template>
+ <xsl:call-template name="log.message">
+ <xsl:with-param name="level">Note</xsl:with-param>
+ <xsl:with-param name="source" select="$refname"/>
+ <xsl:with-param name="context-desc">meta version</xsl:with-param>
+ <xsl:with-param name="message">
+ <xsl:text>no refentry/refmeta/refmiscinfo@class=version</xsl:text>
+ </xsl:with-param>
+ </xsl:call-template>
+ <xsl:call-template name="log.message">
+ <xsl:with-param name="level">Note</xsl:with-param>
+ <xsl:with-param name="source" select="$refname"/>
+ <xsl:with-param name="context-desc">meta version</xsl:with-param>
+ <xsl:with-param name="message">
+ <xsl:text>see http://docbook.sf.net/el/refmiscinfo</xsl:text>
+ </xsl:with-param>
+ </xsl:call-template>
+</xsl:template>
+
+<!-- ==================================================================== -->
+<doc:template name="get.refentry.manual" xmlns="">
+ <refpurpose>Gets source metadata for a refentry</refpurpose>
+ <refdescription id="get.refentry.manual-desc">
+ <para>The <literal>man(7)</literal> man page describes this as "the
+ title of the manual (e.g., <citetitle>Linux Programmer's
+ Manual</citetitle>)". Here are some examples from existing man pages:
+ <itemizedlist>
+ <listitem>
+ <para><citetitle>dpkg utilities</citetitle>
+ (<command>dpkg-name</command>)</para>
+ </listitem>
+ <listitem>
+ <para><citetitle>User Contributed Perl Documentation</citetitle>
+ (<command>GET</command>)</para>
+ </listitem>
+ <listitem>
+ <para><citetitle>GNU Development Tools</citetitle>
+ (<command>ld</command>)</para>
+ </listitem>
+ <listitem>
+ <para><citetitle>Emperor Norton Utilities</citetitle>
+ (<command>ddate</command>)</para>
+ </listitem>
+ <listitem>
+ <para><citetitle>Debian GNU/Linux manual</citetitle>
+ (<command>faked</command>)</para>
+ </listitem>
+ <listitem>
+ <para><citetitle>GIMP Manual Pages</citetitle>
+ (<command>gimp</command>)</para>
+ </listitem>
+ <listitem>
+ <para><citetitle>KDOC Documentation System</citetitle>
+ (<command>qt2kdoc</command>)</para>
+ </listitem>
+ </itemizedlist>
+ </para>
+
+ <para>The <literal>solbook(5)</literal> man page describes
+ something very much like what <literal>man(7)</literal> calls
+ "manual", except that <literal>solbook(5)</literal> names it
+ "sectdesc" and describes it like this:
+ <blockquote>
+ <para>This is the section title of the reference page; for
+ example <literal>User Commands</literal>.</para>
+ </blockquote>
+ </para>
+
+ </refdescription>
+ <refparameter id="get.refentry.manual-params">
+ <variablelist>
+ <varlistentry>
+ <term>refname</term>
+ <listitem>
+ <para>The first <tag>refname</tag> in the refentry</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>info</term>
+ <listitem>
+ <para>A set of info nodes (from a <tag>refentry</tag>
+ element and its ancestors)</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>prefs</term>
+ <listitem>
+ <para>A node containing users preferences (from global
+ stylesheet parameters)</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+ <refreturn id="get.refentry.manual-returns">
+ <para>Returns a <tag>manual</tag> node.</para>
+ </refreturn>
+</doc:template>
+<xsl:template name="get.refentry.manual">
+ <xsl:param name="refname"/>
+ <xsl:param name="info"/>
+ <xsl:param name="prefs"/>
+ <xsl:variable name="Manual">
+ <xsl:choose>
+ <!-- * if profiling is enabled for manual, and the manual -->
+ <!-- * profile is non-empty, use it -->
+ <xsl:when test="not($prefs/@profileEnabled = 0) and
+ not($prefs/@profile = '')">
+ <xsl:call-template name="evaluate.info.profile">
+ <xsl:with-param name="profile" select="$prefs/@profile"/>
+ <xsl:with-param name="info" select="$info"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:choose>
+ <xsl:when test="refmeta/refmiscinfo[@class = 'manual' or @class = 'sectdesc']">
+ <xsl:apply-templates
+ select="refmeta/refmiscinfo[@class = 'manual' or @class = 'sectdesc'][1]/node()"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <!-- * only in the case of choosing appropriate -->
+ <!-- * "manual" content do we select the furthest -->
+ <!-- * (first) matching element instead of the -->
+ <!-- * closest (last) matching one -->
+ <xsl:choose>
+ <xsl:when test="ancestor::*/title">
+ <xsl:call-template name="set.refentry.metadata">
+ <xsl:with-param name="refname" select="$refname"/>
+ <xsl:with-param
+ name="info"
+ select="(ancestor::*[title])[1]"/>
+ <xsl:with-param
+ name="contents"
+ select="(ancestor::*[title])[1]/title"/>
+ <xsl:with-param name="context">manual</xsl:with-param>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="$info/title">
+ <xsl:call-template name="set.refentry.metadata">
+ <xsl:with-param name="refname" select="$refname"/>
+ <xsl:with-param
+ name="info"
+ select="($info[title])[1]"/>
+ <xsl:with-param
+ name="contents"
+ select="(($info[title])[1]/title)[1]"/>
+ <xsl:with-param name="context">manual</xsl:with-param>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:choose>
+ <xsl:when test="not($Manual = '')">
+ <xsl:copy-of select="$Manual"/>
+ </xsl:when>
+ <!-- * if no Manual, use contents of specified fallback (if any) -->
+ <xsl:when test="not($prefs/@fallback = '')">
+ <xsl:variable name="manual.fallback">
+ <xsl:call-template name="evaluate.info.profile">
+ <xsl:with-param name="profile" select="$prefs/@fallback"/>
+ <xsl:with-param name="info" select="$info"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <!-- * At this point, we know that we don't have properly marked-up -->
+ <!-- * manual metadata, so even if we do have manual fallback -->
+ <!-- * content, we still report to the user that it should be -->
+ <!-- * marked up properly instead. -->
+ <xsl:if test="$refentry.meta.get.quietly = 0">
+ <xsl:call-template name="report.missing.manual">
+ <xsl:with-param name="refname" select="$refname"/>
+ </xsl:call-template>
+ </xsl:if>
+ <xsl:choose>
+ <xsl:when test="not($manual.fallback = '')">
+ <xsl:value-of select="$manual.fallback"/>
+ <xsl:if test="$refentry.meta.get.quietly = 0">
+ <xsl:call-template name="log.message">
+ <xsl:with-param name="level">Warn</xsl:with-param>
+ <xsl:with-param name="source" select="$refname"/>
+ <xsl:with-param name="context-desc">meta manual</xsl:with-param>
+ <xsl:with-param name="message">
+ <xsl:text>using</xsl:text>
+ <xsl:text> "</xsl:text>
+ <xsl:value-of select="$manual.fallback"/>
+ <xsl:text>" </xsl:text>
+ <xsl:text>for "manual"</xsl:text>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:when>
+ <xsl:otherwise>
+ <!-- * we have nothing appropriate to use for manual, and no fallback -->
+ <!-- * content, so report insert a fixme -->
+ <xsl:text>[FIXME: manual]</xsl:text>
+ <xsl:if test="$refentry.meta.get.quietly = 0">
+ <xsl:call-template name="log.message">
+ <xsl:with-param name="level">Warn</xsl:with-param>
+ <xsl:with-param name="source" select="$refname"/>
+ <xsl:with-param name="context-desc">meta manual</xsl:with-param>
+ <xsl:with-param name="message">
+ <xsl:text>no fallback for manual, so inserted a fixme</xsl:text>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <!-- * we have nothing appropriate to use for manual, and no fallback -->
+ <!-- * given, so insert a fixme -->
+ <xsl:text>[FIXME: manual]</xsl:text>
+ <xsl:if test="$refentry.meta.get.quietly = 0">
+ <xsl:call-template name="log.message">
+ <xsl:with-param name="level">Warn</xsl:with-param>
+ <xsl:with-param name="source" select="$refname"/>
+ <xsl:with-param name="context-desc">meta manual</xsl:with-param>
+ <xsl:with-param name="message">
+ <xsl:text>no manual fallback given, so inserted a fixme</xsl:text>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="report.missing.manual">
+ <xsl:param name="refname"/>
+ <xsl:call-template name="log.message">
+ <xsl:with-param name="level">Note</xsl:with-param>
+ <xsl:with-param name="source" select="$refname"/>
+ <xsl:with-param name="context-desc">meta manual</xsl:with-param>
+ <xsl:with-param name="message">
+ <xsl:text>no titled ancestor of refentry</xsl:text>
+ </xsl:with-param>
+ </xsl:call-template>
+ <xsl:call-template name="log.message">
+ <xsl:with-param name="level">Note</xsl:with-param>
+ <xsl:with-param name="source" select="$refname"/>
+ <xsl:with-param name="context-desc">meta manual</xsl:with-param>
+ <xsl:with-param name="message">
+ <xsl:text>no refentry/refmeta/refmiscinfo@class=manual</xsl:text>
+ </xsl:with-param>
+ </xsl:call-template>
+ <xsl:call-template name="log.message">
+ <xsl:with-param name="level">Note</xsl:with-param>
+ <xsl:with-param name="source" select="$refname"/>
+ <xsl:with-param name="context-desc">meta manual</xsl:with-param>
+ <xsl:with-param name="message">
+ <xsl:text>see http://docbook.sf.net/el/refmiscinfo</xsl:text>
+ </xsl:with-param>
+ </xsl:call-template>
+</xsl:template>
+<!-- ====================================================================== -->
+<doc:template name="get.refentry.metadata.prefs" xmlns="">
+ <refpurpose>Gets user preferences for refentry metadata gathering</refpurpose>
+ <refdescription id="get.refentry.metadata.prefs-desc">
+ <para>The DocBook XSL stylesheets include several user-configurable
+ global stylesheet parameters for controlling <tag>refentry</tag>
+ metadata gathering. Those parameters are not read directly by the
+ other <tag>refentry</tag> metadata-gathering
+ templates. Instead, they are read only by the
+ <function>get.refentry.metadata.prefs</function> template,
+ which assembles them into a structure that is then passed to
+ the other <tag>refentry</tag> metadata-gathering
+ templates.</para>
+
+ <para>So the, <function>get.refentry.metadata.prefs</function>
+ template is the only interface to collecting stylesheet parameters for
+ controlling <tag>refentry</tag> metadata gathering.</para>
+ </refdescription>
+ <refparameter id="get.refentry.metadata.prefs-params">
+ <para>There are no local parameters for this template; however, it
+ does rely on a number of global parameters.</para>
+ </refparameter>
+ <refreturn id="get.refentry.metadata.prefs-returns">
+ <para>Returns a <tag>manual</tag> node.</para>
+ </refreturn>
+</doc:template>
+<xsl:template name="get.refentry.metadata.prefs">
+ <DatePrefs>
+ <xsl:attribute name="profile">
+ <xsl:value-of select="$refentry.date.profile"/>
+ </xsl:attribute>
+ <xsl:attribute name="profileEnabled">
+ <xsl:value-of select="$refentry.date.profile.enabled"/>
+ </xsl:attribute>
+ </DatePrefs>
+ <SourcePrefs>
+ <xsl:attribute name="fallback">
+ <xsl:value-of select="$refentry.source.fallback.profile"/>
+ </xsl:attribute>
+ <Name>
+ <xsl:attribute name="profile">
+ <xsl:value-of select="$refentry.source.name.profile"/>
+ </xsl:attribute>
+ <xsl:attribute name="profileEnabled">
+ <xsl:value-of select="$refentry.source.name.profile.enabled"/>
+ </xsl:attribute>
+ <xsl:attribute name="suppress">
+ <xsl:value-of select="$refentry.source.name.suppress"/>
+ </xsl:attribute>
+ </Name>
+ <Version>
+ <xsl:attribute name="profile">
+ <xsl:value-of select="$refentry.version.profile"/>
+ </xsl:attribute>
+ <xsl:attribute name="profileEnabled">
+ <xsl:value-of select="$refentry.version.profile.enabled"/>
+ </xsl:attribute>
+ <xsl:attribute name="suppress">
+ <xsl:value-of select="$refentry.version.suppress"/>
+ </xsl:attribute>
+ </Version>
+ </SourcePrefs>
+ <ManualPrefs>
+ <xsl:attribute name="fallback">
+ <xsl:value-of select="$refentry.manual.fallback.profile"/>
+ </xsl:attribute>
+ <xsl:attribute name="profile">
+ <xsl:value-of select="$refentry.manual.profile"/>
+ </xsl:attribute>
+ <xsl:attribute name="profileEnabled">
+ <xsl:value-of select="$refentry.manual.profile.enabled"/>
+ </xsl:attribute>
+ </ManualPrefs>
+</xsl:template>
+
+<!-- ====================================================================== -->
+<doc:template name="set.refentry.metadata" xmlns="">
+ <refpurpose>Sets content of a refentry metadata item</refpurpose>
+ <refdescription id="set.refentry.metadata-desc">
+ <para>The <function>set.refentry.metadata</function> template is
+ called each time a suitable source element is found for a certain
+ metadata field.</para>
+ </refdescription>
+ <refparameter id="set.refentry.metadata-params">
+ <variablelist>
+ <varlistentry>
+ <term>refname</term>
+ <listitem>
+ <para>The first <tag>refname</tag> in the refentry</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>info</term>
+ <listitem>
+ <para>A single *info node that contains the selected source element.</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>contents</term>
+ <listitem>
+ <para>A node containing the selected source element.</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>context</term>
+ <listitem>
+ <para>A string describing the metadata context in which the
+ <function>set.refentry.metadata</function> template was
+ called: either "date", "source", "version", or "manual".</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+ <refreturn id="set.refentry.metadata-returns">
+ <para>Returns formatted contents of a selected source element.</para></refreturn>
+</doc:template>
+<xsl:template name="set.refentry.metadata">
+ <xsl:param name="refname"/>
+ <xsl:param name="info"/>
+ <xsl:param name="contents"/>
+ <xsl:param name="context"/>
+ <xsl:param name="preferred"/>
+ <!-- * <xsl:if test="not($preferred = '')"> -->
+ <!-- * <xsl:if test="$refentry.meta.get.quietly = 0"> -->
+ <!-- * <xsl:call-template name="log.message"> -->
+ <!-- * <xsl:with-param name="level">Note</xsl:with-param> -->
+ <!-- * <xsl:with-param name="source" select="$refname"/> -->
+ <!-- * <xsl:with-param name="context-desc" select="concat('meta ', $context)"/> -->
+ <!-- * <xsl:with-param name="message" select="concat('No ', $preferred)"/> -->
+ <!-- * </xsl:call-template> -->
+ <!-- * <xsl:call-template name="log.message"> -->
+ <!-- * <xsl:with-param name="level">Note</xsl:with-param> -->
+ <!-- * <xsl:with-param name="source" select="$refname"/> -->
+ <!-- * <xsl:with-param name="context-desc" select="concat('meta ', $context)"/> -->
+ <!-- * <xsl:with-param name="message"> -->
+ <!-- * <xsl:text>no refentry/refmeta/refmiscinfo@class=</xsl:text> -->
+ <!-- * <xsl:value-of select="$context"/> -->
+ <!-- * </xsl:with-param> -->
+ <!-- * </xsl:call-template> -->
+ <!-- * <xsl:call-template name="log.message"> -->
+ <!-- * <xsl:with-param name="level">Note</xsl:with-param> -->
+ <!-- * <xsl:with-param name="source" select="$refname"/> -->
+ <!-- * <xsl:with-param name="context-desc" select="concat('meta ', $context)"/> -->
+ <!-- * <xsl:with-param name="message" select="concat('Using ', local-name($contents))"/> -->
+ <!-- * </xsl:call-template> -->
+ <!-- * </xsl:if> -->
+ <!-- * </xsl:if> -->
+ <xsl:value-of select="$contents"/>
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/ro.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/ro.xml
new file mode 100644
index 0000000..4926311
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/ro.xml
@@ -0,0 +1,1229 @@
+<?xml version="1.0" encoding="utf-8"?>
+<l:l10n xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0" language="ro" english-language-name="Romanian">
+
+<!-- * This file is generated automatically. -->
+<!-- * To submit changes to this file upstream (to the DocBook Project) -->
+<!-- * do not submit an edited version of this file. Instead, submit an -->
+<!-- * edited version of the source file at the following location: -->
+<!-- * -->
+<!-- * https://docbook.svn.sourceforge.net/svnroot/docbook/trunk/gentext/locale/ro.xml -->
+<!-- * -->
+<!-- * E-mail the edited ro.xml source file to: -->
+<!-- * -->
+<!-- * docbook-developers@lists.sourceforge.net -->
+
+<!-- ******************************************************************** -->
+
+<!-- This file is part of the XSL DocBook Stylesheet distribution. -->
+<!-- See ../README or http://docbook.sf.net/release/xsl/current/ for -->
+<!-- copyright and other information. -->
+
+<!-- ******************************************************************** -->
+<!-- In these files, % with a letter is used for a placeholder: -->
+<!-- %t is the current element's title -->
+<!-- %s is the current element's subtitle (if applicable)-->
+<!-- %n is the current element's number label-->
+<!-- %p is the current element's page number (if applicable)-->
+<!-- ******************************************************************** -->
+
+
+<l:gentext key="Abstract" text="Rezumat"/>
+<l:gentext key="abstract" text="Rezumat"/>
+<l:gentext key="Acknowledgements" text="Acknowledgements" lang="en"/>
+<l:gentext key="acknowledgements" text="Acknowledgements" lang="en"/>
+<l:gentext key="Answer" text="R:"/>
+<l:gentext key="answer" text="R:"/>
+<l:gentext key="Appendix" text="Anexa"/>
+<l:gentext key="appendix" text="anexa"/>
+<l:gentext key="Article" text="Articol"/>
+<l:gentext key="article" text="Articol"/>
+<l:gentext key="Author" text="Author" lang="en"/>
+<l:gentext key="Bibliography" text="Bibliografie"/>
+<l:gentext key="bibliography" text="Bibliografie"/>
+<l:gentext key="Book" text="Carte"/>
+<l:gentext key="book" text="Carte"/>
+<l:gentext key="CAUTION" text="ATENÈšIE"/>
+<l:gentext key="Caution" text="Atenție"/>
+<l:gentext key="caution" text="Atenție"/>
+<l:gentext key="Chapter" text="Cap."/>
+<l:gentext key="chapter" text="cap."/>
+<l:gentext key="Colophon" text="Colophon"/>
+<l:gentext key="colophon" text="Colophon"/>
+<l:gentext key="Copyright" text="Copyright"/>
+<l:gentext key="copyright" text="Copyright"/>
+<l:gentext key="Dedication" text="Dedicație"/>
+<l:gentext key="dedication" text="Dedicație"/>
+<l:gentext key="Edition" text="Ediție"/>
+<l:gentext key="edition" text="Ediție"/>
+<l:gentext key="Editor" text="Editor" lang="en"/>
+<l:gentext key="Equation" text="ecuația"/>
+<l:gentext key="equation" text="ecuația"/>
+<l:gentext key="Example" text="Exemplu"/>
+<l:gentext key="example" text="Exemplu"/>
+<l:gentext key="Figure" text="Fig."/>
+<l:gentext key="figure" text="Fig."/>
+<l:gentext key="Glossary" text="Glosar"/>
+<l:gentext key="glossary" text="Glosar"/>
+<l:gentext key="GlossSee" text="Vezi"/>
+<l:gentext key="glosssee" text="Vezi"/>
+<l:gentext key="GlossSeeAlso" text="Vezi și"/>
+<l:gentext key="glossseealso" text="Vezi și"/>
+<l:gentext key="IMPORTANT" text="IMPORTANT"/>
+<l:gentext key="important" text="Important"/>
+<l:gentext key="Important" text="Important"/>
+<l:gentext key="Index" text="Index"/>
+<l:gentext key="index" text="Index"/>
+<l:gentext key="ISBN" text="ISBN"/>
+<l:gentext key="isbn" text="ISBN"/>
+<l:gentext key="LegalNotice" text=""/>
+<l:gentext key="legalnotice" text=""/>
+<l:gentext key="MsgAud" text=""/>
+<l:gentext key="msgaud" text=""/>
+<l:gentext key="MsgLevel" text="Nivel"/>
+<l:gentext key="msglevel" text="Nivel"/>
+<l:gentext key="MsgOrig" text="Origine"/>
+<l:gentext key="msgorig" text="Origine"/>
+<l:gentext key="NOTE" text="NOTÄ‚"/>
+<l:gentext key="Note" text="Notă"/>
+<l:gentext key="note" text="Notă"/>
+<l:gentext key="Part" text="Parte"/>
+<l:gentext key="part" text="Parte"/>
+<l:gentext key="Preface" text="Prefață"/>
+<l:gentext key="preface" text="Prefață"/>
+<l:gentext key="Procedure" text="Procedură"/>
+<l:gentext key="procedure" text="Procedură"/>
+<l:gentext key="ProductionSet" text="Production"/>
+<l:gentext key="PubDate" text="Publication Date" lang="en"/>
+<l:gentext key="pubdate" text="Publication date" lang="en"/>
+<l:gentext key="Published" text="Publicat"/>
+<l:gentext key="published" text="Publicat"/>
+<l:gentext key="Publisher" text="Publisher" lang="en"/>
+<l:gentext key="Qandadiv" text="Întrebări și răspunsuri"/>
+<l:gentext key="qandadiv" text="întrebări și răspunsuri"/>
+<l:gentext key="QandASet" text="Frequently Asked Questions" lang="en"/>
+<l:gentext key="Question" text="ÃŽ:"/>
+<l:gentext key="question" text="î:"/>
+<l:gentext key="RefEntry" text=""/>
+<l:gentext key="refentry" text=""/>
+<l:gentext key="Reference" text="Referință"/>
+<l:gentext key="reference" text="Referință"/>
+<l:gentext key="References" text="References" lang="en"/>
+<l:gentext key="RefName" text="Nume"/>
+<l:gentext key="refname" text="Nume"/>
+<l:gentext key="RefSection" text=""/>
+<l:gentext key="refsection" text=""/>
+<l:gentext key="RefSynopsisDiv" text="Rezumat"/>
+<l:gentext key="refsynopsisdiv" text="Rezumat"/>
+<l:gentext key="RevHistory" text="Istoricul versiunilor"/>
+<l:gentext key="revhistory" text="Istoricul versiunilor"/>
+<l:gentext key="revision" text="Versiune"/>
+<l:gentext key="Revision" text="Versiune"/>
+<l:gentext key="sect1" text="Secțiune"/>
+<l:gentext key="sect2" text="Secțiune"/>
+<l:gentext key="sect3" text="Secțiune"/>
+<l:gentext key="sect4" text="Secțiune"/>
+<l:gentext key="sect5" text="Secțiune"/>
+<l:gentext key="section" text="sec."/>
+<l:gentext key="Section" text="Secțiune"/>
+<l:gentext key="see" text="Vezi"/>
+<l:gentext key="See" text="Vezi"/>
+<l:gentext key="seealso" text="Vezi și"/>
+<l:gentext key="Seealso" text="Vezi și"/>
+<l:gentext key="SeeAlso" text="Vezi și"/>
+<l:gentext key="set" text="Set"/>
+<l:gentext key="Set" text="Set"/>
+<l:gentext key="setindex" text="Index"/>
+<l:gentext key="SetIndex" text="Index"/>
+<l:gentext key="Sidebar" text=""/>
+<l:gentext key="sidebar" text="sidebar"/>
+<l:gentext key="step" text="operațiune"/>
+<l:gentext key="Step" text="Operație"/>
+<l:gentext key="table" text="Tabel"/>
+<l:gentext key="Table" text="Tabel"/>
+<l:gentext key="task" text="Task" lang="en"/>
+<l:gentext key="Task" text="Task" lang="en"/>
+<l:gentext key="tip" text="Indicație"/>
+<l:gentext key="TIP" text="INDICAÈšIE"/>
+<l:gentext key="Tip" text="Indicație"/>
+<l:gentext key="Warning" text="Avertisment"/>
+<l:gentext key="warning" text="Avertisment"/>
+<l:gentext key="WARNING" text="AVERTISMENT"/>
+<l:gentext key="and" text="și"/>
+<l:gentext key="by" text="de"/>
+<l:gentext key="Edited" text="Publicat"/>
+<l:gentext key="edited" text="Publicat"/>
+<l:gentext key="Editedby" text="Publicat de"/>
+<l:gentext key="editedby" text="Publicat de"/>
+<l:gentext key="in" text="în"/>
+<l:gentext key="lastlistcomma" text=","/>
+<l:gentext key="listcomma" text=","/>
+<l:gentext key="notes" text="Note"/>
+<l:gentext key="Notes" text="Note"/>
+<l:gentext key="Pgs" text="Pagini"/>
+<l:gentext key="pgs" text="Pagini"/>
+<l:gentext key="Revisedby" text="Revised by: "/>
+<l:gentext key="revisedby" text="Revised by: "/>
+<l:gentext key="TableNotes" text="Remarci"/>
+<l:gentext key="tablenotes" text="Remarci"/>
+<l:gentext key="TableofContents" text="Cuprins"/>
+<l:gentext key="tableofcontents" text="Cuprins"/>
+<l:gentext key="unexpectedelementname" text="Nume de element neașteptat"/>
+<l:gentext key="unsupported" text="nerecunoscut de sisitem"/>
+<l:gentext key="xrefto" text="referință către"/>
+<l:gentext key="Authors" text="Authors" lang="en"/>
+<l:gentext key="copyeditor" text="Copy Editor" lang="en"/>
+<l:gentext key="graphicdesigner" text="Graphic Designer" lang="en"/>
+<l:gentext key="productioneditor" text="Production Editor" lang="en"/>
+<l:gentext key="technicaleditor" text="Technical Editor" lang="en"/>
+<l:gentext key="translator" text="Translator" lang="en"/>
+<l:gentext key="listofequations" text="Listă de ecuații"/>
+<l:gentext key="ListofEquations" text="Listă de ecuații"/>
+<l:gentext key="ListofExamples" text="Listă de exemple"/>
+<l:gentext key="listofexamples" text="Listă de exemple"/>
+<l:gentext key="ListofFigures" text="Listă de figuri"/>
+<l:gentext key="listoffigures" text="Listă de figuri"/>
+<l:gentext key="ListofProcedures" text="List of Procedures" lang="en"/>
+<l:gentext key="listofprocedures" text="List of Procedures" lang="en"/>
+<l:gentext key="listoftables" text="Listă de tabele"/>
+<l:gentext key="ListofTables" text="Listă de tabele"/>
+<l:gentext key="ListofUnknown" text="Listă de necunoscute"/>
+<l:gentext key="listofunknown" text="Listă de necunoscute"/>
+<l:gentext key="nav-home" text="Acasă"/>
+<l:gentext key="nav-next" text="ÃŽnainte"/>
+<l:gentext key="nav-next-sibling" text="Repede ïnainte"/>
+<l:gentext key="nav-prev" text="ÃŽnapoi"/>
+<l:gentext key="nav-prev-sibling" text="Repede înapoi"/>
+<l:gentext key="nav-up" text="Sus"/>
+<l:gentext key="nav-toc" text="ToC" lang="en"/>
+<l:gentext key="Draft" text="Ciornă"/>
+<l:gentext key="above" text="deasupra"/>
+<l:gentext key="below" text="sub"/>
+<l:gentext key="sectioncalled" text="secțiunea numită"/>
+<l:gentext key="index symbols" text="Simboluri"/>
+<l:gentext key="writing-mode" text="lr-tb"/>
+<l:gentext key="lowercase.alpha" text="aăâbcdefghiîjklmnopqrsștșuvwxyz"/>
+<l:gentext key="uppercase.alpha" text="AĂÂBCDEFGHIÎJKLMNOPQRSȘTȚUVWXYZ"/>
+<l:gentext key="normalize.sort.input" text="AaÀàÃáÂâÃãÄäÅåĀÄĂ㥹ÇǎǞǟǠǡǺǻȀÈȂȃȦȧḀá¸áºšáº áº¡áº¢áº£áº¤áº¥áº¦áº§áº¨áº©áºªáº«áº¬áº­áº®áº¯áº°áº±áº²áº³áº´áºµáº¶áº·BbÆ€ÆɓƂƃḂḃḄḅḆḇCcÇçĆćĈĉĊċČÄƇƈɕḈḉDdÄŽÄÄđƊɗƋƌDžDzȡɖḊḋḌá¸á¸Žá¸á¸á¸‘ḒḓEeÈèÉéÊêËëĒēĔĕĖėĘęĚěȄȅȆȇȨȩḔḕḖḗḘḙḚḛḜá¸áº¸áº¹áººáº»áº¼áº½áº¾áº¿á»€á»á»‚ểỄễỆệFfƑƒḞḟGgÄœÄĞğĠġĢģƓɠǤǥǦǧǴǵḠḡHhĤĥĦħȞȟɦḢḣḤḥḦḧḨḩḪḫẖIiÌìÃíÎîÃïĨĩĪīĬĭĮįİƗɨÇÇȈȉȊȋḬḭḮḯỈỉỊịJjĴĵǰÊKkĶķƘƙǨǩḰḱḲḳḴḵLlĹĺĻļĽľĿŀÅłƚLjȴɫɬɭḶḷḸḹḺḻḼḽMmɱḾḿṀá¹á¹‚ṃNnÑñŃńŅņŇňÆɲƞȠNjǸǹȵɳṄṅṆṇṈṉṊṋOoÒòÓóÔôÕõÖöØøŌÅÅŽÅÅőƟƠơǑǒǪǫǬǭǾǿȌÈÈŽÈȪȫȬȭȮȯȰȱṌá¹á¹Žá¹á¹á¹‘ṒṓỌá»á»Žá»á»á»‘ỒồỔổỖỗỘộỚớỜá»á»žá»Ÿá» á»¡á»¢á»£PpƤƥṔṕṖṗQqÊ RrŔŕŖŗŘřÈȑȒȓɼɽɾṘṙṚṛṜá¹á¹žá¹ŸSsŚśŜÅŞşŠšȘșʂṠṡṢṣṤṥṦṧṨṩTtŢţŤťŦŧƫƬƭƮʈȚțȶṪṫṬṭṮṯṰṱẗUuÙùÚúÛûÜüŨũŪūŬŭŮůŰűŲųƯưǓǔǕǖǗǘǙǚǛǜȔȕȖȗṲṳṴṵṶṷṸṹṺṻỤụỦủỨứỪừỬửỮữỰựVvƲʋṼṽṾṿWwŴŵẀáºáº‚ẃẄẅẆẇẈẉẘXxẊẋẌáºYyÃýÿŸŶŷƳƴȲȳẎáºáº™á»²á»³á»´á»µá»¶á»·á»¸á»¹ZzŹźŻżŽžƵƶȤȥÊÊ‘áºáº‘ẒẓẔẕẕ" lang="en"/>
+<l:gentext key="normalize.sort.output" text="AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBCCCCCCCCCCCCCCCCCDDDDDDDDDDDDDDDDDDDDDDDDEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEFFFFFFGGGGGGGGGGGGGGGGGGGGHHHHHHHHHHHHHHHHHHHHIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIJJJJJJKKKKKKKKKKKKKKLLLLLLLLLLLLLLLLLLLLLLLLLLMMMMMMMMMNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOPPPPPPPPQQQRRRRRRRRRRRRRRRRRRRRRRRSSSSSSSSSSSSSSSSSSSSSSSTTTTTTTTTTTTTTTTTTTTTTTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUVVVVVVVVWWWWWWWWWWWWWWWXXXXXXYYYYYYYYYYYYYYYYYYYYYYYZZZZZZZZZZZZZZZZZZZZZ" lang="en"/>
+<l:dingbat key="startquote" text="„"/>
+<l:dingbat key="endquote" text="â€"/>
+<l:dingbat key="nestedstartquote" text="«"/>
+<l:dingbat key="nestedendquote" text="»"/>
+<l:dingbat key="singlestartquote" text="‘" lang="en"/>
+<l:dingbat key="singleendquote" text="’" lang="en"/>
+<l:dingbat key="bullet" text="•"/>
+<l:gentext key="hyphenation-character" text="-" lang="en"/>
+<l:gentext key="hyphenation-push-character-count" text="2" lang="en"/>
+<l:gentext key="hyphenation-remain-character-count" text="2" lang="en"/>
+<l:context name="styles"><l:template name="person-name" text="first-last"/>
+</l:context>
+<l:context name="title"><l:template name="abstract" text="%t"/>
+<l:template name="acknowledgements" text="%t" lang="en"/>
+<l:template name="answer" text="%t"/>
+<l:template name="appendix" text="Anexa %n. %t"/>
+<l:template name="article" text="%t"/>
+<l:template name="authorblurb" text="%t"/>
+<l:template name="bibliodiv" text="%t"/>
+<l:template name="biblioentry" text="%t"/>
+<l:template name="bibliography" text="%t"/>
+<l:template name="bibliolist" text="%t" lang="en"/>
+<l:template name="bibliomixed" text="%t"/>
+<l:template name="bibliomset" text="%t"/>
+<l:template name="biblioset" text="%t"/>
+<l:template name="blockquote" text="%t"/>
+<l:template name="book" text="%t"/>
+<l:template name="calloutlist" text="%t"/>
+<l:template name="caution" text="%t"/>
+<l:template name="chapter" text="Cap. %n. %t"/>
+<l:template name="colophon" text="%t"/>
+<l:template name="dedication" text="%t"/>
+<l:template name="equation" text="ecuația %n. %t"/>
+<l:template name="example" text="Exemplu %n. %t"/>
+<l:template name="figure" text="Fig. %n. %t"/>
+<l:template name="foil" text="%t" lang="en"/>
+<l:template name="foilgroup" text="%t" lang="en"/>
+<l:template name="formalpara" text="%t"/>
+<l:template name="glossary" text="%t"/>
+<l:template name="glossdiv" text="%t"/>
+<l:template name="glosslist" text="%t" lang="en"/>
+<l:template name="glossentry" text="%t" lang="en"/>
+<l:template name="important" text="%t"/>
+<l:template name="index" text="%t"/>
+<l:template name="indexdiv" text="%t"/>
+<l:template name="itemizedlist" text="%t"/>
+<l:template name="legalnotice" text="%t"/>
+<l:template name="listitem" text=""/>
+<l:template name="lot" text="%t"/>
+<l:template name="msg" text="%t"/>
+<l:template name="msgexplan" text="%t"/>
+<l:template name="msgmain" text="%t"/>
+<l:template name="msgrel" text="%t"/>
+<l:template name="msgset" text="%t"/>
+<l:template name="msgsub" text="%t"/>
+<l:template name="note" text="%t"/>
+<l:template name="orderedlist" text="%t"/>
+<l:template name="part" text="Parte %n. %t"/>
+<l:template name="partintro" text="%t"/>
+<l:template name="preface" text="%t"/>
+<l:template name="procedure" text="%t"/>
+<l:template name="procedure.formal" text="Procedură %n. %t"/>
+<l:template name="productionset" text="%t"/>
+<l:template name="productionset.formal" text="Production %n"/>
+<l:template name="qandadiv" text="%t"/>
+<l:template name="qandaentry" text="%t"/>
+<l:template name="qandaset" text="%t"/>
+<l:template name="question" text="%t"/>
+<l:template name="refentry" text="%t"/>
+<l:template name="reference" text="%t"/>
+<l:template name="refsection" text="%t"/>
+<l:template name="refsect1" text="%t"/>
+<l:template name="refsect2" text="%t"/>
+<l:template name="refsect3" text="%t"/>
+<l:template name="refsynopsisdiv" text="%t"/>
+<l:template name="refsynopsisdivinfo" text="%t"/>
+<l:template name="segmentedlist" text="%t"/>
+<l:template name="set" text="%t"/>
+<l:template name="setindex" text="%t"/>
+<l:template name="sidebar" text="%t"/>
+<l:template name="step" text="%t"/>
+<l:template name="table" text="Tabel %n. %t"/>
+<l:template name="task" text="%t" lang="en"/>
+<l:template name="tasksummary" text="%t" lang="en"/>
+<l:template name="taskprerequisites" text="%t" lang="en"/>
+<l:template name="taskrelated" text="%t" lang="en"/>
+<l:template name="tip" text="%t"/>
+<l:template name="toc" text="%t"/>
+<l:template name="variablelist" text="%t"/>
+<l:template name="varlistentry" text="" lang="en"/>
+<l:template name="warning" text="%t"/>
+</l:context>
+<l:context name="title-unnumbered"><l:template name="appendix" text="%t"/>
+<l:template name="article/appendix" text="%t" lang="en"/>
+<l:template name="bridgehead" text="%t"/>
+<l:template name="chapter" text="%t"/>
+<l:template name="sect1" text="%t"/>
+<l:template name="sect2" text="%t"/>
+<l:template name="sect3" text="%t"/>
+<l:template name="sect4" text="%t"/>
+<l:template name="sect5" text="%t"/>
+<l:template name="section" text="%t"/>
+<l:template name="simplesect" text="%t"/>
+<l:template name="part" text="%t" lang="en"/>
+</l:context>
+<l:context name="title-numbered"><l:template name="appendix" text="Anexa %n. %t"/>
+<l:template name="article/appendix" text="%n. %t" lang="en"/>
+<l:template name="bridgehead" text="%t"/>
+<l:template name="chapter" text="Cap. %n. %t"/>
+<l:template name="part" text="Parte %n. %t"/>
+<l:template name="sect1" text="%n. %t"/>
+<l:template name="sect2" text="%n. %t"/>
+<l:template name="sect3" text="%n. %t"/>
+<l:template name="sect4" text="%n. %t"/>
+<l:template name="sect5" text="%n. %t"/>
+<l:template name="section" text="%n. %t"/>
+<l:template name="simplesect" text="%n. %t"/>
+</l:context>
+<l:context name="subtitle"><l:template name="appendix" text="%s"/>
+<l:template name="acknowledgements" text="%s" lang="en"/>
+<l:template name="article" text="%s"/>
+<l:template name="bibliodiv" text="%s"/>
+<l:template name="biblioentry" text="%s"/>
+<l:template name="bibliography" text="%s"/>
+<l:template name="bibliomixed" text="%s"/>
+<l:template name="bibliomset" text="%s"/>
+<l:template name="biblioset" text="%s"/>
+<l:template name="book" text="%s"/>
+<l:template name="chapter" text="%s"/>
+<l:template name="colophon" text="%s"/>
+<l:template name="dedication" text="%s"/>
+<l:template name="glossary" text="%s"/>
+<l:template name="glossdiv" text="%s"/>
+<l:template name="index" text="%s"/>
+<l:template name="indexdiv" text="%s"/>
+<l:template name="lot" text="%s"/>
+<l:template name="part" text="%s"/>
+<l:template name="partintro" text="%s"/>
+<l:template name="preface" text="%s"/>
+<l:template name="refentry" text="%s"/>
+<l:template name="reference" text="%s"/>
+<l:template name="refsection" text="%s"/>
+<l:template name="refsect1" text="%s"/>
+<l:template name="refsect2" text="%s"/>
+<l:template name="refsect3" text="%s"/>
+<l:template name="refsynopsisdiv" text="%s"/>
+<l:template name="sect1" text="%s"/>
+<l:template name="sect2" text="%s"/>
+<l:template name="sect3" text="%s"/>
+<l:template name="sect4" text="%s"/>
+<l:template name="sect5" text="%s"/>
+<l:template name="section" text="%s"/>
+<l:template name="set" text="%s"/>
+<l:template name="setindex" text="%s"/>
+<l:template name="sidebar" text="%s"/>
+<l:template name="simplesect" text="%s"/>
+<l:template name="toc" text="%s"/>
+</l:context>
+<l:context name="xref"><l:template name="abstract" text="%t"/>
+<l:template name="acknowledgements" text="%t" lang="en"/>
+<l:template name="answer" text="R: %n"/>
+<l:template name="appendix" text="%t"/>
+<l:template name="article" text="%t"/>
+<l:template name="authorblurb" text="%t"/>
+<l:template name="bibliodiv" text="%t"/>
+<l:template name="bibliography" text="%t"/>
+<l:template name="bibliomset" text="%t"/>
+<l:template name="biblioset" text="%t"/>
+<l:template name="blockquote" text="%t"/>
+<l:template name="book" text="%t"/>
+<l:template name="calloutlist" text="%t"/>
+<l:template name="caution" text="%t"/>
+<l:template name="chapter" text="%t"/>
+<l:template name="colophon" text="%t"/>
+<l:template name="constraintdef" text="%t"/>
+<l:template name="dedication" text="%t"/>
+<l:template name="equation" text="%t"/>
+<l:template name="example" text="%t"/>
+<l:template name="figure" text="%t"/>
+<l:template name="foil" text="%t" lang="en"/>
+<l:template name="foilgroup" text="%t" lang="en"/>
+<l:template name="formalpara" text="%t"/>
+<l:template name="glossary" text="%t"/>
+<l:template name="glossdiv" text="%t"/>
+<l:template name="important" text="%t"/>
+<l:template name="index" text="%t"/>
+<l:template name="indexdiv" text="%t"/>
+<l:template name="itemizedlist" text="%t"/>
+<l:template name="legalnotice" text="%t"/>
+<l:template name="listitem" text="%n"/>
+<l:template name="lot" text="%t"/>
+<l:template name="msg" text="%t"/>
+<l:template name="msgexplan" text="%t"/>
+<l:template name="msgmain" text="%t"/>
+<l:template name="msgrel" text="%t"/>
+<l:template name="msgset" text="%t"/>
+<l:template name="msgsub" text="%t"/>
+<l:template name="note" text="%t"/>
+<l:template name="orderedlist" text="%t"/>
+<l:template name="part" text="%t"/>
+<l:template name="partintro" text="%t"/>
+<l:template name="preface" text="%t"/>
+<l:template name="procedure" text="%t"/>
+<l:template name="productionset" text="%t"/>
+<l:template name="qandadiv" text="%t"/>
+<l:template name="qandaentry" text="Î: %n"/>
+<l:template name="qandaset" text="%t"/>
+<l:template name="question" text="Î: %n"/>
+<l:template name="reference" text="%t"/>
+<l:template name="refsynopsisdiv" text="%t"/>
+<l:template name="segmentedlist" text="%t"/>
+<l:template name="set" text="%t"/>
+<l:template name="setindex" text="%t"/>
+<l:template name="sidebar" text="%t"/>
+<l:template name="table" text="%t"/>
+<l:template name="task" text="%t" lang="en"/>
+<l:template name="tip" text="%t"/>
+<l:template name="toc" text="%t"/>
+<l:template name="variablelist" text="%t"/>
+<l:template name="varlistentry" text="%n"/>
+<l:template name="warning" text="%t"/>
+<l:template name="olink.document.citation" text=" in %o" lang="en"/>
+<l:template name="olink.page.citation" text=" (page %p)" lang="en"/>
+<l:template name="page.citation" text=" [%p]"/>
+<l:template name="page" text="(page %p)" lang="en"/>
+<l:template name="docname" text=" in %o" lang="en"/>
+<l:template name="docnamelong" text=" in the document titled %o" lang="en"/>
+<l:template name="pageabbrev" text="(p. %p)" lang="en"/>
+<l:template name="Page" text="Page %p" lang="en"/>
+<l:template name="bridgehead" text="„%tâ€"/>
+<l:template name="refsection" text="„%tâ€"/>
+<l:template name="refsect1" text="„%tâ€"/>
+<l:template name="refsect2" text="„%tâ€"/>
+<l:template name="refsect3" text="„%tâ€"/>
+<l:template name="sect1" text="„%tâ€"/>
+<l:template name="sect2" text="„%tâ€"/>
+<l:template name="sect3" text="„%tâ€"/>
+<l:template name="sect4" text="„%tâ€"/>
+<l:template name="sect5" text="„%tâ€"/>
+<l:template name="section" text="„%tâ€"/>
+<l:template name="simplesect" text="„%tâ€"/>
+</l:context>
+<l:context name="xref-number"><l:template name="answer" text="R: %n"/>
+<l:template name="appendix" text="Anexa %n"/>
+<l:template name="bridgehead" text="Secțiune %n"/>
+<l:template name="chapter" text="Cap. %n"/>
+<l:template name="equation" text="ecuația %n"/>
+<l:template name="example" text="Exemplu %n"/>
+<l:template name="figure" text="Fig. %n"/>
+<l:template name="part" text="Parte %n"/>
+<l:template name="procedure" text="Procedură %n"/>
+<l:template name="productionset" text="Production %n"/>
+<l:template name="qandadiv" text="Întrebări și răspunsuri %n"/>
+<l:template name="qandaentry" text="Î: %n"/>
+<l:template name="question" text="Î: %n"/>
+<l:template name="sect1" text="Secțiune %n"/>
+<l:template name="sect2" text="Secțiune %n"/>
+<l:template name="sect3" text="Secțiune %n"/>
+<l:template name="sect4" text="Secțiune %n"/>
+<l:template name="sect5" text="Secțiune %n"/>
+<l:template name="section" text="Secțiune %n"/>
+<l:template name="table" text="Tabel %n"/>
+</l:context>
+<l:context name="xref-number-and-title"><l:template name="appendix" text="Anexa %n, %t"/>
+<l:template name="bridgehead" text="SecÈ›iune %n, „%tâ€"/>
+<l:template name="chapter" text="Cap. %n, %t"/>
+<l:template name="equation" text="ecuaÈ›ia %n, „%tâ€"/>
+<l:template name="example" text="Exemplu %n, „%tâ€"/>
+<l:template name="figure" text="Fig. %n, „%tâ€"/>
+<l:template name="part" text="Parte %n, „%tâ€"/>
+<l:template name="procedure" text="Procedură %n, „%tâ€"/>
+<l:template name="productionset" text="Production %n, „%tâ€"/>
+<l:template name="qandadiv" text="ÃŽntrebări È™i răspunsuri %n, „%tâ€"/>
+<l:template name="refsect1" text="secÈ›iunea numită „%tâ€"/>
+<l:template name="refsect2" text="secÈ›iunea numită „%tâ€"/>
+<l:template name="refsect3" text="secÈ›iunea numită „%tâ€"/>
+<l:template name="refsection" text="secÈ›iunea numită „%tâ€"/>
+<l:template name="sect1" text="SecÈ›iune %n, „%tâ€"/>
+<l:template name="sect2" text="SecÈ›iune %n, „%tâ€"/>
+<l:template name="sect3" text="SecÈ›iune %n, „%tâ€"/>
+<l:template name="sect4" text="SecÈ›iune %n, „%tâ€"/>
+<l:template name="sect5" text="SecÈ›iune %n, „%tâ€"/>
+<l:template name="section" text="SecÈ›iune %n, „%tâ€"/>
+<l:template name="simplesect" text="secÈ›iunea numită „%tâ€"/>
+<l:template name="table" text="Tabel %n, „%tâ€"/>
+</l:context>
+<l:context name="authorgroup"><l:template name="sep" text=", "/>
+<l:template name="sep2" text=" și "/>
+<l:template name="seplast" text=", și "/>
+</l:context>
+<l:context name="glossary"><l:template name="see" text="Vezi %t."/>
+<l:template name="seealso" text="Vezi și %t."/>
+<l:template name="seealso-separator" text=", "/>
+</l:context>
+<l:context name="msgset"><l:template name="MsgAud" text=": "/>
+<l:template name="MsgLevel" text="Nivel: "/>
+<l:template name="MsgOrig" text="Origine: "/>
+</l:context>
+<l:context name="datetime"><l:template name="format" text="m/d/Y" lang="en"/>
+</l:context>
+<l:context name="termdef"><l:template name="prefix" text="[Definition: " lang="en"/>
+<l:template name="suffix" text="]" lang="en"/>
+</l:context>
+<l:context name="datetime-full"><l:template name="January" text="January" lang="en"/>
+<l:template name="February" text="February" lang="en"/>
+<l:template name="March" text="March" lang="en"/>
+<l:template name="April" text="April" lang="en"/>
+<l:template name="May" text="May" lang="en"/>
+<l:template name="June" text="June" lang="en"/>
+<l:template name="July" text="July" lang="en"/>
+<l:template name="August" text="August" lang="en"/>
+<l:template name="September" text="September" lang="en"/>
+<l:template name="October" text="October" lang="en"/>
+<l:template name="November" text="November" lang="en"/>
+<l:template name="December" text="December" lang="en"/>
+<l:template name="Monday" text="Monday" lang="en"/>
+<l:template name="Tuesday" text="Tuesday" lang="en"/>
+<l:template name="Wednesday" text="Wednesday" lang="en"/>
+<l:template name="Thursday" text="Thursday" lang="en"/>
+<l:template name="Friday" text="Friday" lang="en"/>
+<l:template name="Saturday" text="Saturday" lang="en"/>
+<l:template name="Sunday" text="Sunday" lang="en"/>
+</l:context>
+<l:context name="datetime-abbrev"><l:template name="Jan" text="Jan" lang="en"/>
+<l:template name="Feb" text="Feb" lang="en"/>
+<l:template name="Mar" text="Mar" lang="en"/>
+<l:template name="Apr" text="Apr" lang="en"/>
+<l:template name="May" text="May" lang="en"/>
+<l:template name="Jun" text="Jun" lang="en"/>
+<l:template name="Jul" text="Jul" lang="en"/>
+<l:template name="Aug" text="Aug" lang="en"/>
+<l:template name="Sep" text="Sep" lang="en"/>
+<l:template name="Oct" text="Oct" lang="en"/>
+<l:template name="Nov" text="Nov" lang="en"/>
+<l:template name="Dec" text="Dec" lang="en"/>
+<l:template name="Mon" text="Mon" lang="en"/>
+<l:template name="Tue" text="Tue" lang="en"/>
+<l:template name="Wed" text="Wed" lang="en"/>
+<l:template name="Thu" text="Thu" lang="en"/>
+<l:template name="Fri" text="Fri" lang="en"/>
+<l:template name="Sat" text="Sat" lang="en"/>
+<l:template name="Sun" text="Sun" lang="en"/>
+</l:context>
+<l:context name="htmlhelp"><l:template name="langcode" text="0x0418 Romanian"/>
+</l:context>
+<l:context name="index"><l:template name="term-separator" text=", " lang="en"/>
+<l:template name="number-separator" text=", " lang="en"/>
+<l:template name="range-separator" text="-" lang="en"/>
+</l:context>
+<l:context name="iso690"><l:template name="lastfirst.sep" text=", " lang="en"/>
+<l:template name="alt.person.two.sep" text=" – " lang="en"/>
+<l:template name="alt.person.last.sep" text=" – " lang="en"/>
+<l:template name="alt.person.more.sep" text=" – " lang="en"/>
+<l:template name="primary.editor" text=" (ed.)" lang="en"/>
+<l:template name="primary.many" text=", et al." lang="en"/>
+<l:template name="primary.sep" text=". " lang="en"/>
+<l:template name="submaintitle.sep" text=": " lang="en"/>
+<l:template name="title.sep" text=". " lang="en"/>
+<l:template name="othertitle.sep" text=", " lang="en"/>
+<l:template name="medium1" text=" [" lang="en"/>
+<l:template name="medium2" text="]" lang="en"/>
+<l:template name="secondary.person.sep" text="; " lang="en"/>
+<l:template name="secondary.sep" text=". " lang="en"/>
+<l:template name="respons.sep" text=". " lang="en"/>
+<l:template name="edition.sep" text=". " lang="en"/>
+<l:template name="edition.serial.sep" text=", " lang="en"/>
+<l:template name="issuing.range" text="-" lang="en"/>
+<l:template name="issuing.div" text=", " lang="en"/>
+<l:template name="issuing.sep" text=". " lang="en"/>
+<l:template name="partnr.sep" text=". " lang="en"/>
+<l:template name="placepubl.sep" text=": " lang="en"/>
+<l:template name="publyear.sep" text=", " lang="en"/>
+<l:template name="pubinfo.sep" text=". " lang="en"/>
+<l:template name="spec.pubinfo.sep" text=", " lang="en"/>
+<l:template name="upd.sep" text=", " lang="en"/>
+<l:template name="datecit1" text=" [cited " lang="en"/>
+<l:template name="datecit2" text="]" lang="en"/>
+<l:template name="extent.sep" text=". " lang="en"/>
+<l:template name="locs.sep" text=", " lang="en"/>
+<l:template name="location.sep" text=". " lang="en"/>
+<l:template name="serie.sep" text=". " lang="en"/>
+<l:template name="notice.sep" text=". " lang="en"/>
+<l:template name="access" text="Available " lang="en"/>
+<l:template name="acctoo" text="Also available " lang="en"/>
+<l:template name="onwww" text="from World Wide Web" lang="en"/>
+<l:template name="oninet" text="from Internet" lang="en"/>
+<l:template name="access.end" text=": " lang="en"/>
+<l:template name="link1" text="&lt;" lang="en"/>
+<l:template name="link2" text="&gt;" lang="en"/>
+<l:template name="access.sep" text=". " lang="en"/>
+<l:template name="isbn" text="ISBN " lang="en"/>
+<l:template name="issn" text="ISSN " lang="en"/>
+<l:template name="stdnum.sep" text=". " lang="en"/>
+<l:template name="patcountry.sep" text=". " lang="en"/>
+<l:template name="pattype.sep" text=", " lang="en"/>
+<l:template name="patnum.sep" text=". " lang="en"/>
+<l:template name="patdate.sep" text=". " lang="en"/>
+</l:context><l:letters lang="en"><l:l i="-1"/>
+<l:l i="0">Symbols</l:l>
+<l:l i="10">A</l:l>
+<l:l i="10">a</l:l>
+<l:l i="10">À</l:l>
+<l:l i="10">à</l:l>
+<l:l i="10">Ã</l:l>
+<l:l i="10">á</l:l>
+<l:l i="10">Â</l:l>
+<l:l i="10">â</l:l>
+<l:l i="10">Ã</l:l>
+<l:l i="10">ã</l:l>
+<l:l i="10">Ä</l:l>
+<l:l i="10">ä</l:l>
+<l:l i="10">Ã…</l:l>
+<l:l i="10">Ã¥</l:l>
+<l:l i="10">Ä€</l:l>
+<l:l i="10">Ä</l:l>
+<l:l i="10">Ä‚</l:l>
+<l:l i="10">ă</l:l>
+<l:l i="10">Ä„</l:l>
+<l:l i="10">Ä…</l:l>
+<l:l i="10">Ç</l:l>
+<l:l i="10">ÇŽ</l:l>
+<l:l i="10">Çž</l:l>
+<l:l i="10">ÇŸ</l:l>
+<l:l i="10">Ç </l:l>
+<l:l i="10">Ç¡</l:l>
+<l:l i="10">Ǻ</l:l>
+<l:l i="10">Ç»</l:l>
+<l:l i="10">È€</l:l>
+<l:l i="10">È</l:l>
+<l:l i="10">È‚</l:l>
+<l:l i="10">ȃ</l:l>
+<l:l i="10">Ȧ</l:l>
+<l:l i="10">ȧ</l:l>
+<l:l i="10">Ḁ</l:l>
+<l:l i="10">á¸</l:l>
+<l:l i="10">ẚ</l:l>
+<l:l i="10">Ạ</l:l>
+<l:l i="10">ạ</l:l>
+<l:l i="10">Ả</l:l>
+<l:l i="10">ả</l:l>
+<l:l i="10">Ấ</l:l>
+<l:l i="10">ấ</l:l>
+<l:l i="10">Ầ</l:l>
+<l:l i="10">ầ</l:l>
+<l:l i="10">Ẩ</l:l>
+<l:l i="10">ẩ</l:l>
+<l:l i="10">Ẫ</l:l>
+<l:l i="10">ẫ</l:l>
+<l:l i="10">Ậ</l:l>
+<l:l i="10">ậ</l:l>
+<l:l i="10">Ắ</l:l>
+<l:l i="10">ắ</l:l>
+<l:l i="10">Ằ</l:l>
+<l:l i="10">ằ</l:l>
+<l:l i="10">Ẳ</l:l>
+<l:l i="10">ẳ</l:l>
+<l:l i="10">Ẵ</l:l>
+<l:l i="10">ẵ</l:l>
+<l:l i="10">Ặ</l:l>
+<l:l i="10">ặ</l:l>
+<l:l i="20">B</l:l>
+<l:l i="20">b</l:l>
+<l:l i="20">Æ€</l:l>
+<l:l i="20">Æ</l:l>
+<l:l i="20">É“</l:l>
+<l:l i="20">Æ‚</l:l>
+<l:l i="20">ƃ</l:l>
+<l:l i="20">Ḃ</l:l>
+<l:l i="20">ḃ</l:l>
+<l:l i="20">Ḅ</l:l>
+<l:l i="20">ḅ</l:l>
+<l:l i="20">Ḇ</l:l>
+<l:l i="20">ḇ</l:l>
+<l:l i="30">C</l:l>
+<l:l i="30">c</l:l>
+<l:l i="30">Ç</l:l>
+<l:l i="30">ç</l:l>
+<l:l i="30">Ć</l:l>
+<l:l i="30">ć</l:l>
+<l:l i="30">Ĉ</l:l>
+<l:l i="30">ĉ</l:l>
+<l:l i="30">ÄŠ</l:l>
+<l:l i="30">Ä‹</l:l>
+<l:l i="30">Č</l:l>
+<l:l i="30">Ä</l:l>
+<l:l i="30">Ƈ</l:l>
+<l:l i="30">ƈ</l:l>
+<l:l i="30">É•</l:l>
+<l:l i="30">Ḉ</l:l>
+<l:l i="30">ḉ</l:l>
+<l:l i="40">D</l:l>
+<l:l i="40">d</l:l>
+<l:l i="40">ÄŽ</l:l>
+<l:l i="40">Ä</l:l>
+<l:l i="40">Ä</l:l>
+<l:l i="40">Ä‘</l:l>
+<l:l i="40">ÆŠ</l:l>
+<l:l i="40">É—</l:l>
+<l:l i="40">Æ‹</l:l>
+<l:l i="40">ƌ</l:l>
+<l:l i="40">Ç…</l:l>
+<l:l i="40">Dz</l:l>
+<l:l i="40">È¡</l:l>
+<l:l i="40">É–</l:l>
+<l:l i="40">Ḋ</l:l>
+<l:l i="40">ḋ</l:l>
+<l:l i="40">Ḍ</l:l>
+<l:l i="40">á¸</l:l>
+<l:l i="40">Ḏ</l:l>
+<l:l i="40">á¸</l:l>
+<l:l i="40">á¸</l:l>
+<l:l i="40">ḑ</l:l>
+<l:l i="40">Ḓ</l:l>
+<l:l i="40">ḓ</l:l>
+<l:l i="50">E</l:l>
+<l:l i="50">e</l:l>
+<l:l i="50">È</l:l>
+<l:l i="50">è</l:l>
+<l:l i="50">É</l:l>
+<l:l i="50">é</l:l>
+<l:l i="50">Ê</l:l>
+<l:l i="50">ê</l:l>
+<l:l i="50">Ë</l:l>
+<l:l i="50">ë</l:l>
+<l:l i="50">Ä’</l:l>
+<l:l i="50">Ä“</l:l>
+<l:l i="50">Ä”</l:l>
+<l:l i="50">Ä•</l:l>
+<l:l i="50">Ä–</l:l>
+<l:l i="50">Ä—</l:l>
+<l:l i="50">Ę</l:l>
+<l:l i="50">Ä™</l:l>
+<l:l i="50">Äš</l:l>
+<l:l i="50">Ä›</l:l>
+<l:l i="50">È„</l:l>
+<l:l i="50">È…</l:l>
+<l:l i="50">Ȇ</l:l>
+<l:l i="50">ȇ</l:l>
+<l:l i="50">Ȩ</l:l>
+<l:l i="50">È©</l:l>
+<l:l i="50">Ḕ</l:l>
+<l:l i="50">ḕ</l:l>
+<l:l i="50">Ḗ</l:l>
+<l:l i="50">ḗ</l:l>
+<l:l i="50">Ḙ</l:l>
+<l:l i="50">ḙ</l:l>
+<l:l i="50">Ḛ</l:l>
+<l:l i="50">ḛ</l:l>
+<l:l i="50">Ḝ</l:l>
+<l:l i="50">á¸</l:l>
+<l:l i="50">Ẹ</l:l>
+<l:l i="50">ẹ</l:l>
+<l:l i="50">Ẻ</l:l>
+<l:l i="50">ẻ</l:l>
+<l:l i="50">Ẽ</l:l>
+<l:l i="50">ẽ</l:l>
+<l:l i="50">Ế</l:l>
+<l:l i="50">ế</l:l>
+<l:l i="50">Ề</l:l>
+<l:l i="50">á»</l:l>
+<l:l i="50">Ể</l:l>
+<l:l i="50">ể</l:l>
+<l:l i="50">Ễ</l:l>
+<l:l i="50">á»…</l:l>
+<l:l i="50">Ệ</l:l>
+<l:l i="50">ệ</l:l>
+<l:l i="60">F</l:l>
+<l:l i="60">f</l:l>
+<l:l i="60">Æ‘</l:l>
+<l:l i="60">Æ’</l:l>
+<l:l i="60">Ḟ</l:l>
+<l:l i="60">ḟ</l:l>
+<l:l i="70">G</l:l>
+<l:l i="70">g</l:l>
+<l:l i="70">Ĝ</l:l>
+<l:l i="70">Ä</l:l>
+<l:l i="70">Äž</l:l>
+<l:l i="70">ÄŸ</l:l>
+<l:l i="70">Ä </l:l>
+<l:l i="70">Ä¡</l:l>
+<l:l i="70">Ä¢</l:l>
+<l:l i="70">Ä£</l:l>
+<l:l i="70">Æ“</l:l>
+<l:l i="70">É </l:l>
+<l:l i="70">Ǥ</l:l>
+<l:l i="70">Ç¥</l:l>
+<l:l i="70">Ǧ</l:l>
+<l:l i="70">ǧ</l:l>
+<l:l i="70">Ç´</l:l>
+<l:l i="70">ǵ</l:l>
+<l:l i="70">Ḡ</l:l>
+<l:l i="70">ḡ</l:l>
+<l:l i="80">H</l:l>
+<l:l i="80">h</l:l>
+<l:l i="80">Ĥ</l:l>
+<l:l i="80">Ä¥</l:l>
+<l:l i="80">Ħ</l:l>
+<l:l i="80">ħ</l:l>
+<l:l i="80">Èž</l:l>
+<l:l i="80">ÈŸ</l:l>
+<l:l i="80">ɦ</l:l>
+<l:l i="80">Ḣ</l:l>
+<l:l i="80">ḣ</l:l>
+<l:l i="80">Ḥ</l:l>
+<l:l i="80">ḥ</l:l>
+<l:l i="80">Ḧ</l:l>
+<l:l i="80">ḧ</l:l>
+<l:l i="80">Ḩ</l:l>
+<l:l i="80">ḩ</l:l>
+<l:l i="80">Ḫ</l:l>
+<l:l i="80">ḫ</l:l>
+<l:l i="80">ẖ</l:l>
+<l:l i="90">I</l:l>
+<l:l i="90">i</l:l>
+<l:l i="90">Ì</l:l>
+<l:l i="90">ì</l:l>
+<l:l i="90">Ã</l:l>
+<l:l i="90">í</l:l>
+<l:l i="90">ÃŽ</l:l>
+<l:l i="90">î</l:l>
+<l:l i="90">Ã</l:l>
+<l:l i="90">ï</l:l>
+<l:l i="90">Ĩ</l:l>
+<l:l i="90">Ä©</l:l>
+<l:l i="90">Ī</l:l>
+<l:l i="90">Ä«</l:l>
+<l:l i="90">Ĭ</l:l>
+<l:l i="90">Ä­</l:l>
+<l:l i="90">Ä®</l:l>
+<l:l i="90">į</l:l>
+<l:l i="90">Ä°</l:l>
+<l:l i="90">Æ—</l:l>
+<l:l i="90">ɨ</l:l>
+<l:l i="90">Ç</l:l>
+<l:l i="90">Ç</l:l>
+<l:l i="90">Ȉ</l:l>
+<l:l i="90">ȉ</l:l>
+<l:l i="90">ÈŠ</l:l>
+<l:l i="90">È‹</l:l>
+<l:l i="90">Ḭ</l:l>
+<l:l i="90">ḭ</l:l>
+<l:l i="90">Ḯ</l:l>
+<l:l i="90">ḯ</l:l>
+<l:l i="90">Ỉ</l:l>
+<l:l i="90">ỉ</l:l>
+<l:l i="90">Ị</l:l>
+<l:l i="90">ị</l:l>
+<l:l i="100">J</l:l>
+<l:l i="100">j</l:l>
+<l:l i="100">Ä´</l:l>
+<l:l i="100">ĵ</l:l>
+<l:l i="100">Ç°</l:l>
+<l:l i="100">Ê</l:l>
+<l:l i="110">K</l:l>
+<l:l i="110">k</l:l>
+<l:l i="110">Ķ</l:l>
+<l:l i="110">Ä·</l:l>
+<l:l i="110">Ƙ</l:l>
+<l:l i="110">Æ™</l:l>
+<l:l i="110">Ǩ</l:l>
+<l:l i="110">Ç©</l:l>
+<l:l i="110">Ḱ</l:l>
+<l:l i="110">ḱ</l:l>
+<l:l i="110">Ḳ</l:l>
+<l:l i="110">ḳ</l:l>
+<l:l i="110">Ḵ</l:l>
+<l:l i="110">ḵ</l:l>
+<l:l i="120">L</l:l>
+<l:l i="120">l</l:l>
+<l:l i="120">Ĺ</l:l>
+<l:l i="120">ĺ</l:l>
+<l:l i="120">Ä»</l:l>
+<l:l i="120">ļ</l:l>
+<l:l i="120">Ľ</l:l>
+<l:l i="120">ľ</l:l>
+<l:l i="120">Ä¿</l:l>
+<l:l i="120">Å€</l:l>
+<l:l i="120">Å</l:l>
+<l:l i="120">Å‚</l:l>
+<l:l i="120">Æš</l:l>
+<l:l i="120">Lj</l:l>
+<l:l i="120">È´</l:l>
+<l:l i="120">É«</l:l>
+<l:l i="120">ɬ</l:l>
+<l:l i="120">É­</l:l>
+<l:l i="120">Ḷ</l:l>
+<l:l i="120">ḷ</l:l>
+<l:l i="120">Ḹ</l:l>
+<l:l i="120">ḹ</l:l>
+<l:l i="120">Ḻ</l:l>
+<l:l i="120">ḻ</l:l>
+<l:l i="120">Ḽ</l:l>
+<l:l i="120">ḽ</l:l>
+<l:l i="130">M</l:l>
+<l:l i="130">m</l:l>
+<l:l i="130">ɱ</l:l>
+<l:l i="130">Ḿ</l:l>
+<l:l i="130">ḿ</l:l>
+<l:l i="130">á¹€</l:l>
+<l:l i="130">á¹</l:l>
+<l:l i="130">Ṃ</l:l>
+<l:l i="130">ṃ</l:l>
+<l:l i="140">N</l:l>
+<l:l i="140">n</l:l>
+<l:l i="140">Ñ</l:l>
+<l:l i="140">ñ</l:l>
+<l:l i="140">Ń</l:l>
+<l:l i="140">Å„</l:l>
+<l:l i="140">Å…</l:l>
+<l:l i="140">ņ</l:l>
+<l:l i="140">Ň</l:l>
+<l:l i="140">ň</l:l>
+<l:l i="140">Æ</l:l>
+<l:l i="140">ɲ</l:l>
+<l:l i="140">Æž</l:l>
+<l:l i="140">È </l:l>
+<l:l i="140">Ç‹</l:l>
+<l:l i="140">Ǹ</l:l>
+<l:l i="140">ǹ</l:l>
+<l:l i="140">ȵ</l:l>
+<l:l i="140">ɳ</l:l>
+<l:l i="140">Ṅ</l:l>
+<l:l i="140">á¹…</l:l>
+<l:l i="140">Ṇ</l:l>
+<l:l i="140">ṇ</l:l>
+<l:l i="140">Ṉ</l:l>
+<l:l i="140">ṉ</l:l>
+<l:l i="140">Ṋ</l:l>
+<l:l i="140">ṋ</l:l>
+<l:l i="150">O</l:l>
+<l:l i="150">o</l:l>
+<l:l i="150">Ã’</l:l>
+<l:l i="150">ò</l:l>
+<l:l i="150">Ó</l:l>
+<l:l i="150">ó</l:l>
+<l:l i="150">Ô</l:l>
+<l:l i="150">ô</l:l>
+<l:l i="150">Õ</l:l>
+<l:l i="150">õ</l:l>
+<l:l i="150">Ö</l:l>
+<l:l i="150">ö</l:l>
+<l:l i="150">Ø</l:l>
+<l:l i="150">ø</l:l>
+<l:l i="150">Ō</l:l>
+<l:l i="150">Å</l:l>
+<l:l i="150">ÅŽ</l:l>
+<l:l i="150">Å</l:l>
+<l:l i="150">Å</l:l>
+<l:l i="150">Å‘</l:l>
+<l:l i="150">ÆŸ</l:l>
+<l:l i="150">Æ </l:l>
+<l:l i="150">Æ¡</l:l>
+<l:l i="150">Ç‘</l:l>
+<l:l i="150">Ç’</l:l>
+<l:l i="150">Ǫ</l:l>
+<l:l i="150">Ç«</l:l>
+<l:l i="150">Ǭ</l:l>
+<l:l i="150">Ç­</l:l>
+<l:l i="150">Ǿ</l:l>
+<l:l i="150">Ç¿</l:l>
+<l:l i="150">Ȍ</l:l>
+<l:l i="150">È</l:l>
+<l:l i="150">ÈŽ</l:l>
+<l:l i="150">È</l:l>
+<l:l i="150">Ȫ</l:l>
+<l:l i="150">È«</l:l>
+<l:l i="150">Ȭ</l:l>
+<l:l i="150">È­</l:l>
+<l:l i="150">È®</l:l>
+<l:l i="150">ȯ</l:l>
+<l:l i="150">È°</l:l>
+<l:l i="150">ȱ</l:l>
+<l:l i="150">Ṍ</l:l>
+<l:l i="150">á¹</l:l>
+<l:l i="150">Ṏ</l:l>
+<l:l i="150">á¹</l:l>
+<l:l i="150">á¹</l:l>
+<l:l i="150">ṑ</l:l>
+<l:l i="150">á¹’</l:l>
+<l:l i="150">ṓ</l:l>
+<l:l i="150">Ọ</l:l>
+<l:l i="150">á»</l:l>
+<l:l i="150">Ỏ</l:l>
+<l:l i="150">á»</l:l>
+<l:l i="150">á»</l:l>
+<l:l i="150">ố</l:l>
+<l:l i="150">á»’</l:l>
+<l:l i="150">ồ</l:l>
+<l:l i="150">á»”</l:l>
+<l:l i="150">ổ</l:l>
+<l:l i="150">á»–</l:l>
+<l:l i="150">á»—</l:l>
+<l:l i="150">Ộ</l:l>
+<l:l i="150">á»™</l:l>
+<l:l i="150">Ớ</l:l>
+<l:l i="150">á»›</l:l>
+<l:l i="150">Ờ</l:l>
+<l:l i="150">á»</l:l>
+<l:l i="150">Ở</l:l>
+<l:l i="150">ở</l:l>
+<l:l i="150">á» </l:l>
+<l:l i="150">ỡ</l:l>
+<l:l i="150">Ợ</l:l>
+<l:l i="150">ợ</l:l>
+<l:l i="160">P</l:l>
+<l:l i="160">p</l:l>
+<l:l i="160">Ƥ</l:l>
+<l:l i="160">Æ¥</l:l>
+<l:l i="160">á¹”</l:l>
+<l:l i="160">ṕ</l:l>
+<l:l i="160">á¹–</l:l>
+<l:l i="160">á¹—</l:l>
+<l:l i="170">Q</l:l>
+<l:l i="170">q</l:l>
+<l:l i="170">Ê </l:l>
+<l:l i="180">R</l:l>
+<l:l i="180">r</l:l>
+<l:l i="180">Å”</l:l>
+<l:l i="180">Å•</l:l>
+<l:l i="180">Å–</l:l>
+<l:l i="180">Å—</l:l>
+<l:l i="180">Ř</l:l>
+<l:l i="180">Å™</l:l>
+<l:l i="180">È</l:l>
+<l:l i="180">È‘</l:l>
+<l:l i="180">È’</l:l>
+<l:l i="180">È“</l:l>
+<l:l i="180">ɼ</l:l>
+<l:l i="180">ɽ</l:l>
+<l:l i="180">ɾ</l:l>
+<l:l i="180">Ṙ</l:l>
+<l:l i="180">á¹™</l:l>
+<l:l i="180">Ṛ</l:l>
+<l:l i="180">á¹›</l:l>
+<l:l i="180">Ṝ</l:l>
+<l:l i="180">á¹</l:l>
+<l:l i="180">Ṟ</l:l>
+<l:l i="180">ṟ</l:l>
+<l:l i="190">S</l:l>
+<l:l i="190">s</l:l>
+<l:l i="190">Åš</l:l>
+<l:l i="190">Å›</l:l>
+<l:l i="190">Ŝ</l:l>
+<l:l i="190">Å</l:l>
+<l:l i="190">Åž</l:l>
+<l:l i="190">ÅŸ</l:l>
+<l:l i="190">Å </l:l>
+<l:l i="190">Å¡</l:l>
+<l:l i="190">Ș</l:l>
+<l:l i="190">È™</l:l>
+<l:l i="190">Ê‚</l:l>
+<l:l i="190">á¹ </l:l>
+<l:l i="190">ṡ</l:l>
+<l:l i="190">á¹¢</l:l>
+<l:l i="190">á¹£</l:l>
+<l:l i="190">Ṥ</l:l>
+<l:l i="190">á¹¥</l:l>
+<l:l i="190">Ṧ</l:l>
+<l:l i="190">ṧ</l:l>
+<l:l i="190">Ṩ</l:l>
+<l:l i="190">ṩ</l:l>
+<l:l i="200">T</l:l>
+<l:l i="200">t</l:l>
+<l:l i="200">Å¢</l:l>
+<l:l i="200">Å£</l:l>
+<l:l i="200">Ť</l:l>
+<l:l i="200">Å¥</l:l>
+<l:l i="200">Ŧ</l:l>
+<l:l i="200">ŧ</l:l>
+<l:l i="200">Æ«</l:l>
+<l:l i="200">Ƭ</l:l>
+<l:l i="200">Æ­</l:l>
+<l:l i="200">Æ®</l:l>
+<l:l i="200">ʈ</l:l>
+<l:l i="200">Èš</l:l>
+<l:l i="200">È›</l:l>
+<l:l i="200">ȶ</l:l>
+<l:l i="200">Ṫ</l:l>
+<l:l i="200">ṫ</l:l>
+<l:l i="200">Ṭ</l:l>
+<l:l i="200">á¹­</l:l>
+<l:l i="200">á¹®</l:l>
+<l:l i="200">ṯ</l:l>
+<l:l i="200">á¹°</l:l>
+<l:l i="200">á¹±</l:l>
+<l:l i="200">ẗ</l:l>
+<l:l i="210">U</l:l>
+<l:l i="210">u</l:l>
+<l:l i="210">Ù</l:l>
+<l:l i="210">ù</l:l>
+<l:l i="210">Ú</l:l>
+<l:l i="210">ú</l:l>
+<l:l i="210">Û</l:l>
+<l:l i="210">û</l:l>
+<l:l i="210">Ü</l:l>
+<l:l i="210">ü</l:l>
+<l:l i="210">Ũ</l:l>
+<l:l i="210">Å©</l:l>
+<l:l i="210">Ū</l:l>
+<l:l i="210">Å«</l:l>
+<l:l i="210">Ŭ</l:l>
+<l:l i="210">Å­</l:l>
+<l:l i="210">Å®</l:l>
+<l:l i="210">ů</l:l>
+<l:l i="210">Å°</l:l>
+<l:l i="210">ű</l:l>
+<l:l i="210">Ų</l:l>
+<l:l i="210">ų</l:l>
+<l:l i="210">Ư</l:l>
+<l:l i="210">Æ°</l:l>
+<l:l i="210">Ç“</l:l>
+<l:l i="210">Ç”</l:l>
+<l:l i="210">Ç•</l:l>
+<l:l i="210">Ç–</l:l>
+<l:l i="210">Ç—</l:l>
+<l:l i="210">ǘ</l:l>
+<l:l i="210">Ç™</l:l>
+<l:l i="210">Çš</l:l>
+<l:l i="210">Ç›</l:l>
+<l:l i="210">ǜ</l:l>
+<l:l i="210">È”</l:l>
+<l:l i="210">È•</l:l>
+<l:l i="210">È–</l:l>
+<l:l i="210">È—</l:l>
+<l:l i="210">á¹²</l:l>
+<l:l i="210">á¹³</l:l>
+<l:l i="210">á¹´</l:l>
+<l:l i="210">á¹µ</l:l>
+<l:l i="210">Ṷ</l:l>
+<l:l i="210">á¹·</l:l>
+<l:l i="210">Ṹ</l:l>
+<l:l i="210">á¹¹</l:l>
+<l:l i="210">Ṻ</l:l>
+<l:l i="210">á¹»</l:l>
+<l:l i="210">Ụ</l:l>
+<l:l i="210">ụ</l:l>
+<l:l i="210">Ủ</l:l>
+<l:l i="210">ủ</l:l>
+<l:l i="210">Ứ</l:l>
+<l:l i="210">ứ</l:l>
+<l:l i="210">Ừ</l:l>
+<l:l i="210">ừ</l:l>
+<l:l i="210">Ử</l:l>
+<l:l i="210">á»­</l:l>
+<l:l i="210">á»®</l:l>
+<l:l i="210">ữ</l:l>
+<l:l i="210">á»°</l:l>
+<l:l i="210">á»±</l:l>
+<l:l i="220">V</l:l>
+<l:l i="220">v</l:l>
+<l:l i="220">Ʋ</l:l>
+<l:l i="220">Ê‹</l:l>
+<l:l i="220">á¹¼</l:l>
+<l:l i="220">á¹½</l:l>
+<l:l i="220">á¹¾</l:l>
+<l:l i="220">ṿ</l:l>
+<l:l i="230">W</l:l>
+<l:l i="230">w</l:l>
+<l:l i="230">Å´</l:l>
+<l:l i="230">ŵ</l:l>
+<l:l i="230">Ẁ</l:l>
+<l:l i="230">áº</l:l>
+<l:l i="230">Ẃ</l:l>
+<l:l i="230">ẃ</l:l>
+<l:l i="230">Ẅ</l:l>
+<l:l i="230">ẅ</l:l>
+<l:l i="230">Ẇ</l:l>
+<l:l i="230">ẇ</l:l>
+<l:l i="230">Ẉ</l:l>
+<l:l i="230">ẉ</l:l>
+<l:l i="230">ẘ</l:l>
+<l:l i="240">X</l:l>
+<l:l i="240">x</l:l>
+<l:l i="240">Ẋ</l:l>
+<l:l i="240">ẋ</l:l>
+<l:l i="240">Ẍ</l:l>
+<l:l i="240">áº</l:l>
+<l:l i="250">Y</l:l>
+<l:l i="250">y</l:l>
+<l:l i="250">Ã</l:l>
+<l:l i="250">ý</l:l>
+<l:l i="250">ÿ</l:l>
+<l:l i="250">Ÿ</l:l>
+<l:l i="250">Ŷ</l:l>
+<l:l i="250">Å·</l:l>
+<l:l i="250">Ƴ</l:l>
+<l:l i="250">Æ´</l:l>
+<l:l i="250">Ȳ</l:l>
+<l:l i="250">ȳ</l:l>
+<l:l i="250">Ẏ</l:l>
+<l:l i="250">áº</l:l>
+<l:l i="250">ẙ</l:l>
+<l:l i="250">Ỳ</l:l>
+<l:l i="250">ỳ</l:l>
+<l:l i="250">á»´</l:l>
+<l:l i="250">ỵ</l:l>
+<l:l i="250">Ỷ</l:l>
+<l:l i="250">á»·</l:l>
+<l:l i="250">Ỹ</l:l>
+<l:l i="250">ỹ</l:l>
+<l:l i="260">Z</l:l>
+<l:l i="260">z</l:l>
+<l:l i="260">Ź</l:l>
+<l:l i="260">ź</l:l>
+<l:l i="260">Å»</l:l>
+<l:l i="260">ż</l:l>
+<l:l i="260">Ž</l:l>
+<l:l i="260">ž</l:l>
+<l:l i="260">Ƶ</l:l>
+<l:l i="260">ƶ</l:l>
+<l:l i="260">Ȥ</l:l>
+<l:l i="260">È¥</l:l>
+<l:l i="260">Ê</l:l>
+<l:l i="260">Ê‘</l:l>
+<l:l i="260">áº</l:l>
+<l:l i="260">ẑ</l:l>
+<l:l i="260">Ẓ</l:l>
+<l:l i="260">ẓ</l:l>
+<l:l i="260">Ẕ</l:l>
+<l:l i="260">ẕ</l:l>
+</l:letters>
+</l:l10n>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/ru.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/ru.xml
new file mode 100644
index 0000000..67d2c9a
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/ru.xml
@@ -0,0 +1,726 @@
+<?xml version="1.0" encoding="utf-8"?>
+<l:l10n xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0" language="ru" english-language-name="Russian">
+
+<!-- * This file is generated automatically. -->
+<!-- * To submit changes to this file upstream (to the DocBook Project) -->
+<!-- * do not submit an edited version of this file. Instead, submit an -->
+<!-- * edited version of the source file at the following location: -->
+<!-- * -->
+<!-- * https://docbook.svn.sourceforge.net/svnroot/docbook/trunk/gentext/locale/ru.xml -->
+<!-- * -->
+<!-- * E-mail the edited ru.xml source file to: -->
+<!-- * -->
+<!-- * docbook-developers@lists.sourceforge.net -->
+
+<!-- ******************************************************************** -->
+
+<!-- This file is part of the XSL DocBook Stylesheet distribution. -->
+<!-- See ../README or http://docbook.sf.net/release/xsl/current/ for -->
+<!-- copyright and other information. -->
+
+<!-- ******************************************************************** -->
+<!-- In these files, % with a letter is used for a placeholder: -->
+<!-- %t is the current element's title -->
+<!-- %s is the current element's subtitle (if applicable)-->
+<!-- %n is the current element's number label-->
+<!-- %p is the current element's page number (if applicable)-->
+<!-- ******************************************************************** -->
+
+
+<l:gentext key="Abstract" text="ÐннотациÑ"/>
+<l:gentext key="abstract" text="аннотациÑ"/>
+<l:gentext key="Acknowledgements" text="БлагодарноÑÑ‚ÑŒ"/>
+<l:gentext key="acknowledgements" text="благодарноÑÑ‚ÑŒ"/>
+<l:gentext key="Answer" text="Ответ:"/>
+<l:gentext key="answer" text="ответ:"/>
+<l:gentext key="Appendix" text="Приложение"/>
+<l:gentext key="appendix" text="приложение"/>
+<l:gentext key="Article" text="СтатьÑ"/>
+<l:gentext key="article" text="ÑтатьÑ"/>
+<l:gentext key="Author" text="Ðвтор"/>
+<l:gentext key="Bibliography" text="БиблиографиÑ"/>
+<l:gentext key="bibliography" text="библиографиÑ"/>
+<l:gentext key="Book" text="Книга"/>
+<l:gentext key="book" text="книга"/>
+<l:gentext key="CAUTION" text="Ð’ÐИМÐÐИЕ"/>
+<l:gentext key="Caution" text="Внимание"/>
+<l:gentext key="caution" text="внимание"/>
+<l:gentext key="Chapter" text="Глава"/>
+<l:gentext key="chapter" text="глава"/>
+<l:gentext key="Colophon" text="Издание"/>
+<l:gentext key="colophon" text="издание"/>
+<l:gentext key="Copyright" text="ÐвторÑкие права"/>
+<l:gentext key="copyright" text="авторÑкие права"/>
+<l:gentext key="Dedication" text="ПоÑвÑщаетÑÑ"/>
+<l:gentext key="dedication" text="поÑвÑщаетÑÑ"/>
+<l:gentext key="Edition" text="РедакциÑ"/>
+<l:gentext key="edition" text="редакциÑ"/>
+<l:gentext key="Editor" text="Редактор"/>
+<l:gentext key="Equation" text="Формула"/>
+<l:gentext key="equation" text="формула"/>
+<l:gentext key="Example" text="Пример"/>
+<l:gentext key="example" text="пример"/>
+<l:gentext key="Figure" text="РиÑунок"/>
+<l:gentext key="figure" text="риÑунок"/>
+<l:gentext key="Glossary" text="ГлоÑÑарий"/>
+<l:gentext key="glossary" text="глоÑÑарий"/>
+<l:gentext key="GlossSee" text="См."/>
+<l:gentext key="glosssee" text="Ñм."/>
+<l:gentext key="GlossSeeAlso" text="См. также"/>
+<l:gentext key="glossseealso" text="Ñм. также"/>
+<l:gentext key="IMPORTANT" text="Ð’ÐЖÐО"/>
+<l:gentext key="important" text="важно"/>
+<l:gentext key="Important" text="Важно"/>
+<l:gentext key="Index" text="Предметный указатель"/>
+<l:gentext key="index" text="Предметный указатель"/>
+<l:gentext key="ISBN" text="ISBN"/>
+<l:gentext key="isbn" text="ISBN"/>
+<l:gentext key="LegalNotice" text="ЮридичеÑкое уведомление"/>
+<l:gentext key="legalnotice" text="юридичеÑкое уведомление"/>
+<l:gentext key="MsgAud" text="ÐудиториÑ"/>
+<l:gentext key="msgaud" text="аудиториÑ"/>
+<l:gentext key="MsgLevel" text="Уровень"/>
+<l:gentext key="msglevel" text="уровень"/>
+<l:gentext key="MsgOrig" text="ИÑточник"/>
+<l:gentext key="msgorig" text="иÑточник"/>
+<l:gentext key="NOTE" text="ПРИМЕЧÐÐИЕ"/>
+<l:gentext key="Note" text="Примечание"/>
+<l:gentext key="note" text="примечание"/>
+<l:gentext key="Part" text="ЧаÑÑ‚ÑŒ"/>
+<l:gentext key="part" text="чаÑÑ‚ÑŒ"/>
+<l:gentext key="Preface" text="ПредиÑловие"/>
+<l:gentext key="preface" text="предиÑловие"/>
+<l:gentext key="Procedure" text="Процедура"/>
+<l:gentext key="procedure" text="процедура"/>
+<l:gentext key="ProductionSet" text="ПроизводÑтво"/>
+<l:gentext key="PubDate" text="Дата публикации"/>
+<l:gentext key="pubdate" text="дата публикации"/>
+<l:gentext key="Published" text="Опубликовано"/>
+<l:gentext key="published" text="опубликовано"/>
+<l:gentext key="Publisher" text="Издатель"/>
+<l:gentext key="Qandadiv" text="ВопроÑÑ‹ и ответы"/>
+<l:gentext key="qandadiv" text="вопроÑÑ‹ и ответы"/>
+<l:gentext key="QandASet" text="ЧаÑто задаваемые вопроÑÑ‹"/>
+<l:gentext key="Question" text="ВопроÑ:"/>
+<l:gentext key="question" text="вопроÑ:"/>
+<l:gentext key="RefEntry" text="Страница"/>
+<l:gentext key="refentry" text="Ñтраница"/>
+<l:gentext key="Reference" text="СÑылка"/>
+<l:gentext key="reference" text="ÑÑылка"/>
+<l:gentext key="References" text="СÑылки"/>
+<l:gentext key="RefName" text="ИмÑ"/>
+<l:gentext key="refname" text="имÑ"/>
+<l:gentext key="RefSection" text="Раздел"/>
+<l:gentext key="refsection" text="раздел"/>
+<l:gentext key="RefSynopsisDiv" text="СинопÑиÑ"/>
+<l:gentext key="refsynopsisdiv" text="ÑинопÑиÑ"/>
+<l:gentext key="RevHistory" text="ИÑÑ‚Ð¾Ñ€Ð¸Ñ Ð¿ÐµÑ€ÐµÐ¸Ð·Ð´Ð°Ð½Ð¸Ñ"/>
+<l:gentext key="revhistory" text="иÑÑ‚Ð¾Ñ€Ð¸Ñ Ð¿ÐµÑ€ÐµÐ¸Ð·Ð´Ð°Ð½Ð¸Ñ"/>
+<l:gentext key="revision" text="издание"/>
+<l:gentext key="Revision" text="Издание"/>
+<l:gentext key="sect1" text="Раздел"/>
+<l:gentext key="sect2" text="Раздел"/>
+<l:gentext key="sect3" text="Раздел"/>
+<l:gentext key="sect4" text="Раздел"/>
+<l:gentext key="sect5" text="Раздел"/>
+<l:gentext key="section" text="раздел"/>
+<l:gentext key="Section" text="Раздел"/>
+<l:gentext key="see" text="Ñм."/>
+<l:gentext key="See" text="См."/>
+<l:gentext key="seealso" text="Ñм. также"/>
+<l:gentext key="Seealso" text="См. также"/>
+<l:gentext key="SeeAlso" text="См. также"/>
+<l:gentext key="set" text="подборка"/>
+<l:gentext key="Set" text="Подборка"/>
+<l:gentext key="setindex" text="Ð¸Ð½Ð´ÐµÐºÑ Ð¿Ð¾Ð´Ð±Ð¾Ñ€ÐºÐ¸"/>
+<l:gentext key="SetIndex" text="Ð˜Ð½Ð´ÐµÐºÑ Ð¿Ð¾Ð´Ð±Ð¾Ñ€ÐºÐ¸"/>
+<l:gentext key="Sidebar" text="Боковое поле"/>
+<l:gentext key="sidebar" text="боковое поле"/>
+<l:gentext key="step" text="шаг"/>
+<l:gentext key="Step" text="Шаг"/>
+<l:gentext key="table" text="таблица"/>
+<l:gentext key="Table" text="Таблица"/>
+<l:gentext key="task" text="задача"/>
+<l:gentext key="Task" text="Задача"/>
+<l:gentext key="tip" text="ПодÑказка"/>
+<l:gentext key="TIP" text="ПОДСКÐЗКÐ"/>
+<l:gentext key="Tip" text="ПодÑказка"/>
+<l:gentext key="Warning" text="Предупреждение"/>
+<l:gentext key="warning" text="предупреждение"/>
+<l:gentext key="WARNING" text="ПРЕДУПРЕЖДЕÐИЕ"/>
+<l:gentext key="and" text=""/>
+<l:gentext key="by" text=""/>
+<l:gentext key="Edited" text="под редакцией"/>
+<l:gentext key="edited" text="Под редакцией"/>
+<l:gentext key="Editedby" text="Под редакцией"/>
+<l:gentext key="editedby" text="под редакцией"/>
+<l:gentext key="in" text="в"/>
+<l:gentext key="lastlistcomma" text=","/>
+<l:gentext key="listcomma" text=","/>
+<l:gentext key="notes" text="примечаниÑ"/>
+<l:gentext key="Notes" text="ПримечаниÑ"/>
+<l:gentext key="Pgs" text="ÑÑ‚Ñ€."/>
+<l:gentext key="pgs" text="Стр."/>
+<l:gentext key="Revisedby" text="Проверено: "/>
+<l:gentext key="revisedby" text="проверено: "/>
+<l:gentext key="TableNotes" text="ПримечаниÑ"/>
+<l:gentext key="tablenotes" text="примечаниÑ"/>
+<l:gentext key="TableofContents" text="Содержание"/>
+<l:gentext key="tableofcontents" text="Ñодержание"/>
+<l:gentext key="unexpectedelementname" text="unexpected element name"/>
+<l:gentext key="unsupported" text="unsupported"/>
+<l:gentext key="xrefto" text="xref to"/>
+<l:gentext key="Authors" text="Ðвторы"/>
+<l:gentext key="copyeditor" text="Редактор копии"/>
+<l:gentext key="graphicdesigner" text="ГрафичеÑкий дизайн"/>
+<l:gentext key="productioneditor" text="Главный редактор"/>
+<l:gentext key="technicaleditor" text="ТехничеÑкий редактор"/>
+<l:gentext key="translator" text="Перевод"/>
+<l:gentext key="listofequations" text="ÑпиÑок выражений"/>
+<l:gentext key="ListofEquations" text="СпиÑок выражений"/>
+<l:gentext key="ListofExamples" text="СпиÑок примеров"/>
+<l:gentext key="listofexamples" text="ÑпиÑок примеров"/>
+<l:gentext key="ListofFigures" text="СпиÑок иллюÑтраций"/>
+<l:gentext key="listoffigures" text="ÑпиÑок иллюÑтраций"/>
+<l:gentext key="ListofProcedures" text="СпиÑок процедур"/>
+<l:gentext key="listofprocedures" text="ÑпиÑок процедур"/>
+<l:gentext key="listoftables" text="ÑпиÑок таблиц"/>
+<l:gentext key="ListofTables" text="СпиÑок таблиц"/>
+<l:gentext key="ListofUnknown" text="СпиÑок других"/>
+<l:gentext key="listofunknown" text="ÑпиÑок других"/>
+<l:gentext key="nav-home" text="Ðачало"/>
+<l:gentext key="nav-next" text="След."/>
+<l:gentext key="nav-next-sibling" text="След. подраздел"/>
+<l:gentext key="nav-prev" text="Пред."/>
+<l:gentext key="nav-prev-sibling" text="Пред. подраздел"/>
+<l:gentext key="nav-up" text="Ðаверх"/>
+<l:gentext key="nav-toc" text="Содержание"/>
+<l:gentext key="Draft" text="Черновик"/>
+<l:gentext key="above" text="выше"/>
+<l:gentext key="below" text="ниже"/>
+<l:gentext key="sectioncalled" text="ÑекциÑ"/>
+<l:gentext key="index symbols" text="Символы"/>
+<l:gentext key="writing-mode" text="lr-tb"/>
+<l:gentext key="lowercase.alpha" text="абвгдеёжзийклмнопрÑтуфхцчшщъыьÑÑŽÑ"/>
+<l:gentext key="uppercase.alpha" text="ÐБВГДЕÐЖЗИЙКЛМÐОПРСТУФХЦЧШЩЪЫЬЭЮЯ"/>
+<l:gentext key="normalize.sort.input" text="AaÀàÃáÂâÃãÄäÅåĀÄĂ㥹ÇǎǞǟǠǡǺǻȀÈȂȃȦȧḀá¸áºšáº áº¡áº¢áº£áº¤áº¥áº¦áº§áº¨áº©áºªáº«áº¬áº­áº®áº¯áº°áº±áº²áº³áº´áºµáº¶áº·BbÆ€ÆɓƂƃḂḃḄḅḆḇCcÇçĆćĈĉĊċČÄƇƈɕḈḉDdÄŽÄÄđƊɗƋƌDžDzȡɖḊḋḌá¸á¸Žá¸á¸á¸‘ḒḓEeÈèÉéÊêËëĒēĔĕĖėĘęĚěȄȅȆȇȨȩḔḕḖḗḘḙḚḛḜá¸áº¸áº¹áººáº»áº¼áº½áº¾áº¿á»€á»á»‚ểỄễỆệFfƑƒḞḟGgÄœÄĞğĠġĢģƓɠǤǥǦǧǴǵḠḡHhĤĥĦħȞȟɦḢḣḤḥḦḧḨḩḪḫẖIiÌìÃíÎîÃïĨĩĪīĬĭĮįİƗɨÇÇȈȉȊȋḬḭḮḯỈỉỊịJjĴĵǰÊKkĶķƘƙǨǩḰḱḲḳḴḵLlĹĺĻļĽľĿŀÅłƚLjȴɫɬɭḶḷḸḹḺḻḼḽMmɱḾḿṀá¹á¹‚ṃNnÑñŃńŅņŇňÆɲƞȠNjǸǹȵɳṄṅṆṇṈṉṊṋOoÒòÓóÔôÕõÖöØøŌÅÅŽÅÅőƟƠơǑǒǪǫǬǭǾǿȌÈÈŽÈȪȫȬȭȮȯȰȱṌá¹á¹Žá¹á¹á¹‘ṒṓỌá»á»Žá»á»á»‘ỒồỔổỖỗỘộỚớỜá»á»žá»Ÿá» á»¡á»¢á»£PpƤƥṔṕṖṗQqÊ RrŔŕŖŗŘřÈȑȒȓɼɽɾṘṙṚṛṜá¹á¹žá¹ŸSsŚśŜÅŞşŠšȘșʂṠṡṢṣṤṥṦṧṨṩTtŢţŤťŦŧƫƬƭƮʈȚțȶṪṫṬṭṮṯṰṱẗUuÙùÚúÛûÜüŨũŪūŬŭŮůŰűŲųƯưǓǔǕǖǗǘǙǚǛǜȔȕȖȗṲṳṴṵṶṷṸṹṺṻỤụỦủỨứỪừỬửỮữỰựVvƲʋṼṽṾṿWwŴŵẀáºáº‚ẃẄẅẆẇẈẉẘXxẊẋẌáºYyÃýÿŸŶŷƳƴȲȳẎáºáº™á»²á»³á»´á»µá»¶á»·á»¸á»¹ZzŹźŻżŽžƵƶȤȥÊÊ‘áºáº‘ẒẓẔẕẕ" lang="en"/>
+<l:gentext key="normalize.sort.output" text="AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBCCCCCCCCCCCCCCCCCDDDDDDDDDDDDDDDDDDDDDDDDEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEFFFFFFGGGGGGGGGGGGGGGGGGGGHHHHHHHHHHHHHHHHHHHHIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIJJJJJJKKKKKKKKKKKKKKLLLLLLLLLLLLLLLLLLLLLLLLLLMMMMMMMMMNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOPPPPPPPPQQQRRRRRRRRRRRRRRRRRRRRRRRSSSSSSSSSSSSSSSSSSSSSSSTTTTTTTTTTTTTTTTTTTTTTTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUVVVVVVVVWWWWWWWWWWWWWWWXXXXXXYYYYYYYYYYYYYYYYYYYYYYYZZZZZZZZZZZZZZZZZZZZZ" lang="en"/>
+<l:dingbat key="startquote" text="«"/>
+<l:dingbat key="endquote" text="»"/>
+<l:dingbat key="nestedstartquote" text="„"/>
+<l:dingbat key="nestedendquote" text="“"/>
+<l:dingbat key="singlestartquote" text="‘" lang="en"/>
+<l:dingbat key="singleendquote" text="’" lang="en"/>
+<l:dingbat key="bullet" text="•"/>
+<l:gentext key="hyphenation-character" text="-" lang="en"/>
+<l:gentext key="hyphenation-push-character-count" text="2" lang="en"/>
+<l:gentext key="hyphenation-remain-character-count" text="2" lang="en"/>
+<l:context name="styles"><l:template name="person-name" text="first-last"/>
+</l:context>
+<l:context name="title"><l:template name="abstract" text="%t"/>
+<l:template name="acknowledgements" text="%t" lang="en"/>
+<l:template name="answer" text="%t"/>
+<l:template name="appendix" text="Приложение %n. %t"/>
+<l:template name="article" text="%t"/>
+<l:template name="authorblurb" text="%t"/>
+<l:template name="bibliodiv" text="%t"/>
+<l:template name="biblioentry" text="%t"/>
+<l:template name="bibliography" text="%t"/>
+<l:template name="bibliolist" text="%t" lang="en"/>
+<l:template name="bibliomixed" text="%t"/>
+<l:template name="bibliomset" text="%t"/>
+<l:template name="biblioset" text="%t"/>
+<l:template name="blockquote" text="%t"/>
+<l:template name="book" text="%t"/>
+<l:template name="calloutlist" text="%t"/>
+<l:template name="caution" text="%t"/>
+<l:template name="chapter" text="Глава %n. %t"/>
+<l:template name="colophon" text="%t"/>
+<l:template name="dedication" text="%t"/>
+<l:template name="equation" text="Формула %n. %t"/>
+<l:template name="example" text="Пример %n. %t"/>
+<l:template name="figure" text="РиÑунок %n. %t"/>
+<l:template name="foil" text="%t" lang="en"/>
+<l:template name="foilgroup" text="%t" lang="en"/>
+<l:template name="formalpara" text="%t"/>
+<l:template name="glossary" text="%t"/>
+<l:template name="glossdiv" text="%t"/>
+<l:template name="glosslist" text="%t" lang="en"/>
+<l:template name="glossentry" text="%t" lang="en"/>
+<l:template name="important" text="%t"/>
+<l:template name="index" text="%t"/>
+<l:template name="indexdiv" text="%t"/>
+<l:template name="itemizedlist" text="%t"/>
+<l:template name="legalnotice" text="%t"/>
+<l:template name="listitem" text=""/>
+<l:template name="lot" text="%t"/>
+<l:template name="msg" text="%t"/>
+<l:template name="msgexplan" text="%t"/>
+<l:template name="msgmain" text="%t"/>
+<l:template name="msgrel" text="%t"/>
+<l:template name="msgset" text="%t"/>
+<l:template name="msgsub" text="%t"/>
+<l:template name="note" text="%t"/>
+<l:template name="orderedlist" text="%t"/>
+<l:template name="part" text="ЧаÑÑ‚ÑŒ %n. %t"/>
+<l:template name="partintro" text="%t"/>
+<l:template name="preface" text="%t"/>
+<l:template name="procedure" text="%t"/>
+<l:template name="procedure.formal" text="Процедура %n. %t"/>
+<l:template name="productionset" text="%t"/>
+<l:template name="productionset.formal" text="ПроизводÑтво %n"/>
+<l:template name="qandadiv" text="%t"/>
+<l:template name="qandaentry" text="%t"/>
+<l:template name="qandaset" text="%t"/>
+<l:template name="question" text="%t"/>
+<l:template name="refentry" text="%t"/>
+<l:template name="reference" text="%t"/>
+<l:template name="refsection" text="%t"/>
+<l:template name="refsect1" text="%t"/>
+<l:template name="refsect2" text="%t"/>
+<l:template name="refsect3" text="%t"/>
+<l:template name="refsynopsisdiv" text="%t"/>
+<l:template name="refsynopsisdivinfo" text="%t"/>
+<l:template name="segmentedlist" text="%t"/>
+<l:template name="set" text="%t"/>
+<l:template name="setindex" text="%t"/>
+<l:template name="sidebar" text="%t"/>
+<l:template name="step" text="%t"/>
+<l:template name="table" text="Таблица %n. %t"/>
+<l:template name="task" text="%t" lang="en"/>
+<l:template name="tasksummary" text="%t" lang="en"/>
+<l:template name="taskprerequisites" text="%t" lang="en"/>
+<l:template name="taskrelated" text="%t" lang="en"/>
+<l:template name="tip" text="%t"/>
+<l:template name="toc" text="%t"/>
+<l:template name="variablelist" text="%t"/>
+<l:template name="varlistentry" text="" lang="en"/>
+<l:template name="warning" text="%t"/>
+</l:context>
+<l:context name="title-unnumbered"><l:template name="appendix" text="%t"/>
+<l:template name="article/appendix" text="%t" lang="en"/>
+<l:template name="bridgehead" text="%t"/>
+<l:template name="chapter" text="%t"/>
+<l:template name="sect1" text="%t"/>
+<l:template name="sect2" text="%t"/>
+<l:template name="sect3" text="%t"/>
+<l:template name="sect4" text="%t"/>
+<l:template name="sect5" text="%t"/>
+<l:template name="section" text="%t"/>
+<l:template name="simplesect" text="%t"/>
+<l:template name="part" text="%t" lang="en"/>
+</l:context>
+<l:context name="title-numbered"><l:template name="appendix" text="Приложение %n. %t"/>
+<l:template name="article/appendix" text="%n. %t" lang="en"/>
+<l:template name="bridgehead" text="%t"/>
+<l:template name="chapter" text="Глава %n. %t"/>
+<l:template name="part" text="ЧаÑть %n. %t"/>
+<l:template name="sect1" text="%n. %t"/>
+<l:template name="sect2" text="%n. %t"/>
+<l:template name="sect3" text="%n. %t"/>
+<l:template name="sect4" text="%n. %t"/>
+<l:template name="sect5" text="%n. %t"/>
+<l:template name="section" text="%n. %t"/>
+<l:template name="simplesect" text="%n. %t"/>
+</l:context>
+<l:context name="subtitle"><l:template name="appendix" text="%s"/>
+<l:template name="acknowledgements" text="%s" lang="en"/>
+<l:template name="article" text="%s"/>
+<l:template name="bibliodiv" text="%s"/>
+<l:template name="biblioentry" text="%s"/>
+<l:template name="bibliography" text="%s"/>
+<l:template name="bibliomixed" text="%s"/>
+<l:template name="bibliomset" text="%s"/>
+<l:template name="biblioset" text="%s"/>
+<l:template name="book" text="%s"/>
+<l:template name="chapter" text="%s"/>
+<l:template name="colophon" text="%s"/>
+<l:template name="dedication" text="%s"/>
+<l:template name="glossary" text="%s"/>
+<l:template name="glossdiv" text="%s"/>
+<l:template name="index" text="%s"/>
+<l:template name="indexdiv" text="%s"/>
+<l:template name="lot" text="%s"/>
+<l:template name="part" text="%s"/>
+<l:template name="partintro" text="%s"/>
+<l:template name="preface" text="%s"/>
+<l:template name="refentry" text="%s"/>
+<l:template name="reference" text="%s"/>
+<l:template name="refsection" text="%s"/>
+<l:template name="refsect1" text="%s"/>
+<l:template name="refsect2" text="%s"/>
+<l:template name="refsect3" text="%s"/>
+<l:template name="refsynopsisdiv" text="%s"/>
+<l:template name="sect1" text="%s"/>
+<l:template name="sect2" text="%s"/>
+<l:template name="sect3" text="%s"/>
+<l:template name="sect4" text="%s"/>
+<l:template name="sect5" text="%s"/>
+<l:template name="section" text="%s"/>
+<l:template name="set" text="%s"/>
+<l:template name="setindex" text="%s"/>
+<l:template name="sidebar" text="%s"/>
+<l:template name="simplesect" text="%s"/>
+<l:template name="toc" text="%s"/>
+</l:context>
+<l:context name="xref"><l:template name="abstract" text="%t"/>
+<l:template name="acknowledgements" text="%t" lang="en"/>
+<l:template name="answer" text="Ответ: %n"/>
+<l:template name="appendix" text="%t"/>
+<l:template name="article" text="%t"/>
+<l:template name="authorblurb" text="%t"/>
+<l:template name="bibliodiv" text="%t"/>
+<l:template name="bibliography" text="%t"/>
+<l:template name="bibliomset" text="%t"/>
+<l:template name="biblioset" text="%t"/>
+<l:template name="blockquote" text="%t"/>
+<l:template name="book" text="%t"/>
+<l:template name="calloutlist" text="%t"/>
+<l:template name="caution" text="%t"/>
+<l:template name="chapter" text="%t"/>
+<l:template name="colophon" text="%t"/>
+<l:template name="constraintdef" text="%t"/>
+<l:template name="dedication" text="%t"/>
+<l:template name="equation" text="%t"/>
+<l:template name="example" text="%t"/>
+<l:template name="figure" text="%t"/>
+<l:template name="foil" text="%t" lang="en"/>
+<l:template name="foilgroup" text="%t" lang="en"/>
+<l:template name="formalpara" text="%t"/>
+<l:template name="glossary" text="%t"/>
+<l:template name="glossdiv" text="%t"/>
+<l:template name="important" text="%t"/>
+<l:template name="index" text="%t"/>
+<l:template name="indexdiv" text="%t"/>
+<l:template name="itemizedlist" text="%t"/>
+<l:template name="legalnotice" text="%t"/>
+<l:template name="listitem" text="%n"/>
+<l:template name="lot" text="%t"/>
+<l:template name="msg" text="%t"/>
+<l:template name="msgexplan" text="%t"/>
+<l:template name="msgmain" text="%t"/>
+<l:template name="msgrel" text="%t"/>
+<l:template name="msgset" text="%t"/>
+<l:template name="msgsub" text="%t"/>
+<l:template name="note" text="%t"/>
+<l:template name="orderedlist" text="%t"/>
+<l:template name="part" text="%t"/>
+<l:template name="partintro" text="%t"/>
+<l:template name="preface" text="%t"/>
+<l:template name="procedure" text="%t"/>
+<l:template name="productionset" text="%t"/>
+<l:template name="qandadiv" text="%t"/>
+<l:template name="qandaentry" text="ВопроÑ: %n"/>
+<l:template name="qandaset" text="%t"/>
+<l:template name="question" text="ВопроÑ: %n"/>
+<l:template name="reference" text="%t"/>
+<l:template name="refsynopsisdiv" text="%t"/>
+<l:template name="segmentedlist" text="%t"/>
+<l:template name="set" text="%t"/>
+<l:template name="setindex" text="%t"/>
+<l:template name="sidebar" text="%t"/>
+<l:template name="table" text="%t"/>
+<l:template name="task" text="%t" lang="en"/>
+<l:template name="tip" text="%t"/>
+<l:template name="toc" text="%t"/>
+<l:template name="variablelist" text="%t"/>
+<l:template name="varlistentry" text="%n"/>
+<l:template name="warning" text="%t"/>
+<l:template name="olink.document.citation" text=" in %o" lang="en"/>
+<l:template name="olink.page.citation" text=" (page %p)" lang="en"/>
+<l:template name="page.citation" text=" [%p]"/>
+<l:template name="page" text="(page %p)" lang="en"/>
+<l:template name="docname" text=" in %o" lang="en"/>
+<l:template name="docnamelong" text=" in the document titled %o" lang="en"/>
+<l:template name="pageabbrev" text="(p. %p)" lang="en"/>
+<l:template name="Page" text="Page %p" lang="en"/>
+<l:template name="bridgehead" text="«%t»"/>
+<l:template name="refsection" text="«%t»"/>
+<l:template name="refsect1" text="«%t»"/>
+<l:template name="refsect2" text="«%t»"/>
+<l:template name="refsect3" text="«%t»"/>
+<l:template name="sect1" text="«%t»"/>
+<l:template name="sect2" text="«%t»"/>
+<l:template name="sect3" text="«%t»"/>
+<l:template name="sect4" text="«%t»"/>
+<l:template name="sect5" text="«%t»"/>
+<l:template name="section" text="«%t»"/>
+<l:template name="simplesect" text="«%t»"/>
+</l:context>
+<l:context name="xref-number"><l:template name="answer" text="Ответ: %n"/>
+<l:template name="appendix" text="Приложение %n"/>
+<l:template name="bridgehead" text="Раздел %n"/>
+<l:template name="chapter" text="Глава %n"/>
+<l:template name="equation" text="Формула %n"/>
+<l:template name="example" text="Пример %n"/>
+<l:template name="figure" text="РиÑунок %n"/>
+<l:template name="part" text="ЧаÑть %n"/>
+<l:template name="procedure" text="Процедура %n"/>
+<l:template name="productionset" text="ПроизводÑтво %n"/>
+<l:template name="qandadiv" text="ВопроÑÑ‹ и ответы %n"/>
+<l:template name="qandaentry" text="ВопроÑ: %n"/>
+<l:template name="question" text="ВопроÑ: %n"/>
+<l:template name="sect1" text="Раздел %n"/>
+<l:template name="sect2" text="Раздел %n"/>
+<l:template name="sect3" text="Раздел %n"/>
+<l:template name="sect4" text="Раздел %n"/>
+<l:template name="sect5" text="Раздел %n"/>
+<l:template name="section" text="Раздел %n"/>
+<l:template name="table" text="Таблица %n"/>
+</l:context>
+<l:context name="xref-number-and-title"><l:template name="appendix" text="Приложение %n, %t"/>
+<l:template name="bridgehead" text="Раздел %n, «%t»"/>
+<l:template name="chapter" text="Глава %n, %t"/>
+<l:template name="equation" text="Формула %n, «%t»"/>
+<l:template name="example" text="Пример %n, «%t»"/>
+<l:template name="figure" text="РиÑунок %n, «%t»"/>
+<l:template name="part" text="ЧаÑть %n, «%t»"/>
+<l:template name="procedure" text="Процедура %n, «%t»"/>
+<l:template name="productionset" text="ПроизводÑтво %n, «%t»"/>
+<l:template name="qandadiv" text="ВопроÑÑ‹ и ответы %n, «%t»"/>
+<l:template name="refsect1" text="ÑÐµÐºÑ†Ð¸Ñ Â«%t»"/>
+<l:template name="refsect2" text="ÑÐµÐºÑ†Ð¸Ñ Â«%t»"/>
+<l:template name="refsect3" text="ÑÐµÐºÑ†Ð¸Ñ Â«%t»"/>
+<l:template name="refsection" text="ÑÐµÐºÑ†Ð¸Ñ Â«%t»"/>
+<l:template name="sect1" text="Раздел %n, «%t»"/>
+<l:template name="sect2" text="Раздел %n, «%t»"/>
+<l:template name="sect3" text="Раздел %n, «%t»"/>
+<l:template name="sect4" text="Раздел %n, «%t»"/>
+<l:template name="sect5" text="Раздел %n, «%t»"/>
+<l:template name="section" text="Раздел %n, «%t»"/>
+<l:template name="simplesect" text="ÑÐµÐºÑ†Ð¸Ñ Â«%t»"/>
+<l:template name="table" text="Таблица %n, «%t»"/>
+</l:context>
+<l:context name="authorgroup"><l:template name="sep" text=", "/>
+<l:template name="sep2" text=" "/>
+<l:template name="seplast" text=", "/>
+</l:context>
+<l:context name="glossary"><l:template name="see" text="См. %t."/>
+<l:template name="seealso" text="См. также %t."/>
+<l:template name="seealso-separator" text=", "/>
+</l:context>
+<l:context name="msgset"><l:template name="MsgAud" text="ÐудиториÑ: "/>
+<l:template name="MsgLevel" text="Уровень: "/>
+<l:template name="MsgOrig" text="ИÑточник: "/>
+</l:context>
+<l:context name="datetime"><l:template name="format" text="m/d/Y"/>
+</l:context>
+<l:context name="termdef"><l:template name="prefix" text="[Определение: "/>
+<l:template name="suffix" text="]"/>
+</l:context>
+<l:context name="datetime-full"><l:template name="January" text="ÑнварÑ"/>
+<l:template name="February" text="февралÑ"/>
+<l:template name="March" text="марта"/>
+<l:template name="April" text="апрелÑ"/>
+<l:template name="May" text="маÑ"/>
+<l:template name="June" text="июнÑ"/>
+<l:template name="July" text="июлÑ"/>
+<l:template name="August" text="авгуÑта"/>
+<l:template name="September" text="ÑентÑбрÑ"/>
+<l:template name="October" text="октÑбрÑ"/>
+<l:template name="November" text="ноÑбрÑ"/>
+<l:template name="December" text="декабрÑ"/>
+<l:template name="Monday" text="понедельник"/>
+<l:template name="Tuesday" text="вторник"/>
+<l:template name="Wednesday" text="Ñреда"/>
+<l:template name="Thursday" text="четверг"/>
+<l:template name="Friday" text="пÑтница"/>
+<l:template name="Saturday" text="Ñуббота"/>
+<l:template name="Sunday" text="воÑкреÑенье"/>
+</l:context>
+<l:context name="datetime-abbrev"><l:template name="Jan" text="Янв"/>
+<l:template name="Feb" text="Фев"/>
+<l:template name="Mar" text="Мар"/>
+<l:template name="Apr" text="Ðпр"/>
+<l:template name="May" text="Май"/>
+<l:template name="Jun" text="Июн"/>
+<l:template name="Jul" text="Июл"/>
+<l:template name="Aug" text="Ðвг"/>
+<l:template name="Sep" text="Сен"/>
+<l:template name="Oct" text="Окт"/>
+<l:template name="Nov" text="ÐоÑ"/>
+<l:template name="Dec" text="Дек"/>
+<l:template name="Mon" text="Пнд"/>
+<l:template name="Tue" text="Ð’Ñ‚Ñ€"/>
+<l:template name="Wed" text="Срд"/>
+<l:template name="Thu" text="Чтв"/>
+<l:template name="Fri" text="Птн"/>
+<l:template name="Sat" text="Сбт"/>
+<l:template name="Sun" text="Ð’Ñк"/>
+</l:context>
+<l:context name="htmlhelp"><l:template name="langcode" text="0x0419 Russian"/>
+</l:context>
+<l:context name="index"><l:template name="term-separator" text=", " lang="en"/>
+<l:template name="number-separator" text=", " lang="en"/>
+<l:template name="range-separator" text="-" lang="en"/>
+</l:context>
+<l:context name="iso690"><l:template name="lastfirst.sep" text=", " lang="en"/>
+<l:template name="alt.person.two.sep" text=" – " lang="en"/>
+<l:template name="alt.person.last.sep" text=" – " lang="en"/>
+<l:template name="alt.person.more.sep" text=" – " lang="en"/>
+<l:template name="primary.editor" text=" (ed.)" lang="en"/>
+<l:template name="primary.many" text=", et al." lang="en"/>
+<l:template name="primary.sep" text=". " lang="en"/>
+<l:template name="submaintitle.sep" text=": " lang="en"/>
+<l:template name="title.sep" text=". " lang="en"/>
+<l:template name="othertitle.sep" text=", " lang="en"/>
+<l:template name="medium1" text=" [" lang="en"/>
+<l:template name="medium2" text="]" lang="en"/>
+<l:template name="secondary.person.sep" text="; " lang="en"/>
+<l:template name="secondary.sep" text=". " lang="en"/>
+<l:template name="respons.sep" text=". " lang="en"/>
+<l:template name="edition.sep" text=". " lang="en"/>
+<l:template name="edition.serial.sep" text=", " lang="en"/>
+<l:template name="issuing.range" text="-" lang="en"/>
+<l:template name="issuing.div" text=", " lang="en"/>
+<l:template name="issuing.sep" text=". " lang="en"/>
+<l:template name="partnr.sep" text=". " lang="en"/>
+<l:template name="placepubl.sep" text=": " lang="en"/>
+<l:template name="publyear.sep" text=", " lang="en"/>
+<l:template name="pubinfo.sep" text=". " lang="en"/>
+<l:template name="spec.pubinfo.sep" text=", " lang="en"/>
+<l:template name="upd.sep" text=", " lang="en"/>
+<l:template name="datecit1" text=" [cited " lang="en"/>
+<l:template name="datecit2" text="]" lang="en"/>
+<l:template name="extent.sep" text=". " lang="en"/>
+<l:template name="locs.sep" text=", " lang="en"/>
+<l:template name="location.sep" text=". " lang="en"/>
+<l:template name="serie.sep" text=". " lang="en"/>
+<l:template name="notice.sep" text=". " lang="en"/>
+<l:template name="access" text="Available " lang="en"/>
+<l:template name="acctoo" text="Also available " lang="en"/>
+<l:template name="onwww" text="from World Wide Web" lang="en"/>
+<l:template name="oninet" text="from Internet" lang="en"/>
+<l:template name="access.end" text=": " lang="en"/>
+<l:template name="link1" text="&lt;" lang="en"/>
+<l:template name="link2" text="&gt;" lang="en"/>
+<l:template name="access.sep" text=". " lang="en"/>
+<l:template name="isbn" text="ISBN " lang="en"/>
+<l:template name="issn" text="ISSN " lang="en"/>
+<l:template name="stdnum.sep" text=". " lang="en"/>
+<l:template name="patcountry.sep" text=". " lang="en"/>
+<l:template name="pattype.sep" text=", " lang="en"/>
+<l:template name="patnum.sep" text=". " lang="en"/>
+<l:template name="patdate.sep" text=". " lang="en"/>
+</l:context><l:letters><l:l i="-1"/>
+<l:l i="0"/>
+<l:l i="10">A</l:l>
+<l:l i="10">a</l:l>
+<l:l i="20">B</l:l>
+<l:l i="20">b</l:l>
+<l:l i="30">C</l:l>
+<l:l i="30">c</l:l>
+<l:l i="40">D</l:l>
+<l:l i="40">d</l:l>
+<l:l i="50">E</l:l>
+<l:l i="50">e</l:l>
+<l:l i="60">F</l:l>
+<l:l i="60">f</l:l>
+<l:l i="70">G</l:l>
+<l:l i="70">g</l:l>
+<l:l i="80">H</l:l>
+<l:l i="80">h</l:l>
+<l:l i="90">I</l:l>
+<l:l i="90">i</l:l>
+<l:l i="100">J</l:l>
+<l:l i="100">j</l:l>
+<l:l i="110">K</l:l>
+<l:l i="110">k</l:l>
+<l:l i="120">L</l:l>
+<l:l i="120">l</l:l>
+<l:l i="130">M</l:l>
+<l:l i="130">m</l:l>
+<l:l i="140">N</l:l>
+<l:l i="140">n</l:l>
+<l:l i="150">O</l:l>
+<l:l i="150">o</l:l>
+<l:l i="160">P</l:l>
+<l:l i="160">p</l:l>
+<l:l i="170">Q</l:l>
+<l:l i="170">q</l:l>
+<l:l i="180">R</l:l>
+<l:l i="180">r</l:l>
+<l:l i="190">S</l:l>
+<l:l i="190">s</l:l>
+<l:l i="200">T</l:l>
+<l:l i="200">t</l:l>
+<l:l i="210">U</l:l>
+<l:l i="210">u</l:l>
+<l:l i="220">V</l:l>
+<l:l i="220">v</l:l>
+<l:l i="230">W</l:l>
+<l:l i="230">w</l:l>
+<l:l i="240">X</l:l>
+<l:l i="240">x</l:l>
+<l:l i="250">Y</l:l>
+<l:l i="250">y</l:l>
+<l:l i="260">Z</l:l>
+<l:l i="260">z</l:l>
+<l:l i="270">Ð</l:l>
+<l:l i="270">а</l:l>
+<l:l i="280">Б</l:l>
+<l:l i="280">б</l:l>
+<l:l i="290">Ð’</l:l>
+<l:l i="290">в</l:l>
+<l:l i="300">Г</l:l>
+<l:l i="300">г</l:l>
+<l:l i="310">Д</l:l>
+<l:l i="310">д</l:l>
+<l:l i="320">Е</l:l>
+<l:l i="320">е</l:l>
+<l:l i="320">Ð</l:l>
+<l:l i="320">Ñ‘</l:l>
+<l:l i="330">Ж</l:l>
+<l:l i="330">ж</l:l>
+<l:l i="340">З</l:l>
+<l:l i="340">з</l:l>
+<l:l i="350">И</l:l>
+<l:l i="350">и</l:l>
+<l:l i="360">Й</l:l>
+<l:l i="360">й</l:l>
+<l:l i="370">К</l:l>
+<l:l i="370">к</l:l>
+<l:l i="380">Л</l:l>
+<l:l i="380">л</l:l>
+<l:l i="390">М</l:l>
+<l:l i="390">м</l:l>
+<l:l i="400">Ð</l:l>
+<l:l i="400">н</l:l>
+<l:l i="410">О</l:l>
+<l:l i="410">о</l:l>
+<l:l i="420">П</l:l>
+<l:l i="420">п</l:l>
+<l:l i="430">Р</l:l>
+<l:l i="430">Ñ€</l:l>
+<l:l i="440">С</l:l>
+<l:l i="440">Ñ</l:l>
+<l:l i="450">Т</l:l>
+<l:l i="450">Ñ‚</l:l>
+<l:l i="460">У</l:l>
+<l:l i="460">у</l:l>
+<l:l i="470">Ф</l:l>
+<l:l i="470">Ñ„</l:l>
+<l:l i="480">Ð¥</l:l>
+<l:l i="480">Ñ…</l:l>
+<l:l i="490">Ц</l:l>
+<l:l i="490">ц</l:l>
+<l:l i="500">Ч</l:l>
+<l:l i="500">ч</l:l>
+<l:l i="510">Ш</l:l>
+<l:l i="510">ш</l:l>
+<l:l i="520">Щ</l:l>
+<l:l i="520">щ</l:l>
+<l:l i="530">Ъ</l:l>
+<l:l i="530">ÑŠ</l:l>
+<l:l i="540">Ы</l:l>
+<l:l i="540">Ñ‹</l:l>
+<l:l i="550">Ь</l:l>
+<l:l i="550">ь</l:l>
+<l:l i="560">Э</l:l>
+<l:l i="560">Ñ</l:l>
+<l:l i="570">Ю</l:l>
+<l:l i="570">ÑŽ</l:l>
+<l:l i="580">Я</l:l>
+<l:l i="580">Ñ</l:l>
+</l:letters>
+</l:l10n>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/sk.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/sk.xml
new file mode 100644
index 0000000..09309b6
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/sk.xml
@@ -0,0 +1,1229 @@
+<?xml version="1.0" encoding="utf-8"?>
+<l:l10n xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0" language="sk" english-language-name="Slovak">
+
+<!-- * This file is generated automatically. -->
+<!-- * To submit changes to this file upstream (to the DocBook Project) -->
+<!-- * do not submit an edited version of this file. Instead, submit an -->
+<!-- * edited version of the source file at the following location: -->
+<!-- * -->
+<!-- * https://docbook.svn.sourceforge.net/svnroot/docbook/trunk/gentext/locale/sk.xml -->
+<!-- * -->
+<!-- * E-mail the edited sk.xml source file to: -->
+<!-- * -->
+<!-- * docbook-developers@lists.sourceforge.net -->
+
+<!-- ******************************************************************** -->
+
+<!-- This file is part of the XSL DocBook Stylesheet distribution. -->
+<!-- See ../README or http://docbook.sf.net/release/xsl/current/ for -->
+<!-- copyright and other information. -->
+
+<!-- ******************************************************************** -->
+<!-- In these files, % with a letter is used for a placeholder: -->
+<!-- %t is the current element's title -->
+<!-- %s is the current element's subtitle (if applicable)-->
+<!-- %n is the current element's number label-->
+<!-- %p is the current element's page number (if applicable)-->
+<!-- ******************************************************************** -->
+
+
+<l:gentext key="Abstract" text="Abstrakt"/>
+<l:gentext key="abstract" text="Abstrakt"/>
+<l:gentext key="Acknowledgements" text="Acknowledgements" lang="en"/>
+<l:gentext key="acknowledgements" text="Acknowledgements" lang="en"/>
+<l:gentext key="Answer" text="A:"/>
+<l:gentext key="answer" text="A:"/>
+<l:gentext key="Appendix" text="Dodatok"/>
+<l:gentext key="appendix" text="dodatok"/>
+<l:gentext key="Article" text="Článok"/>
+<l:gentext key="article" text="Článok"/>
+<l:gentext key="Author" text="Author" lang="en"/>
+<l:gentext key="Bibliography" text="Bibliografia"/>
+<l:gentext key="bibliography" text="Bibliografia"/>
+<l:gentext key="Book" text="Kniha"/>
+<l:gentext key="book" text="Kniha"/>
+<l:gentext key="CAUTION" text="VÃSTRAHA"/>
+<l:gentext key="Caution" text="Výstraha"/>
+<l:gentext key="caution" text="Výstraha"/>
+<l:gentext key="Chapter" text="Kapitola"/>
+<l:gentext key="chapter" text="kapitola"/>
+<l:gentext key="Colophon" text="Tiráž"/>
+<l:gentext key="colophon" text="Tiráž"/>
+<l:gentext key="Copyright" text="Copyright"/>
+<l:gentext key="copyright" text="Copyright"/>
+<l:gentext key="Dedication" text="Venovanie"/>
+<l:gentext key="dedication" text="Venovanie"/>
+<l:gentext key="Edition" text="Vydanie"/>
+<l:gentext key="edition" text="Vydanie"/>
+<l:gentext key="Editor" text="Editor" lang="en"/>
+<l:gentext key="Equation" text="Rovnica"/>
+<l:gentext key="equation" text="Rovnica"/>
+<l:gentext key="Example" text="Príklad"/>
+<l:gentext key="example" text="Príklad"/>
+<l:gentext key="Figure" text="Obrázok"/>
+<l:gentext key="figure" text="Obrázok"/>
+<l:gentext key="Glossary" text="Slovník"/>
+<l:gentext key="glossary" text="Slovník"/>
+<l:gentext key="GlossSee" text="Pozri"/>
+<l:gentext key="glosssee" text="Pozri"/>
+<l:gentext key="GlossSeeAlso" text="Pozri tiež"/>
+<l:gentext key="glossseealso" text="Pozri tiež"/>
+<l:gentext key="IMPORTANT" text="DÔLEŽITÉ"/>
+<l:gentext key="important" text="Dôležité"/>
+<l:gentext key="Important" text="Dôležité"/>
+<l:gentext key="Index" text="Zoznam"/>
+<l:gentext key="index" text="Zoznam"/>
+<l:gentext key="ISBN" text="ISBN"/>
+<l:gentext key="isbn" text="ISBN"/>
+<l:gentext key="LegalNotice" text="Právna poznámka"/>
+<l:gentext key="legalnotice" text="Právna poznámka"/>
+<l:gentext key="MsgAud" text="Publikum"/>
+<l:gentext key="msgaud" text="Publikum"/>
+<l:gentext key="MsgLevel" text="Úroveň"/>
+<l:gentext key="msglevel" text="Úroveň"/>
+<l:gentext key="MsgOrig" text="Pôvod"/>
+<l:gentext key="msgorig" text="Pôvod"/>
+<l:gentext key="NOTE" text="POZNÃMKA"/>
+<l:gentext key="Note" text="Poznámka"/>
+<l:gentext key="note" text="Poznámka"/>
+<l:gentext key="Part" text="Časť"/>
+<l:gentext key="part" text="Časť"/>
+<l:gentext key="Preface" text="Predslov"/>
+<l:gentext key="preface" text="Predslov"/>
+<l:gentext key="Procedure" text="Postup"/>
+<l:gentext key="procedure" text="Postup"/>
+<l:gentext key="ProductionSet" text="Produkcia"/>
+<l:gentext key="PubDate" text="Publication Date" lang="en"/>
+<l:gentext key="pubdate" text="Publication date" lang="en"/>
+<l:gentext key="Published" text="Vydané"/>
+<l:gentext key="published" text="Vydané"/>
+<l:gentext key="Publisher" text="Publisher" lang="en"/>
+<l:gentext key="Qandadiv" text="Q &amp; A"/>
+<l:gentext key="qandadiv" text="Q &amp; A"/>
+<l:gentext key="QandASet" text="Frequently Asked Questions" lang="en"/>
+<l:gentext key="Question" text="Q:"/>
+<l:gentext key="question" text="Q:"/>
+<l:gentext key="RefEntry" text=""/>
+<l:gentext key="refentry" text=""/>
+<l:gentext key="Reference" text="Odkaz"/>
+<l:gentext key="reference" text="Odkaz"/>
+<l:gentext key="References" text="References" lang="en"/>
+<l:gentext key="RefName" text="Meno"/>
+<l:gentext key="refname" text="Meno"/>
+<l:gentext key="RefSection" text=""/>
+<l:gentext key="refsection" text=""/>
+<l:gentext key="RefSynopsisDiv" text="Prehľad"/>
+<l:gentext key="refsynopsisdiv" text="Prehľad"/>
+<l:gentext key="RevHistory" text="Prehľad revízií"/>
+<l:gentext key="revhistory" text="Prehľad revízií"/>
+<l:gentext key="revision" text="Revízia"/>
+<l:gentext key="Revision" text="Revízia"/>
+<l:gentext key="sect1" text="Oddiel"/>
+<l:gentext key="sect2" text="Oddiel"/>
+<l:gentext key="sect3" text="Oddiel"/>
+<l:gentext key="sect4" text="Oddiel"/>
+<l:gentext key="sect5" text="Oddiel"/>
+<l:gentext key="section" text="oddiel"/>
+<l:gentext key="Section" text="Oddiel"/>
+<l:gentext key="see" text="Pozri"/>
+<l:gentext key="See" text="Pozri"/>
+<l:gentext key="seealso" text="Pozri tiež"/>
+<l:gentext key="Seealso" text="Pozri tiež"/>
+<l:gentext key="SeeAlso" text="Pozri tiež"/>
+<l:gentext key="set" text="Nastaviť"/>
+<l:gentext key="Set" text="Nastaviť"/>
+<l:gentext key="setindex" text="nastaviť index"/>
+<l:gentext key="SetIndex" text="Nastaviť index"/>
+<l:gentext key="Sidebar" text="Marginália"/>
+<l:gentext key="sidebar" text="marginália"/>
+<l:gentext key="step" text="krok"/>
+<l:gentext key="Step" text="Krok"/>
+<l:gentext key="table" text="Tabuľka"/>
+<l:gentext key="Table" text="Tabuľka"/>
+<l:gentext key="task" text="Task" lang="en"/>
+<l:gentext key="Task" text="Task" lang="en"/>
+<l:gentext key="tip" text="Tip"/>
+<l:gentext key="TIP" text="TIP"/>
+<l:gentext key="Tip" text="Tip"/>
+<l:gentext key="Warning" text="Varovanie"/>
+<l:gentext key="warning" text="Varovanie"/>
+<l:gentext key="WARNING" text="VAROVANIE"/>
+<l:gentext key="and" text="a"/>
+<l:gentext key="by" text=""/>
+<l:gentext key="Edited" text="Vydané"/>
+<l:gentext key="edited" text="Vydané"/>
+<l:gentext key="Editedby" text="Zostavil: "/>
+<l:gentext key="editedby" text="Zostavil: "/>
+<l:gentext key="in" text="v"/>
+<l:gentext key="lastlistcomma" text=","/>
+<l:gentext key="listcomma" text=","/>
+<l:gentext key="notes" text="Poznámky"/>
+<l:gentext key="Notes" text="Poznámky"/>
+<l:gentext key="Pgs" text="Str."/>
+<l:gentext key="pgs" text="Str."/>
+<l:gentext key="Revisedby" text="Revidoval: "/>
+<l:gentext key="revisedby" text="Revidoval: "/>
+<l:gentext key="TableNotes" text="Poznámky"/>
+<l:gentext key="tablenotes" text="Poznámky"/>
+<l:gentext key="TableofContents" text="Obsah"/>
+<l:gentext key="tableofcontents" text="Obsah"/>
+<l:gentext key="unexpectedelementname" text="NeoÄakávané meno prvku"/>
+<l:gentext key="unsupported" text="nepodporovaný"/>
+<l:gentext key="xrefto" text="xref k"/>
+<l:gentext key="Authors" text="Authors" lang="en"/>
+<l:gentext key="copyeditor" text="Copy Editor" lang="en"/>
+<l:gentext key="graphicdesigner" text="Graphic Designer" lang="en"/>
+<l:gentext key="productioneditor" text="Production Editor" lang="en"/>
+<l:gentext key="technicaleditor" text="Technical Editor" lang="en"/>
+<l:gentext key="translator" text="Translator" lang="en"/>
+<l:gentext key="listofequations" text="Zoznam rovníc"/>
+<l:gentext key="ListofEquations" text="Zoznam rovníc"/>
+<l:gentext key="ListofExamples" text="Zoznam príkladov"/>
+<l:gentext key="listofexamples" text="Zoznam príkladov"/>
+<l:gentext key="ListofFigures" text="Zoznam obrázkov"/>
+<l:gentext key="listoffigures" text="Zoznam obrázkov"/>
+<l:gentext key="ListofProcedures" text="List of Procedures" lang="en"/>
+<l:gentext key="listofprocedures" text="List of Procedures" lang="en"/>
+<l:gentext key="listoftables" text="Zoznam tabuliek"/>
+<l:gentext key="ListofTables" text="Zoznam tabuliek"/>
+<l:gentext key="ListofUnknown" text="Zoznam neznámeho"/>
+<l:gentext key="listofunknown" text="Zoznam neznámeho"/>
+<l:gentext key="nav-home" text="Domov"/>
+<l:gentext key="nav-next" text="Nasledujúci"/>
+<l:gentext key="nav-next-sibling" text="Rýchlo dopredu"/>
+<l:gentext key="nav-prev" text="Predchádzajúci"/>
+<l:gentext key="nav-prev-sibling" text="Rýchlo nazpät"/>
+<l:gentext key="nav-up" text="Hore"/>
+<l:gentext key="nav-toc" text="ToC" lang="en"/>
+<l:gentext key="Draft" text="Koncept"/>
+<l:gentext key="above" text="nad"/>
+<l:gentext key="below" text="pod"/>
+<l:gentext key="sectioncalled" text="oddiel nazvaný"/>
+<l:gentext key="index symbols" text="Symboly"/>
+<l:gentext key="writing-mode" text="lr-tb"/>
+<l:gentext key="lowercase.alpha" text="aáäbcÄdÄeéfghiíjklĺľmnňoóôpqrÅ•sÅ¡tÅ¥uúvwxyýzž"/>
+<l:gentext key="uppercase.alpha" text="AÃÄBCÄŒDÄŽEÉFGHIÃJKLĹĽMNŇOÓÔPQRÅ”SÅ TŤUÚVWXYÃZŽ"/>
+<l:gentext key="normalize.sort.input" text="AaÀàÃáÂâÃãÄäÅåĀÄĂ㥹ÇǎǞǟǠǡǺǻȀÈȂȃȦȧḀá¸áºšáº áº¡áº¢áº£áº¤áº¥áº¦áº§áº¨áº©áºªáº«áº¬áº­áº®áº¯áº°áº±áº²áº³áº´áºµáº¶áº·BbÆ€ÆɓƂƃḂḃḄḅḆḇCcÇçĆćĈĉĊċČÄƇƈɕḈḉDdÄŽÄÄđƊɗƋƌDžDzȡɖḊḋḌá¸á¸Žá¸á¸á¸‘ḒḓEeÈèÉéÊêËëĒēĔĕĖėĘęĚěȄȅȆȇȨȩḔḕḖḗḘḙḚḛḜá¸áº¸áº¹áººáº»áº¼áº½áº¾áº¿á»€á»á»‚ểỄễỆệFfƑƒḞḟGgÄœÄĞğĠġĢģƓɠǤǥǦǧǴǵḠḡHhĤĥĦħȞȟɦḢḣḤḥḦḧḨḩḪḫẖIiÌìÃíÎîÃïĨĩĪīĬĭĮįİƗɨÇÇȈȉȊȋḬḭḮḯỈỉỊịJjĴĵǰÊKkĶķƘƙǨǩḰḱḲḳḴḵLlĹĺĻļĽľĿŀÅłƚLjȴɫɬɭḶḷḸḹḺḻḼḽMmɱḾḿṀá¹á¹‚ṃNnÑñŃńŅņŇňÆɲƞȠNjǸǹȵɳṄṅṆṇṈṉṊṋOoÒòÓóÔôÕõÖöØøŌÅÅŽÅÅőƟƠơǑǒǪǫǬǭǾǿȌÈÈŽÈȪȫȬȭȮȯȰȱṌá¹á¹Žá¹á¹á¹‘ṒṓỌá»á»Žá»á»á»‘ỒồỔổỖỗỘộỚớỜá»á»žá»Ÿá» á»¡á»¢á»£PpƤƥṔṕṖṗQqÊ RrŔŕŖŗŘřÈȑȒȓɼɽɾṘṙṚṛṜá¹á¹žá¹ŸSsŚśŜÅŞşŠšȘșʂṠṡṢṣṤṥṦṧṨṩTtŢţŤťŦŧƫƬƭƮʈȚțȶṪṫṬṭṮṯṰṱẗUuÙùÚúÛûÜüŨũŪūŬŭŮůŰűŲųƯưǓǔǕǖǗǘǙǚǛǜȔȕȖȗṲṳṴṵṶṷṸṹṺṻỤụỦủỨứỪừỬửỮữỰựVvƲʋṼṽṾṿWwŴŵẀáºáº‚ẃẄẅẆẇẈẉẘXxẊẋẌáºYyÃýÿŸŶŷƳƴȲȳẎáºáº™á»²á»³á»´á»µá»¶á»·á»¸á»¹ZzŹźŻżŽžƵƶȤȥÊÊ‘áºáº‘ẒẓẔẕẕ" lang="en"/>
+<l:gentext key="normalize.sort.output" text="AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBCCCCCCCCCCCCCCCCCDDDDDDDDDDDDDDDDDDDDDDDDEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEFFFFFFGGGGGGGGGGGGGGGGGGGGHHHHHHHHHHHHHHHHHHHHIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIJJJJJJKKKKKKKKKKKKKKLLLLLLLLLLLLLLLLLLLLLLLLLLMMMMMMMMMNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOPPPPPPPPQQQRRRRRRRRRRRRRRRRRRRRRRRSSSSSSSSSSSSSSSSSSSSSSSTTTTTTTTTTTTTTTTTTTTTTTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUVVVVVVVVWWWWWWWWWWWWWWWXXXXXXYYYYYYYYYYYYYYYYYYYYYYYZZZZZZZZZZZZZZZZZZZZZ" lang="en"/>
+<l:dingbat key="startquote" text="“"/>
+<l:dingbat key="endquote" text="â€"/>
+<l:dingbat key="nestedstartquote" text="‘"/>
+<l:dingbat key="nestedendquote" text="’"/>
+<l:dingbat key="singlestartquote" text="‘" lang="en"/>
+<l:dingbat key="singleendquote" text="’" lang="en"/>
+<l:dingbat key="bullet" text="•"/>
+<l:gentext key="hyphenation-character" text="-" lang="en"/>
+<l:gentext key="hyphenation-push-character-count" text="2" lang="en"/>
+<l:gentext key="hyphenation-remain-character-count" text="2" lang="en"/>
+<l:context name="styles"><l:template name="person-name" text="first-last"/>
+</l:context>
+<l:context name="title"><l:template name="abstract" text="%t"/>
+<l:template name="acknowledgements" text="%t" lang="en"/>
+<l:template name="answer" text="%t"/>
+<l:template name="appendix" text="Dodatok %n. %t"/>
+<l:template name="article" text="%t"/>
+<l:template name="authorblurb" text="%t"/>
+<l:template name="bibliodiv" text="%t"/>
+<l:template name="biblioentry" text="%t"/>
+<l:template name="bibliography" text="%t"/>
+<l:template name="bibliolist" text="%t" lang="en"/>
+<l:template name="bibliomixed" text="%t"/>
+<l:template name="bibliomset" text="%t"/>
+<l:template name="biblioset" text="%t"/>
+<l:template name="blockquote" text="%t"/>
+<l:template name="book" text="%t"/>
+<l:template name="calloutlist" text="%t"/>
+<l:template name="caution" text="%t"/>
+<l:template name="chapter" text="Kapitola %n. %t"/>
+<l:template name="colophon" text="%t"/>
+<l:template name="dedication" text="%t"/>
+<l:template name="equation" text="Rovnica %n. %t"/>
+<l:template name="example" text="Príklad %n. %t"/>
+<l:template name="figure" text="Obrázok %n. %t"/>
+<l:template name="foil" text="%t" lang="en"/>
+<l:template name="foilgroup" text="%t" lang="en"/>
+<l:template name="formalpara" text="%t"/>
+<l:template name="glossary" text="%t"/>
+<l:template name="glossdiv" text="%t"/>
+<l:template name="glosslist" text="%t" lang="en"/>
+<l:template name="glossentry" text="%t" lang="en"/>
+<l:template name="important" text="%t"/>
+<l:template name="index" text="%t"/>
+<l:template name="indexdiv" text="%t"/>
+<l:template name="itemizedlist" text="%t"/>
+<l:template name="legalnotice" text="%t"/>
+<l:template name="listitem" text=""/>
+<l:template name="lot" text="%t"/>
+<l:template name="msg" text="%t"/>
+<l:template name="msgexplan" text="%t"/>
+<l:template name="msgmain" text="%t"/>
+<l:template name="msgrel" text="%t"/>
+<l:template name="msgset" text="%t"/>
+<l:template name="msgsub" text="%t"/>
+<l:template name="note" text="%t"/>
+<l:template name="orderedlist" text="%t"/>
+<l:template name="part" text="Časť %n. %t"/>
+<l:template name="partintro" text="%t"/>
+<l:template name="preface" text="%t"/>
+<l:template name="procedure" text="%t"/>
+<l:template name="procedure.formal" text="Postup %n. %t"/>
+<l:template name="productionset" text="%t"/>
+<l:template name="productionset.formal" text="Produkcia %n"/>
+<l:template name="qandadiv" text="%t"/>
+<l:template name="qandaentry" text="%t"/>
+<l:template name="qandaset" text="%t"/>
+<l:template name="question" text="%t"/>
+<l:template name="refentry" text="%t"/>
+<l:template name="reference" text="%t"/>
+<l:template name="refsection" text="%t"/>
+<l:template name="refsect1" text="%t"/>
+<l:template name="refsect2" text="%t"/>
+<l:template name="refsect3" text="%t"/>
+<l:template name="refsynopsisdiv" text="%t"/>
+<l:template name="refsynopsisdivinfo" text="%t"/>
+<l:template name="segmentedlist" text="%t"/>
+<l:template name="set" text="%t"/>
+<l:template name="setindex" text="%t"/>
+<l:template name="sidebar" text="%t"/>
+<l:template name="step" text="%t"/>
+<l:template name="table" text="Tabuľka %n. %t"/>
+<l:template name="task" text="%t" lang="en"/>
+<l:template name="tasksummary" text="%t" lang="en"/>
+<l:template name="taskprerequisites" text="%t" lang="en"/>
+<l:template name="taskrelated" text="%t" lang="en"/>
+<l:template name="tip" text="%t"/>
+<l:template name="toc" text="%t"/>
+<l:template name="variablelist" text="%t"/>
+<l:template name="varlistentry" text="" lang="en"/>
+<l:template name="warning" text="%t"/>
+</l:context>
+<l:context name="title-unnumbered"><l:template name="appendix" text="%t"/>
+<l:template name="article/appendix" text="%t" lang="en"/>
+<l:template name="bridgehead" text="%t"/>
+<l:template name="chapter" text="%t"/>
+<l:template name="sect1" text="%t"/>
+<l:template name="sect2" text="%t"/>
+<l:template name="sect3" text="%t"/>
+<l:template name="sect4" text="%t"/>
+<l:template name="sect5" text="%t"/>
+<l:template name="section" text="%t"/>
+<l:template name="simplesect" text="%t"/>
+<l:template name="part" text="%t" lang="en"/>
+</l:context>
+<l:context name="title-numbered"><l:template name="appendix" text="Dodatok %n. %t"/>
+<l:template name="article/appendix" text="%n. %t" lang="en"/>
+<l:template name="bridgehead" text="%t"/>
+<l:template name="chapter" text="Kapitola %n. %t"/>
+<l:template name="part" text="Časť %n. %t"/>
+<l:template name="sect1" text="%n. %t"/>
+<l:template name="sect2" text="%n. %t"/>
+<l:template name="sect3" text="%n. %t"/>
+<l:template name="sect4" text="%n. %t"/>
+<l:template name="sect5" text="%n. %t"/>
+<l:template name="section" text="%n. %t"/>
+<l:template name="simplesect" text="%n. %t"/>
+</l:context>
+<l:context name="subtitle"><l:template name="appendix" text="%s"/>
+<l:template name="acknowledgements" text="%s" lang="en"/>
+<l:template name="article" text="%s"/>
+<l:template name="bibliodiv" text="%s"/>
+<l:template name="biblioentry" text="%s"/>
+<l:template name="bibliography" text="%s"/>
+<l:template name="bibliomixed" text="%s"/>
+<l:template name="bibliomset" text="%s"/>
+<l:template name="biblioset" text="%s"/>
+<l:template name="book" text="%s"/>
+<l:template name="chapter" text="%s"/>
+<l:template name="colophon" text="%s"/>
+<l:template name="dedication" text="%s"/>
+<l:template name="glossary" text="%s"/>
+<l:template name="glossdiv" text="%s"/>
+<l:template name="index" text="%s"/>
+<l:template name="indexdiv" text="%s"/>
+<l:template name="lot" text="%s"/>
+<l:template name="part" text="%s"/>
+<l:template name="partintro" text="%s"/>
+<l:template name="preface" text="%s"/>
+<l:template name="refentry" text="%s"/>
+<l:template name="reference" text="%s"/>
+<l:template name="refsection" text="%s"/>
+<l:template name="refsect1" text="%s"/>
+<l:template name="refsect2" text="%s"/>
+<l:template name="refsect3" text="%s"/>
+<l:template name="refsynopsisdiv" text="%s"/>
+<l:template name="sect1" text="%s"/>
+<l:template name="sect2" text="%s"/>
+<l:template name="sect3" text="%s"/>
+<l:template name="sect4" text="%s"/>
+<l:template name="sect5" text="%s"/>
+<l:template name="section" text="%s"/>
+<l:template name="set" text="%s"/>
+<l:template name="setindex" text="%s"/>
+<l:template name="sidebar" text="%s"/>
+<l:template name="simplesect" text="%s"/>
+<l:template name="toc" text="%s"/>
+</l:context>
+<l:context name="xref"><l:template name="abstract" text="%t"/>
+<l:template name="acknowledgements" text="%t" lang="en"/>
+<l:template name="answer" text="A: %n"/>
+<l:template name="appendix" text="%t"/>
+<l:template name="article" text="%t"/>
+<l:template name="authorblurb" text="%t"/>
+<l:template name="bibliodiv" text="%t"/>
+<l:template name="bibliography" text="%t"/>
+<l:template name="bibliomset" text="%t"/>
+<l:template name="biblioset" text="%t"/>
+<l:template name="blockquote" text="%t"/>
+<l:template name="book" text="%t"/>
+<l:template name="calloutlist" text="%t"/>
+<l:template name="caution" text="%t"/>
+<l:template name="chapter" text="%t"/>
+<l:template name="colophon" text="%t"/>
+<l:template name="constraintdef" text="%t"/>
+<l:template name="dedication" text="%t"/>
+<l:template name="equation" text="%t"/>
+<l:template name="example" text="%t"/>
+<l:template name="figure" text="%t"/>
+<l:template name="foil" text="%t" lang="en"/>
+<l:template name="foilgroup" text="%t" lang="en"/>
+<l:template name="formalpara" text="%t"/>
+<l:template name="glossary" text="%t"/>
+<l:template name="glossdiv" text="%t"/>
+<l:template name="important" text="%t"/>
+<l:template name="index" text="%t"/>
+<l:template name="indexdiv" text="%t"/>
+<l:template name="itemizedlist" text="%t"/>
+<l:template name="legalnotice" text="%t"/>
+<l:template name="listitem" text="%n"/>
+<l:template name="lot" text="%t"/>
+<l:template name="msg" text="%t"/>
+<l:template name="msgexplan" text="%t"/>
+<l:template name="msgmain" text="%t"/>
+<l:template name="msgrel" text="%t"/>
+<l:template name="msgset" text="%t"/>
+<l:template name="msgsub" text="%t"/>
+<l:template name="note" text="%t"/>
+<l:template name="orderedlist" text="%t"/>
+<l:template name="part" text="%t"/>
+<l:template name="partintro" text="%t"/>
+<l:template name="preface" text="%t"/>
+<l:template name="procedure" text="%t"/>
+<l:template name="productionset" text="%t"/>
+<l:template name="qandadiv" text="%t"/>
+<l:template name="qandaentry" text="Q: %n"/>
+<l:template name="qandaset" text="%t"/>
+<l:template name="question" text="Q: %n"/>
+<l:template name="reference" text="%t"/>
+<l:template name="refsynopsisdiv" text="%t"/>
+<l:template name="segmentedlist" text="%t"/>
+<l:template name="set" text="%t"/>
+<l:template name="setindex" text="%t"/>
+<l:template name="sidebar" text="%t"/>
+<l:template name="table" text="%t"/>
+<l:template name="task" text="%t" lang="en"/>
+<l:template name="tip" text="%t"/>
+<l:template name="toc" text="%t"/>
+<l:template name="variablelist" text="%t"/>
+<l:template name="varlistentry" text="%n"/>
+<l:template name="warning" text="%t"/>
+<l:template name="olink.document.citation" text=" in %o" lang="en"/>
+<l:template name="olink.page.citation" text=" (page %p)" lang="en"/>
+<l:template name="page.citation" text=" [%p]"/>
+<l:template name="page" text="(page %p)" lang="en"/>
+<l:template name="docname" text=" in %o" lang="en"/>
+<l:template name="docnamelong" text=" in the document titled %o" lang="en"/>
+<l:template name="pageabbrev" text="(p. %p)" lang="en"/>
+<l:template name="Page" text="Page %p" lang="en"/>
+<l:template name="bridgehead" text="“%tâ€"/>
+<l:template name="refsection" text="“%tâ€"/>
+<l:template name="refsect1" text="“%tâ€"/>
+<l:template name="refsect2" text="“%tâ€"/>
+<l:template name="refsect3" text="“%tâ€"/>
+<l:template name="sect1" text="“%tâ€"/>
+<l:template name="sect2" text="“%tâ€"/>
+<l:template name="sect3" text="“%tâ€"/>
+<l:template name="sect4" text="“%tâ€"/>
+<l:template name="sect5" text="“%tâ€"/>
+<l:template name="section" text="“%tâ€"/>
+<l:template name="simplesect" text="“%tâ€"/>
+</l:context>
+<l:context name="xref-number"><l:template name="answer" text="A: %n"/>
+<l:template name="appendix" text="Dodatok %n"/>
+<l:template name="bridgehead" text="Oddiel %n"/>
+<l:template name="chapter" text="Kapitola %n"/>
+<l:template name="equation" text="Rovnica %n"/>
+<l:template name="example" text="Príklad %n"/>
+<l:template name="figure" text="Obrázok %n"/>
+<l:template name="part" text="Časť %n"/>
+<l:template name="procedure" text="Postup %n"/>
+<l:template name="productionset" text="Produkcia %n"/>
+<l:template name="qandadiv" text="Q &amp; A %n"/>
+<l:template name="qandaentry" text="Q: %n"/>
+<l:template name="question" text="Q: %n"/>
+<l:template name="sect1" text="Oddiel %n"/>
+<l:template name="sect2" text="Oddiel %n"/>
+<l:template name="sect3" text="Oddiel %n"/>
+<l:template name="sect4" text="Oddiel %n"/>
+<l:template name="sect5" text="Oddiel %n"/>
+<l:template name="section" text="Oddiel %n"/>
+<l:template name="table" text="Tabuľka %n"/>
+</l:context>
+<l:context name="xref-number-and-title"><l:template name="appendix" text="Dodatok %n, %t"/>
+<l:template name="bridgehead" text="Oddiel %n, “%tâ€"/>
+<l:template name="chapter" text="Kapitola %n, %t"/>
+<l:template name="equation" text="Rovnica %n, “%tâ€"/>
+<l:template name="example" text="Príklad %n, “%tâ€"/>
+<l:template name="figure" text="Obrázok %n, “%tâ€"/>
+<l:template name="part" text="ÄŒasť %n, “%tâ€"/>
+<l:template name="procedure" text="Postup %n, “%tâ€"/>
+<l:template name="productionset" text="Produkcia %n, “%tâ€"/>
+<l:template name="qandadiv" text="Q &amp; A %n, “%tâ€"/>
+<l:template name="refsect1" text="oddiel nazvaný “%tâ€"/>
+<l:template name="refsect2" text="oddiel nazvaný “%tâ€"/>
+<l:template name="refsect3" text="oddiel nazvaný “%tâ€"/>
+<l:template name="refsection" text="oddiel nazvaný “%tâ€"/>
+<l:template name="sect1" text="Oddiel %n, “%tâ€"/>
+<l:template name="sect2" text="Oddiel %n, “%tâ€"/>
+<l:template name="sect3" text="Oddiel %n, “%tâ€"/>
+<l:template name="sect4" text="Oddiel %n, “%tâ€"/>
+<l:template name="sect5" text="Oddiel %n, “%tâ€"/>
+<l:template name="section" text="Oddiel %n, “%tâ€"/>
+<l:template name="simplesect" text="oddiel nazvaný “%tâ€"/>
+<l:template name="table" text="Tabuľka %n, “%tâ€"/>
+</l:context>
+<l:context name="authorgroup"><l:template name="sep" text=", "/>
+<l:template name="sep2" text=" a "/>
+<l:template name="seplast" text=", a "/>
+</l:context>
+<l:context name="glossary"><l:template name="see" text="Pozri %t."/>
+<l:template name="seealso" text="Pozri tiež %t."/>
+<l:template name="seealso-separator" text=", "/>
+</l:context>
+<l:context name="msgset"><l:template name="MsgAud" text="Publikum: "/>
+<l:template name="MsgLevel" text="Úroveň: "/>
+<l:template name="MsgOrig" text="Pôvod: "/>
+</l:context>
+<l:context name="datetime"><l:template name="format" text="d. B Y"/>
+</l:context>
+<l:context name="termdef"><l:template name="prefix" text="[Definition: " lang="en"/>
+<l:template name="suffix" text="]" lang="en"/>
+</l:context>
+<l:context name="datetime-full"><l:template name="January" text="januára"/>
+<l:template name="February" text="februára"/>
+<l:template name="March" text="marca"/>
+<l:template name="April" text="apríla"/>
+<l:template name="May" text="mája"/>
+<l:template name="June" text="júna"/>
+<l:template name="July" text="júla"/>
+<l:template name="August" text="augusta"/>
+<l:template name="September" text="septembra"/>
+<l:template name="October" text="októbra"/>
+<l:template name="November" text="novembra"/>
+<l:template name="December" text="decembra"/>
+<l:template name="Monday" text="pondelok"/>
+<l:template name="Tuesday" text="utorok"/>
+<l:template name="Wednesday" text="streda"/>
+<l:template name="Thursday" text="Å¡tvrtok"/>
+<l:template name="Friday" text="piatok"/>
+<l:template name="Saturday" text="sobota"/>
+<l:template name="Sunday" text="nedeľa"/>
+</l:context>
+<l:context name="datetime-abbrev"><l:template name="Jan" text="jan"/>
+<l:template name="Feb" text="feb"/>
+<l:template name="Mar" text="mar"/>
+<l:template name="Apr" text="apr"/>
+<l:template name="May" text="máj"/>
+<l:template name="Jun" text="jún"/>
+<l:template name="Jul" text="júl"/>
+<l:template name="Aug" text="aug"/>
+<l:template name="Sep" text="sep"/>
+<l:template name="Oct" text="okt"/>
+<l:template name="Nov" text="nov"/>
+<l:template name="Dec" text="dec"/>
+<l:template name="Mon" text="po"/>
+<l:template name="Tue" text="ut"/>
+<l:template name="Wed" text="st"/>
+<l:template name="Thu" text="Å¡t"/>
+<l:template name="Fri" text="pi"/>
+<l:template name="Sat" text="so"/>
+<l:template name="Sun" text="ne"/>
+</l:context>
+<l:context name="htmlhelp"><l:template name="langcode" text="0x041b Slovak"/>
+</l:context>
+<l:context name="index"><l:template name="term-separator" text=", " lang="en"/>
+<l:template name="number-separator" text=", " lang="en"/>
+<l:template name="range-separator" text="-" lang="en"/>
+</l:context>
+<l:context name="iso690"><l:template name="lastfirst.sep" text=", " lang="en"/>
+<l:template name="alt.person.two.sep" text=" – " lang="en"/>
+<l:template name="alt.person.last.sep" text=" – " lang="en"/>
+<l:template name="alt.person.more.sep" text=" – " lang="en"/>
+<l:template name="primary.editor" text=" (ed.)" lang="en"/>
+<l:template name="primary.many" text=", et al." lang="en"/>
+<l:template name="primary.sep" text=". " lang="en"/>
+<l:template name="submaintitle.sep" text=": " lang="en"/>
+<l:template name="title.sep" text=". " lang="en"/>
+<l:template name="othertitle.sep" text=", " lang="en"/>
+<l:template name="medium1" text=" [" lang="en"/>
+<l:template name="medium2" text="]" lang="en"/>
+<l:template name="secondary.person.sep" text="; " lang="en"/>
+<l:template name="secondary.sep" text=". " lang="en"/>
+<l:template name="respons.sep" text=". " lang="en"/>
+<l:template name="edition.sep" text=". " lang="en"/>
+<l:template name="edition.serial.sep" text=", " lang="en"/>
+<l:template name="issuing.range" text="-" lang="en"/>
+<l:template name="issuing.div" text=", " lang="en"/>
+<l:template name="issuing.sep" text=". " lang="en"/>
+<l:template name="partnr.sep" text=". " lang="en"/>
+<l:template name="placepubl.sep" text=": " lang="en"/>
+<l:template name="publyear.sep" text=", " lang="en"/>
+<l:template name="pubinfo.sep" text=". " lang="en"/>
+<l:template name="spec.pubinfo.sep" text=", " lang="en"/>
+<l:template name="upd.sep" text=", " lang="en"/>
+<l:template name="datecit1" text=" [cited " lang="en"/>
+<l:template name="datecit2" text="]" lang="en"/>
+<l:template name="extent.sep" text=". " lang="en"/>
+<l:template name="locs.sep" text=", " lang="en"/>
+<l:template name="location.sep" text=". " lang="en"/>
+<l:template name="serie.sep" text=". " lang="en"/>
+<l:template name="notice.sep" text=". " lang="en"/>
+<l:template name="access" text="Available " lang="en"/>
+<l:template name="acctoo" text="Also available " lang="en"/>
+<l:template name="onwww" text="from World Wide Web" lang="en"/>
+<l:template name="oninet" text="from Internet" lang="en"/>
+<l:template name="access.end" text=": " lang="en"/>
+<l:template name="link1" text="&lt;" lang="en"/>
+<l:template name="link2" text="&gt;" lang="en"/>
+<l:template name="access.sep" text=". " lang="en"/>
+<l:template name="isbn" text="ISBN " lang="en"/>
+<l:template name="issn" text="ISSN " lang="en"/>
+<l:template name="stdnum.sep" text=". " lang="en"/>
+<l:template name="patcountry.sep" text=". " lang="en"/>
+<l:template name="pattype.sep" text=", " lang="en"/>
+<l:template name="patnum.sep" text=". " lang="en"/>
+<l:template name="patdate.sep" text=". " lang="en"/>
+</l:context><l:letters lang="en"><l:l i="-1"/>
+<l:l i="0">Symbols</l:l>
+<l:l i="10">A</l:l>
+<l:l i="10">a</l:l>
+<l:l i="10">À</l:l>
+<l:l i="10">à</l:l>
+<l:l i="10">Ã</l:l>
+<l:l i="10">á</l:l>
+<l:l i="10">Â</l:l>
+<l:l i="10">â</l:l>
+<l:l i="10">Ã</l:l>
+<l:l i="10">ã</l:l>
+<l:l i="10">Ä</l:l>
+<l:l i="10">ä</l:l>
+<l:l i="10">Ã…</l:l>
+<l:l i="10">Ã¥</l:l>
+<l:l i="10">Ä€</l:l>
+<l:l i="10">Ä</l:l>
+<l:l i="10">Ä‚</l:l>
+<l:l i="10">ă</l:l>
+<l:l i="10">Ä„</l:l>
+<l:l i="10">Ä…</l:l>
+<l:l i="10">Ç</l:l>
+<l:l i="10">ÇŽ</l:l>
+<l:l i="10">Çž</l:l>
+<l:l i="10">ÇŸ</l:l>
+<l:l i="10">Ç </l:l>
+<l:l i="10">Ç¡</l:l>
+<l:l i="10">Ǻ</l:l>
+<l:l i="10">Ç»</l:l>
+<l:l i="10">È€</l:l>
+<l:l i="10">È</l:l>
+<l:l i="10">È‚</l:l>
+<l:l i="10">ȃ</l:l>
+<l:l i="10">Ȧ</l:l>
+<l:l i="10">ȧ</l:l>
+<l:l i="10">Ḁ</l:l>
+<l:l i="10">á¸</l:l>
+<l:l i="10">ẚ</l:l>
+<l:l i="10">Ạ</l:l>
+<l:l i="10">ạ</l:l>
+<l:l i="10">Ả</l:l>
+<l:l i="10">ả</l:l>
+<l:l i="10">Ấ</l:l>
+<l:l i="10">ấ</l:l>
+<l:l i="10">Ầ</l:l>
+<l:l i="10">ầ</l:l>
+<l:l i="10">Ẩ</l:l>
+<l:l i="10">ẩ</l:l>
+<l:l i="10">Ẫ</l:l>
+<l:l i="10">ẫ</l:l>
+<l:l i="10">Ậ</l:l>
+<l:l i="10">ậ</l:l>
+<l:l i="10">Ắ</l:l>
+<l:l i="10">ắ</l:l>
+<l:l i="10">Ằ</l:l>
+<l:l i="10">ằ</l:l>
+<l:l i="10">Ẳ</l:l>
+<l:l i="10">ẳ</l:l>
+<l:l i="10">Ẵ</l:l>
+<l:l i="10">ẵ</l:l>
+<l:l i="10">Ặ</l:l>
+<l:l i="10">ặ</l:l>
+<l:l i="20">B</l:l>
+<l:l i="20">b</l:l>
+<l:l i="20">Æ€</l:l>
+<l:l i="20">Æ</l:l>
+<l:l i="20">É“</l:l>
+<l:l i="20">Æ‚</l:l>
+<l:l i="20">ƃ</l:l>
+<l:l i="20">Ḃ</l:l>
+<l:l i="20">ḃ</l:l>
+<l:l i="20">Ḅ</l:l>
+<l:l i="20">ḅ</l:l>
+<l:l i="20">Ḇ</l:l>
+<l:l i="20">ḇ</l:l>
+<l:l i="30">C</l:l>
+<l:l i="30">c</l:l>
+<l:l i="30">Ç</l:l>
+<l:l i="30">ç</l:l>
+<l:l i="30">Ć</l:l>
+<l:l i="30">ć</l:l>
+<l:l i="30">Ĉ</l:l>
+<l:l i="30">ĉ</l:l>
+<l:l i="30">ÄŠ</l:l>
+<l:l i="30">Ä‹</l:l>
+<l:l i="30">Č</l:l>
+<l:l i="30">Ä</l:l>
+<l:l i="30">Ƈ</l:l>
+<l:l i="30">ƈ</l:l>
+<l:l i="30">É•</l:l>
+<l:l i="30">Ḉ</l:l>
+<l:l i="30">ḉ</l:l>
+<l:l i="40">D</l:l>
+<l:l i="40">d</l:l>
+<l:l i="40">ÄŽ</l:l>
+<l:l i="40">Ä</l:l>
+<l:l i="40">Ä</l:l>
+<l:l i="40">Ä‘</l:l>
+<l:l i="40">ÆŠ</l:l>
+<l:l i="40">É—</l:l>
+<l:l i="40">Æ‹</l:l>
+<l:l i="40">ƌ</l:l>
+<l:l i="40">Ç…</l:l>
+<l:l i="40">Dz</l:l>
+<l:l i="40">È¡</l:l>
+<l:l i="40">É–</l:l>
+<l:l i="40">Ḋ</l:l>
+<l:l i="40">ḋ</l:l>
+<l:l i="40">Ḍ</l:l>
+<l:l i="40">á¸</l:l>
+<l:l i="40">Ḏ</l:l>
+<l:l i="40">á¸</l:l>
+<l:l i="40">á¸</l:l>
+<l:l i="40">ḑ</l:l>
+<l:l i="40">Ḓ</l:l>
+<l:l i="40">ḓ</l:l>
+<l:l i="50">E</l:l>
+<l:l i="50">e</l:l>
+<l:l i="50">È</l:l>
+<l:l i="50">è</l:l>
+<l:l i="50">É</l:l>
+<l:l i="50">é</l:l>
+<l:l i="50">Ê</l:l>
+<l:l i="50">ê</l:l>
+<l:l i="50">Ë</l:l>
+<l:l i="50">ë</l:l>
+<l:l i="50">Ä’</l:l>
+<l:l i="50">Ä“</l:l>
+<l:l i="50">Ä”</l:l>
+<l:l i="50">Ä•</l:l>
+<l:l i="50">Ä–</l:l>
+<l:l i="50">Ä—</l:l>
+<l:l i="50">Ę</l:l>
+<l:l i="50">Ä™</l:l>
+<l:l i="50">Äš</l:l>
+<l:l i="50">Ä›</l:l>
+<l:l i="50">È„</l:l>
+<l:l i="50">È…</l:l>
+<l:l i="50">Ȇ</l:l>
+<l:l i="50">ȇ</l:l>
+<l:l i="50">Ȩ</l:l>
+<l:l i="50">È©</l:l>
+<l:l i="50">Ḕ</l:l>
+<l:l i="50">ḕ</l:l>
+<l:l i="50">Ḗ</l:l>
+<l:l i="50">ḗ</l:l>
+<l:l i="50">Ḙ</l:l>
+<l:l i="50">ḙ</l:l>
+<l:l i="50">Ḛ</l:l>
+<l:l i="50">ḛ</l:l>
+<l:l i="50">Ḝ</l:l>
+<l:l i="50">á¸</l:l>
+<l:l i="50">Ẹ</l:l>
+<l:l i="50">ẹ</l:l>
+<l:l i="50">Ẻ</l:l>
+<l:l i="50">ẻ</l:l>
+<l:l i="50">Ẽ</l:l>
+<l:l i="50">ẽ</l:l>
+<l:l i="50">Ế</l:l>
+<l:l i="50">ế</l:l>
+<l:l i="50">Ề</l:l>
+<l:l i="50">á»</l:l>
+<l:l i="50">Ể</l:l>
+<l:l i="50">ể</l:l>
+<l:l i="50">Ễ</l:l>
+<l:l i="50">á»…</l:l>
+<l:l i="50">Ệ</l:l>
+<l:l i="50">ệ</l:l>
+<l:l i="60">F</l:l>
+<l:l i="60">f</l:l>
+<l:l i="60">Æ‘</l:l>
+<l:l i="60">Æ’</l:l>
+<l:l i="60">Ḟ</l:l>
+<l:l i="60">ḟ</l:l>
+<l:l i="70">G</l:l>
+<l:l i="70">g</l:l>
+<l:l i="70">Ĝ</l:l>
+<l:l i="70">Ä</l:l>
+<l:l i="70">Äž</l:l>
+<l:l i="70">ÄŸ</l:l>
+<l:l i="70">Ä </l:l>
+<l:l i="70">Ä¡</l:l>
+<l:l i="70">Ä¢</l:l>
+<l:l i="70">Ä£</l:l>
+<l:l i="70">Æ“</l:l>
+<l:l i="70">É </l:l>
+<l:l i="70">Ǥ</l:l>
+<l:l i="70">Ç¥</l:l>
+<l:l i="70">Ǧ</l:l>
+<l:l i="70">ǧ</l:l>
+<l:l i="70">Ç´</l:l>
+<l:l i="70">ǵ</l:l>
+<l:l i="70">Ḡ</l:l>
+<l:l i="70">ḡ</l:l>
+<l:l i="80">H</l:l>
+<l:l i="80">h</l:l>
+<l:l i="80">Ĥ</l:l>
+<l:l i="80">Ä¥</l:l>
+<l:l i="80">Ħ</l:l>
+<l:l i="80">ħ</l:l>
+<l:l i="80">Èž</l:l>
+<l:l i="80">ÈŸ</l:l>
+<l:l i="80">ɦ</l:l>
+<l:l i="80">Ḣ</l:l>
+<l:l i="80">ḣ</l:l>
+<l:l i="80">Ḥ</l:l>
+<l:l i="80">ḥ</l:l>
+<l:l i="80">Ḧ</l:l>
+<l:l i="80">ḧ</l:l>
+<l:l i="80">Ḩ</l:l>
+<l:l i="80">ḩ</l:l>
+<l:l i="80">Ḫ</l:l>
+<l:l i="80">ḫ</l:l>
+<l:l i="80">ẖ</l:l>
+<l:l i="90">I</l:l>
+<l:l i="90">i</l:l>
+<l:l i="90">Ì</l:l>
+<l:l i="90">ì</l:l>
+<l:l i="90">Ã</l:l>
+<l:l i="90">í</l:l>
+<l:l i="90">ÃŽ</l:l>
+<l:l i="90">î</l:l>
+<l:l i="90">Ã</l:l>
+<l:l i="90">ï</l:l>
+<l:l i="90">Ĩ</l:l>
+<l:l i="90">Ä©</l:l>
+<l:l i="90">Ī</l:l>
+<l:l i="90">Ä«</l:l>
+<l:l i="90">Ĭ</l:l>
+<l:l i="90">Ä­</l:l>
+<l:l i="90">Ä®</l:l>
+<l:l i="90">į</l:l>
+<l:l i="90">Ä°</l:l>
+<l:l i="90">Æ—</l:l>
+<l:l i="90">ɨ</l:l>
+<l:l i="90">Ç</l:l>
+<l:l i="90">Ç</l:l>
+<l:l i="90">Ȉ</l:l>
+<l:l i="90">ȉ</l:l>
+<l:l i="90">ÈŠ</l:l>
+<l:l i="90">È‹</l:l>
+<l:l i="90">Ḭ</l:l>
+<l:l i="90">ḭ</l:l>
+<l:l i="90">Ḯ</l:l>
+<l:l i="90">ḯ</l:l>
+<l:l i="90">Ỉ</l:l>
+<l:l i="90">ỉ</l:l>
+<l:l i="90">Ị</l:l>
+<l:l i="90">ị</l:l>
+<l:l i="100">J</l:l>
+<l:l i="100">j</l:l>
+<l:l i="100">Ä´</l:l>
+<l:l i="100">ĵ</l:l>
+<l:l i="100">Ç°</l:l>
+<l:l i="100">Ê</l:l>
+<l:l i="110">K</l:l>
+<l:l i="110">k</l:l>
+<l:l i="110">Ķ</l:l>
+<l:l i="110">Ä·</l:l>
+<l:l i="110">Ƙ</l:l>
+<l:l i="110">Æ™</l:l>
+<l:l i="110">Ǩ</l:l>
+<l:l i="110">Ç©</l:l>
+<l:l i="110">Ḱ</l:l>
+<l:l i="110">ḱ</l:l>
+<l:l i="110">Ḳ</l:l>
+<l:l i="110">ḳ</l:l>
+<l:l i="110">Ḵ</l:l>
+<l:l i="110">ḵ</l:l>
+<l:l i="120">L</l:l>
+<l:l i="120">l</l:l>
+<l:l i="120">Ĺ</l:l>
+<l:l i="120">ĺ</l:l>
+<l:l i="120">Ä»</l:l>
+<l:l i="120">ļ</l:l>
+<l:l i="120">Ľ</l:l>
+<l:l i="120">ľ</l:l>
+<l:l i="120">Ä¿</l:l>
+<l:l i="120">Å€</l:l>
+<l:l i="120">Å</l:l>
+<l:l i="120">Å‚</l:l>
+<l:l i="120">Æš</l:l>
+<l:l i="120">Lj</l:l>
+<l:l i="120">È´</l:l>
+<l:l i="120">É«</l:l>
+<l:l i="120">ɬ</l:l>
+<l:l i="120">É­</l:l>
+<l:l i="120">Ḷ</l:l>
+<l:l i="120">ḷ</l:l>
+<l:l i="120">Ḹ</l:l>
+<l:l i="120">ḹ</l:l>
+<l:l i="120">Ḻ</l:l>
+<l:l i="120">ḻ</l:l>
+<l:l i="120">Ḽ</l:l>
+<l:l i="120">ḽ</l:l>
+<l:l i="130">M</l:l>
+<l:l i="130">m</l:l>
+<l:l i="130">ɱ</l:l>
+<l:l i="130">Ḿ</l:l>
+<l:l i="130">ḿ</l:l>
+<l:l i="130">á¹€</l:l>
+<l:l i="130">á¹</l:l>
+<l:l i="130">Ṃ</l:l>
+<l:l i="130">ṃ</l:l>
+<l:l i="140">N</l:l>
+<l:l i="140">n</l:l>
+<l:l i="140">Ñ</l:l>
+<l:l i="140">ñ</l:l>
+<l:l i="140">Ń</l:l>
+<l:l i="140">Å„</l:l>
+<l:l i="140">Å…</l:l>
+<l:l i="140">ņ</l:l>
+<l:l i="140">Ň</l:l>
+<l:l i="140">ň</l:l>
+<l:l i="140">Æ</l:l>
+<l:l i="140">ɲ</l:l>
+<l:l i="140">Æž</l:l>
+<l:l i="140">È </l:l>
+<l:l i="140">Ç‹</l:l>
+<l:l i="140">Ǹ</l:l>
+<l:l i="140">ǹ</l:l>
+<l:l i="140">ȵ</l:l>
+<l:l i="140">ɳ</l:l>
+<l:l i="140">Ṅ</l:l>
+<l:l i="140">á¹…</l:l>
+<l:l i="140">Ṇ</l:l>
+<l:l i="140">ṇ</l:l>
+<l:l i="140">Ṉ</l:l>
+<l:l i="140">ṉ</l:l>
+<l:l i="140">Ṋ</l:l>
+<l:l i="140">ṋ</l:l>
+<l:l i="150">O</l:l>
+<l:l i="150">o</l:l>
+<l:l i="150">Ã’</l:l>
+<l:l i="150">ò</l:l>
+<l:l i="150">Ó</l:l>
+<l:l i="150">ó</l:l>
+<l:l i="150">Ô</l:l>
+<l:l i="150">ô</l:l>
+<l:l i="150">Õ</l:l>
+<l:l i="150">õ</l:l>
+<l:l i="150">Ö</l:l>
+<l:l i="150">ö</l:l>
+<l:l i="150">Ø</l:l>
+<l:l i="150">ø</l:l>
+<l:l i="150">Ō</l:l>
+<l:l i="150">Å</l:l>
+<l:l i="150">ÅŽ</l:l>
+<l:l i="150">Å</l:l>
+<l:l i="150">Å</l:l>
+<l:l i="150">Å‘</l:l>
+<l:l i="150">ÆŸ</l:l>
+<l:l i="150">Æ </l:l>
+<l:l i="150">Æ¡</l:l>
+<l:l i="150">Ç‘</l:l>
+<l:l i="150">Ç’</l:l>
+<l:l i="150">Ǫ</l:l>
+<l:l i="150">Ç«</l:l>
+<l:l i="150">Ǭ</l:l>
+<l:l i="150">Ç­</l:l>
+<l:l i="150">Ǿ</l:l>
+<l:l i="150">Ç¿</l:l>
+<l:l i="150">Ȍ</l:l>
+<l:l i="150">È</l:l>
+<l:l i="150">ÈŽ</l:l>
+<l:l i="150">È</l:l>
+<l:l i="150">Ȫ</l:l>
+<l:l i="150">È«</l:l>
+<l:l i="150">Ȭ</l:l>
+<l:l i="150">È­</l:l>
+<l:l i="150">È®</l:l>
+<l:l i="150">ȯ</l:l>
+<l:l i="150">È°</l:l>
+<l:l i="150">ȱ</l:l>
+<l:l i="150">Ṍ</l:l>
+<l:l i="150">á¹</l:l>
+<l:l i="150">Ṏ</l:l>
+<l:l i="150">á¹</l:l>
+<l:l i="150">á¹</l:l>
+<l:l i="150">ṑ</l:l>
+<l:l i="150">á¹’</l:l>
+<l:l i="150">ṓ</l:l>
+<l:l i="150">Ọ</l:l>
+<l:l i="150">á»</l:l>
+<l:l i="150">Ỏ</l:l>
+<l:l i="150">á»</l:l>
+<l:l i="150">á»</l:l>
+<l:l i="150">ố</l:l>
+<l:l i="150">á»’</l:l>
+<l:l i="150">ồ</l:l>
+<l:l i="150">á»”</l:l>
+<l:l i="150">ổ</l:l>
+<l:l i="150">á»–</l:l>
+<l:l i="150">á»—</l:l>
+<l:l i="150">Ộ</l:l>
+<l:l i="150">á»™</l:l>
+<l:l i="150">Ớ</l:l>
+<l:l i="150">á»›</l:l>
+<l:l i="150">Ờ</l:l>
+<l:l i="150">á»</l:l>
+<l:l i="150">Ở</l:l>
+<l:l i="150">ở</l:l>
+<l:l i="150">á» </l:l>
+<l:l i="150">ỡ</l:l>
+<l:l i="150">Ợ</l:l>
+<l:l i="150">ợ</l:l>
+<l:l i="160">P</l:l>
+<l:l i="160">p</l:l>
+<l:l i="160">Ƥ</l:l>
+<l:l i="160">Æ¥</l:l>
+<l:l i="160">á¹”</l:l>
+<l:l i="160">ṕ</l:l>
+<l:l i="160">á¹–</l:l>
+<l:l i="160">á¹—</l:l>
+<l:l i="170">Q</l:l>
+<l:l i="170">q</l:l>
+<l:l i="170">Ê </l:l>
+<l:l i="180">R</l:l>
+<l:l i="180">r</l:l>
+<l:l i="180">Å”</l:l>
+<l:l i="180">Å•</l:l>
+<l:l i="180">Å–</l:l>
+<l:l i="180">Å—</l:l>
+<l:l i="180">Ř</l:l>
+<l:l i="180">Å™</l:l>
+<l:l i="180">È</l:l>
+<l:l i="180">È‘</l:l>
+<l:l i="180">È’</l:l>
+<l:l i="180">È“</l:l>
+<l:l i="180">ɼ</l:l>
+<l:l i="180">ɽ</l:l>
+<l:l i="180">ɾ</l:l>
+<l:l i="180">Ṙ</l:l>
+<l:l i="180">á¹™</l:l>
+<l:l i="180">Ṛ</l:l>
+<l:l i="180">á¹›</l:l>
+<l:l i="180">Ṝ</l:l>
+<l:l i="180">á¹</l:l>
+<l:l i="180">Ṟ</l:l>
+<l:l i="180">ṟ</l:l>
+<l:l i="190">S</l:l>
+<l:l i="190">s</l:l>
+<l:l i="190">Åš</l:l>
+<l:l i="190">Å›</l:l>
+<l:l i="190">Ŝ</l:l>
+<l:l i="190">Å</l:l>
+<l:l i="190">Åž</l:l>
+<l:l i="190">ÅŸ</l:l>
+<l:l i="190">Å </l:l>
+<l:l i="190">Å¡</l:l>
+<l:l i="190">Ș</l:l>
+<l:l i="190">È™</l:l>
+<l:l i="190">Ê‚</l:l>
+<l:l i="190">á¹ </l:l>
+<l:l i="190">ṡ</l:l>
+<l:l i="190">á¹¢</l:l>
+<l:l i="190">á¹£</l:l>
+<l:l i="190">Ṥ</l:l>
+<l:l i="190">á¹¥</l:l>
+<l:l i="190">Ṧ</l:l>
+<l:l i="190">ṧ</l:l>
+<l:l i="190">Ṩ</l:l>
+<l:l i="190">ṩ</l:l>
+<l:l i="200">T</l:l>
+<l:l i="200">t</l:l>
+<l:l i="200">Å¢</l:l>
+<l:l i="200">Å£</l:l>
+<l:l i="200">Ť</l:l>
+<l:l i="200">Å¥</l:l>
+<l:l i="200">Ŧ</l:l>
+<l:l i="200">ŧ</l:l>
+<l:l i="200">Æ«</l:l>
+<l:l i="200">Ƭ</l:l>
+<l:l i="200">Æ­</l:l>
+<l:l i="200">Æ®</l:l>
+<l:l i="200">ʈ</l:l>
+<l:l i="200">Èš</l:l>
+<l:l i="200">È›</l:l>
+<l:l i="200">ȶ</l:l>
+<l:l i="200">Ṫ</l:l>
+<l:l i="200">ṫ</l:l>
+<l:l i="200">Ṭ</l:l>
+<l:l i="200">á¹­</l:l>
+<l:l i="200">á¹®</l:l>
+<l:l i="200">ṯ</l:l>
+<l:l i="200">á¹°</l:l>
+<l:l i="200">á¹±</l:l>
+<l:l i="200">ẗ</l:l>
+<l:l i="210">U</l:l>
+<l:l i="210">u</l:l>
+<l:l i="210">Ù</l:l>
+<l:l i="210">ù</l:l>
+<l:l i="210">Ú</l:l>
+<l:l i="210">ú</l:l>
+<l:l i="210">Û</l:l>
+<l:l i="210">û</l:l>
+<l:l i="210">Ü</l:l>
+<l:l i="210">ü</l:l>
+<l:l i="210">Ũ</l:l>
+<l:l i="210">Å©</l:l>
+<l:l i="210">Ū</l:l>
+<l:l i="210">Å«</l:l>
+<l:l i="210">Ŭ</l:l>
+<l:l i="210">Å­</l:l>
+<l:l i="210">Å®</l:l>
+<l:l i="210">ů</l:l>
+<l:l i="210">Å°</l:l>
+<l:l i="210">ű</l:l>
+<l:l i="210">Ų</l:l>
+<l:l i="210">ų</l:l>
+<l:l i="210">Ư</l:l>
+<l:l i="210">Æ°</l:l>
+<l:l i="210">Ç“</l:l>
+<l:l i="210">Ç”</l:l>
+<l:l i="210">Ç•</l:l>
+<l:l i="210">Ç–</l:l>
+<l:l i="210">Ç—</l:l>
+<l:l i="210">ǘ</l:l>
+<l:l i="210">Ç™</l:l>
+<l:l i="210">Çš</l:l>
+<l:l i="210">Ç›</l:l>
+<l:l i="210">ǜ</l:l>
+<l:l i="210">È”</l:l>
+<l:l i="210">È•</l:l>
+<l:l i="210">È–</l:l>
+<l:l i="210">È—</l:l>
+<l:l i="210">á¹²</l:l>
+<l:l i="210">á¹³</l:l>
+<l:l i="210">á¹´</l:l>
+<l:l i="210">á¹µ</l:l>
+<l:l i="210">Ṷ</l:l>
+<l:l i="210">á¹·</l:l>
+<l:l i="210">Ṹ</l:l>
+<l:l i="210">á¹¹</l:l>
+<l:l i="210">Ṻ</l:l>
+<l:l i="210">á¹»</l:l>
+<l:l i="210">Ụ</l:l>
+<l:l i="210">ụ</l:l>
+<l:l i="210">Ủ</l:l>
+<l:l i="210">ủ</l:l>
+<l:l i="210">Ứ</l:l>
+<l:l i="210">ứ</l:l>
+<l:l i="210">Ừ</l:l>
+<l:l i="210">ừ</l:l>
+<l:l i="210">Ử</l:l>
+<l:l i="210">á»­</l:l>
+<l:l i="210">á»®</l:l>
+<l:l i="210">ữ</l:l>
+<l:l i="210">á»°</l:l>
+<l:l i="210">á»±</l:l>
+<l:l i="220">V</l:l>
+<l:l i="220">v</l:l>
+<l:l i="220">Ʋ</l:l>
+<l:l i="220">Ê‹</l:l>
+<l:l i="220">á¹¼</l:l>
+<l:l i="220">á¹½</l:l>
+<l:l i="220">á¹¾</l:l>
+<l:l i="220">ṿ</l:l>
+<l:l i="230">W</l:l>
+<l:l i="230">w</l:l>
+<l:l i="230">Å´</l:l>
+<l:l i="230">ŵ</l:l>
+<l:l i="230">Ẁ</l:l>
+<l:l i="230">áº</l:l>
+<l:l i="230">Ẃ</l:l>
+<l:l i="230">ẃ</l:l>
+<l:l i="230">Ẅ</l:l>
+<l:l i="230">ẅ</l:l>
+<l:l i="230">Ẇ</l:l>
+<l:l i="230">ẇ</l:l>
+<l:l i="230">Ẉ</l:l>
+<l:l i="230">ẉ</l:l>
+<l:l i="230">ẘ</l:l>
+<l:l i="240">X</l:l>
+<l:l i="240">x</l:l>
+<l:l i="240">Ẋ</l:l>
+<l:l i="240">ẋ</l:l>
+<l:l i="240">Ẍ</l:l>
+<l:l i="240">áº</l:l>
+<l:l i="250">Y</l:l>
+<l:l i="250">y</l:l>
+<l:l i="250">Ã</l:l>
+<l:l i="250">ý</l:l>
+<l:l i="250">ÿ</l:l>
+<l:l i="250">Ÿ</l:l>
+<l:l i="250">Ŷ</l:l>
+<l:l i="250">Å·</l:l>
+<l:l i="250">Ƴ</l:l>
+<l:l i="250">Æ´</l:l>
+<l:l i="250">Ȳ</l:l>
+<l:l i="250">ȳ</l:l>
+<l:l i="250">Ẏ</l:l>
+<l:l i="250">áº</l:l>
+<l:l i="250">ẙ</l:l>
+<l:l i="250">Ỳ</l:l>
+<l:l i="250">ỳ</l:l>
+<l:l i="250">á»´</l:l>
+<l:l i="250">ỵ</l:l>
+<l:l i="250">Ỷ</l:l>
+<l:l i="250">á»·</l:l>
+<l:l i="250">Ỹ</l:l>
+<l:l i="250">ỹ</l:l>
+<l:l i="260">Z</l:l>
+<l:l i="260">z</l:l>
+<l:l i="260">Ź</l:l>
+<l:l i="260">ź</l:l>
+<l:l i="260">Å»</l:l>
+<l:l i="260">ż</l:l>
+<l:l i="260">Ž</l:l>
+<l:l i="260">ž</l:l>
+<l:l i="260">Ƶ</l:l>
+<l:l i="260">ƶ</l:l>
+<l:l i="260">Ȥ</l:l>
+<l:l i="260">È¥</l:l>
+<l:l i="260">Ê</l:l>
+<l:l i="260">Ê‘</l:l>
+<l:l i="260">áº</l:l>
+<l:l i="260">ẑ</l:l>
+<l:l i="260">Ẓ</l:l>
+<l:l i="260">ẓ</l:l>
+<l:l i="260">Ẕ</l:l>
+<l:l i="260">ẕ</l:l>
+</l:letters>
+</l:l10n>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/sl.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/sl.xml
new file mode 100644
index 0000000..43aa257
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/sl.xml
@@ -0,0 +1,1229 @@
+<?xml version="1.0" encoding="utf-8"?>
+<l:l10n xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0" language="sl" english-language-name="Slovenian">
+
+<!-- * This file is generated automatically. -->
+<!-- * To submit changes to this file upstream (to the DocBook Project) -->
+<!-- * do not submit an edited version of this file. Instead, submit an -->
+<!-- * edited version of the source file at the following location: -->
+<!-- * -->
+<!-- * https://docbook.svn.sourceforge.net/svnroot/docbook/trunk/gentext/locale/sl.xml -->
+<!-- * -->
+<!-- * E-mail the edited sl.xml source file to: -->
+<!-- * -->
+<!-- * docbook-developers@lists.sourceforge.net -->
+
+<!-- ******************************************************************** -->
+
+<!-- This file is part of the XSL DocBook Stylesheet distribution. -->
+<!-- See ../README or http://docbook.sf.net/release/xsl/current/ for -->
+<!-- copyright and other information. -->
+
+<!-- ******************************************************************** -->
+<!-- In these files, % with a letter is used for a placeholder: -->
+<!-- %t is the current element's title -->
+<!-- %s is the current element's subtitle (if applicable)-->
+<!-- %n is the current element's number label-->
+<!-- %p is the current element's page number (if applicable)-->
+<!-- ******************************************************************** -->
+
+
+<l:gentext key="Abstract" text="Povzetek"/>
+<l:gentext key="abstract" text="Povzetek"/>
+<l:gentext key="Acknowledgements" text="Acknowledgements" lang="en"/>
+<l:gentext key="acknowledgements" text="Acknowledgements" lang="en"/>
+<l:gentext key="Answer" text="O:"/>
+<l:gentext key="answer" text="O:"/>
+<l:gentext key="Appendix" text="Dodatek"/>
+<l:gentext key="appendix" text="dodatek"/>
+<l:gentext key="Article" text="ÄŒlanek"/>
+<l:gentext key="article" text="ÄŒlanek"/>
+<l:gentext key="Author" text="Author" lang="en"/>
+<l:gentext key="Bibliography" text="Literatura"/>
+<l:gentext key="bibliography" text="Literatura"/>
+<l:gentext key="Book" text="Knjiga"/>
+<l:gentext key="book" text="Knjiga"/>
+<l:gentext key="CAUTION" text="OPOZORILO"/>
+<l:gentext key="Caution" text="Opozorilo"/>
+<l:gentext key="caution" text="Opozorilo"/>
+<l:gentext key="Chapter" text="Poglavje"/>
+<l:gentext key="chapter" text="poglavje"/>
+<l:gentext key="Colophon" text="Kolofon"/>
+<l:gentext key="colophon" text="Kolofon"/>
+<l:gentext key="Copyright" text="Pravna zaÅ¡Äita"/>
+<l:gentext key="copyright" text="Pravna zaÅ¡Äita"/>
+<l:gentext key="Dedication" text="Posvetilo"/>
+<l:gentext key="dedication" text="Posvetilo"/>
+<l:gentext key="Edition" text="Izdaja"/>
+<l:gentext key="edition" text="Izdaja"/>
+<l:gentext key="Editor" text="Editor" lang="en"/>
+<l:gentext key="Equation" text="EnaÄba"/>
+<l:gentext key="equation" text="EnaÄba"/>
+<l:gentext key="Example" text="Primer"/>
+<l:gentext key="example" text="Primer"/>
+<l:gentext key="Figure" text="Slika"/>
+<l:gentext key="figure" text="Slika"/>
+<l:gentext key="Glossary" text="SlovarÄek"/>
+<l:gentext key="glossary" text="SlovarÄek"/>
+<l:gentext key="GlossSee" text="glej"/>
+<l:gentext key="glosssee" text="glej"/>
+<l:gentext key="GlossSeeAlso" text="glej tudi"/>
+<l:gentext key="glossseealso" text="glej tudi"/>
+<l:gentext key="IMPORTANT" text="POMEMBNO"/>
+<l:gentext key="important" text="Pomembno"/>
+<l:gentext key="Important" text="Pomembno"/>
+<l:gentext key="Index" text="Stvarno kazalo"/>
+<l:gentext key="index" text="Stvarno kazalo"/>
+<l:gentext key="ISBN" text="ISBN"/>
+<l:gentext key="isbn" text="ISBN"/>
+<l:gentext key="LegalNotice" text="Pravno sporoÄilo"/>
+<l:gentext key="legalnotice" text="Pravno sporoÄilo"/>
+<l:gentext key="MsgAud" text="ObÄinstvo"/>
+<l:gentext key="msgaud" text="ObÄinstvo"/>
+<l:gentext key="MsgLevel" text="Raven"/>
+<l:gentext key="msglevel" text="Raven"/>
+<l:gentext key="MsgOrig" text="Izvor"/>
+<l:gentext key="msgorig" text="Izvor"/>
+<l:gentext key="NOTE" text="OPOMBA"/>
+<l:gentext key="Note" text="Opomba"/>
+<l:gentext key="note" text="Opomba"/>
+<l:gentext key="Part" text="Del"/>
+<l:gentext key="part" text="Del"/>
+<l:gentext key="Preface" text="Predgovor"/>
+<l:gentext key="preface" text="Predgovor"/>
+<l:gentext key="Procedure" text="Postopek"/>
+<l:gentext key="procedure" text="Postopek"/>
+<l:gentext key="ProductionSet" text="Izdelava"/>
+<l:gentext key="PubDate" text="Publication Date" lang="en"/>
+<l:gentext key="pubdate" text="Publication date" lang="en"/>
+<l:gentext key="Published" text="Izdano"/>
+<l:gentext key="published" text="Izdano"/>
+<l:gentext key="Publisher" text="Publisher" lang="en"/>
+<l:gentext key="Qandadiv" text="V in O"/>
+<l:gentext key="qandadiv" text="V in O"/>
+<l:gentext key="QandASet" text="Frequently Asked Questions" lang="en"/>
+<l:gentext key="Question" text="V:"/>
+<l:gentext key="question" text="V:"/>
+<l:gentext key="RefEntry" text=""/>
+<l:gentext key="refentry" text=""/>
+<l:gentext key="Reference" text="Sklic"/>
+<l:gentext key="reference" text="Sklic"/>
+<l:gentext key="References" text="References" lang="en"/>
+<l:gentext key="RefName" text="Ime"/>
+<l:gentext key="refname" text="Ime"/>
+<l:gentext key="RefSection" text=""/>
+<l:gentext key="refsection" text=""/>
+<l:gentext key="RefSynopsisDiv" text="Sinopsis"/>
+<l:gentext key="refsynopsisdiv" text="Sinopsis"/>
+<l:gentext key="RevHistory" text="Zgodovina razliÄic"/>
+<l:gentext key="revhistory" text="Zgodovina razliÄic"/>
+<l:gentext key="revision" text="RazliÄica"/>
+<l:gentext key="Revision" text="RazliÄica"/>
+<l:gentext key="sect1" text="Razdelek"/>
+<l:gentext key="sect2" text="Razdelek"/>
+<l:gentext key="sect3" text="Razdelek"/>
+<l:gentext key="sect4" text="Razdelek"/>
+<l:gentext key="sect5" text="Razdelek"/>
+<l:gentext key="section" text="razdelek"/>
+<l:gentext key="Section" text="Razdelek"/>
+<l:gentext key="see" text="glej"/>
+<l:gentext key="See" text="glej"/>
+<l:gentext key="seealso" text="glej tudi"/>
+<l:gentext key="Seealso" text="Glej tudi"/>
+<l:gentext key="SeeAlso" text="glej tudi"/>
+<l:gentext key="set" text="Postavi"/>
+<l:gentext key="Set" text="Postavi"/>
+<l:gentext key="setindex" text="Postavi stvarno kazalo"/>
+<l:gentext key="SetIndex" text="Postavi stvarno kazalo"/>
+<l:gentext key="Sidebar" text=""/>
+<l:gentext key="sidebar" text="sidebar"/>
+<l:gentext key="step" text="korak"/>
+<l:gentext key="Step" text="Korak"/>
+<l:gentext key="table" text="Tabela"/>
+<l:gentext key="Table" text="Tabela"/>
+<l:gentext key="task" text="Task" lang="en"/>
+<l:gentext key="Task" text="Task" lang="en"/>
+<l:gentext key="tip" text="Namig"/>
+<l:gentext key="TIP" text="NAMIG"/>
+<l:gentext key="Tip" text="Namig"/>
+<l:gentext key="Warning" text="Pozor"/>
+<l:gentext key="warning" text="Pozor"/>
+<l:gentext key="WARNING" text="POZOR"/>
+<l:gentext key="and" text="in"/>
+<l:gentext key="by" text="od"/>
+<l:gentext key="Edited" text="Urejeno"/>
+<l:gentext key="edited" text="Urejeno"/>
+<l:gentext key="Editedby" text="Uredil"/>
+<l:gentext key="editedby" text="Uredil"/>
+<l:gentext key="in" text="v"/>
+<l:gentext key="lastlistcomma" text=","/>
+<l:gentext key="listcomma" text=","/>
+<l:gentext key="notes" text="Notes"/>
+<l:gentext key="Notes" text="Notes"/>
+<l:gentext key="Pgs" text="Str."/>
+<l:gentext key="pgs" text="Str."/>
+<l:gentext key="Revisedby" text="Pregledal: "/>
+<l:gentext key="revisedby" text="Pregledal: "/>
+<l:gentext key="TableNotes" text="Notes"/>
+<l:gentext key="tablenotes" text="Notes"/>
+<l:gentext key="TableofContents" text="Kazalo"/>
+<l:gentext key="tableofcontents" text="Kazalo"/>
+<l:gentext key="unexpectedelementname" text="NepriÄakovano ime elementa"/>
+<l:gentext key="unsupported" text="nepodprto"/>
+<l:gentext key="xrefto" text="xref na"/>
+<l:gentext key="Authors" text="Authors" lang="en"/>
+<l:gentext key="copyeditor" text="Copy Editor" lang="en"/>
+<l:gentext key="graphicdesigner" text="Graphic Designer" lang="en"/>
+<l:gentext key="productioneditor" text="Production Editor" lang="en"/>
+<l:gentext key="technicaleditor" text="Technical Editor" lang="en"/>
+<l:gentext key="translator" text="Translator" lang="en"/>
+<l:gentext key="listofequations" text="Seznam enaÄb"/>
+<l:gentext key="ListofEquations" text="Seznam enaÄb"/>
+<l:gentext key="ListofExamples" text="Seznam primerov"/>
+<l:gentext key="listofexamples" text="Seznam primerov"/>
+<l:gentext key="ListofFigures" text="Seznam slik"/>
+<l:gentext key="listoffigures" text="Seznam slik"/>
+<l:gentext key="ListofProcedures" text="List of Procedures" lang="en"/>
+<l:gentext key="listofprocedures" text="List of Procedures" lang="en"/>
+<l:gentext key="listoftables" text="Seznam tabel"/>
+<l:gentext key="ListofTables" text="Seznam tabel"/>
+<l:gentext key="ListofUnknown" text="Seznam neznanih stvari"/>
+<l:gentext key="listofunknown" text="Seznam neznanih stvari"/>
+<l:gentext key="nav-home" text="Domov"/>
+<l:gentext key="nav-next" text="Naprej"/>
+<l:gentext key="nav-next-sibling" text="Hitro naprej"/>
+<l:gentext key="nav-prev" text="Nazaj"/>
+<l:gentext key="nav-prev-sibling" text="Hitro nazaj"/>
+<l:gentext key="nav-up" text="Gor"/>
+<l:gentext key="nav-toc" text="ToC" lang="en"/>
+<l:gentext key="Draft" text="Draft"/>
+<l:gentext key="above" text="above"/>
+<l:gentext key="below" text="below"/>
+<l:gentext key="sectioncalled" text="razdelek, imenovan"/>
+<l:gentext key="index symbols" text="Simboli"/>
+<l:gentext key="writing-mode" text="lr-tb"/>
+<l:gentext key="lowercase.alpha" text="abcÄdefghijklmnopqrsÅ¡tuvwxyzž"/>
+<l:gentext key="uppercase.alpha" text="ABCČDEFGHIJKLMNOPQRSŠTUVWXYZŽ"/>
+<l:gentext key="normalize.sort.input" text="AaÀàÃáÂâÃãÄäÅåĀÄĂ㥹ÇǎǞǟǠǡǺǻȀÈȂȃȦȧḀá¸áºšáº áº¡áº¢áº£áº¤áº¥áº¦áº§áº¨áº©áºªáº«áº¬áº­áº®áº¯áº°áº±áº²áº³áº´áºµáº¶áº·BbÆ€ÆɓƂƃḂḃḄḅḆḇCcÇçĆćĈĉĊċČÄƇƈɕḈḉDdÄŽÄÄđƊɗƋƌDžDzȡɖḊḋḌá¸á¸Žá¸á¸á¸‘ḒḓEeÈèÉéÊêËëĒēĔĕĖėĘęĚěȄȅȆȇȨȩḔḕḖḗḘḙḚḛḜá¸áº¸áº¹áººáº»áº¼áº½áº¾áº¿á»€á»á»‚ểỄễỆệFfƑƒḞḟGgÄœÄĞğĠġĢģƓɠǤǥǦǧǴǵḠḡHhĤĥĦħȞȟɦḢḣḤḥḦḧḨḩḪḫẖIiÌìÃíÎîÃïĨĩĪīĬĭĮįİƗɨÇÇȈȉȊȋḬḭḮḯỈỉỊịJjĴĵǰÊKkĶķƘƙǨǩḰḱḲḳḴḵLlĹĺĻļĽľĿŀÅłƚLjȴɫɬɭḶḷḸḹḺḻḼḽMmɱḾḿṀá¹á¹‚ṃNnÑñŃńŅņŇňÆɲƞȠNjǸǹȵɳṄṅṆṇṈṉṊṋOoÒòÓóÔôÕõÖöØøŌÅÅŽÅÅőƟƠơǑǒǪǫǬǭǾǿȌÈÈŽÈȪȫȬȭȮȯȰȱṌá¹á¹Žá¹á¹á¹‘ṒṓỌá»á»Žá»á»á»‘ỒồỔổỖỗỘộỚớỜá»á»žá»Ÿá» á»¡á»¢á»£PpƤƥṔṕṖṗQqÊ RrŔŕŖŗŘřÈȑȒȓɼɽɾṘṙṚṛṜá¹á¹žá¹ŸSsŚśŜÅŞşŠšȘșʂṠṡṢṣṤṥṦṧṨṩTtŢţŤťŦŧƫƬƭƮʈȚțȶṪṫṬṭṮṯṰṱẗUuÙùÚúÛûÜüŨũŪūŬŭŮůŰűŲųƯưǓǔǕǖǗǘǙǚǛǜȔȕȖȗṲṳṴṵṶṷṸṹṺṻỤụỦủỨứỪừỬửỮữỰựVvƲʋṼṽṾṿWwŴŵẀáºáº‚ẃẄẅẆẇẈẉẘXxẊẋẌáºYyÃýÿŸŶŷƳƴȲȳẎáºáº™á»²á»³á»´á»µá»¶á»·á»¸á»¹ZzŹźŻżŽžƵƶȤȥÊÊ‘áºáº‘ẒẓẔẕẕ" lang="en"/>
+<l:gentext key="normalize.sort.output" text="AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBCCCCCCCCCCCCCCCCCDDDDDDDDDDDDDDDDDDDDDDDDEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEFFFFFFGGGGGGGGGGGGGGGGGGGGHHHHHHHHHHHHHHHHHHHHIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIJJJJJJKKKKKKKKKKKKKKLLLLLLLLLLLLLLLLLLLLLLLLLLMMMMMMMMMNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOPPPPPPPPQQQRRRRRRRRRRRRRRRRRRRRRRRSSSSSSSSSSSSSSSSSSSSSSSTTTTTTTTTTTTTTTTTTTTTTTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUVVVVVVVVWWWWWWWWWWWWWWWXXXXXXYYYYYYYYYYYYYYYYYYYYYYYZZZZZZZZZZZZZZZZZZZZZ" lang="en"/>
+<l:dingbat key="startquote" text="“"/>
+<l:dingbat key="endquote" text="â€"/>
+<l:dingbat key="nestedstartquote" text="‘"/>
+<l:dingbat key="nestedendquote" text="’"/>
+<l:dingbat key="singlestartquote" text="‘" lang="en"/>
+<l:dingbat key="singleendquote" text="’" lang="en"/>
+<l:dingbat key="bullet" text="•"/>
+<l:gentext key="hyphenation-character" text="-" lang="en"/>
+<l:gentext key="hyphenation-push-character-count" text="2" lang="en"/>
+<l:gentext key="hyphenation-remain-character-count" text="2" lang="en"/>
+<l:context name="styles"><l:template name="person-name" text="first-last"/>
+</l:context>
+<l:context name="title"><l:template name="abstract" text="%t"/>
+<l:template name="acknowledgements" text="%t" lang="en"/>
+<l:template name="answer" text="%t"/>
+<l:template name="appendix" text="Dodatek %n. %t"/>
+<l:template name="article" text="%t"/>
+<l:template name="authorblurb" text="%t"/>
+<l:template name="bibliodiv" text="%t"/>
+<l:template name="biblioentry" text="%t"/>
+<l:template name="bibliography" text="%t"/>
+<l:template name="bibliolist" text="%t" lang="en"/>
+<l:template name="bibliomixed" text="%t"/>
+<l:template name="bibliomset" text="%t"/>
+<l:template name="biblioset" text="%t"/>
+<l:template name="blockquote" text="%t"/>
+<l:template name="book" text="%t"/>
+<l:template name="calloutlist" text="%t"/>
+<l:template name="caution" text="%t"/>
+<l:template name="chapter" text="Poglavje %n. %t"/>
+<l:template name="colophon" text="%t"/>
+<l:template name="dedication" text="%t"/>
+<l:template name="equation" text="EnaÄba %n. %t"/>
+<l:template name="example" text="Primer %n. %t"/>
+<l:template name="figure" text="Slika %n. %t"/>
+<l:template name="foil" text="%t" lang="en"/>
+<l:template name="foilgroup" text="%t" lang="en"/>
+<l:template name="formalpara" text="%t"/>
+<l:template name="glossary" text="%t"/>
+<l:template name="glossdiv" text="%t"/>
+<l:template name="glosslist" text="%t" lang="en"/>
+<l:template name="glossentry" text="%t" lang="en"/>
+<l:template name="important" text="%t"/>
+<l:template name="index" text="%t"/>
+<l:template name="indexdiv" text="%t"/>
+<l:template name="itemizedlist" text="%t"/>
+<l:template name="legalnotice" text="%t"/>
+<l:template name="listitem" text=""/>
+<l:template name="lot" text="%t"/>
+<l:template name="msg" text="%t"/>
+<l:template name="msgexplan" text="%t"/>
+<l:template name="msgmain" text="%t"/>
+<l:template name="msgrel" text="%t"/>
+<l:template name="msgset" text="%t"/>
+<l:template name="msgsub" text="%t"/>
+<l:template name="note" text="%t"/>
+<l:template name="orderedlist" text="%t"/>
+<l:template name="part" text="Del %n. %t"/>
+<l:template name="partintro" text="%t"/>
+<l:template name="preface" text="%t"/>
+<l:template name="procedure" text="%t"/>
+<l:template name="procedure.formal" text="Postopek %n. %t"/>
+<l:template name="productionset" text="%t"/>
+<l:template name="productionset.formal" text="Izdelava %n"/>
+<l:template name="qandadiv" text="%t"/>
+<l:template name="qandaentry" text="%t"/>
+<l:template name="qandaset" text="%t"/>
+<l:template name="question" text="%t"/>
+<l:template name="refentry" text="%t"/>
+<l:template name="reference" text="%t"/>
+<l:template name="refsection" text="%t"/>
+<l:template name="refsect1" text="%t"/>
+<l:template name="refsect2" text="%t"/>
+<l:template name="refsect3" text="%t"/>
+<l:template name="refsynopsisdiv" text="%t"/>
+<l:template name="refsynopsisdivinfo" text="%t"/>
+<l:template name="segmentedlist" text="%t"/>
+<l:template name="set" text="%t"/>
+<l:template name="setindex" text="%t"/>
+<l:template name="sidebar" text="%t"/>
+<l:template name="step" text="%t"/>
+<l:template name="table" text="Tabela %n. %t"/>
+<l:template name="task" text="%t" lang="en"/>
+<l:template name="tasksummary" text="%t" lang="en"/>
+<l:template name="taskprerequisites" text="%t" lang="en"/>
+<l:template name="taskrelated" text="%t" lang="en"/>
+<l:template name="tip" text="%t"/>
+<l:template name="toc" text="%t"/>
+<l:template name="variablelist" text="%t"/>
+<l:template name="varlistentry" text=""/>
+<l:template name="warning" text="%t"/>
+</l:context>
+<l:context name="title-unnumbered"><l:template name="appendix" text="%t"/>
+<l:template name="article/appendix" text="%t" lang="en"/>
+<l:template name="bridgehead" text="%t"/>
+<l:template name="chapter" text="%t"/>
+<l:template name="sect1" text="%t"/>
+<l:template name="sect2" text="%t"/>
+<l:template name="sect3" text="%t"/>
+<l:template name="sect4" text="%t"/>
+<l:template name="sect5" text="%t"/>
+<l:template name="section" text="%t"/>
+<l:template name="simplesect" text="%t"/>
+<l:template name="part" text="%t" lang="en"/>
+</l:context>
+<l:context name="title-numbered"><l:template name="appendix" text="Dodatek %n. %t"/>
+<l:template name="article/appendix" text="%n. %t" lang="en"/>
+<l:template name="bridgehead" text="%t"/>
+<l:template name="chapter" text="Poglavje %n. %t"/>
+<l:template name="part" text="Del %n. %t"/>
+<l:template name="sect1" text="%n. %t"/>
+<l:template name="sect2" text="%n. %t"/>
+<l:template name="sect3" text="%n. %t"/>
+<l:template name="sect4" text="%n. %t"/>
+<l:template name="sect5" text="%n. %t"/>
+<l:template name="section" text="%n. %t"/>
+<l:template name="simplesect" text="%n. %t"/>
+</l:context>
+<l:context name="subtitle"><l:template name="appendix" text="%s"/>
+<l:template name="acknowledgements" text="%s" lang="en"/>
+<l:template name="article" text="%s"/>
+<l:template name="bibliodiv" text="%s"/>
+<l:template name="biblioentry" text="%s"/>
+<l:template name="bibliography" text="%s"/>
+<l:template name="bibliomixed" text="%s"/>
+<l:template name="bibliomset" text="%s"/>
+<l:template name="biblioset" text="%s"/>
+<l:template name="book" text="%s"/>
+<l:template name="chapter" text="%s"/>
+<l:template name="colophon" text="%s"/>
+<l:template name="dedication" text="%s"/>
+<l:template name="glossary" text="%s"/>
+<l:template name="glossdiv" text="%s"/>
+<l:template name="index" text="%s"/>
+<l:template name="indexdiv" text="%s"/>
+<l:template name="lot" text="%s"/>
+<l:template name="part" text="%s"/>
+<l:template name="partintro" text="%s"/>
+<l:template name="preface" text="%s"/>
+<l:template name="refentry" text="%s"/>
+<l:template name="reference" text="%s"/>
+<l:template name="refsection" text="%s"/>
+<l:template name="refsect1" text="%s"/>
+<l:template name="refsect2" text="%s"/>
+<l:template name="refsect3" text="%s"/>
+<l:template name="refsynopsisdiv" text="%s"/>
+<l:template name="sect1" text="%s"/>
+<l:template name="sect2" text="%s"/>
+<l:template name="sect3" text="%s"/>
+<l:template name="sect4" text="%s"/>
+<l:template name="sect5" text="%s"/>
+<l:template name="section" text="%s"/>
+<l:template name="set" text="%s"/>
+<l:template name="setindex" text="%s"/>
+<l:template name="sidebar" text="%s"/>
+<l:template name="simplesect" text="%s"/>
+<l:template name="toc" text="%s"/>
+</l:context>
+<l:context name="xref"><l:template name="abstract" text="%t"/>
+<l:template name="acknowledgements" text="%t" lang="en"/>
+<l:template name="answer" text="O: %n"/>
+<l:template name="appendix" text="%t"/>
+<l:template name="article" text="%t"/>
+<l:template name="authorblurb" text="%t"/>
+<l:template name="bibliodiv" text="%t"/>
+<l:template name="bibliography" text="%t"/>
+<l:template name="bibliomset" text="%t"/>
+<l:template name="biblioset" text="%t"/>
+<l:template name="blockquote" text="%t"/>
+<l:template name="book" text="%t"/>
+<l:template name="calloutlist" text="%t"/>
+<l:template name="caution" text="%t"/>
+<l:template name="chapter" text="%t"/>
+<l:template name="colophon" text="%t"/>
+<l:template name="constraintdef" text="%t"/>
+<l:template name="dedication" text="%t"/>
+<l:template name="equation" text="%t"/>
+<l:template name="example" text="%t"/>
+<l:template name="figure" text="%t"/>
+<l:template name="foil" text="%t" lang="en"/>
+<l:template name="foilgroup" text="%t" lang="en"/>
+<l:template name="formalpara" text="%t"/>
+<l:template name="glossary" text="%t"/>
+<l:template name="glossdiv" text="%t"/>
+<l:template name="important" text="%t"/>
+<l:template name="index" text="%t"/>
+<l:template name="indexdiv" text="%t"/>
+<l:template name="itemizedlist" text="%t"/>
+<l:template name="legalnotice" text="%t"/>
+<l:template name="listitem" text="%n"/>
+<l:template name="lot" text="%t"/>
+<l:template name="msg" text="%t"/>
+<l:template name="msgexplan" text="%t"/>
+<l:template name="msgmain" text="%t"/>
+<l:template name="msgrel" text="%t"/>
+<l:template name="msgset" text="%t"/>
+<l:template name="msgsub" text="%t"/>
+<l:template name="note" text="%t"/>
+<l:template name="orderedlist" text="%t"/>
+<l:template name="part" text="%t"/>
+<l:template name="partintro" text="%t"/>
+<l:template name="preface" text="%t"/>
+<l:template name="procedure" text="%t"/>
+<l:template name="productionset" text="%t"/>
+<l:template name="qandadiv" text="%t"/>
+<l:template name="qandaentry" text="V: %n"/>
+<l:template name="qandaset" text="%t"/>
+<l:template name="question" text="V: %n"/>
+<l:template name="reference" text="%t"/>
+<l:template name="refsynopsisdiv" text="%t"/>
+<l:template name="segmentedlist" text="%t"/>
+<l:template name="set" text="%t"/>
+<l:template name="setindex" text="%t"/>
+<l:template name="sidebar" text="%t"/>
+<l:template name="table" text="%t"/>
+<l:template name="task" text="%t" lang="en"/>
+<l:template name="tip" text="%t"/>
+<l:template name="toc" text="%t"/>
+<l:template name="variablelist" text="%t"/>
+<l:template name="varlistentry" text="%n"/>
+<l:template name="warning" text="%t"/>
+<l:template name="olink.document.citation" text=" in %o" lang="en"/>
+<l:template name="olink.page.citation" text=" (page %p)" lang="en"/>
+<l:template name="page.citation" text=" [%p]"/>
+<l:template name="page" text="(page %p)" lang="en"/>
+<l:template name="docname" text=" in %o" lang="en"/>
+<l:template name="docnamelong" text=" in the document titled %o" lang="en"/>
+<l:template name="pageabbrev" text="(p. %p)" lang="en"/>
+<l:template name="Page" text="Page %p" lang="en"/>
+<l:template name="bridgehead" text="“%tâ€"/>
+<l:template name="refsection" text="“%tâ€"/>
+<l:template name="refsect1" text="“%tâ€"/>
+<l:template name="refsect2" text="“%tâ€"/>
+<l:template name="refsect3" text="“%tâ€"/>
+<l:template name="sect1" text="“%tâ€"/>
+<l:template name="sect2" text="“%tâ€"/>
+<l:template name="sect3" text="“%tâ€"/>
+<l:template name="sect4" text="“%tâ€"/>
+<l:template name="sect5" text="“%tâ€"/>
+<l:template name="section" text="“%tâ€"/>
+<l:template name="simplesect" text="“%tâ€"/>
+</l:context>
+<l:context name="xref-number"><l:template name="answer" text="O: %n"/>
+<l:template name="appendix" text="Dodatek %n"/>
+<l:template name="bridgehead" text="Razdelek %n"/>
+<l:template name="chapter" text="Poglavje %n"/>
+<l:template name="equation" text="EnaÄba %n"/>
+<l:template name="example" text="Primer %n"/>
+<l:template name="figure" text="Slika %n"/>
+<l:template name="part" text="Del %n"/>
+<l:template name="procedure" text="Postopek %n"/>
+<l:template name="productionset" text="Izdelava %n"/>
+<l:template name="qandadiv" text="V in O %n"/>
+<l:template name="qandaentry" text="V: %n"/>
+<l:template name="question" text="V: %n"/>
+<l:template name="sect1" text="Razdelek %n"/>
+<l:template name="sect2" text="Razdelek %n"/>
+<l:template name="sect3" text="Razdelek %n"/>
+<l:template name="sect4" text="Razdelek %n"/>
+<l:template name="sect5" text="Razdelek %n"/>
+<l:template name="section" text="Razdelek %n"/>
+<l:template name="table" text="Tabela %n"/>
+</l:context>
+<l:context name="xref-number-and-title"><l:template name="appendix" text="Dodatek %n, %t"/>
+<l:template name="bridgehead" text="Razdelek %n, “%tâ€"/>
+<l:template name="chapter" text="Poglavje %n, %t"/>
+<l:template name="equation" text="EnaÄba %n, “%tâ€"/>
+<l:template name="example" text="Primer %n, “%tâ€"/>
+<l:template name="figure" text="Slika %n, “%tâ€"/>
+<l:template name="part" text="Del %n, “%tâ€"/>
+<l:template name="procedure" text="Postopek %n, “%tâ€"/>
+<l:template name="productionset" text="Izdelava %n, “%tâ€"/>
+<l:template name="qandadiv" text="V in O %n, “%tâ€"/>
+<l:template name="refsect1" text="razdelek, imenovan “%tâ€"/>
+<l:template name="refsect2" text="razdelek, imenovan “%tâ€"/>
+<l:template name="refsect3" text="razdelek, imenovan “%tâ€"/>
+<l:template name="refsection" text="razdelek, imenovan “%tâ€"/>
+<l:template name="sect1" text="Razdelek %n, “%tâ€"/>
+<l:template name="sect2" text="Razdelek %n, “%tâ€"/>
+<l:template name="sect3" text="Razdelek %n, “%tâ€"/>
+<l:template name="sect4" text="Razdelek %n, “%tâ€"/>
+<l:template name="sect5" text="Razdelek %n, “%tâ€"/>
+<l:template name="section" text="Razdelek %n, “%tâ€"/>
+<l:template name="simplesect" text="razdelek, imenovan “%tâ€"/>
+<l:template name="table" text="Tabela %n, “%tâ€"/>
+</l:context>
+<l:context name="authorgroup"><l:template name="sep" text=", "/>
+<l:template name="sep2" text=" in "/>
+<l:template name="seplast" text=", in "/>
+</l:context>
+<l:context name="glossary"><l:template name="see" text="glej %t."/>
+<l:template name="seealso" text="glej tudi %t."/>
+<l:template name="seealso-separator" text=", "/>
+</l:context>
+<l:context name="msgset"><l:template name="MsgAud" text="ObÄinstvo: "/>
+<l:template name="MsgLevel" text="Raven: "/>
+<l:template name="MsgOrig" text="Izvor: "/>
+</l:context>
+<l:context name="datetime"><l:template name="format" text="m/d/Y" lang="en"/>
+</l:context>
+<l:context name="termdef"><l:template name="prefix" text="[Definition: " lang="en"/>
+<l:template name="suffix" text="]" lang="en"/>
+</l:context>
+<l:context name="datetime-full"><l:template name="January" text="January" lang="en"/>
+<l:template name="February" text="February" lang="en"/>
+<l:template name="March" text="March" lang="en"/>
+<l:template name="April" text="April" lang="en"/>
+<l:template name="May" text="May" lang="en"/>
+<l:template name="June" text="June" lang="en"/>
+<l:template name="July" text="July" lang="en"/>
+<l:template name="August" text="August" lang="en"/>
+<l:template name="September" text="September" lang="en"/>
+<l:template name="October" text="October" lang="en"/>
+<l:template name="November" text="November" lang="en"/>
+<l:template name="December" text="December" lang="en"/>
+<l:template name="Monday" text="Monday" lang="en"/>
+<l:template name="Tuesday" text="Tuesday" lang="en"/>
+<l:template name="Wednesday" text="Wednesday" lang="en"/>
+<l:template name="Thursday" text="Thursday" lang="en"/>
+<l:template name="Friday" text="Friday" lang="en"/>
+<l:template name="Saturday" text="Saturday" lang="en"/>
+<l:template name="Sunday" text="Sunday" lang="en"/>
+</l:context>
+<l:context name="datetime-abbrev"><l:template name="Jan" text="Jan" lang="en"/>
+<l:template name="Feb" text="Feb" lang="en"/>
+<l:template name="Mar" text="Mar" lang="en"/>
+<l:template name="Apr" text="Apr" lang="en"/>
+<l:template name="May" text="May" lang="en"/>
+<l:template name="Jun" text="Jun" lang="en"/>
+<l:template name="Jul" text="Jul" lang="en"/>
+<l:template name="Aug" text="Aug" lang="en"/>
+<l:template name="Sep" text="Sep" lang="en"/>
+<l:template name="Oct" text="Oct" lang="en"/>
+<l:template name="Nov" text="Nov" lang="en"/>
+<l:template name="Dec" text="Dec" lang="en"/>
+<l:template name="Mon" text="Mon" lang="en"/>
+<l:template name="Tue" text="Tue" lang="en"/>
+<l:template name="Wed" text="Wed" lang="en"/>
+<l:template name="Thu" text="Thu" lang="en"/>
+<l:template name="Fri" text="Fri" lang="en"/>
+<l:template name="Sat" text="Sat" lang="en"/>
+<l:template name="Sun" text="Sun" lang="en"/>
+</l:context>
+<l:context name="htmlhelp"><l:template name="langcode" text="0x0424 Slovenian"/>
+</l:context>
+<l:context name="index"><l:template name="term-separator" text=", " lang="en"/>
+<l:template name="number-separator" text=", " lang="en"/>
+<l:template name="range-separator" text="-" lang="en"/>
+</l:context>
+<l:context name="iso690"><l:template name="lastfirst.sep" text=", " lang="en"/>
+<l:template name="alt.person.two.sep" text=" – " lang="en"/>
+<l:template name="alt.person.last.sep" text=" – " lang="en"/>
+<l:template name="alt.person.more.sep" text=" – " lang="en"/>
+<l:template name="primary.editor" text=" (ed.)" lang="en"/>
+<l:template name="primary.many" text=", et al." lang="en"/>
+<l:template name="primary.sep" text=". " lang="en"/>
+<l:template name="submaintitle.sep" text=": " lang="en"/>
+<l:template name="title.sep" text=". " lang="en"/>
+<l:template name="othertitle.sep" text=", " lang="en"/>
+<l:template name="medium1" text=" [" lang="en"/>
+<l:template name="medium2" text="]" lang="en"/>
+<l:template name="secondary.person.sep" text="; " lang="en"/>
+<l:template name="secondary.sep" text=". " lang="en"/>
+<l:template name="respons.sep" text=". " lang="en"/>
+<l:template name="edition.sep" text=". " lang="en"/>
+<l:template name="edition.serial.sep" text=", " lang="en"/>
+<l:template name="issuing.range" text="-" lang="en"/>
+<l:template name="issuing.div" text=", " lang="en"/>
+<l:template name="issuing.sep" text=". " lang="en"/>
+<l:template name="partnr.sep" text=". " lang="en"/>
+<l:template name="placepubl.sep" text=": " lang="en"/>
+<l:template name="publyear.sep" text=", " lang="en"/>
+<l:template name="pubinfo.sep" text=". " lang="en"/>
+<l:template name="spec.pubinfo.sep" text=", " lang="en"/>
+<l:template name="upd.sep" text=", " lang="en"/>
+<l:template name="datecit1" text=" [cited " lang="en"/>
+<l:template name="datecit2" text="]" lang="en"/>
+<l:template name="extent.sep" text=". " lang="en"/>
+<l:template name="locs.sep" text=", " lang="en"/>
+<l:template name="location.sep" text=". " lang="en"/>
+<l:template name="serie.sep" text=". " lang="en"/>
+<l:template name="notice.sep" text=". " lang="en"/>
+<l:template name="access" text="Available " lang="en"/>
+<l:template name="acctoo" text="Also available " lang="en"/>
+<l:template name="onwww" text="from World Wide Web" lang="en"/>
+<l:template name="oninet" text="from Internet" lang="en"/>
+<l:template name="access.end" text=": " lang="en"/>
+<l:template name="link1" text="&lt;" lang="en"/>
+<l:template name="link2" text="&gt;" lang="en"/>
+<l:template name="access.sep" text=". " lang="en"/>
+<l:template name="isbn" text="ISBN " lang="en"/>
+<l:template name="issn" text="ISSN " lang="en"/>
+<l:template name="stdnum.sep" text=". " lang="en"/>
+<l:template name="patcountry.sep" text=". " lang="en"/>
+<l:template name="pattype.sep" text=", " lang="en"/>
+<l:template name="patnum.sep" text=". " lang="en"/>
+<l:template name="patdate.sep" text=". " lang="en"/>
+</l:context><l:letters lang="en"><l:l i="-1"/>
+<l:l i="0">Symbols</l:l>
+<l:l i="10">A</l:l>
+<l:l i="10">a</l:l>
+<l:l i="10">À</l:l>
+<l:l i="10">à</l:l>
+<l:l i="10">Ã</l:l>
+<l:l i="10">á</l:l>
+<l:l i="10">Â</l:l>
+<l:l i="10">â</l:l>
+<l:l i="10">Ã</l:l>
+<l:l i="10">ã</l:l>
+<l:l i="10">Ä</l:l>
+<l:l i="10">ä</l:l>
+<l:l i="10">Ã…</l:l>
+<l:l i="10">Ã¥</l:l>
+<l:l i="10">Ä€</l:l>
+<l:l i="10">Ä</l:l>
+<l:l i="10">Ä‚</l:l>
+<l:l i="10">ă</l:l>
+<l:l i="10">Ä„</l:l>
+<l:l i="10">Ä…</l:l>
+<l:l i="10">Ç</l:l>
+<l:l i="10">ÇŽ</l:l>
+<l:l i="10">Çž</l:l>
+<l:l i="10">ÇŸ</l:l>
+<l:l i="10">Ç </l:l>
+<l:l i="10">Ç¡</l:l>
+<l:l i="10">Ǻ</l:l>
+<l:l i="10">Ç»</l:l>
+<l:l i="10">È€</l:l>
+<l:l i="10">È</l:l>
+<l:l i="10">È‚</l:l>
+<l:l i="10">ȃ</l:l>
+<l:l i="10">Ȧ</l:l>
+<l:l i="10">ȧ</l:l>
+<l:l i="10">Ḁ</l:l>
+<l:l i="10">á¸</l:l>
+<l:l i="10">ẚ</l:l>
+<l:l i="10">Ạ</l:l>
+<l:l i="10">ạ</l:l>
+<l:l i="10">Ả</l:l>
+<l:l i="10">ả</l:l>
+<l:l i="10">Ấ</l:l>
+<l:l i="10">ấ</l:l>
+<l:l i="10">Ầ</l:l>
+<l:l i="10">ầ</l:l>
+<l:l i="10">Ẩ</l:l>
+<l:l i="10">ẩ</l:l>
+<l:l i="10">Ẫ</l:l>
+<l:l i="10">ẫ</l:l>
+<l:l i="10">Ậ</l:l>
+<l:l i="10">ậ</l:l>
+<l:l i="10">Ắ</l:l>
+<l:l i="10">ắ</l:l>
+<l:l i="10">Ằ</l:l>
+<l:l i="10">ằ</l:l>
+<l:l i="10">Ẳ</l:l>
+<l:l i="10">ẳ</l:l>
+<l:l i="10">Ẵ</l:l>
+<l:l i="10">ẵ</l:l>
+<l:l i="10">Ặ</l:l>
+<l:l i="10">ặ</l:l>
+<l:l i="20">B</l:l>
+<l:l i="20">b</l:l>
+<l:l i="20">Æ€</l:l>
+<l:l i="20">Æ</l:l>
+<l:l i="20">É“</l:l>
+<l:l i="20">Æ‚</l:l>
+<l:l i="20">ƃ</l:l>
+<l:l i="20">Ḃ</l:l>
+<l:l i="20">ḃ</l:l>
+<l:l i="20">Ḅ</l:l>
+<l:l i="20">ḅ</l:l>
+<l:l i="20">Ḇ</l:l>
+<l:l i="20">ḇ</l:l>
+<l:l i="30">C</l:l>
+<l:l i="30">c</l:l>
+<l:l i="30">Ç</l:l>
+<l:l i="30">ç</l:l>
+<l:l i="30">Ć</l:l>
+<l:l i="30">ć</l:l>
+<l:l i="30">Ĉ</l:l>
+<l:l i="30">ĉ</l:l>
+<l:l i="30">ÄŠ</l:l>
+<l:l i="30">Ä‹</l:l>
+<l:l i="30">Č</l:l>
+<l:l i="30">Ä</l:l>
+<l:l i="30">Ƈ</l:l>
+<l:l i="30">ƈ</l:l>
+<l:l i="30">É•</l:l>
+<l:l i="30">Ḉ</l:l>
+<l:l i="30">ḉ</l:l>
+<l:l i="40">D</l:l>
+<l:l i="40">d</l:l>
+<l:l i="40">ÄŽ</l:l>
+<l:l i="40">Ä</l:l>
+<l:l i="40">Ä</l:l>
+<l:l i="40">Ä‘</l:l>
+<l:l i="40">ÆŠ</l:l>
+<l:l i="40">É—</l:l>
+<l:l i="40">Æ‹</l:l>
+<l:l i="40">ƌ</l:l>
+<l:l i="40">Ç…</l:l>
+<l:l i="40">Dz</l:l>
+<l:l i="40">È¡</l:l>
+<l:l i="40">É–</l:l>
+<l:l i="40">Ḋ</l:l>
+<l:l i="40">ḋ</l:l>
+<l:l i="40">Ḍ</l:l>
+<l:l i="40">á¸</l:l>
+<l:l i="40">Ḏ</l:l>
+<l:l i="40">á¸</l:l>
+<l:l i="40">á¸</l:l>
+<l:l i="40">ḑ</l:l>
+<l:l i="40">Ḓ</l:l>
+<l:l i="40">ḓ</l:l>
+<l:l i="50">E</l:l>
+<l:l i="50">e</l:l>
+<l:l i="50">È</l:l>
+<l:l i="50">è</l:l>
+<l:l i="50">É</l:l>
+<l:l i="50">é</l:l>
+<l:l i="50">Ê</l:l>
+<l:l i="50">ê</l:l>
+<l:l i="50">Ë</l:l>
+<l:l i="50">ë</l:l>
+<l:l i="50">Ä’</l:l>
+<l:l i="50">Ä“</l:l>
+<l:l i="50">Ä”</l:l>
+<l:l i="50">Ä•</l:l>
+<l:l i="50">Ä–</l:l>
+<l:l i="50">Ä—</l:l>
+<l:l i="50">Ę</l:l>
+<l:l i="50">Ä™</l:l>
+<l:l i="50">Äš</l:l>
+<l:l i="50">Ä›</l:l>
+<l:l i="50">È„</l:l>
+<l:l i="50">È…</l:l>
+<l:l i="50">Ȇ</l:l>
+<l:l i="50">ȇ</l:l>
+<l:l i="50">Ȩ</l:l>
+<l:l i="50">È©</l:l>
+<l:l i="50">Ḕ</l:l>
+<l:l i="50">ḕ</l:l>
+<l:l i="50">Ḗ</l:l>
+<l:l i="50">ḗ</l:l>
+<l:l i="50">Ḙ</l:l>
+<l:l i="50">ḙ</l:l>
+<l:l i="50">Ḛ</l:l>
+<l:l i="50">ḛ</l:l>
+<l:l i="50">Ḝ</l:l>
+<l:l i="50">á¸</l:l>
+<l:l i="50">Ẹ</l:l>
+<l:l i="50">ẹ</l:l>
+<l:l i="50">Ẻ</l:l>
+<l:l i="50">ẻ</l:l>
+<l:l i="50">Ẽ</l:l>
+<l:l i="50">ẽ</l:l>
+<l:l i="50">Ế</l:l>
+<l:l i="50">ế</l:l>
+<l:l i="50">Ề</l:l>
+<l:l i="50">á»</l:l>
+<l:l i="50">Ể</l:l>
+<l:l i="50">ể</l:l>
+<l:l i="50">Ễ</l:l>
+<l:l i="50">á»…</l:l>
+<l:l i="50">Ệ</l:l>
+<l:l i="50">ệ</l:l>
+<l:l i="60">F</l:l>
+<l:l i="60">f</l:l>
+<l:l i="60">Æ‘</l:l>
+<l:l i="60">Æ’</l:l>
+<l:l i="60">Ḟ</l:l>
+<l:l i="60">ḟ</l:l>
+<l:l i="70">G</l:l>
+<l:l i="70">g</l:l>
+<l:l i="70">Ĝ</l:l>
+<l:l i="70">Ä</l:l>
+<l:l i="70">Äž</l:l>
+<l:l i="70">ÄŸ</l:l>
+<l:l i="70">Ä </l:l>
+<l:l i="70">Ä¡</l:l>
+<l:l i="70">Ä¢</l:l>
+<l:l i="70">Ä£</l:l>
+<l:l i="70">Æ“</l:l>
+<l:l i="70">É </l:l>
+<l:l i="70">Ǥ</l:l>
+<l:l i="70">Ç¥</l:l>
+<l:l i="70">Ǧ</l:l>
+<l:l i="70">ǧ</l:l>
+<l:l i="70">Ç´</l:l>
+<l:l i="70">ǵ</l:l>
+<l:l i="70">Ḡ</l:l>
+<l:l i="70">ḡ</l:l>
+<l:l i="80">H</l:l>
+<l:l i="80">h</l:l>
+<l:l i="80">Ĥ</l:l>
+<l:l i="80">Ä¥</l:l>
+<l:l i="80">Ħ</l:l>
+<l:l i="80">ħ</l:l>
+<l:l i="80">Èž</l:l>
+<l:l i="80">ÈŸ</l:l>
+<l:l i="80">ɦ</l:l>
+<l:l i="80">Ḣ</l:l>
+<l:l i="80">ḣ</l:l>
+<l:l i="80">Ḥ</l:l>
+<l:l i="80">ḥ</l:l>
+<l:l i="80">Ḧ</l:l>
+<l:l i="80">ḧ</l:l>
+<l:l i="80">Ḩ</l:l>
+<l:l i="80">ḩ</l:l>
+<l:l i="80">Ḫ</l:l>
+<l:l i="80">ḫ</l:l>
+<l:l i="80">ẖ</l:l>
+<l:l i="90">I</l:l>
+<l:l i="90">i</l:l>
+<l:l i="90">Ì</l:l>
+<l:l i="90">ì</l:l>
+<l:l i="90">Ã</l:l>
+<l:l i="90">í</l:l>
+<l:l i="90">ÃŽ</l:l>
+<l:l i="90">î</l:l>
+<l:l i="90">Ã</l:l>
+<l:l i="90">ï</l:l>
+<l:l i="90">Ĩ</l:l>
+<l:l i="90">Ä©</l:l>
+<l:l i="90">Ī</l:l>
+<l:l i="90">Ä«</l:l>
+<l:l i="90">Ĭ</l:l>
+<l:l i="90">Ä­</l:l>
+<l:l i="90">Ä®</l:l>
+<l:l i="90">į</l:l>
+<l:l i="90">Ä°</l:l>
+<l:l i="90">Æ—</l:l>
+<l:l i="90">ɨ</l:l>
+<l:l i="90">Ç</l:l>
+<l:l i="90">Ç</l:l>
+<l:l i="90">Ȉ</l:l>
+<l:l i="90">ȉ</l:l>
+<l:l i="90">ÈŠ</l:l>
+<l:l i="90">È‹</l:l>
+<l:l i="90">Ḭ</l:l>
+<l:l i="90">ḭ</l:l>
+<l:l i="90">Ḯ</l:l>
+<l:l i="90">ḯ</l:l>
+<l:l i="90">Ỉ</l:l>
+<l:l i="90">ỉ</l:l>
+<l:l i="90">Ị</l:l>
+<l:l i="90">ị</l:l>
+<l:l i="100">J</l:l>
+<l:l i="100">j</l:l>
+<l:l i="100">Ä´</l:l>
+<l:l i="100">ĵ</l:l>
+<l:l i="100">Ç°</l:l>
+<l:l i="100">Ê</l:l>
+<l:l i="110">K</l:l>
+<l:l i="110">k</l:l>
+<l:l i="110">Ķ</l:l>
+<l:l i="110">Ä·</l:l>
+<l:l i="110">Ƙ</l:l>
+<l:l i="110">Æ™</l:l>
+<l:l i="110">Ǩ</l:l>
+<l:l i="110">Ç©</l:l>
+<l:l i="110">Ḱ</l:l>
+<l:l i="110">ḱ</l:l>
+<l:l i="110">Ḳ</l:l>
+<l:l i="110">ḳ</l:l>
+<l:l i="110">Ḵ</l:l>
+<l:l i="110">ḵ</l:l>
+<l:l i="120">L</l:l>
+<l:l i="120">l</l:l>
+<l:l i="120">Ĺ</l:l>
+<l:l i="120">ĺ</l:l>
+<l:l i="120">Ä»</l:l>
+<l:l i="120">ļ</l:l>
+<l:l i="120">Ľ</l:l>
+<l:l i="120">ľ</l:l>
+<l:l i="120">Ä¿</l:l>
+<l:l i="120">Å€</l:l>
+<l:l i="120">Å</l:l>
+<l:l i="120">Å‚</l:l>
+<l:l i="120">Æš</l:l>
+<l:l i="120">Lj</l:l>
+<l:l i="120">È´</l:l>
+<l:l i="120">É«</l:l>
+<l:l i="120">ɬ</l:l>
+<l:l i="120">É­</l:l>
+<l:l i="120">Ḷ</l:l>
+<l:l i="120">ḷ</l:l>
+<l:l i="120">Ḹ</l:l>
+<l:l i="120">ḹ</l:l>
+<l:l i="120">Ḻ</l:l>
+<l:l i="120">ḻ</l:l>
+<l:l i="120">Ḽ</l:l>
+<l:l i="120">ḽ</l:l>
+<l:l i="130">M</l:l>
+<l:l i="130">m</l:l>
+<l:l i="130">ɱ</l:l>
+<l:l i="130">Ḿ</l:l>
+<l:l i="130">ḿ</l:l>
+<l:l i="130">á¹€</l:l>
+<l:l i="130">á¹</l:l>
+<l:l i="130">Ṃ</l:l>
+<l:l i="130">ṃ</l:l>
+<l:l i="140">N</l:l>
+<l:l i="140">n</l:l>
+<l:l i="140">Ñ</l:l>
+<l:l i="140">ñ</l:l>
+<l:l i="140">Ń</l:l>
+<l:l i="140">Å„</l:l>
+<l:l i="140">Å…</l:l>
+<l:l i="140">ņ</l:l>
+<l:l i="140">Ň</l:l>
+<l:l i="140">ň</l:l>
+<l:l i="140">Æ</l:l>
+<l:l i="140">ɲ</l:l>
+<l:l i="140">Æž</l:l>
+<l:l i="140">È </l:l>
+<l:l i="140">Ç‹</l:l>
+<l:l i="140">Ǹ</l:l>
+<l:l i="140">ǹ</l:l>
+<l:l i="140">ȵ</l:l>
+<l:l i="140">ɳ</l:l>
+<l:l i="140">Ṅ</l:l>
+<l:l i="140">á¹…</l:l>
+<l:l i="140">Ṇ</l:l>
+<l:l i="140">ṇ</l:l>
+<l:l i="140">Ṉ</l:l>
+<l:l i="140">ṉ</l:l>
+<l:l i="140">Ṋ</l:l>
+<l:l i="140">ṋ</l:l>
+<l:l i="150">O</l:l>
+<l:l i="150">o</l:l>
+<l:l i="150">Ã’</l:l>
+<l:l i="150">ò</l:l>
+<l:l i="150">Ó</l:l>
+<l:l i="150">ó</l:l>
+<l:l i="150">Ô</l:l>
+<l:l i="150">ô</l:l>
+<l:l i="150">Õ</l:l>
+<l:l i="150">õ</l:l>
+<l:l i="150">Ö</l:l>
+<l:l i="150">ö</l:l>
+<l:l i="150">Ø</l:l>
+<l:l i="150">ø</l:l>
+<l:l i="150">Ō</l:l>
+<l:l i="150">Å</l:l>
+<l:l i="150">ÅŽ</l:l>
+<l:l i="150">Å</l:l>
+<l:l i="150">Å</l:l>
+<l:l i="150">Å‘</l:l>
+<l:l i="150">ÆŸ</l:l>
+<l:l i="150">Æ </l:l>
+<l:l i="150">Æ¡</l:l>
+<l:l i="150">Ç‘</l:l>
+<l:l i="150">Ç’</l:l>
+<l:l i="150">Ǫ</l:l>
+<l:l i="150">Ç«</l:l>
+<l:l i="150">Ǭ</l:l>
+<l:l i="150">Ç­</l:l>
+<l:l i="150">Ǿ</l:l>
+<l:l i="150">Ç¿</l:l>
+<l:l i="150">Ȍ</l:l>
+<l:l i="150">È</l:l>
+<l:l i="150">ÈŽ</l:l>
+<l:l i="150">È</l:l>
+<l:l i="150">Ȫ</l:l>
+<l:l i="150">È«</l:l>
+<l:l i="150">Ȭ</l:l>
+<l:l i="150">È­</l:l>
+<l:l i="150">È®</l:l>
+<l:l i="150">ȯ</l:l>
+<l:l i="150">È°</l:l>
+<l:l i="150">ȱ</l:l>
+<l:l i="150">Ṍ</l:l>
+<l:l i="150">á¹</l:l>
+<l:l i="150">Ṏ</l:l>
+<l:l i="150">á¹</l:l>
+<l:l i="150">á¹</l:l>
+<l:l i="150">ṑ</l:l>
+<l:l i="150">á¹’</l:l>
+<l:l i="150">ṓ</l:l>
+<l:l i="150">Ọ</l:l>
+<l:l i="150">á»</l:l>
+<l:l i="150">Ỏ</l:l>
+<l:l i="150">á»</l:l>
+<l:l i="150">á»</l:l>
+<l:l i="150">ố</l:l>
+<l:l i="150">á»’</l:l>
+<l:l i="150">ồ</l:l>
+<l:l i="150">á»”</l:l>
+<l:l i="150">ổ</l:l>
+<l:l i="150">á»–</l:l>
+<l:l i="150">á»—</l:l>
+<l:l i="150">Ộ</l:l>
+<l:l i="150">á»™</l:l>
+<l:l i="150">Ớ</l:l>
+<l:l i="150">á»›</l:l>
+<l:l i="150">Ờ</l:l>
+<l:l i="150">á»</l:l>
+<l:l i="150">Ở</l:l>
+<l:l i="150">ở</l:l>
+<l:l i="150">á» </l:l>
+<l:l i="150">ỡ</l:l>
+<l:l i="150">Ợ</l:l>
+<l:l i="150">ợ</l:l>
+<l:l i="160">P</l:l>
+<l:l i="160">p</l:l>
+<l:l i="160">Ƥ</l:l>
+<l:l i="160">Æ¥</l:l>
+<l:l i="160">á¹”</l:l>
+<l:l i="160">ṕ</l:l>
+<l:l i="160">á¹–</l:l>
+<l:l i="160">á¹—</l:l>
+<l:l i="170">Q</l:l>
+<l:l i="170">q</l:l>
+<l:l i="170">Ê </l:l>
+<l:l i="180">R</l:l>
+<l:l i="180">r</l:l>
+<l:l i="180">Å”</l:l>
+<l:l i="180">Å•</l:l>
+<l:l i="180">Å–</l:l>
+<l:l i="180">Å—</l:l>
+<l:l i="180">Ř</l:l>
+<l:l i="180">Å™</l:l>
+<l:l i="180">È</l:l>
+<l:l i="180">È‘</l:l>
+<l:l i="180">È’</l:l>
+<l:l i="180">È“</l:l>
+<l:l i="180">ɼ</l:l>
+<l:l i="180">ɽ</l:l>
+<l:l i="180">ɾ</l:l>
+<l:l i="180">Ṙ</l:l>
+<l:l i="180">á¹™</l:l>
+<l:l i="180">Ṛ</l:l>
+<l:l i="180">á¹›</l:l>
+<l:l i="180">Ṝ</l:l>
+<l:l i="180">á¹</l:l>
+<l:l i="180">Ṟ</l:l>
+<l:l i="180">ṟ</l:l>
+<l:l i="190">S</l:l>
+<l:l i="190">s</l:l>
+<l:l i="190">Åš</l:l>
+<l:l i="190">Å›</l:l>
+<l:l i="190">Ŝ</l:l>
+<l:l i="190">Å</l:l>
+<l:l i="190">Åž</l:l>
+<l:l i="190">ÅŸ</l:l>
+<l:l i="190">Å </l:l>
+<l:l i="190">Å¡</l:l>
+<l:l i="190">Ș</l:l>
+<l:l i="190">È™</l:l>
+<l:l i="190">Ê‚</l:l>
+<l:l i="190">á¹ </l:l>
+<l:l i="190">ṡ</l:l>
+<l:l i="190">á¹¢</l:l>
+<l:l i="190">á¹£</l:l>
+<l:l i="190">Ṥ</l:l>
+<l:l i="190">á¹¥</l:l>
+<l:l i="190">Ṧ</l:l>
+<l:l i="190">ṧ</l:l>
+<l:l i="190">Ṩ</l:l>
+<l:l i="190">ṩ</l:l>
+<l:l i="200">T</l:l>
+<l:l i="200">t</l:l>
+<l:l i="200">Å¢</l:l>
+<l:l i="200">Å£</l:l>
+<l:l i="200">Ť</l:l>
+<l:l i="200">Å¥</l:l>
+<l:l i="200">Ŧ</l:l>
+<l:l i="200">ŧ</l:l>
+<l:l i="200">Æ«</l:l>
+<l:l i="200">Ƭ</l:l>
+<l:l i="200">Æ­</l:l>
+<l:l i="200">Æ®</l:l>
+<l:l i="200">ʈ</l:l>
+<l:l i="200">Èš</l:l>
+<l:l i="200">È›</l:l>
+<l:l i="200">ȶ</l:l>
+<l:l i="200">Ṫ</l:l>
+<l:l i="200">ṫ</l:l>
+<l:l i="200">Ṭ</l:l>
+<l:l i="200">á¹­</l:l>
+<l:l i="200">á¹®</l:l>
+<l:l i="200">ṯ</l:l>
+<l:l i="200">á¹°</l:l>
+<l:l i="200">á¹±</l:l>
+<l:l i="200">ẗ</l:l>
+<l:l i="210">U</l:l>
+<l:l i="210">u</l:l>
+<l:l i="210">Ù</l:l>
+<l:l i="210">ù</l:l>
+<l:l i="210">Ú</l:l>
+<l:l i="210">ú</l:l>
+<l:l i="210">Û</l:l>
+<l:l i="210">û</l:l>
+<l:l i="210">Ü</l:l>
+<l:l i="210">ü</l:l>
+<l:l i="210">Ũ</l:l>
+<l:l i="210">Å©</l:l>
+<l:l i="210">Ū</l:l>
+<l:l i="210">Å«</l:l>
+<l:l i="210">Ŭ</l:l>
+<l:l i="210">Å­</l:l>
+<l:l i="210">Å®</l:l>
+<l:l i="210">ů</l:l>
+<l:l i="210">Å°</l:l>
+<l:l i="210">ű</l:l>
+<l:l i="210">Ų</l:l>
+<l:l i="210">ų</l:l>
+<l:l i="210">Ư</l:l>
+<l:l i="210">Æ°</l:l>
+<l:l i="210">Ç“</l:l>
+<l:l i="210">Ç”</l:l>
+<l:l i="210">Ç•</l:l>
+<l:l i="210">Ç–</l:l>
+<l:l i="210">Ç—</l:l>
+<l:l i="210">ǘ</l:l>
+<l:l i="210">Ç™</l:l>
+<l:l i="210">Çš</l:l>
+<l:l i="210">Ç›</l:l>
+<l:l i="210">ǜ</l:l>
+<l:l i="210">È”</l:l>
+<l:l i="210">È•</l:l>
+<l:l i="210">È–</l:l>
+<l:l i="210">È—</l:l>
+<l:l i="210">á¹²</l:l>
+<l:l i="210">á¹³</l:l>
+<l:l i="210">á¹´</l:l>
+<l:l i="210">á¹µ</l:l>
+<l:l i="210">Ṷ</l:l>
+<l:l i="210">á¹·</l:l>
+<l:l i="210">Ṹ</l:l>
+<l:l i="210">á¹¹</l:l>
+<l:l i="210">Ṻ</l:l>
+<l:l i="210">á¹»</l:l>
+<l:l i="210">Ụ</l:l>
+<l:l i="210">ụ</l:l>
+<l:l i="210">Ủ</l:l>
+<l:l i="210">ủ</l:l>
+<l:l i="210">Ứ</l:l>
+<l:l i="210">ứ</l:l>
+<l:l i="210">Ừ</l:l>
+<l:l i="210">ừ</l:l>
+<l:l i="210">Ử</l:l>
+<l:l i="210">á»­</l:l>
+<l:l i="210">á»®</l:l>
+<l:l i="210">ữ</l:l>
+<l:l i="210">á»°</l:l>
+<l:l i="210">á»±</l:l>
+<l:l i="220">V</l:l>
+<l:l i="220">v</l:l>
+<l:l i="220">Ʋ</l:l>
+<l:l i="220">Ê‹</l:l>
+<l:l i="220">á¹¼</l:l>
+<l:l i="220">á¹½</l:l>
+<l:l i="220">á¹¾</l:l>
+<l:l i="220">ṿ</l:l>
+<l:l i="230">W</l:l>
+<l:l i="230">w</l:l>
+<l:l i="230">Å´</l:l>
+<l:l i="230">ŵ</l:l>
+<l:l i="230">Ẁ</l:l>
+<l:l i="230">áº</l:l>
+<l:l i="230">Ẃ</l:l>
+<l:l i="230">ẃ</l:l>
+<l:l i="230">Ẅ</l:l>
+<l:l i="230">ẅ</l:l>
+<l:l i="230">Ẇ</l:l>
+<l:l i="230">ẇ</l:l>
+<l:l i="230">Ẉ</l:l>
+<l:l i="230">ẉ</l:l>
+<l:l i="230">ẘ</l:l>
+<l:l i="240">X</l:l>
+<l:l i="240">x</l:l>
+<l:l i="240">Ẋ</l:l>
+<l:l i="240">ẋ</l:l>
+<l:l i="240">Ẍ</l:l>
+<l:l i="240">áº</l:l>
+<l:l i="250">Y</l:l>
+<l:l i="250">y</l:l>
+<l:l i="250">Ã</l:l>
+<l:l i="250">ý</l:l>
+<l:l i="250">ÿ</l:l>
+<l:l i="250">Ÿ</l:l>
+<l:l i="250">Ŷ</l:l>
+<l:l i="250">Å·</l:l>
+<l:l i="250">Ƴ</l:l>
+<l:l i="250">Æ´</l:l>
+<l:l i="250">Ȳ</l:l>
+<l:l i="250">ȳ</l:l>
+<l:l i="250">Ẏ</l:l>
+<l:l i="250">áº</l:l>
+<l:l i="250">ẙ</l:l>
+<l:l i="250">Ỳ</l:l>
+<l:l i="250">ỳ</l:l>
+<l:l i="250">á»´</l:l>
+<l:l i="250">ỵ</l:l>
+<l:l i="250">Ỷ</l:l>
+<l:l i="250">á»·</l:l>
+<l:l i="250">Ỹ</l:l>
+<l:l i="250">ỹ</l:l>
+<l:l i="260">Z</l:l>
+<l:l i="260">z</l:l>
+<l:l i="260">Ź</l:l>
+<l:l i="260">ź</l:l>
+<l:l i="260">Å»</l:l>
+<l:l i="260">ż</l:l>
+<l:l i="260">Ž</l:l>
+<l:l i="260">ž</l:l>
+<l:l i="260">Ƶ</l:l>
+<l:l i="260">ƶ</l:l>
+<l:l i="260">Ȥ</l:l>
+<l:l i="260">È¥</l:l>
+<l:l i="260">Ê</l:l>
+<l:l i="260">Ê‘</l:l>
+<l:l i="260">áº</l:l>
+<l:l i="260">ẑ</l:l>
+<l:l i="260">Ẓ</l:l>
+<l:l i="260">ẓ</l:l>
+<l:l i="260">Ẕ</l:l>
+<l:l i="260">ẕ</l:l>
+</l:letters>
+</l:l10n>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/sq.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/sq.xml
new file mode 100644
index 0000000..b566918
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/sq.xml
@@ -0,0 +1,1229 @@
+<?xml version="1.0" encoding="utf-8"?>
+<l:l10n xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0" language="sq" english-language-name="Albanian">
+
+<!-- * This file is generated automatically. -->
+<!-- * To submit changes to this file upstream (to the DocBook Project) -->
+<!-- * do not submit an edited version of this file. Instead, submit an -->
+<!-- * edited version of the source file at the following location: -->
+<!-- * -->
+<!-- * https://docbook.svn.sourceforge.net/svnroot/docbook/trunk/gentext/locale/sq.xml -->
+<!-- * -->
+<!-- * E-mail the edited sq.xml source file to: -->
+<!-- * -->
+<!-- * docbook-developers@lists.sourceforge.net -->
+
+<!-- ******************************************************************** -->
+
+<!-- This file is part of the XSL DocBook Stylesheet distribution. -->
+<!-- See ../README or http://docbook.sf.net/release/xsl/current/ for -->
+<!-- copyright and other information. -->
+
+<!-- ******************************************************************** -->
+<!-- In these files, % with a letter is used for a placeholder: -->
+<!-- %t is the current element's title -->
+<!-- %s is the current element's subtitle (if applicable)-->
+<!-- %n is the current element's number label-->
+<!-- %p is the current element's page number (if applicable)-->
+<!-- ******************************************************************** -->
+
+
+<l:gentext key="Abstract" text="Përshkrimi"/>
+<l:gentext key="abstract" text="Përshkrimi"/>
+<l:gentext key="Acknowledgements" text="Acknowledgements" lang="en"/>
+<l:gentext key="acknowledgements" text="Acknowledgements" lang="en"/>
+<l:gentext key="Answer" text="P:"/>
+<l:gentext key="answer" text="P:"/>
+<l:gentext key="Appendix" text="Shtesë"/>
+<l:gentext key="appendix" text="Shtesë"/>
+<l:gentext key="Article" text="Artikull"/>
+<l:gentext key="article" text="Artikull"/>
+<l:gentext key="Author" text="Autorë"/>
+<l:gentext key="Bibliography" text="Bibliografia"/>
+<l:gentext key="bibliography" text="Bibliografia"/>
+<l:gentext key="Book" text="Libri"/>
+<l:gentext key="book" text="Libri"/>
+<l:gentext key="CAUTION" text="KUJDES"/>
+<l:gentext key="Caution" text="Kujdes"/>
+<l:gentext key="caution" text="Kujdes"/>
+<l:gentext key="Chapter" text="Kapitulli"/>
+<l:gentext key="chapter" text="kapitulli"/>
+<l:gentext key="Colophon" text="Shënime publikimi"/>
+<l:gentext key="colophon" text="shënime publikimi"/>
+<l:gentext key="Copyright" text="Copyright"/>
+<l:gentext key="copyright" text="Copyright"/>
+<l:gentext key="Dedication" text="Përkushtim"/>
+<l:gentext key="dedication" text="Përkushtim"/>
+<l:gentext key="Edition" text="Versioni"/>
+<l:gentext key="edition" text="Versioni"/>
+<l:gentext key="Editor" text="Editor" lang="en"/>
+<l:gentext key="Equation" text="Ekuacion"/>
+<l:gentext key="equation" text="Ekuacion"/>
+<l:gentext key="Example" text="Shembull"/>
+<l:gentext key="example" text="Shembull"/>
+<l:gentext key="Figure" text="Figura"/>
+<l:gentext key="figure" text="Figura"/>
+<l:gentext key="Glossary" text="Fjalori"/>
+<l:gentext key="glossary" text="Fjalori"/>
+<l:gentext key="GlossSee" text="Shiko"/>
+<l:gentext key="glosssee" text="Shiko"/>
+<l:gentext key="GlossSeeAlso" text="Shiko Edhe"/>
+<l:gentext key="glossseealso" text="Shiko Edhe"/>
+<l:gentext key="IMPORTANT" text="ME RËNDËSI"/>
+<l:gentext key="important" text="Me rëndësi"/>
+<l:gentext key="Important" text="Me rëndësi"/>
+<l:gentext key="Index" text="Treguesi"/>
+<l:gentext key="index" text="Treguesi"/>
+<l:gentext key="ISBN" text="ISBN"/>
+<l:gentext key="isbn" text="ISBN"/>
+<l:gentext key="LegalNotice" text="Shënime Legale"/>
+<l:gentext key="legalnotice" text="Shënime Legale"/>
+<l:gentext key="MsgAud" text="Publiku"/>
+<l:gentext key="msgaud" text="Publiku"/>
+<l:gentext key="MsgLevel" text="Niveli"/>
+<l:gentext key="msglevel" text="Niveli"/>
+<l:gentext key="MsgOrig" text="Origjina"/>
+<l:gentext key="msgorig" text="Origjina"/>
+<l:gentext key="NOTE" text="SHËNIM"/>
+<l:gentext key="Note" text="Shënim"/>
+<l:gentext key="note" text="Shënim"/>
+<l:gentext key="Part" text="Pjesa"/>
+<l:gentext key="part" text="Pjesa"/>
+<l:gentext key="Preface" text="Parathënie"/>
+<l:gentext key="preface" text="Parathënie"/>
+<l:gentext key="Procedure" text="Proçedura"/>
+<l:gentext key="procedure" text="Proçedura"/>
+<l:gentext key="ProductionSet" text="Prodhimi"/>
+<l:gentext key="PubDate" text="Data Publikimit"/>
+<l:gentext key="pubdate" text="Data e publikimit"/>
+<l:gentext key="Published" text="Publikuar"/>
+<l:gentext key="published" text="Publikuar"/>
+<l:gentext key="Publisher" text="Publisher" lang="en"/>
+<l:gentext key="Qandadiv" text="P &amp; P"/>
+<l:gentext key="qandadiv" text="P &amp; P"/>
+<l:gentext key="QandASet" text="Frequently Asked Questions" lang="en"/>
+<l:gentext key="Question" text="Q:"/>
+<l:gentext key="question" text="Q:"/>
+<l:gentext key="RefEntry" text=""/>
+<l:gentext key="refentry" text=""/>
+<l:gentext key="Reference" text="Riferim"/>
+<l:gentext key="reference" text="Riferim"/>
+<l:gentext key="References" text="References" lang="en"/>
+<l:gentext key="RefName" text="Emri"/>
+<l:gentext key="refname" text="Emri"/>
+<l:gentext key="RefSection" text=""/>
+<l:gentext key="refsection" text=""/>
+<l:gentext key="RefSynopsisDiv" text="Përshkrimi"/>
+<l:gentext key="refsynopsisdiv" text="Përshkrimi"/>
+<l:gentext key="RevHistory" text="Ditari i Revizioneve"/>
+<l:gentext key="revhistory" text="Ditari i Revizioneve"/>
+<l:gentext key="revision" text="Revizioni"/>
+<l:gentext key="Revision" text="Revizioni"/>
+<l:gentext key="sect1" text="Seksioni"/>
+<l:gentext key="sect2" text="Seksioni"/>
+<l:gentext key="sect3" text="Seksioni"/>
+<l:gentext key="sect4" text="Seksioni"/>
+<l:gentext key="sect5" text="Seksioni"/>
+<l:gentext key="section" text="Seksioni"/>
+<l:gentext key="Section" text="Seksioni"/>
+<l:gentext key="see" text="shiko"/>
+<l:gentext key="See" text="Shiko"/>
+<l:gentext key="seealso" text="shiko gjithashtu"/>
+<l:gentext key="Seealso" text="Shiko gjithashtu"/>
+<l:gentext key="SeeAlso" text="Shiko Gjithashtu"/>
+<l:gentext key="set" text="Përmbledhje"/>
+<l:gentext key="Set" text="Përmbledhje"/>
+<l:gentext key="setindex" text="Treguesi i Përmbledhjes"/>
+<l:gentext key="SetIndex" text="Treguesi i Përmbledhjes"/>
+<l:gentext key="Sidebar" text=""/>
+<l:gentext key="sidebar" text="shënim anësor"/>
+<l:gentext key="step" text="hapi"/>
+<l:gentext key="Step" text="Hapi"/>
+<l:gentext key="table" text="Tabela"/>
+<l:gentext key="Table" text="Tabela"/>
+<l:gentext key="task" text="Task" lang="en"/>
+<l:gentext key="Task" text="Task" lang="en"/>
+<l:gentext key="tip" text="Propozim"/>
+<l:gentext key="TIP" text="PROPOZIM"/>
+<l:gentext key="Tip" text="Propozim"/>
+<l:gentext key="Warning" text="Paralajmërim"/>
+<l:gentext key="warning" text="Paralajmërim"/>
+<l:gentext key="WARNING" text="PARALAJMËRIM"/>
+<l:gentext key="and" text="dhe"/>
+<l:gentext key="by" text="nga"/>
+<l:gentext key="Edited" text="Shkruar"/>
+<l:gentext key="edited" text="Shkruar"/>
+<l:gentext key="Editedby" text="Shkruar nga"/>
+<l:gentext key="editedby" text="Shkruar nga"/>
+<l:gentext key="in" text="në"/>
+<l:gentext key="lastlistcomma" text=","/>
+<l:gentext key="listcomma" text=","/>
+<l:gentext key="notes" text="Shënime"/>
+<l:gentext key="Notes" text="Shënime"/>
+<l:gentext key="Pgs" text="Fq."/>
+<l:gentext key="pgs" text="Fq."/>
+<l:gentext key="Revisedby" text="Rishikuar nga: "/>
+<l:gentext key="revisedby" text="Rishikuar nga: "/>
+<l:gentext key="TableNotes" text="Shënime"/>
+<l:gentext key="tablenotes" text="Shënime"/>
+<l:gentext key="TableofContents" text="Tabela e përmbajtjes"/>
+<l:gentext key="tableofcontents" text="Tabela e Përmbajtjes"/>
+<l:gentext key="unexpectedelementname" text="Emër i papritur elementi"/>
+<l:gentext key="unsupported" text="nuk suportohet"/>
+<l:gentext key="xrefto" text="riferiment me"/>
+<l:gentext key="Authors" text="Authors" lang="en"/>
+<l:gentext key="copyeditor" text="Copy Editor" lang="en"/>
+<l:gentext key="graphicdesigner" text="Graphic Designer" lang="en"/>
+<l:gentext key="productioneditor" text="Production Editor" lang="en"/>
+<l:gentext key="technicaleditor" text="Technical Editor" lang="en"/>
+<l:gentext key="translator" text="Translator" lang="en"/>
+<l:gentext key="listofequations" text="Lista e Ekuacioneve"/>
+<l:gentext key="ListofEquations" text="Lista e Ekuacioneve"/>
+<l:gentext key="ListofExamples" text="Lista e Shembujve"/>
+<l:gentext key="listofexamples" text="Lista e Shembujve"/>
+<l:gentext key="ListofFigures" text="Lista e Figurave"/>
+<l:gentext key="listoffigures" text="Lista e Figurave"/>
+<l:gentext key="ListofProcedures" text="Lista e Proçedurave"/>
+<l:gentext key="listofprocedures" text="Lista e Proçedurave"/>
+<l:gentext key="listoftables" text="Lista e Tabelave"/>
+<l:gentext key="ListofTables" text="Lista e Tabelave"/>
+<l:gentext key="ListofUnknown" text="Lista e të Panjohurave"/>
+<l:gentext key="listofunknown" text="Lista e të Panjohurave"/>
+<l:gentext key="nav-home" text="Fillimi"/>
+<l:gentext key="nav-next" text="Vazhdo"/>
+<l:gentext key="nav-next-sibling" text="Para me Shpejtësi"/>
+<l:gentext key="nav-prev" text="Mbrapa"/>
+<l:gentext key="nav-prev-sibling" text="Mbrapsht me Shpejtësi"/>
+<l:gentext key="nav-up" text="Sipër"/>
+<l:gentext key="nav-toc" text="TeP"/>
+<l:gentext key="Draft" text="Kopje prove"/>
+<l:gentext key="above" text="sipër"/>
+<l:gentext key="below" text="poshtë"/>
+<l:gentext key="sectioncalled" text="seksioni i quajtur"/>
+<l:gentext key="index symbols" text="Simbole"/>
+<l:gentext key="writing-mode" text="lr-tb"/>
+<l:gentext key="lowercase.alpha" text="abcdefghijklmnopqrstuvwxyz"/>
+<l:gentext key="uppercase.alpha" text="ABCDEFGHIJKLMNOPQRSTUVWXYZ"/>
+<l:gentext key="normalize.sort.input" text="AaÀàÃáÂâÃãÄäÅåĀÄĂ㥹ÇǎǞǟǠǡǺǻȀÈȂȃȦȧḀá¸áºšáº áº¡áº¢áº£áº¤áº¥áº¦áº§áº¨áº©áºªáº«áº¬áº­áº®áº¯áº°áº±áº²áº³áº´áºµáº¶áº·BbÆ€ÆɓƂƃḂḃḄḅḆḇCcÇçĆćĈĉĊċČÄƇƈɕḈḉDdÄŽÄÄđƊɗƋƌDžDzȡɖḊḋḌá¸á¸Žá¸á¸á¸‘ḒḓEeÈèÉéÊêËëĒēĔĕĖėĘęĚěȄȅȆȇȨȩḔḕḖḗḘḙḚḛḜá¸áº¸áº¹áººáº»áº¼áº½áº¾áº¿á»€á»á»‚ểỄễỆệFfƑƒḞḟGgÄœÄĞğĠġĢģƓɠǤǥǦǧǴǵḠḡHhĤĥĦħȞȟɦḢḣḤḥḦḧḨḩḪḫẖIiÌìÃíÎîÃïĨĩĪīĬĭĮįİƗɨÇÇȈȉȊȋḬḭḮḯỈỉỊịJjĴĵǰÊKkĶķƘƙǨǩḰḱḲḳḴḵLlĹĺĻļĽľĿŀÅłƚLjȴɫɬɭḶḷḸḹḺḻḼḽMmɱḾḿṀá¹á¹‚ṃNnÑñŃńŅņŇňÆɲƞȠNjǸǹȵɳṄṅṆṇṈṉṊṋOoÒòÓóÔôÕõÖöØøŌÅÅŽÅÅőƟƠơǑǒǪǫǬǭǾǿȌÈÈŽÈȪȫȬȭȮȯȰȱṌá¹á¹Žá¹á¹á¹‘ṒṓỌá»á»Žá»á»á»‘ỒồỔổỖỗỘộỚớỜá»á»žá»Ÿá» á»¡á»¢á»£PpƤƥṔṕṖṗQqÊ RrŔŕŖŗŘřÈȑȒȓɼɽɾṘṙṚṛṜá¹á¹žá¹ŸSsŚśŜÅŞşŠšȘșʂṠṡṢṣṤṥṦṧṨṩTtŢţŤťŦŧƫƬƭƮʈȚțȶṪṫṬṭṮṯṰṱẗUuÙùÚúÛûÜüŨũŪūŬŭŮůŰűŲųƯưǓǔǕǖǗǘǙǚǛǜȔȕȖȗṲṳṴṵṶṷṸṹṺṻỤụỦủỨứỪừỬửỮữỰựVvƲʋṼṽṾṿWwŴŵẀáºáº‚ẃẄẅẆẇẈẉẘXxẊẋẌáºYyÃýÿŸŶŷƳƴȲȳẎáºáº™á»²á»³á»´á»µá»¶á»·á»¸á»¹ZzŹźŻżŽžƵƶȤȥÊÊ‘áºáº‘ẒẓẔẕẕ" lang="en"/>
+<l:gentext key="normalize.sort.output" text="AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBCCCCCCCCCCCCCCCCCDDDDDDDDDDDDDDDDDDDDDDDDEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEFFFFFFGGGGGGGGGGGGGGGGGGGGHHHHHHHHHHHHHHHHHHHHIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIJJJJJJKKKKKKKKKKKKKKLLLLLLLLLLLLLLLLLLLLLLLLLLMMMMMMMMMNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOPPPPPPPPQQQRRRRRRRRRRRRRRRRRRRRRRRSSSSSSSSSSSSSSSSSSSSSSSTTTTTTTTTTTTTTTTTTTTTTTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUVVVVVVVVWWWWWWWWWWWWWWWXXXXXXYYYYYYYYYYYYYYYYYYYYYYYZZZZZZZZZZZZZZZZZZZZZ" lang="en"/>
+<l:dingbat key="startquote" text="“"/>
+<l:dingbat key="endquote" text="â€"/>
+<l:dingbat key="nestedstartquote" text="‘"/>
+<l:dingbat key="nestedendquote" text="’"/>
+<l:dingbat key="singlestartquote" text="‘"/>
+<l:dingbat key="singleendquote" text="’"/>
+<l:dingbat key="bullet" text="•"/>
+<l:gentext key="hyphenation-character" text="-"/>
+<l:gentext key="hyphenation-push-character-count" text="2"/>
+<l:gentext key="hyphenation-remain-character-count" text="2"/>
+<l:context name="styles"><l:template name="person-name" text="first-last"/>
+</l:context>
+<l:context name="title"><l:template name="abstract" text="%t"/>
+<l:template name="acknowledgements" text="%t" lang="en"/>
+<l:template name="answer" text="%t"/>
+<l:template name="appendix" text="Shtesë %n. %t"/>
+<l:template name="article" text="%t"/>
+<l:template name="authorblurb" text="%t"/>
+<l:template name="bibliodiv" text="%t"/>
+<l:template name="biblioentry" text="%t"/>
+<l:template name="bibliography" text="%t"/>
+<l:template name="bibliolist" text="%t"/>
+<l:template name="bibliomixed" text="%t"/>
+<l:template name="bibliomset" text="%t"/>
+<l:template name="biblioset" text="%t"/>
+<l:template name="blockquote" text="%t"/>
+<l:template name="book" text="%t"/>
+<l:template name="calloutlist" text="%t"/>
+<l:template name="caution" text="%t"/>
+<l:template name="chapter" text="Kapitulli %n. %t"/>
+<l:template name="colophon" text="%t"/>
+<l:template name="dedication" text="%t"/>
+<l:template name="equation" text="Ekuacion %n. %t"/>
+<l:template name="example" text="Shembull %n. %t"/>
+<l:template name="figure" text="Figura %n. %t"/>
+<l:template name="foil" text="%t"/>
+<l:template name="foilgroup" text="%t"/>
+<l:template name="formalpara" text="%t"/>
+<l:template name="glossary" text="%t"/>
+<l:template name="glossdiv" text="%t"/>
+<l:template name="glosslist" text="%t"/>
+<l:template name="glossentry" text="%t"/>
+<l:template name="important" text="%t"/>
+<l:template name="index" text="%t"/>
+<l:template name="indexdiv" text="%t"/>
+<l:template name="itemizedlist" text="%t"/>
+<l:template name="legalnotice" text="%t"/>
+<l:template name="listitem" text=""/>
+<l:template name="lot" text="%t"/>
+<l:template name="msg" text="%t"/>
+<l:template name="msgexplan" text="%t"/>
+<l:template name="msgmain" text="%t"/>
+<l:template name="msgrel" text="%t"/>
+<l:template name="msgset" text="%t"/>
+<l:template name="msgsub" text="%t"/>
+<l:template name="note" text="%t"/>
+<l:template name="orderedlist" text="%t"/>
+<l:template name="part" text="Pjesa %n. %t"/>
+<l:template name="partintro" text="%t"/>
+<l:template name="preface" text="%t"/>
+<l:template name="procedure" text="%t"/>
+<l:template name="procedure.formal" text="Proçedura %n. %t"/>
+<l:template name="productionset" text="%t"/>
+<l:template name="productionset.formal" text="Prodhimi %n"/>
+<l:template name="qandadiv" text="%t"/>
+<l:template name="qandaentry" text="%t"/>
+<l:template name="qandaset" text="%t"/>
+<l:template name="question" text="%t"/>
+<l:template name="refentry" text="%t"/>
+<l:template name="reference" text="%t"/>
+<l:template name="refsection" text="%t"/>
+<l:template name="refsect1" text="%t"/>
+<l:template name="refsect2" text="%t"/>
+<l:template name="refsect3" text="%t"/>
+<l:template name="refsynopsisdiv" text="%t"/>
+<l:template name="refsynopsisdivinfo" text="%t"/>
+<l:template name="segmentedlist" text="%t"/>
+<l:template name="set" text="%t"/>
+<l:template name="setindex" text="%t"/>
+<l:template name="sidebar" text="%t"/>
+<l:template name="step" text="%t"/>
+<l:template name="table" text="Tabela %n. %t"/>
+<l:template name="task" text="%t"/>
+<l:template name="tasksummary" text="%t" lang="en"/>
+<l:template name="taskprerequisites" text="%t" lang="en"/>
+<l:template name="taskrelated" text="%t" lang="en"/>
+<l:template name="tip" text="%t"/>
+<l:template name="toc" text="%t"/>
+<l:template name="variablelist" text="%t"/>
+<l:template name="varlistentry" text=""/>
+<l:template name="warning" text="%t"/>
+</l:context>
+<l:context name="title-unnumbered"><l:template name="appendix" text="%t"/>
+<l:template name="article/appendix" text="%t"/>
+<l:template name="bridgehead" text="%t"/>
+<l:template name="chapter" text="%t"/>
+<l:template name="sect1" text="%t"/>
+<l:template name="sect2" text="%t"/>
+<l:template name="sect3" text="%t"/>
+<l:template name="sect4" text="%t"/>
+<l:template name="sect5" text="%t"/>
+<l:template name="section" text="%t"/>
+<l:template name="simplesect" text="%t"/>
+<l:template name="part" text="%t" lang="en"/>
+</l:context>
+<l:context name="title-numbered"><l:template name="appendix" text="Shtesë %n. %t"/>
+<l:template name="article/appendix" text="%n. %t"/>
+<l:template name="bridgehead" text="%n. %t"/>
+<l:template name="chapter" text="Kapitulli %n. %t"/>
+<l:template name="part" text="Pjesa %n. %t"/>
+<l:template name="sect1" text="%n. %t"/>
+<l:template name="sect2" text="%n. %t"/>
+<l:template name="sect3" text="%n. %t"/>
+<l:template name="sect4" text="%n. %t"/>
+<l:template name="sect5" text="%n. %t"/>
+<l:template name="section" text="%n. %t"/>
+<l:template name="simplesect" text="%t"/>
+</l:context>
+<l:context name="subtitle"><l:template name="appendix" text="%s"/>
+<l:template name="acknowledgements" text="%s" lang="en"/>
+<l:template name="article" text="%s"/>
+<l:template name="bibliodiv" text="%s"/>
+<l:template name="biblioentry" text="%s"/>
+<l:template name="bibliography" text="%s"/>
+<l:template name="bibliomixed" text="%s"/>
+<l:template name="bibliomset" text="%s"/>
+<l:template name="biblioset" text="%s"/>
+<l:template name="book" text="%s"/>
+<l:template name="chapter" text="%s"/>
+<l:template name="colophon" text="%s"/>
+<l:template name="dedication" text="%s"/>
+<l:template name="glossary" text="%s"/>
+<l:template name="glossdiv" text="%s"/>
+<l:template name="index" text="%s"/>
+<l:template name="indexdiv" text="%s"/>
+<l:template name="lot" text="%s"/>
+<l:template name="part" text="%s"/>
+<l:template name="partintro" text="%s"/>
+<l:template name="preface" text="%s"/>
+<l:template name="refentry" text="%s"/>
+<l:template name="reference" text="%s"/>
+<l:template name="refsection" text="%s"/>
+<l:template name="refsect1" text="%s"/>
+<l:template name="refsect2" text="%s"/>
+<l:template name="refsect3" text="%s"/>
+<l:template name="refsynopsisdiv" text="%s"/>
+<l:template name="sect1" text="%s"/>
+<l:template name="sect2" text="%s"/>
+<l:template name="sect3" text="%s"/>
+<l:template name="sect4" text="%s"/>
+<l:template name="sect5" text="%s"/>
+<l:template name="section" text="%s"/>
+<l:template name="set" text="%s"/>
+<l:template name="setindex" text="%s"/>
+<l:template name="sidebar" text="%s"/>
+<l:template name="simplesect" text="%s"/>
+<l:template name="toc" text="%s"/>
+</l:context>
+<l:context name="xref"><l:template name="abstract" text="%t"/>
+<l:template name="acknowledgements" text="%t" lang="en"/>
+<l:template name="answer" text="P: %n"/>
+<l:template name="appendix" text="%t"/>
+<l:template name="article" text="%t"/>
+<l:template name="authorblurb" text="%t"/>
+<l:template name="bibliodiv" text="%t"/>
+<l:template name="bibliography" text="%t"/>
+<l:template name="bibliomset" text="%t"/>
+<l:template name="biblioset" text="%t"/>
+<l:template name="blockquote" text="%t"/>
+<l:template name="book" text="%t"/>
+<l:template name="calloutlist" text="%t"/>
+<l:template name="caution" text="%t"/>
+<l:template name="chapter" text="%t"/>
+<l:template name="colophon" text="%t"/>
+<l:template name="constraintdef" text="%t"/>
+<l:template name="dedication" text="%t"/>
+<l:template name="equation" text="%t"/>
+<l:template name="example" text="%t"/>
+<l:template name="figure" text="%t"/>
+<l:template name="foil" text="%t"/>
+<l:template name="foilgroup" text="%t"/>
+<l:template name="formalpara" text="%t"/>
+<l:template name="glossary" text="%t"/>
+<l:template name="glossdiv" text="%t"/>
+<l:template name="important" text="%t"/>
+<l:template name="index" text="%t"/>
+<l:template name="indexdiv" text="%t"/>
+<l:template name="itemizedlist" text="%t"/>
+<l:template name="legalnotice" text="%t"/>
+<l:template name="listitem" text="%n"/>
+<l:template name="lot" text="%t"/>
+<l:template name="msg" text="%t"/>
+<l:template name="msgexplan" text="%t"/>
+<l:template name="msgmain" text="%t"/>
+<l:template name="msgrel" text="%t"/>
+<l:template name="msgset" text="%t"/>
+<l:template name="msgsub" text="%t"/>
+<l:template name="note" text="%t"/>
+<l:template name="orderedlist" text="%t"/>
+<l:template name="part" text="%t"/>
+<l:template name="partintro" text="%t"/>
+<l:template name="preface" text="%t"/>
+<l:template name="procedure" text="%t"/>
+<l:template name="productionset" text="%t"/>
+<l:template name="qandadiv" text="%t"/>
+<l:template name="qandaentry" text="Q: %n"/>
+<l:template name="qandaset" text="%t"/>
+<l:template name="question" text="Q: %n"/>
+<l:template name="reference" text="%t"/>
+<l:template name="refsynopsisdiv" text="%t"/>
+<l:template name="segmentedlist" text="%t"/>
+<l:template name="set" text="%t"/>
+<l:template name="setindex" text="%t"/>
+<l:template name="sidebar" text="%t"/>
+<l:template name="table" text="%t"/>
+<l:template name="task" text="%t" lang="en"/>
+<l:template name="tip" text="%t"/>
+<l:template name="toc" text="%t"/>
+<l:template name="variablelist" text="%t"/>
+<l:template name="varlistentry" text="%n"/>
+<l:template name="warning" text="%t"/>
+<l:template name="olink.document.citation" text=" in %o"/>
+<l:template name="olink.page.citation" text=" (page %p)"/>
+<l:template name="page.citation" text=" [%p]"/>
+<l:template name="page" text="(page %p)"/>
+<l:template name="docname" text=" in %o"/>
+<l:template name="docnamelong" text=" in the document titled %o"/>
+<l:template name="pageabbrev" text="(p. %p)"/>
+<l:template name="Page" text="Page %p"/>
+<l:template name="bridgehead" text="seksioni i quajtur “%tâ€"/>
+<l:template name="refsection" text="seksioni i quajtur “%tâ€"/>
+<l:template name="refsect1" text="seksioni i quajtur “%tâ€"/>
+<l:template name="refsect2" text="seksioni i quajtur “%tâ€"/>
+<l:template name="refsect3" text="seksioni i quajtur “%tâ€"/>
+<l:template name="sect1" text="seksioni i quajtur “%tâ€"/>
+<l:template name="sect2" text="seksioni i quajtur “%tâ€"/>
+<l:template name="sect3" text="seksioni i quajtur “%tâ€"/>
+<l:template name="sect4" text="seksioni i quajtur “%tâ€"/>
+<l:template name="sect5" text="seksioni i quajtur “%tâ€"/>
+<l:template name="section" text="seksioni i quajtur “%tâ€"/>
+<l:template name="simplesect" text="seksioni i quajtur “%tâ€"/>
+</l:context>
+<l:context name="xref-number"><l:template name="answer" text="P: %n"/>
+<l:template name="appendix" text="Shtesë %n"/>
+<l:template name="bridgehead" text="Seksioni %n"/>
+<l:template name="chapter" text="Kapitulli %n"/>
+<l:template name="equation" text="Ekuacion %n"/>
+<l:template name="example" text="Shembull %n"/>
+<l:template name="figure" text="Figura %n"/>
+<l:template name="part" text="Pjesa %n"/>
+<l:template name="procedure" text="Proçedura %n"/>
+<l:template name="productionset" text="Prodhimi %n"/>
+<l:template name="qandadiv" text="P &amp; P %n"/>
+<l:template name="qandaentry" text="Q: %n"/>
+<l:template name="question" text="Q: %n"/>
+<l:template name="sect1" text="Seksioni %n"/>
+<l:template name="sect2" text="Seksioni %n"/>
+<l:template name="sect3" text="Seksioni %n"/>
+<l:template name="sect4" text="Seksioni %n"/>
+<l:template name="sect5" text="Seksioni %n"/>
+<l:template name="section" text="Seksioni %n"/>
+<l:template name="table" text="Tabela %n"/>
+</l:context>
+<l:context name="xref-number-and-title"><l:template name="appendix" text="Shtesë %n, %t"/>
+<l:template name="bridgehead" text="Seksioni %n, “%tâ€"/>
+<l:template name="chapter" text="Kapitulli %n, %t"/>
+<l:template name="equation" text="Ekuacion %n, “%tâ€"/>
+<l:template name="example" text="Shembull %n, “%tâ€"/>
+<l:template name="figure" text="Figura %n, “%tâ€"/>
+<l:template name="part" text="Pjesa %n, “%tâ€"/>
+<l:template name="procedure" text="Proçedura %n, “%tâ€"/>
+<l:template name="productionset" text="Prodhimi %n, “%tâ€"/>
+<l:template name="qandadiv" text="P &amp; P %n, “%tâ€"/>
+<l:template name="refsect1" text="seksioni i quajtur “%tâ€"/>
+<l:template name="refsect2" text="seksioni i quajtur “%tâ€"/>
+<l:template name="refsect3" text="seksioni i quajtur “%tâ€"/>
+<l:template name="refsection" text="seksioni i quajtur “%tâ€"/>
+<l:template name="sect1" text="Seksioni %n, “%tâ€"/>
+<l:template name="sect2" text="Seksioni %n, “%tâ€"/>
+<l:template name="sect3" text="Seksioni %n, “%tâ€"/>
+<l:template name="sect4" text="Seksioni %n, “%tâ€"/>
+<l:template name="sect5" text="Seksioni %n, “%tâ€"/>
+<l:template name="section" text="Seksioni %n, “%tâ€"/>
+<l:template name="simplesect" text="seksioni i quajtur “%tâ€"/>
+<l:template name="table" text="Tabela %n, “%tâ€"/>
+</l:context>
+<l:context name="authorgroup"><l:template name="sep" text=", "/>
+<l:template name="sep2" text=" dhe "/>
+<l:template name="seplast" text=", dhe "/>
+</l:context>
+<l:context name="glossary"><l:template name="see" text="Shiko %t."/>
+<l:template name="seealso" text="Shiko Edhe %t."/>
+<l:template name="seealso-separator" text=", "/>
+</l:context>
+<l:context name="msgset"><l:template name="MsgAud" text="Publiku: "/>
+<l:template name="MsgLevel" text="Niveli: "/>
+<l:template name="MsgOrig" text="Origjina: "/>
+</l:context>
+<l:context name="datetime"><l:template name="format" text="d/m/Y"/>
+</l:context>
+<l:context name="termdef"><l:template name="prefix" text="[Definition: "/>
+<l:template name="suffix" text="]"/>
+</l:context>
+<l:context name="datetime-full"><l:template name="January" text="Janar"/>
+<l:template name="February" text="Shkurt"/>
+<l:template name="March" text="Mars"/>
+<l:template name="April" text="Prill"/>
+<l:template name="May" text="Maj"/>
+<l:template name="June" text="Qershor"/>
+<l:template name="July" text="Korrik"/>
+<l:template name="August" text="Gusht"/>
+<l:template name="September" text="Shtator"/>
+<l:template name="October" text="Tetor"/>
+<l:template name="November" text="Nëntor"/>
+<l:template name="December" text="Dhjetor"/>
+<l:template name="Monday" text="E hënë"/>
+<l:template name="Tuesday" text="E martë"/>
+<l:template name="Wednesday" text="E mërkurë"/>
+<l:template name="Thursday" text="E enjte"/>
+<l:template name="Friday" text="E premte"/>
+<l:template name="Saturday" text="E shtunë"/>
+<l:template name="Sunday" text="E djelë"/>
+</l:context>
+<l:context name="datetime-abbrev"><l:template name="Jan" text="Jan"/>
+<l:template name="Feb" text="Shk"/>
+<l:template name="Mar" text="Mar"/>
+<l:template name="Apr" text="Pri"/>
+<l:template name="May" text="Maj"/>
+<l:template name="Jun" text="Qer"/>
+<l:template name="Jul" text="Kor"/>
+<l:template name="Aug" text="Gsh"/>
+<l:template name="Sep" text="Sht"/>
+<l:template name="Oct" text="Tet"/>
+<l:template name="Nov" text="Nën"/>
+<l:template name="Dec" text="Dhj"/>
+<l:template name="Mon" text="Hën"/>
+<l:template name="Tue" text="Mar"/>
+<l:template name="Wed" text="Mër"/>
+<l:template name="Thu" text="Enj"/>
+<l:template name="Fri" text="Pre"/>
+<l:template name="Sat" text="Sht"/>
+<l:template name="Sun" text="Dje"/>
+</l:context>
+<l:context name="htmlhelp"><l:template name="langcode" text="0x041c Albanian (ALBANIA)"/>
+</l:context>
+<l:context name="index"><l:template name="term-separator" text=", " lang="en"/>
+<l:template name="number-separator" text=", " lang="en"/>
+<l:template name="range-separator" text="-" lang="en"/>
+</l:context>
+<l:context name="iso690"><l:template name="lastfirst.sep" text=", " lang="en"/>
+<l:template name="alt.person.two.sep" text=" – " lang="en"/>
+<l:template name="alt.person.last.sep" text=" – " lang="en"/>
+<l:template name="alt.person.more.sep" text=" – " lang="en"/>
+<l:template name="primary.editor" text=" (ed.)" lang="en"/>
+<l:template name="primary.many" text=", et al." lang="en"/>
+<l:template name="primary.sep" text=". " lang="en"/>
+<l:template name="submaintitle.sep" text=": " lang="en"/>
+<l:template name="title.sep" text=". " lang="en"/>
+<l:template name="othertitle.sep" text=", " lang="en"/>
+<l:template name="medium1" text=" [" lang="en"/>
+<l:template name="medium2" text="]" lang="en"/>
+<l:template name="secondary.person.sep" text="; " lang="en"/>
+<l:template name="secondary.sep" text=". " lang="en"/>
+<l:template name="respons.sep" text=". " lang="en"/>
+<l:template name="edition.sep" text=". " lang="en"/>
+<l:template name="edition.serial.sep" text=", " lang="en"/>
+<l:template name="issuing.range" text="-" lang="en"/>
+<l:template name="issuing.div" text=", " lang="en"/>
+<l:template name="issuing.sep" text=". " lang="en"/>
+<l:template name="partnr.sep" text=". " lang="en"/>
+<l:template name="placepubl.sep" text=": " lang="en"/>
+<l:template name="publyear.sep" text=", " lang="en"/>
+<l:template name="pubinfo.sep" text=". " lang="en"/>
+<l:template name="spec.pubinfo.sep" text=", " lang="en"/>
+<l:template name="upd.sep" text=", " lang="en"/>
+<l:template name="datecit1" text=" [cited " lang="en"/>
+<l:template name="datecit2" text="]" lang="en"/>
+<l:template name="extent.sep" text=". " lang="en"/>
+<l:template name="locs.sep" text=", " lang="en"/>
+<l:template name="location.sep" text=". " lang="en"/>
+<l:template name="serie.sep" text=". " lang="en"/>
+<l:template name="notice.sep" text=". " lang="en"/>
+<l:template name="access" text="Available " lang="en"/>
+<l:template name="acctoo" text="Also available " lang="en"/>
+<l:template name="onwww" text="from World Wide Web" lang="en"/>
+<l:template name="oninet" text="from Internet" lang="en"/>
+<l:template name="access.end" text=": " lang="en"/>
+<l:template name="link1" text="&lt;" lang="en"/>
+<l:template name="link2" text="&gt;" lang="en"/>
+<l:template name="access.sep" text=". " lang="en"/>
+<l:template name="isbn" text="ISBN " lang="en"/>
+<l:template name="issn" text="ISSN " lang="en"/>
+<l:template name="stdnum.sep" text=". " lang="en"/>
+<l:template name="patcountry.sep" text=". " lang="en"/>
+<l:template name="pattype.sep" text=", " lang="en"/>
+<l:template name="patnum.sep" text=". " lang="en"/>
+<l:template name="patdate.sep" text=". " lang="en"/>
+</l:context><l:letters lang="en"><l:l i="-1"/>
+<l:l i="0">Symbols</l:l>
+<l:l i="10">A</l:l>
+<l:l i="10">a</l:l>
+<l:l i="10">À</l:l>
+<l:l i="10">à</l:l>
+<l:l i="10">Ã</l:l>
+<l:l i="10">á</l:l>
+<l:l i="10">Â</l:l>
+<l:l i="10">â</l:l>
+<l:l i="10">Ã</l:l>
+<l:l i="10">ã</l:l>
+<l:l i="10">Ä</l:l>
+<l:l i="10">ä</l:l>
+<l:l i="10">Ã…</l:l>
+<l:l i="10">Ã¥</l:l>
+<l:l i="10">Ä€</l:l>
+<l:l i="10">Ä</l:l>
+<l:l i="10">Ä‚</l:l>
+<l:l i="10">ă</l:l>
+<l:l i="10">Ä„</l:l>
+<l:l i="10">Ä…</l:l>
+<l:l i="10">Ç</l:l>
+<l:l i="10">ÇŽ</l:l>
+<l:l i="10">Çž</l:l>
+<l:l i="10">ÇŸ</l:l>
+<l:l i="10">Ç </l:l>
+<l:l i="10">Ç¡</l:l>
+<l:l i="10">Ǻ</l:l>
+<l:l i="10">Ç»</l:l>
+<l:l i="10">È€</l:l>
+<l:l i="10">È</l:l>
+<l:l i="10">È‚</l:l>
+<l:l i="10">ȃ</l:l>
+<l:l i="10">Ȧ</l:l>
+<l:l i="10">ȧ</l:l>
+<l:l i="10">Ḁ</l:l>
+<l:l i="10">á¸</l:l>
+<l:l i="10">ẚ</l:l>
+<l:l i="10">Ạ</l:l>
+<l:l i="10">ạ</l:l>
+<l:l i="10">Ả</l:l>
+<l:l i="10">ả</l:l>
+<l:l i="10">Ấ</l:l>
+<l:l i="10">ấ</l:l>
+<l:l i="10">Ầ</l:l>
+<l:l i="10">ầ</l:l>
+<l:l i="10">Ẩ</l:l>
+<l:l i="10">ẩ</l:l>
+<l:l i="10">Ẫ</l:l>
+<l:l i="10">ẫ</l:l>
+<l:l i="10">Ậ</l:l>
+<l:l i="10">ậ</l:l>
+<l:l i="10">Ắ</l:l>
+<l:l i="10">ắ</l:l>
+<l:l i="10">Ằ</l:l>
+<l:l i="10">ằ</l:l>
+<l:l i="10">Ẳ</l:l>
+<l:l i="10">ẳ</l:l>
+<l:l i="10">Ẵ</l:l>
+<l:l i="10">ẵ</l:l>
+<l:l i="10">Ặ</l:l>
+<l:l i="10">ặ</l:l>
+<l:l i="20">B</l:l>
+<l:l i="20">b</l:l>
+<l:l i="20">Æ€</l:l>
+<l:l i="20">Æ</l:l>
+<l:l i="20">É“</l:l>
+<l:l i="20">Æ‚</l:l>
+<l:l i="20">ƃ</l:l>
+<l:l i="20">Ḃ</l:l>
+<l:l i="20">ḃ</l:l>
+<l:l i="20">Ḅ</l:l>
+<l:l i="20">ḅ</l:l>
+<l:l i="20">Ḇ</l:l>
+<l:l i="20">ḇ</l:l>
+<l:l i="30">C</l:l>
+<l:l i="30">c</l:l>
+<l:l i="30">Ç</l:l>
+<l:l i="30">ç</l:l>
+<l:l i="30">Ć</l:l>
+<l:l i="30">ć</l:l>
+<l:l i="30">Ĉ</l:l>
+<l:l i="30">ĉ</l:l>
+<l:l i="30">ÄŠ</l:l>
+<l:l i="30">Ä‹</l:l>
+<l:l i="30">Č</l:l>
+<l:l i="30">Ä</l:l>
+<l:l i="30">Ƈ</l:l>
+<l:l i="30">ƈ</l:l>
+<l:l i="30">É•</l:l>
+<l:l i="30">Ḉ</l:l>
+<l:l i="30">ḉ</l:l>
+<l:l i="40">D</l:l>
+<l:l i="40">d</l:l>
+<l:l i="40">ÄŽ</l:l>
+<l:l i="40">Ä</l:l>
+<l:l i="40">Ä</l:l>
+<l:l i="40">Ä‘</l:l>
+<l:l i="40">ÆŠ</l:l>
+<l:l i="40">É—</l:l>
+<l:l i="40">Æ‹</l:l>
+<l:l i="40">ƌ</l:l>
+<l:l i="40">Ç…</l:l>
+<l:l i="40">Dz</l:l>
+<l:l i="40">È¡</l:l>
+<l:l i="40">É–</l:l>
+<l:l i="40">Ḋ</l:l>
+<l:l i="40">ḋ</l:l>
+<l:l i="40">Ḍ</l:l>
+<l:l i="40">á¸</l:l>
+<l:l i="40">Ḏ</l:l>
+<l:l i="40">á¸</l:l>
+<l:l i="40">á¸</l:l>
+<l:l i="40">ḑ</l:l>
+<l:l i="40">Ḓ</l:l>
+<l:l i="40">ḓ</l:l>
+<l:l i="50">E</l:l>
+<l:l i="50">e</l:l>
+<l:l i="50">È</l:l>
+<l:l i="50">è</l:l>
+<l:l i="50">É</l:l>
+<l:l i="50">é</l:l>
+<l:l i="50">Ê</l:l>
+<l:l i="50">ê</l:l>
+<l:l i="50">Ë</l:l>
+<l:l i="50">ë</l:l>
+<l:l i="50">Ä’</l:l>
+<l:l i="50">Ä“</l:l>
+<l:l i="50">Ä”</l:l>
+<l:l i="50">Ä•</l:l>
+<l:l i="50">Ä–</l:l>
+<l:l i="50">Ä—</l:l>
+<l:l i="50">Ę</l:l>
+<l:l i="50">Ä™</l:l>
+<l:l i="50">Äš</l:l>
+<l:l i="50">Ä›</l:l>
+<l:l i="50">È„</l:l>
+<l:l i="50">È…</l:l>
+<l:l i="50">Ȇ</l:l>
+<l:l i="50">ȇ</l:l>
+<l:l i="50">Ȩ</l:l>
+<l:l i="50">È©</l:l>
+<l:l i="50">Ḕ</l:l>
+<l:l i="50">ḕ</l:l>
+<l:l i="50">Ḗ</l:l>
+<l:l i="50">ḗ</l:l>
+<l:l i="50">Ḙ</l:l>
+<l:l i="50">ḙ</l:l>
+<l:l i="50">Ḛ</l:l>
+<l:l i="50">ḛ</l:l>
+<l:l i="50">Ḝ</l:l>
+<l:l i="50">á¸</l:l>
+<l:l i="50">Ẹ</l:l>
+<l:l i="50">ẹ</l:l>
+<l:l i="50">Ẻ</l:l>
+<l:l i="50">ẻ</l:l>
+<l:l i="50">Ẽ</l:l>
+<l:l i="50">ẽ</l:l>
+<l:l i="50">Ế</l:l>
+<l:l i="50">ế</l:l>
+<l:l i="50">Ề</l:l>
+<l:l i="50">á»</l:l>
+<l:l i="50">Ể</l:l>
+<l:l i="50">ể</l:l>
+<l:l i="50">Ễ</l:l>
+<l:l i="50">á»…</l:l>
+<l:l i="50">Ệ</l:l>
+<l:l i="50">ệ</l:l>
+<l:l i="60">F</l:l>
+<l:l i="60">f</l:l>
+<l:l i="60">Æ‘</l:l>
+<l:l i="60">Æ’</l:l>
+<l:l i="60">Ḟ</l:l>
+<l:l i="60">ḟ</l:l>
+<l:l i="70">G</l:l>
+<l:l i="70">g</l:l>
+<l:l i="70">Ĝ</l:l>
+<l:l i="70">Ä</l:l>
+<l:l i="70">Äž</l:l>
+<l:l i="70">ÄŸ</l:l>
+<l:l i="70">Ä </l:l>
+<l:l i="70">Ä¡</l:l>
+<l:l i="70">Ä¢</l:l>
+<l:l i="70">Ä£</l:l>
+<l:l i="70">Æ“</l:l>
+<l:l i="70">É </l:l>
+<l:l i="70">Ǥ</l:l>
+<l:l i="70">Ç¥</l:l>
+<l:l i="70">Ǧ</l:l>
+<l:l i="70">ǧ</l:l>
+<l:l i="70">Ç´</l:l>
+<l:l i="70">ǵ</l:l>
+<l:l i="70">Ḡ</l:l>
+<l:l i="70">ḡ</l:l>
+<l:l i="80">H</l:l>
+<l:l i="80">h</l:l>
+<l:l i="80">Ĥ</l:l>
+<l:l i="80">Ä¥</l:l>
+<l:l i="80">Ħ</l:l>
+<l:l i="80">ħ</l:l>
+<l:l i="80">Èž</l:l>
+<l:l i="80">ÈŸ</l:l>
+<l:l i="80">ɦ</l:l>
+<l:l i="80">Ḣ</l:l>
+<l:l i="80">ḣ</l:l>
+<l:l i="80">Ḥ</l:l>
+<l:l i="80">ḥ</l:l>
+<l:l i="80">Ḧ</l:l>
+<l:l i="80">ḧ</l:l>
+<l:l i="80">Ḩ</l:l>
+<l:l i="80">ḩ</l:l>
+<l:l i="80">Ḫ</l:l>
+<l:l i="80">ḫ</l:l>
+<l:l i="80">ẖ</l:l>
+<l:l i="90">I</l:l>
+<l:l i="90">i</l:l>
+<l:l i="90">Ì</l:l>
+<l:l i="90">ì</l:l>
+<l:l i="90">Ã</l:l>
+<l:l i="90">í</l:l>
+<l:l i="90">ÃŽ</l:l>
+<l:l i="90">î</l:l>
+<l:l i="90">Ã</l:l>
+<l:l i="90">ï</l:l>
+<l:l i="90">Ĩ</l:l>
+<l:l i="90">Ä©</l:l>
+<l:l i="90">Ī</l:l>
+<l:l i="90">Ä«</l:l>
+<l:l i="90">Ĭ</l:l>
+<l:l i="90">Ä­</l:l>
+<l:l i="90">Ä®</l:l>
+<l:l i="90">į</l:l>
+<l:l i="90">Ä°</l:l>
+<l:l i="90">Æ—</l:l>
+<l:l i="90">ɨ</l:l>
+<l:l i="90">Ç</l:l>
+<l:l i="90">Ç</l:l>
+<l:l i="90">Ȉ</l:l>
+<l:l i="90">ȉ</l:l>
+<l:l i="90">ÈŠ</l:l>
+<l:l i="90">È‹</l:l>
+<l:l i="90">Ḭ</l:l>
+<l:l i="90">ḭ</l:l>
+<l:l i="90">Ḯ</l:l>
+<l:l i="90">ḯ</l:l>
+<l:l i="90">Ỉ</l:l>
+<l:l i="90">ỉ</l:l>
+<l:l i="90">Ị</l:l>
+<l:l i="90">ị</l:l>
+<l:l i="100">J</l:l>
+<l:l i="100">j</l:l>
+<l:l i="100">Ä´</l:l>
+<l:l i="100">ĵ</l:l>
+<l:l i="100">Ç°</l:l>
+<l:l i="100">Ê</l:l>
+<l:l i="110">K</l:l>
+<l:l i="110">k</l:l>
+<l:l i="110">Ķ</l:l>
+<l:l i="110">Ä·</l:l>
+<l:l i="110">Ƙ</l:l>
+<l:l i="110">Æ™</l:l>
+<l:l i="110">Ǩ</l:l>
+<l:l i="110">Ç©</l:l>
+<l:l i="110">Ḱ</l:l>
+<l:l i="110">ḱ</l:l>
+<l:l i="110">Ḳ</l:l>
+<l:l i="110">ḳ</l:l>
+<l:l i="110">Ḵ</l:l>
+<l:l i="110">ḵ</l:l>
+<l:l i="120">L</l:l>
+<l:l i="120">l</l:l>
+<l:l i="120">Ĺ</l:l>
+<l:l i="120">ĺ</l:l>
+<l:l i="120">Ä»</l:l>
+<l:l i="120">ļ</l:l>
+<l:l i="120">Ľ</l:l>
+<l:l i="120">ľ</l:l>
+<l:l i="120">Ä¿</l:l>
+<l:l i="120">Å€</l:l>
+<l:l i="120">Å</l:l>
+<l:l i="120">Å‚</l:l>
+<l:l i="120">Æš</l:l>
+<l:l i="120">Lj</l:l>
+<l:l i="120">È´</l:l>
+<l:l i="120">É«</l:l>
+<l:l i="120">ɬ</l:l>
+<l:l i="120">É­</l:l>
+<l:l i="120">Ḷ</l:l>
+<l:l i="120">ḷ</l:l>
+<l:l i="120">Ḹ</l:l>
+<l:l i="120">ḹ</l:l>
+<l:l i="120">Ḻ</l:l>
+<l:l i="120">ḻ</l:l>
+<l:l i="120">Ḽ</l:l>
+<l:l i="120">ḽ</l:l>
+<l:l i="130">M</l:l>
+<l:l i="130">m</l:l>
+<l:l i="130">ɱ</l:l>
+<l:l i="130">Ḿ</l:l>
+<l:l i="130">ḿ</l:l>
+<l:l i="130">á¹€</l:l>
+<l:l i="130">á¹</l:l>
+<l:l i="130">Ṃ</l:l>
+<l:l i="130">ṃ</l:l>
+<l:l i="140">N</l:l>
+<l:l i="140">n</l:l>
+<l:l i="140">Ñ</l:l>
+<l:l i="140">ñ</l:l>
+<l:l i="140">Ń</l:l>
+<l:l i="140">Å„</l:l>
+<l:l i="140">Å…</l:l>
+<l:l i="140">ņ</l:l>
+<l:l i="140">Ň</l:l>
+<l:l i="140">ň</l:l>
+<l:l i="140">Æ</l:l>
+<l:l i="140">ɲ</l:l>
+<l:l i="140">Æž</l:l>
+<l:l i="140">È </l:l>
+<l:l i="140">Ç‹</l:l>
+<l:l i="140">Ǹ</l:l>
+<l:l i="140">ǹ</l:l>
+<l:l i="140">ȵ</l:l>
+<l:l i="140">ɳ</l:l>
+<l:l i="140">Ṅ</l:l>
+<l:l i="140">á¹…</l:l>
+<l:l i="140">Ṇ</l:l>
+<l:l i="140">ṇ</l:l>
+<l:l i="140">Ṉ</l:l>
+<l:l i="140">ṉ</l:l>
+<l:l i="140">Ṋ</l:l>
+<l:l i="140">ṋ</l:l>
+<l:l i="150">O</l:l>
+<l:l i="150">o</l:l>
+<l:l i="150">Ã’</l:l>
+<l:l i="150">ò</l:l>
+<l:l i="150">Ó</l:l>
+<l:l i="150">ó</l:l>
+<l:l i="150">Ô</l:l>
+<l:l i="150">ô</l:l>
+<l:l i="150">Õ</l:l>
+<l:l i="150">õ</l:l>
+<l:l i="150">Ö</l:l>
+<l:l i="150">ö</l:l>
+<l:l i="150">Ø</l:l>
+<l:l i="150">ø</l:l>
+<l:l i="150">Ō</l:l>
+<l:l i="150">Å</l:l>
+<l:l i="150">ÅŽ</l:l>
+<l:l i="150">Å</l:l>
+<l:l i="150">Å</l:l>
+<l:l i="150">Å‘</l:l>
+<l:l i="150">ÆŸ</l:l>
+<l:l i="150">Æ </l:l>
+<l:l i="150">Æ¡</l:l>
+<l:l i="150">Ç‘</l:l>
+<l:l i="150">Ç’</l:l>
+<l:l i="150">Ǫ</l:l>
+<l:l i="150">Ç«</l:l>
+<l:l i="150">Ǭ</l:l>
+<l:l i="150">Ç­</l:l>
+<l:l i="150">Ǿ</l:l>
+<l:l i="150">Ç¿</l:l>
+<l:l i="150">Ȍ</l:l>
+<l:l i="150">È</l:l>
+<l:l i="150">ÈŽ</l:l>
+<l:l i="150">È</l:l>
+<l:l i="150">Ȫ</l:l>
+<l:l i="150">È«</l:l>
+<l:l i="150">Ȭ</l:l>
+<l:l i="150">È­</l:l>
+<l:l i="150">È®</l:l>
+<l:l i="150">ȯ</l:l>
+<l:l i="150">È°</l:l>
+<l:l i="150">ȱ</l:l>
+<l:l i="150">Ṍ</l:l>
+<l:l i="150">á¹</l:l>
+<l:l i="150">Ṏ</l:l>
+<l:l i="150">á¹</l:l>
+<l:l i="150">á¹</l:l>
+<l:l i="150">ṑ</l:l>
+<l:l i="150">á¹’</l:l>
+<l:l i="150">ṓ</l:l>
+<l:l i="150">Ọ</l:l>
+<l:l i="150">á»</l:l>
+<l:l i="150">Ỏ</l:l>
+<l:l i="150">á»</l:l>
+<l:l i="150">á»</l:l>
+<l:l i="150">ố</l:l>
+<l:l i="150">á»’</l:l>
+<l:l i="150">ồ</l:l>
+<l:l i="150">á»”</l:l>
+<l:l i="150">ổ</l:l>
+<l:l i="150">á»–</l:l>
+<l:l i="150">á»—</l:l>
+<l:l i="150">Ộ</l:l>
+<l:l i="150">á»™</l:l>
+<l:l i="150">Ớ</l:l>
+<l:l i="150">á»›</l:l>
+<l:l i="150">Ờ</l:l>
+<l:l i="150">á»</l:l>
+<l:l i="150">Ở</l:l>
+<l:l i="150">ở</l:l>
+<l:l i="150">á» </l:l>
+<l:l i="150">ỡ</l:l>
+<l:l i="150">Ợ</l:l>
+<l:l i="150">ợ</l:l>
+<l:l i="160">P</l:l>
+<l:l i="160">p</l:l>
+<l:l i="160">Ƥ</l:l>
+<l:l i="160">Æ¥</l:l>
+<l:l i="160">á¹”</l:l>
+<l:l i="160">ṕ</l:l>
+<l:l i="160">á¹–</l:l>
+<l:l i="160">á¹—</l:l>
+<l:l i="170">Q</l:l>
+<l:l i="170">q</l:l>
+<l:l i="170">Ê </l:l>
+<l:l i="180">R</l:l>
+<l:l i="180">r</l:l>
+<l:l i="180">Å”</l:l>
+<l:l i="180">Å•</l:l>
+<l:l i="180">Å–</l:l>
+<l:l i="180">Å—</l:l>
+<l:l i="180">Ř</l:l>
+<l:l i="180">Å™</l:l>
+<l:l i="180">È</l:l>
+<l:l i="180">È‘</l:l>
+<l:l i="180">È’</l:l>
+<l:l i="180">È“</l:l>
+<l:l i="180">ɼ</l:l>
+<l:l i="180">ɽ</l:l>
+<l:l i="180">ɾ</l:l>
+<l:l i="180">Ṙ</l:l>
+<l:l i="180">á¹™</l:l>
+<l:l i="180">Ṛ</l:l>
+<l:l i="180">á¹›</l:l>
+<l:l i="180">Ṝ</l:l>
+<l:l i="180">á¹</l:l>
+<l:l i="180">Ṟ</l:l>
+<l:l i="180">ṟ</l:l>
+<l:l i="190">S</l:l>
+<l:l i="190">s</l:l>
+<l:l i="190">Åš</l:l>
+<l:l i="190">Å›</l:l>
+<l:l i="190">Ŝ</l:l>
+<l:l i="190">Å</l:l>
+<l:l i="190">Åž</l:l>
+<l:l i="190">ÅŸ</l:l>
+<l:l i="190">Å </l:l>
+<l:l i="190">Å¡</l:l>
+<l:l i="190">Ș</l:l>
+<l:l i="190">È™</l:l>
+<l:l i="190">Ê‚</l:l>
+<l:l i="190">á¹ </l:l>
+<l:l i="190">ṡ</l:l>
+<l:l i="190">á¹¢</l:l>
+<l:l i="190">á¹£</l:l>
+<l:l i="190">Ṥ</l:l>
+<l:l i="190">á¹¥</l:l>
+<l:l i="190">Ṧ</l:l>
+<l:l i="190">ṧ</l:l>
+<l:l i="190">Ṩ</l:l>
+<l:l i="190">ṩ</l:l>
+<l:l i="200">T</l:l>
+<l:l i="200">t</l:l>
+<l:l i="200">Å¢</l:l>
+<l:l i="200">Å£</l:l>
+<l:l i="200">Ť</l:l>
+<l:l i="200">Å¥</l:l>
+<l:l i="200">Ŧ</l:l>
+<l:l i="200">ŧ</l:l>
+<l:l i="200">Æ«</l:l>
+<l:l i="200">Ƭ</l:l>
+<l:l i="200">Æ­</l:l>
+<l:l i="200">Æ®</l:l>
+<l:l i="200">ʈ</l:l>
+<l:l i="200">Èš</l:l>
+<l:l i="200">È›</l:l>
+<l:l i="200">ȶ</l:l>
+<l:l i="200">Ṫ</l:l>
+<l:l i="200">ṫ</l:l>
+<l:l i="200">Ṭ</l:l>
+<l:l i="200">á¹­</l:l>
+<l:l i="200">á¹®</l:l>
+<l:l i="200">ṯ</l:l>
+<l:l i="200">á¹°</l:l>
+<l:l i="200">á¹±</l:l>
+<l:l i="200">ẗ</l:l>
+<l:l i="210">U</l:l>
+<l:l i="210">u</l:l>
+<l:l i="210">Ù</l:l>
+<l:l i="210">ù</l:l>
+<l:l i="210">Ú</l:l>
+<l:l i="210">ú</l:l>
+<l:l i="210">Û</l:l>
+<l:l i="210">û</l:l>
+<l:l i="210">Ü</l:l>
+<l:l i="210">ü</l:l>
+<l:l i="210">Ũ</l:l>
+<l:l i="210">Å©</l:l>
+<l:l i="210">Ū</l:l>
+<l:l i="210">Å«</l:l>
+<l:l i="210">Ŭ</l:l>
+<l:l i="210">Å­</l:l>
+<l:l i="210">Å®</l:l>
+<l:l i="210">ů</l:l>
+<l:l i="210">Å°</l:l>
+<l:l i="210">ű</l:l>
+<l:l i="210">Ų</l:l>
+<l:l i="210">ų</l:l>
+<l:l i="210">Ư</l:l>
+<l:l i="210">Æ°</l:l>
+<l:l i="210">Ç“</l:l>
+<l:l i="210">Ç”</l:l>
+<l:l i="210">Ç•</l:l>
+<l:l i="210">Ç–</l:l>
+<l:l i="210">Ç—</l:l>
+<l:l i="210">ǘ</l:l>
+<l:l i="210">Ç™</l:l>
+<l:l i="210">Çš</l:l>
+<l:l i="210">Ç›</l:l>
+<l:l i="210">ǜ</l:l>
+<l:l i="210">È”</l:l>
+<l:l i="210">È•</l:l>
+<l:l i="210">È–</l:l>
+<l:l i="210">È—</l:l>
+<l:l i="210">á¹²</l:l>
+<l:l i="210">á¹³</l:l>
+<l:l i="210">á¹´</l:l>
+<l:l i="210">á¹µ</l:l>
+<l:l i="210">Ṷ</l:l>
+<l:l i="210">á¹·</l:l>
+<l:l i="210">Ṹ</l:l>
+<l:l i="210">á¹¹</l:l>
+<l:l i="210">Ṻ</l:l>
+<l:l i="210">á¹»</l:l>
+<l:l i="210">Ụ</l:l>
+<l:l i="210">ụ</l:l>
+<l:l i="210">Ủ</l:l>
+<l:l i="210">ủ</l:l>
+<l:l i="210">Ứ</l:l>
+<l:l i="210">ứ</l:l>
+<l:l i="210">Ừ</l:l>
+<l:l i="210">ừ</l:l>
+<l:l i="210">Ử</l:l>
+<l:l i="210">á»­</l:l>
+<l:l i="210">á»®</l:l>
+<l:l i="210">ữ</l:l>
+<l:l i="210">á»°</l:l>
+<l:l i="210">á»±</l:l>
+<l:l i="220">V</l:l>
+<l:l i="220">v</l:l>
+<l:l i="220">Ʋ</l:l>
+<l:l i="220">Ê‹</l:l>
+<l:l i="220">á¹¼</l:l>
+<l:l i="220">á¹½</l:l>
+<l:l i="220">á¹¾</l:l>
+<l:l i="220">ṿ</l:l>
+<l:l i="230">W</l:l>
+<l:l i="230">w</l:l>
+<l:l i="230">Å´</l:l>
+<l:l i="230">ŵ</l:l>
+<l:l i="230">Ẁ</l:l>
+<l:l i="230">áº</l:l>
+<l:l i="230">Ẃ</l:l>
+<l:l i="230">ẃ</l:l>
+<l:l i="230">Ẅ</l:l>
+<l:l i="230">ẅ</l:l>
+<l:l i="230">Ẇ</l:l>
+<l:l i="230">ẇ</l:l>
+<l:l i="230">Ẉ</l:l>
+<l:l i="230">ẉ</l:l>
+<l:l i="230">ẘ</l:l>
+<l:l i="240">X</l:l>
+<l:l i="240">x</l:l>
+<l:l i="240">Ẋ</l:l>
+<l:l i="240">ẋ</l:l>
+<l:l i="240">Ẍ</l:l>
+<l:l i="240">áº</l:l>
+<l:l i="250">Y</l:l>
+<l:l i="250">y</l:l>
+<l:l i="250">Ã</l:l>
+<l:l i="250">ý</l:l>
+<l:l i="250">ÿ</l:l>
+<l:l i="250">Ÿ</l:l>
+<l:l i="250">Ŷ</l:l>
+<l:l i="250">Å·</l:l>
+<l:l i="250">Ƴ</l:l>
+<l:l i="250">Æ´</l:l>
+<l:l i="250">Ȳ</l:l>
+<l:l i="250">ȳ</l:l>
+<l:l i="250">Ẏ</l:l>
+<l:l i="250">áº</l:l>
+<l:l i="250">ẙ</l:l>
+<l:l i="250">Ỳ</l:l>
+<l:l i="250">ỳ</l:l>
+<l:l i="250">á»´</l:l>
+<l:l i="250">ỵ</l:l>
+<l:l i="250">Ỷ</l:l>
+<l:l i="250">á»·</l:l>
+<l:l i="250">Ỹ</l:l>
+<l:l i="250">ỹ</l:l>
+<l:l i="260">Z</l:l>
+<l:l i="260">z</l:l>
+<l:l i="260">Ź</l:l>
+<l:l i="260">ź</l:l>
+<l:l i="260">Å»</l:l>
+<l:l i="260">ż</l:l>
+<l:l i="260">Ž</l:l>
+<l:l i="260">ž</l:l>
+<l:l i="260">Ƶ</l:l>
+<l:l i="260">ƶ</l:l>
+<l:l i="260">Ȥ</l:l>
+<l:l i="260">È¥</l:l>
+<l:l i="260">Ê</l:l>
+<l:l i="260">Ê‘</l:l>
+<l:l i="260">áº</l:l>
+<l:l i="260">ẑ</l:l>
+<l:l i="260">Ẓ</l:l>
+<l:l i="260">ẓ</l:l>
+<l:l i="260">Ẕ</l:l>
+<l:l i="260">ẕ</l:l>
+</l:letters>
+</l:l10n>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/sr.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/sr.xml
new file mode 100644
index 0000000..413ca4c
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/sr.xml
@@ -0,0 +1,720 @@
+<?xml version="1.0" encoding="utf-8"?>
+<l:l10n xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0" language="sr" english-language-name="Serbian in Cyrillic script">
+
+<!-- * This file is generated automatically. -->
+<!-- * To submit changes to this file upstream (to the DocBook Project) -->
+<!-- * do not submit an edited version of this file. Instead, submit an -->
+<!-- * edited version of the source file at the following location: -->
+<!-- * -->
+<!-- * https://docbook.svn.sourceforge.net/svnroot/docbook/trunk/gentext/locale/sr.xml -->
+<!-- * -->
+<!-- * E-mail the edited sr.xml source file to: -->
+<!-- * -->
+<!-- * docbook-developers@lists.sourceforge.net -->
+
+<!-- ******************************************************************** -->
+
+<!-- This file is part of the XSL DocBook Stylesheet distribution. -->
+<!-- See ../README or http://docbook.sf.net/release/xsl/current/ for -->
+<!-- copyright and other information. -->
+
+<!-- ******************************************************************** -->
+<!-- In these files, % with a letter is used for a placeholder: -->
+<!-- %t is the current element's title -->
+<!-- %s is the current element's subtitle (if applicable)-->
+<!-- %n is the current element's number label-->
+<!-- %p is the current element's page number (if applicable)-->
+<!-- ******************************************************************** -->
+
+
+<l:gentext key="Abstract" text="Сажетак"/>
+<l:gentext key="abstract" text="Ñажетак"/>
+<l:gentext key="Acknowledgements" text="Признања"/>
+<l:gentext key="acknowledgements" text="признања"/>
+<l:gentext key="Answer" text="О:"/>
+<l:gentext key="answer" text="о:"/>
+<l:gentext key="Appendix" text="Додатак"/>
+<l:gentext key="appendix" text="додатак"/>
+<l:gentext key="Article" text="Чланак"/>
+<l:gentext key="article" text="чланак"/>
+<l:gentext key="Author" text="Ðутор"/>
+<l:gentext key="Bibliography" text="Литература"/>
+<l:gentext key="bibliography" text="литература"/>
+<l:gentext key="Book" text="Књига"/>
+<l:gentext key="book" text="књига"/>
+<l:gentext key="CAUTION" text="УПОЗОРЕЊЕ"/>
+<l:gentext key="Caution" text="Упозорење"/>
+<l:gentext key="caution" text="упозорење"/>
+<l:gentext key="Chapter" text="Поглавље"/>
+<l:gentext key="chapter" text="поглавље"/>
+<l:gentext key="Colophon" text="Колофон"/>
+<l:gentext key="colophon" text="колофон"/>
+<l:gentext key="Copyright" text="ÐуторÑка права"/>
+<l:gentext key="copyright" text="ауторÑка права"/>
+<l:gentext key="Dedication" text="ПоÑвета"/>
+<l:gentext key="dedication" text="поÑвета"/>
+<l:gentext key="Edition" text="Издање"/>
+<l:gentext key="edition" text="издање"/>
+<l:gentext key="Editor" text="Уредник"/>
+<l:gentext key="Equation" text="Једначина"/>
+<l:gentext key="equation" text="једначина"/>
+<l:gentext key="Example" text="Пример"/>
+<l:gentext key="example" text="пример"/>
+<l:gentext key="Figure" text="Слика"/>
+<l:gentext key="figure" text="Ñлика"/>
+<l:gentext key="Glossary" text="Речник"/>
+<l:gentext key="glossary" text="речник"/>
+<l:gentext key="GlossSee" text="Види"/>
+<l:gentext key="glosssee" text="види"/>
+<l:gentext key="GlossSeeAlso" text="Види такође"/>
+<l:gentext key="glossseealso" text="види такође"/>
+<l:gentext key="IMPORTANT" text="Ð’ÐЖÐО"/>
+<l:gentext key="important" text="важно"/>
+<l:gentext key="Important" text="Важно"/>
+<l:gentext key="Index" text="ИндекÑ"/>
+<l:gentext key="index" text="индекÑ"/>
+<l:gentext key="ISBN" text="ISBN"/>
+<l:gentext key="isbn" text="ISBN"/>
+<l:gentext key="LegalNotice" text="Правна напомена"/>
+<l:gentext key="legalnotice" text="правна напомена"/>
+<l:gentext key="MsgAud" text="Публика"/>
+<l:gentext key="msgaud" text="публика"/>
+<l:gentext key="MsgLevel" text="Ðиво"/>
+<l:gentext key="msglevel" text="ниво"/>
+<l:gentext key="MsgOrig" text="Извор"/>
+<l:gentext key="msgorig" text="извор"/>
+<l:gentext key="NOTE" text="ПРИМЕДБÐ"/>
+<l:gentext key="Note" text="Примедба"/>
+<l:gentext key="note" text="примедба"/>
+<l:gentext key="Part" text="Део"/>
+<l:gentext key="part" text="део"/>
+<l:gentext key="Preface" text="Предговор"/>
+<l:gentext key="preface" text="предговор"/>
+<l:gentext key="Procedure" text="ПоÑтупак"/>
+<l:gentext key="procedure" text="поÑтупак"/>
+<l:gentext key="ProductionSet" text="Продукција"/>
+<l:gentext key="PubDate" text="Датум издавања"/>
+<l:gentext key="pubdate" text="датум издавања"/>
+<l:gentext key="Published" text="Издано"/>
+<l:gentext key="published" text="издано"/>
+<l:gentext key="Publisher" text="Издавач"/>
+<l:gentext key="Qandadiv" text="П и О"/>
+<l:gentext key="qandadiv" text="п и о"/>
+<l:gentext key="QandASet" text="ЧеÑто поÑтављана питања"/>
+<l:gentext key="Question" text="П:"/>
+<l:gentext key="question" text="п:"/>
+<l:gentext key="RefEntry" text="Страница"/>
+<l:gentext key="refentry" text="Ñтраница"/>
+<l:gentext key="Reference" text="Референца"/>
+<l:gentext key="reference" text="референца"/>
+<l:gentext key="References" text="Референце"/>
+<l:gentext key="RefName" text="Име"/>
+<l:gentext key="refname" text="име"/>
+<l:gentext key="RefSection" text="Одељак"/>
+<l:gentext key="refsection" text="одељак"/>
+<l:gentext key="RefSynopsisDiv" text="Преглед"/>
+<l:gentext key="refsynopsisdiv" text="преглед"/>
+<l:gentext key="RevHistory" text="ИÑторија ревизија"/>
+<l:gentext key="revhistory" text="иÑторија ревизија"/>
+<l:gentext key="revision" text="ревизија"/>
+<l:gentext key="Revision" text="Ревизија"/>
+<l:gentext key="sect1" text="Одељак"/>
+<l:gentext key="sect2" text="Одељак"/>
+<l:gentext key="sect3" text="Одељак"/>
+<l:gentext key="sect4" text="Одељак"/>
+<l:gentext key="sect5" text="Одељак"/>
+<l:gentext key="section" text="одељак"/>
+<l:gentext key="Section" text="Одељак"/>
+<l:gentext key="see" text="види"/>
+<l:gentext key="See" text="Види"/>
+<l:gentext key="seealso" text="види такође"/>
+<l:gentext key="Seealso" text="Види такође"/>
+<l:gentext key="SeeAlso" text="Види такође"/>
+<l:gentext key="set" text="Ñкуп"/>
+<l:gentext key="Set" text="Скуп"/>
+<l:gentext key="setindex" text="Ð¸Ð½Ð´ÐµÐºÑ Ñкупа"/>
+<l:gentext key="SetIndex" text="Ð˜Ð½Ð´ÐµÐºÑ Ñкупа"/>
+<l:gentext key="Sidebar" text="Бочна трака"/>
+<l:gentext key="sidebar" text="бочна трака"/>
+<l:gentext key="step" text="корак"/>
+<l:gentext key="Step" text="Корак"/>
+<l:gentext key="table" text="табела"/>
+<l:gentext key="Table" text="Табела"/>
+<l:gentext key="task" text="задатак"/>
+<l:gentext key="Task" text="Задатак"/>
+<l:gentext key="tip" text="Ñавет"/>
+<l:gentext key="TIP" text="СÐВЕТ"/>
+<l:gentext key="Tip" text="Савет"/>
+<l:gentext key="Warning" text="Упозорење"/>
+<l:gentext key="warning" text="упозорење"/>
+<l:gentext key="WARNING" text="УПОЗОРЕЊЕ"/>
+<l:gentext key="and" text="и"/>
+<l:gentext key="by" text="од"/>
+<l:gentext key="Edited" text="Уређено"/>
+<l:gentext key="edited" text="уређено"/>
+<l:gentext key="Editedby" text="Уредио(ла)"/>
+<l:gentext key="editedby" text="Уредио(ла)"/>
+<l:gentext key="in" text="у"/>
+<l:gentext key="lastlistcomma" text=","/>
+<l:gentext key="listcomma" text=","/>
+<l:gentext key="notes" text="примедбе"/>
+<l:gentext key="Notes" text="Примедбе"/>
+<l:gentext key="Pgs" text="Стр."/>
+<l:gentext key="pgs" text="ÑÑ‚Ñ€."/>
+<l:gentext key="Revisedby" text="Прегледао(ла): "/>
+<l:gentext key="revisedby" text="прегледао(ла): "/>
+<l:gentext key="TableNotes" text="Примедбе"/>
+<l:gentext key="tablenotes" text="примедбе"/>
+<l:gentext key="TableofContents" text="Садржај"/>
+<l:gentext key="tableofcontents" text="Ñадржај"/>
+<l:gentext key="unexpectedelementname" text="неочекивано име елемента"/>
+<l:gentext key="unsupported" text="није подржано"/>
+<l:gentext key="xrefto" text="унакрÑна референца на"/>
+<l:gentext key="Authors" text="Ðутори"/>
+<l:gentext key="copyeditor" text="Издавачки уредник"/>
+<l:gentext key="graphicdesigner" text="Графички дизајнер"/>
+<l:gentext key="productioneditor" text="Извршни уредник"/>
+<l:gentext key="technicaleditor" text="Технички уредник"/>
+<l:gentext key="translator" text="Преводилац"/>
+<l:gentext key="listofequations" text="ÑпиÑак једначина"/>
+<l:gentext key="ListofEquations" text="СпиÑак једначина"/>
+<l:gentext key="ListofExamples" text="СпиÑак примера"/>
+<l:gentext key="listofexamples" text="ÑпиÑак примера"/>
+<l:gentext key="ListofFigures" text="СпиÑак Ñлика"/>
+<l:gentext key="listoffigures" text="ÑпиÑак Ñлика"/>
+<l:gentext key="ListofProcedures" text="СпиÑак поÑтупака"/>
+<l:gentext key="listofprocedures" text="ÑпиÑак поÑтупака"/>
+<l:gentext key="listoftables" text="ÑпиÑак табела"/>
+<l:gentext key="ListofTables" text="СпиÑак табела"/>
+<l:gentext key="ListofUnknown" text="ÑпиÑак непознатих"/>
+<l:gentext key="listofunknown" text="СпиÑак непознатих"/>
+<l:gentext key="nav-home" text="Почетак"/>
+<l:gentext key="nav-next" text="Следећи"/>
+<l:gentext key="nav-next-sibling" text="Брзо напред"/>
+<l:gentext key="nav-prev" text="Претходни"/>
+<l:gentext key="nav-prev-sibling" text="Брзо назад"/>
+<l:gentext key="nav-up" text="Врх"/>
+<l:gentext key="nav-toc" text="Садр."/>
+<l:gentext key="Draft" text="Ðацрт"/>
+<l:gentext key="above" text="изнад"/>
+<l:gentext key="below" text="иÑпод"/>
+<l:gentext key="sectioncalled" text="одељак под именом"/>
+<l:gentext key="index symbols" text="Симболи"/>
+<l:gentext key="writing-mode" text="lr-tb"/>
+<l:gentext key="lowercase.alpha" text="абвгдђежзијклљмнњопрÑтћуфхцчџш"/>
+<l:gentext key="uppercase.alpha" text="ÐБВГДЂЕЖЗИЈКЛЉМÐЊОПРСТЋУФХЦЧÐШ"/>
+<l:gentext key="normalize.sort.input" text="AaÀàÃáÂâÃãÄäÅåĀÄĂ㥹ÇǎǞǟǠǡǺǻȀÈȂȃȦȧḀá¸áºšáº áº¡áº¢áº£áº¤áº¥áº¦áº§áº¨áº©áºªáº«áº¬áº­áº®áº¯áº°áº±áº²áº³áº´áºµáº¶áº·BbÆ€ÆɓƂƃḂḃḄḅḆḇCcÇçĆćĈĉĊċČÄƇƈɕḈḉDdÄŽÄÄđƊɗƋƌDžDzȡɖḊḋḌá¸á¸Žá¸á¸á¸‘ḒḓEeÈèÉéÊêËëĒēĔĕĖėĘęĚěȄȅȆȇȨȩḔḕḖḗḘḙḚḛḜá¸áº¸áº¹áººáº»áº¼áº½áº¾áº¿á»€á»á»‚ểỄễỆệFfƑƒḞḟGgÄœÄĞğĠġĢģƓɠǤǥǦǧǴǵḠḡHhĤĥĦħȞȟɦḢḣḤḥḦḧḨḩḪḫẖIiÌìÃíÎîÃïĨĩĪīĬĭĮįİƗɨÇÇȈȉȊȋḬḭḮḯỈỉỊịJjĴĵǰÊKkĶķƘƙǨǩḰḱḲḳḴḵLlĹĺĻļĽľĿŀÅłƚLjȴɫɬɭḶḷḸḹḺḻḼḽMmɱḾḿṀá¹á¹‚ṃNnÑñŃńŅņŇňÆɲƞȠNjǸǹȵɳṄṅṆṇṈṉṊṋOoÒòÓóÔôÕõÖöØøŌÅÅŽÅÅőƟƠơǑǒǪǫǬǭǾǿȌÈÈŽÈȪȫȬȭȮȯȰȱṌá¹á¹Žá¹á¹á¹‘ṒṓỌá»á»Žá»á»á»‘ỒồỔổỖỗỘộỚớỜá»á»žá»Ÿá» á»¡á»¢á»£PpƤƥṔṕṖṗQqÊ RrŔŕŖŗŘřÈȑȒȓɼɽɾṘṙṚṛṜá¹á¹žá¹ŸSsŚśŜÅŞşŠšȘșʂṠṡṢṣṤṥṦṧṨṩTtŢţŤťŦŧƫƬƭƮʈȚțȶṪṫṬṭṮṯṰṱẗUuÙùÚúÛûÜüŨũŪūŬŭŮůŰűŲųƯưǓǔǕǖǗǘǙǚǛǜȔȕȖȗṲṳṴṵṶṷṸṹṺṻỤụỦủỨứỪừỬửỮữỰựVvƲʋṼṽṾṿWwŴŵẀáºáº‚ẃẄẅẆẇẈẉẘXxẊẋẌáºYyÃýÿŸŶŷƳƴȲȳẎáºáº™á»²á»³á»´á»µá»¶á»·á»¸á»¹ZzŹźŻżŽžƵƶȤȥÊÊ‘áºáº‘ẒẓẔẕẕ" lang="en"/>
+<l:gentext key="normalize.sort.output" text="AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBCCCCCCCCCCCCCCCCCDDDDDDDDDDDDDDDDDDDDDDDDEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEFFFFFFGGGGGGGGGGGGGGGGGGGGHHHHHHHHHHHHHHHHHHHHIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIJJJJJJKKKKKKKKKKKKKKLLLLLLLLLLLLLLLLLLLLLLLLLLMMMMMMMMMNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOPPPPPPPPQQQRRRRRRRRRRRRRRRRRRRRRRRSSSSSSSSSSSSSSSSSSSSSSSTTTTTTTTTTTTTTTTTTTTTTTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUVVVVVVVVWWWWWWWWWWWWWWWXXXXXXYYYYYYYYYYYYYYYYYYYYYYYZZZZZZZZZZZZZZZZZZZZZ" lang="en"/>
+<l:dingbat key="startquote" text="„"/>
+<l:dingbat key="endquote" text="“"/>
+<l:dingbat key="nestedstartquote" text="‘"/>
+<l:dingbat key="nestedendquote" text="’"/>
+<l:dingbat key="singlestartquote" text="‘"/>
+<l:dingbat key="singleendquote" text="’"/>
+<l:dingbat key="bullet" text="•"/>
+<l:gentext key="hyphenation-character" text="-"/>
+<l:gentext key="hyphenation-push-character-count" text="2"/>
+<l:gentext key="hyphenation-remain-character-count" text="2"/>
+<l:context name="styles"><l:template name="person-name" text="име-презиме"/>
+</l:context>
+<l:context name="title"><l:template name="abstract" text="%t"/>
+<l:template name="acknowledgements" text="%t" lang="en"/>
+<l:template name="answer" text="%t"/>
+<l:template name="appendix" text="Додатак %n. %t"/>
+<l:template name="article" text="%t"/>
+<l:template name="authorblurb" text="%t"/>
+<l:template name="bibliodiv" text="%t"/>
+<l:template name="biblioentry" text="%t"/>
+<l:template name="bibliography" text="%t"/>
+<l:template name="bibliolist" text="%t"/>
+<l:template name="bibliomixed" text="%t"/>
+<l:template name="bibliomset" text="%t"/>
+<l:template name="biblioset" text="%t"/>
+<l:template name="blockquote" text="%t"/>
+<l:template name="book" text="%t"/>
+<l:template name="calloutlist" text="%t"/>
+<l:template name="caution" text="%t"/>
+<l:template name="chapter" text="Поглавље %n. %t"/>
+<l:template name="colophon" text="%t"/>
+<l:template name="dedication" text="%t"/>
+<l:template name="equation" text="Једначина %n. %t"/>
+<l:template name="example" text="Пример %n. %t"/>
+<l:template name="figure" text="Слика %n. %t"/>
+<l:template name="foil" text="%t"/>
+<l:template name="foilgroup" text="%t"/>
+<l:template name="formalpara" text="%t"/>
+<l:template name="glossary" text="%t"/>
+<l:template name="glossdiv" text="%t"/>
+<l:template name="glosslist" text="%t"/>
+<l:template name="glossentry" text="%t"/>
+<l:template name="important" text="%t"/>
+<l:template name="index" text="%t"/>
+<l:template name="indexdiv" text="%t"/>
+<l:template name="itemizedlist" text="%t"/>
+<l:template name="legalnotice" text="%t"/>
+<l:template name="listitem" text=""/>
+<l:template name="lot" text="%t"/>
+<l:template name="msg" text="%t"/>
+<l:template name="msgexplan" text="%t"/>
+<l:template name="msgmain" text="%t"/>
+<l:template name="msgrel" text="%t"/>
+<l:template name="msgset" text="%t"/>
+<l:template name="msgsub" text="%t"/>
+<l:template name="note" text="%t"/>
+<l:template name="orderedlist" text="%t"/>
+<l:template name="part" text="Део %n. %t"/>
+<l:template name="partintro" text="%t"/>
+<l:template name="preface" text="%t"/>
+<l:template name="procedure" text="%t"/>
+<l:template name="procedure.formal" text="ПоÑтупак %n. %t"/>
+<l:template name="productionset" text="%t"/>
+<l:template name="productionset.formal" text="Продукција %n"/>
+<l:template name="qandadiv" text="%t"/>
+<l:template name="qandaentry" text="%t"/>
+<l:template name="qandaset" text="%t"/>
+<l:template name="question" text="%t"/>
+<l:template name="refentry" text="%t"/>
+<l:template name="reference" text="%t"/>
+<l:template name="refsection" text="%t"/>
+<l:template name="refsect1" text="%t"/>
+<l:template name="refsect2" text="%t"/>
+<l:template name="refsect3" text="%t"/>
+<l:template name="refsynopsisdiv" text="%t"/>
+<l:template name="refsynopsisdivinfo" text="%t"/>
+<l:template name="segmentedlist" text="%t"/>
+<l:template name="set" text="%t"/>
+<l:template name="setindex" text="%t"/>
+<l:template name="sidebar" text="%t"/>
+<l:template name="step" text="%t"/>
+<l:template name="table" text="Табела %n. %t"/>
+<l:template name="task" text="%t"/>
+<l:template name="tasksummary" text="%t"/>
+<l:template name="taskprerequisites" text="%t"/>
+<l:template name="taskrelated" text="%t"/>
+<l:template name="tip" text="%t"/>
+<l:template name="toc" text="%t"/>
+<l:template name="variablelist" text="%t"/>
+<l:template name="varlistentry" text=""/>
+<l:template name="warning" text="%t"/>
+</l:context>
+<l:context name="title-unnumbered"><l:template name="appendix" text="%t"/>
+<l:template name="article/appendix" text="%t"/>
+<l:template name="bridgehead" text="%t"/>
+<l:template name="chapter" text="%t"/>
+<l:template name="sect1" text="%t"/>
+<l:template name="sect2" text="%t"/>
+<l:template name="sect3" text="%t"/>
+<l:template name="sect4" text="%t"/>
+<l:template name="sect5" text="%t"/>
+<l:template name="section" text="%t"/>
+<l:template name="simplesect" text="%t"/>
+<l:template name="part" text="%t"/>
+</l:context>
+<l:context name="title-numbered"><l:template name="appendix" text="Додатак %n. %t"/>
+<l:template name="article/appendix" text="%n. %t"/>
+<l:template name="bridgehead" text="%n. %t"/>
+<l:template name="chapter" text="Поглавље %n. %t"/>
+<l:template name="part" text="Део %n. %t"/>
+<l:template name="sect1" text="%n. %t"/>
+<l:template name="sect2" text="%n. %t"/>
+<l:template name="sect3" text="%n. %t"/>
+<l:template name="sect4" text="%n. %t"/>
+<l:template name="sect5" text="%n. %t"/>
+<l:template name="section" text="%n. %t"/>
+<l:template name="simplesect" text="%t"/>
+</l:context>
+<l:context name="subtitle"><l:template name="appendix" text="%s"/>
+<l:template name="acknowledgements" text="%s" lang="en"/>
+<l:template name="article" text="%s"/>
+<l:template name="bibliodiv" text="%s"/>
+<l:template name="biblioentry" text="%s"/>
+<l:template name="bibliography" text="%s"/>
+<l:template name="bibliomixed" text="%s"/>
+<l:template name="bibliomset" text="%s"/>
+<l:template name="biblioset" text="%s"/>
+<l:template name="book" text="%s"/>
+<l:template name="chapter" text="%s"/>
+<l:template name="colophon" text="%s"/>
+<l:template name="dedication" text="%s"/>
+<l:template name="glossary" text="%s"/>
+<l:template name="glossdiv" text="%s"/>
+<l:template name="index" text="%s"/>
+<l:template name="indexdiv" text="%s"/>
+<l:template name="lot" text="%s"/>
+<l:template name="part" text="%s"/>
+<l:template name="partintro" text="%s"/>
+<l:template name="preface" text="%s"/>
+<l:template name="refentry" text="%s"/>
+<l:template name="reference" text="%s"/>
+<l:template name="refsection" text="%s"/>
+<l:template name="refsect1" text="%s"/>
+<l:template name="refsect2" text="%s"/>
+<l:template name="refsect3" text="%s"/>
+<l:template name="refsynopsisdiv" text="%s"/>
+<l:template name="sect1" text="%s"/>
+<l:template name="sect2" text="%s"/>
+<l:template name="sect3" text="%s"/>
+<l:template name="sect4" text="%s"/>
+<l:template name="sect5" text="%s"/>
+<l:template name="section" text="%s"/>
+<l:template name="set" text="%s"/>
+<l:template name="setindex" text="%s"/>
+<l:template name="sidebar" text="%s"/>
+<l:template name="simplesect" text="%s"/>
+<l:template name="toc" text="%s"/>
+</l:context>
+<l:context name="xref"><l:template name="abstract" text="%t"/>
+<l:template name="acknowledgements" text="%t" lang="en"/>
+<l:template name="answer" text="О: %n"/>
+<l:template name="appendix" text="%t"/>
+<l:template name="article" text="%t"/>
+<l:template name="authorblurb" text="%t"/>
+<l:template name="bibliodiv" text="%t"/>
+<l:template name="bibliography" text="%t"/>
+<l:template name="bibliomset" text="%t"/>
+<l:template name="biblioset" text="%t"/>
+<l:template name="blockquote" text="%t"/>
+<l:template name="book" text="%t"/>
+<l:template name="calloutlist" text="%t"/>
+<l:template name="caution" text="%t"/>
+<l:template name="chapter" text="%t"/>
+<l:template name="colophon" text="%t"/>
+<l:template name="constraintdef" text="%t"/>
+<l:template name="dedication" text="%t"/>
+<l:template name="equation" text="%t"/>
+<l:template name="example" text="%t"/>
+<l:template name="figure" text="%t"/>
+<l:template name="foil" text="%t"/>
+<l:template name="foilgroup" text="%t"/>
+<l:template name="formalpara" text="%t"/>
+<l:template name="glossary" text="%t"/>
+<l:template name="glossdiv" text="%t"/>
+<l:template name="important" text="%t"/>
+<l:template name="index" text="%t"/>
+<l:template name="indexdiv" text="%t"/>
+<l:template name="itemizedlist" text="%t"/>
+<l:template name="legalnotice" text="%t"/>
+<l:template name="listitem" text="%n"/>
+<l:template name="lot" text="%t"/>
+<l:template name="msg" text="%t"/>
+<l:template name="msgexplan" text="%t"/>
+<l:template name="msgmain" text="%t"/>
+<l:template name="msgrel" text="%t"/>
+<l:template name="msgset" text="%t"/>
+<l:template name="msgsub" text="%t"/>
+<l:template name="note" text="%t"/>
+<l:template name="orderedlist" text="%t"/>
+<l:template name="part" text="%t"/>
+<l:template name="partintro" text="%t"/>
+<l:template name="preface" text="%t"/>
+<l:template name="procedure" text="%t"/>
+<l:template name="productionset" text="%t"/>
+<l:template name="qandadiv" text="%t"/>
+<l:template name="qandaentry" text="П: %n"/>
+<l:template name="qandaset" text="%t"/>
+<l:template name="question" text="П: %n"/>
+<l:template name="reference" text="%t"/>
+<l:template name="refsynopsisdiv" text="%t"/>
+<l:template name="segmentedlist" text="%t"/>
+<l:template name="set" text="%t"/>
+<l:template name="setindex" text="%t"/>
+<l:template name="sidebar" text="%t"/>
+<l:template name="table" text="%t"/>
+<l:template name="task" text="%t"/>
+<l:template name="tip" text="%t"/>
+<l:template name="toc" text="%t"/>
+<l:template name="variablelist" text="%t"/>
+<l:template name="varlistentry" text="%n"/>
+<l:template name="warning" text="%t"/>
+<l:template name="olink.document.citation" text=" у %o"/>
+<l:template name="olink.page.citation" text=" (ÑÑ‚Ñ€. %p)"/>
+<l:template name="page.citation" text=" [%p]"/>
+<l:template name="page" text="(Ñтрана %p)"/>
+<l:template name="docname" text=" у %o"/>
+<l:template name="docnamelong" text=" у документу Ñа наÑловом %o"/>
+<l:template name="pageabbrev" text="(ÑÑ‚Ñ€. %p)"/>
+<l:template name="Page" text="Страна %p"/>
+<l:template name="bridgehead" text="одељак под именом „%t“"/>
+<l:template name="refsection" text="одељак под именом „%t“"/>
+<l:template name="refsect1" text="одељак под именом „%t“"/>
+<l:template name="refsect2" text="одељак под именом „%t“"/>
+<l:template name="refsect3" text="одељак под именом „%t“"/>
+<l:template name="sect1" text="одељак под именом „%t“"/>
+<l:template name="sect2" text="одељак под именом „%t“"/>
+<l:template name="sect3" text="одељак под именом „%t“"/>
+<l:template name="sect4" text="одељак под именом „%t“"/>
+<l:template name="sect5" text="одељак под именом „%t“"/>
+<l:template name="section" text="одељак под именом „%t“"/>
+<l:template name="simplesect" text="одељак под именом „%t“"/>
+</l:context>
+<l:context name="xref-number"><l:template name="answer" text="О: %n"/>
+<l:template name="appendix" text="Додатак %n"/>
+<l:template name="bridgehead" text="Одељак %n"/>
+<l:template name="chapter" text="Поглавље %n"/>
+<l:template name="equation" text="Једначина %n"/>
+<l:template name="example" text="Пример %n"/>
+<l:template name="figure" text="Слика %n"/>
+<l:template name="part" text="Део %n"/>
+<l:template name="procedure" text="ПоÑтупак %n"/>
+<l:template name="productionset" text="Продукција %n"/>
+<l:template name="qandadiv" text="П и О %n"/>
+<l:template name="qandaentry" text="П: %n"/>
+<l:template name="question" text="П: %n"/>
+<l:template name="sect1" text="Одељак %n"/>
+<l:template name="sect2" text="Одељак %n"/>
+<l:template name="sect3" text="Одељак %n"/>
+<l:template name="sect4" text="Одељак %n"/>
+<l:template name="sect5" text="Одељак %n"/>
+<l:template name="section" text="Одељак %n"/>
+<l:template name="table" text="Табела %n"/>
+</l:context>
+<l:context name="xref-number-and-title"><l:template name="appendix" text="Додатак %n, %t"/>
+<l:template name="bridgehead" text="Одељак %n, „%t“"/>
+<l:template name="chapter" text="Поглавље %n, %t"/>
+<l:template name="equation" text="Једначина %n, „%t“"/>
+<l:template name="example" text="Пример %n, „%t“"/>
+<l:template name="figure" text="Слика %n, „%t“"/>
+<l:template name="part" text="Део %n, „%t“"/>
+<l:template name="procedure" text="ПоÑтупак %n, „%t“"/>
+<l:template name="productionset" text="Продукција %n, „%t“"/>
+<l:template name="qandadiv" text="П и О %n, „%t“"/>
+<l:template name="refsect1" text="одељак под именом „%t“"/>
+<l:template name="refsect2" text="одељак под именом „%t“"/>
+<l:template name="refsect3" text="одељак под именом „%t“"/>
+<l:template name="refsection" text="одељак под именом „%t“"/>
+<l:template name="sect1" text="Одељак %n, „%t“"/>
+<l:template name="sect2" text="Одељак %n, „%t“"/>
+<l:template name="sect3" text="Одељак %n, „%t“"/>
+<l:template name="sect4" text="Одељак %n, „%t“"/>
+<l:template name="sect5" text="Одељак %n, „%t“"/>
+<l:template name="section" text="Одељак %n, „%t“"/>
+<l:template name="simplesect" text="одељак под именом „%t“"/>
+<l:template name="table" text="Табела %n, „%t“"/>
+</l:context>
+<l:context name="authorgroup"><l:template name="sep" text=", "/>
+<l:template name="sep2" text=" и "/>
+<l:template name="seplast" text=", и "/>
+</l:context>
+<l:context name="glossary"><l:template name="see" text="Види %t."/>
+<l:template name="seealso" text="Види такође %t."/>
+<l:template name="seealso-separator" text=", "/>
+</l:context>
+<l:context name="msgset"><l:template name="MsgAud" text="Публика: "/>
+<l:template name="MsgLevel" text="Ðиво: "/>
+<l:template name="MsgOrig" text="Извор: "/>
+</l:context>
+<l:context name="datetime"><l:template name="format" text="d.m.Y."/>
+</l:context>
+<l:context name="termdef"><l:template name="prefix" text="[Дефиниција: "/>
+<l:template name="suffix" text="]"/>
+</l:context>
+<l:context name="datetime-full"><l:template name="January" text="јануар"/>
+<l:template name="February" text="фебруар"/>
+<l:template name="March" text="март"/>
+<l:template name="April" text="април"/>
+<l:template name="May" text="мај"/>
+<l:template name="June" text="јун"/>
+<l:template name="July" text="јул"/>
+<l:template name="August" text="авгуÑÑ‚"/>
+<l:template name="September" text="Ñептембар"/>
+<l:template name="October" text="октобар"/>
+<l:template name="November" text="новембар"/>
+<l:template name="December" text="децембар"/>
+<l:template name="Monday" text="понедељак"/>
+<l:template name="Tuesday" text="уторак"/>
+<l:template name="Wednesday" text="Ñреда"/>
+<l:template name="Thursday" text="четвртак"/>
+<l:template name="Friday" text="петак"/>
+<l:template name="Saturday" text="Ñубота"/>
+<l:template name="Sunday" text="недеља"/>
+</l:context>
+<l:context name="datetime-abbrev"><l:template name="Jan" text="јан"/>
+<l:template name="Feb" text="феб"/>
+<l:template name="Mar" text="мар"/>
+<l:template name="Apr" text="апр"/>
+<l:template name="May" text="мај"/>
+<l:template name="Jun" text="јун"/>
+<l:template name="Jul" text="јул"/>
+<l:template name="Aug" text="авг"/>
+<l:template name="Sep" text="Ñеп"/>
+<l:template name="Oct" text="окт"/>
+<l:template name="Nov" text="нов"/>
+<l:template name="Dec" text="дец"/>
+<l:template name="Mon" text="пон"/>
+<l:template name="Tue" text="уто"/>
+<l:template name="Wed" text="Ñре"/>
+<l:template name="Thu" text="чет"/>
+<l:template name="Fri" text="пет"/>
+<l:template name="Sat" text="Ñуб"/>
+<l:template name="Sun" text="нед"/>
+</l:context>
+<l:context name="htmlhelp"><l:template name="langcode" text="0x0C1A Serbian (Cyrillic)"/>
+</l:context>
+<l:context name="index"><l:template name="term-separator" text=", " lang="en"/>
+<l:template name="number-separator" text=", " lang="en"/>
+<l:template name="range-separator" text="-" lang="en"/>
+</l:context>
+<l:context name="iso690"><l:template name="lastfirst.sep" text=", " lang="en"/>
+<l:template name="alt.person.two.sep" text=" – " lang="en"/>
+<l:template name="alt.person.last.sep" text=" – " lang="en"/>
+<l:template name="alt.person.more.sep" text=" – " lang="en"/>
+<l:template name="primary.editor" text=" (ed.)" lang="en"/>
+<l:template name="primary.many" text=", et al." lang="en"/>
+<l:template name="primary.sep" text=". " lang="en"/>
+<l:template name="submaintitle.sep" text=": " lang="en"/>
+<l:template name="title.sep" text=". " lang="en"/>
+<l:template name="othertitle.sep" text=", " lang="en"/>
+<l:template name="medium1" text=" [" lang="en"/>
+<l:template name="medium2" text="]" lang="en"/>
+<l:template name="secondary.person.sep" text="; " lang="en"/>
+<l:template name="secondary.sep" text=". " lang="en"/>
+<l:template name="respons.sep" text=". " lang="en"/>
+<l:template name="edition.sep" text=". " lang="en"/>
+<l:template name="edition.serial.sep" text=", " lang="en"/>
+<l:template name="issuing.range" text="-" lang="en"/>
+<l:template name="issuing.div" text=", " lang="en"/>
+<l:template name="issuing.sep" text=". " lang="en"/>
+<l:template name="partnr.sep" text=". " lang="en"/>
+<l:template name="placepubl.sep" text=": " lang="en"/>
+<l:template name="publyear.sep" text=", " lang="en"/>
+<l:template name="pubinfo.sep" text=". " lang="en"/>
+<l:template name="spec.pubinfo.sep" text=", " lang="en"/>
+<l:template name="upd.sep" text=", " lang="en"/>
+<l:template name="datecit1" text=" [cited " lang="en"/>
+<l:template name="datecit2" text="]" lang="en"/>
+<l:template name="extent.sep" text=". " lang="en"/>
+<l:template name="locs.sep" text=", " lang="en"/>
+<l:template name="location.sep" text=". " lang="en"/>
+<l:template name="serie.sep" text=". " lang="en"/>
+<l:template name="notice.sep" text=". " lang="en"/>
+<l:template name="access" text="Available " lang="en"/>
+<l:template name="acctoo" text="Also available " lang="en"/>
+<l:template name="onwww" text="from World Wide Web" lang="en"/>
+<l:template name="oninet" text="from Internet" lang="en"/>
+<l:template name="access.end" text=": " lang="en"/>
+<l:template name="link1" text="&lt;" lang="en"/>
+<l:template name="link2" text="&gt;" lang="en"/>
+<l:template name="access.sep" text=". " lang="en"/>
+<l:template name="isbn" text="ISBN " lang="en"/>
+<l:template name="issn" text="ISSN " lang="en"/>
+<l:template name="stdnum.sep" text=". " lang="en"/>
+<l:template name="patcountry.sep" text=". " lang="en"/>
+<l:template name="pattype.sep" text=", " lang="en"/>
+<l:template name="patnum.sep" text=". " lang="en"/>
+<l:template name="patdate.sep" text=". " lang="en"/>
+</l:context><l:letters><l:l i="-1"/>
+<l:l i="0">Симболи</l:l>
+<l:l i="1">Ð</l:l>
+<l:l i="1">а</l:l>
+<l:l i="2">Б</l:l>
+<l:l i="2">б</l:l>
+<l:l i="3">Ð’</l:l>
+<l:l i="3">в</l:l>
+<l:l i="4">Г</l:l>
+<l:l i="4">г</l:l>
+<l:l i="5">Д</l:l>
+<l:l i="5">д</l:l>
+<l:l i="6">Ђ</l:l>
+<l:l i="6">Ñ’</l:l>
+<l:l i="7">Е</l:l>
+<l:l i="7">е</l:l>
+<l:l i="8">Ж</l:l>
+<l:l i="8">ж</l:l>
+<l:l i="9">З</l:l>
+<l:l i="9">з</l:l>
+<l:l i="10">И</l:l>
+<l:l i="10">и</l:l>
+<l:l i="11">Ј</l:l>
+<l:l i="11">ј</l:l>
+<l:l i="12">К</l:l>
+<l:l i="12">к</l:l>
+<l:l i="13">Л</l:l>
+<l:l i="13">л</l:l>
+<l:l i="14">Љ</l:l>
+<l:l i="14">Ñ™</l:l>
+<l:l i="15">М</l:l>
+<l:l i="15">м</l:l>
+<l:l i="16">Ð</l:l>
+<l:l i="16">н</l:l>
+<l:l i="17">Њ</l:l>
+<l:l i="17">Ñš</l:l>
+<l:l i="18">О</l:l>
+<l:l i="18">о</l:l>
+<l:l i="19">П</l:l>
+<l:l i="19">п</l:l>
+<l:l i="20">Р</l:l>
+<l:l i="20">Ñ€</l:l>
+<l:l i="21">С</l:l>
+<l:l i="21">Ñ</l:l>
+<l:l i="22">Т</l:l>
+<l:l i="22">Ñ‚</l:l>
+<l:l i="23">Ћ</l:l>
+<l:l i="23">Ñ›</l:l>
+<l:l i="24">У</l:l>
+<l:l i="24">у</l:l>
+<l:l i="25">Ф</l:l>
+<l:l i="25">Ñ„</l:l>
+<l:l i="26">Ð¥</l:l>
+<l:l i="26">Ñ…</l:l>
+<l:l i="27">Ц</l:l>
+<l:l i="27">ц</l:l>
+<l:l i="28">Ч</l:l>
+<l:l i="28">ч</l:l>
+<l:l i="29">Ð</l:l>
+<l:l i="29">ÑŸ</l:l>
+<l:l i="30">Ш</l:l>
+<l:l i="30">ш</l:l>
+<l:l i="31">A</l:l>
+<l:l i="31">a</l:l>
+<l:l i="32">B</l:l>
+<l:l i="32">b</l:l>
+<l:l i="33">C</l:l>
+<l:l i="33">c</l:l>
+<l:l i="34">D</l:l>
+<l:l i="34">d</l:l>
+<l:l i="35">E</l:l>
+<l:l i="35">e</l:l>
+<l:l i="36">F</l:l>
+<l:l i="36">f</l:l>
+<l:l i="37">G</l:l>
+<l:l i="37">g</l:l>
+<l:l i="38">H</l:l>
+<l:l i="38">h</l:l>
+<l:l i="39">I</l:l>
+<l:l i="39">i</l:l>
+<l:l i="40">J</l:l>
+<l:l i="40">j</l:l>
+<l:l i="41">K</l:l>
+<l:l i="41">k</l:l>
+<l:l i="42">L</l:l>
+<l:l i="42">l</l:l>
+<l:l i="43">M</l:l>
+<l:l i="43">m</l:l>
+<l:l i="44">N</l:l>
+<l:l i="44">n</l:l>
+<l:l i="45">O</l:l>
+<l:l i="45">o</l:l>
+<l:l i="46">P</l:l>
+<l:l i="46">p</l:l>
+<l:l i="47">Q</l:l>
+<l:l i="47">Q</l:l>
+<l:l i="48">R</l:l>
+<l:l i="48">r</l:l>
+<l:l i="49">S</l:l>
+<l:l i="49">s</l:l>
+<l:l i="50">T</l:l>
+<l:l i="50">t</l:l>
+<l:l i="51">U</l:l>
+<l:l i="51">u</l:l>
+<l:l i="52">V</l:l>
+<l:l i="52">v</l:l>
+<l:l i="53">W</l:l>
+<l:l i="53">w</l:l>
+<l:l i="54">X</l:l>
+<l:l i="54">x</l:l>
+<l:l i="55">Y</l:l>
+<l:l i="55">y</l:l>
+<l:l i="56">Z</l:l>
+<l:l i="56">z</l:l>
+</l:letters>
+</l:l10n>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/sr_Latn.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/sr_Latn.xml
new file mode 100644
index 0000000..7ebb8da
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/sr_Latn.xml
@@ -0,0 +1,679 @@
+<?xml version="1.0" encoding="utf-8"?>
+<l:l10n xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0" language="sr_latn" english-language-name="Serbian in Latin script">
+
+<!-- * This file is generated automatically. -->
+<!-- * To submit changes to this file upstream (to the DocBook Project) -->
+<!-- * do not submit an edited version of this file. Instead, submit an -->
+<!-- * edited version of the source file at the following location: -->
+<!-- * -->
+<!-- * https://docbook.svn.sourceforge.net/svnroot/docbook/trunk/gentext/locale/sr_Latn.xml -->
+<!-- * -->
+<!-- * E-mail the edited sr_Latn.xml source file to: -->
+<!-- * -->
+<!-- * docbook-developers@lists.sourceforge.net -->
+
+<!-- ******************************************************************** -->
+
+<!-- This file is part of the XSL DocBook Stylesheet distribution. -->
+<!-- See ../README or http://docbook.sf.net/release/xsl/current/ for -->
+<!-- copyright and other information. -->
+
+<!-- ******************************************************************** -->
+<!-- In these files, % with a letter is used for a placeholder: -->
+<!-- %t is the current element's title -->
+<!-- %s is the current element's subtitle (if applicable)-->
+<!-- %n is the current element's number label-->
+<!-- %p is the current element's page number (if applicable)-->
+<!-- ******************************************************************** -->
+
+
+<l:gentext key="Abstract" text="Sažetak"/>
+<l:gentext key="abstract" text="sažetak"/>
+<l:gentext key="Acknowledgements" text="Priznanja"/>
+<l:gentext key="acknowledgements" text="priznanja"/>
+<l:gentext key="Answer" text="O:"/>
+<l:gentext key="answer" text="o:"/>
+<l:gentext key="Appendix" text="Dodatak"/>
+<l:gentext key="appendix" text="dodatak"/>
+<l:gentext key="Article" text="ÄŒlanak"/>
+<l:gentext key="article" text="Älanak"/>
+<l:gentext key="Author" text="Autor"/>
+<l:gentext key="Bibliography" text="Literatura"/>
+<l:gentext key="bibliography" text="literatura"/>
+<l:gentext key="Book" text="Knjiga"/>
+<l:gentext key="book" text="knjiga"/>
+<l:gentext key="CAUTION" text="UPOZORENJE"/>
+<l:gentext key="Caution" text="Upozorenje"/>
+<l:gentext key="caution" text="upozorenje"/>
+<l:gentext key="Chapter" text="Poglavlje"/>
+<l:gentext key="chapter" text="poglavlje"/>
+<l:gentext key="Colophon" text="Kolofon"/>
+<l:gentext key="colophon" text="kolofon"/>
+<l:gentext key="Copyright" text="Autorska prava"/>
+<l:gentext key="copyright" text="autorska prava"/>
+<l:gentext key="Dedication" text="Posveta"/>
+<l:gentext key="dedication" text="posveta"/>
+<l:gentext key="Edition" text="Izdanje"/>
+<l:gentext key="edition" text="izdanje"/>
+<l:gentext key="Editor" text="Urednik"/>
+<l:gentext key="Equation" text="JednaÄina"/>
+<l:gentext key="equation" text="jednaÄina"/>
+<l:gentext key="Example" text="Primer"/>
+<l:gentext key="example" text="primer"/>
+<l:gentext key="Figure" text="Slika"/>
+<l:gentext key="figure" text="slika"/>
+<l:gentext key="Glossary" text="ReÄnik"/>
+<l:gentext key="glossary" text="reÄnik"/>
+<l:gentext key="GlossSee" text="Vidi"/>
+<l:gentext key="glosssee" text="vidi"/>
+<l:gentext key="GlossSeeAlso" text="Vidi takođe"/>
+<l:gentext key="glossseealso" text="vidi takođe"/>
+<l:gentext key="IMPORTANT" text="VAŽNO"/>
+<l:gentext key="important" text="važno"/>
+<l:gentext key="Important" text="Važno"/>
+<l:gentext key="Index" text="Indeks"/>
+<l:gentext key="index" text="indeks"/>
+<l:gentext key="ISBN" text="ISBN"/>
+<l:gentext key="isbn" text="ISBN"/>
+<l:gentext key="LegalNotice" text="Pravna napomena"/>
+<l:gentext key="legalnotice" text="pravna napomena"/>
+<l:gentext key="MsgAud" text="Publika"/>
+<l:gentext key="msgaud" text="publika"/>
+<l:gentext key="MsgLevel" text="Nivo"/>
+<l:gentext key="msglevel" text="nivo"/>
+<l:gentext key="MsgOrig" text="Izvor"/>
+<l:gentext key="msgorig" text="izvor"/>
+<l:gentext key="NOTE" text="PRIMEDBA"/>
+<l:gentext key="Note" text="Primedba"/>
+<l:gentext key="note" text="primedba"/>
+<l:gentext key="Part" text="Deo"/>
+<l:gentext key="part" text="deo"/>
+<l:gentext key="Preface" text="Predgovor"/>
+<l:gentext key="preface" text="predgovor"/>
+<l:gentext key="Procedure" text="Postupak"/>
+<l:gentext key="procedure" text="postupak"/>
+<l:gentext key="ProductionSet" text="Produkcija"/>
+<l:gentext key="PubDate" text="Datum izdavanja"/>
+<l:gentext key="pubdate" text="datum izdavanja"/>
+<l:gentext key="Published" text="Izdano"/>
+<l:gentext key="published" text="izdano"/>
+<l:gentext key="Publisher" text="IzdavaÄ"/>
+<l:gentext key="Qandadiv" text="P i O"/>
+<l:gentext key="qandadiv" text="p i o"/>
+<l:gentext key="QandASet" text="ÄŒesto postavljana pitanja"/>
+<l:gentext key="Question" text="P:"/>
+<l:gentext key="question" text="p:"/>
+<l:gentext key="RefEntry" text="Stranica"/>
+<l:gentext key="refentry" text="stranica"/>
+<l:gentext key="Reference" text="Referenca"/>
+<l:gentext key="reference" text="referenca"/>
+<l:gentext key="References" text="Reference"/>
+<l:gentext key="RefName" text="Ime"/>
+<l:gentext key="refname" text="ime"/>
+<l:gentext key="RefSection" text="Odeljak"/>
+<l:gentext key="refsection" text="odeljak"/>
+<l:gentext key="RefSynopsisDiv" text="Pregled"/>
+<l:gentext key="refsynopsisdiv" text="pregled"/>
+<l:gentext key="RevHistory" text="Istorija revizija"/>
+<l:gentext key="revhistory" text="istorija revizija"/>
+<l:gentext key="revision" text="revizija"/>
+<l:gentext key="Revision" text="Revizija"/>
+<l:gentext key="sect1" text="Odeljak"/>
+<l:gentext key="sect2" text="Odeljak"/>
+<l:gentext key="sect3" text="Odeljak"/>
+<l:gentext key="sect4" text="Odeljak"/>
+<l:gentext key="sect5" text="Odeljak"/>
+<l:gentext key="section" text="odeljak"/>
+<l:gentext key="Section" text="Odeljak"/>
+<l:gentext key="see" text="vidi"/>
+<l:gentext key="See" text="Vidi"/>
+<l:gentext key="seealso" text="vidi takođe"/>
+<l:gentext key="Seealso" text="Vidi takođe"/>
+<l:gentext key="SeeAlso" text="Vidi takođe"/>
+<l:gentext key="set" text="skup"/>
+<l:gentext key="Set" text="Skup"/>
+<l:gentext key="setindex" text="indeks skupa"/>
+<l:gentext key="SetIndex" text="Indeks skupa"/>
+<l:gentext key="Sidebar" text="BoÄna traka"/>
+<l:gentext key="sidebar" text="boÄna traka"/>
+<l:gentext key="step" text="korak"/>
+<l:gentext key="Step" text="Korak"/>
+<l:gentext key="table" text="tabela"/>
+<l:gentext key="Table" text="Tabela"/>
+<l:gentext key="task" text="zadatak"/>
+<l:gentext key="Task" text="Zadatak"/>
+<l:gentext key="tip" text="savet"/>
+<l:gentext key="TIP" text="SAVET"/>
+<l:gentext key="Tip" text="Savet"/>
+<l:gentext key="Warning" text="Upozorenje"/>
+<l:gentext key="warning" text="upozorenje"/>
+<l:gentext key="WARNING" text="UPOZORENJE"/>
+<l:gentext key="and" text="i"/>
+<l:gentext key="by" text="od"/>
+<l:gentext key="Edited" text="Uređeno"/>
+<l:gentext key="edited" text="uređeno"/>
+<l:gentext key="Editedby" text="Uredio(la)"/>
+<l:gentext key="editedby" text="Uredio(la)"/>
+<l:gentext key="in" text="u"/>
+<l:gentext key="lastlistcomma" text=","/>
+<l:gentext key="listcomma" text=","/>
+<l:gentext key="notes" text="primedbe"/>
+<l:gentext key="Notes" text="Primedbe"/>
+<l:gentext key="Pgs" text="Str."/>
+<l:gentext key="pgs" text="str."/>
+<l:gentext key="Revisedby" text="Pregledao(la): "/>
+<l:gentext key="revisedby" text="pregledao(la): "/>
+<l:gentext key="TableNotes" text="Primedbe"/>
+<l:gentext key="tablenotes" text="primedbe"/>
+<l:gentext key="TableofContents" text="Sadržaj"/>
+<l:gentext key="tableofcontents" text="sadržaj"/>
+<l:gentext key="unexpectedelementname" text="neoÄekivano ime elementa"/>
+<l:gentext key="unsupported" text="nije podržano"/>
+<l:gentext key="xrefto" text="unakrsna referenca na"/>
+<l:gentext key="Authors" text="Autori"/>
+<l:gentext key="copyeditor" text="IzdavaÄki urednik"/>
+<l:gentext key="graphicdesigner" text="GrafiÄki dizajner"/>
+<l:gentext key="productioneditor" text="Izvršni urednik"/>
+<l:gentext key="technicaleditor" text="TehniÄki urednik"/>
+<l:gentext key="translator" text="Prevodilac"/>
+<l:gentext key="listofequations" text="spisak jednaÄina"/>
+<l:gentext key="ListofEquations" text="Spisak jednaÄina"/>
+<l:gentext key="ListofExamples" text="Spisak primera"/>
+<l:gentext key="listofexamples" text="spisak primera"/>
+<l:gentext key="ListofFigures" text="Spisak slika"/>
+<l:gentext key="listoffigures" text="spisak slika"/>
+<l:gentext key="ListofProcedures" text="Spisak postupaka"/>
+<l:gentext key="listofprocedures" text="spisak postupaka"/>
+<l:gentext key="listoftables" text="spisak tabela"/>
+<l:gentext key="ListofTables" text="Spisak tabela"/>
+<l:gentext key="ListofUnknown" text="spisak nepoznatih"/>
+<l:gentext key="listofunknown" text="Spisak nepoznatih"/>
+<l:gentext key="nav-home" text="PoÄetak"/>
+<l:gentext key="nav-next" text="Sledeći"/>
+<l:gentext key="nav-next-sibling" text="Brzo napred"/>
+<l:gentext key="nav-prev" text="Prethodni"/>
+<l:gentext key="nav-prev-sibling" text="Brzo nazad"/>
+<l:gentext key="nav-up" text="Vrh"/>
+<l:gentext key="nav-toc" text="Sadr."/>
+<l:gentext key="Draft" text="Nacrt"/>
+<l:gentext key="above" text="iznad"/>
+<l:gentext key="below" text="ispod"/>
+<l:gentext key="sectioncalled" text="odeljak pod imenom"/>
+<l:gentext key="index symbols" text="Simboli"/>
+<l:gentext key="writing-mode" text="lr-tb"/>
+<l:gentext key="lowercase.alpha" text="abcÄćdÄ‘efghijklmnopqrsÅ¡tuvwxyzž"/>
+<l:gentext key="uppercase.alpha" text="ABCČĆDÄEFGHIJKLMNOPQRSÅ TUVWXYZŽ"/>
+<l:gentext key="normalize.sort.input" text="AaÀàÃáÂâÃãÄäÅåĀÄĂ㥹ÇǎǞǟǠǡǺǻȀÈȂȃȦȧḀá¸áºšáº áº¡áº¢áº£áº¤áº¥áº¦áº§áº¨áº©áºªáº«áº¬áº­áº®áº¯áº°áº±áº²áº³áº´áºµáº¶áº·BbÆ€ÆɓƂƃḂḃḄḅḆḇCcÇçĆćĈĉĊċČÄƇƈɕḈḉDdÄŽÄÄđƊɗƋƌDžDzȡɖḊḋḌá¸á¸Žá¸á¸á¸‘ḒḓEeÈèÉéÊêËëĒēĔĕĖėĘęĚěȄȅȆȇȨȩḔḕḖḗḘḙḚḛḜá¸áº¸áº¹áººáº»áº¼áº½áº¾áº¿á»€á»á»‚ểỄễỆệFfƑƒḞḟGgÄœÄĞğĠġĢģƓɠǤǥǦǧǴǵḠḡHhĤĥĦħȞȟɦḢḣḤḥḦḧḨḩḪḫẖIiÌìÃíÎîÃïĨĩĪīĬĭĮįİƗɨÇÇȈȉȊȋḬḭḮḯỈỉỊịJjĴĵǰÊKkĶķƘƙǨǩḰḱḲḳḴḵLlĹĺĻļĽľĿŀÅłƚLjȴɫɬɭḶḷḸḹḺḻḼḽMmɱḾḿṀá¹á¹‚ṃNnÑñŃńŅņŇňÆɲƞȠNjǸǹȵɳṄṅṆṇṈṉṊṋOoÒòÓóÔôÕõÖöØøŌÅÅŽÅÅőƟƠơǑǒǪǫǬǭǾǿȌÈÈŽÈȪȫȬȭȮȯȰȱṌá¹á¹Žá¹á¹á¹‘ṒṓỌá»á»Žá»á»á»‘ỒồỔổỖỗỘộỚớỜá»á»žá»Ÿá» á»¡á»¢á»£PpƤƥṔṕṖṗQqÊ RrŔŕŖŗŘřÈȑȒȓɼɽɾṘṙṚṛṜá¹á¹žá¹ŸSsŚśŜÅŞşŠšȘșʂṠṡṢṣṤṥṦṧṨṩTtŢţŤťŦŧƫƬƭƮʈȚțȶṪṫṬṭṮṯṰṱẗUuÙùÚúÛûÜüŨũŪūŬŭŮůŰűŲųƯưǓǔǕǖǗǘǙǚǛǜȔȕȖȗṲṳṴṵṶṷṸṹṺṻỤụỦủỨứỪừỬửỮữỰựVvƲʋṼṽṾṿWwŴŵẀáºáº‚ẃẄẅẆẇẈẉẘXxẊẋẌáºYyÃýÿŸŶŷƳƴȲȳẎáºáº™á»²á»³á»´á»µá»¶á»·á»¸á»¹ZzŹźŻżŽžƵƶȤȥÊÊ‘áºáº‘ẒẓẔẕẕ" lang="en"/>
+<l:gentext key="normalize.sort.output" text="AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBCCCCCCCCCCCCCCCCCDDDDDDDDDDDDDDDDDDDDDDDDEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEFFFFFFGGGGGGGGGGGGGGGGGGGGHHHHHHHHHHHHHHHHHHHHIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIJJJJJJKKKKKKKKKKKKKKLLLLLLLLLLLLLLLLLLLLLLLLLLMMMMMMMMMNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOPPPPPPPPQQQRRRRRRRRRRRRRRRRRRRRRRRSSSSSSSSSSSSSSSSSSSSSSSTTTTTTTTTTTTTTTTTTTTTTTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUVVVVVVVVWWWWWWWWWWWWWWWXXXXXXYYYYYYYYYYYYYYYYYYYYYYYZZZZZZZZZZZZZZZZZZZZZ" lang="en"/>
+<l:dingbat key="startquote" text="„"/>
+<l:dingbat key="endquote" text="“"/>
+<l:dingbat key="nestedstartquote" text="‘"/>
+<l:dingbat key="nestedendquote" text="’"/>
+<l:dingbat key="singlestartquote" text="‘"/>
+<l:dingbat key="singleendquote" text="’"/>
+<l:dingbat key="bullet" text="•"/>
+<l:gentext key="hyphenation-character" text="-"/>
+<l:gentext key="hyphenation-push-character-count" text="2"/>
+<l:gentext key="hyphenation-remain-character-count" text="2"/>
+<l:context name="styles"><l:template name="person-name" text="ime-prezime"/>
+</l:context>
+<l:context name="title"><l:template name="abstract" text="%t"/>
+<l:template name="acknowledgements" text="%t" lang="en"/>
+<l:template name="answer" text="%t"/>
+<l:template name="appendix" text="Dodatak %n. %t"/>
+<l:template name="article" text="%t"/>
+<l:template name="authorblurb" text="%t"/>
+<l:template name="bibliodiv" text="%t"/>
+<l:template name="biblioentry" text="%t"/>
+<l:template name="bibliography" text="%t"/>
+<l:template name="bibliolist" text="%t"/>
+<l:template name="bibliomixed" text="%t"/>
+<l:template name="bibliomset" text="%t"/>
+<l:template name="biblioset" text="%t"/>
+<l:template name="blockquote" text="%t"/>
+<l:template name="book" text="%t"/>
+<l:template name="calloutlist" text="%t"/>
+<l:template name="caution" text="%t"/>
+<l:template name="chapter" text="Poglavlje %n. %t"/>
+<l:template name="colophon" text="%t"/>
+<l:template name="dedication" text="%t"/>
+<l:template name="equation" text="JednaÄina %n. %t"/>
+<l:template name="example" text="Primer %n. %t"/>
+<l:template name="figure" text="Slika %n. %t"/>
+<l:template name="foil" text="%t"/>
+<l:template name="foilgroup" text="%t"/>
+<l:template name="formalpara" text="%t"/>
+<l:template name="glossary" text="%t"/>
+<l:template name="glossdiv" text="%t"/>
+<l:template name="glosslist" text="%t"/>
+<l:template name="glossentry" text="%t"/>
+<l:template name="important" text="%t"/>
+<l:template name="index" text="%t"/>
+<l:template name="indexdiv" text="%t"/>
+<l:template name="itemizedlist" text="%t"/>
+<l:template name="legalnotice" text="%t"/>
+<l:template name="listitem" text=""/>
+<l:template name="lot" text="%t"/>
+<l:template name="msg" text="%t"/>
+<l:template name="msgexplan" text="%t"/>
+<l:template name="msgmain" text="%t"/>
+<l:template name="msgrel" text="%t"/>
+<l:template name="msgset" text="%t"/>
+<l:template name="msgsub" text="%t"/>
+<l:template name="note" text="%t"/>
+<l:template name="orderedlist" text="%t"/>
+<l:template name="part" text="Deo %n. %t"/>
+<l:template name="partintro" text="%t"/>
+<l:template name="preface" text="%t"/>
+<l:template name="procedure" text="%t"/>
+<l:template name="procedure.formal" text="Postupak %n. %t"/>
+<l:template name="productionset" text="%t"/>
+<l:template name="productionset.formal" text="Produkcija %n"/>
+<l:template name="qandadiv" text="%t"/>
+<l:template name="qandaentry" text="%t"/>
+<l:template name="qandaset" text="%t"/>
+<l:template name="question" text="%t"/>
+<l:template name="refentry" text="%t"/>
+<l:template name="reference" text="%t"/>
+<l:template name="refsection" text="%t"/>
+<l:template name="refsect1" text="%t"/>
+<l:template name="refsect2" text="%t"/>
+<l:template name="refsect3" text="%t"/>
+<l:template name="refsynopsisdiv" text="%t"/>
+<l:template name="refsynopsisdivinfo" text="%t"/>
+<l:template name="segmentedlist" text="%t"/>
+<l:template name="set" text="%t"/>
+<l:template name="setindex" text="%t"/>
+<l:template name="sidebar" text="%t"/>
+<l:template name="step" text="%t"/>
+<l:template name="table" text="Tabela %n. %t"/>
+<l:template name="task" text="%t"/>
+<l:template name="tasksummary" text="%t"/>
+<l:template name="taskprerequisites" text="%t"/>
+<l:template name="taskrelated" text="%t"/>
+<l:template name="tip" text="%t"/>
+<l:template name="toc" text="%t"/>
+<l:template name="variablelist" text="%t"/>
+<l:template name="varlistentry" text=""/>
+<l:template name="warning" text="%t"/>
+</l:context>
+<l:context name="title-unnumbered"><l:template name="appendix" text="%t"/>
+<l:template name="article/appendix" text="%t"/>
+<l:template name="bridgehead" text="%t"/>
+<l:template name="chapter" text="%t"/>
+<l:template name="sect1" text="%t"/>
+<l:template name="sect2" text="%t"/>
+<l:template name="sect3" text="%t"/>
+<l:template name="sect4" text="%t"/>
+<l:template name="sect5" text="%t"/>
+<l:template name="section" text="%t"/>
+<l:template name="simplesect" text="%t"/>
+<l:template name="part" text="%t"/>
+</l:context>
+<l:context name="title-numbered"><l:template name="appendix" text="Dodatak %n. %t"/>
+<l:template name="article/appendix" text="%n. %t"/>
+<l:template name="bridgehead" text="%n. %t"/>
+<l:template name="chapter" text="Poglavlje %n. %t"/>
+<l:template name="part" text="Deo %n. %t"/>
+<l:template name="sect1" text="%n. %t"/>
+<l:template name="sect2" text="%n. %t"/>
+<l:template name="sect3" text="%n. %t"/>
+<l:template name="sect4" text="%n. %t"/>
+<l:template name="sect5" text="%n. %t"/>
+<l:template name="section" text="%n. %t"/>
+<l:template name="simplesect" text="%t"/>
+</l:context>
+<l:context name="subtitle"><l:template name="appendix" text="%s"/>
+<l:template name="acknowledgements" text="%s" lang="en"/>
+<l:template name="article" text="%s"/>
+<l:template name="bibliodiv" text="%s"/>
+<l:template name="biblioentry" text="%s"/>
+<l:template name="bibliography" text="%s"/>
+<l:template name="bibliomixed" text="%s"/>
+<l:template name="bibliomset" text="%s"/>
+<l:template name="biblioset" text="%s"/>
+<l:template name="book" text="%s"/>
+<l:template name="chapter" text="%s"/>
+<l:template name="colophon" text="%s"/>
+<l:template name="dedication" text="%s"/>
+<l:template name="glossary" text="%s"/>
+<l:template name="glossdiv" text="%s"/>
+<l:template name="index" text="%s"/>
+<l:template name="indexdiv" text="%s"/>
+<l:template name="lot" text="%s"/>
+<l:template name="part" text="%s"/>
+<l:template name="partintro" text="%s"/>
+<l:template name="preface" text="%s"/>
+<l:template name="refentry" text="%s"/>
+<l:template name="reference" text="%s"/>
+<l:template name="refsection" text="%s"/>
+<l:template name="refsect1" text="%s"/>
+<l:template name="refsect2" text="%s"/>
+<l:template name="refsect3" text="%s"/>
+<l:template name="refsynopsisdiv" text="%s"/>
+<l:template name="sect1" text="%s"/>
+<l:template name="sect2" text="%s"/>
+<l:template name="sect3" text="%s"/>
+<l:template name="sect4" text="%s"/>
+<l:template name="sect5" text="%s"/>
+<l:template name="section" text="%s"/>
+<l:template name="set" text="%s"/>
+<l:template name="setindex" text="%s"/>
+<l:template name="sidebar" text="%s"/>
+<l:template name="simplesect" text="%s"/>
+<l:template name="toc" text="%s"/>
+</l:context>
+<l:context name="xref"><l:template name="abstract" text="%t"/>
+<l:template name="acknowledgements" text="%t" lang="en"/>
+<l:template name="answer" text="O: %n"/>
+<l:template name="appendix" text="%t"/>
+<l:template name="article" text="%t"/>
+<l:template name="authorblurb" text="%t"/>
+<l:template name="bibliodiv" text="%t"/>
+<l:template name="bibliography" text="%t"/>
+<l:template name="bibliomset" text="%t"/>
+<l:template name="biblioset" text="%t"/>
+<l:template name="blockquote" text="%t"/>
+<l:template name="book" text="%t"/>
+<l:template name="calloutlist" text="%t"/>
+<l:template name="caution" text="%t"/>
+<l:template name="chapter" text="%t"/>
+<l:template name="colophon" text="%t"/>
+<l:template name="constraintdef" text="%t"/>
+<l:template name="dedication" text="%t"/>
+<l:template name="equation" text="%t"/>
+<l:template name="example" text="%t"/>
+<l:template name="figure" text="%t"/>
+<l:template name="foil" text="%t"/>
+<l:template name="foilgroup" text="%t"/>
+<l:template name="formalpara" text="%t"/>
+<l:template name="glossary" text="%t"/>
+<l:template name="glossdiv" text="%t"/>
+<l:template name="important" text="%t"/>
+<l:template name="index" text="%t"/>
+<l:template name="indexdiv" text="%t"/>
+<l:template name="itemizedlist" text="%t"/>
+<l:template name="legalnotice" text="%t"/>
+<l:template name="listitem" text="%n"/>
+<l:template name="lot" text="%t"/>
+<l:template name="msg" text="%t"/>
+<l:template name="msgexplan" text="%t"/>
+<l:template name="msgmain" text="%t"/>
+<l:template name="msgrel" text="%t"/>
+<l:template name="msgset" text="%t"/>
+<l:template name="msgsub" text="%t"/>
+<l:template name="note" text="%t"/>
+<l:template name="orderedlist" text="%t"/>
+<l:template name="part" text="%t"/>
+<l:template name="partintro" text="%t"/>
+<l:template name="preface" text="%t"/>
+<l:template name="procedure" text="%t"/>
+<l:template name="productionset" text="%t"/>
+<l:template name="qandadiv" text="%t"/>
+<l:template name="qandaentry" text="P: %n"/>
+<l:template name="qandaset" text="%t"/>
+<l:template name="question" text="P: %n"/>
+<l:template name="reference" text="%t"/>
+<l:template name="refsynopsisdiv" text="%t"/>
+<l:template name="segmentedlist" text="%t"/>
+<l:template name="set" text="%t"/>
+<l:template name="setindex" text="%t"/>
+<l:template name="sidebar" text="%t"/>
+<l:template name="table" text="%t"/>
+<l:template name="task" text="%t"/>
+<l:template name="tip" text="%t"/>
+<l:template name="toc" text="%t"/>
+<l:template name="variablelist" text="%t"/>
+<l:template name="varlistentry" text="%n"/>
+<l:template name="warning" text="%t"/>
+<l:template name="olink.document.citation" text=" u %o"/>
+<l:template name="olink.page.citation" text=" (str. %p)"/>
+<l:template name="page.citation" text=" [%p]"/>
+<l:template name="page" text="(strana %p)"/>
+<l:template name="docname" text=" u %o"/>
+<l:template name="docnamelong" text=" u dokumentu sa naslovom %o"/>
+<l:template name="pageabbrev" text="(str. %p)"/>
+<l:template name="Page" text="Strana %p"/>
+<l:template name="bridgehead" text="odeljak pod imenom „%t“"/>
+<l:template name="refsection" text="odeljak pod imenom „%t“"/>
+<l:template name="refsect1" text="odeljak pod imenom „%t“"/>
+<l:template name="refsect2" text="odeljak pod imenom „%t“"/>
+<l:template name="refsect3" text="odeljak pod imenom „%t“"/>
+<l:template name="sect1" text="odeljak pod imenom „%t“"/>
+<l:template name="sect2" text="odeljak pod imenom „%t“"/>
+<l:template name="sect3" text="odeljak pod imenom „%t“"/>
+<l:template name="sect4" text="odeljak pod imenom „%t“"/>
+<l:template name="sect5" text="odeljak pod imenom „%t“"/>
+<l:template name="section" text="odeljak pod imenom „%t“"/>
+<l:template name="simplesect" text="odeljak pod imenom „%t“"/>
+</l:context>
+<l:context name="xref-number"><l:template name="answer" text="O: %n"/>
+<l:template name="appendix" text="Dodatak %n"/>
+<l:template name="bridgehead" text="Odeljak %n"/>
+<l:template name="chapter" text="Poglavlje %n"/>
+<l:template name="equation" text="JednaÄina %n"/>
+<l:template name="example" text="Primer %n"/>
+<l:template name="figure" text="Slika %n"/>
+<l:template name="part" text="Deo %n"/>
+<l:template name="procedure" text="Postupak %n"/>
+<l:template name="productionset" text="Produkcija %n"/>
+<l:template name="qandadiv" text="P i O %n"/>
+<l:template name="qandaentry" text="P: %n"/>
+<l:template name="question" text="P: %n"/>
+<l:template name="sect1" text="Odeljak %n"/>
+<l:template name="sect2" text="Odeljak %n"/>
+<l:template name="sect3" text="Odeljak %n"/>
+<l:template name="sect4" text="Odeljak %n"/>
+<l:template name="sect5" text="Odeljak %n"/>
+<l:template name="section" text="Odeljak %n"/>
+<l:template name="table" text="Tabela %n"/>
+</l:context>
+<l:context name="xref-number-and-title"><l:template name="appendix" text="Dodatak %n, %t"/>
+<l:template name="bridgehead" text="Odeljak %n, „%t“"/>
+<l:template name="chapter" text="Poglavlje %n, %t"/>
+<l:template name="equation" text="JednaÄina %n, „%t“"/>
+<l:template name="example" text="Primer %n, „%t“"/>
+<l:template name="figure" text="Slika %n, „%t“"/>
+<l:template name="part" text="Deo %n, „%t“"/>
+<l:template name="procedure" text="Postupak %n, „%t“"/>
+<l:template name="productionset" text="Produkcija %n, „%t“"/>
+<l:template name="qandadiv" text="P i O %n, „%t“"/>
+<l:template name="refsect1" text="odeljak pod imenom „%t“"/>
+<l:template name="refsect2" text="odeljak pod imenom „%t“"/>
+<l:template name="refsect3" text="odeljak pod imenom „%t“"/>
+<l:template name="refsection" text="odeljak pod imenom „%t“"/>
+<l:template name="sect1" text="Odeljak %n, „%t“"/>
+<l:template name="sect2" text="Odeljak %n, „%t“"/>
+<l:template name="sect3" text="Odeljak %n, „%t“"/>
+<l:template name="sect4" text="Odeljak %n, „%t“"/>
+<l:template name="sect5" text="Odeljak %n, „%t“"/>
+<l:template name="section" text="Odeljak %n, „%t“"/>
+<l:template name="simplesect" text="odeljak pod imenom „%t“"/>
+<l:template name="table" text="Tabela %n, „%t“"/>
+</l:context>
+<l:context name="authorgroup"><l:template name="sep" text=", "/>
+<l:template name="sep2" text=" i "/>
+<l:template name="seplast" text=", i "/>
+</l:context>
+<l:context name="glossary"><l:template name="see" text="Vidi %t."/>
+<l:template name="seealso" text="Vidi takođe %t."/>
+<l:template name="seealso-separator" text=", "/>
+</l:context>
+<l:context name="msgset"><l:template name="MsgAud" text="Publika: "/>
+<l:template name="MsgLevel" text="Nivo: "/>
+<l:template name="MsgOrig" text="Izvor: "/>
+</l:context>
+<l:context name="datetime"><l:template name="format" text="d.m.Y."/>
+</l:context>
+<l:context name="termdef"><l:template name="prefix" text="[Definicija: "/>
+<l:template name="suffix" text="]"/>
+</l:context>
+<l:context name="datetime-full"><l:template name="January" text="januar"/>
+<l:template name="February" text="februar"/>
+<l:template name="March" text="mart"/>
+<l:template name="April" text="april"/>
+<l:template name="May" text="maj"/>
+<l:template name="June" text="jun"/>
+<l:template name="July" text="jul"/>
+<l:template name="August" text="avgust"/>
+<l:template name="September" text="septembar"/>
+<l:template name="October" text="oktobar"/>
+<l:template name="November" text="novembar"/>
+<l:template name="December" text="decembar"/>
+<l:template name="Monday" text="ponedeljak"/>
+<l:template name="Tuesday" text="utorak"/>
+<l:template name="Wednesday" text="sreda"/>
+<l:template name="Thursday" text="Äetvrtak"/>
+<l:template name="Friday" text="petak"/>
+<l:template name="Saturday" text="subota"/>
+<l:template name="Sunday" text="nedelja"/>
+</l:context>
+<l:context name="datetime-abbrev"><l:template name="Jan" text="jan"/>
+<l:template name="Feb" text="feb"/>
+<l:template name="Mar" text="mar"/>
+<l:template name="Apr" text="apr"/>
+<l:template name="May" text="maj"/>
+<l:template name="Jun" text="jun"/>
+<l:template name="Jul" text="jul"/>
+<l:template name="Aug" text="avg"/>
+<l:template name="Sep" text="sep"/>
+<l:template name="Oct" text="okt"/>
+<l:template name="Nov" text="nov"/>
+<l:template name="Dec" text="dec"/>
+<l:template name="Mon" text="pon"/>
+<l:template name="Tue" text="uto"/>
+<l:template name="Wed" text="sre"/>
+<l:template name="Thu" text="Äet"/>
+<l:template name="Fri" text="pet"/>
+<l:template name="Sat" text="sub"/>
+<l:template name="Sun" text="ned"/>
+</l:context>
+<l:context name="htmlhelp"><l:template name="langcode" text="0x081a Serbian (Latin)"/>
+</l:context>
+<l:context name="index"><l:template name="term-separator" text=", " lang="en"/>
+<l:template name="number-separator" text=", " lang="en"/>
+<l:template name="range-separator" text="-" lang="en"/>
+</l:context>
+<l:context name="iso690"><l:template name="lastfirst.sep" text=", " lang="en"/>
+<l:template name="alt.person.two.sep" text=" – " lang="en"/>
+<l:template name="alt.person.last.sep" text=" – " lang="en"/>
+<l:template name="alt.person.more.sep" text=" – " lang="en"/>
+<l:template name="primary.editor" text=" (ed.)" lang="en"/>
+<l:template name="primary.many" text=", et al." lang="en"/>
+<l:template name="primary.sep" text=". " lang="en"/>
+<l:template name="submaintitle.sep" text=": " lang="en"/>
+<l:template name="title.sep" text=". " lang="en"/>
+<l:template name="othertitle.sep" text=", " lang="en"/>
+<l:template name="medium1" text=" [" lang="en"/>
+<l:template name="medium2" text="]" lang="en"/>
+<l:template name="secondary.person.sep" text="; " lang="en"/>
+<l:template name="secondary.sep" text=". " lang="en"/>
+<l:template name="respons.sep" text=". " lang="en"/>
+<l:template name="edition.sep" text=". " lang="en"/>
+<l:template name="edition.serial.sep" text=", " lang="en"/>
+<l:template name="issuing.range" text="-" lang="en"/>
+<l:template name="issuing.div" text=", " lang="en"/>
+<l:template name="issuing.sep" text=". " lang="en"/>
+<l:template name="partnr.sep" text=". " lang="en"/>
+<l:template name="placepubl.sep" text=": " lang="en"/>
+<l:template name="publyear.sep" text=", " lang="en"/>
+<l:template name="pubinfo.sep" text=". " lang="en"/>
+<l:template name="spec.pubinfo.sep" text=", " lang="en"/>
+<l:template name="upd.sep" text=", " lang="en"/>
+<l:template name="datecit1" text=" [cited " lang="en"/>
+<l:template name="datecit2" text="]" lang="en"/>
+<l:template name="extent.sep" text=". " lang="en"/>
+<l:template name="locs.sep" text=", " lang="en"/>
+<l:template name="location.sep" text=". " lang="en"/>
+<l:template name="serie.sep" text=". " lang="en"/>
+<l:template name="notice.sep" text=". " lang="en"/>
+<l:template name="access" text="Available " lang="en"/>
+<l:template name="acctoo" text="Also available " lang="en"/>
+<l:template name="onwww" text="from World Wide Web" lang="en"/>
+<l:template name="oninet" text="from Internet" lang="en"/>
+<l:template name="access.end" text=": " lang="en"/>
+<l:template name="link1" text="&lt;" lang="en"/>
+<l:template name="link2" text="&gt;" lang="en"/>
+<l:template name="access.sep" text=". " lang="en"/>
+<l:template name="isbn" text="ISBN " lang="en"/>
+<l:template name="issn" text="ISSN " lang="en"/>
+<l:template name="stdnum.sep" text=". " lang="en"/>
+<l:template name="patcountry.sep" text=". " lang="en"/>
+<l:template name="pattype.sep" text=", " lang="en"/>
+<l:template name="patnum.sep" text=". " lang="en"/>
+<l:template name="patdate.sep" text=". " lang="en"/>
+</l:context><l:letters><l:l i="-1"/>
+<l:l i="0">Simboli</l:l>
+<l:l i="1">A</l:l>
+<l:l i="1">a</l:l>
+<l:l i="2">B</l:l>
+<l:l i="2">b</l:l>
+<l:l i="3">C</l:l>
+<l:l i="3">c</l:l>
+<l:l i="4">Č</l:l>
+<l:l i="4">Ä</l:l>
+<l:l i="5">Ć</l:l>
+<l:l i="5">ć</l:l>
+<l:l i="6">D</l:l>
+<l:l i="6">d</l:l>
+<l:l i="7">DŽ</l:l>
+<l:l i="7">Dž</l:l>
+<l:l i="7">dž</l:l>
+<l:l i="8">Ä</l:l>
+<l:l i="8">Ä‘</l:l>
+<l:l i="9">E</l:l>
+<l:l i="9">e</l:l>
+<l:l i="10">F</l:l>
+<l:l i="10">f</l:l>
+<l:l i="11">G</l:l>
+<l:l i="11">g</l:l>
+<l:l i="12">H</l:l>
+<l:l i="12">h</l:l>
+<l:l i="13">I</l:l>
+<l:l i="13">i</l:l>
+<l:l i="14">J</l:l>
+<l:l i="14">j</l:l>
+<l:l i="15">K</l:l>
+<l:l i="15">k</l:l>
+<l:l i="16">L</l:l>
+<l:l i="16">l</l:l>
+<l:l i="17">LJ</l:l>
+<l:l i="17">Lj</l:l>
+<l:l i="17">lj</l:l>
+<l:l i="18">M</l:l>
+<l:l i="18">m</l:l>
+<l:l i="19">N</l:l>
+<l:l i="19">n</l:l>
+<l:l i="20">NJ</l:l>
+<l:l i="20">Nj</l:l>
+<l:l i="20">nj</l:l>
+<l:l i="21">O</l:l>
+<l:l i="21">o</l:l>
+<l:l i="22">P</l:l>
+<l:l i="22">p</l:l>
+<l:l i="23">Q</l:l>
+<l:l i="23">Q</l:l>
+<l:l i="24">R</l:l>
+<l:l i="24">r</l:l>
+<l:l i="25">S</l:l>
+<l:l i="25">s</l:l>
+<l:l i="26">Å </l:l>
+<l:l i="26">Å¡</l:l>
+<l:l i="27">T</l:l>
+<l:l i="27">t</l:l>
+<l:l i="28">U</l:l>
+<l:l i="28">u</l:l>
+<l:l i="29">V</l:l>
+<l:l i="29">v</l:l>
+<l:l i="30">W</l:l>
+<l:l i="30">w</l:l>
+<l:l i="31">X</l:l>
+<l:l i="31">x</l:l>
+<l:l i="32">Y</l:l>
+<l:l i="32">y</l:l>
+<l:l i="33">Z</l:l>
+<l:l i="33">z</l:l>
+<l:l i="34">Ž</l:l>
+<l:l i="34">ž</l:l>
+</l:letters>
+</l:l10n>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/stripns.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/stripns.xsl
new file mode 100644
index 0000000..56009d0
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/stripns.xsl
@@ -0,0 +1,352 @@
+<?xml version='1.0'?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:ng="http://docbook.org/docbook-ng"
+ xmlns:db="http://docbook.org/ns/docbook"
+ xmlns:saxon="http://icl.com/saxon"
+ xmlns:NodeInfo="http://org.apache.xalan.lib.NodeInfo"
+ xmlns:exsl="http://exslt.org/common"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ exclude-result-prefixes="db ng exsl saxon NodeInfo xlink"
+ version='1.0'>
+
+<!-- ********************************************************************
+ $Id: stripns.xsl 8728 2010-07-15 14:37:33Z mzjn $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<!-- put an xml:base attribute on the root element -->
+<xsl:template match="/*" mode="stripNS">
+ <xsl:choose>
+ <xsl:when test="self::ng:* or self::db:*">
+ <xsl:element name="{local-name(.)}">
+ <xsl:copy-of select="@*[not(name(.) = 'xml:id')
+ and not(name(.) = 'version')]"/>
+ <xsl:if test="@xml:id">
+ <xsl:attribute name="id">
+ <xsl:value-of select="@xml:id"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:call-template name="add-xml-base"/>
+
+ <xsl:apply-templates mode="stripNS"/>
+ </xsl:element>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:copy>
+ <xsl:copy-of select="@*[not(name(.) = 'xml:id')
+ and not(name(.) = 'version')]"/>
+ <xsl:if test="@xml:id">
+ <xsl:attribute name="id">
+ <xsl:value-of select="@xml:id"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:call-template name="add-xml-base"/>
+
+ <xsl:apply-templates mode="stripNS"/>
+ </xsl:copy>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="*" mode="stripNS">
+ <xsl:choose>
+ <xsl:when test="self::ng:* or self::db:*">
+ <xsl:element name="{local-name(.)}">
+ <xsl:copy-of select="@*[not(name(.) = 'xml:id')
+ and not(name(.) = 'version')]"/>
+ <xsl:if test="@xml:id">
+ <xsl:attribute name="id">
+ <xsl:value-of select="@xml:id"/>
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:apply-templates mode="stripNS"/>
+ </xsl:element>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:copy>
+ <xsl:copy-of select="@*[not(name(.) = 'xml:id')
+ and not(name(.) = 'version')]"/>
+ <xsl:if test="@xml:id">
+ <xsl:attribute name="id">
+ <xsl:value-of select="@xml:id"/>
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:apply-templates mode="stripNS"/>
+ </xsl:copy>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="db:info" mode="stripNS">
+ <xsl:variable name="info">
+ <xsl:choose>
+ <xsl:when test="parent::db:article
+ |parent::db:appendix
+ |parent::db:bibliography
+ |parent::db:book
+ |parent::db:chapter
+ |parent::db:glossary
+ |parent::db:index
+ |parent::db:part
+ |parent::db:preface
+ |parent::db:refentry
+ |parent::db:reference
+ |parent::db:refsect1
+ |parent::db:refsect2
+ |parent::db:refsect3
+ |parent::db:refsection
+ |parent::db:refsynopsisdiv
+ |parent::db:sect1
+ |parent::db:sect2
+ |parent::db:sect3
+ |parent::db:sect4
+ |parent::db:sect5
+ |parent::db:section
+ |parent::db:setindex
+ |parent::db:set
+ |parent::db:slides
+ |parent::db:sidebar">
+ <xsl:value-of select="local-name(parent::*)"/>
+ <xsl:text>info</xsl:text>
+ </xsl:when>
+ <xsl:when test="parent::db:audioobject
+ |parent::db:imageobject
+ |parent::db:inlinemediaobject
+ |parent::db:mediaobject
+ |parent::db:mediaobjectco
+ |parent::db:textobject
+ |parent::db:videoobject">
+ <xsl:text>objectinfo</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>blockinfo</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:element name="{$info}">
+ <xsl:copy-of select="@*[not(name(.) = 'xml:id')
+ and not(name(.) = 'version')]"/>
+ <xsl:if test="@xml:id">
+ <xsl:attribute name="id">
+ <xsl:value-of select="@xml:id"/>
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:apply-templates mode="stripNS"/>
+ </xsl:element>
+
+ <xsl:if test="(not(../db:title) and not(../ng:title))
+ and ($info = 'prefaceinfo'
+ or $info = 'chapterinfo'
+ or $info = 'sectioninfo'
+ or $info = 'sect1info'
+ or $info = 'sect2info'
+ or $info = 'sect3info'
+ or $info = 'sect4info'
+ or $info = 'sect5info'
+ or $info = 'refsectioninfo'
+ or $info = 'refsect1info'
+ or $info = 'refsect2info'
+ or $info = 'refsect3info'
+ or $info = 'blockinfo'
+ or $info = 'appendixinfo')">
+ <xsl:apply-templates select="db:title|ng:title" mode="stripNS"/>
+ </xsl:if>
+
+</xsl:template>
+
+<xsl:template match="ng:tag|db:tag" mode="stripNS">
+ <xsl:choose>
+ <xsl:when test="@xlink:href">
+ <ulink url="{@xlink:href}">
+ <sgmltag>
+ <xsl:copy-of select="@*[not(name(.) = 'xml:id')
+ and not(name(.) = 'version')
+ and not(local-name(.) = 'href')]"/>
+ <xsl:apply-templates mode="stripNS"/>
+ </sgmltag>
+ </ulink>
+ </xsl:when>
+ <xsl:otherwise>
+ <sgmltag>
+ <xsl:copy-of select="@*[not(name(.) = 'xml:id')
+ and not(name(.) = 'version')]"/>
+ <xsl:apply-templates mode="stripNS"/>
+ </sgmltag>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="db:link[@xlink:href]" mode="stripNS">
+ <ulink url="{@xlink:href}">
+ <xsl:if test="@role">
+ <xsl:attribute name="role">
+ <xsl:value-of select="@role"/>
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:apply-templates mode="stripNS"/>
+ </ulink>
+</xsl:template>
+
+<xsl:template match="db:citetitle[@xlink:href]" mode="stripNS">
+ <ulink url="{@xlink:href}">
+ <citetitle>
+ <xsl:copy-of select="@*[not(name(.) = 'xml:id')
+ and not(name(.) = 'version')
+ and not(local-name(.) = 'href')]"/>
+ <xsl:apply-templates mode="stripNS"/>
+ </citetitle>
+ </ulink>
+</xsl:template>
+
+<xsl:template match="db:citetitle[@linkend]" mode="stripNS">
+ <citetitle>
+ <xsl:copy-of select="@*[not(name(.) = 'xml:id')
+ and not(name(.) = 'version')
+ and not(name(.) = 'linkend')
+ and not(local-name(.) = 'href')]"/>
+ <xsl:apply-templates mode="stripNS"/>
+ </citetitle>
+</xsl:template>
+
+<xsl:template match="db:alt" mode="stripNS"/>
+
+<xsl:template match="ng:textdata|db:textdata
+ |ng:imagedata|db:imagedata
+ |ng:videodata|db:videodata
+ |ng:audiodata|db:audiodata" mode="stripNS">
+ <xsl:element name="{local-name(.)}">
+ <xsl:copy-of select="@*[not(name(.) = 'xml:id')
+ and not(name(.) = 'version')
+ and not(name(.) = 'entityref')]"/>
+ <xsl:if test="@xml:id">
+ <xsl:attribute name="id">
+ <xsl:value-of select="@xml:id"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:choose>
+ <xsl:when test="@entityref">
+ <xsl:attribute name="fileref">
+ <xsl:value-of select="unparsed-entity-uri(@entityref)"/>
+ </xsl:attribute>
+ </xsl:when>
+ </xsl:choose>
+
+ <xsl:apply-templates mode="stripNS"/>
+ </xsl:element>
+</xsl:template>
+
+<xsl:template name="add-xml-base">
+ <xsl:if test="not(@xml:base)">
+ <xsl:variable name="base">
+ <xsl:choose>
+ <xsl:when test="function-available('saxon:systemId')">
+ <xsl:value-of select="saxon:systemId()"/>
+ </xsl:when>
+ <xsl:when test="function-available('NodeInfo:systemId')">
+ <xsl:value-of select="NodeInfo:systemId()"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:message>
+ <xsl:text>WARNING: cannot add @xml:base to node </xsl:text>
+ <xsl:text>set root element. </xsl:text>
+ <xsl:text>Relative paths may not work.</xsl:text>
+ </xsl:message>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <!-- debug
+ <xsl:message>base is <xsl:value-of select="$base"/></xsl:message>
+ -->
+ <xsl:if test="$base != ''">
+ <xsl:attribute name="xml:base">
+ <xsl:call-template name="systemIdToBaseURI">
+ <xsl:with-param name="systemId">
+ <!-- file: seems to confuse some processors. -->
+ <xsl:choose>
+ <!-- however, windows paths must use file:///c:/path -->
+ <xsl:when test="starts-with($base, 'file:///') and
+ substring($base, 10, 1) = ':'">
+ <xsl:value-of select="$base"/>
+ </xsl:when>
+ <xsl:when test="starts-with($base, 'file:/')
+ and substring($base, 8, 1) = ':'">
+ <xsl:value-of select="concat('file:///',
+ substring-after($base,'file:/'))"/>
+ </xsl:when>
+ <xsl:when test="starts-with($base, 'file:///')">
+ <xsl:value-of select="substring-after($base,'file://')"/>
+ </xsl:when>
+ <xsl:when test="starts-with($base, 'file://')">
+ <xsl:value-of select="substring-after($base,'file:/')"/>
+ </xsl:when>
+ <xsl:when test="starts-with($base, 'file:/')">
+ <xsl:value-of select="substring-after($base,'file:')"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$base"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:attribute>
+ </xsl:if>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template name="systemIdToBaseURI">
+ <xsl:param name="systemId" select="''"/>
+ <xsl:if test="contains($systemId,'/')">
+ <xsl:value-of select="substring-before($systemId,'/')"/>
+ <xsl:text>/</xsl:text>
+ <xsl:call-template name="systemIdToBaseURI">
+ <xsl:with-param name="systemId"
+ select="substring-after($systemId,'/')"/>
+ </xsl:call-template>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="comment()|processing-instruction()|text()" mode="stripNS">
+ <xsl:copy/>
+</xsl:template>
+
+<xsl:template match="/" priority="-1">
+ <!-- need a local version of this variable because this module imported many places-->
+ <xsl:variable name="local.exsl.node.set.available">
+ <xsl:choose>
+ <xsl:when exsl:foo="" xmlns:exsl="http://exslt.org/common"
+ test="function-available('exsl:node-set') or
+ contains(system-property('xsl:vendor'),
+ 'Apache Software Foundation')">1</xsl:when>
+ <xsl:otherwise>0</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:choose>
+ <xsl:when test="$local.exsl.node.set.available != 0
+ and (*/self::ng:* or */self::db:*)">
+ <xsl:message>
+ <xsl:text>Stripping namespace from DocBook 5 document. </xsl:text>
+ <xsl:text>It is suggested to use namespaced version of the stylesheets </xsl:text>
+ <xsl:text>available in distribution file 'docbook-xsl-ns' </xsl:text>
+ <xsl:text>at //http://sourceforge.net/projects/docbook/files/</xsl:text>
+ <xsl:text> which does not require namespace stripping step.</xsl:text>
+ </xsl:message>
+ <xsl:variable name="nons">
+ <xsl:apply-templates mode="stripNS"/>
+ </xsl:variable>
+ <xsl:message>Processing stripped document.</xsl:message>
+ <xsl:apply-templates select="exsl:node-set($nons)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:copy-of select="node()"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/subtitles.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/subtitles.xsl
new file mode 100644
index 0000000..8211c84
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/subtitles.xsl
@@ -0,0 +1,155 @@
+<?xml version='1.0'?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:doc="http://nwalsh.com/xsl/documentation/1.0"
+ exclude-result-prefixes="doc"
+ version='1.0'>
+
+<!-- ********************************************************************
+ $Id: subtitles.xsl 6910 2007-06-28 23:23:30Z xmldoc $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<!-- ==================================================================== -->
+
+<!-- subtitle markup -->
+
+<doc:mode mode="subtitle.markup" xmlns="">
+<refpurpose>Provides access to element subtitles</refpurpose>
+<refdescription id="subtitle.markup-desc">
+<para>Processing an element in the
+<literal role="mode">subtitle.markup</literal> mode produces the
+subtitle of the element.
+</para>
+</refdescription>
+</doc:mode>
+
+<xsl:template match="*" mode="subtitle.markup">
+ <xsl:message>
+ <xsl:text>Request for subtitle of unexpected element: </xsl:text>
+ <xsl:value-of select="local-name(.)"/>
+ </xsl:message>
+ <xsl:text>???SUBTITLE???</xsl:text>
+</xsl:template>
+
+<xsl:template match="subtitle" mode="subtitle.markup">
+ <xsl:param name="allow-anchors" select="'0'"/>
+ <xsl:apply-templates/>
+</xsl:template>
+
+<xsl:template match="set" mode="subtitle.markup">
+ <xsl:param name="allow-anchors" select="'0'"/>
+ <xsl:apply-templates select="(setinfo/subtitle|info/subtitle|subtitle)[1]"
+ mode="subtitle.markup">
+ <xsl:with-param name="allow-anchors" select="$allow-anchors"/>
+ </xsl:apply-templates>
+</xsl:template>
+
+<xsl:template match="book" mode="subtitle.markup">
+ <xsl:param name="allow-anchors" select="'0'"/>
+ <xsl:apply-templates select="(bookinfo/subtitle|info/subtitle|subtitle)[1]"
+ mode="subtitle.markup">
+ <xsl:with-param name="allow-anchors" select="$allow-anchors"/>
+ </xsl:apply-templates>
+</xsl:template>
+
+<xsl:template match="part" mode="subtitle.markup">
+ <xsl:param name="allow-anchors" select="'0'"/>
+ <xsl:apply-templates select="(partinfo/subtitle
+ |docinfo/subtitle
+ |info/subtitle
+ |subtitle)[1]"
+ mode="subtitle.markup">
+ <xsl:with-param name="allow-anchors" select="$allow-anchors"/>
+ </xsl:apply-templates>
+</xsl:template>
+
+<xsl:template match="preface|chapter|appendix" mode="subtitle.markup">
+ <xsl:param name="allow-anchors" select="'0'"/>
+ <xsl:apply-templates select="(docinfo/subtitle
+ |info/subtitle
+ |prefaceinfo/subtitle
+ |chapterinfo/subtitle
+ |appendixinfo/subtitle
+ |subtitle)[1]"
+ mode="subtitle.markup">
+ <xsl:with-param name="allow-anchors" select="$allow-anchors"/>
+ </xsl:apply-templates>
+</xsl:template>
+
+<xsl:template match="article" mode="subtitle.markup">
+ <xsl:param name="allow-anchors" select="'0'"/>
+ <xsl:apply-templates select="(artheader/subtitle
+ |articleinfo/subtitle
+ |info/subtitle
+ |subtitle)[1]"
+ mode="subtitle.markup">
+ <xsl:with-param name="allow-anchors" select="$allow-anchors"/>
+ </xsl:apply-templates>
+</xsl:template>
+
+<xsl:template match="dedication|colophon" mode="subtitle.markup">
+ <xsl:param name="allow-anchors" select="'0'"/>
+ <xsl:apply-templates select="(subtitle|info/subtitle)[1]"
+ mode="subtitle.markup">
+ <xsl:with-param name="allow-anchors" select="$allow-anchors"/>
+ </xsl:apply-templates>
+</xsl:template>
+
+<xsl:template match="reference" mode="subtitle.markup">
+ <xsl:param name="allow-anchors" select="'0'"/>
+ <xsl:apply-templates select="(referenceinfo/subtitle
+ |docinfo/subtitle
+ |info/subtitle
+ |subtitle)[1]"
+ mode="subtitle.markup">
+ <xsl:with-param name="allow-anchors" select="$allow-anchors"/>
+ </xsl:apply-templates>
+</xsl:template>
+
+<xsl:template match="qandaset" mode="subtitle.markup">
+ <xsl:param name="allow-anchors" select="'0'"/>
+ <xsl:apply-templates select="(blockinfo/subtitle|info/subtitle)[1]"
+ mode="subtitle.markup">
+ <xsl:with-param name="allow-anchors" select="$allow-anchors"/>
+ </xsl:apply-templates>
+</xsl:template>
+
+<xsl:template match="refentry" mode="subtitle.markup">
+ <xsl:param name="allow-anchors" select="'0'"/>
+ <xsl:apply-templates select="(refentryinfo/subtitle
+ |info/subtitle
+ |docinfo/subtitle)[1]"
+ mode="subtitle.markup">
+ <xsl:with-param name="allow-anchors" select="$allow-anchors"/>
+ </xsl:apply-templates>
+</xsl:template>
+
+<xsl:template match="section
+ |sect1|sect2|sect3|sect4|sect5
+ |refsect1|refsect2|refsect3
+ |simplesect"
+ mode="subtitle.markup">
+ <xsl:param name="allow-anchors" select="'0'"/>
+ <xsl:apply-templates select="(info/subtitle
+ |sectioninfo/subtitle
+ |sect1info/subtitle
+ |sect2info/subtitle
+ |sect3info/subtitle
+ |sect4info/subtitle
+ |sect5info/subtitle
+ |refsect1info/subtitle
+ |refsect2info/subtitle
+ |refsect3info/subtitle
+ |subtitle)[1]"
+ mode="subtitle.markup">
+ <xsl:with-param name="allow-anchors" select="$allow-anchors"/>
+ </xsl:apply-templates>
+</xsl:template>
+
+</xsl:stylesheet>
+
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/sv.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/sv.xml
new file mode 100644
index 0000000..354c48b
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/sv.xml
@@ -0,0 +1,664 @@
+<?xml version="1.0" encoding="utf-8"?>
+<l:l10n xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0" language="sv" english-language-name="Swedish">
+
+<!-- * This file is generated automatically. -->
+<!-- * To submit changes to this file upstream (to the DocBook Project) -->
+<!-- * do not submit an edited version of this file. Instead, submit an -->
+<!-- * edited version of the source file at the following location: -->
+<!-- * -->
+<!-- * https://docbook.svn.sourceforge.net/svnroot/docbook/trunk/gentext/locale/sv.xml -->
+<!-- * -->
+<!-- * E-mail the edited sv.xml source file to: -->
+<!-- * -->
+<!-- * docbook-developers@lists.sourceforge.net -->
+
+<!-- ******************************************************************** -->
+
+<!-- This file is part of the XSL DocBook Stylesheet distribution. -->
+<!-- See ../README or http://docbook.sf.net/release/xsl/current/ for -->
+<!-- copyright and other information. -->
+
+<!-- ******************************************************************** -->
+<!-- In these files, % with a letter is used for a placeholder: -->
+<!-- %t is the current element's title -->
+<!-- %s is the current element's subtitle (if applicable)-->
+<!-- %n is the current element's number label-->
+<!-- %p is the current element's page number (if applicable)-->
+<!-- ******************************************************************** -->
+
+
+<l:gentext key="Abstract" text="Sammanfattning"/>
+<l:gentext key="abstract" text="Sammanfattning"/>
+<l:gentext key="Acknowledgements" text="Tack till"/>
+<l:gentext key="acknowledgements" text="Tack till"/>
+<l:gentext key="Answer" text="A:"/>
+<l:gentext key="answer" text="A:"/>
+<l:gentext key="Appendix" text="Appendix"/>
+<l:gentext key="appendix" text="appendix"/>
+<l:gentext key="Article" text="Artikel"/>
+<l:gentext key="article" text="Artikel"/>
+<l:gentext key="Author" text="Author" lang="en"/>
+<l:gentext key="Bibliography" text="Bibliografi"/>
+<l:gentext key="bibliography" text="Bibliografi"/>
+<l:gentext key="Book" text="Bok"/>
+<l:gentext key="book" text="Bok"/>
+<l:gentext key="CAUTION" text="OBSERVERA"/>
+<l:gentext key="Caution" text="Observera"/>
+<l:gentext key="caution" text="Observera"/>
+<l:gentext key="Chapter" text="Kapitel"/>
+<l:gentext key="chapter" text="kapitel"/>
+<l:gentext key="Colophon" text="Kolofon"/>
+<l:gentext key="colophon" text="kolofon"/>
+<l:gentext key="Copyright" text="Copyright"/>
+<l:gentext key="copyright" text="Copyright"/>
+<l:gentext key="Dedication" text="Dedikation"/>
+<l:gentext key="dedication" text="Dedikation"/>
+<l:gentext key="Edition" text="Utgåva"/>
+<l:gentext key="edition" text="Utgåva"/>
+<l:gentext key="Editor" text="Editor" lang="en"/>
+<l:gentext key="Equation" text="Ekvation"/>
+<l:gentext key="equation" text="Ekvation"/>
+<l:gentext key="Example" text="Exempel"/>
+<l:gentext key="example" text="Exempel"/>
+<l:gentext key="Figure" text="Figur"/>
+<l:gentext key="figure" text="Figur"/>
+<l:gentext key="Glossary" text="Gloslista"/>
+<l:gentext key="glossary" text="Gloslista"/>
+<l:gentext key="GlossSee" text="Se"/>
+<l:gentext key="glosssee" text="Se"/>
+<l:gentext key="GlossSeeAlso" text="Se Även"/>
+<l:gentext key="glossseealso" text="Se Även"/>
+<l:gentext key="IMPORTANT" text="VIKTIGT"/>
+<l:gentext key="important" text="Viktigt"/>
+<l:gentext key="Important" text="Viktigt"/>
+<l:gentext key="Index" text="Index"/>
+<l:gentext key="index" text="Index"/>
+<l:gentext key="ISBN" text="ISBN"/>
+<l:gentext key="isbn" text="ISBN"/>
+<l:gentext key="LegalNotice" text="Rättsligt Meddelande"/>
+<l:gentext key="legalnotice" text="rättsligt meddelande"/>
+<l:gentext key="MsgAud" text="MÃ¥lgrupp"/>
+<l:gentext key="msgaud" text="MÃ¥lgrupp"/>
+<l:gentext key="MsgLevel" text="Nivå"/>
+<l:gentext key="msglevel" text="Nivå"/>
+<l:gentext key="MsgOrig" text="Ursprung"/>
+<l:gentext key="msgorig" text="Ursprung"/>
+<l:gentext key="NOTE" text="NOTERA"/>
+<l:gentext key="Note" text="Notera"/>
+<l:gentext key="note" text="Notera"/>
+<l:gentext key="Part" text="Del"/>
+<l:gentext key="part" text="Del"/>
+<l:gentext key="Preface" text="Företal"/>
+<l:gentext key="preface" text="Företal"/>
+<l:gentext key="Procedure" text="Procedur"/>
+<l:gentext key="procedure" text="Procedur"/>
+<l:gentext key="ProductionSet" text="Production"/>
+<l:gentext key="PubDate" text="Publication Date" lang="en"/>
+<l:gentext key="pubdate" text="Publication date" lang="en"/>
+<l:gentext key="Published" text="Publicerad"/>
+<l:gentext key="published" text="Publicerad"/>
+<l:gentext key="Publisher" text="Publisher" lang="en"/>
+<l:gentext key="Qandadiv" text="Fråga och A"/>
+<l:gentext key="qandadiv" text="Fråga och A"/>
+<l:gentext key="QandASet" text="Frequently Asked Questions" lang="en"/>
+<l:gentext key="Question" text="Fråga:"/>
+<l:gentext key="question" text="Fråga:"/>
+<l:gentext key="RefEntry" text=""/>
+<l:gentext key="refentry" text=""/>
+<l:gentext key="Reference" text="Referens"/>
+<l:gentext key="reference" text="Referens"/>
+<l:gentext key="References" text="References" lang="en"/>
+<l:gentext key="RefName" text="Namn"/>
+<l:gentext key="refname" text="Namn"/>
+<l:gentext key="RefSection" text=""/>
+<l:gentext key="refsection" text=""/>
+<l:gentext key="RefSynopsisDiv" text="Synopsis"/>
+<l:gentext key="refsynopsisdiv" text="Synopsis"/>
+<l:gentext key="RevHistory" text="Revisionshistorik"/>
+<l:gentext key="revhistory" text="Revisionshistorik"/>
+<l:gentext key="revision" text="Revision"/>
+<l:gentext key="Revision" text="Revision"/>
+<l:gentext key="sect1" text="Section"/>
+<l:gentext key="sect2" text="Section"/>
+<l:gentext key="sect3" text="Section"/>
+<l:gentext key="sect4" text="Section"/>
+<l:gentext key="sect5" text="Section"/>
+<l:gentext key="section" text="avsnitt"/>
+<l:gentext key="Section" text="Avsnitt"/>
+<l:gentext key="see" text="se"/>
+<l:gentext key="See" text="Se"/>
+<l:gentext key="seealso" text="se även"/>
+<l:gentext key="Seealso" text="Se även"/>
+<l:gentext key="SeeAlso" text="Se Även"/>
+<l:gentext key="set" text="Set"/>
+<l:gentext key="Set" text="Set"/>
+<l:gentext key="setindex" text="Set Index"/>
+<l:gentext key="SetIndex" text="Set Index"/>
+<l:gentext key="Sidebar" text="Sidebar"/>
+<l:gentext key="sidebar" text="sidebar"/>
+<l:gentext key="step" text="steg"/>
+<l:gentext key="Step" text="Steg"/>
+<l:gentext key="table" text="Tabell"/>
+<l:gentext key="Table" text="Tabell"/>
+<l:gentext key="task" text="Task" lang="en"/>
+<l:gentext key="Task" text="Task" lang="en"/>
+<l:gentext key="tip" text="Tips"/>
+<l:gentext key="TIP" text="TIPS"/>
+<l:gentext key="Tip" text="Tips"/>
+<l:gentext key="Warning" text="Varning"/>
+<l:gentext key="warning" text="Varning"/>
+<l:gentext key="WARNING" text="VARNING"/>
+<l:gentext key="and" text="och"/>
+<l:gentext key="by" text="av"/>
+<l:gentext key="Edited" text="Redigerad"/>
+<l:gentext key="edited" text="Redigerad"/>
+<l:gentext key="Editedby" text="Redigerad av"/>
+<l:gentext key="editedby" text="Redigerad av"/>
+<l:gentext key="in" text="i"/>
+<l:gentext key="lastlistcomma" text=""/>
+<l:gentext key="listcomma" text=","/>
+<l:gentext key="notes" text="Noter"/>
+<l:gentext key="Notes" text="Noter"/>
+<l:gentext key="Pgs" text="Sid."/>
+<l:gentext key="pgs" text="Sid."/>
+<l:gentext key="Revisedby" text="Reviderad av: "/>
+<l:gentext key="revisedby" text="Reviderad av: "/>
+<l:gentext key="TableNotes" text="Noter"/>
+<l:gentext key="tablenotes" text="Noter"/>
+<l:gentext key="TableofContents" text="Innehållsförteckning"/>
+<l:gentext key="tableofcontents" text="Innehållsförteckning"/>
+<l:gentext key="unexpectedelementname" text="Oväntat elementnamn"/>
+<l:gentext key="unsupported" text="unsupported"/>
+<l:gentext key="xrefto" text="korsreferens till"/>
+<l:gentext key="Authors" text="Authors" lang="en"/>
+<l:gentext key="copyeditor" text="Copy Editor" lang="en"/>
+<l:gentext key="graphicdesigner" text="Graphic Designer" lang="en"/>
+<l:gentext key="productioneditor" text="Production Editor" lang="en"/>
+<l:gentext key="technicaleditor" text="Technical Editor" lang="en"/>
+<l:gentext key="translator" text="Translator" lang="en"/>
+<l:gentext key="listofequations" text="Ekvationsförteckning"/>
+<l:gentext key="ListofEquations" text="Ekvationsförteckning"/>
+<l:gentext key="ListofExamples" text="Exempelförteckning"/>
+<l:gentext key="listofexamples" text="Exempelförteckning"/>
+<l:gentext key="ListofFigures" text="Figurförteckning"/>
+<l:gentext key="listoffigures" text="Figurförteckning"/>
+<l:gentext key="ListofProcedures" text="List of Procedures" lang="en"/>
+<l:gentext key="listofprocedures" text="List of Procedures" lang="en"/>
+<l:gentext key="listoftables" text="Tabellförteckning"/>
+<l:gentext key="ListofTables" text="Tabellförteckning"/>
+<l:gentext key="ListofUnknown" text="Förteckning av okända"/>
+<l:gentext key="listofunknown" text="Förteckning av okända"/>
+<l:gentext key="nav-home" text="Hem"/>
+<l:gentext key="nav-next" text="Nästa"/>
+<l:gentext key="nav-next-sibling" text="Snabbt framåt"/>
+<l:gentext key="nav-prev" text="Föregående"/>
+<l:gentext key="nav-prev-sibling" text="Snabbt bakåt"/>
+<l:gentext key="nav-up" text="Upp"/>
+<l:gentext key="nav-toc" text="ToC" lang="en"/>
+<l:gentext key="Draft" text="Utkast"/>
+<l:gentext key="above" text="ovan"/>
+<l:gentext key="below" text="nedan"/>
+<l:gentext key="sectioncalled" text="the section called"/>
+<l:gentext key="index symbols" text="Symboler"/>
+<l:gentext key="writing-mode" text="lr-tb"/>
+<l:gentext key="lowercase.alpha" text="abcdefghijklmnopqrstuvwxyzåäö"/>
+<l:gentext key="uppercase.alpha" text="ABCDEFGHIJKLMNOPQRSTUVWXYZÅÄÖ"/>
+<l:gentext key="normalize.sort.input" text="AaÀàÃáÂâÃãÄäÅåĀÄĂ㥹ÇǎǞǟǠǡǺǻȀÈȂȃȦȧḀá¸áºšáº áº¡áº¢áº£áº¤áº¥áº¦áº§áº¨áº©áºªáº«áº¬áº­áº®áº¯áº°áº±áº²áº³áº´áºµáº¶áº·BbÆ€ÆɓƂƃḂḃḄḅḆḇCcÇçĆćĈĉĊċČÄƇƈɕḈḉDdÄŽÄÄđƊɗƋƌDžDzȡɖḊḋḌá¸á¸Žá¸á¸á¸‘ḒḓEeÈèÉéÊêËëĒēĔĕĖėĘęĚěȄȅȆȇȨȩḔḕḖḗḘḙḚḛḜá¸áº¸áº¹áººáº»áº¼áº½áº¾áº¿á»€á»á»‚ểỄễỆệFfƑƒḞḟGgÄœÄĞğĠġĢģƓɠǤǥǦǧǴǵḠḡHhĤĥĦħȞȟɦḢḣḤḥḦḧḨḩḪḫẖIiÌìÃíÎîÃïĨĩĪīĬĭĮįİƗɨÇÇȈȉȊȋḬḭḮḯỈỉỊịJjĴĵǰÊKkĶķƘƙǨǩḰḱḲḳḴḵLlĹĺĻļĽľĿŀÅłƚLjȴɫɬɭḶḷḸḹḺḻḼḽMmɱḾḿṀá¹á¹‚ṃNnÑñŃńŅņŇňÆɲƞȠNjǸǹȵɳṄṅṆṇṈṉṊṋOoÒòÓóÔôÕõÖöØøŌÅÅŽÅÅőƟƠơǑǒǪǫǬǭǾǿȌÈÈŽÈȪȫȬȭȮȯȰȱṌá¹á¹Žá¹á¹á¹‘ṒṓỌá»á»Žá»á»á»‘ỒồỔổỖỗỘộỚớỜá»á»žá»Ÿá» á»¡á»¢á»£PpƤƥṔṕṖṗQqÊ RrŔŕŖŗŘřÈȑȒȓɼɽɾṘṙṚṛṜá¹á¹žá¹ŸSsŚśŜÅŞşŠšȘșʂṠṡṢṣṤṥṦṧṨṩTtŢţŤťŦŧƫƬƭƮʈȚțȶṪṫṬṭṮṯṰṱẗUuÙùÚúÛûÜüŨũŪūŬŭŮůŰűŲųƯưǓǔǕǖǗǘǙǚǛǜȔȕȖȗṲṳṴṵṶṷṸṹṺṻỤụỦủỨứỪừỬửỮữỰựVvƲʋṼṽṾṿWwŴŵẀáºáº‚ẃẄẅẆẇẈẉẘXxẊẋẌáºYyÃýÿŸŶŷƳƴȲȳẎáºáº™á»²á»³á»´á»µá»¶á»·á»¸á»¹ZzŹźŻżŽžƵƶȤȥÊÊ‘áºáº‘ẒẓẔẕẕ" lang="en"/>
+<l:gentext key="normalize.sort.output" text="AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBCCCCCCCCCCCCCCCCCDDDDDDDDDDDDDDDDDDDDDDDDEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEFFFFFFGGGGGGGGGGGGGGGGGGGGHHHHHHHHHHHHHHHHHHHHIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIJJJJJJKKKKKKKKKKKKKKLLLLLLLLLLLLLLLLLLLLLLLLLLMMMMMMMMMNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOPPPPPPPPQQQRRRRRRRRRRRRRRRRRRRRRRRSSSSSSSSSSSSSSSSSSSSSSSTTTTTTTTTTTTTTTTTTTTTTTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUVVVVVVVVWWWWWWWWWWWWWWWXXXXXXYYYYYYYYYYYYYYYYYYYYYYYZZZZZZZZZZZZZZZZZZZZZ" lang="en"/>
+<l:dingbat key="startquote" text="â€"/>
+<l:dingbat key="endquote" text="â€"/>
+<l:dingbat key="nestedstartquote" text="’"/>
+<l:dingbat key="nestedendquote" text="’"/>
+<l:dingbat key="singlestartquote" text="‘" lang="en"/>
+<l:dingbat key="singleendquote" text="’" lang="en"/>
+<l:dingbat key="bullet" text="•"/>
+<l:gentext key="hyphenation-character" text="-" lang="en"/>
+<l:gentext key="hyphenation-push-character-count" text="2" lang="en"/>
+<l:gentext key="hyphenation-remain-character-count" text="2" lang="en"/>
+<l:context name="styles"><l:template name="person-name" text="first-last"/>
+</l:context>
+<l:context name="title"><l:template name="abstract" text="%t"/>
+<l:template name="acknowledgements" text="%t" lang="en"/>
+<l:template name="answer" text="%t"/>
+<l:template name="appendix" text="Appendix %n. %t"/>
+<l:template name="article" text="%t"/>
+<l:template name="authorblurb" text="%t"/>
+<l:template name="bibliodiv" text="%t"/>
+<l:template name="biblioentry" text="%t"/>
+<l:template name="bibliography" text="%t"/>
+<l:template name="bibliolist" text="%t" lang="en"/>
+<l:template name="bibliomixed" text="%t"/>
+<l:template name="bibliomset" text="%t"/>
+<l:template name="biblioset" text="%t"/>
+<l:template name="blockquote" text="%t"/>
+<l:template name="book" text="%t"/>
+<l:template name="calloutlist" text="%t"/>
+<l:template name="caution" text="%t"/>
+<l:template name="chapter" text="Kapitel %n. %t"/>
+<l:template name="colophon" text="%t"/>
+<l:template name="dedication" text="%t"/>
+<l:template name="equation" text="Ekvation %n. %t"/>
+<l:template name="example" text="Exempel %n. %t"/>
+<l:template name="figure" text="Figur %n. %t"/>
+<l:template name="foil" text="%t" lang="en"/>
+<l:template name="foilgroup" text="%t" lang="en"/>
+<l:template name="formalpara" text="%t"/>
+<l:template name="glossary" text="%t"/>
+<l:template name="glossdiv" text="%t"/>
+<l:template name="glosslist" text="%t" lang="en"/>
+<l:template name="glossentry" text="%t" lang="en"/>
+<l:template name="important" text="%t"/>
+<l:template name="index" text="%t"/>
+<l:template name="indexdiv" text="%t"/>
+<l:template name="itemizedlist" text="%t"/>
+<l:template name="legalnotice" text="%t"/>
+<l:template name="listitem" text=""/>
+<l:template name="lot" text="%t"/>
+<l:template name="msg" text="%t"/>
+<l:template name="msgexplan" text="%t"/>
+<l:template name="msgmain" text="%t"/>
+<l:template name="msgrel" text="%t"/>
+<l:template name="msgset" text="%t"/>
+<l:template name="msgsub" text="%t"/>
+<l:template name="note" text="%t"/>
+<l:template name="orderedlist" text="%t"/>
+<l:template name="part" text="Del %n. %t"/>
+<l:template name="partintro" text="%t"/>
+<l:template name="preface" text="%t"/>
+<l:template name="procedure" text="%t"/>
+<l:template name="procedure.formal" text="Procedur %n. %t"/>
+<l:template name="productionset" text="%t"/>
+<l:template name="productionset.formal" text="Production %n"/>
+<l:template name="qandadiv" text="%t"/>
+<l:template name="qandaentry" text="%t"/>
+<l:template name="qandaset" text="%t"/>
+<l:template name="question" text="%t"/>
+<l:template name="refentry" text="%t"/>
+<l:template name="reference" text="%t"/>
+<l:template name="refsection" text="%t" lang="en"/>
+<l:template name="refsect1" text="%t"/>
+<l:template name="refsect2" text="%t"/>
+<l:template name="refsect3" text="%t"/>
+<l:template name="refsynopsisdiv" text="%t"/>
+<l:template name="refsynopsisdivinfo" text="%t"/>
+<l:template name="segmentedlist" text="%t"/>
+<l:template name="set" text="%t"/>
+<l:template name="setindex" text="%t"/>
+<l:template name="sidebar" text="%t"/>
+<l:template name="step" text="%t"/>
+<l:template name="table" text="Tabell %n. %t"/>
+<l:template name="task" text="%t" lang="en"/>
+<l:template name="tasksummary" text="%t" lang="en"/>
+<l:template name="taskprerequisites" text="%t" lang="en"/>
+<l:template name="taskrelated" text="%t" lang="en"/>
+<l:template name="tip" text="%t"/>
+<l:template name="toc" text="%t"/>
+<l:template name="variablelist" text="%t"/>
+<l:template name="varlistentry" text="" lang="en"/>
+<l:template name="warning" text="%t"/>
+</l:context>
+<l:context name="title-unnumbered"><l:template name="appendix" text="%t"/>
+<l:template name="article/appendix" text="%t" lang="en"/>
+<l:template name="bridgehead" text="%t"/>
+<l:template name="chapter" text="%t"/>
+<l:template name="sect1" text="%t"/>
+<l:template name="sect2" text="%t"/>
+<l:template name="sect3" text="%t"/>
+<l:template name="sect4" text="%t"/>
+<l:template name="sect5" text="%t"/>
+<l:template name="section" text="%t"/>
+<l:template name="simplesect" text="%t"/>
+<l:template name="part" text="%t" lang="en"/>
+</l:context>
+<l:context name="title-numbered"><l:template name="appendix" text="Appendix %n. %t"/>
+<l:template name="article/appendix" text="%n. %t" lang="en"/>
+<l:template name="bridgehead" text="%t"/>
+<l:template name="chapter" text="Kapitel %n. %t"/>
+<l:template name="part" text="Del %n. %t"/>
+<l:template name="sect1" text="%n. %t"/>
+<l:template name="sect2" text="%n. %t"/>
+<l:template name="sect3" text="%n. %t"/>
+<l:template name="sect4" text="%n. %t"/>
+<l:template name="sect5" text="%n. %t"/>
+<l:template name="section" text="%n. %t"/>
+<l:template name="simplesect" text="%n. %t"/>
+</l:context>
+<l:context name="subtitle"><l:template name="appendix" text="%s"/>
+<l:template name="acknowledgements" text="%s" lang="en"/>
+<l:template name="article" text="%s"/>
+<l:template name="bibliodiv" text="%s"/>
+<l:template name="biblioentry" text="%s"/>
+<l:template name="bibliography" text="%s"/>
+<l:template name="bibliomixed" text="%s"/>
+<l:template name="bibliomset" text="%s"/>
+<l:template name="biblioset" text="%s"/>
+<l:template name="book" text="%s"/>
+<l:template name="chapter" text="%s"/>
+<l:template name="colophon" text="%s"/>
+<l:template name="dedication" text="%s"/>
+<l:template name="glossary" text="%s"/>
+<l:template name="glossdiv" text="%s"/>
+<l:template name="index" text="%s"/>
+<l:template name="indexdiv" text="%s"/>
+<l:template name="lot" text="%s"/>
+<l:template name="part" text="%s"/>
+<l:template name="partintro" text="%s"/>
+<l:template name="preface" text="%s"/>
+<l:template name="refentry" text="%s"/>
+<l:template name="reference" text="%s"/>
+<l:template name="refsection" text="%s" lang="en"/>
+<l:template name="refsect1" text="%s"/>
+<l:template name="refsect2" text="%s"/>
+<l:template name="refsect3" text="%s"/>
+<l:template name="refsynopsisdiv" text="%s"/>
+<l:template name="sect1" text="%s"/>
+<l:template name="sect2" text="%s"/>
+<l:template name="sect3" text="%s"/>
+<l:template name="sect4" text="%s"/>
+<l:template name="sect5" text="%s"/>
+<l:template name="section" text="%s"/>
+<l:template name="set" text="%s"/>
+<l:template name="setindex" text="%s"/>
+<l:template name="sidebar" text="%s"/>
+<l:template name="simplesect" text="%s"/>
+<l:template name="toc" text="%s"/>
+</l:context>
+<l:context name="xref"><l:template name="abstract" text="%t"/>
+<l:template name="acknowledgements" text="%t" lang="en"/>
+<l:template name="answer" text="A: %n"/>
+<l:template name="appendix" text="%t"/>
+<l:template name="article" text="%t"/>
+<l:template name="authorblurb" text="%t"/>
+<l:template name="bibliodiv" text="%t"/>
+<l:template name="bibliography" text="%t"/>
+<l:template name="bibliomset" text="%t"/>
+<l:template name="biblioset" text="%t"/>
+<l:template name="blockquote" text="%t"/>
+<l:template name="book" text="%t"/>
+<l:template name="calloutlist" text="%t"/>
+<l:template name="caution" text="%t"/>
+<l:template name="chapter" text="%t"/>
+<l:template name="colophon" text="%t"/>
+<l:template name="constraintdef" text="%t"/>
+<l:template name="dedication" text="%t"/>
+<l:template name="equation" text="%t"/>
+<l:template name="example" text="%t"/>
+<l:template name="figure" text="%t"/>
+<l:template name="foil" text="%t" lang="en"/>
+<l:template name="foilgroup" text="%t" lang="en"/>
+<l:template name="formalpara" text="%t"/>
+<l:template name="glossary" text="%t"/>
+<l:template name="glossdiv" text="%t"/>
+<l:template name="important" text="%t"/>
+<l:template name="index" text="%t"/>
+<l:template name="indexdiv" text="%t"/>
+<l:template name="itemizedlist" text="%t"/>
+<l:template name="legalnotice" text="%t"/>
+<l:template name="listitem" text="%n"/>
+<l:template name="lot" text="%t"/>
+<l:template name="msg" text="%t"/>
+<l:template name="msgexplan" text="%t"/>
+<l:template name="msgmain" text="%t"/>
+<l:template name="msgrel" text="%t"/>
+<l:template name="msgset" text="%t"/>
+<l:template name="msgsub" text="%t"/>
+<l:template name="note" text="%t"/>
+<l:template name="orderedlist" text="%t"/>
+<l:template name="part" text="%t"/>
+<l:template name="partintro" text="%t"/>
+<l:template name="preface" text="%t"/>
+<l:template name="procedure" text="%t"/>
+<l:template name="productionset" text="%t"/>
+<l:template name="qandadiv" text="%t"/>
+<l:template name="qandaentry" text="Fråga: %n"/>
+<l:template name="qandaset" text="%t"/>
+<l:template name="question" text="Fråga: %n"/>
+<l:template name="reference" text="%t"/>
+<l:template name="refsynopsisdiv" text="%t"/>
+<l:template name="segmentedlist" text="%t"/>
+<l:template name="set" text="%t"/>
+<l:template name="setindex" text="%t"/>
+<l:template name="sidebar" text="%t"/>
+<l:template name="table" text="%t"/>
+<l:template name="task" text="%t" lang="en"/>
+<l:template name="tip" text="%t"/>
+<l:template name="toc" text="%t"/>
+<l:template name="variablelist" text="%t"/>
+<l:template name="varlistentry" text="%n"/>
+<l:template name="warning" text="%t"/>
+<l:template name="olink.document.citation" text=" in %o" lang="en"/>
+<l:template name="olink.page.citation" text=" (page %p)" lang="en"/>
+<l:template name="page.citation" text=" [%p]"/>
+<l:template name="page" text="(page %p)" lang="en"/>
+<l:template name="docname" text=" in %o" lang="en"/>
+<l:template name="docnamelong" text=" in the document titled %o" lang="en"/>
+<l:template name="pageabbrev" text="(p. %p)" lang="en"/>
+<l:template name="Page" text="Page %p" lang="en"/>
+<l:template name="bridgehead" text="â€%tâ€"/>
+<l:template name="refsection" text="â€%tâ€"/>
+<l:template name="refsect1" text="â€%tâ€"/>
+<l:template name="refsect2" text="â€%tâ€"/>
+<l:template name="refsect3" text="â€%tâ€"/>
+<l:template name="sect1" text="â€%tâ€"/>
+<l:template name="sect2" text="â€%tâ€"/>
+<l:template name="sect3" text="â€%tâ€"/>
+<l:template name="sect4" text="â€%tâ€"/>
+<l:template name="sect5" text="â€%tâ€"/>
+<l:template name="section" text="â€%tâ€"/>
+<l:template name="simplesect" text="â€%tâ€"/>
+</l:context>
+<l:context name="xref-number"><l:template name="answer" text="A: %n"/>
+<l:template name="appendix" text="Appendix %n"/>
+<l:template name="bridgehead" text="Avsnitt %n"/>
+<l:template name="chapter" text="Kapitel %n"/>
+<l:template name="equation" text="Ekvation %n"/>
+<l:template name="example" text="Exempel %n"/>
+<l:template name="figure" text="Figur %n"/>
+<l:template name="part" text="Del %n"/>
+<l:template name="procedure" text="Procedur %n"/>
+<l:template name="productionset" text="Production %n"/>
+<l:template name="qandadiv" text="Fråga och A %n"/>
+<l:template name="qandaentry" text="Fråga: %n"/>
+<l:template name="question" text="Fråga: %n"/>
+<l:template name="sect1" text="Avsnitt %n"/>
+<l:template name="sect2" text="Avsnitt %n"/>
+<l:template name="sect3" text="Avsnitt %n"/>
+<l:template name="sect4" text="Avsnitt %n"/>
+<l:template name="sect5" text="Avsnitt %n"/>
+<l:template name="section" text="Avsnitt %n"/>
+<l:template name="table" text="Tabell %n"/>
+</l:context>
+<l:context name="xref-number-and-title"><l:template name="appendix" text="Appendix %n, %t"/>
+<l:template name="bridgehead" text="Avsnitt %n, â€%tâ€"/>
+<l:template name="chapter" text="Kapitel %n, %t"/>
+<l:template name="equation" text="Ekvation %n, â€%tâ€"/>
+<l:template name="example" text="Exempel %n, â€%tâ€"/>
+<l:template name="figure" text="Figur %n, â€%tâ€"/>
+<l:template name="part" text="Del %n, â€%tâ€"/>
+<l:template name="procedure" text="Procedur %n, â€%tâ€"/>
+<l:template name="productionset" text="Production %n, â€%tâ€"/>
+<l:template name="qandadiv" text="FrÃ¥ga och A %n, â€%tâ€"/>
+<l:template name="refsect1" text="the section called â€%tâ€"/>
+<l:template name="refsect2" text="the section called â€%tâ€"/>
+<l:template name="refsect3" text="the section called â€%tâ€"/>
+<l:template name="refsection" text="the section called â€%tâ€"/>
+<l:template name="sect1" text="Avsnitt %n, â€%tâ€"/>
+<l:template name="sect2" text="Avsnitt %n, â€%tâ€"/>
+<l:template name="sect3" text="Avsnitt %n, â€%tâ€"/>
+<l:template name="sect4" text="Avsnitt %n, â€%tâ€"/>
+<l:template name="sect5" text="Avsnitt %n, â€%tâ€"/>
+<l:template name="section" text="Avsnitt %n, â€%tâ€"/>
+<l:template name="simplesect" text="the section called â€%tâ€"/>
+<l:template name="table" text="Tabell %n, â€%tâ€"/>
+</l:context>
+<l:context name="authorgroup"><l:template name="sep" text=", "/>
+<l:template name="sep2" text=" och "/>
+<l:template name="seplast" text=" och "/>
+</l:context>
+<l:context name="glossary"><l:template name="see" text="Se %t."/>
+<l:template name="seealso" text="Se Även %t."/>
+<l:template name="seealso-separator" text=", "/>
+</l:context>
+<l:context name="msgset"><l:template name="MsgAud" text="MÃ¥lgrupp: "/>
+<l:template name="MsgLevel" text="Nivå: "/>
+<l:template name="MsgOrig" text="Ursprung: "/>
+</l:context>
+<l:context name="datetime"><l:template name="format" text="d-m-Y"/>
+</l:context>
+<l:context name="termdef"><l:template name="prefix" text="[Definition: " lang="en"/>
+<l:template name="suffix" text="]" lang="en"/>
+</l:context>
+<l:context name="datetime-full"><l:template name="January" text="Januari"/>
+<l:template name="February" text="Februari"/>
+<l:template name="March" text="Mars"/>
+<l:template name="April" text="April"/>
+<l:template name="May" text="Maj"/>
+<l:template name="June" text="Juni"/>
+<l:template name="July" text="Juli"/>
+<l:template name="August" text="Augusti"/>
+<l:template name="September" text="September"/>
+<l:template name="October" text="Oktober"/>
+<l:template name="November" text="November"/>
+<l:template name="December" text="December"/>
+<l:template name="Monday" text="MÃ¥ndag"/>
+<l:template name="Tuesday" text="Tisdag"/>
+<l:template name="Wednesday" text="Onsdag"/>
+<l:template name="Thursday" text="Torsdag"/>
+<l:template name="Friday" text="Fredag"/>
+<l:template name="Saturday" text="Lördag"/>
+<l:template name="Sunday" text="Söndag"/>
+</l:context>
+<l:context name="datetime-abbrev"><l:template name="Jan" text="Jan"/>
+<l:template name="Feb" text="Feb"/>
+<l:template name="Mar" text="Mar"/>
+<l:template name="Apr" text="Apr"/>
+<l:template name="May" text="Maj"/>
+<l:template name="Jun" text="Jun"/>
+<l:template name="Jul" text="Jul"/>
+<l:template name="Aug" text="Aug"/>
+<l:template name="Sep" text="Sep"/>
+<l:template name="Oct" text="Okt"/>
+<l:template name="Nov" text="Nov"/>
+<l:template name="Dec" text="Dec"/>
+<l:template name="Mon" text="Mon"/>
+<l:template name="Tue" text="Tis"/>
+<l:template name="Wed" text="Ons"/>
+<l:template name="Thu" text="Tor"/>
+<l:template name="Fri" text="Fre"/>
+<l:template name="Sat" text="Lör"/>
+<l:template name="Sun" text="Sön"/>
+</l:context>
+<l:context name="htmlhelp"><l:template name="langcode" text="0x041d Swedish"/>
+</l:context>
+<l:context name="index"><l:template name="term-separator" text=", " lang="en"/>
+<l:template name="number-separator" text=", " lang="en"/>
+<l:template name="range-separator" text="-" lang="en"/>
+</l:context>
+<l:context name="iso690"><l:template name="lastfirst.sep" text=", " lang="en"/>
+<l:template name="alt.person.two.sep" text=" – " lang="en"/>
+<l:template name="alt.person.last.sep" text=" – " lang="en"/>
+<l:template name="alt.person.more.sep" text=" – " lang="en"/>
+<l:template name="primary.editor" text=" (ed.)" lang="en"/>
+<l:template name="primary.many" text=", et al." lang="en"/>
+<l:template name="primary.sep" text=". " lang="en"/>
+<l:template name="submaintitle.sep" text=": " lang="en"/>
+<l:template name="title.sep" text=". " lang="en"/>
+<l:template name="othertitle.sep" text=", " lang="en"/>
+<l:template name="medium1" text=" [" lang="en"/>
+<l:template name="medium2" text="]" lang="en"/>
+<l:template name="secondary.person.sep" text="; " lang="en"/>
+<l:template name="secondary.sep" text=". " lang="en"/>
+<l:template name="respons.sep" text=". " lang="en"/>
+<l:template name="edition.sep" text=". " lang="en"/>
+<l:template name="edition.serial.sep" text=", " lang="en"/>
+<l:template name="issuing.range" text="-" lang="en"/>
+<l:template name="issuing.div" text=", " lang="en"/>
+<l:template name="issuing.sep" text=". " lang="en"/>
+<l:template name="partnr.sep" text=". " lang="en"/>
+<l:template name="placepubl.sep" text=": " lang="en"/>
+<l:template name="publyear.sep" text=", " lang="en"/>
+<l:template name="pubinfo.sep" text=". " lang="en"/>
+<l:template name="spec.pubinfo.sep" text=", " lang="en"/>
+<l:template name="upd.sep" text=", " lang="en"/>
+<l:template name="datecit1" text=" [cited " lang="en"/>
+<l:template name="datecit2" text="]" lang="en"/>
+<l:template name="extent.sep" text=". " lang="en"/>
+<l:template name="locs.sep" text=", " lang="en"/>
+<l:template name="location.sep" text=". " lang="en"/>
+<l:template name="serie.sep" text=". " lang="en"/>
+<l:template name="notice.sep" text=". " lang="en"/>
+<l:template name="access" text="Available " lang="en"/>
+<l:template name="acctoo" text="Also available " lang="en"/>
+<l:template name="onwww" text="from World Wide Web" lang="en"/>
+<l:template name="oninet" text="from Internet" lang="en"/>
+<l:template name="access.end" text=": " lang="en"/>
+<l:template name="link1" text="&lt;" lang="en"/>
+<l:template name="link2" text="&gt;" lang="en"/>
+<l:template name="access.sep" text=". " lang="en"/>
+<l:template name="isbn" text="ISBN " lang="en"/>
+<l:template name="issn" text="ISSN " lang="en"/>
+<l:template name="stdnum.sep" text=". " lang="en"/>
+<l:template name="patcountry.sep" text=". " lang="en"/>
+<l:template name="pattype.sep" text=", " lang="en"/>
+<l:template name="patnum.sep" text=". " lang="en"/>
+<l:template name="patdate.sep" text=". " lang="en"/>
+</l:context><l:letters><l:l i="1">A</l:l>
+<l:l i="1">a</l:l>
+<l:l i="2">B</l:l>
+<l:l i="2">b</l:l>
+<l:l i="3">C</l:l>
+<l:l i="3">c</l:l>
+<l:l i="4">D</l:l>
+<l:l i="4">d</l:l>
+<l:l i="5">E</l:l>
+<l:l i="5">e</l:l>
+<l:l i="6">F</l:l>
+<l:l i="6">f</l:l>
+<l:l i="7">G</l:l>
+<l:l i="7">g</l:l>
+<l:l i="8">H</l:l>
+<l:l i="8">h</l:l>
+<l:l i="9">I</l:l>
+<l:l i="9">i</l:l>
+<l:l i="10">J</l:l>
+<l:l i="10">j</l:l>
+<l:l i="11">K</l:l>
+<l:l i="11">k</l:l>
+<l:l i="12">L</l:l>
+<l:l i="12">l</l:l>
+<l:l i="13">M</l:l>
+<l:l i="13">m</l:l>
+<l:l i="14">N</l:l>
+<l:l i="14">n</l:l>
+<l:l i="15">O</l:l>
+<l:l i="15">o</l:l>
+<l:l i="16">P</l:l>
+<l:l i="16">p</l:l>
+<l:l i="17">Q</l:l>
+<l:l i="17">q</l:l>
+<l:l i="18">R</l:l>
+<l:l i="18">r</l:l>
+<l:l i="19">S</l:l>
+<l:l i="19">s</l:l>
+<l:l i="20">T</l:l>
+<l:l i="20">t</l:l>
+<l:l i="21">U</l:l>
+<l:l i="21">u</l:l>
+<l:l i="22">V</l:l>
+<l:l i="22">v</l:l>
+<l:l i="23">W</l:l>
+<l:l i="23">w</l:l>
+<l:l i="24">X</l:l>
+<l:l i="24">x</l:l>
+<l:l i="25">Y</l:l>
+<l:l i="25">y</l:l>
+<l:l i="26">Z</l:l>
+<l:l i="26">z</l:l>
+<l:l i="27">Ã…</l:l>
+<l:l i="27">Ã¥</l:l>
+<l:l i="28">Ä</l:l>
+<l:l i="28">ä</l:l>
+<l:l i="29">Ö</l:l>
+<l:l i="29">ö</l:l>
+</l:letters>
+</l:l10n>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/ta.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/ta.xml
new file mode 100644
index 0000000..873f1f9
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/ta.xml
@@ -0,0 +1,660 @@
+<?xml version="1.0" encoding="utf-8"?>
+<l:l10n xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0" language="ta" english-language-name="Tamil">
+
+<!-- * This file is generated automatically. -->
+<!-- * To submit changes to this file upstream (to the DocBook Project) -->
+<!-- * do not submit an edited version of this file. Instead, submit an -->
+<!-- * edited version of the source file at the following location: -->
+<!-- * -->
+<!-- * https://docbook.svn.sourceforge.net/svnroot/docbook/trunk/gentext/locale/ta.xml -->
+<!-- * -->
+<!-- * E-mail the edited ta.xml source file to: -->
+<!-- * -->
+<!-- * docbook-developers@lists.sourceforge.net -->
+
+<!-- ******************************************************************** -->
+
+<!-- This file is part of the XSL DocBook Stylesheet distribution. -->
+<!-- See ../README or http://docbook.sf.net/release/xsl/current/ for -->
+<!-- copyright and other information. -->
+
+<!-- ******************************************************************** -->
+<!-- In these files, % with a letter is used for a placeholder: -->
+<!-- %t is the current element's title -->
+<!-- %s is the current element's subtitle (if applicable)-->
+<!-- %n is the current element's number label-->
+<!-- %p is the current element's page number (if applicable)-->
+<!-- ******************************************************************** -->
+
+
+<l:gentext key="Abstract" text="சà¯à®°à¯à®•à¯à®•à®®à¯"/>
+<l:gentext key="abstract" text="சà¯à®°à¯à®•à¯à®•à®®à¯"/>
+<l:gentext key="Acknowledgements" text="ஒபà¯à®ªà¯à®¤à®²à¯à®•à®³à¯"/>
+<l:gentext key="acknowledgements" text="ஒபà¯à®ªà¯à®¤à®²à¯à®•à®³à¯"/>
+<l:gentext key="Answer" text="விடை:"/>
+<l:gentext key="answer" text="விடை:"/>
+<l:gentext key="Appendix" text="இணைபà¯à®ªà¯"/>
+<l:gentext key="appendix" text="இணைபà¯à®ªà¯"/>
+<l:gentext key="Article" text="கடà¯à®Ÿà¯à®°à¯ˆ"/>
+<l:gentext key="article" text="கடà¯à®Ÿà¯à®°à¯ˆ"/>
+<l:gentext key="Author" text="ஆசிரியரà¯"/>
+<l:gentext key="Bibliography" text="விவரகà¯à®•à¯à®±à®¿à®ªà¯à®ªà¯"/>
+<l:gentext key="bibliography" text="விவரகà¯à®•à¯à®±à®¿à®ªà¯à®ªà¯"/>
+<l:gentext key="Book" text="பà¯à®¤à¯à®¤à®•à®®à¯"/>
+<l:gentext key="book" text="பà¯à®¤à¯à®¤à®•à®®à¯"/>
+<l:gentext key="CAUTION" text="எசà¯à®šà®°à®¿à®•à¯à®•à¯ˆ"/>
+<l:gentext key="Caution" text="எசà¯à®šà®°à®¿à®•à¯à®•à¯ˆ"/>
+<l:gentext key="caution" text="எசà¯à®šà®°à®¿à®•à¯à®•à¯ˆ"/>
+<l:gentext key="Chapter" text="பாடமà¯"/>
+<l:gentext key="chapter" text="பாடமà¯"/>
+<l:gentext key="Colophon" text="பினà¯à®•à¯à®±à®¿à®ªà¯à®ªà¯"/>
+<l:gentext key="colophon" text="பினà¯à®•à¯à®±à®¿à®ªà¯à®ªà¯"/>
+<l:gentext key="Copyright" text="காபà¯à®ªà¯à®°à®¿à®®à¯ˆ"/>
+<l:gentext key="copyright" text="காபà¯à®ªà¯à®°à®¿à®®à¯ˆ"/>
+<l:gentext key="Dedication" text="சமரà¯à®ªà®£à®®à¯"/>
+<l:gentext key="dedication" text="சமரà¯à®ªà®£à®®à¯"/>
+<l:gentext key="Edition" text="பதிபà¯à®ªà¯"/>
+<l:gentext key="edition" text="பதிபà¯à®ªà¯"/>
+<l:gentext key="Editor" text="ஆசிரியரà¯"/>
+<l:gentext key="Equation" text="சமனà¯à®ªà®¾à®Ÿà¯"/>
+<l:gentext key="equation" text="சமனà¯à®ªà®¾à®Ÿà¯"/>
+<l:gentext key="Example" text="உதாரணமà¯"/>
+<l:gentext key="example" text="உதாரணமà¯"/>
+<l:gentext key="Figure" text="படமà¯"/>
+<l:gentext key="figure" text="படமà¯"/>
+<l:gentext key="Glossary" text="அகராதி"/>
+<l:gentext key="glossary" text="அகராதி"/>
+<l:gentext key="GlossSee" text="பாரà¯"/>
+<l:gentext key="glosssee" text="பாரà¯"/>
+<l:gentext key="GlossSeeAlso" text="இதையà¯à®®à¯à®ªà®¾à®°à¯à®•à¯à®•à®µà¯à®®à¯"/>
+<l:gentext key="glossseealso" text="இதையà¯à®®à¯à®ªà®¾à®°à¯à®•à¯à®•à®µà¯à®®à¯"/>
+<l:gentext key="IMPORTANT" text="à®®à¯à®•à¯à®•à®¿à®¯à®®à¯"/>
+<l:gentext key="important" text="à®®à¯à®•à¯à®•à®¿à®¯à®®à¯"/>
+<l:gentext key="Important" text="à®®à¯à®•à¯à®•à®¿à®¯à®®à¯"/>
+<l:gentext key="Index" text="அடà¯à®Ÿà®µà®£à¯ˆ"/>
+<l:gentext key="index" text="அடà¯à®Ÿà®µà®£à¯ˆ"/>
+<l:gentext key="ISBN" text="ISBN"/>
+<l:gentext key="isbn" text="ISBN"/>
+<l:gentext key="LegalNotice" text="சடà¯à®Ÿà®…றிகà¯à®•à¯ˆ"/>
+<l:gentext key="legalnotice" text="சடà¯à®Ÿà®…றிகà¯à®•à¯ˆ"/>
+<l:gentext key="MsgAud" text="பாரà¯à®µà¯ˆà®¯à®¾à®³à®°à¯à®•à®³à¯"/>
+<l:gentext key="msgaud" text="பாரà¯à®µà¯ˆà®¯à®¾à®³à®°à¯à®•à®³à¯"/>
+<l:gentext key="MsgLevel" text="நிலை"/>
+<l:gentext key="msglevel" text="நிலை"/>
+<l:gentext key="MsgOrig" text="மூலமà¯"/>
+<l:gentext key="msgorig" text="மூலமà¯"/>
+<l:gentext key="NOTE" text="கà¯à®±à®¿à®ªà¯à®ªà¯"/>
+<l:gentext key="Note" text="கà¯à®±à®¿à®ªà¯à®ªà¯"/>
+<l:gentext key="note" text="கà¯à®±à®¿à®ªà¯à®ªà¯"/>
+<l:gentext key="Part" text="பகà¯à®¤à®¿"/>
+<l:gentext key="part" text="பகà¯à®¤à®¿"/>
+<l:gentext key="Preface" text="à®®à¯à®©à¯à®©à¯à®°à¯ˆ"/>
+<l:gentext key="preface" text="à®®à¯à®©à¯à®©à¯à®°à¯ˆ"/>
+<l:gentext key="Procedure" text="à®®à¯à®±à¯ˆ"/>
+<l:gentext key="procedure" text="à®®à¯à®±à¯ˆ"/>
+<l:gentext key="ProductionSet" text="உறà¯à®ªà®¤à¯à®¤à®¿"/>
+<l:gentext key="PubDate" text="வெளியீட௠தேதி"/>
+<l:gentext key="pubdate" text="வெளியீட௠தேதி"/>
+<l:gentext key="Published" text="பதிபà¯à®ªà®¿à®•à¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿ"/>
+<l:gentext key="published" text="பதிபà¯à®ªà®¿à®•à¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿ"/>
+<l:gentext key="Publisher" text="வெளியீடà¯à®Ÿà®¾à®³à®°à¯"/>
+<l:gentext key="Qandadiv" text="வினா &amp; விடை"/>
+<l:gentext key="qandadiv" text="வினா &amp; விடை"/>
+<l:gentext key="QandASet" text="அடிகà¯à®•à®Ÿà®¿ எழà¯à®®à¯ வினாகà¯à®•à®³à¯"/>
+<l:gentext key="Question" text="வினா:"/>
+<l:gentext key="question" text="வினா:"/>
+<l:gentext key="RefEntry" text="பகà¯à®•à®®à¯"/>
+<l:gentext key="refentry" text="பகà¯à®•à®®à¯"/>
+<l:gentext key="Reference" text="கà¯à®±à®¿à®ªà¯à®ªà¯à®•à®³à¯"/>
+<l:gentext key="reference" text="கà¯à®±à®¿à®ªà¯à®ªà¯à®•à®³à¯"/>
+<l:gentext key="References" text="கà¯à®±à®¿à®ªà¯à®ªà¯à®•à®³à¯"/>
+<l:gentext key="RefName" text="பெயரà¯"/>
+<l:gentext key="refname" text="பெயரà¯"/>
+<l:gentext key="RefSection" text="பகà¯à®¤à®¿"/>
+<l:gentext key="refsection" text="பகà¯à®¤à®¿"/>
+<l:gentext key="RefSynopsisDiv" text="சà¯à®°à¯à®•à¯à®•à®®à¯"/>
+<l:gentext key="refsynopsisdiv" text="சà¯à®°à¯à®•à¯à®•à®®à¯"/>
+<l:gentext key="RevHistory" text="மீளà¯à®ªà®¾à®°à¯à®µà¯ˆà®µà®°à®²à®¾à®±à¯"/>
+<l:gentext key="revhistory" text="மீளà¯à®ªà®¾à®°à¯à®µà¯ˆà®µà®°à®²à®¾à®±à¯"/>
+<l:gentext key="revision" text="மீளà¯à®ªà®¾à®°à¯à®µà¯ˆ"/>
+<l:gentext key="Revision" text="மீளà¯à®ªà®¾à®°à¯à®µà¯ˆ"/>
+<l:gentext key="sect1" text="பிரிவà¯"/>
+<l:gentext key="sect2" text="பிரிவà¯"/>
+<l:gentext key="sect3" text="பிரிவà¯"/>
+<l:gentext key="sect4" text="பிரிவà¯"/>
+<l:gentext key="sect5" text="பிரிவà¯"/>
+<l:gentext key="section" text="பிரிவà¯"/>
+<l:gentext key="Section" text="பிரிவà¯"/>
+<l:gentext key="see" text="பாரà¯"/>
+<l:gentext key="See" text="பாரà¯"/>
+<l:gentext key="seealso" text="இதையà¯à®®à¯à®ªà®¾à®°à¯à®•à¯à®•à®µà¯à®®à¯"/>
+<l:gentext key="Seealso" text="இதையà¯à®®à¯à®ªà®¾à®°à¯à®•à¯à®•à®µà¯à®®à¯"/>
+<l:gentext key="SeeAlso" text="இதையà¯à®®à¯à®ªà®¾à®°à¯à®•à¯à®•à®µà¯à®®à¯"/>
+<l:gentext key="set" text="அமை"/>
+<l:gentext key="Set" text="அமை"/>
+<l:gentext key="setindex" text="அடà¯à®Ÿà®µà®£à¯ˆà®…மை"/>
+<l:gentext key="SetIndex" text="அடà¯à®Ÿà®µà®£à¯ˆà®…மை"/>
+<l:gentext key="Sidebar" text="பகà¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà¯ˆ"/>
+<l:gentext key="sidebar" text="பகà¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà¯ˆ"/>
+<l:gentext key="step" text="படிமà¯à®±à¯ˆ"/>
+<l:gentext key="Step" text="படிமà¯à®±à¯ˆ"/>
+<l:gentext key="table" text="அடà¯à®Ÿà®µà®£à¯ˆ"/>
+<l:gentext key="Table" text="அடà¯à®Ÿà®µà®£à¯ˆ"/>
+<l:gentext key="task" text="பணி"/>
+<l:gentext key="Task" text="பணி"/>
+<l:gentext key="tip" text="கà¯à®±à®¿à®ªà¯à®ªà¯"/>
+<l:gentext key="TIP" text="கà¯à®±à®¿à®ªà¯à®ªà¯"/>
+<l:gentext key="Tip" text="கà¯à®±à®¿à®ªà¯à®ªà¯"/>
+<l:gentext key="Warning" text="எசà¯à®šà®°à®¿à®•à¯à®•à¯ˆ"/>
+<l:gentext key="warning" text="எசà¯à®šà®°à®¿à®•à¯à®•à¯ˆ"/>
+<l:gentext key="WARNING" text="எசà¯à®šà®°à®¿à®•à¯à®•à¯ˆ"/>
+<l:gentext key="and" text="மறà¯à®±à¯à®®à¯"/>
+<l:gentext key="by" text="ஆலà¯"/>
+<l:gentext key="Edited" text="திரà¯à®¤à¯à®¤à®ªà¯à®ªà®Ÿà¯à®Ÿ"/>
+<l:gentext key="edited" text="திரà¯à®¤à¯à®¤à®ªà¯à®ªà®Ÿà¯à®Ÿ"/>
+<l:gentext key="Editedby" text="திரà¯à®¤à¯à®¤à®¿à®¯à®µà®°à¯"/>
+<l:gentext key="editedby" text="திரà¯à®¤à¯à®¤à®¿à®¯à®µà®°à¯"/>
+<l:gentext key="in" text="இலà¯"/>
+<l:gentext key="lastlistcomma" text=","/>
+<l:gentext key="listcomma" text=","/>
+<l:gentext key="notes" text="கà¯à®±à®¿à®ªà¯à®ªà¯à®•à®³à¯"/>
+<l:gentext key="Notes" text="கà¯à®±à®¿à®ªà¯à®ªà¯à®•à®³à¯"/>
+<l:gentext key="Pgs" text="பகà¯à®•à®®à¯"/>
+<l:gentext key="pgs" text="பகà¯à®•à®®à¯"/>
+<l:gentext key="Revisedby" text="மீணà¯à®Ÿà¯à®®à¯à®ªà®¾à®°à¯à®¤à¯à®¤à®µà®°à¯: "/>
+<l:gentext key="revisedby" text="மீணà¯à®Ÿà¯à®®à¯à®ªà®¾à®°à¯à®¤à¯à®¤à®µà®°à¯: "/>
+<l:gentext key="TableNotes" text="கà¯à®±à®¿à®ªà¯à®ªà¯à®•à®³à¯"/>
+<l:gentext key="tablenotes" text="கà¯à®±à®¿à®ªà¯à®ªà¯à®•à®³à¯"/>
+<l:gentext key="TableofContents" text="உளà¯à®³à®Ÿà®•à¯à®•à®™à¯à®•à®³à¯"/>
+<l:gentext key="tableofcontents" text="உளà¯à®³à®Ÿà®•à¯à®•à®™à¯à®•à®³à¯"/>
+<l:gentext key="unexpectedelementname" text="எதிரà¯à®ªà®¾à®°à®¾à®¤à®‰à®±à¯à®ªà¯à®ªà¯à®ªà¯†à®¯à®°à¯"/>
+<l:gentext key="unsupported" text="ஆதரவறà¯à®±"/>
+<l:gentext key="xrefto" text="xref to"/>
+<l:gentext key="Authors" text="ஆசிரியரà¯à®•à®³à¯"/>
+<l:gentext key="copyeditor" text="காபà¯à®ªà®¿ எடிடà¯à®Ÿà®°à¯"/>
+<l:gentext key="graphicdesigner" text="வரைகலை வடிவமைபà¯à®ªà®¾à®³à®°à¯"/>
+<l:gentext key="productioneditor" text="தயாரிபà¯à®ªà¯ எடிடà¯à®Ÿà®°à¯"/>
+<l:gentext key="technicaleditor" text="தொழிலà¯à®¨à¯à®Ÿà¯à®ª ஆசிரியரà¯"/>
+<l:gentext key="translator" text="மொழிபெயரà¯à®ªà¯à®ªà®¾à®³à®°à¯"/>
+<l:gentext key="listofequations" text="சமனà¯à®ªà®¾à®Ÿà¯à®•à®³à®¿à®©à¯à®ªà®Ÿà¯à®Ÿà®¿à®¯à®²à¯"/>
+<l:gentext key="ListofEquations" text="சமனà¯à®ªà®¾à®Ÿà¯à®•à®³à®¿à®©à¯à®ªà®Ÿà¯à®Ÿà®¿à®¯à®²à¯"/>
+<l:gentext key="ListofExamples" text="சமனà¯à®ªà®¾à®Ÿà¯à®•à®³à®¿à®©à¯à®ªà®Ÿà¯à®Ÿà®¿à®¯à®²à¯"/>
+<l:gentext key="listofexamples" text="சமனà¯à®ªà®¾à®Ÿà¯à®•à®³à®¿à®©à¯à®ªà®Ÿà¯à®Ÿà®¿à®¯à®²à¯"/>
+<l:gentext key="ListofFigures" text="படஙà¯à®•à®³à®¿à®©à¯à®ªà®Ÿà¯à®Ÿà®¿à®¯à®²à¯"/>
+<l:gentext key="listoffigures" text="படஙà¯à®•à®³à®¿à®©à¯à®ªà®Ÿà¯à®Ÿà®¿à®¯à®²à¯"/>
+<l:gentext key="ListofProcedures" text="செயà¯à®®à¯à®±à¯ˆà®•à®³à®¿à®©à¯à®ªà®Ÿà¯à®Ÿà®¿à®¯à®²à¯"/>
+<l:gentext key="listofprocedures" text="செயà¯à®®à¯à®±à¯ˆà®•à®³à®¿à®©à¯à®ªà®Ÿà¯à®Ÿà®¿à®¯à®²à¯"/>
+<l:gentext key="listoftables" text="அடà¯à®Ÿà®µà®£à¯ˆà®•à®³à®¿à®©à¯à®ªà®Ÿà¯à®Ÿà®¿à®¯à®²à¯"/>
+<l:gentext key="ListofTables" text="அடà¯à®Ÿà®µà®£à¯ˆà®•à®³à®¿à®©à¯à®ªà®Ÿà¯à®Ÿà®¿à®¯à®²à¯"/>
+<l:gentext key="ListofUnknown" text="தெரியாதபடà¯à®Ÿà®¿à®¯à®²à¯"/>
+<l:gentext key="listofunknown" text="தெரியாதபடà¯à®Ÿà®¿à®¯à®²à¯"/>
+<l:gentext key="nav-home" text="இலà¯à®²à®®à¯"/>
+<l:gentext key="nav-next" text="அடà¯à®¤à¯à®¤à¯"/>
+<l:gentext key="nav-next-sibling" text="வேகமாகமà¯à®©à¯à®šà¯†à®²à¯"/>
+<l:gentext key="nav-prev" text="à®®à¯à®©à¯"/>
+<l:gentext key="nav-prev-sibling" text="வேகமாகபினà¯à®šà¯†à®²à¯"/>
+<l:gentext key="nav-up" text="மேலà¯"/>
+<l:gentext key="nav-toc" text="உளà¯à®³à®Ÿà®•à¯à®•à®™à¯à®•à®³à¯"/>
+<l:gentext key="Draft" text="ஆவணமà¯"/>
+<l:gentext key="above" text="மேலà¯"/>
+<l:gentext key="below" text="கீழà¯"/>
+<l:gentext key="sectioncalled" text="அழைகà¯à®•à®ªà®Ÿà¯à®Ÿà®ªà®•à¯à®¤à®¿"/>
+<l:gentext key="index symbols" text="கà¯à®±à®¿à®¯à¯€à®Ÿà¯à®•à®³à¯"/>
+<l:gentext key="writing-mode" text="lr-tb"/>
+<l:gentext key="lowercase.alpha" text="abcdefghijklmnopqrstuvwxyz"/>
+<l:gentext key="uppercase.alpha" text="ABCDEFGHIJKLMNOPQRSTUVWXYZ"/>
+<l:gentext key="normalize.sort.input" text="AaÀàÃáÂâÃãÄäÅåĀÄĂ㥹ÇǎǞǟǠǡǺǻȀÈȂȃȦȧḀá¸áºšáº áº¡áº¢áº£áº¤áº¥áº¦áº§áº¨áº©áºªáº«áº¬áº­áº®áº¯áº°áº±áº²áº³áº´áºµáº¶áº·BbÆ€ÆɓƂƃḂḃḄḅḆḇCcÇçĆćĈĉĊċČÄƇƈɕḈḉDdÄŽÄÄđƊɗƋƌDžDzȡɖḊḋḌá¸á¸Žá¸á¸á¸‘ḒḓEeÈèÉéÊêËëĒēĔĕĖėĘęĚěȄȅȆȇȨȩḔḕḖḗḘḙḚḛḜá¸áº¸áº¹áººáº»áº¼áº½áº¾áº¿á»€á»á»‚ểỄễỆệFfƑƒḞḟGgÄœÄĞğĠġĢģƓɠǤǥǦǧǴǵḠḡHhĤĥĦħȞȟɦḢḣḤḥḦḧḨḩḪḫẖIiÌìÃíÎîÃïĨĩĪīĬĭĮįİƗɨÇÇȈȉȊȋḬḭḮḯỈỉỊịJjĴĵǰÊKkĶķƘƙǨǩḰḱḲḳḴḵLlĹĺĻļĽľĿŀÅłƚLjȴɫɬɭḶḷḸḹḺḻḼḽMmɱḾḿṀá¹á¹‚ṃNnÑñŃńŅņŇňÆɲƞȠNjǸǹȵɳṄṅṆṇṈṉṊṋOoÒòÓóÔôÕõÖöØøŌÅÅŽÅÅőƟƠơǑǒǪǫǬǭǾǿȌÈÈŽÈȪȫȬȭȮȯȰȱṌá¹á¹Žá¹á¹á¹‘ṒṓỌá»á»Žá»á»á»‘ỒồỔổỖỗỘộỚớỜá»á»žá»Ÿá» á»¡á»¢á»£PpƤƥṔṕṖṗQqÊ RrŔŕŖŗŘřÈȑȒȓɼɽɾṘṙṚṛṜá¹á¹žá¹ŸSsŚśŜÅŞşŠšȘșʂṠṡṢṣṤṥṦṧṨṩTtŢţŤťŦŧƫƬƭƮʈȚțȶṪṫṬṭṮṯṰṱẗUuÙùÚúÛûÜüŨũŪūŬŭŮůŰűŲųƯưǓǔǕǖǗǘǙǚǛǜȔȕȖȗṲṳṴṵṶṷṸṹṺṻỤụỦủỨứỪừỬửỮữỰựVvƲʋṼṽṾṿWwŴŵẀáºáº‚ẃẄẅẆẇẈẉẘXxẊẋẌáºYyÃýÿŸŶŷƳƴȲȳẎáºáº™á»²á»³á»´á»µá»¶á»·á»¸á»¹ZzŹźŻżŽžƵƶȤȥÊÊ‘áºáº‘ẒẓẔẕẕ" lang="en"/>
+<l:gentext key="normalize.sort.output" text="AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBCCCCCCCCCCCCCCCCCDDDDDDDDDDDDDDDDDDDDDDDDEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEFFFFFFGGGGGGGGGGGGGGGGGGGGHHHHHHHHHHHHHHHHHHHHIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIJJJJJJKKKKKKKKKKKKKKLLLLLLLLLLLLLLLLLLLLLLLLLLMMMMMMMMMNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOPPPPPPPPQQQRRRRRRRRRRRRRRRRRRRRRRRSSSSSSSSSSSSSSSSSSSSSSSTTTTTTTTTTTTTTTTTTTTTTTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUVVVVVVVVWWWWWWWWWWWWWWWXXXXXXYYYYYYYYYYYYYYYYYYYYYYYZZZZZZZZZZZZZZZZZZZZZ" lang="en"/>
+<l:dingbat key="startquote" text="“"/>
+<l:dingbat key="endquote" text="â€"/>
+<l:dingbat key="nestedstartquote" text="‘"/>
+<l:dingbat key="nestedendquote" text="’"/>
+<l:dingbat key="singlestartquote" text="‘"/>
+<l:dingbat key="singleendquote" text="’"/>
+<l:dingbat key="bullet" text="•"/>
+<l:gentext key="hyphenation-character" text="-"/>
+<l:gentext key="hyphenation-push-character-count" text="2"/>
+<l:gentext key="hyphenation-remain-character-count" text="2"/>
+<l:context name="styles"><l:template name="person-name" text="first-last"/>
+</l:context>
+<l:context name="title"><l:template name="abstract" text="%t"/>
+<l:template name="acknowledgements" text="%t" lang="en"/>
+<l:template name="answer" text="%t"/>
+<l:template name="appendix" text="இணைபà¯à®ªà¯Â %n. %t"/>
+<l:template name="article" text="%t"/>
+<l:template name="authorblurb" text="%t"/>
+<l:template name="bibliodiv" text="%t"/>
+<l:template name="biblioentry" text="%t"/>
+<l:template name="bibliography" text="%t"/>
+<l:template name="bibliolist" text="%t"/>
+<l:template name="bibliomixed" text="%t"/>
+<l:template name="bibliomset" text="%t"/>
+<l:template name="biblioset" text="%t"/>
+<l:template name="blockquote" text="%t"/>
+<l:template name="book" text="%t"/>
+<l:template name="calloutlist" text="%t"/>
+<l:template name="caution" text="%t"/>
+<l:template name="chapter" text="பாடமà¯Â %n. %t"/>
+<l:template name="colophon" text="%t"/>
+<l:template name="dedication" text="%t"/>
+<l:template name="equation" text="சமனà¯à®ªà®¾à®Ÿà¯Â %n. %t"/>
+<l:template name="example" text="உதாரணமà¯Â %n. %t"/>
+<l:template name="figure" text="படமà¯Â %n. %t"/>
+<l:template name="foil" text="%t"/>
+<l:template name="foilgroup" text="%t"/>
+<l:template name="formalpara" text="%t"/>
+<l:template name="glossary" text="%t"/>
+<l:template name="glossdiv" text="%t"/>
+<l:template name="glosslist" text="%t"/>
+<l:template name="glossentry" text="%t"/>
+<l:template name="important" text="%t"/>
+<l:template name="index" text="%t"/>
+<l:template name="indexdiv" text="%t"/>
+<l:template name="itemizedlist" text="%t"/>
+<l:template name="legalnotice" text="%t"/>
+<l:template name="listitem" text=""/>
+<l:template name="lot" text="%t"/>
+<l:template name="msg" text="%t"/>
+<l:template name="msgexplan" text="%t"/>
+<l:template name="msgmain" text="%t"/>
+<l:template name="msgrel" text="%t"/>
+<l:template name="msgset" text="%t"/>
+<l:template name="msgsub" text="%t"/>
+<l:template name="note" text="%t"/>
+<l:template name="orderedlist" text="%t"/>
+<l:template name="part" text="பகà¯à®¤à®¿Â %n. %t"/>
+<l:template name="partintro" text="%t"/>
+<l:template name="preface" text="%t"/>
+<l:template name="procedure" text="%t"/>
+<l:template name="procedure.formal" text="à®®à¯à®±à¯ˆÂ %n. %t"/>
+<l:template name="productionset" text="%t"/>
+<l:template name="productionset.formal" text="உறà¯à®ªà®¤à¯à®¤à®¿Â %n"/>
+<l:template name="qandadiv" text="%t"/>
+<l:template name="qandaentry" text="%t"/>
+<l:template name="qandaset" text="%t"/>
+<l:template name="question" text="%t"/>
+<l:template name="refentry" text="%t"/>
+<l:template name="reference" text="%t"/>
+<l:template name="refsection" text="%t"/>
+<l:template name="refsect1" text="%t"/>
+<l:template name="refsect2" text="%t"/>
+<l:template name="refsect3" text="%t"/>
+<l:template name="refsynopsisdiv" text="%t"/>
+<l:template name="refsynopsisdivinfo" text="%t"/>
+<l:template name="segmentedlist" text="%t"/>
+<l:template name="set" text="%t"/>
+<l:template name="setindex" text="%t"/>
+<l:template name="sidebar" text="%t"/>
+<l:template name="step" text="%t"/>
+<l:template name="table" text="அடà¯à®Ÿà®µà®£à¯ˆÂ %n. %t"/>
+<l:template name="task" text="%t"/>
+<l:template name="tasksummary" text="%t" lang="en"/>
+<l:template name="taskprerequisites" text="%t" lang="en"/>
+<l:template name="taskrelated" text="%t" lang="en"/>
+<l:template name="tip" text="%t"/>
+<l:template name="toc" text="%t"/>
+<l:template name="variablelist" text="%t"/>
+<l:template name="varlistentry" text=""/>
+<l:template name="warning" text="%t"/>
+</l:context>
+<l:context name="title-unnumbered"><l:template name="appendix" text="%t"/>
+<l:template name="article/appendix" text="%t"/>
+<l:template name="bridgehead" text="%t"/>
+<l:template name="chapter" text="%t"/>
+<l:template name="sect1" text="%t"/>
+<l:template name="sect2" text="%t"/>
+<l:template name="sect3" text="%t"/>
+<l:template name="sect4" text="%t"/>
+<l:template name="sect5" text="%t"/>
+<l:template name="section" text="%t"/>
+<l:template name="simplesect" text="%t"/>
+<l:template name="part" text="%t" lang="en"/>
+</l:context>
+<l:context name="title-numbered"><l:template name="appendix" text="இணைபà¯à®ªà¯Â %n. %t"/>
+<l:template name="article/appendix" text="%n. %t"/>
+<l:template name="bridgehead" text="%n. %t"/>
+<l:template name="chapter" text="பாடமà¯Â %n. %t"/>
+<l:template name="part" text="பகà¯à®¤à®¿Â %n. %t"/>
+<l:template name="sect1" text="%n. %t"/>
+<l:template name="sect2" text="%n. %t"/>
+<l:template name="sect3" text="%n. %t"/>
+<l:template name="sect4" text="%n. %t"/>
+<l:template name="sect5" text="%n. %t"/>
+<l:template name="section" text="%n. %t"/>
+<l:template name="simplesect" text="%t"/>
+</l:context>
+<l:context name="subtitle"><l:template name="appendix" text="%s"/>
+<l:template name="acknowledgements" text="%s" lang="en"/>
+<l:template name="article" text="%s"/>
+<l:template name="bibliodiv" text="%s"/>
+<l:template name="biblioentry" text="%s"/>
+<l:template name="bibliography" text="%s"/>
+<l:template name="bibliomixed" text="%s"/>
+<l:template name="bibliomset" text="%s"/>
+<l:template name="biblioset" text="%s"/>
+<l:template name="book" text="%s"/>
+<l:template name="chapter" text="%s"/>
+<l:template name="colophon" text="%s"/>
+<l:template name="dedication" text="%s"/>
+<l:template name="glossary" text="%s"/>
+<l:template name="glossdiv" text="%s"/>
+<l:template name="index" text="%s"/>
+<l:template name="indexdiv" text="%s"/>
+<l:template name="lot" text="%s"/>
+<l:template name="part" text="%s"/>
+<l:template name="partintro" text="%s"/>
+<l:template name="preface" text="%s"/>
+<l:template name="refentry" text="%s"/>
+<l:template name="reference" text="%s"/>
+<l:template name="refsection" text="%s"/>
+<l:template name="refsect1" text="%s"/>
+<l:template name="refsect2" text="%s"/>
+<l:template name="refsect3" text="%s"/>
+<l:template name="refsynopsisdiv" text="%s"/>
+<l:template name="sect1" text="%s"/>
+<l:template name="sect2" text="%s"/>
+<l:template name="sect3" text="%s"/>
+<l:template name="sect4" text="%s"/>
+<l:template name="sect5" text="%s"/>
+<l:template name="section" text="%s"/>
+<l:template name="set" text="%s"/>
+<l:template name="setindex" text="%s"/>
+<l:template name="sidebar" text="%s"/>
+<l:template name="simplesect" text="%s"/>
+<l:template name="toc" text="%s"/>
+</l:context>
+<l:context name="xref"><l:template name="abstract" text="%t"/>
+<l:template name="acknowledgements" text="%t" lang="en"/>
+<l:template name="answer" text="விடை: %n"/>
+<l:template name="appendix" text="%t"/>
+<l:template name="article" text="%t"/>
+<l:template name="authorblurb" text="%t"/>
+<l:template name="bibliodiv" text="%t"/>
+<l:template name="bibliography" text="%t"/>
+<l:template name="bibliomset" text="%t"/>
+<l:template name="biblioset" text="%t"/>
+<l:template name="blockquote" text="%t"/>
+<l:template name="book" text="%t"/>
+<l:template name="calloutlist" text="%t"/>
+<l:template name="caution" text="%t"/>
+<l:template name="chapter" text="%t"/>
+<l:template name="colophon" text="%t"/>
+<l:template name="constraintdef" text="%t"/>
+<l:template name="dedication" text="%t"/>
+<l:template name="equation" text="%t"/>
+<l:template name="example" text="%t"/>
+<l:template name="figure" text="%t"/>
+<l:template name="foil" text="%t"/>
+<l:template name="foilgroup" text="%t"/>
+<l:template name="formalpara" text="%t"/>
+<l:template name="glossary" text="%t"/>
+<l:template name="glossdiv" text="%t"/>
+<l:template name="important" text="%t"/>
+<l:template name="index" text="%t"/>
+<l:template name="indexdiv" text="%t"/>
+<l:template name="itemizedlist" text="%t"/>
+<l:template name="legalnotice" text="%t"/>
+<l:template name="listitem" text="%n"/>
+<l:template name="lot" text="%t"/>
+<l:template name="msg" text="%t"/>
+<l:template name="msgexplan" text="%t"/>
+<l:template name="msgmain" text="%t"/>
+<l:template name="msgrel" text="%t"/>
+<l:template name="msgset" text="%t"/>
+<l:template name="msgsub" text="%t"/>
+<l:template name="note" text="%t"/>
+<l:template name="orderedlist" text="%t"/>
+<l:template name="part" text="%t"/>
+<l:template name="partintro" text="%t"/>
+<l:template name="preface" text="%t"/>
+<l:template name="procedure" text="%t"/>
+<l:template name="productionset" text="%t"/>
+<l:template name="qandadiv" text="%t"/>
+<l:template name="qandaentry" text="வினா: %n"/>
+<l:template name="qandaset" text="%t"/>
+<l:template name="question" text="வினா: %n"/>
+<l:template name="reference" text="%t"/>
+<l:template name="refsynopsisdiv" text="%t"/>
+<l:template name="segmentedlist" text="%t"/>
+<l:template name="set" text="%t"/>
+<l:template name="setindex" text="%t"/>
+<l:template name="sidebar" text="%t"/>
+<l:template name="table" text="%t"/>
+<l:template name="task" text="%t" lang="en"/>
+<l:template name="tip" text="%t"/>
+<l:template name="toc" text="%t"/>
+<l:template name="variablelist" text="%t"/>
+<l:template name="varlistentry" text="%n"/>
+<l:template name="warning" text="%t"/>
+<l:template name="olink.document.citation" text=" in %o"/>
+<l:template name="olink.page.citation" text=" (page %p)"/>
+<l:template name="page.citation" text=" [%p]"/>
+<l:template name="page" text="(page %p)"/>
+<l:template name="docname" text=" in %o"/>
+<l:template name="docnamelong" text=" in the document titled %o"/>
+<l:template name="pageabbrev" text="(p. %p)"/>
+<l:template name="Page" text="Page %p"/>
+<l:template name="bridgehead" text="அழைகà¯à®•à®ªà®Ÿà¯à®Ÿà®ªà®•à¯à®¤à®¿ “%tâ€"/>
+<l:template name="refsection" text="அழைகà¯à®•à®ªà®Ÿà¯à®Ÿà®ªà®•à¯à®¤à®¿ “%tâ€"/>
+<l:template name="refsect1" text="அழைகà¯à®•à®ªà®Ÿà¯à®Ÿà®ªà®•à¯à®¤à®¿ “%tâ€"/>
+<l:template name="refsect2" text="அழைகà¯à®•à®ªà®Ÿà¯à®Ÿà®ªà®•à¯à®¤à®¿ “%tâ€"/>
+<l:template name="refsect3" text="அழைகà¯à®•à®ªà®Ÿà¯à®Ÿà®ªà®•à¯à®¤à®¿ “%tâ€"/>
+<l:template name="sect1" text="அழைகà¯à®•à®ªà®Ÿà¯à®Ÿà®ªà®•à¯à®¤à®¿ “%tâ€"/>
+<l:template name="sect2" text="அழைகà¯à®•à®ªà®Ÿà¯à®Ÿà®ªà®•à¯à®¤à®¿ “%tâ€"/>
+<l:template name="sect3" text="அழைகà¯à®•à®ªà®Ÿà¯à®Ÿà®ªà®•à¯à®¤à®¿ “%tâ€"/>
+<l:template name="sect4" text="அழைகà¯à®•à®ªà®Ÿà¯à®Ÿà®ªà®•à¯à®¤à®¿ “%tâ€"/>
+<l:template name="sect5" text="அழைகà¯à®•à®ªà®Ÿà¯à®Ÿà®ªà®•à¯à®¤à®¿ “%tâ€"/>
+<l:template name="section" text="அழைகà¯à®•à®ªà®Ÿà¯à®Ÿà®ªà®•à¯à®¤à®¿ “%tâ€"/>
+<l:template name="simplesect" text="அழைகà¯à®•à®ªà®Ÿà¯à®Ÿà®ªà®•à¯à®¤à®¿ “%tâ€"/>
+</l:context>
+<l:context name="xref-number"><l:template name="answer" text="விடை: %n"/>
+<l:template name="appendix" text="இணைபà¯à®ªà¯Â %n"/>
+<l:template name="bridgehead" text="பிரிவà¯Â %n"/>
+<l:template name="chapter" text="பாடமà¯Â %n"/>
+<l:template name="equation" text="சமனà¯à®ªà®¾à®Ÿà¯Â %n"/>
+<l:template name="example" text="உதாரணமà¯Â %n"/>
+<l:template name="figure" text="படமà¯Â %n"/>
+<l:template name="part" text="பகà¯à®¤à®¿Â %n"/>
+<l:template name="procedure" text="à®®à¯à®±à¯ˆÂ %n"/>
+<l:template name="productionset" text="உறà¯à®ªà®¤à¯à®¤à®¿Â %n"/>
+<l:template name="qandadiv" text="வினா &amp; விடை %n"/>
+<l:template name="qandaentry" text="வினா: %n"/>
+<l:template name="question" text="வினா: %n"/>
+<l:template name="sect1" text="பிரிவà¯Â %n"/>
+<l:template name="sect2" text="பிரிவà¯Â %n"/>
+<l:template name="sect3" text="பிரிவà¯Â %n"/>
+<l:template name="sect4" text="பிரிவà¯Â %n"/>
+<l:template name="sect5" text="பிரிவà¯Â %n"/>
+<l:template name="section" text="பிரிவà¯Â %n"/>
+<l:template name="table" text="அடà¯à®Ÿà®µà®£à¯ˆÂ %n"/>
+</l:context>
+<l:context name="xref-number-and-title"><l:template name="appendix" text="இணைபà¯à®ªà¯Â %n, %t"/>
+<l:template name="bridgehead" text="பிரிவà¯Â %n, “%tâ€"/>
+<l:template name="chapter" text="பாடமà¯Â %n, %t"/>
+<l:template name="equation" text="சமனà¯à®ªà®¾à®Ÿà¯Â %n, “%tâ€"/>
+<l:template name="example" text="உதாரணமà¯Â %n, “%tâ€"/>
+<l:template name="figure" text="படமà¯Â %n, “%tâ€"/>
+<l:template name="part" text="பகà¯à®¤à®¿Â %n, “%tâ€"/>
+<l:template name="procedure" text="à®®à¯à®±à¯ˆÂ %n, “%tâ€"/>
+<l:template name="productionset" text="உறà¯à®ªà®¤à¯à®¤à®¿Â %n, “%tâ€"/>
+<l:template name="qandadiv" text="வினா &amp; விடை %n, “%tâ€"/>
+<l:template name="refsect1" text="அழைகà¯à®•à®ªà®Ÿà¯à®Ÿà®ªà®•à¯à®¤à®¿ “%tâ€"/>
+<l:template name="refsect2" text="அழைகà¯à®•à®ªà®Ÿà¯à®Ÿà®ªà®•à¯à®¤à®¿ “%tâ€"/>
+<l:template name="refsect3" text="அழைகà¯à®•à®ªà®Ÿà¯à®Ÿà®ªà®•à¯à®¤à®¿ “%tâ€"/>
+<l:template name="refsection" text="அழைகà¯à®•à®ªà®Ÿà¯à®Ÿà®ªà®•à¯à®¤à®¿ “%tâ€"/>
+<l:template name="sect1" text="பிரிவà¯Â %n, “%tâ€"/>
+<l:template name="sect2" text="பிரிவà¯Â %n, “%tâ€"/>
+<l:template name="sect3" text="பிரிவà¯Â %n, “%tâ€"/>
+<l:template name="sect4" text="பிரிவà¯Â %n, “%tâ€"/>
+<l:template name="sect5" text="பிரிவà¯Â %n, “%tâ€"/>
+<l:template name="section" text="பிரிவà¯Â %n, “%tâ€"/>
+<l:template name="simplesect" text="அழைகà¯à®•à®ªà®Ÿà¯à®Ÿà®ªà®•à¯à®¤à®¿ “%tâ€"/>
+<l:template name="table" text="அடà¯à®Ÿà®µà®£à¯ˆÂ %n, “%tâ€"/>
+</l:context>
+<l:context name="authorgroup"><l:template name="sep" text=", "/>
+<l:template name="sep2" text=" மறà¯à®±à¯à®®à¯ "/>
+<l:template name="seplast" text=", மறà¯à®±à¯à®®à¯ "/>
+</l:context>
+<l:context name="glossary"><l:template name="see" text="பார௠%t."/>
+<l:template name="seealso" text="இதையà¯à®®à¯à®ªà®¾à®°à¯à®•à¯à®•à®µà¯à®®à¯ %t."/>
+<l:template name="seealso-separator" text=", "/>
+</l:context>
+<l:context name="msgset"><l:template name="MsgAud" text="பாரà¯à®µà¯ˆà®¯à®¾à®³à®°à¯à®•à®³à¯: "/>
+<l:template name="MsgLevel" text="நிலை: "/>
+<l:template name="MsgOrig" text="மூலமà¯: "/>
+</l:context>
+<l:context name="datetime"><l:template name="format" text="m/d/Y"/>
+</l:context>
+<l:context name="termdef"><l:template name="prefix" text="[Definition: "/>
+<l:template name="suffix" text="]"/>
+</l:context>
+<l:context name="datetime-full"><l:template name="January" text="ஜனவரி"/>
+<l:template name="February" text="பிபà¯à®°à®µà®°à®¿"/>
+<l:template name="March" text="மாரà¯à®šà¯"/>
+<l:template name="April" text="à®à®ªà¯à®°à®²à¯"/>
+<l:template name="May" text="மே"/>
+<l:template name="June" text="ஜூனà¯"/>
+<l:template name="July" text="ஜூலை"/>
+<l:template name="August" text="ஆகஸà¯à®Ÿà¯"/>
+<l:template name="September" text="செபà¯à®Ÿà®®à¯à®ªà®°à¯"/>
+<l:template name="October" text="அகà¯à®Ÿà¯‹à®ªà®°à¯"/>
+<l:template name="November" text="நவமà¯à®ªà®°à¯"/>
+<l:template name="December" text="டிசமà¯à®ªà®°à¯"/>
+<l:template name="Monday" text="திஙà¯à®•à®Ÿà¯à®•à®¿à®´à®®à¯ˆ"/>
+<l:template name="Tuesday" text="செவà¯à®µà®¾à®¯à¯à®•à®¿à®´à®®à¯ˆ"/>
+<l:template name="Wednesday" text="பà¯à®¤à®©à¯à®•à®¿à®´à®®à¯ˆ"/>
+<l:template name="Thursday" text="வியாழகà¯à®•à®¿à®´à®®à¯ˆ"/>
+<l:template name="Friday" text="வெளà¯à®³à®¿à®•à¯à®•à®¿à®´à®®à¯ˆ"/>
+<l:template name="Saturday" text="சனிகà¯à®•à®¿à®´à®®à¯ˆ"/>
+<l:template name="Sunday" text="ஞாயிறà¯à®±à¯à®•à¯à®•à®¿à®´à®®à¯ˆ"/>
+</l:context>
+<l:context name="datetime-abbrev"><l:template name="Jan" text="à®à®©"/>
+<l:template name="Feb" text="பிபà¯"/>
+<l:template name="Mar" text="மாரà¯"/>
+<l:template name="Apr" text="à®à®ªà¯"/>
+<l:template name="May" text="மே"/>
+<l:template name="Jun" text="ஜூனà¯"/>
+<l:template name="Jul" text="ஜூலை"/>
+<l:template name="Aug" text="ஆக"/>
+<l:template name="Sep" text="செபà¯"/>
+<l:template name="Oct" text="அகà¯"/>
+<l:template name="Nov" text="நவ"/>
+<l:template name="Dec" text="டிச"/>
+<l:template name="Mon" text="திஙà¯"/>
+<l:template name="Tue" text="செவà¯"/>
+<l:template name="Wed" text="பà¯à®¤"/>
+<l:template name="Thu" text="வியா"/>
+<l:template name="Fri" text="வெளà¯"/>
+<l:template name="Sat" text="சனி"/>
+<l:template name="Sun" text="ஞாயி"/>
+</l:context>
+<l:context name="htmlhelp"><l:template name="langcode" text="0x0049 Tamil"/>
+</l:context>
+<l:context name="index"><l:template name="term-separator" text=", "/>
+<l:template name="number-separator" text=", "/>
+<l:template name="range-separator" text="-"/>
+</l:context>
+<l:context name="iso690"><l:template name="lastfirst.sep" text=", "/>
+<l:template name="alt.person.two.sep" text=" – "/>
+<l:template name="alt.person.last.sep" text=" – "/>
+<l:template name="alt.person.more.sep" text=" – "/>
+<l:template name="primary.editor" text=" (ed.)"/>
+<l:template name="primary.many" text=", et al."/>
+<l:template name="primary.sep" text=". "/>
+<l:template name="submaintitle.sep" text=": "/>
+<l:template name="title.sep" text=". "/>
+<l:template name="othertitle.sep" text=", "/>
+<l:template name="medium1" text=" ["/>
+<l:template name="medium2" text="]"/>
+<l:template name="secondary.person.sep" text="; "/>
+<l:template name="secondary.sep" text=". "/>
+<l:template name="respons.sep" text=". "/>
+<l:template name="edition.sep" text=". "/>
+<l:template name="edition.serial.sep" text=", "/>
+<l:template name="issuing.range" text="-"/>
+<l:template name="issuing.div" text=", "/>
+<l:template name="issuing.sep" text=". "/>
+<l:template name="partnr.sep" text=". "/>
+<l:template name="placepubl.sep" text=": "/>
+<l:template name="publyear.sep" text=", "/>
+<l:template name="pubinfo.sep" text=". "/>
+<l:template name="spec.pubinfo.sep" text=", "/>
+<l:template name="upd.sep" text=", "/>
+<l:template name="datecit1" text=" [cited "/>
+<l:template name="datecit2" text="]"/>
+<l:template name="extent.sep" text=". "/>
+<l:template name="locs.sep" text=", "/>
+<l:template name="location.sep" text=". "/>
+<l:template name="serie.sep" text=". "/>
+<l:template name="notice.sep" text=". "/>
+<l:template name="access" text="Available "/>
+<l:template name="acctoo" text="Also available "/>
+<l:template name="onwww" text="from World Wide Web"/>
+<l:template name="oninet" text="from Internet"/>
+<l:template name="access.end" text=": "/>
+<l:template name="link1" text="&lt;"/>
+<l:template name="link2" text="&gt;"/>
+<l:template name="access.sep" text=". "/>
+<l:template name="isbn" text="ISBN "/>
+<l:template name="issn" text="ISSN "/>
+<l:template name="stdnum.sep" text=". "/>
+<l:template name="patcountry.sep" text=". "/>
+<l:template name="pattype.sep" text=", "/>
+<l:template name="patnum.sep" text=". "/>
+<l:template name="patdate.sep" text=". "/>
+</l:context><l:letters><l:l i="-1"/>
+<l:l i="0">கà¯à®±à®¿à®¯à¯€à®Ÿà¯à®•à®³à¯</l:l>
+<l:l i="10">A</l:l>
+<l:l i="10">a</l:l>
+<l:l i="20">B</l:l>
+<l:l i="20">b</l:l>
+<l:l i="30">C</l:l>
+<l:l i="30">c</l:l>
+<l:l i="40">D</l:l>
+<l:l i="40">d</l:l>
+<l:l i="50">E</l:l>
+<l:l i="50">e</l:l>
+<l:l i="60">F</l:l>
+<l:l i="60">f</l:l>
+<l:l i="70">G</l:l>
+<l:l i="70">g</l:l>
+<l:l i="80">H</l:l>
+<l:l i="80">h</l:l>
+<l:l i="90">I</l:l>
+<l:l i="90">i</l:l>
+<l:l i="100">J</l:l>
+<l:l i="100">j</l:l>
+<l:l i="110">K</l:l>
+<l:l i="110">k</l:l>
+<l:l i="120">L</l:l>
+<l:l i="120">l</l:l>
+<l:l i="130">M</l:l>
+<l:l i="130">m</l:l>
+<l:l i="140">N</l:l>
+<l:l i="140">n</l:l>
+<l:l i="150">O</l:l>
+<l:l i="150">o</l:l>
+<l:l i="160">P</l:l>
+<l:l i="160">p</l:l>
+<l:l i="170">Q</l:l>
+<l:l i="170">q</l:l>
+<l:l i="180">R</l:l>
+<l:l i="180">r</l:l>
+<l:l i="190">S</l:l>
+<l:l i="190">s</l:l>
+<l:l i="200">T</l:l>
+<l:l i="200">t</l:l>
+<l:l i="210">U</l:l>
+<l:l i="210">u</l:l>
+<l:l i="220">V</l:l>
+<l:l i="220">v</l:l>
+<l:l i="230">W</l:l>
+<l:l i="230">w</l:l>
+<l:l i="240">X</l:l>
+<l:l i="240">x</l:l>
+<l:l i="250">Y</l:l>
+<l:l i="250">y</l:l>
+<l:l i="260">Z</l:l>
+<l:l i="260">z</l:l>
+</l:letters>
+</l:l10n>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/table.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/table.xsl
new file mode 100644
index 0000000..aefdb07
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/table.xsl
@@ -0,0 +1,514 @@
+<?xml version="1.0"?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:doc="http://nwalsh.com/xsl/documentation/1.0"
+ exclude-result-prefixes="doc"
+ version="1.0">
+
+<!-- ********************************************************************
+ $Id: table.xsl 8392 2009-04-01 08:47:55Z bobstayton $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<!-- ==================================================================== -->
+
+<xsl:template name="blank.spans">
+ <xsl:param name="cols" select="1"/>
+ <xsl:if test="$cols &gt; 0">
+ <xsl:text>0:</xsl:text>
+ <xsl:call-template name="blank.spans">
+ <xsl:with-param name="cols" select="$cols - 1"/>
+ </xsl:call-template>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template name="calculate.following.spans">
+ <xsl:param name="colspan" select="1"/>
+ <xsl:param name="spans" select="''"/>
+
+ <xsl:choose>
+ <xsl:when test="$colspan &gt; 0">
+ <xsl:call-template name="calculate.following.spans">
+ <xsl:with-param name="colspan" select="$colspan - 1"/>
+ <xsl:with-param name="spans" select="substring-after($spans,':')"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$spans"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="finaltd">
+ <xsl:param name="spans"/>
+ <xsl:param name="col" select="0"/>
+
+ <xsl:if test="$spans != ''">
+ <xsl:choose>
+ <xsl:when test="starts-with($spans,'0:')">
+ <xsl:call-template name="empty.table.cell">
+ <xsl:with-param name="colnum" select="$col"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise></xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:call-template name="finaltd">
+ <xsl:with-param name="spans" select="substring-after($spans,':')"/>
+ <xsl:with-param name="col" select="$col+1"/>
+ </xsl:call-template>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template name="sfinaltd">
+ <xsl:param name="spans"/>
+
+ <xsl:if test="$spans != ''">
+ <xsl:choose>
+ <xsl:when test="starts-with($spans,'0:')">0:</xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="substring-before($spans,':')-1"/>
+ <xsl:text>:</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:call-template name="sfinaltd">
+ <xsl:with-param name="spans" select="substring-after($spans,':')"/>
+ </xsl:call-template>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template name="entry.colnum">
+ <xsl:param name="entry" select="."/>
+
+ <xsl:choose>
+ <xsl:when test="$entry/@spanname">
+ <xsl:variable name="spanname" select="$entry/@spanname"/>
+ <xsl:variable name="spanspec"
+ select="($entry/ancestor::tgroup/spanspec[@spanname=$spanname]
+ |$entry/ancestor::entrytbl/spanspec[@spanname=$spanname])[last()]"/>
+ <xsl:variable name="colspec"
+ select="($entry/ancestor::tgroup/colspec[@colname=$spanspec/@namest]
+ |$entry/ancestor::entrytbl/colspec[@colname=$spanspec/@namest])[last()]"/>
+ <xsl:call-template name="colspec.colnum">
+ <xsl:with-param name="colspec" select="$colspec"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="$entry/@colname">
+ <xsl:variable name="colname" select="$entry/@colname"/>
+ <xsl:variable name="colspec"
+ select="($entry/ancestor::tgroup/colspec[@colname=$colname]
+ |$entry/ancestor::entrytbl/colspec[@colname=$colname])[last()]"/>
+ <xsl:call-template name="colspec.colnum">
+ <xsl:with-param name="colspec" select="$colspec"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="$entry/@namest">
+ <xsl:variable name="namest" select="$entry/@namest"/>
+ <xsl:variable name="colspec"
+ select="($entry/ancestor::tgroup/colspec[@colname=$namest]
+ |$entry/ancestor::entrytbl/colspec[@colname=$namest])[last()]"/>
+ <xsl:call-template name="colspec.colnum">
+ <xsl:with-param name="colspec" select="$colspec"/>
+ </xsl:call-template>
+ </xsl:when>
+ <!-- no idea, return 0 -->
+ <xsl:otherwise>0</xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<doc:template name="entry.colnum" xmlns="">
+<refpurpose>Determine the column number in which a given entry occurs</refpurpose>
+<refdescription id="entry.colnum-desc">
+<para>If an <tag>entry</tag> has a
+<tag class="attribute">colname</tag> or
+<tag class="attribute">namest</tag> attribute, this template
+will determine the number of the column in which the entry should occur.
+For other <tag>entry</tag>s, nothing is returned.</para>
+</refdescription>
+<refparameter id="entry.colnum-params">
+<variablelist>
+<varlistentry><term>entry</term>
+<listitem>
+<para>The <tag>entry</tag>-element which is to be tested.</para>
+</listitem>
+</varlistentry>
+</variablelist>
+</refparameter>
+
+<refreturn id="entry.colnum-returns">
+<para>This template returns the column number if it can be determined,
+or 0 (the empty string)</para>
+</refreturn>
+</doc:template>
+
+<xsl:template name="colspec.colnum">
+ <xsl:param name="colspec" select="."/>
+ <xsl:choose>
+ <xsl:when test="$colspec/@colnum">
+ <xsl:value-of select="$colspec/@colnum"/>
+ </xsl:when>
+ <xsl:when test="$colspec/preceding-sibling::colspec">
+ <xsl:variable name="prec.colspec.colnum">
+ <xsl:call-template name="colspec.colnum">
+ <xsl:with-param name="colspec"
+ select="$colspec/preceding-sibling::colspec[1]"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:value-of select="$prec.colspec.colnum + 1"/>
+ </xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="calculate.colspan">
+ <xsl:param name="entry" select="."/>
+ <xsl:variable name="spanname" select="$entry/@spanname"/>
+ <xsl:variable name="spanspec"
+ select="($entry/ancestor::tgroup/spanspec[@spanname=$spanname]
+ |$entry/ancestor::entrytbl/spanspec[@spanname=$spanname])[last()]"/>
+
+ <xsl:variable name="namest">
+ <xsl:choose>
+ <xsl:when test="@spanname">
+ <xsl:value-of select="$spanspec/@namest"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$entry/@namest"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="nameend">
+ <xsl:choose>
+ <xsl:when test="@spanname">
+ <xsl:value-of select="$spanspec/@nameend"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$entry/@nameend"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="scol">
+ <xsl:call-template name="colspec.colnum">
+ <xsl:with-param name="colspec"
+ select="($entry/ancestor::tgroup/colspec[@colname=$namest]
+ |$entry/ancestor::entrytbl/colspec[@colname=$namest])[last()]"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="ecol">
+ <xsl:call-template name="colspec.colnum">
+ <xsl:with-param name="colspec"
+ select="($entry/ancestor::tgroup/colspec[@colname=$nameend]
+ |$entry/ancestor::entrytbl/colspec[@colname=$nameend])[last()]"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="$namest != '' and $nameend != ''">
+ <xsl:choose>
+ <xsl:when test="number($ecol) &gt;= number($scol)">
+ <xsl:value-of select="number($ecol) - number($scol) + 1"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="number($scol) - number($ecol) + 1"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="calculate.rowsep">
+ <xsl:param name="entry" select="."/>
+ <xsl:param name="colnum" select="0"/>
+
+ <xsl:call-template name="inherited.table.attribute">
+ <xsl:with-param name="entry" select="$entry"/>
+ <xsl:with-param name="colnum" select="$colnum"/>
+ <xsl:with-param name="attribute" select="'rowsep'"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template name="calculate.colsep">
+ <xsl:param name="entry" select="."/>
+ <xsl:param name="colnum" select="0"/>
+
+ <xsl:call-template name="inherited.table.attribute">
+ <xsl:with-param name="entry" select="$entry"/>
+ <xsl:with-param name="colnum" select="$colnum"/>
+ <xsl:with-param name="attribute" select="'colsep'"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template name="inherited.table.attribute">
+ <xsl:param name="entry" select="."/>
+ <xsl:param name="row" select="$entry/ancestor-or-self::row[1]"/>
+ <xsl:param name="colnum" select="0"/>
+ <xsl:param name="attribute" select="'colsep'"/>
+
+ <xsl:variable name="tgroup" select="$row/parent::*/parent::tgroup[1]"/>
+ <xsl:variable name="tbody" select="$row/parent::*[1]"/>
+
+ <xsl:variable name="table" select="($tgroup/ancestor::table
+ |$tgroup/ancestor::informaltable
+ |$entry/ancestor::entrytbl)[last()]"/>
+
+ <xsl:variable name="entry.value">
+ <xsl:call-template name="get-attribute">
+ <xsl:with-param name="element" select="$entry"/>
+ <xsl:with-param name="attribute" select="$attribute"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="row.value">
+ <xsl:call-template name="get-attribute">
+ <xsl:with-param name="element" select="$row"/>
+ <xsl:with-param name="attribute" select="$attribute"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="span.value">
+ <xsl:if test="$entry/@spanname">
+ <xsl:variable name="spanname" select="$entry/@spanname"/>
+ <xsl:variable name="spanspec"
+ select="$tgroup/spanspec[@spanname=$spanname]"/>
+ <xsl:variable name="span.colspec"
+ select="$tgroup/colspec[@colname=$spanspec/@namest]"/>
+
+ <xsl:variable name="spanspec.value">
+ <xsl:call-template name="get-attribute">
+ <xsl:with-param name="element" select="$spanspec"/>
+ <xsl:with-param name="attribute" select="$attribute"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="scolspec.value">
+ <xsl:call-template name="get-attribute">
+ <xsl:with-param name="element" select="$span.colspec"/>
+ <xsl:with-param name="attribute" select="$attribute"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="$spanspec.value != ''">
+ <xsl:value-of select="$spanspec.value"/>
+ </xsl:when>
+ <xsl:when test="$scolspec.value != ''">
+ <xsl:value-of select="$scolspec.value"/>
+ </xsl:when>
+ <xsl:otherwise></xsl:otherwise>
+ </xsl:choose>
+ </xsl:if>
+ </xsl:variable>
+
+ <xsl:variable name="namest.value">
+ <xsl:if test="$entry/@namest">
+ <xsl:variable name="namest" select="$entry/@namest"/>
+ <xsl:variable name="colspec"
+ select="$tgroup/colspec[@colname=$namest]"/>
+
+ <xsl:variable name="inner.namest.value">
+ <xsl:call-template name="get-attribute">
+ <xsl:with-param name="element" select="$colspec"/>
+ <xsl:with-param name="attribute" select="$attribute"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="$inner.namest.value">
+ <xsl:value-of select="$inner.namest.value"/>
+ </xsl:when>
+ <xsl:otherwise></xsl:otherwise>
+ </xsl:choose>
+ </xsl:if>
+ </xsl:variable>
+
+ <xsl:variable name="tgroup.value">
+ <xsl:call-template name="get-attribute">
+ <xsl:with-param name="element" select="$tgroup"/>
+ <xsl:with-param name="attribute" select="$attribute"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="tbody.value">
+ <xsl:call-template name="get-attribute">
+ <xsl:with-param name="element" select="$tbody"/>
+ <xsl:with-param name="attribute" select="$attribute"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="table.value">
+ <xsl:call-template name="get-attribute">
+ <xsl:with-param name="element" select="$table"/>
+ <xsl:with-param name="attribute" select="$attribute"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="default.value">
+ <!-- This section used to say that rowsep and colsep have defaults based -->
+ <!-- on the frame setting. Further reflection and closer examination of the -->
+ <!-- CALS spec reveals I was mistaken. The default is "1" for rowsep and colsep. -->
+ <!-- For everything else, the default is the tgroup value -->
+ <xsl:choose>
+ <xsl:when test="$tgroup.value != ''">
+ <xsl:value-of select="$tgroup.value"/>
+ </xsl:when>
+ <xsl:when test="$attribute = 'rowsep'">1</xsl:when>
+ <xsl:when test="$attribute = 'colsep'">1</xsl:when>
+ <xsl:otherwise><!-- empty --></xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="calc.colvalue">
+ <xsl:if test="$colnum &gt; 0">
+ <xsl:call-template name="colnum.colspec">
+ <xsl:with-param name="colnum" select="$colnum"/>
+ <xsl:with-param name="attribute" select="$attribute"/>
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="$entry.value != ''">
+ <xsl:value-of select="$entry.value"/>
+ </xsl:when>
+ <xsl:when test="$row.value != ''">
+ <xsl:value-of select="$row.value"/>
+ </xsl:when>
+ <xsl:when test="$span.value != ''">
+ <xsl:value-of select="$span.value"/>
+ </xsl:when>
+ <xsl:when test="$namest.value != ''">
+ <xsl:value-of select="$namest.value"/>
+ </xsl:when>
+ <xsl:when test="$calc.colvalue != ''">
+ <xsl:value-of select="$calc.colvalue"/>
+ </xsl:when>
+ <xsl:when test="$tbody.value != ''">
+ <xsl:value-of select="$tbody.value"/>
+ </xsl:when>
+ <xsl:when test="$tgroup.value != ''">
+ <xsl:value-of select="$tgroup.value"/>
+ </xsl:when>
+ <xsl:when test="$table.value != ''">
+ <xsl:value-of select="$table.value"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$default.value"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="colnum.colspec">
+ <xsl:param name="colnum" select="0"/>
+ <xsl:param name="attribute" select="'colname'"/>
+ <xsl:param name="colspec.ancestor"
+ select="(ancestor::tgroup|ancestor::entrytbl)
+ [position() = last()]"/>
+ <xsl:param name="colspecs" select="$colspec.ancestor/colspec"/>
+ <xsl:param name="count" select="1"/>
+
+ <xsl:choose>
+ <xsl:when test="not($colspecs) or $count &gt; $colnum">
+ <!-- nop -->
+ </xsl:when>
+ <xsl:when test="$colspecs[1]/@colnum">
+ <xsl:choose>
+ <xsl:when test="$colspecs[1]/@colnum = $colnum">
+ <xsl:call-template name="get-attribute">
+ <xsl:with-param name="element" select="$colspecs[1]"/>
+ <xsl:with-param name="attribute" select="$attribute"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="colnum.colspec">
+ <xsl:with-param name="colnum" select="$colnum"/>
+ <xsl:with-param name="attribute" select="$attribute"/>
+ <xsl:with-param name="colspecs"
+ select="$colspecs[position()&gt;1]"/>
+ <xsl:with-param name="count"
+ select="$colspecs[1]/@colnum+1"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:choose>
+ <xsl:when test="$count = $colnum">
+ <xsl:call-template name="get-attribute">
+ <xsl:with-param name="element" select="$colspecs[1]"/>
+ <xsl:with-param name="attribute" select="$attribute"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="colnum.colspec">
+ <xsl:with-param name="colnum" select="$colnum"/>
+ <xsl:with-param name="attribute" select="$attribute"/>
+ <xsl:with-param name="colspecs"
+ select="$colspecs[position()&gt;1]"/>
+ <xsl:with-param name="count" select="$count+1"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="get-attribute">
+ <xsl:param name="element" select="."/>
+ <xsl:param name="attribute" select="''"/>
+
+ <xsl:for-each select="$element/@*">
+ <xsl:if test="local-name(.) = $attribute">
+ <xsl:value-of select="."/>
+ </xsl:if>
+ </xsl:for-each>
+</xsl:template>
+
+<xsl:template name="consume-row">
+ <xsl:param name="spans"/>
+
+ <xsl:if test="contains($spans,':')">
+ <xsl:value-of select="substring-before($spans,':') - 1"/>
+ <xsl:text>:</xsl:text>
+ <xsl:call-template name="consume-row">
+ <xsl:with-param name="spans" select="substring-after($spans,':')"/>
+ </xsl:call-template>
+ </xsl:if>
+</xsl:template>
+
+<!-- Returns the table style for the context element -->
+<xsl:template name="tabstyle">
+ <xsl:param name="node" select="."/>
+
+ <xsl:variable name="tgroup" select="$node/tgroup[1] |
+ $node/ancestor-or-self::tgroup[1]"/>
+
+ <xsl:variable name="table"
+ select="($node/ancestor-or-self::table |
+ $node/ancestor-or-self::informaltable)[last()]"/>
+
+ <xsl:variable name="tabstyle">
+ <xsl:choose>
+ <xsl:when test="$table/@tabstyle != ''">
+ <xsl:value-of select="normalize-space($table/@tabstyle)"/>
+ </xsl:when>
+ <xsl:when test="$tgroup/@tgroupstyle != ''">
+ <xsl:value-of select="normalize-space($tgroup/@tgroupstyle)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:value-of select="$tabstyle"/>
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/targetdatabase.dtd b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/targetdatabase.dtd
new file mode 100644
index 0000000..2ace1e0
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/targetdatabase.dtd
@@ -0,0 +1,49 @@
+<!-- targetdatabase.dtd -->
+<!-- A DTD for managing cross reference target information -->
+
+<!ELEMENT targetset (targetsetinfo?, sitemap*, document*) >
+
+<!ELEMENT targetsetinfo ANY >
+
+<!ELEMENT sitemap (dir) >
+
+<!ELEMENT dir ((dir|document)*) >
+<!ATTLIST dir
+ name CDATA #REQUIRED
+>
+
+<!ELEMENT document (div*) >
+<!ATTLIST document
+ targetdoc CDATA #REQUIRED
+ uri CDATA #IMPLIED
+ baseuri CDATA #IMPLIED
+ href CDATA #IMPLIED
+ dir CDATA #IMPLIED
+>
+
+<!ELEMENT div (ttl?, objttl?, xreftext?, (div|obj)*)>
+<!ATTLIST div
+ targetptr CDATA #IMPLIED
+ element CDATA #IMPLIED
+ name CDATA #IMPLIED
+ number CDATA #IMPLIED
+ href CDATA #IMPLIED
+ lang CDATA #IMPLIED
+ page CDATA #IMPLIED
+>
+
+
+<!ELEMENT ttl ANY >
+<!ELEMENT objttl ANY >
+<!ELEMENT xreftext ANY >
+
+<!ELEMENT obj (ttl?, objttl?, xreftext?)>
+<!ATTLIST obj
+ targetptr CDATA #IMPLIED
+ element CDATA #IMPLIED
+ name CDATA #IMPLIED
+ number CDATA #IMPLIED
+ href CDATA #IMPLIED
+ lang CDATA #IMPLIED
+ page CDATA #IMPLIED
+>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/targets.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/targets.xsl
new file mode 100644
index 0000000..294c304
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/targets.xsl
@@ -0,0 +1,333 @@
+<?xml version='1.0'?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:doc="http://nwalsh.com/xsl/documentation/1.0"
+ xmlns:exsl="http://exslt.org/common"
+ exclude-result-prefixes="doc exsl"
+ version='1.0'>
+
+<!-- ********************************************************************
+ $Id: targets.xsl 8366 2009-03-21 07:49:16Z bobstayton $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<!-- ==================================================================== -->
+
+<!-- cross reference target collection -->
+
+<doc:mode mode="collect.targets" xmlns="">
+<refpurpose>Collects information for potential cross reference targets</refpurpose>
+<refdescription id="collect.targets-desc">
+<para>Processing the root element in the
+<literal role="mode">collect.targets</literal> mode produces
+a set of target database elements that can be used by
+the olink mechanism to resolve external cross references.
+The collection process is controlled by the <literal>
+collect.xref.targets</literal> parameter, which can be
+<literal>yes</literal> to collect targets and process
+the document for output, <literal>only</literal> to
+only collect the targets, and <literal>no</literal>
+(default) to not collect the targets and only process the document.
+</para>
+<para>
+A <literal>targets.filename</literal> parameter must be
+specified to receive the output if
+<literal>collect.xref.targets</literal> is
+set to <literal>yes</literal> so as to
+redirect the target data to a file separate from the
+document output.
+</para>
+</refdescription>
+</doc:mode>
+
+<!-- ============================================================ -->
+
+<xsl:template match="*" mode="collect.targets">
+ <xsl:choose>
+ <xsl:when test="$collect.xref.targets = 'yes' and $targets.filename = ''">
+ <xsl:message>
+ Must specify a $targets.filename parameter when
+ $collect.xref.targets is set to 'yes'.
+ The xref targets were not collected.
+ </xsl:message>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:choose>
+ <xsl:when test="$targets.filename">
+ <xsl:call-template name="write.chunk">
+ <xsl:with-param name="filename" select="$targets.filename"/>
+ <xsl:with-param name="method" select="'xml'"/>
+ <xsl:with-param name="encoding" select="'utf-8'"/>
+ <xsl:with-param name="omit-xml-declaration" select="'yes'"/>
+ <xsl:with-param name="doctype-public" select="''"/>
+ <xsl:with-param name="doctype-system" select="''"/>
+ <xsl:with-param name="indent" select="'no'"/>
+ <xsl:with-param name="quiet" select="0"/>
+ <xsl:with-param name="content">
+ <xsl:apply-templates select="." mode="olink.mode"/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <!-- Else write to standard output -->
+ <xsl:apply-templates select="." mode="olink.mode"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="olink.href.target">
+ <xsl:param name="nd" select="."/>
+
+ <xsl:value-of select="$olink.base.uri"/>
+ <xsl:call-template name="href.target">
+ <xsl:with-param name="object" select="$nd"/>
+ <xsl:with-param name="context" select="NOTANODE"/>
+ </xsl:call-template>
+</xsl:template>
+
+<!-- Templates for extracting cross reference information
+ from a document for use in an xref database.
+-->
+
+<xsl:template name="attrs">
+ <xsl:param name="nd" select="."/>
+
+ <xsl:attribute name="element">
+ <xsl:value-of select="local-name(.)"/>
+ </xsl:attribute>
+
+ <xsl:attribute name="href">
+ <xsl:call-template name="olink.href.target">
+ <xsl:with-param name="nd" select="$nd"/>
+ </xsl:call-template>
+ </xsl:attribute>
+
+ <xsl:variable name="num">
+ <xsl:apply-templates select="$nd" mode="label.markup">
+ <xsl:with-param name="verbose" select="0"/>
+ </xsl:apply-templates>
+ </xsl:variable>
+
+ <xsl:if test="$num">
+ <xsl:attribute name="number">
+ <xsl:value-of select="$num"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:choose>
+ <xsl:when test="$nd/@id">
+ <xsl:attribute name="targetptr">
+ <xsl:value-of select="$nd/@id"/>
+ </xsl:attribute>
+ </xsl:when>
+ <xsl:when test="$nd/@xml:id">
+ <xsl:attribute name="targetptr">
+ <xsl:value-of select="$nd/@xml:id"/>
+ </xsl:attribute>
+ </xsl:when>
+ </xsl:choose>
+
+ <xsl:if test="$nd/@lang">
+ <xsl:attribute name="lang">
+ <xsl:value-of select="$nd/@lang"/>
+ </xsl:attribute>
+ </xsl:if>
+
+</xsl:template>
+
+<xsl:template name="div">
+ <xsl:param name="nd" select="."/>
+
+ <div>
+ <xsl:call-template name="attrs">
+ <xsl:with-param name="nd" select="$nd"/>
+ </xsl:call-template>
+ <ttl>
+ <xsl:apply-templates select="$nd" mode="title.markup">
+ <xsl:with-param name="verbose" select="0"/>
+ </xsl:apply-templates>
+ </ttl>
+ <xreftext>
+ <xsl:choose>
+ <xsl:when test="$nd/@xreflabel">
+ <xsl:call-template name="xref.xreflabel">
+ <xsl:with-param name="target" select="$nd"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="$nd" mode="xref-to">
+ <xsl:with-param name="verbose" select="0"/>
+ </xsl:apply-templates>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xreftext>
+ <xsl:apply-templates mode="olink.mode"/>
+ </div>
+</xsl:template>
+
+<xsl:template name="obj">
+ <xsl:param name="nd" select="."/>
+
+ <obj>
+ <xsl:call-template name="attrs">
+ <xsl:with-param name="nd" select="$nd"/>
+ </xsl:call-template>
+ <ttl>
+ <xsl:apply-templates select="$nd" mode="title.markup">
+ <xsl:with-param name="verbose" select="0"/>
+ </xsl:apply-templates>
+ </ttl>
+ <xreftext>
+ <xsl:choose>
+ <xsl:when test="$nd/@xreflabel">
+ <xsl:call-template name="xref.xreflabel">
+ <xsl:with-param name="target" select="$nd"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="$nd" mode="xref-to">
+ <xsl:with-param name="verbose" select="0"/>
+ </xsl:apply-templates>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xreftext>
+ </obj>
+</xsl:template>
+
+<xsl:template match="text()|processing-instruction()|comment()"
+ mode="olink.mode">
+ <!-- nop -->
+</xsl:template>
+
+<!--
+<xsl:template match="*" mode="olink.mode">
+</xsl:template>
+-->
+
+<xsl:template match="set" mode="olink.mode">
+ <xsl:call-template name="div"/>
+</xsl:template>
+
+<xsl:template match="book" mode="olink.mode">
+ <xsl:call-template name="div"/>
+</xsl:template>
+
+<xsl:template match="preface|chapter|appendix" mode="olink.mode">
+ <xsl:call-template name="div"/>
+</xsl:template>
+
+<xsl:template match="part|reference" mode="olink.mode">
+ <xsl:call-template name="div"/>
+</xsl:template>
+
+<xsl:template match="article" mode="olink.mode">
+ <xsl:call-template name="div"/>
+</xsl:template>
+
+<xsl:template match="bibliography|bibliodiv" mode="olink.mode">
+ <xsl:call-template name="div"/>
+</xsl:template>
+
+<xsl:template match="biblioentry|bibliomixed" mode="olink.mode">
+ <xsl:call-template name="obj"/>
+</xsl:template>
+
+<xsl:template match="refentry" mode="olink.mode">
+ <xsl:call-template name="div"/>
+</xsl:template>
+
+<xsl:template match="section|sect1|sect2|sect3|sect4|sect5" mode="olink.mode">
+ <xsl:call-template name="div"/>
+</xsl:template>
+
+<xsl:template match="refsection|refsect1|refsect2|refsect3" mode="olink.mode">
+ <xsl:call-template name="div"/>
+</xsl:template>
+
+<xsl:template match="figure|example|table" mode="olink.mode">
+ <xsl:call-template name="obj"/>
+ <xsl:apply-templates mode="olink.mode"/>
+</xsl:template>
+
+<xsl:template match="equation[title or info/title]" mode="olink.mode">
+ <xsl:call-template name="obj"/>
+</xsl:template>
+
+<xsl:template match="qandaset|qandaentry" mode="olink.mode">
+ <xsl:call-template name="div"/>
+</xsl:template>
+
+<!-- handle an glossary collection -->
+<xsl:template match="glossary[@role='auto']" mode="olink.mode" priority="2">
+ <xsl:variable name="collection" select="document($glossary.collection, .)"/>
+ <xsl:if test="$glossary.collection = ''">
+ <xsl:message>
+ <xsl:text>Warning: processing automatic glossary </xsl:text>
+ <xsl:text>without a glossary.collection file.</xsl:text>
+ </xsl:message>
+ </xsl:if>
+
+ <xsl:if test="not($collection) and $glossary.collection != ''">
+ <xsl:message>
+ <xsl:text>Warning: processing automatic glossary but unable to </xsl:text>
+ <xsl:text>open glossary.collection file '</xsl:text>
+ <xsl:value-of select="$glossary.collection"/>
+ <xsl:text>'</xsl:text>
+ </xsl:message>
+ </xsl:if>
+
+
+ <xsl:if test="$exsl.node.set.available != 0">
+ <xsl:variable name="auto.glossary">
+ <xsl:apply-templates select="." mode="assemble.auto.glossary"/>
+ </xsl:variable>
+ <xsl:variable name="auto.glossary.nodeset" select="exsl:node-set($auto.glossary)"/>
+ <xsl:apply-templates select="$auto.glossary.nodeset/*" mode="olink.mode"/>
+ </xsl:if>
+
+</xsl:template>
+
+<!-- construct a glossary in memory -->
+<xsl:template match="glossary" mode="assemble.auto.glossary">
+ <xsl:copy>
+ <xsl:copy-of select="@*[not(local-name() = 'role')]"/>
+ <xsl:apply-templates select="node()" mode="assemble.auto.glossary"/>
+ <xsl:call-template name="select.glossentries"/>
+ </xsl:copy>
+</xsl:template>
+
+<xsl:template name="select.glossentries">
+ <xsl:param name="collection" select="document($glossary.collection, .)"/>
+ <xsl:param name="terms" select="//glossterm[not(parent::glossdef)]|//firstterm"/>
+
+ <xsl:for-each select="$collection//glossentry">
+ <xsl:variable name="cterm" select="glossterm"/>
+ <xsl:if test="$terms[@baseform = $cterm or . = $cterm]">
+ <xsl:copy-of select="."/>
+ </xsl:if>
+ </xsl:for-each>
+</xsl:template>
+
+<xsl:template match="glossentry" mode="assemble.auto.glossary">
+ <!-- skip the dummy entries -->
+</xsl:template>
+
+<xsl:template match="*" mode="assemble.auto.glossary">
+ <!-- pass through any titles and intro stuff -->
+ <xsl:copy-of select="."/>
+</xsl:template>
+
+<xsl:template match="*" mode="olink.mode">
+ <xsl:if test="@id or @xml:id">
+ <xsl:call-template name="obj"/>
+ </xsl:if>
+ <xsl:apply-templates mode="olink.mode"/>
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/te.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/te.xml
new file mode 100644
index 0000000..c912fc2
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/te.xml
@@ -0,0 +1,660 @@
+<?xml version="1.0" encoding="utf-8"?>
+<l:l10n xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0" language="te" english-language-name="Telugu">
+
+<!-- * This file is generated automatically. -->
+<!-- * To submit changes to this file upstream (to the DocBook Project) -->
+<!-- * do not submit an edited version of this file. Instead, submit an -->
+<!-- * edited version of the source file at the following location: -->
+<!-- * -->
+<!-- * https://docbook.svn.sourceforge.net/svnroot/docbook/trunk/gentext/locale/te.xml -->
+<!-- * -->
+<!-- * E-mail the edited te.xml source file to: -->
+<!-- * -->
+<!-- * docbook-developers@lists.sourceforge.net -->
+
+<!-- ******************************************************************** -->
+
+<!-- This file is part of the XSL DocBook Stylesheet distribution. -->
+<!-- See ../README or http://docbook.sf.net/release/xsl/current/ for -->
+<!-- copyright and other information. -->
+
+<!-- ******************************************************************** -->
+<!-- In these files, % with a letter is used for a placeholder: -->
+<!-- %t is the current element's title -->
+<!-- %s is the current element's subtitle (if applicable)-->
+<!-- %n is the current element's number label-->
+<!-- %p is the current element's page number (if applicable)-->
+<!-- ******************************************************************** -->
+
+
+<l:gentext key="Abstract" text="సంకà±à°·à°¿à°ªà±à°¤à°®à±"/>
+<l:gentext key="abstract" text="సంకà±à°·à°¿à°ªà±à°¤à°®à±"/>
+<l:gentext key="Acknowledgements" text="à°—à±à°°à±à°¤à°¿à°‚à°ªà±à°²à±"/>
+<l:gentext key="acknowledgements" text="à°—à±à°°à±à°¤à°¿à°‚à°ªà±à°²à±"/>
+<l:gentext key="Answer" text="సమాధానం:"/>
+<l:gentext key="answer" text="సమాధానం:"/>
+<l:gentext key="Appendix" text="à°…à°¨à±à°¬à°‚ధం"/>
+<l:gentext key="appendix" text="à°…à°¨à±à°¬à°‚ధం"/>
+<l:gentext key="Article" text="à°ªà±à°°à°•à°°à°£à°®à±"/>
+<l:gentext key="article" text="à°ªà±à°°à°•à°°à°£à°®à±"/>
+<l:gentext key="Author" text="à°—à±à°°à°‚ధకరà±à°¤"/>
+<l:gentext key="Bibliography" text="à°—à±à°°à°‚à°§ పటà±à°Ÿà°¿à°•"/>
+<l:gentext key="bibliography" text="à°—à±à°°à°‚à°§ పటà±à°Ÿà°¿à°•"/>
+<l:gentext key="Book" text="à°ªà±à°¸à±à°¤à°•à°®à±"/>
+<l:gentext key="book" text="à°ªà±à°¸à±à°¤à°•à°®à±"/>
+<l:gentext key="CAUTION" text="à°®à±à°‚à°¦à±à°œà°¾à°—à±à°°à°¤à±à°¤"/>
+<l:gentext key="Caution" text="à°®à±à°‚à°¦à±à°œà°¾à°—à±à°°à°¤à±à°¤"/>
+<l:gentext key="caution" text="à°®à±à°‚à°¦à±à°œà°¾à°—à±à°°à°¤à±à°¤"/>
+<l:gentext key="Chapter" text="à°…à°§à±à°¯à°¾à°¯à°®à±"/>
+<l:gentext key="chapter" text="à°…à°§à±à°¯à°¾à°¯à°®à±"/>
+<l:gentext key="Colophon" text="చివరిమాట"/>
+<l:gentext key="colophon" text="చివరిమాట"/>
+<l:gentext key="Copyright" text="కాపీరైటà±"/>
+<l:gentext key="copyright" text="కాపీరైటà±"/>
+<l:gentext key="Dedication" text="అంకితం"/>
+<l:gentext key="dedication" text="అంకితం"/>
+<l:gentext key="Edition" text="సంచిక"/>
+<l:gentext key="edition" text="సంచిక"/>
+<l:gentext key="Editor" text="సంపాదకà±à°¡à±"/>
+<l:gentext key="Equation" text="సమీకరణమà±"/>
+<l:gentext key="equation" text="సమీకరణమà±"/>
+<l:gentext key="Example" text="ఉదాహరణ"/>
+<l:gentext key="example" text="ఉదాహరణ"/>
+<l:gentext key="Figure" text="మూరà±à°¤à°¿"/>
+<l:gentext key="figure" text="మూరà±à°¤à°¿"/>
+<l:gentext key="Glossary" text="పదకోశం"/>
+<l:gentext key="glossary" text="పదకోశం"/>
+<l:gentext key="GlossSee" text="చూడà±à°®à±"/>
+<l:gentext key="glosssee" text="చూడà±à°®à±"/>
+<l:gentext key="GlossSeeAlso" text="ఇదికూడా చూడà±à°®à±"/>
+<l:gentext key="glossseealso" text="ఇదికూడా చూడà±à°®à±"/>
+<l:gentext key="IMPORTANT" text="à°®à±à°–à±à°¯à°®à±ˆà°¨"/>
+<l:gentext key="important" text="à°®à±à°–à±à°¯à°®à±ˆà°¨"/>
+<l:gentext key="Important" text="à°®à±à°–à±à°¯à°®à±ˆà°¨"/>
+<l:gentext key="Index" text="విషయసూచిక"/>
+<l:gentext key="index" text="విషయసూచిక"/>
+<l:gentext key="ISBN" text="ISBN"/>
+<l:gentext key="isbn" text="ISBN"/>
+<l:gentext key="LegalNotice" text="à°šà°Ÿà±à°Ÿà°¬à°¦à±à°¦ నోటీసà±"/>
+<l:gentext key="legalnotice" text="à°šà°Ÿà±à°Ÿà°¬à°¦à±à°¦ నోటీసà±"/>
+<l:gentext key="MsgAud" text="à°ªà±à°°à±‡à°•à±à°·à°•à±à°²à±"/>
+<l:gentext key="msgaud" text="à°ªà±à°°à±‡à°•à±à°·à°•à±à°²à±"/>
+<l:gentext key="MsgLevel" text="à°¸à±à°¥à°¾à°¯à°¿"/>
+<l:gentext key="msglevel" text="à°¸à±à°¥à°¾à°¯à°¿"/>
+<l:gentext key="MsgOrig" text="మూలమà±"/>
+<l:gentext key="msgorig" text="మూలమà±"/>
+<l:gentext key="NOTE" text="గమనిక"/>
+<l:gentext key="Note" text="గమనిక"/>
+<l:gentext key="note" text="గమనిక"/>
+<l:gentext key="Part" text="భాగమà±"/>
+<l:gentext key="part" text="భాగమà±"/>
+<l:gentext key="Preface" text="à°®à±à°‚à°¦à±à°®à°¾à°Ÿ"/>
+<l:gentext key="preface" text="à°®à±à°‚à°¦à±à°®à°¾à°Ÿ"/>
+<l:gentext key="Procedure" text="పదà±à°§à°¤à°¿"/>
+<l:gentext key="procedure" text="పదà±à°§à°¤à°¿"/>
+<l:gentext key="ProductionSet" text="ఉతà±à°ªà°¤à±à°¤à°¿"/>
+<l:gentext key="PubDate" text="à°ªà±à°°à°šà±à°°à°£ తేది"/>
+<l:gentext key="pubdate" text="à°ªà±à°°à°šà±à°°à°£ తేది"/>
+<l:gentext key="Published" text="à°ªà±à°°à°šà±à°°à°¿à°¤à°®à±ˆà°‚ది"/>
+<l:gentext key="published" text="à°ªà±à°°à°šà±à°°à°¿à°¤à°®à±ˆà°‚ది"/>
+<l:gentext key="Publisher" text="à°ªà±à°°à°šà±à°°à°£à°•à°°à±à°¤"/>
+<l:gentext key="Qandadiv" text="à°ªà±à°°à°¶à±à°¨à°²à± &amp; సమాధానమà±à°²à±"/>
+<l:gentext key="qandadiv" text="à°ªà±à°°à°¶à±à°¨à°²à± &amp; సమాధానమà±à°²à±"/>
+<l:gentext key="QandASet" text="తరచà±à°—à°¾ à°…à°¡à±à°—à± à°ªà±à°°à°¶à±à°¨à°²à±"/>
+<l:gentext key="Question" text="à°ªà±à°°à°¶à±à°¨:"/>
+<l:gentext key="question" text="à°ªà±à°°à°¶à±à°¨:"/>
+<l:gentext key="RefEntry" text="పేజీ"/>
+<l:gentext key="refentry" text="పేజీ"/>
+<l:gentext key="Reference" text="సంభందిత"/>
+<l:gentext key="reference" text="సంభందిత"/>
+<l:gentext key="References" text="సంభందితమà±à°²à±"/>
+<l:gentext key="RefName" text="నామమà±"/>
+<l:gentext key="refname" text="నామమà±"/>
+<l:gentext key="RefSection" text="విభాగమà±"/>
+<l:gentext key="refsection" text="విభాగమà±"/>
+<l:gentext key="RefSynopsisDiv" text="à°®à±à°–à±à°¯à°µà°¿à°·à°¯à°¸à±‚à°šà°¿à°•"/>
+<l:gentext key="refsynopsisdiv" text="à°®à±à°–à±à°¯à°µà°¿à°·à°¯à°¸à±‚à°šà°¿à°•"/>
+<l:gentext key="RevHistory" text="à°ªà±à°¨à°ƒà°ªà°°à°¿à°¶à±€à°²à°¨ à°šà°°à°¿à°¤à±à°°"/>
+<l:gentext key="revhistory" text="à°ªà±à°¨à°ƒà°ªà°°à°¿à°¶à±€à°²à°¨ à°šà°°à°¿à°¤à±à°°"/>
+<l:gentext key="revision" text="à°ªà±à°¨à°ƒà°ªà°°à°¿à°¶à±€à°²à°¨"/>
+<l:gentext key="Revision" text="à°ªà±à°¨à°ƒà°ªà°°à°¿à°¶à±€à°²à°¨"/>
+<l:gentext key="sect1" text="విభాగమà±"/>
+<l:gentext key="sect2" text="విభాగమà±"/>
+<l:gentext key="sect3" text="విభాగమà±"/>
+<l:gentext key="sect4" text="విభాగమà±"/>
+<l:gentext key="sect5" text="విభాగమà±"/>
+<l:gentext key="section" text="విభాగమà±"/>
+<l:gentext key="Section" text="విభాగమà±"/>
+<l:gentext key="see" text="చూడà±à°®à±"/>
+<l:gentext key="See" text="చూడà±à°®à±"/>
+<l:gentext key="seealso" text="ఇదికూడా చూడà±à°®à±"/>
+<l:gentext key="Seealso" text="ఇదికూడా చూడà±à°®à±"/>
+<l:gentext key="SeeAlso" text="ఇదికూడా చూడà±à°®à±"/>
+<l:gentext key="set" text="సమితి"/>
+<l:gentext key="Set" text="సమితి"/>
+<l:gentext key="setindex" text="సమితి విషయసూచిక"/>
+<l:gentext key="SetIndex" text="సమితి విషయసూచిక"/>
+<l:gentext key="Sidebar" text="à°ªà±à°°à°•à±à°•à°ªà°Ÿà±à°Ÿà±€"/>
+<l:gentext key="sidebar" text="à°ªà±à°°à°•à±à°•à°ªà°Ÿà±à°Ÿà±€"/>
+<l:gentext key="step" text="అంచె"/>
+<l:gentext key="Step" text="అంచె"/>
+<l:gentext key="table" text="పటà±à°Ÿà°¿à°•"/>
+<l:gentext key="Table" text="పటà±à°Ÿà°¿à°•"/>
+<l:gentext key="task" text="à°•à°°à±à°¤à°µà±à°¯à°®à±"/>
+<l:gentext key="Task" text="à°•à°°à±à°¤à°µà±à°¯à°®à±"/>
+<l:gentext key="tip" text="à°šà°¿à°Ÿà±à°•à°¾"/>
+<l:gentext key="TIP" text="à°šà°¿à°Ÿà±à°•à°¾"/>
+<l:gentext key="Tip" text="à°šà°¿à°Ÿà±à°•à°¾"/>
+<l:gentext key="Warning" text="హెచà±à°šà°°à°¿à°•"/>
+<l:gentext key="warning" text="హెచà±à°šà°°à°¿à°•"/>
+<l:gentext key="WARNING" text="హెచà±à°šà°°à°¿à°•"/>
+<l:gentext key="and" text="మరియà±"/>
+<l:gentext key="by" text="వీరిచేత"/>
+<l:gentext key="Edited" text="సరికూరà±à°šà°¿à°¨"/>
+<l:gentext key="edited" text="సరికూరà±à°šà°¿à°¨"/>
+<l:gentext key="Editedby" text="వీరిచేత సరికూరà±à°šà°¬à°¡à°¿à°‚ది"/>
+<l:gentext key="editedby" text="వీరిచేత సరికూరà±à°šà°¬à°¡à°¿à°‚ది"/>
+<l:gentext key="in" text="నందà±"/>
+<l:gentext key="lastlistcomma" text=","/>
+<l:gentext key="listcomma" text=","/>
+<l:gentext key="notes" text="గమనికలà±"/>
+<l:gentext key="Notes" text="గమనికలà±"/>
+<l:gentext key="Pgs" text="పేజీలà±"/>
+<l:gentext key="pgs" text="పేజీలà±"/>
+<l:gentext key="Revisedby" text="వీరిచేత à°ªà±à°¨à°ƒà°ªà°°à°¿à°¶à±€à°²à°¿à°‚చబడింది: "/>
+<l:gentext key="revisedby" text="వీరిచేత à°ªà±à°¨à°ƒà°ªà°°à°¿à°¶à±€à°²à°¿à°‚చబడింది: "/>
+<l:gentext key="TableNotes" text="గమనికలà±"/>
+<l:gentext key="tablenotes" text="గమనికలà±"/>
+<l:gentext key="TableofContents" text="సారమà±à°² పటà±à°Ÿà°¿à°•"/>
+<l:gentext key="tableofcontents" text="సారమà±à°² పటà±à°Ÿà°¿à°•"/>
+<l:gentext key="unexpectedelementname" text="à°…à°¨à±à°•à±‹à°¨à°¿ మూలకం నామమà±"/>
+<l:gentext key="unsupported" text="మదà±à°¦à°¤à±€à°¯à°¨à°¿"/>
+<l:gentext key="xrefto" text="xref"/>
+<l:gentext key="Authors" text="à°—à±à°°à°‚à°§ à°•à°°à±à°¤à°²à±"/>
+<l:gentext key="copyeditor" text="కాపీ సంపాదకà±à°¡à±"/>
+<l:gentext key="graphicdesigner" text="à°—à±à°°à°¾à°«à°¿à°•à± రూపకరà±à°¤"/>
+<l:gentext key="productioneditor" text="ఉతà±à°ªà°¤à±à°¤à°¿ సంపాదకà±à°¡à±"/>
+<l:gentext key="technicaleditor" text="సాంకేతిక సంపాదకà±à°¡à±"/>
+<l:gentext key="translator" text="à°…à°¨à±à°µà°¾à°¦à°•à±à°¡à±"/>
+<l:gentext key="listofequations" text="సమీకరణమà±à°² జాబితా"/>
+<l:gentext key="ListofEquations" text="సమీకరణమà±à°² జాబితా"/>
+<l:gentext key="ListofExamples" text="ఉదాహరణమà±à°² జాబితా"/>
+<l:gentext key="listofexamples" text="ఉదాహరణమà±à°² జాబితా"/>
+<l:gentext key="ListofFigures" text="మూరà±à°¤à±à°² జాబితా"/>
+<l:gentext key="listoffigures" text="మూరà±à°¤à±à°² జాబితా"/>
+<l:gentext key="ListofProcedures" text="పదà±à°§à°¤à±à°² జాబితా"/>
+<l:gentext key="listofprocedures" text="పదà±à°§à°¤à±à°² జాబితా"/>
+<l:gentext key="listoftables" text="పటà±à°Ÿà°¿à°•à°² జాబితా"/>
+<l:gentext key="ListofTables" text="పటà±à°Ÿà°¿à°•à°² జాబితా"/>
+<l:gentext key="ListofUnknown" text="తెలియనివాటి జాబితా"/>
+<l:gentext key="listofunknown" text="తెలియనివాటి జాబితా"/>
+<l:gentext key="nav-home" text="నివాసమà±"/>
+<l:gentext key="nav-next" text="తరà±à°µà°¾à°¤à°¿"/>
+<l:gentext key="nav-next-sibling" text="à°®à±à°‚à°¦à±à°•à± నడà±à°ªà±"/>
+<l:gentext key="nav-prev" text="à°®à±à°‚దరి"/>
+<l:gentext key="nav-prev-sibling" text="వెనà±à°•à°•à± నడà±à°ªà±"/>
+<l:gentext key="nav-up" text="పైనకà±"/>
+<l:gentext key="nav-toc" text="వివరమà±à°² పటà±à°Ÿà°¿à°•"/>
+<l:gentext key="Draft" text="à°®à±à°¸à°¾à°¯à°¿à°¦à°¾"/>
+<l:gentext key="above" text="పైన"/>
+<l:gentext key="below" text="à°•à±à°°à°¿à°‚ది"/>
+<l:gentext key="sectioncalled" text="à°† విభాగమౠపిలà±à°µà°¬à°¡à±à°¤à±à°‚ది"/>
+<l:gentext key="index symbols" text="à°šà°¿à°¹à±à°¨à°®à±à°²à±"/>
+<l:gentext key="writing-mode" text="lr-tb"/>
+<l:gentext key="lowercase.alpha" text="abcdefghijklmnopqrstuvwxyz"/>
+<l:gentext key="uppercase.alpha" text="ABCDEFGHIJKLMNOPQRSTUVWXYZ"/>
+<l:gentext key="normalize.sort.input" text="AaÀàÃáÂâÃãÄäÅåĀÄĂ㥹ÇǎǞǟǠǡǺǻȀÈȂȃȦȧḀá¸áºšáº áº¡áº¢áº£áº¤áº¥áº¦áº§áº¨áº©áºªáº«áº¬áº­áº®áº¯áº°áº±áº²áº³áº´áºµáº¶áº·BbÆ€ÆɓƂƃḂḃḄḅḆḇCcÇçĆćĈĉĊċČÄƇƈɕḈḉDdÄŽÄÄđƊɗƋƌDžDzȡɖḊḋḌá¸á¸Žá¸á¸á¸‘ḒḓEeÈèÉéÊêËëĒēĔĕĖėĘęĚěȄȅȆȇȨȩḔḕḖḗḘḙḚḛḜá¸áº¸áº¹áººáº»áº¼áº½áº¾áº¿á»€á»á»‚ểỄễỆệFfƑƒḞḟGgÄœÄĞğĠġĢģƓɠǤǥǦǧǴǵḠḡHhĤĥĦħȞȟɦḢḣḤḥḦḧḨḩḪḫẖIiÌìÃíÎîÃïĨĩĪīĬĭĮįİƗɨÇÇȈȉȊȋḬḭḮḯỈỉỊịJjĴĵǰÊKkĶķƘƙǨǩḰḱḲḳḴḵLlĹĺĻļĽľĿŀÅłƚLjȴɫɬɭḶḷḸḹḺḻḼḽMmɱḾḿṀá¹á¹‚ṃNnÑñŃńŅņŇňÆɲƞȠNjǸǹȵɳṄṅṆṇṈṉṊṋOoÒòÓóÔôÕõÖöØøŌÅÅŽÅÅőƟƠơǑǒǪǫǬǭǾǿȌÈÈŽÈȪȫȬȭȮȯȰȱṌá¹á¹Žá¹á¹á¹‘ṒṓỌá»á»Žá»á»á»‘ỒồỔổỖỗỘộỚớỜá»á»žá»Ÿá» á»¡á»¢á»£PpƤƥṔṕṖṗQqÊ RrŔŕŖŗŘřÈȑȒȓɼɽɾṘṙṚṛṜá¹á¹žá¹ŸSsŚśŜÅŞşŠšȘșʂṠṡṢṣṤṥṦṧṨṩTtŢţŤťŦŧƫƬƭƮʈȚțȶṪṫṬṭṮṯṰṱẗUuÙùÚúÛûÜüŨũŪūŬŭŮůŰűŲųƯưǓǔǕǖǗǘǙǚǛǜȔȕȖȗṲṳṴṵṶṷṸṹṺṻỤụỦủỨứỪừỬửỮữỰựVvƲʋṼṽṾṿWwŴŵẀáºáº‚ẃẄẅẆẇẈẉẘXxẊẋẌáºYyÃýÿŸŶŷƳƴȲȳẎáºáº™á»²á»³á»´á»µá»¶á»·á»¸á»¹ZzŹźŻżŽžƵƶȤȥÊÊ‘áºáº‘ẒẓẔẕẕ" lang="en"/>
+<l:gentext key="normalize.sort.output" text="AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBCCCCCCCCCCCCCCCCCDDDDDDDDDDDDDDDDDDDDDDDDEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEFFFFFFGGGGGGGGGGGGGGGGGGGGHHHHHHHHHHHHHHHHHHHHIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIJJJJJJKKKKKKKKKKKKKKLLLLLLLLLLLLLLLLLLLLLLLLLLMMMMMMMMMNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOPPPPPPPPQQQRRRRRRRRRRRRRRRRRRRRRRRSSSSSSSSSSSSSSSSSSSSSSSTTTTTTTTTTTTTTTTTTTTTTTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUVVVVVVVVWWWWWWWWWWWWWWWXXXXXXYYYYYYYYYYYYYYYYYYYYYYYZZZZZZZZZZZZZZZZZZZZZ" lang="en"/>
+<l:dingbat key="startquote" text="“"/>
+<l:dingbat key="endquote" text="â€"/>
+<l:dingbat key="nestedstartquote" text="‘"/>
+<l:dingbat key="nestedendquote" text="’"/>
+<l:dingbat key="singlestartquote" text="‘"/>
+<l:dingbat key="singleendquote" text="’"/>
+<l:dingbat key="bullet" text="•"/>
+<l:gentext key="hyphenation-character" text="-"/>
+<l:gentext key="hyphenation-push-character-count" text="2"/>
+<l:gentext key="hyphenation-remain-character-count" text="2"/>
+<l:context name="styles"><l:template name="person-name" text="first-last"/>
+</l:context>
+<l:context name="title"><l:template name="abstract" text="%t"/>
+<l:template name="acknowledgements" text="%t"/>
+<l:template name="answer" text="%t"/>
+<l:template name="appendix" text="à°…à°¨à±à°¬à°‚ధం %n. %t"/>
+<l:template name="article" text="%t"/>
+<l:template name="authorblurb" text="%t"/>
+<l:template name="bibliodiv" text="%t"/>
+<l:template name="biblioentry" text="%t"/>
+<l:template name="bibliography" text="%t"/>
+<l:template name="bibliolist" text="%t"/>
+<l:template name="bibliomixed" text="%t"/>
+<l:template name="bibliomset" text="%t"/>
+<l:template name="biblioset" text="%t"/>
+<l:template name="blockquote" text="%t"/>
+<l:template name="book" text="%t"/>
+<l:template name="calloutlist" text="%t"/>
+<l:template name="caution" text="%t"/>
+<l:template name="chapter" text="à°…à°§à±à°¯à°¾à°¯à°®à±Â %n. %t"/>
+<l:template name="colophon" text="%t"/>
+<l:template name="dedication" text="%t"/>
+<l:template name="equation" text="సమీకరణమà±Â %n. %t"/>
+<l:template name="example" text="ఉదాహరణ %n. %t"/>
+<l:template name="figure" text="మూరà±à°¤à°¿Â %n. %t"/>
+<l:template name="foil" text="%t"/>
+<l:template name="foilgroup" text="%t"/>
+<l:template name="formalpara" text="%t"/>
+<l:template name="glossary" text="%t"/>
+<l:template name="glossdiv" text="%t"/>
+<l:template name="glosslist" text="%t"/>
+<l:template name="glossentry" text="%t"/>
+<l:template name="important" text="%t"/>
+<l:template name="index" text="%t"/>
+<l:template name="indexdiv" text="%t"/>
+<l:template name="itemizedlist" text="%t"/>
+<l:template name="legalnotice" text="%t"/>
+<l:template name="listitem" text=""/>
+<l:template name="lot" text="%t"/>
+<l:template name="msg" text="%t"/>
+<l:template name="msgexplan" text="%t"/>
+<l:template name="msgmain" text="%t"/>
+<l:template name="msgrel" text="%t"/>
+<l:template name="msgset" text="%t"/>
+<l:template name="msgsub" text="%t"/>
+<l:template name="note" text="%t"/>
+<l:template name="orderedlist" text="%t"/>
+<l:template name="part" text="భాగమà±Â %n. %t"/>
+<l:template name="partintro" text="%t"/>
+<l:template name="preface" text="%t"/>
+<l:template name="procedure" text="%t"/>
+<l:template name="procedure.formal" text="పదà±à°§à°¤à°¿Â %n. %t"/>
+<l:template name="productionset" text="%t"/>
+<l:template name="productionset.formal" text="ఉతà±à°ªà°¤à±à°¤à°¿Â %n"/>
+<l:template name="qandadiv" text="%t"/>
+<l:template name="qandaentry" text="%t"/>
+<l:template name="qandaset" text="%t"/>
+<l:template name="question" text="%t"/>
+<l:template name="refentry" text="%t"/>
+<l:template name="reference" text="%t"/>
+<l:template name="refsection" text="%t"/>
+<l:template name="refsect1" text="%t"/>
+<l:template name="refsect2" text="%t"/>
+<l:template name="refsect3" text="%t"/>
+<l:template name="refsynopsisdiv" text="%t"/>
+<l:template name="refsynopsisdivinfo" text="%t"/>
+<l:template name="segmentedlist" text="%t"/>
+<l:template name="set" text="%t"/>
+<l:template name="setindex" text="%t"/>
+<l:template name="sidebar" text="%t"/>
+<l:template name="step" text="%t"/>
+<l:template name="table" text="పటà±à°Ÿà°¿à°•Â %n. %t"/>
+<l:template name="task" text="%t"/>
+<l:template name="tasksummary" text="%t"/>
+<l:template name="taskprerequisites" text="%t"/>
+<l:template name="taskrelated" text="%t"/>
+<l:template name="tip" text="%t"/>
+<l:template name="toc" text="%t"/>
+<l:template name="variablelist" text="%t"/>
+<l:template name="varlistentry" text=""/>
+<l:template name="warning" text="%t"/>
+</l:context>
+<l:context name="title-unnumbered"><l:template name="appendix" text="%t"/>
+<l:template name="article/appendix" text="%t"/>
+<l:template name="bridgehead" text="%t"/>
+<l:template name="chapter" text="%t"/>
+<l:template name="sect1" text="%t"/>
+<l:template name="sect2" text="%t"/>
+<l:template name="sect3" text="%t"/>
+<l:template name="sect4" text="%t"/>
+<l:template name="sect5" text="%t"/>
+<l:template name="section" text="%t"/>
+<l:template name="simplesect" text="%t"/>
+<l:template name="part" text="%t"/>
+</l:context>
+<l:context name="title-numbered"><l:template name="appendix" text="à°…à°¨à±à°¬à°‚ధం %n. %t"/>
+<l:template name="article/appendix" text="%n. %t"/>
+<l:template name="bridgehead" text="%n. %t"/>
+<l:template name="chapter" text="à°…à°§à±à°¯à°¾à°¯à°®à±Â %n. %t"/>
+<l:template name="part" text="భాగమà±Â %n. %t"/>
+<l:template name="sect1" text="%n. %t"/>
+<l:template name="sect2" text="%n. %t"/>
+<l:template name="sect3" text="%n. %t"/>
+<l:template name="sect4" text="%n. %t"/>
+<l:template name="sect5" text="%n. %t"/>
+<l:template name="section" text="%n. %t"/>
+<l:template name="simplesect" text="%t"/>
+</l:context>
+<l:context name="subtitle"><l:template name="appendix" text="%s"/>
+<l:template name="acknowledgements" text="%s"/>
+<l:template name="article" text="%s"/>
+<l:template name="bibliodiv" text="%s"/>
+<l:template name="biblioentry" text="%s"/>
+<l:template name="bibliography" text="%s"/>
+<l:template name="bibliomixed" text="%s"/>
+<l:template name="bibliomset" text="%s"/>
+<l:template name="biblioset" text="%s"/>
+<l:template name="book" text="%s"/>
+<l:template name="chapter" text="%s"/>
+<l:template name="colophon" text="%s"/>
+<l:template name="dedication" text="%s"/>
+<l:template name="glossary" text="%s"/>
+<l:template name="glossdiv" text="%s"/>
+<l:template name="index" text="%s"/>
+<l:template name="indexdiv" text="%s"/>
+<l:template name="lot" text="%s"/>
+<l:template name="part" text="%s"/>
+<l:template name="partintro" text="%s"/>
+<l:template name="preface" text="%s"/>
+<l:template name="refentry" text="%s"/>
+<l:template name="reference" text="%s"/>
+<l:template name="refsection" text="%s"/>
+<l:template name="refsect1" text="%s"/>
+<l:template name="refsect2" text="%s"/>
+<l:template name="refsect3" text="%s"/>
+<l:template name="refsynopsisdiv" text="%s"/>
+<l:template name="sect1" text="%s"/>
+<l:template name="sect2" text="%s"/>
+<l:template name="sect3" text="%s"/>
+<l:template name="sect4" text="%s"/>
+<l:template name="sect5" text="%s"/>
+<l:template name="section" text="%s"/>
+<l:template name="set" text="%s"/>
+<l:template name="setindex" text="%s"/>
+<l:template name="sidebar" text="%s"/>
+<l:template name="simplesect" text="%s"/>
+<l:template name="toc" text="%s"/>
+</l:context>
+<l:context name="xref"><l:template name="abstract" text="%t"/>
+<l:template name="acknowledgements" text="%t"/>
+<l:template name="answer" text="సమాధానం: %n"/>
+<l:template name="appendix" text="%t"/>
+<l:template name="article" text="%t"/>
+<l:template name="authorblurb" text="%t"/>
+<l:template name="bibliodiv" text="%t"/>
+<l:template name="bibliography" text="%t"/>
+<l:template name="bibliomset" text="%t"/>
+<l:template name="biblioset" text="%t"/>
+<l:template name="blockquote" text="%t"/>
+<l:template name="book" text="%t"/>
+<l:template name="calloutlist" text="%t"/>
+<l:template name="caution" text="%t"/>
+<l:template name="chapter" text="%t"/>
+<l:template name="colophon" text="%t"/>
+<l:template name="constraintdef" text="%t"/>
+<l:template name="dedication" text="%t"/>
+<l:template name="equation" text="%t"/>
+<l:template name="example" text="%t"/>
+<l:template name="figure" text="%t"/>
+<l:template name="foil" text="%t"/>
+<l:template name="foilgroup" text="%t"/>
+<l:template name="formalpara" text="%t"/>
+<l:template name="glossary" text="%t"/>
+<l:template name="glossdiv" text="%t"/>
+<l:template name="important" text="%t"/>
+<l:template name="index" text="%t"/>
+<l:template name="indexdiv" text="%t"/>
+<l:template name="itemizedlist" text="%t"/>
+<l:template name="legalnotice" text="%t"/>
+<l:template name="listitem" text="%n"/>
+<l:template name="lot" text="%t"/>
+<l:template name="msg" text="%t"/>
+<l:template name="msgexplan" text="%t"/>
+<l:template name="msgmain" text="%t"/>
+<l:template name="msgrel" text="%t"/>
+<l:template name="msgset" text="%t"/>
+<l:template name="msgsub" text="%t"/>
+<l:template name="note" text="%t"/>
+<l:template name="orderedlist" text="%t"/>
+<l:template name="part" text="%t"/>
+<l:template name="partintro" text="%t"/>
+<l:template name="preface" text="%t"/>
+<l:template name="procedure" text="%t"/>
+<l:template name="productionset" text="%t"/>
+<l:template name="qandadiv" text="%t"/>
+<l:template name="qandaentry" text="à°ªà±à°°à°¶à±à°¨: %n"/>
+<l:template name="qandaset" text="%t"/>
+<l:template name="question" text="à°ªà±à°°à°¶à±à°¨: %n"/>
+<l:template name="reference" text="%t"/>
+<l:template name="refsynopsisdiv" text="%t"/>
+<l:template name="segmentedlist" text="%t"/>
+<l:template name="set" text="%t"/>
+<l:template name="setindex" text="%t"/>
+<l:template name="sidebar" text="%t"/>
+<l:template name="table" text="%t"/>
+<l:template name="task" text="%t"/>
+<l:template name="tip" text="%t"/>
+<l:template name="toc" text="%t"/>
+<l:template name="variablelist" text="%t"/>
+<l:template name="varlistentry" text="%n"/>
+<l:template name="warning" text="%t"/>
+<l:template name="olink.document.citation" text=" in %o"/>
+<l:template name="olink.page.citation" text=" (page %p)"/>
+<l:template name="page.citation" text=" [%p]"/>
+<l:template name="page" text="(page %p)"/>
+<l:template name="docname" text=" in %o"/>
+<l:template name="docnamelong" text=" in the document titled %o"/>
+<l:template name="pageabbrev" text="(p. %p)"/>
+<l:template name="Page" text="Page %p"/>
+<l:template name="bridgehead" text="à°† విభాగమౠపిలà±à°µà°¬à°¡à±à°¤à±à°‚ది “%tâ€"/>
+<l:template name="refsection" text="à°† విభాగమౠపిలà±à°µà°¬à°¡à±à°¤à±à°‚ది “%tâ€"/>
+<l:template name="refsect1" text="à°† విభాగమౠపిలà±à°µà°¬à°¡à±à°¤à±à°‚ది “%tâ€"/>
+<l:template name="refsect2" text="à°† విభాగమౠపిలà±à°µà°¬à°¡à±à°¤à±à°‚ది “%tâ€"/>
+<l:template name="refsect3" text="à°† విభాగమౠపిలà±à°µà°¬à°¡à±à°¤à±à°‚ది “%tâ€"/>
+<l:template name="sect1" text="à°† విభాగమౠపిలà±à°µà°¬à°¡à±à°¤à±à°‚ది “%tâ€"/>
+<l:template name="sect2" text="à°† విభాగమౠపిలà±à°µà°¬à°¡à±à°¤à±à°‚ది “%tâ€"/>
+<l:template name="sect3" text="à°† విభాగమౠపిలà±à°µà°¬à°¡à±à°¤à±à°‚ది “%tâ€"/>
+<l:template name="sect4" text="à°† విభాగమౠపిలà±à°µà°¬à°¡à±à°¤à±à°‚ది “%tâ€"/>
+<l:template name="sect5" text="à°† విభాగమౠపిలà±à°µà°¬à°¡à±à°¤à±à°‚ది “%tâ€"/>
+<l:template name="section" text="à°† విభాగమౠపిలà±à°µà°¬à°¡à±à°¤à±à°‚ది “%tâ€"/>
+<l:template name="simplesect" text="à°† విభాగమౠపిలà±à°µà°¬à°¡à±à°¤à±à°‚ది “%tâ€"/>
+</l:context>
+<l:context name="xref-number"><l:template name="answer" text="సమాధానం: %n"/>
+<l:template name="appendix" text="à°…à°¨à±à°¬à°‚ధం %n"/>
+<l:template name="bridgehead" text="విభాగమà±Â %n"/>
+<l:template name="chapter" text="à°…à°§à±à°¯à°¾à°¯à°®à±Â %n"/>
+<l:template name="equation" text="సమీకరణమà±Â %n"/>
+<l:template name="example" text="ఉదాహరణ %n"/>
+<l:template name="figure" text="మూరà±à°¤à°¿Â %n"/>
+<l:template name="part" text="భాగమà±Â %n"/>
+<l:template name="procedure" text="పదà±à°§à°¤à°¿Â %n"/>
+<l:template name="productionset" text="ఉతà±à°ªà°¤à±à°¤à°¿Â %n"/>
+<l:template name="qandadiv" text="à°ªà±à°°à°¶à±à°¨à°²à± &amp; సమాధానమà±à°²à±Â %n"/>
+<l:template name="qandaentry" text="à°ªà±à°°à°¶à±à°¨: %n"/>
+<l:template name="question" text="à°ªà±à°°à°¶à±à°¨: %n"/>
+<l:template name="sect1" text="విభాగమà±Â %n"/>
+<l:template name="sect2" text="విభాగమà±Â %n"/>
+<l:template name="sect3" text="విభాగమà±Â %n"/>
+<l:template name="sect4" text="విభాగమà±Â %n"/>
+<l:template name="sect5" text="విభాగమà±Â %n"/>
+<l:template name="section" text="విభాగమà±Â %n"/>
+<l:template name="table" text="పటà±à°Ÿà°¿à°•Â %n"/>
+</l:context>
+<l:context name="xref-number-and-title"><l:template name="appendix" text="à°…à°¨à±à°¬à°‚ధం %n, %t"/>
+<l:template name="bridgehead" text="విభాగమà±Â %n, “%tâ€"/>
+<l:template name="chapter" text="à°…à°§à±à°¯à°¾à°¯à°®à±Â %n, %t"/>
+<l:template name="equation" text="సమీకరణమà±Â %n, “%tâ€"/>
+<l:template name="example" text="ఉదాహరణ %n, “%tâ€"/>
+<l:template name="figure" text="మూరà±à°¤à°¿Â %n, “%tâ€"/>
+<l:template name="part" text="భాగమà±Â %n, “%tâ€"/>
+<l:template name="procedure" text="పదà±à°§à°¤à°¿Â %n, “%tâ€"/>
+<l:template name="productionset" text="ఉతà±à°ªà°¤à±à°¤à°¿Â %n, “%tâ€"/>
+<l:template name="qandadiv" text="à°ªà±à°°à°¶à±à°¨à°²à± &amp; సమాధానమà±à°²à±Â %n, “%tâ€"/>
+<l:template name="refsect1" text="à°† విభాగమౠపిలà±à°µà°¬à°¡à±à°¤à±à°‚ది “%tâ€"/>
+<l:template name="refsect2" text="à°† విభాగమౠపిలà±à°µà°¬à°¡à±à°¤à±à°‚ది “%tâ€"/>
+<l:template name="refsect3" text="à°† విభాగమౠపిలà±à°µà°¬à°¡à±à°¤à±à°‚ది “%tâ€"/>
+<l:template name="refsection" text="à°† విభాగమౠపిలà±à°µà°¬à°¡à±à°¤à±à°‚ది “%tâ€"/>
+<l:template name="sect1" text="విభాగమà±Â %n, “%tâ€"/>
+<l:template name="sect2" text="విభాగమà±Â %n, “%tâ€"/>
+<l:template name="sect3" text="విభాగమà±Â %n, “%tâ€"/>
+<l:template name="sect4" text="విభాగమà±Â %n, “%tâ€"/>
+<l:template name="sect5" text="విభాగమà±Â %n, “%tâ€"/>
+<l:template name="section" text="విభాగమà±Â %n, “%tâ€"/>
+<l:template name="simplesect" text="à°† విభాగమౠపిలà±à°µà°¬à°¡à±à°¤à±à°‚ది “%tâ€"/>
+<l:template name="table" text="పటà±à°Ÿà°¿à°•Â %n, “%tâ€"/>
+</l:context>
+<l:context name="authorgroup"><l:template name="sep" text=", "/>
+<l:template name="sep2" text=" మరియౠ"/>
+<l:template name="seplast" text=", మరియౠ"/>
+</l:context>
+<l:context name="glossary"><l:template name="see" text="చూడà±à°®à± %t."/>
+<l:template name="seealso" text="ఇదికూడా చూడà±à°®à± %t."/>
+<l:template name="seealso-separator" text=", "/>
+</l:context>
+<l:context name="msgset"><l:template name="MsgAud" text="à°ªà±à°°à±‡à°•à±à°·à°•à±à°²à±: "/>
+<l:template name="MsgLevel" text="à°¸à±à°¥à°¾à°¯à°¿: "/>
+<l:template name="MsgOrig" text="మూలమà±: "/>
+</l:context>
+<l:context name="datetime"><l:template name="format" text="d/m/Y"/>
+</l:context>
+<l:context name="termdef"><l:template name="prefix" text="[Definition: "/>
+<l:template name="suffix" text="]"/>
+</l:context>
+<l:context name="datetime-full"><l:template name="January" text="జనవరి"/>
+<l:template name="February" text="à°«à°¿à°¬à±à°°à°µà°°à°¿"/>
+<l:template name="March" text="మారà±à°šà°¿"/>
+<l:template name="April" text="à°à°ªà±à°°à°¿à°²à±"/>
+<l:template name="May" text="మే"/>
+<l:template name="June" text="జూనà±"/>
+<l:template name="July" text="à°œà±à°²à±ˆ"/>
+<l:template name="August" text="ఆగసà±à°Ÿà±"/>
+<l:template name="September" text="సెపà±à°Ÿà±†à°‚బరà±"/>
+<l:template name="October" text="à°…à°•à±à°Ÿà±‹à°¬à°°à±"/>
+<l:template name="November" text="నవంబరà±"/>
+<l:template name="December" text="డిసెంబరà±"/>
+<l:template name="Monday" text="సోమవారమà±"/>
+<l:template name="Tuesday" text="మంగళవారమà±"/>
+<l:template name="Wednesday" text="à°¬à±à°§à°µà°¾à°°à°®à±"/>
+<l:template name="Thursday" text="à°—à±à°°à±à°µà°¾à°°à°®à±"/>
+<l:template name="Friday" text="à°¶à±à°•à±à°°à°µà°¾à°°à°®à±"/>
+<l:template name="Saturday" text="శనివారమà±"/>
+<l:template name="Sunday" text="ఆదివారమà±"/>
+</l:context>
+<l:context name="datetime-abbrev"><l:template name="Jan" text="జన"/>
+<l:template name="Feb" text="à°«à°¿à°¬à±à°°"/>
+<l:template name="Mar" text="మారà±à°šà°¿"/>
+<l:template name="Apr" text="à°à°ªà±à°°à°¿"/>
+<l:template name="May" text="మే"/>
+<l:template name="Jun" text="జూనà±"/>
+<l:template name="Jul" text="à°œà±à°²à±ˆ"/>
+<l:template name="Aug" text="ఆగ"/>
+<l:template name="Sep" text="సెపà±à°Ÿà±†à°‚"/>
+<l:template name="Oct" text="à°…à°•à±à°Ÿà±‹"/>
+<l:template name="Nov" text="నవం"/>
+<l:template name="Dec" text="డిసెం"/>
+<l:template name="Mon" text="సోమ"/>
+<l:template name="Tue" text="మంగళ"/>
+<l:template name="Wed" text="à°¬à±à°§"/>
+<l:template name="Thu" text="à°—à±à°°à±"/>
+<l:template name="Fri" text="à°¶à±à°•à±à°°"/>
+<l:template name="Sat" text="శని"/>
+<l:template name="Sun" text="ఆది"/>
+</l:context>
+<l:context name="htmlhelp"><l:template name="langcode" text="0x044a Telugu"/>
+</l:context>
+<l:context name="index"><l:template name="term-separator" text=", "/>
+<l:template name="number-separator" text=", "/>
+<l:template name="range-separator" text="-"/>
+</l:context>
+<l:context name="iso690"><l:template name="lastfirst.sep" text=", "/>
+<l:template name="alt.person.two.sep" text=" – "/>
+<l:template name="alt.person.last.sep" text=" – "/>
+<l:template name="alt.person.more.sep" text=" – "/>
+<l:template name="primary.editor" text=" (ed.)"/>
+<l:template name="primary.many" text=", et al."/>
+<l:template name="primary.sep" text=". "/>
+<l:template name="submaintitle.sep" text=": "/>
+<l:template name="title.sep" text=". "/>
+<l:template name="othertitle.sep" text=", "/>
+<l:template name="medium1" text=" ["/>
+<l:template name="medium2" text="]"/>
+<l:template name="secondary.person.sep" text="; "/>
+<l:template name="secondary.sep" text=". "/>
+<l:template name="respons.sep" text=". "/>
+<l:template name="edition.sep" text=". "/>
+<l:template name="edition.serial.sep" text=", "/>
+<l:template name="issuing.range" text="-"/>
+<l:template name="issuing.div" text=", "/>
+<l:template name="issuing.sep" text=". "/>
+<l:template name="partnr.sep" text=". "/>
+<l:template name="placepubl.sep" text=": "/>
+<l:template name="publyear.sep" text=", "/>
+<l:template name="pubinfo.sep" text=". "/>
+<l:template name="spec.pubinfo.sep" text=", "/>
+<l:template name="upd.sep" text=", "/>
+<l:template name="datecit1" text=" [cited "/>
+<l:template name="datecit2" text="]"/>
+<l:template name="extent.sep" text=". "/>
+<l:template name="locs.sep" text=", "/>
+<l:template name="location.sep" text=". "/>
+<l:template name="serie.sep" text=". "/>
+<l:template name="notice.sep" text=". "/>
+<l:template name="access" text="Available "/>
+<l:template name="acctoo" text="Also available "/>
+<l:template name="onwww" text="from World Wide Web"/>
+<l:template name="oninet" text="from Internet"/>
+<l:template name="access.end" text=": "/>
+<l:template name="link1" text="&lt;"/>
+<l:template name="link2" text="&gt;"/>
+<l:template name="access.sep" text=". "/>
+<l:template name="isbn" text="ISBN "/>
+<l:template name="issn" text="ISSN "/>
+<l:template name="stdnum.sep" text=". "/>
+<l:template name="patcountry.sep" text=". "/>
+<l:template name="pattype.sep" text=", "/>
+<l:template name="patnum.sep" text=". "/>
+<l:template name="patdate.sep" text=". "/>
+</l:context><l:letters><l:l i="-1"/>
+<l:l i="0">à°šà°¿à°¹à±à°¨à°®à±à°²à±</l:l>
+<l:l i="10">A</l:l>
+<l:l i="10">a</l:l>
+<l:l i="20">B</l:l>
+<l:l i="20">b</l:l>
+<l:l i="30">C</l:l>
+<l:l i="30">c</l:l>
+<l:l i="40">D</l:l>
+<l:l i="40">d</l:l>
+<l:l i="50">E</l:l>
+<l:l i="50">e</l:l>
+<l:l i="60">F</l:l>
+<l:l i="60">f</l:l>
+<l:l i="70">G</l:l>
+<l:l i="70">g</l:l>
+<l:l i="80">H</l:l>
+<l:l i="80">h</l:l>
+<l:l i="90">I</l:l>
+<l:l i="90">i</l:l>
+<l:l i="100">J</l:l>
+<l:l i="100">j</l:l>
+<l:l i="110">K</l:l>
+<l:l i="110">k</l:l>
+<l:l i="120">L</l:l>
+<l:l i="120">l</l:l>
+<l:l i="130">M</l:l>
+<l:l i="130">m</l:l>
+<l:l i="140">N</l:l>
+<l:l i="140">n</l:l>
+<l:l i="150">O</l:l>
+<l:l i="150">o</l:l>
+<l:l i="160">P</l:l>
+<l:l i="160">p</l:l>
+<l:l i="170">Q</l:l>
+<l:l i="170">q</l:l>
+<l:l i="180">R</l:l>
+<l:l i="180">r</l:l>
+<l:l i="190">S</l:l>
+<l:l i="190">s</l:l>
+<l:l i="200">T</l:l>
+<l:l i="200">t</l:l>
+<l:l i="210">U</l:l>
+<l:l i="210">u</l:l>
+<l:l i="220">V</l:l>
+<l:l i="220">v</l:l>
+<l:l i="230">W</l:l>
+<l:l i="230">w</l:l>
+<l:l i="240">X</l:l>
+<l:l i="240">x</l:l>
+<l:l i="250">Y</l:l>
+<l:l i="250">y</l:l>
+<l:l i="260">Z</l:l>
+<l:l i="260">z</l:l>
+</l:letters>
+</l:l10n>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/th.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/th.xml
new file mode 100644
index 0000000..f2e8109
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/th.xml
@@ -0,0 +1,1229 @@
+<?xml version="1.0" encoding="utf-8"?>
+<l:l10n xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0" language="th" english-language-name="Thai">
+
+<!-- * This file is generated automatically. -->
+<!-- * To submit changes to this file upstream (to the DocBook Project) -->
+<!-- * do not submit an edited version of this file. Instead, submit an -->
+<!-- * edited version of the source file at the following location: -->
+<!-- * -->
+<!-- * https://docbook.svn.sourceforge.net/svnroot/docbook/trunk/gentext/locale/th.xml -->
+<!-- * -->
+<!-- * E-mail the edited th.xml source file to: -->
+<!-- * -->
+<!-- * docbook-developers@lists.sourceforge.net -->
+
+<!-- ******************************************************************** -->
+
+<!-- This file is part of the XSL DocBook Stylesheet distribution. -->
+<!-- See ../README or http://docbook.sf.net/release/xsl/current/ for -->
+<!-- copyright and other information. -->
+
+<!-- ******************************************************************** -->
+<!-- In these files, % with a letter is used for a placeholder: -->
+<!-- %t is the current element's title -->
+<!-- %s is the current element's subtitle (if applicable)-->
+<!-- %n is the current element's number label-->
+<!-- %p is the current element's page number (if applicable)-->
+<!-- ******************************************************************** -->
+
+
+<l:gentext key="Abstract" text="บทคัดย่อ"/>
+<l:gentext key="abstract" text="บทคัดย่อ"/>
+<l:gentext key="Acknowledgements" text="Acknowledgements" lang="en"/>
+<l:gentext key="acknowledgements" text="Acknowledgements" lang="en"/>
+<l:gentext key="Answer" text="ตอบ:"/>
+<l:gentext key="answer" text="ตอบ:"/>
+<l:gentext key="Appendix" text="ภาคผนวà¸"/>
+<l:gentext key="appendix" text="ภาคผนวà¸"/>
+<l:gentext key="Article" text="บทความ"/>
+<l:gentext key="article" text="บทความ"/>
+<l:gentext key="Author" text="Author" lang="en"/>
+<l:gentext key="Bibliography" text="บรรณานุà¸à¸£à¸¡"/>
+<l:gentext key="bibliography" text="บรรณานุà¸à¸£à¸¡"/>
+<l:gentext key="Book" text="หนังสือ"/>
+<l:gentext key="book" text="หนังสือ"/>
+<l:gentext key="CAUTION" text="คำเตือน"/>
+<l:gentext key="Caution" text="คำเตือน"/>
+<l:gentext key="caution" text="คำเตือน"/>
+<l:gentext key="Chapter" text="บทที่"/>
+<l:gentext key="chapter" text="บทที่"/>
+<l:gentext key="Colophon" text="เบื้องหลัง"/>
+<l:gentext key="colophon" text="เบื้องหลัง"/>
+<l:gentext key="Copyright" text="สงวนสิขสิทธิ์"/>
+<l:gentext key="copyright" text="สงวนสิขสิทธิ์"/>
+<l:gentext key="Dedication" text="คำอุทิศ"/>
+<l:gentext key="dedication" text="คำอุทิศ"/>
+<l:gentext key="Edition" text="ฉบับ"/>
+<l:gentext key="edition" text="ฉบับ"/>
+<l:gentext key="Editor" text="Editor" lang="en"/>
+<l:gentext key="Equation" text="สมà¸à¸²à¸£"/>
+<l:gentext key="equation" text="สมà¸à¸²à¸£"/>
+<l:gentext key="Example" text="ตัวอย่าง"/>
+<l:gentext key="example" text="ตัวอย่าง"/>
+<l:gentext key="Figure" text="รูป"/>
+<l:gentext key="figure" text="รูป"/>
+<l:gentext key="Glossary" text="อภิธานศัพท์"/>
+<l:gentext key="glossary" text="อภิธานศัพท์"/>
+<l:gentext key="GlossSee" text="ดู"/>
+<l:gentext key="glosssee" text="ดู"/>
+<l:gentext key="GlossSeeAlso" text="ดูเพิ่มเติม"/>
+<l:gentext key="glossseealso" text="ดูเพิ่มเติม"/>
+<l:gentext key="IMPORTANT" text="ข้อควรจำ"/>
+<l:gentext key="important" text="ข้อควรจำ"/>
+<l:gentext key="Important" text="ข้อควรจำ"/>
+<l:gentext key="Index" text="ดรรชนี"/>
+<l:gentext key="index" text="ดรรชนี"/>
+<l:gentext key="ISBN" text="ISBN"/>
+<l:gentext key="isbn" text="ISBN"/>
+<l:gentext key="LegalNotice" text="ข้อผูà¸à¸žà¸±à¸™à¸•à¸²à¸¡à¸à¸Žà¸«à¸¡à¸²à¸¢"/>
+<l:gentext key="legalnotice" text="ข้อผูà¸à¸žà¸±à¸™à¸•à¸²à¸¡à¸à¸Žà¸«à¸¡à¸²à¸¢"/>
+<l:gentext key="MsgAud" text="ผู้อ่าน"/>
+<l:gentext key="msgaud" text="ผู้อ่าน"/>
+<l:gentext key="MsgLevel" text="ระดับ"/>
+<l:gentext key="msglevel" text="ระดับ"/>
+<l:gentext key="MsgOrig" text="ที่มา"/>
+<l:gentext key="msgorig" text="ที่มา"/>
+<l:gentext key="NOTE" text="หมายเหตุ"/>
+<l:gentext key="Note" text="หมายเหตุ"/>
+<l:gentext key="note" text="หมายเหตุ"/>
+<l:gentext key="Part" text="ภาค"/>
+<l:gentext key="part" text="ภาค"/>
+<l:gentext key="Preface" text="คำนำ"/>
+<l:gentext key="preface" text="คำนำ"/>
+<l:gentext key="Procedure" text="ระเบียบà¸à¸²à¸£"/>
+<l:gentext key="procedure" text="ระเบียบà¸à¸²à¸£"/>
+<l:gentext key="ProductionSet" text="ผลิต"/>
+<l:gentext key="PubDate" text="Publication Date" lang="en"/>
+<l:gentext key="pubdate" text="Publication date" lang="en"/>
+<l:gentext key="Published" text="ตีพิมพ์"/>
+<l:gentext key="published" text="ตีพิมพ์"/>
+<l:gentext key="Publisher" text="Publisher" lang="en"/>
+<l:gentext key="Qandadiv" text="ถาม-ตอบ"/>
+<l:gentext key="qandadiv" text="ถาม-ตอบ"/>
+<l:gentext key="QandASet" text="Frequently Asked Questions" lang="en"/>
+<l:gentext key="Question" text="ถาม:"/>
+<l:gentext key="question" text="ถาม:"/>
+<l:gentext key="RefEntry" text=""/>
+<l:gentext key="refentry" text=""/>
+<l:gentext key="Reference" text="หนังสืออ้างอิง"/>
+<l:gentext key="reference" text="หนังสืออ้างอิง"/>
+<l:gentext key="References" text="References" lang="en"/>
+<l:gentext key="RefName" text="ชื่อ"/>
+<l:gentext key="refname" text="ชื่อ"/>
+<l:gentext key="RefSection" text=""/>
+<l:gentext key="refsection" text=""/>
+<l:gentext key="RefSynopsisDiv" text="สาระสำคัà¸"/>
+<l:gentext key="refsynopsisdiv" text="สาระสำคัà¸"/>
+<l:gentext key="RevHistory" text="บันทึà¸à¸£à¸¸à¹ˆà¸™"/>
+<l:gentext key="revhistory" text="บันทึà¸à¸£à¸¸à¹ˆà¸™"/>
+<l:gentext key="revision" text="รุ่นที่"/>
+<l:gentext key="Revision" text="รุ่นที่"/>
+<l:gentext key="sect1" text="ตอนที่"/>
+<l:gentext key="sect2" text="ตอนที่"/>
+<l:gentext key="sect3" text="ตอนที่"/>
+<l:gentext key="sect4" text="ตอนที่"/>
+<l:gentext key="sect5" text="ตอนที่"/>
+<l:gentext key="section" text="ตอนที่"/>
+<l:gentext key="Section" text="ตอนที่"/>
+<l:gentext key="see" text="ดู"/>
+<l:gentext key="See" text="ดู"/>
+<l:gentext key="seealso" text="ดูเพิ่มเติม"/>
+<l:gentext key="Seealso" text="ดูเพิ่มเติม"/>
+<l:gentext key="SeeAlso" text="ดูเพิ่มเติม"/>
+<l:gentext key="set" text="ชุด"/>
+<l:gentext key="Set" text="ชุด"/>
+<l:gentext key="setindex" text="สารบัà¸à¸Šà¸¸à¸”"/>
+<l:gentext key="SetIndex" text="สารบัà¸à¸Šà¸¸à¸”"/>
+<l:gentext key="Sidebar" text=""/>
+<l:gentext key="sidebar" text="sidebar"/>
+<l:gentext key="step" text="ลำดับ"/>
+<l:gentext key="Step" text="ลำดับ"/>
+<l:gentext key="table" text="ตาราง"/>
+<l:gentext key="Table" text="ตาราง"/>
+<l:gentext key="task" text="Task" lang="en"/>
+<l:gentext key="Task" text="Task" lang="en"/>
+<l:gentext key="tip" text="คำà¹à¸™à¸°à¸™à¸³"/>
+<l:gentext key="TIP" text="คำà¹à¸™à¸°à¸™à¸³"/>
+<l:gentext key="Tip" text="คำà¹à¸™à¸°à¸™à¸³"/>
+<l:gentext key="Warning" text="คำเตือน"/>
+<l:gentext key="warning" text="คำเตือน"/>
+<l:gentext key="WARNING" text="คำเตือน"/>
+<l:gentext key="and" text="à¹à¸¥à¸°"/>
+<l:gentext key="by" text="โดย"/>
+<l:gentext key="Edited" text="เรียบเรียง"/>
+<l:gentext key="edited" text="เรียบเรียง"/>
+<l:gentext key="Editedby" text="เรียบเรียงโดย"/>
+<l:gentext key="editedby" text="เรียบเรียงโดย"/>
+<l:gentext key="in" text="ใน"/>
+<l:gentext key="lastlistcomma" text=","/>
+<l:gentext key="listcomma" text=","/>
+<l:gentext key="notes" text="หมายเหตุ"/>
+<l:gentext key="Notes" text="หมายเหตุ"/>
+<l:gentext key="Pgs" text="หน้า"/>
+<l:gentext key="pgs" text="หน้า"/>
+<l:gentext key="Revisedby" text="à¹à¸à¹‰à¹„ขปรับปรุงโดย: "/>
+<l:gentext key="revisedby" text="à¹à¸à¹‰à¹„ขปรับปรุงโดย: "/>
+<l:gentext key="TableNotes" text="หมายเหตุ"/>
+<l:gentext key="tablenotes" text="หมายเหตุ"/>
+<l:gentext key="TableofContents" text="สารบัà¸"/>
+<l:gentext key="tableofcontents" text="สารบัà¸"/>
+<l:gentext key="unexpectedelementname" text="พบส่วนที่ไม่ต้องà¸à¸²à¸£"/>
+<l:gentext key="unsupported" text="ไม่สนับสนุน"/>
+<l:gentext key="xrefto" text="xref to"/>
+<l:gentext key="Authors" text="Authors" lang="en"/>
+<l:gentext key="copyeditor" text="Copy Editor" lang="en"/>
+<l:gentext key="graphicdesigner" text="Graphic Designer" lang="en"/>
+<l:gentext key="productioneditor" text="Production Editor" lang="en"/>
+<l:gentext key="technicaleditor" text="Technical Editor" lang="en"/>
+<l:gentext key="translator" text="Translator" lang="en"/>
+<l:gentext key="listofequations" text="สารบัà¸à¸ªà¸¡à¸à¸²à¸£"/>
+<l:gentext key="ListofEquations" text="สารบัà¸à¸ªà¸¡à¸à¸²à¸£"/>
+<l:gentext key="ListofExamples" text="สารบัà¸à¸•à¸±à¸§à¸­à¸¢à¹ˆà¸²à¸‡"/>
+<l:gentext key="listofexamples" text="สารบัà¸à¸•à¸±à¸§à¸­à¸¢à¹ˆà¸²à¸‡"/>
+<l:gentext key="ListofFigures" text="สารบัà¸à¸£à¸¹à¸›"/>
+<l:gentext key="listoffigures" text="สารบัà¸à¸£à¸¹à¸›"/>
+<l:gentext key="ListofProcedures" text="List of Procedures" lang="en"/>
+<l:gentext key="listofprocedures" text="List of Procedures" lang="en"/>
+<l:gentext key="listoftables" text="สารบัà¸à¸•à¸²à¸£à¸²à¸‡"/>
+<l:gentext key="ListofTables" text="สารบัà¸à¸•à¸²à¸£à¸²à¸‡"/>
+<l:gentext key="ListofUnknown" text="สารบัà¸à¸­à¸·à¹ˆà¸™ ๆ"/>
+<l:gentext key="listofunknown" text="สารบัà¸à¸­à¸·à¹ˆà¸™ ๆ"/>
+<l:gentext key="nav-home" text="หน้าà¹à¸£à¸"/>
+<l:gentext key="nav-next" text="ต่อไป"/>
+<l:gentext key="nav-next-sibling" text="ต่อไป"/>
+<l:gentext key="nav-prev" text="à¸à¹ˆà¸­à¸™à¸«à¸™à¹‰à¸²"/>
+<l:gentext key="nav-prev-sibling" text="à¸à¹ˆà¸­à¸™à¸«à¸™à¹‰à¸²"/>
+<l:gentext key="nav-up" text="à¸à¸¥à¸±à¸š"/>
+<l:gentext key="nav-toc" text="ToC" lang="en"/>
+<l:gentext key="Draft" text="Draft"/>
+<l:gentext key="above" text="above"/>
+<l:gentext key="below" text="below"/>
+<l:gentext key="sectioncalled" text="หัวข้อ"/>
+<l:gentext key="index symbols" text="สัà¸à¸¥à¸±à¸à¸©à¸“์"/>
+<l:gentext key="writing-mode" text="lr-tb"/>
+<l:gentext key="lowercase.alpha" text="abcdefghijklmnopqrstuvwxyz"/>
+<l:gentext key="uppercase.alpha" text="ABCDEFGHIJKLMNOPQRSTUVWXYZ"/>
+<l:gentext key="normalize.sort.input" text="AaÀàÃáÂâÃãÄäÅåĀÄĂ㥹ÇǎǞǟǠǡǺǻȀÈȂȃȦȧḀá¸áºšáº áº¡áº¢áº£áº¤áº¥áº¦áº§áº¨áº©áºªáº«áº¬áº­áº®áº¯áº°áº±áº²áº³áº´áºµáº¶áº·BbÆ€ÆɓƂƃḂḃḄḅḆḇCcÇçĆćĈĉĊċČÄƇƈɕḈḉDdÄŽÄÄđƊɗƋƌDžDzȡɖḊḋḌá¸á¸Žá¸á¸á¸‘ḒḓEeÈèÉéÊêËëĒēĔĕĖėĘęĚěȄȅȆȇȨȩḔḕḖḗḘḙḚḛḜá¸áº¸áº¹áººáº»áº¼áº½áº¾áº¿á»€á»á»‚ểỄễỆệFfƑƒḞḟGgÄœÄĞğĠġĢģƓɠǤǥǦǧǴǵḠḡHhĤĥĦħȞȟɦḢḣḤḥḦḧḨḩḪḫẖIiÌìÃíÎîÃïĨĩĪīĬĭĮįİƗɨÇÇȈȉȊȋḬḭḮḯỈỉỊịJjĴĵǰÊKkĶķƘƙǨǩḰḱḲḳḴḵLlĹĺĻļĽľĿŀÅłƚLjȴɫɬɭḶḷḸḹḺḻḼḽMmɱḾḿṀá¹á¹‚ṃNnÑñŃńŅņŇňÆɲƞȠNjǸǹȵɳṄṅṆṇṈṉṊṋOoÒòÓóÔôÕõÖöØøŌÅÅŽÅÅőƟƠơǑǒǪǫǬǭǾǿȌÈÈŽÈȪȫȬȭȮȯȰȱṌá¹á¹Žá¹á¹á¹‘ṒṓỌá»á»Žá»á»á»‘ỒồỔổỖỗỘộỚớỜá»á»žá»Ÿá» á»¡á»¢á»£PpƤƥṔṕṖṗQqÊ RrŔŕŖŗŘřÈȑȒȓɼɽɾṘṙṚṛṜá¹á¹žá¹ŸSsŚśŜÅŞşŠšȘșʂṠṡṢṣṤṥṦṧṨṩTtŢţŤťŦŧƫƬƭƮʈȚțȶṪṫṬṭṮṯṰṱẗUuÙùÚúÛûÜüŨũŪūŬŭŮůŰűŲųƯưǓǔǕǖǗǘǙǚǛǜȔȕȖȗṲṳṴṵṶṷṸṹṺṻỤụỦủỨứỪừỬửỮữỰựVvƲʋṼṽṾṿWwŴŵẀáºáº‚ẃẄẅẆẇẈẉẘXxẊẋẌáºYyÃýÿŸŶŷƳƴȲȳẎáºáº™á»²á»³á»´á»µá»¶á»·á»¸á»¹ZzŹźŻżŽžƵƶȤȥÊÊ‘áºáº‘ẒẓẔẕẕ" lang="en"/>
+<l:gentext key="normalize.sort.output" text="AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBCCCCCCCCCCCCCCCCCDDDDDDDDDDDDDDDDDDDDDDDDEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEFFFFFFGGGGGGGGGGGGGGGGGGGGHHHHHHHHHHHHHHHHHHHHIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIJJJJJJKKKKKKKKKKKKKKLLLLLLLLLLLLLLLLLLLLLLLLLLMMMMMMMMMNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOPPPPPPPPQQQRRRRRRRRRRRRRRRRRRRRRRRSSSSSSSSSSSSSSSSSSSSSSSTTTTTTTTTTTTTTTTTTTTTTTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUVVVVVVVVWWWWWWWWWWWWWWWXXXXXXYYYYYYYYYYYYYYYYYYYYYYYZZZZZZZZZZZZZZZZZZZZZ" lang="en"/>
+<l:dingbat key="startquote" text="“"/>
+<l:dingbat key="endquote" text="â€"/>
+<l:dingbat key="nestedstartquote" text="‘"/>
+<l:dingbat key="nestedendquote" text="’"/>
+<l:dingbat key="singlestartquote" text="‘" lang="en"/>
+<l:dingbat key="singleendquote" text="’" lang="en"/>
+<l:dingbat key="bullet" text="•"/>
+<l:gentext key="hyphenation-character" text="-" lang="en"/>
+<l:gentext key="hyphenation-push-character-count" text="2" lang="en"/>
+<l:gentext key="hyphenation-remain-character-count" text="2" lang="en"/>
+<l:context name="styles"><l:template name="person-name" text="first-last"/>
+</l:context>
+<l:context name="title"><l:template name="abstract" text="%t"/>
+<l:template name="acknowledgements" text="%t" lang="en"/>
+<l:template name="answer" text="%t"/>
+<l:template name="appendix" text="ภาคผนวภ%n. %t"/>
+<l:template name="article" text="%t"/>
+<l:template name="authorblurb" text="%t"/>
+<l:template name="bibliodiv" text="%t"/>
+<l:template name="biblioentry" text="%t"/>
+<l:template name="bibliography" text="%t"/>
+<l:template name="bibliolist" text="%t" lang="en"/>
+<l:template name="bibliomixed" text="%t"/>
+<l:template name="bibliomset" text="%t"/>
+<l:template name="biblioset" text="%t"/>
+<l:template name="blockquote" text="%t"/>
+<l:template name="book" text="%t"/>
+<l:template name="calloutlist" text="%t"/>
+<l:template name="caution" text="%t"/>
+<l:template name="chapter" text="บทที่ %n. %t"/>
+<l:template name="colophon" text="%t"/>
+<l:template name="dedication" text="%t"/>
+<l:template name="equation" text="สมà¸à¸²à¸£ %n. %t"/>
+<l:template name="example" text="ตัวอย่าง %n. %t"/>
+<l:template name="figure" text="รูป %n. %t"/>
+<l:template name="foil" text="%t" lang="en"/>
+<l:template name="foilgroup" text="%t" lang="en"/>
+<l:template name="formalpara" text="%t"/>
+<l:template name="glossary" text="%t"/>
+<l:template name="glossdiv" text="%t"/>
+<l:template name="glosslist" text="%t" lang="en"/>
+<l:template name="glossentry" text="%t" lang="en"/>
+<l:template name="important" text="%t"/>
+<l:template name="index" text="%t"/>
+<l:template name="indexdiv" text="%t"/>
+<l:template name="itemizedlist" text="%t"/>
+<l:template name="legalnotice" text="%t"/>
+<l:template name="listitem" text=""/>
+<l:template name="lot" text="%t"/>
+<l:template name="msg" text="%t"/>
+<l:template name="msgexplan" text="%t"/>
+<l:template name="msgmain" text="%t"/>
+<l:template name="msgrel" text="%t"/>
+<l:template name="msgset" text="%t"/>
+<l:template name="msgsub" text="%t"/>
+<l:template name="note" text="%t"/>
+<l:template name="orderedlist" text="%t"/>
+<l:template name="part" text="ภาค %n. %t"/>
+<l:template name="partintro" text="%t"/>
+<l:template name="preface" text="%t"/>
+<l:template name="procedure" text="%t"/>
+<l:template name="procedure.formal" text="ระเบียบà¸à¸²à¸£ %n. %t"/>
+<l:template name="productionset" text="%t"/>
+<l:template name="productionset.formal" text="ผลิต %n"/>
+<l:template name="qandadiv" text="%t"/>
+<l:template name="qandaentry" text="%t"/>
+<l:template name="qandaset" text="%t"/>
+<l:template name="question" text="%t"/>
+<l:template name="refentry" text="%t"/>
+<l:template name="reference" text="%t"/>
+<l:template name="refsection" text="%t"/>
+<l:template name="refsect1" text="%t"/>
+<l:template name="refsect2" text="%t"/>
+<l:template name="refsect3" text="%t"/>
+<l:template name="refsynopsisdiv" text="%t"/>
+<l:template name="refsynopsisdivinfo" text="%t"/>
+<l:template name="segmentedlist" text="%t"/>
+<l:template name="set" text="%t"/>
+<l:template name="setindex" text="%t"/>
+<l:template name="sidebar" text="%t"/>
+<l:template name="step" text="%t"/>
+<l:template name="table" text="ตาราง %n. %t"/>
+<l:template name="task" text="%t" lang="en"/>
+<l:template name="tasksummary" text="%t" lang="en"/>
+<l:template name="taskprerequisites" text="%t" lang="en"/>
+<l:template name="taskrelated" text="%t" lang="en"/>
+<l:template name="tip" text="%t"/>
+<l:template name="toc" text="%t"/>
+<l:template name="variablelist" text="%t"/>
+<l:template name="varlistentry" text=""/>
+<l:template name="warning" text="%t"/>
+</l:context>
+<l:context name="title-unnumbered"><l:template name="appendix" text="%t"/>
+<l:template name="article/appendix" text="%t" lang="en"/>
+<l:template name="bridgehead" text="%t"/>
+<l:template name="chapter" text="%t"/>
+<l:template name="sect1" text="%t"/>
+<l:template name="sect2" text="%t"/>
+<l:template name="sect3" text="%t"/>
+<l:template name="sect4" text="%t"/>
+<l:template name="sect5" text="%t"/>
+<l:template name="section" text="%t"/>
+<l:template name="simplesect" text="%t"/>
+<l:template name="part" text="%t" lang="en"/>
+</l:context>
+<l:context name="title-numbered"><l:template name="appendix" text="ภาคผนวภ%n. %t"/>
+<l:template name="article/appendix" text="%n. %t" lang="en"/>
+<l:template name="bridgehead" text="%n. %t"/>
+<l:template name="chapter" text="บทที่ %n. %t"/>
+<l:template name="part" text="ภาค %n. %t"/>
+<l:template name="sect1" text="%n. %t"/>
+<l:template name="sect2" text="%n. %t"/>
+<l:template name="sect3" text="%n. %t"/>
+<l:template name="sect4" text="%n. %t"/>
+<l:template name="sect5" text="%n. %t"/>
+<l:template name="section" text="%n. %t"/>
+<l:template name="simplesect" text="%t"/>
+</l:context>
+<l:context name="subtitle"><l:template name="appendix" text="%s"/>
+<l:template name="acknowledgements" text="%s" lang="en"/>
+<l:template name="article" text="%s"/>
+<l:template name="bibliodiv" text="%s"/>
+<l:template name="biblioentry" text="%s"/>
+<l:template name="bibliography" text="%s"/>
+<l:template name="bibliomixed" text="%s"/>
+<l:template name="bibliomset" text="%s"/>
+<l:template name="biblioset" text="%s"/>
+<l:template name="book" text="%s"/>
+<l:template name="chapter" text="%s"/>
+<l:template name="colophon" text="%s"/>
+<l:template name="dedication" text="%s"/>
+<l:template name="glossary" text="%s"/>
+<l:template name="glossdiv" text="%s"/>
+<l:template name="index" text="%s"/>
+<l:template name="indexdiv" text="%s"/>
+<l:template name="lot" text="%s"/>
+<l:template name="part" text="%s"/>
+<l:template name="partintro" text="%s"/>
+<l:template name="preface" text="%s"/>
+<l:template name="refentry" text="%s"/>
+<l:template name="reference" text="%s"/>
+<l:template name="refsection" text="%s"/>
+<l:template name="refsect1" text="%s"/>
+<l:template name="refsect2" text="%s"/>
+<l:template name="refsect3" text="%s"/>
+<l:template name="refsynopsisdiv" text="%s"/>
+<l:template name="sect1" text="%s"/>
+<l:template name="sect2" text="%s"/>
+<l:template name="sect3" text="%s"/>
+<l:template name="sect4" text="%s"/>
+<l:template name="sect5" text="%s"/>
+<l:template name="section" text="%s"/>
+<l:template name="set" text="%s"/>
+<l:template name="setindex" text="%s"/>
+<l:template name="sidebar" text="%s"/>
+<l:template name="simplesect" text="%s"/>
+<l:template name="toc" text="%s"/>
+</l:context>
+<l:context name="xref"><l:template name="abstract" text="%t"/>
+<l:template name="acknowledgements" text="%t" lang="en"/>
+<l:template name="answer" text="ตอบ: %n"/>
+<l:template name="appendix" text="%t"/>
+<l:template name="article" text="%t"/>
+<l:template name="authorblurb" text="%t"/>
+<l:template name="bibliodiv" text="%t"/>
+<l:template name="bibliography" text="%t"/>
+<l:template name="bibliomset" text="%t"/>
+<l:template name="biblioset" text="%t"/>
+<l:template name="blockquote" text="%t"/>
+<l:template name="book" text="%t"/>
+<l:template name="calloutlist" text="%t"/>
+<l:template name="caution" text="%t"/>
+<l:template name="chapter" text="%t"/>
+<l:template name="colophon" text="%t"/>
+<l:template name="constraintdef" text="%t"/>
+<l:template name="dedication" text="%t"/>
+<l:template name="equation" text="%t"/>
+<l:template name="example" text="%t"/>
+<l:template name="figure" text="%t"/>
+<l:template name="foil" text="%t" lang="en"/>
+<l:template name="foilgroup" text="%t" lang="en"/>
+<l:template name="formalpara" text="%t"/>
+<l:template name="glossary" text="%t"/>
+<l:template name="glossdiv" text="%t"/>
+<l:template name="important" text="%t"/>
+<l:template name="index" text="%t"/>
+<l:template name="indexdiv" text="%t"/>
+<l:template name="itemizedlist" text="%t"/>
+<l:template name="legalnotice" text="%t"/>
+<l:template name="listitem" text="%n"/>
+<l:template name="lot" text="%t"/>
+<l:template name="msg" text="%t"/>
+<l:template name="msgexplan" text="%t"/>
+<l:template name="msgmain" text="%t"/>
+<l:template name="msgrel" text="%t"/>
+<l:template name="msgset" text="%t"/>
+<l:template name="msgsub" text="%t"/>
+<l:template name="note" text="%t"/>
+<l:template name="orderedlist" text="%t"/>
+<l:template name="part" text="%t"/>
+<l:template name="partintro" text="%t"/>
+<l:template name="preface" text="%t"/>
+<l:template name="procedure" text="%t"/>
+<l:template name="productionset" text="%t"/>
+<l:template name="qandadiv" text="%t"/>
+<l:template name="qandaentry" text="ถาม: %n"/>
+<l:template name="qandaset" text="%t"/>
+<l:template name="question" text="ถาม: %n"/>
+<l:template name="reference" text="%t"/>
+<l:template name="refsynopsisdiv" text="%t"/>
+<l:template name="segmentedlist" text="%t"/>
+<l:template name="set" text="%t"/>
+<l:template name="setindex" text="%t"/>
+<l:template name="sidebar" text="%t"/>
+<l:template name="table" text="%t"/>
+<l:template name="task" text="%t" lang="en"/>
+<l:template name="tip" text="%t"/>
+<l:template name="toc" text="%t"/>
+<l:template name="variablelist" text="%t"/>
+<l:template name="varlistentry" text="%n"/>
+<l:template name="warning" text="%t"/>
+<l:template name="olink.document.citation" text=" in %o" lang="en"/>
+<l:template name="olink.page.citation" text=" (page %p)" lang="en"/>
+<l:template name="page.citation" text=" [%p]"/>
+<l:template name="page" text="(page %p)" lang="en"/>
+<l:template name="docname" text=" in %o" lang="en"/>
+<l:template name="docnamelong" text=" in the document titled %o" lang="en"/>
+<l:template name="pageabbrev" text="(p. %p)" lang="en"/>
+<l:template name="Page" text="Page %p" lang="en"/>
+<l:template name="bridgehead" text="หัวข้อ “%tâ€"/>
+<l:template name="refsection" text="หัวข้อ “%tâ€"/>
+<l:template name="refsect1" text="หัวข้อ “%tâ€"/>
+<l:template name="refsect2" text="หัวข้อ “%tâ€"/>
+<l:template name="refsect3" text="หัวข้อ “%tâ€"/>
+<l:template name="sect1" text="หัวข้อ “%tâ€"/>
+<l:template name="sect2" text="หัวข้อ “%tâ€"/>
+<l:template name="sect3" text="หัวข้อ “%tâ€"/>
+<l:template name="sect4" text="หัวข้อ “%tâ€"/>
+<l:template name="sect5" text="หัวข้อ “%tâ€"/>
+<l:template name="section" text="หัวข้อ “%tâ€"/>
+<l:template name="simplesect" text="หัวข้อ “%tâ€"/>
+</l:context>
+<l:context name="xref-number"><l:template name="answer" text="ตอบ: %n"/>
+<l:template name="appendix" text="ภาคผนวà¸Â %n"/>
+<l:template name="bridgehead" text="ตอนที่ %n"/>
+<l:template name="chapter" text="บทที่ %n"/>
+<l:template name="equation" text="สมà¸à¸²à¸£Â %n"/>
+<l:template name="example" text="ตัวอย่าง %n"/>
+<l:template name="figure" text="รูป %n"/>
+<l:template name="part" text="ภาค %n"/>
+<l:template name="procedure" text="ระเบียบà¸à¸²à¸£Â %n"/>
+<l:template name="productionset" text="ผลิต %n"/>
+<l:template name="qandadiv" text="ถาม-ตอบ %n"/>
+<l:template name="qandaentry" text="ถาม: %n"/>
+<l:template name="question" text="ถาม: %n"/>
+<l:template name="sect1" text="ตอนที่ %n"/>
+<l:template name="sect2" text="ตอนที่ %n"/>
+<l:template name="sect3" text="ตอนที่ %n"/>
+<l:template name="sect4" text="ตอนที่ %n"/>
+<l:template name="sect5" text="ตอนที่ %n"/>
+<l:template name="section" text="ตอนที่ %n"/>
+<l:template name="table" text="ตาราง %n"/>
+</l:context>
+<l:context name="xref-number-and-title"><l:template name="appendix" text="ภาคผนวà¸Â %n, %t"/>
+<l:template name="bridgehead" text="ตอนที่ %n, “%tâ€"/>
+<l:template name="chapter" text="บทที่ %n, %t"/>
+<l:template name="equation" text="สมà¸à¸²à¸£Â %n, “%tâ€"/>
+<l:template name="example" text="ตัวอย่าง %n, “%tâ€"/>
+<l:template name="figure" text="รูป %n, “%tâ€"/>
+<l:template name="part" text="ภาค %n, “%tâ€"/>
+<l:template name="procedure" text="ระเบียบà¸à¸²à¸£Â %n, “%tâ€"/>
+<l:template name="productionset" text="ผลิต %n, “%tâ€"/>
+<l:template name="qandadiv" text="ถาม-ตอบ %n, “%tâ€"/>
+<l:template name="refsect1" text="หัวข้อ “%tâ€"/>
+<l:template name="refsect2" text="หัวข้อ “%tâ€"/>
+<l:template name="refsect3" text="หัวข้อ “%tâ€"/>
+<l:template name="refsection" text="หัวข้อ “%tâ€"/>
+<l:template name="sect1" text="ตอนที่ %n, “%tâ€"/>
+<l:template name="sect2" text="ตอนที่ %n, “%tâ€"/>
+<l:template name="sect3" text="ตอนที่ %n, “%tâ€"/>
+<l:template name="sect4" text="ตอนที่ %n, “%tâ€"/>
+<l:template name="sect5" text="ตอนที่ %n, “%tâ€"/>
+<l:template name="section" text="ตอนที่ %n, “%tâ€"/>
+<l:template name="simplesect" text="หัวข้อ “%tâ€"/>
+<l:template name="table" text="ตาราง %n, “%tâ€"/>
+</l:context>
+<l:context name="authorgroup"><l:template name="sep" text=", "/>
+<l:template name="sep2" text=" à¹à¸¥à¸° "/>
+<l:template name="seplast" text=", à¹à¸¥à¸° "/>
+</l:context>
+<l:context name="glossary"><l:template name="see" text="ดู %t."/>
+<l:template name="seealso" text="ดูเพิ่มเติม %t."/>
+<l:template name="seealso-separator" text=", "/>
+</l:context>
+<l:context name="msgset"><l:template name="MsgAud" text="ผู้อ่าน: "/>
+<l:template name="MsgLevel" text="ระดับ: "/>
+<l:template name="MsgOrig" text="ที่มา: "/>
+</l:context>
+<l:context name="datetime"><l:template name="format" text="m/d/Y" lang="en"/>
+</l:context>
+<l:context name="termdef"><l:template name="prefix" text="[Definition: " lang="en"/>
+<l:template name="suffix" text="]" lang="en"/>
+</l:context>
+<l:context name="datetime-full"><l:template name="January" text="January" lang="en"/>
+<l:template name="February" text="February" lang="en"/>
+<l:template name="March" text="March" lang="en"/>
+<l:template name="April" text="April" lang="en"/>
+<l:template name="May" text="May" lang="en"/>
+<l:template name="June" text="June" lang="en"/>
+<l:template name="July" text="July" lang="en"/>
+<l:template name="August" text="August" lang="en"/>
+<l:template name="September" text="September" lang="en"/>
+<l:template name="October" text="October" lang="en"/>
+<l:template name="November" text="November" lang="en"/>
+<l:template name="December" text="December" lang="en"/>
+<l:template name="Monday" text="Monday" lang="en"/>
+<l:template name="Tuesday" text="Tuesday" lang="en"/>
+<l:template name="Wednesday" text="Wednesday" lang="en"/>
+<l:template name="Thursday" text="Thursday" lang="en"/>
+<l:template name="Friday" text="Friday" lang="en"/>
+<l:template name="Saturday" text="Saturday" lang="en"/>
+<l:template name="Sunday" text="Sunday" lang="en"/>
+</l:context>
+<l:context name="datetime-abbrev"><l:template name="Jan" text="Jan" lang="en"/>
+<l:template name="Feb" text="Feb" lang="en"/>
+<l:template name="Mar" text="Mar" lang="en"/>
+<l:template name="Apr" text="Apr" lang="en"/>
+<l:template name="May" text="May" lang="en"/>
+<l:template name="Jun" text="Jun" lang="en"/>
+<l:template name="Jul" text="Jul" lang="en"/>
+<l:template name="Aug" text="Aug" lang="en"/>
+<l:template name="Sep" text="Sep" lang="en"/>
+<l:template name="Oct" text="Oct" lang="en"/>
+<l:template name="Nov" text="Nov" lang="en"/>
+<l:template name="Dec" text="Dec" lang="en"/>
+<l:template name="Mon" text="Mon" lang="en"/>
+<l:template name="Tue" text="Tue" lang="en"/>
+<l:template name="Wed" text="Wed" lang="en"/>
+<l:template name="Thu" text="Thu" lang="en"/>
+<l:template name="Fri" text="Fri" lang="en"/>
+<l:template name="Sat" text="Sat" lang="en"/>
+<l:template name="Sun" text="Sun" lang="en"/>
+</l:context>
+<l:context name="htmlhelp"><l:template name="langcode" text="0x041e Thai"/>
+</l:context>
+<l:context name="index"><l:template name="term-separator" text=", " lang="en"/>
+<l:template name="number-separator" text=", " lang="en"/>
+<l:template name="range-separator" text="-" lang="en"/>
+</l:context>
+<l:context name="iso690"><l:template name="lastfirst.sep" text=", " lang="en"/>
+<l:template name="alt.person.two.sep" text=" – " lang="en"/>
+<l:template name="alt.person.last.sep" text=" – " lang="en"/>
+<l:template name="alt.person.more.sep" text=" – " lang="en"/>
+<l:template name="primary.editor" text=" (ed.)" lang="en"/>
+<l:template name="primary.many" text=", et al." lang="en"/>
+<l:template name="primary.sep" text=". " lang="en"/>
+<l:template name="submaintitle.sep" text=": " lang="en"/>
+<l:template name="title.sep" text=". " lang="en"/>
+<l:template name="othertitle.sep" text=", " lang="en"/>
+<l:template name="medium1" text=" [" lang="en"/>
+<l:template name="medium2" text="]" lang="en"/>
+<l:template name="secondary.person.sep" text="; " lang="en"/>
+<l:template name="secondary.sep" text=". " lang="en"/>
+<l:template name="respons.sep" text=". " lang="en"/>
+<l:template name="edition.sep" text=". " lang="en"/>
+<l:template name="edition.serial.sep" text=", " lang="en"/>
+<l:template name="issuing.range" text="-" lang="en"/>
+<l:template name="issuing.div" text=", " lang="en"/>
+<l:template name="issuing.sep" text=". " lang="en"/>
+<l:template name="partnr.sep" text=". " lang="en"/>
+<l:template name="placepubl.sep" text=": " lang="en"/>
+<l:template name="publyear.sep" text=", " lang="en"/>
+<l:template name="pubinfo.sep" text=". " lang="en"/>
+<l:template name="spec.pubinfo.sep" text=", " lang="en"/>
+<l:template name="upd.sep" text=", " lang="en"/>
+<l:template name="datecit1" text=" [cited " lang="en"/>
+<l:template name="datecit2" text="]" lang="en"/>
+<l:template name="extent.sep" text=". " lang="en"/>
+<l:template name="locs.sep" text=", " lang="en"/>
+<l:template name="location.sep" text=". " lang="en"/>
+<l:template name="serie.sep" text=". " lang="en"/>
+<l:template name="notice.sep" text=". " lang="en"/>
+<l:template name="access" text="Available " lang="en"/>
+<l:template name="acctoo" text="Also available " lang="en"/>
+<l:template name="onwww" text="from World Wide Web" lang="en"/>
+<l:template name="oninet" text="from Internet" lang="en"/>
+<l:template name="access.end" text=": " lang="en"/>
+<l:template name="link1" text="&lt;" lang="en"/>
+<l:template name="link2" text="&gt;" lang="en"/>
+<l:template name="access.sep" text=". " lang="en"/>
+<l:template name="isbn" text="ISBN " lang="en"/>
+<l:template name="issn" text="ISSN " lang="en"/>
+<l:template name="stdnum.sep" text=". " lang="en"/>
+<l:template name="patcountry.sep" text=". " lang="en"/>
+<l:template name="pattype.sep" text=", " lang="en"/>
+<l:template name="patnum.sep" text=". " lang="en"/>
+<l:template name="patdate.sep" text=". " lang="en"/>
+</l:context><l:letters lang="en"><l:l i="-1"/>
+<l:l i="0">Symbols</l:l>
+<l:l i="10">A</l:l>
+<l:l i="10">a</l:l>
+<l:l i="10">À</l:l>
+<l:l i="10">à</l:l>
+<l:l i="10">Ã</l:l>
+<l:l i="10">á</l:l>
+<l:l i="10">Â</l:l>
+<l:l i="10">â</l:l>
+<l:l i="10">Ã</l:l>
+<l:l i="10">ã</l:l>
+<l:l i="10">Ä</l:l>
+<l:l i="10">ä</l:l>
+<l:l i="10">Ã…</l:l>
+<l:l i="10">Ã¥</l:l>
+<l:l i="10">Ä€</l:l>
+<l:l i="10">Ä</l:l>
+<l:l i="10">Ä‚</l:l>
+<l:l i="10">ă</l:l>
+<l:l i="10">Ä„</l:l>
+<l:l i="10">Ä…</l:l>
+<l:l i="10">Ç</l:l>
+<l:l i="10">ÇŽ</l:l>
+<l:l i="10">Çž</l:l>
+<l:l i="10">ÇŸ</l:l>
+<l:l i="10">Ç </l:l>
+<l:l i="10">Ç¡</l:l>
+<l:l i="10">Ǻ</l:l>
+<l:l i="10">Ç»</l:l>
+<l:l i="10">È€</l:l>
+<l:l i="10">È</l:l>
+<l:l i="10">È‚</l:l>
+<l:l i="10">ȃ</l:l>
+<l:l i="10">Ȧ</l:l>
+<l:l i="10">ȧ</l:l>
+<l:l i="10">Ḁ</l:l>
+<l:l i="10">á¸</l:l>
+<l:l i="10">ẚ</l:l>
+<l:l i="10">Ạ</l:l>
+<l:l i="10">ạ</l:l>
+<l:l i="10">Ả</l:l>
+<l:l i="10">ả</l:l>
+<l:l i="10">Ấ</l:l>
+<l:l i="10">ấ</l:l>
+<l:l i="10">Ầ</l:l>
+<l:l i="10">ầ</l:l>
+<l:l i="10">Ẩ</l:l>
+<l:l i="10">ẩ</l:l>
+<l:l i="10">Ẫ</l:l>
+<l:l i="10">ẫ</l:l>
+<l:l i="10">Ậ</l:l>
+<l:l i="10">ậ</l:l>
+<l:l i="10">Ắ</l:l>
+<l:l i="10">ắ</l:l>
+<l:l i="10">Ằ</l:l>
+<l:l i="10">ằ</l:l>
+<l:l i="10">Ẳ</l:l>
+<l:l i="10">ẳ</l:l>
+<l:l i="10">Ẵ</l:l>
+<l:l i="10">ẵ</l:l>
+<l:l i="10">Ặ</l:l>
+<l:l i="10">ặ</l:l>
+<l:l i="20">B</l:l>
+<l:l i="20">b</l:l>
+<l:l i="20">Æ€</l:l>
+<l:l i="20">Æ</l:l>
+<l:l i="20">É“</l:l>
+<l:l i="20">Æ‚</l:l>
+<l:l i="20">ƃ</l:l>
+<l:l i="20">Ḃ</l:l>
+<l:l i="20">ḃ</l:l>
+<l:l i="20">Ḅ</l:l>
+<l:l i="20">ḅ</l:l>
+<l:l i="20">Ḇ</l:l>
+<l:l i="20">ḇ</l:l>
+<l:l i="30">C</l:l>
+<l:l i="30">c</l:l>
+<l:l i="30">Ç</l:l>
+<l:l i="30">ç</l:l>
+<l:l i="30">Ć</l:l>
+<l:l i="30">ć</l:l>
+<l:l i="30">Ĉ</l:l>
+<l:l i="30">ĉ</l:l>
+<l:l i="30">ÄŠ</l:l>
+<l:l i="30">Ä‹</l:l>
+<l:l i="30">Č</l:l>
+<l:l i="30">Ä</l:l>
+<l:l i="30">Ƈ</l:l>
+<l:l i="30">ƈ</l:l>
+<l:l i="30">É•</l:l>
+<l:l i="30">Ḉ</l:l>
+<l:l i="30">ḉ</l:l>
+<l:l i="40">D</l:l>
+<l:l i="40">d</l:l>
+<l:l i="40">ÄŽ</l:l>
+<l:l i="40">Ä</l:l>
+<l:l i="40">Ä</l:l>
+<l:l i="40">Ä‘</l:l>
+<l:l i="40">ÆŠ</l:l>
+<l:l i="40">É—</l:l>
+<l:l i="40">Æ‹</l:l>
+<l:l i="40">ƌ</l:l>
+<l:l i="40">Ç…</l:l>
+<l:l i="40">Dz</l:l>
+<l:l i="40">È¡</l:l>
+<l:l i="40">É–</l:l>
+<l:l i="40">Ḋ</l:l>
+<l:l i="40">ḋ</l:l>
+<l:l i="40">Ḍ</l:l>
+<l:l i="40">á¸</l:l>
+<l:l i="40">Ḏ</l:l>
+<l:l i="40">á¸</l:l>
+<l:l i="40">á¸</l:l>
+<l:l i="40">ḑ</l:l>
+<l:l i="40">Ḓ</l:l>
+<l:l i="40">ḓ</l:l>
+<l:l i="50">E</l:l>
+<l:l i="50">e</l:l>
+<l:l i="50">È</l:l>
+<l:l i="50">è</l:l>
+<l:l i="50">É</l:l>
+<l:l i="50">é</l:l>
+<l:l i="50">Ê</l:l>
+<l:l i="50">ê</l:l>
+<l:l i="50">Ë</l:l>
+<l:l i="50">ë</l:l>
+<l:l i="50">Ä’</l:l>
+<l:l i="50">Ä“</l:l>
+<l:l i="50">Ä”</l:l>
+<l:l i="50">Ä•</l:l>
+<l:l i="50">Ä–</l:l>
+<l:l i="50">Ä—</l:l>
+<l:l i="50">Ę</l:l>
+<l:l i="50">Ä™</l:l>
+<l:l i="50">Äš</l:l>
+<l:l i="50">Ä›</l:l>
+<l:l i="50">È„</l:l>
+<l:l i="50">È…</l:l>
+<l:l i="50">Ȇ</l:l>
+<l:l i="50">ȇ</l:l>
+<l:l i="50">Ȩ</l:l>
+<l:l i="50">È©</l:l>
+<l:l i="50">Ḕ</l:l>
+<l:l i="50">ḕ</l:l>
+<l:l i="50">Ḗ</l:l>
+<l:l i="50">ḗ</l:l>
+<l:l i="50">Ḙ</l:l>
+<l:l i="50">ḙ</l:l>
+<l:l i="50">Ḛ</l:l>
+<l:l i="50">ḛ</l:l>
+<l:l i="50">Ḝ</l:l>
+<l:l i="50">á¸</l:l>
+<l:l i="50">Ẹ</l:l>
+<l:l i="50">ẹ</l:l>
+<l:l i="50">Ẻ</l:l>
+<l:l i="50">ẻ</l:l>
+<l:l i="50">Ẽ</l:l>
+<l:l i="50">ẽ</l:l>
+<l:l i="50">Ế</l:l>
+<l:l i="50">ế</l:l>
+<l:l i="50">Ề</l:l>
+<l:l i="50">á»</l:l>
+<l:l i="50">Ể</l:l>
+<l:l i="50">ể</l:l>
+<l:l i="50">Ễ</l:l>
+<l:l i="50">á»…</l:l>
+<l:l i="50">Ệ</l:l>
+<l:l i="50">ệ</l:l>
+<l:l i="60">F</l:l>
+<l:l i="60">f</l:l>
+<l:l i="60">Æ‘</l:l>
+<l:l i="60">Æ’</l:l>
+<l:l i="60">Ḟ</l:l>
+<l:l i="60">ḟ</l:l>
+<l:l i="70">G</l:l>
+<l:l i="70">g</l:l>
+<l:l i="70">Ĝ</l:l>
+<l:l i="70">Ä</l:l>
+<l:l i="70">Äž</l:l>
+<l:l i="70">ÄŸ</l:l>
+<l:l i="70">Ä </l:l>
+<l:l i="70">Ä¡</l:l>
+<l:l i="70">Ä¢</l:l>
+<l:l i="70">Ä£</l:l>
+<l:l i="70">Æ“</l:l>
+<l:l i="70">É </l:l>
+<l:l i="70">Ǥ</l:l>
+<l:l i="70">Ç¥</l:l>
+<l:l i="70">Ǧ</l:l>
+<l:l i="70">ǧ</l:l>
+<l:l i="70">Ç´</l:l>
+<l:l i="70">ǵ</l:l>
+<l:l i="70">Ḡ</l:l>
+<l:l i="70">ḡ</l:l>
+<l:l i="80">H</l:l>
+<l:l i="80">h</l:l>
+<l:l i="80">Ĥ</l:l>
+<l:l i="80">Ä¥</l:l>
+<l:l i="80">Ħ</l:l>
+<l:l i="80">ħ</l:l>
+<l:l i="80">Èž</l:l>
+<l:l i="80">ÈŸ</l:l>
+<l:l i="80">ɦ</l:l>
+<l:l i="80">Ḣ</l:l>
+<l:l i="80">ḣ</l:l>
+<l:l i="80">Ḥ</l:l>
+<l:l i="80">ḥ</l:l>
+<l:l i="80">Ḧ</l:l>
+<l:l i="80">ḧ</l:l>
+<l:l i="80">Ḩ</l:l>
+<l:l i="80">ḩ</l:l>
+<l:l i="80">Ḫ</l:l>
+<l:l i="80">ḫ</l:l>
+<l:l i="80">ẖ</l:l>
+<l:l i="90">I</l:l>
+<l:l i="90">i</l:l>
+<l:l i="90">Ì</l:l>
+<l:l i="90">ì</l:l>
+<l:l i="90">Ã</l:l>
+<l:l i="90">í</l:l>
+<l:l i="90">ÃŽ</l:l>
+<l:l i="90">î</l:l>
+<l:l i="90">Ã</l:l>
+<l:l i="90">ï</l:l>
+<l:l i="90">Ĩ</l:l>
+<l:l i="90">Ä©</l:l>
+<l:l i="90">Ī</l:l>
+<l:l i="90">Ä«</l:l>
+<l:l i="90">Ĭ</l:l>
+<l:l i="90">Ä­</l:l>
+<l:l i="90">Ä®</l:l>
+<l:l i="90">į</l:l>
+<l:l i="90">Ä°</l:l>
+<l:l i="90">Æ—</l:l>
+<l:l i="90">ɨ</l:l>
+<l:l i="90">Ç</l:l>
+<l:l i="90">Ç</l:l>
+<l:l i="90">Ȉ</l:l>
+<l:l i="90">ȉ</l:l>
+<l:l i="90">ÈŠ</l:l>
+<l:l i="90">È‹</l:l>
+<l:l i="90">Ḭ</l:l>
+<l:l i="90">ḭ</l:l>
+<l:l i="90">Ḯ</l:l>
+<l:l i="90">ḯ</l:l>
+<l:l i="90">Ỉ</l:l>
+<l:l i="90">ỉ</l:l>
+<l:l i="90">Ị</l:l>
+<l:l i="90">ị</l:l>
+<l:l i="100">J</l:l>
+<l:l i="100">j</l:l>
+<l:l i="100">Ä´</l:l>
+<l:l i="100">ĵ</l:l>
+<l:l i="100">Ç°</l:l>
+<l:l i="100">Ê</l:l>
+<l:l i="110">K</l:l>
+<l:l i="110">k</l:l>
+<l:l i="110">Ķ</l:l>
+<l:l i="110">Ä·</l:l>
+<l:l i="110">Ƙ</l:l>
+<l:l i="110">Æ™</l:l>
+<l:l i="110">Ǩ</l:l>
+<l:l i="110">Ç©</l:l>
+<l:l i="110">Ḱ</l:l>
+<l:l i="110">ḱ</l:l>
+<l:l i="110">Ḳ</l:l>
+<l:l i="110">ḳ</l:l>
+<l:l i="110">Ḵ</l:l>
+<l:l i="110">ḵ</l:l>
+<l:l i="120">L</l:l>
+<l:l i="120">l</l:l>
+<l:l i="120">Ĺ</l:l>
+<l:l i="120">ĺ</l:l>
+<l:l i="120">Ä»</l:l>
+<l:l i="120">ļ</l:l>
+<l:l i="120">Ľ</l:l>
+<l:l i="120">ľ</l:l>
+<l:l i="120">Ä¿</l:l>
+<l:l i="120">Å€</l:l>
+<l:l i="120">Å</l:l>
+<l:l i="120">Å‚</l:l>
+<l:l i="120">Æš</l:l>
+<l:l i="120">Lj</l:l>
+<l:l i="120">È´</l:l>
+<l:l i="120">É«</l:l>
+<l:l i="120">ɬ</l:l>
+<l:l i="120">É­</l:l>
+<l:l i="120">Ḷ</l:l>
+<l:l i="120">ḷ</l:l>
+<l:l i="120">Ḹ</l:l>
+<l:l i="120">ḹ</l:l>
+<l:l i="120">Ḻ</l:l>
+<l:l i="120">ḻ</l:l>
+<l:l i="120">Ḽ</l:l>
+<l:l i="120">ḽ</l:l>
+<l:l i="130">M</l:l>
+<l:l i="130">m</l:l>
+<l:l i="130">ɱ</l:l>
+<l:l i="130">Ḿ</l:l>
+<l:l i="130">ḿ</l:l>
+<l:l i="130">á¹€</l:l>
+<l:l i="130">á¹</l:l>
+<l:l i="130">Ṃ</l:l>
+<l:l i="130">ṃ</l:l>
+<l:l i="140">N</l:l>
+<l:l i="140">n</l:l>
+<l:l i="140">Ñ</l:l>
+<l:l i="140">ñ</l:l>
+<l:l i="140">Ń</l:l>
+<l:l i="140">Å„</l:l>
+<l:l i="140">Å…</l:l>
+<l:l i="140">ņ</l:l>
+<l:l i="140">Ň</l:l>
+<l:l i="140">ň</l:l>
+<l:l i="140">Æ</l:l>
+<l:l i="140">ɲ</l:l>
+<l:l i="140">Æž</l:l>
+<l:l i="140">È </l:l>
+<l:l i="140">Ç‹</l:l>
+<l:l i="140">Ǹ</l:l>
+<l:l i="140">ǹ</l:l>
+<l:l i="140">ȵ</l:l>
+<l:l i="140">ɳ</l:l>
+<l:l i="140">Ṅ</l:l>
+<l:l i="140">á¹…</l:l>
+<l:l i="140">Ṇ</l:l>
+<l:l i="140">ṇ</l:l>
+<l:l i="140">Ṉ</l:l>
+<l:l i="140">ṉ</l:l>
+<l:l i="140">Ṋ</l:l>
+<l:l i="140">ṋ</l:l>
+<l:l i="150">O</l:l>
+<l:l i="150">o</l:l>
+<l:l i="150">Ã’</l:l>
+<l:l i="150">ò</l:l>
+<l:l i="150">Ó</l:l>
+<l:l i="150">ó</l:l>
+<l:l i="150">Ô</l:l>
+<l:l i="150">ô</l:l>
+<l:l i="150">Õ</l:l>
+<l:l i="150">õ</l:l>
+<l:l i="150">Ö</l:l>
+<l:l i="150">ö</l:l>
+<l:l i="150">Ø</l:l>
+<l:l i="150">ø</l:l>
+<l:l i="150">Ō</l:l>
+<l:l i="150">Å</l:l>
+<l:l i="150">ÅŽ</l:l>
+<l:l i="150">Å</l:l>
+<l:l i="150">Å</l:l>
+<l:l i="150">Å‘</l:l>
+<l:l i="150">ÆŸ</l:l>
+<l:l i="150">Æ </l:l>
+<l:l i="150">Æ¡</l:l>
+<l:l i="150">Ç‘</l:l>
+<l:l i="150">Ç’</l:l>
+<l:l i="150">Ǫ</l:l>
+<l:l i="150">Ç«</l:l>
+<l:l i="150">Ǭ</l:l>
+<l:l i="150">Ç­</l:l>
+<l:l i="150">Ǿ</l:l>
+<l:l i="150">Ç¿</l:l>
+<l:l i="150">Ȍ</l:l>
+<l:l i="150">È</l:l>
+<l:l i="150">ÈŽ</l:l>
+<l:l i="150">È</l:l>
+<l:l i="150">Ȫ</l:l>
+<l:l i="150">È«</l:l>
+<l:l i="150">Ȭ</l:l>
+<l:l i="150">È­</l:l>
+<l:l i="150">È®</l:l>
+<l:l i="150">ȯ</l:l>
+<l:l i="150">È°</l:l>
+<l:l i="150">ȱ</l:l>
+<l:l i="150">Ṍ</l:l>
+<l:l i="150">á¹</l:l>
+<l:l i="150">Ṏ</l:l>
+<l:l i="150">á¹</l:l>
+<l:l i="150">á¹</l:l>
+<l:l i="150">ṑ</l:l>
+<l:l i="150">á¹’</l:l>
+<l:l i="150">ṓ</l:l>
+<l:l i="150">Ọ</l:l>
+<l:l i="150">á»</l:l>
+<l:l i="150">Ỏ</l:l>
+<l:l i="150">á»</l:l>
+<l:l i="150">á»</l:l>
+<l:l i="150">ố</l:l>
+<l:l i="150">á»’</l:l>
+<l:l i="150">ồ</l:l>
+<l:l i="150">á»”</l:l>
+<l:l i="150">ổ</l:l>
+<l:l i="150">á»–</l:l>
+<l:l i="150">á»—</l:l>
+<l:l i="150">Ộ</l:l>
+<l:l i="150">á»™</l:l>
+<l:l i="150">Ớ</l:l>
+<l:l i="150">á»›</l:l>
+<l:l i="150">Ờ</l:l>
+<l:l i="150">á»</l:l>
+<l:l i="150">Ở</l:l>
+<l:l i="150">ở</l:l>
+<l:l i="150">á» </l:l>
+<l:l i="150">ỡ</l:l>
+<l:l i="150">Ợ</l:l>
+<l:l i="150">ợ</l:l>
+<l:l i="160">P</l:l>
+<l:l i="160">p</l:l>
+<l:l i="160">Ƥ</l:l>
+<l:l i="160">Æ¥</l:l>
+<l:l i="160">á¹”</l:l>
+<l:l i="160">ṕ</l:l>
+<l:l i="160">á¹–</l:l>
+<l:l i="160">á¹—</l:l>
+<l:l i="170">Q</l:l>
+<l:l i="170">q</l:l>
+<l:l i="170">Ê </l:l>
+<l:l i="180">R</l:l>
+<l:l i="180">r</l:l>
+<l:l i="180">Å”</l:l>
+<l:l i="180">Å•</l:l>
+<l:l i="180">Å–</l:l>
+<l:l i="180">Å—</l:l>
+<l:l i="180">Ř</l:l>
+<l:l i="180">Å™</l:l>
+<l:l i="180">È</l:l>
+<l:l i="180">È‘</l:l>
+<l:l i="180">È’</l:l>
+<l:l i="180">È“</l:l>
+<l:l i="180">ɼ</l:l>
+<l:l i="180">ɽ</l:l>
+<l:l i="180">ɾ</l:l>
+<l:l i="180">Ṙ</l:l>
+<l:l i="180">á¹™</l:l>
+<l:l i="180">Ṛ</l:l>
+<l:l i="180">á¹›</l:l>
+<l:l i="180">Ṝ</l:l>
+<l:l i="180">á¹</l:l>
+<l:l i="180">Ṟ</l:l>
+<l:l i="180">ṟ</l:l>
+<l:l i="190">S</l:l>
+<l:l i="190">s</l:l>
+<l:l i="190">Åš</l:l>
+<l:l i="190">Å›</l:l>
+<l:l i="190">Ŝ</l:l>
+<l:l i="190">Å</l:l>
+<l:l i="190">Åž</l:l>
+<l:l i="190">ÅŸ</l:l>
+<l:l i="190">Å </l:l>
+<l:l i="190">Å¡</l:l>
+<l:l i="190">Ș</l:l>
+<l:l i="190">È™</l:l>
+<l:l i="190">Ê‚</l:l>
+<l:l i="190">á¹ </l:l>
+<l:l i="190">ṡ</l:l>
+<l:l i="190">á¹¢</l:l>
+<l:l i="190">á¹£</l:l>
+<l:l i="190">Ṥ</l:l>
+<l:l i="190">á¹¥</l:l>
+<l:l i="190">Ṧ</l:l>
+<l:l i="190">ṧ</l:l>
+<l:l i="190">Ṩ</l:l>
+<l:l i="190">ṩ</l:l>
+<l:l i="200">T</l:l>
+<l:l i="200">t</l:l>
+<l:l i="200">Å¢</l:l>
+<l:l i="200">Å£</l:l>
+<l:l i="200">Ť</l:l>
+<l:l i="200">Å¥</l:l>
+<l:l i="200">Ŧ</l:l>
+<l:l i="200">ŧ</l:l>
+<l:l i="200">Æ«</l:l>
+<l:l i="200">Ƭ</l:l>
+<l:l i="200">Æ­</l:l>
+<l:l i="200">Æ®</l:l>
+<l:l i="200">ʈ</l:l>
+<l:l i="200">Èš</l:l>
+<l:l i="200">È›</l:l>
+<l:l i="200">ȶ</l:l>
+<l:l i="200">Ṫ</l:l>
+<l:l i="200">ṫ</l:l>
+<l:l i="200">Ṭ</l:l>
+<l:l i="200">á¹­</l:l>
+<l:l i="200">á¹®</l:l>
+<l:l i="200">ṯ</l:l>
+<l:l i="200">á¹°</l:l>
+<l:l i="200">á¹±</l:l>
+<l:l i="200">ẗ</l:l>
+<l:l i="210">U</l:l>
+<l:l i="210">u</l:l>
+<l:l i="210">Ù</l:l>
+<l:l i="210">ù</l:l>
+<l:l i="210">Ú</l:l>
+<l:l i="210">ú</l:l>
+<l:l i="210">Û</l:l>
+<l:l i="210">û</l:l>
+<l:l i="210">Ü</l:l>
+<l:l i="210">ü</l:l>
+<l:l i="210">Ũ</l:l>
+<l:l i="210">Å©</l:l>
+<l:l i="210">Ū</l:l>
+<l:l i="210">Å«</l:l>
+<l:l i="210">Ŭ</l:l>
+<l:l i="210">Å­</l:l>
+<l:l i="210">Å®</l:l>
+<l:l i="210">ů</l:l>
+<l:l i="210">Å°</l:l>
+<l:l i="210">ű</l:l>
+<l:l i="210">Ų</l:l>
+<l:l i="210">ų</l:l>
+<l:l i="210">Ư</l:l>
+<l:l i="210">Æ°</l:l>
+<l:l i="210">Ç“</l:l>
+<l:l i="210">Ç”</l:l>
+<l:l i="210">Ç•</l:l>
+<l:l i="210">Ç–</l:l>
+<l:l i="210">Ç—</l:l>
+<l:l i="210">ǘ</l:l>
+<l:l i="210">Ç™</l:l>
+<l:l i="210">Çš</l:l>
+<l:l i="210">Ç›</l:l>
+<l:l i="210">ǜ</l:l>
+<l:l i="210">È”</l:l>
+<l:l i="210">È•</l:l>
+<l:l i="210">È–</l:l>
+<l:l i="210">È—</l:l>
+<l:l i="210">á¹²</l:l>
+<l:l i="210">á¹³</l:l>
+<l:l i="210">á¹´</l:l>
+<l:l i="210">á¹µ</l:l>
+<l:l i="210">Ṷ</l:l>
+<l:l i="210">á¹·</l:l>
+<l:l i="210">Ṹ</l:l>
+<l:l i="210">á¹¹</l:l>
+<l:l i="210">Ṻ</l:l>
+<l:l i="210">á¹»</l:l>
+<l:l i="210">Ụ</l:l>
+<l:l i="210">ụ</l:l>
+<l:l i="210">Ủ</l:l>
+<l:l i="210">ủ</l:l>
+<l:l i="210">Ứ</l:l>
+<l:l i="210">ứ</l:l>
+<l:l i="210">Ừ</l:l>
+<l:l i="210">ừ</l:l>
+<l:l i="210">Ử</l:l>
+<l:l i="210">á»­</l:l>
+<l:l i="210">á»®</l:l>
+<l:l i="210">ữ</l:l>
+<l:l i="210">á»°</l:l>
+<l:l i="210">á»±</l:l>
+<l:l i="220">V</l:l>
+<l:l i="220">v</l:l>
+<l:l i="220">Ʋ</l:l>
+<l:l i="220">Ê‹</l:l>
+<l:l i="220">á¹¼</l:l>
+<l:l i="220">á¹½</l:l>
+<l:l i="220">á¹¾</l:l>
+<l:l i="220">ṿ</l:l>
+<l:l i="230">W</l:l>
+<l:l i="230">w</l:l>
+<l:l i="230">Å´</l:l>
+<l:l i="230">ŵ</l:l>
+<l:l i="230">Ẁ</l:l>
+<l:l i="230">áº</l:l>
+<l:l i="230">Ẃ</l:l>
+<l:l i="230">ẃ</l:l>
+<l:l i="230">Ẅ</l:l>
+<l:l i="230">ẅ</l:l>
+<l:l i="230">Ẇ</l:l>
+<l:l i="230">ẇ</l:l>
+<l:l i="230">Ẉ</l:l>
+<l:l i="230">ẉ</l:l>
+<l:l i="230">ẘ</l:l>
+<l:l i="240">X</l:l>
+<l:l i="240">x</l:l>
+<l:l i="240">Ẋ</l:l>
+<l:l i="240">ẋ</l:l>
+<l:l i="240">Ẍ</l:l>
+<l:l i="240">áº</l:l>
+<l:l i="250">Y</l:l>
+<l:l i="250">y</l:l>
+<l:l i="250">Ã</l:l>
+<l:l i="250">ý</l:l>
+<l:l i="250">ÿ</l:l>
+<l:l i="250">Ÿ</l:l>
+<l:l i="250">Ŷ</l:l>
+<l:l i="250">Å·</l:l>
+<l:l i="250">Ƴ</l:l>
+<l:l i="250">Æ´</l:l>
+<l:l i="250">Ȳ</l:l>
+<l:l i="250">ȳ</l:l>
+<l:l i="250">Ẏ</l:l>
+<l:l i="250">áº</l:l>
+<l:l i="250">ẙ</l:l>
+<l:l i="250">Ỳ</l:l>
+<l:l i="250">ỳ</l:l>
+<l:l i="250">á»´</l:l>
+<l:l i="250">ỵ</l:l>
+<l:l i="250">Ỷ</l:l>
+<l:l i="250">á»·</l:l>
+<l:l i="250">Ỹ</l:l>
+<l:l i="250">ỹ</l:l>
+<l:l i="260">Z</l:l>
+<l:l i="260">z</l:l>
+<l:l i="260">Ź</l:l>
+<l:l i="260">ź</l:l>
+<l:l i="260">Å»</l:l>
+<l:l i="260">ż</l:l>
+<l:l i="260">Ž</l:l>
+<l:l i="260">ž</l:l>
+<l:l i="260">Ƶ</l:l>
+<l:l i="260">ƶ</l:l>
+<l:l i="260">Ȥ</l:l>
+<l:l i="260">È¥</l:l>
+<l:l i="260">Ê</l:l>
+<l:l i="260">Ê‘</l:l>
+<l:l i="260">áº</l:l>
+<l:l i="260">ẑ</l:l>
+<l:l i="260">Ẓ</l:l>
+<l:l i="260">ẓ</l:l>
+<l:l i="260">Ẕ</l:l>
+<l:l i="260">ẕ</l:l>
+</l:letters>
+</l:l10n>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/titles.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/titles.xsl
new file mode 100644
index 0000000..84fcf79
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/titles.xsl
@@ -0,0 +1,805 @@
+<?xml version='1.0'?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:doc="http://nwalsh.com/xsl/documentation/1.0"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ exclude-result-prefixes="doc"
+ version='1.0'>
+
+<!-- ********************************************************************
+ $Id: titles.xsl 8599 2010-03-20 10:47:36Z mzjn $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<!-- ==================================================================== -->
+
+<!-- title markup -->
+
+<doc:mode mode="title.markup" xmlns="">
+<refpurpose>Provides access to element titles</refpurpose>
+<refdescription id="title.markup-desc">
+<para>Processing an element in the
+<literal role="mode">title.markup</literal> mode produces the
+title of the element. This does not include the label.
+</para>
+</refdescription>
+</doc:mode>
+
+<xsl:template match="*" mode="title.markup">
+ <xsl:param name="allow-anchors" select="0"/>
+ <xsl:param name="verbose" select="1"/>
+ <xsl:choose>
+ <!-- * FIXME: this should handle other *info elements as well -->
+ <!-- * but this is good enough for now. -->
+ <xsl:when test="title|info/title">
+ <xsl:apply-templates select="(title|info/title)[1]" mode="title.markup">
+ <xsl:with-param name="allow-anchors" select="$allow-anchors"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:when test="local-name(.) = 'partintro'">
+ <!-- partintro's don't have titles, use the parent (part or reference)
+ title instead. -->
+ <xsl:apply-templates select="parent::*" mode="title.markup"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:if test="$verbose != 0">
+ <xsl:message>
+ <xsl:text>Request for title of element with no title: </xsl:text>
+ <xsl:value-of select="local-name(.)"/>
+ <xsl:choose>
+ <xsl:when test="@id">
+ <xsl:text> (id="</xsl:text>
+ <xsl:value-of select="@id"/>
+ <xsl:text>")</xsl:text>
+ </xsl:when>
+ <xsl:when test="@xml:id">
+ <xsl:text> (xml:id="</xsl:text>
+ <xsl:value-of select="@xml:id"/>
+ <xsl:text>")</xsl:text>
+ </xsl:when>
+ </xsl:choose>
+ </xsl:message>
+ </xsl:if>
+ <xsl:text>???TITLE???</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="title" mode="title.markup">
+ <xsl:param name="allow-anchors" select="0"/>
+
+ <xsl:choose>
+ <xsl:when test="$allow-anchors != 0">
+ <xsl:apply-templates/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates mode="no.anchor.mode"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- only occurs in HTML Tables! -->
+<xsl:template match="caption" mode="title.markup">
+ <xsl:param name="allow-anchors" select="0"/>
+
+ <xsl:choose>
+ <xsl:when test="$allow-anchors != 0">
+ <xsl:apply-templates/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates mode="no.anchor.mode"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="set" mode="title.markup">
+ <xsl:param name="allow-anchors" select="0"/>
+ <xsl:apply-templates select="(setinfo/title|info/title|title)[1]"
+ mode="title.markup">
+ <xsl:with-param name="allow-anchors" select="$allow-anchors"/>
+ </xsl:apply-templates>
+</xsl:template>
+
+<xsl:template match="book" mode="title.markup">
+ <xsl:param name="allow-anchors" select="0"/>
+ <xsl:apply-templates select="(bookinfo/title|info/title|title)[1]"
+ mode="title.markup">
+ <xsl:with-param name="allow-anchors" select="$allow-anchors"/>
+ </xsl:apply-templates>
+</xsl:template>
+
+<xsl:template match="part" mode="title.markup">
+ <xsl:param name="allow-anchors" select="0"/>
+ <xsl:apply-templates select="(partinfo/title|info/title|docinfo/title|title)[1]"
+ mode="title.markup">
+ <xsl:with-param name="allow-anchors" select="$allow-anchors"/>
+ </xsl:apply-templates>
+</xsl:template>
+
+<xsl:template match="preface|chapter|appendix" mode="title.markup">
+ <xsl:param name="allow-anchors" select="0"/>
+
+<!--
+ <xsl:message>
+ <xsl:value-of select="local-name(.)"/>
+ <xsl:text> </xsl:text>
+ <xsl:value-of select="$allow-anchors"/>
+ </xsl:message>
+-->
+
+ <xsl:variable name="title" select="(docinfo/title
+ |info/title
+ |prefaceinfo/title
+ |chapterinfo/title
+ |appendixinfo/title
+ |title)[1]"/>
+ <xsl:apply-templates select="$title" mode="title.markup">
+ <xsl:with-param name="allow-anchors" select="$allow-anchors"/>
+ </xsl:apply-templates>
+</xsl:template>
+
+<xsl:template match="dedication" mode="title.markup">
+ <xsl:param name="allow-anchors" select="0"/>
+ <xsl:choose>
+ <xsl:when test="title|info/title">
+ <xsl:apply-templates select="(title|info/title)[1]" mode="title.markup">
+ <xsl:with-param name="allow-anchors" select="$allow-anchors"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'Dedication'"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="acknowledgements" mode="title.markup">
+ <xsl:param name="allow-anchors" select="0"/>
+ <xsl:choose>
+ <xsl:when test="title|info/title">
+ <xsl:apply-templates select="(title|info/title)[1]" mode="title.markup">
+ <xsl:with-param name="allow-anchors" select="$allow-anchors"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'Acknowledgements'"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="colophon" mode="title.markup">
+ <xsl:param name="allow-anchors" select="0"/>
+ <xsl:choose>
+ <xsl:when test="title|info/title">
+ <xsl:apply-templates select="(title|info/title)[1]" mode="title.markup">
+ <xsl:with-param name="allow-anchors" select="$allow-anchors"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'Colophon'"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="article" mode="title.markup">
+ <xsl:param name="allow-anchors" select="0"/>
+ <xsl:variable name="title" select="(artheader/title
+ |articleinfo/title
+ |info/title
+ |title)[1]"/>
+
+ <xsl:apply-templates select="$title" mode="title.markup">
+ <xsl:with-param name="allow-anchors" select="$allow-anchors"/>
+ </xsl:apply-templates>
+</xsl:template>
+
+<xsl:template match="reference" mode="title.markup">
+ <xsl:param name="allow-anchors" select="0"/>
+ <xsl:apply-templates select="(referenceinfo/title|docinfo/title|info/title|title)[1]"
+ mode="title.markup">
+ <xsl:with-param name="allow-anchors" select="$allow-anchors"/>
+ </xsl:apply-templates>
+</xsl:template>
+
+<xsl:template match="refentry" mode="title.markup">
+ <xsl:param name="allow-anchors" select="0"/>
+ <xsl:variable name="refmeta" select=".//refmeta"/>
+ <xsl:variable name="refentrytitle" select="$refmeta//refentrytitle"/>
+ <xsl:variable name="refnamediv" select=".//refnamediv"/>
+ <xsl:variable name="refname" select="$refnamediv//refname"/>
+ <xsl:variable name="refdesc" select="$refnamediv//refdescriptor"/>
+
+ <xsl:variable name="title">
+ <xsl:choose>
+ <xsl:when test="$refentrytitle">
+ <xsl:apply-templates select="$refentrytitle[1]" mode="title.markup"/>
+ </xsl:when>
+ <xsl:when test="$refdesc">
+ <xsl:apply-templates select="$refdesc" mode="title.markup"/>
+ </xsl:when>
+ <xsl:when test="$refname">
+ <xsl:apply-templates select="$refname[1]" mode="title.markup"/>
+ </xsl:when>
+ <xsl:otherwise>REFENTRY WITHOUT TITLE???</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:copy-of select="$title"/>
+</xsl:template>
+
+<xsl:template match="refentrytitle|refname|refdescriptor" mode="title.markup">
+ <xsl:param name="allow-anchors" select="0"/>
+ <xsl:choose>
+ <xsl:when test="$allow-anchors != 0">
+ <xsl:apply-templates/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates mode="no.anchor.mode"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="section
+ |sect1|sect2|sect3|sect4|sect5
+ |refsect1|refsect2|refsect3|refsection
+ |simplesect"
+ mode="title.markup">
+ <xsl:param name="allow-anchors" select="0"/>
+ <xsl:variable name="title" select="(info/title
+ |sectioninfo/title
+ |sect1info/title
+ |sect2info/title
+ |sect3info/title
+ |sect4info/title
+ |sect5info/title
+ |refsect1info/title
+ |refsect2info/title
+ |refsect3info/title
+ |refsectioninfo/title
+ |title)[1]"/>
+
+ <xsl:apply-templates select="$title" mode="title.markup">
+ <xsl:with-param name="allow-anchors" select="$allow-anchors"/>
+ </xsl:apply-templates>
+</xsl:template>
+
+<xsl:template match="bridgehead" mode="title.markup">
+ <xsl:apply-templates mode="title.markup"/>
+</xsl:template>
+
+<xsl:template match="refsynopsisdiv" mode="title.markup">
+ <xsl:param name="allow-anchors" select="0"/>
+ <xsl:choose>
+ <xsl:when test="title|info/title">
+ <xsl:apply-templates select="(title|info/title)[1]" mode="title.markup">
+ <xsl:with-param name="allow-anchors" select="$allow-anchors"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'RefSynopsisDiv'"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="bibliography" mode="title.markup">
+ <xsl:param name="allow-anchors" select="0"/>
+ <xsl:variable name="title" select="(bibliographyinfo/title|info/title|title)[1]"/>
+ <xsl:choose>
+ <xsl:when test="$title">
+ <xsl:apply-templates select="$title" mode="title.markup">
+ <xsl:with-param name="allow-anchors" select="$allow-anchors"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'Bibliography'"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="glossary" mode="title.markup">
+ <xsl:param name="allow-anchors" select="0"/>
+ <xsl:variable name="title" select="(glossaryinfo/title|info/title|title)[1]"/>
+ <xsl:choose>
+ <xsl:when test="$title">
+ <xsl:apply-templates select="$title" mode="title.markup">
+ <xsl:with-param name="allow-anchors" select="$allow-anchors"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="gentext.element.name">
+ <xsl:with-param name="element.name" select="local-name(.)"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="glossdiv" mode="title.markup">
+ <xsl:param name="allow-anchors" select="0"/>
+ <xsl:variable name="title" select="(info/title|title)[1]"/>
+ <xsl:choose>
+ <xsl:when test="$title">
+ <xsl:apply-templates select="$title" mode="title.markup">
+ <xsl:with-param name="allow-anchors" select="$allow-anchors"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:message>ERROR: glossdiv missing its required title</xsl:message>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="glossentry" mode="title.markup">
+ <xsl:param name="allow-anchors" select="0"/>
+ <xsl:apply-templates select="glossterm" mode="title.markup">
+ <xsl:with-param name="allow-anchors" select="$allow-anchors"/>
+ </xsl:apply-templates>
+</xsl:template>
+
+<xsl:template match="glossterm|firstterm" mode="title.markup">
+ <xsl:param name="allow-anchors" select="0"/>
+
+ <xsl:choose>
+ <xsl:when test="$allow-anchors != 0">
+ <xsl:apply-templates/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates mode="no.anchor.mode"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="index" mode="title.markup">
+ <xsl:param name="allow-anchors" select="0"/>
+ <xsl:variable name="title" select="(indexinfo/title|info/title|title)[1]"/>
+ <xsl:choose>
+ <xsl:when test="$title">
+ <xsl:apply-templates select="$title" mode="title.markup">
+ <xsl:with-param name="allow-anchors" select="$allow-anchors"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'Index'"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="setindex" mode="title.markup">
+ <xsl:param name="allow-anchors" select="0"/>
+ <xsl:variable name="title" select="(setindexinfo/title|info/title|title)[1]"/>
+ <xsl:choose>
+ <xsl:when test="$title">
+ <xsl:apply-templates select="$title" mode="title.markup">
+ <xsl:with-param name="allow-anchors" select="$allow-anchors"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'SetIndex'"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="figure|example|equation" mode="title.markup">
+ <xsl:param name="allow-anchors" select="0"/>
+ <xsl:apply-templates select="(title|info/title)[1]" mode="title.markup">
+ <xsl:with-param name="allow-anchors" select="$allow-anchors"/>
+ </xsl:apply-templates>
+</xsl:template>
+
+<xsl:template match="table" mode="title.markup">
+ <xsl:param name="allow-anchors" select="0"/>
+ <xsl:apply-templates select="(title|info/title|caption)[1]" mode="title.markup">
+ <xsl:with-param name="allow-anchors" select="$allow-anchors"/>
+ </xsl:apply-templates>
+</xsl:template>
+
+<xsl:template match="procedure" mode="title.markup">
+ <xsl:param name="allow-anchors" select="0"/>
+ <xsl:apply-templates select="(title|info/title)[1]" mode="title.markup">
+ <xsl:with-param name="allow-anchors" select="$allow-anchors"/>
+ </xsl:apply-templates>
+</xsl:template>
+
+<xsl:template match="task" mode="title.markup">
+ <xsl:param name="allow-anchors" select="0"/>
+ <xsl:apply-templates select="(title|info/title)[1]" mode="title.markup">
+ <xsl:with-param name="allow-anchors" select="$allow-anchors"/>
+ </xsl:apply-templates>
+</xsl:template>
+
+<xsl:template match="sidebar" mode="title.markup">
+ <xsl:param name="allow-anchors" select="0"/>
+ <xsl:apply-templates select="(info/title|sidebarinfo/title|title)[1]"
+ mode="title.markup">
+ <xsl:with-param name="allow-anchors" select="$allow-anchors"/>
+ </xsl:apply-templates>
+</xsl:template>
+
+<xsl:template match="abstract" mode="title.markup">
+ <xsl:param name="allow-anchors" select="0"/>
+ <xsl:choose>
+ <xsl:when test="title|info/title">
+ <xsl:apply-templates select="(title|info/title)[1]" mode="title.markup">
+ <xsl:with-param name="allow-anchors" select="$allow-anchors"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'Abstract'"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="caution|tip|warning|important|note" mode="title.markup">
+ <xsl:param name="allow-anchors" select="0"/>
+ <xsl:variable name="title" select="(title|info/title)[1]"/>
+ <xsl:choose>
+ <xsl:when test="$title">
+ <xsl:apply-templates select="$title" mode="title.markup">
+ <xsl:with-param name="allow-anchors" select="$allow-anchors"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key">
+ <xsl:choose>
+ <xsl:when test="local-name(.)='note'">Note</xsl:when>
+ <xsl:when test="local-name(.)='important'">Important</xsl:when>
+ <xsl:when test="local-name(.)='caution'">Caution</xsl:when>
+ <xsl:when test="local-name(.)='warning'">Warning</xsl:when>
+ <xsl:when test="local-name(.)='tip'">Tip</xsl:when>
+ </xsl:choose>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="question" mode="title.markup">
+ <!-- questions don't have titles -->
+ <xsl:text>Question</xsl:text>
+</xsl:template>
+
+<xsl:template match="answer" mode="title.markup">
+ <!-- answers don't have titles -->
+ <xsl:text>Answer</xsl:text>
+</xsl:template>
+
+<xsl:template match="qandaentry" mode="title.markup">
+ <!-- qandaentrys are represented by the first question in them -->
+ <xsl:text>Question</xsl:text>
+</xsl:template>
+
+<xsl:template match="qandaset" mode="title.markup">
+ <xsl:param name="allow-anchors" select="0"/>
+ <xsl:variable name="title" select="(info/title|
+ blockinfo/title|
+ title)[1]"/>
+ <xsl:choose>
+ <xsl:when test="$title">
+ <xsl:apply-templates select="$title" mode="title.markup">
+ <xsl:with-param name="allow-anchors" select="$allow-anchors"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'QandASet'"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="legalnotice" mode="title.markup">
+ <xsl:param name="allow-anchors" select="0"/>
+ <xsl:choose>
+ <xsl:when test="title|info/title">
+ <xsl:apply-templates select="(title|info/title)[1]" mode="title.markup">
+ <xsl:with-param name="allow-anchors" select="$allow-anchors"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'LegalNotice'"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ============================================================ -->
+
+<xsl:template match="*" mode="titleabbrev.markup">
+ <xsl:param name="allow-anchors" select="0"/>
+ <xsl:param name="verbose" select="1"/>
+
+ <xsl:choose>
+ <xsl:when test="titleabbrev">
+ <xsl:apply-templates select="titleabbrev[1]" mode="title.markup">
+ <xsl:with-param name="allow-anchors" select="$allow-anchors"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:when test="info/titleabbrev">
+ <xsl:apply-templates select="info/titleabbrev[1]" mode="title.markup">
+ <xsl:with-param name="allow-anchors" select="$allow-anchors"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="." mode="title.markup">
+ <xsl:with-param name="allow-anchors" select="$allow-anchors"/>
+ <xsl:with-param name="verbose" select="$verbose"/>
+ </xsl:apply-templates>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="book|preface|chapter|appendix" mode="titleabbrev.markup">
+ <xsl:param name="allow-anchors" select="0"/>
+ <xsl:param name="verbose" select="1"/>
+
+ <xsl:variable name="titleabbrev" select="(docinfo/titleabbrev
+ |bookinfo/titleabbrev
+ |info/titleabbrev
+ |prefaceinfo/titleabbrev
+ |chapterinfo/titleabbrev
+ |appendixinfo/titleabbrev
+ |titleabbrev)[1]"/>
+
+ <xsl:choose>
+ <xsl:when test="$titleabbrev">
+ <xsl:apply-templates select="$titleabbrev" mode="title.markup">
+ <xsl:with-param name="allow-anchors" select="$allow-anchors"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="." mode="title.markup">
+ <xsl:with-param name="allow-anchors" select="$allow-anchors"/>
+ <xsl:with-param name="verbose" select="$verbose"/>
+ </xsl:apply-templates>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="article" mode="titleabbrev.markup">
+ <xsl:param name="allow-anchors" select="0"/>
+ <xsl:param name="verbose" select="1"/>
+
+ <xsl:variable name="titleabbrev" select="(artheader/titleabbrev
+ |articleinfo/titleabbrev
+ |info/titleabbrev
+ |titleabbrev)[1]"/>
+
+ <xsl:choose>
+ <xsl:when test="$titleabbrev">
+ <xsl:apply-templates select="$titleabbrev" mode="title.markup">
+ <xsl:with-param name="allow-anchors" select="$allow-anchors"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="." mode="title.markup">
+ <xsl:with-param name="allow-anchors" select="$allow-anchors"/>
+ <xsl:with-param name="verbose" select="$verbose"/>
+ </xsl:apply-templates>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="section
+ |sect1|sect2|sect3|sect4|sect5
+ |refsect1|refsect2|refsect3
+ |simplesect"
+ mode="titleabbrev.markup">
+ <xsl:param name="allow-anchors" select="0"/>
+ <xsl:param name="verbose" select="1"/>
+
+ <xsl:variable name="titleabbrev" select="(info/titleabbrev
+ |sectioninfo/titleabbrev
+ |sect1info/titleabbrev
+ |sect2info/titleabbrev
+ |sect3info/titleabbrev
+ |sect4info/titleabbrev
+ |sect5info/titleabbrev
+ |refsect1info/titleabbrev
+ |refsect2info/titleabbrev
+ |refsect3info/titleabbrev
+ |titleabbrev)[1]"/>
+
+ <xsl:choose>
+ <xsl:when test="$titleabbrev">
+ <xsl:apply-templates select="$titleabbrev" mode="title.markup">
+ <xsl:with-param name="allow-anchors" select="$allow-anchors"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="." mode="title.markup">
+ <xsl:with-param name="allow-anchors" select="$allow-anchors"/>
+ <xsl:with-param name="verbose" select="$verbose"/>
+ </xsl:apply-templates>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="titleabbrev" mode="title.markup">
+ <xsl:param name="allow-anchors" select="0"/>
+
+ <xsl:choose>
+ <xsl:when test="$allow-anchors != 0">
+ <xsl:apply-templates/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates mode="no.anchor.mode"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ============================================================ -->
+
+<xsl:template match="*" mode="no.anchor.mode">
+ <!-- Switch to normal mode if no links -->
+ <xsl:choose>
+ <xsl:when test="descendant-or-self::footnote or
+ descendant-or-self::anchor or
+ descendant-or-self::ulink or
+ descendant-or-self::link or
+ descendant-or-self::olink or
+ descendant-or-self::xref or
+ descendant-or-self::indexterm or
+ (ancestor::title and (@id or @xml:id))">
+
+ <xsl:apply-templates mode="no.anchor.mode"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="."/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="footnote" mode="no.anchor.mode">
+ <!-- nop, suppressed -->
+</xsl:template>
+
+<xsl:template match="anchor" mode="no.anchor.mode">
+ <!-- nop, suppressed -->
+</xsl:template>
+
+<xsl:template match="ulink" mode="no.anchor.mode">
+ <xsl:apply-templates/>
+</xsl:template>
+
+<xsl:template match="link" mode="no.anchor.mode">
+ <xsl:choose>
+ <xsl:when test="count(child::node()) &gt; 0">
+ <!-- If it has content, use it -->
+ <xsl:apply-templates/>
+ </xsl:when>
+ <!-- look for an endterm -->
+ <xsl:when test="@endterm">
+ <xsl:variable name="etargets" select="key('id',@endterm)"/>
+ <xsl:variable name="etarget" select="$etargets[1]"/>
+ <xsl:choose>
+ <xsl:when test="count($etarget) = 0">
+ <xsl:message>
+ <xsl:value-of select="count($etargets)"/>
+ <xsl:text>Endterm points to nonexistent ID: </xsl:text>
+ <xsl:value-of select="@endterm"/>
+ </xsl:message>
+ <xsl:text>???</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="$etarget" mode="endterm"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="olink" mode="no.anchor.mode">
+ <xsl:apply-templates/>
+</xsl:template>
+
+<xsl:template match="indexterm" mode="no.anchor.mode">
+ <!-- nop, suppressed -->
+</xsl:template>
+
+<xsl:template match="xref" mode="no.anchor.mode">
+ <xsl:variable name="targets" select="key('id',@linkend)|key('id',substring-after(@xlink:href,'#'))"/>
+ <xsl:variable name="target" select="$targets[1]"/>
+ <xsl:variable name="refelem" select="local-name($target)"/>
+
+ <xsl:call-template name="check.id.unique">
+ <xsl:with-param name="linkend" select="@linkend"/>
+ </xsl:call-template>
+
+ <xsl:choose>
+ <xsl:when test="count($target) = 0">
+ <xsl:message>
+ <xsl:text>XRef to nonexistent id: </xsl:text>
+ <xsl:value-of select="@linkend"/>
+ <xsl:value-of select="@xlink:href"/>
+ </xsl:message>
+ <xsl:text>???</xsl:text>
+ </xsl:when>
+
+ <xsl:when test="@endterm">
+ <xsl:variable name="etargets" select="key('id',@endterm)"/>
+ <xsl:variable name="etarget" select="$etargets[1]"/>
+ <xsl:choose>
+ <xsl:when test="count($etarget) = 0">
+ <xsl:message>
+ <xsl:value-of select="count($etargets)"/>
+ <xsl:text>Endterm points to nonexistent ID: </xsl:text>
+ <xsl:value-of select="@endterm"/>
+ </xsl:message>
+ <xsl:text>???</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="$etarget" mode="endterm"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+
+ <xsl:when test="$target/@xreflabel">
+ <xsl:call-template name="xref.xreflabel">
+ <xsl:with-param name="target" select="$target"/>
+ </xsl:call-template>
+ </xsl:when>
+
+ <xsl:otherwise>
+
+ <xsl:choose>
+ <!-- Watch out for the case when there is a xref or link inside
+ a title. See bugs #1811721 and #1838136. -->
+ <xsl:when test="not(ancestor::*[@id = $target/@id] or ancestor::*[@xml:id = $target/@xml:id])">
+
+ <xsl:apply-templates select="$target" mode="xref-to-prefix"/>
+
+ <xsl:apply-templates select="$target" mode="xref-to">
+
+ <xsl:with-param name="referrer" select="."/>
+ <xsl:with-param name="xrefstyle">
+ <xsl:choose>
+ <xsl:when test="@role and not(@xrefstyle) and $use.role.as.xrefstyle != 0">
+ <xsl:value-of select="@role"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="@xrefstyle"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:with-param>
+ </xsl:apply-templates>
+
+ <xsl:apply-templates select="$target" mode="xref-to-suffix"/>
+ </xsl:when>
+
+ <xsl:otherwise>
+ <xsl:apply-templates/>
+ </xsl:otherwise>
+
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+
+</xsl:template>
+
+<!-- ============================================================ -->
+
+</xsl:stylesheet>
+
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/tl.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/tl.xml
new file mode 100644
index 0000000..b081d8e
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/tl.xml
@@ -0,0 +1,1229 @@
+<?xml version="1.0" encoding="utf-8"?>
+<l:l10n xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0" language="tl" english-language-name="Tagalog">
+
+<!-- * This file is generated automatically. -->
+<!-- * To submit changes to this file upstream (to the DocBook Project) -->
+<!-- * do not submit an edited version of this file. Instead, submit an -->
+<!-- * edited version of the source file at the following location: -->
+<!-- * -->
+<!-- * https://docbook.svn.sourceforge.net/svnroot/docbook/trunk/gentext/locale/tl.xml -->
+<!-- * -->
+<!-- * E-mail the edited tl.xml source file to: -->
+<!-- * -->
+<!-- * docbook-developers@lists.sourceforge.net -->
+
+<!-- ******************************************************************** -->
+
+<!-- This file is part of the XSL DocBook Stylesheet distribution. -->
+<!-- See ../README or http://docbook.sf.net/release/xsl/current/ for -->
+<!-- copyright and other information. -->
+
+<!-- ******************************************************************** -->
+<!-- In these files, % with a letter is used for a placeholder: -->
+<!-- %t is the current element's title -->
+<!-- %s is the current element's subtitle (if applicable)-->
+<!-- %n is the current element's number label-->
+<!-- %p is the current element's page number (if applicable)-->
+<!-- ******************************************************************** -->
+
+
+<l:gentext key="Abstract" text="Abstrak"/>
+<l:gentext key="abstract" text="Abstrak"/>
+<l:gentext key="Acknowledgements" text="Acknowledgements" lang="en"/>
+<l:gentext key="acknowledgements" text="Acknowledgements" lang="en"/>
+<l:gentext key="Answer" text="Sagot:"/>
+<l:gentext key="answer" text="Sagot:"/>
+<l:gentext key="Appendix" text="Apendiks"/>
+<l:gentext key="appendix" text="Apendiks"/>
+<l:gentext key="Article" text="Artikulo"/>
+<l:gentext key="article" text="Artikulo"/>
+<l:gentext key="Author" text="May Akda"/>
+<l:gentext key="Bibliography" text="Bibliograpiya"/>
+<l:gentext key="bibliography" text="Bibliograpiya"/>
+<l:gentext key="Book" text="Libro"/>
+<l:gentext key="book" text="Libro"/>
+<l:gentext key="CAUTION" text="BABALA"/>
+<l:gentext key="Caution" text="Babala"/>
+<l:gentext key="caution" text="Babala"/>
+<l:gentext key="Chapter" text="Kabanata"/>
+<l:gentext key="chapter" text="Kabanata"/>
+<l:gentext key="Colophon" text="Kolopon"/>
+<l:gentext key="colophon" text="Kolopon"/>
+<l:gentext key="Copyright" text="Copyright"/>
+<l:gentext key="copyright" text="Copyright"/>
+<l:gentext key="Dedication" text="Pag-aalay"/>
+<l:gentext key="dedication" text="Pag-aalay"/>
+<l:gentext key="Edition" text="Edisyon"/>
+<l:gentext key="edition" text="Ediisyon"/>
+<l:gentext key="Editor" text="Editor" lang="en"/>
+<l:gentext key="Equation" text="Equation"/>
+<l:gentext key="equation" text="Equation"/>
+<l:gentext key="Example" text="Halimbawa"/>
+<l:gentext key="example" text="Halimbawa"/>
+<l:gentext key="Figure" text="Pigyur"/>
+<l:gentext key="figure" text="Pigyur"/>
+<l:gentext key="Glossary" text="Talahuguhanan"/>
+<l:gentext key="glossary" text="Talahuguhanan"/>
+<l:gentext key="GlossSee" text="Tingnan Ang"/>
+<l:gentext key="glosssee" text="Tingnan Ang"/>
+<l:gentext key="GlossSeeAlso" text="Tingnan Din Ang"/>
+<l:gentext key="glossseealso" text="Tingnan din ang"/>
+<l:gentext key="IMPORTANT" text="MAHALAGA"/>
+<l:gentext key="important" text="Mahalaga"/>
+<l:gentext key="Important" text="Mahalaga"/>
+<l:gentext key="Index" text="Indeks"/>
+<l:gentext key="index" text="Indeks"/>
+<l:gentext key="ISBN" text="ISBN"/>
+<l:gentext key="isbn" text="ISBN"/>
+<l:gentext key="LegalNotice" text="Paunawang Legal"/>
+<l:gentext key="legalnotice" text="Paunawang Legal"/>
+<l:gentext key="MsgAud" text="Awdiyens"/>
+<l:gentext key="msgaud" text="Awdiyens"/>
+<l:gentext key="MsgLevel" text="Lebel"/>
+<l:gentext key="msglevel" text="Lebel"/>
+<l:gentext key="MsgOrig" text="Pinagmulan"/>
+<l:gentext key="msgorig" text="Pinagmulan"/>
+<l:gentext key="NOTE" text="TALA"/>
+<l:gentext key="Note" text="Tala"/>
+<l:gentext key="note" text="Tala"/>
+<l:gentext key="Part" text="Bahagi"/>
+<l:gentext key="part" text="Bahagi"/>
+<l:gentext key="Preface" text="Panimula"/>
+<l:gentext key="preface" text="Panimula"/>
+<l:gentext key="Procedure" text="Mga Hakbang"/>
+<l:gentext key="procedure" text="Mga Hakbang"/>
+<l:gentext key="ProductionSet" text="Produksiyon"/>
+<l:gentext key="PubDate" text="Petsa ng Paglimbag"/>
+<l:gentext key="pubdate" text="Petsa ng Paglimbag"/>
+<l:gentext key="Published" text="Nalimbag"/>
+<l:gentext key="published" text="Nalimbag"/>
+<l:gentext key="Publisher" text="Publisher" lang="en"/>
+<l:gentext key="Qandadiv" text="Tanong at Sagot"/>
+<l:gentext key="qandadiv" text="Tanong at Sagot"/>
+<l:gentext key="QandASet" text="Frequently Asked Questions" lang="en"/>
+<l:gentext key="Question" text="Tanong:"/>
+<l:gentext key="question" text="Tanong:"/>
+<l:gentext key="RefEntry" text=""/>
+<l:gentext key="refentry" text=""/>
+<l:gentext key="Reference" text="Reperens"/>
+<l:gentext key="reference" text="Reperens"/>
+<l:gentext key="References" text="References" lang="en"/>
+<l:gentext key="RefName" text="Pangalan"/>
+<l:gentext key="refname" text="Pangalan"/>
+<l:gentext key="RefSection" text=""/>
+<l:gentext key="refsection" text=""/>
+<l:gentext key="RefSynopsisDiv" text="Buod"/>
+<l:gentext key="refsynopsisdiv" text="Buod"/>
+<l:gentext key="RevHistory" text="Talaan Ng Mga Rebisyon"/>
+<l:gentext key="revhistory" text="Talaan ng mga Rebisyon"/>
+<l:gentext key="revision" text="Rebisyon"/>
+<l:gentext key="Revision" text="Revision"/>
+<l:gentext key="sect1" text="Bahagi"/>
+<l:gentext key="sect2" text="Bahagi"/>
+<l:gentext key="sect3" text="Bahagi"/>
+<l:gentext key="sect4" text="Bahagi"/>
+<l:gentext key="sect5" text="Bahagi"/>
+<l:gentext key="section" text="Bahagi"/>
+<l:gentext key="Section" text="Bahagi"/>
+<l:gentext key="see" text="tingnan"/>
+<l:gentext key="See" text="Tingnan"/>
+<l:gentext key="seealso" text="tingnan din ang"/>
+<l:gentext key="Seealso" text="Tingnan din ang"/>
+<l:gentext key="SeeAlso" text="Tingnan Din Ang"/>
+<l:gentext key="set" text="Set"/>
+<l:gentext key="Set" text="Set"/>
+<l:gentext key="setindex" text="Indeks ng Set"/>
+<l:gentext key="SetIndex" text="Indeks ng Set"/>
+<l:gentext key="Sidebar" text=""/>
+<l:gentext key="sidebar" text="sidebar"/>
+<l:gentext key="step" text="hakbang"/>
+<l:gentext key="Step" text="Hakbang"/>
+<l:gentext key="table" text="Talaan"/>
+<l:gentext key="Table" text="Talaan"/>
+<l:gentext key="task" text="Task" lang="en"/>
+<l:gentext key="Task" text="Task" lang="en"/>
+<l:gentext key="tip" text="Tip"/>
+<l:gentext key="TIP" text="TIP"/>
+<l:gentext key="Tip" text="Tip"/>
+<l:gentext key="Warning" text="Babala"/>
+<l:gentext key="warning" text="Babala"/>
+<l:gentext key="WARNING" text="BABALA"/>
+<l:gentext key="and" text="at"/>
+<l:gentext key="by" text="ni"/>
+<l:gentext key="Edited" text="In-edit"/>
+<l:gentext key="edited" text="In-edit"/>
+<l:gentext key="Editedby" text="In-edit ni"/>
+<l:gentext key="editedby" text="In-edit ni"/>
+<l:gentext key="in" text="sa"/>
+<l:gentext key="lastlistcomma" text=","/>
+<l:gentext key="listcomma" text=","/>
+<l:gentext key="notes" text="Mga tala"/>
+<l:gentext key="Notes" text="Mga Tala"/>
+<l:gentext key="Pgs" text="p."/>
+<l:gentext key="pgs" text="p."/>
+<l:gentext key="Revisedby" text="Nirebisa ni: "/>
+<l:gentext key="revisedby" text="Nirebisa ni: "/>
+<l:gentext key="TableNotes" text="Mga Tala"/>
+<l:gentext key="tablenotes" text="Mga Tala"/>
+<l:gentext key="TableofContents" text="Talaan ng Nilalaman"/>
+<l:gentext key="tableofcontents" text="Talaan ng Nilalaman"/>
+<l:gentext key="unexpectedelementname" text="hindi inaasahang element"/>
+<l:gentext key="unsupported" text="hindi sinusuportahan"/>
+<l:gentext key="xrefto" text="xref sa"/>
+<l:gentext key="Authors" text="Authors" lang="en"/>
+<l:gentext key="copyeditor" text="Copy Editor" lang="en"/>
+<l:gentext key="graphicdesigner" text="Graphic Designer" lang="en"/>
+<l:gentext key="productioneditor" text="Production Editor" lang="en"/>
+<l:gentext key="technicaleditor" text="Technical Editor" lang="en"/>
+<l:gentext key="translator" text="Translator" lang="en"/>
+<l:gentext key="listofequations" text="Listahan ng mga Ekwasyon"/>
+<l:gentext key="ListofEquations" text="Listahan Ng Mga Ekwasyon"/>
+<l:gentext key="ListofExamples" text="Listahan Ng Mga Halimbawa"/>
+<l:gentext key="listofexamples" text="Listahan ng mga Halimbawa"/>
+<l:gentext key="ListofFigures" text="Listahan Ng Mga Pigyur "/>
+<l:gentext key="listoffigures" text="Listahan ng mga Pigyur"/>
+<l:gentext key="ListofProcedures" text="Listahan Ng Mga Prosidyur"/>
+<l:gentext key="listofprocedures" text="Listahan ng mga Prosidyur"/>
+<l:gentext key="listoftables" text="Listahan ng mga Talaan"/>
+<l:gentext key="ListofTables" text="Listahan Ng Mga Talaan"/>
+<l:gentext key="ListofUnknown" text="Listahan Ng Mga Di Alam"/>
+<l:gentext key="listofunknown" text="Listahan ng mga Di Alam"/>
+<l:gentext key="nav-home" text="Home"/>
+<l:gentext key="nav-next" text="Sulong"/>
+<l:gentext key="nav-next-sibling" text="Mabilis na pasulong"/>
+<l:gentext key="nav-prev" text="Balik"/>
+<l:gentext key="nav-prev-sibling" text="Mabilis na pabalik"/>
+<l:gentext key="nav-up" text="Taas"/>
+<l:gentext key="nav-toc" text="TnN"/>
+<l:gentext key="Draft" text="Draft"/>
+<l:gentext key="above" text="taas"/>
+<l:gentext key="below" text="baba"/>
+<l:gentext key="sectioncalled" text="ang bahaging tinatawag na"/>
+<l:gentext key="index symbols" text="Mga simbolo"/>
+<l:gentext key="writing-mode" text="lr-tb"/>
+<l:gentext key="lowercase.alpha" text="abcdefghijklmnopqrstuvwxyz"/>
+<l:gentext key="uppercase.alpha" text="ABCDEFGHIJKLMNOPQRSTUVWXYZ"/>
+<l:gentext key="normalize.sort.input" text="AaÀàÃáÂâÃãÄäÅåĀÄĂ㥹ÇǎǞǟǠǡǺǻȀÈȂȃȦȧḀá¸áºšáº áº¡áº¢áº£áº¤áº¥áº¦áº§áº¨áº©áºªáº«áº¬áº­áº®áº¯áº°áº±áº²áº³áº´áºµáº¶áº·BbÆ€ÆɓƂƃḂḃḄḅḆḇCcÇçĆćĈĉĊċČÄƇƈɕḈḉDdÄŽÄÄđƊɗƋƌDžDzȡɖḊḋḌá¸á¸Žá¸á¸á¸‘ḒḓEeÈèÉéÊêËëĒēĔĕĖėĘęĚěȄȅȆȇȨȩḔḕḖḗḘḙḚḛḜá¸áº¸áº¹áººáº»áº¼áº½áº¾áº¿á»€á»á»‚ểỄễỆệFfƑƒḞḟGgÄœÄĞğĠġĢģƓɠǤǥǦǧǴǵḠḡHhĤĥĦħȞȟɦḢḣḤḥḦḧḨḩḪḫẖIiÌìÃíÎîÃïĨĩĪīĬĭĮįİƗɨÇÇȈȉȊȋḬḭḮḯỈỉỊịJjĴĵǰÊKkĶķƘƙǨǩḰḱḲḳḴḵLlĹĺĻļĽľĿŀÅłƚLjȴɫɬɭḶḷḸḹḺḻḼḽMmɱḾḿṀá¹á¹‚ṃNnÑñŃńŅņŇňÆɲƞȠNjǸǹȵɳṄṅṆṇṈṉṊṋOoÒòÓóÔôÕõÖöØøŌÅÅŽÅÅőƟƠơǑǒǪǫǬǭǾǿȌÈÈŽÈȪȫȬȭȮȯȰȱṌá¹á¹Žá¹á¹á¹‘ṒṓỌá»á»Žá»á»á»‘ỒồỔổỖỗỘộỚớỜá»á»žá»Ÿá» á»¡á»¢á»£PpƤƥṔṕṖṗQqÊ RrŔŕŖŗŘřÈȑȒȓɼɽɾṘṙṚṛṜá¹á¹žá¹ŸSsŚśŜÅŞşŠšȘșʂṠṡṢṣṤṥṦṧṨṩTtŢţŤťŦŧƫƬƭƮʈȚțȶṪṫṬṭṮṯṰṱẗUuÙùÚúÛûÜüŨũŪūŬŭŮůŰűŲųƯưǓǔǕǖǗǘǙǚǛǜȔȕȖȗṲṳṴṵṶṷṸṹṺṻỤụỦủỨứỪừỬửỮữỰựVvƲʋṼṽṾṿWwŴŵẀáºáº‚ẃẄẅẆẇẈẉẘXxẊẋẌáºYyÃýÿŸŶŷƳƴȲȳẎáºáº™á»²á»³á»´á»µá»¶á»·á»¸á»¹ZzŹźŻżŽžƵƶȤȥÊÊ‘áºáº‘ẒẓẔẕẕ" lang="en"/>
+<l:gentext key="normalize.sort.output" text="AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBCCCCCCCCCCCCCCCCCDDDDDDDDDDDDDDDDDDDDDDDDEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEFFFFFFGGGGGGGGGGGGGGGGGGGGHHHHHHHHHHHHHHHHHHHHIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIJJJJJJKKKKKKKKKKKKKKLLLLLLLLLLLLLLLLLLLLLLLLLLMMMMMMMMMNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOPPPPPPPPQQQRRRRRRRRRRRRRRRRRRRRRRRSSSSSSSSSSSSSSSSSSSSSSSTTTTTTTTTTTTTTTTTTTTTTTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUVVVVVVVVWWWWWWWWWWWWWWWXXXXXXYYYYYYYYYYYYYYYYYYYYYYYZZZZZZZZZZZZZZZZZZZZZ" lang="en"/>
+<l:dingbat key="startquote" text="“"/>
+<l:dingbat key="endquote" text="â€"/>
+<l:dingbat key="nestedstartquote" text="‘"/>
+<l:dingbat key="nestedendquote" text="’"/>
+<l:dingbat key="singlestartquote" text="‘"/>
+<l:dingbat key="singleendquote" text="’"/>
+<l:dingbat key="bullet" text="•"/>
+<l:gentext key="hyphenation-character" text="-"/>
+<l:gentext key="hyphenation-push-character-count" text="2"/>
+<l:gentext key="hyphenation-remain-character-count" text="2"/>
+<l:context name="styles"><l:template name="person-name" text="first-last"/>
+</l:context>
+<l:context name="title"><l:template name="abstract" text="%t"/>
+<l:template name="acknowledgements" text="%t" lang="en"/>
+<l:template name="answer" text="%t"/>
+<l:template name="appendix" text="Apendiks %n. %t"/>
+<l:template name="article" text="%t"/>
+<l:template name="authorblurb" text="%t"/>
+<l:template name="bibliodiv" text="%t"/>
+<l:template name="biblioentry" text="%t"/>
+<l:template name="bibliography" text="%t"/>
+<l:template name="bibliolist" text="%t"/>
+<l:template name="bibliomixed" text="%t"/>
+<l:template name="bibliomset" text="%t"/>
+<l:template name="biblioset" text="%t"/>
+<l:template name="blockquote" text="%t"/>
+<l:template name="book" text="%t"/>
+<l:template name="calloutlist" text="%t"/>
+<l:template name="caution" text="%t"/>
+<l:template name="chapter" text="Kabanata %n. %t"/>
+<l:template name="colophon" text="%t"/>
+<l:template name="dedication" text="%t"/>
+<l:template name="equation" text="Equation %n. %t"/>
+<l:template name="example" text="Halimbawa %n. %t"/>
+<l:template name="figure" text="Pigyur %n. %t"/>
+<l:template name="foil" text="%t"/>
+<l:template name="foilgroup" text="%t"/>
+<l:template name="formalpara" text="%t"/>
+<l:template name="glossary" text="%t"/>
+<l:template name="glossdiv" text="%t"/>
+<l:template name="glosslist" text="%t"/>
+<l:template name="glossentry" text="%t"/>
+<l:template name="important" text="%t"/>
+<l:template name="index" text="%t"/>
+<l:template name="indexdiv" text="%t"/>
+<l:template name="itemizedlist" text="%t"/>
+<l:template name="legalnotice" text="%t"/>
+<l:template name="listitem" text=""/>
+<l:template name="lot" text="%t"/>
+<l:template name="msg" text="%t"/>
+<l:template name="msgexplan" text="%t"/>
+<l:template name="msgmain" text="%t"/>
+<l:template name="msgrel" text="%t"/>
+<l:template name="msgset" text="%t"/>
+<l:template name="msgsub" text="%t"/>
+<l:template name="note" text="%t"/>
+<l:template name="orderedlist" text="%t"/>
+<l:template name="part" text="Bahagi %n. %t"/>
+<l:template name="partintro" text="%t"/>
+<l:template name="preface" text="%t"/>
+<l:template name="procedure" text="%t"/>
+<l:template name="procedure.formal" text="Mga Hakbang %n. %t"/>
+<l:template name="productionset" text="%t"/>
+<l:template name="productionset.formal" text="Produksiyon %n"/>
+<l:template name="qandadiv" text="%t"/>
+<l:template name="qandaentry" text="%t"/>
+<l:template name="qandaset" text="%t"/>
+<l:template name="question" text="%t"/>
+<l:template name="refentry" text="%t"/>
+<l:template name="reference" text="%t"/>
+<l:template name="refsection" text="%t"/>
+<l:template name="refsect1" text="%t"/>
+<l:template name="refsect2" text="%t"/>
+<l:template name="refsect3" text="%t"/>
+<l:template name="refsynopsisdiv" text="%t"/>
+<l:template name="refsynopsisdivinfo" text="%t"/>
+<l:template name="segmentedlist" text="%t"/>
+<l:template name="set" text="%t"/>
+<l:template name="setindex" text="%t"/>
+<l:template name="sidebar" text="%t"/>
+<l:template name="step" text="%t"/>
+<l:template name="table" text="Talaan %n. %t"/>
+<l:template name="task" text="%t"/>
+<l:template name="tasksummary" text="%t" lang="en"/>
+<l:template name="taskprerequisites" text="%t" lang="en"/>
+<l:template name="taskrelated" text="%t" lang="en"/>
+<l:template name="tip" text="%t"/>
+<l:template name="toc" text="%t"/>
+<l:template name="variablelist" text="%t"/>
+<l:template name="varlistentry" text=""/>
+<l:template name="warning" text="%t"/>
+</l:context>
+<l:context name="title-unnumbered"><l:template name="appendix" text="%t"/>
+<l:template name="article/appendix" text="%t"/>
+<l:template name="bridgehead" text="%t"/>
+<l:template name="chapter" text="%t"/>
+<l:template name="sect1" text="%t"/>
+<l:template name="sect2" text="%t"/>
+<l:template name="sect3" text="%t"/>
+<l:template name="sect4" text="%t"/>
+<l:template name="sect5" text="%t"/>
+<l:template name="section" text="%t"/>
+<l:template name="simplesect" text="%t"/>
+<l:template name="part" text="%t" lang="en"/>
+</l:context>
+<l:context name="title-numbered"><l:template name="appendix" text="Apendiks %n. %t"/>
+<l:template name="article/appendix" text="%n. %t"/>
+<l:template name="bridgehead" text="%n. %t"/>
+<l:template name="chapter" text="Kabanata %n. %t"/>
+<l:template name="part" text="Bahagi %n. %t"/>
+<l:template name="sect1" text="%n. %t"/>
+<l:template name="sect2" text="%n. %t"/>
+<l:template name="sect3" text="%n. %t"/>
+<l:template name="sect4" text="%n. %t"/>
+<l:template name="sect5" text="%n. %t"/>
+<l:template name="section" text="%n. %t"/>
+<l:template name="simplesect" text="%t"/>
+</l:context>
+<l:context name="subtitle"><l:template name="appendix" text="%s"/>
+<l:template name="acknowledgements" text="%s" lang="en"/>
+<l:template name="article" text="%s"/>
+<l:template name="bibliodiv" text="%s"/>
+<l:template name="biblioentry" text="%s"/>
+<l:template name="bibliography" text="%s"/>
+<l:template name="bibliomixed" text="%s"/>
+<l:template name="bibliomset" text="%s"/>
+<l:template name="biblioset" text="%s"/>
+<l:template name="book" text="%s"/>
+<l:template name="chapter" text="%s"/>
+<l:template name="colophon" text="%s"/>
+<l:template name="dedication" text="%s"/>
+<l:template name="glossary" text="%s"/>
+<l:template name="glossdiv" text="%s"/>
+<l:template name="index" text="%s"/>
+<l:template name="indexdiv" text="%s"/>
+<l:template name="lot" text="%s"/>
+<l:template name="part" text="%s"/>
+<l:template name="partintro" text="%s"/>
+<l:template name="preface" text="%s"/>
+<l:template name="refentry" text="%s"/>
+<l:template name="reference" text="%s"/>
+<l:template name="refsection" text="%s"/>
+<l:template name="refsect1" text="%s"/>
+<l:template name="refsect2" text="%s"/>
+<l:template name="refsect3" text="%s"/>
+<l:template name="refsynopsisdiv" text="%s"/>
+<l:template name="sect1" text="%s"/>
+<l:template name="sect2" text="%s"/>
+<l:template name="sect3" text="%s"/>
+<l:template name="sect4" text="%s"/>
+<l:template name="sect5" text="%s"/>
+<l:template name="section" text="%s"/>
+<l:template name="set" text="%s"/>
+<l:template name="setindex" text="%s"/>
+<l:template name="sidebar" text="%s"/>
+<l:template name="simplesect" text="%s"/>
+<l:template name="toc" text="%s"/>
+</l:context>
+<l:context name="xref"><l:template name="abstract" text="%t"/>
+<l:template name="acknowledgements" text="%t" lang="en"/>
+<l:template name="answer" text="Sagot: %n"/>
+<l:template name="appendix" text="%t"/>
+<l:template name="article" text="%t"/>
+<l:template name="authorblurb" text="%t"/>
+<l:template name="bibliodiv" text="%t"/>
+<l:template name="bibliography" text="%t"/>
+<l:template name="bibliomset" text="%t"/>
+<l:template name="biblioset" text="%t"/>
+<l:template name="blockquote" text="%t"/>
+<l:template name="book" text="%t"/>
+<l:template name="calloutlist" text="%t"/>
+<l:template name="caution" text="%t"/>
+<l:template name="chapter" text="%t"/>
+<l:template name="colophon" text="%t"/>
+<l:template name="constraintdef" text="%t"/>
+<l:template name="dedication" text="%t"/>
+<l:template name="equation" text="%t"/>
+<l:template name="example" text="%t"/>
+<l:template name="figure" text="%t"/>
+<l:template name="foil" text="%t"/>
+<l:template name="foilgroup" text="%t"/>
+<l:template name="formalpara" text="%t"/>
+<l:template name="glossary" text="%t"/>
+<l:template name="glossdiv" text="%t"/>
+<l:template name="important" text="%t"/>
+<l:template name="index" text="%t"/>
+<l:template name="indexdiv" text="%t"/>
+<l:template name="itemizedlist" text="%t"/>
+<l:template name="legalnotice" text="%t"/>
+<l:template name="listitem" text="%n"/>
+<l:template name="lot" text="%t"/>
+<l:template name="msg" text="%t"/>
+<l:template name="msgexplan" text="%t"/>
+<l:template name="msgmain" text="%t"/>
+<l:template name="msgrel" text="%t"/>
+<l:template name="msgset" text="%t"/>
+<l:template name="msgsub" text="%t"/>
+<l:template name="note" text="%t"/>
+<l:template name="orderedlist" text="%t"/>
+<l:template name="part" text="%t"/>
+<l:template name="partintro" text="%t"/>
+<l:template name="preface" text="%t"/>
+<l:template name="procedure" text="%t"/>
+<l:template name="productionset" text="%t"/>
+<l:template name="qandadiv" text="%t"/>
+<l:template name="qandaentry" text="Tanong: %n"/>
+<l:template name="qandaset" text="%t"/>
+<l:template name="question" text="Tanong: %n"/>
+<l:template name="reference" text="%t"/>
+<l:template name="refsynopsisdiv" text="%t"/>
+<l:template name="segmentedlist" text="%t"/>
+<l:template name="set" text="%t"/>
+<l:template name="setindex" text="%t"/>
+<l:template name="sidebar" text="%t"/>
+<l:template name="table" text="%t"/>
+<l:template name="task" text="%t" lang="en"/>
+<l:template name="tip" text="%t"/>
+<l:template name="toc" text="%t"/>
+<l:template name="variablelist" text="%t"/>
+<l:template name="varlistentry" text="%n"/>
+<l:template name="warning" text="%t"/>
+<l:template name="olink.document.citation" text=" sa %o"/>
+<l:template name="olink.page.citation" text=" (pahina %p)"/>
+<l:template name="page.citation" text=" [%p]"/>
+<l:template name="page" text="(pahina %p)"/>
+<l:template name="docname" text=" sa %o"/>
+<l:template name="docnamelong" text=" sa dokumento na %o"/>
+<l:template name="pageabbrev" text="(p. %p)"/>
+<l:template name="Page" text="Pahina %p"/>
+<l:template name="bridgehead" text="ang bahaging tinatawag na “%tâ€"/>
+<l:template name="refsection" text="ang bahaging tinatawag na “%tâ€"/>
+<l:template name="refsect1" text="ang bahaging tinatawag na “%tâ€"/>
+<l:template name="refsect2" text="ang bahaging tinatawag na “%tâ€"/>
+<l:template name="refsect3" text="ang bahaging tinatawag na “%tâ€"/>
+<l:template name="sect1" text="ang bahaging tinatawag na “%tâ€"/>
+<l:template name="sect2" text="ang bahaging tinatawag na “%tâ€"/>
+<l:template name="sect3" text="ang bahaging tinatawag na “%tâ€"/>
+<l:template name="sect4" text="ang bahaging tinatawag na “%tâ€"/>
+<l:template name="sect5" text="ang bahaging tinatawag na “%tâ€"/>
+<l:template name="section" text="ang bahaging tinatawag na “%tâ€"/>
+<l:template name="simplesect" text="ang bahaging tinatawag na “%tâ€"/>
+</l:context>
+<l:context name="xref-number"><l:template name="answer" text="Sagot: %n"/>
+<l:template name="appendix" text="Apendiks %n"/>
+<l:template name="bridgehead" text="Bahagi %n"/>
+<l:template name="chapter" text="Kabanata %n"/>
+<l:template name="equation" text="Equation %n"/>
+<l:template name="example" text="Halimbawa %n"/>
+<l:template name="figure" text="Pigyur %n"/>
+<l:template name="part" text="Bahagi %n"/>
+<l:template name="procedure" text="Mga Hakbang %n"/>
+<l:template name="productionset" text="Produksiyon %n"/>
+<l:template name="qandadiv" text="Tanong at Sagot %n"/>
+<l:template name="qandaentry" text="Tanong: %n"/>
+<l:template name="question" text="Tanong: %n"/>
+<l:template name="sect1" text="Bahagi %n"/>
+<l:template name="sect2" text="Bahagi %n"/>
+<l:template name="sect3" text="Bahagi %n"/>
+<l:template name="sect4" text="Bahagi %n"/>
+<l:template name="sect5" text="Bahagi %n"/>
+<l:template name="section" text="Bahagi %n"/>
+<l:template name="table" text="Talaan %n"/>
+</l:context>
+<l:context name="xref-number-and-title"><l:template name="appendix" text="Apendiks %n, %t"/>
+<l:template name="bridgehead" text="Bahagi %n, “%tâ€"/>
+<l:template name="chapter" text="Kabanata %n, %t"/>
+<l:template name="equation" text="Equation %n, “%tâ€"/>
+<l:template name="example" text="Halimbawa %n, “%tâ€"/>
+<l:template name="figure" text="Pigyur %n, “%tâ€"/>
+<l:template name="part" text="Bahagi %n, “%tâ€"/>
+<l:template name="procedure" text="Mga Hakbang %n, “%tâ€"/>
+<l:template name="productionset" text="Produksiyon %n, “%tâ€"/>
+<l:template name="qandadiv" text="Tanong at Sagot %n, “%tâ€"/>
+<l:template name="refsect1" text="ang bahaging tinatawag na “%tâ€"/>
+<l:template name="refsect2" text="ang bahaging tinatawag na “%tâ€"/>
+<l:template name="refsect3" text="ang bahaging tinatawag na “%tâ€"/>
+<l:template name="refsection" text="ang bahaging tinatawag na “%tâ€"/>
+<l:template name="sect1" text="Bahagi %n, “%tâ€"/>
+<l:template name="sect2" text="Bahagi %n, “%tâ€"/>
+<l:template name="sect3" text="Bahagi %n, “%tâ€"/>
+<l:template name="sect4" text="Bahagi %n, “%tâ€"/>
+<l:template name="sect5" text="Bahagi %n, “%tâ€"/>
+<l:template name="section" text="Bahagi %n, “%tâ€"/>
+<l:template name="simplesect" text="ang bahaging tinatawag na “%tâ€"/>
+<l:template name="table" text="Talaan %n, “%tâ€"/>
+</l:context>
+<l:context name="authorgroup"><l:template name="sep" text=", "/>
+<l:template name="sep2" text=" at "/>
+<l:template name="seplast" text=", at "/>
+</l:context>
+<l:context name="glossary"><l:template name="see" text="Tingnan Ang %t."/>
+<l:template name="seealso" text="Tingnan Din Ang %t."/>
+<l:template name="seealso-separator" text=", "/>
+</l:context>
+<l:context name="msgset"><l:template name="MsgAud" text="Awdiyens: "/>
+<l:template name="MsgLevel" text="Lebel: "/>
+<l:template name="MsgOrig" text="Pinagmulan: "/>
+</l:context>
+<l:context name="datetime"><l:template name="format" text="m/d/Y"/>
+</l:context>
+<l:context name="termdef"><l:template name="prefix" text="[Depinisyon: "/>
+<l:template name="suffix" text="]"/>
+</l:context>
+<l:context name="datetime-full"><l:template name="January" text="Enero"/>
+<l:template name="February" text="Pebrero"/>
+<l:template name="March" text="Marso"/>
+<l:template name="April" text="Abril"/>
+<l:template name="May" text="Mayo"/>
+<l:template name="June" text="Hunyo"/>
+<l:template name="July" text="Hulyo"/>
+<l:template name="August" text="Agosto"/>
+<l:template name="September" text="Setyembre"/>
+<l:template name="October" text="Oktubre"/>
+<l:template name="November" text="Nobyembre"/>
+<l:template name="December" text="Disyembre"/>
+<l:template name="Monday" text="Lunes"/>
+<l:template name="Tuesday" text="Martes"/>
+<l:template name="Wednesday" text="Miyeskules"/>
+<l:template name="Thursday" text="Huwebes"/>
+<l:template name="Friday" text="Biyernes"/>
+<l:template name="Saturday" text="Sabado"/>
+<l:template name="Sunday" text="Linggo"/>
+</l:context>
+<l:context name="datetime-abbrev"><l:template name="Jan" text="Ene"/>
+<l:template name="Feb" text="Peb"/>
+<l:template name="Mar" text="Mar"/>
+<l:template name="Apr" text="Abr"/>
+<l:template name="May" text="Mayo"/>
+<l:template name="Jun" text="Hun"/>
+<l:template name="Jul" text="Hul"/>
+<l:template name="Aug" text="Ago"/>
+<l:template name="Sep" text="Set"/>
+<l:template name="Oct" text="Okt"/>
+<l:template name="Nov" text="Nob"/>
+<l:template name="Dec" text="Dis"/>
+<l:template name="Mon" text="Lun"/>
+<l:template name="Tue" text="Mar"/>
+<l:template name="Wed" text="Miy"/>
+<l:template name="Thu" text="Huw"/>
+<l:template name="Fri" text="Biy"/>
+<l:template name="Sat" text="Sab"/>
+<l:template name="Sun" text="Lin"/>
+</l:context>
+<l:context name="htmlhelp"><l:template name="langcode" text="0x0409 Tagalog (PHILIPPINES)"/>
+</l:context>
+<l:context name="index"><l:template name="term-separator" text=", " lang="en"/>
+<l:template name="number-separator" text=", " lang="en"/>
+<l:template name="range-separator" text="-" lang="en"/>
+</l:context>
+<l:context name="iso690"><l:template name="lastfirst.sep" text=", " lang="en"/>
+<l:template name="alt.person.two.sep" text=" – " lang="en"/>
+<l:template name="alt.person.last.sep" text=" – " lang="en"/>
+<l:template name="alt.person.more.sep" text=" – " lang="en"/>
+<l:template name="primary.editor" text=" (ed.)" lang="en"/>
+<l:template name="primary.many" text=", et al." lang="en"/>
+<l:template name="primary.sep" text=". " lang="en"/>
+<l:template name="submaintitle.sep" text=": " lang="en"/>
+<l:template name="title.sep" text=". " lang="en"/>
+<l:template name="othertitle.sep" text=", " lang="en"/>
+<l:template name="medium1" text=" [" lang="en"/>
+<l:template name="medium2" text="]" lang="en"/>
+<l:template name="secondary.person.sep" text="; " lang="en"/>
+<l:template name="secondary.sep" text=". " lang="en"/>
+<l:template name="respons.sep" text=". " lang="en"/>
+<l:template name="edition.sep" text=". " lang="en"/>
+<l:template name="edition.serial.sep" text=", " lang="en"/>
+<l:template name="issuing.range" text="-" lang="en"/>
+<l:template name="issuing.div" text=", " lang="en"/>
+<l:template name="issuing.sep" text=". " lang="en"/>
+<l:template name="partnr.sep" text=". " lang="en"/>
+<l:template name="placepubl.sep" text=": " lang="en"/>
+<l:template name="publyear.sep" text=", " lang="en"/>
+<l:template name="pubinfo.sep" text=". " lang="en"/>
+<l:template name="spec.pubinfo.sep" text=", " lang="en"/>
+<l:template name="upd.sep" text=", " lang="en"/>
+<l:template name="datecit1" text=" [cited " lang="en"/>
+<l:template name="datecit2" text="]" lang="en"/>
+<l:template name="extent.sep" text=". " lang="en"/>
+<l:template name="locs.sep" text=", " lang="en"/>
+<l:template name="location.sep" text=". " lang="en"/>
+<l:template name="serie.sep" text=". " lang="en"/>
+<l:template name="notice.sep" text=". " lang="en"/>
+<l:template name="access" text="Available " lang="en"/>
+<l:template name="acctoo" text="Also available " lang="en"/>
+<l:template name="onwww" text="from World Wide Web" lang="en"/>
+<l:template name="oninet" text="from Internet" lang="en"/>
+<l:template name="access.end" text=": " lang="en"/>
+<l:template name="link1" text="&lt;" lang="en"/>
+<l:template name="link2" text="&gt;" lang="en"/>
+<l:template name="access.sep" text=". " lang="en"/>
+<l:template name="isbn" text="ISBN " lang="en"/>
+<l:template name="issn" text="ISSN " lang="en"/>
+<l:template name="stdnum.sep" text=". " lang="en"/>
+<l:template name="patcountry.sep" text=". " lang="en"/>
+<l:template name="pattype.sep" text=", " lang="en"/>
+<l:template name="patnum.sep" text=". " lang="en"/>
+<l:template name="patdate.sep" text=". " lang="en"/>
+</l:context><l:letters><l:l i="-1"/>
+<l:l i="0">Symbols</l:l>
+<l:l i="10">A</l:l>
+<l:l i="10">a</l:l>
+<l:l i="10">À</l:l>
+<l:l i="10">à</l:l>
+<l:l i="10">Ã</l:l>
+<l:l i="10">á</l:l>
+<l:l i="10">Â</l:l>
+<l:l i="10">â</l:l>
+<l:l i="10">Ã</l:l>
+<l:l i="10">ã</l:l>
+<l:l i="10">Ä</l:l>
+<l:l i="10">ä</l:l>
+<l:l i="10">Ã…</l:l>
+<l:l i="10">Ã¥</l:l>
+<l:l i="10">Ä€</l:l>
+<l:l i="10">Ä</l:l>
+<l:l i="10">Ä‚</l:l>
+<l:l i="10">ă</l:l>
+<l:l i="10">Ä„</l:l>
+<l:l i="10">Ä…</l:l>
+<l:l i="10">Ç</l:l>
+<l:l i="10">ÇŽ</l:l>
+<l:l i="10">Çž</l:l>
+<l:l i="10">ÇŸ</l:l>
+<l:l i="10">Ç </l:l>
+<l:l i="10">Ç¡</l:l>
+<l:l i="10">Ǻ</l:l>
+<l:l i="10">Ç»</l:l>
+<l:l i="10">È€</l:l>
+<l:l i="10">È</l:l>
+<l:l i="10">È‚</l:l>
+<l:l i="10">ȃ</l:l>
+<l:l i="10">Ȧ</l:l>
+<l:l i="10">ȧ</l:l>
+<l:l i="10">Ḁ</l:l>
+<l:l i="10">á¸</l:l>
+<l:l i="10">ẚ</l:l>
+<l:l i="10">Ạ</l:l>
+<l:l i="10">ạ</l:l>
+<l:l i="10">Ả</l:l>
+<l:l i="10">ả</l:l>
+<l:l i="10">Ấ</l:l>
+<l:l i="10">ấ</l:l>
+<l:l i="10">Ầ</l:l>
+<l:l i="10">ầ</l:l>
+<l:l i="10">Ẩ</l:l>
+<l:l i="10">ẩ</l:l>
+<l:l i="10">Ẫ</l:l>
+<l:l i="10">ẫ</l:l>
+<l:l i="10">Ậ</l:l>
+<l:l i="10">ậ</l:l>
+<l:l i="10">Ắ</l:l>
+<l:l i="10">ắ</l:l>
+<l:l i="10">Ằ</l:l>
+<l:l i="10">ằ</l:l>
+<l:l i="10">Ẳ</l:l>
+<l:l i="10">ẳ</l:l>
+<l:l i="10">Ẵ</l:l>
+<l:l i="10">ẵ</l:l>
+<l:l i="10">Ặ</l:l>
+<l:l i="10">ặ</l:l>
+<l:l i="20">B</l:l>
+<l:l i="20">b</l:l>
+<l:l i="20">Æ€</l:l>
+<l:l i="20">Æ</l:l>
+<l:l i="20">É“</l:l>
+<l:l i="20">Æ‚</l:l>
+<l:l i="20">ƃ</l:l>
+<l:l i="20">Ḃ</l:l>
+<l:l i="20">ḃ</l:l>
+<l:l i="20">Ḅ</l:l>
+<l:l i="20">ḅ</l:l>
+<l:l i="20">Ḇ</l:l>
+<l:l i="20">ḇ</l:l>
+<l:l i="30">C</l:l>
+<l:l i="30">c</l:l>
+<l:l i="30">Ç</l:l>
+<l:l i="30">ç</l:l>
+<l:l i="30">Ć</l:l>
+<l:l i="30">ć</l:l>
+<l:l i="30">Ĉ</l:l>
+<l:l i="30">ĉ</l:l>
+<l:l i="30">ÄŠ</l:l>
+<l:l i="30">Ä‹</l:l>
+<l:l i="30">Č</l:l>
+<l:l i="30">Ä</l:l>
+<l:l i="30">Ƈ</l:l>
+<l:l i="30">ƈ</l:l>
+<l:l i="30">É•</l:l>
+<l:l i="30">Ḉ</l:l>
+<l:l i="30">ḉ</l:l>
+<l:l i="40">D</l:l>
+<l:l i="40">d</l:l>
+<l:l i="40">ÄŽ</l:l>
+<l:l i="40">Ä</l:l>
+<l:l i="40">Ä</l:l>
+<l:l i="40">Ä‘</l:l>
+<l:l i="40">ÆŠ</l:l>
+<l:l i="40">É—</l:l>
+<l:l i="40">Æ‹</l:l>
+<l:l i="40">ƌ</l:l>
+<l:l i="40">Ç…</l:l>
+<l:l i="40">Dz</l:l>
+<l:l i="40">È¡</l:l>
+<l:l i="40">É–</l:l>
+<l:l i="40">Ḋ</l:l>
+<l:l i="40">ḋ</l:l>
+<l:l i="40">Ḍ</l:l>
+<l:l i="40">á¸</l:l>
+<l:l i="40">Ḏ</l:l>
+<l:l i="40">á¸</l:l>
+<l:l i="40">á¸</l:l>
+<l:l i="40">ḑ</l:l>
+<l:l i="40">Ḓ</l:l>
+<l:l i="40">ḓ</l:l>
+<l:l i="50">E</l:l>
+<l:l i="50">e</l:l>
+<l:l i="50">È</l:l>
+<l:l i="50">è</l:l>
+<l:l i="50">É</l:l>
+<l:l i="50">é</l:l>
+<l:l i="50">Ê</l:l>
+<l:l i="50">ê</l:l>
+<l:l i="50">Ë</l:l>
+<l:l i="50">ë</l:l>
+<l:l i="50">Ä’</l:l>
+<l:l i="50">Ä“</l:l>
+<l:l i="50">Ä”</l:l>
+<l:l i="50">Ä•</l:l>
+<l:l i="50">Ä–</l:l>
+<l:l i="50">Ä—</l:l>
+<l:l i="50">Ę</l:l>
+<l:l i="50">Ä™</l:l>
+<l:l i="50">Äš</l:l>
+<l:l i="50">Ä›</l:l>
+<l:l i="50">È„</l:l>
+<l:l i="50">È…</l:l>
+<l:l i="50">Ȇ</l:l>
+<l:l i="50">ȇ</l:l>
+<l:l i="50">Ȩ</l:l>
+<l:l i="50">È©</l:l>
+<l:l i="50">Ḕ</l:l>
+<l:l i="50">ḕ</l:l>
+<l:l i="50">Ḗ</l:l>
+<l:l i="50">ḗ</l:l>
+<l:l i="50">Ḙ</l:l>
+<l:l i="50">ḙ</l:l>
+<l:l i="50">Ḛ</l:l>
+<l:l i="50">ḛ</l:l>
+<l:l i="50">Ḝ</l:l>
+<l:l i="50">á¸</l:l>
+<l:l i="50">Ẹ</l:l>
+<l:l i="50">ẹ</l:l>
+<l:l i="50">Ẻ</l:l>
+<l:l i="50">ẻ</l:l>
+<l:l i="50">Ẽ</l:l>
+<l:l i="50">ẽ</l:l>
+<l:l i="50">Ế</l:l>
+<l:l i="50">ế</l:l>
+<l:l i="50">Ề</l:l>
+<l:l i="50">á»</l:l>
+<l:l i="50">Ể</l:l>
+<l:l i="50">ể</l:l>
+<l:l i="50">Ễ</l:l>
+<l:l i="50">á»…</l:l>
+<l:l i="50">Ệ</l:l>
+<l:l i="50">ệ</l:l>
+<l:l i="60">F</l:l>
+<l:l i="60">f</l:l>
+<l:l i="60">Æ‘</l:l>
+<l:l i="60">Æ’</l:l>
+<l:l i="60">Ḟ</l:l>
+<l:l i="60">ḟ</l:l>
+<l:l i="70">G</l:l>
+<l:l i="70">g</l:l>
+<l:l i="70">Ĝ</l:l>
+<l:l i="70">Ä</l:l>
+<l:l i="70">Äž</l:l>
+<l:l i="70">ÄŸ</l:l>
+<l:l i="70">Ä </l:l>
+<l:l i="70">Ä¡</l:l>
+<l:l i="70">Ä¢</l:l>
+<l:l i="70">Ä£</l:l>
+<l:l i="70">Æ“</l:l>
+<l:l i="70">É </l:l>
+<l:l i="70">Ǥ</l:l>
+<l:l i="70">Ç¥</l:l>
+<l:l i="70">Ǧ</l:l>
+<l:l i="70">ǧ</l:l>
+<l:l i="70">Ç´</l:l>
+<l:l i="70">ǵ</l:l>
+<l:l i="70">Ḡ</l:l>
+<l:l i="70">ḡ</l:l>
+<l:l i="80">H</l:l>
+<l:l i="80">h</l:l>
+<l:l i="80">Ĥ</l:l>
+<l:l i="80">Ä¥</l:l>
+<l:l i="80">Ħ</l:l>
+<l:l i="80">ħ</l:l>
+<l:l i="80">Èž</l:l>
+<l:l i="80">ÈŸ</l:l>
+<l:l i="80">ɦ</l:l>
+<l:l i="80">Ḣ</l:l>
+<l:l i="80">ḣ</l:l>
+<l:l i="80">Ḥ</l:l>
+<l:l i="80">ḥ</l:l>
+<l:l i="80">Ḧ</l:l>
+<l:l i="80">ḧ</l:l>
+<l:l i="80">Ḩ</l:l>
+<l:l i="80">ḩ</l:l>
+<l:l i="80">Ḫ</l:l>
+<l:l i="80">ḫ</l:l>
+<l:l i="80">ẖ</l:l>
+<l:l i="90">I</l:l>
+<l:l i="90">i</l:l>
+<l:l i="90">Ì</l:l>
+<l:l i="90">ì</l:l>
+<l:l i="90">Ã</l:l>
+<l:l i="90">í</l:l>
+<l:l i="90">ÃŽ</l:l>
+<l:l i="90">î</l:l>
+<l:l i="90">Ã</l:l>
+<l:l i="90">ï</l:l>
+<l:l i="90">Ĩ</l:l>
+<l:l i="90">Ä©</l:l>
+<l:l i="90">Ī</l:l>
+<l:l i="90">Ä«</l:l>
+<l:l i="90">Ĭ</l:l>
+<l:l i="90">Ä­</l:l>
+<l:l i="90">Ä®</l:l>
+<l:l i="90">į</l:l>
+<l:l i="90">Ä°</l:l>
+<l:l i="90">Æ—</l:l>
+<l:l i="90">ɨ</l:l>
+<l:l i="90">Ç</l:l>
+<l:l i="90">Ç</l:l>
+<l:l i="90">Ȉ</l:l>
+<l:l i="90">ȉ</l:l>
+<l:l i="90">ÈŠ</l:l>
+<l:l i="90">È‹</l:l>
+<l:l i="90">Ḭ</l:l>
+<l:l i="90">ḭ</l:l>
+<l:l i="90">Ḯ</l:l>
+<l:l i="90">ḯ</l:l>
+<l:l i="90">Ỉ</l:l>
+<l:l i="90">ỉ</l:l>
+<l:l i="90">Ị</l:l>
+<l:l i="90">ị</l:l>
+<l:l i="100">J</l:l>
+<l:l i="100">j</l:l>
+<l:l i="100">Ä´</l:l>
+<l:l i="100">ĵ</l:l>
+<l:l i="100">Ç°</l:l>
+<l:l i="100">Ê</l:l>
+<l:l i="110">K</l:l>
+<l:l i="110">k</l:l>
+<l:l i="110">Ķ</l:l>
+<l:l i="110">Ä·</l:l>
+<l:l i="110">Ƙ</l:l>
+<l:l i="110">Æ™</l:l>
+<l:l i="110">Ǩ</l:l>
+<l:l i="110">Ç©</l:l>
+<l:l i="110">Ḱ</l:l>
+<l:l i="110">ḱ</l:l>
+<l:l i="110">Ḳ</l:l>
+<l:l i="110">ḳ</l:l>
+<l:l i="110">Ḵ</l:l>
+<l:l i="110">ḵ</l:l>
+<l:l i="120">L</l:l>
+<l:l i="120">l</l:l>
+<l:l i="120">Ĺ</l:l>
+<l:l i="120">ĺ</l:l>
+<l:l i="120">Ä»</l:l>
+<l:l i="120">ļ</l:l>
+<l:l i="120">Ľ</l:l>
+<l:l i="120">ľ</l:l>
+<l:l i="120">Ä¿</l:l>
+<l:l i="120">Å€</l:l>
+<l:l i="120">Å</l:l>
+<l:l i="120">Å‚</l:l>
+<l:l i="120">Æš</l:l>
+<l:l i="120">Lj</l:l>
+<l:l i="120">È´</l:l>
+<l:l i="120">É«</l:l>
+<l:l i="120">ɬ</l:l>
+<l:l i="120">É­</l:l>
+<l:l i="120">Ḷ</l:l>
+<l:l i="120">ḷ</l:l>
+<l:l i="120">Ḹ</l:l>
+<l:l i="120">ḹ</l:l>
+<l:l i="120">Ḻ</l:l>
+<l:l i="120">ḻ</l:l>
+<l:l i="120">Ḽ</l:l>
+<l:l i="120">ḽ</l:l>
+<l:l i="130">M</l:l>
+<l:l i="130">m</l:l>
+<l:l i="130">ɱ</l:l>
+<l:l i="130">Ḿ</l:l>
+<l:l i="130">ḿ</l:l>
+<l:l i="130">á¹€</l:l>
+<l:l i="130">á¹</l:l>
+<l:l i="130">Ṃ</l:l>
+<l:l i="130">ṃ</l:l>
+<l:l i="140">N</l:l>
+<l:l i="140">n</l:l>
+<l:l i="140">Ñ</l:l>
+<l:l i="140">ñ</l:l>
+<l:l i="140">Ń</l:l>
+<l:l i="140">Å„</l:l>
+<l:l i="140">Å…</l:l>
+<l:l i="140">ņ</l:l>
+<l:l i="140">Ň</l:l>
+<l:l i="140">ň</l:l>
+<l:l i="140">Æ</l:l>
+<l:l i="140">ɲ</l:l>
+<l:l i="140">Æž</l:l>
+<l:l i="140">È </l:l>
+<l:l i="140">Ç‹</l:l>
+<l:l i="140">Ǹ</l:l>
+<l:l i="140">ǹ</l:l>
+<l:l i="140">ȵ</l:l>
+<l:l i="140">ɳ</l:l>
+<l:l i="140">Ṅ</l:l>
+<l:l i="140">á¹…</l:l>
+<l:l i="140">Ṇ</l:l>
+<l:l i="140">ṇ</l:l>
+<l:l i="140">Ṉ</l:l>
+<l:l i="140">ṉ</l:l>
+<l:l i="140">Ṋ</l:l>
+<l:l i="140">ṋ</l:l>
+<l:l i="150">O</l:l>
+<l:l i="150">o</l:l>
+<l:l i="150">Ã’</l:l>
+<l:l i="150">ò</l:l>
+<l:l i="150">Ó</l:l>
+<l:l i="150">ó</l:l>
+<l:l i="150">Ô</l:l>
+<l:l i="150">ô</l:l>
+<l:l i="150">Õ</l:l>
+<l:l i="150">õ</l:l>
+<l:l i="150">Ö</l:l>
+<l:l i="150">ö</l:l>
+<l:l i="150">Ø</l:l>
+<l:l i="150">ø</l:l>
+<l:l i="150">Ō</l:l>
+<l:l i="150">Å</l:l>
+<l:l i="150">ÅŽ</l:l>
+<l:l i="150">Å</l:l>
+<l:l i="150">Å</l:l>
+<l:l i="150">Å‘</l:l>
+<l:l i="150">ÆŸ</l:l>
+<l:l i="150">Æ </l:l>
+<l:l i="150">Æ¡</l:l>
+<l:l i="150">Ç‘</l:l>
+<l:l i="150">Ç’</l:l>
+<l:l i="150">Ǫ</l:l>
+<l:l i="150">Ç«</l:l>
+<l:l i="150">Ǭ</l:l>
+<l:l i="150">Ç­</l:l>
+<l:l i="150">Ǿ</l:l>
+<l:l i="150">Ç¿</l:l>
+<l:l i="150">Ȍ</l:l>
+<l:l i="150">È</l:l>
+<l:l i="150">ÈŽ</l:l>
+<l:l i="150">È</l:l>
+<l:l i="150">Ȫ</l:l>
+<l:l i="150">È«</l:l>
+<l:l i="150">Ȭ</l:l>
+<l:l i="150">È­</l:l>
+<l:l i="150">È®</l:l>
+<l:l i="150">ȯ</l:l>
+<l:l i="150">È°</l:l>
+<l:l i="150">ȱ</l:l>
+<l:l i="150">Ṍ</l:l>
+<l:l i="150">á¹</l:l>
+<l:l i="150">Ṏ</l:l>
+<l:l i="150">á¹</l:l>
+<l:l i="150">á¹</l:l>
+<l:l i="150">ṑ</l:l>
+<l:l i="150">á¹’</l:l>
+<l:l i="150">ṓ</l:l>
+<l:l i="150">Ọ</l:l>
+<l:l i="150">á»</l:l>
+<l:l i="150">Ỏ</l:l>
+<l:l i="150">á»</l:l>
+<l:l i="150">á»</l:l>
+<l:l i="150">ố</l:l>
+<l:l i="150">á»’</l:l>
+<l:l i="150">ồ</l:l>
+<l:l i="150">á»”</l:l>
+<l:l i="150">ổ</l:l>
+<l:l i="150">á»–</l:l>
+<l:l i="150">á»—</l:l>
+<l:l i="150">Ộ</l:l>
+<l:l i="150">á»™</l:l>
+<l:l i="150">Ớ</l:l>
+<l:l i="150">á»›</l:l>
+<l:l i="150">Ờ</l:l>
+<l:l i="150">á»</l:l>
+<l:l i="150">Ở</l:l>
+<l:l i="150">ở</l:l>
+<l:l i="150">á» </l:l>
+<l:l i="150">ỡ</l:l>
+<l:l i="150">Ợ</l:l>
+<l:l i="150">ợ</l:l>
+<l:l i="160">P</l:l>
+<l:l i="160">p</l:l>
+<l:l i="160">Ƥ</l:l>
+<l:l i="160">Æ¥</l:l>
+<l:l i="160">á¹”</l:l>
+<l:l i="160">ṕ</l:l>
+<l:l i="160">á¹–</l:l>
+<l:l i="160">á¹—</l:l>
+<l:l i="170">Q</l:l>
+<l:l i="170">q</l:l>
+<l:l i="170">Ê </l:l>
+<l:l i="180">R</l:l>
+<l:l i="180">r</l:l>
+<l:l i="180">Å”</l:l>
+<l:l i="180">Å•</l:l>
+<l:l i="180">Å–</l:l>
+<l:l i="180">Å—</l:l>
+<l:l i="180">Ř</l:l>
+<l:l i="180">Å™</l:l>
+<l:l i="180">È</l:l>
+<l:l i="180">È‘</l:l>
+<l:l i="180">È’</l:l>
+<l:l i="180">È“</l:l>
+<l:l i="180">ɼ</l:l>
+<l:l i="180">ɽ</l:l>
+<l:l i="180">ɾ</l:l>
+<l:l i="180">Ṙ</l:l>
+<l:l i="180">á¹™</l:l>
+<l:l i="180">Ṛ</l:l>
+<l:l i="180">á¹›</l:l>
+<l:l i="180">Ṝ</l:l>
+<l:l i="180">á¹</l:l>
+<l:l i="180">Ṟ</l:l>
+<l:l i="180">ṟ</l:l>
+<l:l i="190">S</l:l>
+<l:l i="190">s</l:l>
+<l:l i="190">Åš</l:l>
+<l:l i="190">Å›</l:l>
+<l:l i="190">Ŝ</l:l>
+<l:l i="190">Å</l:l>
+<l:l i="190">Åž</l:l>
+<l:l i="190">ÅŸ</l:l>
+<l:l i="190">Å </l:l>
+<l:l i="190">Å¡</l:l>
+<l:l i="190">Ș</l:l>
+<l:l i="190">È™</l:l>
+<l:l i="190">Ê‚</l:l>
+<l:l i="190">á¹ </l:l>
+<l:l i="190">ṡ</l:l>
+<l:l i="190">á¹¢</l:l>
+<l:l i="190">á¹£</l:l>
+<l:l i="190">Ṥ</l:l>
+<l:l i="190">á¹¥</l:l>
+<l:l i="190">Ṧ</l:l>
+<l:l i="190">ṧ</l:l>
+<l:l i="190">Ṩ</l:l>
+<l:l i="190">ṩ</l:l>
+<l:l i="200">T</l:l>
+<l:l i="200">t</l:l>
+<l:l i="200">Å¢</l:l>
+<l:l i="200">Å£</l:l>
+<l:l i="200">Ť</l:l>
+<l:l i="200">Å¥</l:l>
+<l:l i="200">Ŧ</l:l>
+<l:l i="200">ŧ</l:l>
+<l:l i="200">Æ«</l:l>
+<l:l i="200">Ƭ</l:l>
+<l:l i="200">Æ­</l:l>
+<l:l i="200">Æ®</l:l>
+<l:l i="200">ʈ</l:l>
+<l:l i="200">Èš</l:l>
+<l:l i="200">È›</l:l>
+<l:l i="200">ȶ</l:l>
+<l:l i="200">Ṫ</l:l>
+<l:l i="200">ṫ</l:l>
+<l:l i="200">Ṭ</l:l>
+<l:l i="200">á¹­</l:l>
+<l:l i="200">á¹®</l:l>
+<l:l i="200">ṯ</l:l>
+<l:l i="200">á¹°</l:l>
+<l:l i="200">á¹±</l:l>
+<l:l i="200">ẗ</l:l>
+<l:l i="210">U</l:l>
+<l:l i="210">u</l:l>
+<l:l i="210">Ù</l:l>
+<l:l i="210">ù</l:l>
+<l:l i="210">Ú</l:l>
+<l:l i="210">ú</l:l>
+<l:l i="210">Û</l:l>
+<l:l i="210">û</l:l>
+<l:l i="210">Ü</l:l>
+<l:l i="210">ü</l:l>
+<l:l i="210">Ũ</l:l>
+<l:l i="210">Å©</l:l>
+<l:l i="210">Ū</l:l>
+<l:l i="210">Å«</l:l>
+<l:l i="210">Ŭ</l:l>
+<l:l i="210">Å­</l:l>
+<l:l i="210">Å®</l:l>
+<l:l i="210">ů</l:l>
+<l:l i="210">Å°</l:l>
+<l:l i="210">ű</l:l>
+<l:l i="210">Ų</l:l>
+<l:l i="210">ų</l:l>
+<l:l i="210">Ư</l:l>
+<l:l i="210">Æ°</l:l>
+<l:l i="210">Ç“</l:l>
+<l:l i="210">Ç”</l:l>
+<l:l i="210">Ç•</l:l>
+<l:l i="210">Ç–</l:l>
+<l:l i="210">Ç—</l:l>
+<l:l i="210">ǘ</l:l>
+<l:l i="210">Ç™</l:l>
+<l:l i="210">Çš</l:l>
+<l:l i="210">Ç›</l:l>
+<l:l i="210">ǜ</l:l>
+<l:l i="210">È”</l:l>
+<l:l i="210">È•</l:l>
+<l:l i="210">È–</l:l>
+<l:l i="210">È—</l:l>
+<l:l i="210">á¹²</l:l>
+<l:l i="210">á¹³</l:l>
+<l:l i="210">á¹´</l:l>
+<l:l i="210">á¹µ</l:l>
+<l:l i="210">Ṷ</l:l>
+<l:l i="210">á¹·</l:l>
+<l:l i="210">Ṹ</l:l>
+<l:l i="210">á¹¹</l:l>
+<l:l i="210">Ṻ</l:l>
+<l:l i="210">á¹»</l:l>
+<l:l i="210">Ụ</l:l>
+<l:l i="210">ụ</l:l>
+<l:l i="210">Ủ</l:l>
+<l:l i="210">ủ</l:l>
+<l:l i="210">Ứ</l:l>
+<l:l i="210">ứ</l:l>
+<l:l i="210">Ừ</l:l>
+<l:l i="210">ừ</l:l>
+<l:l i="210">Ử</l:l>
+<l:l i="210">á»­</l:l>
+<l:l i="210">á»®</l:l>
+<l:l i="210">ữ</l:l>
+<l:l i="210">á»°</l:l>
+<l:l i="210">á»±</l:l>
+<l:l i="220">V</l:l>
+<l:l i="220">v</l:l>
+<l:l i="220">Ʋ</l:l>
+<l:l i="220">Ê‹</l:l>
+<l:l i="220">á¹¼</l:l>
+<l:l i="220">á¹½</l:l>
+<l:l i="220">á¹¾</l:l>
+<l:l i="220">ṿ</l:l>
+<l:l i="230">W</l:l>
+<l:l i="230">w</l:l>
+<l:l i="230">Å´</l:l>
+<l:l i="230">ŵ</l:l>
+<l:l i="230">Ẁ</l:l>
+<l:l i="230">áº</l:l>
+<l:l i="230">Ẃ</l:l>
+<l:l i="230">ẃ</l:l>
+<l:l i="230">Ẅ</l:l>
+<l:l i="230">ẅ</l:l>
+<l:l i="230">Ẇ</l:l>
+<l:l i="230">ẇ</l:l>
+<l:l i="230">Ẉ</l:l>
+<l:l i="230">ẉ</l:l>
+<l:l i="230">ẘ</l:l>
+<l:l i="240">X</l:l>
+<l:l i="240">x</l:l>
+<l:l i="240">Ẋ</l:l>
+<l:l i="240">ẋ</l:l>
+<l:l i="240">Ẍ</l:l>
+<l:l i="240">áº</l:l>
+<l:l i="250">Y</l:l>
+<l:l i="250">y</l:l>
+<l:l i="250">Ã</l:l>
+<l:l i="250">ý</l:l>
+<l:l i="250">ÿ</l:l>
+<l:l i="250">Ÿ</l:l>
+<l:l i="250">Ŷ</l:l>
+<l:l i="250">Å·</l:l>
+<l:l i="250">Ƴ</l:l>
+<l:l i="250">Æ´</l:l>
+<l:l i="250">Ȳ</l:l>
+<l:l i="250">ȳ</l:l>
+<l:l i="250">Ẏ</l:l>
+<l:l i="250">áº</l:l>
+<l:l i="250">ẙ</l:l>
+<l:l i="250">Ỳ</l:l>
+<l:l i="250">ỳ</l:l>
+<l:l i="250">á»´</l:l>
+<l:l i="250">ỵ</l:l>
+<l:l i="250">Ỷ</l:l>
+<l:l i="250">á»·</l:l>
+<l:l i="250">Ỹ</l:l>
+<l:l i="250">ỹ</l:l>
+<l:l i="260">Z</l:l>
+<l:l i="260">z</l:l>
+<l:l i="260">Ź</l:l>
+<l:l i="260">ź</l:l>
+<l:l i="260">Å»</l:l>
+<l:l i="260">ż</l:l>
+<l:l i="260">Ž</l:l>
+<l:l i="260">ž</l:l>
+<l:l i="260">Ƶ</l:l>
+<l:l i="260">ƶ</l:l>
+<l:l i="260">Ȥ</l:l>
+<l:l i="260">È¥</l:l>
+<l:l i="260">Ê</l:l>
+<l:l i="260">Ê‘</l:l>
+<l:l i="260">áº</l:l>
+<l:l i="260">ẑ</l:l>
+<l:l i="260">Ẓ</l:l>
+<l:l i="260">ẓ</l:l>
+<l:l i="260">Ẕ</l:l>
+<l:l i="260">ẕ</l:l>
+</l:letters>
+</l:l10n>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/tr.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/tr.xml
new file mode 100644
index 0000000..652911d
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/tr.xml
@@ -0,0 +1,666 @@
+<?xml version="1.0" encoding="utf-8"?>
+<l:l10n xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0" language="tr" english-language-name="Turkish">
+
+<!-- * This file is generated automatically. -->
+<!-- * To submit changes to this file upstream (to the DocBook Project) -->
+<!-- * do not submit an edited version of this file. Instead, submit an -->
+<!-- * edited version of the source file at the following location: -->
+<!-- * -->
+<!-- * https://docbook.svn.sourceforge.net/svnroot/docbook/trunk/gentext/locale/tr.xml -->
+<!-- * -->
+<!-- * E-mail the edited tr.xml source file to: -->
+<!-- * -->
+<!-- * docbook-developers@lists.sourceforge.net -->
+
+<!-- ******************************************************************** -->
+
+<!-- This file is part of the XSL DocBook Stylesheet distribution. -->
+<!-- See ../README or http://docbook.sf.net/release/xsl/current/ for -->
+<!-- copyright and other information. -->
+
+<!-- ******************************************************************** -->
+<!-- In these files, % with a letter is used for a placeholder: -->
+<!-- %t is the current element's title -->
+<!-- %s is the current element's subtitle (if applicable)-->
+<!-- %n is the current element's number label-->
+<!-- %p is the current element's page number (if applicable)-->
+<!-- ******************************************************************** -->
+
+
+<l:gentext key="Abstract" text="Özet"/>
+<l:gentext key="abstract" text="Özet"/>
+<l:gentext key="Acknowledgements" text="Acknowledgements" lang="en"/>
+<l:gentext key="acknowledgements" text="Acknowledgements" lang="en"/>
+<l:gentext key="Answer" text="Cevap:"/>
+<l:gentext key="answer" text="Cevap:"/>
+<l:gentext key="Appendix" text="Ek"/>
+<l:gentext key="appendix" text="Ek"/>
+<l:gentext key="Article" text="Makale"/>
+<l:gentext key="article" text="Makale"/>
+<l:gentext key="Author" text="Yazar"/>
+<l:gentext key="Bibliography" text="Kaynakça"/>
+<l:gentext key="bibliography" text="Kaynakça"/>
+<l:gentext key="Book" text="Kitap"/>
+<l:gentext key="book" text="Kitap"/>
+<l:gentext key="CAUTION" text="DÄ°KKAT"/>
+<l:gentext key="Caution" text="Dikkat"/>
+<l:gentext key="caution" text="Dikkat"/>
+<l:gentext key="Chapter" text="Bölüm"/>
+<l:gentext key="chapter" text="Bölüm"/>
+<l:gentext key="Colophon" text="Kitap hakkında"/>
+<l:gentext key="colophon" text="Kitap hakkında"/>
+<l:gentext key="Copyright" text="Telif Hakkı"/>
+<l:gentext key="copyright" text="Telif Hakkı"/>
+<l:gentext key="Dedication" text="Ä°thaf"/>
+<l:gentext key="dedication" text="Ä°thaf"/>
+<l:gentext key="Edition" text="Baskı"/>
+<l:gentext key="edition" text="Baskı"/>
+<l:gentext key="Editor" text="Editor" lang="en"/>
+<l:gentext key="Equation" text="Denklem"/>
+<l:gentext key="equation" text="Denklem"/>
+<l:gentext key="Example" text="Örnek"/>
+<l:gentext key="example" text="Örnek"/>
+<l:gentext key="Figure" text="Åžekil"/>
+<l:gentext key="figure" text="Åžekil"/>
+<l:gentext key="Glossary" text="Sözlük"/>
+<l:gentext key="glossary" text="Sözlük"/>
+<l:gentext key="GlossSee" text="Bkz."/>
+<l:gentext key="glosssee" text="Bkz."/>
+<l:gentext key="GlossSeeAlso" text="Bkz."/>
+<l:gentext key="glossseealso" text="Bkz."/>
+<l:gentext key="IMPORTANT" text="ÖNEMLİ"/>
+<l:gentext key="important" text="Önemli"/>
+<l:gentext key="Important" text="Önemli"/>
+<l:gentext key="Index" text="Dizin"/>
+<l:gentext key="index" text="Dizin"/>
+<l:gentext key="ISBN" text="ISBN"/>
+<l:gentext key="isbn" text="ISBN"/>
+<l:gentext key="LegalNotice" text="Yasal Uyarı"/>
+<l:gentext key="legalnotice" text="Yasal Uyarı"/>
+<l:gentext key="MsgAud" text="Hedef Okuyucu"/>
+<l:gentext key="msgaud" text="Hedef Okuyucu"/>
+<l:gentext key="MsgLevel" text="Düzey"/>
+<l:gentext key="msglevel" text="Düzey"/>
+<l:gentext key="MsgOrig" text="Kaynak"/>
+<l:gentext key="msgorig" text="Kaynak"/>
+<l:gentext key="NOTE" text="NOT"/>
+<l:gentext key="Note" text="Not"/>
+<l:gentext key="note" text="Not"/>
+<l:gentext key="Part" text="Kısım"/>
+<l:gentext key="part" text="Kısım"/>
+<l:gentext key="Preface" text="Önsöz"/>
+<l:gentext key="preface" text="Önsöz"/>
+<l:gentext key="Procedure" text="Yönerge"/>
+<l:gentext key="procedure" text="Yönerge"/>
+<l:gentext key="ProductionSet" text="Prodüksiyon"/>
+<l:gentext key="PubDate" text="Yayımlanma Tarihi"/>
+<l:gentext key="pubdate" text="Yayımlanma Tarihi"/>
+<l:gentext key="Published" text="Yayımlanma"/>
+<l:gentext key="published" text="Yayımlanma"/>
+<l:gentext key="Publisher" text="Publisher" lang="en"/>
+<l:gentext key="Qandadiv" text="S ve C"/>
+<l:gentext key="qandadiv" text="S ve C"/>
+<l:gentext key="QandASet" text="Frequently Asked Questions" lang="en"/>
+<l:gentext key="Question" text="Soru:"/>
+<l:gentext key="question" text="Soru:"/>
+<l:gentext key="RefEntry" text=""/>
+<l:gentext key="refentry" text=""/>
+<l:gentext key="Reference" text="Referans"/>
+<l:gentext key="reference" text="Referans"/>
+<l:gentext key="References" text="References" lang="en"/>
+<l:gentext key="RefName" text="Referans Adı"/>
+<l:gentext key="refname" text="Referans Adı"/>
+<l:gentext key="RefSection" text=""/>
+<l:gentext key="refsection" text=""/>
+<l:gentext key="RefSynopsisDiv" text="Özet"/>
+<l:gentext key="refsynopsisdiv" text="Özet"/>
+<l:gentext key="RevHistory" text="Baskı Tarihçesi"/>
+<l:gentext key="revhistory" text="Baskı Tarihçesi"/>
+<l:gentext key="revision" text="Baskı"/>
+<l:gentext key="Revision" text="Baskı"/>
+<l:gentext key="sect1" text="Kısım"/>
+<l:gentext key="sect2" text="Kısım"/>
+<l:gentext key="sect3" text="Kısım"/>
+<l:gentext key="sect4" text="Kısım"/>
+<l:gentext key="sect5" text="Kısım"/>
+<l:gentext key="section" text="Kısım"/>
+<l:gentext key="Section" text="Kısım"/>
+<l:gentext key="see" text="bkz."/>
+<l:gentext key="See" text="Bkz."/>
+<l:gentext key="seealso" text="Bkz."/>
+<l:gentext key="Seealso" text="Bakınız"/>
+<l:gentext key="SeeAlso" text="Bakınız"/>
+<l:gentext key="set" text="Takım"/>
+<l:gentext key="Set" text="Takım"/>
+<l:gentext key="setindex" text="Takım Dizini"/>
+<l:gentext key="SetIndex" text="Takım Dizini"/>
+<l:gentext key="Sidebar" text=""/>
+<l:gentext key="sidebar" text="kenar çubuğu"/>
+<l:gentext key="step" text="adım"/>
+<l:gentext key="Step" text="Adım"/>
+<l:gentext key="table" text="Tablo"/>
+<l:gentext key="Table" text="Tablo"/>
+<l:gentext key="task" text="Task" lang="en"/>
+<l:gentext key="Task" text="Task" lang="en"/>
+<l:gentext key="tip" text="Ä°pucu"/>
+<l:gentext key="TIP" text="Ä°PUCU"/>
+<l:gentext key="Tip" text="Ä°pucu"/>
+<l:gentext key="Warning" text="Uyarı"/>
+<l:gentext key="warning" text="Uyarı"/>
+<l:gentext key="WARNING" text="UYARI"/>
+<l:gentext key="and" text="ve"/>
+<l:gentext key="by" text=""/>
+<l:gentext key="Edited" text="Yayına hazırlayan"/>
+<l:gentext key="edited" text="yayına hazırlayan"/>
+<l:gentext key="Editedby" text="Yayına hazırlayan"/>
+<l:gentext key="editedby" text="yayına hazırlayan"/>
+<l:gentext key="in" text=""/>
+<l:gentext key="lastlistcomma" text=","/>
+<l:gentext key="listcomma" text=","/>
+<l:gentext key="notes" text="Notlar"/>
+<l:gentext key="Notes" text="Notlar"/>
+<l:gentext key="Pgs" text="Sayfa"/>
+<l:gentext key="pgs" text="Sayfa"/>
+<l:gentext key="Revisedby" text="Düzeltmeler: "/>
+<l:gentext key="revisedby" text="Düzeltmeler: "/>
+<l:gentext key="TableNotes" text="Notlar"/>
+<l:gentext key="tablenotes" text="Notlar"/>
+<l:gentext key="TableofContents" text="İçindekiler"/>
+<l:gentext key="tableofcontents" text="İçindekiler"/>
+<l:gentext key="unexpectedelementname" text="Beklenmeyen eleman adı"/>
+<l:gentext key="unsupported" text="desteklenmiyor"/>
+<l:gentext key="xrefto" text=""/>
+<l:gentext key="Authors" text="Authors" lang="en"/>
+<l:gentext key="copyeditor" text="Copy Editor" lang="en"/>
+<l:gentext key="graphicdesigner" text="Graphic Designer" lang="en"/>
+<l:gentext key="productioneditor" text="Production Editor" lang="en"/>
+<l:gentext key="technicaleditor" text="Technical Editor" lang="en"/>
+<l:gentext key="translator" text="Translator" lang="en"/>
+<l:gentext key="listofequations" text="Denklemler"/>
+<l:gentext key="ListofEquations" text="Denklemler"/>
+<l:gentext key="ListofExamples" text="Örnekler"/>
+<l:gentext key="listofexamples" text="Örnekler"/>
+<l:gentext key="ListofFigures" text="Åžekiller"/>
+<l:gentext key="listoffigures" text="Åžekiller"/>
+<l:gentext key="ListofProcedures" text="Yönergeler"/>
+<l:gentext key="listofprocedures" text="Yönergeler"/>
+<l:gentext key="listoftables" text="Tablolar"/>
+<l:gentext key="ListofTables" text="Tablolar"/>
+<l:gentext key="ListofUnknown" text="Bilinmeyenler"/>
+<l:gentext key="listofunknown" text="Bilinmeyenler"/>
+<l:gentext key="nav-home" text="Başlangıç"/>
+<l:gentext key="nav-next" text="Sonraki"/>
+<l:gentext key="nav-next-sibling" text="Sonraki Bölüm"/>
+<l:gentext key="nav-prev" text="Önceki"/>
+<l:gentext key="nav-prev-sibling" text="Önceki Bölüm"/>
+<l:gentext key="nav-up" text="Yukarı"/>
+<l:gentext key="nav-toc" text="İçindekiler"/>
+<l:gentext key="Draft" text="Taslak"/>
+<l:gentext key="above" text="üstünde"/>
+<l:gentext key="below" text="altında"/>
+<l:gentext key="sectioncalled" text=""/>
+<l:gentext key="index symbols" text="Semboller"/>
+<l:gentext key="writing-mode" text="lr-tb"/>
+<l:gentext key="lowercase.alpha" text="abcçdefgğhıijklmnoöprsştuüvyz"/>
+<l:gentext key="uppercase.alpha" text="ABCÇDEFGĞHIİJKLMNOÖPRSŞTUÜVYZ"/>
+<l:gentext key="normalize.sort.input" text="AaÀàÃáÂâÃãÄäÅåĀÄĂ㥹ÇǎǞǟǠǡǺǻȀÈȂȃȦȧḀá¸áºšáº áº¡áº¢áº£áº¤áº¥áº¦áº§áº¨áº©áºªáº«áº¬áº­áº®áº¯áº°áº±áº²áº³áº´áºµáº¶áº·BbÆ€ÆɓƂƃḂḃḄḅḆḇCcÇçĆćĈĉĊċČÄƇƈɕḈḉDdÄŽÄÄđƊɗƋƌDžDzȡɖḊḋḌá¸á¸Žá¸á¸á¸‘ḒḓEeÈèÉéÊêËëĒēĔĕĖėĘęĚěȄȅȆȇȨȩḔḕḖḗḘḙḚḛḜá¸áº¸áº¹áººáº»áº¼áº½áº¾áº¿á»€á»á»‚ểỄễỆệFfƑƒḞḟGgÄœÄĞğĠġĢģƓɠǤǥǦǧǴǵḠḡHhĤĥĦħȞȟɦḢḣḤḥḦḧḨḩḪḫẖIiÌìÃíÎîÃïĨĩĪīĬĭĮįİƗɨÇÇȈȉȊȋḬḭḮḯỈỉỊịJjĴĵǰÊKkĶķƘƙǨǩḰḱḲḳḴḵLlĹĺĻļĽľĿŀÅłƚLjȴɫɬɭḶḷḸḹḺḻḼḽMmɱḾḿṀá¹á¹‚ṃNnÑñŃńŅņŇňÆɲƞȠNjǸǹȵɳṄṅṆṇṈṉṊṋOoÒòÓóÔôÕõÖöØøŌÅÅŽÅÅőƟƠơǑǒǪǫǬǭǾǿȌÈÈŽÈȪȫȬȭȮȯȰȱṌá¹á¹Žá¹á¹á¹‘ṒṓỌá»á»Žá»á»á»‘ỒồỔổỖỗỘộỚớỜá»á»žá»Ÿá» á»¡á»¢á»£PpƤƥṔṕṖṗQqÊ RrŔŕŖŗŘřÈȑȒȓɼɽɾṘṙṚṛṜá¹á¹žá¹ŸSsŚśŜÅŞşŠšȘșʂṠṡṢṣṤṥṦṧṨṩTtŢţŤťŦŧƫƬƭƮʈȚțȶṪṫṬṭṮṯṰṱẗUuÙùÚúÛûÜüŨũŪūŬŭŮůŰűŲųƯưǓǔǕǖǗǘǙǚǛǜȔȕȖȗṲṳṴṵṶṷṸṹṺṻỤụỦủỨứỪừỬửỮữỰựVvƲʋṼṽṾṿWwŴŵẀáºáº‚ẃẄẅẆẇẈẉẘXxẊẋẌáºYyÃýÿŸŶŷƳƴȲȳẎáºáº™á»²á»³á»´á»µá»¶á»·á»¸á»¹ZzŹźŻżŽžƵƶȤȥÊÊ‘áºáº‘ẒẓẔẕẕ" lang="en"/>
+<l:gentext key="normalize.sort.output" text="AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBCCCCCCCCCCCCCCCCCDDDDDDDDDDDDDDDDDDDDDDDDEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEFFFFFFGGGGGGGGGGGGGGGGGGGGHHHHHHHHHHHHHHHHHHHHIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIJJJJJJKKKKKKKKKKKKKKLLLLLLLLLLLLLLLLLLLLLLLLLLMMMMMMMMMNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOPPPPPPPPQQQRRRRRRRRRRRRRRRRRRRRRRRSSSSSSSSSSSSSSSSSSSSSSSTTTTTTTTTTTTTTTTTTTTTTTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUVVVVVVVVWWWWWWWWWWWWWWWXXXXXXYYYYYYYYYYYYYYYYYYYYYYYZZZZZZZZZZZZZZZZZZZZZ" lang="en"/>
+<l:dingbat key="startquote" text="“"/>
+<l:dingbat key="endquote" text="â€"/>
+<l:dingbat key="nestedstartquote" text="‘"/>
+<l:dingbat key="nestedendquote" text="’"/>
+<l:dingbat key="singlestartquote" text="‘"/>
+<l:dingbat key="singleendquote" text="’"/>
+<l:dingbat key="bullet" text="•"/>
+<l:gentext key="hyphenation-character" text="-"/>
+<l:gentext key="hyphenation-push-character-count" text="3"/>
+<l:gentext key="hyphenation-remain-character-count" text="2"/>
+<l:context name="styles"><l:template name="person-name" text="first-last"/>
+</l:context>
+<l:context name="title"><l:template name="abstract" text="%t"/>
+<l:template name="acknowledgements" text="%t" lang="en"/>
+<l:template name="answer" text="%t"/>
+<l:template name="appendix" text="Ek %n. %t"/>
+<l:template name="article" text="%t"/>
+<l:template name="authorblurb" text="%t"/>
+<l:template name="bibliodiv" text="%t"/>
+<l:template name="biblioentry" text="%t"/>
+<l:template name="bibliography" text="%t"/>
+<l:template name="bibliolist" text="%t" lang="en"/>
+<l:template name="bibliomixed" text="%t"/>
+<l:template name="bibliomset" text="%t"/>
+<l:template name="biblioset" text="%t"/>
+<l:template name="blockquote" text="%t"/>
+<l:template name="book" text="%t"/>
+<l:template name="calloutlist" text="%t"/>
+<l:template name="caution" text="%t"/>
+<l:template name="chapter" text="Bölüm %n. %t"/>
+<l:template name="colophon" text="%t"/>
+<l:template name="dedication" text="%t"/>
+<l:template name="equation" text="Denklem %n. %t"/>
+<l:template name="example" text="Örnek %n. %t"/>
+<l:template name="figure" text="Åžekil %n. %t"/>
+<l:template name="foil" text="%t" lang="en"/>
+<l:template name="foilgroup" text="%t" lang="en"/>
+<l:template name="formalpara" text="%t"/>
+<l:template name="glossary" text="%t"/>
+<l:template name="glossdiv" text="%t"/>
+<l:template name="glosslist" text="%t" lang="en"/>
+<l:template name="glossentry" text="%t"/>
+<l:template name="important" text="%t"/>
+<l:template name="index" text="%t"/>
+<l:template name="indexdiv" text="%t"/>
+<l:template name="itemizedlist" text="%t"/>
+<l:template name="legalnotice" text="%t"/>
+<l:template name="listitem" text=""/>
+<l:template name="lot" text="%t"/>
+<l:template name="msg" text="%t"/>
+<l:template name="msgexplan" text="%t"/>
+<l:template name="msgmain" text="%t"/>
+<l:template name="msgrel" text="%t"/>
+<l:template name="msgset" text="%t"/>
+<l:template name="msgsub" text="%t"/>
+<l:template name="note" text="%t"/>
+<l:template name="orderedlist" text="%t"/>
+<l:template name="part" text="Kısım %n. %t"/>
+<l:template name="partintro" text="%t"/>
+<l:template name="preface" text="%t"/>
+<l:template name="procedure" text="%t"/>
+<l:template name="procedure.formal" text="Yönerge %n. %t"/>
+<l:template name="productionset" text="%t"/>
+<l:template name="productionset.formal" text="Prodüksiyon %n"/>
+<l:template name="qandadiv" text="%t"/>
+<l:template name="qandaentry" text="%t"/>
+<l:template name="qandaset" text="%t"/>
+<l:template name="question" text="%t"/>
+<l:template name="refentry" text="%t"/>
+<l:template name="reference" text="%t"/>
+<l:template name="refsection" text="%t"/>
+<l:template name="refsect1" text="%t"/>
+<l:template name="refsect2" text="%t"/>
+<l:template name="refsect3" text="%t"/>
+<l:template name="refsynopsisdiv" text="%t"/>
+<l:template name="refsynopsisdivinfo" text="%t"/>
+<l:template name="segmentedlist" text="%t"/>
+<l:template name="set" text="%t"/>
+<l:template name="setindex" text="%t"/>
+<l:template name="sidebar" text="%t"/>
+<l:template name="step" text="%t"/>
+<l:template name="table" text="Tablo %n. %t"/>
+<l:template name="task" text="%t"/>
+<l:template name="tasksummary" text="%t" lang="en"/>
+<l:template name="taskprerequisites" text="%t" lang="en"/>
+<l:template name="taskrelated" text="%t" lang="en"/>
+<l:template name="tip" text="%t"/>
+<l:template name="toc" text="%t"/>
+<l:template name="variablelist" text="%t"/>
+<l:template name="varlistentry" text=""/>
+<l:template name="warning" text="%t"/>
+</l:context>
+<l:context name="title-unnumbered"><l:template name="appendix" text="%t"/>
+<l:template name="article/appendix" text="%t"/>
+<l:template name="bridgehead" text="%t"/>
+<l:template name="chapter" text="%t"/>
+<l:template name="sect1" text="%t"/>
+<l:template name="sect2" text="%t"/>
+<l:template name="sect3" text="%t"/>
+<l:template name="sect4" text="%t"/>
+<l:template name="sect5" text="%t"/>
+<l:template name="section" text="%t"/>
+<l:template name="simplesect" text="%t"/>
+<l:template name="part" text="%t" lang="en"/>
+</l:context>
+<l:context name="title-numbered"><l:template name="appendix" text="Ek %n. %t"/>
+<l:template name="article/appendix" text="%n. %t"/>
+<l:template name="bridgehead" text="%n. %t"/>
+<l:template name="chapter" text="Bölüm %n. %t"/>
+<l:template name="part" text="Kısım %n. %t"/>
+<l:template name="sect1" text="%n. %t"/>
+<l:template name="sect2" text="%n. %t"/>
+<l:template name="sect3" text="%n. %t"/>
+<l:template name="sect4" text="%n. %t"/>
+<l:template name="sect5" text="%n. %t"/>
+<l:template name="section" text="%n. %t"/>
+<l:template name="simplesect" text="%t"/>
+</l:context>
+<l:context name="subtitle"><l:template name="appendix" text="%s"/>
+<l:template name="acknowledgements" text="%s" lang="en"/>
+<l:template name="article" text="%s"/>
+<l:template name="bibliodiv" text="%s"/>
+<l:template name="biblioentry" text="%s"/>
+<l:template name="bibliography" text="%s"/>
+<l:template name="bibliomixed" text="%s"/>
+<l:template name="bibliomset" text="%s"/>
+<l:template name="biblioset" text="%s"/>
+<l:template name="book" text="%s"/>
+<l:template name="chapter" text="%s"/>
+<l:template name="colophon" text="%s"/>
+<l:template name="dedication" text="%s"/>
+<l:template name="glossary" text="%s"/>
+<l:template name="glossdiv" text="%s"/>
+<l:template name="index" text="%s"/>
+<l:template name="indexdiv" text="%s"/>
+<l:template name="lot" text="%s"/>
+<l:template name="part" text="%s"/>
+<l:template name="partintro" text="%s"/>
+<l:template name="preface" text="%s"/>
+<l:template name="refentry" text="%s"/>
+<l:template name="reference" text="%s"/>
+<l:template name="refsection" text="%s"/>
+<l:template name="refsect1" text="%s"/>
+<l:template name="refsect2" text="%s"/>
+<l:template name="refsect3" text="%s"/>
+<l:template name="refsynopsisdiv" text="%s"/>
+<l:template name="sect1" text="%s"/>
+<l:template name="sect2" text="%s"/>
+<l:template name="sect3" text="%s"/>
+<l:template name="sect4" text="%s"/>
+<l:template name="sect5" text="%s"/>
+<l:template name="section" text="%s"/>
+<l:template name="set" text="%s"/>
+<l:template name="setindex" text="%s"/>
+<l:template name="sidebar" text="%s"/>
+<l:template name="simplesect" text="%s"/>
+<l:template name="toc" text="%s"/>
+</l:context>
+<l:context name="xref"><l:template name="abstract" text="%t"/>
+<l:template name="acknowledgements" text="%t" lang="en"/>
+<l:template name="answer" text="Cevap: %n"/>
+<l:template name="appendix" text="%t"/>
+<l:template name="article" text="%t"/>
+<l:template name="authorblurb" text="%t"/>
+<l:template name="bibliodiv" text="%t"/>
+<l:template name="bibliography" text="%t"/>
+<l:template name="bibliomset" text="%t"/>
+<l:template name="biblioset" text="%t"/>
+<l:template name="blockquote" text="%t"/>
+<l:template name="book" text="%t"/>
+<l:template name="calloutlist" text="%t"/>
+<l:template name="caution" text="%t"/>
+<l:template name="chapter" text="%t"/>
+<l:template name="colophon" text="%t"/>
+<l:template name="constraintdef" text="%t"/>
+<l:template name="dedication" text="%t"/>
+<l:template name="equation" text="%t"/>
+<l:template name="example" text="%t"/>
+<l:template name="figure" text="%t"/>
+<l:template name="foil" text="%t" lang="en"/>
+<l:template name="foilgroup" text="%t" lang="en"/>
+<l:template name="formalpara" text="%t"/>
+<l:template name="glossary" text="%t"/>
+<l:template name="glossdiv" text="%t"/>
+<l:template name="important" text="%t"/>
+<l:template name="index" text="%t"/>
+<l:template name="indexdiv" text="%t"/>
+<l:template name="itemizedlist" text="%t"/>
+<l:template name="legalnotice" text="%t"/>
+<l:template name="listitem" text="%n"/>
+<l:template name="lot" text="%t"/>
+<l:template name="msg" text="%t"/>
+<l:template name="msgexplan" text="%t"/>
+<l:template name="msgmain" text="%t"/>
+<l:template name="msgrel" text="%t"/>
+<l:template name="msgset" text="%t"/>
+<l:template name="msgsub" text="%t"/>
+<l:template name="note" text="%t"/>
+<l:template name="orderedlist" text="%t"/>
+<l:template name="part" text="%t"/>
+<l:template name="partintro" text="%t"/>
+<l:template name="preface" text="%t"/>
+<l:template name="procedure" text="%t"/>
+<l:template name="productionset" text="%t"/>
+<l:template name="qandadiv" text="%t"/>
+<l:template name="qandaentry" text="Soru: %n"/>
+<l:template name="qandaset" text="%t"/>
+<l:template name="question" text="Soru: %n"/>
+<l:template name="reference" text="%t"/>
+<l:template name="refsynopsisdiv" text="%t"/>
+<l:template name="segmentedlist" text="%t"/>
+<l:template name="set" text="%t"/>
+<l:template name="setindex" text="%t"/>
+<l:template name="sidebar" text="%t"/>
+<l:template name="table" text="%t"/>
+<l:template name="task" text="%t" lang="en"/>
+<l:template name="tip" text="%t"/>
+<l:template name="toc" text="%t"/>
+<l:template name="variablelist" text="%t"/>
+<l:template name="varlistentry" text="%n"/>
+<l:template name="warning" text="%t"/>
+<l:template name="olink.document.citation" text=" in %o" lang="en"/>
+<l:template name="olink.page.citation" text=" (page %p)" lang="en"/>
+<l:template name="page.citation" text=" [%p]"/>
+<l:template name="page" text="(sayfa %p)"/>
+<l:template name="docname" text=" in %o" lang="en"/>
+<l:template name="docnamelong" text=" in the document titled %o" lang="en"/>
+<l:template name="pageabbrev" text="(shf. %p)"/>
+<l:template name="Page" text="Sayfa %p"/>
+<l:template name="bridgehead" text=" “%tâ€"/>
+<l:template name="refsection" text=" “%tâ€"/>
+<l:template name="refsect1" text=" “%tâ€"/>
+<l:template name="refsect2" text=" “%tâ€"/>
+<l:template name="refsect3" text=" “%tâ€"/>
+<l:template name="sect1" text=" “%tâ€"/>
+<l:template name="sect2" text=" “%tâ€"/>
+<l:template name="sect3" text=" “%tâ€"/>
+<l:template name="sect4" text=" “%tâ€"/>
+<l:template name="sect5" text=" “%tâ€"/>
+<l:template name="section" text=" “%tâ€"/>
+<l:template name="simplesect" text=" “%tâ€"/>
+</l:context>
+<l:context name="xref-number"><l:template name="answer" text="Cevap: %n"/>
+<l:template name="appendix" text="Ek %n"/>
+<l:template name="bridgehead" text="Kısım %n"/>
+<l:template name="chapter" text="Bölüm %n"/>
+<l:template name="equation" text="Denklem %n"/>
+<l:template name="example" text="Örnek %n"/>
+<l:template name="figure" text="Şekil %n"/>
+<l:template name="part" text="Kısım %n"/>
+<l:template name="procedure" text="Yönerge %n"/>
+<l:template name="productionset" text="Prodüksiyon %n"/>
+<l:template name="qandadiv" text="S ve C %n"/>
+<l:template name="qandaentry" text="Soru: %n"/>
+<l:template name="question" text="Soru: %n"/>
+<l:template name="sect1" text="Kısım %n"/>
+<l:template name="sect2" text="Kısım %n"/>
+<l:template name="sect3" text="Kısım %n"/>
+<l:template name="sect4" text="Kısım %n"/>
+<l:template name="sect5" text="Kısım %n"/>
+<l:template name="section" text="Kısım %n"/>
+<l:template name="table" text="Tablo %n"/>
+</l:context>
+<l:context name="xref-number-and-title"><l:template name="appendix" text="Ek %n, %t"/>
+<l:template name="bridgehead" text="Kısım %n, “%tâ€"/>
+<l:template name="chapter" text="Bölüm %n, %t"/>
+<l:template name="equation" text="Denklem %n, “%tâ€"/>
+<l:template name="example" text="Örnek %n, “%tâ€"/>
+<l:template name="figure" text="Åžekil %n, “%tâ€"/>
+<l:template name="part" text="Kısım %n, “%tâ€"/>
+<l:template name="procedure" text="Yönerge %n, “%tâ€"/>
+<l:template name="productionset" text="Prodüksiyon %n, “%tâ€"/>
+<l:template name="qandadiv" text="S ve C %n, “%tâ€"/>
+<l:template name="refsect1" text=" “%tâ€"/>
+<l:template name="refsect2" text=" “%tâ€"/>
+<l:template name="refsect3" text=" “%tâ€"/>
+<l:template name="refsection" text=" “%tâ€"/>
+<l:template name="sect1" text="Kısım %n, “%tâ€"/>
+<l:template name="sect2" text="Kısım %n, “%tâ€"/>
+<l:template name="sect3" text="Kısım %n, “%tâ€"/>
+<l:template name="sect4" text="Kısım %n, “%tâ€"/>
+<l:template name="sect5" text="Kısım %n, “%tâ€"/>
+<l:template name="section" text="Kısım %n, “%tâ€"/>
+<l:template name="simplesect" text=" “%tâ€"/>
+<l:template name="table" text="Tablo %n, “%tâ€"/>
+</l:context>
+<l:context name="authorgroup"><l:template name="sep" text=", "/>
+<l:template name="sep2" text=" ve "/>
+<l:template name="seplast" text=", ve "/>
+</l:context>
+<l:context name="glossary"><l:template name="see" text="Bkz. %t."/>
+<l:template name="seealso" text="Bkz. %t."/>
+<l:template name="seealso-separator" text=", "/>
+</l:context>
+<l:context name="msgset"><l:template name="MsgAud" text="Hedef Okuyucu: "/>
+<l:template name="MsgLevel" text="Düzey: "/>
+<l:template name="MsgOrig" text="Kaynak: "/>
+</l:context>
+<l:context name="datetime"><l:template name="format" text="d/m/Y"/>
+</l:context>
+<l:context name="termdef"><l:template name="prefix" text="[Definition: " lang="en"/>
+<l:template name="suffix" text="]" lang="en"/>
+</l:context>
+<l:context name="datetime-full"><l:template name="January" text="Ocak"/>
+<l:template name="February" text="Åžubat"/>
+<l:template name="March" text="Mart"/>
+<l:template name="April" text="Nisan"/>
+<l:template name="May" text="Mayıs"/>
+<l:template name="June" text="Haziran"/>
+<l:template name="July" text="Temmuz"/>
+<l:template name="August" text="AÄŸustos"/>
+<l:template name="September" text="Eylül"/>
+<l:template name="October" text="Ekim"/>
+<l:template name="November" text="Kasım"/>
+<l:template name="December" text="Aralık"/>
+<l:template name="Monday" text="Pazartesi"/>
+<l:template name="Tuesday" text="Salı"/>
+<l:template name="Wednesday" text="Çarşamba"/>
+<l:template name="Thursday" text="PerÅŸembe"/>
+<l:template name="Friday" text="Cuma"/>
+<l:template name="Saturday" text="Cumartesi"/>
+<l:template name="Sunday" text="Pazar"/>
+</l:context>
+<l:context name="datetime-abbrev"><l:template name="Jan" text="Oca"/>
+<l:template name="Feb" text="Åžub"/>
+<l:template name="Mar" text="Mar"/>
+<l:template name="Apr" text="Nis"/>
+<l:template name="May" text="May"/>
+<l:template name="Jun" text="Haz"/>
+<l:template name="Jul" text="Tem"/>
+<l:template name="Aug" text="AÄŸu"/>
+<l:template name="Sep" text="Eyl"/>
+<l:template name="Oct" text="Eki"/>
+<l:template name="Nov" text="Kas"/>
+<l:template name="Dec" text="Ara"/>
+<l:template name="Mon" text="Pzt"/>
+<l:template name="Tue" text="Sal"/>
+<l:template name="Wed" text="Çar"/>
+<l:template name="Thu" text="Per"/>
+<l:template name="Fri" text="Cum"/>
+<l:template name="Sat" text="Cts"/>
+<l:template name="Sun" text="Paz"/>
+</l:context>
+<l:context name="htmlhelp"><l:template name="langcode" text="0x041f Turkish"/>
+</l:context>
+<l:context name="index"><l:template name="term-separator" text=", " lang="en"/>
+<l:template name="number-separator" text=", " lang="en"/>
+<l:template name="range-separator" text="-" lang="en"/>
+</l:context>
+<l:context name="iso690"><l:template name="lastfirst.sep" text=", " lang="en"/>
+<l:template name="alt.person.two.sep" text=" – " lang="en"/>
+<l:template name="alt.person.last.sep" text=" – " lang="en"/>
+<l:template name="alt.person.more.sep" text=" – " lang="en"/>
+<l:template name="primary.editor" text=" (ed.)" lang="en"/>
+<l:template name="primary.many" text=", et al." lang="en"/>
+<l:template name="primary.sep" text=". " lang="en"/>
+<l:template name="submaintitle.sep" text=": " lang="en"/>
+<l:template name="title.sep" text=". " lang="en"/>
+<l:template name="othertitle.sep" text=", " lang="en"/>
+<l:template name="medium1" text=" [" lang="en"/>
+<l:template name="medium2" text="]" lang="en"/>
+<l:template name="secondary.person.sep" text="; " lang="en"/>
+<l:template name="secondary.sep" text=". " lang="en"/>
+<l:template name="respons.sep" text=". " lang="en"/>
+<l:template name="edition.sep" text=". " lang="en"/>
+<l:template name="edition.serial.sep" text=", " lang="en"/>
+<l:template name="issuing.range" text="-" lang="en"/>
+<l:template name="issuing.div" text=", " lang="en"/>
+<l:template name="issuing.sep" text=". " lang="en"/>
+<l:template name="partnr.sep" text=". " lang="en"/>
+<l:template name="placepubl.sep" text=": " lang="en"/>
+<l:template name="publyear.sep" text=", " lang="en"/>
+<l:template name="pubinfo.sep" text=". " lang="en"/>
+<l:template name="spec.pubinfo.sep" text=", " lang="en"/>
+<l:template name="upd.sep" text=", " lang="en"/>
+<l:template name="datecit1" text=" [cited " lang="en"/>
+<l:template name="datecit2" text="]" lang="en"/>
+<l:template name="extent.sep" text=". " lang="en"/>
+<l:template name="locs.sep" text=", " lang="en"/>
+<l:template name="location.sep" text=". " lang="en"/>
+<l:template name="serie.sep" text=". " lang="en"/>
+<l:template name="notice.sep" text=". " lang="en"/>
+<l:template name="access" text="Available " lang="en"/>
+<l:template name="acctoo" text="Also available " lang="en"/>
+<l:template name="onwww" text="from World Wide Web" lang="en"/>
+<l:template name="oninet" text="from Internet" lang="en"/>
+<l:template name="access.end" text=": " lang="en"/>
+<l:template name="link1" text="&lt;" lang="en"/>
+<l:template name="link2" text="&gt;" lang="en"/>
+<l:template name="access.sep" text=". " lang="en"/>
+<l:template name="isbn" text="ISBN " lang="en"/>
+<l:template name="issn" text="ISSN " lang="en"/>
+<l:template name="stdnum.sep" text=". " lang="en"/>
+<l:template name="patcountry.sep" text=". " lang="en"/>
+<l:template name="pattype.sep" text=", " lang="en"/>
+<l:template name="patnum.sep" text=". " lang="en"/>
+<l:template name="patdate.sep" text=". " lang="en"/>
+</l:context><l:letters><l:l i="-1"/>
+<l:l i="0">Semboller</l:l>
+<l:l i="1">A</l:l>
+<l:l i="1">a</l:l>
+<l:l i="2">B</l:l>
+<l:l i="2">b</l:l>
+<l:l i="3">C</l:l>
+<l:l i="3">c</l:l>
+<l:l i="4">Ç</l:l>
+<l:l i="4">ç</l:l>
+<l:l i="5">D</l:l>
+<l:l i="5">d</l:l>
+<l:l i="6">E</l:l>
+<l:l i="6">e</l:l>
+<l:l i="7">F</l:l>
+<l:l i="7">f</l:l>
+<l:l i="8">G</l:l>
+<l:l i="8">g</l:l>
+<l:l i="9">Äž</l:l>
+<l:l i="9">ÄŸ</l:l>
+<l:l i="10">H</l:l>
+<l:l i="10">h</l:l>
+<l:l i="11">I</l:l>
+<l:l i="11">ı</l:l>
+<l:l i="12">Ä°</l:l>
+<l:l i="12">i</l:l>
+<l:l i="13">J</l:l>
+<l:l i="13">j</l:l>
+<l:l i="14">K</l:l>
+<l:l i="14">k</l:l>
+<l:l i="15">L</l:l>
+<l:l i="15">l</l:l>
+<l:l i="16">M</l:l>
+<l:l i="16">m</l:l>
+<l:l i="17">N</l:l>
+<l:l i="17">n</l:l>
+<l:l i="18">O</l:l>
+<l:l i="18">o</l:l>
+<l:l i="19">Ö</l:l>
+<l:l i="19">ö</l:l>
+<l:l i="20">P</l:l>
+<l:l i="20">p</l:l>
+<l:l i="21">R</l:l>
+<l:l i="21">r</l:l>
+<l:l i="22">S</l:l>
+<l:l i="22">s</l:l>
+<l:l i="23">Åž</l:l>
+<l:l i="23">ÅŸ</l:l>
+<l:l i="24">T</l:l>
+<l:l i="24">t</l:l>
+<l:l i="25">U</l:l>
+<l:l i="25">u</l:l>
+<l:l i="26">Ü</l:l>
+<l:l i="26">ü</l:l>
+<l:l i="27">V</l:l>
+<l:l i="27">v</l:l>
+<l:l i="28">Y</l:l>
+<l:l i="28">y</l:l>
+<l:l i="29">Z</l:l>
+<l:l i="29">z</l:l>
+</l:letters>
+</l:l10n>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/uk.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/uk.xml
new file mode 100644
index 0000000..4caf73f
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/uk.xml
@@ -0,0 +1,726 @@
+<?xml version="1.0" encoding="utf-8"?>
+<l:l10n xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0" language="uk" english-language-name="Ukrainian">
+
+<!-- * This file is generated automatically. -->
+<!-- * To submit changes to this file upstream (to the DocBook Project) -->
+<!-- * do not submit an edited version of this file. Instead, submit an -->
+<!-- * edited version of the source file at the following location: -->
+<!-- * -->
+<!-- * https://docbook.svn.sourceforge.net/svnroot/docbook/trunk/gentext/locale/uk.xml -->
+<!-- * -->
+<!-- * E-mail the edited uk.xml source file to: -->
+<!-- * -->
+<!-- * docbook-developers@lists.sourceforge.net -->
+
+<!-- ******************************************************************** -->
+
+<!-- This file is part of the XSL DocBook Stylesheet distribution. -->
+<!-- See ../README or http://docbook.sf.net/release/xsl/current/ for -->
+<!-- copyright and other information. -->
+
+<!-- ******************************************************************** -->
+<!-- In these files, % with a letter is used for a placeholder: -->
+<!-- %t is the current element's title -->
+<!-- %s is the current element's subtitle (if applicable)-->
+<!-- %n is the current element's number label-->
+<!-- %p is the current element's page number (if applicable)-->
+<!-- ******************************************************************** -->
+
+
+<l:gentext key="Abstract" text="ÐнотаціÑ"/>
+<l:gentext key="abstract" text="анотаціÑ"/>
+<l:gentext key="Acknowledgements" text="ПодÑки"/>
+<l:gentext key="acknowledgements" text="подÑки"/>
+<l:gentext key="Answer" text="Ð’:"/>
+<l:gentext key="answer" text="в:"/>
+<l:gentext key="Appendix" text="Додаток"/>
+<l:gentext key="appendix" text="додаток"/>
+<l:gentext key="Article" text="СтаттÑ"/>
+<l:gentext key="article" text="ÑтаттÑ"/>
+<l:gentext key="Author" text="Ðвтор"/>
+<l:gentext key="Bibliography" text="Література"/>
+<l:gentext key="bibliography" text="література"/>
+<l:gentext key="Book" text="Книга"/>
+<l:gentext key="book" text="книга"/>
+<l:gentext key="CAUTION" text="ЗÐСТЕРЕЖЕÐÐЯ"/>
+<l:gentext key="Caution" text="ЗаÑтереженнÑ"/>
+<l:gentext key="caution" text="заÑтереженнÑ"/>
+<l:gentext key="Chapter" text="Розділ"/>
+<l:gentext key="chapter" text="розділ"/>
+<l:gentext key="Colophon" text="Вихідні відомоÑÑ‚Ñ–"/>
+<l:gentext key="colophon" text="вихідні відомоÑÑ‚Ñ–"/>
+<l:gentext key="Copyright" text="ÐвторÑьке право"/>
+<l:gentext key="copyright" text="авторÑьке право"/>
+<l:gentext key="Dedication" text="ПриÑвÑта"/>
+<l:gentext key="dedication" text="приÑвÑта"/>
+<l:gentext key="Edition" text="ВиданнÑ"/>
+<l:gentext key="edition" text="виданнÑ"/>
+<l:gentext key="Editor" text="Editor"/>
+<l:gentext key="Equation" text="Формула"/>
+<l:gentext key="equation" text="Формула"/>
+<l:gentext key="Example" text="Приклад"/>
+<l:gentext key="example" text="приклад"/>
+<l:gentext key="Figure" text="РиÑунок"/>
+<l:gentext key="figure" text="РиÑунок"/>
+<l:gentext key="Glossary" text="ГлоÑарій"/>
+<l:gentext key="glossary" text="глоÑарій"/>
+<l:gentext key="GlossSee" text="Див."/>
+<l:gentext key="glosssee" text="див."/>
+<l:gentext key="GlossSeeAlso" text="Див. також"/>
+<l:gentext key="glossseealso" text="див. також"/>
+<l:gentext key="IMPORTANT" text="Ð’ÐЖЛИВО"/>
+<l:gentext key="important" text="важливо"/>
+<l:gentext key="Important" text="Важливо"/>
+<l:gentext key="Index" text="Покажчик"/>
+<l:gentext key="index" text="покажчик"/>
+<l:gentext key="ISBN" text="ISBN"/>
+<l:gentext key="isbn" text="ISBN"/>
+<l:gentext key="LegalNotice" text="Правова примітка"/>
+<l:gentext key="legalnotice" text="правова примітка"/>
+<l:gentext key="MsgAud" text="ÐудиторіÑ"/>
+<l:gentext key="msgaud" text="аудиторіÑ"/>
+<l:gentext key="MsgLevel" text="Рівень"/>
+<l:gentext key="msglevel" text="рівень"/>
+<l:gentext key="MsgOrig" text="Джерело"/>
+<l:gentext key="msgorig" text="джерело"/>
+<l:gentext key="NOTE" text="ПРИМІТКÐ"/>
+<l:gentext key="Note" text="Примітка"/>
+<l:gentext key="note" text="примітка"/>
+<l:gentext key="Part" text="ЧаÑтина"/>
+<l:gentext key="part" text="чаÑтина"/>
+<l:gentext key="Preface" text="Передмова"/>
+<l:gentext key="preface" text="передмова"/>
+<l:gentext key="Procedure" text="Процедура"/>
+<l:gentext key="procedure" text="Процедура"/>
+<l:gentext key="ProductionSet" text="ПродукціÑ"/>
+<l:gentext key="PubDate" text="Дата публікації"/>
+<l:gentext key="pubdate" text="дата публікації"/>
+<l:gentext key="Published" text="Опубліковано"/>
+<l:gentext key="published" text="опубліковано"/>
+<l:gentext key="Publisher" text="Видавець"/>
+<l:gentext key="Qandadiv" text="П і В"/>
+<l:gentext key="qandadiv" text="П і В"/>
+<l:gentext key="QandASet" text="ЧаÑÑ‚Ñ– питаннÑ"/>
+<l:gentext key="Question" text="П:"/>
+<l:gentext key="question" text="п:"/>
+<l:gentext key="RefEntry" text="Сторінка"/>
+<l:gentext key="refentry" text="Ñторінка"/>
+<l:gentext key="Reference" text="ПоÑиланнÑ"/>
+<l:gentext key="reference" text="поÑиланнÑ"/>
+<l:gentext key="References" text="ПоÑиланнÑ"/>
+<l:gentext key="RefName" text="Ðазва"/>
+<l:gentext key="refname" text="назва"/>
+<l:gentext key="RefSection" text="Розділ"/>
+<l:gentext key="refsection" text="розділ"/>
+<l:gentext key="RefSynopsisDiv" text="Короткий оглÑд"/>
+<l:gentext key="refsynopsisdiv" text="короткий оглÑд"/>
+<l:gentext key="RevHistory" text="ÐžÐ¿Ð¸Ñ Ð·Ð¼Ñ–Ð½"/>
+<l:gentext key="revhistory" text="Ð¾Ð¿Ð¸Ñ Ð·Ð¼Ñ–Ð½"/>
+<l:gentext key="revision" text="верÑÑ–Ñ"/>
+<l:gentext key="Revision" text="ВерÑÑ–Ñ"/>
+<l:gentext key="sect1" text="Розділ"/>
+<l:gentext key="sect2" text="Розділ"/>
+<l:gentext key="sect3" text="Розділ"/>
+<l:gentext key="sect4" text="Розділ"/>
+<l:gentext key="sect5" text="Розділ"/>
+<l:gentext key="section" text="розділ"/>
+<l:gentext key="Section" text="Розділ"/>
+<l:gentext key="see" text="див."/>
+<l:gentext key="See" text="Див."/>
+<l:gentext key="seealso" text="див. також"/>
+<l:gentext key="Seealso" text="Див. також"/>
+<l:gentext key="SeeAlso" text="Див. також"/>
+<l:gentext key="set" text="вибірка"/>
+<l:gentext key="Set" text="Вибірка"/>
+<l:gentext key="setindex" text="Ñ–Ð½Ð´ÐµÐºÑ Ð²Ð¸Ð±Ñ–Ñ€ÐºÐ¸"/>
+<l:gentext key="SetIndex" text="Ð†Ð½Ð´ÐµÐºÑ Ð²Ð¸Ð±Ñ–Ñ€ÐºÐ¸"/>
+<l:gentext key="Sidebar" text="Боковина"/>
+<l:gentext key="sidebar" text="боковина"/>
+<l:gentext key="step" text="крок"/>
+<l:gentext key="Step" text="Крок"/>
+<l:gentext key="table" text="таблицÑ"/>
+<l:gentext key="Table" text="ТаблицÑ"/>
+<l:gentext key="task" text="завданнÑ"/>
+<l:gentext key="Task" text="ЗавданнÑ"/>
+<l:gentext key="tip" text="підказка"/>
+<l:gentext key="TIP" text="ПІДКÐЗКÐ"/>
+<l:gentext key="Tip" text="Підказка"/>
+<l:gentext key="Warning" text="ЗаÑтереженнÑ"/>
+<l:gentext key="warning" text="заÑтереженнÑ"/>
+<l:gentext key="WARNING" text="ЗÐСТЕРЕЖЕÐÐЯ"/>
+<l:gentext key="and" text=""/>
+<l:gentext key="by" text=""/>
+<l:gentext key="Edited" text="За редакції"/>
+<l:gentext key="edited" text="за редакції"/>
+<l:gentext key="Editedby" text="За редакції"/>
+<l:gentext key="editedby" text="за редакції"/>
+<l:gentext key="in" text="у"/>
+<l:gentext key="lastlistcomma" text=","/>
+<l:gentext key="listcomma" text=","/>
+<l:gentext key="notes" text="примітки"/>
+<l:gentext key="Notes" text="Примітки"/>
+<l:gentext key="Pgs" text="Стор."/>
+<l:gentext key="pgs" text="Ñтор."/>
+<l:gentext key="Revisedby" text="Коректура:"/>
+<l:gentext key="revisedby" text="коректура:"/>
+<l:gentext key="TableNotes" text="Примітки"/>
+<l:gentext key="tablenotes" text="примітки"/>
+<l:gentext key="TableofContents" text="ЗміÑÑ‚"/>
+<l:gentext key="tableofcontents" text="зміÑÑ‚"/>
+<l:gentext key="unexpectedelementname" text="неочікувана назва елемента"/>
+<l:gentext key="unsupported" text="не підтримуєтьÑÑ"/>
+<l:gentext key="xrefto" text="xref to"/>
+<l:gentext key="Authors" text="Ðвтори"/>
+<l:gentext key="copyeditor" text="Редактор"/>
+<l:gentext key="graphicdesigner" text="Художнє оформленнÑ"/>
+<l:gentext key="productioneditor" text="Відповідальний за випуÑк"/>
+<l:gentext key="technicaleditor" text="Технічний редактор"/>
+<l:gentext key="translator" text="Перекладач"/>
+<l:gentext key="listofequations" text="ÑпиÑок формул"/>
+<l:gentext key="ListofEquations" text="СпиÑок формул"/>
+<l:gentext key="ListofExamples" text="СпиÑок прикладів"/>
+<l:gentext key="listofexamples" text="ÑпиÑок прикладів"/>
+<l:gentext key="ListofFigures" text="СпиÑок ілюÑтрацій"/>
+<l:gentext key="listoffigures" text="СпиÑок ілюÑтрацій"/>
+<l:gentext key="ListofProcedures" text="СпиÑок алгоритмів"/>
+<l:gentext key="listofprocedures" text="ÑпиÑок алгоритмів"/>
+<l:gentext key="listoftables" text="ÑпиÑок таблиць"/>
+<l:gentext key="ListofTables" text="СпиÑок таблиць"/>
+<l:gentext key="ListofUnknown" text="СпиÑок невідомих"/>
+<l:gentext key="listofunknown" text="ÑпиÑок невідомих"/>
+<l:gentext key="nav-home" text="Початок"/>
+<l:gentext key="nav-next" text="далі"/>
+<l:gentext key="nav-next-sibling" text="далі за рівнем"/>
+<l:gentext key="nav-prev" text="назад"/>
+<l:gentext key="nav-prev-sibling" text="назад за рівнем"/>
+<l:gentext key="nav-up" text="Догори"/>
+<l:gentext key="nav-toc" text="ЗміÑÑ‚"/>
+<l:gentext key="Draft" text="Чернетка"/>
+<l:gentext key="above" text="вище"/>
+<l:gentext key="below" text="нижче"/>
+<l:gentext key="sectioncalled" text="розділ з назвою"/>
+<l:gentext key="index symbols" text="Символи"/>
+<l:gentext key="writing-mode" text="lr-tb"/>
+<l:gentext key="lowercase.alpha" text="абвгґдеєжзиіїйклмнопрÑтуфхцчшщьюÑ"/>
+<l:gentext key="uppercase.alpha" text="ÐБВГÒДЕЄЖЗИІЇЙКЛМÐОПРСТУФХЦЧШЩЬЮЯ"/>
+<l:gentext key="normalize.sort.input" text="AaÀàÃáÂâÃãÄäÅåĀÄĂ㥹ÇǎǞǟǠǡǺǻȀÈȂȃȦȧḀá¸áºšáº áº¡áº¢áº£áº¤áº¥áº¦áº§áº¨áº©áºªáº«áº¬áº­áº®áº¯áº°áº±áº²áº³áº´áºµáº¶áº·BbÆ€ÆɓƂƃḂḃḄḅḆḇCcÇçĆćĈĉĊċČÄƇƈɕḈḉDdÄŽÄÄđƊɗƋƌDžDzȡɖḊḋḌá¸á¸Žá¸á¸á¸‘ḒḓEeÈèÉéÊêËëĒēĔĕĖėĘęĚěȄȅȆȇȨȩḔḕḖḗḘḙḚḛḜá¸áº¸áº¹áººáº»áº¼áº½áº¾áº¿á»€á»á»‚ểỄễỆệFfƑƒḞḟGgÄœÄĞğĠġĢģƓɠǤǥǦǧǴǵḠḡHhĤĥĦħȞȟɦḢḣḤḥḦḧḨḩḪḫẖIiÌìÃíÎîÃïĨĩĪīĬĭĮįİƗɨÇÇȈȉȊȋḬḭḮḯỈỉỊịJjĴĵǰÊKkĶķƘƙǨǩḰḱḲḳḴḵLlĹĺĻļĽľĿŀÅłƚLjȴɫɬɭḶḷḸḹḺḻḼḽMmɱḾḿṀá¹á¹‚ṃNnÑñŃńŅņŇňÆɲƞȠNjǸǹȵɳṄṅṆṇṈṉṊṋOoÒòÓóÔôÕõÖöØøŌÅÅŽÅÅőƟƠơǑǒǪǫǬǭǾǿȌÈÈŽÈȪȫȬȭȮȯȰȱṌá¹á¹Žá¹á¹á¹‘ṒṓỌá»á»Žá»á»á»‘ỒồỔổỖỗỘộỚớỜá»á»žá»Ÿá» á»¡á»¢á»£PpƤƥṔṕṖṗQqÊ RrŔŕŖŗŘřÈȑȒȓɼɽɾṘṙṚṛṜá¹á¹žá¹ŸSsŚśŜÅŞşŠšȘșʂṠṡṢṣṤṥṦṧṨṩTtŢţŤťŦŧƫƬƭƮʈȚțȶṪṫṬṭṮṯṰṱẗUuÙùÚúÛûÜüŨũŪūŬŭŮůŰűŲųƯưǓǔǕǖǗǘǙǚǛǜȔȕȖȗṲṳṴṵṶṷṸṹṺṻỤụỦủỨứỪừỬửỮữỰựVvƲʋṼṽṾṿWwŴŵẀáºáº‚ẃẄẅẆẇẈẉẘXxẊẋẌáºYyÃýÿŸŶŷƳƴȲȳẎáºáº™á»²á»³á»´á»µá»¶á»·á»¸á»¹ZzŹźŻżŽžƵƶȤȥÊÊ‘áºáº‘ẒẓẔẕẕ" lang="en"/>
+<l:gentext key="normalize.sort.output" text="AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBCCCCCCCCCCCCCCCCCDDDDDDDDDDDDDDDDDDDDDDDDEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEFFFFFFGGGGGGGGGGGGGGGGGGGGHHHHHHHHHHHHHHHHHHHHIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIJJJJJJKKKKKKKKKKKKKKLLLLLLLLLLLLLLLLLLLLLLLLLLMMMMMMMMMNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOPPPPPPPPQQQRRRRRRRRRRRRRRRRRRRRRRRSSSSSSSSSSSSSSSSSSSSSSSTTTTTTTTTTTTTTTTTTTTTTTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUVVVVVVVVWWWWWWWWWWWWWWWXXXXXXYYYYYYYYYYYYYYYYYYYYYYYZZZZZZZZZZZZZZZZZZZZZ" lang="en"/>
+<l:dingbat key="startquote" text="“"/>
+<l:dingbat key="endquote" text="â€"/>
+<l:dingbat key="nestedstartquote" text="‘"/>
+<l:dingbat key="nestedendquote" text="’"/>
+<l:dingbat key="singlestartquote" text="‘" lang="en"/>
+<l:dingbat key="singleendquote" text="’" lang="en"/>
+<l:dingbat key="bullet" text="•"/>
+<l:gentext key="hyphenation-character" text="-" lang="en"/>
+<l:gentext key="hyphenation-push-character-count" text="2" lang="en"/>
+<l:gentext key="hyphenation-remain-character-count" text="2" lang="en"/>
+<l:context name="styles"><l:template name="person-name" text="first-last"/>
+</l:context>
+<l:context name="title"><l:template name="abstract" text="%t"/>
+<l:template name="acknowledgements" text="%t" lang="en"/>
+<l:template name="answer" text="%t"/>
+<l:template name="appendix" text="Додаток %n. %t"/>
+<l:template name="article" text="%t"/>
+<l:template name="authorblurb" text="%t"/>
+<l:template name="bibliodiv" text="%t"/>
+<l:template name="biblioentry" text="%t"/>
+<l:template name="bibliography" text="%t"/>
+<l:template name="bibliolist" text="%t" lang="en"/>
+<l:template name="bibliomixed" text="%t"/>
+<l:template name="bibliomset" text="%t"/>
+<l:template name="biblioset" text="%t"/>
+<l:template name="blockquote" text="%t"/>
+<l:template name="book" text="%t"/>
+<l:template name="calloutlist" text="%t"/>
+<l:template name="caution" text="%t"/>
+<l:template name="chapter" text="Розділ %n. %t"/>
+<l:template name="colophon" text="%t"/>
+<l:template name="dedication" text="%t"/>
+<l:template name="equation" text="Формула %n. %t"/>
+<l:template name="example" text="Приклад %n. %t"/>
+<l:template name="figure" text="РиÑунок %n. %t"/>
+<l:template name="foil" text="%t" lang="en"/>
+<l:template name="foilgroup" text="%t" lang="en"/>
+<l:template name="formalpara" text="%t"/>
+<l:template name="glossary" text="%t"/>
+<l:template name="glossdiv" text="%t"/>
+<l:template name="glosslist" text="%t" lang="en"/>
+<l:template name="glossentry" text="%t" lang="en"/>
+<l:template name="important" text="%t"/>
+<l:template name="index" text="%t"/>
+<l:template name="indexdiv" text="%t"/>
+<l:template name="itemizedlist" text="%t"/>
+<l:template name="legalnotice" text="%t"/>
+<l:template name="listitem" text=""/>
+<l:template name="lot" text="%t"/>
+<l:template name="msg" text="%t"/>
+<l:template name="msgexplan" text="%t"/>
+<l:template name="msgmain" text="%t"/>
+<l:template name="msgrel" text="%t"/>
+<l:template name="msgset" text="%t"/>
+<l:template name="msgsub" text="%t"/>
+<l:template name="note" text="%t"/>
+<l:template name="orderedlist" text="%t"/>
+<l:template name="part" text="ЧаÑтина %n. %t"/>
+<l:template name="partintro" text="%t"/>
+<l:template name="preface" text="%t"/>
+<l:template name="procedure" text="%t"/>
+<l:template name="procedure.formal" text="Процедура %n. %t"/>
+<l:template name="productionset" text="%t"/>
+<l:template name="productionset.formal" text="ПродукціÑ %n"/>
+<l:template name="qandadiv" text="%t"/>
+<l:template name="qandaentry" text="%t"/>
+<l:template name="qandaset" text="%t"/>
+<l:template name="question" text="%t"/>
+<l:template name="refentry" text="%t"/>
+<l:template name="reference" text="%t"/>
+<l:template name="refsection" text="%t"/>
+<l:template name="refsect1" text="%t"/>
+<l:template name="refsect2" text="%t"/>
+<l:template name="refsect3" text="%t"/>
+<l:template name="refsynopsisdiv" text="%t"/>
+<l:template name="refsynopsisdivinfo" text="%t"/>
+<l:template name="segmentedlist" text="%t"/>
+<l:template name="set" text="%t"/>
+<l:template name="setindex" text="%t"/>
+<l:template name="sidebar" text="%t"/>
+<l:template name="step" text="%t"/>
+<l:template name="table" text="Ð¢Ð°Ð±Ð»Ð¸Ñ†Ñ %n. %t"/>
+<l:template name="task" text="%t" lang="en"/>
+<l:template name="tasksummary" text="%t" lang="en"/>
+<l:template name="taskprerequisites" text="%t" lang="en"/>
+<l:template name="taskrelated" text="%t" lang="en"/>
+<l:template name="tip" text="%t"/>
+<l:template name="toc" text="%t"/>
+<l:template name="variablelist" text="%t"/>
+<l:template name="varlistentry" text="" lang="en"/>
+<l:template name="warning" text="%t"/>
+</l:context>
+<l:context name="title-unnumbered"><l:template name="appendix" text="%t"/>
+<l:template name="article/appendix" text="%t" lang="en"/>
+<l:template name="bridgehead" text="%t"/>
+<l:template name="chapter" text="%t"/>
+<l:template name="sect1" text="%t"/>
+<l:template name="sect2" text="%t"/>
+<l:template name="sect3" text="%t"/>
+<l:template name="sect4" text="%t"/>
+<l:template name="sect5" text="%t"/>
+<l:template name="section" text="%t"/>
+<l:template name="simplesect" text="%t"/>
+<l:template name="part" text="%t" lang="en"/>
+</l:context>
+<l:context name="title-numbered"><l:template name="appendix" text="Додаток %n. %t"/>
+<l:template name="article/appendix" text="%n. %t" lang="en"/>
+<l:template name="bridgehead" text="%t"/>
+<l:template name="chapter" text="Розділ %n. %t"/>
+<l:template name="part" text="ЧаÑтина %n. %t"/>
+<l:template name="sect1" text="%n. %t"/>
+<l:template name="sect2" text="%n. %t"/>
+<l:template name="sect3" text="%n. %t"/>
+<l:template name="sect4" text="%n. %t"/>
+<l:template name="sect5" text="%n. %t"/>
+<l:template name="section" text="%n. %t"/>
+<l:template name="simplesect" text="%n. %t"/>
+</l:context>
+<l:context name="subtitle"><l:template name="appendix" text="%s"/>
+<l:template name="acknowledgements" text="%s" lang="en"/>
+<l:template name="article" text="%s"/>
+<l:template name="bibliodiv" text="%s"/>
+<l:template name="biblioentry" text="%s"/>
+<l:template name="bibliography" text="%s"/>
+<l:template name="bibliomixed" text="%s"/>
+<l:template name="bibliomset" text="%s"/>
+<l:template name="biblioset" text="%s"/>
+<l:template name="book" text="%s"/>
+<l:template name="chapter" text="%s"/>
+<l:template name="colophon" text="%s"/>
+<l:template name="dedication" text="%s"/>
+<l:template name="glossary" text="%s"/>
+<l:template name="glossdiv" text="%s"/>
+<l:template name="index" text="%s"/>
+<l:template name="indexdiv" text="%s"/>
+<l:template name="lot" text="%s"/>
+<l:template name="part" text="%s"/>
+<l:template name="partintro" text="%s"/>
+<l:template name="preface" text="%s"/>
+<l:template name="refentry" text="%s"/>
+<l:template name="reference" text="%s"/>
+<l:template name="refsection" text="%s"/>
+<l:template name="refsect1" text="%s"/>
+<l:template name="refsect2" text="%s"/>
+<l:template name="refsect3" text="%s"/>
+<l:template name="refsynopsisdiv" text="%s"/>
+<l:template name="sect1" text="%s"/>
+<l:template name="sect2" text="%s"/>
+<l:template name="sect3" text="%s"/>
+<l:template name="sect4" text="%s"/>
+<l:template name="sect5" text="%s"/>
+<l:template name="section" text="%s"/>
+<l:template name="set" text="%s"/>
+<l:template name="setindex" text="%s"/>
+<l:template name="sidebar" text="%s"/>
+<l:template name="simplesect" text="%s"/>
+<l:template name="toc" text="%s"/>
+</l:context>
+<l:context name="xref"><l:template name="abstract" text="%t"/>
+<l:template name="acknowledgements" text="%t" lang="en"/>
+<l:template name="answer" text="В: %n"/>
+<l:template name="appendix" text="%t"/>
+<l:template name="article" text="%t"/>
+<l:template name="authorblurb" text="%t"/>
+<l:template name="bibliodiv" text="%t"/>
+<l:template name="bibliography" text="%t"/>
+<l:template name="bibliomset" text="%t"/>
+<l:template name="biblioset" text="%t"/>
+<l:template name="blockquote" text="%t"/>
+<l:template name="book" text="%t"/>
+<l:template name="calloutlist" text="%t"/>
+<l:template name="caution" text="%t"/>
+<l:template name="chapter" text="%t"/>
+<l:template name="colophon" text="%t"/>
+<l:template name="constraintdef" text="%t"/>
+<l:template name="dedication" text="%t"/>
+<l:template name="equation" text="%t"/>
+<l:template name="example" text="%t"/>
+<l:template name="figure" text="%t"/>
+<l:template name="foil" text="%t" lang="en"/>
+<l:template name="foilgroup" text="%t" lang="en"/>
+<l:template name="formalpara" text="%t"/>
+<l:template name="glossary" text="%t"/>
+<l:template name="glossdiv" text="%t"/>
+<l:template name="important" text="%t"/>
+<l:template name="index" text="%t"/>
+<l:template name="indexdiv" text="%t"/>
+<l:template name="itemizedlist" text="%t"/>
+<l:template name="legalnotice" text="%t"/>
+<l:template name="listitem" text="%n"/>
+<l:template name="lot" text="%t"/>
+<l:template name="msg" text="%t"/>
+<l:template name="msgexplan" text="%t"/>
+<l:template name="msgmain" text="%t"/>
+<l:template name="msgrel" text="%t"/>
+<l:template name="msgset" text="%t"/>
+<l:template name="msgsub" text="%t"/>
+<l:template name="note" text="%t"/>
+<l:template name="orderedlist" text="%t"/>
+<l:template name="part" text="%t"/>
+<l:template name="partintro" text="%t"/>
+<l:template name="preface" text="%t"/>
+<l:template name="procedure" text="%t"/>
+<l:template name="productionset" text="%t"/>
+<l:template name="qandadiv" text="%t"/>
+<l:template name="qandaentry" text="П: %n"/>
+<l:template name="qandaset" text="%t"/>
+<l:template name="question" text="П: %n"/>
+<l:template name="reference" text="%t"/>
+<l:template name="refsynopsisdiv" text="%t"/>
+<l:template name="segmentedlist" text="%t"/>
+<l:template name="set" text="%t"/>
+<l:template name="setindex" text="%t"/>
+<l:template name="sidebar" text="%t"/>
+<l:template name="table" text="%t"/>
+<l:template name="task" text="%t" lang="en"/>
+<l:template name="tip" text="%t"/>
+<l:template name="toc" text="%t"/>
+<l:template name="variablelist" text="%t"/>
+<l:template name="varlistentry" text="%n"/>
+<l:template name="warning" text="%t"/>
+<l:template name="olink.document.citation" text=" in %o" lang="en"/>
+<l:template name="olink.page.citation" text=" (page %p)" lang="en"/>
+<l:template name="page.citation" text=" [%p]"/>
+<l:template name="page" text="(page %p)" lang="en"/>
+<l:template name="docname" text=" in %o" lang="en"/>
+<l:template name="docnamelong" text=" in the document titled %o" lang="en"/>
+<l:template name="pageabbrev" text="(p. %p)" lang="en"/>
+<l:template name="Page" text="Page %p" lang="en"/>
+<l:template name="bridgehead" text="“%tâ€"/>
+<l:template name="refsection" text="“%tâ€"/>
+<l:template name="refsect1" text="“%tâ€"/>
+<l:template name="refsect2" text="“%tâ€"/>
+<l:template name="refsect3" text="“%tâ€"/>
+<l:template name="sect1" text="“%tâ€"/>
+<l:template name="sect2" text="“%tâ€"/>
+<l:template name="sect3" text="“%tâ€"/>
+<l:template name="sect4" text="“%tâ€"/>
+<l:template name="sect5" text="“%tâ€"/>
+<l:template name="section" text="“%tâ€"/>
+<l:template name="simplesect" text="“%tâ€"/>
+</l:context>
+<l:context name="xref-number"><l:template name="answer" text="В: %n"/>
+<l:template name="appendix" text="Додаток %n"/>
+<l:template name="bridgehead" text="Розділ %n"/>
+<l:template name="chapter" text="Розділ %n"/>
+<l:template name="equation" text="Формула %n"/>
+<l:template name="example" text="Приклад %n"/>
+<l:template name="figure" text="РиÑунок %n"/>
+<l:template name="part" text="ЧаÑтина %n"/>
+<l:template name="procedure" text="Процедура %n"/>
+<l:template name="productionset" text="ПродукціÑ %n"/>
+<l:template name="qandadiv" text="П і В %n"/>
+<l:template name="qandaentry" text="П: %n"/>
+<l:template name="question" text="П: %n"/>
+<l:template name="sect1" text="Розділ %n"/>
+<l:template name="sect2" text="Розділ %n"/>
+<l:template name="sect3" text="Розділ %n"/>
+<l:template name="sect4" text="Розділ %n"/>
+<l:template name="sect5" text="Розділ %n"/>
+<l:template name="section" text="Розділ %n"/>
+<l:template name="table" text="ТаблицÑ %n"/>
+</l:context>
+<l:context name="xref-number-and-title"><l:template name="appendix" text="Додаток %n, %t"/>
+<l:template name="bridgehead" text="Розділ %n, “%tâ€"/>
+<l:template name="chapter" text="Розділ %n, %t"/>
+<l:template name="equation" text="Формула %n, “%tâ€"/>
+<l:template name="example" text="Приклад %n, “%tâ€"/>
+<l:template name="figure" text="РиÑунок %n, “%tâ€"/>
+<l:template name="part" text="ЧаÑтина %n, “%tâ€"/>
+<l:template name="procedure" text="Процедура %n, “%tâ€"/>
+<l:template name="productionset" text="ПродукціÑ %n, “%tâ€"/>
+<l:template name="qandadiv" text="П Ñ– В %n, “%tâ€"/>
+<l:template name="refsect1" text="розділ з назвою “%tâ€"/>
+<l:template name="refsect2" text="розділ з назвою “%tâ€"/>
+<l:template name="refsect3" text="розділ з назвою “%tâ€"/>
+<l:template name="refsection" text="розділ з назвою “%tâ€"/>
+<l:template name="sect1" text="Розділ %n, “%tâ€"/>
+<l:template name="sect2" text="Розділ %n, “%tâ€"/>
+<l:template name="sect3" text="Розділ %n, “%tâ€"/>
+<l:template name="sect4" text="Розділ %n, “%tâ€"/>
+<l:template name="sect5" text="Розділ %n, “%tâ€"/>
+<l:template name="section" text="Розділ %n, “%tâ€"/>
+<l:template name="simplesect" text="розділ з назвою “%tâ€"/>
+<l:template name="table" text="ТаблицÑ %n, “%tâ€"/>
+</l:context>
+<l:context name="authorgroup"><l:template name="sep" text=", "/>
+<l:template name="sep2" text=" "/>
+<l:template name="seplast" text=", "/>
+</l:context>
+<l:context name="glossary"><l:template name="see" text="Див. %t."/>
+<l:template name="seealso" text="Див. також %t."/>
+<l:template name="seealso-separator" text=", "/>
+</l:context>
+<l:context name="msgset"><l:template name="MsgAud" text="ÐудиторіÑ: "/>
+<l:template name="MsgLevel" text="Рівень: "/>
+<l:template name="MsgOrig" text="Джерело: "/>
+</l:context>
+<l:context name="datetime"><l:template name="format" text="d/m/Y"/>
+</l:context>
+<l:context name="termdef"><l:template name="prefix" text="[ВизначеннÑ: "/>
+<l:template name="suffix" text="]"/>
+</l:context>
+<l:context name="datetime-full"><l:template name="January" text="ÑічнÑ"/>
+<l:template name="February" text="лютого"/>
+<l:template name="March" text="березнÑ"/>
+<l:template name="April" text="квітнÑ"/>
+<l:template name="May" text="травнÑ"/>
+<l:template name="June" text="червнÑ"/>
+<l:template name="July" text="липнÑ"/>
+<l:template name="August" text="ÑерпнÑ"/>
+<l:template name="September" text="вереÑнÑ"/>
+<l:template name="October" text="жовтнÑ"/>
+<l:template name="November" text="лиÑтопада"/>
+<l:template name="December" text="груднÑ"/>
+<l:template name="Monday" text="понеділок"/>
+<l:template name="Tuesday" text="вівторок"/>
+<l:template name="Wednesday" text="Ñереда"/>
+<l:template name="Thursday" text="четвер"/>
+<l:template name="Friday" text="п’ÑтницÑ"/>
+<l:template name="Saturday" text="Ñубота"/>
+<l:template name="Sunday" text="неділÑ"/>
+</l:context>
+<l:context name="datetime-abbrev"><l:template name="Jan" text="Січ"/>
+<l:template name="Feb" text="Лют"/>
+<l:template name="Mar" text="Бер"/>
+<l:template name="Apr" text="Кві"/>
+<l:template name="May" text="Тра"/>
+<l:template name="Jun" text="Чер"/>
+<l:template name="Jul" text="Лип"/>
+<l:template name="Aug" text="Сер"/>
+<l:template name="Sep" text="Вер"/>
+<l:template name="Oct" text="Жов"/>
+<l:template name="Nov" text="ЛиÑ"/>
+<l:template name="Dec" text="Гру"/>
+<l:template name="Mon" text="Пн"/>
+<l:template name="Tue" text="Ð’Ñ‚"/>
+<l:template name="Wed" text="Ср"/>
+<l:template name="Thu" text="Чт"/>
+<l:template name="Fri" text="Пт"/>
+<l:template name="Sat" text="Сб"/>
+<l:template name="Sun" text="Ðд"/>
+</l:context>
+<l:context name="htmlhelp"><l:template name="langcode" text="0x0422 Ukrainian"/>
+</l:context>
+<l:context name="index"><l:template name="term-separator" text=", " lang="en"/>
+<l:template name="number-separator" text=", " lang="en"/>
+<l:template name="range-separator" text="-" lang="en"/>
+</l:context>
+<l:context name="iso690"><l:template name="lastfirst.sep" text=", " lang="en"/>
+<l:template name="alt.person.two.sep" text=" – " lang="en"/>
+<l:template name="alt.person.last.sep" text=" – " lang="en"/>
+<l:template name="alt.person.more.sep" text=" – " lang="en"/>
+<l:template name="primary.editor" text=" (ed.)" lang="en"/>
+<l:template name="primary.many" text=", et al." lang="en"/>
+<l:template name="primary.sep" text=". " lang="en"/>
+<l:template name="submaintitle.sep" text=": " lang="en"/>
+<l:template name="title.sep" text=". " lang="en"/>
+<l:template name="othertitle.sep" text=", " lang="en"/>
+<l:template name="medium1" text=" [" lang="en"/>
+<l:template name="medium2" text="]" lang="en"/>
+<l:template name="secondary.person.sep" text="; " lang="en"/>
+<l:template name="secondary.sep" text=". " lang="en"/>
+<l:template name="respons.sep" text=". " lang="en"/>
+<l:template name="edition.sep" text=". " lang="en"/>
+<l:template name="edition.serial.sep" text=", " lang="en"/>
+<l:template name="issuing.range" text="-" lang="en"/>
+<l:template name="issuing.div" text=", " lang="en"/>
+<l:template name="issuing.sep" text=". " lang="en"/>
+<l:template name="partnr.sep" text=". " lang="en"/>
+<l:template name="placepubl.sep" text=": " lang="en"/>
+<l:template name="publyear.sep" text=", " lang="en"/>
+<l:template name="pubinfo.sep" text=". " lang="en"/>
+<l:template name="spec.pubinfo.sep" text=", " lang="en"/>
+<l:template name="upd.sep" text=", " lang="en"/>
+<l:template name="datecit1" text=" [cited " lang="en"/>
+<l:template name="datecit2" text="]" lang="en"/>
+<l:template name="extent.sep" text=". " lang="en"/>
+<l:template name="locs.sep" text=", " lang="en"/>
+<l:template name="location.sep" text=". " lang="en"/>
+<l:template name="serie.sep" text=". " lang="en"/>
+<l:template name="notice.sep" text=". " lang="en"/>
+<l:template name="access" text="Available " lang="en"/>
+<l:template name="acctoo" text="Also available " lang="en"/>
+<l:template name="onwww" text="from World Wide Web" lang="en"/>
+<l:template name="oninet" text="from Internet" lang="en"/>
+<l:template name="access.end" text=": " lang="en"/>
+<l:template name="link1" text="&lt;" lang="en"/>
+<l:template name="link2" text="&gt;" lang="en"/>
+<l:template name="access.sep" text=". " lang="en"/>
+<l:template name="isbn" text="ISBN " lang="en"/>
+<l:template name="issn" text="ISSN " lang="en"/>
+<l:template name="stdnum.sep" text=". " lang="en"/>
+<l:template name="patcountry.sep" text=". " lang="en"/>
+<l:template name="pattype.sep" text=", " lang="en"/>
+<l:template name="patnum.sep" text=". " lang="en"/>
+<l:template name="patdate.sep" text=". " lang="en"/>
+</l:context><l:letters><l:l i="-1"/>
+<l:l i="0"/>
+<l:l i="10">A</l:l>
+<l:l i="10">a</l:l>
+<l:l i="20">B</l:l>
+<l:l i="20">b</l:l>
+<l:l i="30">C</l:l>
+<l:l i="30">c</l:l>
+<l:l i="40">D</l:l>
+<l:l i="40">d</l:l>
+<l:l i="50">E</l:l>
+<l:l i="50">e</l:l>
+<l:l i="60">F</l:l>
+<l:l i="60">f</l:l>
+<l:l i="70">G</l:l>
+<l:l i="70">g</l:l>
+<l:l i="80">H</l:l>
+<l:l i="80">h</l:l>
+<l:l i="90">I</l:l>
+<l:l i="90">i</l:l>
+<l:l i="100">J</l:l>
+<l:l i="100">j</l:l>
+<l:l i="110">K</l:l>
+<l:l i="110">k</l:l>
+<l:l i="120">L</l:l>
+<l:l i="120">l</l:l>
+<l:l i="130">M</l:l>
+<l:l i="130">m</l:l>
+<l:l i="140">N</l:l>
+<l:l i="140">n</l:l>
+<l:l i="150">O</l:l>
+<l:l i="150">o</l:l>
+<l:l i="160">P</l:l>
+<l:l i="160">p</l:l>
+<l:l i="170">Q</l:l>
+<l:l i="170">q</l:l>
+<l:l i="180">R</l:l>
+<l:l i="180">r</l:l>
+<l:l i="190">S</l:l>
+<l:l i="190">s</l:l>
+<l:l i="200">T</l:l>
+<l:l i="200">t</l:l>
+<l:l i="210">U</l:l>
+<l:l i="210">u</l:l>
+<l:l i="220">V</l:l>
+<l:l i="220">v</l:l>
+<l:l i="230">W</l:l>
+<l:l i="230">w</l:l>
+<l:l i="240">X</l:l>
+<l:l i="240">x</l:l>
+<l:l i="250">Y</l:l>
+<l:l i="250">y</l:l>
+<l:l i="260">Z</l:l>
+<l:l i="260">z</l:l>
+<l:l i="270">Ð</l:l>
+<l:l i="270">а</l:l>
+<l:l i="280">Б</l:l>
+<l:l i="280">б</l:l>
+<l:l i="290">Ð’</l:l>
+<l:l i="290">в</l:l>
+<l:l i="300">Г</l:l>
+<l:l i="300">г</l:l>
+<l:l i="310">Ò</l:l>
+<l:l i="310">Ò‘</l:l>
+<l:l i="320">Д</l:l>
+<l:l i="320">д</l:l>
+<l:l i="330">Е</l:l>
+<l:l i="330">е</l:l>
+<l:l i="340">Є</l:l>
+<l:l i="340">Ñ”</l:l>
+<l:l i="350">Ж</l:l>
+<l:l i="350">ж</l:l>
+<l:l i="360">З</l:l>
+<l:l i="360">з</l:l>
+<l:l i="370">И</l:l>
+<l:l i="370">и</l:l>
+<l:l i="380">І</l:l>
+<l:l i="380">Ñ–</l:l>
+<l:l i="390">Ї</l:l>
+<l:l i="390">Ñ—</l:l>
+<l:l i="400">Й</l:l>
+<l:l i="400">й</l:l>
+<l:l i="410">К</l:l>
+<l:l i="410">к</l:l>
+<l:l i="420">Л</l:l>
+<l:l i="420">л</l:l>
+<l:l i="430">М</l:l>
+<l:l i="430">м</l:l>
+<l:l i="440">Ð</l:l>
+<l:l i="440">н</l:l>
+<l:l i="450">О</l:l>
+<l:l i="450">о</l:l>
+<l:l i="460">П</l:l>
+<l:l i="460">п</l:l>
+<l:l i="470">Р</l:l>
+<l:l i="470">Ñ€</l:l>
+<l:l i="480">С</l:l>
+<l:l i="480">Ñ</l:l>
+<l:l i="490">Т</l:l>
+<l:l i="490">Ñ‚</l:l>
+<l:l i="500">У</l:l>
+<l:l i="500">у</l:l>
+<l:l i="510">Ф</l:l>
+<l:l i="510">Ñ„</l:l>
+<l:l i="520">Ð¥</l:l>
+<l:l i="520">Ñ…</l:l>
+<l:l i="530">Ц</l:l>
+<l:l i="530">ц</l:l>
+<l:l i="540">Ч</l:l>
+<l:l i="540">ч</l:l>
+<l:l i="550">Ш</l:l>
+<l:l i="550">ш</l:l>
+<l:l i="560">Щ</l:l>
+<l:l i="560">щ</l:l>
+<l:l i="570">Ь</l:l>
+<l:l i="570">ь</l:l>
+<l:l i="580">Ю</l:l>
+<l:l i="580">ÑŽ</l:l>
+<l:l i="590">Я</l:l>
+<l:l i="590">Ñ</l:l>
+</l:letters>
+</l:l10n>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/utility.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/utility.xml
new file mode 100644
index 0000000..d9cbe3c
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/utility.xml
@@ -0,0 +1,259 @@
+<?xml version="1.0"?>
+
+<reference xml:id="utility">
+ <info>
+ <title>Common » Utility Template Reference</title>
+ <releaseinfo role="meta">
+ $Id: utility.xsl 7101 2007-07-20 15:32:12Z xmldoc $
+ </releaseinfo>
+ </info>
+
+ <partintro xml:id="partintro">
+ <title>Introduction</title>
+
+<para>This is technical reference documentation for the
+ miscellaneous utility templates in the DocBook XSL
+ Stylesheets.</para>
+
+ <note>
+
+<para>These templates are defined in a separate file from the set
+ of “common†templates because some of the common templates
+ reference DocBook XSL stylesheet parameters, requiring the
+ entire set of parameters to be imported/included in any
+ stylesheet that imports/includes the common templates.</para>
+
+
+<para>The utility templates don’t import or include any DocBook
+ XSL stylesheet parameters, so the utility templates can be used
+ without importing the whole set of parameters.</para>
+
+ </note>
+
+<para>This is not intended to be user documentation. It is
+ provided for developers writing customization layers for the
+ stylesheets.</para>
+
+ </partintro>
+
+<refentry xmlns:xlink="http://www.w3.org/1999/xlink" xml:id="template.log.message">
+<refnamediv>
+<refname>log.message</refname>
+<refpurpose>Logs/emits formatted notes and warnings</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+<synopsis>&lt;xsl:template name="log.message"&gt;
+&lt;xsl:param name="level"/&gt;
+&lt;xsl:param name="source"/&gt;
+&lt;xsl:param name="context-desc"/&gt;
+&lt;xsl:param name="context-desc-field-length"&gt;12&lt;/xsl:param&gt;
+&lt;xsl:param name="context-desc-padded"&gt;
+ &lt;xsl:if test="not($context-desc = '')"&gt;
+ &lt;xsl:call-template name="pad-string"&gt;
+ &lt;xsl:with-param name="leftRight"&gt;right&lt;/xsl:with-param&gt;
+ &lt;xsl:with-param name="padVar" select="substring($context-desc, 1, $context-desc-field-length)"/&gt;
+ &lt;xsl:with-param name="length" select="$context-desc-field-length"/&gt;
+ &lt;/xsl:call-template&gt;
+ &lt;/xsl:if&gt;
+ &lt;/xsl:param&gt;
+&lt;xsl:param name="message"/&gt;
+&lt;xsl:param name="message-field-length" select="45"/&gt;
+&lt;xsl:param name="message-padded"&gt;
+ &lt;xsl:variable name="spaces-for-blank-level"&gt;
+ &lt;!-- * if the level field is blank, we'll need to pad out --&gt;
+ &lt;!-- * the message field with spaces to compensate --&gt;
+ &lt;xsl:choose&gt;
+ &lt;xsl:when test="$level = ''"&gt;
+ &lt;xsl:value-of select="4 + 2"/&gt;
+ &lt;!-- * 4 = hard-coded length of comment text ("Note" or "Warn") --&gt;
+ &lt;!-- * + 2 = length of colon-plus-space separator ": " --&gt;
+ &lt;/xsl:when&gt;
+ &lt;xsl:otherwise&gt;
+ &lt;xsl:value-of select="0"/&gt;
+ &lt;/xsl:otherwise&gt;
+ &lt;/xsl:choose&gt;
+ &lt;/xsl:variable&gt;
+ &lt;xsl:variable name="spaces-for-blank-context-desc"&gt;
+ &lt;!-- * if the context-description field is blank, we'll need --&gt;
+ &lt;!-- * to pad out the message field with spaces to compensate --&gt;
+ &lt;xsl:choose&gt;
+ &lt;xsl:when test="$context-desc = ''"&gt;
+ &lt;xsl:value-of select="$context-desc-field-length + 2"/&gt;
+ &lt;!-- * + 2 = length of colon-plus-space separator ": " --&gt;
+ &lt;/xsl:when&gt;
+ &lt;xsl:otherwise&gt;
+ &lt;xsl:value-of select="0"/&gt;
+ &lt;/xsl:otherwise&gt;
+ &lt;/xsl:choose&gt;
+ &lt;/xsl:variable&gt;
+ &lt;xsl:variable name="extra-spaces" select="$spaces-for-blank-level + $spaces-for-blank-context-desc"/&gt;
+ &lt;xsl:call-template name="pad-string"&gt;
+ &lt;xsl:with-param name="leftRight"&gt;right&lt;/xsl:with-param&gt;
+ &lt;xsl:with-param name="padVar" select="substring($message, 1, ($message-field-length + $extra-spaces))"/&gt;
+ &lt;xsl:with-param name="length" select="$message-field-length + $extra-spaces"/&gt;
+ &lt;/xsl:call-template&gt;
+ &lt;/xsl:param&gt;
+ ...
+&lt;/xsl:template&gt;</synopsis>
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>The <function>log.message</function> template is a utility
+ template for logging/emitting formatted messages – that is,
+ notes and warnings, along with a given log “level†and an
+ identifier for the “source†that the message relates to.</para>
+
+ </refsect1><refsect1><title>Parameters</title>
+
+<variablelist>
+ <varlistentry><term>level</term>
+ <listitem>
+
+<para>Text to log/emit in the message-level field to
+ indicate the message level
+ (<literal>Note</literal> or
+ <literal>Warning</literal>)</para>
+
+ </listitem>
+ </varlistentry>
+ <varlistentry><term>source</term>
+ <listitem>
+
+<para>Text to log/emit in the source field to identify the
+ “source†to which the notification/warning relates.
+ This can be any arbitrary string, but because the
+ message lacks line and column numbers to identify the
+ exact part of the source document to which it
+ relates, the intention is that the value you pass
+ into the <literal>source</literal> parameter should
+ give the user some way to identify the portion of
+ their source document on which to take potentially
+ take action in response to the log message (for
+ example, to edit, change, or add content).</para>
+
+
+<para>So the <literal>source</literal> value should be,
+ for example, an ID, book/chapter/article title, title
+ of some formal object, or even a string giving an
+ XPath expression.</para>
+
+ </listitem>
+ </varlistentry>
+ <varlistentry><term>context-desc</term>
+ <listitem>
+
+<para>Text to log/emit in the context-description field to
+ describe the context for the message.</para>
+
+ </listitem>
+ </varlistentry>
+ <varlistentry><term>context-desc-field-length</term>
+ <listitem>
+
+<para>Specifies length of the context-description field
+ (in characters); default is 12</para>
+
+
+<para>If the text specified by the
+ <literal>context-desc</literal> parameter is longer
+ than the number of characters specified in
+ <literal>context-desc-field-length</literal>, it is
+ truncated to <literal>context-desc-field-length</literal>
+ (12 characters by default).</para>
+
+
+<para>If the specified text is shorter than
+ <literal>context-desc-field-length</literal>,
+ it is right-padded out to
+ <literal>context-desc-field-length</literal> (12 by
+ default).</para>
+
+
+<para>If no value has been specified for the
+ <literal>context-desc</literal> parameter, the field is
+ left empty and the text of the log message begins with
+ the value of the <literal>message</literal>
+ parameter.</para>
+
+ </listitem>
+ </varlistentry>
+ <varlistentry><term>message</term>
+ <listitem>
+
+<para>Text to log/emit in the actual message field</para>
+
+ </listitem>
+ </varlistentry>
+ <varlistentry><term>message-field-length</term>
+ <listitem>
+
+<para>Specifies length of the message
+ field (in characters); default is 45</para>
+
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ </refsect1><refsect1><title>Returns</title>
+
+<para>Outputs a message (generally, to standard error).</para>
+</refsect1></refentry>
+
+<refentry xmlns:xlink="http://www.w3.org/1999/xlink" xml:id="template.get.doc.title">
+<refnamediv>
+<refname>get.doc.title</refname>
+<refpurpose>Gets a title from the current document</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+<synopsis>&lt;xsl:template name="get.doc.title"/&gt;</synopsis>
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>The <function>get.doc.title</function> template is a
+ utility template for returning the first title found in the
+ current document.</para>
+
+ </refsect1><refsect1><title>Returns</title>
+
+<para>Returns a string containing some identifying title for the
+ current document .</para>
+</refsect1></refentry>
+
+<refentry xmlns:xlink="http://www.w3.org/1999/xlink" xml:id="template.pad-string">
+<refnamediv>
+<refname>pad-string</refname>
+<refpurpose>Right-pads or left-pads a string out to a certain length</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+<synopsis>&lt;xsl:template name="pad-string"&gt;
+&lt;xsl:param name="padChar" select="' '"/&gt;
+&lt;xsl:param name="leftRight"&gt;left&lt;/xsl:param&gt;
+&lt;xsl:param name="padVar"/&gt;
+&lt;xsl:param name="length"/&gt;
+ ...
+&lt;/xsl:template&gt;</synopsis>
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>This function takes string <parameter>padVar</parameter> and
+ pads it out in the direction <parameter>rightLeft</parameter> to
+ the string-length <parameter>length</parameter>, using string
+ <parameter>padChar</parameter> (a space character by default) as
+ the padding string (note that <parameter>padChar</parameter> can
+ be a string; it is not limited to just being a single
+ character).</para>
+
+ <note>
+
+<para>This function began as a copy of Nate Austin's
+ <function>prepend-pad</function> function in the <link xlink:href="http://www.dpawson.co.uk/xsl/sect2/padding.html">Padding
+ Content</link> section of Dave Pawson's <link xlink:href="http://www.dpawson.co.uk/xsl/index.html">XSLT
+ FAQ</link>.</para>
+
+ </note>
+ </refsect1><refsect1><title>Returns</title>
+
+<para>Returns a (padded) string.</para>
+</refsect1></refentry>
+</reference>
+
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/utility.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/utility.xsl
new file mode 100644
index 0000000..37092b7
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/utility.xsl
@@ -0,0 +1,290 @@
+<?xml version='1.0'?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:doc="http://nwalsh.com/xsl/documentation/1.0"
+ xmlns:dyn="http://exslt.org/dynamic"
+ xmlns:saxon="http://icl.com/saxon"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ exclude-result-prefixes="doc dyn saxon"
+ version='1.0'>
+
+<!-- ********************************************************************
+ $Id: utility.xsl 7101 2007-07-20 15:32:12Z xmldoc $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+<doc:reference xmlns="" xml:id="utility">
+ <info>
+ <title>Common » Utility Template Reference</title>
+ <releaseinfo role="meta">
+ $Id: utility.xsl 7101 2007-07-20 15:32:12Z xmldoc $
+ </releaseinfo>
+ </info>
+ <!-- * yes, partintro is a valid child of a reference... -->
+ <partintro xml:id="partintro">
+ <title>Introduction</title>
+ <para>This is technical reference documentation for the
+ miscellaneous utility templates in the DocBook XSL
+ Stylesheets.</para>
+ <note>
+ <para>These templates are defined in a separate file from the set
+ of “common†templates because some of the common templates
+ reference DocBook XSL stylesheet parameters, requiring the
+ entire set of parameters to be imported/included in any
+ stylesheet that imports/includes the common templates.</para>
+ <para>The utility templates don’t import or include any DocBook
+ XSL stylesheet parameters, so the utility templates can be used
+ without importing the whole set of parameters.</para>
+ </note>
+ <para>This is not intended to be user documentation. It is
+ provided for developers writing customization layers for the
+ stylesheets.</para>
+ </partintro>
+</doc:reference>
+
+<!-- ====================================================================== -->
+
+<doc:template name="log.message" xmlns="">
+ <refpurpose>Logs/emits formatted notes and warnings</refpurpose>
+
+ <refdescription id="log.message-desc">
+ <para>The <function>log.message</function> template is a utility
+ template for logging/emitting formatted messages&#xa0;– that is,
+ notes and warnings, along with a given log “level†and an
+ identifier for the “source†that the message relates to.</para>
+ </refdescription>
+
+ <refparameter id="log.message-params">
+ <variablelist>
+ <varlistentry><term>level</term>
+ <listitem>
+ <para>Text to log/emit in the message-level field to
+ indicate the message level
+ (<literal>Note</literal> or
+ <literal>Warning</literal>)</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry><term>source</term>
+ <listitem>
+ <para>Text to log/emit in the source field to identify the
+ “source†to which the notification/warning relates.
+ This can be any arbitrary string, but because the
+ message lacks line and column numbers to identify the
+ exact part of the source document to which it
+ relates, the intention is that the value you pass
+ into the <literal>source</literal> parameter should
+ give the user some way to identify the portion of
+ their source document on which to take potentially
+ take action in response to the log message (for
+ example, to edit, change, or add content).</para>
+ <para>So the <literal>source</literal> value should be,
+ for example, an ID, book/chapter/article title, title
+ of some formal object, or even a string giving an
+ XPath expression.</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry><term>context-desc</term>
+ <listitem>
+ <para>Text to log/emit in the context-description field to
+ describe the context for the message.</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry><term>context-desc-field-length</term>
+ <listitem>
+ <para>Specifies length of the context-description field
+ (in characters); default is 12</para>
+ <para>If the text specified by the
+ <literal>context-desc</literal> parameter is longer
+ than the number of characters specified in
+ <literal>context-desc-field-length</literal>, it is
+ truncated to <literal>context-desc-field-length</literal>
+ (12 characters by default).</para>
+ <para>If the specified text is shorter than
+ <literal>context-desc-field-length</literal>,
+ it is right-padded out to
+ <literal>context-desc-field-length</literal> (12 by
+ default).</para>
+ <para>If no value has been specified for the
+ <literal>context-desc</literal> parameter, the field is
+ left empty and the text of the log message begins with
+ the value of the <literal>message</literal>
+ parameter.</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry><term>message</term>
+ <listitem>
+ <para>Text to log/emit in the actual message field</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry><term>message-field-length</term>
+ <listitem>
+ <para>Specifies length of the message
+ field (in characters); default is 45</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+ <refreturn id="log.message-returns">
+ <para>Outputs a message (generally, to standard error).</para></refreturn>
+</doc:template>
+<xsl:template name="log.message">
+ <xsl:param name="level"/>
+ <xsl:param name="source"/>
+ <xsl:param name="context-desc"/>
+ <xsl:param name="context-desc-field-length">12</xsl:param>
+ <xsl:param name="context-desc-padded">
+ <xsl:if test="not($context-desc = '')">
+ <xsl:call-template name="pad-string">
+ <xsl:with-param name="leftRight">right</xsl:with-param>
+ <xsl:with-param name="padVar"
+ select="substring($context-desc, 1, $context-desc-field-length)"/>
+ <xsl:with-param name="length" select="$context-desc-field-length"/>
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:param>
+ <xsl:param name="message"/>
+ <xsl:param name="message-field-length" select="45"/>
+ <xsl:param name="message-padded">
+ <xsl:variable name="spaces-for-blank-level">
+ <!-- * if the level field is blank, we'll need to pad out -->
+ <!-- * the message field with spaces to compensate -->
+ <xsl:choose>
+ <xsl:when test="$level = ''">
+ <xsl:value-of select="4 + 2"/>
+ <!-- * 4 = hard-coded length of comment text ("Note" or "Warn") -->
+ <!-- * + 2 = length of colon-plus-space separator ": " -->
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="0"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:variable name="spaces-for-blank-context-desc">
+ <!-- * if the context-description field is blank, we'll need -->
+ <!-- * to pad out the message field with spaces to compensate -->
+ <xsl:choose>
+ <xsl:when test="$context-desc = ''">
+ <xsl:value-of select="$context-desc-field-length + 2"/>
+ <!-- * + 2 = length of colon-plus-space separator ": " -->
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="0"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:variable name="extra-spaces"
+ select="$spaces-for-blank-level + $spaces-for-blank-context-desc"/>
+ <xsl:call-template name="pad-string">
+ <xsl:with-param name="leftRight">right</xsl:with-param>
+ <xsl:with-param name="padVar"
+ select="substring($message, 1, ($message-field-length + $extra-spaces))"/>
+ <xsl:with-param name="length"
+ select="$message-field-length + $extra-spaces"/>
+ </xsl:call-template>
+ </xsl:param>
+ <!-- * emit the actual log message -->
+ <xsl:message>
+ <xsl:if test="not($level = '')">
+ <xsl:value-of select="$level"/>
+ <xsl:text>: </xsl:text>
+ </xsl:if>
+ <xsl:if test="not($context-desc = '')">
+ <xsl:value-of select="$context-desc-padded"/>
+ <xsl:text>: </xsl:text>
+ </xsl:if>
+ <xsl:value-of select="$message-padded"/>
+ <xsl:text> </xsl:text>
+ <xsl:value-of select="$source"/>
+ </xsl:message>
+</xsl:template>
+
+<!-- ===================================== -->
+<doc:template name="get.doc.title" xmlns="">
+ <refpurpose>Gets a title from the current document</refpurpose>
+ <refdescription id="get.doc.title-desc">
+ <para>The <function>get.doc.title</function> template is a
+ utility template for returning the first title found in the
+ current document.</para>
+ </refdescription>
+ <refreturn id="get.doc.title-returns">
+ <para>Returns a string containing some identifying title for the
+ current document .</para></refreturn>
+</doc:template>
+<xsl:template name="get.doc.title">
+ <xsl:choose>
+ <xsl:when test="//*[local-name() = 'title'
+ or local-name() = 'refname']">
+ <xsl:value-of select="//*[local-name() = 'title'
+ or local-name() = 'refname'][1]"/>
+ </xsl:when>
+ <xsl:when test="substring(local-name(*[1]),
+ string-length(local-name(*[1])-3) = 'info')
+ and *[1]/*[local-name() = 'title']">
+ <xsl:value-of select="*[1]/*[local-name() = 'title'][1]"/>
+ </xsl:when>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ===================================== -->
+<doc:template name="pad-string" xmlns="">
+ <refpurpose>Right-pads or left-pads a string out to a certain length</refpurpose>
+ <refdescription id="pad-string-desc">
+ <para>This function takes string <parameter>padVar</parameter> and
+ pads it out in the direction <parameter>rightLeft</parameter> to
+ the string-length <parameter>length</parameter>, using string
+ <parameter>padChar</parameter> (a space character by default) as
+ the padding string (note that <parameter>padChar</parameter> can
+ be a string; it is not limited to just being a single
+ character).</para>
+ <note>
+ <para>This function began as a copy of Nate Austin's
+ <function>prepend-pad</function> function in the <link
+ xlink:href="http://www.dpawson.co.uk/xsl/sect2/padding.html" >Padding
+ Content</link> section of Dave Pawson's <link
+ xlink:href="http://www.dpawson.co.uk/xsl/index.html" >XSLT
+ FAQ</link>.</para>
+ </note>
+ </refdescription>
+ <refreturn id="pad-string-returns">
+ <para>Returns a (padded) string.</para></refreturn>
+</doc:template>
+<xsl:template name="pad-string">
+ <!-- * recursive template to right/left pad the value with -->
+ <!-- * whatever padChar is passed in -->
+ <xsl:param name="padChar" select="' '"/>
+ <xsl:param name="leftRight">left</xsl:param>
+ <xsl:param name="padVar"/>
+ <xsl:param name="length"/>
+ <xsl:choose>
+ <xsl:when test="string-length($padVar) &lt; $length">
+ <xsl:call-template name="pad-string">
+ <xsl:with-param name="padChar" select="$padChar"/>
+ <xsl:with-param name="leftRight" select="$leftRight"/>
+ <xsl:with-param name="padVar">
+ <xsl:choose>
+ <!-- * determine whether string should be -->
+ <!-- * right- or left-padded -->
+ <xsl:when test="$leftRight = 'left'">
+ <!-- * pad it to left -->
+ <xsl:value-of select="concat($padChar,$padVar)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <!-- * otherwise, right-pad the string -->
+ <xsl:value-of select="concat($padVar,$padChar)"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:with-param>
+ <xsl:with-param name="length" select="$length"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of
+ select="substring($padVar,string-length($padVar) - $length + 1)"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/vi.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/vi.xml
new file mode 100644
index 0000000..682c467
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/vi.xml
@@ -0,0 +1,1229 @@
+<?xml version="1.0" encoding="utf-8"?>
+<l:l10n xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0" language="vi" english-language-name="Vietnamese">
+
+<!-- * This file is generated automatically. -->
+<!-- * To submit changes to this file upstream (to the DocBook Project) -->
+<!-- * do not submit an edited version of this file. Instead, submit an -->
+<!-- * edited version of the source file at the following location: -->
+<!-- * -->
+<!-- * https://docbook.svn.sourceforge.net/svnroot/docbook/trunk/gentext/locale/vi.xml -->
+<!-- * -->
+<!-- * E-mail the edited vi.xml source file to: -->
+<!-- * -->
+<!-- * docbook-developers@lists.sourceforge.net -->
+
+<!-- ******************************************************************** -->
+
+<!-- This file is part of the XSL DocBook Stylesheet distribution. -->
+<!-- See ../README or http://docbook.sf.net/release/xsl/current/ for -->
+<!-- copyright and other information. -->
+
+<!-- ******************************************************************** -->
+<!-- In these files, % with a letter is used for a placeholder: -->
+<!-- %t is the current element's title -->
+<!-- %s is the current element's subtitle (if applicable)-->
+<!-- %n is the current element's number label-->
+<!-- %p is the current element's page number (if applicable)-->
+<!-- ******************************************************************** -->
+
+
+<l:gentext key="Abstract" text="Tổng quan"/>
+<l:gentext key="abstract" text="Tổng quan"/>
+<l:gentext key="Acknowledgements" text="Acknowledgements" lang="en"/>
+<l:gentext key="acknowledgements" text="Acknowledgements" lang="en"/>
+<l:gentext key="Answer" text="Ä:"/>
+<l:gentext key="answer" text="Ä:"/>
+<l:gentext key="Appendix" text="Phụ lục"/>
+<l:gentext key="appendix" text="phụ lục"/>
+<l:gentext key="Article" text="Bài viết"/>
+<l:gentext key="article" text="Bài viết"/>
+<l:gentext key="Author" text="Author" lang="en"/>
+<l:gentext key="Bibliography" text="Thư mục"/>
+<l:gentext key="bibliography" text="Thư mục"/>
+<l:gentext key="Book" text="Sách"/>
+<l:gentext key="book" text="Sách"/>
+<l:gentext key="CAUTION" text="CẨN THẬN"/>
+<l:gentext key="Caution" text="Cẩn thận"/>
+<l:gentext key="caution" text="Cẩn thận"/>
+<l:gentext key="Chapter" text="ChÆ°Æ¡ng"/>
+<l:gentext key="chapter" text="chÆ°Æ¡ng"/>
+<l:gentext key="Colophon" text="Colophon"/>
+<l:gentext key="colophon" text="Colophon"/>
+<l:gentext key="Copyright" text="Bản quyá»n"/>
+<l:gentext key="copyright" text="Bản quyá»n"/>
+<l:gentext key="Dedication" text="Tặng"/>
+<l:gentext key="dedication" text="Tặng"/>
+<l:gentext key="Edition" text="Edition"/>
+<l:gentext key="edition" text="Edition"/>
+<l:gentext key="Editor" text="Editor" lang="en"/>
+<l:gentext key="Equation" text="Phương trình"/>
+<l:gentext key="equation" text="Phương trình"/>
+<l:gentext key="Example" text="Ví dụ"/>
+<l:gentext key="example" text="Ví dụ"/>
+<l:gentext key="Figure" text="Hình"/>
+<l:gentext key="figure" text="Hình"/>
+<l:gentext key="Glossary" text="Thuật ngữ"/>
+<l:gentext key="glossary" text="Thuật ngữ"/>
+<l:gentext key="GlossSee" text="Xem"/>
+<l:gentext key="glosssee" text="Xem"/>
+<l:gentext key="GlossSeeAlso" text="Xem thêm"/>
+<l:gentext key="glossseealso" text="Xem thêm"/>
+<l:gentext key="IMPORTANT" text="QUAN TRỌNG"/>
+<l:gentext key="important" text="Quan trá»ng"/>
+<l:gentext key="Important" text="Quan trá»ng"/>
+<l:gentext key="Index" text="Chỉ mục"/>
+<l:gentext key="index" text="Chỉ mục"/>
+<l:gentext key="ISBN" text="ISBN"/>
+<l:gentext key="isbn" text="ISBN"/>
+<l:gentext key="LegalNotice" text="Legal Notice"/>
+<l:gentext key="legalnotice" text="Legal Notice"/>
+<l:gentext key="MsgAud" text="Äá»c giả"/>
+<l:gentext key="msgaud" text="Äá»c giả"/>
+<l:gentext key="MsgLevel" text="Cấp"/>
+<l:gentext key="msglevel" text="Cấp"/>
+<l:gentext key="MsgOrig" text="Gốc"/>
+<l:gentext key="msgorig" text="Gốc"/>
+<l:gentext key="NOTE" text="GHI CHÚ"/>
+<l:gentext key="Note" text="Ghi chú"/>
+<l:gentext key="note" text="Ghi chú"/>
+<l:gentext key="Part" text="Phần"/>
+<l:gentext key="part" text="Phần"/>
+<l:gentext key="Preface" text="Mở đầu"/>
+<l:gentext key="preface" text="Mở đầu"/>
+<l:gentext key="Procedure" text="Thủ tục"/>
+<l:gentext key="procedure" text="Thủ tục"/>
+<l:gentext key="ProductionSet" text="Sản phẩm"/>
+<l:gentext key="PubDate" text="Publication Date" lang="en"/>
+<l:gentext key="pubdate" text="Publication date" lang="en"/>
+<l:gentext key="Published" text="Xuất bản"/>
+<l:gentext key="published" text="Xuất bản"/>
+<l:gentext key="Publisher" text="Publisher" lang="en"/>
+<l:gentext key="Qandadiv" text="H và Ä"/>
+<l:gentext key="qandadiv" text="H và Ä"/>
+<l:gentext key="QandASet" text="Frequently Asked Questions" lang="en"/>
+<l:gentext key="Question" text="H:"/>
+<l:gentext key="question" text="H:"/>
+<l:gentext key="RefEntry" text=""/>
+<l:gentext key="refentry" text=""/>
+<l:gentext key="Reference" text="Tham khảo"/>
+<l:gentext key="reference" text="Tham khảo"/>
+<l:gentext key="References" text="References" lang="en"/>
+<l:gentext key="RefName" text="Tên"/>
+<l:gentext key="refname" text="Tên"/>
+<l:gentext key="RefSection" text=""/>
+<l:gentext key="refsection" text=""/>
+<l:gentext key="RefSynopsisDiv" text="Tóm tắt"/>
+<l:gentext key="refsynopsisdiv" text="Tóm tắt"/>
+<l:gentext key="RevHistory" text="Revision History"/>
+<l:gentext key="revhistory" text="Revision History"/>
+<l:gentext key="revision" text="Bản hiệu chỉnh"/>
+<l:gentext key="Revision" text="Bản hiệu chỉnh"/>
+<l:gentext key="sect1" text="Phần"/>
+<l:gentext key="sect2" text="Phần"/>
+<l:gentext key="sect3" text="Phần"/>
+<l:gentext key="sect4" text="Phần"/>
+<l:gentext key="sect5" text="Phần"/>
+<l:gentext key="section" text="Phần"/>
+<l:gentext key="Section" text="Phần"/>
+<l:gentext key="see" text="xem"/>
+<l:gentext key="See" text="See" lang="en"/>
+<l:gentext key="seealso" text="xem thêm"/>
+<l:gentext key="Seealso" text="See also" lang="en"/>
+<l:gentext key="SeeAlso" text="See Also" lang="en"/>
+<l:gentext key="set" text="Äặt"/>
+<l:gentext key="Set" text="Äặt"/>
+<l:gentext key="setindex" text="Äặt chỉ mục"/>
+<l:gentext key="SetIndex" text="Äặt chỉ mục"/>
+<l:gentext key="Sidebar" text=""/>
+<l:gentext key="sidebar" text="thanh bên"/>
+<l:gentext key="step" text="bÆ°á»›c"/>
+<l:gentext key="Step" text="BÆ°á»›c"/>
+<l:gentext key="table" text="Bảng"/>
+<l:gentext key="Table" text="Bảng"/>
+<l:gentext key="task" text="Task" lang="en"/>
+<l:gentext key="Task" text="Task" lang="en"/>
+<l:gentext key="tip" text="Mẹo"/>
+<l:gentext key="TIP" text="MẸO"/>
+<l:gentext key="Tip" text="Mẹo"/>
+<l:gentext key="Warning" text="Cảnh báo"/>
+<l:gentext key="warning" text="Cảnh báo"/>
+<l:gentext key="WARNING" text="CẢNH BÃO"/>
+<l:gentext key="and" text="và"/>
+<l:gentext key="by" text="bởi"/>
+<l:gentext key="Edited" text="Äược biên soạn"/>
+<l:gentext key="edited" text="Äược biên soạn"/>
+<l:gentext key="Editedby" text="Äược biên soạn bởi"/>
+<l:gentext key="editedby" text="Äược biên soạn bởi"/>
+<l:gentext key="in" text="trong"/>
+<l:gentext key="lastlistcomma" text=","/>
+<l:gentext key="listcomma" text=","/>
+<l:gentext key="notes" text="Ghi chú"/>
+<l:gentext key="Notes" text="Ghi chú"/>
+<l:gentext key="Pgs" text="Pgs."/>
+<l:gentext key="pgs" text="Pgs."/>
+<l:gentext key="Revisedby" text="Hiệu chỉnh bởi: "/>
+<l:gentext key="revisedby" text="Hiệu chỉnh bởi: "/>
+<l:gentext key="TableNotes" text="Ghi chú"/>
+<l:gentext key="tablenotes" text="Ghi chú"/>
+<l:gentext key="TableofContents" text="Mục lục"/>
+<l:gentext key="tableofcontents" text="Mục lục"/>
+<l:gentext key="unexpectedelementname" text="Tên phần tử không đúng"/>
+<l:gentext key="unsupported" text="không hỗ trợ"/>
+<l:gentext key="xrefto" text="xref tá»›i"/>
+<l:gentext key="Authors" text="Authors" lang="en"/>
+<l:gentext key="copyeditor" text="Copy Editor" lang="en"/>
+<l:gentext key="graphicdesigner" text="Graphic Designer" lang="en"/>
+<l:gentext key="productioneditor" text="Production Editor" lang="en"/>
+<l:gentext key="technicaleditor" text="Technical Editor" lang="en"/>
+<l:gentext key="translator" text="Translator" lang="en"/>
+<l:gentext key="listofequations" text="Danh sách Phương trình"/>
+<l:gentext key="ListofEquations" text="Danh sách Phương trình"/>
+<l:gentext key="ListofExamples" text="Danh sách Ví dụ"/>
+<l:gentext key="listofexamples" text="Danh sách Ví dụ"/>
+<l:gentext key="ListofFigures" text="Danh sách Hình"/>
+<l:gentext key="listoffigures" text="Danh sách Hình"/>
+<l:gentext key="ListofProcedures" text="List of Procedures" lang="en"/>
+<l:gentext key="listofprocedures" text="List of Procedures" lang="en"/>
+<l:gentext key="listoftables" text="Danh sách Bảng"/>
+<l:gentext key="ListofTables" text="Danh sách Bảng"/>
+<l:gentext key="ListofUnknown" text="Danh sách Lạ"/>
+<l:gentext key="listofunknown" text="Danh sách Lạ"/>
+<l:gentext key="nav-home" text="Äầu"/>
+<l:gentext key="nav-next" text="Kế tiếp"/>
+<l:gentext key="nav-next-sibling" text="Tá»›i nhanh"/>
+<l:gentext key="nav-prev" text="Trước đó"/>
+<l:gentext key="nav-prev-sibling" text="Lùi nhanh"/>
+<l:gentext key="nav-up" text="Lên"/>
+<l:gentext key="nav-toc" text="Mục lục"/>
+<l:gentext key="Draft" text="Bản thảo"/>
+<l:gentext key="above" text="trên"/>
+<l:gentext key="below" text="dÆ°á»›i"/>
+<l:gentext key="sectioncalled" text="phần"/>
+<l:gentext key="index symbols" text="Ký hiệu"/>
+<l:gentext key="writing-mode" text="lr-tb"/>
+<l:gentext key="lowercase.alpha" text="abcdefghijklmnopqrstuvwxyz"/>
+<l:gentext key="uppercase.alpha" text="ABCDEFGHIJKLMNOPQRSTUVWXYZ"/>
+<l:gentext key="normalize.sort.input" text="AaÀàÃáÂâÃãÄäÅåĀÄĂ㥹ÇǎǞǟǠǡǺǻȀÈȂȃȦȧḀá¸áºšáº áº¡áº¢áº£áº¤áº¥áº¦áº§áº¨áº©áºªáº«áº¬áº­áº®áº¯áº°áº±áº²áº³áº´áºµáº¶áº·BbÆ€ÆɓƂƃḂḃḄḅḆḇCcÇçĆćĈĉĊċČÄƇƈɕḈḉDdÄŽÄÄđƊɗƋƌDžDzȡɖḊḋḌá¸á¸Žá¸á¸á¸‘ḒḓEeÈèÉéÊêËëĒēĔĕĖėĘęĚěȄȅȆȇȨȩḔḕḖḗḘḙḚḛḜá¸áº¸áº¹áººáº»áº¼áº½áº¾áº¿á»€á»á»‚ểỄễỆệFfƑƒḞḟGgÄœÄĞğĠġĢģƓɠǤǥǦǧǴǵḠḡHhĤĥĦħȞȟɦḢḣḤḥḦḧḨḩḪḫẖIiÌìÃíÎîÃïĨĩĪīĬĭĮįİƗɨÇÇȈȉȊȋḬḭḮḯỈỉỊịJjĴĵǰÊKkĶķƘƙǨǩḰḱḲḳḴḵLlĹĺĻļĽľĿŀÅłƚLjȴɫɬɭḶḷḸḹḺḻḼḽMmɱḾḿṀá¹á¹‚ṃNnÑñŃńŅņŇňÆɲƞȠNjǸǹȵɳṄṅṆṇṈṉṊṋOoÒòÓóÔôÕõÖöØøŌÅÅŽÅÅőƟƠơǑǒǪǫǬǭǾǿȌÈÈŽÈȪȫȬȭȮȯȰȱṌá¹á¹Žá¹á¹á¹‘ṒṓỌá»á»Žá»á»á»‘ỒồỔổỖỗỘộỚớỜá»á»žá»Ÿá» á»¡á»¢á»£PpƤƥṔṕṖṗQqÊ RrŔŕŖŗŘřÈȑȒȓɼɽɾṘṙṚṛṜá¹á¹žá¹ŸSsŚśŜÅŞşŠšȘșʂṠṡṢṣṤṥṦṧṨṩTtŢţŤťŦŧƫƬƭƮʈȚțȶṪṫṬṭṮṯṰṱẗUuÙùÚúÛûÜüŨũŪūŬŭŮůŰűŲųƯưǓǔǕǖǗǘǙǚǛǜȔȕȖȗṲṳṴṵṶṷṸṹṺṻỤụỦủỨứỪừỬửỮữỰựVvƲʋṼṽṾṿWwŴŵẀáºáº‚ẃẄẅẆẇẈẉẘXxẊẋẌáºYyÃýÿŸŶŷƳƴȲȳẎáºáº™á»²á»³á»´á»µá»¶á»·á»¸á»¹ZzŹźŻżŽžƵƶȤȥÊÊ‘áºáº‘ẒẓẔẕẕ" lang="en"/>
+<l:gentext key="normalize.sort.output" text="AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBCCCCCCCCCCCCCCCCCDDDDDDDDDDDDDDDDDDDDDDDDEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEFFFFFFGGGGGGGGGGGGGGGGGGGGHHHHHHHHHHHHHHHHHHHHIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIJJJJJJKKKKKKKKKKKKKKLLLLLLLLLLLLLLLLLLLLLLLLLLMMMMMMMMMNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOPPPPPPPPQQQRRRRRRRRRRRRRRRRRRRRRRRSSSSSSSSSSSSSSSSSSSSSSSTTTTTTTTTTTTTTTTTTTTTTTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUVVVVVVVVWWWWWWWWWWWWWWWXXXXXXYYYYYYYYYYYYYYYYYYYYYYYZZZZZZZZZZZZZZZZZZZZZ" lang="en"/>
+<l:dingbat key="startquote" text="“"/>
+<l:dingbat key="endquote" text="â€"/>
+<l:dingbat key="nestedstartquote" text="‘"/>
+<l:dingbat key="nestedendquote" text="’"/>
+<l:dingbat key="singlestartquote" text="‘" lang="en"/>
+<l:dingbat key="singleendquote" text="’" lang="en"/>
+<l:dingbat key="bullet" text="•"/>
+<l:gentext key="hyphenation-character" text="-" lang="en"/>
+<l:gentext key="hyphenation-push-character-count" text="2" lang="en"/>
+<l:gentext key="hyphenation-remain-character-count" text="2" lang="en"/>
+<l:context name="styles"><l:template name="person-name" text="last-first"/>
+</l:context>
+<l:context name="title"><l:template name="abstract" text="%t"/>
+<l:template name="acknowledgements" text="%t" lang="en"/>
+<l:template name="answer" text="%t"/>
+<l:template name="appendix" text="Phụ lục %n. %t"/>
+<l:template name="article" text="%t"/>
+<l:template name="authorblurb" text="%t"/>
+<l:template name="bibliodiv" text="%t"/>
+<l:template name="biblioentry" text="%t"/>
+<l:template name="bibliography" text="%t"/>
+<l:template name="bibliolist" text="%t" lang="en"/>
+<l:template name="bibliomixed" text="%t"/>
+<l:template name="bibliomset" text="%t"/>
+<l:template name="biblioset" text="%t"/>
+<l:template name="blockquote" text="%t"/>
+<l:template name="book" text="%t"/>
+<l:template name="calloutlist" text="%t"/>
+<l:template name="caution" text="%t"/>
+<l:template name="chapter" text="Chương %n. %t"/>
+<l:template name="colophon" text="%t"/>
+<l:template name="dedication" text="%t"/>
+<l:template name="equation" text="Phương trình %n. %t"/>
+<l:template name="example" text="Ví dụ %n. %t"/>
+<l:template name="figure" text="Hình %n. %t"/>
+<l:template name="foil" text="%t" lang="en"/>
+<l:template name="foilgroup" text="%t" lang="en"/>
+<l:template name="formalpara" text="%t"/>
+<l:template name="glossary" text="%t"/>
+<l:template name="glossdiv" text="%t"/>
+<l:template name="glosslist" text="%t" lang="en"/>
+<l:template name="glossentry" text="%t" lang="en"/>
+<l:template name="important" text="%t"/>
+<l:template name="index" text="%t"/>
+<l:template name="indexdiv" text="%t"/>
+<l:template name="itemizedlist" text="%t"/>
+<l:template name="legalnotice" text="%t"/>
+<l:template name="listitem" text=""/>
+<l:template name="lot" text="%t"/>
+<l:template name="msg" text="%t"/>
+<l:template name="msgexplan" text="%t"/>
+<l:template name="msgmain" text="%t"/>
+<l:template name="msgrel" text="%t"/>
+<l:template name="msgset" text="%t"/>
+<l:template name="msgsub" text="%t"/>
+<l:template name="note" text="%t"/>
+<l:template name="orderedlist" text="%t"/>
+<l:template name="part" text="Phần %n. %t"/>
+<l:template name="partintro" text="%t"/>
+<l:template name="preface" text="%t"/>
+<l:template name="procedure" text="%t"/>
+<l:template name="procedure.formal" text="Thủ tục %n. %t"/>
+<l:template name="productionset" text="%t"/>
+<l:template name="productionset.formal" text="Sản phẩm %n"/>
+<l:template name="qandadiv" text="%t"/>
+<l:template name="qandaentry" text="%t"/>
+<l:template name="qandaset" text="%t"/>
+<l:template name="question" text="%t"/>
+<l:template name="refentry" text="%t"/>
+<l:template name="reference" text="%t"/>
+<l:template name="refsection" text="%t"/>
+<l:template name="refsect1" text="%t"/>
+<l:template name="refsect2" text="%t"/>
+<l:template name="refsect3" text="%t"/>
+<l:template name="refsynopsisdiv" text="%t"/>
+<l:template name="refsynopsisdivinfo" text="%t"/>
+<l:template name="segmentedlist" text="%t"/>
+<l:template name="set" text="%t"/>
+<l:template name="setindex" text="%t"/>
+<l:template name="sidebar" text="%t"/>
+<l:template name="step" text="%t"/>
+<l:template name="table" text="Bảng %n. %t"/>
+<l:template name="task" text="%t" lang="en"/>
+<l:template name="tasksummary" text="%t" lang="en"/>
+<l:template name="taskprerequisites" text="%t" lang="en"/>
+<l:template name="taskrelated" text="%t" lang="en"/>
+<l:template name="tip" text="%t"/>
+<l:template name="toc" text="%t"/>
+<l:template name="variablelist" text="%t"/>
+<l:template name="varlistentry" text=""/>
+<l:template name="warning" text="%t"/>
+</l:context>
+<l:context name="title-unnumbered"><l:template name="appendix" text="%t"/>
+<l:template name="article/appendix" text="%t" lang="en"/>
+<l:template name="bridgehead" text="%t"/>
+<l:template name="chapter" text="%t"/>
+<l:template name="sect1" text="%t"/>
+<l:template name="sect2" text="%t"/>
+<l:template name="sect3" text="%t"/>
+<l:template name="sect4" text="%t"/>
+<l:template name="sect5" text="%t"/>
+<l:template name="section" text="%t"/>
+<l:template name="simplesect" text="%t"/>
+<l:template name="part" text="%t" lang="en"/>
+</l:context>
+<l:context name="title-numbered"><l:template name="appendix" text="Phụ lục %n. %t"/>
+<l:template name="article/appendix" text="%n. %t" lang="en"/>
+<l:template name="bridgehead" text="%n. %t"/>
+<l:template name="chapter" text="Chương %n. %t"/>
+<l:template name="part" text="Phần %n. %t"/>
+<l:template name="sect1" text="%n. %t"/>
+<l:template name="sect2" text="%n. %t"/>
+<l:template name="sect3" text="%n. %t"/>
+<l:template name="sect4" text="%n. %t"/>
+<l:template name="sect5" text="%n. %t"/>
+<l:template name="section" text="%n. %t"/>
+<l:template name="simplesect" text="%t"/>
+</l:context>
+<l:context name="subtitle"><l:template name="appendix" text="%s"/>
+<l:template name="acknowledgements" text="%s" lang="en"/>
+<l:template name="article" text="%s"/>
+<l:template name="bibliodiv" text="%s"/>
+<l:template name="biblioentry" text="%s"/>
+<l:template name="bibliography" text="%s"/>
+<l:template name="bibliomixed" text="%s"/>
+<l:template name="bibliomset" text="%s"/>
+<l:template name="biblioset" text="%s"/>
+<l:template name="book" text="%s"/>
+<l:template name="chapter" text="%s"/>
+<l:template name="colophon" text="%s"/>
+<l:template name="dedication" text="%s"/>
+<l:template name="glossary" text="%s"/>
+<l:template name="glossdiv" text="%s"/>
+<l:template name="index" text="%s"/>
+<l:template name="indexdiv" text="%s"/>
+<l:template name="lot" text="%s"/>
+<l:template name="part" text="%s"/>
+<l:template name="partintro" text="%s"/>
+<l:template name="preface" text="%s"/>
+<l:template name="refentry" text="%s"/>
+<l:template name="reference" text="%s"/>
+<l:template name="refsection" text="%s"/>
+<l:template name="refsect1" text="%s"/>
+<l:template name="refsect2" text="%s"/>
+<l:template name="refsect3" text="%s"/>
+<l:template name="refsynopsisdiv" text="%s"/>
+<l:template name="sect1" text="%s"/>
+<l:template name="sect2" text="%s"/>
+<l:template name="sect3" text="%s"/>
+<l:template name="sect4" text="%s"/>
+<l:template name="sect5" text="%s"/>
+<l:template name="section" text="%s"/>
+<l:template name="set" text="%s"/>
+<l:template name="setindex" text="%s"/>
+<l:template name="sidebar" text="%s"/>
+<l:template name="simplesect" text="%s"/>
+<l:template name="toc" text="%s"/>
+</l:context>
+<l:context name="xref"><l:template name="abstract" text="%t"/>
+<l:template name="acknowledgements" text="%t" lang="en"/>
+<l:template name="answer" text="Ä: %n"/>
+<l:template name="appendix" text="%t"/>
+<l:template name="article" text="%t"/>
+<l:template name="authorblurb" text="%t"/>
+<l:template name="bibliodiv" text="%t"/>
+<l:template name="bibliography" text="%t"/>
+<l:template name="bibliomset" text="%t"/>
+<l:template name="biblioset" text="%t"/>
+<l:template name="blockquote" text="%t"/>
+<l:template name="book" text="%t"/>
+<l:template name="calloutlist" text="%t"/>
+<l:template name="caution" text="%t"/>
+<l:template name="chapter" text="%t"/>
+<l:template name="colophon" text="%t"/>
+<l:template name="constraintdef" text="%t"/>
+<l:template name="dedication" text="%t"/>
+<l:template name="equation" text="%t"/>
+<l:template name="example" text="%t"/>
+<l:template name="figure" text="%t"/>
+<l:template name="foil" text="%t" lang="en"/>
+<l:template name="foilgroup" text="%t" lang="en"/>
+<l:template name="formalpara" text="%t"/>
+<l:template name="glossary" text="%t"/>
+<l:template name="glossdiv" text="%t"/>
+<l:template name="important" text="%t"/>
+<l:template name="index" text="%t"/>
+<l:template name="indexdiv" text="%t"/>
+<l:template name="itemizedlist" text="%t"/>
+<l:template name="legalnotice" text="%t"/>
+<l:template name="listitem" text="%n"/>
+<l:template name="lot" text="%t"/>
+<l:template name="msg" text="%t"/>
+<l:template name="msgexplan" text="%t"/>
+<l:template name="msgmain" text="%t"/>
+<l:template name="msgrel" text="%t"/>
+<l:template name="msgset" text="%t"/>
+<l:template name="msgsub" text="%t"/>
+<l:template name="note" text="%t"/>
+<l:template name="orderedlist" text="%t"/>
+<l:template name="part" text="%t"/>
+<l:template name="partintro" text="%t"/>
+<l:template name="preface" text="%t"/>
+<l:template name="procedure" text="%t"/>
+<l:template name="productionset" text="%t"/>
+<l:template name="qandadiv" text="%t"/>
+<l:template name="qandaentry" text="H: %n"/>
+<l:template name="qandaset" text="%t"/>
+<l:template name="question" text="H: %n"/>
+<l:template name="reference" text="%t"/>
+<l:template name="refsynopsisdiv" text="%t"/>
+<l:template name="segmentedlist" text="%t"/>
+<l:template name="set" text="%t"/>
+<l:template name="setindex" text="%t"/>
+<l:template name="sidebar" text="%t"/>
+<l:template name="table" text="%t"/>
+<l:template name="task" text="%t" lang="en"/>
+<l:template name="tip" text="%t"/>
+<l:template name="toc" text="%t"/>
+<l:template name="variablelist" text="%t"/>
+<l:template name="varlistentry" text="%n"/>
+<l:template name="warning" text="%t"/>
+<l:template name="olink.document.citation" text=" in %o" lang="en"/>
+<l:template name="olink.page.citation" text=" (page %p)" lang="en"/>
+<l:template name="page.citation" text=" [%p]"/>
+<l:template name="page" text="(page %p)" lang="en"/>
+<l:template name="docname" text=" in %o" lang="en"/>
+<l:template name="docnamelong" text=" in the document titled %o" lang="en"/>
+<l:template name="pageabbrev" text="(p. %p)" lang="en"/>
+<l:template name="Page" text="Page %p" lang="en"/>
+<l:template name="bridgehead" text="phần “%tâ€"/>
+<l:template name="refsection" text="phần “%tâ€"/>
+<l:template name="refsect1" text="phần “%tâ€"/>
+<l:template name="refsect2" text="phần “%tâ€"/>
+<l:template name="refsect3" text="phần “%tâ€"/>
+<l:template name="sect1" text="phần “%tâ€"/>
+<l:template name="sect2" text="phần “%tâ€"/>
+<l:template name="sect3" text="phần “%tâ€"/>
+<l:template name="sect4" text="phần “%tâ€"/>
+<l:template name="sect5" text="phần “%tâ€"/>
+<l:template name="section" text="phần “%tâ€"/>
+<l:template name="simplesect" text="phần “%tâ€"/>
+</l:context>
+<l:context name="xref-number"><l:template name="answer" text="Ä: %n"/>
+<l:template name="appendix" text="Phụ lục %n"/>
+<l:template name="bridgehead" text="Phần %n"/>
+<l:template name="chapter" text="Chương %n"/>
+<l:template name="equation" text="Phương trình %n"/>
+<l:template name="example" text="Ví dụ %n"/>
+<l:template name="figure" text="Hình %n"/>
+<l:template name="part" text="Phần %n"/>
+<l:template name="procedure" text="Thủ tục %n"/>
+<l:template name="productionset" text="Sản phẩm %n"/>
+<l:template name="qandadiv" text="H và Ä %n"/>
+<l:template name="qandaentry" text="H: %n"/>
+<l:template name="question" text="H: %n"/>
+<l:template name="sect1" text="Phần %n"/>
+<l:template name="sect2" text="Phần %n"/>
+<l:template name="sect3" text="Phần %n"/>
+<l:template name="sect4" text="Phần %n"/>
+<l:template name="sect5" text="Phần %n"/>
+<l:template name="section" text="Phần %n"/>
+<l:template name="table" text="Bảng %n"/>
+</l:context>
+<l:context name="xref-number-and-title"><l:template name="appendix" text="Phụ lục %n, %t"/>
+<l:template name="bridgehead" text="Phần %n, “%tâ€"/>
+<l:template name="chapter" text="Chương %n, %t"/>
+<l:template name="equation" text="PhÆ°Æ¡ng trình %n, “%tâ€"/>
+<l:template name="example" text="Ví dụ %n, “%tâ€"/>
+<l:template name="figure" text="Hình %n, “%tâ€"/>
+<l:template name="part" text="Phần %n, “%tâ€"/>
+<l:template name="procedure" text="Thủ tục %n, “%tâ€"/>
+<l:template name="productionset" text="Sản phẩm %n, “%tâ€"/>
+<l:template name="qandadiv" text="H và Ä %n, “%tâ€"/>
+<l:template name="refsect1" text="phần “%tâ€"/>
+<l:template name="refsect2" text="phần “%tâ€"/>
+<l:template name="refsect3" text="phần “%tâ€"/>
+<l:template name="refsection" text="phần “%tâ€"/>
+<l:template name="sect1" text="Phần %n, “%tâ€"/>
+<l:template name="sect2" text="Phần %n, “%tâ€"/>
+<l:template name="sect3" text="Phần %n, “%tâ€"/>
+<l:template name="sect4" text="Phần %n, “%tâ€"/>
+<l:template name="sect5" text="Phần %n, “%tâ€"/>
+<l:template name="section" text="Phần %n, “%tâ€"/>
+<l:template name="simplesect" text="phần “%tâ€"/>
+<l:template name="table" text="Bảng %n, “%tâ€"/>
+</l:context>
+<l:context name="authorgroup"><l:template name="sep" text=", "/>
+<l:template name="sep2" text=" và "/>
+<l:template name="seplast" text=", và "/>
+</l:context>
+<l:context name="glossary"><l:template name="see" text="Xem %t."/>
+<l:template name="seealso" text="Xem thêm %t."/>
+<l:template name="seealso-separator" text=", "/>
+</l:context>
+<l:context name="msgset"><l:template name="MsgAud" text="Äá»c giả: "/>
+<l:template name="MsgLevel" text="Cấp: "/>
+<l:template name="MsgOrig" text="Gốc: "/>
+</l:context>
+<l:context name="datetime"><l:template name="format" text="m/d/Y" lang="en"/>
+</l:context>
+<l:context name="termdef"><l:template name="prefix" text="[Definition: " lang="en"/>
+<l:template name="suffix" text="]" lang="en"/>
+</l:context>
+<l:context name="datetime-full"><l:template name="January" text="January" lang="en"/>
+<l:template name="February" text="February" lang="en"/>
+<l:template name="March" text="March" lang="en"/>
+<l:template name="April" text="April" lang="en"/>
+<l:template name="May" text="May" lang="en"/>
+<l:template name="June" text="June" lang="en"/>
+<l:template name="July" text="July" lang="en"/>
+<l:template name="August" text="August" lang="en"/>
+<l:template name="September" text="September" lang="en"/>
+<l:template name="October" text="October" lang="en"/>
+<l:template name="November" text="November" lang="en"/>
+<l:template name="December" text="December" lang="en"/>
+<l:template name="Monday" text="Monday" lang="en"/>
+<l:template name="Tuesday" text="Tuesday" lang="en"/>
+<l:template name="Wednesday" text="Wednesday" lang="en"/>
+<l:template name="Thursday" text="Thursday" lang="en"/>
+<l:template name="Friday" text="Friday" lang="en"/>
+<l:template name="Saturday" text="Saturday" lang="en"/>
+<l:template name="Sunday" text="Sunday" lang="en"/>
+</l:context>
+<l:context name="datetime-abbrev"><l:template name="Jan" text="Jan" lang="en"/>
+<l:template name="Feb" text="Feb" lang="en"/>
+<l:template name="Mar" text="Mar" lang="en"/>
+<l:template name="Apr" text="Apr" lang="en"/>
+<l:template name="May" text="May" lang="en"/>
+<l:template name="Jun" text="Jun" lang="en"/>
+<l:template name="Jul" text="Jul" lang="en"/>
+<l:template name="Aug" text="Aug" lang="en"/>
+<l:template name="Sep" text="Sep" lang="en"/>
+<l:template name="Oct" text="Oct" lang="en"/>
+<l:template name="Nov" text="Nov" lang="en"/>
+<l:template name="Dec" text="Dec" lang="en"/>
+<l:template name="Mon" text="Mon" lang="en"/>
+<l:template name="Tue" text="Tue" lang="en"/>
+<l:template name="Wed" text="Wed" lang="en"/>
+<l:template name="Thu" text="Thu" lang="en"/>
+<l:template name="Fri" text="Fri" lang="en"/>
+<l:template name="Sat" text="Sat" lang="en"/>
+<l:template name="Sun" text="Sun" lang="en"/>
+</l:context>
+<l:context name="htmlhelp"><l:template name="langcode" text="0x042a Vietnamese"/>
+</l:context>
+<l:context name="index"><l:template name="term-separator" text=", " lang="en"/>
+<l:template name="number-separator" text=", " lang="en"/>
+<l:template name="range-separator" text="-" lang="en"/>
+</l:context>
+<l:context name="iso690"><l:template name="lastfirst.sep" text=", " lang="en"/>
+<l:template name="alt.person.two.sep" text=" – " lang="en"/>
+<l:template name="alt.person.last.sep" text=" – " lang="en"/>
+<l:template name="alt.person.more.sep" text=" – " lang="en"/>
+<l:template name="primary.editor" text=" (ed.)" lang="en"/>
+<l:template name="primary.many" text=", et al." lang="en"/>
+<l:template name="primary.sep" text=". " lang="en"/>
+<l:template name="submaintitle.sep" text=": " lang="en"/>
+<l:template name="title.sep" text=". " lang="en"/>
+<l:template name="othertitle.sep" text=", " lang="en"/>
+<l:template name="medium1" text=" [" lang="en"/>
+<l:template name="medium2" text="]" lang="en"/>
+<l:template name="secondary.person.sep" text="; " lang="en"/>
+<l:template name="secondary.sep" text=". " lang="en"/>
+<l:template name="respons.sep" text=". " lang="en"/>
+<l:template name="edition.sep" text=". " lang="en"/>
+<l:template name="edition.serial.sep" text=", " lang="en"/>
+<l:template name="issuing.range" text="-" lang="en"/>
+<l:template name="issuing.div" text=", " lang="en"/>
+<l:template name="issuing.sep" text=". " lang="en"/>
+<l:template name="partnr.sep" text=". " lang="en"/>
+<l:template name="placepubl.sep" text=": " lang="en"/>
+<l:template name="publyear.sep" text=", " lang="en"/>
+<l:template name="pubinfo.sep" text=". " lang="en"/>
+<l:template name="spec.pubinfo.sep" text=", " lang="en"/>
+<l:template name="upd.sep" text=", " lang="en"/>
+<l:template name="datecit1" text=" [cited " lang="en"/>
+<l:template name="datecit2" text="]" lang="en"/>
+<l:template name="extent.sep" text=". " lang="en"/>
+<l:template name="locs.sep" text=", " lang="en"/>
+<l:template name="location.sep" text=". " lang="en"/>
+<l:template name="serie.sep" text=". " lang="en"/>
+<l:template name="notice.sep" text=". " lang="en"/>
+<l:template name="access" text="Available " lang="en"/>
+<l:template name="acctoo" text="Also available " lang="en"/>
+<l:template name="onwww" text="from World Wide Web" lang="en"/>
+<l:template name="oninet" text="from Internet" lang="en"/>
+<l:template name="access.end" text=": " lang="en"/>
+<l:template name="link1" text="&lt;" lang="en"/>
+<l:template name="link2" text="&gt;" lang="en"/>
+<l:template name="access.sep" text=". " lang="en"/>
+<l:template name="isbn" text="ISBN " lang="en"/>
+<l:template name="issn" text="ISSN " lang="en"/>
+<l:template name="stdnum.sep" text=". " lang="en"/>
+<l:template name="patcountry.sep" text=". " lang="en"/>
+<l:template name="pattype.sep" text=", " lang="en"/>
+<l:template name="patnum.sep" text=". " lang="en"/>
+<l:template name="patdate.sep" text=". " lang="en"/>
+</l:context><l:letters lang="en"><l:l i="-1"/>
+<l:l i="0">Symbols</l:l>
+<l:l i="10">A</l:l>
+<l:l i="10">a</l:l>
+<l:l i="10">À</l:l>
+<l:l i="10">à</l:l>
+<l:l i="10">Ã</l:l>
+<l:l i="10">á</l:l>
+<l:l i="10">Â</l:l>
+<l:l i="10">â</l:l>
+<l:l i="10">Ã</l:l>
+<l:l i="10">ã</l:l>
+<l:l i="10">Ä</l:l>
+<l:l i="10">ä</l:l>
+<l:l i="10">Ã…</l:l>
+<l:l i="10">Ã¥</l:l>
+<l:l i="10">Ä€</l:l>
+<l:l i="10">Ä</l:l>
+<l:l i="10">Ä‚</l:l>
+<l:l i="10">ă</l:l>
+<l:l i="10">Ä„</l:l>
+<l:l i="10">Ä…</l:l>
+<l:l i="10">Ç</l:l>
+<l:l i="10">ÇŽ</l:l>
+<l:l i="10">Çž</l:l>
+<l:l i="10">ÇŸ</l:l>
+<l:l i="10">Ç </l:l>
+<l:l i="10">Ç¡</l:l>
+<l:l i="10">Ǻ</l:l>
+<l:l i="10">Ç»</l:l>
+<l:l i="10">È€</l:l>
+<l:l i="10">È</l:l>
+<l:l i="10">È‚</l:l>
+<l:l i="10">ȃ</l:l>
+<l:l i="10">Ȧ</l:l>
+<l:l i="10">ȧ</l:l>
+<l:l i="10">Ḁ</l:l>
+<l:l i="10">á¸</l:l>
+<l:l i="10">ẚ</l:l>
+<l:l i="10">Ạ</l:l>
+<l:l i="10">ạ</l:l>
+<l:l i="10">Ả</l:l>
+<l:l i="10">ả</l:l>
+<l:l i="10">Ấ</l:l>
+<l:l i="10">ấ</l:l>
+<l:l i="10">Ầ</l:l>
+<l:l i="10">ầ</l:l>
+<l:l i="10">Ẩ</l:l>
+<l:l i="10">ẩ</l:l>
+<l:l i="10">Ẫ</l:l>
+<l:l i="10">ẫ</l:l>
+<l:l i="10">Ậ</l:l>
+<l:l i="10">ậ</l:l>
+<l:l i="10">Ắ</l:l>
+<l:l i="10">ắ</l:l>
+<l:l i="10">Ằ</l:l>
+<l:l i="10">ằ</l:l>
+<l:l i="10">Ẳ</l:l>
+<l:l i="10">ẳ</l:l>
+<l:l i="10">Ẵ</l:l>
+<l:l i="10">ẵ</l:l>
+<l:l i="10">Ặ</l:l>
+<l:l i="10">ặ</l:l>
+<l:l i="20">B</l:l>
+<l:l i="20">b</l:l>
+<l:l i="20">Æ€</l:l>
+<l:l i="20">Æ</l:l>
+<l:l i="20">É“</l:l>
+<l:l i="20">Æ‚</l:l>
+<l:l i="20">ƃ</l:l>
+<l:l i="20">Ḃ</l:l>
+<l:l i="20">ḃ</l:l>
+<l:l i="20">Ḅ</l:l>
+<l:l i="20">ḅ</l:l>
+<l:l i="20">Ḇ</l:l>
+<l:l i="20">ḇ</l:l>
+<l:l i="30">C</l:l>
+<l:l i="30">c</l:l>
+<l:l i="30">Ç</l:l>
+<l:l i="30">ç</l:l>
+<l:l i="30">Ć</l:l>
+<l:l i="30">ć</l:l>
+<l:l i="30">Ĉ</l:l>
+<l:l i="30">ĉ</l:l>
+<l:l i="30">ÄŠ</l:l>
+<l:l i="30">Ä‹</l:l>
+<l:l i="30">Č</l:l>
+<l:l i="30">Ä</l:l>
+<l:l i="30">Ƈ</l:l>
+<l:l i="30">ƈ</l:l>
+<l:l i="30">É•</l:l>
+<l:l i="30">Ḉ</l:l>
+<l:l i="30">ḉ</l:l>
+<l:l i="40">D</l:l>
+<l:l i="40">d</l:l>
+<l:l i="40">ÄŽ</l:l>
+<l:l i="40">Ä</l:l>
+<l:l i="40">Ä</l:l>
+<l:l i="40">Ä‘</l:l>
+<l:l i="40">ÆŠ</l:l>
+<l:l i="40">É—</l:l>
+<l:l i="40">Æ‹</l:l>
+<l:l i="40">ƌ</l:l>
+<l:l i="40">Ç…</l:l>
+<l:l i="40">Dz</l:l>
+<l:l i="40">È¡</l:l>
+<l:l i="40">É–</l:l>
+<l:l i="40">Ḋ</l:l>
+<l:l i="40">ḋ</l:l>
+<l:l i="40">Ḍ</l:l>
+<l:l i="40">á¸</l:l>
+<l:l i="40">Ḏ</l:l>
+<l:l i="40">á¸</l:l>
+<l:l i="40">á¸</l:l>
+<l:l i="40">ḑ</l:l>
+<l:l i="40">Ḓ</l:l>
+<l:l i="40">ḓ</l:l>
+<l:l i="50">E</l:l>
+<l:l i="50">e</l:l>
+<l:l i="50">È</l:l>
+<l:l i="50">è</l:l>
+<l:l i="50">É</l:l>
+<l:l i="50">é</l:l>
+<l:l i="50">Ê</l:l>
+<l:l i="50">ê</l:l>
+<l:l i="50">Ë</l:l>
+<l:l i="50">ë</l:l>
+<l:l i="50">Ä’</l:l>
+<l:l i="50">Ä“</l:l>
+<l:l i="50">Ä”</l:l>
+<l:l i="50">Ä•</l:l>
+<l:l i="50">Ä–</l:l>
+<l:l i="50">Ä—</l:l>
+<l:l i="50">Ę</l:l>
+<l:l i="50">Ä™</l:l>
+<l:l i="50">Äš</l:l>
+<l:l i="50">Ä›</l:l>
+<l:l i="50">È„</l:l>
+<l:l i="50">È…</l:l>
+<l:l i="50">Ȇ</l:l>
+<l:l i="50">ȇ</l:l>
+<l:l i="50">Ȩ</l:l>
+<l:l i="50">È©</l:l>
+<l:l i="50">Ḕ</l:l>
+<l:l i="50">ḕ</l:l>
+<l:l i="50">Ḗ</l:l>
+<l:l i="50">ḗ</l:l>
+<l:l i="50">Ḙ</l:l>
+<l:l i="50">ḙ</l:l>
+<l:l i="50">Ḛ</l:l>
+<l:l i="50">ḛ</l:l>
+<l:l i="50">Ḝ</l:l>
+<l:l i="50">á¸</l:l>
+<l:l i="50">Ẹ</l:l>
+<l:l i="50">ẹ</l:l>
+<l:l i="50">Ẻ</l:l>
+<l:l i="50">ẻ</l:l>
+<l:l i="50">Ẽ</l:l>
+<l:l i="50">ẽ</l:l>
+<l:l i="50">Ế</l:l>
+<l:l i="50">ế</l:l>
+<l:l i="50">Ề</l:l>
+<l:l i="50">á»</l:l>
+<l:l i="50">Ể</l:l>
+<l:l i="50">ể</l:l>
+<l:l i="50">Ễ</l:l>
+<l:l i="50">á»…</l:l>
+<l:l i="50">Ệ</l:l>
+<l:l i="50">ệ</l:l>
+<l:l i="60">F</l:l>
+<l:l i="60">f</l:l>
+<l:l i="60">Æ‘</l:l>
+<l:l i="60">Æ’</l:l>
+<l:l i="60">Ḟ</l:l>
+<l:l i="60">ḟ</l:l>
+<l:l i="70">G</l:l>
+<l:l i="70">g</l:l>
+<l:l i="70">Ĝ</l:l>
+<l:l i="70">Ä</l:l>
+<l:l i="70">Äž</l:l>
+<l:l i="70">ÄŸ</l:l>
+<l:l i="70">Ä </l:l>
+<l:l i="70">Ä¡</l:l>
+<l:l i="70">Ä¢</l:l>
+<l:l i="70">Ä£</l:l>
+<l:l i="70">Æ“</l:l>
+<l:l i="70">É </l:l>
+<l:l i="70">Ǥ</l:l>
+<l:l i="70">Ç¥</l:l>
+<l:l i="70">Ǧ</l:l>
+<l:l i="70">ǧ</l:l>
+<l:l i="70">Ç´</l:l>
+<l:l i="70">ǵ</l:l>
+<l:l i="70">Ḡ</l:l>
+<l:l i="70">ḡ</l:l>
+<l:l i="80">H</l:l>
+<l:l i="80">h</l:l>
+<l:l i="80">Ĥ</l:l>
+<l:l i="80">Ä¥</l:l>
+<l:l i="80">Ħ</l:l>
+<l:l i="80">ħ</l:l>
+<l:l i="80">Èž</l:l>
+<l:l i="80">ÈŸ</l:l>
+<l:l i="80">ɦ</l:l>
+<l:l i="80">Ḣ</l:l>
+<l:l i="80">ḣ</l:l>
+<l:l i="80">Ḥ</l:l>
+<l:l i="80">ḥ</l:l>
+<l:l i="80">Ḧ</l:l>
+<l:l i="80">ḧ</l:l>
+<l:l i="80">Ḩ</l:l>
+<l:l i="80">ḩ</l:l>
+<l:l i="80">Ḫ</l:l>
+<l:l i="80">ḫ</l:l>
+<l:l i="80">ẖ</l:l>
+<l:l i="90">I</l:l>
+<l:l i="90">i</l:l>
+<l:l i="90">Ì</l:l>
+<l:l i="90">ì</l:l>
+<l:l i="90">Ã</l:l>
+<l:l i="90">í</l:l>
+<l:l i="90">ÃŽ</l:l>
+<l:l i="90">î</l:l>
+<l:l i="90">Ã</l:l>
+<l:l i="90">ï</l:l>
+<l:l i="90">Ĩ</l:l>
+<l:l i="90">Ä©</l:l>
+<l:l i="90">Ī</l:l>
+<l:l i="90">Ä«</l:l>
+<l:l i="90">Ĭ</l:l>
+<l:l i="90">Ä­</l:l>
+<l:l i="90">Ä®</l:l>
+<l:l i="90">į</l:l>
+<l:l i="90">Ä°</l:l>
+<l:l i="90">Æ—</l:l>
+<l:l i="90">ɨ</l:l>
+<l:l i="90">Ç</l:l>
+<l:l i="90">Ç</l:l>
+<l:l i="90">Ȉ</l:l>
+<l:l i="90">ȉ</l:l>
+<l:l i="90">ÈŠ</l:l>
+<l:l i="90">È‹</l:l>
+<l:l i="90">Ḭ</l:l>
+<l:l i="90">ḭ</l:l>
+<l:l i="90">Ḯ</l:l>
+<l:l i="90">ḯ</l:l>
+<l:l i="90">Ỉ</l:l>
+<l:l i="90">ỉ</l:l>
+<l:l i="90">Ị</l:l>
+<l:l i="90">ị</l:l>
+<l:l i="100">J</l:l>
+<l:l i="100">j</l:l>
+<l:l i="100">Ä´</l:l>
+<l:l i="100">ĵ</l:l>
+<l:l i="100">Ç°</l:l>
+<l:l i="100">Ê</l:l>
+<l:l i="110">K</l:l>
+<l:l i="110">k</l:l>
+<l:l i="110">Ķ</l:l>
+<l:l i="110">Ä·</l:l>
+<l:l i="110">Ƙ</l:l>
+<l:l i="110">Æ™</l:l>
+<l:l i="110">Ǩ</l:l>
+<l:l i="110">Ç©</l:l>
+<l:l i="110">Ḱ</l:l>
+<l:l i="110">ḱ</l:l>
+<l:l i="110">Ḳ</l:l>
+<l:l i="110">ḳ</l:l>
+<l:l i="110">Ḵ</l:l>
+<l:l i="110">ḵ</l:l>
+<l:l i="120">L</l:l>
+<l:l i="120">l</l:l>
+<l:l i="120">Ĺ</l:l>
+<l:l i="120">ĺ</l:l>
+<l:l i="120">Ä»</l:l>
+<l:l i="120">ļ</l:l>
+<l:l i="120">Ľ</l:l>
+<l:l i="120">ľ</l:l>
+<l:l i="120">Ä¿</l:l>
+<l:l i="120">Å€</l:l>
+<l:l i="120">Å</l:l>
+<l:l i="120">Å‚</l:l>
+<l:l i="120">Æš</l:l>
+<l:l i="120">Lj</l:l>
+<l:l i="120">È´</l:l>
+<l:l i="120">É«</l:l>
+<l:l i="120">ɬ</l:l>
+<l:l i="120">É­</l:l>
+<l:l i="120">Ḷ</l:l>
+<l:l i="120">ḷ</l:l>
+<l:l i="120">Ḹ</l:l>
+<l:l i="120">ḹ</l:l>
+<l:l i="120">Ḻ</l:l>
+<l:l i="120">ḻ</l:l>
+<l:l i="120">Ḽ</l:l>
+<l:l i="120">ḽ</l:l>
+<l:l i="130">M</l:l>
+<l:l i="130">m</l:l>
+<l:l i="130">ɱ</l:l>
+<l:l i="130">Ḿ</l:l>
+<l:l i="130">ḿ</l:l>
+<l:l i="130">á¹€</l:l>
+<l:l i="130">á¹</l:l>
+<l:l i="130">Ṃ</l:l>
+<l:l i="130">ṃ</l:l>
+<l:l i="140">N</l:l>
+<l:l i="140">n</l:l>
+<l:l i="140">Ñ</l:l>
+<l:l i="140">ñ</l:l>
+<l:l i="140">Ń</l:l>
+<l:l i="140">Å„</l:l>
+<l:l i="140">Å…</l:l>
+<l:l i="140">ņ</l:l>
+<l:l i="140">Ň</l:l>
+<l:l i="140">ň</l:l>
+<l:l i="140">Æ</l:l>
+<l:l i="140">ɲ</l:l>
+<l:l i="140">Æž</l:l>
+<l:l i="140">È </l:l>
+<l:l i="140">Ç‹</l:l>
+<l:l i="140">Ǹ</l:l>
+<l:l i="140">ǹ</l:l>
+<l:l i="140">ȵ</l:l>
+<l:l i="140">ɳ</l:l>
+<l:l i="140">Ṅ</l:l>
+<l:l i="140">á¹…</l:l>
+<l:l i="140">Ṇ</l:l>
+<l:l i="140">ṇ</l:l>
+<l:l i="140">Ṉ</l:l>
+<l:l i="140">ṉ</l:l>
+<l:l i="140">Ṋ</l:l>
+<l:l i="140">ṋ</l:l>
+<l:l i="150">O</l:l>
+<l:l i="150">o</l:l>
+<l:l i="150">Ã’</l:l>
+<l:l i="150">ò</l:l>
+<l:l i="150">Ó</l:l>
+<l:l i="150">ó</l:l>
+<l:l i="150">Ô</l:l>
+<l:l i="150">ô</l:l>
+<l:l i="150">Õ</l:l>
+<l:l i="150">õ</l:l>
+<l:l i="150">Ö</l:l>
+<l:l i="150">ö</l:l>
+<l:l i="150">Ø</l:l>
+<l:l i="150">ø</l:l>
+<l:l i="150">Ō</l:l>
+<l:l i="150">Å</l:l>
+<l:l i="150">ÅŽ</l:l>
+<l:l i="150">Å</l:l>
+<l:l i="150">Å</l:l>
+<l:l i="150">Å‘</l:l>
+<l:l i="150">ÆŸ</l:l>
+<l:l i="150">Æ </l:l>
+<l:l i="150">Æ¡</l:l>
+<l:l i="150">Ç‘</l:l>
+<l:l i="150">Ç’</l:l>
+<l:l i="150">Ǫ</l:l>
+<l:l i="150">Ç«</l:l>
+<l:l i="150">Ǭ</l:l>
+<l:l i="150">Ç­</l:l>
+<l:l i="150">Ǿ</l:l>
+<l:l i="150">Ç¿</l:l>
+<l:l i="150">Ȍ</l:l>
+<l:l i="150">È</l:l>
+<l:l i="150">ÈŽ</l:l>
+<l:l i="150">È</l:l>
+<l:l i="150">Ȫ</l:l>
+<l:l i="150">È«</l:l>
+<l:l i="150">Ȭ</l:l>
+<l:l i="150">È­</l:l>
+<l:l i="150">È®</l:l>
+<l:l i="150">ȯ</l:l>
+<l:l i="150">È°</l:l>
+<l:l i="150">ȱ</l:l>
+<l:l i="150">Ṍ</l:l>
+<l:l i="150">á¹</l:l>
+<l:l i="150">Ṏ</l:l>
+<l:l i="150">á¹</l:l>
+<l:l i="150">á¹</l:l>
+<l:l i="150">ṑ</l:l>
+<l:l i="150">á¹’</l:l>
+<l:l i="150">ṓ</l:l>
+<l:l i="150">Ọ</l:l>
+<l:l i="150">á»</l:l>
+<l:l i="150">Ỏ</l:l>
+<l:l i="150">á»</l:l>
+<l:l i="150">á»</l:l>
+<l:l i="150">ố</l:l>
+<l:l i="150">á»’</l:l>
+<l:l i="150">ồ</l:l>
+<l:l i="150">á»”</l:l>
+<l:l i="150">ổ</l:l>
+<l:l i="150">á»–</l:l>
+<l:l i="150">á»—</l:l>
+<l:l i="150">Ộ</l:l>
+<l:l i="150">á»™</l:l>
+<l:l i="150">Ớ</l:l>
+<l:l i="150">á»›</l:l>
+<l:l i="150">Ờ</l:l>
+<l:l i="150">á»</l:l>
+<l:l i="150">Ở</l:l>
+<l:l i="150">ở</l:l>
+<l:l i="150">á» </l:l>
+<l:l i="150">ỡ</l:l>
+<l:l i="150">Ợ</l:l>
+<l:l i="150">ợ</l:l>
+<l:l i="160">P</l:l>
+<l:l i="160">p</l:l>
+<l:l i="160">Ƥ</l:l>
+<l:l i="160">Æ¥</l:l>
+<l:l i="160">á¹”</l:l>
+<l:l i="160">ṕ</l:l>
+<l:l i="160">á¹–</l:l>
+<l:l i="160">á¹—</l:l>
+<l:l i="170">Q</l:l>
+<l:l i="170">q</l:l>
+<l:l i="170">Ê </l:l>
+<l:l i="180">R</l:l>
+<l:l i="180">r</l:l>
+<l:l i="180">Å”</l:l>
+<l:l i="180">Å•</l:l>
+<l:l i="180">Å–</l:l>
+<l:l i="180">Å—</l:l>
+<l:l i="180">Ř</l:l>
+<l:l i="180">Å™</l:l>
+<l:l i="180">È</l:l>
+<l:l i="180">È‘</l:l>
+<l:l i="180">È’</l:l>
+<l:l i="180">È“</l:l>
+<l:l i="180">ɼ</l:l>
+<l:l i="180">ɽ</l:l>
+<l:l i="180">ɾ</l:l>
+<l:l i="180">Ṙ</l:l>
+<l:l i="180">á¹™</l:l>
+<l:l i="180">Ṛ</l:l>
+<l:l i="180">á¹›</l:l>
+<l:l i="180">Ṝ</l:l>
+<l:l i="180">á¹</l:l>
+<l:l i="180">Ṟ</l:l>
+<l:l i="180">ṟ</l:l>
+<l:l i="190">S</l:l>
+<l:l i="190">s</l:l>
+<l:l i="190">Åš</l:l>
+<l:l i="190">Å›</l:l>
+<l:l i="190">Ŝ</l:l>
+<l:l i="190">Å</l:l>
+<l:l i="190">Åž</l:l>
+<l:l i="190">ÅŸ</l:l>
+<l:l i="190">Å </l:l>
+<l:l i="190">Å¡</l:l>
+<l:l i="190">Ș</l:l>
+<l:l i="190">È™</l:l>
+<l:l i="190">Ê‚</l:l>
+<l:l i="190">á¹ </l:l>
+<l:l i="190">ṡ</l:l>
+<l:l i="190">á¹¢</l:l>
+<l:l i="190">á¹£</l:l>
+<l:l i="190">Ṥ</l:l>
+<l:l i="190">á¹¥</l:l>
+<l:l i="190">Ṧ</l:l>
+<l:l i="190">ṧ</l:l>
+<l:l i="190">Ṩ</l:l>
+<l:l i="190">ṩ</l:l>
+<l:l i="200">T</l:l>
+<l:l i="200">t</l:l>
+<l:l i="200">Å¢</l:l>
+<l:l i="200">Å£</l:l>
+<l:l i="200">Ť</l:l>
+<l:l i="200">Å¥</l:l>
+<l:l i="200">Ŧ</l:l>
+<l:l i="200">ŧ</l:l>
+<l:l i="200">Æ«</l:l>
+<l:l i="200">Ƭ</l:l>
+<l:l i="200">Æ­</l:l>
+<l:l i="200">Æ®</l:l>
+<l:l i="200">ʈ</l:l>
+<l:l i="200">Èš</l:l>
+<l:l i="200">È›</l:l>
+<l:l i="200">ȶ</l:l>
+<l:l i="200">Ṫ</l:l>
+<l:l i="200">ṫ</l:l>
+<l:l i="200">Ṭ</l:l>
+<l:l i="200">á¹­</l:l>
+<l:l i="200">á¹®</l:l>
+<l:l i="200">ṯ</l:l>
+<l:l i="200">á¹°</l:l>
+<l:l i="200">á¹±</l:l>
+<l:l i="200">ẗ</l:l>
+<l:l i="210">U</l:l>
+<l:l i="210">u</l:l>
+<l:l i="210">Ù</l:l>
+<l:l i="210">ù</l:l>
+<l:l i="210">Ú</l:l>
+<l:l i="210">ú</l:l>
+<l:l i="210">Û</l:l>
+<l:l i="210">û</l:l>
+<l:l i="210">Ü</l:l>
+<l:l i="210">ü</l:l>
+<l:l i="210">Ũ</l:l>
+<l:l i="210">Å©</l:l>
+<l:l i="210">Ū</l:l>
+<l:l i="210">Å«</l:l>
+<l:l i="210">Ŭ</l:l>
+<l:l i="210">Å­</l:l>
+<l:l i="210">Å®</l:l>
+<l:l i="210">ů</l:l>
+<l:l i="210">Å°</l:l>
+<l:l i="210">ű</l:l>
+<l:l i="210">Ų</l:l>
+<l:l i="210">ų</l:l>
+<l:l i="210">Ư</l:l>
+<l:l i="210">Æ°</l:l>
+<l:l i="210">Ç“</l:l>
+<l:l i="210">Ç”</l:l>
+<l:l i="210">Ç•</l:l>
+<l:l i="210">Ç–</l:l>
+<l:l i="210">Ç—</l:l>
+<l:l i="210">ǘ</l:l>
+<l:l i="210">Ç™</l:l>
+<l:l i="210">Çš</l:l>
+<l:l i="210">Ç›</l:l>
+<l:l i="210">ǜ</l:l>
+<l:l i="210">È”</l:l>
+<l:l i="210">È•</l:l>
+<l:l i="210">È–</l:l>
+<l:l i="210">È—</l:l>
+<l:l i="210">á¹²</l:l>
+<l:l i="210">á¹³</l:l>
+<l:l i="210">á¹´</l:l>
+<l:l i="210">á¹µ</l:l>
+<l:l i="210">Ṷ</l:l>
+<l:l i="210">á¹·</l:l>
+<l:l i="210">Ṹ</l:l>
+<l:l i="210">á¹¹</l:l>
+<l:l i="210">Ṻ</l:l>
+<l:l i="210">á¹»</l:l>
+<l:l i="210">Ụ</l:l>
+<l:l i="210">ụ</l:l>
+<l:l i="210">Ủ</l:l>
+<l:l i="210">ủ</l:l>
+<l:l i="210">Ứ</l:l>
+<l:l i="210">ứ</l:l>
+<l:l i="210">Ừ</l:l>
+<l:l i="210">ừ</l:l>
+<l:l i="210">Ử</l:l>
+<l:l i="210">á»­</l:l>
+<l:l i="210">á»®</l:l>
+<l:l i="210">ữ</l:l>
+<l:l i="210">á»°</l:l>
+<l:l i="210">á»±</l:l>
+<l:l i="220">V</l:l>
+<l:l i="220">v</l:l>
+<l:l i="220">Ʋ</l:l>
+<l:l i="220">Ê‹</l:l>
+<l:l i="220">á¹¼</l:l>
+<l:l i="220">á¹½</l:l>
+<l:l i="220">á¹¾</l:l>
+<l:l i="220">ṿ</l:l>
+<l:l i="230">W</l:l>
+<l:l i="230">w</l:l>
+<l:l i="230">Å´</l:l>
+<l:l i="230">ŵ</l:l>
+<l:l i="230">Ẁ</l:l>
+<l:l i="230">áº</l:l>
+<l:l i="230">Ẃ</l:l>
+<l:l i="230">ẃ</l:l>
+<l:l i="230">Ẅ</l:l>
+<l:l i="230">ẅ</l:l>
+<l:l i="230">Ẇ</l:l>
+<l:l i="230">ẇ</l:l>
+<l:l i="230">Ẉ</l:l>
+<l:l i="230">ẉ</l:l>
+<l:l i="230">ẘ</l:l>
+<l:l i="240">X</l:l>
+<l:l i="240">x</l:l>
+<l:l i="240">Ẋ</l:l>
+<l:l i="240">ẋ</l:l>
+<l:l i="240">Ẍ</l:l>
+<l:l i="240">áº</l:l>
+<l:l i="250">Y</l:l>
+<l:l i="250">y</l:l>
+<l:l i="250">Ã</l:l>
+<l:l i="250">ý</l:l>
+<l:l i="250">ÿ</l:l>
+<l:l i="250">Ÿ</l:l>
+<l:l i="250">Ŷ</l:l>
+<l:l i="250">Å·</l:l>
+<l:l i="250">Ƴ</l:l>
+<l:l i="250">Æ´</l:l>
+<l:l i="250">Ȳ</l:l>
+<l:l i="250">ȳ</l:l>
+<l:l i="250">Ẏ</l:l>
+<l:l i="250">áº</l:l>
+<l:l i="250">ẙ</l:l>
+<l:l i="250">Ỳ</l:l>
+<l:l i="250">ỳ</l:l>
+<l:l i="250">á»´</l:l>
+<l:l i="250">ỵ</l:l>
+<l:l i="250">Ỷ</l:l>
+<l:l i="250">á»·</l:l>
+<l:l i="250">Ỹ</l:l>
+<l:l i="250">ỹ</l:l>
+<l:l i="260">Z</l:l>
+<l:l i="260">z</l:l>
+<l:l i="260">Ź</l:l>
+<l:l i="260">ź</l:l>
+<l:l i="260">Å»</l:l>
+<l:l i="260">ż</l:l>
+<l:l i="260">Ž</l:l>
+<l:l i="260">ž</l:l>
+<l:l i="260">Ƶ</l:l>
+<l:l i="260">ƶ</l:l>
+<l:l i="260">Ȥ</l:l>
+<l:l i="260">È¥</l:l>
+<l:l i="260">Ê</l:l>
+<l:l i="260">Ê‘</l:l>
+<l:l i="260">áº</l:l>
+<l:l i="260">ẑ</l:l>
+<l:l i="260">Ẓ</l:l>
+<l:l i="260">ẓ</l:l>
+<l:l i="260">Ẕ</l:l>
+<l:l i="260">ẕ</l:l>
+</l:letters>
+</l:l10n>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/xh.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/xh.xml
new file mode 100644
index 0000000..db22550
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/xh.xml
@@ -0,0 +1,1229 @@
+<?xml version="1.0" encoding="utf-8"?>
+<l:l10n xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0" language="xh" english-language-name="Xhosa">
+
+<!-- * This file is generated automatically. -->
+<!-- * To submit changes to this file upstream (to the DocBook Project) -->
+<!-- * do not submit an edited version of this file. Instead, submit an -->
+<!-- * edited version of the source file at the following location: -->
+<!-- * -->
+<!-- * https://docbook.svn.sourceforge.net/svnroot/docbook/trunk/gentext/locale/xh.xml -->
+<!-- * -->
+<!-- * E-mail the edited xh.xml source file to: -->
+<!-- * -->
+<!-- * docbook-developers@lists.sourceforge.net -->
+
+<!-- ******************************************************************** -->
+
+<!-- This file is part of the XSL DocBook Stylesheet distribution. -->
+<!-- See ../README or http://docbook.sf.net/release/xsl/current/ for -->
+<!-- copyright and other information. -->
+
+<!-- ******************************************************************** -->
+<!-- In these files, % with a letter is used for a placeholder: -->
+<!-- %t is the current element's title -->
+<!-- %s is the current element's subtitle (if applicable)-->
+<!-- %n is the current element's number label-->
+<!-- %p is the current element's page number (if applicable)-->
+<!-- ******************************************************************** -->
+
+
+<l:gentext key="Abstract" text="Isiqalo"/>
+<l:gentext key="abstract" text="Isiqalo"/>
+<l:gentext key="Acknowledgements" text="Acknowledgements" lang="en"/>
+<l:gentext key="acknowledgements" text="Acknowledgements" lang="en"/>
+<l:gentext key="Answer" text="I:"/>
+<l:gentext key="answer" text="I:"/>
+<l:gentext key="Appendix" text="Isivalo"/>
+<l:gentext key="appendix" text="isivalo"/>
+<l:gentext key="Article" text="Umba"/>
+<l:gentext key="article" text="Umba"/>
+<l:gentext key="Author" text="Author" lang="en"/>
+<l:gentext key="Bibliography" text="Ezobunzululwazi"/>
+<l:gentext key="bibliography" text="Ezobunzululwazi"/>
+<l:gentext key="Book" text="Incwadi"/>
+<l:gentext key="book" text="Incwadi"/>
+<l:gentext key="CAUTION" text="ISILUMKISO"/>
+<l:gentext key="Caution" text="Isilumkiso"/>
+<l:gentext key="caution" text="Isilumkiso"/>
+<l:gentext key="Chapter" text="Isiqendu"/>
+<l:gentext key="chapter" text="isiqendu"/>
+<l:gentext key="Colophon" text="Ikolophon"/>
+<l:gentext key="colophon" text="Ikolophon"/>
+<l:gentext key="Copyright" text="Ushicilelo olusemthethweni"/>
+<l:gentext key="copyright" text="Ushicilelo olusemthethweni"/>
+<l:gentext key="Dedication" text="Ulwaziso"/>
+<l:gentext key="dedication" text="Ulwaziso"/>
+<l:gentext key="Edition" text="Uhlelo"/>
+<l:gentext key="edition" text="Uhlelo"/>
+<l:gentext key="Editor" text="Editor" lang="en"/>
+<l:gentext key="Equation" text="Ulinganiselo"/>
+<l:gentext key="equation" text="Ulinganiselo"/>
+<l:gentext key="Example" text="Umzekelo"/>
+<l:gentext key="example" text="Umzekelo"/>
+<l:gentext key="Figure" text="Ulungu"/>
+<l:gentext key="figure" text="Ulungu"/>
+<l:gentext key="Glossary" text="Inkcazelo yamagama"/>
+<l:gentext key="glossary" text="Inkcazelo yamagama"/>
+<l:gentext key="GlossSee" text="Bona"/>
+<l:gentext key="glosssee" text="Bona"/>
+<l:gentext key="GlossSeeAlso" text="Bona Kwakhona"/>
+<l:gentext key="glossseealso" text="Bona Kwakhona"/>
+<l:gentext key="IMPORTANT" text="IBALULEKILE"/>
+<l:gentext key="important" text="Ibalulekile"/>
+<l:gentext key="Important" text="Ibalulekile"/>
+<l:gentext key="Index" text="Isalathiso"/>
+<l:gentext key="index" text="Isalathiso"/>
+<l:gentext key="ISBN" text="iISBN"/>
+<l:gentext key="isbn" text="iISBN"/>
+<l:gentext key="LegalNotice" text="Isaziso Esesimthethweni"/>
+<l:gentext key="legalnotice" text="Isaziso Esesimthethweni"/>
+<l:gentext key="MsgAud" text="Ababhali"/>
+<l:gentext key="msgaud" text="Ababhali"/>
+<l:gentext key="MsgLevel" text="Umphakamo"/>
+<l:gentext key="msglevel" text="Umphakamo"/>
+<l:gentext key="MsgOrig" text="Uqobo"/>
+<l:gentext key="msgorig" text="Uqobo"/>
+<l:gentext key="NOTE" text="QAPHELA"/>
+<l:gentext key="Note" text="Qaphela"/>
+<l:gentext key="note" text="Qaphela"/>
+<l:gentext key="Part" text="Inxenye"/>
+<l:gentext key="part" text="Inxenye"/>
+<l:gentext key="Preface" text="Isihloko"/>
+<l:gentext key="preface" text="Isihloko"/>
+<l:gentext key="Procedure" text="Inkqubo"/>
+<l:gentext key="procedure" text="Inkqubo"/>
+<l:gentext key="ProductionSet" text="Imveliso"/>
+<l:gentext key="PubDate" text="Publication Date" lang="en"/>
+<l:gentext key="pubdate" text="Publication date" lang="en"/>
+<l:gentext key="Published" text="Ipapashwe"/>
+<l:gentext key="published" text="Ipapashwe"/>
+<l:gentext key="Publisher" text="Publisher" lang="en"/>
+<l:gentext key="Qandadiv" text="U no I"/>
+<l:gentext key="qandadiv" text="U no I"/>
+<l:gentext key="QandASet" text="Frequently Asked Questions" lang="en"/>
+<l:gentext key="Question" text="U:"/>
+<l:gentext key="question" text="U:"/>
+<l:gentext key="RefEntry" text=""/>
+<l:gentext key="refentry" text=""/>
+<l:gentext key="Reference" text="Uthelekiso"/>
+<l:gentext key="reference" text="Uthelekiso"/>
+<l:gentext key="References" text="References" lang="en"/>
+<l:gentext key="RefName" text="Igama lothelekiso"/>
+<l:gentext key="refname" text="Igama lothelekiso"/>
+<l:gentext key="RefSection" text=""/>
+<l:gentext key="refsection" text=""/>
+<l:gentext key="RefSynopsisDiv" text="Isinopsisi"/>
+<l:gentext key="refsynopsisdiv" text="Isinopsisi"/>
+<l:gentext key="RevHistory" text="Imbali yophindo"/>
+<l:gentext key="revhistory" text="Imbali yophindo"/>
+<l:gentext key="revision" text="Iphindo"/>
+<l:gentext key="Revision" text="Iphindo"/>
+<l:gentext key="sect1" text="Icandelo"/>
+<l:gentext key="sect2" text="Icandelo"/>
+<l:gentext key="sect3" text="Icandelo"/>
+<l:gentext key="sect4" text="Icandelo"/>
+<l:gentext key="sect5" text="Icandelo"/>
+<l:gentext key="section" text="Icandelo"/>
+<l:gentext key="Section" text="Icandelo"/>
+<l:gentext key="see" text="Bona"/>
+<l:gentext key="See" text="Bona"/>
+<l:gentext key="seealso" text="Bona Kwakhona"/>
+<l:gentext key="Seealso" text="Bona Kwakhona"/>
+<l:gentext key="SeeAlso" text="Bona Kwakhona"/>
+<l:gentext key="set" text="Cwangcisa"/>
+<l:gentext key="Set" text="Cwangcisa"/>
+<l:gentext key="setindex" text="Cwangcisa Isalathiso"/>
+<l:gentext key="SetIndex" text="Cwangcisa Isalathiso"/>
+<l:gentext key="Sidebar" text=""/>
+<l:gentext key="sidebar" text="ibar esecaleni"/>
+<l:gentext key="step" text="inqwanqwa"/>
+<l:gentext key="Step" text="Inqwanqwa"/>
+<l:gentext key="table" text="Indlela Yokwenza Imigca"/>
+<l:gentext key="Table" text="Indlela Yokwenza Imigca"/>
+<l:gentext key="task" text="Task" lang="en"/>
+<l:gentext key="Task" text="Task" lang="en"/>
+<l:gentext key="tip" text="Incam"/>
+<l:gentext key="TIP" text="INCAM"/>
+<l:gentext key="Tip" text="Incam"/>
+<l:gentext key="Warning" text="Isilumkiso"/>
+<l:gentext key="warning" text="Isilumkiso"/>
+<l:gentext key="WARNING" text="ISILUMKISO"/>
+<l:gentext key="and" text="no"/>
+<l:gentext key="by" text="by"/>
+<l:gentext key="Edited" text="Ihleliwe"/>
+<l:gentext key="edited" text="Ihleliwe"/>
+<l:gentext key="Editedby" text="Ihlelwe"/>
+<l:gentext key="editedby" text="Ihlelwe"/>
+<l:gentext key="in" text="in"/>
+<l:gentext key="lastlistcomma" text=", "/>
+<l:gentext key="listcomma" text=", "/>
+<l:gentext key="notes" text="Iziqaphelo"/>
+<l:gentext key="Notes" text="Iziqaphelo"/>
+<l:gentext key="Pgs" text="Amaphepha"/>
+<l:gentext key="pgs" text="Amaphepha"/>
+<l:gentext key="Revisedby" text="Iphindwe ngu: "/>
+<l:gentext key="revisedby" text="Iphindwe ngu:"/>
+<l:gentext key="TableNotes" text="Iziqaphelo"/>
+<l:gentext key="tablenotes" text="Iziqaphelo"/>
+<l:gentext key="TableofContents" text="Imigca Yemixholo"/>
+<l:gentext key="tableofcontents" text="Imigca Yemixholo"/>
+<l:gentext key="unexpectedelementname" text="Igama lesiqalelo esingalindelwanga"/>
+<l:gentext key="unsupported" text="ayixhaswanga"/>
+<l:gentext key="xrefto" text="thelekiso ku"/>
+<l:gentext key="Authors" text="Authors" lang="en"/>
+<l:gentext key="copyeditor" text="Copy Editor" lang="en"/>
+<l:gentext key="graphicdesigner" text="Graphic Designer" lang="en"/>
+<l:gentext key="productioneditor" text="Production Editor" lang="en"/>
+<l:gentext key="technicaleditor" text="Technical Editor" lang="en"/>
+<l:gentext key="translator" text="Translator" lang="en"/>
+<l:gentext key="listofequations" text="Uluhlu Lemilinganiselo"/>
+<l:gentext key="ListofEquations" text="Uluhlu Lemilinganiselo"/>
+<l:gentext key="ListofExamples" text="Uluhlu Lemizekelo"/>
+<l:gentext key="listofexamples" text="Uluhlu Lemizekelo"/>
+<l:gentext key="ListofFigures" text="Uluhlu Lamalungu"/>
+<l:gentext key="listoffigures" text="Uluhlu Lamalungu"/>
+<l:gentext key="ListofProcedures" text="List of Procedures" lang="en"/>
+<l:gentext key="listofprocedures" text="List of Procedures" lang="en"/>
+<l:gentext key="listoftables" text="Uluhlu Lendlela Yokwenza Imigca"/>
+<l:gentext key="ListofTables" text="Uluhlu Lendlela Yokwenza Imigca"/>
+<l:gentext key="ListofUnknown" text="Uluhlu Lokungaziwayo"/>
+<l:gentext key="listofunknown" text="Uluhlu Lokungaziwayo"/>
+<l:gentext key="nav-home" text="Ikhaya"/>
+<l:gentext key="nav-next" text="Elandelayo"/>
+<l:gentext key="nav-next-sibling" text="Yisa Phambili"/>
+<l:gentext key="nav-prev" text="Edlulileyo"/>
+<l:gentext key="nav-prev-sibling" text="Yisa Emva"/>
+<l:gentext key="nav-up" text="Phezulu"/>
+<l:gentext key="nav-toc" text="ToC" lang="en"/>
+<l:gentext key="Draft" text="Draft"/>
+<l:gentext key="above" text="above"/>
+<l:gentext key="below" text="below"/>
+<l:gentext key="sectioncalled" text="icandelo libizwa ngokuba"/>
+<l:gentext key="index symbols" text="Iimpawu"/>
+<l:gentext key="writing-mode" text="lr-tb"/>
+<l:gentext key="lowercase.alpha" text="abcdefghijklmnopqrstuvwxyz"/>
+<l:gentext key="uppercase.alpha" text="ABCDEFGHIJKLMNOPQRSTUVWXYZ"/>
+<l:gentext key="normalize.sort.input" text="AaÀàÃáÂâÃãÄäÅåĀÄĂ㥹ÇǎǞǟǠǡǺǻȀÈȂȃȦȧḀá¸áºšáº áº¡áº¢áº£áº¤áº¥áº¦áº§áº¨áº©áºªáº«áº¬áº­áº®áº¯áº°áº±áº²áº³áº´áºµáº¶áº·BbÆ€ÆɓƂƃḂḃḄḅḆḇCcÇçĆćĈĉĊċČÄƇƈɕḈḉDdÄŽÄÄđƊɗƋƌDžDzȡɖḊḋḌá¸á¸Žá¸á¸á¸‘ḒḓEeÈèÉéÊêËëĒēĔĕĖėĘęĚěȄȅȆȇȨȩḔḕḖḗḘḙḚḛḜá¸áº¸áº¹áººáº»áº¼áº½áº¾áº¿á»€á»á»‚ểỄễỆệFfƑƒḞḟGgÄœÄĞğĠġĢģƓɠǤǥǦǧǴǵḠḡHhĤĥĦħȞȟɦḢḣḤḥḦḧḨḩḪḫẖIiÌìÃíÎîÃïĨĩĪīĬĭĮįİƗɨÇÇȈȉȊȋḬḭḮḯỈỉỊịJjĴĵǰÊKkĶķƘƙǨǩḰḱḲḳḴḵLlĹĺĻļĽľĿŀÅłƚLjȴɫɬɭḶḷḸḹḺḻḼḽMmɱḾḿṀá¹á¹‚ṃNnÑñŃńŅņŇňÆɲƞȠNjǸǹȵɳṄṅṆṇṈṉṊṋOoÒòÓóÔôÕõÖöØøŌÅÅŽÅÅőƟƠơǑǒǪǫǬǭǾǿȌÈÈŽÈȪȫȬȭȮȯȰȱṌá¹á¹Žá¹á¹á¹‘ṒṓỌá»á»Žá»á»á»‘ỒồỔổỖỗỘộỚớỜá»á»žá»Ÿá» á»¡á»¢á»£PpƤƥṔṕṖṗQqÊ RrŔŕŖŗŘřÈȑȒȓɼɽɾṘṙṚṛṜá¹á¹žá¹ŸSsŚśŜÅŞşŠšȘșʂṠṡṢṣṤṥṦṧṨṩTtŢţŤťŦŧƫƬƭƮʈȚțȶṪṫṬṭṮṯṰṱẗUuÙùÚúÛûÜüŨũŪūŬŭŮůŰűŲųƯưǓǔǕǖǗǘǙǚǛǜȔȕȖȗṲṳṴṵṶṷṸṹṺṻỤụỦủỨứỪừỬửỮữỰựVvƲʋṼṽṾṿWwŴŵẀáºáº‚ẃẄẅẆẇẈẉẘXxẊẋẌáºYyÃýÿŸŶŷƳƴȲȳẎáºáº™á»²á»³á»´á»µá»¶á»·á»¸á»¹ZzŹźŻżŽžƵƶȤȥÊÊ‘áºáº‘ẒẓẔẕẕ" lang="en"/>
+<l:gentext key="normalize.sort.output" text="AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBCCCCCCCCCCCCCCCCCDDDDDDDDDDDDDDDDDDDDDDDDEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEFFFFFFGGGGGGGGGGGGGGGGGGGGHHHHHHHHHHHHHHHHHHHHIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIJJJJJJKKKKKKKKKKKKKKLLLLLLLLLLLLLLLLLLLLLLLLLLMMMMMMMMMNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOPPPPPPPPQQQRRRRRRRRRRRRRRRRRRRRRRRSSSSSSSSSSSSSSSSSSSSSSSTTTTTTTTTTTTTTTTTTTTTTTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUVVVVVVVVWWWWWWWWWWWWWWWXXXXXXYYYYYYYYYYYYYYYYYYYYYYYZZZZZZZZZZZZZZZZZZZZZ" lang="en"/>
+<l:dingbat key="startquote" text="“"/>
+<l:dingbat key="endquote" text="â€"/>
+<l:dingbat key="nestedstartquote" text="‘"/>
+<l:dingbat key="nestedendquote" text="’"/>
+<l:dingbat key="singlestartquote" text="‘" lang="en"/>
+<l:dingbat key="singleendquote" text="’" lang="en"/>
+<l:dingbat key="bullet" text="•"/>
+<l:gentext key="hyphenation-character" text="-" lang="en"/>
+<l:gentext key="hyphenation-push-character-count" text="2" lang="en"/>
+<l:gentext key="hyphenation-remain-character-count" text="2" lang="en"/>
+<l:context name="styles"><l:template name="person-name" text="first-last"/>
+</l:context>
+<l:context name="title"><l:template name="abstract" text="%t"/>
+<l:template name="acknowledgements" text="%t" lang="en"/>
+<l:template name="answer" text="%t"/>
+<l:template name="appendix" text="Isivalo %n. %t"/>
+<l:template name="article" text="%t"/>
+<l:template name="authorblurb" text="%t"/>
+<l:template name="bibliodiv" text="%t"/>
+<l:template name="biblioentry" text="%t"/>
+<l:template name="bibliography" text="%t"/>
+<l:template name="bibliolist" text="%t" lang="en"/>
+<l:template name="bibliomixed" text="%t"/>
+<l:template name="bibliomset" text="%t"/>
+<l:template name="biblioset" text="%t"/>
+<l:template name="blockquote" text="%t"/>
+<l:template name="book" text="%t"/>
+<l:template name="calloutlist" text="%t"/>
+<l:template name="caution" text="%t"/>
+<l:template name="chapter" text="Isiqendu %n. %t"/>
+<l:template name="colophon" text="%t"/>
+<l:template name="dedication" text="%t"/>
+<l:template name="equation" text="Ulinganiselo %n. %t"/>
+<l:template name="example" text="Umzekelo %n. %t"/>
+<l:template name="figure" text="Ulungu %n. %t"/>
+<l:template name="foil" text="%t" lang="en"/>
+<l:template name="foilgroup" text="%t" lang="en"/>
+<l:template name="formalpara" text="%t"/>
+<l:template name="glossary" text="%t"/>
+<l:template name="glossdiv" text="%t"/>
+<l:template name="glosslist" text="%t" lang="en"/>
+<l:template name="glossentry" text="%t" lang="en"/>
+<l:template name="important" text="%t"/>
+<l:template name="index" text="%t"/>
+<l:template name="indexdiv" text="%t"/>
+<l:template name="itemizedlist" text="%t"/>
+<l:template name="legalnotice" text="%t"/>
+<l:template name="listitem" text=""/>
+<l:template name="lot" text="%t"/>
+<l:template name="msg" text="%t"/>
+<l:template name="msgexplan" text="%t"/>
+<l:template name="msgmain" text="%t"/>
+<l:template name="msgrel" text="%t"/>
+<l:template name="msgset" text="%t"/>
+<l:template name="msgsub" text="%t"/>
+<l:template name="note" text="%t"/>
+<l:template name="orderedlist" text="%t"/>
+<l:template name="part" text="Inxenye %n. %t"/>
+<l:template name="partintro" text="%t"/>
+<l:template name="preface" text="%t"/>
+<l:template name="procedure" text="%t"/>
+<l:template name="procedure.formal" text="Inkqubo %n. %t"/>
+<l:template name="productionset" text="%t"/>
+<l:template name="productionset.formal" text="Imveliso %n"/>
+<l:template name="qandadiv" text="%t"/>
+<l:template name="qandaentry" text="%t"/>
+<l:template name="qandaset" text="%t"/>
+<l:template name="question" text="%t"/>
+<l:template name="refentry" text="%t"/>
+<l:template name="reference" text="%t"/>
+<l:template name="refsection" text="%t"/>
+<l:template name="refsect1" text="%t"/>
+<l:template name="refsect2" text="%t"/>
+<l:template name="refsect3" text="%t"/>
+<l:template name="refsynopsisdiv" text="%t"/>
+<l:template name="refsynopsisdivinfo" text="%t"/>
+<l:template name="segmentedlist" text="%t"/>
+<l:template name="set" text="%t"/>
+<l:template name="setindex" text="%t"/>
+<l:template name="sidebar" text="%t"/>
+<l:template name="step" text="%t"/>
+<l:template name="table" text="Indlela Yokwenza Imigca %n. %t"/>
+<l:template name="task" text="%t" lang="en"/>
+<l:template name="tasksummary" text="%t" lang="en"/>
+<l:template name="taskprerequisites" text="%t" lang="en"/>
+<l:template name="taskrelated" text="%t" lang="en"/>
+<l:template name="tip" text="%t"/>
+<l:template name="toc" text="%t"/>
+<l:template name="variablelist" text="%t"/>
+<l:template name="varlistentry" text=""/>
+<l:template name="warning" text="%t"/>
+</l:context>
+<l:context name="title-unnumbered"><l:template name="appendix" text="%t"/>
+<l:template name="article/appendix" text="%t" lang="en"/>
+<l:template name="bridgehead" text="%t"/>
+<l:template name="chapter" text="%t"/>
+<l:template name="sect1" text="%t"/>
+<l:template name="sect2" text="%t"/>
+<l:template name="sect3" text="%t"/>
+<l:template name="sect4" text="%t"/>
+<l:template name="sect5" text="%t"/>
+<l:template name="section" text="%t"/>
+<l:template name="simplesect" text="%t"/>
+<l:template name="part" text="%t" lang="en"/>
+</l:context>
+<l:context name="title-numbered"><l:template name="appendix" text="Isivalo %n. %t"/>
+<l:template name="article/appendix" text="%n. %t" lang="en"/>
+<l:template name="bridgehead" text="%n. %t"/>
+<l:template name="chapter" text="Isiqendu %n. %t"/>
+<l:template name="part" text="Inxenye %n. %t"/>
+<l:template name="sect1" text="%n. %t"/>
+<l:template name="sect2" text="%n. %t"/>
+<l:template name="sect3" text="%n. %t"/>
+<l:template name="sect4" text="%n. %t"/>
+<l:template name="sect5" text="%n. %t"/>
+<l:template name="section" text="%n. %t"/>
+<l:template name="simplesect" text="%t"/>
+</l:context>
+<l:context name="subtitle"><l:template name="appendix" text="%s"/>
+<l:template name="acknowledgements" text="%s" lang="en"/>
+<l:template name="article" text="%s"/>
+<l:template name="bibliodiv" text="%s"/>
+<l:template name="biblioentry" text="%s"/>
+<l:template name="bibliography" text="%s"/>
+<l:template name="bibliomixed" text="%s"/>
+<l:template name="bibliomset" text="%s"/>
+<l:template name="biblioset" text="%s"/>
+<l:template name="book" text="%s"/>
+<l:template name="chapter" text="%s"/>
+<l:template name="colophon" text="%s"/>
+<l:template name="dedication" text="%s"/>
+<l:template name="glossary" text="%s"/>
+<l:template name="glossdiv" text="%s"/>
+<l:template name="index" text="%s"/>
+<l:template name="indexdiv" text="%s"/>
+<l:template name="lot" text="%s"/>
+<l:template name="part" text="%s"/>
+<l:template name="partintro" text="%s"/>
+<l:template name="preface" text="%s"/>
+<l:template name="refentry" text="%s"/>
+<l:template name="reference" text="%s"/>
+<l:template name="refsection" text="%s"/>
+<l:template name="refsect1" text="%s"/>
+<l:template name="refsect2" text="%s"/>
+<l:template name="refsect3" text="%s"/>
+<l:template name="refsynopsisdiv" text="%s"/>
+<l:template name="sect1" text="%s"/>
+<l:template name="sect2" text="%s"/>
+<l:template name="sect3" text="%s"/>
+<l:template name="sect4" text="%s"/>
+<l:template name="sect5" text="%s"/>
+<l:template name="section" text="%s"/>
+<l:template name="set" text="%s"/>
+<l:template name="setindex" text="%s"/>
+<l:template name="sidebar" text="%s"/>
+<l:template name="simplesect" text="%s"/>
+<l:template name="toc" text="%s"/>
+</l:context>
+<l:context name="xref"><l:template name="abstract" text="%t"/>
+<l:template name="acknowledgements" text="%t" lang="en"/>
+<l:template name="answer" text="I: %n"/>
+<l:template name="appendix" text="%t"/>
+<l:template name="article" text="%t"/>
+<l:template name="authorblurb" text="%t"/>
+<l:template name="bibliodiv" text="%t"/>
+<l:template name="bibliography" text="%t"/>
+<l:template name="bibliomset" text="%t"/>
+<l:template name="biblioset" text="%t"/>
+<l:template name="blockquote" text="%t"/>
+<l:template name="book" text="%t"/>
+<l:template name="calloutlist" text="%t"/>
+<l:template name="caution" text="%t"/>
+<l:template name="chapter" text="%t"/>
+<l:template name="colophon" text="%t"/>
+<l:template name="constraintdef" text="%t"/>
+<l:template name="dedication" text="%t"/>
+<l:template name="equation" text="%t"/>
+<l:template name="example" text="%t"/>
+<l:template name="figure" text="%t"/>
+<l:template name="foil" text="%t" lang="en"/>
+<l:template name="foilgroup" text="%t" lang="en"/>
+<l:template name="formalpara" text="%t"/>
+<l:template name="glossary" text="%t"/>
+<l:template name="glossdiv" text="%t"/>
+<l:template name="important" text="%t"/>
+<l:template name="index" text="%t"/>
+<l:template name="indexdiv" text="%t"/>
+<l:template name="itemizedlist" text="%t"/>
+<l:template name="legalnotice" text="%t"/>
+<l:template name="listitem" text="%n"/>
+<l:template name="lot" text="%t"/>
+<l:template name="msg" text="%t"/>
+<l:template name="msgexplan" text="%t"/>
+<l:template name="msgmain" text="%t"/>
+<l:template name="msgrel" text="%t"/>
+<l:template name="msgset" text="%t"/>
+<l:template name="msgsub" text="%t"/>
+<l:template name="note" text="%t"/>
+<l:template name="orderedlist" text="%t"/>
+<l:template name="part" text="%t"/>
+<l:template name="partintro" text="%t"/>
+<l:template name="preface" text="%t"/>
+<l:template name="procedure" text="%t"/>
+<l:template name="productionset" text="%t"/>
+<l:template name="qandadiv" text="%t"/>
+<l:template name="qandaentry" text="U: %n"/>
+<l:template name="qandaset" text="%t"/>
+<l:template name="question" text="U: %n"/>
+<l:template name="reference" text="%t"/>
+<l:template name="refsynopsisdiv" text="%t"/>
+<l:template name="segmentedlist" text="%t"/>
+<l:template name="set" text="%t"/>
+<l:template name="setindex" text="%t"/>
+<l:template name="sidebar" text="%t"/>
+<l:template name="table" text="%t"/>
+<l:template name="task" text="%t" lang="en"/>
+<l:template name="tip" text="%t"/>
+<l:template name="toc" text="%t"/>
+<l:template name="variablelist" text="%t"/>
+<l:template name="varlistentry" text="%n"/>
+<l:template name="warning" text="%t"/>
+<l:template name="olink.document.citation" text=" in %o" lang="en"/>
+<l:template name="olink.page.citation" text=" (page %p)" lang="en"/>
+<l:template name="page.citation" text=" [%p]"/>
+<l:template name="page" text="(page %p)" lang="en"/>
+<l:template name="docname" text=" in %o" lang="en"/>
+<l:template name="docnamelong" text=" in the document titled %o" lang="en"/>
+<l:template name="pageabbrev" text="(p. %p)" lang="en"/>
+<l:template name="Page" text="Page %p" lang="en"/>
+<l:template name="bridgehead" text="icandelo libizwa ngokuba “%tâ€"/>
+<l:template name="refsection" text="icandelo libizwa ngokuba “%tâ€"/>
+<l:template name="refsect1" text="icandelo libizwa ngokuba “%tâ€"/>
+<l:template name="refsect2" text="icandelo libizwa ngokuba “%tâ€"/>
+<l:template name="refsect3" text="icandelo libizwa ngokuba “%tâ€"/>
+<l:template name="sect1" text="icandelo libizwa ngokuba “%tâ€"/>
+<l:template name="sect2" text="icandelo libizwa ngokuba “%tâ€"/>
+<l:template name="sect3" text="icandelo libizwa ngokuba “%tâ€"/>
+<l:template name="sect4" text="icandelo libizwa ngokuba “%tâ€"/>
+<l:template name="sect5" text="icandelo libizwa ngokuba “%tâ€"/>
+<l:template name="section" text="icandelo libizwa ngokuba “%tâ€"/>
+<l:template name="simplesect" text="icandelo libizwa ngokuba “%tâ€"/>
+</l:context>
+<l:context name="xref-number"><l:template name="answer" text="I: %n"/>
+<l:template name="appendix" text="Isivalo %n"/>
+<l:template name="bridgehead" text="Icandelo %n"/>
+<l:template name="chapter" text="Isiqendu %n"/>
+<l:template name="equation" text="Ulinganiselo %n"/>
+<l:template name="example" text="Umzekelo %n"/>
+<l:template name="figure" text="Ulungu %n"/>
+<l:template name="part" text="Inxenye %n"/>
+<l:template name="procedure" text="Inkqubo %n"/>
+<l:template name="productionset" text="Imveliso %n"/>
+<l:template name="qandadiv" text="U no I %n"/>
+<l:template name="qandaentry" text="U: %n"/>
+<l:template name="question" text="U: %n"/>
+<l:template name="sect1" text="Icandelo %n"/>
+<l:template name="sect2" text="Icandelo %n"/>
+<l:template name="sect3" text="Icandelo %n"/>
+<l:template name="sect4" text="Icandelo %n"/>
+<l:template name="sect5" text="Icandelo %n"/>
+<l:template name="section" text="Icandelo %n"/>
+<l:template name="table" text="Indlela Yokwenza Imigca %n"/>
+</l:context>
+<l:context name="xref-number-and-title"><l:template name="appendix" text="Isivalo %n, %t"/>
+<l:template name="bridgehead" text="Icandelo %n, “%tâ€"/>
+<l:template name="chapter" text="Isiqendu %n, %t"/>
+<l:template name="equation" text="Ulinganiselo %n, “%tâ€"/>
+<l:template name="example" text="Umzekelo %n, “%tâ€"/>
+<l:template name="figure" text="Ulungu %n, “%tâ€"/>
+<l:template name="part" text="Inxenye %n, “%tâ€"/>
+<l:template name="procedure" text="Inkqubo %n, “%tâ€"/>
+<l:template name="productionset" text="Imveliso %n, “%tâ€"/>
+<l:template name="qandadiv" text="U no I %n, “%tâ€"/>
+<l:template name="refsect1" text="icandelo libizwa ngokuba “%tâ€"/>
+<l:template name="refsect2" text="icandelo libizwa ngokuba “%tâ€"/>
+<l:template name="refsect3" text="icandelo libizwa ngokuba “%tâ€"/>
+<l:template name="refsection" text="icandelo libizwa ngokuba “%tâ€"/>
+<l:template name="sect1" text="Icandelo %n, “%tâ€"/>
+<l:template name="sect2" text="Icandelo %n, “%tâ€"/>
+<l:template name="sect3" text="Icandelo %n, “%tâ€"/>
+<l:template name="sect4" text="Icandelo %n, “%tâ€"/>
+<l:template name="sect5" text="Icandelo %n, “%tâ€"/>
+<l:template name="section" text="Icandelo %n, “%tâ€"/>
+<l:template name="simplesect" text="icandelo libizwa ngokuba “%tâ€"/>
+<l:template name="table" text="Indlela Yokwenza Imigca %n, “%tâ€"/>
+</l:context>
+<l:context name="authorgroup"><l:template name="sep" text=" no "/>
+<l:template name="sep2" text=" no "/>
+<l:template name="seplast" text=" no "/>
+</l:context>
+<l:context name="glossary"><l:template name="see" text="Bona %t."/>
+<l:template name="seealso" text="Bona Kwakhona %t."/>
+<l:template name="seealso-separator" text=", "/>
+</l:context>
+<l:context name="msgset"><l:template name="MsgAud" text="Ababhali: "/>
+<l:template name="MsgLevel" text="Umphakamo: "/>
+<l:template name="MsgOrig" text="Uqobo: "/>
+</l:context>
+<l:context name="datetime"><l:template name="format" text="m/d/Y" lang="en"/>
+</l:context>
+<l:context name="termdef"><l:template name="prefix" text="[Definition: " lang="en"/>
+<l:template name="suffix" text="]" lang="en"/>
+</l:context>
+<l:context name="datetime-full"><l:template name="January" text="January" lang="en"/>
+<l:template name="February" text="February" lang="en"/>
+<l:template name="March" text="March" lang="en"/>
+<l:template name="April" text="April" lang="en"/>
+<l:template name="May" text="May" lang="en"/>
+<l:template name="June" text="June" lang="en"/>
+<l:template name="July" text="July" lang="en"/>
+<l:template name="August" text="August" lang="en"/>
+<l:template name="September" text="September" lang="en"/>
+<l:template name="October" text="October" lang="en"/>
+<l:template name="November" text="November" lang="en"/>
+<l:template name="December" text="December" lang="en"/>
+<l:template name="Monday" text="Monday" lang="en"/>
+<l:template name="Tuesday" text="Tuesday" lang="en"/>
+<l:template name="Wednesday" text="Wednesday" lang="en"/>
+<l:template name="Thursday" text="Thursday" lang="en"/>
+<l:template name="Friday" text="Friday" lang="en"/>
+<l:template name="Saturday" text="Saturday" lang="en"/>
+<l:template name="Sunday" text="Sunday" lang="en"/>
+</l:context>
+<l:context name="datetime-abbrev"><l:template name="Jan" text="Jan" lang="en"/>
+<l:template name="Feb" text="Feb" lang="en"/>
+<l:template name="Mar" text="Mar" lang="en"/>
+<l:template name="Apr" text="Apr" lang="en"/>
+<l:template name="May" text="May" lang="en"/>
+<l:template name="Jun" text="Jun" lang="en"/>
+<l:template name="Jul" text="Jul" lang="en"/>
+<l:template name="Aug" text="Aug" lang="en"/>
+<l:template name="Sep" text="Sep" lang="en"/>
+<l:template name="Oct" text="Oct" lang="en"/>
+<l:template name="Nov" text="Nov" lang="en"/>
+<l:template name="Dec" text="Dec" lang="en"/>
+<l:template name="Mon" text="Mon" lang="en"/>
+<l:template name="Tue" text="Tue" lang="en"/>
+<l:template name="Wed" text="Wed" lang="en"/>
+<l:template name="Thu" text="Thu" lang="en"/>
+<l:template name="Fri" text="Fri" lang="en"/>
+<l:template name="Sat" text="Sat" lang="en"/>
+<l:template name="Sun" text="Sun" lang="en"/>
+</l:context>
+<l:context name="htmlhelp"><l:template name="langcode" text="0x0434 Xhosa"/>
+</l:context>
+<l:context name="index"><l:template name="term-separator" text=", " lang="en"/>
+<l:template name="number-separator" text=", " lang="en"/>
+<l:template name="range-separator" text="-" lang="en"/>
+</l:context>
+<l:context name="iso690"><l:template name="lastfirst.sep" text=", " lang="en"/>
+<l:template name="alt.person.two.sep" text=" – " lang="en"/>
+<l:template name="alt.person.last.sep" text=" – " lang="en"/>
+<l:template name="alt.person.more.sep" text=" – " lang="en"/>
+<l:template name="primary.editor" text=" (ed.)" lang="en"/>
+<l:template name="primary.many" text=", et al." lang="en"/>
+<l:template name="primary.sep" text=". " lang="en"/>
+<l:template name="submaintitle.sep" text=": " lang="en"/>
+<l:template name="title.sep" text=". " lang="en"/>
+<l:template name="othertitle.sep" text=", " lang="en"/>
+<l:template name="medium1" text=" [" lang="en"/>
+<l:template name="medium2" text="]" lang="en"/>
+<l:template name="secondary.person.sep" text="; " lang="en"/>
+<l:template name="secondary.sep" text=". " lang="en"/>
+<l:template name="respons.sep" text=". " lang="en"/>
+<l:template name="edition.sep" text=". " lang="en"/>
+<l:template name="edition.serial.sep" text=", " lang="en"/>
+<l:template name="issuing.range" text="-" lang="en"/>
+<l:template name="issuing.div" text=", " lang="en"/>
+<l:template name="issuing.sep" text=". " lang="en"/>
+<l:template name="partnr.sep" text=". " lang="en"/>
+<l:template name="placepubl.sep" text=": " lang="en"/>
+<l:template name="publyear.sep" text=", " lang="en"/>
+<l:template name="pubinfo.sep" text=". " lang="en"/>
+<l:template name="spec.pubinfo.sep" text=", " lang="en"/>
+<l:template name="upd.sep" text=", " lang="en"/>
+<l:template name="datecit1" text=" [cited " lang="en"/>
+<l:template name="datecit2" text="]" lang="en"/>
+<l:template name="extent.sep" text=". " lang="en"/>
+<l:template name="locs.sep" text=", " lang="en"/>
+<l:template name="location.sep" text=". " lang="en"/>
+<l:template name="serie.sep" text=". " lang="en"/>
+<l:template name="notice.sep" text=". " lang="en"/>
+<l:template name="access" text="Available " lang="en"/>
+<l:template name="acctoo" text="Also available " lang="en"/>
+<l:template name="onwww" text="from World Wide Web" lang="en"/>
+<l:template name="oninet" text="from Internet" lang="en"/>
+<l:template name="access.end" text=": " lang="en"/>
+<l:template name="link1" text="&lt;" lang="en"/>
+<l:template name="link2" text="&gt;" lang="en"/>
+<l:template name="access.sep" text=". " lang="en"/>
+<l:template name="isbn" text="ISBN " lang="en"/>
+<l:template name="issn" text="ISSN " lang="en"/>
+<l:template name="stdnum.sep" text=". " lang="en"/>
+<l:template name="patcountry.sep" text=". " lang="en"/>
+<l:template name="pattype.sep" text=", " lang="en"/>
+<l:template name="patnum.sep" text=". " lang="en"/>
+<l:template name="patdate.sep" text=". " lang="en"/>
+</l:context><l:letters lang="en"><l:l i="-1"/>
+<l:l i="0">Symbols</l:l>
+<l:l i="10">A</l:l>
+<l:l i="10">a</l:l>
+<l:l i="10">À</l:l>
+<l:l i="10">à</l:l>
+<l:l i="10">Ã</l:l>
+<l:l i="10">á</l:l>
+<l:l i="10">Â</l:l>
+<l:l i="10">â</l:l>
+<l:l i="10">Ã</l:l>
+<l:l i="10">ã</l:l>
+<l:l i="10">Ä</l:l>
+<l:l i="10">ä</l:l>
+<l:l i="10">Ã…</l:l>
+<l:l i="10">Ã¥</l:l>
+<l:l i="10">Ä€</l:l>
+<l:l i="10">Ä</l:l>
+<l:l i="10">Ä‚</l:l>
+<l:l i="10">ă</l:l>
+<l:l i="10">Ä„</l:l>
+<l:l i="10">Ä…</l:l>
+<l:l i="10">Ç</l:l>
+<l:l i="10">ÇŽ</l:l>
+<l:l i="10">Çž</l:l>
+<l:l i="10">ÇŸ</l:l>
+<l:l i="10">Ç </l:l>
+<l:l i="10">Ç¡</l:l>
+<l:l i="10">Ǻ</l:l>
+<l:l i="10">Ç»</l:l>
+<l:l i="10">È€</l:l>
+<l:l i="10">È</l:l>
+<l:l i="10">È‚</l:l>
+<l:l i="10">ȃ</l:l>
+<l:l i="10">Ȧ</l:l>
+<l:l i="10">ȧ</l:l>
+<l:l i="10">Ḁ</l:l>
+<l:l i="10">á¸</l:l>
+<l:l i="10">ẚ</l:l>
+<l:l i="10">Ạ</l:l>
+<l:l i="10">ạ</l:l>
+<l:l i="10">Ả</l:l>
+<l:l i="10">ả</l:l>
+<l:l i="10">Ấ</l:l>
+<l:l i="10">ấ</l:l>
+<l:l i="10">Ầ</l:l>
+<l:l i="10">ầ</l:l>
+<l:l i="10">Ẩ</l:l>
+<l:l i="10">ẩ</l:l>
+<l:l i="10">Ẫ</l:l>
+<l:l i="10">ẫ</l:l>
+<l:l i="10">Ậ</l:l>
+<l:l i="10">ậ</l:l>
+<l:l i="10">Ắ</l:l>
+<l:l i="10">ắ</l:l>
+<l:l i="10">Ằ</l:l>
+<l:l i="10">ằ</l:l>
+<l:l i="10">Ẳ</l:l>
+<l:l i="10">ẳ</l:l>
+<l:l i="10">Ẵ</l:l>
+<l:l i="10">ẵ</l:l>
+<l:l i="10">Ặ</l:l>
+<l:l i="10">ặ</l:l>
+<l:l i="20">B</l:l>
+<l:l i="20">b</l:l>
+<l:l i="20">Æ€</l:l>
+<l:l i="20">Æ</l:l>
+<l:l i="20">É“</l:l>
+<l:l i="20">Æ‚</l:l>
+<l:l i="20">ƃ</l:l>
+<l:l i="20">Ḃ</l:l>
+<l:l i="20">ḃ</l:l>
+<l:l i="20">Ḅ</l:l>
+<l:l i="20">ḅ</l:l>
+<l:l i="20">Ḇ</l:l>
+<l:l i="20">ḇ</l:l>
+<l:l i="30">C</l:l>
+<l:l i="30">c</l:l>
+<l:l i="30">Ç</l:l>
+<l:l i="30">ç</l:l>
+<l:l i="30">Ć</l:l>
+<l:l i="30">ć</l:l>
+<l:l i="30">Ĉ</l:l>
+<l:l i="30">ĉ</l:l>
+<l:l i="30">ÄŠ</l:l>
+<l:l i="30">Ä‹</l:l>
+<l:l i="30">Č</l:l>
+<l:l i="30">Ä</l:l>
+<l:l i="30">Ƈ</l:l>
+<l:l i="30">ƈ</l:l>
+<l:l i="30">É•</l:l>
+<l:l i="30">Ḉ</l:l>
+<l:l i="30">ḉ</l:l>
+<l:l i="40">D</l:l>
+<l:l i="40">d</l:l>
+<l:l i="40">ÄŽ</l:l>
+<l:l i="40">Ä</l:l>
+<l:l i="40">Ä</l:l>
+<l:l i="40">Ä‘</l:l>
+<l:l i="40">ÆŠ</l:l>
+<l:l i="40">É—</l:l>
+<l:l i="40">Æ‹</l:l>
+<l:l i="40">ƌ</l:l>
+<l:l i="40">Ç…</l:l>
+<l:l i="40">Dz</l:l>
+<l:l i="40">È¡</l:l>
+<l:l i="40">É–</l:l>
+<l:l i="40">Ḋ</l:l>
+<l:l i="40">ḋ</l:l>
+<l:l i="40">Ḍ</l:l>
+<l:l i="40">á¸</l:l>
+<l:l i="40">Ḏ</l:l>
+<l:l i="40">á¸</l:l>
+<l:l i="40">á¸</l:l>
+<l:l i="40">ḑ</l:l>
+<l:l i="40">Ḓ</l:l>
+<l:l i="40">ḓ</l:l>
+<l:l i="50">E</l:l>
+<l:l i="50">e</l:l>
+<l:l i="50">È</l:l>
+<l:l i="50">è</l:l>
+<l:l i="50">É</l:l>
+<l:l i="50">é</l:l>
+<l:l i="50">Ê</l:l>
+<l:l i="50">ê</l:l>
+<l:l i="50">Ë</l:l>
+<l:l i="50">ë</l:l>
+<l:l i="50">Ä’</l:l>
+<l:l i="50">Ä“</l:l>
+<l:l i="50">Ä”</l:l>
+<l:l i="50">Ä•</l:l>
+<l:l i="50">Ä–</l:l>
+<l:l i="50">Ä—</l:l>
+<l:l i="50">Ę</l:l>
+<l:l i="50">Ä™</l:l>
+<l:l i="50">Äš</l:l>
+<l:l i="50">Ä›</l:l>
+<l:l i="50">È„</l:l>
+<l:l i="50">È…</l:l>
+<l:l i="50">Ȇ</l:l>
+<l:l i="50">ȇ</l:l>
+<l:l i="50">Ȩ</l:l>
+<l:l i="50">È©</l:l>
+<l:l i="50">Ḕ</l:l>
+<l:l i="50">ḕ</l:l>
+<l:l i="50">Ḗ</l:l>
+<l:l i="50">ḗ</l:l>
+<l:l i="50">Ḙ</l:l>
+<l:l i="50">ḙ</l:l>
+<l:l i="50">Ḛ</l:l>
+<l:l i="50">ḛ</l:l>
+<l:l i="50">Ḝ</l:l>
+<l:l i="50">á¸</l:l>
+<l:l i="50">Ẹ</l:l>
+<l:l i="50">ẹ</l:l>
+<l:l i="50">Ẻ</l:l>
+<l:l i="50">ẻ</l:l>
+<l:l i="50">Ẽ</l:l>
+<l:l i="50">ẽ</l:l>
+<l:l i="50">Ế</l:l>
+<l:l i="50">ế</l:l>
+<l:l i="50">Ề</l:l>
+<l:l i="50">á»</l:l>
+<l:l i="50">Ể</l:l>
+<l:l i="50">ể</l:l>
+<l:l i="50">Ễ</l:l>
+<l:l i="50">á»…</l:l>
+<l:l i="50">Ệ</l:l>
+<l:l i="50">ệ</l:l>
+<l:l i="60">F</l:l>
+<l:l i="60">f</l:l>
+<l:l i="60">Æ‘</l:l>
+<l:l i="60">Æ’</l:l>
+<l:l i="60">Ḟ</l:l>
+<l:l i="60">ḟ</l:l>
+<l:l i="70">G</l:l>
+<l:l i="70">g</l:l>
+<l:l i="70">Ĝ</l:l>
+<l:l i="70">Ä</l:l>
+<l:l i="70">Äž</l:l>
+<l:l i="70">ÄŸ</l:l>
+<l:l i="70">Ä </l:l>
+<l:l i="70">Ä¡</l:l>
+<l:l i="70">Ä¢</l:l>
+<l:l i="70">Ä£</l:l>
+<l:l i="70">Æ“</l:l>
+<l:l i="70">É </l:l>
+<l:l i="70">Ǥ</l:l>
+<l:l i="70">Ç¥</l:l>
+<l:l i="70">Ǧ</l:l>
+<l:l i="70">ǧ</l:l>
+<l:l i="70">Ç´</l:l>
+<l:l i="70">ǵ</l:l>
+<l:l i="70">Ḡ</l:l>
+<l:l i="70">ḡ</l:l>
+<l:l i="80">H</l:l>
+<l:l i="80">h</l:l>
+<l:l i="80">Ĥ</l:l>
+<l:l i="80">Ä¥</l:l>
+<l:l i="80">Ħ</l:l>
+<l:l i="80">ħ</l:l>
+<l:l i="80">Èž</l:l>
+<l:l i="80">ÈŸ</l:l>
+<l:l i="80">ɦ</l:l>
+<l:l i="80">Ḣ</l:l>
+<l:l i="80">ḣ</l:l>
+<l:l i="80">Ḥ</l:l>
+<l:l i="80">ḥ</l:l>
+<l:l i="80">Ḧ</l:l>
+<l:l i="80">ḧ</l:l>
+<l:l i="80">Ḩ</l:l>
+<l:l i="80">ḩ</l:l>
+<l:l i="80">Ḫ</l:l>
+<l:l i="80">ḫ</l:l>
+<l:l i="80">ẖ</l:l>
+<l:l i="90">I</l:l>
+<l:l i="90">i</l:l>
+<l:l i="90">Ì</l:l>
+<l:l i="90">ì</l:l>
+<l:l i="90">Ã</l:l>
+<l:l i="90">í</l:l>
+<l:l i="90">ÃŽ</l:l>
+<l:l i="90">î</l:l>
+<l:l i="90">Ã</l:l>
+<l:l i="90">ï</l:l>
+<l:l i="90">Ĩ</l:l>
+<l:l i="90">Ä©</l:l>
+<l:l i="90">Ī</l:l>
+<l:l i="90">Ä«</l:l>
+<l:l i="90">Ĭ</l:l>
+<l:l i="90">Ä­</l:l>
+<l:l i="90">Ä®</l:l>
+<l:l i="90">į</l:l>
+<l:l i="90">Ä°</l:l>
+<l:l i="90">Æ—</l:l>
+<l:l i="90">ɨ</l:l>
+<l:l i="90">Ç</l:l>
+<l:l i="90">Ç</l:l>
+<l:l i="90">Ȉ</l:l>
+<l:l i="90">ȉ</l:l>
+<l:l i="90">ÈŠ</l:l>
+<l:l i="90">È‹</l:l>
+<l:l i="90">Ḭ</l:l>
+<l:l i="90">ḭ</l:l>
+<l:l i="90">Ḯ</l:l>
+<l:l i="90">ḯ</l:l>
+<l:l i="90">Ỉ</l:l>
+<l:l i="90">ỉ</l:l>
+<l:l i="90">Ị</l:l>
+<l:l i="90">ị</l:l>
+<l:l i="100">J</l:l>
+<l:l i="100">j</l:l>
+<l:l i="100">Ä´</l:l>
+<l:l i="100">ĵ</l:l>
+<l:l i="100">Ç°</l:l>
+<l:l i="100">Ê</l:l>
+<l:l i="110">K</l:l>
+<l:l i="110">k</l:l>
+<l:l i="110">Ķ</l:l>
+<l:l i="110">Ä·</l:l>
+<l:l i="110">Ƙ</l:l>
+<l:l i="110">Æ™</l:l>
+<l:l i="110">Ǩ</l:l>
+<l:l i="110">Ç©</l:l>
+<l:l i="110">Ḱ</l:l>
+<l:l i="110">ḱ</l:l>
+<l:l i="110">Ḳ</l:l>
+<l:l i="110">ḳ</l:l>
+<l:l i="110">Ḵ</l:l>
+<l:l i="110">ḵ</l:l>
+<l:l i="120">L</l:l>
+<l:l i="120">l</l:l>
+<l:l i="120">Ĺ</l:l>
+<l:l i="120">ĺ</l:l>
+<l:l i="120">Ä»</l:l>
+<l:l i="120">ļ</l:l>
+<l:l i="120">Ľ</l:l>
+<l:l i="120">ľ</l:l>
+<l:l i="120">Ä¿</l:l>
+<l:l i="120">Å€</l:l>
+<l:l i="120">Å</l:l>
+<l:l i="120">Å‚</l:l>
+<l:l i="120">Æš</l:l>
+<l:l i="120">Lj</l:l>
+<l:l i="120">È´</l:l>
+<l:l i="120">É«</l:l>
+<l:l i="120">ɬ</l:l>
+<l:l i="120">É­</l:l>
+<l:l i="120">Ḷ</l:l>
+<l:l i="120">ḷ</l:l>
+<l:l i="120">Ḹ</l:l>
+<l:l i="120">ḹ</l:l>
+<l:l i="120">Ḻ</l:l>
+<l:l i="120">ḻ</l:l>
+<l:l i="120">Ḽ</l:l>
+<l:l i="120">ḽ</l:l>
+<l:l i="130">M</l:l>
+<l:l i="130">m</l:l>
+<l:l i="130">ɱ</l:l>
+<l:l i="130">Ḿ</l:l>
+<l:l i="130">ḿ</l:l>
+<l:l i="130">á¹€</l:l>
+<l:l i="130">á¹</l:l>
+<l:l i="130">Ṃ</l:l>
+<l:l i="130">ṃ</l:l>
+<l:l i="140">N</l:l>
+<l:l i="140">n</l:l>
+<l:l i="140">Ñ</l:l>
+<l:l i="140">ñ</l:l>
+<l:l i="140">Ń</l:l>
+<l:l i="140">Å„</l:l>
+<l:l i="140">Å…</l:l>
+<l:l i="140">ņ</l:l>
+<l:l i="140">Ň</l:l>
+<l:l i="140">ň</l:l>
+<l:l i="140">Æ</l:l>
+<l:l i="140">ɲ</l:l>
+<l:l i="140">Æž</l:l>
+<l:l i="140">È </l:l>
+<l:l i="140">Ç‹</l:l>
+<l:l i="140">Ǹ</l:l>
+<l:l i="140">ǹ</l:l>
+<l:l i="140">ȵ</l:l>
+<l:l i="140">ɳ</l:l>
+<l:l i="140">Ṅ</l:l>
+<l:l i="140">á¹…</l:l>
+<l:l i="140">Ṇ</l:l>
+<l:l i="140">ṇ</l:l>
+<l:l i="140">Ṉ</l:l>
+<l:l i="140">ṉ</l:l>
+<l:l i="140">Ṋ</l:l>
+<l:l i="140">ṋ</l:l>
+<l:l i="150">O</l:l>
+<l:l i="150">o</l:l>
+<l:l i="150">Ã’</l:l>
+<l:l i="150">ò</l:l>
+<l:l i="150">Ó</l:l>
+<l:l i="150">ó</l:l>
+<l:l i="150">Ô</l:l>
+<l:l i="150">ô</l:l>
+<l:l i="150">Õ</l:l>
+<l:l i="150">õ</l:l>
+<l:l i="150">Ö</l:l>
+<l:l i="150">ö</l:l>
+<l:l i="150">Ø</l:l>
+<l:l i="150">ø</l:l>
+<l:l i="150">Ō</l:l>
+<l:l i="150">Å</l:l>
+<l:l i="150">ÅŽ</l:l>
+<l:l i="150">Å</l:l>
+<l:l i="150">Å</l:l>
+<l:l i="150">Å‘</l:l>
+<l:l i="150">ÆŸ</l:l>
+<l:l i="150">Æ </l:l>
+<l:l i="150">Æ¡</l:l>
+<l:l i="150">Ç‘</l:l>
+<l:l i="150">Ç’</l:l>
+<l:l i="150">Ǫ</l:l>
+<l:l i="150">Ç«</l:l>
+<l:l i="150">Ǭ</l:l>
+<l:l i="150">Ç­</l:l>
+<l:l i="150">Ǿ</l:l>
+<l:l i="150">Ç¿</l:l>
+<l:l i="150">Ȍ</l:l>
+<l:l i="150">È</l:l>
+<l:l i="150">ÈŽ</l:l>
+<l:l i="150">È</l:l>
+<l:l i="150">Ȫ</l:l>
+<l:l i="150">È«</l:l>
+<l:l i="150">Ȭ</l:l>
+<l:l i="150">È­</l:l>
+<l:l i="150">È®</l:l>
+<l:l i="150">ȯ</l:l>
+<l:l i="150">È°</l:l>
+<l:l i="150">ȱ</l:l>
+<l:l i="150">Ṍ</l:l>
+<l:l i="150">á¹</l:l>
+<l:l i="150">Ṏ</l:l>
+<l:l i="150">á¹</l:l>
+<l:l i="150">á¹</l:l>
+<l:l i="150">ṑ</l:l>
+<l:l i="150">á¹’</l:l>
+<l:l i="150">ṓ</l:l>
+<l:l i="150">Ọ</l:l>
+<l:l i="150">á»</l:l>
+<l:l i="150">Ỏ</l:l>
+<l:l i="150">á»</l:l>
+<l:l i="150">á»</l:l>
+<l:l i="150">ố</l:l>
+<l:l i="150">á»’</l:l>
+<l:l i="150">ồ</l:l>
+<l:l i="150">á»”</l:l>
+<l:l i="150">ổ</l:l>
+<l:l i="150">á»–</l:l>
+<l:l i="150">á»—</l:l>
+<l:l i="150">Ộ</l:l>
+<l:l i="150">á»™</l:l>
+<l:l i="150">Ớ</l:l>
+<l:l i="150">á»›</l:l>
+<l:l i="150">Ờ</l:l>
+<l:l i="150">á»</l:l>
+<l:l i="150">Ở</l:l>
+<l:l i="150">ở</l:l>
+<l:l i="150">á» </l:l>
+<l:l i="150">ỡ</l:l>
+<l:l i="150">Ợ</l:l>
+<l:l i="150">ợ</l:l>
+<l:l i="160">P</l:l>
+<l:l i="160">p</l:l>
+<l:l i="160">Ƥ</l:l>
+<l:l i="160">Æ¥</l:l>
+<l:l i="160">á¹”</l:l>
+<l:l i="160">ṕ</l:l>
+<l:l i="160">á¹–</l:l>
+<l:l i="160">á¹—</l:l>
+<l:l i="170">Q</l:l>
+<l:l i="170">q</l:l>
+<l:l i="170">Ê </l:l>
+<l:l i="180">R</l:l>
+<l:l i="180">r</l:l>
+<l:l i="180">Å”</l:l>
+<l:l i="180">Å•</l:l>
+<l:l i="180">Å–</l:l>
+<l:l i="180">Å—</l:l>
+<l:l i="180">Ř</l:l>
+<l:l i="180">Å™</l:l>
+<l:l i="180">È</l:l>
+<l:l i="180">È‘</l:l>
+<l:l i="180">È’</l:l>
+<l:l i="180">È“</l:l>
+<l:l i="180">ɼ</l:l>
+<l:l i="180">ɽ</l:l>
+<l:l i="180">ɾ</l:l>
+<l:l i="180">Ṙ</l:l>
+<l:l i="180">á¹™</l:l>
+<l:l i="180">Ṛ</l:l>
+<l:l i="180">á¹›</l:l>
+<l:l i="180">Ṝ</l:l>
+<l:l i="180">á¹</l:l>
+<l:l i="180">Ṟ</l:l>
+<l:l i="180">ṟ</l:l>
+<l:l i="190">S</l:l>
+<l:l i="190">s</l:l>
+<l:l i="190">Åš</l:l>
+<l:l i="190">Å›</l:l>
+<l:l i="190">Ŝ</l:l>
+<l:l i="190">Å</l:l>
+<l:l i="190">Åž</l:l>
+<l:l i="190">ÅŸ</l:l>
+<l:l i="190">Å </l:l>
+<l:l i="190">Å¡</l:l>
+<l:l i="190">Ș</l:l>
+<l:l i="190">È™</l:l>
+<l:l i="190">Ê‚</l:l>
+<l:l i="190">á¹ </l:l>
+<l:l i="190">ṡ</l:l>
+<l:l i="190">á¹¢</l:l>
+<l:l i="190">á¹£</l:l>
+<l:l i="190">Ṥ</l:l>
+<l:l i="190">á¹¥</l:l>
+<l:l i="190">Ṧ</l:l>
+<l:l i="190">ṧ</l:l>
+<l:l i="190">Ṩ</l:l>
+<l:l i="190">ṩ</l:l>
+<l:l i="200">T</l:l>
+<l:l i="200">t</l:l>
+<l:l i="200">Å¢</l:l>
+<l:l i="200">Å£</l:l>
+<l:l i="200">Ť</l:l>
+<l:l i="200">Å¥</l:l>
+<l:l i="200">Ŧ</l:l>
+<l:l i="200">ŧ</l:l>
+<l:l i="200">Æ«</l:l>
+<l:l i="200">Ƭ</l:l>
+<l:l i="200">Æ­</l:l>
+<l:l i="200">Æ®</l:l>
+<l:l i="200">ʈ</l:l>
+<l:l i="200">Èš</l:l>
+<l:l i="200">È›</l:l>
+<l:l i="200">ȶ</l:l>
+<l:l i="200">Ṫ</l:l>
+<l:l i="200">ṫ</l:l>
+<l:l i="200">Ṭ</l:l>
+<l:l i="200">á¹­</l:l>
+<l:l i="200">á¹®</l:l>
+<l:l i="200">ṯ</l:l>
+<l:l i="200">á¹°</l:l>
+<l:l i="200">á¹±</l:l>
+<l:l i="200">ẗ</l:l>
+<l:l i="210">U</l:l>
+<l:l i="210">u</l:l>
+<l:l i="210">Ù</l:l>
+<l:l i="210">ù</l:l>
+<l:l i="210">Ú</l:l>
+<l:l i="210">ú</l:l>
+<l:l i="210">Û</l:l>
+<l:l i="210">û</l:l>
+<l:l i="210">Ü</l:l>
+<l:l i="210">ü</l:l>
+<l:l i="210">Ũ</l:l>
+<l:l i="210">Å©</l:l>
+<l:l i="210">Ū</l:l>
+<l:l i="210">Å«</l:l>
+<l:l i="210">Ŭ</l:l>
+<l:l i="210">Å­</l:l>
+<l:l i="210">Å®</l:l>
+<l:l i="210">ů</l:l>
+<l:l i="210">Å°</l:l>
+<l:l i="210">ű</l:l>
+<l:l i="210">Ų</l:l>
+<l:l i="210">ų</l:l>
+<l:l i="210">Ư</l:l>
+<l:l i="210">Æ°</l:l>
+<l:l i="210">Ç“</l:l>
+<l:l i="210">Ç”</l:l>
+<l:l i="210">Ç•</l:l>
+<l:l i="210">Ç–</l:l>
+<l:l i="210">Ç—</l:l>
+<l:l i="210">ǘ</l:l>
+<l:l i="210">Ç™</l:l>
+<l:l i="210">Çš</l:l>
+<l:l i="210">Ç›</l:l>
+<l:l i="210">ǜ</l:l>
+<l:l i="210">È”</l:l>
+<l:l i="210">È•</l:l>
+<l:l i="210">È–</l:l>
+<l:l i="210">È—</l:l>
+<l:l i="210">á¹²</l:l>
+<l:l i="210">á¹³</l:l>
+<l:l i="210">á¹´</l:l>
+<l:l i="210">á¹µ</l:l>
+<l:l i="210">Ṷ</l:l>
+<l:l i="210">á¹·</l:l>
+<l:l i="210">Ṹ</l:l>
+<l:l i="210">á¹¹</l:l>
+<l:l i="210">Ṻ</l:l>
+<l:l i="210">á¹»</l:l>
+<l:l i="210">Ụ</l:l>
+<l:l i="210">ụ</l:l>
+<l:l i="210">Ủ</l:l>
+<l:l i="210">ủ</l:l>
+<l:l i="210">Ứ</l:l>
+<l:l i="210">ứ</l:l>
+<l:l i="210">Ừ</l:l>
+<l:l i="210">ừ</l:l>
+<l:l i="210">Ử</l:l>
+<l:l i="210">á»­</l:l>
+<l:l i="210">á»®</l:l>
+<l:l i="210">ữ</l:l>
+<l:l i="210">á»°</l:l>
+<l:l i="210">á»±</l:l>
+<l:l i="220">V</l:l>
+<l:l i="220">v</l:l>
+<l:l i="220">Ʋ</l:l>
+<l:l i="220">Ê‹</l:l>
+<l:l i="220">á¹¼</l:l>
+<l:l i="220">á¹½</l:l>
+<l:l i="220">á¹¾</l:l>
+<l:l i="220">ṿ</l:l>
+<l:l i="230">W</l:l>
+<l:l i="230">w</l:l>
+<l:l i="230">Å´</l:l>
+<l:l i="230">ŵ</l:l>
+<l:l i="230">Ẁ</l:l>
+<l:l i="230">áº</l:l>
+<l:l i="230">Ẃ</l:l>
+<l:l i="230">ẃ</l:l>
+<l:l i="230">Ẅ</l:l>
+<l:l i="230">ẅ</l:l>
+<l:l i="230">Ẇ</l:l>
+<l:l i="230">ẇ</l:l>
+<l:l i="230">Ẉ</l:l>
+<l:l i="230">ẉ</l:l>
+<l:l i="230">ẘ</l:l>
+<l:l i="240">X</l:l>
+<l:l i="240">x</l:l>
+<l:l i="240">Ẋ</l:l>
+<l:l i="240">ẋ</l:l>
+<l:l i="240">Ẍ</l:l>
+<l:l i="240">áº</l:l>
+<l:l i="250">Y</l:l>
+<l:l i="250">y</l:l>
+<l:l i="250">Ã</l:l>
+<l:l i="250">ý</l:l>
+<l:l i="250">ÿ</l:l>
+<l:l i="250">Ÿ</l:l>
+<l:l i="250">Ŷ</l:l>
+<l:l i="250">Å·</l:l>
+<l:l i="250">Ƴ</l:l>
+<l:l i="250">Æ´</l:l>
+<l:l i="250">Ȳ</l:l>
+<l:l i="250">ȳ</l:l>
+<l:l i="250">Ẏ</l:l>
+<l:l i="250">áº</l:l>
+<l:l i="250">ẙ</l:l>
+<l:l i="250">Ỳ</l:l>
+<l:l i="250">ỳ</l:l>
+<l:l i="250">á»´</l:l>
+<l:l i="250">ỵ</l:l>
+<l:l i="250">Ỷ</l:l>
+<l:l i="250">á»·</l:l>
+<l:l i="250">Ỹ</l:l>
+<l:l i="250">ỹ</l:l>
+<l:l i="260">Z</l:l>
+<l:l i="260">z</l:l>
+<l:l i="260">Ź</l:l>
+<l:l i="260">ź</l:l>
+<l:l i="260">Å»</l:l>
+<l:l i="260">ż</l:l>
+<l:l i="260">Ž</l:l>
+<l:l i="260">ž</l:l>
+<l:l i="260">Ƶ</l:l>
+<l:l i="260">ƶ</l:l>
+<l:l i="260">Ȥ</l:l>
+<l:l i="260">È¥</l:l>
+<l:l i="260">Ê</l:l>
+<l:l i="260">Ê‘</l:l>
+<l:l i="260">áº</l:l>
+<l:l i="260">ẑ</l:l>
+<l:l i="260">Ẓ</l:l>
+<l:l i="260">ẓ</l:l>
+<l:l i="260">Ẕ</l:l>
+<l:l i="260">ẕ</l:l>
+</l:letters>
+</l:l10n>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/zh.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/zh.xml
new file mode 100644
index 0000000..d976ed0
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/zh.xml
@@ -0,0 +1,660 @@
+<?xml version="1.0" encoding="utf-8"?>
+<l:l10n xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0" language="zh" english-language-name="Chinese">
+
+<!-- * This file is generated automatically. -->
+<!-- * To submit changes to this file upstream (to the DocBook Project) -->
+<!-- * do not submit an edited version of this file. Instead, submit an -->
+<!-- * edited version of the source file at the following location: -->
+<!-- * -->
+<!-- * https://docbook.svn.sourceforge.net/svnroot/docbook/trunk/gentext/locale/zh.xml -->
+<!-- * -->
+<!-- * E-mail the edited zh.xml source file to: -->
+<!-- * -->
+<!-- * docbook-developers@lists.sourceforge.net -->
+
+<!-- ******************************************************************** -->
+
+<!-- This file is part of the XSL DocBook Stylesheet distribution. -->
+<!-- See ../README or http://docbook.sf.net/release/xsl/current/ for -->
+<!-- copyright and other information. -->
+
+<!-- ******************************************************************** -->
+<!-- In these files, % with a letter is used for a placeholder: -->
+<!-- %t is the current element's title -->
+<!-- %s is the current element's subtitle (if applicable)-->
+<!-- %n is the current element's number label-->
+<!-- %p is the current element's page number (if applicable)-->
+<!-- ******************************************************************** -->
+
+
+<l:gentext key="Abstract" text="摘è¦"/>
+<l:gentext key="abstract" text="摘è¦"/>
+<l:gentext key="Acknowledgements" text="鸣谢"/>
+<l:gentext key="acknowledgements" text="鸣谢"/>
+<l:gentext key="Answer" text="答:"/>
+<l:gentext key="answer" text="答:"/>
+<l:gentext key="Appendix" text="附录"/>
+<l:gentext key="appendix" text="附录"/>
+<l:gentext key="Article" text="文章"/>
+<l:gentext key="article" text="文章"/>
+<l:gentext key="Author" text="作者"/>
+<l:gentext key="Bibliography" text="å‚考书目"/>
+<l:gentext key="bibliography" text="å‚考书目"/>
+<l:gentext key="Book" text="书"/>
+<l:gentext key="book" text="书"/>
+<l:gentext key="CAUTION" text="å°å¿ƒ"/>
+<l:gentext key="Caution" text="å°å¿ƒ"/>
+<l:gentext key="caution" text="å°å¿ƒ"/>
+<l:gentext key="Chapter" text="ç« "/>
+<l:gentext key="chapter" text="ç« "/>
+<l:gentext key="Colophon" text="åŽè®°"/>
+<l:gentext key="colophon" text="åŽè®°"/>
+<l:gentext key="Copyright" text="版æƒ"/>
+<l:gentext key="copyright" text="版æƒ"/>
+<l:gentext key="Dedication" text="题è¯"/>
+<l:gentext key="dedication" text="题è¯"/>
+<l:gentext key="Edition" text="版"/>
+<l:gentext key="edition" text="版"/>
+<l:gentext key="Editor" text="编者"/>
+<l:gentext key="Equation" text="å…¬å¼"/>
+<l:gentext key="equation" text="å…¬å¼"/>
+<l:gentext key="Example" text="例"/>
+<l:gentext key="example" text="例"/>
+<l:gentext key="Figure" text="图"/>
+<l:gentext key="figure" text="图"/>
+<l:gentext key="Glossary" text="术语表"/>
+<l:gentext key="glossary" text="术语表"/>
+<l:gentext key="GlossSee" text="è§"/>
+<l:gentext key="glosssee" text="è§"/>
+<l:gentext key="GlossSeeAlso" text="å‚è§"/>
+<l:gentext key="glossseealso" text="å‚è§"/>
+<l:gentext key="IMPORTANT" text="é‡è¦"/>
+<l:gentext key="important" text="é‡è¦"/>
+<l:gentext key="Important" text="é‡è¦"/>
+<l:gentext key="Index" text="索引"/>
+<l:gentext key="index" text="索引"/>
+<l:gentext key="ISBN" text="ISBN"/>
+<l:gentext key="isbn" text="ISBN"/>
+<l:gentext key="LegalNotice" text="法律通告"/>
+<l:gentext key="legalnotice" text="法律通告"/>
+<l:gentext key="MsgAud" text="å—ä¼—"/>
+<l:gentext key="msgaud" text="å—ä¼—"/>
+<l:gentext key="MsgLevel" text="级别"/>
+<l:gentext key="msglevel" text="级别"/>
+<l:gentext key="MsgOrig" text="出处"/>
+<l:gentext key="msgorig" text="出处"/>
+<l:gentext key="NOTE" text="注æ„"/>
+<l:gentext key="Note" text="注æ„"/>
+<l:gentext key="note" text="注æ„"/>
+<l:gentext key="Part" text="部分"/>
+<l:gentext key="part" text="部分"/>
+<l:gentext key="Preface" text="å‰è¨€"/>
+<l:gentext key="preface" text="å‰è¨€"/>
+<l:gentext key="Procedure" text="过程"/>
+<l:gentext key="procedure" text="过程"/>
+<l:gentext key="ProductionSet" text="产å“"/>
+<l:gentext key="PubDate" text="出版日期"/>
+<l:gentext key="pubdate" text="出版日期"/>
+<l:gentext key="Published" text="出版方"/>
+<l:gentext key="published" text="出版方"/>
+<l:gentext key="Publisher" text="出版者"/>
+<l:gentext key="Qandadiv" text="è´¨ä¿"/>
+<l:gentext key="qandadiv" text="è´¨ä¿"/>
+<l:gentext key="QandASet" text="常è§é—®é¢˜"/>
+<l:gentext key="Question" text="问:"/>
+<l:gentext key="question" text="问:"/>
+<l:gentext key="RefEntry" text=""/>
+<l:gentext key="refentry" text=""/>
+<l:gentext key="Reference" text="å‚考"/>
+<l:gentext key="reference" text="å‚考"/>
+<l:gentext key="References" text="å‚考"/>
+<l:gentext key="RefName" text="å称"/>
+<l:gentext key="refname" text="å称"/>
+<l:gentext key="RefSection" text=""/>
+<l:gentext key="refsection" text=""/>
+<l:gentext key="RefSynopsisDiv" text="大纲"/>
+<l:gentext key="refsynopsisdiv" text="大纲"/>
+<l:gentext key="RevHistory" text="修订历å²"/>
+<l:gentext key="revhistory" text="修订历å²"/>
+<l:gentext key="revision" text="修订"/>
+<l:gentext key="Revision" text="修订"/>
+<l:gentext key="sect1" text="节"/>
+<l:gentext key="sect2" text="节"/>
+<l:gentext key="sect3" text="节"/>
+<l:gentext key="sect4" text="节"/>
+<l:gentext key="sect5" text="节"/>
+<l:gentext key="section" text="节"/>
+<l:gentext key="Section" text="节"/>
+<l:gentext key="see" text="è§"/>
+<l:gentext key="See" text="è§"/>
+<l:gentext key="seealso" text="å‚è§"/>
+<l:gentext key="Seealso" text="å‚è§"/>
+<l:gentext key="SeeAlso" text="å‚è§"/>
+<l:gentext key="set" text="Set"/>
+<l:gentext key="Set" text="Set"/>
+<l:gentext key="setindex" text="Set Index"/>
+<l:gentext key="SetIndex" text="Set Index"/>
+<l:gentext key="Sidebar" text="侧æ "/>
+<l:gentext key="sidebar" text="侧æ "/>
+<l:gentext key="step" text="步骤"/>
+<l:gentext key="Step" text="步骤"/>
+<l:gentext key="table" text="表"/>
+<l:gentext key="Table" text="表"/>
+<l:gentext key="task" text="任务"/>
+<l:gentext key="Task" text="任务"/>
+<l:gentext key="tip" text="æ示"/>
+<l:gentext key="TIP" text="æ示"/>
+<l:gentext key="Tip" text="æ示"/>
+<l:gentext key="Warning" text="警告"/>
+<l:gentext key="warning" text="警告"/>
+<l:gentext key="WARNING" text="警告"/>
+<l:gentext key="and" text="和"/>
+<l:gentext key="by" text="ç”±"/>
+<l:gentext key="Edited" text="编辑时间"/>
+<l:gentext key="edited" text="编辑时间"/>
+<l:gentext key="Editedby" text="编辑"/>
+<l:gentext key="editedby" text="编辑"/>
+<l:gentext key="in" text="于"/>
+<l:gentext key="lastlistcomma" text=""/>
+<l:gentext key="listcomma" text="ã€"/>
+<l:gentext key="notes" text="备注"/>
+<l:gentext key="Notes" text="备注"/>
+<l:gentext key="Pgs" text="页"/>
+<l:gentext key="pgs" text="页"/>
+<l:gentext key="Revisedby" text="修订者:"/>
+<l:gentext key="revisedby" text="修订者:"/>
+<l:gentext key="TableNotes" text="表注"/>
+<l:gentext key="tablenotes" text="表注"/>
+<l:gentext key="TableofContents" text="目录"/>
+<l:gentext key="tableofcontents" text="目录"/>
+<l:gentext key="unexpectedelementname" text="未预期的å称"/>
+<l:gentext key="unsupported" text="ä¸æ”¯æŒ"/>
+<l:gentext key="xrefto" text="xref to"/>
+<l:gentext key="Authors" text="作者"/>
+<l:gentext key="copyeditor" text="版æƒç¼–辑"/>
+<l:gentext key="graphicdesigner" text="美术编辑"/>
+<l:gentext key="productioneditor" text="产å“编辑"/>
+<l:gentext key="technicaleditor" text="技术编辑"/>
+<l:gentext key="translator" text="译者"/>
+<l:gentext key="listofequations" text="å…¬å¼æ¸…å•"/>
+<l:gentext key="ListofEquations" text="å…¬å¼æ¸…å•"/>
+<l:gentext key="ListofExamples" text="范例清å•"/>
+<l:gentext key="listofexamples" text="范例清å•"/>
+<l:gentext key="ListofFigures" text="æ’图清å•"/>
+<l:gentext key="listoffigures" text="æ’图清å•"/>
+<l:gentext key="ListofProcedures" text="过程清å•"/>
+<l:gentext key="listofprocedures" text="过程清å•"/>
+<l:gentext key="listoftables" text="表格清å•"/>
+<l:gentext key="ListofTables" text="表格清å•"/>
+<l:gentext key="ListofUnknown" text="未知清å•"/>
+<l:gentext key="listofunknown" text="未知清å•"/>
+<l:gentext key="nav-home" text="起始页"/>
+<l:gentext key="nav-next" text="下一页"/>
+<l:gentext key="nav-next-sibling" text="å¿«è¿›"/>
+<l:gentext key="nav-prev" text="上一页"/>
+<l:gentext key="nav-prev-sibling" text="快退"/>
+<l:gentext key="nav-up" text="上一级"/>
+<l:gentext key="nav-toc" text="目录"/>
+<l:gentext key="Draft" text="è‰ç¨¿"/>
+<l:gentext key="above" text="以上"/>
+<l:gentext key="below" text="以下"/>
+<l:gentext key="sectioncalled" text="一节"/>
+<l:gentext key="index symbols" text="符å·"/>
+<l:gentext key="writing-mode" text="lr-tb"/>
+<l:gentext key="lowercase.alpha" text="abcdefghijklmnopqrstuvwxyz"/>
+<l:gentext key="uppercase.alpha" text="ABCDEFGHIJKLMNOPQRSTUVWXYZ"/>
+<l:gentext key="normalize.sort.input" text="abcdefghijklmnopqrstuvwxyz"/>
+<l:gentext key="normalize.sort.output" text="ABCDEFGHIJKLMNOPQRSTUVWXYZ"/>
+<l:dingbat key="startquote" text="“"/>
+<l:dingbat key="endquote" text="â€"/>
+<l:dingbat key="nestedstartquote" text="‘"/>
+<l:dingbat key="nestedendquote" text="’"/>
+<l:dingbat key="singlestartquote" text="‘"/>
+<l:dingbat key="singleendquote" text="’"/>
+<l:dingbat key="bullet" text="·"/>
+<l:gentext key="hyphenation-character" text="-"/>
+<l:gentext key="hyphenation-push-character-count" text="2"/>
+<l:gentext key="hyphenation-remain-character-count" text="2"/>
+<l:context name="styles"><l:template name="person-name" text="first-last"/>
+</l:context>
+<l:context name="title"><l:template name="abstract" text="%t"/>
+<l:template name="acknowledgements" text="%t"/>
+<l:template name="answer" text="%t"/>
+<l:template name="appendix" text="附录 %n. %t"/>
+<l:template name="article" text="%t"/>
+<l:template name="authorblurb" text="%t"/>
+<l:template name="bibliodiv" text="%t"/>
+<l:template name="biblioentry" text="%t"/>
+<l:template name="bibliography" text="%t"/>
+<l:template name="bibliolist" text="%t"/>
+<l:template name="bibliomixed" text="%t"/>
+<l:template name="bibliomset" text="%t"/>
+<l:template name="biblioset" text="%t"/>
+<l:template name="blockquote" text="%t"/>
+<l:template name="book" text="%t"/>
+<l:template name="calloutlist" text="%t"/>
+<l:template name="caution" text="%t"/>
+<l:template name="chapter" text="第 %n 章 %t"/>
+<l:template name="colophon" text="%t"/>
+<l:template name="dedication" text="%t"/>
+<l:template name="equation" text="å…¬å¼Â %n. %t"/>
+<l:template name="example" text="例 %n. %t"/>
+<l:template name="figure" text="图 %n. %t"/>
+<l:template name="foil" text="%t"/>
+<l:template name="foilgroup" text="%t"/>
+<l:template name="formalpara" text="%t"/>
+<l:template name="glossary" text="%t"/>
+<l:template name="glossdiv" text="%t"/>
+<l:template name="glosslist" text="%t"/>
+<l:template name="glossentry" text="%t"/>
+<l:template name="important" text="%t"/>
+<l:template name="index" text="%t"/>
+<l:template name="indexdiv" text="%t"/>
+<l:template name="itemizedlist" text="%t"/>
+<l:template name="legalnotice" text="%t"/>
+<l:template name="listitem" text=""/>
+<l:template name="lot" text="%t"/>
+<l:template name="msg" text="%t"/>
+<l:template name="msgexplan" text="%t"/>
+<l:template name="msgmain" text="%t"/>
+<l:template name="msgrel" text="%t"/>
+<l:template name="msgset" text="%t"/>
+<l:template name="msgsub" text="%t"/>
+<l:template name="note" text="%t"/>
+<l:template name="orderedlist" text="%t"/>
+<l:template name="part" text="第 %n 部分 %t"/>
+<l:template name="partintro" text="%t"/>
+<l:template name="preface" text="%t"/>
+<l:template name="procedure" text="%t"/>
+<l:template name="procedure.formal" text="过程 %n. %t"/>
+<l:template name="productionset" text="%t"/>
+<l:template name="productionset.formal" text="产å“ %n"/>
+<l:template name="qandadiv" text="%t"/>
+<l:template name="qandaentry" text="%t"/>
+<l:template name="qandaset" text="%t"/>
+<l:template name="question" text="%t"/>
+<l:template name="refentry" text="%t"/>
+<l:template name="reference" text="%t"/>
+<l:template name="refsection" text="%t"/>
+<l:template name="refsect1" text="%t"/>
+<l:template name="refsect2" text="%t"/>
+<l:template name="refsect3" text="%t"/>
+<l:template name="refsynopsisdiv" text="%t"/>
+<l:template name="refsynopsisdivinfo" text="%t"/>
+<l:template name="segmentedlist" text="%t"/>
+<l:template name="set" text="%t"/>
+<l:template name="setindex" text="%t"/>
+<l:template name="sidebar" text="%t"/>
+<l:template name="step" text="%t"/>
+<l:template name="table" text="表 %n. %t"/>
+<l:template name="task" text="%t"/>
+<l:template name="tasksummary" text="%t"/>
+<l:template name="taskprerequisites" text="%t"/>
+<l:template name="taskrelated" text="%t"/>
+<l:template name="tip" text="%t"/>
+<l:template name="toc" text="%t"/>
+<l:template name="variablelist" text="%t"/>
+<l:template name="varlistentry" text=""/>
+<l:template name="warning" text="%t"/>
+</l:context>
+<l:context name="title-unnumbered"><l:template name="appendix" text="%t"/>
+<l:template name="article/appendix" text="%t"/>
+<l:template name="bridgehead" text="%t"/>
+<l:template name="chapter" text="%t"/>
+<l:template name="sect1" text="%t"/>
+<l:template name="sect2" text="%t"/>
+<l:template name="sect3" text="%t"/>
+<l:template name="sect4" text="%t"/>
+<l:template name="sect5" text="%t"/>
+<l:template name="section" text="%t"/>
+<l:template name="simplesect" text="%t"/>
+<l:template name="part" text="%t"/>
+</l:context>
+<l:context name="title-numbered"><l:template name="appendix" text="附录 %n. %t"/>
+<l:template name="article/appendix" text="%n. %t"/>
+<l:template name="bridgehead" text="%n. %t"/>
+<l:template name="chapter" text="第 %n 章 %t"/>
+<l:template name="part" text="部分 %n. %t"/>
+<l:template name="sect1" text="%n. %t"/>
+<l:template name="sect2" text="%n. %t"/>
+<l:template name="sect3" text="%n. %t"/>
+<l:template name="sect4" text="%n. %t"/>
+<l:template name="sect5" text="%n. %t"/>
+<l:template name="section" text="%n. %t"/>
+<l:template name="simplesect" text="%t"/>
+</l:context>
+<l:context name="subtitle"><l:template name="appendix" text="%s"/>
+<l:template name="acknowledgements" text="%s"/>
+<l:template name="article" text="%s"/>
+<l:template name="bibliodiv" text="%s"/>
+<l:template name="biblioentry" text="%s"/>
+<l:template name="bibliography" text="%s"/>
+<l:template name="bibliomixed" text="%s"/>
+<l:template name="bibliomset" text="%s"/>
+<l:template name="biblioset" text="%s"/>
+<l:template name="book" text="%s"/>
+<l:template name="chapter" text="%s"/>
+<l:template name="colophon" text="%s"/>
+<l:template name="dedication" text="%s"/>
+<l:template name="glossary" text="%s"/>
+<l:template name="glossdiv" text="%s"/>
+<l:template name="index" text="%s"/>
+<l:template name="indexdiv" text="%s"/>
+<l:template name="lot" text="%s"/>
+<l:template name="part" text="%s"/>
+<l:template name="partintro" text="%s"/>
+<l:template name="preface" text="%s"/>
+<l:template name="refentry" text="%s"/>
+<l:template name="reference" text="%s"/>
+<l:template name="refsection" text="%s"/>
+<l:template name="refsect1" text="%s"/>
+<l:template name="refsect2" text="%s"/>
+<l:template name="refsect3" text="%s"/>
+<l:template name="refsynopsisdiv" text="%s"/>
+<l:template name="sect1" text="%s"/>
+<l:template name="sect2" text="%s"/>
+<l:template name="sect3" text="%s"/>
+<l:template name="sect4" text="%s"/>
+<l:template name="sect5" text="%s"/>
+<l:template name="section" text="%s"/>
+<l:template name="set" text="%s"/>
+<l:template name="setindex" text="%s"/>
+<l:template name="sidebar" text="%s"/>
+<l:template name="simplesect" text="%s"/>
+<l:template name="toc" text="%s"/>
+</l:context>
+<l:context name="xref"><l:template name="abstract" text="%t"/>
+<l:template name="acknowledgements" text="%t"/>
+<l:template name="answer" text="答: %n"/>
+<l:template name="appendix" text="%t"/>
+<l:template name="article" text="%t"/>
+<l:template name="authorblurb" text="%t"/>
+<l:template name="bibliodiv" text="%t"/>
+<l:template name="bibliography" text="%t"/>
+<l:template name="bibliomset" text="%t"/>
+<l:template name="biblioset" text="%t"/>
+<l:template name="blockquote" text="%t"/>
+<l:template name="book" text="%t"/>
+<l:template name="calloutlist" text="%t"/>
+<l:template name="caution" text="%t"/>
+<l:template name="chapter" text="%t"/>
+<l:template name="colophon" text="%t"/>
+<l:template name="constraintdef" text="%t"/>
+<l:template name="dedication" text="%t"/>
+<l:template name="equation" text="%t"/>
+<l:template name="example" text="%t"/>
+<l:template name="figure" text="%t"/>
+<l:template name="foil" text="%t"/>
+<l:template name="foilgroup" text="%t"/>
+<l:template name="formalpara" text="%t"/>
+<l:template name="glossary" text="%t"/>
+<l:template name="glossdiv" text="%t"/>
+<l:template name="important" text="%t"/>
+<l:template name="index" text="%t"/>
+<l:template name="indexdiv" text="%t"/>
+<l:template name="itemizedlist" text="%t"/>
+<l:template name="legalnotice" text="%t"/>
+<l:template name="listitem" text="%n"/>
+<l:template name="lot" text="%t"/>
+<l:template name="msg" text="%t"/>
+<l:template name="msgexplan" text="%t"/>
+<l:template name="msgmain" text="%t"/>
+<l:template name="msgrel" text="%t"/>
+<l:template name="msgset" text="%t"/>
+<l:template name="msgsub" text="%t"/>
+<l:template name="note" text="%t"/>
+<l:template name="orderedlist" text="%t"/>
+<l:template name="part" text="%t"/>
+<l:template name="partintro" text="%t"/>
+<l:template name="preface" text="%t"/>
+<l:template name="procedure" text="%t"/>
+<l:template name="productionset" text="%t"/>
+<l:template name="qandadiv" text="%t"/>
+<l:template name="qandaentry" text="问: %n"/>
+<l:template name="qandaset" text="%t"/>
+<l:template name="question" text="问: %n"/>
+<l:template name="reference" text="%t"/>
+<l:template name="refsynopsisdiv" text="%t"/>
+<l:template name="segmentedlist" text="%t"/>
+<l:template name="set" text="%t"/>
+<l:template name="setindex" text="%t"/>
+<l:template name="sidebar" text="%t"/>
+<l:template name="table" text="%t"/>
+<l:template name="task" text="%t"/>
+<l:template name="tip" text="%t"/>
+<l:template name="toc" text="%t"/>
+<l:template name="variablelist" text="%t"/>
+<l:template name="varlistentry" text="%n"/>
+<l:template name="warning" text="%t"/>
+<l:template name="olink.document.citation" text=" in %o"/>
+<l:template name="olink.page.citation" text=" (page %p)"/>
+<l:template name="page.citation" text=" [%p]"/>
+<l:template name="page" text="(第 %p 页)"/>
+<l:template name="docname" text=" 在 %o"/>
+<l:template name="docnamelong" text=" 在文档标题 %o"/>
+<l:template name="pageabbrev" text="(第 %p 页)"/>
+<l:template name="Page" text="第 %p 页"/>
+<l:template name="bridgehead" text="“%tâ€ä¸€èŠ‚"/>
+<l:template name="refsection" text="“%tâ€ä¸€èŠ‚"/>
+<l:template name="refsect1" text="“%tâ€ä¸€èŠ‚"/>
+<l:template name="refsect2" text="“%tâ€ä¸€èŠ‚"/>
+<l:template name="refsect3" text="“%tâ€ä¸€èŠ‚"/>
+<l:template name="sect1" text="“%tâ€ä¸€èŠ‚"/>
+<l:template name="sect2" text="“%tâ€ä¸€èŠ‚"/>
+<l:template name="sect3" text="“%tâ€ä¸€èŠ‚"/>
+<l:template name="sect4" text="“%tâ€ä¸€èŠ‚"/>
+<l:template name="sect5" text="“%tâ€ä¸€èŠ‚"/>
+<l:template name="section" text="“%tâ€ä¸€èŠ‚"/>
+<l:template name="simplesect" text="“%tâ€ä¸€èŠ‚"/>
+</l:context>
+<l:context name="xref-number"><l:template name="answer" text="答: %n"/>
+<l:template name="appendix" text="附录 %n"/>
+<l:template name="bridgehead" text="第 %n 节"/>
+<l:template name="chapter" text="第 %n 章"/>
+<l:template name="equation" text="å…¬å¼Â %n"/>
+<l:template name="example" text="例 %n"/>
+<l:template name="figure" text="图 %n"/>
+<l:template name="part" text="第 %n 部分"/>
+<l:template name="procedure" text="过程 %n"/>
+<l:template name="productionset" text="产å“ %n"/>
+<l:template name="qandadiv" text="è´¨ä¿Â %n"/>
+<l:template name="qandaentry" text="问: %n"/>
+<l:template name="question" text="问: %n"/>
+<l:template name="sect1" text="第 %n 节"/>
+<l:template name="sect2" text="第 %n 节"/>
+<l:template name="sect3" text="第 %n 节"/>
+<l:template name="sect4" text="第 %n 节"/>
+<l:template name="sect5" text="第 %n 节"/>
+<l:template name="section" text="第 %n 节"/>
+<l:template name="table" text="表 %n"/>
+</l:context>
+<l:context name="xref-number-and-title"><l:template name="appendix" text="附录 %n, %t"/>
+<l:template name="bridgehead" text="第 %n 节 “%tâ€"/>
+<l:template name="chapter" text="第 %n 章 %t"/>
+<l:template name="equation" text="å…¬å¼Â %n “%tâ€"/>
+<l:template name="example" text="例 %n “%tâ€"/>
+<l:template name="figure" text="图 %n “%tâ€"/>
+<l:template name="part" text="第 %n 部分 “%tâ€"/>
+<l:template name="procedure" text="过程 %n, “%tâ€"/>
+<l:template name="productionset" text="产å“ %n, “%tâ€"/>
+<l:template name="qandadiv" text="è´¨ä¿Â %n, “%tâ€"/>
+<l:template name="refsect1" text="“%tâ€ä¸€èŠ‚"/>
+<l:template name="refsect2" text="“%tâ€ä¸€èŠ‚"/>
+<l:template name="refsect3" text="“%tâ€ä¸€èŠ‚"/>
+<l:template name="refsection" text="“%tâ€ä¸€èŠ‚"/>
+<l:template name="sect1" text="第 %n 节 “%tâ€"/>
+<l:template name="sect2" text="第 %n 节 “%tâ€"/>
+<l:template name="sect3" text="第 %n 节 “%tâ€"/>
+<l:template name="sect4" text="第 %n 节 “%tâ€"/>
+<l:template name="sect5" text="第 %n 节 “%tâ€"/>
+<l:template name="section" text="第 %n 节 “%tâ€"/>
+<l:template name="simplesect" text="“%tâ€ä¸€èŠ‚"/>
+<l:template name="table" text="表 %n “%tâ€"/>
+</l:context>
+<l:context name="authorgroup"><l:template name="sep" text="ã€"/>
+<l:template name="sep2" text="和"/>
+<l:template name="seplast" text="和"/>
+</l:context>
+<l:context name="glossary"><l:template name="see" text="è§%t."/>
+<l:template name="seealso" text="å‚è§%t."/>
+<l:template name="seealso-separator" text=", "/>
+</l:context>
+<l:context name="msgset"><l:template name="MsgAud" text="å—众:"/>
+<l:template name="MsgLevel" text="级别:"/>
+<l:template name="MsgOrig" text="出处:"/>
+</l:context>
+<l:context name="datetime"><l:template name="format" text="Y-m-d"/>
+</l:context>
+<l:context name="termdef"><l:template name="prefix" text="[定义:"/>
+<l:template name="suffix" text="]"/>
+</l:context>
+<l:context name="datetime-full"><l:template name="January" text="一月"/>
+<l:template name="February" text="二月"/>
+<l:template name="March" text="三月"/>
+<l:template name="April" text="四月"/>
+<l:template name="May" text="五月"/>
+<l:template name="June" text="六月"/>
+<l:template name="July" text="七月"/>
+<l:template name="August" text="八月"/>
+<l:template name="September" text="ä¹æœˆ"/>
+<l:template name="October" text="å月"/>
+<l:template name="November" text="å一月"/>
+<l:template name="December" text="å二月"/>
+<l:template name="Monday" text="星期一"/>
+<l:template name="Tuesday" text="星期二"/>
+<l:template name="Wednesday" text="星期三"/>
+<l:template name="Thursday" text="星期四"/>
+<l:template name="Friday" text="星期五"/>
+<l:template name="Saturday" text="星期六"/>
+<l:template name="Sunday" text="星期日"/>
+</l:context>
+<l:context name="datetime-abbrev"><l:template name="Jan" text="一月"/>
+<l:template name="Feb" text="二月"/>
+<l:template name="Mar" text="三月"/>
+<l:template name="Apr" text="四月"/>
+<l:template name="May" text="五月"/>
+<l:template name="Jun" text="六月"/>
+<l:template name="Jul" text="七月"/>
+<l:template name="Aug" text="八月"/>
+<l:template name="Sep" text="ä¹æœˆ"/>
+<l:template name="Oct" text="å月"/>
+<l:template name="Nov" text="å一月"/>
+<l:template name="Dec" text="å二月"/>
+<l:template name="Mon" text="周一"/>
+<l:template name="Tue" text="周二"/>
+<l:template name="Wed" text="周三"/>
+<l:template name="Thu" text="周四"/>
+<l:template name="Fri" text="周五"/>
+<l:template name="Sat" text="周六"/>
+<l:template name="Sun" text="周日"/>
+</l:context>
+<l:context name="htmlhelp"><l:template name="langcode" text="0x0804 Chinese (CHINA)"/>
+</l:context>
+<l:context name="index"><l:template name="term-separator" text=","/>
+<l:template name="number-separator" text=","/>
+<l:template name="range-separator" text="ï¼"/>
+</l:context>
+<l:context name="iso690"><l:template name="lastfirst.sep" text=","/>
+<l:template name="alt.person.two.sep" text=" 和 "/>
+<l:template name="alt.person.last.sep" text=" 和 "/>
+<l:template name="alt.person.more.sep" text=","/>
+<l:template name="primary.editor" text="(主编)"/>
+<l:template name="primary.many" text="等。"/>
+<l:template name="primary.sep" text="。"/>
+<l:template name="submaintitle.sep" text=":"/>
+<l:template name="title.sep" text="。"/>
+<l:template name="othertitle.sep" text=","/>
+<l:template name="medium1" text=" ["/>
+<l:template name="medium2" text="]"/>
+<l:template name="secondary.person.sep" text="ï¼›"/>
+<l:template name="secondary.sep" text="。"/>
+<l:template name="respons.sep" text="。"/>
+<l:template name="edition.sep" text="。"/>
+<l:template name="edition.serial.sep" text=","/>
+<l:template name="issuing.range" text="-"/>
+<l:template name="issuing.div" text=","/>
+<l:template name="issuing.sep" text="。"/>
+<l:template name="partnr.sep" text="。"/>
+<l:template name="placepubl.sep" text=":"/>
+<l:template name="publyear.sep" text=","/>
+<l:template name="pubinfo.sep" text="。"/>
+<l:template name="spec.pubinfo.sep" text=","/>
+<l:template name="upd.sep" text=","/>
+<l:template name="datecit1" text=" [cited "/>
+<l:template name="datecit2" text="]"/>
+<l:template name="extent.sep" text="。"/>
+<l:template name="locs.sep" text=","/>
+<l:template name="location.sep" text="。"/>
+<l:template name="serie.sep" text="。"/>
+<l:template name="notice.sep" text="。"/>
+<l:template name="access" text="å¯ç”¨"/>
+<l:template name="acctoo" text="也å¯ç”¨"/>
+<l:template name="onwww" text="从万维网"/>
+<l:template name="oninet" text="从互è”网"/>
+<l:template name="access.end" text=": "/>
+<l:template name="link1" text="&lt;"/>
+<l:template name="link2" text="&gt;"/>
+<l:template name="access.sep" text=". "/>
+<l:template name="isbn" text="ISBN "/>
+<l:template name="issn" text="ISSN "/>
+<l:template name="stdnum.sep" text="。"/>
+<l:template name="patcountry.sep" text="。"/>
+<l:template name="pattype.sep" text=","/>
+<l:template name="patnum.sep" text="。"/>
+<l:template name="patdate.sep" text="。"/>
+</l:context><l:letters><l:l i="-1"/>
+<l:l i="0">符å·</l:l>
+<l:l i="1">A</l:l>
+<l:l i="1">a</l:l>
+<l:l i="2">B</l:l>
+<l:l i="2">b</l:l>
+<l:l i="3">C</l:l>
+<l:l i="3">c</l:l>
+<l:l i="4">D</l:l>
+<l:l i="4">d</l:l>
+<l:l i="5">E</l:l>
+<l:l i="5">e</l:l>
+<l:l i="6">F</l:l>
+<l:l i="6">f</l:l>
+<l:l i="7">G</l:l>
+<l:l i="7">g</l:l>
+<l:l i="8">H</l:l>
+<l:l i="8">h</l:l>
+<l:l i="9">I</l:l>
+<l:l i="9">i</l:l>
+<l:l i="10">J</l:l>
+<l:l i="10">j</l:l>
+<l:l i="11">K</l:l>
+<l:l i="11">k</l:l>
+<l:l i="12">L</l:l>
+<l:l i="12">l</l:l>
+<l:l i="13">M</l:l>
+<l:l i="13">m</l:l>
+<l:l i="14">N</l:l>
+<l:l i="14">n</l:l>
+<l:l i="15">O</l:l>
+<l:l i="15">o</l:l>
+<l:l i="16">P</l:l>
+<l:l i="16">p</l:l>
+<l:l i="17">Q</l:l>
+<l:l i="17">q</l:l>
+<l:l i="18">R</l:l>
+<l:l i="18">r</l:l>
+<l:l i="19">S</l:l>
+<l:l i="19">s</l:l>
+<l:l i="20">T</l:l>
+<l:l i="20">t</l:l>
+<l:l i="21">U</l:l>
+<l:l i="21">u</l:l>
+<l:l i="22">V</l:l>
+<l:l i="22">v</l:l>
+<l:l i="23">W</l:l>
+<l:l i="23">w</l:l>
+<l:l i="24">X</l:l>
+<l:l i="24">x</l:l>
+<l:l i="25">Y</l:l>
+<l:l i="25">y</l:l>
+<l:l i="26">Z</l:l>
+<l:l i="26">z</l:l>
+</l:letters>
+</l:l10n>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/zh_cn.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/zh_cn.xml
new file mode 100644
index 0000000..f42774c
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/zh_cn.xml
@@ -0,0 +1,660 @@
+<?xml version="1.0" encoding="utf-8"?>
+<l:l10n xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0" language="zh_cn" english-language-name="Chinese Simplified">
+
+<!-- * This file is generated automatically. -->
+<!-- * To submit changes to this file upstream (to the DocBook Project) -->
+<!-- * do not submit an edited version of this file. Instead, submit an -->
+<!-- * edited version of the source file at the following location: -->
+<!-- * -->
+<!-- * https://docbook.svn.sourceforge.net/svnroot/docbook/trunk/gentext/locale/zh_cn.xml -->
+<!-- * -->
+<!-- * E-mail the edited zh_cn.xml source file to: -->
+<!-- * -->
+<!-- * docbook-developers@lists.sourceforge.net -->
+
+<!-- ******************************************************************** -->
+
+<!-- This file is part of the XSL DocBook Stylesheet distribution. -->
+<!-- See ../README or http://docbook.sf.net/release/xsl/current/ for -->
+<!-- copyright and other information. -->
+
+<!-- ******************************************************************** -->
+<!-- In these files, % with a letter is used for a placeholder: -->
+<!-- %t is the current element's title -->
+<!-- %s is the current element's subtitle (if applicable)-->
+<!-- %n is the current element's number label-->
+<!-- %p is the current element's page number (if applicable)-->
+<!-- ******************************************************************** -->
+
+
+<l:gentext key="Abstract" text="摘è¦"/>
+<l:gentext key="abstract" text="摘è¦"/>
+<l:gentext key="Acknowledgements" text="鸣谢"/>
+<l:gentext key="acknowledgements" text="鸣谢"/>
+<l:gentext key="Answer" text="答:"/>
+<l:gentext key="answer" text="答:"/>
+<l:gentext key="Appendix" text="附录"/>
+<l:gentext key="appendix" text="附录"/>
+<l:gentext key="Article" text="文章"/>
+<l:gentext key="article" text="文章"/>
+<l:gentext key="Author" text="作者"/>
+<l:gentext key="Bibliography" text="å‚考书目"/>
+<l:gentext key="bibliography" text="å‚考书目"/>
+<l:gentext key="Book" text="书"/>
+<l:gentext key="book" text="书"/>
+<l:gentext key="CAUTION" text="å°å¿ƒ"/>
+<l:gentext key="Caution" text="å°å¿ƒ"/>
+<l:gentext key="caution" text="å°å¿ƒ"/>
+<l:gentext key="Chapter" text="ç« "/>
+<l:gentext key="chapter" text="ç« "/>
+<l:gentext key="Colophon" text="åŽè®°"/>
+<l:gentext key="colophon" text="åŽè®°"/>
+<l:gentext key="Copyright" text="版æƒ"/>
+<l:gentext key="copyright" text="版æƒ"/>
+<l:gentext key="Dedication" text="题è¯"/>
+<l:gentext key="dedication" text="题è¯"/>
+<l:gentext key="Edition" text="版"/>
+<l:gentext key="edition" text="版"/>
+<l:gentext key="Editor" text="编者"/>
+<l:gentext key="Equation" text="å…¬å¼"/>
+<l:gentext key="equation" text="å…¬å¼"/>
+<l:gentext key="Example" text="例"/>
+<l:gentext key="example" text="例"/>
+<l:gentext key="Figure" text="图"/>
+<l:gentext key="figure" text="图"/>
+<l:gentext key="Glossary" text="术语表"/>
+<l:gentext key="glossary" text="术语表"/>
+<l:gentext key="GlossSee" text="è§"/>
+<l:gentext key="glosssee" text="è§"/>
+<l:gentext key="GlossSeeAlso" text="å‚è§"/>
+<l:gentext key="glossseealso" text="å‚è§"/>
+<l:gentext key="IMPORTANT" text="é‡è¦"/>
+<l:gentext key="important" text="é‡è¦"/>
+<l:gentext key="Important" text="é‡è¦"/>
+<l:gentext key="Index" text="索引"/>
+<l:gentext key="index" text="索引"/>
+<l:gentext key="ISBN" text="ISBN"/>
+<l:gentext key="isbn" text="ISBN"/>
+<l:gentext key="LegalNotice" text="法律通告"/>
+<l:gentext key="legalnotice" text="法律通告"/>
+<l:gentext key="MsgAud" text="å—ä¼—"/>
+<l:gentext key="msgaud" text="å—ä¼—"/>
+<l:gentext key="MsgLevel" text="级别"/>
+<l:gentext key="msglevel" text="级别"/>
+<l:gentext key="MsgOrig" text="出处"/>
+<l:gentext key="msgorig" text="出处"/>
+<l:gentext key="NOTE" text="注æ„"/>
+<l:gentext key="Note" text="注æ„"/>
+<l:gentext key="note" text="注æ„"/>
+<l:gentext key="Part" text="部分"/>
+<l:gentext key="part" text="部分"/>
+<l:gentext key="Preface" text="å‰è¨€"/>
+<l:gentext key="preface" text="å‰è¨€"/>
+<l:gentext key="Procedure" text="过程"/>
+<l:gentext key="procedure" text="过程"/>
+<l:gentext key="ProductionSet" text="产å“"/>
+<l:gentext key="PubDate" text="出版日期"/>
+<l:gentext key="pubdate" text="出版日期"/>
+<l:gentext key="Published" text="出版方"/>
+<l:gentext key="published" text="出版方"/>
+<l:gentext key="Publisher" text="出版者"/>
+<l:gentext key="Qandadiv" text="答问集"/>
+<l:gentext key="qandadiv" text="答问集"/>
+<l:gentext key="QandASet" text="常è§é—®é¢˜"/>
+<l:gentext key="Question" text="问:"/>
+<l:gentext key="question" text="问:"/>
+<l:gentext key="RefEntry" text="页"/>
+<l:gentext key="refentry" text="页"/>
+<l:gentext key="Reference" text="å‚考"/>
+<l:gentext key="reference" text="å‚考"/>
+<l:gentext key="References" text="å‚考"/>
+<l:gentext key="RefName" text="å称"/>
+<l:gentext key="refname" text="å称"/>
+<l:gentext key="RefSection" text="节"/>
+<l:gentext key="refsection" text="节"/>
+<l:gentext key="RefSynopsisDiv" text="大纲"/>
+<l:gentext key="refsynopsisdiv" text="大纲"/>
+<l:gentext key="RevHistory" text="修订历å²"/>
+<l:gentext key="revhistory" text="修订历å²"/>
+<l:gentext key="revision" text="修订"/>
+<l:gentext key="Revision" text="修订"/>
+<l:gentext key="sect1" text="节"/>
+<l:gentext key="sect2" text="节"/>
+<l:gentext key="sect3" text="节"/>
+<l:gentext key="sect4" text="节"/>
+<l:gentext key="sect5" text="节"/>
+<l:gentext key="section" text="节"/>
+<l:gentext key="Section" text="节"/>
+<l:gentext key="see" text="è§"/>
+<l:gentext key="See" text="è§"/>
+<l:gentext key="seealso" text="å‚è§"/>
+<l:gentext key="Seealso" text="å‚è§"/>
+<l:gentext key="SeeAlso" text="å‚è§"/>
+<l:gentext key="set" text="集åˆ"/>
+<l:gentext key="Set" text="集åˆ"/>
+<l:gentext key="setindex" text="索引"/>
+<l:gentext key="SetIndex" text="索引"/>
+<l:gentext key="Sidebar" text="侧æ "/>
+<l:gentext key="sidebar" text="侧æ "/>
+<l:gentext key="step" text="步骤"/>
+<l:gentext key="Step" text="步骤"/>
+<l:gentext key="table" text="表"/>
+<l:gentext key="Table" text="表"/>
+<l:gentext key="task" text="任务"/>
+<l:gentext key="Task" text="任务"/>
+<l:gentext key="tip" text="æ示"/>
+<l:gentext key="TIP" text="æ示"/>
+<l:gentext key="Tip" text="æ示"/>
+<l:gentext key="Warning" text="警告"/>
+<l:gentext key="warning" text="警告"/>
+<l:gentext key="WARNING" text="警告"/>
+<l:gentext key="and" text="和"/>
+<l:gentext key="by" text="ç”±"/>
+<l:gentext key="Edited" text="编辑时间"/>
+<l:gentext key="edited" text="编辑时间"/>
+<l:gentext key="Editedby" text="编辑"/>
+<l:gentext key="editedby" text="编辑"/>
+<l:gentext key="in" text="于"/>
+<l:gentext key="lastlistcomma" text=""/>
+<l:gentext key="listcomma" text="ã€"/>
+<l:gentext key="notes" text="备注"/>
+<l:gentext key="Notes" text="备注"/>
+<l:gentext key="Pgs" text="页"/>
+<l:gentext key="pgs" text="页"/>
+<l:gentext key="Revisedby" text="修订者:"/>
+<l:gentext key="revisedby" text="修订者:"/>
+<l:gentext key="TableNotes" text="表注"/>
+<l:gentext key="tablenotes" text="表注"/>
+<l:gentext key="TableofContents" text="目录"/>
+<l:gentext key="tableofcontents" text="目录"/>
+<l:gentext key="unexpectedelementname" text="未预期的å称"/>
+<l:gentext key="unsupported" text="ä¸æ”¯æŒ"/>
+<l:gentext key="xrefto" text="xref to"/>
+<l:gentext key="Authors" text="作者"/>
+<l:gentext key="copyeditor" text="版æƒç¼–辑"/>
+<l:gentext key="graphicdesigner" text="美术编辑"/>
+<l:gentext key="productioneditor" text="产å“编辑"/>
+<l:gentext key="technicaleditor" text="技术编辑"/>
+<l:gentext key="translator" text="译者"/>
+<l:gentext key="listofequations" text="å…¬å¼æ¸…å•"/>
+<l:gentext key="ListofEquations" text="å…¬å¼æ¸…å•"/>
+<l:gentext key="ListofExamples" text="范例清å•"/>
+<l:gentext key="listofexamples" text="范例清å•"/>
+<l:gentext key="ListofFigures" text="æ’图清å•"/>
+<l:gentext key="listoffigures" text="æ’图清å•"/>
+<l:gentext key="ListofProcedures" text="过程清å•"/>
+<l:gentext key="listofprocedures" text="过程清å•"/>
+<l:gentext key="listoftables" text="表格清å•"/>
+<l:gentext key="ListofTables" text="表格清å•"/>
+<l:gentext key="ListofUnknown" text="未知清å•"/>
+<l:gentext key="listofunknown" text="未知清å•"/>
+<l:gentext key="nav-home" text="起始页"/>
+<l:gentext key="nav-next" text="下一页"/>
+<l:gentext key="nav-next-sibling" text="å¿«è¿›"/>
+<l:gentext key="nav-prev" text="上一页"/>
+<l:gentext key="nav-prev-sibling" text="快退"/>
+<l:gentext key="nav-up" text="上一级"/>
+<l:gentext key="nav-toc" text="目录"/>
+<l:gentext key="Draft" text="è‰ç¨¿"/>
+<l:gentext key="above" text="以上"/>
+<l:gentext key="below" text="以下"/>
+<l:gentext key="sectioncalled" text="一节"/>
+<l:gentext key="index symbols" text="符å·"/>
+<l:gentext key="writing-mode" text="lr-tb"/>
+<l:gentext key="lowercase.alpha" text="abcdefghijklmnopqrstuvwxyz"/>
+<l:gentext key="uppercase.alpha" text="ABCDEFGHIJKLMNOPQRSTUVWXYZ"/>
+<l:gentext key="normalize.sort.input" text="abcdefghijklmnopqrstuvwxyz"/>
+<l:gentext key="normalize.sort.output" text="ABCDEFGHIJKLMNOPQRSTUVWXYZ"/>
+<l:dingbat key="startquote" text="“"/>
+<l:dingbat key="endquote" text="â€"/>
+<l:dingbat key="nestedstartquote" text="‘"/>
+<l:dingbat key="nestedendquote" text="’"/>
+<l:dingbat key="singlestartquote" text="‘"/>
+<l:dingbat key="singleendquote" text="’"/>
+<l:dingbat key="bullet" text="·"/>
+<l:gentext key="hyphenation-character" text="-"/>
+<l:gentext key="hyphenation-push-character-count" text="2"/>
+<l:gentext key="hyphenation-remain-character-count" text="2"/>
+<l:context name="styles"><l:template name="person-name" text="first-last"/>
+</l:context>
+<l:context name="title"><l:template name="abstract" text="%t"/>
+<l:template name="acknowledgements" text="%t"/>
+<l:template name="answer" text="%t"/>
+<l:template name="appendix" text="附录 %n. %t"/>
+<l:template name="article" text="%t"/>
+<l:template name="authorblurb" text="%t"/>
+<l:template name="bibliodiv" text="%t"/>
+<l:template name="biblioentry" text="%t"/>
+<l:template name="bibliography" text="%t"/>
+<l:template name="bibliolist" text="%t"/>
+<l:template name="bibliomixed" text="%t"/>
+<l:template name="bibliomset" text="%t"/>
+<l:template name="biblioset" text="%t"/>
+<l:template name="blockquote" text="%t"/>
+<l:template name="book" text="%t"/>
+<l:template name="calloutlist" text="%t"/>
+<l:template name="caution" text="%t"/>
+<l:template name="chapter" text="第 %n 章 %t"/>
+<l:template name="colophon" text="%t"/>
+<l:template name="dedication" text="%t"/>
+<l:template name="equation" text="å…¬å¼Â %n. %t"/>
+<l:template name="example" text="例 %n. %t"/>
+<l:template name="figure" text="图 %n. %t"/>
+<l:template name="foil" text="%t"/>
+<l:template name="foilgroup" text="%t"/>
+<l:template name="formalpara" text="%t"/>
+<l:template name="glossary" text="%t"/>
+<l:template name="glossdiv" text="%t"/>
+<l:template name="glosslist" text="%t"/>
+<l:template name="glossentry" text="%t"/>
+<l:template name="important" text="%t"/>
+<l:template name="index" text="%t"/>
+<l:template name="indexdiv" text="%t"/>
+<l:template name="itemizedlist" text="%t"/>
+<l:template name="legalnotice" text="%t"/>
+<l:template name="listitem" text=""/>
+<l:template name="lot" text="%t"/>
+<l:template name="msg" text="%t"/>
+<l:template name="msgexplan" text="%t"/>
+<l:template name="msgmain" text="%t"/>
+<l:template name="msgrel" text="%t"/>
+<l:template name="msgset" text="%t"/>
+<l:template name="msgsub" text="%t"/>
+<l:template name="note" text="%t"/>
+<l:template name="orderedlist" text="%t"/>
+<l:template name="part" text="第 %n 部分 %t"/>
+<l:template name="partintro" text="%t"/>
+<l:template name="preface" text="%t"/>
+<l:template name="procedure" text="%t"/>
+<l:template name="procedure.formal" text="过程 %n. %t"/>
+<l:template name="productionset" text="%t"/>
+<l:template name="productionset.formal" text="产å“ %n"/>
+<l:template name="qandadiv" text="%t"/>
+<l:template name="qandaentry" text="%t"/>
+<l:template name="qandaset" text="%t"/>
+<l:template name="question" text="%t"/>
+<l:template name="refentry" text="%t"/>
+<l:template name="reference" text="%t"/>
+<l:template name="refsection" text="%t"/>
+<l:template name="refsect1" text="%t"/>
+<l:template name="refsect2" text="%t"/>
+<l:template name="refsect3" text="%t"/>
+<l:template name="refsynopsisdiv" text="%t"/>
+<l:template name="refsynopsisdivinfo" text="%t"/>
+<l:template name="segmentedlist" text="%t"/>
+<l:template name="set" text="%t"/>
+<l:template name="setindex" text="%t"/>
+<l:template name="sidebar" text="%t"/>
+<l:template name="step" text="%t"/>
+<l:template name="table" text="表 %n. %t"/>
+<l:template name="task" text="%t"/>
+<l:template name="tasksummary" text="%t"/>
+<l:template name="taskprerequisites" text="%t"/>
+<l:template name="taskrelated" text="%t"/>
+<l:template name="tip" text="%t"/>
+<l:template name="toc" text="%t"/>
+<l:template name="variablelist" text="%t"/>
+<l:template name="varlistentry" text=""/>
+<l:template name="warning" text="%t"/>
+</l:context>
+<l:context name="title-unnumbered"><l:template name="appendix" text="%t"/>
+<l:template name="article/appendix" text="%t"/>
+<l:template name="bridgehead" text="%t"/>
+<l:template name="chapter" text="%t"/>
+<l:template name="sect1" text="%t"/>
+<l:template name="sect2" text="%t"/>
+<l:template name="sect3" text="%t"/>
+<l:template name="sect4" text="%t"/>
+<l:template name="sect5" text="%t"/>
+<l:template name="section" text="%t"/>
+<l:template name="simplesect" text="%t"/>
+<l:template name="part" text="%t"/>
+</l:context>
+<l:context name="title-numbered"><l:template name="appendix" text="附录 %n. %t"/>
+<l:template name="article/appendix" text="%n. %t"/>
+<l:template name="bridgehead" text="%n. %t"/>
+<l:template name="chapter" text="第 %n 章 %t"/>
+<l:template name="part" text="部分 %n. %t"/>
+<l:template name="sect1" text="%n. %t"/>
+<l:template name="sect2" text="%n. %t"/>
+<l:template name="sect3" text="%n. %t"/>
+<l:template name="sect4" text="%n. %t"/>
+<l:template name="sect5" text="%n. %t"/>
+<l:template name="section" text="%n. %t"/>
+<l:template name="simplesect" text="%t"/>
+</l:context>
+<l:context name="subtitle"><l:template name="appendix" text="%s"/>
+<l:template name="acknowledgements" text="%s"/>
+<l:template name="article" text="%s"/>
+<l:template name="bibliodiv" text="%s"/>
+<l:template name="biblioentry" text="%s"/>
+<l:template name="bibliography" text="%s"/>
+<l:template name="bibliomixed" text="%s"/>
+<l:template name="bibliomset" text="%s"/>
+<l:template name="biblioset" text="%s"/>
+<l:template name="book" text="%s"/>
+<l:template name="chapter" text="%s"/>
+<l:template name="colophon" text="%s"/>
+<l:template name="dedication" text="%s"/>
+<l:template name="glossary" text="%s"/>
+<l:template name="glossdiv" text="%s"/>
+<l:template name="index" text="%s"/>
+<l:template name="indexdiv" text="%s"/>
+<l:template name="lot" text="%s"/>
+<l:template name="part" text="%s"/>
+<l:template name="partintro" text="%s"/>
+<l:template name="preface" text="%s"/>
+<l:template name="refentry" text="%s"/>
+<l:template name="reference" text="%s"/>
+<l:template name="refsection" text="%s"/>
+<l:template name="refsect1" text="%s"/>
+<l:template name="refsect2" text="%s"/>
+<l:template name="refsect3" text="%s"/>
+<l:template name="refsynopsisdiv" text="%s"/>
+<l:template name="sect1" text="%s"/>
+<l:template name="sect2" text="%s"/>
+<l:template name="sect3" text="%s"/>
+<l:template name="sect4" text="%s"/>
+<l:template name="sect5" text="%s"/>
+<l:template name="section" text="%s"/>
+<l:template name="set" text="%s"/>
+<l:template name="setindex" text="%s"/>
+<l:template name="sidebar" text="%s"/>
+<l:template name="simplesect" text="%s"/>
+<l:template name="toc" text="%s"/>
+</l:context>
+<l:context name="xref"><l:template name="abstract" text="%t"/>
+<l:template name="acknowledgements" text="%t"/>
+<l:template name="answer" text="答: %n"/>
+<l:template name="appendix" text="%t"/>
+<l:template name="article" text="%t"/>
+<l:template name="authorblurb" text="%t"/>
+<l:template name="bibliodiv" text="%t"/>
+<l:template name="bibliography" text="%t"/>
+<l:template name="bibliomset" text="%t"/>
+<l:template name="biblioset" text="%t"/>
+<l:template name="blockquote" text="%t"/>
+<l:template name="book" text="%t"/>
+<l:template name="calloutlist" text="%t"/>
+<l:template name="caution" text="%t"/>
+<l:template name="chapter" text="%t"/>
+<l:template name="colophon" text="%t"/>
+<l:template name="constraintdef" text="%t"/>
+<l:template name="dedication" text="%t"/>
+<l:template name="equation" text="%t"/>
+<l:template name="example" text="%t"/>
+<l:template name="figure" text="%t"/>
+<l:template name="foil" text="%t"/>
+<l:template name="foilgroup" text="%t"/>
+<l:template name="formalpara" text="%t"/>
+<l:template name="glossary" text="%t"/>
+<l:template name="glossdiv" text="%t"/>
+<l:template name="important" text="%t"/>
+<l:template name="index" text="%t"/>
+<l:template name="indexdiv" text="%t"/>
+<l:template name="itemizedlist" text="%t"/>
+<l:template name="legalnotice" text="%t"/>
+<l:template name="listitem" text="%n"/>
+<l:template name="lot" text="%t"/>
+<l:template name="msg" text="%t"/>
+<l:template name="msgexplan" text="%t"/>
+<l:template name="msgmain" text="%t"/>
+<l:template name="msgrel" text="%t"/>
+<l:template name="msgset" text="%t"/>
+<l:template name="msgsub" text="%t"/>
+<l:template name="note" text="%t"/>
+<l:template name="orderedlist" text="%t"/>
+<l:template name="part" text="%t"/>
+<l:template name="partintro" text="%t"/>
+<l:template name="preface" text="%t"/>
+<l:template name="procedure" text="%t"/>
+<l:template name="productionset" text="%t"/>
+<l:template name="qandadiv" text="%t"/>
+<l:template name="qandaentry" text="问: %n"/>
+<l:template name="qandaset" text="%t"/>
+<l:template name="question" text="问: %n"/>
+<l:template name="reference" text="%t"/>
+<l:template name="refsynopsisdiv" text="%t"/>
+<l:template name="segmentedlist" text="%t"/>
+<l:template name="set" text="%t"/>
+<l:template name="setindex" text="%t"/>
+<l:template name="sidebar" text="%t"/>
+<l:template name="table" text="%t"/>
+<l:template name="task" text="%t"/>
+<l:template name="tip" text="%t"/>
+<l:template name="toc" text="%t"/>
+<l:template name="variablelist" text="%t"/>
+<l:template name="varlistentry" text="%n"/>
+<l:template name="warning" text="%t"/>
+<l:template name="olink.document.citation" text=" in %o"/>
+<l:template name="olink.page.citation" text=" (page %p)"/>
+<l:template name="page.citation" text=" [%p]"/>
+<l:template name="page" text="(第 %p 页)"/>
+<l:template name="docname" text=" 在 %o"/>
+<l:template name="docnamelong" text=" 在文档标题 %o"/>
+<l:template name="pageabbrev" text="(第 %p 页)"/>
+<l:template name="Page" text="第 %p 页"/>
+<l:template name="bridgehead" text="“%tâ€ä¸€èŠ‚"/>
+<l:template name="refsection" text="“%tâ€ä¸€èŠ‚"/>
+<l:template name="refsect1" text="“%tâ€ä¸€èŠ‚"/>
+<l:template name="refsect2" text="“%tâ€ä¸€èŠ‚"/>
+<l:template name="refsect3" text="“%tâ€ä¸€èŠ‚"/>
+<l:template name="sect1" text="“%tâ€ä¸€èŠ‚"/>
+<l:template name="sect2" text="“%tâ€ä¸€èŠ‚"/>
+<l:template name="sect3" text="“%tâ€ä¸€èŠ‚"/>
+<l:template name="sect4" text="“%tâ€ä¸€èŠ‚"/>
+<l:template name="sect5" text="“%tâ€ä¸€èŠ‚"/>
+<l:template name="section" text="“%tâ€ä¸€èŠ‚"/>
+<l:template name="simplesect" text="“%tâ€ä¸€èŠ‚"/>
+</l:context>
+<l:context name="xref-number"><l:template name="answer" text="答: %n"/>
+<l:template name="appendix" text="附录 %n"/>
+<l:template name="bridgehead" text="第 %n 节"/>
+<l:template name="chapter" text="第 %n 章"/>
+<l:template name="equation" text="å…¬å¼Â %n"/>
+<l:template name="example" text="例 %n"/>
+<l:template name="figure" text="图 %n"/>
+<l:template name="part" text="第 %n 部分"/>
+<l:template name="procedure" text="过程 %n"/>
+<l:template name="productionset" text="产å“ %n"/>
+<l:template name="qandadiv" text="答问集 %n"/>
+<l:template name="qandaentry" text="问: %n"/>
+<l:template name="question" text="问: %n"/>
+<l:template name="sect1" text="第 %n 节"/>
+<l:template name="sect2" text="第 %n 节"/>
+<l:template name="sect3" text="第 %n 节"/>
+<l:template name="sect4" text="第 %n 节"/>
+<l:template name="sect5" text="第 %n 节"/>
+<l:template name="section" text="第 %n 节"/>
+<l:template name="table" text="表 %n"/>
+</l:context>
+<l:context name="xref-number-and-title"><l:template name="appendix" text="附录 %n, %t"/>
+<l:template name="bridgehead" text="第 %n 节 “%tâ€"/>
+<l:template name="chapter" text="第 %n 章 %t"/>
+<l:template name="equation" text="å…¬å¼Â %n “%tâ€"/>
+<l:template name="example" text="例 %n “%tâ€"/>
+<l:template name="figure" text="图 %n “%tâ€"/>
+<l:template name="part" text="第 %n 部分 “%tâ€"/>
+<l:template name="procedure" text="过程 %n, “%tâ€"/>
+<l:template name="productionset" text="产å“ %n, “%tâ€"/>
+<l:template name="qandadiv" text="答问集 %n, “%tâ€"/>
+<l:template name="refsect1" text="“%tâ€ä¸€èŠ‚"/>
+<l:template name="refsect2" text="“%tâ€ä¸€èŠ‚"/>
+<l:template name="refsect3" text="“%tâ€ä¸€èŠ‚"/>
+<l:template name="refsection" text="“%tâ€ä¸€èŠ‚"/>
+<l:template name="sect1" text="第 %n 节 “%tâ€"/>
+<l:template name="sect2" text="第 %n 节 “%tâ€"/>
+<l:template name="sect3" text="第 %n 节 “%tâ€"/>
+<l:template name="sect4" text="第 %n 节 “%tâ€"/>
+<l:template name="sect5" text="第 %n 节 “%tâ€"/>
+<l:template name="section" text="第 %n 节 “%tâ€"/>
+<l:template name="simplesect" text="“%tâ€ä¸€èŠ‚"/>
+<l:template name="table" text="表 %n “%tâ€"/>
+</l:context>
+<l:context name="authorgroup"><l:template name="sep" text="ã€"/>
+<l:template name="sep2" text="和"/>
+<l:template name="seplast" text="和"/>
+</l:context>
+<l:context name="glossary"><l:template name="see" text="è§%t."/>
+<l:template name="seealso" text="å‚è§%t."/>
+<l:template name="seealso-separator" text=", "/>
+</l:context>
+<l:context name="msgset"><l:template name="MsgAud" text="å—众:"/>
+<l:template name="MsgLevel" text="级别:"/>
+<l:template name="MsgOrig" text="出处:"/>
+</l:context>
+<l:context name="datetime"><l:template name="format" text="Y-m-d"/>
+</l:context>
+<l:context name="termdef"><l:template name="prefix" text="[定义:"/>
+<l:template name="suffix" text="]"/>
+</l:context>
+<l:context name="datetime-full"><l:template name="January" text="一月"/>
+<l:template name="February" text="二月"/>
+<l:template name="March" text="三月"/>
+<l:template name="April" text="四月"/>
+<l:template name="May" text="五月"/>
+<l:template name="June" text="六月"/>
+<l:template name="July" text="七月"/>
+<l:template name="August" text="八月"/>
+<l:template name="September" text="ä¹æœˆ"/>
+<l:template name="October" text="å月"/>
+<l:template name="November" text="å一月"/>
+<l:template name="December" text="å二月"/>
+<l:template name="Monday" text="星期一"/>
+<l:template name="Tuesday" text="星期二"/>
+<l:template name="Wednesday" text="星期三"/>
+<l:template name="Thursday" text="星期四"/>
+<l:template name="Friday" text="星期五"/>
+<l:template name="Saturday" text="星期六"/>
+<l:template name="Sunday" text="星期日"/>
+</l:context>
+<l:context name="datetime-abbrev"><l:template name="Jan" text="一月"/>
+<l:template name="Feb" text="二月"/>
+<l:template name="Mar" text="三月"/>
+<l:template name="Apr" text="四月"/>
+<l:template name="May" text="五月"/>
+<l:template name="Jun" text="六月"/>
+<l:template name="Jul" text="七月"/>
+<l:template name="Aug" text="八月"/>
+<l:template name="Sep" text="ä¹æœˆ"/>
+<l:template name="Oct" text="å月"/>
+<l:template name="Nov" text="å一月"/>
+<l:template name="Dec" text="å二月"/>
+<l:template name="Mon" text="周一"/>
+<l:template name="Tue" text="周二"/>
+<l:template name="Wed" text="周三"/>
+<l:template name="Thu" text="周四"/>
+<l:template name="Fri" text="周五"/>
+<l:template name="Sat" text="周六"/>
+<l:template name="Sun" text="周日"/>
+</l:context>
+<l:context name="htmlhelp"><l:template name="langcode" text="0x0804 Chinese (CHINA)"/>
+</l:context>
+<l:context name="index"><l:template name="term-separator" text=","/>
+<l:template name="number-separator" text=","/>
+<l:template name="range-separator" text="ï¼"/>
+</l:context>
+<l:context name="iso690"><l:template name="lastfirst.sep" text=","/>
+<l:template name="alt.person.two.sep" text=" 和 "/>
+<l:template name="alt.person.last.sep" text=" 和 "/>
+<l:template name="alt.person.more.sep" text=","/>
+<l:template name="primary.editor" text="(主编)"/>
+<l:template name="primary.many" text="等。"/>
+<l:template name="primary.sep" text="。"/>
+<l:template name="submaintitle.sep" text=":"/>
+<l:template name="title.sep" text="。"/>
+<l:template name="othertitle.sep" text=","/>
+<l:template name="medium1" text=" ["/>
+<l:template name="medium2" text="]"/>
+<l:template name="secondary.person.sep" text="ï¼›"/>
+<l:template name="secondary.sep" text="。"/>
+<l:template name="respons.sep" text="。"/>
+<l:template name="edition.sep" text="。"/>
+<l:template name="edition.serial.sep" text=","/>
+<l:template name="issuing.range" text="-"/>
+<l:template name="issuing.div" text=","/>
+<l:template name="issuing.sep" text="。"/>
+<l:template name="partnr.sep" text="。"/>
+<l:template name="placepubl.sep" text=":"/>
+<l:template name="publyear.sep" text=","/>
+<l:template name="pubinfo.sep" text="。"/>
+<l:template name="spec.pubinfo.sep" text=","/>
+<l:template name="upd.sep" text=","/>
+<l:template name="datecit1" text=" [cited "/>
+<l:template name="datecit2" text="]"/>
+<l:template name="extent.sep" text="。"/>
+<l:template name="locs.sep" text=","/>
+<l:template name="location.sep" text="。"/>
+<l:template name="serie.sep" text="。"/>
+<l:template name="notice.sep" text="。"/>
+<l:template name="access" text="å¯ç”¨"/>
+<l:template name="acctoo" text="也å¯ç”¨"/>
+<l:template name="onwww" text="从万维网"/>
+<l:template name="oninet" text="从互è”网"/>
+<l:template name="access.end" text=": "/>
+<l:template name="link1" text="&lt;"/>
+<l:template name="link2" text="&gt;"/>
+<l:template name="access.sep" text=". "/>
+<l:template name="isbn" text="ISBN "/>
+<l:template name="issn" text="ISSN "/>
+<l:template name="stdnum.sep" text="。"/>
+<l:template name="patcountry.sep" text="。"/>
+<l:template name="pattype.sep" text=","/>
+<l:template name="patnum.sep" text="。"/>
+<l:template name="patdate.sep" text="。"/>
+</l:context><l:letters><l:l i="-1"/>
+<l:l i="0">符å·</l:l>
+<l:l i="1">A</l:l>
+<l:l i="1">a</l:l>
+<l:l i="2">B</l:l>
+<l:l i="2">b</l:l>
+<l:l i="3">C</l:l>
+<l:l i="3">c</l:l>
+<l:l i="4">D</l:l>
+<l:l i="4">d</l:l>
+<l:l i="5">E</l:l>
+<l:l i="5">e</l:l>
+<l:l i="6">F</l:l>
+<l:l i="6">f</l:l>
+<l:l i="7">G</l:l>
+<l:l i="7">g</l:l>
+<l:l i="8">H</l:l>
+<l:l i="8">h</l:l>
+<l:l i="9">I</l:l>
+<l:l i="9">i</l:l>
+<l:l i="10">J</l:l>
+<l:l i="10">j</l:l>
+<l:l i="11">K</l:l>
+<l:l i="11">k</l:l>
+<l:l i="12">L</l:l>
+<l:l i="12">l</l:l>
+<l:l i="13">M</l:l>
+<l:l i="13">m</l:l>
+<l:l i="14">N</l:l>
+<l:l i="14">n</l:l>
+<l:l i="15">O</l:l>
+<l:l i="15">o</l:l>
+<l:l i="16">P</l:l>
+<l:l i="16">p</l:l>
+<l:l i="17">Q</l:l>
+<l:l i="17">q</l:l>
+<l:l i="18">R</l:l>
+<l:l i="18">r</l:l>
+<l:l i="19">S</l:l>
+<l:l i="19">s</l:l>
+<l:l i="20">T</l:l>
+<l:l i="20">t</l:l>
+<l:l i="21">U</l:l>
+<l:l i="21">u</l:l>
+<l:l i="22">V</l:l>
+<l:l i="22">v</l:l>
+<l:l i="23">W</l:l>
+<l:l i="23">w</l:l>
+<l:l i="24">X</l:l>
+<l:l i="24">x</l:l>
+<l:l i="25">Y</l:l>
+<l:l i="25">y</l:l>
+<l:l i="26">Z</l:l>
+<l:l i="26">z</l:l>
+</l:letters>
+</l:l10n>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/zh_tw.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/zh_tw.xml
new file mode 100644
index 0000000..49cb5b6
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/common/zh_tw.xml
@@ -0,0 +1,660 @@
+<?xml version="1.0" encoding="utf-8"?>
+<l:l10n xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0" language="zh_tw" english-language-name="Chinese (Taiwan)">
+
+<!-- * This file is generated automatically. -->
+<!-- * To submit changes to this file upstream (to the DocBook Project) -->
+<!-- * do not submit an edited version of this file. Instead, submit an -->
+<!-- * edited version of the source file at the following location: -->
+<!-- * -->
+<!-- * https://docbook.svn.sourceforge.net/svnroot/docbook/trunk/gentext/locale/zh_tw.xml -->
+<!-- * -->
+<!-- * E-mail the edited zh_tw.xml source file to: -->
+<!-- * -->
+<!-- * docbook-developers@lists.sourceforge.net -->
+
+<!-- ******************************************************************** -->
+
+<!-- This file is part of the XSL DocBook Stylesheet distribution. -->
+<!-- See ../README or http://docbook.sf.net/release/xsl/current/ for -->
+<!-- copyright and other information. -->
+
+<!-- ******************************************************************** -->
+<!-- In these files, % with a letter is used for a placeholder: -->
+<!-- %t is the current element's title -->
+<!-- %s is the current element's subtitle (if applicable)-->
+<!-- %n is the current element's number label-->
+<!-- %p is the current element's page number (if applicable)-->
+<!-- ******************************************************************** -->
+
+
+<l:gentext key="Abstract" text="摘è¦"/>
+<l:gentext key="abstract" text="摘è¦"/>
+<l:gentext key="Acknowledgements" text="é³´è¬"/>
+<l:gentext key="acknowledgements" text="é³´è¬"/>
+<l:gentext key="Answer" text="答:"/>
+<l:gentext key="answer" text="答:"/>
+<l:gentext key="Appendix" text="附錄"/>
+<l:gentext key="appendix" text="附錄"/>
+<l:gentext key="Article" text="文章"/>
+<l:gentext key="article" text="文章"/>
+<l:gentext key="Author" text="作者"/>
+<l:gentext key="Bibliography" text="åƒè€ƒæ–‡ç»"/>
+<l:gentext key="bibliography" text="åƒè€ƒæ–‡ç»"/>
+<l:gentext key="Book" text="書目"/>
+<l:gentext key="book" text="書目"/>
+<l:gentext key="CAUTION" text="注æ„"/>
+<l:gentext key="Caution" text="注æ„"/>
+<l:gentext key="caution" text="注æ„"/>
+<l:gentext key="Chapter" text="ç« "/>
+<l:gentext key="chapter" text="ç« "/>
+<l:gentext key="Colophon" text="版本記錄"/>
+<l:gentext key="colophon" text="版本記錄"/>
+<l:gentext key="Copyright" text="版權"/>
+<l:gentext key="copyright" text="版權"/>
+<l:gentext key="Dedication" text="奉ç»"/>
+<l:gentext key="dedication" text="奉ç»"/>
+<l:gentext key="Edition" text="版"/>
+<l:gentext key="edition" text="版"/>
+<l:gentext key="Editor" text="编者"/>
+<l:gentext key="Equation" text="å…¬å¼"/>
+<l:gentext key="equation" text="å…¬å¼"/>
+<l:gentext key="Example" text="範例"/>
+<l:gentext key="example" text="範例"/>
+<l:gentext key="Figure" text="圖形"/>
+<l:gentext key="figure" text="圖形"/>
+<l:gentext key="Glossary" text="å°è¾­å½™"/>
+<l:gentext key="glossary" text="å°è¾­å½™"/>
+<l:gentext key="GlossSee" text="åƒè¦‹"/>
+<l:gentext key="glosssee" text="åƒè¦‹"/>
+<l:gentext key="GlossSeeAlso" text="å¦åƒè¦‹"/>
+<l:gentext key="glossseealso" text="å¦åƒè¦‹"/>
+<l:gentext key="IMPORTANT" text="é‡è¦"/>
+<l:gentext key="important" text="é‡è¦"/>
+<l:gentext key="Important" text="é‡è¦"/>
+<l:gentext key="Index" text="索引"/>
+<l:gentext key="index" text="索引"/>
+<l:gentext key="ISBN" text="ISBN"/>
+<l:gentext key="isbn" text="ISBN"/>
+<l:gentext key="LegalNotice" text="法律è²æ˜Ž"/>
+<l:gentext key="legalnotice" text="法律è²æ˜Ž"/>
+<l:gentext key="MsgAud" text="讀者"/>
+<l:gentext key="msgaud" text="讀者"/>
+<l:gentext key="MsgLevel" text="程度"/>
+<l:gentext key="msglevel" text="程度"/>
+<l:gentext key="MsgOrig" text="出處"/>
+<l:gentext key="msgorig" text="出處"/>
+<l:gentext key="NOTE" text="注æ„"/>
+<l:gentext key="Note" text="注æ„"/>
+<l:gentext key="note" text="注æ„"/>
+<l:gentext key="Part" text="部"/>
+<l:gentext key="part" text="部"/>
+<l:gentext key="Preface" text="åºè¨€"/>
+<l:gentext key="preface" text="åºè¨€"/>
+<l:gentext key="Procedure" text="éŽç¨‹"/>
+<l:gentext key="procedure" text="éŽç¨‹"/>
+<l:gentext key="ProductionSet" text="奉ç»"/>
+<l:gentext key="PubDate" text="出版日期"/>
+<l:gentext key="pubdate" text="出版日期"/>
+<l:gentext key="Published" text="出版"/>
+<l:gentext key="published" text="出版"/>
+<l:gentext key="Publisher" text="出版者"/>
+<l:gentext key="Qandadiv" text="å•ç­”"/>
+<l:gentext key="qandadiv" text="å•ç­”"/>
+<l:gentext key="QandASet" text="常見å•é¡Œé›†"/>
+<l:gentext key="Question" text="å•ï¼š"/>
+<l:gentext key="question" text="å•ï¼š"/>
+<l:gentext key="RefEntry" text="é "/>
+<l:gentext key="refentry" text="é "/>
+<l:gentext key="Reference" text="åƒè€ƒ"/>
+<l:gentext key="reference" text="åƒè€ƒ"/>
+<l:gentext key="References" text="åƒè€ƒ"/>
+<l:gentext key="RefName" text="åƒè€ƒå"/>
+<l:gentext key="refname" text="åƒè€ƒå"/>
+<l:gentext key="RefSection" text="節"/>
+<l:gentext key="refsection" text="節"/>
+<l:gentext key="RefSynopsisDiv" text="大綱"/>
+<l:gentext key="refsynopsisdiv" text="大綱"/>
+<l:gentext key="RevHistory" text="修訂記錄"/>
+<l:gentext key="revhistory" text="修訂記錄"/>
+<l:gentext key="revision" text="修訂"/>
+<l:gentext key="Revision" text="修訂"/>
+<l:gentext key="sect1" text="節"/>
+<l:gentext key="sect2" text="節"/>
+<l:gentext key="sect3" text="節"/>
+<l:gentext key="sect4" text="節"/>
+<l:gentext key="sect5" text="節"/>
+<l:gentext key="section" text="節"/>
+<l:gentext key="Section" text="節"/>
+<l:gentext key="see" text="åƒè¦‹"/>
+<l:gentext key="See" text="åƒè¦‹"/>
+<l:gentext key="seealso" text="å¦åƒè¦‹"/>
+<l:gentext key="Seealso" text="å¦åƒè¦‹"/>
+<l:gentext key="SeeAlso" text="å¦åƒè¦‹"/>
+<l:gentext key="set" text="集åˆ"/>
+<l:gentext key="Set" text="集åˆ"/>
+<l:gentext key="setindex" text="索引"/>
+<l:gentext key="SetIndex" text="索引"/>
+<l:gentext key="Sidebar" text="å´æ¬„"/>
+<l:gentext key="sidebar" text="å´æ¬„"/>
+<l:gentext key="step" text="步驟"/>
+<l:gentext key="Step" text="步驟"/>
+<l:gentext key="table" text="表格"/>
+<l:gentext key="Table" text="表格"/>
+<l:gentext key="task" text="任務"/>
+<l:gentext key="Task" text="任務"/>
+<l:gentext key="tip" text="æ示"/>
+<l:gentext key="TIP" text="æ示"/>
+<l:gentext key="Tip" text="æ示"/>
+<l:gentext key="Warning" text="警告"/>
+<l:gentext key="warning" text="警告"/>
+<l:gentext key="WARNING" text="警告"/>
+<l:gentext key="and" text="且"/>
+<l:gentext key="by" text="ç”±"/>
+<l:gentext key="Edited" text="編輯"/>
+<l:gentext key="edited" text="編輯"/>
+<l:gentext key="Editedby" text="編輯者"/>
+<l:gentext key="editedby" text="編輯者"/>
+<l:gentext key="in" text="在"/>
+<l:gentext key="lastlistcomma" text=","/>
+<l:gentext key="listcomma" text=","/>
+<l:gentext key="notes" text="注"/>
+<l:gentext key="Notes" text="注"/>
+<l:gentext key="Pgs" text="é "/>
+<l:gentext key="pgs" text="é "/>
+<l:gentext key="Revisedby" text="修訂者 "/>
+<l:gentext key="revisedby" text="修訂者 "/>
+<l:gentext key="TableNotes" text="注"/>
+<l:gentext key="tablenotes" text="注"/>
+<l:gentext key="TableofContents" text="內容目錄"/>
+<l:gentext key="tableofcontents" text="內容目錄"/>
+<l:gentext key="unexpectedelementname" text="éžé æœŸçš„å稱"/>
+<l:gentext key="unsupported" text="未支æ´"/>
+<l:gentext key="xrefto" text="åƒç…§"/>
+<l:gentext key="Authors" text="作者"/>
+<l:gentext key="copyeditor" text="版權"/>
+<l:gentext key="graphicdesigner" text="美術編輯"/>
+<l:gentext key="productioneditor" text="製作編輯"/>
+<l:gentext key="technicaleditor" text="技術編輯"/>
+<l:gentext key="translator" text="翻譯者"/>
+<l:gentext key="listofequations" text="å…¬å¼ç›®éŒ„"/>
+<l:gentext key="ListofEquations" text="å…¬å¼ç›®éŒ„"/>
+<l:gentext key="ListofExamples" text="範例目錄"/>
+<l:gentext key="listofexamples" text="範例目錄"/>
+<l:gentext key="ListofFigures" text="附圖目錄"/>
+<l:gentext key="listoffigures" text="附圖目錄"/>
+<l:gentext key="ListofProcedures" text="éŽç¨‹æ¸…å–®"/>
+<l:gentext key="listofprocedures" text="éŽç¨‹æ¸…å–®"/>
+<l:gentext key="listoftables" text="附表目錄"/>
+<l:gentext key="ListofTables" text="附表目錄"/>
+<l:gentext key="ListofUnknown" text="其他內容目錄"/>
+<l:gentext key="listofunknown" text="其他內容目錄"/>
+<l:gentext key="nav-home" text="起始é "/>
+<l:gentext key="nav-next" text="下一é "/>
+<l:gentext key="nav-next-sibling" text="快速å‘å‰"/>
+<l:gentext key="nav-prev" text="å‰ä¸€é "/>
+<l:gentext key="nav-prev-sibling" text="快速å‘後"/>
+<l:gentext key="nav-up" text="上一層"/>
+<l:gentext key="nav-toc" text="目錄"/>
+<l:gentext key="Draft" text="è‰ç¨¿"/>
+<l:gentext key="above" text="以上"/>
+<l:gentext key="below" text="以下"/>
+<l:gentext key="sectioncalled" text="一節"/>
+<l:gentext key="index symbols" text="符號"/>
+<l:gentext key="writing-mode" text="lr-tb"/>
+<l:gentext key="lowercase.alpha" text="abcdefghijklmnopqrstuvwxyz" lang="en"/>
+<l:gentext key="uppercase.alpha" text="ABCDEFGHIJKLMNOPQRSTUVWXYZ" lang="en"/>
+<l:gentext key="normalize.sort.input" text="AaÀàÃáÂâÃãÄäÅåĀÄĂ㥹ÇǎǞǟǠǡǺǻȀÈȂȃȦȧḀá¸áºšáº áº¡áº¢áº£áº¤áº¥áº¦áº§áº¨áº©áºªáº«áº¬áº­áº®áº¯áº°áº±áº²áº³áº´áºµáº¶áº·BbÆ€ÆɓƂƃḂḃḄḅḆḇCcÇçĆćĈĉĊċČÄƇƈɕḈḉDdÄŽÄÄđƊɗƋƌDžDzȡɖḊḋḌá¸á¸Žá¸á¸á¸‘ḒḓEeÈèÉéÊêËëĒēĔĕĖėĘęĚěȄȅȆȇȨȩḔḕḖḗḘḙḚḛḜá¸áº¸áº¹áººáº»áº¼áº½áº¾áº¿á»€á»á»‚ểỄễỆệFfƑƒḞḟGgÄœÄĞğĠġĢģƓɠǤǥǦǧǴǵḠḡHhĤĥĦħȞȟɦḢḣḤḥḦḧḨḩḪḫẖIiÌìÃíÎîÃïĨĩĪīĬĭĮįİƗɨÇÇȈȉȊȋḬḭḮḯỈỉỊịJjĴĵǰÊKkĶķƘƙǨǩḰḱḲḳḴḵLlĹĺĻļĽľĿŀÅłƚLjȴɫɬɭḶḷḸḹḺḻḼḽMmɱḾḿṀá¹á¹‚ṃNnÑñŃńŅņŇňÆɲƞȠNjǸǹȵɳṄṅṆṇṈṉṊṋOoÒòÓóÔôÕõÖöØøŌÅÅŽÅÅőƟƠơǑǒǪǫǬǭǾǿȌÈÈŽÈȪȫȬȭȮȯȰȱṌá¹á¹Žá¹á¹á¹‘ṒṓỌá»á»Žá»á»á»‘ỒồỔổỖỗỘộỚớỜá»á»žá»Ÿá» á»¡á»¢á»£PpƤƥṔṕṖṗQqÊ RrŔŕŖŗŘřÈȑȒȓɼɽɾṘṙṚṛṜá¹á¹žá¹ŸSsŚśŜÅŞşŠšȘșʂṠṡṢṣṤṥṦṧṨṩTtŢţŤťŦŧƫƬƭƮʈȚțȶṪṫṬṭṮṯṰṱẗUuÙùÚúÛûÜüŨũŪūŬŭŮůŰűŲųƯưǓǔǕǖǗǘǙǚǛǜȔȕȖȗṲṳṴṵṶṷṸṹṺṻỤụỦủỨứỪừỬửỮữỰựVvƲʋṼṽṾṿWwŴŵẀáºáº‚ẃẄẅẆẇẈẉẘXxẊẋẌáºYyÃýÿŸŶŷƳƴȲȳẎáºáº™á»²á»³á»´á»µá»¶á»·á»¸á»¹ZzŹźŻżŽžƵƶȤȥÊÊ‘áºáº‘ẒẓẔẕẕ" lang="en"/>
+<l:gentext key="normalize.sort.output" text="AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBCCCCCCCCCCCCCCCCCDDDDDDDDDDDDDDDDDDDDDDDDEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEFFFFFFGGGGGGGGGGGGGGGGGGGGHHHHHHHHHHHHHHHHHHHHIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIJJJJJJKKKKKKKKKKKKKKLLLLLLLLLLLLLLLLLLLLLLLLLLMMMMMMMMMNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOPPPPPPPPQQQRRRRRRRRRRRRRRRRRRRRRRRSSSSSSSSSSSSSSSSSSSSSSSTTTTTTTTTTTTTTTTTTTTTTTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUVVVVVVVVWWWWWWWWWWWWWWWXXXXXXYYYYYYYYYYYYYYYYYYYYYYYZZZZZZZZZZZZZZZZZZZZZ" lang="en"/>
+<l:dingbat key="startquote" text="“"/>
+<l:dingbat key="endquote" text="â€"/>
+<l:dingbat key="nestedstartquote" text="‘"/>
+<l:dingbat key="nestedendquote" text="’"/>
+<l:dingbat key="singlestartquote" text="‘" lang="en"/>
+<l:dingbat key="singleendquote" text="’" lang="en"/>
+<l:dingbat key="bullet" text="•"/>
+<l:gentext key="hyphenation-character" text="-" lang="en"/>
+<l:gentext key="hyphenation-push-character-count" text="2" lang="en"/>
+<l:gentext key="hyphenation-remain-character-count" text="2" lang="en"/>
+<l:context name="styles"><l:template name="person-name" text="first-last"/>
+</l:context>
+<l:context name="title"><l:template name="abstract" text="%t"/>
+<l:template name="acknowledgements" text="%t" lang="en"/>
+<l:template name="answer" text="%t"/>
+<l:template name="appendix" text="附錄 %n. %t"/>
+<l:template name="article" text="%t"/>
+<l:template name="authorblurb" text="%t"/>
+<l:template name="bibliodiv" text="%t"/>
+<l:template name="biblioentry" text="%t"/>
+<l:template name="bibliography" text="%t"/>
+<l:template name="bibliolist" text="%t" lang="en"/>
+<l:template name="bibliomixed" text="%t"/>
+<l:template name="bibliomset" text="%t"/>
+<l:template name="biblioset" text="%t"/>
+<l:template name="blockquote" text="%t"/>
+<l:template name="book" text="%t"/>
+<l:template name="calloutlist" text="%t"/>
+<l:template name="caution" text="%t"/>
+<l:template name="chapter" text="ç«  %n. %t"/>
+<l:template name="colophon" text="%t"/>
+<l:template name="dedication" text="%t"/>
+<l:template name="equation" text="å…¬å¼ %n. %t"/>
+<l:template name="example" text="範例 %n. %t"/>
+<l:template name="figure" text="圖形 %n. %t"/>
+<l:template name="foil" text="%t" lang="en"/>
+<l:template name="foilgroup" text="%t" lang="en"/>
+<l:template name="formalpara" text="%t"/>
+<l:template name="glossary" text="%t"/>
+<l:template name="glossdiv" text="%t"/>
+<l:template name="glosslist" text="%t" lang="en"/>
+<l:template name="glossentry" text="%t" lang="en"/>
+<l:template name="important" text="%t"/>
+<l:template name="index" text="%t"/>
+<l:template name="indexdiv" text="%t"/>
+<l:template name="itemizedlist" text="%t"/>
+<l:template name="legalnotice" text="%t"/>
+<l:template name="listitem" text=""/>
+<l:template name="lot" text="%t"/>
+<l:template name="msg" text="%t"/>
+<l:template name="msgexplan" text="%t"/>
+<l:template name="msgmain" text="%t"/>
+<l:template name="msgrel" text="%t"/>
+<l:template name="msgset" text="%t"/>
+<l:template name="msgsub" text="%t"/>
+<l:template name="note" text="%t"/>
+<l:template name="orderedlist" text="%t"/>
+<l:template name="part" text="部 %n. %t"/>
+<l:template name="partintro" text="%t"/>
+<l:template name="preface" text="%t"/>
+<l:template name="procedure" text="%t"/>
+<l:template name="procedure.formal" text="éŽç¨‹Â %n. %t"/>
+<l:template name="productionset" text="%t"/>
+<l:template name="productionset.formal" text="奉ç»Â %n"/>
+<l:template name="qandadiv" text="%t"/>
+<l:template name="qandaentry" text="%t"/>
+<l:template name="qandaset" text="%t"/>
+<l:template name="question" text="%t"/>
+<l:template name="refentry" text="%t"/>
+<l:template name="reference" text="%t"/>
+<l:template name="refsection" text="%t" lang="en"/>
+<l:template name="refsect1" text="%t"/>
+<l:template name="refsect2" text="%t"/>
+<l:template name="refsect3" text="%t"/>
+<l:template name="refsynopsisdiv" text="%t"/>
+<l:template name="refsynopsisdivinfo" text="%t"/>
+<l:template name="segmentedlist" text="%t"/>
+<l:template name="set" text="%t"/>
+<l:template name="setindex" text="%t"/>
+<l:template name="sidebar" text="%t"/>
+<l:template name="step" text="%t"/>
+<l:template name="table" text="表格 %n. %t"/>
+<l:template name="task" text="%t" lang="en"/>
+<l:template name="tasksummary" text="%t" lang="en"/>
+<l:template name="taskprerequisites" text="%t" lang="en"/>
+<l:template name="taskrelated" text="%t" lang="en"/>
+<l:template name="tip" text="%t"/>
+<l:template name="toc" text="%t"/>
+<l:template name="variablelist" text="%t"/>
+<l:template name="varlistentry" text="" lang="en"/>
+<l:template name="warning" text="%t"/>
+</l:context>
+<l:context name="title-unnumbered"><l:template name="appendix" text="%t"/>
+<l:template name="article/appendix" text="%t" lang="en"/>
+<l:template name="bridgehead" text="%t"/>
+<l:template name="chapter" text="%t"/>
+<l:template name="sect1" text="%t"/>
+<l:template name="sect2" text="%t"/>
+<l:template name="sect3" text="%t"/>
+<l:template name="sect4" text="%t"/>
+<l:template name="sect5" text="%t"/>
+<l:template name="section" text="%t"/>
+<l:template name="simplesect" text="%t"/>
+<l:template name="part" text="%t" lang="en"/>
+</l:context>
+<l:context name="title-numbered"><l:template name="appendix" text="附錄 %n. %t"/>
+<l:template name="article/appendix" text="%n. %t" lang="en"/>
+<l:template name="bridgehead" text="%t"/>
+<l:template name="chapter" text="ç«  %n. %t"/>
+<l:template name="part" text="部 %n. %t"/>
+<l:template name="sect1" text="%n. %t"/>
+<l:template name="sect2" text="%n. %t"/>
+<l:template name="sect3" text="%n. %t"/>
+<l:template name="sect4" text="%n. %t"/>
+<l:template name="sect5" text="%n. %t"/>
+<l:template name="section" text="%n. %t"/>
+<l:template name="simplesect" text="%n. %t"/>
+</l:context>
+<l:context name="subtitle"><l:template name="appendix" text="%s"/>
+<l:template name="acknowledgements" text="%s" lang="en"/>
+<l:template name="article" text="%s"/>
+<l:template name="bibliodiv" text="%s"/>
+<l:template name="biblioentry" text="%s"/>
+<l:template name="bibliography" text="%s"/>
+<l:template name="bibliomixed" text="%s"/>
+<l:template name="bibliomset" text="%s"/>
+<l:template name="biblioset" text="%s"/>
+<l:template name="book" text="%s"/>
+<l:template name="chapter" text="%s"/>
+<l:template name="colophon" text="%s"/>
+<l:template name="dedication" text="%s"/>
+<l:template name="glossary" text="%s"/>
+<l:template name="glossdiv" text="%s"/>
+<l:template name="index" text="%s"/>
+<l:template name="indexdiv" text="%s"/>
+<l:template name="lot" text="%s"/>
+<l:template name="part" text="%s"/>
+<l:template name="partintro" text="%s"/>
+<l:template name="preface" text="%s"/>
+<l:template name="refentry" text="%s"/>
+<l:template name="reference" text="%s"/>
+<l:template name="refsection" text="%s" lang="en"/>
+<l:template name="refsect1" text="%s"/>
+<l:template name="refsect2" text="%s"/>
+<l:template name="refsect3" text="%s"/>
+<l:template name="refsynopsisdiv" text="%s"/>
+<l:template name="sect1" text="%s"/>
+<l:template name="sect2" text="%s"/>
+<l:template name="sect3" text="%s"/>
+<l:template name="sect4" text="%s"/>
+<l:template name="sect5" text="%s"/>
+<l:template name="section" text="%s"/>
+<l:template name="set" text="%s"/>
+<l:template name="setindex" text="%s"/>
+<l:template name="sidebar" text="%s"/>
+<l:template name="simplesect" text="%s"/>
+<l:template name="toc" text="%s"/>
+</l:context>
+<l:context name="xref"><l:template name="abstract" text="%t"/>
+<l:template name="acknowledgements" text="%t" lang="en"/>
+<l:template name="answer" text="答: %n"/>
+<l:template name="appendix" text="%t"/>
+<l:template name="article" text="%t"/>
+<l:template name="authorblurb" text="%t"/>
+<l:template name="bibliodiv" text="%t"/>
+<l:template name="bibliography" text="%t"/>
+<l:template name="bibliomset" text="%t"/>
+<l:template name="biblioset" text="%t"/>
+<l:template name="blockquote" text="%t"/>
+<l:template name="book" text="%t"/>
+<l:template name="calloutlist" text="%t"/>
+<l:template name="caution" text="%t"/>
+<l:template name="chapter" text="%t"/>
+<l:template name="colophon" text="%t"/>
+<l:template name="constraintdef" text="%t"/>
+<l:template name="dedication" text="%t"/>
+<l:template name="equation" text="%t"/>
+<l:template name="example" text="%t"/>
+<l:template name="figure" text="%t"/>
+<l:template name="foil" text="%t" lang="en"/>
+<l:template name="foilgroup" text="%t" lang="en"/>
+<l:template name="formalpara" text="%t"/>
+<l:template name="glossary" text="%t"/>
+<l:template name="glossdiv" text="%t"/>
+<l:template name="important" text="%t"/>
+<l:template name="index" text="%t"/>
+<l:template name="indexdiv" text="%t"/>
+<l:template name="itemizedlist" text="%t"/>
+<l:template name="legalnotice" text="%t"/>
+<l:template name="listitem" text="%n"/>
+<l:template name="lot" text="%t"/>
+<l:template name="msg" text="%t"/>
+<l:template name="msgexplan" text="%t"/>
+<l:template name="msgmain" text="%t"/>
+<l:template name="msgrel" text="%t"/>
+<l:template name="msgset" text="%t"/>
+<l:template name="msgsub" text="%t"/>
+<l:template name="note" text="%t"/>
+<l:template name="orderedlist" text="%t"/>
+<l:template name="part" text="%t"/>
+<l:template name="partintro" text="%t"/>
+<l:template name="preface" text="%t"/>
+<l:template name="procedure" text="%t"/>
+<l:template name="productionset" text="%t"/>
+<l:template name="qandadiv" text="%t"/>
+<l:template name="qandaentry" text="å•ï¼šÂ %n"/>
+<l:template name="qandaset" text="%t"/>
+<l:template name="question" text="å•ï¼šÂ %n"/>
+<l:template name="reference" text="%t"/>
+<l:template name="refsynopsisdiv" text="%t"/>
+<l:template name="segmentedlist" text="%t"/>
+<l:template name="set" text="%t"/>
+<l:template name="setindex" text="%t"/>
+<l:template name="sidebar" text="%t"/>
+<l:template name="table" text="%t"/>
+<l:template name="task" text="%t" lang="en"/>
+<l:template name="tip" text="%t"/>
+<l:template name="toc" text="%t"/>
+<l:template name="variablelist" text="%t"/>
+<l:template name="varlistentry" text="%n"/>
+<l:template name="warning" text="%t"/>
+<l:template name="olink.document.citation" text=" in %o" lang="en"/>
+<l:template name="olink.page.citation" text=" (page %p)" lang="en"/>
+<l:template name="page.citation" text=" [%p]"/>
+<l:template name="page" text="(page %p)" lang="en"/>
+<l:template name="docname" text=" in %o" lang="en"/>
+<l:template name="docnamelong" text=" in the document titled %o" lang="en"/>
+<l:template name="pageabbrev" text="(p. %p)" lang="en"/>
+<l:template name="Page" text="Page %p" lang="en"/>
+<l:template name="bridgehead" text="“%tâ€"/>
+<l:template name="refsection" text="“%tâ€"/>
+<l:template name="refsect1" text="“%tâ€"/>
+<l:template name="refsect2" text="“%tâ€"/>
+<l:template name="refsect3" text="“%tâ€"/>
+<l:template name="sect1" text="“%tâ€"/>
+<l:template name="sect2" text="“%tâ€"/>
+<l:template name="sect3" text="“%tâ€"/>
+<l:template name="sect4" text="“%tâ€"/>
+<l:template name="sect5" text="“%tâ€"/>
+<l:template name="section" text="“%tâ€"/>
+<l:template name="simplesect" text="“%tâ€"/>
+</l:context>
+<l:context name="xref-number"><l:template name="answer" text="答: %n"/>
+<l:template name="appendix" text="附錄 %n"/>
+<l:template name="bridgehead" text="節 %n"/>
+<l:template name="chapter" text="章 %n"/>
+<l:template name="equation" text="å…¬å¼Â %n"/>
+<l:template name="example" text="範例 %n"/>
+<l:template name="figure" text="圖形 %n"/>
+<l:template name="part" text="部 %n"/>
+<l:template name="procedure" text="éŽç¨‹Â %n"/>
+<l:template name="productionset" text="奉ç»Â %n"/>
+<l:template name="qandadiv" text="å•ç­” %n"/>
+<l:template name="qandaentry" text="å•ï¼šÂ %n"/>
+<l:template name="question" text="å•ï¼šÂ %n"/>
+<l:template name="sect1" text="節 %n"/>
+<l:template name="sect2" text="節 %n"/>
+<l:template name="sect3" text="節 %n"/>
+<l:template name="sect4" text="節 %n"/>
+<l:template name="sect5" text="節 %n"/>
+<l:template name="section" text="節 %n"/>
+<l:template name="table" text="表格 %n"/>
+</l:context>
+<l:context name="xref-number-and-title"><l:template name="appendix" text="附錄 %n, %t"/>
+<l:template name="bridgehead" text="節 %n, “%tâ€"/>
+<l:template name="chapter" text="章 %n, %t"/>
+<l:template name="equation" text="å…¬å¼Â %n, “%tâ€"/>
+<l:template name="example" text="範例 %n, “%tâ€"/>
+<l:template name="figure" text="圖形 %n, “%tâ€"/>
+<l:template name="part" text="部 %n, “%tâ€"/>
+<l:template name="procedure" text="éŽç¨‹Â %n, “%tâ€"/>
+<l:template name="productionset" text="奉ç»Â %n, “%tâ€"/>
+<l:template name="qandadiv" text="å•ç­” %n, “%tâ€"/>
+<l:template name="refsect1" text="一節 “%tâ€"/>
+<l:template name="refsect2" text="一節 “%tâ€"/>
+<l:template name="refsect3" text="一節 “%tâ€"/>
+<l:template name="refsection" text="一節 “%tâ€"/>
+<l:template name="sect1" text="節 %n, “%tâ€"/>
+<l:template name="sect2" text="節 %n, “%tâ€"/>
+<l:template name="sect3" text="節 %n, “%tâ€"/>
+<l:template name="sect4" text="節 %n, “%tâ€"/>
+<l:template name="sect5" text="節 %n, “%tâ€"/>
+<l:template name="section" text="節 %n, “%tâ€"/>
+<l:template name="simplesect" text="一節 “%tâ€"/>
+<l:template name="table" text="表格 %n, “%tâ€"/>
+</l:context>
+<l:context name="authorgroup"><l:template name="sep" text=", "/>
+<l:template name="sep2" text=" 且 "/>
+<l:template name="seplast" text=", 且 "/>
+</l:context>
+<l:context name="glossary"><l:template name="see" text="åƒè¦‹ %t."/>
+<l:template name="seealso" text="å¦åƒè¦‹ %t."/>
+<l:template name="seealso-separator" text=", "/>
+</l:context>
+<l:context name="msgset"><l:template name="MsgAud" text="讀者: "/>
+<l:template name="MsgLevel" text="程度: "/>
+<l:template name="MsgOrig" text="出處: "/>
+</l:context>
+<l:context name="datetime"><l:template name="format" text="m/d/Y"/>
+</l:context>
+<l:context name="termdef"><l:template name="prefix" text="[Definition: "/>
+<l:template name="suffix" text="]"/>
+</l:context>
+<l:context name="datetime-full"><l:template name="January" text="一月"/>
+<l:template name="February" text="二月"/>
+<l:template name="March" text="三月"/>
+<l:template name="April" text="四月"/>
+<l:template name="May" text="五月"/>
+<l:template name="June" text="六月"/>
+<l:template name="July" text="七月"/>
+<l:template name="August" text="八月"/>
+<l:template name="September" text="ä¹æœˆ"/>
+<l:template name="October" text="å月"/>
+<l:template name="November" text="å一月"/>
+<l:template name="December" text="å二月"/>
+<l:template name="Monday" text="星期一"/>
+<l:template name="Tuesday" text="星期二"/>
+<l:template name="Wednesday" text="星期三"/>
+<l:template name="Thursday" text="星期四"/>
+<l:template name="Friday" text="星期五"/>
+<l:template name="Saturday" text="星期六"/>
+<l:template name="Sunday" text="星期日"/>
+</l:context>
+<l:context name="datetime-abbrev"><l:template name="Jan" text="一月"/>
+<l:template name="Feb" text="二月"/>
+<l:template name="Mar" text="三月"/>
+<l:template name="Apr" text="四月"/>
+<l:template name="May" text="五月"/>
+<l:template name="Jun" text="六月"/>
+<l:template name="Jul" text="七月"/>
+<l:template name="Aug" text="八月"/>
+<l:template name="Sep" text="ä¹æœˆ"/>
+<l:template name="Oct" text="10月"/>
+<l:template name="Nov" text="11月"/>
+<l:template name="Dec" text="12月"/>
+<l:template name="Mon" text="一"/>
+<l:template name="Tue" text="二"/>
+<l:template name="Wed" text="三"/>
+<l:template name="Thu" text="å››"/>
+<l:template name="Fri" text="五"/>
+<l:template name="Sat" text="å…­"/>
+<l:template name="Sun" text="æ—¥"/>
+</l:context>
+<l:context name="htmlhelp"><l:template name="langcode" text="0x0404 Chinese (TAIWAN)"/>
+</l:context>
+<l:context name="index"><l:template name="term-separator" text=", "/>
+<l:template name="number-separator" text=", "/>
+<l:template name="range-separator" text="-"/>
+</l:context>
+<l:context name="iso690"><l:template name="lastfirst.sep" text=", "/>
+<l:template name="alt.person.two.sep" text=" – "/>
+<l:template name="alt.person.last.sep" text=" – "/>
+<l:template name="alt.person.more.sep" text=" – "/>
+<l:template name="primary.editor" text=" (ed.)"/>
+<l:template name="primary.many" text=", et al."/>
+<l:template name="primary.sep" text=". "/>
+<l:template name="submaintitle.sep" text=": "/>
+<l:template name="title.sep" text=". "/>
+<l:template name="othertitle.sep" text=", "/>
+<l:template name="medium1" text=" ["/>
+<l:template name="medium2" text="]"/>
+<l:template name="secondary.person.sep" text="; "/>
+<l:template name="secondary.sep" text=". "/>
+<l:template name="respons.sep" text=". "/>
+<l:template name="edition.sep" text=". "/>
+<l:template name="edition.serial.sep" text=", "/>
+<l:template name="issuing.range" text="-"/>
+<l:template name="issuing.div" text=", "/>
+<l:template name="issuing.sep" text=". "/>
+<l:template name="partnr.sep" text=". "/>
+<l:template name="placepubl.sep" text=": "/>
+<l:template name="publyear.sep" text=", "/>
+<l:template name="pubinfo.sep" text=". "/>
+<l:template name="spec.pubinfo.sep" text=", "/>
+<l:template name="upd.sep" text=", "/>
+<l:template name="datecit1" text=" [cited "/>
+<l:template name="datecit2" text="]"/>
+<l:template name="extent.sep" text=". "/>
+<l:template name="locs.sep" text=", "/>
+<l:template name="location.sep" text=". "/>
+<l:template name="serie.sep" text=". "/>
+<l:template name="notice.sep" text=". "/>
+<l:template name="access" text="Available "/>
+<l:template name="acctoo" text="Also available "/>
+<l:template name="onwww" text="from World Wide Web"/>
+<l:template name="oninet" text="from Internet"/>
+<l:template name="access.end" text=": "/>
+<l:template name="link1" text="&lt;"/>
+<l:template name="link2" text="&gt;"/>
+<l:template name="access.sep" text=". "/>
+<l:template name="isbn" text="ISBN "/>
+<l:template name="issn" text="ISSN "/>
+<l:template name="stdnum.sep" text=". "/>
+<l:template name="patcountry.sep" text=". "/>
+<l:template name="pattype.sep" text=", "/>
+<l:template name="patnum.sep" text=". "/>
+<l:template name="patdate.sep" text=". "/>
+</l:context><l:letters><l:l i="-1"/>
+<l:l i="0">符號</l:l>
+<l:l i="10">A</l:l>
+<l:l i="10">a</l:l>
+<l:l i="20">B</l:l>
+<l:l i="20">b</l:l>
+<l:l i="30">C</l:l>
+<l:l i="30">c</l:l>
+<l:l i="40">D</l:l>
+<l:l i="40">d</l:l>
+<l:l i="50">E</l:l>
+<l:l i="50">e</l:l>
+<l:l i="60">F</l:l>
+<l:l i="60">f</l:l>
+<l:l i="70">G</l:l>
+<l:l i="70">g</l:l>
+<l:l i="80">H</l:l>
+<l:l i="80">h</l:l>
+<l:l i="90">I</l:l>
+<l:l i="90">i</l:l>
+<l:l i="100">J</l:l>
+<l:l i="100">j</l:l>
+<l:l i="110">K</l:l>
+<l:l i="110">k</l:l>
+<l:l i="120">L</l:l>
+<l:l i="120">l</l:l>
+<l:l i="130">M</l:l>
+<l:l i="130">m</l:l>
+<l:l i="140">N</l:l>
+<l:l i="140">n</l:l>
+<l:l i="150">O</l:l>
+<l:l i="150">o</l:l>
+<l:l i="160">P</l:l>
+<l:l i="160">p</l:l>
+<l:l i="170">Q</l:l>
+<l:l i="170">q</l:l>
+<l:l i="180">R</l:l>
+<l:l i="180">r</l:l>
+<l:l i="190">S</l:l>
+<l:l i="190">s</l:l>
+<l:l i="200">T</l:l>
+<l:l i="200">t</l:l>
+<l:l i="210">U</l:l>
+<l:l i="210">u</l:l>
+<l:l i="220">V</l:l>
+<l:l i="220">v</l:l>
+<l:l i="230">W</l:l>
+<l:l i="230">w</l:l>
+<l:l i="240">X</l:l>
+<l:l i="240">x</l:l>
+<l:l i="250">Y</l:l>
+<l:l i="250">y</l:l>
+<l:l i="260">Z</l:l>
+<l:l i="260">z</l:l>
+</l:letters>
+</l:l10n>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/docsrc/authors.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/docsrc/authors.xml
new file mode 100644
index 0000000..ea4bf02
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/docsrc/authors.xml
@@ -0,0 +1,10 @@
+<authorgroup xmlns="http://docbook.org/ns/docbook" version="5.0">
+ <author>
+ <personname>
+ <surname>Walsh</surname><firstname>Norman</firstname>
+ </personname>
+ </author>
+ <author>
+ <orgname>The DocBook Project</orgname>
+ </author>
+</authorgroup>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/docsrc/copyright.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/docsrc/copyright.xml
new file mode 100644
index 0000000..505f7f8
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/docsrc/copyright.xml
@@ -0,0 +1,18 @@
+<info xmlns="http://docbook.org/ns/docbook" version="5.0">
+ <copyright>
+ <year>1999-2007</year>
+ <holder>Norman Walsh</holder>
+ </copyright>
+ <copyright>
+ <year>2003</year>
+ <holder>Jiří Kosek</holder>
+ </copyright>
+ <copyright>
+ <year>2004-2007</year>
+ <holder>Steve Ball</holder>
+ </copyright>
+ <copyright>
+ <year>2001-2007</year>
+ <holder>The DocBook Project</holder>
+ </copyright>
+</info>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/docsrc/license.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/docsrc/license.xml
new file mode 100644
index 0000000..c265ce8
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/docsrc/license.xml
@@ -0,0 +1,23 @@
+<legalnotice xmlns="http://docbook.org/ns/docbook" version="5.0"
+ xml:id="copyright"><title>License</title>
+<para>Permission is hereby granted, free of charge, to any person
+obtaining a copy of this software and associated documentation files
+(the <quote>Software</quote>), to deal in the Software without
+restriction, including without limitation the rights to use, copy,
+modify, merge, publish, distribute, sublicense, and/or sell copies of
+the Software, and to permit persons to whom the Software is furnished
+to do so, subject to the following conditions:
+</para>
+<para>The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.</para>
+<para>Except as contained in this notice, the names of individuals
+credited with contribution to this software shall not be used in
+advertising or otherwise to promote the sale, use or other dealings in
+this Software without prior written authorization from the individuals
+in question.</para>
+<para>Any stylesheet derived from this Software that is publically
+distributed will be identified with a different name and the version
+strings in any derived Software will be changed so that no possibility
+of confusion between the derived package and this Software will
+exist.</para>
+</legalnotice>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/docsrc/reference.css b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/docsrc/reference.css
new file mode 100644
index 0000000..9e7e511
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/docsrc/reference.css
@@ -0,0 +1,79 @@
+/* reference.css, a stylesheet for reference documentation
+ * generated by the DocBook XSL Stylesheets */
+/* $Id: reference.css 8234 2009-02-09 12:10:48Z xmldoc $ */
+
+div.legalnotice {
+ font-size: 80%;
+}
+
+div.note, div.tip, div.warning {
+ margin-left: 5%;
+ margin-right: 10%;
+ padding: 5px;
+}
+
+div.note, div.tip {
+ border-left: solid #d5dee3 20px;
+ border-right: solid #d5dee3 20px;
+}
+
+div.note, div.tip {
+ border-left: solid palegreen 20px;
+ border-right: solid palegreen 20px;
+}
+
+div.warning {
+ border-left: solid yellow 20px;
+ border-right: solid yellow 20px;
+}
+
+div.note p, div.tip p, div.warning p {
+ margin-top: 0px;
+ margin-bottom: 4px;
+}
+
+div.note h3, div.tip h3, div.warning h3 {
+ margin-top: 0;
+}
+
+div.informalexample {
+ background-color: #d5dee3;
+ border-top-width: 2px;
+ border-top-style: double;
+ border-top-color: #d3d3d3;
+ border-bottom-width: 2px;
+ border-bottom-style: double;
+ border-bottom-color: #d3d3d3;
+ padding: 4px;
+ margin: 0em;
+ margin-left: 2em;
+}
+
+pre.programlisting, pre.synopsis {
+ whitespace: pre;
+ font-family: monospace;
+ background-color: #d5dee3;
+ border-top-width: 1px;
+ border-top-style: single;
+ border-top-color: #d3d3d3;
+ border-bottom-width: 1px;
+ border-bottom-style: single;
+ border-bottom-color: #d3d3d3;
+ padding: 4px;
+ margin: 0em;
+ margin-top: 6px;
+ margin-bottom: 6px;
+}
+
+div.informalexample pre {
+ whitespace: pre;
+ font-family: monospace;
+ border-top-width: 0px;
+ border-bottom-width: 0px;
+ padding: 0px;
+}
+
+/* Parameter and PI titles */
+ div.refnamediv h2 {
+ font-size: 2em;
+}
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/docsrc/reference.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/docsrc/reference.xml
new file mode 100644
index 0000000..7d49306
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/docsrc/reference.xml
@@ -0,0 +1,229 @@
+<set xmlns="http://docbook.org/ns/docbook" version="5.0"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xml:base="../docsrc/"
+ >
+ <!-- * WARNING WARNING WARNING -->
+ <!-- * WARNING WARNING WARNING -->
+ <!-- * -->
+ <!-- * This document has duplicate IDs in it and is intended for -->
+ <!-- * processing using the chunk.xsl stylesheet to generate chunked -->
+ <!-- * output from it (not for generating a single HTML output file) -->
+ <!-- * -->
+ <!-- * WARNING WARNING WARNING -->
+ <!-- * WARNING WARNING WARNING -->
+ <title>DocBook XSL Stylesheets: Reference Documentation</title>
+ <info><releaseinfo role="meta">$Id: reference.xml 8321 2009-03-12 18:20:36Z mzjn $ </releaseinfo>
+ <xi:include href="./authors.xml"/>
+ <xi:include href="./copyright.xml" xpointer="xpointer(//*[local-name() = 'copyright'])"/>
+ <xi:include href="./license.xml"/>
+ <xi:include href="./warranty.xml"/>
+ <abstract xml:id="about">
+ <title>About this document</title>
+ <para>This is generated reference documentation for the DocBook
+ XSL stylesheets. It is available in the following formats:
+ <itemizedlist>
+ <listitem>
+ <para><link
+ xlink:href="http://docbook.sourceforge.net/release/xsl/current/doc/reference.html"
+ >HTML</link>,
+ <link
+ xlink:href="http://docbook.sourceforge.net/release/xsl/current/doc/reference.pdf"
+ >PDF</link>,
+ <link
+ xlink:href="http://docbook.sourceforge.net/release/xsl/current/doc/reference.txt"
+ >plain text</link></para>
+ </listitem>
+ </itemizedlist>
+ This is primarily documentation on the parameters and processing instructions you can use
+ to control the behavior of the stylesheets.
+ <note>
+ <para>This is purely reference documentation&#xa0;– not how-to
+ documentation. For a thorough step-by-step how-to guide to
+ publishing content using the DocBook XSL stylesheets, see
+ Bob Stayton’s <link
+ xlink:href="http://www.sagehill.net/book-description.html"
+ >DocBook XSL: The Complete Guide</link>, available online
+ at <link
+ xlink:href="http://www.sagehill.net/docbookxsl/index.html"
+ >http://www.sagehill.net/docbookxsl/index.html</link>
+ </para>
+ </note>
+ This document is divided into three sets of references:
+ the first two sets provides user documentation; the third,
+ developer documentation.</para>
+ </abstract>
+ </info>
+ <book xml:id="param"><title>DocBook XSL Stylesheets User Reference: Parameters</title>
+ <info>
+ <abstract>
+ <para>This is generated reference documentation for all
+ user-configurable parameters in the DocBook XSL
+ stylesheets.
+ <note>
+ <para>This is purely reference documentation&#xa0;– not how-to
+ documentation. For a thorough step-by-step how-to guide to
+ publishing content using the DocBook XSL stylesheets, see
+ Bob Stayton’s <link
+ xlink:href="http://www.sagehill.net/book-description.html"
+ >DocBook XSL: The Complete Guide</link>, available online
+ at <link
+ xlink:href="http://www.sagehill.net/docbookxsl/index.html"
+ >http://www.sagehill.net/docbookxsl/index.html</link>
+ </para>
+ </note>
+ </para>
+ </abstract>
+ </info>
+ <part xml:id="html">
+ <?dbhtml dir="html"?>
+ <?dbhtml filename="index.html"?>
+ <xi:include href="../html/param.xml" xpointer="xpointer(/book/info/title)" />
+ <partintro xml:id="htmlintro">
+ <xi:include href="../html/param.xml" xpointer="xpointer(/book/info/abstract/node())" />
+ </partintro>
+ <xi:include href="../html/param.xml" xpointer="xpointer(/book/reference)" />
+ </part>
+ <part xml:id="fo">
+ <?dbhtml dir="fo"?>
+ <?dbhtml filename="index.html"?>
+ <xi:include href="../fo/param.xml" xpointer="xpointer(/book/info/title)" />
+ <partintro xml:id="fointro">
+ <xi:include href="../fo/param.xml" xpointer="xpointer(/book/info/abstract/node())" />
+ </partintro>
+ <xi:include href="../fo/param.xml" xpointer="xpointer(/book/reference)" />
+ </part>
+ <part xml:id="manpages">
+ <?dbhtml dir="manpages"?>
+ <?dbhtml filename="index.html"?>
+ <xi:include href="../manpages/param.xml" xpointer="xpointer(/book/info/title)" />
+ <partintro xml:id="manintro">
+ <xi:include href="../manpages/param.xml" xpointer="xpointer(/book/info/abstract/node())" />
+ </partintro>
+ <xi:include href="../manpages/param.xml" xpointer="xpointer(/book/reference)" />
+ </part>
+ <part xml:id="roundtrip">
+ <?dbhtml dir="roundtrip"?>
+ <?dbhtml filename="index.html"?>
+ <xi:include href="../roundtrip/param.xml" xpointer="xpointer(/book/info/title)" />
+ <partintro xml:id="roundtripintro">
+ <xi:include href="../roundtrip/param.xml" xpointer="xpointer(/book/info/abstract/node())" />
+ </partintro>
+ <xi:include href="../roundtrip/param.xml" xpointer="xpointer(/book/reference/node()[not(self::title)])" />
+ </part>
+ <part xml:id="slides"><title>Slides Parameter Reference</title>
+ <?dbhtml dir="slides"?>
+ <?dbhtml filename="index.html"?>
+ <partintro xml:id="slidesintro">
+ <para>This is reference documentation for all
+ user-configurable parameters in the DocBook XSL Slides
+ stylesheets (for generating HTML and PDF slide
+ presentations).</para>
+ <note>
+ <para>The Slides stylesheet for HTML output is a
+ customization layer of the DocBook XSL HTML
+ stylesheet; the Slides stylesheet for FO output is a
+ customization layer of the DocBook XSL FO stylesheet.
+ Therefore, in addition to the slides-specific
+ parameters listed in this section, you can also use a
+ number of <link xlink:href="../html">HTML stylesheet
+ parameters</link> and <link xlink:href="../fo">FO
+ stylesheet parameters</link> to control Slides
+ output.</para>
+ </note>
+ </partintro>
+ <xi:include href="../slides/html/param.xml" xpointer="xpointer(/book/reference)" />
+ <xi:include href="../slides/fo/param.xml" xpointer="xpointer(/book/reference)" />
+ </part>
+ <part xml:id="website">
+ <?dbhtml dir="website"?>
+ <?dbhtml filename="index.html"?>
+ <xi:include href="../website/param.xml" xpointer="xpointer(/book/info/title)" />
+ <partintro xml:id="websiteintro">
+ <xi:include href="../website/param.xml" xpointer="xpointer(/book/info/abstract/node())" />
+ </partintro>
+ <xi:include href="../website/param.xml" xpointer="xpointer(/book/reference)" />
+ </part>
+ </book>
+ <book xml:id="pi"><title>DocBook XSL Stylesheets User Reference: PIs</title>
+ <?dbhtml dir="pi"?>
+ <?dbhtml filename="index.html"?>
+ <info>
+ <abstract>
+ <para>This is generated reference documentation for all
+ user-specifiable processing instructions in the DocBook
+ XSL stylesheets.
+ <note>
+ <para>You add these PIs at particular points in a document to
+ cause specific “exceptions†to formatting/output behavior. To
+ make global changes in formatting/output behavior across an
+ entire document, it’s better to do it by setting an
+ appropriate stylesheet parameter (if there is one).</para>
+ </note>
+ </para>
+ </abstract>
+ </info>
+ <part xml:id="pi-html">
+ <xi:include href="../html/pi.xml" xpointer="xpointer(/reference/node())" />
+ </part>
+ <part xml:id="pi-fo">
+ <xi:include href="../fo/pi.xml" xpointer="xpointer(/reference/node())" />
+ </part>
+ <part xml:id="pi-man">
+ <xi:include href="../manpages/pi.xml" xpointer="xpointer(/reference/node())" />
+ </part>
+ <part xml:id="pi-common">
+ <xi:include href="../common/pi.xml" xpointer="xpointer(/reference/node())" />
+ </part>
+ </book>
+ <book xml:id="developer"><title>DocBook XSL Stylesheets Developer Reference</title>
+ <info>
+ <abstract>
+ <para>This is technical reference documentation for
+ developers using the DocBook XSL Stylesheets. It is not
+ intended to be user documentation, but is instead
+ provided for developers writing customization layers for
+ the stylesheets.</para>
+ </abstract>
+ </info>
+ <part xml:id="lib">
+ <?dbhtml dir="lib"?>
+ <?dbhtml filename="index.html"?>
+ <xi:include href="../lib/lib.xml" xpointer="xpointer(/book/info/title)" />
+ <partintro xml:id="libintro">
+ <xi:include href="../lib/lib.xml" xpointer="xpointer(/book/info/abstract/node())" />
+ </partintro>
+ <xi:include href="../lib/lib.xml" xpointer="xpointer(/book/reference)" />
+ </part>
+ <part xml:id="common-part"><title>Common Template Reference</title>
+ <?dbhtml dir="common"?>
+ <?dbhtml filename="index.html"?>
+ <info>
+ <abstract>
+ <para>This is technical reference documentation for the
+ “baseâ€, “refentryâ€, and “utility†sets of common
+ templates in the DocBook XSL Stylesheets. These
+ templates are “common†in that they are shared across
+ output formats (that is, they’re not
+ output-format-dependent)</para>
+ <para>This documentation is not intended to be user
+ documentation. It is provided for developers writing
+ customization layers for the stylesheets.</para>
+ </abstract>
+ </info>
+ <xi:include href="../common/common.xml"/>
+ <xi:include href="../common/refentry.xml"/>
+ <xi:include href="../common/utility.xml"/>
+ <xi:include href="../common/charmap.xml"/>
+ </part>
+ <part xml:id="table-templates">
+ <xi:include href="../fo/table.xml" xpointer="xpointer(/reference/node())"/>
+ </part>
+ <part xml:id="template">
+ <xi:include href="../template/titlepage.xml" xpointer="xpointer(/reference/node())"/>
+ </part>
+ </book>
+</set>
+<!-- * vim: set ft=docbk foldlevel=2: -->
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/docsrc/reference.xml.included b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/docsrc/reference.xml.included
new file mode 100644
index 0000000..94869ee
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/docsrc/reference.xml.included
@@ -0,0 +1,33905 @@
+<?xml version="1.0" encoding="ASCII"?><set xmlns="http://docbook.org/ns/docbook" xmlns:xi="http://www.w3.org/2001/XInclude" xmlns:src="http://nwalsh.com/xmlns/litprog/fragment" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xlink="http://www.w3.org/1999/xlink" version="5.0" xml:base="../docsrc/">
+ <!-- * WARNING WARNING WARNING -->
+ <!-- * WARNING WARNING WARNING -->
+ <!-- * -->
+ <!-- * This document has duplicate IDs in it and is intended for -->
+ <!-- * processing using the chunk.xsl stylesheet to generate chunked -->
+ <!-- * output from it (not for generating a single HTML output file) -->
+ <!-- * -->
+ <!-- * WARNING WARNING WARNING -->
+ <!-- * WARNING WARNING WARNING -->
+ <title>DocBook XSL Stylesheets: Reference&#160;Documentation</title>
+ <info><releaseinfo role="meta">$Id: reference.xml 8321 2009-03-12 18:20:36Z mzjn $ </releaseinfo>
+ <authorgroup version="5.0">
+ <author>
+ <personname>
+ <surname>Walsh</surname><firstname>Norman</firstname>
+ </personname>
+ </author>
+ <author>
+ <orgname>The DocBook Project</orgname>
+ </author>
+</authorgroup>
+ <copyright>
+ <year>1999-2007</year>
+ <holder>Norman Walsh</holder>
+ </copyright><copyright>
+ <year>2003</year>
+ <holder>Ji&#345;&#237; Kosek</holder>
+ </copyright><copyright>
+ <year>2004-2007</year>
+ <holder>Steve Ball</holder>
+ </copyright><copyright>
+ <year>2001-2007</year>
+ <holder>The DocBook Project</holder>
+ </copyright>
+ <legalnotice version="5.0" id="copyright"><title>License</title>
+<para>Permission is hereby granted, free of charge, to any person
+obtaining a copy of this software and associated documentation files
+(the <quote>Software</quote>), to deal in the Software without
+restriction, including without limitation the rights to use, copy,
+modify, merge, publish, distribute, sublicense, and/or sell copies of
+the Software, and to permit persons to whom the Software is furnished
+to do so, subject to the following conditions:
+</para>
+<para>The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.</para>
+<para>Except as contained in this notice, the names of individuals
+credited with contribution to this software shall not be used in
+advertising or otherwise to promote the sale, use or other dealings in
+this Software without prior written authorization from the individuals
+in question.</para>
+<para>Any stylesheet derived from this Software that is publically
+distributed will be identified with a different name and the version
+strings in any derived Software will be changed so that no possibility
+of confusion between the derived package and this Software will
+exist.</para>
+</legalnotice>
+ <legalnotice version="5.0" id="warranty"><title>Warranty</title>
+<para>THE SOFTWARE IS PROVIDED <quote>AS IS</quote>,
+WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT
+LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
+PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL NORMAN WALSH OR ANY
+OTHER CONTRIBUTOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT
+OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.</para>
+</legalnotice>
+ <abstract id="about">
+ <title>About this document</title>
+ <para>This is generated reference documentation for the DocBook
+ XSL stylesheets. It is available in the following formats:
+ <itemizedlist>
+ <listitem>
+ <para><link xlink:href="http://docbook.sourceforge.net/release/xsl/current/doc/reference.html">HTML</link>,
+ <link xlink:href="http://docbook.sourceforge.net/release/xsl/current/doc/reference.pdf">PDF</link>,
+ <link xlink:href="http://docbook.sourceforge.net/release/xsl/current/doc/reference.txt">plain text</link></para>
+ </listitem>
+ </itemizedlist>
+ This is primarily documentation on the parameters and processing instructions you can use
+ to control the behavior of the stylesheets.
+ <note>
+ <para>This is purely reference documentation&#160;&#8211; not how-to
+ documentation. For a thorough step-by-step how-to guide to
+ publishing content using the DocBook XSL stylesheets, see
+ Bob Stayton&#8217;s <link xlink:href="http://www.sagehill.net/book-description.html">DocBook XSL: The Complete Guide</link>, available online
+ at <link xlink:href="http://www.sagehill.net/docbookxsl/index.html">http://www.sagehill.net/docbookxsl/index.html</link>
+ </para>
+ </note>
+ This document is divided into three sets of references:
+ the first two sets provides user documentation; the third,
+ developer documentation.</para>
+ </abstract>
+ </info>
+ <book id="param"><title>DocBook XSL Stylesheets User&#160;Reference:&#160;Parameters</title>
+ <info>
+ <abstract>
+ <para>This is generated reference documentation for all
+ user-configurable parameters in the DocBook XSL
+ stylesheets.
+ <note>
+ <para>This is purely reference documentation&#160;&#8211; not how-to
+ documentation. For a thorough step-by-step how-to guide to
+ publishing content using the DocBook XSL stylesheets, see
+ Bob Stayton&#8217;s <link xlink:href="http://www.sagehill.net/book-description.html">DocBook XSL: The Complete Guide</link>, available online
+ at <link xlink:href="http://www.sagehill.net/docbookxsl/index.html">http://www.sagehill.net/docbookxsl/index.html</link>
+ </para>
+ </note>
+ </para>
+ </abstract>
+ </info>
+ <part id="html">
+ <?dbhtml dir="html"?>
+ <?dbhtml filename="index.html"?>
+ <title xml:base="../html/param.xml">HTML Parameter Reference</title>
+ <partintro id="htmlintro">
+
+ <para xml:base="../html/param.xml">This is reference documentation for all user-configurable
+ parameters in the DocBook XSL HTML stylesheets (for generating
+ HTML output).</para>
+
+ </partintro>
+ <reference id="admons" xml:base="../html/param.xml"><title>Admonitions</title>
+<refentry version="5.0" id="admon.graphics.extension">
+<refmeta>
+<refentrytitle>admon.graphics.extension</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>admon.graphics.extension</refname>
+<refpurpose>Filename extension for admonition graphics</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="admon.graphics.extension.frag">
+&lt;xsl:param name="admon.graphics.extension"&gt;.png&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Sets the filename extension to use on admonition graphics.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="admon.graphics.path">
+<refmeta>
+<refentrytitle>admon.graphics.path</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>admon.graphics.path</refname>
+<refpurpose>Path to admonition graphics</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="admon.graphics.path.frag">&lt;xsl:param name="admon.graphics.path"&gt;images/&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Sets the path to the directory containing the admonition graphics
+(caution.png, important.png etc). This location is normally relative
+to the output html directory. See <parameter>base.dir</parameter></para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="admon.graphics">
+<refmeta>
+<refentrytitle>admon.graphics</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>admon.graphics</refname>
+<refpurpose>Use graphics in admonitions?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="admon.graphics.frag">
+&lt;xsl:param name="admon.graphics" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If true (non-zero), admonitions are presented in an alternate style that uses
+a graphic. Default graphics are provided in the distribution.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="admon.textlabel">
+<refmeta>
+<refentrytitle>admon.textlabel</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>admon.textlabel</refname>
+<refpurpose>Use text label in admonitions?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="admon.textlabel.frag">
+&lt;xsl:param name="admon.textlabel" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If true (non-zero), admonitions are presented with a generated
+text label such as Note or Warning in the appropriate language.
+If zero, such labels are turned off, but any title child
+of the admonition element are still output.
+The default value is 1.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="admon.style">
+<refmeta>
+<refentrytitle>admon.style</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>admon.style</refname>
+<refpurpose>Specifies the CSS style attribute that should be added to
+admonitions.</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="admon.style.frag">&lt;xsl:param name="admon.style"&gt;
+ &lt;xsl:value-of select="concat('margin-', $direction.align.start, ': 0.5in; margin-', $direction.align.end, ': 0.5in;')"&gt;&lt;/xsl:value-of&gt;
+&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies the value of the CSS <tag class="attribute">style</tag>
+attribute that should be added to admonitions.
+</para>
+
+</refsection>
+</refentry>
+
+</reference><reference id="callouts" xml:base="../html/param.xml"><title>Callouts</title>
+<refentry version="5.0" id="callout.defaultcolumn">
+<refmeta>
+<refentrytitle>callout.defaultcolumn</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">integer</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>callout.defaultcolumn</refname>
+<refpurpose>Indicates what column callouts appear in by default</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="callout.defaultcolumn.frag">
+&lt;xsl:param name="callout.defaultcolumn"&gt;60&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If a callout does not identify a column (for example, if it uses
+the <literal>linerange</literal> <tag class="attribute">unit</tag>),
+it will appear in the default column.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="callout.graphics.extension">
+<refmeta>
+<refentrytitle>callout.graphics.extension</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>callout.graphics.extension</refname>
+<refpurpose>Filename extension for callout graphics</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="callout.graphics.extension.frag">
+&lt;xsl:param name="callout.graphics.extension"&gt;.png&lt;/xsl:param&gt;
+
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+<para>Sets the filename extension to use on callout graphics. </para>
+
+<itemizedlist>
+<para>The Docbook XSL distribution provides callout graphics in the following formats:</para>
+<listitem><para>SVG (extension: <filename class="extension">.svg</filename>)</para></listitem>
+<listitem><para>PNG (extension: <filename class="extension">.png</filename>)</para></listitem>
+<listitem><para>GIF (extension: <filename class="extension">.gif</filename>)</para></listitem>
+</itemizedlist>
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="callout.graphics.number.limit">
+<refmeta>
+<refentrytitle>callout.graphics.number.limit</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">integer</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>callout.graphics.number.limit</refname>
+<refpurpose>Number of the largest callout graphic</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="callout.graphics.number.limit.frag">
+&lt;xsl:param name="callout.graphics.number.limit"&gt;15&lt;/xsl:param&gt;
+
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If <parameter>callout.graphics</parameter> is non-zero, graphics
+are used to represent callout numbers instead of plain text. The value
+of <parameter>callout.graphics.number.limit</parameter> is the largest
+number for which a graphic exists. If the callout number exceeds this
+limit, the default presentation "(plain text instead of a graphic)"
+will be used.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="callout.graphics.path">
+<refmeta>
+<refentrytitle>callout.graphics.path</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>callout.graphics.path</refname>
+<refpurpose>Path to callout graphics</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="callout.graphics.path.frag">
+&lt;xsl:param name="callout.graphics.path"&gt;images/callouts/&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Sets the path to the directory holding the callout graphics. his
+location is normally relative to the output html directory. see
+base.dir. Always terminate the directory with / since the graphic file
+is appended to this string, hence needs the separator.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="callout.graphics">
+<refmeta>
+<refentrytitle>callout.graphics</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>callout.graphics</refname>
+<refpurpose>Use graphics for callouts?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="callout.graphics.frag">
+&lt;xsl:param name="callout.graphics" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, callouts are presented with graphics (e.g., reverse-video
+circled numbers instead of "(1)", "(2)", etc.).
+Default graphics are provided in the distribution.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="callout.list.table">
+<refmeta>
+<refentrytitle>callout.list.table</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>callout.list.table</refname>
+<refpurpose>Present callout lists using a table?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="callout.list.table.frag">
+&lt;xsl:param name="callout.list.table" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The default presentation of <tag>calloutlist</tag>s uses
+an HTML <tag>DL</tag> element. Some browsers don't align DLs very well
+if <parameter>callout.graphics</parameter> is used. With this option
+turned on, <tag>calloutlist</tag>s are presented in an HTML
+<tag>TABLE</tag>, which usually results in better alignment
+of the callout number with the callout description.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="callout.unicode.number.limit">
+<refmeta>
+<refentrytitle>callout.unicode.number.limit</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">integer</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>callout.unicode.number.limit</refname>
+<refpurpose>Number of the largest unicode callout character</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="callout.unicode.number.limit.frag">
+&lt;xsl:param name="callout.unicode.number.limit"&gt;10&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If <parameter>callout.unicode</parameter>
+is non-zero, unicode characters are used to represent
+callout numbers. The value of
+<parameter>callout.unicode.number.limit</parameter>
+is
+the largest number for which a unicode character exists. If the callout number
+exceeds this limit, the default presentation "(nnn)" will always
+be used.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="callout.unicode.start.character">
+<refmeta>
+<refentrytitle>callout.unicode.start.character</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">integer</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>callout.unicode.start.character</refname>
+<refpurpose>First Unicode character to use, decimal value.</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="callout.unicode.start.character.frag">
+&lt;xsl:param name="callout.unicode.start.character"&gt;10102&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If <parameter>callout.graphics</parameter> is zero and <parameter>callout.unicode</parameter>
+is non-zero, unicode characters are used to represent
+callout numbers. The value of
+<parameter>callout.unicode.start.character</parameter>
+is the decimal unicode value used for callout number one. Currently,
+only 10102 is supported in the stylesheets for this parameter.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="callout.unicode">
+<refmeta>
+<refentrytitle>callout.unicode</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>callout.unicode</refname>
+<refpurpose>Use Unicode characters rather than images for callouts.</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="callout.unicode.frag">&lt;xsl:param name="callout.unicode" select="0"&gt;&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The stylesheets can use either an image of the numbers one to ten, or the single Unicode character which represents the numeral, in white on a black background. Use this to select the Unicode character option.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="callouts.extension">
+<refmeta>
+<refentrytitle>callouts.extension</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>callouts.extension</refname>
+<refpurpose>Enable the callout extension</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="callouts.extension.frag">
+&lt;xsl:param name="callouts.extension" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The callouts extension processes <tag>areaset</tag>
+elements in <tag>programlistingco</tag> and other text-based
+callout elements.
+</para>
+
+</refsection>
+</refentry>
+
+</reference><reference id="ebnf" xml:base="../html/param.xml"><title>EBNF</title>
+<refentry version="5.0" id="ebnf.table.bgcolor">
+<refmeta>
+<refentrytitle>ebnf.table.bgcolor</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">color</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>ebnf.table.bgcolor</refname>
+<refpurpose>Background color for EBNF tables</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="ebnf.table.bgcolor.frag">
+&lt;xsl:param name="ebnf.table.bgcolor"&gt;#F5DCB3&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Sets the background color for EBNF tables (a pale brown). No
+<tag>bgcolor</tag> attribute is output if
+<parameter>ebnf.table.bgcolor</parameter> is set to the null string. </para>
+
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="ebnf.table.border">
+<refmeta>
+<refentrytitle>ebnf.table.border</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>ebnf.table.border</refname>
+<refpurpose>Selects border on EBNF tables</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="ebnf.table.border.frag">&lt;xsl:param name="ebnf.table.border" select="1"&gt;&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Selects the border on EBNF tables. If non-zero, the tables have
+borders, otherwise they don't.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="ebnf.assignment">
+<refmeta>
+<refentrytitle>ebnf.assignment</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">rtf</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>ebnf.assignment</refname>
+<refpurpose>The EBNF production assignment operator</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="ebnf.assignment.frag">
+&lt;xsl:param name="ebnf.assignment"&gt;
+&lt;code&gt;::=&lt;/code&gt;
+&lt;/xsl:param&gt;
+
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The <parameter>ebnf.assignment</parameter> parameter determines what
+text is used to show <quote>assignment</quote> in <tag>production</tag>s
+in <tag>productionset</tag>s.</para>
+
+<para>While <quote><literal>::=</literal></quote> is common, so are several
+other operators.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="ebnf.statement.terminator">
+<refmeta>
+<refentrytitle>ebnf.statement.terminator</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">rtf</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>ebnf.statement.terminator</refname>
+<refpurpose>Punctuation that ends an EBNF statement.</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="ebnf.statement.terminator.frag">
+&lt;xsl:param name="ebnf.statement.terminator"&gt;&lt;/xsl:param&gt;
+
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The <parameter>ebnf.statement.terminator</parameter> parameter determines what
+text is used to terminate each <tag>production</tag>
+in <tag>productionset</tag>.</para>
+
+<para>Some notations end each statement with a period.</para>
+
+</refsection>
+</refentry>
+
+</reference><reference id="toc_index" xml:base="../html/param.xml"><title>ToC/LoT/Index Generation</title>
+<refentry version="5.0" id="annotate.toc">
+<refmeta>
+<refentrytitle>annotate.toc</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>annotate.toc</refname>
+<refpurpose>Annotate the Table of Contents?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="annotate.toc.frag">&lt;xsl:param name="annotate.toc" select="1"&gt;&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If true, TOCs will be annotated. At present, this just means
+that the <tag>refpurpose</tag> of <tag>refentry</tag>
+TOC entries will be displayed.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="autotoc.label.separator">
+<refmeta>
+<refentrytitle>autotoc.label.separator</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>autotoc.label.separator</refname>
+<refpurpose>Separator between labels and titles in the ToC</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="autotoc.label.separator.frag">
+&lt;xsl:param name="autotoc.label.separator"&gt;. &lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>String used to separate labels and titles in a table of contents.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="autotoc.label.in.hyperlink">
+<refmeta>
+<refentrytitle>autotoc.label.in.hyperlink</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>autotoc.label.in.hyperlink</refname>
+<refpurpose>Include label in hyperlinked titles in TOC?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="autotoc.label.in.hyperlink.frag">&lt;xsl:param name="autotoc.label.in.hyperlink" select="1"&gt;&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If the value of
+<parameter>autotoc.label.in.hyperlink</parameter> is non-zero, labels
+are included in hyperlinked titles in the TOC. If it is instead zero,
+labels are still displayed prior to the hyperlinked titles, but
+are not hyperlinked along with the titles.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="process.source.toc">
+<refmeta>
+<refentrytitle>process.source.toc</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>process.source.toc</refname>
+<refpurpose>Process a non-empty <tag>toc</tag> element if it occurs in a source document?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="process.source.toc.frag">&lt;xsl:param name="process.source.toc" select="0"&gt;&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies that the contents of a non-empty "hard-coded"
+<tag>toc</tag> element in a source document are processed to
+generate a TOC in output.
+<note>
+ <para>This parameter has no effect on automated generation of
+ TOCs. An automated TOC may still be generated along with the
+ "hard-coded" TOC. To suppress automated TOC generation, adjust the
+ value of the <parameter>generate.toc</parameter> paramameter.</para>
+
+ <para>The <tag>process.source.toc</tag> parameter also has
+ no effect if the <tag>toc</tag> element is empty; handling
+ for empty <tag>toc</tag> is controlled by the
+ <parameter>process.empty.source.toc</parameter> parameter.</para>
+</note>
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="process.empty.source.toc">
+<refmeta>
+<refentrytitle>process.empty.source.toc</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>process.empty.source.toc</refname>
+<refpurpose>Generate automated TOC if <tag>toc</tag> element occurs in a source document?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="process.empty.source.toc.frag">&lt;xsl:param name="process.empty.source.toc" select="0"&gt;&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies that if an empty <tag>toc</tag> element is found in a
+source document, an automated TOC is generated at this point in the
+document.
+<note>
+ <para>Depending on what the value of the
+ <parameter>generate.toc</parameter> parameter is, setting this
+ parameter to <literal>1</literal> could result in generation of
+ duplicate automated TOCs. So the
+ <parameter>process.empty.source.toc</parameter> is primarily useful
+ as an "override": by placing an empty <tag>toc</tag> in your
+ document and setting this parameter to <literal>1</literal>, you can
+ force a TOC to be generated even if <tag>generate.toc</tag>
+ says not to.</para>
+</note>
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="bridgehead.in.toc">
+<refmeta>
+<refentrytitle>bridgehead.in.toc</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>bridgehead.in.toc</refname>
+<refpurpose>Should bridgehead elements appear in the TOC?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="bridgehead.in.toc.frag">&lt;xsl:param name="bridgehead.in.toc" select="0"&gt;&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, <tag>bridgehead</tag>s appear in the TOC. Note that
+this option is not fully supported and may be removed in a future
+version of the stylesheets.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="simplesect.in.toc">
+<refmeta>
+<refentrytitle>simplesect.in.toc</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>simplesect.in.toc</refname>
+<refpurpose>Should <tag>simplesect</tag> elements appear in the TOC?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="simplesect.in.toc.frag">&lt;xsl:param name="simplesect.in.toc" select="0"&gt;&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, <tag>simplesect</tag>s will be included in the TOC.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="manual.toc">
+<refmeta>
+<refentrytitle>manual.toc</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>manual.toc</refname>
+<refpurpose>An explicit TOC to be used for the TOC</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="manual.toc.frag">
+&lt;xsl:param name="manual.toc"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The <parameter>manual.toc</parameter> identifies an explicit TOC that
+will be used for building the printed TOC.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="toc.list.type">
+<refmeta>
+<refentrytitle>toc.list.type</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">list</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">dl</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">ul</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">ol</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>toc.list.type</refname>
+<refpurpose>Type of HTML list element to use for Tables of Contents</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="toc.list.type.frag">&lt;xsl:param name="toc.list.type"&gt;dl&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>When an automatically generated Table of Contents (or List of Titles)
+is produced, this HTML element will be used to make the list.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="toc.section.depth">
+<refmeta>
+<refentrytitle>toc.section.depth</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">integer</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>toc.section.depth</refname>
+<refpurpose>How deep should recursive <tag>section</tag>s appear
+in the TOC?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="toc.section.depth.frag">&lt;xsl:param name="toc.section.depth"&gt;2&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies the depth to which recursive sections should appear in the
+TOC.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="toc.max.depth">
+<refmeta>
+<refentrytitle>toc.max.depth</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">integer</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>toc.max.depth</refname>
+<refpurpose>How many levels should be created for each TOC?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="toc.max.depth.frag">&lt;xsl:param name="toc.max.depth"&gt;8&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies the maximal depth of TOC on all levels.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="generate.toc">
+<refmeta>
+<refentrytitle>generate.toc</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">table</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>generate.toc</refname>
+<refpurpose>Control generation of ToCs and LoTs</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="generate.toc.frag">
+&lt;xsl:param name="generate.toc"&gt;
+appendix toc,title
+article/appendix nop
+article toc,title
+book toc,title,figure,table,example,equation
+chapter toc,title
+part toc,title
+preface toc,title
+qandadiv toc
+qandaset toc
+reference toc,title
+sect1 toc
+sect2 toc
+sect3 toc
+sect4 toc
+sect5 toc
+section toc
+set toc,title
+&lt;/xsl:param&gt;
+
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>This parameter has a structured value. It is a table of space-delimited
+path/value pairs. Each path identifies some element in the source document
+using a restricted subset of XPath (only the implicit child axis, no wildcards,
+no predicates). Paths can be either relative or absolute.</para>
+
+<para>When processing a particular element, the stylesheets consult this table to
+determine if a ToC (or LoT(s)) should be generated.</para>
+
+<para>For example, consider the entry:</para>
+
+<screen>book toc,figure</screen>
+
+<para>This indicates that whenever a <tag>book</tag> is formatted, a
+Table Of Contents and a List of Figures should be generated. Similarly,</para>
+
+<screen>/chapter toc</screen>
+
+<para>indicates that whenever a document <emphasis>that has a root
+of</emphasis> <tag>chapter</tag> is formatted, a Table of
+Contents should be generated. The entry <literal>chapter</literal> would match
+all chapters, but <literal>/chapter</literal> matches only <tag>chapter</tag>
+document elements.</para>
+
+<para>Generally, the longest match wins. So, for example, if you want to distinguish
+articles in books from articles in parts, you could use these two entries:</para>
+
+<screen>book/article toc,figure
+part/article toc</screen>
+
+<para>Note that an article in a part can never match a <literal>book/article</literal>,
+so if you want nothing to be generated for articles in parts, you can simply leave
+that rule out.</para>
+
+<para>If you want to leave the rule in, to make it explicit that you're turning
+something off, use the value <quote>nop</quote>. For example, the following
+entry disables ToCs and LoTs for articles:</para>
+
+<screen>article nop</screen>
+
+<para>Do not simply leave the word <quote>article</quote> in the file
+without a matching value. That'd be just begging the silly little
+path/value parser to get confused.</para>
+
+<para>Section ToCs are further controlled by the
+<parameter>generate.section.toc.level</parameter> parameter.
+For a given section level to have a ToC, it must have both an entry in
+<parameter>generate.toc</parameter> and be within the range enabled by
+<parameter>generate.section.toc.level</parameter>.</para>
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="generate.section.toc.level">
+<refmeta>
+<refentrytitle>generate.section.toc.level</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">integer</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>generate.section.toc.level</refname>
+<refpurpose>Control depth of TOC generation in sections</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="generate.section.toc.level.frag">
+&lt;xsl:param name="generate.section.toc.level" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The <parameter>generate.section.toc.level</parameter> parameter
+controls the depth of <tag>section</tag> in which TOCs will be generated. Note
+that this is related to, but not the same as
+<parameter>toc.section.depth</parameter>, which controls the depth to
+which TOC entries will be generated in a given TOC.</para>
+<para>If, for example, <parameter>generate.section.toc.level</parameter>
+is <literal>3</literal>, TOCs will be generated in first, second, and third
+level sections, but not in fourth level sections.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="generate.index">
+<refmeta>
+<refentrytitle>generate.index</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>generate.index</refname>
+<refpurpose>Do you want an index?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="generate.index.frag">&lt;xsl:param name="generate.index" select="1"&gt;&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specify if an index should be generated. </para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="index.method">
+<refmeta>
+<refentrytitle>index.method</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">list</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">basic</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">kosek</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">kimber</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>index.method</refname>
+<refpurpose>Select method used to group index entries in an index</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="index.method.frag">
+&lt;xsl:param name="index.method"&gt;basic&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>This parameter lets you select which method to use for sorting and grouping
+ index entries in an index.
+Indexes in Latin-based languages that have accented characters typically
+sort together accented words and unaccented words.
+Thus <quote>&#193;</quote> (U+00C1 LATIN CAPITAL LETTER A WITH ACUTE) would sort together
+with <quote>A</quote> (U+0041 LATIN CAPITAL LETTER A), so both would appear in the <quote>A</quote>
+section of the index.
+Languages using other alphabets (such as Russian, which is written in the Cyrillic alphabet)
+and languages using ideographic chararacters (such as Japanese)
+require grouping specific to the languages and alphabets.
+</para>
+
+<para>The default indexing method is limited.
+It can group accented characters in Latin-based languages only.
+It cannot handle non-Latin alphabets or ideographic languages.
+The other indexing methods require extensions of one type or
+another, and do not work with
+all XSLT processors, which is why they are not used by default.</para>
+
+<para>The three choices for indexing method are:</para>
+<variablelist>
+<varlistentry>
+<term><literal>basic</literal></term>
+<listitem>
+<para>
+(default) Sort and groups words based only on the Latin alphabet.
+Words with accented Latin letters will group and sort with
+their respective primary letter, but
+words in non-Latin alphabets will be
+put in the <quote>Symbols</quote> section of the index.
+</para>
+</listitem>
+</varlistentry>
+<varlistentry>
+<term><literal>kosek</literal></term>
+<listitem>
+<para>
+This method sorts and groups words based on letter groups configured in
+the DocBook locale file for the given language.
+See, for example, the French locale file <filename>common/fr.xml</filename>.
+This method requires that the XSLT processor
+supports the EXSLT extensions (most do).
+It also requires support for using
+user-defined functions in xsl:key (xsltproc does not).
+</para>
+<para>This method is suitable for any language for which you can
+list all the individual characters that should appear
+in each letter group in an index.
+It is probably not practical to use it for ideographic languages
+such as Chinese that have hundreds or thousands of characters.
+</para>
+
+<para>To use the kosek method, you must:</para>
+
+<orderedlist>
+<listitem>
+<para>Use a processor that supports its extensions, such as
+Saxon 6 or Xalan (xsltproc and Saxon 8 do not).
+</para>
+</listitem>
+<listitem>
+<para>Set the index.method parameter's value to <quote>kosek</quote>.
+</para>
+</listitem>
+<listitem>
+<para>Import the appropriate index extensions stylesheet module
+<filename>fo/autoidx-kosek.xsl</filename> or
+<filename>html/autoidx-kosek.xsl</filename> into your
+customization.
+</para>
+</listitem>
+</orderedlist>
+
+</listitem>
+</varlistentry>
+<varlistentry>
+<term><literal>kimber</literal></term>
+<listitem>
+<para>
+This method uses extensions to the Saxon processor to implement
+sophisticated indexing processes. It uses its own
+configuration file, which can include information for any number of
+languages. Each language's configuration can group
+words using one of two processes. In the
+enumerated process similar to that used in the kosek method,
+you indicate the groupings character-by-character.
+In the between-key process, you specify the
+break-points in the sort order that should start a new group.
+The latter configuration is useful for ideographic languages
+such as Chinese, Japanese, and Korean.
+You can also define your own collation algorithms and how you
+want mixed Latin-alphabet words sorted.</para>
+<itemizedlist>
+<listitem>
+<para>For a whitepaper describing the extensions, see:
+<link xlink:href="http://www.innodata-isogen.com/knowledge_center/white_papers/back_of_book_for_xsl_fo.pdf">http://www.innodata-isogen.com/knowledge_center/white_papers/back_of_book_for_xsl_fo.pdf</link>.
+</para>
+</listitem>
+<listitem>
+<para>To download the extension library, see
+<link xlink:href="http://www.innodata-isogen.com/knowledge_center/tools_downloads/i18nsupport">http://www.innodata-isogen.com/knowledge_center/tools_downloads/i18nsupport</link>.
+</para>
+</listitem>
+</itemizedlist>
+
+<para>To use the kimber method, you must:</para>
+
+<orderedlist>
+<listitem>
+<para>Use Saxon (version 6 or 8) as your XSLT processor.
+</para>
+</listitem>
+<listitem>
+<para>Install and configure the Innodata Isogen library, using
+the documentation that comes with it.
+</para>
+</listitem>
+<listitem>
+<para>Set the index.method parameter's value to <quote>kimber</quote>.
+</para>
+</listitem>
+<listitem>
+<para>Import the appropriate index extensions stylesheet module
+<filename>fo/autoidx-kimber.xsl</filename> or
+<filename>html/autoidx-kimber.xsl</filename> into your
+customization.
+</para>
+</listitem>
+</orderedlist>
+
+</listitem>
+</varlistentry>
+</variablelist>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="index.on.type">
+<refmeta>
+<refentrytitle>index.on.type</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>index.on.type</refname>
+<refpurpose>Select indexterms based on <tag class="attribute">type</tag>
+attribute value</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="index.on.type.frag">
+&lt;xsl:param name="index.on.type" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>
+If non-zero,
+then an <tag>index</tag> element that has a
+<tag class="attribute">type</tag> attribute
+value will contain only those <tag>indexterm</tag>
+elements with a matching <tag class="attribute">type</tag> attribute value.
+If an <tag>index</tag> has no <tag class="attribute">type</tag>
+attribute or it is blank, then the index will contain
+all <tag>indexterm</tag>s in the current scope.
+</para>
+
+<para>
+If <literal>index.on.type</literal> is zero, then the
+<tag class="attribute">type</tag> attribute has no effect
+on selecting indexterms for an index.
+</para>
+
+<para>For those using DocBook version 4.2 or earlier,
+the <tag class="attribute">type</tag> attribute is not available
+for index terms. However, you can achieve the same
+effect by using the <tag class="attribute">role</tag> attribute
+in the same manner on <tag>indexterm</tag>
+and <tag>index</tag>, and setting the stylesheet parameter
+<parameter>index.on.role</parameter> to a nonzero value.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="index.on.role">
+<refmeta>
+<refentrytitle>index.on.role</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>index.on.role</refname>
+<refpurpose>Select indexterms based on <tag class="attribute">role</tag> value</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="index.on.role.frag">
+&lt;xsl:param name="index.on.role" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>
+If non-zero,
+then an <tag>index</tag> element that has a
+<tag class="attribute">role</tag> attribute
+value will contain only those <tag>indexterm</tag>
+elements with a matching role value.
+If an <tag>index</tag> has no <tag class="attribute">role</tag>
+attribute or it is blank, then the index will contain
+all <tag>indexterm</tag>s in the current scope.
+</para>
+<para>
+If <literal>index.on.role</literal> is zero, then the
+<tag class="attribute">role</tag> attribute has no effect
+on selecting indexterms for an index.
+</para>
+
+<para>If you are using DocBook version 4.3 or later, you should
+use the <tag class="attribute">type</tag> attribute instead of <tag class="attribute">role</tag>
+on <tag>indexterm</tag> and <tag>index</tag>,
+and set the <parameter>index.on.type</parameter> to a nonzero
+value.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="index.links.to.section">
+<refmeta>
+<refentrytitle>index.links.to.section</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>index.links.to.section</refname>
+<refpurpose>HTML index entries link to container section title</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="index.links.to.section.frag">
+&lt;xsl:param name="index.links.to.section" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If zero, then an index entry in an index links
+directly to the location of the
+generated <tag>anchor</tag> that is output
+for the indexterm. If two identical indexterm elements
+exist in the same section, then both entries appear
+in the index with the same title but link to different
+locations.</para>
+
+<para>If non-zero, then an index entry in an index links to the
+section title containing the <tag>indexterm</tag>, rather than
+directly to the <tag>anchor</tag> output for the indexterm.
+Duplicate indexterm entries in the same section are dropped.
+</para>
+
+<para>The default value is 1, so index entries link to
+section titles by default.</para>
+
+<para>In both cases, the link text in an index entry is the
+title of the section containing the indexterm.
+That is because HTML does not have numbered pages.
+It also provides the reader with context information
+for each link.</para>
+
+<para>This parameter lets you choose which style of
+index linking you want. </para>
+
+<itemizedlist>
+<listitem>
+<para>When set to 0, an index entry takes you
+to the precise location of its corresponding indexterm.
+However, if you have a lot of duplicate
+entries in sections, then you have a lot of duplicate
+titles in the index, which makes it more cluttered.
+The reader may not recognize why duplicate titles
+appear until they follow the links. Also, the links
+may land the reader in the middle of a section where the
+section title is not visible, which may also be
+confusing to the reader.</para>
+</listitem>
+<listitem>
+<para>When set to 1, an index entry link is
+less precise, but duplicate titles in the
+index entries are eliminated.
+Landing on the section title location may confirm the reader's
+expectation that a link that
+shows a section title will take them to that section title,
+not a location within the section.
+</para>
+</listitem>
+</itemizedlist>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="index.prefer.titleabbrev">
+<refmeta>
+<refentrytitle>index.prefer.titleabbrev</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>index.prefer.titleabbrev</refname>
+<refpurpose>Should abbreviated titles be used as back references?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="index.prefer.titleabbrev.frag">
+&lt;xsl:param name="index.prefer.titleabbrev" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, and if a <tag>titleabbrev</tag> is defined, the abbreviated title
+is used as the link text of a back reference in the index.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="index.term.separator">
+<refmeta>
+<refentrytitle>index.term.separator</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>index.term.separator</refname>
+<refpurpose>Override for punctuation separating an index term
+from its list of page references in an index</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="index.term.separator.frag">
+&lt;xsl:param name="index.term.separator"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>This parameter permits you to override
+the text to insert between
+the end of an index term and its list of page references.
+Typically that might be a comma and a space.
+</para>
+
+<para>Because this text may be locale dependent,
+this parameter's value is normally taken from a gentext
+template named 'term-separator' in the
+context 'index' in the stylesheet
+locale file for the language
+of the current document.
+This parameter can be used to override the gentext string,
+and would typically be used on the command line.
+This parameter would apply to all languages.
+</para>
+
+<para>So this text string can be customized in two ways.
+You can reset the default gentext string using
+the <parameter>local.l10n.xml</parameter> parameter, or you can
+fill in the content for this normally empty
+override parameter.
+The content can be a simple string, or it can be
+something more complex such as a call-template.
+For fo output, it could be an <tag>fo:leader</tag>
+element to provide space of a specific length, or a dot leader.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="index.number.separator">
+<refmeta>
+<refentrytitle>index.number.separator</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>index.number.separator</refname>
+<refpurpose>Override for punctuation separating page numbers in index</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="index.number.separator.frag">
+&lt;xsl:param name="index.number.separator"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>This parameter permits you to override the text to insert between
+page references in a formatted index entry. Typically
+that would be a comma and a space.
+</para>
+
+<para>Because this text may be locale dependent,
+this parameter's value is normally taken from a gentext
+template named 'number-separator' in the
+context 'index' in the stylesheet
+locale file for the language
+of the current document.
+This parameter can be used to override the gentext string,
+and would typically be used on the command line.
+This parameter would apply to all languages.
+</para>
+
+<para>So this text string can be customized in two ways.
+You can reset the default gentext string using
+the <parameter>local.l10n.xml</parameter> parameter, or you can
+override the gentext with the content of this parameter.
+The content can be a simple string, or it can be
+something more complex such as a call-template.
+</para>
+
+<para>In HTML index output, section title references are used instead of
+page number references. This punctuation appears between
+such section titles in an HTML index.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="index.range.separator">
+<refmeta>
+<refentrytitle>index.range.separator</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>index.range.separator</refname>
+<refpurpose>Override for punctuation separating the two numbers
+in a page range in index</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="index.range.separator.frag">
+&lt;xsl:param name="index.range.separator"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>This parameter permits you
+to override the text to insert between
+the two numbers of a page range in an index.
+This parameter is only used by those XSL-FO processors
+that support an extension for generating such page ranges
+(such as XEP).</para>
+
+<para>Because this text may be locale dependent,
+this parameter's value is normally taken from a gentext
+template named 'range-separator' in the
+context 'index' in the stylesheet
+locale file for the language
+of the current document.
+This parameter can be used to override the gentext string,
+and would typically be used on the command line.
+This parameter would apply to all languages.
+</para>
+
+<para>So this text string can be customized in two ways.
+You can reset the default gentext string using
+the <parameter>local.l10n.xml</parameter> parameter, or you can
+override the gentext with the content of this parameter.
+The content can be a simple string, or it can be
+something more complex such as a call-template.
+</para>
+
+<para>In HTML index output, section title references are used instead of
+page number references. So there are no page ranges
+and this parameter has no effect.
+</para>
+
+</refsection>
+</refentry>
+
+</reference><reference id="dbk_ext" xml:base="../html/param.xml"><title>Stylesheet Extensions</title>
+<refentry version="5.0" id="linenumbering.everyNth">
+<refmeta>
+<refentrytitle>linenumbering.everyNth</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">integer</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>linenumbering.everyNth</refname>
+<refpurpose>Indicate which lines should be numbered</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="linenumbering.everyNth.frag">
+&lt;xsl:param name="linenumbering.everyNth"&gt;5&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If line numbering is enabled, everyNth line will be
+numbered. Note that numbering is one based, not zero based.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="linenumbering.extension">
+<refmeta>
+<refentrytitle>linenumbering.extension</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>linenumbering.extension</refname>
+<refpurpose>Enable the line numbering extension</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="linenumbering.extension.frag">
+&lt;xsl:param name="linenumbering.extension" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, verbatim environments (<tag>address</tag>, <tag>literallayout</tag>,
+<tag>programlisting</tag>, <tag>screen</tag>, <tag>synopsis</tag>) that specify line numbering will
+have line numbers.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="linenumbering.separator">
+<refmeta>
+<refentrytitle>linenumbering.separator</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>linenumbering.separator</refname>
+<refpurpose>Specify a separator between line numbers and lines</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="linenumbering.separator.frag">
+&lt;xsl:param name="linenumbering.separator"&gt;&lt;xsl:text&gt; &lt;/xsl:text&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The separator is inserted between line numbers and lines in the
+verbatim environment. The default value is a single white space.
+ Note the interaction with <parameter>linenumbering.width</parameter>
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="linenumbering.width">
+<refmeta>
+<refentrytitle>linenumbering.width</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">integer</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>linenumbering.width</refname>
+<refpurpose>Indicates the width of line numbers</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="linenumbering.width.frag">
+&lt;xsl:param name="linenumbering.width"&gt;3&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If line numbering is enabled, line numbers will appear right
+justified in a field "width" characters wide.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="tablecolumns.extension">
+<refmeta>
+<refentrytitle>tablecolumns.extension</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>tablecolumns.extension</refname>
+<refpurpose>Enable the table columns extension function</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="tablecolumns.extension.frag">
+&lt;xsl:param name="tablecolumns.extension" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The table columns extension function adjusts the widths of table
+columns in the HTML result to more accurately reflect the specifications
+in the CALS table.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="textinsert.extension">
+ <refmeta>
+ <refentrytitle>textinsert.extension</refentrytitle>
+ <refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+ </refmeta>
+ <refnamediv>
+ <refname>textinsert.extension</refname>
+ <refpurpose>Enables the textinsert extension element</refpurpose>
+ </refnamediv>
+ <refsynopsisdiv>
+ <programlisting id="textinsert.extension.frag">
+ &lt;xsl:param name="textinsert.extension" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+ </refsynopsisdiv>
+ <refsection><info><title>Description</title></info>
+ <para>The textinsert extension element inserts the contents of
+ a file into the result tree (as text).</para>
+ <note>
+ <para>To use the textinsert extension element, you must use
+ either Saxon or Xalan as your XSLT processor (it doesn&#8217;t
+ work with xsltproc), along with either the DocBook Saxon
+ extensions or DocBook Xalan extensions (for more
+ information about those extensions, see <link role="tcg" xlink:href="InstallingAProcessor.html#SaxonExtensions">DocBook Saxon Extensions</link> and <link role="tcg" xlink:href="InstallingAProcessor.html#XalanExtensions">DocBook Xalan Extensions</link>), and you must set both
+ the <parameter>use.extensions</parameter> and
+ <parameter>textinsert.extension</parameter> parameters to
+ <literal>1</literal>.</para>
+ <para>As an alternative to using the textinsert element,
+ consider using an Xinclude element with the
+ <literal>parse="text"</literal> attribute and value
+ specified, as detailed in <link role="tcg" xlink:href="ExternalCode.html#XIncludeCode">Using XInclude for text inclusions</link>.</para>
+ </note>
+ </refsection>
+ <refsection><info><title>See Also</title></info>
+ <para>You can also use the <tag class="xmlpi">dbhtml-include&#160;href</tag> processing
+ instruction to insert external files &#8212; both files containing
+ plain text and files with markup content (including HTML
+ content).</para>
+ </refsection>
+ <refsection><info><title>More information</title></info>
+ <para>For how-to documentation on inserting contents of
+ external code files and other text files into output, see
+ <link role="tcg" xlink:href="ExternalCode.html">External code files</link>.</para>
+ <para>For guidelines on inserting contents of
+ HTML files into output, see <link role="tcg" xlink:href="InsertExtHtml.html">Inserting external HTML code</link>.</para>
+ </refsection>
+</refentry>
+
+<refentry version="5.0" id="textdata.default.encoding">
+<refmeta>
+<refentrytitle>textdata.default.encoding</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>textdata.default.encoding</refname>
+<refpurpose>Default encoding of external text files which are included
+using textdata element</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="textdata.default.encoding.frag">
+&lt;xsl:param name="textdata.default.encoding"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies the encoding of any external text files included using
+<tag>textdata</tag> element. This value is used only when you do
+not specify encoding by the appropriate attribute
+directly on textdata. An empty string is interpreted as the system
+default encoding.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="graphicsize.extension">
+<refmeta>
+<refentrytitle>graphicsize.extension</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>graphicsize.extension</refname>
+<refpurpose>Enable the getWidth()/getDepth() extension functions</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="graphicsize.extension.frag">
+&lt;xsl:param name="graphicsize.extension" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero (and if <parameter>use.extensions</parameter> is non-zero
+and if you're using a processor that supports extension functions), the
+<function>getWidth</function> and <function>getDepth</function> functions
+will be used to extract image sizes from graphics.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="graphicsize.use.img.src.path">
+<refmeta>
+<refentrytitle>graphicsize.use.img.src.path</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>graphicsize.use.img.src.path</refname>
+<refpurpose>Prepend <parameter>img.src.path</parameter> before
+filenames passed to extension functions</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="graphicsize.use.img.src.path.frag">
+&lt;xsl:param name="graphicsize.use.img.src.path" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero <parameter>img.src.path</parameter> parameter will
+be appended before filenames passed to extension functions for
+measuring image dimensions.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="use.extensions">
+<refmeta>
+<refentrytitle>use.extensions</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>use.extensions</refname>
+<refpurpose>Enable extensions</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="use.extensions.frag">
+&lt;xsl:param name="use.extensions" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, extensions may be used. Each extension is
+further controlled by its own parameter. But if
+<parameter>use.extensions</parameter> is zero, no extensions will
+be used.
+</para>
+
+</refsection>
+</refentry>
+
+</reference><reference id="labels" xml:base="../html/param.xml"><title>Automatic labelling</title>
+<refentry version="5.0" id="chapter.autolabel">
+<refmeta>
+<refentrytitle>chapter.autolabel</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">list</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">0<alt>none</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">1<alt>1,2,3...</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">A<alt>A,B,C...</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">a<alt>a,b,c...</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">i<alt>i,ii,iii...</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">I<alt>I,II,III...</alt></refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>chapter.autolabel</refname>
+<refpurpose>Specifies the labeling format for Chapter titles</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="chapter.autolabel.frag">
+&lt;xsl:param name="chapter.autolabel" select="1"&gt;&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, then chapters will be numbered using the parameter
+value as the number format if the value matches one of the following:
+</para>
+
+<variablelist>
+ <varlistentry>
+ <term>1 or arabic</term>
+ <listitem>
+ <para>Arabic numeration (1, 2, 3 ...).</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>A or upperalpha</term>
+ <listitem>
+ <para>Uppercase letter numeration (A, B, C ...).</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>a or loweralpha</term>
+ <listitem>
+ <para>Lowercase letter numeration (a, b, c ...).</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>I or upperroman</term>
+ <listitem>
+ <para>Uppercase roman numeration (I, II, III ...).</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>i or lowerroman</term>
+ <listitem>
+ <para>Lowercase roman letter numeration (i, ii, iii ...).</para>
+ </listitem>
+ </varlistentry>
+</variablelist>
+
+<para>Any nonzero value other than the above will generate
+the default number format (arabic).
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="appendix.autolabel">
+<refmeta>
+<refentrytitle>appendix.autolabel</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">list</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">0<alt>none</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">1<alt>1,2,3...</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">A<alt>A,B,C...</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">a<alt>a,b,c...</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">i<alt>i,ii,iii...</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">I<alt>I,II,III...</alt></refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>appendix.autolabel</refname>
+<refpurpose>Specifies the labeling format for Appendix titles</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="appendix.autolabel.frag">
+&lt;xsl:param name="appendix.autolabel"&gt;A&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, then appendices will be numbered using the
+parameter value as the number format if the value matches one of the
+following:
+</para>
+
+<variablelist>
+ <varlistentry>
+ <term>1 or arabic</term>
+ <listitem>
+ <para>Arabic numeration (1, 2, 3 ...).</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>A or upperalpha</term>
+ <listitem>
+ <para>Uppercase letter numeration (A, B, C ...).</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>a or loweralpha</term>
+ <listitem>
+ <para>Lowercase letter numeration (a, b, c ...).</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>I or upperroman</term>
+ <listitem>
+ <para>Uppercase roman numeration (I, II, III ...).</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>i or lowerroman</term>
+ <listitem>
+ <para>Lowercase roman letter numeration (i, ii, iii ...).</para>
+ </listitem>
+ </varlistentry>
+</variablelist>
+
+<para>Any nonzero value other than the above will generate
+the default number format (upperalpha).
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="part.autolabel">
+<refmeta>
+<refentrytitle>part.autolabel</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">list</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">0<alt>none</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">1<alt>1,2,3...</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">A<alt>A,B,C...</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">a<alt>a,b,c...</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">i<alt>i,ii,iii...</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">I<alt>I,II,III...</alt></refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>part.autolabel</refname>
+<refpurpose>Specifies the labeling format for Part titles</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="part.autolabel.frag">
+&lt;xsl:param name="part.autolabel"&gt;I&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, then parts will be numbered using the parameter
+value as the number format if the value matches one of the following:
+</para>
+
+<variablelist>
+ <varlistentry>
+ <term>1 or arabic</term>
+ <listitem>
+ <para>Arabic numeration (1, 2, 3 ...).</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>A or upperalpha</term>
+ <listitem>
+ <para>Uppercase letter numeration (A, B, C ...).</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>a or loweralpha</term>
+ <listitem>
+ <para>Lowercase letter numeration (a, b, c ...).</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>I or upperroman</term>
+ <listitem>
+ <para>Uppercase roman numeration (I, II, III ...).</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>i or lowerroman</term>
+ <listitem>
+ <para>Lowercase roman letter numeration (i, ii, iii ...).</para>
+ </listitem>
+ </varlistentry>
+</variablelist>
+
+<para>Any nonzero value other than the above will generate
+the default number format (upperroman).
+</para>
+
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="reference.autolabel">
+<refmeta>
+<refentrytitle>reference.autolabel</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">list</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">0<alt>none</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">1<alt>1,2,3...</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">A<alt>A,B,C...</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">a<alt>a,b,c...</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">i<alt>i,ii,iii...</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">I<alt>I,II,III...</alt></refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>reference.autolabel</refname>
+<refpurpose>Specifies the labeling format for Reference titles</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+<programlisting id="reference.autolabel.frag">
+ &lt;xsl:param name="reference.autolabel"&gt;I&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+<para>If non-zero, references will be numbered using the parameter
+ value as the number format if the value matches one of the
+ following:
+</para>
+<variablelist>
+ <varlistentry>
+ <term>1 or arabic</term>
+ <listitem>
+ <para>Arabic numeration (1, 2, 3 ...).</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>A or upperalpha</term>
+ <listitem>
+ <para>Uppercase letter numeration (A, B, C ...).</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>a or loweralpha</term>
+ <listitem>
+ <para>Lowercase letter numeration (a, b, c ...).</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>I or upperroman</term>
+ <listitem>
+ <para>Uppercase roman numeration (I, II, III ...).</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>i or lowerroman</term>
+ <listitem>
+ <para>Lowercase roman letter numeration (i, ii, iii ...).</para>
+ </listitem>
+ </varlistentry>
+</variablelist>
+<para>Any non-zero value other than the above will generate
+the default number format (upperroman).
+</para>
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="preface.autolabel">
+<refmeta>
+<refentrytitle>preface.autolabel</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">list</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">0<alt>none</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">1<alt>1,2,3...</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">A<alt>A,B,C...</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">a<alt>a,b,c...</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">i<alt>i,ii,iii...</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">I<alt>I,II,III...</alt></refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>preface.autolabel</refname>
+<refpurpose>Specifices the labeling format for Preface titles</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="preface.autolabel.frag">&lt;xsl:param name="preface.autolabel" select="0"&gt;&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero then prefaces will be numbered using the parameter
+value as the number format if the value matches one of the following:
+</para>
+
+<variablelist>
+ <varlistentry>
+ <term>1 or arabic</term>
+ <listitem>
+ <para>Arabic numeration (1, 2, 3 ...).</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>A or upperalpha</term>
+ <listitem>
+ <para>Uppercase letter numeration (A, B, C ...).</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>a or loweralpha</term>
+ <listitem>
+ <para>Lowercase letter numeration (a, b, c ...).</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>I or upperroman</term>
+ <listitem>
+ <para>Uppercase roman numeration (I, II, III ...).</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>i or lowerroman</term>
+ <listitem>
+ <para>Lowercase roman letter numeration (i, ii, iii ...).</para>
+ </listitem>
+ </varlistentry>
+</variablelist>
+
+<para>Any nonzero value other than the above will generate
+the default number format (arabic).
+</para>
+
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="qandadiv.autolabel">
+<refmeta>
+<refentrytitle>qandadiv.autolabel</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>qandadiv.autolabel</refname>
+<refpurpose>Are divisions in QAndASets enumerated?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="qandadiv.autolabel.frag">&lt;xsl:param name="qandadiv.autolabel" select="1"&gt;&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, unlabeled qandadivs will be enumerated.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="section.autolabel">
+<refmeta>
+<refentrytitle>section.autolabel</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>section.autolabel</refname>
+<refpurpose>Are sections enumerated?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="section.autolabel.frag">&lt;xsl:param name="section.autolabel" select="0"&gt;&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If true (non-zero), unlabeled sections will be enumerated.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="section.autolabel.max.depth">
+<refmeta>
+<refentrytitle>section.autolabel.max.depth</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">integer</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>section.autolabel.max.depth</refname>
+<refpurpose>The deepest level of sections that are numbered.</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="section.autolabel.max.depth.frag">
+&lt;xsl:param name="section.autolabel.max.depth"&gt;8&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>When section numbering is turned on by the
+<parameter>section.autolabel</parameter> parameter, then this
+parameter controls the depth of <tag>section</tag> nesting that is
+numbered. Sections nested to a level deeper than this value will not
+be numbered.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="section.label.includes.component.label">
+<refmeta>
+<refentrytitle>section.label.includes.component.label</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>section.label.includes.component.label</refname>
+<refpurpose>Do section labels include the component label?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="section.label.includes.component.label.frag">&lt;xsl:param name="section.label.includes.component.label" select="0"&gt;&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, section labels are prefixed with the label of the
+component that contains them.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="label.from.part">
+<refmeta>
+<refentrytitle>label.from.part</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>label.from.part</refname>
+<refpurpose>Renumber components in each part?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="label.from.part.frag">
+&lt;xsl:param name="label.from.part" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If <parameter>label.from.part</parameter> is non-zero, then
+ numbering of components &#8212; <tag>preface</tag>,
+ <tag>chapter</tag>, <tag>appendix</tag>, and
+ <tag>reference</tag> (when <tag>reference</tag> occurs at the
+ component level) &#8212; is re-started within each
+ <tag>part</tag>.</para>
+<para>If <parameter>label.from.part</parameter> is zero (the
+ default), numbering of components is <emphasis>not</emphasis>
+ re-started within each <tag>part</tag>; instead, components are
+ numbered sequentially throughout each <tag>book</tag>,
+ regardless of whether or not they occur within <tag>part</tag>
+ instances.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="component.label.includes.part.label">
+<refmeta>
+<refentrytitle>component.label.includes.part.label</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>component.label.includes.part.label</refname>
+<refpurpose>Do component labels include the part label?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="component.label.includes.part.label.frag">&lt;xsl:param name="component.label.includes.part.label" select="0"&gt;&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, number labels for <tag>chapter</tag>,
+<tag>appendix</tag>, and other component elements are prefixed with
+the label of the part element that contains them. So you might see
+Chapter II.3 instead of Chapter 3. Also, the labels for formal
+elements such as <tag>table</tag> and <tag>figure</tag> will include
+the part label. If there is no part element container, then no prefix
+is generated.
+</para>
+<para>
+This feature is most useful when the
+<parameter>label.from.part</parameter> parameter is turned on.
+In that case, there would be more than one <tag>chapter</tag>
+<quote>1</quote>, and the extra part label prefix will identify
+each chapter unambiguously.
+</para>
+
+</refsection>
+</refentry>
+
+</reference><reference id="html" xml:base="../html/param.xml"><title>HTML</title>
+<refentry version="5.0" id="html.base">
+<refmeta>
+<refentrytitle>html.base</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">uri</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>html.base</refname>
+<refpurpose>An HTML base URI</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="html.base.frag">
+&lt;xsl:param name="html.base"&gt;&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If html.base is set, it is used for the <tag>base</tag> element
+in the <tag>head</tag> of the html documents. The parameter specifies
+the base URL for all relative URLs in the document. This is useful
+for dynamically served html where the base URI needs to be
+shifted.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="html.stylesheet.type">
+<refmeta>
+<refentrytitle>html.stylesheet.type</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>html.stylesheet.type</refname>
+<refpurpose>The type of the stylesheet used in the generated HTML</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="html.stylesheet.type.frag">&lt;xsl:param name="html.stylesheet.type"&gt;text/css&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The type of the stylesheet to place in the HTML <tag>link</tag> tag.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="html.stylesheet">
+<refmeta>
+<refentrytitle>html.stylesheet</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>html.stylesheet</refname>
+<refpurpose>Name of the stylesheet(s) to use in the generated HTML</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="html.stylesheet.frag">
+&lt;xsl:param name="html.stylesheet"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The <parameter>html.stylesheet</parameter> parameter is either
+empty, indicating that no stylesheet <tag>link</tag> tag should be
+generated in the html output, or it is a list of one or more
+stylesheet files.</para>
+
+<para>Multiple stylesheets are space-delimited. If you need to
+reference a stylesheet URI that includes a space, encode it with
+<literal>%20</literal>. A separate html <literal>link</literal> element will
+be generated for each stylesheet in the order they are listed in the
+parameter.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="css.decoration">
+<refmeta>
+<refentrytitle>css.decoration</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>css.decoration</refname>
+<refpurpose>Enable CSS decoration of elements</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="css.decoration.frag">
+&lt;xsl:param name="css.decoration" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>
+If non-zero, then html elements produced by the stylesheet may be
+decorated with <literal>style</literal> attributes. For example, the
+<literal>li</literal> tags produced for list items may include a
+fragment of CSS in the <literal>style</literal> attribute which sets
+the CSS property "list-style-type".
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="spacing.paras">
+<refmeta>
+<refentrytitle>spacing.paras</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>spacing.paras</refname>
+<refpurpose>Insert additional &lt;p&gt; elements for spacing?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="spacing.paras.frag">
+&lt;xsl:param name="spacing.paras" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>When non-zero, additional, empty paragraphs are inserted in
+several contexts (for example, around informal figures), to create a
+more pleasing visual appearance in many browsers.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="emphasis.propagates.style">
+<refmeta>
+<refentrytitle>emphasis.propagates.style</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>emphasis.propagates.style</refname>
+<refpurpose>Pass emphasis role attribute through to HTML?</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+<programlisting id="emphasis.propagates.style.frag">
+&lt;xsl:param name="emphasis.propagates.style" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+<para>If non-zero, the <literal>role</literal> attribute of
+<tag>emphasis</tag> elements will be passed through to the HTML as a
+class attribute on a <literal>span</literal> that surrounds the
+emphasis.</para>
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="para.propagates.style">
+<refmeta>
+<refentrytitle>para.propagates.style</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>para.propagates.style</refname>
+<refpurpose>Pass para role attribute through to HTML?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="para.propagates.style.frag">
+&lt;xsl:param name="para.propagates.style" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If true, the role attribute of <tag>para</tag> elements
+will be passed through to the HTML as a class attribute on the
+<tag>p</tag> generated for the paragraph.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="phrase.propagates.style">
+<refmeta>
+<refentrytitle>phrase.propagates.style</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>phrase.propagates.style</refname>
+<refpurpose>Pass phrase role attribute through to HTML?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="phrase.propagates.style.frag">
+&lt;xsl:param name="phrase.propagates.style" select="1"&gt;&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, the role attribute of <tag>phrase</tag> elements
+will be passed through to the HTML as a <literal>class</literal>
+attribute on a <literal>span</literal> that surrounds the
+phrase.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="entry.propagates.style">
+<refmeta>
+<refentrytitle>entry.propagates.style</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>entry.propagates.style</refname>
+<refpurpose>Pass entry role attribute through to HTML?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="entry.propagates.style.frag">
+&lt;xsl:param name="entry.propagates.style" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If true, the role attribute of <tag>entry</tag> elements
+will be passed through to the HTML as a class attribute on the
+<tag>td</tag> or <tag>th</tag> generated for the table
+cell.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="html.longdesc">
+<refmeta>
+<refentrytitle>html.longdesc</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>html.longdesc</refname>
+<refpurpose>Should longdesc URIs be created?</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+<programlisting id="html.longdesc.frag">
+&lt;xsl:param name="html.longdesc" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+<para>If non-zero, HTML files will be created for the
+<literal>longdesc</literal> attribute. These files
+are created from the <tag>textobject</tag>s in
+<tag>mediaobject</tag>s and
+<tag>inlinemediaobject</tag>.
+</para>
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="html.longdesc.link">
+<refmeta>
+<refentrytitle>html.longdesc.link</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>html.longdesc.link</refname>
+<refpurpose>Should a link to the longdesc be included in the HTML?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="html.longdesc.link.frag">
+&lt;xsl:param name="html.longdesc.link" select="$html.longdesc"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, links will be created to the
+HTML files created for the
+<literal>longdesc</literal> attribute. It makes no
+sense to enable this option without also enabling the
+<parameter>html.longdesc</parameter> parameter.</para>
+
+
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="make.valid.html">
+<refmeta>
+<refentrytitle>make.valid.html</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>make.valid.html</refname>
+<refpurpose>Attempt to make sure the HTML output is valid HTML</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="make.valid.html.frag">
+&lt;xsl:param name="make.valid.html" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If <parameter>make.valid.html</parameter> is true, the stylesheets take
+extra effort to ensure that the resulting HTML is valid. This may mean that some
+<tag>para</tag> tags are translated into HTML <tag>div</tag>s or
+that other substitutions occur.</para>
+
+<para>This parameter is different from <parameter>html.cleanup</parameter>
+because it changes the resulting markup; it does not use extension functions
+to manipulate result-tree-fragments and is therefore applicable to any
+XSLT processor.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="html.cleanup">
+<refmeta>
+<refentrytitle>html.cleanup</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>html.cleanup</refname>
+<refpurpose>Attempt to clean up the resulting HTML?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="html.cleanup.frag">
+&lt;xsl:param name="html.cleanup" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, and if the <link xlink:href="http://www.exslt.org/">EXSLT</link>
+extensions are supported by your processor, the resulting HTML will be
+<quote>cleaned up</quote>. This improves the chances that the
+resulting HTML will be valid. It may also improve the formatting of
+some elements.</para>
+
+<para>This parameter is different from <parameter>make.valid.html</parameter>
+because it uses extension functions to manipulate result-tree-fragments.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="html.append">
+<refmeta>
+<refentrytitle>html.append</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>html.append</refname>
+<refpurpose>Specifies content to append to HTML output</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="html.append.frag">&lt;xsl:param name="html.append"&gt;&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies content to append to the end of HTML files output by
+the <filename>html/docbook.xsl</filename> stylesheet, after the
+closing <code>&lt;html&gt;</code> tag. You probably don&#8217;t want to set any
+value for this parameter; but if you do, the only value it should ever
+be set to is a newline character: <code>&amp;#x0a;</code> or
+<code>&amp;#10;</code></para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="draft.mode">
+<refmeta>
+<refentrytitle>draft.mode</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">list</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">no</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">yes</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">maybe</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>draft.mode</refname>
+<refpurpose>Select draft mode</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="draft.mode.frag">
+&lt;xsl:param name="draft.mode"&gt;no&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Selects draft mode. If <parameter>draft.mode</parameter> is
+<quote><literal>yes</literal></quote>, the entire document will be treated
+as a draft. If it is <quote><literal>no</literal></quote>, the entire document
+will be treated as a final copy. If it is <quote><literal>maybe</literal></quote>,
+individual sections will be treated as draft or final independently, depending
+on how their <literal>status</literal> attribute is set.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="draft.watermark.image">
+<refmeta>
+<refentrytitle>draft.watermark.image</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">uri</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>draft.watermark.image</refname>
+<refpurpose>The URI of the image to be used for draft watermarks</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="draft.watermark.image.frag">
+&lt;xsl:param name="draft.watermark.image"&gt;images/draft.png&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The image to be used for draft watermarks.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="generate.id.attributes">
+<refmeta>
+<refentrytitle>generate.id.attributes</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>generate.id.attributes</refname>
+<refpurpose>Generate ID attributes on container elements?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="generate.id.attributes.frag">
+&lt;xsl:param name="generate.id.attributes" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, the HTML stylesheet will generate ID attributes on
+containers. For example, the markup:</para>
+
+<screen>&lt;section id="foo"&gt;&lt;title&gt;Some Title&lt;/title&gt;
+&lt;para&gt;Some para.&lt;/para&gt;
+&lt;/section&gt;</screen>
+
+<para>might produce:</para>
+
+<screen>&lt;div class="section" id="foo"&gt;
+&lt;h2&gt;Some Title&lt;/h2&gt;
+&lt;p&gt;Some para.&lt;/p&gt;
+&lt;/div&gt;</screen>
+
+<para>The alternative is to generate anchors:</para>
+
+<screen>&lt;div class="section"&gt;
+&lt;h2&gt;&lt;a name="foo"&gt;&lt;/a&gt;Some Title&lt;/h2&gt;
+&lt;p&gt;Some para.&lt;/p&gt;
+&lt;/div&gt;</screen>
+
+<para>Because the <tag class="attribute">name</tag> attribute of
+the <tag>a</tag> element and the <tag class="attribute">id</tag>
+attribute of other tags are both of type <quote>ID</quote>, producing both
+generates invalid documents.</para>
+
+<para>As of version 1.50, you can use this switch to control which type of
+identifier is generated. For backwards-compatibility, generating
+<tag>a</tag> anchors is preferred.</para>
+
+<para>Note: at present, this switch is incompletely implemented.
+Disabling ID attributes will suppress them, but enabling ID attributes
+will not suppress the anchors.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="generate.meta.abstract">
+<refmeta>
+<refentrytitle>generate.meta.abstract</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>generate.meta.abstract</refname>
+<refpurpose>Generate HTML <tag>META</tag> element from <tag>abstract</tag>?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="generate.meta.abstract.frag">
+&lt;xsl:param name="generate.meta.abstract" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, document abstracts will be reproduced in the HTML
+<literal>head</literal>, with <literal>&gt;meta name="description" content="..."</literal></para>
+
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="make.clean.html">
+<refmeta>
+<refentrytitle>make.clean.html</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>make.clean.html</refname>
+<refpurpose>Make HTML conform to modern coding standards</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="make.clean.html.frag">
+&lt;xsl:param name="make.clean.html" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If <parameter>make.clean.html</parameter> is true, the stylesheets take
+extra effort to ensure that the resulting HTML is conforms to
+modern HTML coding standards. In addition to eliminating
+excessive and noncompliant coding, it moves presentation
+HTML coding to a CSS stylesheet.</para>
+
+<para>The resulting HTML is dependent on
+CSS for formatting, and so the stylesheet is capable of
+generating a supporting CSS file. The <parameter>docbook.css.source</parameter>
+and <parameter>custom.css.source</parameter> parameters control
+how a CSS file is generated.</para>
+
+<para>If you require your CSS to reside in the HTML
+<tag>head</tag> element, then the <parameter>generate.css.header</parameter>
+can be used to do that.</para>
+
+<para>The <parameter>make.clean.html</parameter> parameter is
+different from <parameter>html.cleanup</parameter>
+because the former changes the resulting markup; it does not use extension functions
+like the latter to manipulate result-tree-fragments,
+and is therefore applicable to any XSLT processor.</para>
+
+<para>If <parameter>make.clean.html</parameter> is set to zero (the default),
+then the stylesheet retains its original
+<quote>old style</quote>
+HTML formatting features.</para>
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="docbook.css.source">
+ <refmeta>
+ <refentrytitle>docbook.css.source</refentrytitle>
+ <refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+ </refmeta>
+ <refnamediv>
+ <refname>docbook.css.source</refname>
+ <refpurpose>Name of the default CSS input file</refpurpose>
+ </refnamediv>
+
+ <refsynopsisdiv>
+ <programlisting id="docbook.css.source.frag">&lt;xsl:param name="docbook.css.source"&gt;docbook.css.xml&lt;/xsl:param&gt;</programlisting>
+ </refsynopsisdiv>
+
+ <refsection><info><title>Description</title></info>
+
+<para>The <parameter>docbook.css.source</parameter> parameter
+specifies the name of the file containing the default DocBook
+CSS styles. Those styles are necessary when the
+<parameter>make.clean.html</parameter> parameter is nonzero.</para>
+
+<para>The file is a well-formed XML file that
+must consist of a single <tag>style</tag> root
+element that contains CSS styles as its text content.
+The default value of the parameter (and filename)
+is <literal>docbook.css.xml</literal>.
+The stylesheets ship with the default file. You can substitute
+your own and specify its path in this parameter.</para>
+
+<para>If <parameter>docbook.css.source</parameter> is not blank,
+and <parameter>make.clean.html</parameter> is nonzero, then
+the stylesheet takes the following actions:</para>
+
+<orderedlist>
+ <listitem>
+ <para>The stylesheet uses the XSLT <literal>document()</literal>
+ function to open the file specified by the parameter and
+ load it into a variable.</para>
+ </listitem>
+ <listitem>
+ <para>The stylesheet forms an output pathname consisting of the
+ value of the <parameter>base.dir</parameter> parameter (if it is set)
+ and the value of <parameter>docbook.css.source</parameter>,
+ with the <literal>.xml</literal> suffix stripped off.
+ </para>
+ </listitem>
+ <listitem>
+ <para>The stylesheet removes the <tag>style</tag>
+ wrapper element and writes just the CSS text content to the output file.</para>
+ </listitem>
+ <listitem>
+ <para>The stylesheet adds a <tag>link</tag> element to the
+ HTML <tag>HEAD</tag> element to reference the external CSS stylesheet.
+ For example:</para>
+ <programlisting>&lt;link rel="stylesheet" href="docbook.css" type="text/css"&gt;
+ </programlisting>
+ <para>However, if the <parameter>docbook.css.link</parameter>
+ parameter is set to zero, then no <tag>link</tag> is written
+ for the default CSS file. That is useful if a custom
+ CSS file will import the default CSS stylesheet to ensure
+ proper cascading of styles.</para>
+ </listitem>
+</orderedlist>
+
+<para>If the <parameter>docbook.css.source</parameter> parameter
+is changed from its default <literal>docbook.css.xml</literal> to blank,
+then no default CSS is generated. Likewise if the
+<parameter>make.clean.html</parameter> parameter is set to zero,
+then no default CSS is generated. The
+<parameter>custom.css.source</parameter> parameter can be used
+instead to generate a complete custom CSS file.</para>
+
+<para>You can use the <parameter>generate.css.header</parameter>
+parameter to instead write the CSS to each HTML <tag>HEAD</tag>
+element in a <tag>style</tag> tag instead of an external CSS file.</para>
+
+ </refsection>
+</refentry>
+
+<refentry version="5.0" id="docbook.css.link">
+<refmeta>
+<refentrytitle>docbook.css.link</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>docbook.css.link</refname>
+<refpurpose>Insert a link referencing the default CSS stylesheet</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="docbook.css.link.frag">
+&lt;xsl:param name="docbook.css.link" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The stylesheets are capable of generating a default
+CSS stylesheet file. The parameters
+<parameter>make.clean.html</parameter> and
+<parameter>docbook.css.source</parameter> control that feature.</para>
+
+<para>Normally if a default CSS file is generated, then
+the stylesheet inserts a <tag>link</tag> tag in the HTML
+<tag>HEAD</tag> element to reference it.
+However, you can omit that <tag>link</tag> reference if
+you set the <parameter>docbook.css.link</parameter> to zero
+(1 is the default).</para>
+
+<para>This parameter is useful when you want to import the
+default CSS into a custom CSS file generated using the
+<parameter>custom.css.source</parameter> parameter.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="custom.css.source">
+ <refmeta>
+ <refentrytitle>custom.css.source</refentrytitle>
+ <refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+ </refmeta>
+ <refnamediv>
+ <refname>custom.css.source</refname>
+ <refpurpose>Name of a custom CSS input file</refpurpose>
+ </refnamediv>
+
+ <refsynopsisdiv>
+ <programlisting id="custom.css.source.frag">&lt;xsl:param name="custom.css.source"&gt;&lt;/xsl:param&gt;</programlisting>
+ </refsynopsisdiv>
+
+ <refsection><info><title>Description</title></info>
+
+<para>The <parameter>custom.css.source</parameter>
+parameter enables you to add CSS styles to DocBook's
+HTML output.</para>
+
+<para>The parameter
+specifies the name of a file containing custom
+CSS styles. The file must be a well-formed XML file that
+consists of a single <tag>style</tag> root
+element that contains CSS styles as its text content.
+For example:</para>
+<programlisting>&lt;?xml version="1.0"?&gt;
+&lt;style&gt;
+h2 {
+ font-weight: bold;
+ color: blue;
+}
+...
+&lt;/style&gt;
+</programlisting>
+
+<para>The filename specified by the parameter
+should have a <literal>.xml</literal>
+filename suffix, although that is not required.
+The default value of this parameter is blank.</para>
+
+<para>If <parameter>custom.css.source</parameter> is not blank, then
+the stylesheet takes the following actions.
+These actions take place regardless of the value of
+the <parameter>make.clean.html</parameter> parameter.</para>
+
+<orderedlist>
+ <listitem>
+ <para>The stylesheet uses the XSLT <literal>document()</literal>
+ function to open the file specified by the parameter and
+ load it into a variable.</para>
+ </listitem>
+ <listitem>
+ <para>The stylesheet forms an output pathname consisting of the
+ value of the <parameter>base.dir</parameter> parameter (if it is set)
+ and the value of <parameter>custom.css.source</parameter>,
+ with the <literal>.xml</literal> suffix stripped off.
+ </para>
+ </listitem>
+ <listitem>
+ <para>The stylesheet removes the <tag>style</tag>
+ wrapper element and writes just the CSS text content to the output file.</para>
+ </listitem>
+ <listitem>
+ <para>The stylesheet adds a <tag>link</tag> element to the
+ HTML <tag>HEAD</tag> element to reference this external CSS stylesheet.
+ For example:
+ <programlisting>&lt;link rel="stylesheet" href="custom.css" type="text/css"&gt;
+ </programlisting>
+ </para>
+ </listitem>
+</orderedlist>
+
+
+
+<para>If the <parameter>make.clean.html</parameter> parameter is nonzero
+(the default is zero),
+and if the <parameter>docbook.css.source</parameter> parameter
+is not blank (the default is not blank),
+then the stylesheet will also generate a default CSS file
+and add a <tag>link</tag> tag to reference it.
+The <tag>link</tag> to the custom CSS comes after the
+<tag>link</tag> to the default, so it should cascade properly
+in most browsers.
+If you do not want two <tag>link</tag> tags, and
+instead want your custom CSS to import the default generated
+CSS file, then do the following:
+</para>
+
+<orderedlist>
+ <listitem>
+ <para>Add a line like the following to your custom CSS source file:</para>
+ <programlisting>@import url("docbook.css")
+ </programlisting>
+ </listitem>
+ <listitem>
+ <para>Set the <parameter>docbook.css.link</parameter> parameter
+ to zero. This will omit the <tag>link</tag> tag
+ that references the default CSS file.</para>
+ </listitem>
+</orderedlist>
+
+<para>If you set <parameter>make.clean.html</parameter> to nonzero but
+you do not want the default CSS generated, then also set
+the <parameter>docbook.css.source</parameter> parameter to blank.
+Then no default CSS will be generated, and so
+all CSS styles must come from your custom CSS file.</para>
+
+<para>You can use the <parameter>generate.css.header</parameter>
+parameter to instead write the CSS to each HTML <tag>HEAD</tag>
+element in a <tag>style</tag> tag instead of an external CSS file.</para>
+
+ </refsection>
+</refentry>
+
+<refentry version="5.0" id="generate.css.header">
+<refmeta>
+<refentrytitle>generate.css.header</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>generate.css.header</refname>
+<refpurpose>Insert generated CSS styles in HEAD element</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="generate.css.header.frag">
+&lt;xsl:param name="generate.css.header" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The stylesheets are capable of generating both default
+and custom CSS stylesheet files. The parameters
+<parameter>make.clean.html</parameter>,
+<parameter>docbook.css.source</parameter>, and
+<parameter>custom.css.source</parameter> control that feature.</para>
+
+<para>If you require that CSS styles reside in the HTML
+<tag>HEAD</tag> element instead of external CSS files,
+then set the <parameter>generate.css.header</parameter>
+parameter to nonzero (it is zero by default).
+Then instead of generating the CSS in external files,
+they are wrapped in <tag>style</tag> elements in
+the <tag>HEAD</tag> element of each HTML output file.
+</para>
+
+</refsection>
+</refentry>
+
+</reference><reference id="xslt" xml:base="../html/param.xml"><title>XSLT Processing</title>
+<refentry version="5.0" id="rootid">
+<refmeta>
+<refentrytitle>rootid</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>rootid</refname>
+<refpurpose>Specify the root element to format</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="rootid.frag">
+&lt;xsl:param name="rootid"&gt;&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If <parameter>rootid</parameter> is not empty, it must be the
+value of an ID that occurs in the document being formatted. The entire
+document will be loaded and parsed, but formatting will begin at the
+element identified, rather than at the root. For example, this allows
+you to process only <tag>chapter</tag> 4 of a <tag>book</tag>.</para>
+<para>Because the entire document is available to the processor, automatic
+numbering, cross references, and other dependencies are correctly
+resolved.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="suppress.navigation">
+<refmeta>
+<refentrytitle>suppress.navigation</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>suppress.navigation</refname>
+<refpurpose>Disable header and footer navigation</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="suppress.navigation.frag">
+&lt;xsl:param name="suppress.navigation" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>
+If non-zero, header and footer navigation will be suppressed.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="suppress.header.navigation">
+<refmeta>
+<refentrytitle>suppress.header.navigation</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>suppress.header.navigation</refname>
+<refpurpose>Disable header navigation</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="suppress.header.navigation.frag">
+&lt;xsl:param name="suppress.header.navigation" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, header navigation will be suppressed.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="suppress.footer.navigation">
+<refmeta>
+<refentrytitle>suppress.footer.navigation</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>suppress.footer.navigation</refname>
+<refpurpose>Disable footer navigation</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="suppress.footer.navigation.frag">&lt;xsl:param name="suppress.footer.navigation"&gt;0&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>
+If non-zero, footer navigation will be suppressed.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="header.rule">
+<refmeta>
+<refentrytitle>header.rule</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>header.rule</refname>
+<refpurpose>Rule under headers?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="header.rule.frag">
+&lt;xsl:param name="header.rule" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, a rule will be drawn below the page headers.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="footer.rule">
+<refmeta>
+<refentrytitle>footer.rule</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>footer.rule</refname>
+<refpurpose>Rule over footers?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="footer.rule.frag">
+&lt;xsl:param name="footer.rule" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, a rule will be drawn above the page footers.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="id.warnings">
+<refmeta>
+<refentrytitle>id.warnings</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>id.warnings</refname>
+<refpurpose>Should warnings be generated for titled elements without IDs?</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+<programlisting id="id.warnings.frag">
+&lt;xsl:param name="id.warnings" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+<para>If non-zero, the stylesheet will issue a warning for any element
+(other than the root element) which has a <tag>title</tag> but does not have an
+ID.</para>
+</refsection>
+</refentry>
+
+</reference><reference id="meta" xml:base="../html/param.xml"><title>Meta/*Info and Titlepages</title>
+<refentry version="5.0" id="inherit.keywords">
+<refmeta>
+<refentrytitle>inherit.keywords</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>inherit.keywords</refname>
+<refpurpose>Inherit keywords from ancestor elements?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="inherit.keywords.frag">
+&lt;xsl:param name="inherit.keywords" select="1"&gt;&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If <parameter>inherit.keywords</parameter>
+is non-zero, the keyword <literal>meta</literal> for each HTML
+<literal>head</literal> element will include all of the keywords from
+ancestor elements. Otherwise, only the keywords from the current section
+will be used.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="make.single.year.ranges">
+<refmeta>
+<refentrytitle>make.single.year.ranges</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>make.single.year.ranges</refname>
+<refpurpose>Print single-year ranges (e.g., 1998-1999)</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="make.single.year.ranges.frag">
+&lt;xsl:param name="make.single.year.ranges" select="0"&gt;&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, year ranges that span a single year will be printed
+in range notation (1998-1999) instead of discrete notation
+(1998, 1999).</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="make.year.ranges">
+<refmeta>
+<refentrytitle>make.year.ranges</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>make.year.ranges</refname>
+<refpurpose>Collate copyright years into ranges?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="make.year.ranges.frag">&lt;xsl:param name="make.year.ranges" select="0"&gt;&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, multiple copyright <tag>year</tag> elements will be
+collated into ranges.
+This works only if each year number is put into a separate
+year element. The copyright element permits multiple
+year elements. If a year element contains a dash or
+a comma, then that year element will not be merged into
+any range.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="author.othername.in.middle">
+<refmeta>
+<refentrytitle>author.othername.in.middle</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>author.othername.in.middle</refname>
+<refpurpose>Is <tag>othername</tag> in <tag>author</tag> a
+middle name?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="author.othername.in.middle.frag">
+&lt;xsl:param name="author.othername.in.middle" select="1"&gt;&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, the <tag>othername</tag> of an <tag>author</tag>
+appears between the <tag>firstname</tag> and
+<tag>surname</tag>. Otherwise, <tag>othername</tag>
+is suppressed.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="blurb.on.titlepage.enabled">
+<refmeta>
+<refentrytitle>blurb.on.titlepage.enabled</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>blurb.on.titlepage.enabled</refname>
+<refpurpose>Display personblurb and authorblurb on title pages?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="blurb.on.titlepage.enabled.frag">
+&lt;xsl:param name="blurb.on.titlepage.enabled" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, output from <tag>authorblurb</tag> and
+<tag>personblurb</tag> elements is displayed on title pages. If zero
+(the default), output from those elements is suppressed on title pages
+(unless you are using a <literal>titlepage</literal> customization
+that causes them to be included).</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="contrib.inline.enabled">
+<refmeta>
+<refentrytitle>contrib.inline.enabled</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>contrib.inline.enabled</refname>
+<refpurpose>Display contrib output inline?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="contrib.inline.enabled.frag">&lt;xsl:param name="contrib.inline.enabled"&gt;1&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero (the default), output of the <tag>contrib</tag> element is
+displayed as inline content rather than as block content.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="editedby.enabled">
+<refmeta>
+<refentrytitle>editedby.enabled</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>editedby.enabled</refname>
+<refpurpose>Display &#8220;Edited by&#8221; heading above editor name?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="editedby.enabled.frag">&lt;xsl:param name="editedby.enabled"&gt;1&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, a localized <emphasis role="bold">Edited
+by</emphasis> heading is displayed above editor names in output of the
+<tag>editor</tag> element.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="abstract.notitle.enabled">
+<refmeta>
+<refentrytitle>abstract.notitle.enabled</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>abstract.notitle.enabled</refname>
+<refpurpose>Suppress display of abstract titles?</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+ <programlisting id="abstract.notitle.enabled.frag">&lt;xsl:param name="abstract.notitle.enabled" select="0"&gt;&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+<para>If non-zero, in output of the <tag>abstract</tag> element on titlepages,
+display of the abstract title is suppressed.</para>
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="othercredit.like.author.enabled">
+<refmeta>
+<refentrytitle>othercredit.like.author.enabled</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>othercredit.like.author.enabled</refname>
+<refpurpose>Display othercredit in same style as author?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="othercredit.like.author.enabled.frag">&lt;xsl:param name="othercredit.like.author.enabled"&gt;0&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, output of the
+<tag>othercredit</tag> element on titlepages is displayed in
+the same style as <tag>author</tag> and
+<tag>editor</tag> output. If zero then
+<tag>othercredit</tag> output is displayed using a style
+different than that of <tag>author</tag> and
+<tag>editor</tag>.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="generate.legalnotice.link">
+<refmeta>
+<refentrytitle>generate.legalnotice.link</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>generate.legalnotice.link</refname>
+<refpurpose>Write legalnotice to separate chunk and generate link?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="generate.legalnotice.link.frag">&lt;xsl:param name="generate.legalnotice.link" select="0"&gt;&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If the value of <parameter>generate.legalnotice.link</parameter>
+is non-zero, the stylesheet:
+
+<itemizedlist>
+ <listitem>
+ <para>writes the contents of <tag>legalnotice</tag> to a separate
+ HTML file</para>
+ </listitem>
+ <listitem>
+ <para>inserts a hyperlink to the <tag>legalnotice</tag> file</para>
+ </listitem>
+ <listitem>
+ <para>adds (in the HTML <literal>head</literal>) either a single
+ <literal>link</literal> or element or multiple
+ <literal>link</literal> elements (depending on the value of the
+ <parameter>html.head.legalnotice.link.multiple</parameter>
+ parameter), with the value or values derived from the
+ <parameter>html.head.legalnotice.link.types</parameter>
+ parameter</para>
+ </listitem>
+ </itemizedlist>
+
+ Otherwise, if <parameter>generate.legalnotice.link</parameter> is
+ zero, <tag>legalnotice</tag> contents are rendered on the title
+ page.</para>
+
+<para>The name of the separate HTML file is computed as follows:
+
+<orderedlist>
+<listitem>
+ <para>If a filename is given by the <tag class="xmlpi">dbhtml filename</tag>
+processing instruction, that filename is used.</para>
+</listitem>
+<listitem>
+ <para>If the legalnotice has an <tag class="attribute">id</tag>/<tag class="attribute">xml:id</tag>
+attribute, and if <parameter>use.id.as.filename</parameter> != 0, the filename
+is the concatenation of the id value and the value of the <parameter>html.ext</parameter>
+parameter.</para>
+</listitem>
+<listitem>
+ <para>If the legalnotice does not have an <tag class="attribute">id</tag>/<tag class="attribute">xml:id</tag>
+ attribute, or if <parameter>use.id.as.filename</parameter> = 0, the filename is the concatenation of "ln-",
+auto-generated id value, and <parameter>html.ext</parameter> value.
+ </para>
+</listitem>
+</orderedlist>
+
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="generate.revhistory.link">
+<refmeta>
+<refentrytitle>generate.revhistory.link</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>generate.revhistory.link</refname>
+<refpurpose>Write revhistory to separate chunk and generate link?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="generate.revhistory.link.frag">&lt;xsl:param name="generate.revhistory.link" select="0"&gt;&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, the contents of <tag>revhistory</tag> are written
+to a separate HTML file and a link to the file is
+generated. Otherwise, <tag>revhistory</tag> contents are rendered on
+the title page.</para>
+
+<para>The name of the separate HTML file is computed as follows:
+
+<orderedlist>
+<listitem>
+ <para>If a filename is given by the <tag class="xmlpi">dbhtml filename</tag> processing instruction,
+that filename is used.</para>
+</listitem>
+<listitem>
+ <para>If the revhistory has an <tag class="attribute">id</tag>/<tag class="attribute">xml:id</tag>
+attribute, and if <parameter>use.id.as.filename</parameter> != 0, the filename is the concatenation of
+the id value and the value of the <parameter>html.ext</parameter> parameter.</para>
+</listitem>
+<listitem>
+ <para>If the revhistory does not have an <tag class="attribute">id</tag>/<tag class="attribute">xml:id</tag>
+attribute, or if <parameter>use.id.as.filename</parameter> = 0, the filename is the concatenation of "rh-",
+auto-generated id value, and <parameter>html.ext</parameter> value.
+ </para>
+</listitem>
+</orderedlist>
+
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="html.head.legalnotice.link.types">
+<refmeta>
+<refentrytitle>html.head.legalnotice.link.types</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>html.head.legalnotice.link.types</refname>
+<refpurpose>Specifies link types for legalnotice link in html head</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="html.head.legalnotice.link.types.frag">
+&lt;xsl:param name="html.head.legalnotice.link.types"&gt;copyright&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The value of
+<parameter>html.head.legalnotice.link.types</parameter> is a
+space-separated list of link types, as described in <link xlink:href="http://www.w3.org/TR/html401/types.html#type-links">Section 6.12
+of the HTML 4.01 specification</link>. If the value of the
+<parameter>generate.legalnotice.link</parameter> parameter is
+non-zero, then the stylesheet generates (in the
+<literal>head</literal> section of the HTML source) either a single
+HTML <literal>link</literal> element or, if the value of the
+<parameter>html.head.legalnotice.link.multiple</parameter> is
+non-zero, one <literal>link</literal> element for each link type
+specified. Each <literal>link</literal> has the following attributes:
+
+<itemizedlist>
+ <listitem>
+ <para>a <tag class="attribute">rel</tag> attribute whose
+ value is derived from the value of
+ <parameter>html.head.legalnotice.link.types</parameter></para>
+ </listitem>
+ <listitem>
+ <para>an <tag class="attribute">href</tag> attribute whose
+ value is set to the URL of the file containing the
+ <tag>legalnotice</tag></para>
+ </listitem>
+ <listitem>
+ <para>a <tag class="attribute">title</tag> attribute whose
+ value is set to the title of the corresponding
+ <tag>legalnotice</tag> (or a title programatically
+ determined by the stylesheet)</para>
+ </listitem>
+</itemizedlist>
+
+For example:
+
+<screen> &lt;link rel="license" href="ln-id2524073.html" title="Legal Notice"&gt;</screen>
+</para>
+
+<refsection><info><title>About the default value</title></info>
+
+ <para>In an ideal world, the default value of
+ <parameter>html.head.legalnotice.link.types</parameter> would
+ probably be &#8220;<literal>license</literal>&#8221;, since the content of the
+ DocBook <tag>legalnotice</tag> is typically license
+ information, not copyright information. However, the default value
+ is &#8220;<literal>copyright</literal>&#8221; for pragmatic reasons: because
+ that&#8217;s among the set of &#8220;recognized link types&#8221; listed in <link xlink:href="http://www.w3.org/TR/html401/types.html#type-links">Section
+ 6.12 of the HTML 4.01 specification</link>, and because certain
+ browsers and browser extensions are preconfigured to recognize that
+ value.</para>
+</refsection>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="html.head.legalnotice.link.multiple">
+<refmeta>
+<refentrytitle>html.head.legalnotice.link.multiple</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>html.head.legalnotice.link.multiple</refname>
+<refpurpose>Generate multiple link instances in html head for legalnotice?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="html.head.legalnotice.link.multiple.frag">
+&lt;xsl:param name="html.head.legalnotice.link.multiple" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If <parameter>html.head.legalnotice.link.multiple</parameter> is
+non-zero and the value of
+<parameter>html.head.legalnotice.link.types</parameter> contains
+multiple link types, then the stylesheet generates (in the
+<literal>head</literal> section of the HTML source) one
+<literal>link</literal> element for each link type specified. For
+example, if the value of
+<parameter>html.head.legalnotice.link.types</parameter> is
+&#8220;<literal>copyright license</literal>&#8221;:
+
+<screen> &lt;link rel="copyright" href="ln-id2524073.html" title="Legal Notice"&gt;
+ &lt;link rel="license" href="ln-id2524073.html" title="Legal Notice"&gt;</screen>
+
+ Otherwise, the stylesheet generates generates a single
+ <literal>link</literal> instance; for example:
+
+<screen> &lt;link rel="copyright license" href="ln-id2524073.html" title="Legal Notice"&gt;</screen>
+
+</para>
+</refsection>
+</refentry>
+
+</reference><reference id="refentry" xml:base="../html/param.xml"><title>Reference Pages</title>
+<refentry version="5.0" id="funcsynopsis.decoration">
+<refmeta>
+<refentrytitle>funcsynopsis.decoration</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>funcsynopsis.decoration</refname>
+<refpurpose>Decorate elements of a <tag>funcsynopsis</tag>?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="funcsynopsis.decoration.frag">
+&lt;xsl:param name="funcsynopsis.decoration" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, elements of the <tag>funcsynopsis</tag> will be
+decorated (e.g. rendered as bold or italic text). The decoration is controlled by
+templates that can be redefined in a customization layer.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="funcsynopsis.style">
+<refmeta>
+<refentrytitle>funcsynopsis.style</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">list</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">ansi</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">kr</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>funcsynopsis.style</refname>
+<refpurpose>What style of <tag>funcsynopsis</tag> should be generated?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="funcsynopsis.style.frag">&lt;xsl:param name="funcsynopsis.style"&gt;kr&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If <parameter>funcsynopsis.style</parameter> is <literal>ansi</literal>,
+ANSI-style function synopses are generated for a
+<tag>funcsynopsis</tag>, otherwise K&amp;R-style
+function synopses are generated.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="function.parens">
+<refmeta>
+<refentrytitle>function.parens</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>function.parens</refname>
+<refpurpose>Generate parens after a function?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="function.parens.frag">
+&lt;xsl:param name="function.parens" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, the formatting of a <tag>function</tag> element
+will include generated parentheses.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="refentry.generate.name">
+<refmeta>
+<refentrytitle>refentry.generate.name</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>refentry.generate.name</refname>
+<refpurpose>Output NAME header before <tag>refname</tag>s?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="refentry.generate.name.frag">
+&lt;xsl:param name="refentry.generate.name" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, a "NAME" section title is output before the list
+of <tag>refname</tag>s. This parameter and
+<parameter>refentry.generate.title</parameter> are mutually
+exclusive. This means that if you change this parameter to zero, you
+should set <parameter>refentry.generate.title</parameter> to non-zero unless
+you want get quite strange output.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="refentry.generate.title">
+<refmeta>
+<refentrytitle>refentry.generate.title</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>refentry.generate.title</refname>
+<refpurpose>Output title before <tag>refname</tag>s?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="refentry.generate.title.frag">
+&lt;xsl:param name="refentry.generate.title" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, the reference page title or first name is
+output before the list of <tag>refname</tag>s. This parameter and
+<parameter>refentry.generate.name</parameter> are mutually exclusive.
+This means that if you change this parameter to non-zero, you
+should set <parameter>refentry.generate.name</parameter> to zero unless
+you want get quite strange output.</para>
+
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="refentry.xref.manvolnum">
+<refmeta>
+<refentrytitle>refentry.xref.manvolnum</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>refentry.xref.manvolnum</refname>
+<refpurpose>Output <tag>manvolnum</tag> as part of
+<tag>refentry</tag> cross-reference?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="refentry.xref.manvolnum.frag">
+&lt;xsl:param name="refentry.xref.manvolnum" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>if non-zero, the <tag>manvolnum</tag> is used when cross-referencing
+<tag>refentry</tag>s, either with <tag>xref</tag>
+or <tag>citerefentry</tag>.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="citerefentry.link">
+<refmeta>
+<refentrytitle>citerefentry.link</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>citerefentry.link</refname>
+<refpurpose>Generate URL links when cross-referencing RefEntrys?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="citerefentry.link.frag">
+&lt;xsl:param name="citerefentry.link" select="0"&gt;&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, a web link will be generated, presumably
+to an online man-&gt;HTML gateway. The text of the link is
+generated by the <literal>generate.citerefentry.link</literal> template.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="refentry.separator">
+<refmeta>
+<refentrytitle>refentry.separator</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>refentry.separator</refname>
+<refpurpose>Generate a separator between consecutive RefEntry elements?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="refentry.separator.frag">
+&lt;xsl:param name="refentry.separator" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If true, a separator will be generated between consecutive
+reference pages.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="refclass.suppress">
+<refmeta>
+<refentrytitle>refclass.suppress</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>refclass.suppress</refname>
+<refpurpose>Suppress display of refclass contents?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="refclass.suppress.frag">
+&lt;xsl:param name="refclass.suppress" select="0"&gt;&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If the value of <parameter>refclass.suppress</parameter> is
+non-zero, then display of <tag>refclass</tag> contents is
+suppressed in output.</para>
+
+</refsection>
+</refentry>
+
+</reference><reference id="tables" xml:base="../html/param.xml"><title>Tables</title>
+<refentry version="5.0" id="default.table.width">
+<refmeta>
+<refentrytitle>default.table.width</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">length</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>default.table.width</refname>
+<refpurpose>The default width of tables</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+<programlisting id="default.table.width.frag">
+&lt;xsl:param name="default.table.width"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+<para>If non-zero, this value will be used for the
+<literal>width</literal> attribute on <tag>table</tag>s that do not specify an
+alternate width (with the <tag class="xmlpi">dbhtml table-width</tag> or
+<tag class="xmlpi">dbfo table-width</tag> processing instruction).</para>
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="nominal.table.width">
+<refmeta>
+<refentrytitle>nominal.table.width</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">length</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>nominal.table.width</refname>
+<refpurpose>The (absolute) nominal width of tables</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="nominal.table.width.frag">
+&lt;xsl:param name="nominal.table.width"&gt;6in&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>In order to convert CALS column widths into HTML column widths, it
+is sometimes necessary to have an absolute table width to use for conversion
+of mixed absolute and relative widths. This value must be an absolute
+length (not a percentage).</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="table.borders.with.css">
+<refmeta>
+<refentrytitle>table.borders.with.css</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>table.borders.with.css</refname>
+<refpurpose>Use CSS to specify table, row, and cell borders?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="table.borders.with.css.frag">
+&lt;xsl:param name="table.borders.with.css" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, CSS will be used to draw table borders.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="table.cell.border.style">
+<refmeta>
+<refentrytitle>table.cell.border.style</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">list</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">none</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">solid</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">dotted</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">dashed</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">double</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">groove</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">ridge</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">inset</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">outset</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">solid</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>table.cell.border.style</refname>
+<refpurpose>Specifies the border style of table cells</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="table.cell.border.style.frag">
+&lt;xsl:param name="table.cell.border.style"&gt;solid&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies the border style of table cells.</para>
+
+<note>
+ <para>To control properties of cell borders in HTML output, you must also turn on the
+ <parameter>table.borders.with.css</parameter> parameter.</para>
+</note>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="table.cell.border.thickness">
+<refmeta>
+<refentrytitle>table.cell.border.thickness</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">length</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>table.cell.border.thickness</refname>
+<refpurpose>Specifies the thickness of table cell borders</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="table.cell.border.thickness.frag">
+&lt;xsl:param name="table.cell.border.thickness"&gt;0.5pt&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, specifies the thickness of borders on table
+cells. The units are points. See <link xlink:href="http://www.w3.org/TR/CSS21/box.html#border-width-properties">
+CSS</link></para>
+
+<note>
+ <para>To control properties of cell borders in HTML output, you must also turn on the
+ <parameter>table.borders.with.css</parameter> parameter.</para>
+</note>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="table.cell.border.color">
+<refmeta>
+<refentrytitle>table.cell.border.color</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">color</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>table.cell.border.color</refname>
+<refpurpose>Specifies the border color of table cells</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="table.cell.border.color.frag">
+&lt;xsl:param name="table.cell.border.color"&gt;&lt;/xsl:param&gt;
+
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Set the color of table cell borders. If non-zero, the value is used
+for the border coloration. See <link xlink:href="http://www.w3.org/TR/CSS21/syndata.html#value-def-color">CSS</link>. A
+<literal>color</literal> is either a keyword or a numerical RGB specification.
+Keywords are aqua, black, blue, fuchsia, gray, green, lime, maroon,
+navy, olive, orange, purple, red, silver, teal, white, and
+yellow.</para>
+
+<note>
+ <para>To control properties of cell borders in HTML output, you must also turn on the
+ <parameter>table.borders.with.css</parameter> parameter.</para>
+</note>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="table.frame.border.style">
+<refmeta>
+<refentrytitle>table.frame.border.style</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">list</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">none</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">solid</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">dotted</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">dashed</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">double</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">groove</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">ridge</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">inset</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">outset</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">solid</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>table.frame.border.style</refname>
+<refpurpose>Specifies the border style of table frames</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="table.frame.border.style.frag">
+&lt;xsl:param name="table.frame.border.style"&gt;solid&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies the border style of table frames.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="table.frame.border.thickness">
+<refmeta>
+<refentrytitle>table.frame.border.thickness</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">length</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>table.frame.border.thickness</refname>
+<refpurpose>Specifies the thickness of the frame border</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="table.frame.border.thickness.frag">
+&lt;xsl:param name="table.frame.border.thickness"&gt;0.5pt&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies the thickness of the border on the table's frame.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="table.frame.border.color">
+<refmeta>
+<refentrytitle>table.frame.border.color</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">color</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>table.frame.border.color</refname>
+<refpurpose>Specifies the border color of table frames</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="table.frame.border.color.frag">
+&lt;xsl:param name="table.frame.border.color"&gt;&lt;/xsl:param&gt;
+
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies the border color of table frames.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="default.table.frame">
+<refmeta>
+<refentrytitle>default.table.frame</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>default.table.frame</refname>
+<refpurpose>The default framing of tables</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="default.table.frame.frag">
+&lt;xsl:param name="default.table.frame"&gt;all&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>This value will be used when there is no frame attribute on the
+table. </para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="html.cellspacing">
+<refmeta>
+<refentrytitle>html.cellspacing</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">integer</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>html.cellspacing</refname>
+<refpurpose>Default value for cellspacing in HTML tables</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="html.cellspacing.frag">
+&lt;xsl:param name="html.cellspacing"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, this value will be used as the default cellspacing
+value in HTML tables. nn for pixels or nn% for percentage
+length. E.g. 5 or 5%</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="html.cellpadding">
+<refmeta>
+<refentrytitle>html.cellpadding</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">integer</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>html.cellpadding</refname>
+<refpurpose>Default value for cellpadding in HTML tables</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="html.cellpadding.frag">
+&lt;xsl:param name="html.cellpadding"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, this value will be used as the default cellpadding value
+in HTML tables. nn for pixels or nn% for percentage length. E.g. 5 or
+5%</para>
+
+</refsection>
+</refentry>
+
+</reference><reference id="qa" xml:base="../html/param.xml"><title>QAndASet</title>
+<refentry version="5.0" id="qanda.defaultlabel">
+<refmeta>
+<refentrytitle>qanda.defaultlabel</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">list</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">number</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">qanda</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">none</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>qanda.defaultlabel</refname>
+<refpurpose>Sets the default for defaultlabel on QandASet.</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="qanda.defaultlabel.frag">
+&lt;xsl:param name="qanda.defaultlabel"&gt;number&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If no <literal>defaultlabel</literal> attribute is specified on
+a <tag>qandaset</tag>, this value is used. It is generally one of the legal
+values for the defaultlabel attribute (<literal>none</literal>,
+<literal>number</literal> or
+<literal>qanda</literal>), or one of the additional stylesheet-specific values
+(<literal>qnumber</literal> or <literal>qnumberanda</literal>).
+The default value is 'number'.
+</para>
+<para>The values are rendered as follows:</para>
+<variablelist>
+<varlistentry><term><literal>qanda</literal></term>
+<listitem>
+<para><tag>question</tag>s are labeled "Q:" and
+<tag>answer</tag>s are labeled "A:". </para>
+</listitem>
+</varlistentry>
+
+<varlistentry><term><literal>number</literal></term>
+<listitem>
+<para>The questions are enumerated and the answers
+are not labeled. </para>
+</listitem>
+</varlistentry>
+
+<varlistentry><term><literal>qnumber</literal></term>
+<listitem>
+<para>The questions are labeled "Q:" followed by a number, and answers are not
+labeled.
+When sections are numbered, adding a label
+to the number distinguishes the question numbers
+from the section numbers.
+This value is not allowed in the
+<tag class="attribute">defaultlabel</tag> attribute
+of a <tag>qandaset</tag> element.</para>
+</listitem>
+</varlistentry>
+
+<varlistentry><term><literal>qnumberanda</literal></term>
+<listitem>
+<para>The questions are labeled "Q:" followed by a number, and
+the answers are labeled "A:".
+When sections are numbered, adding a label
+to the number distinguishes the question numbers
+from the section numbers.
+This value is not allowed in the
+<tag class="attribute">defaultlabel</tag> attribute
+of a <tag>qandaset</tag> element.</para>
+</listitem>
+</varlistentry>
+
+<varlistentry><term><literal>none</literal></term>
+<listitem>
+<para>No distinguishing label precedes Questions or Answers.
+</para>
+</listitem>
+</varlistentry>
+</variablelist>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="qanda.inherit.numeration">
+<refmeta>
+<refentrytitle>qanda.inherit.numeration</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>qanda.inherit.numeration</refname>
+<refpurpose>Does enumeration of QandASet components inherit the numeration of parent elements?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="qanda.inherit.numeration.frag">
+&lt;xsl:param name="qanda.inherit.numeration" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, numbered <tag>qandadiv</tag> elements and
+<tag>question</tag> and <tag>answer</tag> inherit the enumeration of
+the ancestors of the <tag>qandaset</tag>.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="qanda.in.toc">
+<refmeta>
+<refentrytitle>qanda.in.toc</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>qanda.in.toc</refname>
+<refpurpose>Should qandaentry questions appear in
+the document table of contents?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="qanda.in.toc.frag">&lt;xsl:param name="qanda.in.toc" select="0"&gt;&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If true (non-zero), then the generated table of contents
+for a document will include <tag>qandaset</tag> titles,
+<tag>qandadiv</tag> titles,
+and <tag>question</tag> elements. The default value (zero) excludes
+them from the TOC.
+</para>
+<para>This parameter does not affect any tables of contents
+that may be generated inside a qandaset or qandadiv.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="qanda.nested.in.toc">
+<refmeta>
+<refentrytitle>qanda.nested.in.toc</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>qanda.nested.in.toc</refname>
+<refpurpose>Should nested answer/qandaentry instances appear in TOC?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="qanda.nested.in.toc.frag">
+&lt;xsl:param name="qanda.nested.in.toc" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, instances of <tag>qandaentry</tag>
+that are children of <tag>answer</tag> elements are shown in
+the TOC.</para>
+
+</refsection>
+</refentry>
+
+</reference><reference id="links" xml:base="../html/param.xml"><title>Linking</title>
+<refentry version="5.0" id="target.database.document">
+<refmeta>
+<refentrytitle>target.database.document</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">uri</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>target.database.document</refname>
+<refpurpose>Name of master database file for resolving
+olinks</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+<programlisting id="target.database.document.frag">
+ &lt;xsl:param name="target.database.document"&gt;olinkdb.xml&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+
+<para>
+To resolve olinks between documents, the stylesheets use a master
+database document that identifies the target datafiles for all the
+documents within the scope of the olinks. This parameter value is the
+URI of the master document to be read during processing to resolve
+olinks. The default value is <filename>olinkdb.xml</filename>.</para>
+
+<para>The data structure of the file is defined in the
+<filename>targetdatabase.dtd</filename> DTD. The database file
+provides the high level elements to record the identifiers, locations,
+and relationships of documents. The cross reference data for
+individual documents is generally pulled into the database using
+system entity references or XIncludes. See also
+<parameter>targets.filename</parameter>. </para> </refsection>
+</refentry>
+
+<refentry version="5.0" id="targets.filename">
+<refmeta>
+<refentrytitle>targets.filename</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>targets.filename</refname>
+<refpurpose>Name of cross reference targets data file</refpurpose>
+</refnamediv>
+<refsynopsisdiv> <programlisting id="targets.filename.frag">
+&lt;xsl:param name="targets.filename"&gt;target.db&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+
+<para>
+In order to resolve olinks efficiently, the stylesheets can
+generate an external data file containing information about
+all potential cross reference endpoints in a document.
+This parameter lets you change the name of the generated
+file from the default name <filename>target.db</filename>.
+The name must agree with that used in the target database
+used to resolve olinks during processing.
+See also <parameter>target.database.document</parameter>.
+</para>
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="olink.base.uri">
+<refmeta>
+<refentrytitle>olink.base.uri</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">uri</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>olink.base.uri</refname>
+<refpurpose>Base URI used in olink hrefs</refpurpose>
+</refnamediv>
+<refsynopsisdiv> <programlisting id="olink.base.uri.frag">
+&lt;xsl:param name="olink.base.uri"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+
+<para>When cross reference data is collected for resolving olinks, it
+may be necessary to prepend a base URI to each target's href. This
+parameter lets you set that base URI when cross reference data is
+collected. This feature is needed when you want to link to a document
+that is processed without chunking. The output filename for such a
+document is not known to the XSL stylesheet; the only target
+information consists of fragment identifiers such as
+<literal>#idref</literal>. To enable the resolution of olinks between
+documents, you should pass the name of the HTML output file as the
+value of this parameter. Then the hrefs recorded in the cross
+reference data collection look like
+<literal>outfile.html#idref</literal>, which can be reached as links
+from other documents.</para>
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="use.local.olink.style">
+<refmeta>
+<refentrytitle>use.local.olink.style</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>use.local.olink.style</refname>
+<refpurpose>Process olinks using xref style of current
+document</refpurpose>
+</refnamediv>
+<refsynopsisdiv> <programlisting id="use.local.olink.style.frag">
+&lt;xsl:param name="use.local.olink.style" select="0"&gt;&lt;/xsl:param&gt; </programlisting>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+
+<para>When cross reference data is collected for use by olinks, the data for each potential target includes one field containing a completely assembled cross reference string, as if it were an xref generated in that document. Other fields record the separate title, number, and element name of each target. When an olink is formed to a target from another document, the olink resolves to that preassembled string by default. If the <parameter>use.local.olink.style</parameter> parameter is set to non-zero, then instead the cross
+reference string is formed again from the target title, number, and
+element name, using the stylesheet processing the targeting document.
+Then olinks will match the xref style in the targeting document
+rather than in the target document. If both documents are processed
+with the same stylesheet, then the results will be the same.</para>
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="current.docid">
+<refmeta>
+<refentrytitle>current.docid</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>current.docid</refname>
+<refpurpose>targetdoc identifier for the document being
+processed</refpurpose>
+</refnamediv>
+<refsynopsisdiv> <programlisting id="current.docid.frag">
+&lt;xsl:param name="current.docid"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+
+<para>When olinks between documents are resolved for HTML output, the stylesheet can compute the relative path between the current document and the target document. The stylesheet needs to know the <literal>targetdoc</literal> identifiers for both documents, as they appear in the <parameter>target.database.document</parameter> database file. This parameter passes to the stylesheet
+the targetdoc identifier of the current document, since that
+identifier does not appear in the document itself. </para>
+<para>This parameter can also be used for print output. If an olink's <literal>targetdoc</literal> id differs from the <literal>current.docid</literal>, then the stylesheet can append the target document's title to the generated olink text. That identifies to the reader that the link is to a different document, not the current document. See also <parameter>olink.doctitle</parameter> to enable that feature.</para>
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="olink.doctitle">
+<refmeta>
+<refentrytitle>olink.doctitle</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">list</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">no</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">yes</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">maybe</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>olink.doctitle</refname>
+<refpurpose>show the document title for external olinks?</refpurpose>
+
+</refnamediv>
+<refsynopsisdiv> <programlisting id="olink.doctitle.frag">
+&lt;xsl:param name="olink.doctitle"&gt;no&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+
+<para>When olinks between documents are resolved, the generated text
+may not make it clear that the reference is to another document.
+It is possible for the stylesheets to append the other document's
+title to external olinks. For this to happen, two parameters must
+be set.</para>
+<itemizedlist>
+<listitem>
+<para>This <parameter>olink.doctitle</parameter> parameter
+should be set to either <literal>yes</literal> or <literal>maybe</literal>
+to enable this feature.
+</para>
+</listitem>
+<listitem>
+<para>And you should also set the <parameter>current.docid</parameter>
+parameter to the document id for the document currently
+being processed for output.
+</para>
+</listitem>
+</itemizedlist>
+
+<para>
+Then if an olink's <literal>targetdoc</literal> id differs from
+the <literal>current.docid</literal> value, the stylesheet knows
+that it is a reference to another document and can
+append the target document's
+title to the generated olink text. </para>
+
+<para>The text for the target document's title is copied from the
+olink database from the <tag>ttl</tag> element
+of the top-level <tag>div</tag> for that document.
+If that <tag>ttl</tag> element is missing or empty,
+no title is output.
+</para>
+
+<para>The supported values for <parameter>olink.doctitle</parameter> are:
+</para>
+<variablelist>
+<varlistentry>
+<term><literal>yes</literal></term>
+<listitem>
+<para>
+Always insert the title to the target document if it is not
+the current document.
+</para>
+</listitem>
+</varlistentry>
+<varlistentry>
+<term><literal>no</literal></term>
+<listitem>
+<para>
+Never insert the title to the target document, even if requested
+in an <tag class="attribute">xrefstyle</tag> attribute.
+</para>
+</listitem>
+</varlistentry>
+<varlistentry>
+<term><literal>maybe</literal></term>
+<listitem>
+<para>
+Only insert the title to the target document, if requested
+in an <tag class="attribute">xrefstyle</tag> attribute.
+</para>
+</listitem>
+</varlistentry>
+</variablelist>
+<para>An <tag class="attribute">xrefstyle</tag> attribute
+may override the global setting for individual olinks.
+The following values are supported in an
+<tag class="attribute">xrefstyle</tag>
+attribute using the <literal>select:</literal> syntax:
+</para>
+
+<variablelist>
+<varlistentry>
+<term><literal>docname</literal></term>
+<listitem>
+<para>
+Insert the target document name for this olink using the
+<literal>docname</literal> gentext template, but only
+if the value of <parameter>olink.doctitle</parameter>
+is not <literal>no</literal>.
+</para>
+</listitem>
+</varlistentry>
+<varlistentry>
+<term><literal>docnamelong</literal></term>
+<listitem>
+<para>
+Insert the target document name for this olink using the
+<literal>docnamelong</literal> gentext template, but only
+if the value of <parameter>olink.doctitle</parameter>
+is not <literal>no</literal>.
+</para>
+</listitem>
+</varlistentry>
+<varlistentry>
+<term><literal>nodocname</literal></term>
+<listitem>
+<para>
+Omit the target document name even if
+the value of <parameter>olink.doctitle</parameter>
+is <literal>yes</literal>.
+</para>
+</listitem>
+</varlistentry>
+</variablelist>
+<para>Another way of inserting the target document name
+for a single olink is to employ an
+<tag class="attribute">xrefstyle</tag>
+attribute using the <literal>template:</literal> syntax.
+The <literal>%o</literal> placeholder (the letter o, not zero)
+in such a template
+will be filled in with the target document's title when it is processed.
+This will occur regardless of
+the value of <parameter>olink.doctitle</parameter>.
+</para>
+<para>Note that prior to version 1.66 of the XSL stylesheets,
+the allowed values for this parameter were 0 and 1. Those
+values are still supported and mapped to 'no' and 'yes', respectively.
+</para>
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="olink.debug">
+<refmeta>
+<refentrytitle>olink.debug</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>olink.debug</refname>
+<refpurpose>Turn on debugging messages for olinks</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="olink.debug.frag">
+&lt;xsl:param name="olink.debug" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, then each olink will generate several
+messages about how it is being resolved during processing.
+This is useful when an olink does not resolve properly
+and the standard error messages are not sufficient to
+find the problem.
+</para>
+
+<para>You may need to read through the olink XSL templates
+to understand the context for some of the debug messages.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="olink.properties">
+<refmeta>
+<refentrytitle>olink.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>olink.properties</refname>
+<refpurpose>Properties associated with the cross-reference
+text of an olink.</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="olink.properties.frag">
+&lt;xsl:attribute-set name="olink.properties"&gt;
+ &lt;xsl:attribute name="show-destination"&gt;replace&lt;/xsl:attribute&gt;
+&lt;/xsl:attribute-set&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>This <literal>attribute set</literal> is applied to the
+<literal>fo:basic-link</literal> element of an olink. It is not applied to the
+optional page number or optional title of the external
+document.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="olink.lang.fallback.sequence">
+<refmeta>
+<refentrytitle>olink.lang.fallback.sequence</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>olink.lang.fallback.sequence</refname>
+<refpurpose>look up translated documents if olink not found?</refpurpose>
+
+</refnamediv>
+<refsynopsisdiv> <programlisting id="olink.lang.fallback.sequence.frag">
+&lt;xsl:param name="olink.lang.fallback.sequence"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+
+
+<para>This parameter defines a list of lang values
+to search among to resolve olinks.
+</para>
+
+<para>Normally an olink tries to resolve to a document in the same
+language as the olink itself. The language of an olink
+is determined by its nearest ancestor element with a
+<tag class="attribute">lang</tag> attribute, otherwise the
+value of the <parameter>l10n.gentext.default.lang</parameter>
+parameter.
+</para>
+
+<para>An olink database can contain target data for the same
+document in multiple languages. Each set of data has the
+same value for the <tag>targetdoc</tag> attribute in
+the <tag>document</tag> element in the database, but with a
+different <tag>lang</tag> attribute value.
+</para>
+
+<para>When an olink is being resolved, the target is first
+sought in the document with the same language as the olink.
+If no match is found there, then this parameter is consulted
+for additional languages to try.</para>
+
+<para>The <parameter>olink.lang.fallback.sequence</parameter>
+must be a whitespace separated list of lang values to
+try. The first one with a match in the olink database is used.
+The default value is empty.</para>
+
+<para>For example, a document might be written in German
+and contain an olink with
+<literal>targetdoc="adminguide"</literal>.
+When the document is processed, the processor
+first looks for a target dataset in the
+olink database starting with:</para>
+
+<literallayout><literal>&lt;document targetdoc="adminguide" lang="de"&gt;</literal>.
+</literallayout>
+
+<para>If there is no such element, then the
+<parameter>olink.lang.fallback.sequence</parameter>
+parameter is consulted.
+If its value is, for example, <quote>fr en</quote>, then the processor next
+looks for <literal>targetdoc="adminguide" lang="fr"</literal>, and
+then for <literal>targetdoc="adminguide" lang="en"</literal>.
+If there is still no match, it looks for
+<literal>targetdoc="adminguide"</literal> with no
+lang attribute.
+</para>
+
+<para>This parameter is useful when a set of documents is only
+partially translated, or is in the process of being translated.
+If a target of an olink has not yet been translated, then this
+parameter permits the processor to look for the document in
+other languages. This assumes the reader would rather have
+a link to a document in a different language than to have
+a broken link.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="insert.olink.page.number">
+<refmeta>
+<refentrytitle>insert.olink.page.number</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">list</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">no</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">yes</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">maybe</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>insert.olink.page.number</refname>
+<refpurpose>Turns page numbers in olinks on and off</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="insert.olink.page.number.frag">
+&lt;xsl:param name="insert.olink.page.number"&gt;no&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The value of this parameter determines if
+cross references made between documents with
+<tag>olink</tag> will
+include page number citations.
+In most cases this is only applicable to references in printed output.
+</para>
+<para>The parameter has three possible values.
+</para>
+<variablelist>
+<varlistentry>
+<term>no</term>
+<listitem><para>No page number references will be generated for olinks.
+</para></listitem>
+</varlistentry>
+<varlistentry>
+<term>yes</term>
+<listitem><para>Page number references will be generated
+for all <tag>olink</tag> references.
+The style of page reference may be changed
+if an <tag class="attribute">xrefstyle</tag>
+attribute is used.
+</para></listitem>
+</varlistentry>
+<varlistentry>
+<term>maybe</term>
+<listitem><para>Page number references will not be generated
+for an <tag>olink</tag> element unless
+it has an
+<tag class="attribute">xrefstyle</tag>
+attribute whose value specifies a page reference.
+</para></listitem>
+</varlistentry>
+</variablelist>
+<para>Olinks that point to targets within the same document
+are treated as <tag>xref</tag>s, and controlled by
+the <parameter>insert.xref.page.number</parameter> parameter.
+</para>
+
+<para>Page number references for olinks to
+external documents can only be inserted if the
+information exists in the olink database.
+This means each olink target element
+(<tag>div</tag> or <tag>obj</tag>)
+must have a <tag class="attribute">page</tag> attribute
+whose value is its page number in the target document.
+The XSL stylesheets are not able to extract that information
+during processing because pages have not yet been created in
+XSLT transformation. Only the XSL-FO processor knows what
+page each element is placed on.
+Therefore some postprocessing must take place to populate
+page numbers in the olink database.
+</para>
+
+
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="insert.olink.pdf.frag">
+<refmeta>
+<refentrytitle>insert.olink.pdf.frag</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>insert.olink.pdf.frag</refname>
+<refpurpose>Add fragment identifiers for links into PDF files</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="insert.olink.pdf.frag.frag">
+&lt;xsl:param name="insert.olink.pdf.frag" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The value of this parameter determines whether
+the cross reference URIs to PDF documents made with
+<tag>olink</tag> will
+include fragment identifiers.
+</para>
+
+<para>When forming a URI to link to a PDF document,
+a fragment identifier (typically a '#' followed by an
+id value) appended to the PDF filename can be used by
+the PDF viewer to open
+the PDF file to a location within the document instead of
+the first page.
+However, not all PDF files have id
+values embedded in them, and not all PDF viewers can
+handle fragment identifiers.
+</para>
+
+<para>If <parameter>insert.olink.pdf.frag</parameter> is set
+to a non-zero value, then any olink targeting a
+PDF file will have the fragment identifier appended to the URI.
+The URI is formed by concatenating the value of the
+<parameter>olink.base.uri</parameter> parameter, the
+value of the <tag class="attribute">baseuri</tag>
+attribute from the <tag class="element">document</tag>
+element in the olink database with the matching
+<tag class="attribute">targetdoc</tag> value,
+and the value of the <tag class="attribute">href</tag>
+attribute for the targeted element in the olink database.
+The <tag class="attribute">href</tag> attribute
+contains the fragment identifier.
+</para>
+
+<para>If <parameter>insert.olink.pdf.frag</parameter> is set
+to zero (the default value), then
+the <tag class="attribute">href</tag> attribute
+from the olink database
+is not appended to PDF olinks, so the fragment identifier is left off.
+A PDF olink is any olink for which the
+<tag class="attribute">baseuri</tag> attribute
+from the matching <tag class="element">document</tag>
+element in the olink database ends with '.pdf'.
+Any other olinks will still have the fragment identifier added.
+</para>
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="prefer.internal.olink">
+<refmeta>
+<refentrytitle>prefer.internal.olink</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>prefer.internal.olink</refname>
+<refpurpose>Prefer a local olink reference to an external reference</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="prefer.internal.olink.frag">
+&lt;xsl:param name="prefer.internal.olink" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If you are re-using XML content modules in multiple documents,
+you may want to redirect some of your olinks. This parameter
+permits you to redirect an olink to the current document.
+</para>
+
+<para>For example: you are writing documentation for a product,
+which includes 3 manuals: a little installation
+booklet (booklet.xml), a user
+guide (user.xml), and a reference manual (reference.xml).
+All 3 documents begin with the same introduction section (intro.xml) that
+contains a reference to the customization section (custom.xml) which is
+included in both user.xml and reference.xml documents.
+</para>
+
+<para>How do you write the link to custom.xml in intro.xml
+so that it is interpreted correctly in all 3 documents?</para>
+<itemizedlist>
+<listitem><para>If you use xref, it will fail in user.xml.</para>
+</listitem>
+<listitem><para>If you use olink (pointing to reference.xml),
+the reference in user.xml
+will point to the customization section of the reference manual, while it is
+actually available in user.xml.</para>
+</listitem>
+</itemizedlist>
+
+<para>If you set the <parameter>prefer.internal.olink</parameter>
+parameter to a non-zero value, then the processor will
+first look in the olink database
+for the olink's <tag>targetptr</tag> attribute value
+in document matching the <parameter>current.docid</parameter>
+parameter value. If it isn't found there, then
+it tries the document in the database
+with the <tag>targetdoc</tag>
+value that matches the olink's <tag>targetdoc</tag>
+attribute.
+</para>
+
+<para>This feature permits an olink reference to resolve to
+the current document if there is an element
+with an id matching the olink's <tag>targetptr</tag>
+value. The current document's olink data must be
+included in the target database for this to work.</para>
+
+<caution>
+<para>There is a potential for incorrect links if
+the same <tag>id</tag> attribute value is used for different
+content in different documents.
+Some of your olinks may be redirected to the current document
+when they shouldn't be. It is not possible to control
+individual olink instances.</para>
+</caution>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="link.mailto.url">
+<refmeta>
+<refentrytitle>link.mailto.url</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>link.mailto.url</refname>
+<refpurpose>Mailto URL for the LINK REL=made HTML HEAD element</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="link.mailto.url.frag">
+&lt;xsl:param name="link.mailto.url"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If not the empty string, this address will be used for the
+rel=made <literal>link</literal> element in the html <literal>head</literal>
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="ulink.target">
+<refmeta>
+<refentrytitle>ulink.target</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>ulink.target</refname>
+<refpurpose>The HTML anchor target for ULinks</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="ulink.target.frag">
+&lt;xsl:param name="ulink.target"&gt;_top&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If <parameter>ulink.target</parameter> is non-zero, its value will
+be used for the <literal>target</literal> attribute
+on anchors generated for <tag>ulink</tag>s.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="olink.fragid">
+<refmeta>
+<refentrytitle>olink.fragid</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>olink.fragid</refname>
+<refpurpose>Names the fragment identifier portion of an OLink resolver query</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+<programlisting id="olink.fragid.frag">
+&lt;xsl:param name="olink.fragid"&gt;fragid=&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+<para>The fragment identifier portion of an <tag>olink</tag> target.</para>
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="olink.outline.ext">
+<refmeta>
+<refentrytitle>olink.outline.ext</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>olink.outline.ext</refname>
+<refpurpose>The extension of OLink outline files</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="olink.outline.ext.frag">
+&lt;xsl:param name="olink.outline.ext"&gt;.olink&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The extension to be expected for OLink outline files</para>
+<para>Bob has this parameter as dead. Please don't use</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="olink.pubid">
+<refmeta>
+<refentrytitle>olink.pubid</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>olink.pubid</refname>
+<refpurpose>Names the public identifier portion of an OLink resolver query</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="olink.pubid.frag">
+&lt;xsl:param name="olink.pubid"&gt;pubid&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para/>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="olink.sysid">
+<refmeta>
+<refentrytitle>olink.sysid</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>olink.sysid</refname>
+<refpurpose>Names the system identifier portion of an OLink resolver query</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="olink.sysid.frag">
+&lt;xsl:param name="olink.sysid"&gt;sysid&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>FIXME</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="olink.resolver">
+<refmeta>
+<refentrytitle>olink.resolver</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>olink.resolver</refname>
+<refpurpose>The root name of the OLink resolver (usually a script)</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+<programlisting id="olink.resolver.frag">
+ &lt;xsl:param name="olink.resolver"&gt;/cgi-bin/olink&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+<para>FIXME:</para>
+</refsection>
+</refentry>
+
+</reference><reference id="xrefs" xml:base="../html/param.xml"><title>Cross References</title>
+<refentry version="5.0" id="collect.xref.targets">
+<refmeta>
+<refentrytitle>collect.xref.targets</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">list</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">no</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">yes</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">only</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>collect.xref.targets</refname>
+<refpurpose>Controls whether cross reference data is
+collected</refpurpose>
+</refnamediv>
+<refsynopsisdiv> <programlisting id="collect.xref.targets.frag">
+&lt;xsl:param name="collect.xref.targets"&gt;no&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+
+<para>
+In order to resolve olinks efficiently, the stylesheets can
+generate an external data file containing information about
+all potential cross reference endpoints in a document.
+This parameter determines whether the collection process is run when the document is processed by the stylesheet. The default value is <literal>no</literal>, which means the data file is not generated during processing. The other choices are <literal>yes</literal>, which means the data file is created and the document is processed for output, and <literal>only</literal>, which means the data file is created but the document is not processed for output.
+See also <parameter>targets.filename</parameter>.
+</para>
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="insert.xref.page.number">
+<refmeta>
+<refentrytitle>insert.xref.page.number</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">list</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">no</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">yes</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">maybe</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>insert.xref.page.number</refname>
+<refpurpose>Turns page numbers in xrefs on and off</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="insert.xref.page.number.frag">
+&lt;xsl:param name="insert.xref.page.number"&gt;no&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The value of this parameter determines if
+cross references (<tag>xref</tag>s) in
+printed output will
+include page number citations.
+It has three possible values.
+</para>
+<variablelist>
+<varlistentry>
+<term>no</term>
+<listitem><para>No page number references will be generated.
+</para></listitem>
+</varlistentry>
+<varlistentry>
+<term>yes</term>
+<listitem><para>Page number references will be generated
+for all <tag>xref</tag> elements.
+The style of page reference may be changed
+if an <tag class="attribute">xrefstyle</tag>
+attribute is used.
+</para></listitem>
+</varlistentry>
+<varlistentry>
+<term>maybe</term>
+<listitem><para>Page number references will not be generated
+for an <tag>xref</tag> element unless
+it has an
+<tag class="attribute">xrefstyle</tag>
+attribute whose value specifies a page reference.
+</para></listitem>
+</varlistentry>
+</variablelist>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="use.role.as.xrefstyle">
+<refmeta>
+<refentrytitle>use.role.as.xrefstyle</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>use.role.as.xrefstyle</refname>
+<refpurpose>Use <tag class="attribute">role</tag> attribute for
+<tag class="attribute">xrefstyle</tag> on <tag>xref</tag>?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="use.role.as.xrefstyle.frag">
+&lt;xsl:param name="use.role.as.xrefstyle" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>In DocBook documents that conform to a schema older than V4.3, this parameter allows
+<tag class="attribute">role</tag> to serve the purpose of specifying the cross reference style.</para>
+
+<para>If non-zero, the <tag class="attribute">role</tag> attribute on
+<tag>xref</tag> will be used to select the cross reference style.
+In DocBook V4.3, the <tag class="attribute">xrefstyle</tag> attribute was added for this purpose.
+If the <tag class="attribute">xrefstyle</tag> attribute is present,
+<tag class="attribute">role</tag> will be ignored, regardless of the setting
+of this parameter.</para>
+
+</refsection>
+
+<refsection><info><title>Example</title></info>
+
+<para>The following small stylesheet shows how to configure the
+stylesheets to make use of the cross reference style:</para>
+
+<programlisting>&lt;?xml version="1.0"?&gt;
+&lt;xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="1.0"&gt;
+
+&lt;xsl:import href="../xsl/html/docbook.xsl"/&gt;
+
+&lt;xsl:output method="html"/&gt;
+
+&lt;xsl:param name="local.l10n.xml" select="document('')"/&gt;
+&lt;l:i18n xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0"&gt;
+ &lt;l:l10n xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0" language="en"&gt;
+ &lt;l:context name="xref"&gt;
+ &lt;l:template name="chapter" style="title" text="Chapter %n, %t"/&gt;
+ &lt;l:template name="chapter" text="Chapter %n"/&gt;
+ &lt;/l:context&gt;
+ &lt;/l:l10n&gt;
+&lt;/l:i18n&gt;
+
+&lt;/xsl:stylesheet&gt;</programlisting>
+
+<para>With this stylesheet, the cross references in the following document:</para>
+
+<programlisting>&lt;?xml version="1.0" encoding="utf-8"?&gt;
+&lt;!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
+ "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd"&gt;
+&lt;book id="book"&gt;&lt;title&gt;Book&lt;/title&gt;
+
+&lt;preface&gt;
+&lt;title&gt;Preface&lt;/title&gt;
+
+&lt;para&gt;Normal: &lt;xref linkend="ch1"/&gt;.&lt;/para&gt;
+&lt;para&gt;Title: &lt;xref xrefstyle="title" linkend="ch1"/&gt;.&lt;/para&gt;
+
+&lt;/preface&gt;
+
+&lt;chapter id="ch1"&gt;
+&lt;title&gt;First Chapter&lt;/title&gt;
+
+&lt;para&gt;Irrelevant.&lt;/para&gt;
+
+&lt;/chapter&gt;
+&lt;/book&gt;</programlisting>
+
+<para>will appear as:</para>
+
+<informalexample>
+<para>Normal: Chapter 1.</para>
+<para>Title: Chapter 1, <emphasis>First Chapter</emphasis>.</para>
+</informalexample>
+</refsection>
+
+</refentry>
+
+<refentry version="5.0" id="xref.with.number.and.title">
+<refmeta>
+<refentrytitle>xref.with.number.and.title</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>xref.with.number.and.title</refname>
+<refpurpose>Use number and title in cross references</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="xref.with.number.and.title.frag">
+&lt;xsl:param name="xref.with.number.and.title" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>A cross reference may include the number (for example, the number of
+an example or figure) and the <tag>title</tag> which is a required child of some
+targets. This parameter inserts both the relevant number as well as
+the title into the link. </para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="xref.label-page.separator">
+<refmeta>
+<refentrytitle>xref.label-page.separator</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>xref.label-page.separator</refname>
+<refpurpose>Punctuation or space separating label from page number in xref</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="xref.label-page.separator.frag">&lt;xsl:param name="xref.label-page.separator"&gt;&lt;xsl:text&gt; &lt;/xsl:text&gt;&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>
+This parameter allows you to control the punctuation of certain
+types of generated cross reference text.
+When cross reference text is generated for an
+<tag class="element">xref</tag> or
+<tag class="element">olink</tag> element
+using an <tag class="attribute">xrefstyle</tag> attribute
+that makes use of the <literal>select:</literal> feature,
+and the selected components include both label and page
+but no title,
+then the value of this parameter is inserted between
+label and page number in the output.
+If a title is included, then other separators are used.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="xref.label-title.separator">
+<refmeta>
+<refentrytitle>xref.label-title.separator</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>xref.label-title.separator</refname>
+<refpurpose>Punctuation or space separating label from title in xref</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="xref.label-title.separator.frag">&lt;xsl:param name="xref.label-title.separator"&gt;: &lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>
+This parameter allows you to control the punctuation of certain
+types of generated cross reference text.
+When cross reference text is generated for an
+<tag class="element">xref</tag> or
+<tag class="element">olink</tag> element
+using an <tag class="attribute">xrefstyle</tag> attribute
+that makes use of the <literal>select:</literal> feature,
+and the selected components include both label and title,
+then the value of this parameter is inserted between
+label and title in the output.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="xref.title-page.separator">
+<refmeta>
+<refentrytitle>xref.title-page.separator</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>xref.title-page.separator</refname>
+<refpurpose>Punctuation or space separating title from page number in xref</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="xref.title-page.separator.frag">&lt;xsl:param name="xref.title-page.separator"&gt;&lt;xsl:text&gt; &lt;/xsl:text&gt;&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>
+This parameter allows you to control the punctuation of certain
+types of generated cross reference text.
+When cross reference text is generated for an
+<tag class="element">xref</tag> or
+<tag class="element">olink</tag> element
+using an <tag class="attribute">xrefstyle</tag> attribute
+that makes use of the <literal>select:</literal> feature,
+and the selected components include both title and page number,
+then the value of this parameter is inserted between
+title and page number in the output.
+</para>
+
+</refsection>
+</refentry>
+
+</reference><reference id="lists" xml:base="../html/param.xml"><title>Lists</title>
+<refentry version="5.0" id="segmentedlist.as.table">
+<refmeta>
+<refentrytitle>segmentedlist.as.table</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>segmentedlist.as.table</refname>
+<refpurpose>Format segmented lists as tables?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="segmentedlist.as.table.frag">
+&lt;xsl:param name="segmentedlist.as.table" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, <tag>segmentedlist</tag>s will be formatted as
+tables.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="variablelist.as.table">
+<refmeta>
+<refentrytitle>variablelist.as.table</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>variablelist.as.table</refname>
+<refpurpose>Format <tag>variablelist</tag>s as tables?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="variablelist.as.table.frag">
+&lt;xsl:param name="variablelist.as.table" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, <tag>variablelist</tag>s will be formatted as
+tables. A processing instruction exists to specify a particular width for the
+column containing the <tag>term</tag>s:
+<tag class="xmlpi">dbhtml term-width=".25in"</tag></para>
+
+<para>You can override this setting with a processing instruction as the
+child of <tag>variablelist</tag>: <tag class="xmlpi">dbhtml
+list-presentation="table"</tag> or <tag class="xmlpi">dbhtml
+list-presentation="list"</tag>.</para>
+
+<para>This parameter only applies to the HTML transformations. In the
+FO case, proper list markup is robust enough to handle the formatting.
+But see also <parameter>variablelist.as.blocks</parameter>.</para>
+
+<programlisting> &lt;variablelist&gt;
+ &lt;?dbhtml list-presentation="table"?&gt;
+ &lt;?dbhtml term-width="1.5in"?&gt;
+ &lt;?dbfo list-presentation="list"?&gt;
+ &lt;?dbfo term-width="1in"?&gt;
+ &lt;varlistentry&gt;
+ &lt;term&gt;list&lt;/term&gt;
+ &lt;listitem&gt;
+ &lt;para&gt;
+ Formatted as a table even if variablelist.as.table is set to 0.
+ &lt;/para&gt;
+ &lt;/listitem&gt;
+ &lt;/varlistentry&gt;
+ &lt;/variablelist&gt;</programlisting>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="variablelist.term.separator">
+<refmeta>
+<refentrytitle>variablelist.term.separator</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>variablelist.term.separator</refname>
+<refpurpose>Text to separate <tag>term</tag>s within a multi-term
+<tag>varlistentry</tag></refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="variablelist.term.separator.frag">
+&lt;xsl:param name="variablelist.term.separator"&gt;, &lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>When a <tag>varlistentry</tag> contains multiple <tag>term</tag>
+elements, the string specified in the value of the
+<parameter>variablelist.term.separator</parameter> parameter is placed
+after each <tag>term</tag> except the last.</para>
+
+<note>
+ <para>To generate a line break between multiple <tag>term</tag>s in
+ a <tag>varlistentry</tag>, set a non-zero value for the
+ <parameter>variablelist.term.break.after</parameter> parameter. If
+ you do so, you may also want to set the value of the
+ <parameter>variablelist.term.separator</parameter> parameter to an
+ empty string (to suppress rendering of the default comma and space
+ after each <tag>term</tag>).</para>
+</note>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="variablelist.term.break.after">
+<refmeta>
+<refentrytitle>variablelist.term.break.after</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>variablelist.term.break.after</refname>
+<refpurpose>Generate line break after each <tag>term</tag> within a
+multi-term <tag>varlistentry</tag>?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="variablelist.term.break.after.frag">
+&lt;xsl:param name="variablelist.term.break.after"&gt;0&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Set a non-zero value for the
+<parameter>variablelist.term.break.after</parameter> parameter to
+generate a line break between <tag>term</tag>s in a
+multi-term <tag>varlistentry</tag>.</para>
+
+<note>
+<para>If you set a non-zero value for
+<parameter>variablelist.term.break.after</parameter>, you may also
+want to set the value of the
+<parameter>variablelist.term.separator</parameter> parameter to an
+empty string (to suppress rendering of the default comma and space
+after each <tag>term</tag>).</para>
+</note>
+
+</refsection>
+</refentry>
+
+</reference><reference id="biblio" xml:base="../html/param.xml"><title>Bibliography</title>
+<refentry version="5.0" id="bibliography.style">
+<refmeta>
+<refentrytitle>bibliography.style</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">list</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">normal</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">iso690</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>bibliography.style</refname>
+<refpurpose>Style used for formatting of biblioentries.</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="bibliography.style.frag">
+&lt;xsl:param name="bibliography.style"&gt;normal&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Currently only <literal>normal</literal> and
+<literal>iso690</literal> styles are supported.</para>
+
+<para>In order to use ISO690 style to the full extent you might need
+to use additional markup described on <link xlink:href="http://wiki.docbook.org/topic/ISO690Bibliography">the
+following WiKi page</link>.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="biblioentry.item.separator">
+<refmeta>
+<refentrytitle>biblioentry.item.separator</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>biblioentry.item.separator</refname>
+<refpurpose>Text to separate bibliography entries</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="biblioentry.item.separator.frag">&lt;xsl:param name="biblioentry.item.separator"&gt;. &lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Text to separate bibliography entries
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="bibliography.collection">
+<refmeta>
+<refentrytitle>bibliography.collection</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>bibliography.collection</refname>
+<refpurpose>Name of the bibliography collection file</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="bibliography.collection.frag">
+&lt;xsl:param name="bibliography.collection"&gt;http://docbook.sourceforge.net/release/bibliography/bibliography.xml&lt;/xsl:param&gt;
+
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Maintaining bibliography entries across a set of documents is tedious, time
+consuming, and error prone. It makes much more sense, usually, to store all of
+the bibliography entries in a single place and simply <quote>extract</quote>
+the ones you need in each document.</para>
+
+<para>That's the purpose of the
+<parameter>bibliography.collection</parameter> parameter. To setup a global
+bibliography <quote>database</quote>, follow these steps:</para>
+
+<para>First, create a stand-alone bibliography document that contains all of
+the documents that you wish to reference. Make sure that each bibliography
+entry (whether you use <tag>biblioentry</tag> or <tag>bibliomixed</tag>)
+has an ID.</para>
+
+<para>My global bibliography, <filename>~/bibliography.xml</filename> begins
+like this:</para>
+
+<informalexample>
+<programlisting>&lt;!DOCTYPE bibliography
+ PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN"
+ "http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd"&gt;
+&lt;bibliography&gt;&lt;title&gt;References&lt;/title&gt;
+
+&lt;bibliomixed id="xml-rec"&gt;&lt;abbrev&gt;XML 1.0&lt;/abbrev&gt;Tim Bray,
+Jean Paoli, C. M. Sperberg-McQueen, and Eve Maler, editors.
+&lt;citetitle&gt;&lt;ulink url="http://www.w3.org/TR/REC-xml"&gt;Extensible Markup
+Language (XML) 1.0 Second Edition&lt;/ulink&gt;&lt;/citetitle&gt;.
+World Wide Web Consortium, 2000.
+&lt;/bibliomixed&gt;
+
+&lt;bibliomixed id="xml-names"&gt;&lt;abbrev&gt;Namespaces&lt;/abbrev&gt;Tim Bray,
+Dave Hollander,
+and Andrew Layman, editors.
+&lt;citetitle&gt;&lt;ulink url="http://www.w3.org/TR/REC-xml-names/"&gt;Namespaces in
+XML&lt;/ulink&gt;&lt;/citetitle&gt;.
+World Wide Web Consortium, 1999.
+&lt;/bibliomixed&gt;
+
+&lt;!-- ... --&gt;
+&lt;/bibliography&gt;
+</programlisting>
+</informalexample>
+
+<para>When you create a bibliography in your document, simply
+provide <emphasis>empty</emphasis> <tag>bibliomixed</tag>
+entries for each document that you wish to cite. Make sure that these
+elements have the same ID as the corresponding <quote>real</quote>
+entry in your global bibliography.</para>
+
+<para>For example:</para>
+
+<informalexample>
+<programlisting>&lt;bibliography&gt;&lt;title&gt;Bibliography&lt;/title&gt;
+
+&lt;bibliomixed id="xml-rec"/&gt;
+&lt;bibliomixed id="xml-names"/&gt;
+&lt;bibliomixed id="DKnuth86"&gt;Donald E. Knuth. &lt;citetitle&gt;Computers and
+Typesetting: Volume B, TeX: The Program&lt;/citetitle&gt;. Addison-Wesley,
+1986. ISBN 0-201-13437-3.
+&lt;/bibliomixed&gt;
+&lt;bibliomixed id="relaxng"/&gt;
+
+&lt;/bibliography&gt;</programlisting>
+</informalexample>
+
+<para>Note that it's perfectly acceptable to mix entries from your
+global bibliography with <quote>normal</quote> entries. You can use
+<tag>xref</tag> or other elements to cross-reference your
+bibliography entries in exactly the same way you do now.</para>
+
+<para>Finally, when you are ready to format your document, simply set the
+<parameter>bibliography.collection</parameter> parameter (in either a
+customization layer or directly through your processor's interface) to
+point to your global bibliography.</para>
+
+<para>The stylesheets will format the bibliography in your document as if
+all of the entries referenced appeared there literally.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="bibliography.numbered">
+<refmeta>
+<refentrytitle>bibliography.numbered</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>bibliography.numbered</refname>
+<refpurpose>Should bibliography entries be numbered?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="bibliography.numbered.frag">
+&lt;xsl:param name="bibliography.numbered" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero bibliography entries will be numbered</para>
+
+</refsection>
+</refentry>
+
+</reference><reference id="glossary" xml:base="../html/param.xml"><title>Glossary</title>
+<refentry version="5.0" id="glossterm.auto.link">
+<refmeta>
+<refentrytitle>glossterm.auto.link</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>glossterm.auto.link</refname>
+<refpurpose>Generate links from glossterm to glossentry automatically?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="glossterm.auto.link.frag">
+&lt;xsl:param name="glossterm.auto.link" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, links from inline <tag>glossterm</tag>s to the corresponding
+<tag>glossentry</tag> elements in a <tag>glossary</tag> or <tag>glosslist</tag>
+will be automatically generated. This is useful when your glossterms are consistent
+and you don't want to add links manually.</para>
+
+<para>The automatic link generation feature is not used on <tag>glossterm</tag> elements
+that have a <tag class="attribute">linkend</tag> attribute.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="firstterm.only.link">
+<refmeta>
+<refentrytitle>firstterm.only.link</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>firstterm.only.link</refname>
+<refpurpose>Does automatic glossterm linking only apply to firstterms?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="firstterm.only.link.frag">
+&lt;xsl:param name="firstterm.only.link" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, only <tag>firstterm</tag>s will be automatically linked
+to the glossary. If glossary linking is not enabled, this parameter
+has no effect.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="glossary.collection">
+<refmeta>
+<refentrytitle>glossary.collection</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>glossary.collection</refname>
+<refpurpose>Name of the glossary collection file</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="glossary.collection.frag">
+&lt;xsl:param name="glossary.collection"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Glossaries maintained independently across a set of documents
+are likely to become inconsistent unless considerable effort is
+expended to keep them in sync. It makes much more sense, usually, to
+store all of the glossary entries in a single place and simply
+<quote>extract</quote> the ones you need in each document.</para>
+
+<para>That's the purpose of the
+<parameter>glossary.collection</parameter> parameter. To setup a global
+glossary <quote>database</quote>, follow these steps:</para>
+
+<refsection><info><title>Setting Up the Glossary Database</title></info>
+
+<para>First, create a stand-alone glossary document that contains all of
+the entries that you wish to reference. Make sure that each glossary
+entry has an ID.</para>
+
+<para>Here's an example glossary:</para>
+
+<informalexample>
+<programlisting>
+&lt;?xml version="1.0" encoding="utf-8"?&gt;
+&lt;!DOCTYPE glossary
+ PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN"
+ "http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd"&gt;
+&lt;glossary&gt;
+&lt;glossaryinfo&gt;
+&lt;editor&gt;&lt;firstname&gt;Eric&lt;/firstname&gt;&lt;surname&gt;Raymond&lt;/surname&gt;&lt;/editor&gt;
+&lt;title&gt;Jargon File 4.2.3 (abridged)&lt;/title&gt;
+&lt;releaseinfo&gt;Just some test data&lt;/releaseinfo&gt;
+&lt;/glossaryinfo&gt;
+
+&lt;glossdiv&gt;&lt;title&gt;0&lt;/title&gt;
+
+&lt;glossentry&gt;
+&lt;glossterm&gt;0&lt;/glossterm&gt;
+&lt;glossdef&gt;
+&lt;para&gt;Numeric zero, as opposed to the letter `O' (the 15th letter of
+the English alphabet). In their unmodified forms they look a lot
+alike, and various kluges invented to make them visually distinct have
+compounded the confusion. If your zero is center-dotted and letter-O
+is not, or if letter-O looks almost rectangular but zero looks more
+like an American football stood on end (or the reverse), you're
+probably looking at a modern character display (though the dotted zero
+seems to have originated as an option on IBM 3270 controllers). If
+your zero is slashed but letter-O is not, you're probably looking at
+an old-style ASCII graphic set descended from the default typewheel on
+the venerable ASR-33 Teletype (Scandinavians, for whom /O is a letter,
+curse this arrangement). (Interestingly, the slashed zero long
+predates computers; Florian Cajori's monumental "A History of
+Mathematical Notations" notes that it was used in the twelfth and
+thirteenth centuries.) If letter-O has a slash across it and the zero
+does not, your display is tuned for a very old convention used at IBM
+and a few other early mainframe makers (Scandinavians curse &lt;emphasis&gt;this&lt;/emphasis&gt;
+arrangement even more, because it means two of their letters collide).
+Some Burroughs/Unisys equipment displays a zero with a &lt;emphasis&gt;reversed&lt;/emphasis&gt;
+slash. Old CDC computers rendered letter O as an unbroken oval and 0
+as an oval broken at upper right and lower left. And yet another
+convention common on early line printers left zero unornamented but
+added a tail or hook to the letter-O so that it resembled an inverted
+Q or cursive capital letter-O (this was endorsed by a draft ANSI
+standard for how to draw ASCII characters, but the final standard
+changed the distinguisher to a tick-mark in the upper-left corner).
+Are we sufficiently confused yet?&lt;/para&gt;
+&lt;/glossdef&gt;
+&lt;/glossentry&gt;
+
+&lt;glossentry&gt;
+&lt;glossterm&gt;1TBS&lt;/glossterm&gt;
+&lt;glossdef&gt;
+&lt;para role="accidence"&gt;
+&lt;phrase role="pronounce"&gt;&lt;/phrase&gt;
+&lt;phrase role="partsofspeach"&gt;n&lt;/phrase&gt;
+&lt;/para&gt;
+&lt;para&gt;The "One True Brace Style"&lt;/para&gt;
+&lt;glossseealso&gt;indent style&lt;/glossseealso&gt;
+&lt;/glossdef&gt;
+&lt;/glossentry&gt;
+
+&lt;!-- ... --&gt;
+
+&lt;/glossdiv&gt;
+
+&lt;!-- ... --&gt;
+
+&lt;/glossary&gt;</programlisting>
+</informalexample>
+
+</refsection>
+
+<refsection><info><title>Marking Up Glossary Terms</title></info>
+
+<para>That takes care of the glossary database, now you have to get the entries
+into your document. Unlike bibliography entries, which can be empty, creating
+<quote>placeholder</quote> glossary entries would be very tedious. So instead,
+support for <parameter>glossary.collection</parameter> relies on implicit linking.</para>
+
+<para>In your source document, simply use <tag>firstterm</tag> and
+<tag>glossterm</tag> to identify the terms you wish to have included
+in the glossary. The stylesheets assume that you will either set the
+<tag class="attribute">baseform</tag> attribute correctly, or that the
+content of the element exactly matches a term in your glossary.</para>
+
+<para>If you're using a <parameter>glossary.collection</parameter>, don't
+make explicit links on the terms in your document.</para>
+
+<para>So, in your document, you might write things like this:</para>
+
+<informalexample>
+<programlisting>&lt;para&gt;This is dummy text, without any real meaning.
+The point is simply to reference glossary terms like &lt;glossterm&gt;0&lt;/glossterm&gt;
+and the &lt;firstterm baseform="1TBS"&gt;One True Brace Style (1TBS)&lt;/firstterm&gt;.
+The &lt;glossterm&gt;1TBS&lt;/glossterm&gt;, as you can probably imagine, is a nearly
+religious issue.&lt;/para&gt;</programlisting>
+</informalexample>
+
+<para>If you set the <parameter>firstterm.only.link</parameter> parameter,
+only the terms marked with <tag>firstterm</tag> will be links.
+Otherwise, all the terms will be linked.</para>
+
+</refsection>
+
+<refsection><info><title>Marking Up the Glossary</title></info>
+
+<para>The glossary itself has to be identified for the stylesheets. For lack
+of a better choice, the <tag class="attribute">role</tag> is used.
+To identify the glossary as the target for automatic processing, set
+the role to <quote><literal>auto</literal></quote>. The title of this
+glossary (and any other information from the <tag>glossaryinfo</tag>
+that's rendered by your stylesheet) will be displayed, but the entries will
+come from the database.
+</para>
+
+<para>Unfortunately, the glossary can't be empty, so you must put in
+at least one <tag>glossentry</tag>. The content of this entry
+is irrelevant, it will not be rendered:</para>
+
+<informalexample>
+<programlisting>&lt;glossary role="auto"&gt;
+&lt;glossentry&gt;
+&lt;glossterm&gt;Irrelevant&lt;/glossterm&gt;
+&lt;glossdef&gt;
+&lt;para&gt;If you can see this, the document was processed incorrectly. Use
+the &lt;parameter&gt;glossary.collection&lt;/parameter&gt; parameter.&lt;/para&gt;
+&lt;/glossdef&gt;
+&lt;/glossentry&gt;
+&lt;/glossary&gt;</programlisting>
+</informalexample>
+
+<para>What about glossary divisions? If your glossary database has glossary
+divisions <emphasis>and</emphasis> your automatic glossary contains at least
+one <tag>glossdiv</tag>, the automic glossary will have divisions.
+If the <tag>glossdiv</tag> is missing from either location, no divisions
+will be rendered.</para>
+
+<para>Glossary entries (and divisions, if appropriate) in the glossary will
+occur in precisely the order they occur in your database.</para>
+
+</refsection>
+
+<refsection><info><title>Formatting the Document</title></info>
+
+<para>Finally, when you are ready to format your document, simply set the
+<parameter>glossary.collection</parameter> parameter (in either a
+customization layer or directly through your processor's interface) to
+point to your global glossary.</para>
+
+<para>The stylesheets will format the glossary in your document as if
+all of the entries implicilty referenced appeared there literally.</para>
+</refsection>
+
+<refsection><info><title>Limitations</title></info>
+
+<para>Glossary cross-references <emphasis>within the glossary</emphasis> are
+not supported. For example, this <emphasis>will not</emphasis> work:</para>
+
+<informalexample>
+<programlisting>&lt;glossentry&gt;
+&lt;glossterm&gt;gloss-1&lt;/glossterm&gt;
+&lt;glossdef&gt;&lt;para&gt;A description that references &lt;glossterm&gt;gloss-2&lt;/glossterm&gt;.&lt;/para&gt;
+&lt;glossseealso&gt;gloss-2&lt;/glossseealso&gt;
+&lt;/glossdef&gt;
+&lt;/glossentry&gt;</programlisting>
+</informalexample>
+
+<para>If you put glossary cross-references in your glossary that way,
+you'll get the cryptic error: <computeroutput>Warning:
+glossary.collection specified, but there are 0 automatic
+glossaries</computeroutput>.</para>
+
+<para>Instead, you must do two things:</para>
+
+<orderedlist>
+<listitem>
+<para>Markup your glossary using <tag>glossseealso</tag>:</para>
+
+<informalexample>
+<programlisting>&lt;glossentry&gt;
+&lt;glossterm&gt;gloss-1&lt;/glossterm&gt;
+&lt;glossdef&gt;&lt;para&gt;A description that references &lt;glossterm&gt;gloss-2&lt;/glossterm&gt;.&lt;/para&gt;
+&lt;glossseealso&gt;gloss-2&lt;/glossseealso&gt;
+&lt;/glossdef&gt;
+&lt;/glossentry&gt;</programlisting>
+</informalexample>
+</listitem>
+
+<listitem>
+<para>Make sure there is at least one <tag>glossterm</tag> reference to
+<glossterm>gloss-2</glossterm> <emphasis>in your document</emphasis>. The
+easiest way to do that is probably within a <tag>remark</tag> in your
+automatic glossary:</para>
+
+<informalexample>
+<programlisting>&lt;glossary role="auto"&gt;
+&lt;remark&gt;Make sure there's a reference to &lt;glossterm&gt;gloss-2&lt;/glossterm&gt;.&lt;/remark&gt;
+&lt;glossentry&gt;
+&lt;glossterm&gt;Irrelevant&lt;/glossterm&gt;
+&lt;glossdef&gt;
+&lt;para&gt;If you can see this, the document was processed incorrectly. Use
+the &lt;parameter&gt;glossary.collection&lt;/parameter&gt; parameter.&lt;/para&gt;
+&lt;/glossdef&gt;
+&lt;/glossentry&gt;
+&lt;/glossary&gt;</programlisting>
+</informalexample>
+</listitem>
+</orderedlist>
+</refsection>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="glossary.sort">
+<refmeta>
+<refentrytitle>glossary.sort</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>glossary.sort</refname>
+<refpurpose>Sort glossentry elements?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="glossary.sort.frag">
+&lt;xsl:param name="glossary.sort" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, then the glossentry elements within a
+glossary, glossdiv, or glosslist are sorted on the glossterm, using
+the current lang setting. If zero (the default), then
+glossentry elements are not sorted and are presented
+in document order.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="glossentry.show.acronym">
+<refmeta>
+<refentrytitle>glossentry.show.acronym</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">list</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">no</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">yes</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">primary</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>glossentry.show.acronym</refname>
+<refpurpose>Display <tag>glossentry</tag> acronyms?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="glossentry.show.acronym.frag">
+&lt;xsl:param name="glossentry.show.acronym"&gt;no&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>A setting of <quote>yes</quote> means they should be displayed;
+<quote>no</quote> means they shouldn't. If <quote>primary</quote> is used,
+then they are shown as the primary text for the entry.</para>
+
+<note>
+<para>This setting controls both <tag>acronym</tag> and
+<tag>abbrev</tag> elements in the <tag>glossentry</tag>.</para>
+</note>
+
+</refsection>
+</refentry>
+
+</reference><reference id="misc" xml:base="../html/param.xml"><title>Miscellaneous</title>
+<refentry version="5.0" id="formal.procedures">
+<refmeta>
+<refentrytitle>formal.procedures</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>formal.procedures</refname>
+<refpurpose>Selects formal or informal procedures</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="formal.procedures.frag">
+&lt;xsl:param name="formal.procedures" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Formal procedures are numbered and always have a title.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="formal.title.placement">
+<refmeta>
+<refentrytitle>formal.title.placement</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">table</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>formal.title.placement</refname>
+<refpurpose>Specifies where formal object titles should occur</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="formal.title.placement.frag">
+&lt;xsl:param name="formal.title.placement"&gt;
+figure before
+example before
+equation before
+table before
+procedure before
+task before
+&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies where formal object titles should occur. For each formal object
+type (<tag>figure</tag>,
+<tag>example</tag>,
+<tag>equation</tag>,
+<tag>table</tag>, and <tag>procedure</tag>)
+you can specify either the keyword
+<quote><literal>before</literal></quote> or
+<quote><literal>after</literal></quote>.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="runinhead.default.title.end.punct">
+<refmeta>
+<refentrytitle>runinhead.default.title.end.punct</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>runinhead.default.title.end.punct</refname>
+<refpurpose>Default punctuation character on a run-in-head</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="runinhead.default.title.end.punct.frag">&lt;xsl:param name="runinhead.default.title.end.punct"&gt;.&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, For a <tag>formalpara</tag>, use the specified
+string as the separator between the title and following text. The period is the default value.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="runinhead.title.end.punct">
+<refmeta>
+<refentrytitle>runinhead.title.end.punct</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>runinhead.title.end.punct</refname>
+<refpurpose>Characters that count as punctuation on a run-in-head</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="runinhead.title.end.punct.frag">
+&lt;xsl:param name="runinhead.title.end.punct"&gt;.!?:&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specify which characters are to be counted as punctuation. These
+characters are checked for a match with the last character of the
+title. If no match is found, the
+<parameter>runinhead.default.title.end.punct</parameter> contents are
+inserted. This is to avoid duplicated punctuation in the output.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="show.comments">
+<refmeta>
+<refentrytitle>show.comments</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>show.comments</refname>
+<refpurpose>Display <tag>remark</tag> elements?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="show.comments.frag">
+&lt;xsl:param name="show.comments" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, comments will be displayed, otherwise they
+are suppressed. Comments here refers to the <tag>remark</tag> element
+(which was called <literal>comment</literal> prior to DocBook
+4.0), not XML comments (&lt;-- like this --&gt;) which are
+unavailable.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="show.revisionflag">
+<refmeta>
+<refentrytitle>show.revisionflag</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>show.revisionflag</refname>
+<refpurpose>Enable decoration of elements that have a revisionflag</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="show.revisionflag.frag">
+&lt;xsl:param name="show.revisionflag" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>
+If <parameter>show.revisionflag</parameter> is turned on, then the stylesheets
+may produce additional markup designed to allow a CSS stylesheet to
+highlight elements that have specific revisionflag settings.</para>
+
+<para>The markup inserted will be usually be either a &lt;span&gt; or
+&lt;div&gt; with an appropriate <literal>class</literal>
+attribute. (The value of the class attribute will be the same as the
+value of the revisionflag attribute). In some contexts, for example
+tables, where extra markup would be structurally illegal, the class
+attribute will be added to the appropriate container element.</para>
+
+<para>In general, the stylesheets only test for revisionflag in contexts
+where an importing stylesheet would have to redefine whole templates.
+Most of the revisionflag processing is expected to be done by another
+stylesheet, for example <filename>changebars.xsl</filename>.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="shade.verbatim">
+<refmeta>
+<refentrytitle>shade.verbatim</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>shade.verbatim</refname>
+<refpurpose>Should verbatim environments be shaded?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="shade.verbatim.frag">&lt;xsl:param name="shade.verbatim" select="0"&gt;&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>In the FO stylesheet, if this parameter is non-zero then the
+<property>shade.verbatim.style</property> properties will be applied
+to verbatim environments.</para>
+
+<para>In the HTML stylesheet, this parameter is now deprecated. Use
+CSS instead.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="shade.verbatim.style">
+<refmeta>
+<refentrytitle>shade.verbatim.style</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>shade.verbatim.style</refname>
+<refpurpose>Properties that specify the style of shaded verbatim listings</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="shade.verbatim.style.frag">
+&lt;xsl:attribute-set name="shade.verbatim.style"&gt;
+ &lt;xsl:attribute name="border"&gt;0&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="bgcolor"&gt;#E0E0E0&lt;/xsl:attribute&gt;
+&lt;/xsl:attribute-set&gt;
+
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Properties that specify the style of shaded verbatim listings. The
+parameters specified (the border and background color) are added to
+the styling of the xsl-fo output. A border might be specified as "thin
+black solid" for example. See <link xlink:href="http://www.w3.org/TR/2004/WD-xsl11-20041216/#border">xsl-fo</link></para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="punct.honorific">
+<refmeta>
+<refentrytitle>punct.honorific</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>punct.honorific</refname>
+<refpurpose>Punctuation after an honorific in a personal name.</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="punct.honorific.frag">
+&lt;xsl:param name="punct.honorific"&gt;.&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>This parameter specifies the punctuation that should be added after an
+honorific in a personal name.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="tex.math.in.alt">
+<refmeta>
+<refentrytitle>tex.math.in.alt</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">list</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">plain</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">latex</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>tex.math.in.alt</refname>
+<refpurpose>TeX notation used for equations</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="tex.math.in.alt.frag">
+&lt;xsl:param name="tex.math.in.alt"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If you want type math directly in TeX notation in equations,
+this parameter specifies notation used. Currently are supported two
+values -- <literal>plain</literal> and <literal>latex</literal>. Empty
+value means that you are not using TeX math at all.</para>
+
+<para>Preferred way for including TeX alternative of math is inside of
+<tag>textobject</tag> element. Eg.:</para>
+
+<programlisting>&lt;inlineequation&gt;
+&lt;inlinemediaobject&gt;
+&lt;imageobject&gt;
+&lt;imagedata fileref="eq1.gif"/&gt;
+&lt;/imageobject&gt;
+&lt;textobject&gt;&lt;phrase&gt;E=mc squared&lt;/phrase&gt;&lt;/textobject&gt;
+&lt;textobject role="tex"&gt;&lt;phrase&gt;E=mc^2&lt;/phrase&gt;&lt;/textobject&gt;
+&lt;/inlinemediaobject&gt;
+&lt;/inlineequation&gt;</programlisting>
+
+<para>If you are using <tag>graphic</tag> element, you can
+store TeX inside <tag>alt</tag> element:</para>
+
+<programlisting>&lt;inlineequation&gt;
+&lt;alt role="tex"&gt;a^2+b^2=c^2&lt;/alt&gt;
+&lt;graphic fileref="a2b2c2.gif"/&gt;
+&lt;/inlineequation&gt;</programlisting>
+
+<para>If you want use this feature, you should process your FO with
+PassiveTeX, which only supports TeX math notation. When calling
+stylsheet, don't forget to specify also
+passivetex.extensions=1.</para>
+
+<para>If you want equations in HTML, just process generated file
+<filename>tex-math-equations.tex</filename> by TeX or LaTeX. Then run
+dvi2bitmap program on result DVI file. You will get images for
+equations in your document.</para>
+
+<warning>
+ <para>This feature is useful for print/PDF output only if you
+ use the obsolete and now unsupported PassiveTeX XSL-FO
+ engine.</para>
+</warning>
+
+</refsection>
+
+<refsection><info><title>Related Parameters</title></info>
+ <para><parameter>tex.math.delims</parameter>,
+ <parameter>passivetex.extensions</parameter>,
+ <parameter>tex.math.file</parameter></para>
+</refsection>
+
+</refentry>
+
+<refentry version="5.0" id="tex.math.file">
+<refmeta>
+<refentrytitle>tex.math.file</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>tex.math.file</refname>
+<refpurpose>Name of temporary file for generating images from equations</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="tex.math.file.frag">
+&lt;xsl:param name="tex.math.file"&gt;tex-math-equations.tex&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Name of auxiliary file for TeX equations. This file can be
+processed by dvi2bitmap to get bitmap versions of equations for HTML
+output.</para>
+
+</refsection>
+<refsection><info><title>Related Parameters</title></info>
+ <para><parameter>tex.math.in.alt</parameter>,
+ <parameter>tex.math.delims</parameter>,
+ </para>
+</refsection>
+<refsection><info><title>More information</title></info>
+ <para>For how-to documentation on embedding TeX equations and
+ generating output from them, see
+ <link role="tcg" xlink:href="TexMath.html">DBTeXMath</link>.</para>
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="tex.math.delims">
+<refmeta>
+<refentrytitle>tex.math.delims</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>tex.math.delims</refname>
+<refpurpose>Should equations output for processing by TeX be
+surrounded by math mode delimiters?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="tex.math.delims.frag">
+&lt;xsl:param name="tex.math.delims" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>For compatibility with DSSSL based DBTeXMath from Allin Cottrell
+you should set this parameter to 0.</para>
+
+<warning>
+ <para>This feature is useful for print/PDF output only if you
+ use the obsolete and now unsupported PassiveTeX XSL-FO
+ engine.</para>
+</warning>
+
+</refsection>
+<refsection><info><title>Related Parameters</title></info>
+ <para><parameter>tex.math.in.alt</parameter>,
+ <parameter>passivetex.extensions</parameter></para>
+</refsection>
+
+<refsection><info><title>See Also</title></info>
+ <para>You can also use the <tag class="xmlpi">dbtex delims</tag> processing
+ instruction to control whether delimiters are output.</para>
+</refsection>
+
+
+</refentry>
+
+<refentry version="5.0" id="pixels.per.inch">
+<refmeta>
+<refentrytitle>pixels.per.inch</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">integer</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>pixels.per.inch</refname>
+<refpurpose>How many pixels are there per inch?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="pixels.per.inch.frag">
+&lt;xsl:param name="pixels.per.inch"&gt;90&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>When lengths are converted to pixels, this value is used to
+determine the size of a pixel. The default value is taken from the
+<link xlink:href="http://www.w3.org/TR/2004/WD-xsl11-20041216/">XSL
+Recommendation</link>.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="points.per.em">
+<refmeta>
+<refentrytitle>points.per.em</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">number</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>points.per.em</refname>
+<refpurpose>Specify the nominal size of an em-space in points</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="points.per.em.frag">
+&lt;xsl:param name="points.per.em"&gt;10&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The fixed value used for calculations based upon the size of a
+character. The assumption made is that ten point font is in use. This
+assumption may not be valid.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="use.svg">
+<refmeta>
+<refentrytitle>use.svg</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>use.svg</refname>
+<refpurpose>Allow SVG in the result tree?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="use.svg.frag">
+&lt;xsl:param name="use.svg" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, SVG will be considered an acceptable image format. SVG
+is passed through to the result tree, so correct rendering of the resulting
+diagram depends on the formatter (FO processor or web browser) that is used
+to process the output from the stylesheet.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="menuchoice.separator">
+<refmeta>
+<refentrytitle>menuchoice.separator</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>menuchoice.separator</refname>
+<refpurpose>Separator between items of a <tag>menuchoice</tag>
+other than <tag>guimenuitem</tag> and
+<tag>guisubmenu</tag></refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="menuchoice.separator.frag">
+&lt;xsl:param name="menuchoice.separator"&gt;+&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Separator used to connect items of a <tag>menuchoice</tag> other
+than <tag>guimenuitem</tag> and <tag>guisubmenu</tag>. The latter
+elements are linked with <parameter>menuchoice.menu.separator</parameter>.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="menuchoice.menu.separator">
+<refmeta>
+<refentrytitle>menuchoice.menu.separator</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>menuchoice.menu.separator</refname>
+<refpurpose>Separator between items of a <tag>menuchoice</tag>
+with <tag>guimenuitem</tag> or
+<tag>guisubmenu</tag></refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="menuchoice.menu.separator.frag">
+&lt;xsl:param name="menuchoice.menu.separator"&gt; &#8594; &lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Separator used to connect items of a <tag>menuchoice</tag> with
+<tag>guimenuitem</tag> or <tag>guisubmenu</tag>. Other elements
+are linked with <parameter>menuchoice.separator</parameter>.
+</para>
+<para>The default value is &amp;#x2192;, which is the
+&amp;rarr; (right arrow) character entity.
+The current FOP (0.20.5) requires setting the font-family
+explicitly.
+</para>
+<para>The default value also includes spaces around the arrow,
+which will allow a line to break. Replace the spaces with
+&amp;#xA0; (nonbreaking space) if you don't want those
+spaces to break.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="default.float.class">
+<refmeta>
+<refentrytitle>default.float.class</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>default.float.class</refname>
+<refpurpose>Specifies the default float class</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="default.float.class.frag">
+&lt;xsl:param name="default.float.class"&gt;
+ &lt;xsl:choose&gt;
+ &lt;xsl:when test="contains($stylesheet.result.type,'html')"&gt;left&lt;/xsl:when&gt;
+ &lt;xsl:otherwise&gt;before&lt;/xsl:otherwise&gt;
+ &lt;/xsl:choose&gt;
+&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Selects the direction in which a float should be placed. for
+xsl-fo this is before, for html it is left. For Western texts, the
+before direction is the top of the page.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="footnote.number.format">
+<refmeta>
+<refentrytitle>footnote.number.format</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">list</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">1<alt>1,2,3...</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">A<alt>A,B,C...</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">a<alt>a,b,c...</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">i<alt>i,ii,iii...</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">I<alt>I,II,III...</alt></refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>footnote.number.format</refname>
+<refpurpose>Identifies the format used for footnote numbers</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="footnote.number.format.frag">
+&lt;xsl:param name="footnote.number.format"&gt;1&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The <parameter>footnote.number.format</parameter> specifies the format
+to use for footnote numeration (1, i, I, a, or A).</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="table.footnote.number.format">
+<refmeta>
+<refentrytitle>table.footnote.number.format</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">list</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">1<alt>1,2,3...</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">A<alt>A,B,C...</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">a<alt>a,b,c...</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">i<alt>i,ii,iii...</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">I<alt>I,II,III...</alt></refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>table.footnote.number.format</refname>
+<refpurpose>Identifies the format used for footnote numbers in tables</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="table.footnote.number.format.frag">
+&lt;xsl:param name="table.footnote.number.format"&gt;a&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The <parameter>table.footnote.number.format</parameter> specifies the format
+to use for footnote numeration (1, i, I, a, or A) in tables.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="footnote.number.symbols">
+<refmeta>
+<refentrytitle>footnote.number.symbols</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype"/>
+</refmeta>
+<refnamediv>
+<refname>footnote.number.symbols</refname>
+<refpurpose>Special characters to use as footnote markers</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="footnote.number.symbols.frag">
+&lt;xsl:param name="footnote.number.symbols"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If <parameter>footnote.number.symbols</parameter> is not the empty string,
+footnotes will use the characters it contains as footnote symbols. For example,
+<quote>*&amp;#x2020;&amp;#x2021;&amp;#x25CA;&amp;#x2720;</quote> will identify
+footnotes with <quote>*</quote>, <quote>&#8224;</quote>, <quote>&#8225;</quote>,
+<quote>&#9674;</quote>, and <quote>&#10016;</quote>. If there are more footnotes
+than symbols, the stylesheets will fall back to numbered footnotes using
+<parameter>footnote.number.format</parameter>.</para>
+
+<para>The use of symbols for footnotes depends on the ability of your
+processor (or browser) to render the symbols you select. Not all systems are
+capable of displaying the full range of Unicode characters. If the quoted characters
+in the preceding paragraph are not displayed properly, that's a good indicator
+that you may have trouble using those symbols for footnotes.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="table.footnote.number.symbols">
+<refmeta>
+<refentrytitle>table.footnote.number.symbols</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>table.footnote.number.symbols</refname>
+<refpurpose>Special characters to use a footnote markers in tables</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="table.footnote.number.symbols.frag">
+&lt;xsl:param name="table.footnote.number.symbols"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If <parameter>table.footnote.number.symbols</parameter> is not the empty string,
+table footnotes will use the characters it contains as footnote symbols. For example,
+<quote>*&amp;#x2020;&amp;#x2021;&amp;#x25CA;&amp;#x2720;</quote> will identify
+footnotes with <quote>*</quote>, <quote>&#8224;</quote>, <quote>&#8225;</quote>,
+<quote>&#9674;</quote>, and <quote>&#10016;</quote>. If there are more footnotes
+than symbols, the stylesheets will fall back to numbered footnotes using
+<parameter>table.footnote.number.format</parameter>.</para>
+
+<para>The use of symbols for footnotes depends on the ability of your
+processor (or browser) to render the symbols you select. Not all systems are
+capable of displaying the full range of Unicode characters. If the quoted characters
+in the preceding paragraph are not displayed properly, that's a good indicator
+that you may have trouble using those symbols for footnotes.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="highlight.source">
+<refmeta>
+<refentrytitle>highlight.source</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>highlight.source</refname>
+<refpurpose>Should the content of <tag>programlisting</tag>
+be syntactically highlighted?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="highlight.source.frag">
+&lt;xsl:param name="highlight.source" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>When this parameter is non-zero, the stylesheets will try to do syntax highlighting of the
+content of <tag>programlisting</tag> elements. You specify the language for each programlisting
+by using the <tag class="attribute">language</tag> attribute. The <parameter>highlight.default.language</parameter>
+parameter can be used to specify the language for programlistings without a <tag class="attribute">language</tag>
+attribute. Syntax highlighting also works for <tag>screen</tag> and <tag>synopsis</tag> elements.</para>
+
+<para>The actual highlighting work is done by the XSLTHL extension module. This is an external Java library that has to be
+downloaded separately (see below).</para>
+
+<itemizedlist>
+<para>In order to use this extension, you must</para>
+
+<listitem><para>add <filename>xslthl-2.x.x.jar</filename> to your Java classpath. The latest version is available
+from <link xlink:href="http://sourceforge.net/projects/xslthl">the XSLT syntax highlighting project</link>
+at SourceForge.</para>
+</listitem>
+<listitem>
+<para>use a customization layer in which you import one of the following stylesheet modules:
+<itemizedlist>
+ <listitem>
+ <para><filename>html/highlight.xsl</filename>
+ </para>
+ </listitem>
+<listitem>
+ <para><filename>xhtml/highlight.xsl</filename>
+ </para>
+ </listitem>
+<listitem>
+ <para><filename>xhtml-1_1/highlight.xsl</filename>
+ </para>
+ </listitem>
+<listitem>
+ <para><filename>fo/highlight.xsl</filename>
+ </para>
+</listitem>
+</itemizedlist>
+</para>
+</listitem>
+<listitem><para>let either the <literal>xslthl.config</literal> Java system property or the
+<parameter>highlight.xslthl.config</parameter> parameter point to the configuration file for syntax
+highlighting (using URL syntax). DocBook XSL comes with a ready-to-use configuration file,
+<filename>highlighting/xslthl-config.xml</filename>.</para>
+</listitem>
+</itemizedlist>
+
+<para>The extension works with Saxon 6.5.x and Xalan-J. (Saxon 8.5 or later is also supported, but since it is
+an XSLT 2.0 processor it is not guaranteed to work with DocBook XSL in all circumstances.)</para>
+
+<para>The following is an example of a Saxon 6 command adapted for syntax highlighting, to be used on Windows:</para>
+
+<informalexample>
+<para><command>java -cp c:/Java/saxon.jar;c:/Java/xslthl-2.0.1.jar
+-Dxslthl.config=file:///c:/docbook-xsl/highlighting/xslthl-config.xml com.icl.saxon.StyleSheet
+-o test.html test.xml myhtml.xsl</command></para>
+</informalexample>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="highlight.xslthl.config">
+<refmeta>
+<refentrytitle>highlight.xslthl.config</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">uri</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>highlight.xslthl.config</refname>
+<refpurpose>Location of XSLTHL configuration file</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="highlight.xslthl.config.frag">
+&lt;xsl:param name="highlight.xslthl.config"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>This location has precedence over the corresponding Java property.</para>
+
+<para>Please note that usually you have to specify location as URL not
+just as a simple path on the local
+filesystem. E.g. <filename>file:///home/user/xslthl/my-xslthl-config.xml</filename>.</para>
+
+
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="highlight.default.language">
+<refmeta>
+<refentrytitle>highlight.default.language</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>highlight.default.language</refname>
+<refpurpose>Default language of programlisting</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="highlight.default.language.frag">
+&lt;xsl:param name="highlight.default.language"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>This language is used when there is no language attribute on programlisting.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="email.delimiters.enabled">
+<refmeta>
+<refentrytitle>email.delimiters.enabled</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>email.delimiters.enabled</refname>
+<refpurpose>Generate delimiters around email addresses?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="email.delimiters.enabled.frag">
+&lt;xsl:param name="email.delimiters.enabled" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, delimiters
+
+<footnote><para>For delimiters, the
+stylesheets are currently hard-coded to output angle
+brackets.</para></footnote>
+
+are generated around e-mail addresses
+(the output of the <tag>email</tag> element).</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="exsl.node.set.available">
+<refmeta>
+<refentrytitle>exsl.node.set.available</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>exsl.node.set.available</refname>
+<refpurpose>Is the test function-available('exsl:node-set') true?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="exsl.node.set.available.frag">&lt;xsl:param name="exsl.node.set.available"&gt;
+ &lt;xsl:choose&gt;
+ &lt;xsl:when exsl:foo="" test="function-available('exsl:node-set') or contains(system-property('xsl:vendor'), 'Apache Software Foundation')"&gt;1&lt;/xsl:when&gt;
+ &lt;xsl:otherwise&gt;0&lt;/xsl:otherwise&gt;
+ &lt;/xsl:choose&gt;
+&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero,
+then the exsl:node-set() function is available to be used in
+the stylesheet.
+If zero, then the function is not available.
+This param automatically detects the presence of
+the function and does not normally need to be set manually.</para>
+
+<para>This param was created to handle a long-standing
+bug in the Xalan processor that fails to detect the
+function even though it is available.</para>
+
+</refsection>
+</refentry>
+
+</reference><reference id="annos" xml:base="../html/param.xml"><title>Annotations</title>
+<refentry version="5.0" id="annotation.support">
+<refmeta>
+<refentrytitle>annotation.support</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>annotation.support</refname>
+<refpurpose>Enable annotations?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="annotation.support.frag">
+&lt;xsl:param name="annotation.support" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, the stylesheets will attempt to support annotation
+elements in HTML by including some JavaScript (see
+<parameter>annotation.js</parameter>).</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="annotation.js">
+<refmeta>
+<refentrytitle>annotation.js</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>annotation.js</refname>
+<refpurpose>URIs identifying JavaScript files with support for annotation popups</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="annotation.js.frag">
+
+&lt;xsl:param name="annotation.js"&gt;
+&lt;xsl:text&gt;http://docbook.sourceforge.net/release/script/AnchorPosition.js http://docbook.sourceforge.net/release/script/PopupWindow.js&lt;/xsl:text&gt;&lt;/xsl:param&gt;
+
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If <property>annotation.support</property> is enabled and the
+document contains <tag>annotation</tag>s, then the URIs listed
+in this parameter will be included. These JavaScript files are required
+for popup annotation support.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="annotation.css">
+<refmeta>
+<refentrytitle>annotation.css</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>annotation.css</refname>
+<refpurpose>CSS rules for annotations</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="annotation.css.frag">
+&lt;xsl:param name="annotation.css"&gt;
+/* ======================================================================
+ Annotations
+*/
+
+div.annotation-list { visibility: hidden;
+ }
+
+div.annotation-nocss { position: absolute;
+ visibility: hidden;
+ }
+
+div.annotation-popup { position: absolute;
+ z-index: 4;
+ visibility: hidden;
+ padding: 0px;
+ margin: 2px;
+ border-style: solid;
+ border-width: 1px;
+ width: 200px;
+ background-color: white;
+ }
+
+div.annotation-title { padding: 1px;
+ font-weight: bold;
+ border-bottom-style: solid;
+ border-bottom-width: 1px;
+ color: white;
+ background-color: black;
+ }
+
+div.annotation-body { padding: 2px;
+ }
+
+div.annotation-body p { margin-top: 0px;
+ padding-top: 0px;
+ }
+
+div.annotation-close { position: absolute;
+ top: 2px;
+ right: 2px;
+ }
+&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If <parameter>annotation.support</parameter> is enabled and the
+document contains <tag>annotation</tag>s, then the CSS in this
+parameter will be included in the document.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="annotation.graphic.open">
+<refmeta>
+<refentrytitle>annotation.graphic.open</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">uri</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>annotation.graphic.open</refname>
+<refpurpose>Image for identifying a link that opens an annotation popup</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="annotation.graphic.open.frag">
+&lt;xsl:param name="annotation.graphic.open"&gt;http://docbook.sourceforge.net/release/images/annot-open.png&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>This image is used inline to identify the location of
+annotations. It may be replaced by a user provided graphic. The size should be approximately 10x10 pixels.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="annotation.graphic.close">
+<refmeta>
+<refentrytitle>annotation.graphic.close</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">uri</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>annotation.graphic.close</refname>
+<refpurpose>Image for identifying a link that closes an annotation popup</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="annotation.graphic.close.frag">
+&lt;xsl:param name="annotation.graphic.close"&gt;
+http://docbook.sourceforge.net/release/images/annot-close.png&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>This image is used on popup annotations as the &#8220;x&#8221; that the
+user can click to dismiss the popup.</para>
+<para>This image is used on popup annotations as the &#8220;x&#8221; that the user can
+click to dismiss the popup. It may be replaced by a user provided graphic. The size should be approximately 10x10 pixels.</para>
+
+</refsection>
+</refentry>
+
+</reference><reference id="graphics" xml:base="../html/param.xml"><title>Graphics</title>
+<refentry version="5.0" id="img.src.path">
+<refmeta>
+<refentrytitle>img.src.path</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>img.src.path</refname>
+<refpurpose>Path to HTML/FO image files</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="img.src.path.frag">&lt;xsl:param name="img.src.path"&gt;&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Add a path prefix to the value of the <tag class="attribute">fileref</tag>
+attribute of <tag>graphic</tag>, <tag>inlinegraphic</tag>, and <tag>imagedata</tag> elements. The resulting
+compound path is used in the output as the value of the <tag class="attribute">src</tag>
+attribute of <tag class="element">img</tag> (HTML) or <tag class="element">external-graphic</tag> (FO).
+</para>
+
+<para>
+The path given by <literal>img.src.path</literal> could be relative to the directory where the HTML/FO
+files are created, or it could be an absolute URI.
+The default value is empty.
+Be sure to include a trailing slash if needed.
+</para>
+
+<para>This prefix is not applied to any filerefs that start
+with "/" or contain "//:".
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="keep.relative.image.uris">
+<refmeta>
+<refentrytitle>keep.relative.image.uris</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>keep.relative.image.uris</refname>
+<refpurpose>Should image URIs be resolved against xml:base?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="keep.relative.image.uris.frag">
+&lt;xsl:param name="keep.relative.image.uris" select="1"&gt;&lt;/xsl:param&gt;
+
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, relative URIs (in, for example
+<literal>fileref</literal> attributes) will be used in the generated
+output. Otherwise, the URIs will be made absolute with respect to the
+base URI.</para>
+
+<para>Note that the stylesheets calculate (and use) the absolute form
+for some purposes, this only applies to the resulting output.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="graphic.default.extension">
+<refmeta>
+<refentrytitle>graphic.default.extension</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>graphic.default.extension</refname>
+<refpurpose>Default extension for graphic filenames</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="graphic.default.extension.frag">&lt;xsl:param name="graphic.default.extension"&gt;&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If a <tag>graphic</tag> or <tag>mediaobject</tag>
+includes a reference to a filename that does not include an extension,
+and the <tag class="attribute">format</tag> attribute is
+<emphasis>unspecified</emphasis>, the default extension will be used.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="default.image.width">
+<refmeta>
+<refentrytitle>default.image.width</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">length</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>default.image.width</refname>
+<refpurpose>The default width of images</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="default.image.width.frag">
+&lt;xsl:param name="default.image.width"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If specified, this value will be used for the
+<tag class="attribute">width</tag> attribute on images that do not specify any
+<emphasis xlink:title="DocBook 5: The Definitive Guide" xlink:href="http://docbook.org/tdg5/en/html/imagedata.html#viewport.area">viewport dimensions</emphasis>.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="nominal.image.width">
+<refmeta>
+<refentrytitle>nominal.image.width</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">length</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>nominal.image.width</refname>
+<refpurpose>The nominal image width</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="nominal.image.width.frag">
+&lt;xsl:param name="nominal.image.width" select="6 * $pixels.per.inch"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Graphic widths expressed as a percentage are problematic. In the
+following discussion, we speak of width and contentwidth, but
+the same issues apply to depth and contentdepth.</para>
+
+<para>A width of 50% means "half of the available space for the image."
+That's fine. But note that in HTML, this is a dynamic property and
+the image size will vary if the browser window is resized.</para>
+
+<para>A contentwidth of 50% means "half of the actual image width".
+But what does that mean if the stylesheets cannot assess the image's
+actual size? Treating this as a width of 50% is one possibility, but
+it produces behavior (dynamic scaling) that seems entirely out of
+character with the meaning.</para>
+
+<para>Instead, the stylesheets define a
+<parameter>nominal.image.width</parameter> and convert percentages to
+actual values based on that nominal size.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="nominal.image.depth">
+<refmeta>
+<refentrytitle>nominal.image.depth</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">length</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>nominal.image.depth</refname>
+<refpurpose>Nominal image depth</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="nominal.image.depth.frag">
+&lt;xsl:param name="nominal.image.depth" select="4 * $pixels.per.inch"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>See <parameter>nominal.image.width</parameter>.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="use.embed.for.svg">
+<refmeta>
+<refentrytitle>use.embed.for.svg</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>use.embed.for.svg</refname>
+<refpurpose>Use HTML <tag>embed</tag> for SVG?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="use.embed.for.svg.frag">
+&lt;xsl:param name="use.embed.for.svg" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, an <tag>embed</tag> element will be created for
+SVG figures. An <tag>object</tag> is <emphasis>always</emphasis> created,
+this parameter merely controls whether or not an additional <tag>embed</tag>
+is generated inside the <tag>object</tag>.</para>
+
+<para>On the plus side, this may be more portable among browsers and plug-ins.
+On the minus side, it isn't valid HTML.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="make.graphic.viewport">
+<refmeta>
+<refentrytitle>make.graphic.viewport</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>make.graphic.viewport</refname>
+<refpurpose>Use tables in HTML to make viewports for graphics</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="make.graphic.viewport.frag">
+&lt;xsl:param name="make.graphic.viewport" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The HTML <tag>img</tag> element only supports the notion
+of content-area scaling; it doesn't support the distinction between a
+content-area and a viewport-area, so we have to make some compromises.</para>
+
+<para>If <parameter>make.graphic.viewport</parameter> is non-zero, a table
+will be used to frame the image. This creates an effective viewport-area.
+</para>
+
+<para>Tables and alignment don't work together, so this parameter is ignored
+if alignment is specified on an image.</para>
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="preferred.mediaobject.role">
+<refmeta>
+<refentrytitle>preferred.mediaobject.role</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>preferred.mediaobject.role</refname>
+<refpurpose>Select which mediaobject to use based on
+this value of an object's <tag class="attribute">role</tag> attribute.
+</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="preferred.mediaobject.role.frag">
+&lt;xsl:param name="preferred.mediaobject.role"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>A mediaobject may contain several objects such as imageobjects.
+If the parameter <parameter>use.role.for.mediaobject</parameter> is
+non-zero, then the <literal>role</literal> attribute on
+<tag>imageobject</tag>s and other objects within a
+<tag>mediaobject</tag> container will be used to select which object
+will be used. If one of the objects has a role value that matches the
+<parameter>preferred.mediaobject.role</parameter> parameter, then it
+has first priority for selection. If more than one has such a role
+value, the first one is used.
+</para>
+<para>
+See the <parameter>use.role.for.mediaobject</parameter> parameter
+for the sequence of selection.</para>
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="use.role.for.mediaobject">
+<refmeta>
+<refentrytitle>use.role.for.mediaobject</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>use.role.for.mediaobject</refname>
+<refpurpose>Use <tag class="attribute">role</tag> attribute
+value for selecting which of several objects within a mediaobject to use.
+</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="use.role.for.mediaobject.frag">
+&lt;xsl:param name="use.role.for.mediaobject" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, the <tag class="attribute">role</tag> attribute on
+<tag>imageobject</tag>s or other objects within a <tag>mediaobject</tag> container will be used to select which object will be
+used.
+</para>
+<para>
+The order of selection when then parameter is non-zero is:
+</para>
+<orderedlist>
+<listitem>
+ <para>If the stylesheet parameter <parameter>preferred.mediaobject.role</parameter> has a value, then the object whose role equals that value is selected.</para>
+</listitem>
+<listitem>
+<para>Else if an object's role attribute has a value of
+<literal>html</literal> for HTML processing or
+<literal>fo</literal> for FO output, then the first
+of such objects is selected.
+</para>
+</listitem>
+<listitem>
+<para>Else the first suitable object is selected.</para>
+</listitem>
+</orderedlist>
+<para>
+If the value of
+<parameter>use.role.for.mediaobject</parameter>
+is zero, then role attributes are not considered
+and the first suitable object
+with or without a role value is used.
+</para>
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="ignore.image.scaling">
+<refmeta>
+<refentrytitle>ignore.image.scaling</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>ignore.image.scaling</refname>
+<refpurpose>Tell the stylesheets to ignore the author's image scaling attributes</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="ignore.image.scaling.frag">
+&lt;xsl:param name="ignore.image.scaling" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, the scaling attributes on graphics and media objects are
+ignored.</para>
+
+</refsection>
+</refentry>
+
+</reference><reference id="chunking" xml:base="../html/param.xml"><title>Chunking</title>
+<refentry version="5.0" id="chunker.output.cdata-section-elements">
+<refmeta>
+<refentrytitle>chunker.output.cdata-section-elements</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>chunker.output.cdata-section-elements</refname>
+<refpurpose>List of elements to escape with CDATA sections</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+<programlisting id="chunker.output.cdata-section-elements.frag">
+&lt;xsl:param name="chunker.output.cdata-section-elements"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+<para>This parameter specifies the list of elements that should be escaped
+as CDATA sections by the chunking stylesheet. Not all processors support
+specification of this parameter.
+</para>
+<note>
+<para>This parameter is documented here, but the declaration is actually
+in the <filename>chunker.xsl</filename> stylesheet module.</para>
+</note>
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="chunker.output.doctype-public">
+<refmeta>
+<refentrytitle>chunker.output.doctype-public</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>chunker.output.doctype-public</refname>
+<refpurpose>Public identifer to use in the document type of generated pages</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+<programlisting id="chunker.output.doctype-public.frag">
+&lt;xsl:param name="chunker.output.doctype-public"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+<para>This parameter specifies the public identifier that should be used by
+the chunking stylesheet in the document type declaration of chunked pages.
+Not all processors support specification of
+this parameter.
+</para>
+<note>
+<para>This parameter is documented here, but the declaration is actually
+in the <filename>chunker.xsl</filename> stylesheet module.</para>
+</note>
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="chunker.output.doctype-system">
+<refmeta>
+<refentrytitle>chunker.output.doctype-system</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">uri</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>chunker.output.doctype-system</refname>
+<refpurpose>System identifier to use for the document type in generated pages</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+<programlisting id="chunker.output.doctype-system.frag">
+&lt;xsl:param name="chunker.output.doctype-system"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+<para>This parameter specifies the system identifier that should be used by
+the chunking stylesheet in the document type declaration of chunked pages.
+Not all processors support specification of
+this parameter.
+</para>
+<note>
+<para>This parameter is documented here, but the declaration is actually
+in the <filename>chunker.xsl</filename> stylesheet module.</para>
+</note>
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="chunker.output.encoding">
+<refmeta>
+<refentrytitle>chunker.output.encoding</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>chunker.output.encoding</refname>
+<refpurpose>Encoding used in generated pages</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+<programlisting id="chunker.output.encoding.frag">
+&lt;xsl:param name="chunker.output.encoding"&gt;ISO-8859-1&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+<para>This parameter specifies the encoding to be used in files
+generated by the chunking stylesheet. Not all processors support
+specification of this parameter.
+</para>
+<para>This parameter used to be named <literal>default.encoding</literal>.</para>
+<note>
+<para>This parameter is documented here, but the declaration is actually
+in the <filename>chunker.xsl</filename> stylesheet module.</para>
+</note>
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="chunker.output.indent">
+<refmeta>
+<refentrytitle>chunker.output.indent</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>chunker.output.indent</refname>
+<refpurpose>Specification of indentation on generated pages</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+<programlisting id="chunker.output.indent.frag">
+&lt;xsl:param name="chunker.output.indent"&gt;no&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+<para>This parameter specifies the value of the indent
+specification for generated pages. Not all processors support
+specification of this parameter.
+</para>
+<note>
+<para>This parameter is documented here, but the declaration is actually
+in the <filename>chunker.xsl</filename> stylesheet module.</para>
+</note>
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="chunker.output.media-type">
+<refmeta>
+<refentrytitle>chunker.output.media-type</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>chunker.output.media-type</refname>
+<refpurpose>Media type to use in generated pages</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+<programlisting id="chunker.output.media-type.frag">
+&lt;xsl:param name="chunker.output.media-type"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+<para>This parameter specifies the media type that should be used by
+the chunking stylesheet. Not all processors support specification of
+this parameter.
+</para>
+<para>This parameter specifies the media type that should be used by the
+chunking stylesheet. This should be one from those defined in
+<link xlink:href="http://www.ietf.org/rfc/rfc2045.txt">[RFC2045]</link> and
+ <link xlink:href="http://www.ietf.org/rfc/rfc2046.txt">[RFC2046]</link> </para>
+<note>
+<para>This parameter is documented here, but the declaration is actually
+in the <filename>chunker.xsl</filename> stylesheet module.</para>
+<para>It must be one from html, xml or text</para>
+</note>
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="chunker.output.method">
+<refmeta>
+<refentrytitle>chunker.output.method</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">list</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">html</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">xml</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>chunker.output.method</refname>
+<refpurpose>Method used in generated pages</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+<programlisting id="chunker.output.method.frag">
+&lt;xsl:param name="chunker.output.method"&gt;html&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+<para>This parameter specifies the output method to be used in files
+generated by the chunking stylesheet.
+</para>
+<para>This parameter used to be named <literal>output.method</literal>.</para>
+<note>
+<para>This parameter is documented here, but the declaration is actually
+in the <filename>chunker.xsl</filename> stylesheet module.</para>
+</note>
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="chunker.output.omit-xml-declaration">
+<refmeta>
+<refentrytitle>chunker.output.omit-xml-declaration</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>chunker.output.omit-xml-declaration</refname>
+<refpurpose>Omit-xml-declaration for generated pages</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+<programlisting id="chunker.output.omit-xml-declaration.frag">
+&lt;xsl:param name="chunker.output.omit-xml-declaration"&gt;no&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+<para>This parameter specifies the value of the omit-xml-declaration
+specification for generated pages. Not all processors support
+specification of this parameter.
+</para>
+<note>
+<para>This parameter is documented here, but the declaration is actually
+in the <filename>chunker.xsl</filename> stylesheet module.</para>
+</note>
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="chunker.output.standalone">
+<refmeta>
+<refentrytitle>chunker.output.standalone</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>chunker.output.standalone</refname>
+<refpurpose>Standalone declaration for generated pages</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+<programlisting id="chunker.output.standalone.frag">
+&lt;xsl:param name="chunker.output.standalone"&gt;no&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+<para>This parameter specifies the value of the standalone
+ specification for generated pages. It must be either
+ <literal>yes</literal> or <literal>no</literal>. Not all
+ processors support specification of this parameter.
+</para>
+<note>
+<para>This parameter is documented here, but the declaration is actually
+in the <filename>chunker.xsl</filename> stylesheet module.</para>
+</note>
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="saxon.character.representation">
+<refmeta>
+<refentrytitle>saxon.character.representation</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>saxon.character.representation</refname>
+<refpurpose>Saxon character representation used in generated HTML pages</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+ <programlisting id="saxon.character.representation.frag">&lt;xsl:param name="saxon.character.representation" select="'entity;decimal'"&gt;&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>This parameter has effect only when Saxon 6 is used (version 6.4.2 or later).
+It sets the character representation in files generated by the chunking stylesheets.
+If you want to suppress entity references for characters with direct representations in
+<parameter>chunker.output.encoding</parameter>, set the parameter value to <literal>native</literal>.
+</para>
+
+<para> For more information, see <link role="tcg" xlink:href="OutputEncoding.html#SaxonCharacter">Saxon output character representation</link>.</para>
+
+<note>
+<para>This parameter is documented here, but the declaration is actually
+in the <filename>chunker.xsl</filename> stylesheet module.</para>
+</note>
+
+</refsection>
+
+</refentry>
+
+<refentry version="5.0" id="html.ext">
+<refmeta>
+<refentrytitle>html.ext</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>html.ext</refname>
+<refpurpose>Identifies the extension of generated HTML files</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="html.ext.frag">
+&lt;xsl:param name="html.ext"&gt;.html&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The extension identified by <parameter>html.ext</parameter> will
+be used as the filename extension for chunks created by this
+stylesheet. </para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="use.id.as.filename">
+<refmeta>
+<refentrytitle>use.id.as.filename</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>use.id.as.filename</refname>
+<refpurpose>Use ID value of chunk elements as the filename?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="use.id.as.filename.frag">
+&lt;xsl:param name="use.id.as.filename" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If <parameter>use.id.as.filename</parameter>
+is non-zero, the filename of chunk elements that have IDs will be
+derived from the ID value.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="html.extra.head.links">
+<refmeta>
+<refentrytitle>html.extra.head.links</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>html.extra.head.links</refname>
+<refpurpose>Toggle extra HTML head link information</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="html.extra.head.links.frag">
+&lt;xsl:param name="html.extra.head.links" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, extra <tag>link</tag> elements will be
+generated in the <tag>head</tag> of chunked HTML files. These
+extra links point to chapters, appendixes, sections, etc. as supported
+by the <quote>Site Navigation Bar</quote> in Mozilla 1.0 (as of CR1, at least).
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="root.filename">
+<refmeta>
+<refentrytitle>root.filename</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">uri</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>root.filename</refname>
+<refpurpose>Identifies the name of the root HTML file when chunking</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="root.filename.frag">
+&lt;xsl:param name="root.filename"&gt;index&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The <parameter>root.filename</parameter> is the base filename for
+the chunk created for the root of each document processed.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="base.dir">
+<refmeta>
+<refentrytitle>base.dir</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">uri</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>base.dir</refname>
+<refpurpose>The base directory of chunks</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="base.dir.frag">
+&lt;xsl:param name="base.dir"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If specified, the <parameter>base.dir</parameter> identifies
+the output directory for chunks. (If not specified, the output directory
+is system dependent.)</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="generate.manifest">
+ <refmeta>
+ <refentrytitle>generate.manifest</refentrytitle>
+ <refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+ </refmeta>
+ <refnamediv>
+ <refname>generate.manifest</refname>
+ <refpurpose>Generate a manifest file?</refpurpose>
+ </refnamediv>
+
+ <refsynopsisdiv>
+ <programlisting id="generate.manifest.frag">&lt;xsl:param name="generate.manifest" select="0"&gt;&lt;/xsl:param&gt;</programlisting>
+ </refsynopsisdiv>
+
+ <refsection><info><title>Description</title></info>
+
+ <para>If non-zero, a list of HTML files generated by the
+ stylesheet transformation is written to the file named by
+ the <parameter>manifest</parameter> parameter.</para>
+
+ </refsection>
+</refentry>
+
+<refentry version="5.0" id="manifest">
+ <refmeta>
+ <refentrytitle>manifest</refentrytitle>
+ <refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+ </refmeta>
+ <refnamediv>
+ <refname>manifest</refname>
+ <refpurpose>Name of manifest file</refpurpose>
+ </refnamediv>
+
+ <refsynopsisdiv>
+ <programlisting id="manifest.frag">
+ &lt;xsl:param name="manifest"&gt;HTML.manifest&lt;/xsl:param&gt;
+ </programlisting>
+ </refsynopsisdiv>
+
+ <refsection><info><title>Description</title></info>
+
+ <para>The name of the file to which a manifest is written (if the
+ value of the <parameter>generate.manifest</parameter> parameter
+ is non-zero).</para>
+
+ </refsection>
+</refentry>
+
+<refentry version="5.0" id="manifest.in.base.dir">
+<refmeta>
+<refentrytitle>manifest.in.base.dir</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>manifest.in.base.dir</refname>
+<refpurpose>Should the manifest file be written into <parameter>base.dir</parameter>?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="manifest.in.base.dir.frag">
+&lt;xsl:param name="manifest.in.base.dir" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, the manifest file as well as project files for HTML Help and
+Eclipse Help are written into <parameter>base.dir</parameter> instead
+of the current directory.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="chunk.toc">
+<refmeta>
+<refentrytitle>chunk.toc</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>chunk.toc</refname>
+<refpurpose>An explicit TOC to be used for chunking</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="chunk.toc.frag">
+&lt;xsl:param name="chunk.toc"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The <parameter>chunk.toc</parameter> identifies an explicit TOC that
+will be used for chunking. This parameter is only used by the
+<filename>chunktoc.xsl</filename> stylesheet (and customization layers built
+from it).</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="chunk.tocs.and.lots">
+<refmeta>
+<refentrytitle>chunk.tocs.and.lots</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>chunk.tocs.and.lots</refname>
+<refpurpose>Should ToC and LoTs be in separate chunks?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="chunk.tocs.and.lots.frag">
+&lt;xsl:param name="chunk.tocs.and.lots" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, ToC and LoT (List of Examples, List of Figures, etc.)
+will be put in a separate chunk. At the moment, this chunk is not in the
+normal forward/backward navigation list. Instead, a new link is added to the
+navigation footer.</para>
+
+<para>This feature is still somewhat experimental. Feedback welcome.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="chunk.separate.lots">
+<refmeta>
+<refentrytitle>chunk.separate.lots</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>chunk.separate.lots</refname>
+<refpurpose>Should each LoT be in its own separate chunk?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="chunk.separate.lots.frag">
+&lt;xsl:param name="chunk.separate.lots" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, each of the ToC and LoTs
+(List of Examples, List of Figures, etc.)
+will be put in its own separate chunk.
+The title page includes generated links to each of the separate files.
+</para>
+<para>
+This feature depends on the
+<parameter>chunk.tocs.and.lots</parameter>
+parameter also being non-zero.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="chunk.tocs.and.lots.has.title">
+<refmeta>
+<refentrytitle>chunk.tocs.and.lots.has.title</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>chunk.tocs.and.lots.has.title</refname>
+<refpurpose>Should ToC and LoTs in a separate chunks have title?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="chunk.tocs.and.lots.has.title.frag">
+&lt;xsl:param name="chunk.tocs.and.lots.has.title" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero title of document is shown before ToC/LoT in
+separate chunk.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="chunk.section.depth">
+<refmeta>
+<refentrytitle>chunk.section.depth</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">integer</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>chunk.section.depth</refname>
+<refpurpose>Depth to which sections should be chunked</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="chunk.section.depth.frag">
+&lt;xsl:param name="chunk.section.depth" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>This parameter sets the depth of section chunking.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="chunk.first.sections">
+<refmeta>
+<refentrytitle>chunk.first.sections</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>chunk.first.sections</refname>
+<refpurpose>Chunk the first top-level section?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="chunk.first.sections.frag">
+&lt;xsl:param name="chunk.first.sections" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, a chunk will be created for the first top-level
+<tag>sect1</tag> or <tag>section</tag> elements in
+each component. Otherwise, that section will be part of the chunk for
+its parent.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="chunk.quietly">
+<refmeta>
+<refentrytitle>chunk.quietly</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>chunk.quietly</refname>
+<refpurpose>Omit the chunked filename messages.</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="chunk.quietly.frag">
+&lt;xsl:param name="chunk.quietly" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If zero (the default), the XSL processor emits a message naming
+each separate chunk filename as it is being output.
+If nonzero, then the messages are suppressed.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="chunk.append">
+<refmeta>
+<refentrytitle>chunk.append</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>chunk.append</refname>
+<refpurpose>Specifies content to append to chunked HTML output</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="chunk.append.frag">&lt;xsl:param name="chunk.append"&gt;&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies content to append to the end of HTML files output by
+the <filename>html/chunk.xsl</filename> stylesheet, after the closing
+<code>&lt;html&gt;</code> tag. You probably don&#8217;t want to set any value
+for this parameter; but if you do, the only value it should ever be
+set to is a newline character: <code>&amp;#x0a;</code> or
+<code>&amp;#10;</code></para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="navig.graphics">
+<refmeta>
+<refentrytitle>navig.graphics</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>navig.graphics</refname>
+<refpurpose>Use graphics in navigational headers and footers?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="navig.graphics.frag">
+&lt;xsl:param name="navig.graphics" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, the navigational headers and footers in chunked
+HTML are presented in an alternate style that uses graphical icons for
+Next, Previous, Up, and Home. Default graphics are provided in the
+distribution. If zero, text is used instead of graphics.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="navig.graphics.extension">
+<refmeta>
+<refentrytitle>navig.graphics.extension</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>navig.graphics.extension</refname>
+<refpurpose>Extension for navigational graphics</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="navig.graphics.extension.frag">
+&lt;xsl:param name="navig.graphics.extension"&gt;.gif&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Sets the filename extension to use on navigational graphics used
+in the headers and footers of chunked HTML.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="navig.graphics.path">
+<refmeta>
+<refentrytitle>navig.graphics.path</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>navig.graphics.path</refname>
+<refpurpose>Path to navigational graphics</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="navig.graphics.path.frag">
+&lt;xsl:param name="navig.graphics.path"&gt;images/&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Sets the path, probably relative to the directory where the HTML
+files are created, to the navigational graphics used in the
+headers and footers of chunked HTML.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="navig.showtitles">
+<refmeta>
+<refentrytitle>navig.showtitles</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>navig.showtitles</refname>
+<refpurpose>Display titles in HTML headers and footers?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="navig.showtitles.frag">&lt;xsl:param name="navig.showtitles"&gt;1&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero,
+the headers and footers of chunked HTML
+display the titles of the next and previous chunks,
+along with the words 'Next' and 'Previous' (or the
+equivalent graphical icons if navig.graphics is true).
+If false (zero), then only the words 'Next' and 'Previous'
+(or the icons) are displayed.
+</para>
+
+</refsection>
+</refentry>
+
+</reference><reference id="profiling" xml:base="../html/param.xml"><title>Profiling</title>
+<partintro id="partintro">
+<para>The following parameters can be used for attribute-based
+profiling of your document. For more information about profiling, see
+<link role="tcg" xlink:href="Profiling.html">Profiling (conditional text)</link>.</para>
+</partintro>
+<refentry version="5.0" id="profile.arch">
+<refmeta>
+<refentrytitle>profile.arch</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>profile.arch</refname>
+<refpurpose>Target profile for <tag class="attribute">arch</tag>
+attribute</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="profile.arch.frag">
+&lt;xsl:param name="profile.arch"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+
+<refsection><info><title>Description</title></info>
+
+<para>The value of this parameter specifies profiles which should be
+included in the output. You can specify multiple profiles by
+separating them by semicolon. You can change separator character by
+<parameter>profile.separator</parameter>
+parameter.</para>
+
+<para>This parameter has effect only when you are using profiling
+stylesheets (<filename>profile-docbook.xsl</filename>,
+<filename>profile-chunk.xsl</filename>, &#8230;) instead of normal
+ones (<filename>docbook.xsl</filename>,
+<filename>chunk.xsl</filename>, &#8230;).</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="profile.audience">
+<refmeta>
+<refentrytitle>profile.audience</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>profile.audience</refname>
+<refpurpose>Target profile for <tag class="attribute">audience</tag>
+attribute</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="profile.audience.frag">
+&lt;xsl:param name="profile.audience"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Value of this parameter specifies profiles which should be
+included in the output. You can specify multiple profiles by
+separating them by semicolon. You can change separator character by
+<parameter>profile.separator</parameter>
+parameter.</para>
+
+<para>This parameter has effect only when you are using profiling
+stylesheets (<filename>profile-docbook.xsl</filename>,
+<filename>profile-chunk.xsl</filename>, &#8230;) instead of normal
+ones (<filename>docbook.xsl</filename>,
+<filename>chunk.xsl</filename>, &#8230;).</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="profile.condition">
+<refmeta>
+<refentrytitle>profile.condition</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>profile.condition</refname>
+<refpurpose>Target profile for <tag class="attribute">condition</tag>
+attribute</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="profile.condition.frag">
+&lt;xsl:param name="profile.condition"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The value of this parameter specifies profiles which should be
+included in the output. You can specify multiple profiles by
+separating them by semicolon. You can change separator character by
+<parameter>profile.separator</parameter>
+parameter.</para>
+
+<para>This parameter has effect only when you are using profiling
+stylesheets (<filename>profile-docbook.xsl</filename>,
+<filename>profile-chunk.xsl</filename>, &#8230;) instead of normal
+ones (<filename>docbook.xsl</filename>,
+<filename>chunk.xsl</filename>, &#8230;).</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="profile.conformance">
+<refmeta>
+<refentrytitle>profile.conformance</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>profile.conformance</refname>
+<refpurpose>Target profile for <tag class="attribute">conformance</tag>
+attribute</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="profile.conformance.frag">
+&lt;xsl:param name="profile.conformance"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The value of this parameter specifies profiles which should be
+included in the output. You can specify multiple profiles by
+separating them by semicolon. You can change separator character by
+<parameter>profile.separator</parameter>
+parameter.</para>
+
+<para>This parameter has effect only when you are using profiling
+stylesheets (<filename>profile-docbook.xsl</filename>,
+<filename>profile-chunk.xsl</filename>, &#8230;) instead of normal
+ones (<filename>docbook.xsl</filename>,
+<filename>chunk.xsl</filename>, &#8230;).</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="profile.lang">
+<refmeta>
+<refentrytitle>profile.lang</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>profile.lang</refname>
+<refpurpose>Target profile for <tag class="attribute">lang</tag>
+attribute</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="profile.lang.frag">
+&lt;xsl:param name="profile.lang"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The value of this parameter specifies profiles which should be
+included in the output. You can specify multiple profiles by
+separating them by semicolon. You can change separator character by
+<parameter>profile.separator</parameter>
+parameter.</para>
+
+<para>This parameter has effect only when you are using profiling
+stylesheets (<filename>profile-docbook.xsl</filename>,
+<filename>profile-chunk.xsl</filename>, &#8230;) instead of normal
+ones (<filename>docbook.xsl</filename>,
+<filename>chunk.xsl</filename>, &#8230;).</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="profile.os">
+<refmeta>
+<refentrytitle>profile.os</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>profile.os</refname>
+<refpurpose>Target profile for <tag class="attribute">os</tag>
+attribute</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="profile.os.frag">
+&lt;xsl:param name="profile.os"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The value of this parameter specifies profiles which should be
+included in the output. You can specify multiple profiles by
+separating them by semicolon. You can change separator character by
+<parameter>profile.separator</parameter>
+parameter.</para>
+
+<para>This parameter has effect only when you are using profiling
+stylesheets (<filename>profile-docbook.xsl</filename>,
+<filename>profile-chunk.xsl</filename>, &#8230;) instead of normal
+ones (<filename>docbook.xsl</filename>,
+<filename>chunk.xsl</filename>, &#8230;).</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="profile.revision">
+<refmeta>
+<refentrytitle>profile.revision</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>profile.revision</refname>
+<refpurpose>Target profile for <tag class="attribute">revision</tag>
+attribute</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="profile.revision.frag">
+&lt;xsl:param name="profile.revision"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The value of this parameter specifies profiles which should be
+included in the output. You can specify multiple profiles by
+separating them by semicolon. You can change separator character by
+<parameter>profile.separator</parameter>
+parameter.</para>
+
+<para>This parameter has effect only when you are using profiling
+stylesheets (<filename>profile-docbook.xsl</filename>,
+<filename>profile-chunk.xsl</filename>, &#8230;) instead of normal
+ones (<filename>docbook.xsl</filename>,
+<filename>chunk.xsl</filename>, &#8230;).</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="profile.revisionflag">
+<refmeta>
+<refentrytitle>profile.revisionflag</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>profile.revisionflag</refname>
+<refpurpose>Target profile for <tag class="attribute">revisionflag</tag>
+attribute</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="profile.revisionflag.frag">
+&lt;xsl:param name="profile.revisionflag"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The value of this parameter specifies profiles which should be
+included in the output. You can specify multiple profiles by
+separating them by semicolon. You can change separator character by
+<parameter>profile.separator</parameter>
+parameter.</para>
+
+<para>This parameter has effect only when you are using profiling
+stylesheets (<filename>profile-docbook.xsl</filename>,
+<filename>profile-chunk.xsl</filename>, &#8230;) instead of normal
+ones (<filename>docbook.xsl</filename>,
+<filename>chunk.xsl</filename>, &#8230;).</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="profile.role">
+<refmeta>
+<refentrytitle>profile.role</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>profile.role</refname>
+<refpurpose>Target profile for <tag class="attribute">role</tag>
+attribute</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="profile.role.frag">
+&lt;xsl:param name="profile.role"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The value of this parameter specifies profiles which should be
+included in the output. You can specify multiple profiles by
+separating them by semicolon. You can change separator character by
+<parameter>profile.separator</parameter>
+parameter.</para>
+
+<para>This parameter has effect only when you are using profiling
+stylesheets (<filename>profile-docbook.xsl</filename>,
+<filename>profile-chunk.xsl</filename>, &#8230;) instead of normal
+ones (<filename>docbook.xsl</filename>,
+<filename>chunk.xsl</filename>, &#8230;).</para>
+
+<warning>
+<para>Note that <tag class="attribute">role</tag> is often
+used for other purposes than profiling. For example it is commonly
+used to get emphasize in bold font:</para>
+
+<programlisting>&lt;emphasis role="bold"&gt;very important&lt;/emphasis&gt;</programlisting>
+
+<para>If you are using <tag class="attribute">role</tag> for
+these purposes do not forget to add values like <literal>bold</literal> to
+value of this parameter. If you forgot you will get document with
+small pieces missing which are very hard to track.</para>
+
+<para>For this reason it is not recommended to use <tag class="attribute">role</tag> attribute for profiling. You should
+rather use profiling specific attributes like <tag class="attribute">userlevel</tag>, <tag class="attribute">os</tag>, <tag class="attribute">arch</tag>, <tag class="attribute">condition</tag>, etc.</para>
+</warning>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="profile.security">
+<refmeta>
+<refentrytitle>profile.security</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>profile.security</refname>
+<refpurpose>Target profile for <tag class="attribute">security</tag>
+attribute</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="profile.security.frag">
+&lt;xsl:param name="profile.security"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The value of this parameter specifies profiles which should be
+included in the output. You can specify multiple profiles by
+separating them by semicolon. You can change separator character by
+<parameter>profile.separator</parameter>
+parameter.</para>
+
+<para>This parameter has effect only when you are using profiling
+stylesheets (<filename>profile-docbook.xsl</filename>,
+<filename>profile-chunk.xsl</filename>, &#8230;) instead of normal
+ones (<filename>docbook.xsl</filename>,
+<filename>chunk.xsl</filename>, &#8230;).</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="profile.status">
+<refmeta>
+<refentrytitle>profile.status</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>profile.status</refname>
+<refpurpose>Target profile for <tag class="attribute">status</tag>
+attribute</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="profile.status.frag">
+&lt;xsl:param name="profile.status"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The value of this parameter specifies profiles which should be
+included in the output. You can specify multiple profiles by
+separating them by semicolon. You can change separator character by
+<parameter>profile.separator</parameter>
+parameter.</para>
+
+<para>This parameter has effect only when you are using profiling
+stylesheets (<filename>profile-docbook.xsl</filename>,
+<filename>profile-chunk.xsl</filename>, &#8230;) instead of normal
+ones (<filename>docbook.xsl</filename>,
+<filename>chunk.xsl</filename>, &#8230;).</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="profile.userlevel">
+<refmeta>
+<refentrytitle>profile.userlevel</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>profile.userlevel</refname>
+<refpurpose>Target profile for <tag class="attribute">userlevel</tag>
+attribute</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="profile.userlevel.frag">
+&lt;xsl:param name="profile.userlevel"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The value of this parameter specifies profiles which should be
+included in the output. You can specify multiple profiles by
+separating them by semicolon. You can change separator character by
+<parameter>profile.separator</parameter>
+parameter.</para>
+
+<para>This parameter has effect only when you are using profiling
+stylesheets (<filename>profile-docbook.xsl</filename>,
+<filename>profile-chunk.xsl</filename>, &#8230;) instead of normal
+ones (<filename>docbook.xsl</filename>,
+<filename>chunk.xsl</filename>, &#8230;).</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="profile.vendor">
+<refmeta>
+<refentrytitle>profile.vendor</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>profile.vendor</refname>
+<refpurpose>Target profile for <tag class="attribute">vendor</tag>
+attribute</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="profile.vendor.frag">
+&lt;xsl:param name="profile.vendor"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The value of this parameter specifies profiles which should be
+included in the output. You can specify multiple profiles by
+separating them by semicolon. You can change separator character by
+<parameter>profile.separator</parameter>
+parameter.</para>
+
+<para>This parameter has effect only when you are using profiling
+stylesheets (<filename>profile-docbook.xsl</filename>,
+<filename>profile-chunk.xsl</filename>, &#8230;) instead of normal
+ones (<filename>docbook.xsl</filename>,
+<filename>chunk.xsl</filename>, &#8230;).</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="profile.wordsize">
+<refmeta>
+<refentrytitle>profile.wordsize</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>profile.wordsize</refname>
+<refpurpose>Target profile for <tag class="attribute">wordsize</tag>
+attribute</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="profile.wordsize.frag">
+&lt;xsl:param name="profile.wordsize"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The value of this parameter specifies profiles which should be
+included in the output. You can specify multiple profiles by
+separating them by semicolon. You can change separator character by
+<parameter>profile.separator</parameter>
+parameter.</para>
+
+<para>This parameter has effect only when you are using profiling
+stylesheets (<filename>profile-docbook.xsl</filename>,
+<filename>profile-chunk.xsl</filename>, &#8230;) instead of normal
+ones (<filename>docbook.xsl</filename>,
+<filename>chunk.xsl</filename>, &#8230;).</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="profile.attribute">
+<refmeta>
+<refentrytitle>profile.attribute</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>profile.attribute</refname>
+<refpurpose>Name of user-specified profiling attribute</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="profile.attribute.frag">
+&lt;xsl:param name="profile.attribute"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>This parameter is used in conjuction with
+<parameter>profile.value</parameter>.</para>
+
+<para>This parameter has effect only when you are using profiling
+stylesheets (<filename>profile-docbook.xsl</filename>,
+<filename>profile-chunk.xsl</filename>, &#8230;) instead of normal
+ones (<filename>docbook.xsl</filename>,
+<filename>chunk.xsl</filename>, &#8230;).</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="profile.value">
+<refmeta>
+<refentrytitle>profile.value</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>profile.value</refname>
+<refpurpose>Target profile for user-specified attribute</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="profile.value.frag">
+&lt;xsl:param name="profile.value"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>When you are using this parameter you must also specify name of
+profiling attribute with parameter
+<parameter>profile.attribute</parameter>.</para>
+
+<para>The value of this parameter specifies profiles which should be
+included in the output. You can specify multiple profiles by
+separating them by semicolon. You can change separator character by
+<parameter>profile.separator</parameter>
+parameter.</para>
+
+<para>This parameter has effect only when you are using profiling
+stylesheets (<filename>profile-docbook.xsl</filename>,
+<filename>profile-chunk.xsl</filename>, &#8230;) instead of normal
+ones (<filename>docbook.xsl</filename>,
+<filename>chunk.xsl</filename>, &#8230;).</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="profile.separator">
+<refmeta>
+<refentrytitle>profile.separator</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>profile.separator</refname>
+<refpurpose>Separator character for compound profile values</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="profile.separator.frag">
+&lt;xsl:param name="profile.separator"&gt;;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Separator character used for compound profile values. See <parameter>profile.arch</parameter></para>
+
+</refsection>
+</refentry>
+
+</reference><reference id="htmlhelp" xml:base="../html/param.xml"><title>HTML Help</title>
+<refentry version="5.0" id="htmlhelp.encoding">
+<refmeta>
+<refentrytitle>htmlhelp.encoding</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>htmlhelp.encoding</refname>
+<refpurpose>Character encoding to use in files for HTML Help compiler.</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="htmlhelp.encoding.frag">
+&lt;xsl:param name="htmlhelp.encoding"&gt;iso-8859-1&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>HTML Help Compiler is not UTF-8 aware, so you should always use an
+appropriate single-byte encoding here. Use one from <link xlink:href="ftp://ftp.isi.edu/in-notes/iana/assignments/character-sets">iana</link>, the registered charset values.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="htmlhelp.autolabel">
+<refmeta>
+<refentrytitle>htmlhelp.autolabel</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>htmlhelp.autolabel</refname>
+<refpurpose>Should tree-like ToC use autonumbering feature?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="htmlhelp.autolabel.frag">
+&lt;xsl:param name="htmlhelp.autolabel" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Set this to non-zero to include chapter and section numbers into ToC
+in the left panel.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="htmlhelp.chm">
+<refmeta>
+<refentrytitle>htmlhelp.chm</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>htmlhelp.chm</refname>
+<refpurpose>Filename of output HTML Help file.</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="htmlhelp.chm.frag">
+&lt;xsl:param name="htmlhelp.chm"&gt;htmlhelp.chm&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Set the name of resulting CHM file</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="htmlhelp.default.topic">
+<refmeta>
+<refentrytitle>htmlhelp.default.topic</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>htmlhelp.default.topic</refname>
+<refpurpose>Name of file with default topic</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="htmlhelp.default.topic.frag">
+&lt;xsl:param name="htmlhelp.default.topic"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Normally first chunk of document is displayed when you open HTML
+Help file. If you want to display another topic, simply set its
+filename by this parameter.</para>
+
+<para>This is useful especially if you don't generate ToC in front of
+your document and you also hide root element in ToC. E.g.:</para>
+
+<programlisting>&lt;xsl:param name="generate.book.toc" select="0"/&gt;
+&lt;xsl:param name="htmlhelp.hhc.show.root" select="0"/&gt;
+&lt;xsl:param name="htmlhelp.default.topic"&gt;pr01.html&lt;/xsl:param&gt;
+</programlisting>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="htmlhelp.display.progress">
+<refmeta>
+<refentrytitle>htmlhelp.display.progress</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>htmlhelp.display.progress</refname>
+<refpurpose>Display compile progress?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="htmlhelp.display.progress.frag">
+&lt;xsl:param name="htmlhelp.display.progress" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Set to non-zero to to display compile progress
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="htmlhelp.hhp">
+<refmeta>
+<refentrytitle>htmlhelp.hhp</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>htmlhelp.hhp</refname>
+<refpurpose>Filename of project file.</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="htmlhelp.hhp.frag">
+&lt;xsl:param name="htmlhelp.hhp"&gt;htmlhelp.hhp&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Change this parameter if you want different name of project
+file than htmlhelp.hhp.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="htmlhelp.hhc">
+<refmeta>
+<refentrytitle>htmlhelp.hhc</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>htmlhelp.hhc</refname>
+<refpurpose>Filename of TOC file.</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="htmlhelp.hhc.frag">
+&lt;xsl:param name="htmlhelp.hhc"&gt;toc.hhc&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Set the name of the TOC file. The default is <filename>toc.hhc</filename>.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="htmlhelp.hhk">
+<refmeta>
+<refentrytitle>htmlhelp.hhk</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>htmlhelp.hhk</refname>
+<refpurpose>Filename of index file.</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="htmlhelp.hhk.frag">
+&lt;xsl:param name="htmlhelp.hhk"&gt;index.hhk&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>set the name of the index file. The default is <filename>index.hhk</filename>.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="htmlhelp.hhp.tail">
+<refmeta>
+<refentrytitle>htmlhelp.hhp.tail</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>htmlhelp.hhp.tail</refname>
+<refpurpose>Additional content for project file.</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="htmlhelp.hhp.tail.frag">
+&lt;xsl:param name="htmlhelp.hhp.tail"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If you want to include some additional parameters into project file,
+store appropriate part of project file into this parameter.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="htmlhelp.hhp.window">
+<refmeta>
+<refentrytitle>htmlhelp.hhp.window</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>htmlhelp.hhp.window</refname>
+<refpurpose>Name of default window.</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="htmlhelp.hhp.window.frag">
+&lt;xsl:param name="htmlhelp.hhp.window"&gt;Main&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Name of default window. If empty no [WINDOWS] section will be
+added to project file.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="htmlhelp.hhp.windows">
+<refmeta>
+<refentrytitle>htmlhelp.hhp.windows</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>htmlhelp.hhp.windows</refname>
+<refpurpose>Definition of additional windows</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="htmlhelp.hhp.windows.frag">
+&lt;xsl:param name="htmlhelp.hhp.windows"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Content of this parameter is placed at the end of [WINDOWS]
+section of project file. You can use it for defining your own
+addtional windows.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="htmlhelp.enhanced.decompilation">
+<refmeta>
+<refentrytitle>htmlhelp.enhanced.decompilation</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>htmlhelp.enhanced.decompilation</refname>
+<refpurpose>Allow enhanced decompilation of CHM?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="htmlhelp.enhanced.decompilation.frag">
+&lt;xsl:param name="htmlhelp.enhanced.decompilation" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>When non-zero this parameter enables enhanced decompilation of CHM.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="htmlhelp.enumerate.images">
+<refmeta>
+<refentrytitle>htmlhelp.enumerate.images</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>htmlhelp.enumerate.images</refname>
+<refpurpose>Should the paths to all used images be added to the project file?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="htmlhelp.enumerate.images.frag">
+&lt;xsl:param name="htmlhelp.enumerate.images" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Set to non-zero if you insert images into your documents as
+external binary entities or if you are using absolute image paths.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="htmlhelp.force.map.and.alias">
+<refmeta>
+<refentrytitle>htmlhelp.force.map.and.alias</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>htmlhelp.force.map.and.alias</refname>
+<refpurpose>Should [MAP] and [ALIAS] sections be added to the project file unconditionally?</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+<programlisting id="htmlhelp.force.map.and.alias.frag">
+&lt;xsl:param name="htmlhelp.force.map.and.alias" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+ <para>Set to non-zero if you have your own
+ <literal>alias.h</literal> and <literal>context.h</literal>
+ files and you want to include references to them in the project
+ file.</para>
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="htmlhelp.map.file">
+<refmeta>
+<refentrytitle>htmlhelp.map.file</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>htmlhelp.map.file</refname>
+<refpurpose>Filename of map file.</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+<programlisting id="htmlhelp.map.file.frag">
+&lt;xsl:param name="htmlhelp.map.file"&gt;context.h&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+<para>Set the name of map file. The default is
+ <filename>context.h</filename>. (used for context-sensitive
+ help).</para>
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="htmlhelp.alias.file">
+<refmeta>
+<refentrytitle>htmlhelp.alias.file</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>htmlhelp.alias.file</refname>
+<refpurpose>Filename of alias file.</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="htmlhelp.alias.file.frag">
+&lt;xsl:param name="htmlhelp.alias.file"&gt;alias.h&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies the filename of the alias file (used for context-sensitive help).</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="htmlhelp.hhc.section.depth">
+<refmeta>
+<refentrytitle>htmlhelp.hhc.section.depth</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">integer</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>htmlhelp.hhc.section.depth</refname>
+<refpurpose>Depth of TOC for sections in a left pane.</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="htmlhelp.hhc.section.depth.frag">
+&lt;xsl:param name="htmlhelp.hhc.section.depth"&gt;5&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Set the section depth in the left pane of HTML Help viewer. </para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="htmlhelp.hhc.show.root">
+<refmeta>
+<refentrytitle>htmlhelp.hhc.show.root</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>htmlhelp.hhc.show.root</refname>
+<refpurpose>Should there be an entry for the root element in the ToC?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="htmlhelp.hhc.show.root.frag">
+&lt;xsl:param name="htmlhelp.hhc.show.root" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If set to zero, there will be no entry for the root element in the
+ToC. This is useful when you want to provide the user with an expanded
+ToC as a default.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="htmlhelp.hhc.folders.instead.books">
+<refmeta>
+<refentrytitle>htmlhelp.hhc.folders.instead.books</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>htmlhelp.hhc.folders.instead.books</refname>
+<refpurpose>Use folder icons in ToC (instead of book icons)?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="htmlhelp.hhc.folders.instead.books.frag">
+&lt;xsl:param name="htmlhelp.hhc.folders.instead.books" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Set to non-zero for folder-like icons or zero for book-like icons in the ToC.
+If you want to use folder-like icons, you must switch off the binary ToC using
+<parameter>htmlhelp.hhc.binary</parameter>.
+
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="htmlhelp.hhc.binary">
+<refmeta>
+<refentrytitle>htmlhelp.hhc.binary</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>htmlhelp.hhc.binary</refname>
+<refpurpose>Generate binary ToC?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="htmlhelp.hhc.binary.frag">
+&lt;xsl:param name="htmlhelp.hhc.binary" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Set to non-zero to generate a binary TOC. You must create a binary TOC
+if you want to add Prev/Next buttons to toolbar (which is default
+behaviour). Files with binary TOC can't be merged.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="htmlhelp.hhc.width">
+<refmeta>
+<refentrytitle>htmlhelp.hhc.width</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">integer</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>htmlhelp.hhc.width</refname>
+<refpurpose>Width of navigation pane</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="htmlhelp.hhc.width.frag">
+&lt;xsl:param name="htmlhelp.hhc.width"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>This parameter specifies the width of the navigation pane (containing TOC and
+other navigation tabs) in pixels.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="htmlhelp.title">
+<refmeta>
+<refentrytitle>htmlhelp.title</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>htmlhelp.title</refname>
+<refpurpose>Title of HTML Help</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="htmlhelp.title.frag">
+&lt;xsl:param name="htmlhelp.title"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Content of this parameter will be used as a title for generated
+HTML Help. If empty, title will be automatically taken from document.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="htmlhelp.show.menu">
+<refmeta>
+<refentrytitle>htmlhelp.show.menu</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>htmlhelp.show.menu</refname>
+<refpurpose>Should the menu bar be shown?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="htmlhelp.show.menu.frag">
+&lt;xsl:param name="htmlhelp.show.menu" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Set to non-zero to have an application menu bar in your HTML Help window.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="htmlhelp.show.toolbar.text">
+<refmeta>
+<refentrytitle>htmlhelp.show.toolbar.text</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>htmlhelp.show.toolbar.text</refname>
+<refpurpose>Show text under toolbar buttons?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="htmlhelp.show.toolbar.text.frag">
+&lt;xsl:param name="htmlhelp.show.toolbar.text" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Set to non-zero to display texts under toolbar buttons, zero to switch
+off displays.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="htmlhelp.show.advanced.search">
+<refmeta>
+<refentrytitle>htmlhelp.show.advanced.search</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>htmlhelp.show.advanced.search</refname>
+<refpurpose>Should advanced search features be available?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="htmlhelp.show.advanced.search.frag">
+&lt;xsl:param name="htmlhelp.show.advanced.search" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If you want advanced search features in your help, turn this
+parameter to 1.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="htmlhelp.show.favorities">
+<refmeta>
+<refentrytitle>htmlhelp.show.favorities</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>htmlhelp.show.favorities</refname>
+<refpurpose>Should the Favorites tab be shown?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="htmlhelp.show.favorities.frag">
+&lt;xsl:param name="htmlhelp.show.favorities" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Set to non-zero to include a Favorites tab in the navigation pane
+of the help window.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="htmlhelp.button.hideshow">
+<refmeta>
+<refentrytitle>htmlhelp.button.hideshow</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>htmlhelp.button.hideshow</refname>
+<refpurpose>Should the Hide/Show button be shown?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="htmlhelp.button.hideshow.frag">
+&lt;xsl:param name="htmlhelp.button.hideshow" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Set to non-zero to include the Hide/Show button shown on toolbar</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="htmlhelp.button.back">
+<refmeta>
+<refentrytitle>htmlhelp.button.back</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>htmlhelp.button.back</refname>
+<refpurpose>Should the Back button be shown?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="htmlhelp.button.back.frag">
+&lt;xsl:param name="htmlhelp.button.back" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Set to non-zero to include the Hide/Show button shown on toolbar</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="htmlhelp.button.forward">
+<refmeta>
+<refentrytitle>htmlhelp.button.forward</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>htmlhelp.button.forward</refname>
+<refpurpose>Should the Forward button be shown?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="htmlhelp.button.forward.frag">
+&lt;xsl:param name="htmlhelp.button.forward" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Set to non-zero to include the Forward button on the toolbar.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="htmlhelp.button.stop">
+<refmeta>
+<refentrytitle>htmlhelp.button.stop</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>htmlhelp.button.stop</refname>
+<refpurpose>Should the Stop button be shown?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="htmlhelp.button.stop.frag">
+&lt;xsl:param name="htmlhelp.button.stop" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If you want Stop button shown on toolbar, turn this
+parameter to 1.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="htmlhelp.button.refresh">
+<refmeta>
+<refentrytitle>htmlhelp.button.refresh</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>htmlhelp.button.refresh</refname>
+<refpurpose>Should the Refresh button be shown?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="htmlhelp.button.refresh.frag">
+&lt;xsl:param name="htmlhelp.button.refresh" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Set to non-zero to include the Stop button on the toolbar.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="htmlhelp.button.home">
+<refmeta>
+<refentrytitle>htmlhelp.button.home</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>htmlhelp.button.home</refname>
+<refpurpose>Should the Home button be shown?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="htmlhelp.button.home.frag">
+&lt;xsl:param name="htmlhelp.button.home" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Set to non-zero to include the Home button on the toolbar.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="htmlhelp.button.home.url">
+<refmeta>
+<refentrytitle>htmlhelp.button.home.url</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>htmlhelp.button.home.url</refname>
+<refpurpose>URL address of page accessible by Home button</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="htmlhelp.button.home.url.frag">
+&lt;xsl:param name="htmlhelp.button.home.url"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>URL address of page accessible by Home button.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="htmlhelp.button.options">
+<refmeta>
+<refentrytitle>htmlhelp.button.options</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>htmlhelp.button.options</refname>
+<refpurpose>Should the Options button be shown?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="htmlhelp.button.options.frag">
+&lt;xsl:param name="htmlhelp.button.options" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If you want Options button shown on toolbar, turn this
+parameter to 1.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="htmlhelp.button.print">
+<refmeta>
+<refentrytitle>htmlhelp.button.print</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>htmlhelp.button.print</refname>
+<refpurpose>Should the Print button be shown?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="htmlhelp.button.print.frag">
+&lt;xsl:param name="htmlhelp.button.print" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Set to non-zero to include the Print button on the toolbar.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="htmlhelp.button.locate">
+<refmeta>
+<refentrytitle>htmlhelp.button.locate</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>htmlhelp.button.locate</refname>
+<refpurpose>Should the Locate button be shown?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="htmlhelp.button.locate.frag">
+&lt;xsl:param name="htmlhelp.button.locate" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If you want Locate button shown on toolbar, turn this
+parameter to 1.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="htmlhelp.button.jump1">
+<refmeta>
+<refentrytitle>htmlhelp.button.jump1</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>htmlhelp.button.jump1</refname>
+<refpurpose>Should the Jump1 button be shown?</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+<programlisting id="htmlhelp.button.jump1.frag">
+&lt;xsl:param name="htmlhelp.button.jump1" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+ <para>Set to non-zero to include the <literal>Jump1</literal> button on the toolbar.</para>
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="htmlhelp.button.jump1.url">
+<refmeta>
+<refentrytitle>htmlhelp.button.jump1.url</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>htmlhelp.button.jump1.url</refname>
+<refpurpose>URL address of page accessible by Jump1 button</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="htmlhelp.button.jump1.url.frag">
+&lt;xsl:param name="htmlhelp.button.jump1.url"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>URL address of page accessible by Jump1 button.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="htmlhelp.button.jump1.title">
+<refmeta>
+<refentrytitle>htmlhelp.button.jump1.title</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>htmlhelp.button.jump1.title</refname>
+<refpurpose>Title of Jump1 button</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="htmlhelp.button.jump1.title.frag">
+&lt;xsl:param name="htmlhelp.button.jump1.title"&gt;User1&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Title of Jump1 button.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="htmlhelp.button.jump2">
+<refmeta>
+<refentrytitle>htmlhelp.button.jump2</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>htmlhelp.button.jump2</refname>
+<refpurpose>Should the Jump2 button be shown?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="htmlhelp.button.jump2.frag">
+&lt;xsl:param name="htmlhelp.button.jump2" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Set to non-zero to include the Jump2 button on the toolbar.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="htmlhelp.button.jump2.url">
+<refmeta>
+<refentrytitle>htmlhelp.button.jump2.url</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>htmlhelp.button.jump2.url</refname>
+<refpurpose>URL address of page accessible by Jump2 button</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="htmlhelp.button.jump2.url.frag">
+&lt;xsl:param name="htmlhelp.button.jump2.url"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>URL address of page accessible by Jump2 button.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="htmlhelp.button.jump2.title">
+<refmeta>
+<refentrytitle>htmlhelp.button.jump2.title</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>htmlhelp.button.jump2.title</refname>
+<refpurpose>Title of Jump2 button</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="htmlhelp.button.jump2.title.frag">
+&lt;xsl:param name="htmlhelp.button.jump2.title"&gt;User2&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Title of Jump2 button.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="htmlhelp.button.next">
+<refmeta>
+<refentrytitle>htmlhelp.button.next</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>htmlhelp.button.next</refname>
+<refpurpose>Should the Next button be shown?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="htmlhelp.button.next.frag">
+&lt;xsl:param name="htmlhelp.button.next" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Set to non-zero to include the Next button on the toolbar.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="htmlhelp.button.prev">
+<refmeta>
+<refentrytitle>htmlhelp.button.prev</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>htmlhelp.button.prev</refname>
+<refpurpose>Should the Prev button be shown?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="htmlhelp.button.prev.frag">
+&lt;xsl:param name="htmlhelp.button.prev" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Set to non-zero to include the Prev button on the toolbar.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="htmlhelp.button.zoom">
+<refmeta>
+<refentrytitle>htmlhelp.button.zoom</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>htmlhelp.button.zoom</refname>
+<refpurpose>Should the Zoom button be shown?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="htmlhelp.button.zoom.frag">
+&lt;xsl:param name="htmlhelp.button.zoom" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Set to non-zero to include the Zoom button on the toolbar.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="htmlhelp.remember.window.position">
+<refmeta>
+<refentrytitle>htmlhelp.remember.window.position</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>htmlhelp.remember.window.position</refname>
+<refpurpose>Remember help window position?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="htmlhelp.remember.window.position.frag">
+&lt;xsl:param name="htmlhelp.remember.window.position" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Set to non-zero to remember help window position between starts.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="htmlhelp.window.geometry">
+<refmeta>
+<refentrytitle>htmlhelp.window.geometry</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>htmlhelp.window.geometry</refname>
+<refpurpose>Set initial geometry of help window</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="htmlhelp.window.geometry.frag">
+&lt;xsl:param name="htmlhelp.window.geometry"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>This parameter specifies initial position of help
+window. E.g.</para>
+
+<programlisting>&lt;xsl:param name="htmlhelp.window.geometry"&gt;[160,64,992,704]&lt;/xsl:param&gt;</programlisting>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="htmlhelp.use.hhk">
+<refmeta>
+<refentrytitle>htmlhelp.use.hhk</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>htmlhelp.use.hhk</refname>
+<refpurpose>Should the index be built using the HHK file?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="htmlhelp.use.hhk.frag">
+&lt;xsl:param name="htmlhelp.use.hhk" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, the index is created using the HHK file (instead of using <tag role="html">object</tag>
+elements in the HTML files). For more information, see <link role="tcg" xlink:href="HtmlHelp.html#HHGenIndex">Generating an index</link>.</para>
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="htmlhelp.only">
+<refmeta>
+<refentrytitle>htmlhelp.only</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>htmlhelp.only</refname>
+<refpurpose>Should only project files be generated?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="htmlhelp.only.frag">
+&lt;xsl:param name="htmlhelp.only" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+
+<para>Set to non-zero if you want to play with various HTML Help parameters
+and you don't need to regenerate all HTML files. This setting will not
+process whole document, only project files (hhp, hhc, hhk,...) will be
+generated.</para>
+
+
+</refsection>
+</refentry>
+
+</reference><reference id="eclipse_help" xml:base="../html/param.xml"><title>Eclipse Help Platform</title>
+<refentry version="5.0" id="eclipse.autolabel">
+<refmeta>
+<refentrytitle>eclipse.autolabel</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>eclipse.autolabel</refname>
+<refpurpose>Should tree-like ToC use autonumbering feature?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="eclipse.autolabel.frag">
+&lt;xsl:param name="eclipse.autolabel" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If you want to include chapter and section numbers into ToC in
+the left panel, set this parameter to 1.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="eclipse.plugin.name">
+<refmeta>
+<refentrytitle>eclipse.plugin.name</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>eclipse.plugin.name</refname>
+<refpurpose>Eclipse Help plugin name</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="eclipse.plugin.name.frag">
+&lt;xsl:param name="eclipse.plugin.name"&gt;DocBook Online Help Sample&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Eclipse Help plugin name.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="eclipse.plugin.id">
+<refmeta>
+<refentrytitle>eclipse.plugin.id</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>eclipse.plugin.id</refname>
+<refpurpose>Eclipse Help plugin id</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="eclipse.plugin.id.frag">
+&lt;xsl:param name="eclipse.plugin.id"&gt;com.example.help&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Eclipse Help plugin id. You should change this id to something
+unique for each help.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="eclipse.plugin.provider">
+<refmeta>
+<refentrytitle>eclipse.plugin.provider</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>eclipse.plugin.provider</refname>
+<refpurpose>Eclipse Help plugin provider name</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="eclipse.plugin.provider.frag">
+&lt;xsl:param name="eclipse.plugin.provider"&gt;Example provider&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Eclipse Help plugin provider name.</para>
+
+</refsection>
+</refentry>
+
+</reference><reference id="javahelp" xml:base="../html/param.xml"><title>JavaHelp</title>
+<refentry version="5.0" id="javahelp.encoding">
+<refmeta>
+<refentrytitle>javahelp.encoding</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>javahelp.encoding</refname>
+<refpurpose>Character encoding to use in control files for JavaHelp.</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="javahelp.encoding.frag">
+&lt;xsl:param name="javahelp.encoding"&gt;iso-8859-1&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>JavaHelp crashes on some characters when written as character
+references. In that case you can use this parameter to select an appropriate encoding.</para>
+
+</refsection>
+</refentry>
+
+
+
+
+</reference><reference id="l10n" xml:base="../html/param.xml"><title>Localization</title>
+<refentry version="5.0" id="l10n.gentext.language">
+<refmeta>
+<refentrytitle>l10n.gentext.language</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>l10n.gentext.language</refname>
+<refpurpose>Sets the gentext language</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="l10n.gentext.language.frag">
+&lt;xsl:param name="l10n.gentext.language"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If this parameter is set to any value other than the empty string, its
+value will be used as the value for the language when generating text. Setting
+<parameter>l10n.gentext.language</parameter> overrides any settings within the
+document being formatted.</para>
+
+<para>It's much more likely that you might want to set the
+<parameter>l10n.gentext.default.language</parameter> parameter.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="l10n.gentext.default.language">
+ <refmeta>
+ <refentrytitle>l10n.gentext.default.language</refentrytitle>
+ <refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+ </refmeta>
+ <refnamediv>
+ <refname>l10n.gentext.default.language</refname>
+ <refpurpose>Sets the default language for generated text</refpurpose>
+ </refnamediv>
+
+ <refsynopsisdiv>
+<programlisting id="l10n.gentext.default.language.frag">
+&lt;xsl:param name="l10n.gentext.default.language"&gt;en&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The value of the <parameter>l10n.gentext.default.language</parameter>
+parameter is used as the language for generated text if no setting is provided
+in the source document.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="l10n.gentext.use.xref.language">
+<refmeta>
+<refentrytitle>l10n.gentext.use.xref.language</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>l10n.gentext.use.xref.language</refname>
+<refpurpose>Use the language of target when generating cross-reference text?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="l10n.gentext.use.xref.language.frag">
+&lt;xsl:param name="l10n.gentext.use.xref.language" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, the language of the target will be used when
+generating cross reference text. Usually, the <quote>current</quote>
+language is used when generating text (that is, the language of the
+element that contains the cross-reference element). But setting this parameter
+allows the language of the element <emphasis>pointed to</emphasis> to control
+the generated text.</para>
+
+<para>Consider the following example:</para>
+
+<informalexample>
+<programlisting>&lt;para lang="en"&gt;See also &lt;xref linkend="chap3"/&gt;.&lt;/para&gt;
+</programlisting>
+</informalexample>
+
+<para>Suppose that Chapter 3 happens to be written in German.
+If <parameter>l10n.gentext.use.xref.language</parameter> is non-zero, the
+resulting text will be something like this:</para>
+
+<blockquote>
+<para>See also Kapital 3.</para>
+</blockquote>
+
+<para>Where the more traditional rendering would be:</para>
+
+<blockquote>
+<para>See also Chapter 3.</para>
+</blockquote>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="l10n.lang.value.rfc.compliant">
+<refmeta>
+<refentrytitle>l10n.lang.value.rfc.compliant</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>l10n.lang.value.rfc.compliant</refname>
+<refpurpose>Make value of lang attribute RFC compliant?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="l10n.lang.value.rfc.compliant.frag">
+&lt;xsl:param name="l10n.lang.value.rfc.compliant" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, ensure that the values for all <tag class="attribute">lang</tag> attributes in HTML output are RFC
+compliant<footnote><para>Section 8.1.1, <link xlink:href="http://www.w3.org/TR/REC-html40/struct/dirlang.html#h-8.1.1">Language Codes</link>, in the HTML 4.0 Recommendation states that:
+
+<blockquote><para>[RFC1766] defines and explains the language codes
+that must be used in HTML documents.</para>
+<para>Briefly, language codes consist of a primary code and a possibly
+empty series of subcodes:
+
+<literallayout class="monospaced">language-code = primary-code ( "-" subcode )*</literallayout>
+</para>
+<para>And in RFC 1766, <link xlink:href="http://www.ietf.org/rfc/rfc1766.txt">Tags for the Identification
+of Languages</link>, the EBNF for "language tag" is given as:
+
+<literallayout class="monospaced">Language-Tag = Primary-tag *( "-" Subtag )
+Primary-tag = 1*8ALPHA
+Subtag = 1*8ALPHA</literallayout>
+</para>
+</blockquote>
+</para></footnote>.
+
+by taking any underscore characters in any <tag class="attribute">lang</tag> values found in source documents, and
+replacing them with hyphen characters in output HTML files. For
+example, <literal>zh_CN</literal> in a source document becomes
+<literal>zh-CN</literal> in the HTML output form that source.
+
+<note>
+<para>This parameter does not cause any case change in <tag class="attribute">lang</tag> values, because RFC 1766
+explicitly states that all "language tags" (as it calls them) "are
+to be treated as case insensitive".</para>
+</note>
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="writing.mode">
+<refmeta>
+<refentrytitle>writing.mode</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>writing.mode</refname>
+<refpurpose>Direction of text flow based on locale</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="writing.mode.frag">
+&lt;xsl:param name="writing.mode"&gt;
+ &lt;xsl:call-template name="gentext"&gt;
+ &lt;xsl:with-param name="key"&gt;writing-mode&lt;/xsl:with-param&gt;
+ &lt;xsl:with-param name="lang"&gt;
+ &lt;xsl:call-template name="l10n.language"&gt;
+ &lt;xsl:with-param name="target" select="/*[1]"&gt;&lt;/xsl:with-param&gt;
+ &lt;/xsl:call-template&gt;
+ &lt;/xsl:with-param&gt;
+ &lt;/xsl:call-template&gt;
+&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Sets direction of text flow and text alignment based on locale.
+The value is normally taken from the gentext file for the
+lang attribute of the document's root element, using the
+key name 'writing-mode' to look it up in the gentext file.
+But the param can also be
+set on the command line to override that gentext value.
+</para>
+<para>Accepted values are:
+<variablelist>
+ <varlistentry>
+ <term>lr-tb</term>
+ <listitem>
+ <para>Left-to-right text flow in each line, lines stack top to bottom.</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>rl-tb</term>
+ <listitem>
+ <para>Right-to-left text flow in each line, lines stack top to bottom.</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>tb-rl</term>
+ <listitem>
+ <para>Top-to-bottom text flow in each vertical line, lines stack right to left.
+ Supported by only a few XSL-FO processors. Not supported in HTML output.</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>lr</term>
+ <listitem>
+ <para>Shorthand for lr-tb.</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>rl</term>
+ <listitem>
+ <para>Shorthand for rl-tb.</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>tb</term>
+ <listitem>
+ <para>Shorthand for tb-rl.</para>
+ </listitem>
+ </varlistentry>
+</variablelist>
+</para>
+
+</refsection>
+</refentry>
+
+</reference>
+ </part>
+ <part id="fo">
+ <?dbhtml dir="fo"?>
+ <?dbhtml filename="index.html"?>
+ <title xml:base="../fo/param.xml">FO Parameter Reference</title>
+ <partintro id="fointro">
+
+ <para xml:base="../fo/param.xml">This is reference documentation for all user-configurable
+ parameters in the DocBook XSL FO stylesheets (for generating
+ XSL-FO output destined for final print/PDF output).</para>
+
+ </partintro>
+ <reference id="admons" xml:base="../fo/param.xml"><title>Admonitions</title>
+<refentry version="5.0" id="admon.graphics">
+<refmeta>
+<refentrytitle>admon.graphics</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>admon.graphics</refname>
+<refpurpose>Use graphics in admonitions?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="admon.graphics.frag">
+&lt;xsl:param name="admon.graphics" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If true (non-zero), admonitions are presented in an alternate style that uses
+a graphic. Default graphics are provided in the distribution.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="admon.graphics.extension">
+<refmeta>
+<refentrytitle>admon.graphics.extension</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>admon.graphics.extension</refname>
+<refpurpose>Filename extension for admonition graphics</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="admon.graphics.extension.frag">
+&lt;xsl:param name="admon.graphics.extension"&gt;.png&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Sets the filename extension to use on admonition graphics.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="admon.graphics.path">
+<refmeta>
+<refentrytitle>admon.graphics.path</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>admon.graphics.path</refname>
+<refpurpose>Path to admonition graphics</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="admon.graphics.path.frag">&lt;xsl:param name="admon.graphics.path"&gt;images/&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Sets the path to the directory containing the admonition graphics
+(caution.png, important.png etc). This location is normally relative
+to the output html directory. See <parameter>base.dir</parameter></para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="admon.textlabel">
+<refmeta>
+<refentrytitle>admon.textlabel</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>admon.textlabel</refname>
+<refpurpose>Use text label in admonitions?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="admon.textlabel.frag">
+&lt;xsl:param name="admon.textlabel" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If true (non-zero), admonitions are presented with a generated
+text label such as Note or Warning in the appropriate language.
+If zero, such labels are turned off, but any title child
+of the admonition element are still output.
+The default value is 1.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="admonition.title.properties">
+
+<refmeta>
+ <refentrytitle>admonition.title.properties</refentrytitle>
+ <refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>admonition.title.properties</refname>
+<refpurpose>To set the style for admonitions titles.</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="admonition.title.properties.frag">
+&lt;xsl:attribute-set name="admonition.title.properties"&gt;
+ &lt;xsl:attribute name="font-size"&gt;14pt&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="font-weight"&gt;bold&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="hyphenate"&gt;false&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="keep-with-next.within-column"&gt;always&lt;/xsl:attribute&gt;
+&lt;/xsl:attribute-set&gt;
+</programlisting>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+<para>How do you want admonitions titles styled? </para>
+<para>Set the font-size, weight etc to the style required.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="admonition.properties">
+<refmeta>
+ <refentrytitle>admonition.properties</refentrytitle>
+ <refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>admonition.properties</refname>
+<refpurpose>To set the style for admonitions.</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="admonition.properties.frag">&lt;xsl:attribute-set name="admonition.properties"&gt;&lt;/xsl:attribute-set&gt;
+</programlisting>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+<para>How do you want admonitions styled? </para>
+<para>Set the font-size, weight, etc. to the style required</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="graphical.admonition.properties">
+<refmeta>
+<refentrytitle>graphical.admonition.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>graphical.admonition.properties</refname>
+<refpurpose>To add properties to the outer block of a graphical admonition.</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="graphical.admonition.properties.frag">&lt;xsl:attribute-set name="graphical.admonition.properties"&gt;
+ &lt;xsl:attribute name="space-before.optimum"&gt;1em&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="space-before.minimum"&gt;0.8em&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="space-before.maximum"&gt;1.2em&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="space-after.optimum"&gt;1em&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="space-after.minimum"&gt;0.8em&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="space-after.maximum"&gt;1.2em&lt;/xsl:attribute&gt;
+&lt;/xsl:attribute-set&gt;
+</programlisting>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+<para>These properties are added to the outer block containing the
+entire graphical admonition, including its title.
+It is used when the parameter
+<parameter>admon.graphics</parameter> is set to nonzero.
+Use this attribute-set to set the space above and below,
+and any indent for the whole admonition.</para>
+
+<para>In addition to these properties, a graphical admonition
+also applies the <parameter>admonition.title.properties</parameter>
+attribute-set to the title, and applies the
+<parameter>admonition.properties</parameter> attribute-set
+to the rest of the content.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="nongraphical.admonition.properties">
+<refmeta>
+<refentrytitle>nongraphical.admonition.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>nongraphical.admonition.properties</refname>
+<refpurpose>To add properties to the outer block of a nongraphical admonition.</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="nongraphical.admonition.properties.frag">&lt;xsl:attribute-set name="nongraphical.admonition.properties"&gt;
+ &lt;xsl:attribute name="space-before.minimum"&gt;0.8em&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="space-before.optimum"&gt;1em&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="space-before.maximum"&gt;1.2em&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="margin-{$direction.align.start}"&gt;0.25in&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="margin-{$direction.align.end}"&gt;0.25in&lt;/xsl:attribute&gt;
+&lt;/xsl:attribute-set&gt;
+</programlisting>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+<para>These properties are added to the outer block containing the
+entire nongraphical admonition, including its title.
+It is used when the parameter
+<parameter>admon.graphics</parameter> is set to zero.
+Use this attribute-set to set the space above and below,
+and any indent for the whole admonition.</para>
+
+<para>In addition to these properties, a nongraphical admonition
+also applies the <parameter>admonition.title.properties</parameter>
+attribute-set to the title, and the
+<parameter>admonition.properties</parameter> attribute-set
+to the rest of the content.</para>
+
+</refsection>
+</refentry>
+
+</reference><reference id="callouts" xml:base="../fo/param.xml"><title>Callouts</title>
+<refentry version="5.0" id="callout.defaultcolumn">
+<refmeta>
+<refentrytitle>callout.defaultcolumn</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">integer</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>callout.defaultcolumn</refname>
+<refpurpose>Indicates what column callouts appear in by default</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="callout.defaultcolumn.frag">
+&lt;xsl:param name="callout.defaultcolumn"&gt;60&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If a callout does not identify a column (for example, if it uses
+the <literal>linerange</literal> <tag class="attribute">unit</tag>),
+it will appear in the default column.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="callout.graphics">
+<refmeta>
+<refentrytitle>callout.graphics</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>callout.graphics</refname>
+<refpurpose>Use graphics for callouts?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="callout.graphics.frag">
+&lt;xsl:param name="callout.graphics" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, callouts are presented with graphics (e.g., reverse-video
+circled numbers instead of "(1)", "(2)", etc.).
+Default graphics are provided in the distribution.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="callout.graphics.extension">
+<refmeta>
+<refentrytitle>callout.graphics.extension</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>callout.graphics.extension</refname>
+<refpurpose>Filename extension for callout graphics</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="callout.graphics.extension.frag">
+
+&lt;xsl:param name="callout.graphics.extension"&gt;.svg&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+<para>Sets the filename extension to use on callout graphics. </para>
+
+<itemizedlist>
+<para>The Docbook XSL distribution provides callout graphics in the following formats:</para>
+<listitem><para>SVG (extension: <filename class="extension">.svg</filename>)</para></listitem>
+<listitem><para>PNG (extension: <filename class="extension">.png</filename>)</para></listitem>
+<listitem><para>GIF (extension: <filename class="extension">.gif</filename>)</para></listitem>
+</itemizedlist>
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="callout.graphics.number.limit">
+<refmeta>
+<refentrytitle>callout.graphics.number.limit</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">integer</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>callout.graphics.number.limit</refname>
+<refpurpose>Number of the largest callout graphic</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="callout.graphics.number.limit.frag">
+
+&lt;xsl:param name="callout.graphics.number.limit"&gt;30&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If <parameter>callout.graphics</parameter> is non-zero, graphics
+are used to represent callout numbers instead of plain text. The value
+of <parameter>callout.graphics.number.limit</parameter> is the largest
+number for which a graphic exists. If the callout number exceeds this
+limit, the default presentation "(plain text instead of a graphic)"
+will be used.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="callout.graphics.path">
+<refmeta>
+<refentrytitle>callout.graphics.path</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>callout.graphics.path</refname>
+<refpurpose>Path to callout graphics</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="callout.graphics.path.frag">
+&lt;xsl:param name="callout.graphics.path"&gt;images/callouts/&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Sets the path to the directory holding the callout graphics. his
+location is normally relative to the output html directory. see
+base.dir. Always terminate the directory with / since the graphic file
+is appended to this string, hence needs the separator.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="callout.icon.size">
+<refmeta>
+<refentrytitle>callout.icon.size</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">length</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>callout.icon.size</refname>
+<refpurpose>Specifies the size of callout marker icons</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="callout.icon.size.frag">
+&lt;xsl:param name="callout.icon.size"&gt;7pt&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies the size of the callout marker icons.
+The default size is 7 points.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="callout.unicode">
+<refmeta>
+<refentrytitle>callout.unicode</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>callout.unicode</refname>
+<refpurpose>Use Unicode characters rather than images for callouts.</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="callout.unicode.frag">&lt;xsl:param name="callout.unicode" select="0"&gt;&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The stylesheets can use either an image of the numbers one to ten, or the single Unicode character which represents the numeral, in white on a black background. Use this to select the Unicode character option.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="callout.unicode.font">
+<refmeta>
+<refentrytitle>callout.unicode.font</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>callout.unicode.font</refname>
+<refpurpose>Specify a font for Unicode glyphs</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="callout.unicode.font.frag">
+&lt;xsl:param name="callout.unicode.font"&gt;ZapfDingbats&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The name of the font to specify around Unicode callout glyphs.
+If set to the empty string, no font change will occur.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="callout.unicode.number.limit">
+<refmeta>
+<refentrytitle>callout.unicode.number.limit</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">integer</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>callout.unicode.number.limit</refname>
+<refpurpose>Number of the largest unicode callout character</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="callout.unicode.number.limit.frag">
+&lt;xsl:param name="callout.unicode.number.limit"&gt;10&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If <parameter>callout.unicode</parameter>
+is non-zero, unicode characters are used to represent
+callout numbers. The value of
+<parameter>callout.unicode.number.limit</parameter>
+is
+the largest number for which a unicode character exists. If the callout number
+exceeds this limit, the default presentation "(nnn)" will always
+be used.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="callout.unicode.start.character">
+<refmeta>
+<refentrytitle>callout.unicode.start.character</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">integer</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>callout.unicode.start.character</refname>
+<refpurpose>First Unicode character to use, decimal value.</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="callout.unicode.start.character.frag">
+&lt;xsl:param name="callout.unicode.start.character"&gt;10102&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If <parameter>callout.graphics</parameter> is zero and <parameter>callout.unicode</parameter>
+is non-zero, unicode characters are used to represent
+callout numbers. The value of
+<parameter>callout.unicode.start.character</parameter>
+is the decimal unicode value used for callout number one. Currently,
+only 10102 is supported in the stylesheets for this parameter.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="callouts.extension">
+<refmeta>
+<refentrytitle>callouts.extension</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>callouts.extension</refname>
+<refpurpose>Enable the callout extension</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="callouts.extension.frag">
+&lt;xsl:param name="callouts.extension" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The callouts extension processes <tag>areaset</tag>
+elements in <tag>programlistingco</tag> and other text-based
+callout elements.
+</para>
+
+</refsection>
+</refentry>
+
+</reference><reference id="toc_index" xml:base="../fo/param.xml"><title>ToC/LoT/Index Generation</title>
+<refentry version="5.0" id="autotoc.label.separator">
+<refmeta>
+<refentrytitle>autotoc.label.separator</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>autotoc.label.separator</refname>
+<refpurpose>Separator between labels and titles in the ToC</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="autotoc.label.separator.frag">
+&lt;xsl:param name="autotoc.label.separator"&gt;. &lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>String used to separate labels and titles in a table of contents.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="process.empty.source.toc">
+<refmeta>
+<refentrytitle>process.empty.source.toc</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>process.empty.source.toc</refname>
+<refpurpose>Generate automated TOC if <tag>toc</tag> element occurs in a source document?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="process.empty.source.toc.frag">&lt;xsl:param name="process.empty.source.toc" select="0"&gt;&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies that if an empty <tag>toc</tag> element is found in a
+source document, an automated TOC is generated at this point in the
+document.
+<note>
+ <para>Depending on what the value of the
+ <parameter>generate.toc</parameter> parameter is, setting this
+ parameter to <literal>1</literal> could result in generation of
+ duplicate automated TOCs. So the
+ <parameter>process.empty.source.toc</parameter> is primarily useful
+ as an "override": by placing an empty <tag>toc</tag> in your
+ document and setting this parameter to <literal>1</literal>, you can
+ force a TOC to be generated even if <tag>generate.toc</tag>
+ says not to.</para>
+</note>
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="process.source.toc">
+<refmeta>
+<refentrytitle>process.source.toc</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>process.source.toc</refname>
+<refpurpose>Process a non-empty <tag>toc</tag> element if it occurs in a source document?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="process.source.toc.frag">&lt;xsl:param name="process.source.toc" select="0"&gt;&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies that the contents of a non-empty "hard-coded"
+<tag>toc</tag> element in a source document are processed to
+generate a TOC in output.
+<note>
+ <para>This parameter has no effect on automated generation of
+ TOCs. An automated TOC may still be generated along with the
+ "hard-coded" TOC. To suppress automated TOC generation, adjust the
+ value of the <parameter>generate.toc</parameter> paramameter.</para>
+
+ <para>The <tag>process.source.toc</tag> parameter also has
+ no effect if the <tag>toc</tag> element is empty; handling
+ for empty <tag>toc</tag> is controlled by the
+ <parameter>process.empty.source.toc</parameter> parameter.</para>
+</note>
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="generate.toc">
+<refmeta>
+<refentrytitle>generate.toc</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">table</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>generate.toc</refname>
+<refpurpose>Control generation of ToCs and LoTs</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="generate.toc.frag">
+
+&lt;xsl:param name="generate.toc"&gt;
+/appendix toc,title
+article/appendix nop
+/article toc,title
+book toc,title,figure,table,example,equation
+/chapter toc,title
+part toc,title
+/preface toc,title
+reference toc,title
+/sect1 toc
+/sect2 toc
+/sect3 toc
+/sect4 toc
+/sect5 toc
+/section toc
+set toc,title
+&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>This parameter has a structured value. It is a table of space-delimited
+path/value pairs. Each path identifies some element in the source document
+using a restricted subset of XPath (only the implicit child axis, no wildcards,
+no predicates). Paths can be either relative or absolute.</para>
+
+<para>When processing a particular element, the stylesheets consult this table to
+determine if a ToC (or LoT(s)) should be generated.</para>
+
+<para>For example, consider the entry:</para>
+
+<screen>book toc,figure</screen>
+
+<para>This indicates that whenever a <tag>book</tag> is formatted, a
+Table Of Contents and a List of Figures should be generated. Similarly,</para>
+
+<screen>/chapter toc</screen>
+
+<para>indicates that whenever a document <emphasis>that has a root
+of</emphasis> <tag>chapter</tag> is formatted, a Table of
+Contents should be generated. The entry <literal>chapter</literal> would match
+all chapters, but <literal>/chapter</literal> matches only <tag>chapter</tag>
+document elements.</para>
+
+<para>Generally, the longest match wins. So, for example, if you want to distinguish
+articles in books from articles in parts, you could use these two entries:</para>
+
+<screen>book/article toc,figure
+part/article toc</screen>
+
+<para>Note that an article in a part can never match a <literal>book/article</literal>,
+so if you want nothing to be generated for articles in parts, you can simply leave
+that rule out.</para>
+
+<para>If you want to leave the rule in, to make it explicit that you're turning
+something off, use the value <quote>nop</quote>. For example, the following
+entry disables ToCs and LoTs for articles:</para>
+
+<screen>article nop</screen>
+
+<para>Do not simply leave the word <quote>article</quote> in the file
+without a matching value. That'd be just begging the silly little
+path/value parser to get confused.</para>
+
+<para>Section ToCs are further controlled by the
+<parameter>generate.section.toc.level</parameter> parameter.
+For a given section level to have a ToC, it must have both an entry in
+<parameter>generate.toc</parameter> and be within the range enabled by
+<parameter>generate.section.toc.level</parameter>.</para>
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="generate.index">
+<refmeta>
+<refentrytitle>generate.index</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>generate.index</refname>
+<refpurpose>Do you want an index?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="generate.index.frag">&lt;xsl:param name="generate.index" select="1"&gt;&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specify if an index should be generated. </para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="make.index.markup">
+<refmeta>
+<refentrytitle>make.index.markup</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>make.index.markup</refname>
+<refpurpose>Generate XML index markup in the index?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="make.index.markup.frag">
+&lt;xsl:param name="make.index.markup" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>This parameter enables a very neat trick for getting properly
+merged, collated back-of-the-book indexes. G. Ken Holman suggested
+this trick at Extreme Markup Languages 2002 and I'm indebted to him
+for it.</para>
+
+<para>Jeni Tennison's excellent code in
+<filename>autoidx.xsl</filename> does a great job of merging and
+sorting <tag>indexterm</tag>s in the document and building a
+back-of-the-book index. However, there's one thing that it cannot
+reasonably be expected to do: merge page numbers into ranges. (I would
+not have thought that it could collate and suppress duplicate page
+numbers, but in fact it appears to manage that task somehow.)</para>
+
+<para>Ken's trick is to produce a document in which the index at the
+back of the book is <quote>displayed</quote> in XML. Because the index
+is generated by the FO processor, all of the page numbers have been resolved.
+It's a bit hard to explain, but what it boils down to is that instead of having
+an index at the back of the book that looks like this:</para>
+
+<blockquote>
+<formalpara><info><title>A</title></info>
+<para>ap1, 1, 2, 3</para>
+</formalpara>
+</blockquote>
+
+<para>you get one that looks like this:</para>
+
+<blockquote>
+<programlisting>&lt;indexdiv&gt;A&lt;/indexdiv&gt;
+&lt;indexentry&gt;
+&lt;primaryie&gt;ap1&lt;/primaryie&gt;,
+&lt;phrase role="pageno"&gt;1&lt;/phrase&gt;,
+&lt;phrase role="pageno"&gt;2&lt;/phrase&gt;,
+&lt;phrase role="pageno"&gt;3&lt;/phrase&gt;
+&lt;/indexentry&gt;</programlisting>
+</blockquote>
+
+<para>After building a PDF file with this sort of odd-looking index, you can
+extract the text from the PDF file and the result is a proper index expressed in
+XML.</para>
+
+<para>Now you have data that's amenable to processing and a simple Perl script
+(such as <filename>fo/pdf2index</filename>) can
+merge page ranges and generate a proper index.</para>
+
+<para>Finally, reformat your original document using this literal index instead of
+an automatically generated one and <quote>bingo</quote>!</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="index.method">
+<refmeta>
+<refentrytitle>index.method</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">list</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">basic</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">kosek</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">kimber</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>index.method</refname>
+<refpurpose>Select method used to group index entries in an index</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="index.method.frag">
+&lt;xsl:param name="index.method"&gt;basic&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>This parameter lets you select which method to use for sorting and grouping
+ index entries in an index.
+Indexes in Latin-based languages that have accented characters typically
+sort together accented words and unaccented words.
+Thus <quote>&#193;</quote> (U+00C1 LATIN CAPITAL LETTER A WITH ACUTE) would sort together
+with <quote>A</quote> (U+0041 LATIN CAPITAL LETTER A), so both would appear in the <quote>A</quote>
+section of the index.
+Languages using other alphabets (such as Russian, which is written in the Cyrillic alphabet)
+and languages using ideographic chararacters (such as Japanese)
+require grouping specific to the languages and alphabets.
+</para>
+
+<para>The default indexing method is limited.
+It can group accented characters in Latin-based languages only.
+It cannot handle non-Latin alphabets or ideographic languages.
+The other indexing methods require extensions of one type or
+another, and do not work with
+all XSLT processors, which is why they are not used by default.</para>
+
+<para>The three choices for indexing method are:</para>
+<variablelist>
+<varlistentry>
+<term><literal>basic</literal></term>
+<listitem>
+<para>
+(default) Sort and groups words based only on the Latin alphabet.
+Words with accented Latin letters will group and sort with
+their respective primary letter, but
+words in non-Latin alphabets will be
+put in the <quote>Symbols</quote> section of the index.
+</para>
+</listitem>
+</varlistentry>
+<varlistentry>
+<term><literal>kosek</literal></term>
+<listitem>
+<para>
+This method sorts and groups words based on letter groups configured in
+the DocBook locale file for the given language.
+See, for example, the French locale file <filename>common/fr.xml</filename>.
+This method requires that the XSLT processor
+supports the EXSLT extensions (most do).
+It also requires support for using
+user-defined functions in xsl:key (xsltproc does not).
+</para>
+<para>This method is suitable for any language for which you can
+list all the individual characters that should appear
+in each letter group in an index.
+It is probably not practical to use it for ideographic languages
+such as Chinese that have hundreds or thousands of characters.
+</para>
+
+<para>To use the kosek method, you must:</para>
+
+<orderedlist>
+<listitem>
+<para>Use a processor that supports its extensions, such as
+Saxon 6 or Xalan (xsltproc and Saxon 8 do not).
+</para>
+</listitem>
+<listitem>
+<para>Set the index.method parameter's value to <quote>kosek</quote>.
+</para>
+</listitem>
+<listitem>
+<para>Import the appropriate index extensions stylesheet module
+<filename>fo/autoidx-kosek.xsl</filename> or
+<filename>html/autoidx-kosek.xsl</filename> into your
+customization.
+</para>
+</listitem>
+</orderedlist>
+
+</listitem>
+</varlistentry>
+<varlistentry>
+<term><literal>kimber</literal></term>
+<listitem>
+<para>
+This method uses extensions to the Saxon processor to implement
+sophisticated indexing processes. It uses its own
+configuration file, which can include information for any number of
+languages. Each language's configuration can group
+words using one of two processes. In the
+enumerated process similar to that used in the kosek method,
+you indicate the groupings character-by-character.
+In the between-key process, you specify the
+break-points in the sort order that should start a new group.
+The latter configuration is useful for ideographic languages
+such as Chinese, Japanese, and Korean.
+You can also define your own collation algorithms and how you
+want mixed Latin-alphabet words sorted.</para>
+<itemizedlist>
+<listitem>
+<para>For a whitepaper describing the extensions, see:
+<link xlink:href="http://www.innodata-isogen.com/knowledge_center/white_papers/back_of_book_for_xsl_fo.pdf">http://www.innodata-isogen.com/knowledge_center/white_papers/back_of_book_for_xsl_fo.pdf</link>.
+</para>
+</listitem>
+<listitem>
+<para>To download the extension library, see
+<link xlink:href="http://www.innodata-isogen.com/knowledge_center/tools_downloads/i18nsupport">http://www.innodata-isogen.com/knowledge_center/tools_downloads/i18nsupport</link>.
+</para>
+</listitem>
+</itemizedlist>
+
+<para>To use the kimber method, you must:</para>
+
+<orderedlist>
+<listitem>
+<para>Use Saxon (version 6 or 8) as your XSLT processor.
+</para>
+</listitem>
+<listitem>
+<para>Install and configure the Innodata Isogen library, using
+the documentation that comes with it.
+</para>
+</listitem>
+<listitem>
+<para>Set the index.method parameter's value to <quote>kimber</quote>.
+</para>
+</listitem>
+<listitem>
+<para>Import the appropriate index extensions stylesheet module
+<filename>fo/autoidx-kimber.xsl</filename> or
+<filename>html/autoidx-kimber.xsl</filename> into your
+customization.
+</para>
+</listitem>
+</orderedlist>
+
+</listitem>
+</varlistentry>
+</variablelist>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="index.on.type">
+<refmeta>
+<refentrytitle>index.on.type</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>index.on.type</refname>
+<refpurpose>Select indexterms based on <tag class="attribute">type</tag>
+attribute value</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="index.on.type.frag">
+&lt;xsl:param name="index.on.type" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>
+If non-zero,
+then an <tag>index</tag> element that has a
+<tag class="attribute">type</tag> attribute
+value will contain only those <tag>indexterm</tag>
+elements with a matching <tag class="attribute">type</tag> attribute value.
+If an <tag>index</tag> has no <tag class="attribute">type</tag>
+attribute or it is blank, then the index will contain
+all <tag>indexterm</tag>s in the current scope.
+</para>
+
+<para>
+If <literal>index.on.type</literal> is zero, then the
+<tag class="attribute">type</tag> attribute has no effect
+on selecting indexterms for an index.
+</para>
+
+<para>For those using DocBook version 4.2 or earlier,
+the <tag class="attribute">type</tag> attribute is not available
+for index terms. However, you can achieve the same
+effect by using the <tag class="attribute">role</tag> attribute
+in the same manner on <tag>indexterm</tag>
+and <tag>index</tag>, and setting the stylesheet parameter
+<parameter>index.on.role</parameter> to a nonzero value.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="index.on.role">
+<refmeta>
+<refentrytitle>index.on.role</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>index.on.role</refname>
+<refpurpose>Select indexterms based on <tag class="attribute">role</tag> value</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="index.on.role.frag">
+&lt;xsl:param name="index.on.role" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>
+If non-zero,
+then an <tag>index</tag> element that has a
+<tag class="attribute">role</tag> attribute
+value will contain only those <tag>indexterm</tag>
+elements with a matching role value.
+If an <tag>index</tag> has no <tag class="attribute">role</tag>
+attribute or it is blank, then the index will contain
+all <tag>indexterm</tag>s in the current scope.
+</para>
+<para>
+If <literal>index.on.role</literal> is zero, then the
+<tag class="attribute">role</tag> attribute has no effect
+on selecting indexterms for an index.
+</para>
+
+<para>If you are using DocBook version 4.3 or later, you should
+use the <tag class="attribute">type</tag> attribute instead of <tag class="attribute">role</tag>
+on <tag>indexterm</tag> and <tag>index</tag>,
+and set the <parameter>index.on.type</parameter> to a nonzero
+value.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="index.preferred.page.properties">
+<refmeta>
+<refentrytitle>index.preferred.page.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>index.preferred.page.properties</refname>
+<refpurpose>Properties used to emphasize page number references for
+significant index terms</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="index.preferred.page.properties.frag">
+&lt;xsl:attribute-set name="index.preferred.page.properties"&gt;
+ &lt;xsl:attribute name="font-weight"&gt;bold&lt;/xsl:attribute&gt;
+&lt;/xsl:attribute-set&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Properties used to emphasize page number references for
+significant index terms (<tag class="attribute">significance</tag>=<tag class="attvalue">preferred</tag>). Currently works only with
+XEP.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="index.entry.properties">
+<refmeta>
+<refentrytitle>index.entry.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>index.entry.properties</refname>
+<refpurpose>Properties applied to the formatted entries
+in an index</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="index.entry.properties.frag">
+&lt;xsl:attribute-set name="index.entry.properties"&gt;
+ &lt;xsl:attribute name="start-indent"&gt;0pt&lt;/xsl:attribute&gt;
+&lt;/xsl:attribute-set&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>This attribute set is applied to the block containing
+the entries in a letter division in an index. It can be used to set the
+font-size, font-family, and other inheritable properties that will be
+applied to all index entries.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="index.div.title.properties">
+<refmeta>
+<refentrytitle>index.div.title.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>index.div.title.properties</refname>
+<refpurpose>Properties associated with the letter headings in an
+index</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="index.div.title.properties.frag">
+&lt;xsl:attribute-set name="index.div.title.properties"&gt;
+ &lt;xsl:attribute name="margin-{$direction.align.start}"&gt;0pt&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="font-size"&gt;14.4pt&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="font-family"&gt;&lt;xsl:value-of select="$title.fontset"&gt;&lt;/xsl:value-of&gt;&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="font-weight"&gt;bold&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="keep-with-next.within-column"&gt;always&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="space-before.optimum"&gt;&lt;xsl:value-of select="concat($body.font.master,'pt')"&gt;&lt;/xsl:value-of&gt;&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="space-before.minimum"&gt;&lt;xsl:value-of select="concat($body.font.master,'pt * 0.8')"&gt;&lt;/xsl:value-of&gt;&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="space-before.maximum"&gt;&lt;xsl:value-of select="concat($body.font.master,'pt * 1.2')"&gt;&lt;/xsl:value-of&gt;&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="start-indent"&gt;0pt&lt;/xsl:attribute&gt;
+&lt;/xsl:attribute-set&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>This attribute set is used on the letter headings that separate
+the divisions in an index.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="index.number.separator">
+<refmeta>
+<refentrytitle>index.number.separator</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>index.number.separator</refname>
+<refpurpose>Override for punctuation separating page numbers in index</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="index.number.separator.frag">
+&lt;xsl:param name="index.number.separator"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>This parameter permits you to override the text to insert between
+page references in a formatted index entry. Typically
+that would be a comma and a space.
+</para>
+
+<para>Because this text may be locale dependent,
+this parameter's value is normally taken from a gentext
+template named 'number-separator' in the
+context 'index' in the stylesheet
+locale file for the language
+of the current document.
+This parameter can be used to override the gentext string,
+and would typically be used on the command line.
+This parameter would apply to all languages.
+</para>
+
+<para>So this text string can be customized in two ways.
+You can reset the default gentext string using
+the <parameter>local.l10n.xml</parameter> parameter, or you can
+override the gentext with the content of this parameter.
+The content can be a simple string, or it can be
+something more complex such as a call-template.
+</para>
+
+<para>In HTML index output, section title references are used instead of
+page number references. This punctuation appears between
+such section titles in an HTML index.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="index.range.separator">
+<refmeta>
+<refentrytitle>index.range.separator</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>index.range.separator</refname>
+<refpurpose>Override for punctuation separating the two numbers
+in a page range in index</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="index.range.separator.frag">
+&lt;xsl:param name="index.range.separator"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>This parameter permits you
+to override the text to insert between
+the two numbers of a page range in an index.
+This parameter is only used by those XSL-FO processors
+that support an extension for generating such page ranges
+(such as XEP).</para>
+
+<para>Because this text may be locale dependent,
+this parameter's value is normally taken from a gentext
+template named 'range-separator' in the
+context 'index' in the stylesheet
+locale file for the language
+of the current document.
+This parameter can be used to override the gentext string,
+and would typically be used on the command line.
+This parameter would apply to all languages.
+</para>
+
+<para>So this text string can be customized in two ways.
+You can reset the default gentext string using
+the <parameter>local.l10n.xml</parameter> parameter, or you can
+override the gentext with the content of this parameter.
+The content can be a simple string, or it can be
+something more complex such as a call-template.
+</para>
+
+<para>In HTML index output, section title references are used instead of
+page number references. So there are no page ranges
+and this parameter has no effect.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="index.term.separator">
+<refmeta>
+<refentrytitle>index.term.separator</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>index.term.separator</refname>
+<refpurpose>Override for punctuation separating an index term
+from its list of page references in an index</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="index.term.separator.frag">
+&lt;xsl:param name="index.term.separator"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>This parameter permits you to override
+the text to insert between
+the end of an index term and its list of page references.
+Typically that might be a comma and a space.
+</para>
+
+<para>Because this text may be locale dependent,
+this parameter's value is normally taken from a gentext
+template named 'term-separator' in the
+context 'index' in the stylesheet
+locale file for the language
+of the current document.
+This parameter can be used to override the gentext string,
+and would typically be used on the command line.
+This parameter would apply to all languages.
+</para>
+
+<para>So this text string can be customized in two ways.
+You can reset the default gentext string using
+the <parameter>local.l10n.xml</parameter> parameter, or you can
+fill in the content for this normally empty
+override parameter.
+The content can be a simple string, or it can be
+something more complex such as a call-template.
+For fo output, it could be an <tag>fo:leader</tag>
+element to provide space of a specific length, or a dot leader.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="xep.index.item.properties">
+<refmeta>
+<refentrytitle>xep.index.item.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>xep.index.item.properties</refname>
+<refpurpose>Properties associated with XEP index-items</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="xep.index.item.properties.frag">
+&lt;xsl:attribute-set name="xep.index.item.properties" use-attribute-sets="index.page.number.properties"&gt;
+ &lt;xsl:attribute name="merge-subsequent-page-numbers"&gt;true&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="link-back"&gt;true&lt;/xsl:attribute&gt;
+&lt;/xsl:attribute-set&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Properties associated with XEP index-items, which generate
+page numbers in an index processed by XEP. For more info see
+the XEP documentation section "Indexes" in
+<uri xlink:href="http://www.renderx.com/reference.html#Indexes">http://www.renderx.com/reference.html#Indexes</uri>.</para>
+
+<para>This attribute-set also adds by default any properties from the
+<tag class="attribute">index.page.number.properties</tag>
+attribute-set.</para>
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="toc.section.depth">
+<refmeta>
+<refentrytitle>toc.section.depth</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">integer</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>toc.section.depth</refname>
+<refpurpose>How deep should recursive <tag>section</tag>s appear
+in the TOC?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="toc.section.depth.frag">&lt;xsl:param name="toc.section.depth"&gt;2&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies the depth to which recursive sections should appear in the
+TOC.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="toc.max.depth">
+<refmeta>
+<refentrytitle>toc.max.depth</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">integer</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>toc.max.depth</refname>
+<refpurpose>How many levels should be created for each TOC?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="toc.max.depth.frag">&lt;xsl:param name="toc.max.depth"&gt;8&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies the maximal depth of TOC on all levels.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="toc.indent.width">
+<refmeta>
+<refentrytitle>toc.indent.width</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">float</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>toc.indent.width</refname>
+<refpurpose>Amount of indentation for TOC entries</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="toc.indent.width.frag">
+&lt;xsl:param name="toc.indent.width"&gt;24&lt;/xsl:param&gt;
+&lt;!-- inconsistant point specification? --&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies, in points, the distance by which each level of the
+TOC is indented from its parent.</para>
+
+<para>This value is expressed in points, without
+a unit (in other words, it is a bare number). Using a bare number allows the stylesheet
+to perform calculations that would otherwise have to be performed by the FO processor
+because not all processors support expressions.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="toc.line.properties">
+<refmeta>
+<refentrytitle>toc.line.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>toc.line.properties</refname>
+<refpurpose>Properties for lines in ToCs and LoTs</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="toc.line.properties.frag">
+&lt;xsl:attribute-set name="toc.line.properties"&gt;
+ &lt;xsl:attribute name="text-align-last"&gt;justify&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="text-align"&gt;start&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="end-indent"&gt;&lt;xsl:value-of select="concat($toc.indent.width, 'pt')"&gt;&lt;/xsl:value-of&gt;&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="last-line-end-indent"&gt;&lt;xsl:value-of select="concat('-', $toc.indent.width, 'pt')"&gt;&lt;/xsl:value-of&gt;&lt;/xsl:attribute&gt;
+&lt;/xsl:attribute-set&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Properties which are applied to every line in ToC (or LoT). You can
+modify them in order to change appearance of all, or some lines. For
+example, in order to make lines for chapters bold, specify the
+following in your customization layer:</para>
+
+<programlisting>&lt;xsl:attribute-set name="toc.line.properties"&gt;
+ &lt;xsl:attribute name="font-weight"&gt;
+ &lt;xsl:choose&gt;
+ &lt;xsl:when test="self::chapter"&gt;bold&lt;/xsl:when&gt;
+ &lt;xsl:otherwise&gt;normal&lt;/xsl:otherwise&gt;
+ &lt;/xsl:choose&gt;
+ &lt;/xsl:attribute&gt;
+&lt;/xsl:attribute-set&gt;</programlisting>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="toc.margin.properties">
+<refmeta>
+<refentrytitle>toc.margin.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>toc.margin.properties</refname>
+<refpurpose>Margin properties used on Tables of Contents</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="toc.margin.properties.frag">
+&lt;xsl:attribute-set name="toc.margin.properties"&gt;
+ &lt;xsl:attribute name="space-before.minimum"&gt;0.5em&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="space-before.optimum"&gt;1em&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="space-before.maximum"&gt;2em&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="space-after.minimum"&gt;0.5em&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="space-after.optimum"&gt;1em&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="space-after.maximum"&gt;2em&lt;/xsl:attribute&gt;
+&lt;/xsl:attribute-set&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+<para>This attribute set is used on Tables of Contents. These attributes are set
+on the wrapper that surrounds the ToC block, not on each individual lines.</para>
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="bridgehead.in.toc">
+<refmeta>
+<refentrytitle>bridgehead.in.toc</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>bridgehead.in.toc</refname>
+<refpurpose>Should bridgehead elements appear in the TOC?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="bridgehead.in.toc.frag">&lt;xsl:param name="bridgehead.in.toc" select="0"&gt;&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, <tag>bridgehead</tag>s appear in the TOC. Note that
+this option is not fully supported and may be removed in a future
+version of the stylesheets.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="simplesect.in.toc">
+<refmeta>
+<refentrytitle>simplesect.in.toc</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>simplesect.in.toc</refname>
+<refpurpose>Should <tag>simplesect</tag> elements appear in the TOC?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="simplesect.in.toc.frag">&lt;xsl:param name="simplesect.in.toc" select="0"&gt;&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, <tag>simplesect</tag>s will be included in the TOC.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="generate.section.toc.level">
+<refmeta>
+<refentrytitle>generate.section.toc.level</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">integer</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>generate.section.toc.level</refname>
+<refpurpose>Control depth of TOC generation in sections</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="generate.section.toc.level.frag">
+&lt;xsl:param name="generate.section.toc.level" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The <parameter>generate.section.toc.level</parameter> parameter
+controls the depth of <tag>section</tag> in which TOCs will be generated. Note
+that this is related to, but not the same as
+<parameter>toc.section.depth</parameter>, which controls the depth to
+which TOC entries will be generated in a given TOC.</para>
+<para>If, for example, <parameter>generate.section.toc.level</parameter>
+is <literal>3</literal>, TOCs will be generated in first, second, and third
+level sections, but not in fourth level sections.
+</para>
+
+</refsection>
+</refentry>
+
+
+
+
+</reference><reference id="fo_ext" xml:base="../fo/param.xml"><title>Processor Extensions</title>
+<refentry version="5.0" id="arbortext.extensions">
+<refmeta>
+<refentrytitle>arbortext.extensions</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>arbortext.extensions</refname>
+<refpurpose>Enable Arbortext extensions?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="arbortext.extensions.frag">&lt;xsl:param name="arbortext.extensions" select="0"&gt;&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero,
+<link xlink:href="http://www.arbortext.com/">Arbortext</link>
+extensions will be used.
+</para>
+<para>This parameter can also affect which graphics file formats
+are supported</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="axf.extensions">
+<refmeta>
+<refentrytitle>axf.extensions</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>axf.extensions</refname>
+<refpurpose>Enable XSL Formatter extensions?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="axf.extensions.frag">
+&lt;xsl:param name="axf.extensions" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero,
+<link xlink:href="http://www.antennahouse.com/">XSL Formatter</link>
+extensions will be used. XSL Formatter extensions consists of PDF bookmarks,
+document information and better index processing.</para>
+
+<para>This parameter can also affect which graphics file formats
+are supported</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="fop.extensions">
+<refmeta>
+<refentrytitle>fop.extensions</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>fop.extensions</refname>
+<refpurpose>Enable extensions for FOP version 0.20.5 and earlier</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="fop.extensions.frag">&lt;xsl:param name="fop.extensions" select="0"&gt;&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, extensions intended for
+<link xlink:href="http://xml.apache.org/fop/">FOP</link>
+version 0.20.5 and earlier will be used.
+At present, this consists of PDF bookmarks.
+</para>
+
+<para>This parameter can also affect which graphics file formats
+are supported.</para>
+
+<para>If you are using a version of FOP beyond
+version 0.20.5, then use the <parameter>fop1.extensions</parameter> parameter
+instead.
+</para>
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="fop1.extensions">
+<refmeta>
+<refentrytitle>fop1.extensions</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>fop1.extensions</refname>
+<refpurpose>Enable extensions for FOP version 0.90 and later</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="fop1.extensions.frag">&lt;xsl:param name="fop1.extensions" select="0"&gt;&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, extensions for
+<link xlink:href="http://xml.apache.org/fop/">FOP</link>
+version 0.90 and later will be used.
+</para>
+
+<para>This parameter can also affect which graphics file formats
+are supported.</para>
+
+<para>The original <parameter>fop.extensions</parameter> parameter
+should still be used for FOP version 0.20.5 and earlier.
+</para>
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="passivetex.extensions">
+<refmeta>
+<refentrytitle>passivetex.extensions</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>passivetex.extensions</refname>
+<refpurpose>Enable PassiveTeX extensions?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="passivetex.extensions.frag">&lt;xsl:param name="passivetex.extensions" select="0"&gt;&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero,
+<link xlink:href="http://www.tei-c.org.uk/Software/passivetex/">PassiveTeX</link>
+extensions will be used. At present, this consists of PDF bookmarks
+and sorted index terms.
+</para>
+
+<para>This parameter can also affect which graphics file formats
+are supported</para>
+
+<note>
+ <para>PassiveTeX is incomplete and development has ceased. In most cases,
+another XSL-FO engine is probably a better choice.</para>
+</note>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="tex.math.in.alt">
+<refmeta>
+<refentrytitle>tex.math.in.alt</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">list</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">plain</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">latex</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>tex.math.in.alt</refname>
+<refpurpose>TeX notation used for equations</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="tex.math.in.alt.frag">
+&lt;xsl:param name="tex.math.in.alt"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If you want type math directly in TeX notation in equations,
+this parameter specifies notation used. Currently are supported two
+values -- <literal>plain</literal> and <literal>latex</literal>. Empty
+value means that you are not using TeX math at all.</para>
+
+<para>Preferred way for including TeX alternative of math is inside of
+<tag>textobject</tag> element. Eg.:</para>
+
+<programlisting>&lt;inlineequation&gt;
+&lt;inlinemediaobject&gt;
+&lt;imageobject&gt;
+&lt;imagedata fileref="eq1.gif"/&gt;
+&lt;/imageobject&gt;
+&lt;textobject&gt;&lt;phrase&gt;E=mc squared&lt;/phrase&gt;&lt;/textobject&gt;
+&lt;textobject role="tex"&gt;&lt;phrase&gt;E=mc^2&lt;/phrase&gt;&lt;/textobject&gt;
+&lt;/inlinemediaobject&gt;
+&lt;/inlineequation&gt;</programlisting>
+
+<para>If you are using <tag>graphic</tag> element, you can
+store TeX inside <tag>alt</tag> element:</para>
+
+<programlisting>&lt;inlineequation&gt;
+&lt;alt role="tex"&gt;a^2+b^2=c^2&lt;/alt&gt;
+&lt;graphic fileref="a2b2c2.gif"/&gt;
+&lt;/inlineequation&gt;</programlisting>
+
+<para>If you want use this feature, you should process your FO with
+PassiveTeX, which only supports TeX math notation. When calling
+stylsheet, don't forget to specify also
+passivetex.extensions=1.</para>
+
+<para>If you want equations in HTML, just process generated file
+<filename>tex-math-equations.tex</filename> by TeX or LaTeX. Then run
+dvi2bitmap program on result DVI file. You will get images for
+equations in your document.</para>
+
+<warning>
+ <para>This feature is useful for print/PDF output only if you
+ use the obsolete and now unsupported PassiveTeX XSL-FO
+ engine.</para>
+</warning>
+
+</refsection>
+
+<refsection><info><title>Related Parameters</title></info>
+ <para><parameter>tex.math.delims</parameter>,
+ <parameter>passivetex.extensions</parameter>,
+ <parameter>tex.math.file</parameter></para>
+</refsection>
+
+</refentry>
+
+<refentry version="5.0" id="tex.math.delims">
+<refmeta>
+<refentrytitle>tex.math.delims</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>tex.math.delims</refname>
+<refpurpose>Should equations output for processing by TeX be
+surrounded by math mode delimiters?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="tex.math.delims.frag">
+&lt;xsl:param name="tex.math.delims" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>For compatibility with DSSSL based DBTeXMath from Allin Cottrell
+you should set this parameter to 0.</para>
+
+<warning>
+ <para>This feature is useful for print/PDF output only if you
+ use the obsolete and now unsupported PassiveTeX XSL-FO
+ engine.</para>
+</warning>
+
+</refsection>
+<refsection><info><title>Related Parameters</title></info>
+ <para><parameter>tex.math.in.alt</parameter>,
+ <parameter>passivetex.extensions</parameter></para>
+</refsection>
+
+<refsection><info><title>See Also</title></info>
+ <para>You can also use the <tag class="xmlpi">dbtex delims</tag> processing
+ instruction to control whether delimiters are output.</para>
+</refsection>
+
+
+</refentry>
+
+<refentry version="5.0" id="xep.extensions">
+<refmeta>
+<refentrytitle>xep.extensions</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>xep.extensions</refname>
+<refpurpose>Enable XEP extensions?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="xep.extensions.frag">&lt;xsl:param name="xep.extensions" select="0"&gt;&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero,
+<link xlink:href="http://www.renderx.com/">XEP</link>
+extensions will be used. XEP extensions consists of PDF bookmarks,
+document information and better index processing.
+</para>
+
+<para>This parameter can also affect which graphics file formats
+are supported</para>
+</refsection>
+</refentry>
+
+</reference><reference id="dbk_ext" xml:base="../fo/param.xml"><title>Stylesheet Extensions</title>
+<refentry version="5.0" id="linenumbering.everyNth">
+<refmeta>
+<refentrytitle>linenumbering.everyNth</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">integer</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>linenumbering.everyNth</refname>
+<refpurpose>Indicate which lines should be numbered</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="linenumbering.everyNth.frag">
+&lt;xsl:param name="linenumbering.everyNth"&gt;5&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If line numbering is enabled, everyNth line will be
+numbered. Note that numbering is one based, not zero based.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="linenumbering.extension">
+<refmeta>
+<refentrytitle>linenumbering.extension</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>linenumbering.extension</refname>
+<refpurpose>Enable the line numbering extension</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="linenumbering.extension.frag">
+&lt;xsl:param name="linenumbering.extension" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, verbatim environments (<tag>address</tag>, <tag>literallayout</tag>,
+<tag>programlisting</tag>, <tag>screen</tag>, <tag>synopsis</tag>) that specify line numbering will
+have line numbers.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="linenumbering.separator">
+<refmeta>
+<refentrytitle>linenumbering.separator</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>linenumbering.separator</refname>
+<refpurpose>Specify a separator between line numbers and lines</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="linenumbering.separator.frag">
+&lt;xsl:param name="linenumbering.separator"&gt;&lt;xsl:text&gt; &lt;/xsl:text&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The separator is inserted between line numbers and lines in the
+verbatim environment. The default value is a single white space.
+ Note the interaction with <parameter>linenumbering.width</parameter>
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="linenumbering.width">
+<refmeta>
+<refentrytitle>linenumbering.width</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">integer</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>linenumbering.width</refname>
+<refpurpose>Indicates the width of line numbers</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="linenumbering.width.frag">
+&lt;xsl:param name="linenumbering.width"&gt;3&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If line numbering is enabled, line numbers will appear right
+justified in a field "width" characters wide.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="tablecolumns.extension">
+<refmeta>
+<refentrytitle>tablecolumns.extension</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>tablecolumns.extension</refname>
+<refpurpose>Enable the table columns extension function</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="tablecolumns.extension.frag">
+&lt;xsl:param name="tablecolumns.extension" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The table columns extension function adjusts the widths of table
+columns in the HTML result to more accurately reflect the specifications
+in the CALS table.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="textinsert.extension">
+ <refmeta>
+ <refentrytitle>textinsert.extension</refentrytitle>
+ <refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+ </refmeta>
+ <refnamediv>
+ <refname>textinsert.extension</refname>
+ <refpurpose>Enables the textinsert extension element</refpurpose>
+ </refnamediv>
+ <refsynopsisdiv>
+ <programlisting id="textinsert.extension.frag">
+ &lt;xsl:param name="textinsert.extension" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+ </refsynopsisdiv>
+ <refsection><info><title>Description</title></info>
+ <para>The textinsert extension element inserts the contents of
+ a file into the result tree (as text).</para>
+ <note>
+ <para>To use the textinsert extension element, you must use
+ either Saxon or Xalan as your XSLT processor (it doesn&#8217;t
+ work with xsltproc), along with either the DocBook Saxon
+ extensions or DocBook Xalan extensions (for more
+ information about those extensions, see <link role="tcg" xlink:href="InstallingAProcessor.html#SaxonExtensions">DocBook Saxon Extensions</link> and <link role="tcg" xlink:href="InstallingAProcessor.html#XalanExtensions">DocBook Xalan Extensions</link>), and you must set both
+ the <parameter>use.extensions</parameter> and
+ <parameter>textinsert.extension</parameter> parameters to
+ <literal>1</literal>.</para>
+ <para>As an alternative to using the textinsert element,
+ consider using an Xinclude element with the
+ <literal>parse="text"</literal> attribute and value
+ specified, as detailed in <link role="tcg" xlink:href="ExternalCode.html#XIncludeCode">Using XInclude for text inclusions</link>.</para>
+ </note>
+ </refsection>
+ <refsection><info><title>See Also</title></info>
+ <para>You can also use the <tag class="xmlpi">dbhtml-include&#160;href</tag> processing
+ instruction to insert external files &#8212; both files containing
+ plain text and files with markup content (including HTML
+ content).</para>
+ </refsection>
+ <refsection><info><title>More information</title></info>
+ <para>For how-to documentation on inserting contents of
+ external code files and other text files into output, see
+ <link role="tcg" xlink:href="ExternalCode.html">External code files</link>.</para>
+ <para>For guidelines on inserting contents of
+ HTML files into output, see <link role="tcg" xlink:href="InsertExtHtml.html">Inserting external HTML code</link>.</para>
+ </refsection>
+</refentry>
+
+<refentry version="5.0" id="textdata.default.encoding">
+<refmeta>
+<refentrytitle>textdata.default.encoding</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>textdata.default.encoding</refname>
+<refpurpose>Default encoding of external text files which are included
+using textdata element</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="textdata.default.encoding.frag">
+&lt;xsl:param name="textdata.default.encoding"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies the encoding of any external text files included using
+<tag>textdata</tag> element. This value is used only when you do
+not specify encoding by the appropriate attribute
+directly on textdata. An empty string is interpreted as the system
+default encoding.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="use.extensions">
+<refmeta>
+<refentrytitle>use.extensions</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>use.extensions</refname>
+<refpurpose>Enable extensions</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="use.extensions.frag">
+&lt;xsl:param name="use.extensions" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, extensions may be used. Each extension is
+further controlled by its own parameter. But if
+<parameter>use.extensions</parameter> is zero, no extensions will
+be used.
+</para>
+
+</refsection>
+</refentry>
+
+</reference><reference id="labels" xml:base="../fo/param.xml"><title>Automatic labelling</title>
+<refentry version="5.0" id="appendix.autolabel">
+<refmeta>
+<refentrytitle>appendix.autolabel</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">list</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">0<alt>none</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">1<alt>1,2,3...</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">A<alt>A,B,C...</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">a<alt>a,b,c...</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">i<alt>i,ii,iii...</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">I<alt>I,II,III...</alt></refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>appendix.autolabel</refname>
+<refpurpose>Specifies the labeling format for Appendix titles</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="appendix.autolabel.frag">
+&lt;xsl:param name="appendix.autolabel"&gt;A&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, then appendices will be numbered using the
+parameter value as the number format if the value matches one of the
+following:
+</para>
+
+<variablelist>
+ <varlistentry>
+ <term>1 or arabic</term>
+ <listitem>
+ <para>Arabic numeration (1, 2, 3 ...).</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>A or upperalpha</term>
+ <listitem>
+ <para>Uppercase letter numeration (A, B, C ...).</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>a or loweralpha</term>
+ <listitem>
+ <para>Lowercase letter numeration (a, b, c ...).</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>I or upperroman</term>
+ <listitem>
+ <para>Uppercase roman numeration (I, II, III ...).</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>i or lowerroman</term>
+ <listitem>
+ <para>Lowercase roman letter numeration (i, ii, iii ...).</para>
+ </listitem>
+ </varlistentry>
+</variablelist>
+
+<para>Any nonzero value other than the above will generate
+the default number format (upperalpha).
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="chapter.autolabel">
+<refmeta>
+<refentrytitle>chapter.autolabel</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">list</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">0<alt>none</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">1<alt>1,2,3...</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">A<alt>A,B,C...</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">a<alt>a,b,c...</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">i<alt>i,ii,iii...</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">I<alt>I,II,III...</alt></refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>chapter.autolabel</refname>
+<refpurpose>Specifies the labeling format for Chapter titles</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="chapter.autolabel.frag">
+&lt;xsl:param name="chapter.autolabel" select="1"&gt;&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, then chapters will be numbered using the parameter
+value as the number format if the value matches one of the following:
+</para>
+
+<variablelist>
+ <varlistentry>
+ <term>1 or arabic</term>
+ <listitem>
+ <para>Arabic numeration (1, 2, 3 ...).</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>A or upperalpha</term>
+ <listitem>
+ <para>Uppercase letter numeration (A, B, C ...).</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>a or loweralpha</term>
+ <listitem>
+ <para>Lowercase letter numeration (a, b, c ...).</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>I or upperroman</term>
+ <listitem>
+ <para>Uppercase roman numeration (I, II, III ...).</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>i or lowerroman</term>
+ <listitem>
+ <para>Lowercase roman letter numeration (i, ii, iii ...).</para>
+ </listitem>
+ </varlistentry>
+</variablelist>
+
+<para>Any nonzero value other than the above will generate
+the default number format (arabic).
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="part.autolabel">
+<refmeta>
+<refentrytitle>part.autolabel</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">list</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">0<alt>none</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">1<alt>1,2,3...</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">A<alt>A,B,C...</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">a<alt>a,b,c...</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">i<alt>i,ii,iii...</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">I<alt>I,II,III...</alt></refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>part.autolabel</refname>
+<refpurpose>Specifies the labeling format for Part titles</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="part.autolabel.frag">
+&lt;xsl:param name="part.autolabel"&gt;I&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, then parts will be numbered using the parameter
+value as the number format if the value matches one of the following:
+</para>
+
+<variablelist>
+ <varlistentry>
+ <term>1 or arabic</term>
+ <listitem>
+ <para>Arabic numeration (1, 2, 3 ...).</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>A or upperalpha</term>
+ <listitem>
+ <para>Uppercase letter numeration (A, B, C ...).</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>a or loweralpha</term>
+ <listitem>
+ <para>Lowercase letter numeration (a, b, c ...).</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>I or upperroman</term>
+ <listitem>
+ <para>Uppercase roman numeration (I, II, III ...).</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>i or lowerroman</term>
+ <listitem>
+ <para>Lowercase roman letter numeration (i, ii, iii ...).</para>
+ </listitem>
+ </varlistentry>
+</variablelist>
+
+<para>Any nonzero value other than the above will generate
+the default number format (upperroman).
+</para>
+
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="reference.autolabel">
+<refmeta>
+<refentrytitle>reference.autolabel</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">list</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">0<alt>none</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">1<alt>1,2,3...</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">A<alt>A,B,C...</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">a<alt>a,b,c...</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">i<alt>i,ii,iii...</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">I<alt>I,II,III...</alt></refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>reference.autolabel</refname>
+<refpurpose>Specifies the labeling format for Reference titles</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+<programlisting id="reference.autolabel.frag">
+ &lt;xsl:param name="reference.autolabel"&gt;I&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+<para>If non-zero, references will be numbered using the parameter
+ value as the number format if the value matches one of the
+ following:
+</para>
+<variablelist>
+ <varlistentry>
+ <term>1 or arabic</term>
+ <listitem>
+ <para>Arabic numeration (1, 2, 3 ...).</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>A or upperalpha</term>
+ <listitem>
+ <para>Uppercase letter numeration (A, B, C ...).</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>a or loweralpha</term>
+ <listitem>
+ <para>Lowercase letter numeration (a, b, c ...).</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>I or upperroman</term>
+ <listitem>
+ <para>Uppercase roman numeration (I, II, III ...).</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>i or lowerroman</term>
+ <listitem>
+ <para>Lowercase roman letter numeration (i, ii, iii ...).</para>
+ </listitem>
+ </varlistentry>
+</variablelist>
+<para>Any non-zero value other than the above will generate
+the default number format (upperroman).
+</para>
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="preface.autolabel">
+<refmeta>
+<refentrytitle>preface.autolabel</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">list</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">0<alt>none</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">1<alt>1,2,3...</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">A<alt>A,B,C...</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">a<alt>a,b,c...</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">i<alt>i,ii,iii...</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">I<alt>I,II,III...</alt></refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>preface.autolabel</refname>
+<refpurpose>Specifices the labeling format for Preface titles</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="preface.autolabel.frag">&lt;xsl:param name="preface.autolabel" select="0"&gt;&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero then prefaces will be numbered using the parameter
+value as the number format if the value matches one of the following:
+</para>
+
+<variablelist>
+ <varlistentry>
+ <term>1 or arabic</term>
+ <listitem>
+ <para>Arabic numeration (1, 2, 3 ...).</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>A or upperalpha</term>
+ <listitem>
+ <para>Uppercase letter numeration (A, B, C ...).</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>a or loweralpha</term>
+ <listitem>
+ <para>Lowercase letter numeration (a, b, c ...).</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>I or upperroman</term>
+ <listitem>
+ <para>Uppercase roman numeration (I, II, III ...).</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>i or lowerroman</term>
+ <listitem>
+ <para>Lowercase roman letter numeration (i, ii, iii ...).</para>
+ </listitem>
+ </varlistentry>
+</variablelist>
+
+<para>Any nonzero value other than the above will generate
+the default number format (arabic).
+</para>
+
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="section.autolabel">
+<refmeta>
+<refentrytitle>section.autolabel</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>section.autolabel</refname>
+<refpurpose>Are sections enumerated?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="section.autolabel.frag">&lt;xsl:param name="section.autolabel" select="0"&gt;&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If true (non-zero), unlabeled sections will be enumerated.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="section.autolabel.max.depth">
+<refmeta>
+<refentrytitle>section.autolabel.max.depth</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">integer</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>section.autolabel.max.depth</refname>
+<refpurpose>The deepest level of sections that are numbered.</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="section.autolabel.max.depth.frag">
+&lt;xsl:param name="section.autolabel.max.depth"&gt;8&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>When section numbering is turned on by the
+<parameter>section.autolabel</parameter> parameter, then this
+parameter controls the depth of <tag>section</tag> nesting that is
+numbered. Sections nested to a level deeper than this value will not
+be numbered.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="section.label.includes.component.label">
+<refmeta>
+<refentrytitle>section.label.includes.component.label</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>section.label.includes.component.label</refname>
+<refpurpose>Do section labels include the component label?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="section.label.includes.component.label.frag">&lt;xsl:param name="section.label.includes.component.label" select="0"&gt;&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, section labels are prefixed with the label of the
+component that contains them.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="label.from.part">
+<refmeta>
+<refentrytitle>label.from.part</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>label.from.part</refname>
+<refpurpose>Renumber components in each part?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="label.from.part.frag">
+&lt;xsl:param name="label.from.part" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If <parameter>label.from.part</parameter> is non-zero, then
+ numbering of components &#8212; <tag>preface</tag>,
+ <tag>chapter</tag>, <tag>appendix</tag>, and
+ <tag>reference</tag> (when <tag>reference</tag> occurs at the
+ component level) &#8212; is re-started within each
+ <tag>part</tag>.</para>
+<para>If <parameter>label.from.part</parameter> is zero (the
+ default), numbering of components is <emphasis>not</emphasis>
+ re-started within each <tag>part</tag>; instead, components are
+ numbered sequentially throughout each <tag>book</tag>,
+ regardless of whether or not they occur within <tag>part</tag>
+ instances.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="component.label.includes.part.label">
+<refmeta>
+<refentrytitle>component.label.includes.part.label</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>component.label.includes.part.label</refname>
+<refpurpose>Do component labels include the part label?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="component.label.includes.part.label.frag">&lt;xsl:param name="component.label.includes.part.label" select="0"&gt;&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, number labels for <tag>chapter</tag>,
+<tag>appendix</tag>, and other component elements are prefixed with
+the label of the part element that contains them. So you might see
+Chapter II.3 instead of Chapter 3. Also, the labels for formal
+elements such as <tag>table</tag> and <tag>figure</tag> will include
+the part label. If there is no part element container, then no prefix
+is generated.
+</para>
+<para>
+This feature is most useful when the
+<parameter>label.from.part</parameter> parameter is turned on.
+In that case, there would be more than one <tag>chapter</tag>
+<quote>1</quote>, and the extra part label prefix will identify
+each chapter unambiguously.
+</para>
+
+</refsection>
+</refentry>
+
+</reference><reference id="xslt" xml:base="../fo/param.xml"><title>XSLT Processing</title>
+<refentry version="5.0" id="rootid">
+<refmeta>
+<refentrytitle>rootid</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>rootid</refname>
+<refpurpose>Specify the root element to format</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="rootid.frag">
+&lt;xsl:param name="rootid"&gt;&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If <parameter>rootid</parameter> is not empty, it must be the
+value of an ID that occurs in the document being formatted. The entire
+document will be loaded and parsed, but formatting will begin at the
+element identified, rather than at the root. For example, this allows
+you to process only <tag>chapter</tag> 4 of a <tag>book</tag>.</para>
+<para>Because the entire document is available to the processor, automatic
+numbering, cross references, and other dependencies are correctly
+resolved.</para>
+
+</refsection>
+</refentry>
+
+</reference><reference id="meta" xml:base="../fo/param.xml"><title>Meta/*Info</title>
+<refentry version="5.0" id="make.single.year.ranges">
+<refmeta>
+<refentrytitle>make.single.year.ranges</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>make.single.year.ranges</refname>
+<refpurpose>Print single-year ranges (e.g., 1998-1999)</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="make.single.year.ranges.frag">
+&lt;xsl:param name="make.single.year.ranges" select="0"&gt;&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, year ranges that span a single year will be printed
+in range notation (1998-1999) instead of discrete notation
+(1998, 1999).</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="make.year.ranges">
+<refmeta>
+<refentrytitle>make.year.ranges</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>make.year.ranges</refname>
+<refpurpose>Collate copyright years into ranges?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="make.year.ranges.frag">&lt;xsl:param name="make.year.ranges" select="0"&gt;&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, multiple copyright <tag>year</tag> elements will be
+collated into ranges.
+This works only if each year number is put into a separate
+year element. The copyright element permits multiple
+year elements. If a year element contains a dash or
+a comma, then that year element will not be merged into
+any range.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="author.othername.in.middle">
+<refmeta>
+<refentrytitle>author.othername.in.middle</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>author.othername.in.middle</refname>
+<refpurpose>Is <tag>othername</tag> in <tag>author</tag> a
+middle name?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="author.othername.in.middle.frag">
+&lt;xsl:param name="author.othername.in.middle" select="1"&gt;&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, the <tag>othername</tag> of an <tag>author</tag>
+appears between the <tag>firstname</tag> and
+<tag>surname</tag>. Otherwise, <tag>othername</tag>
+is suppressed.
+</para>
+
+</refsection>
+</refentry>
+
+</reference><reference id="refentry" xml:base="../fo/param.xml"><title>Reference Pages</title>
+<refentry version="5.0" id="funcsynopsis.decoration">
+<refmeta>
+<refentrytitle>funcsynopsis.decoration</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>funcsynopsis.decoration</refname>
+<refpurpose>Decorate elements of a <tag>funcsynopsis</tag>?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="funcsynopsis.decoration.frag">
+&lt;xsl:param name="funcsynopsis.decoration" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, elements of the <tag>funcsynopsis</tag> will be
+decorated (e.g. rendered as bold or italic text). The decoration is controlled by
+templates that can be redefined in a customization layer.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="funcsynopsis.style">
+<refmeta>
+<refentrytitle>funcsynopsis.style</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">list</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">ansi</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">kr</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>funcsynopsis.style</refname>
+<refpurpose>What style of <tag>funcsynopsis</tag> should be generated?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="funcsynopsis.style.frag">&lt;xsl:param name="funcsynopsis.style"&gt;kr&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If <parameter>funcsynopsis.style</parameter> is <literal>ansi</literal>,
+ANSI-style function synopses are generated for a
+<tag>funcsynopsis</tag>, otherwise K&amp;R-style
+function synopses are generated.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="function.parens">
+<refmeta>
+<refentrytitle>function.parens</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>function.parens</refname>
+<refpurpose>Generate parens after a function?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="function.parens.frag">
+&lt;xsl:param name="function.parens" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, the formatting of a <tag>function</tag> element
+will include generated parentheses.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="refentry.generate.name">
+<refmeta>
+<refentrytitle>refentry.generate.name</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>refentry.generate.name</refname>
+<refpurpose>Output NAME header before <tag>refname</tag>s?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="refentry.generate.name.frag">
+&lt;xsl:param name="refentry.generate.name" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, a "NAME" section title is output before the list
+of <tag>refname</tag>s. This parameter and
+<parameter>refentry.generate.title</parameter> are mutually
+exclusive. This means that if you change this parameter to zero, you
+should set <parameter>refentry.generate.title</parameter> to non-zero unless
+you want get quite strange output.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="refentry.generate.title">
+<refmeta>
+<refentrytitle>refentry.generate.title</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>refentry.generate.title</refname>
+<refpurpose>Output title before <tag>refname</tag>s?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="refentry.generate.title.frag">
+&lt;xsl:param name="refentry.generate.title" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, the reference page title or first name is
+output before the list of <tag>refname</tag>s. This parameter and
+<parameter>refentry.generate.name</parameter> are mutually exclusive.
+This means that if you change this parameter to non-zero, you
+should set <parameter>refentry.generate.name</parameter> to zero unless
+you want get quite strange output.</para>
+
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="refentry.pagebreak">
+<refmeta>
+<refentrytitle>refentry.pagebreak</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>refentry.pagebreak</refname>
+<refpurpose>Start each refentry on a new page</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="refentry.pagebreak.frag">&lt;xsl:param name="refentry.pagebreak" select="1"&gt;&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero (the default), each <tag>refentry</tag>
+element will start on a new page. If zero, a page
+break will not be generated between <tag>refentry</tag> elements.
+The exception is when the <tag>refentry</tag> elements are children of
+a <tag>part</tag> element, in which case the page breaks are always
+retained. That is because a <tag>part</tag> element does not generate
+a page-sequence for its children, so each <tag>refentry</tag> must
+start its own page-sequence.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="refentry.title.properties">
+<refmeta>
+<refentrytitle>refentry.title.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>refentry.title.properties</refname>
+<refpurpose>Title properties for a refentry title</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="refentry.title.properties.frag">
+&lt;xsl:attribute-set name="refentry.title.properties"&gt;
+ &lt;xsl:attribute name="font-family"&gt;
+ &lt;xsl:value-of select="$title.font.family"&gt;&lt;/xsl:value-of&gt;
+ &lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="font-size"&gt;18pt&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="font-weight"&gt;bold&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="space-after"&gt;1em&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="hyphenate"&gt;false&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="keep-with-next.within-column"&gt;always&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="space-before.minimum"&gt;0.8em&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="space-before.optimum"&gt;1.0em&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="space-before.maximum"&gt;1.2em&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="space-after.optimum"&gt;0.5em&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="space-after.minimum"&gt;0.4em&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="space-after.maximum"&gt;0.6em&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="start-indent"&gt;&lt;xsl:value-of select="$title.margin.left"&gt;&lt;/xsl:value-of&gt;&lt;/xsl:attribute&gt;
+&lt;/xsl:attribute-set&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Formatting properties applied to the title generated for the
+<tag>refnamediv</tag> part of output for
+<tag>refentry</tag> when the value of the
+<parameter>refentry.generate.title</parameter> parameter is
+non-zero. The font size is supplied by the appropriate <parameter>section.level<replaceable>X</replaceable>.title.properties</parameter>
+attribute-set, computed from the location of the
+<tag>refentry</tag> in the section hierarchy.</para>
+
+<note>
+ <para>This parameter has no effect on the the title generated for
+ the <tag>refnamediv</tag> part of output for
+ <tag>refentry</tag> when the value of the
+ <parameter>refentry.generate.name</parameter> parameter is
+ non-zero. By default, that title is formatted with the same
+ properties as the titles for all other first-level children of
+ <tag>refentry</tag>.</para>
+</note>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="refentry.xref.manvolnum">
+<refmeta>
+<refentrytitle>refentry.xref.manvolnum</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>refentry.xref.manvolnum</refname>
+<refpurpose>Output <tag>manvolnum</tag> as part of
+<tag>refentry</tag> cross-reference?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="refentry.xref.manvolnum.frag">
+&lt;xsl:param name="refentry.xref.manvolnum" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>if non-zero, the <tag>manvolnum</tag> is used when cross-referencing
+<tag>refentry</tag>s, either with <tag>xref</tag>
+or <tag>citerefentry</tag>.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="refclass.suppress">
+<refmeta>
+<refentrytitle>refclass.suppress</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>refclass.suppress</refname>
+<refpurpose>Suppress display of refclass contents?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="refclass.suppress.frag">
+&lt;xsl:param name="refclass.suppress" select="0"&gt;&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If the value of <parameter>refclass.suppress</parameter> is
+non-zero, then display of <tag>refclass</tag> contents is
+suppressed in output.</para>
+
+</refsection>
+</refentry>
+
+</reference><reference id="tables" xml:base="../fo/param.xml"><title>Tables</title>
+<refentry version="5.0" id="default.table.width">
+<refmeta>
+<refentrytitle>default.table.width</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">length</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>default.table.width</refname>
+<refpurpose>The default width of tables</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+<programlisting id="default.table.width.frag">
+&lt;xsl:param name="default.table.width"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+<para>If non-zero, this value will be used for the
+<literal>width</literal> attribute on <tag>table</tag>s that do not specify an
+alternate width (with the <tag class="xmlpi">dbhtml table-width</tag> or
+<tag class="xmlpi">dbfo table-width</tag> processing instruction).</para>
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="nominal.table.width">
+<refmeta>
+<refentrytitle>nominal.table.width</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">length</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>nominal.table.width</refname>
+<refpurpose>The (absolute) nominal width of tables</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="nominal.table.width.frag">
+&lt;xsl:param name="nominal.table.width"&gt;6in&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>In order to convert CALS column widths into HTML column widths, it
+is sometimes necessary to have an absolute table width to use for conversion
+of mixed absolute and relative widths. This value must be an absolute
+length (not a percentage).</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="default.table.frame">
+<refmeta>
+<refentrytitle>default.table.frame</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>default.table.frame</refname>
+<refpurpose>The default framing of tables</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="default.table.frame.frag">
+&lt;xsl:param name="default.table.frame"&gt;all&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>This value will be used when there is no frame attribute on the
+table. </para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="default.table.rules">
+<refmeta>
+<refentrytitle>default.table.rules</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>default.table.rules</refname>
+<refpurpose>The default column and row rules for tables using HTML markup</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="default.table.rules.frag">
+&lt;xsl:param name="default.table.rules"&gt;none&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Tables using HTML markup elements can use an attribute
+named <tag class="attribute">rules</tag> on the <tag>table</tag> or
+<tag>informaltable</tag> element
+to specify whether column and row border rules should be
+displayed. This parameter lets you specify a global default
+style for all HTML tables that don't otherwise have
+that attribute.</para>
+<para>These are the supported values:</para>
+
+<variablelist>
+<varlistentry><term>all</term>
+<listitem>
+<para>Rules will appear between all rows and columns.</para>
+</listitem>
+</varlistentry>
+
+<varlistentry><term>rows</term>
+<listitem>
+<para>Rules will appear between rows only.</para>
+</listitem>
+</varlistentry>
+
+<varlistentry><term>cols</term>
+<listitem>
+<para>Rules will appear between columns only.</para>
+</listitem>
+</varlistentry>
+
+<varlistentry><term>groups</term>
+<listitem>
+<para>Rules will appear between row groups (thead, tfoot, tbody).
+No support for rules between column groups yet.
+</para>
+</listitem>
+</varlistentry>
+
+<varlistentry><term>none</term>
+<listitem>
+<para>No rules. This is the default value.
+</para>
+</listitem>
+</varlistentry>
+
+</variablelist>
+
+<para>The border after the last row and the border after
+the last column are not affected by
+this setting. Those borders are controlled by
+the <tag class="attribute">frame</tag> attribute on the table element.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="table.cell.padding">
+<refmeta>
+<refentrytitle>table.cell.padding</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>table.cell.padding</refname>
+<refpurpose>Specifies the padding of table cells</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="table.cell.padding.frag">
+&lt;xsl:attribute-set name="table.cell.padding"&gt;
+ &lt;xsl:attribute name="padding-start"&gt;2pt&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="padding-end"&gt;2pt&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="padding-top"&gt;2pt&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="padding-bottom"&gt;2pt&lt;/xsl:attribute&gt;
+&lt;/xsl:attribute-set&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies the padding of table cells.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="table.frame.border.thickness">
+<refmeta>
+<refentrytitle>table.frame.border.thickness</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">length</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>table.frame.border.thickness</refname>
+<refpurpose>Specifies the thickness of the frame border</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="table.frame.border.thickness.frag">
+&lt;xsl:param name="table.frame.border.thickness"&gt;0.5pt&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies the thickness of the border on the table's frame.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="table.frame.border.style">
+<refmeta>
+<refentrytitle>table.frame.border.style</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">list</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">none</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">solid</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">dotted</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">dashed</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">double</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">groove</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">ridge</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">inset</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">outset</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">solid</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>table.frame.border.style</refname>
+<refpurpose>Specifies the border style of table frames</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="table.frame.border.style.frag">
+&lt;xsl:param name="table.frame.border.style"&gt;solid&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies the border style of table frames.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="table.frame.border.color">
+<refmeta>
+<refentrytitle>table.frame.border.color</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">color</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>table.frame.border.color</refname>
+<refpurpose>Specifies the border color of table frames</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="table.frame.border.color.frag">
+
+&lt;xsl:param name="table.frame.border.color"&gt;black&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies the border color of table frames.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="table.cell.border.thickness">
+<refmeta>
+<refentrytitle>table.cell.border.thickness</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">length</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>table.cell.border.thickness</refname>
+<refpurpose>Specifies the thickness of table cell borders</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="table.cell.border.thickness.frag">
+&lt;xsl:param name="table.cell.border.thickness"&gt;0.5pt&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, specifies the thickness of borders on table
+cells. The units are points. See <link xlink:href="http://www.w3.org/TR/CSS21/box.html#border-width-properties">
+CSS</link></para>
+
+<note>
+ <para>To control properties of cell borders in HTML output, you must also turn on the
+ <parameter>table.borders.with.css</parameter> parameter.</para>
+</note>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="table.cell.border.style">
+<refmeta>
+<refentrytitle>table.cell.border.style</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">list</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">none</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">solid</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">dotted</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">dashed</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">double</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">groove</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">ridge</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">inset</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">outset</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">solid</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>table.cell.border.style</refname>
+<refpurpose>Specifies the border style of table cells</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="table.cell.border.style.frag">
+&lt;xsl:param name="table.cell.border.style"&gt;solid&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies the border style of table cells.</para>
+
+<note>
+ <para>To control properties of cell borders in HTML output, you must also turn on the
+ <parameter>table.borders.with.css</parameter> parameter.</para>
+</note>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="table.cell.border.color">
+<refmeta>
+<refentrytitle>table.cell.border.color</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">color</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>table.cell.border.color</refname>
+<refpurpose>Specifies the border color of table cells</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="table.cell.border.color.frag">
+
+&lt;xsl:param name="table.cell.border.color"&gt;black&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Set the color of table cell borders. If non-zero, the value is used
+for the border coloration. See <link xlink:href="http://www.w3.org/TR/CSS21/syndata.html#value-def-color">CSS</link>. A
+<literal>color</literal> is either a keyword or a numerical RGB specification.
+Keywords are aqua, black, blue, fuchsia, gray, green, lime, maroon,
+navy, olive, orange, purple, red, silver, teal, white, and
+yellow.</para>
+
+<note>
+ <para>To control properties of cell borders in HTML output, you must also turn on the
+ <parameter>table.borders.with.css</parameter> parameter.</para>
+</note>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="table.table.properties">
+<refmeta>
+<refentrytitle>table.table.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>table.table.properties</refname>
+<refpurpose>Properties associated with a table</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="table.table.properties.frag">
+&lt;xsl:attribute-set name="table.table.properties"&gt;
+ &lt;xsl:attribute name="border-before-width.conditionality"&gt;retain&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="border-collapse"&gt;collapse&lt;/xsl:attribute&gt;
+&lt;/xsl:attribute-set&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The styling for tables. This parameter should really
+have been called <literal>table.properties</literal>, but that parameter
+name was inadvertently established for the block-level properties
+of the table as a whole.
+</para>
+
+<para>See also <parameter>table.properties</parameter>.</para>
+
+</refsection>
+</refentry>
+
+</reference><reference id="links" xml:base="../fo/param.xml"><title>Linking</title>
+<refentry version="5.0" id="current.docid">
+<refmeta>
+<refentrytitle>current.docid</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>current.docid</refname>
+<refpurpose>targetdoc identifier for the document being
+processed</refpurpose>
+</refnamediv>
+<refsynopsisdiv> <programlisting id="current.docid.frag">
+&lt;xsl:param name="current.docid"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+
+<para>When olinks between documents are resolved for HTML output, the stylesheet can compute the relative path between the current document and the target document. The stylesheet needs to know the <literal>targetdoc</literal> identifiers for both documents, as they appear in the <parameter>target.database.document</parameter> database file. This parameter passes to the stylesheet
+the targetdoc identifier of the current document, since that
+identifier does not appear in the document itself. </para>
+<para>This parameter can also be used for print output. If an olink's <literal>targetdoc</literal> id differs from the <literal>current.docid</literal>, then the stylesheet can append the target document's title to the generated olink text. That identifies to the reader that the link is to a different document, not the current document. See also <parameter>olink.doctitle</parameter> to enable that feature.</para>
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="collect.xref.targets">
+<refmeta>
+<refentrytitle>collect.xref.targets</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">list</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">no</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">yes</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">only</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>collect.xref.targets</refname>
+<refpurpose>Controls whether cross reference data is
+collected</refpurpose>
+</refnamediv>
+<refsynopsisdiv> <programlisting id="collect.xref.targets.frag">
+&lt;xsl:param name="collect.xref.targets"&gt;no&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+
+<para>
+In order to resolve olinks efficiently, the stylesheets can
+generate an external data file containing information about
+all potential cross reference endpoints in a document.
+This parameter determines whether the collection process is run when the document is processed by the stylesheet. The default value is <literal>no</literal>, which means the data file is not generated during processing. The other choices are <literal>yes</literal>, which means the data file is created and the document is processed for output, and <literal>only</literal>, which means the data file is created but the document is not processed for output.
+See also <parameter>targets.filename</parameter>.
+</para>
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="insert.olink.page.number">
+<refmeta>
+<refentrytitle>insert.olink.page.number</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">list</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">no</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">yes</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">maybe</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>insert.olink.page.number</refname>
+<refpurpose>Turns page numbers in olinks on and off</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="insert.olink.page.number.frag">
+&lt;xsl:param name="insert.olink.page.number"&gt;no&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The value of this parameter determines if
+cross references made between documents with
+<tag>olink</tag> will
+include page number citations.
+In most cases this is only applicable to references in printed output.
+</para>
+<para>The parameter has three possible values.
+</para>
+<variablelist>
+<varlistentry>
+<term>no</term>
+<listitem><para>No page number references will be generated for olinks.
+</para></listitem>
+</varlistentry>
+<varlistentry>
+<term>yes</term>
+<listitem><para>Page number references will be generated
+for all <tag>olink</tag> references.
+The style of page reference may be changed
+if an <tag class="attribute">xrefstyle</tag>
+attribute is used.
+</para></listitem>
+</varlistentry>
+<varlistentry>
+<term>maybe</term>
+<listitem><para>Page number references will not be generated
+for an <tag>olink</tag> element unless
+it has an
+<tag class="attribute">xrefstyle</tag>
+attribute whose value specifies a page reference.
+</para></listitem>
+</varlistentry>
+</variablelist>
+<para>Olinks that point to targets within the same document
+are treated as <tag>xref</tag>s, and controlled by
+the <parameter>insert.xref.page.number</parameter> parameter.
+</para>
+
+<para>Page number references for olinks to
+external documents can only be inserted if the
+information exists in the olink database.
+This means each olink target element
+(<tag>div</tag> or <tag>obj</tag>)
+must have a <tag class="attribute">page</tag> attribute
+whose value is its page number in the target document.
+The XSL stylesheets are not able to extract that information
+during processing because pages have not yet been created in
+XSLT transformation. Only the XSL-FO processor knows what
+page each element is placed on.
+Therefore some postprocessing must take place to populate
+page numbers in the olink database.
+</para>
+
+
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="insert.olink.pdf.frag">
+<refmeta>
+<refentrytitle>insert.olink.pdf.frag</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>insert.olink.pdf.frag</refname>
+<refpurpose>Add fragment identifiers for links into PDF files</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="insert.olink.pdf.frag.frag">
+&lt;xsl:param name="insert.olink.pdf.frag" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The value of this parameter determines whether
+the cross reference URIs to PDF documents made with
+<tag>olink</tag> will
+include fragment identifiers.
+</para>
+
+<para>When forming a URI to link to a PDF document,
+a fragment identifier (typically a '#' followed by an
+id value) appended to the PDF filename can be used by
+the PDF viewer to open
+the PDF file to a location within the document instead of
+the first page.
+However, not all PDF files have id
+values embedded in them, and not all PDF viewers can
+handle fragment identifiers.
+</para>
+
+<para>If <parameter>insert.olink.pdf.frag</parameter> is set
+to a non-zero value, then any olink targeting a
+PDF file will have the fragment identifier appended to the URI.
+The URI is formed by concatenating the value of the
+<parameter>olink.base.uri</parameter> parameter, the
+value of the <tag class="attribute">baseuri</tag>
+attribute from the <tag class="element">document</tag>
+element in the olink database with the matching
+<tag class="attribute">targetdoc</tag> value,
+and the value of the <tag class="attribute">href</tag>
+attribute for the targeted element in the olink database.
+The <tag class="attribute">href</tag> attribute
+contains the fragment identifier.
+</para>
+
+<para>If <parameter>insert.olink.pdf.frag</parameter> is set
+to zero (the default value), then
+the <tag class="attribute">href</tag> attribute
+from the olink database
+is not appended to PDF olinks, so the fragment identifier is left off.
+A PDF olink is any olink for which the
+<tag class="attribute">baseuri</tag> attribute
+from the matching <tag class="element">document</tag>
+element in the olink database ends with '.pdf'.
+Any other olinks will still have the fragment identifier added.
+</para>
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="olink.base.uri">
+<refmeta>
+<refentrytitle>olink.base.uri</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">uri</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>olink.base.uri</refname>
+<refpurpose>Base URI used in olink hrefs</refpurpose>
+</refnamediv>
+<refsynopsisdiv> <programlisting id="olink.base.uri.frag">
+&lt;xsl:param name="olink.base.uri"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+
+<para>When cross reference data is collected for resolving olinks, it
+may be necessary to prepend a base URI to each target's href. This
+parameter lets you set that base URI when cross reference data is
+collected. This feature is needed when you want to link to a document
+that is processed without chunking. The output filename for such a
+document is not known to the XSL stylesheet; the only target
+information consists of fragment identifiers such as
+<literal>#idref</literal>. To enable the resolution of olinks between
+documents, you should pass the name of the HTML output file as the
+value of this parameter. Then the hrefs recorded in the cross
+reference data collection look like
+<literal>outfile.html#idref</literal>, which can be reached as links
+from other documents.</para>
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="olink.debug">
+<refmeta>
+<refentrytitle>olink.debug</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>olink.debug</refname>
+<refpurpose>Turn on debugging messages for olinks</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="olink.debug.frag">
+&lt;xsl:param name="olink.debug" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, then each olink will generate several
+messages about how it is being resolved during processing.
+This is useful when an olink does not resolve properly
+and the standard error messages are not sufficient to
+find the problem.
+</para>
+
+<para>You may need to read through the olink XSL templates
+to understand the context for some of the debug messages.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="olink.doctitle">
+<refmeta>
+<refentrytitle>olink.doctitle</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">list</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">no</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">yes</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">maybe</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>olink.doctitle</refname>
+<refpurpose>show the document title for external olinks?</refpurpose>
+
+</refnamediv>
+<refsynopsisdiv> <programlisting id="olink.doctitle.frag">
+&lt;xsl:param name="olink.doctitle"&gt;no&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+
+<para>When olinks between documents are resolved, the generated text
+may not make it clear that the reference is to another document.
+It is possible for the stylesheets to append the other document's
+title to external olinks. For this to happen, two parameters must
+be set.</para>
+<itemizedlist>
+<listitem>
+<para>This <parameter>olink.doctitle</parameter> parameter
+should be set to either <literal>yes</literal> or <literal>maybe</literal>
+to enable this feature.
+</para>
+</listitem>
+<listitem>
+<para>And you should also set the <parameter>current.docid</parameter>
+parameter to the document id for the document currently
+being processed for output.
+</para>
+</listitem>
+</itemizedlist>
+
+<para>
+Then if an olink's <literal>targetdoc</literal> id differs from
+the <literal>current.docid</literal> value, the stylesheet knows
+that it is a reference to another document and can
+append the target document's
+title to the generated olink text. </para>
+
+<para>The text for the target document's title is copied from the
+olink database from the <tag>ttl</tag> element
+of the top-level <tag>div</tag> for that document.
+If that <tag>ttl</tag> element is missing or empty,
+no title is output.
+</para>
+
+<para>The supported values for <parameter>olink.doctitle</parameter> are:
+</para>
+<variablelist>
+<varlistentry>
+<term><literal>yes</literal></term>
+<listitem>
+<para>
+Always insert the title to the target document if it is not
+the current document.
+</para>
+</listitem>
+</varlistentry>
+<varlistentry>
+<term><literal>no</literal></term>
+<listitem>
+<para>
+Never insert the title to the target document, even if requested
+in an <tag class="attribute">xrefstyle</tag> attribute.
+</para>
+</listitem>
+</varlistentry>
+<varlistentry>
+<term><literal>maybe</literal></term>
+<listitem>
+<para>
+Only insert the title to the target document, if requested
+in an <tag class="attribute">xrefstyle</tag> attribute.
+</para>
+</listitem>
+</varlistentry>
+</variablelist>
+<para>An <tag class="attribute">xrefstyle</tag> attribute
+may override the global setting for individual olinks.
+The following values are supported in an
+<tag class="attribute">xrefstyle</tag>
+attribute using the <literal>select:</literal> syntax:
+</para>
+
+<variablelist>
+<varlistentry>
+<term><literal>docname</literal></term>
+<listitem>
+<para>
+Insert the target document name for this olink using the
+<literal>docname</literal> gentext template, but only
+if the value of <parameter>olink.doctitle</parameter>
+is not <literal>no</literal>.
+</para>
+</listitem>
+</varlistentry>
+<varlistentry>
+<term><literal>docnamelong</literal></term>
+<listitem>
+<para>
+Insert the target document name for this olink using the
+<literal>docnamelong</literal> gentext template, but only
+if the value of <parameter>olink.doctitle</parameter>
+is not <literal>no</literal>.
+</para>
+</listitem>
+</varlistentry>
+<varlistentry>
+<term><literal>nodocname</literal></term>
+<listitem>
+<para>
+Omit the target document name even if
+the value of <parameter>olink.doctitle</parameter>
+is <literal>yes</literal>.
+</para>
+</listitem>
+</varlistentry>
+</variablelist>
+<para>Another way of inserting the target document name
+for a single olink is to employ an
+<tag class="attribute">xrefstyle</tag>
+attribute using the <literal>template:</literal> syntax.
+The <literal>%o</literal> placeholder (the letter o, not zero)
+in such a template
+will be filled in with the target document's title when it is processed.
+This will occur regardless of
+the value of <parameter>olink.doctitle</parameter>.
+</para>
+<para>Note that prior to version 1.66 of the XSL stylesheets,
+the allowed values for this parameter were 0 and 1. Those
+values are still supported and mapped to 'no' and 'yes', respectively.
+</para>
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="olink.lang.fallback.sequence">
+<refmeta>
+<refentrytitle>olink.lang.fallback.sequence</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>olink.lang.fallback.sequence</refname>
+<refpurpose>look up translated documents if olink not found?</refpurpose>
+
+</refnamediv>
+<refsynopsisdiv> <programlisting id="olink.lang.fallback.sequence.frag">
+&lt;xsl:param name="olink.lang.fallback.sequence"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+
+
+<para>This parameter defines a list of lang values
+to search among to resolve olinks.
+</para>
+
+<para>Normally an olink tries to resolve to a document in the same
+language as the olink itself. The language of an olink
+is determined by its nearest ancestor element with a
+<tag class="attribute">lang</tag> attribute, otherwise the
+value of the <parameter>l10n.gentext.default.lang</parameter>
+parameter.
+</para>
+
+<para>An olink database can contain target data for the same
+document in multiple languages. Each set of data has the
+same value for the <tag>targetdoc</tag> attribute in
+the <tag>document</tag> element in the database, but with a
+different <tag>lang</tag> attribute value.
+</para>
+
+<para>When an olink is being resolved, the target is first
+sought in the document with the same language as the olink.
+If no match is found there, then this parameter is consulted
+for additional languages to try.</para>
+
+<para>The <parameter>olink.lang.fallback.sequence</parameter>
+must be a whitespace separated list of lang values to
+try. The first one with a match in the olink database is used.
+The default value is empty.</para>
+
+<para>For example, a document might be written in German
+and contain an olink with
+<literal>targetdoc="adminguide"</literal>.
+When the document is processed, the processor
+first looks for a target dataset in the
+olink database starting with:</para>
+
+<literallayout><literal>&lt;document targetdoc="adminguide" lang="de"&gt;</literal>.
+</literallayout>
+
+<para>If there is no such element, then the
+<parameter>olink.lang.fallback.sequence</parameter>
+parameter is consulted.
+If its value is, for example, <quote>fr en</quote>, then the processor next
+looks for <literal>targetdoc="adminguide" lang="fr"</literal>, and
+then for <literal>targetdoc="adminguide" lang="en"</literal>.
+If there is still no match, it looks for
+<literal>targetdoc="adminguide"</literal> with no
+lang attribute.
+</para>
+
+<para>This parameter is useful when a set of documents is only
+partially translated, or is in the process of being translated.
+If a target of an olink has not yet been translated, then this
+parameter permits the processor to look for the document in
+other languages. This assumes the reader would rather have
+a link to a document in a different language than to have
+a broken link.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="olink.properties">
+<refmeta>
+<refentrytitle>olink.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>olink.properties</refname>
+<refpurpose>Properties associated with the cross-reference
+text of an olink.</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="olink.properties.frag">
+&lt;xsl:attribute-set name="olink.properties"&gt;
+ &lt;xsl:attribute name="show-destination"&gt;replace&lt;/xsl:attribute&gt;
+&lt;/xsl:attribute-set&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>This <literal>attribute set</literal> is applied to the
+<literal>fo:basic-link</literal> element of an olink. It is not applied to the
+optional page number or optional title of the external
+document.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="prefer.internal.olink">
+<refmeta>
+<refentrytitle>prefer.internal.olink</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>prefer.internal.olink</refname>
+<refpurpose>Prefer a local olink reference to an external reference</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="prefer.internal.olink.frag">
+&lt;xsl:param name="prefer.internal.olink" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If you are re-using XML content modules in multiple documents,
+you may want to redirect some of your olinks. This parameter
+permits you to redirect an olink to the current document.
+</para>
+
+<para>For example: you are writing documentation for a product,
+which includes 3 manuals: a little installation
+booklet (booklet.xml), a user
+guide (user.xml), and a reference manual (reference.xml).
+All 3 documents begin with the same introduction section (intro.xml) that
+contains a reference to the customization section (custom.xml) which is
+included in both user.xml and reference.xml documents.
+</para>
+
+<para>How do you write the link to custom.xml in intro.xml
+so that it is interpreted correctly in all 3 documents?</para>
+<itemizedlist>
+<listitem><para>If you use xref, it will fail in user.xml.</para>
+</listitem>
+<listitem><para>If you use olink (pointing to reference.xml),
+the reference in user.xml
+will point to the customization section of the reference manual, while it is
+actually available in user.xml.</para>
+</listitem>
+</itemizedlist>
+
+<para>If you set the <parameter>prefer.internal.olink</parameter>
+parameter to a non-zero value, then the processor will
+first look in the olink database
+for the olink's <tag>targetptr</tag> attribute value
+in document matching the <parameter>current.docid</parameter>
+parameter value. If it isn't found there, then
+it tries the document in the database
+with the <tag>targetdoc</tag>
+value that matches the olink's <tag>targetdoc</tag>
+attribute.
+</para>
+
+<para>This feature permits an olink reference to resolve to
+the current document if there is an element
+with an id matching the olink's <tag>targetptr</tag>
+value. The current document's olink data must be
+included in the target database for this to work.</para>
+
+<caution>
+<para>There is a potential for incorrect links if
+the same <tag>id</tag> attribute value is used for different
+content in different documents.
+Some of your olinks may be redirected to the current document
+when they shouldn't be. It is not possible to control
+individual olink instances.</para>
+</caution>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="target.database.document">
+<refmeta>
+<refentrytitle>target.database.document</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">uri</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>target.database.document</refname>
+<refpurpose>Name of master database file for resolving
+olinks</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+<programlisting id="target.database.document.frag">
+ &lt;xsl:param name="target.database.document"&gt;olinkdb.xml&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+
+<para>
+To resolve olinks between documents, the stylesheets use a master
+database document that identifies the target datafiles for all the
+documents within the scope of the olinks. This parameter value is the
+URI of the master document to be read during processing to resolve
+olinks. The default value is <filename>olinkdb.xml</filename>.</para>
+
+<para>The data structure of the file is defined in the
+<filename>targetdatabase.dtd</filename> DTD. The database file
+provides the high level elements to record the identifiers, locations,
+and relationships of documents. The cross reference data for
+individual documents is generally pulled into the database using
+system entity references or XIncludes. See also
+<parameter>targets.filename</parameter>. </para> </refsection>
+</refentry>
+
+<refentry version="5.0" id="targets.filename">
+<refmeta>
+<refentrytitle>targets.filename</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>targets.filename</refname>
+<refpurpose>Name of cross reference targets data file</refpurpose>
+</refnamediv>
+<refsynopsisdiv> <programlisting id="targets.filename.frag">
+&lt;xsl:param name="targets.filename"&gt;target.db&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+
+<para>
+In order to resolve olinks efficiently, the stylesheets can
+generate an external data file containing information about
+all potential cross reference endpoints in a document.
+This parameter lets you change the name of the generated
+file from the default name <filename>target.db</filename>.
+The name must agree with that used in the target database
+used to resolve olinks during processing.
+See also <parameter>target.database.document</parameter>.
+</para>
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="use.local.olink.style">
+<refmeta>
+<refentrytitle>use.local.olink.style</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>use.local.olink.style</refname>
+<refpurpose>Process olinks using xref style of current
+document</refpurpose>
+</refnamediv>
+<refsynopsisdiv> <programlisting id="use.local.olink.style.frag">
+&lt;xsl:param name="use.local.olink.style" select="0"&gt;&lt;/xsl:param&gt; </programlisting>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+
+<para>When cross reference data is collected for use by olinks, the data for each potential target includes one field containing a completely assembled cross reference string, as if it were an xref generated in that document. Other fields record the separate title, number, and element name of each target. When an olink is formed to a target from another document, the olink resolves to that preassembled string by default. If the <parameter>use.local.olink.style</parameter> parameter is set to non-zero, then instead the cross
+reference string is formed again from the target title, number, and
+element name, using the stylesheet processing the targeting document.
+Then olinks will match the xref style in the targeting document
+rather than in the target document. If both documents are processed
+with the same stylesheet, then the results will be the same.</para>
+</refsection>
+</refentry>
+
+</reference><reference id="xrefs" xml:base="../fo/param.xml"><title>Cross References</title>
+<refentry version="5.0" id="insert.xref.page.number">
+<refmeta>
+<refentrytitle>insert.xref.page.number</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">list</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">no</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">yes</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">maybe</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>insert.xref.page.number</refname>
+<refpurpose>Turns page numbers in xrefs on and off</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="insert.xref.page.number.frag">
+&lt;xsl:param name="insert.xref.page.number"&gt;no&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The value of this parameter determines if
+cross references (<tag>xref</tag>s) in
+printed output will
+include page number citations.
+It has three possible values.
+</para>
+<variablelist>
+<varlistentry>
+<term>no</term>
+<listitem><para>No page number references will be generated.
+</para></listitem>
+</varlistentry>
+<varlistentry>
+<term>yes</term>
+<listitem><para>Page number references will be generated
+for all <tag>xref</tag> elements.
+The style of page reference may be changed
+if an <tag class="attribute">xrefstyle</tag>
+attribute is used.
+</para></listitem>
+</varlistentry>
+<varlistentry>
+<term>maybe</term>
+<listitem><para>Page number references will not be generated
+for an <tag>xref</tag> element unless
+it has an
+<tag class="attribute">xrefstyle</tag>
+attribute whose value specifies a page reference.
+</para></listitem>
+</varlistentry>
+</variablelist>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="xref.properties">
+<refmeta>
+<refentrytitle>xref.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>xref.properties</refname>
+<refpurpose>Properties associated with cross-reference text</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="xref.properties.frag">
+&lt;xsl:attribute-set name="xref.properties"&gt;
+&lt;/xsl:attribute-set&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>This attribute set is used to set properties
+on cross reference text.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="xref.label-title.separator">
+<refmeta>
+<refentrytitle>xref.label-title.separator</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>xref.label-title.separator</refname>
+<refpurpose>Punctuation or space separating label from title in xref</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="xref.label-title.separator.frag">&lt;xsl:param name="xref.label-title.separator"&gt;: &lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>
+This parameter allows you to control the punctuation of certain
+types of generated cross reference text.
+When cross reference text is generated for an
+<tag class="element">xref</tag> or
+<tag class="element">olink</tag> element
+using an <tag class="attribute">xrefstyle</tag> attribute
+that makes use of the <literal>select:</literal> feature,
+and the selected components include both label and title,
+then the value of this parameter is inserted between
+label and title in the output.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="xref.label-page.separator">
+<refmeta>
+<refentrytitle>xref.label-page.separator</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>xref.label-page.separator</refname>
+<refpurpose>Punctuation or space separating label from page number in xref</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="xref.label-page.separator.frag">&lt;xsl:param name="xref.label-page.separator"&gt;&lt;xsl:text&gt; &lt;/xsl:text&gt;&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>
+This parameter allows you to control the punctuation of certain
+types of generated cross reference text.
+When cross reference text is generated for an
+<tag class="element">xref</tag> or
+<tag class="element">olink</tag> element
+using an <tag class="attribute">xrefstyle</tag> attribute
+that makes use of the <literal>select:</literal> feature,
+and the selected components include both label and page
+but no title,
+then the value of this parameter is inserted between
+label and page number in the output.
+If a title is included, then other separators are used.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="xref.title-page.separator">
+<refmeta>
+<refentrytitle>xref.title-page.separator</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>xref.title-page.separator</refname>
+<refpurpose>Punctuation or space separating title from page number in xref</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="xref.title-page.separator.frag">&lt;xsl:param name="xref.title-page.separator"&gt;&lt;xsl:text&gt; &lt;/xsl:text&gt;&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>
+This parameter allows you to control the punctuation of certain
+types of generated cross reference text.
+When cross reference text is generated for an
+<tag class="element">xref</tag> or
+<tag class="element">olink</tag> element
+using an <tag class="attribute">xrefstyle</tag> attribute
+that makes use of the <literal>select:</literal> feature,
+and the selected components include both title and page number,
+then the value of this parameter is inserted between
+title and page number in the output.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="insert.link.page.number">
+<refmeta>
+<refentrytitle>insert.link.page.number</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">list</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">no</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">yes</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">maybe</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>insert.link.page.number</refname>
+<refpurpose>Turns page numbers in link elements on and off</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="insert.link.page.number.frag">
+&lt;xsl:param name="insert.link.page.number"&gt;no&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The value of this parameter determines if
+cross references using the <tag>link</tag> element in
+printed output will
+include standard page number citations.
+It has three possible values.
+</para>
+<variablelist>
+<varlistentry>
+<term>no</term>
+<listitem><para>No page number references will be generated.
+</para></listitem>
+</varlistentry>
+<varlistentry>
+<term>yes</term>
+<listitem><para>Page number references will be generated
+for all <tag>link</tag> elements.
+The style of page reference may be changed
+if an <tag class="attribute">xrefstyle</tag>
+attribute is used.
+</para></listitem>
+</varlistentry>
+<varlistentry>
+<term>maybe</term>
+<listitem><para>Page number references will not be generated
+for a <tag>link</tag> element unless
+it has an
+<tag class="attribute">xrefstyle</tag>
+attribute whose value specifies a page reference.
+</para></listitem>
+</varlistentry>
+</variablelist>
+
+<para>Although the <tag>xrefstyle</tag> attribute
+can be used to turn the page reference on or off, it cannot be
+used to control the formatting of the page number as it
+can in <tag>xref</tag>.
+In <tag>link</tag> it will always format with
+the style established by the
+gentext template with <literal>name="page.citation"</literal>
+in the <literal>l:context name="xref"</literal>.
+</para>
+</refsection>
+</refentry>
+
+</reference><reference id="lists" xml:base="../fo/param.xml"><title>Lists</title>
+<refentry version="5.0" id="compact.list.item.spacing">
+<refmeta>
+<refentrytitle>compact.list.item.spacing</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>compact.list.item.spacing</refname>
+<refpurpose>What space do you want between list items (when spacing="compact")?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="compact.list.item.spacing.frag">&lt;xsl:attribute-set name="compact.list.item.spacing"&gt;
+ &lt;xsl:attribute name="space-before.optimum"&gt;0em&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="space-before.minimum"&gt;0em&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="space-before.maximum"&gt;0.2em&lt;/xsl:attribute&gt;
+&lt;/xsl:attribute-set&gt;</programlisting>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+<para>Specify what spacing you want between each list item when
+<tag class="attribute">spacing</tag> is
+<quote><literal>compact</literal></quote>.</para>
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="itemizedlist.properties">
+<refmeta>
+<refentrytitle>itemizedlist.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>itemizedlist.properties</refname>
+<refpurpose>Properties that apply to each list-block generated by itemizedlist.</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="itemizedlist.properties.frag">&lt;xsl:attribute-set name="itemizedlist.properties" use-attribute-sets="list.block.properties"&gt;
+&lt;/xsl:attribute-set&gt;</programlisting>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+<para>Properties that apply to each fo:list-block generated by itemizedlist.</para>
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="itemizedlist.label.properties">
+<refmeta>
+<refentrytitle>itemizedlist.label.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>itemizedlist.label.properties</refname>
+<refpurpose>Properties that apply to each label inside itemized list.</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="itemizedlist.label.properties.frag">&lt;xsl:attribute-set name="itemizedlist.label.properties"&gt;
+&lt;/xsl:attribute-set&gt;</programlisting>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+<para>Properties that apply to each label inside itemized list. E.g.:</para>
+<programlisting>&lt;xsl:attribute-set name="itemizedlist.label.properties"&gt;
+ &lt;xsl:attribute name="text-align"&gt;right&lt;/xsl:attribute&gt;
+&lt;/xsl:attribute-set&gt;</programlisting>
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="itemizedlist.label.width">
+<refmeta>
+<refentrytitle>itemizedlist.label.width</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">length</refmiscinfo>
+</refmeta>
+<refnamediv>
+ <refname>itemizedlist.label.width</refname>
+<refpurpose>The default width of the label (bullet) in an itemized list.</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+ <programlisting id="itemizedlist.label.width.frag">
+ &lt;xsl:param name="itemizedlist.label.width"&gt;1.0em&lt;/xsl:param&gt;
+ </programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+<para>Specifies the default width of the label (usually a bullet or other
+symbol) in an itemized list. You can override the default value on any
+particular list with the &#8220;dbfo&#8221; processing instruction using the
+&#8220;label-width&#8221; pseudoattribute.</para>
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="list.block.properties">
+<refmeta>
+<refentrytitle>list.block.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>list.block.properties</refname>
+<refpurpose>Properties that apply to each list-block generated by list.</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="list.block.properties.frag">&lt;xsl:attribute-set name="list.block.properties"&gt;
+ &lt;xsl:attribute name="provisional-label-separation"&gt;0.2em&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="provisional-distance-between-starts"&gt;1.5em&lt;/xsl:attribute&gt;
+&lt;/xsl:attribute-set&gt;</programlisting>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+<para>Properties that apply to each fo:list-block generated by itemizedlist/orderedlist.</para>
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="list.block.spacing">
+<refmeta>
+<refentrytitle>list.block.spacing</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>list.block.spacing</refname>
+<refpurpose>What spacing do you want before and after lists?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="list.block.spacing.frag">&lt;xsl:attribute-set name="list.block.spacing"&gt;
+ &lt;xsl:attribute name="space-before.optimum"&gt;1em&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="space-before.minimum"&gt;0.8em&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="space-before.maximum"&gt;1.2em&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="space-after.optimum"&gt;1em&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="space-after.minimum"&gt;0.8em&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="space-after.maximum"&gt;1.2em&lt;/xsl:attribute&gt;
+&lt;/xsl:attribute-set&gt;</programlisting>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+<para>Specify the spacing required before and after a list. It is necessary to specify the space after a list block because lists can come inside of paras. </para>
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="list.item.spacing">
+<refmeta>
+<refentrytitle>list.item.spacing</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>list.item.spacing</refname>
+<refpurpose>What space do you want between list items?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="list.item.spacing.frag">&lt;xsl:attribute-set name="list.item.spacing"&gt;
+ &lt;xsl:attribute name="space-before.optimum"&gt;1em&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="space-before.minimum"&gt;0.8em&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="space-before.maximum"&gt;1.2em&lt;/xsl:attribute&gt;
+&lt;/xsl:attribute-set&gt;</programlisting>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+<para>Specify what spacing you want between each list item.</para>
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="orderedlist.properties">
+<refmeta>
+<refentrytitle>orderedlist.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>orderedlist.properties</refname>
+<refpurpose>Properties that apply to each list-block generated by orderedlist.</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="orderedlist.properties.frag">&lt;xsl:attribute-set name="orderedlist.properties" use-attribute-sets="list.block.properties"&gt;
+ &lt;xsl:attribute name="provisional-distance-between-starts"&gt;2em&lt;/xsl:attribute&gt;
+&lt;/xsl:attribute-set&gt;</programlisting>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+<para>Properties that apply to each fo:list-block generated by orderedlist.</para>
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="orderedlist.label.properties">
+<refmeta>
+<refentrytitle>orderedlist.label.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>orderedlist.label.properties</refname>
+<refpurpose>Properties that apply to each label inside ordered list.</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="orderedlist.label.properties.frag">&lt;xsl:attribute-set name="orderedlist.label.properties"&gt;
+&lt;/xsl:attribute-set&gt;</programlisting>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+<para>Properties that apply to each label inside ordered list. E.g.:</para>
+<programlisting>&lt;xsl:attribute-set name="orderedlist.label.properties"&gt;
+ &lt;xsl:attribute name="text-align"&gt;right&lt;/xsl:attribute&gt;
+&lt;/xsl:attribute-set&gt;</programlisting>
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="orderedlist.label.width">
+<refmeta>
+<refentrytitle>orderedlist.label.width</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">length</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>orderedlist.label.width</refname>
+<refpurpose>The default width of the label (number) in an ordered list.</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="orderedlist.label.width.frag">
+&lt;xsl:param name="orderedlist.label.width"&gt;1.2em&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+<para>Specifies the default width of the label (usually a number or
+sequence of numbers) in an ordered list. You can override the default
+value on any particular list with the &#8220;dbfo&#8221; processing instruction
+using the &#8220;label-width&#8221; pseudoattribute.</para>
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="variablelist.max.termlength">
+<refmeta>
+<refentrytitle>variablelist.max.termlength</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">number</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>variablelist.max.termlength</refname>
+<refpurpose>Specifies the longest term in variablelists</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="variablelist.max.termlength.frag">
+&lt;xsl:param name="variablelist.max.termlength"&gt;24&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>In variablelists, the <tag>listitem</tag>
+is indented to leave room for the
+<tag>term</tag> elements. That indent may be computed
+if it is not specified with a <tag class="attribute">termlength</tag>
+attribute on the <tag>variablelist</tag> element.
+</para>
+<para>
+The computation counts characters in the
+<tag>term</tag> elements in the list
+to find the longest term. However, some terms are very long
+and would produce extreme indents. This parameter lets you
+set a maximum character count. Any terms longer than the maximum
+would line wrap. The default value is 24.
+</para>
+<para>
+The character counts are converted to physical widths
+by multiplying by 0.50em. There will be some variability
+in how many actual characters fit in the space
+since some characters are wider than others.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="variablelist.term.separator">
+<refmeta>
+<refentrytitle>variablelist.term.separator</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>variablelist.term.separator</refname>
+<refpurpose>Text to separate <tag>term</tag>s within a multi-term
+<tag>varlistentry</tag></refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="variablelist.term.separator.frag">
+&lt;xsl:param name="variablelist.term.separator"&gt;, &lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>When a <tag>varlistentry</tag> contains multiple <tag>term</tag>
+elements, the string specified in the value of the
+<parameter>variablelist.term.separator</parameter> parameter is placed
+after each <tag>term</tag> except the last.</para>
+
+<note>
+ <para>To generate a line break between multiple <tag>term</tag>s in
+ a <tag>varlistentry</tag>, set a non-zero value for the
+ <parameter>variablelist.term.break.after</parameter> parameter. If
+ you do so, you may also want to set the value of the
+ <parameter>variablelist.term.separator</parameter> parameter to an
+ empty string (to suppress rendering of the default comma and space
+ after each <tag>term</tag>).</para>
+</note>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="variablelist.term.properties">
+<refmeta>
+<refentrytitle>variablelist.term.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>variablelist.term.properties</refname>
+<refpurpose>To add properties to the term elements in a variablelist.</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="variablelist.term.properties.frag">
+&lt;xsl:attribute-set name="variablelist.term.properties"&gt;
+&lt;/xsl:attribute-set&gt;
+</programlisting>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+<para>These properties are added to the block containing a
+term in a variablelist.
+Use this attribute-set to set
+font properties or alignment, for example.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="variablelist.term.break.after">
+<refmeta>
+<refentrytitle>variablelist.term.break.after</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>variablelist.term.break.after</refname>
+<refpurpose>Generate line break after each <tag>term</tag> within a
+multi-term <tag>varlistentry</tag>?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="variablelist.term.break.after.frag">
+&lt;xsl:param name="variablelist.term.break.after"&gt;0&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Set a non-zero value for the
+<parameter>variablelist.term.break.after</parameter> parameter to
+generate a line break between <tag>term</tag>s in a
+multi-term <tag>varlistentry</tag>.</para>
+
+<note>
+<para>If you set a non-zero value for
+<parameter>variablelist.term.break.after</parameter>, you may also
+want to set the value of the
+<parameter>variablelist.term.separator</parameter> parameter to an
+empty string (to suppress rendering of the default comma and space
+after each <tag>term</tag>).</para>
+</note>
+
+</refsection>
+</refentry>
+
+</reference><reference id="qa" xml:base="../fo/param.xml"><title>QAndASet</title>
+<refentry version="5.0" id="qandadiv.autolabel">
+<refmeta>
+<refentrytitle>qandadiv.autolabel</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>qandadiv.autolabel</refname>
+<refpurpose>Are divisions in QAndASets enumerated?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="qandadiv.autolabel.frag">&lt;xsl:param name="qandadiv.autolabel" select="1"&gt;&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, unlabeled qandadivs will be enumerated.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="qanda.inherit.numeration">
+<refmeta>
+<refentrytitle>qanda.inherit.numeration</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>qanda.inherit.numeration</refname>
+<refpurpose>Does enumeration of QandASet components inherit the numeration of parent elements?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="qanda.inherit.numeration.frag">
+&lt;xsl:param name="qanda.inherit.numeration" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, numbered <tag>qandadiv</tag> elements and
+<tag>question</tag> and <tag>answer</tag> inherit the enumeration of
+the ancestors of the <tag>qandaset</tag>.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="qanda.defaultlabel">
+<refmeta>
+<refentrytitle>qanda.defaultlabel</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">list</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">number</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">qanda</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">none</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>qanda.defaultlabel</refname>
+<refpurpose>Sets the default for defaultlabel on QandASet.</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="qanda.defaultlabel.frag">
+&lt;xsl:param name="qanda.defaultlabel"&gt;number&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If no <literal>defaultlabel</literal> attribute is specified on
+a <tag>qandaset</tag>, this value is used. It is generally one of the legal
+values for the defaultlabel attribute (<literal>none</literal>,
+<literal>number</literal> or
+<literal>qanda</literal>), or one of the additional stylesheet-specific values
+(<literal>qnumber</literal> or <literal>qnumberanda</literal>).
+The default value is 'number'.
+</para>
+<para>The values are rendered as follows:</para>
+<variablelist>
+<varlistentry><term><literal>qanda</literal></term>
+<listitem>
+<para><tag>question</tag>s are labeled "Q:" and
+<tag>answer</tag>s are labeled "A:". </para>
+</listitem>
+</varlistentry>
+
+<varlistentry><term><literal>number</literal></term>
+<listitem>
+<para>The questions are enumerated and the answers
+are not labeled. </para>
+</listitem>
+</varlistentry>
+
+<varlistentry><term><literal>qnumber</literal></term>
+<listitem>
+<para>The questions are labeled "Q:" followed by a number, and answers are not
+labeled.
+When sections are numbered, adding a label
+to the number distinguishes the question numbers
+from the section numbers.
+This value is not allowed in the
+<tag class="attribute">defaultlabel</tag> attribute
+of a <tag>qandaset</tag> element.</para>
+</listitem>
+</varlistentry>
+
+<varlistentry><term><literal>qnumberanda</literal></term>
+<listitem>
+<para>The questions are labeled "Q:" followed by a number, and
+the answers are labeled "A:".
+When sections are numbered, adding a label
+to the number distinguishes the question numbers
+from the section numbers.
+This value is not allowed in the
+<tag class="attribute">defaultlabel</tag> attribute
+of a <tag>qandaset</tag> element.</para>
+</listitem>
+</varlistentry>
+
+<varlistentry><term><literal>none</literal></term>
+<listitem>
+<para>No distinguishing label precedes Questions or Answers.
+</para>
+</listitem>
+</varlistentry>
+</variablelist>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="qanda.in.toc">
+<refmeta>
+<refentrytitle>qanda.in.toc</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>qanda.in.toc</refname>
+<refpurpose>Should qandaentry questions appear in
+the document table of contents?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="qanda.in.toc.frag">&lt;xsl:param name="qanda.in.toc" select="0"&gt;&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If true (non-zero), then the generated table of contents
+for a document will include <tag>qandaset</tag> titles,
+<tag>qandadiv</tag> titles,
+and <tag>question</tag> elements. The default value (zero) excludes
+them from the TOC.
+</para>
+<para>This parameter does not affect any tables of contents
+that may be generated inside a qandaset or qandadiv.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="qanda.nested.in.toc">
+<refmeta>
+<refentrytitle>qanda.nested.in.toc</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>qanda.nested.in.toc</refname>
+<refpurpose>Should nested answer/qandaentry instances appear in TOC?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="qanda.nested.in.toc.frag">
+&lt;xsl:param name="qanda.nested.in.toc" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, instances of <tag>qandaentry</tag>
+that are children of <tag>answer</tag> elements are shown in
+the TOC.</para>
+
+</refsection>
+</refentry>
+
+</reference><reference id="biblio" xml:base="../fo/param.xml"><title>Bibliography</title>
+<refentry version="5.0" id="bibliography.style">
+<refmeta>
+<refentrytitle>bibliography.style</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">list</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">normal</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">iso690</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>bibliography.style</refname>
+<refpurpose>Style used for formatting of biblioentries.</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="bibliography.style.frag">
+&lt;xsl:param name="bibliography.style"&gt;normal&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Currently only <literal>normal</literal> and
+<literal>iso690</literal> styles are supported.</para>
+
+<para>In order to use ISO690 style to the full extent you might need
+to use additional markup described on <link xlink:href="http://wiki.docbook.org/topic/ISO690Bibliography">the
+following WiKi page</link>.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="biblioentry.item.separator">
+<refmeta>
+<refentrytitle>biblioentry.item.separator</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>biblioentry.item.separator</refname>
+<refpurpose>Text to separate bibliography entries</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="biblioentry.item.separator.frag">&lt;xsl:param name="biblioentry.item.separator"&gt;. &lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Text to separate bibliography entries
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="bibliography.collection">
+<refmeta>
+<refentrytitle>bibliography.collection</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>bibliography.collection</refname>
+<refpurpose>Name of the bibliography collection file</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="bibliography.collection.frag">
+&lt;xsl:param name="bibliography.collection"&gt;http://docbook.sourceforge.net/release/bibliography/bibliography.xml&lt;/xsl:param&gt;
+
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Maintaining bibliography entries across a set of documents is tedious, time
+consuming, and error prone. It makes much more sense, usually, to store all of
+the bibliography entries in a single place and simply <quote>extract</quote>
+the ones you need in each document.</para>
+
+<para>That's the purpose of the
+<parameter>bibliography.collection</parameter> parameter. To setup a global
+bibliography <quote>database</quote>, follow these steps:</para>
+
+<para>First, create a stand-alone bibliography document that contains all of
+the documents that you wish to reference. Make sure that each bibliography
+entry (whether you use <tag>biblioentry</tag> or <tag>bibliomixed</tag>)
+has an ID.</para>
+
+<para>My global bibliography, <filename>~/bibliography.xml</filename> begins
+like this:</para>
+
+<informalexample>
+<programlisting>&lt;!DOCTYPE bibliography
+ PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN"
+ "http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd"&gt;
+&lt;bibliography&gt;&lt;title&gt;References&lt;/title&gt;
+
+&lt;bibliomixed id="xml-rec"&gt;&lt;abbrev&gt;XML 1.0&lt;/abbrev&gt;Tim Bray,
+Jean Paoli, C. M. Sperberg-McQueen, and Eve Maler, editors.
+&lt;citetitle&gt;&lt;ulink url="http://www.w3.org/TR/REC-xml"&gt;Extensible Markup
+Language (XML) 1.0 Second Edition&lt;/ulink&gt;&lt;/citetitle&gt;.
+World Wide Web Consortium, 2000.
+&lt;/bibliomixed&gt;
+
+&lt;bibliomixed id="xml-names"&gt;&lt;abbrev&gt;Namespaces&lt;/abbrev&gt;Tim Bray,
+Dave Hollander,
+and Andrew Layman, editors.
+&lt;citetitle&gt;&lt;ulink url="http://www.w3.org/TR/REC-xml-names/"&gt;Namespaces in
+XML&lt;/ulink&gt;&lt;/citetitle&gt;.
+World Wide Web Consortium, 1999.
+&lt;/bibliomixed&gt;
+
+&lt;!-- ... --&gt;
+&lt;/bibliography&gt;
+</programlisting>
+</informalexample>
+
+<para>When you create a bibliography in your document, simply
+provide <emphasis>empty</emphasis> <tag>bibliomixed</tag>
+entries for each document that you wish to cite. Make sure that these
+elements have the same ID as the corresponding <quote>real</quote>
+entry in your global bibliography.</para>
+
+<para>For example:</para>
+
+<informalexample>
+<programlisting>&lt;bibliography&gt;&lt;title&gt;Bibliography&lt;/title&gt;
+
+&lt;bibliomixed id="xml-rec"/&gt;
+&lt;bibliomixed id="xml-names"/&gt;
+&lt;bibliomixed id="DKnuth86"&gt;Donald E. Knuth. &lt;citetitle&gt;Computers and
+Typesetting: Volume B, TeX: The Program&lt;/citetitle&gt;. Addison-Wesley,
+1986. ISBN 0-201-13437-3.
+&lt;/bibliomixed&gt;
+&lt;bibliomixed id="relaxng"/&gt;
+
+&lt;/bibliography&gt;</programlisting>
+</informalexample>
+
+<para>Note that it's perfectly acceptable to mix entries from your
+global bibliography with <quote>normal</quote> entries. You can use
+<tag>xref</tag> or other elements to cross-reference your
+bibliography entries in exactly the same way you do now.</para>
+
+<para>Finally, when you are ready to format your document, simply set the
+<parameter>bibliography.collection</parameter> parameter (in either a
+customization layer or directly through your processor's interface) to
+point to your global bibliography.</para>
+
+<para>The stylesheets will format the bibliography in your document as if
+all of the entries referenced appeared there literally.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="bibliography.numbered">
+<refmeta>
+<refentrytitle>bibliography.numbered</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>bibliography.numbered</refname>
+<refpurpose>Should bibliography entries be numbered?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="bibliography.numbered.frag">
+&lt;xsl:param name="bibliography.numbered" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero bibliography entries will be numbered</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="biblioentry.properties">
+<refmeta>
+ <refentrytitle>biblioentry.properties</refentrytitle>
+ <refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>biblioentry.properties</refname>
+<refpurpose>To set the style for biblioentry.</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="biblioentry.properties.frag">&lt;xsl:attribute-set name="biblioentry.properties" use-attribute-sets="normal.para.spacing"&gt;
+ &lt;xsl:attribute name="start-indent"&gt;0.5in&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="text-indent"&gt;-0.5in&lt;/xsl:attribute&gt;
+&lt;/xsl:attribute-set&gt;
+</programlisting>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+<para>How do you want biblioentry styled? </para>
+<para>Set the font-size, weight, space-above and space-below, indents, etc. to the style required</para>
+
+</refsection>
+</refentry>
+
+</reference><reference id="glossary" xml:base="../fo/param.xml"><title>Glossary</title>
+<refentry version="5.0" id="glossterm.auto.link">
+<refmeta>
+<refentrytitle>glossterm.auto.link</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>glossterm.auto.link</refname>
+<refpurpose>Generate links from glossterm to glossentry automatically?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="glossterm.auto.link.frag">
+&lt;xsl:param name="glossterm.auto.link" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, links from inline <tag>glossterm</tag>s to the corresponding
+<tag>glossentry</tag> elements in a <tag>glossary</tag> or <tag>glosslist</tag>
+will be automatically generated. This is useful when your glossterms are consistent
+and you don't want to add links manually.</para>
+
+<para>The automatic link generation feature is not used on <tag>glossterm</tag> elements
+that have a <tag class="attribute">linkend</tag> attribute.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="firstterm.only.link">
+<refmeta>
+<refentrytitle>firstterm.only.link</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>firstterm.only.link</refname>
+<refpurpose>Does automatic glossterm linking only apply to firstterms?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="firstterm.only.link.frag">
+&lt;xsl:param name="firstterm.only.link" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, only <tag>firstterm</tag>s will be automatically linked
+to the glossary. If glossary linking is not enabled, this parameter
+has no effect.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="glossary.collection">
+<refmeta>
+<refentrytitle>glossary.collection</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>glossary.collection</refname>
+<refpurpose>Name of the glossary collection file</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="glossary.collection.frag">
+&lt;xsl:param name="glossary.collection"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Glossaries maintained independently across a set of documents
+are likely to become inconsistent unless considerable effort is
+expended to keep them in sync. It makes much more sense, usually, to
+store all of the glossary entries in a single place and simply
+<quote>extract</quote> the ones you need in each document.</para>
+
+<para>That's the purpose of the
+<parameter>glossary.collection</parameter> parameter. To setup a global
+glossary <quote>database</quote>, follow these steps:</para>
+
+<refsection><info><title>Setting Up the Glossary Database</title></info>
+
+<para>First, create a stand-alone glossary document that contains all of
+the entries that you wish to reference. Make sure that each glossary
+entry has an ID.</para>
+
+<para>Here's an example glossary:</para>
+
+<informalexample>
+<programlisting>
+&lt;?xml version="1.0" encoding="utf-8"?&gt;
+&lt;!DOCTYPE glossary
+ PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN"
+ "http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd"&gt;
+&lt;glossary&gt;
+&lt;glossaryinfo&gt;
+&lt;editor&gt;&lt;firstname&gt;Eric&lt;/firstname&gt;&lt;surname&gt;Raymond&lt;/surname&gt;&lt;/editor&gt;
+&lt;title&gt;Jargon File 4.2.3 (abridged)&lt;/title&gt;
+&lt;releaseinfo&gt;Just some test data&lt;/releaseinfo&gt;
+&lt;/glossaryinfo&gt;
+
+&lt;glossdiv&gt;&lt;title&gt;0&lt;/title&gt;
+
+&lt;glossentry&gt;
+&lt;glossterm&gt;0&lt;/glossterm&gt;
+&lt;glossdef&gt;
+&lt;para&gt;Numeric zero, as opposed to the letter `O' (the 15th letter of
+the English alphabet). In their unmodified forms they look a lot
+alike, and various kluges invented to make them visually distinct have
+compounded the confusion. If your zero is center-dotted and letter-O
+is not, or if letter-O looks almost rectangular but zero looks more
+like an American football stood on end (or the reverse), you're
+probably looking at a modern character display (though the dotted zero
+seems to have originated as an option on IBM 3270 controllers). If
+your zero is slashed but letter-O is not, you're probably looking at
+an old-style ASCII graphic set descended from the default typewheel on
+the venerable ASR-33 Teletype (Scandinavians, for whom /O is a letter,
+curse this arrangement). (Interestingly, the slashed zero long
+predates computers; Florian Cajori's monumental "A History of
+Mathematical Notations" notes that it was used in the twelfth and
+thirteenth centuries.) If letter-O has a slash across it and the zero
+does not, your display is tuned for a very old convention used at IBM
+and a few other early mainframe makers (Scandinavians curse &lt;emphasis&gt;this&lt;/emphasis&gt;
+arrangement even more, because it means two of their letters collide).
+Some Burroughs/Unisys equipment displays a zero with a &lt;emphasis&gt;reversed&lt;/emphasis&gt;
+slash. Old CDC computers rendered letter O as an unbroken oval and 0
+as an oval broken at upper right and lower left. And yet another
+convention common on early line printers left zero unornamented but
+added a tail or hook to the letter-O so that it resembled an inverted
+Q or cursive capital letter-O (this was endorsed by a draft ANSI
+standard for how to draw ASCII characters, but the final standard
+changed the distinguisher to a tick-mark in the upper-left corner).
+Are we sufficiently confused yet?&lt;/para&gt;
+&lt;/glossdef&gt;
+&lt;/glossentry&gt;
+
+&lt;glossentry&gt;
+&lt;glossterm&gt;1TBS&lt;/glossterm&gt;
+&lt;glossdef&gt;
+&lt;para role="accidence"&gt;
+&lt;phrase role="pronounce"&gt;&lt;/phrase&gt;
+&lt;phrase role="partsofspeach"&gt;n&lt;/phrase&gt;
+&lt;/para&gt;
+&lt;para&gt;The "One True Brace Style"&lt;/para&gt;
+&lt;glossseealso&gt;indent style&lt;/glossseealso&gt;
+&lt;/glossdef&gt;
+&lt;/glossentry&gt;
+
+&lt;!-- ... --&gt;
+
+&lt;/glossdiv&gt;
+
+&lt;!-- ... --&gt;
+
+&lt;/glossary&gt;</programlisting>
+</informalexample>
+
+</refsection>
+
+<refsection><info><title>Marking Up Glossary Terms</title></info>
+
+<para>That takes care of the glossary database, now you have to get the entries
+into your document. Unlike bibliography entries, which can be empty, creating
+<quote>placeholder</quote> glossary entries would be very tedious. So instead,
+support for <parameter>glossary.collection</parameter> relies on implicit linking.</para>
+
+<para>In your source document, simply use <tag>firstterm</tag> and
+<tag>glossterm</tag> to identify the terms you wish to have included
+in the glossary. The stylesheets assume that you will either set the
+<tag class="attribute">baseform</tag> attribute correctly, or that the
+content of the element exactly matches a term in your glossary.</para>
+
+<para>If you're using a <parameter>glossary.collection</parameter>, don't
+make explicit links on the terms in your document.</para>
+
+<para>So, in your document, you might write things like this:</para>
+
+<informalexample>
+<programlisting>&lt;para&gt;This is dummy text, without any real meaning.
+The point is simply to reference glossary terms like &lt;glossterm&gt;0&lt;/glossterm&gt;
+and the &lt;firstterm baseform="1TBS"&gt;One True Brace Style (1TBS)&lt;/firstterm&gt;.
+The &lt;glossterm&gt;1TBS&lt;/glossterm&gt;, as you can probably imagine, is a nearly
+religious issue.&lt;/para&gt;</programlisting>
+</informalexample>
+
+<para>If you set the <parameter>firstterm.only.link</parameter> parameter,
+only the terms marked with <tag>firstterm</tag> will be links.
+Otherwise, all the terms will be linked.</para>
+
+</refsection>
+
+<refsection><info><title>Marking Up the Glossary</title></info>
+
+<para>The glossary itself has to be identified for the stylesheets. For lack
+of a better choice, the <tag class="attribute">role</tag> is used.
+To identify the glossary as the target for automatic processing, set
+the role to <quote><literal>auto</literal></quote>. The title of this
+glossary (and any other information from the <tag>glossaryinfo</tag>
+that's rendered by your stylesheet) will be displayed, but the entries will
+come from the database.
+</para>
+
+<para>Unfortunately, the glossary can't be empty, so you must put in
+at least one <tag>glossentry</tag>. The content of this entry
+is irrelevant, it will not be rendered:</para>
+
+<informalexample>
+<programlisting>&lt;glossary role="auto"&gt;
+&lt;glossentry&gt;
+&lt;glossterm&gt;Irrelevant&lt;/glossterm&gt;
+&lt;glossdef&gt;
+&lt;para&gt;If you can see this, the document was processed incorrectly. Use
+the &lt;parameter&gt;glossary.collection&lt;/parameter&gt; parameter.&lt;/para&gt;
+&lt;/glossdef&gt;
+&lt;/glossentry&gt;
+&lt;/glossary&gt;</programlisting>
+</informalexample>
+
+<para>What about glossary divisions? If your glossary database has glossary
+divisions <emphasis>and</emphasis> your automatic glossary contains at least
+one <tag>glossdiv</tag>, the automic glossary will have divisions.
+If the <tag>glossdiv</tag> is missing from either location, no divisions
+will be rendered.</para>
+
+<para>Glossary entries (and divisions, if appropriate) in the glossary will
+occur in precisely the order they occur in your database.</para>
+
+</refsection>
+
+<refsection><info><title>Formatting the Document</title></info>
+
+<para>Finally, when you are ready to format your document, simply set the
+<parameter>glossary.collection</parameter> parameter (in either a
+customization layer or directly through your processor's interface) to
+point to your global glossary.</para>
+
+<para>The stylesheets will format the glossary in your document as if
+all of the entries implicilty referenced appeared there literally.</para>
+</refsection>
+
+<refsection><info><title>Limitations</title></info>
+
+<para>Glossary cross-references <emphasis>within the glossary</emphasis> are
+not supported. For example, this <emphasis>will not</emphasis> work:</para>
+
+<informalexample>
+<programlisting>&lt;glossentry&gt;
+&lt;glossterm&gt;gloss-1&lt;/glossterm&gt;
+&lt;glossdef&gt;&lt;para&gt;A description that references &lt;glossterm&gt;gloss-2&lt;/glossterm&gt;.&lt;/para&gt;
+&lt;glossseealso&gt;gloss-2&lt;/glossseealso&gt;
+&lt;/glossdef&gt;
+&lt;/glossentry&gt;</programlisting>
+</informalexample>
+
+<para>If you put glossary cross-references in your glossary that way,
+you'll get the cryptic error: <computeroutput>Warning:
+glossary.collection specified, but there are 0 automatic
+glossaries</computeroutput>.</para>
+
+<para>Instead, you must do two things:</para>
+
+<orderedlist>
+<listitem>
+<para>Markup your glossary using <tag>glossseealso</tag>:</para>
+
+<informalexample>
+<programlisting>&lt;glossentry&gt;
+&lt;glossterm&gt;gloss-1&lt;/glossterm&gt;
+&lt;glossdef&gt;&lt;para&gt;A description that references &lt;glossterm&gt;gloss-2&lt;/glossterm&gt;.&lt;/para&gt;
+&lt;glossseealso&gt;gloss-2&lt;/glossseealso&gt;
+&lt;/glossdef&gt;
+&lt;/glossentry&gt;</programlisting>
+</informalexample>
+</listitem>
+
+<listitem>
+<para>Make sure there is at least one <tag>glossterm</tag> reference to
+<glossterm>gloss-2</glossterm> <emphasis>in your document</emphasis>. The
+easiest way to do that is probably within a <tag>remark</tag> in your
+automatic glossary:</para>
+
+<informalexample>
+<programlisting>&lt;glossary role="auto"&gt;
+&lt;remark&gt;Make sure there's a reference to &lt;glossterm&gt;gloss-2&lt;/glossterm&gt;.&lt;/remark&gt;
+&lt;glossentry&gt;
+&lt;glossterm&gt;Irrelevant&lt;/glossterm&gt;
+&lt;glossdef&gt;
+&lt;para&gt;If you can see this, the document was processed incorrectly. Use
+the &lt;parameter&gt;glossary.collection&lt;/parameter&gt; parameter.&lt;/para&gt;
+&lt;/glossdef&gt;
+&lt;/glossentry&gt;
+&lt;/glossary&gt;</programlisting>
+</informalexample>
+</listitem>
+</orderedlist>
+</refsection>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="glossary.as.blocks">
+<refmeta>
+<refentrytitle>glossary.as.blocks</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>glossary.as.blocks</refname>
+<refpurpose>Present glossarys using blocks instead of lists?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="glossary.as.blocks.frag">
+&lt;xsl:param name="glossary.as.blocks" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, <tag>glossary</tag>s will be formatted as
+blocks.</para>
+
+<para>If you have long <tag>glossterm</tag>s, proper list
+markup in the FO case may produce unattractive lists. By setting this
+parameter, you can force the stylesheets to produce block markup
+instead of proper lists.</para>
+
+<para>You can override this setting with a processing instruction as the
+child of <tag>glossary</tag>: <tag class="xmlpi">dbfo
+glossary-presentation="blocks"</tag> or <tag class="xmlpi">dbfo
+glossary-presentation="list"</tag></para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="glosslist.as.blocks">
+<refmeta>
+<refentrytitle>glosslist.as.blocks</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>glosslist.as.blocks</refname>
+<refpurpose>Use blocks for glosslists?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="glosslist.as.blocks.frag">
+&lt;xsl:param name="glosslist.as.blocks" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>See <parameter>glossary.as.blocks</parameter>.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="glossentry.list.item.properties">
+<refmeta>
+<refentrytitle>glossentry.list.item.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>glossentry.list.item.properties</refname>
+<refpurpose>To add properties to each glossentry in a list.</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="glossentry.list.item.properties.frag">&lt;xsl:attribute-set name="glossentry.list.item.properties"&gt;
+ &lt;xsl:attribute name="space-before.optimum"&gt;1em&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="space-before.minimum"&gt;0.8em&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="space-before.maximum"&gt;1.2em&lt;/xsl:attribute&gt;
+&lt;/xsl:attribute-set&gt;
+</programlisting>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+<para>These properties are added to the fo:list-item containing a
+glossentry in a glossary when the <parameter>glossary.as.blocks</parameter> parameter
+is zero.
+Use this attribute-set to set
+spacing between entries, for example.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="glossterm.block.properties">
+<refmeta>
+<refentrytitle>glossterm.block.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>glossterm.block.properties</refname>
+<refpurpose>To add properties to the block of a glossentry's glossterm.</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="glossterm.block.properties.frag">&lt;xsl:attribute-set name="glossterm.block.properties"&gt;
+ &lt;xsl:attribute name="space-before.optimum"&gt;1em&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="space-before.minimum"&gt;0.8em&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="space-before.maximum"&gt;1.2em&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="keep-with-next.within-column"&gt;always&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="keep-together.within-column"&gt;always&lt;/xsl:attribute&gt;
+&lt;/xsl:attribute-set&gt;
+</programlisting>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+<para>These properties are added to the block containing a
+glossary term in a glossary when the <parameter>glossary.as.blocks</parameter> parameter
+is non-zero.
+Use this attribute-set to set the space above and below,
+font properties,
+and any indent for the glossary term.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="glossdef.block.properties">
+<refmeta>
+<refentrytitle>glossdef.block.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>glossdef.block.properties</refname>
+<refpurpose>To add properties to the block of a glossary definition.</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="glossdef.block.properties.frag">&lt;xsl:attribute-set name="glossdef.block.properties"&gt;
+ &lt;xsl:attribute name="margin-{$direction.align.start}"&gt;.25in&lt;/xsl:attribute&gt;
+&lt;/xsl:attribute-set&gt;
+</programlisting>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+<para>These properties are added to the block containing a
+glossary definition in a glossary when
+the <parameter>glossary.as.blocks</parameter> parameter
+is non-zero.
+Use this attribute-set to set the space above and below,
+any font properties,
+and any indent for the glossary definition.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="glossterm.list.properties">
+<refmeta>
+<refentrytitle>glossterm.list.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>glossterm.list.properties</refname>
+<refpurpose>To add properties to the glossterm in a list.</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="glossterm.list.properties.frag">
+&lt;xsl:attribute-set name="glossterm.list.properties"&gt;
+&lt;/xsl:attribute-set&gt;
+</programlisting>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+<para>These properties are added to the block containing a
+glossary term in a glossary when the <parameter>glossary.as.blocks</parameter> parameter
+is zero.
+Use this attribute-set to set
+font properties, for example.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="glossdef.list.properties">
+<refmeta>
+<refentrytitle>glossdef.list.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>glossdef.list.properties</refname>
+<refpurpose>To add properties to the glossary definition in a list.</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="glossdef.list.properties.frag">
+&lt;xsl:attribute-set name="glossdef.list.properties"&gt;
+&lt;/xsl:attribute-set&gt;
+</programlisting>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+<para>These properties are added to the block containing a
+glossary definition in a glossary when
+the <parameter>glossary.as.blocks</parameter> parameter
+is zero.
+Use this attribute-set to set font properties, for example.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="glossterm.width">
+<refmeta>
+<refentrytitle>glossterm.width</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">length</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>glossterm.width</refname>
+<refpurpose>Width of glossterm in list presentation mode</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="glossterm.width.frag">
+&lt;xsl:param name="glossterm.width"&gt;2in&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>This parameter specifies the width reserved for glossary terms when
+a list presentation is used.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="glossterm.separation">
+<refmeta>
+<refentrytitle>glossterm.separation</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">length</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>glossterm.separation</refname>
+<refpurpose>Separation between glossary terms and descriptions in list mode</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="glossterm.separation.frag">
+&lt;xsl:param name="glossterm.separation"&gt;0.25in&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies the miminum horizontal
+separation between glossary terms and descriptions when
+they are presented side-by-side using lists
+when the <parameter>glossary.as.blocks</parameter>
+is zero.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="glossentry.show.acronym">
+<refmeta>
+<refentrytitle>glossentry.show.acronym</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">list</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">no</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">yes</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">primary</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>glossentry.show.acronym</refname>
+<refpurpose>Display <tag>glossentry</tag> acronyms?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="glossentry.show.acronym.frag">
+&lt;xsl:param name="glossentry.show.acronym"&gt;no&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>A setting of <quote>yes</quote> means they should be displayed;
+<quote>no</quote> means they shouldn't. If <quote>primary</quote> is used,
+then they are shown as the primary text for the entry.</para>
+
+<note>
+<para>This setting controls both <tag>acronym</tag> and
+<tag>abbrev</tag> elements in the <tag>glossentry</tag>.</para>
+</note>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="glossary.sort">
+<refmeta>
+<refentrytitle>glossary.sort</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>glossary.sort</refname>
+<refpurpose>Sort glossentry elements?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="glossary.sort.frag">
+&lt;xsl:param name="glossary.sort" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, then the glossentry elements within a
+glossary, glossdiv, or glosslist are sorted on the glossterm, using
+the current lang setting. If zero (the default), then
+glossentry elements are not sorted and are presented
+in document order.
+</para>
+
+</refsection>
+</refentry>
+
+</reference><reference id="misc" xml:base="../fo/param.xml"><title>Miscellaneous</title>
+<refentry version="5.0" id="formal.procedures">
+<refmeta>
+<refentrytitle>formal.procedures</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>formal.procedures</refname>
+<refpurpose>Selects formal or informal procedures</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="formal.procedures.frag">
+&lt;xsl:param name="formal.procedures" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Formal procedures are numbered and always have a title.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="formal.title.placement">
+<refmeta>
+<refentrytitle>formal.title.placement</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">table</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>formal.title.placement</refname>
+<refpurpose>Specifies where formal object titles should occur</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="formal.title.placement.frag">
+&lt;xsl:param name="formal.title.placement"&gt;
+figure before
+example before
+equation before
+table before
+procedure before
+task before
+&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies where formal object titles should occur. For each formal object
+type (<tag>figure</tag>,
+<tag>example</tag>,
+<tag>equation</tag>,
+<tag>table</tag>, and <tag>procedure</tag>)
+you can specify either the keyword
+<quote><literal>before</literal></quote> or
+<quote><literal>after</literal></quote>.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="runinhead.default.title.end.punct">
+<refmeta>
+<refentrytitle>runinhead.default.title.end.punct</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>runinhead.default.title.end.punct</refname>
+<refpurpose>Default punctuation character on a run-in-head</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="runinhead.default.title.end.punct.frag">&lt;xsl:param name="runinhead.default.title.end.punct"&gt;.&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, For a <tag>formalpara</tag>, use the specified
+string as the separator between the title and following text. The period is the default value.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="runinhead.title.end.punct">
+<refmeta>
+<refentrytitle>runinhead.title.end.punct</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>runinhead.title.end.punct</refname>
+<refpurpose>Characters that count as punctuation on a run-in-head</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="runinhead.title.end.punct.frag">
+&lt;xsl:param name="runinhead.title.end.punct"&gt;.!?:&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specify which characters are to be counted as punctuation. These
+characters are checked for a match with the last character of the
+title. If no match is found, the
+<parameter>runinhead.default.title.end.punct</parameter> contents are
+inserted. This is to avoid duplicated punctuation in the output.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="show.comments">
+<refmeta>
+<refentrytitle>show.comments</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>show.comments</refname>
+<refpurpose>Display <tag>remark</tag> elements?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="show.comments.frag">
+&lt;xsl:param name="show.comments" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, comments will be displayed, otherwise they
+are suppressed. Comments here refers to the <tag>remark</tag> element
+(which was called <literal>comment</literal> prior to DocBook
+4.0), not XML comments (&lt;-- like this --&gt;) which are
+unavailable.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="punct.honorific">
+<refmeta>
+<refentrytitle>punct.honorific</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>punct.honorific</refname>
+<refpurpose>Punctuation after an honorific in a personal name.</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="punct.honorific.frag">
+&lt;xsl:param name="punct.honorific"&gt;.&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>This parameter specifies the punctuation that should be added after an
+honorific in a personal name.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="segmentedlist.as.table">
+<refmeta>
+<refentrytitle>segmentedlist.as.table</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>segmentedlist.as.table</refname>
+<refpurpose>Format segmented lists as tables?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="segmentedlist.as.table.frag">
+&lt;xsl:param name="segmentedlist.as.table" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, <tag>segmentedlist</tag>s will be formatted as
+tables.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="variablelist.as.blocks">
+<refmeta>
+<refentrytitle>variablelist.as.blocks</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>variablelist.as.blocks</refname>
+<refpurpose>Format <tag>variablelist</tag>s lists as blocks?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="variablelist.as.blocks.frag">
+&lt;xsl:param name="variablelist.as.blocks" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, <tag>variablelist</tag>s will be formatted as
+blocks.</para>
+
+<para>If you have long terms, proper list markup in the FO case may produce
+unattractive lists. By setting this parameter, you can force the stylesheets
+to produce block markup instead of proper lists.</para>
+
+<para>You can override this setting with a processing instruction as the
+child of <tag>variablelist</tag>: <tag class="xmlpi">dbfo
+list-presentation="blocks"</tag> or <tag class="xmlpi">dbfo
+list-presentation="list"</tag>.</para>
+
+<para>When using <literal>list-presentation="list"</literal>,
+you can also control the amount of space used for the <tag>term</tag>s with
+the <tag class="xmlpi">dbfo term-width=".25in"</tag> processing instruction,
+the <tag class="attribute">termlength</tag> attribute on <tag>variablelist</tag>,
+or allow the stylesheets to attempt to calculate the amount of space to leave based on the
+number of letters in the longest term.
+</para>
+
+<programlisting> &lt;variablelist&gt;
+ &lt;?dbfo list-presentation="list"?&gt;
+ &lt;?dbfo term-width="1.5in"?&gt;
+ &lt;?dbhtml list-presentation="table"?&gt;
+ &lt;?dbhtml term-width="1.5in"?&gt;
+ &lt;varlistentry&gt;
+ &lt;term&gt;list&lt;/term&gt;
+ &lt;listitem&gt;
+ &lt;para&gt;
+ Formatted as a list even if variablelist.as.blocks is set to 1.
+ &lt;/para&gt;
+ &lt;/listitem&gt;
+ &lt;/varlistentry&gt;
+ &lt;/variablelist&gt;</programlisting>
+
+
+</refsection>
+
+</refentry>
+
+<refentry version="5.0" id="blockquote.properties">
+<refmeta>
+ <refentrytitle>blockquote.properties</refentrytitle>
+ <refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>blockquote.properties</refname>
+<refpurpose>To set the style for block quotations.</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="blockquote.properties.frag">
+&lt;xsl:attribute-set name="blockquote.properties"&gt;
+&lt;xsl:attribute name="margin-{$direction.align.start}"&gt;0.5in&lt;/xsl:attribute&gt;
+&lt;xsl:attribute name="margin-{$direction.align.end}"&gt;0.5in&lt;/xsl:attribute&gt;
+&lt;xsl:attribute name="space-after.minimum"&gt;0.5em&lt;/xsl:attribute&gt;
+&lt;xsl:attribute name="space-after.optimum"&gt;1em&lt;/xsl:attribute&gt;
+&lt;xsl:attribute name="space-after.maximum"&gt;2em&lt;/xsl:attribute&gt;
+&lt;/xsl:attribute-set&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The <parameter>blockquote.properties</parameter> attribute set specifies
+the formating properties of block quotations.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="ulink.show">
+<refmeta>
+<refentrytitle>ulink.show</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>ulink.show</refname>
+<refpurpose>Display URLs after <tag>ulink</tag>s?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="ulink.show.frag">
+&lt;xsl:param name="ulink.show" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, the URL of each <tag>ulink</tag> will
+appear after the text of the link. If the text of the link and the URL
+are identical, the URL is suppressed. </para>
+
+<para>See also <parameter>ulink.footnotes</parameter>.</para>
+
+<note><para>DocBook 5 does not have an <tag>ulink</tag> element. When processing
+DocBoook 5 documents, <parameter>ulink.show</parameter> applies to all inline
+elements that are marked up with <tag class="attribute">xlink:href</tag> attributes
+that point to external resources.</para>
+</note>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="ulink.footnotes">
+<refmeta>
+<refentrytitle>ulink.footnotes</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>ulink.footnotes</refname>
+<refpurpose>Generate footnotes for <tag>ulink</tag>s?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="ulink.footnotes.frag">
+&lt;xsl:param name="ulink.footnotes" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, and if <parameter>ulink.show</parameter> also is non-zero,
+the URL of each <tag>ulink</tag> will appear as a footnote.</para>
+
+<note><para>DocBook 5 does not have an <tag>ulink</tag> element. When processing
+DocBoook 5 documents, <parameter>ulink.footnotes</parameter> applies to all inline
+elements that are marked up with <tag class="attribute">xlink:href</tag> attributes
+that point to external resources.</para>
+</note>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="ulink.hyphenate">
+<refmeta>
+<refentrytitle>ulink.hyphenate</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>ulink.hyphenate</refname>
+<refpurpose>Allow URLs to be automatically hyphenated</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="ulink.hyphenate.frag">
+&lt;xsl:param name="ulink.hyphenate"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If not empty, the specified character (or more generally, content) is
+added to URLs after every character included in the string
+in the <parameter>ulink.hyphenate.chars</parameter> parameter (default
+is <quote>/</quote>). If the character in this parameter is a
+Unicode soft hyphen (0x00AD) or Unicode zero-width space (0x200B), some FO
+processors will be able to reasonably hyphenate long URLs.</para>
+
+<para>As of 28 Jan 2002, discretionary hyphens are more widely and correctly
+supported than zero-width spaces for this purpose.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="ulink.hyphenate.chars">
+<refmeta>
+<refentrytitle>ulink.hyphenate.chars</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>ulink.hyphenate.chars</refname>
+<refpurpose>List of characters to allow ulink URLs to be automatically hyphenated on</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="ulink.hyphenate.chars.frag">
+&lt;xsl:param name="ulink.hyphenate.chars"&gt;/&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If the <parameter>ulink.hyphenate</parameter> is not empty, then
+hyphenation of ulinks is turned on, and any
+character contained in this parameter is treated as an allowable
+hyphenation point.</para>
+
+<para>The default value is <quote>/</quote>, but the parameter
+could be customized
+to contain other URL characters, as for example:</para>
+<programlisting>
+&lt;xsl:param name="ulink.hyphenate.chars"&gt;:/@&amp;?.#&lt;/xsl:param&gt;
+</programlisting>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="shade.verbatim">
+<refmeta>
+<refentrytitle>shade.verbatim</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>shade.verbatim</refname>
+<refpurpose>Should verbatim environments be shaded?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="shade.verbatim.frag">&lt;xsl:param name="shade.verbatim" select="0"&gt;&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>In the FO stylesheet, if this parameter is non-zero then the
+<property>shade.verbatim.style</property> properties will be applied
+to verbatim environments.</para>
+
+<para>In the HTML stylesheet, this parameter is now deprecated. Use
+CSS instead.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="shade.verbatim.style">
+<refmeta>
+<refentrytitle>shade.verbatim.style</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>shade.verbatim.style</refname>
+<refpurpose>Properties that specify the style of shaded verbatim listings</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="shade.verbatim.style.frag">
+
+&lt;xsl:attribute-set name="shade.verbatim.style"&gt;
+ &lt;xsl:attribute name="background-color"&gt;#E0E0E0&lt;/xsl:attribute&gt;
+&lt;/xsl:attribute-set&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Properties that specify the style of shaded verbatim listings. The
+parameters specified (the border and background color) are added to
+the styling of the xsl-fo output. A border might be specified as "thin
+black solid" for example. See <link xlink:href="http://www.w3.org/TR/2004/WD-xsl11-20041216/#border">xsl-fo</link></para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="hyphenate.verbatim">
+<refmeta>
+<refentrytitle>hyphenate.verbatim</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>hyphenate.verbatim</refname>
+<refpurpose>Should verbatim environments be hyphenated on space characters?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="hyphenate.verbatim.frag">&lt;xsl:param name="hyphenate.verbatim" select="0"&gt;&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If the lines of program listing are too long to fit into one
+line it is quite common to split them at space and indicite by hook
+arrow that code continues on the next line. You can turn on this
+behaviour for <tag>programlisting</tag>,
+<tag>screen</tag> and <tag>synopsis</tag> elements by
+using this parameter.</para>
+
+<para>Note that you must also enable line wrapping for verbatim environments and
+select appropriate hyphenation character (e.g. hook arrow). This can
+be done using <parameter>monospace.verbatim.properties</parameter>
+attribute set:</para>
+
+<programlisting>&lt;xsl:attribute-set name="monospace.verbatim.properties"
+ use-attribute-sets="verbatim.properties monospace.properties"&gt;
+ &lt;xsl:attribute name="wrap-option"&gt;wrap&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="hyphenation-character"&gt;&amp;#x25BA;&lt;/xsl:attribute&gt;
+&lt;/xsl:attribute-set&gt;</programlisting>
+
+<para>For a list of arrows available in Unicode see <uri xlink:href="http://www.unicode.org/charts/PDF/U2190.pdf">http://www.unicode.org/charts/PDF/U2190.pdf</uri> and <uri xlink:href="http://www.unicode.org/charts/PDF/U2900.pdf">http://www.unicode.org/charts/PDF/U2900.pdf</uri> and make sure that
+selected character is available in the font you are using for verbatim
+environments.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="hyphenate.verbatim.characters">
+<refmeta>
+<refentrytitle>hyphenate.verbatim.characters</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>hyphenate.verbatim.characters</refname>
+<refpurpose>List of characters after which a line break can occur in listings</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="hyphenate.verbatim.characters.frag">
+&lt;xsl:param name="hyphenate.verbatim.characters"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If you enable <parameter>hyphenate.verbatim</parameter> line
+breaks are allowed only on space characters. If this is not enough for
+your document, you can specify list of additional characters after
+which line break is allowed in this parameter.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="use.svg">
+<refmeta>
+<refentrytitle>use.svg</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>use.svg</refname>
+<refpurpose>Allow SVG in the result tree?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="use.svg.frag">
+&lt;xsl:param name="use.svg" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, SVG will be considered an acceptable image format. SVG
+is passed through to the result tree, so correct rendering of the resulting
+diagram depends on the formatter (FO processor or web browser) that is used
+to process the output from the stylesheet.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="use.role.as.xrefstyle">
+<refmeta>
+<refentrytitle>use.role.as.xrefstyle</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>use.role.as.xrefstyle</refname>
+<refpurpose>Use <tag class="attribute">role</tag> attribute for
+<tag class="attribute">xrefstyle</tag> on <tag>xref</tag>?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="use.role.as.xrefstyle.frag">
+&lt;xsl:param name="use.role.as.xrefstyle" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>In DocBook documents that conform to a schema older than V4.3, this parameter allows
+<tag class="attribute">role</tag> to serve the purpose of specifying the cross reference style.</para>
+
+<para>If non-zero, the <tag class="attribute">role</tag> attribute on
+<tag>xref</tag> will be used to select the cross reference style.
+In DocBook V4.3, the <tag class="attribute">xrefstyle</tag> attribute was added for this purpose.
+If the <tag class="attribute">xrefstyle</tag> attribute is present,
+<tag class="attribute">role</tag> will be ignored, regardless of the setting
+of this parameter.</para>
+
+</refsection>
+
+<refsection><info><title>Example</title></info>
+
+<para>The following small stylesheet shows how to configure the
+stylesheets to make use of the cross reference style:</para>
+
+<programlisting>&lt;?xml version="1.0"?&gt;
+&lt;xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="1.0"&gt;
+
+&lt;xsl:import href="../xsl/html/docbook.xsl"/&gt;
+
+&lt;xsl:output method="html"/&gt;
+
+&lt;xsl:param name="local.l10n.xml" select="document('')"/&gt;
+&lt;l:i18n xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0"&gt;
+ &lt;l:l10n xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0" language="en"&gt;
+ &lt;l:context name="xref"&gt;
+ &lt;l:template name="chapter" style="title" text="Chapter %n, %t"/&gt;
+ &lt;l:template name="chapter" text="Chapter %n"/&gt;
+ &lt;/l:context&gt;
+ &lt;/l:l10n&gt;
+&lt;/l:i18n&gt;
+
+&lt;/xsl:stylesheet&gt;</programlisting>
+
+<para>With this stylesheet, the cross references in the following document:</para>
+
+<programlisting>&lt;?xml version="1.0" encoding="utf-8"?&gt;
+&lt;!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
+ "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd"&gt;
+&lt;book id="book"&gt;&lt;title&gt;Book&lt;/title&gt;
+
+&lt;preface&gt;
+&lt;title&gt;Preface&lt;/title&gt;
+
+&lt;para&gt;Normal: &lt;xref linkend="ch1"/&gt;.&lt;/para&gt;
+&lt;para&gt;Title: &lt;xref xrefstyle="title" linkend="ch1"/&gt;.&lt;/para&gt;
+
+&lt;/preface&gt;
+
+&lt;chapter id="ch1"&gt;
+&lt;title&gt;First Chapter&lt;/title&gt;
+
+&lt;para&gt;Irrelevant.&lt;/para&gt;
+
+&lt;/chapter&gt;
+&lt;/book&gt;</programlisting>
+
+<para>will appear as:</para>
+
+<informalexample>
+<para>Normal: Chapter 1.</para>
+<para>Title: Chapter 1, <emphasis>First Chapter</emphasis>.</para>
+</informalexample>
+</refsection>
+
+</refentry>
+
+<refentry version="5.0" id="menuchoice.separator">
+<refmeta>
+<refentrytitle>menuchoice.separator</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>menuchoice.separator</refname>
+<refpurpose>Separator between items of a <tag>menuchoice</tag>
+other than <tag>guimenuitem</tag> and
+<tag>guisubmenu</tag></refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="menuchoice.separator.frag">
+&lt;xsl:param name="menuchoice.separator"&gt;+&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Separator used to connect items of a <tag>menuchoice</tag> other
+than <tag>guimenuitem</tag> and <tag>guisubmenu</tag>. The latter
+elements are linked with <parameter>menuchoice.menu.separator</parameter>.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="menuchoice.menu.separator">
+<refmeta>
+<refentrytitle>menuchoice.menu.separator</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>menuchoice.menu.separator</refname>
+<refpurpose>Separator between items of a <tag>menuchoice</tag>
+with <tag>guimenuitem</tag> or
+<tag>guisubmenu</tag></refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="menuchoice.menu.separator.frag">
+&lt;xsl:param name="menuchoice.menu.separator"&gt; &#8594; &lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Separator used to connect items of a <tag>menuchoice</tag> with
+<tag>guimenuitem</tag> or <tag>guisubmenu</tag>. Other elements
+are linked with <parameter>menuchoice.separator</parameter>.
+</para>
+<para>The default value is &amp;#x2192;, which is the
+&amp;rarr; (right arrow) character entity.
+The current FOP (0.20.5) requires setting the font-family
+explicitly.
+</para>
+<para>The default value also includes spaces around the arrow,
+which will allow a line to break. Replace the spaces with
+&amp;#xA0; (nonbreaking space) if you don't want those
+spaces to break.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="default.float.class">
+<refmeta>
+<refentrytitle>default.float.class</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>default.float.class</refname>
+<refpurpose>Specifies the default float class</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="default.float.class.frag">
+&lt;xsl:param name="default.float.class"&gt;
+ &lt;xsl:choose&gt;
+ &lt;xsl:when test="contains($stylesheet.result.type,'html')"&gt;left&lt;/xsl:when&gt;
+ &lt;xsl:otherwise&gt;before&lt;/xsl:otherwise&gt;
+ &lt;/xsl:choose&gt;
+&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Selects the direction in which a float should be placed. for
+xsl-fo this is before, for html it is left. For Western texts, the
+before direction is the top of the page.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="footnote.number.format">
+<refmeta>
+<refentrytitle>footnote.number.format</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">list</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">1<alt>1,2,3...</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">A<alt>A,B,C...</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">a<alt>a,b,c...</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">i<alt>i,ii,iii...</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">I<alt>I,II,III...</alt></refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>footnote.number.format</refname>
+<refpurpose>Identifies the format used for footnote numbers</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="footnote.number.format.frag">
+&lt;xsl:param name="footnote.number.format"&gt;1&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The <parameter>footnote.number.format</parameter> specifies the format
+to use for footnote numeration (1, i, I, a, or A).</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="table.footnote.number.format">
+<refmeta>
+<refentrytitle>table.footnote.number.format</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">list</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">1<alt>1,2,3...</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">A<alt>A,B,C...</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">a<alt>a,b,c...</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">i<alt>i,ii,iii...</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">I<alt>I,II,III...</alt></refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>table.footnote.number.format</refname>
+<refpurpose>Identifies the format used for footnote numbers in tables</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="table.footnote.number.format.frag">
+&lt;xsl:param name="table.footnote.number.format"&gt;a&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The <parameter>table.footnote.number.format</parameter> specifies the format
+to use for footnote numeration (1, i, I, a, or A) in tables.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="footnote.number.symbols">
+<refmeta>
+<refentrytitle>footnote.number.symbols</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype"/>
+</refmeta>
+<refnamediv>
+<refname>footnote.number.symbols</refname>
+<refpurpose>Special characters to use as footnote markers</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="footnote.number.symbols.frag">
+&lt;xsl:param name="footnote.number.symbols"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If <parameter>footnote.number.symbols</parameter> is not the empty string,
+footnotes will use the characters it contains as footnote symbols. For example,
+<quote>*&amp;#x2020;&amp;#x2021;&amp;#x25CA;&amp;#x2720;</quote> will identify
+footnotes with <quote>*</quote>, <quote>&#8224;</quote>, <quote>&#8225;</quote>,
+<quote>&#9674;</quote>, and <quote>&#10016;</quote>. If there are more footnotes
+than symbols, the stylesheets will fall back to numbered footnotes using
+<parameter>footnote.number.format</parameter>.</para>
+
+<para>The use of symbols for footnotes depends on the ability of your
+processor (or browser) to render the symbols you select. Not all systems are
+capable of displaying the full range of Unicode characters. If the quoted characters
+in the preceding paragraph are not displayed properly, that's a good indicator
+that you may have trouble using those symbols for footnotes.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="table.footnote.number.symbols">
+<refmeta>
+<refentrytitle>table.footnote.number.symbols</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>table.footnote.number.symbols</refname>
+<refpurpose>Special characters to use a footnote markers in tables</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="table.footnote.number.symbols.frag">
+&lt;xsl:param name="table.footnote.number.symbols"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If <parameter>table.footnote.number.symbols</parameter> is not the empty string,
+table footnotes will use the characters it contains as footnote symbols. For example,
+<quote>*&amp;#x2020;&amp;#x2021;&amp;#x25CA;&amp;#x2720;</quote> will identify
+footnotes with <quote>*</quote>, <quote>&#8224;</quote>, <quote>&#8225;</quote>,
+<quote>&#9674;</quote>, and <quote>&#10016;</quote>. If there are more footnotes
+than symbols, the stylesheets will fall back to numbered footnotes using
+<parameter>table.footnote.number.format</parameter>.</para>
+
+<para>The use of symbols for footnotes depends on the ability of your
+processor (or browser) to render the symbols you select. Not all systems are
+capable of displaying the full range of Unicode characters. If the quoted characters
+in the preceding paragraph are not displayed properly, that's a good indicator
+that you may have trouble using those symbols for footnotes.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="footnote.properties">
+<refmeta>
+<refentrytitle>footnote.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>footnote.properties</refname>
+<refpurpose>Properties applied to each footnote body
+</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="footnote.properties.frag">
+&lt;xsl:attribute-set name="footnote.properties"&gt;
+ &lt;xsl:attribute name="font-family"&gt;&lt;xsl:value-of select="$body.fontset"&gt;&lt;/xsl:value-of&gt;&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="font-size"&gt;&lt;xsl:value-of select="$footnote.font.size"&gt;&lt;/xsl:value-of&gt;&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="font-weight"&gt;normal&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="font-style"&gt;normal&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="text-align"&gt;&lt;xsl:value-of select="$alignment"&gt;&lt;/xsl:value-of&gt;&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="start-indent"&gt;0pt&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="text-indent"&gt;0pt&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="hyphenate"&gt;&lt;xsl:value-of select="$hyphenate"&gt;&lt;/xsl:value-of&gt;&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="wrap-option"&gt;wrap&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="linefeed-treatment"&gt;treat-as-space&lt;/xsl:attribute&gt;
+&lt;/xsl:attribute-set&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>This attribute set is applied to the footnote-block
+for each footnote.
+It can be used to set the
+font-size, font-family, and other inheritable properties that will be
+applied to all footnotes.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="table.footnote.properties">
+<refmeta>
+<refentrytitle>table.footnote.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>table.footnote.properties</refname>
+<refpurpose>Properties applied to each table footnote body
+</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="table.footnote.properties.frag">
+&lt;xsl:attribute-set name="table.footnote.properties"&gt;
+ &lt;xsl:attribute name="font-family"&gt;&lt;xsl:value-of select="$body.fontset"&gt;&lt;/xsl:value-of&gt;&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="font-size"&gt;&lt;xsl:value-of select="$footnote.font.size"&gt;&lt;/xsl:value-of&gt;&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="font-weight"&gt;normal&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="font-style"&gt;normal&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="space-before"&gt;2pt&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="text-align"&gt;&lt;xsl:value-of select="$alignment"&gt;&lt;/xsl:value-of&gt;&lt;/xsl:attribute&gt;
+&lt;/xsl:attribute-set&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>This attribute set is applied to the footnote-block
+for each table footnote.
+It can be used to set the
+font-size, font-family, and other inheritable properties that will be
+applied to all table footnotes.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="footnote.mark.properties">
+<refmeta>
+<refentrytitle>footnote.mark.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>footnote.mark.properties</refname>
+<refpurpose>Properties applied to each footnote mark
+</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="footnote.mark.properties.frag">
+&lt;xsl:attribute-set name="footnote.mark.properties"&gt;
+ &lt;xsl:attribute name="font-family"&gt;&lt;xsl:value-of select="$body.fontset"&gt;&lt;/xsl:value-of&gt;&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="font-size"&gt;75%&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="font-weight"&gt;normal&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="font-style"&gt;normal&lt;/xsl:attribute&gt;
+&lt;/xsl:attribute-set&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>This attribute set is applied to the footnote mark used
+for each footnote.
+It should contain only inline properties.
+</para>
+
+<para>The property to make the mark a superscript is contained in the
+footnote template itself, because the current version of FOP reports
+an error if baseline-shift is used.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="footnote.sep.leader.properties">
+<refmeta>
+<refentrytitle>footnote.sep.leader.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>footnote.sep.leader.properties</refname>
+<refpurpose>Properties associated with footnote separators</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="footnote.sep.leader.properties.frag">
+&lt;xsl:attribute-set name="footnote.sep.leader.properties"&gt;
+ &lt;xsl:attribute name="color"&gt;black&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="leader-pattern"&gt;rule&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="leader-length"&gt;1in&lt;/xsl:attribute&gt;
+&lt;/xsl:attribute-set&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The styling for the rule line that separates the
+footnotes from the body text.
+These are properties applied to the fo:leader used as
+the separator.
+</para>
+<para>If you want to do more than just set properties on
+the leader element, then you can customize the template
+named <literal>footnote.separator</literal> in
+<filename>fo/pagesetup.xsl</filename>.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="xref.with.number.and.title">
+<refmeta>
+<refentrytitle>xref.with.number.and.title</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>xref.with.number.and.title</refname>
+<refpurpose>Use number and title in cross references</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="xref.with.number.and.title.frag">
+&lt;xsl:param name="xref.with.number.and.title" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>A cross reference may include the number (for example, the number of
+an example or figure) and the <tag>title</tag> which is a required child of some
+targets. This parameter inserts both the relevant number as well as
+the title into the link. </para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="superscript.properties">
+<refmeta>
+<refentrytitle>superscript.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>superscript.properties</refname>
+<refpurpose>Properties associated with superscripts</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="superscript.properties.frag">
+&lt;xsl:attribute-set name="superscript.properties"&gt;
+ &lt;xsl:attribute name="font-size"&gt;75%&lt;/xsl:attribute&gt;
+&lt;/xsl:attribute-set&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies styling properties for superscripts.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="subscript.properties">
+<refmeta>
+<refentrytitle>subscript.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>subscript.properties</refname>
+<refpurpose>Properties associated with subscripts</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="subscript.properties.frag">
+&lt;xsl:attribute-set name="subscript.properties"&gt;
+ &lt;xsl:attribute name="font-size"&gt;75%&lt;/xsl:attribute&gt;
+&lt;/xsl:attribute-set&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies styling properties for subscripts.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="pgwide.properties">
+<refmeta>
+<refentrytitle>pgwide.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>pgwide.properties</refname>
+<refpurpose>Properties to make a figure or table page wide.
+</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="pgwide.properties.frag">
+&lt;xsl:attribute-set name="pgwide.properties"&gt;
+ &lt;xsl:attribute name="start-indent"&gt;0pt&lt;/xsl:attribute&gt;
+&lt;/xsl:attribute-set&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>This attribute set is used to set the properties
+that make a figure or table "page wide" in fo output.
+It comes into effect when an attribute <literal>pgwide="1"</literal>
+is used.
+</para>
+
+<para>
+By default, it sets <parameter>start-indent</parameter>
+to <literal>0pt</literal>.
+In a stylesheet that sets the parameter
+<parameter>body.start.indent</parameter>
+to a non-zero value in order to indent body text,
+this attribute set can be used to outdent pgwide
+figures to the start margin.
+</para>
+
+<para>If a document uses a multi-column page layout,
+then this attribute set could try setting <parameter>span</parameter>
+to a value of <literal>all</literal>. However, this may
+not work with some processors because a span property must be on an
+fo:block that is a direct child of fo:flow. It may work in
+some processors anyway.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="highlight.source">
+<refmeta>
+<refentrytitle>highlight.source</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>highlight.source</refname>
+<refpurpose>Should the content of <tag>programlisting</tag>
+be syntactically highlighted?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="highlight.source.frag">
+&lt;xsl:param name="highlight.source" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>When this parameter is non-zero, the stylesheets will try to do syntax highlighting of the
+content of <tag>programlisting</tag> elements. You specify the language for each programlisting
+by using the <tag class="attribute">language</tag> attribute. The <parameter>highlight.default.language</parameter>
+parameter can be used to specify the language for programlistings without a <tag class="attribute">language</tag>
+attribute. Syntax highlighting also works for <tag>screen</tag> and <tag>synopsis</tag> elements.</para>
+
+<para>The actual highlighting work is done by the XSLTHL extension module. This is an external Java library that has to be
+downloaded separately (see below).</para>
+
+<itemizedlist>
+<para>In order to use this extension, you must</para>
+
+<listitem><para>add <filename>xslthl-2.x.x.jar</filename> to your Java classpath. The latest version is available
+from <link xlink:href="http://sourceforge.net/projects/xslthl">the XSLT syntax highlighting project</link>
+at SourceForge.</para>
+</listitem>
+<listitem>
+<para>use a customization layer in which you import one of the following stylesheet modules:
+<itemizedlist>
+ <listitem>
+ <para><filename>html/highlight.xsl</filename>
+ </para>
+ </listitem>
+<listitem>
+ <para><filename>xhtml/highlight.xsl</filename>
+ </para>
+ </listitem>
+<listitem>
+ <para><filename>xhtml-1_1/highlight.xsl</filename>
+ </para>
+ </listitem>
+<listitem>
+ <para><filename>fo/highlight.xsl</filename>
+ </para>
+</listitem>
+</itemizedlist>
+</para>
+</listitem>
+<listitem><para>let either the <literal>xslthl.config</literal> Java system property or the
+<parameter>highlight.xslthl.config</parameter> parameter point to the configuration file for syntax
+highlighting (using URL syntax). DocBook XSL comes with a ready-to-use configuration file,
+<filename>highlighting/xslthl-config.xml</filename>.</para>
+</listitem>
+</itemizedlist>
+
+<para>The extension works with Saxon 6.5.x and Xalan-J. (Saxon 8.5 or later is also supported, but since it is
+an XSLT 2.0 processor it is not guaranteed to work with DocBook XSL in all circumstances.)</para>
+
+<para>The following is an example of a Saxon 6 command adapted for syntax highlighting, to be used on Windows:</para>
+
+<informalexample>
+<para><command>java -cp c:/Java/saxon.jar;c:/Java/xslthl-2.0.1.jar
+-Dxslthl.config=file:///c:/docbook-xsl/highlighting/xslthl-config.xml com.icl.saxon.StyleSheet
+-o test.html test.xml myhtml.xsl</command></para>
+</informalexample>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="highlight.xslthl.config">
+<refmeta>
+<refentrytitle>highlight.xslthl.config</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">uri</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>highlight.xslthl.config</refname>
+<refpurpose>Location of XSLTHL configuration file</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="highlight.xslthl.config.frag">
+&lt;xsl:param name="highlight.xslthl.config"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>This location has precedence over the corresponding Java property.</para>
+
+<para>Please note that usually you have to specify location as URL not
+just as a simple path on the local
+filesystem. E.g. <filename>file:///home/user/xslthl/my-xslthl-config.xml</filename>.</para>
+
+
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="highlight.default.language">
+<refmeta>
+<refentrytitle>highlight.default.language</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>highlight.default.language</refname>
+<refpurpose>Default language of programlisting</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="highlight.default.language.frag">
+&lt;xsl:param name="highlight.default.language"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>This language is used when there is no language attribute on programlisting.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="email.delimiters.enabled">
+<refmeta>
+<refentrytitle>email.delimiters.enabled</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>email.delimiters.enabled</refname>
+<refpurpose>Generate delimiters around email addresses?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="email.delimiters.enabled.frag">
+&lt;xsl:param name="email.delimiters.enabled" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, delimiters
+
+<footnote><para>For delimiters, the
+stylesheets are currently hard-coded to output angle
+brackets.</para></footnote>
+
+are generated around e-mail addresses
+(the output of the <tag>email</tag> element).</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="email.mailto.enabled">
+<refmeta>
+<refentrytitle>email.mailto.enabled</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>email.mailto.enabled</refname>
+<refpurpose>Generate mailto: links for email addresses?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="email.mailto.enabled.frag">
+&lt;xsl:param name="email.mailto.enabled" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero the generated output for the <tag>email</tag> element
+will be a clickable mailto: link that brings up the default mail client
+on the system.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="section.container.element">
+<refmeta>
+<refentrytitle>section.container.element</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">list</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">block</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">wrapper</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>section.container.element</refname>
+<refpurpose>Select XSL-FO element name to contain sections</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="section.container.element.frag">
+&lt;xsl:param name="section.container.element"&gt;block&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Selects the element name for outer container of
+each section. The choices are <literal>block</literal> (default)
+or <literal>wrapper</literal>.
+The <literal>fo:</literal> namespace prefix is added
+by the stylesheet to form the full element name.
+</para>
+
+<para>This element receives the section <literal>id</literal>
+attribute and the appropriate section level attribute-set.
+</para>
+
+<para>Changing this parameter to <literal>wrapper</literal>
+is only necessary when producing multi-column output
+that contains page-wide spans. Using <literal>fo:wrapper</literal>
+avoids the nesting of <literal>fo:block</literal>
+elements that prevents spans from working (the standard says
+a span must be on a block that is a direct child of
+<literal>fo:flow</literal>).
+</para>
+
+<para>If set to <literal>wrapper</literal>, the
+section attribute-sets only support properties
+that are inheritable. That's because there is no
+block to apply them to. Properties such as
+font-family are inheritable, but properties such as
+border are not.
+</para>
+
+<para>Only some XSL-FO processors need to use this parameter.
+The Antenna House processor, for example, will handle
+spans in nested blocks without changing the element name.
+The RenderX XEP product and FOP follow the XSL-FO standard
+and need to use <literal>wrapper</literal>.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="monospace.verbatim.font.width">
+<refmeta>
+<refentrytitle>monospace.verbatim.font.width</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">length</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>monospace.verbatim.font.width</refname>
+<refpurpose>Width of a single monospace font character</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="monospace.verbatim.font.width.frag">
+&lt;xsl:param name="monospace.verbatim.font.width"&gt;0.60em&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies with em units the width of a single character
+of the monospace font. The default value is <literal>0.6em</literal>.</para>
+
+<para>This parameter is only used when a <tag>screen</tag>
+or <tag>programlisting</tag> element has a
+<tag class="attribute">width</tag> attribute, which is
+expressed as a plain integer to indicate the maximum character count
+of each line.
+To convert this character count to an actual maximum width
+measurement, the width of the font characters must be provided.
+Different monospace fonts have different character width,
+so this parameter should be adjusted to fit the
+monospace font being used.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="exsl.node.set.available">
+<refmeta>
+<refentrytitle>exsl.node.set.available</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>exsl.node.set.available</refname>
+<refpurpose>Is the test function-available('exsl:node-set') true?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="exsl.node.set.available.frag">&lt;xsl:param name="exsl.node.set.available"&gt;
+ &lt;xsl:choose&gt;
+ &lt;xsl:when exsl:foo="" test="function-available('exsl:node-set') or contains(system-property('xsl:vendor'), 'Apache Software Foundation')"&gt;1&lt;/xsl:when&gt;
+ &lt;xsl:otherwise&gt;0&lt;/xsl:otherwise&gt;
+ &lt;/xsl:choose&gt;
+&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero,
+then the exsl:node-set() function is available to be used in
+the stylesheet.
+If zero, then the function is not available.
+This param automatically detects the presence of
+the function and does not normally need to be set manually.</para>
+
+<para>This param was created to handle a long-standing
+bug in the Xalan processor that fails to detect the
+function even though it is available.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="bookmarks.collapse">
+<refmeta>
+<refentrytitle>bookmarks.collapse</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>bookmarks.collapse</refname>
+<refpurpose>Specifies the initial state of bookmarks</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="bookmarks.collapse.frag">
+&lt;xsl:param name="bookmarks.collapse" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, the bookmark tree is collapsed so that only the
+top-level bookmarks are displayed initially. Otherwise, the whole tree
+of bookmarks is displayed.</para>
+
+<para>This parameter currently works with FOP 0.93 or later.</para>
+
+</refsection>
+</refentry>
+
+</reference><reference id="graphics" xml:base="../fo/param.xml"><title>Graphics</title>
+<refentry version="5.0" id="graphic.default.extension">
+<refmeta>
+<refentrytitle>graphic.default.extension</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>graphic.default.extension</refname>
+<refpurpose>Default extension for graphic filenames</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="graphic.default.extension.frag">&lt;xsl:param name="graphic.default.extension"&gt;&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If a <tag>graphic</tag> or <tag>mediaobject</tag>
+includes a reference to a filename that does not include an extension,
+and the <tag class="attribute">format</tag> attribute is
+<emphasis>unspecified</emphasis>, the default extension will be used.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="default.image.width">
+<refmeta>
+<refentrytitle>default.image.width</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">length</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>default.image.width</refname>
+<refpurpose>The default width of images</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="default.image.width.frag">
+&lt;xsl:param name="default.image.width"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If specified, this value will be used for the
+<tag class="attribute">width</tag> attribute on images that do not specify any
+<emphasis xlink:title="DocBook 5: The Definitive Guide" xlink:href="http://docbook.org/tdg5/en/html/imagedata.html#viewport.area">viewport dimensions</emphasis>.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="preferred.mediaobject.role">
+<refmeta>
+<refentrytitle>preferred.mediaobject.role</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>preferred.mediaobject.role</refname>
+<refpurpose>Select which mediaobject to use based on
+this value of an object's <tag class="attribute">role</tag> attribute.
+</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="preferred.mediaobject.role.frag">
+&lt;xsl:param name="preferred.mediaobject.role"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>A mediaobject may contain several objects such as imageobjects.
+If the parameter <parameter>use.role.for.mediaobject</parameter> is
+non-zero, then the <literal>role</literal> attribute on
+<tag>imageobject</tag>s and other objects within a
+<tag>mediaobject</tag> container will be used to select which object
+will be used. If one of the objects has a role value that matches the
+<parameter>preferred.mediaobject.role</parameter> parameter, then it
+has first priority for selection. If more than one has such a role
+value, the first one is used.
+</para>
+<para>
+See the <parameter>use.role.for.mediaobject</parameter> parameter
+for the sequence of selection.</para>
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="use.role.for.mediaobject">
+<refmeta>
+<refentrytitle>use.role.for.mediaobject</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>use.role.for.mediaobject</refname>
+<refpurpose>Use <tag class="attribute">role</tag> attribute
+value for selecting which of several objects within a mediaobject to use.
+</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="use.role.for.mediaobject.frag">
+&lt;xsl:param name="use.role.for.mediaobject" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, the <tag class="attribute">role</tag> attribute on
+<tag>imageobject</tag>s or other objects within a <tag>mediaobject</tag> container will be used to select which object will be
+used.
+</para>
+<para>
+The order of selection when then parameter is non-zero is:
+</para>
+<orderedlist>
+<listitem>
+ <para>If the stylesheet parameter <parameter>preferred.mediaobject.role</parameter> has a value, then the object whose role equals that value is selected.</para>
+</listitem>
+<listitem>
+<para>Else if an object's role attribute has a value of
+<literal>html</literal> for HTML processing or
+<literal>fo</literal> for FO output, then the first
+of such objects is selected.
+</para>
+</listitem>
+<listitem>
+<para>Else the first suitable object is selected.</para>
+</listitem>
+</orderedlist>
+<para>
+If the value of
+<parameter>use.role.for.mediaobject</parameter>
+is zero, then role attributes are not considered
+and the first suitable object
+with or without a role value is used.
+</para>
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="ignore.image.scaling">
+<refmeta>
+<refentrytitle>ignore.image.scaling</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>ignore.image.scaling</refname>
+<refpurpose>Tell the stylesheets to ignore the author's image scaling attributes</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="ignore.image.scaling.frag">
+&lt;xsl:param name="ignore.image.scaling" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, the scaling attributes on graphics and media objects are
+ignored.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="img.src.path">
+<refmeta>
+<refentrytitle>img.src.path</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>img.src.path</refname>
+<refpurpose>Path to HTML/FO image files</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="img.src.path.frag">&lt;xsl:param name="img.src.path"&gt;&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Add a path prefix to the value of the <tag class="attribute">fileref</tag>
+attribute of <tag>graphic</tag>, <tag>inlinegraphic</tag>, and <tag>imagedata</tag> elements. The resulting
+compound path is used in the output as the value of the <tag class="attribute">src</tag>
+attribute of <tag class="element">img</tag> (HTML) or <tag class="element">external-graphic</tag> (FO).
+</para>
+
+<para>
+The path given by <literal>img.src.path</literal> could be relative to the directory where the HTML/FO
+files are created, or it could be an absolute URI.
+The default value is empty.
+Be sure to include a trailing slash if needed.
+</para>
+
+<para>This prefix is not applied to any filerefs that start
+with "/" or contain "//:".
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="keep.relative.image.uris">
+<refmeta>
+<refentrytitle>keep.relative.image.uris</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>keep.relative.image.uris</refname>
+<refpurpose>Should image URIs be resolved against xml:base?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="keep.relative.image.uris.frag">
+
+&lt;xsl:param name="keep.relative.image.uris" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, relative URIs (in, for example
+<literal>fileref</literal> attributes) will be used in the generated
+output. Otherwise, the URIs will be made absolute with respect to the
+base URI.</para>
+
+<para>Note that the stylesheets calculate (and use) the absolute form
+for some purposes, this only applies to the resulting output.</para>
+
+</refsection>
+</refentry>
+
+</reference><reference id="general" xml:base="../fo/param.xml"><title>Pagination and General Styles</title>
+<partintro id="margins_partintro">
+<section id="margins_intro"><title>Understanding XSL FO Margins</title>
+
+<para>To make sense of the parameters in this section, it's useful to
+consider <xref linkend="fig.pagemodel"/>.</para>
+
+<figure id="fig.pagemodel">
+ <title>Page Model</title>
+ <mediaobject id="fo-pageregions-image">
+ <imageobject role="html">
+ <imagedata fileref="page.png"/>
+ </imageobject>
+ <imageobject role="fo">
+ <imagedata fileref="fo/page.png"/>
+ </imageobject>
+ <textobject><phrase>Figure showing page margins</phrase></textobject>
+ <textobject>
+ <para>This figure shows the physical page with the various FO page regions
+ identified.</para>
+ </textobject>
+ </mediaobject>
+</figure>
+
+<para>First, let's consider the regions on the page.</para>
+
+<para>The white region is the physical page. Its dimensions are determined by
+the <parameter>page.height</parameter> and <parameter>page.width</parameter>
+parameters.</para>
+
+<para>The yellow region is the region-body. The size and placement of
+the region body is constrained by the dimensions labelled in the
+figure.</para>
+
+<para>The pink region at the top of the page is the region-before. The
+darker area inside the region-before is the header text. In XSL, the default
+display alignment for a region is <literal>before</literal>, but the
+DocBook stylesheets still explicitly make it <literal>before</literal>. That's
+why the darker area is at the top.</para>
+
+<para>The pink region at the bottom of the page is the region-after.
+The darker area is the footer text. In XSL, the default display
+alignment for a region is <literal>before</literal>,
+but the DocBook stylesheets explicitly make it
+<literal>after</literal>. That's why the darker area is at the bottom.</para>
+
+<para>The dimensions in the figure are:</para>
+
+<orderedlist numeration="upperalpha">
+<listitem><para>The page-master margin-top.
+</para></listitem>
+<listitem><para>The region-before extent.
+</para></listitem>
+<listitem><para>The region-body margin-top.
+</para></listitem>
+<listitem><para>The region-after extent.
+</para></listitem>
+<listitem><para>The page-master margin-bottom.
+</para></listitem>
+<listitem><para>The region-body margin-bottom.
+</para></listitem>
+<listitem><para>The sum of the page-master margin-left and the
+region-body margin-left. In DocBook, the region-body margin-left is
+zero by default, so this is simply the page-master margin-left.
+</para></listitem>
+<listitem><para>The sum of the page-master margin-right and the
+region-body margin-right. In DocBook, the region-body margin-right is
+zero by default, so this is simply the page-master margin-right.
+</para></listitem>
+</orderedlist>
+
+</section>
+</partintro>
+
+<refentry version="5.0" id="page.height">
+<refmeta>
+<refentrytitle>page.height</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">length</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>page.height</refname>
+<refpurpose>The height of the physical page</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="page.height.frag">&lt;xsl:param name="page.height"&gt;
+ &lt;xsl:choose&gt;
+ &lt;xsl:when test="$page.orientation = 'portrait'"&gt;
+ &lt;xsl:value-of select="$page.height.portrait"&gt;&lt;/xsl:value-of&gt;
+ &lt;/xsl:when&gt;
+ &lt;xsl:otherwise&gt;
+ &lt;xsl:value-of select="$page.width.portrait"&gt;&lt;/xsl:value-of&gt;
+ &lt;/xsl:otherwise&gt;
+ &lt;/xsl:choose&gt;
+&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The page height is generally calculated from the
+<parameter>paper.type</parameter> and
+<parameter>page.orientation</parameter> parameters.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="page.height.portrait">
+<refmeta>
+<refentrytitle>page.height.portrait</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">length</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>page.height.portrait</refname>
+<refpurpose>Specify the physical size of the long edge of the page</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="page.height.portrait.frag">&lt;xsl:param name="page.height.portrait"&gt;
+ &lt;xsl:choose&gt;
+ &lt;xsl:when test="$paper.type = 'A4landscape'"&gt;210mm&lt;/xsl:when&gt;
+ &lt;xsl:when test="$paper.type = 'USletter'"&gt;11in&lt;/xsl:when&gt;
+ &lt;xsl:when test="$paper.type = 'USlandscape'"&gt;8.5in&lt;/xsl:when&gt;
+ &lt;xsl:when test="$paper.type = '4A0'"&gt;2378mm&lt;/xsl:when&gt;
+ &lt;xsl:when test="$paper.type = '2A0'"&gt;1682mm&lt;/xsl:when&gt;
+ &lt;xsl:when test="$paper.type = 'A0'"&gt;1189mm&lt;/xsl:when&gt;
+ &lt;xsl:when test="$paper.type = 'A1'"&gt;841mm&lt;/xsl:when&gt;
+ &lt;xsl:when test="$paper.type = 'A2'"&gt;594mm&lt;/xsl:when&gt;
+ &lt;xsl:when test="$paper.type = 'A3'"&gt;420mm&lt;/xsl:when&gt;
+ &lt;xsl:when test="$paper.type = 'A4'"&gt;297mm&lt;/xsl:when&gt;
+ &lt;xsl:when test="$paper.type = 'A5'"&gt;210mm&lt;/xsl:when&gt;
+ &lt;xsl:when test="$paper.type = 'A6'"&gt;148mm&lt;/xsl:when&gt;
+ &lt;xsl:when test="$paper.type = 'A7'"&gt;105mm&lt;/xsl:when&gt;
+ &lt;xsl:when test="$paper.type = 'A8'"&gt;74mm&lt;/xsl:when&gt;
+ &lt;xsl:when test="$paper.type = 'A9'"&gt;52mm&lt;/xsl:when&gt;
+ &lt;xsl:when test="$paper.type = 'A10'"&gt;37mm&lt;/xsl:when&gt;
+ &lt;xsl:when test="$paper.type = 'B0'"&gt;1414mm&lt;/xsl:when&gt;
+ &lt;xsl:when test="$paper.type = 'B1'"&gt;1000mm&lt;/xsl:when&gt;
+ &lt;xsl:when test="$paper.type = 'B2'"&gt;707mm&lt;/xsl:when&gt;
+ &lt;xsl:when test="$paper.type = 'B3'"&gt;500mm&lt;/xsl:when&gt;
+ &lt;xsl:when test="$paper.type = 'B4'"&gt;353mm&lt;/xsl:when&gt;
+ &lt;xsl:when test="$paper.type = 'B5'"&gt;250mm&lt;/xsl:when&gt;
+ &lt;xsl:when test="$paper.type = 'B6'"&gt;176mm&lt;/xsl:when&gt;
+ &lt;xsl:when test="$paper.type = 'B7'"&gt;125mm&lt;/xsl:when&gt;
+ &lt;xsl:when test="$paper.type = 'B8'"&gt;88mm&lt;/xsl:when&gt;
+ &lt;xsl:when test="$paper.type = 'B9'"&gt;62mm&lt;/xsl:when&gt;
+ &lt;xsl:when test="$paper.type = 'B10'"&gt;44mm&lt;/xsl:when&gt;
+ &lt;xsl:when test="$paper.type = 'C0'"&gt;1297mm&lt;/xsl:when&gt;
+ &lt;xsl:when test="$paper.type = 'C1'"&gt;917mm&lt;/xsl:when&gt;
+ &lt;xsl:when test="$paper.type = 'C2'"&gt;648mm&lt;/xsl:when&gt;
+ &lt;xsl:when test="$paper.type = 'C3'"&gt;458mm&lt;/xsl:when&gt;
+ &lt;xsl:when test="$paper.type = 'C4'"&gt;324mm&lt;/xsl:when&gt;
+ &lt;xsl:when test="$paper.type = 'C5'"&gt;229mm&lt;/xsl:when&gt;
+ &lt;xsl:when test="$paper.type = 'C6'"&gt;162mm&lt;/xsl:when&gt;
+ &lt;xsl:when test="$paper.type = 'C7'"&gt;114mm&lt;/xsl:when&gt;
+ &lt;xsl:when test="$paper.type = 'C8'"&gt;81mm&lt;/xsl:when&gt;
+ &lt;xsl:when test="$paper.type = 'C9'"&gt;57mm&lt;/xsl:when&gt;
+ &lt;xsl:when test="$paper.type = 'C10'"&gt;40mm&lt;/xsl:when&gt;
+ &lt;xsl:otherwise&gt;11in&lt;/xsl:otherwise&gt;
+ &lt;/xsl:choose&gt;
+&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The portrait page height is the length of the long
+edge of the physical page.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="page.margin.bottom">
+<refmeta>
+<refentrytitle>page.margin.bottom</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">length</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>page.margin.bottom</refname>
+<refpurpose>The bottom margin of the page</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="page.margin.bottom.frag">
+&lt;xsl:param name="page.margin.bottom"&gt;0.5in&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The bottom page margin is the distance from the bottom of the region-after
+to the physical bottom of the page.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="page.margin.inner">
+<refmeta>
+<refentrytitle>page.margin.inner</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">length</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>page.margin.inner</refname>
+<refpurpose>The inner page margin</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="page.margin.inner.frag">&lt;xsl:param name="page.margin.inner"&gt;
+ &lt;xsl:choose&gt;
+ &lt;xsl:when test="$double.sided != 0"&gt;1.25in&lt;/xsl:when&gt;
+ &lt;xsl:otherwise&gt;1in&lt;/xsl:otherwise&gt;
+ &lt;/xsl:choose&gt;
+&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The inner page margin is the distance from bound edge of the
+page to the first column of text. </para>
+
+<para>The inner page margin is the distance from bound edge of the
+page to the outer edge of the first column of text.</para>
+
+<para>In left-to-right text direction,
+this is the left margin of recto (front side) pages.
+For single-sided output, it is the left margin
+of all pages.</para>
+
+<para>In right-to-left text direction,
+this is the right margin of recto pages.
+For single-sided output, this is the
+right margin of all pages.</para>
+
+<note>
+<para>Current versions (at least as of version 4.13)
+of the XEP XSL-FO processor do not
+correctly handle these margin settings for documents
+with right-to-left text direction.
+The workaround in that situation is to reverse
+the values for <parameter>page.margin.inner</parameter>
+and <parameter>page.margin.outer</parameter>, until
+this bug is fixed by RenderX. It does not affect documents
+with left-to-right text direction.</para>
+</note>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="page.margin.outer">
+<refmeta>
+<refentrytitle>page.margin.outer</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">length</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>page.margin.outer</refname>
+<refpurpose>The outer page margin</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="page.margin.outer.frag">&lt;xsl:param name="page.margin.outer"&gt;
+ &lt;xsl:choose&gt;
+ &lt;xsl:when test="$double.sided != 0"&gt;0.75in&lt;/xsl:when&gt;
+ &lt;xsl:otherwise&gt;1in&lt;/xsl:otherwise&gt;
+ &lt;/xsl:choose&gt;
+&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The outer page margin is the distance from non-bound edge of the
+page to the outer edge of the last column of text.</para>
+
+<para>In left-to-right text direction,
+this is the right margin of recto (front side) pages.
+For single-sided output, it is the right margin
+of all pages.</para>
+
+<para>In right-to-left text direction,
+this is the left margin of recto pages.
+For single-sided output, this is the
+left margin of all pages.</para>
+
+<note>
+<para>Current versions (at least as of version 4.13)
+of the XEP XSL-FO processor do not
+correctly handle these margin settings for documents
+with right-to-left text direction.
+The workaround in that situation is to reverse
+the values for <parameter>page.margin.inner</parameter>
+and <parameter>page.margin.outer</parameter>, until
+this bug is fixed by RenderX. It does not affect documents
+with left-to-right text direction.</para>
+</note>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="page.margin.top">
+<refmeta>
+<refentrytitle>page.margin.top</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">length</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>page.margin.top</refname>
+<refpurpose>The top margin of the page</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="page.margin.top.frag">
+&lt;xsl:param name="page.margin.top"&gt;0.5in&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The top page margin is the distance from the physical top of the
+page to the top of the region-before.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="page.orientation">
+<refmeta>
+<refentrytitle>page.orientation</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">list</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">portrait</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">landscape</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>page.orientation</refname>
+<refpurpose>Select the page orientation</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="page.orientation.frag">
+&lt;xsl:param name="page.orientation"&gt;portrait&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para> Select one from portrait or landscape.
+In portrait orientation, the short edge is horizontal; in
+landscape orientation, it is vertical.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="page.width">
+<refmeta>
+<refentrytitle>page.width</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">length</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>page.width</refname>
+<refpurpose>The width of the physical page</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="page.width.frag">&lt;xsl:param name="page.width"&gt;
+ &lt;xsl:choose&gt;
+ &lt;xsl:when test="$page.orientation = 'portrait'"&gt;
+ &lt;xsl:value-of select="$page.width.portrait"&gt;&lt;/xsl:value-of&gt;
+ &lt;/xsl:when&gt;
+ &lt;xsl:otherwise&gt;
+ &lt;xsl:value-of select="$page.height.portrait"&gt;&lt;/xsl:value-of&gt;
+ &lt;/xsl:otherwise&gt;
+ &lt;/xsl:choose&gt;
+&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The page width is generally calculated from the
+<parameter>paper.type</parameter> and
+<parameter>page.orientation</parameter> parameters.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="page.width.portrait">
+<refmeta>
+<refentrytitle>page.width.portrait</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">length</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>page.width.portrait</refname>
+<refpurpose>Specify the physical size of the short edge of the page</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="page.width.portrait.frag">&lt;xsl:param name="page.width.portrait"&gt;
+ &lt;xsl:choose&gt;
+ &lt;xsl:when test="$paper.type = 'USletter'"&gt;8.5in&lt;/xsl:when&gt;
+ &lt;xsl:when test="$paper.type = '4A0'"&gt;1682mm&lt;/xsl:when&gt;
+ &lt;xsl:when test="$paper.type = '2A0'"&gt;1189mm&lt;/xsl:when&gt;
+ &lt;xsl:when test="$paper.type = 'A0'"&gt;841mm&lt;/xsl:when&gt;
+ &lt;xsl:when test="$paper.type = 'A1'"&gt;594mm&lt;/xsl:when&gt;
+ &lt;xsl:when test="$paper.type = 'A2'"&gt;420mm&lt;/xsl:when&gt;
+ &lt;xsl:when test="$paper.type = 'A3'"&gt;297mm&lt;/xsl:when&gt;
+ &lt;xsl:when test="$paper.type = 'A4'"&gt;210mm&lt;/xsl:when&gt;
+ &lt;xsl:when test="$paper.type = 'A5'"&gt;148mm&lt;/xsl:when&gt;
+ &lt;xsl:when test="$paper.type = 'A6'"&gt;105mm&lt;/xsl:when&gt;
+ &lt;xsl:when test="$paper.type = 'A7'"&gt;74mm&lt;/xsl:when&gt;
+ &lt;xsl:when test="$paper.type = 'A8'"&gt;52mm&lt;/xsl:when&gt;
+ &lt;xsl:when test="$paper.type = 'A9'"&gt;37mm&lt;/xsl:when&gt;
+ &lt;xsl:when test="$paper.type = 'A10'"&gt;26mm&lt;/xsl:when&gt;
+ &lt;xsl:when test="$paper.type = 'B0'"&gt;1000mm&lt;/xsl:when&gt;
+ &lt;xsl:when test="$paper.type = 'B1'"&gt;707mm&lt;/xsl:when&gt;
+ &lt;xsl:when test="$paper.type = 'B2'"&gt;500mm&lt;/xsl:when&gt;
+ &lt;xsl:when test="$paper.type = 'B3'"&gt;353mm&lt;/xsl:when&gt;
+ &lt;xsl:when test="$paper.type = 'B4'"&gt;250mm&lt;/xsl:when&gt;
+ &lt;xsl:when test="$paper.type = 'B5'"&gt;176mm&lt;/xsl:when&gt;
+ &lt;xsl:when test="$paper.type = 'B6'"&gt;125mm&lt;/xsl:when&gt;
+ &lt;xsl:when test="$paper.type = 'B7'"&gt;88mm&lt;/xsl:when&gt;
+ &lt;xsl:when test="$paper.type = 'B8'"&gt;62mm&lt;/xsl:when&gt;
+ &lt;xsl:when test="$paper.type = 'B9'"&gt;44mm&lt;/xsl:when&gt;
+ &lt;xsl:when test="$paper.type = 'B10'"&gt;31mm&lt;/xsl:when&gt;
+ &lt;xsl:when test="$paper.type = 'C0'"&gt;917mm&lt;/xsl:when&gt;
+ &lt;xsl:when test="$paper.type = 'C1'"&gt;648mm&lt;/xsl:when&gt;
+ &lt;xsl:when test="$paper.type = 'C2'"&gt;458mm&lt;/xsl:when&gt;
+ &lt;xsl:when test="$paper.type = 'C3'"&gt;324mm&lt;/xsl:when&gt;
+ &lt;xsl:when test="$paper.type = 'C4'"&gt;229mm&lt;/xsl:when&gt;
+ &lt;xsl:when test="$paper.type = 'C5'"&gt;162mm&lt;/xsl:when&gt;
+ &lt;xsl:when test="$paper.type = 'C6'"&gt;114mm&lt;/xsl:when&gt;
+ &lt;xsl:when test="$paper.type = 'C7'"&gt;81mm&lt;/xsl:when&gt;
+ &lt;xsl:when test="$paper.type = 'C8'"&gt;57mm&lt;/xsl:when&gt;
+ &lt;xsl:when test="$paper.type = 'C9'"&gt;40mm&lt;/xsl:when&gt;
+ &lt;xsl:when test="$paper.type = 'C10'"&gt;28mm&lt;/xsl:when&gt;
+ &lt;xsl:otherwise&gt;8.5in&lt;/xsl:otherwise&gt;
+ &lt;/xsl:choose&gt;
+&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The portrait page width is the length of the short
+edge of the physical page.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="paper.type">
+<refmeta>
+<refentrytitle>paper.type</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">list</refmiscinfo>
+<refmiscinfo class="other" otherclass="list-type">open</refmiscinfo>
+<refmiscinfo class="other" otherclass="list-type">open</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">USletter<alt>8.5x11in</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">USlandscape<alt>11x8.5in</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">USlegal<alt>8.5inx14in</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">USlegallandscape<alt>14inx8.5in</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">4A0<alt>2378x1682mm</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">2A0<alt>1682x1189mm</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">A0<alt>1189x841mm</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">A1<alt>841x594mm</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">A2<alt>594x420mm</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">A3<alt>420x297mm</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">A4<alt>297x210mm</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">A5<alt>210x148mm</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">A6<alt>148x105mm</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">A7<alt>105x74mm</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">A8<alt>74x52mm</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">A9<alt>52x37mm</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">A10<alt>37x26mm</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">B0<alt>1414x1000mm</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">B1<alt>1000x707mm</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">B2<alt>707x500mm</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">B3<alt>500x353mm</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">B4<alt>353x250mm</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">B5<alt>250x176mm</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">B6<alt>176x125mm</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">B7<alt>125x88mm</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">B8<alt>88x62mm</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">B9<alt>62x44mm</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">B10<alt>44x31mm</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">C0<alt>1297x917mm</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">C1<alt>917x648mm</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">C2<alt>648x458mm</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">C3<alt>458x324mm</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">C4<alt>324x229mm</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">C5<alt>229x162mm</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">C6<alt>162x114mm</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">C7<alt>114x81mm</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">C8<alt>81x57mm</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">C9<alt>57x40mm</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">C10<alt>40x28mm</alt></refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>paper.type</refname>
+<refpurpose>Select the paper type</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="paper.type.frag">
+&lt;xsl:param name="paper.type"&gt;USletter&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The paper type is a convenient way to specify the paper size.
+The list of known paper sizes includes USletter and most of the A,
+B, and C sizes. See <parameter>page.width.portrait</parameter>, for example.
+
+
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="double.sided">
+<refmeta>
+<refentrytitle>double.sided</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>double.sided</refname>
+<refpurpose>Is the document to be printed double sided?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="double.sided.frag">
+&lt;xsl:param name="double.sided" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Double-sided documents are printed with a slightly wider margin
+on the binding edge of the page.
+</para>
+<para>FIXME: The current set of parameters does not take writing direction
+into account.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="body.margin.bottom">
+<refmeta>
+<refentrytitle>body.margin.bottom</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">length</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>body.margin.bottom</refname>
+<refpurpose>The bottom margin of the body text</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="body.margin.bottom.frag">
+&lt;xsl:param name="body.margin.bottom"&gt;0.5in&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The body bottom margin is the distance from the last line of text
+in the page body to the bottom of the region-after.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="body.margin.top">
+<refmeta>
+<refentrytitle>body.margin.top</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">length</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>body.margin.top</refname>
+<refpurpose>To specify the size of the top margin of a page</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="body.margin.top.frag">
+&lt;xsl:param name="body.margin.top"&gt;0.5in&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The body top margin is the distance from the top of the
+region-before to the first line of text in the page body.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="body.start.indent">
+<refmeta>
+<refentrytitle>body.start.indent</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">length</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>body.start.indent</refname>
+<refpurpose>The start-indent for the body text</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="body.start.indent.frag">
+&lt;xsl:param name="body.start.indent"&gt;
+ &lt;xsl:choose&gt;
+ &lt;xsl:when test="$fop.extensions != 0"&gt;0pt&lt;/xsl:when&gt;
+ &lt;xsl:when test="$passivetex.extensions != 0"&gt;0pt&lt;/xsl:when&gt;
+ &lt;xsl:otherwise&gt;4pc&lt;/xsl:otherwise&gt;
+ &lt;/xsl:choose&gt;
+&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>This parameter provides
+the means of indenting the body text relative to
+section titles.
+For left-to-right text direction, it indents the left side.
+For right-to-left text direction, it indents the right side.
+It is used in place of the
+<parameter>title.margin.left</parameter> for
+all XSL-FO processors except FOP 0.25.
+It enables support for side floats to appear
+in the indented margin area.
+</para>
+<para>This start-indent property is added to the fo:flow
+for certain page sequences. Which page-sequences it is
+applied to is determined by the template named
+<literal>set.flow.properties</literal>.
+By default, that template adds it to the flow
+for page-sequences using the <quote>body</quote>
+master-reference, as well as appendixes and prefaces.
+</para>
+<para>If this parameter is used, section titles should have
+a start-indent value of 0pt if they are to be
+outdented relative to the body text.
+</para>
+
+<para>If you are using FOP, then set this parameter to a zero
+width value and set the <parameter>title.margin.left</parameter>
+parameter to the negative value of the desired indent.
+</para>
+
+<para>See also <parameter>body.end.indent</parameter> and
+<parameter>title.margin.left</parameter>.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="body.end.indent">
+<refmeta>
+<refentrytitle>body.end.indent</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">length</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>body.end.indent</refname>
+<refpurpose>The end-indent for the body text</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="body.end.indent.frag">
+&lt;xsl:param name="body.end.indent"&gt;0pt&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>This end-indent property is added to the fo:flow
+for certain page sequences. Which page-sequences it is
+applied to is determined by the template named
+<literal>set.flow.properties</literal>.
+By default, that template adds it to the flow
+for page-sequences using the <quote>body</quote>
+master-reference, as well as appendixes and prefaces.
+</para>
+
+<para>See also <parameter>body.start.indent</parameter>.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="alignment">
+<refmeta>
+<refentrytitle>alignment</refentrytitle>
+ <refmiscinfo class="other" otherclass="datatype">list</refmiscinfo>
+ <refmiscinfo class="other" otherclass="list-type">open</refmiscinfo>
+ <refmiscinfo class="other" otherclass="value">left</refmiscinfo>
+ <refmiscinfo class="other" otherclass="value">start</refmiscinfo>
+ <refmiscinfo class="other" otherclass="value">right</refmiscinfo>
+ <refmiscinfo class="other" otherclass="value">end</refmiscinfo>
+ <refmiscinfo class="other" otherclass="value">center</refmiscinfo>
+ <refmiscinfo class="other" otherclass="value">justify</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>alignment</refname>
+<refpurpose>Specify the default text alignment</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="alignment.frag">&lt;xsl:param name="alignment"&gt;justify&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The default text alignment is used for most body text.
+Allowed values are
+<literal>left</literal>,
+<literal>right</literal>,
+<literal>start</literal>,
+<literal>end</literal>,
+<literal>center</literal>,
+<literal>justify</literal>.
+The default value is <literal>justify</literal>.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="hyphenate">
+<refmeta>
+<refentrytitle>hyphenate</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">list</refmiscinfo>
+<refmiscinfo class="other" otherclass="list-type">closed</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">true</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">false</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>hyphenate</refname>
+<refpurpose>Specify hyphenation behavior</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="hyphenate.frag">&lt;xsl:param name="hyphenate"&gt;true&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If true, words may be hyphenated. Otherwise, they may not.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="line-height">
+<refmeta>
+<refentrytitle>line-height</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>line-height</refname>
+<refpurpose>Specify the line-height property</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="line-height.frag">
+&lt;xsl:param name="line-height"&gt;normal&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Sets the line-height property.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="column.count.back">
+<refmeta>
+<refentrytitle>column.count.back</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">integer</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>column.count.back</refname>
+<refpurpose>Number of columns on back matter pages</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="column.count.back.frag">
+&lt;xsl:param name="column.count.back" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Number of columns on back matter (appendix, glossary, etc.) pages.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="column.count.body">
+<refmeta>
+<refentrytitle>column.count.body</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">integer</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>column.count.body</refname>
+<refpurpose>Number of columns on body pages</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="column.count.body.frag">
+&lt;xsl:param name="column.count.body" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Number of columns on body pages.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="column.count.front">
+<refmeta>
+<refentrytitle>column.count.front</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">integer</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>column.count.front</refname>
+<refpurpose>Number of columns on front matter pages</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="column.count.front.frag">
+&lt;xsl:param name="column.count.front" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Number of columns on front matter (dedication, preface, etc.) pages.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="column.count.index">
+<refmeta>
+<refentrytitle>column.count.index</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">integer</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>column.count.index</refname>
+<refpurpose>Number of columns on index pages</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="column.count.index.frag">
+&lt;xsl:param name="column.count.index"&gt;2&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Number of columns on index pages.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="column.count.lot">
+<refmeta>
+<refentrytitle>column.count.lot</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">integer</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>column.count.lot</refname>
+<refpurpose>Number of columns on a 'List-of-Titles' page</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="column.count.lot.frag">
+&lt;xsl:param name="column.count.lot" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Number of columns on a page sequence containing the Table of Contents,
+List of Figures, etc.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="column.count.titlepage">
+<refmeta>
+<refentrytitle>column.count.titlepage</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">integer</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>column.count.titlepage</refname>
+<refpurpose>Number of columns on a title page</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="column.count.titlepage.frag">
+&lt;xsl:param name="column.count.titlepage" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Number of columns on a title page</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="column.gap.back">
+<refmeta>
+<refentrytitle>column.gap.back</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">length</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>column.gap.back</refname>
+<refpurpose>Gap between columns in back matter</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="column.gap.back.frag">
+&lt;xsl:param name="column.gap.back"&gt;12pt&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies the gap between columns in back matter (if
+<parameter>column.count.back</parameter> is greater than one).</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="column.gap.body">
+<refmeta>
+<refentrytitle>column.gap.body</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">length</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>column.gap.body</refname>
+<refpurpose>Gap between columns in the body</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="column.gap.body.frag">
+&lt;xsl:param name="column.gap.body"&gt;12pt&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies the gap between columns in body matter (if
+<parameter>column.count.body</parameter> is greater than one).</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="column.gap.front">
+<refmeta>
+<refentrytitle>column.gap.front</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">length</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>column.gap.front</refname>
+<refpurpose>Gap between columns in the front matter</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="column.gap.front.frag">
+&lt;xsl:param name="column.gap.front"&gt;12pt&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies the gap between columns in front matter (if
+<parameter>column.count.front</parameter> is greater than one).</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="column.gap.index">
+<refmeta>
+<refentrytitle>column.gap.index</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">length</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>column.gap.index</refname>
+<refpurpose>Gap between columns in the index</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="column.gap.index.frag">
+&lt;xsl:param name="column.gap.index"&gt;12pt&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies the gap between columns in indexes (if
+<parameter>column.count.index</parameter> is greater than one).</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="column.gap.lot">
+<refmeta>
+<refentrytitle>column.gap.lot</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">length</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>column.gap.lot</refname>
+<refpurpose>Gap between columns on a 'List-of-Titles' page</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="column.gap.lot.frag">
+&lt;xsl:param name="column.gap.lot"&gt;12pt&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies the gap between columns on 'List-of-Titles' pages (if
+<parameter>column.count.lot</parameter> is greater than one).</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="column.gap.titlepage">
+<refmeta>
+<refentrytitle>column.gap.titlepage</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">length</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>column.gap.titlepage</refname>
+<refpurpose>Gap between columns on title pages</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="column.gap.titlepage.frag">
+&lt;xsl:param name="column.gap.titlepage"&gt;12pt&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies the gap between columns on title pages (if
+<parameter>column.count.titlepage</parameter> is greater than one).</para>
+
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="region.after.extent">
+<refmeta>
+<refentrytitle>region.after.extent</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">length</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>region.after.extent</refname>
+<refpurpose>Specifies the height of the footer.</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="region.after.extent.frag">
+&lt;xsl:param name="region.after.extent"&gt;0.4in&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The region after extent is the height of the area where footers
+are printed.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="region.before.extent">
+<refmeta>
+<refentrytitle>region.before.extent</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">length</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>region.before.extent</refname>
+<refpurpose>Specifies the height of the header</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="region.before.extent.frag">
+&lt;xsl:param name="region.before.extent"&gt;0.4in&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The region before extent is the height of the area where headers
+are printed.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="default.units">
+<refmeta>
+<refentrytitle>default.units</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">list</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">cm</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">mm</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">in</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">pt</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">pc</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">px</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">em</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>default.units</refname>
+<refpurpose>Default units for an unqualified dimension</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="default.units.frag">
+&lt;xsl:param name="default.units"&gt;pt&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If an unqualified dimension is encountered (for example, in a
+graphic width), the <parameter>default.units</parameter> will be used for the
+units. Unqualified dimensions are not allowed in XSL Formatting Objects.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="normal.para.spacing">
+<refmeta>
+<refentrytitle>normal.para.spacing</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>normal.para.spacing</refname>
+<refpurpose>What space do you want between normal paragraphs</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="normal.para.spacing.frag">&lt;xsl:attribute-set name="normal.para.spacing"&gt;
+ &lt;xsl:attribute name="space-before.optimum"&gt;1em&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="space-before.minimum"&gt;0.8em&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="space-before.maximum"&gt;1.2em&lt;/xsl:attribute&gt;
+&lt;/xsl:attribute-set&gt;</programlisting>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+<para>Specify the spacing required between normal paragraphs</para>
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="body.font.master">
+<refmeta>
+<refentrytitle>body.font.master</refentrytitle>
+ <refmiscinfo class="other" otherclass="datatype">number</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>body.font.master</refname>
+<refpurpose>Specifies the default point size for body text</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="body.font.master.frag">
+&lt;xsl:param name="body.font.master"&gt;10&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The body font size is specified in two parameters
+(<parameter>body.font.master</parameter> and <parameter>body.font.size</parameter>)
+so that math can be performed on the font size by XSLT.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="body.font.size">
+<refmeta>
+<refentrytitle>body.font.size</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">length</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>body.font.size</refname>
+<refpurpose>Specifies the default font size for body text</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="body.font.size.frag">
+&lt;xsl:param name="body.font.size"&gt;
+ &lt;xsl:value-of select="$body.font.master"&gt;&lt;/xsl:value-of&gt;&lt;xsl:text&gt;pt&lt;/xsl:text&gt;
+&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The body font size is specified in two parameters
+(<parameter>body.font.master</parameter> and <parameter>body.font.size</parameter>)
+so that math can be performed on the font size by XSLT.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="footnote.font.size">
+<refmeta>
+<refentrytitle>footnote.font.size</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">length</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>footnote.font.size</refname>
+<refpurpose>The font size for footnotes</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="footnote.font.size.frag">&lt;xsl:param name="footnote.font.size"&gt;
+ &lt;xsl:value-of select="$body.font.master * 0.8"&gt;&lt;/xsl:value-of&gt;&lt;xsl:text&gt;pt&lt;/xsl:text&gt;
+&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The footnote font size is used for...footnotes!
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="title.margin.left">
+<refmeta>
+<refentrytitle>title.margin.left</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">length</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>title.margin.left</refname>
+<refpurpose>Adjust the left margin for titles</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="title.margin.left.frag">
+&lt;xsl:param name="title.margin.left"&gt;
+ &lt;xsl:choose&gt;
+ &lt;xsl:when test="$fop.extensions != 0"&gt;-4pc&lt;/xsl:when&gt;
+ &lt;xsl:when test="$passivetex.extensions != 0"&gt;0pt&lt;/xsl:when&gt;
+ &lt;xsl:otherwise&gt;0pt&lt;/xsl:otherwise&gt;
+ &lt;/xsl:choose&gt;
+&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>This parameter provides
+the means of adjusting the left margin for titles
+when the XSL-FO processor being used is
+an old version of FOP (0.25 and earlier).
+It is only useful when the <parameter>fop.extensions</parameter>
+is nonzero.</para>
+
+<para>The left margin of the body region
+is calculated to include this space,
+and titles are outdented to the left outside
+the body region by this amount,
+effectively leaving titles at the intended left margin
+and the body text indented.
+Currently this method is only used for old FOP because
+it cannot properly use the <parameter>body.start.indent</parameter>
+parameter.
+</para>
+<para>
+The default value when the <parameter>fop.extensions</parameter>
+parameter is nonzero is -4pc, which means the
+body text is indented 4 picas relative to
+the titles.
+The default value when the <parameter>fop.extensions</parameter>
+parameter equals zero is 0pt, and
+the body indent should instead be specified
+using the <parameter>body.start.indent</parameter>
+parameter.
+</para>
+<para>
+If you set the value to zero, be sure to still include
+a unit indicator such as <literal>0pt</literal>, or
+the FO processor will report errors.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="draft.mode">
+<refmeta>
+<refentrytitle>draft.mode</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">list</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">no</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">yes</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">maybe</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>draft.mode</refname>
+<refpurpose>Select draft mode</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="draft.mode.frag">
+&lt;xsl:param name="draft.mode"&gt;no&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Selects draft mode. If <parameter>draft.mode</parameter> is
+<quote><literal>yes</literal></quote>, the entire document will be treated
+as a draft. If it is <quote><literal>no</literal></quote>, the entire document
+will be treated as a final copy. If it is <quote><literal>maybe</literal></quote>,
+individual sections will be treated as draft or final independently, depending
+on how their <literal>status</literal> attribute is set.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="draft.watermark.image">
+<refmeta>
+<refentrytitle>draft.watermark.image</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">uri</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>draft.watermark.image</refname>
+<refpurpose>The URI of the image to be used for draft watermarks</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="draft.watermark.image.frag">
+&lt;xsl:param name="draft.watermark.image"&gt;images/draft.png&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The image to be used for draft watermarks.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="headers.on.blank.pages">
+<refmeta>
+<refentrytitle>headers.on.blank.pages</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>headers.on.blank.pages</refname>
+<refpurpose>Put headers on blank pages?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="headers.on.blank.pages.frag">
+&lt;xsl:param name="headers.on.blank.pages" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, headers will be placed on blank pages.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="footers.on.blank.pages">
+<refmeta>
+<refentrytitle>footers.on.blank.pages</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>footers.on.blank.pages</refname>
+<refpurpose>Put footers on blank pages?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="footers.on.blank.pages.frag">
+&lt;xsl:param name="footers.on.blank.pages" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, footers will be placed on blank pages.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="header.rule">
+<refmeta>
+<refentrytitle>header.rule</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>header.rule</refname>
+<refpurpose>Rule under headers?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="header.rule.frag">
+&lt;xsl:param name="header.rule" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, a rule will be drawn below the page headers.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="footer.rule">
+<refmeta>
+<refentrytitle>footer.rule</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>footer.rule</refname>
+<refpurpose>Rule over footers?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="footer.rule.frag">
+&lt;xsl:param name="footer.rule" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, a rule will be drawn above the page footers.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="header.column.widths">
+<refmeta>
+<refentrytitle>header.column.widths</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>header.column.widths</refname>
+<refpurpose>Specify relative widths of header areas</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv><programlisting id="header.column.widths.frag">
+&lt;xsl:param name="header.column.widths"&gt;1 1 1&lt;/xsl:param&gt;
+</programlisting></refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Page headers in print output use a three column table
+to position text at the left, center, and right side of
+the header on the page.
+This parameter lets you specify the relative sizes of the
+three columns. The default value is
+"1 1 1".</para>
+
+<para>The parameter value must be three numbers, separated
+by white space. The first number represents the relative
+width of the inside header for
+double-sided output. The second number is the relative
+width of the center header. The third number is the
+relative width of the outside header for
+double-sided output.
+</para>
+<para>For single-sided output, the first number is the
+relative width of left header for left-to-right
+text direction, or the right header for right-to-left
+text direction.
+The third number is the
+relative width of right header for left-to-right
+text direction, or the left header for right-to-left
+text direction.</para>
+
+<para>The numbers are used to specify the column widths
+for the table that makes up the header area.
+In the FO output, this looks like:
+</para>
+
+<programlisting>
+&lt;fo:table-column column-number="1"
+ column-width="proportional-column-width(1)"/&gt;
+</programlisting>
+
+<para>
+The <literal>proportional-column-width()</literal>
+function computes a column width by dividing its
+argument by the total of the arguments for all the columns, and
+then multiplying the result by the width of the whole table
+(assuming all the column specs use the function).
+Its argument can be any positive integer or floating point number.
+Zero is an acceptable value, although some FO processors
+may warn about it, in which case using a very small number might
+be more satisfactory.
+</para>
+
+<para>For example, the value "1 2 1" means the center
+header should have twice the width of the other areas.
+A value of "0 0 1" means the entire header area
+is reserved for the right (or outside) header text.
+Note that to keep the center area centered on
+the page, the left and right values must be
+the same. A specification like "1 2 3" means the
+center area is no longer centered on the page
+since the right area is three times the width of the left area.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="footer.column.widths">
+<refmeta>
+<refentrytitle>footer.column.widths</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>footer.column.widths</refname>
+<refpurpose>Specify relative widths of footer areas</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv><programlisting id="footer.column.widths.frag">
+&lt;xsl:param name="footer.column.widths"&gt;1 1 1&lt;/xsl:param&gt;
+</programlisting></refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Page footers in print output use a three column table
+to position text at the left, center, and right side of
+the footer on the page.
+This parameter lets you specify the relative sizes of the
+three columns. The default value is
+"1 1 1".</para>
+
+<para>The parameter value must be three numbers, separated
+by white space. The first number represents the relative
+width of the inside footer for
+double-sided output. The second number is the relative
+width of the center footer. The third number is the
+relative width of the outside footer for
+double-sided output.
+</para>
+<para>For single-sided output, the first number is the
+relative width of left footer for left-to-right
+text direction, or the right footer for right-to-left
+text direction.
+The third number is the
+relative width of right footer for left-to-right
+text direction, or the left footer for right-to-left
+text direction.</para>
+
+<para>The numbers are used to specify the column widths
+for the table that makes up the footer area.
+In the FO output, this looks like:
+</para>
+
+<programlisting>
+&lt;fo:table-column column-number="1"
+ column-width="proportional-column-width(1)"/&gt;
+</programlisting>
+
+<para>
+The <literal>proportional-column-width()</literal>
+function computes a column width by dividing its
+argument by the total of the arguments for all the columns, and
+then multiplying the result by the width of the whole table
+(assuming all the column specs use the function).
+Its argument can be any positive integer or floating point number.
+Zero is an acceptable value, although some FO processors
+may warn about it, in which case using a very small number might
+be more satisfactory.
+</para>
+
+<para>For example, the value "1 2 1" means the center
+footer should have twice the width of the other areas.
+A value of "0 0 1" means the entire footer area
+is reserved for the right (or outside) footer text.
+Note that to keep the center area centered on
+the page, the left and right values must be
+the same. A specification like "1 2 3" means the
+center area is no longer centered on the page
+since the right area is three times the width of the left area.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="header.table.properties">
+<refmeta>
+<refentrytitle>header.table.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>header.table.properties</refname>
+<refpurpose>Apply properties to the header layout table</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="header.table.properties.frag">
+&lt;xsl:attribute-set name="header.table.properties"&gt;
+ &lt;xsl:attribute name="table-layout"&gt;fixed&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="width"&gt;100%&lt;/xsl:attribute&gt;
+&lt;/xsl:attribute-set&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Properties applied to the table that lays out the page header.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="header.table.height">
+<refmeta>
+<refentrytitle>header.table.height</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">length</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>header.table.height</refname>
+<refpurpose>Specify the minimum height of the table containing the running page headers</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv><programlisting id="header.table.height.frag">
+&lt;xsl:param name="header.table.height"&gt;14pt&lt;/xsl:param&gt;
+</programlisting></refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Page headers in print output use a three column table
+to position text at the left, center, and right side of
+the header on the page.
+This parameter lets you specify the minimum height
+of the single row in the table.
+Since this specifies only the minimum height,
+the table should automatically grow to fit taller content.
+The default value is "14pt".</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="footer.table.properties">
+<refmeta>
+<refentrytitle>footer.table.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>footer.table.properties</refname>
+<refpurpose>Apply properties to the footer layout table</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="footer.table.properties.frag">
+&lt;xsl:attribute-set name="footer.table.properties"&gt;
+ &lt;xsl:attribute name="table-layout"&gt;fixed&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="width"&gt;100%&lt;/xsl:attribute&gt;
+&lt;/xsl:attribute-set&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Properties applied to the table that lays out the page footer.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="footer.table.height">
+<refmeta>
+<refentrytitle>footer.table.height</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">length</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>footer.table.height</refname>
+<refpurpose>Specify the minimum height of the table containing the running page footers</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv><programlisting id="footer.table.height.frag">
+&lt;xsl:param name="footer.table.height"&gt;14pt&lt;/xsl:param&gt;
+</programlisting></refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Page footers in print output use a three column table
+to position text at the left, center, and right side of
+the footer on the page.
+This parameter lets you specify the minimum height
+of the single row in the table.
+Since this specifies only the minimum height,
+the table should automatically grow to fit taller content.
+The default value is "14pt".</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="header.content.properties">
+<refmeta>
+<refentrytitle>header.content.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>header.content.properties</refname>
+<refpurpose>Properties of page header content</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="header.content.properties.frag">
+&lt;xsl:attribute-set name="header.content.properties"&gt;
+ &lt;xsl:attribute name="font-family"&gt;
+ &lt;xsl:value-of select="$body.fontset"&gt;&lt;/xsl:value-of&gt;
+ &lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="margin-left"&gt;
+ &lt;xsl:value-of select="$title.margin.left"&gt;&lt;/xsl:value-of&gt;
+ &lt;/xsl:attribute&gt;
+&lt;/xsl:attribute-set&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Properties of page header content.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="footer.content.properties">
+<refmeta>
+<refentrytitle>footer.content.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>footer.content.properties</refname>
+<refpurpose>Properties of page footer content</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="footer.content.properties.frag">
+&lt;xsl:attribute-set name="footer.content.properties"&gt;
+ &lt;xsl:attribute name="font-family"&gt;
+ &lt;xsl:value-of select="$body.fontset"&gt;&lt;/xsl:value-of&gt;
+ &lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="margin-left"&gt;
+ &lt;xsl:value-of select="$title.margin.left"&gt;&lt;/xsl:value-of&gt;
+ &lt;/xsl:attribute&gt;
+&lt;/xsl:attribute-set&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Properties of page footer content.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="marker.section.level">
+<refmeta>
+<refentrytitle>marker.section.level</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">integer</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>marker.section.level</refname>
+<refpurpose>Control depth of sections shown in running headers or footers</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="marker.section.level.frag">
+&lt;xsl:param name="marker.section.level"&gt;2&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The <parameter>marker.section.level</parameter> parameter
+controls the depth of section levels that may be displayed
+in running headers and footers. For example, if the value
+is 2 (the default), then titles from <tag>sect1</tag> and
+<tag>sect2</tag> or equivalent <tag>section</tag>
+elements are candidates for use in running headers and
+footers.
+</para>
+<para>Each candidate title is marked in the FO output with a
+<tag>&lt;fo:marker marker-class-name="section.head.marker"&gt;</tag>
+element.
+</para>
+<para>In order for such titles to appear in headers
+or footers, the <literal>header.content</literal>
+or <literal>footer.content</literal> template
+must be customized to retrieve the marker using
+an output element such as:
+</para>
+<programlisting>
+&lt;fo:retrieve-marker retrieve-class-name="section.head.marker"
+ retrieve-position="first-including-carryover"
+ retrieve-boundary="page-sequence"/&gt;
+</programlisting>
+
+
+</refsection>
+</refentry>
+
+</reference><reference id="fonts" xml:base="../fo/param.xml"><title>Font Families</title>
+<refentry version="5.0" id="body.font.family">
+<refmeta>
+<refentrytitle>body.font.family</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">list</refmiscinfo>
+<refmiscinfo class="other" otherclass="list-type">open</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">serif</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">sans-serif</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">monospace</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>body.font.family</refname>
+<refpurpose>The default font family for body text</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="body.font.family.frag">
+&lt;xsl:param name="body.font.family"&gt;serif&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The body font family is the default font used for text in the page body.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="dingbat.font.family">
+<refmeta>
+<refentrytitle>dingbat.font.family</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">list</refmiscinfo>
+<refmiscinfo class="other" otherclass="list-type">open</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">serif</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">sans-serif</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">monospace</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>dingbat.font.family</refname>
+<refpurpose>The font family for copyright, quotes, and other symbols</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="dingbat.font.family.frag">
+&lt;xsl:param name="dingbat.font.family"&gt;serif&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The dingbat font family is used for dingbats. If it is defined
+as the empty string, no font change is effected around dingbats.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="monospace.font.family">
+<refmeta>
+<refentrytitle>monospace.font.family</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>monospace.font.family</refname>
+<refpurpose>The default font family for monospace environments</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="monospace.font.family.frag">
+&lt;xsl:param name="monospace.font.family"&gt;monospace&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The monospace font family is used for verbatim environments
+(program listings, screens, etc.).
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="sans.font.family">
+<refmeta>
+<refentrytitle>sans.font.family</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>sans.font.family</refname>
+<refpurpose>The default sans-serif font family</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="sans.font.family.frag">
+&lt;xsl:param name="sans.font.family"&gt;sans-serif&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The default sans-serif font family. At the present, this isn't
+actually used by the stylesheets.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="title.font.family">
+<refmeta>
+<refentrytitle>title.font.family</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">list</refmiscinfo>
+<refmiscinfo class="other" otherclass="list-type">open</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">serif</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">sans-serif</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">monospace</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>title.font.family</refname>
+<refpurpose>The default font family for titles</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="title.font.family.frag">
+&lt;xsl:param name="title.font.family"&gt;sans-serif&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The title font family is used for titles (chapter, section, figure,
+etc.)
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="symbol.font.family">
+<refmeta>
+<refentrytitle>symbol.font.family</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">list</refmiscinfo>
+<refmiscinfo class="other" otherclass="list-type">open</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">serif</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">sans-serif</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">monospace</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>symbol.font.family</refname>
+<refpurpose>The font families to be searched for symbols outside
+ of the body font</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="symbol.font.family.frag">
+&lt;xsl:param name="symbol.font.family"&gt;Symbol,ZapfDingbats&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>A typical body or title font does not contain all
+the character glyphs that DocBook supports. This parameter
+specifies additional fonts that should be searched for
+special characters not in the normal font.
+These symbol font names are automatically appended
+to the body or title font family name when fonts
+are specified in a
+<tag class="attribute">font-family</tag>
+property in the FO output.
+</para>
+<para>The symbol font names should be entered as a
+comma-separated list. The default value is
+<literal>Symbol,ZapfDingbats</literal>.
+</para>
+
+</refsection>
+</refentry>
+
+</reference><reference id="propsets" xml:base="../fo/param.xml"><title>Property Sets</title>
+<refentry version="5.0" id="formal.object.properties">
+<refmeta>
+<refentrytitle>formal.object.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>formal.object.properties</refname>
+<refpurpose>Properties associated with a formal object such as a figure, or other component that has a title</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="formal.object.properties.frag">
+&lt;xsl:attribute-set name="formal.object.properties"&gt;
+ &lt;xsl:attribute name="space-before.minimum"&gt;0.5em&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="space-before.optimum"&gt;1em&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="space-before.maximum"&gt;2em&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="space-after.minimum"&gt;0.5em&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="space-after.optimum"&gt;1em&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="space-after.maximum"&gt;2em&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="keep-together.within-column"&gt;always&lt;/xsl:attribute&gt;
+&lt;/xsl:attribute-set&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The styling for formal objects in docbook. Specify the spacing
+before and after the object.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="formal.title.properties">
+<refmeta>
+<refentrytitle>formal.title.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>formal.title.properties</refname>
+<refpurpose>Style the title element of formal object such as a figure.</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="formal.title.properties.frag">
+&lt;xsl:attribute-set name="formal.title.properties" use-attribute-sets="normal.para.spacing"&gt;
+ &lt;xsl:attribute name="font-weight"&gt;bold&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="font-size"&gt;
+ &lt;xsl:value-of select="$body.font.master * 1.2"&gt;&lt;/xsl:value-of&gt;
+ &lt;xsl:text&gt;pt&lt;/xsl:text&gt;
+ &lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="hyphenate"&gt;false&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="space-after.minimum"&gt;0.4em&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="space-after.optimum"&gt;0.6em&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="space-after.maximum"&gt;0.8em&lt;/xsl:attribute&gt;
+&lt;/xsl:attribute-set&gt;
+</programlisting>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+<para>Specify how the title should be styled. Specify the font size and weight of the title of the formal object.</para>
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="informal.object.properties">
+<refmeta>
+<refentrytitle>informal.object.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>informal.object.properties</refname>
+<refpurpose>Properties associated with an informal (untitled) object, such as an informalfigure</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="informal.object.properties.frag">&lt;xsl:attribute-set name="informal.object.properties"&gt;
+ &lt;xsl:attribute name="space-before.minimum"&gt;0.5em&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="space-before.optimum"&gt;1em&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="space-before.maximum"&gt;2em&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="space-after.minimum"&gt;0.5em&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="space-after.optimum"&gt;1em&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="space-after.maximum"&gt;2em&lt;/xsl:attribute&gt;
+&lt;/xsl:attribute-set&gt;</programlisting>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+<para>The styling for informal objects in docbook. Specify the spacing before and after the object.</para>
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="monospace.properties">
+<refmeta>
+<refentrytitle>monospace.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>monospace.properties</refname>
+<refpurpose>Properties of monospaced content</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="monospace.properties.frag">
+&lt;xsl:attribute-set name="monospace.properties"&gt;
+ &lt;xsl:attribute name="font-family"&gt;
+ &lt;xsl:value-of select="$monospace.font.family"&gt;&lt;/xsl:value-of&gt;
+ &lt;/xsl:attribute&gt;
+&lt;/xsl:attribute-set&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies the font name for monospaced output. This property set
+used to set the font-size as well, but that doesn't work very well
+when different fonts are used (as they are in titles and paragraphs,
+for example).</para>
+
+<para>If you want to set the font-size in a customization layer, it's
+probably going to be more appropriate to set font-size-adjust, if your
+formatter supports it.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="verbatim.properties">
+<refmeta>
+<refentrytitle>verbatim.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>verbatim.properties</refname>
+<refpurpose>Properties associated with verbatim text</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="verbatim.properties.frag">
+&lt;xsl:attribute-set name="verbatim.properties"&gt;
+ &lt;xsl:attribute name="space-before.minimum"&gt;0.8em&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="space-before.optimum"&gt;1em&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="space-before.maximum"&gt;1.2em&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="space-after.minimum"&gt;0.8em&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="space-after.optimum"&gt;1em&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="space-after.maximum"&gt;1.2em&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="hyphenate"&gt;false&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="wrap-option"&gt;no-wrap&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="white-space-collapse"&gt;false&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="white-space-treatment"&gt;preserve&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="linefeed-treatment"&gt;preserve&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="text-align"&gt;start&lt;/xsl:attribute&gt;
+&lt;/xsl:attribute-set&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+<para>This attribute set is used on all verbatim environments.</para>
+</refsection>
+
+</refentry>
+
+<refentry version="5.0" id="monospace.verbatim.properties">
+<refmeta>
+<refentrytitle>monospace.verbatim.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>monospace.verbatim.properties</refname>
+<refpurpose>What font and size do you want for monospaced content?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="monospace.verbatim.properties.frag">
+&lt;xsl:attribute-set name="monospace.verbatim.properties" use-attribute-sets="verbatim.properties monospace.properties"&gt;
+ &lt;xsl:attribute name="text-align"&gt;start&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="wrap-option"&gt;no-wrap&lt;/xsl:attribute&gt;
+&lt;/xsl:attribute-set&gt;
+</programlisting>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+<para>Specify the font name and size you want for monospaced output</para>
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="sidebar.properties">
+<refmeta>
+<refentrytitle>sidebar.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>sidebar.properties</refname>
+<refpurpose>Attribute set for sidebar properties</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="sidebar.properties.frag">
+&lt;xsl:attribute-set name="sidebar.properties" use-attribute-sets="formal.object.properties"&gt;
+ &lt;xsl:attribute name="border-style"&gt;solid&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="border-width"&gt;1pt&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="border-color"&gt;black&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="background-color"&gt;#DDDDDD&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="padding-start"&gt;12pt&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="padding-end"&gt;12pt&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="padding-top"&gt;6pt&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="padding-bottom"&gt;6pt&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="margin-{$direction.align.start}"&gt;0pt&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="margin-{$direction.align.end}"&gt;0pt&lt;/xsl:attribute&gt;
+&lt;!--
+ &lt;xsl:attribute name="margin-top"&gt;6pt&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="margin-bottom"&gt;6pt&lt;/xsl:attribute&gt;
+--&gt;
+&lt;/xsl:attribute-set&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The styling for sidebars.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="sidebar.title.properties">
+<refmeta>
+<refentrytitle>sidebar.title.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>sidebar.title.properties</refname>
+<refpurpose>Attribute set for sidebar titles</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="sidebar.title.properties.frag">
+&lt;xsl:attribute-set name="sidebar.title.properties"&gt;
+ &lt;xsl:attribute name="font-weight"&gt;bold&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="hyphenate"&gt;false&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="text-align"&gt;start&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="keep-with-next.within-column"&gt;always&lt;/xsl:attribute&gt;
+&lt;/xsl:attribute-set&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The styling for sidebars titles.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="sidebar.float.type">
+<refmeta>
+<refentrytitle>sidebar.float.type</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">list</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">none</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">before</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">left</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">start</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">right</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">end</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">inside</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">outside</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>sidebar.float.type</refname>
+<refpurpose>Select type of float for sidebar elements</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="sidebar.float.type.frag">
+&lt;xsl:param name="sidebar.float.type"&gt;none&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Selects the type of float for sidebar elements.
+</para>
+<itemizedlist>
+<listitem>
+<para>If <parameter>sidebar.float.type</parameter> is
+<quote><literal>none</literal></quote>, then
+no float is used.
+</para>
+</listitem>
+<listitem>
+<para>If <parameter>sidebar.float.type</parameter> is
+<quote><literal>before</literal></quote>, then
+the float appears at the top of the page. On some processors,
+that may be the next page rather than the current page.
+</para>
+</listitem>
+
+<listitem>
+<para>If <parameter>sidebar.float.type</parameter> is
+<quote><literal>left</literal></quote>,
+then a left side float is used.
+</para>
+</listitem>
+
+<listitem>
+<para>If <parameter>sidebar.float.type</parameter> is
+<quote><literal>start</literal></quote>,
+then when the text direction is left-to-right a left side float is used.
+When the text direction is right-to-left, a right side float is used.
+</para>
+</listitem>
+
+<listitem>
+<para>If <parameter>sidebar.float.type</parameter> is
+<quote><literal>right</literal></quote>,
+then a right side float is used.
+</para>
+</listitem>
+
+<listitem>
+<para>If <parameter>sidebar.float.type</parameter> is
+<quote><literal>end</literal></quote>,
+then when the text direction is left-to-right a right side float is used.
+When the text direction is right-to-left, a left side float is used.
+</para>
+</listitem>
+
+<listitem>
+<para>If your XSL-FO processor supports floats positioned on the
+<quote><literal>inside</literal></quote> or
+<quote><literal>outside</literal></quote>
+of double-sided pages, then you have those two
+options for side floats as well.
+</para>
+</listitem>
+</itemizedlist>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="sidebar.float.width">
+<refmeta>
+<refentrytitle>sidebar.float.width</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">length</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>sidebar.float.width</refname>
+<refpurpose>Set the default width for sidebars</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="sidebar.float.width.frag">
+&lt;xsl:param name="sidebar.float.width"&gt;1in&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Sets the default width for sidebars when used as a side float.
+The width determines the degree to which the sidebar block intrudes into
+the text area.
+</para>
+<para>If <parameter>sidebar.float.type</parameter> is
+<quote><literal>before</literal></quote> or
+<quote><literal>none</literal></quote>, then
+this parameter is ignored.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="margin.note.properties">
+<refmeta>
+<refentrytitle>margin.note.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>margin.note.properties</refname>
+<refpurpose>Attribute set for margin.note properties</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="margin.note.properties.frag">
+&lt;xsl:attribute-set name="margin.note.properties"&gt;
+ &lt;xsl:attribute name="font-size"&gt;90%&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="text-align"&gt;start&lt;/xsl:attribute&gt;
+&lt;/xsl:attribute-set&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The styling for margin notes.
+By default, margin notes are not implemented for any
+element. A stylesheet customization is needed to make
+use of this attribute-set.</para>
+
+<para>You can use a template named <quote>floater</quote>
+to create the customization.
+That template can create side floats by specifying the
+content and characteristics as template parameters.
+</para>
+
+<para>For example:</para>
+<programlisting>&lt;xsl:template match="para[@role='marginnote']"&gt;
+ &lt;xsl:call-template name="floater"&gt;
+ &lt;xsl:with-param name="position"&gt;
+ &lt;xsl:value-of select="$margin.note.float.type"/&gt;
+ &lt;/xsl:with-param&gt;
+ &lt;xsl:with-param name="width"&gt;
+ &lt;xsl:value-of select="$margin.note.width"/&gt;
+ &lt;/xsl:with-param&gt;
+ &lt;xsl:with-param name="content"&gt;
+ &lt;xsl:apply-imports/&gt;
+ &lt;/xsl:with-param&gt;
+ &lt;/xsl:call-template&gt;
+&lt;/xsl:template&gt;</programlisting>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="margin.note.title.properties">
+<refmeta>
+<refentrytitle>margin.note.title.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>margin.note.title.properties</refname>
+<refpurpose>Attribute set for margin note titles</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="margin.note.title.properties.frag">
+&lt;xsl:attribute-set name="margin.note.title.properties"&gt;
+ &lt;xsl:attribute name="font-weight"&gt;bold&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="hyphenate"&gt;false&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="text-align"&gt;start&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="keep-with-next.within-column"&gt;always&lt;/xsl:attribute&gt;
+&lt;/xsl:attribute-set&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The styling for margin note titles.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="margin.note.float.type">
+<refmeta>
+<refentrytitle>margin.note.float.type</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">list</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">none</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">before</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">left</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">start</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">right</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">end</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">inside</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">outside</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>margin.note.float.type</refname>
+<refpurpose>Select type of float for margin note customizations</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="margin.note.float.type.frag">
+&lt;xsl:param name="margin.note.float.type"&gt;none&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Selects the type of float for margin notes.
+DocBook does not define a margin note element, so this
+feature must be implemented as a customization of the stylesheet.
+See <parameter>margin.note.properties</parameter> for
+an example.
+</para>
+<itemizedlist>
+<listitem>
+<para>If <parameter>margin.note.float.type</parameter> is
+<quote><literal>none</literal></quote>, then
+no float is used.
+</para>
+</listitem>
+<listitem>
+<para>If <parameter>margin.note.float.type</parameter> is
+<quote><literal>before</literal></quote>, then
+the float appears at the top of the page. On some processors,
+that may be the next page rather than the current page.
+</para>
+</listitem>
+<listitem>
+<para>If <parameter>margin.note.float.type</parameter> is
+<quote><literal>left</literal></quote> or
+<quote><literal>start</literal></quote>, then
+a left side float is used.
+</para>
+</listitem>
+<listitem>
+<para>If <parameter>margin.note.float.type</parameter> is
+<quote><literal>right</literal></quote> or
+<quote><literal>end</literal></quote>, then
+a right side float is used.
+</para>
+</listitem>
+<listitem>
+<para>If your XSL-FO processor supports floats positioned on the
+<quote><literal>inside</literal></quote> or
+<quote><literal>outside</literal></quote>
+of double-sided pages, then you have those two
+options for side floats as well.
+</para>
+</listitem>
+</itemizedlist>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="margin.note.width">
+<refmeta>
+<refentrytitle>margin.note.width</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">length</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>margin.note.width</refname>
+<refpurpose>Set the default width for margin notes</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="margin.note.width.frag">
+&lt;xsl:param name="margin.note.width"&gt;1in&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Sets the default width for margin notes when used as a side
+float. The width determines the degree to which the margin note block
+intrudes into the text area.
+</para>
+<para>If <parameter>margin.note.float.type</parameter> is
+<quote><literal>before</literal></quote> or
+<quote><literal>none</literal></quote>, then
+this parameter is ignored.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="component.title.properties">
+<refmeta>
+<refentrytitle>component.title.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>component.title.properties</refname>
+<refpurpose>Properties for component titles</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="component.title.properties.frag">
+&lt;xsl:attribute-set name="component.title.properties"&gt;
+ &lt;xsl:attribute name="keep-with-next.within-column"&gt;always&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="space-before.optimum"&gt;&lt;xsl:value-of select="concat($body.font.master, 'pt')"&gt;&lt;/xsl:value-of&gt;&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="space-before.minimum"&gt;&lt;xsl:value-of select="concat($body.font.master, 'pt * 0.8')"&gt;&lt;/xsl:value-of&gt;&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="space-before.maximum"&gt;&lt;xsl:value-of select="concat($body.font.master, 'pt * 1.2')"&gt;&lt;/xsl:value-of&gt;&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="hyphenate"&gt;false&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="text-align"&gt;
+ &lt;xsl:choose&gt;
+ &lt;xsl:when test="((parent::article | parent::articleinfo | parent::info/parent::article) and not(ancestor::book) and not(self::bibliography)) or (parent::slides | parent::slidesinfo)"&gt;center&lt;/xsl:when&gt;
+ &lt;xsl:otherwise&gt;start&lt;/xsl:otherwise&gt;
+ &lt;/xsl:choose&gt;
+ &lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="start-indent"&gt;&lt;xsl:value-of select="$title.margin.left"&gt;&lt;/xsl:value-of&gt;&lt;/xsl:attribute&gt;
+&lt;/xsl:attribute-set&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The properties common to all component titles.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="component.titlepage.properties">
+<refmeta>
+<refentrytitle>component.titlepage.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>component.titlepage.properties</refname>
+<refpurpose>Properties for component titlepages</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="component.titlepage.properties.frag">
+&lt;xsl:attribute-set name="component.titlepage.properties"&gt;
+&lt;/xsl:attribute-set&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The properties that are applied to the outer block containing
+all the component title page information.
+Its main use is to set a <literal>span="all"</literal>
+property on the block that is a direct child of the flow.</para>
+
+<para>This attribute-set also applies to index titlepages. It is empty by default.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="section.title.properties">
+<refmeta>
+<refentrytitle>section.title.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>section.title.properties</refname>
+<refpurpose>Properties for section titles</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="section.title.properties.frag">
+&lt;xsl:attribute-set name="section.title.properties"&gt;
+ &lt;xsl:attribute name="font-family"&gt;
+ &lt;xsl:value-of select="$title.font.family"&gt;&lt;/xsl:value-of&gt;
+ &lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="font-weight"&gt;bold&lt;/xsl:attribute&gt;
+ &lt;!-- font size is calculated dynamically by section.heading template --&gt;
+ &lt;xsl:attribute name="keep-with-next.within-column"&gt;always&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="space-before.minimum"&gt;0.8em&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="space-before.optimum"&gt;1.0em&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="space-before.maximum"&gt;1.2em&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="text-align"&gt;start&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="start-indent"&gt;&lt;xsl:value-of select="$title.margin.left"&gt;&lt;/xsl:value-of&gt;&lt;/xsl:attribute&gt;
+&lt;/xsl:attribute-set&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The properties common to all section titles.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="section.title.level1.properties">
+<refmeta>
+<refentrytitle>section.title.level1.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>section.title.level1.properties</refname>
+<refpurpose>Properties for level-1 section titles</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="section.title.level1.properties.frag">
+&lt;xsl:attribute-set name="section.title.level1.properties"&gt;
+ &lt;xsl:attribute name="font-size"&gt;
+ &lt;xsl:value-of select="$body.font.master * 2.0736"&gt;&lt;/xsl:value-of&gt;
+ &lt;xsl:text&gt;pt&lt;/xsl:text&gt;
+ &lt;/xsl:attribute&gt;
+&lt;/xsl:attribute-set&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The properties of level-1 section titles.</para>
+
+</refsection>
+</refentry>
+
+
+<refentry version="5.0" id="section.title.level2.properties">
+<refmeta>
+<refentrytitle>section.title.level2.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>section.title.level2.properties</refname>
+<refpurpose>Properties for level-2 section titles</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="section.title.level2.properties.frag">
+&lt;xsl:attribute-set name="section.title.level2.properties"&gt;
+ &lt;xsl:attribute name="font-size"&gt;
+ &lt;xsl:value-of select="$body.font.master * 1.728"&gt;&lt;/xsl:value-of&gt;
+ &lt;xsl:text&gt;pt&lt;/xsl:text&gt;
+ &lt;/xsl:attribute&gt;
+&lt;/xsl:attribute-set&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The properties of level-2 section titles.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="section.title.level3.properties">
+<refmeta>
+<refentrytitle>section.title.level3.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>section.title.level3.properties</refname>
+<refpurpose>Properties for level-3 section titles</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="section.title.level3.properties.frag">
+&lt;xsl:attribute-set name="section.title.level3.properties"&gt;
+ &lt;xsl:attribute name="font-size"&gt;
+ &lt;xsl:value-of select="$body.font.master * 1.44"&gt;&lt;/xsl:value-of&gt;
+ &lt;xsl:text&gt;pt&lt;/xsl:text&gt;
+ &lt;/xsl:attribute&gt;
+&lt;/xsl:attribute-set&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The properties of level-3 section titles.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="section.title.level4.properties">
+<refmeta>
+<refentrytitle>section.title.level4.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>section.title.level4.properties</refname>
+<refpurpose>Properties for level-4 section titles</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="section.title.level4.properties.frag">
+&lt;xsl:attribute-set name="section.title.level4.properties"&gt;
+ &lt;xsl:attribute name="font-size"&gt;
+ &lt;xsl:value-of select="$body.font.master * 1.2"&gt;&lt;/xsl:value-of&gt;
+ &lt;xsl:text&gt;pt&lt;/xsl:text&gt;
+ &lt;/xsl:attribute&gt;
+&lt;/xsl:attribute-set&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The properties of level-4 section titles.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="section.title.level5.properties">
+<refmeta>
+<refentrytitle>section.title.level5.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>section.title.level5.properties</refname>
+<refpurpose>Properties for level-5 section titles</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="section.title.level5.properties.frag">
+&lt;xsl:attribute-set name="section.title.level5.properties"&gt;
+ &lt;xsl:attribute name="font-size"&gt;
+ &lt;xsl:value-of select="$body.font.master"&gt;&lt;/xsl:value-of&gt;
+ &lt;xsl:text&gt;pt&lt;/xsl:text&gt;
+ &lt;/xsl:attribute&gt;
+&lt;/xsl:attribute-set&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The properties of level-5 section titles.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="section.title.level6.properties">
+<refmeta>
+<refentrytitle>section.title.level6.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>section.title.level6.properties</refname>
+<refpurpose>Properties for level-6 section titles</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="section.title.level6.properties.frag">
+&lt;xsl:attribute-set name="section.title.level6.properties"&gt;
+ &lt;xsl:attribute name="font-size"&gt;
+ &lt;xsl:value-of select="$body.font.master"&gt;&lt;/xsl:value-of&gt;
+ &lt;xsl:text&gt;pt&lt;/xsl:text&gt;
+ &lt;/xsl:attribute&gt;
+&lt;/xsl:attribute-set&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The properties of level-6 section titles. This property set is actually
+used for all titles below level 5.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="section.properties">
+<refmeta>
+<refentrytitle>section.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>section.properties</refname>
+<refpurpose>Properties for all section levels</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="section.properties.frag">
+&lt;xsl:attribute-set name="section.properties"&gt;
+&lt;/xsl:attribute-set&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The properties that apply to the containing
+block of all section levels, and therefore apply to
+the whole section.
+This attribute set is inherited by the
+more specific attribute sets such as
+<tag>section.level1.properties</tag>.
+The default is empty.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="section.level1.properties">
+<refmeta>
+<refentrytitle>section.level1.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>section.level1.properties</refname>
+<refpurpose>Properties for level-1 sections</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="section.level1.properties.frag">
+&lt;xsl:attribute-set name="section.level1.properties" use-attribute-sets="section.properties"&gt;
+&lt;/xsl:attribute-set&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The properties that apply to the containing
+block of a level-1 section, and therefore apply to
+the whole section. This includes <tag>sect1</tag>
+elements and <tag>section</tag> elements at level 1.
+</para>
+
+<para>For example, you could start each level-1 section on
+a new page by using:</para>
+<programlisting>&lt;xsl:attribute-set name="section.level1.properties"&gt;
+ &lt;xsl:attribute name="break-before"&gt;page&lt;/xsl:attribute&gt;
+&lt;/xsl:attribute-set&gt;
+</programlisting>
+
+<para>This attribute set inherits attributes from the
+general <tag>section.properties</tag> attribute set.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="section.level2.properties">
+<refmeta>
+<refentrytitle>section.level2.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>section.level2.properties</refname>
+<refpurpose>Properties for level-2 sections</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="section.level2.properties.frag">
+&lt;xsl:attribute-set name="section.level2.properties" use-attribute-sets="section.properties"&gt;
+&lt;/xsl:attribute-set&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The properties that apply to the containing
+block of a level-2 section, and therefore apply to
+the whole section. This includes <tag>sect2</tag>
+elements and <tag>section</tag> elements at level 2.
+</para>
+
+<para>For example, you could start each level-2 section on
+a new page by using:</para>
+<programlisting>&lt;xsl:attribute-set name="section.level2.properties"&gt;
+ &lt;xsl:attribute name="break-before"&gt;page&lt;/xsl:attribute&gt;
+&lt;/xsl:attribute-set&gt;
+</programlisting>
+
+<para>This attribute set inherits attributes from the
+general <tag>section.properties</tag> attribute set.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="section.level3.properties">
+<refmeta>
+<refentrytitle>section.level3.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>section.level3.properties</refname>
+<refpurpose>Properties for level-3 sections</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="section.level3.properties.frag">
+&lt;xsl:attribute-set name="section.level3.properties" use-attribute-sets="section.properties"&gt;
+&lt;/xsl:attribute-set&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The properties that apply to the containing
+block of a level-3 section, and therefore apply to
+the whole section. This includes <tag>sect3</tag>
+elements and <tag>section</tag> elements at level 3.
+</para>
+
+<para>For example, you could start each level-3 section on
+a new page by using:</para>
+<programlisting>&lt;xsl:attribute-set name="section.level3.properties"&gt;
+ &lt;xsl:attribute name="break-before"&gt;page&lt;/xsl:attribute&gt;
+&lt;/xsl:attribute-set&gt;
+</programlisting>
+
+<para>This attribute set inherits attributes from the
+general <tag>section.properties</tag> attribute set.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="section.level4.properties">
+<refmeta>
+<refentrytitle>section.level4.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>section.level4.properties</refname>
+<refpurpose>Properties for level-4 sections</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="section.level4.properties.frag">
+&lt;xsl:attribute-set name="section.level4.properties" use-attribute-sets="section.properties"&gt;
+&lt;/xsl:attribute-set&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The properties that apply to the containing
+block of a level-4 section, and therefore apply to
+the whole section. This includes <tag>sect4</tag>
+elements and <tag>section</tag> elements at level 4.
+</para>
+
+<para>For example, you could start each level-4 section on
+a new page by using:</para>
+<programlisting>&lt;xsl:attribute-set name="section.level4.properties"&gt;
+ &lt;xsl:attribute name="break-before"&gt;page&lt;/xsl:attribute&gt;
+&lt;/xsl:attribute-set&gt;
+</programlisting>
+
+<para>This attribute set inherits attributes from the
+general <tag>section.properties</tag> attribute set.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="section.level5.properties">
+<refmeta>
+<refentrytitle>section.level5.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>section.level5.properties</refname>
+<refpurpose>Properties for level-5 sections</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="section.level5.properties.frag">
+&lt;xsl:attribute-set name="section.level5.properties" use-attribute-sets="section.properties"&gt;
+&lt;/xsl:attribute-set&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The properties that apply to the containing
+block of a level-5 section, and therefore apply to
+the whole section. This includes <tag>sect5</tag>
+elements and <tag>section</tag> elements at level 5.
+</para>
+
+<para>For example, you could start each level-5 section on
+a new page by using:</para>
+<programlisting>&lt;xsl:attribute-set name="section.level5.properties"&gt;
+ &lt;xsl:attribute name="break-before"&gt;page&lt;/xsl:attribute&gt;
+&lt;/xsl:attribute-set&gt;
+</programlisting>
+
+<para>This attribute set inherits attributes from the
+general <tag>section.properties</tag> attribute set.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="section.level6.properties">
+<refmeta>
+<refentrytitle>section.level6.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>section.level6.properties</refname>
+<refpurpose>Properties for level-6 sections</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="section.level6.properties.frag">
+&lt;xsl:attribute-set name="section.level6.properties" use-attribute-sets="section.properties"&gt;
+&lt;/xsl:attribute-set&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The properties that apply to the containing
+block of a level 6 or lower section, and therefore apply to
+the whole section. This includes
+<tag>section</tag> elements at level 6 and lower.
+</para>
+
+<para>For example, you could start each level-6 section on
+a new page by using:</para>
+<programlisting>&lt;xsl:attribute-set name="section.level6.properties"&gt;
+ &lt;xsl:attribute name="break-before"&gt;page&lt;/xsl:attribute&gt;
+&lt;/xsl:attribute-set&gt;
+</programlisting>
+
+<para>This attribute set inherits attributes from the
+general <tag>section.properties</tag> attribute set.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="figure.properties">
+<refmeta>
+<refentrytitle>figure.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>figure.properties</refname>
+<refpurpose>Properties associated with a figure</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="figure.properties.frag">
+&lt;xsl:attribute-set name="figure.properties" use-attribute-sets="formal.object.properties"&gt;&lt;/xsl:attribute-set&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The styling for figures.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="example.properties">
+<refmeta>
+<refentrytitle>example.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>example.properties</refname>
+<refpurpose>Properties associated with a example</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="example.properties.frag">
+&lt;xsl:attribute-set name="example.properties" use-attribute-sets="formal.object.properties"&gt;&lt;/xsl:attribute-set&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The styling for examples.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="equation.properties">
+<refmeta>
+<refentrytitle>equation.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>equation.properties</refname>
+<refpurpose>Properties associated with a equation</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="equation.properties.frag">
+&lt;xsl:attribute-set name="equation.properties" use-attribute-sets="formal.object.properties"&gt;&lt;/xsl:attribute-set&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The styling for equations.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="equation.number.properties">
+<refmeta>
+<refentrytitle>equation.number.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>equation.number.properties</refname>
+<refpurpose>Properties that apply to the <tag>fo:table-cell</tag> containing the number
+of an <tag>equation</tag> that does not have a title.</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="equation.number.properties.frag">&lt;xsl:attribute-set name="equation.number.properties"&gt;
+ &lt;xsl:attribute name="text-align"&gt;end&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="display-align"&gt;center&lt;/xsl:attribute&gt;
+&lt;/xsl:attribute-set&gt;</programlisting>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+<para>Properties that apply to the fo:table-cell containing the number
+of an equation when it has no title. The number in an equation with a
+title is formatted along with the title, and this attribute-set does not apply.</para>
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="table.properties">
+<refmeta>
+<refentrytitle>table.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>table.properties</refname>
+<refpurpose>Properties associated with the block surrounding a table</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="table.properties.frag">
+&lt;xsl:attribute-set name="table.properties" use-attribute-sets="formal.object.properties"&gt;
+ &lt;xsl:attribute name="keep-together.within-column"&gt;auto&lt;/xsl:attribute&gt;
+&lt;/xsl:attribute-set&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Block styling properties for tables. This parameter should really
+have been called <literal>table.block.properties</literal> or something
+like that, but we&#8217;re leaving it to avoid backwards-compatibility
+problems.</para>
+
+<para>See also <parameter>table.table.properties</parameter>.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="informalfigure.properties">
+<refmeta>
+<refentrytitle>informalfigure.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>informalfigure.properties</refname>
+<refpurpose>Properties associated with an informalfigure</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="informalfigure.properties.frag">
+&lt;xsl:attribute-set name="informalfigure.properties" use-attribute-sets="informal.object.properties"&gt;&lt;/xsl:attribute-set&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The styling for informalfigures.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="informalexample.properties">
+<refmeta>
+<refentrytitle>informalexample.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>informalexample.properties</refname>
+<refpurpose>Properties associated with an informalexample</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="informalexample.properties.frag">
+&lt;xsl:attribute-set name="informalexample.properties" use-attribute-sets="informal.object.properties"&gt;&lt;/xsl:attribute-set&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The styling for informalexamples.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="informalequation.properties">
+<refmeta>
+<refentrytitle>informalequation.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>informalequation.properties</refname>
+<refpurpose>Properties associated with an informalequation</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="informalequation.properties.frag">
+&lt;xsl:attribute-set name="informalequation.properties" use-attribute-sets="informal.object.properties"&gt;&lt;/xsl:attribute-set&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The styling for informalequations.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="informaltable.properties">
+<refmeta>
+<refentrytitle>informaltable.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>informaltable.properties</refname>
+<refpurpose>Properties associated with the block surrounding an informaltable</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="informaltable.properties.frag">
+&lt;xsl:attribute-set name="informaltable.properties" use-attribute-sets="informal.object.properties"&gt;&lt;/xsl:attribute-set&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Block styling properties for informaltables. This parameter should really
+have been called <literal>informaltable.block.properties</literal> or something
+like that, but we&#8217;re leaving it to avoid backwards-compatibility
+problems.</para>
+
+<para>See also <parameter>table.table.properties</parameter>.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="procedure.properties">
+<refmeta>
+<refentrytitle>procedure.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>procedure.properties</refname>
+<refpurpose>Properties associated with a procedure</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="procedure.properties.frag">
+&lt;xsl:attribute-set name="procedure.properties" use-attribute-sets="formal.object.properties"&gt;
+ &lt;xsl:attribute name="keep-together.within-column"&gt;auto&lt;/xsl:attribute&gt;
+&lt;/xsl:attribute-set&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The styling for procedures.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="root.properties">
+<refmeta>
+<refentrytitle>root.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>root.properties</refname>
+<refpurpose>The properties of the fo:root element</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="root.properties.frag">
+&lt;xsl:attribute-set name="root.properties"&gt;
+ &lt;xsl:attribute name="font-family"&gt;
+ &lt;xsl:value-of select="$body.fontset"&gt;&lt;/xsl:value-of&gt;
+ &lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="font-size"&gt;
+ &lt;xsl:value-of select="$body.font.size"&gt;&lt;/xsl:value-of&gt;
+ &lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="text-align"&gt;
+ &lt;xsl:value-of select="$alignment"&gt;&lt;/xsl:value-of&gt;
+ &lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="line-height"&gt;
+ &lt;xsl:value-of select="$line-height"&gt;&lt;/xsl:value-of&gt;
+ &lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="font-selection-strategy"&gt;character-by-character&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="line-height-shift-adjustment"&gt;disregard-shifts&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="writing-mode"&gt;
+ &lt;xsl:value-of select="$direction.mode"&gt;&lt;/xsl:value-of&gt;
+ &lt;/xsl:attribute&gt;
+&lt;/xsl:attribute-set&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>This property set is used on the <tag>fo:root</tag> element of
+an FO file. It defines a set of default, global parameters.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="qanda.title.properties">
+<refmeta>
+<refentrytitle>qanda.title.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>qanda.title.properties</refname>
+<refpurpose>Properties for qanda set titles</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="qanda.title.properties.frag">
+&lt;xsl:attribute-set name="qanda.title.properties"&gt;
+ &lt;xsl:attribute name="font-family"&gt;
+ &lt;xsl:value-of select="$title.font.family"&gt;&lt;/xsl:value-of&gt;
+ &lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="font-weight"&gt;bold&lt;/xsl:attribute&gt;
+ &lt;!-- font size is calculated dynamically by qanda.heading template --&gt;
+ &lt;xsl:attribute name="keep-with-next.within-column"&gt;always&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="space-before.minimum"&gt;0.8em&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="space-before.optimum"&gt;1.0em&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="space-before.maximum"&gt;1.2em&lt;/xsl:attribute&gt;
+&lt;/xsl:attribute-set&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The properties common to all qanda set titles.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="qanda.title.level1.properties">
+<refmeta>
+<refentrytitle>qanda.title.level1.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>qanda.title.level1.properties</refname>
+<refpurpose>Properties for level-1 qanda set titles</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="qanda.title.level1.properties.frag">
+&lt;xsl:attribute-set name="qanda.title.level1.properties"&gt;
+ &lt;xsl:attribute name="font-size"&gt;
+ &lt;xsl:value-of select="$body.font.master * 2.0736"&gt;&lt;/xsl:value-of&gt;
+ &lt;xsl:text&gt;pt&lt;/xsl:text&gt;
+ &lt;/xsl:attribute&gt;
+&lt;/xsl:attribute-set&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The properties of level-1 qanda set titles.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="qanda.title.level2.properties">
+<refmeta>
+<refentrytitle>qanda.title.level2.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>qanda.title.level2.properties</refname>
+<refpurpose>Properties for level-2 qanda set titles</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="qanda.title.level2.properties.frag">
+&lt;xsl:attribute-set name="qanda.title.level2.properties"&gt;
+ &lt;xsl:attribute name="font-size"&gt;
+ &lt;xsl:value-of select="$body.font.master * 1.728"&gt;&lt;/xsl:value-of&gt;
+ &lt;xsl:text&gt;pt&lt;/xsl:text&gt;
+ &lt;/xsl:attribute&gt;
+&lt;/xsl:attribute-set&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The properties of level-2 qanda set titles.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="qanda.title.level3.properties">
+<refmeta>
+<refentrytitle>qanda.title.level3.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>qanda.title.level3.properties</refname>
+<refpurpose>Properties for level-3 qanda set titles</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="qanda.title.level3.properties.frag">
+&lt;xsl:attribute-set name="qanda.title.level3.properties"&gt;
+ &lt;xsl:attribute name="font-size"&gt;
+ &lt;xsl:value-of select="$body.font.master * 1.44"&gt;&lt;/xsl:value-of&gt;
+ &lt;xsl:text&gt;pt&lt;/xsl:text&gt;
+ &lt;/xsl:attribute&gt;
+&lt;/xsl:attribute-set&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The properties of level-3 qanda set titles.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="qanda.title.level4.properties">
+<refmeta>
+<refentrytitle>qanda.title.level4.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>qanda.title.level4.properties</refname>
+<refpurpose>Properties for level-4 qanda set titles</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="qanda.title.level4.properties.frag">
+&lt;xsl:attribute-set name="qanda.title.level4.properties"&gt;
+ &lt;xsl:attribute name="font-size"&gt;
+ &lt;xsl:value-of select="$body.font.master * 1.2"&gt;&lt;/xsl:value-of&gt;
+ &lt;xsl:text&gt;pt&lt;/xsl:text&gt;
+ &lt;/xsl:attribute&gt;
+&lt;/xsl:attribute-set&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The properties of level-4 qanda set titles.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="qanda.title.level5.properties">
+<refmeta>
+<refentrytitle>qanda.title.level5.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>qanda.title.level5.properties</refname>
+<refpurpose>Properties for level-5 qanda set titles</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="qanda.title.level5.properties.frag">
+&lt;xsl:attribute-set name="qanda.title.level5.properties"&gt;
+ &lt;xsl:attribute name="font-size"&gt;
+ &lt;xsl:value-of select="$body.font.master"&gt;&lt;/xsl:value-of&gt;
+ &lt;xsl:text&gt;pt&lt;/xsl:text&gt;
+ &lt;/xsl:attribute&gt;
+&lt;/xsl:attribute-set&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The properties of level-5 qanda set titles.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="qanda.title.level6.properties">
+<refmeta>
+<refentrytitle>qanda.title.level6.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>qanda.title.level6.properties</refname>
+<refpurpose>Properties for level-6 qanda set titles</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="qanda.title.level6.properties.frag">
+&lt;xsl:attribute-set name="qanda.title.level6.properties"&gt;
+ &lt;xsl:attribute name="font-size"&gt;
+ &lt;xsl:value-of select="$body.font.master"&gt;&lt;/xsl:value-of&gt;
+ &lt;xsl:text&gt;pt&lt;/xsl:text&gt;
+ &lt;/xsl:attribute&gt;
+&lt;/xsl:attribute-set&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The properties of level-6 qanda set titles.
+This property set is actually
+used for all titles below level 5.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="article.appendix.title.properties">
+<refmeta>
+<refentrytitle>article.appendix.title.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>article.appendix.title.properties</refname>
+<refpurpose>Properties for appendix titles that appear in an article</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="article.appendix.title.properties.frag">
+&lt;xsl:attribute-set name="article.appendix.title.properties" use-attribute-sets="section.title.properties section.title.level1.properties"&gt;
+ &lt;xsl:attribute name="margin-{$direction.align.start}"&gt;
+ &lt;xsl:value-of select="$title.margin.left"&gt;&lt;/xsl:value-of&gt;
+ &lt;/xsl:attribute&gt;
+&lt;/xsl:attribute-set&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The properties for the title of an appendix that
+appears inside an article. The default is to use
+the properties of sect1 titles.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="abstract.properties">
+<refmeta>
+<refentrytitle>abstract.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>abstract.properties</refname>
+<refpurpose>Properties associated with the block surrounding an abstract</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="abstract.properties.frag">
+&lt;xsl:attribute-set name="abstract.properties"&gt;
+ &lt;xsl:attribute name="start-indent"&gt;0.0in&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="end-indent"&gt;0.0in&lt;/xsl:attribute&gt;
+&lt;/xsl:attribute-set&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Block styling properties for abstract.</para>
+
+<para>See also <parameter>abstract.title.properties</parameter>.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="abstract.title.properties">
+<refmeta>
+<refentrytitle>abstract.title.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>abstract.title.properties</refname>
+<refpurpose>Properties for abstract titles</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="abstract.title.properties.frag">
+&lt;xsl:attribute-set name="abstract.title.properties"&gt;
+ &lt;xsl:attribute name="font-family"&gt;&lt;xsl:value-of select="$title.fontset"&gt;&lt;/xsl:value-of&gt;&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="font-weight"&gt;bold&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="keep-with-next.within-column"&gt;always&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="keep-with-next.within-column"&gt;always&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="space-before.optimum"&gt;&lt;xsl:value-of select="concat($body.font.master, 'pt')"&gt;&lt;/xsl:value-of&gt;&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="space-before.minimum"&gt;&lt;xsl:value-of select="concat($body.font.master, 'pt * 0.8')"&gt;&lt;/xsl:value-of&gt;&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="space-before.maximum"&gt;&lt;xsl:value-of select="concat($body.font.master, 'pt * 1.2')"&gt;&lt;/xsl:value-of&gt;&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="hyphenate"&gt;false&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="text-align"&gt;center&lt;/xsl:attribute&gt;
+&lt;/xsl:attribute-set&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The properties for abstract titles.</para>
+
+<para>See also <parameter>abstract.properties</parameter>.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="index.page.number.properties">
+<refmeta>
+<refentrytitle>index.page.number.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>index.page.number.properties</refname>
+<refpurpose>Properties associated with index page numbers</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="index.page.number.properties.frag">
+&lt;xsl:attribute-set name="index.page.number.properties"&gt;
+&lt;/xsl:attribute-set&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Properties associated with page numbers in indexes.
+Changing color to indicate the page number is a link is
+one possibility.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="revhistory.table.properties">
+<refmeta>
+<refentrytitle>revhistory.table.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>revhistory.table.properties</refname>
+<refpurpose>The properties of table used for formatting revhistory</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="revhistory.table.properties.frag">
+&lt;xsl:attribute-set name="revhistory.table.properties"&gt;
+&lt;/xsl:attribute-set&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>This property set defines appearance of revhistory table.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="revhistory.table.cell.properties">
+<refmeta>
+<refentrytitle>revhistory.table.cell.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>revhistory.table.cell.properties</refname>
+<refpurpose>The properties of table cells used for formatting revhistory</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="revhistory.table.cell.properties.frag">
+&lt;xsl:attribute-set name="revhistory.table.cell.properties"&gt;
+&lt;/xsl:attribute-set&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>This property set defines appearance of individual cells in revhistory table.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="revhistory.title.properties">
+<refmeta>
+<refentrytitle>revhistory.title.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>revhistory.title.properties</refname>
+<refpurpose>The properties of revhistory title</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="revhistory.title.properties.frag">
+&lt;xsl:attribute-set name="revhistory.title.properties"&gt;
+&lt;/xsl:attribute-set&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>This property set defines appearance of revhistory title.</para>
+
+</refsection>
+</refentry>
+
+</reference><reference id="profiling" xml:base="../fo/param.xml"><title>Profiling</title>
+<partintro id="profiling_partintro">
+<para>The following parameters can be used for attribute-based
+profiling of your document. For more information about profiling, see
+<link role="tcg" xlink:href="Profiling.html">Profiling (conditional text)</link>.</para>
+</partintro>
+<refentry version="5.0" id="profile.arch">
+<refmeta>
+<refentrytitle>profile.arch</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>profile.arch</refname>
+<refpurpose>Target profile for <tag class="attribute">arch</tag>
+attribute</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="profile.arch.frag">
+&lt;xsl:param name="profile.arch"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+
+<refsection><info><title>Description</title></info>
+
+<para>The value of this parameter specifies profiles which should be
+included in the output. You can specify multiple profiles by
+separating them by semicolon. You can change separator character by
+<parameter>profile.separator</parameter>
+parameter.</para>
+
+<para>This parameter has effect only when you are using profiling
+stylesheets (<filename>profile-docbook.xsl</filename>,
+<filename>profile-chunk.xsl</filename>, &#8230;) instead of normal
+ones (<filename>docbook.xsl</filename>,
+<filename>chunk.xsl</filename>, &#8230;).</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="profile.audience">
+<refmeta>
+<refentrytitle>profile.audience</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>profile.audience</refname>
+<refpurpose>Target profile for <tag class="attribute">audience</tag>
+attribute</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="profile.audience.frag">
+&lt;xsl:param name="profile.audience"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Value of this parameter specifies profiles which should be
+included in the output. You can specify multiple profiles by
+separating them by semicolon. You can change separator character by
+<parameter>profile.separator</parameter>
+parameter.</para>
+
+<para>This parameter has effect only when you are using profiling
+stylesheets (<filename>profile-docbook.xsl</filename>,
+<filename>profile-chunk.xsl</filename>, &#8230;) instead of normal
+ones (<filename>docbook.xsl</filename>,
+<filename>chunk.xsl</filename>, &#8230;).</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="profile.condition">
+<refmeta>
+<refentrytitle>profile.condition</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>profile.condition</refname>
+<refpurpose>Target profile for <tag class="attribute">condition</tag>
+attribute</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="profile.condition.frag">
+&lt;xsl:param name="profile.condition"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The value of this parameter specifies profiles which should be
+included in the output. You can specify multiple profiles by
+separating them by semicolon. You can change separator character by
+<parameter>profile.separator</parameter>
+parameter.</para>
+
+<para>This parameter has effect only when you are using profiling
+stylesheets (<filename>profile-docbook.xsl</filename>,
+<filename>profile-chunk.xsl</filename>, &#8230;) instead of normal
+ones (<filename>docbook.xsl</filename>,
+<filename>chunk.xsl</filename>, &#8230;).</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="profile.conformance">
+<refmeta>
+<refentrytitle>profile.conformance</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>profile.conformance</refname>
+<refpurpose>Target profile for <tag class="attribute">conformance</tag>
+attribute</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="profile.conformance.frag">
+&lt;xsl:param name="profile.conformance"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The value of this parameter specifies profiles which should be
+included in the output. You can specify multiple profiles by
+separating them by semicolon. You can change separator character by
+<parameter>profile.separator</parameter>
+parameter.</para>
+
+<para>This parameter has effect only when you are using profiling
+stylesheets (<filename>profile-docbook.xsl</filename>,
+<filename>profile-chunk.xsl</filename>, &#8230;) instead of normal
+ones (<filename>docbook.xsl</filename>,
+<filename>chunk.xsl</filename>, &#8230;).</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="profile.lang">
+<refmeta>
+<refentrytitle>profile.lang</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>profile.lang</refname>
+<refpurpose>Target profile for <tag class="attribute">lang</tag>
+attribute</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="profile.lang.frag">
+&lt;xsl:param name="profile.lang"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The value of this parameter specifies profiles which should be
+included in the output. You can specify multiple profiles by
+separating them by semicolon. You can change separator character by
+<parameter>profile.separator</parameter>
+parameter.</para>
+
+<para>This parameter has effect only when you are using profiling
+stylesheets (<filename>profile-docbook.xsl</filename>,
+<filename>profile-chunk.xsl</filename>, &#8230;) instead of normal
+ones (<filename>docbook.xsl</filename>,
+<filename>chunk.xsl</filename>, &#8230;).</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="profile.os">
+<refmeta>
+<refentrytitle>profile.os</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>profile.os</refname>
+<refpurpose>Target profile for <tag class="attribute">os</tag>
+attribute</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="profile.os.frag">
+&lt;xsl:param name="profile.os"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The value of this parameter specifies profiles which should be
+included in the output. You can specify multiple profiles by
+separating them by semicolon. You can change separator character by
+<parameter>profile.separator</parameter>
+parameter.</para>
+
+<para>This parameter has effect only when you are using profiling
+stylesheets (<filename>profile-docbook.xsl</filename>,
+<filename>profile-chunk.xsl</filename>, &#8230;) instead of normal
+ones (<filename>docbook.xsl</filename>,
+<filename>chunk.xsl</filename>, &#8230;).</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="profile.revision">
+<refmeta>
+<refentrytitle>profile.revision</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>profile.revision</refname>
+<refpurpose>Target profile for <tag class="attribute">revision</tag>
+attribute</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="profile.revision.frag">
+&lt;xsl:param name="profile.revision"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The value of this parameter specifies profiles which should be
+included in the output. You can specify multiple profiles by
+separating them by semicolon. You can change separator character by
+<parameter>profile.separator</parameter>
+parameter.</para>
+
+<para>This parameter has effect only when you are using profiling
+stylesheets (<filename>profile-docbook.xsl</filename>,
+<filename>profile-chunk.xsl</filename>, &#8230;) instead of normal
+ones (<filename>docbook.xsl</filename>,
+<filename>chunk.xsl</filename>, &#8230;).</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="profile.revisionflag">
+<refmeta>
+<refentrytitle>profile.revisionflag</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>profile.revisionflag</refname>
+<refpurpose>Target profile for <tag class="attribute">revisionflag</tag>
+attribute</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="profile.revisionflag.frag">
+&lt;xsl:param name="profile.revisionflag"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The value of this parameter specifies profiles which should be
+included in the output. You can specify multiple profiles by
+separating them by semicolon. You can change separator character by
+<parameter>profile.separator</parameter>
+parameter.</para>
+
+<para>This parameter has effect only when you are using profiling
+stylesheets (<filename>profile-docbook.xsl</filename>,
+<filename>profile-chunk.xsl</filename>, &#8230;) instead of normal
+ones (<filename>docbook.xsl</filename>,
+<filename>chunk.xsl</filename>, &#8230;).</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="profile.role">
+<refmeta>
+<refentrytitle>profile.role</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>profile.role</refname>
+<refpurpose>Target profile for <tag class="attribute">role</tag>
+attribute</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="profile.role.frag">
+&lt;xsl:param name="profile.role"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The value of this parameter specifies profiles which should be
+included in the output. You can specify multiple profiles by
+separating them by semicolon. You can change separator character by
+<parameter>profile.separator</parameter>
+parameter.</para>
+
+<para>This parameter has effect only when you are using profiling
+stylesheets (<filename>profile-docbook.xsl</filename>,
+<filename>profile-chunk.xsl</filename>, &#8230;) instead of normal
+ones (<filename>docbook.xsl</filename>,
+<filename>chunk.xsl</filename>, &#8230;).</para>
+
+<warning>
+<para>Note that <tag class="attribute">role</tag> is often
+used for other purposes than profiling. For example it is commonly
+used to get emphasize in bold font:</para>
+
+<programlisting>&lt;emphasis role="bold"&gt;very important&lt;/emphasis&gt;</programlisting>
+
+<para>If you are using <tag class="attribute">role</tag> for
+these purposes do not forget to add values like <literal>bold</literal> to
+value of this parameter. If you forgot you will get document with
+small pieces missing which are very hard to track.</para>
+
+<para>For this reason it is not recommended to use <tag class="attribute">role</tag> attribute for profiling. You should
+rather use profiling specific attributes like <tag class="attribute">userlevel</tag>, <tag class="attribute">os</tag>, <tag class="attribute">arch</tag>, <tag class="attribute">condition</tag>, etc.</para>
+</warning>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="profile.security">
+<refmeta>
+<refentrytitle>profile.security</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>profile.security</refname>
+<refpurpose>Target profile for <tag class="attribute">security</tag>
+attribute</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="profile.security.frag">
+&lt;xsl:param name="profile.security"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The value of this parameter specifies profiles which should be
+included in the output. You can specify multiple profiles by
+separating them by semicolon. You can change separator character by
+<parameter>profile.separator</parameter>
+parameter.</para>
+
+<para>This parameter has effect only when you are using profiling
+stylesheets (<filename>profile-docbook.xsl</filename>,
+<filename>profile-chunk.xsl</filename>, &#8230;) instead of normal
+ones (<filename>docbook.xsl</filename>,
+<filename>chunk.xsl</filename>, &#8230;).</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="profile.status">
+<refmeta>
+<refentrytitle>profile.status</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>profile.status</refname>
+<refpurpose>Target profile for <tag class="attribute">status</tag>
+attribute</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="profile.status.frag">
+&lt;xsl:param name="profile.status"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The value of this parameter specifies profiles which should be
+included in the output. You can specify multiple profiles by
+separating them by semicolon. You can change separator character by
+<parameter>profile.separator</parameter>
+parameter.</para>
+
+<para>This parameter has effect only when you are using profiling
+stylesheets (<filename>profile-docbook.xsl</filename>,
+<filename>profile-chunk.xsl</filename>, &#8230;) instead of normal
+ones (<filename>docbook.xsl</filename>,
+<filename>chunk.xsl</filename>, &#8230;).</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="profile.userlevel">
+<refmeta>
+<refentrytitle>profile.userlevel</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>profile.userlevel</refname>
+<refpurpose>Target profile for <tag class="attribute">userlevel</tag>
+attribute</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="profile.userlevel.frag">
+&lt;xsl:param name="profile.userlevel"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The value of this parameter specifies profiles which should be
+included in the output. You can specify multiple profiles by
+separating them by semicolon. You can change separator character by
+<parameter>profile.separator</parameter>
+parameter.</para>
+
+<para>This parameter has effect only when you are using profiling
+stylesheets (<filename>profile-docbook.xsl</filename>,
+<filename>profile-chunk.xsl</filename>, &#8230;) instead of normal
+ones (<filename>docbook.xsl</filename>,
+<filename>chunk.xsl</filename>, &#8230;).</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="profile.vendor">
+<refmeta>
+<refentrytitle>profile.vendor</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>profile.vendor</refname>
+<refpurpose>Target profile for <tag class="attribute">vendor</tag>
+attribute</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="profile.vendor.frag">
+&lt;xsl:param name="profile.vendor"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The value of this parameter specifies profiles which should be
+included in the output. You can specify multiple profiles by
+separating them by semicolon. You can change separator character by
+<parameter>profile.separator</parameter>
+parameter.</para>
+
+<para>This parameter has effect only when you are using profiling
+stylesheets (<filename>profile-docbook.xsl</filename>,
+<filename>profile-chunk.xsl</filename>, &#8230;) instead of normal
+ones (<filename>docbook.xsl</filename>,
+<filename>chunk.xsl</filename>, &#8230;).</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="profile.wordsize">
+<refmeta>
+<refentrytitle>profile.wordsize</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>profile.wordsize</refname>
+<refpurpose>Target profile for <tag class="attribute">wordsize</tag>
+attribute</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="profile.wordsize.frag">
+&lt;xsl:param name="profile.wordsize"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The value of this parameter specifies profiles which should be
+included in the output. You can specify multiple profiles by
+separating them by semicolon. You can change separator character by
+<parameter>profile.separator</parameter>
+parameter.</para>
+
+<para>This parameter has effect only when you are using profiling
+stylesheets (<filename>profile-docbook.xsl</filename>,
+<filename>profile-chunk.xsl</filename>, &#8230;) instead of normal
+ones (<filename>docbook.xsl</filename>,
+<filename>chunk.xsl</filename>, &#8230;).</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="profile.attribute">
+<refmeta>
+<refentrytitle>profile.attribute</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>profile.attribute</refname>
+<refpurpose>Name of user-specified profiling attribute</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="profile.attribute.frag">
+&lt;xsl:param name="profile.attribute"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>This parameter is used in conjuction with
+<parameter>profile.value</parameter>.</para>
+
+<para>This parameter has effect only when you are using profiling
+stylesheets (<filename>profile-docbook.xsl</filename>,
+<filename>profile-chunk.xsl</filename>, &#8230;) instead of normal
+ones (<filename>docbook.xsl</filename>,
+<filename>chunk.xsl</filename>, &#8230;).</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="profile.value">
+<refmeta>
+<refentrytitle>profile.value</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>profile.value</refname>
+<refpurpose>Target profile for user-specified attribute</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="profile.value.frag">
+&lt;xsl:param name="profile.value"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>When you are using this parameter you must also specify name of
+profiling attribute with parameter
+<parameter>profile.attribute</parameter>.</para>
+
+<para>The value of this parameter specifies profiles which should be
+included in the output. You can specify multiple profiles by
+separating them by semicolon. You can change separator character by
+<parameter>profile.separator</parameter>
+parameter.</para>
+
+<para>This parameter has effect only when you are using profiling
+stylesheets (<filename>profile-docbook.xsl</filename>,
+<filename>profile-chunk.xsl</filename>, &#8230;) instead of normal
+ones (<filename>docbook.xsl</filename>,
+<filename>chunk.xsl</filename>, &#8230;).</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="profile.separator">
+<refmeta>
+<refentrytitle>profile.separator</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>profile.separator</refname>
+<refpurpose>Separator character for compound profile values</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="profile.separator.frag">
+&lt;xsl:param name="profile.separator"&gt;;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Separator character used for compound profile values. See <parameter>profile.arch</parameter></para>
+
+</refsection>
+</refentry>
+
+</reference><reference id="l10n" xml:base="../fo/param.xml"><title>Localization</title>
+<refentry version="5.0" id="l10n.gentext.language">
+<refmeta>
+<refentrytitle>l10n.gentext.language</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>l10n.gentext.language</refname>
+<refpurpose>Sets the gentext language</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="l10n.gentext.language.frag">
+&lt;xsl:param name="l10n.gentext.language"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If this parameter is set to any value other than the empty string, its
+value will be used as the value for the language when generating text. Setting
+<parameter>l10n.gentext.language</parameter> overrides any settings within the
+document being formatted.</para>
+
+<para>It's much more likely that you might want to set the
+<parameter>l10n.gentext.default.language</parameter> parameter.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="l10n.gentext.default.language">
+ <refmeta>
+ <refentrytitle>l10n.gentext.default.language</refentrytitle>
+ <refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+ </refmeta>
+ <refnamediv>
+ <refname>l10n.gentext.default.language</refname>
+ <refpurpose>Sets the default language for generated text</refpurpose>
+ </refnamediv>
+
+ <refsynopsisdiv>
+<programlisting id="l10n.gentext.default.language.frag">
+&lt;xsl:param name="l10n.gentext.default.language"&gt;en&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The value of the <parameter>l10n.gentext.default.language</parameter>
+parameter is used as the language for generated text if no setting is provided
+in the source document.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="l10n.gentext.use.xref.language">
+<refmeta>
+<refentrytitle>l10n.gentext.use.xref.language</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>l10n.gentext.use.xref.language</refname>
+<refpurpose>Use the language of target when generating cross-reference text?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="l10n.gentext.use.xref.language.frag">
+&lt;xsl:param name="l10n.gentext.use.xref.language" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, the language of the target will be used when
+generating cross reference text. Usually, the <quote>current</quote>
+language is used when generating text (that is, the language of the
+element that contains the cross-reference element). But setting this parameter
+allows the language of the element <emphasis>pointed to</emphasis> to control
+the generated text.</para>
+
+<para>Consider the following example:</para>
+
+<informalexample>
+<programlisting>&lt;para lang="en"&gt;See also &lt;xref linkend="chap3"/&gt;.&lt;/para&gt;
+</programlisting>
+</informalexample>
+
+<para>Suppose that Chapter 3 happens to be written in German.
+If <parameter>l10n.gentext.use.xref.language</parameter> is non-zero, the
+resulting text will be something like this:</para>
+
+<blockquote>
+<para>See also Kapital 3.</para>
+</blockquote>
+
+<para>Where the more traditional rendering would be:</para>
+
+<blockquote>
+<para>See also Chapter 3.</para>
+</blockquote>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="l10n.lang.value.rfc.compliant">
+<refmeta>
+<refentrytitle>l10n.lang.value.rfc.compliant</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>l10n.lang.value.rfc.compliant</refname>
+<refpurpose>Make value of lang attribute RFC compliant?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="l10n.lang.value.rfc.compliant.frag">
+&lt;xsl:param name="l10n.lang.value.rfc.compliant" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, ensure that the values for all <tag class="attribute">lang</tag> attributes in HTML output are RFC
+compliant<footnote><para>Section 8.1.1, <link xlink:href="http://www.w3.org/TR/REC-html40/struct/dirlang.html#h-8.1.1">Language Codes</link>, in the HTML 4.0 Recommendation states that:
+
+<blockquote><para>[RFC1766] defines and explains the language codes
+that must be used in HTML documents.</para>
+<para>Briefly, language codes consist of a primary code and a possibly
+empty series of subcodes:
+
+<literallayout class="monospaced">language-code = primary-code ( "-" subcode )*</literallayout>
+</para>
+<para>And in RFC 1766, <link xlink:href="http://www.ietf.org/rfc/rfc1766.txt">Tags for the Identification
+of Languages</link>, the EBNF for "language tag" is given as:
+
+<literallayout class="monospaced">Language-Tag = Primary-tag *( "-" Subtag )
+Primary-tag = 1*8ALPHA
+Subtag = 1*8ALPHA</literallayout>
+</para>
+</blockquote>
+</para></footnote>.
+
+by taking any underscore characters in any <tag class="attribute">lang</tag> values found in source documents, and
+replacing them with hyphen characters in output HTML files. For
+example, <literal>zh_CN</literal> in a source document becomes
+<literal>zh-CN</literal> in the HTML output form that source.
+
+<note>
+<para>This parameter does not cause any case change in <tag class="attribute">lang</tag> values, because RFC 1766
+explicitly states that all "language tags" (as it calls them) "are
+to be treated as case insensitive".</para>
+</note>
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="writing.mode">
+<refmeta>
+<refentrytitle>writing.mode</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>writing.mode</refname>
+<refpurpose>Direction of text flow based on locale</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="writing.mode.frag">
+&lt;xsl:param name="writing.mode"&gt;
+ &lt;xsl:call-template name="gentext"&gt;
+ &lt;xsl:with-param name="key"&gt;writing-mode&lt;/xsl:with-param&gt;
+ &lt;xsl:with-param name="lang"&gt;
+ &lt;xsl:call-template name="l10n.language"&gt;
+ &lt;xsl:with-param name="target" select="/*[1]"&gt;&lt;/xsl:with-param&gt;
+ &lt;/xsl:call-template&gt;
+ &lt;/xsl:with-param&gt;
+ &lt;/xsl:call-template&gt;
+&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Sets direction of text flow and text alignment based on locale.
+The value is normally taken from the gentext file for the
+lang attribute of the document's root element, using the
+key name 'writing-mode' to look it up in the gentext file.
+But the param can also be
+set on the command line to override that gentext value.
+</para>
+<para>Accepted values are:
+<variablelist>
+ <varlistentry>
+ <term>lr-tb</term>
+ <listitem>
+ <para>Left-to-right text flow in each line, lines stack top to bottom.</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>rl-tb</term>
+ <listitem>
+ <para>Right-to-left text flow in each line, lines stack top to bottom.</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>tb-rl</term>
+ <listitem>
+ <para>Top-to-bottom text flow in each vertical line, lines stack right to left.
+ Supported by only a few XSL-FO processors. Not supported in HTML output.</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>lr</term>
+ <listitem>
+ <para>Shorthand for lr-tb.</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>rl</term>
+ <listitem>
+ <para>Shorthand for rl-tb.</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>tb</term>
+ <listitem>
+ <para>Shorthand for tb-rl.</para>
+ </listitem>
+ </varlistentry>
+</variablelist>
+</para>
+
+</refsection>
+</refentry>
+
+</reference><reference id="ebnf" xml:base="../fo/param.xml"><title>EBNF</title>
+<refentry version="5.0" id="ebnf.assignment">
+<refmeta>
+<refentrytitle>ebnf.assignment</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">rtf</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>ebnf.assignment</refname>
+<refpurpose>The EBNF production assignment operator</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="ebnf.assignment.frag">
+
+&lt;xsl:param name="ebnf.assignment"&gt;
+ &lt;fo:inline font-family="{$monospace.font.family}"&gt;
+ &lt;xsl:text&gt;::=&lt;/xsl:text&gt;
+ &lt;/fo:inline&gt;
+&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The <parameter>ebnf.assignment</parameter> parameter determines what
+text is used to show <quote>assignment</quote> in <tag>production</tag>s
+in <tag>productionset</tag>s.</para>
+
+<para>While <quote><literal>::=</literal></quote> is common, so are several
+other operators.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="ebnf.statement.terminator">
+<refmeta>
+<refentrytitle>ebnf.statement.terminator</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">rtf</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>ebnf.statement.terminator</refname>
+<refpurpose>Punctuation that ends an EBNF statement.</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="ebnf.statement.terminator.frag">
+
+&lt;xsl:param name="ebnf.statement.terminator"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The <parameter>ebnf.statement.terminator</parameter> parameter determines what
+text is used to terminate each <tag>production</tag>
+in <tag>productionset</tag>.</para>
+
+<para>Some notations end each statement with a period.</para>
+
+</refsection>
+</refentry>
+
+</reference><reference id="prepress" xml:base="../fo/param.xml"><title>Prepress</title>
+<refentry version="5.0" id="crop.marks">
+<refmeta>
+<refentrytitle>crop.marks</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>crop.marks</refname>
+<refpurpose>Output crop marks?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="crop.marks.frag">
+&lt;xsl:param name="crop.marks" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, crop marks will be added to each page. Currently this
+works only with XEP if you have <parameter>xep.extensions</parameter> set.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="crop.mark.width">
+<refmeta>
+<refentrytitle>crop.mark.width</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">length</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>crop.mark.width</refname>
+<refpurpose>Width of crop marks.</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="crop.mark.width.frag">
+&lt;xsl:param name="crop.mark.width"&gt;0.5pt&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Width of crop marks. Crop marks are controlled by
+<parameter>crop.marks</parameter> parameter.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="crop.mark.offset">
+<refmeta>
+<refentrytitle>crop.mark.offset</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">length</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>crop.mark.offset</refname>
+<refpurpose>Length of crop marks.</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="crop.mark.offset.frag">
+&lt;xsl:param name="crop.mark.offset"&gt;24pt&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Length of crop marks. Crop marks are controlled by
+<parameter>crop.marks</parameter> parameter.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="crop.mark.bleed">
+<refmeta>
+<refentrytitle>crop.mark.bleed</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">length</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>crop.mark.bleed</refname>
+<refpurpose>Length of invisible part of crop marks.</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="crop.mark.bleed.frag">
+&lt;xsl:param name="crop.mark.bleed"&gt;6pt&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Length of invisible part of crop marks. Crop marks are controlled by
+<parameter>crop.marks</parameter> parameter.</para>
+
+</refsection>
+</refentry>
+
+</reference>
+ </part>
+ <part id="manpages">
+ <?dbhtml dir="manpages"?>
+ <?dbhtml filename="index.html"?>
+ <title xml:base="../manpages/param.xml">Manpages Parameter Reference</title>
+ <partintro id="manintro">
+
+ <para xml:base="../manpages/param.xml">This is reference documentation for all user-configurable
+ parameters in the DocBook XSL "manpages" stylesheet (for
+ generating groff/nroff output). Note that the manpages
+ stylesheet is a customization layer of the DocBook XSL HTML
+ stylesheet. Therefore, you can also use a number of <link xlink:href="../html/">HTML stylesheet parameters</link>
+ to control manpages output (in addition to the
+ manpages-specific parameters listed in this section).</para>
+
+ </partintro>
+ <reference id="general" xml:base="../manpages/param.xml">
+ <title>Hyphenation, justification, and breaking</title>
+<refentry version="5.0" id="man.hyphenate">
+<refmeta>
+<refentrytitle>man.hyphenate</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>man.hyphenate</refname>
+<refpurpose>Enable hyphenation?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="man.hyphenate.frag">
+&lt;xsl:param name="man.hyphenate"&gt;0&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, hyphenation is enabled.</para>
+
+<note>
+<para>The default value for this parameter is zero because groff is
+not particularly smart about how it does hyphenation; it can end up
+hyphenating a lot of things that you don't want hyphenated. To
+mitigate that, the default behavior of the stylesheets is to suppress
+hyphenation of computer inlines, filenames, and URLs. (You can
+override the default behavior by setting non-zero values for the
+<parameter>man.hyphenate.urls</parameter>,
+<parameter>man.hyphenate.filenames</parameter>, and
+<parameter>man.hyphenate.computer.inlines</parameter> parameters.) But
+the best way is still to just globally disable hyphenation, as the
+stylesheets do by default.</para>
+
+<para>The only good reason to enabled hyphenation is if you have also
+enabled justification (which is disabled by default). The reason is
+that justified text can look very bad unless you also hyphenate it; to
+quote the <quote>Hypenation</quote> node from the groff info page:
+
+<blockquote>
+ <para><emphasis>Since the odds are not great for finding a set of
+ words, for every output line, which fit nicely on a line without
+ inserting excessive amounts of space between words, 'gtroff'
+ hyphenates words so that it can justify lines without inserting too
+ much space between words.</emphasis></para>
+</blockquote>
+
+So, if you set a non-zero value for the
+<parameter>man.justify</parameter> parameter (to enable
+justification), then you should probably also set a non-zero value for
+<parameter>man.hyphenate</parameter> (to enable hyphenation).</para>
+</note>
+
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="man.hyphenate.urls">
+<refmeta>
+<refentrytitle>man.hyphenate.urls</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>man.hyphenate.urls</refname>
+<refpurpose>Hyphenate URLs?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="man.hyphenate.urls.frag">
+&lt;xsl:param name="man.hyphenate.urls"&gt;0&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If zero (the default), hyphenation is suppressed for output of
+the <tag>ulink</tag> <tag class="attribute">url</tag> attribute.</para>
+
+<note>
+ <para>If hyphenation is already turned off globally (that is, if
+ <parameter>man.hyphenate</parameter> is zero, setting
+ <parameter>man.hyphenate.urls</parameter> is not necessary.</para>
+</note>
+
+<para>If <parameter>man.hyphenate.urls</parameter> is non-zero, URLs
+will not be treated specially and are subject to hyphenation just like
+other words.</para>
+
+<note>
+ <para>If you are thinking about setting a non-zero value for
+ <parameter>man.hyphenate.urls</parameter> in order to make long
+ URLs break across lines, you'd probably be better off
+ experimenting with setting the
+ <parameter>man.break.after.slash</parameter> parameter first. That
+ will cause long URLs to be broken after slashes.</para>
+</note>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="man.hyphenate.filenames">
+<refmeta>
+<refentrytitle>man.hyphenate.filenames</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>man.hyphenate.filenames</refname>
+<refpurpose>Hyphenate filenames?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="man.hyphenate.filenames.frag">
+&lt;xsl:param name="man.hyphenate.filenames"&gt;0&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If zero (the default), hyphenation is suppressed for
+<tag>filename</tag> output.</para>
+
+<note>
+ <para>If hyphenation is already turned off globally (that is, if
+ <parameter>man.hyphenate</parameter> is zero, setting
+ <parameter>man.hyphenate.filenames</parameter> is not
+ necessary.</para>
+</note>
+
+<para>If <parameter>man.hyphenate.filenames</parameter> is non-zero,
+filenames will not be treated specially and are subject to hyphenation
+just like other words.</para>
+
+<note>
+ <para>If you are thinking about setting a non-zero value for
+ <parameter>man.hyphenate.filenames</parameter> in order to make long
+ filenames/pathnames break across lines, you'd probably be better off
+ experimenting with setting the
+ <parameter>man.break.after.slash</parameter> parameter first. That
+ will cause long pathnames to be broken after slashes.</para>
+</note>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="man.hyphenate.computer.inlines">
+<refmeta>
+<refentrytitle>man.hyphenate.computer.inlines</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>man.hyphenate.computer.inlines</refname>
+<refpurpose>Hyphenate computer inlines?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="man.hyphenate.computer.inlines.frag">
+&lt;xsl:param name="man.hyphenate.computer.inlines"&gt;0&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If zero (the default), hyphenation is suppressed for
+<quote>computer inlines</quote> such as environment variables,
+constants, etc. This parameter current affects output of the following
+elements:
+<simplelist type="inline">
+
+ <member><tag>classname</tag></member>
+ <member><tag>constant</tag></member>
+ <member><tag>envar</tag></member>
+ <member><tag>errorcode</tag></member>
+ <member><tag>option</tag></member>
+ <member><tag>replaceable</tag></member>
+ <member><tag>userinput</tag></member>
+ <member><tag>type</tag></member>
+ <member><tag>varname</tag></member>
+</simplelist>
+</para>
+
+<note>
+ <para>If hyphenation is already turned off globally (that is, if
+ <parameter>man.hyphenate</parameter> is zero, setting the
+ <parameter>man.hyphenate.computer.inlines</parameter> is not
+ necessary.</para>
+</note>
+
+<para>If <parameter>man.hyphenate.computer.inlines</parameter> is
+non-zero, computer inlines will not be treated specially and will be
+hyphenated like other words when needed.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="man.justify">
+<refmeta>
+<refentrytitle>man.justify</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>man.justify</refname>
+<refpurpose>Justify text to both right and left margins?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="man.justify.frag">
+&lt;xsl:param name="man.justify"&gt;0&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, text is justified to both the right and left
+margins (or, in roff terminology, "adjusted and filled" to both the
+right and left margins). If zero (the default), text is adjusted to
+the left margin only -- producing what is traditionally called
+"ragged-right" text.</para>
+
+<note>
+<para>The default value for this parameter is zero because justified
+text looks good only when it is also hyphenated. Without hyphenation,
+excessive amounts of space often end up getting between words, in
+order to "pad" lines out to align on the right margin.</para>
+
+<para>The problem is that groff is not particularly smart about how it
+does hyphenation; it can end up hyphenating a lot of things that you
+don't want hyphenated. So, disabling both justification and
+hyphenation ensures that hyphens won't get inserted where you don't
+want to them, and you don't end up with lines containing excessive
+amounts of space between words.</para>
+
+<para>However, if do you decide to set a non-zero value for the
+<parameter>man.justify</parameter> parameter (to enable
+justification), then you should probably also set a non-zero value for
+<parameter>man.hyphenate</parameter> (to enable hyphenation).</para>
+
+<para>Yes, these default settings run counter to how most existing man
+pages are formatted. But there are some notable exceptions, such as
+the <literal>perl</literal> man pages.</para>
+</note>
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="man.break.after.slash">
+<refmeta>
+<refentrytitle>man.break.after.slash</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>man.break.after.slash</refname>
+<refpurpose>Enable line-breaking after slashes?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="man.break.after.slash.frag">
+&lt;xsl:param name="man.break.after.slash"&gt;0&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, line-breaking after slashes is enabled. This is
+mainly useful for causing long URLs or pathnames/filenames to be
+broken up or "wrapped" across lines (though it also has the side
+effect of sometimes causing relatively short URLs and pathnames to be
+broken up across lines too).</para>
+
+<para>If zero (the default), line-breaking after slashes is
+disabled. In that case, strings containing slashes (for example, URLs
+or filenames) are not broken across lines, even if they exceed the
+maximum column widith.</para>
+
+<warning>
+ <para>If you set a non-zero value for this parameter, check your
+ man-page output carefuly afterwards, in order to make sure that the
+ setting has not introduced an excessive amount of breaking-up of URLs
+ or pathnames. If your content contains mostly short URLs or
+ pathnames, setting a non-zero value for
+ <parameter>man.break.after.slash</parameter> will probably result in
+ in a significant number of relatively short URLs and pathnames being
+ broken across lines, which is probably not what you want.</para>
+</warning>
+
+</refsection>
+</refentry>
+
+ </reference><reference id="indent" xml:base="../manpages/param.xml">
+ <title>Indentation</title>
+<refentry version="5.0" id="man.indent.width">
+<refmeta>
+<refentrytitle>man.indent.width</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">length</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>man.indent.width</refname>
+<refpurpose>Specifies width used for adjusted indents</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="man.indent.width.frag">
+&lt;xsl:param name="man.indent.width"&gt;4&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+<para>The <parameter>man.indent.width</parameter> parameter specifies
+the width used for adjusted indents. The value of
+<parameter>man.indent.width</parameter> is used for indenting of
+lists, verbatims, headings, and elsewhere, depending on whether the
+values of certain <literal>man.indent.*</literal> boolean parameters
+are non-zero.</para>
+
+<para>The value of <parameter>man.indent.width</parameter> should
+include a valid roff measurement unit (for example,
+<literal>n</literal> or <literal>u</literal>). The default value of
+<literal>4n</literal> specifies a 4-en width; when viewed on a
+console, that amounts to the width of four characters. For details
+about roff measurment units, see the <literal>Measurements</literal>
+node in the groff info page.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="man.indent.refsect">
+<refmeta>
+<refentrytitle>man.indent.refsect</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>man.indent.refsect</refname>
+<refpurpose>Adjust indentation of refsect* and refsection?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="man.indent.refsect.frag">
+&lt;xsl:param name="man.indent.refsect" select="0"&gt;&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If the value of <parameter>man.indent.refsect</parameter> is
+non-zero, the width of the left margin for
+<tag>refsect1</tag>, <tag>refsect2</tag> and
+<tag>refsect3</tag> contents and titles (and first-level,
+second-level, and third-level nested
+<tag>refsection</tag>instances) is adjusted by the value of
+the <parameter>man.indent.width</parameter> parameter. With
+<parameter>man.indent.width</parameter> set to its default value of
+<literal>3n</literal>, the main results are that:
+
+<itemizedlist>
+ <listitem>
+ <para>contents of <tag>refsect1</tag> are output with a
+ left margin of three characters instead the roff default of seven
+ or eight characters</para>
+ </listitem>
+ <listitem>
+ <para>contents of <tag>refsect2</tag> are displayed in
+ console output with a left margin of six characters instead the of
+ the roff default of seven characters</para>
+ </listitem>
+ <listitem>
+ <para> the contents of <tag>refsect3</tag> and nested
+ <tag>refsection</tag> instances are adjusted
+ accordingly.</para>
+ </listitem>
+</itemizedlist>
+
+If instead the value of <parameter>man.indent.refsect</parameter> is
+zero, no margin adjustment is done for <literal>refsect*</literal>
+output.</para>
+
+<tip>
+ <para>If your content is primarly comprised of
+ <tag>refsect1</tag> and <tag>refsect2</tag> content
+ (or the <tag>refsection</tag> equivalent)&#160;&#8211; with few or
+ no <tag>refsect3</tag> or lower nested sections , you may be
+ able to &#8220;conserve&#8221; space in your output by setting
+ <parameter>man.indent.refsect</parameter> to a non-zero value. Doing
+ so will &#8220;squeeze&#8221; the left margin in such as way as to provide an
+ additional four characters of &#8220;room&#8221; per line in
+ <tag>refsect1</tag> output. That extra room may be useful
+ if, for example, you have many verbatim sections with long lines in
+ them.</para>
+</tip>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="man.indent.blurbs">
+<refmeta>
+<refentrytitle>man.indent.blurbs</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>man.indent.blurbs</refname>
+<refpurpose>Adjust indentation of blurbs?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="man.indent.blurbs.frag">
+&lt;xsl:param name="man.indent.blurbs" select="1"&gt;&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If the value of <parameter>man.indent.blurbs</parameter> is
+non-zero, the width of the left margin for
+<tag>authorblurb</tag>, <tag>personblurb</tag>, and
+<tag>contrib</tag> output is set to the value of the
+<parameter>man.indent.width</parameter> parameter
+(<literal>3n</literal> by default). If instead the value of
+<parameter>man.indent.blurbs</parameter> is zero, the built-in roff
+default width (<literal>7.2n</literal>) is used.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="man.indent.lists">
+<refmeta>
+<refentrytitle>man.indent.lists</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>man.indent.lists</refname>
+<refpurpose>Adjust indentation of lists?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="man.indent.lists.frag">
+&lt;xsl:param name="man.indent.lists" select="1"&gt;&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If the value of <parameter>man.indent.lists</parameter> is
+non-zero, the width of the left margin for list items in
+<tag>itemizedlist</tag>,
+<tag>orderedlist</tag>,
+<tag>variablelist</tag> output (and output of some other
+lists) is set to the value of the
+<parameter>man.indent.width</parameter> parameter
+(<literal>4n</literal> by default). If instead the value of
+<parameter>man.indent.lists</parameter> is zero, the built-in roff
+default width (<literal>7.2n</literal>) is used.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="man.indent.verbatims">
+<refmeta>
+<refentrytitle>man.indent.verbatims</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>man.indent.verbatims</refname>
+<refpurpose>Adjust indentation of verbatims?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="man.indent.verbatims.frag">
+&lt;xsl:param name="man.indent.verbatims" select="1"&gt;&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If the value of <parameter>man.indent.verbatims</parameter> is
+non-zero, the width of the left margin for output of verbatim
+environments (<tag>programlisting</tag>,
+<tag>screen</tag>, and so on) is set to the value of the
+<parameter>man.indent.width</parameter> parameter
+(<literal>3n</literal> by default). If instead the value of
+<parameter>man.indent.verbatims</parameter> is zero, the built-in roff
+default width (<literal>7.2n</literal>) is used.</para>
+
+</refsection>
+</refentry>
+
+ </reference><reference id="fonts" xml:base="../manpages/param.xml">
+ <title>Fonts</title>
+<refentry version="5.0" id="man.font.funcprototype">
+<refmeta>
+<refentrytitle>man.font.funcprototype</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>man.font.funcprototype</refname>
+<refpurpose>Specifies font for funcprototype output</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="man.font.funcprototype.frag">
+ &lt;xsl:param name="man.font.funcprototype"&gt;BI&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The <parameter>man.font.funcprototype</parameter> parameter
+specifies the font for <tag>funcprototype</tag> output. It
+should be a valid roff font name, such as <literal>BI</literal> or
+<literal>B</literal>.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="man.font.funcsynopsisinfo">
+<refmeta>
+<refentrytitle>man.font.funcsynopsisinfo</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>man.font.funcsynopsisinfo</refname>
+<refpurpose>Specifies font for funcsynopsisinfo output</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="man.font.funcsynopsisinfo.frag">
+ &lt;xsl:param name="man.font.funcsynopsisinfo"&gt;B&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The <parameter>man.font.funcsynopsisinfo</parameter> parameter
+specifies the font for <tag>funcsynopsisinfo</tag> output. It
+should be a valid roff font name, such as <literal>B</literal> or
+<literal>I</literal>.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="man.font.links">
+<refmeta>
+<refentrytitle>man.font.links</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>man.font.links</refname>
+<refpurpose>Specifies font for links</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="man.font.links.frag">
+&lt;xsl:param name="man.font.links"&gt;B&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The <parameter>man.font.links</parameter> parameter
+specifies the font for output of links (<tag>ulink</tag> instances
+and any instances of any element with an <tag class="attribute">xlink:href</tag> attribute).</para>
+
+<para>The value of <parameter>man.font.links</parameter> must be
+ either <literal>B</literal> or <literal>I</literal>, or empty. If
+the value is empty, no font formatting is applied to links.</para>
+
+<para>If you set <parameter>man.endnotes.are.numbered</parameter> and/or
+<parameter>man.endnotes.list.enabled</parameter> to zero (disabled), then
+you should probably also set an empty value for
+<parameter>man.font.links</parameter>. But if
+<parameter>man.endnotes.are.numbered</parameter> is non-zero (enabled),
+you should probably keep
+<parameter>man.font.links</parameter> set to
+<literal>B</literal> or <literal>I</literal><footnote><para>The
+ main purpose of applying a font format to links in most output
+formats it to indicate that the formatted text is
+&#8220;clickable&#8221;; given that links rendered in man pages are
+not &#8220;real&#8221; hyperlinks that users can click on, it might
+seem like there is never a good reason to have font formatting for
+link contents in man output.</para>
+<para>In fact, if you suppress the
+display of inline link references (by setting
+<parameter>man.endnotes.are.numbered</parameter> to zero), there is no
+good reason to apply font formatting to links. However, if
+<parameter>man.endnotes.are.numbered</parameter> is non-zero, having
+font formatting for links (arguably) serves a purpose: It provides
+&#8220;context&#8221; information about exactly what part of the text
+is being &#8220;annotated&#8221; by the link. Depending on how you
+mark up your content, that context information may or may not
+have value.</para></footnote>.</para>
+</refsection>
+
+<refsection><info><title>Related Parameters</title></info>
+ <para><parameter>man.endnotes.list.enabled</parameter>,
+ <parameter>man.endnotes.are.numbered</parameter></para>
+</refsection>
+
+</refentry>
+
+<refentry version="5.0" id="man.font.table.headings">
+<refmeta>
+<refentrytitle>man.font.table.headings</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>man.font.table.headings</refname>
+<refpurpose>Specifies font for table headings</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="man.font.table.headings.frag">
+ &lt;xsl:param name="man.font.table.headings"&gt;B&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The <parameter>man.font.table.headings</parameter> parameter
+specifies the font for <tag>table</tag> headings. It should be
+a valid roff font, such as <literal>B</literal> or
+<literal>I</literal>.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="man.font.table.title">
+<refmeta>
+<refentrytitle>man.font.table.title</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>man.font.table.title</refname>
+<refpurpose>Specifies font for table headings</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="man.font.table.title.frag">
+ &lt;xsl:param name="man.font.table.title"&gt;B&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The <parameter>man.font.table.title</parameter> parameter
+specifies the font for <tag>table</tag> titles. It should be
+a valid roff font, such as <literal>B</literal> or
+<literal>I</literal>.</para>
+
+</refsection>
+</refentry>
+
+ </reference><reference id="synopsis" xml:base="../manpages/param.xml">
+ <title>SYNOPSIS section</title>
+<refentry version="5.0" id="man.funcsynopsis.style">
+<refmeta>
+<refentrytitle>man.funcsynopsis.style</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">list</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">ansi</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">kr</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>man.funcsynopsis.style</refname>
+<refpurpose>What style of <tag>funcsynopsis</tag> should be generated?</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+<programlisting id="man.funcsynopsis.style.frag">&lt;xsl:param name="man.funcsynopsis.style"&gt;ansi&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+<para>If <parameter>man.funcsynopsis.style</parameter> is
+<literal>ansi</literal>, ANSI-style function synopses are
+generated for a <tag>funcsynopsis</tag>, otherwise K&amp;R-style
+function synopses are generated.</para>
+</refsection>
+</refentry>
+
+ </reference><reference id="authors" xml:base="../manpages/param.xml">
+ <title>AUTHORS and COPYRIGHT sections</title>
+ <refentry version="5.0" id="man.authors.section.enabled">
+<refmeta>
+<refentrytitle>man.authors.section.enabled</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>man.authors.section.enabled</refname>
+<refpurpose>Display auto-generated AUTHORS section?</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+<programlisting id="man.authors.section.enabled.frag">
+&lt;xsl:param name="man.authors.section.enabled"&gt;1&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+
+<para>If the value of
+<parameter>man.authors.section.enabled</parameter> is non-zero
+(the default), then an <literal>AUTHORS</literal> section is
+generated near the end of each man page. The output of the
+<literal>AUTHORS</literal> section is assembled from any
+<tag>author</tag>, <tag>editor</tag>, and <tag>othercredit</tag>
+metadata found in the contents of the child <tag>info</tag> or
+<tag>refentryinfo</tag> (if any) of the <tag>refentry</tag>
+itself, or from any <tag>author</tag>, <tag>editor</tag>, and
+<tag>othercredit</tag> metadata that may appear in <tag>info</tag>
+contents of any ancestors of the <tag>refentry</tag>.</para>
+
+<para>If the value of
+<parameter>man.authors.section.enabled</parameter> is zero, the
+the auto-generated <literal>AUTHORS</literal> section is
+suppressed.</para>
+
+<para>Set the value of
+ <parameter>man.authors.section.enabled</parameter> to zero if
+ you want to have a manually created <literal>AUTHORS</literal>
+ section in your source, and you want it to appear in output
+ instead of the auto-generated <literal>AUTHORS</literal>
+ section.</para>
+</refsection>
+</refentry>
+
+ <refentry version="5.0" id="man.copyright.section.enabled">
+<refmeta>
+<refentrytitle>man.copyright.section.enabled</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>man.copyright.section.enabled</refname>
+<refpurpose>Display auto-generated COPYRIGHT section?</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+<programlisting id="man.copyright.section.enabled.frag">
+&lt;xsl:param name="man.copyright.section.enabled"&gt;1&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+
+<para>If the value of
+<parameter>man.copyright.section.enabled</parameter> is non-zero
+(the default), then a <literal>COPYRIGHT</literal> section is
+generated near the end of each man page. The output of the
+<literal>COPYRIGHT</literal> section is assembled from any
+<tag>copyright</tag> and <tag>legalnotice</tag> metadata found in
+the contents of the child <tag>info</tag> or
+<tag>refentryinfo</tag> (if any) of the <tag>refentry</tag>
+itself, or from any <tag>copyright</tag> and
+<tag>legalnotice</tag> metadata that may appear in <tag>info</tag>
+contents of any ancestors of the <tag>refentry</tag>.</para>
+
+<para>If the value of
+<parameter>man.copyright.section.enabled</parameter> is zero, the
+the auto-generated <literal>COPYRIGHT</literal> section is
+suppressed.</para>
+
+<para>Set the value of
+ <parameter>man.copyright.section.enabled</parameter> to zero if
+ you want to have a manually created <literal>COPYRIGHT</literal>
+ section in your source, and you want it to appear in output
+ instead of the auto-generated <literal>COPYRIGHT</literal>
+ section.</para>
+</refsection>
+</refentry>
+
+ </reference><reference id="endnotes" xml:base="../manpages/param.xml">
+ <title>Endnotes and link handling</title>
+<refentry version="5.0" id="man.endnotes.list.enabled">
+<refmeta>
+<refentrytitle>man.endnotes.list.enabled</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>man.endnotes.list.enabled</refname>
+<refpurpose>Display endnotes list at end of man page?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="man.endnotes.list.enabled.frag">
+&lt;xsl:param name="man.endnotes.list.enabled"&gt;1&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If the value of <parameter>man.endnotes.list.enabled</parameter> is
+non-zero (the default), then an endnotes list is added to the end of
+the output man page.</para>
+
+<para>If the value of <parameter>man.endnotes.list.enabled</parameter> is
+zero, the list is suppressed &#8212; unless link numbering is enabled (that
+is, if <parameter>man.endnotes.are.numbered</parameter> is non-zero), in
+which case, that setting overrides the
+<parameter>man.endnotes.list.enabled</parameter> setting, and the
+endnotes list is still displayed. The reason is that inline
+numbering of notesources associated with endnotes only makes sense
+if a (numbered) list of endnotes is also generated.</para>
+
+<note>
+ <para>Leaving
+ <parameter>man.endnotes.list.enabled</parameter> at its default
+ (non-zero) value ensures that no &#8220;out of line&#8221; information (such
+ as the URLs for hyperlinks and images) gets lost in your
+ man-page output. It just gets &#8220;rearranged&#8221;.</para>
+ <para>So if you&#8217;re thinking about disabling endnotes listing by
+ setting the value of
+ <parameter>man.endnotes.list.enabled</parameter> to zero:
+ Before you do so, first take some time to carefully consider
+ the information needs and experiences of your users. The &#8220;out
+ of line&#8221; information has value even if the presentation of it
+ in text output is not as interactive as it may be in other
+ output formats.</para>
+ <para>As far as the specific case of URLs: Even though the URLs
+ displayed in text output may not be &#8220;real&#8221; (clickable)
+ hyperlinks, many X terminals have convenience features for
+ recognizing URLs and can, for example, present users with
+ an options to open a URL in a browser with the user clicks on
+ the URL is a terminal window. And short of those, users with X
+ terminals can always manually cut and paste the URLs into a web
+ browser.</para>
+ <para>Also, note that various &#8220;man to html&#8221; tools, such as the
+ widely used <command><link xlink:href="http://users.actrix.gen.nz/michael/vhman2html.html">man2html</link></command> (<literal>VH-Man2html</literal>)
+ application, automatically mark up URLs with <literal>a@href</literal> markup
+ during conversion &#8212; resulting in &#8220;real&#8221; hyperlinks in HTML
+ output from those tools.</para>
+</note>
+
+<para>To &#8220;turn off&#8221; numbering of endnotes in the
+endnotes list, set <parameter>man.endnotes.are.numbered</parameter>
+to zero. The endnotes list will
+still be displayed; it will just be displayed without the
+numbers<footnote><para>It can still make sense to have
+the list of endnotes displayed even if you have endnotes numbering turned
+off. In that case, your endnotes list basically becomes a &#8220;list
+of references&#8221; without any association with specific text in
+your document. This is probably the best option if you find the inline
+endnotes numbering obtrusive. Your users will still have access to all the &#8220;out of line&#8221;
+such as URLs for hyperlinks.</para></footnote>
+</para>
+
+<para>The default heading for the endnotes list is
+<literal>NOTES</literal>. To change that, set a non-empty
+value for the <parameter>man.endnotes.list.heading</parameter>
+parameter.</para>
+
+<para>In the case of notesources that are links: Along with the
+URL for each link, the endnotes list includes the contents of the
+link. The list thus includes only non-empty<footnote>
+
+<para>A &#8220;non-empty&#8221; link is one that looks like
+this:<literallayout class="monospaced"> &lt;ulink url="http://docbook.sf.net/snapshot/xsl/doc/manpages/"&gt;manpages&lt;/ulink&gt;</literallayout>
+an &#8220;empty link&#8221; is on that looks like this:<literallayout class="monospaced"> &lt;ulink url="http://docbook.sf.net/snapshot/xsl/doc/manpages/"/&gt;</literallayout>
+</para></footnote> links.
+
+Empty links are never included, and never numbered. They are simply
+displayed inline, without any numbering.</para>
+
+<para>In addition, if there are multiple instances of links in a
+<tag>refentry</tag> that have the same URL, the URL is listed only
+once. The contents listed for that link in the endnotes list are
+the contents of the first link which has that URL.</para>
+
+<para>If you disable endnotes listing, you should probably also set
+<parameter>man.links.are.underlined</parameter> to zero (to disable
+link underlining).</para>
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="man.endnotes.list.heading">
+<refmeta>
+<refentrytitle>man.endnotes.list.heading</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>man.endnotes.list.heading</refname>
+<refpurpose>Specifies an alternate name for endnotes list</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="man.endnotes.list.heading.frag">
+&lt;xsl:param name="man.endnotes.list.heading"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If the value of the
+<parameter>man.endnotes.are.numbered</parameter> parameter
+and/or the <parameter>man.endnotes.list.enabled</parameter>
+parameter is non-zero (the defaults for both are non-zero), a
+numbered list of endnotes is generated near the end of each man
+page. The default heading for the list of endnotes is the
+equivalent of the English word <literal>NOTES</literal> in
+the current locale. To cause an alternate heading to be displayed,
+set a non-empty value for the
+<parameter>man.endnotes.list.heading</parameter> parameter &#8212;
+for example, <literal>REFERENCES</literal>.</para>
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="man.endnotes.are.numbered">
+<refmeta>
+<refentrytitle>man.endnotes.are.numbered</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>man.endnotes.are.numbered</refname>
+<refpurpose>Number endnotes?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="man.endnotes.are.numbered.frag">
+&lt;xsl:param name="man.endnotes.are.numbered"&gt;1&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If the value of <parameter>man.endnotes.are.numbered</parameter> is
+non-zero (the default), then for each non-empty<footnote>
+<para>A &#8220;non-empty&#8221; notesource is one that looks like
+this:<literallayout class="monospaced"> &lt;ulink url="http://docbook.sf.net/snapshot/xsl/doc/manpages/"&gt;manpages&lt;/ulink&gt;</literallayout>
+an &#8220;empty&#8221; notesource is on that looks like this:<literallayout class="monospaced"> &lt;ulink url="http://docbook.sf.net/snapshot/xsl/doc/manpages/"/&gt;</literallayout>
+</para></footnote> &#8220;notesource&#8221;:
+
+<itemizedlist>
+ <listitem>
+ <para>a number (in square brackets) is displayed inline after the
+ rendered inline contents (if any) of the notesource</para>
+ </listitem>
+ <listitem>
+ <para>the contents of the notesource are included in a
+ numbered list of endnotes that is generated at the end of
+ each man page; the number for each endnote corresponds to
+ the inline number for the notesource with which it is
+ associated</para>
+ </listitem>
+</itemizedlist>
+The default heading for the list of endnotes is
+<literal>NOTES</literal>. To output a different heading, set a value
+for the <parameter>man.endnotes.section.heading</parameter>
+parameter.</para>
+
+<note>
+ <para>The endnotes list is also displayed (but without
+ numbers) if the value of
+ <parameter>man.endnotes.list.enabled</parameter> is
+ non-zero.</para>
+</note>
+
+
+<para>If the value of <parameter>man.endnotes.are.numbered</parameter> is
+zero, numbering of endnotess is suppressed; only inline
+contents (if any) of the notesource are displayed inline.
+<important>
+ <para>If you are thinking about disabling endnote numbering by setting
+ the value of <parameter>man.endnotes.are.numbered</parameter> to zero,
+ before you do so, first take some time to carefully
+ consider the information needs and experiences of your users. The
+ square-bracketed numbers displayed inline after notesources may seem
+ obstrusive and aesthetically unpleasing<footnote><para>As far as notesources that are links, ytou might
+ think it would be better to just display URLs for non-empty
+ links inline, after their content, rather than displaying
+ square-bracketed numbers all over the place. But it's not better. In
+ fact, it's not even practical, because many (most) URLs for links
+ are too long to be displayed inline. They end up overflowing the
+ right margin. You can set a non-zero value for
+ <parameter>man.break.after.slash</parameter> parameter to deal with
+ that, but it could be argued that what you end up with is at least
+ as ugly, and definitely more obstrusive, then having short
+ square-bracketed numbers displayed inline.</para></footnote>,
+
+ but in a text-only output format, the
+ numbered-notesources/endnotes-listing mechanism is the only
+ practical way to handle this kind of content.</para>
+
+ <para>Also, users of &#8220;text based&#8221; browsers such as
+ <command>lynx</command> will already be accustomed to seeing inline
+ numbers for links. And various "man to html" applications, such as
+ the widely used <command><link xlink:href="http://users.actrix.gen.nz/michael/vhman2html.html">man2html</link></command> (<literal>VH-Man2html</literal>)
+ application, can automatically turn URLs into "real" HTML hyperlinks
+ in output. So leaving <parameter>man.endnotes.are.numbered</parameter>
+ at its default (non-zero) value ensures that no information is
+ lost in your man-page output. It just gets
+ &#8220;rearranged&#8221;.</para>
+</important>
+</para>
+<para>The handling of empty links is not affected by this
+parameter. Empty links are handled simply by displaying their URLs
+inline. Empty links are never auto-numbered.</para>
+
+<para>If you disable endnotes numbering, you should probably also set
+<parameter>man.font.links</parameter> to an empty value (to
+disable font formatting for links.</para>
+</refsection>
+
+<refsection><info><title>Related Parameters</title></info>
+ <para><parameter>man.endnotes.list.enabled</parameter>,
+ <parameter>man.font.links</parameter></para>
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="man.base.url.for.relative.links">
+ <refmeta>
+ <refentrytitle>man.base.url.for.relative.links</refentrytitle>
+ <refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+ </refmeta>
+ <refnamediv>
+ <refname>man.base.url.for.relative.links</refname>
+ <refpurpose>Specifies a base URL for relative links</refpurpose>
+ </refnamediv>
+
+ <refsynopsisdiv>
+ <programlisting id="man.base.url.for.relative.links.frag">&lt;xsl:param name="man.base.url.for.relative.links"&gt;[set $man.base.url.for.relative.links]/&lt;/xsl:param&gt;</programlisting>
+ </refsynopsisdiv>
+
+ <refsection><info><title>Description</title></info>
+
+ <para>For any &#8220;notesource&#8221; listed in the auto-generated
+ &#8220;NOTES&#8221; section of output man pages (which is generated when
+ the value of the
+ <parameter>man.endnotes.list.enabled</parameter> parameter
+ is non-zero), if the notesource is a link source with a
+ relative URI, the URI is displayed in output with the value
+ of the
+ <parameter>man.base.url.for.relative.links</parameter>
+ parameter prepended to the value of the link URI.</para>
+
+ <note>
+ <para>A link source is an notesource that references an
+ external resource:
+ <itemizedlist>
+ <listitem>
+ <para>a <tag>ulink</tag> element with a <tag class="attribute">url</tag> attribute</para>
+ </listitem>
+ <listitem>
+ <para>any element with an <tag class="attribute">xlink:href</tag> attribute</para>
+ </listitem>
+ <listitem>
+ <para>an <tag>imagedata</tag>, <tag>audiodata</tag>, or
+ <tag>videodata</tag> element</para>
+ </listitem>
+ </itemizedlist>
+ </para>
+ </note>
+
+ <para>If you use relative URIs in link sources in your DocBook
+ <tag>refentry</tag> source, and you leave
+ <parameter>man.base.url.for.relative.links</parameter>
+ unset, the relative links will appear &#8220;as is&#8221; in the &#8220;Notes&#8221;
+ section of any man-page output generated from your source.
+ That&#8217;s probably not what you want, because such relative
+ links are only usable in the context of HTML output. So, to
+ make the links meaningful and usable in the context of
+ man-page output, set a value for
+ <parameter>man.base.url.for.relative.links</parameter> that
+ points to the online version of HTML output generated from
+ your DocBook <tag>refentry</tag> source. For
+ example:
+ <programlisting>&lt;xsl:param name="man.base.url.for.relative.links"
+ &gt;http://www.kernel.org/pub/software/scm/git/docs/&lt;/xsl:param&gt;</programlisting>
+ </para>
+
+ </refsection>
+
+ <refsection><info><title>Related Parameters</title></info>
+ <para><parameter>man.endnotes.list.enabled</parameter></para>
+ </refsection>
+
+</refentry>
+
+ </reference><reference id="lists" xml:base="../manpages/param.xml">
+ <title>Lists</title>
+<refentry version="5.0" id="man.segtitle.suppress">
+<refmeta>
+<refentrytitle>man.segtitle.suppress</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>man.segtitle.suppress</refname>
+<refpurpose>Suppress display of segtitle contents?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="man.segtitle.suppress.frag">
+&lt;xsl:param name="man.segtitle.suppress" select="0"&gt;&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If the value of <parameter>man.segtitle.suppress</parameter> is
+non-zero, then display of <tag>segtitle</tag> contents is
+suppressed in output.</para>
+
+</refsection>
+</refentry>
+
+ </reference><reference id="charmap" xml:base="../manpages/param.xml">
+ <title>Character/string substitution</title>
+<refentry version="5.0" id="man.charmap.enabled">
+<refmeta>
+<refentrytitle>man.charmap.enabled</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>man.charmap.enabled</refname>
+<refpurpose>Apply character map before final output?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="man.charmap.enabled.frag">
+&lt;xsl:param name="man.charmap.enabled" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If the value of the <parameter>man.charmap.enabled</parameter>
+parameter is non-zero, a "character map" is used to substitute certain
+Unicode symbols and special characters with appropriate roff/groff
+equivalents, just before writing each man-page file to the
+filesystem. If instead the value of
+<parameter>man.charmap.enabled</parameter> is zero, Unicode characters
+are passed through "as is".</para>
+
+<refsection><info><title>Details</title></info>
+
+<para>For converting certain Unicode symbols and special characters in
+UTF-8 or UTF-16 encoded XML source to appropriate groff/roff
+equivalents in man-page output, the DocBook XSL Stylesheets
+distribution includes a <link xlink:href="http://docbook.sourceforge.net/snapshot/xsl/manpages/charmap.groff.xsl">roff character map</link> that is compliant with the <link xlink:href="http://www.w3.org/TR/xslt20/#character-maps">XSLT character
+map</link> format as detailed in the XSLT 2.0 specification. The map
+contains more than 800 character mappings and can be considered the
+standard roff character map for the distribution.</para>
+
+<para>You can use the <parameter>man.charmap.uri</parameter>
+parameter to specify a URI for the location for an alternate roff
+character map to use in place of the standard roff character map
+provided in the distribution.</para>
+
+<para>You can also use a subset of a character map. For details,
+see the <parameter>man.charmap.use.subset</parameter>,
+<parameter>man.charmap.subset.profile</parameter>, and
+<parameter>man.charmap.subset.profile.english</parameter>
+parameters.</para>
+
+</refsection>
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="man.charmap.uri">
+<refmeta>
+<refentrytitle>man.charmap.uri</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">uri</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>man.charmap.uri</refname>
+<refpurpose>URI for custom roff character map</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="man.charmap.uri.frag">
+&lt;xsl:param name="man.charmap.uri"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>For converting certain Unicode symbols and special characters in
+UTF-8 or UTF-16 encoded XML source to appropriate groff/roff
+equivalents in man-page output, the DocBook XSL Stylesheets
+distribution includes an <link xlink:href="http://www.w3.org/TR/xslt20/#character-maps">XSLT character
+map</link>. That character map can be considered the standard roff
+character map for the distribution.</para>
+
+<para>If the value of the <parameter>man.charmap.uri</parameter>
+parameter is non-empty, that value is used as the URI for the location
+for an alternate roff character map to use in place of the standard
+roff character map provided in the distribution.</para>
+
+<warning>
+<para>Do not set a value for <parameter>man.charmap.uri</parameter>
+unless you have a custom roff character map that differs from the
+standard one provided in the distribution.</para>
+</warning>
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="man.charmap.use.subset">
+<refmeta>
+<refentrytitle>man.charmap.use.subset</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>man.charmap.use.subset</refname>
+<refpurpose>Use subset of character map instead of full map?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="man.charmap.use.subset.frag">
+&lt;xsl:param name="man.charmap.use.subset" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If the value of the
+<parameter>man.charmap.use.subset</parameter> parameter is non-zero,
+a subset of the roff character map is used instead of the full roff
+character map. The profile of the subset used is determined either
+by the value of the
+<parameter>man.charmap.subset.profile</parameter>
+parameter (if the source is not in English) or the
+<parameter>man.charmap.subset.profile.english</parameter>
+parameter (if the source is in English).</para>
+
+<note>
+ <para>You may want to experiment with setting a non-zero value of
+ <parameter>man.charmap.use.subset</parameter>, so that the full
+ character map is used. Depending on which XSLT engine you run,
+ setting a non-zero value for
+ <parameter>man.charmap.use.subset</parameter> may significantly
+ increase the time needed to process your documents. Or it may
+ not. For example, if you set it and run it with xsltproc, it seems
+ to dramatically increase processing time; on the other hand, if you
+ set it and run it with Saxon, it does not seem to increase
+ processing time nearly as much.</para>
+
+ <para>If processing time is not a important concern and/or you can
+ tolerate the increase in processing time imposed by using the full
+ character map, set <parameter>man.charmap.use.subset</parameter> to
+ zero.</para>
+</note>
+
+<refsection><info><title>Details</title></info>
+
+<para>For converting certain Unicode symbols and special characters in
+UTF-8 or UTF-16 encoded XML source to appropriate groff/roff
+equivalents in man-page output, the DocBook XSL Stylesheets
+distribution includes a <link xlink:href="http://docbook.sourceforge.net/snapshot/xsl/manpages/charmap.groff.xsl">roff character map</link> that is compliant with the <link xlink:href="http://www.w3.org/TR/xslt20/#character-maps">XSLT character
+map</link> format as detailed in the XSLT 2.0 specification. The map
+contains more than 800 character mappings and can be considered the
+standard roff character map for the distribution.</para>
+
+<note>
+<para>You can use the <parameter>man.charmap.uri</parameter>
+parameter to specify a URI for the location for an alternate roff
+character map to use in place of the standard roff character map
+provided in the distribution.</para>
+</note>
+
+<para>Because it is not terrifically efficient to use the standard
+800-character character map in full -- and for most (or all) users,
+never necessary to use it in full -- the DocBook XSL Stylesheets
+support a mechanism for using, within any given character map, a
+subset of character mappings instead of the full set. You can use the
+<parameter>man.charmap.subset.profile</parameter> or
+<parameter>man.charmap.subset.profile.english</parameter>
+parameter to tune the profile of that subset to use.</para>
+
+</refsection>
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="man.charmap.subset.profile">
+<refmeta>
+<refentrytitle>man.charmap.subset.profile</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>man.charmap.subset.profile</refname>
+<refpurpose>Profile of character map subset</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="man.charmap.subset.profile.frag">
+&lt;xsl:param name="man.charmap.subset.profile"&gt;
+@*[local-name() = 'block'] = 'Miscellaneous Technical' or
+(@*[local-name() = 'block'] = 'C1 Controls And Latin-1 Supplement (Latin-1 Supplement)' and
+ (@*[local-name() = 'class'] = 'symbols' or
+ @*[local-name() = 'class'] = 'letters')
+) or
+@*[local-name() = 'block'] = 'Latin Extended-A'
+or
+(@*[local-name() = 'block'] = 'General Punctuation' and
+ (@*[local-name() = 'class'] = 'spaces' or
+ @*[local-name() = 'class'] = 'dashes' or
+ @*[local-name() = 'class'] = 'quotes' or
+ @*[local-name() = 'class'] = 'bullets'
+ )
+) or
+@*[local-name() = 'name'] = 'HORIZONTAL ELLIPSIS' or
+@*[local-name() = 'name'] = 'WORD JOINER' or
+@*[local-name() = 'name'] = 'SERVICE MARK' or
+@*[local-name() = 'name'] = 'TRADE MARK SIGN' or
+@*[local-name() = 'name'] = 'ZERO WIDTH NO-BREAK SPACE'
+&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If the value of the
+<parameter>man.charmap.use.subset</parameter> parameter is non-zero,
+and your DocBook source is not written in English (that
+ is, if the <tag class="attribute">lang</tag> or <tag class="attribute">xml:lang</tag> attribute on the root element
+ in your DocBook source or on the first <tag>refentry</tag>
+ element in your source has a value other than
+ <literal>en</literal>), then the character-map subset specified
+ by the <parameter>man.charmap.subset.profile</parameter>
+ parameter is used instead of the full roff character map.</para>
+
+<para>Otherwise, if the <tag class="attribute">lang</tag> or <tag class="attribute">xml:lang</tag> attribute on the root
+ element in your DocBook
+ source or on the first <tag>refentry</tag> element in your source
+ has the value <literal>en</literal> or if it has no <tag class="attribute">lang</tag> or <tag class="attribute">xml:lang</tag> attribute, then the character-map
+ subset specified by the
+ <parameter>man.charmap.subset.profile.english</parameter>
+ parameter is used instead of
+ <parameter>man.charmap.subset.profile</parameter>.</para>
+
+<para>The difference between the two subsets is that
+ <parameter>man.charmap.subset.profile</parameter> provides
+ mappings for characters in Western European languages that are
+ not part of the Roman (English) alphabet (ASCII character set).</para>
+
+<para>The value of <parameter>man.charmap.subset.profile</parameter>
+is a string representing an XPath expression that matches attribute
+names and values for <tag namespace="http://docbook.sf.net/xmlns/unichar/1.0">output-character</tag>
+elements in the character map.</para>
+
+<para>The attributes supported in the <link xlink:href="http://docbook.sourceforge.net/snapshot/xsl/manpages/charmap.groff.xsl">standard roff character map included in the distribution</link> are:
+<variablelist>
+ <varlistentry>
+ <term>character</term>
+ <listitem>
+ <simpara>a raw Unicode character or numeric Unicode
+ character-entity value (either in decimal or hex); all
+ characters have this attribute</simpara>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>name</term>
+ <listitem>
+ <simpara>a standard full/long ISO/Unicode character name (e.g.,
+ "OHM SIGN"); all characters have this attribute</simpara>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>block</term>
+ <listitem>
+ <simpara>a standard Unicode "block" name (e.g., "General
+ Punctuation"); all characters have this attribute. For the full
+ list of Unicode block names supported in the standard roff
+ character map, see <xref linkend="BlocksAndClasses"/>.</simpara>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>class</term>
+ <listitem>
+ <simpara>a class of characters (e.g., "spaces"). Not all
+ characters have this attribute; currently, it is used only with
+ certain characters within the "C1 Controls And Latin-1
+ Supplement" and "General Punctuation" blocks. For details, see
+ <xref linkend="BlocksAndClasses"/>.</simpara>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>entity</term>
+ <listitem>
+ <simpara>an ISO entity name (e.g., "ohm"); not all characters
+ have this attribute, because not all characters have ISO entity
+ names; for example, of the 800 or so characters in the standard
+ roff character map included in the distribution, only around 300
+ have ISO entity names.
+ </simpara>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>string</term>
+ <listitem>
+ <simpara>a string representing an roff/groff escape-code (with
+ "@esc@" used in place of the backslash), or a simple ASCII
+ string; all characters in the roff character map have this
+ attribute</simpara>
+ </listitem>
+ </varlistentry>
+</variablelist>
+</para>
+<para>The value of <parameter>man.charmap.subset.profile</parameter>
+is evaluated as an XPath expression at run-time to select a portion of
+the roff character map to use. You can tune the subset used by adding
+or removing parts. For example, if you need to use a wide range of
+mathematical operators in a document, and you want to have them
+converted into roff markup properly, you might add the following:
+
+<literallayout class="monospaced"> @*[local-name() = 'block'] ='MathematicalOperators' </literallayout>
+
+That will cause a additional set of around 67 additional "math"
+characters to be converted into roff markup. </para>
+
+<note>
+<para>Depending on which XSLT engine you use, either the EXSLT
+<function>dyn:evaluate</function> extension function (for xsltproc or
+Xalan) or <function>saxon:evaluate</function> extension function (for
+Saxon) are used to dynamically evaluate the value of
+<parameter>man.charmap.subset.profile</parameter> at run-time. If you
+don't use xsltproc, Saxon, Xalan -- or some other XSLT engine that
+supports <function>dyn:evaluate</function> -- you must either set the
+value of the <parameter>man.charmap.use.subset</parameter> parameter
+to zero and process your documents using the full character map
+instead, or set the value of the
+<parameter>man.charmap.enabled</parameter> parameter to zero instead
+(so that character-map processing is disabled completely.</para>
+</note>
+
+<para>An alternative to using
+<parameter>man.charmap.subset.profile</parameter> is to create your
+own custom character map, and set the value of
+<parameter>man.charmap.uri</parameter> to the URI/filename for
+that. If you use a custom character map, you will probably want to
+include in it just the characters you want to use, and so you will
+most likely also want to set the value of
+<parameter>man.charmap.use.subset</parameter> to zero.</para>
+<para>You can create a
+custom character map by making a copy of the <link xlink:href="http://docbook.sourceforge.net/snapshot/xsl/manpages/charmap.groff.xsl">standard roff character map</link> provided in the distribution, and
+then adding to, changing, and/or deleting from that.</para>
+
+<caution>
+<para>If you author your DocBook XML source in UTF-8 or UTF-16
+encoding and aren't sure what OSes or environments your man-page
+output might end up being viewed on, and not sure what version of
+nroff/groff those environments might have, you should be careful about
+what Unicode symbols and special characters you use in your source and
+what parts you add to the value of
+<parameter>man.charmap.subset.profile</parameter>.</para>
+<para>Many of the escape codes used are specific to groff and using
+them may not provide the expected output on an OS or environment that
+uses nroff instead of groff.</para>
+<para>On the other hand, if you intend for your man-page output to be
+viewed only on modern systems (for example, GNU/Linux systems, FreeBSD
+systems, or Cygwin environments) that have a good, up-to-date groff,
+then you can safely include a wide range of Unicode symbols and
+special characters in your UTF-8 or UTF-16 encoded DocBook XML source
+and add any of the supported Unicode block names to the value of
+<parameter>man.charmap.subset.profile</parameter>.</para>
+</caution>
+
+
+<para>For other details, see the documentation for the
+<parameter>man.charmap.use.subset</parameter> parameter.</para>
+
+<refsection id="BlocksAndClasses"><info><title>Supported Unicode block names and "class" values</title></info>
+
+
+ <para>Below is the full list of Unicode block names and "class"
+ values supported in the standard roff stylesheet provided in the
+ distribution, along with a description of which codepoints from the
+ Unicode range corresponding to that block name or block/class
+ combination are supported.</para>
+
+ <itemizedlist>
+ <listitem>
+ <para><link xlink:href="http://zvon.org/other/charSearch/PHP/search.php?searchType=103&amp;id=C1%20Controls%20and%20Latin-1%20Supplement%20(Latin-1%20Supplement)">C1 Controls And Latin-1 Supplement (Latin-1 Supplement)</link> (x00a0 to x00ff)
+ <itemizedlist><info><title>class values</title></info>
+
+ <listitem>
+ <para>symbols</para>
+ </listitem>
+ <listitem>
+ <para>letters</para>
+ </listitem>
+ </itemizedlist></para>
+ </listitem>
+ <listitem>
+ <para><link xlink:href="http://zvon.org/other/charSearch/PHP/search.php?searchType=103&amp;id=Latin%20Extended-A">Latin Extended-A</link> (x0100 to x017f, partial)</para>
+ </listitem>
+ <listitem>
+ <para><link xlink:href="http://zvon.org/other/charSearch/PHP/search.php?searchType=103&amp;id=Spacing%20Modifier%20Letters">Spacing Modifier Letters</link> (x02b0 to x02ee, partial)</para>
+ </listitem>
+ <listitem>
+ <para><link xlink:href="http://zvon.org/other/charSearch/PHP/search.php?searchType=103&amp;id=Greek%20and%20Coptic">Greek and Coptic</link> (x0370 to x03ff, partial)</para>
+ </listitem>
+ <listitem>
+ <para><link xlink:href="http://zvon.org/other/charSearch/PHP/search.php?searchType=103&amp;id=General%20Punctuation">General Punctuation</link> (x2000 to x206f, partial)
+ <itemizedlist><info><title>class values</title></info>
+
+ <listitem>
+ <para><link xlink:href="http://zvon.org/other/charSearch/PHP/search.php?searchType=103&amp;start=8192&amp;end=8203">spaces</link></para>
+ </listitem>
+ <listitem>
+ <para><link xlink:href="http://zvon.org/other/charSearch/PHP/search.php?searchType=103&amp;start=8208&amp;end=8213">dashes</link></para>
+ </listitem>
+ <listitem>
+ <para>quotes</para>
+ </listitem>
+ <listitem>
+ <para>daggers</para>
+ </listitem>
+ <listitem>
+ <para>bullets</para>
+ </listitem>
+ <listitem>
+ <para>leaders</para>
+ </listitem>
+ <listitem>
+ <para>primes</para>
+ </listitem>
+ </itemizedlist>
+ </para>
+ </listitem>
+ <listitem>
+ <para><link xlink:href="http://zvon.org/other/charSearch/PHP/search.php?searchType=103&amp;id=Superscripts%20and%20Subscripts">Superscripts and Subscripts</link> (x2070 to x209f)</para>
+ </listitem>
+ <listitem>
+ <para><link xlink:href="http://zvon.org/other/charSearch/PHP/search.php?searchType=103&amp;id=Currency%20Symbols">Currency Symbols</link> (x20a0 to x20b1)</para>
+ </listitem>
+ <listitem>
+ <para><link xlink:href="http://zvon.org/other/charSearch/PHP/search.php?searchType=103&amp;id=Letterlike%20Symbols">Letterlike Symbols</link> (x2100 to x214b)</para>
+ </listitem>
+ <listitem>
+ <para><link xlink:href="http://zvon.org/other/charSearch/PHP/search.php?searchType=103&amp;id=Number%20Forms">Number Forms</link> (x2150 to x218f)</para>
+ </listitem>
+ <listitem>
+ <para><link xlink:href="http://zvon.org/other/charSearch/PHP/search.php?searchType=103&amp;id=Arrows">Arrows</link> (x2190 to x21ff, partial)</para>
+ </listitem>
+ <listitem>
+ <para><link xlink:href="http://zvon.org/other/charSearch/PHP/search.php?searchType=103&amp;id=Mathematical%20Operators">Mathematical Operators</link> (x2200 to x22ff, partial)</para>
+ </listitem>
+ <listitem>
+ <para><link xlink:href="http://zvon.org/other/charSearch/PHP/search.php?searchType=103&amp;id=Control%20Pictures">Control Pictures</link> (x2400 to x243f)</para>
+ </listitem>
+ <listitem>
+ <para><link xlink:href="http://zvon.org/other/charSearch/PHP/search.php?searchType=103&amp;id=Enclosed%20Alphanumerics">Enclosed Alphanumerics</link> (x2460 to x24ff)</para>
+ </listitem>
+ <listitem>
+ <para><link xlink:href="http://zvon.org/other/charSearch/PHP/search.php?searchType=103&amp;id=Geometric%20Shapes">Geometric Shapes</link> (x25a0 to x25f7, partial)</para>
+ </listitem>
+ <listitem>
+ <para><link xlink:href="http://zvon.org/other/charSearch/PHP/search.php?searchType=103&amp;id=Miscellaneous%20Symbols">Miscellaneous Symbols</link> (x2600 to x26ff, partial)</para>
+ </listitem>
+ <listitem>
+ <para><link xlink:href="http://zvon.org/other/charSearch/PHP/search.php?searchType=103&amp;id=Dingbats">Dingbats</link> (x2700 to x27be, partial)</para>
+ </listitem>
+ <listitem>
+ <para><link xlink:href="http://zvon.org/other/charSearch/PHP/search.php?searchType=103&amp;id=Alphabetic%20Presentation%20Forms">Alphabetic Presentation Forms</link> (xfb00 to xfb04 only)</para>
+ </listitem>
+ </itemizedlist>
+</refsection>
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="man.charmap.subset.profile.english">
+<refmeta>
+<refentrytitle>man.charmap.subset.profile.english</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>man.charmap.subset.profile.english</refname>
+<refpurpose>Profile of character map subset</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="man.charmap.subset.profile.english.frag">
+&lt;xsl:param name="man.charmap.subset.profile.english"&gt;
+@*[local-name() = 'block'] = 'Miscellaneous Technical' or
+(@*[local-name() = 'block'] = 'C1 Controls And Latin-1 Supplement (Latin-1 Supplement)' and
+ @*[local-name() = 'class'] = 'symbols')
+or
+(@*[local-name() = 'block'] = 'General Punctuation' and
+ (@*[local-name() = 'class'] = 'spaces' or
+ @*[local-name() = 'class'] = 'dashes' or
+ @*[local-name() = 'class'] = 'quotes' or
+ @*[local-name() = 'class'] = 'bullets'
+ )
+) or
+@*[local-name() = 'name'] = 'HORIZONTAL ELLIPSIS' or
+@*[local-name() = 'name'] = 'WORD JOINER' or
+@*[local-name() = 'name'] = 'SERVICE MARK' or
+@*[local-name() = 'name'] = 'TRADE MARK SIGN' or
+@*[local-name() = 'name'] = 'ZERO WIDTH NO-BREAK SPACE'
+&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If the value of the
+ <parameter>man.charmap.use.subset</parameter> parameter is
+ non-zero, and your DocBook source is written in English (that
+ is, if its <tag class="attribute">lang</tag> or <tag class="attribute">xml:lang</tag> attribute on the root element
+ in your DocBook source or on the first <tag>refentry</tag>
+ element in your source has the value <literal>en</literal> or if
+ it has no <tag class="attribute">lang</tag> or <tag class="attribute">xml:lang</tag> attribute), then the
+ character-map subset specified by the
+ <parameter>man.charmap.subset.profile.english</parameter>
+ parameter is used instead of the full roff character map.</para>
+
+<para>Otherwise, if the <tag class="attribute">lang</tag> or <tag class="attribute">xml:lang</tag> attribute
+ on the root element in your DocBook source or on the first
+ <tag>refentry</tag> element in your source has a value other
+ than <literal>en</literal>, then the character-map subset
+ specified by the
+ <parameter>man.charmap.subset.profile</parameter> parameter is
+ used instead of
+ <parameter>man.charmap.subset.profile.english</parameter>.</para>
+
+<para>The difference between the two subsets is that
+ <parameter>man.charmap.subset.profile</parameter> provides
+ mappings for characters in Western European languages that are
+ not part of the Roman (English) alphabet (ASCII character set).</para>
+
+<para>The value of <parameter>man.charmap.subset.profile.english</parameter>
+is a string representing an XPath expression that matches attribute
+names and values for <tag namespace="http://docbook.sf.net/xmlns/unichar/1.0">output-character</tag> elements in the character map.</para>
+
+<para>For other details, see the documentation for the
+<parameter>man.charmap.subset.profile.english</parameter> and
+<parameter>man.charmap.use.subset</parameter> parameters.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="man.string.subst.map.local.pre">
+<refmeta>
+<refentrytitle>man.string.subst.map.local.pre</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>man.string.subst.map.local.pre</refname>
+<refpurpose>Specifies &#8220;local&#8221; string substitutions</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="man.string.subst.map.local.pre.frag">
+ &lt;xsl:param name="man.string.subst.map.local.pre"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Use the <parameter>man.string.subst.map.local.pre</parameter>
+parameter to specify any &#8220;local&#8221; string substitutions to perform over
+the entire roff source for each man page <emphasis>before</emphasis>
+performing the string substitutions specified by the <parameter>man.string.subst.map</parameter> parameter.</para>
+
+<para>For details about the format of this parameter, see the
+documentation for the <parameter>man.string.subst.map</parameter>
+parameter.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="man.string.subst.map">
+<refmeta>
+<refentrytitle>man.string.subst.map</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">rtf</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>man.string.subst.map</refname>
+<refpurpose>Specifies a set of string substitutions</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="man.string.subst.map.frag">
+&lt;xsl:param name="man.string.subst.map"&gt;
+
+ &lt;!-- * remove no-break marker at beginning of line (stylesheet artifact) --&gt;
+ &lt;ss:substitution oldstring="&#9618;&#9600;" newstring="&#9618;"&gt;&lt;/ss:substitution&gt;
+ &lt;!-- * replace U+2580 no-break marker (stylesheet-added) w/ no-break space --&gt;
+ &lt;ss:substitution oldstring="&#9600;" newstring="\ "&gt;&lt;/ss:substitution&gt;
+
+ &lt;!-- ==================================================================== --&gt;
+
+ &lt;!-- * squeeze multiple newlines before a roff request --&gt;
+ &lt;ss:substitution oldstring="
+
+." newstring="
+."&gt;&lt;/ss:substitution&gt;
+ &lt;!-- * remove any .sp instances that directly precede a .PP --&gt;
+ &lt;ss:substitution oldstring=".sp
+.PP" newstring=".PP"&gt;&lt;/ss:substitution&gt;
+ &lt;!-- * remove any .sp instances that directly follow a .PP --&gt;
+ &lt;ss:substitution oldstring=".sp
+.sp" newstring=".sp"&gt;&lt;/ss:substitution&gt;
+ &lt;!-- * squeeze multiple .sp instances into a single .sp--&gt;
+ &lt;ss:substitution oldstring=".PP
+.sp" newstring=".PP"&gt;&lt;/ss:substitution&gt;
+ &lt;!-- * squeeze multiple newlines after start of no-fill (verbatim) env. --&gt;
+ &lt;ss:substitution oldstring=".nf
+
+" newstring=".nf
+"&gt;&lt;/ss:substitution&gt;
+ &lt;!-- * squeeze multiple newlines after REstoring margin --&gt;
+ &lt;ss:substitution oldstring=".RE
+
+" newstring=".RE
+"&gt;&lt;/ss:substitution&gt;
+ &lt;!-- * U+2591 is a marker we add before and after every Parameter in --&gt;
+ &lt;!-- * Funcprototype output --&gt;
+ &lt;ss:substitution oldstring="&#9617;" newstring=" "&gt;&lt;/ss:substitution&gt;
+ &lt;!-- * U+2592 is a marker we add for the newline before output of &lt;sbr&gt;; --&gt;
+ &lt;ss:substitution oldstring="&#9618;" newstring="
+"&gt;&lt;/ss:substitution&gt;
+ &lt;!-- * --&gt;
+ &lt;!-- * Now deal with some other characters that are added by the --&gt;
+ &lt;!-- * stylesheets during processing. --&gt;
+ &lt;!-- * --&gt;
+ &lt;!-- * bullet --&gt;
+ &lt;ss:substitution oldstring="&#8226;" newstring="\(bu"&gt;&lt;/ss:substitution&gt;
+ &lt;!-- * left double quote --&gt;
+ &lt;ss:substitution oldstring="&#8220;" newstring="\(lq"&gt;&lt;/ss:substitution&gt;
+ &lt;!-- * right double quote --&gt;
+ &lt;ss:substitution oldstring="&#8221;" newstring="\(rq"&gt;&lt;/ss:substitution&gt;
+ &lt;!-- * left single quote --&gt;
+ &lt;ss:substitution oldstring="&#8216;" newstring="\(oq"&gt;&lt;/ss:substitution&gt;
+ &lt;!-- * right single quote --&gt;
+ &lt;ss:substitution oldstring="&#8217;" newstring="\(cq"&gt;&lt;/ss:substitution&gt;
+ &lt;!-- * copyright sign --&gt;
+ &lt;ss:substitution oldstring="&#169;" newstring="\(co"&gt;&lt;/ss:substitution&gt;
+ &lt;!-- * registered sign --&gt;
+ &lt;ss:substitution oldstring="&#174;" newstring="\(rg"&gt;&lt;/ss:substitution&gt;
+ &lt;!-- * ...servicemark... --&gt;
+ &lt;!-- * There is no groff equivalent for it. --&gt;
+ &lt;ss:substitution oldstring="&#8480;" newstring="(SM)"&gt;&lt;/ss:substitution&gt;
+ &lt;!-- * ...trademark... --&gt;
+ &lt;!-- * We don't do "\(tm" because for console output, --&gt;
+ &lt;!-- * groff just renders that as "tm"; that is: --&gt;
+ &lt;!-- * --&gt;
+ &lt;!-- * Product&amp;#x2122; -&gt; Producttm --&gt;
+ &lt;!-- * --&gt;
+ &lt;!-- * So we just make it to "(TM)" instead; thus: --&gt;
+ &lt;!-- * --&gt;
+ &lt;!-- * Product&amp;#x2122; -&gt; Product(TM) --&gt;
+ &lt;ss:substitution oldstring="&#8482;" newstring="(TM)"&gt;&lt;/ss:substitution&gt;
+
+&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The <parameter>man.string.subst.map</parameter> parameter
+contains <link linkend="map">a map</link> that specifies a set of
+string substitutions to perform over the entire roff source for each
+man page, either just before generating final man-page output (that
+is, before writing man-page files to disk) or, if the value of the
+<parameter>man.charmap.enabled</parameter> parameter is non-zero,
+before applying the roff character map.</para>
+
+<para>You can use <parameter>man.string.subst.map</parameter> as a
+&#8220;lightweight&#8221; character map to perform &#8220;essential&#8221; substitutions --
+that is, substitutions that are <emphasis>always</emphasis> performed,
+even if the value of the <parameter>man.charmap.enabled</parameter>
+parameter is zero. For example, you can use it to replace quotation
+marks or other special characters that are generated by the DocBook
+XSL stylesheets for a particular locale setting (as opposed to those
+characters that are actually in source XML documents), or to replace
+any special characters that may be automatically generated by a
+particular customization of the DocBook XSL stylesheets.</para>
+
+<warning>
+ <para>Do you not change value of the
+ <parameter>man.string.subst.map</parameter> parameter unless you are
+ sure what you are doing. First consider adding your
+ string-substitution mappings to either or both of the following
+ parameters:
+ <variablelist>
+ <varlistentry>
+ <term><parameter>man.string.subst.map.local.pre</parameter></term>
+ <listitem><para>applied before
+ <parameter>man.string.subst.map</parameter></para></listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><parameter>man.string.subst.map.local.post</parameter></term>
+ <listitem><para>applied after
+ <parameter>man.string.subst.map</parameter></para></listitem>
+ </varlistentry>
+ </variablelist>
+ By default, both of those parameters contain no
+ string substitutions. They are intended as a means for you to
+ specify your own local string-substitution mappings.</para>
+
+ <para>If you remove any of default mappings from the value of the
+ <parameter>man.string.subst.map</parameter> parameter, you are
+ likely to end up with broken output. And be very careful about adding
+ anything to it; it&#8217;s used for doing string substitution over the
+ entire roff source of each man page &#8211; it causes target strings to be
+ replaced in roff requests and escapes, not just in the visible
+ contents of the page.</para>
+
+</warning>
+
+<refsection id="map">
+ <info>
+ <title>Contents of the substitution map</title>
+ </info>
+ <para>The string-substitution map contains one or more
+ <tag>ss:substitution</tag> elements, each of which has two
+ attributes:
+ <variablelist>
+ <varlistentry>
+ <term>oldstring</term>
+ <listitem>
+ <simpara>string to replace</simpara>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>newstring</term>
+ <listitem>
+ <simpara>string with which to replace <tag class="attribute">oldstring</tag></simpara>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ It may also include XML comments (that is, delimited with
+ "<literal>&lt;!--</literal>" and "<literal>--&gt;</literal>").
+ </para>
+</refsection>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="man.string.subst.map.local.post">
+<refmeta>
+<refentrytitle>man.string.subst.map.local.post</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>man.string.subst.map.local.post</refname>
+<refpurpose>Specifies &#8220;local&#8221; string substitutions</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="man.string.subst.map.local.post.frag">
+&lt;xsl:param name="man.string.subst.map.local.post"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Use the <parameter>man.string.subst.map.local.post</parameter>
+parameter to specify any &#8220;local&#8221; string substitutions to perform over
+the entire roff source for each man page <emphasis>after</emphasis>
+performing the string substitutions specified by the <parameter>man.string.subst.map</parameter> parameter.</para>
+
+<para>For details about the format of this parameter, see the
+documentation for the <parameter>man.string.subst.map</parameter>
+parameter.</para>
+
+</refsection>
+</refentry>
+
+ </reference><reference id="refmeta" xml:base="../manpages/param.xml">
+ <title>Refentry metadata gathering</title>
+<refentry version="5.0" id="refentry.meta.get.quietly">
+<refmeta>
+<refentrytitle>refentry.meta.get.quietly</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>refentry.meta.get.quietly</refname>
+<refpurpose>Suppress notes and warnings when gathering refentry metadata?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="refentry.meta.get.quietly.frag">
+&lt;xsl:param name="refentry.meta.get.quietly" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If zero (the default), notes and warnings about &#8220;missing&#8221; markup
+are generated during gathering of refentry metadata. If non-zero, the
+metadata is gathered &#8220;quietly&#8221; -- that is, the notes and warnings are
+suppressed.</para>
+
+<tip>
+ <para>If you are processing a large amount of <tag>refentry</tag>
+ content, you may be able to speed up processing significantly by
+ setting a non-zero value for
+ <parameter>refentry.meta.get.quietly</parameter>.</para>
+</tip>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="refentry.date.profile">
+<refmeta>
+<refentrytitle>refentry.date.profile</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>refentry.date.profile</refname>
+<refpurpose>Specifies profile for refentry "date" data</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="refentry.date.profile.frag">
+&lt;xsl:param name="refentry.date.profile"&gt;
+ (($info[//date])[last()]/date)[1]|
+ (($info[//pubdate])[last()]/pubdate)[1]
+&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The value of <parameter>refentry.date.profile</parameter> is a
+string representing an XPath expression. It is evaluated at run-time
+and used only if <parameter>refentry.date.profile.enabled</parameter>
+is non-zero. Otherwise, the <tag>refentry</tag> metadata-gathering
+logic "hard coded" into the stylesheets is used.</para>
+
+<para> The <literal>man(7)</literal> man page describes this content
+as "the date of the last revision". In man pages, it is the content
+that is usually displayed in the center footer.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="refentry.date.profile.enabled">
+<refmeta>
+<refentrytitle>refentry.date.profile.enabled</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>refentry.date.profile.enabled</refname>
+<refpurpose>Enable refentry "date" profiling?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="refentry.date.profile.enabled.frag">
+&lt;xsl:param name="refentry.date.profile.enabled"&gt;0&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If the value of
+<parameter>refentry.date.profile.enabled</parameter> is non-zero, then
+during <tag>refentry</tag> metadata gathering, the info profile
+specified by the customizable
+<parameter>refentry.date.profile</parameter> parameter is used.</para>
+
+<para>If instead the value of
+<parameter>refentry.date.profile.enabled</parameter> is zero (the
+default), then "hard coded" logic within the DocBook XSL stylesheets
+is used for gathering <tag>refentry</tag> "date" data.</para>
+
+<para>If you find that the default <tag>refentry</tag>
+metadata-gathering behavior is causing incorrect "date" data to show
+up in your output, then consider setting a non-zero value for
+<parameter>refentry.date.profile.enabled</parameter> and adjusting the
+value of <parameter>refentry.date.profile</parameter> to cause correct
+data to be gathered. </para>
+
+<para>Note that the terms "source" and "date" have special meanings in
+this context. For details, see the documentation for the
+<parameter>refentry.date.profile</parameter> parameter.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="refentry.manual.profile">
+<refmeta>
+<refentrytitle>refentry.manual.profile</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>refentry.manual.profile</refname>
+<refpurpose>Specifies profile for refentry "manual" data</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="refentry.manual.profile.frag">
+&lt;xsl:param name="refentry.manual.profile"&gt;
+ (($info[//title])[last()]/title)[1]|
+ ../title/node()
+&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The value of <parameter>refentry.manual.profile</parameter> is
+a string representing an XPath expression. It is evaluated at
+run-time and used only if
+<parameter>refentry.manual.profile.enabled</parameter> is
+non-zero. Otherwise, the <tag>refentry</tag> metadata-gathering logic
+"hard coded" into the stylesheets is used.</para>
+
+<para>In man pages, this content is usually displayed in the middle of
+the header of the page. The <literal>man(7)</literal> man page
+describes this as "the title of the manual (e.g., <citetitle>Linux
+Programmer's Manual</citetitle>)". Here are some examples from
+existing man pages:
+<itemizedlist>
+ <listitem>
+ <para><citetitle>dpkg utilities</citetitle>
+ (<command>dpkg-name</command>)</para>
+ </listitem>
+ <listitem>
+ <para><citetitle>User Contributed Perl Documentation</citetitle>
+ (<command>GET</command>)</para>
+ </listitem>
+ <listitem>
+ <para><citetitle>GNU Development Tools</citetitle>
+ (<command>ld</command>)</para>
+ </listitem>
+ <listitem>
+ <para><citetitle>Emperor Norton Utilities</citetitle>
+ (<command>ddate</command>)</para>
+ </listitem>
+ <listitem>
+ <para><citetitle>Debian GNU/Linux manual</citetitle>
+ (<command>faked</command>)</para>
+ </listitem>
+ <listitem>
+ <para><citetitle>GIMP Manual Pages</citetitle>
+ (<command>gimp</command>)</para>
+ </listitem>
+ <listitem>
+ <para><citetitle>KDOC Documentation System</citetitle>
+ (<command>qt2kdoc</command>)</para>
+ </listitem>
+</itemizedlist>
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="refentry.manual.profile.enabled">
+<refmeta>
+<refentrytitle>refentry.manual.profile.enabled</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>refentry.manual.profile.enabled</refname>
+<refpurpose>Enable refentry "manual" profiling?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="refentry.manual.profile.enabled.frag">
+&lt;xsl:param name="refentry.manual.profile.enabled"&gt;0&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If the value of
+<parameter>refentry.manual.profile.enabled</parameter> is
+non-zero, then during <tag>refentry</tag> metadata gathering, the info
+profile specified by the customizable
+<parameter>refentry.manual.profile</parameter> parameter is
+used.</para>
+
+<para>If instead the value of
+<parameter>refentry.manual.profile.enabled</parameter> is zero (the
+default), then "hard coded" logic within the DocBook XSL stylesheets
+is used for gathering <tag>refentry</tag> "manual" data.</para>
+
+<para>If you find that the default <tag>refentry</tag>
+metadata-gathering behavior is causing incorrect "manual" data to show
+up in your output, then consider setting a non-zero value for
+<parameter>refentry.manual.profile.enabled</parameter> and adjusting
+the value of <parameter>refentry.manual.profile</parameter> to cause
+correct data to be gathered. </para>
+
+<para>Note that the term "manual" has a special meanings in this
+context. For details, see the documentation for the
+<parameter>refentry.manual.profile</parameter> parameter.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="refentry.source.name.suppress">
+<refmeta>
+<refentrytitle>refentry.source.name.suppress</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>refentry.source.name.suppress</refname>
+<refpurpose>Suppress "name" part of refentry "source" contents?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="refentry.source.name.suppress.frag">
+&lt;xsl:param name="refentry.source.name.suppress"&gt;0&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If the value of
+<parameter>refentry.source.name.suppress</parameter> is non-zero, then
+during <tag>refentry</tag> metadata gathering, no "source name" data
+is added to the <tag>refentry</tag> "source" contents. Instead (unless
+<parameter>refentry.version.suppress</parameter> is also non-zero),
+only "version" data is added to the "source" contents.</para>
+
+<para>If you find that the <tag>refentry</tag> metadata gathering
+mechanism is causing unwanted "source name" data to show up in your
+output -- for example, in the footer (or possibly header) of a man
+page -- then you might consider setting a non-zero value for
+<parameter>refentry.source.name.suppress</parameter>.</para>
+
+<para>Note that the terms "source", "source name", and "version" have
+special meanings in this context. For details, see the documentation
+for the <parameter>refentry.source.name.profile</parameter>
+parameter.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="refentry.source.name.profile">
+<refmeta>
+<refentrytitle>refentry.source.name.profile</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>refentry.source.name.profile</refname>
+<refpurpose>Specifies profile for refentry "source name" data</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="refentry.source.name.profile.frag">
+&lt;xsl:param name="refentry.source.name.profile"&gt;
+ (($info[//productname])[last()]/productname)[1]|
+ (($info[//corpname])[last()]/corpname)[1]|
+ (($info[//corpcredit])[last()]/corpcredit)[1]|
+ (($info[//corpauthor])[last()]/corpauthor)[1]|
+ (($info[//orgname])[last()]/orgname)[1]|
+ (($info[//publishername])[last()]/publishername)[1]
+&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The value of <parameter>refentry.source.name.profile</parameter>
+is a string representing an XPath expression. It is evaluated at
+run-time and used only if
+<parameter>refentry.source.name.profile.enabled</parameter> is
+non-zero. Otherwise, the <tag>refentry</tag> metadata-gathering logic
+"hard coded" into the stylesheets is used.</para>
+
+<para>A "source name" is one part of a (potentially) two-part
+<replaceable>Name</replaceable>&#160;<replaceable>Version</replaceable>
+"source" field. In man pages, it is usually displayed in the left
+footer of the page. It typically indicates the software system or
+product that the item documented in the man page belongs to. The
+<literal>man(7)</literal> man page describes it as "the source of
+the command", and provides the following examples:
+<itemizedlist>
+ <listitem>
+ <para>For binaries, use something like: GNU, NET-2, SLS
+ Distribution, MCC Distribution.</para>
+ </listitem>
+ <listitem>
+ <para>For system calls, use the version of the kernel that you
+ are currently looking at: Linux 0.99.11.</para>
+ </listitem>
+ <listitem>
+ <para>For library calls, use the source of the function: GNU, BSD
+ 4.3, Linux DLL 4.4.1.</para>
+ </listitem>
+</itemizedlist>
+</para>
+
+<para>In practice, there are many pages that simply have a Version
+number in the "source" field. So, it looks like what we have is a
+two-part field,
+<replaceable>Name</replaceable>&#160;<replaceable>Version</replaceable>,
+where:
+<variablelist>
+ <varlistentry>
+ <term>Name</term>
+ <listitem>
+ <para>product name (e.g., BSD) or org. name (e.g., GNU)</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>Version</term>
+ <listitem>
+ <para>version number</para>
+ </listitem>
+ </varlistentry>
+</variablelist>
+Each part is optional. If the <replaceable>Name</replaceable> is a
+product name, then the <replaceable>Version</replaceable> is probably
+the version of the product. Or there may be no
+<replaceable>Name</replaceable>, in which case, if there is a
+<replaceable>Version</replaceable>, it is probably the version
+of the item itself, not the product it is part of. Or, if the
+<replaceable>Name</replaceable> is an organization name, then there
+probably will be no <replaceable>Version</replaceable>.</para>
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="refentry.source.name.profile.enabled">
+<refmeta>
+<refentrytitle>refentry.source.name.profile.enabled</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>refentry.source.name.profile.enabled</refname>
+<refpurpose>Enable refentry "source name" profiling?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="refentry.source.name.profile.enabled.frag">
+&lt;xsl:param name="refentry.source.name.profile.enabled"&gt;0&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If the value of
+<parameter>refentry.source.name.profile.enabled</parameter> is
+non-zero, then during <tag>refentry</tag> metadata gathering, the info
+profile specified by the customizable
+<parameter>refentry.source.name.profile</parameter> parameter is
+used.</para>
+
+<para>If instead the value of
+<parameter>refentry.source.name.profile.enabled</parameter> is zero (the
+default), then "hard coded" logic within the DocBook XSL stylesheets
+is used for gathering <tag>refentry</tag> "source name" data.</para>
+
+<para>If you find that the default <tag>refentry</tag>
+metadata-gathering behavior is causing incorrect "source name" data to
+show up in your output, then consider setting a non-zero value for
+<parameter>refentry.source.name.profile.enabled</parameter> and
+adjusting the value of
+<parameter>refentry.source.name.profile</parameter> to cause correct
+data to be gathered. </para>
+
+<para>Note that the terms "source" and "source name" have special
+meanings in this context. For details, see the documentation for the
+<parameter>refentry.source.name.profile</parameter> parameter.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="refentry.version.suppress">
+<refmeta>
+<refentrytitle>refentry.version.suppress</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>refentry.version.suppress</refname>
+<refpurpose>Suppress "version" part of refentry "source" contents?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="refentry.version.suppress.frag">
+&lt;xsl:param name="refentry.version.suppress"&gt;0&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If the value of <parameter>refentry.version.suppress</parameter>
+is non-zero, then during <tag>refentry</tag> metadata gathering, no
+"version" data is added to the <tag>refentry</tag> "source"
+contents. Instead (unless
+<parameter>refentry.source.name.suppress</parameter> is also
+non-zero), only "source name" data is added to the "source"
+contents.</para>
+
+<para>If you find that the <tag>refentry</tag> metadata gathering
+mechanism is causing unwanted "version" data to show up in your output
+-- for example, in the footer (or possibly header) of a man page --
+then you might consider setting a non-zero value for
+<parameter>refentry.version.suppress</parameter>.</para>
+
+<para>Note that the terms "source", "source name", and "version" have
+special meanings in this context. For details, see the documentation
+for the <parameter>refentry.source.name.profile</parameter>
+parameter.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="refentry.version.profile">
+<refmeta>
+<refentrytitle>refentry.version.profile</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>refentry.version.profile</refname>
+<refpurpose>Specifies profile for refentry "version" data</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="refentry.version.profile.frag">
+&lt;xsl:param name="refentry.version.profile"&gt;
+ (($info[//productnumber])[last()]/productnumber)[1]|
+ (($info[//edition])[last()]/edition)[1]|
+ (($info[//releaseinfo])[last()]/releaseinfo)[1]
+&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The value of <parameter>refentry.version.profile</parameter> is
+a string representing an XPath expression. It is evaluated at
+run-time and used only if
+<parameter>refentry.version.profile.enabled</parameter> is
+non-zero. Otherwise, the <tag>refentry</tag> metadata-gathering logic
+"hard coded" into the stylesheets is used.</para>
+
+<para>A "source.name" is one part of a (potentially) two-part
+<replaceable>Name</replaceable>&#160;<replaceable>Version</replaceable>
+"source" field. For more details, see the documentation for the
+<parameter>refentry.source.name.profile</parameter> parameter.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="refentry.version.profile.enabled">
+<refmeta>
+<refentrytitle>refentry.version.profile.enabled</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>refentry.version.profile.enabled</refname>
+<refpurpose>Enable refentry "version" profiling?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="refentry.version.profile.enabled.frag">
+&lt;xsl:param name="refentry.version.profile.enabled"&gt;0&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If the value of
+<parameter>refentry.version.profile.enabled</parameter> is
+non-zero, then during <tag>refentry</tag> metadata gathering, the info
+profile specified by the customizable
+<parameter>refentry.version.profile</parameter> parameter is
+used.</para>
+
+<para>If instead the value of
+<parameter>refentry.version.profile.enabled</parameter> is zero (the
+default), then "hard coded" logic within the DocBook XSL stylesheets
+is used for gathering <tag>refentry</tag> "version" data.</para>
+
+<para>If you find that the default <tag>refentry</tag>
+metadata-gathering behavior is causing incorrect "version" data to show
+up in your output, then consider setting a non-zero value for
+<parameter>refentry.version.profile.enabled</parameter> and adjusting
+the value of <parameter>refentry.version.profile</parameter> to cause
+correct data to be gathered. </para>
+
+<para>Note that the terms "source" and "version" have special
+meanings in this context. For details, see the documentation for the
+<parameter>refentry.version.profile</parameter> parameter.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="refentry.manual.fallback.profile">
+<refmeta>
+<refentrytitle>refentry.manual.fallback.profile</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>refentry.manual.fallback.profile</refname>
+<refpurpose>Specifies profile of "fallback" for refentry "manual" data</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="refentry.manual.fallback.profile.frag">
+&lt;xsl:param name="refentry.manual.fallback.profile"&gt;
+refmeta/refmiscinfo[not(@class = 'date')][1]/node()&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The value of
+<parameter>refentry.manual.fallback.profile</parameter> is a string
+representing an XPath expression. It is evaluated at run-time and
+used only if no "manual" data can be found by other means (that is,
+either using the <tag>refentry</tag> metadata-gathering logic "hard
+coded" in the stylesheets, or the value of
+<parameter>refentry.manual.profile</parameter>, if it is
+enabled).</para>
+
+<important>
+<para>Depending on which XSLT engine you run, either the EXSLT
+<function>dyn:evaluate</function> extension function (for xsltproc or
+Xalan) or <function>saxon:evaluate</function> extension function (for
+Saxon) are used to dynamically evaluate the value of
+<parameter>refentry.manual.fallback.profile</parameter> at
+run-time. If you don't use xsltproc, Saxon, Xalan -- or some other
+XSLT engine that supports <function>dyn:evaluate</function> -- you
+must manually disable fallback processing by setting an empty value
+for the <parameter>refentry.manual.fallback.profile</parameter>
+parameter.</para>
+</important>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="refentry.source.fallback.profile">
+<refmeta>
+<refentrytitle>refentry.source.fallback.profile</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>refentry.source.fallback.profile</refname>
+<refpurpose>Specifies profile of "fallback" for refentry "source" data</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="refentry.source.fallback.profile.frag">
+&lt;xsl:param name="refentry.source.fallback.profile"&gt;
+refmeta/refmiscinfo[not(@class = 'date')][1]/node()&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The value of
+<parameter>refentry.source.fallback.profile</parameter> is a string
+representing an XPath expression. It is evaluated at run-time and used
+only if no "source" data can be found by other means (that is, either
+using the <tag>refentry</tag> metadata-gathering logic "hard coded" in
+the stylesheets, or the value of the
+<parameter>refentry.source.name.profile</parameter> and
+<parameter>refentry.version.profile</parameter> parameters, if those
+are enabled).</para>
+
+<important>
+<para>Depending on which XSLT engine you run, either the EXSLT
+<function>dyn:evaluate</function> extension function (for xsltproc or
+Xalan) or <function>saxon:evaluate</function> extension function (for
+Saxon) are used to dynamically evaluate the value of
+<parameter>refentry.source.fallback.profile</parameter> at
+run-time. If you don't use xsltproc, Saxon, Xalan -- or some other
+XSLT engine that supports <function>dyn:evaluate</function> -- you
+must manually disable fallback processing by setting an empty value
+for the <parameter>refentry.source.fallback.profile</parameter>
+parameter.</para>
+</important>
+
+</refsection>
+</refentry>
+
+ </reference><reference id="th" xml:base="../manpages/param.xml">
+ <title>Page header/footer</title>
+<refentry version="5.0" id="man.th.extra1.suppress">
+<refmeta>
+<refentrytitle>man.th.extra1.suppress</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>man.th.extra1.suppress</refname>
+<refpurpose>Suppress extra1 part of header/footer?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="man.th.extra1.suppress.frag">
+&lt;xsl:param name="man.th.extra1.suppress"&gt;0&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If the value of <parameter>man.th.extra1.suppress</parameter> is
+non-zero, then the <literal>extra1</literal> part of the
+<literal>.TH</literal> title line header/footer is suppressed.</para>
+
+<para>The content of the <literal>extra1</literal> field is almost
+always displayed in the center footer of the page and is, universally,
+a date.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="man.th.extra2.suppress">
+<refmeta>
+<refentrytitle>man.th.extra2.suppress</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>man.th.extra2.suppress</refname>
+<refpurpose>Suppress extra2 part of header/footer?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="man.th.extra2.suppress.frag">
+&lt;xsl:param name="man.th.extra2.suppress"&gt;0&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If the value of <parameter>man.th.extra2.suppress</parameter> is
+non-zero, then the <literal>extra2</literal> part of the
+<literal>.TH</literal> title line header/footer is suppressed.</para>
+
+<para>The content of the <literal>extra2</literal> field is usually
+displayed in the left footer of the page and is typically "source"
+data, often in the form
+<replaceable>Name</replaceable>&#160;<replaceable>Version</replaceable>;
+for example, "GTK+ 1.2" (from the <literal>gtk-options(7)</literal>
+man page).</para>
+
+<note>
+ <para>You can use the
+ <parameter>refentry.source.name.suppress</parameter> and
+ <parameter>refentry.version.suppress</parameter> parameters to
+ independently suppress the <replaceable>Name</replaceable> and
+ <replaceable>Version</replaceable> parts of the
+ <literal>extra2</literal> field.</para>
+</note>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="man.th.extra3.suppress">
+<refmeta>
+<refentrytitle>man.th.extra3.suppress</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>man.th.extra3.suppress</refname>
+<refpurpose>Suppress extra3 part of header/footer?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="man.th.extra3.suppress.frag">
+&lt;xsl:param name="man.th.extra3.suppress"&gt;0&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If the value of <parameter>man.th.extra3.suppress</parameter> is
+non-zero, then the <literal>extra3</literal> part of the
+<literal>.TH</literal> title line header/footer is
+suppressed.</para>
+
+<para>The content of the <literal>extra3</literal> field is usually
+displayed in the middle header of the page and is typically a "manual
+name"; for example, "GTK+ User's Manual" (from the
+<literal>gtk-options(7)</literal> man page).</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="man.th.title.max.length">
+<refmeta>
+<refentrytitle>man.th.title.max.length</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">integer</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>man.th.title.max.length</refname>
+<refpurpose>Maximum length of title in header/footer</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="man.th.title.max.length.frag">
+&lt;xsl:param name="man.th.title.max.length"&gt;20&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies the maximum permitted length of the title part of the
+man-page <literal>.TH</literal> title line header/footer. If the title
+exceeds the maxiumum specified, it is truncated down to the maximum
+permitted length.</para>
+
+<refsection><info><title>Details</title></info>
+
+
+<para>Every man page generated using the DocBook stylesheets has a
+title line, specified using the <literal>TH</literal> roff
+macro. Within that title line, there is always, at a minimum, a title,
+followed by a section value (representing a man "section" -- usually
+just a number).</para>
+
+<para>The title and section are displayed, together, in the visible
+header of each page. Where in the header they are displayed depends on
+OS the man page is viewed on, and on what version of nroff/groff/man
+is used for viewing the page. But, at a minimum and across all
+systems, the title and section are displayed on the right-hand column
+of the header. On many systems -- those with a modern groff, including
+Linux systems -- they are displayed twice: both in the left and right
+columns of the header.</para>
+
+<para>So if the length of the title exceeds a certain percentage of
+the column width in which the page is viewed, the left and right
+titles can end up overlapping, making them unreadable, or breaking to
+another line, which doesn't look particularly good.</para>
+
+<para>So the stylesheets provide the
+<parameter>man.th.title.max.length</parameter> parameter as a means
+for truncating titles that exceed the maximum length that can be
+viewing properly in a page header.</para>
+
+<para>The default value is reasonable but somewhat arbitrary. If you
+have pages with long titles, you may want to experiment with changing
+the value in order to achieve the correct aesthetic results.</para>
+</refsection>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="man.th.extra2.max.length">
+<refmeta>
+<refentrytitle>man.th.extra2.max.length</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">integer</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>man.th.extra2.max.length</refname>
+<refpurpose>Maximum length of extra2 in header/footer</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="man.th.extra2.max.length.frag">
+&lt;xsl:param name="man.th.extra2.max.length"&gt;30&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies the maximum permitted length of the
+<literal>extra2</literal> part of the man-page part of the
+<literal>.TH</literal> title line header/footer. If the
+<literal>extra2</literal> content exceeds the maxiumum specified, it
+is truncated down to the maximum permitted length.</para>
+
+<para>The content of the <literal>extra2</literal> field is usually
+displayed in the left footer of the page and is typically "source"
+data indicating the software system or product that the item
+documented in the man page belongs to, often in the form
+<replaceable>Name</replaceable>&#160;<replaceable>Version</replaceable>;
+for example, "GTK+ 1.2" (from the <literal>gtk-options(7)</literal>
+man page).</para>
+
+<para>The default value for this parameter is reasonable but somewhat
+arbitrary. If you are processing pages with long "source" information,
+you may want to experiment with changing the value in order to achieve
+the correct aesthetic results.</para>
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="man.th.extra3.max.length">
+<refmeta>
+<refentrytitle>man.th.extra3.max.length</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">integer</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>man.th.extra3.max.length</refname>
+<refpurpose>Maximum length of extra3 in header/footer</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="man.th.extra3.max.length.frag">
+&lt;xsl:param name="man.th.extra3.max.length"&gt;30&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies the maximum permitted length of the
+<literal>extra3</literal> part of the man-page <literal>.TH</literal>
+title line header/footer. If the <literal>extra3</literal> content
+exceeds the maxiumum specified, it is truncated down to the maximum
+permitted length.</para>
+
+<para>The content of the <literal>extra3</literal> field is usually
+displayed in the middle header of the page and is typically a "manual
+name"; for example, "GTK+ User's Manual" (from the
+<literal>gtk-options(7)</literal> man page).</para>
+
+<para>The default value for this parameter is reasonable but somewhat
+arbitrary. If you are processing pages with long "manual names" -- or
+especially if you are processing pages that have both long "title"
+parts (command/function, etc. names) <emphasis>and</emphasis> long
+manual names -- you may want to experiment with changing the value in
+order to achieve the correct aesthetic results.</para>
+</refsection>
+</refentry>
+
+ </reference><reference id="output" xml:base="../manpages/param.xml">
+ <title>Output</title>
+<refentry version="5.0" id="man.output.manifest.enabled">
+ <refmeta>
+ <refentrytitle>man.output.manifest.enabled</refentrytitle>
+ <refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+ </refmeta>
+ <refnamediv>
+ <refname>man.output.manifest.enabled</refname>
+ <refpurpose>Generate a manifest file?</refpurpose>
+ </refnamediv>
+
+ <refsynopsisdiv>
+ <programlisting id="man.output.manifest.enabled.frag">&lt;xsl:param name="man.output.manifest.enabled" select="0"&gt;&lt;/xsl:param&gt;</programlisting>
+ </refsynopsisdiv>
+
+ <refsection><info><title>Description</title></info>
+
+ <para>If non-zero, a list of filenames for man pages generated by
+ the stylesheet transformation is written to the file named by the
+ <parameter>man.output.manifest.filename</parameter> parameter.</para>
+
+ </refsection>
+</refentry>
+
+<refentry version="5.0" id="man.output.manifest.filename">
+ <refmeta>
+ <refentrytitle>man.output.manifest.filename</refentrytitle>
+ <refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+ </refmeta>
+ <refnamediv>
+ <refname>man.output.manifest.filename</refname>
+ <refpurpose>Name of manifest file</refpurpose>
+ </refnamediv>
+
+ <refsynopsisdiv>
+ <programlisting id="man.output.manifest.filename.frag">&lt;xsl:param name="man.output.manifest.filename"&gt;MAN.MANIFEST&lt;/xsl:param&gt;</programlisting>
+ </refsynopsisdiv>
+
+ <refsection><info><title>Description</title></info>
+
+ <para>The <parameter>man.output.manifest.filename</parameter> parameter
+ specifies the name of the file to which the manpages manifest file
+ is written (if the value of the
+ <parameter>man.output.manifest.enabled</parameter> parameter is
+ non-zero).</para>
+
+ </refsection>
+</refentry>
+
+<refentry version="5.0" id="man.output.in.separate.dir">
+<refmeta>
+<refentrytitle>man.output.in.separate.dir</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>man.output.in.separate.dir</refname>
+<refpurpose>Output man-page files in separate output directory?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="man.output.in.separate.dir.frag">
+&lt;xsl:param name="man.output.in.separate.dir" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If the value of <literal>man.output.in.separate.dir</literal>
+parameter is non-zero, man-page files are output in a separate
+directory, specified by the <parameter>man.output.base.dir</parameter>
+parameter; otherwise, if the value of
+<literal>man.output.in.separate.dir</literal> is zero, man-page files
+are not output in a separate directory.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="man.output.lang.in.name.enabled">
+<refmeta>
+<refentrytitle>man.output.lang.in.name.enabled</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>man.output.lang.in.name.enabled</refname>
+<refpurpose>Include $LANG value in man-page filename/pathname?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="man.output.lang.in.name.enabled.frag">
+&lt;xsl:param name="man.output.lang.in.name.enabled" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+ <para>The <parameter>man.output.lang.in.name.enabled</parameter>
+ parameter specifies whether a <literal>$lang</literal> value is
+ included in man-page filenames and pathnames.</para>
+
+ <para>If the value of
+ <parameter>man.output.lang.in.name.enabled</parameter> is non-zero,
+ man-page files are output with the <literal>$lang</literal> value
+ included in their filenames or pathnames as follows;
+
+ <itemizedlist>
+ <listitem>
+ <para>if <parameter>man.output.subdirs.enabled</parameter> is
+ non-zero, each file is output to, e.g., a
+ <filename>man/<replaceable>$lang</replaceable>/man8/foo.8</filename>
+ pathname</para>
+ </listitem>
+ <listitem>
+ <para>if <parameter>man.output.subdirs.enabled</parameter> is
+ zero, each file is output with a
+ <literal>foo.<replaceable>$lang</replaceable>.8</literal>
+ filename</para>
+ </listitem>
+ </itemizedlist>
+ </para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="man.output.base.dir">
+<refmeta>
+<refentrytitle>man.output.base.dir</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">uri</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>man.output.base.dir</refname>
+<refpurpose>Specifies separate output directory</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="man.output.base.dir.frag">&lt;xsl:param name="man.output.base.dir"&gt;man/&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The <parameter>man.output.base.dir</parameter> parameter
+specifies the base directory into which man-page files are output. The
+<parameter>man.output.subdirs.enabled</parameter> parameter controls
+whether the files are output in subdirectories within the base
+directory.</para>
+
+<note>
+ <para>The values of the <parameter>man.output.base.dir</parameter>
+ and <parameter>man.output.subdirs.enabled</parameter> parameters are
+ used only if the value of
+ <parameter>man.output.in.separate.dir</parameter> parameter is
+ non-zero. If the value of the
+ <parameter>man.output.in.separate.dir</parameter> is zero, man-page
+ files are not output in a separate directory.</para>
+</note>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="man.output.subdirs.enabled">
+<refmeta>
+<refentrytitle>man.output.subdirs.enabled</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>man.output.subdirs.enabled</refname>
+<refpurpose>Output man-page files in subdirectories within base output directory?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="man.output.subdirs.enabled.frag">
+&lt;xsl:param name="man.output.subdirs.enabled" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The <parameter>man.output.subdirs.enabled</parameter> parameter
+controls whether man-pages files are output in subdirectories within
+the base directory specified by the directory specified by the
+<parameter>man.output.base.dir</parameter> parameter.</para>
+
+<note>
+ <para>The values of the <parameter>man.output.base.dir</parameter>
+ and <parameter>man.output.subdirs.enabled</parameter> parameters are
+ used only if the value of
+ <parameter>man.output.in.separate.dir</parameter> parameter is
+ non-zero. If the value of the
+ <parameter>man.output.in.separate.dir</parameter> is zero, man-page
+ files are not output in a separate directory.</para>
+</note>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="man.output.quietly">
+<refmeta>
+<refentrytitle>man.output.quietly</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>man.output.quietly</refname>
+<refpurpose>Suppress filename messages emitted when generating output?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="man.output.quietly.frag">
+&lt;xsl:param name="man.output.quietly" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If zero (the default), for each man-page file created, a message
+with the name of the file is emitted. If non-zero, the files are
+output "quietly" -- that is, the filename messages are
+suppressed.</para>
+
+<tip>
+ <para>If you are processing a large amount of <tag>refentry</tag>
+ content, you may be able to speed up processing significantly by
+ setting a non-zero value for
+ <parameter>man.output.quietly</parameter>.</para>
+</tip>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="man.output.encoding">
+<refmeta>
+<refentrytitle>man.output.encoding</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>man.output.encoding</refname>
+<refpurpose>Encoding used for man-page output</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="man.output.encoding.frag">
+&lt;xsl:param name="man.output.encoding"&gt;UTF-8&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>This parameter specifies the encoding to use for files generated
+by the manpages stylesheet. Not all processors support specification
+of this parameter.</para>
+
+<important>
+ <para>If the value of the <parameter>man.charmap.enabled</parameter>
+ parameter is non-zero (the default), keeping the
+ <parameter>man.output.encoding</parameter> parameter at its default
+ value (<literal>UTF-8</literal>) or setting it to
+ <literal>UTF-16</literal> <emphasis role="bold">does not cause your
+ man pages to be output in raw UTF-8 or UTF-16</emphasis> -- because
+ any Unicode characters for which matches are found in the enabled
+ character map will be replaced with roff escape sequences before the
+ final man-page files are generated.</para>
+
+ <para>So if you want to generate "real" UTF-8 man pages, without any
+ character substitution being performed on your content, you need to
+ set <parameter>man.charmap.enabled</parameter> to zero (which will
+ completely disable character-map processing). </para>
+
+ <para>You may also need to set
+ <parameter>man.charmap.enabled</parameter> to zero if you want to
+ output man pages in an encoding other than <literal>UTF-8</literal>
+ or <literal>UTF-16</literal>. Character-map processing is based on
+ Unicode character values and may not work with other output
+ encodings.</para>
+</important>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="man.output.better.ps.enabled">
+<refmeta>
+<refentrytitle>man.output.better.ps.enabled</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>man.output.better.ps.enabled</refname>
+<refpurpose>Enable enhanced print/PostScript output?</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+<programlisting id="man.output.better.ps.enabled.frag">
+&lt;xsl:param name="man.output.better.ps.enabled"&gt;0&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+
+<para>If the value of the
+<parameter>man.output.better.ps.enabled</parameter> parameter is
+non-zero, certain markup is embedded in each generated man page
+such that PostScript output from the <command>man -Tps</command>
+command for that page will include a number of enhancements
+designed to improve the quality of that output.</para>
+
+<para>If <parameter>man.output.better.ps.enabled</parameter> is
+zero (the default), no such markup is embedded in generated man
+pages, and no enhancements are included in the PostScript
+output generated from those man pages by the <command>man
+ -Tps</command> command.</para>
+
+<warning>
+ <para>The enhancements provided by this parameter rely on
+ features that are specific to groff (GNU troff) and that are
+ not part of &#8220;classic&#8221; AT&amp;T troff or any of its
+ derivatives. Therefore, any man pages you generate with this
+ parameter enabled will be readable only on systems on which
+ the groff (GNU troff) program is installed, such as GNU/Linux
+ systems. The pages <emphasis role="bold">will not not be
+ readable on systems on with the classic troff (AT&amp;T
+ troff) command is installed</emphasis>.</para>
+</warning>
+
+<para>The value of this parameter only affects PostScript output
+ generated from the <command>man</command> command. It has no
+ effect on output generated using the FO backend.</para>
+
+<tip>
+ <para>You can generate PostScript output for any man page by
+ running the following command:</para>
+ <programlisting> man <replaceable>FOO</replaceable> -Tps &gt; <replaceable>FOO</replaceable>.ps</programlisting>
+ <para>You can then generate PDF output by running the following
+ command:</para>
+ <programlisting> ps2pdf <replaceable>FOO</replaceable>.ps</programlisting>
+</tip>
+
+</refsection>
+</refentry>
+
+ </reference><reference id="other" xml:base="../manpages/param.xml">
+ <title>Other</title>
+<refentry version="5.0" id="man.table.footnotes.divider">
+<refmeta>
+<refentrytitle>man.table.footnotes.divider</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>man.table.footnotes.divider</refname>
+<refpurpose>Specifies divider string that appears before table footnotes</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="man.table.footnotes.divider.frag">
+&lt;xsl:param name="man.table.footnotes.divider"&gt;----&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>In each table that contains footenotes, the string specified by
+the <parameter>man.table.footnotes.divider</parameter> parameter is
+output before the list of footnotes for the table.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="man.subheading.divider.enabled">
+<refmeta>
+<refentrytitle>man.subheading.divider.enabled</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>man.subheading.divider.enabled</refname>
+<refpurpose>Add divider comment to roff source before/after subheadings?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="man.subheading.divider.enabled.frag">
+&lt;xsl:param name="man.subheading.divider.enabled"&gt;0&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If the value of the
+<parameter>man.subheading.divider.enabled</parameter> parameter is
+non-zero, the contents of the
+<parameter>man.subheading.divider</parameter> parameter are used to
+add a "divider" before and after subheadings in the roff
+output. <emphasis role="bold">The divider is not visisble in the
+rendered man page</emphasis>; it is added as a comment, in the source,
+simply for the purpose of increasing reability of the source.</para>
+
+<para>If <parameter>man.subheading.divider.enabled</parameter> is zero
+(the default), the subheading divider is suppressed.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="man.subheading.divider">
+<refmeta>
+<refentrytitle>man.subheading.divider</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>man.subheading.divider</refname>
+<refpurpose>Specifies string to use as divider comment before/after subheadings</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="man.subheading.divider.frag">
+&lt;xsl:param name="man.subheading.divider"&gt;========================================================================&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If the value of the
+<parameter>man.subheading.divider.enabled</parameter> parameter is
+non-zero, the contents of the
+<parameter>man.subheading.divider</parameter> parameter are used to
+add a "divider" before and after subheadings in the roff
+output. <emphasis role="bold">The divider is not visisble in the
+rendered man page</emphasis>; it is added as a comment, in the source,
+simply for the purpose of increasing reability of the source.</para>
+
+<para>If <parameter>man.subheading.divider.enabled</parameter> is zero
+(the default), the subheading divider is suppressed.</para>
+
+</refsection>
+</refentry>
+
+ </reference>
+ </part>
+ <part id="roundtrip">
+ <?dbhtml dir="roundtrip"?>
+ <?dbhtml filename="index.html"?>
+ <title xml:base="../roundtrip/param.xml">Roundtrip Parameter Reference</title>
+ <partintro id="roundtripintro">
+
+ <para xml:base="../roundtrip/param.xml">This is reference documentation for all user-configurable
+ parameters in the DocBook &#8220;Roundtrip&#8221; Stylesheets (for
+ transforming DocBook to WordML, OpenDocument, and Apple Pages,
+ and for converting from those formats back to DocBook).</para>
+
+ </partintro>
+
+
+<refentry version="5.0" id="wordml.template" xml:base="../roundtrip/param.xml">
+<refmeta>
+<refentrytitle>wordml.template</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">uri</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>wordml.template</refname>
+<refpurpose>Specify the template WordML document</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="wordml.template.frag">
+&lt;xsl:param name="wordml.template"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The <parameter>wordml.template</parameter> parameter specifies a WordML document to use as a template for the generated document. The template document is used to define the (extensive) headers for the generated document, in particular the paragraph and character styles that are used to format the various elements. Any content in the template document is ignored.</para>
+
+<para>A template document is used in order to allow maintenance of the paragraph and character styles to be done using Word itself, rather than these XSL stylesheets.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="pages.template" xml:base="../roundtrip/param.xml">
+<refmeta>
+<refentrytitle>pages.template</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">uri</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>pages.template</refname>
+<refpurpose>Specify the template Pages document</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="pages.template.frag">
+&lt;xsl:param name="pages.template"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The <parameter>pages.template</parameter> parameter specifies a Pages (the Apple word processing application) document to use as a template for the generated document. The template document is used to define the (extensive) headers for the generated document, in particular the paragraph and character styles that are used to format the various elements. Any content in the template document is ignored.</para>
+
+<para>A template document is used in order to allow maintenance of the paragraph and character styles to be done using Pages itself, rather than these XSL stylesheets.</para>
+
+</refsection>
+</refentry>
+
+
+ </part>
+ <part id="slides"><title>Slides Parameter Reference</title>
+ <?dbhtml dir="slides"?>
+ <?dbhtml filename="index.html"?>
+ <partintro id="slidesintro">
+ <para>This is reference documentation for all
+ user-configurable parameters in the DocBook XSL Slides
+ stylesheets (for generating HTML and PDF slide
+ presentations).</para>
+ <note>
+ <para>The Slides stylesheet for HTML output is a
+ customization layer of the DocBook XSL HTML
+ stylesheet; the Slides stylesheet for FO output is a
+ customization layer of the DocBook XSL FO stylesheet.
+ Therefore, in addition to the slides-specific
+ parameters listed in this section, you can also use a
+ number of <link xlink:href="../html">HTML stylesheet
+ parameters</link> and <link xlink:href="../fo">FO
+ stylesheet parameters</link> to control Slides
+ output.</para>
+ </note>
+ </partintro>
+ <reference id="html" xml:base="../slides/html/param.xml">
+<title>HTML: General Parameters</title>
+<refentry version="5.0" id="keyboard.nav">
+<refmeta>
+<refentrytitle>keyboard.nav</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>keyboard.nav</refname>
+<refpurpose>Enable keyboard navigation?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="keyboard.nav.frag">
+&lt;xsl:param name="keyboard.nav" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, JavaScript is added to the slides to enable keyboard
+navigation. Pressing 'n', space, or return moves forward; pressing 'p' moves
+backward.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="css.stylesheet">
+<refmeta>
+<refentrytitle>css.stylesheet</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">uri</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>css.stylesheet</refname>
+<refpurpose>CSS stylesheet for slides</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="css.stylesheet.frag">
+&lt;xsl:param name="css.stylesheet"&gt;slides.css&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Identifies the CSS stylesheet used by all the slides. This parameter
+can be set in the source document with the &lt;?dbhtml?&gt; pseudo-attribute
+<literal>css-stylesheet</literal>.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="css.stylesheet.dir">
+<refmeta>
+<refentrytitle>css.stylesheet.dir</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">uri</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>css.stylesheet.dir</refname>
+<refpurpose>Default directory for CSS stylesheets</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="css.stylesheet.dir.frag">
+&lt;xsl:param name="css.stylesheet.dir"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Identifies the default directory for the CSS stylesheet
+generated on all the slides. This parameter can be set in the source
+document with the &lt;?dbhtml?&gt; pseudo-attribute
+<literal>css-stylesheet-dir</literal>.</para>
+
+<para>If non-empty, this value is prepended to each of the stylesheets.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="titlefoil.html">
+<refmeta>
+<refentrytitle>titlefoil.html</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">filename</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>titlefoil.html</refname>
+<refpurpose>Name of title foil HTML file</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="titlefoil.html.frag">
+&lt;xsl:param name="titlefoil.html" select="concat('index', $html.ext)"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Sets the filename used for the slides titlepage.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="toc.html">
+<refmeta>
+<refentrytitle>toc.html</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">filename</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>toc.html</refname>
+<refpurpose>Name of ToC HTML file</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="toc.html.frag">
+&lt;xsl:param name="toc.html" select="concat('toc', $html.ext)"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Sets the filename used for the table of contents page.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="foilgroup.toc">
+<refmeta>
+<refentrytitle>foilgroup.toc</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>foilgroup.toc</refname>
+<refpurpose>Put ToC on foilgroup pages?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="foilgroup.toc.frag">
+&lt;xsl:param name="foilgroup.toc" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, a ToC will be placed on foilgroup pages (after any
+other content).
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="output.indent">
+<refmeta>
+<refentrytitle>output.indent</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">list</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">no</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">yes</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>output.indent</refname>
+<refpurpose>Indent output?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="output.indent.frag">
+&lt;xsl:param name="output.indent"&gt;no&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies the setting of the <parameter>indent</parameter>
+parameter on the HTML slides. For more information, see the discussion
+of the <tag>xsl:output</tag> element in the XSLT specification.</para>
+<para>Select from <literal>yes</literal> or <literal>no</literal>.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="overlay">
+<refmeta>
+<refentrytitle>overlay</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>overlay</refname>
+<refpurpose>Overlay footer navigation?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="overlay.frag">
+&lt;xsl:param name="overlay" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, JavaScript is added to the slides to make the
+bottom navigation appear at the bottom of each page. This option and
+<link linkend="multiframe">multiframe</link> are mutually exclusive.</para>
+
+<para>If this parameter is zero, the bottom navigation simply appears
+below the content of each slide.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="show.foil.number">
+<refmeta>
+<refentrytitle>show.foil.number</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>show.foil.number</refname>
+<refpurpose>Show foil number on each foil?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="show.foil.number.frag">
+&lt;xsl:param name="show.foil.number" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, on each slide there will be its number. Currently
+not supported in all output formats.</para>
+
+</refsection>
+</refentry>
+
+</reference><reference id="frames" xml:base="../slides/html/param.xml">
+<title>HTML: Frames Parameters</title>
+<refentry version="5.0" id="nav.separator">
+<refmeta>
+<refentrytitle>nav.separator</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>nav.separator</refname>
+<refpurpose>Output separator between navigation and body?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="nav.separator.frag">
+&lt;xsl:param name="nav.separator" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, a separator (<literal>&lt;HR&gt;</literal>) is
+added between the navigation links and the content of each slide.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="toc.row.height">
+<refmeta>
+<refentrytitle>toc.row.height</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">length</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>toc.row.height</refname>
+<refpurpose>Height of ToC rows in dynamic ToCs</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="toc.row.height.frag">
+&lt;xsl:param name="toc.row.height"&gt;22&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>This parameter specifies the height of each row in the table of
+contents. This is only applicable if a <link linkend="dynamic.toc">dynamic ToC</link> is used. You may want to
+adjust this parameter for optimal appearance with the font and image
+sizes selected by your <link linkend="css.stylesheet">CSS
+stylesheet</link>.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="toc.bg.color">
+<refmeta>
+<refentrytitle>toc.bg.color</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">color</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>toc.bg.color</refname>
+<refpurpose>Background color for ToC frame</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="toc.bg.color.frag">
+&lt;xsl:param name="toc.bg.color"&gt;#FFFFFF&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies the background color used in the ToC frame.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="body.bg.color">
+<refmeta>
+<refentrytitle>body.bg.color</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">color</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>body.bg.color</refname>
+<refpurpose>Background color for body frame</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="body.bg.color.frag">
+&lt;xsl:param name="body.bg.color"&gt;#FFFFFF&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies the background color used in the body column of
+tabular slides.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="toc.width">
+<refmeta>
+<refentrytitle>toc.width</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">length</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>toc.width</refname>
+<refpurpose>Width of ToC frame</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="toc.width.frag">
+&lt;xsl:param name="toc.width"&gt;250&lt;/xsl:param&gt;
+&lt;!-- Presumably in pixels? --&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies the width of the ToC frame in pixels.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="toc.hide.show">
+<refmeta>
+<refentrytitle>toc.hide.show</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>toc.hide.show</refname>
+<refpurpose>Enable hide/show button for ToC frame</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="toc.hide.show.frag">
+&lt;xsl:param name="toc.hide.show" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, JavaScript (and an additional icon, see
+<link linkend="hidetoc.image">hidetoc.image</link> and
+<link linkend="hidetoc.image">showtoc.image</link>) is added to each slide
+to allow the ToC panel to be <quote>toggled</quote> on each panel.</para>
+
+<note><para>There is a bug in Mozilla 1.0 (at least as of CR3) that causes
+the browser to reload the titlepage when this feature is used.</para></note>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="dynamic.toc">
+<refmeta>
+<refentrytitle>dynamic.toc</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>dynamic.toc</refname>
+<refpurpose>Dynamic ToCs?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="dynamic.toc.frag">
+&lt;xsl:param name="dynamic.toc" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, JavaScript is used to make the ToC panel <quote>dynamic</quote>.
+In a dynamic ToC, each section in the ToC can be expanded and collapsed by
+clicking on the appropriate image.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="active.toc">
+<refmeta>
+<refentrytitle>active.toc</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>active.toc</refname>
+<refpurpose>Active ToCs?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="active.toc.frag">
+&lt;xsl:param name="active.toc" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, JavaScript is used to keep the ToC and the current slide
+<quote>in sync</quote>. That is, each time the slide changes, the corresponding
+ToC entry will be underlined.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="overlay.logo">
+<refmeta>
+<refentrytitle>overlay.logo</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">uri</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>overlay.logo</refname>
+<refpurpose>Logo to overlay on ToC frame</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="overlay.logo.frag">
+&lt;xsl:param name="overlay.logo"&gt;http://docbook.sourceforge.net/release/buttons/slides-1.png&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If this URI is non-empty, JavaScript is used to overlay the
+specified image on the ToC frame.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="multiframe">
+<refmeta>
+<refentrytitle>multiframe</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>multiframe</refname>
+<refpurpose>Use multiple frames for slide bodies?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="multiframe.frag">
+&lt;xsl:param name="multiframe" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, multiple frames are used for the body of each
+slide. This is one way of forcing the slide navigation elements to
+appear in constant locations. The other way is with <link linkend="overlay">overlays</link>. The <link linkend="overlay"><parameter>overlay</parameter></link> and
+<parameter>multiframe</parameter> parameters are mutually
+exclusive.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="multiframe.top.bgcolor">
+<refmeta>
+<refentrytitle>multiframe.top.bgcolor</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">color</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>multiframe.top.bgcolor</refname>
+<refpurpose>Background color for top navigation frame</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="multiframe.top.bgcolor.frag">
+&lt;xsl:param name="multiframe.top.bgcolor"&gt;white&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies the background color of the top navigation frame when
+<link linkend="multiframe">multiframe</link> is enabled.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="multiframe.bottom.bgcolor">
+<refmeta>
+<refentrytitle>multiframe.bottom.bgcolor</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">color</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>multiframe.bottom.bgcolor</refname>
+<refpurpose>Background color for bottom navigation frame</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="multiframe.bottom.bgcolor.frag">
+&lt;xsl:param name="multiframe.bottom.bgcolor"&gt;white&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies the background color of the bottom navigation frame when
+<link linkend="multiframe">multiframe</link> is enabled.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="multiframe.navigation.height">
+<refmeta>
+<refentrytitle>multiframe.navigation.height</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">length</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>multiframe.navigation.height</refname>
+<refpurpose>Height of navigation frames</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="multiframe.navigation.height.frag">
+&lt;xsl:param name="multiframe.navigation.height"&gt;40&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies the height of the navigation frames in pixels when
+<link linkend="multiframe">multiframe</link> is enabled.</para>
+
+</refsection>
+</refentry>
+
+</reference><reference id="graphics" xml:base="../slides/html/param.xml">
+<title>HTML: Graphics Parameters</title>
+<refentry version="5.0" id="graphics.dir">
+<refmeta>
+<refentrytitle>graphics.dir</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">uri</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>graphics.dir</refname>
+<refpurpose>Graphics directory</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="graphics.dir.frag">
+&lt;xsl:param name="graphics.dir"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Identifies the graphics directory for the navigation components
+generated on all the slides. This parameter can be set in the source
+document with the &lt;?dbhtml?&gt; pseudo-attribute
+<literal>graphics-dir</literal>.</para>
+
+<para>If non-empty, this value is prepended to each of the graphic
+image paths.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="bullet.image">
+<refmeta>
+<refentrytitle>bullet.image</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">filename</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>bullet.image</refname>
+<refpurpose>Bullet image</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="bullet.image.frag">
+&lt;xsl:param name="bullet.image"&gt;toc/bullet.png&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies the filename of the bullet image used for foils in the
+framed ToC.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="next.image">
+<refmeta>
+<refentrytitle>next.image</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">filename</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>next.image</refname>
+<refpurpose>Right-arrow image</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="next.image.frag">
+&lt;xsl:param name="next.image"&gt;active/nav-next.png&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies the filename of the right-pointing navigation arrow.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="prev.image">
+<refmeta>
+<refentrytitle>prev.image</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">filename</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>prev.image</refname>
+<refpurpose>Left-arrow image</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="prev.image.frag">
+&lt;xsl:param name="prev.image"&gt;active/nav-prev.png&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies the filename of the left-pointing navigation arrow.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="up.image">
+<refmeta>
+<refentrytitle>up.image</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">filename</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>up.image</refname>
+<refpurpose>Up-arrow image</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="up.image.frag">
+&lt;xsl:param name="up.image"&gt;active/nav-up.png&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies the filename of the upward-pointing navigation arrow.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="home.image">
+<refmeta>
+<refentrytitle>home.image</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">filename</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>home.image</refname>
+<refpurpose>Home image</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="home.image.frag">
+&lt;xsl:param name="home.image"&gt;active/nav-home.png&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies the filename of the home navigation icon.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="toc.image">
+<refmeta>
+<refentrytitle>toc.image</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">filename</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>toc.image</refname>
+<refpurpose>ToC image</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="toc.image.frag">
+&lt;xsl:param name="toc.image"&gt;active/nav-toc.png&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies the filename of the ToC navigation icon.</para>
+
+</refsection>
+</refentry>
+
+
+<refentry version="5.0" id="no.next.image">
+<refmeta>
+<refentrytitle>no.next.image</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">filename</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>no.next.image</refname>
+<refpurpose>Inactive right-arrow image</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="no.next.image.frag">
+&lt;xsl:param name="no.next.image"&gt;inactive/nav-next.png&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies the filename of the inactive right-pointing navigation arrow.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="no.prev.image">
+<refmeta>
+<refentrytitle>no.prev.image</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">filename</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>no.prev.image</refname>
+<refpurpose>Inactive left-arrow image</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="no.prev.image.frag">
+&lt;xsl:param name="no.prev.image"&gt;inactive/nav-prev.png&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies the filename of the inactive left-pointing navigation arrow.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="no.up.image">
+<refmeta>
+<refentrytitle>no.up.image</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">filename</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>no.up.image</refname>
+<refpurpose>Inactive up-arrow image</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="no.up.image.frag">
+&lt;xsl:param name="no.up.image"&gt;inactive/nav-up.png&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies the filename of the inactive upward-pointing navigation arrow.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="no.home.image">
+<refmeta>
+<refentrytitle>no.home.image</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">filename</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>no.home.image</refname>
+<refpurpose>Inactive home image</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="no.home.image.frag">
+&lt;xsl:param name="no.home.image"&gt;inactive/nav-home.png&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies the filename of the inactive home navigation icon.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="no.toc.image">
+<refmeta>
+<refentrytitle>no.toc.image</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">filename</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>no.toc.image</refname>
+<refpurpose>Inactive ToC image</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="no.toc.image.frag">
+&lt;xsl:param name="no.toc.image"&gt;inactive/nav-toc.png&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies the filename of the inactive ToC navigation icon.</para>
+
+</refsection>
+</refentry>
+
+
+<refentry version="5.0" id="plus.image">
+<refmeta>
+<refentrytitle>plus.image</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">filename</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>plus.image</refname>
+<refpurpose>Plus image</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="plus.image.frag">
+&lt;xsl:param name="plus.image"&gt;toc/closed.png&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies the filename of the <quote>plus</quote> image; the image used in a
+<link linkend="dynamic.toc">dynamic ToC</link> to indicate that a section
+can be expanded.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="minus.image">
+<refmeta>
+<refentrytitle>minus.image</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">filename</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>minus.image</refname>
+<refpurpose>Minus image</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="minus.image.frag">
+&lt;xsl:param name="minus.image"&gt;toc/open.png&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies the filename of the <quote>minus</quote> image; the image used in a
+<link linkend="dynamic.toc">dynamic ToC</link> to indicate that a section
+can be collapsed.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="hidetoc.image">
+<refmeta>
+<refentrytitle>hidetoc.image</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">filename</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>hidetoc.image</refname>
+<refpurpose>Hide ToC image</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="hidetoc.image.frag">
+&lt;xsl:param name="hidetoc.image"&gt;hidetoc.gif&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies the filename of the <quote>hide ToC</quote> image. This is used
+when the <link linkend="toc.hide.show">ToC hide/show</link> parameter is
+enabled.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="showtoc.image">
+<refmeta>
+<refentrytitle>showtoc.image</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">filename</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>showtoc.image</refname>
+<refpurpose>Show ToC image</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="showtoc.image.frag">
+&lt;xsl:param name="showtoc.image"&gt;showtoc.gif&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies the filename of the <quote>show ToC</quote> image. This is used
+when the <link linkend="toc.hide.show">ToC hide/show</link> parameter is
+enabled.</para>
+
+</refsection>
+</refentry>
+
+</reference><reference id="javascript" xml:base="../slides/html/param.xml">
+<title>HTML: JavaScript Parameters</title>
+<refentry version="5.0" id="script.dir">
+<refmeta>
+<refentrytitle>script.dir</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">uri</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>script.dir</refname>
+<refpurpose>Script directory</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="script.dir.frag">
+&lt;xsl:param name="script.dir"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Identifies the JavaScript source directory for the slides.
+This parameter can be set in the source
+document with the &lt;?dbhtml?&gt; pseudo-attribute
+<literal>script-dir</literal>.</para>
+
+<para>If non-empty, this value is prepended to each of the JavaScript files.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="ua.js">
+<refmeta>
+<refentrytitle>ua.js</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">filename</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>ua.js</refname>
+<refpurpose>UA JavaScript file</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="ua.js.frag">
+&lt;xsl:param name="ua.js"&gt;ua.js&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies the filename of the UA JavaScript file. It's unlikely
+that you will ever need to change this parameter.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="xbDOM.js">
+<refmeta>
+<refentrytitle>xbDOM.js</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">filename</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>xbDOM.js</refname>
+<refpurpose>xbDOM JavaScript file</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="xbDOM.js.frag">
+&lt;xsl:param name="xbDOM.js"&gt;xbDOM.js&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies the filename of the xbDOM JavaScript file. It's unlikely
+that you will ever need to change this parameter.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="xbStyle.js">
+<refmeta>
+<refentrytitle>xbStyle.js</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">filename</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>xbStyle.js</refname>
+<refpurpose>xbStyle JavaScript file</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="xbStyle.js.frag">
+&lt;xsl:param name="xbStyle.js"&gt;xbStyle.js&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies the filename of the xbStyle JavaScript file. It's unlikely
+that you will ever need to change this parameter.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="xbLibrary.js">
+<refmeta>
+<refentrytitle>xbLibrary.js</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">filename</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>xbLibrary.js</refname>
+<refpurpose>xbLibrary JavaScript file</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="xbLibrary.js.frag">
+&lt;xsl:param name="xbLibrary.js"&gt;xbLibrary.js&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies the filename of the xbLibrary JavaScript file. It's unlikely
+that you will ever need to change this parameter.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="xbCollapsibleLists.js">
+<refmeta>
+<refentrytitle>xbCollapsibleLists.js</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">filename</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>xbCollapsibleLists.js</refname>
+<refpurpose>xbCollapsibleLists JavaScript file</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="xbCollapsibleLists.js.frag">
+&lt;xsl:param name="xbCollapsibleLists.js"&gt;xbCollapsibleLists.js&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies the filename of the xbCollapsibleLists JavaScript file. It's unlikely
+that you will ever need to change this parameter.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="overlay.js">
+<refmeta>
+<refentrytitle>overlay.js</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">filename</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>overlay.js</refname>
+<refpurpose>Overlay JavaScript file</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="overlay.js.frag">
+&lt;xsl:param name="overlay.js"&gt;overlay.js&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies the filename of the overlay JavaScript file. It's unlikely
+that you will ever need to change this parameter.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="slides.js">
+<refmeta>
+<refentrytitle>slides.js</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">filename</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>slides.js</refname>
+<refpurpose>Slides overlay file</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="slides.js.frag">
+&lt;xsl:param name="slides.js"&gt;slides.js&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies the filename of the slides JavaScript file. It's unlikely
+that you will ever need to change this parameter.</para>
+
+</refsection>
+</refentry>
+
+</reference><reference id="l10n" xml:base="../slides/html/param.xml">
+<title>HTML: Localization Parameters</title>
+<refentry version="5.0" id="text.home">
+<refmeta>
+<refentrytitle>text.home</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>text.home</refname>
+<refpurpose>Home</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="text.home.frag">
+&lt;xsl:param name="text.home"&gt;Home&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>FIXME:</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="text.toc">
+<refmeta>
+<refentrytitle>text.toc</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>text.toc</refname>
+<refpurpose>FIXME:</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="text.toc.frag">
+&lt;xsl:param name="text.toc"&gt;ToC&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>FIXME:</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="text.prev">
+<refmeta>
+<refentrytitle>text.prev</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>text.prev</refname>
+<refpurpose>FIXME:</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="text.prev.frag">
+&lt;xsl:param name="text.prev"&gt;Prev&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>FIXME:</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="text.up">
+<refmeta>
+<refentrytitle>text.up</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>text.up</refname>
+<refpurpose>FIXME:</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="text.up.frag">
+&lt;xsl:param name="text.up"&gt;Up&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>FIXME:</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="text.next">
+<refmeta>
+<refentrytitle>text.next</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>text.next</refname>
+<refpurpose>FIXME:</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="text.next.frag">
+&lt;xsl:param name="text.next"&gt;Next&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>FIXME:</para>
+
+</refsection>
+</refentry>
+
+
+
+</reference>
+ <reference id="fo" xml:base="../slides/fo/param.xml">
+ <title>FO: General Params</title>
+<refentry version="5.0" id="slide.title.font.family">
+<refmeta>
+<refentrytitle>slide.title.font.family</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">list</refmiscinfo>
+<refmiscinfo class="other" otherclass="list-type">open</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">serif</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">sans-serif</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">monospace</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>slide.title.font.family</refname>
+<refpurpose>Specifies font family to use for slide titles</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="slide.title.font.family.frag">
+&lt;xsl:param name="slide.title.font.family"&gt;Helvetica&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies the font family to use for slides titles.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="slide.font.family">
+<refmeta>
+<refentrytitle>slide.font.family</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">list</refmiscinfo>
+<refmiscinfo class="other" otherclass="list-type">open</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">serif</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">sans-serif</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">monospace</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>slide.font.family</refname>
+<refpurpose>Specifies font family to use for slide bodies</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="slide.font.family.frag">
+&lt;xsl:param name="slide.font.family"&gt;Helvetica&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies the font family to use for slides bodies.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="foil.title.master">
+<refmeta>
+<refentrytitle>foil.title.master</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">number</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>foil.title.master</refname>
+<refpurpose>Specifies unitless font size to use for foil titles</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="foil.title.master.frag">
+&lt;xsl:param name="foil.title.master"&gt;36&lt;/xsl:param&gt;
+&lt;!-- Inconsistant use of point size? --&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies a unitless font size to use for foil titles; used in
+combination with the <parameter>foil.title.size</parameter>
+parameter.</para>
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="foil.title.size">
+<refmeta>
+<refentrytitle>foil.title.size</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">length</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>foil.title.size</refname>
+<refpurpose>Specifies font size to use for foil titles, including units</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+ <programlisting id="foil.title.size.frag">
+ &lt;xsl:param name="foil.title.size"&gt;
+ &lt;xsl:value-of select="$foil.title.master"&gt;&lt;/xsl:value-of&gt;&lt;xsl:text&gt;pt&lt;/xsl:text&gt;
+ &lt;/xsl:param&gt;
+ </programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>This parameter combines the value of the
+<parameter>foil.title.master</parameter> parameter with a unit
+specification. The default unit is <literal>pt</literal>
+(points).</para>
+
+</refsection>
+</refentry>
+
+</reference><reference id="propsets" xml:base="../slides/fo/param.xml">
+ <title>FO: Property Sets</title>
+<refentry version="5.0" id="slides.properties">
+<refmeta>
+<refentrytitle>slides.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>slides.properties</refname>
+<refpurpose>Specifies properties for all slides</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+ <programlisting id="slides.properties.frag">
+ &lt;xsl:attribute-set name="slides.properties"&gt;
+ &lt;xsl:attribute name="font-family"&gt;
+ &lt;xsl:value-of select="$slide.font.family"&gt;&lt;/xsl:value-of&gt;
+ &lt;/xsl:attribute&gt;
+ &lt;/xsl:attribute-set&gt;
+ </programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>This parameter specifies properties that are applied to all slides.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="foilgroup.properties">
+<refmeta>
+<refentrytitle>foilgroup.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>foilgroup.properties</refname>
+<refpurpose>Specifies properties for all foilgroups</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+ <programlisting id="foilgroup.properties.frag">
+ &lt;xsl:attribute-set name="foilgroup.properties"&gt;
+ &lt;xsl:attribute name="font-family"&gt;
+ &lt;xsl:value-of select="$slide.font.family"&gt;&lt;/xsl:value-of&gt;
+ &lt;/xsl:attribute&gt;
+ &lt;/xsl:attribute-set&gt;
+ </programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>This parameter specifies properties that are applied to all foilgroups.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="foil.subtitle.properties">
+<refmeta>
+<refentrytitle>foil.subtitle.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>foil.subtitle.properties</refname>
+<refpurpose>Specifies properties for all foil subtitles</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+ <programlisting id="foil.subtitle.properties.frag">
+ &lt;xsl:attribute-set name="foil.subtitle.properties"&gt;
+ &lt;xsl:attribute name="font-family"&gt;
+ &lt;xsl:value-of select="$slide.title.font.family"&gt;&lt;/xsl:value-of&gt;
+ &lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="text-align"&gt;center&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="font-size"&gt;
+ &lt;xsl:value-of select="$foil.title.master * 0.8"&gt;&lt;/xsl:value-of&gt;&lt;xsl:text&gt;pt&lt;/xsl:text&gt;
+ &lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="space-after"&gt;12pt&lt;/xsl:attribute&gt;
+ &lt;/xsl:attribute-set&gt;
+ </programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>This parameter specifies properties that are applied to all foil subtitles.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="foil.properties">
+<refmeta>
+<refentrytitle>foil.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>foil.properties</refname>
+<refpurpose>Specifies properties for all foils</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+ <programlisting id="foil.properties.frag">
+ &lt;xsl:attribute-set name="foil.properties"&gt;
+ &lt;xsl:attribute name="font-family"&gt;
+ &lt;xsl:value-of select="$slide.font.family"&gt;&lt;/xsl:value-of&gt;
+ &lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="margin-{$direction.align.start}"&gt;1in&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="margin-{$direction.align.end}"&gt;1in&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="font-size"&gt;
+ &lt;xsl:value-of select="$body.font.size"&gt;&lt;/xsl:value-of&gt;
+ &lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="font-weight"&gt;bold&lt;/xsl:attribute&gt;
+ &lt;/xsl:attribute-set&gt;
+ </programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>This parameter specifies properties that are applied to all foils.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="speakernote.properties">
+<refmeta>
+<refentrytitle>speakernote.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>speakernote.properties</refname>
+<refpurpose>Specifies properties for all speakernotes</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+ <programlisting id="speakernote.properties.frag">
+ &lt;xsl:attribute-set name="speakernote.properties"&gt;
+ &lt;xsl:attribute name="font-family"&gt;Times Roman&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="font-style"&gt;italic&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="font-size"&gt;12pt&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="font-weight"&gt;normal&lt;/xsl:attribute&gt;
+ &lt;/xsl:attribute-set&gt;
+ </programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>This parameter specifies properties that are applied to all speakernotes.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="running.foot.properties">
+<refmeta>
+<refentrytitle>running.foot.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>running.foot.properties</refname>
+<refpurpose>Specifies properties for running foot on each slide</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+ <programlisting id="running.foot.properties.frag">
+ &lt;xsl:attribute-set name="running.foot.properties"&gt;
+ &lt;xsl:attribute name="font-family"&gt;
+ &lt;xsl:value-of select="$slide.font.family"&gt;&lt;/xsl:value-of&gt;
+ &lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="font-size"&gt;14pt&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="color"&gt;#9F9F9F&lt;/xsl:attribute&gt;
+ &lt;/xsl:attribute-set&gt;
+ </programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>This parameter specifies properties that are applied to the
+running foot area of each slide.</para>
+
+</refsection>
+</refentry>
+
+</reference>
+ </part>
+ <part id="website">
+ <?dbhtml dir="website"?>
+ <?dbhtml filename="index.html"?>
+ <title xml:base="../website/param.xml">Website Parameter Reference</title>
+ <partintro id="websiteintro">
+
+ <para xml:base="../website/param.xml">This is reference documentation for all user-configurable
+ parameters in the DocBook XSL Website stylesheet (for
+ generating websites from DocBook XML sources). Note that the
+ Website stylesheet is a customization layer of the DocBook XSL
+ HTML stylesheet. Therefore, in addition to the
+ Website-specific parameters listed in this section, you can
+ also use a number of <link xlink:href="../html/">HTML
+ stylesheet parameters</link> to control Website output.</para>
+
+ </partintro>
+ <reference id="general" xml:base="../website/param.xml">
+<title>General Parameters</title>
+<refentry version="5.0" id="autolayout-file">
+<refmeta>
+<refentrytitle>autolayout-file</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">filename</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>autolayout-file</refname>
+<refpurpose>Identifies the autolayout.xml file</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="autolayout-file.frag">
+&lt;xsl:param name="autolayout-file"&gt;autolayout.xml&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+<para>When the source pages are spread over several directories, this
+parameter can be set (for example, from the command line of a batch-mode
+XSLT processor) to indicate the location of the autolayout.xml file.</para>
+<para>FIXME: for browser-based use, there needs to be a PI for this...
+</para>
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="body.attributes">
+<refmeta>
+<refentrytitle>body.attributes</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>body.attributes</refname>
+<refpurpose>DEPRECATED</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="body.attributes.frag">
+&lt;xsl:attribute-set name="body.attributes"&gt;
+ &lt;xsl:attribute name="bgcolor"&gt;white&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="text"&gt;black&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="link"&gt;#0000FF&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="vlink"&gt;#840084&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="alink"&gt;#0000FF&lt;/xsl:attribute&gt;
+&lt;/xsl:attribute-set&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+<para>DEPRECATED</para>
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="currentpage.marker">
+<refmeta>
+<refentrytitle>currentpage.marker</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>currentpage.marker</refname>
+<refpurpose>The text symbol used to mark the current page</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="currentpage.marker.frag">
+&lt;xsl:param name="currentpage.marker"&gt;@&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+<para>Character to use as identifying the current page in </para>
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="dry-run">
+<refmeta>
+<refentrytitle>dry-run</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>dry-run</refname>
+<refpurpose>Indicates that no files should be produced</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+ <programlisting id="dry-run.frag">
+ &lt;xsl:param name="dry-run" select="0"&gt;&lt;/xsl:param&gt;
+ </programlisting>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+<para>When using the XSLT processor to manage dependencies and construct
+the website, this parameter can be used to suppress the generation of
+new and updated files. Effectively, this allows you to see what the
+stylesheet would do, without actually making any changes.</para>
+<para>Only applies when XSLT-based chunking is being used.</para>
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="feedback.href">
+<refmeta>
+<refentrytitle>feedback.href</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">uri</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>feedback.href</refname>
+<refpurpose>HREF (URI) for feedback link</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="feedback.href.frag">
+&lt;xsl:param name="feedback.href"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+<para>The <varname>feedback.href</varname> value is used as the value
+for the <tag class="attribute">href</tag> attribute on the feedback
+link. If <varname>feedback.href</varname>
+is empty, no feedback link is generated.</para>
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="feedback.link.text">
+<refmeta>
+<refentrytitle>feedback.link.text</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>feedback.link.text</refname>
+<refpurpose>The text of the feedback link</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="feedback.link.text.frag">
+&lt;xsl:param name="feedback.link.text"&gt;Feedback&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+<para>The contents of this variable is used as the text of the feedback
+link if <varname>feedback.href</varname> is not empty. If
+<varname>feedback.href</varname> is empty, no feedback link is
+generated.</para>
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="feedback.with.ids">
+<refmeta>
+<refentrytitle>feedback.with.ids</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>feedback.with.ids</refname>
+<refpurpose>Toggle use of IDs in feedback</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="feedback.with.ids.frag">
+&lt;xsl:param name="feedback.with.ids" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+<para>If <varname>feedback.with.ids</varname> is non-zero, the ID of the
+current page will be added to the feedback link. This can be used, for
+example, if the <varname>feedback.href</varname> is a CGI script.</para>
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="filename-prefix">
+<refmeta>
+<refentrytitle>filename-prefix</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>filename-prefix</refname>
+<refpurpose>Prefix added to all filenames</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="filename-prefix.frag">
+&lt;xsl:param name="filename-prefix"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+<para>To produce the <quote>text-only</quote> (that is, non-tabular) layout
+of a website simultaneously with the tabular layout, the filenames have to
+be distinguished. That's accomplished by adding the
+<varname>filename-prefix</varname> to the front of each filename.</para>
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="footer.hr">
+<refmeta>
+<refentrytitle>footer.hr</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>footer.hr</refname>
+<refpurpose>Toggle &lt;HR&gt; before footer</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="footer.hr.frag">
+&lt;xsl:param name="footer.hr" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+<para>If non-zero, an &lt;HR&gt; is generated at the bottom of each web page,
+before the footer.</para>
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="header.hr">
+<refmeta>
+<refentrytitle>header.hr</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>header.hr</refname>
+<refpurpose>Toggle &lt;HR&gt; after header</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="header.hr.frag">
+&lt;xsl:param name="header.hr" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+<para>If non-zero, an &lt;HR&gt; is generated at the bottom of each web page,
+before the footer.</para>
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="output-root">
+<refmeta>
+<refentrytitle>output-root</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">filename</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>output-root</refname>
+<refpurpose>Specifies the root directory of the website</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="output-root.frag">
+&lt;xsl:param name="output-root"&gt;.&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+<para>When using the XSLT processor to manage dependencies and construct
+the website, this parameter can be used to indicate the root directory
+where the resulting pages are placed.</para>
+<para>Only applies when XSLT-based chunking is being used.</para>
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="rebuild-all">
+<refmeta>
+<refentrytitle>rebuild-all</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>rebuild-all</refname>
+<refpurpose>Indicates that all files should be produced</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="rebuild-all.frag">
+&lt;xsl:param name="rebuild-all" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+<para>When using the XSLT processor to manage dependencies and construct
+the website, this parameter can be used to regenerate the whole website,
+updating even pages that don't appear to need to be updated.</para>
+<para>The dependency extension only looks at the source documents. So
+if you change something in the stylesheet, for example, that has a global
+effect, you can use this parameter to force the stylesheet to rebuild the
+whole website.
+</para>
+<para>Only applies when XSLT-based chunking is being used.</para>
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="sequential.links">
+<refmeta>
+<refentrytitle>sequential.links</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>sequential.links</refname>
+<refpurpose>Make sequentional links?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="sequential.links.frag">
+&lt;xsl:param name="sequential.links" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+<para>FIXME</para>
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="suppress.homepage.title">
+<refmeta>
+<refentrytitle>suppress.homepage.title</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>suppress.homepage.title</refname>
+<refpurpose>Suppress title on homepage?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="suppress.homepage.title.frag">
+&lt;xsl:param name="suppress.homepage.title" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+<para>FIXME:If non-zero, the title on the homepage is suppressed?</para>
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="table.spacer.image">
+<refmeta>
+<refentrytitle>table.spacer.image</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">filename</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>table.spacer.image</refname>
+<refpurpose>Invisible pixel for tabular accessibility</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="table.spacer.image.frag">
+&lt;xsl:param name="table.spacer.image"&gt;graphics/spacer.gif&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+<para>This is the 1x1 pixel, transparent pixel used for <link xlink:href="http://diveintoaccessibility.org/day_10_presenting_your_main_content_first.html">the table trick</link> to increase the accessibility of the tabular
+website presentation.</para>
+</refsection>
+</refentry>
+
+</reference><reference id="nav" xml:base="../website/param.xml">
+<title>Navigation Parameters</title>
+<refentry version="5.0" id="banner.before.navigation">
+<refmeta>
+<refentrytitle>banner.before.navigation</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>banner.before.navigation</refname>
+<refpurpose>Put banner before navigation?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="banner.before.navigation.frag">
+&lt;xsl:param name="banner.before.navigation" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+<para>FIXME</para>
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="navbgcolor">
+<refmeta>
+<refentrytitle>navbgcolor</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">color</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>navbgcolor</refname>
+<refpurpose>The background color of the navigation TOC</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="navbgcolor.frag">
+&lt;xsl:param name="navbgcolor"&gt;#4080FF&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+<para>The background color of the navigation TOC.</para>
+<para>Only applies with the tabular presentation is being used.</para>
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="navbodywidth">
+<refmeta>
+<refentrytitle>navbodywidth</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">length</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>navbodywidth</refname>
+<refpurpose>Specifies the width of the navigation table body</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="navbodywidth.frag">
+&lt;xsl:param name="navbodywidth"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+<para>The width of the body column.</para>
+<para>Only applies with the tabular presentation is being used.</para>
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="nav.table.summary">
+<refmeta>
+<refentrytitle>nav.table.summary</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>nav.table.summary</refname>
+<refpurpose>HTML Table summary attribute value for navigation tables</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="nav.table.summary.frag">
+&lt;xsl:param name="nav.table.summary"&gt;Navigation&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+<para>The value of this parameter is used as the value of the table
+summary attribute for the navigation table.</para>
+<para>Only applies with the tabular presentation is being used.</para>
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="navtocwidth">
+<refmeta>
+<refentrytitle>navtocwidth</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">length</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>navtocwidth</refname>
+<refpurpose>Specifies the width of the navigation table TOC</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="navtocwidth.frag">
+&lt;xsl:param name="navtocwidth"&gt;220&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+<para>The width, in pixels, of the navigation column.</para>
+<para>Only applies with the tabular presentation is being used.</para>
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="textbgcolor">
+<refmeta>
+<refentrytitle>textbgcolor</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">color</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>textbgcolor</refname>
+<refpurpose>The background color of the table body</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="textbgcolor.frag">
+&lt;xsl:param name="textbgcolor"&gt;white&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+<para>The background color of the table body.</para>
+<para>Only applies with the tabular presentation is being used.</para>
+</refsection>
+</refentry>
+
+</reference><reference id="toc" xml:base="../website/param.xml">
+<title>ToC Parameters</title>
+<refentry version="5.0" id="toc.blank.graphic">
+<refmeta>
+<refentrytitle>toc.blank.graphic</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>toc.blank.graphic</refname>
+<refpurpose>Use graphic for "blanks" in TOC?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="toc.blank.graphic.frag">
+&lt;xsl:param name="toc.blank.graphic" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+<para>If non-zero, "blanks" in the the TOC will be accomplished
+with the graphic identified by <varname>toc.spacer.image</varname>.
+</para>
+<para>Only applies with the tabular presentation is being used.</para>
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="toc.blank.image">
+<refmeta>
+<refentrytitle>toc.blank.image</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">filename</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>toc.blank.image</refname>
+<refpurpose>The image for "blanks" in the TOC</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="toc.blank.image.frag">
+&lt;xsl:param name="toc.blank.image"&gt;graphics/blank.gif&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+<para>If <varname>toc.blank.graphic</varname> is non-zero, this image
+will be used to for "blanks" in the TOC.</para>
+<para>Only applies with the tabular presentation is being used.</para>
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="toc.blank.text">
+<refmeta>
+<refentrytitle>toc.blank.text</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>toc.blank.text</refname>
+<refpurpose>The text for "blanks" in the TOC</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="toc.blank.text.frag">
+&lt;xsl:param name="toc.blank.text"&gt;&#160;&#160;&#160;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+<para>If <varname>toc.blank.graphic</varname> is zero, this text string
+will be used for "blanks" in the TOC.</para>
+<para>Only applies with the tabular presentation is being used.</para>
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="toc.pointer.graphic">
+<refmeta>
+<refentrytitle>toc.pointer.graphic</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>toc.pointer.graphic</refname>
+<refpurpose>Use graphic for TOC pointer?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="toc.pointer.graphic.frag">
+&lt;xsl:param name="toc.pointer.graphic" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+<para>If non-zero, the "pointer" in the TOC will be displayed
+with the graphic identified by <varname>toc.pointer.image</varname>.
+</para>
+<para>Only applies with the tabular presentation is being used.</para>
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="toc.pointer.image">
+<refmeta>
+<refentrytitle>toc.pointer.image</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">filename</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>toc.pointer.image</refname>
+<refpurpose>The image for the "pointer" in the TOC</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="toc.pointer.image.frag">
+&lt;xsl:param name="toc.pointer.image"&gt;graphics/arrow.gif&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+<para>If <varname>toc.pointer.graphic</varname> is non-zero, this image
+will be used for the "pointer" in the TOC.</para>
+<para>Only applies with the tabular presentation is being used.</para>
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="toc.pointer.text">
+<refmeta>
+<refentrytitle>toc.pointer.text</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>toc.pointer.text</refname>
+<refpurpose>The text for the "pointer" in the TOC</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="toc.pointer.text.frag">
+&lt;xsl:param name="toc.pointer.text"&gt;&#160;&gt;&#160;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+<para>If <varname>toc.pointer.graphic</varname> is zero, this text string
+will be used to display the "pointer" in the TOC.</para>
+<para>Only applies with the tabular presentation is being used.</para>
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="toc.spacer.graphic">
+<refmeta>
+<refentrytitle>toc.spacer.graphic</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>toc.spacer.graphic</refname>
+<refpurpose>Use graphic for TOC spacer?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="toc.spacer.graphic.frag">
+&lt;xsl:param name="toc.spacer.graphic" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+<para>If non-zero, the indentation in the TOC will be accomplished
+with the graphic identified by <varname>toc.spacer.image</varname>.
+</para>
+<para>Only applies with the tabular presentation is being used.</para>
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="toc.spacer.image">
+<refmeta>
+<refentrytitle>toc.spacer.image</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">filename</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>toc.spacer.image</refname>
+<refpurpose>The image for spacing the TOC</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="toc.spacer.image.frag">
+&lt;xsl:param name="toc.spacer.image"&gt;graphics/blank.gif&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+<para>If <varname>toc.spacer.graphic</varname> is non-zero, this image
+will be used to indent the TOC.</para>
+<para>Only applies with the tabular presentation is being used.</para>
+</refsection>
+</refentry>
+
+<refentry version="5.0" id="toc.spacer.text">
+<refmeta>
+<refentrytitle>toc.spacer.text</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>toc.spacer.text</refname>
+<refpurpose>The text for spacing the TOC</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting id="toc.spacer.text.frag">
+&lt;xsl:param name="toc.spacer.text"&gt;&#160;&#160;&#160;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+<para>If <varname>toc.spacer.graphic</varname> is zero, this text string
+will be used to indent the TOC.</para>
+<para>Only applies with the tabular presentation is being used.</para>
+</refsection>
+</refentry>
+
+</reference>
+ </part>
+ </book>
+ <book id="pi"><title>DocBook XSL Stylesheets User&#160;Reference:&#160;PIs</title>
+ <?dbhtml dir="pi"?>
+ <?dbhtml filename="index.html"?>
+ <info>
+ <abstract>
+ <para>This is generated reference documentation for all
+ user-specifiable processing instructions in the DocBook
+ XSL stylesheets.
+ <note>
+ <para>You add these PIs at particular points in a document to
+ cause specific &#8220;exceptions&#8221; to formatting/output behavior. To
+ make global changes in formatting/output behavior across an
+ entire document, it&#8217;s better to do it by setting an
+ appropriate stylesheet parameter (if there is one).</para>
+ </note>
+ </para>
+ </abstract>
+ </info>
+ <part id="pi-html">
+ <info xml:base="../html/pi.xml"><title>HTML Processing Instruction Reference</title>
+ <releaseinfo role="meta">
+ $Id: pi.xsl 8394 2009-04-02 20:31:30Z mzjn $
+ </releaseinfo>
+ </info>
+ <partintro id="partintro" xml:base="../html/pi.xml">
+ <title>Introduction</title>
+
+<para>This is generated reference documentation for all
+ user-specifiable processing instructions (PIs) in the DocBook
+ XSL stylesheets for HTML output.
+ <note>
+
+<para>You add these PIs at particular points in a document to
+ cause specific &#8220;exceptions&#8221; to formatting/output behavior. To
+ make global changes in formatting/output behavior across an
+ entire document, it&#8217;s better to do it by setting an
+ appropriate stylesheet parameter (if there is one).</para>
+
+ </note>
+ </para>
+
+ </partintro>
+
+<refentry id="dbhtml_background-color" xml:base="../html/pi.xml">
+<refnamediv>
+<refname>dbhtml_background-color</refname>
+<refpurpose>Sets background color for an image</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+
+ <synopsis><tag class="xmlpi">dbhtml background-color="<replaceable>color</replaceable>"</tag></synopsis>
+
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>Use the <tag class="xmlpi">dbhtml background-color</tag> PI before or
+ after an image (<tag>graphic</tag>, <tag>inlinegraphic</tag>,
+ <tag>imagedata</tag>, or <tag>videodata</tag> element) as a
+ sibling to the element, to set a background color for the
+ image.</para>
+
+ </refsect1><refsect1><title>Parameters</title>
+
+<variablelist>
+ <varlistentry><term>background-color="<replaceable>color</replaceable>"</term>
+ <listitem>
+
+<para>An HTML color value</para>
+
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ </refsect1><refsect1 role="tcg"><title>Related Information in <link xlink:href="http://www.sagehill.net/docbookxsl/">DocBook XSL: The Complete Guide</link></title>
+
+<para><link role="tcg" xlink:href="BGcolor.html">Background color</link></para>
+
+ </refsect1></refentry>
+
+<refentry id="dbhtml_bgcolor" xml:base="../html/pi.xml">
+<refnamediv>
+<refname>dbhtml_bgcolor</refname>
+<refpurpose>Sets background color on a CALS table row or table cell</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+
+ <synopsis><tag class="xmlpi">dbhtml bgcolor="<replaceable>color</replaceable>"</tag></synopsis>
+
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>Use the <tag class="xmlpi">dbhtml bgcolor</tag> PI as child of a CALS table row
+ or cell to set a background color for that table row or cell.</para>
+
+ </refsect1><refsect1><title>Parameters</title>
+
+<variablelist>
+ <varlistentry><term>bgcolor="<replaceable>color</replaceable>"</term>
+ <listitem>
+
+<para>An HTML color value</para>
+
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ </refsect1><refsect1 role="tcg"><title>Related Information in <link xlink:href="http://www.sagehill.net/docbookxsl/">DocBook XSL: The Complete Guide</link></title>
+
+<para><link role="tcg" xlink:href="BGtableColor.html#CellBGColor">Cell background color</link></para>
+
+ </refsect1></refentry>
+
+<refentry id="dbhtml_cellpadding" xml:base="../html/pi.xml">
+<refnamediv>
+<refname>dbhtml_cellpadding</refname>
+<refpurpose>Specifies cellpadding in CALS table or qandaset output</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+
+ <synopsis><tag class="xmlpi">dbhtml cellpadding="<replaceable>number</replaceable>"</tag></synopsis>
+
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>Use the <tag class="xmlpi">dbhtml cellpadding</tag> PI as a child of a
+ CALS <tag>table</tag> or <tag>qandaset</tag> to specify the value
+ for the HTML <literal>cellpadding</literal> attribute in the
+ output HTML table.</para>
+
+ </refsect1><refsect1><title>Parameters</title>
+
+<variablelist>
+ <varlistentry><term>cellpadding="<replaceable>number</replaceable>"</term>
+ <listitem>
+
+<para>Specifies the cellpadding</para>
+
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ </refsect1><refsect1 role="params"><title>Related Global Parameters</title>
+
+<para><parameter>html.cellpadding</parameter></para>
+
+ </refsect1><refsect1 role="tcg"><title>Related Information in <link xlink:href="http://www.sagehill.net/docbookxsl/">DocBook XSL: The Complete Guide</link></title>
+
+<para><link role="tcg" xlink:href="CellSpacing.html">Cell spacing and cell padding</link>,
+ <link role="tcg" xlink:href="QandAformat.html">Q and A formatting</link></para>
+
+ </refsect1></refentry>
+
+<refentry id="dbhtml_cellspacing" xml:base="../html/pi.xml">
+<refnamediv>
+<refname>dbhtml_cellspacing</refname>
+<refpurpose>Specifies cellspacing in CALS table or qandaset output</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+
+ <synopsis><tag class="xmlpi">dbhtml cellspacing="<replaceable>number</replaceable>"</tag></synopsis>
+
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>Use the <tag class="xmlpi">dbhtml cellspacing</tag> PI as a child of a
+ CALS <tag>table</tag> or <tag>qandaset</tag> to specify the value
+ for the HTML <literal>cellspacing</literal> attribute in the
+ output HTML table.</para>
+
+ </refsect1><refsect1><title>Parameters</title>
+
+<variablelist>
+ <varlistentry><term>cellspacing="<replaceable>number</replaceable>"</term>
+ <listitem>
+
+<para>Specifies the cellspacing</para>
+
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ </refsect1><refsect1 role="params"><title>Related Global Parameters</title>
+
+<para><parameter>html.cellspacing</parameter></para>
+
+ </refsect1><refsect1 role="tcg"><title>Related Information in <link xlink:href="http://www.sagehill.net/docbookxsl/">DocBook XSL: The Complete Guide</link></title>
+
+<para><link role="tcg" xlink:href="CellSpacing.html">Cell spacing and cell padding</link>,
+ <link role="tcg" xlink:href="QandAformat.html">Q and A formatting</link></para>
+
+ </refsect1></refentry>
+
+<refentry id="dbhtml_class" xml:base="../html/pi.xml">
+<refnamediv>
+<refname>dbhtml_class</refname>
+<refpurpose>Set value of the class attribute for a CALS table row</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+
+ <synopsis><tag class="xmlpi">dbhtml class="<replaceable>name</replaceable>"</tag></synopsis>
+
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>Use the <tag class="xmlpi">dbhtml class</tag> PI as a child of a
+ <tag>row</tag> to specify a <literal>class</literal>
+ attribute and value in the HTML output for that row.</para>
+
+ </refsect1><refsect1><title>Parameters</title>
+
+<variablelist>
+ <varlistentry><term>class="<replaceable>name</replaceable>"</term>
+ <listitem>
+
+<para>Specifies the class name</para>
+
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ </refsect1><refsect1 role="tcg"><title>Related Information in <link xlink:href="http://www.sagehill.net/docbookxsl/">DocBook XSL: The Complete Guide</link></title>
+
+<para><link role="tcg" xlink:href="CSSTableCells.html">Table styles in HTML output</link></para>
+
+ </refsect1></refentry>
+
+<refentry id="dbhtml_dir" xml:base="../html/pi.xml">
+<refnamediv>
+<refname>dbhtml_dir</refname>
+<refpurpose>Specifies a directory name in which to write files</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+
+ <synopsis><tag class="xmlpi">dbhtml dir="<replaceable>path</replaceable>"</tag></synopsis>
+
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>When chunking output, use the <tag class="xmlpi">dbhtml dir</tag> PI
+ as a child of a chunk source to cause the output of that
+ chunk to be written to the specified directory; also, use it
+ as a child of a <tag>mediaobject</tag> to specify a
+ directory into which any long-description files for that
+ <tag>mediaobject</tag> will be written.</para>
+
+ </refsect1><refsect1><title>Parameters</title>
+
+<variablelist>
+ <varlistentry><term>dir="<replaceable>path</replaceable>"</term>
+ <listitem>
+
+<para>Specifies the pathname for the directory</para>
+
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ </refsect1><refsect1 role="params"><title>Related Global Parameters</title>
+
+<para><parameter>base.dir</parameter></para>
+
+ </refsect1><refsect1 role="tcg"><title>Related Information in <link xlink:href="http://www.sagehill.net/docbookxsl/">DocBook XSL: The Complete Guide</link></title>
+
+<para><link role="tcg" xlink:href="Chunking.html#dbhtmlDirPI">dbhtml dir processing instruction</link></para>
+
+ </refsect1></refentry>
+
+<refentry id="dbhtml_filename" xml:base="../html/pi.xml">
+<refnamediv>
+<refname>dbhtml_filename</refname>
+<refpurpose>Specifies a filename for a chunk</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+
+ <synopsis><tag class="xmlpi">dbhtml filename="<replaceable>filename</replaceable>"</tag></synopsis>
+
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>When chunking output, use the <tag class="xmlpi">dbhtml filename</tag>
+ PI as a child of a chunk source to specify a filename for
+ the output file for that chunk.</para>
+
+ </refsect1><refsect1><title>Parameters</title>
+
+<variablelist>
+ <varlistentry><term>filename="<replaceable>path</replaceable>"</term>
+ <listitem>
+
+<para>Specifies the filename for the file</para>
+
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ </refsect1><refsect1 role="params"><title>Related Global Parameters</title>
+
+<para><parameter>use.id.as.filename</parameter></para>
+
+ </refsect1><refsect1 role="tcg"><title>Related Information in <link xlink:href="http://www.sagehill.net/docbookxsl/">DocBook XSL: The Complete Guide</link></title>
+
+<para><link role="tcg" xlink:href="Chunking.html#DbhtmlFilenames">dbhtml filenames</link></para>
+
+ </refsect1></refentry>
+
+<refentry id="dbhtml_funcsynopsis-style" xml:base="../html/pi.xml">
+<refnamediv>
+<refname>dbhtml_funcsynopsis-style</refname>
+<refpurpose>Specifies presentation style for a funcsynopsis</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+
+ <synopsis><tag class="xmlpi">dbhtml funcsynopsis-style="kr"|"ansi"</tag></synopsis>
+
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>Use the <tag class="xmlpi">dbhtml funcsynopsis-style</tag> PI as a child of
+ a <tag>funcsynopsis</tag> or anywhere within a funcsynopsis
+ to control the presentation style for output of all
+ <tag>funcprototype</tag> instances within that funcsynopsis.</para>
+
+ </refsect1><refsect1><title>Parameters</title>
+
+<variablelist>
+ <varlistentry><term>funcsynopsis-style="kr"</term>
+ <listitem>
+
+<para>Displays <tag>funcprototype</tag> output in K&amp;R style</para>
+
+ </listitem>
+ </varlistentry>
+ <varlistentry><term>funcsynopsis-style="ansi"</term>
+ <listitem>
+
+<para>Displays <tag>funcprototype</tag> output in ANSI style</para>
+
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ </refsect1><refsect1 role="params"><title>Related Global Parameters</title>
+
+<para><parameter>funcsynopsis.style</parameter></para>
+
+ </refsect1></refentry>
+
+<refentry id="dbhtml_img.src.path" xml:base="../html/pi.xml">
+<refnamediv>
+<refname>dbhtml_img.src.path</refname>
+<refpurpose>Specifies a path to the location of an image file</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+
+ <synopsis><tag class="xmlpi">dbhtml img.src.path="<replaceable>path</replaceable>"</tag></synopsis>
+
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>Use the <tag class="xmlpi">dbhtml img.src.path</tag> PI before or
+ after an image (<tag>graphic</tag>,
+ <tag>inlinegraphic</tag>, <tag>imagedata</tag>, or
+ <tag>videodata</tag> element) as a sibling to the element,
+ to specify a path to the location of the image; in HTML
+ output, the value specified for the
+ <code>img.src.path</code> attribute is prepended to the
+ filename.</para>
+
+ </refsect1><refsect1><title>Parameters</title>
+
+<variablelist>
+ <varlistentry><term>img.src.path="<replaceable>path</replaceable>"</term>
+ <listitem>
+
+<para>Specifies the pathname to prepend to the name of the image file</para>
+
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ </refsect1><refsect1 role="params"><title>Related Global Parameters</title>
+
+<para><parameter>img.src.path</parameter></para>
+
+ </refsect1><refsect1 role="tcg"><title>Related Information in <link xlink:href="http://www.sagehill.net/docbookxsl/">DocBook XSL: The Complete Guide</link></title>
+
+<para><link role="tcg" xlink:href="GraphicsLocations.html#UsingFileref">Using fileref</link></para>
+
+ </refsect1></refentry>
+
+<refentry id="dbhtml_label-width" xml:base="../html/pi.xml">
+<refnamediv>
+<refname>dbhtml_label-width</refname>
+<refpurpose>Specifies the label width for a qandaset</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+
+ <synopsis><tag class="xmlpi">dbhtml label-width="<replaceable>width</replaceable>"</tag></synopsis>
+
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>Use the <tag class="xmlpi">dbhtml label-width</tag> PI as a child of a
+ <tag>qandaset</tag> to specify the width of labels.</para>
+
+ </refsect1><refsect1><title>Parameters</title>
+
+<variablelist>
+ <varlistentry><term>label-width="<replaceable>width</replaceable>"</term>
+ <listitem>
+
+<para>Specifies the label width (including units)</para>
+
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ </refsect1><refsect1 role="tcg"><title>Related Information in <link xlink:href="http://www.sagehill.net/docbookxsl/">DocBook XSL: The Complete Guide</link></title>
+
+<para><link role="tcg" xlink:href="QandAformat.html">Q and A formatting</link></para>
+
+ </refsect1></refentry>
+
+<refentry id="dbhtml_linenumbering.everyNth" xml:base="../html/pi.xml">
+<refnamediv>
+<refname>dbhtml_linenumbering.everyNth</refname>
+<refpurpose>Specifies interval for line numbers in verbatims</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+
+ <synopsis><tag class="xmlpi">dbhtml linenumbering.everyNth="<replaceable>N</replaceable>"</tag></synopsis>
+
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>Use the <tag class="xmlpi">dbhtml linenumbering.everyNth</tag> PI as a child
+ of a &#8220;verbatim&#8221; element &#8211; <tag>programlisting</tag>,
+ <tag>screen</tag>, <tag>synopsis</tag> &#8212; to specify
+ the interval at which lines are numbered.</para>
+
+ </refsect1><refsect1><title>Parameters</title>
+
+<variablelist>
+ <varlistentry><term>linenumbering.everyNth="<replaceable>N</replaceable>"</term>
+ <listitem>
+
+<para>Specifies numbering interval; a number is output
+ before every <replaceable>N</replaceable>th line</para>
+
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ </refsect1><refsect1 role="params"><title>Related Global Parameters</title>
+
+<para><parameter>linenumbering.everyNth</parameter></para>
+
+ </refsect1><refsect1 role="tcg"><title>Related Information in <link xlink:href="http://www.sagehill.net/docbookxsl/">DocBook XSL: The Complete Guide</link></title>
+
+<para><link role="tcg" xlink:href="AnnotateListing.html#LineNumbering">Line numbering</link></para>
+
+ </refsect1></refentry>
+
+<refentry id="dbhtml_linenumbering.separator" xml:base="../html/pi.xml">
+<refnamediv>
+<refname>dbhtml_linenumbering.separator</refname>
+<refpurpose>Specifies separator text for line numbers in verbatims</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+
+ <synopsis><tag class="xmlpi">dbhtml linenumbering.separator="<replaceable>text</replaceable>"</tag></synopsis>
+
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>Use the <tag class="xmlpi">dbhtml linenumbering.separator</tag> PI as a child
+ of a &#8220;verbatim&#8221; element &#8211; <tag>programlisting</tag>,
+ <tag>screen</tag>, <tag>synopsis</tag> &#8212; to specify
+ the separator text output between the line numbers and content.</para>
+
+ </refsect1><refsect1><title>Parameters</title>
+
+<variablelist>
+ <varlistentry><term>linenumbering.separator="<replaceable>text</replaceable>"</term>
+ <listitem>
+
+<para>Specifies the text (zero or more characters)</para>
+
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ </refsect1><refsect1 role="params"><title>Related Global Parameters</title>
+
+<para><parameter>linenumbering.separator</parameter></para>
+
+ </refsect1><refsect1 role="tcg"><title>Related Information in <link xlink:href="http://www.sagehill.net/docbookxsl/">DocBook XSL: The Complete Guide</link></title>
+
+<para><link role="tcg" xlink:href="AnnotateListing.html#LineNumbering">Line numbering</link></para>
+
+ </refsect1></refentry>
+
+<refentry id="dbhtml_linenumbering.width" xml:base="../html/pi.xml">
+<refnamediv>
+<refname>dbhtml_linenumbering.width</refname>
+<refpurpose>Specifies width for line numbers in verbatims</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+
+ <synopsis><tag class="xmlpi">dbhtml linenumbering.width="<replaceable>width</replaceable>"</tag></synopsis>
+
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>Use the <tag class="xmlpi">dbhtml linenumbering.width</tag> PI as a child
+ of a &#8220;verbatim&#8221; element &#8211; <tag>programlisting</tag>,
+ <tag>screen</tag>, <tag>synopsis</tag> &#8212; to specify
+ the width set aside for line numbers.</para>
+
+ </refsect1><refsect1><title>Parameters</title>
+
+<variablelist>
+ <varlistentry><term>linenumbering.width="<replaceable>width</replaceable>"</term>
+ <listitem>
+
+<para>Specifies the width (inluding units)</para>
+
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ </refsect1><refsect1 role="params"><title>Related Global Parameters</title>
+
+<para><parameter>linenumbering.width</parameter></para>
+
+ </refsect1><refsect1 role="tcg"><title>Related Information in <link xlink:href="http://www.sagehill.net/docbookxsl/">DocBook XSL: The Complete Guide</link></title>
+
+<para><link role="tcg" xlink:href="AnnotateListing.html#LineNumbering">Line numbering</link></para>
+
+ </refsect1></refentry>
+
+<refentry id="dbhtml_list-presentation" xml:base="../html/pi.xml">
+<refnamediv>
+<refname>dbhtml_list-presentation</refname>
+<refpurpose>Specifies presentation style for a variablelist or
+ segmentedlist</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+
+ <synopsis><tag class="xmlpi">dbhtml list-presentation="list"|"table"</tag></synopsis>
+
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>Use the <tag class="xmlpi">dbhtml list-presentation</tag> PI as a child of
+ a <tag>variablelist</tag> or <tag>segmentedlist</tag> to
+ control the presentation style for the list (to cause it, for
+ example, to be displayed as a table).</para>
+
+ </refsect1><refsect1><title>Parameters</title>
+
+<variablelist>
+ <varlistentry><term>list-presentation="list"</term>
+ <listitem>
+
+<para>Displays the list as a list</para>
+
+ </listitem>
+ </varlistentry>
+ <varlistentry><term>list-presentation="table"</term>
+ <listitem>
+
+<para>Displays the list as a table</para>
+
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ </refsect1><refsect1 role="params"><title>Related Global Parameters</title>
+
+<itemizedlist>
+ <listitem>
+
+<para><parameter>variablelist.as.table</parameter></para>
+
+ </listitem>
+ <listitem>
+
+<para><parameter>segmentedlist.as.table</parameter></para>
+
+ </listitem>
+ </itemizedlist>
+
+ </refsect1><refsect1 role="tcg"><title>Related Information in <link xlink:href="http://www.sagehill.net/docbookxsl/">DocBook XSL: The Complete Guide</link></title>
+
+<para><link role="tcg" xlink:href="Variablelists.html#VarListFormatting">Variable list formatting in HTML</link></para>
+
+ </refsect1></refentry>
+
+<refentry id="dbhtml_list-width" xml:base="../html/pi.xml">
+<refnamediv>
+<refname>dbhtml_list-width</refname>
+<refpurpose>Specifies the width of a variablelist or simplelist</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+
+ <synopsis><tag class="xmlpi">dbhtml list-width="<replaceable>width</replaceable>"</tag></synopsis>
+
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>Use the <tag class="xmlpi">dbhtml list-width</tag> PI as a child of a
+ <tag>variablelist</tag> or a <tag>simplelist</tag> presented
+ as a table, to specify the output width.</para>
+
+ </refsect1><refsect1><title>Parameters</title>
+
+<variablelist>
+ <varlistentry><term>list-width="<replaceable>width</replaceable>"</term>
+ <listitem>
+
+<para>Specifies the output width (including units)</para>
+
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ </refsect1><refsect1 role="tcg"><title>Related Information in <link xlink:href="http://www.sagehill.net/docbookxsl/">DocBook XSL: The Complete Guide</link></title>
+
+<para><link role="tcg" xlink:href="Variablelists.html#VarListFormatting">Variable list formatting in HTML</link></para>
+
+ </refsect1></refentry>
+
+<refentry id="dbhtml_row-height" xml:base="../html/pi.xml">
+<refnamediv>
+<refname>dbhtml_row-height</refname>
+<refpurpose>Specifies the height for a CALS table row</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+
+ <synopsis><tag class="xmlpi">dbhtml row-height="<replaceable>height</replaceable>"</tag></synopsis>
+
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>Use the <tag class="xmlpi">dbhtml row-height</tag> PI as a child of a
+ <tag>row</tag> to specify the height of the row.</para>
+
+ </refsect1><refsect1><title>Parameters</title>
+
+<variablelist>
+ <varlistentry><term>row-height="<replaceable>height</replaceable>"</term>
+ <listitem>
+
+<para>Specifies the row height (including units)</para>
+
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ </refsect1><refsect1 role="tcg"><title>Related Information in <link xlink:href="http://www.sagehill.net/docbookxsl/">DocBook XSL: The Complete Guide</link></title>
+
+<para><link role="tcg" xlink:href="RowHeight.html">Row height</link></para>
+
+ </refsect1></refentry>
+
+<refentry id="dbhtml_start" xml:base="../html/pi.xml">
+<refnamediv>
+<refname>dbhtml_start</refname>
+<refpurpose>(obsolete) Sets the starting number on an ordered list</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+
+ <synopsis><tag class="xmlpi">dbhtml start="<replaceable>character</replaceable>"</tag></synopsis>
+
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para><emphasis>This PI is obsolete</emphasis>. The intent of
+ this PI was to provide a means for setting a specific starting
+ number for an ordered list. Instead of this PI, set a value
+ for the <literal>override</literal> attribute on the first
+ <tag>listitem</tag> in the list; that will have the same
+ effect as what this PI was intended for.</para>
+
+ </refsect1><refsect1><title>Parameters</title>
+
+<variablelist>
+ <varlistentry><term>start="<replaceable>character</replaceable>"</term>
+ <listitem>
+
+<para>Specifies the character to use as the starting
+ number; use 0-9, a-z, A-Z, or lowercase or uppercase
+ Roman numerals</para>
+
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ </refsect1><refsect1 role="tcg"><title>Related Information in <link xlink:href="http://www.sagehill.net/docbookxsl/">DocBook XSL: The Complete Guide</link></title>
+
+<para><link role="tcg" xlink:href="Orderedlists.html#ListStartNum">List starting number</link></para>
+
+ </refsect1></refentry>
+
+<refentry id="dbhtml_stop-chunking" xml:base="../html/pi.xml">
+<refnamediv>
+<refname>dbhtml_stop-chunking</refname>
+<refpurpose>Do not chunk any descendants of this element.</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+
+ <synopsis><tag class="xmlpi">dbhtml stop-chunking</tag></synopsis>
+
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>When generating chunked HTML output, adding this PI as the child of an element that contains elements that would normally be generated on separate pages if generating chunked output causes chunking to stop at this point. No descendants of the current element will be split into new HTML pages:
+<programlisting>&lt;section&gt;
+&lt;title&gt;Configuring pencil&lt;/title&gt;
+&lt;?dbhtml stop-chunking?&gt;
+
+...
+
+&lt;/section&gt;</programlisting>
+</para>
+
+ </refsect1><refsect1 role="tcg"><title>Related Information in <link xlink:href="http://www.sagehill.net/docbookxsl/">DocBook XSL: The Complete Guide</link></title>
+
+<para><link role="tcg" xlink:href="Chunking.html">Chunking into multiple HTML files</link></para>
+
+ </refsect1></refentry>
+
+<refentry id="dbhtml_table-summary" xml:base="../html/pi.xml">
+<refnamediv>
+<refname>dbhtml_table-summary</refname>
+<refpurpose>Specifies summary for CALS table, variablelist, segmentedlist, or qandaset output</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+
+ <synopsis><tag class="xmlpi">dbhtml table-summary="<replaceable>text</replaceable>"</tag></synopsis>
+
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>Use the <tag class="xmlpi">dbhtml table-summary</tag> PI as a child of
+ a CALS <tag>table</tag>, <tag>variablelist</tag>,
+ <tag>segmentedlist</tag>, or <tag>qandaset</tag> to specify
+ the text for the HTML <literal>summary</literal> attribute
+ in the output HTML table.</para>
+
+ </refsect1><refsect1><title>Parameters</title>
+
+<variablelist>
+ <varlistentry><term>table-summary="<replaceable>text</replaceable>"</term>
+ <listitem>
+
+<para>Specifies the summary text (zero or more characters)</para>
+
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ </refsect1><refsect1 role="tcg"><title>Related Information in <link xlink:href="http://www.sagehill.net/docbookxsl/">DocBook XSL: The Complete Guide</link></title>
+
+<para><link role="tcg" xlink:href="Variablelists.html#VarListFormatting">Variable list formatting in HTML</link>,
+ <link role="tcg" xlink:href="TableSummary.html">Table summary text</link></para>
+
+ </refsect1></refentry>
+
+<refentry id="dbhtml_table-width" xml:base="../html/pi.xml">
+<refnamediv>
+<refname>dbhtml_table-width</refname>
+<refpurpose>Specifies the width for a CALS table</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+
+ <synopsis><tag class="xmlpi">dbhtml table-width="<replaceable>width</replaceable>"</tag></synopsis>
+
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>Use the <tag class="xmlpi">dbhtml table-width</tag> PI as a child of a
+ CALS <tag>table</tag> to specify the width of the table in
+ output.</para>
+
+ </refsect1><refsect1><title>Parameters</title>
+
+<variablelist>
+ <varlistentry><term>table-width="<replaceable>width</replaceable>"</term>
+ <listitem>
+
+<para>Specifies the table width (including units or as a percentage)</para>
+
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ </refsect1><refsect1 role="params"><title>Related Global Parameters</title>
+
+<para><parameter>default.table.width</parameter></para>
+
+ </refsect1><refsect1 role="tcg"><title>Related Information in <link xlink:href="http://www.sagehill.net/docbookxsl/">DocBook XSL: The Complete Guide</link></title>
+
+<para><link role="tcg" xlink:href="Tables.html#TableWidth">Table width</link></para>
+
+ </refsect1></refentry>
+
+<refentry id="dbhtml_term-presentation" xml:base="../html/pi.xml">
+<refnamediv>
+<refname>dbhtml_term-presentation</refname>
+<refpurpose>Sets character formatting for terms in a variablelist</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+
+ <synopsis><tag class="xmlpi">dbhtml term-presentation="bold"|"italic"|"bold-italic"</tag></synopsis>
+
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>Use the <tag class="xmlpi">dbhtml term-presentation</tag> PI as a child
+ of a <tag>variablelist</tag> to set character formatting for
+ the <tag>term</tag> output of the list.</para>
+
+ </refsect1><refsect1><title>Parameters</title>
+
+<variablelist>
+ <varlistentry><term>term-presentation="<replaceable>bold</replaceable>"</term>
+ <listitem>
+
+<para>Specifies that terms are displayed in bold</para>
+
+ </listitem>
+ </varlistentry>
+ <varlistentry><term>term-presentation="<replaceable>italic</replaceable>"</term>
+ <listitem>
+
+<para>Specifies that terms are displayed in italic</para>
+
+ </listitem>
+ </varlistentry>
+ <varlistentry><term>term-presentation="<replaceable>bold-italic</replaceable>"</term>
+ <listitem>
+
+<para>Specifies that terms are displayed in bold-italic</para>
+
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ </refsect1><refsect1 role="tcg"><title>Related Information in <link xlink:href="http://www.sagehill.net/docbookxsl/">DocBook XSL: The Complete Guide</link></title>
+
+<para><link role="tcg" xlink:href="Variablelists.html#VarListFormatting">Variable list formatting in HTML</link></para>
+
+ </refsect1></refentry>
+
+<refentry id="dbhtml_term-separator" xml:base="../html/pi.xml">
+<refnamediv>
+<refname>dbhtml_term-separator</refname>
+<refpurpose>Specifies separator text among terms in a varlistentry</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+
+ <synopsis><tag class="xmlpi">dbhtml term-separator="<replaceable>text</replaceable>"</tag></synopsis>
+
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>Use the <tag class="xmlpi">dbhtml term-separator</tag> PI as a child
+ of a <tag>variablelist</tag> to specify the separator text
+ among <tag>term</tag> instances.</para>
+
+ </refsect1><refsect1><title>Parameters</title>
+
+<variablelist>
+ <varlistentry><term>term-separator="<replaceable>text</replaceable>"</term>
+ <listitem>
+
+<para>Specifies the text (zero or more characters)</para>
+
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ </refsect1><refsect1 role="params"><title>Related Global Parameters</title>
+
+<para><parameter>variablelist.term.separator</parameter></para>
+
+ </refsect1><refsect1 role="tcg"><title>Related Information in <link xlink:href="http://www.sagehill.net/docbookxsl/">DocBook XSL: The Complete Guide</link></title>
+
+<para><link role="tcg" xlink:href="Variablelists.html#VarListFormatting">Variable list formatting in HTML</link></para>
+
+ </refsect1></refentry>
+
+<refentry id="dbhtml_term-width" xml:base="../html/pi.xml">
+<refnamediv>
+<refname>dbhtml_term-width</refname>
+<refpurpose>Specifies the term width for a variablelist</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+
+ <synopsis><tag class="xmlpi">dbhtml term-width="<replaceable>width</replaceable>"</tag></synopsis>
+
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>Use the <tag class="xmlpi">dbhtml term-width</tag> PI as a child of a
+ <tag>variablelist</tag> to specify the width for
+ <tag>term</tag> output.</para>
+
+ </refsect1><refsect1><title>Parameters</title>
+
+<variablelist>
+ <varlistentry><term>term-width="<replaceable>width</replaceable>"</term>
+ <listitem>
+
+<para>Specifies the term width (including units)</para>
+
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ </refsect1><refsect1 role="tcg"><title>Related Information in <link xlink:href="http://www.sagehill.net/docbookxsl/">DocBook XSL: The Complete Guide</link></title>
+
+<para><link role="tcg" xlink:href="Variablelists.html#VarListFormatting">Variable list formatting in HTML</link></para>
+
+ </refsect1></refentry>
+
+<refentry id="dbhtml_toc" xml:base="../html/pi.xml">
+<refnamediv>
+<refname>dbhtml_toc</refname>
+<refpurpose>Specifies whether a TOC should be generated for a qandaset</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+
+ <synopsis><tag class="xmlpi">dbhtml toc="0"|"1"</tag></synopsis>
+
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>Use the <tag class="xmlpi">dbhtml toc</tag> PI as a child of a
+ <tag>qandaset</tag> to specify whether a table of contents
+ (TOC) is generated for the <tag>qandaset</tag>.</para>
+
+ </refsect1><refsect1><title>Parameters</title>
+
+<variablelist>
+ <varlistentry><term>toc="0"</term>
+ <listitem>
+
+<para>If zero, no TOC is generated</para>
+
+ </listitem>
+ </varlistentry>
+ <varlistentry><term>toc="1"</term>
+ <listitem>
+
+<para>If <code>1</code> (or any non-zero value),
+ a TOC is generated</para>
+
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ </refsect1><refsect1 role="tcg"><title>Related Information in <link xlink:href="http://www.sagehill.net/docbookxsl/">DocBook XSL: The Complete Guide</link></title>
+
+<para><link role="tcg" xlink:href="QandAtoc.html">Q and A list of questions</link>,
+ <link role="tcg" xlink:href="QandAformat.html">Q and A formatting</link></para>
+
+ </refsect1></refentry>
+
+<refentry id="dbcmdlist" xml:base="../html/pi.xml">
+<refnamediv>
+<refname>dbcmdlist</refname>
+<refpurpose>Generates a hyperlinked list of commands</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+
+ <synopsis><tag class="xmlpi">dbcmdlist</tag></synopsis>
+
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>Use the <tag class="xmlpi">dbcmdlist</tag> PI as the child of any
+ element (for example, <tag>refsynopsisdiv</tag>) containing multiple
+ <tag>cmdsynopsis</tag> instances; a hyperlinked navigational
+ &#8220;command list&#8221; will be generated at the top of output for that
+ element, enabling users to quickly jump
+ to each command synopsis.</para>
+
+ </refsect1><refsect1><title>Parameters</title>
+
+<para>[No parameters]</para>
+
+ </refsect1></refentry>
+
+<refentry id="dbfunclist" xml:base="../html/pi.xml">
+<refnamediv>
+<refname>dbfunclist</refname>
+<refpurpose>Generates a hyperlinked list of functions</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+
+ <synopsis><tag class="xmlpi">dbfunclist</tag></synopsis>
+
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>Use the <tag class="xmlpi">dbfunclist</tag> PI as the child of any
+ element (for example, <tag>refsynopsisdiv</tag>) containing multiple
+ <tag>funcsynopsis</tag> instances; a hyperlinked
+ navigational &#8220;function list&#8221; will be generated at the top of
+ output for that element, enabling users to quickly
+ jump to to each function synopsis.</para>
+
+ </refsect1><refsect1><title>Parameters</title>
+
+<para>[No parameters]</para>
+
+ </refsect1></refentry>
+
+<refentry id="dbhtml-include_href" xml:base="../html/pi.xml">
+<refnamediv>
+<refname>dbhtml-include_href</refname>
+<refpurpose>Copies an external well-formed HTML/XML file into current doc</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+
+ <synopsis><tag class="xmlpi">dbhtml-include href="<replaceable>URI</replaceable>"</tag></synopsis>
+
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>Use the <tag class="xmlpi">dbhtml-include href</tag> PI anywhere in a
+ document to cause the contents of the file referenced by the
+ <code>href</code> pseudo-attribute to be copied/inserted &#8220;as
+ is&#8221; into your HTML output at the point in document order
+ where the PI occurs in the source.</para>
+
+ <note>
+
+<para>The referenced file may contain plain text (as long as
+ it is &#8220;wrapped&#8221; in an <tag>html</tag> element &#8212; see the
+ note below) or markup in any arbitrary vocabulary,
+ including HTML &#8212; but it must conform to XML
+ well-formedness constraints (because the feature in XSLT
+ 1.0 for opening external files, the
+ <function>document()</function> function, can only handle
+ files that meet XML well-formedness constraints).</para>
+
+
+<para>Among other things, XML well-formedness constraints
+ require a document to have <emphasis>a single root
+ element</emphasis>. So if the content you want to
+ include is plain text or is markup that does
+ <emphasis>not</emphasis> have a single root element,
+ <emphasis role="strong">wrap the content in an
+ <tag>html</tag> element</emphasis>. The stylesheets will
+ strip out that surrounding <tag>html</tag> &#8220;wrapper&#8221; when
+ they find it, leaving just the content you want to
+ insert.</para>
+
+ </note>
+ </refsect1><refsect1><title>Parameters</title>
+
+<variablelist>
+ <varlistentry><term>href="<replaceable>URI</replaceable>"</term>
+ <listitem>
+
+<para>Specifies the URI for the file to include; the URI
+ can be, for example, a remote <literal>http:</literal>
+ URI, or a local filesystem <literal>file:</literal>
+ URI</para>
+
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ </refsect1><refsect1 role="params"><title>Related Global Parameters</title>
+
+<para><parameter>textinsert.extension</parameter></para>
+
+ </refsect1><refsect1 role="tcg"><title>Related Information in <link xlink:href="http://www.sagehill.net/docbookxsl/">DocBook XSL: The Complete Guide</link></title>
+
+<para><link role="tcg" xlink:href="InsertExtHtml.html">Inserting external HTML code</link>,
+ <link role="tcg" xlink:href="ExternalCode.html">External code files</link></para>
+
+ </refsect1></refentry>
+
+<refentry id="dbhh" xml:base="../html/pi.xml">
+<refnamediv>
+<refname>dbhh</refname>
+<refpurpose>Sets topic name and topic id for context-sensitive HTML Help</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+
+ <synopsis><tag class="xmlpi">dbhh topicname="<replaceable>name</replaceable>" topicid="<replaceable>id</replaceable>"</tag></synopsis>
+
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>Use the <tag class="xmlpi">dbhh</tag> PI as a child of components
+ that should be used as targets for context-sensitive help requests.</para>
+
+ </refsect1><refsect1><title>Parameters</title>
+
+<variablelist>
+ <varlistentry><term>topicname="<replaceable>name</replaceable>"</term>
+ <listitem>
+
+<para>Specifies a unique string constant that identifies a help topic</para>
+
+ </listitem>
+ </varlistentry>
+ <varlistentry><term>topicid="<replaceable>id</replaceable>"</term>
+ <listitem>
+
+<para>Specifies a unique integer value for the <literal>topicname</literal> string</para>
+
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ </refsect1><refsect1 role="tcg"><title>Related Information in <link xlink:href="http://www.sagehill.net/docbookxsl/">DocBook XSL: The Complete Guide</link></title>
+
+<para><link role="tcg" xlink:href="HtmlHelp.html#HHContextHelp">Context-sensitive help</link></para>
+
+ </refsect1></refentry>
+
+ </part>
+ <part id="pi-fo">
+ <info xml:base="../fo/pi.xml"><title>FO Processing Instruction Reference</title>
+ <releaseinfo role="meta">
+ $Id: pi.xsl 8487 2009-07-14 21:43:36Z bobstayton $
+ </releaseinfo>
+ </info>
+
+ <partintro id="partintro" xml:base="../fo/pi.xml">
+ <title>Introduction</title>
+
+
+<para>This is generated reference documentation for all
+ user-specifiable processing instructions (PIs) in the DocBook
+ XSL stylesheets for FO output.
+ <note>
+
+<para>You add these PIs at particular points in a document to
+ cause specific &#8220;exceptions&#8221; to formatting/output behavior. To
+ make global changes in formatting/output behavior across an
+ entire document, it&#8217;s better to do it by setting an
+ appropriate stylesheet parameter (if there is one).</para>
+
+ </note>
+ </para>
+
+ </partintro>
+
+<refentry id="dbfo_background-color" xml:base="../fo/pi.xml">
+<refnamediv>
+<refname>dbfo_background-color</refname>
+<refpurpose>Sets background color for an image</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+
+ <synopsis><tag class="xmlpi">dbfo background-color="<replaceable>color</replaceable>"</tag></synopsis>
+
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>Use the <tag class="xmlpi">dbfo background-color</tag> PI before or
+ after an image (<tag>graphic</tag>, <tag>inlinegraphic</tag>,
+ <tag>imagedata</tag>, or <tag>videodata</tag> element) as a
+ sibling to the element, to set a background color for the
+ image.</para>
+
+ </refsect1><refsect1><title>Parameters</title>
+
+<variablelist>
+ <varlistentry><term>background-color="<replaceable>color</replaceable>"</term>
+ <listitem>
+
+<para>An HTML color value</para>
+
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ </refsect1><refsect1 role="tcg"><title>Related Information in <link xlink:href="http://www.sagehill.net/docbookxsl/">DocBook XSL: The Complete Guide</link></title>
+
+<para><link role="tcg" xlink:href="BGcolor.html">Background color</link></para>
+
+ </refsect1></refentry>
+
+<refentry id="dbfo_bgcolor" xml:base="../fo/pi.xml">
+<refnamediv>
+<refname>dbfo_bgcolor</refname>
+<refpurpose>Sets background color on a table row or table cell</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+
+ <synopsis><tag class="xmlpi">dbfo bgcolor="<replaceable>color</replaceable>"</tag></synopsis>
+
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>Use the <tag class="xmlpi">dbfo bgcolor</tag> PI as child of a table row
+ or cell to set a background color for that table row or cell.</para>
+
+
+<para>This PI works for both CALS and HTML tables.</para>
+
+ </refsect1><refsect1><title>Parameters</title>
+
+<variablelist>
+ <varlistentry><term>bgcolor="<replaceable>color</replaceable>"</term>
+ <listitem>
+
+<para>An HTML color value</para>
+
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ </refsect1><refsect1 role="tcg"><title>Related Information in <link xlink:href="http://www.sagehill.net/docbookxsl/">DocBook XSL: The Complete Guide</link></title>
+
+<para><link role="tcg" xlink:href="BGtableColor.html#CellBGColor">Cell background color</link></para>
+
+ </refsect1></refentry>
+
+<refentry id="dbfo_float-type" xml:base="../fo/pi.xml">
+<refnamediv>
+<refname>dbfo_float-type</refname>
+<refpurpose>Specifies float behavior for a sidebar</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+
+ <synopsis><tag class="xmlpi">dbfo float-type="margin.note"</tag></synopsis>
+
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>Use the <tag class="xmlpi">dbfo float-type</tag> PI to specify the float
+ behavior for a <tag>sidebar</tag> (to cause the sidebar to be
+ displayed as a marginal note).</para>
+
+ </refsect1><refsect1><title>Parameters</title>
+
+<variablelist>
+ <varlistentry><term>float-type="margin.note"</term>
+ <listitem>
+
+<para>Specifies that the <tag>sidebar</tag> should be
+ displayed as a marginal note.</para>
+
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ </refsect1><refsect1 role="params"><title>Related Global Parameters</title>
+
+<para><parameter>sidebar.float.type</parameter> (parameter),
+ <parameter>sidebar.float.width</parameter> (parameter),
+ <parameter>sidebar.properties</parameter> (attribute-set),
+ <parameter>sidebar.title.properties</parameter> (attribute-set)
+ </para>
+
+ </refsect1><refsect1 role="tcg"><title>Related Information in <link xlink:href="http://www.sagehill.net/docbookxsl/">DocBook XSL: The Complete Guide</link></title>
+
+<para><link role="tcg" xlink:href="SideFloats.html#SidebarFloats">A sidebar as
+ side float</link></para>
+
+ </refsect1></refentry>
+
+<refentry id="dbfo_funcsynopsis-style" xml:base="../fo/pi.xml">
+<refnamediv>
+<refname>dbfo_funcsynopsis-style</refname>
+<refpurpose>Specifies presentation style for a funcsynopsis</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+
+ <synopsis><tag class="xmlpi">dbfo funcsynopsis-style="kr"|"ansi"</tag></synopsis>
+
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>Use the <tag class="xmlpi">dbfo funcsynopsis-style</tag> PI as a child of
+ a <tag>funcsynopsis</tag> or anywhere within a funcsynopsis
+ to control the presentation style for output of all
+ <tag>funcprototype</tag> instances within that funcsynopsis.</para>
+
+ </refsect1><refsect1><title>Parameters</title>
+
+<variablelist>
+ <varlistentry><term>funcsynopsis-style="kr"</term>
+ <listitem>
+
+<para>Displays <tag>funcprototype</tag> output in K&amp;R style</para>
+
+ </listitem>
+ </varlistentry>
+ <varlistentry><term>funcsynopsis-style="ansi"</term>
+ <listitem>
+
+<para>Displays <tag>funcprototype</tag> output in ANSI style</para>
+
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ </refsect1><refsect1 role="params"><title>Related Global Parameters</title>
+
+<para><parameter>funcsynopsis.style</parameter></para>
+
+ </refsect1></refentry>
+
+<refentry id="dbfo_glossary-presentation" xml:base="../fo/pi.xml">
+<refnamediv>
+<refname>dbfo_glossary-presentation</refname>
+<refpurpose>Specifies presentation style for a glossary</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+
+ <synopsis><tag class="xmlpi">dbfo glossary-presentation="list"|"blocks"</tag></synopsis>
+
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>Use the <tag class="xmlpi">dbfo glossary-presentation</tag> PI as a child of
+ a <tag>glossary</tag> to control its presentation style.</para>
+
+ </refsect1><refsect1><title>Parameters</title>
+
+<variablelist>
+ <varlistentry><term>glossary-presentation="list"</term>
+ <listitem>
+
+<para>Displays the glossary as a list</para>
+
+ </listitem>
+ </varlistentry>
+ <varlistentry><term>glossary-presentation="blocks"</term>
+ <listitem>
+
+<para>Displays the glossary as blocks</para>
+
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ </refsect1><refsect1 role="params"><title>Related Global Parameters</title>
+
+<para><parameter>glossary.as.blocks</parameter></para>
+
+ </refsect1><refsect1 role="tcg"><title>Related Information in <link xlink:href="http://www.sagehill.net/docbookxsl/">DocBook XSL: The Complete Guide</link></title>
+
+<para><link role="tcg" xlink:href="Glossaries.html#GlossaryFormatPrint">Glossary
+ formatting in print</link></para>
+
+ </refsect1></refentry>
+
+<refentry id="dbfo_glosslist-presentation" xml:base="../fo/pi.xml">
+<refnamediv>
+<refname>dbfo_glosslist-presentation</refname>
+<refpurpose>Specifies presentation style for a glosslist</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+
+ <synopsis><tag class="xmlpi">dbfo glosslist-presentation="list"|"blocks"</tag></synopsis>
+
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>Use the <tag class="xmlpi">dbfo glosslist-presentation</tag> PI as a child of
+ a <tag>glosslist</tag> to control its presentation style.</para>
+
+ </refsect1><refsect1><title>Parameters</title>
+
+<variablelist>
+ <varlistentry><term>glosslist-presentation="list"</term>
+ <listitem>
+
+<para>Displays the glosslist as a list</para>
+
+ </listitem>
+ </varlistentry>
+ <varlistentry><term>glosslist-presentation="blocks"</term>
+ <listitem>
+
+<para>Displays the glosslist as blocks</para>
+
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ </refsect1><refsect1 role="params"><title>Related Global Parameters</title>
+
+<para><parameter>glosslist.as.blocks</parameter> </para>
+
+ </refsect1><refsect1 role="tcg"><title>Related Information in <link xlink:href="http://www.sagehill.net/docbookxsl/">DocBook XSL: The Complete Guide</link></title>
+
+<para><link role="tcg" xlink:href="Glossaries.html#GlossaryFormatPrint">Glossary
+ formatting in print</link></para>
+
+ </refsect1></refentry>
+
+<refentry id="dbfo_glossterm-width" xml:base="../fo/pi.xml">
+<refnamediv>
+<refname>dbfo_glossterm-width</refname>
+<refpurpose>Specifies the glossterm width for a glossary or
+ glosslist</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+
+ <synopsis><tag class="xmlpi">dbfo glossterm-width="<replaceable>width</replaceable>"</tag></synopsis>
+
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>Use the <tag class="xmlpi">dbfo glossterm-width</tag> PI as a child of a
+ <tag>glossary</tag> or <tag>glosslist</tag> to specify the
+ width for output of <tag>glossterm</tag> instances in the
+ output.</para>
+
+ </refsect1><refsect1><title>Parameters</title>
+
+<variablelist>
+ <varlistentry><term>glossterm-width="<replaceable>width</replaceable>"</term>
+ <listitem>
+
+<para>Specifies the glossterm width (including units)</para>
+
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ </refsect1><refsect1 role="params"><title>Related Global Parameters</title>
+
+<para><parameter>glossterm.width</parameter>,
+ <parameter>glossterm.separation</parameter>
+ </para>
+
+ </refsect1><refsect1 role="tcg"><title>Related Information in <link xlink:href="http://www.sagehill.net/docbookxsl/">DocBook XSL: The Complete Guide</link></title>
+
+<para><link role="tcg" xlink:href="Glossaries.html#GlossaryFormatPrint">Glossary
+ formatting in print</link></para>
+
+ </refsect1></refentry>
+
+<refentry id="dbfo_keep-together" xml:base="../fo/pi.xml">
+<refnamediv>
+<refname>dbfo_keep-together</refname>
+<refpurpose>Specifies &#8220;keep&#8221; behavior for a table, example,
+ figure, equation, procedure, or task</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+
+ <synopsis><tag class="xmlpi">dbfo keep-together="auto"|"always"</tag></synopsis>
+
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>Use the <tag class="xmlpi">dbfo keep-together</tag> PI as a child of a
+ formal object (<tag>table</tag>, <tag>example</tag>,
+ <tag>figure</tag>, <tag>equation</tag>, <tag>procedure</tag>, or
+ <tag>task</tag>) to specify &#8220;keep&#8221; behavior (to allow the object to
+ &#8220;break&#8221; across a page).</para>
+
+
+<para>The PI also works with <tag>informaltable</tag>, <tag>informalexample</tag>,
+ <tag>informalfigure</tag> and <tag>informalequation</tag>.
+ </para>
+
+
+ </refsect1><refsect1><title>Parameters</title>
+
+<variablelist>
+ <varlistentry><term>keep-together="auto"</term>
+ <listitem>
+
+<para>Enables the object to break across a page</para>
+
+ </listitem>
+ </varlistentry>
+ <varlistentry><term>keep-together="always"</term>
+ <listitem>
+
+<para>Prevents the object from breaking across a page (the
+ default stylesheet behavior)</para>
+
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ </refsect1><refsect1 role="params"><title>Related Global Parameters</title>
+
+<para>formal.object.properties</para>
+
+ </refsect1><refsect1 role="tcg"><title>Related Information in <link xlink:href="http://www.sagehill.net/docbookxsl/">DocBook XSL: The Complete Guide</link></title>
+
+<para><link role="tcg" xlink:href="PageBreaking.html#KeepTogetherPI">Keep-together processing instruction</link></para>
+
+ </refsect1></refentry>
+
+<refentry id="dbfo_label-width" xml:base="../fo/pi.xml">
+<refnamediv>
+<refname>dbfo_label-width</refname>
+<refpurpose>Specifies the label width for a qandaset, itemizedlist, orderedlist
+ or calloutlist</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+
+ <synopsis><tag class="xmlpi">dbfo label-width="<replaceable>width</replaceable>"</tag></synopsis>
+
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>Use the <tag class="xmlpi">dbfo label-width</tag> PI as a child of a
+ <tag>qandaset</tag>, <tag>itemizedlist</tag>, <tag>orderedlist</tag>,
+ or <tag>calloutlist</tag> to specify the width of labels.</para>
+
+ </refsect1><refsect1><title>Parameters</title>
+
+<variablelist>
+ <varlistentry><term>label-width="<replaceable>width</replaceable>"</term>
+ <listitem>
+
+<para>Specifies the label width (including units)</para>
+
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ </refsect1><refsect1 role="tcg"><title>Related Information in <link xlink:href="http://www.sagehill.net/docbookxsl/">DocBook XSL: The Complete Guide</link></title>
+
+<para><link role="tcg" xlink:href="QandAformat.html">Q and A formatting</link></para>
+
+ </refsect1></refentry>
+
+<refentry id="dbfo_linenumbering.everyNth" xml:base="../fo/pi.xml">
+<refnamediv>
+<refname>dbfo_linenumbering.everyNth</refname>
+<refpurpose>Specifies interval for line numbers in verbatims</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+
+ <synopsis><tag class="xmlpi">dbfo linenumbering.everyNth="<replaceable>N</replaceable>"</tag></synopsis>
+
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>Use the <tag class="xmlpi">dbfo linenumbering.everyNth</tag> PI as a child
+ of a &#8220;verbatim&#8221; element &#8211; <tag>programlisting</tag>,
+ <tag>screen</tag>, <tag>synopsis</tag> &#8212; to specify
+ the interval at which lines are numbered.</para>
+
+ </refsect1><refsect1><title>Parameters</title>
+
+<variablelist>
+ <varlistentry><term>linenumbering.everyNth="<replaceable>N</replaceable>"</term>
+ <listitem>
+
+<para>Specifies numbering interval; a number is output
+ before every <replaceable>N</replaceable>th line</para>
+
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ </refsect1><refsect1 role="params"><title>Related Global Parameters</title>
+
+<para><parameter>linenumbering.everyNth</parameter></para>
+
+ </refsect1><refsect1 role="tcg"><title>Related Information in <link xlink:href="http://www.sagehill.net/docbookxsl/">DocBook XSL: The Complete Guide</link></title>
+
+<para><link role="tcg" xlink:href="AnnotateListing.html#LineNumbering">Line numbering</link></para>
+
+ </refsect1></refentry>
+
+<refentry id="dbfo_linenumbering.separator" xml:base="../fo/pi.xml">
+<refnamediv>
+<refname>dbfo_linenumbering.separator</refname>
+<refpurpose>Specifies separator text for line numbers in verbatims</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+
+ <synopsis><tag class="xmlpi">dbfo linenumbering.separator="<replaceable>text</replaceable>"</tag></synopsis>
+
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>Use the <tag class="xmlpi">dbfo linenumbering.separator</tag> PI as a child
+ of a &#8220;verbatim&#8221; element &#8211; <tag>programlisting</tag>,
+ <tag>screen</tag>, <tag>synopsis</tag> &#8212; to specify
+ the separator text output between the line numbers and content.</para>
+
+ </refsect1><refsect1><title>Parameters</title>
+
+<variablelist>
+ <varlistentry><term>linenumbering.separator="<replaceable>text</replaceable>"</term>
+ <listitem>
+
+<para>Specifies the text (zero or more characters)</para>
+
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ </refsect1><refsect1 role="params"><title>Related Global Parameters</title>
+
+<para><parameter>linenumbering.separator</parameter></para>
+
+ </refsect1><refsect1 role="tcg"><title>Related Information in <link xlink:href="http://www.sagehill.net/docbookxsl/">DocBook XSL: The Complete Guide</link></title>
+
+<para><link role="tcg" xlink:href="AnnotateListing.html#LineNumbering">Line numbering</link></para>
+
+ </refsect1></refentry>
+
+<refentry id="dbfo_linenumbering.width" xml:base="../fo/pi.xml">
+<refnamediv>
+<refname>dbfo_linenumbering.width</refname>
+<refpurpose>Specifies width for line numbers in verbatims</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+
+ <synopsis><tag class="xmlpi">dbfo linenumbering.width="<replaceable>width</replaceable>"</tag></synopsis>
+
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>Use the <tag class="xmlpi">dbfo linenumbering.width</tag> PI as a child
+ of a &#8220;verbatim&#8221; element &#8211; <tag>programlisting</tag>,
+ <tag>screen</tag>, <tag>synopsis</tag> &#8212; to specify
+ the width set aside for line numbers.</para>
+
+ </refsect1><refsect1><title>Parameters</title>
+
+<variablelist>
+ <varlistentry><term>linenumbering.width="<replaceable>width</replaceable>"</term>
+ <listitem>
+
+<para>Specifies the width (inluding units)</para>
+
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ </refsect1><refsect1 role="params"><title>Related Global Parameters</title>
+
+<para><parameter>linenumbering.width</parameter></para>
+
+ </refsect1><refsect1 role="tcg"><title>Related Information in <link xlink:href="http://www.sagehill.net/docbookxsl/">DocBook XSL: The Complete Guide</link></title>
+
+<para><link role="tcg" xlink:href="AnnotateListing.html#LineNumbering">Line numbering</link></para>
+
+ </refsect1></refentry>
+
+<refentry id="dbfo_list-presentation" xml:base="../fo/pi.xml">
+<refnamediv>
+<refname>dbfo_list-presentation</refname>
+<refpurpose>Specifies presentation style for a variablelist or
+ segmentedlist</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+
+ <synopsis><tag class="xmlpi">dbfo list-presentation="list"|"blocks"|"table"</tag></synopsis>
+
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>Use the <tag class="xmlpi">dbfo list-presentation</tag> PI as a child of
+ a <tag>variablelist</tag> or <tag>segmentedlist</tag> to
+ control the presentation style for the list (to cause it, for
+ example, to be displayed as a table).</para>
+
+ </refsect1><refsect1><title>Parameters</title>
+
+<variablelist>
+ <varlistentry><term>list-presentation="list"</term>
+ <listitem>
+
+<para>Displays the list as a list</para>
+
+ </listitem>
+ </varlistentry>
+ <varlistentry><term>list-presentation="blocks"</term>
+ <listitem>
+
+<para>(<tag>variablelist</tag> only) Displays the list as blocks</para>
+
+ </listitem>
+ </varlistentry>
+ <varlistentry><term>list-presentation="table"</term>
+ <listitem>
+
+<para>(<tag>segmentedlist</tag> only) Displays the list as a table</para>
+
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ </refsect1><refsect1 role="params"><title>Related Global Parameters</title>
+
+<itemizedlist>
+ <listitem>
+
+<para><parameter>variablelist.as.blocks</parameter></para>
+
+ </listitem>
+ <listitem>
+
+<para><parameter>variablelist.as.table</parameter></para>
+
+ </listitem>
+ </itemizedlist>
+
+ </refsect1><refsect1 role="tcg"><title>Related Information in <link xlink:href="http://www.sagehill.net/docbookxsl/">DocBook XSL: The Complete Guide</link></title>
+
+<para><link role="tcg" xlink:href="Variablelists.html#ListIndents">Variable list formatting in print</link></para>
+
+ </refsect1></refentry>
+
+<refentry id="dbfo_list-width" xml:base="../fo/pi.xml">
+<refnamediv>
+<refname>dbfo_list-width</refname>
+<refpurpose>Specifies the width of a horizontal simplelist</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+
+ <synopsis><tag class="xmlpi">dbfo list-width="<replaceable>width</replaceable>"</tag></synopsis>
+
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>Use the <tag class="xmlpi">dbfo list-width</tag> PI as a child of a
+ <tag>simplelist</tag> whose <tag class="attribute">class</tag>
+ value is <literal>horizontal</literal>, to specify the width
+ of the <tag>simplelist</tag>.</para>
+
+ </refsect1><refsect1><title>Parameters</title>
+
+<variablelist>
+ <varlistentry><term>list-width="<replaceable>width</replaceable>"</term>
+ <listitem>
+
+<para>Specifies the <tag>simplelist</tag> width (including units)</para>
+
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ </refsect1></refentry>
+
+<refentry id="dbfo_orientation" xml:base="../fo/pi.xml">
+<refnamediv>
+<refname>dbfo_orientation</refname>
+<refpurpose>Specifies the orientation for a CALS table row or cell</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+
+ <synopsis><tag class="xmlpi">dbfo orientation="0"|"90"|"180"|"270"|"-90"|"-180"|"-270"</tag></synopsis>
+
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>Use the <tag class="xmlpi">dbfo orientation</tag> PI as a child of a CALS
+ <tag>table</tag> row or cell to specify the orientation
+ (rotation) for the row or cell.</para>
+
+ </refsect1><refsect1><title>Parameters</title>
+
+<variablelist>
+ <varlistentry><term>orientation="0"|"90"|"180"|"270"|"-90"|"-180"|"-270"</term>
+ <listitem>
+
+<para>Specifies the number of degrees by which the cell or
+ row is rotated</para>
+
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ </refsect1></refentry>
+
+<refentry id="dbfo_pgwide" xml:base="../fo/pi.xml">
+<refnamediv>
+<refname>dbfo_pgwide</refname>
+<refpurpose>Specifies if an <tag>equation</tag> or <tag>example</tag> goes across full page width</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+
+ <synopsis><tag class="xmlpi">dbfo pgwide="0"|"1"</tag></synopsis>
+
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>Use the <tag class="xmlpi">dbfo pgwide</tag> PI as a child of an
+ <tag>equation</tag> or <tag>example</tag> to specify that the
+ content should rendered across the full width of the page.</para>
+
+ </refsect1><refsect1><title>Parameters</title>
+
+<variablelist>
+ <varlistentry><term>pgwide="0"</term>
+ <listitem>
+
+<para>If zero, the content is rendered across the current
+ text flow</para>
+
+ </listitem>
+ </varlistentry>
+ <varlistentry><term>pgwide="1"</term>
+ <listitem>
+
+<para>If <code>1</code> (or any non-zero value), the
+ content is rendered across the full width of the page</para>
+
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ </refsect1><refsect1 role="params"><title>Related Global Parameters</title>
+
+<para><parameter>pgwide.properties</parameter></para>
+
+ </refsect1></refentry>
+
+<refentry id="dbfo_rotated-width" xml:base="../fo/pi.xml">
+<refnamediv>
+<refname>dbfo_rotated-width</refname>
+<refpurpose>Specifies the width for a CALS table <tag>entry</tag> or
+ <tag>row</tag></refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+
+ <synopsis><tag class="xmlpi">dbfo rotated-width="<replaceable>width</replaceable>"</tag></synopsis>
+
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>Use the <tag class="xmlpi">dbfo rotated-width</tag> PI as a child of
+ <tag>entry</tag> or <tag>row</tag> instance in a CALS table to specify the
+ width of that the <tag>entry</tag> or <tag>row</tag>; or
+ use it higher up in table to cause the width to be inherited
+ recursively down.</para>
+
+ </refsect1><refsect1><title>Parameters</title>
+
+<variablelist>
+ <varlistentry><term>rotated-width="<replaceable>width</replaceable>"</term>
+ <listitem>
+
+<para>Specifies the width of a row or cell (including units)</para>
+
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ </refsect1></refentry>
+
+<refentry id="dbfo_sidebar-width" xml:base="../fo/pi.xml">
+<refnamediv>
+<refname>dbfo_sidebar-width</refname>
+<refpurpose>Specifies the width of a sidebar</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+
+ <synopsis><tag class="xmlpi">dbfo sidebar-width="<replaceable>width</replaceable>"</tag></synopsis>
+
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>Use the <tag class="xmlpi">dbfo sidebar-width</tag> PI as a child of a
+ <tag>sidebar</tag> to specify the width of the sidebar.</para>
+
+ </refsect1><refsect1><title>Parameters</title>
+
+<variablelist>
+ <varlistentry><term>sidebar-width="<replaceable>width</replaceable>"</term>
+ <listitem>
+
+<para>Specifies the <tag>sidebar</tag> width (including units)</para>
+
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ </refsect1><refsect1 role="params"><title>Related Global Parameters</title>
+
+<para><parameter>sidebar.float.type parameter</parameter>,
+ <parameter>sidebar.float.width parameter</parameter>,
+ <parameter>sidebar.properties attribute-set</parameter>,
+ <parameter>sidebar.title.properties</parameter>
+ </para>
+
+ </refsect1><refsect1 role="tcg"><title>Related Information in <link xlink:href="http://www.sagehill.net/docbookxsl/">DocBook XSL: The Complete Guide</link></title>
+
+<para><link role="tcg" xlink:href="SideFloats.html#SidebarFloats">A sidebar as
+ side float</link></para>
+
+ </refsect1></refentry>
+
+<refentry id="dbfo_start" xml:base="../fo/pi.xml">
+<refnamediv>
+<refname>dbfo_start</refname>
+<refpurpose>(obsolete) Sets the starting number on an ordered list</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+
+ <synopsis><tag class="xmlpi">dbfo start="<replaceable>character</replaceable>"</tag></synopsis>
+
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para><emphasis>This PI is obsolete</emphasis>. The intent of
+ it was to provide a means for setting a specific starting
+ number for an ordered list. Instead of this PI, set a value
+ for the <literal>override</literal> attribute on the first
+ <tag>listitem</tag> in the list; that will have the same
+ effect as what this PI was intended for.</para>
+
+ </refsect1><refsect1><title>Parameters</title>
+
+<variablelist>
+ <varlistentry><term>start="<replaceable>character</replaceable>"</term>
+ <listitem>
+
+<para>Specifies the character to use as the starting
+ number; use 0-9, a-z, A-Z, or lowercase or uppercase
+ Roman numerals</para>
+
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ </refsect1><refsect1 role="tcg"><title>Related Information in <link xlink:href="http://www.sagehill.net/docbookxsl/">DocBook XSL: The Complete Guide</link></title>
+
+<para><link role="tcg" xlink:href="Orderedlists.html#ListStartNum">List starting number</link></para>
+
+ </refsect1></refentry>
+
+<refentry id="dbfo_table-width" xml:base="../fo/pi.xml">
+<refnamediv>
+<refname>dbfo_table-width</refname>
+<refpurpose>Specifies the width for a CALS table or for revhistory
+ output</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+
+ <synopsis><tag class="xmlpi">dbfo table-width="<replaceable>width</replaceable>"</tag></synopsis>
+
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>Use the <tag class="xmlpi">dbfo table-width</tag> PI as a child or
+ sibling of a CALS <tag>table</tag>, or as a child of an
+ <tag>informaltable</tag>, <tag>entrytbl</tag>, or
+ <tag>revhistory</tag> instance (which is rendered as a table
+ in output) to specify the width of the table in output.</para>
+
+ </refsect1><refsect1><title>Parameters</title>
+
+<variablelist>
+ <varlistentry><term>table-width="<replaceable>width</replaceable>"</term>
+ <listitem>
+
+<para>Specifies the table width (including units or as a percentage)</para>
+
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ </refsect1><refsect1 role="tcg"><title>Related Information in <link xlink:href="http://www.sagehill.net/docbookxsl/">DocBook XSL: The Complete Guide</link></title>
+
+<para><link role="tcg" xlink:href="Tables.html#TableWidth">Table width</link></para>
+
+ </refsect1></refentry>
+
+<refentry id="dbfo_term-width" xml:base="../fo/pi.xml">
+<refnamediv>
+<refname>dbfo_term-width</refname>
+<refpurpose>Specifies the term width for a variablelist</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+
+ <synopsis><tag class="xmlpi">dbfo term-width="<replaceable>width</replaceable>"</tag></synopsis>
+
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>Use the <tag class="xmlpi">dbfo term-width</tag> PI as a child of a
+ <tag>variablelist</tag> to specify the width for
+ <tag>term</tag> output.</para>
+
+ </refsect1><refsect1><title>Parameters</title>
+
+<variablelist>
+ <varlistentry><term>term-width="<replaceable>width</replaceable>"</term>
+ <listitem>
+
+<para>Specifies the term width (including units)</para>
+
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ </refsect1><refsect1 role="tcg"><title>Related Information in <link xlink:href="http://www.sagehill.net/docbookxsl/">DocBook XSL: The Complete Guide</link></title>
+
+<para><link role="tcg" xlink:href="Variablelists.html#ListIndents">Variable list formatting in print</link></para>
+
+ </refsect1></refentry>
+
+<refentry id="dbfo_toc" xml:base="../fo/pi.xml">
+<refnamediv>
+<refname>dbfo_toc</refname>
+<refpurpose>Specifies whether a TOC should be generated for a qandaset</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+
+ <synopsis><tag class="xmlpi">dbfo toc="0"|"1"</tag></synopsis>
+
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>Use the <tag class="xmlpi">dbfo toc</tag> PI as a child of a
+ <tag>qandaset</tag> to specify whether a table of contents
+ (TOC) is generated for the <tag>qandaset</tag>.</para>
+
+ </refsect1><refsect1><title>Parameters</title>
+
+<variablelist>
+ <varlistentry><term>toc="0"</term>
+ <listitem>
+
+<para>If zero, no TOC is generated</para>
+
+ </listitem>
+ </varlistentry>
+ <varlistentry><term>toc="1"</term>
+ <listitem>
+
+<para>If <code>1</code> (or any non-zero value),
+ a TOC is generated</para>
+
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ </refsect1><refsect1 role="tcg"><title>Related Information in <link xlink:href="http://www.sagehill.net/docbookxsl/">DocBook XSL: The Complete Guide</link></title>
+
+<para><link role="tcg" xlink:href="QandAtoc.html">Q and A list of questions</link>,
+ <link role="tcg" xlink:href="QandAformat.html">Q and A formatting</link></para>
+
+ </refsect1></refentry>
+
+<refentry id="dbfo-need" xml:base="../fo/pi.xml">
+<refnamediv>
+<refname>dbfo-need</refname>
+<refpurpose>Specify a need for space (a kind of soft page break)</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+
+ <synopsis><tag class="xmlpi">dbfo-need height="<replaceable>n</replaceable>" [space-before="<replaceable>n</replaceable>"]</tag></synopsis>
+
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>A &#8220;need&#8221; is a request for space on a page. If the
+ requested space is not available, the page breaks and the
+ content that follows the need request appears on the next
+ page. If the requested space is available, then no page break
+ is inserted.</para>
+
+ </refsect1><refsect1><title>Parameters</title>
+
+<variablelist>
+ <varlistentry><term>height="<replaceable>n</replaceable>"</term>
+ <listitem>
+
+<para>The amount of height needed (including units)</para>
+
+ </listitem>
+ </varlistentry>
+ <varlistentry><term>space-before="<replaceable>n</replaceable>"</term>
+ <listitem>
+
+<para>The amount of extra vertical space to add (including units)</para>
+
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ </refsect1><refsect1 role="tcg"><title>Related Information in <link xlink:href="http://www.sagehill.net/docbookxsl/">DocBook XSL: The Complete Guide</link></title>
+
+<para><link role="tcg" xlink:href="PageBreaking.html#SoftPageBreaks">Soft page breaks</link></para>
+
+ </refsect1></refentry>
+
+<refentry id="dbfo_row-height" xml:base="../fo/pi.xml">
+<refnamediv>
+<refname>dbfo_row-height</refname>
+<refpurpose>Specifies the height for a CALS table row</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+
+ <synopsis><tag class="xmlpi">dbfo row-height="<replaceable>height</replaceable>"</tag></synopsis>
+
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>Use the <tag class="xmlpi">dbfo row-height</tag> PI as a child of a
+ <tag>row</tag> to specify the height of the row.</para>
+
+ </refsect1><refsect1><title>Parameters</title>
+
+<variablelist>
+ <varlistentry><term>row-height="<replaceable>height</replaceable>"</term>
+ <listitem>
+
+<para>Specifies the row height (including units)</para>
+
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ </refsect1><refsect1 role="tcg"><title>Related Information in <link xlink:href="http://www.sagehill.net/docbookxsl/">DocBook XSL: The Complete Guide</link></title>
+
+<para><link role="tcg" xlink:href="RowHeight.html">Row height</link></para>
+
+ </refsect1></refentry>
+
+ </part>
+ <part id="pi-man">
+ <info xml:base="../manpages/pi.xml"><title>manpages Processing Instruction Reference</title>
+ <releaseinfo role="meta">
+ $Id: pi.xsl 7644 2008-01-16 11:04:07Z xmldoc $
+ </releaseinfo>
+ </info>
+ <partintro id="partintro" xml:base="../manpages/pi.xml">
+ <title>Introduction</title>
+
+<para>This is generated reference documentation for all
+ user-specifiable processing instructions (PIs) in the DocBook
+ XSL stylesheets for manpages output.
+ <note>
+
+<para>You add these PIs at particular points in a document to
+ cause specific &#8220;exceptions&#8221; to formatting/output behavior. To
+ make global changes in formatting/output behavior across an
+ entire document, it&#8217;s better to do it by setting an
+ appropriate stylesheet parameter (if there is one).</para>
+
+ </note>
+ </para>
+
+ </partintro>
+
+<refentry id="dbman_funcsynopsis-style" xml:base="../manpages/pi.xml">
+<refnamediv>
+<refname>dbman_funcsynopsis-style</refname>
+<refpurpose>Specifies presentation style for a funcsynopsis.</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+
+ <synopsis><tag class="xmlpi">dbman funcsynopsis-style="kr"|"ansi"</tag></synopsis>
+
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>Use the <tag class="xmlpi">dbman
+ funcsynopsis-style</tag> PI as a child of a
+ <tag>funcsynopsis</tag> or anywhere within a funcsynopsis
+ to control the presentation style for output of all
+ <tag>funcprototype</tag> instances within that funcsynopsis.</para>
+
+ </refsect1><refsect1><title>Parameters</title>
+
+<variablelist>
+ <varlistentry><term>funcsynopsis-style="kr"</term>
+ <listitem>
+
+<para>Displays the <tag>funcprototype</tag> in K&amp;R style</para>
+
+ </listitem>
+ </varlistentry>
+ <varlistentry><term>funcsynopsis-style="ansi"</term>
+ <listitem>
+
+<para>Displays the <tag>funcprototype</tag> in ANSI style</para>
+
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ </refsect1><refsect1 role="params"><title>Related Global Parameters</title>
+
+<para><parameter>man.funcsynopsis.style</parameter></para>
+
+ </refsect1></refentry>
+
+ </part>
+ <part id="pi-common">
+ <info xml:base="../common/pi.xml"><title>Common Processing Instruction Reference</title>
+ <releaseinfo role="meta">
+ $Id: pi.xsl 8782 2010-07-27 21:15:17Z mzjn $
+ </releaseinfo>
+ </info>
+ <partintro id="partintro" xml:base="../common/pi.xml">
+ <title>Introduction</title>
+
+<para>This is generated reference documentation for all
+ user-specifiable processing instructions (PIs) in the
+ &#8220;common&#8221; part of the DocBook XSL stylesheets.
+ <note>
+
+<para>You add these PIs at particular points in a document to
+ cause specific &#8220;exceptions&#8221; to formatting/output behavior. To
+ make global changes in formatting/output behavior across an
+ entire document, it&#8217;s better to do it by setting an
+ appropriate stylesheet parameter (if there is one).</para>
+
+ </note>
+ </para>
+
+ </partintro>
+
+<refentry id="dbchoice_choice" xml:base="../common/pi.xml">
+<refnamediv>
+<refname>dbchoice_choice</refname>
+<refpurpose>Generates a localized choice separator</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+
+ <synopsis><tag class="xmlpi">dbchoice choice="and"|"or"|<replaceable>string</replaceable>"</tag></synopsis>
+
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>Use the <tag class="xmlpi">dbchoice choice</tag> PI to
+ generate an appropriate localized &#8220;choice&#8221; separator (for
+ example, <literal>and</literal> or <literal>or</literal>)
+ before the final item in an inline <tag>simplelist</tag></para>
+
+ <warning>
+
+<para>This PI is a less-than-ideal hack; support for it may
+ disappear in the future (particularly if and when a more
+ appropriate means for marking up "choice" lists becomes
+ available in DocBook).</para>
+
+ </warning>
+ </refsect1><refsect1><title>Parameters</title>
+
+<variablelist>
+ <varlistentry><term>choice="and"</term>
+ <listitem>
+
+<para>generates a localized <literal>and</literal> separator</para>
+
+ </listitem>
+ </varlistentry>
+ <varlistentry><term>choice="or"</term>
+ <listitem>
+
+<para>generates a localized <literal>or</literal> separator</para>
+
+ </listitem>
+ </varlistentry>
+ <varlistentry><term>choice="<replaceable>string</replaceable>"</term>
+ <listitem>
+
+<para>generates a literal <replaceable>string</replaceable> separator</para>
+
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ </refsect1></refentry>
+
+<refentry id="dbtimestamp" xml:base="../common/pi.xml">
+<refnamediv>
+<refname>dbtimestamp</refname>
+<refpurpose>Inserts a date timestamp</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+
+ <synopsis><tag class="xmlpi">dbtimestamp format="<replaceable>formatstring</replaceable>" [padding="0"|"1"]</tag></synopsis>
+
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>Use the <tag class="xmlpi">dbtimestamp</tag> PI at any point in a
+ source document to cause a date timestamp (a formatted
+ string representing the current date and time) to be
+ inserted in output of the document.</para>
+
+ </refsect1><refsect1><title>Parameters</title>
+
+<variablelist>
+ <varlistentry><term>format="<replaceable>formatstring</replaceable>"</term>
+ <listitem>
+
+<para>Specifies format in which the date and time are
+ output</para>
+
+ <note>
+
+<para>For details of the content of the format string,
+ see <link role="tcg" xlink:href="Datetime.html">Date and time</link>.</para>
+
+ </note>
+ </listitem>
+ </varlistentry>
+ <varlistentry><term>padding="0"|"1"</term>
+ <listitem>
+
+<para>Specifies padding behavior; if non-zero, padding is is added</para>
+
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ </refsect1></refentry>
+
+<refentry id="dbtex_delims" xml:base="../common/pi.xml">
+<refnamediv>
+<refname>dbtex_delims</refname>
+<refpurpose>Generates delimiters around embedded TeX equations
+ in output</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+
+ <synopsis><tag class="xmlpi">dbtex delims="no"|"yes"</tag></synopsis>
+
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>Use the <tag class="xmlpi">dbtex delims</tag> PI as a
+ child of a <tag>textobject</tag> containing embedded TeX
+ markup, to cause that markup to be surrounded by
+ <literal>$</literal> delimiter characters in output.</para>
+
+ <warning>
+
+<para>This feature is useful for print/PDF output only if you
+ use the obsolete and now unsupported PassiveTeX XSL-FO
+ engine.</para>
+
+ </warning>
+ </refsect1><refsect1><title>Parameters</title>
+
+<variablelist>
+ <varlistentry><term>dbtex delims="no"|"yes"</term>
+ <listitem>
+
+<para>Specifies whether delimiters are output</para>
+
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ </refsect1><refsect1 role="params"><title>Related Global Parameters</title>
+
+<para><parameter>tex.math.delims</parameter></para>
+
+ </refsect1></refentry>
+
+ </part>
+ </book>
+ <book id="developer"><title>DocBook XSL Stylesheets Developer&#160;Reference</title>
+ <info>
+ <abstract>
+ <para>This is technical reference documentation for
+ developers using the DocBook XSL Stylesheets. It is not
+ intended to be user documentation, but is instead
+ provided for developers writing customization layers for
+ the stylesheets.</para>
+ </abstract>
+ </info>
+ <part id="lib">
+ <?dbhtml dir="lib"?>
+ <?dbhtml filename="index.html"?>
+ <title xml:base="../lib/lib.xml">XSL Library Template Reference</title>
+ <partintro id="libintro">
+ <title xml:base="../lib/lib.xml">Introduction</title>
+ <para xml:base="../lib/lib.xml">This is technical reference documentation for the
+ vocabulary-independent &#8220;library&#8221; templates in the DocBook XSL
+ Stylesheets.</para>
+ <para xml:base="../lib/lib.xml">This is not intended to be user documentation. It is
+ provided for developers writing customization layers for the
+ stylesheets.</para>
+
+ </partintro>
+ <reference id="generallibrary" xml:base="../lib/lib.xml">
+ <title>General Library Templates</title>
+
+<refentry id="dot.count">
+<refnamediv>
+<refname>dot.count</refname>
+<refpurpose>Returns the number of <quote>.</quote> characters in a string</refpurpose>
+</refnamediv>
+
+<refsect1><title>Description</title>
+
+ <para>Given a string, the <function>dot.count</function>
+ template returns the number of dot/period characters in the
+ string. This template is useful, for example, when testing the
+ nesting level of nested inline markup (for nested emphasis,
+ quotations, etc.).</para>
+
+<programlisting id="dot.count.frag">
+&lt;xsl:template name="dot.count"&gt;
+ &lt;!-- Returns the number of "." characters in a string --&gt;
+ &lt;xsl:param name="string"&gt;&lt;/xsl:param&gt;
+ &lt;xsl:param name="count" select="0"&gt;&lt;/xsl:param&gt;
+ &lt;xsl:choose&gt;
+ &lt;xsl:when test="contains($string, '.')"&gt;
+ &lt;xsl:call-template name="dot.count"&gt;
+ &lt;xsl:with-param name="string" select="substring-after($string, '.')"&gt;&lt;/xsl:with-param&gt;
+ &lt;xsl:with-param name="count" select="$count+1"&gt;&lt;/xsl:with-param&gt;
+ &lt;/xsl:call-template&gt;
+ &lt;/xsl:when&gt;
+ &lt;xsl:otherwise&gt;
+ &lt;xsl:value-of select="$count"&gt;&lt;/xsl:value-of&gt;
+ &lt;/xsl:otherwise&gt;
+ &lt;/xsl:choose&gt;
+&lt;/xsl:template&gt;
+</programlisting>
+
+</refsect1>
+</refentry>
+
+
+
+<refentry id="copy-string">
+<refnamediv>
+<refname>copy-string</refname>
+<refpurpose>Returns <quote>count</quote> copies of a string</refpurpose>
+</refnamediv>
+
+<refsect1><title>Description</title>
+
+ <para>Given a string, the <function>copy-string</function>
+ template creates <replaceable>n</replaceable> copies of the
+ string, when the value of <replaceable>n</replaceable> is
+ given by the <parameter>count</parameter> parameter.</para>
+
+<programlisting id="copy-string.frag">
+&lt;xsl:template name="copy-string"&gt;
+ &lt;!-- returns 'count' copies of 'string' --&gt;
+ &lt;xsl:param name="string"&gt;&lt;/xsl:param&gt;
+ &lt;xsl:param name="count" select="0"&gt;&lt;/xsl:param&gt;
+ &lt;xsl:param name="result"&gt;&lt;/xsl:param&gt;
+
+ &lt;xsl:choose&gt;
+ &lt;xsl:when test="$count&gt;0"&gt;
+ &lt;xsl:call-template name="copy-string"&gt;
+ &lt;xsl:with-param name="string" select="$string"&gt;&lt;/xsl:with-param&gt;
+ &lt;xsl:with-param name="count" select="$count - 1"&gt;&lt;/xsl:with-param&gt;
+ &lt;xsl:with-param name="result"&gt;
+ &lt;xsl:value-of select="$result"&gt;&lt;/xsl:value-of&gt;
+ &lt;xsl:value-of select="$string"&gt;&lt;/xsl:value-of&gt;
+ &lt;/xsl:with-param&gt;
+ &lt;/xsl:call-template&gt;
+ &lt;/xsl:when&gt;
+ &lt;xsl:otherwise&gt;
+ &lt;xsl:value-of select="$result"&gt;&lt;/xsl:value-of&gt;
+ &lt;/xsl:otherwise&gt;
+ &lt;/xsl:choose&gt;
+&lt;/xsl:template&gt;
+</programlisting>
+
+</refsect1>
+</refentry>
+
+
+
+<refentry id="string.subst">
+<refnamediv>
+<refname>string.subst</refname>
+<refpurpose>Substitute one text string for another in a string</refpurpose>
+</refnamediv>
+
+<refsect1><title>Description</title>
+
+<para>The <function>string.subst</function> template replaces all
+occurances of <parameter>target</parameter> in <parameter>string</parameter>
+with <parameter>replacement</parameter> and returns the result.
+</para>
+
+<programlisting id="string.subst.frag">
+&lt;xsl:template name="string.subst"&gt;
+ &lt;xsl:param name="string"&gt;&lt;/xsl:param&gt;
+ &lt;xsl:param name="target"&gt;&lt;/xsl:param&gt;
+ &lt;xsl:param name="replacement"&gt;&lt;/xsl:param&gt;
+
+ &lt;xsl:choose&gt;
+ &lt;xsl:when test="contains($string, $target)"&gt;
+ &lt;xsl:variable name="rest"&gt;
+ &lt;xsl:call-template name="string.subst"&gt;
+ &lt;xsl:with-param name="string" select="substring-after($string, $target)"&gt;&lt;/xsl:with-param&gt;
+ &lt;xsl:with-param name="target" select="$target"&gt;&lt;/xsl:with-param&gt;
+ &lt;xsl:with-param name="replacement" select="$replacement"&gt;&lt;/xsl:with-param&gt;
+ &lt;/xsl:call-template&gt;
+ &lt;/xsl:variable&gt;
+ &lt;xsl:value-of select="concat(substring-before($string, $target), $replacement, $rest)"&gt;&lt;/xsl:value-of&gt;
+ &lt;/xsl:when&gt;
+ &lt;xsl:otherwise&gt;
+ &lt;xsl:value-of select="$string"&gt;&lt;/xsl:value-of&gt;
+ &lt;/xsl:otherwise&gt;
+ &lt;/xsl:choose&gt;
+&lt;/xsl:template&gt;
+</programlisting>
+
+</refsect1>
+</refentry>
+
+
+
+<refentry id="xpointer.idref">
+<refnamediv>
+<refname>xpointer.idref</refname>
+<refpurpose>Extract IDREF from an XPointer</refpurpose>
+</refnamediv>
+
+<refsect1><title>Description</title>
+
+<para>The <function>xpointer.idref</function> template returns the
+ID portion of an XPointer which is a pointer to an ID within the current
+document, or the empty string if it is not.</para>
+<para>In other words, <function>xpointer.idref</function> returns
+<quote>foo</quote> when passed either <literal>#foo</literal>
+or <literal>#xpointer(id('foo'))</literal>, otherwise it returns
+the empty string.</para>
+
+<programlisting id="xpointer.idref.frag">
+&lt;xsl:template name="xpointer.idref"&gt;
+ &lt;xsl:param name="xpointer"&gt;http://...&lt;/xsl:param&gt;
+ &lt;xsl:choose&gt;
+ &lt;xsl:when test="starts-with($xpointer, '#xpointer(id(')"&gt;
+ &lt;xsl:variable name="rest" select="substring-after($xpointer, '#xpointer(id(')"&gt;&lt;/xsl:variable&gt;
+ &lt;xsl:variable name="quote" select="substring($rest, 1, 1)"&gt;&lt;/xsl:variable&gt;
+ &lt;xsl:value-of select="substring-before(substring-after($xpointer, $quote), $quote)"&gt;&lt;/xsl:value-of&gt;
+ &lt;/xsl:when&gt;
+ &lt;xsl:when test="starts-with($xpointer, '#')"&gt;
+ &lt;xsl:value-of select="substring-after($xpointer, '#')"&gt;&lt;/xsl:value-of&gt;
+ &lt;/xsl:when&gt;
+ &lt;!-- otherwise it's a pointer to some other document --&gt;
+ &lt;/xsl:choose&gt;
+&lt;/xsl:template&gt;
+</programlisting>
+
+</refsect1>
+</refentry>
+
+
+
+
+<refentry id="length-magnitude">
+<refnamediv>
+<refname>length-magnitude</refname>
+<refpurpose>Return the unqualified dimension from a length specification</refpurpose>
+</refnamediv>
+
+<refsect1><title>Description</title>
+
+<para>The <function>length-magnitude</function> template returns the
+unqualified length ("20" for "20pt") from a dimension.
+</para>
+
+<programlisting id="length-magnitude.frag">
+&lt;xsl:template name="length-magnitude"&gt;
+ &lt;xsl:param name="length" select="'0pt'"&gt;&lt;/xsl:param&gt;
+
+ &lt;xsl:choose&gt;
+ &lt;xsl:when test="string-length($length) = 0"&gt;&lt;/xsl:when&gt;
+ &lt;xsl:when test="substring($length,1,1) = '0' or substring($length,1,1) = '1' or substring($length,1,1) = '2' or substring($length,1,1) = '3' or substring($length,1,1) = '4' or substring($length,1,1) = '5' or substring($length,1,1) = '6' or substring($length,1,1) = '7' or substring($length,1,1) = '8' or substring($length,1,1) = '9' or substring($length,1,1) = '.'"&gt;
+ &lt;xsl:value-of select="substring($length,1,1)"&gt;&lt;/xsl:value-of&gt;
+ &lt;xsl:call-template name="length-magnitude"&gt;
+ &lt;xsl:with-param name="length" select="substring($length,2)"&gt;&lt;/xsl:with-param&gt;
+ &lt;/xsl:call-template&gt;
+ &lt;/xsl:when&gt;
+ &lt;/xsl:choose&gt;
+&lt;/xsl:template&gt;
+</programlisting>
+
+</refsect1>
+</refentry>
+
+
+
+<refentry id="length-units">
+<refnamediv>
+<refname>length-units</refname>
+<refpurpose>Return the units from a length specification</refpurpose>
+</refnamediv>
+
+<refsect1><title>Description</title>
+
+<para>The <function>length-units</function> template returns the
+units ("pt" for "20pt") from a length. If no units are supplied on the
+length, the <parameter>defauilt.units</parameter> are returned.</para>
+
+<programlisting id="length-units.frag">
+&lt;xsl:template name="length-units"&gt;
+ &lt;xsl:param name="length" select="'0pt'"&gt;&lt;/xsl:param&gt;
+ &lt;xsl:param name="default.units" select="'px'"&gt;&lt;/xsl:param&gt;
+ &lt;xsl:variable name="magnitude"&gt;
+ &lt;xsl:call-template name="length-magnitude"&gt;
+ &lt;xsl:with-param name="length" select="$length"&gt;&lt;/xsl:with-param&gt;
+ &lt;/xsl:call-template&gt;
+ &lt;/xsl:variable&gt;
+
+ &lt;xsl:variable name="units"&gt;
+ &lt;xsl:value-of select="substring($length, string-length($magnitude)+1)"&gt;&lt;/xsl:value-of&gt;
+ &lt;/xsl:variable&gt;
+
+ &lt;xsl:choose&gt;
+ &lt;xsl:when test="$units = ''"&gt;
+ &lt;xsl:value-of select="$default.units"&gt;&lt;/xsl:value-of&gt;
+ &lt;/xsl:when&gt;
+ &lt;xsl:otherwise&gt;
+ &lt;xsl:value-of select="$units"&gt;&lt;/xsl:value-of&gt;
+ &lt;/xsl:otherwise&gt;
+ &lt;/xsl:choose&gt;
+&lt;/xsl:template&gt;
+</programlisting>
+
+</refsect1>
+</refentry>
+
+
+
+<refentry id="length-spec">
+<refnamediv>
+<refname>length-spec</refname>
+<refpurpose>Return a fully qualified length specification</refpurpose>
+</refnamediv>
+
+<refsect1><title>Description</title>
+
+<para>The <function>length-spec</function> template returns the
+qualified length from a dimension. If an unqualified length is given,
+the <parameter>default.units</parameter> will be added to it.
+</para>
+
+<programlisting id="length-spec.frag">
+&lt;xsl:template name="length-spec"&gt;
+ &lt;xsl:param name="length" select="'0pt'"&gt;&lt;/xsl:param&gt;
+ &lt;xsl:param name="default.units" select="'px'"&gt;&lt;/xsl:param&gt;
+
+ &lt;xsl:variable name="magnitude"&gt;
+ &lt;xsl:call-template name="length-magnitude"&gt;
+ &lt;xsl:with-param name="length" select="$length"&gt;&lt;/xsl:with-param&gt;
+ &lt;/xsl:call-template&gt;
+ &lt;/xsl:variable&gt;
+
+ &lt;xsl:variable name="units"&gt;
+ &lt;xsl:value-of select="substring($length, string-length($magnitude)+1)"&gt;&lt;/xsl:value-of&gt;
+ &lt;/xsl:variable&gt;
+
+ &lt;xsl:value-of select="$magnitude"&gt;&lt;/xsl:value-of&gt;
+ &lt;xsl:choose&gt;
+ &lt;xsl:when test="$units='cm' or $units='mm' or $units='in' or $units='pt' or $units='pc' or $units='px' or $units='em'"&gt;
+ &lt;xsl:value-of select="$units"&gt;&lt;/xsl:value-of&gt;
+ &lt;/xsl:when&gt;
+ &lt;xsl:when test="$units = ''"&gt;
+ &lt;xsl:value-of select="$default.units"&gt;&lt;/xsl:value-of&gt;
+ &lt;/xsl:when&gt;
+ &lt;xsl:otherwise&gt;
+ &lt;xsl:message&gt;
+ &lt;xsl:text&gt;Unrecognized unit of measure: &lt;/xsl:text&gt;
+ &lt;xsl:value-of select="$units"&gt;&lt;/xsl:value-of&gt;
+ &lt;xsl:text&gt;.&lt;/xsl:text&gt;
+ &lt;/xsl:message&gt;
+ &lt;/xsl:otherwise&gt;
+ &lt;/xsl:choose&gt;
+&lt;/xsl:template&gt;
+</programlisting>
+
+</refsect1>
+</refentry>
+
+
+
+<refentry id="length-in-points">
+<refnamediv>
+<refname>length-in-points</refname>
+<refpurpose>Returns the size, in points, of a specified length</refpurpose>
+</refnamediv>
+
+<refsect1><title>Description</title>
+
+<para>The <function>length-in-points</function> template converts a length
+specification to points and returns that value as an unqualified
+number.
+</para>
+
+<caution>
+<para>There is no way for the template to infer the size of an
+<literal>em</literal>. It relies on the default <parameter>em.size</parameter>
+which is initially <literal>10</literal> (for 10pt).</para>
+
+<para>Similarly, converting pixels to points relies on the
+<parameter>pixels.per.inch</parameter> parameter which is initially
+<literal>90</literal>.
+</para>
+</caution>
+
+<programlisting id="length-in-points.frag">
+&lt;xsl:template name="length-in-points"&gt;
+ &lt;xsl:param name="length" select="'0pt'"&gt;&lt;/xsl:param&gt;
+ &lt;xsl:param name="em.size" select="10"&gt;&lt;/xsl:param&gt;
+ &lt;xsl:param name="pixels.per.inch" select="90"&gt;&lt;/xsl:param&gt;
+
+ &lt;xsl:variable name="magnitude"&gt;
+ &lt;xsl:call-template name="length-magnitude"&gt;
+ &lt;xsl:with-param name="length" select="$length"&gt;&lt;/xsl:with-param&gt;
+ &lt;/xsl:call-template&gt;
+ &lt;/xsl:variable&gt;
+
+ &lt;xsl:variable name="units"&gt;
+ &lt;xsl:value-of select="substring($length, string-length($magnitude)+1)"&gt;&lt;/xsl:value-of&gt;
+ &lt;/xsl:variable&gt;
+
+ &lt;xsl:choose&gt;
+ &lt;xsl:when test="$units = 'pt'"&gt;
+ &lt;xsl:value-of select="$magnitude"&gt;&lt;/xsl:value-of&gt;
+ &lt;/xsl:when&gt;
+ &lt;xsl:when test="$units = 'cm'"&gt;
+ &lt;xsl:value-of select="$magnitude div 2.54 * 72.0"&gt;&lt;/xsl:value-of&gt;
+ &lt;/xsl:when&gt;
+ &lt;xsl:when test="$units = 'mm'"&gt;
+ &lt;xsl:value-of select="$magnitude div 25.4 * 72.0"&gt;&lt;/xsl:value-of&gt;
+ &lt;/xsl:when&gt;
+ &lt;xsl:when test="$units = 'in'"&gt;
+ &lt;xsl:value-of select="$magnitude * 72.0"&gt;&lt;/xsl:value-of&gt;
+ &lt;/xsl:when&gt;
+ &lt;xsl:when test="$units = 'pc'"&gt;
+ &lt;xsl:value-of select="$magnitude * 12.0"&gt;&lt;/xsl:value-of&gt;
+ &lt;/xsl:when&gt;
+ &lt;xsl:when test="$units = 'px'"&gt;
+ &lt;xsl:value-of select="$magnitude div $pixels.per.inch * 72.0"&gt;&lt;/xsl:value-of&gt;
+ &lt;/xsl:when&gt;
+ &lt;xsl:when test="$units = 'em'"&gt;
+ &lt;xsl:value-of select="$magnitude * $em.size"&gt;&lt;/xsl:value-of&gt;
+ &lt;/xsl:when&gt;
+ &lt;xsl:otherwise&gt;
+ &lt;xsl:message&gt;
+ &lt;xsl:text&gt;Unrecognized unit of measure: &lt;/xsl:text&gt;
+ &lt;xsl:value-of select="$units"&gt;&lt;/xsl:value-of&gt;
+ &lt;xsl:text&gt;.&lt;/xsl:text&gt;
+ &lt;/xsl:message&gt;
+ &lt;/xsl:otherwise&gt;
+ &lt;/xsl:choose&gt;
+&lt;/xsl:template&gt;
+</programlisting>
+
+</refsect1>
+</refentry>
+
+
+
+<refentry id="pi-attribute">
+<refnamediv>
+<refname>pi-attribute</refname>
+<refpurpose>Extract a pseudo-attribute from a PI</refpurpose>
+</refnamediv>
+
+<refsect1><title>Description</title>
+
+<para>The <function>pi-attribute</function> template extracts a pseudo-attribute
+from a processing instruction. For example, given the PI
+<quote><literal>&lt;?foo bar="1" baz='red'?&gt;</literal></quote>,</para>
+<programlisting>&lt;xsl:call-template name="pi-attribute"&gt;
+ &lt;xsl:with-param name="pis" select="processing-instruction('foo')"/&gt;
+ &lt;xsl:with-param name="attribute" select="'baz'"/&gt;
+&lt;/xsl:call-template&gt;</programlisting>
+<para>will return <quote>red</quote>. This template returns the first matching
+attribute that it finds. Presented with processing instructions that
+contain badly formed pseudo-attributes (missing or unbalanced quotes,
+for example), the template may silently return erroneous results.</para>
+
+<programlisting id="pi-attribute.frag">
+&lt;xsl:template name="pi-attribute"&gt;
+ &lt;xsl:param name="pis" select="processing-instruction('BOGUS_PI')"&gt;&lt;/xsl:param&gt;
+ &lt;xsl:param name="attribute"&gt;filename&lt;/xsl:param&gt;
+ &lt;xsl:param name="count"&gt;1&lt;/xsl:param&gt;
+
+ &lt;xsl:choose&gt;
+ &lt;xsl:when test="$count&gt;count($pis)"&gt;
+ &lt;!-- not found --&gt;
+ &lt;/xsl:when&gt;
+ &lt;xsl:otherwise&gt;
+ &lt;xsl:variable name="pi"&gt;
+ &lt;xsl:value-of select="$pis[$count]"&gt;&lt;/xsl:value-of&gt;
+ &lt;/xsl:variable&gt;
+ &lt;xsl:variable name="pivalue"&gt;
+ &lt;xsl:value-of select="concat(' ', normalize-space($pi))"&gt;&lt;/xsl:value-of&gt;
+ &lt;/xsl:variable&gt;
+ &lt;xsl:choose&gt;
+ &lt;xsl:when test="contains($pivalue,concat(' ', $attribute, '='))"&gt;
+ &lt;xsl:variable name="rest" select="substring-after($pivalue,concat(' ', $attribute,'='))"&gt;&lt;/xsl:variable&gt;
+ &lt;xsl:variable name="quote" select="substring($rest,1,1)"&gt;&lt;/xsl:variable&gt;
+ &lt;xsl:value-of select="substring-before(substring($rest,2),$quote)"&gt;&lt;/xsl:value-of&gt;
+ &lt;/xsl:when&gt;
+ &lt;xsl:otherwise&gt;
+ &lt;xsl:call-template name="pi-attribute"&gt;
+ &lt;xsl:with-param name="pis" select="$pis"&gt;&lt;/xsl:with-param&gt;
+ &lt;xsl:with-param name="attribute" select="$attribute"&gt;&lt;/xsl:with-param&gt;
+ &lt;xsl:with-param name="count" select="$count + 1"&gt;&lt;/xsl:with-param&gt;
+ &lt;/xsl:call-template&gt;
+ &lt;/xsl:otherwise&gt;
+ &lt;/xsl:choose&gt;
+ &lt;/xsl:otherwise&gt;
+ &lt;/xsl:choose&gt;
+&lt;/xsl:template&gt;
+</programlisting>
+
+</refsect1>
+</refentry>
+
+
+
+<refentry id="lookup.key">
+<refnamediv>
+<refname>lookup.key</refname>
+<refpurpose>Retrieve the value associated with a particular key in a table</refpurpose>
+</refnamediv>
+
+<refsect1><title>Description</title>
+
+<para>Given a table of space-delimited key/value pairs,
+the <function>lookup.key</function> template extracts the value associated
+with a particular key.</para>
+
+<programlisting id="lookup.key.frag">
+&lt;xsl:template name="lookup.key"&gt;
+ &lt;xsl:param name="key" select="''"&gt;&lt;/xsl:param&gt;
+ &lt;xsl:param name="table" select="''"&gt;&lt;/xsl:param&gt;
+
+ &lt;xsl:if test="contains($table, ' ')"&gt;
+ &lt;xsl:choose&gt;
+ &lt;xsl:when test="substring-before($table, ' ') = $key"&gt;
+ &lt;xsl:variable name="rest" select="substring-after($table, ' ')"&gt;&lt;/xsl:variable&gt;
+ &lt;xsl:choose&gt;
+ &lt;xsl:when test="contains($rest, ' ')"&gt;
+ &lt;xsl:value-of select="substring-before($rest, ' ')"&gt;&lt;/xsl:value-of&gt;
+ &lt;/xsl:when&gt;
+ &lt;xsl:otherwise&gt;
+ &lt;xsl:value-of select="$rest"&gt;&lt;/xsl:value-of&gt;
+ &lt;/xsl:otherwise&gt;
+ &lt;/xsl:choose&gt;
+ &lt;/xsl:when&gt;
+ &lt;xsl:otherwise&gt;
+ &lt;xsl:call-template name="lookup.key"&gt;
+ &lt;xsl:with-param name="key" select="$key"&gt;&lt;/xsl:with-param&gt;
+ &lt;xsl:with-param name="table" select="substring-after(substring-after($table,' '), ' ')"&gt;&lt;/xsl:with-param&gt;
+ &lt;/xsl:call-template&gt;
+ &lt;/xsl:otherwise&gt;
+ &lt;/xsl:choose&gt;
+ &lt;/xsl:if&gt;
+&lt;/xsl:template&gt;
+</programlisting>
+
+</refsect1>
+</refentry>
+
+
+
+<refentry id="xpath.location">
+<refnamediv>
+<refname>xpath.location</refname>
+<refpurpose>Calculate the XPath child-sequence to the current node</refpurpose>
+</refnamediv>
+
+<refsect1><title>Description</title>
+
+<para>The <function>xpath.location</function> template calculates the
+absolute path from the root of the tree to the current element node.
+</para>
+
+<programlisting id="xpath.location.frag">
+&lt;xsl:template name="xpath.location"&gt;
+ &lt;xsl:param name="node" select="."&gt;&lt;/xsl:param&gt;
+ &lt;xsl:param name="path" select="''"&gt;&lt;/xsl:param&gt;
+
+ &lt;xsl:variable name="next.path"&gt;
+ &lt;xsl:value-of select="local-name($node)"&gt;&lt;/xsl:value-of&gt;
+ &lt;xsl:if test="$path != ''"&gt;/&lt;/xsl:if&gt;
+ &lt;xsl:value-of select="$path"&gt;&lt;/xsl:value-of&gt;
+ &lt;/xsl:variable&gt;
+
+ &lt;xsl:choose&gt;
+ &lt;xsl:when test="$node/parent::*"&gt;
+ &lt;xsl:call-template name="xpath.location"&gt;
+ &lt;xsl:with-param name="node" select="$node/parent::*"&gt;&lt;/xsl:with-param&gt;
+ &lt;xsl:with-param name="path" select="$next.path"&gt;&lt;/xsl:with-param&gt;
+ &lt;/xsl:call-template&gt;
+ &lt;/xsl:when&gt;
+ &lt;xsl:otherwise&gt;
+ &lt;xsl:text&gt;/&lt;/xsl:text&gt;
+ &lt;xsl:value-of select="$next.path"&gt;&lt;/xsl:value-of&gt;
+ &lt;/xsl:otherwise&gt;
+ &lt;/xsl:choose&gt;
+&lt;/xsl:template&gt;
+</programlisting>
+
+</refsect1>
+</refentry>
+
+
+
+<refentry id="comment-escape-string">
+<refnamediv>
+<refname>comment-escape-string</refname>
+<refpurpose>Prepare a string for inclusion in an XML comment</refpurpose>
+</refnamediv>
+
+<refsect1><title>Description</title>
+
+<para>The <function>comment-escape-string</function> template returns a string
+that has been transformed so that it can safely be output as an XML comment.
+Internal occurrences of "--" will be replaced with "- -" and a leading and/or
+trailing space will be added to the string, if necessary.</para>
+
+<programlisting id="comment-escape-string.frag">
+&lt;xsl:template name="comment-escape-string"&gt;
+ &lt;xsl:param name="string" select="''"&gt;&lt;/xsl:param&gt;
+
+ &lt;xsl:if test="starts-with($string, '-')"&gt;
+ &lt;xsl:text&gt; &lt;/xsl:text&gt;
+ &lt;/xsl:if&gt;
+
+ &lt;xsl:call-template name="comment-escape-string.recursive"&gt;
+ &lt;xsl:with-param name="string" select="$string"&gt;&lt;/xsl:with-param&gt;
+ &lt;/xsl:call-template&gt;
+
+ &lt;xsl:if test="substring($string, string-length($string), 1) = '-'"&gt;
+ &lt;xsl:text&gt; &lt;/xsl:text&gt;
+ &lt;/xsl:if&gt;
+&lt;/xsl:template&gt;
+</programlisting>
+
+</refsect1>
+</refentry>
+
+
+
+<refentry id="comment-escape-string.recursive">
+<refnamediv>
+<refname>comment-escape-string.recursive</refname>
+<refpurpose>Internal function used by comment-escape-string</refpurpose>
+</refnamediv>
+
+<refsect1><title>Description</title>
+
+<para>The <function>comment-escape-string.recursive</function> template is used
+by <function>comment-escape-string</function>.</para>
+
+<programlisting id="comment-escape-string.recursive.frag">
+&lt;xsl:template name="comment-escape-string.recursive"&gt;
+ &lt;xsl:param name="string" select="''"&gt;&lt;/xsl:param&gt;
+ &lt;xsl:choose&gt;
+ &lt;xsl:when test="contains($string, '--')"&gt;
+ &lt;xsl:value-of select="substring-before($string, '--')"&gt;&lt;/xsl:value-of&gt;
+ &lt;xsl:value-of select="'- -'"&gt;&lt;/xsl:value-of&gt;
+ &lt;xsl:call-template name="comment-escape-string.recursive"&gt;
+ &lt;xsl:with-param name="string" select="substring-after($string, '--')"&gt;&lt;/xsl:with-param&gt;
+ &lt;/xsl:call-template&gt;
+ &lt;/xsl:when&gt;
+ &lt;xsl:otherwise&gt;
+ &lt;xsl:value-of select="$string"&gt;&lt;/xsl:value-of&gt;
+ &lt;/xsl:otherwise&gt;
+ &lt;/xsl:choose&gt;
+&lt;/xsl:template&gt;
+</programlisting>
+</refsect1>
+</refentry>
+
+
+
+<refentry id="trim.text">
+<refnamediv>
+<refname>trim.text</refname>
+<refpurpose>Trim leading and trailing whitespace from a text node</refpurpose>
+</refnamediv>
+
+<refsect1><title>Description</title>
+
+<para>Given a text node, this function trims leading and trailing
+whitespace from it and returns the trimmed contents.</para>
+
+<programlisting id="trim.text.frag">
+
+ &lt;xsl:template name="trim.text"&gt;
+ &lt;xsl:param name="contents" select="."&gt;&lt;/xsl:param&gt;
+ &lt;xsl:variable name="contents-left-trimmed"&gt;
+ &lt;xsl:call-template name="trim-left"&gt;
+ &lt;xsl:with-param name="contents" select="$contents"&gt;&lt;/xsl:with-param&gt;
+ &lt;/xsl:call-template&gt;
+ &lt;/xsl:variable&gt;
+ &lt;xsl:variable name="contents-trimmed"&gt;
+ &lt;xsl:call-template name="trim-right"&gt;
+ &lt;xsl:with-param name="contents" select="$contents-left-trimmed"&gt;&lt;/xsl:with-param&gt;
+ &lt;/xsl:call-template&gt;
+ &lt;/xsl:variable&gt;
+ &lt;xsl:value-of select="$contents-trimmed"&gt;&lt;/xsl:value-of&gt;
+ &lt;/xsl:template&gt;
+
+ &lt;xsl:template name="trim-left"&gt;
+ &lt;xsl:param name="contents"&gt;&lt;/xsl:param&gt;
+ &lt;xsl:choose&gt;
+ &lt;xsl:when test="starts-with($contents,'
+') or starts-with($contents,'&#xD;') or starts-with($contents,' ') or starts-with($contents,' ')"&gt;
+ &lt;xsl:call-template name="trim-left"&gt;
+ &lt;xsl:with-param name="contents" select="substring($contents, 2)"&gt;&lt;/xsl:with-param&gt;
+ &lt;/xsl:call-template&gt;
+ &lt;/xsl:when&gt;
+ &lt;xsl:otherwise&gt;
+ &lt;xsl:value-of select="$contents"&gt;&lt;/xsl:value-of&gt;
+ &lt;/xsl:otherwise&gt;
+ &lt;/xsl:choose&gt;
+ &lt;/xsl:template&gt;
+
+ &lt;xsl:template name="trim-right"&gt;
+ &lt;xsl:param name="contents"&gt;&lt;/xsl:param&gt;
+ &lt;xsl:variable name="last-char"&gt;
+ &lt;xsl:value-of select="substring($contents, string-length($contents), 1)"&gt;&lt;/xsl:value-of&gt;
+ &lt;/xsl:variable&gt;
+ &lt;xsl:choose&gt;
+ &lt;xsl:when test="($last-char = '
+') or ($last-char = '&#xD;') or ($last-char = ' ') or ($last-char = ' ')"&gt;
+ &lt;xsl:call-template name="trim-right"&gt;
+ &lt;xsl:with-param name="contents" select="substring($contents, 1, string-length($contents) - 1)"&gt;&lt;/xsl:with-param&gt;
+ &lt;/xsl:call-template&gt;
+ &lt;/xsl:when&gt;
+ &lt;xsl:otherwise&gt;
+ &lt;xsl:value-of select="$contents"&gt;&lt;/xsl:value-of&gt;
+ &lt;/xsl:otherwise&gt;
+ &lt;/xsl:choose&gt;
+ &lt;/xsl:template&gt;
+</programlisting>
+
+</refsect1>
+</refentry>
+
+
+
+<refentry id="str.tokenize.keep.delimiters">
+<refnamediv>
+<refname>str.tokenize.keep.delimiters</refname>
+<refpurpose>Tokenize a string while preserving any delimiters</refpurpose>
+</refnamediv>
+<refsect1><title>Description</title>
+<para>Based on the occurrence of one or more delimiter characters,
+this function breaks a string into a list of tokens and delimiters,
+marking up each of the tokens with a <tag>token</tag> element
+and preserving the delimiters as text nodes between the tokens.</para>
+<note>
+ <para>This function is a very slightly modified version of a
+ function from the <link xlink:href="http://www.exslt.org/">EXSLT
+ site</link>. The original is available at:
+
+<blockquote><para><link xlink:href="http://www.exslt.org/str/functions/tokenize/str.tokenize.template.xsl"/></para></blockquote>
+
+ The <function>str.tokenize.keep.delimiters</function> function
+ differs only in that it preserves the delimiters instead of
+ discarding them.</para>
+</note>
+<programlisting id="str.tokenize.keep.delimiters.frag">
+ &lt;xsl:template name="str.tokenize.keep.delimiters"&gt;
+ &lt;xsl:param name="string" select="''"&gt;&lt;/xsl:param&gt;
+ &lt;xsl:param name="delimiters" select="' '"&gt;&lt;/xsl:param&gt;
+ &lt;xsl:choose&gt;
+ &lt;xsl:when test="not($string)"&gt;&lt;/xsl:when&gt;
+ &lt;xsl:when test="not($delimiters)"&gt;
+ &lt;xsl:call-template name="str.tokenize.keep.delimiters-characters"&gt;
+ &lt;xsl:with-param name="string" select="$string"&gt;&lt;/xsl:with-param&gt;
+ &lt;/xsl:call-template&gt;
+ &lt;/xsl:when&gt;
+ &lt;xsl:otherwise&gt;
+ &lt;xsl:call-template name="str.tokenize.keep.delimiters-delimiters"&gt;
+ &lt;xsl:with-param name="string" select="$string"&gt;&lt;/xsl:with-param&gt;
+ &lt;xsl:with-param name="delimiters" select="$delimiters"&gt;&lt;/xsl:with-param&gt;
+ &lt;/xsl:call-template&gt;
+ &lt;/xsl:otherwise&gt;
+ &lt;/xsl:choose&gt;
+ &lt;/xsl:template&gt;
+ &lt;xsl:template name="str.tokenize.keep.delimiters-characters"&gt;
+ &lt;xsl:param name="string"&gt;&lt;/xsl:param&gt;
+ &lt;xsl:if test="$string"&gt;
+ &lt;ssb:token&gt;&lt;xsl:value-of select="substring($string, 1, 1)"&gt;&lt;/xsl:value-of&gt;&lt;/ssb:token&gt;
+ &lt;xsl:call-template name="str.tokenize.keep.delimiters-characters"&gt;
+ &lt;xsl:with-param name="string" select="substring($string, 2)"&gt;&lt;/xsl:with-param&gt;
+ &lt;/xsl:call-template&gt;
+ &lt;/xsl:if&gt;
+ &lt;/xsl:template&gt;
+ &lt;xsl:template name="str.tokenize.keep.delimiters-delimiters"&gt;
+ &lt;xsl:param name="string"&gt;&lt;/xsl:param&gt;
+ &lt;xsl:param name="delimiters"&gt;&lt;/xsl:param&gt;
+ &lt;xsl:variable name="delimiter" select="substring($delimiters, 1, 1)"&gt;&lt;/xsl:variable&gt;
+ &lt;xsl:choose&gt;
+ &lt;xsl:when test="not($delimiter)"&gt;
+ &lt;ssb:token&gt;&lt;xsl:value-of select="$string"&gt;&lt;/xsl:value-of&gt;&lt;/ssb:token&gt;
+ &lt;/xsl:when&gt;
+ &lt;xsl:when test="contains($string, $delimiter)"&gt;
+ &lt;xsl:if test="not(starts-with($string, $delimiter))"&gt;
+ &lt;xsl:call-template name="str.tokenize.keep.delimiters-delimiters"&gt;
+ &lt;xsl:with-param name="string" select="substring-before($string, $delimiter)"&gt;&lt;/xsl:with-param&gt;
+ &lt;xsl:with-param name="delimiters" select="substring($delimiters, 2)"&gt;&lt;/xsl:with-param&gt;
+ &lt;/xsl:call-template&gt;
+ &lt;/xsl:if&gt;
+ &lt;!-- output each delimiter --&gt;
+ &lt;xsl:value-of select="$delimiter"&gt;&lt;/xsl:value-of&gt;
+ &lt;xsl:call-template name="str.tokenize.keep.delimiters-delimiters"&gt;
+ &lt;xsl:with-param name="string" select="substring-after($string, $delimiter)"&gt;&lt;/xsl:with-param&gt;
+ &lt;xsl:with-param name="delimiters" select="$delimiters"&gt;&lt;/xsl:with-param&gt;
+ &lt;/xsl:call-template&gt;
+ &lt;/xsl:when&gt;
+ &lt;xsl:otherwise&gt;
+ &lt;xsl:call-template name="str.tokenize.keep.delimiters-delimiters"&gt;
+ &lt;xsl:with-param name="string" select="$string"&gt;&lt;/xsl:with-param&gt;
+ &lt;xsl:with-param name="delimiters" select="substring($delimiters, 2)"&gt;&lt;/xsl:with-param&gt;
+ &lt;/xsl:call-template&gt;
+ &lt;/xsl:otherwise&gt;
+ &lt;/xsl:choose&gt;
+ &lt;/xsl:template&gt;
+</programlisting>
+</refsect1>
+</refentry>
+
+
+
+<refentry id="apply-string-subst-map">
+ <refnamediv>
+ <refname>apply-string-subst-map</refname>
+ <refpurpose>Apply a string-substitution map</refpurpose>
+ </refnamediv>
+ <refsect1><title>Description</title>
+ <para>This function applies a &#8220;string substitution&#8221; map. Use it when
+ you want to do multiple string substitutions on the same target
+ content. It reads in two things: <parameter>content</parameter>, the
+ content on which to perform the substitution, and
+ <parameter>map.contents</parameter>, a node set of
+ elements (the names of the elements don't matter), with each element
+ having the following attributes:
+ <itemizedlist>
+ <listitem>
+ <simpara><tag class="attribute">oldstring</tag>, a string to
+ be replaced</simpara>
+ </listitem>
+ <listitem>
+ <simpara><tag class="attribute">newstring</tag>, a string with
+ which to replace <tag class="attribute">oldstring</tag></simpara>
+ </listitem>
+ </itemizedlist>
+ The function uses <parameter>map.contents</parameter> to
+ do substitution on <parameter>content</parameter>, and then
+ returns the modified contents.</para>
+ <note>
+ <para>This function is a very slightly modified version of Jeni
+ Tennison&#8217;s <function>replace_strings</function> function in the
+ <link xlink:href="http://www.dpawson.co.uk/xsl/sect2/StringReplace.html#d9351e13">multiple string replacements</link> section of Dave Pawson&#8217;s
+ <link xlink:href="http://www.dpawson.co.uk/xsl/index.html">XSLT
+ FAQ</link>.</para>
+ <para>The <function>apply-string-subst-map</function> function is
+ essentially the same function as the
+ <function>apply-character-map</function> function; the only
+ difference is that in the map that
+ <function>apply-string-subst-map</function> expects, <tag class="attribute">oldstring</tag> and <tag class="attribute">newstring</tag> attributes are used instead of
+ <tag class="attribute">character</tag> and <tag class="attribute">string</tag> attributes.</para>
+ </note>
+ <programlisting id="apply-string-subst-map.frag">
+ &lt;xsl:template name="apply-string-subst-map"&gt;
+ &lt;xsl:param name="content"&gt;&lt;/xsl:param&gt;
+ &lt;xsl:param name="map.contents"&gt;&lt;/xsl:param&gt;
+ &lt;xsl:variable name="replaced_text"&gt;
+ &lt;xsl:call-template name="string.subst"&gt;
+ &lt;xsl:with-param name="string" select="$content"&gt;&lt;/xsl:with-param&gt;
+ &lt;xsl:with-param name="target" select="$map.contents[1]/@oldstring"&gt;&lt;/xsl:with-param&gt;
+ &lt;xsl:with-param name="replacement" select="$map.contents[1]/@newstring"&gt;&lt;/xsl:with-param&gt;
+ &lt;/xsl:call-template&gt;
+ &lt;/xsl:variable&gt;
+ &lt;xsl:choose&gt;
+ &lt;xsl:when test="$map.contents[2]"&gt;
+ &lt;xsl:call-template name="apply-string-subst-map"&gt;
+ &lt;xsl:with-param name="content" select="$replaced_text"&gt;&lt;/xsl:with-param&gt;
+ &lt;xsl:with-param name="map.contents" select="$map.contents[position() &gt; 1]"&gt;&lt;/xsl:with-param&gt;
+ &lt;/xsl:call-template&gt;
+ &lt;/xsl:when&gt;
+ &lt;xsl:otherwise&gt;
+ &lt;xsl:value-of select="$replaced_text"&gt;&lt;/xsl:value-of&gt;
+ &lt;/xsl:otherwise&gt;
+ &lt;/xsl:choose&gt;
+ &lt;/xsl:template&gt;
+ </programlisting>
+ </refsect1>
+</refentry>
+</reference><reference id="relativeuri" xml:base="../lib/lib.xml">
+<title>Relative URI Functions</title>
+
+<partintro id="partintro"><title>Introduction</title>
+
+<para>These functions manipulate relative URI references.</para>
+
+<para>The following assumptions must hold true:</para>
+
+<orderedlist>
+<listitem>
+<para>All URIs are relative.</para>
+</listitem>
+<listitem>
+<para>No URI contains the <quote><literal>../</literal></quote> sequence
+which would effectively move <quote>up</quote> the hierarchy.</para>
+</listitem>
+</orderedlist>
+
+<para>If these assumptions do not hold, the results are unpredictable.</para>
+
+</partintro>
+
+
+
+<refentry id="count.uri.path.depth">
+<refnamediv>
+<refname>count.uri.path.depth</refname>
+<refpurpose>Count the number of path components in a relative URI</refpurpose>
+</refnamediv>
+
+<refsect1><title>Description</title>
+
+<para>This function counts the number of path components in a relative URI.</para>
+
+<programlisting id="count.uri.path.depth.frag">
+&lt;xsl:template name="count.uri.path.depth"&gt;
+ &lt;xsl:param name="filename" select="''"&gt;&lt;/xsl:param&gt;
+ &lt;xsl:param name="count" select="0"&gt;&lt;/xsl:param&gt;
+
+ &lt;xsl:choose&gt;
+ &lt;xsl:when test="contains($filename, '/')"&gt;
+ &lt;xsl:call-template name="count.uri.path.depth"&gt;
+ &lt;xsl:with-param name="filename" select="substring-after($filename, '/')"&gt;&lt;/xsl:with-param&gt;
+ &lt;xsl:with-param name="count" select="$count + 1"&gt;&lt;/xsl:with-param&gt;
+ &lt;/xsl:call-template&gt;
+ &lt;/xsl:when&gt;
+ &lt;xsl:otherwise&gt;
+ &lt;xsl:value-of select="$count"&gt;&lt;/xsl:value-of&gt;
+ &lt;/xsl:otherwise&gt;
+ &lt;/xsl:choose&gt;
+&lt;/xsl:template&gt;
+</programlisting>
+
+</refsect1>
+</refentry>
+
+
+
+<refentry id="trim.common.uri.paths">
+<refnamediv>
+<refname>trim.common.uri.paths</refname>
+<refpurpose>Trim common leading path components from a relative URI</refpurpose>
+</refnamediv>
+
+<refsect1><title>Description</title>
+
+<para>This function trims common leading path components from a relative URI.</para>
+
+<programlisting id="trim.common.uri.paths.frag">
+&lt;xsl:template name="trim.common.uri.paths"&gt;
+ &lt;xsl:param name="uriA" select="''"&gt;&lt;/xsl:param&gt;
+ &lt;xsl:param name="uriB" select="''"&gt;&lt;/xsl:param&gt;
+ &lt;xsl:param name="return" select="'A'"&gt;&lt;/xsl:param&gt;
+
+ &lt;xsl:choose&gt;
+ &lt;xsl:when test="contains($uriA, '/') and contains($uriB, '/') and substring-before($uriA, '/') = substring-before($uriB, '/')"&gt;
+ &lt;xsl:call-template name="trim.common.uri.paths"&gt;
+ &lt;xsl:with-param name="uriA" select="substring-after($uriA, '/')"&gt;&lt;/xsl:with-param&gt;
+ &lt;xsl:with-param name="uriB" select="substring-after($uriB, '/')"&gt;&lt;/xsl:with-param&gt;
+ &lt;xsl:with-param name="return" select="$return"&gt;&lt;/xsl:with-param&gt;
+ &lt;/xsl:call-template&gt;
+ &lt;/xsl:when&gt;
+ &lt;xsl:otherwise&gt;
+ &lt;xsl:choose&gt;
+ &lt;xsl:when test="$return = 'A'"&gt;
+ &lt;xsl:value-of select="$uriA"&gt;&lt;/xsl:value-of&gt;
+ &lt;/xsl:when&gt;
+ &lt;xsl:otherwise&gt;
+ &lt;xsl:value-of select="$uriB"&gt;&lt;/xsl:value-of&gt;
+ &lt;/xsl:otherwise&gt;
+ &lt;/xsl:choose&gt;
+ &lt;/xsl:otherwise&gt;
+ &lt;/xsl:choose&gt;
+&lt;/xsl:template&gt;
+</programlisting>
+
+</refsect1>
+</refentry>
+
+</reference>
+ </part>
+ <part id="common-part"><title>Common&#160;Template&#160;Reference</title>
+ <?dbhtml dir="common"?>
+ <?dbhtml filename="index.html"?>
+ <info>
+ <abstract>
+ <para>This is technical reference documentation for the
+ &#8220;base&#8221;, &#8220;refentry&#8221;, and &#8220;utility&#8221; sets of common
+ templates in the DocBook XSL Stylesheets. These
+ templates are &#8220;common&#8221; in that they are shared across
+ output formats (that is, they&#8217;re not
+ output-format-dependent)</para>
+ <para>This documentation is not intended to be user
+ documentation. It is provided for developers writing
+ customization layers for the stylesheets.</para>
+ </abstract>
+ </info>
+ <reference id="base" xml:base="../common/common.xml">
+ <info>
+ <title>Common &#187; Base Template Reference</title>
+ <releaseinfo role="meta">
+ $Id: common.xsl 8784 2010-07-28 12:32:54Z mzjn $
+ </releaseinfo>
+ </info>
+
+ <partintro id="partintro">
+ <title>Introduction</title>
+
+<para>This is technical reference documentation for the &#8220;base&#8221;
+ set of common templates in the DocBook XSL Stylesheets.</para>
+
+
+<para>This is not intended to be user documentation. It is
+ provided for developers writing customization layers for the
+ stylesheets.</para>
+
+ </partintro>
+
+<refentry id="template.is.component">
+<refnamediv>
+<refname>is.component</refname>
+<refpurpose>Tests if a given node is a component-level element</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+<synopsis>&lt;xsl:template name="is.component"&gt;
+&lt;xsl:param name="node" select="."/&gt;
+ ...
+&lt;/xsl:template&gt;</synopsis>
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>This template returns '1' if the specified node is a component
+(Chapter, Appendix, etc.), and '0' otherwise.</para>
+
+</refsect1><refsect1><title>Parameters</title>
+
+<variablelist>
+<varlistentry><term>node</term>
+<listitem>
+
+<para>The node which is to be tested.</para>
+
+</listitem>
+</varlistentry>
+</variablelist>
+
+</refsect1><refsect1><title>Returns</title>
+
+<para>This template returns '1' if the specified node is a component
+(Chapter, Appendix, etc.), and '0' otherwise.</para>
+
+</refsect1></refentry>
+
+<refentry id="template.is.section">
+<refnamediv>
+<refname>is.section</refname>
+<refpurpose>Tests if a given node is a section-level element</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+<synopsis>&lt;xsl:template name="is.section"&gt;
+&lt;xsl:param name="node" select="."/&gt;
+ ...
+&lt;/xsl:template&gt;</synopsis>
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>This template returns '1' if the specified node is a section
+(Section, Sect1, Sect2, etc.), and '0' otherwise.</para>
+
+</refsect1><refsect1><title>Parameters</title>
+
+<variablelist>
+<varlistentry><term>node</term>
+<listitem>
+
+<para>The node which is to be tested.</para>
+
+</listitem>
+</varlistentry>
+</variablelist>
+
+</refsect1><refsect1><title>Returns</title>
+
+<para>This template returns '1' if the specified node is a section
+(Section, Sect1, Sect2, etc.), and '0' otherwise.</para>
+
+</refsect1></refentry>
+
+<refentry id="template.section.level">
+<refnamediv>
+<refname>section.level</refname>
+<refpurpose>Returns the hierarchical level of a section</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+<synopsis>&lt;xsl:template name="section.level"&gt;
+&lt;xsl:param name="node" select="."/&gt;
+ ...
+&lt;/xsl:template&gt;</synopsis>
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>This template calculates the hierarchical level of a section.
+The element <tag>sect1</tag> is at level 1, <tag>sect2</tag> is
+at level 2, etc.</para>
+
+
+
+<para>Recursive sections are calculated down to the fifth level.</para>
+
+</refsect1><refsect1><title>Parameters</title>
+
+<variablelist>
+<varlistentry><term>node</term>
+<listitem>
+
+<para>The section node for which the level should be calculated.
+Defaults to the context node.</para>
+
+</listitem>
+</varlistentry>
+</variablelist>
+
+</refsect1><refsect1><title>Returns</title>
+
+<para>The section level, <quote>1</quote>, <quote>2</quote>, etc.
+</para>
+
+</refsect1></refentry>
+
+<refentry id="template.qanda.section.level">
+<refnamediv>
+<refname>qanda.section.level</refname>
+<refpurpose>Returns the hierarchical level of a QandASet</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+<synopsis>&lt;xsl:template name="qanda.section.level"/&gt;</synopsis>
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>This template calculates the hierarchical level of a QandASet.
+</para>
+
+</refsect1><refsect1><title>Returns</title>
+
+<para>The level, <quote>1</quote>, <quote>2</quote>, etc.
+</para>
+
+</refsect1></refentry>
+
+<refentry id="template.select.mediaobject">
+<refnamediv>
+<refname>select.mediaobject</refname>
+<refpurpose>Selects and processes an appropriate media object from a list</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+<synopsis>&lt;xsl:template name="select.mediaobject"&gt;
+&lt;xsl:param name="olist" select="imageobject|imageobjectco |videoobject|audioobject|textobject"/&gt;
+ ...
+&lt;/xsl:template&gt;</synopsis>
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>This template takes a list of media objects (usually the
+children of a mediaobject or inlinemediaobject) and processes
+the "right" object.</para>
+
+
+
+<para>This template relies on a template named
+"select.mediaobject.index" to determine which object
+in the list is appropriate.</para>
+
+
+
+<para>If no acceptable object is located, nothing happens.</para>
+
+</refsect1><refsect1><title>Parameters</title>
+
+<variablelist>
+<varlistentry><term>olist</term>
+<listitem>
+
+<para>The node list of potential objects to examine.</para>
+
+</listitem>
+</varlistentry>
+</variablelist>
+
+</refsect1><refsect1><title>Returns</title>
+
+<para>Calls &lt;xsl:apply-templates&gt; on the selected object.</para>
+
+</refsect1></refentry>
+
+<refentry id="template.select.mediaobject.index">
+<refnamediv>
+<refname>select.mediaobject.index</refname>
+<refpurpose>Selects the position of the appropriate media object from a list</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+<synopsis>&lt;xsl:template name="select.mediaobject.index"&gt;
+&lt;xsl:param name="olist" select="imageobject|imageobjectco |videoobject|audioobject|textobject"/&gt;
+&lt;xsl:param name="count"&gt;1&lt;/xsl:param&gt;
+ ...
+&lt;/xsl:template&gt;</synopsis>
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>This template takes a list of media objects (usually the
+children of a mediaobject or inlinemediaobject) and determines
+the "right" object. It returns the position of that object
+to be used by the calling template.</para>
+
+
+
+<para>If the parameter <parameter>use.role.for.mediaobject</parameter>
+is nonzero, then it first checks for an object with
+a role attribute of the appropriate value. It takes the first
+of those. Otherwise, it takes the first acceptable object
+through a recursive pass through the list.</para>
+
+
+
+<para>This template relies on a template named "is.acceptable.mediaobject"
+to determine if a given object is an acceptable graphic. The semantics
+of media objects is that the first acceptable graphic should be used.
+</para>
+
+
+
+<para>If no acceptable object is located, no index is returned.</para>
+
+</refsect1><refsect1><title>Parameters</title>
+
+<variablelist>
+<varlistentry><term>olist</term>
+<listitem>
+
+<para>The node list of potential objects to examine.</para>
+
+</listitem>
+</varlistentry>
+<varlistentry><term>count</term>
+<listitem>
+
+<para>The position in the list currently being considered by the
+recursive process.</para>
+
+</listitem>
+</varlistentry>
+</variablelist>
+
+</refsect1><refsect1><title>Returns</title>
+
+<para>Returns the position in the original list of the selected object.</para>
+
+</refsect1></refentry>
+
+<refentry id="template.is.acceptable.mediaobject">
+<refnamediv>
+<refname>is.acceptable.mediaobject</refname>
+<refpurpose>Returns '1' if the specified media object is recognized</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+<synopsis>&lt;xsl:template name="is.acceptable.mediaobject"&gt;
+&lt;xsl:param name="object"/&gt;
+ ...
+&lt;/xsl:template&gt;</synopsis>
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>This template examines a media object and returns '1' if the
+object is recognized as a graphic.</para>
+
+</refsect1><refsect1><title>Parameters</title>
+
+<variablelist>
+<varlistentry><term>object</term>
+<listitem>
+
+<para>The media object to consider.</para>
+
+</listitem>
+</varlistentry>
+</variablelist>
+
+</refsect1><refsect1><title>Returns</title>
+
+<para>0 or 1</para>
+
+</refsect1></refentry>
+
+<refentry id="template.check.id.unique">
+<refnamediv>
+<refname>check.id.unique</refname>
+<refpurpose>Warn users about references to non-unique IDs</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+<synopsis>&lt;xsl:template name="check.id.unique"&gt;
+&lt;xsl:param name="linkend"/&gt;
+ ...
+&lt;/xsl:template&gt;</synopsis>
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>If passed an ID in <varname>linkend</varname>,
+<function>check.id.unique</function> prints
+a warning message to the user if either the ID does not exist or
+the ID is not unique.</para>
+
+</refsect1></refentry>
+
+<refentry id="template.check.idref.targets">
+<refnamediv>
+<refname>check.idref.targets</refname>
+<refpurpose>Warn users about incorrectly typed references</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+<synopsis>&lt;xsl:template name="check.idref.targets"&gt;
+&lt;xsl:param name="linkend"/&gt;
+&lt;xsl:param name="element-list"/&gt;
+ ...
+&lt;/xsl:template&gt;</synopsis>
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>If passed an ID in <varname>linkend</varname>,
+<function>check.idref.targets</function> makes sure that the element
+pointed to by the link is one of the elements listed in
+<varname>element-list</varname> and warns the user otherwise.</para>
+
+</refsect1></refentry>
+
+<refentry id="template.copyright.years">
+<refnamediv>
+<refname>copyright.years</refname>
+<refpurpose>Print a set of years with collapsed ranges</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+<synopsis>&lt;xsl:template name="copyright.years"&gt;
+&lt;xsl:param name="years"/&gt;
+&lt;xsl:param name="print.ranges" select="1"/&gt;
+&lt;xsl:param name="single.year.ranges" select="0"/&gt;
+&lt;xsl:param name="firstyear" select="0"/&gt;
+&lt;xsl:param name="nextyear" select="0"/&gt;
+ ...
+&lt;/xsl:template&gt;</synopsis>
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>This template prints a list of year elements with consecutive
+years printed as a range. In other words:</para>
+
+
+<screen>&lt;year&gt;1992&lt;/year&gt;
+&lt;year&gt;1993&lt;/year&gt;
+&lt;year&gt;1994&lt;/year&gt;</screen>
+
+
+<para>is printed <quote>1992-1994</quote>, whereas:</para>
+
+
+<screen>&lt;year&gt;1992&lt;/year&gt;
+&lt;year&gt;1994&lt;/year&gt;</screen>
+
+
+<para>is printed <quote>1992, 1994</quote>.</para>
+
+
+
+<para>This template assumes that all the year elements contain only
+decimal year numbers, that the elements are sorted in increasing
+numerical order, that there are no duplicates, and that all the years
+are expressed in full <quote>century+year</quote>
+(<quote>1999</quote> not <quote>99</quote>) notation.</para>
+
+</refsect1><refsect1><title>Parameters</title>
+
+<variablelist>
+<varlistentry><term>years</term>
+<listitem>
+
+<para>The initial set of year elements.</para>
+
+</listitem>
+</varlistentry>
+<varlistentry><term>print.ranges</term>
+<listitem>
+
+<para>If non-zero, multi-year ranges are collapsed. If zero, all years
+are printed discretely.</para>
+
+</listitem>
+</varlistentry>
+<varlistentry><term>single.year.ranges</term>
+<listitem>
+
+<para>If non-zero, two consecutive years will be printed as a range,
+otherwise, they will be printed discretely. In other words, a single
+year range is <quote>1991-1992</quote> but discretely it's
+<quote>1991, 1992</quote>.</para>
+
+</listitem>
+</varlistentry>
+</variablelist>
+
+</refsect1><refsect1><title>Returns</title>
+
+<para>This template returns the formatted list of years.</para>
+
+</refsect1></refentry>
+
+<refentry id="template.find.path.params">
+<refnamediv>
+<refname>find.path.params</refname>
+<refpurpose>Search in a table for the "best" match for the node</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+<synopsis>&lt;xsl:template name="find.path.params"&gt;
+&lt;xsl:param name="node" select="."/&gt;
+&lt;xsl:param name="table" select="''"/&gt;
+&lt;xsl:param name="location"&gt;
+ &lt;xsl:call-template name="xpath.location"&gt;
+ &lt;xsl:with-param name="node" select="$node"/&gt;
+ &lt;/xsl:call-template&gt;
+ &lt;/xsl:param&gt;
+ ...
+&lt;/xsl:template&gt;</synopsis>
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>This template searches in a table for the value that most-closely
+(in the typical best-match sense of XSLT) matches the current (element)
+node location.</para>
+
+</refsect1></refentry>
+
+<refentry id="template.string.upper">
+<refnamediv>
+<refname>string.upper</refname>
+<refpurpose>Converts a string to all uppercase letters</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+<synopsis>&lt;xsl:template name="string.upper"&gt;
+&lt;xsl:param name="string" select="''"/&gt;
+ ...
+&lt;/xsl:template&gt;</synopsis>
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>Given a string, this template does a language-aware conversion
+of that string to all uppercase letters, based on the values of the
+<literal>lowercase.alpha</literal> and
+<literal>uppercase.alpha</literal> gentext keys for the current
+locale. It affects only those characters found in the values of
+<literal>lowercase.alpha</literal> and
+<literal>uppercase.alpha</literal>. All other characters are left
+unchanged.</para>
+
+</refsect1><refsect1><title>Parameters</title>
+
+<variablelist>
+<varlistentry><term>string</term>
+<listitem>
+
+<para>The string to convert to uppercase.</para>
+
+</listitem>
+</varlistentry>
+</variablelist>
+
+</refsect1></refentry>
+
+<refentry id="template.string.lower">
+<refnamediv>
+<refname>string.lower</refname>
+<refpurpose>Converts a string to all lowercase letters</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+<synopsis>&lt;xsl:template name="string.lower"&gt;
+&lt;xsl:param name="string" select="''"/&gt;
+ ...
+&lt;/xsl:template&gt;</synopsis>
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>Given a string, this template does a language-aware conversion
+of that string to all lowercase letters, based on the values of the
+<literal>uppercase.alpha</literal> and
+<literal>lowercase.alpha</literal> gentext keys for the current
+locale. It affects only those characters found in the values of
+<literal>uppercase.alpha</literal> and
+<literal>lowercase.alpha</literal>. All other characters are left
+unchanged.</para>
+
+</refsect1><refsect1><title>Parameters</title>
+
+<variablelist>
+<varlistentry><term>string</term>
+<listitem>
+
+<para>The string to convert to lowercase.</para>
+
+</listitem>
+</varlistentry>
+</variablelist>
+
+</refsect1></refentry>
+
+<refentry id="template.select.choice.separator">
+<refnamediv>
+<refname>select.choice.separator</refname>
+<refpurpose>Returns localized choice separator</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+<synopsis>&lt;xsl:template name="select.choice.separator"/&gt;</synopsis>
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>This template enables auto-generation of an appropriate
+ localized "choice" separator (for example, "and" or "or") before
+ the final item in an inline list (though it could also be useful
+ for generating choice separators for non-inline lists).</para>
+
+
+<para>It currently works by evaluating a processing instruction
+ (PI) of the form &lt;?dbchoice&#160;choice="foo"?&gt; :
+
+<itemizedlist>
+ <listitem>
+ <simpara>if the value of the <tag>choice</tag>
+ pseudo-attribute is "and" or "or", returns a localized "and"
+ or "or"</simpara>
+ </listitem>
+ <listitem>
+ <simpara>otherwise returns the literal value of the
+ <tag>choice</tag> pseudo-attribute</simpara>
+ </listitem>
+ </itemizedlist>
+
+ The latter is provided only as a temporary workaround because the
+ locale files do not currently have translations for the word
+ <wordasword>or</wordasword>. So if you want to generate a a
+ logical "or" separator in French (for example), you currently need
+ to do this:
+ <literallayout>&lt;?dbchoice choice="ou"?&gt;</literallayout>
+ </para>
+
+ <warning>
+
+<para>The <tag>dbchoice</tag> processing instruction is
+ an unfortunate hack; support for it may disappear in the future
+ (particularly if and when a more appropriate means for marking
+ up "choice" lists becomes available in DocBook).</para>
+
+ </warning>
+ </refsect1></refentry>
+
+<refentry id="template.evaluate.info.profile">
+<refnamediv>
+<refname>evaluate.info.profile</refname>
+<refpurpose>Evaluates an info profile</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+<synopsis>&lt;xsl:template name="evaluate.info.profile"&gt;
+&lt;xsl:param name="profile"/&gt;
+&lt;xsl:param name="info"/&gt;
+ ...
+&lt;/xsl:template&gt;</synopsis>
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>This template evaluates an "info profile" matching the XPath
+ expression given by the <parameter>profile</parameter>
+ parameter. It relies on the XSLT <function>evaluate()</function>
+ extension function.</para>
+
+
+
+<para>The value of the <parameter>profile</parameter> parameter
+ can include the literal string <literal>$info</literal>. If found
+ in the value of the <parameter>profile</parameter> parameter, the
+ literal string <literal>$info</literal> string is replaced with
+ the value of the <parameter>info</parameter> parameter, which
+ should be a set of <replaceable>*info</replaceable> nodes; the
+ expression is then evaluated using the XSLT
+ <function>evaluate()</function> extension function.</para>
+
+ </refsect1><refsect1><title>Parameters</title>
+
+<variablelist>
+ <varlistentry>
+ <term>profile</term>
+ <listitem>
+
+<para>A string representing an XPath expression </para>
+
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>info</term>
+ <listitem>
+
+<para>A set of *info nodes</para>
+
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ </refsect1><refsect1><title>Returns</title>
+
+<para>Returns a node (the result of evaluating the
+ <parameter>profile</parameter> parameter)</para>
+
+ </refsect1></refentry>
+</reference>
+ <reference id="refentry" xml:base="../common/refentry.xml">
+ <info>
+ <title>Common &#187; Refentry Metadata Template Reference</title>
+ <releaseinfo role="meta">
+ $Id: refentry.xsl 7867 2008-03-07 09:54:25Z xmldoc $
+ </releaseinfo>
+ </info>
+
+ <partintro id="partintro">
+ <title>Introduction</title>
+
+<para>This is technical reference documentation for the &#8220;refentry
+ metadata&#8221; templates in the DocBook XSL Stylesheets.</para>
+
+
+<para>This is not intended to be user documentation. It is provided
+ for developers writing customization layers for the stylesheets.</para>
+
+ <note>
+
+<para>Currently, only the manpages stylesheets make use of these
+ templates. They are, however, potentially useful elsewhere.</para>
+
+ </note>
+ </partintro>
+
+<refentry id="template.get.refentry.metadata">
+<refnamediv>
+<refname>get.refentry.metadata</refname>
+<refpurpose>Gathers metadata from a refentry and its ancestors</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+<synopsis>&lt;xsl:template name="get.refentry.metadata"&gt;
+&lt;xsl:param name="refname"/&gt;
+&lt;xsl:param name="info"/&gt;
+&lt;xsl:param name="prefs"/&gt;
+ ...
+&lt;/xsl:template&gt;</synopsis>
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>Reference documentation for particular commands, functions,
+ etc., is sometimes viewed in isolation from its greater "context". For
+ example, users view Unix man pages as, well, individual pages, not as
+ part of a "book" of some kind. Therefore, it is sometimes necessary to
+ embed "context" information in output for each <tag>refentry</tag>.</para>
+
+
+
+<para>However, one problem is that different users mark up that
+ context information in different ways. Often (usually), the
+ context information is not actually part of the content of the
+ <tag>refentry</tag> itself, but instead part of the content of a
+ parent or ancestor element to the <tag>refentry</tag>. And
+ even then, DocBook provides a variety of elements that users might
+ potentially use to mark up the same kind of information. One user
+ might use the <tag>productnumber</tag> element to mark up version
+ information about a particular product, while another might use
+ the <tag>releaseinfo</tag> element.</para>
+
+
+
+<para>Taking all that in mind, the
+ <function>get.refentry.metadata</function> template tries to gather
+ metadata from a <tag>refentry</tag> element and its ancestor
+ elements in an intelligent and user-configurable way. The basic
+ mechanism used in the XPath expressions throughout this stylesheet
+ is to select the relevant metadata from the *info element that is
+ closest to the actual <tag>refentry</tag>&#160;&#8211; either on the
+ <tag>refentry</tag> itself, or on its nearest ancestor.</para>
+
+
+ <note>
+
+<para>The <function>get.refentry.metadata</function>
+ template is actually just sort of a "driver" template; it
+ calls other templates that do the actual data collection,
+ then returns the data as a set.</para>
+
+ </note>
+
+ </refsect1><refsect1><title>Parameters</title>
+
+<variablelist>
+ <varlistentry>
+ <term>refname</term>
+ <listitem>
+
+<para>The first <tag>refname</tag> in the refentry</para>
+
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>info</term>
+ <listitem>
+
+<para>A set of info nodes (from a <tag>refentry</tag>
+ element and its ancestors)</para>
+
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>prefs</term>
+ <listitem>
+
+<para>A node containing user preferences (from global
+ stylesheet parameters)</para>
+
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ </refsect1><refsect1><title>Returns</title>
+
+<para>Returns a node set with the following elements. The
+ descriptions are verbatim from the <literal>man(7)</literal> man
+ page.
+
+<variablelist>
+ <varlistentry>
+ <term>title</term>
+ <listitem>
+
+<para>the title of the man page (e.g., <literal>MAN</literal>)</para>
+
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>section</term>
+ <listitem>
+
+<para>the section number the man page should be placed in (e.g.,
+ <literal>7</literal>)</para>
+
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>date</term>
+ <listitem>
+
+<para>the date of the last revision</para>
+
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>source</term>
+ <listitem>
+
+<para>the source of the command</para>
+
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>manual</term>
+ <listitem>
+
+<para>the title of the manual (e.g., <citetitle>Linux
+ Programmer's Manual</citetitle>)</para>
+
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ </para>
+
+ </refsect1></refentry>
+
+<refentry id="template.get.refentry.title">
+<refnamediv>
+<refname>get.refentry.title</refname>
+<refpurpose>Gets title metadata for a refentry</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+<synopsis>&lt;xsl:template name="get.refentry.title"&gt;
+&lt;xsl:param name="refname"/&gt;
+ ...
+&lt;/xsl:template&gt;</synopsis>
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>The <literal>man(7)</literal> man page describes this as "the
+ title of the man page (e.g., <literal>MAN</literal>). This differs
+ from <tag>refname</tag> in that, if the <tag>refentry</tag> has a
+ <tag>refentrytitle</tag>, we use that as the <tag>title</tag>;
+ otherwise, we just use first <tag>refname</tag> in the first
+ <tag>refnamediv</tag> in the source.</para>
+
+ </refsect1><refsect1><title>Parameters</title>
+
+<variablelist>
+ <varlistentry>
+ <term>refname</term>
+ <listitem>
+
+<para>The first <tag>refname</tag> in the refentry</para>
+
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ </refsect1><refsect1><title>Returns</title>
+
+<para>Returns a <tag>title</tag> node.</para>
+</refsect1></refentry>
+
+<refentry id="template.get.refentry.section">
+<refnamediv>
+<refname>get.refentry.section</refname>
+<refpurpose>Gets section metadata for a refentry</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+<synopsis>&lt;xsl:template name="get.refentry.section"&gt;
+&lt;xsl:param name="refname"/&gt;
+&lt;xsl:param name="quiet" select="0"/&gt;
+ ...
+&lt;/xsl:template&gt;</synopsis>
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>The <literal>man(7)</literal> man page describes this as "the
+ section number the man page should be placed in (e.g.,
+ <literal>7</literal>)". If we do not find a <tag>manvolnum</tag>
+ specified in the source, and we find that the <tag>refentry</tag> is
+ for a function, we use the section number <literal>3</literal>
+ ["Library calls (functions within program libraries)"]; otherwise, we
+ default to using <literal>1</literal> ["Executable programs or shell
+ commands"].</para>
+
+ </refsect1><refsect1><title>Parameters</title>
+
+<variablelist>
+ <varlistentry>
+ <term>refname</term>
+ <listitem>
+
+<para>The first <tag>refname</tag> in the refentry</para>
+
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>quiet</term>
+ <listitem>
+
+<para>If non-zero, no "missing" message is emitted</para>
+
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ </refsect1><refsect1><title>Returns</title>
+
+<para>Returns a string representing a section number.</para>
+</refsect1></refentry>
+
+<refentry id="template.get.refentry.date">
+<refnamediv>
+<refname>get.refentry.date</refname>
+<refpurpose>Gets date metadata for a refentry</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+<synopsis>&lt;xsl:template name="get.refentry.date"&gt;
+&lt;xsl:param name="refname"/&gt;
+&lt;xsl:param name="info"/&gt;
+&lt;xsl:param name="prefs"/&gt;
+ ...
+&lt;/xsl:template&gt;</synopsis>
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>The <literal>man(7)</literal> man page describes this as "the
+ date of the last revision". If we cannot find a date in the source, we
+ generate one.</para>
+
+ </refsect1><refsect1><title>Parameters</title>
+
+<variablelist>
+ <varlistentry>
+ <term>refname</term>
+ <listitem>
+
+<para>The first <tag>refname</tag> in the refentry</para>
+
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>info</term>
+ <listitem>
+
+<para>A set of info nodes (from a <tag>refentry</tag>
+ element and its ancestors)</para>
+
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>prefs</term>
+ <listitem>
+
+<para>A node containing users preferences (from global stylesheet parameters)</para>
+
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ </refsect1><refsect1><title>Returns</title>
+
+<para>Returns a <tag>date</tag> node.</para>
+
+ </refsect1></refentry>
+
+<refentry id="template.get.refentry.source">
+<refnamediv>
+<refname>get.refentry.source</refname>
+<refpurpose>Gets source metadata for a refentry</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+<synopsis>&lt;xsl:template name="get.refentry.source"&gt;
+&lt;xsl:param name="refname"/&gt;
+&lt;xsl:param name="info"/&gt;
+&lt;xsl:param name="prefs"/&gt;
+ ...
+&lt;/xsl:template&gt;</synopsis>
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>The <literal>man(7)</literal> man page describes this as "the
+ source of the command", and provides the following examples:
+
+<itemizedlist>
+ <listitem>
+
+<para>For binaries, use something like: GNU, NET-2, SLS
+ Distribution, MCC Distribution.</para>
+
+ </listitem>
+ <listitem>
+
+<para>For system calls, use the version of the kernel that you are
+ currently looking at: Linux 0.99.11.</para>
+
+ </listitem>
+ <listitem>
+
+<para>For library calls, use the source of the function: GNU, BSD
+ 4.3, Linux DLL 4.4.1.</para>
+
+ </listitem>
+ </itemizedlist>
+
+ </para>
+
+
+
+<para>The <literal>solbook(5)</literal> man page describes
+ something very much like what <literal>man(7)</literal> calls
+ "source", except that <literal>solbook(5)</literal> names it
+ "software" and describes it like this:
+ <blockquote>
+
+<para>This is the name of the software product that the topic
+ discussed on the reference page belongs to. For example UNIX
+ commands are part of the <literal>SunOS x.x</literal>
+ release.</para>
+
+ </blockquote>
+ </para>
+
+
+
+<para>In practice, there are many pages that simply have a version
+ number in the "source" field. So, it looks like what we have is a
+ two-part field,
+ <replaceable>Name</replaceable>&#160;<replaceable>Version</replaceable>,
+ where:
+
+<variablelist>
+ <varlistentry>
+ <term>Name</term>
+ <listitem>
+
+<para>product name (e.g., BSD) or org. name (e.g., GNU)</para>
+
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>Version</term>
+ <listitem>
+
+<para>version name</para>
+
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ Each part is optional. If the <replaceable>Name</replaceable> is a
+ product name, then the <replaceable>Version</replaceable> is probably
+ the version of the product. Or there may be no
+ <replaceable>Name</replaceable>, in which case, if there is a
+ <replaceable>Version</replaceable>, it is probably the version of the
+ item itself, not the product it is part of. Or, if the
+ <replaceable>Name</replaceable> is an organization name, then there
+ probably will be no <replaceable>Version</replaceable>.
+ </para>
+
+ </refsect1><refsect1><title>Parameters</title>
+
+<variablelist>
+ <varlistentry>
+ <term>refname</term>
+ <listitem>
+
+<para>The first <tag>refname</tag> in the refentry</para>
+
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>info</term>
+ <listitem>
+
+<para>A set of info nodes (from a <tag>refentry</tag>
+ element and its ancestors)</para>
+
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>prefs</term>
+ <listitem>
+
+<para>A node containing users preferences (from global
+ stylesheet parameters)</para>
+
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ </refsect1><refsect1><title>Returns</title>
+
+<para>Returns a <tag>source</tag> node.</para>
+
+ </refsect1></refentry>
+
+<refentry id="template.get.refentry.source.name">
+<refnamediv>
+<refname>get.refentry.source.name</refname>
+<refpurpose>Gets source-name metadata for a refentry</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+<synopsis>&lt;xsl:template name="get.refentry.source.name"&gt;
+&lt;xsl:param name="refname"/&gt;
+&lt;xsl:param name="info"/&gt;
+&lt;xsl:param name="prefs"/&gt;
+ ...
+&lt;/xsl:template&gt;</synopsis>
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>A "source name" is one part of a (potentially) two-part
+ <replaceable>Name</replaceable>&#160;<replaceable>Version</replaceable>
+ source field. For more details, see the documentation for the
+ <function>get.refentry.source</function> template.</para>
+
+ </refsect1><refsect1><title>Parameters</title>
+
+<variablelist>
+ <varlistentry>
+ <term>refname</term>
+ <listitem>
+
+<para>The first <tag>refname</tag> in the refentry</para>
+
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>info</term>
+ <listitem>
+
+<para>A set of info nodes (from a <tag>refentry</tag>
+ element and its ancestors)</para>
+
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>prefs</term>
+ <listitem>
+
+<para>A node containing users preferences (from global
+ stylesheet parameters)</para>
+
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ </refsect1><refsect1><title>Returns</title>
+
+<para>Depending on what output method is used for the
+ current stylesheet, either returns a text node or possibly an element
+ node, containing "source name" data.</para>
+
+ </refsect1></refentry>
+
+<refentry id="template.get.refentry.version">
+<refnamediv>
+<refname>get.refentry.version</refname>
+<refpurpose>Gets version metadata for a refentry</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+<synopsis>&lt;xsl:template name="get.refentry.version"&gt;
+&lt;xsl:param name="refname"/&gt;
+&lt;xsl:param name="info"/&gt;
+&lt;xsl:param name="prefs"/&gt;
+ ...
+&lt;/xsl:template&gt;</synopsis>
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>A "version" is one part of a (potentially) two-part
+ <replaceable>Name</replaceable>&#160;<replaceable>Version</replaceable>
+ source field. For more details, see the documentation for the
+ <function>get.refentry.source</function> template.</para>
+
+ </refsect1><refsect1><title>Parameters</title>
+
+<variablelist>
+ <varlistentry>
+ <term>refname</term>
+ <listitem>
+
+<para>The first <tag>refname</tag> in the refentry</para>
+
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>info</term>
+ <listitem>
+
+<para>A set of info nodes (from a <tag>refentry</tag>
+ element and its ancestors)</para>
+
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>prefs</term>
+ <listitem>
+
+<para>A node containing users preferences (from global
+ stylesheet parameters)</para>
+
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ </refsect1><refsect1><title>Returns</title>
+
+<para>Depending on what output method is used for the
+ current stylesheet, either returns a text node or possibly an element
+ node, containing "version" data.</para>
+
+ </refsect1></refentry>
+
+<refentry id="template.get.refentry.manual">
+<refnamediv>
+<refname>get.refentry.manual</refname>
+<refpurpose>Gets source metadata for a refentry</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+<synopsis>&lt;xsl:template name="get.refentry.manual"&gt;
+&lt;xsl:param name="refname"/&gt;
+&lt;xsl:param name="info"/&gt;
+&lt;xsl:param name="prefs"/&gt;
+ ...
+&lt;/xsl:template&gt;</synopsis>
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>The <literal>man(7)</literal> man page describes this as "the
+ title of the manual (e.g., <citetitle>Linux Programmer's
+ Manual</citetitle>)". Here are some examples from existing man pages:
+
+<itemizedlist>
+ <listitem>
+
+<para><citetitle>dpkg utilities</citetitle>
+ (<command>dpkg-name</command>)</para>
+
+ </listitem>
+ <listitem>
+
+<para><citetitle>User Contributed Perl Documentation</citetitle>
+ (<command>GET</command>)</para>
+
+ </listitem>
+ <listitem>
+
+<para><citetitle>GNU Development Tools</citetitle>
+ (<command>ld</command>)</para>
+
+ </listitem>
+ <listitem>
+
+<para><citetitle>Emperor Norton Utilities</citetitle>
+ (<command>ddate</command>)</para>
+
+ </listitem>
+ <listitem>
+
+<para><citetitle>Debian GNU/Linux manual</citetitle>
+ (<command>faked</command>)</para>
+
+ </listitem>
+ <listitem>
+
+<para><citetitle>GIMP Manual Pages</citetitle>
+ (<command>gimp</command>)</para>
+
+ </listitem>
+ <listitem>
+
+<para><citetitle>KDOC Documentation System</citetitle>
+ (<command>qt2kdoc</command>)</para>
+
+ </listitem>
+ </itemizedlist>
+
+ </para>
+
+
+
+<para>The <literal>solbook(5)</literal> man page describes
+ something very much like what <literal>man(7)</literal> calls
+ "manual", except that <literal>solbook(5)</literal> names it
+ "sectdesc" and describes it like this:
+ <blockquote>
+
+<para>This is the section title of the reference page; for
+ example <literal>User Commands</literal>.</para>
+
+ </blockquote>
+ </para>
+
+
+ </refsect1><refsect1><title>Parameters</title>
+
+<variablelist>
+ <varlistentry>
+ <term>refname</term>
+ <listitem>
+
+<para>The first <tag>refname</tag> in the refentry</para>
+
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>info</term>
+ <listitem>
+
+<para>A set of info nodes (from a <tag>refentry</tag>
+ element and its ancestors)</para>
+
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>prefs</term>
+ <listitem>
+
+<para>A node containing users preferences (from global
+ stylesheet parameters)</para>
+
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ </refsect1><refsect1><title>Returns</title>
+
+<para>Returns a <tag>manual</tag> node.</para>
+
+ </refsect1></refentry>
+
+<refentry id="template.get.refentry.metadata.prefs">
+<refnamediv>
+<refname>get.refentry.metadata.prefs</refname>
+<refpurpose>Gets user preferences for refentry metadata gathering</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+<synopsis>&lt;xsl:template name="get.refentry.metadata.prefs"/&gt;</synopsis>
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>The DocBook XSL stylesheets include several user-configurable
+ global stylesheet parameters for controlling <tag>refentry</tag>
+ metadata gathering. Those parameters are not read directly by the
+ other <tag>refentry</tag> metadata-gathering
+ templates. Instead, they are read only by the
+ <function>get.refentry.metadata.prefs</function> template,
+ which assembles them into a structure that is then passed to
+ the other <tag>refentry</tag> metadata-gathering
+ templates.</para>
+
+
+
+<para>So the, <function>get.refentry.metadata.prefs</function>
+ template is the only interface to collecting stylesheet parameters for
+ controlling <tag>refentry</tag> metadata gathering.</para>
+
+ </refsect1><refsect1><title>Parameters</title>
+
+<para>There are no local parameters for this template; however, it
+ does rely on a number of global parameters.</para>
+
+ </refsect1><refsect1><title>Returns</title>
+
+<para>Returns a <tag>manual</tag> node.</para>
+
+ </refsect1></refentry>
+
+<refentry id="template.set.refentry.metadata">
+<refnamediv>
+<refname>set.refentry.metadata</refname>
+<refpurpose>Sets content of a refentry metadata item</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+<synopsis>&lt;xsl:template name="set.refentry.metadata"&gt;
+&lt;xsl:param name="refname"/&gt;
+&lt;xsl:param name="info"/&gt;
+&lt;xsl:param name="contents"/&gt;
+&lt;xsl:param name="context"/&gt;
+&lt;xsl:param name="preferred"/&gt;
+ ...
+&lt;/xsl:template&gt;</synopsis>
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>The <function>set.refentry.metadata</function> template is
+ called each time a suitable source element is found for a certain
+ metadata field.</para>
+
+ </refsect1><refsect1><title>Parameters</title>
+
+<variablelist>
+ <varlistentry>
+ <term>refname</term>
+ <listitem>
+
+<para>The first <tag>refname</tag> in the refentry</para>
+
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>info</term>
+ <listitem>
+
+<para>A single *info node that contains the selected source element.</para>
+
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>contents</term>
+ <listitem>
+
+<para>A node containing the selected source element.</para>
+
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>context</term>
+ <listitem>
+
+<para>A string describing the metadata context in which the
+ <function>set.refentry.metadata</function> template was
+ called: either "date", "source", "version", or "manual".</para>
+
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ </refsect1><refsect1><title>Returns</title>
+
+<para>Returns formatted contents of a selected source element.</para>
+</refsect1></refentry>
+</reference>
+ <reference id="utility" xml:base="../common/utility.xml">
+ <info>
+ <title>Common &#187; Utility Template Reference</title>
+ <releaseinfo role="meta">
+ $Id: utility.xsl 7101 2007-07-20 15:32:12Z xmldoc $
+ </releaseinfo>
+ </info>
+
+ <partintro id="partintro">
+ <title>Introduction</title>
+
+<para>This is technical reference documentation for the
+ miscellaneous utility templates in the DocBook XSL
+ Stylesheets.</para>
+
+ <note>
+
+<para>These templates are defined in a separate file from the set
+ of &#8220;common&#8221; templates because some of the common templates
+ reference DocBook XSL stylesheet parameters, requiring the
+ entire set of parameters to be imported/included in any
+ stylesheet that imports/includes the common templates.</para>
+
+
+<para>The utility templates don&#8217;t import or include any DocBook
+ XSL stylesheet parameters, so the utility templates can be used
+ without importing the whole set of parameters.</para>
+
+ </note>
+
+<para>This is not intended to be user documentation. It is
+ provided for developers writing customization layers for the
+ stylesheets.</para>
+
+ </partintro>
+
+<refentry id="template.log.message">
+<refnamediv>
+<refname>log.message</refname>
+<refpurpose>Logs/emits formatted notes and warnings</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+<synopsis>&lt;xsl:template name="log.message"&gt;
+&lt;xsl:param name="level"/&gt;
+&lt;xsl:param name="source"/&gt;
+&lt;xsl:param name="context-desc"/&gt;
+&lt;xsl:param name="context-desc-field-length"&gt;12&lt;/xsl:param&gt;
+&lt;xsl:param name="context-desc-padded"&gt;
+ &lt;xsl:if test="not($context-desc = '')"&gt;
+ &lt;xsl:call-template name="pad-string"&gt;
+ &lt;xsl:with-param name="leftRight"&gt;right&lt;/xsl:with-param&gt;
+ &lt;xsl:with-param name="padVar" select="substring($context-desc, 1, $context-desc-field-length)"/&gt;
+ &lt;xsl:with-param name="length" select="$context-desc-field-length"/&gt;
+ &lt;/xsl:call-template&gt;
+ &lt;/xsl:if&gt;
+ &lt;/xsl:param&gt;
+&lt;xsl:param name="message"/&gt;
+&lt;xsl:param name="message-field-length" select="45"/&gt;
+&lt;xsl:param name="message-padded"&gt;
+ &lt;xsl:variable name="spaces-for-blank-level"&gt;
+ &lt;!-- * if the level field is blank, we'll need to pad out --&gt;
+ &lt;!-- * the message field with spaces to compensate --&gt;
+ &lt;xsl:choose&gt;
+ &lt;xsl:when test="$level = ''"&gt;
+ &lt;xsl:value-of select="4 + 2"/&gt;
+ &lt;!-- * 4 = hard-coded length of comment text ("Note" or "Warn") --&gt;
+ &lt;!-- * + 2 = length of colon-plus-space separator ": " --&gt;
+ &lt;/xsl:when&gt;
+ &lt;xsl:otherwise&gt;
+ &lt;xsl:value-of select="0"/&gt;
+ &lt;/xsl:otherwise&gt;
+ &lt;/xsl:choose&gt;
+ &lt;/xsl:variable&gt;
+ &lt;xsl:variable name="spaces-for-blank-context-desc"&gt;
+ &lt;!-- * if the context-description field is blank, we'll need --&gt;
+ &lt;!-- * to pad out the message field with spaces to compensate --&gt;
+ &lt;xsl:choose&gt;
+ &lt;xsl:when test="$context-desc = ''"&gt;
+ &lt;xsl:value-of select="$context-desc-field-length + 2"/&gt;
+ &lt;!-- * + 2 = length of colon-plus-space separator ": " --&gt;
+ &lt;/xsl:when&gt;
+ &lt;xsl:otherwise&gt;
+ &lt;xsl:value-of select="0"/&gt;
+ &lt;/xsl:otherwise&gt;
+ &lt;/xsl:choose&gt;
+ &lt;/xsl:variable&gt;
+ &lt;xsl:variable name="extra-spaces" select="$spaces-for-blank-level + $spaces-for-blank-context-desc"/&gt;
+ &lt;xsl:call-template name="pad-string"&gt;
+ &lt;xsl:with-param name="leftRight"&gt;right&lt;/xsl:with-param&gt;
+ &lt;xsl:with-param name="padVar" select="substring($message, 1, ($message-field-length + $extra-spaces))"/&gt;
+ &lt;xsl:with-param name="length" select="$message-field-length + $extra-spaces"/&gt;
+ &lt;/xsl:call-template&gt;
+ &lt;/xsl:param&gt;
+ ...
+&lt;/xsl:template&gt;</synopsis>
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>The <function>log.message</function> template is a utility
+ template for logging/emitting formatted messages&#160;&#8211; that is,
+ notes and warnings, along with a given log &#8220;level&#8221; and an
+ identifier for the &#8220;source&#8221; that the message relates to.</para>
+
+ </refsect1><refsect1><title>Parameters</title>
+
+<variablelist>
+ <varlistentry><term>level</term>
+ <listitem>
+
+<para>Text to log/emit in the message-level field to
+ indicate the message level
+ (<literal>Note</literal> or
+ <literal>Warning</literal>)</para>
+
+ </listitem>
+ </varlistentry>
+ <varlistentry><term>source</term>
+ <listitem>
+
+<para>Text to log/emit in the source field to identify the
+ &#8220;source&#8221; to which the notification/warning relates.
+ This can be any arbitrary string, but because the
+ message lacks line and column numbers to identify the
+ exact part of the source document to which it
+ relates, the intention is that the value you pass
+ into the <literal>source</literal> parameter should
+ give the user some way to identify the portion of
+ their source document on which to take potentially
+ take action in response to the log message (for
+ example, to edit, change, or add content).</para>
+
+
+<para>So the <literal>source</literal> value should be,
+ for example, an ID, book/chapter/article title, title
+ of some formal object, or even a string giving an
+ XPath expression.</para>
+
+ </listitem>
+ </varlistentry>
+ <varlistentry><term>context-desc</term>
+ <listitem>
+
+<para>Text to log/emit in the context-description field to
+ describe the context for the message.</para>
+
+ </listitem>
+ </varlistentry>
+ <varlistentry><term>context-desc-field-length</term>
+ <listitem>
+
+<para>Specifies length of the context-description field
+ (in characters); default is 12</para>
+
+
+<para>If the text specified by the
+ <literal>context-desc</literal> parameter is longer
+ than the number of characters specified in
+ <literal>context-desc-field-length</literal>, it is
+ truncated to <literal>context-desc-field-length</literal>
+ (12 characters by default).</para>
+
+
+<para>If the specified text is shorter than
+ <literal>context-desc-field-length</literal>,
+ it is right-padded out to
+ <literal>context-desc-field-length</literal> (12 by
+ default).</para>
+
+
+<para>If no value has been specified for the
+ <literal>context-desc</literal> parameter, the field is
+ left empty and the text of the log message begins with
+ the value of the <literal>message</literal>
+ parameter.</para>
+
+ </listitem>
+ </varlistentry>
+ <varlistentry><term>message</term>
+ <listitem>
+
+<para>Text to log/emit in the actual message field</para>
+
+ </listitem>
+ </varlistentry>
+ <varlistentry><term>message-field-length</term>
+ <listitem>
+
+<para>Specifies length of the message
+ field (in characters); default is 45</para>
+
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ </refsect1><refsect1><title>Returns</title>
+
+<para>Outputs a message (generally, to standard error).</para>
+</refsect1></refentry>
+
+<refentry id="template.get.doc.title">
+<refnamediv>
+<refname>get.doc.title</refname>
+<refpurpose>Gets a title from the current document</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+<synopsis>&lt;xsl:template name="get.doc.title"/&gt;</synopsis>
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>The <function>get.doc.title</function> template is a
+ utility template for returning the first title found in the
+ current document.</para>
+
+ </refsect1><refsect1><title>Returns</title>
+
+<para>Returns a string containing some identifying title for the
+ current document .</para>
+</refsect1></refentry>
+
+<refentry id="template.pad-string">
+<refnamediv>
+<refname>pad-string</refname>
+<refpurpose>Right-pads or left-pads a string out to a certain length</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+<synopsis>&lt;xsl:template name="pad-string"&gt;
+&lt;xsl:param name="padChar" select="' '"/&gt;
+&lt;xsl:param name="leftRight"&gt;left&lt;/xsl:param&gt;
+&lt;xsl:param name="padVar"/&gt;
+&lt;xsl:param name="length"/&gt;
+ ...
+&lt;/xsl:template&gt;</synopsis>
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>This function takes string <parameter>padVar</parameter> and
+ pads it out in the direction <parameter>rightLeft</parameter> to
+ the string-length <parameter>length</parameter>, using string
+ <parameter>padChar</parameter> (a space character by default) as
+ the padding string (note that <parameter>padChar</parameter> can
+ be a string; it is not limited to just being a single
+ character).</para>
+
+ <note>
+
+<para>This function began as a copy of Nate Austin's
+ <function>prepend-pad</function> function in the <link xlink:href="http://www.dpawson.co.uk/xsl/sect2/padding.html">Padding
+ Content</link> section of Dave Pawson's <link xlink:href="http://www.dpawson.co.uk/xsl/index.html">XSLT
+ FAQ</link>.</para>
+
+ </note>
+ </refsect1><refsect1><title>Returns</title>
+
+<para>Returns a (padded) string.</para>
+</refsect1></refentry>
+</reference>
+ <reference id="charmap" xml:base="../common/charmap.xml">
+ <info>
+ <title>Common &#187; Character-Map Template Reference</title>
+ <releaseinfo role="meta">
+ $Id: charmap.xsl 7266 2007-08-22 11:58:42Z xmldoc $
+ </releaseinfo>
+ </info>
+
+ <partintro id="partintro">
+ <title>Introduction</title>
+
+<para>This is technical reference documentation for the
+ character-map templates in the DocBook XSL Stylesheets.</para>
+
+ <note>
+
+<para>These templates are defined in a separate file from the set
+ of &#8220;common&#8221; templates because some of the common templates
+ reference DocBook XSL stylesheet parameters, requiring the
+ entire set of parameters to be imported/included in any
+ stylesheet that imports/includes the common templates.</para>
+
+
+<para>The character-map templates don&#8217;t import or include
+ any DocBook XSL stylesheet parameters, so the
+ character-map templates can be used without importing the
+ whole set of parameters.</para>
+
+ </note>
+
+<para>This is not intended to be user documentation. It is
+ provided for developers writing customization layers for the
+ stylesheets.</para>
+
+ </partintro>
+
+<refentry id="template.apply-character-map">
+<refnamediv>
+<refname>apply-character-map</refname>
+<refpurpose>Applies an XSLT character map</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+<synopsis>&lt;xsl:template name="apply-character-map"&gt;
+&lt;xsl:param name="content"/&gt;
+&lt;xsl:param name="map.contents"/&gt;
+ ...
+&lt;/xsl:template&gt;</synopsis>
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>This template applies an <link xlink:href="http://www.w3.org/TR/xslt20/#character-maps">XSLT character map</link>; that is, it causes certain
+ individual characters to be substituted with strings of one
+ or more characters. It is useful mainly for replacing
+ multiple &#8220;special&#8221; characters or symbols in the same target
+ content. It uses the value of
+ <parameter>map.contents</parameter> to do substitution on
+ <parameter>content</parameter>, and then returns the
+ modified contents.</para>
+
+ <note>
+
+<para>This template is a very slightly modified version of
+ Jeni Tennison&#8217;s <function>replace_strings</function>
+ template in the <link xlink:href="http://www.dpawson.co.uk/xsl/sect2/StringReplace.html#d9351e13">multiple string replacements</link> section of Dave Pawson&#8217;s
+ <link xlink:href="http://www.dpawson.co.uk/xsl/index.html">XSLT FAQ</link>.</para>
+
+
+<para>The <function>apply-string-subst-map</function>
+ template is essentially the same template as the
+ <function>apply-character-map</function> template; the
+ only difference is that in the map that
+ <function>apply-string-subst-map</function> expects, <tag class="attribute">oldstring</tag> and <tag class="attribute">newstring</tag> attributes are used
+ instead of <tag class="attribute">character</tag> and <tag class="attribute">string</tag> attributes.</para>
+
+ </note>
+ </refsect1><refsect1><title>Parameters</title>
+
+<variablelist>
+ <varlistentry><term>content</term>
+ <listitem>
+
+<para>The content on which to perform the character-map
+ substitution.</para>
+
+ </listitem>
+ </varlistentry>
+ <varlistentry><term>map.contents</term>
+ <listitem>
+
+<para>A node set of elements, with each element having
+ the following attributes:
+
+<itemizedlist>
+ <listitem>
+ <simpara><tag class="attribute">character</tag>, a
+ character to be replaced</simpara>
+ </listitem>
+ <listitem>
+ <simpara><tag class="attribute">string</tag>, a
+ string with which to replace <tag class="attribute">character</tag></simpara>
+ </listitem>
+ </itemizedlist>
+
+ </para>
+
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ </refsect1></refentry>
+
+<refentry id="template.read-character-map">
+<refnamediv>
+<refname>read-character-map</refname>
+<refpurpose>Reads in all or part of an XSLT character map</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+<synopsis>&lt;xsl:template name="read-character-map"&gt;
+&lt;xsl:param name="use.subset"/&gt;
+&lt;xsl:param name="subset.profile"/&gt;
+&lt;xsl:param name="uri"/&gt;
+ ...
+&lt;/xsl:template&gt;</synopsis>
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>The XSLT 2.0 specification describes <link xlink:href="http://www.w3.org/TR/xslt20/#character-maps">character maps</link> and explains how they may be used
+ to allow a specific character appearing in a text or
+ attribute node in a final result tree to be substituted by
+ a specified string of characters during serialization. The
+ <function>read-character-map</function> template provides a
+ means for reading and using character maps with XSLT
+ 1.0-based tools.</para>
+
+
+<para>This template reads the character-map contents from
+ <parameter>uri</parameter> (in full or in part, depending on
+ the value of the <parameter>use.subset</parameter>
+ parameter), then passes those contents to the
+ <function>apply-character-map</function> template, along with
+ <parameter>content</parameter>, the data on which to perform
+ the character substitution.</para>
+
+
+<para>Using the character map &#8220;in part&#8221; means that it uses only
+ those <tag>output-character</tag> elements that match the
+ XPath expression given in the value of the
+ <parameter>subset.profile</parameter> parameter. The current
+ implementation of that capability here relies on the
+ <function>evaluate</function> extension XSLT function.</para>
+
+ </refsect1><refsect1><title>Parameters</title>
+
+<variablelist>
+ <varlistentry><term>use.subset</term>
+ <listitem>
+
+<para>Specifies whether to use a subset of the character
+ map instead of the whole map; boolean
+ <literal>0</literal> or <literal>1</literal></para>
+
+ </listitem>
+ </varlistentry>
+ <varlistentry><term>subset.profile</term>
+ <listitem>
+
+<para>XPath expression that specifies what subset of the
+ character map to use</para>
+
+ </listitem>
+ </varlistentry>
+ <varlistentry><term>uri</term>
+ <listitem>
+
+<para>URI for a character map</para>
+
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ </refsect1></refentry>
+</reference>
+ </part>
+ <part id="table-templates">
+ <?dbhtml dir="fo"?>
+
+ <info xml:base="../fo/table.xml">
+ <title>Formatting Object Table Reference</title>
+ <releaseinfo role="meta">
+ $Id: table.xsl 8814 2010-08-09 21:19:53Z bobstayton $
+ </releaseinfo>
+ </info>
+ <partintro id="partintro" xml:base="../fo/table.xml">
+ <title>Introduction</title>
+
+<para>This is technical reference documentation for the FO
+ table-processing templates in the DocBook XSL Stylesheets.</para>
+
+
+<para>This is not intended to be user documentation. It is
+ provided for developers writing customization layers for the
+ stylesheets.</para>
+
+ </partintro>
+
+<refentry id="template.calc.column.width" xml:base="../fo/table.xml">
+<refnamediv>
+<refname>calc.column.width</refname>
+<refpurpose>Calculate an XSL FO table column width specification from a
+CALS table column width specification.</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+<synopsis>&lt;xsl:template name="calc.column.width"&gt;
+&lt;xsl:param name="colwidth"&gt;1*&lt;/xsl:param&gt;
+ ...
+&lt;/xsl:template&gt;</synopsis>
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>CALS expresses table column widths in the following basic
+forms:</para>
+
+
+
+<itemizedlist>
+<listitem>
+
+<para><emphasis>99.99units</emphasis>, a fixed length specifier.</para>
+
+</listitem>
+<listitem>
+
+<para><emphasis>99.99</emphasis>, a fixed length specifier without any units.</para>
+
+</listitem>
+<listitem>
+
+<para><emphasis>99.99*</emphasis>, a relative length specifier.</para>
+
+</listitem>
+<listitem>
+
+<para><emphasis>99.99*+99.99units</emphasis>, a combination of both.</para>
+
+</listitem>
+</itemizedlist>
+
+
+
+<para>The CALS units are points (pt), picas (pi), centimeters (cm),
+millimeters (mm), and inches (in). These are the same units as XSL,
+except that XSL abbreviates picas "pc" instead of "pi". If a length
+specifier has no units, the CALS default unit (pt) is assumed.</para>
+
+
+
+<para>Relative length specifiers are represented in XSL with the
+proportional-column-width() function.</para>
+
+
+
+<para>Here are some examples:</para>
+
+
+
+<itemizedlist>
+<listitem>
+
+<para>"36pt" becomes "36pt"</para>
+
+</listitem>
+<listitem>
+
+<para>"3pi" becomes "3pc"</para>
+
+</listitem>
+<listitem>
+
+<para>"36" becomes "36pt"</para>
+
+</listitem>
+<listitem>
+
+<para>"3*" becomes "proportional-column-width(3)"</para>
+
+</listitem>
+<listitem>
+
+<para>"3*+2pi" becomes "proportional-column-width(3)+2pc"</para>
+
+</listitem>
+<listitem>
+
+<para>"1*+2" becomes "proportional-column-width(1)+2pt"</para>
+
+</listitem>
+</itemizedlist>
+
+</refsect1><refsect1><title>Parameters</title>
+
+<variablelist>
+<varlistentry><term>colwidth</term>
+<listitem>
+
+<para>The CALS column width specification.</para>
+
+</listitem>
+</varlistentry>
+</variablelist>
+
+</refsect1><refsect1><title>Returns</title>
+
+<para>The XSL column width specification.</para>
+
+</refsect1></refentry>
+
+ </part>
+ <part id="template">
+ <?dbhtml dir="template"?><?dbhtml filename="index.html"?>
+
+
+ <info xml:base="../template/titlepage.xml">
+ <title>Titlepage Template Stylesheet Reference</title>
+ <releaseinfo role="meta">
+ $Id: titlepage.xsl 7058 2007-07-17 13:59:29Z xmldoc $
+ </releaseinfo>
+ </info>
+ <partintro id="intro_partintro" xml:base="../template/titlepage.xml">
+ <title>Introduction</title>
+
+<para>This is technical reference documentation for the
+ &#8220;titlepage&#8221; templates in the DocBook XSL Stylesheets.</para>
+
+
+<para>This is not intended to be user documentation. It is
+ provided for developers writing customization layers for the
+ stylesheets.</para>
+
+ </partintro>
+
+<refentry id="templates" xml:base="../template/titlepage.xml">
+<refnamediv>
+<refname>t:templates</refname>
+<refpurpose>Construct a stylesheet for the templates provided</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+<synopsis>&lt;xsl:template match="t:templates"/&gt;</synopsis>
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>The <literal>t:templates</literal> element is the root of a
+set of templates. This template creates an appropriate
+<literal>xsl:stylesheet</literal> for the templates.</para>
+
+
+
+<para>If the <literal>t:templates</literal> element has a
+<literal>base-stylesheet</literal> attribute, an
+<literal>xsl:import</literal> statement is constructed for it.</para>
+
+</refsect1></refentry>
+
+<refentry id="star" xml:base="../template/titlepage.xml">
+<refnamediv>
+<refname>xsl:*</refname>
+<refpurpose>Copy xsl: elements straight through</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+<synopsis>&lt;xsl:template match="xsl:*"/&gt;</synopsis>
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>This template simply copies the xsl: elements
+straight through into the result tree.</para>
+
+</refsect1></refentry>
+
+<refentry id="titlepage" xml:base="../template/titlepage.xml">
+<refnamediv>
+<refname>t:titlepage</refname>
+<refpurpose>Create the templates necessary to construct a title page</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+<synopsis>&lt;xsl:template match="t:titlepage"/&gt;</synopsis>
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>The <literal>t:titlepage</literal> element creates a set of
+templates for processing the titlepage for an element. The
+<quote>root</quote> of this template set is the template named
+<quote><literal>wrapper.titlepage</literal></quote>. That is the
+template that should be called to generate the title page.
+</para>
+
+
+
+<para>The <literal>t:titlepage</literal> element has three attributes:
+
+
+<variablelist>
+<varlistentry><term>element</term>
+<listitem>
+<para>The name of the source document element for which
+these templates apply. In other words, to make a title page for the
+<tag>article</tag> element, set the
+<tag class="attribute">element</tag> attribute to
+<quote><literal>article</literal></quote>. This attribute is required.
+</para>
+</listitem>
+</varlistentry>
+<varlistentry><term>wrapper</term>
+<listitem>
+<para>The entire title page can be wrapped with an element.
+This attribute identifies that element.
+</para>
+</listitem>
+</varlistentry>
+<varlistentry><term>class</term>
+<listitem>
+<para>If the <tag class="attribute">class</tag> attribute
+is set, a <tag class="attribute">class</tag> attribute with this
+value will be added to the wrapper element that surrounds the entire
+title page.
+</para>
+</listitem>
+</varlistentry>
+</variablelist>
+
+</para>
+
+
+
+<para>Any other attributes are copied through literally to the
+wrapper element.</para>
+
+
+
+<para>The content of a <literal>t:titlepage</literal> is one or
+more <literal>t:titlepage-content</literal>,
+<literal>t:titlepage-separator</literal>, and
+<literal>t:titlepage-before</literal> elements.</para>
+
+
+
+<para>Each of these elements may be provided for the <quote>recto</quote>
+and <quote>verso</quote> sides of the title page.</para>
+
+
+</refsect1></refentry>
+
+<refentry id="attr_star_in_copy.literal.atts" xml:base="../template/titlepage.xml">
+<refnamediv>
+<refname>@* (in copy.literal.atts mode)</refname>
+<refpurpose>Copy t:titlepage attributes</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+<synopsis>&lt;xsl:template match="@*" mode="copy.literal.atts"/&gt;</synopsis>
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>This template copies all of the <quote>other</quote> attributes
+from a <literal>t:titlepage</literal> element onto the specified
+wrapper.</para>
+
+</refsect1></refentry>
+
+<refentry id="titlepage-content" xml:base="../template/titlepage.xml">
+<refnamediv>
+<refname>t:titlepage-content</refname>
+<refpurpose>Create templates for the content of one side of a title page</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+<synopsis>&lt;xsl:template match="t:titlepage-content"/&gt;</synopsis>
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>The title page content, that is, the elements from the source
+document that are rendered on the title page, can be controlled independently
+for the recto and verso sides of the title page.</para>
+
+
+
+<para>The <literal>t:titlepage-content</literal> element has two attributes:
+
+
+<variablelist>
+<varlistentry><term>side</term>
+<listitem>
+<para>Identifies the side of the page to which this title
+page content applies. The
+<tag class="attribute">side</tag> attribute is required and
+must be set to either
+<quote><literal>recto</literal></quote> or
+<quote><literal>verso</literal></quote>. In addition, you must specify
+exactly one <literal>t:titlepage-content</literal> for each side
+within each <literal>t:titlepage</literal>.</para>
+
+</listitem>
+</varlistentry>
+<varlistentry><term>order</term>
+<listitem>
+<para>Indicates how the order of the elements presented on
+the title page is determined. If the
+<tag class="attribute">order</tag> is
+<quote><literal>document</literal></quote>, the elements are presented
+in document order. Otherwise (if the
+<tag class="attribute">order</tag> is
+<quote><literal>stylesheet</literal></quote>), the elements are presented
+in the order that they appear in the template (and consequently in
+the stylesheet).</para>
+
+</listitem>
+</varlistentry>
+</variablelist>
+
+</para>
+
+
+
+<para>The content of a <literal>t:titlepage-content</literal> element is
+a list of element names. These names should be unqualified. They identify
+the elements in the source document that should appear on the title page.
+</para>
+
+
+
+<para>Each element may have a single attribute:
+<tag class="attribute">predicate</tag>. The value of this
+attribute is used as a predicate for the expression that matches
+the element on which it occurs.</para>
+
+
+
+<para>In other words, to put only the first three authors on the
+recto-side of a title
+page, you could specify:
+
+<screen>
+ &lt;t:titlepage-contents side="recto"&gt;
+ &lt;!-- other titlepage elements --&gt;
+ &lt;author predicate="[count(previous-sibling::author)&lt;2]"/&gt;
+ &lt;!-- other titlepage elements --&gt;
+ &lt;/t:titlepage-contents&gt;
+</screen>
+</para>
+
+
+
+<para>Usually, the elements so named are empty. But it is possible to
+make one level of selection within them. Suppose that you want to
+process <literal>authorgroup</literal> elements on the title page, but
+you want to select only proper authors, editors, or corporate authors,
+not collaborators or other credited authors.</para>
+
+
+
+<para>In that case, you can put a <literal>t:or</literal> group inside
+the <literal>authorgroup</literal> element:
+
+<screen>
+ &lt;t:titlepage-contents side="recto"&gt;
+ &lt;!-- other titlepage elements --&gt;
+ &lt;authorgroup&gt;
+ &lt;t:or&gt;
+ &lt;author/&gt;
+ &lt;editor/&gt;
+ &lt;corpauthor/&gt;
+ &lt;/t:or&gt;
+ &lt;/authorgroup&gt;
+ &lt;!-- other titlepage elements --&gt;
+ &lt;/t:titlepage-contents&gt;
+</screen>
+</para>
+
+
+
+<para>This will have the effect of automatically generating a template
+for processing <literal>authorgroup</literal>s in the title page mode,
+selecting only the specified children. If you need more complex processing,
+you'll have to construct the templates by hand.</para>
+
+
+</refsect1></refentry>
+
+<refentry id="titlepage-separator" xml:base="../template/titlepage.xml">
+<refnamediv>
+<refname>t:titlepage-separator</refname>
+<refpurpose>Create templates for the separator</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+<synopsis>&lt;xsl:template match="t:titlepage-separator"/&gt;</synopsis>
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>The title page is separated from the content which follows it by
+the markup specified in the <literal>t:titlepage-separator</literal>
+element.</para>
+
+</refsect1></refentry>
+
+<refentry id="titlepage-before" xml:base="../template/titlepage.xml">
+<refnamediv>
+<refname>t:titlepage-before</refname>
+<refpurpose>Create templates for what precedes a title page</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+<synopsis>&lt;xsl:template match="t:titlepage-before"/&gt;</synopsis>
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>Each side of the title page is preceded by the markup specified
+in the <literal>t:titlepage-before</literal> element for that
+side.</para>
+
+</refsect1></refentry>
+
+<refentry id="star_in_copy" xml:base="../template/titlepage.xml">
+<refnamediv>
+<refname>* (in copy mode)</refname>
+<refpurpose>Copy elements</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+<synopsis>&lt;xsl:template match="*" mode="copy"/&gt;</synopsis>
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>This template simply copies the elements that it applies to
+straight through into the result tree.</para>
+
+</refsect1></refentry>
+
+<refentry id="attr_star_in_copy" xml:base="../template/titlepage.xml">
+<refnamediv>
+<refname>@* (in copy mode)</refname>
+<refpurpose>Copy attributes</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+<synopsis>&lt;xsl:template match="@*" mode="copy"/&gt;</synopsis>
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>This template simply copies the attributes that it applies to
+straight through into the result tree.</para>
+
+</refsect1></refentry>
+
+<refentry id="attr_star_in_document.order" xml:base="../template/titlepage.xml">
+<refnamediv>
+<refname>* (in document.order mode)</refname>
+<refpurpose>Create rules to process titlepage elements in document order</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+<synopsis>&lt;xsl:template match="*" mode="document.order"/&gt;</synopsis>
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>This template is called to process all of the children of the
+<literal>t:titlepage-content</literal> element. It creates the hairy
+select expression necessary to process each of those elements in
+the title page.</para>
+
+
+
+<para>Note that this template automatically handles the case where
+some DocBook elements, like title and subtitle, can occur both inside
+the *info elements where metadata is usually stored and outside.
+</para>
+
+
+
+<para>It also automatically calculates the name for the *info container
+and handles elements that have historically had containers with different
+names.</para>
+
+
+</refsect1></refentry>
+
+<refentry id="star_in_document.order" xml:base="../template/titlepage.xml">
+<refnamediv>
+<refname>* (in document.order mode)</refname>
+<refpurpose>Create rules to process titlepage elements in stylesheet order</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+<synopsis>&lt;xsl:template match="*" mode="document.order"/&gt;</synopsis>
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>This template is called to process all of the children of the
+<literal>t:titlepage-content</literal> element. It creates the set
+of <literal>xsl:apply-templates</literal> elements necessary
+process each of those elements in the title page.</para>
+
+
+
+<para>Note that this template automatically handles the case where
+some DocBook elements, like title and subtitle, can occur both inside
+the *info elements where metadata is usually stored and outside.
+</para>
+
+
+
+<para>It also automatically calculates the name for the *info container
+and handles elements that have historically had containers with different
+names.</para>
+
+
+</refsect1></refentry>
+
+<refentry id="star_in_titlepage.specialrules" xml:base="../template/titlepage.xml">
+<refnamediv>
+<refname>* (in titlepage.specialrules mode)</refname>
+<refpurpose>Create templates for special rules</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+<synopsis>&lt;xsl:template match="*" mode="titlepage.specialrules"/&gt;</synopsis>
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>This template is called to process all of the descendants of the
+<literal>t:titlepage-content</literal> element that require special
+processing. At present, that's just <literal>t:or</literal> elements.
+</para>
+
+</refsect1></refentry>
+
+<refentry id="star_in_titlepage.subrules" xml:base="../template/titlepage.xml">
+<refnamediv>
+<refname>* (in titlepage.subrules mode)</refname>
+<refpurpose>Create template for individual special rules</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+<synopsis>&lt;xsl:template match="*" mode="titlepage.subrules"/&gt;</synopsis>
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>This template is called to process the children of special
+template elements.
+</para>
+
+</refsect1></refentry>
+
+<refentry id="or" xml:base="../template/titlepage.xml">
+<refnamediv>
+<refname>t:or</refname>
+<refpurpose>Process the t:or special rule</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+<synopsis>&lt;xsl:template match="t:or"/&gt;&lt;xsl:template match="t:or" mode="titlepage.subrules"/&gt;</synopsis>
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>This template processes t:or.</para>
+
+</refsect1></refentry>
+
+<refentry id="or_in_titlepage.subrules" xml:base="../template/titlepage.xml">
+<refnamediv>
+<refname>t:or (in titlepage.subrules mode)</refname>
+<refpurpose>Process the t:or special rule in
+titlepage.subrules mode</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+<synopsis>&lt;xsl:template match="t:or" mode="titlepage.subrules"/&gt;</synopsis>
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>The titlepage.subrules mode doesn't apply to t:or, so just
+reprocess this node in the normal mode.</para>
+
+</refsect1></refentry>
+
+<refentry id="template.element-or-list" xml:base="../template/titlepage.xml">
+<refnamediv>
+<refname>element-or-list</refname>
+<refpurpose>Construct the "or-list" used in the select attribute for
+special rules.</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+<synopsis>&lt;xsl:template name="element-or-list"&gt;
+&lt;xsl:param name="elements" select="*"/&gt;
+&lt;xsl:param name="element.count" select="count($elements)"/&gt;
+&lt;xsl:param name="count" select="1"/&gt;
+&lt;xsl:param name="orlist"/&gt;
+ ...
+&lt;/xsl:template&gt;</synopsis>
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>Walk through each of the children of t:or, producing the
+text of the select attribute.</para>
+
+</refsect1></refentry>
+
+ </part>
+ </book>
+</set><!-- * vim: set ft=docbk foldlevel=2: --> \ No newline at end of file
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/docsrc/warranty.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/docsrc/warranty.xml
new file mode 100644
index 0000000..3c70d32
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/docsrc/warranty.xml
@@ -0,0 +1,11 @@
+<legalnotice xmlns="http://docbook.org/ns/docbook" version="5.0"
+ xml:id="warranty"><title>Warranty</title>
+<para>THE SOFTWARE IS PROVIDED <quote>AS IS</quote>,
+WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT
+LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
+PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL NORMAN WALSH OR ANY
+OTHER CONTRIBUTOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT
+OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.</para>
+</legalnotice>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/eclipse/eclipse.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/eclipse/eclipse.xsl
new file mode 100644
index 0000000..07ddcea
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/eclipse/eclipse.xsl
@@ -0,0 +1,306 @@
+<?xml version="1.0"?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:ng="http://docbook.org/docbook-ng"
+ xmlns:db="http://docbook.org/ns/docbook"
+ xmlns:exsl="http://exslt.org/common"
+ version="1.0"
+ exclude-result-prefixes="exsl db ng">
+
+<xsl:import href="../html/chunk.xsl"/>
+
+<!-- ********************************************************************
+ $Id: eclipse.xsl 8400 2009-04-08 07:44:54Z bobstayton $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<xsl:template match="/">
+ <!-- * Get a title for current doc so that we let the user -->
+ <!-- * know what document we are processing at this point. -->
+ <xsl:variable name="doc.title">
+ <xsl:call-template name="get.doc.title"/>
+ </xsl:variable>
+ <xsl:choose>
+ <!-- Hack! If someone hands us a DocBook V5.x or DocBook NG document,
+ toss the namespace and continue. Use the docbook5 namespaced
+ stylesheets for DocBook5 if you don't want to use this feature.-->
+ <!-- include extra test for Xalan quirk -->
+ <xsl:when test="$exsl.node.set.available != 0
+ and (*/self::ng:* or */self::db:*)">
+ <xsl:call-template name="log.message">
+ <xsl:with-param name="level">Note</xsl:with-param>
+ <xsl:with-param name="source" select="$doc.title"/>
+ <xsl:with-param name="context-desc">
+ <xsl:text>namesp. cut</xsl:text>
+ </xsl:with-param>
+ <xsl:with-param name="message">
+ <xsl:text>stripped namespace before processing</xsl:text>
+ </xsl:with-param>
+ </xsl:call-template>
+ <xsl:variable name="nons">
+ <xsl:apply-templates mode="stripNS"/>
+ </xsl:variable>
+ <xsl:call-template name="log.message">
+ <xsl:with-param name="level">Note</xsl:with-param>
+ <xsl:with-param name="source" select="$doc.title"/>
+ <xsl:with-param name="context-desc">
+ <xsl:text>namesp. cut</xsl:text>
+ </xsl:with-param>
+ <xsl:with-param name="message">
+ <xsl:text>processing stripped document</xsl:text>
+ </xsl:with-param>
+ </xsl:call-template>
+ <xsl:apply-templates select="exsl:node-set($nons)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:choose>
+ <xsl:when test="$rootid != ''">
+ <xsl:choose>
+ <xsl:when test="count(key('id',$rootid)) = 0">
+ <xsl:message terminate="yes">
+ <xsl:text>ID '</xsl:text>
+ <xsl:value-of select="$rootid"/>
+ <xsl:text>' not found in document.</xsl:text>
+ </xsl:message>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:if test="$collect.xref.targets = 'yes' or
+ $collect.xref.targets = 'only'">
+ <xsl:apply-templates select="key('id', $rootid)"
+ mode="collect.targets"/>
+ </xsl:if>
+ <xsl:if test="$collect.xref.targets != 'only'">
+ <xsl:message>Formatting from <xsl:value-of
+ select="$rootid"/></xsl:message>
+ <xsl:apply-templates select="key('id',$rootid)"
+ mode="process.root"/>
+ <xsl:call-template name="etoc"/>
+ <xsl:call-template name="plugin.xml"/>
+ <xsl:call-template name="helpidx"/>
+ </xsl:if>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:if test="$collect.xref.targets = 'yes' or
+ $collect.xref.targets = 'only'">
+ <xsl:apply-templates select="/" mode="collect.targets"/>
+ </xsl:if>
+ <xsl:if test="$collect.xref.targets != 'only'">
+ <xsl:apply-templates select="/" mode="process.root"/>
+ <xsl:call-template name="etoc"/>
+ <xsl:call-template name="plugin.xml"/>
+ <xsl:call-template name="helpidx"/>
+ </xsl:if>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:otherwise>
+</xsl:choose>
+</xsl:template>
+
+<xsl:template name="etoc">
+ <xsl:call-template name="write.chunk">
+ <xsl:with-param name="filename">
+ <xsl:if test="$manifest.in.base.dir != 0">
+ <xsl:value-of select="$base.dir"/>
+ </xsl:if>
+ <xsl:value-of select="'toc.xml'"/>
+ </xsl:with-param>
+ <xsl:with-param name="method" select="'xml'"/>
+ <xsl:with-param name="encoding" select="'utf-8'"/>
+ <xsl:with-param name="indent" select="'yes'"/>
+ <xsl:with-param name="quiet" select="$chunk.quietly"/>
+ <xsl:with-param name="content">
+ <xsl:choose>
+
+ <xsl:when test="$rootid != ''">
+ <xsl:variable name="title">
+ <xsl:if test="$eclipse.autolabel=1">
+ <xsl:variable name="label.markup">
+ <xsl:apply-templates select="key('id',$rootid)" mode="label.markup"/>
+ </xsl:variable>
+ <xsl:if test="normalize-space($label.markup)">
+ <xsl:value-of select="concat($label.markup,$autotoc.label.separator)"/>
+ </xsl:if>
+ </xsl:if>
+ <xsl:apply-templates select="key('id',$rootid)" mode="title.markup"/>
+ </xsl:variable>
+ <xsl:variable name="href">
+ <xsl:call-template name="href.target.with.base.dir">
+ <xsl:with-param name="object" select="key('id',$rootid)"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <toc label="{normalize-space($title)}" topic="{$href}">
+ <xsl:apply-templates select="key('id',$rootid)/*" mode="etoc"/>
+ </toc>
+ </xsl:when>
+
+ <xsl:otherwise>
+ <xsl:variable name="title">
+ <xsl:if test="$eclipse.autolabel=1">
+ <xsl:variable name="label.markup">
+ <xsl:apply-templates select="/*" mode="label.markup"/>
+ </xsl:variable>
+ <xsl:if test="normalize-space($label.markup)">
+ <xsl:value-of select="concat($label.markup,$autotoc.label.separator)"/>
+ </xsl:if>
+ </xsl:if>
+ <xsl:apply-templates select="/*" mode="title.markup"/>
+ </xsl:variable>
+ <xsl:variable name="href">
+ <xsl:call-template name="href.target.with.base.dir">
+ <xsl:with-param name="object" select="/"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <toc label="{normalize-space($title)}" topic="{$href}">
+ <xsl:apply-templates select="/*/*" mode="etoc"/>
+ </toc>
+ </xsl:otherwise>
+
+ </xsl:choose>
+ </xsl:with-param>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="book|part|reference|preface|chapter|bibliography|appendix|article|glossary|section|sect1|sect2|sect3|sect4|sect5|refentry|colophon|bibliodiv|index" mode="etoc">
+ <xsl:variable name="title">
+ <xsl:if test="$eclipse.autolabel=1">
+ <xsl:variable name="label.markup">
+ <xsl:apply-templates select="." mode="label.markup"/>
+ </xsl:variable>
+ <xsl:if test="normalize-space($label.markup)">
+ <xsl:value-of select="concat($label.markup,$autotoc.label.separator)"/>
+ </xsl:if>
+ </xsl:if>
+ <xsl:apply-templates select="." mode="title.markup"/>
+ </xsl:variable>
+
+ <xsl:variable name="href">
+ <xsl:call-template name="href.target.with.base.dir">
+ <xsl:with-param name="context" select="/"/> <!-- Generate links relative to the location of root file/toc.xml file -->
+ </xsl:call-template>
+ </xsl:variable>
+
+ <topic label="{normalize-space($title)}" href="{$href}">
+ <xsl:apply-templates select="part|reference|preface|chapter|bibliography|appendix|article|glossary|section|sect1|sect2|sect3|sect4|sect5|refentry|colophon|bibliodiv|index" mode="etoc"/>
+ </topic>
+
+</xsl:template>
+
+<xsl:template match="text()" mode="etoc"/>
+
+<xsl:template name="plugin.xml">
+ <xsl:call-template name="write.chunk">
+ <xsl:with-param name="filename">
+ <xsl:if test="$manifest.in.base.dir != 0">
+ <xsl:value-of select="$base.dir"/>
+ </xsl:if>
+ <xsl:value-of select="'plugin.xml'"/>
+ </xsl:with-param>
+ <xsl:with-param name="method" select="'xml'"/>
+ <xsl:with-param name="encoding" select="'utf-8'"/>
+ <xsl:with-param name="indent" select="'yes'"/>
+ <xsl:with-param name="quiet" select="$chunk.quietly"/>
+ <xsl:with-param name="content">
+ <plugin name="{$eclipse.plugin.name}"
+ id="{$eclipse.plugin.id}"
+ version="1.0"
+ provider-name="{$eclipse.plugin.provider}">
+
+ <extension point="org.eclipse.help.toc">
+ <toc file="toc.xml" primary="true"/>
+ </extension>
+ <extension point="org.eclipse.help.index">
+ <index file="index.xml"/>
+ </extension>
+ </plugin>
+ </xsl:with-param>
+ </xsl:call-template>
+</xsl:template>
+
+<!-- ==================================================================== -->
+<!-- The following templates come from the javahelp xsls with modifications needed to make them generate and ecilpse index.xml file -->
+
+<xsl:template name="helpidx">
+ <xsl:call-template name="write.chunk.with.doctype">
+ <xsl:with-param name="filename" select="concat($base.dir, 'index.xml')"/>
+ <xsl:with-param name="method" select="'xml'"/>
+ <xsl:with-param name="indent" select="'yes'"/>
+ <xsl:with-param name="doctype-public" select="''"/>
+ <xsl:with-param name="doctype-system" select="''"/>
+ <xsl:with-param name="encoding" select="'utf-8'"/>
+ <xsl:with-param name="quiet" select="$chunk.quietly"/>
+ <xsl:with-param name="content">
+ <xsl:call-template name="helpidx.content"/>
+ </xsl:with-param>
+ </xsl:call-template>
+</xsl:template>
+
+ <xsl:template name="helpidx.content">
+ <index>
+ <xsl:choose>
+ <xsl:when test="$rootid != ''">
+ <xsl:apply-templates select="key('id',$rootid)//indexterm" mode="idx">
+ <xsl:sort select="normalize-space(concat(primary/@sortas, primary[not(@sortas) or @sortas = '']))"/>
+ <xsl:sort select="normalize-space(concat(secondary/@sortas, secondary[not(@sortas) or @sortas = '']))"/>
+ <xsl:sort select="normalize-space(concat(tertiary/@sortas, tertiary[not(@sortas) or @sortas = '']))"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="//indexterm" mode="idx">
+ <xsl:sort select="normalize-space(concat(primary/@sortas, primary[not(@sortas) or @sortas = '']))"/>
+ <xsl:sort select="normalize-space(concat(secondary/@sortas, secondary[not(@sortas) or @sortas = '']))"/>
+ <xsl:sort select="normalize-space(concat(tertiary/@sortas, tertiary[not(@sortas) or @sortas = '']))"/>
+ </xsl:apply-templates>
+ </xsl:otherwise>
+ </xsl:choose>
+ </index>
+ </xsl:template>
+
+ <xsl:template match="indexterm[@class='endofrange']" mode="idx"/>
+
+ <xsl:template match="indexterm|primary|secondary|tertiary" mode="idx">
+
+ <xsl:variable name="href">
+ <xsl:call-template name="href.target.with.base.dir">
+ <xsl:with-param name="context" select="/"/> <!-- Generate links relative to the location of root file/toc.xml file -->
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="text">
+ <xsl:value-of select="normalize-space(.)"/>
+ <xsl:if test="following-sibling::*[1][self::see]">
+ <xsl:text> (</xsl:text><xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'see'"/>
+ </xsl:call-template><xsl:text> </xsl:text>
+ <xsl:value-of select="following-sibling::*[1][self::see]"/>)</xsl:if>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="self::indexterm">
+ <xsl:apply-templates select="primary" mode="idx"/>
+ </xsl:when>
+ <xsl:when test="self::primary">
+ <entry keyword="{$text}">
+ <topic href="{$href}"/>
+ <xsl:apply-templates select="following-sibling::secondary" mode="idx"/>
+ </entry>
+ </xsl:when>
+ <xsl:otherwise>
+ <entry keyword="{$text}">
+ <topic href="{$href}"/>
+ <xsl:apply-templates select="following-sibling::tertiary" mode="idx"/>
+ </entry>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+ <!-- ==================================================================== -->
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/eclipse/eclipse3.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/eclipse/eclipse3.xsl
new file mode 100644
index 0000000..c0d3a4e
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/eclipse/eclipse3.xsl
@@ -0,0 +1,111 @@
+<?xml version="1.0"?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:ng="http://docbook.org/docbook-ng"
+ xmlns:db="http://docbook.org/ns/docbook"
+ xmlns:exsl="http://exslt.org/common" version="1.0"
+ exclude-result-prefixes="exsl db ng">
+
+<!--
+********************************************************************************
+ $Id: eclipse3.xsl 8798 2010-08-07 19:12:48Z mzjn $
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ * Copyright (c) 2008 Standards for Technology in Automotive Retail and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * David Carver - STAR - Extended existing eclipse.xsl file to produce valid
+ * eclipse 3.3 plugin.xml with a manifest file.
+ *******************************************************************************
+ -->
+
+ <xsl:import href="eclipse.xsl"/>
+
+ <xsl:param name="eclipse.manifest">1</xsl:param>
+ <xsl:param name="create.plugin.xml">1</xsl:param>
+
+ <xsl:template name="plugin.xml">
+ <xsl:if test="$create.plugin.xml != 0">
+ <xsl:call-template name="write.chunk">
+ <xsl:with-param name="filename">
+ <xsl:if test="$manifest.in.base.dir != 0">
+ <xsl:value-of select="$base.dir" />
+ </xsl:if>
+ <xsl:value-of select="'plugin.xml'" />
+ </xsl:with-param>
+ <xsl:with-param name="method" select="'xml'" />
+ <xsl:with-param name="encoding" select="'utf-8'" />
+ <xsl:with-param name="indent" select="'yes'" />
+ <xsl:with-param name="quiet" select="$chunk.quietly"/>
+ <xsl:with-param name="content">
+ <xsl:choose>
+
+ <xsl:when test="$eclipse.manifest = '1'">
+ <plugin>
+ <extension point="org.eclipse.help.toc">
+ <toc file="toc.xml" primary="true" />
+ </extension>
+ <xsl:if test="$generate.index = 1">
+ <extension point="org.eclipse.help.index">
+ <index file="index.xml"/>
+ </extension>
+ </xsl:if>
+ </plugin>
+ <xsl:call-template name="write.chunk">
+ <xsl:with-param name="filename">
+ <xsl:if test="$manifest.in.base.dir != 0">
+ <xsl:value-of select="$base.dir" />
+ </xsl:if>
+ <xsl:value-of select="'META-INF/'" />
+ <xsl:value-of select="'MANIFEST.MF'" />
+ </xsl:with-param>
+ <xsl:with-param name="method" select="'text'" />
+ <xsl:with-param name="encoding" select="'utf-8'" />
+ <xsl:with-param name="quiet" select="$chunk.quietly"/>
+ <xsl:with-param name="content">
+ <xsl:call-template name="manifest.content"/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:when>
+
+ <xsl:otherwise>
+ <plugin name="{$eclipse.plugin.name}" id="{$eclipse.plugin.id}"
+ version="1.0" provider-name="{$eclipse.plugin.provider}">
+ <extension point="org.eclipse.help.toc">
+ <toc file="toc.xml" primary="true" />
+ </extension>
+ <xsl:if test="$generate.index = 1">
+ <extension point="org.eclipse.help.index">
+ <index file="index.xml"/>
+ </extension>
+ </xsl:if>
+ </plugin>
+ </xsl:otherwise>
+
+ </xsl:choose>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:template>
+
+ <xsl:template name="manifest.content">
+ <xsl:text>Manifest-Version: 1.0</xsl:text>
+ <xsl:text>&#xA;</xsl:text>
+ <xsl:text>Bundle-Version: 1.0</xsl:text>
+ <xsl:text>&#xA;</xsl:text>
+ <xsl:text>Bundle-Name: </xsl:text><xsl:value-of select="$eclipse.plugin.name"/>
+ <xsl:text>&#xA;</xsl:text>
+ <xsl:text>Bundle-SymbolicName: </xsl:text><xsl:value-of select="$eclipse.plugin.id"/>
+ <xsl:text>&#xA;</xsl:text>
+ <xsl:text>Bundle-Vendor: </xsl:text><xsl:value-of select="$eclipse.plugin.provider"/>
+ <xsl:text>&#xA;</xsl:text>
+ </xsl:template>
+
+</xsl:stylesheet>
+ \ No newline at end of file
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/eclipse/profile-eclipse.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/eclipse/profile-eclipse.xsl
new file mode 100644
index 0000000..5040c9b
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/eclipse/profile-eclipse.xsl
@@ -0,0 +1,269 @@
+<?xml version="1.0" encoding="US-ASCII"?>
+<!--This file was created automatically by xsl2profile-->
+<!--from the DocBook XSL stylesheets.-->
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ng="http://docbook.org/docbook-ng" xmlns:db="http://docbook.org/ns/docbook" xmlns:exsl="http://exslt.org/common" xmlns:exslt="http://exslt.org/common" exslt:dummy="dummy" ng:dummy="dummy" db:dummy="dummy" extension-element-prefixes="exslt" version="1.0" exclude-result-prefixes="exsl db ng exslt">
+
+<xsl:import href="../html/chunk.xsl"/>
+
+<!-- ********************************************************************
+ $Id: eclipse.xsl 8400 2009-04-08 07:44:54Z bobstayton $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<xslo:include xmlns:xslo="http://www.w3.org/1999/XSL/Transform" href="../profiling/profile-mode.xsl"/><xslo:variable xmlns:xslo="http://www.w3.org/1999/XSL/Transform" name="profiled-content"><xslo:choose><xslo:when test="*/self::ng:* or */self::db:*"><xslo:message>Note: namesp. cut : stripped namespace before processing</xslo:message><xslo:variable name="stripped-content"><xslo:apply-templates select="/" mode="stripNS"/></xslo:variable><xslo:message>Note: namesp. cut : processing stripped document</xslo:message><xslo:apply-templates select="exslt:node-set($stripped-content)" mode="profile"/></xslo:when><xslo:otherwise><xslo:apply-templates select="/" mode="profile"/></xslo:otherwise></xslo:choose></xslo:variable><xslo:variable xmlns:xslo="http://www.w3.org/1999/XSL/Transform" name="profiled-nodes" select="exslt:node-set($profiled-content)"/><xsl:template match="/">
+ <!-- * Get a title for current doc so that we let the user -->
+ <!-- * know what document we are processing at this point. -->
+ <xsl:variable name="doc.title">
+ <xsl:call-template name="get.doc.title"/>
+ </xsl:variable>
+ <xsl:choose>
+ <!-- Hack! If someone hands us a DocBook V5.x or DocBook NG document,
+ toss the namespace and continue. Use the docbook5 namespaced
+ stylesheets for DocBook5 if you don't want to use this feature.-->
+ <!-- include extra test for Xalan quirk -->
+ <xsl:when test="false()"/>
+ <xsl:otherwise>
+ <xsl:choose>
+ <xsl:when test="$rootid != ''">
+ <xsl:choose>
+ <xsl:when test="count($profiled-nodes//*[@id=$rootid]) = 0">
+ <xsl:message terminate="yes">
+ <xsl:text>ID '</xsl:text>
+ <xsl:value-of select="$rootid"/>
+ <xsl:text>' not found in document.</xsl:text>
+ </xsl:message>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:if test="$collect.xref.targets = 'yes' or $collect.xref.targets = 'only'">
+ <xsl:apply-templates select="key('id', $rootid)" mode="collect.targets"/>
+ </xsl:if>
+ <xsl:if test="$collect.xref.targets != 'only'">
+ <xsl:message>Formatting from <xsl:value-of select="$rootid"/></xsl:message>
+ <xsl:apply-templates select="$profiled-nodes//*[@id=$rootid]" mode="process.root"/>
+ <xsl:call-template name="etoc"/>
+ <xsl:call-template name="plugin.xml"/>
+ <xsl:call-template name="helpidx"/>
+ </xsl:if>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:if test="$collect.xref.targets = 'yes' or $collect.xref.targets = 'only'">
+ <xsl:apply-templates select="$profiled-nodes" mode="collect.targets"/>
+ </xsl:if>
+ <xsl:if test="$collect.xref.targets != 'only'">
+ <xsl:apply-templates select="$profiled-nodes" mode="process.root"/>
+ <xsl:call-template name="etoc"/>
+ <xsl:call-template name="plugin.xml"/>
+ <xsl:call-template name="helpidx"/>
+ </xsl:if>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:otherwise>
+</xsl:choose>
+</xsl:template>
+
+<xsl:template name="etoc">
+ <xsl:call-template name="write.chunk">
+ <xsl:with-param name="filename">
+ <xsl:if test="$manifest.in.base.dir != 0">
+ <xsl:value-of select="$base.dir"/>
+ </xsl:if>
+ <xsl:value-of select="'toc.xml'"/>
+ </xsl:with-param>
+ <xsl:with-param name="method" select="'xml'"/>
+ <xsl:with-param name="encoding" select="'utf-8'"/>
+ <xsl:with-param name="indent" select="'yes'"/>
+ <xsl:with-param name="quiet" select="$chunk.quietly"/>
+ <xsl:with-param name="content">
+ <xsl:choose>
+
+ <xsl:when test="$rootid != ''">
+ <xsl:variable name="title">
+ <xsl:if test="$eclipse.autolabel=1">
+ <xsl:variable name="label.markup">
+ <xsl:apply-templates select="$profiled-nodes//*[@id=$rootid]" mode="label.markup"/>
+ </xsl:variable>
+ <xsl:if test="normalize-space($label.markup)">
+ <xsl:value-of select="concat($label.markup,$autotoc.label.separator)"/>
+ </xsl:if>
+ </xsl:if>
+ <xsl:apply-templates select="$profiled-nodes//*[@id=$rootid]" mode="title.markup"/>
+ </xsl:variable>
+ <xsl:variable name="href">
+ <xsl:call-template name="href.target.with.base.dir">
+ <xsl:with-param name="object" select="key('id',$rootid)"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <toc label="{normalize-space($title)}" topic="{$href}">
+ <xsl:apply-templates select="$profiled-nodes//*[@id=$rootid]/*" mode="etoc"/>
+ </toc>
+ </xsl:when>
+
+ <xsl:otherwise>
+ <xsl:variable name="title">
+ <xsl:if test="$eclipse.autolabel=1">
+ <xsl:variable name="label.markup">
+ <xsl:apply-templates select="$profiled-nodes/*" mode="label.markup"/>
+ </xsl:variable>
+ <xsl:if test="normalize-space($label.markup)">
+ <xsl:value-of select="concat($label.markup,$autotoc.label.separator)"/>
+ </xsl:if>
+ </xsl:if>
+ <xsl:apply-templates select="$profiled-nodes/*" mode="title.markup"/>
+ </xsl:variable>
+ <xsl:variable name="href">
+ <xsl:call-template name="href.target.with.base.dir">
+ <xsl:with-param name="object" select="$profiled-nodes"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <toc label="{normalize-space($title)}" topic="{$href}">
+ <xsl:apply-templates select="$profiled-nodes/*/*" mode="etoc"/>
+ </toc>
+ </xsl:otherwise>
+
+ </xsl:choose>
+ </xsl:with-param>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="book|part|reference|preface|chapter|bibliography|appendix|article|glossary|section|sect1|sect2|sect3|sect4|sect5|refentry|colophon|bibliodiv|index" mode="etoc">
+ <xsl:variable name="title">
+ <xsl:if test="$eclipse.autolabel=1">
+ <xsl:variable name="label.markup">
+ <xsl:apply-templates select="." mode="label.markup"/>
+ </xsl:variable>
+ <xsl:if test="normalize-space($label.markup)">
+ <xsl:value-of select="concat($label.markup,$autotoc.label.separator)"/>
+ </xsl:if>
+ </xsl:if>
+ <xsl:apply-templates select="." mode="title.markup"/>
+ </xsl:variable>
+
+ <xsl:variable name="href">
+ <xsl:call-template name="href.target.with.base.dir">
+ <xsl:with-param name="context" select="/"/> <!-- Generate links relative to the location of root file/toc.xml file -->
+ </xsl:call-template>
+ </xsl:variable>
+
+ <topic label="{normalize-space($title)}" href="{$href}">
+ <xsl:apply-templates select="part|reference|preface|chapter|bibliography|appendix|article|glossary|section|sect1|sect2|sect3|sect4|sect5|refentry|colophon|bibliodiv|index" mode="etoc"/>
+ </topic>
+
+</xsl:template>
+
+<xsl:template match="text()" mode="etoc"/>
+
+<xsl:template name="plugin.xml">
+ <xsl:call-template name="write.chunk">
+ <xsl:with-param name="filename">
+ <xsl:if test="$manifest.in.base.dir != 0">
+ <xsl:value-of select="$base.dir"/>
+ </xsl:if>
+ <xsl:value-of select="'plugin.xml'"/>
+ </xsl:with-param>
+ <xsl:with-param name="method" select="'xml'"/>
+ <xsl:with-param name="encoding" select="'utf-8'"/>
+ <xsl:with-param name="indent" select="'yes'"/>
+ <xsl:with-param name="quiet" select="$chunk.quietly"/>
+ <xsl:with-param name="content">
+ <plugin name="{$eclipse.plugin.name}" id="{$eclipse.plugin.id}" version="1.0" provider-name="{$eclipse.plugin.provider}">
+
+ <extension point="org.eclipse.help.toc">
+ <toc file="toc.xml" primary="true"/>
+ </extension>
+ <extension point="org.eclipse.help.index">
+ <index file="index.xml"/>
+ </extension>
+ </plugin>
+ </xsl:with-param>
+ </xsl:call-template>
+</xsl:template>
+
+<!-- ==================================================================== -->
+<!-- The following templates come from the javahelp xsls with modifications needed to make them generate and ecilpse index.xml file -->
+
+<xsl:template name="helpidx">
+ <xsl:call-template name="write.chunk.with.doctype">
+ <xsl:with-param name="filename" select="concat($base.dir, 'index.xml')"/>
+ <xsl:with-param name="method" select="'xml'"/>
+ <xsl:with-param name="indent" select="'yes'"/>
+ <xsl:with-param name="doctype-public" select="''"/>
+ <xsl:with-param name="doctype-system" select="''"/>
+ <xsl:with-param name="encoding" select="'utf-8'"/>
+ <xsl:with-param name="quiet" select="$chunk.quietly"/>
+ <xsl:with-param name="content">
+ <xsl:call-template name="helpidx.content"/>
+ </xsl:with-param>
+ </xsl:call-template>
+</xsl:template>
+
+ <xsl:template name="helpidx.content">
+ <index>
+ <xsl:choose>
+ <xsl:when test="$rootid != ''">
+ <xsl:apply-templates select="key('id',$rootid)//indexterm" mode="idx">
+ <xsl:sort select="normalize-space(concat(primary/@sortas, primary[not(@sortas) or @sortas = '']))"/>
+ <xsl:sort select="normalize-space(concat(secondary/@sortas, secondary[not(@sortas) or @sortas = '']))"/>
+ <xsl:sort select="normalize-space(concat(tertiary/@sortas, tertiary[not(@sortas) or @sortas = '']))"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="//indexterm" mode="idx">
+ <xsl:sort select="normalize-space(concat(primary/@sortas, primary[not(@sortas) or @sortas = '']))"/>
+ <xsl:sort select="normalize-space(concat(secondary/@sortas, secondary[not(@sortas) or @sortas = '']))"/>
+ <xsl:sort select="normalize-space(concat(tertiary/@sortas, tertiary[not(@sortas) or @sortas = '']))"/>
+ </xsl:apply-templates>
+ </xsl:otherwise>
+ </xsl:choose>
+ </index>
+ </xsl:template>
+
+ <xsl:template match="indexterm[@class='endofrange']" mode="idx"/>
+
+ <xsl:template match="indexterm|primary|secondary|tertiary" mode="idx">
+
+ <xsl:variable name="href">
+ <xsl:call-template name="href.target.with.base.dir">
+ <xsl:with-param name="context" select="/"/> <!-- Generate links relative to the location of root file/toc.xml file -->
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="text">
+ <xsl:value-of select="normalize-space(.)"/>
+ <xsl:if test="following-sibling::*[1][self::see]">
+ <xsl:text> (</xsl:text><xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'see'"/>
+ </xsl:call-template><xsl:text> </xsl:text>
+ <xsl:value-of select="following-sibling::*[1][self::see]"/>)</xsl:if>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="self::indexterm">
+ <xsl:apply-templates select="primary" mode="idx"/>
+ </xsl:when>
+ <xsl:when test="self::primary">
+ <entry keyword="{$text}">
+ <topic href="{$href}"/>
+ <xsl:apply-templates select="following-sibling::secondary" mode="idx"/>
+ </entry>
+ </xsl:when>
+ <xsl:otherwise>
+ <entry keyword="{$text}">
+ <topic href="{$href}"/>
+ <xsl:apply-templates select="following-sibling::tertiary" mode="idx"/>
+ </entry>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+ <!-- ==================================================================== -->
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/epub/README b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/epub/README
new file mode 100644
index 0000000..5e2587a
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/epub/README
@@ -0,0 +1,88 @@
+----------------------------------------------------------------------
+ README file for the DocBook XSL Stylesheets
+----------------------------------------------------------------------
+
+These are XSL stylesheets for transforming DocBook XML document
+instances into .epub format.
+
+.epub is an open standard of the The International Digital Publishing Forum (IDPF),
+a the trade and standards association for the digital publishing industry.
+
+An alpha-quality reference implementation (dbtoepub) for a DocBook to .epub
+converter (written in Ruby) is available under bin/.
+
+From http://idpf.org
+ What is EPUB, .epub, OPS/OCF & OEB?
+
+ ".epub" is the file extension of an XML format for reflowable digital
+ books and publications. ".epub" is composed of three open standards,
+ the Open Publication Structure (OPS), Open Packaging Format (OPF) and
+ Open Container Format (OCF), produced by the IDPF. "EPUB" allows
+ publishers to produce and send a single digital publication file
+ through distribution and offers consumers interoperability between
+ software/hardware for unencrypted reflowable digital books and other
+ publications. The Open eBook Publication Structure or "OEB",
+ originally produced in 1999, is the precursor to OPS.
+
+----------------------------------------------------------------------
+.epub Constraints
+----------------------------------------------------------------------
+
+.epub does not support all of the image formats that DocBook supports.
+When an image is available in an accepted format, it will be used. The
+accepted @formats are: 'GIF','GIF87a','GIF89a','JPEG','JPG','PNG','SVG'
+A mime-type for the image will be guessed from the file extension,
+which may not work if your file extensions are non-standard.
+
+Non-supported elements:
+ * <mediaobjectco>
+ * <inlinegraphic>, <graphic>, <textdata>, <imagedata> with text/XML
+ @filerefs
+ * <olink>
+ * <cmdsynopsis> in lists (generic XHTML rendering inability)
+ * <footnote><para><programlisting> (just make your programlistings
+ siblings, rather than descendents of paras)
+
+----------------------------------------------------------------------
+dbtoepub Reference Implementation
+----------------------------------------------------------------------
+
+An alpha-quality DocBook to .epub conversion program, dbtoepub, is provided
+in bin/dbtoepub.
+
+This tool requires:
+ - 'xsltproc' in your PATH
+ - 'zip' in your PATH
+ - Ruby 1.8.4+
+
+Windows compatibility has not been extensively tested; bug reports encouraged.
+[See http://www.zlatkovic.com/libxml.en.html and http://unxutils.sourceforge.net/]
+
+$ dbtoepub --help
+ Usage: dbtoepub [OPTIONS] [DocBook Files]
+
+ dbtoepub converts DocBook <book> and <article>s into to .epub files.
+
+ .epub is defined by the IDPF at www.idpf.org and is made up of 3 standards:
+ - Open Publication Structure (OPS)
+ - Open Packaging Format (OPF)
+ - Open Container Format (OCF)
+
+ Specific options:
+ -d, --debug Show debugging output.
+ -h, --help Display usage info
+ -v, --verbose Make output verbose
+
+
+----------------------------------------------------------------------
+Validation
+----------------------------------------------------------------------
+
+The epubcheck project provides limited validation for .epub documents.
+See http://code.google.com/p/epubcheck/ for details.
+
+----------------------------------------------------------------------
+Copyright information
+----------------------------------------------------------------------
+See the accompanying file named COPYING.
+
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/epub/bin/dbtoepub b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/epub/bin/dbtoepub
new file mode 100644
index 0000000..9976f81
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/epub/bin/dbtoepub
@@ -0,0 +1,76 @@
+#!/usr/bin/env ruby
+# This program converts DocBook documents into .epub files.
+#
+# Usage: dbtoepub [OPTIONS] [DocBook Files]
+#
+# .epub is defined by the IDPF at www.idpf.org and is made up of 3 standards:
+# - Open Publication Structure (OPS)
+# - Open Packaging Format (OPF)
+# - Open Container Format (OCF)
+#
+# Specific options:
+# -c, --css [FILE] Use FILE for CSS on generated XHTML.
+# -d, --debug Show debugging output.
+# -f, --font [OTF FILE] Embed OTF FILE in .epub.
+# -h, --help Display usage info.
+# -s, --stylesheet [XSL FILE] Use XSL FILE as a customization
+# layer (imports epub/docbook.xsl).
+# -v, --verbose Make output verbose.
+
+lib = File.expand_path(File.join(File.dirname(__FILE__), 'lib'))
+$LOAD_PATH.unshift(lib) if File.exist?(lib)
+
+require 'fileutils'
+require 'optparse'
+require 'tmpdir'
+
+require 'docbook'
+
+verbose = false
+debug = false
+css_file = nil
+otf_files = []
+customization_layer = nil
+output_file = nil
+
+#$DEBUG=true
+
+# Set up the OptionParser
+opts = OptionParser.new
+opts.banner = "Usage: #{File.basename($0)} [OPTIONS] [DocBook Files]
+
+#{File.basename($0)} converts DocBook <book> and <article>s into to .epub files.
+
+.epub is defined by the IDPF at www.idpf.org and is made up of 3 standards:
+- Open Publication Structure (OPS)
+- Open Packaging Format (OPF)
+- Open Container Format (OCF)
+
+Specific options:"
+opts.on("-c", "--css [FILE]", "Use FILE for CSS on generated XHTML.") {|f| css_file = f}
+opts.on("-d", "--debug", "Show debugging output.") {debug = true; verbose = true}
+opts.on("-f", "--font [OTF FILE]", "Embed OTF FILE in .epub.") {|f| otf_files << f}
+opts.on("-h", "--help", "Display usage info.") {puts opts.to_s; exit 0}
+opts.on("-o", "--output [OUTPUT FILE]", "Output ePub file as OUTPUT FILE.") {|f| output_file = f}
+opts.on("-s", "--stylesheet [XSL FILE]", "Use XSL FILE as a customization layer (imports epub/docbook.xsl).") {|f| customization_layer = f}
+opts.on("-v", "--verbose", "Make output verbose.") {verbose = true}
+
+db_files = opts.parse(ARGV)
+if db_files.size == 0
+ puts opts.to_s
+ exit 0
+end
+
+db_files.each {|docbook_file|
+ dir = File.expand_path(File.join(Dir.tmpdir, ".epubtmp#{Time.now.to_f.to_s}"))
+ FileUtils.mkdir_p(dir)
+ e = DocBook::Epub.new(docbook_file, dir, css_file, customization_layer, otf_files)
+
+ if output_file
+ epub_file = output_file
+ else
+ epub_file = File.basename(docbook_file, ".xml") + ".epub"
+ end
+ puts "Rendering DocBook file #{docbook_file} to #{epub_file}" if verbose
+ e.render_to_file(epub_file)
+}
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/epub/bin/lib/docbook.rb b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/epub/bin/lib/docbook.rb
new file mode 100644
index 0000000..14110d6
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/epub/bin/lib/docbook.rb
@@ -0,0 +1,227 @@
+require 'fileutils'
+require 'rexml/parsers/pullparser'
+
+module DocBook
+
+ class Epub
+ CHECKER = "epubcheck"
+ STYLESHEET = File.expand_path(File.join(File.dirname(__FILE__), '..', '..', "docbook.xsl"))
+ CALLOUT_PATH = File.join('images', 'callouts')
+ CALLOUT_FULL_PATH = File.expand_path(File.join(File.dirname(__FILE__), '..', '..', '..', CALLOUT_PATH))
+ CALLOUT_LIMIT = 15
+ CALLOUT_EXT = ".png"
+ XSLT_PROCESSOR = "xsltproc"
+ OUTPUT_DIR = ".epubtmp#{Time.now.to_f.to_s}"
+ MIMETYPE = "application/epub+zip"
+ META_DIR = "META-INF"
+ OEBPS_DIR = "OEBPS"
+ ZIPPER = "zip"
+
+ attr_reader :output_dir
+
+ def initialize(docbook_file, output_dir=OUTPUT_DIR, css_file=nil, customization_layer=nil, embedded_fonts=[])
+ @docbook_file = docbook_file
+ @output_dir = output_dir
+ @meta_dir = File.join(@output_dir, META_DIR)
+ @oebps_dir = File.join(@output_dir, OEBPS_DIR)
+ @css_file = css_file ? File.expand_path(css_file) : css_file
+ @embedded_fonts = embedded_fonts
+ @to_delete = []
+
+ if customization_layer
+ @stylesheet = File.expand_path(customization_layer)
+ else
+ @stylesheet = STYLESHEET
+ end
+
+ unless File.exist?(@docbook_file)
+ raise ArgumentError.new("File #{@docbook_file} does not exist")
+ end
+ end
+
+ def render_to_file(output_file, verbose=false)
+ render_to_epub(output_file, verbose)
+ bundle_epub(output_file, verbose)
+ cleanup_files(@to_delete)
+ end
+
+ def self.invalid?(file)
+ # Obnoxiously, we can't just check for a non-zero output...
+ cmd = %Q(#{CHECKER} "#{file}")
+ output = `#{cmd} 2>&1`
+
+ if $?.to_i == 0
+ return false
+ else
+ STDERR.puts output if $DEBUG
+ return output
+ end
+ end
+
+ private
+ def render_to_epub(output_file, verbose)
+ @collapsed_docbook_file = collapse_docbook()
+
+ chunk_quietly = "--stringparam chunk.quietly " + (verbose ? '0' : '1')
+ callout_path = "--stringparam callout.graphics.path #{CALLOUT_PATH}/"
+ callout_limit = "--stringparam callout.graphics.number.limit #{CALLOUT_LIMIT}"
+ callout_ext = "--stringparam callout.graphics.extension #{CALLOUT_EXT}"
+ html_stylesheet = "--stringparam html.stylesheet #{File.basename(@css_file)}" if @css_file
+ base = "--stringparam base.dir #{OEBPS_DIR}/"
+ unless @embedded_fonts.empty?
+ embedded_fonts = @embedded_fonts.map {|f| File.basename(f)}.join(',')
+ font = "--stringparam epub.embedded.fonts \"#{embedded_fonts}\""
+ end
+ meta = "--stringparam epub.metainf.dir #{META_DIR}/"
+ oebps = "--stringparam epub.oebps.dir #{OEBPS_DIR}/"
+ options = [chunk_quietly,
+ callout_path,
+ callout_limit,
+ callout_ext,
+ base,
+ font,
+ meta,
+ oebps,
+ html_stylesheet,
+ ].join(" ")
+ # Double-quote stylesheet & file to help Windows cmd.exe
+ db2epub_cmd = %Q(cd "#{@output_dir}" && #{XSLT_PROCESSOR} #{options} "#{@stylesheet}" "#{@collapsed_docbook_file}")
+ STDERR.puts db2epub_cmd if $DEBUG
+ success = system(db2epub_cmd)
+ raise "Could not render as .epub to #{output_file} (#{db2epub_cmd})" unless success
+ @to_delete << Dir["#{@meta_dir}/*"]
+ @to_delete << Dir["#{@oebps_dir}/*"]
+ end
+
+ def bundle_epub(output_file, verbose)
+
+ quiet = verbose ? "" : "-q"
+ mimetype_filename = write_mimetype()
+ meta = File.basename(@meta_dir)
+ oebps = File.basename(@oebps_dir)
+ images = copy_images()
+ csses = copy_csses()
+ fonts = copy_fonts()
+ callouts = copy_callouts()
+ # zip -X -r ../book.epub mimetype META-INF OEBPS
+ # Double-quote stylesheet & file to help Windows cmd.exe
+ zip_cmd = %Q(cd "#{@output_dir}" && #{ZIPPER} #{quiet} -X -r "#{File.expand_path(output_file)}" "#{mimetype_filename}" "#{meta}" "#{oebps}")
+ puts zip_cmd if $DEBUG
+ success = system(zip_cmd)
+ raise "Could not bundle into .epub file to #{output_file}" unless success
+ end
+
+ # Input must be collapsed because REXML couldn't find figures in files that
+ # were XIncluded or added by ENTITY
+ # http://sourceforge.net/tracker/?func=detail&aid=2750442&group_id=21935&atid=373747
+ def collapse_docbook
+ # Double-quote stylesheet & file to help Windows cmd.exe
+ collapsed_file = File.join(File.expand_path(File.dirname(@docbook_file)),
+ '.collapsed.' + File.basename(@docbook_file))
+ entity_collapse_command = %Q(xmllint --loaddtd --noent -o "#{collapsed_file}" "#{@docbook_file}")
+ entity_success = system(entity_collapse_command)
+ raise "Could not collapse named entites in #{@docbook_file}" unless entity_success
+
+ xinclude_collapse_command = %Q(xmllint --xinclude -o "#{collapsed_file}" "#{collapsed_file}")
+ xinclude_success = system(xinclude_collapse_command)
+ raise "Could not collapse XIncludes in #{@docbook_file}" unless xinclude_success
+
+ @to_delete << collapsed_file
+ return collapsed_file
+ end
+
+ def copy_callouts
+ new_callout_images = []
+ if has_callouts?
+ calloutglob = "#{CALLOUT_FULL_PATH}/*#{CALLOUT_EXT}"
+ Dir.glob(calloutglob).each {|img|
+ img_new_filename = File.join(@oebps_dir, CALLOUT_PATH, File.basename(img))
+
+ # TODO: What to rescue for these two?
+ FileUtils.mkdir_p(File.dirname(img_new_filename))
+ FileUtils.cp(img, img_new_filename)
+ @to_delete << img_new_filename
+ new_callout_images << img
+ }
+ end
+ return new_callout_images
+ end
+
+ def copy_fonts
+ new_fonts = []
+ @embedded_fonts.each {|font_file|
+ font_new_filename = File.join(@oebps_dir, File.basename(font_file))
+ FileUtils.cp(font_file, font_new_filename)
+ new_fonts << font_file
+ }
+ return new_fonts
+ end
+
+ def copy_csses
+ if @css_file
+ css_new_filename = File.join(@oebps_dir, File.basename(@css_file))
+ FileUtils.cp(@css_file, css_new_filename)
+ end
+ end
+
+ def copy_images
+ image_references = get_image_refs()
+ new_images = []
+ image_references.each {|img|
+ # TODO: It'd be cooler if we had a filetype lookup rather than just
+ # extension
+ if img =~ /\.(svg|png|gif|jpe?g|xml)/i
+ img_new_filename = File.join(@oebps_dir, img)
+ img_full = File.join(File.expand_path(File.dirname(@docbook_file)), img)
+
+ # TODO: What to rescue for these two?
+ FileUtils.mkdir_p(File.dirname(img_new_filename))
+ puts(img_full + ": " + img_new_filename) if $DEBUG
+ FileUtils.cp(img_full, img_new_filename)
+ @to_delete << img_new_filename
+ new_images << img_full
+ end
+ }
+ return new_images
+ end
+
+ def write_mimetype
+ mimetype_filename = File.join(@output_dir, "mimetype")
+ File.open(mimetype_filename, "w") {|f| f.print MIMETYPE}
+ @to_delete << mimetype_filename
+ return File.basename(mimetype_filename)
+ end
+
+ def cleanup_files(file_list)
+ file_list.flatten.each {|f|
+ # Yikes
+ FileUtils.rm_r(f, :force => true )
+ }
+ end
+
+ # Returns an Array of all of the (image) @filerefs in a document
+ def get_image_refs
+ parser = REXML::Parsers::PullParser.new(File.new(@collapsed_docbook_file))
+ image_refs = []
+ while parser.has_next?
+ el = parser.pull
+ if el.start_element? and (el[0] == "imagedata" or el[0] == "graphic")
+ image_refs << el[1]['fileref']
+ end
+ end
+ return image_refs.uniq
+ end
+
+ # Returns true if the document has code callouts
+ def has_callouts?
+ parser = REXML::Parsers::PullParser.new(File.new(@collapsed_docbook_file))
+ while parser.has_next?
+ el = parser.pull
+ if el.start_element? and (el[0] == "calloutlist" or el[0] == "co")
+ return true
+ end
+ end
+ return false
+ end
+ end
+end
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/epub/bin/xslt/obfuscate.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/epub/bin/xslt/obfuscate.xsl
new file mode 100644
index 0000000..4ea4cd5
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/epub/bin/xslt/obfuscate.xsl
@@ -0,0 +1,12 @@
+<?xml version="1.0"?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
+ <xsl:output method="xml" omit-xml-declaration="no" doctype-public="-//OASIS//DTD DocBook XML V4.4//EN" doctype-system="http://www.oasis-open.org/docbook/xml/4.4/docbookx.dtd" indent="no"/>
+ <xsl:template match="@*|*|comment()|processing-instruction()">
+ <xsl:copy>
+ <xsl:apply-templates select="@*|node()"/>
+ </xsl:copy>
+ </xsl:template>
+ <xsl:template match="text()">
+ <xsl:value-of select="replace(replace(., '[a-z]', 'x'), '[0-9]', 'd')"/>
+ </xsl:template>
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/epub/docbook.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/epub/docbook.xsl
new file mode 100644
index 0000000..753fcd0
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/epub/docbook.xsl
@@ -0,0 +1,1690 @@
+<?xml version="1.0"?>
+<xsl:stylesheet
+ xmlns:db="http://docbook.org/ns/docbook"
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:exsl="http://exslt.org/common"
+ xmlns:h="http://www.w3.org/1999/xhtml"
+ xmlns:ncx="http://www.daisy.org/z3986/2005/ncx/"
+ xmlns:ng="http://docbook.org/docbook-ng"
+ xmlns:opf="http://www.idpf.org/2007/opf"
+ xmlns:stext="http://nwalsh.com/xslt/ext/com.nwalsh.saxon.TextFactory"
+ xmlns:str="http://exslt.org/strings"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:xtext="xalan://com.nwalsh.xalan.Text"
+
+ extension-element-prefixes="stext xtext"
+ exclude-result-prefixes="exsl db dc h ncx ng opf stext str xtext"
+
+ version="1.0">
+
+ <xsl:import href="../xhtml-1_1/docbook.xsl" />
+ <xsl:import href="../xhtml-1_1/chunk-common.xsl" />
+ <xsl:include href="../xhtml-1_1/chunk-code.xsl" />
+
+
+ <!-- We want a separate TOC file, please -->
+ <xsl:param name="chunk.tocs.and.lots">1</xsl:param>
+ <xsl:param name="toc.section.depth">2</xsl:param>
+ <xsl:param name="generate.toc">
+ book toc,title
+ </xsl:param>
+
+ <xsl:param name="ade.extensions" select="0"/>
+ <xsl:param name="epub.autolabel" select="'1'"/>
+ <xsl:param name="epub.ncx.depth">4</xsl:param> <!-- Not functional until http://code.google.com/p/epubcheck/issues/detail?id=70 is resolved -->
+
+
+ <xsl:param name="manifest.in.base.dir" select="'1'"/>
+ <xsl:param name="base.dir" select="$epub.oebps.dir"/>
+
+ <xsl:param name="epub.oebps.dir" select="'OEBPS/'"/>
+ <xsl:param name="epub.ncx.filename" select="'toc.ncx'"/>
+ <xsl:param name="epub.container.filename" select="'container.xml'"/>
+ <xsl:param name="epub.opf.filename" select="concat($epub.oebps.dir, 'content.opf')"/>
+ <xsl:param name="epub.cover.filename" select="concat($epub.oebps.dir, 'cover', $html.ext)"/>
+ <xsl:param name="epub.cover.id" select="'cover'"/>
+ <xsl:param name="epub.cover.html" select="'cover.html'" />
+ <xsl:param name="epub.cover.image.id" select="'cover-image'"/>
+ <xsl:param name="epub.cover.linear" select="0" />
+ <xsl:param name="epub.ncx.toc.id">ncxtoc</xsl:param>
+ <xsl:param name="epub.html.toc.id">htmltoc</xsl:param>
+ <xsl:param name="epub.metainf.dir" select="'META-INF/'"/>
+
+ <xsl:param name="epub.embedded.fonts"></xsl:param>
+
+ <!-- Turning this on crashes ADE, which is unbelievably awesome -->
+ <xsl:param name="formal.object.break.after">0</xsl:param>
+
+
+ <!-- Per Bob Stayton:
+ """Process your documents with the css.decoration parameter set to zero.
+ That will avoid the use of style attributes in XHTML elements where they are not permitted."""
+ http://www.sagehill.net/docbookxsl/OtherOutputForms.html#StrictXhtmlValid -->
+ <xsl:param name="css.decoration" select="0"/>
+ <xsl:param name="custom.css.source"></xsl:param> <!-- FIXME: Align with current CSS parameter design -->
+
+ <xsl:param name="callout.graphics" select="1"/>
+ <xsl:param name="callout.graphics.extension">.png</xsl:param>
+ <xsl:param name="callout.graphics.number.limit" select="15"/>
+ <xsl:param name="callout.graphics.path" select="'images/callouts/'"/>
+
+ <!-- no navigation in .epub -->
+ <xsl:param name="suppress.navigation" select="'1'"/>
+
+ <xsl:variable name="toc.params">
+ <xsl:call-template name="find.path.params">
+ <xsl:with-param name="node" select="/*"/>
+ <xsl:with-param name="table" select="normalize-space($generate.toc)"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:variable name="root.is.a.chunk">
+ <xsl:choose>
+ <xsl:when test="/*[not(self::book)][not(sect1) or not(section)]">
+ <xsl:text>1</xsl:text>
+ </xsl:when>
+ <xsl:when test="/book[*[last()][self::bookinfo]]|book[bookinfo]">
+ <xsl:text>1</xsl:text>
+ </xsl:when>
+ <xsl:when test="/book[*[last()][self::info]]|book[info]">
+ <xsl:text>1</xsl:text>
+ </xsl:when>
+ <xsl:when test="/bibliography">
+ <xsl:text>1</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text>0</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:key name="image-filerefs" match="graphic|inlinegraphic|imagedata" use="@fileref"/>
+
+ <xsl:template match="/">
+ <!-- * Get a title for current doc so that we let the user -->
+ <!-- * know what document we are processing at this point. -->
+ <xsl:variable name="doc.title">
+ <xsl:call-template name="get.doc.title" />
+ </xsl:variable>
+ <xsl:choose>
+ <!-- Hack! If someone hands us a DocBook V5.x or DocBook NG document,
+ toss the namespace and continue. Use the docbook5 namespaced
+ stylesheets for DocBook5 if you don't want to use this feature.-->
+ <!-- include extra test for Xalan quirk -->
+ <xsl:when test="$exsl.node.set.available != 0
+ and (*/self::ng:* or */self::db:*)">
+ <xsl:call-template name="log.message">
+ <xsl:with-param name="level">Note</xsl:with-param>
+ <xsl:with-param name="source" select="$doc.title" />
+ <xsl:with-param name="context-desc">
+ <xsl:text>namesp. cut</xsl:text>
+ </xsl:with-param>
+ <xsl:with-param name="message">
+ <xsl:text>stripped namespace before processing</xsl:text>
+ </xsl:with-param>
+ </xsl:call-template>
+ <xsl:variable name="nons">
+ <xsl:apply-templates mode="stripNS" />
+ </xsl:variable>
+ <xsl:call-template name="log.message">
+ <xsl:with-param name="level">Note</xsl:with-param>
+ <xsl:with-param name="source" select="$doc.title" />
+ <xsl:with-param name="context-desc">
+ <xsl:text>namesp. cut</xsl:text>
+ </xsl:with-param>
+ <xsl:with-param name="message">
+ <xsl:text>processing stripped document</xsl:text>
+ </xsl:with-param>
+ </xsl:call-template>
+ <xsl:apply-templates select="exsl:node-set($nons)" />
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:choose>
+ <xsl:when test="$rootid != ''">
+ <xsl:choose>
+ <xsl:when
+ test="count(key('id',$rootid)) = 0">
+ <xsl:message terminate="yes">
+ <xsl:text>ID '</xsl:text>
+ <xsl:value-of select="$rootid" />
+ <xsl:text>' not found in document.</xsl:text>
+ </xsl:message>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:if
+ test="$collect.xref.targets = 'yes' or
+ $collect.xref.targets = 'only'">
+ <xsl:apply-templates
+ select="key('id', $rootid)" mode="collect.targets" />
+ </xsl:if>
+ <xsl:if
+ test="$collect.xref.targets != 'only'">
+ <xsl:message>
+ Formatting from
+ <xsl:value-of select="$rootid" />
+ </xsl:message>
+ <xsl:apply-templates
+ select="key('id',$rootid)" mode="process.root" />
+ <xsl:call-template name="ncx" />
+ </xsl:if>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:if
+ test="$collect.xref.targets = 'yes' or
+ $collect.xref.targets = 'only'">
+ <xsl:apply-templates select="/"
+ mode="collect.targets" />
+ </xsl:if>
+ <xsl:if
+ test="$collect.xref.targets != 'only'">
+ <xsl:apply-templates select="/"
+ mode="process.root" />
+ <xsl:call-template name="ncx" />
+ <xsl:call-template name="opf" />
+ <xsl:call-template name="cover" />
+ <xsl:call-template name="container" />
+ </xsl:if>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+ <xsl:template name="package-identifier">
+ <xsl:choose>
+ <xsl:when test="/*/*[contains(name(.), 'info')]/biblioid">
+ <xsl:if test="/*/*[contains(name(.), 'info')][1]/biblioid[1][@class = 'doi' or
+ @class = 'isbn' or
+ @class = 'isrn' or
+ @class = 'issn']">
+ <xsl:text>urn:</xsl:text>
+ <xsl:value-of select="/*/*[contains(name(.), 'info')][1]/biblioid[1]/@class"/>
+ <xsl:text>:</xsl:text>
+ </xsl:if>
+ <xsl:value-of select="/*/*[contains(name(.), 'info')][1]/biblioid[1]"/>
+ </xsl:when>
+ <xsl:when test="/*/*[contains(name(.), 'info')]/isbn">
+ <xsl:text>urn:isbn:</xsl:text>
+ <xsl:value-of select="/*/*[contains(name(.), 'info')][1]/isbn[1]"/>
+ </xsl:when>
+ <xsl:when test="/*/*[contains(name(.), 'info')]/issn">
+ <xsl:text>urn:issn:</xsl:text>
+ <xsl:value-of select="/*/*[contains(name(.), 'info')][1]/issn[1]"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:choose>
+ <xsl:when test="/*/*[contains(name(.), 'info')]/invpartnumber"> <xsl:value-of select="/*/*[contains(name(.), 'info')][1]/invpartnumber[1]"/> </xsl:when>
+ <xsl:when test="/*/*[contains(name(.), 'info')]/issuenum"> <xsl:value-of select="/*/*[contains(name(.), 'info')][1]/issuenum[1]"/> </xsl:when>
+ <xsl:when test="/*/*[contains(name(.), 'info')]/productnumber"> <xsl:value-of select="/*/*[contains(name(.), 'info')][1]/productnumber[1]"/> </xsl:when>
+ <xsl:when test="/*/*[contains(name(.), 'info')]/seriesvolnums"> <xsl:value-of select="/*/*[contains(name(.), 'info')][1]/seriesvolnums[1]"/> </xsl:when>
+ <xsl:when test="/*/*[contains(name(.), 'info')]/volumenum"> <xsl:value-of select="/*/*[contains(name(.), 'info')][1]/volumenum[1]"/> </xsl:when>
+ <!-- Deprecated -->
+ <xsl:when test="/*/*[contains(name(.), 'info')]/pubsnumber"> <xsl:value-of select="/*/*[contains(name(.), 'info')][1]/pubsnumber[1]"/> </xsl:when>
+ </xsl:choose>
+ <xsl:text>_</xsl:text>
+ <xsl:choose>
+ <xsl:when test="/*/@id">
+ <xsl:value-of select="/*/@id"/>
+ </xsl:when>
+ <xsl:when test="/*/@xml:id">
+ <xsl:value-of select="/*/@xml:id"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <!-- TODO: Do UUIDs here -->
+ <xsl:value-of select="generate-id(/*)"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+ <xsl:template name="opf">
+ <xsl:variable name="package-identifier-id"><xsl:value-of select="concat(name(/*), 'id')"/></xsl:variable>
+ <xsl:variable name="doc.title">
+ <xsl:call-template name="get.doc.title" />
+ </xsl:variable>
+ <xsl:call-template name="write.chunk">
+ <xsl:with-param name="filename">
+ <xsl:value-of select="$epub.opf.filename" />
+ </xsl:with-param>
+ <xsl:with-param name="method" select="'xml'" />
+ <xsl:with-param name="encoding" select="'utf-8'" />
+ <xsl:with-param name="indent" select="'no'" />
+ <xsl:with-param name="quiet" select="$chunk.quietly" />
+ <xsl:with-param name="doctype-public" select="''"/> <!-- intentionally blank -->
+ <xsl:with-param name="doctype-system" select="''"/> <!-- intentionally blank -->
+ <xsl:with-param name="content">
+ <xsl:element namespace="http://www.idpf.org/2007/opf" name="package">
+ <xsl:attribute name="version">2.0</xsl:attribute>
+ <xsl:attribute name="unique-identifier"> <xsl:value-of select="$package-identifier-id"/> </xsl:attribute>
+
+ <xsl:element namespace="http://www.idpf.org/2007/opf" name="metadata">
+ <xsl:element name="dc:identifier">
+ <xsl:attribute name="id"><xsl:value-of select="$package-identifier-id"/></xsl:attribute>
+ <xsl:call-template name="package-identifier"/>
+ </xsl:element>
+
+ <xsl:element name="dc:title">
+ <xsl:value-of select="normalize-space($doc.title)"/>
+ </xsl:element>
+
+ <xsl:apply-templates select="/*/*[contains(name(.), 'info')]/*"
+ mode="opf.metadata"/>
+ <xsl:element name="dc:language">
+ <xsl:call-template name="l10n.language">
+ <xsl:with-param name="target" select="/*"/>
+ </xsl:call-template>
+ </xsl:element>
+
+ <xsl:if test="/*/*[cover or contains(name(.), 'info')]//mediaobject[@role='cover' or ancestor::cover]">
+ <xsl:element namespace="http://www.idpf.org/2007/opf" name="meta">
+ <xsl:attribute name="name">cover</xsl:attribute>
+ <xsl:attribute name="content">
+ <xsl:value-of select="$epub.cover.image.id"/>
+ </xsl:attribute>
+ </xsl:element>
+ </xsl:if>
+
+ </xsl:element>
+ <xsl:call-template name="opf.manifest"/>
+ <xsl:call-template name="opf.spine"/>
+ <xsl:call-template name="opf.guide"/>
+
+ </xsl:element>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:template>
+
+ <xsl:template name="container">
+ <xsl:call-template name="write.chunk">
+ <xsl:with-param name="filename">
+ <xsl:value-of select="$epub.metainf.dir" />
+ <xsl:value-of select="$epub.container.filename" />
+ </xsl:with-param>
+ <xsl:with-param name="method" select="'xml'" />
+ <xsl:with-param name="encoding" select="'utf-8'" />
+ <xsl:with-param name="indent" select="'no'" />
+ <xsl:with-param name="quiet" select="$chunk.quietly" />
+ <xsl:with-param name="doctype-public" select="''"/> <!-- intentionally blank -->
+ <xsl:with-param name="doctype-system" select="''"/> <!-- intentionally blank -->
+
+ <xsl:with-param name="content">
+ <xsl:element namespace="urn:oasis:names:tc:opendocument:xmlns:container" name="container">
+ <xsl:attribute name="version">1.0</xsl:attribute>
+ <xsl:element namespace="urn:oasis:names:tc:opendocument:xmlns:container" name="rootfiles">
+ <xsl:element namespace="urn:oasis:names:tc:opendocument:xmlns:container" name="rootfile">
+ <xsl:attribute name="full-path">
+ <xsl:value-of select="$epub.opf.filename" />
+ </xsl:attribute>
+ <xsl:attribute name="media-type">
+ <xsl:text>application/oebps-package+xml</xsl:text>
+ </xsl:attribute>
+ </xsl:element>
+ </xsl:element>
+ </xsl:element>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:template>
+
+ <xsl:template name="ncx">
+ <xsl:call-template name="write.chunk">
+ <xsl:with-param name="filename">
+ <xsl:if test="$manifest.in.base.dir != 0">
+ <xsl:value-of select="$base.dir" />
+ </xsl:if>
+ <xsl:value-of select="$epub.ncx.filename" />
+ </xsl:with-param>
+ <xsl:with-param name="method" select="'xml'" />
+ <xsl:with-param name="encoding" select="'utf-8'" />
+ <xsl:with-param name="indent" select="'no'" />
+ <xsl:with-param name="quiet" select="$chunk.quietly" />
+ <xsl:with-param name="doctype-public" select="''"/> <!-- intentionally blank -->
+ <xsl:with-param name="doctype-system" select="''"/> <!-- intentionally blank -->
+ <xsl:with-param name="content">
+ <xsl:element name="ncx" namespace="http://www.daisy.org/z3986/2005/ncx/">
+ <xsl:attribute name="version">2005-1</xsl:attribute>
+
+ <!-- Via Martin Goerner: On covers: the IDPF2.0 standard unfortunately does not have a provision for
+ covers. We had to add one and we did so in conjunction with the IDPF and
+ various publishers. The tag chosen to define the covers is:
+ <meta name="cover" content="-reference to a manifest item-">
+ Then, we also added a bit of logic to get rid cleanly of the HTML cover
+ people usually add because the logical cover is not specced by the IDPF. So,
+ if the HTML cover item is marked linear="no" AND there is a guide item of
+ type="cover" pointing to it AND there is a logical cover specified in a
+ <meta name="cover"> tag, THEN, the HTML cover is discarded. -->
+ <xsl:element name="head" namespace="http://www.daisy.org/z3986/2005/ncx/">
+ <xsl:if test="/*/*[cover or contains(name(.), 'info')]//mediaobject[@role='cover' or ancestor::cover]">
+ <xsl:element name="meta" namespace="http://www.daisy.org/z3986/2005/ncx/">
+ <xsl:attribute name="name">cover</xsl:attribute>
+ <xsl:attribute name="content">
+ <xsl:value-of select="$epub.cover.id"/>
+ </xsl:attribute>
+ </xsl:element>
+ </xsl:if>
+ <xsl:element name="meta" namespace="http://www.daisy.org/z3986/2005/ncx/">
+ <xsl:attribute name="name">dtb:uid</xsl:attribute>
+ <xsl:attribute name="content"><xsl:call-template name="package-identifier"/></xsl:attribute>
+ </xsl:element>
+ </xsl:element>
+
+ <xsl:choose>
+ <xsl:when test="$rootid != ''">
+ <xsl:variable name="title">
+ <xsl:if test="$epub.autolabel != 0">
+ <xsl:variable name="label.markup">
+ <xsl:apply-templates select="key('id',$rootid)" mode="label.markup" />
+ </xsl:variable>
+ <xsl:if test="normalize-space($label.markup)">
+ <xsl:value-of select="concat($label.markup,$autotoc.label.separator)" />
+ </xsl:if>
+ </xsl:if>
+ <xsl:apply-templates select="key('id',$rootid)" mode="title.markup" />
+ </xsl:variable>
+ <xsl:variable name="href">
+ <xsl:call-template name="href.target.with.base.dir">
+ <xsl:with-param name="object" select="key('id',$rootid)" />
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:element name="docTitle" namespace="http://www.daisy.org/z3986/2005/ncx/">
+ <xsl:element name="text" namespace="http://www.daisy.org/z3986/2005/ncx/"><xsl:value-of select="normalize-space($title)" /> </xsl:element>
+ </xsl:element>
+ <xsl:element name="navMap" namespace="http://www.daisy.org/z3986/2005/ncx/">
+ <xsl:apply-templates select="key('id',$rootid)/*" mode="ncx" />
+ </xsl:element>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:variable name="title">
+ <xsl:if test="$epub.autolabel != 0">
+ <xsl:variable name="label.markup">
+ <xsl:apply-templates select="/*" mode="label.markup" />
+ </xsl:variable>
+ <xsl:if test="normalize-space($label.markup)">
+ <xsl:value-of select="concat($label.markup,$autotoc.label.separator)" />
+ </xsl:if>
+ </xsl:if>
+ <xsl:apply-templates select="/*" mode="title.markup" />
+ </xsl:variable>
+ <xsl:variable name="href">
+ <xsl:call-template name="href.target.with.base.dir">
+ <xsl:with-param name="object" select="/" />
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:element name="docTitle" namespace="http://www.daisy.org/z3986/2005/ncx/">
+ <xsl:element name="text" namespace="http://www.daisy.org/z3986/2005/ncx/">
+ <xsl:value-of select="normalize-space($title)" />
+ </xsl:element>
+ </xsl:element>
+ <xsl:element name="navMap" namespace="http://www.daisy.org/z3986/2005/ncx/">
+ <xsl:choose>
+ <xsl:when test="$root.is.a.chunk != '0'">
+ <xsl:apply-templates select="/*" mode="ncx" />
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="/*/*" mode="ncx" />
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:element>
+ </xsl:otherwise>
+
+ </xsl:choose>
+ </xsl:element>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:template>
+
+ <xsl:template match="book|
+ article|
+ part|
+ reference|
+ preface|
+ chapter|
+ bibliography|
+ appendix|
+ glossary|
+ section|
+ sect1|
+ sect2|
+ sect3|
+ sect4|
+ sect5|
+ refentry|
+ colophon|
+ bibliodiv[title]|
+ setindex|
+ index"
+ mode="ncx">
+ <xsl:variable name="depth" select="count(ancestor::*)"/>
+ <xsl:variable name="title">
+ <xsl:if test="$epub.autolabel != 0">
+ <xsl:variable name="label.markup">
+ <xsl:apply-templates select="." mode="label.markup" />
+ </xsl:variable>
+ <xsl:if test="normalize-space($label.markup)">
+ <xsl:value-of
+ select="concat($label.markup,$autotoc.label.separator)" />
+ </xsl:if>
+ </xsl:if>
+ <xsl:apply-templates select="." mode="title.markup" />
+ </xsl:variable>
+
+ <xsl:variable name="href">
+ <xsl:call-template name="href.target.with.base.dir">
+ <xsl:with-param name="context" select="/" />
+ <!-- Generate links relative to the location of root file/toc.xml file -->
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="id">
+ <xsl:value-of select="generate-id(.)"/>
+ </xsl:variable>
+ <xsl:variable name="order">
+ <xsl:value-of select="$depth +
+ count(preceding::part|
+ preceding::reference|
+ preceding::book[parent::set]|
+ preceding::preface|
+ preceding::chapter|
+ preceding::bibliography|
+ preceding::appendix|
+ preceding::article|
+ preceding::glossary|
+ preceding::section[not(parent::partintro)]|
+ preceding::sect1[not(parent::partintro)]|
+ preceding::sect2[not(ancestor::partintro)]|
+ preceding::sect3[not(ancestor::partintro)]|
+ preceding::sect4[not(ancestor::partintro)]|
+ preceding::sect5[not(ancestor::partintro)]|
+ preceding::refentry|
+ preceding::colophon|
+ preceding::bibliodiv[title]|
+ preceding::index)"/>
+ </xsl:variable>
+
+ <xsl:element name="navPoint" namespace="http://www.daisy.org/z3986/2005/ncx/">
+ <xsl:attribute name="id">
+ <xsl:value-of select="$id"/>
+ </xsl:attribute>
+
+ <xsl:attribute name="playOrder">
+ <xsl:choose>
+ <xsl:when test="/*[self::set]">
+ <xsl:value-of select="$order"/>
+ </xsl:when>
+ <xsl:when test="$root.is.a.chunk != '0'">
+ <xsl:value-of select="$order + 1"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$order - 0"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:attribute>
+ <xsl:element name="navLabel" namespace="http://www.daisy.org/z3986/2005/ncx/">
+ <xsl:element name="text" namespace="http://www.daisy.org/z3986/2005/ncx/"><xsl:value-of select="normalize-space($title)"/> </xsl:element>
+ </xsl:element>
+ <xsl:element name="content" namespace="http://www.daisy.org/z3986/2005/ncx/">
+ <xsl:attribute name="src">
+ <xsl:value-of select="$href"/>
+ </xsl:attribute>
+ </xsl:element>
+ <xsl:apply-templates select="book[parent::set]|part|reference|preface|chapter|bibliography|appendix|article|glossary|section|sect1|sect2|sect3|sect4|sect5|refentry|colophon|bibliodiv[title]|setindex|index" mode="ncx"/>
+ </xsl:element>
+
+ </xsl:template>
+
+ <xsl:template match="*" mode="opf.metadata">
+ <!-- override if you care -->
+ </xsl:template>
+
+ <xsl:template match="authorgroup" mode="opf.metadata">
+ <xsl:apply-templates select="author|corpauthor" mode="opf.metadata"/>
+ </xsl:template>
+
+ <xsl:template match="author|corpauthor" mode="opf.metadata">
+ <xsl:variable name="n">
+ <xsl:call-template name="person.name">
+ <xsl:with-param name="node" select="."/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:element name="dc:creator">
+ <xsl:attribute name="opf:file-as">
+ <xsl:call-template name="person.name.last-first">
+ <xsl:with-param name="node" select="."/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:value-of select="normalize-space(string($n))"/>
+ </xsl:element>
+ </xsl:template>
+
+ <xsl:template match="date" mode="opf.metadata">
+ <xsl:element name="dc:date">
+ <xsl:value-of select="normalize-space(string(.))"/>
+ </xsl:element>
+ </xsl:template>
+
+
+ <!-- Space separate the compontents of the abstract (dropping the inline markup, sadly) -->
+ <xsl:template match="abstract" mode="opf.metadata">
+ <xsl:element name="dc:description">
+ <xsl:for-each select="formalpara|para|simpara|title">
+ <xsl:choose>
+ <xsl:when test="self::formalpara">
+ <xsl:value-of select="normalize-space(string(title))"/>
+ <xsl:text>: </xsl:text>
+ <xsl:value-of select="normalize-space(string(para))"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="normalize-space(string(.))"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:if test="self::title">
+ <xsl:text>:</xsl:text>
+ </xsl:if>
+ <xsl:if test="not(position() = last())">
+ <xsl:text> </xsl:text>
+ </xsl:if>
+ </xsl:for-each>
+ </xsl:element>
+ </xsl:template>
+
+ <xsl:template match="subjectset" mode="opf.metadata">
+ <xsl:apply-templates select="subject/subjectterm" mode="opf.metadata"/>
+ </xsl:template>
+
+ <xsl:template match="subjectterm" mode="opf.metadata">
+ <xsl:element name="dc:subject">
+ <xsl:value-of select="normalize-space(string(.))"/>
+ </xsl:element>
+ </xsl:template>
+
+ <xsl:template match="publisher" mode="opf.metadata">
+ <xsl:apply-templates select="publishername" mode="opf.metadata"/>
+ </xsl:template>
+
+ <xsl:template match="publishername" mode="opf.metadata">
+ <xsl:element name="dc:publisher">
+ <xsl:value-of select="normalize-space(string(.))"/>
+ </xsl:element>
+ </xsl:template>
+
+ <xsl:template match="copyright" mode="opf.metadata">
+ <xsl:variable name="copyright.date">
+ <xsl:call-template name="copyright.years">
+ <xsl:with-param name="years" select="year"/>
+ <xsl:with-param name="print.ranges" select="$make.year.ranges"/>
+ <xsl:with-param name="single.year.ranges" select="$make.single.year.ranges"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:if test="not(../date)">
+ <xsl:element name="dc:date">
+ <xsl:call-template name="copyright.years">
+ <xsl:with-param name="years" select="year[last()]"/>
+ <xsl:with-param name="print.ranges" select="0"/>
+ <xsl:with-param name="single.year.ranges" select="0"/>
+ </xsl:call-template>
+ </xsl:element>
+ </xsl:if>
+ <xsl:element name="dc:rights">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'Copyright'"/>
+ </xsl:call-template>
+ <xsl:call-template name="gentext.space"/>
+ <xsl:text>&#x00A9;</xsl:text>
+ <xsl:call-template name="gentext.space"/>
+ <xsl:value-of select="$copyright.date"/>
+ <xsl:call-template name="gentext.space"/>
+ <xsl:apply-templates select="holder" mode="titlepage.mode"/>
+ </xsl:element>
+ </xsl:template>
+
+ <xsl:template name="opf.guide">
+ <xsl:if test="contains($toc.params, 'toc') or
+ /*/*[cover or contains(name(.), 'info')]//mediaobject[@role='cover' or ancestor::cover]">
+ <xsl:element namespace="http://www.idpf.org/2007/opf" name="guide">
+ <xsl:if test="/*/*[cover or contains(name(.), 'info')]//mediaobject[@role='cover' or ancestor::cover]">
+ <xsl:element namespace="http://www.idpf.org/2007/opf" name="reference">
+ <xsl:attribute name="href">
+ <xsl:value-of select="$epub.cover.html" />
+ </xsl:attribute>
+ <xsl:attribute name="type">cover</xsl:attribute>
+ <xsl:attribute name="title">Cover</xsl:attribute>
+ </xsl:element>
+ </xsl:if>
+
+ <xsl:if test="contains($toc.params, 'toc')">
+ <xsl:element namespace="http://www.idpf.org/2007/opf" name="reference">
+ <xsl:attribute name="href">
+ <xsl:call-template name="toc-href">
+ <xsl:with-param name="node" select="/*"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:attribute name="type">toc</xsl:attribute>
+ <xsl:attribute name="title">Table of Contents</xsl:attribute>
+ </xsl:element>
+ </xsl:if>
+ </xsl:element>
+ </xsl:if>
+ </xsl:template>
+
+ <xsl:template name="opf.spine">
+
+ <xsl:element namespace="http://www.idpf.org/2007/opf" name="spine">
+ <xsl:attribute name="toc">
+ <xsl:value-of select="$epub.ncx.toc.id"/>
+ </xsl:attribute>
+
+ <xsl:if test="/*/*[cover or contains(name(.), 'info')]//mediaobject[@role='cover' or ancestor::cover]">
+ <xsl:element namespace="http://www.idpf.org/2007/opf" name="itemref">
+ <xsl:attribute name="idref">
+ <xsl:value-of select="$epub.cover.id"/>
+ </xsl:attribute>
+ <xsl:attribute name="linear">
+ <xsl:choose>
+ <xsl:when test="$epub.cover.linear">
+ <xsl:text>yes</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>no</xsl:otherwise>
+ </xsl:choose>
+ </xsl:attribute>
+ </xsl:element>
+ </xsl:if>
+
+
+ <xsl:if test="contains($toc.params, 'toc')">
+ <xsl:element namespace="http://www.idpf.org/2007/opf" name="itemref">
+ <xsl:attribute name="idref"> <xsl:value-of select="$epub.html.toc.id"/> </xsl:attribute>
+ <xsl:attribute name="linear">yes</xsl:attribute>
+ </xsl:element>
+ </xsl:if>
+
+ <!-- TODO: be nice to have a idref="titlepage" here -->
+ <xsl:choose>
+ <xsl:when test="$root.is.a.chunk != '0'">
+ <xsl:apply-templates select="/*" mode="opf.spine"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="/*/*" mode="opf.spine"/>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ </xsl:element>
+ </xsl:template>
+
+ <xsl:template match="*" mode="opf.spine">
+ <xsl:variable name="is.chunk">
+ <xsl:call-template name="chunk">
+ <xsl:with-param name="node" select="."/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:if test="$is.chunk != 0">
+ <xsl:element namespace="http://www.idpf.org/2007/opf" name="itemref">
+ <xsl:attribute name="idref">
+ <xsl:value-of select="generate-id(.)"/>
+ </xsl:attribute>
+ </xsl:element>
+ <xsl:apply-templates select="*|.//refentry" mode="opf.spine"/>
+ </xsl:if>
+ </xsl:template>
+
+ <xsl:template name="opf.manifest">
+ <xsl:element namespace="http://www.idpf.org/2007/opf" name="manifest">
+ <xsl:element namespace="http://www.idpf.org/2007/opf" name="item">
+ <xsl:attribute name="id"> <xsl:value-of select="$epub.ncx.toc.id"/> </xsl:attribute>
+ <xsl:attribute name="media-type">application/x-dtbncx+xml</xsl:attribute>
+ <xsl:attribute name="href"><xsl:value-of select="$epub.ncx.filename"/> </xsl:attribute>
+ </xsl:element>
+
+ <xsl:if test="contains($toc.params, 'toc')">
+ <xsl:element namespace="http://www.idpf.org/2007/opf" name="item">
+ <xsl:attribute name="id"> <xsl:value-of select="$epub.html.toc.id"/> </xsl:attribute>
+ <xsl:attribute name="media-type">application/xhtml+xml</xsl:attribute>
+ <xsl:attribute name="href">
+ <xsl:call-template name="toc-href">
+ <xsl:with-param name="node" select="/*"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ </xsl:element>
+ </xsl:if>
+
+ <xsl:if test="$html.stylesheet != ''">
+ <xsl:element namespace="http://www.idpf.org/2007/opf" name="item">
+ <xsl:attribute name="media-type">text/css</xsl:attribute>
+ <xsl:attribute name="id">css</xsl:attribute>
+ <xsl:attribute name="href"><xsl:value-of select="$html.stylesheet"/></xsl:attribute>
+ </xsl:element>
+ </xsl:if>
+
+ <xsl:if test="/*/*[cover or contains(name(.), 'info')]//mediaobject[@role='cover' or ancestor::cover]">
+ <xsl:element namespace="http://www.idpf.org/2007/opf" name="item">
+ <xsl:attribute name="id"> <xsl:value-of select="$epub.cover.id"/> </xsl:attribute>
+ <xsl:attribute name="href">
+ <xsl:value-of select="$epub.cover.html"/>
+ </xsl:attribute>
+ <xsl:attribute name="media-type">application/xhtml+xml</xsl:attribute>
+ </xsl:element>
+ </xsl:if>
+
+ <xsl:choose>
+ <xsl:when test="$epub.embedded.fonts != '' and not(contains($epub.embedded.fonts, ','))">
+ <xsl:call-template name="embedded-font-item">
+ <xsl:with-param name="font.file" select="$epub.embedded.fonts"/> <!-- There is just one -->
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="$epub.embedded.fonts != ''">
+ <xsl:variable name="font.file.tokens" select="str:tokenize($epub.embedded.fonts, ',')"/>
+ <xsl:for-each select="exsl:node-set($font.file.tokens)">
+ <xsl:call-template name="embedded-font-item">
+ <xsl:with-param name="font.file" select="."/>
+ <xsl:with-param name="font.order" select="position()"/>
+ </xsl:call-template>
+ </xsl:for-each>
+ </xsl:when>
+ </xsl:choose>
+
+ <!-- TODO: be nice to have a id="titlepage" here -->
+ <xsl:apply-templates select="//part|
+ //book[*[last()][self::bookinfo]]|
+ //book[bookinfo]|
+ /set|
+ /set/book|
+ //reference|
+ //preface|
+ //chapter|
+ //bibliography|
+ //appendix|
+ //article|
+ //glossary|
+ //section|
+ //sect1|
+ //sect2|
+ //sect3|
+ //sect4|
+ //sect5|
+ //refentry|
+ //colophon|
+ //bibliodiv[title]|
+ //index|
+ //setindex|
+ //graphic|
+ //inlinegraphic|
+ //mediaobject|
+ //mediaobjectco|
+ //inlinemediaobject"
+ mode="opf.manifest"/>
+ <xsl:call-template name="opf.calloutlist"/>
+ </xsl:element>
+ </xsl:template>
+
+ <xsl:template name="opf.calloutlist">
+ <xsl:variable name="format">
+ <xsl:call-template name="guess-media-type">
+ <xsl:with-param name="ext" select="$callout.graphics.extension"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:if test="(//calloutlist|//co)">
+ <xsl:call-template name="opf.reference.callout">
+ <xsl:with-param name="conum" select="1"/>
+ <xsl:with-param name="format" select="$format"/>
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:template>
+
+ <xsl:template name="opf.reference.callout">
+ <xsl:param name="conum"/>
+ <xsl:param name="format"/>
+
+ <xsl:variable name="filename" select="concat($callout.graphics.path, $conum, $callout.graphics.extension)"/>
+
+ <xsl:element namespace="http://www.idpf.org/2007/opf" name="item">
+ <xsl:attribute name="id"> <xsl:value-of select="concat(generate-id(.), 'callout', $conum)"/> </xsl:attribute>
+ <xsl:attribute name="href"> <xsl:value-of select="$filename"/> </xsl:attribute>
+ <xsl:attribute name="media-type">
+ <xsl:value-of select="$format"/>
+ </xsl:attribute>
+ </xsl:element>
+ <xsl:if test="($conum &lt; $callout.graphics.number.limit)">
+ <xsl:call-template name="opf.reference.callout">
+ <xsl:with-param name="conum" select="$conum + 1"/>
+ <xsl:with-param name="format" select="$format"/>
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:template>
+
+ <xsl:template name="guess-media-type">
+ <xsl:param name="ext"></xsl:param>
+ <xsl:choose>
+ <xsl:when test="contains($ext, '.gif')">
+ <xsl:text>image/gif</xsl:text>
+ </xsl:when>
+ <xsl:when test="contains($ext, 'GIF')">
+ <xsl:text>image/gif</xsl:text>
+ </xsl:when>
+ <xsl:when test="contains($ext, '.png')">
+ <xsl:text>image/png</xsl:text>
+ </xsl:when>
+ <xsl:when test="contains($ext, 'PNG')">
+ <xsl:text>image/png</xsl:text>
+ </xsl:when>
+ <xsl:when test="contains($ext, '.jpeg')">
+ <xsl:text>image/jpeg</xsl:text>
+ </xsl:when>
+ <xsl:when test="contains($ext, 'JPEG')">
+ <xsl:text>image/jpeg</xsl:text>
+ </xsl:when>
+ <xsl:when test="contains($ext, '.jpg')">
+ <xsl:text>image/jpeg</xsl:text>
+ </xsl:when>
+ <xsl:when test="contains($ext, 'JPG')">
+ <xsl:text>image/jpeg</xsl:text>
+ </xsl:when>
+ <xsl:when test="contains($ext, '.svg')">
+ <xsl:text>image/svg+xml</xsl:text>
+ </xsl:when>
+ <xsl:when test="contains($ext, 'SVG')">
+ <xsl:text>image/svg+xml</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <!-- we failed -->
+ <xsl:text></xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+ <xsl:template match="mediaobject|
+ mediaobjectco|
+ inlinemediaobject"
+ mode="opf.manifest">
+
+ <xsl:variable name="olist" select="imageobject|imageobjectco |videoobject|audioobject |textobject"/>
+
+ <xsl:variable name="object.index">
+ <xsl:call-template name="select.mediaobject.index">
+ <xsl:with-param name="olist" select="$olist"/>
+ <xsl:with-param name="count" select="1"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="object" select="$olist[position() = $object.index]"/>
+
+ <xsl:choose>
+ <xsl:when test="$object/descendant::imagedata[@format = 'GIF' or
+ @format = 'GIF87a' or
+ @format = 'GIF89a' or
+ @format = 'JPEG' or
+ @format = 'JPG' or
+ @format = 'PNG' or
+ @format = 'SVG']">
+ <xsl:apply-templates select="$object[descendant::imagedata[@format = 'GIF' or
+ @format = 'GIF87a' or
+ @format = 'GIF89a' or
+ @format = 'JPEG' or
+ @format = 'JPG' or
+ @format = 'PNG' or
+ @format = 'SVG']][1]/imagedata"
+ mode="opf.manifest"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="$object/imagedata[1]"
+ mode="opf.manifest"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+ <xsl:template match="cover/mediaobject|
+ mediaobject[@role='cover']"
+ mode="opf.manifest">
+ <xsl:choose>
+ <xsl:when test="imageobject[@role='front-large']">
+ <xsl:apply-templates select="imageobject[@role='front-large']/imagedata"
+ mode="opf.manifest"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="imageobject/imagedata[1]"
+ mode="opf.manifest"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+ <xsl:template match="mediaobjectco"
+ mode="opf.manifest">
+ <xsl:message>WARNING: mediaobjectco almost certainly will not render as expected in .epub!</xsl:message>
+ <xsl:apply-templates select="imageobjectco/imageobject/imagedata"
+ mode="opf.manifest"/>
+ </xsl:template>
+
+ <!-- TODO: Barf (xsl:message terminate=yes) if you find a graphic with no reasonable format or a mediaobject w/o same? [option to not die?] -->
+
+ <!-- wish I had XSLT2 ...-->
+ <!-- TODO: priority a hack -->
+ <xsl:template match="graphic[not(@format)]|
+ inlinegraphic[not(@format)]|
+ imagedata[not(@format)]"
+ mode="opf.manifest">
+ <xsl:variable name="filename">
+ <xsl:choose>
+ <xsl:when test="contains(name(.), 'graphic')">
+ <xsl:choose>
+ <xsl:when test="@entityref">
+ <xsl:value-of select="unparsed-entity-uri(@entityref)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="@fileref"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="mediaobject.filename">
+ <xsl:with-param name="object" select=".."/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:variable name="format">
+ <xsl:call-template name="guess-media-type">
+ <xsl:with-param name="ext" select="@fileref"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:variable name="fr" select="@fileref"/>
+ <xsl:if test="$format != ''">
+ <!-- only do this if we're the first file to match -->
+ <!-- TODO: Why can't this be simple equality?? (I couldn't get it to work) -->
+ <xsl:if test="generate-id(.) = generate-id(key('image-filerefs', $fr)[1])">
+ <xsl:element namespace="http://www.idpf.org/2007/opf" name="item">
+ <xsl:attribute name="id">
+ <xsl:choose>
+ <xsl:when test="ancestor::mediaobject[@role='cover'] and parent::*[@role='front-large']">
+ <xsl:value-of select="$epub.cover.image.id"/>
+ </xsl:when>
+ <xsl:when test="ancestor::mediaobject[@role='cover'] and (count(ancestor::mediaobject//imageobject) = 1)">
+ <xsl:value-of select="$epub.cover.image.id"/>
+ </xsl:when>
+ <xsl:when test="ancestor::cover">
+ <xsl:value-of select="$epub.cover.image.id"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="generate-id(.)"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:attribute>
+ <xsl:attribute name="href"> <xsl:value-of select="$filename"/> </xsl:attribute>
+ <xsl:attribute name="media-type">
+ <xsl:value-of select="$format"/>
+ </xsl:attribute>
+ </xsl:element>
+ </xsl:if>
+ </xsl:if>
+ </xsl:template>
+
+ <!-- Note: Selection of the first interesting imagedata is done in the select -->
+ <xsl:template match="graphic[@format = 'GIF' or @format = 'GIF87a' or @format = 'GIF89a' or @format = 'JPEG' or @format = 'JPG' or @format = 'PNG' or @format = 'SVG']|
+ inlinegraphic[@format = 'GIF' or @format = 'GIF87a' or @format = 'GIF89a' or @format = 'JPEG' or @format = 'JPG' or @format = 'PNG' or @format = 'SVG']|
+ imagedata[@format]"
+ mode="opf.manifest">
+ <xsl:variable name="filename">
+ <xsl:choose>
+ <xsl:when test="contains(name(.), 'graphic')">
+ <xsl:choose>
+ <xsl:when test="@entityref">
+ <xsl:value-of select="unparsed-entity-uri(@entityref)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="@fileref"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="mediaobject.filename">
+ <xsl:with-param name="object" select=".."/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:variable name="fr" select="@fileref"/>
+ <!-- only do this if we're the first file to match -->
+ <!-- TODO: Why can't this be simple equality?? (I couldn't get it to work) -->
+ <xsl:if test="generate-id(.) = generate-id(key('image-filerefs', $fr)[1])">
+ <xsl:element namespace="http://www.idpf.org/2007/opf" name="item">
+ <xsl:attribute name="id">
+ <xsl:choose>
+ <xsl:when test="ancestor::mediaobject[@role='cover'] and parent::*[@role='front-large']">
+ <xsl:value-of select="$epub.cover.image.id"/>
+ </xsl:when>
+ <xsl:when test="ancestor::mediaobject[@role='cover'] and (count(ancestor::mediaobject//imageobject) = 1)">
+ <xsl:value-of select="$epub.cover.image.id"/>
+ </xsl:when>
+ <xsl:when test="ancestor::cover">
+ <xsl:value-of select="$epub.cover.image.id"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="generate-id(.)"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:attribute>
+ <xsl:attribute name="href"> <xsl:value-of select="$filename"/> </xsl:attribute>
+ <xsl:attribute name="media-type">
+ <xsl:call-template name="guess-media-type">
+ <xsl:with-param name="ext" select="@format"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ </xsl:element>
+ </xsl:if>
+ </xsl:template>
+
+ <!-- Warning: While the test indicate this match list is accurate, it may
+ need further tweaking to ensure _never_ dropping generated content (XHTML)
+ from the manifest (OPF file) -->
+ <xsl:template
+ match="set|
+ book[parent::set]|
+ book[*[last()][self::bookinfo]]|
+ book[bookinfo]|
+ article|
+ part|
+ reference|
+ preface|
+ chapter|
+ bibliography|
+ appendix|
+ glossary|
+ section|
+ sect1|
+ sect2|
+ sect3|
+ sect4|
+ sect5|
+ refentry|
+ colophon|
+ bibliodiv[title]|
+ setindex|
+ index"
+ mode="opf.manifest">
+ <xsl:variable name="href">
+ <xsl:call-template name="href.target.with.base.dir">
+ <xsl:with-param name="context" select="/" />
+ <!-- Generate links relative to the location of root file/toc.xml file -->
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="id">
+ <xsl:value-of select="generate-id(.)"/>
+ </xsl:variable>
+
+ <xsl:variable name="is.chunk">
+ <xsl:call-template name="chunk">
+ <xsl:with-param name="node" select="."/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:if test="$is.chunk != 0">
+ <xsl:element namespace="http://www.idpf.org/2007/opf" name="item">
+ <xsl:attribute name="id"> <xsl:value-of select="$id"/> </xsl:attribute>
+ <xsl:attribute name="href"> <xsl:value-of select="$href"/> </xsl:attribute>
+ <xsl:attribute name="media-type">application/xhtml+xml</xsl:attribute>
+ </xsl:element>
+ </xsl:if>
+ </xsl:template>
+
+ <xsl:template match="text()" mode="ncx" />
+
+ <xsl:template name="html.head">
+ <xsl:param name="prev" select="/foo"/>
+ <xsl:param name="next" select="/foo"/>
+ <xsl:variable name="this" select="."/>
+ <xsl:variable name="home" select="/*[1]"/>
+ <xsl:variable name="up" select="parent::*"/>
+
+ <head xmlns="http://www.w3.org/1999/xhtml">
+ <xsl:call-template name="system.head.content"/>
+ <xsl:call-template name="head.content"/>
+
+ <xsl:call-template name="user.head.content"/>
+ </head>
+ </xsl:template>
+
+ <!-- OVERRIDES xhtml-1_1/graphics.xsl -->
+ <!-- we can't deal with no img/@alt, because it's required. Try grabbing a title before it instead (hopefully meaningful) -->
+ <xsl:template name="process.image.attributes">
+ <xsl:param name="alt"/>
+ <xsl:param name="html.width"/>
+ <xsl:param name="html.depth"/>
+ <xsl:param name="longdesc"/>
+ <xsl:param name="scale"/>
+ <xsl:param name="scalefit"/>
+ <xsl:param name="scaled.contentdepth"/>
+ <xsl:param name="scaled.contentwidth"/>
+ <xsl:param name="viewport"/>
+
+ <xsl:choose>
+ <xsl:when test="@contentwidth or @contentdepth">
+ <!-- ignore @width/@depth, @scale, and @scalefit if specified -->
+ <xsl:if test="@contentwidth and $scaled.contentwidth != ''">
+ <xsl:attribute name="width">
+ <xsl:value-of select="$scaled.contentwidth"/>
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:if test="@contentdepth and $scaled.contentdepth != ''">
+ <xsl:attribute name="height">
+ <xsl:value-of select="$scaled.contentdepth"/>
+ </xsl:attribute>
+ </xsl:if>
+ </xsl:when>
+
+ <xsl:when test="number($scale) != 1.0">
+ <!-- scaling is always uniform, so we only have to specify one dimension -->
+ <!-- ignore @scalefit if specified -->
+ <xsl:attribute name="width">
+ <xsl:value-of select="$scaled.contentwidth"/>
+ </xsl:attribute>
+ </xsl:when>
+
+ <xsl:when test="$scalefit != 0">
+ <xsl:choose>
+ <xsl:when test="contains($html.width, '%')">
+ <xsl:choose>
+ <xsl:when test="$viewport != 0">
+ <!-- The *viewport* will be scaled, so use 100% here! -->
+ <xsl:attribute name="width">
+ <xsl:value-of select="'100%'"/>
+ </xsl:attribute>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:attribute name="width">
+ <xsl:value-of select="$html.width"/>
+ </xsl:attribute>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+
+ <xsl:when test="contains($html.depth, '%')">
+ <!-- HTML doesn't deal with this case very well...do nothing -->
+ </xsl:when>
+
+ <xsl:when test="$scaled.contentwidth != '' and $html.width != '' and $scaled.contentdepth != '' and $html.depth != ''">
+ <!-- scalefit should not be anamorphic; figure out which direction -->
+ <!-- has the limiting scale factor and scale in that direction -->
+ <xsl:choose>
+ <xsl:when test="$html.width div $scaled.contentwidth &gt; $html.depth div $scaled.contentdepth">
+ <xsl:attribute name="height">
+ <xsl:value-of select="$html.depth"/>
+ </xsl:attribute>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:attribute name="width">
+ <xsl:value-of select="$html.width"/>
+ </xsl:attribute>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+
+ <xsl:when test="$scaled.contentwidth != '' and $html.width != ''">
+ <xsl:attribute name="width">
+ <xsl:value-of select="$html.width"/>
+ </xsl:attribute>
+ </xsl:when>
+
+ <xsl:when test="$scaled.contentdepth != '' and $html.depth != ''">
+ <xsl:attribute name="height">
+ <xsl:value-of select="$html.depth"/>
+ </xsl:attribute>
+ </xsl:when>
+ </xsl:choose>
+ </xsl:when>
+ </xsl:choose>
+
+ <!-- AN OVERRIDE -->
+ <xsl:if test="not(@format ='SVG')">
+ <xsl:attribute name="alt">
+ <xsl:choose>
+ <xsl:when test="$alt != ''">
+ <xsl:value-of select="normalize-space($alt)"/>
+ </xsl:when>
+ <xsl:when test="preceding::title[1]">
+ <xsl:value-of select="normalize-space(preceding::title[1])"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text>(missing alt)</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:attribute>
+ </xsl:if>
+ <!-- END OF OVERRIDE -->
+
+ <xsl:if test="$longdesc != ''">
+ <xsl:attribute name="longdesc">
+ <xsl:value-of select="$longdesc"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:if test="@align and $viewport = 0">
+ <xsl:attribute name="style"><xsl:text>text-align: </xsl:text>
+ <xsl:choose>
+ <xsl:when test="@align = 'center'">middle</xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="@align"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:attribute>
+ </xsl:if>
+ </xsl:template>
+
+ <!-- OVERRIDES xhtml-1_1/chunk-common.xsl -->
+ <!-- make a bibliography always a chunk -->
+ <xsl:template name="chunk"
+ priority="1">
+ <xsl:param name="node" select="."/>
+ <!-- returns 1 if $node is a chunk -->
+
+ <!-- ==================================================================== -->
+ <!-- What's a chunk?
+
+ The root element
+ appendix
+ article
+ bibliography ### NO LONGER TRUE in article or part or book
+ book
+ chapter
+ colophon
+ glossary in article or part or book
+ index in article or part or book
+ part
+ preface
+ refentry
+ reference
+ sect{1,2,3,4,5} if position()>1 && depth < chunk.section.depth
+ section if position()>1 && depth < chunk.section.depth
+ set
+ setindex
+ -->
+ <!-- ==================================================================== -->
+
+ <!--
+ <xsl:message>
+ <xsl:text>chunk: </xsl:text>
+ <xsl:value-of select="name($node)"/>
+ <xsl:text>(</xsl:text>
+ <xsl:value-of select="$node/@id"/>
+ <xsl:text>)</xsl:text>
+ <xsl:text> csd: </xsl:text>
+ <xsl:value-of select="$chunk.section.depth"/>
+ <xsl:text> cfs: </xsl:text>
+ <xsl:value-of select="$chunk.first.sections"/>
+ <xsl:text> ps: </xsl:text>
+ <xsl:value-of select="count($node/parent::section)"/>
+ <xsl:text> prs: </xsl:text>
+ <xsl:value-of select="count($node/preceding-sibling::section)"/>
+ </xsl:message>
+ -->
+
+ <xsl:choose>
+ <xsl:when test="not($node/parent::*)">1</xsl:when>
+
+ <xsl:when test="local-name($node) = 'sect1' and $chunk.section.depth &gt;= 1 and ($chunk.first.sections != 0 or count($node/preceding-sibling::sect1) &gt; 0)">
+ <xsl:text>1</xsl:text>
+ </xsl:when>
+ <xsl:when test="local-name($node) = 'sect2' and $chunk.section.depth &gt;= 2 and ($chunk.first.sections != 0 or count($node/preceding-sibling::sect2) &gt; 0)">
+ <xsl:call-template name="chunk">
+ <xsl:with-param name="node" select="$node/parent::*"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="local-name($node) = 'sect3' and $chunk.section.depth &gt;= 3 and ($chunk.first.sections != 0 or count($node/preceding-sibling::sect3) &gt; 0)">
+ <xsl:call-template name="chunk">
+ <xsl:with-param name="node" select="$node/parent::*"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="local-name($node) = 'sect4' and $chunk.section.depth &gt;= 4 and ($chunk.first.sections != 0 or count($node/preceding-sibling::sect4) &gt; 0)">
+ <xsl:call-template name="chunk">
+ <xsl:with-param name="node" select="$node/parent::*"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="local-name($node) = 'sect5' and $chunk.section.depth &gt;= 5 and ($chunk.first.sections != 0 or count($node/preceding-sibling::sect5) &gt; 0)">
+ <xsl:call-template name="chunk">
+ <xsl:with-param name="node" select="$node/parent::*"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="local-name($node) = 'section' and $chunk.section.depth &gt;= count($node/ancestor::section)+1 and ($chunk.first.sections != 0 or count($node/preceding-sibling::section) &gt; 0)">
+ <xsl:call-template name="chunk">
+ <xsl:with-param name="node" select="$node/parent::*"/>
+ </xsl:call-template>
+ </xsl:when>
+
+ <xsl:when test="local-name($node)='preface'">1</xsl:when>
+ <xsl:when test="local-name($node)='chapter'">1</xsl:when>
+ <xsl:when test="local-name($node)='appendix'">1</xsl:when>
+ <xsl:when test="local-name($node)='article'">1</xsl:when>
+ <xsl:when test="local-name($node)='part'">1</xsl:when>
+ <xsl:when test="local-name($node)='reference'">1</xsl:when>
+ <xsl:when test="local-name($node)='refentry'">1</xsl:when>
+ <xsl:when test="local-name($node)='index' and ($generate.index != 0 or count($node/*) &gt; 0) and (local-name($node/parent::*) = 'article' or local-name($node/parent::*) = 'book' or local-name($node/parent::*) = 'part' )">1</xsl:when>
+ <!-- AN OVERRIDE -->
+ <xsl:when test="local-name($node)='bibliography'">1</xsl:when>
+ <!-- END OF OVERRIDE -->
+ <xsl:when test="local-name($node)='glossary' and (local-name($node/parent::*) = 'article' or local-name($node/parent::*) = 'book' or local-name($node/parent::*) = 'part' )">1</xsl:when>
+ <xsl:when test="local-name($node)='colophon'">1</xsl:when>
+ <xsl:when test="local-name($node)='book'">1</xsl:when>
+ <xsl:when test="local-name($node)='set'">1</xsl:when>
+ <xsl:when test="local-name($node)='setindex'">1</xsl:when>
+ <xsl:when test="local-name($node)='legalnotice' and $generate.legalnotice.link != 0">1</xsl:when>
+ <xsl:otherwise>0</xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+ <!-- OVERRIDES xhtml-1_1/chunk-code.xsl -->
+ <!-- Add chunking for bibliography as root element -->
+ <!-- AN OVERRIDE -->
+ <xsl:template match="set|
+ book|
+ part|
+ preface|
+ chapter|
+ appendix|
+ article|
+ reference|
+ refentry|
+ book/glossary|
+ article/glossary|
+ part/glossary|
+ bibliography|
+ colophon"
+ priority="1">
+ <!-- END OF OVERRIDE -->
+ <xsl:choose>
+ <xsl:when test="$onechunk != 0 and parent::*">
+ <xsl:apply-imports/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="process-chunk-element"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+ <!-- OVERRIDES xhtml-1_1/graphics.xsl -->
+ <!-- Do _NOT_ output any xlink garbage, so if you don't have
+ processor with extensions, you're screwed and we're terminating -->
+ <xsl:template match="inlinegraphic">
+ <xsl:variable name="filename">
+ <xsl:choose>
+ <xsl:when test="@entityref">
+ <xsl:value-of select="unparsed-entity-uri(@entityref)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="@fileref"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:call-template name="anchor"/>
+
+ <xsl:choose>
+ <xsl:when test="@format='linespecific'">
+ <xsl:choose>
+ <xsl:when test="$use.extensions != '0' and $textinsert.extension != '0'">
+ <xsl:choose>
+ <xsl:when test="element-available('stext:insertfile')">
+ <stext:insertfile href="{$filename}" encoding="{$textdata.default.encoding}"/>
+ </xsl:when>
+ <xsl:when test="element-available('xtext:insertfile')">
+ <xtext:insertfile href="{$filename}"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:message terminate="yes">
+ <xsl:text>No insertfile extension available.</xsl:text>
+ </xsl:message>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <!-- AN OVERRIDE -->
+ <xsl:message terminate="yes">
+ <xsl:text>No insertfile extension available. Use a different processor (with extensions) or turn on $use.extensions and $textinsert.extension (see docs for more). </xsl:text>
+ </xsl:message>
+ <!-- END OF OVERRIDE -->
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="process.image"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+ <xsl:template name="cover">
+ <xsl:apply-templates select="/*/*[contains(name(.), 'info')]//mediaobject[@role='cover' or ancestor::cover]"/>
+ </xsl:template>
+
+ <xsl:template match="/*/*[cover or contains(name(.), 'info')]//mediaobject[@role='cover' or ancestor::cover]">
+ <xsl:call-template name="write.chunk">
+ <xsl:with-param name="filename">
+ <xsl:value-of select="$epub.cover.filename" />
+ </xsl:with-param>
+ <xsl:with-param name="method" select="'xml'" />
+ <xsl:with-param name="encoding" select="'utf-8'" />
+ <xsl:with-param name="indent" select="'no'" />
+ <xsl:with-param name="quiet" select="$chunk.quietly" />
+ <xsl:with-param name="content">
+ <xsl:element namespace="http://www.w3.org/1999/xhtml" name="html">
+ <xsl:element namespace="http://www.w3.org/1999/xhtml" name="head">
+ <xsl:element namespace="http://www.w3.org/1999/xhtml" name="title">Cover</xsl:element>
+ <xsl:element namespace="http://www.w3.org/1999/xhtml" name="style">
+ <xsl:attribute name="type">text/css</xsl:attribute>
+ <!-- Help the cover image scale nicely in the CSS then apply a max-width to look better in Adobe Digital Editions -->
+ <xsl:text> img { max-width: 100%; }</xsl:text>
+ </xsl:element>
+ </xsl:element>
+ <xsl:element namespace="http://www.w3.org/1999/xhtml" name="body">
+ <xsl:element namespace="http://www.w3.org/1999/xhtml" name="div">
+ <xsl:attribute name="id">
+ <xsl:value-of select="$epub.cover.image.id"/>
+ </xsl:attribute>
+ <xsl:choose>
+ <xsl:when test="imageobject[@role='front-large']">
+ <xsl:apply-templates select="imageobject[@role='front-large']"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="imageobject[1]"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:element>
+ <!-- If this is defined as an explicit cover page, then process
+ any remaining text -->
+ <xsl:if test="ancestor::cover">
+ <xsl:apply-templates select="ancestor::cover/para"/>
+ </xsl:if>
+ </xsl:element>
+ </xsl:element>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:template>
+
+ <xsl:template name="cover-svg">
+ <xsl:param name="node"/>
+ </xsl:template>
+
+ <xsl:template name="toc-href">
+ <xsl:param name="node" select="."/>
+ <xsl:apply-templates select="$node" mode="recursive-chunk-filename">
+ <xsl:with-param name="recursive" select="true()"/>
+ </xsl:apply-templates>
+ <xsl:text>-toc</xsl:text>
+ <xsl:value-of select="$html.ext"/>
+ </xsl:template>
+
+ <xsl:template match="bibliodiv[title]" mode="label.markup">
+ </xsl:template>
+
+ <xsl:template match="token" mode="opf.manifest.font">
+ <xsl:call-template name="embedded-font-item">
+ <xsl:with-param name="font.file" select="."/>
+ </xsl:call-template>
+ </xsl:template>
+
+ <xsl:template name="embedded-font-item">
+ <xsl:param name="font.file"/>
+ <xsl:param name="font.order" select="1"/>
+
+ <xsl:element namespace="http://www.idpf.org/2007/opf" name="item">
+ <xsl:attribute name="id">
+ <xsl:value-of select="concat('epub.embedded.font.', $font.order)"/>
+ </xsl:attribute>
+ <xsl:attribute name="href"><xsl:value-of select="$font.file"/></xsl:attribute>
+ <xsl:choose>
+ <xsl:when test="contains($font.file, 'otf')">
+ <xsl:attribute name="media-type">font/opentype</xsl:attribute>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:message>
+ <xsl:text>WARNING: OpenType fonts should be supplied! (</xsl:text>
+ <xsl:value-of select="$font.file"/>
+ <xsl:text>)</xsl:text>
+ </xsl:message>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:element>
+ </xsl:template>
+
+<!-- Change section.heading to improve SEO on generated HTML by doing heading levels
+ "correctly". SEO rules are sometimes silly silly, but this does actually create
+ a semantic improvement.
+ Note: This template needs to be manually maintained outside of the html/sections.xsl
+ code, so make sure important changes get reintegrated. -->
+<xsl:template name="section.heading">
+ <xsl:param name="section" select="."/>
+ <xsl:param name="level" select="1"/>
+ <xsl:param name="allow-anchors" select="1"/>
+ <xsl:param name="title"/>
+ <xsl:param name="class" select="'title'"/>
+
+ <xsl:variable name="id">
+ <xsl:choose>
+ <!-- Make sure the subtitle doesn't get the same id as the title -->
+ <xsl:when test="self::subtitle">
+ <xsl:call-template name="object.id">
+ <xsl:with-param name="object" select="."/>
+ </xsl:call-template>
+ </xsl:when>
+ <!-- if title is in an *info wrapper, get the grandparent -->
+ <xsl:when test="contains(local-name(..), 'info')">
+ <xsl:call-template name="object.id">
+ <xsl:with-param name="object" select="../.."/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="object.id">
+ <xsl:with-param name="object" select=".."/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <!-- For SEO, we try to actually ensure we *always* output one and only one h1,
+ so unlike the regular stylesheets, we don't add one to the section level and
+ we get the right behavior because of chunking. -->
+ <xsl:variable name="hlevel">
+ <xsl:choose>
+ <!-- highest valid HTML H level is H6; so anything nested deeper
+ than 7 levels down just becomes H6 -->
+ <xsl:when test="$level &gt; 6">6</xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$level"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:element name="h{$hlevel}" namespace="http://www.w3.org/1999/xhtml">
+ <xsl:attribute name="class"><xsl:value-of select="$class"/></xsl:attribute>
+ <xsl:if test="$css.decoration != '0'">
+ <xsl:if test="$hlevel&lt;3">
+ <xsl:attribute name="style">clear: both</xsl:attribute>
+ </xsl:if>
+ </xsl:if>
+ <xsl:if test="$allow-anchors != 0 and $generate.id.attributes = 0">
+ <xsl:call-template name="anchor">
+ <xsl:with-param name="node" select="$section"/>
+ <xsl:with-param name="conditional" select="0"/>
+ </xsl:call-template>
+ </xsl:if>
+ <xsl:if test="$generate.id.attributes != 0 and not(local-name(.) = 'appendix')">
+ <xsl:attribute name="id"><xsl:value-of select="$id"/></xsl:attribute>
+ </xsl:if>
+ <xsl:copy-of select="$title"/>
+ </xsl:element>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="bridgehead">
+ <xsl:variable name="container" select="(ancestor::appendix |ancestor::article |ancestor::bibliography |ancestor::chapter |ancestor::glossary |ancestor::glossdiv |ancestor::index |ancestor::partintro |ancestor::preface |ancestor::refsect1 |ancestor::refsect2 |ancestor::refsect3 |ancestor::sect1 |ancestor::sect2 |ancestor::sect3 |ancestor::sect4 |ancestor::sect5 |ancestor::section |ancestor::setindex |ancestor::simplesect)[last()]"/>
+
+ <xsl:variable name="clevel">
+ <xsl:choose>
+ <xsl:when test="local-name($container) = 'appendix' or local-name($container) = 'chapter' or local-name($container) = 'article' or local-name($container) = 'bibliography' or local-name($container) = 'glossary' or local-name($container) = 'index' or local-name($container) = 'partintro' or local-name($container) = 'preface' or local-name($container) = 'setindex'">1</xsl:when>
+ <xsl:when test="local-name($container) = 'glossdiv'">
+ <xsl:value-of select="count(ancestor::glossdiv)+1"/>
+ </xsl:when>
+ <xsl:when test="local-name($container) = 'sect1' or local-name($container) = 'sect2' or local-name($container) = 'sect3' or local-name($container) = 'sect4' or local-name($container) = 'sect5' or local-name($container) = 'refsect1' or local-name($container) = 'refsect2' or local-name($container) = 'refsect3' or local-name($container) = 'section' or local-name($container) = 'simplesect'">
+ <xsl:variable name="slevel">
+ <xsl:call-template name="section.level">
+ <xsl:with-param name="node" select="$container"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:value-of select="$slevel + 1"/>
+ </xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <!-- HTML H level is one higher than section level -->
+ <xsl:variable name="hlevel">
+ <xsl:choose>
+ <xsl:when test="@renderas = 'sect1'">1</xsl:when>
+ <xsl:when test="@renderas = 'sect2'">2</xsl:when>
+ <xsl:when test="@renderas = 'sect3'">3</xsl:when>
+ <xsl:when test="@renderas = 'sect4'">4</xsl:when>
+ <xsl:when test="@renderas = 'sect5'">5</xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$clevel + 1"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:element name="h{$hlevel}" namespace="http://www.w3.org/1999/xhtml">
+ <xsl:call-template name="anchor">
+ <xsl:with-param name="conditional" select="0"/>
+ </xsl:call-template>
+ <xsl:apply-templates/>
+ </xsl:element>
+</xsl:template>
+
+<!-- SEO customization #2 -->
+<xsl:template name="component.title">
+ <xsl:param name="node" select="."/>
+
+ <xsl:variable name="level">
+ <xsl:choose>
+ <xsl:when test="ancestor::section">
+ <xsl:value-of select="count(ancestor::section)+1"/>
+ </xsl:when>
+ <xsl:when test="ancestor::sect5">6</xsl:when>
+ <xsl:when test="ancestor::sect4">5</xsl:when>
+ <xsl:when test="ancestor::sect3">4</xsl:when>
+ <xsl:when test="ancestor::sect2">3</xsl:when>
+ <xsl:when test="ancestor::sect1">2</xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:element name="h{$level}" namespace="http://www.w3.org/1999/xhtml">
+ <xsl:attribute name="class">title</xsl:attribute>
+ <xsl:if test="$generate.id.attributes = 0">
+ <xsl:call-template name="anchor">
+ <xsl:with-param name="node" select="$node"/>
+ <xsl:with-param name="conditional" select="0"/>
+ </xsl:call-template>
+ </xsl:if>
+ <xsl:apply-templates select="$node" mode="object.title.markup">
+ <xsl:with-param name="allow-anchors" select="1"/>
+ </xsl:apply-templates>
+ </xsl:element>
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/extensions/LICENSE.txt b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/extensions/LICENSE.txt
new file mode 100644
index 0000000..fed77d9
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/extensions/LICENSE.txt
@@ -0,0 +1,264 @@
+LICENSE
+
+ Copyright (c) 2008 N. Quaine - NexWave Solutions All Rights Reserved.
+
+CONDITIONS
+
+Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
+Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
+Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
+Neither the name of the copyright holders nor the names of the contributors may be used to endorse or promote products derived from this software without specific prior written permission.
+
+DISCLAIMER
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
+ IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+
+
+
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright [yyyy] [name of copyright owner]
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+
+
+Some code in src/java/org/apache/lucene/util/UnicodeUtil.java was
+derived from unicode conversion examples available at
+http://www.unicode.org/Public/PROGRAMS/CVTUTF. Here is the copyright
+from those sources:
+
+/*
+ * Copyright 2001-2004 Unicode, Inc.
+ *
+ * Disclaimer
+ *
+ * This source code is provided as is by Unicode, Inc. No claims are
+ * made as to fitness for any particular purpose. No warranties of any
+ * kind are expressed or implied. The recipient agrees to determine
+ * applicability of information provided. If this file has been
+ * purchased on magnetic or optical media from Unicode, Inc., the
+ * sole remedy for any claim will be exchange of defective media
+ * within 90 days of receipt.
+ *
+ * Limitations on Rights to Redistribute This Code
+ *
+ * Unicode, Inc. hereby grants the right to freely use the information
+ * supplied in this file in the creation of products supporting the
+ * Unicode Standard, and to make copies of this file in any form
+ * for internal or external distribution as long as this notice
+ * remains attached.
+ */
+
+
+Some code in src/java/org/apache/lucene/util/ArrayUtil.java was
+derived from Python 2.4.2 sources available at
+http://www.python.org. Full license is here:
+
+ http://www.python.org/download/releases/2.4.2/license/
+
+
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/extensions/NOTICE.txt b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/extensions/NOTICE.txt
new file mode 100644
index 0000000..35f247d
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/extensions/NOTICE.txt
@@ -0,0 +1,12 @@
+The webhelpindexer is released under the Apache 2.0 license and
+includes software from other projects.
+
+The webhelpindexer was originally developed by N. Quaine and released
+under a MIT/BSD-style license. See LICENSE.txt.
+
+This product includes software developed by The Apache Software
+Foundation (http://www.apache.org/). See LICENSE.txt.
+
+This product also includes software released as part of the Snowball
+project maintained by Martin Porter and Richard Boulton released under
+a BSD-style license: http://snowball.tartarus.org/
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/extensions/README.LIBXSLT b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/extensions/README.LIBXSLT
new file mode 100644
index 0000000..2c80274
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/extensions/README.LIBXSLT
@@ -0,0 +1,52 @@
+----------------------------------------------------------------------
+ README file for the libxslt extensions
+----------------------------------------------------------------------
+$Id: README.LIBXSLT 7877 2008-03-08 04:07:52Z xmldoc $
+
+These are XSLT extensions written in Python for use with the DocBook XML
+stylesheets and the libxslt library[1].
+
+Currently, the only available extension is a function for adjusting column
+widths in tables. For more information, see the section describing the
+equivalent Java extension in "DocBook XSL: The Complete Guide"[2].
+
+----------------------------------------------------------------------
+Preparations
+----------------------------------------------------------------------
+In addition to libxml2 and libxslt, the following software needs to
+be installed before you start using the extensions:
+
+1. Python[3].
+
+2. Python bindings for libxml2/libxslt. Most distributions of
+ libxml2/libxslt for Unix/Linux include these bindings.
+ A native Windows port is provided by Stéphane Bidoul[4].
+
+----------------------------------------------------------------------
+Installation of the extensions
+----------------------------------------------------------------------
+No special installation step is needed.
+
+----------------------------------------------------------------------
+How to use the extensions
+----------------------------------------------------------------------
+Instead of using xsltproc, you run a Python program (xslt.py). The
+command has this general form:
+
+python xslt.py xmlfile xslfile [outputfile] [param1=val1 [param2=val]...]
+
+Modify paths, filenames, and parameters as needed. Make sure to set
+the "use.extensions" and "tablecolumns.extension" parameters to 1.
+
+----------------------------------------------------------------------
+Manifest
+----------------------------------------------------------------------
+README.LIBXSLT This file
+xslt.py Executable script file
+docbook.py Module that implements extensions
+
+----------------------------------------------------------------------
+[1] http://xmlsoft.org/XSLT
+[2] http://www.sagehill.net/docbookxsl/ColumnWidths.html
+[3] http://www.python.org/download
+[4] http://users.skynet.be/sbi/libxml-python
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/extensions/README.txt b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/extensions/README.txt
new file mode 100644
index 0000000..35c6fa0
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/extensions/README.txt
@@ -0,0 +1,4 @@
+See webhelp/docs/index.html for more information about the webhelp
+indexer and the webhelp output format. See webhelp/docs/index.html for
+more information about the webhelp indexer and the webhelp output
+format.
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/extensions/docbook.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/extensions/docbook.py
new file mode 100644
index 0000000..e7b8cfa
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/extensions/docbook.py
@@ -0,0 +1,240 @@
+# docbook.py: extension module
+# $Id: docbook.py 8353 2009-03-17 16:57:50Z mzjn $
+from __future__ import print_function
+
+import sys
+import string
+import libxml2
+import libxslt
+import re
+import math
+
+# Some globals
+pixelsPerInch = 96.0
+unitHash = { 'in': pixelsPerInch,
+ 'cm': pixelsPerInch / 2.54,
+ 'mm': pixelsPerInch / 25.4,
+ 'pc': (pixelsPerInch / 72.0) * 12,
+ 'pt': pixelsPerInch / 72.0,
+ 'px': 1 }
+
+# ======================================================================
+
+def adjustColumnWidths(ctx, nodeset):
+ #
+ # Small check to verify the context is correcly accessed
+ #
+ try:
+ pctxt = libxslt.xpathParserContext(_obj=ctx)
+ ctxt = pctxt.context()
+ tctxt = ctxt.transformContext()
+ except:
+ pass
+
+ # Get the nominal table width
+ varString = lookupVariable(tctxt, "nominal.table.width", None)
+ if varString == None:
+ nominalWidth = 6 * pixelsPerInch;
+ else:
+ nominalWidth = convertLength(varString);
+
+ # Get the requested table width
+ tableWidth = lookupVariable(tctxt, "table.width", "100%")
+
+ foStylesheet = (tctxt.variableLookup("stylesheet.result.type", None) == "fo")
+
+ relTotal = 0
+ relParts = []
+
+ absTotal = 0
+ absParts = []
+
+ colgroup = libxml2.xmlNode(_obj = nodeset[0])
+ # If this is an foStylesheet, we've been passed a list of fo:table-columns.
+ # Otherwise we've been passed a colgroup that contains a list of cols.
+ if foStylesheet:
+ colChildren = colgroup
+ else:
+ colChildren = colgroup.children
+
+ col = colChildren
+ while col != None:
+ if foStylesheet:
+ width = col.prop("column-width")
+ else:
+ width = col.prop("width")
+
+ if width == None:
+ width = "1*"
+
+ relPart = 0.0
+ absPart = 0.0
+ starPos = string.find(width, "*")
+ if starPos >= 0:
+ relPart, absPart = string.split(width, "*", 2)
+ relPart = float(relPart)
+ relTotal = relTotal + float(relPart)
+ else:
+ absPart = width
+
+ pixels = convertLength(absPart)
+ absTotal = absTotal + pixels
+
+ relParts.append(relPart)
+ absParts.append(pixels)
+
+ col = col.__next__
+
+ # Ok, now we have the relative widths and absolute widths in
+ # two parallel arrays.
+ #
+ # - If there are no relative widths, output the absolute widths
+ # - If there are no absolute widths, output the relative widths
+ # - If there are a mixture of relative and absolute widths,
+ # - If the table width is absolute, turn these all into absolute
+ # widths.
+ # - If the table width is relative, turn these all into absolute
+ # widths in the nominalWidth and then turn them back into
+ # percentages.
+
+ widths = []
+
+ if relTotal == 0:
+ for absPart in absParts:
+ if foStylesheet:
+ inches = absPart / pixelsPerInch
+ widths.append("%4.2fin" % inches)
+ else:
+ widths.append("%d" % absPart)
+ elif absTotal == 0:
+ for relPart in relParts:
+ rel = relPart / relTotal * 100
+ widths.append(rel)
+ widths = correctRoundingError(widths)
+ else:
+ pixelWidth = nominalWidth
+ if string.find(tableWidth, "%") < 0:
+ pixelWidth = convertLength(tableWidth)
+
+ if pixelWidth <= absTotal:
+ print("Table is wider than table width")
+ else:
+ pixelWidth = pixelWidth - absTotal
+
+ absTotal = 0
+ for count in range(len(relParts)):
+ rel = relParts[count] / relTotal * pixelWidth
+ relParts[count] = rel + absParts[count]
+ absTotal = absTotal + rel + absParts[count]
+
+ if string.find(tableWidth, "%") < 0:
+ for count in range(len(relParts)):
+ if foStylesheet:
+ pixels = relParts[count]
+ inches = pixels / pixelsPerInch
+ widths.append("%4.2fin" % inches)
+ else:
+ widths.append(relParts[count])
+ else:
+ for count in range(len(relParts)):
+ rel = relParts[count] / absTotal * 100
+ widths.append(rel)
+ widths = correctRoundingError(widths)
+
+ # Danger, Will Robinson! In-place modification of the result tree!
+ # Side-effect free? We don' need no steenkin' side-effect free!
+ count = 0
+ col = colChildren
+ while col != None:
+ if foStylesheet:
+ col.setProp("column-width", widths[count])
+ else:
+ col.setProp("width", widths[count])
+
+ count = count+1
+ col = col.__next__
+
+ return nodeset
+
+def convertLength(length):
+ # Given "3.4in" return the width in pixels
+ global pixelsPerInch
+ global unitHash
+
+ m = re.search('([+-]?[\d\.]+)(\S+)', length)
+ if m != None and m.lastindex > 1:
+ unit = pixelsPerInch
+ if m.group(2) in unitHash:
+ unit = unitHash[m.group(2)]
+ else:
+ print("Unrecognized length: " + m.group(2))
+
+ pixels = unit * float(m.group(1))
+ else:
+ pixels = 0
+
+ return pixels
+
+def correctRoundingError(floatWidths):
+ # The widths are currently floating point numbers, we have to truncate
+ # them back to integers and then distribute the error so that they sum
+ # to exactly 100%.
+
+ totalWidth = 0
+ widths = []
+ for width in floatWidths:
+ width = math.floor(width)
+ widths.append(width)
+ totalWidth = totalWidth + math.floor(width)
+
+ totalError = 100 - totalWidth
+ columnError = totalError / len(widths)
+ error = 0
+ for count in range(len(widths)):
+ width = widths[count]
+ error = error + columnError
+ if error >= 1.0:
+ adj = math.floor(error)
+ error = error - adj
+ widths[count] = "%d%%" % (width + adj)
+ else:
+ widths[count] = "%d%%" % width
+
+ return widths
+
+def lookupVariable(tctxt, varName, default):
+ varString = tctxt.variableLookup(varName, None)
+ if varString == None:
+ return default
+
+ # If it's a list, get the first element
+ if type(varString) == type([]):
+ varString = varString[0]
+
+ # If it's not a string, it must be a node, get its content
+ if type(varString) != type(""):
+ varString = varString.content
+
+ return varString
+
+# ======================================================================
+# Random notes...
+
+#once you have a node which is a libxml2 python xmlNode wrapper all common
+#operations are possible:
+# .children .last .parent .next .prev .doc for navigation
+# .content .type for introspection
+# .prop("attribute_name") to lookup attribute values
+
+# # Now make a nodeset to return
+# # Danger, Will Robinson! This creates a memory leak!
+# newDoc = libxml2.newDoc("1.0")
+# newColGroup = newDoc.newDocNode(None, "colgroup", None)
+# newDoc.addChild(newColGroup)
+# col = colgroup.children
+# while col != None:
+# newCol = newDoc.newDocNode(None, "col", None)
+# newCol.copyPropList(col);
+# newCol.setProp("width", "4")
+# newColGroup.addChild(newCol)
+# col = col.next
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/extensions/xslt.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/extensions/xslt.py
new file mode 100644
index 0000000..77ca0de
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/extensions/xslt.py
@@ -0,0 +1,85 @@
+#!/usr/bin/python -u
+# $Id: xslt.py 8353 2009-03-17 16:57:50Z mzjn $
+from __future__ import print_function
+
+import sys
+import libxml2
+import libxslt
+from docbook import adjustColumnWidths
+
+# Check the arguments
+usage = "Usage: %s xmlfile.xml xslfile.xsl [outputfile] [param1=val [param2=val]...]" % sys.argv[0]
+
+xmlfile = None
+xslfile = None
+outfile = "-"
+params = {}
+
+try:
+ xmlfile = sys.argv[1]
+ xslfile = sys.argv[2]
+except IndexError:
+ print(usage)
+ sys.exit(1)
+
+def quote(astring):
+ if astring.find("'") < 0:
+ return "'" + astring + "'"
+ else:
+ return '"' + astring + '"'
+
+try:
+ outfile = sys.argv[3]
+ if outfile.find("=") > 0:
+ name, value = outfile.split("=", 2)
+ params[name] = quote(value)
+ outfile = None
+
+ count = 4
+ while (sys.argv[count]):
+ try:
+ name, value = sys.argv[count].split("=", 2)
+ if name in params:
+ print("Warning: '%s' re-specified; replacing value" % name)
+ params[name] = quote(value)
+ except ValueError:
+ print("Invalid parameter specification: '" + sys.argv[count] + "'")
+ print(usage)
+ sys.exit(1)
+ count = count+1
+except IndexError:
+ pass
+
+# ======================================================================
+# Memory debug specific
+# libxml2.debugMemory(1)
+
+# Setup environment
+libxml2.lineNumbersDefault(1)
+libxml2.substituteEntitiesDefault(1)
+libxslt.registerExtModuleFunction("adjustColumnWidths",
+ "http://nwalsh.com/xslt/ext/xsltproc/python/Table",
+ adjustColumnWidths)
+
+# Initialize and run
+styledoc = libxml2.parseFile(xslfile)
+style = libxslt.parseStylesheetDoc(styledoc)
+doc = libxml2.parseFile(xmlfile)
+result = style.applyStylesheet(doc, params)
+
+# Save the result
+if outfile:
+ style.saveResultToFilename(outfile, result, 0)
+else:
+ print(result)
+
+# Free things up
+style.freeStylesheet()
+doc.freeDoc()
+result.freeDoc()
+
+# Memory debug specific
+#libxslt.cleanup()
+#if libxml2.debugMemory(1) != 0:
+# print "Memory leak %d bytes" % (libxml2.debugMemory(1))
+# libxml2.dumpMemory()
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/admon.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/admon.xsl
new file mode 100644
index 0000000..4f69be4
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/admon.xsl
@@ -0,0 +1,130 @@
+<?xml version='1.0'?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:fo="http://www.w3.org/1999/XSL/Format"
+ version='1.0'>
+
+<!-- ********************************************************************
+ $Id: admon.xsl 7248 2007-08-18 06:50:21Z mzjn $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<xsl:template match="note|important|warning|caution|tip">
+ <xsl:choose>
+ <xsl:when test="$admon.graphics != 0">
+ <xsl:call-template name="graphical.admonition"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="nongraphical.admonition"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="*" mode="admon.graphic.width">
+ <xsl:param name="node" select="."/>
+ <xsl:text>36pt</xsl:text>
+</xsl:template>
+
+<xsl:template name="admon.graphic">
+ <xsl:param name="node" select="."/>
+
+ <xsl:variable name="filename">
+ <xsl:value-of select="$admon.graphics.path"/>
+ <xsl:choose>
+ <xsl:when test="local-name($node)='note'">note</xsl:when>
+ <xsl:when test="local-name($node)='warning'">warning</xsl:when>
+ <xsl:when test="local-name($node)='caution'">caution</xsl:when>
+ <xsl:when test="local-name($node)='tip'">tip</xsl:when>
+ <xsl:when test="local-name($node)='important'">important</xsl:when>
+ <xsl:otherwise>note</xsl:otherwise>
+ </xsl:choose>
+ <xsl:value-of select="$admon.graphics.extension"/>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="$passivetex.extensions != 0
+ or $fop.extensions != 0
+ or $arbortext.extensions != 0">
+ <xsl:value-of select="$filename"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text>url(</xsl:text>
+ <xsl:value-of select="$filename"/>
+ <xsl:text>)</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="graphical.admonition">
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+ <xsl:variable name="graphic.width">
+ <xsl:apply-templates select="." mode="admon.graphic.width"/>
+ </xsl:variable>
+
+ <fo:block id="{$id}"
+ xsl:use-attribute-sets="graphical.admonition.properties">
+ <fo:list-block provisional-distance-between-starts="{$graphic.width} + 18pt"
+ provisional-label-separation="18pt">
+ <fo:list-item>
+ <fo:list-item-label end-indent="label-end()">
+ <fo:block>
+ <fo:external-graphic width="auto" height="auto"
+ content-width="{$graphic.width}" >
+ <xsl:attribute name="src">
+ <xsl:call-template name="admon.graphic"/>
+ </xsl:attribute>
+ </fo:external-graphic>
+ </fo:block>
+ </fo:list-item-label>
+ <fo:list-item-body start-indent="body-start()">
+ <xsl:if test="$admon.textlabel != 0 or title or info/title">
+ <fo:block xsl:use-attribute-sets="admonition.title.properties">
+ <xsl:apply-templates select="." mode="object.title.markup">
+ <xsl:with-param name="allow-anchors" select="1"/>
+ </xsl:apply-templates>
+ </fo:block>
+ </xsl:if>
+ <fo:block xsl:use-attribute-sets="admonition.properties">
+ <xsl:apply-templates/>
+ </fo:block>
+ </fo:list-item-body>
+ </fo:list-item>
+ </fo:list-block>
+ </fo:block>
+</xsl:template>
+
+<xsl:template name="nongraphical.admonition">
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+
+ <fo:block id="{$id}"
+ xsl:use-attribute-sets="nongraphical.admonition.properties">
+ <xsl:if test="$admon.textlabel != 0 or title or info/title">
+ <fo:block keep-with-next.within-column='always'
+ xsl:use-attribute-sets="admonition.title.properties">
+ <xsl:apply-templates select="." mode="object.title.markup">
+ <xsl:with-param name="allow-anchors" select="1"/>
+ </xsl:apply-templates>
+ </fo:block>
+ </xsl:if>
+
+ <fo:block xsl:use-attribute-sets="admonition.properties">
+ <xsl:apply-templates/>
+ </fo:block>
+ </fo:block>
+</xsl:template>
+
+<xsl:template match="note/title"></xsl:template>
+<xsl:template match="important/title"></xsl:template>
+<xsl:template match="warning/title"></xsl:template>
+<xsl:template match="caution/title"></xsl:template>
+<xsl:template match="tip/title"></xsl:template>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/annotations.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/annotations.xsl
new file mode 100644
index 0000000..ba6baa6
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/annotations.xsl
@@ -0,0 +1,18 @@
+<?xml version='1.0'?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:fo="http://www.w3.org/1999/XSL/Format"
+ version='1.0'>
+
+<!-- ********************************************************************
+ $Id: annotations.xsl 6910 2007-06-28 23:23:30Z xmldoc $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<xsl:template match="annotation"/>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/autoidx-kimber.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/autoidx-kimber.xsl
new file mode 100644
index 0000000..434572f
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/autoidx-kimber.xsl
@@ -0,0 +1,172 @@
+<?xml version="1.0"?>
+<!DOCTYPE xsl:stylesheet [
+<!ENTITY % common.entities SYSTEM "../common/entities.ent">
+%common.entities;
+
+<!-- Documents using the kimber index method must have a lang attribute -->
+<!-- Only one of these should be present in the entity -->
+<!ENTITY lang 'concat(/*/@lang, /*/@xml:lang)'>
+
+]>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:fo="http://www.w3.org/1999/XSL/Format"
+ xmlns:k="java:com.isogen.saxoni18n.Saxoni18nService"
+ exclude-result-prefixes="k"
+ version="1.0">
+
+<!-- ********************************************************************
+ $Id: autoidx-kimber.xsl 8729 2010-07-15 16:43:56Z bobstayton $
+ ********************************************************************
+
+ This file is part of the DocBook XSL Stylesheet distribution.
+ See ../README or http://docbook.sf.net/ for copyright
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<!-- ==================================================================== -->
+<!-- The "kimber" method contributed by Eliot Kimber of Innodata Isogen. -->
+<!-- ==================================================================== -->
+<!-- *** THIS MODULE ONLY WORKS WITH SAXON 6 OR SAXON 8 *** -->
+<!-- ==================================================================== -->
+
+<xsl:include href="../common/autoidx-kimber.xsl"/>
+
+<!-- Java sort apparently works only on lang part, not country -->
+<xsl:param name="sort.lang">
+ <xsl:choose>
+ <xsl:when test="contains(&lang;, '-')">
+ <xsl:value-of select="substring-before(&lang;, '-')"/>
+ </xsl:when>
+ <xsl:when test="contains(&lang;, '_')">
+ <xsl:value-of select="substring-before(&lang;, '_')"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="&lang;"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:param>
+
+<xsl:template name="generate-kimber-index">
+ <xsl:param name="scope" select="NOTANODE"/>
+
+ <xsl:variable name="vendor" select="system-property('xsl:vendor')"/>
+ <xsl:if test="not(contains($vendor, 'SAXON '))">
+ <xsl:message terminate="yes">
+ <xsl:text>ERROR: the 'kimber' index method requires the </xsl:text>
+ <xsl:text>Saxon version 6 or 8 XSLT processor.</xsl:text>
+ </xsl:message>
+ </xsl:if>
+
+ <xsl:if test="not(function-available('k:getIndexGroupKey'))">
+ <xsl:message terminate="yes">
+ <xsl:text>ERROR: the 'kimber' index method requires the </xsl:text>
+ <xsl:text>Innodata Isogen &#x0A;Java extensions for </xsl:text>
+ <xsl:text>internationalized indexes. &#x0A;Install those </xsl:text>
+ <xsl:text>extensions, or use a different index method.&#x0A;</xsl:text>
+ <xsl:text>For more information, see:&#x0A;</xsl:text>
+ <xsl:text>http://www.innodata-isogen.com/knowledge_center/tools_downloads/i18nsupport</xsl:text>
+ </xsl:message>
+ </xsl:if>
+
+ <xsl:variable name="role">
+ <xsl:if test="$index.on.role != 0">
+ <xsl:value-of select="@role"/>
+ </xsl:if>
+ </xsl:variable>
+
+ <xsl:variable name="type">
+ <xsl:if test="$index.on.type != 0">
+ <xsl:value-of select="@type"/>
+ </xsl:if>
+ </xsl:variable>
+
+ <xsl:variable name="terms"
+ select="//indexterm[count(.|key('k-group',
+ k:getIndexGroupKey(&lang;, &primary;))
+ [&scope;][1]) = 1
+ and not(@class = 'endofrange')]"/>
+
+ <xsl:variable name="alphabetical"
+ select="$terms[not(starts-with(
+ k:getIndexGroupKey(&lang;, &primary;),
+ '#NUMERIC'
+ ))]"/>
+
+ <xsl:variable name="others"
+ select="$terms[starts-with(
+ k:getIndexGroupKey(&lang;, &primary;),
+ '#NUMERIC'
+ )]"/>
+
+ <fo:block>
+ <xsl:if test="$others">
+ <xsl:call-template name="indexdiv.title">
+ <xsl:with-param name="titlecontent">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'index symbols'"/>
+ </xsl:call-template>
+ </xsl:with-param>
+ </xsl:call-template>
+
+ <fo:block>
+ <xsl:apply-templates select="$others"
+ mode="index-symbol-div">
+ <xsl:with-param name="scope" select="$scope"/>
+ <xsl:with-param name="role" select="$role"/>
+ <xsl:with-param name="type" select="$type"/>
+ <xsl:sort lang="{$sort.lang}"
+ select="k:getIndexGroupSortKey(&lang;,
+ k:getIndexGroupKey(&lang;, &primary;))"/>
+ </xsl:apply-templates>
+ </fo:block>
+ </xsl:if>
+
+ <xsl:apply-templates select="$alphabetical"
+ mode="index-div-kimber">
+ <xsl:with-param name="scope" select="$scope"/>
+ <xsl:with-param name="role" select="$role"/>
+ <xsl:with-param name="type" select="$type"/>
+ <xsl:sort lang="{$sort.lang}"
+ select="k:getIndexGroupSortKey(&lang;,
+ k:getIndexGroupKey(&lang;, &primary;))"/>
+ </xsl:apply-templates>
+ </fo:block>
+
+</xsl:template>
+
+<xsl:template match="indexterm" mode="index-div-kimber">
+ <xsl:param name="scope" select="."/>
+ <xsl:param name="role" select="''"/>
+ <xsl:param name="type" select="''"/>
+
+ <xsl:variable name="key"
+ select="k:getIndexGroupKey(&lang;, &primary;)"/>
+
+ <xsl:variable name="label"
+ select="k:getIndexGroupLabel(&lang;, $key)"/>
+
+ <xsl:if test="key('k-group', $key)[&scope;]
+ [count(.|key('primary', &primary;)[&scope;][1]) = 1]">
+ <fo:block>
+ <xsl:call-template name="indexdiv.title">
+ <xsl:with-param name="titlecontent">
+ <xsl:value-of select="$label"/>
+ </xsl:with-param>
+ </xsl:call-template>
+ <fo:block>
+ <xsl:apply-templates select="key('k-group', $key)[&scope;]
+ [count(.|key('primary', &primary;)[&scope;]
+ [1])=1]"
+ mode="index-primary">
+ <xsl:sort select="&primary;" lang="{$sort.lang}"/>
+ <xsl:with-param name="scope" select="$scope"/>
+ <xsl:with-param name="role" select="$role"/>
+ <xsl:with-param name="type" select="$type"/>
+ </xsl:apply-templates>
+ </fo:block>
+ </fo:block>
+ </xsl:if>
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/autoidx-kosek.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/autoidx-kosek.xsl
new file mode 100644
index 0000000..7ed5414
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/autoidx-kosek.xsl
@@ -0,0 +1,139 @@
+<?xml version="1.0"?>
+<!DOCTYPE xsl:stylesheet [
+<!ENTITY % common.entities SYSTEM "../common/entities.ent">
+%common.entities;
+]>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:fo="http://www.w3.org/1999/XSL/Format"
+ xmlns:rx="http://www.renderx.com/XSL/Extensions"
+ xmlns:axf="http://www.antennahouse.com/names/XSL/Extensions"
+ xmlns:i="urn:cz-kosek:functions:index"
+ xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0"
+ xmlns:func="http://exslt.org/functions"
+ xmlns:exslt="http://exslt.org/common"
+ extension-element-prefixes="func exslt"
+ exclude-result-prefixes="func exslt i l"
+ version="1.0">
+
+<!-- ********************************************************************
+ $Id: autoidx-kosek.xsl 8725 2010-07-15 08:08:04Z kosek $
+ ********************************************************************
+
+ This file is part of the DocBook XSL Stylesheet distribution.
+ See ../README or http://docbook.sf.net/ for copyright
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<!-- ==================================================================== -->
+<!-- The "kosek" method contributed by Jirka Kosek. -->
+
+<xsl:include href="../common/autoidx-kosek.xsl"/>
+
+<xsl:template name="generate-kosek-index">
+ <xsl:param name="scope" select="NOTANODE"/>
+
+ <xsl:variable name="vendor" select="system-property('xsl:vendor')"/>
+ <xsl:if test="contains($vendor, 'libxslt')">
+ <xsl:message terminate="yes">
+ <xsl:text>ERROR: the 'kosek' index method does not </xsl:text>
+ <xsl:text>work with the xsltproc XSLT processor.</xsl:text>
+ </xsl:message>
+ </xsl:if>
+
+ <xsl:if test="contains($vendor, 'Saxonica')">
+ <xsl:message terminate="yes">
+ <xsl:text>ERROR: the 'kosek' index method does not </xsl:text>
+ <xsl:text>work with the Saxon 8 XSLT processor.</xsl:text>
+ </xsl:message>
+ </xsl:if>
+
+
+ <xsl:if test="$exsl.node.set.available = 0">
+ <xsl:message terminate="yes">
+ <xsl:text>ERROR: the 'kosek' index method requires the </xsl:text>
+ <xsl:text>exslt:node-set() function. Use a processor that </xsl:text>
+ <xsl:text>has it, or use a different index method.</xsl:text>
+ </xsl:message>
+ </xsl:if>
+
+ <xsl:if test="not(function-available('i:group-index'))">
+ <xsl:message terminate="yes">
+ <xsl:text>ERROR: the 'kosek' index method requires the&#xA;</xsl:text>
+ <xsl:text>index extension functions be imported:&#xA;</xsl:text>
+ <xsl:text> xsl:import href="common/autoidx-kosek.xsl"</xsl:text>
+ </xsl:message>
+ </xsl:if>
+
+ <xsl:variable name="role">
+ <xsl:if test="$index.on.role != 0">
+ <xsl:value-of select="@role"/>
+ </xsl:if>
+ </xsl:variable>
+
+ <xsl:variable name="type">
+ <xsl:if test="$index.on.type != 0">
+ <xsl:value-of select="@type"/>
+ </xsl:if>
+ </xsl:variable>
+
+ <xsl:variable name="terms"
+ select="//indexterm[count(.|key('group-code',
+ i:group-index(&primary;))
+ [&scope;][1]) = 1
+ and not(@class = 'endofrange')]"/>
+ <fo:block>
+ <xsl:apply-templates select="$terms" mode="index-div-kosek">
+ <xsl:with-param name="scope" select="$scope"/>
+ <xsl:with-param name="role" select="$role"/>
+ <xsl:with-param name="type" select="$type"/>
+ <xsl:sort select="i:group-index(&primary;)" data-type="number"/>
+ </xsl:apply-templates>
+ </fo:block>
+</xsl:template>
+
+<xsl:template match="indexterm" mode="index-div-kosek">
+ <xsl:param name="scope" select="."/>
+ <xsl:param name="role" select="''"/>
+ <xsl:param name="type" select="''"/>
+
+ <xsl:variable name="key"
+ select="i:group-index(&primary;)"/>
+
+ <xsl:variable name="lang">
+ <xsl:call-template name="l10n.language"/>
+ </xsl:variable>
+
+ <xsl:if test="key('group-code', $key)[&scope;]
+ [count(.|key('primary', &primary;)[&scope;][1]) = 1]">
+ <fo:block>
+ <xsl:call-template name="indexdiv.title">
+ <xsl:with-param name="titlecontent">
+ <xsl:choose>
+ <xsl:when test="$key = 0">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'index symbols'"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="i:group-letter($key)"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:with-param>
+ </xsl:call-template>
+ <fo:block>
+ <xsl:apply-templates select="key('group-code', $key)[&scope;]
+ [count(.|key('primary', &primary;)
+ [&scope;][1])=1]"
+ mode="index-primary">
+ <xsl:sort select="&primary;" lang="{$lang}"/>
+ <xsl:with-param name="scope" select="$scope"/>
+ <xsl:with-param name="role" select="$role"/>
+ <xsl:with-param name="type" select="$type"/>
+ </xsl:apply-templates>
+ </fo:block>
+ </fo:block>
+ </xsl:if>
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/autoidx-ng.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/autoidx-ng.xsl
new file mode 100644
index 0000000..9407b5c
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/autoidx-ng.xsl
@@ -0,0 +1,20 @@
+<?xml version="1.0"?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="1.0">
+
+<!-- ********************************************************************
+ $Id: autoidx-ng.xsl 6910 2007-06-28 23:23:30Z xmldoc $
+ ********************************************************************
+
+ This file is part of the DocBook XSL Stylesheet distribution.
+ See ../README or http://docbook.sf.net/ for copyright
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<!-- You should have this directly in your customization file. -->
+<!-- This file is there only to retain backward compatibility. -->
+<xsl:import href="autoidx-kosek.xsl"/>
+<xsl:param name="index.method">kosek</xsl:param>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/autoidx.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/autoidx.xsl
new file mode 100644
index 0000000..920760f
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/autoidx.xsl
@@ -0,0 +1,1330 @@
+<?xml version="1.0"?>
+<!DOCTYPE xsl:stylesheet [
+<!ENTITY % common.entities SYSTEM "../common/entities.ent">
+%common.entities;
+]>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:fo="http://www.w3.org/1999/XSL/Format"
+ xmlns:rx="http://www.renderx.com/XSL/Extensions"
+ xmlns:axf="http://www.antennahouse.com/names/XSL/Extensions"
+ xmlns:exslt="http://exslt.org/common"
+ extension-element-prefixes="exslt"
+ exclude-result-prefixes="exslt"
+ version="1.0">
+
+<!-- ********************************************************************
+ $Id: autoidx.xsl 8399 2009-04-08 07:37:42Z bobstayton $
+ ********************************************************************
+
+ This file is part of the DocBook XSL Stylesheet distribution.
+ See ../README or http://docbook.sf.net/ for copyright
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<!-- ==================================================================== -->
+<!-- The "basic" method derived from Jeni Tennison's work. -->
+<!-- The "kosek" method contributed by Jirka Kosek. -->
+<!-- The "kimber" method contributed by Eliot Kimber of Innodata Isogen. -->
+
+<!-- Importing module for kimber or kosek method overrides one of these -->
+<xsl:param name="kimber.imported" select="0"/>
+<xsl:param name="kosek.imported" select="0"/>
+
+<!-- These keys used primary in all methods -->
+<xsl:key name="letter"
+ match="indexterm"
+ use="translate(substring(&primary;, 1, 1),&lowercase;,&uppercase;)"/>
+
+<xsl:key name="primary"
+ match="indexterm"
+ use="&primary;"/>
+
+<xsl:key name="secondary"
+ match="indexterm"
+ use="concat(&primary;, &sep;, &secondary;)"/>
+
+<xsl:key name="tertiary"
+ match="indexterm"
+ use="concat(&primary;, &sep;, &secondary;, &sep;, &tertiary;)"/>
+
+<xsl:key name="endofrange"
+ match="indexterm[@class='endofrange']"
+ use="@startref"/>
+
+<xsl:key name="see-also"
+ match="indexterm[seealso]"
+ use="concat(&primary;, &sep;,
+ &secondary;, &sep;,
+ &tertiary;, &sep;, seealso)"/>
+
+<xsl:key name="see"
+ match="indexterm[see]"
+ use="concat(&primary;, &sep;,
+ &secondary;, &sep;,
+ &tertiary;, &sep;, see)"/>
+
+
+<xsl:template name="generate-index">
+ <xsl:param name="scope" select="(ancestor::book|/)[last()]"/>
+
+ <xsl:choose>
+ <xsl:when test="$index.method = 'kosek'">
+ <xsl:call-template name="generate-kosek-index">
+ <xsl:with-param name="scope" select="$scope"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="$index.method = 'kimber'">
+ <xsl:call-template name="generate-kimber-index">
+ <xsl:with-param name="scope" select="$scope"/>
+ </xsl:call-template>
+ </xsl:when>
+
+ <xsl:otherwise>
+ <xsl:call-template name="generate-basic-index">
+ <xsl:with-param name="scope" select="$scope"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="generate-basic-index">
+ <xsl:param name="scope" select="NOTANODE"/>
+
+ <xsl:variable name="role">
+ <xsl:if test="$index.on.role != 0">
+ <xsl:value-of select="@role"/>
+ </xsl:if>
+ </xsl:variable>
+
+ <xsl:variable name="type">
+ <xsl:if test="$index.on.type != 0">
+ <xsl:value-of select="@type"/>
+ </xsl:if>
+ </xsl:variable>
+
+ <xsl:variable name="terms"
+ select="//indexterm
+ [count(.|key('letter',
+ translate(substring(&primary;, 1, 1),
+ &lowercase;,
+ &uppercase;))
+ [&scope;][1]) = 1
+ and not(@class = 'endofrange')]"/>
+
+ <xsl:variable name="alphabetical"
+ select="$terms[contains(concat(&lowercase;, &uppercase;),
+ substring(&primary;, 1, 1))]"/>
+
+ <xsl:variable name="others" select="$terms[not(contains(
+ concat(&lowercase;,
+ &uppercase;),
+ substring(&primary;, 1, 1)))]"/>
+ <fo:block>
+ <xsl:if test="$others">
+ <xsl:call-template name="indexdiv.title">
+ <xsl:with-param name="titlecontent">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'index symbols'"/>
+ </xsl:call-template>
+ </xsl:with-param>
+ </xsl:call-template>
+
+ <fo:block>
+ <xsl:apply-templates select="$others[count(.|key('primary',
+ &primary;)[&scope;][1]) = 1]"
+ mode="index-symbol-div">
+ <xsl:with-param name="scope" select="$scope"/>
+ <xsl:with-param name="role" select="$role"/>
+ <xsl:with-param name="type" select="$type"/>
+ <xsl:sort select="translate(&primary;, &lowercase;,
+ &uppercase;)"/>
+ </xsl:apply-templates>
+ </fo:block>
+ </xsl:if>
+
+ <xsl:apply-templates select="$alphabetical[count(.|key('letter',
+ translate(substring(&primary;, 1, 1),
+ &lowercase;,&uppercase;))
+ [&scope;][1]) = 1]"
+ mode="index-div-basic">
+ <xsl:with-param name="scope" select="$scope"/>
+ <xsl:with-param name="role" select="$role"/>
+ <xsl:with-param name="type" select="$type"/>
+ <xsl:sort select="translate(&primary;, &lowercase;, &uppercase;)"/>
+ </xsl:apply-templates>
+ </fo:block>
+</xsl:template>
+
+<!-- This template not used if fo/autoidx-kosek.xsl is imported -->
+<xsl:template name="generate-kosek-index">
+ <xsl:param name="scope" select="NOTANODE"/>
+
+ <xsl:variable name="vendor" select="system-property('xsl:vendor')"/>
+ <xsl:if test="contains($vendor, 'libxslt')">
+ <xsl:message terminate="yes">
+ <xsl:text>ERROR: the 'kosek' index method does not </xsl:text>
+ <xsl:text>work with the xsltproc XSLT processor.</xsl:text>
+ </xsl:message>
+ </xsl:if>
+
+
+ <xsl:if test="$exsl.node.set.available = 0">
+ <xsl:message terminate="yes">
+ <xsl:text>ERROR: the 'kosek' index method requires the </xsl:text>
+ <xsl:text>exslt:node-set() function. Use a processor that </xsl:text>
+ <xsl:text>has it, or use a different index method.</xsl:text>
+ </xsl:message>
+ </xsl:if>
+
+ <xsl:if test="$kosek.imported = 0">
+ <xsl:message terminate="yes">
+ <xsl:text>ERROR: the 'kosek' index method requires the&#xA;</xsl:text>
+ <xsl:text>kosek index extensions be imported:&#xA;</xsl:text>
+ <xsl:text> xsl:import href="fo/autoidx-kosek.xsl"</xsl:text>
+ </xsl:message>
+ </xsl:if>
+
+</xsl:template>
+
+
+<!-- This template not used if fo/autoidx-kimber.xsl is imported -->
+<xsl:template name="generate-kimber-index">
+ <xsl:param name="scope" select="NOTANODE"/>
+
+ <xsl:variable name="vendor" select="system-property('xsl:vendor')"/>
+ <xsl:if test="not(contains($vendor, 'SAXON '))">
+ <xsl:message terminate="yes">
+ <xsl:text>ERROR: the 'kimber' index method requires the </xsl:text>
+ <xsl:text>Saxon version 6 or 8 XSLT processor.</xsl:text>
+ </xsl:message>
+ </xsl:if>
+
+ <xsl:if test="$kimber.imported = 0">
+ <xsl:message terminate="yes">
+ <xsl:text>ERROR: the 'kimber' index method requires the&#xA;</xsl:text>
+ <xsl:text>kimber index extensions be imported:&#xA;</xsl:text>
+ <xsl:text> xsl:import href="fo/autoidx-kimber.xsl"</xsl:text>
+ </xsl:message>
+ </xsl:if>
+
+</xsl:template>
+
+<xsl:template match="indexterm" mode="index-div-basic">
+ <xsl:param name="scope" select="."/>
+ <xsl:param name="role" select="''"/>
+ <xsl:param name="type" select="''"/>
+
+ <xsl:variable name="key"
+ select="translate(substring(&primary;, 1, 1),
+ &lowercase;,&uppercase;)"/>
+
+ <xsl:if test="key('letter', $key)[&scope;]
+ [count(.|key('primary', &primary;)[&scope;][1]) = 1]">
+ <fo:block>
+ <xsl:if test="contains(concat(&lowercase;, &uppercase;), $key)">
+ <xsl:call-template name="indexdiv.title">
+ <xsl:with-param name="titlecontent">
+ <xsl:value-of select="translate($key, &lowercase;, &uppercase;)"/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:if>
+ <fo:block xsl:use-attribute-sets="index.entry.properties">
+ <xsl:apply-templates select="key('letter', $key)[&scope;]
+ [count(.|key('primary', &primary;)
+ [&scope;][1])=1]"
+ mode="index-primary">
+ <xsl:sort select="translate(&primary;, &lowercase;, &uppercase;)"/>
+ <xsl:with-param name="scope" select="$scope"/>
+ <xsl:with-param name="role" select="$role"/>
+ <xsl:with-param name="type" select="$type"/>
+ </xsl:apply-templates>
+ </fo:block>
+ </fo:block>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="indexterm" mode="index-symbol-div">
+ <xsl:param name="scope" select="."/>
+ <xsl:param name="role" select="''"/>
+ <xsl:param name="type" select="''"/>
+
+ <xsl:variable name="key"
+ select="translate(substring(&primary;, 1, 1),&lowercase;,&uppercase;)"/>
+
+ <fo:block xsl:use-attribute-sets="index.entry.properties">
+ <xsl:apply-templates select="key('letter', $key)[&scope;][count(.|key('primary', &primary;)[&scope;][1]) = 1]"
+ mode="index-primary">
+ <xsl:with-param name="scope" select="$scope"/>
+ <xsl:with-param name="role" select="$role"/>
+ <xsl:with-param name="type" select="$type"/>
+ <xsl:sort select="translate(&primary;, &lowercase;, &uppercase;)"/>
+ </xsl:apply-templates>
+ </fo:block>
+</xsl:template>
+
+<xsl:template match="indexterm" mode="index-primary">
+ <xsl:param name="scope" select="."/>
+ <xsl:param name="role" select="''"/>
+ <xsl:param name="type" select="''"/>
+
+ <xsl:variable name="key" select="&primary;"/>
+ <xsl:variable name="refs" select="key('primary', $key)[&scope;]"/>
+
+ <xsl:variable name="term.separator">
+ <xsl:call-template name="index.separator">
+ <xsl:with-param name="key" select="'index.term.separator'"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="range.separator">
+ <xsl:call-template name="index.separator">
+ <xsl:with-param name="key" select="'index.range.separator'"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="number.separator">
+ <xsl:call-template name="index.separator">
+ <xsl:with-param name="key" select="'index.number.separator'"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <fo:block>
+ <xsl:if test="$axf.extensions != 0">
+ <xsl:attribute name="axf:suppress-duplicate-page-number">true</xsl:attribute>
+ </xsl:if>
+
+ <xsl:for-each select="$refs/primary">
+ <xsl:if test="@id or @xml:id">
+ <fo:inline id="{(@id|@xml:id)[1]}"/>
+ </xsl:if>
+ </xsl:for-each>
+
+ <xsl:value-of select="primary"/>
+
+ <xsl:choose>
+ <xsl:when test="$xep.extensions != 0">
+ <xsl:if test="$refs[not(see) and not(secondary)]">
+ <xsl:copy-of select="$term.separator"/>
+ <xsl:variable name="primary" select="&primary;"/>
+ <xsl:variable name="primary.significant" select="concat(&primary;, $significant.flag)"/>
+ <rx:page-index list-separator="{$number.separator}"
+ range-separator="{$range.separator}">
+ <xsl:if test="$refs[@significance='preferred'][not(see) and not(secondary)]">
+ <rx:index-item xsl:use-attribute-sets="index.preferred.page.properties xep.index.item.properties"
+ ref-key="{$primary.significant}"/>
+ </xsl:if>
+ <xsl:if test="$refs[not(@significance) or @significance!='preferred'][not(see) and not(secondary)]">
+ <rx:index-item xsl:use-attribute-sets="xep.index.item.properties"
+ ref-key="{$primary}"/>
+ </xsl:if>
+ </rx:page-index>
+ </xsl:if>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:variable name="page-number-citations">
+ <xsl:for-each select="$refs[not(see)
+ and not(secondary)]">
+ <xsl:apply-templates select="." mode="reference">
+ <xsl:with-param name="scope" select="$scope"/>
+ <xsl:with-param name="role" select="$role"/>
+ <xsl:with-param name="type" select="$type"/>
+ <xsl:with-param name="position" select="position()"/>
+ </xsl:apply-templates>
+ </xsl:for-each>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="$passivetex.extensions != '0'">
+ <fotex:sort xmlns:fotex="http://www.tug.org/fotex">
+ <xsl:copy-of select="$page-number-citations"/>
+ </fotex:sort>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:copy-of select="$page-number-citations"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:if test="$refs[not(secondary)]/*[self::see]">
+ <xsl:apply-templates select="$refs[generate-id() = generate-id(key('see', concat(&primary;, &sep;, &sep;, &sep;, see))[&scope;][1])]"
+ mode="index-see">
+ <xsl:with-param name="scope" select="$scope"/>
+ <xsl:with-param name="role" select="$role"/>
+ <xsl:with-param name="type" select="$type"/>
+ <xsl:sort select="translate(see, &lowercase;, &uppercase;)"/>
+ </xsl:apply-templates>
+ </xsl:if>
+
+ </fo:block>
+
+ <xsl:if test="$refs/secondary or $refs[not(secondary)]/*[self::seealso]">
+ <fo:block start-indent="1pc">
+ <xsl:apply-templates select="$refs[generate-id() = generate-id(key('see-also', concat(&primary;, &sep;, &sep;, &sep;, seealso))[&scope;][1])]"
+ mode="index-seealso">
+ <xsl:with-param name="scope" select="$scope"/>
+ <xsl:with-param name="role" select="$role"/>
+ <xsl:with-param name="type" select="$type"/>
+ <xsl:sort select="translate(seealso, &lowercase;, &uppercase;)"/>
+ </xsl:apply-templates>
+ <xsl:apply-templates select="$refs[secondary and count(.|key('secondary', concat($key, &sep;, &secondary;))[&scope;][1]) = 1]"
+ mode="index-secondary">
+ <xsl:with-param name="scope" select="$scope"/>
+ <xsl:with-param name="role" select="$role"/>
+ <xsl:with-param name="type" select="$type"/>
+ <xsl:sort select="translate(&secondary;, &lowercase;, &uppercase;)"/>
+ </xsl:apply-templates>
+ </fo:block>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="indexterm" mode="index-secondary">
+ <xsl:param name="scope" select="."/>
+ <xsl:param name="role" select="''"/>
+ <xsl:param name="type" select="''"/>
+
+ <xsl:variable name="key" select="concat(&primary;, &sep;, &secondary;)"/>
+ <xsl:variable name="refs" select="key('secondary', $key)[&scope;]"/>
+
+ <xsl:variable name="term.separator">
+ <xsl:call-template name="index.separator">
+ <xsl:with-param name="key" select="'index.term.separator'"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="range.separator">
+ <xsl:call-template name="index.separator">
+ <xsl:with-param name="key" select="'index.range.separator'"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="number.separator">
+ <xsl:call-template name="index.separator">
+ <xsl:with-param name="key" select="'index.number.separator'"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <fo:block>
+ <xsl:if test="$axf.extensions != 0">
+ <xsl:attribute name="axf:suppress-duplicate-page-number">true</xsl:attribute>
+ </xsl:if>
+
+ <xsl:for-each select="$refs/secondary">
+ <xsl:if test="@id or @xml:id">
+ <fo:inline id="{(@id|@xml:id)[1]}"/>
+ </xsl:if>
+ </xsl:for-each>
+
+ <xsl:value-of select="secondary"/>
+
+ <xsl:choose>
+ <xsl:when test="$xep.extensions != 0">
+ <xsl:if test="$refs[not(see) and not(tertiary)]">
+ <xsl:copy-of select="$term.separator"/>
+ <xsl:variable name="primary" select="&primary;"/>
+ <xsl:variable name="secondary" select="&secondary;"/>
+ <xsl:variable name="primary.significant" select="concat(&primary;, $significant.flag)"/>
+ <rx:page-index list-separator="{$number.separator}"
+ range-separator="{$range.separator}">
+ <xsl:if test="$refs[@significance='preferred'][not(see) and not(tertiary)]">
+ <rx:index-item xsl:use-attribute-sets="index.preferred.page.properties xep.index.item.properties">
+ <xsl:attribute name="ref-key">
+ <xsl:value-of select="$primary.significant"/>
+ <xsl:text>, </xsl:text>
+ <xsl:value-of select="$secondary"/>
+ </xsl:attribute>
+ </rx:index-item>
+ </xsl:if>
+ <xsl:if test="$refs[not(@significance) or @significance!='preferred'][not(see) and not(tertiary)]">
+ <rx:index-item xsl:use-attribute-sets="xep.index.item.properties">
+ <xsl:attribute name="ref-key">
+ <xsl:value-of select="$primary"/>
+ <xsl:text>, </xsl:text>
+ <xsl:value-of select="$secondary"/>
+ </xsl:attribute>
+ </rx:index-item>
+ </xsl:if>
+ </rx:page-index>
+ </xsl:if>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:variable name="page-number-citations">
+ <xsl:for-each select="$refs[not(see)
+ and not(tertiary)]">
+ <xsl:apply-templates select="." mode="reference">
+ <xsl:with-param name="scope" select="$scope"/>
+ <xsl:with-param name="role" select="$role"/>
+ <xsl:with-param name="type" select="$type"/>
+ <xsl:with-param name="position" select="position()"/>
+ </xsl:apply-templates>
+ </xsl:for-each>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="$passivetex.extensions != '0'">
+ <fotex:sort xmlns:fotex="http://www.tug.org/fotex">
+ <xsl:copy-of select="$page-number-citations"/>
+ </fotex:sort>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:copy-of select="$page-number-citations"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:if test="$refs[not(tertiary)]/*[self::see]">
+ <xsl:apply-templates select="$refs[generate-id() = generate-id(key('see', concat(&primary;, &sep;, &secondary;, &sep;, &sep;, see))[&scope;][1])]"
+ mode="index-see">
+ <xsl:with-param name="scope" select="$scope"/>
+ <xsl:with-param name="role" select="$role"/>
+ <xsl:with-param name="type" select="$type"/>
+ <xsl:sort select="translate(see, &lowercase;, &uppercase;)"/>
+ </xsl:apply-templates>
+ </xsl:if>
+
+ </fo:block>
+
+ <xsl:if test="$refs/tertiary or $refs[not(tertiary)]/*[self::seealso]">
+ <fo:block start-indent="2pc">
+ <xsl:apply-templates select="$refs[generate-id() = generate-id(key('see-also', concat(&primary;, &sep;, &secondary;, &sep;, &sep;, seealso))[&scope;][1])]"
+ mode="index-seealso">
+ <xsl:with-param name="scope" select="$scope"/>
+ <xsl:with-param name="role" select="$role"/>
+ <xsl:with-param name="type" select="$type"/>
+ <xsl:sort select="translate(seealso, &lowercase;, &uppercase;)"/>
+ </xsl:apply-templates>
+ <xsl:apply-templates select="$refs[tertiary and count(.|key('tertiary', concat($key, &sep;, &tertiary;))[&scope;][1]) = 1]"
+ mode="index-tertiary">
+ <xsl:with-param name="scope" select="$scope"/>
+ <xsl:with-param name="role" select="$role"/>
+ <xsl:with-param name="type" select="$type"/>
+ <xsl:sort select="translate(&tertiary;, &lowercase;, &uppercase;)"/>
+ </xsl:apply-templates>
+ </fo:block>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="indexterm" mode="index-tertiary">
+ <xsl:param name="scope" select="."/>
+ <xsl:param name="role" select="''"/>
+ <xsl:param name="type" select="''"/>
+ <xsl:variable name="key" select="concat(&primary;, &sep;, &secondary;, &sep;, &tertiary;)"/>
+ <xsl:variable name="refs" select="key('tertiary', $key)[&scope;]"/>
+
+ <xsl:variable name="term.separator">
+ <xsl:call-template name="index.separator">
+ <xsl:with-param name="key" select="'index.term.separator'"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="range.separator">
+ <xsl:call-template name="index.separator">
+ <xsl:with-param name="key" select="'index.range.separator'"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="number.separator">
+ <xsl:call-template name="index.separator">
+ <xsl:with-param name="key" select="'index.number.separator'"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <fo:block>
+ <xsl:if test="$axf.extensions != 0">
+ <xsl:attribute name="axf:suppress-duplicate-page-number">true</xsl:attribute>
+ </xsl:if>
+
+ <xsl:for-each select="$refs/tertiary">
+ <xsl:if test="@id or @xml:id">
+ <fo:inline id="{(@id|@xml:id)[1]}"/>
+ </xsl:if>
+ </xsl:for-each>
+
+ <xsl:value-of select="tertiary"/>
+
+ <xsl:choose>
+ <xsl:when test="$xep.extensions != 0">
+ <xsl:if test="$refs[not(see)]">
+ <xsl:copy-of select="$term.separator"/>
+ <xsl:variable name="primary" select="&primary;"/>
+ <xsl:variable name="secondary" select="&secondary;"/>
+ <xsl:variable name="tertiary" select="&tertiary;"/>
+ <xsl:variable name="primary.significant" select="concat(&primary;, $significant.flag)"/>
+ <rx:page-index list-separator="{$number.separator}"
+ range-separator="{$range.separator}">
+ <xsl:if test="$refs[@significance='preferred'][not(see)]">
+ <rx:index-item xsl:use-attribute-sets="index.preferred.page.properties xep.index.item.properties">
+ <xsl:attribute name="ref-key">
+ <xsl:value-of select="$primary.significant"/>
+ <xsl:text>, </xsl:text>
+ <xsl:value-of select="$secondary"/>
+ <xsl:text>, </xsl:text>
+ <xsl:value-of select="$tertiary"/>
+ </xsl:attribute>
+ </rx:index-item>
+ </xsl:if>
+ <xsl:if test="$refs[not(@significance) or @significance!='preferred'][not(see)]">
+ <rx:index-item xsl:use-attribute-sets="xep.index.item.properties">
+ <xsl:attribute name="ref-key">
+ <xsl:value-of select="$primary"/>
+ <xsl:text>, </xsl:text>
+ <xsl:value-of select="$secondary"/>
+ <xsl:text>, </xsl:text>
+ <xsl:value-of select="$tertiary"/>
+ </xsl:attribute>
+ </rx:index-item>
+ </xsl:if>
+ </rx:page-index>
+ </xsl:if>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:variable name="page-number-citations">
+ <xsl:for-each select="$refs[not(see)]">
+ <xsl:apply-templates select="." mode="reference">
+ <xsl:with-param name="scope" select="$scope"/>
+ <xsl:with-param name="role" select="$role"/>
+ <xsl:with-param name="type" select="$type"/>
+ <xsl:with-param name="position" select="position()"/>
+ </xsl:apply-templates>
+ </xsl:for-each>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="$passivetex.extensions != '0'">
+ <fotex:sort xmlns:fotex="http://www.tug.org/fotex">
+ <xsl:copy-of select="$page-number-citations"/>
+ </fotex:sort>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:copy-of select="$page-number-citations"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:if test="$refs/see">
+ <xsl:apply-templates select="$refs[generate-id() = generate-id(key('see', concat(&primary;, &sep;, &secondary;, &sep;, &tertiary;, &sep;, see))[&scope;][1])]"
+ mode="index-see">
+ <xsl:with-param name="scope" select="$scope"/>
+ <xsl:with-param name="role" select="$role"/>
+ <xsl:with-param name="type" select="$type"/>
+ <xsl:sort select="translate(see, &lowercase;, &uppercase;)"/>
+ </xsl:apply-templates>
+ </xsl:if>
+
+ </fo:block>
+
+ <xsl:if test="$refs/seealso">
+ <fo:block>
+ <xsl:apply-templates select="$refs[generate-id() = generate-id(key('see-also', concat(&primary;, &sep;, &secondary;, &sep;, &tertiary;, &sep;, seealso))[&scope;][1])]"
+ mode="index-seealso">
+ <xsl:with-param name="scope" select="$scope"/>
+ <xsl:with-param name="role" select="$role"/>
+ <xsl:with-param name="type" select="$type"/>
+ <xsl:sort select="translate(seealso, &lowercase;, &uppercase;)"/>
+ </xsl:apply-templates>
+ </fo:block>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="indexterm" mode="reference">
+ <xsl:param name="scope" select="."/>
+ <xsl:param name="role" select="''"/>
+ <xsl:param name="type" select="''"/>
+ <xsl:param name="position" select="0"/>
+ <xsl:param name="separator" select="''"/>
+
+ <xsl:variable name="term.separator">
+ <xsl:call-template name="index.separator">
+ <xsl:with-param name="key" select="'index.term.separator'"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="range.separator">
+ <xsl:call-template name="index.separator">
+ <xsl:with-param name="key" select="'index.range.separator'"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="number.separator">
+ <xsl:call-template name="index.separator">
+ <xsl:with-param name="key" select="'index.number.separator'"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="$separator != ''">
+ <xsl:value-of select="$separator"/>
+ </xsl:when>
+ <xsl:when test="$position = 1">
+ <xsl:value-of select="$term.separator"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$number.separator"/>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:choose>
+ <xsl:when test="@zone and string(@zone)">
+ <xsl:call-template name="reference">
+ <xsl:with-param name="zones" select="normalize-space(@zone)"/>
+ <xsl:with-param name="scope" select="$scope"/>
+ <xsl:with-param name="role" select="$role"/>
+ <xsl:with-param name="type" select="$type"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="ancestor::*[contains(local-name(),'info') and not(starts-with(local-name(),'info'))]">
+ <xsl:call-template name="info.reference">
+ <xsl:with-param name="scope" select="$scope"/>
+ <xsl:with-param name="role" select="$role"/>
+ <xsl:with-param name="type" select="$type"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+
+ <fo:basic-link internal-destination="{$id}"
+ xsl:use-attribute-sets="index.page.number.properties">
+ <fo:page-number-citation ref-id="{$id}"/>
+ </fo:basic-link>
+
+ <xsl:if test="key('endofrange', $id)[&scope;]">
+ <xsl:apply-templates select="key('endofrange', $id)[&scope;][last()]"
+ mode="reference">
+ <xsl:with-param name="scope" select="$scope"/>
+ <xsl:with-param name="role" select="$role"/>
+ <xsl:with-param name="type" select="$type"/>
+ <xsl:with-param name="separator" select="$range.separator"/>
+ </xsl:apply-templates>
+ </xsl:if>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="reference">
+ <xsl:param name="scope" select="."/>
+ <xsl:param name="role" select="''"/>
+ <xsl:param name="type" select="''"/>
+ <xsl:param name="zones"/>
+
+ <xsl:variable name="number.separator">
+ <xsl:call-template name="index.separator">
+ <xsl:with-param name="key" select="'index.number.separator'"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="contains($zones, ' ')">
+ <xsl:variable name="zone" select="substring-before($zones, ' ')"/>
+ <xsl:variable name="target" select="key('id', $zone)"/>
+
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id">
+ <xsl:with-param name="object" select="$target[1]"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <fo:basic-link internal-destination="{$id}"
+ xsl:use-attribute-sets="index.page.number.properties">
+ <fo:page-number-citation ref-id="{$id}"/>
+ </fo:basic-link>
+
+ <xsl:if test="$passivetex.extensions = '0'">
+ <xsl:copy-of select="$number.separator"/>
+ </xsl:if>
+ <xsl:call-template name="reference">
+ <xsl:with-param name="zones" select="substring-after($zones, ' ')"/>
+ <xsl:with-param name="scope" select="$scope"/>
+ <xsl:with-param name="role" select="$role"/>
+ <xsl:with-param name="type" select="$type"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:variable name="zone" select="$zones"/>
+ <xsl:variable name="target" select="key('id', $zone)"/>
+
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id">
+ <xsl:with-param name="object" select="$target[1]"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <fo:basic-link internal-destination="{$id}"
+ xsl:use-attribute-sets="index.page.number.properties">
+ <fo:page-number-citation ref-id="{$id}"/>
+ </fo:basic-link>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="info.reference">
+ <!-- This is not perfect. It doesn't treat indexterm inside info element as a range covering whole parent of info.
+ It also not work when there is no ID generated for parent element. But it works in the most common cases. -->
+ <xsl:param name="scope" select="."/>
+ <xsl:param name="role" select="''"/>
+ <xsl:param name="type" select="''"/>
+
+ <xsl:variable name="target" select="(ancestor::appendix|ancestor::article|ancestor::bibliography|ancestor::book|
+ ancestor::chapter|ancestor::glossary|ancestor::part|ancestor::preface|
+ ancestor::refentry|ancestor::reference|ancestor::refsect1|ancestor::refsect2|
+ ancestor::refsect3|ancestor::refsection|ancestor::refsynopsisdiv|
+ ancestor::sect1|ancestor::sect2|ancestor::sect3|ancestor::sect4|ancestor::sect5|
+ ancestor::section|ancestor::setindex|ancestor::set|ancestor::sidebar|ancestor::mediaobject)[&scope;]"/>
+
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id">
+ <xsl:with-param name="object" select="$target[position() = last()]"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <fo:basic-link internal-destination="{$id}"
+ xsl:use-attribute-sets="index.page.number.properties">
+ <fo:page-number-citation ref-id="{$id}"/>
+ </fo:basic-link>
+</xsl:template>
+
+<xsl:template match="indexterm" mode="index-see">
+ <xsl:param name="scope" select="."/>
+ <xsl:param name="role" select="''"/>
+ <xsl:param name="type" select="''"/>
+
+ <fo:inline>
+ <xsl:text> (</xsl:text>
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'see'"/>
+ </xsl:call-template>
+ <xsl:text> </xsl:text>
+ <xsl:value-of select="see"/>
+ <xsl:text>)</xsl:text>
+ </fo:inline>
+</xsl:template>
+
+<xsl:template match="indexterm" mode="index-seealso">
+ <xsl:param name="scope" select="."/>
+ <xsl:param name="role" select="''"/>
+ <xsl:param name="type" select="''"/>
+
+ <xsl:for-each select="seealso">
+ <xsl:sort select="translate(., &lowercase;, &uppercase;)"/>
+ <fo:block>
+ <xsl:text>(</xsl:text>
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'seealso'"/>
+ </xsl:call-template>
+ <xsl:text> </xsl:text>
+ <xsl:value-of select="."/>
+ <xsl:text>)</xsl:text>
+ </fo:block>
+ </xsl:for-each>
+
+</xsl:template>
+
+<!-- ====================================================================== -->
+
+<xsl:template name="generate-index-markup">
+ <xsl:param name="scope" select="(ancestor::book|/)[last()]"/>
+ <xsl:param name="role" select="@role"/>
+ <xsl:param name="type" select="@type"/>
+
+ <xsl:variable name="terms" select="$scope//indexterm[count(.|key('letter',
+ translate(substring(&primary;, 1, 1),&lowercase;,&uppercase;))[&scope;][1]) = 1]"/>
+ <xsl:variable name="alphabetical"
+ select="$terms[contains(concat(&lowercase;, &uppercase;),
+ substring(&primary;, 1, 1))]"/>
+ <xsl:variable name="others" select="$terms[not(contains(concat(&lowercase;,
+ &uppercase;),
+ substring(&primary;, 1, 1)))]"/>
+
+ <xsl:text>&lt;index&gt;&#10;</xsl:text>
+ <xsl:if test="$others">
+ <xsl:text>&#10;&lt;indexdiv&gt;&#10;</xsl:text>
+ <xsl:text>&lt;title&gt;</xsl:text>
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'index symbols'"/>
+ </xsl:call-template>
+ <xsl:text>&lt;/title&gt;&#10;</xsl:text>
+ <xsl:apply-templates select="$others[count(.|key('primary',
+ &primary;)[&scope;][1]) = 1]"
+ mode="index-symbol-div-markup">
+ <xsl:with-param name="scope" select="$scope"/>
+ <xsl:with-param name="role" select="$role"/>
+ <xsl:with-param name="type" select="$type"/>
+ <xsl:sort select="translate(&primary;, &lowercase;, &uppercase;)"/>
+ </xsl:apply-templates>
+ <xsl:text>&lt;/indexdiv&gt;&#10;</xsl:text>
+ </xsl:if>
+
+ <xsl:apply-templates select="$alphabetical[count(.|key('letter',
+ translate(substring(&primary;, 1, 1),&lowercase;,&uppercase;))[&scope;][1]) = 1]"
+ mode="index-div-markup">
+ <xsl:with-param name="scope" select="$scope"/>
+ <xsl:with-param name="role" select="$role"/>
+ <xsl:with-param name="type" select="$type"/>
+ <xsl:sort select="translate(&primary;, &lowercase;, &uppercase;)"/>
+ </xsl:apply-templates>
+ <xsl:text>&lt;/index&gt;&#10;</xsl:text>
+</xsl:template>
+
+<xsl:template match="*" mode="index-markup">
+ <xsl:param name="scope" select="."/>
+ <xsl:param name="role" select="''"/>
+ <xsl:param name="type" select="''"/>
+
+ <xsl:text>&lt;</xsl:text>
+ <xsl:value-of select="local-name(.)"/>
+ <xsl:text>&gt;&#10;</xsl:text>
+ <xsl:apply-templates mode="index-markup">
+ <xsl:with-param name="scope" select="$scope"/>
+ <xsl:with-param name="role" select="$role"/>
+ <xsl:with-param name="type" select="$type"/>
+ </xsl:apply-templates>
+</xsl:template>
+
+<xsl:template match="indexterm" mode="index-div-markup">
+ <xsl:param name="scope" select="."/>
+ <xsl:param name="role" select="''"/>
+ <xsl:param name="type" select="''"/>
+ <xsl:variable name="key" select="translate(substring(&primary;, 1, 1),&lowercase;,&uppercase;)"/>
+ <xsl:text>&#10;&lt;indexdiv&gt;&#10;</xsl:text>
+ <xsl:text>&lt;title&gt;</xsl:text>
+ <xsl:value-of select="translate($key, &lowercase;, &uppercase;)"/>
+ <xsl:text>&lt;/title&gt;&#10;</xsl:text>
+
+ <xsl:apply-templates select="key('letter', $key)[&scope;][count(.|key('primary', &primary;)[&scope;][1]) = 1]"
+ mode="index-primary-markup">
+ <xsl:with-param name="scope" select="$scope"/>
+ <xsl:with-param name="role" select="$role"/>
+ <xsl:with-param name="type" select="$type"/>
+ <xsl:sort select="translate(&primary;, &lowercase;, &uppercase;)"/>
+ </xsl:apply-templates>
+ <xsl:text>&lt;/indexdiv&gt;&#10;</xsl:text>
+</xsl:template>
+
+<xsl:template match="indexterm" mode="index-symbol-div-markup">
+ <xsl:param name="scope" select="."/>
+ <xsl:param name="role" select="''"/>
+ <xsl:param name="type" select="''"/>
+ <xsl:variable name="key" select="translate(substring(&primary;, 1, 1),&lowercase;,&uppercase;)"/>
+
+ <xsl:apply-templates select="key('letter', $key)[&scope;][count(.|key('primary', &primary;)[&scope;][1]) = 1]"
+ mode="index-primary-markup">
+ <xsl:with-param name="scope" select="$scope"/>
+ <xsl:with-param name="role" select="$role"/>
+ <xsl:with-param name="type" select="$type"/>
+ <xsl:sort select="translate(&primary;, &lowercase;, &uppercase;)"/>
+ </xsl:apply-templates>
+</xsl:template>
+
+<xsl:template match="indexterm" mode="index-primary-markup">
+ <xsl:param name="scope" select="."/>
+ <xsl:param name="role" select="''"/>
+ <xsl:param name="type" select="''"/>
+ <xsl:variable name="key" select="&primary;"/>
+ <xsl:variable name="refs" select="key('primary', $key)[&scope;]"/>
+ <xsl:variable name="pages" select="$refs[not(see) and not(seealso)]"/>
+
+ <xsl:text>&#10;&lt;indexentry&gt;&#10;</xsl:text>
+ <xsl:text>&lt;primaryie&gt;</xsl:text>
+ <xsl:text>&lt;phrase&gt;</xsl:text>
+ <xsl:call-template name="escape-text">
+ <xsl:with-param name="text" select="string(primary)"/>
+ </xsl:call-template>
+ <xsl:text>&lt;/phrase&gt;</xsl:text>
+ <xsl:if test="$pages">,</xsl:if>
+ <xsl:text>&#10;</xsl:text>
+
+ <xsl:for-each select="$pages">
+ <xsl:apply-templates select="." mode="reference-markup">
+ <xsl:with-param name="scope" select="$scope"/>
+ <xsl:with-param name="role" select="$role"/>
+ <xsl:with-param name="type" select="$type"/>
+ </xsl:apply-templates>
+ </xsl:for-each>
+
+ <xsl:text>&lt;/primaryie&gt;&#10;</xsl:text>
+
+ <xsl:if test="$refs/secondary or $refs[not(secondary)]/*[self::see or self::seealso]">
+ <xsl:apply-templates select="$refs[generate-id() = generate-id(key('see', concat(&primary;, &sep;, &sep;, &sep;, see))[&scope;][1])]"
+ mode="index-see-markup">
+ <xsl:with-param name="scope" select="$scope"/>
+ <xsl:with-param name="role" select="$role"/>
+ <xsl:with-param name="type" select="$type"/>
+ <xsl:sort select="translate(see, &lowercase;, &uppercase;)"/>
+ </xsl:apply-templates>
+
+ <xsl:apply-templates select="$refs[generate-id() = generate-id(key('see-also', concat(&primary;, &sep;, &sep;, &sep;, seealso))[&scope;][1])]"
+ mode="index-seealso-markup">
+ <xsl:with-param name="scope" select="$scope"/>
+ <xsl:with-param name="role" select="$role"/>
+ <xsl:with-param name="type" select="$type"/>
+ <xsl:sort select="translate(seealso, &lowercase;, &uppercase;)"/>
+ </xsl:apply-templates>
+
+ <xsl:apply-templates select="$refs[secondary and count(.|key('secondary', concat($key, &sep;, &secondary;))[&scope;][1]) = 1]"
+ mode="index-secondary-markup">
+ <xsl:with-param name="scope" select="$scope"/>
+ <xsl:with-param name="role" select="$role"/>
+ <xsl:with-param name="type" select="$type"/>
+ <xsl:sort select="translate(&secondary;, &lowercase;, &uppercase;)"/>
+ </xsl:apply-templates>
+ </xsl:if>
+ <xsl:text>&lt;/indexentry&gt;&#10;</xsl:text>
+</xsl:template>
+
+<xsl:template match="indexterm" mode="index-secondary-markup">
+ <xsl:param name="scope" select="."/>
+ <xsl:param name="role" select="''"/>
+ <xsl:param name="type" select="''"/>
+ <xsl:variable name="key" select="concat(&primary;, &sep;, &secondary;)"/>
+ <xsl:variable name="refs" select="key('secondary', $key)[&scope;]"/>
+ <xsl:variable name="pages" select="$refs[not(see) and not(seealso)]"/>
+
+ <xsl:text>&lt;secondaryie&gt;</xsl:text>
+ <xsl:text>&lt;phrase&gt;</xsl:text>
+ <xsl:call-template name="escape-text">
+ <xsl:with-param name="text" select="string(secondary)"/>
+ </xsl:call-template>
+ <xsl:text>&lt;/phrase&gt;</xsl:text>
+ <xsl:if test="$pages">,</xsl:if>
+ <xsl:text>&#10;</xsl:text>
+
+ <xsl:for-each select="$pages">
+ <xsl:apply-templates select="." mode="reference-markup">
+ <xsl:with-param name="scope" select="$scope"/>
+ <xsl:with-param name="role" select="$role"/>
+ <xsl:with-param name="type" select="$type"/>
+ </xsl:apply-templates>
+ </xsl:for-each>
+
+ <xsl:text>&lt;/secondaryie&gt;&#10;</xsl:text>
+
+ <xsl:if test="$refs/tertiary or $refs[not(tertiary)]/*[self::see or self::seealso]">
+ <xsl:apply-templates select="$refs[generate-id() = generate-id(key('see', concat(&primary;, &sep;, &secondary;, &sep;, &sep;, see))[&scope;][1])]"
+ mode="index-see-markup">
+ <xsl:with-param name="scope" select="$scope"/>
+ <xsl:with-param name="role" select="$role"/>
+ <xsl:with-param name="type" select="$type"/>
+ <xsl:sort select="translate(see, &lowercase;, &uppercase;)"/>
+ </xsl:apply-templates>
+ <xsl:apply-templates select="$refs[generate-id() = generate-id(key('see-also', concat(&primary;, &sep;, &secondary;, &sep;, &sep;, seealso))[&scope;][1])]"
+ mode="index-seealso-markup">
+ <xsl:with-param name="scope" select="$scope"/>
+ <xsl:with-param name="role" select="$role"/>
+ <xsl:with-param name="type" select="$type"/>
+ <xsl:sort select="translate(seealso, &lowercase;, &uppercase;)"/>
+ </xsl:apply-templates>
+ <xsl:apply-templates select="$refs[tertiary and count(.|key('tertiary', concat($key, &sep;, &tertiary;))[&scope;][1]) = 1]"
+ mode="index-tertiary-markup">
+ <xsl:with-param name="scope" select="$scope"/>
+ <xsl:with-param name="role" select="$role"/>
+ <xsl:with-param name="type" select="$type"/>
+ <xsl:sort select="translate(&tertiary;, &lowercase;, &uppercase;)"/>
+ </xsl:apply-templates>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="indexterm" mode="index-tertiary-markup">
+ <xsl:param name="scope" select="."/>
+ <xsl:param name="role" select="''"/>
+ <xsl:param name="type" select="''"/>
+ <xsl:variable name="key" select="concat(&primary;, &sep;, &secondary;, &sep;, &tertiary;)"/>
+ <xsl:variable name="refs" select="key('tertiary', $key)[&scope;]"/>
+ <xsl:variable name="pages" select="$refs[not(see) and not(seealso)]"/>
+
+ <xsl:text>&lt;tertiaryie&gt;</xsl:text>
+ <xsl:text>&lt;phrase&gt;</xsl:text>
+ <xsl:call-template name="escape-text">
+ <xsl:with-param name="text" select="string(tertiary)"/>
+ </xsl:call-template>
+ <xsl:text>&lt;/phrase&gt;</xsl:text>
+ <xsl:if test="$pages">,</xsl:if>
+ <xsl:text>&#10;</xsl:text>
+
+ <xsl:for-each select="$pages">
+ <xsl:apply-templates select="." mode="reference-markup">
+ <xsl:with-param name="scope" select="$scope"/>
+ <xsl:with-param name="role" select="$role"/>
+ <xsl:with-param name="type" select="$type"/>
+ </xsl:apply-templates>
+ </xsl:for-each>
+
+ <xsl:text>&lt;/tertiaryie&gt;&#10;</xsl:text>
+
+ <xsl:variable name="see" select="$refs/see | $refs/seealso"/>
+ <xsl:if test="$see">
+ <xsl:apply-templates select="$refs[generate-id() = generate-id(key('see', concat(&primary;, &sep;, &secondary;, &sep;, &tertiary;, &sep;, see))[&scope;][1])]"
+ mode="index-see-markup">
+ <xsl:with-param name="scope" select="$scope"/>
+ <xsl:with-param name="role" select="$role"/>
+ <xsl:with-param name="type" select="$type"/>
+ <xsl:sort select="translate(see, &lowercase;, &uppercase;)"/>
+ </xsl:apply-templates>
+ <xsl:apply-templates select="$refs[generate-id() = generate-id(key('see-also', concat(&primary;, &sep;, &secondary;, &sep;, &tertiary;, &sep;, seealso))[&scope;][1])]"
+ mode="index-seealso-markup">
+ <xsl:with-param name="scope" select="$scope"/>
+ <xsl:with-param name="role" select="$role"/>
+ <xsl:with-param name="type" select="$type"/>
+ <xsl:sort select="translate(seealso, &lowercase;, &uppercase;)"/>
+ </xsl:apply-templates>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="indexterm" mode="reference-markup">
+ <xsl:param name="scope" select="."/>
+ <xsl:param name="role" select="''"/>
+ <xsl:param name="type" select="''"/>
+
+ <xsl:choose>
+ <xsl:when test="@zone and string(@zone)">
+ <xsl:call-template name="reference-markup">
+ <xsl:with-param name="zones" select="normalize-space(@zone)"/>
+ <xsl:with-param name="scope" select="$scope"/>
+ <xsl:with-param name="role" select="$role"/>
+ <xsl:with-param name="type" select="$type"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+
+
+ <xsl:choose>
+ <xsl:when test="@startref and @class='endofrange'">
+ <xsl:text>&lt;phrase role="pageno"&gt;</xsl:text>
+ <xsl:text>&lt;link linkend="</xsl:text>
+ <xsl:value-of select="@startref"/>
+ <xsl:text>"&gt;</xsl:text>
+ <fo:basic-link internal-destination="{@startref}"
+ xsl:use-attribute-sets="index.page.number.properties">
+ <fo:page-number-citation ref-id="{@startref}"/>
+ <xsl:text>-</xsl:text>
+ <fo:page-number-citation ref-id="{$id}"/>
+ </fo:basic-link>
+ <xsl:text>&lt;/link&gt;</xsl:text>
+ <xsl:text>&lt;/phrase&gt;&#10;</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text>&lt;phrase role="pageno"&gt;</xsl:text>
+ <xsl:if test="$id">
+ <xsl:text>&lt;link linkend="</xsl:text>
+ <xsl:value-of select="$id"/>
+ <xsl:text>"&gt;</xsl:text>
+ </xsl:if>
+ <fo:basic-link internal-destination="{$id}"
+ xsl:use-attribute-sets="index.page.number.properties">
+ <fo:page-number-citation ref-id="{$id}"/>
+ </fo:basic-link>
+ <xsl:if test="$id">
+ <xsl:text>&lt;/link&gt;</xsl:text>
+ </xsl:if>
+ <xsl:text>&lt;/phrase&gt;&#10;</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="reference-markup">
+ <xsl:param name="scope" select="."/>
+ <xsl:param name="role" select="''"/>
+ <xsl:param name="type" select="''"/>
+ <xsl:param name="zones"/>
+ <xsl:choose>
+ <xsl:when test="contains($zones, ' ')">
+ <xsl:variable name="zone" select="substring-before($zones, ' ')"/>
+ <xsl:variable name="target" select="key('id', $zone)[&scope;]"/>
+
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id">
+ <xsl:with-param name="object" select="$target[1]"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:text>&lt;phrase fole="pageno"&gt;</xsl:text>
+ <xsl:if test="$target[1]/@id or $target[1]/@xml:id">
+ <xsl:text>&lt;link linkend="</xsl:text>
+ <xsl:value-of select="$id"/>
+ <xsl:text>"&gt;</xsl:text>
+ </xsl:if>
+ <fo:basic-link internal-destination="{$id}"
+ xsl:use-attribute-sets="index.page.number.properties">
+ <fo:page-number-citation ref-id="{$id}"/>
+ </fo:basic-link>
+ <xsl:if test="$target[1]/@id or $target[1]/@xml:id">
+ <xsl:text>&lt;/link&gt;</xsl:text>
+ </xsl:if>
+ <xsl:text>&lt;/phrase&gt;&#10;</xsl:text>
+
+ <xsl:call-template name="reference">
+ <xsl:with-param name="zones" select="substring-after($zones, ' ')"/>
+ <xsl:with-param name="scope" select="$scope"/>
+ <xsl:with-param name="role" select="$role"/>
+ <xsl:with-param name="type" select="$type"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:variable name="zone" select="$zones"/>
+ <xsl:variable name="target" select="key('id', $zone)[&scope;]"/>
+
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id">
+ <xsl:with-param name="object" select="$target[1]"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:text>&lt;phrase role="pageno"&gt;</xsl:text>
+ <xsl:if test="$target[1]/@id or target[1]/@xml:id">
+ <xsl:text>&lt;link linkend="</xsl:text>
+ <xsl:value-of select="$id"/>
+ <xsl:text>"&gt;</xsl:text>
+ </xsl:if>
+ <fo:basic-link internal-destination="{$id}"
+ xsl:use-attribute-sets="index.page.number.properties">
+ <fo:page-number-citation ref-id="{$id}"/>
+ </fo:basic-link>
+ <xsl:if test="$target[1]/@id or target[1]/@xml:id">
+ <xsl:text>&lt;/link&gt;</xsl:text>
+ </xsl:if>
+ <xsl:text>&lt;/phrase&gt;&#10;</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="indexterm" mode="index-see-markup">
+ <xsl:param name="scope" select="."/>
+ <xsl:param name="role" select="''"/>
+ <xsl:param name="type" select="''"/>
+ <fo:block>
+ <xsl:text>&lt;seeie&gt;</xsl:text>
+ <xsl:text>&lt;phrase&gt;</xsl:text>
+ <xsl:call-template name="escape-text">
+ <xsl:with-param name="text" select="string(see)"/>
+ </xsl:call-template>
+ <xsl:text>&lt;/phrase&gt;</xsl:text>
+ <xsl:text>&lt;/seeie&gt;&#10;</xsl:text>
+ </fo:block>
+</xsl:template>
+
+<xsl:template match="indexterm" mode="index-seealso-markup">
+ <xsl:param name="scope" select="."/>
+ <xsl:param name="role" select="''"/>
+ <xsl:param name="type" select="''"/>
+ <fo:block>
+ <xsl:text>&lt;seealsoie&gt;</xsl:text>
+ <xsl:text>&lt;phrase&gt;</xsl:text>
+ <xsl:call-template name="escape-text">
+ <xsl:with-param name="text" select="string(seealso)"/>
+ </xsl:call-template>
+ <xsl:text>&lt;/phrase&gt;</xsl:text>
+ <xsl:text>&lt;/seealsoie&gt;&#10;</xsl:text>
+ </fo:block>
+</xsl:template>
+
+<xsl:template name="escape-text">
+ <xsl:param name="text" select="''"/>
+
+ <xsl:variable name="ltpos" select="substring-before($text, '&lt;')"/>
+ <xsl:variable name="amppos" select="substring-before($text, '&amp;')"/>
+
+ <xsl:choose>
+ <xsl:when test="contains($text,'&lt;') and contains($text, '&amp;')
+ and string-length($ltpos) &lt; string-length($amppos)">
+ <xsl:value-of select="$ltpos"/>
+ <xsl:text>&amp;lt;</xsl:text>
+ <xsl:call-template name="escape-text">
+ <xsl:with-param name="text" select="substring-after($text, '&lt;')"/>
+ </xsl:call-template>
+ </xsl:when>
+
+ <xsl:when test="contains($text,'&lt;') and contains($text, '&amp;')
+ and string-length($amppos) &lt; string-length($ltpos)">
+ <xsl:value-of select="$amppos"/>
+ <xsl:text>&amp;amp;</xsl:text>
+ <xsl:call-template name="escape-text">
+ <xsl:with-param name="text" select="substring-after($text, '&amp;')"/>
+ </xsl:call-template>
+ </xsl:when>
+
+ <xsl:when test="contains($text, '&lt;')">
+ <xsl:value-of select="$ltpos"/>
+ <xsl:text>&amp;lt;</xsl:text>
+ <xsl:call-template name="escape-text">
+ <xsl:with-param name="text" select="substring-after($text, '&lt;')"/>
+ </xsl:call-template>
+ </xsl:when>
+
+ <xsl:when test="contains($text, '&amp;')">
+ <xsl:value-of select="$amppos"/>
+ <xsl:text>&amp;amp;</xsl:text>
+ <xsl:call-template name="escape-text">
+ <xsl:with-param name="text" select="substring-after($text, '&amp;')"/>
+ </xsl:call-template>
+ </xsl:when>
+
+ <xsl:otherwise>
+ <xsl:value-of select="$text"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="index.separator">
+ <xsl:param name="key" select="''"/>
+ <xsl:param name="lang">
+ <xsl:call-template name="l10n.language"/>
+ </xsl:param>
+
+ <xsl:choose>
+ <xsl:when test="$key = 'index.term.separator'">
+ <xsl:choose>
+ <!-- Use the override if not blank -->
+ <xsl:when test="$index.term.separator != ''">
+ <xsl:copy-of select="$index.term.separator"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="gentext.template">
+ <xsl:with-param name="lang" select="$lang"/>
+ <xsl:with-param name="context">index</xsl:with-param>
+ <xsl:with-param name="name">term-separator</xsl:with-param>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:when test="$key = 'index.number.separator'">
+ <xsl:choose>
+ <!-- Use the override if not blank -->
+ <xsl:when test="$index.number.separator != ''">
+ <xsl:copy-of select="$index.number.separator"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="gentext.template">
+ <xsl:with-param name="lang" select="$lang"/>
+ <xsl:with-param name="context">index</xsl:with-param>
+ <xsl:with-param name="name">number-separator</xsl:with-param>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:when test="$key = 'index.range.separator'">
+ <xsl:choose>
+ <!-- Use the override if not blank -->
+ <xsl:when test="$index.range.separator != ''">
+ <xsl:copy-of select="$index.range.separator"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="gentext.template">
+ <xsl:with-param name="lang" select="$lang"/>
+ <xsl:with-param name="context">index</xsl:with-param>
+ <xsl:with-param name="name">range-separator</xsl:with-param>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ </xsl:choose>
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/autotoc.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/autotoc.xsl
new file mode 100644
index 0000000..c1079b8
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/autotoc.xsl
@@ -0,0 +1,915 @@
+<?xml version='1.0'?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:fo="http://www.w3.org/1999/XSL/Format"
+ xmlns:axf="http://www.antennahouse.com/names/XSL/Extensions"
+ version='1.0'>
+
+<!-- ********************************************************************
+ $Id: autotoc.xsl 8286 2009-03-06 22:53:04Z bobstayton $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<!-- ==================================================================== -->
+
+<xsl:template name="set.toc">
+
+ <xsl:param name="toc-context" select="."/>
+
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+
+ <xsl:variable name="cid">
+ <xsl:call-template name="object.id">
+ <xsl:with-param name="object" select="$toc-context"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="nodes" select="book|set|setindex"/>
+
+ <xsl:if test="$nodes">
+ <fo:block id="toc...{$id}"
+ xsl:use-attribute-sets="toc.margin.properties">
+ <xsl:if test="$axf.extensions != 0">
+ <xsl:attribute name="axf:outline-level">1</xsl:attribute>
+ <xsl:attribute name="axf:outline-expand">false</xsl:attribute>
+ <xsl:attribute name="axf:outline-title">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'TableofContents'"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:call-template name="table.of.contents.titlepage"/>
+ <xsl:apply-templates select="$nodes" mode="toc">
+ <xsl:with-param name="toc-context" select="$toc-context"/>
+ </xsl:apply-templates>
+ </fo:block>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template name="division.toc">
+ <xsl:param name="toc-context" select="."/>
+ <xsl:param name="toc.title.p" select="true()"/>
+
+ <xsl:variable name="cid">
+ <xsl:call-template name="object.id">
+ <xsl:with-param name="object" select="$toc-context"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="nodes"
+ select="$toc-context/part
+ |$toc-context/reference
+ |$toc-context/preface
+ |$toc-context/chapter
+ |$toc-context/appendix
+ |$toc-context/article
+ |$toc-context/bibliography
+ |$toc-context/glossary
+ |$toc-context/index"/>
+
+ <xsl:if test="$nodes">
+ <fo:block id="toc...{$cid}"
+ xsl:use-attribute-sets="toc.margin.properties">
+ <xsl:if test="$axf.extensions != 0">
+ <xsl:attribute name="axf:outline-level">1</xsl:attribute>
+ <xsl:attribute name="axf:outline-expand">false</xsl:attribute>
+ <xsl:attribute name="axf:outline-title">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'TableofContents'"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:if test="$toc.title.p">
+ <xsl:call-template name="table.of.contents.titlepage"/>
+ </xsl:if>
+ <xsl:apply-templates select="$nodes" mode="toc">
+ <xsl:with-param name="toc-context" select="$toc-context"/>
+ </xsl:apply-templates>
+ </fo:block>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template name="component.toc">
+ <xsl:param name="toc-context" select="."/>
+ <xsl:param name="toc.title.p" select="true()"/>
+
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+
+ <xsl:variable name="cid">
+ <xsl:call-template name="object.id">
+ <xsl:with-param name="object" select="$toc-context"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="nodes" select="section|sect1|refentry
+ |article|bibliography|glossary
+ |qandaset[$qanda.in.toc != 0]
+ |appendix|index"/>
+ <xsl:if test="$nodes">
+ <fo:block id="toc...{$id}"
+ xsl:use-attribute-sets="toc.margin.properties">
+ <xsl:if test="$toc.title.p">
+ <xsl:call-template name="table.of.contents.titlepage"/>
+ </xsl:if>
+ <xsl:apply-templates select="$nodes" mode="toc">
+ <xsl:with-param name="toc-context" select="$toc-context"/>
+ </xsl:apply-templates>
+ </fo:block>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template name="component.toc.separator">
+ <!-- Customize to output something between
+ component.toc and first output -->
+</xsl:template>
+
+<xsl:template name="section.toc">
+ <xsl:param name="toc-context" select="."/>
+ <xsl:param name="toc.title.p" select="true()"/>
+
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+
+ <xsl:variable name="cid">
+ <xsl:call-template name="object.id">
+ <xsl:with-param name="object" select="$toc-context"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="nodes"
+ select="section|sect1|sect2|sect3|sect4|sect5|refentry
+ |qandaset[$qanda.in.toc != 0]
+ |bridgehead[$bridgehead.in.toc != 0]"/>
+
+ <xsl:variable name="level">
+ <xsl:call-template name="section.level"/>
+ </xsl:variable>
+
+ <xsl:if test="$nodes">
+ <fo:block id="toc...{$id}"
+ xsl:use-attribute-sets="toc.margin.properties">
+
+ <xsl:if test="$toc.title.p">
+ <xsl:call-template name="section.heading">
+ <xsl:with-param name="level" select="$level + 1"/>
+ <xsl:with-param name="title">
+ <fo:block space-after="0.5em">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'TableofContents'"/>
+ </xsl:call-template>
+ </fo:block>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:if>
+
+ <xsl:apply-templates select="$nodes" mode="toc">
+ <xsl:with-param name="toc-context" select="$toc-context"/>
+ </xsl:apply-templates>
+ </fo:block>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template name="section.toc.separator">
+ <!-- Customize to output something between
+ section.toc and first output -->
+</xsl:template>
+<!-- ==================================================================== -->
+
+<xsl:template name="toc.line">
+ <xsl:param name="toc-context" select="NOTANODE"/>
+
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+
+ <xsl:variable name="label">
+ <xsl:apply-templates select="." mode="label.markup"/>
+ </xsl:variable>
+
+ <fo:block xsl:use-attribute-sets="toc.line.properties">
+ <fo:inline keep-with-next.within-line="always">
+ <fo:basic-link internal-destination="{$id}">
+ <xsl:if test="$label != ''">
+ <xsl:copy-of select="$label"/>
+ <xsl:value-of select="$autotoc.label.separator"/>
+ </xsl:if>
+ <xsl:apply-templates select="." mode="titleabbrev.markup"/>
+ </fo:basic-link>
+ </fo:inline>
+ <fo:inline keep-together.within-line="always">
+ <xsl:text> </xsl:text>
+ <fo:leader leader-pattern="dots"
+ leader-pattern-width="3pt"
+ leader-alignment="reference-area"
+ keep-with-next.within-line="always"/>
+ <xsl:text> </xsl:text>
+ <fo:basic-link internal-destination="{$id}">
+ <fo:page-number-citation ref-id="{$id}"/>
+ </fo:basic-link>
+ </fo:inline>
+ </fo:block>
+</xsl:template>
+
+<!-- ==================================================================== -->
+<xsl:template name="qandaset.toc">
+ <xsl:param name="toc-context" select="."/>
+ <xsl:param name="toc.title.p" select="true()"/>
+
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+
+ <xsl:variable name="cid">
+ <xsl:call-template name="object.id">
+ <xsl:with-param name="object" select="$toc-context"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="nodes" select="qandadiv|qandaentry"/>
+
+ <xsl:if test="$nodes">
+ <fo:block id="toc...{$id}"
+ xsl:use-attribute-sets="toc.margin.properties">
+ <xsl:if test="$toc.title.p">
+ <xsl:call-template name="table.of.contents.titlepage"/>
+ </xsl:if>
+ <xsl:apply-templates select="$nodes" mode="toc">
+ <xsl:with-param name="toc-context" select="$toc-context"/>
+ </xsl:apply-templates>
+ </fo:block>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template name="qandaset.toc.separator">
+ <!-- Customize to output something between
+ qandaset.toc and first output -->
+</xsl:template>
+
+<xsl:template match="qandadiv" mode="toc">
+ <xsl:param name="toc-context" select="."/>
+
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+
+ <xsl:variable name="cid">
+ <xsl:call-template name="object.id">
+ <xsl:with-param name="object" select="$toc-context"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:call-template name="toc.line">
+ <xsl:with-param name="toc-context" select="$toc-context"/>
+ </xsl:call-template>
+
+ <xsl:variable name="nodes" select="qandadiv|qandaentry"/>
+
+ <xsl:if test="$nodes">
+ <fo:block id="toc.{$cid}.{$id}">
+ <xsl:attribute name="margin-{$direction.align.start}">
+ <xsl:call-template name="set.toc.indent"/>
+ </xsl:attribute>
+
+ <xsl:apply-templates select="$nodes" mode="toc">
+ <xsl:with-param name="toc-context" select="$toc-context"/>
+ </xsl:apply-templates>
+ </fo:block>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="qandaentry" mode="toc">
+ <xsl:apply-templates select="question" mode="toc"/>
+</xsl:template>
+
+<xsl:template match="question" mode="toc">
+ <xsl:variable name="firstchunk">
+ <!-- Use a titleabbrev or title if available -->
+ <xsl:choose>
+ <xsl:when test="../blockinfo/titleabbrev">
+ <xsl:apply-templates select="../blockinfo/titleabbrev[1]/node()"/>
+ </xsl:when>
+ <xsl:when test="../blockinfo/title">
+ <xsl:apply-templates select="../blockinfo/title[1]/node()"/>
+ </xsl:when>
+ <xsl:when test="../info/titleabbrev">
+ <xsl:apply-templates select="../info/titleabbrev[1]/node()"/>
+ </xsl:when>
+ <xsl:when test="../titleabbrev">
+ <xsl:apply-templates select="../titleabbrev[1]/node()"/>
+ </xsl:when>
+ <xsl:when test="../info/title">
+ <xsl:apply-templates select="../info/title[1]/node()"/>
+ </xsl:when>
+ <xsl:when test="../title">
+ <xsl:apply-templates select="../title[1]/node()"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="(*[local-name(.)!='label'])[1]/node()"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="deflabel">
+ <xsl:choose>
+ <xsl:when test="ancestor-or-self::*[@defaultlabel]">
+ <xsl:value-of select="(ancestor-or-self::*[@defaultlabel])[last()]
+ /@defaultlabel"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$qanda.defaultlabel"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+
+ <xsl:variable name="label">
+ <xsl:apply-templates select="." mode="label.markup"/>
+ </xsl:variable>
+
+ <fo:block xsl:use-attribute-sets="toc.line.properties"
+ end-indent="{$toc.indent.width}pt"
+ last-line-end-indent="-{$toc.indent.width}pt">
+ <xsl:attribute name="margin-{$direction.align.start}">3em</xsl:attribute>
+ <xsl:attribute name="text-indent">-3em</xsl:attribute>
+ <fo:inline keep-with-next.within-line="always">
+ <fo:basic-link internal-destination="{$id}">
+ <xsl:if test="$label != ''">
+ <xsl:copy-of select="$label"/>
+ <xsl:if test="$deflabel = 'number' and not(label)">
+ <xsl:value-of select="$autotoc.label.separator"/>
+ </xsl:if>
+ <xsl:text> </xsl:text>
+ </xsl:if>
+ <xsl:copy-of select="$firstchunk"/>
+ </fo:basic-link>
+ </fo:inline>
+ <fo:inline keep-together.within-line="always">
+ <xsl:text> </xsl:text>
+ <fo:leader leader-pattern="dots"
+ leader-pattern-width="3pt"
+ leader-alignment="reference-area"
+ keep-with-next.within-line="always"/>
+ <xsl:text> </xsl:text>
+ <fo:basic-link internal-destination="{$id}">
+ <fo:page-number-citation ref-id="{$id}"/>
+ </fo:basic-link>
+ </fo:inline>
+ </fo:block>
+
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="book|setindex" mode="toc">
+ <xsl:param name="toc-context" select="."/>
+
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+
+ <xsl:variable name="cid">
+ <xsl:call-template name="object.id">
+ <xsl:with-param name="object" select="$toc-context"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:call-template name="toc.line">
+ <xsl:with-param name="toc-context" select="$toc-context"/>
+ </xsl:call-template>
+
+ <xsl:variable name="nodes" select="glossary|bibliography|preface|chapter
+ |reference|part|article|appendix|index"/>
+
+ <xsl:variable name="depth.from.context" select="count(ancestor::*)-count($toc-context/ancestor::*)"/>
+
+ <xsl:if test="$toc.section.depth > 0
+ and $toc.max.depth > $depth.from.context
+ and $nodes">
+ <fo:block id="toc.{$cid}.{$id}">
+ <xsl:attribute name="margin-{$direction.align.start}">
+ <xsl:call-template name="set.toc.indent"/>
+ </xsl:attribute>
+
+ <xsl:apply-templates select="$nodes" mode="toc">
+ <xsl:with-param name="toc-context" select="$toc-context"/>
+ </xsl:apply-templates>
+ </fo:block>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="set" mode="toc">
+ <xsl:param name="toc-context" select="."/>
+
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+
+ <xsl:variable name="cid">
+ <xsl:call-template name="object.id">
+ <xsl:with-param name="object" select="$toc-context"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:call-template name="toc.line">
+ <xsl:with-param name="toc-context" select="$toc-context"/>
+ </xsl:call-template>
+
+ <xsl:variable name="nodes" select="set|book|setindex"/>
+
+ <xsl:variable name="depth.from.context" select="count(ancestor::*)-count($toc-context/ancestor::*)"/>
+
+ <xsl:if test="$toc.section.depth > 0
+ and $toc.max.depth > $depth.from.context
+ and $nodes">
+ <fo:block id="toc.{$cid}.{$id}">
+ <xsl:attribute name="margin-{$direction.align.start}">
+ <xsl:call-template name="set.toc.indent"/>
+ </xsl:attribute>
+
+ <xsl:apply-templates select="$nodes" mode="toc">
+ <xsl:with-param name="toc-context" select="$toc-context"/>
+ </xsl:apply-templates>
+ </fo:block>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="part" mode="toc">
+ <xsl:param name="toc-context" select="."/>
+
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+
+ <xsl:variable name="cid">
+ <xsl:call-template name="object.id">
+ <xsl:with-param name="object" select="$toc-context"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:call-template name="toc.line">
+ <xsl:with-param name="toc-context" select="$toc-context"/>
+ </xsl:call-template>
+
+ <xsl:variable name="nodes" select="chapter|appendix|preface|reference|
+ refentry|article|index|glossary|
+ bibliography"/>
+
+ <xsl:variable name="depth.from.context" select="count(ancestor::*)-count($toc-context/ancestor::*)"/>
+
+ <xsl:if test="$toc.section.depth > 0
+ and $toc.max.depth > $depth.from.context
+ and $nodes">
+ <fo:block id="toc.{$cid}.{$id}">
+ <xsl:attribute name="margin-{$direction.align.start}">
+ <xsl:call-template name="set.toc.indent"/>
+ </xsl:attribute>
+
+ <xsl:apply-templates select="$nodes" mode="toc">
+ <xsl:with-param name="toc-context" select="$toc-context"/>
+ </xsl:apply-templates>
+ </fo:block>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="reference" mode="toc">
+ <xsl:param name="toc-context" select="."/>
+
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+
+ <xsl:variable name="cid">
+ <xsl:call-template name="object.id">
+ <xsl:with-param name="object" select="$toc-context"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="depth.from.context" select="count(ancestor::*)-count($toc-context/ancestor::*)"/>
+
+ <xsl:call-template name="toc.line">
+ <xsl:with-param name="toc-context" select="$toc-context"/>
+ </xsl:call-template>
+
+ <xsl:if test="$toc.section.depth > 0
+ and $toc.max.depth > $depth.from.context
+ and refentry">
+ <fo:block id="toc.{$cid}.{$id}">
+ <xsl:attribute name="margin-{$direction.align.start}">
+ <xsl:call-template name="set.toc.indent"/>
+ </xsl:attribute>
+
+ <xsl:apply-templates select="refentry" mode="toc">
+ <xsl:with-param name="toc-context" select="$toc-context"/>
+ </xsl:apply-templates>
+ </fo:block>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="refentry" mode="toc">
+ <xsl:param name="toc-context" select="."/>
+
+ <xsl:call-template name="toc.line">
+ <xsl:with-param name="toc-context" select="$toc-context"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="preface|chapter|appendix|article"
+ mode="toc">
+ <xsl:param name="toc-context" select="."/>
+
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+
+ <xsl:variable name="cid">
+ <xsl:call-template name="object.id">
+ <xsl:with-param name="object" select="$toc-context"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:call-template name="toc.line">
+ <xsl:with-param name="toc-context" select="$toc-context"/>
+ </xsl:call-template>
+
+ <xsl:variable name="nodes" select="section|sect1
+ |qandaset[$qanda.in.toc != 0]
+ |simplesect[$simplesect.in.toc != 0]
+ |refentry|appendix"/>
+
+ <xsl:variable name="depth.from.context" select="count(ancestor::*)-count($toc-context/ancestor::*)"/>
+
+ <xsl:if test="$toc.section.depth > 0
+ and $toc.max.depth > $depth.from.context
+ and $nodes">
+ <fo:block id="toc.{$cid}.{$id}">
+ <xsl:attribute name="margin-{$direction.align.start}">
+ <xsl:call-template name="set.toc.indent"/>
+ </xsl:attribute>
+
+ <xsl:apply-templates select="$nodes" mode="toc">
+ <xsl:with-param name="toc-context" select="$toc-context"/>
+ </xsl:apply-templates>
+ </fo:block>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="sect1" mode="toc">
+ <xsl:param name="toc-context" select="."/>
+
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+
+ <xsl:variable name="cid">
+ <xsl:call-template name="object.id">
+ <xsl:with-param name="object" select="$toc-context"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:call-template name="toc.line">
+ <xsl:with-param name="toc-context" select="$toc-context"/>
+ </xsl:call-template>
+
+ <xsl:variable name="depth.from.context" select="count(ancestor::*)-count($toc-context/ancestor::*)"/>
+
+ <xsl:if test="$toc.section.depth > 1
+ and $toc.max.depth > $depth.from.context
+ and sect2">
+ <fo:block id="toc.{$cid}.{$id}">
+ <xsl:attribute name="margin-{$direction.align.start}">
+ <xsl:call-template name="set.toc.indent"/>
+ </xsl:attribute>
+
+ <xsl:apply-templates select="sect2|qandaset[$qanda.in.toc != 0]"
+ mode="toc">
+ <xsl:with-param name="toc-context" select="$toc-context"/>
+ </xsl:apply-templates>
+ </fo:block>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="sect2" mode="toc">
+ <xsl:param name="toc-context" select="."/>
+
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+
+ <xsl:variable name="cid">
+ <xsl:call-template name="object.id">
+ <xsl:with-param name="object" select="$toc-context"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:call-template name="toc.line">
+ <xsl:with-param name="toc-context" select="$toc-context"/>
+ </xsl:call-template>
+
+ <xsl:variable name="reldepth"
+ select="count(ancestor::*)-count($toc-context/ancestor::*)"/>
+
+ <xsl:variable name="depth.from.context" select="count(ancestor::*)-count($toc-context/ancestor::*)"/>
+
+ <xsl:if test="$toc.section.depth > 2
+ and $toc.max.depth > $depth.from.context
+ and sect3">
+ <fo:block id="toc.{$cid}.{$id}">
+ <xsl:attribute name="margin-{$direction.align.start}">
+ <xsl:call-template name="set.toc.indent">
+ <xsl:with-param name="reldepth" select="$reldepth"/>
+ </xsl:call-template>
+ </xsl:attribute>
+
+ <xsl:apply-templates select="sect3|qandaset[$qanda.in.toc != 0]"
+ mode="toc">
+ <xsl:with-param name="toc-context" select="$toc-context"/>
+ </xsl:apply-templates>
+ </fo:block>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="sect3" mode="toc">
+ <xsl:param name="toc-context" select="."/>
+
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+
+ <xsl:variable name="cid">
+ <xsl:call-template name="object.id">
+ <xsl:with-param name="object" select="$toc-context"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:call-template name="toc.line">
+ <xsl:with-param name="toc-context" select="$toc-context"/>
+ </xsl:call-template>
+
+ <xsl:variable name="reldepth"
+ select="count(ancestor::*)-count($toc-context/ancestor::*)"/>
+
+ <xsl:variable name="depth.from.context" select="count(ancestor::*)-count($toc-context/ancestor::*)"/>
+
+ <xsl:if test="$toc.section.depth > 3
+ and $toc.max.depth > $depth.from.context
+ and sect4">
+ <fo:block id="toc.{$cid}.{$id}">
+ <xsl:attribute name="margin-{$direction.align.start}">
+ <xsl:call-template name="set.toc.indent">
+ <xsl:with-param name="reldepth" select="$reldepth"/>
+ </xsl:call-template>
+ </xsl:attribute>
+
+ <xsl:apply-templates select="sect4|qandaset[$qanda.in.toc != 0]"
+ mode="toc">
+ <xsl:with-param name="toc-context" select="$toc-context"/>
+ </xsl:apply-templates>
+ </fo:block>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="sect4" mode="toc">
+ <xsl:param name="toc-context" select="."/>
+
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+
+ <xsl:variable name="cid">
+ <xsl:call-template name="object.id">
+ <xsl:with-param name="object" select="$toc-context"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:call-template name="toc.line">
+ <xsl:with-param name="toc-context" select="$toc-context"/>
+ </xsl:call-template>
+
+ <xsl:variable name="reldepth"
+ select="count(ancestor::*)-count($toc-context/ancestor::*)"/>
+
+ <xsl:variable name="depth.from.context" select="count(ancestor::*)-count($toc-context/ancestor::*)"/>
+
+ <xsl:if test="$toc.section.depth > 4
+ and $toc.max.depth > $depth.from.context
+ and sect5">
+ <fo:block id="toc.{$cid}.{$id}">
+ <xsl:attribute name="margin-{$direction.align.start}">
+ <xsl:call-template name="set.toc.indent">
+ <xsl:with-param name="reldepth" select="$reldepth"/>
+ </xsl:call-template>
+ </xsl:attribute>
+
+ <xsl:apply-templates select="sect5|qandaset[$qanda.in.toc != 0]"
+ mode="toc">
+ <xsl:with-param name="toc-context" select="$toc-context"/>
+ </xsl:apply-templates>
+ </fo:block>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="sect5|simplesect" mode="toc">
+ <xsl:param name="toc-context" select="."/>
+
+ <xsl:call-template name="toc.line">
+ <xsl:with-param name="toc-context" select="$toc-context"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template name="set.toc.indent">
+ <xsl:param name="reldepth"/>
+
+ <xsl:variable name="depth">
+ <xsl:choose>
+ <xsl:when test="$reldepth != ''">
+ <xsl:value-of select="$reldepth"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="count(ancestor::*)"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="$fop.extensions != 0 or $passivetex.extensions != 0">
+ <xsl:value-of select="concat($depth*$toc.indent.width, 'pt')"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="concat($toc.indent.width, 'pt')"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+
+<xsl:template match="section" mode="toc">
+ <xsl:param name="toc-context" select="."/>
+
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+
+ <xsl:variable name="cid">
+ <xsl:call-template name="object.id">
+ <xsl:with-param name="object" select="$toc-context"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="depth" select="count(ancestor::section) + 1"/>
+ <xsl:variable name="reldepth"
+ select="count(ancestor::*)-count($toc-context/ancestor::*)"/>
+
+ <xsl:variable name="depth.from.context" select="count(ancestor::*)-count($toc-context/ancestor::*)"/>
+
+ <xsl:if test="$toc.section.depth &gt;= $depth">
+ <xsl:call-template name="toc.line">
+ <xsl:with-param name="toc-context" select="$toc-context"/>
+ </xsl:call-template>
+
+ <xsl:if test="$toc.section.depth > $depth
+ and $toc.max.depth > $depth.from.context
+ and section">
+ <fo:block id="toc.{$cid}.{$id}">
+ <xsl:attribute name="margin-{$direction.align.start}">
+ <xsl:call-template name="set.toc.indent">
+ <xsl:with-param name="reldepth" select="$reldepth"/>
+ </xsl:call-template>
+ </xsl:attribute>
+
+ <xsl:apply-templates select="section|qandaset[$qanda.in.toc != 0]"
+ mode="toc">
+ <xsl:with-param name="toc-context" select="$toc-context"/>
+ </xsl:apply-templates>
+ </fo:block>
+ </xsl:if>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="bibliography|glossary"
+ mode="toc">
+ <xsl:param name="toc-context" select="."/>
+
+ <xsl:call-template name="toc.line">
+ <xsl:with-param name="toc-context" select="$toc-context"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="index" mode="toc">
+ <xsl:param name="toc-context" select="."/>
+
+ <xsl:if test="* or $generate.index != 0">
+ <xsl:call-template name="toc.line">
+ <xsl:with-param name="toc-context" select="$toc-context"/>
+ </xsl:call-template>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="title" mode="toc">
+ <xsl:apply-templates/>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template name="list.of.titles">
+ <xsl:param name="titles" select="'table'"/>
+ <xsl:param name="nodes" select=".//table"/>
+ <xsl:param name="toc-context" select="."/>
+
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+
+ <xsl:if test="$nodes">
+ <fo:block id="lot...{$titles}...{$id}">
+ <xsl:choose>
+ <xsl:when test="$titles='table'">
+ <xsl:call-template name="list.of.tables.titlepage"/>
+ </xsl:when>
+ <xsl:when test="$titles='figure'">
+ <xsl:call-template name="list.of.figures.titlepage"/>
+ </xsl:when>
+ <xsl:when test="$titles='equation'">
+ <xsl:call-template name="list.of.equations.titlepage"/>
+ </xsl:when>
+ <xsl:when test="$titles='example'">
+ <xsl:call-template name="list.of.examples.titlepage"/>
+ </xsl:when>
+ <xsl:when test="$titles='procedure'">
+ <xsl:call-template name="list.of.procedures.titlepage"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="list.of.unknowns.titlepage"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:apply-templates select="$nodes" mode="toc">
+ <xsl:with-param name="toc-context" select="$toc-context"/>
+ </xsl:apply-templates>
+ </fo:block>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="figure|table|example|equation|procedure" mode="toc">
+ <xsl:param name="toc-context" select="."/>
+ <xsl:call-template name="toc.line">
+ <xsl:with-param name="toc-context" select="$toc-context"/>
+ </xsl:call-template>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<!-- qandaset handled like a section when qanda.in.toc is set -->
+<xsl:template match="qandaset" mode="toc">
+ <xsl:param name="toc-context" select="."/>
+
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+
+ <xsl:variable name="cid">
+ <xsl:call-template name="object.id">
+ <xsl:with-param name="object" select="$toc-context"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="depth" select="count(ancestor::section) + 1"/>
+ <xsl:variable name="reldepth"
+ select="count(ancestor::*)-count($toc-context/ancestor::*)"/>
+
+ <xsl:variable name="depth.from.context" select="count(ancestor::*)-count($toc-context/ancestor::*)"/>
+
+ <xsl:if test="$toc.section.depth &gt;= $depth">
+ <xsl:call-template name="toc.line">
+ <xsl:with-param name="toc-context" select="$toc-context"/>
+ </xsl:call-template>
+
+ <xsl:if test="$toc.section.depth > $depth
+ and $toc.max.depth > $depth.from.context
+ and (child::qandadiv or child::qandaentry)">
+ <fo:block id="toc.{$cid}.{$id}">
+ <xsl:attribute name="margin-{$direction.align.start}">
+ <xsl:call-template name="set.toc.indent">
+ <xsl:with-param name="reldepth" select="$reldepth"/>
+ </xsl:call-template>
+ </xsl:attribute>
+
+ <xsl:apply-templates select="qandadiv|qandaentry" mode="toc">
+ <xsl:with-param name="toc-context" select="$toc-context"/>
+ </xsl:apply-templates>
+ </fo:block>
+ </xsl:if>
+ </xsl:if>
+</xsl:template>
+
+</xsl:stylesheet>
+
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/axf.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/axf.xsl
new file mode 100644
index 0000000..e63c3a6
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/axf.xsl
@@ -0,0 +1,110 @@
+<?xml version='1.0'?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:fo="http://www.w3.org/1999/XSL/Format"
+ xmlns:axf="http://www.antennahouse.com/names/XSL/Extensions"
+ version='1.0'>
+
+<!-- ********************************************************************
+ $Id: axf.xsl 6483 2007-01-08 18:00:22Z bobstayton $
+ ******************************************************************** -->
+
+<xsl:template name="axf-document-information">
+
+ <xsl:variable name="authors" select="(//author|//editor|
+ //corpauthor|//authorgroup)[1]"/>
+ <xsl:if test="$authors">
+ <xsl:variable name="author">
+ <xsl:choose>
+ <xsl:when test="$authors[self::authorgroup]">
+ <xsl:call-template name="person.name.list">
+ <xsl:with-param name="person.list"
+ select="$authors/*[self::author|self::corpauthor|
+ self::othercredit|self::editor]"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="$authors[self::corpauthor]">
+ <xsl:value-of select="$authors"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="person.name">
+ <xsl:with-param name="node" select="$authors"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:element name="axf:document-info">
+ <xsl:attribute name="name">author</xsl:attribute>
+ <xsl:attribute name="value">
+ <xsl:value-of select="normalize-space($author)"/>
+ </xsl:attribute>
+ </xsl:element>
+ </xsl:if>
+
+ <xsl:variable name="title">
+ <xsl:apply-templates select="/*[1]" mode="label.markup"/>
+ <xsl:apply-templates select="/*[1]" mode="title.markup"/>
+ </xsl:variable>
+
+ <!-- * see bug report #1465301 - mzjn -->
+ <axf:document-info name="title">
+ <xsl:attribute name="value">
+ <xsl:value-of select="normalize-space($title)"/>
+ </xsl:attribute>
+ </axf:document-info>
+
+ <xsl:if test="//keyword">
+ <xsl:element name="axf:document-info">
+ <xsl:attribute name="name">keywords</xsl:attribute>
+ <xsl:attribute name="value">
+ <xsl:for-each select="//keyword">
+ <xsl:value-of select="normalize-space(.)"/>
+ <xsl:if test="position() != last()">
+ <xsl:text>, </xsl:text>
+ </xsl:if>
+ </xsl:for-each>
+ </xsl:attribute>
+ </xsl:element>
+ </xsl:if>
+
+ <xsl:if test="//subjectterm">
+ <xsl:element name="axf:document-info">
+ <xsl:attribute name="name">subject</xsl:attribute>
+ <xsl:attribute name="value">
+ <xsl:for-each select="//subjectterm">
+ <xsl:value-of select="normalize-space(.)"/>
+ <xsl:if test="position() != last()">
+ <xsl:text>, </xsl:text>
+ </xsl:if>
+ </xsl:for-each>
+ </xsl:attribute>
+ </xsl:element>
+ </xsl:if>
+
+</xsl:template>
+
+<!-- These properties are added to fo:simple-page-master -->
+<xsl:template name="axf-page-master-properties">
+ <xsl:param name="page.master" select="''"/>
+
+ <xsl:if test="$crop.marks != 0">
+ <xsl:attribute name="axf:printer-marks">crop</xsl:attribute>
+ <xsl:attribute name="axf:bleed"><xsl:value-of
+ select="$crop.mark.bleed"/></xsl:attribute>
+ <xsl:attribute name="axf:printer-marks-line-width"><xsl:value-of
+ select="$crop.mark.width"/></xsl:attribute>
+ <xsl:attribute name="axf:crop-offset"><xsl:value-of
+ select="$crop.mark.offset"/></xsl:attribute>
+ </xsl:if>
+
+ <xsl:call-template name="user-axf-page-master-properties">
+ <xsl:with-param name="page.master" select="$page.master"/>
+ </xsl:call-template>
+
+</xsl:template>
+
+<xsl:template name="user-axf-page-master-properties">
+ <xsl:param name="page.master" select="''"/>
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/biblio-iso690.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/biblio-iso690.xsl
new file mode 100644
index 0000000..1bc3858
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/biblio-iso690.xsl
@@ -0,0 +1,1300 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:fo="http://www.w3.org/1999/XSL/Format"
+ version='1.0'>
+
+<!-- ********************************************************************
+ $Id: biblio.xsl 6402 2006-11-12 08:23:21Z bobstayton $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ The original code for processing bibliography in ISO690 style
+ was provided by Jana Dvorakova <jana4u@seznam.cz>
+
+ ******************************************************************** -->
+
+<!-- ==================================================================== -->
+
+<!-- if biblioentry.alt.primary.seps is set to nonzero value then use alternative separators for primary responsibility - $alt.person.two.sep, $alt.person.last.sep, $alt.person.more.sep -->
+<xsl:param name="biblioentry.alt.primary.seps" select="0"/>
+
+<!-- how many authors will be printed if there is more than three authors - set to number 1 (default value), 2 or 3 -->
+<xsl:param name="biblioentry.primary.count" select="1"/>
+
+<!-- ==================================================================== -->
+
+<xsl:template name="iso690.makecitation">
+<!-- Types of resources -->
+ <xsl:choose>
+
+ <!-- SYSTEMS OF ELECTRONIC COMMUNICATION : ENTIRE MESSAGE SYSTEM -->
+ <!-- same as Monographs -->
+ <xsl:when test="./@role='messagesystem'">
+ <xsl:call-template name="iso690.monogr"/>
+ </xsl:when>
+
+ <!-- SYSTEMS OF ELECTRONIC COMMUNICATION : ELECTRONIC MESSAGES -->
+ <!-- same as Contributions to Monographs -->
+ <xsl:when test="./@role='message'">
+ <xsl:call-template name="iso690.paper.mon"/>
+ </xsl:when>
+
+ <!-- SERIALS -->
+ <xsl:when test="./@role='serial' or ./biblioid/@class='issn' or ./issn">
+ <xsl:call-template name="iso690.serial"/>
+ </xsl:when>
+
+ <!-- PARTS OF MONOGRAPHS -->
+ <xsl:when test="./@role='part' or (./bibliomisc[@role='secnum']|./bibliomisc[@role='sectitle'])">
+ <xsl:call-template name="iso690.monogr.part"/>
+ </xsl:when>
+
+ <!-- CONTRIBUTIONS TO MONOGRAPHS -->
+ <xsl:when test="./@role='contribution' or (./biblioset/@relation='part' and ./biblioset/@relation='book')">
+ <xsl:call-template name="iso690.paper.mon"/>
+ </xsl:when>
+
+ <!-- ARTICLES, ETC., IN SERIALS -->
+ <xsl:when test="./@role='article' or (./biblioset/@relation='journal' and ./biblioset/@relation='article')">
+ <xsl:call-template name="iso690.article"/>
+ </xsl:when>
+
+ <!-- PATENT DOCUMENTS -->
+ <xsl:when test="./@role='patent' or (./bibliomisc[@role='patenttype'] and ./bibliomisc[@role='patentnum'])">
+ <xsl:call-template name="iso690.patent"/>
+ </xsl:when>
+
+ <!-- MONOGRAPHS -->
+ <xsl:otherwise>
+ <xsl:call-template name="iso690.monogr"/>
+ </xsl:otherwise>
+
+ </xsl:choose>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<!-- MONOGRAPHS -->
+<xsl:template name="iso690.monogr">
+ <!-- Primary responsibility -->
+ <xsl:call-template name="iso690.primary"/>
+ <!-- Title and Type of medium -->
+ <xsl:call-template name="iso690.title"/>
+ <!-- Subordinate responsibility -->
+ <xsl:call-template name="iso690.secondary"/>
+ <!-- Edition -->
+ <xsl:call-template name="iso690.edition"/>
+ <!-- Place of publication, Publisher, Year/Date of publication, Date of update/revision, Date of citation -->
+ <xsl:call-template name="iso690.pub"/>
+ <!-- Extent -->
+ <xsl:call-template name="iso690.extent"/>
+ <!-- Series -->
+ <xsl:call-template name="iso690.serie"/>
+ <!-- Notes -->
+ <xsl:call-template name="iso690.notice"/>
+ <!-- Avaibility and access -->
+ <xsl:call-template name="iso690.access"/>
+ <!-- Standard number -->
+ <xsl:call-template name="iso690.isbn"/>
+</xsl:template>
+
+<!-- SERIALS -->
+<xsl:template name="iso690.serial">
+ <!-- Title and Type of medium -->
+ <xsl:call-template name="iso690.title"/>
+ <!-- Responsibility [nonEL] -->
+ <xsl:if test="not(./bibliomisc[@role='medium'])">
+ <xsl:call-template name="iso690.secondary"/>
+ </xsl:if>
+ <!-- Edition -->
+ <xsl:call-template name="iso690.edition">
+ <xsl:with-param name="after" select="./bibliomisc[@role='issuing']"/>
+ </xsl:call-template>
+ <!-- Issue designation (date and/or n°) [nonEL] -->
+ <xsl:if test="not(./bibliomisc[@role='medium'])">
+ <xsl:call-template name="iso690.issuing"/>
+ </xsl:if>
+ <!-- Place of publication, Publisher, Year/Date of publication, Date of update/revision, Date of citation -->
+ <xsl:call-template name="iso690.pub"/>
+ <!-- Series -->
+ <xsl:call-template name="iso690.serie"/>
+ <!-- Notes -->
+ <xsl:call-template name="iso690.notice"/>
+ <!-- Avaibility and access -->
+ <xsl:call-template name="iso690.access"/>
+ <!-- Standard number -->
+ <xsl:call-template name="iso690.issn"/>
+</xsl:template>
+
+<!-- PARTS OF MONOGRAPHS -->
+<xsl:template name="iso690.monogr.part">
+ <!-- Primary responsibility of host document -->
+ <xsl:call-template name="iso690.primary"/>
+ <!-- Title and Type of medium of host document -->
+ <xsl:call-template name="iso690.title"/>
+ <!-- Subordinate responsibility of host document [EL] -->
+ <xsl:if test="./bibliomisc[@role='medium']">
+ <xsl:call-template name="iso690.secondary"/>
+ </xsl:if>
+ <!-- Edition -->
+ <xsl:call-template name="iso690.edition">
+ <xsl:with-param name="after" select="./volumenum"/>
+ </xsl:call-template>
+ <!-- Numeration of the part [nonEL]-->
+ <xsl:if test="not(./bibliomisc[@role='medium'])">
+ <xsl:call-template name="iso690.partnr"/>
+ <!-- Subordinate responsibility [nonEL] -->
+ <xsl:call-template name="iso690.secondary"/>
+ </xsl:if>
+ <!-- Place of publication, Publisher, Year/Date of publication, Date of update/revision, Date of citation -->
+ <xsl:call-template name="iso690.pub"/>
+ <!-- Location within host -->
+ <xsl:call-template name="iso690.part.location"/>
+ <xsl:if test="./bibliomisc[@role='medium']">
+ <!-- Numeration within host document [EL] -->
+ <!-- Notes [EL] -->
+ <xsl:call-template name="iso690.notice"/>
+ <!-- Avaibility and access [EL] -->
+ <xsl:call-template name="iso690.access"/>
+ <!-- Standard number [EL] -->
+ <xsl:call-template name="iso690.isbn"/>
+ </xsl:if>
+</xsl:template>
+
+<!-- CONTRIBUTIONS TO MONOGRAPHS -->
+<xsl:template name="iso690.paper.mon">
+<!-- Contribution -->
+ <xsl:apply-templates mode="iso690.paper.part" select="./biblioset[@relation='part']"/>
+<!-- In -->
+ <xsl:text>In </xsl:text>
+<!-- Host -->
+ <xsl:apply-templates mode="iso690.paper.book" select="./biblioset[@relation='book']"/>
+</xsl:template>
+
+<xsl:template match="biblioset" mode="iso690.paper.part">
+<!-- Contribution -->
+ <!-- Primary responsibility -->
+ <xsl:call-template name="iso690.primary"/>
+ <!-- Title -->
+ <xsl:call-template name="iso690.title">
+ <xsl:with-param name="italic" select="0"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="biblioset" mode="iso690.paper.book">
+<!-- Host -->
+ <!-- Primary responsibility -->
+ <xsl:call-template name="iso690.primary"/>
+ <!-- Title and Type of medium -->
+ <xsl:call-template name="iso690.title"/>
+ <!-- Subordinate responsibility [EL] -->
+ <xsl:if test="./bibliomisc[@role='medium']">
+ <xsl:call-template name="iso690.secondary"/>
+ </xsl:if>
+ <!-- Edition -->
+ <xsl:call-template name="iso690.edition"/>
+ <!-- Place of publication, Publisher, Year/Date of publication, Date of update/revision, Date of citation -->
+ <xsl:call-template name="iso690.paper.pub"/>
+ <!-- Numeration within host document [EL] -->
+ <!-- Location within host -->
+ <xsl:call-template name="iso690.location"/>
+ <xsl:if test="./bibliomisc[@role='medium']">
+ <!-- Notes [EL] -->
+ <xsl:call-template name="iso690.notice"/>
+ <!-- Avaibility and access [EL] -->
+ <xsl:call-template name="iso690.access"/>
+ <!-- Standard number [EL] -->
+ <xsl:call-template name="iso690.isbn"/>
+ </xsl:if>
+</xsl:template>
+
+<!-- ARTICLES, ETC., IN SERIALS -->
+<xsl:template name="iso690.article">
+<!-- Article -->
+ <xsl:apply-templates mode="iso690.article.art" select="./biblioset[@relation='article']"/>
+<!-- Serial -->
+ <xsl:apply-templates mode="iso690.article.jour" select="./biblioset[@relation='journal']"/>
+</xsl:template>
+
+<xsl:template match="biblioset" mode="iso690.article.art">
+<!-- Article -->
+ <!-- Primary responsibility -->
+ <xsl:call-template name="iso690.primary"/>
+ <!-- Title -->
+ <xsl:call-template name="iso690.title">
+ <xsl:with-param name="italic" select="0"/>
+ </xsl:call-template>
+ <!-- Subordinate responsibility [nonEL] -->
+ <xsl:if test="not(../*/bibliomisc[@role='medium'])">
+ <xsl:call-template name="iso690.secondary"/>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="biblioset" mode="iso690.article.jour">
+<!-- Serial -->
+ <!-- Title and Type of medium -->
+ <xsl:call-template name="iso690.title"/>
+ <!-- Edition -->
+ <xsl:call-template name="iso690.edition">
+ <xsl:with-param name="after" select="./pubdate[not(@role='issuing')]|./volumenum|./issuenum|./pagenums"/>
+ </xsl:call-template>
+ <!-- Number designation [EL] -->
+ <!-- Location within host -->
+ <xsl:call-template name="iso690.article.location"/>
+ <xsl:if test="./bibliomisc[@role='medium']">
+ <!-- Notes [EL] -->
+ <xsl:call-template name="iso690.notice"/>
+ <!-- Avaibility and access [EL] -->
+ <xsl:call-template name="iso690.access"/>
+ <!-- Standard number [EL] -->
+ <xsl:call-template name="iso690.issn"/>
+ </xsl:if>
+</xsl:template>
+
+<!-- PATENT DOCUMENTS -->
+<xsl:template name="iso690.patent">
+ <!-- Primary responsibility (applicant) -->
+ <xsl:call-template name="iso690.primary"/>
+ <!-- Title of the invention -->
+ <xsl:call-template name="iso690.title"/>
+ <!-- Subordinate responsibility -->
+ <xsl:call-template name="iso690.secondary"/>
+ <!-- Notes -->
+ <xsl:call-template name="iso690.notice"/>
+ <!-- Identification -->
+ <xsl:call-template name="iso690.pat.ident"/>
+</xsl:template>
+
+<!-- ==================================================================== -->
+<!-- Elements -->
+
+<!-- Primary responsibility -->
+<xsl:template name="iso690.primary">
+ <xsl:param name="primary.sep">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'primary.sep'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:choose>
+ <xsl:when test="./authorgroup/author|./author">
+ <xsl:call-template name="iso690.author.list">
+ <xsl:with-param name="person.list" select=".//authorgroup/author|.//author"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="./authorgroup/editor|./editor">
+ <xsl:call-template name="iso690.author.list">
+ <xsl:with-param name="person.list" select=".//authorgroup/editor|.//editor"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="./authorgroup/corpauthor|./corpauthor">
+ <xsl:call-template name="iso690.author.list">
+ <xsl:with-param name="person.list" select=".//authorgroup/corpauthor|.//corpauthor"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:if test="(./firstname)and(./surname)">
+ <xsl:call-template name="iso690.author"/>
+ <xsl:call-template name="iso690.endsep">
+ <xsl:with-param name="text" select="string(./firstname[1])"/>
+ <xsl:with-param name="sep" select="$primary.sep"/>
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="iso690.author.list">
+ <xsl:param name="person.list"
+ select="author|corpauthor|editor"/>
+ <xsl:param name="person.count" select="count($person.list)"/>
+ <xsl:param name="count" select="1"/>
+ <xsl:param name="group" select="./authorgroup[@role='many']"/>
+ <xsl:param name="many" select="0"/>
+
+ <xsl:param name="primary.many">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'primary.many'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:param name="primary.editor">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'primary.editor'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:param name="primary.sep">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'primary.sep'"/></xsl:call-template>
+ </xsl:param>
+
+ <xsl:choose>
+ <xsl:when test="$count &gt; $person.count"></xsl:when>
+ <xsl:otherwise>
+ <xsl:choose>
+ <xsl:when test="$person.count &lt; 4 and not($group)">
+ <xsl:call-template name="iso690.author">
+ <xsl:with-param name="node" select="$person.list[position()=$count]"/>
+ </xsl:call-template>
+ <xsl:choose>
+ <xsl:when test="$person.count = 2 and $count = 1 and $biblioentry.alt.primary.seps != 0">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'alt.person.two.sep'"/></xsl:call-template>
+ </xsl:when>
+ <xsl:when test="$person.count = 2 and $count = 1">
+ <xsl:call-template name="gentext.template">
+ <xsl:with-param name="context" select="'authorgroup'"/>
+ <xsl:with-param name="name" select="'sep2'"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="$person.count &gt; 2 and $count+1 = $person.count and $biblioentry.alt.primary.seps != 0">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'alt.person.last.sep'"/></xsl:call-template>
+ </xsl:when>
+ <xsl:when test="$person.count &gt; 2 and $count+1 = $person.count">
+ <xsl:call-template name="gentext.template">
+ <xsl:with-param name="context" select="'authorgroup'"/>
+ <xsl:with-param name="name" select="'seplast'"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="$count &lt; $person.count and $biblioentry.alt.primary.seps != 0">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'alt.person.more.sep'"/></xsl:call-template>
+ </xsl:when>
+ <xsl:when test="$count &lt; $person.count">
+ <xsl:call-template name="gentext.template">
+ <xsl:with-param name="context" select="'authorgroup'"/>
+ <xsl:with-param name="name" select="'sep'"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="($count = $person.count)">
+ <xsl:choose>
+ <xsl:when test="$many!=0">
+ <xsl:if test="name($person.list[position()=$count])='editor'">
+ <xsl:value-of select="$primary.editor"/>
+ </xsl:if>
+ <xsl:value-of select="$primary.many"/>
+ <xsl:call-template name="iso690.endsep">
+ <xsl:with-param name="text" select="$primary.many"/>
+ <xsl:with-param name="sep" select="$primary.sep"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="name($person.list[position()=$count])='editor'">
+ <xsl:value-of select="$primary.editor"/>
+ <xsl:value-of select="$primary.sep"/>
+ </xsl:when>
+ <xsl:when test="name($person.list[position()=$count])='corpauthor'">
+ <xsl:call-template name="iso690.endsep">
+ <xsl:with-param name="text" select="string($person.list[position()=$count])"/>
+ <xsl:with-param name="sep" select="$primary.sep"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="iso690.endsep">
+ <xsl:with-param name="text" select="string($person.list[position()=$count]//firstname[1])"/>
+ <xsl:with-param name="sep" select="$primary.sep"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ </xsl:choose>
+
+ <xsl:call-template name="iso690.author.list">
+ <xsl:with-param name="person.list" select="$person.list"/>
+ <xsl:with-param name="person.count" select="$person.count"/>
+ <xsl:with-param name="count" select="$count+1"/>
+ <xsl:with-param name="many" select="$many"/>
+ <xsl:with-param name="group"/>
+ </xsl:call-template>
+ </xsl:when>
+
+ <xsl:otherwise>
+ <xsl:choose>
+ <xsl:when test="($biblioentry.primary.count&gt;=3) and ($person.count&gt;=3)">
+ <xsl:call-template name="iso690.author.list">
+ <xsl:with-param name="person.list" select="$person.list[1]|$person.list[2]|$person.list[3]"/>
+ <xsl:with-param name="person.count" select="3"/>
+ <xsl:with-param name="count" select="1"/>
+ <xsl:with-param name="many" select="1"/>
+ <xsl:with-param name="group"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="($biblioentry.primary.count&gt;1) and ($person.count&gt;1)">
+ <xsl:call-template name="iso690.author.list">
+ <xsl:with-param name="person.list" select="$person.list[1]|$person.list[2]"/>
+ <xsl:with-param name="person.count" select="2"/>
+ <xsl:with-param name="count" select="1"/>
+ <xsl:with-param name="many" select="1"/>
+ <xsl:with-param name="group"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="iso690.author.list">
+ <xsl:with-param name="person.list" select="$person.list[1]"/>
+ <xsl:with-param name="person.count" select="1"/>
+ <xsl:with-param name="count" select="1"/>
+ <xsl:with-param name="many" select="1"/>
+ <xsl:with-param name="group"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="iso690.author">
+ <xsl:param name="node" select="."/>
+ <xsl:param name="lastfirst.sep">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'lastfirst.sep'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:choose>
+ <xsl:when test="name($node)!='corpauthor'">
+ <fo:inline text-transform="uppercase">
+ <xsl:apply-templates mode="iso690.mode" select="$node//surname[1]"/>
+ </fo:inline>
+ <xsl:if test="$node//surname and $node//firstname">
+ <xsl:value-of select="$lastfirst.sep"/>
+ </xsl:if>
+ <xsl:apply-templates mode="iso690.mode" select="$node//firstname[1]"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <fo:inline text-transform="uppercase">
+ <xsl:apply-templates mode="iso690.mode" select="$node"/>
+ </fo:inline>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="corpauthor|firstname|surname" mode="iso690.mode">
+ <xsl:apply-templates mode="iso690.mode"/>
+</xsl:template>
+
+<!-- Title and Type of medium -->
+<xsl:template name="iso690.title">
+ <xsl:param name="medium" select="./bibliomisc[@role='medium']"/>
+ <xsl:param name="italic" select="1"/>
+ <xsl:param name="sep">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'title.sep'"/></xsl:call-template>
+ </xsl:param>
+
+ <xsl:apply-templates mode="iso690.mode" select="./title">
+ <xsl:with-param name="medium" select="$medium"/>
+ <xsl:with-param name="italic" select="$italic"/>
+ <xsl:with-param name="sep" select="$sep"/>
+ </xsl:apply-templates>
+</xsl:template>
+
+<xsl:template match="title" mode="iso690.mode">
+ <xsl:param name="medium"/>
+ <xsl:param name="italic" select="1"/>
+ <xsl:param name="sep">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'title.sep'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:param name="medium1">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'medium1'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:param name="medium2">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'medium2'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:choose>
+ <xsl:when test="$italic=1">
+ <xsl:call-template name="iso690.italic.title"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="iso690.make.title"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:if test="$medium">
+ <xsl:value-of select="$medium1"/>
+ <xsl:apply-templates mode="iso690.mode" select="$medium"/>
+ <xsl:value-of select="$medium2"/>
+ </xsl:if>
+ <xsl:call-template name="iso690.endsep">
+ <xsl:with-param name="text" select="concat(string(.),string(../subtitle))"/>
+ <xsl:with-param name="sep" select="$sep"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template name="iso690.italic.title">
+ <fo:inline font-style="italic">
+ <xsl:call-template name="iso690.make.title"/>
+ </fo:inline>
+</xsl:template>
+
+<xsl:template name="iso690.make.title">
+ <xsl:param name="submaintitle.sep">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'submaintitle.sep'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:apply-templates mode="iso690.mode"/>
+ <xsl:if test="../subtitle">
+ <xsl:value-of select="$submaintitle.sep"/>
+ <xsl:apply-templates mode="iso690.mode" select="../subtitle"/>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="subtitle" mode="iso690.mode">
+ <xsl:apply-templates mode="iso690.mode"/>
+</xsl:template>
+
+<xsl:template match="bibliomisc[@role='medium']" mode="iso690.mode">
+ <xsl:apply-templates mode="iso690.mode"/>
+</xsl:template>
+
+<!-- Subordinate responsibility -->
+<xsl:template name="iso690.secondary">
+ <xsl:param name="secondary.sep">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'secondary.sep'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:param name="secondary.person.sep">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'secondary.person.sep'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:for-each select="./bibliomisc[@role='secondary']">
+ <xsl:apply-templates mode="iso690.mode" select="."/>
+ <xsl:choose>
+ <xsl:when test="position()=count(../bibliomisc[@role='secondary'])">
+ <xsl:call-template name="iso690.endsep">
+ <xsl:with-param name="text" select="string(.)"/>
+ <xsl:with-param name="sep" select="$secondary.sep"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$secondary.person.sep"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:for-each>
+</xsl:template>
+
+<xsl:template match="bibliomisc[@role='secondary']" mode="iso690.mode">
+ <xsl:apply-templates mode="iso690.mode"/>
+</xsl:template>
+
+<!-- Edition -->
+<xsl:template name="iso690.edition">
+ <xsl:param name="after"/>
+ <xsl:param name="edition.serial.sep">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'edition.serial.sep'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:choose>
+ <xsl:when test="string($after)!=''">
+ <xsl:apply-templates mode="iso690.mode" select="./edition">
+ <xsl:with-param name="sep" select="$edition.serial.sep"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates mode="iso690.mode" select="./edition"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="edition" mode="iso690.mode">
+ <xsl:param name="sep">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'edition.sep'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:apply-templates mode="iso690.mode"/>
+ <xsl:call-template name="iso690.endsep">
+ <xsl:with-param name="text" select="string(.)"/>
+ <xsl:with-param name="sep" select="$sep"/>
+ </xsl:call-template>
+</xsl:template>
+
+<!-- Issue designation (date and/or n°) -->
+<xsl:template name="iso690.issuing">
+ <xsl:param name="issuing.div">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'issuing.div'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:param name="issuing.range">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'issuing.range'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:param name="issuing.sep">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'issuing.sep'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:choose>
+ <xsl:when test="./pubdate[@role='issuing'] and ./volumenum[2] and ./issuenum[2]">
+ <xsl:call-template name="iso690.issuedate"/>
+ <xsl:apply-templates mode="iso690.mode" select="./volumenum[1]">
+ <xsl:with-param name="sep" select="$issuing.div"/>
+ </xsl:apply-templates>
+ <xsl:apply-templates mode="iso690.mode" select="./issuenum[1]">
+ <xsl:with-param name="sep" select="$issuing.range"/>
+ </xsl:apply-templates>
+ <xsl:apply-templates mode="iso690.mode" select="./volumenum[2]">
+ <xsl:with-param name="sep" select="$issuing.div"/>
+ </xsl:apply-templates>
+ <xsl:apply-templates mode="iso690.mode" select="./issuenum[2]">
+ <xsl:with-param name="sep" select="$issuing.sep"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:when test="./pubdate[@role='issuing'] and ./volumenum[2]">
+ <xsl:call-template name="iso690.issuedate"/>
+ <xsl:apply-templates mode="iso690.mode" select="./volumenum[1]">
+ <xsl:with-param name="sep" select="$issuing.range"/>
+ </xsl:apply-templates>
+ <xsl:apply-templates mode="iso690.mode" select="./volumenum[2]">
+ <xsl:with-param name="sep" select="$issuing.sep"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:when test="./pubdate[@role='issuing'] and ./volumenum and ./issuenum">
+ <xsl:apply-templates mode="iso690.mode" select="./pubdate[@role='issuing']">
+ <xsl:with-param name="sep" select="$issuing.div"/>
+ </xsl:apply-templates>
+ <xsl:apply-templates mode="iso690.mode" select="./volumenum">
+ <xsl:with-param name="sep" select="$issuing.div"/>
+ </xsl:apply-templates>
+ <xsl:apply-templates mode="iso690.mode" select="./issuenum">
+ <xsl:with-param name="sep" select="$issuing.sep"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:when test="./pubdate[@role='issuing']">
+ <xsl:apply-templates mode="iso690.mode" select="./pubdate[@role='issuing']">
+ <xsl:with-param name="sep" select="$issuing.sep"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:when test="./volumenum">
+ <xsl:apply-templates mode="iso690.mode" select="./volumenum">
+ <xsl:with-param name="sep" select="$issuing.sep"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:when test="./issuenum">
+ <xsl:apply-templates mode="iso690.mode" select="./issuenum">
+ <xsl:with-param name="sep" select="$issuing.sep"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="iso690.issuedate">
+ <xsl:param name="issuing.div">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'issuing.div'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:param name="issuing.range">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'issuing.range'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:param name="issuing.sep">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'issuing.sep'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:choose>
+ <xsl:when test="./pubdate[@role='issuing'][2]">
+ <xsl:apply-templates mode="iso690.mode" select="./pubdate[@role='issuing'][1]">
+ <xsl:with-param name="sep" select="$issuing.range"/>
+ </xsl:apply-templates>
+ <xsl:apply-templates mode="iso690.mode" select="./pubdate[@role='issuing'][2]">
+ <xsl:with-param name="sep" select="$issuing.div"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates mode="iso690.mode" select="./pubdate[@role='issuing']">
+ <xsl:with-param name="sep" select="$issuing.div"/>
+ </xsl:apply-templates>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="pubdate[@role='issuing']" mode="iso690.mode">
+ <xsl:param name="sep"/>
+ <xsl:variable name="substr" select="substring(string(.),string-length(string(.)))"/>
+ <xsl:apply-templates mode="iso690.mode"/>
+ <xsl:call-template name="iso690.space">
+ <xsl:with-param name="text" select="$substr"/>
+ </xsl:call-template>
+ <xsl:choose>
+ <xsl:when test="$substr='-'">
+ <xsl:call-template name="iso690.endsep">
+ <xsl:with-param name="text" select="' '"/>
+ <xsl:with-param name="sep" select="$sep"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="iso690.endsep">
+ <xsl:with-param name="text" select="string(.)"/>
+ <xsl:with-param name="sep" select="$sep"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- Numeration of the part -->
+<xsl:template name="iso690.partnr">
+ <xsl:param name="partnr.sep">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'partnr.sep'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:apply-templates mode="iso690.mode" select="./volumenum">
+ <xsl:with-param name="sep" select="$partnr.sep"/>
+ </xsl:apply-templates>
+</xsl:template>
+
+<!-- Place of publication, Publisher, Year/Date of publication, Date of update/revision, Date of citation -->
+<xsl:template name="iso690.pub">
+ <xsl:param name="onlydate" select="0"/>
+ <xsl:param name="placesep">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'placepubl.sep'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:param name="pubsep">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'publyear.sep'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:param name="endsep">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'pubinfo.sep'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:choose>
+ <xsl:when test="(./publisher/publishername|./publishername|./publisher/address/city)and($onlydate=0)and(./pubdate[not(@role='issuing')]|./copyright/year|./date[@role='upd']|./date[@role='upd'])">
+ <xsl:apply-templates mode="iso690.mode" select="./publisher/address/city">
+ <xsl:with-param name="sep" select="$placesep"/>
+ </xsl:apply-templates>
+ <xsl:apply-templates mode="iso690.mode" select="./publisher/publishername|./publishername">
+ <xsl:with-param name="sep" select="$pubsep"/>
+ </xsl:apply-templates>
+ <xsl:apply-templates mode="iso690.mode" select="./pubdate[not(@role='issuing')]|./copyright/year">
+ <xsl:with-param name="sep" select="$endsep"/>
+ </xsl:apply-templates>
+ <xsl:if test="not(./pubdate[not(@role='issuing')]|./copyright/year)">
+ <xsl:call-template name="iso690.data">
+ <xsl:with-param name="sep" select="$endsep"/>
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:when>
+ <xsl:when test="(./publisher/publishername|./publishername)and(./publisher/address/city)and($onlydate=0)">
+ <xsl:apply-templates mode="iso690.mode" select="./publisher/address/city">
+ <xsl:with-param name="sep" select="$placesep"/>
+ </xsl:apply-templates>
+ <xsl:apply-templates mode="iso690.mode" select="./publisher/publishername|./publishername">
+ <xsl:with-param name="sep" select="$endsep"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:when test="($onlydate=1)or(./pubdate[not(@role='issuing')]|./copyright/year)">
+ <xsl:apply-templates mode="iso690.mode" select="./pubdate[not(@role='issuing')]|./copyright/year">
+ <xsl:with-param name="sep" select="$endsep"/>
+ </xsl:apply-templates>
+ <xsl:if test="$onlydate=1">
+ <xsl:call-template name="iso690.location">
+ <xsl:with-param name="onlypages" select="1"/>
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:when>
+ <xsl:when test="not(./pubdate[not(@role='issuing')]|./copyright/year)">
+ <xsl:call-template name="iso690.data">
+ <xsl:with-param name="sep" select="$endsep"/>
+ </xsl:call-template>
+ </xsl:when>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="iso690.paper.pub">
+ <xsl:param name="spec.pubinfo.sep">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'spec.pubinfo.sep'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:choose>
+ <xsl:when test="./volumnum|./issuenum|./pagenums">
+ <xsl:call-template name="iso690.pub">
+ <xsl:with-param name="endsep" select="$spec.pubinfo.sep"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="iso690.pub"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="iso690.data">
+ <xsl:param name="sep"/>
+ <xsl:param name="datecit2">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'datecit2'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:apply-templates mode="iso690.mode" select="./date[@role='upd']">
+ <xsl:with-param name="sep"/>
+ </xsl:apply-templates>
+ <xsl:apply-templates mode="iso690.mode" select="./date[@role='cit']"/>
+ <xsl:choose>
+ <xsl:when test="./date[@role='cit']">
+ <xsl:call-template name="iso690.endsep">
+ <xsl:with-param name="text" select="$datecit2"/>
+ <xsl:with-param name="sep" select="$sep"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="./date[@role='upd']">
+ <xsl:call-template name="iso690.endsep">
+ <xsl:with-param name="text" select="string(./date[@role='upd'])"/>
+ <xsl:with-param name="sep" select="$sep"/>
+ </xsl:call-template>
+ </xsl:when>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="publisher/address/city|publishername" mode="iso690.mode">
+ <xsl:param name="sep"/>
+ <xsl:param name="upd" select="0"/>
+ <xsl:apply-templates mode="iso690.mode"/>
+ <xsl:call-template name="iso690.endsep">
+ <xsl:with-param name="text" select="string(.)"/>
+ <xsl:with-param name="sep" select="$sep"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="pubdate|copyright/year" mode="iso690.mode">
+ <xsl:param name="sep"/>
+ <xsl:param name="upd" select="1"/>
+ <xsl:param name="datecit2">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'datecit2'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:variable name="substr" select="substring(string(.),string-length(string(.)))"/>
+ <xsl:if test="name(.)!='pubdate'">
+ <xsl:value-of select="'&#x00A9;'"/><!-- copyright -->
+ </xsl:if>
+ <xsl:apply-templates mode="iso690.mode"/>
+ <xsl:call-template name="iso690.space">
+ <xsl:with-param name="text" select="$substr"/>
+ </xsl:call-template>
+ <xsl:if test="$upd!=0">
+ <xsl:choose>
+ <xsl:when test="name(.)='pubdate'">
+ <xsl:apply-templates mode="iso690.mode" select="../date[@role='upd']"/>
+ <xsl:apply-templates mode="iso690.mode" select="../date[@role='cit']"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates mode="iso690.mode" select="../../date[@role='upd']"/>
+ <xsl:apply-templates mode="iso690.mode" select="../../date[@role='cit']"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:if>
+ <xsl:choose>
+ <xsl:when test="../date[@role='cit']|../../date[@role='cit'] and $upd!=0">
+ <xsl:call-template name="iso690.endsep">
+ <xsl:with-param name="text" select="$datecit2"/>
+ <xsl:with-param name="sep" select="$sep"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="../date[@role='upd']|../../date[@role='upd'] and $upd!=0">
+ <xsl:call-template name="iso690.endsep">
+ <xsl:with-param name="text" select="string(../date[@role='upd'])"/>
+ <xsl:with-param name="sep" select="$sep"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="$substr='-'">
+ <xsl:call-template name="iso690.endsep">
+ <xsl:with-param name="text" select="' '"/>
+ <xsl:with-param name="sep" select="$sep"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="iso690.endsep">
+ <xsl:with-param name="text" select="string(.)"/>
+ <xsl:with-param name="sep" select="$sep"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="iso690.space">
+ <xsl:param name="text" select="substring(string(.),string-length(string(.)))"/>
+ <xsl:if test="$text='-'">
+ <xsl:value-of select="' '"/>
+ </xsl:if>
+</xsl:template>
+
+<!-- Date of update/revision -->
+<xsl:template match="date[@role='upd']" mode="iso690.mode">
+ <xsl:param name="sep">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'upd.sep'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:value-of select="$sep"/>
+ <xsl:apply-templates mode="iso690.mode"/>
+</xsl:template>
+
+<!-- Date of citation -->
+<xsl:template match="date[@role='cit']" mode="iso690.mode">
+ <xsl:param name="datecit1">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'datecit1'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:param name="datecit2">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'datecit2'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:value-of select="$datecit1"/>
+ <xsl:apply-templates mode="iso690.mode"/>
+ <xsl:value-of select="$datecit2"/>
+</xsl:template>
+
+<!-- Extent -->
+<xsl:template name="iso690.extent">
+ <xsl:param name="extent.sep">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'extent.sep'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:apply-templates mode="iso690.mode" select="./pagenums">
+ <xsl:with-param name="sep" select="$extent.sep"/>
+ </xsl:apply-templates>
+</xsl:template>
+
+<!-- Location within host -->
+<xsl:template name="iso690.part.location">
+ <xsl:param name="location.sep">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'location.sep'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:choose>
+ <xsl:when test="./pagenums">
+ <xsl:apply-templates mode="iso690.mode" select="./bibliomisc[@role='secnum']"/>
+ <xsl:apply-templates mode="iso690.mode" select="./bibliomisc[@role='sectitle']"/>
+ <xsl:apply-templates mode="iso690.mode" select="./pagenums"/>
+ </xsl:when>
+ <xsl:when test="./bibliomisc[@role='sectitle']">
+ <xsl:apply-templates mode="iso690.mode" select="./bibliomisc[@role='secnum']"/>
+ <xsl:apply-templates mode="iso690.mode" select="./bibliomisc[@role='sectitle']">
+ <xsl:with-param name="sep" select="$location.sep"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates mode="iso690.mode" select="./bibliomisc[@role='secnum']">
+ <xsl:with-param name="sep" select="$location.sep"/>
+ </xsl:apply-templates>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="iso690.article.location">
+ <xsl:param name="location.sep">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'location.sep'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:param name="locs.sep">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'locs.sep'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:choose>
+ <xsl:when test="not(./date[@role='upd']|./date[@role='cit'])">
+ <xsl:choose>
+ <xsl:when test="./volumenum|./issuenum|./pagenums">
+ <xsl:apply-templates mode="iso690.mode" select="./pubdate[not(@role='issuing')]">
+ <xsl:with-param name="upd" select="0"/>
+ <xsl:with-param name="sep" select="$locs.sep"/>
+ </xsl:apply-templates>
+ <xsl:call-template name="iso690.location"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates mode="iso690.mode" select="./pubdate[not(@role='issuing')]">
+ <xsl:with-param name="sep" select="$location.sep"/>
+ </xsl:apply-templates>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:choose>
+ <xsl:when test="./volumenum|./issuenum|./pagenums">
+ <xsl:apply-templates mode="iso690.mode" select="./pubdate[not(@role='issuing')]">
+ <xsl:with-param name="upd" select="0"/>
+ <xsl:with-param name="sep" select="$locs.sep"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates mode="iso690.mode" select="./pubdate[not(@role='issuing')]">
+ <xsl:with-param name="upd" select="0"/>
+ <xsl:with-param name="sep" select="$location.sep"/>
+ </xsl:apply-templates>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:choose>
+ <xsl:when test="./issuenum">
+ <xsl:apply-templates mode="iso690.mode" select="./volumenum"/>
+ <xsl:apply-templates mode="iso690.mode" select="./issuenum">
+ <xsl:with-param name="sep"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates mode="iso690.mode" select="./volumenum">
+ <xsl:with-param name="sep"/>
+ </xsl:apply-templates>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:choose>
+ <xsl:when test="./pagenums">
+ <xsl:call-template name="iso690.data">
+ <xsl:with-param name="sep" select="$locs.sep"/>
+ </xsl:call-template>
+ <xsl:apply-templates mode="iso690.mode" select="./pagenums"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="iso690.data">
+ <xsl:with-param name="sep" select="$location.sep"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="iso690.location">
+ <xsl:param name="location.sep">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'location.sep'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:choose>
+ <xsl:when test="./volumenum and not(./issuenum) and not(./pagenums)">
+ <xsl:apply-templates mode="iso690.mode" select="./volumenum">
+ <xsl:with-param name="sep" select="$location.sep"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:when test="./issuenum and not(./pagenums)">
+ <xsl:apply-templates mode="iso690.mode" select="./volumenum"/>
+ <xsl:apply-templates mode="iso690.mode" select="./issuenum">
+ <xsl:with-param name="sep" select="$location.sep"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:when test="./pagenums">
+ <xsl:apply-templates mode="iso690.mode" select="./volumenum"/>
+ <xsl:apply-templates mode="iso690.mode" select="./issuenum"/>
+ <xsl:apply-templates mode="iso690.mode" select="./pagenums"/>
+ </xsl:when>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="bibliomisc[@role='secnum']|bibliomisc[@role='sectitle']" mode="iso690.mode">
+ <xsl:param name="sep">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'locs.sep'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:apply-templates mode="iso690.mode"/>
+ <xsl:call-template name="iso690.endsep">
+ <xsl:with-param name="text" select="string(.)"/>
+ <xsl:with-param name="sep" select="$sep"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="volumenum|issuenum" mode="iso690.mode">
+ <xsl:param name="sep">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'locs.sep'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:apply-templates mode="iso690.mode"/>
+ <xsl:call-template name="iso690.endsep">
+ <xsl:with-param name="text" select="string(.)"/>
+ <xsl:with-param name="sep" select="$sep"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="pagenums" mode="iso690.mode">
+ <xsl:param name="sep">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'location.sep'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:apply-templates mode="iso690.mode"/>
+ <xsl:call-template name="iso690.endsep">
+ <xsl:with-param name="text" select="string(.)"/>
+ <xsl:with-param name="sep" select="$sep"/>
+ </xsl:call-template>
+</xsl:template>
+
+<!-- Series -->
+<xsl:template name="iso690.serie">
+ <xsl:apply-templates mode="iso690.mode" select=".//bibliomisc[@role='serie']"/>
+</xsl:template>
+
+<!-- Notes -->
+<xsl:template name="iso690.notice">
+ <xsl:apply-templates mode="iso690.mode" select=".//bibliomisc[not(@role)]"/>
+</xsl:template>
+
+<xsl:template match="bibliomisc[not(@role)]|bibliomisc[@role='serie']" mode="iso690.mode">
+ <xsl:param name="notice.sep">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'notice.sep'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:apply-templates mode="iso690.mode"/>
+ <xsl:call-template name="iso690.endsep">
+ <xsl:with-param name="text" select="string(.)"/>
+ <xsl:with-param name="sep" select="$notice.sep"/>
+ </xsl:call-template>
+</xsl:template>
+
+<!-- Avaibility and access -->
+<xsl:template name="iso690.access">
+ <xsl:for-each select="./biblioid[@class='uri']|./bibliomisc[@role='access']">
+ <xsl:choose>
+ <xsl:when test="position()=1">
+ <xsl:apply-templates mode="iso690.mode" select="."/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates mode="iso690.mode" select=".">
+ <xsl:with-param name="firstacc" select="0"/>
+ </xsl:apply-templates>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:for-each>
+</xsl:template>
+
+<xsl:template match="biblioid[@class='uri']/ulink|bibliomisc[@role='access']/ulink" mode="iso690.mode">
+ <xsl:param name="link1">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'link1'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:param name="link2">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'link2'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:value-of select="$link1"/>
+ <xsl:call-template name="ulink"/>
+ <xsl:value-of select="$link2"/>
+</xsl:template>
+
+<xsl:template match="biblioid[@class='uri']|bibliomisc[@role='access']" mode="iso690.mode">
+ <xsl:param name="firstacc" select="1"/>
+ <xsl:param name="access">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'access'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:param name="acctoo">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'acctoo'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:param name="onwww">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'onwww'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:param name="oninet">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'oninet'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:param name="access.end">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'access.end'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:param name="access.sep">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'access.sep'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:choose>
+ <xsl:when test="$firstacc=1">
+ <xsl:value-of select="$access"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$acctoo"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:choose>
+ <xsl:when test="(./ulink)and(string(./ulink)=string(.))">
+ <xsl:choose>
+ <xsl:when test="(starts-with(./ulink/@url,'http://')or(starts-with(./ulink/@url,'https://')))">
+ <xsl:value-of select="$onwww"/>
+ <xsl:value-of select="$access.end"/>
+ <xsl:apply-templates mode="iso690.mode" select="./ulink"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$oninet"/>
+ <xsl:value-of select="$access.end"/>
+ <xsl:apply-templates mode="iso690.mode" select="./ulink"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:when test="(./ulink)and(string(./ulink)!=string(.))">
+ <xsl:value-of select="text()[1]"/>
+ <xsl:call-template name="iso690.endsep">
+ <xsl:with-param name="text" select="text()[1]"/>
+ <xsl:with-param name="sep" select="$access.end"/>
+ </xsl:call-template>
+ <xsl:apply-templates mode="iso690.mode" select="./ulink"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates mode="iso690.mode"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:value-of select="$access.sep"/>
+</xsl:template>
+
+<!-- Standard number - ISBN -->
+<xsl:template name="iso690.isbn">
+ <xsl:choose>
+ <xsl:when test="./biblioid/@class='isbn'">
+ <xsl:apply-templates mode="iso690.mode" select="./biblioid[@class='isbn']"/>
+ </xsl:when>
+ <xsl:when test="./isbn">
+ <xsl:apply-templates mode="iso690.mode" select="./isbn"/>
+ </xsl:when>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="isbn|biblioid[@class='isbn']" mode="iso690.mode">
+ <xsl:param name="isbn">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'isbn'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:param name="stdnum.sep">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'stdnum.sep'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:value-of select="$isbn"/>
+ <xsl:apply-templates mode="iso690.mode"/>
+ <xsl:value-of select="$stdnum.sep"/>
+</xsl:template>
+
+<!-- Standard number - ISSN -->
+<xsl:template name="iso690.issn">
+ <xsl:choose>
+ <xsl:when test="./biblioid/@class='issn'">
+ <xsl:apply-templates mode="iso690.mode" select="./biblioid[@class='issn']"/>
+ </xsl:when>
+ <xsl:when test="./issn">
+ <xsl:apply-templates mode="iso690.mode" select="./issn"/>
+ </xsl:when>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="issn|biblioid[@class='issn']" mode="iso690.mode">
+ <xsl:param name="issn">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'issn'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:param name="stdnum.sep">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'stdnum.sep'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:value-of select="$issn"/>
+ <xsl:apply-templates mode="iso690.mode"/>
+ <xsl:value-of select="$stdnum.sep"/>
+</xsl:template>
+
+<!-- Identification of patent document -->
+<xsl:template name="iso690.pat.ident">
+ <xsl:param name="patdate.sep">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'patdate.sep'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:apply-templates mode="iso690.mode" select="./address/country"/>
+ <xsl:apply-templates mode="iso690.mode" select="./bibliomisc[@role='patenttype']"/>
+ <xsl:choose>
+ <xsl:when test="./biblioid[@class='other' and @otherclass='patentnum']">
+ <xsl:apply-templates mode="iso690.mode" select="./biblioid[@class='other' and @otherclass='patentnum']"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates mode="iso690.mode" select="./bibliomisc[@role='patentnum']"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:apply-templates mode="iso690.mode" select="./pubdate[not(@role='issuing')]">
+ <xsl:with-param name="sep" select="$patdate.sep"/>
+ </xsl:apply-templates>
+</xsl:template>
+
+<!-- Country or issuing office -->
+<xsl:template match="address/country" mode="iso690.mode">
+ <xsl:param name="patcountry.sep">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'patcountry.sep'"/></xsl:call-template>
+ </xsl:param>
+ <fo:inline font-style="italic">
+ <xsl:apply-templates mode="iso690.mode"/>
+ </fo:inline>
+ <xsl:value-of select="$patcountry.sep"/>
+</xsl:template>
+
+<!-- Kind of patent document -->
+<xsl:template match="bibliomisc[@role='patenttype']" mode="iso690.mode">
+ <xsl:param name="pattype.sep">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'pattype.sep'"/></xsl:call-template>
+ </xsl:param>
+ <fo:inline font-style="italic">
+ <xsl:apply-templates mode="iso690.mode"/>
+ </fo:inline>
+ <xsl:value-of select="$pattype.sep"/>
+</xsl:template>
+
+<!-- Number -->
+<xsl:template match="biblioid[@class='other' and @otherclass='patentnum']|bibliomisc[@role='patentnum']" mode="iso690.mode">
+ <xsl:param name="patnum.sep">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'patnum.sep'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:apply-templates mode="iso690.mode"/>
+ <xsl:value-of select="$patnum.sep"/>
+</xsl:template>
+
+<!-- ==================================================================== -->
+<!-- Supplementary templates -->
+
+<xsl:template name="iso690.endsep">
+ <xsl:param name="text"/>
+ <xsl:param name="sep" select=". "/>
+ <xsl:choose>
+ <xsl:when test="substring($text,string-length($text))!=substring($sep,1,1)">
+ <xsl:value-of select="$sep"/>
+ </xsl:when>
+ <xsl:when test="substring($text,string-length($text))=' '">
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="' '"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="*" mode="iso690.mode">
+ <xsl:apply-templates select="."/><!-- try the default mode -->
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/biblio.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/biblio.xsl
new file mode 100644
index 0000000..4524612
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/biblio.xsl
@@ -0,0 +1,1169 @@
+<?xml version='1.0'?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:fo="http://www.w3.org/1999/XSL/Format"
+ version='1.0'>
+
+<!-- ********************************************************************
+ $Id: biblio.xsl 7467 2007-09-27 16:10:31Z bobstayton $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<!-- ==================================================================== -->
+
+<xsl:template match="bibliography">
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="not(parent::*) or parent::part or parent::book">
+ <xsl:variable name="master-reference">
+ <xsl:call-template name="select.pagemaster"/>
+ </xsl:variable>
+
+ <fo:page-sequence hyphenate="{$hyphenate}"
+ master-reference="{$master-reference}">
+ <xsl:attribute name="language">
+ <xsl:call-template name="l10n.language"/>
+ </xsl:attribute>
+ <xsl:attribute name="format">
+ <xsl:call-template name="page.number.format">
+ <xsl:with-param name="master-reference" select="$master-reference"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:attribute name="initial-page-number">
+ <xsl:call-template name="initial.page.number">
+ <xsl:with-param name="master-reference" select="$master-reference"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:attribute name="force-page-count">
+ <xsl:call-template name="force.page.count">
+ <xsl:with-param name="master-reference" select="$master-reference"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:attribute name="hyphenation-character">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'hyphenation-character'"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:attribute name="hyphenation-push-character-count">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'hyphenation-push-character-count'"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:attribute name="hyphenation-remain-character-count">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'hyphenation-remain-character-count'"/>
+ </xsl:call-template>
+ </xsl:attribute>
+
+ <xsl:apply-templates select="." mode="running.head.mode">
+ <xsl:with-param name="master-reference" select="$master-reference"/>
+ </xsl:apply-templates>
+ <xsl:apply-templates select="." mode="running.foot.mode">
+ <xsl:with-param name="master-reference" select="$master-reference"/>
+ </xsl:apply-templates>
+
+ <fo:flow flow-name="xsl-region-body">
+ <xsl:call-template name="set.flow.properties">
+ <xsl:with-param name="element" select="local-name(.)"/>
+ <xsl:with-param name="master-reference" select="$master-reference"/>
+ </xsl:call-template>
+
+ <fo:block id="{$id}">
+ <xsl:call-template name="bibliography.titlepage"/>
+ </fo:block>
+ <xsl:apply-templates/>
+ </fo:flow>
+ </fo:page-sequence>
+ </xsl:when>
+ <xsl:otherwise>
+ <fo:block id="{$id}"
+ space-before.minimum="1em"
+ space-before.optimum="1.5em"
+ space-before.maximum="2em">
+ <xsl:call-template name="bibliography.titlepage"/>
+ </fo:block>
+ <xsl:apply-templates/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="bibliography/bibliographyinfo"></xsl:template>
+<xsl:template match="bibliography/info"></xsl:template>
+<xsl:template match="bibliography/title"></xsl:template>
+<xsl:template match="bibliography/subtitle"></xsl:template>
+<xsl:template match="bibliography/titleabbrev"></xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="bibliodiv">
+ <fo:block>
+ <xsl:attribute name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:attribute>
+ <xsl:call-template name="bibliodiv.titlepage"/>
+ <xsl:apply-templates/>
+ </fo:block>
+</xsl:template>
+
+<xsl:template match="bibliodiv/title"/>
+<xsl:template match="bibliodiv/subtitle"/>
+<xsl:template match="bibliodiv/titleabbrev"/>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="bibliolist">
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+
+ <fo:block id="{$id}"
+ space-before.minimum="1em"
+ space-before.optimum="1.5em"
+ space-before.maximum="2em">
+
+ <xsl:if test="blockinfo/title|info/title|title">
+ <xsl:call-template name="formal.object.heading"/>
+ </xsl:if>
+
+ <xsl:apply-templates select="*[not(self::blockinfo)
+ and not(self::info)
+ and not(self::title)
+ and not(self::titleabbrev)]"/>
+ </fo:block>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="biblioentry">
+ <xsl:param name="label">
+ <xsl:call-template name="biblioentry.label"/>
+ </xsl:param>
+
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="string(.) = ''">
+ <xsl:variable name="bib" select="document($bibliography.collection,.)"/>
+ <xsl:variable name="entry" select="$bib/bibliography//
+ *[@id=$id or @xml:id=$id][1]"/>
+ <xsl:choose>
+ <xsl:when test="$entry">
+ <xsl:choose>
+ <xsl:when test="$bibliography.numbered != 0">
+ <xsl:apply-templates select="$entry">
+ <xsl:with-param name="label" select="$label"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="$entry"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:message>
+ <xsl:text>No bibliography entry: </xsl:text>
+ <xsl:value-of select="$id"/>
+ <xsl:text> found in </xsl:text>
+ <xsl:value-of select="$bibliography.collection"/>
+ </xsl:message>
+ <fo:block id="{$id}" xsl:use-attribute-sets="normal.para.spacing">
+ <xsl:text>Error: no bibliography entry: </xsl:text>
+ <xsl:value-of select="$id"/>
+ <xsl:text> found in </xsl:text>
+ <xsl:value-of select="$bibliography.collection"/>
+ </fo:block>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <fo:block id="{$id}" xsl:use-attribute-sets="biblioentry.properties">
+ <xsl:copy-of select="$label"/>
+ <xsl:choose>
+ <xsl:when test="$bibliography.style = 'iso690'">
+ <xsl:call-template name="iso690.makecitation"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </fo:block>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="bibliomixed">
+ <xsl:param name="label">
+ <xsl:call-template name="biblioentry.label"/>
+ </xsl:param>
+
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="string(.) = ''">
+ <xsl:variable name="bib" select="document($bibliography.collection,.)"/>
+ <xsl:variable name="entry" select="$bib/bibliography//
+ *[@id=$id or @xml:id=$id][1]"/>
+ <xsl:choose>
+ <xsl:when test="$entry">
+ <xsl:choose>
+ <xsl:when test="$bibliography.numbered != 0">
+ <xsl:apply-templates select="$entry">
+ <xsl:with-param name="label" select="$label"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="$entry"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:message>
+ <xsl:text>No bibliography entry: </xsl:text>
+ <xsl:value-of select="$id"/>
+ <xsl:text> found in </xsl:text>
+ <xsl:value-of select="$bibliography.collection"/>
+ </xsl:message>
+ <fo:block id="{$id}" xsl:use-attribute-sets="normal.para.spacing">
+ <xsl:text>Error: no bibliography entry: </xsl:text>
+ <xsl:value-of select="$id"/>
+ <xsl:text> found in </xsl:text>
+ <xsl:value-of select="$bibliography.collection"/>
+ </fo:block>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <fo:block id="{$id}" xsl:use-attribute-sets="biblioentry.properties">
+ <xsl:copy-of select="$label"/>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </fo:block>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="biblioentry.label">
+ <xsl:param name="node" select="."/>
+
+ <xsl:choose>
+ <xsl:when test="$bibliography.numbered != 0">
+ <xsl:text>[</xsl:text>
+ <xsl:number from="bibliography" count="biblioentry|bibliomixed"
+ level="any" format="1"/>
+ <xsl:text>] </xsl:text>
+ </xsl:when>
+ <xsl:when test="local-name($node/child::*[1]) = 'abbrev'">
+ <xsl:text>[</xsl:text>
+ <xsl:apply-templates select="$node/abbrev[1]"/>
+ <xsl:text>] </xsl:text>
+ </xsl:when>
+ <xsl:when test="$node/@xreflabel">
+ <xsl:text>[</xsl:text>
+ <xsl:value-of select="$node/@xreflabel"/>
+ <xsl:text>] </xsl:text>
+ </xsl:when>
+ <xsl:when test="$node/@id or $node/@xml:id">
+ <xsl:text>[</xsl:text>
+ <xsl:value-of select="($node/@id|$node/@xml:id)[1]"/>
+ <xsl:text>] </xsl:text>
+ </xsl:when>
+ <xsl:otherwise><!-- nop --></xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="*" mode="bibliography.mode">
+ <xsl:apply-templates select="."/><!-- try the default mode -->
+</xsl:template>
+
+<xsl:template match="abbrev" mode="bibliography.mode">
+ <xsl:if test="preceding-sibling::*">
+ <fo:inline>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ </fo:inline>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="abstract" mode="bibliography.mode">
+ <!-- suppressed -->
+</xsl:template>
+
+<xsl:template match="address" mode="bibliography.mode">
+ <fo:inline>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:value-of select="$biblioentry.item.separator"/>
+ </fo:inline>
+</xsl:template>
+
+<xsl:template match="affiliation" mode="bibliography.mode">
+ <fo:inline>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:value-of select="$biblioentry.item.separator"/>
+ </fo:inline>
+</xsl:template>
+
+<xsl:template match="shortaffil" mode="bibliography.mode">
+ <fo:inline>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:value-of select="$biblioentry.item.separator"/>
+ </fo:inline>
+</xsl:template>
+
+<xsl:template match="jobtitle" mode="bibliography.mode">
+ <fo:inline>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:value-of select="$biblioentry.item.separator"/>
+ </fo:inline>
+</xsl:template>
+
+<xsl:template match="artheader|articleinfo|article/info"
+ mode="bibliography.mode">
+ <fo:inline>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:value-of select="$biblioentry.item.separator"/>
+ </fo:inline>
+</xsl:template>
+
+<xsl:template match="artpagenums" mode="bibliography.mode">
+ <fo:inline>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:value-of select="$biblioentry.item.separator"/>
+ </fo:inline>
+</xsl:template>
+
+<xsl:template match="author" mode="bibliography.mode">
+ <fo:inline>
+ <xsl:call-template name="person.name"/>
+ <xsl:value-of select="$biblioentry.item.separator"/>
+ </fo:inline>
+</xsl:template>
+
+<xsl:template match="authorblurb|personblurb" mode="bibliography.mode">
+ <fo:inline>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:value-of select="$biblioentry.item.separator"/>
+ </fo:inline>
+</xsl:template>
+
+<xsl:template match="authorgroup" mode="bibliography.mode">
+ <fo:inline>
+ <xsl:call-template name="person.name.list"/>
+ <xsl:value-of select="$biblioentry.item.separator"/>
+ </fo:inline>
+</xsl:template>
+
+<xsl:template match="authorinitials" mode="bibliography.mode">
+ <fo:inline>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:value-of select="$biblioentry.item.separator"/>
+ </fo:inline>
+</xsl:template>
+
+<xsl:template match="bibliomisc" mode="bibliography.mode">
+ <fo:inline>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:value-of select="$biblioentry.item.separator"/>
+ </fo:inline>
+</xsl:template>
+
+<xsl:template match="bibliomset" mode="bibliography.mode">
+ <fo:inline>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:value-of select="$biblioentry.item.separator"/>
+ </fo:inline>
+</xsl:template>
+
+<!-- ================================================== -->
+
+<xsl:template match="biblioset" mode="bibliography.mode">
+ <fo:inline>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ </fo:inline>
+</xsl:template>
+
+<xsl:template match="biblioset/title|biblioset/citetitle"
+ mode="bibliography.mode">
+ <xsl:variable name="relation" select="../@relation"/>
+ <xsl:choose>
+ <xsl:when test="$relation='article' or @pubwork='article'">
+ <xsl:call-template name="gentext.startquote"/>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:call-template name="gentext.endquote"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <fo:inline font-style="italic">
+ <xsl:apply-templates/>
+ </fo:inline>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:value-of select="$biblioentry.item.separator"/>
+</xsl:template>
+
+<!-- ================================================== -->
+
+<xsl:template match="bookbiblio" mode="bibliography.mode">
+ <fo:inline>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:value-of select="$biblioentry.item.separator"/>
+ </fo:inline>
+</xsl:template>
+
+<xsl:template match="citetitle" mode="bibliography.mode">
+ <fo:inline>
+ <xsl:choose>
+ <xsl:when test="@pubwork = 'article'">
+ <xsl:call-template name="gentext.startquote"/>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:call-template name="gentext.endquote"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <fo:inline font-style="italic">
+ <xsl:apply-templates mode="bibliography.mode"/>
+ </fo:inline>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:value-of select="$biblioentry.item.separator"/>
+ </fo:inline>
+</xsl:template>
+
+<xsl:template match="collab" mode="bibliography.mode">
+ <fo:inline>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:value-of select="$biblioentry.item.separator"/>
+ </fo:inline>
+</xsl:template>
+
+<xsl:template match="confgroup" mode="bibliography.mode">
+ <fo:inline>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:value-of select="$biblioentry.item.separator"/>
+ </fo:inline>
+</xsl:template>
+
+<xsl:template match="contractnum" mode="bibliography.mode">
+ <fo:inline>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:value-of select="$biblioentry.item.separator"/>
+ </fo:inline>
+</xsl:template>
+
+<xsl:template match="contractsponsor" mode="bibliography.mode">
+ <fo:inline>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:value-of select="$biblioentry.item.separator"/>
+ </fo:inline>
+</xsl:template>
+
+<xsl:template match="contrib" mode="bibliography.mode">
+ <fo:inline>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:value-of select="$biblioentry.item.separator"/>
+ </fo:inline>
+</xsl:template>
+
+<!-- ================================================== -->
+
+<xsl:template match="copyright" mode="bibliography.mode">
+ <fo:inline>
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'Copyright'"/>
+ </xsl:call-template>
+ <xsl:call-template name="gentext.space"/>
+ <xsl:call-template name="dingbat">
+ <xsl:with-param name="dingbat">copyright</xsl:with-param>
+ </xsl:call-template>
+ <xsl:call-template name="gentext.space"/>
+ <xsl:apply-templates select="year" mode="bibliography.mode"/>
+ <xsl:if test="holder">
+ <xsl:call-template name="gentext.space"/>
+ <xsl:apply-templates select="holder" mode="bibliography.mode"/>
+ </xsl:if>
+ <xsl:value-of select="$biblioentry.item.separator"/>
+ </fo:inline>
+</xsl:template>
+
+<xsl:template match="year" mode="bibliography.mode">
+ <xsl:apply-templates/><xsl:text>, </xsl:text>
+</xsl:template>
+
+<xsl:template match="year[position()=last()]" mode="bibliography.mode">
+ <xsl:apply-templates/>
+</xsl:template>
+
+<xsl:template match="holder" mode="bibliography.mode">
+ <xsl:apply-templates/>
+</xsl:template>
+
+<!-- ================================================== -->
+
+<xsl:template match="corpauthor" mode="bibliography.mode">
+ <fo:inline>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:value-of select="$biblioentry.item.separator"/>
+ </fo:inline>
+</xsl:template>
+
+<xsl:template match="corpcredit" mode="bibliography.mode">
+ <fo:inline>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:value-of select="$biblioentry.item.separator"/>
+ </fo:inline>
+</xsl:template>
+
+<xsl:template match="corpname" mode="bibliography.mode">
+ <fo:inline>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:value-of select="$biblioentry.item.separator"/>
+ </fo:inline>
+</xsl:template>
+
+<xsl:template match="date" mode="bibliography.mode">
+ <fo:inline>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:value-of select="$biblioentry.item.separator"/>
+ </fo:inline>
+</xsl:template>
+
+<xsl:template match="edition" mode="bibliography.mode">
+ <fo:inline>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:value-of select="$biblioentry.item.separator"/>
+ </fo:inline>
+</xsl:template>
+
+<xsl:template match="editor" mode="bibliography.mode">
+ <fo:inline>
+ <xsl:call-template name="person.name"/>
+ <xsl:value-of select="$biblioentry.item.separator"/>
+ </fo:inline>
+</xsl:template>
+
+<xsl:template match="firstname" mode="bibliography.mode">
+ <fo:inline>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:value-of select="$biblioentry.item.separator"/>
+ </fo:inline>
+</xsl:template>
+
+<xsl:template match="honorific" mode="bibliography.mode">
+ <fo:inline>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:value-of select="$biblioentry.item.separator"/>
+ </fo:inline>
+</xsl:template>
+
+<xsl:template match="indexterm" mode="bibliography.mode">
+ <xsl:apply-templates select="."/>
+</xsl:template>
+
+<xsl:template match="invpartnumber" mode="bibliography.mode">
+ <fo:inline>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:value-of select="$biblioentry.item.separator"/>
+ </fo:inline>
+</xsl:template>
+
+<xsl:template match="isbn" mode="bibliography.mode">
+ <fo:inline>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:value-of select="$biblioentry.item.separator"/>
+ </fo:inline>
+</xsl:template>
+
+<xsl:template match="issn" mode="bibliography.mode">
+ <fo:inline>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:value-of select="$biblioentry.item.separator"/>
+ </fo:inline>
+</xsl:template>
+
+<xsl:template match="issuenum" mode="bibliography.mode">
+ <fo:inline>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:value-of select="$biblioentry.item.separator"/>
+ </fo:inline>
+</xsl:template>
+
+<xsl:template match="lineage" mode="bibliography.mode">
+ <fo:inline>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:value-of select="$biblioentry.item.separator"/>
+ </fo:inline>
+</xsl:template>
+
+<xsl:template match="orgname" mode="bibliography.mode">
+ <fo:inline>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:value-of select="$biblioentry.item.separator"/>
+ </fo:inline>
+</xsl:template>
+
+<xsl:template match="othercredit" mode="bibliography.mode">
+ <fo:inline>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:value-of select="$biblioentry.item.separator"/>
+ </fo:inline>
+</xsl:template>
+
+<xsl:template match="othername" mode="bibliography.mode">
+ <fo:inline>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:value-of select="$biblioentry.item.separator"/>
+ </fo:inline>
+</xsl:template>
+
+<xsl:template match="pagenums" mode="bibliography.mode">
+ <fo:inline>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:value-of select="$biblioentry.item.separator"/>
+ </fo:inline>
+</xsl:template>
+
+<xsl:template match="printhistory" mode="bibliography.mode">
+ <fo:inline>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:value-of select="$biblioentry.item.separator"/>
+ </fo:inline>
+</xsl:template>
+
+<xsl:template match="productname" mode="bibliography.mode">
+ <fo:inline>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:value-of select="$biblioentry.item.separator"/>
+ </fo:inline>
+</xsl:template>
+
+<xsl:template match="productnumber" mode="bibliography.mode">
+ <fo:inline>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:value-of select="$biblioentry.item.separator"/>
+ </fo:inline>
+</xsl:template>
+
+<xsl:template match="pubdate" mode="bibliography.mode">
+ <fo:inline>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:value-of select="$biblioentry.item.separator"/>
+ </fo:inline>
+</xsl:template>
+
+<xsl:template match="publisher" mode="bibliography.mode">
+ <fo:inline>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ </fo:inline>
+</xsl:template>
+
+<xsl:template match="publishername" mode="bibliography.mode">
+ <fo:inline>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:value-of select="$biblioentry.item.separator"/>
+ </fo:inline>
+</xsl:template>
+
+<xsl:template match="pubsnumber" mode="bibliography.mode">
+ <fo:inline>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:value-of select="$biblioentry.item.separator"/>
+ </fo:inline>
+</xsl:template>
+
+<xsl:template match="releaseinfo" mode="bibliography.mode">
+ <fo:inline>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:value-of select="$biblioentry.item.separator"/>
+ </fo:inline>
+</xsl:template>
+
+<xsl:template match="revhistory" mode="bibliography.mode">
+ <fo:block>
+ <xsl:apply-templates select="."/> <!-- use normal mode -->
+ </fo:block>
+</xsl:template>
+
+<xsl:template match="seriesinfo" mode="bibliography.mode">
+ <fo:inline>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ </fo:inline>
+</xsl:template>
+
+<xsl:template match="seriesvolnums" mode="bibliography.mode">
+ <fo:inline>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:value-of select="$biblioentry.item.separator"/>
+ </fo:inline>
+</xsl:template>
+
+<xsl:template match="subtitle" mode="bibliography.mode">
+ <fo:inline>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:value-of select="$biblioentry.item.separator"/>
+ </fo:inline>
+</xsl:template>
+
+<xsl:template match="surname" mode="bibliography.mode">
+ <fo:inline>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:value-of select="$biblioentry.item.separator"/>
+ </fo:inline>
+</xsl:template>
+
+<xsl:template match="title" mode="bibliography.mode">
+ <fo:inline>
+ <fo:inline font-style="italic">
+ <xsl:apply-templates mode="bibliography.mode"/>
+ </fo:inline>
+ <xsl:value-of select="$biblioentry.item.separator"/>
+ </fo:inline>
+</xsl:template>
+
+<xsl:template match="titleabbrev" mode="bibliography.mode">
+ <fo:inline>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:value-of select="$biblioentry.item.separator"/>
+ </fo:inline>
+</xsl:template>
+
+<xsl:template match="volumenum" mode="bibliography.mode">
+ <fo:inline>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:value-of select="$biblioentry.item.separator"/>
+ </fo:inline>
+</xsl:template>
+
+<xsl:template match="orgdiv" mode="bibliography.mode">
+ <fo:inline>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:value-of select="$biblioentry.item.separator"/>
+ </fo:inline>
+</xsl:template>
+
+<xsl:template match="collabname" mode="bibliography.mode">
+ <fo:inline>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:value-of select="$biblioentry.item.separator"/>
+ </fo:inline>
+</xsl:template>
+
+<xsl:template match="confdates" mode="bibliography.mode">
+ <fo:inline>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:value-of select="$biblioentry.item.separator"/>
+ </fo:inline>
+</xsl:template>
+
+<xsl:template match="conftitle" mode="bibliography.mode">
+ <fo:inline>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:value-of select="$biblioentry.item.separator"/>
+ </fo:inline>
+</xsl:template>
+
+<xsl:template match="confnum" mode="bibliography.mode">
+ <fo:inline>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:value-of select="$biblioentry.item.separator"/>
+ </fo:inline>
+</xsl:template>
+
+<xsl:template match="confsponsor" mode="bibliography.mode">
+ <fo:inline>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:value-of select="$biblioentry.item.separator"/>
+ </fo:inline>
+</xsl:template>
+
+<xsl:template match="bibliocoverage|biblioid|bibliorelation|bibliosource"
+ mode="bibliography.mode">
+ <fo:inline>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:value-of select="$biblioentry.item.separator"/>
+ </fo:inline>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="*" mode="bibliomixed.mode">
+ <xsl:apply-templates select="."/><!-- try the default mode -->
+</xsl:template>
+
+<xsl:template match="abbrev" mode="bibliomixed.mode">
+ <xsl:if test="preceding-sibling::*">
+ <fo:inline>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </fo:inline>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="abstract" mode="bibliomixed.mode">
+ <fo:block start-indent="1in">
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </fo:block>
+</xsl:template>
+
+<xsl:template match="para" mode="bibliomixed.mode">
+ <fo:block>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </fo:block>
+</xsl:template>
+
+<xsl:template match="address" mode="bibliomixed.mode">
+ <fo:inline>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </fo:inline>
+</xsl:template>
+
+<xsl:template match="affiliation" mode="bibliomixed.mode">
+ <fo:inline>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </fo:inline>
+</xsl:template>
+
+<xsl:template match="shortaffil" mode="bibliomixed.mode">
+ <fo:inline>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ </fo:inline>
+</xsl:template>
+
+<xsl:template match="jobtitle" mode="bibliomixed.mode">
+ <fo:inline>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ </fo:inline>
+</xsl:template>
+
+<xsl:template match="artpagenums" mode="bibliomixed.mode">
+ <fo:inline>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </fo:inline>
+</xsl:template>
+
+<xsl:template match="author" mode="bibliomixed.mode">
+ <fo:inline>
+ <xsl:call-template name="person.name"/>
+ </fo:inline>
+</xsl:template>
+
+<xsl:template match="authorblurb|personblurb" mode="bibliomixed.mode">
+ <fo:inline>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </fo:inline>
+</xsl:template>
+
+<xsl:template match="authorgroup" mode="bibliomixed.mode">
+ <fo:inline>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </fo:inline>
+</xsl:template>
+
+<xsl:template match="authorinitials" mode="bibliomixed.mode">
+ <fo:inline>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </fo:inline>
+</xsl:template>
+
+<xsl:template match="bibliomisc" mode="bibliomixed.mode">
+ <fo:inline>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </fo:inline>
+</xsl:template>
+
+<!-- ================================================== -->
+
+<xsl:template match="bibliomset" mode="bibliomixed.mode">
+ <fo:inline>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </fo:inline>
+</xsl:template>
+
+<xsl:template match="bibliomset/title|bibliomset/citetitle"
+ mode="bibliomixed.mode">
+ <xsl:variable name="relation" select="../@relation"/>
+ <xsl:choose>
+ <xsl:when test="$relation='article' or @pubwork='article'">
+ <xsl:call-template name="gentext.startquote"/>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ <xsl:call-template name="gentext.endquote"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <fo:inline font-style="italic">
+ <xsl:apply-templates/>
+ </fo:inline>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ================================================== -->
+
+<xsl:template match="biblioset" mode="bibliomixed.mode">
+ <fo:inline>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </fo:inline>
+</xsl:template>
+
+<xsl:template match="citetitle" mode="bibliomixed.mode">
+ <xsl:choose>
+ <xsl:when test="@pubwork = 'article'">
+ <xsl:call-template name="gentext.startquote"/>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ <xsl:call-template name="gentext.endquote"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <fo:inline font-style="italic">
+ <xsl:apply-templates mode="bibliography.mode"/>
+ </fo:inline>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="collab" mode="bibliomixed.mode">
+ <fo:inline>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </fo:inline>
+</xsl:template>
+
+<xsl:template match="confgroup" mode="bibliomixed.mode">
+ <fo:inline>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </fo:inline>
+</xsl:template>
+
+<xsl:template match="contractnum" mode="bibliomixed.mode">
+ <fo:inline>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </fo:inline>
+</xsl:template>
+
+<xsl:template match="contractsponsor" mode="bibliomixed.mode">
+ <fo:inline>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </fo:inline>
+</xsl:template>
+
+<xsl:template match="contrib" mode="bibliomixed.mode">
+ <fo:inline>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </fo:inline>
+</xsl:template>
+
+<xsl:template match="copyright" mode="bibliomixed.mode">
+ <fo:inline>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </fo:inline>
+</xsl:template>
+
+<xsl:template match="corpauthor" mode="bibliomixed.mode">
+ <fo:inline>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </fo:inline>
+</xsl:template>
+
+<xsl:template match="corpcredit" mode="bibliomixed.mode">
+ <fo:inline>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </fo:inline>
+</xsl:template>
+
+<xsl:template match="corpname" mode="bibliomixed.mode">
+ <fo:inline>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </fo:inline>
+</xsl:template>
+
+<xsl:template match="date" mode="bibliomixed.mode">
+ <fo:inline>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </fo:inline>
+</xsl:template>
+
+<xsl:template match="edition" mode="bibliomixed.mode">
+ <fo:inline>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </fo:inline>
+</xsl:template>
+
+<xsl:template match="editor" mode="bibliomixed.mode">
+ <fo:inline>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </fo:inline>
+</xsl:template>
+
+<xsl:template match="firstname" mode="bibliomixed.mode">
+ <fo:inline>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </fo:inline>
+</xsl:template>
+
+<xsl:template match="honorific" mode="bibliomixed.mode">
+ <fo:inline>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </fo:inline>
+</xsl:template>
+
+<xsl:template match="indexterm" mode="bibliomixed.mode">
+ <xsl:apply-templates select="."/>
+</xsl:template>
+
+<xsl:template match="invpartnumber" mode="bibliomixed.mode">
+ <fo:inline>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </fo:inline>
+</xsl:template>
+
+<xsl:template match="isbn" mode="bibliomixed.mode">
+ <fo:inline>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </fo:inline>
+</xsl:template>
+
+<xsl:template match="issn" mode="bibliomixed.mode">
+ <fo:inline>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </fo:inline>
+</xsl:template>
+
+<xsl:template match="issuenum" mode="bibliomixed.mode">
+ <fo:inline>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </fo:inline>
+</xsl:template>
+
+<xsl:template match="lineage" mode="bibliomixed.mode">
+ <fo:inline>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </fo:inline>
+</xsl:template>
+
+<xsl:template match="orgname" mode="bibliomixed.mode">
+ <fo:inline>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </fo:inline>
+</xsl:template>
+
+<xsl:template match="othercredit" mode="bibliomixed.mode">
+ <fo:inline>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </fo:inline>
+</xsl:template>
+
+<xsl:template match="othername" mode="bibliomixed.mode">
+ <fo:inline>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </fo:inline>
+</xsl:template>
+
+<xsl:template match="pagenums" mode="bibliomixed.mode">
+ <fo:inline>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </fo:inline>
+</xsl:template>
+
+<xsl:template match="printhistory" mode="bibliomixed.mode">
+ <fo:inline>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </fo:inline>
+</xsl:template>
+
+<xsl:template match="productname" mode="bibliomixed.mode">
+ <fo:inline>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </fo:inline>
+</xsl:template>
+
+<xsl:template match="productnumber" mode="bibliomixed.mode">
+ <fo:inline>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </fo:inline>
+</xsl:template>
+
+<xsl:template match="pubdate" mode="bibliomixed.mode">
+ <fo:inline>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </fo:inline>
+</xsl:template>
+
+<xsl:template match="publisher" mode="bibliomixed.mode">
+ <fo:inline>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </fo:inline>
+</xsl:template>
+
+<xsl:template match="publishername" mode="bibliomixed.mode">
+ <fo:inline>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </fo:inline>
+</xsl:template>
+
+<xsl:template match="pubsnumber" mode="bibliomixed.mode">
+ <fo:inline>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </fo:inline>
+</xsl:template>
+
+<xsl:template match="releaseinfo" mode="bibliomixed.mode">
+ <fo:inline>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </fo:inline>
+</xsl:template>
+
+<xsl:template match="revhistory" mode="bibliomixed.mode">
+ <fo:inline>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </fo:inline>
+</xsl:template>
+
+<xsl:template match="seriesvolnums" mode="bibliomixed.mode">
+ <fo:inline>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </fo:inline>
+</xsl:template>
+
+<xsl:template match="subtitle" mode="bibliomixed.mode">
+ <fo:inline>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </fo:inline>
+</xsl:template>
+
+<xsl:template match="surname" mode="bibliomixed.mode">
+ <fo:inline>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </fo:inline>
+</xsl:template>
+
+<xsl:template match="title" mode="bibliomixed.mode">
+ <fo:inline>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </fo:inline>
+</xsl:template>
+
+<xsl:template match="titleabbrev" mode="bibliomixed.mode">
+ <fo:inline>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </fo:inline>
+</xsl:template>
+
+<xsl:template match="volumenum" mode="bibliomixed.mode">
+ <fo:inline>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </fo:inline>
+</xsl:template>
+
+<xsl:template match="bibliocoverage|biblioid|bibliorelation|bibliosource"
+ mode="bibliomixed.mode">
+ <fo:inline>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </fo:inline>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/block.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/block.xsl
new file mode 100644
index 0000000..ce19b41
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/block.xsl
@@ -0,0 +1,654 @@
+<?xml version='1.0'?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:fo="http://www.w3.org/1999/XSL/Format"
+ version='1.0'>
+
+<!-- ********************************************************************
+ $Id: block.xsl 8597 2010-03-20 04:56:04Z bobstayton $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<!-- ==================================================================== -->
+<!-- What should we do about styling blockinfo? -->
+
+<xsl:template match="blockinfo|info">
+ <!-- suppress -->
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template name="block.object">
+ <xsl:variable name="keep.together">
+ <xsl:call-template name="pi.dbfo_keep-together"/>
+ </xsl:variable>
+ <fo:block>
+ <xsl:if test="$keep.together != ''">
+ <xsl:attribute name="keep-together.within-column"><xsl:value-of
+ select="$keep.together"/></xsl:attribute>
+ </xsl:if>
+ <xsl:call-template name="anchor"/>
+ <xsl:apply-templates/>
+ </fo:block>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="para">
+ <xsl:variable name="keep.together">
+ <xsl:call-template name="pi.dbfo_keep-together"/>
+ </xsl:variable>
+ <fo:block xsl:use-attribute-sets="normal.para.spacing">
+ <xsl:if test="$keep.together != ''">
+ <xsl:attribute name="keep-together.within-column"><xsl:value-of
+ select="$keep.together"/></xsl:attribute>
+ </xsl:if>
+ <xsl:call-template name="anchor"/>
+ <xsl:apply-templates/>
+ </fo:block>
+</xsl:template>
+
+<xsl:template match="simpara">
+ <xsl:variable name="keep.together">
+ <xsl:call-template name="pi.dbfo_keep-together"/>
+ </xsl:variable>
+ <fo:block xsl:use-attribute-sets="normal.para.spacing">
+ <xsl:if test="$keep.together != ''">
+ <xsl:attribute name="keep-together.within-column"><xsl:value-of
+ select="$keep.together"/></xsl:attribute>
+ </xsl:if>
+ <xsl:call-template name="anchor"/>
+ <xsl:apply-templates/>
+ </fo:block>
+</xsl:template>
+
+<xsl:template match="formalpara">
+ <xsl:variable name="keep.together">
+ <xsl:call-template name="pi.dbfo_keep-together"/>
+ </xsl:variable>
+ <fo:block xsl:use-attribute-sets="normal.para.spacing">
+ <xsl:if test="$keep.together != ''">
+ <xsl:attribute name="keep-together.within-column"><xsl:value-of
+ select="$keep.together"/></xsl:attribute>
+ </xsl:if>
+ <xsl:call-template name="anchor"/>
+ <xsl:apply-templates/>
+ </fo:block>
+</xsl:template>
+
+<!-- Only use title from info -->
+<xsl:template match="formalpara/info">
+ <xsl:apply-templates select="title"/>
+</xsl:template>
+
+<xsl:template match="formalpara/title|formalpara/info/title">
+ <xsl:variable name="titleStr">
+ <xsl:apply-templates/>
+ </xsl:variable>
+ <xsl:variable name="lastChar">
+ <xsl:if test="$titleStr != ''">
+ <xsl:value-of select="substring($titleStr,string-length($titleStr),1)"/>
+ </xsl:if>
+ </xsl:variable>
+
+ <fo:inline font-weight="bold"
+ keep-with-next.within-line="always"
+ padding-end="1em">
+ <xsl:copy-of select="$titleStr"/>
+ <xsl:if test="$lastChar != ''
+ and not(contains($runinhead.title.end.punct, $lastChar))">
+ <xsl:value-of select="$runinhead.default.title.end.punct"/>
+ </xsl:if>
+ <xsl:text>&#160;</xsl:text>
+ </fo:inline>
+</xsl:template>
+
+<xsl:template match="formalpara/para">
+ <xsl:apply-templates/>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="blockquote">
+ <xsl:variable name="keep.together">
+ <xsl:call-template name="pi.dbfo_keep-together"/>
+ </xsl:variable>
+ <fo:block xsl:use-attribute-sets="blockquote.properties">
+ <xsl:if test="$keep.together != ''">
+ <xsl:attribute name="keep-together.within-column"><xsl:value-of
+ select="$keep.together"/></xsl:attribute>
+ </xsl:if>
+ <xsl:call-template name="anchor"/>
+ <fo:block>
+ <xsl:if test="title|info/title">
+ <fo:block xsl:use-attribute-sets="formal.title.properties">
+ <xsl:apply-templates select="." mode="object.title.markup"/>
+ </fo:block>
+ </xsl:if>
+ <xsl:apply-templates select="*[local-name(.) != 'title'
+ and local-name(.) != 'attribution']"/>
+ </fo:block>
+ <xsl:if test="attribution">
+ <fo:block text-align="right">
+ <!-- mdash -->
+ <xsl:text>&#x2014;</xsl:text>
+ <xsl:apply-templates select="attribution"/>
+ </fo:block>
+ </xsl:if>
+ </fo:block>
+</xsl:template>
+
+<!-- Use an em dash per Chicago Manual of Style and https://sourceforge.net/tracker/index.php?func=detail&aid=2793878&group_id=21935&atid=373747 -->
+<xsl:template match="epigraph">
+ <fo:block>
+ <xsl:call-template name="anchor"/>
+ <xsl:apply-templates select="para|simpara|formalpara|literallayout"/>
+ <xsl:if test="attribution">
+ <fo:inline>
+ <xsl:text>&#x2014;</xsl:text>
+ <xsl:apply-templates select="attribution"/>
+ </fo:inline>
+ </xsl:if>
+ </fo:block>
+</xsl:template>
+
+<xsl:template match="attribution">
+ <fo:inline><xsl:apply-templates/></fo:inline>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template name="floater">
+ <xsl:param name="position" select="'none'"/>
+ <xsl:param name="clear" select="'both'"/>
+ <xsl:param name="width"/>
+ <xsl:param name="content"/>
+ <xsl:param name="start.indent">0pt</xsl:param>
+ <xsl:param name="end.indent">0pt</xsl:param>
+
+ <xsl:choose>
+ <xsl:when test="not($fop.extensions = 0)">
+ <!-- fop 0.20.5 does not support floats -->
+ <xsl:copy-of select="$content"/>
+ </xsl:when>
+ <xsl:when test="$position = 'none'">
+ <xsl:copy-of select="$content"/>
+ </xsl:when>
+ <xsl:when test="$position = 'before'">
+ <fo:float float="before">
+ <xsl:copy-of select="$content"/>
+ </fo:float>
+ </xsl:when>
+ <xsl:when test="$position = 'left' or
+ $position = 'start' or
+ $position = 'right' or
+ $position = 'end' or
+ $position = 'inside' or
+ $position = 'outside'">
+ <xsl:variable name="float">
+ <fo:float float="{$position}"
+ clear="{$clear}">
+ <fo:block-container
+ start-indent="{$start.indent}"
+ end-indent="{$end.indent}">
+ <xsl:if test="$width != ''">
+ <xsl:attribute name="inline-progression-dimension">
+ <xsl:value-of select="$width"/>
+ </xsl:attribute>
+ </xsl:if>
+ <fo:block>
+ <xsl:copy-of select="$content"/>
+ </fo:block>
+ </fo:block-container>
+ </fo:float>
+ </xsl:variable>
+ <xsl:choose>
+ <xsl:when test="$axf.extensions != 0 and self::sidebar">
+ <fo:block xsl:use-attribute-sets="normal.para.spacing"
+ space-after="0pt"
+ space-after.precedence="force"
+ start-indent="0pt" end-indent="0pt">
+ <xsl:copy-of select="$float"/>
+ </fo:block>
+ </xsl:when>
+ <xsl:when test="$axf.extensions != 0 and
+ ($position = 'left' or $position = 'start')">
+ <fo:float float="{$position}"
+ clear="{$clear}">
+ <fo:block-container
+ inline-progression-dimension=".001mm"
+ end-indent="{$start.indent} + {$width} + {$end.indent}">
+ <xsl:attribute name="start-indent">
+ <xsl:choose>
+ <xsl:when test="ancestor::para">
+ <!-- Special case for handling inline floats
+ in Antenna House-->
+ <xsl:value-of select="concat('-', $body.start.indent)"/>
+ </xsl:when>
+ <xsl:otherwise>0pt</xsl:otherwise>
+ </xsl:choose>
+ </xsl:attribute>
+ <fo:block start-indent="{$start.indent}"
+ end-indent="-{$start.indent} - {$width}">
+ <xsl:copy-of select="$content"/>
+ </fo:block>
+ </fo:block-container>
+ </fo:float>
+
+ </xsl:when>
+ <xsl:when test="$axf.extensions != 0 and
+ ($position = 'right' or $position = 'end')">
+ <!-- Special case for handling inline floats in Antenna House-->
+ <fo:float float="{$position}"
+ clear="{$clear}">
+ <fo:block-container
+ inline-progression-dimension=".001mm"
+ end-indent="-{$body.end.indent}"
+ start-indent="{$start.indent} + {$width} + {$end.indent}">
+ <fo:block end-indent="{$end.indent}"
+ start-indent="-{$end.indent} - {$width}">
+ <xsl:copy-of select="$content"/>
+ </fo:block>
+ </fo:block-container>
+ </fo:float>
+
+ </xsl:when>
+ <xsl:when test="$xep.extensions != 0 and self::sidebar">
+ <!-- float needs some space above to line up with following para -->
+ <fo:block xsl:use-attribute-sets="normal.para.spacing">
+ <xsl:copy-of select="$float"/>
+ </fo:block>
+ </xsl:when>
+ <xsl:when test="$xep.extensions != 0">
+ <xsl:copy-of select="$float"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:copy-of select="$float"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:copy-of select="$content"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="sidebar" name="sidebar">
+ <!-- Also does margin notes -->
+ <xsl:variable name="pi-type">
+ <xsl:call-template name="pi.dbfo_float-type"/>
+ </xsl:variable>
+
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="$pi-type = 'margin.note'">
+ <xsl:call-template name="margin.note"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:variable name="content">
+ <fo:block xsl:use-attribute-sets="sidebar.properties"
+ id="{$id}">
+ <xsl:call-template name="sidebar.titlepage"/>
+ <xsl:apply-templates select="node()[not(self::title) and
+ not(self::info) and
+ not(self::sidebarinfo)]"/>
+ </fo:block>
+ </xsl:variable>
+
+ <xsl:variable name="pi-width">
+ <xsl:call-template name="pi.dbfo_sidebar-width"/>
+ </xsl:variable>
+
+ <xsl:variable name="position">
+ <xsl:choose>
+ <xsl:when test="$pi-type != ''">
+ <xsl:value-of select="$pi-type"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$sidebar.float.type"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:call-template name="floater">
+ <xsl:with-param name="content" select="$content"/>
+ <xsl:with-param name="position" select="$position"/>
+ <xsl:with-param name="width">
+ <xsl:choose>
+ <xsl:when test="$pi-width != ''">
+ <xsl:value-of select="$pi-width"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$sidebar.float.width"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:with-param>
+ <xsl:with-param name="start.indent">
+ <xsl:choose>
+ <xsl:when test="$position = 'start' or
+ $position = 'left'">0pt</xsl:when>
+ <xsl:when test="$position = 'end' or
+ $position = 'right'">0.5em</xsl:when>
+ <xsl:otherwise>0pt</xsl:otherwise>
+ </xsl:choose>
+ </xsl:with-param>
+ <xsl:with-param name="end.indent">
+ <xsl:choose>
+ <xsl:when test="$position = 'start' or
+ $position = 'left'">0.5em</xsl:when>
+ <xsl:when test="$position = 'end' or
+ $position = 'right'">0pt</xsl:when>
+ <xsl:otherwise>0pt</xsl:otherwise>
+ </xsl:choose>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+
+</xsl:template>
+
+<xsl:template match="sidebar/title|sidebarinfo|sidebar/info"/>
+
+<xsl:template match="sidebar/title|sidebarinfo/title|sidebar/info/title"
+ mode="titlepage.mode" priority="1">
+ <fo:block xsl:use-attribute-sets="sidebar.title.properties">
+ <xsl:apply-templates/>
+ </fo:block>
+</xsl:template>
+
+<xsl:template name="margin.note">
+ <xsl:param name="content">
+ <fo:block xsl:use-attribute-sets="margin.note.properties">
+ <xsl:if test="./title">
+ <fo:block xsl:use-attribute-sets="margin.note.title.properties">
+ <xsl:apply-templates select="./title" mode="margin.note.title.mode"/>
+ </fo:block>
+ </xsl:if>
+ <xsl:apply-templates/>
+ </fo:block>
+ </xsl:param>
+
+ <xsl:variable name="pi-width">
+ <xsl:call-template name="pi.dbfo_sidebar-width"/>
+ </xsl:variable>
+
+ <xsl:variable name="position" select="$margin.note.float.type"/>
+
+ <xsl:call-template name="floater">
+ <xsl:with-param name="content" select="$content"/>
+ <xsl:with-param name="position" select="$position"/>
+ <xsl:with-param name="width" >
+ <xsl:choose>
+ <xsl:when test="$pi-width != ''">
+ <xsl:value-of select="$pi-width"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$margin.note.width"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:with-param>
+ <xsl:with-param name="start.indent">
+ <xsl:choose>
+ <xsl:when test="$position = 'start' or
+ $position = 'left'">0pt</xsl:when>
+ <xsl:when test="$position = 'end' or
+ $position = 'right'">0.5em</xsl:when>
+ <xsl:otherwise>0pt</xsl:otherwise>
+ </xsl:choose>
+ </xsl:with-param>
+ <xsl:with-param name="end.indent">
+ <xsl:choose>
+ <xsl:when test="$position = 'start' or
+ $position = 'left'">0.5em</xsl:when>
+ <xsl:when test="$position = 'end' or
+ $position = 'right'">0pt</xsl:when>
+ <xsl:otherwise>0pt</xsl:otherwise>
+ </xsl:choose>
+ </xsl:with-param>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="sidebar/title" mode="margin.note.title.mode">
+ <xsl:apply-templates/>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="abstract">
+ <xsl:variable name="keep.together">
+ <xsl:call-template name="pi.dbfo_keep-together"/>
+ </xsl:variable>
+ <fo:block xsl:use-attribute-sets="abstract.properties">
+ <xsl:if test="$keep.together != ''">
+ <xsl:attribute name="keep-together.within-column"><xsl:value-of
+ select="$keep.together"/></xsl:attribute>
+ </xsl:if>
+ <xsl:call-template name="anchor"/>
+ <xsl:apply-templates/>
+ </fo:block>
+</xsl:template>
+
+<xsl:template match="abstract/title|abstract/info/title">
+ <fo:block xsl:use-attribute-sets="abstract.title.properties">
+ <xsl:apply-templates/>
+ </fo:block>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="msgset">
+ <xsl:apply-templates/>
+</xsl:template>
+
+<xsl:template match="msgentry">
+ <xsl:call-template name="block.object"/>
+</xsl:template>
+
+<xsl:template match="simplemsgentry">
+ <xsl:call-template name="block.object"/>
+</xsl:template>
+
+<xsl:template match="msg">
+ <xsl:call-template name="block.object"/>
+</xsl:template>
+
+<xsl:template match="msgmain">
+ <xsl:apply-templates/>
+</xsl:template>
+
+<xsl:template match="msgsub">
+ <xsl:apply-templates/>
+</xsl:template>
+
+<xsl:template match="msgrel">
+ <xsl:apply-templates/>
+</xsl:template>
+
+<xsl:template match="msgtext">
+ <xsl:apply-templates/>
+</xsl:template>
+
+<xsl:template match="msginfo">
+ <xsl:call-template name="block.object"/>
+</xsl:template>
+
+<xsl:template match="msglevel">
+ <fo:block>
+ <fo:inline font-weight="bold"
+ keep-with-next.within-line="always">
+ <xsl:call-template name="gentext.template">
+ <xsl:with-param name="context" select="'msgset'"/>
+ <xsl:with-param name="name" select="'MsgLevel'"/>
+ </xsl:call-template>
+ </fo:inline>
+ <xsl:apply-templates/>
+ </fo:block>
+</xsl:template>
+
+<xsl:template match="msgorig">
+ <fo:block>
+ <fo:inline font-weight="bold"
+ keep-with-next.within-line="always">
+ <xsl:call-template name="gentext.template">
+ <xsl:with-param name="context" select="'msgset'"/>
+ <xsl:with-param name="name" select="'MsgOrig'"/>
+ </xsl:call-template>
+ </fo:inline>
+ <xsl:apply-templates/>
+ </fo:block>
+</xsl:template>
+
+<xsl:template match="msgaud">
+ <fo:block>
+ <fo:inline font-weight="bold"
+ keep-with-next.within-line="always">
+ <xsl:call-template name="gentext.template">
+ <xsl:with-param name="context" select="'msgset'"/>
+ <xsl:with-param name="name" select="'MsgAud'"/>
+ </xsl:call-template>
+ </fo:inline>
+ <xsl:apply-templates/>
+ </fo:block>
+</xsl:template>
+
+<xsl:template match="msgexplan">
+ <xsl:call-template name="block.object"/>
+</xsl:template>
+
+<xsl:template match="msgexplan/title">
+ <fo:block font-weight="bold"
+ keep-with-next.within-column="always"
+ hyphenate="false">
+ <xsl:apply-templates/>
+ </fo:block>
+</xsl:template>
+
+<!-- ==================================================================== -->
+<!-- For better or worse, revhistory is allowed in content... -->
+
+<xsl:template match="revhistory">
+ <fo:table table-layout="fixed" xsl:use-attribute-sets="revhistory.table.properties">
+ <xsl:call-template name="anchor"/>
+ <fo:table-column column-number="1" column-width="proportional-column-width(1)"/>
+ <fo:table-column column-number="2" column-width="proportional-column-width(1)"/>
+ <fo:table-column column-number="3" column-width="proportional-column-width(1)"/>
+ <fo:table-body start-indent="0pt" end-indent="0pt">
+ <fo:table-row>
+ <fo:table-cell number-columns-spanned="3" xsl:use-attribute-sets="revhistory.table.cell.properties">
+ <fo:block xsl:use-attribute-sets="revhistory.title.properties">
+ <xsl:choose>
+ <xsl:when test="title|info/title">
+ <xsl:apply-templates select="title|info/title" mode="titlepage.mode"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'RevHistory'"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </fo:block>
+ </fo:table-cell>
+ </fo:table-row>
+ <xsl:apply-templates/>
+ </fo:table-body>
+ </fo:table>
+</xsl:template>
+
+<xsl:template match="revhistory/title">
+ <!-- Handled in titlepage.mode -->
+</xsl:template>
+
+<xsl:template match="revhistory/revision">
+ <xsl:variable name="revnumber" select="revnumber"/>
+ <xsl:variable name="revdate" select="date"/>
+ <xsl:variable name="revauthor" select="authorinitials|author"/>
+ <xsl:variable name="revremark" select="revremark|revdescription"/>
+ <fo:table-row>
+ <fo:table-cell xsl:use-attribute-sets="revhistory.table.cell.properties">
+ <fo:block>
+ <xsl:call-template name="anchor"/>
+ <xsl:if test="$revnumber">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'Revision'"/>
+ </xsl:call-template>
+ <xsl:call-template name="gentext.space"/>
+ <xsl:apply-templates select="$revnumber[1]"/>
+ </xsl:if>
+ </fo:block>
+ </fo:table-cell>
+ <fo:table-cell xsl:use-attribute-sets="revhistory.table.cell.properties">
+ <fo:block>
+ <xsl:apply-templates select="$revdate[1]"/>
+ </fo:block>
+ </fo:table-cell>
+ <fo:table-cell xsl:use-attribute-sets="revhistory.table.cell.properties">
+ <fo:block>
+ <xsl:for-each select="$revauthor">
+ <xsl:apply-templates select="."/>
+ <xsl:if test="position() != last()">
+ <xsl:text>, </xsl:text>
+ </xsl:if>
+ </xsl:for-each>
+ </fo:block>
+ </fo:table-cell>
+ </fo:table-row>
+ <xsl:if test="$revremark">
+ <fo:table-row>
+ <fo:table-cell number-columns-spanned="3" xsl:use-attribute-sets="revhistory.table.cell.properties">
+ <fo:block>
+ <xsl:apply-templates select="$revremark[1]"/>
+ </fo:block>
+ </fo:table-cell>
+ </fo:table-row>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="revision/revnumber">
+ <xsl:apply-templates/>
+</xsl:template>
+
+<xsl:template match="revision/date">
+ <xsl:apply-templates/>
+</xsl:template>
+
+<xsl:template match="revision/authorinitials">
+ <xsl:apply-templates/>
+</xsl:template>
+
+<xsl:template match="revision/author">
+ <xsl:apply-templates/>
+</xsl:template>
+
+<xsl:template match="revision/revremark">
+ <xsl:apply-templates/>
+</xsl:template>
+
+<xsl:template match="revision/revdescription">
+ <xsl:apply-templates/>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="ackno|acknowledgements[parent::article]">
+ <fo:block xsl:use-attribute-sets="normal.para.spacing">
+ <xsl:call-template name="anchor"/>
+ <xsl:apply-templates/>
+ </fo:block>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="highlights">
+ <xsl:call-template name="block.object"/>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/callout.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/callout.xsl
new file mode 100644
index 0000000..a31f218
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/callout.xsl
@@ -0,0 +1,231 @@
+<?xml version='1.0'?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:fo="http://www.w3.org/1999/XSL/Format"
+ xmlns:sverb="http://nwalsh.com/xslt/ext/com.nwalsh.saxon.Verbatim"
+ xmlns:xverb="com.nwalsh.xalan.Verbatim"
+ xmlns:lxslt="http://xml.apache.org/xslt"
+ exclude-result-prefixes="sverb xverb lxslt"
+ version='1.0'>
+
+<!-- ********************************************************************
+ $Id: callout.xsl 6910 2007-06-28 23:23:30Z xmldoc $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<lxslt:component prefix="xverb"
+ functions="insertCallouts"/>
+
+<xsl:template match="programlistingco|screenco">
+ <xsl:variable name="verbatim" select="programlisting|screen"/>
+ <xsl:variable name="vendor" select="system-property('xsl:vendor')"/>
+
+ <xsl:choose>
+ <xsl:when test="$use.extensions != '0'
+ and $callouts.extension != '0'">
+ <xsl:variable name="rtf">
+ <xsl:apply-templates select="$verbatim">
+ <xsl:with-param name="suppress-numbers" select="'1'"/>
+ </xsl:apply-templates>
+ </xsl:variable>
+
+ <xsl:variable name="rtf-with-callouts">
+ <xsl:choose>
+ <xsl:when test="contains($vendor, 'SAXON ')">
+ <xsl:copy-of select="sverb:insertCallouts(areaspec,$rtf)"/>
+ </xsl:when>
+ <xsl:when test="contains($vendor, 'Apache Software Foundation')">
+ <xsl:copy-of select="xverb:insertCallouts(areaspec,$rtf)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:message terminate="yes">
+ <xsl:text>Don't know how to do callouts with </xsl:text>
+ <xsl:value-of select="$vendor"/>
+ </xsl:message>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="$verbatim/@linenumbering = 'numbered'
+ and $linenumbering.extension != '0'">
+ <xsl:call-template name="number.rtf.lines">
+ <xsl:with-param name="rtf" select="$rtf-with-callouts"/>
+ <xsl:with-param name="pi.context"
+ select="programlisting|screen"/>
+ </xsl:call-template>
+ <xsl:apply-templates select="calloutlist"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:copy-of select="$rtf-with-callouts"/>
+ <xsl:apply-templates select="calloutlist"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="areaspec|areaset|area">
+</xsl:template>
+
+<xsl:template match="areaset" mode="conumber">
+ <xsl:number count="area|areaset" format="1"/>
+</xsl:template>
+
+<xsl:template match="area" mode="conumber">
+ <xsl:number count="area|areaset" format="1"/>
+</xsl:template>
+
+<xsl:template match="co">
+ <fo:inline>
+ <xsl:call-template name="anchor"/>
+ <xsl:apply-templates select="." mode="callout-bug"/>
+ </fo:inline>
+</xsl:template>
+
+<xsl:template match="coref">
+ <!-- tricky; this relies on the fact that we can process the "co" that's -->
+ <!-- "over there" as if it were "right here" -->
+
+ <xsl:variable name="co" select="key('id', @linkend)"/>
+ <xsl:choose>
+ <xsl:when test="not($co)">
+ <xsl:message>
+ <xsl:text>Error: coref link is broken: </xsl:text>
+ <xsl:value-of select="@linkend"/>
+ </xsl:message>
+ </xsl:when>
+ <xsl:when test="local-name($co) != 'co'">
+ <xsl:message>
+ <xsl:text>Error: coref doesn't point to a co: </xsl:text>
+ <xsl:value-of select="@linkend"/>
+ </xsl:message>
+ </xsl:when>
+ <xsl:otherwise>
+ <fo:inline>
+ <xsl:call-template name="anchor"/>
+ <xsl:apply-templates select="$co" mode="callout-bug"/>
+ </fo:inline>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="co" mode="callout-bug">
+ <xsl:call-template name="callout-bug">
+ <xsl:with-param name="conum">
+ <xsl:number count="co"
+ level="any"
+ from="programlisting|screen|literallayout|synopsis"
+ format="1"/>
+ </xsl:with-param>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template name="callout-bug">
+ <xsl:param name="conum" select='1'/>
+
+ <xsl:choose>
+ <!-- Draw callouts as images -->
+ <xsl:when test="$callout.graphics != '0'
+ and $conum &lt;= $callout.graphics.number.limit">
+ <xsl:variable name="filename"
+ select="concat($callout.graphics.path, $conum,
+ $callout.graphics.extension)"/>
+
+ <fo:external-graphic content-width="{$callout.icon.size}"
+ width="{$callout.icon.size}">
+ <xsl:attribute name="src">
+ <xsl:choose>
+ <xsl:when test="$passivetex.extensions != 0
+ or $fop.extensions != 0
+ or $arbortext.extensions != 0">
+ <xsl:value-of select="$filename"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text>url(</xsl:text>
+ <xsl:value-of select="$filename"/>
+ <xsl:text>)</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:attribute>
+ </fo:external-graphic>
+ </xsl:when>
+
+ <xsl:when test="$callout.unicode != 0
+ and $conum &lt;= $callout.unicode.number.limit">
+ <xsl:variable name="comarkup">
+ <xsl:choose>
+ <xsl:when test="$callout.unicode.start.character = 10102">
+ <xsl:choose>
+ <xsl:when test="$conum = 1">&#10102;</xsl:when>
+ <xsl:when test="$conum = 2">&#10103;</xsl:when>
+ <xsl:when test="$conum = 3">&#10104;</xsl:when>
+ <xsl:when test="$conum = 4">&#10105;</xsl:when>
+ <xsl:when test="$conum = 5">&#10106;</xsl:when>
+ <xsl:when test="$conum = 6">&#10107;</xsl:when>
+ <xsl:when test="$conum = 7">&#10108;</xsl:when>
+ <xsl:when test="$conum = 8">&#10109;</xsl:when>
+ <xsl:when test="$conum = 9">&#10110;</xsl:when>
+ <xsl:when test="$conum = 10">&#10111;</xsl:when>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:message>
+ <xsl:text>Don't know how to generate Unicode callouts </xsl:text>
+ <xsl:text>when $callout.unicode.start.character is </xsl:text>
+ <xsl:value-of select="$callout.unicode.start.character"/>
+ </xsl:message>
+ <fo:inline background-color="#404040"
+ color="white"
+ padding-top="0.1em"
+ padding-bottom="0.1em"
+ padding-start="0.2em"
+ padding-end="0.2em"
+ baseline-shift="0.1em"
+ font-family="{$body.fontset}"
+ font-weight="bold"
+ font-size="75%">
+ <xsl:value-of select="$conum"/>
+ </fo:inline>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="$callout.unicode.font != ''">
+ <fo:inline font-family="{$callout.unicode.font}">
+ <xsl:copy-of select="$comarkup"/>
+ </fo:inline>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:copy-of select="$comarkup"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+
+ <!-- Most safe: draw a dark gray square with a white number inside -->
+ <xsl:otherwise>
+ <fo:inline background-color="#404040"
+ color="white"
+ padding-top="0.1em"
+ padding-bottom="0.1em"
+ padding-start="0.2em"
+ padding-end="0.2em"
+ baseline-shift="0.1em"
+ font-family="{$body.fontset}"
+ font-weight="bold"
+ font-size="75%">
+ <xsl:value-of select="$conum"/>
+ </fo:inline>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/component.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/component.xsl
new file mode 100644
index 0000000..1466413
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/component.xsl
@@ -0,0 +1,887 @@
+<?xml version='1.0'?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:fo="http://www.w3.org/1999/XSL/Format"
+ xmlns:axf="http://www.antennahouse.com/names/XSL/Extensions"
+ version='1.0'>
+
+<!-- ********************************************************************
+ $Id: component.xsl 8320 2009-03-12 17:43:44Z mzjn $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<!-- ==================================================================== -->
+
+
+<xsl:template name="component.title">
+ <xsl:param name="node" select="."/>
+ <xsl:param name="pagewide" select="0"/>
+
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id">
+ <xsl:with-param name="object" select="$node"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="title">
+ <xsl:apply-templates select="$node" mode="object.title.markup">
+ <xsl:with-param name="allow-anchors" select="1"/>
+ </xsl:apply-templates>
+ </xsl:variable>
+
+ <xsl:variable name="titleabbrev">
+ <xsl:apply-templates select="$node" mode="titleabbrev.markup"/>
+ </xsl:variable>
+
+ <xsl:variable name="level">
+ <xsl:choose>
+ <xsl:when test="ancestor::section">
+ <xsl:value-of select="count(ancestor::section)+1"/>
+ </xsl:when>
+ <xsl:when test="ancestor::sect5">6</xsl:when>
+ <xsl:when test="ancestor::sect4">5</xsl:when>
+ <xsl:when test="ancestor::sect3">4</xsl:when>
+ <xsl:when test="ancestor::sect2">3</xsl:when>
+ <xsl:when test="ancestor::sect1">2</xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:if test="$passivetex.extensions != 0">
+ <fotex:bookmark xmlns:fotex="http://www.tug.org/fotex"
+ fotex-bookmark-level="2"
+ fotex-bookmark-label="{$id}">
+ <xsl:value-of select="$titleabbrev"/>
+ </fotex:bookmark>
+ </xsl:if>
+
+ <fo:block xsl:use-attribute-sets="component.title.properties">
+ <xsl:if test="$pagewide != 0">
+ <!-- Doesn't work to use 'all' here since not a child of fo:flow -->
+ <xsl:attribute name="span">inherit</xsl:attribute>
+ </xsl:if>
+ <xsl:attribute name="hyphenation-character">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'hyphenation-character'"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:attribute name="hyphenation-push-character-count">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'hyphenation-push-character-count'"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:attribute name="hyphenation-remain-character-count">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'hyphenation-remain-character-count'"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:if test="$axf.extensions != 0">
+ <xsl:attribute name="axf:outline-level">
+ <xsl:value-of select="count($node/ancestor::*)"/>
+ </xsl:attribute>
+ <xsl:attribute name="axf:outline-expand">false</xsl:attribute>
+ <xsl:attribute name="axf:outline-title">
+ <xsl:value-of select="normalize-space($title)"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <!-- Let's handle the case where a component (bibliography, for example)
+ occurs inside a section; will we need parameters for this?
+ Danger Will Robinson: using section.title.level*.properties here
+ runs the risk that someone will set something other than
+ font-size there... -->
+ <xsl:choose>
+ <xsl:when test="$level=2">
+ <fo:block xsl:use-attribute-sets="section.title.level2.properties">
+ <xsl:copy-of select="$title"/>
+ </fo:block>
+ </xsl:when>
+ <xsl:when test="$level=3">
+ <fo:block xsl:use-attribute-sets="section.title.level3.properties">
+ <xsl:copy-of select="$title"/>
+ </fo:block>
+ </xsl:when>
+ <xsl:when test="$level=4">
+ <fo:block xsl:use-attribute-sets="section.title.level4.properties">
+ <xsl:copy-of select="$title"/>
+ </fo:block>
+ </xsl:when>
+ <xsl:when test="$level=5">
+ <fo:block xsl:use-attribute-sets="section.title.level5.properties">
+ <xsl:copy-of select="$title"/>
+ </fo:block>
+ </xsl:when>
+ <xsl:when test="$level=6">
+ <fo:block xsl:use-attribute-sets="section.title.level6.properties">
+ <xsl:copy-of select="$title"/>
+ </fo:block>
+ </xsl:when>
+ <xsl:otherwise>
+ <!-- not in a section: do nothing special -->
+ <xsl:copy-of select="$title"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </fo:block>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="dedication" mode="dedication">
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+
+ <xsl:variable name="master-reference">
+ <xsl:call-template name="select.pagemaster"/>
+ </xsl:variable>
+
+ <fo:page-sequence hyphenate="{$hyphenate}"
+ master-reference="{$master-reference}">
+ <xsl:attribute name="language">
+ <xsl:call-template name="l10n.language"/>
+ </xsl:attribute>
+ <xsl:attribute name="format">
+ <xsl:call-template name="page.number.format">
+ <xsl:with-param name="master-reference" select="$master-reference"/>
+ </xsl:call-template>
+ </xsl:attribute>
+
+ <xsl:attribute name="initial-page-number">
+ <xsl:call-template name="initial.page.number">
+ <xsl:with-param name="master-reference" select="$master-reference"/>
+ </xsl:call-template>
+ </xsl:attribute>
+
+ <xsl:attribute name="force-page-count">
+ <xsl:call-template name="force.page.count">
+ <xsl:with-param name="master-reference" select="$master-reference"/>
+ </xsl:call-template>
+ </xsl:attribute>
+
+ <xsl:attribute name="hyphenation-character">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'hyphenation-character'"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:attribute name="hyphenation-push-character-count">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'hyphenation-push-character-count'"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:attribute name="hyphenation-remain-character-count">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'hyphenation-remain-character-count'"/>
+ </xsl:call-template>
+ </xsl:attribute>
+
+ <xsl:apply-templates select="." mode="running.head.mode">
+ <xsl:with-param name="master-reference" select="$master-reference"/>
+ </xsl:apply-templates>
+
+ <xsl:apply-templates select="." mode="running.foot.mode">
+ <xsl:with-param name="master-reference" select="$master-reference"/>
+ </xsl:apply-templates>
+
+ <fo:flow flow-name="xsl-region-body">
+ <xsl:call-template name="set.flow.properties">
+ <xsl:with-param name="element" select="local-name(.)"/>
+ <xsl:with-param name="master-reference" select="$master-reference"/>
+ </xsl:call-template>
+
+ <fo:block id="{$id}"
+ xsl:use-attribute-sets="component.titlepage.properties">
+ <xsl:call-template name="dedication.titlepage"/>
+ </fo:block>
+ <xsl:apply-templates/>
+ </fo:flow>
+ </fo:page-sequence>
+</xsl:template>
+
+<xsl:template match="dedication"></xsl:template> <!-- see mode="dedication" -->
+<xsl:template match="dedication/docinfo"></xsl:template>
+<xsl:template match="dedication/title"></xsl:template>
+<xsl:template match="dedication/subtitle"></xsl:template>
+<xsl:template match="dedication/titleabbrev"></xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="acknowledgements" mode="acknowledgements">
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+
+ <xsl:variable name="master-reference">
+ <xsl:call-template name="select.pagemaster"/>
+ </xsl:variable>
+
+ <fo:page-sequence hyphenate="{$hyphenate}"
+ master-reference="{$master-reference}">
+ <xsl:attribute name="language">
+ <xsl:call-template name="l10n.language"/>
+ </xsl:attribute>
+ <xsl:attribute name="format">
+ <xsl:call-template name="page.number.format">
+ <xsl:with-param name="master-reference" select="$master-reference"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:attribute name="initial-page-number">
+ <xsl:call-template name="initial.page.number">
+ <xsl:with-param name="master-reference" select="$master-reference"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:attribute name="force-page-count">
+ <xsl:call-template name="force.page.count">
+ <xsl:with-param name="master-reference" select="$master-reference"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:attribute name="hyphenation-character">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'hyphenation-character'"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:attribute name="hyphenation-push-character-count">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'hyphenation-push-character-count'"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:attribute name="hyphenation-remain-character-count">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'hyphenation-remain-character-count'"/>
+ </xsl:call-template>
+ </xsl:attribute>
+
+ <xsl:apply-templates select="." mode="running.head.mode">
+ <xsl:with-param name="master-reference" select="$master-reference"/>
+ </xsl:apply-templates>
+
+ <xsl:apply-templates select="." mode="running.foot.mode">
+ <xsl:with-param name="master-reference" select="$master-reference"/>
+ </xsl:apply-templates>
+
+ <fo:flow flow-name="xsl-region-body">
+ <xsl:call-template name="set.flow.properties">
+ <xsl:with-param name="element" select="local-name(.)"/>
+ <xsl:with-param name="master-reference" select="$master-reference"/>
+ </xsl:call-template>
+
+ <fo:block id="{$id}"
+ xsl:use-attribute-sets="component.titlepage.properties">
+ <xsl:call-template name="acknowledgements.titlepage"/>
+ </fo:block>
+ <xsl:apply-templates/>
+ </fo:flow>
+ </fo:page-sequence>
+</xsl:template>
+
+<xsl:template match="acknowledgements"></xsl:template>
+<xsl:template match="acknowledgements/info"></xsl:template>
+<xsl:template match="acknowledgements/title"></xsl:template>
+<xsl:template match="acknowledgements/titleabbrev"></xsl:template>
+<xsl:template match="acknowledgements/subtitle"></xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="colophon">
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+
+ <xsl:variable name="master-reference">
+ <xsl:call-template name="select.pagemaster"/>
+ </xsl:variable>
+
+ <fo:page-sequence hyphenate="{$hyphenate}"
+ master-reference="{$master-reference}">
+ <xsl:attribute name="language">
+ <xsl:call-template name="l10n.language"/>
+ </xsl:attribute>
+ <xsl:attribute name="format">
+ <xsl:call-template name="page.number.format">
+ <xsl:with-param name="master-reference" select="$master-reference"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:attribute name="initial-page-number">
+ <xsl:call-template name="initial.page.number">
+ <xsl:with-param name="master-reference" select="$master-reference"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:attribute name="force-page-count">
+ <xsl:call-template name="force.page.count">
+ <xsl:with-param name="master-reference" select="$master-reference"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:attribute name="hyphenation-character">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'hyphenation-character'"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:attribute name="hyphenation-push-character-count">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'hyphenation-push-character-count'"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:attribute name="hyphenation-remain-character-count">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'hyphenation-remain-character-count'"/>
+ </xsl:call-template>
+ </xsl:attribute>
+
+ <xsl:apply-templates select="." mode="running.head.mode">
+ <xsl:with-param name="master-reference" select="$master-reference"/>
+ </xsl:apply-templates>
+
+ <xsl:apply-templates select="." mode="running.foot.mode">
+ <xsl:with-param name="master-reference" select="$master-reference"/>
+ </xsl:apply-templates>
+
+ <fo:flow flow-name="xsl-region-body">
+ <xsl:call-template name="set.flow.properties">
+ <xsl:with-param name="element" select="local-name(.)"/>
+ <xsl:with-param name="master-reference" select="$master-reference"/>
+ </xsl:call-template>
+
+ <fo:block id="{$id}"
+ xsl:use-attribute-sets="component.titlepage.properties">
+ <xsl:call-template name="colophon.titlepage"/>
+ </fo:block>
+ <xsl:apply-templates/>
+ </fo:flow>
+ </fo:page-sequence>
+</xsl:template>
+
+<xsl:template match="colophon/title"></xsl:template>
+<xsl:template match="colophon/subtitle"></xsl:template>
+<xsl:template match="colophon/titleabbrev"></xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="preface">
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+
+ <xsl:variable name="master-reference">
+ <xsl:call-template name="select.pagemaster"/>
+ </xsl:variable>
+
+ <fo:page-sequence hyphenate="{$hyphenate}"
+ master-reference="{$master-reference}">
+ <xsl:attribute name="language">
+ <xsl:call-template name="l10n.language"/>
+ </xsl:attribute>
+ <xsl:attribute name="format">
+ <xsl:call-template name="page.number.format">
+ <xsl:with-param name="master-reference" select="$master-reference"/>
+ </xsl:call-template>
+ </xsl:attribute>
+
+ <xsl:attribute name="initial-page-number">
+ <xsl:call-template name="initial.page.number">
+ <xsl:with-param name="master-reference" select="$master-reference"/>
+ </xsl:call-template>
+ </xsl:attribute>
+
+ <xsl:attribute name="force-page-count">
+ <xsl:call-template name="force.page.count">
+ <xsl:with-param name="master-reference" select="$master-reference"/>
+ </xsl:call-template>
+ </xsl:attribute>
+
+ <xsl:attribute name="hyphenation-character">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'hyphenation-character'"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:attribute name="hyphenation-push-character-count">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'hyphenation-push-character-count'"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:attribute name="hyphenation-remain-character-count">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'hyphenation-remain-character-count'"/>
+ </xsl:call-template>
+ </xsl:attribute>
+
+ <xsl:apply-templates select="." mode="running.head.mode">
+ <xsl:with-param name="master-reference" select="$master-reference"/>
+ </xsl:apply-templates>
+
+ <xsl:apply-templates select="." mode="running.foot.mode">
+ <xsl:with-param name="master-reference" select="$master-reference"/>
+ </xsl:apply-templates>
+
+ <fo:flow flow-name="xsl-region-body">
+ <xsl:call-template name="set.flow.properties">
+ <xsl:with-param name="element" select="local-name(.)"/>
+ <xsl:with-param name="master-reference" select="$master-reference"/>
+ </xsl:call-template>
+
+ <fo:block id="{$id}"
+ xsl:use-attribute-sets="component.titlepage.properties">
+ <xsl:call-template name="preface.titlepage"/>
+ </fo:block>
+
+ <xsl:variable name="toc.params">
+ <xsl:call-template name="find.path.params">
+ <xsl:with-param name="table"
+ select="normalize-space($generate.toc)"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:if test="contains($toc.params, 'toc')">
+ <xsl:call-template name="component.toc">
+ <xsl:with-param name="toc.title.p"
+ select="contains($toc.params, 'title')"/>
+ </xsl:call-template>
+ <xsl:call-template name="component.toc.separator"/>
+ </xsl:if>
+
+ <xsl:apply-templates/>
+ </fo:flow>
+ </fo:page-sequence>
+</xsl:template>
+
+<xsl:template match="preface/docinfo|prefaceinfo"></xsl:template>
+<xsl:template match="preface/info"></xsl:template>
+<xsl:template match="preface/title"></xsl:template>
+<xsl:template match="preface/titleabbrev"></xsl:template>
+<xsl:template match="preface/subtitle"></xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="chapter">
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+
+ <xsl:variable name="master-reference">
+ <xsl:call-template name="select.pagemaster"/>
+ </xsl:variable>
+
+ <fo:page-sequence hyphenate="{$hyphenate}"
+ master-reference="{$master-reference}">
+ <xsl:attribute name="language">
+ <xsl:call-template name="l10n.language"/>
+ </xsl:attribute>
+ <xsl:attribute name="format">
+ <xsl:call-template name="page.number.format">
+ <xsl:with-param name="master-reference" select="$master-reference"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:attribute name="initial-page-number">
+ <xsl:call-template name="initial.page.number">
+ <xsl:with-param name="master-reference" select="$master-reference"/>
+ </xsl:call-template>
+ </xsl:attribute>
+
+ <xsl:attribute name="force-page-count">
+ <xsl:call-template name="force.page.count">
+ <xsl:with-param name="master-reference" select="$master-reference"/>
+ </xsl:call-template>
+ </xsl:attribute>
+
+ <xsl:attribute name="hyphenation-character">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'hyphenation-character'"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:attribute name="hyphenation-push-character-count">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'hyphenation-push-character-count'"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:attribute name="hyphenation-remain-character-count">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'hyphenation-remain-character-count'"/>
+ </xsl:call-template>
+ </xsl:attribute>
+
+ <xsl:apply-templates select="." mode="running.head.mode">
+ <xsl:with-param name="master-reference" select="$master-reference"/>
+ </xsl:apply-templates>
+
+ <xsl:apply-templates select="." mode="running.foot.mode">
+ <xsl:with-param name="master-reference" select="$master-reference"/>
+ </xsl:apply-templates>
+
+ <fo:flow flow-name="xsl-region-body">
+ <xsl:call-template name="set.flow.properties">
+ <xsl:with-param name="element" select="local-name(.)"/>
+ <xsl:with-param name="master-reference" select="$master-reference"/>
+ </xsl:call-template>
+
+ <fo:block id="{$id}"
+ xsl:use-attribute-sets="component.titlepage.properties">
+ <xsl:call-template name="chapter.titlepage"/>
+ </fo:block>
+
+ <xsl:variable name="toc.params">
+ <xsl:call-template name="find.path.params">
+ <xsl:with-param name="table" select="normalize-space($generate.toc)"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:if test="contains($toc.params, 'toc')">
+ <xsl:call-template name="component.toc">
+ <xsl:with-param name="toc.title.p"
+ select="contains($toc.params, 'title')"/>
+ </xsl:call-template>
+ <xsl:call-template name="component.toc.separator"/>
+ </xsl:if>
+ <xsl:apply-templates/>
+ </fo:flow>
+ </fo:page-sequence>
+</xsl:template>
+
+<xsl:template match="chapter/docinfo|chapterinfo"></xsl:template>
+<xsl:template match="chapter/info"></xsl:template>
+<xsl:template match="chapter/title"></xsl:template>
+<xsl:template match="chapter/titleabbrev"></xsl:template>
+<xsl:template match="chapter/subtitle"></xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="appendix">
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+
+ <xsl:variable name="master-reference">
+ <xsl:call-template name="select.pagemaster"/>
+ </xsl:variable>
+
+ <fo:page-sequence hyphenate="{$hyphenate}"
+ master-reference="{$master-reference}">
+ <xsl:attribute name="language">
+ <xsl:call-template name="l10n.language"/>
+ </xsl:attribute>
+ <xsl:attribute name="format">
+ <xsl:call-template name="page.number.format">
+ <xsl:with-param name="master-reference" select="$master-reference"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:attribute name="initial-page-number">
+ <xsl:call-template name="initial.page.number">
+ <xsl:with-param name="master-reference" select="$master-reference"/>
+ </xsl:call-template>
+ </xsl:attribute>
+
+ <xsl:attribute name="force-page-count">
+ <xsl:call-template name="force.page.count">
+ <xsl:with-param name="master-reference" select="$master-reference"/>
+ </xsl:call-template>
+ </xsl:attribute>
+
+ <xsl:attribute name="hyphenation-character">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'hyphenation-character'"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:attribute name="hyphenation-push-character-count">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'hyphenation-push-character-count'"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:attribute name="hyphenation-remain-character-count">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'hyphenation-remain-character-count'"/>
+ </xsl:call-template>
+ </xsl:attribute>
+
+ <xsl:apply-templates select="." mode="running.head.mode">
+ <xsl:with-param name="master-reference" select="$master-reference"/>
+ </xsl:apply-templates>
+
+ <xsl:apply-templates select="." mode="running.foot.mode">
+ <xsl:with-param name="master-reference" select="$master-reference"/>
+ </xsl:apply-templates>
+
+ <fo:flow flow-name="xsl-region-body">
+ <xsl:call-template name="set.flow.properties">
+ <xsl:with-param name="element" select="local-name(.)"/>
+ <xsl:with-param name="master-reference" select="$master-reference"/>
+ </xsl:call-template>
+
+ <fo:block id="{$id}"
+ xsl:use-attribute-sets="component.titlepage.properties">
+ <xsl:call-template name="appendix.titlepage"/>
+ </fo:block>
+
+ <xsl:variable name="toc.params">
+ <xsl:call-template name="find.path.params">
+ <xsl:with-param name="table" select="normalize-space($generate.toc)"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:if test="contains($toc.params, 'toc')">
+ <xsl:call-template name="component.toc">
+ <xsl:with-param name="toc.title.p"
+ select="contains($toc.params, 'title')"/>
+ </xsl:call-template>
+ <xsl:call-template name="component.toc.separator"/>
+ </xsl:if>
+ <xsl:apply-templates/>
+ </fo:flow>
+ </fo:page-sequence>
+</xsl:template>
+
+<xsl:template match="appendix/docinfo|appendixinfo"></xsl:template>
+<xsl:template match="appendix/info"></xsl:template>
+<xsl:template match="appendix/title"></xsl:template>
+<xsl:template match="appendix/titleabbrev"></xsl:template>
+<xsl:template match="appendix/subtitle"></xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="article">
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+
+ <xsl:variable name="master-reference">
+ <xsl:call-template name="select.pagemaster"/>
+ </xsl:variable>
+
+ <fo:page-sequence hyphenate="{$hyphenate}"
+ master-reference="{$master-reference}">
+ <xsl:attribute name="language">
+ <xsl:call-template name="l10n.language"/>
+ </xsl:attribute>
+ <xsl:attribute name="format">
+ <xsl:call-template name="page.number.format">
+ <xsl:with-param name="master-reference" select="$master-reference"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:attribute name="initial-page-number">
+ <xsl:call-template name="initial.page.number">
+ <xsl:with-param name="master-reference" select="$master-reference"/>
+ </xsl:call-template>
+ </xsl:attribute>
+
+ <xsl:attribute name="force-page-count">
+ <xsl:call-template name="force.page.count">
+ <xsl:with-param name="master-reference" select="$master-reference"/>
+ </xsl:call-template>
+ </xsl:attribute>
+
+ <xsl:attribute name="hyphenation-character">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'hyphenation-character'"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:attribute name="hyphenation-push-character-count">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'hyphenation-push-character-count'"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:attribute name="hyphenation-remain-character-count">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'hyphenation-remain-character-count'"/>
+ </xsl:call-template>
+ </xsl:attribute>
+
+ <xsl:apply-templates select="." mode="running.head.mode">
+ <xsl:with-param name="master-reference" select="$master-reference"/>
+ </xsl:apply-templates>
+
+ <xsl:apply-templates select="." mode="running.foot.mode">
+ <xsl:with-param name="master-reference" select="$master-reference"/>
+ </xsl:apply-templates>
+
+ <fo:flow flow-name="xsl-region-body">
+ <xsl:call-template name="set.flow.properties">
+ <xsl:with-param name="element" select="local-name(.)"/>
+ <xsl:with-param name="master-reference" select="$master-reference"/>
+ </xsl:call-template>
+
+ <fo:block id="{$id}"
+ xsl:use-attribute-sets="component.titlepage.properties">
+ <xsl:call-template name="article.titlepage"/>
+ </fo:block>
+
+ <xsl:variable name="toc.params">
+ <xsl:call-template name="find.path.params">
+ <xsl:with-param name="table" select="normalize-space($generate.toc)"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:if test="contains($toc.params, 'toc')">
+ <xsl:call-template name="component.toc">
+ <xsl:with-param name="toc.title.p"
+ select="contains($toc.params, 'title')"/>
+ </xsl:call-template>
+ <xsl:call-template name="component.toc.separator"/>
+ </xsl:if>
+ <xsl:apply-templates/>
+ </fo:flow>
+ </fo:page-sequence>
+</xsl:template>
+
+<xsl:template match="article/artheader"></xsl:template>
+<xsl:template match="article/articleinfo"></xsl:template>
+<xsl:template match="article/info"></xsl:template>
+<xsl:template match="article/title"></xsl:template>
+<xsl:template match="article/subtitle"></xsl:template>
+<xsl:template match="article/titleabbrev"></xsl:template>
+
+<xsl:template match="article/appendix">
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+
+ <xsl:variable name="title">
+ <xsl:apply-templates select="." mode="object.title.markup"/>
+ </xsl:variable>
+
+ <xsl:variable name="titleabbrev">
+ <xsl:apply-templates select="." mode="titleabbrev.markup"/>
+ </xsl:variable>
+
+ <fo:block id='{$id}'>
+ <xsl:if test="$axf.extensions != 0">
+ <xsl:attribute name="axf:outline-level">
+ <xsl:value-of select="count(ancestor::*)+2"/>
+ </xsl:attribute>
+ <xsl:attribute name="axf:outline-expand">false</xsl:attribute>
+ <xsl:attribute name="axf:outline-title">
+ <xsl:value-of select="normalize-space($titleabbrev)"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:if test="$passivetex.extensions != 0">
+ <fotex:bookmark xmlns:fotex="http://www.tug.org/fotex"
+ fotex-bookmark-level="{count(ancestor::*)+2}"
+ fotex-bookmark-label="{$id}">
+ <xsl:value-of select="$titleabbrev"/>
+ </fotex:bookmark>
+ </xsl:if>
+
+ <fo:block xsl:use-attribute-sets="article.appendix.title.properties">
+ <fo:marker marker-class-name="section.head.marker">
+ <xsl:choose>
+ <xsl:when test="$titleabbrev = ''">
+ <xsl:value-of select="$title"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$titleabbrev"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </fo:marker>
+ <xsl:copy-of select="$title"/>
+ </fo:block>
+
+ <xsl:variable name="toc.params">
+ <xsl:call-template name="find.path.params">
+ <xsl:with-param name="table" select="normalize-space($generate.toc)"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:if test="contains($toc.params, 'toc')">
+ <xsl:call-template name="component.toc">
+ <xsl:with-param name="toc.title.p"
+ select="contains($toc.params, 'title')"/>
+ </xsl:call-template>
+ <xsl:call-template name="component.toc.separator"/>
+ </xsl:if>
+
+ <xsl:apply-templates/>
+ </fo:block>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<!-- Utility template to create a page sequence for an element -->
+<xsl:template match="*" mode="page.sequence" name="page.sequence">
+ <xsl:param name="content">
+ <xsl:apply-templates/>
+ </xsl:param>
+ <xsl:param name="master-reference">
+ <xsl:call-template name="select.pagemaster"/>
+ </xsl:param>
+ <xsl:param name="element" select="local-name(.)"/>
+ <xsl:param name="gentext-key" select="local-name(.)"/>
+ <xsl:param name="language">
+ <xsl:call-template name="l10n.language"/>
+ </xsl:param>
+
+ <xsl:param name="format">
+ <xsl:call-template name="page.number.format">
+ <xsl:with-param name="master-reference" select="$master-reference"/>
+ <xsl:with-param name="element" select="$element"/>
+ </xsl:call-template>
+ </xsl:param>
+
+ <xsl:param name="initial-page-number">
+ <xsl:call-template name="initial.page.number">
+ <xsl:with-param name="master-reference" select="$master-reference"/>
+ <xsl:with-param name="element" select="$element"/>
+ </xsl:call-template>
+ </xsl:param>
+
+ <xsl:param name="force-page-count">
+ <xsl:call-template name="force.page.count">
+ <xsl:with-param name="master-reference" select="$master-reference"/>
+ <xsl:with-param name="element" select="$element"/>
+ </xsl:call-template>
+ </xsl:param>
+
+ <fo:page-sequence hyphenate="{$hyphenate}"
+ master-reference="{$master-reference}">
+ <xsl:attribute name="language">
+ <xsl:value-of select="$language"/>
+ </xsl:attribute>
+ <xsl:attribute name="format">
+ <xsl:value-of select="$format"/>
+ </xsl:attribute>
+
+ <xsl:attribute name="initial-page-number">
+ <xsl:value-of select="$initial-page-number"/>
+ </xsl:attribute>
+
+ <xsl:attribute name="force-page-count">
+ <xsl:value-of select="$force-page-count"/>
+ </xsl:attribute>
+
+ <xsl:attribute name="hyphenation-character">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'hyphenation-character'"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:attribute name="hyphenation-push-character-count">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'hyphenation-push-character-count'"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:attribute name="hyphenation-remain-character-count">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'hyphenation-remain-character-count'"/>
+ </xsl:call-template>
+ </xsl:attribute>
+
+ <xsl:apply-templates select="." mode="running.head.mode">
+ <xsl:with-param name="master-reference" select="$master-reference"/>
+ <xsl:with-param name="gentext-key" select="$gentext-key"/>
+ </xsl:apply-templates>
+
+ <xsl:apply-templates select="." mode="running.foot.mode">
+ <xsl:with-param name="master-reference" select="$master-reference"/>
+ <xsl:with-param name="gentext-key" select="$gentext-key"/>
+ </xsl:apply-templates>
+
+ <fo:flow flow-name="xsl-region-body">
+ <xsl:call-template name="set.flow.properties">
+ <xsl:with-param name="element" select="local-name(.)"/>
+ <xsl:with-param name="master-reference" select="$master-reference"/>
+ </xsl:call-template>
+
+ <xsl:copy-of select="$content"/>
+
+ </fo:flow>
+ </fo:page-sequence>
+</xsl:template>
+
+</xsl:stylesheet>
+
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/division.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/division.xsl
new file mode 100644
index 0000000..975d8c5
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/division.xsl
@@ -0,0 +1,612 @@
+<?xml version='1.0'?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:fo="http://www.w3.org/1999/XSL/Format"
+ xmlns:axf="http://www.antennahouse.com/names/XSL/Extensions"
+ version='1.0'>
+
+<!-- ********************************************************************
+ $Id: division.xsl 8320 2009-03-12 17:43:44Z mzjn $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<!-- ==================================================================== -->
+
+<xsl:template name="division.title">
+ <xsl:param name="node" select="."/>
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id">
+ <xsl:with-param name="object" select="$node"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:variable name="title">
+ <xsl:apply-templates select="$node" mode="object.title.markup"/>
+ </xsl:variable>
+
+ <xsl:if test="$passivetex.extensions != 0">
+ <fotex:bookmark xmlns:fotex="http://www.tug.org/fotex"
+ fotex-bookmark-level="1"
+ fotex-bookmark-label="{$id}">
+ <xsl:value-of select="$title"/>
+ </fotex:bookmark>
+ </xsl:if>
+
+ <fo:block keep-with-next.within-column="always"
+ hyphenate="false">
+ <xsl:if test="$axf.extensions != 0">
+ <xsl:attribute name="axf:outline-level">
+ <xsl:choose>
+ <xsl:when test="count($node/ancestor::*) > 0">
+ <xsl:value-of select="count($node/ancestor::*)"/>
+ </xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:attribute>
+ <xsl:attribute name="axf:outline-expand">false</xsl:attribute>
+ <xsl:attribute name="axf:outline-title">
+ <xsl:value-of select="normalize-space($title)"/>
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:copy-of select="$title"/>
+ </fo:block>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="set">
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+
+ <xsl:variable name="preamble"
+ select="*[not(self::book or self::set or self::setindex)]"/>
+
+ <xsl:variable name="content" select="book|set|setindex"/>
+
+ <xsl:variable name="titlepage-master-reference">
+ <xsl:call-template name="select.pagemaster">
+ <xsl:with-param name="pageclass" select="'titlepage'"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="lot-master-reference">
+ <xsl:call-template name="select.pagemaster">
+ <xsl:with-param name="pageclass" select="'lot'"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:if test="$preamble">
+ <fo:page-sequence hyphenate="{$hyphenate}"
+ master-reference="{$titlepage-master-reference}">
+ <xsl:attribute name="language">
+ <xsl:call-template name="l10n.language"/>
+ </xsl:attribute>
+ <xsl:attribute name="format">
+ <xsl:call-template name="page.number.format">
+ <xsl:with-param name="master-reference"
+ select="$titlepage-master-reference"/>
+ </xsl:call-template>
+ </xsl:attribute>
+
+ <xsl:attribute name="initial-page-number">
+ <xsl:call-template name="initial.page.number">
+ <xsl:with-param name="master-reference"
+ select="$titlepage-master-reference"/>
+ </xsl:call-template>
+ </xsl:attribute>
+
+ <xsl:attribute name="force-page-count">
+ <xsl:call-template name="force.page.count">
+ <xsl:with-param name="master-reference"
+ select="$titlepage-master-reference"/>
+ </xsl:call-template>
+ </xsl:attribute>
+
+ <xsl:attribute name="hyphenation-character">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'hyphenation-character'"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:attribute name="hyphenation-push-character-count">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'hyphenation-push-character-count'"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:attribute name="hyphenation-remain-character-count">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'hyphenation-remain-character-count'"/>
+ </xsl:call-template>
+ </xsl:attribute>
+
+ <xsl:apply-templates select="." mode="running.head.mode">
+ <xsl:with-param name="master-reference" select="$titlepage-master-reference"/>
+ </xsl:apply-templates>
+
+ <xsl:apply-templates select="." mode="running.foot.mode">
+ <xsl:with-param name="master-reference" select="$titlepage-master-reference"/>
+ </xsl:apply-templates>
+
+ <fo:flow flow-name="xsl-region-body">
+ <xsl:call-template name="set.flow.properties">
+ <xsl:with-param name="element" select="local-name(.)"/>
+ <xsl:with-param name="master-reference"
+ select="$titlepage-master-reference"/>
+ </xsl:call-template>
+
+ <fo:block id="{$id}">
+ <xsl:call-template name="set.titlepage"/>
+ </fo:block>
+ </fo:flow>
+ </fo:page-sequence>
+ </xsl:if>
+
+ <xsl:variable name="toc.params">
+ <xsl:call-template name="find.path.params">
+ <xsl:with-param name="table" select="normalize-space($generate.toc)"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:if test="contains($toc.params, 'toc')">
+ <fo:page-sequence hyphenate="{$hyphenate}"
+ master-reference="{$lot-master-reference}">
+ <xsl:attribute name="language">
+ <xsl:call-template name="l10n.language"/>
+ </xsl:attribute>
+ <xsl:attribute name="format">
+ <xsl:call-template name="page.number.format">
+ <xsl:with-param name="element" select="'toc'"/>
+ <xsl:with-param name="master-reference"
+ select="$lot-master-reference"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:attribute name="initial-page-number">
+ <xsl:call-template name="initial.page.number">
+ <xsl:with-param name="master-reference"
+ select="$lot-master-reference"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:attribute name="force-page-count">
+ <xsl:call-template name="force.page.count">
+ <xsl:with-param name="master-reference"
+ select="$lot-master-reference"/>
+ </xsl:call-template>
+ </xsl:attribute>
+
+ <xsl:attribute name="hyphenation-character">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'hyphenation-character'"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:attribute name="hyphenation-push-character-count">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'hyphenation-push-character-count'"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:attribute name="hyphenation-remain-character-count">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'hyphenation-remain-character-count'"/>
+ </xsl:call-template>
+ </xsl:attribute>
+
+ <xsl:apply-templates select="." mode="running.head.mode">
+ <xsl:with-param name="master-reference" select="$lot-master-reference"/>
+ </xsl:apply-templates>
+
+ <xsl:apply-templates select="." mode="running.foot.mode">
+ <xsl:with-param name="master-reference" select="$lot-master-reference"/>
+ </xsl:apply-templates>
+
+ <fo:flow flow-name="xsl-region-body">
+ <xsl:call-template name="set.flow.properties">
+ <xsl:with-param name="element" select="local-name(.)"/>
+ <xsl:with-param name="master-reference"
+ select="$lot-master-reference"/>
+ </xsl:call-template>
+
+ <xsl:call-template name="set.toc"/>
+ </fo:flow>
+ </fo:page-sequence>
+ </xsl:if>
+
+ <xsl:apply-templates select="$content"/>
+</xsl:template>
+
+<xsl:template match="set/setinfo"></xsl:template>
+<xsl:template match="set/title"></xsl:template>
+<xsl:template match="set/subtitle"></xsl:template>
+<xsl:template match="set/titleabbrev"></xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="book">
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+
+ <xsl:variable name="preamble"
+ select="title|subtitle|titleabbrev|bookinfo|info"/>
+
+ <xsl:variable name="content"
+ select="node()[not(self::title or self::subtitle
+ or self::titleabbrev
+ or self::info
+ or self::bookinfo)]"/>
+
+ <xsl:variable name="titlepage-master-reference">
+ <xsl:call-template name="select.pagemaster">
+ <xsl:with-param name="pageclass" select="'titlepage'"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:call-template name="front.cover"/>
+
+ <xsl:if test="$preamble">
+ <xsl:call-template name="page.sequence">
+ <xsl:with-param name="master-reference"
+ select="$titlepage-master-reference"/>
+ <xsl:with-param name="content">
+ <fo:block id="{$id}">
+ <xsl:call-template name="book.titlepage"/>
+ </fo:block>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:if>
+
+ <xsl:apply-templates select="dedication" mode="dedication"/>
+ <xsl:apply-templates select="acknowledgements" mode="acknowledgements"/>
+
+ <xsl:call-template name="make.book.tocs"/>
+
+ <xsl:apply-templates select="$content"/>
+
+ <xsl:call-template name="back.cover"/>
+
+</xsl:template>
+
+<xsl:template match="book/bookinfo"></xsl:template>
+<xsl:template match="book/info"></xsl:template>
+<xsl:template match="book/title"></xsl:template>
+<xsl:template match="book/subtitle"></xsl:template>
+<xsl:template match="book/titleabbrev"></xsl:template>
+
+<!-- Placeholder templates -->
+<xsl:template name="front.cover"/>
+<xsl:template name="back.cover"/>
+
+<!-- ================================================================= -->
+<xsl:template name="make.book.tocs">
+
+ <xsl:variable name="lot-master-reference">
+ <xsl:call-template name="select.pagemaster">
+ <xsl:with-param name="pageclass" select="'lot'"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="toc.params">
+ <xsl:call-template name="find.path.params">
+ <xsl:with-param name="table" select="normalize-space($generate.toc)"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:if test="contains($toc.params, 'toc')">
+ <xsl:call-template name="page.sequence">
+ <xsl:with-param name="master-reference"
+ select="$lot-master-reference"/>
+ <xsl:with-param name="element" select="'toc'"/>
+ <xsl:with-param name="gentext-key" select="'TableofContents'"/>
+ <xsl:with-param name="content">
+ <xsl:call-template name="division.toc">
+ <xsl:with-param name="toc.title.p"
+ select="contains($toc.params, 'title')"/>
+ </xsl:call-template>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:if>
+
+ <xsl:if test="contains($toc.params,'figure') and .//figure">
+ <xsl:call-template name="page.sequence">
+ <xsl:with-param name="master-reference"
+ select="$lot-master-reference"/>
+ <xsl:with-param name="element" select="'toc'"/>
+ <xsl:with-param name="gentext-key" select="'ListofFigures'"/>
+ <xsl:with-param name="content">
+ <xsl:call-template name="list.of.titles">
+ <xsl:with-param name="titles" select="'figure'"/>
+ <xsl:with-param name="nodes" select=".//figure"/>
+ </xsl:call-template>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:if>
+
+ <xsl:if test="contains($toc.params,'table') and .//table">
+ <xsl:call-template name="page.sequence">
+ <xsl:with-param name="master-reference"
+ select="$lot-master-reference"/>
+ <xsl:with-param name="element" select="'toc'"/>
+ <xsl:with-param name="gentext-key" select="'ListofTables'"/>
+ <xsl:with-param name="content">
+ <xsl:call-template name="list.of.titles">
+ <xsl:with-param name="titles" select="'table'"/>
+ <xsl:with-param name="nodes" select=".//table"/>
+ </xsl:call-template>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:if>
+
+ <xsl:if test="contains($toc.params,'example') and .//example">
+ <xsl:call-template name="page.sequence">
+ <xsl:with-param name="master-reference"
+ select="$lot-master-reference"/>
+ <xsl:with-param name="element" select="'toc'"/>
+ <xsl:with-param name="gentext-key" select="'ListofExample'"/>
+ <xsl:with-param name="content">
+ <xsl:call-template name="list.of.titles">
+ <xsl:with-param name="titles" select="'example'"/>
+ <xsl:with-param name="nodes" select=".//example"/>
+ </xsl:call-template>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:if>
+
+ <xsl:if test="contains($toc.params,'equation') and
+ .//equation[title or info/title]">
+ <xsl:call-template name="page.sequence">
+ <xsl:with-param name="master-reference"
+ select="$lot-master-reference"/>
+ <xsl:with-param name="element" select="'toc'"/>
+ <xsl:with-param name="gentext-key" select="'ListofEquations'"/>
+ <xsl:with-param name="content">
+ <xsl:call-template name="list.of.titles">
+ <xsl:with-param name="titles" select="'equation'"/>
+ <xsl:with-param name="nodes"
+ select=".//equation[title or info/title]"/>
+ </xsl:call-template>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:if>
+
+ <xsl:if test="contains($toc.params,'procedure') and
+ .//procedure[title or info/title]">
+ <xsl:call-template name="page.sequence">
+ <xsl:with-param name="master-reference"
+ select="$lot-master-reference"/>
+ <xsl:with-param name="element" select="'toc'"/>
+ <xsl:with-param name="gentext-key" select="'ListofProcedures'"/>
+ <xsl:with-param name="content">
+ <xsl:call-template name="list.of.titles">
+ <xsl:with-param name="titles" select="'procedure'"/>
+ <xsl:with-param name="nodes"
+ select=".//procedure[title or info/title]"/>
+ </xsl:call-template>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:if>
+</xsl:template>
+<!-- ==================================================================== -->
+
+<xsl:template match="part">
+ <xsl:if test="not(partintro)">
+ <xsl:apply-templates select="." mode="part.titlepage.mode"/>
+ <xsl:call-template name="generate.part.toc"/>
+ </xsl:if>
+ <xsl:apply-templates/>
+</xsl:template>
+
+<xsl:template match="part" mode="part.titlepage.mode">
+ <!-- done this way to force the context node to be the part -->
+ <xsl:param name="additional.content"/>
+
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+
+ <xsl:variable name="titlepage-master-reference">
+ <xsl:call-template name="select.pagemaster">
+ <xsl:with-param name="pageclass" select="'titlepage'"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <fo:page-sequence hyphenate="{$hyphenate}"
+ master-reference="{$titlepage-master-reference}">
+ <xsl:attribute name="language">
+ <xsl:call-template name="l10n.language"/>
+ </xsl:attribute>
+ <xsl:attribute name="format">
+ <xsl:call-template name="page.number.format">
+ <xsl:with-param name="master-reference"
+ select="$titlepage-master-reference"/>
+ </xsl:call-template>
+ </xsl:attribute>
+
+ <xsl:attribute name="initial-page-number">
+ <xsl:call-template name="initial.page.number">
+ <xsl:with-param name="master-reference"
+ select="$titlepage-master-reference"/>
+ </xsl:call-template>
+ </xsl:attribute>
+
+ <xsl:attribute name="force-page-count">
+ <xsl:call-template name="force.page.count">
+ <xsl:with-param name="master-reference"
+ select="$titlepage-master-reference"/>
+ </xsl:call-template>
+ </xsl:attribute>
+
+ <xsl:attribute name="hyphenation-character">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'hyphenation-character'"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:attribute name="hyphenation-push-character-count">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'hyphenation-push-character-count'"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:attribute name="hyphenation-remain-character-count">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'hyphenation-remain-character-count'"/>
+ </xsl:call-template>
+ </xsl:attribute>
+
+ <xsl:apply-templates select="." mode="running.head.mode">
+ <xsl:with-param name="master-reference" select="$titlepage-master-reference"/>
+ </xsl:apply-templates>
+
+ <xsl:apply-templates select="." mode="running.foot.mode">
+ <xsl:with-param name="master-reference" select="$titlepage-master-reference"/>
+ </xsl:apply-templates>
+
+ <fo:flow flow-name="xsl-region-body">
+ <xsl:call-template name="set.flow.properties">
+ <xsl:with-param name="element" select="local-name(.)"/>
+ <xsl:with-param name="master-reference"
+ select="$titlepage-master-reference"/>
+ </xsl:call-template>
+
+ <fo:block id="{$id}">
+ <xsl:call-template name="part.titlepage"/>
+ </fo:block>
+ <xsl:copy-of select="$additional.content"/>
+ </fo:flow>
+ </fo:page-sequence>
+</xsl:template>
+
+<xsl:template match="part/docinfo|partinfo"></xsl:template>
+<xsl:template match="part/info"></xsl:template>
+<xsl:template match="part/title"></xsl:template>
+<xsl:template match="part/subtitle"></xsl:template>
+<xsl:template match="part/titleabbrev"></xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template name="generate.part.toc">
+ <xsl:param name="part" select="."/>
+
+ <xsl:variable name="lot-master-reference">
+ <xsl:call-template name="select.pagemaster">
+ <xsl:with-param name="pageclass" select="'lot'"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="toc.params">
+ <xsl:call-template name="find.path.params">
+ <xsl:with-param name="node" select="$part"/>
+ <xsl:with-param name="table" select="normalize-space($generate.toc)"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="nodes" select="reference|
+ preface|
+ chapter|
+ appendix|
+ article|
+ bibliography|
+ glossary|
+ index"/>
+
+ <xsl:if test="count($nodes) &gt; 0 and contains($toc.params, 'toc')">
+ <fo:page-sequence hyphenate="{$hyphenate}"
+ master-reference="{$lot-master-reference}">
+ <xsl:attribute name="language">
+ <xsl:call-template name="l10n.language"/>
+ </xsl:attribute>
+ <xsl:attribute name="format">
+ <xsl:call-template name="page.number.format">
+ <xsl:with-param name="element" select="'toc'"/>
+ <xsl:with-param name="master-reference"
+ select="$lot-master-reference"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:attribute name="initial-page-number">
+ <xsl:call-template name="initial.page.number">
+ <xsl:with-param name="element" select="'toc'"/>
+ <xsl:with-param name="master-reference"
+ select="$lot-master-reference"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:attribute name="force-page-count">
+ <xsl:call-template name="force.page.count">
+ <xsl:with-param name="master-reference"
+ select="$lot-master-reference"/>
+ </xsl:call-template>
+ </xsl:attribute>
+
+ <xsl:attribute name="hyphenation-character">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'hyphenation-character'"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:attribute name="hyphenation-push-character-count">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'hyphenation-push-character-count'"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:attribute name="hyphenation-remain-character-count">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'hyphenation-remain-character-count'"/>
+ </xsl:call-template>
+ </xsl:attribute>
+
+ <xsl:apply-templates select="$part" mode="running.head.mode">
+ <xsl:with-param name="master-reference" select="$lot-master-reference"/>
+ </xsl:apply-templates>
+
+ <xsl:apply-templates select="$part" mode="running.foot.mode">
+ <xsl:with-param name="master-reference" select="$lot-master-reference"/>
+ </xsl:apply-templates>
+
+ <fo:flow flow-name="xsl-region-body">
+ <xsl:call-template name="set.flow.properties">
+ <xsl:with-param name="element" select="local-name(.)"/>
+ <xsl:with-param name="master-reference"
+ select="$lot-master-reference"/>
+ </xsl:call-template>
+
+ <xsl:call-template name="division.toc">
+ <xsl:with-param name="toc-context" select="$part"/>
+ <xsl:with-param name="toc.title.p"
+ select="contains($toc.params, 'title')"/>
+ </xsl:call-template>
+
+ </fo:flow>
+ </fo:page-sequence>
+ </xsl:if>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="part/partintro">
+ <xsl:apply-templates select=".." mode="part.titlepage.mode">
+ <xsl:with-param name="additional.content">
+ <xsl:if test="title">
+ <xsl:call-template name="partintro.titlepage"/>
+ </xsl:if>
+ <xsl:apply-templates/>
+ </xsl:with-param>
+ </xsl:apply-templates>
+
+ <xsl:call-template name="generate.part.toc">
+ <xsl:with-param name="part" select=".."/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="partintro/title"></xsl:template>
+<xsl:template match="partintro/subtitle"></xsl:template>
+<xsl:template match="partintro/titleabbrev"></xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="book" mode="division.number">
+ <xsl:number from="set" count="book" format="1."/>
+</xsl:template>
+
+<xsl:template match="part" mode="division.number">
+ <xsl:number from="book" count="part" format="I."/>
+</xsl:template>
+
+</xsl:stylesheet>
+
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/docbook.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/docbook.xsl
new file mode 100644
index 0000000..ee0a1eb
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/docbook.xsl
@@ -0,0 +1,335 @@
+<?xml version='1.0'?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:exsl="http://exslt.org/common"
+ xmlns:fo="http://www.w3.org/1999/XSL/Format"
+ xmlns:ng="http://docbook.org/docbook-ng"
+ xmlns:db="http://docbook.org/ns/docbook"
+ exclude-result-prefixes="db ng exsl"
+ version='1.0'>
+
+<!-- It is important to use indent="no" here, otherwise verbatim -->
+<!-- environments get broken by indented tags...at least when the -->
+<!-- callout extension is used...at least with some processors -->
+<xsl:output method="xml" indent="no"/>
+
+<!-- ********************************************************************
+ $Id: docbook.xsl 8913 2010-10-01 04:44:57Z bobstayton $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<!-- ==================================================================== -->
+
+<xsl:include href="../VERSION"/>
+<xsl:include href="param.xsl"/>
+<xsl:include href="../lib/lib.xsl"/>
+<xsl:include href="../common/l10n.xsl"/>
+<xsl:include href="../common/common.xsl"/>
+<xsl:include href="../common/utility.xsl"/>
+<xsl:include href="../common/labels.xsl"/>
+<xsl:include href="../common/titles.xsl"/>
+<xsl:include href="../common/subtitles.xsl"/>
+<xsl:include href="../common/gentext.xsl"/>
+<xsl:include href="../common/olink.xsl"/>
+<xsl:include href="../common/targets.xsl"/>
+<xsl:include href="../common/pi.xsl"/>
+<xsl:include href="autotoc.xsl"/>
+<xsl:include href="autoidx.xsl"/>
+<xsl:include href="lists.xsl"/>
+<xsl:include href="callout.xsl"/>
+<xsl:include href="verbatim.xsl"/>
+<xsl:include href="graphics.xsl"/>
+<xsl:include href="xref.xsl"/>
+<xsl:include href="formal.xsl"/>
+<xsl:include href="table.xsl"/>
+<xsl:include href="htmltbl.xsl"/>
+<xsl:include href="sections.xsl"/>
+<xsl:include href="inline.xsl"/>
+<xsl:include href="footnote.xsl"/>
+<xsl:include href="fo.xsl"/>
+<xsl:include href="fo-rtf.xsl"/>
+<xsl:include href="info.xsl"/>
+<xsl:include href="keywords.xsl"/>
+<xsl:include href="division.xsl"/>
+<xsl:include href="index.xsl"/>
+<xsl:include href="toc.xsl"/>
+<xsl:include href="refentry.xsl"/>
+<xsl:include href="math.xsl"/>
+<xsl:include href="admon.xsl"/>
+<xsl:include href="component.xsl"/>
+<xsl:include href="biblio.xsl"/>
+<xsl:include href="biblio-iso690.xsl"/>
+<xsl:include href="glossary.xsl"/>
+<xsl:include href="block.xsl"/>
+<xsl:include href="task.xsl"/>
+<xsl:include href="qandaset.xsl"/>
+<xsl:include href="synop.xsl"/>
+<xsl:include href="titlepage.xsl"/>
+<xsl:include href="titlepage.templates.xsl"/>
+<xsl:include href="pagesetup.xsl"/>
+<xsl:include href="pi.xsl"/>
+<xsl:include href="spaces.xsl"/>
+<xsl:include href="ebnf.xsl"/>
+<xsl:include href="../html/chunker.xsl"/>
+<xsl:include href="annotations.xsl"/>
+<xsl:include href="../common/stripns.xsl"/>
+
+<xsl:include href="fop.xsl"/>
+<xsl:include href="fop1.xsl"/>
+<xsl:include href="passivetex.xsl"/>
+<xsl:include href="xep.xsl"/>
+<xsl:include href="axf.xsl"/>
+<xsl:include href="ptc.xsl"/>
+
+<xsl:param name="stylesheet.result.type" select="'fo'"/>
+
+<!-- ==================================================================== -->
+
+<xsl:key name="id" match="*" use="@id|@xml:id"/>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="*">
+ <xsl:message>
+ <xsl:text>Element </xsl:text>
+ <xsl:value-of select="local-name(.)"/>
+ <xsl:text> in namespace '</xsl:text>
+ <xsl:value-of select="namespace-uri(.)"/>
+ <xsl:text>' encountered</xsl:text>
+ <xsl:if test="parent::*">
+ <xsl:text> in </xsl:text>
+ <xsl:value-of select="name(parent::*)"/>
+ </xsl:if>
+ <xsl:text>, but no template matches.</xsl:text>
+ </xsl:message>
+
+ <fo:block color="red">
+ <xsl:text>&lt;</xsl:text>
+ <xsl:value-of select="name(.)"/>
+ <xsl:text>&gt;</xsl:text>
+ <xsl:apply-templates/>
+ <xsl:text>&lt;/</xsl:text>
+ <xsl:value-of select="name(.)"/>
+ <xsl:text>&gt;</xsl:text>
+ </fo:block>
+</xsl:template>
+
+<!-- Update this list if new root elements supported -->
+<xsl:variable name="root.elements" select="' appendix article bibliography book chapter colophon dedication glossary index part preface qandaset refentry reference sect1 section set setindex '"/>
+
+<xsl:template match="/">
+ <!-- * Get a title for current doc so that we let the user -->
+ <!-- * know what document we are processing at this point. -->
+ <xsl:variable name="doc.title">
+ <xsl:call-template name="get.doc.title"/>
+ </xsl:variable>
+ <xsl:choose>
+ <!-- Hack! If someone hands us a DocBook V5.x or DocBook NG document,
+ toss the namespace and continue. Use the docbook5 namespaced
+ stylesheets for DocBook5 if you don't want to use this feature.-->
+ <xsl:when test="$exsl.node.set.available != 0
+ and (*/self::ng:* or */self::db:*)">
+ <xsl:call-template name="log.message">
+ <xsl:with-param name="level">Note</xsl:with-param>
+ <xsl:with-param name="source" select="$doc.title"/>
+ <xsl:with-param name="context-desc">
+ <xsl:text>namesp. cut</xsl:text>
+ </xsl:with-param>
+ <xsl:with-param name="message">
+ <xsl:text>stripped namespace before processing</xsl:text>
+ </xsl:with-param>
+ </xsl:call-template>
+ <xsl:variable name="nons">
+ <xsl:apply-templates mode="stripNS"/>
+ </xsl:variable>
+ <xsl:call-template name="log.message">
+ <xsl:with-param name="level">Note</xsl:with-param>
+ <xsl:with-param name="source" select="$doc.title"/>
+ <xsl:with-param name="context-desc">
+ <xsl:text>namesp. cut</xsl:text>
+ </xsl:with-param>
+ <xsl:with-param name="message">
+ <xsl:text>processing stripped document</xsl:text>
+ </xsl:with-param>
+ </xsl:call-template>
+ <xsl:apply-templates select="exsl:node-set($nons)"/>
+ </xsl:when>
+ <!-- Can't process unless namespace removed -->
+ <xsl:when test="*/self::ng:* or */self::db:*">
+ <xsl:message terminate="yes">
+ <xsl:text>Unable to strip the namespace from DB5 document,</xsl:text>
+ <xsl:text> cannot proceed.</xsl:text>
+ </xsl:message>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:choose>
+ <xsl:when test="$rootid != ''">
+ <xsl:variable name="root.element" select="key('id', $rootid)"/>
+ <xsl:choose>
+ <xsl:when test="count($root.element) = 0">
+ <xsl:message terminate="yes">
+ <xsl:text>ID '</xsl:text>
+ <xsl:value-of select="$rootid"/>
+ <xsl:text>' not found in document.</xsl:text>
+ </xsl:message>
+ </xsl:when>
+ <xsl:when test="not(contains($root.elements, concat(' ', local-name($root.element), ' ')))">
+ <xsl:message terminate="yes">
+ <xsl:text>ERROR: Document root element ($rootid=</xsl:text>
+ <xsl:value-of select="$rootid"/>
+ <xsl:text>) for FO output </xsl:text>
+ <xsl:text>must be one of the following elements:</xsl:text>
+ <xsl:value-of select="$root.elements"/>
+ </xsl:message>
+ </xsl:when>
+ <!-- Otherwise proceed -->
+ <xsl:otherwise>
+ <xsl:if test="$collect.xref.targets = 'yes' or
+ $collect.xref.targets = 'only'">
+ <xsl:apply-templates select="$root.element"
+ mode="collect.targets"/>
+ </xsl:if>
+ <xsl:if test="$collect.xref.targets != 'only'">
+ <xsl:apply-templates select="$root.element"
+ mode="process.root"/>
+ </xsl:if>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <!-- Otherwise process the document root element -->
+ <xsl:otherwise>
+ <xsl:variable name="document.element" select="*[1]"/>
+ <xsl:choose>
+ <xsl:when test="not(contains($root.elements,
+ concat(' ', local-name($document.element), ' ')))">
+ <xsl:message terminate="yes">
+ <xsl:text>ERROR: Document root element for FO output </xsl:text>
+ <xsl:text>must be one of the following elements:</xsl:text>
+ <xsl:value-of select="$root.elements"/>
+ </xsl:message>
+ </xsl:when>
+ <!-- Otherwise proceed -->
+ <xsl:otherwise>
+ <xsl:if test="$collect.xref.targets = 'yes' or
+ $collect.xref.targets = 'only'">
+ <xsl:apply-templates select="/"
+ mode="collect.targets"/>
+ </xsl:if>
+ <xsl:if test="$collect.xref.targets != 'only'">
+ <xsl:apply-templates select="/"
+ mode="process.root"/>
+ </xsl:if>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="*" mode="process.root">
+ <xsl:variable name="document.element" select="self::*"/>
+
+ <xsl:call-template name="root.messages"/>
+
+ <xsl:variable name="title">
+ <xsl:choose>
+ <xsl:when test="$document.element/title[1]">
+ <xsl:value-of select="$document.element/title[1]"/>
+ </xsl:when>
+ <xsl:otherwise>[could not find document title]</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <!-- Include all id values in XEP output -->
+ <xsl:if test="$xep.extensions != 0">
+ <xsl:processing-instruction
+ name="xep-pdf-drop-unused-destinations">false</xsl:processing-instruction>
+ </xsl:if>
+
+ <fo:root xsl:use-attribute-sets="root.properties">
+ <xsl:attribute name="language">
+ <xsl:call-template name="l10n.language">
+ <xsl:with-param name="target" select="/*[1]"/>
+ </xsl:call-template>
+ </xsl:attribute>
+
+ <xsl:if test="$xep.extensions != 0">
+ <xsl:call-template name="xep-pis"/>
+ <xsl:call-template name="xep-document-information"/>
+ </xsl:if>
+ <xsl:if test="$axf.extensions != 0">
+ <xsl:call-template name="axf-document-information"/>
+ </xsl:if>
+
+ <xsl:call-template name="setup.pagemasters"/>
+
+ <xsl:if test="$fop.extensions != 0">
+ <xsl:apply-templates select="$document.element" mode="fop.outline"/>
+ </xsl:if>
+
+ <xsl:if test="$fop1.extensions != 0">
+ <xsl:call-template name="fop1-document-information"/>
+ <xsl:variable name="bookmarks">
+ <xsl:apply-templates select="$document.element"
+ mode="fop1.outline"/>
+ </xsl:variable>
+ <xsl:if test="string($bookmarks) != ''">
+ <fo:bookmark-tree>
+ <xsl:copy-of select="$bookmarks"/>
+ </fo:bookmark-tree>
+ </xsl:if>
+ <xsl:apply-templates select="$document.element"
+ mode="fop1.foxdest"/>
+ </xsl:if>
+
+ <xsl:if test="$xep.extensions != 0">
+ <xsl:variable name="bookmarks">
+ <xsl:apply-templates select="$document.element" mode="xep.outline"/>
+ </xsl:variable>
+ <xsl:if test="string($bookmarks) != ''">
+ <rx:outline xmlns:rx="http://www.renderx.com/XSL/Extensions">
+ <xsl:copy-of select="$bookmarks"/>
+ </rx:outline>
+ </xsl:if>
+ </xsl:if>
+
+ <xsl:if test="$arbortext.extensions != 0 and $ati.xsl11.bookmarks != 0">
+ <xsl:variable name="bookmarks">
+ <xsl:apply-templates select="$document.element"
+ mode="ati.xsl11.bookmarks"/>
+ </xsl:variable>
+ <xsl:if test="string($bookmarks) != ''">
+ <fo:bookmark-tree>
+ <xsl:copy-of select="$bookmarks"/>
+ </fo:bookmark-tree>
+ </xsl:if>
+ </xsl:if>
+
+ <xsl:apply-templates select="$document.element"/>
+ </fo:root>
+</xsl:template>
+
+<xsl:template name="root.messages">
+ <!-- redefine this any way you'd like to output messages -->
+ <!-- DO NOT OUTPUT ANYTHING FROM THIS TEMPLATE -->
+ <xsl:message>
+ <xsl:text>Making </xsl:text>
+ <xsl:value-of select="$page.orientation"/>
+ <xsl:text> pages on </xsl:text>
+ <xsl:value-of select="$paper.type"/>
+ <xsl:text> paper (</xsl:text>
+ <xsl:value-of select="$page.width"/>
+ <xsl:text>x</xsl:text>
+ <xsl:value-of select="$page.height"/>
+ <xsl:text>)</xsl:text>
+ </xsl:message>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/ebnf.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/ebnf.xsl
new file mode 100644
index 0000000..09dcb11
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/ebnf.xsl
@@ -0,0 +1,325 @@
+<?xml version='1.0'?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:fo="http://www.w3.org/1999/XSL/Format"
+ xmlns:doc="http://nwalsh.com/xsl/documentation/1.0"
+ exclude-result-prefixes="doc"
+ version='1.0'>
+
+<!-- ********************************************************************
+ $Id: ebnf.xsl 6910 2007-06-28 23:23:30Z xmldoc $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<doc:reference xmlns="">
+<referenceinfo>
+<releaseinfo role="meta">
+$Id: ebnf.xsl 6910 2007-06-28 23:23:30Z xmldoc $
+</releaseinfo>
+<author><surname>Walsh</surname>
+<firstname>Norman</firstname></author>
+<copyright><year>1999</year><year>2000</year><year>2001</year>
+<holder>Norman Walsh</holder>
+</copyright>
+</referenceinfo>
+<title>HTML EBNF Reference</title>
+
+<partintro>
+<section><title>Introduction</title>
+
+<para>This is technical reference documentation for the DocBook XSL
+Stylesheets; it documents (some of) the parameters, templates, and
+other elements of the stylesheets.</para>
+
+<para>This reference describes the templates and parameters relevant
+to formatting EBNF markup.</para>
+
+<para>This is not intended to be <quote>user</quote> documentation.
+It is provided for developers writing customization layers for the
+stylesheets, and for anyone who's interested in <quote>how it
+works</quote>.</para>
+
+<para>Although I am trying to be thorough, this documentation is known
+to be incomplete. Don't forget to read the source, too :-)</para>
+</section>
+</partintro>
+</doc:reference>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="productionset">
+ <xsl:variable name="id"><xsl:call-template name="object.id"/></xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="title">
+ <fo:block id="{$id}" xsl:use-attribute-sets="formal.object.properties">
+ <xsl:call-template name="formal.object.heading">
+ <xsl:with-param name="placement" select="'before'"/>
+ </xsl:call-template>
+
+ <fo:table table-layout="fixed" width="100%">
+ <fo:table-column column-number="1" column-width="3%"/>
+ <fo:table-column column-number="2" column-width="15%"/>
+ <fo:table-column column-number="3" column-width="5%"/>
+ <fo:table-column column-number="4" column-width="52%"/>
+ <fo:table-column column-number="5" column-width="25%"/>
+ <fo:table-body start-indent="0pt" end-indent="0pt">
+ <xsl:apply-templates select="production|productionrecap"/>
+ </fo:table-body>
+ </fo:table>
+ </fo:block>
+ </xsl:when>
+ <xsl:otherwise>
+ <fo:table id="{$id}" table-layout="fixed" width="100%">
+ <fo:table-column column-number="1" column-width="3%"/>
+ <fo:table-column column-number="2" column-width="15%"/>
+ <fo:table-column column-number="3" column-width="5%"/>
+ <fo:table-column column-number="4" column-width="52%"/>
+ <fo:table-column column-number="5" column-width="25%"/>
+ <fo:table-body start-indent="0pt" end-indent="0pt">
+ <xsl:apply-templates select="production|productionrecap"/>
+ </fo:table-body>
+ </fo:table>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="productionset/title">
+ <!-- suppressed -->
+</xsl:template>
+
+<xsl:template match="production">
+ <xsl:param name="recap" select="false()"/>
+ <xsl:variable name="id"><xsl:call-template name="object.id"/></xsl:variable>
+ <fo:table-row>
+ <fo:table-cell>
+ <fo:block text-align="start">
+ <xsl:text>[</xsl:text>
+ <xsl:number count="production" level="any"/>
+ <xsl:text>]</xsl:text>
+ </fo:block>
+ </fo:table-cell>
+ <fo:table-cell>
+ <fo:block text-align="end">
+ <xsl:choose>
+ <xsl:when test="$recap">
+ <fo:basic-link internal-destination="{$id}"
+ xsl:use-attribute-sets="xref.properties">
+ <xsl:apply-templates select="lhs"/>
+ </fo:basic-link>
+ </xsl:when>
+ <xsl:otherwise>
+ <fo:wrapper id="{$id}">
+ <xsl:apply-templates select="lhs"/>
+ </fo:wrapper>
+ </xsl:otherwise>
+ </xsl:choose>
+ </fo:block>
+ </fo:table-cell>
+ <fo:table-cell>
+ <fo:block text-align="center">
+ <xsl:copy-of select="$ebnf.assignment"/>
+ </fo:block>
+ </fo:table-cell>
+ <fo:table-cell>
+ <fo:block>
+ <xsl:apply-templates select="rhs"/>
+ <xsl:copy-of select="$ebnf.statement.terminator"/>
+ </fo:block>
+ </fo:table-cell>
+ <fo:table-cell border-start-width="3pt">
+ <fo:block text-align="start">
+ <xsl:choose>
+ <xsl:when test="rhs/lineannotation|constraint">
+ <xsl:apply-templates select="rhs/lineannotation" mode="rhslo"/>
+ <xsl:apply-templates select="constraint"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text>&#160;</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ </fo:block>
+ </fo:table-cell>
+ </fo:table-row>
+</xsl:template>
+
+<xsl:template match="productionrecap">
+ <xsl:variable name="targets" select="key('id',@linkend)"/>
+ <xsl:variable name="target" select="$targets[1]"/>
+
+ <xsl:if test="count($targets)=0">
+ <xsl:message>
+ <xsl:text>Error: no ID for productionrecap linkend: </xsl:text>
+ <xsl:value-of select="@linkend"/>
+ <xsl:text>.</xsl:text>
+ </xsl:message>
+ </xsl:if>
+
+ <xsl:if test="count($targets)>1">
+ <xsl:message>
+ <xsl:text>Warning: multiple "IDs" for productionrecap linkend: </xsl:text>
+ <xsl:value-of select="@linkend"/>
+ <xsl:text>.</xsl:text>
+ </xsl:message>
+ </xsl:if>
+
+ <xsl:apply-templates select="$target">
+ <xsl:with-param name="recap" select="true()"/>
+ </xsl:apply-templates>
+</xsl:template>
+
+<xsl:template match="lhs">
+ <xsl:apply-templates/>
+</xsl:template>
+
+<xsl:template match="rhs">
+ <xsl:apply-templates/>
+</xsl:template>
+
+<xsl:template match="nonterminal">
+ <xsl:variable name="linkend">
+ <xsl:call-template name="xpointer.idref">
+ <xsl:with-param name="xpointer" select="@def"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:call-template name="check.id.unique">
+ <xsl:with-param name="linkend" select="$linkend"/>
+ </xsl:call-template>
+
+ <xsl:call-template name="check.idref.targets">
+ <xsl:with-param name="linkend" select="$linkend"/>
+ <xsl:with-param name="element-list">production</xsl:with-param>
+ </xsl:call-template>
+
+ <!-- If you don't provide content, you can't point outside this doc. -->
+ <xsl:choose>
+ <xsl:when test="*|text()"><!--nop--></xsl:when>
+ <xsl:otherwise>
+ <xsl:if test="$linkend = ''">
+ <xsl:message>
+ <xsl:text>Non-terminals with no content must point to </xsl:text>
+ <xsl:text>production elements in the current document.</xsl:text>
+ </xsl:message>
+ <xsl:message>
+ <xsl:text>Invalid xpointer for empty nt: </xsl:text>
+ <xsl:value-of select="@def"/>
+ </xsl:message>
+ </xsl:if>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:variable name="href">
+ <xsl:choose>
+ <xsl:when test="$linkend != ''">
+ <xsl:variable name="targets" select="key('id',$linkend)"/>
+ <xsl:variable name="target" select="$targets[1]"/>
+ <xsl:call-template name="object.id">
+ <xsl:with-param name="object" select="$target"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="@def"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <fo:basic-link internal-destination="{$href}"
+ xsl:use-attribute-sets="xref.properties">
+ <xsl:choose>
+ <xsl:when test="*|text()">
+ <xsl:apply-templates/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:choose>
+ <xsl:when test="$linkend != ''">
+ <xsl:variable name="targets" select="key('id',$linkend)"/>
+ <xsl:variable name="target" select="$targets[1]"/>
+ <xsl:apply-templates select="$target/lhs"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text>???</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+ </fo:basic-link>
+</xsl:template>
+
+<xsl:template match="rhs/lineannotation">
+ <!--nop-->
+</xsl:template>
+
+<xsl:template match="rhs/lineannotation" mode="rhslo">
+ <xsl:text>/*&#160;</xsl:text>
+ <xsl:apply-templates/>
+ <xsl:text>&#160;*/</xsl:text>
+</xsl:template>
+
+<xsl:template match="constraint">
+ <xsl:call-template name="check.id.unique">
+ <xsl:with-param name="linkend" select="@linkend"/>
+ </xsl:call-template>
+
+ <xsl:call-template name="check.idref.targets">
+ <xsl:with-param name="linkend" select="@linkend"/>
+ <xsl:with-param name="element-list">constraintdef</xsl:with-param>
+ </xsl:call-template>
+
+ <xsl:variable name="href">
+ <xsl:variable name="targets" select="key('id',@linkend)"/>
+ <xsl:variable name="target" select="$targets[1]"/>
+ <xsl:call-template name="object.id">
+ <xsl:with-param name="object" select="$target"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:if test="preceding-sibling::constraint">
+ <fo:inline linefeed-treatment="preserve">&#xA;</fo:inline>
+ </xsl:if>
+ <xsl:text>[&#160;</xsl:text>
+
+ <xsl:choose>
+ <xsl:when test="@role">
+ <xsl:value-of select="@role"/>
+ <xsl:text>: </xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:variable name="targets" select="key('id',@linkend)"/>
+ <xsl:variable name="target" select="$targets[1]"/>
+ <xsl:if test="$target/@role">
+ <xsl:value-of select="$target/@role"/>
+ <xsl:text>: </xsl:text>
+ </xsl:if>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <fo:basic-link internal-destination="{$href}"
+ xsl:use-attribute-sets="xref.properties">
+ <xsl:variable name="targets" select="key('id',@linkend)"/>
+ <xsl:variable name="target" select="$targets[1]"/>
+ <xsl:apply-templates select="$target" mode="title.markup"/>
+ </fo:basic-link>
+ <xsl:text>&#160;]</xsl:text>
+</xsl:template>
+
+<xsl:template match="constraintdef">
+ <xsl:variable name="id"><xsl:call-template name="object.id"/></xsl:variable>
+ <fo:block id="{$id}">
+ <xsl:apply-templates/>
+ </fo:block>
+</xsl:template>
+
+<xsl:template match="constraintdef/title">
+ <fo:block font-weight="bold">
+ <xsl:apply-templates/>
+ </fo:block>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/fo-rtf.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/fo-rtf.xsl
new file mode 100644
index 0000000..4aa0f32
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/fo-rtf.xsl
@@ -0,0 +1,154 @@
+<?xml version="1.0"?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:fo="http://www.w3.org/1999/XSL/Format"
+ xmlns:exsl="http://exslt.org/common"
+ xmlns:set="http://exslt.org/sets"
+ exclude-result-prefixes="exsl set"
+ version="1.0">
+
+<!-- ********************************************************************
+ $Id: fo-rtf.xsl 6910 2007-06-28 23:23:30Z xmldoc $
+ ********************************************************************
+
+ This file is part of the DocBook XSL Stylesheet distribution.
+ See ../README or http://docbook.sf.net/ for copyright
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<!-- This module contains templates that match against FO nodes. It is used
+ to post-process result tree fragments for some sorts of cleanup.
+ These templates can only ever be fired by a processor that supports
+ exslt:node-set(). -->
+
+<!-- ==================================================================== -->
+
+<!-- insert.fo.fnum mode templates insert a particular RTF at the beginning
+ of the first paragraph in the primary RTF. In fact, they are inserting
+ a footnote-number, so we tinker a few other things too, like spacing and
+ font-sizes. -->
+
+<xsl:template match="/" mode="insert.fo.fnum">
+ <xsl:param name="mark" select="'?'"/>
+ <xsl:apply-templates mode="insert.fo.fnum">
+ <xsl:with-param name="mark" select="$mark"/>
+ </xsl:apply-templates>
+</xsl:template>
+
+<xsl:template match="*" mode="insert.fo.fnum">
+ <xsl:param name="mark" select="'?'"/>
+ <xsl:copy>
+ <xsl:copy-of select="@*"/>
+ <xsl:apply-templates mode="insert.fo.fnum">
+ <xsl:with-param name="mark" select="$mark"/>
+ </xsl:apply-templates>
+ </xsl:copy>
+</xsl:template>
+
+<xsl:template match="fo:block" mode="insert.fo.fnum">
+ <xsl:param name="mark" select="'?'"/>
+ <xsl:copy>
+ <xsl:for-each select="@*">
+ <xsl:choose>
+ <xsl:when test="starts-with(name(.), 'space-before')"/>
+ <xsl:when test="starts-with(name(.), 'space-after')"/>
+ <xsl:when test="starts-with(name(.), 'font-size')"/>
+ <xsl:otherwise>
+ <xsl:copy-of select="."/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:for-each>
+ <xsl:if test="not(preceding::fo:block)">
+ <xsl:copy-of select="$mark"/>
+ </xsl:if>
+ <xsl:apply-templates mode="insert.fo.fnum">
+ <xsl:with-param name="mark" select="$mark"/>
+ </xsl:apply-templates>
+ </xsl:copy>
+</xsl:template>
+
+<xsl:template match="text()|processing-instruction()|comment()" mode="insert.fo.fnum">
+ <xsl:param name="mark" select="'?'"/>
+ <xsl:copy/>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<!-- insert.fo.block mode templates insert a particular RTF at the beginning
+ of the first paragraph in the primary RTF. -->
+
+<xsl:template match="/" mode="insert.fo.block">
+ <xsl:param name="mark" select="'?'"/>
+ <xsl:apply-templates mode="insert.fo.block">
+ <xsl:with-param name="mark" select="$mark"/>
+ </xsl:apply-templates>
+</xsl:template>
+
+<xsl:template match="*" mode="insert.fo.block">
+ <xsl:param name="mark" select="'?'"/>
+ <xsl:copy>
+ <xsl:copy-of select="@*"/>
+ <xsl:apply-templates mode="insert.fo.block">
+ <xsl:with-param name="mark" select="$mark"/>
+ </xsl:apply-templates>
+ </xsl:copy>
+</xsl:template>
+
+<xsl:template match="fo:block" mode="insert.fo.block">
+ <xsl:param name="mark" select="'?'"/>
+ <xsl:copy>
+ <xsl:copy-of select="@*"/>
+ <xsl:if test="not(preceding::fo:block)">
+ <xsl:copy-of select="$mark"/>
+ </xsl:if>
+ <xsl:apply-templates mode="insert.fo.block">
+ <xsl:with-param name="mark" select="$mark"/>
+ </xsl:apply-templates>
+ </xsl:copy>
+</xsl:template>
+
+<xsl:template match="text()|processing-instruction()|comment()" mode="insert.fo.block">
+ <xsl:param name="mark" select="'?'"/>
+ <xsl:copy/>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<!-- insert.fo.text mode templates insert a particular RTF at the beginning
+ of the first text-node in the primary RTF. -->
+
+<xsl:template match="/" mode="insert.fo.text">
+ <xsl:param name="mark" select="'?'"/>
+ <xsl:apply-templates mode="insert.fo.text">
+ <xsl:with-param name="mark" select="$mark"/>
+ </xsl:apply-templates>
+</xsl:template>
+
+<xsl:template match="*" mode="insert.fo.text">
+ <xsl:param name="mark" select="'?'"/>
+ <xsl:copy>
+ <xsl:copy-of select="@*"/>
+ <xsl:apply-templates mode="insert.fo.text">
+ <xsl:with-param name="mark" select="$mark"/>
+ </xsl:apply-templates>
+ </xsl:copy>
+</xsl:template>
+
+<xsl:template match="text()|processing-instruction()|comment()" mode="insert.fo.text">
+ <xsl:param name="mark" select="'?'"/>
+
+ <xsl:if test="not(preceding::text())">
+ <xsl:copy-of select="$mark"/>
+ </xsl:if>
+
+ <xsl:copy/>
+</xsl:template>
+
+<xsl:template match="processing-instruction()|comment()" mode="insert.fo.text">
+ <xsl:param name="mark" select="'?'"/>
+ <xsl:copy/>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/fo.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/fo.xsl
new file mode 100644
index 0000000..854098f
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/fo.xsl
@@ -0,0 +1,117 @@
+<?xml version='1.0'?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:fo="http://www.w3.org/1999/XSL/Format"
+ version='1.0'>
+
+<!-- ********************************************************************
+ $Id: fo.xsl 8287 2009-03-06 23:53:33Z bobstayton $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<!-- These variables set the margin-left or -right attribute value for FO output based on
+ the writing-mode specified in the gentext file for the document's lang. -->
+
+<xsl:param name="direction.align.start">
+ <xsl:choose>
+ <!-- FOP does not support writing-mode="rl-tb" -->
+ <xsl:when test="$fop.extensions != 0">left</xsl:when>
+ <xsl:when test="$fop1.extensions != 0">left</xsl:when>
+ <xsl:when test="starts-with($writing.mode, 'lr')">left</xsl:when>
+ <xsl:when test="starts-with($writing.mode, 'rl')">right</xsl:when>
+ <xsl:when test="starts-with($writing.mode, 'tb')">top</xsl:when>
+ <xsl:otherwise>left</xsl:otherwise>
+ </xsl:choose>
+</xsl:param>
+
+<xsl:param name="direction.align.end">
+ <xsl:choose>
+ <xsl:when test="$fop.extensions != 0">right</xsl:when>
+ <xsl:when test="$fop1.extensions != 0">right</xsl:when>
+ <xsl:when test="starts-with($writing.mode, 'lr')">right</xsl:when>
+ <xsl:when test="starts-with($writing.mode, 'rl')">left</xsl:when>
+ <xsl:when test="starts-with($writing.mode, 'tb')">bottom</xsl:when>
+ <xsl:otherwise>right</xsl:otherwise>
+ </xsl:choose>
+</xsl:param>
+
+<xsl:param name="direction.mode">
+ <xsl:choose>
+ <xsl:when test="$fop.extensions != 0 and
+ starts-with($writing.mode, 'rl')">
+ <xsl:message>WARNING: FOP does not support right-to-left writing-mode</xsl:message>
+ <xsl:text>lr-tb</xsl:text>
+ </xsl:when>
+ <xsl:when test="$fop1.extensions != 0 and
+ starts-with($writing.mode, 'rl')">
+ <xsl:message>WARNING: FOP does not support right-to-left writing-mode</xsl:message>
+ <xsl:text>lr-tb</xsl:text>
+ </xsl:when>
+ <xsl:when test="starts-with($writing.mode, 'lr')">lr-tb</xsl:when>
+ <xsl:when test="starts-with($writing.mode, 'rl')">rl-tb</xsl:when>
+ <xsl:when test="starts-with($writing.mode, 'tb')">tb-rl</xsl:when>
+ <xsl:otherwise>lr-tb</xsl:otherwise>
+ </xsl:choose>
+</xsl:param>
+
+
+<xsl:template name="anchor">
+ <xsl:param name="node" select="."/>
+ <xsl:param name="conditional" select="1"/>
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id">
+ <xsl:with-param name="object" select="$node"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:if test="$conditional = 0 or $node/@id or $node/@xml:id">
+ <xsl:attribute name="id"><xsl:value-of select="$id"/></xsl:attribute>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template name="dingbat">
+ <xsl:param name="dingbat">bullet</xsl:param>
+ <xsl:variable name="symbol">
+ <xsl:choose>
+ <xsl:when test="$dingbat='bullet'">o</xsl:when>
+ <xsl:when test="$dingbat='copyright'">&#x00A9;</xsl:when>
+ <xsl:when test="$dingbat='trademark'">&#x2122;</xsl:when>
+ <xsl:when test="$dingbat='trade'">&#x2122;</xsl:when>
+ <xsl:when test="$dingbat='registered'">&#x00AE;</xsl:when>
+ <xsl:when test="$dingbat='service'">(SM)</xsl:when>
+ <xsl:when test="$dingbat='ldquo'">"</xsl:when>
+ <xsl:when test="$dingbat='rdquo'">"</xsl:when>
+ <xsl:when test="$dingbat='lsquo'">'</xsl:when>
+ <xsl:when test="$dingbat='rsquo'">'</xsl:when>
+ <xsl:when test="$dingbat='em-dash'">&#x2014;</xsl:when>
+ <xsl:when test="$dingbat='en-dash'">-</xsl:when>
+ <xsl:otherwise>o</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="$dingbat.font.family = ''">
+ <xsl:copy-of select="$symbol"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <fo:inline font-family="{$dingbat.font.family}">
+ <xsl:copy-of select="$symbol"/>
+ </fo:inline>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="href.target">
+ <xsl:param name="context" select="."/>
+ <xsl:param name="object" select="."/>
+ <xsl:text>#</xsl:text>
+ <xsl:call-template name="object.id">
+ <xsl:with-param name="object" select="$object"/>
+ </xsl:call-template>
+</xsl:template>
+
+</xsl:stylesheet>
+
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/footnote.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/footnote.xsl
new file mode 100644
index 0000000..cc0242d
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/footnote.xsl
@@ -0,0 +1,220 @@
+<?xml version='1.0'?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:fo="http://www.w3.org/1999/XSL/Format"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:exsl="http://exslt.org/common"
+ exclude-result-prefixes="exsl xlink"
+ version='1.0'>
+
+<!-- ********************************************************************
+ $Id: footnote.xsl 8359 2009-03-20 18:42:06Z bobstayton $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<xsl:template name="format.footnote.mark">
+ <xsl:param name="mark" select="'?'"/>
+ <fo:inline xsl:use-attribute-sets="footnote.mark.properties">
+ <xsl:choose>
+ <xsl:when test="$fop.extensions != 0">
+ <xsl:attribute name="vertical-align">super</xsl:attribute>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:attribute name="baseline-shift">super</xsl:attribute>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:copy-of select="$mark"/>
+ </fo:inline>
+</xsl:template>
+
+<xsl:template match="footnote">
+ <xsl:choose>
+ <xsl:when test="ancestor::table or ancestor::informaltable">
+ <xsl:call-template name="format.footnote.mark">
+ <xsl:with-param name="mark">
+ <xsl:apply-templates select="." mode="footnote.number"/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <fo:footnote>
+ <fo:inline>
+ <xsl:call-template name="format.footnote.mark">
+ <xsl:with-param name="mark">
+ <xsl:apply-templates select="." mode="footnote.number"/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </fo:inline>
+ <fo:footnote-body xsl:use-attribute-sets="footnote.properties">
+ <xsl:apply-templates/>
+ </fo:footnote-body>
+ </fo:footnote>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="footnoteref">
+ <xsl:variable name="footnote" select="key('id',@linkend)"/>
+
+ <xsl:if test="not(local-name($footnote) = 'footnote')">
+ <xsl:message terminate="yes">
+ERROR: A footnoteref element has a linkend that points to an element that is not a footnote.
+Typically this happens when an id attribute is accidentally applied to the child of a footnote element.
+target element: <xsl:value-of select="local-name($footnote)"/>
+linkend/id: <xsl:value-of select="@linkend"/>
+ </xsl:message>
+ </xsl:if>
+
+ <xsl:call-template name="format.footnote.mark">
+ <xsl:with-param name="mark">
+ <xsl:apply-templates select="$footnote" mode="footnote.number"/>
+ </xsl:with-param>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="footnote" mode="footnote.number">
+ <xsl:choose>
+ <xsl:when test="string-length(@label) != 0">
+ <xsl:value-of select="@label"/>
+ </xsl:when>
+ <xsl:when test="ancestor::table or ancestor::informaltable">
+ <xsl:variable name="tfnum">
+ <xsl:number level="any" from="table|informaltable" format="1"/>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="string-length($table.footnote.number.symbols) &gt;= $tfnum">
+ <xsl:value-of select="substring($table.footnote.number.symbols, $tfnum, 1)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:number level="any" from="table|informaltable"
+ format="{$table.footnote.number.format}"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:variable name="fnum">
+ <!-- * Determine the footnote number to display for this footnote, -->
+ <!-- * by counting all foonotes, ulinks, and any elements that have -->
+ <!-- * an xlink:href attribute that meets the following criteria: -->
+ <!-- * -->
+ <!-- * - the content of the element is not a URI that is the same -->
+ <!-- * URI as the value of the href attribute -->
+ <!-- * - the href attribute is not an internal ID reference (does -->
+ <!-- * not start with a hash sign) -->
+ <!-- * - the href is not part of an olink reference (the element -->
+ <!-- * - does not have an xlink:role attribute that indicates it is -->
+ <!-- * an olink, and the hrf does not contain a hash sign) -->
+ <!-- * - the element either has no xlink:type attribute or has -->
+ <!-- * an xlink:type attribute whose value is 'simple' -->
+ <!-- * -->
+ <!-- * Note that hyperlinks are counted only if both the value of -->
+ <!-- * ulink.footnotes is non-zero and the value of ulink.show is -->
+ <!-- * non-zero -->
+ <!-- FIXME: list in @from is probably not complete -->
+ <xsl:number level="any"
+ from="chapter|appendix|preface|article|refentry|bibliography"
+ count="footnote[not(@label)][not(ancestor::table) and not(ancestor::informaltable)]
+ |ulink[$ulink.footnotes != 0][node()][@url != .][not(ancestor::footnote)][$ulink.show != 0]
+ |*[node()][@xlink:href][not(@xlink:href = .)][not(starts-with(@xlink:href,'#'))]
+ [not(contains(@xlink:href,'#') and @xlink:role = $xolink.role)]
+ [not(@xlink:type) or @xlink:type='simple']
+ [not(ancestor::footnote)][$ulink.footnotes != 0][$ulink.show != 0]
+ "
+ format="1"/>
+ </xsl:variable>
+ <xsl:choose>
+ <xsl:when test="string-length($footnote.number.symbols) &gt;= $fnum">
+ <xsl:value-of select="substring($footnote.number.symbols, $fnum, 1)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:number value="$fnum" format="{$footnote.number.format}"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="*" mode="footnote.body.number">
+ <xsl:variable name="footnote.mark">
+ <xsl:call-template name="format.footnote.mark">
+ <xsl:with-param name="mark">
+ <xsl:apply-templates select="ancestor::footnote" mode="footnote.number"/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="fo">
+ <xsl:apply-templates select="."/>
+ </xsl:variable>
+
+ <xsl:variable name="fo-nodes" select="exsl:node-set($fo)"/>
+
+ <xsl:choose>
+ <xsl:when test="$fo-nodes//fo:block">
+ <xsl:apply-templates select="$fo-nodes" mode="insert.fo.fnum">
+ <xsl:with-param name="mark" select="$footnote.mark"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="$fo-nodes" mode="insert.fo.text">
+ <xsl:with-param name="mark" select="$footnote.mark"/>
+ </xsl:apply-templates>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="footnote/para[1]
+ |footnote/simpara[1]
+ |footnote/formalpara[1]"
+ priority="2">
+ <!-- this only works if the first thing in a footnote is a para, -->
+ <!-- which is ok, because it usually is. -->
+ <fo:block>
+ <xsl:call-template name="format.footnote.mark">
+ <xsl:with-param name="mark">
+ <xsl:apply-templates select="ancestor::footnote" mode="footnote.number"/>
+ </xsl:with-param>
+ </xsl:call-template>
+ <xsl:apply-templates/>
+ </fo:block>
+</xsl:template>
+
+<xsl:template match="footnote" mode="table.footnote.mode">
+ <xsl:choose>
+ <xsl:when test="local-name(*[1]) = 'para' or local-name(*[1]) = 'simpara'">
+ <fo:block xsl:use-attribute-sets="table.footnote.properties">
+ <xsl:apply-templates/>
+ </fo:block>
+ </xsl:when>
+
+ <xsl:when test="$exsl.node.set.available != 0">
+ <fo:block xsl:use-attribute-sets="table.footnote.properties">
+ <xsl:apply-templates select="*[1]" mode="footnote.body.number"/>
+ <xsl:apply-templates select="*[position() &gt; 1]"/>
+ </fo:block>
+ </xsl:when>
+
+ <xsl:otherwise>
+ <xsl:message>
+ <xsl:text>Warning: footnote number may not be generated </xsl:text>
+ <xsl:text>correctly; </xsl:text>
+ <xsl:value-of select="local-name(*[1])"/>
+ <xsl:text> unexpected as first child of footnote.</xsl:text>
+ </xsl:message>
+ <fo:block xsl:use-attribute-sets="table.footnote.properties">
+ <xsl:apply-templates/>
+ </fo:block>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/fop.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/fop.xsl
new file mode 100644
index 0000000..c82a48d
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/fop.xsl
@@ -0,0 +1,93 @@
+<?xml version='1.0' encoding="utf-8"?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:fo="http://www.w3.org/1999/XSL/Format"
+ xmlns:fox="http://xml.apache.org/fop/extensions"
+ version='1.0'>
+
+<!-- ********************************************************************
+ $Id: fop.xsl 7531 2007-10-17 18:06:49Z dcramer $
+ ********************************************************************
+ (c) Stephane Bline Peregrine Systems 2001
+ Driver file to allow pdf bookmarking (based on fop implementation).
+ ******************************************************************** -->
+<!--
+In PDF bookmarks can't be used characters with code>255. This version of file
+translates characters with code>255 back to ASCII.
+
+ Pavel Zampach (zampach@volny.cz)
+-->
+
+<xsl:variable name="a-dia" select=
+"'&#257;&#259;&#261;&#263;&#265;&#267;&#269;&#271;&#273;&#275;&#277;&#279;&#281;&#283;&#339;&#285;&#287;&#289;&#291;&#293;&#295;&#297;&#299;&#301;&#303;&#305;&#309;&#311;&#314;&#316;&#318;&#320;&#322;&#324;&#326;&#328;&#331;&#333;&#335;&#337;&#341;&#343;&#345;&#347;&#349;&#351;&#353;&#355;&#357;&#359;&#361;&#363;&#365;&#367;&#369;&#371;&#373;&#375;&#378;&#380;&#382;&#256;&#258;&#260;&#262;&#264;&#266;&#268;&#270;&#272;&#274;&#276;&#278;&#280;&#282;&#338;&#284;&#286;&#288;&#290;&#292;&#294;&#296;&#298;&#300;&#302;&#304;&#308;&#310;&#313;&#315;&#317;&#319;&#321;&#323;&#325;&#327;&#330;&#332;&#334;&#336;&#340;&#342;&#344;&#346;&#348;&#350;&#352;&#354;&#356;&#358;&#360;&#362;&#364;&#366;&#368;&#370;&#372;&#374;&#376;&#377;&#379;&#381;'"/>
+<xsl:variable name="a-asc" select=
+"'aaaccccddeeeeeegggghhiiiiijklllllnnnnooorrrsssstttuuuuuuwyzzzAAACCCCDDEEEEEEGGGGHHIIIIIJKLLLLLNNNNOOORRRSSSSTTTUUUUUUWYYZZZ'"/>
+
+<xsl:template match="*" mode="fop.outline">
+ <xsl:variable name="id">
+ <xsl:value-of select="(@id|@xml:id)[1]"/>
+ </xsl:variable>
+ <xsl:if test="$id != ''">
+ <fox:destination internal-destination="{$id}"/>
+ </xsl:if>
+ <xsl:apply-templates select="*" mode="fop.outline"/>
+</xsl:template>
+
+<xsl:template match="set|book|part|reference|preface|chapter|appendix|article
+ |glossary|bibliography|index|setindex
+ |refentry
+ |sect1|sect2|sect3|sect4|sect5|section"
+ mode="fop.outline">
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+ <xsl:variable name="bookmark-label">
+ <xsl:apply-templates select="." mode="object.title.markup"/>
+ </xsl:variable>
+
+ <!-- Put the root element bookmark at the same level as its children -->
+ <!-- If the object is a set or book, generate a bookmark for the toc -->
+
+ <xsl:choose>
+ <xsl:when test="self::index and $generate.index = 0"/>
+ <xsl:when test="parent::*">
+ <fox:outline internal-destination="{$id}">
+ <fox:label>
+ <xsl:value-of select="normalize-space(translate($bookmark-label, $a-dia, $a-asc))"/>
+ </fox:label>
+ <xsl:apply-templates select="*" mode="fop.outline"/>
+ </fox:outline>
+ </xsl:when>
+ <xsl:otherwise>
+ <fox:outline internal-destination="{$id}">
+ <fox:label>
+ <xsl:value-of select="normalize-space(translate($bookmark-label, $a-dia, $a-asc))"/>
+ </fox:label>
+ </fox:outline>
+
+ <xsl:variable name="toc.params">
+ <xsl:call-template name="find.path.params">
+ <xsl:with-param name="table" select="normalize-space($generate.toc)"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:if test="contains($toc.params, 'toc')
+ and (book|part|reference|preface|chapter|appendix|article
+ |glossary|bibliography|index|setindex
+ |refentry
+ |sect1|sect2|sect3|sect4|sect5|section)">
+ <fox:outline internal-destination="toc...{$id}">
+ <fox:label>
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'TableofContents'"/>
+ </xsl:call-template>
+ </fox:label>
+ </fox:outline>
+ </xsl:if>
+ <xsl:apply-templates select="*" mode="fop.outline"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ <fox:destination internal-destination="{$id}"/>
+</xsl:template>
+
+</xsl:stylesheet>
+
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/fop1.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/fop1.xsl
new file mode 100644
index 0000000..61cb89e
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/fop1.xsl
@@ -0,0 +1,223 @@
+<?xml version='1.0'?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:fox="http://xmlgraphics.apache.org/fop/extensions"
+ xmlns:fo="http://www.w3.org/1999/XSL/Format"
+ version='1.0'>
+
+<!-- ********************************************************************
+ $Id: fop1.xsl 8913 2010-10-01 04:44:57Z bobstayton $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<!-- ==================================================================== -->
+
+<xsl:variable name="bookmarks.state">
+ <xsl:choose>
+ <xsl:when test="$bookmarks.collapse != 0">hide</xsl:when>
+ <xsl:otherwise>show</xsl:otherwise>
+ </xsl:choose>
+</xsl:variable>
+
+<xsl:template match="*" mode="fop1.outline">
+ <xsl:apply-templates select="*" mode="fop1.outline"/>
+</xsl:template>
+
+<xsl:template match="set|book|part|reference|
+ preface|chapter|appendix|article
+ |glossary|bibliography|index|setindex
+ |refentry
+ |sect1|sect2|sect3|sect4|sect5|section"
+ mode="fop1.outline">
+
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+ <xsl:variable name="bookmark-label">
+ <xsl:apply-templates select="." mode="object.title.markup"/>
+ </xsl:variable>
+
+ <!-- Put the root element bookmark at the same level as its children -->
+ <!-- If the object is a set or book, generate a bookmark for the toc -->
+
+ <xsl:choose>
+ <xsl:when test="self::index and $generate.index = 0"/>
+ <xsl:when test="parent::*">
+ <fo:bookmark internal-destination="{$id}">
+ <xsl:attribute name="starting-state">
+ <xsl:value-of select="$bookmarks.state"/>
+ </xsl:attribute>
+ <fo:bookmark-title>
+ <xsl:value-of select="normalize-space(translate($bookmark-label, $a-dia, $a-asc))"/>
+ </fo:bookmark-title>
+ <xsl:apply-templates select="*" mode="fop1.outline"/>
+ </fo:bookmark>
+ </xsl:when>
+ <xsl:otherwise>
+ <fo:bookmark internal-destination="{$id}">
+ <xsl:attribute name="starting-state">
+ <xsl:value-of select="$bookmarks.state"/>
+ </xsl:attribute>
+ <fo:bookmark-title>
+ <xsl:value-of select="normalize-space(translate($bookmark-label, $a-dia, $a-asc))"/>
+ </fo:bookmark-title>
+ </fo:bookmark>
+
+ <xsl:variable name="toc.params">
+ <xsl:call-template name="find.path.params">
+ <xsl:with-param name="table" select="normalize-space($generate.toc)"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:if test="contains($toc.params, 'toc')
+ and (book|part|reference|preface|chapter|appendix|article
+ |glossary|bibliography|index|setindex
+ |refentry
+ |sect1|sect2|sect3|sect4|sect5|section)">
+ <fo:bookmark internal-destination="toc...{$id}">
+ <fo:bookmark-title>
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'TableofContents'"/>
+ </xsl:call-template>
+ </fo:bookmark-title>
+ </fo:bookmark>
+ </xsl:if>
+ <xsl:apply-templates select="*" mode="fop1.outline"/>
+ </xsl:otherwise>
+ </xsl:choose>
+<!--
+ <fo:bookmark internal-destination="{$id}"/>
+-->
+</xsl:template>
+
+<xsl:template match="*" mode="fop1.foxdest">
+ <xsl:apply-templates select="*" mode="fop1.foxdest"/>
+</xsl:template>
+
+<xsl:template match="set|book|part|reference|
+ preface|chapter|appendix|article
+ |glossary|bibliography|index|setindex
+ |refentry
+ |sect1|sect2|sect3|sect4|sect5|section"
+ mode="fop1.foxdest">
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+ <xsl:variable name="bookmark-label">
+ <xsl:apply-templates select="." mode="object.title.markup"/>
+ </xsl:variable>
+ <!--xsl:if test="$id != ''">
+ <fox:destination internal-destination="{$id}"/>
+ </xsl:if-->
+
+ <!-- Put the root element bookmark at the same level as its children -->
+ <!-- If the object is a set or book, generate a bookmark for the toc -->
+
+ <xsl:choose>
+ <xsl:when test="self::index and $generate.index = 0"/>
+ <xsl:when test="parent::*">
+ <fox:destination internal-destination="{$id}"/>
+ <xsl:apply-templates select="*" mode="fop1.foxdest"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <fox:destination internal-destination="{$id}"/>
+ <xsl:apply-templates select="*" mode="fop1.foxdest"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+<!-- Metadata support ("Document Properties" in Adobe Reader) -->
+<xsl:template name="fop1-document-information">
+ <xsl:variable name="authors" select="(//author|//editor|//corpauthor|//authorgroup)[1]"/>
+
+ <xsl:variable name="title">
+ <xsl:apply-templates select="/*[1]" mode="label.markup"/>
+ <xsl:apply-templates select="/*[1]" mode="title.markup"/>
+ <xsl:variable name="subtitle">
+ <xsl:apply-templates select="/*[1]" mode="subtitle.markup"/>
+ </xsl:variable>
+ <xsl:if test="$subtitle !=''">
+ <xsl:text> - </xsl:text>
+ <xsl:value-of select="$subtitle"/>
+ </xsl:if>
+ </xsl:variable>
+
+ <fo:declarations>
+ <x:xmpmeta xmlns:x="adobe:ns:meta/">
+ <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
+ <rdf:Description rdf:about="" xmlns:dc="http://purl.org/dc/elements/1.1/">
+ <!-- Dublin Core properties go here -->
+
+ <!-- Title -->
+ <dc:title><xsl:value-of select="normalize-space($title)"/></dc:title>
+
+ <!-- Author -->
+ <xsl:if test="$authors">
+ <xsl:variable name="author">
+ <xsl:choose>
+ <xsl:when test="$authors[self::authorgroup]">
+ <xsl:call-template name="person.name.list">
+ <xsl:with-param name="person.list"
+ select="$authors/*[self::author|self::corpauthor|
+ self::othercredit|self::editor]"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="$authors[self::corpauthor]">
+ <xsl:value-of select="$authors"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="person.name">
+ <xsl:with-param name="node" select="$authors"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <dc:creator><xsl:value-of select="normalize-space($author)"/></dc:creator>
+ </xsl:if>
+
+ <!-- Subject -->
+ <xsl:if test="//subjectterm">
+ <dc:description>
+ <xsl:for-each select="//subjectterm">
+ <xsl:value-of select="normalize-space(.)"/>
+ <xsl:if test="position() != last()">
+ <xsl:text>, </xsl:text>
+ </xsl:if>
+ </xsl:for-each>
+ </dc:description>
+ </xsl:if>
+ </rdf:Description>
+
+ <rdf:Description rdf:about="" xmlns:pdf="http://ns.adobe.com/pdf/1.3/">
+ <!-- PDF properties go here -->
+
+ <!-- Keywords -->
+ <xsl:if test="//keyword">
+ <pdf:Keywords>
+ <xsl:for-each select="//keyword">
+ <xsl:value-of select="normalize-space(.)"/>
+ <xsl:if test="position() != last()">
+ <xsl:text>, </xsl:text>
+ </xsl:if>
+ </xsl:for-each>
+ </pdf:Keywords>
+ </xsl:if>
+ </rdf:Description>
+
+ <rdf:Description rdf:about="" xmlns:xmp="http://ns.adobe.com/xap/1.0/">
+ <!-- XMP properties go here -->
+
+ <!-- Creator Tool -->
+ <xmp:CreatorTool>DocBook XSL Stylesheets with Apache FOP</xmp:CreatorTool>
+ </rdf:Description>
+
+ </rdf:RDF>
+ </x:xmpmeta>
+ </fo:declarations>
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/formal.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/formal.xsl
new file mode 100644
index 0000000..bb40aa9
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/formal.xsl
@@ -0,0 +1,642 @@
+<?xml version='1.0'?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:fo="http://www.w3.org/1999/XSL/Format"
+ version='1.0'>
+
+<!-- ********************************************************************
+ $Id: formal.xsl 8544 2009-12-02 06:06:53Z bobstayton $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<!-- formal.object creates a basic block containing the
+ result of processing the object, including its title
+ and any keep-together properties.
+ The template calling formal.object may wrap these results in a
+ float or pgwide block. -->
+
+<xsl:template name="formal.object">
+ <xsl:param name="placement" select="'before'"/>
+
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+
+ <xsl:variable name="content">
+ <xsl:if test="$placement = 'before'">
+ <xsl:call-template name="formal.object.heading">
+ <xsl:with-param name="placement" select="$placement"/>
+ </xsl:call-template>
+ </xsl:if>
+ <xsl:apply-templates/>
+ <xsl:if test="$placement != 'before'">
+ <xsl:call-template name="formal.object.heading">
+ <xsl:with-param name="placement" select="$placement"/>
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:variable>
+
+ <xsl:variable name="keep.together">
+ <xsl:call-template name="pi.dbfo_keep-together"/>
+ </xsl:variable>
+
+ <xsl:choose>
+ <!-- tables have their own templates and
+ are not handled by formal.object -->
+ <xsl:when test="self::figure">
+ <fo:block id="{$id}"
+ xsl:use-attribute-sets="figure.properties">
+ <xsl:if test="$keep.together != ''">
+ <xsl:attribute name="keep-together.within-column"><xsl:value-of
+ select="$keep.together"/></xsl:attribute>
+ </xsl:if>
+ <xsl:copy-of select="$content"/>
+ </fo:block>
+ </xsl:when>
+ <xsl:when test="self::example">
+ <fo:block id="{$id}"
+ xsl:use-attribute-sets="example.properties">
+ <xsl:if test="$keep.together != ''">
+ <xsl:attribute name="keep-together.within-column"><xsl:value-of
+ select="$keep.together"/></xsl:attribute>
+ </xsl:if>
+ <xsl:copy-of select="$content"/>
+ </fo:block>
+ </xsl:when>
+ <xsl:when test="self::equation">
+ <fo:block id="{$id}"
+ xsl:use-attribute-sets="equation.properties">
+ <xsl:if test="$keep.together != ''">
+ <xsl:attribute name="keep-together.within-column"><xsl:value-of
+ select="$keep.together"/></xsl:attribute>
+ </xsl:if>
+ <xsl:copy-of select="$content"/>
+ </fo:block>
+ </xsl:when>
+ <xsl:when test="self::procedure">
+ <fo:block id="{$id}"
+ xsl:use-attribute-sets="procedure.properties">
+ <xsl:if test="$keep.together != ''">
+ <xsl:attribute name="keep-together.within-column"><xsl:value-of
+ select="$keep.together"/></xsl:attribute>
+ </xsl:if>
+ <xsl:copy-of select="$content"/>
+ </fo:block>
+ </xsl:when>
+ <xsl:otherwise>
+ <fo:block id="{$id}"
+ xsl:use-attribute-sets="formal.object.properties">
+ <xsl:if test="$keep.together != ''">
+ <xsl:attribute name="keep-together.within-column"><xsl:value-of
+ select="$keep.together"/></xsl:attribute>
+ </xsl:if>
+ <xsl:copy-of select="$content"/>
+ </fo:block>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="formal.object.heading">
+ <xsl:param name="object" select="."/>
+ <xsl:param name="placement" select="'before'"/>
+
+ <fo:block xsl:use-attribute-sets="formal.title.properties">
+ <xsl:choose>
+ <xsl:when test="$placement = 'before'">
+ <xsl:attribute
+ name="keep-with-next.within-column">always</xsl:attribute>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:attribute
+ name="keep-with-previous.within-column">always</xsl:attribute>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:apply-templates select="$object" mode="object.title.markup">
+ <xsl:with-param name="allow-anchors" select="1"/>
+ </xsl:apply-templates>
+ </fo:block>
+</xsl:template>
+
+<xsl:template name="informal.object">
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+
+ <xsl:variable name="keep.together">
+ <xsl:call-template name="pi.dbfo_keep-together"/>
+ </xsl:variable>
+
+ <!-- Some don't have a pgwide attribute, so may use a PI -->
+ <xsl:variable name="pgwide.pi">
+ <xsl:call-template name="pi.dbfo_pgwide"/>
+ </xsl:variable>
+
+ <xsl:variable name="pgwide">
+ <xsl:choose>
+ <xsl:when test="@pgwide">
+ <xsl:value-of select="@pgwide"/>
+ </xsl:when>
+ <xsl:when test="$pgwide.pi">
+ <xsl:value-of select="$pgwide.pi"/>
+ </xsl:when>
+ <!-- child element may set pgwide -->
+ <xsl:when test="*[@pgwide]">
+ <xsl:value-of select="*[@pgwide][1]/@pgwide"/>
+ </xsl:when>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:choose>
+ <!-- informaltables have their own templates and
+ are not handled by formal.object -->
+ <xsl:when test="local-name(.) = 'equation'">
+ <xsl:choose>
+ <xsl:when test="$pgwide = '1'">
+ <fo:block id="{$id}"
+ xsl:use-attribute-sets="pgwide.properties
+ equation.properties">
+ <xsl:if test="$keep.together != ''">
+ <xsl:attribute name="keep-together.within-column"><xsl:value-of
+ select="$keep.together"/></xsl:attribute>
+ </xsl:if>
+ <xsl:call-template name="equation.without.title"/>
+ </fo:block>
+ </xsl:when>
+ <xsl:otherwise>
+ <fo:block id="{$id}"
+ xsl:use-attribute-sets="equation.properties">
+ <xsl:if test="$keep.together != ''">
+ <xsl:attribute name="keep-together.within-column"><xsl:value-of
+ select="$keep.together"/></xsl:attribute>
+ </xsl:if>
+ <xsl:call-template name="equation.without.title"/>
+ </fo:block>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:when test="local-name(.) = 'procedure'">
+ <fo:block id="{$id}"
+ xsl:use-attribute-sets="procedure.properties">
+ <xsl:if test="$keep.together != ''">
+ <xsl:attribute name="keep-together.within-column"><xsl:value-of
+ select="$keep.together"/></xsl:attribute>
+ </xsl:if>
+ <xsl:apply-templates/>
+ </fo:block>
+ </xsl:when>
+ <xsl:when test="local-name(.) = 'informalfigure'">
+ <xsl:choose>
+ <xsl:when test="$pgwide = '1'">
+ <fo:block id="{$id}"
+ xsl:use-attribute-sets="pgwide.properties
+ informalfigure.properties">
+ <xsl:if test="$keep.together != ''">
+ <xsl:attribute name="keep-together.within-column"><xsl:value-of
+ select="$keep.together"/></xsl:attribute>
+ </xsl:if>
+ <xsl:apply-templates/>
+ </fo:block>
+ </xsl:when>
+ <xsl:otherwise>
+ <fo:block id="{$id}"
+ xsl:use-attribute-sets="informalfigure.properties">
+ <xsl:if test="$keep.together != ''">
+ <xsl:attribute name="keep-together.within-column"><xsl:value-of
+ select="$keep.together"/></xsl:attribute>
+ </xsl:if>
+ <xsl:apply-templates/>
+ </fo:block>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:when test="local-name(.) = 'informalexample'">
+ <xsl:choose>
+ <xsl:when test="$pgwide = '1'">
+ <fo:block id="{$id}"
+ xsl:use-attribute-sets="pgwide.properties
+ informalexample.properties">
+ <xsl:if test="$keep.together != ''">
+ <xsl:attribute name="keep-together.within-column"><xsl:value-of
+ select="$keep.together"/></xsl:attribute>
+ </xsl:if>
+ <xsl:apply-templates/>
+ </fo:block>
+ </xsl:when>
+ <xsl:otherwise>
+ <fo:block id="{$id}"
+ xsl:use-attribute-sets="informalexample.properties">
+ <xsl:if test="$keep.together != ''">
+ <xsl:attribute name="keep-together.within-column"><xsl:value-of
+ select="$keep.together"/></xsl:attribute>
+ </xsl:if>
+ <xsl:apply-templates/>
+ </fo:block>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:when test="local-name(.) = 'informalequation'">
+ <xsl:choose>
+ <xsl:when test="$pgwide = '1'">
+ <fo:block id="{$id}"
+ xsl:use-attribute-sets="pgwide.properties
+ informalequation.properties">
+ <xsl:if test="$keep.together != ''">
+ <xsl:attribute name="keep-together.within-column"><xsl:value-of
+ select="$keep.together"/></xsl:attribute>
+ </xsl:if>
+ <xsl:apply-templates/>
+ </fo:block>
+ </xsl:when>
+ <xsl:otherwise>
+ <fo:block id="{$id}"
+ xsl:use-attribute-sets="informalequation.properties">
+ <xsl:if test="$keep.together != ''">
+ <xsl:attribute name="keep-together.within-column"><xsl:value-of
+ select="$keep.together"/></xsl:attribute>
+ </xsl:if>
+ <xsl:apply-templates/>
+ </fo:block>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <fo:block id="{$id}"
+ xsl:use-attribute-sets="informal.object.properties">
+ <xsl:if test="$keep.together != ''">
+ <xsl:attribute name="keep-together.within-column"><xsl:value-of
+ select="$keep.together"/></xsl:attribute>
+ </xsl:if>
+ <xsl:apply-templates/>
+ </fo:block>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="equation.without.title">
+ <!-- Lay out equation and number next to equation using a table -->
+ <fo:table table-layout="fixed" width="100%">
+ <fo:table-column column-width="proportional-column-width(15)"/>
+ <fo:table-column column-width="proportional-column-width(1)"/>
+ <fo:table-body start-indent="0pt" end-indent="0pt">
+ <fo:table-row>
+ <fo:table-cell padding-end="6pt">
+ <fo:block>
+ <xsl:apply-templates/>
+ </fo:block>
+ </fo:table-cell>
+ <fo:table-cell xsl:use-attribute-sets="equation.number.properties">
+ <fo:block>
+ <xsl:text>(</xsl:text>
+ <xsl:apply-templates select="." mode="label.markup"/>
+ <xsl:text>)</xsl:text>
+ </fo:block>
+ </fo:table-cell>
+ </fo:table-row>
+ </fo:table-body>
+ </fo:table>
+</xsl:template>
+
+<xsl:template name="semiformal.object">
+ <xsl:param name="placement" select="'before'"/>
+ <xsl:choose>
+ <xsl:when test="title or info/title">
+ <xsl:call-template name="formal.object">
+ <xsl:with-param name="placement" select="$placement"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="informal.object"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="figure">
+ <xsl:variable name="param.placement"
+ select="substring-after(normalize-space($formal.title.placement),
+ concat(local-name(.), ' '))"/>
+
+ <xsl:variable name="placement">
+ <xsl:choose>
+ <xsl:when test="contains($param.placement, ' ')">
+ <xsl:value-of select="substring-before($param.placement, ' ')"/>
+ </xsl:when>
+ <xsl:when test="$param.placement = ''">before</xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$param.placement"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="figure">
+ <xsl:choose>
+ <xsl:when test="@pgwide = '1'">
+ <fo:block xsl:use-attribute-sets="pgwide.properties">
+ <xsl:call-template name="formal.object">
+ <xsl:with-param name="placement" select="$placement"/>
+ </xsl:call-template>
+ </fo:block>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="formal.object">
+ <xsl:with-param name="placement" select="$placement"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="floatstyle">
+ <xsl:call-template name="floatstyle"/>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="$floatstyle != ''">
+ <xsl:call-template name="floater">
+ <xsl:with-param name="position" select="$floatstyle"/>
+ <xsl:with-param name="content" select="$figure"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:copy-of select="$figure"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="example">
+ <xsl:variable name="param.placement"
+ select="substring-after(normalize-space($formal.title.placement),
+ concat(local-name(.), ' '))"/>
+
+ <xsl:variable name="placement">
+ <xsl:choose>
+ <xsl:when test="contains($param.placement, ' ')">
+ <xsl:value-of select="substring-before($param.placement, ' ')"/>
+ </xsl:when>
+ <xsl:when test="$param.placement = ''">before</xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$param.placement"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <!-- Example doesn't have a pgwide attribute, so may use a PI -->
+ <xsl:variable name="pgwide.pi">
+ <xsl:call-template name="pi.dbfo_pgwide"/>
+ </xsl:variable>
+
+ <xsl:variable name="pgwide">
+ <xsl:choose>
+ <xsl:when test="$pgwide.pi">
+ <xsl:value-of select="$pgwide.pi"/>
+ </xsl:when>
+ <!-- child element may set pgwide -->
+ <xsl:when test="*[@pgwide]">
+ <xsl:value-of select="*[@pgwide][1]/@pgwide"/>
+ </xsl:when>
+ </xsl:choose>
+ </xsl:variable>
+
+ <!-- Get align value from internal mediaobject -->
+ <xsl:variable name="align">
+ <xsl:if test="mediaobject|mediaobjectco">
+ <xsl:variable name="olist" select="mediaobject/imageobject
+ |mediaobjectco/imageobjectco
+ |mediaobject/videoobject
+ |mediaobject/audioobject
+ |mediaobject/textobject"/>
+
+ <xsl:variable name="object.index">
+ <xsl:call-template name="select.mediaobject.index">
+ <xsl:with-param name="olist" select="$olist"/>
+ <xsl:with-param name="count" select="1"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="object" select="$olist[position() = $object.index]"/>
+
+ <xsl:value-of select="$object/descendant::imagedata[@align][1]/@align"/>
+ </xsl:if>
+ </xsl:variable>
+
+ <xsl:variable name="example">
+ <xsl:choose>
+ <xsl:when test="$pgwide = '1'">
+ <fo:block xsl:use-attribute-sets="pgwide.properties">
+ <xsl:if test="$align != ''">
+ <xsl:attribute name="text-align">
+ <xsl:value-of select="$align"/>
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:call-template name="formal.object">
+ <xsl:with-param name="placement" select="$placement"/>
+ </xsl:call-template>
+ </fo:block>
+ </xsl:when>
+ <xsl:otherwise>
+ <fo:block>
+ <xsl:if test="$align != ''">
+ <xsl:attribute name="text-align">
+ <xsl:value-of select="$align"/>
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:call-template name="formal.object">
+ <xsl:with-param name="placement" select="$placement"/>
+ </xsl:call-template>
+ </fo:block>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="floatstyle">
+ <xsl:call-template name="floatstyle"/>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="$floatstyle != ''">
+ <xsl:call-template name="floater">
+ <xsl:with-param name="position" select="$floatstyle"/>
+ <xsl:with-param name="content" select="$example"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:copy-of select="$example"/>
+ </xsl:otherwise>
+ </xsl:choose>
+
+</xsl:template>
+
+<!-- Unified handling of CALS and HTML tables, formal and not -->
+<!-- Creates a hierarchy of nested containers:
+ - Outer container does a float.
+ - Nested container does block-container for rotation
+ - Nested block contains title, layout table and footnotes
+ - Nested layout table placeholder template supports extensions.
+ - fo:table is innermost.
+ Created from the innermost and working out.
+ Not all layers apply to every table.
+-->
+<xsl:template match="table|informaltable">
+ <xsl:if test="tgroup/tbody/tr
+ |tgroup/thead/tr
+ |tgroup/tfoot/tr">
+ <xsl:message terminate="yes">
+ <xsl:text>Broken table: tr descendent of CALS Table.</xsl:text>
+ <xsl:text>The text in the first tr is:&#10;</xsl:text>
+ <xsl:value-of
+ select="(tgroup//tr)[1]"/>
+ </xsl:message>
+ </xsl:if>
+ <xsl:if test="not(tgroup) and .//row">
+ <xsl:message terminate="yes">
+ <xsl:text>Broken table: row descendent of HTML table.</xsl:text>
+ <xsl:text>The text in the first row is:&#10;</xsl:text>
+ <xsl:value-of
+ select=".//row[1]"/>
+ </xsl:message>
+ </xsl:if>
+
+ <!-- Contains fo:table, not title or footnotes -->
+ <xsl:variable name="table.content">
+ <xsl:call-template name="make.table.content"/>
+ </xsl:variable>
+
+ <!-- Optional layout table template for extensions -->
+ <xsl:variable name="table.layout">
+ <xsl:call-template name="table.layout">
+ <xsl:with-param name="table.content" select="$table.content"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <!-- fo:block contains title, layout table, and footnotes -->
+ <xsl:variable name="table.block">
+ <xsl:call-template name="table.block">
+ <xsl:with-param name="table.layout" select="$table.layout"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <!-- pgwide or orient container -->
+ <xsl:variable name="table.container">
+ <xsl:call-template name="table.container">
+ <xsl:with-param name="table.block" select="$table.block"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <!-- float or not -->
+ <xsl:variable name="floatstyle">
+ <xsl:call-template name="floatstyle"/>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="$floatstyle != ''">
+ <xsl:call-template name="floater">
+ <xsl:with-param name="position" select="$floatstyle"/>
+ <xsl:with-param name="content" select="$table.container"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:copy-of select="$table.container"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+
+<xsl:template match="equation">
+ <xsl:variable name="param.placement"
+ select="substring-after(normalize-space($formal.title.placement),
+ concat(local-name(.), ' '))"/>
+
+ <xsl:variable name="placement">
+ <xsl:choose>
+ <xsl:when test="contains($param.placement, ' ')">
+ <xsl:value-of select="substring-before($param.placement, ' ')"/>
+ </xsl:when>
+ <xsl:when test="$param.placement = ''">before</xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$param.placement"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <!-- Equation doesn't have a pgwide attribute, so may use a PI -->
+ <xsl:variable name="pgwide">
+ <xsl:call-template name="pi.dbfo_pgwide"/>
+ </xsl:variable>
+
+ <xsl:variable name="equation">
+ <xsl:choose>
+ <xsl:when test="$pgwide = '1'">
+ <fo:block xsl:use-attribute-sets="pgwide.properties">
+ <xsl:call-template name="semiformal.object">
+ <xsl:with-param name="placement" select="$placement"/>
+ </xsl:call-template>
+ </fo:block>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="semiformal.object">
+ <xsl:with-param name="placement" select="$placement"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="floatstyle">
+ <xsl:call-template name="floatstyle"/>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="$floatstyle != ''">
+ <xsl:call-template name="floater">
+ <xsl:with-param name="position" select="$floatstyle"/>
+ <xsl:with-param name="content" select="$equation"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:copy-of select="$equation"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="figure/title"></xsl:template>
+<xsl:template match="figure/titleabbrev"></xsl:template>
+<xsl:template match="table/title"></xsl:template>
+<xsl:template match="table/titleabbrev"></xsl:template>
+<xsl:template match="table/textobject"></xsl:template>
+<xsl:template match="example/title"></xsl:template>
+<xsl:template match="example/titleabbrev"></xsl:template>
+<xsl:template match="equation/title"></xsl:template>
+<xsl:template match="equation/titleabbrev"></xsl:template>
+
+<xsl:template match="informalfigure">
+ <xsl:call-template name="informal.object"/>
+</xsl:template>
+
+<xsl:template match="informalexample">
+ <xsl:call-template name="informal.object"/>
+</xsl:template>
+
+<xsl:template match="informaltable/textobject"></xsl:template>
+
+<xsl:template match="informalequation">
+ <xsl:call-template name="informal.object"/>
+</xsl:template>
+
+<xsl:template name="floatstyle">
+ <xsl:if test="(@float and @float != '0') or @floatstyle != ''">
+ <xsl:choose>
+ <xsl:when test="@floatstyle != ''">
+ <xsl:value-of select="@floatstyle"/>
+ </xsl:when>
+ <xsl:when test="@float = '1'">
+ <xsl:value-of select="$default.float.class"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="@float"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:if>
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/glossary.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/glossary.xsl
new file mode 100644
index 0000000..366b3cb
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/glossary.xsl
@@ -0,0 +1,1169 @@
+<?xml version='1.0'?>
+<!DOCTYPE xsl:stylesheet [
+<!ENTITY % common.entities SYSTEM "../common/entities.ent">
+%common.entities;
+]>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:fo="http://www.w3.org/1999/XSL/Format"
+ xmlns:xlink='http://www.w3.org/1999/xlink'
+ exclude-result-prefixes="xlink"
+ version='1.0'>
+
+<!-- ********************************************************************
+ $Id: glossary.xsl 8591 2010-02-27 20:42:27Z bobstayton $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<!-- ==================================================================== -->
+
+<xsl:template match="glossary">
+ <xsl:call-template name="make-glossary"/>
+</xsl:template>
+
+<xsl:template match="glossdiv/title"/>
+<xsl:template match="glossdiv/subtitle"/>
+<xsl:template match="glossdiv/titleabbrev"/>
+
+<!-- ==================================================================== -->
+
+<xsl:template name="make-glossary">
+ <xsl:param name="divs" select="glossdiv"/>
+ <xsl:param name="entries" select="glossentry"/>
+ <xsl:param name="preamble" select="*[not(self::title
+ or self::subtitle
+ or self::glossdiv
+ or self::glossentry)]"/>
+
+ &setup-language-variable;
+
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+
+ <xsl:variable name="presentation">
+ <xsl:call-template name="pi.dbfo_glossary-presentation"/>
+ </xsl:variable>
+
+ <xsl:variable name="term-width">
+ <xsl:call-template name="pi.dbfo_glossterm-width"/>
+ </xsl:variable>
+
+ <xsl:variable name="width">
+ <xsl:choose>
+ <xsl:when test="$term-width = ''">
+ <xsl:value-of select="$glossterm.width"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$term-width"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <fo:block id="{$id}">
+ <xsl:call-template name="glossary.titlepage"/>
+ </fo:block>
+
+ <xsl:if test="$preamble">
+ <xsl:apply-templates select="$preamble"/>
+ </xsl:if>
+
+ <xsl:choose>
+ <xsl:when test="$presentation = 'list'">
+ <xsl:apply-templates select="$divs" mode="glossary.as.list">
+ <xsl:with-param name="width" select="$width"/>
+ </xsl:apply-templates>
+ <xsl:if test="$entries">
+ <fo:list-block provisional-distance-between-starts="{$width}"
+ provisional-label-separation="{$glossterm.separation}"
+ xsl:use-attribute-sets="normal.para.spacing">
+ <xsl:choose>
+ <xsl:when test="$glossary.sort != 0">
+ <xsl:apply-templates select="$entries" mode="glossary.as.list">
+ <xsl:sort lang="{$language}" select="normalize-space(translate(concat(@sortas, glossterm[not(parent::glossentry/@sortas) or parent::glossentry/@sortas = '']), &lowercase;, &uppercase;))"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="$entries" mode="glossary.as.list"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </fo:list-block>
+ </xsl:if>
+ </xsl:when>
+ <xsl:when test="$presentation = 'blocks'">
+ <xsl:apply-templates select="$divs" mode="glossary.as.blocks"/>
+ <xsl:choose>
+ <xsl:when test="$glossary.sort != 0">
+ <xsl:apply-templates select="$entries" mode="glossary.as.blocks">
+ <xsl:sort lang="{$language}" select="normalize-space(translate(concat(@sortas, glossterm[not(parent::glossentry/@sortas) or parent::glossentry/@sortas = '']), &lowercase;, &uppercase;))"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="$entries" mode="glossary.as.blocks"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:when test="$glossary.as.blocks != 0">
+ <xsl:apply-templates select="$divs" mode="glossary.as.blocks"/>
+ <xsl:choose>
+ <xsl:when test="$glossary.sort != 0">
+ <xsl:apply-templates select="$entries" mode="glossary.as.blocks">
+ <xsl:sort lang="{$language}" select="normalize-space(translate(concat(@sortas, glossterm[not(parent::glossentry/@sortas) or parent::glossentry/@sortas = '']), &lowercase;, &uppercase;))"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="$entries" mode="glossary.as.blocks"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="$divs" mode="glossary.as.list">
+ <xsl:with-param name="width" select="$width"/>
+ </xsl:apply-templates>
+ <xsl:if test="$entries">
+ <fo:list-block provisional-distance-between-starts="{$width}"
+ provisional-label-separation="{$glossterm.separation}"
+ xsl:use-attribute-sets="normal.para.spacing">
+ <xsl:choose>
+ <xsl:when test="$glossary.sort != 0">
+ <xsl:apply-templates select="$entries" mode="glossary.as.list">
+ <xsl:sort lang="{$language}" select="normalize-space(translate(concat(@sortas, glossterm[not(parent::glossentry/@sortas) or parent::glossentry/@sortas = '']), &lowercase;, &uppercase;))"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="$entries" mode="glossary.as.list"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </fo:list-block>
+ </xsl:if>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="book/glossary|part/glossary|/glossary" priority="2">
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+
+ <xsl:variable name="master-reference">
+ <xsl:call-template name="select.pagemaster"/>
+ </xsl:variable>
+
+ <fo:page-sequence hyphenate="{$hyphenate}"
+ master-reference="{$master-reference}">
+ <xsl:attribute name="language">
+ <xsl:call-template name="l10n.language"/>
+ </xsl:attribute>
+
+ <xsl:attribute name="format">
+ <xsl:call-template name="page.number.format">
+ <xsl:with-param name="master-reference" select="$master-reference"/>
+ </xsl:call-template>
+ </xsl:attribute>
+
+ <xsl:attribute name="initial-page-number">
+ <xsl:call-template name="initial.page.number">
+ <xsl:with-param name="master-reference" select="$master-reference"/>
+ </xsl:call-template>
+ </xsl:attribute>
+
+ <xsl:attribute name="force-page-count">
+ <xsl:call-template name="force.page.count">
+ <xsl:with-param name="master-reference" select="$master-reference"/>
+ </xsl:call-template>
+ </xsl:attribute>
+
+ <xsl:attribute name="hyphenation-character">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'hyphenation-character'"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:attribute name="hyphenation-push-character-count">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'hyphenation-push-character-count'"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:attribute name="hyphenation-remain-character-count">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'hyphenation-remain-character-count'"/>
+ </xsl:call-template>
+ </xsl:attribute>
+
+ <xsl:apply-templates select="." mode="running.head.mode">
+ <xsl:with-param name="master-reference" select="$master-reference"/>
+ </xsl:apply-templates>
+ <xsl:apply-templates select="." mode="running.foot.mode">
+ <xsl:with-param name="master-reference" select="$master-reference"/>
+ </xsl:apply-templates>
+
+ <fo:flow flow-name="xsl-region-body">
+ <xsl:call-template name="set.flow.properties">
+ <xsl:with-param name="element" select="local-name(.)"/>
+ <xsl:with-param name="master-reference" select="$master-reference"/>
+ </xsl:call-template>
+
+ <xsl:call-template name="make-glossary"/>
+ </fo:flow>
+ </fo:page-sequence>
+</xsl:template>
+
+<xsl:template match="glossary/glossaryinfo"></xsl:template>
+<xsl:template match="glossary/info"></xsl:template>
+<xsl:template match="glossary/title"></xsl:template>
+<xsl:template match="glossary/subtitle"></xsl:template>
+<xsl:template match="glossary/titleabbrev"></xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="glosslist">
+ &setup-language-variable;
+
+ <xsl:variable name="presentation">
+ <xsl:call-template name="pi.dbfo_glosslist-presentation"/>
+ </xsl:variable>
+
+ <xsl:variable name="term-width">
+ <xsl:call-template name="pi.dbfo_glossterm-width"/>
+ </xsl:variable>
+
+ <xsl:variable name="width">
+ <xsl:choose>
+ <xsl:when test="$term-width = ''">
+ <xsl:value-of select="$glossterm.width"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$term-width"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:if test="title or info/title">
+ <xsl:apply-templates select="(title|info/title)[1]" mode="list.title.mode"/>
+ </xsl:if>
+
+ <xsl:choose>
+ <xsl:when test="$presentation = 'list'">
+ <fo:list-block provisional-distance-between-starts="{$width}"
+ provisional-label-separation="{$glossterm.separation}"
+ xsl:use-attribute-sets="normal.para.spacing">
+ <xsl:choose>
+ <xsl:when test="$glossary.sort != 0">
+ <xsl:apply-templates select="glossentry" mode="glossary.as.list">
+ <xsl:sort lang="{$language}" select="normalize-space(translate(concat(@sortas, glossterm[not(parent::glossentry/@sortas) or parent::glossentry/@sortas = '']), &lowercase;, &uppercase;))"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="glossentry" mode="glossary.as.list"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </fo:list-block>
+ </xsl:when>
+ <xsl:when test="$presentation = 'blocks'">
+ <xsl:choose>
+ <xsl:when test="$glossary.sort != 0">
+ <xsl:apply-templates select="glossentry" mode="glossary.as.blocks">
+ <xsl:sort lang="{$language}" select="normalize-space(translate(concat(@sortas, glossterm[not(parent::glossentry/@sortas) or parent::glossentry/@sortas = '']), &lowercase;, &uppercase;))"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="glossentry" mode="glossary.as.blocks"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:when test="$glosslist.as.blocks != 0">
+ <xsl:choose>
+ <xsl:when test="$glossary.sort != 0">
+ <xsl:apply-templates select="glossentry" mode="glossary.as.blocks">
+ <xsl:sort lang="{$language}" select="normalize-space(translate(concat(@sortas, glossterm[not(parent::glossentry/@sortas) or parent::glossentry/@sortas = '']), &lowercase;, &uppercase;))"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="glossentry" mode="glossary.as.blocks"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <fo:list-block provisional-distance-between-starts="{$width}"
+ provisional-label-separation="{$glossterm.separation}"
+ xsl:use-attribute-sets="normal.para.spacing">
+ <xsl:choose>
+ <xsl:when test="$glossary.sort != 0">
+ <xsl:apply-templates select="glossentry" mode="glossary.as.list">
+ <xsl:sort lang="{$language}" select="normalize-space(translate(concat(@sortas, glossterm[not(parent::glossentry/@sortas) or parent::glossentry/@sortas = '']), &lowercase;, &uppercase;))"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="glossentry" mode="glossary.as.list"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </fo:list-block>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ==================================================================== -->
+<!-- Glossary collection -->
+
+<xsl:template match="glossary[@role='auto']" priority="2">
+ <xsl:variable name="collection" select="document($glossary.collection, .)"/>
+ <xsl:if test="$glossary.collection = ''">
+ <xsl:message>
+ <xsl:text>Warning: processing automatic glossary </xsl:text>
+ <xsl:text>without a glossary.collection file.</xsl:text>
+ </xsl:message>
+ </xsl:if>
+
+ <xsl:if test="not($collection) and $glossary.collection != ''">
+ <xsl:message>
+ <xsl:text>Warning: processing automatic glossary but unable to </xsl:text>
+ <xsl:text>open glossary.collection file '</xsl:text>
+ <xsl:value-of select="$glossary.collection"/>
+ <xsl:text>'</xsl:text>
+ </xsl:message>
+ </xsl:if>
+
+ <xsl:call-template name="make-auto-glossary"/>
+</xsl:template>
+
+<xsl:template name="make-auto-glossary">
+ <xsl:param name="collection" select="document($glossary.collection, .)"/>
+ <xsl:param name="terms" select="//glossterm[not(parent::glossdef)]|//firstterm"/>
+ <xsl:param name="preamble" select="*[not(self::title
+ or self::subtitle
+ or self::glossdiv
+ or self::glossentry)]"/>
+
+ &setup-language-variable;
+
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+
+ <xsl:variable name="presentation">
+ <xsl:call-template name="pi.dbfo_glossary-presentation"/>
+ </xsl:variable>
+
+ <xsl:variable name="term-width">
+ <xsl:call-template name="pi.dbfo_glossterm-width"/>
+ </xsl:variable>
+
+ <xsl:variable name="width">
+ <xsl:choose>
+ <xsl:when test="$term-width = ''">
+ <xsl:value-of select="$glossterm.width"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$term-width"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:if test="$glossary.collection = ''">
+ <xsl:message>
+ <xsl:text>Warning: processing automatic glossary </xsl:text>
+ <xsl:text>without a glossary.collection file.</xsl:text>
+ </xsl:message>
+ </xsl:if>
+
+ <fo:block id="{$id}">
+ <xsl:call-template name="glossary.titlepage"/>
+ </fo:block>
+
+ <xsl:if test="$preamble">
+ <xsl:apply-templates select="$preamble"/>
+ </xsl:if>
+
+ <xsl:choose>
+ <xsl:when test="glossdiv and $collection//glossdiv">
+ <xsl:for-each select="$collection//glossdiv">
+ <!-- first see if there are any in this div -->
+ <xsl:variable name="exist.test">
+ <xsl:for-each select="glossentry">
+ <xsl:variable name="cterm" select="glossterm"/>
+ <xsl:if test="$terms[@baseform = $cterm or . = $cterm]">
+ <xsl:value-of select="glossterm"/>
+ </xsl:if>
+ </xsl:for-each>
+ </xsl:variable>
+
+ <xsl:if test="$exist.test != ''">
+ <xsl:choose>
+ <xsl:when test="$presentation = 'list'">
+ <xsl:apply-templates select="." mode="auto-glossary-as-list">
+ <xsl:with-param name="width" select="$width"/>
+ <xsl:with-param name="terms" select="$terms"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:when test="$presentation = 'blocks'">
+ <xsl:apply-templates select="." mode="auto-glossary-as-blocks">
+ <xsl:with-param name="terms" select="$terms"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:when test="$glossary.as.blocks != 0">
+ <xsl:apply-templates select="." mode="auto-glossary-as-blocks">
+ <xsl:with-param name="terms" select="$terms"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="." mode="auto-glossary-as-list">
+ <xsl:with-param name="width" select="$width"/>
+ <xsl:with-param name="terms" select="$terms"/>
+ </xsl:apply-templates>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:if>
+ </xsl:for-each>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:choose>
+ <xsl:when test="$presentation = 'list'">
+ <fo:list-block provisional-distance-between-starts="{$width}"
+ provisional-label-separation="{$glossterm.separation}"
+ xsl:use-attribute-sets="normal.para.spacing">
+ <xsl:choose>
+ <xsl:when test="$glossary.sort != 0">
+ <xsl:for-each select="$collection//glossentry">
+ <xsl:sort lang="{$language}" select="normalize-space(translate(concat(@sortas, glossterm[not(parent::glossentry/@sortas) or parent::glossentry/@sortas = '']), &lowercase;, &uppercase;))"/>
+ <xsl:variable name="cterm" select="glossterm"/>
+ <xsl:if test="$terms[@baseform = $cterm or . = $cterm]">
+ <xsl:apply-templates select="."
+ mode="auto-glossary-as-list"/>
+ </xsl:if>
+ </xsl:for-each>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:for-each select="$collection//glossentry">
+ <xsl:variable name="cterm" select="glossterm"/>
+ <xsl:if test="$terms[@baseform = $cterm or . = $cterm]">
+ <xsl:apply-templates select="."
+ mode="auto-glossary-as-list"/>
+ </xsl:if>
+ </xsl:for-each>
+ </xsl:otherwise>
+ </xsl:choose>
+ </fo:list-block>
+ </xsl:when>
+ <xsl:when test="$presentation = 'blocks' or
+ $glossary.as.blocks != 0">
+ <xsl:choose>
+ <xsl:when test="$glossary.sort != 0">
+ <xsl:for-each select="$collection//glossentry">
+ <xsl:sort lang="{$language}" select="normalize-space(translate(concat(@sortas, glossterm[not(parent::glossentry/@sortas) or parent::glossentry/@sortas = '']), &lowercase;, &uppercase;))"/>
+ <xsl:variable name="cterm" select="glossterm"/>
+ <xsl:if test="$terms[@baseform = $cterm or . = $cterm]">
+ <xsl:apply-templates select="."
+ mode="auto-glossary-as-blocks"/>
+ </xsl:if>
+ </xsl:for-each>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:for-each select="$collection//glossentry">
+ <xsl:variable name="cterm" select="glossterm"/>
+ <xsl:if test="$terms[@baseform = $cterm or . = $cterm]">
+ <xsl:apply-templates select="."
+ mode="auto-glossary-as-blocks"/>
+ </xsl:if>
+ </xsl:for-each>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <fo:list-block provisional-distance-between-starts="{$width}"
+ provisional-label-separation="{$glossterm.separation}"
+ xsl:use-attribute-sets="normal.para.spacing">
+ <xsl:choose>
+ <xsl:when test="$glossary.sort != 0">
+ <xsl:for-each select="$collection//glossentry">
+
+ <xsl:sort lang="{$language}" select="normalize-space(translate(concat(@sortas, glossterm[not(parent::glossentry/@sortas) or parent::glossentry/@sortas = '']), &lowercase;, &uppercase;))"/>
+ <xsl:variable name="cterm" select="glossterm"/>
+ <xsl:if test="$terms[@baseform = $cterm or . = $cterm]">
+ <xsl:apply-templates select="."
+ mode="auto-glossary-as-list"/>
+ </xsl:if>
+ </xsl:for-each>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:for-each select="$collection//glossentry">
+ <xsl:variable name="cterm" select="glossterm"/>
+ <xsl:if test="$terms[@baseform = $cterm or . = $cterm]">
+ <xsl:apply-templates select="."
+ mode="auto-glossary-as-list"/>
+ </xsl:if>
+ </xsl:for-each>
+ </xsl:otherwise>
+ </xsl:choose>
+ </fo:list-block>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="book/glossary[@role='auto']|
+ part/glossary[@role='auto']|
+ /glossary[@role='auto']" priority="2.5">
+ <xsl:variable name="id"><xsl:call-template name="object.id"/></xsl:variable>
+
+ <xsl:variable name="master-reference">
+ <xsl:call-template name="select.pagemaster"/>
+ </xsl:variable>
+
+ <xsl:if test="$glossary.collection = ''">
+ <xsl:message>
+ <xsl:text>Warning: processing automatic glossary </xsl:text>
+ <xsl:text>without a glossary.collection file.</xsl:text>
+ </xsl:message>
+ </xsl:if>
+
+ <fo:page-sequence hyphenate="{$hyphenate}"
+ master-reference="{$master-reference}">
+ <xsl:attribute name="language">
+ <xsl:call-template name="l10n.language"/>
+ </xsl:attribute>
+ <xsl:attribute name="format">
+ <xsl:call-template name="page.number.format">
+ <xsl:with-param name="master-reference" select="$master-reference"/>
+ </xsl:call-template>
+ </xsl:attribute>
+
+ <xsl:attribute name="initial-page-number">
+ <xsl:call-template name="initial.page.number">
+ <xsl:with-param name="master-reference" select="$master-reference"/>
+ </xsl:call-template>
+ </xsl:attribute>
+
+ <xsl:attribute name="force-page-count">
+ <xsl:call-template name="force.page.count">
+ <xsl:with-param name="master-reference" select="$master-reference"/>
+ </xsl:call-template>
+ </xsl:attribute>
+
+ <xsl:attribute name="hyphenation-character">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'hyphenation-character'"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:attribute name="hyphenation-push-character-count">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'hyphenation-push-character-count'"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:attribute name="hyphenation-remain-character-count">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'hyphenation-remain-character-count'"/>
+ </xsl:call-template>
+ </xsl:attribute>
+
+ <xsl:apply-templates select="." mode="running.head.mode">
+ <xsl:with-param name="master-reference" select="$master-reference"/>
+ </xsl:apply-templates>
+ <xsl:apply-templates select="." mode="running.foot.mode">
+ <xsl:with-param name="master-reference" select="$master-reference"/>
+ </xsl:apply-templates>
+
+ <fo:flow flow-name="xsl-region-body">
+ <xsl:call-template name="set.flow.properties">
+ <xsl:with-param name="element" select="local-name(.)"/>
+ <xsl:with-param name="master-reference" select="$master-reference"/>
+ </xsl:call-template>
+
+ <xsl:call-template name="make-auto-glossary"/>
+ </fo:flow>
+ </fo:page-sequence>
+</xsl:template>
+
+<xsl:template match="glossdiv" mode="auto-glossary-as-list">
+ <xsl:param name="width" select="$glossterm.width"/>
+ <xsl:param name="terms" select="."/>
+
+ &setup-language-variable;
+
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+
+ <xsl:variable name="preamble"
+ select="*[not(self::title
+ or self::subtitle
+ or self::glossentry)]"/>
+
+ <fo:block id="{$id}">
+ <xsl:call-template name="glossdiv.titlepage"/>
+ </fo:block>
+
+ <xsl:apply-templates select="$preamble"/>
+
+ <fo:list-block provisional-distance-between-starts="{$width}"
+ provisional-label-separation="{$glossterm.separation}"
+ xsl:use-attribute-sets="normal.para.spacing">
+ <xsl:choose>
+ <xsl:when test="$glossary.sort != 0">
+ <xsl:for-each select="glossentry">
+ <xsl:sort lang="{$language}" select="normalize-space(translate(concat(@sortas, glossterm[not(parent::glossentry/@sortas) or parent::glossentry/@sortas = '']), &lowercase;, &uppercase;))"/>
+ <xsl:variable name="cterm" select="glossterm"/>
+ <xsl:if test="$terms[@baseform = $cterm or . = $cterm]">
+ <xsl:apply-templates select="." mode="auto-glossary-as-list"/>
+ </xsl:if>
+ </xsl:for-each>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:for-each select="glossentry">
+ <xsl:variable name="cterm" select="glossterm"/>
+ <xsl:if test="$terms[@baseform = $cterm or . = $cterm]">
+ <xsl:apply-templates select="." mode="auto-glossary-as-list"/>
+ </xsl:if>
+ </xsl:for-each>
+ </xsl:otherwise>
+ </xsl:choose>
+ </fo:list-block>
+</xsl:template>
+
+<xsl:template match="glossentry" mode="auto-glossary-as-list">
+ <xsl:apply-templates select="." mode="glossary.as.list"/>
+</xsl:template>
+
+<xsl:template match="glossdiv" mode="auto-glossary-as-blocks">
+ <xsl:param name="terms" select="."/>
+
+ &setup-language-variable;
+
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+
+ <xsl:variable name="preamble"
+ select="*[not(self::title
+ or self::subtitle
+ or self::glossentry)]"/>
+
+ <fo:block id="{$id}">
+ <xsl:call-template name="glossdiv.titlepage"/>
+ </fo:block>
+
+ <xsl:apply-templates select="$preamble"/>
+
+ <xsl:choose>
+ <xsl:when test="$glossary.sort != 0">
+ <xsl:for-each select="glossentry">
+ <xsl:sort lang="{$language}" select="normalize-space(translate(concat(@sortas, glossterm[not(parent::glossentry/@sortas) or parent::glossentry/@sortas = '']), &lowercase;, &uppercase;))"/>
+ <xsl:variable name="cterm" select="glossterm"/>
+ <xsl:if test="$terms[@baseform = $cterm or . = $cterm]">
+ <xsl:apply-templates select="." mode="auto-glossary-as-blocks"/>
+ </xsl:if>
+ </xsl:for-each>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:for-each select="glossentry">
+ <xsl:variable name="cterm" select="glossterm"/>
+ <xsl:if test="$terms[@baseform = $cterm or . = $cterm]">
+ <xsl:apply-templates select="." mode="auto-glossary-as-blocks"/>
+ </xsl:if>
+ </xsl:for-each>
+ </xsl:otherwise>
+ </xsl:choose>
+
+</xsl:template>
+
+<xsl:template match="glossentry" mode="auto-glossary-as-blocks">
+ <xsl:apply-templates select="." mode="glossary.as.blocks"/>
+</xsl:template>
+
+<!-- ==================================================================== -->
+<!-- Format glossary as a list -->
+
+<xsl:template match="glossdiv" mode="glossary.as.list">
+ <xsl:param name="width" select="$glossterm.width"/>
+
+ &setup-language-variable;
+
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+
+ <xsl:variable name="entries" select="glossentry"/>
+
+ <xsl:variable name="preamble"
+ select="*[not(self::title
+ or self::subtitle
+ or self::glossentry)]"/>
+
+ <fo:block id="{$id}">
+ <xsl:call-template name="glossdiv.titlepage"/>
+ </fo:block>
+
+ <xsl:apply-templates select="$preamble"/>
+
+ <fo:list-block provisional-distance-between-starts="{$width}"
+ provisional-label-separation="{$glossterm.separation}"
+ xsl:use-attribute-sets="normal.para.spacing">
+ <xsl:choose>
+ <xsl:when test="$glossary.sort != 0">
+ <xsl:apply-templates select="$entries" mode="glossary.as.list">
+ <xsl:sort lang="{$language}" select="normalize-space(translate(concat(@sortas, glossterm[not(parent::glossentry/@sortas) or parent::glossentry/@sortas = '']), &lowercase;, &uppercase;))"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="$entries" mode="glossary.as.list"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </fo:list-block>
+</xsl:template>
+
+<!--
+GlossEntry ::=
+ GlossTerm, Acronym?, Abbrev?,
+ (IndexTerm)*,
+ RevHistory?,
+ (GlossSee | GlossDef+)
+-->
+
+<xsl:template match="glossentry" mode="glossary.as.list">
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+
+ <fo:list-item xsl:use-attribute-sets="glossentry.list.item.properties">
+ <xsl:call-template name="anchor">
+ <xsl:with-param name="conditional">
+ <xsl:choose>
+ <xsl:when test="$glossterm.auto.link != 0
+ or $glossary.collection != ''">0</xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:with-param>
+ </xsl:call-template>
+
+ <fo:list-item-label end-indent="label-end()">
+ <fo:block xsl:use-attribute-sets="glossterm.list.properties">
+ <xsl:choose>
+ <xsl:when test="$glossentry.show.acronym = 'primary'">
+ <xsl:choose>
+ <xsl:when test="acronym|abbrev">
+ <xsl:apply-templates select="acronym|abbrev"
+ mode="glossary.as.list"/>
+ <xsl:text> (</xsl:text>
+ <xsl:apply-templates select="glossterm"
+ mode="glossary.as.list"/>
+ <xsl:text>)</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="glossterm"
+ mode="glossary.as.list"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+
+ <xsl:when test="$glossentry.show.acronym = 'yes'">
+ <xsl:apply-templates select="glossterm" mode="glossary.as.list"/>
+
+ <xsl:if test="acronym|abbrev">
+ <xsl:text> (</xsl:text>
+ <xsl:apply-templates select="acronym|abbrev"
+ mode="glossary.as.list"/>
+ <xsl:text>)</xsl:text>
+ </xsl:if>
+ </xsl:when>
+
+ <xsl:otherwise>
+ <xsl:apply-templates select="glossterm" mode="glossary.as.list"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:apply-templates select="indexterm"/>
+ </fo:block>
+ </fo:list-item-label>
+
+ <fo:list-item-body start-indent="body-start()">
+ <fo:block xsl:use-attribute-sets="glossdef.list.properties">
+ <xsl:apply-templates select="glosssee|glossdef" mode="glossary.as.list"/>
+ </fo:block>
+ </fo:list-item-body>
+ </fo:list-item>
+</xsl:template>
+
+<xsl:template match="glossentry/glossterm" mode="glossary.as.list">
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+ <fo:inline id="{$id}">
+ <xsl:apply-templates/>
+ </fo:inline>
+ <xsl:if test="following-sibling::glossterm">, </xsl:if>
+</xsl:template>
+
+<xsl:template match="glossentry/acronym" mode="glossary.as.list">
+ <xsl:apply-templates/>
+ <xsl:if test="following-sibling::acronym|following-sibling::abbrev">, </xsl:if>
+</xsl:template>
+
+<xsl:template match="glossentry/abbrev" mode="glossary.as.list">
+ <xsl:apply-templates/>
+ <xsl:if test="following-sibling::acronym|following-sibling::abbrev">, </xsl:if>
+</xsl:template>
+
+<xsl:template match="glossentry/revhistory" mode="glossary.as.list">
+</xsl:template>
+
+<xsl:template match="glossentry/glosssee" mode="glossary.as.list">
+ <xsl:variable name="otherterm" select="@otherterm"/>
+ <xsl:variable name="targets" select="key('id', $otherterm)"/>
+ <xsl:variable name="target" select="$targets[1]"/>
+ <xsl:variable name="xlink" select="@xlink:href"/>
+
+ <fo:block>
+ <xsl:variable name="template">
+ <xsl:call-template name="gentext.template">
+ <xsl:with-param name="context" select="'glossary'"/>
+ <xsl:with-param name="name" select="'see'"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:variable name="title">
+ <xsl:choose>
+ <xsl:when test="$target">
+ <fo:basic-link internal-destination="{$otherterm}"
+ xsl:use-attribute-sets="xref.properties">
+ <xsl:apply-templates select="$target" mode="xref-to"/>
+ </fo:basic-link>
+ </xsl:when>
+ <xsl:when test="$xlink">
+ <xsl:call-template name="simple.xlink">
+ <xsl:with-param name="content">
+ <xsl:apply-templates/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="$otherterm != '' and not($target)">
+ <xsl:message>
+ <xsl:text>Warning: glosssee @otherterm reference not found: </xsl:text>
+ <xsl:value-of select="$otherterm"/>
+ </xsl:message>
+ <xsl:apply-templates mode="glossary.as.list"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates mode="glossary.as.list"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:call-template name="substitute-markup">
+ <xsl:with-param name="template" select="$template"/>
+ <xsl:with-param name="title" select="$title"/>
+ </xsl:call-template>
+ </fo:block>
+</xsl:template>
+
+<xsl:template match="glossentry/glossdef" mode="glossary.as.list">
+ <xsl:apply-templates select="*[local-name(.) != 'glossseealso']"/>
+ <xsl:if test="glossseealso">
+ <fo:block>
+ <xsl:variable name="template">
+ <xsl:call-template name="gentext.template">
+ <xsl:with-param name="context" select="'glossary'"/>
+ <xsl:with-param name="name" select="'seealso'"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:variable name="title">
+ <xsl:apply-templates select="glossseealso" mode="glossary.as.list"/>
+ </xsl:variable>
+ <xsl:call-template name="substitute-markup">
+ <xsl:with-param name="template" select="$template"/>
+ <xsl:with-param name="title" select="$title"/>
+ </xsl:call-template>
+ </fo:block>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="glossentry/glossdef/para[1]|glossentry/glossdef/simpara[1]"
+ mode="glossary.as.list">
+ <fo:block>
+ <xsl:apply-templates/>
+ </fo:block>
+</xsl:template>
+
+<xsl:template match="glossseealso" mode="glossary.as.list">
+ <xsl:variable name="otherterm" select="@otherterm"/>
+ <xsl:variable name="targets" select="key('id', $otherterm)"/>
+ <xsl:variable name="target" select="$targets[1]"/>
+ <xsl:variable name="xlink" select="@xlink:href"/>
+
+ <xsl:choose>
+ <xsl:when test="$target">
+ <fo:basic-link internal-destination="{$otherterm}"
+ xsl:use-attribute-sets="xref.properties">
+ <xsl:apply-templates select="$target" mode="xref-to"/>
+ </fo:basic-link>
+ </xsl:when>
+ <xsl:when test="$xlink">
+ <xsl:call-template name="simple.xlink">
+ <xsl:with-param name="content">
+ <xsl:apply-templates/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="$otherterm != '' and not($target)">
+ <xsl:message>
+ <xsl:text>Warning: glossseealso @otherterm reference not found: </xsl:text>
+ <xsl:value-of select="$otherterm"/>
+ </xsl:message>
+ <xsl:apply-templates mode="glossary.as.list"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates mode="glossary.as.list"/>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:choose>
+ <xsl:when test="position() = last()"/>
+ <xsl:otherwise>
+ <xsl:call-template name="gentext.template">
+ <xsl:with-param name="context" select="'glossary'"/>
+ <xsl:with-param name="name" select="'seealso-separator'"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ==================================================================== -->
+<!-- Format glossary blocks -->
+
+<xsl:template match="glossdiv" mode="glossary.as.blocks">
+ &setup-language-variable;
+
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+
+ <xsl:variable name="entries" select="glossentry"/>
+ <xsl:variable name="preamble"
+ select="*[not(self::title
+ or self::subtitle
+ or self::glossentry)]"/>
+
+ <fo:block id="{$id}">
+ <xsl:call-template name="glossdiv.titlepage"/>
+ </fo:block>
+
+ <xsl:apply-templates select="$preamble"/>
+
+ <xsl:choose>
+ <xsl:when test="$glossary.sort != 0">
+ <xsl:apply-templates select="$entries" mode="glossary.as.blocks">
+ <xsl:sort lang="{$language}" select="normalize-space(translate(concat(@sortas, glossterm[not(parent::glossentry/@sortas) or parent::glossentry/@sortas = '']), &lowercase;, &uppercase;))"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="$entries" mode="glossary.as.blocks"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!--
+GlossEntry ::=
+ GlossTerm, Acronym?, Abbrev?,
+ (IndexTerm)*,
+ RevHistory?,
+ (GlossSee | GlossDef+)
+-->
+
+<xsl:template match="glossentry" mode="glossary.as.blocks">
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+
+ <fo:block xsl:use-attribute-sets="glossterm.block.properties">
+ <xsl:call-template name="anchor">
+ <xsl:with-param name="conditional">
+ <xsl:choose>
+ <xsl:when test="$glossterm.auto.link != 0
+ or $glossary.collection != ''">0</xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:with-param>
+ </xsl:call-template>
+
+ <xsl:choose>
+ <xsl:when test="$glossentry.show.acronym = 'primary'">
+ <xsl:choose>
+ <xsl:when test="acronym|abbrev">
+ <xsl:apply-templates select="acronym|abbrev" mode="glossary.as.blocks"/>
+ <xsl:text> (</xsl:text>
+ <xsl:apply-templates select="glossterm" mode="glossary.as.blocks"/>
+ <xsl:text>)</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="glossterm" mode="glossary.as.blocks"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+
+ <xsl:when test="$glossentry.show.acronym = 'yes'">
+ <xsl:apply-templates select="glossterm" mode="glossary.as.blocks"/>
+
+ <xsl:if test="acronym|abbrev">
+ <xsl:text> (</xsl:text>
+ <xsl:apply-templates select="acronym|abbrev" mode="glossary.as.blocks"/>
+ <xsl:text>)</xsl:text>
+ </xsl:if>
+ </xsl:when>
+
+ <xsl:otherwise>
+ <xsl:apply-templates select="glossterm" mode="glossary.as.blocks"/>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:apply-templates select="indexterm"/>
+ </fo:block>
+
+ <fo:block xsl:use-attribute-sets="glossdef.block.properties">
+ <xsl:apply-templates select="glosssee|glossdef" mode="glossary.as.blocks"/>
+ </fo:block>
+</xsl:template>
+
+<xsl:template match="glossentry/glossterm" mode="glossary.as.blocks">
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+ <fo:inline id="{$id}">
+ <xsl:apply-templates/>
+ </fo:inline>
+ <xsl:if test="following-sibling::glossterm">, </xsl:if>
+</xsl:template>
+
+<xsl:template match="glossentry/acronym" mode="glossary.as.blocks">
+ <xsl:apply-templates/>
+ <xsl:if test="following-sibling::acronym|following-sibling::abbrev">, </xsl:if>
+</xsl:template>
+
+<xsl:template match="glossentry/abbrev" mode="glossary.as.blocks">
+ <xsl:apply-templates/>
+ <xsl:if test="following-sibling::acronym|following-sibling::abbrev">, </xsl:if>
+</xsl:template>
+
+<xsl:template match="glossentry/glosssee" mode="glossary.as.blocks">
+ <xsl:variable name="otherterm" select="@otherterm"/>
+ <xsl:variable name="targets" select="key('id', $otherterm)"/>
+ <xsl:variable name="target" select="$targets[1]"/>
+ <xsl:variable name="xlink" select="@xlink:href"/>
+
+ <xsl:variable name="template">
+ <xsl:call-template name="gentext.template">
+ <xsl:with-param name="context" select="'glossary'"/>
+ <xsl:with-param name="name" select="'see'"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:variable name="title">
+ <xsl:choose>
+ <xsl:when test="$target">
+ <fo:basic-link internal-destination="{$otherterm}"
+ xsl:use-attribute-sets="xref.properties">
+ <xsl:apply-templates select="$target" mode="xref-to"/>
+ </fo:basic-link>
+ </xsl:when>
+ <xsl:when test="$xlink">
+ <xsl:call-template name="simple.xlink">
+ <xsl:with-param name="content">
+ <xsl:apply-templates/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="$otherterm != '' and not($target)">
+ <xsl:message>
+ <xsl:text>Warning: glosssee @otherterm reference not found: </xsl:text>
+ <xsl:value-of select="$otherterm"/>
+ </xsl:message>
+ <xsl:apply-templates mode="glossary.as.blocks"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates mode="glossary.as.blocks"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:call-template name="substitute-markup">
+ <xsl:with-param name="template" select="$template"/>
+ <xsl:with-param name="title" select="$title"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="glossentry/glossdef" mode="glossary.as.blocks">
+ <xsl:apply-templates select="*[local-name(.) != 'glossseealso']"
+ mode="glossary.as.blocks"/>
+ <xsl:if test="glossseealso">
+ <fo:block>
+ <xsl:variable name="template">
+ <xsl:call-template name="gentext.template">
+ <xsl:with-param name="context" select="'glossary'"/>
+ <xsl:with-param name="name" select="'seealso'"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:variable name="title">
+ <xsl:apply-templates select="glossseealso" mode="glossary.as.blocks"/>
+ </xsl:variable>
+ <xsl:call-template name="substitute-markup">
+ <xsl:with-param name="template" select="$template"/>
+ <xsl:with-param name="title" select="$title"/>
+ </xsl:call-template>
+ </fo:block>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="glossentry/glossdef/para[1]|glossentry/glossdef/simpara[1]"
+ mode="glossary.as.blocks">
+ <fo:block>
+ <xsl:apply-templates/>
+ </fo:block>
+</xsl:template>
+
+<!-- Handle any other glossdef content normally -->
+<xsl:template match="*" mode="glossary.as.blocks">
+ <xsl:apply-templates select="." />
+</xsl:template>
+
+<xsl:template match="glossseealso" mode="glossary.as.blocks">
+ <xsl:variable name="otherterm" select="@otherterm"/>
+ <xsl:variable name="targets" select="key('id', $otherterm)"/>
+ <xsl:variable name="target" select="$targets[1]"/>
+ <xsl:variable name="xlink" select="@xlink:href"/>
+
+ <xsl:choose>
+ <xsl:when test="$target">
+ <fo:basic-link internal-destination="{$otherterm}"
+ xsl:use-attribute-sets="xref.properties">
+ <xsl:apply-templates select="$target" mode="xref-to"/>
+ </fo:basic-link>
+ </xsl:when>
+ <xsl:when test="$xlink">
+ <xsl:call-template name="simple.xlink">
+ <xsl:with-param name="content">
+ <xsl:apply-templates/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="$otherterm != '' and not($target)">
+ <xsl:message>
+ <xsl:text>Warning: glossseealso @otherterm reference not found: </xsl:text>
+ <xsl:value-of select="$otherterm"/>
+ </xsl:message>
+ <xsl:apply-templates mode="glossary.as.blocks"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates mode="glossary.as.blocks"/>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:choose>
+ <xsl:when test="position() = last()"/>
+ <xsl:otherwise>
+ <xsl:call-template name="gentext.template">
+ <xsl:with-param name="context" select="'glossary'"/>
+ <xsl:with-param name="name" select="'seealso-separator'"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/graphics.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/graphics.xsl
new file mode 100644
index 0000000..bbbcc0d
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/graphics.xsl
@@ -0,0 +1,648 @@
+<?xml version='1.0'?>
+<!DOCTYPE xsl:stylesheet [
+<!ENTITY lowercase "'abcdefghijklmnopqrstuvwxyz'">
+<!ENTITY uppercase "'ABCDEFGHIJKLMNOPQRSTUVWXYZ'">
+ ]>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:fo="http://www.w3.org/1999/XSL/Format"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:stext="http://nwalsh.com/xslt/ext/com.nwalsh.saxon.TextFactory"
+ xmlns:xtext="com.nwalsh.xalan.Text"
+ xmlns:lxslt="http://xml.apache.org/xslt"
+ exclude-result-prefixes="xlink stext xtext lxslt"
+ extension-element-prefixes="stext xtext"
+ version='1.0'>
+
+<!-- ********************************************************************
+ $Id: graphics.xsl 8786 2010-07-28 17:26:46Z mzjn $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ Contributors:
+ Colin Paul Adams, <colin@colina.demon.co.uk>
+ Paul Grosso, <pgrosso@arbortext.com>
+
+ ******************************************************************** -->
+
+<!-- ==================================================================== -->
+<!-- Graphic format tests for the FO backend -->
+
+<xsl:param name="graphic.notations">
+ <!-- n.b. exactly one leading space, one trailing space, and one inter-word space -->
+ <xsl:choose>
+ <xsl:when test="$passivetex.extensions != 0">
+ <xsl:text> PNG PDF JPG JPEG linespecific </xsl:text>
+ </xsl:when>
+ <xsl:when test="$fop1.extensions != 0">
+ <xsl:text> BMP GIF TIFF SVG PNG EPS JPG JPEG linespecific </xsl:text>
+ </xsl:when>
+ <xsl:when test="$fop.extensions != 0">
+ <xsl:text> BMP GIF TIFF SVG PNG EPS JPG JPEG linespecific </xsl:text>
+ </xsl:when>
+ <xsl:when test="$arbortext.extensions != 0">
+ <xsl:text> PNG PDF JPG JPEG linespecific GIF GIF87a GIF89a TIFF BMP </xsl:text>
+ </xsl:when>
+ <xsl:when test="$xep.extensions != 0">
+ <xsl:text> SVG PNG PDF JPG JPEG linespecific GIF GIF87a GIF89a TIFF BMP </xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text> PNG PDF JPG JPEG linespecific GIF GIF87a GIF89a TIFF BMP </xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:param>
+
+<xsl:template name="is.graphic.format">
+ <xsl:param name="format"/>
+ <xsl:if test="contains($graphic.notations, concat(' ',$format,' '))">1</xsl:if>
+</xsl:template>
+
+<xsl:param name="graphic.extensions">
+ <!-- n.b. exactly one leading space, one trailing space, and one inter-word space -->
+ <xsl:choose>
+ <xsl:when test="$passivetex.extensions != 0">
+ <xsl:text> png pdf jpg jpeg </xsl:text>
+ </xsl:when>
+ <xsl:when test="$fop1.extensions != 0">
+ <xsl:text> bmp gif tif tiff svg png pdf jpg jpeg eps </xsl:text>
+ </xsl:when>
+ <xsl:when test="$fop.extensions != 0">
+ <xsl:text> bmp gif tif tiff svg png pdf jpg jpeg eps </xsl:text>
+ </xsl:when>
+ <xsl:when test="$arbortext.extensions != 0">
+ <xsl:text> png pdf jpg jpeg gif tif tiff bmp </xsl:text>
+ </xsl:when>
+ <xsl:when test="$xep.extensions != 0">
+ <xsl:text> svg png pdf jpg jpeg gif tif tiff bmp eps </xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text> svg png pdf jpg jpeg gif tif tiff bmp eps </xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:param>
+
+<xsl:template name="is.graphic.extension">
+ <xsl:param name="ext"/>
+ <xsl:variable name="lcext" select="translate($ext,
+ 'ABCDEFGHIJKLMNOPQRSTUVWXYZ',
+ 'abcdefghijklmnopqrstuvwxyz')"/>
+
+ <xsl:if test="contains($graphic.extensions,
+ concat(' ', $lcext, ' '))">1</xsl:if>
+</xsl:template>
+
+<xsl:template name="graphic.format.content-type">
+ <xsl:param name="format"/>
+ <xsl:variable name="is.graphic.format">
+ <xsl:call-template name="is.graphic.format">
+ <xsl:with-param name="format" select="$format"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:if test="$is.graphic.format">
+ <xsl:choose>
+ <xsl:when test="$format = ''"></xsl:when>
+ <xsl:when test="$format = 'linespecific'"></xsl:when>
+ <xsl:when test="$format = 'PS'">application/postscript</xsl:when>
+ <xsl:when test="$format = 'PDF'">application/pdf</xsl:when>
+ <xsl:when test="$format = 'PNG'">image/png</xsl:when>
+ <xsl:when test="$format = 'SVG'">image/svg+xml</xsl:when>
+ <xsl:when test="$format = 'JPG'">image/jpeg</xsl:when>
+ <xsl:when test="$format = 'GIF87a'">image/gif</xsl:when>
+ <xsl:when test="$format = 'GIF89a'">image/gif</xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="concat('image/',
+ translate($format, &uppercase;, &lowercase;))"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:if>
+</xsl:template>
+
+
+<!-- ==================================================================== -->
+
+<xsl:template match="screenshot">
+ <fo:block>
+ <xsl:apply-templates/>
+ </fo:block>
+</xsl:template>
+
+<xsl:template match="screeninfo">
+</xsl:template>
+
+<!-- ==================================================================== -->
+<!-- Override these templates for FO -->
+<!-- ==================================================================== -->
+
+<xsl:template name="process.image">
+ <!-- When this template is called, the current node should be -->
+ <!-- a graphic, inlinegraphic, imagedata, or videodata. All -->
+ <!-- those elements have the same set of attributes, so we can -->
+ <!-- handle them all in one place. -->
+
+ <xsl:variable name="scalefit">
+ <xsl:choose>
+ <xsl:when test="$ignore.image.scaling != 0">0</xsl:when>
+ <xsl:when test="@contentwidth">0</xsl:when>
+ <xsl:when test="@contentdepth and
+ @contentdepth != '100%'">0</xsl:when>
+ <xsl:when test="@scale">0</xsl:when>
+ <xsl:when test="@scalefit"><xsl:value-of select="@scalefit"/></xsl:when>
+ <xsl:when test="@width or @depth">1</xsl:when>
+ <xsl:when test="$default.image.width != ''">1</xsl:when>
+ <xsl:otherwise>0</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="scale">
+ <xsl:choose>
+ <xsl:when test="$ignore.image.scaling != 0">0</xsl:when>
+ <xsl:when test="@contentwidth or @contentdepth">1.0</xsl:when>
+ <xsl:when test="@scale">
+ <xsl:value-of select="@scale div 100.0"/>
+ </xsl:when>
+ <xsl:otherwise>1.0</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="filename">
+ <xsl:choose>
+ <xsl:when test="local-name(.) = 'graphic'
+ or local-name(.) = 'inlinegraphic'">
+ <!-- handle legacy graphic and inlinegraphic by new template -->
+ <xsl:call-template name="mediaobject.filename">
+ <xsl:with-param name="object" select="."/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <!-- imagedata, videodata, audiodata -->
+ <xsl:call-template name="mediaobject.filename">
+ <xsl:with-param name="object" select=".."/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="content-type">
+ <xsl:if test="@format">
+ <xsl:call-template name="graphic.format.content-type">
+ <xsl:with-param name="format" select="@format"/>
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:variable>
+
+ <xsl:variable name="bgcolor">
+ <xsl:call-template name="pi.dbfo_background-color">
+ <xsl:with-param name="node" select=".."/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <fo:external-graphic>
+ <xsl:attribute name="src">
+ <xsl:call-template name="fo-external-image">
+ <xsl:with-param name="filename">
+ <xsl:if test="$img.src.path != '' and
+ not(starts-with($filename, '/')) and
+ not(contains($filename, '://'))">
+ <xsl:value-of select="$img.src.path"/>
+ </xsl:if>
+ <xsl:value-of select="$filename"/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:attribute>
+
+ <xsl:attribute name="width">
+ <xsl:choose>
+ <xsl:when test="$ignore.image.scaling != 0">auto</xsl:when>
+ <xsl:when test="contains(@width,'%')">
+ <xsl:value-of select="@width"/>
+ </xsl:when>
+ <xsl:when test="@width and not(@width = '')">
+ <xsl:call-template name="length-spec">
+ <xsl:with-param name="length" select="@width"/>
+ <xsl:with-param name="default.units" select="'px'"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="not(@depth) and $default.image.width != ''">
+ <xsl:call-template name="length-spec">
+ <xsl:with-param name="length" select="$default.image.width"/>
+ <xsl:with-param name="default.units" select="'px'"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>auto</xsl:otherwise>
+ </xsl:choose>
+ </xsl:attribute>
+
+ <xsl:attribute name="height">
+ <xsl:choose>
+ <xsl:when test="$ignore.image.scaling != 0">auto</xsl:when>
+ <xsl:when test="contains(@depth,'%')">
+ <xsl:value-of select="@depth"/>
+ </xsl:when>
+ <xsl:when test="@depth">
+ <xsl:call-template name="length-spec">
+ <xsl:with-param name="length" select="@depth"/>
+ <xsl:with-param name="default.units" select="'px'"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>auto</xsl:otherwise>
+ </xsl:choose>
+ </xsl:attribute>
+
+ <xsl:attribute name="content-width">
+ <xsl:choose>
+ <xsl:when test="$ignore.image.scaling != 0">auto</xsl:when>
+ <xsl:when test="contains(@contentwidth,'%')">
+ <xsl:value-of select="@contentwidth"/>
+ </xsl:when>
+ <xsl:when test="@contentwidth">
+ <xsl:call-template name="length-spec">
+ <xsl:with-param name="length" select="@contentwidth"/>
+ <xsl:with-param name="default.units" select="'px'"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="number($scale) != 1.0">
+ <xsl:value-of select="$scale * 100"/>
+ <xsl:text>%</xsl:text>
+ </xsl:when>
+ <xsl:when test="$scalefit = 1">scale-to-fit</xsl:when>
+ <xsl:otherwise>auto</xsl:otherwise>
+ </xsl:choose>
+ </xsl:attribute>
+
+ <xsl:attribute name="content-height">
+ <xsl:choose>
+ <xsl:when test="$ignore.image.scaling != 0">auto</xsl:when>
+ <xsl:when test="contains(@contentdepth,'%')">
+ <xsl:value-of select="@contentdepth"/>
+ </xsl:when>
+ <xsl:when test="@contentdepth">
+ <xsl:call-template name="length-spec">
+ <xsl:with-param name="length" select="@contentdepth"/>
+ <xsl:with-param name="default.units" select="'px'"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="number($scale) != 1.0">
+ <xsl:value-of select="$scale * 100"/>
+ <xsl:text>%</xsl:text>
+ </xsl:when>
+ <xsl:when test="$scalefit = 1">scale-to-fit</xsl:when>
+ <xsl:otherwise>auto</xsl:otherwise>
+ </xsl:choose>
+ </xsl:attribute>
+
+ <xsl:if test="$content-type != ''">
+ <xsl:attribute name="content-type">
+ <xsl:value-of select="concat('content-type:',$content-type)"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:if test="$bgcolor != ''">
+ <xsl:attribute name="background-color">
+ <xsl:value-of select="$bgcolor"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:if test="@align">
+ <xsl:attribute name="text-align">
+ <xsl:value-of select="@align"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:if test="@valign">
+ <xsl:attribute name="display-align">
+ <xsl:choose>
+ <xsl:when test="@valign = 'top'">before</xsl:when>
+ <xsl:when test="@valign = 'middle'">center</xsl:when>
+ <xsl:when test="@valign = 'bottom'">after</xsl:when>
+ <xsl:otherwise>auto</xsl:otherwise>
+ </xsl:choose>
+ </xsl:attribute>
+ </xsl:if>
+ </fo:external-graphic>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="graphic">
+ <xsl:choose>
+ <xsl:when test="parent::inlineequation">
+ <xsl:call-template name="process.image"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <fo:block>
+ <xsl:if test="@align">
+ <xsl:attribute name="text-align">
+ <xsl:value-of select="@align"/>
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:call-template name="process.image"/>
+ </fo:block>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="inlinegraphic">
+ <xsl:variable name="vendor" select="system-property('xsl:vendor')"/>
+ <xsl:variable name="filename">
+ <xsl:choose>
+ <xsl:when test="@entityref">
+ <xsl:value-of select="unparsed-entity-uri(@entityref)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="@fileref"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="@format='linespecific'">
+ <xsl:choose>
+ <xsl:when test="$use.extensions != '0'
+ and $textinsert.extension != '0'">
+ <xsl:choose>
+ <xsl:when test="contains($vendor, 'SAXON')">
+ <stext:insertfile href="{$filename}" encoding="{$textdata.default.encoding}"/>
+ </xsl:when>
+ <xsl:when test="contains($vendor, 'Apache Software Foundation')">
+ <xtext:insertfile href="{$filename}"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:message terminate="yes">
+ <xsl:text>Don't know how to insert files with </xsl:text>
+ <xsl:value-of select="$vendor"/>
+ </xsl:message>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:message terminate="yes">
+ <xsl:text>Cannot insert </xsl:text><xsl:value-of select="$filename"/>
+ <xsl:text>. Check use.extensions and textinsert.extension parameters.</xsl:text>
+ </xsl:message>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="process.image"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="mediaobject|mediaobjectco">
+
+ <xsl:variable name="olist" select="imageobject|imageobjectco
+ |videoobject|audioobject
+ |textobject"/>
+
+ <xsl:variable name="object.index">
+ <xsl:call-template name="select.mediaobject.index">
+ <xsl:with-param name="olist" select="$olist"/>
+ <xsl:with-param name="count" select="1"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="object" select="$olist[position() = $object.index]"/>
+
+ <xsl:variable name="align">
+ <xsl:value-of select="$object/descendant::imagedata[@align][1]/@align"/>
+ </xsl:variable>
+
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+
+ <fo:block id="{$id}">
+ <xsl:if test="$align != '' ">
+ <xsl:attribute name="text-align">
+ <xsl:value-of select="$align"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:apply-templates select="$object"/>
+ <xsl:apply-templates select="caption"/>
+ </fo:block>
+</xsl:template>
+
+<xsl:template match="inlinemediaobject">
+ <xsl:call-template name="select.mediaobject"/>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="imageobjectco">
+ <xsl:apply-templates select="imageobject"/>
+ <xsl:apply-templates select="calloutlist"/>
+</xsl:template>
+
+<xsl:template match="imageobject">
+ <xsl:choose>
+ <xsl:when test="imagedata">
+ <xsl:apply-templates select="imagedata"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <fo:instream-foreign-object>
+ <xsl:apply-templates mode="copy-all"/>
+ </fo:instream-foreign-object>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="*" mode="copy-all">
+ <xsl:copy>
+ <xsl:for-each select="@*">
+ <xsl:copy/>
+ </xsl:for-each>
+ <xsl:apply-templates mode="copy-all"/>
+ </xsl:copy>
+</xsl:template>
+
+<xsl:template match="text()|comment()|processing-instruction()" mode="copy-all">
+ <xsl:copy/>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="imagedata">
+ <xsl:variable name="vendor" select="system-property('xsl:vendor')"/>
+ <xsl:variable name="filename">
+ <xsl:call-template name="mediaobject.filename">
+ <xsl:with-param name="object" select=".."/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="mml:*" xmlns:mml="http://www.w3.org/1998/Math/MathML">
+ <xsl:apply-templates/>
+ </xsl:when>
+
+ <xsl:when test="svg:*" xmlns:svg="http://www.w3.org/2000/svg">
+ <fo:instream-foreign-object>
+ <xsl:apply-templates mode="copy-all" select="*"/>
+ </fo:instream-foreign-object>
+ </xsl:when>
+
+ <xsl:when test="@format='linespecific'">
+ <xsl:choose>
+ <xsl:when test="$use.extensions != '0'
+ and $textinsert.extension != '0'">
+ <xsl:choose>
+ <xsl:when test="contains($vendor, 'SAXON')">
+ <stext:insertfile href="{$filename}" encoding="{$textdata.default.encoding}"/>
+ </xsl:when>
+ <xsl:when test="contains($vendor, 'Apache Software Foundation')">
+ <xtext:insertfile href="{$filename}"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:message terminate="yes">
+ <xsl:text>Don't know how to insert files with </xsl:text>
+ <xsl:value-of select="$vendor"/>
+ </xsl:message>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:message terminate="yes">
+ <xsl:text>Cannot insert </xsl:text><xsl:value-of select="$filename"/>
+ <xsl:text>. Check use.extensions and textinsert.extension parameters.</xsl:text>
+ </xsl:message>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="process.image"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="videoobject">
+ <xsl:apply-templates select="videodata"/>
+</xsl:template>
+
+<xsl:template match="videodata">
+ <xsl:call-template name="process.image"/>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="audioobject">
+ <xsl:apply-templates select="audiodata"/>
+</xsl:template>
+
+<xsl:template match="audiodata">
+ <xsl:call-template name="process.image"/>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="textobject">
+ <xsl:apply-templates/>
+</xsl:template>
+
+<xsl:template match="textdata">
+ <xsl:variable name="vendor" select="system-property('xsl:vendor')"/>
+ <xsl:variable name="filename">
+ <xsl:choose>
+ <xsl:when test="@entityref">
+ <xsl:value-of select="unparsed-entity-uri(@entityref)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="@fileref"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="encoding">
+ <xsl:choose>
+ <xsl:when test="@encoding">
+ <xsl:value-of select="@encoding"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$textdata.default.encoding"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="$use.extensions != '0'
+ and $textinsert.extension != '0'">
+ <xsl:choose>
+ <xsl:when test="element-available('stext:insertfile')">
+ <stext:insertfile href="{$filename}" encoding="{$encoding}"/>
+ </xsl:when>
+ <xsl:when test="element-available('xtext:insertfile')">
+ <xtext:insertfile href="{$filename}"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:message terminate="yes">
+ <xsl:text>Don't know how to insert files with </xsl:text>
+ <xsl:value-of select="$vendor"/>
+ </xsl:message>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:message terminate="yes">
+ <xsl:text>Cannot insert </xsl:text><xsl:value-of select="$filename"/>
+ <xsl:text>. Check use.extensions and textinsert.extension parameters.</xsl:text>
+ </xsl:message>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="caption">
+ <fo:block>
+ <xsl:if test="@align = 'right' or @align = 'left' or @align='center'">
+ <xsl:attribute name="text-align"><xsl:value-of
+ select="@align"/></xsl:attribute>
+ </xsl:if>
+ <xsl:apply-templates/>
+ </fo:block>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template name="fo-external-image">
+ <xsl:param name="filename"/>
+
+ <xsl:choose>
+ <xsl:when test="$passivetex.extensions != 0
+ or $fop.extensions != 0">
+ <xsl:value-of select="$filename"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="concat('url(', $filename, ')')"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- Resolve xml:base attributes -->
+<xsl:template match="@fileref">
+ <!-- need a check for absolute urls -->
+ <xsl:choose>
+ <xsl:when test="contains(., ':') or starts-with(.,'/')">
+ <!-- it has a uri scheme or starts with '/', so it is an absolute uri -->
+ <xsl:value-of select="."/>
+ </xsl:when>
+ <xsl:when test="$keep.relative.image.uris != 0">
+ <!-- leave it alone -->
+ <xsl:value-of select="."/>
+ </xsl:when>
+ <xsl:otherwise>
+ <!-- its a relative uri -->
+ <xsl:call-template name="relative-uri">
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/highlight.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/highlight.xsl
new file mode 100644
index 0000000..7843ad2
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/highlight.xsl
@@ -0,0 +1,77 @@
+<?xml version='1.0'?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:fo="http://www.w3.org/1999/XSL/Format"
+ xmlns:xslthl="http://xslthl.sf.net"
+ exclude-result-prefixes="xslthl"
+ version='1.0'>
+
+<!-- ********************************************************************
+ $Id: highlight.xsl 8419 2009-04-29 20:37:52Z kosek $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ and other information.
+
+ ******************************************************************** -->
+
+<xsl:import href="../highlighting/common.xsl"/>
+
+<xsl:template match='xslthl:keyword' mode="xslthl">
+ <fo:inline font-weight="bold"><xsl:apply-templates mode="xslthl"/></fo:inline>
+</xsl:template>
+
+<xsl:template match='xslthl:string' mode="xslthl">
+ <fo:inline font-weight="bold" font-style="italic"><xsl:apply-templates mode="xslthl"/></fo:inline>
+</xsl:template>
+
+<xsl:template match='xslthl:comment' mode="xslthl">
+ <fo:inline font-style="italic"><xsl:apply-templates mode="xslthl"/></fo:inline>
+</xsl:template>
+
+<xsl:template match='xslthl:tag' mode="xslthl">
+ <fo:inline font-weight="bold"><xsl:apply-templates mode="xslthl"/></fo:inline>
+</xsl:template>
+
+<xsl:template match='xslthl:attribute' mode="xslthl">
+ <fo:inline font-weight="bold"><xsl:apply-templates mode="xslthl"/></fo:inline>
+</xsl:template>
+
+<xsl:template match='xslthl:value' mode="xslthl">
+ <fo:inline font-weight="bold"><xsl:apply-templates mode="xslthl"/></fo:inline>
+</xsl:template>
+
+<!--
+<xsl:template match='xslthl:html'>
+ <span style='background:#AFF'><font color='blue'><xsl:apply-templates/></font></span>
+</xsl:template>
+
+<xsl:template match='xslthl:xslt'>
+ <span style='background:#AAA'><font color='blue'><xsl:apply-templates/></font></span>
+</xsl:template>
+
+<xsl:template match='xslthl:section'>
+ <span style='background:yellow'><xsl:apply-templates/></span>
+</xsl:template>
+-->
+
+<xsl:template match='xslthl:number' mode="xslthl">
+ <xsl:apply-templates mode="xslthl"/>
+</xsl:template>
+
+<xsl:template match='xslthl:annotation' mode="xslthl">
+ <fo:inline color="gray"><xsl:apply-templates mode="xslthl"/></fo:inline>
+</xsl:template>
+
+<xsl:template match='xslthl:directive' mode="xslthl">
+ <xsl:apply-templates mode="xslthl"/>
+</xsl:template>
+
+<!-- Not sure which element will be in final XSLTHL 2.0 -->
+<xsl:template match='xslthl:doccomment|xslthl:doctype' mode="xslthl">
+ <fo:inline font-weight="bold"><xsl:apply-templates mode="xslthl"/></fo:inline>
+</xsl:template>
+
+
+</xsl:stylesheet>
+
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/htmltbl.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/htmltbl.xsl
new file mode 100644
index 0000000..4918b8a
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/htmltbl.xsl
@@ -0,0 +1,425 @@
+<?xml version="1.0"?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:fo="http://www.w3.org/1999/XSL/Format"
+ version="1.0">
+
+<!-- ********************************************************************
+ $Id: htmltbl.xsl 8392 2009-04-01 08:47:55Z bobstayton $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<!-- ==================================================================== -->
+
+<!-- Outputs an fo:table only, not the caption -->
+<xsl:template match="table|informaltable" mode="htmlTable">
+
+ <xsl:variable name="numcols">
+ <xsl:call-template name="widest-html-row">
+ <xsl:with-param name="rows" select=".//tr"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="prop-columns"
+ select=".//col[contains(@width, '%')] |
+ .//colgroup[contains(@width, '%')]"/>
+
+ <xsl:variable name="table.width">
+ <xsl:call-template name="table.width"/>
+ </xsl:variable>
+
+ <fo:table xsl:use-attribute-sets="table.table.properties">
+ <xsl:choose>
+ <xsl:when test="$fop.extensions != 0 or
+ $passivetex.extensions != 0">
+ <xsl:attribute name="table-layout">fixed</xsl:attribute>
+ </xsl:when>
+ </xsl:choose>
+
+ <xsl:attribute name="width">
+ <xsl:choose>
+ <xsl:when test="@width">
+ <xsl:value-of select="@width"/>
+ </xsl:when>
+ <xsl:when test="$table.width">
+ <xsl:value-of select="$table.width"/>
+ </xsl:when>
+ <xsl:otherwise>100%</xsl:otherwise>
+ </xsl:choose>
+ </xsl:attribute>
+
+ <xsl:call-template name="table.frame">
+ <xsl:with-param name="frame">
+ <xsl:choose>
+ <xsl:when test="@frame = 'box'">all</xsl:when>
+ <xsl:when test="@frame = 'border'">all</xsl:when>
+ <xsl:when test="@frame = 'below'">bottom</xsl:when>
+ <xsl:when test="@frame = 'above'">top</xsl:when>
+ <xsl:when test="@frame = 'hsides'">topbot</xsl:when>
+ <xsl:when test="@frame = 'vsides'">sides</xsl:when>
+ <xsl:when test="@frame = 'lhs'">lhs</xsl:when>
+ <xsl:when test="@frame = 'rhs'">rhs</xsl:when>
+ <xsl:when test="@frame = 'void'">none</xsl:when>
+ <xsl:when test="@border != '' and @border != 0">all</xsl:when>
+ <xsl:when test="@border != '' and @border = 0">none</xsl:when>
+ <xsl:when test="@frame != ''">
+ <xsl:value-of select="@frame"/>
+ </xsl:when>
+ <xsl:when test="$default.table.frame != ''">
+ <xsl:value-of select="$default.table.frame"/>
+ </xsl:when>
+ <xsl:otherwise>all</xsl:otherwise>
+ </xsl:choose>
+ </xsl:with-param>
+ </xsl:call-template>
+
+ <xsl:call-template name="make-html-table-columns">
+ <xsl:with-param name="count" select="$numcols"/>
+ </xsl:call-template>
+
+ <xsl:apply-templates select="thead" mode="htmlTable"/>
+ <xsl:apply-templates select="tfoot" mode="htmlTable"/>
+ <xsl:choose>
+ <xsl:when test="tbody">
+ <xsl:apply-templates select="tbody" mode="htmlTable"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <fo:table-body start-indent="0pt" end-indent="0pt">
+ <xsl:apply-templates select="tr" mode="htmlTable"/>
+ </fo:table-body>
+ </xsl:otherwise>
+ </xsl:choose>
+ </fo:table>
+
+</xsl:template>
+
+<!-- This template writes rowsep or colsep equivalant for html tables -->
+<xsl:template name="html.table.cell.rules">
+ <xsl:variable name="border"
+ select="(ancestor::table |
+ ancestor::informaltable)[last()]/@border"/>
+ <xsl:variable name="table.rules"
+ select="(ancestor::table |
+ ancestor::informaltable)[last()]/@rules"/>
+
+ <xsl:variable name="rules">
+ <xsl:choose>
+ <xsl:when test="$table.rules != ''">
+ <xsl:value-of select="$table.rules"/>
+ </xsl:when>
+ <xsl:when test="$default.table.rules != ''">
+ <xsl:value-of select="$default.table.rules"/>
+ </xsl:when>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="$border != '' and $border != 0">
+ <xsl:attribute name="border">
+ <xsl:value-of select="$table.cell.border.thickness"/>
+ <xsl:text> </xsl:text>
+ <xsl:value-of select="$table.cell.border.style"/>
+ <xsl:text> </xsl:text>
+ <xsl:value-of select="$table.cell.border.color"/>
+ </xsl:attribute>
+ </xsl:when>
+ <xsl:when test="$rules = 'none'">
+ <xsl:attribute name="border-start-style">none</xsl:attribute>
+ <xsl:attribute name="border-end-style">none</xsl:attribute>
+ <xsl:attribute name="border-top-style">none</xsl:attribute>
+ <xsl:attribute name="border-bottom-style">none</xsl:attribute>
+ </xsl:when>
+
+ <xsl:when test="$rules = 'cols' and following-sibling::*">
+ <!-- If not the last column, add border after -->
+ <xsl:attribute name="border-start-style">none</xsl:attribute>
+ <xsl:attribute name="border-top-style">none</xsl:attribute>
+ <xsl:attribute name="border-bottom-style">none</xsl:attribute>
+ <xsl:attribute name="border-end-style">
+ <xsl:value-of select="$table.frame.border.style"/>
+ </xsl:attribute>
+ <xsl:attribute name="border-end-width">
+ <xsl:value-of select="$table.frame.border.thickness"/>
+ </xsl:attribute>
+ <xsl:attribute name="border-end-color">
+ <xsl:value-of select="$table.frame.border.color"/>
+ </xsl:attribute>
+ </xsl:when>
+ <!-- If not the last row, add border below -->
+ <xsl:when test="$rules = 'rows'">
+ <xsl:variable name="rowborder">
+ <xsl:choose>
+ <!-- If in thead and tbody has rows, add border -->
+ <xsl:when test="parent::tr/parent::thead/
+ following-sibling::tbody/tr">1</xsl:when>
+ <!-- If in tbody and tfoot has rows, add border -->
+ <xsl:when test="parent::tr/parent::tbody/
+ following-sibling::tfoot/tr">1</xsl:when>
+ <xsl:when test="parent::tr/parent::tbody/
+ preceding-sibling::tfoot/tr">1</xsl:when>
+ <!-- If following rows, but not rowspan reaches last row -->
+ <xsl:when test="parent::tr/following-sibling::tr and
+ not(@rowspan = count(parent::tr/following-sibling::tr) + 1)">1</xsl:when>
+ <xsl:otherwise>0</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:if test="$rowborder = 1">
+ <xsl:attribute name="border-start-style">none</xsl:attribute>
+ <xsl:attribute name="border-end-style">none</xsl:attribute>
+ <xsl:attribute name="border-top-style">none</xsl:attribute>
+ <xsl:attribute name="border-bottom-style">
+ <xsl:value-of select="$table.frame.border.style"/>
+ </xsl:attribute>
+ <xsl:attribute name="border-bottom-width">
+ <xsl:value-of select="$table.frame.border.thickness"/>
+ </xsl:attribute>
+ <xsl:attribute name="border-bottom-color">
+ <xsl:value-of select="$table.frame.border.color"/>
+ </xsl:attribute>
+ </xsl:if>
+ </xsl:when>
+ <xsl:when test="$rules = 'all'">
+ <xsl:attribute name="border-start-style">none</xsl:attribute>
+ <xsl:attribute name="border-top-style">none</xsl:attribute>
+
+ <xsl:variable name="rowborder">
+ <xsl:choose>
+ <!-- If in thead and tbody has rows, add border -->
+ <xsl:when test="parent::tr/parent::thead/
+ following-sibling::tbody/tr">1</xsl:when>
+ <!-- If in tbody and tfoot has rows, add border -->
+ <xsl:when test="parent::tr/parent::tbody/
+ following-sibling::tfoot/tr">1</xsl:when>
+ <xsl:when test="parent::tr/parent::tbody/
+ preceding-sibling::tfoot/tr">1</xsl:when>
+ <!-- If following rows, but not rowspan reaches last row -->
+ <xsl:when test="parent::tr/following-sibling::tr and
+ not(@rowspan = count(parent::tr/following-sibling::tr) + 1)">1</xsl:when>
+ <xsl:otherwise>0</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:if test="$rowborder = 1">
+ <xsl:attribute name="border-bottom-style">
+ <xsl:value-of select="$table.frame.border.style"/>
+ </xsl:attribute>
+ <xsl:attribute name="border-bottom-width">
+ <xsl:value-of select="$table.frame.border.thickness"/>
+ </xsl:attribute>
+ <xsl:attribute name="border-bottom-color">
+ <xsl:value-of select="$table.frame.border.color"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:if test="following-sibling::*">
+ <!-- If not the last column, add border after -->
+ <xsl:attribute name="border-end-style">
+ <xsl:value-of select="$table.frame.border.style"/>
+ </xsl:attribute>
+ <xsl:attribute name="border-end-width">
+ <xsl:value-of select="$table.frame.border.thickness"/>
+ </xsl:attribute>
+ <xsl:attribute name="border-end-color">
+ <xsl:value-of select="$table.frame.border.color"/>
+ </xsl:attribute>
+ </xsl:if>
+ </xsl:when>
+ <xsl:when test="$rules = 'groups' and ancestor::thead
+ and not(parent::tr/following-sibling::tr)">
+ <xsl:attribute name="border-start-style">none</xsl:attribute>
+ <xsl:attribute name="border-end-style">none</xsl:attribute>
+ <xsl:attribute name="border-top-style">none</xsl:attribute>
+ <xsl:attribute name="border-bottom-style">
+ <xsl:value-of select="$table.frame.border.style"/>
+ </xsl:attribute>
+ <xsl:attribute name="border-bottom-width">
+ <xsl:value-of select="$table.frame.border.thickness"/>
+ </xsl:attribute>
+ <xsl:attribute name="border-bottom-color">
+ <xsl:value-of select="$table.frame.border.color"/>
+ </xsl:attribute>
+ </xsl:when>
+ <xsl:when test="$rules = 'groups' and ancestor::tfoot
+ and not(parent::tr/preceding-sibling::tr)">
+ <xsl:attribute name="border-start-style">none</xsl:attribute>
+ <xsl:attribute name="border-end-style">none</xsl:attribute>
+ <xsl:attribute name="border-top-style">none</xsl:attribute>
+ <xsl:attribute name="border-top-style">
+ <xsl:value-of select="$table.frame.border.style"/>
+ </xsl:attribute>
+ <xsl:attribute name="border-top-width">
+ <xsl:value-of select="$table.frame.border.thickness"/>
+ </xsl:attribute>
+ <xsl:attribute name="border-top-color">
+ <xsl:value-of select="$table.frame.border.color"/>
+ </xsl:attribute>
+ </xsl:when>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="caption" mode="htmlTable">
+ <!-- Handled by formal.object.heading -->
+</xsl:template>
+
+<xsl:template name="widest-html-row">
+ <xsl:param name="rows" select="''"/>
+ <xsl:param name="count" select="0"/>
+ <xsl:choose>
+ <xsl:when test="count($rows) = 0">
+ <xsl:value-of select="$count"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:choose>
+ <xsl:when test="$count &gt; count($rows[1]/*)">
+ <xsl:call-template name="widest-html-row">
+ <xsl:with-param name="rows" select="$rows[position() &gt; 1]"/>
+ <xsl:with-param name="count" select="$count"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="widest-html-row">
+ <xsl:with-param name="rows" select="$rows[position() &gt; 1]"/>
+ <xsl:with-param name="count" select="count($rows[1]/*)"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="make-html-table-columns">
+ <xsl:param name="count" select="0"/>
+ <xsl:param name="number" select="1"/>
+
+ <xsl:choose>
+ <xsl:when test="col|colgroup/col">
+ <xsl:for-each select="col|colgroup/col">
+ <fo:table-column>
+ <xsl:attribute name="column-number">
+ <xsl:number from="table|informaltable" level="any" format="1"/>
+ </xsl:attribute>
+ <xsl:if test="@width">
+ <xsl:attribute name="column-width">
+ <xsl:choose>
+ <xsl:when test="$fop.extensions != 0 and
+ contains(@width, '%')">
+ <xsl:value-of select="concat('proportional-column-width(',
+ substring-before(@width, '%'),
+ ')')"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="@width"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:attribute>
+ </xsl:if>
+ </fo:table-column>
+ </xsl:for-each>
+ </xsl:when>
+ <xsl:when test="$fop.extensions != 0">
+ <xsl:if test="$number &lt;= $count">
+ <fo:table-column column-number="{$number}"
+ column-width="{6.5 div $count}in"/>
+ <xsl:call-template name="make-html-table-columns">
+ <xsl:with-param name="count" select="$count"/>
+ <xsl:with-param name="number" select="$number + 1"/>
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:when>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="tbody" mode="htmlTable">
+ <fo:table-body start-indent="0pt"
+ end-indent="0pt">
+ <xsl:apply-templates mode="htmlTable"/>
+ </fo:table-body>
+</xsl:template>
+
+<xsl:template match="tfoot" mode="htmlTable">
+ <fo:table-footer start-indent="0pt"
+ end-indent="0pt">
+ <xsl:apply-templates mode="htmlTable"/>
+ </fo:table-footer>
+</xsl:template>
+
+<xsl:template match="th|td" mode="htmlTable">
+ <xsl:variable name="bgcolor.pi">
+ <xsl:call-template name="pi.dbfo_bgcolor"/>
+ </xsl:variable>
+
+ <xsl:variable name="bgcolor">
+ <xsl:choose>
+ <xsl:when test="$bgcolor.pi != ''">
+ <xsl:value-of select="$bgcolor.pi"/>
+ </xsl:when>
+ <xsl:when test="string-length(@bgcolor) != 0">
+ <xsl:value-of select="@bgcolor"/>
+ </xsl:when>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="align">
+ <xsl:call-template name="inherited.table.attribute">
+ <xsl:with-param name="entry" select="."/>
+ <xsl:with-param name="row" select="parent::tr"/>
+ <xsl:with-param name="attribute" select="'align'"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="valign">
+ <xsl:call-template name="inherited.table.attribute">
+ <xsl:with-param name="entry" select="."/>
+ <xsl:with-param name="row" select="parent::tr"/>
+ <xsl:with-param name="attribute" select="'valign'"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <fo:table-cell xsl:use-attribute-sets="table.cell.padding">
+ <xsl:call-template name="table.cell.properties">
+ <xsl:with-param name="bgcolor.pi" select="$bgcolor"/>
+ <xsl:with-param name="rowsep.inherit" select="0"/>
+ <xsl:with-param name="align.inherit" select="$align"/>
+ <xsl:with-param name="valign.inherit" select="$valign"/>
+ <xsl:with-param name="colsep.inherit" select="0"/>
+ </xsl:call-template>
+
+ <xsl:if test="@colspan &gt; 1">
+ <xsl:attribute name="number-columns-spanned">
+ <xsl:value-of select="@colspan"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:if test="@rowspan &gt; 1">
+ <xsl:attribute name="number-rows-spanned">
+ <xsl:value-of select="@rowspan"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <fo:block>
+ <xsl:call-template name="table.cell.block.properties"/>
+ <xsl:apply-templates/>
+ </fo:block>
+ </fo:table-cell>
+</xsl:template>
+
+<xsl:template match="thead" mode="htmlTable">
+ <fo:table-header start-indent="0pt"
+ end-indent="0pt">
+ <xsl:apply-templates mode="htmlTable"/>
+ </fo:table-header>
+</xsl:template>
+
+<xsl:template match="tr" mode="htmlTable">
+ <fo:table-row>
+ <xsl:call-template name="table.row.properties"/>
+ <xsl:apply-templates mode="htmlTable"/>
+ </fo:table-row>
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/index.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/index.xsl
new file mode 100644
index 0000000..ff298d1
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/index.xsl
@@ -0,0 +1,484 @@
+<?xml version='1.0'?>
+<!DOCTYPE xsl:stylesheet [
+<!ENTITY % common.entities SYSTEM "../common/entities.ent">
+%common.entities;
+]>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:fo="http://www.w3.org/1999/XSL/Format"
+ xmlns:rx="http://www.renderx.com/XSL/Extensions"
+ version='1.0'>
+
+<!-- ********************************************************************
+ $Id: index.xsl 8724 2010-07-15 07:53:27Z kosek $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<!-- ==================================================================== -->
+
+<xsl:template match="index">
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+
+ <xsl:if test="$generate.index != 0">
+ <xsl:choose>
+ <xsl:when test="$make.index.markup != 0">
+ <fo:block>
+ <xsl:call-template name="generate-index-markup">
+ <xsl:with-param name="scope" select="(ancestor::book|/)[last()]"/>
+ </xsl:call-template>
+ </fo:block>
+ </xsl:when>
+ <xsl:otherwise>
+ <fo:block id="{$id}">
+ <xsl:call-template name="index.titlepage"/>
+ </fo:block>
+ <xsl:apply-templates/>
+ <xsl:if test="count(indexentry) = 0 and count(indexdiv) = 0">
+ <xsl:call-template name="generate-index">
+ <xsl:with-param name="scope" select="(ancestor::book|/)[last()]"/>
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="book/index|part/index">
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+
+ <xsl:if test="$generate.index != 0">
+ <xsl:variable name="master-reference">
+ <xsl:call-template name="select.pagemaster">
+ <xsl:with-param name="pageclass">
+ <xsl:if test="$make.index.markup != 0">body</xsl:if>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <fo:page-sequence hyphenate="{$hyphenate}"
+ master-reference="{$master-reference}">
+ <xsl:attribute name="language">
+ <xsl:call-template name="l10n.language"/>
+ </xsl:attribute>
+ <xsl:attribute name="format">
+ <xsl:call-template name="page.number.format">
+ <xsl:with-param name="master-reference" select="$master-reference"/>
+ </xsl:call-template>
+ </xsl:attribute>
+
+ <xsl:attribute name="initial-page-number">
+ <xsl:call-template name="initial.page.number">
+ <xsl:with-param name="master-reference" select="$master-reference"/>
+ </xsl:call-template>
+ </xsl:attribute>
+
+ <xsl:attribute name="force-page-count">
+ <xsl:call-template name="force.page.count">
+ <xsl:with-param name="master-reference" select="$master-reference"/>
+ </xsl:call-template>
+ </xsl:attribute>
+
+ <xsl:attribute name="hyphenation-character">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'hyphenation-character'"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:attribute name="hyphenation-push-character-count">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'hyphenation-push-character-count'"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:attribute name="hyphenation-remain-character-count">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'hyphenation-remain-character-count'"/>
+ </xsl:call-template>
+ </xsl:attribute>
+
+ <xsl:apply-templates select="." mode="running.head.mode">
+ <xsl:with-param name="master-reference" select="$master-reference"/>
+ </xsl:apply-templates>
+ <xsl:apply-templates select="." mode="running.foot.mode">
+ <xsl:with-param name="master-reference" select="$master-reference"/>
+ </xsl:apply-templates>
+
+ <fo:flow flow-name="xsl-region-body">
+ <xsl:call-template name="set.flow.properties">
+ <xsl:with-param name="element" select="local-name(.)"/>
+ <xsl:with-param name="master-reference" select="$master-reference"/>
+ </xsl:call-template>
+
+ <fo:block id="{$id}"
+ xsl:use-attribute-sets="component.titlepage.properties">
+ <xsl:call-template name="index.titlepage"/>
+ </fo:block>
+ <xsl:apply-templates/>
+ <xsl:if test="count(indexentry) = 0 and count(indexdiv) = 0">
+
+ <xsl:choose>
+ <xsl:when test="$make.index.markup != 0">
+ <fo:block wrap-option='no-wrap'
+ white-space-collapse='false'
+ xsl:use-attribute-sets="monospace.verbatim.properties"
+ linefeed-treatment="preserve">
+ <xsl:call-template name="generate-index-markup">
+ <xsl:with-param name="scope" select="(ancestor::book|/)[last()]"/>
+ </xsl:call-template>
+ </fo:block>
+ </xsl:when>
+ <xsl:when test="indexentry|indexdiv/indexentry">
+ <xsl:apply-templates/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="generate-index">
+ <xsl:with-param name="scope" select="(ancestor::book|/)[last()]"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:if>
+ </fo:flow>
+ </fo:page-sequence>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="setindex">
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+
+ <xsl:if test="$generate.index != 0">
+ <xsl:variable name="master-reference">
+ <xsl:call-template name="select.pagemaster">
+ <xsl:with-param name="pageclass">
+ <xsl:choose>
+ <xsl:when test="$make.index.markup != 0">body</xsl:when>
+ <xsl:otherwise>index</xsl:otherwise>
+ </xsl:choose>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <fo:page-sequence hyphenate="{$hyphenate}"
+ master-reference="{$master-reference}">
+ <xsl:attribute name="language">
+ <xsl:call-template name="l10n.language"/>
+ </xsl:attribute>
+ <xsl:attribute name="format">
+ <xsl:call-template name="page.number.format">
+ <xsl:with-param name="master-reference" select="$master-reference"/>
+ </xsl:call-template>
+ </xsl:attribute>
+
+ <xsl:attribute name="initial-page-number">
+ <xsl:call-template name="initial.page.number">
+ <xsl:with-param name="master-reference" select="$master-reference"/>
+ </xsl:call-template>
+ </xsl:attribute>
+
+ <xsl:attribute name="force-page-count">
+ <xsl:call-template name="force.page.count">
+ <xsl:with-param name="master-reference" select="$master-reference"/>
+ </xsl:call-template>
+ </xsl:attribute>
+
+ <xsl:attribute name="hyphenation-character">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'hyphenation-character'"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:attribute name="hyphenation-push-character-count">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'hyphenation-push-character-count'"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:attribute name="hyphenation-remain-character-count">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'hyphenation-remain-character-count'"/>
+ </xsl:call-template>
+ </xsl:attribute>
+
+ <xsl:apply-templates select="." mode="running.head.mode">
+ <xsl:with-param name="master-reference" select="$master-reference"/>
+ </xsl:apply-templates>
+ <xsl:apply-templates select="." mode="running.foot.mode">
+ <xsl:with-param name="master-reference" select="$master-reference"/>
+ </xsl:apply-templates>
+
+ <fo:flow flow-name="xsl-region-body">
+ <xsl:call-template name="set.flow.properties">
+ <xsl:with-param name="element" select="local-name(.)"/>
+ <xsl:with-param name="master-reference" select="$master-reference"/>
+ </xsl:call-template>
+
+ <fo:block id="{$id}">
+ <xsl:call-template name="setindex.titlepage"/>
+ </fo:block>
+ <xsl:apply-templates/>
+ <xsl:if test="count(indexentry) = 0 and count(indexdiv) = 0">
+
+ <xsl:choose>
+ <xsl:when test="$make.index.markup != 0">
+ <fo:block wrap-option='no-wrap'
+ white-space-collapse='false'
+ xsl:use-attribute-sets="monospace.verbatim.properties"
+ linefeed-treatment="preserve">
+ <xsl:call-template name="generate-index-markup">
+ <xsl:with-param name="scope" select="/"/>
+ </xsl:call-template>
+ </fo:block>
+ </xsl:when>
+ <xsl:when test="indexentry|indexdiv/indexentry">
+ <xsl:apply-templates/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="generate-index">
+ <xsl:with-param name="scope" select="/"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:if>
+ </fo:flow>
+ </fo:page-sequence>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="index/indexinfo"></xsl:template>
+<xsl:template match="index/info"></xsl:template>
+<xsl:template match="index/title"></xsl:template>
+<xsl:template match="index/subtitle"></xsl:template>
+<xsl:template match="index/titleabbrev"></xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template name="indexdiv.title">
+ <xsl:param name="title"/>
+ <xsl:param name="titlecontent"/>
+
+ <fo:block xsl:use-attribute-sets="index.div.title.properties">
+ <xsl:choose>
+ <xsl:when test="$title">
+ <xsl:apply-templates select="." mode="object.title.markup">
+ <xsl:with-param name="allow-anchors" select="1"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:copy-of select="$titlecontent"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </fo:block>
+</xsl:template>
+
+<xsl:template match="indexdiv">
+ <fo:block>
+ <xsl:call-template name="indexdiv.titlepage"/>
+ <xsl:apply-templates/>
+ </fo:block>
+</xsl:template>
+
+<xsl:template match="indexdiv/title"/>
+<xsl:template match="indexdiv/subtitle"/>
+<xsl:template match="indexdiv/titleabbrev"/>
+
+<!-- ==================================================================== -->
+
+<!-- Text used for distiguishing between normal and significant entries -->
+<xsl:variable name="significant.flag">.tnacifingis</xsl:variable>
+
+<xsl:template match="indexterm" name="indexterm">
+ <!-- Temporal workaround for bug in AXF -->
+ <xsl:variable name="wrapper.name">
+ <xsl:choose>
+ <xsl:when test="$axf.extensions != 0 or $fop1.extensions != 0">
+ <xsl:call-template name="inline.or.block"/>
+ </xsl:when>
+ <xsl:otherwise>fo:wrapper</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:element name="{$wrapper.name}">
+ <xsl:attribute name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:attribute>
+ <xsl:choose>
+ <xsl:when test="$xep.extensions != 0">
+ <xsl:attribute name="rx:key">
+ <xsl:value-of select="&primary;"/>
+ <xsl:if test="@significance='preferred'"><xsl:value-of select="$significant.flag"/></xsl:if>
+ <xsl:if test="secondary">
+ <xsl:text>, </xsl:text>
+ <xsl:value-of select="&secondary;"/>
+ </xsl:if>
+ <xsl:if test="tertiary">
+ <xsl:text>, </xsl:text>
+ <xsl:value-of select="&tertiary;"/>
+ </xsl:if>
+ </xsl:attribute>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:comment>
+ <xsl:call-template name="comment-escape-string">
+ <xsl:with-param name="string">
+ <xsl:value-of select="primary"/>
+ <xsl:if test="secondary">
+ <xsl:text>, </xsl:text>
+ <xsl:value-of select="secondary"/>
+ </xsl:if>
+ <xsl:if test="tertiary">
+ <xsl:text>, </xsl:text>
+ <xsl:value-of select="tertiary"/>
+ </xsl:if>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:comment>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:element>
+</xsl:template>
+
+<xsl:template match="indexterm[@class='startofrange']">
+ <xsl:choose>
+ <xsl:when test="$xep.extensions != 0">
+ <rx:begin-index-range>
+ <xsl:call-template name="anchor"/>
+ <xsl:attribute name="rx:key">
+ <xsl:value-of select="&primary;"/>
+ <xsl:if test="@significance='preferred'"><xsl:value-of select="$significant.flag"/></xsl:if>
+ <xsl:if test="secondary">
+ <xsl:text>, </xsl:text>
+ <xsl:value-of select="&secondary;"/>
+ </xsl:if>
+ <xsl:if test="tertiary">
+ <xsl:text>, </xsl:text>
+ <xsl:value-of select="&tertiary;"/>
+ </xsl:if>
+ </xsl:attribute>
+ </rx:begin-index-range>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="indexterm"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="indexterm[@class='endofrange']">
+ <xsl:choose>
+ <xsl:when test="$xep.extensions != 0">
+ <rx:end-index-range>
+ <xsl:attribute name="ref-id">
+ <xsl:value-of select="@startref"/>
+ </xsl:attribute>
+ </rx:end-index-range>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="indexterm"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="indexentry">
+ <fo:block>
+ <!-- don't process 'seeie's from here -->
+ <xsl:apply-templates select="primaryie|secondaryie|tertiaryie|seealsoie"/>
+ </fo:block>
+</xsl:template>
+
+<xsl:template match="primaryie">
+ <fo:block>
+ <xsl:apply-templates/>
+ <xsl:if test="following-sibling::seeie">
+ <xsl:text> (</xsl:text>
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'see'"/>
+ </xsl:call-template>
+ <xsl:text> </xsl:text>
+ <xsl:apply-templates select="following-sibling::seeie"/>
+ <xsl:text>)</xsl:text>
+ </xsl:if>
+ </fo:block>
+</xsl:template>
+
+<xsl:template match="secondaryie">
+ <fo:block start-indent="1pc">
+ <xsl:apply-templates/>
+ <xsl:if test="following-sibling::seeie">
+ <xsl:text> (</xsl:text>
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'see'"/>
+ </xsl:call-template>
+ <xsl:text> </xsl:text>
+ <xsl:apply-templates select="following-sibling::seeie"/>
+ <xsl:text>)</xsl:text>
+ </xsl:if>
+ </fo:block>
+</xsl:template>
+
+<xsl:template match="tertiaryie">
+ <fo:block start-indent="2pc">
+ <xsl:apply-templates/>
+ <xsl:if test="following-sibling::seeie">
+ <xsl:text> (</xsl:text>
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'see'"/>
+ </xsl:call-template>
+ <xsl:text> </xsl:text>
+ <xsl:apply-templates select="following-sibling::seeie"/>
+ <xsl:text>)</xsl:text>
+ </xsl:if>
+ </fo:block>
+</xsl:template>
+
+<xsl:template match="seeie">
+ <fo:inline>
+ <xsl:apply-templates/>
+ </fo:inline>
+</xsl:template>
+
+<xsl:template match="seealsoie">
+ <fo:block>
+ <xsl:attribute name="start-indent">
+ <xsl:choose>
+ <xsl:when test="(preceding-sibling::tertiaryie |
+ preceding-sibling::secondaryie)[last()]
+ [self::tertiaryie]">3pc</xsl:when>
+ <xsl:when test="(preceding-sibling::tertiaryie |
+ preceding-sibling::secondaryie)[last()]
+ [self::secondaryie]">2pc</xsl:when>
+ <xsl:otherwise>1pc</xsl:otherwise>
+ </xsl:choose>
+ </xsl:attribute>
+ <xsl:text>(</xsl:text>
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'seealso'"/>
+ </xsl:call-template>
+ <xsl:text> </xsl:text>
+ <xsl:apply-templates/>
+ <xsl:text>)</xsl:text>
+ </fo:block>
+</xsl:template>
+
+<!-- Determines if an object should be inserted as an fo:inline
+ or an fo:block. Used for indexterms -->
+<xsl:template name="inline.or.block">
+ <xsl:param name="parentnode" select=".."/>
+
+ <xsl:variable name="parent" select="concat('|', local-name($parentnode), '|')"/>
+
+ <xsl:variable name="block.parents" select="'|answer|appendix|appendixinfo|article|articleinfo|bibliodiv|bibliography|bibliographyinfo|blockinfo|blockquote|bookinfo|callout|caution|chapter|chapterinfo|dedication|example|figure|formalpara|funcsynopsisinfo|glossary|glossaryinfo|glossdef|glossdiv|glossentry|highlights|important|index|indexinfo|info|informalexample|informalfigure|informaltable|itemizedlist|legalnotice|listitem|msgexplan|msgtext|note|objectinfo|orderedlist|partinfo|partintro|preface|prefaceinfo|procedure|qandadiv|qandaset|question|refentry|refentryinfo|referenceinfo|refmeta|refmiscinfo|refsect1|refsect1info|refsect2|refsect2info|refsect3|refsect3info|refsection|refsectioninfo|refsynopsisdiv|refsynopsisdivinfo|revdescription|screeninfo|sect1|sect1info|sect2|sect2info|sect3|sect3info|sect4|sect4info|sect5|sect5info|section|sectioninfo|setindex|setindexinfo|setinfo|sidebar|sidebarinfo|simplesect|step|table|task|taskprerequisites|taskrelated|tasksummary|tip|variablelist|warning|'"/>
+
+ <xsl:choose>
+ <xsl:when test="contains($block.parents, $parent)">fo:block</xsl:when>
+ <xsl:when test="$fop1.extensions != 0">fo:wrapper</xsl:when>
+ <xsl:otherwise>fo:inline</xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/info.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/info.xsl
new file mode 100644
index 0000000..7497b82
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/info.xsl
@@ -0,0 +1,34 @@
+<?xml version='1.0'?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:fo="http://www.w3.org/1999/XSL/Format"
+ version='1.0'>
+
+<!-- ********************************************************************
+ $Id: info.xsl 6910 2007-06-28 23:23:30Z xmldoc $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<!-- These templates define the "default behavior" for info
+ elements. Even if you don't process the *info wrappers,
+ some of these elements are needed because the elements are
+ processed from named templates that are called with modes.
+ Since modes aren't sticky, these rules apply.
+ (TODO: clarify this comment) -->
+
+<!-- ==================================================================== -->
+<!-- called from named templates in a given mode -->
+
+<xsl:template match="corpauthor">
+ <fo:inline>
+ <xsl:apply-templates/>
+ </fo:inline>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/inline.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/inline.xsl
new file mode 100644
index 0000000..cbc8cff
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/inline.xsl
@@ -0,0 +1,1288 @@
+<?xml version='1.0'?>
+<!DOCTYPE xsl:stylesheet [
+<!ENTITY % common.entities SYSTEM "../common/entities.ent">
+%common.entities;
+]>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:fo="http://www.w3.org/1999/XSL/Format"
+ xmlns:xlink='http://www.w3.org/1999/xlink'
+ exclude-result-prefixes="xlink"
+ version='1.0'>
+
+<!-- ********************************************************************
+ $Id: inline.xsl 8811 2010-08-09 20:24:45Z mzjn $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<xsl:key name="glossentries" match="glossentry" use="normalize-space(glossterm)"/>
+<xsl:key name="glossentries" match="glossentry" use="normalize-space(glossterm/@baseform)"/>
+
+<xsl:template name="simple.xlink">
+ <xsl:param name="node" select="."/>
+ <xsl:param name="content">
+ <xsl:apply-templates/>
+ </xsl:param>
+ <xsl:param name="linkend" select="$node/@linkend"/>
+ <xsl:param name="xhref" select="$node/@xlink:href"/>
+
+ <xsl:choose>
+ <xsl:when test="$xhref
+ and (not($node/@xlink:type) or
+ $node/@xlink:type='simple')">
+
+ <!-- Is it a local idref? -->
+ <xsl:variable name="is.idref">
+ <xsl:choose>
+ <!-- if the href starts with # and does not contain an "(" -->
+ <!-- or if the href starts with #xpointer(id(, it's just an ID -->
+ <xsl:when test="starts-with($xhref,'#')
+ and (not(contains($xhref,'&#40;'))
+ or starts-with($xhref,
+ '#xpointer&#40;id&#40;'))">1</xsl:when>
+ <xsl:otherwise>0</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <!-- Is it an olink ? -->
+ <xsl:variable name="is.olink">
+ <xsl:choose>
+ <!-- If xlink:role="http://docbook.org/xlink/role/olink" -->
+ <!-- and if the href contains # -->
+ <xsl:when test="contains($xhref,'#') and
+ @xlink:role = $xolink.role">1</xsl:when>
+ <xsl:otherwise>0</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="$is.olink = 1">
+ <xsl:call-template name="olink">
+ <xsl:with-param name="content" select="$content"/>
+ </xsl:call-template>
+ </xsl:when>
+
+ <xsl:when test="$is.idref = 1">
+
+ <xsl:variable name="idref">
+ <xsl:call-template name="xpointer.idref">
+ <xsl:with-param name="xpointer" select="$xhref"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="targets" select="key('id',$idref)"/>
+ <xsl:variable name="target" select="$targets[1]"/>
+
+ <xsl:call-template name="check.id.unique">
+ <xsl:with-param name="linkend" select="$idref"/>
+ </xsl:call-template>
+
+ <xsl:choose>
+ <xsl:when test="count($target) = 0">
+ <xsl:message>
+ <xsl:text>XLink to nonexistent id: </xsl:text>
+ <xsl:value-of select="$idref"/>
+ </xsl:message>
+ <xsl:copy-of select="$content"/>
+ </xsl:when>
+
+ <xsl:otherwise>
+ <fo:basic-link internal-destination="{$idref}">
+ <xsl:copy-of select="$content"/>
+ </fo:basic-link>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+
+ <!-- otherwise it's a URI -->
+ <xsl:otherwise>
+ <fo:basic-link external-destination="url({$xhref})">
+ <xsl:copy-of select="$content"/>
+ </fo:basic-link>
+ <!-- * Call the template for determining whether the URL for this -->
+ <!-- * hyperlink is displayed, and how to display it (either inline or -->
+ <!-- * as a numbered footnote). -->
+ <xsl:call-template name="hyperlink.url.display">
+ <xsl:with-param name="url" select="$xhref"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+
+ <xsl:when test="$linkend">
+ <xsl:variable name="targets" select="key('id',$linkend)"/>
+ <xsl:variable name="target" select="$targets[1]"/>
+
+ <xsl:call-template name="check.id.unique">
+ <xsl:with-param name="linkend" select="$linkend"/>
+ </xsl:call-template>
+
+ <xsl:choose>
+ <xsl:when test="count($target) = 0">
+ <xsl:message>
+ <xsl:text>XLink to nonexistent id: </xsl:text>
+ <xsl:value-of select="$linkend"/>
+ </xsl:message>
+ <xsl:copy-of select="$content"/>
+ </xsl:when>
+
+ <xsl:otherwise>
+ <fo:basic-link internal-destination="{$linkend}">
+ <xsl:copy-of select="$content"/>
+ </fo:basic-link>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+
+ <xsl:otherwise>
+ <xsl:copy-of select="$content"/>
+ </xsl:otherwise>
+ </xsl:choose>
+
+</xsl:template>
+
+<xsl:template name="inline.charseq">
+ <xsl:param name="content">
+ <xsl:call-template name="simple.xlink">
+ <xsl:with-param name="content">
+ <xsl:apply-templates/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:param>
+
+ <xsl:choose>
+ <xsl:when test="@dir">
+ <fo:inline>
+ <xsl:attribute name="direction">
+ <xsl:choose>
+ <xsl:when test="@dir = 'ltr' or @dir = 'lro'">ltr</xsl:when>
+ <xsl:otherwise>rtl</xsl:otherwise>
+ </xsl:choose>
+ </xsl:attribute>
+ <xsl:copy-of select="$content"/>
+ </fo:inline>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:copy-of select="$content"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="inline.monoseq">
+ <xsl:param name="content">
+ <xsl:call-template name="simple.xlink">
+ <xsl:with-param name="content">
+ <xsl:apply-templates/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:param>
+
+ <fo:inline xsl:use-attribute-sets="monospace.properties">
+ <xsl:call-template name="anchor"/>
+ <xsl:if test="@dir">
+ <xsl:attribute name="direction">
+ <xsl:choose>
+ <xsl:when test="@dir = 'ltr' or @dir = 'lro'">ltr</xsl:when>
+ <xsl:otherwise>rtl</xsl:otherwise>
+ </xsl:choose>
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:copy-of select="$content"/>
+ </fo:inline>
+</xsl:template>
+
+<xsl:template name="inline.boldseq">
+ <xsl:param name="content">
+ <xsl:call-template name="simple.xlink">
+ <xsl:with-param name="content">
+ <xsl:apply-templates/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:param>
+
+ <fo:inline font-weight="bold">
+ <xsl:if test="@dir">
+ <xsl:attribute name="direction">
+ <xsl:choose>
+ <xsl:when test="@dir = 'ltr' or @dir = 'lro'">ltr</xsl:when>
+ <xsl:otherwise>rtl</xsl:otherwise>
+ </xsl:choose>
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:copy-of select="$content"/>
+ </fo:inline>
+</xsl:template>
+
+<xsl:template name="inline.italicseq">
+ <xsl:param name="content">
+ <xsl:call-template name="simple.xlink">
+ <xsl:with-param name="content">
+ <xsl:apply-templates/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:param>
+
+ <fo:inline font-style="italic">
+ <xsl:call-template name="anchor"/>
+ <xsl:if test="@dir">
+ <xsl:attribute name="direction">
+ <xsl:choose>
+ <xsl:when test="@dir = 'ltr' or @dir = 'lro'">ltr</xsl:when>
+ <xsl:otherwise>rtl</xsl:otherwise>
+ </xsl:choose>
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:copy-of select="$content"/>
+ </fo:inline>
+</xsl:template>
+
+<xsl:template name="inline.boldmonoseq">
+ <xsl:param name="content">
+ <xsl:call-template name="simple.xlink">
+ <xsl:with-param name="content">
+ <xsl:apply-templates/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:param>
+
+ <fo:inline font-weight="bold" xsl:use-attribute-sets="monospace.properties">
+ <xsl:call-template name="anchor"/>
+ <xsl:if test="@dir">
+ <xsl:attribute name="direction">
+ <xsl:choose>
+ <xsl:when test="@dir = 'ltr' or @dir = 'lro'">ltr</xsl:when>
+ <xsl:otherwise>rtl</xsl:otherwise>
+ </xsl:choose>
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:copy-of select="$content"/>
+ </fo:inline>
+</xsl:template>
+
+<xsl:template name="inline.italicmonoseq">
+ <xsl:param name="content">
+ <xsl:call-template name="simple.xlink">
+ <xsl:with-param name="content">
+ <xsl:apply-templates/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:param>
+
+ <fo:inline font-style="italic" xsl:use-attribute-sets="monospace.properties">
+ <xsl:call-template name="anchor"/>
+ <xsl:if test="@dir">
+ <xsl:attribute name="direction">
+ <xsl:choose>
+ <xsl:when test="@dir = 'ltr' or @dir = 'lro'">ltr</xsl:when>
+ <xsl:otherwise>rtl</xsl:otherwise>
+ </xsl:choose>
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:copy-of select="$content"/>
+ </fo:inline>
+</xsl:template>
+
+<xsl:template name="inline.superscriptseq">
+ <xsl:param name="content">
+ <xsl:call-template name="simple.xlink">
+ <xsl:with-param name="content">
+ <xsl:apply-templates/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:param>
+
+ <fo:inline xsl:use-attribute-sets="superscript.properties">
+ <xsl:call-template name="anchor"/>
+ <xsl:if test="@dir">
+ <xsl:attribute name="direction">
+ <xsl:choose>
+ <xsl:when test="@dir = 'ltr' or @dir = 'lro'">ltr</xsl:when>
+ <xsl:otherwise>rtl</xsl:otherwise>
+ </xsl:choose>
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:choose>
+ <xsl:when test="$fop.extensions != 0">
+ <xsl:attribute name="vertical-align">super</xsl:attribute>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:attribute name="baseline-shift">super</xsl:attribute>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:copy-of select="$content"/>
+ </fo:inline>
+</xsl:template>
+
+<xsl:template name="inline.subscriptseq">
+ <xsl:param name="content">
+ <xsl:call-template name="simple.xlink">
+ <xsl:with-param name="content">
+ <xsl:apply-templates/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:param>
+
+ <fo:inline xsl:use-attribute-sets="subscript.properties">
+ <xsl:call-template name="anchor"/>
+ <xsl:if test="@dir">
+ <xsl:attribute name="direction">
+ <xsl:choose>
+ <xsl:when test="@dir = 'ltr' or @dir = 'lro'">ltr</xsl:when>
+ <xsl:otherwise>rtl</xsl:otherwise>
+ </xsl:choose>
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:choose>
+ <xsl:when test="$fop.extensions != 0">
+ <xsl:attribute name="vertical-align">sub</xsl:attribute>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:attribute name="baseline-shift">sub</xsl:attribute>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:copy-of select="$content"/>
+ </fo:inline>
+</xsl:template>
+
+<!-- ==================================================================== -->
+<!-- some special cases -->
+
+<xsl:template match="author">
+ <xsl:call-template name="simple.xlink">
+ <xsl:with-param name="content">
+ <xsl:call-template name="person.name"/>
+ </xsl:with-param>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="editor">
+ <xsl:call-template name="simple.xlink">
+ <xsl:with-param name="content">
+ <xsl:call-template name="person.name"/>
+ </xsl:with-param>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="othercredit">
+ <xsl:call-template name="simple.xlink">
+ <xsl:with-param name="content">
+ <xsl:call-template name="person.name"/>
+ </xsl:with-param>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="authorinitials">
+ <xsl:call-template name="inline.charseq"/>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="accel">
+ <xsl:call-template name="inline.charseq"/>
+</xsl:template>
+
+<xsl:template match="action">
+ <xsl:call-template name="inline.charseq"/>
+</xsl:template>
+
+<xsl:template match="application">
+ <xsl:call-template name="inline.charseq"/>
+</xsl:template>
+
+<xsl:template match="classname">
+ <xsl:call-template name="inline.monoseq"/>
+</xsl:template>
+
+<xsl:template match="exceptionname">
+ <xsl:call-template name="inline.monoseq"/>
+</xsl:template>
+
+<xsl:template match="interfacename">
+ <xsl:call-template name="inline.monoseq"/>
+</xsl:template>
+
+<xsl:template match="methodname">
+ <xsl:call-template name="inline.monoseq"/>
+</xsl:template>
+
+<xsl:template match="command">
+ <xsl:call-template name="inline.boldseq"/>
+</xsl:template>
+
+<xsl:template match="computeroutput">
+ <xsl:call-template name="inline.monoseq"/>
+</xsl:template>
+
+<xsl:template match="constant">
+ <xsl:call-template name="inline.monoseq"/>
+</xsl:template>
+
+<xsl:template match="database">
+ <xsl:call-template name="inline.charseq"/>
+</xsl:template>
+
+<xsl:template match="date">
+ <!-- should this support locale-specific formatting? how? -->
+ <xsl:call-template name="inline.charseq"/>
+</xsl:template>
+
+<xsl:template match="errorcode">
+ <xsl:call-template name="inline.charseq"/>
+</xsl:template>
+
+<xsl:template match="errorname">
+ <xsl:call-template name="inline.charseq"/>
+</xsl:template>
+
+<xsl:template match="errortype">
+ <xsl:call-template name="inline.charseq"/>
+</xsl:template>
+
+<xsl:template match="errortext">
+ <xsl:call-template name="inline.charseq"/>
+</xsl:template>
+
+<xsl:template match="envar">
+ <xsl:call-template name="inline.monoseq"/>
+</xsl:template>
+
+<xsl:template match="filename">
+ <xsl:call-template name="inline.monoseq"/>
+</xsl:template>
+
+<xsl:template match="function">
+ <xsl:choose>
+ <xsl:when test="$function.parens != '0'
+ and (parameter or function or replaceable)">
+ <xsl:variable name="nodes" select="text()|*"/>
+ <xsl:call-template name="inline.monoseq">
+ <xsl:with-param name="content">
+ <xsl:call-template name="simple.xlink">
+ <xsl:with-param name="content">
+ <xsl:apply-templates select="$nodes[1]"/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:with-param>
+ </xsl:call-template>
+ <xsl:text>(</xsl:text>
+ <xsl:apply-templates select="$nodes[position()>1]"/>
+ <xsl:text>)</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="inline.monoseq"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="function/parameter" priority="2">
+ <xsl:call-template name="inline.italicmonoseq"/>
+ <xsl:if test="following-sibling::*">
+ <xsl:text>, </xsl:text>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="function/replaceable" priority="2">
+ <xsl:call-template name="inline.italicmonoseq"/>
+ <xsl:if test="following-sibling::*">
+ <xsl:text>, </xsl:text>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="guibutton">
+ <xsl:call-template name="inline.charseq"/>
+</xsl:template>
+
+<xsl:template match="guiicon">
+ <xsl:call-template name="inline.charseq"/>
+</xsl:template>
+
+<xsl:template match="guilabel">
+ <xsl:call-template name="inline.charseq"/>
+</xsl:template>
+
+<xsl:template match="guimenu">
+ <xsl:call-template name="inline.charseq"/>
+</xsl:template>
+
+<xsl:template match="guimenuitem">
+ <xsl:call-template name="inline.charseq"/>
+</xsl:template>
+
+<xsl:template match="guisubmenu">
+ <xsl:call-template name="inline.charseq"/>
+</xsl:template>
+
+<xsl:template match="hardware">
+ <xsl:call-template name="inline.charseq"/>
+</xsl:template>
+
+<xsl:template match="interface">
+ <xsl:call-template name="inline.charseq"/>
+</xsl:template>
+
+<xsl:template match="interfacedefinition">
+ <xsl:call-template name="inline.charseq"/>
+</xsl:template>
+
+<xsl:template match="keycap">
+ <xsl:call-template name="inline.boldseq"/>
+</xsl:template>
+
+<xsl:template match="keycode">
+ <xsl:call-template name="inline.charseq"/>
+</xsl:template>
+
+<xsl:template match="keysym">
+ <xsl:call-template name="inline.charseq"/>
+</xsl:template>
+
+<xsl:template match="literal">
+ <xsl:call-template name="inline.monoseq"/>
+</xsl:template>
+
+<xsl:template match="code">
+ <xsl:call-template name="inline.monoseq"/>
+</xsl:template>
+
+<xsl:template match="medialabel">
+ <xsl:call-template name="inline.italicseq"/>
+</xsl:template>
+
+<xsl:template match="shortcut">
+ <xsl:call-template name="inline.boldseq"/>
+</xsl:template>
+
+<xsl:template match="mousebutton">
+ <xsl:call-template name="inline.charseq"/>
+</xsl:template>
+
+<xsl:template match="option">
+ <xsl:call-template name="inline.monoseq"/>
+</xsl:template>
+
+<xsl:template match="package">
+ <xsl:call-template name="inline.charseq"/>
+</xsl:template>
+
+<xsl:template match="parameter">
+ <xsl:call-template name="inline.italicmonoseq"/>
+</xsl:template>
+
+<xsl:template match="property">
+ <xsl:call-template name="inline.charseq"/>
+</xsl:template>
+
+<xsl:template match="prompt">
+ <xsl:call-template name="inline.monoseq"/>
+</xsl:template>
+
+<xsl:template match="replaceable">
+ <xsl:call-template name="inline.italicmonoseq"/>
+</xsl:template>
+
+<xsl:template match="returnvalue">
+ <xsl:call-template name="inline.charseq"/>
+</xsl:template>
+
+<xsl:template match="structfield">
+ <xsl:call-template name="inline.italicmonoseq"/>
+</xsl:template>
+
+<xsl:template match="structname">
+ <xsl:call-template name="inline.charseq"/>
+</xsl:template>
+
+<xsl:template match="symbol">
+ <xsl:call-template name="inline.charseq"/>
+</xsl:template>
+
+<xsl:template match="systemitem">
+ <xsl:call-template name="inline.monoseq"/>
+</xsl:template>
+
+<xsl:template match="token">
+ <xsl:call-template name="inline.charseq"/>
+</xsl:template>
+
+<xsl:template match="type">
+ <xsl:call-template name="inline.charseq"/>
+</xsl:template>
+
+<xsl:template match="userinput">
+ <xsl:call-template name="inline.boldmonoseq"/>
+</xsl:template>
+
+<xsl:template match="abbrev">
+ <xsl:call-template name="inline.charseq"/>
+</xsl:template>
+
+<xsl:template match="acronym">
+ <xsl:call-template name="inline.charseq"/>
+</xsl:template>
+
+<xsl:template match="citerefentry">
+ <xsl:call-template name="inline.charseq"/>
+</xsl:template>
+
+<xsl:template match="citetitle">
+ <xsl:choose>
+ <xsl:when test="@pubwork = 'article'">
+ <xsl:call-template name="gentext.startquote"/>
+ <xsl:call-template name="inline.charseq"/>
+ <xsl:call-template name="gentext.endquote"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="inline.italicseq"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="emphasis">
+ <xsl:variable name="depth">
+ <xsl:call-template name="dot.count">
+ <xsl:with-param name="string">
+ <xsl:number level="multiple"/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="@role='bold' or @role='strong'">
+ <xsl:call-template name="inline.boldseq"/>
+ </xsl:when>
+ <xsl:when test="@role='underline'">
+ <fo:inline text-decoration="underline">
+ <xsl:call-template name="inline.charseq"/>
+ </fo:inline>
+ </xsl:when>
+ <xsl:when test="@role='strikethrough'">
+ <fo:inline text-decoration="line-through">
+ <xsl:call-template name="inline.charseq"/>
+ </fo:inline>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:choose>
+ <xsl:when test="$depth mod 2 = 1">
+ <fo:inline font-style="normal">
+ <xsl:apply-templates/>
+ </fo:inline>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="inline.italicseq"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="foreignphrase">
+ <xsl:call-template name="inline.italicseq"/>
+</xsl:template>
+
+<xsl:template match="markup">
+ <xsl:call-template name="inline.charseq"/>
+</xsl:template>
+
+<xsl:template match="phrase">
+ <fo:inline>
+ <xsl:call-template name="anchor"/>
+ <xsl:call-template name="inline.charseq"/>
+ </fo:inline>
+</xsl:template>
+
+<xsl:template match="quote">
+ <xsl:variable name="depth">
+ <xsl:call-template name="dot.count">
+ <xsl:with-param name="string"><xsl:number level="multiple"/></xsl:with-param>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:variable name="content">
+ <xsl:choose>
+ <xsl:when test="$depth mod 2 = 0">
+ <xsl:call-template name="gentext.startquote"/>
+ <xsl:call-template name="inline.charseq"/>
+ <xsl:call-template name="gentext.endquote"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="gentext.nestedstartquote"/>
+ <xsl:call-template name="inline.charseq"/>
+ <xsl:call-template name="gentext.nestedendquote"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <fo:inline>
+ <xsl:call-template name="anchor"/>
+ <xsl:copy-of select="$content"/>
+ </fo:inline>
+
+</xsl:template>
+
+<xsl:template match="varname">
+ <xsl:call-template name="inline.monoseq"/>
+</xsl:template>
+
+<xsl:template match="wordasword">
+ <xsl:call-template name="inline.italicseq"/>
+</xsl:template>
+
+<xsl:template match="lineannotation">
+ <fo:inline font-style="italic">
+ <xsl:call-template name="inline.charseq"/>
+ </fo:inline>
+</xsl:template>
+
+<xsl:template match="superscript">
+ <xsl:call-template name="inline.superscriptseq"/>
+</xsl:template>
+
+<xsl:template match="subscript">
+ <xsl:call-template name="inline.subscriptseq"/>
+</xsl:template>
+
+<xsl:template match="trademark">
+ <xsl:call-template name="inline.charseq"/>
+ <xsl:choose>
+ <xsl:when test="@class = 'copyright'
+ or @class = 'registered'">
+ <xsl:call-template name="dingbat">
+ <xsl:with-param name="dingbat" select="@class"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="@class = 'service'">
+ <xsl:call-template name="inline.superscriptseq">
+ <xsl:with-param name="content" select="'SM'"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="dingbat">
+ <xsl:with-param name="dingbat" select="'trademark'"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="firstterm">
+ <xsl:call-template name="glossterm">
+ <xsl:with-param name="firstterm" select="1"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="glossterm" name="glossterm">
+ <xsl:param name="firstterm" select="0"/>
+
+ <xsl:choose>
+ <xsl:when test="($firstterm.only.link = 0 or $firstterm = 1) and @linkend">
+ <xsl:variable name="targets" select="key('id',@linkend)"/>
+ <xsl:variable name="target" select="$targets[1]"/>
+
+ <xsl:choose>
+ <xsl:when test="$target">
+ <fo:basic-link internal-destination="{@linkend}"
+ xsl:use-attribute-sets="xref.properties">
+ <xsl:call-template name="inline.italicseq"/>
+ </fo:basic-link>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="inline.italicseq"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+
+ <xsl:when test="not(@linkend)
+ and ($firstterm.only.link = 0 or $firstterm = 1)
+ and ($glossterm.auto.link != 0)
+ and $glossary.collection != ''">
+ <xsl:variable name="term">
+ <xsl:choose>
+ <xsl:when test="@baseform"><xsl:value-of select="@baseform"/></xsl:when>
+ <xsl:otherwise><xsl:value-of select="."/></xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:variable name="cterm"
+ select="(document($glossary.collection,.)//glossentry[glossterm=$term])[1]"/>
+
+ <xsl:choose>
+ <xsl:when test="not($cterm)">
+ <xsl:message>
+ <xsl:text>There's no entry for </xsl:text>
+ <xsl:value-of select="$term"/>
+ <xsl:text> in </xsl:text>
+ <xsl:value-of select="$glossary.collection"/>
+ </xsl:message>
+ <xsl:call-template name="inline.italicseq"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id">
+ <xsl:with-param name="object" select="$cterm"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <fo:basic-link internal-destination="{$id}"
+ xsl:use-attribute-sets="xref.properties">
+ <xsl:call-template name="inline.italicseq"/>
+ </fo:basic-link>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+
+ <xsl:when test="not(@linkend)
+ and ($firstterm.only.link = 0 or $firstterm = 1)
+ and $glossterm.auto.link != 0">
+ <xsl:variable name="term">
+ <xsl:choose>
+ <xsl:when test="@baseform">
+ <xsl:value-of select="normalize-space(@baseform)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="normalize-space(.)"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="targets"
+ select="key('glossentries', $term)"/>
+ <xsl:variable name="target" select="$targets[1]"/>
+
+ <xsl:choose>
+ <xsl:when test="count($targets)=0">
+ <xsl:message>
+ <xsl:text>Error: no glossentry for glossterm: </xsl:text>
+ <xsl:value-of select="."/>
+ <xsl:text>.</xsl:text>
+ </xsl:message>
+ <xsl:call-template name="inline.italicseq"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:variable name="termid">
+ <xsl:call-template name="object.id">
+ <xsl:with-param name="object" select="$target"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <fo:basic-link internal-destination="{$termid}"
+ xsl:use-attribute-sets="xref.properties">
+ <xsl:call-template name="inline.charseq"/>
+ </fo:basic-link>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="inline.italicseq"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="termdef">
+ <fo:inline>
+ <xsl:call-template name="gentext.template">
+ <xsl:with-param name="context" select="'termdef'"/>
+ <xsl:with-param name="name" select="'prefix'"/>
+ </xsl:call-template>
+ <xsl:apply-templates/>
+ <xsl:call-template name="gentext.template">
+ <xsl:with-param name="context" select="'termdef'"/>
+ <xsl:with-param name="name" select="'suffix'"/>
+ </xsl:call-template>
+ </fo:inline>
+</xsl:template>
+
+<xsl:template match="sgmltag|tag">
+ <xsl:variable name="class">
+ <xsl:choose>
+ <xsl:when test="@class">
+ <xsl:value-of select="@class"/>
+ </xsl:when>
+ <xsl:otherwise>element</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="$class='attribute'">
+ <xsl:call-template name="inline.monoseq"/>
+ </xsl:when>
+ <xsl:when test="$class='attvalue'">
+ <xsl:call-template name="inline.monoseq"/>
+ </xsl:when>
+ <xsl:when test="$class='element'">
+ <xsl:call-template name="inline.monoseq"/>
+ </xsl:when>
+ <xsl:when test="$class='endtag'">
+ <xsl:call-template name="inline.monoseq">
+ <xsl:with-param name="content">
+ <xsl:text>&lt;/</xsl:text>
+ <xsl:apply-templates/>
+ <xsl:text>&gt;</xsl:text>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="$class='genentity'">
+ <xsl:call-template name="inline.monoseq">
+ <xsl:with-param name="content">
+ <xsl:text>&amp;</xsl:text>
+ <xsl:apply-templates/>
+ <xsl:text>;</xsl:text>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="$class='numcharref'">
+ <xsl:call-template name="inline.monoseq">
+ <xsl:with-param name="content">
+ <xsl:text>&amp;#</xsl:text>
+ <xsl:apply-templates/>
+ <xsl:text>;</xsl:text>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="$class='paramentity'">
+ <xsl:call-template name="inline.monoseq">
+ <xsl:with-param name="content">
+ <xsl:text>%</xsl:text>
+ <xsl:apply-templates/>
+ <xsl:text>;</xsl:text>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="$class='pi'">
+ <xsl:call-template name="inline.monoseq">
+ <xsl:with-param name="content">
+ <xsl:text>&lt;?</xsl:text>
+ <xsl:apply-templates/>
+ <xsl:text>&gt;</xsl:text>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="$class='xmlpi'">
+ <xsl:call-template name="inline.monoseq">
+ <xsl:with-param name="content">
+ <xsl:text>&lt;?</xsl:text>
+ <xsl:apply-templates/>
+ <xsl:text>?&gt;</xsl:text>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="$class='starttag'">
+ <xsl:call-template name="inline.monoseq">
+ <xsl:with-param name="content">
+ <xsl:text>&lt;</xsl:text>
+ <xsl:apply-templates/>
+ <xsl:text>&gt;</xsl:text>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="$class='emptytag'">
+ <xsl:call-template name="inline.monoseq">
+ <xsl:with-param name="content">
+ <xsl:text>&lt;</xsl:text>
+ <xsl:apply-templates/>
+ <xsl:text>/&gt;</xsl:text>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="$class='sgmlcomment' or $class='comment'">
+ <xsl:call-template name="inline.monoseq">
+ <xsl:with-param name="content">
+ <xsl:text>&lt;!--</xsl:text>
+ <xsl:apply-templates/>
+ <xsl:text>--&gt;</xsl:text>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="inline.charseq"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="email">
+ <xsl:call-template name="inline.monoseq">
+ <xsl:with-param name="content">
+ <fo:inline keep-together.within-line="always" hyphenate="false">
+ <xsl:if test="not($email.delimiters.enabled = 0)">
+ <xsl:text>&lt;</xsl:text>
+ </xsl:if>
+ <xsl:choose>
+ <xsl:when test="not($email.mailto.enabled = 0)">
+ <fo:basic-link xsl:use-attribute-sets="xref.properties"
+ keep-together.within-line="always" hyphenate="false">
+ <xsl:attribute name="external-destination">
+ mailto:<xsl:value-of select="string(.)" />
+ </xsl:attribute>
+ <xsl:apply-templates/>
+ </fo:basic-link>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates/>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:if test="not($email.delimiters.enabled = 0)">
+ <xsl:text>&gt;</xsl:text>
+ </xsl:if>
+ </fo:inline>
+ </xsl:with-param>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="keycombo">
+ <xsl:variable name="action" select="@action"/>
+ <xsl:variable name="joinchar">
+ <xsl:choose>
+ <xsl:when test="$action='seq'"><xsl:text> </xsl:text></xsl:when>
+ <xsl:when test="$action='simul'">+</xsl:when>
+ <xsl:when test="$action='press'">-</xsl:when>
+ <xsl:when test="$action='click'">-</xsl:when>
+ <xsl:when test="$action='double-click'">-</xsl:when>
+ <xsl:when test="$action='other'"></xsl:when>
+ <xsl:otherwise>+</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:for-each select="*">
+ <xsl:if test="position()>1"><xsl:value-of select="$joinchar"/></xsl:if>
+ <xsl:apply-templates select="."/>
+ </xsl:for-each>
+</xsl:template>
+
+<xsl:template match="uri">
+ <xsl:call-template name="inline.monoseq"/>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="menuchoice">
+ <xsl:variable name="shortcut" select="./shortcut"/>
+ <xsl:call-template name="process.menuchoice"/>
+ <xsl:if test="$shortcut">
+ <xsl:text> (</xsl:text>
+ <xsl:apply-templates select="$shortcut"/>
+ <xsl:text>)</xsl:text>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template name="process.menuchoice">
+ <xsl:param name="nodelist" select="guibutton|guiicon|guilabel|guimenu|guimenuitem|guisubmenu|interface"/><!-- not(shortcut) -->
+ <xsl:param name="count" select="1"/>
+
+ <xsl:variable name="mm.separator">
+ <xsl:choose>
+ <xsl:when test="($fop.extensions != 0 or $fop1.extensions != 0 ) and
+ contains($menuchoice.menu.separator, '&#x2192;')">
+ <fo:inline font-family="Symbol">
+ <xsl:copy-of select="$menuchoice.menu.separator"/>
+ </fo:inline>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:copy-of select="$menuchoice.menu.separator"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="$count>count($nodelist)"></xsl:when>
+ <xsl:when test="$count=1">
+ <xsl:apply-templates select="$nodelist[$count=position()]"/>
+ <xsl:call-template name="process.menuchoice">
+ <xsl:with-param name="nodelist" select="$nodelist"/>
+ <xsl:with-param name="count" select="$count+1"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:variable name="node" select="$nodelist[$count=position()]"/>
+ <xsl:choose>
+ <xsl:when test="local-name($node)='guimenuitem'
+ or local-name($node)='guisubmenu'">
+ <xsl:copy-of select="$mm.separator"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:copy-of select="$menuchoice.separator"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:apply-templates select="$node"/>
+ <xsl:call-template name="process.menuchoice">
+ <xsl:with-param name="nodelist" select="$nodelist"/>
+ <xsl:with-param name="count" select="$count+1"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="optional">
+ <xsl:value-of select="$arg.choice.opt.open.str"/>
+ <xsl:call-template name="inline.charseq"/>
+ <xsl:value-of select="$arg.choice.opt.close.str"/>
+</xsl:template>
+
+<xsl:template match="citation">
+ <!-- todo: integrate with bibliography collection -->
+ <xsl:variable name="targets" select="(//biblioentry | //bibliomixed)[abbrev = string(current())]"/>
+ <xsl:variable name="target" select="$targets[1]"/>
+
+ <xsl:choose>
+ <!-- try automatic linking based on match to abbrev -->
+ <xsl:when test="$target and not(xref) and not(link)">
+
+ <xsl:text>[</xsl:text>
+ <fo:basic-link>
+ <xsl:attribute name="internal-destination">
+ <xsl:call-template name="object.id">
+ <xsl:with-param name="object" select="$target"/>
+ </xsl:call-template>
+ </xsl:attribute>
+
+ <xsl:choose>
+ <xsl:when test="$bibliography.numbered != 0">
+ <xsl:apply-templates select="$target" mode="citation"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="inline.charseq"/>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ </fo:basic-link>
+ <xsl:text>]</xsl:text>
+ </xsl:when>
+
+ <xsl:otherwise>
+ <xsl:text>[</xsl:text>
+ <xsl:call-template name="inline.charseq"/>
+ <xsl:text>]</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="citebiblioid">
+ <xsl:variable name="targets" select="//*[biblioid = string(current())]"/>
+ <xsl:variable name="target" select="$targets[1]"/>
+
+ <xsl:choose>
+ <!-- try automatic linking based on match to parent of biblioid -->
+ <xsl:when test="$target and not(xref) and not(link)">
+
+ <xsl:text>[</xsl:text>
+ <fo:basic-link>
+ <xsl:attribute name="internal-destination">
+ <xsl:call-template name="object.id">
+ <xsl:with-param name="object" select="$target"/>
+ </xsl:call-template>
+ </xsl:attribute>
+
+ <xsl:call-template name="inline.charseq"/>
+
+ </fo:basic-link>
+ <xsl:text>]</xsl:text>
+ </xsl:when>
+
+ <xsl:otherwise>
+ <xsl:text>[</xsl:text>
+ <xsl:call-template name="inline.charseq"/>
+ <xsl:text>]</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="biblioentry|bibliomixed" mode="citation">
+ <xsl:number from="bibliography" count="biblioentry|bibliomixed"
+ level="any" format="1"/>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="comment[&comment.block.parents;]|remark[&comment.block.parents;]">
+ <xsl:if test="$show.comments != 0">
+ <fo:block font-style="italic">
+ <xsl:call-template name="inline.charseq"/>
+ </fo:block>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="comment|remark">
+ <xsl:if test="$show.comments != 0">
+ <fo:inline font-style="italic">
+ <xsl:call-template name="inline.charseq"/>
+ </fo:inline>
+ </xsl:if>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="productname">
+ <xsl:call-template name="inline.charseq"/>
+ <xsl:if test="@class">
+ <xsl:call-template name="dingbat">
+ <xsl:with-param name="dingbat" select="@class"/>
+ </xsl:call-template>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="productnumber">
+ <xsl:call-template name="inline.charseq"/>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="pob|street|city|state|postcode|country|otheraddr">
+ <xsl:call-template name="inline.charseq"/>
+</xsl:template>
+
+<xsl:template match="phone|fax">
+ <xsl:call-template name="inline.charseq"/>
+</xsl:template>
+
+<!-- in Addresses, for example -->
+<xsl:template match="honorific|firstname|surname|lineage|othername">
+ <xsl:call-template name="inline.charseq"/>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="person">
+ <xsl:apply-templates select="personname"/>
+</xsl:template>
+
+<xsl:template match="personname">
+ <xsl:call-template name="simple.xlink">
+ <xsl:with-param name="content">
+ <xsl:call-template name="person.name"/>
+ </xsl:with-param>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="jobtitle">
+ <xsl:call-template name="simple.xlink">
+ <xsl:with-param name="content">
+ <xsl:apply-templates/>
+ </xsl:with-param>
+ </xsl:call-template>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="org">
+ <xsl:call-template name="inline.charseq"/>
+</xsl:template>
+
+<xsl:template match="orgname">
+ <xsl:call-template name="inline.charseq"/>
+</xsl:template>
+
+<xsl:template match="orgdiv">
+ <xsl:call-template name="inline.charseq"/>
+</xsl:template>
+
+<xsl:template match="affiliation">
+ <xsl:call-template name="inline.charseq"/>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="beginpage">
+ <!-- does nothing; this *is not* markup to force a page break. -->
+</xsl:template>
+
+</xsl:stylesheet>
+
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/keywords.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/keywords.xsl
new file mode 100644
index 0000000..6070b91
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/keywords.xsl
@@ -0,0 +1,21 @@
+<?xml version='1.0'?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:fo="http://www.w3.org/1999/XSL/Format"
+ version='1.0'>
+
+<!-- ********************************************************************
+ $Id: keywords.xsl 6910 2007-06-28 23:23:30Z xmldoc $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<xsl:template match="keywordset"></xsl:template>
+<xsl:template match="subjectset"></xsl:template>
+
+<!-- ==================================================================== -->
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/lists.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/lists.xsl
new file mode 100644
index 0000000..51052f1
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/lists.xsl
@@ -0,0 +1,1393 @@
+<?xml version='1.0'?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:fo="http://www.w3.org/1999/XSL/Format"
+ version='1.0'>
+
+<!-- ********************************************************************
+ $Id: lists.xsl 8761 2010-07-21 18:58:53Z mzjn $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<!-- ==================================================================== -->
+
+<xsl:template match="itemizedlist">
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+
+ <xsl:variable name="keep.together">
+ <xsl:call-template name="pi.dbfo_keep-together"/>
+ </xsl:variable>
+
+ <xsl:variable name="pi-label-width">
+ <xsl:call-template name="pi.dbfo_label-width"/>
+ </xsl:variable>
+
+ <xsl:variable name="label-width">
+ <xsl:choose>
+ <xsl:when test="$pi-label-width = ''">
+ <xsl:value-of select="$itemizedlist.label.width"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$pi-label-width"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:if test="title">
+ <xsl:apply-templates select="title" mode="list.title.mode"/>
+ </xsl:if>
+
+ <!-- Preserve order of PIs and comments -->
+ <xsl:apply-templates
+ select="*[not(self::listitem
+ or self::title
+ or self::titleabbrev)]
+ |comment()[not(preceding-sibling::listitem)]
+ |processing-instruction()[not(preceding-sibling::listitem)]"/>
+
+ <xsl:variable name="content">
+ <xsl:apply-templates
+ select="listitem
+ |comment()[preceding-sibling::listitem]
+ |processing-instruction()[preceding-sibling::listitem]"/>
+ </xsl:variable>
+
+ <!-- nested lists don't add extra list-block spacing -->
+ <xsl:choose>
+ <xsl:when test="ancestor::listitem">
+ <fo:list-block id="{$id}" xsl:use-attribute-sets="itemizedlist.properties">
+ <xsl:attribute name="provisional-distance-between-starts">
+ <xsl:value-of select="$label-width"/>
+ </xsl:attribute>
+ <xsl:if test="$keep.together != ''">
+ <xsl:attribute name="keep-together.within-column"><xsl:value-of
+ select="$keep.together"/></xsl:attribute>
+ </xsl:if>
+ <xsl:copy-of select="$content"/>
+ </fo:list-block>
+ </xsl:when>
+ <xsl:otherwise>
+ <fo:list-block id="{$id}" xsl:use-attribute-sets="list.block.spacing itemizedlist.properties">
+ <xsl:attribute name="provisional-distance-between-starts">
+ <xsl:value-of select="$label-width"/>
+ </xsl:attribute>
+ <xsl:if test="$keep.together != ''">
+ <xsl:attribute name="keep-together.within-column"><xsl:value-of
+ select="$keep.together"/></xsl:attribute>
+ </xsl:if>
+ <xsl:copy-of select="$content"/>
+ </fo:list-block>
+ </xsl:otherwise>
+ </xsl:choose>
+
+</xsl:template>
+
+<xsl:template match="itemizedlist/title|orderedlist/title">
+ <!--nop-->
+</xsl:template>
+
+<xsl:template match="variablelist/title" mode="vl.as.list">
+ <!--nop-->
+</xsl:template>
+
+<xsl:template match="variablelist/title" mode="vl.as.blocks">
+ <!--nop-->
+</xsl:template>
+
+<xsl:template match="itemizedlist/titleabbrev|orderedlist/titleabbrev">
+ <!--nop-->
+</xsl:template>
+
+<xsl:template match="procedure/titleabbrev">
+ <!--nop-->
+</xsl:template>
+
+<xsl:template match="variablelist/titleabbrev" mode="vl.as.list">
+ <!--nop-->
+</xsl:template>
+
+<xsl:template match="variablelist/titleabbrev" mode="vl.as.blocks">
+ <!--nop-->
+</xsl:template>
+
+<xsl:template match="itemizedlist/listitem">
+ <xsl:variable name="id"><xsl:call-template name="object.id"/></xsl:variable>
+
+ <xsl:variable name="keep.together">
+ <xsl:call-template name="pi.dbfo_keep-together"/>
+ </xsl:variable>
+
+ <xsl:variable name="item.contents">
+ <fo:list-item-label end-indent="label-end()" xsl:use-attribute-sets="itemizedlist.label.properties">
+ <fo:block>
+ <xsl:call-template name="itemizedlist.label.markup">
+ <xsl:with-param name="itemsymbol">
+ <xsl:call-template name="list.itemsymbol">
+ <xsl:with-param name="node" select="parent::itemizedlist"/>
+ </xsl:call-template>
+ </xsl:with-param>
+ </xsl:call-template>
+ </fo:block>
+ </fo:list-item-label>
+ <fo:list-item-body start-indent="body-start()">
+ <xsl:choose>
+ <!-- * work around broken passivetex list-item-body rendering -->
+ <xsl:when test="$passivetex.extensions = '1'">
+ <xsl:apply-templates/>
+ </xsl:when>
+ <xsl:otherwise>
+ <fo:block>
+ <xsl:apply-templates/>
+ </fo:block>
+ </xsl:otherwise>
+ </xsl:choose>
+ </fo:list-item-body>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="parent::*/@spacing = 'compact'">
+ <fo:list-item id="{$id}" xsl:use-attribute-sets="compact.list.item.spacing">
+ <xsl:if test="$keep.together != ''">
+ <xsl:attribute name="keep-together.within-column"><xsl:value-of
+ select="$keep.together"/></xsl:attribute>
+ </xsl:if>
+ <xsl:copy-of select="$item.contents"/>
+ </fo:list-item>
+ </xsl:when>
+ <xsl:otherwise>
+ <fo:list-item id="{$id}" xsl:use-attribute-sets="list.item.spacing">
+ <xsl:if test="$keep.together != ''">
+ <xsl:attribute name="keep-together.within-column"><xsl:value-of
+ select="$keep.together"/></xsl:attribute>
+ </xsl:if>
+ <xsl:copy-of select="$item.contents"/>
+ </fo:list-item>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="itemizedlist.label.markup">
+ <xsl:param name="itemsymbol" select="'disc'"/>
+
+ <xsl:choose>
+ <xsl:when test="$itemsymbol='none'"></xsl:when>
+ <xsl:when test="$itemsymbol='disc'">&#x2022;</xsl:when>
+ <xsl:when test="$itemsymbol='bullet'">&#x2022;</xsl:when>
+ <xsl:when test="$itemsymbol='endash'">&#x2013;</xsl:when>
+ <xsl:when test="$itemsymbol='emdash'">&#x2014;</xsl:when>
+ <!-- Some of these may work in your XSL-FO processor and fonts -->
+ <!--
+ <xsl:when test="$itemsymbol='square'">&#x25A0;</xsl:when>
+ <xsl:when test="$itemsymbol='box'">&#x25A0;</xsl:when>
+ <xsl:when test="$itemsymbol='smallblacksquare'">&#x25AA;</xsl:when>
+ <xsl:when test="$itemsymbol='circle'">&#x25CB;</xsl:when>
+ <xsl:when test="$itemsymbol='opencircle'">&#x25CB;</xsl:when>
+ <xsl:when test="$itemsymbol='whitesquare'">&#x25A1;</xsl:when>
+ <xsl:when test="$itemsymbol='smallwhitesquare'">&#x25AB;</xsl:when>
+ <xsl:when test="$itemsymbol='round'">&#x25CF;</xsl:when>
+ <xsl:when test="$itemsymbol='blackcircle'">&#x25CF;</xsl:when>
+ <xsl:when test="$itemsymbol='whitebullet'">&#x25E6;</xsl:when>
+ <xsl:when test="$itemsymbol='triangle'">&#x2023;</xsl:when>
+ <xsl:when test="$itemsymbol='point'">&#x203A;</xsl:when>
+ <xsl:when test="$itemsymbol='hand'"><fo:inline
+ font-family="Wingdings 2">A</fo:inline></xsl:when>
+ -->
+ <xsl:otherwise>&#x2022;</xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="orderedlist">
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+
+ <xsl:variable name="pi-label-width">
+ <xsl:call-template name="pi.dbfo_label-width"/>
+ </xsl:variable>
+
+ <xsl:variable name="label-width">
+ <xsl:choose>
+ <xsl:when test="$pi-label-width = ''">
+ <xsl:value-of select="$orderedlist.label.width"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$pi-label-width"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="keep.together">
+ <xsl:call-template name="pi.dbfo_keep-together"/>
+ </xsl:variable>
+
+ <xsl:if test="title">
+ <xsl:apply-templates select="title" mode="list.title.mode"/>
+ </xsl:if>
+
+ <!-- Preserve order of PIs and comments -->
+ <xsl:apply-templates
+ select="*[not(self::listitem
+ or self::title
+ or self::titleabbrev)]
+ |comment()[not(preceding-sibling::listitem)]
+ |processing-instruction()[not(preceding-sibling::listitem)]"/>
+
+ <xsl:variable name="content">
+ <xsl:apply-templates
+ select="listitem
+ |comment()[preceding-sibling::listitem]
+ |processing-instruction()[preceding-sibling::listitem]"/>
+ </xsl:variable>
+
+ <!-- nested lists don't add extra list-block spacing -->
+ <xsl:choose>
+ <xsl:when test="ancestor::listitem">
+ <fo:list-block id="{$id}" xsl:use-attribute-sets="orderedlist.properties">
+ <xsl:attribute name="provisional-distance-between-starts">
+ <xsl:value-of select="$label-width"/>
+ </xsl:attribute>
+ <xsl:if test="$keep.together != ''">
+ <xsl:attribute name="keep-together.within-column"><xsl:value-of
+ select="$keep.together"/></xsl:attribute>
+ </xsl:if>
+ <xsl:copy-of select="$content"/>
+ </fo:list-block>
+ </xsl:when>
+ <xsl:otherwise>
+ <fo:list-block id="{$id}" xsl:use-attribute-sets="list.block.spacing orderedlist.properties">
+ <xsl:attribute name="provisional-distance-between-starts">
+ <xsl:value-of select="$label-width"/>
+ </xsl:attribute>
+ <xsl:if test="$keep.together != ''">
+ <xsl:attribute name="keep-together.within-column"><xsl:value-of
+ select="$keep.together"/></xsl:attribute>
+ </xsl:if>
+ <xsl:copy-of select="$content"/>
+ </fo:list-block>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="orderedlist/listitem">
+ <xsl:variable name="id"><xsl:call-template name="object.id"/></xsl:variable>
+
+ <xsl:variable name="keep.together">
+ <xsl:call-template name="pi.dbfo_keep-together"/>
+ </xsl:variable>
+
+ <xsl:variable name="item.contents">
+ <fo:list-item-label end-indent="label-end()" xsl:use-attribute-sets="orderedlist.label.properties">
+ <fo:block>
+ <xsl:apply-templates select="." mode="item-number"/>
+ </fo:block>
+ </fo:list-item-label>
+ <fo:list-item-body start-indent="body-start()">
+ <fo:block>
+ <xsl:apply-templates/>
+ </fo:block>
+ </fo:list-item-body>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="parent::*/@spacing = 'compact'">
+ <fo:list-item id="{$id}" xsl:use-attribute-sets="compact.list.item.spacing">
+ <xsl:if test="$keep.together != ''">
+ <xsl:attribute name="keep-together.within-column"><xsl:value-of
+ select="$keep.together"/></xsl:attribute>
+ </xsl:if>
+ <xsl:copy-of select="$item.contents"/>
+ </fo:list-item>
+ </xsl:when>
+ <xsl:otherwise>
+ <fo:list-item id="{$id}" xsl:use-attribute-sets="list.item.spacing">
+ <xsl:if test="$keep.together != ''">
+ <xsl:attribute name="keep-together.within-column"><xsl:value-of
+ select="$keep.together"/></xsl:attribute>
+ </xsl:if>
+ <xsl:copy-of select="$item.contents"/>
+ </fo:list-item>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="listitem/*[1][local-name()='para' or
+ local-name()='simpara' or
+ local-name()='formalpara']
+ |glossdef/*[1][local-name()='para' or
+ local-name()='simpara' or
+ local-name()='formalpara']
+ |step/*[1][local-name()='para' or
+ local-name()='simpara' or
+ local-name()='formalpara']
+ |callout/*[1][local-name()='para' or
+ local-name()='simpara' or
+ local-name()='formalpara']"
+ priority="2">
+ <fo:block>
+ <xsl:call-template name="anchor"/>
+ <xsl:apply-templates/>
+ </fo:block>
+</xsl:template>
+
+<xsl:template match="variablelist">
+ <xsl:variable name="presentation">
+ <xsl:call-template name="pi.dbfo_list-presentation"/>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="$presentation = 'list'">
+ <xsl:apply-templates select="." mode="vl.as.list"/>
+ </xsl:when>
+ <xsl:when test="$presentation = 'blocks'">
+ <xsl:apply-templates select="." mode="vl.as.blocks"/>
+ </xsl:when>
+ <xsl:when test="$variablelist.as.blocks != 0">
+ <xsl:apply-templates select="." mode="vl.as.blocks"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="." mode="vl.as.list"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="variablelist" mode="vl.as.list">
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+
+ <xsl:variable name="keep.together">
+ <xsl:call-template name="pi.dbfo_keep-together"/>
+ </xsl:variable>
+
+ <xsl:variable name="term-width">
+ <xsl:call-template name="pi.dbfo_term-width"/>
+ </xsl:variable>
+
+ <xsl:variable name="termlength">
+ <xsl:choose>
+ <xsl:when test="$term-width != ''">
+ <xsl:value-of select="$term-width"/>
+ </xsl:when>
+ <xsl:when test="@termlength">
+ <xsl:variable name="termlength.is.number">
+ <xsl:value-of select="@termlength + 0"/>
+ </xsl:variable>
+ <xsl:choose>
+ <xsl:when test="string($termlength.is.number) = 'NaN'">
+ <!-- if the term length isn't just a number, assume it's a measurement -->
+ <xsl:value-of select="@termlength"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="@termlength"/>
+ <xsl:choose>
+ <!-- workaround for passivetex lack of support for non-constant expressions -->
+ <xsl:when test="$passivetex.extensions != 0">
+ <xsl:text>em</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text>em * 0.60</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="longest.term">
+ <xsl:with-param name="terms" select="varlistentry/term"/>
+ <xsl:with-param name="maxlength" select="$variablelist.max.termlength"/>
+ </xsl:call-template>
+ <xsl:choose>
+ <!-- workaround for passivetex lack of support for non-constant expressions -->
+ <xsl:when test="$passivetex.extensions != 0">
+ <xsl:text>em</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text>em * 0.60</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+<!--
+ <xsl:message>
+ <xsl:text>term width: </xsl:text>
+ <xsl:value-of select="$termlength"/>
+ </xsl:message>
+-->
+
+ <xsl:variable name="label-separation">1em</xsl:variable>
+ <xsl:variable name="distance-between-starts">
+ <xsl:choose>
+ <!-- workaround for passivetex lack of support for non-constant expressions -->
+ <xsl:when test="$passivetex.extensions != 0">
+ <xsl:value-of select="$termlength"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$termlength"/>
+ <xsl:text>+</xsl:text>
+ <xsl:value-of select="$label-separation"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:if test="title">
+ <xsl:apply-templates select="title" mode="list.title.mode"/>
+ </xsl:if>
+
+ <!-- Preserve order of PIs and comments -->
+ <xsl:apply-templates
+ select="*[not(self::varlistentry
+ or self::title
+ or self::titleabbrev)]
+ |comment()[not(preceding-sibling::varlistentry)]
+ |processing-instruction()[not(preceding-sibling::varlistentry)]"/>
+
+ <xsl:variable name="content">
+ <xsl:apply-templates mode="vl.as.list"
+ select="varlistentry
+ |comment()[preceding-sibling::varlistentry]
+ |processing-instruction()[preceding-sibling::varlistentry]"/>
+ </xsl:variable>
+
+ <!-- nested lists don't add extra list-block spacing -->
+ <xsl:choose>
+ <xsl:when test="ancestor::listitem">
+ <fo:list-block id="{$id}"
+ provisional-distance-between-starts=
+ "{$distance-between-starts}"
+ provisional-label-separation="{$label-separation}">
+ <xsl:if test="$keep.together != ''">
+ <xsl:attribute name="keep-together.within-column"><xsl:value-of
+ select="$keep.together"/></xsl:attribute>
+ </xsl:if>
+ <xsl:copy-of select="$content"/>
+ </fo:list-block>
+ </xsl:when>
+ <xsl:otherwise>
+ <fo:list-block id="{$id}"
+ provisional-distance-between-starts=
+ "{$distance-between-starts}"
+ provisional-label-separation="{$label-separation}"
+ xsl:use-attribute-sets="list.block.spacing">
+ <xsl:if test="$keep.together != ''">
+ <xsl:attribute name="keep-together.within-column"><xsl:value-of
+ select="$keep.together"/></xsl:attribute>
+ </xsl:if>
+ <xsl:copy-of select="$content"/>
+ </fo:list-block>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="longest.term">
+ <xsl:param name="longest" select="0"/>
+ <xsl:param name="terms" select="."/>
+ <xsl:param name="maxlength" select="-1"/>
+
+ <!-- Process out any indexterms in the term -->
+ <xsl:variable name="term.text">
+ <xsl:apply-templates select="$terms[1]"/>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="$longest &gt; $maxlength and $maxlength &gt; 0">
+ <xsl:value-of select="$maxlength"/>
+ </xsl:when>
+ <xsl:when test="not($terms)">
+ <xsl:value-of select="$longest"/>
+ </xsl:when>
+ <xsl:when test="string-length($term.text) &gt; $longest">
+ <xsl:call-template name="longest.term">
+ <xsl:with-param name="longest"
+ select="string-length($term.text)"/>
+ <xsl:with-param name="maxlength" select="$maxlength"/>
+ <xsl:with-param name="terms" select="$terms[position() &gt; 1]"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="longest.term">
+ <xsl:with-param name="longest" select="$longest"/>
+ <xsl:with-param name="maxlength" select="$maxlength"/>
+ <xsl:with-param name="terms" select="$terms[position() &gt; 1]"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="varlistentry" mode="vl.as.list">
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+
+ <xsl:variable name="keep.together">
+ <xsl:call-template name="pi.dbfo_keep-together"/>
+ </xsl:variable>
+
+ <xsl:variable name="item.contents">
+ <fo:list-item-label end-indent="label-end()" text-align="start">
+ <fo:block xsl:use-attribute-sets="variablelist.term.properties">
+ <xsl:apply-templates select="term"/>
+ </fo:block>
+ </fo:list-item-label>
+ <fo:list-item-body start-indent="body-start()">
+ <fo:block>
+ <xsl:apply-templates select="listitem"/>
+ </fo:block>
+ </fo:list-item-body>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="parent::*/@spacing = 'compact'">
+ <fo:list-item id="{$id}"
+ xsl:use-attribute-sets="compact.list.item.spacing">
+ <xsl:if test="$keep.together != ''">
+ <xsl:attribute name="keep-together.within-column"><xsl:value-of
+ select="$keep.together"/></xsl:attribute>
+ </xsl:if>
+ <xsl:copy-of select="$item.contents"/>
+ </fo:list-item>
+ </xsl:when>
+ <xsl:otherwise>
+ <fo:list-item id="{$id}" xsl:use-attribute-sets="list.item.spacing">
+ <xsl:if test="$keep.together != ''">
+ <xsl:attribute name="keep-together.within-column"><xsl:value-of
+ select="$keep.together"/></xsl:attribute>
+ </xsl:if>
+ <xsl:copy-of select="$item.contents"/>
+ </fo:list-item>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+
+<xsl:template match="variablelist" mode="vl.as.blocks">
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+
+ <!-- termlength is irrelevant -->
+
+ <xsl:if test="title">
+ <xsl:apply-templates select="title" mode="list.title.mode"/>
+ </xsl:if>
+
+ <!-- Preserve order of PIs and comments -->
+ <xsl:apply-templates
+ select="*[not(self::varlistentry
+ or self::title
+ or self::titleabbrev)]
+ |comment()[not(preceding-sibling::varlistentry)]
+ |processing-instruction()[not(preceding-sibling::varlistentry)]"/>
+
+ <xsl:variable name="content">
+ <xsl:apply-templates mode="vl.as.blocks"
+ select="varlistentry
+ |comment()[preceding-sibling::varlistentry]
+ |processing-instruction()[preceding-sibling::varlistentry]"/>
+ </xsl:variable>
+
+ <!-- nested lists don't add extra list-block spacing -->
+ <xsl:choose>
+ <xsl:when test="ancestor::listitem">
+ <fo:block id="{$id}">
+ <xsl:copy-of select="$content"/>
+ </fo:block>
+ </xsl:when>
+ <xsl:otherwise>
+ <fo:block id="{$id}" xsl:use-attribute-sets="list.block.spacing">
+ <xsl:copy-of select="$content"/>
+ </fo:block>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="varlistentry" mode="vl.as.blocks">
+ <xsl:variable name="id"><xsl:call-template name="object.id"/></xsl:variable>
+
+ <fo:block id="{$id}" xsl:use-attribute-sets="variablelist.term.properties
+ list.item.spacing"
+ keep-together.within-column="always"
+ keep-with-next.within-column="always">
+ <xsl:apply-templates select="term"/>
+ </fo:block>
+
+ <fo:block>
+ <xsl:attribute name="margin-{$direction.align.start}">0.25in</xsl:attribute>
+ <xsl:apply-templates select="listitem"/>
+ </fo:block>
+</xsl:template>
+
+<xsl:template match="varlistentry/term">
+ <fo:inline>
+ <xsl:call-template name="simple.xlink">
+ <xsl:with-param name="content">
+ <xsl:apply-templates/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </fo:inline>
+ <xsl:choose>
+ <xsl:when test="not(following-sibling::term)"/> <!-- do nothing -->
+ <xsl:otherwise>
+ <!-- * if we have multiple terms in the same varlistentry, generate -->
+ <!-- * a separator (", " by default) and/or an additional line -->
+ <!-- * break after each one except the last -->
+ <fo:inline><xsl:value-of select="$variablelist.term.separator"/></fo:inline>
+ <xsl:if test="not($variablelist.term.break.after = '0')">
+ <fo:block/>
+ </xsl:if>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="varlistentry/listitem">
+ <xsl:apply-templates/>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="title" mode="list.title.mode">
+ <xsl:call-template name="formal.object.heading">
+ <xsl:with-param name="object" select=".."/>
+ </xsl:call-template>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="simplelist|simplelist[@type='vert']">
+ <!-- with no type specified, the default is 'vert' -->
+
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+
+ <xsl:variable name="explicit.table.width">
+ <xsl:call-template name="dbfo-attribute">
+ <xsl:with-param name="pis"
+ select="processing-instruction('dbfo')"/>
+ <xsl:with-param name="attribute" select="'list-width'"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="table.width">
+ <xsl:choose>
+ <xsl:when test="$explicit.table.width != ''">
+ <xsl:value-of select="$explicit.table.width"/>
+ </xsl:when>
+ <xsl:when test="$default.table.width = ''">
+ <xsl:text>100%</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$default.table.width"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <fo:table id="{$id}" xsl:use-attribute-sets="normal.para.spacing">
+
+ <xsl:choose>
+ <xsl:when test="$axf.extensions != 0 or $xep.extensions != 0">
+ <xsl:attribute name="table-layout">auto</xsl:attribute>
+ <xsl:if test="$explicit.table.width != ''">
+ <xsl:attribute name="width"><xsl:value-of
+ select="$explicit.table.width"/></xsl:attribute>
+ </xsl:if>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:attribute name="table-layout">fixed</xsl:attribute>
+ <xsl:attribute name="width"><xsl:value-of
+ select="$table.width"/></xsl:attribute>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:call-template name="simplelist.table.columns">
+ <xsl:with-param name="cols">
+ <xsl:choose>
+ <xsl:when test="@columns">
+ <xsl:value-of select="@columns"/>
+ </xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:with-param>
+ </xsl:call-template>
+ <fo:table-body start-indent="0pt" end-indent="0pt">
+ <xsl:call-template name="simplelist.vert">
+ <xsl:with-param name="cols">
+ <xsl:choose>
+ <xsl:when test="@columns">
+ <xsl:value-of select="@columns"/>
+ </xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:with-param>
+ </xsl:call-template>
+ </fo:table-body>
+ </fo:table>
+</xsl:template>
+
+<xsl:template match="simplelist[@type='inline']">
+ <!-- if dbchoice PI exists, use that to determine the choice separator -->
+ <!-- (that is, equivalent of "and" or "or" in current locale), or literal -->
+ <!-- value of "choice" otherwise -->
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+
+ <fo:inline id="{$id}"><xsl:variable name="localized-choice-separator">
+ <xsl:choose>
+ <xsl:when test="processing-instruction('dbchoice')">
+ <xsl:call-template name="select.choice.separator"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <!-- empty -->
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:for-each select="member">
+ <xsl:apply-templates/>
+ <xsl:choose>
+ <xsl:when test="position() = last()"/> <!-- do nothing -->
+ <xsl:otherwise>
+ <xsl:text>, </xsl:text>
+ <xsl:if test="position() = last() - 1">
+ <xsl:if test="$localized-choice-separator != ''">
+ <xsl:value-of select="$localized-choice-separator"/>
+ <xsl:text> </xsl:text>
+ </xsl:if>
+ </xsl:if>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:for-each></fo:inline>
+</xsl:template>
+
+<xsl:template match="simplelist[@type='horiz']">
+
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+
+ <xsl:variable name="explicit.table.width">
+ <xsl:call-template name="pi.dbfo_list-width"/>
+ </xsl:variable>
+
+ <xsl:variable name="table.width">
+ <xsl:choose>
+ <xsl:when test="$explicit.table.width != ''">
+ <xsl:value-of select="$explicit.table.width"/>
+ </xsl:when>
+ <xsl:when test="$default.table.width = ''">
+ <xsl:text>100%</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$default.table.width"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <fo:table id="{$id}" xsl:use-attribute-sets="normal.para.spacing">
+ <xsl:choose>
+ <xsl:when test="$axf.extensions != 0 or $xep.extensions != 0">
+ <xsl:attribute name="table-layout">auto</xsl:attribute>
+ <xsl:if test="$explicit.table.width != ''">
+ <xsl:attribute name="width"><xsl:value-of
+ select="$explicit.table.width"/></xsl:attribute>
+ </xsl:if>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:attribute name="table-layout">fixed</xsl:attribute>
+ <xsl:attribute name="width"><xsl:value-of
+ select="$table.width"/></xsl:attribute>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:call-template name="simplelist.table.columns">
+ <xsl:with-param name="cols">
+ <xsl:choose>
+ <xsl:when test="@columns">
+ <xsl:value-of select="@columns"/>
+ </xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:with-param>
+ </xsl:call-template>
+ <fo:table-body start-indent="0pt" end-indent="0pt">
+ <xsl:call-template name="simplelist.horiz">
+ <xsl:with-param name="cols">
+ <xsl:choose>
+ <xsl:when test="@columns">
+ <xsl:value-of select="@columns"/>
+ </xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:with-param>
+ </xsl:call-template>
+ </fo:table-body>
+ </fo:table>
+</xsl:template>
+
+<xsl:template name="simplelist.table.columns">
+ <xsl:param name="cols" select="1"/>
+ <xsl:param name="curcol" select="1"/>
+ <fo:table-column column-number="{$curcol}"
+ column-width="proportional-column-width(1)"/>
+ <xsl:if test="$curcol &lt; $cols">
+ <xsl:call-template name="simplelist.table.columns">
+ <xsl:with-param name="cols" select="$cols"/>
+ <xsl:with-param name="curcol" select="$curcol + 1"/>
+ </xsl:call-template>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template name="simplelist.horiz">
+ <xsl:param name="cols">1</xsl:param>
+ <xsl:param name="cell">1</xsl:param>
+ <xsl:param name="members" select="./member"/>
+
+ <xsl:if test="$cell &lt;= count($members)">
+ <fo:table-row>
+ <xsl:call-template name="simplelist.horiz.row">
+ <xsl:with-param name="cols" select="$cols"/>
+ <xsl:with-param name="cell" select="$cell"/>
+ <xsl:with-param name="members" select="$members"/>
+ </xsl:call-template>
+ </fo:table-row>
+ <xsl:call-template name="simplelist.horiz">
+ <xsl:with-param name="cols" select="$cols"/>
+ <xsl:with-param name="cell" select="$cell + $cols"/>
+ <xsl:with-param name="members" select="$members"/>
+ </xsl:call-template>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template name="simplelist.horiz.row">
+ <xsl:param name="cols">1</xsl:param>
+ <xsl:param name="cell">1</xsl:param>
+ <xsl:param name="members" select="./member"/>
+ <xsl:param name="curcol">1</xsl:param>
+
+ <xsl:if test="$curcol &lt;= $cols">
+ <fo:table-cell>
+ <fo:block>
+ <xsl:if test="$members[position()=$cell]">
+ <xsl:apply-templates select="$members[position()=$cell]"/>
+ </xsl:if>
+ </fo:block>
+ </fo:table-cell>
+ <xsl:call-template name="simplelist.horiz.row">
+ <xsl:with-param name="cols" select="$cols"/>
+ <xsl:with-param name="cell" select="$cell+1"/>
+ <xsl:with-param name="members" select="$members"/>
+ <xsl:with-param name="curcol" select="$curcol+1"/>
+ </xsl:call-template>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template name="simplelist.vert">
+ <xsl:param name="cols">1</xsl:param>
+ <xsl:param name="cell">1</xsl:param>
+ <xsl:param name="members" select="./member"/>
+ <xsl:param name="rows"
+ select="floor((count($members)+$cols - 1) div $cols)"/>
+
+ <xsl:if test="$cell &lt;= $rows">
+ <fo:table-row>
+ <xsl:call-template name="simplelist.vert.row">
+ <xsl:with-param name="cols" select="$cols"/>
+ <xsl:with-param name="rows" select="$rows"/>
+ <xsl:with-param name="cell" select="$cell"/>
+ <xsl:with-param name="members" select="$members"/>
+ </xsl:call-template>
+ </fo:table-row>
+ <xsl:call-template name="simplelist.vert">
+ <xsl:with-param name="cols" select="$cols"/>
+ <xsl:with-param name="cell" select="$cell+1"/>
+ <xsl:with-param name="members" select="$members"/>
+ <xsl:with-param name="rows" select="$rows"/>
+ </xsl:call-template>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template name="simplelist.vert.row">
+ <xsl:param name="cols">1</xsl:param>
+ <xsl:param name="rows">1</xsl:param>
+ <xsl:param name="cell">1</xsl:param>
+ <xsl:param name="members" select="./member"/>
+ <xsl:param name="curcol">1</xsl:param>
+
+ <xsl:if test="$curcol &lt;= $cols">
+ <fo:table-cell>
+ <fo:block>
+ <xsl:if test="$members[position()=$cell]">
+ <xsl:apply-templates select="$members[position()=$cell]"/>
+ </xsl:if>
+ </fo:block>
+ </fo:table-cell>
+ <xsl:call-template name="simplelist.vert.row">
+ <xsl:with-param name="cols" select="$cols"/>
+ <xsl:with-param name="rows" select="$rows"/>
+ <xsl:with-param name="cell" select="$cell+$rows"/>
+ <xsl:with-param name="members" select="$members"/>
+ <xsl:with-param name="curcol" select="$curcol+1"/>
+ </xsl:call-template>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="member">
+ <xsl:call-template name="simple.xlink">
+ <xsl:with-param name="content">
+ <xsl:apply-templates/>
+ </xsl:with-param>
+ </xsl:call-template>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="procedure">
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+
+ <xsl:variable name="param.placement"
+ select="substring-after(normalize-space($formal.title.placement),
+ concat(local-name(.), ' '))"/>
+
+ <xsl:variable name="placement">
+ <xsl:choose>
+ <xsl:when test="contains($param.placement, ' ')">
+ <xsl:value-of select="substring-before($param.placement, ' ')"/>
+ </xsl:when>
+ <xsl:when test="$param.placement = ''">before</xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$param.placement"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <!-- Preserve order of PIs and comments -->
+ <xsl:variable name="preamble"
+ select="*[not(self::step
+ or self::title
+ or self::titleabbrev)]
+ |comment()[not(preceding-sibling::step)]
+ |processing-instruction()[not(preceding-sibling::step)]"/>
+
+ <xsl:variable name="steps"
+ select="step
+ |comment()[preceding-sibling::step]
+ |processing-instruction()[preceding-sibling::step]"/>
+
+ <fo:block id="{$id}" xsl:use-attribute-sets="procedure.properties list.block.spacing">
+ <xsl:if test="./title and $placement = 'before'">
+ <!-- n.b. gentext code tests for $formal.procedures and may make an "informal" -->
+ <!-- heading even though we called formal.object.heading. odd but true. -->
+ <xsl:call-template name="formal.object.heading"/>
+ </xsl:if>
+
+ <xsl:apply-templates select="$preamble"/>
+
+ <fo:list-block xsl:use-attribute-sets="list.block.spacing"
+ provisional-distance-between-starts="2em"
+ provisional-label-separation="0.2em">
+ <xsl:apply-templates select="$steps"/>
+ </fo:list-block>
+
+ <xsl:if test="./title and $placement != 'before'">
+ <!-- n.b. gentext code tests for $formal.procedures and may make an "informal" -->
+ <!-- heading even though we called formal.object.heading. odd but true. -->
+ <xsl:call-template name="formal.object.heading"/>
+ </xsl:if>
+ </fo:block>
+</xsl:template>
+
+<xsl:template match="procedure/title">
+</xsl:template>
+
+<xsl:template match="substeps">
+ <fo:list-block xsl:use-attribute-sets="list.block.spacing"
+ provisional-distance-between-starts="2em"
+ provisional-label-separation="0.2em">
+ <xsl:apply-templates/>
+ </fo:list-block>
+</xsl:template>
+
+<xsl:template match="procedure/step|substeps/step">
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+
+ <xsl:variable name="keep.together">
+ <xsl:call-template name="pi.dbfo_keep-together"/>
+ </xsl:variable>
+
+ <fo:list-item xsl:use-attribute-sets="list.item.spacing">
+ <xsl:if test="$keep.together != ''">
+ <xsl:attribute name="keep-together.within-column"><xsl:value-of
+ select="$keep.together"/></xsl:attribute>
+ </xsl:if>
+ <fo:list-item-label end-indent="label-end()">
+ <fo:block id="{$id}">
+ <!-- dwc: fix for one step procedures. Use a bullet if there's no step 2 -->
+ <xsl:choose>
+ <xsl:when test="count(../step) = 1">
+ <xsl:text>&#x2022;</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="." mode="number">
+ <xsl:with-param name="recursive" select="0"/>
+ </xsl:apply-templates>.
+ </xsl:otherwise>
+ </xsl:choose>
+ </fo:block>
+ </fo:list-item-label>
+ <fo:list-item-body start-indent="body-start()">
+ <fo:block>
+ <xsl:apply-templates/>
+ </fo:block>
+ </fo:list-item-body>
+ </fo:list-item>
+</xsl:template>
+
+<xsl:template match="stepalternatives">
+ <fo:list-block provisional-distance-between-starts="2em"
+ provisional-label-separation="0.2em">
+ <xsl:apply-templates select="step"/>
+ </fo:list-block>
+</xsl:template>
+
+<xsl:template match="stepalternatives/step">
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+
+ <xsl:variable name="keep.together">
+ <xsl:call-template name="pi.dbfo_keep-together"/>
+ </xsl:variable>
+
+ <fo:list-item xsl:use-attribute-sets="list.item.spacing">
+ <xsl:if test="$keep.together != ''">
+ <xsl:attribute name="keep-together.within-column"><xsl:value-of
+ select="$keep.together"/></xsl:attribute>
+ </xsl:if>
+ <fo:list-item-label end-indent="label-end()">
+ <fo:block id="{$id}">
+ <xsl:text>&#x2022;</xsl:text>
+ </fo:block>
+ </fo:list-item-label>
+ <fo:list-item-body start-indent="body-start()">
+ <fo:block>
+ <xsl:apply-templates/>
+ </fo:block>
+ </fo:list-item-body>
+ </fo:list-item>
+</xsl:template>
+
+<xsl:template match="step/title">
+ <fo:block font-weight="bold"
+ keep-together.within-column="always"
+ keep-with-next.within-column="always">
+ <xsl:apply-templates/>
+ </fo:block>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="segmentedlist">
+ <xsl:variable name="presentation">
+ <xsl:call-template name="pi.dbfo_list-presentation"/>
+ </xsl:variable>
+
+ <xsl:variable name="keep.together">
+ <xsl:call-template name="pi.dbfo_keep-together"/>
+ </xsl:variable>
+
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="$presentation = 'table'">
+ <fo:block id="{$id}">
+ <xsl:if test="$keep.together != ''">
+ <xsl:attribute name="keep-together.within-column"><xsl:value-of
+ select="$keep.together"/></xsl:attribute>
+ </xsl:if>
+ <xsl:apply-templates select="." mode="seglist-table"/>
+ </fo:block>
+ </xsl:when>
+ <xsl:when test="$presentation = 'list'">
+ <fo:block id="{$id}">
+ <xsl:if test="$keep.together != ''">
+ <xsl:attribute name="keep-together.within-column"><xsl:value-of
+ select="$keep.together"/></xsl:attribute>
+ </xsl:if>
+ <xsl:apply-templates/>
+ </fo:block>
+ </xsl:when>
+ <xsl:when test="$segmentedlist.as.table != 0">
+ <fo:block id="{$id}">
+ <xsl:if test="$keep.together != ''">
+ <xsl:attribute name="keep-together.within-column"><xsl:value-of
+ select="$keep.together"/></xsl:attribute>
+ </xsl:if>
+ <xsl:apply-templates select="." mode="seglist-table"/>
+ </fo:block>
+ </xsl:when>
+ <xsl:otherwise>
+ <fo:block id="{$id}">
+ <xsl:if test="$keep.together != ''">
+ <xsl:attribute name="keep-together.within-column"><xsl:value-of
+ select="$keep.together"/></xsl:attribute>
+ </xsl:if>
+
+ <xsl:apply-templates/>
+ </fo:block>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="segmentedlist/title">
+ <xsl:apply-templates select="." mode="list.title.mode" />
+</xsl:template>
+
+<xsl:template match="segtitle">
+</xsl:template>
+
+<xsl:template match="segtitle" mode="segtitle-in-seg">
+ <xsl:apply-templates/>
+</xsl:template>
+
+<xsl:template match="seglistitem">
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+ <fo:block id="{$id}">
+ <xsl:apply-templates/>
+ </fo:block>
+</xsl:template>
+
+<xsl:template match="seg">
+ <xsl:variable name="segnum" select="count(preceding-sibling::seg)+1"/>
+ <xsl:variable name="seglist" select="ancestor::segmentedlist"/>
+ <xsl:variable name="segtitles" select="$seglist/segtitle"/>
+
+ <!--
+ Note: segtitle is only going to be the right thing in a well formed
+ SegmentedList. If there are too many Segs or too few SegTitles,
+ you'll get something odd...maybe an error
+ -->
+
+ <fo:block>
+ <fo:inline font-weight="bold">
+ <xsl:apply-templates select="$segtitles[$segnum=position()]"
+ mode="segtitle-in-seg"/>
+ <xsl:text>: </xsl:text>
+ </fo:inline>
+ <xsl:apply-templates/>
+ </fo:block>
+</xsl:template>
+
+<xsl:template match="segmentedlist" mode="seglist-table">
+ <xsl:apply-templates select="title" mode="list.title.mode" />
+ <fo:table table-layout="fixed">
+ <fo:table-column column-number="1" column-width="proportional-column-width(1)"/>
+ <fo:table-column column-number="2" column-width="proportional-column-width(1)"/>
+ <fo:table-header start-indent="0pt" end-indent="0pt">
+ <fo:table-row>
+ <xsl:apply-templates select="segtitle" mode="seglist-table"/>
+ </fo:table-row>
+ </fo:table-header>
+ <fo:table-body start-indent="0pt" end-indent="0pt">
+ <xsl:apply-templates select="seglistitem" mode="seglist-table"/>
+ </fo:table-body>
+ </fo:table>
+</xsl:template>
+
+<xsl:template match="segtitle" mode="seglist-table">
+ <fo:table-cell>
+ <fo:block font-weight="bold">
+ <xsl:apply-templates/>
+ </fo:block>
+ </fo:table-cell>
+</xsl:template>
+
+<xsl:template match="seglistitem" mode="seglist-table">
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+ <fo:table-row id="{$id}">
+ <xsl:apply-templates mode="seglist-table"/>
+ </fo:table-row>
+</xsl:template>
+
+<xsl:template match="seg" mode="seglist-table">
+ <fo:table-cell>
+ <fo:block>
+ <xsl:apply-templates/>
+ </fo:block>
+ </fo:table-cell>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="calloutlist">
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+
+ <xsl:variable name="pi-label-width">
+ <xsl:call-template name="pi.dbfo_label-width"/>
+ </xsl:variable>
+
+ <fo:block id="{$id}"
+ text-align="{$alignment}">
+ <!-- The above restores alignment altered by image align attribute -->
+ <xsl:if test="title|info/title">
+ <xsl:apply-templates select="(title|info/title)[1]"
+ mode="list.title.mode"/>
+ </xsl:if>
+
+ <!-- Preserve order of PIs and comments -->
+ <xsl:apply-templates
+ select="*[not(self::callout or self::title or self::titleabbrev)]
+ |comment()[not(preceding-sibling::callout)]
+ |processing-instruction()[not(preceding-sibling::callout)]"/>
+
+ <fo:list-block space-before.optimum="1em"
+ space-before.minimum="0.8em"
+ space-before.maximum="1.2em"
+ provisional-distance-between-starts="2.2em"
+ provisional-label-separation="0.2em">
+
+ <xsl:if test="$pi-label-width != ''">
+ <xsl:attribute name="provisional-distance-between-starts">
+ <xsl:value-of select="$pi-label-width"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:apply-templates select="callout
+ |comment()[preceding-sibling::callout]
+ |processing-instruction()[preceding-sibling::callout]"/>
+ </fo:list-block>
+ </fo:block>
+</xsl:template>
+
+<xsl:template match="calloutlist/title">
+</xsl:template>
+
+<xsl:template match="callout">
+ <xsl:variable name="id"><xsl:call-template name="object.id"/></xsl:variable>
+
+ <xsl:variable name="keep.together">
+ <xsl:call-template name="pi.dbfo_keep-together"/>
+ </xsl:variable>
+
+ <fo:list-item id="{$id}">
+ <xsl:if test="$keep.together != ''">
+ <xsl:attribute name="keep-together.within-column"><xsl:value-of
+ select="$keep.together"/></xsl:attribute>
+ </xsl:if>
+ <fo:list-item-label end-indent="label-end()">
+ <fo:block>
+ <xsl:call-template name="callout.arearefs">
+ <xsl:with-param name="arearefs" select="@arearefs"/>
+ </xsl:call-template>
+ </fo:block>
+ </fo:list-item-label>
+ <fo:list-item-body start-indent="body-start()">
+ <fo:block>
+ <xsl:apply-templates/>
+ </fo:block>
+ </fo:list-item-body>
+ </fo:list-item>
+</xsl:template>
+
+<xsl:template name="callout.arearefs">
+ <xsl:param name="arearefs"></xsl:param>
+ <xsl:if test="$arearefs!=''">
+ <xsl:choose>
+ <xsl:when test="substring-before($arearefs,' ')=''">
+ <xsl:call-template name="callout.arearef">
+ <xsl:with-param name="arearef" select="$arearefs"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="callout.arearef">
+ <xsl:with-param name="arearef"
+ select="substring-before($arearefs,' ')"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:call-template name="callout.arearefs">
+ <xsl:with-param name="arearefs"
+ select="substring-after($arearefs,' ')"/>
+ </xsl:call-template>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template name="callout.arearef">
+ <xsl:param name="arearef"></xsl:param>
+ <xsl:variable name="targets" select="key('id',$arearef)"/>
+ <xsl:variable name="target" select="$targets[1]"/>
+
+ <xsl:choose>
+ <xsl:when test="count($target)=0">
+ <xsl:value-of select="$arearef"/>
+ <xsl:text>: ???</xsl:text>
+ </xsl:when>
+ <xsl:when test="local-name($target)='co'">
+ <xsl:apply-templates select="$target" mode="callout-bug"/>
+ </xsl:when>
+ <xsl:when test="local-name($target)='areaset'">
+ <xsl:call-template name="callout-bug">
+ <xsl:with-param name="conum">
+ <xsl:apply-templates select="$target" mode="conumber"/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="local-name($target)='area'">
+ <xsl:choose>
+ <xsl:when test="$target/parent::areaset">
+ <xsl:call-template name="callout-bug">
+ <xsl:with-param name="conum">
+ <xsl:apply-templates select="$target/parent::areaset"
+ mode="conumber"/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="callout-bug">
+ <xsl:with-param name="conum">
+ <xsl:apply-templates select="$target" mode="conumber"/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text>???</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template name="orderedlist-starting-number">
+ <xsl:param name="list" select="."/>
+ <xsl:variable name="pi-start">
+ <xsl:call-template name="pi.dbfo_start">
+ <xsl:with-param name="node" select="$list"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:call-template name="output-orderedlist-starting-number">
+ <xsl:with-param name="list" select="$list"/>
+ <xsl:with-param name="pi-start" select="$pi-start"/>
+ </xsl:call-template>
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/math.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/math.xsl
new file mode 100644
index 0000000..6d7d470
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/math.xsl
@@ -0,0 +1,140 @@
+<?xml version='1.0'?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:fo="http://www.w3.org/1999/XSL/Format"
+ xmlns:mml="http://www.w3.org/1998/Math/MathML"
+ exclude-result-prefixes="mml"
+ version='1.0'>
+
+<!-- ********************************************************************
+ $Id: math.xsl 7503 2007-10-08 01:57:30Z xmldoc $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<xsl:template match="inlineequation">
+ <xsl:choose>
+ <xsl:when test="$passivetex.extensions != 0 and $tex.math.in.alt != ''">
+ <xsl:apply-templates select="alt[@role='tex'] | inlinemediaobject/textobject[@role='tex']">
+ <xsl:with-param name="output.delims">
+ <xsl:call-template name="tex.math.output.delims"/>
+ </xsl:with-param>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="alt">
+</xsl:template>
+
+<xsl:template match="mathphrase">
+ <fo:inline>
+ <xsl:apply-templates/>
+ </fo:inline>
+</xsl:template>
+
+<!-- "Support" for MathML -->
+
+<xsl:template match="mml:math" xmlns:mml="http://www.w3.org/1998/Math/MathML">
+ <xsl:choose>
+ <!-- * If user is using passivetex, we don't wrap the output in -->
+ <!-- * fo:instream-foreign-object (which passivetex doesn't support). -->
+ <xsl:when test="not($passivetex.extensions = 0)">
+ <xsl:copy>
+ <xsl:copy-of select="@*"/>
+ <xsl:apply-templates/>
+ </xsl:copy>
+ </xsl:when>
+ <xsl:otherwise>
+ <fo:instream-foreign-object>
+ <xsl:copy>
+ <xsl:copy-of select="@*"/>
+ <xsl:apply-templates/>
+ </xsl:copy>
+ </fo:instream-foreign-object>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="mml:*" xmlns:mml="http://www.w3.org/1998/Math/MathML">
+ <xsl:copy>
+ <xsl:copy-of select="@*"/>
+ <xsl:apply-templates/>
+ </xsl:copy>
+</xsl:template>
+
+<xsl:template match="equation/graphic | informalequation/graphic">
+ <xsl:if test="$passivetex.extensions = 0 or $tex.math.in.alt = ''">
+ <fo:block>
+ <xsl:call-template name="process.image"/>
+ </fo:block>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="inlineequation/alt[@role='tex'] |
+ inlineequation/inlinemediaobject/textobject[@role='tex']" priority="1">
+ <xsl:param name="output.delims" select="1"/>
+ <xsl:if test="$passivetex.extensions != 0 and $tex.math.in.alt != ''">
+ <xsl:processing-instruction name="xmltex">
+ <xsl:if test="$output.delims != 0">
+ <xsl:text>$</xsl:text>
+ </xsl:if>
+ <xsl:value-of select="."/>
+ <xsl:if test="$output.delims != 0">
+ <xsl:text>$</xsl:text>
+ </xsl:if>
+ </xsl:processing-instruction>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="equation/alt[@role='tex'] | informalequation/alt[@role='tex'] |
+ equation/mediaobject/textobject[@role='tex'] |
+ informalequation/mediaobject/textobject[@role='tex']" priority="1">
+ <xsl:variable name="output.delims">
+ <xsl:call-template name="tex.math.output.delims"/>
+ </xsl:variable>
+ <xsl:if test="$passivetex.extensions != 0 and $tex.math.in.alt != ''">
+ <xsl:processing-instruction name="xmltex">
+ <xsl:if test="$output.delims != 0">
+ <xsl:text>$$</xsl:text>
+ </xsl:if>
+ <xsl:value-of select="."/>
+ <xsl:if test="$output.delims != 0">
+ <xsl:text>$$</xsl:text>
+ </xsl:if>
+ </xsl:processing-instruction>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="alt[@role='tex']">
+ <xsl:if test="$passivetex.extensions != 0 and $tex.math.in.alt != ''">
+ <xsl:message>
+ Your equation is misplaced. It should be in inlineequation, equation or informalequation.
+ </xsl:message>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template name="tex.math.output.delims">
+ <xsl:variable name="pi.delims">
+ <xsl:call-template name="pi-attribute">
+ <xsl:with-param name="pis" select=".//processing-instruction('dbtex')"/>
+ <xsl:with-param name="attribute" select="'delims'"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:variable name="result">
+ <xsl:choose>
+ <xsl:when test="$pi.delims = 'no'">0</xsl:when>
+ <xsl:when test="$pi.delims = '' and $tex.math.delims = 0">0</xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:value-of select="$result"/>
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/pagesetup.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/pagesetup.xsl
new file mode 100644
index 0000000..116a2ca
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/pagesetup.xsl
@@ -0,0 +1,2569 @@
+<?xml version="1.0"?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:fo="http://www.w3.org/1999/XSL/Format"
+ version="1.0">
+
+<!-- ********************************************************************
+ $Id: pagesetup.xsl 8900 2010-08-29 20:04:32Z dleidert $
+ ********************************************************************
+
+ This file is part of the DocBook XSL Stylesheet distribution.
+ See ../README or http://docbook.sf.net/ for copyright
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<!-- ==================================================================== -->
+
+<xsl:param name="body.fontset">
+ <xsl:value-of select="$body.font.family"/>
+ <xsl:if test="$body.font.family != ''
+ and $symbol.font.family != ''">,</xsl:if>
+ <xsl:value-of select="$symbol.font.family"/>
+</xsl:param>
+
+<xsl:param name="title.fontset">
+ <xsl:value-of select="$title.font.family"/>
+ <xsl:if test="$title.font.family != ''
+ and $symbol.font.family != ''">,</xsl:if>
+ <xsl:value-of select="$symbol.font.family"/>
+</xsl:param>
+
+<xsl:param name="margin.left.inner">
+ <xsl:choose>
+ <xsl:when test="$passivetex.extensions != 0">
+ <xsl:value-of select="$page.margin.inner"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$page.margin.inner"/>
+ <xsl:text> - </xsl:text>
+ <xsl:value-of select="$title.margin.left"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:param>
+
+<xsl:template name="setup.pagemasters">
+ <fo:layout-master-set>
+ <!-- blank pages -->
+ <fo:simple-page-master master-name="blank"
+ page-width="{$page.width}"
+ page-height="{$page.height}"
+ margin-top="{$page.margin.top}"
+ margin-bottom="{$page.margin.bottom}">
+ <xsl:attribute name="margin-{$direction.align.start}">
+ <xsl:value-of select="$page.margin.outer"/>
+ <xsl:if test="$fop.extensions != 0">
+ <xsl:value-of select="concat(' - (',$title.margin.left,')')"/>
+ </xsl:if>
+ </xsl:attribute>
+ <xsl:attribute name="margin-{$direction.align.end}">
+ <xsl:value-of select="$page.margin.inner"/>
+ </xsl:attribute>
+ <xsl:if test="$axf.extensions != 0">
+ <xsl:call-template name="axf-page-master-properties">
+ <xsl:with-param name="page.master">blank</xsl:with-param>
+ </xsl:call-template>
+ </xsl:if>
+ <fo:region-body display-align="center"
+ margin-bottom="{$body.margin.bottom}"
+ margin-top="{$body.margin.top}">
+ <xsl:if test="$fop.extensions = 0 and $fop1.extensions = 0">
+ <xsl:attribute name="region-name">blank-body</xsl:attribute>
+ </xsl:if>
+ </fo:region-body>
+ <fo:region-before region-name="xsl-region-before-blank"
+ extent="{$region.before.extent}"
+ display-align="before"/>
+ <fo:region-after region-name="xsl-region-after-blank"
+ extent="{$region.after.extent}"
+ display-align="after"/>
+ </fo:simple-page-master>
+
+ <!-- title pages -->
+ <fo:simple-page-master master-name="titlepage-first"
+ page-width="{$page.width}"
+ page-height="{$page.height}"
+ margin-top="{$page.margin.top}"
+ margin-bottom="{$page.margin.bottom}">
+ <xsl:attribute name="margin-{$direction.align.start}">
+ <xsl:value-of select="$page.margin.inner"/>
+ <xsl:if test="$fop.extensions != 0">
+ <xsl:value-of select="concat(' - (',$title.margin.left,')')"/>
+ </xsl:if>
+ </xsl:attribute>
+ <xsl:attribute name="margin-{$direction.align.end}">
+ <xsl:value-of select="$page.margin.outer"/>
+ </xsl:attribute>
+ <xsl:if test="$axf.extensions != 0">
+ <xsl:call-template name="axf-page-master-properties">
+ <xsl:with-param name="page.master">titlepage-first</xsl:with-param>
+ </xsl:call-template>
+ </xsl:if>
+ <fo:region-body margin-bottom="{$body.margin.bottom}"
+ margin-top="{$body.margin.top}"
+ column-gap="{$column.gap.titlepage}"
+ column-count="{$column.count.titlepage}">
+ </fo:region-body>
+ <fo:region-before region-name="xsl-region-before-first"
+ extent="{$region.before.extent}"
+ display-align="before"/>
+ <fo:region-after region-name="xsl-region-after-first"
+ extent="{$region.after.extent}"
+ display-align="after"/>
+ </fo:simple-page-master>
+
+ <fo:simple-page-master master-name="titlepage-odd"
+ page-width="{$page.width}"
+ page-height="{$page.height}"
+ margin-top="{$page.margin.top}"
+ margin-bottom="{$page.margin.bottom}">
+ <xsl:attribute name="margin-{$direction.align.start}">
+ <xsl:value-of select="$page.margin.inner"/>
+ <xsl:if test="$fop.extensions != 0">
+ <xsl:value-of select="concat(' - (',$title.margin.left,')')"/>
+ </xsl:if>
+ </xsl:attribute>
+ <xsl:attribute name="margin-{$direction.align.end}">
+ <xsl:value-of select="$page.margin.outer"/>
+ </xsl:attribute>
+ <xsl:if test="$axf.extensions != 0">
+ <xsl:call-template name="axf-page-master-properties">
+ <xsl:with-param name="page.master">titlepage-odd</xsl:with-param>
+ </xsl:call-template>
+ </xsl:if>
+ <fo:region-body margin-bottom="{$body.margin.bottom}"
+ margin-top="{$body.margin.top}"
+ column-gap="{$column.gap.titlepage}"
+ column-count="{$column.count.titlepage}">
+ </fo:region-body>
+ <fo:region-before region-name="xsl-region-before-odd"
+ extent="{$region.before.extent}"
+ display-align="before"/>
+ <fo:region-after region-name="xsl-region-after-odd"
+ extent="{$region.after.extent}"
+ display-align="after"/>
+ </fo:simple-page-master>
+
+ <fo:simple-page-master master-name="titlepage-even"
+ page-width="{$page.width}"
+ page-height="{$page.height}"
+ margin-top="{$page.margin.top}"
+ margin-bottom="{$page.margin.bottom}">
+ <xsl:attribute name="margin-{$direction.align.start}">
+ <xsl:value-of select="$page.margin.outer"/>
+ <xsl:if test="$fop.extensions != 0">
+ <xsl:value-of select="concat(' - (',$title.margin.left,')')"/>
+ </xsl:if>
+ </xsl:attribute>
+ <xsl:attribute name="margin-{$direction.align.end}">
+ <xsl:value-of select="$page.margin.inner"/>
+ </xsl:attribute>
+ <xsl:if test="$axf.extensions != 0">
+ <xsl:call-template name="axf-page-master-properties">
+ <xsl:with-param name="page.master">titlepage-even</xsl:with-param>
+ </xsl:call-template>
+ </xsl:if>
+ <fo:region-body margin-bottom="{$body.margin.bottom}"
+ margin-top="{$body.margin.top}"
+ column-gap="{$column.gap.titlepage}"
+ column-count="{$column.count.titlepage}">
+ </fo:region-body>
+ <fo:region-before region-name="xsl-region-before-even"
+ extent="{$region.before.extent}"
+ display-align="before"/>
+ <fo:region-after region-name="xsl-region-after-even"
+ extent="{$region.after.extent}"
+ display-align="after"/>
+ </fo:simple-page-master>
+
+ <!-- list-of-title pages -->
+ <fo:simple-page-master master-name="lot-first"
+ page-width="{$page.width}"
+ page-height="{$page.height}"
+ margin-top="{$page.margin.top}"
+ margin-bottom="{$page.margin.bottom}">
+ <xsl:attribute name="margin-{$direction.align.start}">
+ <xsl:value-of select="$page.margin.inner"/>
+ <xsl:if test="$fop.extensions != 0">
+ <xsl:value-of select="concat(' - (',$title.margin.left,')')"/>
+ </xsl:if>
+ </xsl:attribute>
+ <xsl:attribute name="margin-{$direction.align.end}">
+ <xsl:value-of select="$page.margin.outer"/>
+ </xsl:attribute>
+ <xsl:if test="$axf.extensions != 0">
+ <xsl:call-template name="axf-page-master-properties">
+ <xsl:with-param name="page.master">lot-first</xsl:with-param>
+ </xsl:call-template>
+ </xsl:if>
+ <fo:region-body margin-bottom="{$body.margin.bottom}"
+ margin-top="{$body.margin.top}"
+ column-gap="{$column.gap.lot}"
+ column-count="{$column.count.lot}">
+ </fo:region-body>
+ <fo:region-before region-name="xsl-region-before-first"
+ extent="{$region.before.extent}"
+ display-align="before"/>
+ <fo:region-after region-name="xsl-region-after-first"
+ extent="{$region.after.extent}"
+ display-align="after"/>
+ </fo:simple-page-master>
+
+ <fo:simple-page-master master-name="lot-odd"
+ page-width="{$page.width}"
+ page-height="{$page.height}"
+ margin-top="{$page.margin.top}"
+ margin-bottom="{$page.margin.bottom}">
+ <xsl:attribute name="margin-{$direction.align.start}">
+ <xsl:value-of select="$page.margin.inner"/>
+ <xsl:if test="$fop.extensions != 0">
+ <xsl:value-of select="concat(' - (',$title.margin.left,')')"/>
+ </xsl:if>
+ </xsl:attribute>
+ <xsl:attribute name="margin-{$direction.align.end}">
+ <xsl:value-of select="$page.margin.outer"/>
+ </xsl:attribute>
+ <xsl:if test="$axf.extensions != 0">
+ <xsl:call-template name="axf-page-master-properties">
+ <xsl:with-param name="page.master">lot-odd</xsl:with-param>
+ </xsl:call-template>
+ </xsl:if>
+ <fo:region-body margin-bottom="{$body.margin.bottom}"
+ margin-top="{$body.margin.top}"
+ column-gap="{$column.gap.lot}"
+ column-count="{$column.count.lot}">
+ </fo:region-body>
+ <fo:region-before region-name="xsl-region-before-odd"
+ extent="{$region.before.extent}"
+ display-align="before"/>
+ <fo:region-after region-name="xsl-region-after-odd"
+ extent="{$region.after.extent}"
+ display-align="after"/>
+ </fo:simple-page-master>
+
+ <fo:simple-page-master master-name="lot-even"
+ page-width="{$page.width}"
+ page-height="{$page.height}"
+ margin-top="{$page.margin.top}"
+ margin-bottom="{$page.margin.bottom}">
+ <xsl:attribute name="margin-{$direction.align.start}">
+ <xsl:value-of select="$page.margin.outer"/>
+ <xsl:if test="$fop.extensions != 0">
+ <xsl:value-of select="concat(' - (',$title.margin.left,')')"/>
+ </xsl:if>
+ </xsl:attribute>
+ <xsl:attribute name="margin-{$direction.align.end}">
+ <xsl:value-of select="$page.margin.inner"/>
+ </xsl:attribute>
+ <xsl:if test="$axf.extensions != 0">
+ <xsl:call-template name="axf-page-master-properties">
+ <xsl:with-param name="page.master">lot-even</xsl:with-param>
+ </xsl:call-template>
+ </xsl:if>
+ <fo:region-body margin-bottom="{$body.margin.bottom}"
+ margin-top="{$body.margin.top}"
+ column-gap="{$column.gap.lot}"
+ column-count="{$column.count.lot}">
+ </fo:region-body>
+ <fo:region-before region-name="xsl-region-before-even"
+ extent="{$region.before.extent}"
+ display-align="before"/>
+ <fo:region-after region-name="xsl-region-after-even"
+ extent="{$region.after.extent}"
+ display-align="after"/>
+ </fo:simple-page-master>
+
+ <!-- frontmatter pages -->
+ <fo:simple-page-master master-name="front-first"
+ page-width="{$page.width}"
+ page-height="{$page.height}"
+ margin-top="{$page.margin.top}"
+ margin-bottom="{$page.margin.bottom}">
+ <xsl:attribute name="margin-{$direction.align.start}">
+ <xsl:value-of select="$page.margin.inner"/>
+ <xsl:if test="$fop.extensions != 0">
+ <xsl:value-of select="concat(' - (',$title.margin.left,')')"/>
+ </xsl:if>
+ </xsl:attribute>
+ <xsl:attribute name="margin-{$direction.align.end}">
+ <xsl:value-of select="$page.margin.outer"/>
+ </xsl:attribute>
+ <xsl:if test="$axf.extensions != 0">
+ <xsl:call-template name="axf-page-master-properties">
+ <xsl:with-param name="page.master">front-first</xsl:with-param>
+ </xsl:call-template>
+ </xsl:if>
+ <fo:region-body margin-bottom="{$body.margin.bottom}"
+ margin-top="{$body.margin.top}"
+ column-gap="{$column.gap.front}"
+ column-count="{$column.count.front}">
+ </fo:region-body>
+ <fo:region-before region-name="xsl-region-before-first"
+ extent="{$region.before.extent}"
+ display-align="before"/>
+ <fo:region-after region-name="xsl-region-after-first"
+ extent="{$region.after.extent}"
+ display-align="after"/>
+ </fo:simple-page-master>
+
+ <fo:simple-page-master master-name="front-odd"
+ page-width="{$page.width}"
+ page-height="{$page.height}"
+ margin-top="{$page.margin.top}"
+ margin-bottom="{$page.margin.bottom}">
+ <xsl:attribute name="margin-{$direction.align.start}">
+ <xsl:value-of select="$page.margin.inner"/>
+ <xsl:if test="$fop.extensions != 0">
+ <xsl:value-of select="concat(' - (',$title.margin.left,')')"/>
+ </xsl:if>
+ </xsl:attribute>
+ <xsl:attribute name="margin-{$direction.align.end}">
+ <xsl:value-of select="$page.margin.outer"/>
+ </xsl:attribute>
+ <xsl:if test="$axf.extensions != 0">
+ <xsl:call-template name="axf-page-master-properties">
+ <xsl:with-param name="page.master">front-odd</xsl:with-param>
+ </xsl:call-template>
+ </xsl:if>
+ <fo:region-body margin-bottom="{$body.margin.bottom}"
+ margin-top="{$body.margin.top}"
+ column-gap="{$column.gap.front}"
+ column-count="{$column.count.front}">
+ </fo:region-body>
+ <fo:region-before region-name="xsl-region-before-odd"
+ extent="{$region.before.extent}"
+ display-align="before"/>
+ <fo:region-after region-name="xsl-region-after-odd"
+ extent="{$region.after.extent}"
+ display-align="after"/>
+ </fo:simple-page-master>
+
+ <fo:simple-page-master master-name="front-even"
+ page-width="{$page.width}"
+ page-height="{$page.height}"
+ margin-top="{$page.margin.top}"
+ margin-bottom="{$page.margin.bottom}">
+ <xsl:attribute name="margin-{$direction.align.start}">
+ <xsl:value-of select="$page.margin.outer"/>
+ <xsl:if test="$fop.extensions != 0">
+ <xsl:value-of select="concat(' - (',$title.margin.left,')')"/>
+ </xsl:if>
+ </xsl:attribute>
+ <xsl:attribute name="margin-{$direction.align.end}">
+ <xsl:value-of select="$page.margin.inner"/>
+ </xsl:attribute>
+ <xsl:if test="$axf.extensions != 0">
+ <xsl:call-template name="axf-page-master-properties">
+ <xsl:with-param name="page.master">front-even</xsl:with-param>
+ </xsl:call-template>
+ </xsl:if>
+ <fo:region-body margin-bottom="{$body.margin.bottom}"
+ margin-top="{$body.margin.top}"
+ column-gap="{$column.gap.front}"
+ column-count="{$column.count.front}">
+ </fo:region-body>
+ <fo:region-before region-name="xsl-region-before-even"
+ extent="{$region.before.extent}"
+ display-align="before"/>
+ <fo:region-after region-name="xsl-region-after-even"
+ extent="{$region.after.extent}"
+ display-align="after"/>
+ </fo:simple-page-master>
+
+ <!-- body pages -->
+ <fo:simple-page-master master-name="body-first"
+ page-width="{$page.width}"
+ page-height="{$page.height}"
+ margin-top="{$page.margin.top}"
+ margin-bottom="{$page.margin.bottom}">
+ <xsl:attribute name="margin-{$direction.align.start}">
+ <xsl:value-of select="$page.margin.inner"/>
+ <xsl:if test="$fop.extensions != 0">
+ <xsl:value-of select="concat(' - (',$title.margin.left,')')"/>
+ </xsl:if>
+ <xsl:if test="$fop.extensions != 0">
+ <xsl:value-of select="concat(' - (',$title.margin.left,')')"/>
+ </xsl:if>
+ </xsl:attribute>
+ <xsl:attribute name="margin-{$direction.align.end}">
+ <xsl:value-of select="$page.margin.outer"/>
+ </xsl:attribute>
+ <xsl:if test="$axf.extensions != 0">
+ <xsl:call-template name="axf-page-master-properties">
+ <xsl:with-param name="page.master">body-first</xsl:with-param>
+ </xsl:call-template>
+ </xsl:if>
+ <fo:region-body margin-bottom="{$body.margin.bottom}"
+ margin-top="{$body.margin.top}"
+ column-gap="{$column.gap.body}"
+ column-count="{$column.count.body}">
+ </fo:region-body>
+ <fo:region-before region-name="xsl-region-before-first"
+ extent="{$region.before.extent}"
+ display-align="before"/>
+ <fo:region-after region-name="xsl-region-after-first"
+ extent="{$region.after.extent}"
+ display-align="after"/>
+ </fo:simple-page-master>
+
+ <fo:simple-page-master master-name="body-odd"
+ page-width="{$page.width}"
+ page-height="{$page.height}"
+ margin-top="{$page.margin.top}"
+ margin-bottom="{$page.margin.bottom}">
+ <xsl:attribute name="margin-{$direction.align.start}">
+ <xsl:value-of select="$page.margin.inner"/>
+ <xsl:if test="$fop.extensions != 0">
+ <xsl:value-of select="concat(' - (',$title.margin.left,')')"/>
+ </xsl:if>
+ </xsl:attribute>
+ <xsl:attribute name="margin-{$direction.align.end}">
+ <xsl:value-of select="$page.margin.outer"/>
+ </xsl:attribute>
+ <xsl:if test="$axf.extensions != 0">
+ <xsl:call-template name="axf-page-master-properties">
+ <xsl:with-param name="page.master">body-odd</xsl:with-param>
+ </xsl:call-template>
+ </xsl:if>
+ <fo:region-body margin-bottom="{$body.margin.bottom}"
+ margin-top="{$body.margin.top}"
+ column-gap="{$column.gap.body}"
+ column-count="{$column.count.body}">
+ </fo:region-body>
+ <fo:region-before region-name="xsl-region-before-odd"
+ extent="{$region.before.extent}"
+ display-align="before"/>
+ <fo:region-after region-name="xsl-region-after-odd"
+ extent="{$region.after.extent}"
+ display-align="after"/>
+ </fo:simple-page-master>
+
+ <fo:simple-page-master master-name="body-even"
+ page-width="{$page.width}"
+ page-height="{$page.height}"
+ margin-top="{$page.margin.top}"
+ margin-bottom="{$page.margin.bottom}">
+ <xsl:attribute name="margin-{$direction.align.start}">
+ <xsl:value-of select="$page.margin.outer"/>
+ <xsl:if test="$fop.extensions != 0">
+ <xsl:value-of select="concat(' - (',$title.margin.left,')')"/>
+ </xsl:if>
+ </xsl:attribute>
+ <xsl:attribute name="margin-{$direction.align.end}">
+ <xsl:value-of select="$page.margin.inner"/>
+ </xsl:attribute>
+ <xsl:if test="$axf.extensions != 0">
+ <xsl:call-template name="axf-page-master-properties">
+ <xsl:with-param name="page.master">body-even</xsl:with-param>
+ </xsl:call-template>
+ </xsl:if>
+ <fo:region-body margin-bottom="{$body.margin.bottom}"
+ margin-top="{$body.margin.top}"
+ column-gap="{$column.gap.body}"
+ column-count="{$column.count.body}">
+ </fo:region-body>
+ <fo:region-before region-name="xsl-region-before-even"
+ extent="{$region.before.extent}"
+ display-align="before"/>
+ <fo:region-after region-name="xsl-region-after-even"
+ extent="{$region.after.extent}"
+ display-align="after"/>
+ </fo:simple-page-master>
+
+ <!-- backmatter pages -->
+ <fo:simple-page-master master-name="back-first"
+ page-width="{$page.width}"
+ page-height="{$page.height}"
+ margin-top="{$page.margin.top}"
+ margin-bottom="{$page.margin.bottom}">
+ <xsl:attribute name="margin-{$direction.align.start}">
+ <xsl:value-of select="$page.margin.inner"/>
+ <xsl:if test="$fop.extensions != 0">
+ <xsl:value-of select="concat(' - (',$title.margin.left,')')"/>
+ </xsl:if>
+ </xsl:attribute>
+ <xsl:attribute name="margin-{$direction.align.end}">
+ <xsl:value-of select="$page.margin.outer"/>
+ </xsl:attribute>
+ <xsl:if test="$axf.extensions != 0">
+ <xsl:call-template name="axf-page-master-properties">
+ <xsl:with-param name="page.master">back-first</xsl:with-param>
+ </xsl:call-template>
+ </xsl:if>
+ <fo:region-body margin-bottom="{$body.margin.bottom}"
+ margin-top="{$body.margin.top}"
+ column-gap="{$column.gap.back}"
+ column-count="{$column.count.back}">
+ </fo:region-body>
+ <fo:region-before region-name="xsl-region-before-first"
+ extent="{$region.before.extent}"
+ display-align="before"/>
+ <fo:region-after region-name="xsl-region-after-first"
+ extent="{$region.after.extent}"
+ display-align="after"/>
+ </fo:simple-page-master>
+
+ <fo:simple-page-master master-name="back-odd"
+ page-width="{$page.width}"
+ page-height="{$page.height}"
+ margin-top="{$page.margin.top}"
+ margin-bottom="{$page.margin.bottom}">
+ <xsl:attribute name="margin-{$direction.align.start}">
+ <xsl:value-of select="$page.margin.inner"/>
+ <xsl:if test="$fop.extensions != 0">
+ <xsl:value-of select="concat(' - (',$title.margin.left,')')"/>
+ </xsl:if>
+ </xsl:attribute>
+ <xsl:attribute name="margin-{$direction.align.end}">
+ <xsl:value-of select="$page.margin.outer"/>
+ </xsl:attribute>
+ <xsl:if test="$axf.extensions != 0">
+ <xsl:call-template name="axf-page-master-properties">
+ <xsl:with-param name="page.master">back-odd</xsl:with-param>
+ </xsl:call-template>
+ </xsl:if>
+ <fo:region-body margin-bottom="{$body.margin.bottom}"
+ margin-top="{$body.margin.top}"
+ column-gap="{$column.gap.back}"
+ column-count="{$column.count.back}">
+ </fo:region-body>
+ <fo:region-before region-name="xsl-region-before-odd"
+ extent="{$region.before.extent}"
+ display-align="before"/>
+ <fo:region-after region-name="xsl-region-after-odd"
+ extent="{$region.after.extent}"
+ display-align="after"/>
+ </fo:simple-page-master>
+
+ <fo:simple-page-master master-name="back-even"
+ page-width="{$page.width}"
+ page-height="{$page.height}"
+ margin-top="{$page.margin.top}"
+ margin-bottom="{$page.margin.bottom}">
+ <xsl:attribute name="margin-{$direction.align.start}">
+ <xsl:value-of select="$page.margin.outer"/>
+ <xsl:if test="$fop.extensions != 0">
+ <xsl:value-of select="concat(' - (',$title.margin.left,')')"/>
+ </xsl:if>
+ </xsl:attribute>
+ <xsl:attribute name="margin-{$direction.align.end}">
+ <xsl:value-of select="$page.margin.inner"/>
+ </xsl:attribute>
+ <xsl:if test="$axf.extensions != 0">
+ <xsl:call-template name="axf-page-master-properties">
+ <xsl:with-param name="page.master">back-even</xsl:with-param>
+ </xsl:call-template>
+ </xsl:if>
+ <fo:region-body margin-bottom="{$body.margin.bottom}"
+ margin-top="{$body.margin.top}"
+ column-gap="{$column.gap.back}"
+ column-count="{$column.count.back}">
+ </fo:region-body>
+ <fo:region-before region-name="xsl-region-before-even"
+ extent="{$region.before.extent}"
+ display-align="before"/>
+ <fo:region-after region-name="xsl-region-after-even"
+ extent="{$region.after.extent}"
+ display-align="after"/>
+ </fo:simple-page-master>
+
+ <!-- index pages -->
+ <fo:simple-page-master master-name="index-first"
+ page-width="{$page.width}"
+ page-height="{$page.height}"
+ margin-top="{$page.margin.top}"
+ margin-bottom="{$page.margin.bottom}">
+ <xsl:attribute name="margin-{$direction.align.start}">
+ <xsl:value-of select="$page.margin.inner"/>
+ <xsl:if test="$fop.extensions != 0">
+ <xsl:value-of select="concat(' - (',$title.margin.left,')')"/>
+ </xsl:if>
+ </xsl:attribute>
+ <xsl:attribute name="margin-{$direction.align.end}">
+ <xsl:value-of select="$page.margin.outer"/>
+ </xsl:attribute>
+ <xsl:if test="$axf.extensions != 0">
+ <xsl:call-template name="axf-page-master-properties">
+ <xsl:with-param name="page.master">index-first</xsl:with-param>
+ </xsl:call-template>
+ </xsl:if>
+ <fo:region-body margin-bottom="{$body.margin.bottom}"
+ margin-top="{$body.margin.top}"
+ column-gap="{$column.gap.index}"
+ column-count="{$column.count.index}">
+ </fo:region-body>
+ <fo:region-before region-name="xsl-region-before-first"
+ extent="{$region.before.extent}"
+ display-align="before"/>
+ <fo:region-after region-name="xsl-region-after-first"
+ extent="{$region.after.extent}"
+ display-align="after"/>
+ </fo:simple-page-master>
+
+ <fo:simple-page-master master-name="index-odd"
+ page-width="{$page.width}"
+ page-height="{$page.height}"
+ margin-top="{$page.margin.top}"
+ margin-bottom="{$page.margin.bottom}">
+ <xsl:attribute name="margin-{$direction.align.start}">
+ <xsl:value-of select="$page.margin.inner"/>
+ <xsl:if test="$fop.extensions != 0">
+ <xsl:value-of select="concat(' - (',$title.margin.left,')')"/>
+ </xsl:if>
+ </xsl:attribute>
+ <xsl:attribute name="margin-{$direction.align.end}">
+ <xsl:value-of select="$page.margin.outer"/>
+ </xsl:attribute>
+ <xsl:if test="$axf.extensions != 0">
+ <xsl:call-template name="axf-page-master-properties">
+ <xsl:with-param name="page.master">index-odd</xsl:with-param>
+ </xsl:call-template>
+ </xsl:if>
+ <fo:region-body margin-bottom="{$body.margin.bottom}"
+ margin-top="{$body.margin.top}"
+ column-gap="{$column.gap.index}"
+ column-count="{$column.count.index}">
+ </fo:region-body>
+ <fo:region-before region-name="xsl-region-before-odd"
+ extent="{$region.before.extent}"
+ display-align="before"/>
+ <fo:region-after region-name="xsl-region-after-odd"
+ extent="{$region.after.extent}"
+ display-align="after"/>
+ </fo:simple-page-master>
+
+ <fo:simple-page-master master-name="index-even"
+ page-width="{$page.width}"
+ page-height="{$page.height}"
+ margin-top="{$page.margin.top}"
+ margin-bottom="{$page.margin.bottom}">
+ <xsl:attribute name="margin-{$direction.align.start}">
+ <xsl:value-of select="$page.margin.outer"/>
+ <xsl:if test="$fop.extensions != 0">
+ <xsl:value-of select="concat(' - (',$title.margin.left,')')"/>
+ </xsl:if>
+ </xsl:attribute>
+ <xsl:attribute name="margin-{$direction.align.end}">
+ <xsl:value-of select="$page.margin.inner"/>
+ </xsl:attribute>
+ <xsl:if test="$axf.extensions != 0">
+ <xsl:call-template name="axf-page-master-properties">
+ <xsl:with-param name="page.master">index-even</xsl:with-param>
+ </xsl:call-template>
+ </xsl:if>
+ <fo:region-body margin-bottom="{$body.margin.bottom}"
+ margin-top="{$body.margin.top}"
+ column-gap="{$column.gap.index}"
+ column-count="{$column.count.index}">
+ </fo:region-body>
+ <fo:region-before region-name="xsl-region-before-even"
+ extent="{$region.before.extent}"
+ display-align="before"/>
+ <fo:region-after region-name="xsl-region-after-even"
+ extent="{$region.after.extent}"
+ display-align="after"/>
+ </fo:simple-page-master>
+
+ <xsl:if test="$draft.mode != 'no'">
+ <!-- draft blank pages -->
+ <fo:simple-page-master master-name="blank-draft"
+ page-width="{$page.width}"
+ page-height="{$page.height}"
+ margin-top="{$page.margin.top}"
+ margin-bottom="{$page.margin.bottom}">
+ <xsl:attribute name="margin-{$direction.align.start}">
+ <xsl:value-of select="$page.margin.outer"/>
+ <xsl:if test="$fop.extensions != 0">
+ <xsl:value-of select="concat(' - (',$title.margin.left,')')"/>
+ </xsl:if>
+ </xsl:attribute>
+ <xsl:attribute name="margin-{$direction.align.end}">
+ <xsl:value-of select="$page.margin.inner"/>
+ </xsl:attribute>
+ <xsl:if test="$axf.extensions != 0">
+ <xsl:call-template name="axf-page-master-properties">
+ <xsl:with-param name="page.master">blank-draft</xsl:with-param>
+ </xsl:call-template>
+ </xsl:if>
+ <fo:region-body margin-bottom="{$body.margin.bottom}"
+ margin-top="{$body.margin.top}">
+ <xsl:if test="$draft.watermark.image != ''">
+ <xsl:attribute name="background-image">
+ <xsl:call-template name="fo-external-image">
+ <xsl:with-param name="filename" select="$draft.watermark.image"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:attribute name="background-attachment">fixed</xsl:attribute>
+ <xsl:attribute name="background-repeat">no-repeat</xsl:attribute>
+ <xsl:attribute name="background-position-horizontal">center</xsl:attribute>
+ <xsl:attribute name="background-position-vertical">center</xsl:attribute>
+ </xsl:if>
+ </fo:region-body>
+ <fo:region-before region-name="xsl-region-before-blank"
+ extent="{$region.before.extent}"
+ display-align="before"/>
+ <fo:region-after region-name="xsl-region-after-blank"
+ extent="{$region.after.extent}"
+ display-align="after"/>
+ </fo:simple-page-master>
+
+ <!-- draft title pages -->
+ <fo:simple-page-master master-name="titlepage-first-draft"
+ page-width="{$page.width}"
+ page-height="{$page.height}"
+ margin-top="{$page.margin.top}"
+ margin-bottom="{$page.margin.bottom}">
+ <xsl:attribute name="margin-{$direction.align.start}">
+ <xsl:value-of select="$page.margin.inner"/>
+ <xsl:if test="$fop.extensions != 0">
+ <xsl:value-of select="concat(' - (',$title.margin.left,')')"/>
+ </xsl:if>
+ </xsl:attribute>
+ <xsl:attribute name="margin-{$direction.align.end}">
+ <xsl:value-of select="$page.margin.outer"/>
+ </xsl:attribute>
+ <xsl:if test="$axf.extensions != 0">
+ <xsl:call-template name="axf-page-master-properties">
+ <xsl:with-param name="page.master">titlepage-first-draft</xsl:with-param>
+ </xsl:call-template>
+ </xsl:if>
+ <fo:region-body margin-bottom="{$body.margin.bottom}"
+ margin-top="{$body.margin.top}"
+ column-gap="{$column.gap.titlepage}"
+ column-count="{$column.count.titlepage}">
+ <xsl:if test="$draft.watermark.image != ''">
+ <xsl:attribute name="background-image">
+ <xsl:call-template name="fo-external-image">
+ <xsl:with-param name="filename" select="$draft.watermark.image"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:attribute name="background-attachment">fixed</xsl:attribute>
+ <xsl:attribute name="background-repeat">no-repeat</xsl:attribute>
+ <xsl:attribute name="background-position-horizontal">center</xsl:attribute>
+ <xsl:attribute name="background-position-vertical">center</xsl:attribute>
+ </xsl:if>
+ </fo:region-body>
+ <fo:region-before region-name="xsl-region-before-first"
+ extent="{$region.before.extent}"
+ display-align="before"/>
+ <fo:region-after region-name="xsl-region-after-first"
+ extent="{$region.after.extent}"
+ display-align="after"/>
+ </fo:simple-page-master>
+
+ <fo:simple-page-master master-name="titlepage-odd-draft"
+ page-width="{$page.width}"
+ page-height="{$page.height}"
+ margin-top="{$page.margin.top}"
+ margin-bottom="{$page.margin.bottom}">
+ <xsl:attribute name="margin-{$direction.align.start}">
+ <xsl:value-of select="$page.margin.inner"/>
+ <xsl:if test="$fop.extensions != 0">
+ <xsl:value-of select="concat(' - (',$title.margin.left,')')"/>
+ </xsl:if>
+ </xsl:attribute>
+ <xsl:attribute name="margin-{$direction.align.end}">
+ <xsl:value-of select="$page.margin.outer"/>
+ </xsl:attribute>
+ <xsl:if test="$axf.extensions != 0">
+ <xsl:call-template name="axf-page-master-properties">
+ <xsl:with-param name="page.master">titlepage-odd-draft</xsl:with-param>
+ </xsl:call-template>
+ </xsl:if>
+ <fo:region-body margin-bottom="{$body.margin.bottom}"
+ margin-top="{$body.margin.top}"
+ column-gap="{$column.gap.titlepage}"
+ column-count="{$column.count.titlepage}">
+ <xsl:if test="$draft.watermark.image != ''">
+ <xsl:attribute name="background-image">
+ <xsl:call-template name="fo-external-image">
+ <xsl:with-param name="filename" select="$draft.watermark.image"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:attribute name="background-attachment">fixed</xsl:attribute>
+ <xsl:attribute name="background-repeat">no-repeat</xsl:attribute>
+ <xsl:attribute name="background-position-horizontal">center</xsl:attribute>
+ <xsl:attribute name="background-position-vertical">center</xsl:attribute>
+ </xsl:if>
+ </fo:region-body>
+ <fo:region-before region-name="xsl-region-before-odd"
+ extent="{$region.before.extent}"
+ display-align="before"/>
+ <fo:region-after region-name="xsl-region-after-odd"
+ extent="{$region.after.extent}"
+ display-align="after"/>
+ </fo:simple-page-master>
+
+ <fo:simple-page-master master-name="titlepage-even-draft"
+ page-width="{$page.width}"
+ page-height="{$page.height}"
+ margin-top="{$page.margin.top}"
+ margin-bottom="{$page.margin.bottom}">
+ <xsl:attribute name="margin-{$direction.align.start}">
+ <xsl:value-of select="$page.margin.outer"/>
+ <xsl:if test="$fop.extensions != 0">
+ <xsl:value-of select="concat(' - (',$title.margin.left,')')"/>
+ </xsl:if>
+ </xsl:attribute>
+ <xsl:attribute name="margin-{$direction.align.end}">
+ <xsl:value-of select="$page.margin.inner"/>
+ </xsl:attribute>
+ <xsl:if test="$axf.extensions != 0">
+ <xsl:call-template name="axf-page-master-properties">
+ <xsl:with-param name="page.master">titlepage-even-draft</xsl:with-param>
+ </xsl:call-template>
+ </xsl:if>
+ <fo:region-body margin-bottom="{$body.margin.bottom}"
+ margin-top="{$body.margin.top}"
+ column-gap="{$column.gap.titlepage}"
+ column-count="{$column.count.titlepage}">
+ <xsl:if test="$draft.watermark.image != ''">
+ <xsl:attribute name="background-image">
+ <xsl:call-template name="fo-external-image">
+ <xsl:with-param name="filename" select="$draft.watermark.image"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:attribute name="background-attachment">fixed</xsl:attribute>
+ <xsl:attribute name="background-repeat">no-repeat</xsl:attribute>
+ <xsl:attribute name="background-position-horizontal">center</xsl:attribute>
+ <xsl:attribute name="background-position-vertical">center</xsl:attribute>
+ </xsl:if>
+ </fo:region-body>
+ <fo:region-before region-name="xsl-region-before-even"
+ extent="{$region.before.extent}"
+ display-align="before"/>
+ <fo:region-after region-name="xsl-region-after-even"
+ extent="{$region.after.extent}"
+ display-align="after"/>
+ </fo:simple-page-master>
+
+ <!-- draft list-of-title pages -->
+ <fo:simple-page-master master-name="lot-first-draft"
+ page-width="{$page.width}"
+ page-height="{$page.height}"
+ margin-top="{$page.margin.top}"
+ margin-bottom="{$page.margin.bottom}">
+ <xsl:attribute name="margin-{$direction.align.start}">
+ <xsl:value-of select="$page.margin.inner"/>
+ <xsl:if test="$fop.extensions != 0">
+ <xsl:value-of select="concat(' - (',$title.margin.left,')')"/>
+ </xsl:if>
+ </xsl:attribute>
+ <xsl:attribute name="margin-{$direction.align.end}">
+ <xsl:value-of select="$page.margin.outer"/>
+ </xsl:attribute>
+ <xsl:if test="$axf.extensions != 0">
+ <xsl:call-template name="axf-page-master-properties">
+ <xsl:with-param name="page.master">lot-first-draft</xsl:with-param>
+ </xsl:call-template>
+ </xsl:if>
+ <fo:region-body margin-bottom="{$body.margin.bottom}"
+ margin-top="{$body.margin.top}"
+ column-gap="{$column.gap.lot}"
+ column-count="{$column.count.lot}">
+ <xsl:if test="$draft.watermark.image != ''">
+ <xsl:attribute name="background-image">
+ <xsl:call-template name="fo-external-image">
+ <xsl:with-param name="filename" select="$draft.watermark.image"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:attribute name="background-attachment">fixed</xsl:attribute>
+ <xsl:attribute name="background-repeat">no-repeat</xsl:attribute>
+ <xsl:attribute name="background-position-horizontal">center</xsl:attribute>
+ <xsl:attribute name="background-position-vertical">center</xsl:attribute>
+ </xsl:if>
+ </fo:region-body>
+ <fo:region-before region-name="xsl-region-before-first"
+ extent="{$region.before.extent}"
+ display-align="before"/>
+ <fo:region-after region-name="xsl-region-after-first"
+ extent="{$region.after.extent}"
+ display-align="after"/>
+ </fo:simple-page-master>
+
+ <fo:simple-page-master master-name="lot-odd-draft"
+ page-width="{$page.width}"
+ page-height="{$page.height}"
+ margin-top="{$page.margin.top}"
+ margin-bottom="{$page.margin.bottom}">
+ <xsl:attribute name="margin-{$direction.align.start}">
+ <xsl:value-of select="$page.margin.inner"/>
+ <xsl:if test="$fop.extensions != 0">
+ <xsl:value-of select="concat(' - (',$title.margin.left,')')"/>
+ </xsl:if>
+ </xsl:attribute>
+ <xsl:attribute name="margin-{$direction.align.end}">
+ <xsl:value-of select="$page.margin.outer"/>
+ </xsl:attribute>
+ <xsl:if test="$axf.extensions != 0">
+ <xsl:call-template name="axf-page-master-properties">
+ <xsl:with-param name="page.master">lot-odd-draft</xsl:with-param>
+ </xsl:call-template>
+ </xsl:if>
+ <fo:region-body margin-bottom="{$body.margin.bottom}"
+ margin-top="{$body.margin.top}"
+ column-gap="{$column.gap.lot}"
+ column-count="{$column.count.lot}">
+ <xsl:if test="$draft.watermark.image != ''">
+ <xsl:attribute name="background-image">
+ <xsl:call-template name="fo-external-image">
+ <xsl:with-param name="filename" select="$draft.watermark.image"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:attribute name="background-attachment">fixed</xsl:attribute>
+ <xsl:attribute name="background-repeat">no-repeat</xsl:attribute>
+ <xsl:attribute name="background-position-horizontal">center</xsl:attribute>
+ <xsl:attribute name="background-position-vertical">center</xsl:attribute>
+ </xsl:if>
+ </fo:region-body>
+ <fo:region-before region-name="xsl-region-before-odd"
+ extent="{$region.before.extent}"
+ display-align="before"/>
+ <fo:region-after region-name="xsl-region-after-odd"
+ extent="{$region.after.extent}"
+ display-align="after"/>
+ </fo:simple-page-master>
+
+ <fo:simple-page-master master-name="lot-even-draft"
+ page-width="{$page.width}"
+ page-height="{$page.height}"
+ margin-top="{$page.margin.top}"
+ margin-bottom="{$page.margin.bottom}">
+ <xsl:attribute name="margin-{$direction.align.start}">
+ <xsl:value-of select="$page.margin.outer"/>
+ <xsl:if test="$fop.extensions != 0">
+ <xsl:value-of select="concat(' - (',$title.margin.left,')')"/>
+ </xsl:if>
+ </xsl:attribute>
+ <xsl:attribute name="margin-{$direction.align.end}">
+ <xsl:value-of select="$page.margin.inner"/>
+ </xsl:attribute>
+ <xsl:if test="$axf.extensions != 0">
+ <xsl:call-template name="axf-page-master-properties">
+ <xsl:with-param name="page.master">lot-even-draft</xsl:with-param>
+ </xsl:call-template>
+ </xsl:if>
+ <fo:region-body margin-bottom="{$body.margin.bottom}"
+ margin-top="{$body.margin.top}"
+ column-gap="{$column.gap.lot}"
+ column-count="{$column.count.lot}">
+ <xsl:if test="$draft.watermark.image != ''">
+ <xsl:attribute name="background-image">
+ <xsl:call-template name="fo-external-image">
+ <xsl:with-param name="filename" select="$draft.watermark.image"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:attribute name="background-attachment">fixed</xsl:attribute>
+ <xsl:attribute name="background-repeat">no-repeat</xsl:attribute>
+ <xsl:attribute name="background-position-horizontal">center</xsl:attribute>
+ <xsl:attribute name="background-position-vertical">center</xsl:attribute>
+ </xsl:if>
+ </fo:region-body>
+ <fo:region-before region-name="xsl-region-before-even"
+ extent="{$region.before.extent}"
+ display-align="before"/>
+ <fo:region-after region-name="xsl-region-after-even"
+ extent="{$region.after.extent}"
+ display-align="after"/>
+ </fo:simple-page-master>
+
+ <!-- draft frontmatter pages -->
+ <fo:simple-page-master master-name="front-first-draft"
+ page-width="{$page.width}"
+ page-height="{$page.height}"
+ margin-top="{$page.margin.top}"
+ margin-bottom="{$page.margin.bottom}">
+ <xsl:attribute name="margin-{$direction.align.start}">
+ <xsl:value-of select="$page.margin.inner"/>
+ <xsl:if test="$fop.extensions != 0">
+ <xsl:value-of select="concat(' - (',$title.margin.left,')')"/>
+ </xsl:if>
+ </xsl:attribute>
+ <xsl:attribute name="margin-{$direction.align.end}">
+ <xsl:value-of select="$page.margin.outer"/>
+ </xsl:attribute>
+ <xsl:if test="$axf.extensions != 0">
+ <xsl:call-template name="axf-page-master-properties">
+ <xsl:with-param name="page.master">front-first-draft</xsl:with-param>
+ </xsl:call-template>
+ </xsl:if>
+ <fo:region-body margin-bottom="{$body.margin.bottom}"
+ margin-top="{$body.margin.top}"
+ column-gap="{$column.gap.front}"
+ column-count="{$column.count.front}">
+ <xsl:if test="$draft.watermark.image != ''">
+ <xsl:attribute name="background-image">
+ <xsl:call-template name="fo-external-image">
+ <xsl:with-param name="filename" select="$draft.watermark.image"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:attribute name="background-attachment">fixed</xsl:attribute>
+ <xsl:attribute name="background-repeat">no-repeat</xsl:attribute>
+ <xsl:attribute name="background-position-horizontal">center</xsl:attribute>
+ <xsl:attribute name="background-position-vertical">center</xsl:attribute>
+ </xsl:if>
+ </fo:region-body>
+ <fo:region-before region-name="xsl-region-before-first"
+ extent="{$region.before.extent}"
+ display-align="before"/>
+ <fo:region-after region-name="xsl-region-after-first"
+ extent="{$region.after.extent}"
+ display-align="after"/>
+ </fo:simple-page-master>
+
+ <fo:simple-page-master master-name="front-odd-draft"
+ page-width="{$page.width}"
+ page-height="{$page.height}"
+ margin-top="{$page.margin.top}"
+ margin-bottom="{$page.margin.bottom}">
+ <xsl:attribute name="margin-{$direction.align.start}">
+ <xsl:value-of select="$page.margin.inner"/>
+ <xsl:if test="$fop.extensions != 0">
+ <xsl:value-of select="concat(' - (',$title.margin.left,')')"/>
+ </xsl:if>
+ </xsl:attribute>
+ <xsl:attribute name="margin-{$direction.align.end}">
+ <xsl:value-of select="$page.margin.outer"/>
+ </xsl:attribute>
+ <xsl:if test="$axf.extensions != 0">
+ <xsl:call-template name="axf-page-master-properties">
+ <xsl:with-param name="page.master">front-odd-draft</xsl:with-param>
+ </xsl:call-template>
+ </xsl:if>
+ <fo:region-body margin-bottom="{$body.margin.bottom}"
+ margin-top="{$body.margin.top}"
+ column-gap="{$column.gap.front}"
+ column-count="{$column.count.front}">
+ <xsl:if test="$draft.watermark.image != ''">
+ <xsl:attribute name="background-image">
+ <xsl:call-template name="fo-external-image">
+ <xsl:with-param name="filename" select="$draft.watermark.image"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:attribute name="background-attachment">fixed</xsl:attribute>
+ <xsl:attribute name="background-repeat">no-repeat</xsl:attribute>
+ <xsl:attribute name="background-position-horizontal">center</xsl:attribute>
+ <xsl:attribute name="background-position-vertical">center</xsl:attribute>
+ </xsl:if>
+ </fo:region-body>
+ <fo:region-before region-name="xsl-region-before-odd"
+ extent="{$region.before.extent}"
+ display-align="before"/>
+ <fo:region-after region-name="xsl-region-after-odd"
+ extent="{$region.after.extent}"
+ display-align="after"/>
+ </fo:simple-page-master>
+
+ <fo:simple-page-master master-name="front-even-draft"
+ page-width="{$page.width}"
+ page-height="{$page.height}"
+ margin-top="{$page.margin.top}"
+ margin-bottom="{$page.margin.bottom}">
+ <xsl:attribute name="margin-{$direction.align.start}">
+ <xsl:value-of select="$page.margin.outer"/>
+ <xsl:if test="$fop.extensions != 0">
+ <xsl:value-of select="concat(' - (',$title.margin.left,')')"/>
+ </xsl:if>
+ </xsl:attribute>
+ <xsl:attribute name="margin-{$direction.align.end}">
+ <xsl:value-of select="$page.margin.inner"/>
+ </xsl:attribute>
+ <xsl:if test="$axf.extensions != 0">
+ <xsl:call-template name="axf-page-master-properties">
+ <xsl:with-param name="page.master">front-even-draft</xsl:with-param>
+ </xsl:call-template>
+ </xsl:if>
+ <fo:region-body margin-bottom="{$body.margin.bottom}"
+ margin-top="{$body.margin.top}"
+ column-gap="{$column.gap.front}"
+ column-count="{$column.count.front}">
+ <xsl:if test="$draft.watermark.image != ''">
+ <xsl:attribute name="background-image">
+ <xsl:call-template name="fo-external-image">
+ <xsl:with-param name="filename" select="$draft.watermark.image"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:attribute name="background-attachment">fixed</xsl:attribute>
+ <xsl:attribute name="background-repeat">no-repeat</xsl:attribute>
+ <xsl:attribute name="background-position-horizontal">center</xsl:attribute>
+ <xsl:attribute name="background-position-vertical">center</xsl:attribute>
+ </xsl:if>
+ </fo:region-body>
+ <fo:region-before region-name="xsl-region-before-even"
+ extent="{$region.before.extent}"
+ display-align="before"/>
+ <fo:region-after region-name="xsl-region-after-even"
+ extent="{$region.after.extent}"
+ display-align="after"/>
+ </fo:simple-page-master>
+
+ <!-- draft body pages -->
+ <fo:simple-page-master master-name="body-first-draft"
+ page-width="{$page.width}"
+ page-height="{$page.height}"
+ margin-top="{$page.margin.top}"
+ margin-bottom="{$page.margin.bottom}">
+ <xsl:attribute name="margin-{$direction.align.start}">
+ <xsl:value-of select="$page.margin.inner"/>
+ <xsl:if test="$fop.extensions != 0">
+ <xsl:value-of select="concat(' - (',$title.margin.left,')')"/>
+ </xsl:if>
+ </xsl:attribute>
+ <xsl:attribute name="margin-{$direction.align.end}">
+ <xsl:value-of select="$page.margin.outer"/>
+ </xsl:attribute>
+ <xsl:if test="$axf.extensions != 0">
+ <xsl:call-template name="axf-page-master-properties">
+ <xsl:with-param name="page.master">body-first-draft</xsl:with-param>
+ </xsl:call-template>
+ </xsl:if>
+ <fo:region-body margin-bottom="{$body.margin.bottom}"
+ margin-top="{$body.margin.top}"
+ column-gap="{$column.gap.body}"
+ column-count="{$column.count.body}">
+ <xsl:if test="$draft.watermark.image != ''">
+ <xsl:attribute name="background-image">
+ <xsl:call-template name="fo-external-image">
+ <xsl:with-param name="filename" select="$draft.watermark.image"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:attribute name="background-attachment">fixed</xsl:attribute>
+ <xsl:attribute name="background-repeat">no-repeat</xsl:attribute>
+ <xsl:attribute name="background-position-horizontal">center</xsl:attribute>
+ <xsl:attribute name="background-position-vertical">center</xsl:attribute>
+ </xsl:if>
+ </fo:region-body>
+ <fo:region-before region-name="xsl-region-before-first"
+ extent="{$region.before.extent}"
+ display-align="before"/>
+ <fo:region-after region-name="xsl-region-after-first"
+ extent="{$region.after.extent}"
+ display-align="after"/>
+ </fo:simple-page-master>
+
+ <fo:simple-page-master master-name="body-odd-draft"
+ page-width="{$page.width}"
+ page-height="{$page.height}"
+ margin-top="{$page.margin.top}"
+ margin-bottom="{$page.margin.bottom}">
+ <xsl:attribute name="margin-{$direction.align.start}">
+ <xsl:value-of select="$page.margin.inner"/>
+ <xsl:if test="$fop.extensions != 0">
+ <xsl:value-of select="concat(' - (',$title.margin.left,')')"/>
+ </xsl:if>
+ </xsl:attribute>
+ <xsl:attribute name="margin-{$direction.align.end}">
+ <xsl:value-of select="$page.margin.outer"/>
+ </xsl:attribute>
+ <xsl:if test="$axf.extensions != 0">
+ <xsl:call-template name="axf-page-master-properties">
+ <xsl:with-param name="page.master">body-odd-draft</xsl:with-param>
+ </xsl:call-template>
+ </xsl:if>
+ <fo:region-body margin-bottom="{$body.margin.bottom}"
+ margin-top="{$body.margin.top}"
+ column-gap="{$column.gap.body}"
+ column-count="{$column.count.body}">
+ <xsl:if test="$draft.watermark.image != ''">
+ <xsl:attribute name="background-image">
+ <xsl:call-template name="fo-external-image">
+ <xsl:with-param name="filename" select="$draft.watermark.image"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:attribute name="background-attachment">fixed</xsl:attribute>
+ <xsl:attribute name="background-repeat">no-repeat</xsl:attribute>
+ <xsl:attribute name="background-position-horizontal">center</xsl:attribute>
+ <xsl:attribute name="background-position-vertical">center</xsl:attribute>
+ </xsl:if>
+ </fo:region-body>
+ <fo:region-before region-name="xsl-region-before-odd"
+ extent="{$region.before.extent}"
+ display-align="before"/>
+ <fo:region-after region-name="xsl-region-after-odd"
+ extent="{$region.after.extent}"
+ display-align="after"/>
+ </fo:simple-page-master>
+
+ <fo:simple-page-master master-name="body-even-draft"
+ page-width="{$page.width}"
+ page-height="{$page.height}"
+ margin-top="{$page.margin.top}"
+ margin-bottom="{$page.margin.bottom}">
+ <xsl:attribute name="margin-{$direction.align.start}">
+ <xsl:value-of select="$page.margin.outer"/>
+ <xsl:if test="$fop.extensions != 0">
+ <xsl:value-of select="concat(' - (',$title.margin.left,')')"/>
+ </xsl:if>
+ </xsl:attribute>
+ <xsl:attribute name="margin-{$direction.align.end}">
+ <xsl:value-of select="$page.margin.inner"/>
+ </xsl:attribute>
+ <xsl:if test="$axf.extensions != 0">
+ <xsl:call-template name="axf-page-master-properties">
+ <xsl:with-param name="page.master">body-even-draft</xsl:with-param>
+ </xsl:call-template>
+ </xsl:if>
+ <fo:region-body margin-bottom="{$body.margin.bottom}"
+ margin-top="{$body.margin.top}"
+ column-gap="{$column.gap.body}"
+ column-count="{$column.count.body}">
+ <xsl:if test="$draft.watermark.image != ''">
+ <xsl:attribute name="background-image">
+ <xsl:call-template name="fo-external-image">
+ <xsl:with-param name="filename" select="$draft.watermark.image"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:attribute name="background-attachment">fixed</xsl:attribute>
+ <xsl:attribute name="background-repeat">no-repeat</xsl:attribute>
+ <xsl:attribute name="background-position-horizontal">center</xsl:attribute>
+ <xsl:attribute name="background-position-vertical">center</xsl:attribute>
+ </xsl:if>
+ </fo:region-body>
+ <fo:region-before region-name="xsl-region-before-even"
+ extent="{$region.before.extent}"
+ display-align="before"/>
+ <fo:region-after region-name="xsl-region-after-even"
+ extent="{$region.after.extent}"
+ display-align="after"/>
+ </fo:simple-page-master>
+
+ <!-- draft backmatter pages -->
+ <fo:simple-page-master master-name="back-first-draft"
+ page-width="{$page.width}"
+ page-height="{$page.height}"
+ margin-top="{$page.margin.top}"
+ margin-bottom="{$page.margin.bottom}">
+ <xsl:attribute name="margin-{$direction.align.start}">
+ <xsl:value-of select="$page.margin.inner"/>
+ <xsl:if test="$fop.extensions != 0">
+ <xsl:value-of select="concat(' - (',$title.margin.left,')')"/>
+ </xsl:if>
+ </xsl:attribute>
+ <xsl:attribute name="margin-{$direction.align.end}">
+ <xsl:value-of select="$page.margin.outer"/>
+ </xsl:attribute>
+ <xsl:if test="$axf.extensions != 0">
+ <xsl:call-template name="axf-page-master-properties">
+ <xsl:with-param name="page.master">back-first-draft</xsl:with-param>
+ </xsl:call-template>
+ </xsl:if>
+ <fo:region-body margin-bottom="{$body.margin.bottom}"
+ margin-top="{$body.margin.top}"
+ column-gap="{$column.gap.back}"
+ column-count="{$column.count.back}">
+ <xsl:if test="$draft.watermark.image != ''">
+ <xsl:attribute name="background-image">
+ <xsl:call-template name="fo-external-image">
+ <xsl:with-param name="filename" select="$draft.watermark.image"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:attribute name="background-attachment">fixed</xsl:attribute>
+ <xsl:attribute name="background-repeat">no-repeat</xsl:attribute>
+ <xsl:attribute name="background-position-horizontal">center</xsl:attribute>
+ <xsl:attribute name="background-position-vertical">center</xsl:attribute>
+ </xsl:if>
+ </fo:region-body>
+ <fo:region-before region-name="xsl-region-before-first"
+ extent="{$region.before.extent}"
+ display-align="before"/>
+ <fo:region-after region-name="xsl-region-after-first"
+ extent="{$region.after.extent}"
+ display-align="after"/>
+ </fo:simple-page-master>
+
+ <fo:simple-page-master master-name="back-odd-draft"
+ page-width="{$page.width}"
+ page-height="{$page.height}"
+ margin-top="{$page.margin.top}"
+ margin-bottom="{$page.margin.bottom}">
+ <xsl:attribute name="margin-{$direction.align.start}">
+ <xsl:value-of select="$page.margin.inner"/>
+ <xsl:if test="$fop.extensions != 0">
+ <xsl:value-of select="concat(' - (',$title.margin.left,')')"/>
+ </xsl:if>
+ </xsl:attribute>
+ <xsl:attribute name="margin-{$direction.align.end}">
+ <xsl:value-of select="$page.margin.outer"/>
+ </xsl:attribute>
+ <xsl:if test="$axf.extensions != 0">
+ <xsl:call-template name="axf-page-master-properties">
+ <xsl:with-param name="page.master">back-odd-draft</xsl:with-param>
+ </xsl:call-template>
+ </xsl:if>
+ <fo:region-body margin-bottom="{$body.margin.bottom}"
+ margin-top="{$body.margin.top}"
+ column-gap="{$column.gap.back}"
+ column-count="{$column.count.back}">
+ <xsl:if test="$draft.watermark.image != ''">
+ <xsl:attribute name="background-image">
+ <xsl:call-template name="fo-external-image">
+ <xsl:with-param name="filename" select="$draft.watermark.image"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:attribute name="background-attachment">fixed</xsl:attribute>
+ <xsl:attribute name="background-repeat">no-repeat</xsl:attribute>
+ <xsl:attribute name="background-position-horizontal">center</xsl:attribute>
+ <xsl:attribute name="background-position-vertical">center</xsl:attribute>
+ </xsl:if>
+ </fo:region-body>
+ <fo:region-before region-name="xsl-region-before-odd"
+ extent="{$region.before.extent}"
+ display-align="before"/>
+ <fo:region-after region-name="xsl-region-after-odd"
+ extent="{$region.after.extent}"
+ display-align="after"/>
+ </fo:simple-page-master>
+
+ <fo:simple-page-master master-name="back-even-draft"
+ page-width="{$page.width}"
+ page-height="{$page.height}"
+ margin-top="{$page.margin.top}"
+ margin-bottom="{$page.margin.bottom}">
+ <xsl:attribute name="margin-{$direction.align.start}">
+ <xsl:value-of select="$page.margin.outer"/>
+ <xsl:if test="$fop.extensions != 0">
+ <xsl:value-of select="concat(' - (',$title.margin.left,')')"/>
+ </xsl:if>
+ </xsl:attribute>
+ <xsl:attribute name="margin-{$direction.align.end}">
+ <xsl:value-of select="$page.margin.inner"/>
+ </xsl:attribute>
+ <xsl:if test="$axf.extensions != 0">
+ <xsl:call-template name="axf-page-master-properties">
+ <xsl:with-param name="page.master">back-even-draft</xsl:with-param>
+ </xsl:call-template>
+ </xsl:if>
+ <fo:region-body margin-bottom="{$body.margin.bottom}"
+ margin-top="{$body.margin.top}"
+ column-gap="{$column.gap.back}"
+ column-count="{$column.count.back}">
+ <xsl:if test="$draft.watermark.image != ''">
+ <xsl:attribute name="background-image">
+ <xsl:call-template name="fo-external-image">
+ <xsl:with-param name="filename" select="$draft.watermark.image"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:attribute name="background-attachment">fixed</xsl:attribute>
+ <xsl:attribute name="background-repeat">no-repeat</xsl:attribute>
+ <xsl:attribute name="background-position-horizontal">center</xsl:attribute>
+ <xsl:attribute name="background-position-vertical">center</xsl:attribute>
+ </xsl:if>
+ </fo:region-body>
+ <fo:region-before region-name="xsl-region-before-even"
+ extent="{$region.before.extent}"
+ display-align="before"/>
+ <fo:region-after region-name="xsl-region-after-even"
+ extent="{$region.after.extent}"
+ display-align="after"/>
+ </fo:simple-page-master>
+
+ <!-- draft index pages -->
+ <fo:simple-page-master master-name="index-first-draft"
+ page-width="{$page.width}"
+ page-height="{$page.height}"
+ margin-top="{$page.margin.top}"
+ margin-bottom="{$page.margin.bottom}">
+ <xsl:attribute name="margin-{$direction.align.start}">
+ <xsl:value-of select="$page.margin.inner"/>
+ <xsl:if test="$fop.extensions != 0">
+ <xsl:value-of select="concat(' - (',$title.margin.left,')')"/>
+ </xsl:if>
+ </xsl:attribute>
+ <xsl:attribute name="margin-{$direction.align.end}">
+ <xsl:value-of select="$page.margin.outer"/>
+ </xsl:attribute>
+ <xsl:if test="$axf.extensions != 0">
+ <xsl:call-template name="axf-page-master-properties">
+ <xsl:with-param name="page.master">index-first-draft</xsl:with-param>
+ </xsl:call-template>
+ </xsl:if>
+ <fo:region-body margin-bottom="{$body.margin.bottom}"
+ margin-top="{$body.margin.top}"
+ column-gap="{$column.gap.index}"
+ column-count="{$column.count.index}">
+ <xsl:if test="$draft.watermark.image != ''">
+ <xsl:attribute name="background-image">
+ <xsl:call-template name="fo-external-image">
+ <xsl:with-param name="filename" select="$draft.watermark.image"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:attribute name="background-attachment">fixed</xsl:attribute>
+ <xsl:attribute name="background-repeat">no-repeat</xsl:attribute>
+ <xsl:attribute name="background-position-horizontal">center</xsl:attribute>
+ <xsl:attribute name="background-position-vertical">center</xsl:attribute>
+ </xsl:if>
+ </fo:region-body>
+ <fo:region-before region-name="xsl-region-before-first"
+ extent="{$region.before.extent}"
+ display-align="before"/>
+ <fo:region-after region-name="xsl-region-after-first"
+ extent="{$region.after.extent}"
+ display-align="after"/>
+ </fo:simple-page-master>
+
+ <fo:simple-page-master master-name="index-odd-draft"
+ page-width="{$page.width}"
+ page-height="{$page.height}"
+ margin-top="{$page.margin.top}"
+ margin-bottom="{$page.margin.bottom}">
+ <xsl:attribute name="margin-{$direction.align.start}">
+ <xsl:value-of select="$page.margin.inner"/>
+ <xsl:if test="$fop.extensions != 0">
+ <xsl:value-of select="concat(' - (',$title.margin.left,')')"/>
+ </xsl:if>
+ </xsl:attribute>
+ <xsl:attribute name="margin-{$direction.align.end}">
+ <xsl:value-of select="$page.margin.outer"/>
+ </xsl:attribute>
+ <xsl:if test="$axf.extensions != 0">
+ <xsl:call-template name="axf-page-master-properties">
+ <xsl:with-param name="page.master">index-odd-draft</xsl:with-param>
+ </xsl:call-template>
+ </xsl:if>
+ <fo:region-body margin-bottom="{$body.margin.bottom}"
+ margin-top="{$body.margin.top}"
+ column-gap="{$column.gap.index}"
+ column-count="{$column.count.index}">
+ <xsl:if test="$draft.watermark.image != ''">
+ <xsl:attribute name="background-image">
+ <xsl:call-template name="fo-external-image">
+ <xsl:with-param name="filename" select="$draft.watermark.image"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:attribute name="background-attachment">fixed</xsl:attribute>
+ <xsl:attribute name="background-repeat">no-repeat</xsl:attribute>
+ <xsl:attribute name="background-position-horizontal">center</xsl:attribute>
+ <xsl:attribute name="background-position-vertical">center</xsl:attribute>
+ </xsl:if>
+ </fo:region-body>
+ <fo:region-before region-name="xsl-region-before-odd"
+ extent="{$region.before.extent}"
+ display-align="before"/>
+ <fo:region-after region-name="xsl-region-after-odd"
+ extent="{$region.after.extent}"
+ display-align="after"/>
+ </fo:simple-page-master>
+
+ <fo:simple-page-master master-name="index-even-draft"
+ page-width="{$page.width}"
+ page-height="{$page.height}"
+ margin-top="{$page.margin.top}"
+ margin-bottom="{$page.margin.bottom}">
+ <xsl:attribute name="margin-{$direction.align.start}">
+ <xsl:value-of select="$page.margin.outer"/>
+ <xsl:if test="$fop.extensions != 0">
+ <xsl:value-of select="concat(' - (',$title.margin.left,')')"/>
+ </xsl:if>
+ </xsl:attribute>
+ <xsl:attribute name="margin-{$direction.align.end}">
+ <xsl:value-of select="$page.margin.inner"/>
+ </xsl:attribute>
+ <xsl:if test="$axf.extensions != 0">
+ <xsl:call-template name="axf-page-master-properties">
+ <xsl:with-param name="page.master">index-even-draft</xsl:with-param>
+ </xsl:call-template>
+ </xsl:if>
+ <fo:region-body margin-bottom="{$body.margin.bottom}"
+ margin-top="{$body.margin.top}"
+ column-gap="{$column.gap.index}"
+ column-count="{$column.count.index}">
+ <xsl:if test="$draft.watermark.image != ''">
+ <xsl:attribute name="background-image">
+ <xsl:call-template name="fo-external-image">
+ <xsl:with-param name="filename" select="$draft.watermark.image"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:attribute name="background-attachment">fixed</xsl:attribute>
+ <xsl:attribute name="background-repeat">no-repeat</xsl:attribute>
+ <xsl:attribute name="background-position-horizontal">center</xsl:attribute>
+ <xsl:attribute name="background-position-vertical">center</xsl:attribute>
+ </xsl:if>
+ </fo:region-body>
+ <fo:region-before region-name="xsl-region-before-even"
+ extent="{$region.before.extent}"
+ display-align="before"/>
+ <fo:region-after region-name="xsl-region-after-even"
+ extent="{$region.after.extent}"
+ display-align="after"/>
+ </fo:simple-page-master>
+ </xsl:if>
+
+ <!-- setup for title page(s) -->
+ <fo:page-sequence-master master-name="titlepage">
+ <fo:repeatable-page-master-alternatives>
+ <fo:conditional-page-master-reference master-reference="blank"
+ blank-or-not-blank="blank"/>
+ <fo:conditional-page-master-reference master-reference="titlepage-first"
+ page-position="first"/>
+ <fo:conditional-page-master-reference master-reference="titlepage-odd"
+ odd-or-even="odd"/>
+ <fo:conditional-page-master-reference
+ odd-or-even="even">
+ <xsl:attribute name="master-reference">
+ <xsl:choose>
+ <xsl:when test="$double.sided != 0">titlepage-even</xsl:when>
+ <xsl:otherwise>titlepage-odd</xsl:otherwise>
+ </xsl:choose>
+ </xsl:attribute>
+ </fo:conditional-page-master-reference>
+ </fo:repeatable-page-master-alternatives>
+ </fo:page-sequence-master>
+
+ <!-- setup for lots -->
+ <fo:page-sequence-master master-name="lot">
+ <fo:repeatable-page-master-alternatives>
+ <fo:conditional-page-master-reference master-reference="blank"
+ blank-or-not-blank="blank"/>
+ <fo:conditional-page-master-reference master-reference="lot-first"
+ page-position="first"/>
+ <fo:conditional-page-master-reference master-reference="lot-odd"
+ odd-or-even="odd"/>
+ <fo:conditional-page-master-reference
+ odd-or-even="even">
+ <xsl:attribute name="master-reference">
+ <xsl:choose>
+ <xsl:when test="$double.sided != 0">lot-even</xsl:when>
+ <xsl:otherwise>lot-odd</xsl:otherwise>
+ </xsl:choose>
+ </xsl:attribute>
+ </fo:conditional-page-master-reference>
+ </fo:repeatable-page-master-alternatives>
+ </fo:page-sequence-master>
+
+ <!-- setup front matter -->
+ <fo:page-sequence-master master-name="front">
+ <fo:repeatable-page-master-alternatives>
+ <fo:conditional-page-master-reference master-reference="blank"
+ blank-or-not-blank="blank"/>
+ <fo:conditional-page-master-reference master-reference="front-first"
+ page-position="first"/>
+ <fo:conditional-page-master-reference master-reference="front-odd"
+ odd-or-even="odd"/>
+ <fo:conditional-page-master-reference
+ odd-or-even="even">
+ <xsl:attribute name="master-reference">
+ <xsl:choose>
+ <xsl:when test="$double.sided != 0">front-even</xsl:when>
+ <xsl:otherwise>front-odd</xsl:otherwise>
+ </xsl:choose>
+ </xsl:attribute>
+ </fo:conditional-page-master-reference>
+ </fo:repeatable-page-master-alternatives>
+ </fo:page-sequence-master>
+
+ <!-- setup for body pages -->
+ <fo:page-sequence-master master-name="body">
+ <fo:repeatable-page-master-alternatives>
+ <fo:conditional-page-master-reference master-reference="blank"
+ blank-or-not-blank="blank"/>
+ <fo:conditional-page-master-reference master-reference="body-first"
+ page-position="first"/>
+ <fo:conditional-page-master-reference master-reference="body-odd"
+ odd-or-even="odd"/>
+ <fo:conditional-page-master-reference
+ odd-or-even="even">
+ <xsl:attribute name="master-reference">
+ <xsl:choose>
+ <xsl:when test="$double.sided != 0">body-even</xsl:when>
+ <xsl:otherwise>body-odd</xsl:otherwise>
+ </xsl:choose>
+ </xsl:attribute>
+ </fo:conditional-page-master-reference>
+ </fo:repeatable-page-master-alternatives>
+ </fo:page-sequence-master>
+
+ <!-- setup back matter -->
+ <fo:page-sequence-master master-name="back">
+ <fo:repeatable-page-master-alternatives>
+ <fo:conditional-page-master-reference master-reference="blank"
+ blank-or-not-blank="blank"/>
+ <fo:conditional-page-master-reference master-reference="back-first"
+ page-position="first"/>
+ <fo:conditional-page-master-reference master-reference="back-odd"
+ odd-or-even="odd"/>
+ <fo:conditional-page-master-reference
+ odd-or-even="even">
+ <xsl:attribute name="master-reference">
+ <xsl:choose>
+ <xsl:when test="$double.sided != 0">back-even</xsl:when>
+ <xsl:otherwise>back-odd</xsl:otherwise>
+ </xsl:choose>
+ </xsl:attribute>
+ </fo:conditional-page-master-reference>
+ </fo:repeatable-page-master-alternatives>
+ </fo:page-sequence-master>
+
+ <!-- setup back matter -->
+ <fo:page-sequence-master master-name="index">
+ <fo:repeatable-page-master-alternatives>
+ <fo:conditional-page-master-reference master-reference="blank"
+ blank-or-not-blank="blank"/>
+ <fo:conditional-page-master-reference master-reference="index-first"
+ page-position="first"/>
+ <fo:conditional-page-master-reference master-reference="index-odd"
+ odd-or-even="odd"/>
+ <fo:conditional-page-master-reference
+ odd-or-even="even">
+ <xsl:attribute name="master-reference">
+ <xsl:choose>
+ <xsl:when test="$double.sided != 0">index-even</xsl:when>
+ <xsl:otherwise>index-odd</xsl:otherwise>
+ </xsl:choose>
+ </xsl:attribute>
+ </fo:conditional-page-master-reference>
+ </fo:repeatable-page-master-alternatives>
+ </fo:page-sequence-master>
+
+ <xsl:if test="$draft.mode != 'no'">
+ <!-- setup for draft title page(s) -->
+ <fo:page-sequence-master master-name="titlepage-draft">
+ <fo:repeatable-page-master-alternatives>
+ <fo:conditional-page-master-reference master-reference="blank-draft"
+ blank-or-not-blank="blank"/>
+ <fo:conditional-page-master-reference master-reference="titlepage-first-draft"
+ page-position="first"/>
+ <fo:conditional-page-master-reference master-reference="titlepage-odd-draft"
+ odd-or-even="odd"/>
+ <fo:conditional-page-master-reference
+ odd-or-even="even">
+ <xsl:attribute name="master-reference">
+ <xsl:choose>
+ <xsl:when test="$double.sided != 0">titlepage-even-draft</xsl:when>
+ <xsl:otherwise>titlepage-odd-draft</xsl:otherwise>
+ </xsl:choose>
+ </xsl:attribute>
+ </fo:conditional-page-master-reference>
+ </fo:repeatable-page-master-alternatives>
+ </fo:page-sequence-master>
+
+ <!-- setup for draft lots -->
+ <fo:page-sequence-master master-name="lot-draft">
+ <fo:repeatable-page-master-alternatives>
+ <fo:conditional-page-master-reference master-reference="blank-draft"
+ blank-or-not-blank="blank"/>
+ <fo:conditional-page-master-reference master-reference="lot-first-draft"
+ page-position="first"/>
+ <fo:conditional-page-master-reference master-reference="lot-odd-draft"
+ odd-or-even="odd"/>
+ <fo:conditional-page-master-reference
+ odd-or-even="even">
+ <xsl:attribute name="master-reference">
+ <xsl:choose>
+ <xsl:when test="$double.sided != 0">lot-even-draft</xsl:when>
+ <xsl:otherwise>lot-odd-draft</xsl:otherwise>
+ </xsl:choose>
+ </xsl:attribute>
+ </fo:conditional-page-master-reference>
+ </fo:repeatable-page-master-alternatives>
+ </fo:page-sequence-master>
+
+ <!-- setup draft front matter -->
+ <fo:page-sequence-master master-name="front-draft">
+ <fo:repeatable-page-master-alternatives>
+ <fo:conditional-page-master-reference master-reference="blank-draft"
+ blank-or-not-blank="blank"/>
+ <fo:conditional-page-master-reference master-reference="front-first-draft"
+ page-position="first"/>
+ <fo:conditional-page-master-reference master-reference="front-odd-draft"
+ odd-or-even="odd"/>
+ <fo:conditional-page-master-reference
+ odd-or-even="even">
+ <xsl:attribute name="master-reference">
+ <xsl:choose>
+ <xsl:when test="$double.sided != 0">front-even-draft</xsl:when>
+ <xsl:otherwise>front-odd-draft</xsl:otherwise>
+ </xsl:choose>
+ </xsl:attribute>
+ </fo:conditional-page-master-reference>
+ </fo:repeatable-page-master-alternatives>
+ </fo:page-sequence-master>
+
+ <!-- setup for draft body pages -->
+ <fo:page-sequence-master master-name="body-draft">
+ <fo:repeatable-page-master-alternatives>
+ <fo:conditional-page-master-reference master-reference="blank-draft"
+ blank-or-not-blank="blank"/>
+ <fo:conditional-page-master-reference master-reference="body-first-draft"
+ page-position="first"/>
+ <fo:conditional-page-master-reference master-reference="body-odd-draft"
+ odd-or-even="odd"/>
+ <fo:conditional-page-master-reference
+ odd-or-even="even">
+ <xsl:attribute name="master-reference">
+ <xsl:choose>
+ <xsl:when test="$double.sided != 0">body-even-draft</xsl:when>
+ <xsl:otherwise>body-odd-draft</xsl:otherwise>
+ </xsl:choose>
+ </xsl:attribute>
+ </fo:conditional-page-master-reference>
+ </fo:repeatable-page-master-alternatives>
+ </fo:page-sequence-master>
+
+ <!-- setup draft back matter -->
+ <fo:page-sequence-master master-name="back-draft">
+ <fo:repeatable-page-master-alternatives>
+ <fo:conditional-page-master-reference master-reference="blank-draft"
+ blank-or-not-blank="blank"/>
+ <fo:conditional-page-master-reference master-reference="back-first-draft"
+ page-position="first"/>
+ <fo:conditional-page-master-reference master-reference="back-odd-draft"
+ odd-or-even="odd"/>
+ <fo:conditional-page-master-reference
+ odd-or-even="even">
+ <xsl:attribute name="master-reference">
+ <xsl:choose>
+ <xsl:when test="$double.sided != 0">back-even-draft</xsl:when>
+ <xsl:otherwise>back-odd-draft</xsl:otherwise>
+ </xsl:choose>
+ </xsl:attribute>
+ </fo:conditional-page-master-reference>
+ </fo:repeatable-page-master-alternatives>
+ </fo:page-sequence-master>
+
+ <!-- setup draft index pages -->
+ <fo:page-sequence-master master-name="index-draft">
+ <fo:repeatable-page-master-alternatives>
+ <fo:conditional-page-master-reference master-reference="blank-draft"
+ blank-or-not-blank="blank"/>
+ <fo:conditional-page-master-reference master-reference="index-first-draft"
+ page-position="first"/>
+ <fo:conditional-page-master-reference master-reference="index-odd-draft"
+ odd-or-even="odd"/>
+ <fo:conditional-page-master-reference
+ odd-or-even="even">
+ <xsl:attribute name="master-reference">
+ <xsl:choose>
+ <xsl:when test="$double.sided != 0">index-even-draft</xsl:when>
+ <xsl:otherwise>index-odd-draft</xsl:otherwise>
+ </xsl:choose>
+ </xsl:attribute>
+ </fo:conditional-page-master-reference>
+ </fo:repeatable-page-master-alternatives>
+ </fo:page-sequence-master>
+ </xsl:if>
+
+ <xsl:call-template name="user.pagemasters"/>
+
+ </fo:layout-master-set>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template name="user.pagemasters"/> <!-- intentionally empty -->
+
+<!-- ==================================================================== -->
+
+<xsl:template name="select.pagemaster">
+ <xsl:param name="element" select="local-name(.)"/>
+ <xsl:param name="pageclass" select="''"/>
+
+ <xsl:variable name="pagemaster">
+ <xsl:choose>
+ <xsl:when test="$pageclass != ''">
+ <xsl:value-of select="$pageclass"/>
+ </xsl:when>
+ <xsl:when test="$pageclass = 'lot'">lot</xsl:when>
+ <xsl:when test="$element = 'dedication'">front</xsl:when>
+ <xsl:when test="$element = 'acknowledgements'">front</xsl:when>
+ <xsl:when test="$element = 'preface'">front</xsl:when>
+ <xsl:when test="$element = 'appendix'">back</xsl:when>
+ <xsl:when test="$element = 'glossary'">back</xsl:when>
+ <xsl:when test="$element = 'bibliography'">back</xsl:when>
+ <xsl:when test="$element = 'index'">index</xsl:when>
+ <xsl:when test="$element = 'colophon'">back</xsl:when>
+ <xsl:otherwise>body</xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:choose>
+ <xsl:when test="$draft.mode = 'yes'">
+ <xsl:text>-draft</xsl:text>
+ </xsl:when>
+ <xsl:when test="$draft.mode = 'no'">
+ <!-- nop -->
+ </xsl:when>
+ <xsl:when test="ancestor-or-self::*[@status][1]/@status = 'draft'">
+ <xsl:text>-draft</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <!-- nop -->
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:call-template name="select.user.pagemaster">
+ <xsl:with-param name="element" select="$element"/>
+ <xsl:with-param name="pageclass" select="$pageclass"/>
+ <xsl:with-param name="default-pagemaster" select="$pagemaster"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template name="select.user.pagemaster">
+ <xsl:param name="element"/>
+ <xsl:param name="pageclass"/>
+ <xsl:param name="default-pagemaster"/>
+
+ <!-- by default, return the default. But if you've created your own
+ pagemasters in user.pagemasters, you might want to select one here. -->
+ <xsl:value-of select="$default-pagemaster"/>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template name="head.sep.rule">
+ <xsl:param name="pageclass"/>
+ <xsl:param name="sequence"/>
+ <xsl:param name="gentext-key"/>
+
+ <xsl:if test="$header.rule != 0">
+ <xsl:attribute name="border-bottom-width">0.5pt</xsl:attribute>
+ <xsl:attribute name="border-bottom-style">solid</xsl:attribute>
+ <xsl:attribute name="border-bottom-color">black</xsl:attribute>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template name="foot.sep.rule">
+ <xsl:param name="pageclass"/>
+ <xsl:param name="sequence"/>
+ <xsl:param name="gentext-key"/>
+
+ <xsl:if test="$footer.rule != 0">
+ <xsl:attribute name="border-top-width">0.5pt</xsl:attribute>
+ <xsl:attribute name="border-top-style">solid</xsl:attribute>
+ <xsl:attribute name="border-top-color">black</xsl:attribute>
+ </xsl:if>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="*" mode="running.head.mode">
+ <xsl:param name="master-reference" select="'unknown'"/>
+ <xsl:param name="gentext-key" select="local-name(.)"/>
+
+ <!-- remove -draft from reference -->
+ <xsl:variable name="pageclass">
+ <xsl:choose>
+ <xsl:when test="contains($master-reference, '-draft')">
+ <xsl:value-of select="substring-before($master-reference, '-draft')"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$master-reference"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <fo:static-content flow-name="xsl-region-before-first">
+ <fo:block xsl:use-attribute-sets="header.content.properties">
+ <xsl:call-template name="header.table">
+ <xsl:with-param name="pageclass" select="$pageclass"/>
+ <xsl:with-param name="sequence" select="'first'"/>
+ <xsl:with-param name="gentext-key" select="$gentext-key"/>
+ </xsl:call-template>
+ </fo:block>
+ </fo:static-content>
+
+ <fo:static-content flow-name="xsl-region-before-odd">
+ <fo:block xsl:use-attribute-sets="header.content.properties">
+ <xsl:call-template name="header.table">
+ <xsl:with-param name="pageclass" select="$pageclass"/>
+ <xsl:with-param name="sequence" select="'odd'"/>
+ <xsl:with-param name="gentext-key" select="$gentext-key"/>
+ </xsl:call-template>
+ </fo:block>
+ </fo:static-content>
+
+ <fo:static-content flow-name="xsl-region-before-even">
+ <fo:block xsl:use-attribute-sets="header.content.properties">
+ <xsl:call-template name="header.table">
+ <xsl:with-param name="pageclass" select="$pageclass"/>
+ <xsl:with-param name="sequence" select="'even'"/>
+ <xsl:with-param name="gentext-key" select="$gentext-key"/>
+ </xsl:call-template>
+ </fo:block>
+ </fo:static-content>
+
+ <fo:static-content flow-name="xsl-region-before-blank">
+ <fo:block xsl:use-attribute-sets="header.content.properties">
+ <xsl:call-template name="header.table">
+ <xsl:with-param name="pageclass" select="$pageclass"/>
+ <xsl:with-param name="sequence" select="'blank'"/>
+ <xsl:with-param name="gentext-key" select="$gentext-key"/>
+ </xsl:call-template>
+ </fo:block>
+ </fo:static-content>
+
+ <xsl:call-template name="footnote-separator"/>
+
+ <xsl:if test="$fop.extensions = 0 and $fop1.extensions = 0">
+ <xsl:call-template name="blank.page.content"/>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template name="footnote-separator">
+ <fo:static-content flow-name="xsl-footnote-separator">
+ <fo:block>
+ <fo:leader xsl:use-attribute-sets="footnote.sep.leader.properties"/>
+ </fo:block>
+ </fo:static-content>
+</xsl:template>
+
+<xsl:template name="blank.page.content">
+ <fo:static-content flow-name="blank-body">
+ <fo:block text-align="center"/>
+ </fo:static-content>
+</xsl:template>
+
+<xsl:template name="header.table">
+ <xsl:param name="pageclass" select="''"/>
+ <xsl:param name="sequence" select="''"/>
+ <xsl:param name="gentext-key" select="''"/>
+
+ <!-- default is a single table style for all headers -->
+ <!-- Customize it for different page classes or sequence location -->
+
+ <xsl:choose>
+ <xsl:when test="$pageclass = 'index'">
+ <xsl:attribute name="margin-{$direction.align.start}">0pt</xsl:attribute>
+ </xsl:when>
+ </xsl:choose>
+
+ <xsl:variable name="column1">
+ <xsl:choose>
+ <xsl:when test="$double.sided = 0">1</xsl:when>
+ <xsl:when test="$sequence = 'first' or $sequence = 'odd'">1</xsl:when>
+ <xsl:otherwise>3</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="column3">
+ <xsl:choose>
+ <xsl:when test="$double.sided = 0">3</xsl:when>
+ <xsl:when test="$sequence = 'first' or $sequence = 'odd'">3</xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="candidate">
+ <fo:table xsl:use-attribute-sets="header.table.properties">
+ <xsl:call-template name="head.sep.rule">
+ <xsl:with-param name="pageclass" select="$pageclass"/>
+ <xsl:with-param name="sequence" select="$sequence"/>
+ <xsl:with-param name="gentext-key" select="$gentext-key"/>
+ </xsl:call-template>
+
+ <fo:table-column column-number="1">
+ <xsl:attribute name="column-width">
+ <xsl:text>proportional-column-width(</xsl:text>
+ <xsl:call-template name="header.footer.width">
+ <xsl:with-param name="location">header</xsl:with-param>
+ <xsl:with-param name="position" select="$column1"/>
+ </xsl:call-template>
+ <xsl:text>)</xsl:text>
+ </xsl:attribute>
+ </fo:table-column>
+ <fo:table-column column-number="2">
+ <xsl:attribute name="column-width">
+ <xsl:text>proportional-column-width(</xsl:text>
+ <xsl:call-template name="header.footer.width">
+ <xsl:with-param name="location">header</xsl:with-param>
+ <xsl:with-param name="position" select="2"/>
+ </xsl:call-template>
+ <xsl:text>)</xsl:text>
+ </xsl:attribute>
+ </fo:table-column>
+ <fo:table-column column-number="3">
+ <xsl:attribute name="column-width">
+ <xsl:text>proportional-column-width(</xsl:text>
+ <xsl:call-template name="header.footer.width">
+ <xsl:with-param name="location">header</xsl:with-param>
+ <xsl:with-param name="position" select="$column3"/>
+ </xsl:call-template>
+ <xsl:text>)</xsl:text>
+ </xsl:attribute>
+ </fo:table-column>
+
+ <fo:table-body>
+ <fo:table-row>
+ <xsl:attribute name="block-progression-dimension.minimum">
+ <xsl:value-of select="$header.table.height"/>
+ </xsl:attribute>
+ <fo:table-cell text-align="start"
+ display-align="before">
+ <xsl:if test="$fop.extensions = 0">
+ <xsl:attribute name="relative-align">baseline</xsl:attribute>
+ </xsl:if>
+ <fo:block>
+ <xsl:call-template name="header.content">
+ <xsl:with-param name="pageclass" select="$pageclass"/>
+ <xsl:with-param name="sequence" select="$sequence"/>
+ <xsl:with-param name="position" select="$direction.align.start"/>
+ <xsl:with-param name="gentext-key" select="$gentext-key"/>
+ </xsl:call-template>
+ </fo:block>
+ </fo:table-cell>
+ <fo:table-cell text-align="center"
+ display-align="before">
+ <xsl:if test="$fop.extensions = 0">
+ <xsl:attribute name="relative-align">baseline</xsl:attribute>
+ </xsl:if>
+ <fo:block>
+ <xsl:call-template name="header.content">
+ <xsl:with-param name="pageclass" select="$pageclass"/>
+ <xsl:with-param name="sequence" select="$sequence"/>
+ <xsl:with-param name="position" select="'center'"/>
+ <xsl:with-param name="gentext-key" select="$gentext-key"/>
+ </xsl:call-template>
+ </fo:block>
+ </fo:table-cell>
+ <fo:table-cell text-align="right"
+ display-align="before">
+ <xsl:if test="$fop.extensions = 0">
+ <xsl:attribute name="relative-align">baseline</xsl:attribute>
+ </xsl:if>
+ <fo:block>
+ <xsl:call-template name="header.content">
+ <xsl:with-param name="pageclass" select="$pageclass"/>
+ <xsl:with-param name="sequence" select="$sequence"/>
+ <xsl:with-param name="position" select="$direction.align.end"/>
+ <xsl:with-param name="gentext-key" select="$gentext-key"/>
+ </xsl:call-template>
+ </fo:block>
+ </fo:table-cell>
+ </fo:table-row>
+ </fo:table-body>
+ </fo:table>
+ </xsl:variable>
+
+ <!-- Really output a header? -->
+ <xsl:choose>
+ <xsl:when test="$pageclass = 'titlepage' and $gentext-key = 'book'
+ and $sequence='first'">
+ <!-- no, book titlepages have no headers at all -->
+ </xsl:when>
+ <xsl:when test="$sequence = 'blank' and $headers.on.blank.pages = 0">
+ <!-- no output -->
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:copy-of select="$candidate"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="header.content">
+ <xsl:param name="pageclass" select="''"/>
+ <xsl:param name="sequence" select="''"/>
+ <xsl:param name="position" select="''"/>
+ <xsl:param name="gentext-key" select="''"/>
+
+<!--
+ <fo:block>
+ <xsl:value-of select="$pageclass"/>
+ <xsl:text>, </xsl:text>
+ <xsl:value-of select="$sequence"/>
+ <xsl:text>, </xsl:text>
+ <xsl:value-of select="$position"/>
+ <xsl:text>, </xsl:text>
+ <xsl:value-of select="$gentext-key"/>
+ </fo:block>
+-->
+
+ <fo:block>
+
+ <!-- sequence can be odd, even, first, blank -->
+ <!-- position can be left, center, right -->
+ <xsl:choose>
+ <xsl:when test="$sequence = 'blank'">
+ <!-- nothing -->
+ </xsl:when>
+
+ <xsl:when test="$position='left'">
+ <!-- Same for odd, even, empty, and blank sequences -->
+ <xsl:call-template name="draft.text"/>
+ </xsl:when>
+
+ <xsl:when test="($sequence='odd' or $sequence='even') and $position='center'">
+ <xsl:if test="$pageclass != 'titlepage'">
+ <xsl:choose>
+ <xsl:when test="ancestor::book and ($double.sided != 0)">
+ <fo:retrieve-marker retrieve-class-name="section.head.marker"
+ retrieve-position="first-including-carryover"
+ retrieve-boundary="page-sequence"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="." mode="titleabbrev.markup"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:if>
+ </xsl:when>
+
+ <xsl:when test="$position='center'">
+ <!-- nothing for empty and blank sequences -->
+ </xsl:when>
+
+ <xsl:when test="$position='right'">
+ <!-- Same for odd, even, empty, and blank sequences -->
+ <xsl:call-template name="draft.text"/>
+ </xsl:when>
+
+ <xsl:when test="$sequence = 'first'">
+ <!-- nothing for first pages -->
+ </xsl:when>
+
+ <xsl:when test="$sequence = 'blank'">
+ <!-- nothing for blank pages -->
+ </xsl:when>
+ </xsl:choose>
+ </fo:block>
+</xsl:template>
+
+<xsl:template name="header.footer.width">
+ <xsl:param name="location" select="'header'"/>
+ <xsl:param name="position" select="1"/>
+
+ <xsl:variable name="width.set">
+ <xsl:choose>
+ <xsl:when test="$location = 'header'">
+ <xsl:value-of select="normalize-space($header.column.widths)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="normalize-space($footer.column.widths)"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+
+ <xsl:variable name="width">
+ <xsl:choose>
+ <xsl:when test="$position = 1">
+ <xsl:value-of select="substring-before($width.set, ' ')"/>
+ </xsl:when>
+ <xsl:when test="$position = 2">
+ <xsl:value-of select="substring-before(substring-after($width.set, ' '), ' ')"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="substring-after(substring-after($width.set, ' '), ' ')"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <!-- Make sure it is a number -->
+ <xsl:choose>
+ <xsl:when test = "$width = number($width)">
+ <xsl:value-of select="$width"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:message>Error: value in <xsl:value-of select="$location"/>.column.widths at position <xsl:value-of select="$position"/> is not a number.</xsl:message>
+ <xsl:text>1</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="draft.text">
+ <xsl:choose>
+ <xsl:when test="$draft.mode = 'yes'">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'Draft'"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="$draft.mode = 'no'">
+ <!-- nop -->
+ </xsl:when>
+ <xsl:when test="ancestor-or-self::*[@status][1]/@status = 'draft'">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'Draft'"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <!-- nop -->
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="*" mode="running.foot.mode">
+ <xsl:param name="master-reference" select="'unknown'"/>
+ <xsl:param name="gentext-key" select="local-name(.)"/>
+
+ <!-- remove -draft from reference -->
+ <xsl:variable name="pageclass">
+ <xsl:choose>
+ <xsl:when test="contains($master-reference, '-draft')">
+ <xsl:value-of select="substring-before($master-reference, '-draft')"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$master-reference"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <fo:static-content flow-name="xsl-region-after-first">
+ <fo:block xsl:use-attribute-sets="footer.content.properties">
+ <xsl:call-template name="footer.table">
+ <xsl:with-param name="pageclass" select="$pageclass"/>
+ <xsl:with-param name="sequence" select="'first'"/>
+ <xsl:with-param name="gentext-key" select="$gentext-key"/>
+ </xsl:call-template>
+ </fo:block>
+ </fo:static-content>
+
+ <fo:static-content flow-name="xsl-region-after-odd">
+ <fo:block xsl:use-attribute-sets="footer.content.properties">
+ <xsl:call-template name="footer.table">
+ <xsl:with-param name="pageclass" select="$pageclass"/>
+ <xsl:with-param name="sequence" select="'odd'"/>
+ <xsl:with-param name="gentext-key" select="$gentext-key"/>
+ </xsl:call-template>
+ </fo:block>
+ </fo:static-content>
+
+ <fo:static-content flow-name="xsl-region-after-even">
+ <fo:block xsl:use-attribute-sets="footer.content.properties">
+ <xsl:call-template name="footer.table">
+ <xsl:with-param name="pageclass" select="$pageclass"/>
+ <xsl:with-param name="sequence" select="'even'"/>
+ <xsl:with-param name="gentext-key" select="$gentext-key"/>
+ </xsl:call-template>
+ </fo:block>
+ </fo:static-content>
+
+ <fo:static-content flow-name="xsl-region-after-blank">
+ <fo:block xsl:use-attribute-sets="footer.content.properties">
+ <xsl:call-template name="footer.table">
+ <xsl:with-param name="pageclass" select="$pageclass"/>
+ <xsl:with-param name="sequence" select="'blank'"/>
+ <xsl:with-param name="gentext-key" select="$gentext-key"/>
+ </xsl:call-template>
+ </fo:block>
+ </fo:static-content>
+</xsl:template>
+
+<xsl:template name="footer.table">
+ <xsl:param name="pageclass" select="''"/>
+ <xsl:param name="sequence" select="''"/>
+ <xsl:param name="gentext-key" select="''"/>
+
+ <!-- default is a single table style for all footers -->
+ <!-- Customize it for different page classes or sequence location -->
+
+ <xsl:choose>
+ <xsl:when test="$pageclass = 'index'">
+ <xsl:attribute name="margin-{$direction.align.start}">0pt</xsl:attribute>
+ </xsl:when>
+ </xsl:choose>
+
+ <xsl:variable name="column1">
+ <xsl:choose>
+ <xsl:when test="$double.sided = 0">1</xsl:when>
+ <xsl:when test="$sequence = 'first' or $sequence = 'odd'">1</xsl:when>
+ <xsl:otherwise>3</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="column3">
+ <xsl:choose>
+ <xsl:when test="$double.sided = 0">3</xsl:when>
+ <xsl:when test="$sequence = 'first' or $sequence = 'odd'">3</xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="candidate">
+ <fo:table xsl:use-attribute-sets="footer.table.properties">
+ <xsl:call-template name="foot.sep.rule">
+ <xsl:with-param name="pageclass" select="$pageclass"/>
+ <xsl:with-param name="sequence" select="$sequence"/>
+ <xsl:with-param name="gentext-key" select="$gentext-key"/>
+ </xsl:call-template>
+ <fo:table-column column-number="1">
+ <xsl:attribute name="column-width">
+ <xsl:text>proportional-column-width(</xsl:text>
+ <xsl:call-template name="header.footer.width">
+ <xsl:with-param name="location">footer</xsl:with-param>
+ <xsl:with-param name="position" select="$column1"/>
+ </xsl:call-template>
+ <xsl:text>)</xsl:text>
+ </xsl:attribute>
+ </fo:table-column>
+ <fo:table-column column-number="2">
+ <xsl:attribute name="column-width">
+ <xsl:text>proportional-column-width(</xsl:text>
+ <xsl:call-template name="header.footer.width">
+ <xsl:with-param name="location">footer</xsl:with-param>
+ <xsl:with-param name="position" select="2"/>
+ </xsl:call-template>
+ <xsl:text>)</xsl:text>
+ </xsl:attribute>
+ </fo:table-column>
+ <fo:table-column column-number="3">
+ <xsl:attribute name="column-width">
+ <xsl:text>proportional-column-width(</xsl:text>
+ <xsl:call-template name="header.footer.width">
+ <xsl:with-param name="location">footer</xsl:with-param>
+ <xsl:with-param name="position" select="$column3"/>
+ </xsl:call-template>
+ <xsl:text>)</xsl:text>
+ </xsl:attribute>
+ </fo:table-column>
+
+ <fo:table-body>
+ <fo:table-row>
+ <xsl:attribute name="block-progression-dimension.minimum">
+ <xsl:value-of select="$footer.table.height"/>
+ </xsl:attribute>
+ <fo:table-cell text-align="start"
+ display-align="after">
+ <xsl:if test="$fop.extensions = 0">
+ <xsl:attribute name="relative-align">baseline</xsl:attribute>
+ </xsl:if>
+ <fo:block>
+ <xsl:call-template name="footer.content">
+ <xsl:with-param name="pageclass" select="$pageclass"/>
+ <xsl:with-param name="sequence" select="$sequence"/>
+ <xsl:with-param name="position" select="$direction.align.start"/>
+ <xsl:with-param name="gentext-key" select="$gentext-key"/>
+ </xsl:call-template>
+ </fo:block>
+ </fo:table-cell>
+ <fo:table-cell text-align="center"
+ display-align="after">
+ <xsl:if test="$fop.extensions = 0">
+ <xsl:attribute name="relative-align">baseline</xsl:attribute>
+ </xsl:if>
+ <fo:block>
+ <xsl:call-template name="footer.content">
+ <xsl:with-param name="pageclass" select="$pageclass"/>
+ <xsl:with-param name="sequence" select="$sequence"/>
+ <xsl:with-param name="position" select="'center'"/>
+ <xsl:with-param name="gentext-key" select="$gentext-key"/>
+ </xsl:call-template>
+ </fo:block>
+ </fo:table-cell>
+ <fo:table-cell text-align="end"
+ display-align="after">
+ <xsl:if test="$fop.extensions = 0">
+ <xsl:attribute name="relative-align">baseline</xsl:attribute>
+ </xsl:if>
+ <fo:block>
+ <xsl:call-template name="footer.content">
+ <xsl:with-param name="pageclass" select="$pageclass"/>
+ <xsl:with-param name="sequence" select="$sequence"/>
+ <xsl:with-param name="position" select="$direction.align.end"/>
+ <xsl:with-param name="gentext-key" select="$gentext-key"/>
+ </xsl:call-template>
+ </fo:block>
+ </fo:table-cell>
+ </fo:table-row>
+ </fo:table-body>
+ </fo:table>
+ </xsl:variable>
+
+ <!-- Really output a footer? -->
+ <xsl:choose>
+ <xsl:when test="$pageclass='titlepage' and $gentext-key='book'
+ and $sequence='first'">
+ <!-- no, book titlepages have no footers at all -->
+ </xsl:when>
+ <xsl:when test="$sequence = 'blank' and $footers.on.blank.pages = 0">
+ <!-- no output -->
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:copy-of select="$candidate"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="footer.content">
+ <xsl:param name="pageclass" select="''"/>
+ <xsl:param name="sequence" select="''"/>
+ <xsl:param name="position" select="''"/>
+ <xsl:param name="gentext-key" select="''"/>
+
+<!--
+ <fo:block>
+ <xsl:value-of select="$pageclass"/>
+ <xsl:text>, </xsl:text>
+ <xsl:value-of select="$sequence"/>
+ <xsl:text>, </xsl:text>
+ <xsl:value-of select="$position"/>
+ <xsl:text>, </xsl:text>
+ <xsl:value-of select="$gentext-key"/>
+ </fo:block>
+-->
+
+ <fo:block>
+ <!-- pageclass can be front, body, back -->
+ <!-- sequence can be odd, even, first, blank -->
+ <!-- position can be left, center, right -->
+ <xsl:choose>
+ <xsl:when test="$pageclass = 'titlepage'">
+ <!-- nop; no footer on title pages -->
+ </xsl:when>
+
+ <xsl:when test="$double.sided != 0 and $sequence = 'even'
+ and $position='left'">
+ <fo:page-number/>
+ </xsl:when>
+
+ <xsl:when test="$double.sided != 0 and ($sequence = 'odd' or $sequence = 'first')
+ and $position='right'">
+ <fo:page-number/>
+ </xsl:when>
+
+ <xsl:when test="$double.sided = 0 and $position='center'">
+ <fo:page-number/>
+ </xsl:when>
+
+ <xsl:when test="$sequence='blank'">
+ <xsl:choose>
+ <xsl:when test="$double.sided != 0 and $position = 'left'">
+ <fo:page-number/>
+ </xsl:when>
+ <xsl:when test="$double.sided = 0 and $position = 'center'">
+ <fo:page-number/>
+ </xsl:when>
+ <xsl:otherwise>
+ <!-- nop -->
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+
+
+ <xsl:otherwise>
+ <!-- nop -->
+ </xsl:otherwise>
+ </xsl:choose>
+ </fo:block>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template name="page.number.format">
+ <xsl:param name="element" select="local-name(.)"/>
+ <xsl:param name="master-reference" select="''"/>
+
+ <xsl:choose>
+ <xsl:when test="$element = 'toc' and self::book">i</xsl:when>
+ <xsl:when test="$element = 'preface'">i</xsl:when>
+ <xsl:when test="$element = 'dedication'">i</xsl:when>
+ <xsl:when test="$element = 'acknowledgements'">i</xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="initial.page.number">
+ <xsl:param name="element" select="local-name(.)"/>
+ <xsl:param name="master-reference" select="''"/>
+
+ <!-- Select the first content that the stylesheet places
+ after the TOC -->
+ <xsl:variable name="first.book.content"
+ select="ancestor::book/*[
+ not(self::title or
+ self::subtitle or
+ self::titleabbrev or
+ self::bookinfo or
+ self::info or
+ self::dedication or
+ self::acknowledgements or
+ self::preface or
+ self::toc or
+ self::lot)][1]"/>
+ <xsl:choose>
+ <!-- double-sided output -->
+ <xsl:when test="$double.sided != 0">
+ <xsl:choose>
+ <xsl:when test="$element = 'toc'">auto-odd</xsl:when>
+ <xsl:when test="$element = 'book'">1</xsl:when>
+ <!-- preface typically continues TOC roman numerals -->
+ <!-- Change page.number.format if not -->
+ <xsl:when test="$element = 'preface'">auto-odd</xsl:when>
+ <xsl:when test="($element = 'dedication' or $element = 'article')
+ and not(preceding::chapter
+ or preceding::preface
+ or preceding::appendix
+ or preceding::article
+ or preceding::dedication
+ or parent::part
+ or parent::reference)">1</xsl:when>
+ <xsl:when test="generate-id($first.book.content) =
+ generate-id(.)">1</xsl:when>
+ <xsl:otherwise>auto-odd</xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+
+ <!-- single-sided output -->
+ <xsl:otherwise>
+ <xsl:choose>
+ <xsl:when test="$element = 'toc'">auto</xsl:when>
+ <xsl:when test="$element = 'book'">1</xsl:when>
+ <xsl:when test="$element = 'preface'">auto</xsl:when>
+ <xsl:when test="($element = 'dedication' or $element = 'article') and
+ not(preceding::chapter
+ or preceding::preface
+ or preceding::appendix
+ or preceding::article
+ or preceding::dedication
+ or parent::part
+ or parent::reference)">1</xsl:when>
+ <xsl:when test="generate-id($first.book.content) =
+ generate-id(.)">1</xsl:when>
+ <xsl:otherwise>auto</xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="force.page.count">
+ <xsl:param name="element" select="local-name(.)"/>
+ <xsl:param name="master-reference" select="''"/>
+
+ <xsl:choose>
+ <!-- double-sided output -->
+ <xsl:when test="$double.sided != 0">end-on-even</xsl:when>
+ <!-- single-sided output -->
+ <xsl:otherwise>no-force</xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="set.flow.properties">
+ <xsl:param name="element" select="local-name(.)"/>
+ <xsl:param name="master-reference" select="''"/>
+
+ <!-- This template is called after each <fo:flow> starts. -->
+ <!-- Customize this template to set attributes on fo:flow -->
+
+ <!-- remove -draft from reference -->
+ <xsl:variable name="pageclass">
+ <xsl:choose>
+ <xsl:when test="contains($master-reference, '-draft')">
+ <xsl:value-of select="substring-before($master-reference, '-draft')"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$master-reference"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="$fop.extensions != 0 or $passivetex.extensions != 0">
+ <!-- body.start.indent does not work well with these processors -->
+ </xsl:when>
+ <xsl:when test="starts-with($pageclass, 'body') or
+ starts-with($pageclass, 'lot') or
+ starts-with($pageclass, 'front') or
+ $element = 'preface' or
+ (starts-with($pageclass, 'back') and
+ $element = 'appendix')">
+ <xsl:attribute name="start-indent">
+ <xsl:value-of select="$body.start.indent"/>
+ </xsl:attribute>
+ <xsl:attribute name="end-indent">
+ <xsl:value-of select="$body.end.indent"/>
+ </xsl:attribute>
+ </xsl:when>
+ </xsl:choose>
+
+</xsl:template>
+<!-- ==================================================================== -->
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/param.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/param.xml
new file mode 100644
index 0000000..d179d36
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/param.xml
@@ -0,0 +1,12445 @@
+<?xml version="1.0" encoding="ASCII"?>
+<book version="5.0">
+<info>
+<title>FO Parameter Reference</title>
+<releaseinfo role="meta">
+$Id: param.xweb 8543 2009-12-02 06:05:24Z bobstayton $
+</releaseinfo>
+<author>
+ <personname>
+ <surname>Walsh</surname>
+ <firstname>Norman</firstname>
+ </personname>
+</author>
+<copyright>
+ <year>1999</year>
+ <year>2000</year>
+ <year>2001</year>
+ <year>2002</year>
+ <year>2003</year>
+ <year>2004</year>
+ <year>2005</year>
+ <year>2006</year>
+ <year>2007</year>
+ <holder>Norman Walsh</holder>
+</copyright>
+<abstract>
+ <para>This is reference documentation for all user-configurable
+ parameters in the DocBook XSL FO stylesheets (for generating
+ XSL-FO output destined for final print/PDF output).</para>
+</abstract>
+</info>
+<reference xml:id="admons"><title>Admonitions</title>
+<refentry version="5.0" xml:id="admon.graphics">
+<refmeta>
+<refentrytitle>admon.graphics</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>admon.graphics</refname>
+<refpurpose>Use graphics in admonitions?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="admon.graphics.frag">
+&lt;xsl:param name="admon.graphics" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If true (non-zero), admonitions are presented in an alternate style that uses
+a graphic. Default graphics are provided in the distribution.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="admon.graphics.extension">
+<refmeta>
+<refentrytitle>admon.graphics.extension</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>admon.graphics.extension</refname>
+<refpurpose>Filename extension for admonition graphics</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="admon.graphics.extension.frag">
+&lt;xsl:param name="admon.graphics.extension"&gt;.png&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Sets the filename extension to use on admonition graphics.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="admon.graphics.path">
+<refmeta>
+<refentrytitle>admon.graphics.path</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>admon.graphics.path</refname>
+<refpurpose>Path to admonition graphics</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="admon.graphics.path.frag">&lt;xsl:param name="admon.graphics.path"&gt;images/&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Sets the path to the directory containing the admonition graphics
+(caution.png, important.png etc). This location is normally relative
+to the output html directory. See <parameter>base.dir</parameter></para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="admon.textlabel">
+<refmeta>
+<refentrytitle>admon.textlabel</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>admon.textlabel</refname>
+<refpurpose>Use text label in admonitions?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="admon.textlabel.frag">
+&lt;xsl:param name="admon.textlabel" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If true (non-zero), admonitions are presented with a generated
+text label such as Note or Warning in the appropriate language.
+If zero, such labels are turned off, but any title child
+of the admonition element are still output.
+The default value is 1.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="admonition.title.properties">
+
+<refmeta>
+ <refentrytitle>admonition.title.properties</refentrytitle>
+ <refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>admonition.title.properties</refname>
+<refpurpose>To set the style for admonitions titles.</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="admonition.title.properties.frag">
+&lt;xsl:attribute-set name="admonition.title.properties"&gt;
+ &lt;xsl:attribute name="font-size"&gt;14pt&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="font-weight"&gt;bold&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="hyphenate"&gt;false&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="keep-with-next.within-column"&gt;always&lt;/xsl:attribute&gt;
+&lt;/xsl:attribute-set&gt;
+</programlisting>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+<para>How do you want admonitions titles styled? </para>
+<para>Set the font-size, weight etc to the style required.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="admonition.properties">
+<refmeta>
+ <refentrytitle>admonition.properties</refentrytitle>
+ <refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>admonition.properties</refname>
+<refpurpose>To set the style for admonitions.</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="admonition.properties.frag">&lt;xsl:attribute-set name="admonition.properties"&gt;&lt;/xsl:attribute-set&gt;
+</programlisting>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+<para>How do you want admonitions styled? </para>
+<para>Set the font-size, weight, etc. to the style required</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="graphical.admonition.properties">
+<refmeta>
+<refentrytitle>graphical.admonition.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>graphical.admonition.properties</refname>
+<refpurpose>To add properties to the outer block of a graphical admonition.</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="graphical.admonition.properties.frag">&lt;xsl:attribute-set name="graphical.admonition.properties"&gt;
+ &lt;xsl:attribute name="space-before.optimum"&gt;1em&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="space-before.minimum"&gt;0.8em&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="space-before.maximum"&gt;1.2em&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="space-after.optimum"&gt;1em&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="space-after.minimum"&gt;0.8em&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="space-after.maximum"&gt;1.2em&lt;/xsl:attribute&gt;
+&lt;/xsl:attribute-set&gt;
+</programlisting>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+<para>These properties are added to the outer block containing the
+entire graphical admonition, including its title.
+It is used when the parameter
+<parameter>admon.graphics</parameter> is set to nonzero.
+Use this attribute-set to set the space above and below,
+and any indent for the whole admonition.</para>
+
+<para>In addition to these properties, a graphical admonition
+also applies the <parameter>admonition.title.properties</parameter>
+attribute-set to the title, and applies the
+<parameter>admonition.properties</parameter> attribute-set
+to the rest of the content.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="nongraphical.admonition.properties">
+<refmeta>
+<refentrytitle>nongraphical.admonition.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>nongraphical.admonition.properties</refname>
+<refpurpose>To add properties to the outer block of a nongraphical admonition.</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="nongraphical.admonition.properties.frag">&lt;xsl:attribute-set name="nongraphical.admonition.properties"&gt;
+ &lt;xsl:attribute name="space-before.minimum"&gt;0.8em&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="space-before.optimum"&gt;1em&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="space-before.maximum"&gt;1.2em&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="margin-{$direction.align.start}"&gt;0.25in&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="margin-{$direction.align.end}"&gt;0.25in&lt;/xsl:attribute&gt;
+&lt;/xsl:attribute-set&gt;
+</programlisting>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+<para>These properties are added to the outer block containing the
+entire nongraphical admonition, including its title.
+It is used when the parameter
+<parameter>admon.graphics</parameter> is set to zero.
+Use this attribute-set to set the space above and below,
+and any indent for the whole admonition.</para>
+
+<para>In addition to these properties, a nongraphical admonition
+also applies the <parameter>admonition.title.properties</parameter>
+attribute-set to the title, and the
+<parameter>admonition.properties</parameter> attribute-set
+to the rest of the content.</para>
+
+</refsection>
+</refentry>
+
+</reference>
+<reference xml:id="callouts"><title>Callouts</title>
+<refentry version="5.0" xml:id="callout.defaultcolumn">
+<refmeta>
+<refentrytitle>callout.defaultcolumn</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">integer</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>callout.defaultcolumn</refname>
+<refpurpose>Indicates what column callouts appear in by default</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="callout.defaultcolumn.frag">
+&lt;xsl:param name="callout.defaultcolumn"&gt;60&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If a callout does not identify a column (for example, if it uses
+the <literal>linerange</literal> <tag class="attribute">unit</tag>),
+it will appear in the default column.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="callout.graphics">
+<refmeta>
+<refentrytitle>callout.graphics</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>callout.graphics</refname>
+<refpurpose>Use graphics for callouts?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="callout.graphics.frag">
+&lt;xsl:param name="callout.graphics" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, callouts are presented with graphics (e.g., reverse-video
+circled numbers instead of "(1)", "(2)", etc.).
+Default graphics are provided in the distribution.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="callout.graphics.extension">
+<refmeta>
+<refentrytitle>callout.graphics.extension</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>callout.graphics.extension</refname>
+<refpurpose>Filename extension for callout graphics</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="callout.graphics.extension.frag">
+
+&lt;xsl:param name="callout.graphics.extension"&gt;.svg&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+<para>Sets the filename extension to use on callout graphics. </para>
+
+<itemizedlist>
+<para>The Docbook XSL distribution provides callout graphics in the following formats:</para>
+<listitem><para>SVG (extension: <filename class="extension">.svg</filename>)</para></listitem>
+<listitem><para>PNG (extension: <filename class="extension">.png</filename>)</para></listitem>
+<listitem><para>GIF (extension: <filename class="extension">.gif</filename>)</para></listitem>
+</itemizedlist>
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="callout.graphics.number.limit">
+<refmeta>
+<refentrytitle>callout.graphics.number.limit</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">integer</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>callout.graphics.number.limit</refname>
+<refpurpose>Number of the largest callout graphic</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="callout.graphics.number.limit.frag">
+
+&lt;xsl:param name="callout.graphics.number.limit"&gt;30&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If <parameter>callout.graphics</parameter> is non-zero, graphics
+are used to represent callout numbers instead of plain text. The value
+of <parameter>callout.graphics.number.limit</parameter> is the largest
+number for which a graphic exists. If the callout number exceeds this
+limit, the default presentation "(plain text instead of a graphic)"
+will be used.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="callout.graphics.path">
+<refmeta>
+<refentrytitle>callout.graphics.path</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>callout.graphics.path</refname>
+<refpurpose>Path to callout graphics</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="callout.graphics.path.frag">
+&lt;xsl:param name="callout.graphics.path"&gt;images/callouts/&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Sets the path to the directory holding the callout graphics. his
+location is normally relative to the output html directory. see
+base.dir. Always terminate the directory with / since the graphic file
+is appended to this string, hence needs the separator.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="callout.icon.size">
+<refmeta>
+<refentrytitle>callout.icon.size</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">length</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>callout.icon.size</refname>
+<refpurpose>Specifies the size of callout marker icons</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="callout.icon.size.frag">
+&lt;xsl:param name="callout.icon.size"&gt;7pt&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies the size of the callout marker icons.
+The default size is 7 points.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="callout.unicode">
+<refmeta>
+<refentrytitle>callout.unicode</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>callout.unicode</refname>
+<refpurpose>Use Unicode characters rather than images for callouts.</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="callout.unicode.frag">&lt;xsl:param name="callout.unicode" select="0"&gt;&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The stylesheets can use either an image of the numbers one to ten, or the single Unicode character which represents the numeral, in white on a black background. Use this to select the Unicode character option.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="callout.unicode.font">
+<refmeta>
+<refentrytitle>callout.unicode.font</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>callout.unicode.font</refname>
+<refpurpose>Specify a font for Unicode glyphs</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="callout.unicode.font.frag">
+&lt;xsl:param name="callout.unicode.font"&gt;ZapfDingbats&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The name of the font to specify around Unicode callout glyphs.
+If set to the empty string, no font change will occur.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="callout.unicode.number.limit">
+<refmeta>
+<refentrytitle>callout.unicode.number.limit</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">integer</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>callout.unicode.number.limit</refname>
+<refpurpose>Number of the largest unicode callout character</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="callout.unicode.number.limit.frag">
+&lt;xsl:param name="callout.unicode.number.limit"&gt;10&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If <parameter>callout.unicode</parameter>
+is non-zero, unicode characters are used to represent
+callout numbers. The value of
+<parameter>callout.unicode.number.limit</parameter>
+is
+the largest number for which a unicode character exists. If the callout number
+exceeds this limit, the default presentation "(nnn)" will always
+be used.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="callout.unicode.start.character">
+<refmeta>
+<refentrytitle>callout.unicode.start.character</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">integer</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>callout.unicode.start.character</refname>
+<refpurpose>First Unicode character to use, decimal value.</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="callout.unicode.start.character.frag">
+&lt;xsl:param name="callout.unicode.start.character"&gt;10102&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If <parameter>callout.graphics</parameter> is zero and <parameter>callout.unicode</parameter>
+is non-zero, unicode characters are used to represent
+callout numbers. The value of
+<parameter>callout.unicode.start.character</parameter>
+is the decimal unicode value used for callout number one. Currently,
+only 10102 is supported in the stylesheets for this parameter.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="callouts.extension">
+<refmeta>
+<refentrytitle>callouts.extension</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>callouts.extension</refname>
+<refpurpose>Enable the callout extension</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="callouts.extension.frag">
+&lt;xsl:param name="callouts.extension" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The callouts extension processes <tag>areaset</tag>
+elements in <tag>programlistingco</tag> and other text-based
+callout elements.
+</para>
+
+</refsection>
+</refentry>
+
+</reference>
+<reference xml:id="toc_index"><title>ToC/LoT/Index Generation</title>
+<refentry version="5.0" xml:id="autotoc.label.separator">
+<refmeta>
+<refentrytitle>autotoc.label.separator</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>autotoc.label.separator</refname>
+<refpurpose>Separator between labels and titles in the ToC</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="autotoc.label.separator.frag">
+&lt;xsl:param name="autotoc.label.separator"&gt;. &lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>String used to separate labels and titles in a table of contents.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="process.empty.source.toc">
+<refmeta>
+<refentrytitle>process.empty.source.toc</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>process.empty.source.toc</refname>
+<refpurpose>Generate automated TOC if <tag>toc</tag> element occurs in a source document?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="process.empty.source.toc.frag">&lt;xsl:param name="process.empty.source.toc" select="0"&gt;&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies that if an empty <tag>toc</tag> element is found in a
+source document, an automated TOC is generated at this point in the
+document.
+<note>
+ <para>Depending on what the value of the
+ <parameter>generate.toc</parameter> parameter is, setting this
+ parameter to <literal>1</literal> could result in generation of
+ duplicate automated TOCs. So the
+ <parameter>process.empty.source.toc</parameter> is primarily useful
+ as an "override": by placing an empty <tag>toc</tag> in your
+ document and setting this parameter to <literal>1</literal>, you can
+ force a TOC to be generated even if <tag>generate.toc</tag>
+ says not to.</para>
+</note>
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="process.source.toc">
+<refmeta>
+<refentrytitle>process.source.toc</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>process.source.toc</refname>
+<refpurpose>Process a non-empty <tag>toc</tag> element if it occurs in a source document?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="process.source.toc.frag">&lt;xsl:param name="process.source.toc" select="0"&gt;&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies that the contents of a non-empty "hard-coded"
+<tag>toc</tag> element in a source document are processed to
+generate a TOC in output.
+<note>
+ <para>This parameter has no effect on automated generation of
+ TOCs. An automated TOC may still be generated along with the
+ "hard-coded" TOC. To suppress automated TOC generation, adjust the
+ value of the <parameter>generate.toc</parameter> paramameter.</para>
+
+ <para>The <tag>process.source.toc</tag> parameter also has
+ no effect if the <tag>toc</tag> element is empty; handling
+ for empty <tag>toc</tag> is controlled by the
+ <parameter>process.empty.source.toc</parameter> parameter.</para>
+</note>
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="generate.toc">
+<refmeta>
+<refentrytitle>generate.toc</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">table</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>generate.toc</refname>
+<refpurpose>Control generation of ToCs and LoTs</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="generate.toc.frag">
+
+&lt;xsl:param name="generate.toc"&gt;
+/appendix toc,title
+article/appendix nop
+/article toc,title
+book toc,title,figure,table,example,equation
+/chapter toc,title
+part toc,title
+/preface toc,title
+reference toc,title
+/sect1 toc
+/sect2 toc
+/sect3 toc
+/sect4 toc
+/sect5 toc
+/section toc
+set toc,title
+&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>This parameter has a structured value. It is a table of space-delimited
+path/value pairs. Each path identifies some element in the source document
+using a restricted subset of XPath (only the implicit child axis, no wildcards,
+no predicates). Paths can be either relative or absolute.</para>
+
+<para>When processing a particular element, the stylesheets consult this table to
+determine if a ToC (or LoT(s)) should be generated.</para>
+
+<para>For example, consider the entry:</para>
+
+<screen>book toc,figure</screen>
+
+<para>This indicates that whenever a <tag>book</tag> is formatted, a
+Table Of Contents and a List of Figures should be generated. Similarly,</para>
+
+<screen>/chapter toc</screen>
+
+<para>indicates that whenever a document <emphasis>that has a root
+of</emphasis> <tag>chapter</tag> is formatted, a Table of
+Contents should be generated. The entry <literal>chapter</literal> would match
+all chapters, but <literal>/chapter</literal> matches only <tag>chapter</tag>
+document elements.</para>
+
+<para>Generally, the longest match wins. So, for example, if you want to distinguish
+articles in books from articles in parts, you could use these two entries:</para>
+
+<screen>book/article toc,figure
+part/article toc</screen>
+
+<para>Note that an article in a part can never match a <literal>book/article</literal>,
+so if you want nothing to be generated for articles in parts, you can simply leave
+that rule out.</para>
+
+<para>If you want to leave the rule in, to make it explicit that you're turning
+something off, use the value <quote>nop</quote>. For example, the following
+entry disables ToCs and LoTs for articles:</para>
+
+<screen>article nop</screen>
+
+<para>Do not simply leave the word <quote>article</quote> in the file
+without a matching value. That'd be just begging the silly little
+path/value parser to get confused.</para>
+
+<para>Section ToCs are further controlled by the
+<parameter>generate.section.toc.level</parameter> parameter.
+For a given section level to have a ToC, it must have both an entry in
+<parameter>generate.toc</parameter> and be within the range enabled by
+<parameter>generate.section.toc.level</parameter>.</para>
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="generate.index">
+<refmeta>
+<refentrytitle>generate.index</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>generate.index</refname>
+<refpurpose>Do you want an index?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="generate.index.frag">&lt;xsl:param name="generate.index" select="1"&gt;&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specify if an index should be generated. </para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="make.index.markup">
+<refmeta>
+<refentrytitle>make.index.markup</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>make.index.markup</refname>
+<refpurpose>Generate XML index markup in the index?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="make.index.markup.frag">
+&lt;xsl:param name="make.index.markup" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>This parameter enables a very neat trick for getting properly
+merged, collated back-of-the-book indexes. G. Ken Holman suggested
+this trick at Extreme Markup Languages 2002 and I'm indebted to him
+for it.</para>
+
+<para>Jeni Tennison's excellent code in
+<filename>autoidx.xsl</filename> does a great job of merging and
+sorting <tag>indexterm</tag>s in the document and building a
+back-of-the-book index. However, there's one thing that it cannot
+reasonably be expected to do: merge page numbers into ranges. (I would
+not have thought that it could collate and suppress duplicate page
+numbers, but in fact it appears to manage that task somehow.)</para>
+
+<para>Ken's trick is to produce a document in which the index at the
+back of the book is <quote>displayed</quote> in XML. Because the index
+is generated by the FO processor, all of the page numbers have been resolved.
+It's a bit hard to explain, but what it boils down to is that instead of having
+an index at the back of the book that looks like this:</para>
+
+<blockquote>
+<formalpara><info><title>A</title></info>
+<para>ap1, 1, 2, 3</para>
+</formalpara>
+</blockquote>
+
+<para>you get one that looks like this:</para>
+
+<blockquote>
+<programlisting>&lt;indexdiv&gt;A&lt;/indexdiv&gt;
+&lt;indexentry&gt;
+&lt;primaryie&gt;ap1&lt;/primaryie&gt;,
+&lt;phrase role="pageno"&gt;1&lt;/phrase&gt;,
+&lt;phrase role="pageno"&gt;2&lt;/phrase&gt;,
+&lt;phrase role="pageno"&gt;3&lt;/phrase&gt;
+&lt;/indexentry&gt;</programlisting>
+</blockquote>
+
+<para>After building a PDF file with this sort of odd-looking index, you can
+extract the text from the PDF file and the result is a proper index expressed in
+XML.</para>
+
+<para>Now you have data that's amenable to processing and a simple Perl script
+(such as <filename>fo/pdf2index</filename>) can
+merge page ranges and generate a proper index.</para>
+
+<para>Finally, reformat your original document using this literal index instead of
+an automatically generated one and <quote>bingo</quote>!</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="index.method">
+<refmeta>
+<refentrytitle>index.method</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">list</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">basic</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">kosek</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">kimber</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>index.method</refname>
+<refpurpose>Select method used to group index entries in an index</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="index.method.frag">
+&lt;xsl:param name="index.method"&gt;basic&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>This parameter lets you select which method to use for sorting and grouping
+ index entries in an index.
+Indexes in Latin-based languages that have accented characters typically
+sort together accented words and unaccented words.
+Thus <quote>&#193;</quote> (U+00C1 LATIN CAPITAL LETTER A WITH ACUTE) would sort together
+with <quote>A</quote> (U+0041 LATIN CAPITAL LETTER A), so both would appear in the <quote>A</quote>
+section of the index.
+Languages using other alphabets (such as Russian, which is written in the Cyrillic alphabet)
+and languages using ideographic chararacters (such as Japanese)
+require grouping specific to the languages and alphabets.
+</para>
+
+<para>The default indexing method is limited.
+It can group accented characters in Latin-based languages only.
+It cannot handle non-Latin alphabets or ideographic languages.
+The other indexing methods require extensions of one type or
+another, and do not work with
+all XSLT processors, which is why they are not used by default.</para>
+
+<para>The three choices for indexing method are:</para>
+<variablelist>
+<varlistentry>
+<term><literal>basic</literal></term>
+<listitem>
+<para>
+(default) Sort and groups words based only on the Latin alphabet.
+Words with accented Latin letters will group and sort with
+their respective primary letter, but
+words in non-Latin alphabets will be
+put in the <quote>Symbols</quote> section of the index.
+</para>
+</listitem>
+</varlistentry>
+<varlistentry>
+<term><literal>kosek</literal></term>
+<listitem>
+<para>
+This method sorts and groups words based on letter groups configured in
+the DocBook locale file for the given language.
+See, for example, the French locale file <filename>common/fr.xml</filename>.
+This method requires that the XSLT processor
+supports the EXSLT extensions (most do).
+It also requires support for using
+user-defined functions in xsl:key (xsltproc does not).
+</para>
+<para>This method is suitable for any language for which you can
+list all the individual characters that should appear
+in each letter group in an index.
+It is probably not practical to use it for ideographic languages
+such as Chinese that have hundreds or thousands of characters.
+</para>
+
+<para>To use the kosek method, you must:</para>
+
+<orderedlist>
+<listitem>
+<para>Use a processor that supports its extensions, such as
+Saxon 6 or Xalan (xsltproc and Saxon 8 do not).
+</para>
+</listitem>
+<listitem>
+<para>Set the index.method parameter's value to <quote>kosek</quote>.
+</para>
+</listitem>
+<listitem>
+<para>Import the appropriate index extensions stylesheet module
+<filename>fo/autoidx-kosek.xsl</filename> or
+<filename>html/autoidx-kosek.xsl</filename> into your
+customization.
+</para>
+</listitem>
+</orderedlist>
+
+</listitem>
+</varlistentry>
+<varlistentry>
+<term><literal>kimber</literal></term>
+<listitem>
+<para>
+This method uses extensions to the Saxon processor to implement
+sophisticated indexing processes. It uses its own
+configuration file, which can include information for any number of
+languages. Each language's configuration can group
+words using one of two processes. In the
+enumerated process similar to that used in the kosek method,
+you indicate the groupings character-by-character.
+In the between-key process, you specify the
+break-points in the sort order that should start a new group.
+The latter configuration is useful for ideographic languages
+such as Chinese, Japanese, and Korean.
+You can also define your own collation algorithms and how you
+want mixed Latin-alphabet words sorted.</para>
+<itemizedlist>
+<listitem>
+<para>For a whitepaper describing the extensions, see:
+<link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.innodata-isogen.com/knowledge_center/white_papers/back_of_book_for_xsl_fo.pdf">http://www.innodata-isogen.com/knowledge_center/white_papers/back_of_book_for_xsl_fo.pdf</link>.
+</para>
+</listitem>
+<listitem>
+<para>To download the extension library, see
+<link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.innodata-isogen.com/knowledge_center/tools_downloads/i18nsupport">http://www.innodata-isogen.com/knowledge_center/tools_downloads/i18nsupport</link>.
+</para>
+</listitem>
+</itemizedlist>
+
+<para>To use the kimber method, you must:</para>
+
+<orderedlist>
+<listitem>
+<para>Use Saxon (version 6 or 8) as your XSLT processor.
+</para>
+</listitem>
+<listitem>
+<para>Install and configure the Innodata Isogen library, using
+the documentation that comes with it.
+</para>
+</listitem>
+<listitem>
+<para>Set the index.method parameter's value to <quote>kimber</quote>.
+</para>
+</listitem>
+<listitem>
+<para>Import the appropriate index extensions stylesheet module
+<filename>fo/autoidx-kimber.xsl</filename> or
+<filename>html/autoidx-kimber.xsl</filename> into your
+customization.
+</para>
+</listitem>
+</orderedlist>
+
+</listitem>
+</varlistentry>
+</variablelist>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="index.on.type">
+<refmeta>
+<refentrytitle>index.on.type</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>index.on.type</refname>
+<refpurpose>Select indexterms based on <tag class="attribute">type</tag>
+attribute value</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="index.on.type.frag">
+&lt;xsl:param name="index.on.type" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>
+If non-zero,
+then an <tag>index</tag> element that has a
+<tag class="attribute">type</tag> attribute
+value will contain only those <tag>indexterm</tag>
+elements with a matching <tag class="attribute">type</tag> attribute value.
+If an <tag>index</tag> has no <tag class="attribute">type</tag>
+attribute or it is blank, then the index will contain
+all <tag>indexterm</tag>s in the current scope.
+</para>
+
+<para>
+If <literal>index.on.type</literal> is zero, then the
+<tag class="attribute">type</tag> attribute has no effect
+on selecting indexterms for an index.
+</para>
+
+<para>For those using DocBook version 4.2 or earlier,
+the <tag class="attribute">type</tag> attribute is not available
+for index terms. However, you can achieve the same
+effect by using the <tag class="attribute">role</tag> attribute
+in the same manner on <tag>indexterm</tag>
+and <tag>index</tag>, and setting the stylesheet parameter
+<parameter>index.on.role</parameter> to a nonzero value.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="index.on.role">
+<refmeta>
+<refentrytitle>index.on.role</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>index.on.role</refname>
+<refpurpose>Select indexterms based on <tag class="attribute">role</tag> value</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="index.on.role.frag">
+&lt;xsl:param name="index.on.role" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>
+If non-zero,
+then an <tag>index</tag> element that has a
+<tag class="attribute">role</tag> attribute
+value will contain only those <tag>indexterm</tag>
+elements with a matching role value.
+If an <tag>index</tag> has no <tag class="attribute">role</tag>
+attribute or it is blank, then the index will contain
+all <tag>indexterm</tag>s in the current scope.
+</para>
+<para>
+If <literal>index.on.role</literal> is zero, then the
+<tag class="attribute">role</tag> attribute has no effect
+on selecting indexterms for an index.
+</para>
+
+<para>If you are using DocBook version 4.3 or later, you should
+use the <tag class="attribute">type</tag> attribute instead of <tag class="attribute">role</tag>
+on <tag>indexterm</tag> and <tag>index</tag>,
+and set the <parameter>index.on.type</parameter> to a nonzero
+value.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="index.preferred.page.properties">
+<refmeta>
+<refentrytitle>index.preferred.page.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>index.preferred.page.properties</refname>
+<refpurpose>Properties used to emphasize page number references for
+significant index terms</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="index.preferred.page.properties.frag">
+&lt;xsl:attribute-set name="index.preferred.page.properties"&gt;
+ &lt;xsl:attribute name="font-weight"&gt;bold&lt;/xsl:attribute&gt;
+&lt;/xsl:attribute-set&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Properties used to emphasize page number references for
+significant index terms (<tag class="attribute">significance</tag>=<tag class="attvalue">preferred</tag>). Currently works only with
+XEP.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="index.entry.properties">
+<refmeta>
+<refentrytitle>index.entry.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>index.entry.properties</refname>
+<refpurpose>Properties applied to the formatted entries
+in an index</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="index.entry.properties.frag">
+&lt;xsl:attribute-set name="index.entry.properties"&gt;
+ &lt;xsl:attribute name="start-indent"&gt;0pt&lt;/xsl:attribute&gt;
+&lt;/xsl:attribute-set&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>This attribute set is applied to the block containing
+the entries in a letter division in an index. It can be used to set the
+font-size, font-family, and other inheritable properties that will be
+applied to all index entries.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="index.div.title.properties">
+<refmeta>
+<refentrytitle>index.div.title.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>index.div.title.properties</refname>
+<refpurpose>Properties associated with the letter headings in an
+index</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="index.div.title.properties.frag">
+&lt;xsl:attribute-set name="index.div.title.properties"&gt;
+ &lt;xsl:attribute name="margin-{$direction.align.start}"&gt;0pt&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="font-size"&gt;14.4pt&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="font-family"&gt;&lt;xsl:value-of select="$title.fontset"&gt;&lt;/xsl:value-of&gt;&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="font-weight"&gt;bold&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="keep-with-next.within-column"&gt;always&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="space-before.optimum"&gt;&lt;xsl:value-of select="concat($body.font.master,'pt')"&gt;&lt;/xsl:value-of&gt;&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="space-before.minimum"&gt;&lt;xsl:value-of select="concat($body.font.master,'pt * 0.8')"&gt;&lt;/xsl:value-of&gt;&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="space-before.maximum"&gt;&lt;xsl:value-of select="concat($body.font.master,'pt * 1.2')"&gt;&lt;/xsl:value-of&gt;&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="start-indent"&gt;0pt&lt;/xsl:attribute&gt;
+&lt;/xsl:attribute-set&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>This attribute set is used on the letter headings that separate
+the divisions in an index.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="index.number.separator">
+<refmeta>
+<refentrytitle>index.number.separator</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>index.number.separator</refname>
+<refpurpose>Override for punctuation separating page numbers in index</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="index.number.separator.frag">
+&lt;xsl:param name="index.number.separator"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>This parameter permits you to override the text to insert between
+page references in a formatted index entry. Typically
+that would be a comma and a space.
+</para>
+
+<para>Because this text may be locale dependent,
+this parameter's value is normally taken from a gentext
+template named 'number-separator' in the
+context 'index' in the stylesheet
+locale file for the language
+of the current document.
+This parameter can be used to override the gentext string,
+and would typically be used on the command line.
+This parameter would apply to all languages.
+</para>
+
+<para>So this text string can be customized in two ways.
+You can reset the default gentext string using
+the <parameter>local.l10n.xml</parameter> parameter, or you can
+override the gentext with the content of this parameter.
+The content can be a simple string, or it can be
+something more complex such as a call-template.
+</para>
+
+<para>In HTML index output, section title references are used instead of
+page number references. This punctuation appears between
+such section titles in an HTML index.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="index.range.separator">
+<refmeta>
+<refentrytitle>index.range.separator</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>index.range.separator</refname>
+<refpurpose>Override for punctuation separating the two numbers
+in a page range in index</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="index.range.separator.frag">
+&lt;xsl:param name="index.range.separator"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>This parameter permits you
+to override the text to insert between
+the two numbers of a page range in an index.
+This parameter is only used by those XSL-FO processors
+that support an extension for generating such page ranges
+(such as XEP).</para>
+
+<para>Because this text may be locale dependent,
+this parameter's value is normally taken from a gentext
+template named 'range-separator' in the
+context 'index' in the stylesheet
+locale file for the language
+of the current document.
+This parameter can be used to override the gentext string,
+and would typically be used on the command line.
+This parameter would apply to all languages.
+</para>
+
+<para>So this text string can be customized in two ways.
+You can reset the default gentext string using
+the <parameter>local.l10n.xml</parameter> parameter, or you can
+override the gentext with the content of this parameter.
+The content can be a simple string, or it can be
+something more complex such as a call-template.
+</para>
+
+<para>In HTML index output, section title references are used instead of
+page number references. So there are no page ranges
+and this parameter has no effect.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="index.term.separator">
+<refmeta>
+<refentrytitle>index.term.separator</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>index.term.separator</refname>
+<refpurpose>Override for punctuation separating an index term
+from its list of page references in an index</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="index.term.separator.frag">
+&lt;xsl:param name="index.term.separator"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>This parameter permits you to override
+the text to insert between
+the end of an index term and its list of page references.
+Typically that might be a comma and a space.
+</para>
+
+<para>Because this text may be locale dependent,
+this parameter's value is normally taken from a gentext
+template named 'term-separator' in the
+context 'index' in the stylesheet
+locale file for the language
+of the current document.
+This parameter can be used to override the gentext string,
+and would typically be used on the command line.
+This parameter would apply to all languages.
+</para>
+
+<para>So this text string can be customized in two ways.
+You can reset the default gentext string using
+the <parameter>local.l10n.xml</parameter> parameter, or you can
+fill in the content for this normally empty
+override parameter.
+The content can be a simple string, or it can be
+something more complex such as a call-template.
+For fo output, it could be an <tag>fo:leader</tag>
+element to provide space of a specific length, or a dot leader.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="xep.index.item.properties">
+<refmeta>
+<refentrytitle>xep.index.item.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>xep.index.item.properties</refname>
+<refpurpose>Properties associated with XEP index-items</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="xep.index.item.properties.frag">
+&lt;xsl:attribute-set name="xep.index.item.properties" use-attribute-sets="index.page.number.properties"&gt;
+ &lt;xsl:attribute name="merge-subsequent-page-numbers"&gt;true&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="link-back"&gt;true&lt;/xsl:attribute&gt;
+&lt;/xsl:attribute-set&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Properties associated with XEP index-items, which generate
+page numbers in an index processed by XEP. For more info see
+the XEP documentation section "Indexes" in
+<uri xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.renderx.com/reference.html#Indexes">http://www.renderx.com/reference.html#Indexes</uri>.</para>
+
+<para>This attribute-set also adds by default any properties from the
+<tag class="attribute">index.page.number.properties</tag>
+attribute-set.</para>
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="toc.section.depth">
+<refmeta>
+<refentrytitle>toc.section.depth</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">integer</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>toc.section.depth</refname>
+<refpurpose>How deep should recursive <tag>section</tag>s appear
+in the TOC?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="toc.section.depth.frag">&lt;xsl:param name="toc.section.depth"&gt;2&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies the depth to which recursive sections should appear in the
+TOC.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="toc.max.depth">
+<refmeta>
+<refentrytitle>toc.max.depth</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">integer</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>toc.max.depth</refname>
+<refpurpose>How many levels should be created for each TOC?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="toc.max.depth.frag">&lt;xsl:param name="toc.max.depth"&gt;8&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies the maximal depth of TOC on all levels.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="toc.indent.width">
+<refmeta>
+<refentrytitle>toc.indent.width</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">float</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>toc.indent.width</refname>
+<refpurpose>Amount of indentation for TOC entries</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="toc.indent.width.frag">
+&lt;xsl:param name="toc.indent.width"&gt;24&lt;/xsl:param&gt;
+&lt;!-- inconsistant point specification? --&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies, in points, the distance by which each level of the
+TOC is indented from its parent.</para>
+
+<para>This value is expressed in points, without
+a unit (in other words, it is a bare number). Using a bare number allows the stylesheet
+to perform calculations that would otherwise have to be performed by the FO processor
+because not all processors support expressions.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="toc.line.properties">
+<refmeta>
+<refentrytitle>toc.line.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>toc.line.properties</refname>
+<refpurpose>Properties for lines in ToCs and LoTs</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="toc.line.properties.frag">
+&lt;xsl:attribute-set name="toc.line.properties"&gt;
+ &lt;xsl:attribute name="text-align-last"&gt;justify&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="text-align"&gt;start&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="end-indent"&gt;&lt;xsl:value-of select="concat($toc.indent.width, 'pt')"&gt;&lt;/xsl:value-of&gt;&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="last-line-end-indent"&gt;&lt;xsl:value-of select="concat('-', $toc.indent.width, 'pt')"&gt;&lt;/xsl:value-of&gt;&lt;/xsl:attribute&gt;
+&lt;/xsl:attribute-set&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Properties which are applied to every line in ToC (or LoT). You can
+modify them in order to change appearance of all, or some lines. For
+example, in order to make lines for chapters bold, specify the
+following in your customization layer:</para>
+
+<programlisting>&lt;xsl:attribute-set name="toc.line.properties"&gt;
+ &lt;xsl:attribute name="font-weight"&gt;
+ &lt;xsl:choose&gt;
+ &lt;xsl:when test="self::chapter"&gt;bold&lt;/xsl:when&gt;
+ &lt;xsl:otherwise&gt;normal&lt;/xsl:otherwise&gt;
+ &lt;/xsl:choose&gt;
+ &lt;/xsl:attribute&gt;
+&lt;/xsl:attribute-set&gt;</programlisting>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="toc.margin.properties">
+<refmeta>
+<refentrytitle>toc.margin.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>toc.margin.properties</refname>
+<refpurpose>Margin properties used on Tables of Contents</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="toc.margin.properties.frag">
+&lt;xsl:attribute-set name="toc.margin.properties"&gt;
+ &lt;xsl:attribute name="space-before.minimum"&gt;0.5em&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="space-before.optimum"&gt;1em&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="space-before.maximum"&gt;2em&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="space-after.minimum"&gt;0.5em&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="space-after.optimum"&gt;1em&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="space-after.maximum"&gt;2em&lt;/xsl:attribute&gt;
+&lt;/xsl:attribute-set&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+<para>This attribute set is used on Tables of Contents. These attributes are set
+on the wrapper that surrounds the ToC block, not on each individual lines.</para>
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="bridgehead.in.toc">
+<refmeta>
+<refentrytitle>bridgehead.in.toc</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>bridgehead.in.toc</refname>
+<refpurpose>Should bridgehead elements appear in the TOC?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="bridgehead.in.toc.frag">&lt;xsl:param name="bridgehead.in.toc" select="0"&gt;&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, <tag>bridgehead</tag>s appear in the TOC. Note that
+this option is not fully supported and may be removed in a future
+version of the stylesheets.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="simplesect.in.toc">
+<refmeta>
+<refentrytitle>simplesect.in.toc</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>simplesect.in.toc</refname>
+<refpurpose>Should <tag>simplesect</tag> elements appear in the TOC?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="simplesect.in.toc.frag">&lt;xsl:param name="simplesect.in.toc" select="0"&gt;&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, <tag>simplesect</tag>s will be included in the TOC.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="generate.section.toc.level">
+<refmeta>
+<refentrytitle>generate.section.toc.level</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">integer</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>generate.section.toc.level</refname>
+<refpurpose>Control depth of TOC generation in sections</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="generate.section.toc.level.frag">
+&lt;xsl:param name="generate.section.toc.level" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The <parameter>generate.section.toc.level</parameter> parameter
+controls the depth of <tag>section</tag> in which TOCs will be generated. Note
+that this is related to, but not the same as
+<parameter>toc.section.depth</parameter>, which controls the depth to
+which TOC entries will be generated in a given TOC.</para>
+<para>If, for example, <parameter>generate.section.toc.level</parameter>
+is <literal>3</literal>, TOCs will be generated in first, second, and third
+level sections, but not in fourth level sections.
+</para>
+
+</refsection>
+</refentry>
+
+
+
+
+</reference>
+<reference xml:id="fo_ext"><title>Processor Extensions</title>
+<refentry version="5.0" xml:id="arbortext.extensions">
+<refmeta>
+<refentrytitle>arbortext.extensions</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>arbortext.extensions</refname>
+<refpurpose>Enable Arbortext extensions?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="arbortext.extensions.frag">&lt;xsl:param name="arbortext.extensions" select="0"&gt;&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero,
+<link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.arbortext.com/">Arbortext</link>
+extensions will be used.
+</para>
+<para>This parameter can also affect which graphics file formats
+are supported</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="axf.extensions">
+<refmeta>
+<refentrytitle>axf.extensions</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>axf.extensions</refname>
+<refpurpose>Enable XSL Formatter extensions?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="axf.extensions.frag">
+&lt;xsl:param name="axf.extensions" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero,
+<link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.antennahouse.com/">XSL Formatter</link>
+extensions will be used. XSL Formatter extensions consists of PDF bookmarks,
+document information and better index processing.</para>
+
+<para>This parameter can also affect which graphics file formats
+are supported</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="fop.extensions">
+<refmeta>
+<refentrytitle>fop.extensions</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>fop.extensions</refname>
+<refpurpose>Enable extensions for FOP version 0.20.5 and earlier</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="fop.extensions.frag">&lt;xsl:param name="fop.extensions" select="0"&gt;&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, extensions intended for
+<link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://xml.apache.org/fop/">FOP</link>
+version 0.20.5 and earlier will be used.
+At present, this consists of PDF bookmarks.
+</para>
+
+<para>This parameter can also affect which graphics file formats
+are supported.</para>
+
+<para>If you are using a version of FOP beyond
+version 0.20.5, then use the <parameter>fop1.extensions</parameter> parameter
+instead.
+</para>
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="fop1.extensions">
+<refmeta>
+<refentrytitle>fop1.extensions</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>fop1.extensions</refname>
+<refpurpose>Enable extensions for FOP version 0.90 and later</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="fop1.extensions.frag">&lt;xsl:param name="fop1.extensions" select="0"&gt;&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, extensions for
+<link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://xml.apache.org/fop/">FOP</link>
+version 0.90 and later will be used.
+</para>
+
+<para>This parameter can also affect which graphics file formats
+are supported.</para>
+
+<para>The original <parameter>fop.extensions</parameter> parameter
+should still be used for FOP version 0.20.5 and earlier.
+</para>
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="passivetex.extensions">
+<refmeta>
+<refentrytitle>passivetex.extensions</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>passivetex.extensions</refname>
+<refpurpose>Enable PassiveTeX extensions?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="passivetex.extensions.frag">&lt;xsl:param name="passivetex.extensions" select="0"&gt;&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero,
+<link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.tei-c.org.uk/Software/passivetex/">PassiveTeX</link>
+extensions will be used. At present, this consists of PDF bookmarks
+and sorted index terms.
+</para>
+
+<para>This parameter can also affect which graphics file formats
+are supported</para>
+
+<note>
+ <para>PassiveTeX is incomplete and development has ceased. In most cases,
+another XSL-FO engine is probably a better choice.</para>
+</note>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="tex.math.in.alt">
+<refmeta>
+<refentrytitle>tex.math.in.alt</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">list</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">plain</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">latex</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>tex.math.in.alt</refname>
+<refpurpose>TeX notation used for equations</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="tex.math.in.alt.frag">
+&lt;xsl:param name="tex.math.in.alt"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If you want type math directly in TeX notation in equations,
+this parameter specifies notation used. Currently are supported two
+values -- <literal>plain</literal> and <literal>latex</literal>. Empty
+value means that you are not using TeX math at all.</para>
+
+<para>Preferred way for including TeX alternative of math is inside of
+<tag>textobject</tag> element. Eg.:</para>
+
+<programlisting>&lt;inlineequation&gt;
+&lt;inlinemediaobject&gt;
+&lt;imageobject&gt;
+&lt;imagedata fileref="eq1.gif"/&gt;
+&lt;/imageobject&gt;
+&lt;textobject&gt;&lt;phrase&gt;E=mc squared&lt;/phrase&gt;&lt;/textobject&gt;
+&lt;textobject role="tex"&gt;&lt;phrase&gt;E=mc^2&lt;/phrase&gt;&lt;/textobject&gt;
+&lt;/inlinemediaobject&gt;
+&lt;/inlineequation&gt;</programlisting>
+
+<para>If you are using <tag>graphic</tag> element, you can
+store TeX inside <tag>alt</tag> element:</para>
+
+<programlisting>&lt;inlineequation&gt;
+&lt;alt role="tex"&gt;a^2+b^2=c^2&lt;/alt&gt;
+&lt;graphic fileref="a2b2c2.gif"/&gt;
+&lt;/inlineequation&gt;</programlisting>
+
+<para>If you want use this feature, you should process your FO with
+PassiveTeX, which only supports TeX math notation. When calling
+stylsheet, don't forget to specify also
+passivetex.extensions=1.</para>
+
+<para>If you want equations in HTML, just process generated file
+<filename>tex-math-equations.tex</filename> by TeX or LaTeX. Then run
+dvi2bitmap program on result DVI file. You will get images for
+equations in your document.</para>
+
+<warning>
+ <para>This feature is useful for print/PDF output only if you
+ use the obsolete and now unsupported PassiveTeX XSL-FO
+ engine.</para>
+</warning>
+
+</refsection>
+
+<refsection><info><title>Related Parameters</title></info>
+ <para><parameter>tex.math.delims</parameter>,
+ <parameter>passivetex.extensions</parameter>,
+ <parameter>tex.math.file</parameter></para>
+</refsection>
+
+</refentry>
+
+<refentry version="5.0" xml:id="tex.math.delims">
+<refmeta>
+<refentrytitle>tex.math.delims</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>tex.math.delims</refname>
+<refpurpose>Should equations output for processing by TeX be
+surrounded by math mode delimiters?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="tex.math.delims.frag">
+&lt;xsl:param name="tex.math.delims" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>For compatibility with DSSSL based DBTeXMath from Allin Cottrell
+you should set this parameter to 0.</para>
+
+<warning>
+ <para>This feature is useful for print/PDF output only if you
+ use the obsolete and now unsupported PassiveTeX XSL-FO
+ engine.</para>
+</warning>
+
+</refsection>
+<refsection><info><title>Related Parameters</title></info>
+ <para><parameter>tex.math.in.alt</parameter>,
+ <parameter>passivetex.extensions</parameter></para>
+</refsection>
+
+<refsection><info><title>See Also</title></info>
+ <para>You can also use the <tag class="xmlpi">dbtex delims</tag> processing
+ instruction to control whether delimiters are output.</para>
+</refsection>
+
+
+</refentry>
+
+<refentry version="5.0" xml:id="xep.extensions">
+<refmeta>
+<refentrytitle>xep.extensions</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>xep.extensions</refname>
+<refpurpose>Enable XEP extensions?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="xep.extensions.frag">&lt;xsl:param name="xep.extensions" select="0"&gt;&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero,
+<link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.renderx.com/">XEP</link>
+extensions will be used. XEP extensions consists of PDF bookmarks,
+document information and better index processing.
+</para>
+
+<para>This parameter can also affect which graphics file formats
+are supported</para>
+</refsection>
+</refentry>
+
+</reference>
+<reference xml:id="dbk_ext"><title>Stylesheet Extensions</title>
+<refentry version="5.0" xml:id="linenumbering.everyNth">
+<refmeta>
+<refentrytitle>linenumbering.everyNth</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">integer</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>linenumbering.everyNth</refname>
+<refpurpose>Indicate which lines should be numbered</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="linenumbering.everyNth.frag">
+&lt;xsl:param name="linenumbering.everyNth"&gt;5&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If line numbering is enabled, everyNth line will be
+numbered. Note that numbering is one based, not zero based.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="linenumbering.extension">
+<refmeta>
+<refentrytitle>linenumbering.extension</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>linenumbering.extension</refname>
+<refpurpose>Enable the line numbering extension</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="linenumbering.extension.frag">
+&lt;xsl:param name="linenumbering.extension" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, verbatim environments (<tag>address</tag>, <tag>literallayout</tag>,
+<tag>programlisting</tag>, <tag>screen</tag>, <tag>synopsis</tag>) that specify line numbering will
+have line numbers.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="linenumbering.separator">
+<refmeta>
+<refentrytitle>linenumbering.separator</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>linenumbering.separator</refname>
+<refpurpose>Specify a separator between line numbers and lines</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="linenumbering.separator.frag">
+&lt;xsl:param name="linenumbering.separator"&gt;&lt;xsl:text&gt; &lt;/xsl:text&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The separator is inserted between line numbers and lines in the
+verbatim environment. The default value is a single white space.
+ Note the interaction with <parameter>linenumbering.width</parameter>
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="linenumbering.width">
+<refmeta>
+<refentrytitle>linenumbering.width</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">integer</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>linenumbering.width</refname>
+<refpurpose>Indicates the width of line numbers</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="linenumbering.width.frag">
+&lt;xsl:param name="linenumbering.width"&gt;3&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If line numbering is enabled, line numbers will appear right
+justified in a field "width" characters wide.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="tablecolumns.extension">
+<refmeta>
+<refentrytitle>tablecolumns.extension</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>tablecolumns.extension</refname>
+<refpurpose>Enable the table columns extension function</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="tablecolumns.extension.frag">
+&lt;xsl:param name="tablecolumns.extension" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The table columns extension function adjusts the widths of table
+columns in the HTML result to more accurately reflect the specifications
+in the CALS table.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="textinsert.extension">
+ <refmeta>
+ <refentrytitle>textinsert.extension</refentrytitle>
+ <refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+ </refmeta>
+ <refnamediv>
+ <refname>textinsert.extension</refname>
+ <refpurpose>Enables the textinsert extension element</refpurpose>
+ </refnamediv>
+ <refsynopsisdiv>
+ <programlisting xml:id="textinsert.extension.frag">
+ &lt;xsl:param name="textinsert.extension" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+ </refsynopsisdiv>
+ <refsection><info><title>Description</title></info>
+ <para>The textinsert extension element inserts the contents of
+ a file into the result tree (as text).</para>
+ <note>
+ <para>To use the textinsert extension element, you must use
+ either Saxon or Xalan as your XSLT processor (it doesn&#8217;t
+ work with xsltproc), along with either the DocBook Saxon
+ extensions or DocBook Xalan extensions (for more
+ information about those extensions, see <link xmlns:xlink="http://www.w3.org/1999/xlink" role="tcg" xlink:href="InstallingAProcessor.html#SaxonExtensions">DocBook Saxon Extensions</link> and <link xmlns:xlink="http://www.w3.org/1999/xlink" role="tcg" xlink:href="InstallingAProcessor.html#XalanExtensions">DocBook Xalan Extensions</link>), and you must set both
+ the <parameter>use.extensions</parameter> and
+ <parameter>textinsert.extension</parameter> parameters to
+ <literal>1</literal>.</para>
+ <para>As an alternative to using the textinsert element,
+ consider using an Xinclude element with the
+ <literal>parse="text"</literal> attribute and value
+ specified, as detailed in <link xmlns:xlink="http://www.w3.org/1999/xlink" role="tcg" xlink:href="ExternalCode.html#XIncludeCode">Using XInclude for text inclusions</link>.</para>
+ </note>
+ </refsection>
+ <refsection><info><title>See Also</title></info>
+ <para>You can also use the <tag class="xmlpi">dbhtml-include&#160;href</tag> processing
+ instruction to insert external files &#8212; both files containing
+ plain text and files with markup content (including HTML
+ content).</para>
+ </refsection>
+ <refsection><info><title>More information</title></info>
+ <para>For how-to documentation on inserting contents of
+ external code files and other text files into output, see
+ <link xmlns:xlink="http://www.w3.org/1999/xlink" role="tcg" xlink:href="ExternalCode.html">External code files</link>.</para>
+ <para>For guidelines on inserting contents of
+ HTML files into output, see <link xmlns:xlink="http://www.w3.org/1999/xlink" role="tcg" xlink:href="InsertExtHtml.html">Inserting external HTML code</link>.</para>
+ </refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="textdata.default.encoding">
+<refmeta>
+<refentrytitle>textdata.default.encoding</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>textdata.default.encoding</refname>
+<refpurpose>Default encoding of external text files which are included
+using textdata element</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="textdata.default.encoding.frag">
+&lt;xsl:param name="textdata.default.encoding"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies the encoding of any external text files included using
+<tag>textdata</tag> element. This value is used only when you do
+not specify encoding by the appropriate attribute
+directly on textdata. An empty string is interpreted as the system
+default encoding.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="use.extensions">
+<refmeta>
+<refentrytitle>use.extensions</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>use.extensions</refname>
+<refpurpose>Enable extensions</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="use.extensions.frag">
+&lt;xsl:param name="use.extensions" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, extensions may be used. Each extension is
+further controlled by its own parameter. But if
+<parameter>use.extensions</parameter> is zero, no extensions will
+be used.
+</para>
+
+</refsection>
+</refentry>
+
+</reference>
+<reference xml:id="labels"><title>Automatic labelling</title>
+<refentry version="5.0" xml:id="appendix.autolabel">
+<refmeta>
+<refentrytitle>appendix.autolabel</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">list</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">0<alt>none</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">1<alt>1,2,3...</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">A<alt>A,B,C...</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">a<alt>a,b,c...</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">i<alt>i,ii,iii...</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">I<alt>I,II,III...</alt></refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>appendix.autolabel</refname>
+<refpurpose>Specifies the labeling format for Appendix titles</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="appendix.autolabel.frag">
+&lt;xsl:param name="appendix.autolabel"&gt;A&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, then appendices will be numbered using the
+parameter value as the number format if the value matches one of the
+following:
+</para>
+
+<variablelist>
+ <varlistentry>
+ <term>1 or arabic</term>
+ <listitem>
+ <para>Arabic numeration (1, 2, 3 ...).</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>A or upperalpha</term>
+ <listitem>
+ <para>Uppercase letter numeration (A, B, C ...).</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>a or loweralpha</term>
+ <listitem>
+ <para>Lowercase letter numeration (a, b, c ...).</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>I or upperroman</term>
+ <listitem>
+ <para>Uppercase roman numeration (I, II, III ...).</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>i or lowerroman</term>
+ <listitem>
+ <para>Lowercase roman letter numeration (i, ii, iii ...).</para>
+ </listitem>
+ </varlistentry>
+</variablelist>
+
+<para>Any nonzero value other than the above will generate
+the default number format (upperalpha).
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="chapter.autolabel">
+<refmeta>
+<refentrytitle>chapter.autolabel</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">list</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">0<alt>none</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">1<alt>1,2,3...</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">A<alt>A,B,C...</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">a<alt>a,b,c...</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">i<alt>i,ii,iii...</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">I<alt>I,II,III...</alt></refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>chapter.autolabel</refname>
+<refpurpose>Specifies the labeling format for Chapter titles</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="chapter.autolabel.frag">
+&lt;xsl:param name="chapter.autolabel" select="1"&gt;&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, then chapters will be numbered using the parameter
+value as the number format if the value matches one of the following:
+</para>
+
+<variablelist>
+ <varlistentry>
+ <term>1 or arabic</term>
+ <listitem>
+ <para>Arabic numeration (1, 2, 3 ...).</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>A or upperalpha</term>
+ <listitem>
+ <para>Uppercase letter numeration (A, B, C ...).</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>a or loweralpha</term>
+ <listitem>
+ <para>Lowercase letter numeration (a, b, c ...).</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>I or upperroman</term>
+ <listitem>
+ <para>Uppercase roman numeration (I, II, III ...).</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>i or lowerroman</term>
+ <listitem>
+ <para>Lowercase roman letter numeration (i, ii, iii ...).</para>
+ </listitem>
+ </varlistentry>
+</variablelist>
+
+<para>Any nonzero value other than the above will generate
+the default number format (arabic).
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="part.autolabel">
+<refmeta>
+<refentrytitle>part.autolabel</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">list</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">0<alt>none</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">1<alt>1,2,3...</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">A<alt>A,B,C...</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">a<alt>a,b,c...</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">i<alt>i,ii,iii...</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">I<alt>I,II,III...</alt></refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>part.autolabel</refname>
+<refpurpose>Specifies the labeling format for Part titles</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="part.autolabel.frag">
+&lt;xsl:param name="part.autolabel"&gt;I&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, then parts will be numbered using the parameter
+value as the number format if the value matches one of the following:
+</para>
+
+<variablelist>
+ <varlistentry>
+ <term>1 or arabic</term>
+ <listitem>
+ <para>Arabic numeration (1, 2, 3 ...).</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>A or upperalpha</term>
+ <listitem>
+ <para>Uppercase letter numeration (A, B, C ...).</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>a or loweralpha</term>
+ <listitem>
+ <para>Lowercase letter numeration (a, b, c ...).</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>I or upperroman</term>
+ <listitem>
+ <para>Uppercase roman numeration (I, II, III ...).</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>i or lowerroman</term>
+ <listitem>
+ <para>Lowercase roman letter numeration (i, ii, iii ...).</para>
+ </listitem>
+ </varlistentry>
+</variablelist>
+
+<para>Any nonzero value other than the above will generate
+the default number format (upperroman).
+</para>
+
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="reference.autolabel">
+<refmeta>
+<refentrytitle>reference.autolabel</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">list</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">0<alt>none</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">1<alt>1,2,3...</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">A<alt>A,B,C...</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">a<alt>a,b,c...</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">i<alt>i,ii,iii...</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">I<alt>I,II,III...</alt></refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>reference.autolabel</refname>
+<refpurpose>Specifies the labeling format for Reference titles</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+<programlisting xml:id="reference.autolabel.frag">
+ &lt;xsl:param name="reference.autolabel"&gt;I&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+<para>If non-zero, references will be numbered using the parameter
+ value as the number format if the value matches one of the
+ following:
+</para>
+<variablelist>
+ <varlistentry>
+ <term>1 or arabic</term>
+ <listitem>
+ <para>Arabic numeration (1, 2, 3 ...).</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>A or upperalpha</term>
+ <listitem>
+ <para>Uppercase letter numeration (A, B, C ...).</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>a or loweralpha</term>
+ <listitem>
+ <para>Lowercase letter numeration (a, b, c ...).</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>I or upperroman</term>
+ <listitem>
+ <para>Uppercase roman numeration (I, II, III ...).</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>i or lowerroman</term>
+ <listitem>
+ <para>Lowercase roman letter numeration (i, ii, iii ...).</para>
+ </listitem>
+ </varlistentry>
+</variablelist>
+<para>Any non-zero value other than the above will generate
+the default number format (upperroman).
+</para>
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="preface.autolabel">
+<refmeta>
+<refentrytitle>preface.autolabel</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">list</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">0<alt>none</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">1<alt>1,2,3...</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">A<alt>A,B,C...</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">a<alt>a,b,c...</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">i<alt>i,ii,iii...</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">I<alt>I,II,III...</alt></refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>preface.autolabel</refname>
+<refpurpose>Specifices the labeling format for Preface titles</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="preface.autolabel.frag">&lt;xsl:param name="preface.autolabel" select="0"&gt;&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero then prefaces will be numbered using the parameter
+value as the number format if the value matches one of the following:
+</para>
+
+<variablelist>
+ <varlistentry>
+ <term>1 or arabic</term>
+ <listitem>
+ <para>Arabic numeration (1, 2, 3 ...).</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>A or upperalpha</term>
+ <listitem>
+ <para>Uppercase letter numeration (A, B, C ...).</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>a or loweralpha</term>
+ <listitem>
+ <para>Lowercase letter numeration (a, b, c ...).</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>I or upperroman</term>
+ <listitem>
+ <para>Uppercase roman numeration (I, II, III ...).</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>i or lowerroman</term>
+ <listitem>
+ <para>Lowercase roman letter numeration (i, ii, iii ...).</para>
+ </listitem>
+ </varlistentry>
+</variablelist>
+
+<para>Any nonzero value other than the above will generate
+the default number format (arabic).
+</para>
+
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="section.autolabel">
+<refmeta>
+<refentrytitle>section.autolabel</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>section.autolabel</refname>
+<refpurpose>Are sections enumerated?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="section.autolabel.frag">&lt;xsl:param name="section.autolabel" select="0"&gt;&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If true (non-zero), unlabeled sections will be enumerated.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="section.autolabel.max.depth">
+<refmeta>
+<refentrytitle>section.autolabel.max.depth</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">integer</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>section.autolabel.max.depth</refname>
+<refpurpose>The deepest level of sections that are numbered.</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="section.autolabel.max.depth.frag">
+&lt;xsl:param name="section.autolabel.max.depth"&gt;8&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>When section numbering is turned on by the
+<parameter>section.autolabel</parameter> parameter, then this
+parameter controls the depth of <tag>section</tag> nesting that is
+numbered. Sections nested to a level deeper than this value will not
+be numbered.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="section.label.includes.component.label">
+<refmeta>
+<refentrytitle>section.label.includes.component.label</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>section.label.includes.component.label</refname>
+<refpurpose>Do section labels include the component label?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="section.label.includes.component.label.frag">&lt;xsl:param name="section.label.includes.component.label" select="0"&gt;&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, section labels are prefixed with the label of the
+component that contains them.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="label.from.part">
+<refmeta>
+<refentrytitle>label.from.part</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>label.from.part</refname>
+<refpurpose>Renumber components in each part?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="label.from.part.frag">
+&lt;xsl:param name="label.from.part" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If <parameter>label.from.part</parameter> is non-zero, then
+ numbering of components &#8212; <tag>preface</tag>,
+ <tag>chapter</tag>, <tag>appendix</tag>, and
+ <tag>reference</tag> (when <tag>reference</tag> occurs at the
+ component level) &#8212; is re-started within each
+ <tag>part</tag>.</para>
+<para>If <parameter>label.from.part</parameter> is zero (the
+ default), numbering of components is <emphasis>not</emphasis>
+ re-started within each <tag>part</tag>; instead, components are
+ numbered sequentially throughout each <tag>book</tag>,
+ regardless of whether or not they occur within <tag>part</tag>
+ instances.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="component.label.includes.part.label">
+<refmeta>
+<refentrytitle>component.label.includes.part.label</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>component.label.includes.part.label</refname>
+<refpurpose>Do component labels include the part label?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="component.label.includes.part.label.frag">&lt;xsl:param name="component.label.includes.part.label" select="0"&gt;&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, number labels for <tag>chapter</tag>,
+<tag>appendix</tag>, and other component elements are prefixed with
+the label of the part element that contains them. So you might see
+Chapter II.3 instead of Chapter 3. Also, the labels for formal
+elements such as <tag>table</tag> and <tag>figure</tag> will include
+the part label. If there is no part element container, then no prefix
+is generated.
+</para>
+<para>
+This feature is most useful when the
+<parameter>label.from.part</parameter> parameter is turned on.
+In that case, there would be more than one <tag>chapter</tag>
+<quote>1</quote>, and the extra part label prefix will identify
+each chapter unambiguously.
+</para>
+
+</refsection>
+</refentry>
+
+</reference>
+<reference xml:id="xslt"><title>XSLT Processing</title>
+<refentry version="5.0" xml:id="rootid">
+<refmeta>
+<refentrytitle>rootid</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>rootid</refname>
+<refpurpose>Specify the root element to format</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="rootid.frag">
+&lt;xsl:param name="rootid"&gt;&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If <parameter>rootid</parameter> is not empty, it must be the
+value of an ID that occurs in the document being formatted. The entire
+document will be loaded and parsed, but formatting will begin at the
+element identified, rather than at the root. For example, this allows
+you to process only <tag>chapter</tag> 4 of a <tag>book</tag>.</para>
+<para>Because the entire document is available to the processor, automatic
+numbering, cross references, and other dependencies are correctly
+resolved.</para>
+
+</refsection>
+</refentry>
+
+</reference>
+<reference xml:id="meta"><title>Meta/*Info</title>
+<refentry version="5.0" xml:id="make.single.year.ranges">
+<refmeta>
+<refentrytitle>make.single.year.ranges</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>make.single.year.ranges</refname>
+<refpurpose>Print single-year ranges (e.g., 1998-1999)</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="make.single.year.ranges.frag">
+&lt;xsl:param name="make.single.year.ranges" select="0"&gt;&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, year ranges that span a single year will be printed
+in range notation (1998-1999) instead of discrete notation
+(1998, 1999).</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="make.year.ranges">
+<refmeta>
+<refentrytitle>make.year.ranges</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>make.year.ranges</refname>
+<refpurpose>Collate copyright years into ranges?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="make.year.ranges.frag">&lt;xsl:param name="make.year.ranges" select="0"&gt;&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, multiple copyright <tag>year</tag> elements will be
+collated into ranges.
+This works only if each year number is put into a separate
+year element. The copyright element permits multiple
+year elements. If a year element contains a dash or
+a comma, then that year element will not be merged into
+any range.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="author.othername.in.middle">
+<refmeta>
+<refentrytitle>author.othername.in.middle</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>author.othername.in.middle</refname>
+<refpurpose>Is <tag>othername</tag> in <tag>author</tag> a
+middle name?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="author.othername.in.middle.frag">
+&lt;xsl:param name="author.othername.in.middle" select="1"&gt;&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, the <tag>othername</tag> of an <tag>author</tag>
+appears between the <tag>firstname</tag> and
+<tag>surname</tag>. Otherwise, <tag>othername</tag>
+is suppressed.
+</para>
+
+</refsection>
+</refentry>
+
+</reference>
+<reference xml:id="refentry"><title>Reference Pages</title>
+<refentry version="5.0" xml:id="funcsynopsis.decoration">
+<refmeta>
+<refentrytitle>funcsynopsis.decoration</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>funcsynopsis.decoration</refname>
+<refpurpose>Decorate elements of a <tag>funcsynopsis</tag>?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="funcsynopsis.decoration.frag">
+&lt;xsl:param name="funcsynopsis.decoration" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, elements of the <tag>funcsynopsis</tag> will be
+decorated (e.g. rendered as bold or italic text). The decoration is controlled by
+templates that can be redefined in a customization layer.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="funcsynopsis.style">
+<refmeta>
+<refentrytitle>funcsynopsis.style</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">list</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">ansi</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">kr</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>funcsynopsis.style</refname>
+<refpurpose>What style of <tag>funcsynopsis</tag> should be generated?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="funcsynopsis.style.frag">&lt;xsl:param name="funcsynopsis.style"&gt;kr&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If <parameter>funcsynopsis.style</parameter> is <literal>ansi</literal>,
+ANSI-style function synopses are generated for a
+<tag>funcsynopsis</tag>, otherwise K&amp;R-style
+function synopses are generated.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="function.parens">
+<refmeta>
+<refentrytitle>function.parens</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>function.parens</refname>
+<refpurpose>Generate parens after a function?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="function.parens.frag">
+&lt;xsl:param name="function.parens" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, the formatting of a <tag>function</tag> element
+will include generated parentheses.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="refentry.generate.name">
+<refmeta>
+<refentrytitle>refentry.generate.name</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>refentry.generate.name</refname>
+<refpurpose>Output NAME header before <tag>refname</tag>s?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="refentry.generate.name.frag">
+&lt;xsl:param name="refentry.generate.name" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, a "NAME" section title is output before the list
+of <tag>refname</tag>s. This parameter and
+<parameter>refentry.generate.title</parameter> are mutually
+exclusive. This means that if you change this parameter to zero, you
+should set <parameter>refentry.generate.title</parameter> to non-zero unless
+you want get quite strange output.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="refentry.generate.title">
+<refmeta>
+<refentrytitle>refentry.generate.title</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>refentry.generate.title</refname>
+<refpurpose>Output title before <tag>refname</tag>s?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="refentry.generate.title.frag">
+&lt;xsl:param name="refentry.generate.title" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, the reference page title or first name is
+output before the list of <tag>refname</tag>s. This parameter and
+<parameter>refentry.generate.name</parameter> are mutually exclusive.
+This means that if you change this parameter to non-zero, you
+should set <parameter>refentry.generate.name</parameter> to zero unless
+you want get quite strange output.</para>
+
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="refentry.pagebreak">
+<refmeta>
+<refentrytitle>refentry.pagebreak</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>refentry.pagebreak</refname>
+<refpurpose>Start each refentry on a new page</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="refentry.pagebreak.frag">&lt;xsl:param name="refentry.pagebreak" select="1"&gt;&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero (the default), each <tag>refentry</tag>
+element will start on a new page. If zero, a page
+break will not be generated between <tag>refentry</tag> elements.
+The exception is when the <tag>refentry</tag> elements are children of
+a <tag>part</tag> element, in which case the page breaks are always
+retained. That is because a <tag>part</tag> element does not generate
+a page-sequence for its children, so each <tag>refentry</tag> must
+start its own page-sequence.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="refentry.title.properties">
+<refmeta>
+<refentrytitle>refentry.title.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>refentry.title.properties</refname>
+<refpurpose>Title properties for a refentry title</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="refentry.title.properties.frag">
+&lt;xsl:attribute-set name="refentry.title.properties"&gt;
+ &lt;xsl:attribute name="font-family"&gt;
+ &lt;xsl:value-of select="$title.font.family"&gt;&lt;/xsl:value-of&gt;
+ &lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="font-size"&gt;18pt&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="font-weight"&gt;bold&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="space-after"&gt;1em&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="hyphenate"&gt;false&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="keep-with-next.within-column"&gt;always&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="space-before.minimum"&gt;0.8em&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="space-before.optimum"&gt;1.0em&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="space-before.maximum"&gt;1.2em&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="space-after.optimum"&gt;0.5em&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="space-after.minimum"&gt;0.4em&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="space-after.maximum"&gt;0.6em&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="start-indent"&gt;&lt;xsl:value-of select="$title.margin.left"&gt;&lt;/xsl:value-of&gt;&lt;/xsl:attribute&gt;
+&lt;/xsl:attribute-set&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Formatting properties applied to the title generated for the
+<tag>refnamediv</tag> part of output for
+<tag>refentry</tag> when the value of the
+<parameter>refentry.generate.title</parameter> parameter is
+non-zero. The font size is supplied by the appropriate <parameter>section.level<replaceable>X</replaceable>.title.properties</parameter>
+attribute-set, computed from the location of the
+<tag>refentry</tag> in the section hierarchy.</para>
+
+<note>
+ <para>This parameter has no effect on the the title generated for
+ the <tag>refnamediv</tag> part of output for
+ <tag>refentry</tag> when the value of the
+ <parameter>refentry.generate.name</parameter> parameter is
+ non-zero. By default, that title is formatted with the same
+ properties as the titles for all other first-level children of
+ <tag>refentry</tag>.</para>
+</note>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="refentry.xref.manvolnum">
+<refmeta>
+<refentrytitle>refentry.xref.manvolnum</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>refentry.xref.manvolnum</refname>
+<refpurpose>Output <tag>manvolnum</tag> as part of
+<tag>refentry</tag> cross-reference?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="refentry.xref.manvolnum.frag">
+&lt;xsl:param name="refentry.xref.manvolnum" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>if non-zero, the <tag>manvolnum</tag> is used when cross-referencing
+<tag>refentry</tag>s, either with <tag>xref</tag>
+or <tag>citerefentry</tag>.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="refclass.suppress">
+<refmeta>
+<refentrytitle>refclass.suppress</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>refclass.suppress</refname>
+<refpurpose>Suppress display of refclass contents?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="refclass.suppress.frag">
+&lt;xsl:param name="refclass.suppress" select="0"&gt;&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If the value of <parameter>refclass.suppress</parameter> is
+non-zero, then display of <tag>refclass</tag> contents is
+suppressed in output.</para>
+
+</refsection>
+</refentry>
+
+</reference>
+<reference xml:id="tables"><title>Tables</title>
+<refentry version="5.0" xml:id="default.table.width">
+<refmeta>
+<refentrytitle>default.table.width</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">length</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>default.table.width</refname>
+<refpurpose>The default width of tables</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+<programlisting xml:id="default.table.width.frag">
+&lt;xsl:param name="default.table.width"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+<para>If non-zero, this value will be used for the
+<literal>width</literal> attribute on <tag>table</tag>s that do not specify an
+alternate width (with the <tag class="xmlpi">dbhtml table-width</tag> or
+<tag class="xmlpi">dbfo table-width</tag> processing instruction).</para>
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="nominal.table.width">
+<refmeta>
+<refentrytitle>nominal.table.width</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">length</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>nominal.table.width</refname>
+<refpurpose>The (absolute) nominal width of tables</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="nominal.table.width.frag">
+&lt;xsl:param name="nominal.table.width"&gt;6in&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>In order to convert CALS column widths into HTML column widths, it
+is sometimes necessary to have an absolute table width to use for conversion
+of mixed absolute and relative widths. This value must be an absolute
+length (not a percentage).</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="default.table.frame">
+<refmeta>
+<refentrytitle>default.table.frame</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>default.table.frame</refname>
+<refpurpose>The default framing of tables</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="default.table.frame.frag">
+&lt;xsl:param name="default.table.frame"&gt;all&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>This value will be used when there is no frame attribute on the
+table. </para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="default.table.rules">
+<refmeta>
+<refentrytitle>default.table.rules</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>default.table.rules</refname>
+<refpurpose>The default column and row rules for tables using HTML markup</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="default.table.rules.frag">
+&lt;xsl:param name="default.table.rules"&gt;none&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Tables using HTML markup elements can use an attribute
+named <tag class="attribute">rules</tag> on the <tag>table</tag> or
+<tag>informaltable</tag> element
+to specify whether column and row border rules should be
+displayed. This parameter lets you specify a global default
+style for all HTML tables that don't otherwise have
+that attribute.</para>
+<para>These are the supported values:</para>
+
+<variablelist>
+<varlistentry><term>all</term>
+<listitem>
+<para>Rules will appear between all rows and columns.</para>
+</listitem>
+</varlistentry>
+
+<varlistentry><term>rows</term>
+<listitem>
+<para>Rules will appear between rows only.</para>
+</listitem>
+</varlistentry>
+
+<varlistentry><term>cols</term>
+<listitem>
+<para>Rules will appear between columns only.</para>
+</listitem>
+</varlistentry>
+
+<varlistentry><term>groups</term>
+<listitem>
+<para>Rules will appear between row groups (thead, tfoot, tbody).
+No support for rules between column groups yet.
+</para>
+</listitem>
+</varlistentry>
+
+<varlistentry><term>none</term>
+<listitem>
+<para>No rules. This is the default value.
+</para>
+</listitem>
+</varlistentry>
+
+</variablelist>
+
+<para>The border after the last row and the border after
+the last column are not affected by
+this setting. Those borders are controlled by
+the <tag class="attribute">frame</tag> attribute on the table element.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="table.cell.padding">
+<refmeta>
+<refentrytitle>table.cell.padding</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>table.cell.padding</refname>
+<refpurpose>Specifies the padding of table cells</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="table.cell.padding.frag">
+&lt;xsl:attribute-set name="table.cell.padding"&gt;
+ &lt;xsl:attribute name="padding-start"&gt;2pt&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="padding-end"&gt;2pt&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="padding-top"&gt;2pt&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="padding-bottom"&gt;2pt&lt;/xsl:attribute&gt;
+&lt;/xsl:attribute-set&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies the padding of table cells.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="table.frame.border.thickness">
+<refmeta>
+<refentrytitle>table.frame.border.thickness</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">length</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>table.frame.border.thickness</refname>
+<refpurpose>Specifies the thickness of the frame border</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="table.frame.border.thickness.frag">
+&lt;xsl:param name="table.frame.border.thickness"&gt;0.5pt&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies the thickness of the border on the table's frame.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="table.frame.border.style">
+<refmeta>
+<refentrytitle>table.frame.border.style</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">list</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">none</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">solid</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">dotted</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">dashed</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">double</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">groove</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">ridge</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">inset</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">outset</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">solid</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>table.frame.border.style</refname>
+<refpurpose>Specifies the border style of table frames</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="table.frame.border.style.frag">
+&lt;xsl:param name="table.frame.border.style"&gt;solid&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies the border style of table frames.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="table.frame.border.color">
+<refmeta>
+<refentrytitle>table.frame.border.color</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">color</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>table.frame.border.color</refname>
+<refpurpose>Specifies the border color of table frames</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="table.frame.border.color.frag">
+
+&lt;xsl:param name="table.frame.border.color"&gt;black&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies the border color of table frames.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="table.cell.border.thickness">
+<refmeta>
+<refentrytitle>table.cell.border.thickness</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">length</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>table.cell.border.thickness</refname>
+<refpurpose>Specifies the thickness of table cell borders</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="table.cell.border.thickness.frag">
+&lt;xsl:param name="table.cell.border.thickness"&gt;0.5pt&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, specifies the thickness of borders on table
+cells. The units are points. See <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.w3.org/TR/CSS21/box.html#border-width-properties">
+CSS</link></para>
+
+<note>
+ <para>To control properties of cell borders in HTML output, you must also turn on the
+ <parameter>table.borders.with.css</parameter> parameter.</para>
+</note>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="table.cell.border.style">
+<refmeta>
+<refentrytitle>table.cell.border.style</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">list</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">none</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">solid</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">dotted</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">dashed</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">double</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">groove</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">ridge</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">inset</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">outset</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">solid</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>table.cell.border.style</refname>
+<refpurpose>Specifies the border style of table cells</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="table.cell.border.style.frag">
+&lt;xsl:param name="table.cell.border.style"&gt;solid&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies the border style of table cells.</para>
+
+<note>
+ <para>To control properties of cell borders in HTML output, you must also turn on the
+ <parameter>table.borders.with.css</parameter> parameter.</para>
+</note>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="table.cell.border.color">
+<refmeta>
+<refentrytitle>table.cell.border.color</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">color</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>table.cell.border.color</refname>
+<refpurpose>Specifies the border color of table cells</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="table.cell.border.color.frag">
+
+&lt;xsl:param name="table.cell.border.color"&gt;black&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Set the color of table cell borders. If non-zero, the value is used
+for the border coloration. See <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.w3.org/TR/CSS21/syndata.html#value-def-color">CSS</link>. A
+<literal>color</literal> is either a keyword or a numerical RGB specification.
+Keywords are aqua, black, blue, fuchsia, gray, green, lime, maroon,
+navy, olive, orange, purple, red, silver, teal, white, and
+yellow.</para>
+
+<note>
+ <para>To control properties of cell borders in HTML output, you must also turn on the
+ <parameter>table.borders.with.css</parameter> parameter.</para>
+</note>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="table.table.properties">
+<refmeta>
+<refentrytitle>table.table.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>table.table.properties</refname>
+<refpurpose>Properties associated with a table</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="table.table.properties.frag">
+&lt;xsl:attribute-set name="table.table.properties"&gt;
+ &lt;xsl:attribute name="border-before-width.conditionality"&gt;retain&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="border-collapse"&gt;collapse&lt;/xsl:attribute&gt;
+&lt;/xsl:attribute-set&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The styling for tables. This parameter should really
+have been called <literal>table.properties</literal>, but that parameter
+name was inadvertently established for the block-level properties
+of the table as a whole.
+</para>
+
+<para>See also <parameter>table.properties</parameter>.</para>
+
+</refsection>
+</refentry>
+
+</reference>
+<reference xml:id="links"><title>Linking</title>
+<refentry version="5.0" xml:id="current.docid">
+<refmeta>
+<refentrytitle>current.docid</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>current.docid</refname>
+<refpurpose>targetdoc identifier for the document being
+processed</refpurpose>
+</refnamediv>
+<refsynopsisdiv> <programlisting xml:id="current.docid.frag">
+&lt;xsl:param name="current.docid"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+
+<para>When olinks between documents are resolved for HTML output, the stylesheet can compute the relative path between the current document and the target document. The stylesheet needs to know the <literal>targetdoc</literal> identifiers for both documents, as they appear in the <parameter>target.database.document</parameter> database file. This parameter passes to the stylesheet
+the targetdoc identifier of the current document, since that
+identifier does not appear in the document itself. </para>
+<para>This parameter can also be used for print output. If an olink's <literal>targetdoc</literal> id differs from the <literal>current.docid</literal>, then the stylesheet can append the target document's title to the generated olink text. That identifies to the reader that the link is to a different document, not the current document. See also <parameter>olink.doctitle</parameter> to enable that feature.</para>
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="collect.xref.targets">
+<refmeta>
+<refentrytitle>collect.xref.targets</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">list</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">no</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">yes</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">only</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>collect.xref.targets</refname>
+<refpurpose>Controls whether cross reference data is
+collected</refpurpose>
+</refnamediv>
+<refsynopsisdiv> <programlisting xml:id="collect.xref.targets.frag">
+&lt;xsl:param name="collect.xref.targets"&gt;no&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+
+<para>
+In order to resolve olinks efficiently, the stylesheets can
+generate an external data file containing information about
+all potential cross reference endpoints in a document.
+This parameter determines whether the collection process is run when the document is processed by the stylesheet. The default value is <literal>no</literal>, which means the data file is not generated during processing. The other choices are <literal>yes</literal>, which means the data file is created and the document is processed for output, and <literal>only</literal>, which means the data file is created but the document is not processed for output.
+See also <parameter>targets.filename</parameter>.
+</para>
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="insert.olink.page.number">
+<refmeta>
+<refentrytitle>insert.olink.page.number</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">list</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">no</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">yes</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">maybe</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>insert.olink.page.number</refname>
+<refpurpose>Turns page numbers in olinks on and off</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="insert.olink.page.number.frag">
+&lt;xsl:param name="insert.olink.page.number"&gt;no&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The value of this parameter determines if
+cross references made between documents with
+<tag>olink</tag> will
+include page number citations.
+In most cases this is only applicable to references in printed output.
+</para>
+<para>The parameter has three possible values.
+</para>
+<variablelist>
+<varlistentry>
+<term>no</term>
+<listitem><para>No page number references will be generated for olinks.
+</para></listitem>
+</varlistentry>
+<varlistentry>
+<term>yes</term>
+<listitem><para>Page number references will be generated
+for all <tag>olink</tag> references.
+The style of page reference may be changed
+if an <tag class="attribute">xrefstyle</tag>
+attribute is used.
+</para></listitem>
+</varlistentry>
+<varlistentry>
+<term>maybe</term>
+<listitem><para>Page number references will not be generated
+for an <tag>olink</tag> element unless
+it has an
+<tag class="attribute">xrefstyle</tag>
+attribute whose value specifies a page reference.
+</para></listitem>
+</varlistentry>
+</variablelist>
+<para>Olinks that point to targets within the same document
+are treated as <tag>xref</tag>s, and controlled by
+the <parameter>insert.xref.page.number</parameter> parameter.
+</para>
+
+<para>Page number references for olinks to
+external documents can only be inserted if the
+information exists in the olink database.
+This means each olink target element
+(<tag>div</tag> or <tag>obj</tag>)
+must have a <tag class="attribute">page</tag> attribute
+whose value is its page number in the target document.
+The XSL stylesheets are not able to extract that information
+during processing because pages have not yet been created in
+XSLT transformation. Only the XSL-FO processor knows what
+page each element is placed on.
+Therefore some postprocessing must take place to populate
+page numbers in the olink database.
+</para>
+
+
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="insert.olink.pdf.frag">
+<refmeta>
+<refentrytitle>insert.olink.pdf.frag</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>insert.olink.pdf.frag</refname>
+<refpurpose>Add fragment identifiers for links into PDF files</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="insert.olink.pdf.frag.frag">
+&lt;xsl:param name="insert.olink.pdf.frag" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The value of this parameter determines whether
+the cross reference URIs to PDF documents made with
+<tag>olink</tag> will
+include fragment identifiers.
+</para>
+
+<para>When forming a URI to link to a PDF document,
+a fragment identifier (typically a '#' followed by an
+id value) appended to the PDF filename can be used by
+the PDF viewer to open
+the PDF file to a location within the document instead of
+the first page.
+However, not all PDF files have id
+values embedded in them, and not all PDF viewers can
+handle fragment identifiers.
+</para>
+
+<para>If <parameter>insert.olink.pdf.frag</parameter> is set
+to a non-zero value, then any olink targeting a
+PDF file will have the fragment identifier appended to the URI.
+The URI is formed by concatenating the value of the
+<parameter>olink.base.uri</parameter> parameter, the
+value of the <tag class="attribute">baseuri</tag>
+attribute from the <tag class="element">document</tag>
+element in the olink database with the matching
+<tag class="attribute">targetdoc</tag> value,
+and the value of the <tag class="attribute">href</tag>
+attribute for the targeted element in the olink database.
+The <tag class="attribute">href</tag> attribute
+contains the fragment identifier.
+</para>
+
+<para>If <parameter>insert.olink.pdf.frag</parameter> is set
+to zero (the default value), then
+the <tag class="attribute">href</tag> attribute
+from the olink database
+is not appended to PDF olinks, so the fragment identifier is left off.
+A PDF olink is any olink for which the
+<tag class="attribute">baseuri</tag> attribute
+from the matching <tag class="element">document</tag>
+element in the olink database ends with '.pdf'.
+Any other olinks will still have the fragment identifier added.
+</para>
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="olink.base.uri">
+<refmeta>
+<refentrytitle>olink.base.uri</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">uri</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>olink.base.uri</refname>
+<refpurpose>Base URI used in olink hrefs</refpurpose>
+</refnamediv>
+<refsynopsisdiv> <programlisting xml:id="olink.base.uri.frag">
+&lt;xsl:param name="olink.base.uri"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+
+<para>When cross reference data is collected for resolving olinks, it
+may be necessary to prepend a base URI to each target's href. This
+parameter lets you set that base URI when cross reference data is
+collected. This feature is needed when you want to link to a document
+that is processed without chunking. The output filename for such a
+document is not known to the XSL stylesheet; the only target
+information consists of fragment identifiers such as
+<literal>#idref</literal>. To enable the resolution of olinks between
+documents, you should pass the name of the HTML output file as the
+value of this parameter. Then the hrefs recorded in the cross
+reference data collection look like
+<literal>outfile.html#idref</literal>, which can be reached as links
+from other documents.</para>
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="olink.debug">
+<refmeta>
+<refentrytitle>olink.debug</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>olink.debug</refname>
+<refpurpose>Turn on debugging messages for olinks</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="olink.debug.frag">
+&lt;xsl:param name="olink.debug" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, then each olink will generate several
+messages about how it is being resolved during processing.
+This is useful when an olink does not resolve properly
+and the standard error messages are not sufficient to
+find the problem.
+</para>
+
+<para>You may need to read through the olink XSL templates
+to understand the context for some of the debug messages.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="olink.doctitle">
+<refmeta>
+<refentrytitle>olink.doctitle</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">list</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">no</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">yes</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">maybe</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>olink.doctitle</refname>
+<refpurpose>show the document title for external olinks?</refpurpose>
+
+</refnamediv>
+<refsynopsisdiv> <programlisting xml:id="olink.doctitle.frag">
+&lt;xsl:param name="olink.doctitle"&gt;no&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+
+<para>When olinks between documents are resolved, the generated text
+may not make it clear that the reference is to another document.
+It is possible for the stylesheets to append the other document's
+title to external olinks. For this to happen, two parameters must
+be set.</para>
+<itemizedlist>
+<listitem>
+<para>This <parameter>olink.doctitle</parameter> parameter
+should be set to either <literal>yes</literal> or <literal>maybe</literal>
+to enable this feature.
+</para>
+</listitem>
+<listitem>
+<para>And you should also set the <parameter>current.docid</parameter>
+parameter to the document id for the document currently
+being processed for output.
+</para>
+</listitem>
+</itemizedlist>
+
+<para>
+Then if an olink's <literal>targetdoc</literal> id differs from
+the <literal>current.docid</literal> value, the stylesheet knows
+that it is a reference to another document and can
+append the target document's
+title to the generated olink text. </para>
+
+<para>The text for the target document's title is copied from the
+olink database from the <tag>ttl</tag> element
+of the top-level <tag>div</tag> for that document.
+If that <tag>ttl</tag> element is missing or empty,
+no title is output.
+</para>
+
+<para>The supported values for <parameter>olink.doctitle</parameter> are:
+</para>
+<variablelist>
+<varlistentry>
+<term><literal>yes</literal></term>
+<listitem>
+<para>
+Always insert the title to the target document if it is not
+the current document.
+</para>
+</listitem>
+</varlistentry>
+<varlistentry>
+<term><literal>no</literal></term>
+<listitem>
+<para>
+Never insert the title to the target document, even if requested
+in an <tag class="attribute">xrefstyle</tag> attribute.
+</para>
+</listitem>
+</varlistentry>
+<varlistentry>
+<term><literal>maybe</literal></term>
+<listitem>
+<para>
+Only insert the title to the target document, if requested
+in an <tag class="attribute">xrefstyle</tag> attribute.
+</para>
+</listitem>
+</varlistentry>
+</variablelist>
+<para>An <tag class="attribute">xrefstyle</tag> attribute
+may override the global setting for individual olinks.
+The following values are supported in an
+<tag class="attribute">xrefstyle</tag>
+attribute using the <literal>select:</literal> syntax:
+</para>
+
+<variablelist>
+<varlistentry>
+<term><literal>docname</literal></term>
+<listitem>
+<para>
+Insert the target document name for this olink using the
+<literal>docname</literal> gentext template, but only
+if the value of <parameter>olink.doctitle</parameter>
+is not <literal>no</literal>.
+</para>
+</listitem>
+</varlistentry>
+<varlistentry>
+<term><literal>docnamelong</literal></term>
+<listitem>
+<para>
+Insert the target document name for this olink using the
+<literal>docnamelong</literal> gentext template, but only
+if the value of <parameter>olink.doctitle</parameter>
+is not <literal>no</literal>.
+</para>
+</listitem>
+</varlistentry>
+<varlistentry>
+<term><literal>nodocname</literal></term>
+<listitem>
+<para>
+Omit the target document name even if
+the value of <parameter>olink.doctitle</parameter>
+is <literal>yes</literal>.
+</para>
+</listitem>
+</varlistentry>
+</variablelist>
+<para>Another way of inserting the target document name
+for a single olink is to employ an
+<tag class="attribute">xrefstyle</tag>
+attribute using the <literal>template:</literal> syntax.
+The <literal>%o</literal> placeholder (the letter o, not zero)
+in such a template
+will be filled in with the target document's title when it is processed.
+This will occur regardless of
+the value of <parameter>olink.doctitle</parameter>.
+</para>
+<para>Note that prior to version 1.66 of the XSL stylesheets,
+the allowed values for this parameter were 0 and 1. Those
+values are still supported and mapped to 'no' and 'yes', respectively.
+</para>
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="olink.lang.fallback.sequence">
+<refmeta>
+<refentrytitle>olink.lang.fallback.sequence</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>olink.lang.fallback.sequence</refname>
+<refpurpose>look up translated documents if olink not found?</refpurpose>
+
+</refnamediv>
+<refsynopsisdiv> <programlisting xml:id="olink.lang.fallback.sequence.frag">
+&lt;xsl:param name="olink.lang.fallback.sequence"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+
+
+<para>This parameter defines a list of lang values
+to search among to resolve olinks.
+</para>
+
+<para>Normally an olink tries to resolve to a document in the same
+language as the olink itself. The language of an olink
+is determined by its nearest ancestor element with a
+<tag class="attribute">lang</tag> attribute, otherwise the
+value of the <parameter>l10n.gentext.default.lang</parameter>
+parameter.
+</para>
+
+<para>An olink database can contain target data for the same
+document in multiple languages. Each set of data has the
+same value for the <tag>targetdoc</tag> attribute in
+the <tag>document</tag> element in the database, but with a
+different <tag>lang</tag> attribute value.
+</para>
+
+<para>When an olink is being resolved, the target is first
+sought in the document with the same language as the olink.
+If no match is found there, then this parameter is consulted
+for additional languages to try.</para>
+
+<para>The <parameter>olink.lang.fallback.sequence</parameter>
+must be a whitespace separated list of lang values to
+try. The first one with a match in the olink database is used.
+The default value is empty.</para>
+
+<para>For example, a document might be written in German
+and contain an olink with
+<literal>targetdoc="adminguide"</literal>.
+When the document is processed, the processor
+first looks for a target dataset in the
+olink database starting with:</para>
+
+<literallayout><literal>&lt;document targetdoc="adminguide" lang="de"&gt;</literal>.
+</literallayout>
+
+<para>If there is no such element, then the
+<parameter>olink.lang.fallback.sequence</parameter>
+parameter is consulted.
+If its value is, for example, <quote>fr en</quote>, then the processor next
+looks for <literal>targetdoc="adminguide" lang="fr"</literal>, and
+then for <literal>targetdoc="adminguide" lang="en"</literal>.
+If there is still no match, it looks for
+<literal>targetdoc="adminguide"</literal> with no
+lang attribute.
+</para>
+
+<para>This parameter is useful when a set of documents is only
+partially translated, or is in the process of being translated.
+If a target of an olink has not yet been translated, then this
+parameter permits the processor to look for the document in
+other languages. This assumes the reader would rather have
+a link to a document in a different language than to have
+a broken link.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="olink.properties">
+<refmeta>
+<refentrytitle>olink.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>olink.properties</refname>
+<refpurpose>Properties associated with the cross-reference
+text of an olink.</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="olink.properties.frag">
+&lt;xsl:attribute-set name="olink.properties"&gt;
+ &lt;xsl:attribute name="show-destination"&gt;replace&lt;/xsl:attribute&gt;
+&lt;/xsl:attribute-set&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>This <literal>attribute set</literal> is applied to the
+<literal>fo:basic-link</literal> element of an olink. It is not applied to the
+optional page number or optional title of the external
+document.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="prefer.internal.olink">
+<refmeta>
+<refentrytitle>prefer.internal.olink</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>prefer.internal.olink</refname>
+<refpurpose>Prefer a local olink reference to an external reference</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="prefer.internal.olink.frag">
+&lt;xsl:param name="prefer.internal.olink" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If you are re-using XML content modules in multiple documents,
+you may want to redirect some of your olinks. This parameter
+permits you to redirect an olink to the current document.
+</para>
+
+<para>For example: you are writing documentation for a product,
+which includes 3 manuals: a little installation
+booklet (booklet.xml), a user
+guide (user.xml), and a reference manual (reference.xml).
+All 3 documents begin with the same introduction section (intro.xml) that
+contains a reference to the customization section (custom.xml) which is
+included in both user.xml and reference.xml documents.
+</para>
+
+<para>How do you write the link to custom.xml in intro.xml
+so that it is interpreted correctly in all 3 documents?</para>
+<itemizedlist>
+<listitem><para>If you use xref, it will fail in user.xml.</para>
+</listitem>
+<listitem><para>If you use olink (pointing to reference.xml),
+the reference in user.xml
+will point to the customization section of the reference manual, while it is
+actually available in user.xml.</para>
+</listitem>
+</itemizedlist>
+
+<para>If you set the <parameter>prefer.internal.olink</parameter>
+parameter to a non-zero value, then the processor will
+first look in the olink database
+for the olink's <tag>targetptr</tag> attribute value
+in document matching the <parameter>current.docid</parameter>
+parameter value. If it isn't found there, then
+it tries the document in the database
+with the <tag>targetdoc</tag>
+value that matches the olink's <tag>targetdoc</tag>
+attribute.
+</para>
+
+<para>This feature permits an olink reference to resolve to
+the current document if there is an element
+with an id matching the olink's <tag>targetptr</tag>
+value. The current document's olink data must be
+included in the target database for this to work.</para>
+
+<caution>
+<para>There is a potential for incorrect links if
+the same <tag>id</tag> attribute value is used for different
+content in different documents.
+Some of your olinks may be redirected to the current document
+when they shouldn't be. It is not possible to control
+individual olink instances.</para>
+</caution>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="target.database.document">
+<refmeta>
+<refentrytitle>target.database.document</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">uri</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>target.database.document</refname>
+<refpurpose>Name of master database file for resolving
+olinks</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+<programlisting xml:id="target.database.document.frag">
+ &lt;xsl:param name="target.database.document"&gt;olinkdb.xml&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+
+<para>
+To resolve olinks between documents, the stylesheets use a master
+database document that identifies the target datafiles for all the
+documents within the scope of the olinks. This parameter value is the
+URI of the master document to be read during processing to resolve
+olinks. The default value is <filename>olinkdb.xml</filename>.</para>
+
+<para>The data structure of the file is defined in the
+<filename>targetdatabase.dtd</filename> DTD. The database file
+provides the high level elements to record the identifiers, locations,
+and relationships of documents. The cross reference data for
+individual documents is generally pulled into the database using
+system entity references or XIncludes. See also
+<parameter>targets.filename</parameter>. </para> </refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="targets.filename">
+<refmeta>
+<refentrytitle>targets.filename</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>targets.filename</refname>
+<refpurpose>Name of cross reference targets data file</refpurpose>
+</refnamediv>
+<refsynopsisdiv> <programlisting xml:id="targets.filename.frag">
+&lt;xsl:param name="targets.filename"&gt;target.db&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+
+<para>
+In order to resolve olinks efficiently, the stylesheets can
+generate an external data file containing information about
+all potential cross reference endpoints in a document.
+This parameter lets you change the name of the generated
+file from the default name <filename>target.db</filename>.
+The name must agree with that used in the target database
+used to resolve olinks during processing.
+See also <parameter>target.database.document</parameter>.
+</para>
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="use.local.olink.style">
+<refmeta>
+<refentrytitle>use.local.olink.style</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>use.local.olink.style</refname>
+<refpurpose>Process olinks using xref style of current
+document</refpurpose>
+</refnamediv>
+<refsynopsisdiv> <programlisting xml:id="use.local.olink.style.frag">
+&lt;xsl:param name="use.local.olink.style" select="0"&gt;&lt;/xsl:param&gt; </programlisting>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+
+<para>When cross reference data is collected for use by olinks, the data for each potential target includes one field containing a completely assembled cross reference string, as if it were an xref generated in that document. Other fields record the separate title, number, and element name of each target. When an olink is formed to a target from another document, the olink resolves to that preassembled string by default. If the <parameter>use.local.olink.style</parameter> parameter is set to non-zero, then instead the cross
+reference string is formed again from the target title, number, and
+element name, using the stylesheet processing the targeting document.
+Then olinks will match the xref style in the targeting document
+rather than in the target document. If both documents are processed
+with the same stylesheet, then the results will be the same.</para>
+</refsection>
+</refentry>
+
+</reference>
+<reference xml:id="xrefs"><title>Cross References</title>
+<refentry version="5.0" xml:id="insert.xref.page.number">
+<refmeta>
+<refentrytitle>insert.xref.page.number</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">list</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">no</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">yes</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">maybe</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>insert.xref.page.number</refname>
+<refpurpose>Turns page numbers in xrefs on and off</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="insert.xref.page.number.frag">
+&lt;xsl:param name="insert.xref.page.number"&gt;no&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The value of this parameter determines if
+cross references (<tag>xref</tag>s) in
+printed output will
+include page number citations.
+It has three possible values.
+</para>
+<variablelist>
+<varlistentry>
+<term>no</term>
+<listitem><para>No page number references will be generated.
+</para></listitem>
+</varlistentry>
+<varlistentry>
+<term>yes</term>
+<listitem><para>Page number references will be generated
+for all <tag>xref</tag> elements.
+The style of page reference may be changed
+if an <tag class="attribute">xrefstyle</tag>
+attribute is used.
+</para></listitem>
+</varlistentry>
+<varlistentry>
+<term>maybe</term>
+<listitem><para>Page number references will not be generated
+for an <tag>xref</tag> element unless
+it has an
+<tag class="attribute">xrefstyle</tag>
+attribute whose value specifies a page reference.
+</para></listitem>
+</varlistentry>
+</variablelist>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="xref.properties">
+<refmeta>
+<refentrytitle>xref.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>xref.properties</refname>
+<refpurpose>Properties associated with cross-reference text</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="xref.properties.frag">
+&lt;xsl:attribute-set name="xref.properties"&gt;
+&lt;/xsl:attribute-set&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>This attribute set is used to set properties
+on cross reference text.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="xref.label-title.separator">
+<refmeta>
+<refentrytitle>xref.label-title.separator</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>xref.label-title.separator</refname>
+<refpurpose>Punctuation or space separating label from title in xref</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="xref.label-title.separator.frag">&lt;xsl:param name="xref.label-title.separator"&gt;: &lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>
+This parameter allows you to control the punctuation of certain
+types of generated cross reference text.
+When cross reference text is generated for an
+<tag class="element">xref</tag> or
+<tag class="element">olink</tag> element
+using an <tag class="attribute">xrefstyle</tag> attribute
+that makes use of the <literal>select:</literal> feature,
+and the selected components include both label and title,
+then the value of this parameter is inserted between
+label and title in the output.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="xref.label-page.separator">
+<refmeta>
+<refentrytitle>xref.label-page.separator</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>xref.label-page.separator</refname>
+<refpurpose>Punctuation or space separating label from page number in xref</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="xref.label-page.separator.frag">&lt;xsl:param name="xref.label-page.separator"&gt;&lt;xsl:text&gt; &lt;/xsl:text&gt;&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>
+This parameter allows you to control the punctuation of certain
+types of generated cross reference text.
+When cross reference text is generated for an
+<tag class="element">xref</tag> or
+<tag class="element">olink</tag> element
+using an <tag class="attribute">xrefstyle</tag> attribute
+that makes use of the <literal>select:</literal> feature,
+and the selected components include both label and page
+but no title,
+then the value of this parameter is inserted between
+label and page number in the output.
+If a title is included, then other separators are used.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="xref.title-page.separator">
+<refmeta>
+<refentrytitle>xref.title-page.separator</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>xref.title-page.separator</refname>
+<refpurpose>Punctuation or space separating title from page number in xref</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="xref.title-page.separator.frag">&lt;xsl:param name="xref.title-page.separator"&gt;&lt;xsl:text&gt; &lt;/xsl:text&gt;&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>
+This parameter allows you to control the punctuation of certain
+types of generated cross reference text.
+When cross reference text is generated for an
+<tag class="element">xref</tag> or
+<tag class="element">olink</tag> element
+using an <tag class="attribute">xrefstyle</tag> attribute
+that makes use of the <literal>select:</literal> feature,
+and the selected components include both title and page number,
+then the value of this parameter is inserted between
+title and page number in the output.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="insert.link.page.number">
+<refmeta>
+<refentrytitle>insert.link.page.number</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">list</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">no</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">yes</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">maybe</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>insert.link.page.number</refname>
+<refpurpose>Turns page numbers in link elements on and off</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="insert.link.page.number.frag">
+&lt;xsl:param name="insert.link.page.number"&gt;no&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The value of this parameter determines if
+cross references using the <tag>link</tag> element in
+printed output will
+include standard page number citations.
+It has three possible values.
+</para>
+<variablelist>
+<varlistentry>
+<term>no</term>
+<listitem><para>No page number references will be generated.
+</para></listitem>
+</varlistentry>
+<varlistentry>
+<term>yes</term>
+<listitem><para>Page number references will be generated
+for all <tag>link</tag> elements.
+The style of page reference may be changed
+if an <tag class="attribute">xrefstyle</tag>
+attribute is used.
+</para></listitem>
+</varlistentry>
+<varlistentry>
+<term>maybe</term>
+<listitem><para>Page number references will not be generated
+for a <tag>link</tag> element unless
+it has an
+<tag class="attribute">xrefstyle</tag>
+attribute whose value specifies a page reference.
+</para></listitem>
+</varlistentry>
+</variablelist>
+
+<para>Although the <tag>xrefstyle</tag> attribute
+can be used to turn the page reference on or off, it cannot be
+used to control the formatting of the page number as it
+can in <tag>xref</tag>.
+In <tag>link</tag> it will always format with
+the style established by the
+gentext template with <literal>name="page.citation"</literal>
+in the <literal>l:context name="xref"</literal>.
+</para>
+</refsection>
+</refentry>
+
+</reference>
+<reference xml:id="lists"><title>Lists</title>
+<refentry version="5.0" xml:id="compact.list.item.spacing">
+<refmeta>
+<refentrytitle>compact.list.item.spacing</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>compact.list.item.spacing</refname>
+<refpurpose>What space do you want between list items (when spacing="compact")?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="compact.list.item.spacing.frag">&lt;xsl:attribute-set name="compact.list.item.spacing"&gt;
+ &lt;xsl:attribute name="space-before.optimum"&gt;0em&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="space-before.minimum"&gt;0em&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="space-before.maximum"&gt;0.2em&lt;/xsl:attribute&gt;
+&lt;/xsl:attribute-set&gt;</programlisting>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+<para>Specify what spacing you want between each list item when
+<tag class="attribute">spacing</tag> is
+<quote><literal>compact</literal></quote>.</para>
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="itemizedlist.properties">
+<refmeta>
+<refentrytitle>itemizedlist.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>itemizedlist.properties</refname>
+<refpurpose>Properties that apply to each list-block generated by itemizedlist.</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="itemizedlist.properties.frag">&lt;xsl:attribute-set name="itemizedlist.properties" use-attribute-sets="list.block.properties"&gt;
+&lt;/xsl:attribute-set&gt;</programlisting>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+<para>Properties that apply to each fo:list-block generated by itemizedlist.</para>
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="itemizedlist.label.properties">
+<refmeta>
+<refentrytitle>itemizedlist.label.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>itemizedlist.label.properties</refname>
+<refpurpose>Properties that apply to each label inside itemized list.</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="itemizedlist.label.properties.frag">&lt;xsl:attribute-set name="itemizedlist.label.properties"&gt;
+&lt;/xsl:attribute-set&gt;</programlisting>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+<para>Properties that apply to each label inside itemized list. E.g.:</para>
+<programlisting>&lt;xsl:attribute-set name="itemizedlist.label.properties"&gt;
+ &lt;xsl:attribute name="text-align"&gt;right&lt;/xsl:attribute&gt;
+&lt;/xsl:attribute-set&gt;</programlisting>
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="itemizedlist.label.width">
+<refmeta>
+<refentrytitle>itemizedlist.label.width</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">length</refmiscinfo>
+</refmeta>
+<refnamediv>
+ <refname>itemizedlist.label.width</refname>
+<refpurpose>The default width of the label (bullet) in an itemized list.</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+ <programlisting xml:id="itemizedlist.label.width.frag">
+ &lt;xsl:param name="itemizedlist.label.width"&gt;1.0em&lt;/xsl:param&gt;
+ </programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+<para>Specifies the default width of the label (usually a bullet or other
+symbol) in an itemized list. You can override the default value on any
+particular list with the &#8220;dbfo&#8221; processing instruction using the
+&#8220;label-width&#8221; pseudoattribute.</para>
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="list.block.properties">
+<refmeta>
+<refentrytitle>list.block.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>list.block.properties</refname>
+<refpurpose>Properties that apply to each list-block generated by list.</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="list.block.properties.frag">&lt;xsl:attribute-set name="list.block.properties"&gt;
+ &lt;xsl:attribute name="provisional-label-separation"&gt;0.2em&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="provisional-distance-between-starts"&gt;1.5em&lt;/xsl:attribute&gt;
+&lt;/xsl:attribute-set&gt;</programlisting>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+<para>Properties that apply to each fo:list-block generated by itemizedlist/orderedlist.</para>
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="list.block.spacing">
+<refmeta>
+<refentrytitle>list.block.spacing</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>list.block.spacing</refname>
+<refpurpose>What spacing do you want before and after lists?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="list.block.spacing.frag">&lt;xsl:attribute-set name="list.block.spacing"&gt;
+ &lt;xsl:attribute name="space-before.optimum"&gt;1em&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="space-before.minimum"&gt;0.8em&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="space-before.maximum"&gt;1.2em&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="space-after.optimum"&gt;1em&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="space-after.minimum"&gt;0.8em&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="space-after.maximum"&gt;1.2em&lt;/xsl:attribute&gt;
+&lt;/xsl:attribute-set&gt;</programlisting>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+<para>Specify the spacing required before and after a list. It is necessary to specify the space after a list block because lists can come inside of paras. </para>
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="list.item.spacing">
+<refmeta>
+<refentrytitle>list.item.spacing</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>list.item.spacing</refname>
+<refpurpose>What space do you want between list items?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="list.item.spacing.frag">&lt;xsl:attribute-set name="list.item.spacing"&gt;
+ &lt;xsl:attribute name="space-before.optimum"&gt;1em&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="space-before.minimum"&gt;0.8em&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="space-before.maximum"&gt;1.2em&lt;/xsl:attribute&gt;
+&lt;/xsl:attribute-set&gt;</programlisting>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+<para>Specify what spacing you want between each list item.</para>
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="orderedlist.properties">
+<refmeta>
+<refentrytitle>orderedlist.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>orderedlist.properties</refname>
+<refpurpose>Properties that apply to each list-block generated by orderedlist.</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="orderedlist.properties.frag">&lt;xsl:attribute-set name="orderedlist.properties" use-attribute-sets="list.block.properties"&gt;
+ &lt;xsl:attribute name="provisional-distance-between-starts"&gt;2em&lt;/xsl:attribute&gt;
+&lt;/xsl:attribute-set&gt;</programlisting>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+<para>Properties that apply to each fo:list-block generated by orderedlist.</para>
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="orderedlist.label.properties">
+<refmeta>
+<refentrytitle>orderedlist.label.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>orderedlist.label.properties</refname>
+<refpurpose>Properties that apply to each label inside ordered list.</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="orderedlist.label.properties.frag">&lt;xsl:attribute-set name="orderedlist.label.properties"&gt;
+&lt;/xsl:attribute-set&gt;</programlisting>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+<para>Properties that apply to each label inside ordered list. E.g.:</para>
+<programlisting>&lt;xsl:attribute-set name="orderedlist.label.properties"&gt;
+ &lt;xsl:attribute name="text-align"&gt;right&lt;/xsl:attribute&gt;
+&lt;/xsl:attribute-set&gt;</programlisting>
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="orderedlist.label.width">
+<refmeta>
+<refentrytitle>orderedlist.label.width</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">length</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>orderedlist.label.width</refname>
+<refpurpose>The default width of the label (number) in an ordered list.</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="orderedlist.label.width.frag">
+&lt;xsl:param name="orderedlist.label.width"&gt;1.2em&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+<para>Specifies the default width of the label (usually a number or
+sequence of numbers) in an ordered list. You can override the default
+value on any particular list with the &#8220;dbfo&#8221; processing instruction
+using the &#8220;label-width&#8221; pseudoattribute.</para>
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="variablelist.max.termlength">
+<refmeta>
+<refentrytitle>variablelist.max.termlength</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">number</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>variablelist.max.termlength</refname>
+<refpurpose>Specifies the longest term in variablelists</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="variablelist.max.termlength.frag">
+&lt;xsl:param name="variablelist.max.termlength"&gt;24&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>In variablelists, the <tag>listitem</tag>
+is indented to leave room for the
+<tag>term</tag> elements. That indent may be computed
+if it is not specified with a <tag class="attribute">termlength</tag>
+attribute on the <tag>variablelist</tag> element.
+</para>
+<para>
+The computation counts characters in the
+<tag>term</tag> elements in the list
+to find the longest term. However, some terms are very long
+and would produce extreme indents. This parameter lets you
+set a maximum character count. Any terms longer than the maximum
+would line wrap. The default value is 24.
+</para>
+<para>
+The character counts are converted to physical widths
+by multiplying by 0.50em. There will be some variability
+in how many actual characters fit in the space
+since some characters are wider than others.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="variablelist.term.separator">
+<refmeta>
+<refentrytitle>variablelist.term.separator</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>variablelist.term.separator</refname>
+<refpurpose>Text to separate <tag>term</tag>s within a multi-term
+<tag>varlistentry</tag></refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="variablelist.term.separator.frag">
+&lt;xsl:param name="variablelist.term.separator"&gt;, &lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>When a <tag>varlistentry</tag> contains multiple <tag>term</tag>
+elements, the string specified in the value of the
+<parameter>variablelist.term.separator</parameter> parameter is placed
+after each <tag>term</tag> except the last.</para>
+
+<note>
+ <para>To generate a line break between multiple <tag>term</tag>s in
+ a <tag>varlistentry</tag>, set a non-zero value for the
+ <parameter>variablelist.term.break.after</parameter> parameter. If
+ you do so, you may also want to set the value of the
+ <parameter>variablelist.term.separator</parameter> parameter to an
+ empty string (to suppress rendering of the default comma and space
+ after each <tag>term</tag>).</para>
+</note>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="variablelist.term.properties">
+<refmeta>
+<refentrytitle>variablelist.term.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>variablelist.term.properties</refname>
+<refpurpose>To add properties to the term elements in a variablelist.</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="variablelist.term.properties.frag">
+&lt;xsl:attribute-set name="variablelist.term.properties"&gt;
+&lt;/xsl:attribute-set&gt;
+</programlisting>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+<para>These properties are added to the block containing a
+term in a variablelist.
+Use this attribute-set to set
+font properties or alignment, for example.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="variablelist.term.break.after">
+<refmeta>
+<refentrytitle>variablelist.term.break.after</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>variablelist.term.break.after</refname>
+<refpurpose>Generate line break after each <tag>term</tag> within a
+multi-term <tag>varlistentry</tag>?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="variablelist.term.break.after.frag">
+&lt;xsl:param name="variablelist.term.break.after"&gt;0&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Set a non-zero value for the
+<parameter>variablelist.term.break.after</parameter> parameter to
+generate a line break between <tag>term</tag>s in a
+multi-term <tag>varlistentry</tag>.</para>
+
+<note>
+<para>If you set a non-zero value for
+<parameter>variablelist.term.break.after</parameter>, you may also
+want to set the value of the
+<parameter>variablelist.term.separator</parameter> parameter to an
+empty string (to suppress rendering of the default comma and space
+after each <tag>term</tag>).</para>
+</note>
+
+</refsection>
+</refentry>
+
+</reference>
+<reference xml:id="qa"><title>QAndASet</title>
+<refentry version="5.0" xml:id="qandadiv.autolabel">
+<refmeta>
+<refentrytitle>qandadiv.autolabel</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>qandadiv.autolabel</refname>
+<refpurpose>Are divisions in QAndASets enumerated?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="qandadiv.autolabel.frag">&lt;xsl:param name="qandadiv.autolabel" select="1"&gt;&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, unlabeled qandadivs will be enumerated.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="qanda.inherit.numeration">
+<refmeta>
+<refentrytitle>qanda.inherit.numeration</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>qanda.inherit.numeration</refname>
+<refpurpose>Does enumeration of QandASet components inherit the numeration of parent elements?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="qanda.inherit.numeration.frag">
+&lt;xsl:param name="qanda.inherit.numeration" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, numbered <tag>qandadiv</tag> elements and
+<tag>question</tag> and <tag>answer</tag> inherit the enumeration of
+the ancestors of the <tag>qandaset</tag>.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="qanda.defaultlabel">
+<refmeta>
+<refentrytitle>qanda.defaultlabel</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">list</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">number</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">qanda</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">none</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>qanda.defaultlabel</refname>
+<refpurpose>Sets the default for defaultlabel on QandASet.</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="qanda.defaultlabel.frag">
+&lt;xsl:param name="qanda.defaultlabel"&gt;number&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If no <literal>defaultlabel</literal> attribute is specified on
+a <tag>qandaset</tag>, this value is used. It is generally one of the legal
+values for the defaultlabel attribute (<literal>none</literal>,
+<literal>number</literal> or
+<literal>qanda</literal>), or one of the additional stylesheet-specific values
+(<literal>qnumber</literal> or <literal>qnumberanda</literal>).
+The default value is 'number'.
+</para>
+<para>The values are rendered as follows:</para>
+<variablelist>
+<varlistentry><term><literal>qanda</literal></term>
+<listitem>
+<para><tag>question</tag>s are labeled "Q:" and
+<tag>answer</tag>s are labeled "A:". </para>
+</listitem>
+</varlistentry>
+
+<varlistentry><term><literal>number</literal></term>
+<listitem>
+<para>The questions are enumerated and the answers
+are not labeled. </para>
+</listitem>
+</varlistentry>
+
+<varlistentry><term><literal>qnumber</literal></term>
+<listitem>
+<para>The questions are labeled "Q:" followed by a number, and answers are not
+labeled.
+When sections are numbered, adding a label
+to the number distinguishes the question numbers
+from the section numbers.
+This value is not allowed in the
+<tag class="attribute">defaultlabel</tag> attribute
+of a <tag>qandaset</tag> element.</para>
+</listitem>
+</varlistentry>
+
+<varlistentry><term><literal>qnumberanda</literal></term>
+<listitem>
+<para>The questions are labeled "Q:" followed by a number, and
+the answers are labeled "A:".
+When sections are numbered, adding a label
+to the number distinguishes the question numbers
+from the section numbers.
+This value is not allowed in the
+<tag class="attribute">defaultlabel</tag> attribute
+of a <tag>qandaset</tag> element.</para>
+</listitem>
+</varlistentry>
+
+<varlistentry><term><literal>none</literal></term>
+<listitem>
+<para>No distinguishing label precedes Questions or Answers.
+</para>
+</listitem>
+</varlistentry>
+</variablelist>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="qanda.in.toc">
+<refmeta>
+<refentrytitle>qanda.in.toc</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>qanda.in.toc</refname>
+<refpurpose>Should qandaentry questions appear in
+the document table of contents?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="qanda.in.toc.frag">&lt;xsl:param name="qanda.in.toc" select="0"&gt;&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If true (non-zero), then the generated table of contents
+for a document will include <tag>qandaset</tag> titles,
+<tag>qandadiv</tag> titles,
+and <tag>question</tag> elements. The default value (zero) excludes
+them from the TOC.
+</para>
+<para>This parameter does not affect any tables of contents
+that may be generated inside a qandaset or qandadiv.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="qanda.nested.in.toc">
+<refmeta>
+<refentrytitle>qanda.nested.in.toc</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>qanda.nested.in.toc</refname>
+<refpurpose>Should nested answer/qandaentry instances appear in TOC?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="qanda.nested.in.toc.frag">
+&lt;xsl:param name="qanda.nested.in.toc" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, instances of <tag>qandaentry</tag>
+that are children of <tag>answer</tag> elements are shown in
+the TOC.</para>
+
+</refsection>
+</refentry>
+
+</reference>
+<reference xml:id="biblio"><title>Bibliography</title>
+<refentry version="5.0" xml:id="bibliography.style">
+<refmeta>
+<refentrytitle>bibliography.style</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">list</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">normal</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">iso690</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>bibliography.style</refname>
+<refpurpose>Style used for formatting of biblioentries.</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="bibliography.style.frag">
+&lt;xsl:param name="bibliography.style"&gt;normal&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Currently only <literal>normal</literal> and
+<literal>iso690</literal> styles are supported.</para>
+
+<para>In order to use ISO690 style to the full extent you might need
+to use additional markup described on <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://wiki.docbook.org/topic/ISO690Bibliography">the
+following WiKi page</link>.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="biblioentry.item.separator">
+<refmeta>
+<refentrytitle>biblioentry.item.separator</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>biblioentry.item.separator</refname>
+<refpurpose>Text to separate bibliography entries</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="biblioentry.item.separator.frag">&lt;xsl:param name="biblioentry.item.separator"&gt;. &lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Text to separate bibliography entries
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="bibliography.collection">
+<refmeta>
+<refentrytitle>bibliography.collection</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>bibliography.collection</refname>
+<refpurpose>Name of the bibliography collection file</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="bibliography.collection.frag">
+&lt;xsl:param name="bibliography.collection"&gt;http://docbook.sourceforge.net/release/bibliography/bibliography.xml&lt;/xsl:param&gt;
+
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Maintaining bibliography entries across a set of documents is tedious, time
+consuming, and error prone. It makes much more sense, usually, to store all of
+the bibliography entries in a single place and simply <quote>extract</quote>
+the ones you need in each document.</para>
+
+<para>That's the purpose of the
+<parameter>bibliography.collection</parameter> parameter. To setup a global
+bibliography <quote>database</quote>, follow these steps:</para>
+
+<para>First, create a stand-alone bibliography document that contains all of
+the documents that you wish to reference. Make sure that each bibliography
+entry (whether you use <tag>biblioentry</tag> or <tag>bibliomixed</tag>)
+has an ID.</para>
+
+<para>My global bibliography, <filename>~/bibliography.xml</filename> begins
+like this:</para>
+
+<informalexample>
+<programlisting>&lt;!DOCTYPE bibliography
+ PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN"
+ "http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd"&gt;
+&lt;bibliography&gt;&lt;title&gt;References&lt;/title&gt;
+
+&lt;bibliomixed id="xml-rec"&gt;&lt;abbrev&gt;XML 1.0&lt;/abbrev&gt;Tim Bray,
+Jean Paoli, C. M. Sperberg-McQueen, and Eve Maler, editors.
+&lt;citetitle&gt;&lt;ulink url="http://www.w3.org/TR/REC-xml"&gt;Extensible Markup
+Language (XML) 1.0 Second Edition&lt;/ulink&gt;&lt;/citetitle&gt;.
+World Wide Web Consortium, 2000.
+&lt;/bibliomixed&gt;
+
+&lt;bibliomixed id="xml-names"&gt;&lt;abbrev&gt;Namespaces&lt;/abbrev&gt;Tim Bray,
+Dave Hollander,
+and Andrew Layman, editors.
+&lt;citetitle&gt;&lt;ulink url="http://www.w3.org/TR/REC-xml-names/"&gt;Namespaces in
+XML&lt;/ulink&gt;&lt;/citetitle&gt;.
+World Wide Web Consortium, 1999.
+&lt;/bibliomixed&gt;
+
+&lt;!-- ... --&gt;
+&lt;/bibliography&gt;
+</programlisting>
+</informalexample>
+
+<para>When you create a bibliography in your document, simply
+provide <emphasis>empty</emphasis> <tag>bibliomixed</tag>
+entries for each document that you wish to cite. Make sure that these
+elements have the same ID as the corresponding <quote>real</quote>
+entry in your global bibliography.</para>
+
+<para>For example:</para>
+
+<informalexample>
+<programlisting>&lt;bibliography&gt;&lt;title&gt;Bibliography&lt;/title&gt;
+
+&lt;bibliomixed id="xml-rec"/&gt;
+&lt;bibliomixed id="xml-names"/&gt;
+&lt;bibliomixed id="DKnuth86"&gt;Donald E. Knuth. &lt;citetitle&gt;Computers and
+Typesetting: Volume B, TeX: The Program&lt;/citetitle&gt;. Addison-Wesley,
+1986. ISBN 0-201-13437-3.
+&lt;/bibliomixed&gt;
+&lt;bibliomixed id="relaxng"/&gt;
+
+&lt;/bibliography&gt;</programlisting>
+</informalexample>
+
+<para>Note that it's perfectly acceptable to mix entries from your
+global bibliography with <quote>normal</quote> entries. You can use
+<tag>xref</tag> or other elements to cross-reference your
+bibliography entries in exactly the same way you do now.</para>
+
+<para>Finally, when you are ready to format your document, simply set the
+<parameter>bibliography.collection</parameter> parameter (in either a
+customization layer or directly through your processor's interface) to
+point to your global bibliography.</para>
+
+<para>The stylesheets will format the bibliography in your document as if
+all of the entries referenced appeared there literally.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="bibliography.numbered">
+<refmeta>
+<refentrytitle>bibliography.numbered</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>bibliography.numbered</refname>
+<refpurpose>Should bibliography entries be numbered?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="bibliography.numbered.frag">
+&lt;xsl:param name="bibliography.numbered" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero bibliography entries will be numbered</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="biblioentry.properties">
+<refmeta>
+ <refentrytitle>biblioentry.properties</refentrytitle>
+ <refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>biblioentry.properties</refname>
+<refpurpose>To set the style for biblioentry.</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="biblioentry.properties.frag">&lt;xsl:attribute-set name="biblioentry.properties" use-attribute-sets="normal.para.spacing"&gt;
+ &lt;xsl:attribute name="start-indent"&gt;0.5in&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="text-indent"&gt;-0.5in&lt;/xsl:attribute&gt;
+&lt;/xsl:attribute-set&gt;
+</programlisting>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+<para>How do you want biblioentry styled? </para>
+<para>Set the font-size, weight, space-above and space-below, indents, etc. to the style required</para>
+
+</refsection>
+</refentry>
+
+</reference>
+<reference xml:id="glossary"><title>Glossary</title>
+<refentry version="5.0" xml:id="glossterm.auto.link">
+<refmeta>
+<refentrytitle>glossterm.auto.link</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>glossterm.auto.link</refname>
+<refpurpose>Generate links from glossterm to glossentry automatically?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="glossterm.auto.link.frag">
+&lt;xsl:param name="glossterm.auto.link" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, links from inline <tag>glossterm</tag>s to the corresponding
+<tag>glossentry</tag> elements in a <tag>glossary</tag> or <tag>glosslist</tag>
+will be automatically generated. This is useful when your glossterms are consistent
+and you don't want to add links manually.</para>
+
+<para>The automatic link generation feature is not used on <tag>glossterm</tag> elements
+that have a <tag class="attribute">linkend</tag> attribute.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="firstterm.only.link">
+<refmeta>
+<refentrytitle>firstterm.only.link</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>firstterm.only.link</refname>
+<refpurpose>Does automatic glossterm linking only apply to firstterms?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="firstterm.only.link.frag">
+&lt;xsl:param name="firstterm.only.link" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, only <tag>firstterm</tag>s will be automatically linked
+to the glossary. If glossary linking is not enabled, this parameter
+has no effect.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="glossary.collection">
+<refmeta>
+<refentrytitle>glossary.collection</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>glossary.collection</refname>
+<refpurpose>Name of the glossary collection file</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="glossary.collection.frag">
+&lt;xsl:param name="glossary.collection"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Glossaries maintained independently across a set of documents
+are likely to become inconsistent unless considerable effort is
+expended to keep them in sync. It makes much more sense, usually, to
+store all of the glossary entries in a single place and simply
+<quote>extract</quote> the ones you need in each document.</para>
+
+<para>That's the purpose of the
+<parameter>glossary.collection</parameter> parameter. To setup a global
+glossary <quote>database</quote>, follow these steps:</para>
+
+<refsection><info><title>Setting Up the Glossary Database</title></info>
+
+<para>First, create a stand-alone glossary document that contains all of
+the entries that you wish to reference. Make sure that each glossary
+entry has an ID.</para>
+
+<para>Here's an example glossary:</para>
+
+<informalexample>
+<programlisting>
+&lt;?xml version="1.0" encoding="utf-8"?&gt;
+&lt;!DOCTYPE glossary
+ PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN"
+ "http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd"&gt;
+&lt;glossary&gt;
+&lt;glossaryinfo&gt;
+&lt;editor&gt;&lt;firstname&gt;Eric&lt;/firstname&gt;&lt;surname&gt;Raymond&lt;/surname&gt;&lt;/editor&gt;
+&lt;title&gt;Jargon File 4.2.3 (abridged)&lt;/title&gt;
+&lt;releaseinfo&gt;Just some test data&lt;/releaseinfo&gt;
+&lt;/glossaryinfo&gt;
+
+&lt;glossdiv&gt;&lt;title&gt;0&lt;/title&gt;
+
+&lt;glossentry&gt;
+&lt;glossterm&gt;0&lt;/glossterm&gt;
+&lt;glossdef&gt;
+&lt;para&gt;Numeric zero, as opposed to the letter `O' (the 15th letter of
+the English alphabet). In their unmodified forms they look a lot
+alike, and various kluges invented to make them visually distinct have
+compounded the confusion. If your zero is center-dotted and letter-O
+is not, or if letter-O looks almost rectangular but zero looks more
+like an American football stood on end (or the reverse), you're
+probably looking at a modern character display (though the dotted zero
+seems to have originated as an option on IBM 3270 controllers). If
+your zero is slashed but letter-O is not, you're probably looking at
+an old-style ASCII graphic set descended from the default typewheel on
+the venerable ASR-33 Teletype (Scandinavians, for whom /O is a letter,
+curse this arrangement). (Interestingly, the slashed zero long
+predates computers; Florian Cajori's monumental "A History of
+Mathematical Notations" notes that it was used in the twelfth and
+thirteenth centuries.) If letter-O has a slash across it and the zero
+does not, your display is tuned for a very old convention used at IBM
+and a few other early mainframe makers (Scandinavians curse &lt;emphasis&gt;this&lt;/emphasis&gt;
+arrangement even more, because it means two of their letters collide).
+Some Burroughs/Unisys equipment displays a zero with a &lt;emphasis&gt;reversed&lt;/emphasis&gt;
+slash. Old CDC computers rendered letter O as an unbroken oval and 0
+as an oval broken at upper right and lower left. And yet another
+convention common on early line printers left zero unornamented but
+added a tail or hook to the letter-O so that it resembled an inverted
+Q or cursive capital letter-O (this was endorsed by a draft ANSI
+standard for how to draw ASCII characters, but the final standard
+changed the distinguisher to a tick-mark in the upper-left corner).
+Are we sufficiently confused yet?&lt;/para&gt;
+&lt;/glossdef&gt;
+&lt;/glossentry&gt;
+
+&lt;glossentry&gt;
+&lt;glossterm&gt;1TBS&lt;/glossterm&gt;
+&lt;glossdef&gt;
+&lt;para role="accidence"&gt;
+&lt;phrase role="pronounce"&gt;&lt;/phrase&gt;
+&lt;phrase role="partsofspeach"&gt;n&lt;/phrase&gt;
+&lt;/para&gt;
+&lt;para&gt;The "One True Brace Style"&lt;/para&gt;
+&lt;glossseealso&gt;indent style&lt;/glossseealso&gt;
+&lt;/glossdef&gt;
+&lt;/glossentry&gt;
+
+&lt;!-- ... --&gt;
+
+&lt;/glossdiv&gt;
+
+&lt;!-- ... --&gt;
+
+&lt;/glossary&gt;</programlisting>
+</informalexample>
+
+</refsection>
+
+<refsection><info><title>Marking Up Glossary Terms</title></info>
+
+<para>That takes care of the glossary database, now you have to get the entries
+into your document. Unlike bibliography entries, which can be empty, creating
+<quote>placeholder</quote> glossary entries would be very tedious. So instead,
+support for <parameter>glossary.collection</parameter> relies on implicit linking.</para>
+
+<para>In your source document, simply use <tag>firstterm</tag> and
+<tag>glossterm</tag> to identify the terms you wish to have included
+in the glossary. The stylesheets assume that you will either set the
+<tag class="attribute">baseform</tag> attribute correctly, or that the
+content of the element exactly matches a term in your glossary.</para>
+
+<para>If you're using a <parameter>glossary.collection</parameter>, don't
+make explicit links on the terms in your document.</para>
+
+<para>So, in your document, you might write things like this:</para>
+
+<informalexample>
+<programlisting>&lt;para&gt;This is dummy text, without any real meaning.
+The point is simply to reference glossary terms like &lt;glossterm&gt;0&lt;/glossterm&gt;
+and the &lt;firstterm baseform="1TBS"&gt;One True Brace Style (1TBS)&lt;/firstterm&gt;.
+The &lt;glossterm&gt;1TBS&lt;/glossterm&gt;, as you can probably imagine, is a nearly
+religious issue.&lt;/para&gt;</programlisting>
+</informalexample>
+
+<para>If you set the <parameter>firstterm.only.link</parameter> parameter,
+only the terms marked with <tag>firstterm</tag> will be links.
+Otherwise, all the terms will be linked.</para>
+
+</refsection>
+
+<refsection><info><title>Marking Up the Glossary</title></info>
+
+<para>The glossary itself has to be identified for the stylesheets. For lack
+of a better choice, the <tag class="attribute">role</tag> is used.
+To identify the glossary as the target for automatic processing, set
+the role to <quote><literal>auto</literal></quote>. The title of this
+glossary (and any other information from the <tag>glossaryinfo</tag>
+that's rendered by your stylesheet) will be displayed, but the entries will
+come from the database.
+</para>
+
+<para>Unfortunately, the glossary can't be empty, so you must put in
+at least one <tag>glossentry</tag>. The content of this entry
+is irrelevant, it will not be rendered:</para>
+
+<informalexample>
+<programlisting>&lt;glossary role="auto"&gt;
+&lt;glossentry&gt;
+&lt;glossterm&gt;Irrelevant&lt;/glossterm&gt;
+&lt;glossdef&gt;
+&lt;para&gt;If you can see this, the document was processed incorrectly. Use
+the &lt;parameter&gt;glossary.collection&lt;/parameter&gt; parameter.&lt;/para&gt;
+&lt;/glossdef&gt;
+&lt;/glossentry&gt;
+&lt;/glossary&gt;</programlisting>
+</informalexample>
+
+<para>What about glossary divisions? If your glossary database has glossary
+divisions <emphasis>and</emphasis> your automatic glossary contains at least
+one <tag>glossdiv</tag>, the automic glossary will have divisions.
+If the <tag>glossdiv</tag> is missing from either location, no divisions
+will be rendered.</para>
+
+<para>Glossary entries (and divisions, if appropriate) in the glossary will
+occur in precisely the order they occur in your database.</para>
+
+</refsection>
+
+<refsection><info><title>Formatting the Document</title></info>
+
+<para>Finally, when you are ready to format your document, simply set the
+<parameter>glossary.collection</parameter> parameter (in either a
+customization layer or directly through your processor's interface) to
+point to your global glossary.</para>
+
+<para>The stylesheets will format the glossary in your document as if
+all of the entries implicilty referenced appeared there literally.</para>
+</refsection>
+
+<refsection><info><title>Limitations</title></info>
+
+<para>Glossary cross-references <emphasis>within the glossary</emphasis> are
+not supported. For example, this <emphasis>will not</emphasis> work:</para>
+
+<informalexample>
+<programlisting>&lt;glossentry&gt;
+&lt;glossterm&gt;gloss-1&lt;/glossterm&gt;
+&lt;glossdef&gt;&lt;para&gt;A description that references &lt;glossterm&gt;gloss-2&lt;/glossterm&gt;.&lt;/para&gt;
+&lt;glossseealso&gt;gloss-2&lt;/glossseealso&gt;
+&lt;/glossdef&gt;
+&lt;/glossentry&gt;</programlisting>
+</informalexample>
+
+<para>If you put glossary cross-references in your glossary that way,
+you'll get the cryptic error: <computeroutput>Warning:
+glossary.collection specified, but there are 0 automatic
+glossaries</computeroutput>.</para>
+
+<para>Instead, you must do two things:</para>
+
+<orderedlist>
+<listitem>
+<para>Markup your glossary using <tag>glossseealso</tag>:</para>
+
+<informalexample>
+<programlisting>&lt;glossentry&gt;
+&lt;glossterm&gt;gloss-1&lt;/glossterm&gt;
+&lt;glossdef&gt;&lt;para&gt;A description that references &lt;glossterm&gt;gloss-2&lt;/glossterm&gt;.&lt;/para&gt;
+&lt;glossseealso&gt;gloss-2&lt;/glossseealso&gt;
+&lt;/glossdef&gt;
+&lt;/glossentry&gt;</programlisting>
+</informalexample>
+</listitem>
+
+<listitem>
+<para>Make sure there is at least one <tag>glossterm</tag> reference to
+<glossterm>gloss-2</glossterm> <emphasis>in your document</emphasis>. The
+easiest way to do that is probably within a <tag>remark</tag> in your
+automatic glossary:</para>
+
+<informalexample>
+<programlisting>&lt;glossary role="auto"&gt;
+&lt;remark&gt;Make sure there's a reference to &lt;glossterm&gt;gloss-2&lt;/glossterm&gt;.&lt;/remark&gt;
+&lt;glossentry&gt;
+&lt;glossterm&gt;Irrelevant&lt;/glossterm&gt;
+&lt;glossdef&gt;
+&lt;para&gt;If you can see this, the document was processed incorrectly. Use
+the &lt;parameter&gt;glossary.collection&lt;/parameter&gt; parameter.&lt;/para&gt;
+&lt;/glossdef&gt;
+&lt;/glossentry&gt;
+&lt;/glossary&gt;</programlisting>
+</informalexample>
+</listitem>
+</orderedlist>
+</refsection>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="glossary.as.blocks">
+<refmeta>
+<refentrytitle>glossary.as.blocks</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>glossary.as.blocks</refname>
+<refpurpose>Present glossarys using blocks instead of lists?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="glossary.as.blocks.frag">
+&lt;xsl:param name="glossary.as.blocks" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, <tag>glossary</tag>s will be formatted as
+blocks.</para>
+
+<para>If you have long <tag>glossterm</tag>s, proper list
+markup in the FO case may produce unattractive lists. By setting this
+parameter, you can force the stylesheets to produce block markup
+instead of proper lists.</para>
+
+<para>You can override this setting with a processing instruction as the
+child of <tag>glossary</tag>: <tag class="xmlpi">dbfo
+glossary-presentation="blocks"</tag> or <tag class="xmlpi">dbfo
+glossary-presentation="list"</tag></para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="glosslist.as.blocks">
+<refmeta>
+<refentrytitle>glosslist.as.blocks</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>glosslist.as.blocks</refname>
+<refpurpose>Use blocks for glosslists?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="glosslist.as.blocks.frag">
+&lt;xsl:param name="glosslist.as.blocks" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>See <parameter>glossary.as.blocks</parameter>.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="glossentry.list.item.properties">
+<refmeta>
+<refentrytitle>glossentry.list.item.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>glossentry.list.item.properties</refname>
+<refpurpose>To add properties to each glossentry in a list.</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="glossentry.list.item.properties.frag">&lt;xsl:attribute-set name="glossentry.list.item.properties"&gt;
+ &lt;xsl:attribute name="space-before.optimum"&gt;1em&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="space-before.minimum"&gt;0.8em&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="space-before.maximum"&gt;1.2em&lt;/xsl:attribute&gt;
+&lt;/xsl:attribute-set&gt;
+</programlisting>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+<para>These properties are added to the fo:list-item containing a
+glossentry in a glossary when the <parameter>glossary.as.blocks</parameter> parameter
+is zero.
+Use this attribute-set to set
+spacing between entries, for example.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="glossterm.block.properties">
+<refmeta>
+<refentrytitle>glossterm.block.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>glossterm.block.properties</refname>
+<refpurpose>To add properties to the block of a glossentry's glossterm.</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="glossterm.block.properties.frag">&lt;xsl:attribute-set name="glossterm.block.properties"&gt;
+ &lt;xsl:attribute name="space-before.optimum"&gt;1em&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="space-before.minimum"&gt;0.8em&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="space-before.maximum"&gt;1.2em&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="keep-with-next.within-column"&gt;always&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="keep-together.within-column"&gt;always&lt;/xsl:attribute&gt;
+&lt;/xsl:attribute-set&gt;
+</programlisting>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+<para>These properties are added to the block containing a
+glossary term in a glossary when the <parameter>glossary.as.blocks</parameter> parameter
+is non-zero.
+Use this attribute-set to set the space above and below,
+font properties,
+and any indent for the glossary term.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="glossdef.block.properties">
+<refmeta>
+<refentrytitle>glossdef.block.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>glossdef.block.properties</refname>
+<refpurpose>To add properties to the block of a glossary definition.</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="glossdef.block.properties.frag">&lt;xsl:attribute-set name="glossdef.block.properties"&gt;
+ &lt;xsl:attribute name="margin-{$direction.align.start}"&gt;.25in&lt;/xsl:attribute&gt;
+&lt;/xsl:attribute-set&gt;
+</programlisting>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+<para>These properties are added to the block containing a
+glossary definition in a glossary when
+the <parameter>glossary.as.blocks</parameter> parameter
+is non-zero.
+Use this attribute-set to set the space above and below,
+any font properties,
+and any indent for the glossary definition.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="glossterm.list.properties">
+<refmeta>
+<refentrytitle>glossterm.list.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>glossterm.list.properties</refname>
+<refpurpose>To add properties to the glossterm in a list.</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="glossterm.list.properties.frag">
+&lt;xsl:attribute-set name="glossterm.list.properties"&gt;
+&lt;/xsl:attribute-set&gt;
+</programlisting>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+<para>These properties are added to the block containing a
+glossary term in a glossary when the <parameter>glossary.as.blocks</parameter> parameter
+is zero.
+Use this attribute-set to set
+font properties, for example.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="glossdef.list.properties">
+<refmeta>
+<refentrytitle>glossdef.list.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>glossdef.list.properties</refname>
+<refpurpose>To add properties to the glossary definition in a list.</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="glossdef.list.properties.frag">
+&lt;xsl:attribute-set name="glossdef.list.properties"&gt;
+&lt;/xsl:attribute-set&gt;
+</programlisting>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+<para>These properties are added to the block containing a
+glossary definition in a glossary when
+the <parameter>glossary.as.blocks</parameter> parameter
+is zero.
+Use this attribute-set to set font properties, for example.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="glossterm.width">
+<refmeta>
+<refentrytitle>glossterm.width</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">length</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>glossterm.width</refname>
+<refpurpose>Width of glossterm in list presentation mode</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="glossterm.width.frag">
+&lt;xsl:param name="glossterm.width"&gt;2in&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>This parameter specifies the width reserved for glossary terms when
+a list presentation is used.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="glossterm.separation">
+<refmeta>
+<refentrytitle>glossterm.separation</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">length</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>glossterm.separation</refname>
+<refpurpose>Separation between glossary terms and descriptions in list mode</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="glossterm.separation.frag">
+&lt;xsl:param name="glossterm.separation"&gt;0.25in&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies the miminum horizontal
+separation between glossary terms and descriptions when
+they are presented side-by-side using lists
+when the <parameter>glossary.as.blocks</parameter>
+is zero.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="glossentry.show.acronym">
+<refmeta>
+<refentrytitle>glossentry.show.acronym</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">list</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">no</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">yes</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">primary</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>glossentry.show.acronym</refname>
+<refpurpose>Display <tag>glossentry</tag> acronyms?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="glossentry.show.acronym.frag">
+&lt;xsl:param name="glossentry.show.acronym"&gt;no&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>A setting of <quote>yes</quote> means they should be displayed;
+<quote>no</quote> means they shouldn't. If <quote>primary</quote> is used,
+then they are shown as the primary text for the entry.</para>
+
+<note>
+<para>This setting controls both <tag>acronym</tag> and
+<tag>abbrev</tag> elements in the <tag>glossentry</tag>.</para>
+</note>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="glossary.sort">
+<refmeta>
+<refentrytitle>glossary.sort</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>glossary.sort</refname>
+<refpurpose>Sort glossentry elements?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="glossary.sort.frag">
+&lt;xsl:param name="glossary.sort" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, then the glossentry elements within a
+glossary, glossdiv, or glosslist are sorted on the glossterm, using
+the current lang setting. If zero (the default), then
+glossentry elements are not sorted and are presented
+in document order.
+</para>
+
+</refsection>
+</refentry>
+
+</reference>
+<reference xml:id="misc"><title>Miscellaneous</title>
+<refentry version="5.0" xml:id="formal.procedures">
+<refmeta>
+<refentrytitle>formal.procedures</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>formal.procedures</refname>
+<refpurpose>Selects formal or informal procedures</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="formal.procedures.frag">
+&lt;xsl:param name="formal.procedures" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Formal procedures are numbered and always have a title.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="formal.title.placement">
+<refmeta>
+<refentrytitle>formal.title.placement</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">table</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>formal.title.placement</refname>
+<refpurpose>Specifies where formal object titles should occur</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="formal.title.placement.frag">
+&lt;xsl:param name="formal.title.placement"&gt;
+figure before
+example before
+equation before
+table before
+procedure before
+task before
+&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies where formal object titles should occur. For each formal object
+type (<tag>figure</tag>,
+<tag>example</tag>,
+<tag>equation</tag>,
+<tag>table</tag>, and <tag>procedure</tag>)
+you can specify either the keyword
+<quote><literal>before</literal></quote> or
+<quote><literal>after</literal></quote>.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="runinhead.default.title.end.punct">
+<refmeta>
+<refentrytitle>runinhead.default.title.end.punct</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>runinhead.default.title.end.punct</refname>
+<refpurpose>Default punctuation character on a run-in-head</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="runinhead.default.title.end.punct.frag">&lt;xsl:param name="runinhead.default.title.end.punct"&gt;.&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, For a <tag>formalpara</tag>, use the specified
+string as the separator between the title and following text. The period is the default value.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="runinhead.title.end.punct">
+<refmeta>
+<refentrytitle>runinhead.title.end.punct</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>runinhead.title.end.punct</refname>
+<refpurpose>Characters that count as punctuation on a run-in-head</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="runinhead.title.end.punct.frag">
+&lt;xsl:param name="runinhead.title.end.punct"&gt;.!?:&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specify which characters are to be counted as punctuation. These
+characters are checked for a match with the last character of the
+title. If no match is found, the
+<parameter>runinhead.default.title.end.punct</parameter> contents are
+inserted. This is to avoid duplicated punctuation in the output.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="show.comments">
+<refmeta>
+<refentrytitle>show.comments</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>show.comments</refname>
+<refpurpose>Display <tag>remark</tag> elements?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="show.comments.frag">
+&lt;xsl:param name="show.comments" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, comments will be displayed, otherwise they
+are suppressed. Comments here refers to the <tag>remark</tag> element
+(which was called <literal>comment</literal> prior to DocBook
+4.0), not XML comments (&lt;-- like this --&gt;) which are
+unavailable.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="punct.honorific">
+<refmeta>
+<refentrytitle>punct.honorific</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>punct.honorific</refname>
+<refpurpose>Punctuation after an honorific in a personal name.</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="punct.honorific.frag">
+&lt;xsl:param name="punct.honorific"&gt;.&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>This parameter specifies the punctuation that should be added after an
+honorific in a personal name.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="segmentedlist.as.table">
+<refmeta>
+<refentrytitle>segmentedlist.as.table</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>segmentedlist.as.table</refname>
+<refpurpose>Format segmented lists as tables?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="segmentedlist.as.table.frag">
+&lt;xsl:param name="segmentedlist.as.table" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, <tag>segmentedlist</tag>s will be formatted as
+tables.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="variablelist.as.blocks">
+<refmeta>
+<refentrytitle>variablelist.as.blocks</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>variablelist.as.blocks</refname>
+<refpurpose>Format <tag>variablelist</tag>s lists as blocks?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="variablelist.as.blocks.frag">
+&lt;xsl:param name="variablelist.as.blocks" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, <tag>variablelist</tag>s will be formatted as
+blocks.</para>
+
+<para>If you have long terms, proper list markup in the FO case may produce
+unattractive lists. By setting this parameter, you can force the stylesheets
+to produce block markup instead of proper lists.</para>
+
+<para>You can override this setting with a processing instruction as the
+child of <tag>variablelist</tag>: <tag class="xmlpi">dbfo
+list-presentation="blocks"</tag> or <tag class="xmlpi">dbfo
+list-presentation="list"</tag>.</para>
+
+<para>When using <literal>list-presentation="list"</literal>,
+you can also control the amount of space used for the <tag>term</tag>s with
+the <tag class="xmlpi">dbfo term-width=".25in"</tag> processing instruction,
+the <tag class="attribute">termlength</tag> attribute on <tag>variablelist</tag>,
+or allow the stylesheets to attempt to calculate the amount of space to leave based on the
+number of letters in the longest term.
+</para>
+
+<programlisting> &lt;variablelist&gt;
+ &lt;?dbfo list-presentation="list"?&gt;
+ &lt;?dbfo term-width="1.5in"?&gt;
+ &lt;?dbhtml list-presentation="table"?&gt;
+ &lt;?dbhtml term-width="1.5in"?&gt;
+ &lt;varlistentry&gt;
+ &lt;term&gt;list&lt;/term&gt;
+ &lt;listitem&gt;
+ &lt;para&gt;
+ Formatted as a list even if variablelist.as.blocks is set to 1.
+ &lt;/para&gt;
+ &lt;/listitem&gt;
+ &lt;/varlistentry&gt;
+ &lt;/variablelist&gt;</programlisting>
+
+
+</refsection>
+
+</refentry>
+
+<refentry version="5.0" xml:id="blockquote.properties">
+<refmeta>
+ <refentrytitle>blockquote.properties</refentrytitle>
+ <refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>blockquote.properties</refname>
+<refpurpose>To set the style for block quotations.</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="blockquote.properties.frag">
+&lt;xsl:attribute-set name="blockquote.properties"&gt;
+&lt;xsl:attribute name="margin-{$direction.align.start}"&gt;0.5in&lt;/xsl:attribute&gt;
+&lt;xsl:attribute name="margin-{$direction.align.end}"&gt;0.5in&lt;/xsl:attribute&gt;
+&lt;xsl:attribute name="space-after.minimum"&gt;0.5em&lt;/xsl:attribute&gt;
+&lt;xsl:attribute name="space-after.optimum"&gt;1em&lt;/xsl:attribute&gt;
+&lt;xsl:attribute name="space-after.maximum"&gt;2em&lt;/xsl:attribute&gt;
+&lt;/xsl:attribute-set&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The <parameter>blockquote.properties</parameter> attribute set specifies
+the formating properties of block quotations.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="ulink.show">
+<refmeta>
+<refentrytitle>ulink.show</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>ulink.show</refname>
+<refpurpose>Display URLs after <tag>ulink</tag>s?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="ulink.show.frag">
+&lt;xsl:param name="ulink.show" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, the URL of each <tag>ulink</tag> will
+appear after the text of the link. If the text of the link and the URL
+are identical, the URL is suppressed. </para>
+
+<para>See also <parameter>ulink.footnotes</parameter>.</para>
+
+<note><para>DocBook 5 does not have an <tag>ulink</tag> element. When processing
+DocBoook 5 documents, <parameter>ulink.show</parameter> applies to all inline
+elements that are marked up with <tag class="attribute">xlink:href</tag> attributes
+that point to external resources.</para>
+</note>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="ulink.footnotes">
+<refmeta>
+<refentrytitle>ulink.footnotes</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>ulink.footnotes</refname>
+<refpurpose>Generate footnotes for <tag>ulink</tag>s?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="ulink.footnotes.frag">
+&lt;xsl:param name="ulink.footnotes" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, and if <parameter>ulink.show</parameter> also is non-zero,
+the URL of each <tag>ulink</tag> will appear as a footnote.</para>
+
+<note><para>DocBook 5 does not have an <tag>ulink</tag> element. When processing
+DocBoook 5 documents, <parameter>ulink.footnotes</parameter> applies to all inline
+elements that are marked up with <tag class="attribute">xlink:href</tag> attributes
+that point to external resources.</para>
+</note>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="ulink.hyphenate">
+<refmeta>
+<refentrytitle>ulink.hyphenate</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>ulink.hyphenate</refname>
+<refpurpose>Allow URLs to be automatically hyphenated</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="ulink.hyphenate.frag">
+&lt;xsl:param name="ulink.hyphenate"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If not empty, the specified character (or more generally, content) is
+added to URLs after every character included in the string
+in the <parameter>ulink.hyphenate.chars</parameter> parameter (default
+is <quote>/</quote>). If the character in this parameter is a
+Unicode soft hyphen (0x00AD) or Unicode zero-width space (0x200B), some FO
+processors will be able to reasonably hyphenate long URLs.</para>
+
+<para>As of 28 Jan 2002, discretionary hyphens are more widely and correctly
+supported than zero-width spaces for this purpose.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="ulink.hyphenate.chars">
+<refmeta>
+<refentrytitle>ulink.hyphenate.chars</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>ulink.hyphenate.chars</refname>
+<refpurpose>List of characters to allow ulink URLs to be automatically hyphenated on</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="ulink.hyphenate.chars.frag">
+&lt;xsl:param name="ulink.hyphenate.chars"&gt;/&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If the <parameter>ulink.hyphenate</parameter> is not empty, then
+hyphenation of ulinks is turned on, and any
+character contained in this parameter is treated as an allowable
+hyphenation point.</para>
+
+<para>The default value is <quote>/</quote>, but the parameter
+could be customized
+to contain other URL characters, as for example:</para>
+<programlisting>
+&lt;xsl:param name="ulink.hyphenate.chars"&gt;:/@&amp;?.#&lt;/xsl:param&gt;
+</programlisting>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="shade.verbatim">
+<refmeta>
+<refentrytitle>shade.verbatim</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>shade.verbatim</refname>
+<refpurpose>Should verbatim environments be shaded?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="shade.verbatim.frag">&lt;xsl:param name="shade.verbatim" select="0"&gt;&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>In the FO stylesheet, if this parameter is non-zero then the
+<property>shade.verbatim.style</property> properties will be applied
+to verbatim environments.</para>
+
+<para>In the HTML stylesheet, this parameter is now deprecated. Use
+CSS instead.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="shade.verbatim.style">
+<refmeta>
+<refentrytitle>shade.verbatim.style</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>shade.verbatim.style</refname>
+<refpurpose>Properties that specify the style of shaded verbatim listings</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="shade.verbatim.style.frag">
+
+&lt;xsl:attribute-set name="shade.verbatim.style"&gt;
+ &lt;xsl:attribute name="background-color"&gt;#E0E0E0&lt;/xsl:attribute&gt;
+&lt;/xsl:attribute-set&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Properties that specify the style of shaded verbatim listings. The
+parameters specified (the border and background color) are added to
+the styling of the xsl-fo output. A border might be specified as "thin
+black solid" for example. See <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.w3.org/TR/2004/WD-xsl11-20041216/#border">xsl-fo</link></para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="hyphenate.verbatim">
+<refmeta>
+<refentrytitle>hyphenate.verbatim</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>hyphenate.verbatim</refname>
+<refpurpose>Should verbatim environments be hyphenated on space characters?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="hyphenate.verbatim.frag">&lt;xsl:param name="hyphenate.verbatim" select="0"&gt;&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If the lines of program listing are too long to fit into one
+line it is quite common to split them at space and indicite by hook
+arrow that code continues on the next line. You can turn on this
+behaviour for <tag>programlisting</tag>,
+<tag>screen</tag> and <tag>synopsis</tag> elements by
+using this parameter.</para>
+
+<para>Note that you must also enable line wrapping for verbatim environments and
+select appropriate hyphenation character (e.g. hook arrow). This can
+be done using <parameter>monospace.verbatim.properties</parameter>
+attribute set:</para>
+
+<programlisting>&lt;xsl:attribute-set name="monospace.verbatim.properties"
+ use-attribute-sets="verbatim.properties monospace.properties"&gt;
+ &lt;xsl:attribute name="wrap-option"&gt;wrap&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="hyphenation-character"&gt;&amp;#x25BA;&lt;/xsl:attribute&gt;
+&lt;/xsl:attribute-set&gt;</programlisting>
+
+<para>For a list of arrows available in Unicode see <uri xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.unicode.org/charts/PDF/U2190.pdf">http://www.unicode.org/charts/PDF/U2190.pdf</uri> and <uri xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.unicode.org/charts/PDF/U2900.pdf">http://www.unicode.org/charts/PDF/U2900.pdf</uri> and make sure that
+selected character is available in the font you are using for verbatim
+environments.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="hyphenate.verbatim.characters">
+<refmeta>
+<refentrytitle>hyphenate.verbatim.characters</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>hyphenate.verbatim.characters</refname>
+<refpurpose>List of characters after which a line break can occur in listings</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="hyphenate.verbatim.characters.frag">
+&lt;xsl:param name="hyphenate.verbatim.characters"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If you enable <parameter>hyphenate.verbatim</parameter> line
+breaks are allowed only on space characters. If this is not enough for
+your document, you can specify list of additional characters after
+which line break is allowed in this parameter.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="use.svg">
+<refmeta>
+<refentrytitle>use.svg</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>use.svg</refname>
+<refpurpose>Allow SVG in the result tree?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="use.svg.frag">
+&lt;xsl:param name="use.svg" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, SVG will be considered an acceptable image format. SVG
+is passed through to the result tree, so correct rendering of the resulting
+diagram depends on the formatter (FO processor or web browser) that is used
+to process the output from the stylesheet.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="use.role.as.xrefstyle">
+<refmeta>
+<refentrytitle>use.role.as.xrefstyle</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>use.role.as.xrefstyle</refname>
+<refpurpose>Use <tag class="attribute">role</tag> attribute for
+<tag class="attribute">xrefstyle</tag> on <tag>xref</tag>?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="use.role.as.xrefstyle.frag">
+&lt;xsl:param name="use.role.as.xrefstyle" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>In DocBook documents that conform to a schema older than V4.3, this parameter allows
+<tag class="attribute">role</tag> to serve the purpose of specifying the cross reference style.</para>
+
+<para>If non-zero, the <tag class="attribute">role</tag> attribute on
+<tag>xref</tag> will be used to select the cross reference style.
+In DocBook V4.3, the <tag class="attribute">xrefstyle</tag> attribute was added for this purpose.
+If the <tag class="attribute">xrefstyle</tag> attribute is present,
+<tag class="attribute">role</tag> will be ignored, regardless of the setting
+of this parameter.</para>
+
+</refsection>
+
+<refsection><info><title>Example</title></info>
+
+<para>The following small stylesheet shows how to configure the
+stylesheets to make use of the cross reference style:</para>
+
+<programlisting>&lt;?xml version="1.0"?&gt;
+&lt;xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="1.0"&gt;
+
+&lt;xsl:import href="../xsl/html/docbook.xsl"/&gt;
+
+&lt;xsl:output method="html"/&gt;
+
+&lt;xsl:param name="local.l10n.xml" select="document('')"/&gt;
+&lt;l:i18n xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0"&gt;
+ &lt;l:l10n xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0" language="en"&gt;
+ &lt;l:context name="xref"&gt;
+ &lt;l:template name="chapter" style="title" text="Chapter %n, %t"/&gt;
+ &lt;l:template name="chapter" text="Chapter %n"/&gt;
+ &lt;/l:context&gt;
+ &lt;/l:l10n&gt;
+&lt;/l:i18n&gt;
+
+&lt;/xsl:stylesheet&gt;</programlisting>
+
+<para>With this stylesheet, the cross references in the following document:</para>
+
+<programlisting>&lt;?xml version="1.0" encoding="utf-8"?&gt;
+&lt;!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
+ "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd"&gt;
+&lt;book id="book"&gt;&lt;title&gt;Book&lt;/title&gt;
+
+&lt;preface&gt;
+&lt;title&gt;Preface&lt;/title&gt;
+
+&lt;para&gt;Normal: &lt;xref linkend="ch1"/&gt;.&lt;/para&gt;
+&lt;para&gt;Title: &lt;xref xrefstyle="title" linkend="ch1"/&gt;.&lt;/para&gt;
+
+&lt;/preface&gt;
+
+&lt;chapter id="ch1"&gt;
+&lt;title&gt;First Chapter&lt;/title&gt;
+
+&lt;para&gt;Irrelevant.&lt;/para&gt;
+
+&lt;/chapter&gt;
+&lt;/book&gt;</programlisting>
+
+<para>will appear as:</para>
+
+<informalexample>
+<para>Normal: Chapter 1.</para>
+<para>Title: Chapter 1, <emphasis>First Chapter</emphasis>.</para>
+</informalexample>
+</refsection>
+
+</refentry>
+
+<refentry version="5.0" xml:id="menuchoice.separator">
+<refmeta>
+<refentrytitle>menuchoice.separator</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>menuchoice.separator</refname>
+<refpurpose>Separator between items of a <tag>menuchoice</tag>
+other than <tag>guimenuitem</tag> and
+<tag>guisubmenu</tag></refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="menuchoice.separator.frag">
+&lt;xsl:param name="menuchoice.separator"&gt;+&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Separator used to connect items of a <tag>menuchoice</tag> other
+than <tag>guimenuitem</tag> and <tag>guisubmenu</tag>. The latter
+elements are linked with <parameter>menuchoice.menu.separator</parameter>.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="menuchoice.menu.separator">
+<refmeta>
+<refentrytitle>menuchoice.menu.separator</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>menuchoice.menu.separator</refname>
+<refpurpose>Separator between items of a <tag>menuchoice</tag>
+with <tag>guimenuitem</tag> or
+<tag>guisubmenu</tag></refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="menuchoice.menu.separator.frag">
+&lt;xsl:param name="menuchoice.menu.separator"&gt; &#8594; &lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Separator used to connect items of a <tag>menuchoice</tag> with
+<tag>guimenuitem</tag> or <tag>guisubmenu</tag>. Other elements
+are linked with <parameter>menuchoice.separator</parameter>.
+</para>
+<para>The default value is &amp;#x2192;, which is the
+&amp;rarr; (right arrow) character entity.
+The current FOP (0.20.5) requires setting the font-family
+explicitly.
+</para>
+<para>The default value also includes spaces around the arrow,
+which will allow a line to break. Replace the spaces with
+&amp;#xA0; (nonbreaking space) if you don't want those
+spaces to break.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="default.float.class">
+<refmeta>
+<refentrytitle>default.float.class</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>default.float.class</refname>
+<refpurpose>Specifies the default float class</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="default.float.class.frag">
+&lt;xsl:param name="default.float.class"&gt;
+ &lt;xsl:choose&gt;
+ &lt;xsl:when test="contains($stylesheet.result.type,'html')"&gt;left&lt;/xsl:when&gt;
+ &lt;xsl:otherwise&gt;before&lt;/xsl:otherwise&gt;
+ &lt;/xsl:choose&gt;
+&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Selects the direction in which a float should be placed. for
+xsl-fo this is before, for html it is left. For Western texts, the
+before direction is the top of the page.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="footnote.number.format">
+<refmeta>
+<refentrytitle>footnote.number.format</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">list</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">1<alt>1,2,3...</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">A<alt>A,B,C...</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">a<alt>a,b,c...</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">i<alt>i,ii,iii...</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">I<alt>I,II,III...</alt></refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>footnote.number.format</refname>
+<refpurpose>Identifies the format used for footnote numbers</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="footnote.number.format.frag">
+&lt;xsl:param name="footnote.number.format"&gt;1&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The <parameter>footnote.number.format</parameter> specifies the format
+to use for footnote numeration (1, i, I, a, or A).</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="table.footnote.number.format">
+<refmeta>
+<refentrytitle>table.footnote.number.format</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">list</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">1<alt>1,2,3...</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">A<alt>A,B,C...</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">a<alt>a,b,c...</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">i<alt>i,ii,iii...</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">I<alt>I,II,III...</alt></refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>table.footnote.number.format</refname>
+<refpurpose>Identifies the format used for footnote numbers in tables</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="table.footnote.number.format.frag">
+&lt;xsl:param name="table.footnote.number.format"&gt;a&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The <parameter>table.footnote.number.format</parameter> specifies the format
+to use for footnote numeration (1, i, I, a, or A) in tables.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="footnote.number.symbols">
+<refmeta>
+<refentrytitle>footnote.number.symbols</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype"/>
+</refmeta>
+<refnamediv>
+<refname>footnote.number.symbols</refname>
+<refpurpose>Special characters to use as footnote markers</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="footnote.number.symbols.frag">
+&lt;xsl:param name="footnote.number.symbols"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If <parameter>footnote.number.symbols</parameter> is not the empty string,
+footnotes will use the characters it contains as footnote symbols. For example,
+<quote>*&amp;#x2020;&amp;#x2021;&amp;#x25CA;&amp;#x2720;</quote> will identify
+footnotes with <quote>*</quote>, <quote>&#8224;</quote>, <quote>&#8225;</quote>,
+<quote>&#9674;</quote>, and <quote>&#10016;</quote>. If there are more footnotes
+than symbols, the stylesheets will fall back to numbered footnotes using
+<parameter>footnote.number.format</parameter>.</para>
+
+<para>The use of symbols for footnotes depends on the ability of your
+processor (or browser) to render the symbols you select. Not all systems are
+capable of displaying the full range of Unicode characters. If the quoted characters
+in the preceding paragraph are not displayed properly, that's a good indicator
+that you may have trouble using those symbols for footnotes.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="table.footnote.number.symbols">
+<refmeta>
+<refentrytitle>table.footnote.number.symbols</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>table.footnote.number.symbols</refname>
+<refpurpose>Special characters to use a footnote markers in tables</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="table.footnote.number.symbols.frag">
+&lt;xsl:param name="table.footnote.number.symbols"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If <parameter>table.footnote.number.symbols</parameter> is not the empty string,
+table footnotes will use the characters it contains as footnote symbols. For example,
+<quote>*&amp;#x2020;&amp;#x2021;&amp;#x25CA;&amp;#x2720;</quote> will identify
+footnotes with <quote>*</quote>, <quote>&#8224;</quote>, <quote>&#8225;</quote>,
+<quote>&#9674;</quote>, and <quote>&#10016;</quote>. If there are more footnotes
+than symbols, the stylesheets will fall back to numbered footnotes using
+<parameter>table.footnote.number.format</parameter>.</para>
+
+<para>The use of symbols for footnotes depends on the ability of your
+processor (or browser) to render the symbols you select. Not all systems are
+capable of displaying the full range of Unicode characters. If the quoted characters
+in the preceding paragraph are not displayed properly, that's a good indicator
+that you may have trouble using those symbols for footnotes.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="footnote.properties">
+<refmeta>
+<refentrytitle>footnote.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>footnote.properties</refname>
+<refpurpose>Properties applied to each footnote body
+</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="footnote.properties.frag">
+&lt;xsl:attribute-set name="footnote.properties"&gt;
+ &lt;xsl:attribute name="font-family"&gt;&lt;xsl:value-of select="$body.fontset"&gt;&lt;/xsl:value-of&gt;&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="font-size"&gt;&lt;xsl:value-of select="$footnote.font.size"&gt;&lt;/xsl:value-of&gt;&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="font-weight"&gt;normal&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="font-style"&gt;normal&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="text-align"&gt;&lt;xsl:value-of select="$alignment"&gt;&lt;/xsl:value-of&gt;&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="start-indent"&gt;0pt&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="text-indent"&gt;0pt&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="hyphenate"&gt;&lt;xsl:value-of select="$hyphenate"&gt;&lt;/xsl:value-of&gt;&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="wrap-option"&gt;wrap&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="linefeed-treatment"&gt;treat-as-space&lt;/xsl:attribute&gt;
+&lt;/xsl:attribute-set&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>This attribute set is applied to the footnote-block
+for each footnote.
+It can be used to set the
+font-size, font-family, and other inheritable properties that will be
+applied to all footnotes.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="table.footnote.properties">
+<refmeta>
+<refentrytitle>table.footnote.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>table.footnote.properties</refname>
+<refpurpose>Properties applied to each table footnote body
+</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="table.footnote.properties.frag">
+&lt;xsl:attribute-set name="table.footnote.properties"&gt;
+ &lt;xsl:attribute name="font-family"&gt;&lt;xsl:value-of select="$body.fontset"&gt;&lt;/xsl:value-of&gt;&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="font-size"&gt;&lt;xsl:value-of select="$footnote.font.size"&gt;&lt;/xsl:value-of&gt;&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="font-weight"&gt;normal&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="font-style"&gt;normal&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="space-before"&gt;2pt&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="text-align"&gt;&lt;xsl:value-of select="$alignment"&gt;&lt;/xsl:value-of&gt;&lt;/xsl:attribute&gt;
+&lt;/xsl:attribute-set&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>This attribute set is applied to the footnote-block
+for each table footnote.
+It can be used to set the
+font-size, font-family, and other inheritable properties that will be
+applied to all table footnotes.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="footnote.mark.properties">
+<refmeta>
+<refentrytitle>footnote.mark.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>footnote.mark.properties</refname>
+<refpurpose>Properties applied to each footnote mark
+</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="footnote.mark.properties.frag">
+&lt;xsl:attribute-set name="footnote.mark.properties"&gt;
+ &lt;xsl:attribute name="font-family"&gt;&lt;xsl:value-of select="$body.fontset"&gt;&lt;/xsl:value-of&gt;&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="font-size"&gt;75%&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="font-weight"&gt;normal&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="font-style"&gt;normal&lt;/xsl:attribute&gt;
+&lt;/xsl:attribute-set&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>This attribute set is applied to the footnote mark used
+for each footnote.
+It should contain only inline properties.
+</para>
+
+<para>The property to make the mark a superscript is contained in the
+footnote template itself, because the current version of FOP reports
+an error if baseline-shift is used.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="footnote.sep.leader.properties">
+<refmeta>
+<refentrytitle>footnote.sep.leader.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>footnote.sep.leader.properties</refname>
+<refpurpose>Properties associated with footnote separators</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="footnote.sep.leader.properties.frag">
+&lt;xsl:attribute-set name="footnote.sep.leader.properties"&gt;
+ &lt;xsl:attribute name="color"&gt;black&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="leader-pattern"&gt;rule&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="leader-length"&gt;1in&lt;/xsl:attribute&gt;
+&lt;/xsl:attribute-set&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The styling for the rule line that separates the
+footnotes from the body text.
+These are properties applied to the fo:leader used as
+the separator.
+</para>
+<para>If you want to do more than just set properties on
+the leader element, then you can customize the template
+named <literal>footnote.separator</literal> in
+<filename>fo/pagesetup.xsl</filename>.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="xref.with.number.and.title">
+<refmeta>
+<refentrytitle>xref.with.number.and.title</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>xref.with.number.and.title</refname>
+<refpurpose>Use number and title in cross references</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="xref.with.number.and.title.frag">
+&lt;xsl:param name="xref.with.number.and.title" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>A cross reference may include the number (for example, the number of
+an example or figure) and the <tag>title</tag> which is a required child of some
+targets. This parameter inserts both the relevant number as well as
+the title into the link. </para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="superscript.properties">
+<refmeta>
+<refentrytitle>superscript.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>superscript.properties</refname>
+<refpurpose>Properties associated with superscripts</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="superscript.properties.frag">
+&lt;xsl:attribute-set name="superscript.properties"&gt;
+ &lt;xsl:attribute name="font-size"&gt;75%&lt;/xsl:attribute&gt;
+&lt;/xsl:attribute-set&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies styling properties for superscripts.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="subscript.properties">
+<refmeta>
+<refentrytitle>subscript.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>subscript.properties</refname>
+<refpurpose>Properties associated with subscripts</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="subscript.properties.frag">
+&lt;xsl:attribute-set name="subscript.properties"&gt;
+ &lt;xsl:attribute name="font-size"&gt;75%&lt;/xsl:attribute&gt;
+&lt;/xsl:attribute-set&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies styling properties for subscripts.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="pgwide.properties">
+<refmeta>
+<refentrytitle>pgwide.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>pgwide.properties</refname>
+<refpurpose>Properties to make a figure or table page wide.
+</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="pgwide.properties.frag">
+&lt;xsl:attribute-set name="pgwide.properties"&gt;
+ &lt;xsl:attribute name="start-indent"&gt;0pt&lt;/xsl:attribute&gt;
+&lt;/xsl:attribute-set&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>This attribute set is used to set the properties
+that make a figure or table "page wide" in fo output.
+It comes into effect when an attribute <literal>pgwide="1"</literal>
+is used.
+</para>
+
+<para>
+By default, it sets <parameter>start-indent</parameter>
+to <literal>0pt</literal>.
+In a stylesheet that sets the parameter
+<parameter>body.start.indent</parameter>
+to a non-zero value in order to indent body text,
+this attribute set can be used to outdent pgwide
+figures to the start margin.
+</para>
+
+<para>If a document uses a multi-column page layout,
+then this attribute set could try setting <parameter>span</parameter>
+to a value of <literal>all</literal>. However, this may
+not work with some processors because a span property must be on an
+fo:block that is a direct child of fo:flow. It may work in
+some processors anyway.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="highlight.source">
+<refmeta>
+<refentrytitle>highlight.source</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>highlight.source</refname>
+<refpurpose>Should the content of <tag>programlisting</tag>
+be syntactically highlighted?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="highlight.source.frag">
+&lt;xsl:param name="highlight.source" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>When this parameter is non-zero, the stylesheets will try to do syntax highlighting of the
+content of <tag>programlisting</tag> elements. You specify the language for each programlisting
+by using the <tag class="attribute">language</tag> attribute. The <parameter>highlight.default.language</parameter>
+parameter can be used to specify the language for programlistings without a <tag class="attribute">language</tag>
+attribute. Syntax highlighting also works for <tag>screen</tag> and <tag>synopsis</tag> elements.</para>
+
+<para>The actual highlighting work is done by the XSLTHL extension module. This is an external Java library that has to be
+downloaded separately (see below).</para>
+
+<itemizedlist>
+<para>In order to use this extension, you must</para>
+
+<listitem><para>add <filename>xslthl-2.x.x.jar</filename> to your Java classpath. The latest version is available
+from <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://sourceforge.net/projects/xslthl">the XSLT syntax highlighting project</link>
+at SourceForge.</para>
+</listitem>
+<listitem>
+<para>use a customization layer in which you import one of the following stylesheet modules:
+<itemizedlist>
+ <listitem>
+ <para><filename>html/highlight.xsl</filename>
+ </para>
+ </listitem>
+<listitem>
+ <para><filename>xhtml/highlight.xsl</filename>
+ </para>
+ </listitem>
+<listitem>
+ <para><filename>xhtml-1_1/highlight.xsl</filename>
+ </para>
+ </listitem>
+<listitem>
+ <para><filename>fo/highlight.xsl</filename>
+ </para>
+</listitem>
+</itemizedlist>
+</para>
+</listitem>
+<listitem><para>let either the <literal>xslthl.config</literal> Java system property or the
+<parameter>highlight.xslthl.config</parameter> parameter point to the configuration file for syntax
+highlighting (using URL syntax). DocBook XSL comes with a ready-to-use configuration file,
+<filename>highlighting/xslthl-config.xml</filename>.</para>
+</listitem>
+</itemizedlist>
+
+<para>The extension works with Saxon 6.5.x and Xalan-J. (Saxon 8.5 or later is also supported, but since it is
+an XSLT 2.0 processor it is not guaranteed to work with DocBook XSL in all circumstances.)</para>
+
+<para>The following is an example of a Saxon 6 command adapted for syntax highlighting, to be used on Windows:</para>
+
+<informalexample>
+<para><command>java -cp c:/Java/saxon.jar;c:/Java/xslthl-2.0.1.jar
+-Dxslthl.config=file:///c:/docbook-xsl/highlighting/xslthl-config.xml com.icl.saxon.StyleSheet
+-o test.html test.xml myhtml.xsl</command></para>
+</informalexample>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="highlight.xslthl.config">
+<refmeta>
+<refentrytitle>highlight.xslthl.config</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">uri</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>highlight.xslthl.config</refname>
+<refpurpose>Location of XSLTHL configuration file</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="highlight.xslthl.config.frag">
+&lt;xsl:param name="highlight.xslthl.config"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>This location has precedence over the corresponding Java property.</para>
+
+<para>Please note that usually you have to specify location as URL not
+just as a simple path on the local
+filesystem. E.g. <filename>file:///home/user/xslthl/my-xslthl-config.xml</filename>.</para>
+
+
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="highlight.default.language">
+<refmeta>
+<refentrytitle>highlight.default.language</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>highlight.default.language</refname>
+<refpurpose>Default language of programlisting</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="highlight.default.language.frag">
+&lt;xsl:param name="highlight.default.language"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>This language is used when there is no language attribute on programlisting.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="email.delimiters.enabled">
+<refmeta>
+<refentrytitle>email.delimiters.enabled</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>email.delimiters.enabled</refname>
+<refpurpose>Generate delimiters around email addresses?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="email.delimiters.enabled.frag">
+&lt;xsl:param name="email.delimiters.enabled" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, delimiters
+
+<footnote><para>For delimiters, the
+stylesheets are currently hard-coded to output angle
+brackets.</para></footnote>
+
+are generated around e-mail addresses
+(the output of the <tag>email</tag> element).</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="email.mailto.enabled">
+<refmeta>
+<refentrytitle>email.mailto.enabled</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>email.mailto.enabled</refname>
+<refpurpose>Generate mailto: links for email addresses?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="email.mailto.enabled.frag">
+&lt;xsl:param name="email.mailto.enabled" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero the generated output for the <tag>email</tag> element
+will be a clickable mailto: link that brings up the default mail client
+on the system.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="section.container.element">
+<refmeta>
+<refentrytitle>section.container.element</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">list</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">block</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">wrapper</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>section.container.element</refname>
+<refpurpose>Select XSL-FO element name to contain sections</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="section.container.element.frag">
+&lt;xsl:param name="section.container.element"&gt;block&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Selects the element name for outer container of
+each section. The choices are <literal>block</literal> (default)
+or <literal>wrapper</literal>.
+The <literal>fo:</literal> namespace prefix is added
+by the stylesheet to form the full element name.
+</para>
+
+<para>This element receives the section <literal>id</literal>
+attribute and the appropriate section level attribute-set.
+</para>
+
+<para>Changing this parameter to <literal>wrapper</literal>
+is only necessary when producing multi-column output
+that contains page-wide spans. Using <literal>fo:wrapper</literal>
+avoids the nesting of <literal>fo:block</literal>
+elements that prevents spans from working (the standard says
+a span must be on a block that is a direct child of
+<literal>fo:flow</literal>).
+</para>
+
+<para>If set to <literal>wrapper</literal>, the
+section attribute-sets only support properties
+that are inheritable. That's because there is no
+block to apply them to. Properties such as
+font-family are inheritable, but properties such as
+border are not.
+</para>
+
+<para>Only some XSL-FO processors need to use this parameter.
+The Antenna House processor, for example, will handle
+spans in nested blocks without changing the element name.
+The RenderX XEP product and FOP follow the XSL-FO standard
+and need to use <literal>wrapper</literal>.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="monospace.verbatim.font.width">
+<refmeta>
+<refentrytitle>monospace.verbatim.font.width</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">length</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>monospace.verbatim.font.width</refname>
+<refpurpose>Width of a single monospace font character</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="monospace.verbatim.font.width.frag">
+&lt;xsl:param name="monospace.verbatim.font.width"&gt;0.60em&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies with em units the width of a single character
+of the monospace font. The default value is <literal>0.6em</literal>.</para>
+
+<para>This parameter is only used when a <tag>screen</tag>
+or <tag>programlisting</tag> element has a
+<tag class="attribute">width</tag> attribute, which is
+expressed as a plain integer to indicate the maximum character count
+of each line.
+To convert this character count to an actual maximum width
+measurement, the width of the font characters must be provided.
+Different monospace fonts have different character width,
+so this parameter should be adjusted to fit the
+monospace font being used.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="exsl.node.set.available">
+<refmeta>
+<refentrytitle>exsl.node.set.available</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>exsl.node.set.available</refname>
+<refpurpose>Is the test function-available('exsl:node-set') true?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="exsl.node.set.available.frag">&lt;xsl:param name="exsl.node.set.available"&gt;
+ &lt;xsl:choose&gt;
+ &lt;xsl:when exsl:foo="" test="function-available('exsl:node-set') or contains(system-property('xsl:vendor'), 'Apache Software Foundation')"&gt;1&lt;/xsl:when&gt;
+ &lt;xsl:otherwise&gt;0&lt;/xsl:otherwise&gt;
+ &lt;/xsl:choose&gt;
+&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero,
+then the exsl:node-set() function is available to be used in
+the stylesheet.
+If zero, then the function is not available.
+This param automatically detects the presence of
+the function and does not normally need to be set manually.</para>
+
+<para>This param was created to handle a long-standing
+bug in the Xalan processor that fails to detect the
+function even though it is available.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="bookmarks.collapse">
+<refmeta>
+<refentrytitle>bookmarks.collapse</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>bookmarks.collapse</refname>
+<refpurpose>Specifies the initial state of bookmarks</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="bookmarks.collapse.frag">
+&lt;xsl:param name="bookmarks.collapse" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, the bookmark tree is collapsed so that only the
+top-level bookmarks are displayed initially. Otherwise, the whole tree
+of bookmarks is displayed.</para>
+
+<para>This parameter currently works with FOP 0.93 or later.</para>
+
+</refsection>
+</refentry>
+
+</reference>
+<reference xml:id="graphics"><title>Graphics</title>
+<refentry version="5.0" xml:id="graphic.default.extension">
+<refmeta>
+<refentrytitle>graphic.default.extension</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>graphic.default.extension</refname>
+<refpurpose>Default extension for graphic filenames</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="graphic.default.extension.frag">&lt;xsl:param name="graphic.default.extension"&gt;&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If a <tag>graphic</tag> or <tag>mediaobject</tag>
+includes a reference to a filename that does not include an extension,
+and the <tag class="attribute">format</tag> attribute is
+<emphasis>unspecified</emphasis>, the default extension will be used.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="default.image.width">
+<refmeta>
+<refentrytitle>default.image.width</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">length</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>default.image.width</refname>
+<refpurpose>The default width of images</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="default.image.width.frag">
+&lt;xsl:param name="default.image.width"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If specified, this value will be used for the
+<tag class="attribute">width</tag> attribute on images that do not specify any
+<emphasis xmlns:xlink="http://www.w3.org/1999/xlink" xlink:title="DocBook 5: The Definitive Guide" xlink:href="http://docbook.org/tdg5/en/html/imagedata.html#viewport.area">viewport dimensions</emphasis>.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="preferred.mediaobject.role">
+<refmeta>
+<refentrytitle>preferred.mediaobject.role</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>preferred.mediaobject.role</refname>
+<refpurpose>Select which mediaobject to use based on
+this value of an object's <tag class="attribute">role</tag> attribute.
+</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="preferred.mediaobject.role.frag">
+&lt;xsl:param name="preferred.mediaobject.role"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>A mediaobject may contain several objects such as imageobjects.
+If the parameter <parameter>use.role.for.mediaobject</parameter> is
+non-zero, then the <literal>role</literal> attribute on
+<tag>imageobject</tag>s and other objects within a
+<tag>mediaobject</tag> container will be used to select which object
+will be used. If one of the objects has a role value that matches the
+<parameter>preferred.mediaobject.role</parameter> parameter, then it
+has first priority for selection. If more than one has such a role
+value, the first one is used.
+</para>
+<para>
+See the <parameter>use.role.for.mediaobject</parameter> parameter
+for the sequence of selection.</para>
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="use.role.for.mediaobject">
+<refmeta>
+<refentrytitle>use.role.for.mediaobject</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>use.role.for.mediaobject</refname>
+<refpurpose>Use <tag class="attribute">role</tag> attribute
+value for selecting which of several objects within a mediaobject to use.
+</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="use.role.for.mediaobject.frag">
+&lt;xsl:param name="use.role.for.mediaobject" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, the <tag class="attribute">role</tag> attribute on
+<tag>imageobject</tag>s or other objects within a <tag>mediaobject</tag> container will be used to select which object will be
+used.
+</para>
+<para>
+The order of selection when then parameter is non-zero is:
+</para>
+<orderedlist>
+<listitem>
+ <para>If the stylesheet parameter <parameter>preferred.mediaobject.role</parameter> has a value, then the object whose role equals that value is selected.</para>
+</listitem>
+<listitem>
+<para>Else if an object's role attribute has a value of
+<literal>html</literal> for HTML processing or
+<literal>fo</literal> for FO output, then the first
+of such objects is selected.
+</para>
+</listitem>
+<listitem>
+<para>Else the first suitable object is selected.</para>
+</listitem>
+</orderedlist>
+<para>
+If the value of
+<parameter>use.role.for.mediaobject</parameter>
+is zero, then role attributes are not considered
+and the first suitable object
+with or without a role value is used.
+</para>
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="ignore.image.scaling">
+<refmeta>
+<refentrytitle>ignore.image.scaling</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>ignore.image.scaling</refname>
+<refpurpose>Tell the stylesheets to ignore the author's image scaling attributes</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="ignore.image.scaling.frag">
+&lt;xsl:param name="ignore.image.scaling" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, the scaling attributes on graphics and media objects are
+ignored.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="img.src.path">
+<refmeta>
+<refentrytitle>img.src.path</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>img.src.path</refname>
+<refpurpose>Path to HTML/FO image files</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="img.src.path.frag">&lt;xsl:param name="img.src.path"&gt;&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Add a path prefix to the value of the <tag class="attribute">fileref</tag>
+attribute of <tag>graphic</tag>, <tag>inlinegraphic</tag>, and <tag>imagedata</tag> elements. The resulting
+compound path is used in the output as the value of the <tag class="attribute">src</tag>
+attribute of <tag class="element">img</tag> (HTML) or <tag class="element">external-graphic</tag> (FO).
+</para>
+
+<para>
+The path given by <literal>img.src.path</literal> could be relative to the directory where the HTML/FO
+files are created, or it could be an absolute URI.
+The default value is empty.
+Be sure to include a trailing slash if needed.
+</para>
+
+<para>This prefix is not applied to any filerefs that start
+with "/" or contain "//:".
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="keep.relative.image.uris">
+<refmeta>
+<refentrytitle>keep.relative.image.uris</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>keep.relative.image.uris</refname>
+<refpurpose>Should image URIs be resolved against xml:base?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="keep.relative.image.uris.frag">
+
+&lt;xsl:param name="keep.relative.image.uris" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, relative URIs (in, for example
+<literal>fileref</literal> attributes) will be used in the generated
+output. Otherwise, the URIs will be made absolute with respect to the
+base URI.</para>
+
+<para>Note that the stylesheets calculate (and use) the absolute form
+for some purposes, this only applies to the resulting output.</para>
+
+</refsection>
+</refentry>
+
+</reference>
+<reference xml:id="general"><title>Pagination and General Styles</title>
+<partintro xml:id="margins_partintro">
+<section xml:id="margins_intro"><title>Understanding XSL FO Margins</title>
+
+<para>To make sense of the parameters in this section, it's useful to
+consider <xref linkend="fig.pagemodel"/>.</para>
+
+<figure xml:id="fig.pagemodel">
+ <title>Page Model</title>
+ <mediaobject xml:id="fo-pageregions-image">
+ <imageobject role="html">
+ <imagedata fileref="page.png"/>
+ </imageobject>
+ <imageobject role="fo">
+ <imagedata fileref="fo/page.png"/>
+ </imageobject>
+ <textobject><phrase>Figure showing page margins</phrase></textobject>
+ <textobject>
+ <para>This figure shows the physical page with the various FO page regions
+ identified.</para>
+ </textobject>
+ </mediaobject>
+</figure>
+
+<para>First, let's consider the regions on the page.</para>
+
+<para>The white region is the physical page. Its dimensions are determined by
+the <parameter>page.height</parameter> and <parameter>page.width</parameter>
+parameters.</para>
+
+<para>The yellow region is the region-body. The size and placement of
+the region body is constrained by the dimensions labelled in the
+figure.</para>
+
+<para>The pink region at the top of the page is the region-before. The
+darker area inside the region-before is the header text. In XSL, the default
+display alignment for a region is <literal>before</literal>, but the
+DocBook stylesheets still explicitly make it <literal>before</literal>. That's
+why the darker area is at the top.</para>
+
+<para>The pink region at the bottom of the page is the region-after.
+The darker area is the footer text. In XSL, the default display
+alignment for a region is <literal>before</literal>,
+but the DocBook stylesheets explicitly make it
+<literal>after</literal>. That's why the darker area is at the bottom.</para>
+
+<para>The dimensions in the figure are:</para>
+
+<orderedlist numeration="upperalpha">
+<listitem><para>The page-master margin-top.
+</para></listitem>
+<listitem><para>The region-before extent.
+</para></listitem>
+<listitem><para>The region-body margin-top.
+</para></listitem>
+<listitem><para>The region-after extent.
+</para></listitem>
+<listitem><para>The page-master margin-bottom.
+</para></listitem>
+<listitem><para>The region-body margin-bottom.
+</para></listitem>
+<listitem><para>The sum of the page-master margin-left and the
+region-body margin-left. In DocBook, the region-body margin-left is
+zero by default, so this is simply the page-master margin-left.
+</para></listitem>
+<listitem><para>The sum of the page-master margin-right and the
+region-body margin-right. In DocBook, the region-body margin-right is
+zero by default, so this is simply the page-master margin-right.
+</para></listitem>
+</orderedlist>
+
+</section>
+</partintro>
+
+<refentry version="5.0" xml:id="page.height">
+<refmeta>
+<refentrytitle>page.height</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">length</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>page.height</refname>
+<refpurpose>The height of the physical page</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="page.height.frag">&lt;xsl:param name="page.height"&gt;
+ &lt;xsl:choose&gt;
+ &lt;xsl:when test="$page.orientation = 'portrait'"&gt;
+ &lt;xsl:value-of select="$page.height.portrait"&gt;&lt;/xsl:value-of&gt;
+ &lt;/xsl:when&gt;
+ &lt;xsl:otherwise&gt;
+ &lt;xsl:value-of select="$page.width.portrait"&gt;&lt;/xsl:value-of&gt;
+ &lt;/xsl:otherwise&gt;
+ &lt;/xsl:choose&gt;
+&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The page height is generally calculated from the
+<parameter>paper.type</parameter> and
+<parameter>page.orientation</parameter> parameters.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="page.height.portrait">
+<refmeta>
+<refentrytitle>page.height.portrait</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">length</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>page.height.portrait</refname>
+<refpurpose>Specify the physical size of the long edge of the page</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="page.height.portrait.frag">&lt;xsl:param name="page.height.portrait"&gt;
+ &lt;xsl:choose&gt;
+ &lt;xsl:when test="$paper.type = 'A4landscape'"&gt;210mm&lt;/xsl:when&gt;
+ &lt;xsl:when test="$paper.type = 'USletter'"&gt;11in&lt;/xsl:when&gt;
+ &lt;xsl:when test="$paper.type = 'USlandscape'"&gt;8.5in&lt;/xsl:when&gt;
+ &lt;xsl:when test="$paper.type = '4A0'"&gt;2378mm&lt;/xsl:when&gt;
+ &lt;xsl:when test="$paper.type = '2A0'"&gt;1682mm&lt;/xsl:when&gt;
+ &lt;xsl:when test="$paper.type = 'A0'"&gt;1189mm&lt;/xsl:when&gt;
+ &lt;xsl:when test="$paper.type = 'A1'"&gt;841mm&lt;/xsl:when&gt;
+ &lt;xsl:when test="$paper.type = 'A2'"&gt;594mm&lt;/xsl:when&gt;
+ &lt;xsl:when test="$paper.type = 'A3'"&gt;420mm&lt;/xsl:when&gt;
+ &lt;xsl:when test="$paper.type = 'A4'"&gt;297mm&lt;/xsl:when&gt;
+ &lt;xsl:when test="$paper.type = 'A5'"&gt;210mm&lt;/xsl:when&gt;
+ &lt;xsl:when test="$paper.type = 'A6'"&gt;148mm&lt;/xsl:when&gt;
+ &lt;xsl:when test="$paper.type = 'A7'"&gt;105mm&lt;/xsl:when&gt;
+ &lt;xsl:when test="$paper.type = 'A8'"&gt;74mm&lt;/xsl:when&gt;
+ &lt;xsl:when test="$paper.type = 'A9'"&gt;52mm&lt;/xsl:when&gt;
+ &lt;xsl:when test="$paper.type = 'A10'"&gt;37mm&lt;/xsl:when&gt;
+ &lt;xsl:when test="$paper.type = 'B0'"&gt;1414mm&lt;/xsl:when&gt;
+ &lt;xsl:when test="$paper.type = 'B1'"&gt;1000mm&lt;/xsl:when&gt;
+ &lt;xsl:when test="$paper.type = 'B2'"&gt;707mm&lt;/xsl:when&gt;
+ &lt;xsl:when test="$paper.type = 'B3'"&gt;500mm&lt;/xsl:when&gt;
+ &lt;xsl:when test="$paper.type = 'B4'"&gt;353mm&lt;/xsl:when&gt;
+ &lt;xsl:when test="$paper.type = 'B5'"&gt;250mm&lt;/xsl:when&gt;
+ &lt;xsl:when test="$paper.type = 'B6'"&gt;176mm&lt;/xsl:when&gt;
+ &lt;xsl:when test="$paper.type = 'B7'"&gt;125mm&lt;/xsl:when&gt;
+ &lt;xsl:when test="$paper.type = 'B8'"&gt;88mm&lt;/xsl:when&gt;
+ &lt;xsl:when test="$paper.type = 'B9'"&gt;62mm&lt;/xsl:when&gt;
+ &lt;xsl:when test="$paper.type = 'B10'"&gt;44mm&lt;/xsl:when&gt;
+ &lt;xsl:when test="$paper.type = 'C0'"&gt;1297mm&lt;/xsl:when&gt;
+ &lt;xsl:when test="$paper.type = 'C1'"&gt;917mm&lt;/xsl:when&gt;
+ &lt;xsl:when test="$paper.type = 'C2'"&gt;648mm&lt;/xsl:when&gt;
+ &lt;xsl:when test="$paper.type = 'C3'"&gt;458mm&lt;/xsl:when&gt;
+ &lt;xsl:when test="$paper.type = 'C4'"&gt;324mm&lt;/xsl:when&gt;
+ &lt;xsl:when test="$paper.type = 'C5'"&gt;229mm&lt;/xsl:when&gt;
+ &lt;xsl:when test="$paper.type = 'C6'"&gt;162mm&lt;/xsl:when&gt;
+ &lt;xsl:when test="$paper.type = 'C7'"&gt;114mm&lt;/xsl:when&gt;
+ &lt;xsl:when test="$paper.type = 'C8'"&gt;81mm&lt;/xsl:when&gt;
+ &lt;xsl:when test="$paper.type = 'C9'"&gt;57mm&lt;/xsl:when&gt;
+ &lt;xsl:when test="$paper.type = 'C10'"&gt;40mm&lt;/xsl:when&gt;
+ &lt;xsl:otherwise&gt;11in&lt;/xsl:otherwise&gt;
+ &lt;/xsl:choose&gt;
+&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The portrait page height is the length of the long
+edge of the physical page.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="page.margin.bottom">
+<refmeta>
+<refentrytitle>page.margin.bottom</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">length</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>page.margin.bottom</refname>
+<refpurpose>The bottom margin of the page</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="page.margin.bottom.frag">
+&lt;xsl:param name="page.margin.bottom"&gt;0.5in&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The bottom page margin is the distance from the bottom of the region-after
+to the physical bottom of the page.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="page.margin.inner">
+<refmeta>
+<refentrytitle>page.margin.inner</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">length</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>page.margin.inner</refname>
+<refpurpose>The inner page margin</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="page.margin.inner.frag">&lt;xsl:param name="page.margin.inner"&gt;
+ &lt;xsl:choose&gt;
+ &lt;xsl:when test="$double.sided != 0"&gt;1.25in&lt;/xsl:when&gt;
+ &lt;xsl:otherwise&gt;1in&lt;/xsl:otherwise&gt;
+ &lt;/xsl:choose&gt;
+&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The inner page margin is the distance from bound edge of the
+page to the first column of text. </para>
+
+<para>The inner page margin is the distance from bound edge of the
+page to the outer edge of the first column of text.</para>
+
+<para>In left-to-right text direction,
+this is the left margin of recto (front side) pages.
+For single-sided output, it is the left margin
+of all pages.</para>
+
+<para>In right-to-left text direction,
+this is the right margin of recto pages.
+For single-sided output, this is the
+right margin of all pages.</para>
+
+<note>
+<para>Current versions (at least as of version 4.13)
+of the XEP XSL-FO processor do not
+correctly handle these margin settings for documents
+with right-to-left text direction.
+The workaround in that situation is to reverse
+the values for <parameter>page.margin.inner</parameter>
+and <parameter>page.margin.outer</parameter>, until
+this bug is fixed by RenderX. It does not affect documents
+with left-to-right text direction.</para>
+</note>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="page.margin.outer">
+<refmeta>
+<refentrytitle>page.margin.outer</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">length</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>page.margin.outer</refname>
+<refpurpose>The outer page margin</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="page.margin.outer.frag">&lt;xsl:param name="page.margin.outer"&gt;
+ &lt;xsl:choose&gt;
+ &lt;xsl:when test="$double.sided != 0"&gt;0.75in&lt;/xsl:when&gt;
+ &lt;xsl:otherwise&gt;1in&lt;/xsl:otherwise&gt;
+ &lt;/xsl:choose&gt;
+&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The outer page margin is the distance from non-bound edge of the
+page to the outer edge of the last column of text.</para>
+
+<para>In left-to-right text direction,
+this is the right margin of recto (front side) pages.
+For single-sided output, it is the right margin
+of all pages.</para>
+
+<para>In right-to-left text direction,
+this is the left margin of recto pages.
+For single-sided output, this is the
+left margin of all pages.</para>
+
+<note>
+<para>Current versions (at least as of version 4.13)
+of the XEP XSL-FO processor do not
+correctly handle these margin settings for documents
+with right-to-left text direction.
+The workaround in that situation is to reverse
+the values for <parameter>page.margin.inner</parameter>
+and <parameter>page.margin.outer</parameter>, until
+this bug is fixed by RenderX. It does not affect documents
+with left-to-right text direction.</para>
+</note>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="page.margin.top">
+<refmeta>
+<refentrytitle>page.margin.top</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">length</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>page.margin.top</refname>
+<refpurpose>The top margin of the page</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="page.margin.top.frag">
+&lt;xsl:param name="page.margin.top"&gt;0.5in&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The top page margin is the distance from the physical top of the
+page to the top of the region-before.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="page.orientation">
+<refmeta>
+<refentrytitle>page.orientation</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">list</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">portrait</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">landscape</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>page.orientation</refname>
+<refpurpose>Select the page orientation</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="page.orientation.frag">
+&lt;xsl:param name="page.orientation"&gt;portrait&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para> Select one from portrait or landscape.
+In portrait orientation, the short edge is horizontal; in
+landscape orientation, it is vertical.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="page.width">
+<refmeta>
+<refentrytitle>page.width</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">length</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>page.width</refname>
+<refpurpose>The width of the physical page</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="page.width.frag">&lt;xsl:param name="page.width"&gt;
+ &lt;xsl:choose&gt;
+ &lt;xsl:when test="$page.orientation = 'portrait'"&gt;
+ &lt;xsl:value-of select="$page.width.portrait"&gt;&lt;/xsl:value-of&gt;
+ &lt;/xsl:when&gt;
+ &lt;xsl:otherwise&gt;
+ &lt;xsl:value-of select="$page.height.portrait"&gt;&lt;/xsl:value-of&gt;
+ &lt;/xsl:otherwise&gt;
+ &lt;/xsl:choose&gt;
+&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The page width is generally calculated from the
+<parameter>paper.type</parameter> and
+<parameter>page.orientation</parameter> parameters.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="page.width.portrait">
+<refmeta>
+<refentrytitle>page.width.portrait</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">length</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>page.width.portrait</refname>
+<refpurpose>Specify the physical size of the short edge of the page</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="page.width.portrait.frag">&lt;xsl:param name="page.width.portrait"&gt;
+ &lt;xsl:choose&gt;
+ &lt;xsl:when test="$paper.type = 'USletter'"&gt;8.5in&lt;/xsl:when&gt;
+ &lt;xsl:when test="$paper.type = '4A0'"&gt;1682mm&lt;/xsl:when&gt;
+ &lt;xsl:when test="$paper.type = '2A0'"&gt;1189mm&lt;/xsl:when&gt;
+ &lt;xsl:when test="$paper.type = 'A0'"&gt;841mm&lt;/xsl:when&gt;
+ &lt;xsl:when test="$paper.type = 'A1'"&gt;594mm&lt;/xsl:when&gt;
+ &lt;xsl:when test="$paper.type = 'A2'"&gt;420mm&lt;/xsl:when&gt;
+ &lt;xsl:when test="$paper.type = 'A3'"&gt;297mm&lt;/xsl:when&gt;
+ &lt;xsl:when test="$paper.type = 'A4'"&gt;210mm&lt;/xsl:when&gt;
+ &lt;xsl:when test="$paper.type = 'A5'"&gt;148mm&lt;/xsl:when&gt;
+ &lt;xsl:when test="$paper.type = 'A6'"&gt;105mm&lt;/xsl:when&gt;
+ &lt;xsl:when test="$paper.type = 'A7'"&gt;74mm&lt;/xsl:when&gt;
+ &lt;xsl:when test="$paper.type = 'A8'"&gt;52mm&lt;/xsl:when&gt;
+ &lt;xsl:when test="$paper.type = 'A9'"&gt;37mm&lt;/xsl:when&gt;
+ &lt;xsl:when test="$paper.type = 'A10'"&gt;26mm&lt;/xsl:when&gt;
+ &lt;xsl:when test="$paper.type = 'B0'"&gt;1000mm&lt;/xsl:when&gt;
+ &lt;xsl:when test="$paper.type = 'B1'"&gt;707mm&lt;/xsl:when&gt;
+ &lt;xsl:when test="$paper.type = 'B2'"&gt;500mm&lt;/xsl:when&gt;
+ &lt;xsl:when test="$paper.type = 'B3'"&gt;353mm&lt;/xsl:when&gt;
+ &lt;xsl:when test="$paper.type = 'B4'"&gt;250mm&lt;/xsl:when&gt;
+ &lt;xsl:when test="$paper.type = 'B5'"&gt;176mm&lt;/xsl:when&gt;
+ &lt;xsl:when test="$paper.type = 'B6'"&gt;125mm&lt;/xsl:when&gt;
+ &lt;xsl:when test="$paper.type = 'B7'"&gt;88mm&lt;/xsl:when&gt;
+ &lt;xsl:when test="$paper.type = 'B8'"&gt;62mm&lt;/xsl:when&gt;
+ &lt;xsl:when test="$paper.type = 'B9'"&gt;44mm&lt;/xsl:when&gt;
+ &lt;xsl:when test="$paper.type = 'B10'"&gt;31mm&lt;/xsl:when&gt;
+ &lt;xsl:when test="$paper.type = 'C0'"&gt;917mm&lt;/xsl:when&gt;
+ &lt;xsl:when test="$paper.type = 'C1'"&gt;648mm&lt;/xsl:when&gt;
+ &lt;xsl:when test="$paper.type = 'C2'"&gt;458mm&lt;/xsl:when&gt;
+ &lt;xsl:when test="$paper.type = 'C3'"&gt;324mm&lt;/xsl:when&gt;
+ &lt;xsl:when test="$paper.type = 'C4'"&gt;229mm&lt;/xsl:when&gt;
+ &lt;xsl:when test="$paper.type = 'C5'"&gt;162mm&lt;/xsl:when&gt;
+ &lt;xsl:when test="$paper.type = 'C6'"&gt;114mm&lt;/xsl:when&gt;
+ &lt;xsl:when test="$paper.type = 'C7'"&gt;81mm&lt;/xsl:when&gt;
+ &lt;xsl:when test="$paper.type = 'C8'"&gt;57mm&lt;/xsl:when&gt;
+ &lt;xsl:when test="$paper.type = 'C9'"&gt;40mm&lt;/xsl:when&gt;
+ &lt;xsl:when test="$paper.type = 'C10'"&gt;28mm&lt;/xsl:when&gt;
+ &lt;xsl:otherwise&gt;8.5in&lt;/xsl:otherwise&gt;
+ &lt;/xsl:choose&gt;
+&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The portrait page width is the length of the short
+edge of the physical page.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="paper.type">
+<refmeta>
+<refentrytitle>paper.type</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">list</refmiscinfo>
+<refmiscinfo class="other" otherclass="list-type">open</refmiscinfo>
+<refmiscinfo class="other" otherclass="list-type">open</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">USletter<alt>8.5x11in</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">USlandscape<alt>11x8.5in</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">USlegal<alt>8.5inx14in</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">USlegallandscape<alt>14inx8.5in</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">4A0<alt>2378x1682mm</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">2A0<alt>1682x1189mm</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">A0<alt>1189x841mm</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">A1<alt>841x594mm</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">A2<alt>594x420mm</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">A3<alt>420x297mm</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">A4<alt>297x210mm</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">A5<alt>210x148mm</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">A6<alt>148x105mm</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">A7<alt>105x74mm</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">A8<alt>74x52mm</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">A9<alt>52x37mm</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">A10<alt>37x26mm</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">B0<alt>1414x1000mm</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">B1<alt>1000x707mm</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">B2<alt>707x500mm</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">B3<alt>500x353mm</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">B4<alt>353x250mm</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">B5<alt>250x176mm</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">B6<alt>176x125mm</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">B7<alt>125x88mm</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">B8<alt>88x62mm</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">B9<alt>62x44mm</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">B10<alt>44x31mm</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">C0<alt>1297x917mm</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">C1<alt>917x648mm</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">C2<alt>648x458mm</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">C3<alt>458x324mm</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">C4<alt>324x229mm</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">C5<alt>229x162mm</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">C6<alt>162x114mm</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">C7<alt>114x81mm</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">C8<alt>81x57mm</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">C9<alt>57x40mm</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">C10<alt>40x28mm</alt></refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>paper.type</refname>
+<refpurpose>Select the paper type</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="paper.type.frag">
+&lt;xsl:param name="paper.type"&gt;USletter&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The paper type is a convenient way to specify the paper size.
+The list of known paper sizes includes USletter and most of the A,
+B, and C sizes. See <parameter>page.width.portrait</parameter>, for example.
+
+
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="double.sided">
+<refmeta>
+<refentrytitle>double.sided</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>double.sided</refname>
+<refpurpose>Is the document to be printed double sided?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="double.sided.frag">
+&lt;xsl:param name="double.sided" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Double-sided documents are printed with a slightly wider margin
+on the binding edge of the page.
+</para>
+<para>FIXME: The current set of parameters does not take writing direction
+into account.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="body.margin.bottom">
+<refmeta>
+<refentrytitle>body.margin.bottom</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">length</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>body.margin.bottom</refname>
+<refpurpose>The bottom margin of the body text</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="body.margin.bottom.frag">
+&lt;xsl:param name="body.margin.bottom"&gt;0.5in&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The body bottom margin is the distance from the last line of text
+in the page body to the bottom of the region-after.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="body.margin.top">
+<refmeta>
+<refentrytitle>body.margin.top</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">length</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>body.margin.top</refname>
+<refpurpose>To specify the size of the top margin of a page</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="body.margin.top.frag">
+&lt;xsl:param name="body.margin.top"&gt;0.5in&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The body top margin is the distance from the top of the
+region-before to the first line of text in the page body.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="body.start.indent">
+<refmeta>
+<refentrytitle>body.start.indent</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">length</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>body.start.indent</refname>
+<refpurpose>The start-indent for the body text</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="body.start.indent.frag">
+&lt;xsl:param name="body.start.indent"&gt;
+ &lt;xsl:choose&gt;
+ &lt;xsl:when test="$fop.extensions != 0"&gt;0pt&lt;/xsl:when&gt;
+ &lt;xsl:when test="$passivetex.extensions != 0"&gt;0pt&lt;/xsl:when&gt;
+ &lt;xsl:otherwise&gt;4pc&lt;/xsl:otherwise&gt;
+ &lt;/xsl:choose&gt;
+&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>This parameter provides
+the means of indenting the body text relative to
+section titles.
+For left-to-right text direction, it indents the left side.
+For right-to-left text direction, it indents the right side.
+It is used in place of the
+<parameter>title.margin.left</parameter> for
+all XSL-FO processors except FOP 0.25.
+It enables support for side floats to appear
+in the indented margin area.
+</para>
+<para>This start-indent property is added to the fo:flow
+for certain page sequences. Which page-sequences it is
+applied to is determined by the template named
+<literal>set.flow.properties</literal>.
+By default, that template adds it to the flow
+for page-sequences using the <quote>body</quote>
+master-reference, as well as appendixes and prefaces.
+</para>
+<para>If this parameter is used, section titles should have
+a start-indent value of 0pt if they are to be
+outdented relative to the body text.
+</para>
+
+<para>If you are using FOP, then set this parameter to a zero
+width value and set the <parameter>title.margin.left</parameter>
+parameter to the negative value of the desired indent.
+</para>
+
+<para>See also <parameter>body.end.indent</parameter> and
+<parameter>title.margin.left</parameter>.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="body.end.indent">
+<refmeta>
+<refentrytitle>body.end.indent</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">length</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>body.end.indent</refname>
+<refpurpose>The end-indent for the body text</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="body.end.indent.frag">
+&lt;xsl:param name="body.end.indent"&gt;0pt&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>This end-indent property is added to the fo:flow
+for certain page sequences. Which page-sequences it is
+applied to is determined by the template named
+<literal>set.flow.properties</literal>.
+By default, that template adds it to the flow
+for page-sequences using the <quote>body</quote>
+master-reference, as well as appendixes and prefaces.
+</para>
+
+<para>See also <parameter>body.start.indent</parameter>.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="alignment">
+<refmeta>
+<refentrytitle>alignment</refentrytitle>
+ <refmiscinfo class="other" otherclass="datatype">list</refmiscinfo>
+ <refmiscinfo class="other" otherclass="list-type">open</refmiscinfo>
+ <refmiscinfo class="other" otherclass="value">left</refmiscinfo>
+ <refmiscinfo class="other" otherclass="value">start</refmiscinfo>
+ <refmiscinfo class="other" otherclass="value">right</refmiscinfo>
+ <refmiscinfo class="other" otherclass="value">end</refmiscinfo>
+ <refmiscinfo class="other" otherclass="value">center</refmiscinfo>
+ <refmiscinfo class="other" otherclass="value">justify</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>alignment</refname>
+<refpurpose>Specify the default text alignment</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="alignment.frag">&lt;xsl:param name="alignment"&gt;justify&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The default text alignment is used for most body text.
+Allowed values are
+<literal>left</literal>,
+<literal>right</literal>,
+<literal>start</literal>,
+<literal>end</literal>,
+<literal>center</literal>,
+<literal>justify</literal>.
+The default value is <literal>justify</literal>.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="hyphenate">
+<refmeta>
+<refentrytitle>hyphenate</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">list</refmiscinfo>
+<refmiscinfo class="other" otherclass="list-type">closed</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">true</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">false</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>hyphenate</refname>
+<refpurpose>Specify hyphenation behavior</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="hyphenate.frag">&lt;xsl:param name="hyphenate"&gt;true&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If true, words may be hyphenated. Otherwise, they may not.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="line-height">
+<refmeta>
+<refentrytitle>line-height</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>line-height</refname>
+<refpurpose>Specify the line-height property</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="line-height.frag">
+&lt;xsl:param name="line-height"&gt;normal&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Sets the line-height property.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="column.count.back">
+<refmeta>
+<refentrytitle>column.count.back</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">integer</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>column.count.back</refname>
+<refpurpose>Number of columns on back matter pages</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="column.count.back.frag">
+&lt;xsl:param name="column.count.back" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Number of columns on back matter (appendix, glossary, etc.) pages.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="column.count.body">
+<refmeta>
+<refentrytitle>column.count.body</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">integer</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>column.count.body</refname>
+<refpurpose>Number of columns on body pages</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="column.count.body.frag">
+&lt;xsl:param name="column.count.body" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Number of columns on body pages.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="column.count.front">
+<refmeta>
+<refentrytitle>column.count.front</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">integer</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>column.count.front</refname>
+<refpurpose>Number of columns on front matter pages</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="column.count.front.frag">
+&lt;xsl:param name="column.count.front" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Number of columns on front matter (dedication, preface, etc.) pages.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="column.count.index">
+<refmeta>
+<refentrytitle>column.count.index</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">integer</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>column.count.index</refname>
+<refpurpose>Number of columns on index pages</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="column.count.index.frag">
+&lt;xsl:param name="column.count.index"&gt;2&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Number of columns on index pages.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="column.count.lot">
+<refmeta>
+<refentrytitle>column.count.lot</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">integer</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>column.count.lot</refname>
+<refpurpose>Number of columns on a 'List-of-Titles' page</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="column.count.lot.frag">
+&lt;xsl:param name="column.count.lot" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Number of columns on a page sequence containing the Table of Contents,
+List of Figures, etc.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="column.count.titlepage">
+<refmeta>
+<refentrytitle>column.count.titlepage</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">integer</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>column.count.titlepage</refname>
+<refpurpose>Number of columns on a title page</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="column.count.titlepage.frag">
+&lt;xsl:param name="column.count.titlepage" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Number of columns on a title page</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="column.gap.back">
+<refmeta>
+<refentrytitle>column.gap.back</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">length</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>column.gap.back</refname>
+<refpurpose>Gap between columns in back matter</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="column.gap.back.frag">
+&lt;xsl:param name="column.gap.back"&gt;12pt&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies the gap between columns in back matter (if
+<parameter>column.count.back</parameter> is greater than one).</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="column.gap.body">
+<refmeta>
+<refentrytitle>column.gap.body</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">length</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>column.gap.body</refname>
+<refpurpose>Gap between columns in the body</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="column.gap.body.frag">
+&lt;xsl:param name="column.gap.body"&gt;12pt&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies the gap between columns in body matter (if
+<parameter>column.count.body</parameter> is greater than one).</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="column.gap.front">
+<refmeta>
+<refentrytitle>column.gap.front</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">length</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>column.gap.front</refname>
+<refpurpose>Gap between columns in the front matter</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="column.gap.front.frag">
+&lt;xsl:param name="column.gap.front"&gt;12pt&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies the gap between columns in front matter (if
+<parameter>column.count.front</parameter> is greater than one).</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="column.gap.index">
+<refmeta>
+<refentrytitle>column.gap.index</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">length</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>column.gap.index</refname>
+<refpurpose>Gap between columns in the index</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="column.gap.index.frag">
+&lt;xsl:param name="column.gap.index"&gt;12pt&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies the gap between columns in indexes (if
+<parameter>column.count.index</parameter> is greater than one).</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="column.gap.lot">
+<refmeta>
+<refentrytitle>column.gap.lot</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">length</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>column.gap.lot</refname>
+<refpurpose>Gap between columns on a 'List-of-Titles' page</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="column.gap.lot.frag">
+&lt;xsl:param name="column.gap.lot"&gt;12pt&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies the gap between columns on 'List-of-Titles' pages (if
+<parameter>column.count.lot</parameter> is greater than one).</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="column.gap.titlepage">
+<refmeta>
+<refentrytitle>column.gap.titlepage</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">length</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>column.gap.titlepage</refname>
+<refpurpose>Gap between columns on title pages</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="column.gap.titlepage.frag">
+&lt;xsl:param name="column.gap.titlepage"&gt;12pt&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies the gap between columns on title pages (if
+<parameter>column.count.titlepage</parameter> is greater than one).</para>
+
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="region.after.extent">
+<refmeta>
+<refentrytitle>region.after.extent</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">length</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>region.after.extent</refname>
+<refpurpose>Specifies the height of the footer.</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="region.after.extent.frag">
+&lt;xsl:param name="region.after.extent"&gt;0.4in&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The region after extent is the height of the area where footers
+are printed.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="region.before.extent">
+<refmeta>
+<refentrytitle>region.before.extent</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">length</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>region.before.extent</refname>
+<refpurpose>Specifies the height of the header</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="region.before.extent.frag">
+&lt;xsl:param name="region.before.extent"&gt;0.4in&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The region before extent is the height of the area where headers
+are printed.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="default.units">
+<refmeta>
+<refentrytitle>default.units</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">list</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">cm</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">mm</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">in</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">pt</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">pc</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">px</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">em</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>default.units</refname>
+<refpurpose>Default units for an unqualified dimension</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="default.units.frag">
+&lt;xsl:param name="default.units"&gt;pt&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If an unqualified dimension is encountered (for example, in a
+graphic width), the <parameter>default.units</parameter> will be used for the
+units. Unqualified dimensions are not allowed in XSL Formatting Objects.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="normal.para.spacing">
+<refmeta>
+<refentrytitle>normal.para.spacing</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>normal.para.spacing</refname>
+<refpurpose>What space do you want between normal paragraphs</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="normal.para.spacing.frag">&lt;xsl:attribute-set name="normal.para.spacing"&gt;
+ &lt;xsl:attribute name="space-before.optimum"&gt;1em&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="space-before.minimum"&gt;0.8em&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="space-before.maximum"&gt;1.2em&lt;/xsl:attribute&gt;
+&lt;/xsl:attribute-set&gt;</programlisting>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+<para>Specify the spacing required between normal paragraphs</para>
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="body.font.master">
+<refmeta>
+<refentrytitle>body.font.master</refentrytitle>
+ <refmiscinfo class="other" otherclass="datatype">number</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>body.font.master</refname>
+<refpurpose>Specifies the default point size for body text</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="body.font.master.frag">
+&lt;xsl:param name="body.font.master"&gt;10&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The body font size is specified in two parameters
+(<parameter>body.font.master</parameter> and <parameter>body.font.size</parameter>)
+so that math can be performed on the font size by XSLT.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="body.font.size">
+<refmeta>
+<refentrytitle>body.font.size</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">length</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>body.font.size</refname>
+<refpurpose>Specifies the default font size for body text</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="body.font.size.frag">
+&lt;xsl:param name="body.font.size"&gt;
+ &lt;xsl:value-of select="$body.font.master"&gt;&lt;/xsl:value-of&gt;&lt;xsl:text&gt;pt&lt;/xsl:text&gt;
+&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The body font size is specified in two parameters
+(<parameter>body.font.master</parameter> and <parameter>body.font.size</parameter>)
+so that math can be performed on the font size by XSLT.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="footnote.font.size">
+<refmeta>
+<refentrytitle>footnote.font.size</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">length</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>footnote.font.size</refname>
+<refpurpose>The font size for footnotes</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="footnote.font.size.frag">&lt;xsl:param name="footnote.font.size"&gt;
+ &lt;xsl:value-of select="$body.font.master * 0.8"&gt;&lt;/xsl:value-of&gt;&lt;xsl:text&gt;pt&lt;/xsl:text&gt;
+&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The footnote font size is used for...footnotes!
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="title.margin.left">
+<refmeta>
+<refentrytitle>title.margin.left</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">length</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>title.margin.left</refname>
+<refpurpose>Adjust the left margin for titles</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="title.margin.left.frag">
+&lt;xsl:param name="title.margin.left"&gt;
+ &lt;xsl:choose&gt;
+ &lt;xsl:when test="$fop.extensions != 0"&gt;-4pc&lt;/xsl:when&gt;
+ &lt;xsl:when test="$passivetex.extensions != 0"&gt;0pt&lt;/xsl:when&gt;
+ &lt;xsl:otherwise&gt;0pt&lt;/xsl:otherwise&gt;
+ &lt;/xsl:choose&gt;
+&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>This parameter provides
+the means of adjusting the left margin for titles
+when the XSL-FO processor being used is
+an old version of FOP (0.25 and earlier).
+It is only useful when the <parameter>fop.extensions</parameter>
+is nonzero.</para>
+
+<para>The left margin of the body region
+is calculated to include this space,
+and titles are outdented to the left outside
+the body region by this amount,
+effectively leaving titles at the intended left margin
+and the body text indented.
+Currently this method is only used for old FOP because
+it cannot properly use the <parameter>body.start.indent</parameter>
+parameter.
+</para>
+<para>
+The default value when the <parameter>fop.extensions</parameter>
+parameter is nonzero is -4pc, which means the
+body text is indented 4 picas relative to
+the titles.
+The default value when the <parameter>fop.extensions</parameter>
+parameter equals zero is 0pt, and
+the body indent should instead be specified
+using the <parameter>body.start.indent</parameter>
+parameter.
+</para>
+<para>
+If you set the value to zero, be sure to still include
+a unit indicator such as <literal>0pt</literal>, or
+the FO processor will report errors.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="draft.mode">
+<refmeta>
+<refentrytitle>draft.mode</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">list</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">no</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">yes</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">maybe</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>draft.mode</refname>
+<refpurpose>Select draft mode</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="draft.mode.frag">
+&lt;xsl:param name="draft.mode"&gt;no&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Selects draft mode. If <parameter>draft.mode</parameter> is
+<quote><literal>yes</literal></quote>, the entire document will be treated
+as a draft. If it is <quote><literal>no</literal></quote>, the entire document
+will be treated as a final copy. If it is <quote><literal>maybe</literal></quote>,
+individual sections will be treated as draft or final independently, depending
+on how their <literal>status</literal> attribute is set.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="draft.watermark.image">
+<refmeta>
+<refentrytitle>draft.watermark.image</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">uri</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>draft.watermark.image</refname>
+<refpurpose>The URI of the image to be used for draft watermarks</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="draft.watermark.image.frag">
+&lt;xsl:param name="draft.watermark.image"&gt;images/draft.png&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The image to be used for draft watermarks.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="headers.on.blank.pages">
+<refmeta>
+<refentrytitle>headers.on.blank.pages</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>headers.on.blank.pages</refname>
+<refpurpose>Put headers on blank pages?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="headers.on.blank.pages.frag">
+&lt;xsl:param name="headers.on.blank.pages" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, headers will be placed on blank pages.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="footers.on.blank.pages">
+<refmeta>
+<refentrytitle>footers.on.blank.pages</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>footers.on.blank.pages</refname>
+<refpurpose>Put footers on blank pages?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="footers.on.blank.pages.frag">
+&lt;xsl:param name="footers.on.blank.pages" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, footers will be placed on blank pages.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="header.rule">
+<refmeta>
+<refentrytitle>header.rule</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>header.rule</refname>
+<refpurpose>Rule under headers?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="header.rule.frag">
+&lt;xsl:param name="header.rule" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, a rule will be drawn below the page headers.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="footer.rule">
+<refmeta>
+<refentrytitle>footer.rule</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>footer.rule</refname>
+<refpurpose>Rule over footers?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="footer.rule.frag">
+&lt;xsl:param name="footer.rule" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, a rule will be drawn above the page footers.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="header.column.widths">
+<refmeta>
+<refentrytitle>header.column.widths</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>header.column.widths</refname>
+<refpurpose>Specify relative widths of header areas</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv><programlisting xml:id="header.column.widths.frag">
+&lt;xsl:param name="header.column.widths"&gt;1 1 1&lt;/xsl:param&gt;
+</programlisting></refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Page headers in print output use a three column table
+to position text at the left, center, and right side of
+the header on the page.
+This parameter lets you specify the relative sizes of the
+three columns. The default value is
+"1 1 1".</para>
+
+<para>The parameter value must be three numbers, separated
+by white space. The first number represents the relative
+width of the inside header for
+double-sided output. The second number is the relative
+width of the center header. The third number is the
+relative width of the outside header for
+double-sided output.
+</para>
+<para>For single-sided output, the first number is the
+relative width of left header for left-to-right
+text direction, or the right header for right-to-left
+text direction.
+The third number is the
+relative width of right header for left-to-right
+text direction, or the left header for right-to-left
+text direction.</para>
+
+<para>The numbers are used to specify the column widths
+for the table that makes up the header area.
+In the FO output, this looks like:
+</para>
+
+<programlisting>
+&lt;fo:table-column column-number="1"
+ column-width="proportional-column-width(1)"/&gt;
+</programlisting>
+
+<para>
+The <literal>proportional-column-width()</literal>
+function computes a column width by dividing its
+argument by the total of the arguments for all the columns, and
+then multiplying the result by the width of the whole table
+(assuming all the column specs use the function).
+Its argument can be any positive integer or floating point number.
+Zero is an acceptable value, although some FO processors
+may warn about it, in which case using a very small number might
+be more satisfactory.
+</para>
+
+<para>For example, the value "1 2 1" means the center
+header should have twice the width of the other areas.
+A value of "0 0 1" means the entire header area
+is reserved for the right (or outside) header text.
+Note that to keep the center area centered on
+the page, the left and right values must be
+the same. A specification like "1 2 3" means the
+center area is no longer centered on the page
+since the right area is three times the width of the left area.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="footer.column.widths">
+<refmeta>
+<refentrytitle>footer.column.widths</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>footer.column.widths</refname>
+<refpurpose>Specify relative widths of footer areas</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv><programlisting xml:id="footer.column.widths.frag">
+&lt;xsl:param name="footer.column.widths"&gt;1 1 1&lt;/xsl:param&gt;
+</programlisting></refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Page footers in print output use a three column table
+to position text at the left, center, and right side of
+the footer on the page.
+This parameter lets you specify the relative sizes of the
+three columns. The default value is
+"1 1 1".</para>
+
+<para>The parameter value must be three numbers, separated
+by white space. The first number represents the relative
+width of the inside footer for
+double-sided output. The second number is the relative
+width of the center footer. The third number is the
+relative width of the outside footer for
+double-sided output.
+</para>
+<para>For single-sided output, the first number is the
+relative width of left footer for left-to-right
+text direction, or the right footer for right-to-left
+text direction.
+The third number is the
+relative width of right footer for left-to-right
+text direction, or the left footer for right-to-left
+text direction.</para>
+
+<para>The numbers are used to specify the column widths
+for the table that makes up the footer area.
+In the FO output, this looks like:
+</para>
+
+<programlisting>
+&lt;fo:table-column column-number="1"
+ column-width="proportional-column-width(1)"/&gt;
+</programlisting>
+
+<para>
+The <literal>proportional-column-width()</literal>
+function computes a column width by dividing its
+argument by the total of the arguments for all the columns, and
+then multiplying the result by the width of the whole table
+(assuming all the column specs use the function).
+Its argument can be any positive integer or floating point number.
+Zero is an acceptable value, although some FO processors
+may warn about it, in which case using a very small number might
+be more satisfactory.
+</para>
+
+<para>For example, the value "1 2 1" means the center
+footer should have twice the width of the other areas.
+A value of "0 0 1" means the entire footer area
+is reserved for the right (or outside) footer text.
+Note that to keep the center area centered on
+the page, the left and right values must be
+the same. A specification like "1 2 3" means the
+center area is no longer centered on the page
+since the right area is three times the width of the left area.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="header.table.properties">
+<refmeta>
+<refentrytitle>header.table.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>header.table.properties</refname>
+<refpurpose>Apply properties to the header layout table</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="header.table.properties.frag">
+&lt;xsl:attribute-set name="header.table.properties"&gt;
+ &lt;xsl:attribute name="table-layout"&gt;fixed&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="width"&gt;100%&lt;/xsl:attribute&gt;
+&lt;/xsl:attribute-set&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Properties applied to the table that lays out the page header.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="header.table.height">
+<refmeta>
+<refentrytitle>header.table.height</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">length</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>header.table.height</refname>
+<refpurpose>Specify the minimum height of the table containing the running page headers</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv><programlisting xml:id="header.table.height.frag">
+&lt;xsl:param name="header.table.height"&gt;14pt&lt;/xsl:param&gt;
+</programlisting></refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Page headers in print output use a three column table
+to position text at the left, center, and right side of
+the header on the page.
+This parameter lets you specify the minimum height
+of the single row in the table.
+Since this specifies only the minimum height,
+the table should automatically grow to fit taller content.
+The default value is "14pt".</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="footer.table.properties">
+<refmeta>
+<refentrytitle>footer.table.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>footer.table.properties</refname>
+<refpurpose>Apply properties to the footer layout table</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="footer.table.properties.frag">
+&lt;xsl:attribute-set name="footer.table.properties"&gt;
+ &lt;xsl:attribute name="table-layout"&gt;fixed&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="width"&gt;100%&lt;/xsl:attribute&gt;
+&lt;/xsl:attribute-set&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Properties applied to the table that lays out the page footer.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="footer.table.height">
+<refmeta>
+<refentrytitle>footer.table.height</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">length</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>footer.table.height</refname>
+<refpurpose>Specify the minimum height of the table containing the running page footers</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv><programlisting xml:id="footer.table.height.frag">
+&lt;xsl:param name="footer.table.height"&gt;14pt&lt;/xsl:param&gt;
+</programlisting></refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Page footers in print output use a three column table
+to position text at the left, center, and right side of
+the footer on the page.
+This parameter lets you specify the minimum height
+of the single row in the table.
+Since this specifies only the minimum height,
+the table should automatically grow to fit taller content.
+The default value is "14pt".</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="header.content.properties">
+<refmeta>
+<refentrytitle>header.content.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>header.content.properties</refname>
+<refpurpose>Properties of page header content</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="header.content.properties.frag">
+&lt;xsl:attribute-set name="header.content.properties"&gt;
+ &lt;xsl:attribute name="font-family"&gt;
+ &lt;xsl:value-of select="$body.fontset"&gt;&lt;/xsl:value-of&gt;
+ &lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="margin-left"&gt;
+ &lt;xsl:value-of select="$title.margin.left"&gt;&lt;/xsl:value-of&gt;
+ &lt;/xsl:attribute&gt;
+&lt;/xsl:attribute-set&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Properties of page header content.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="footer.content.properties">
+<refmeta>
+<refentrytitle>footer.content.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>footer.content.properties</refname>
+<refpurpose>Properties of page footer content</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="footer.content.properties.frag">
+&lt;xsl:attribute-set name="footer.content.properties"&gt;
+ &lt;xsl:attribute name="font-family"&gt;
+ &lt;xsl:value-of select="$body.fontset"&gt;&lt;/xsl:value-of&gt;
+ &lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="margin-left"&gt;
+ &lt;xsl:value-of select="$title.margin.left"&gt;&lt;/xsl:value-of&gt;
+ &lt;/xsl:attribute&gt;
+&lt;/xsl:attribute-set&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Properties of page footer content.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="marker.section.level">
+<refmeta>
+<refentrytitle>marker.section.level</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">integer</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>marker.section.level</refname>
+<refpurpose>Control depth of sections shown in running headers or footers</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="marker.section.level.frag">
+&lt;xsl:param name="marker.section.level"&gt;2&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The <parameter>marker.section.level</parameter> parameter
+controls the depth of section levels that may be displayed
+in running headers and footers. For example, if the value
+is 2 (the default), then titles from <tag>sect1</tag> and
+<tag>sect2</tag> or equivalent <tag>section</tag>
+elements are candidates for use in running headers and
+footers.
+</para>
+<para>Each candidate title is marked in the FO output with a
+<tag>&lt;fo:marker marker-class-name="section.head.marker"&gt;</tag>
+element.
+</para>
+<para>In order for such titles to appear in headers
+or footers, the <literal>header.content</literal>
+or <literal>footer.content</literal> template
+must be customized to retrieve the marker using
+an output element such as:
+</para>
+<programlisting>
+&lt;fo:retrieve-marker retrieve-class-name="section.head.marker"
+ retrieve-position="first-including-carryover"
+ retrieve-boundary="page-sequence"/&gt;
+</programlisting>
+
+
+</refsection>
+</refentry>
+
+</reference>
+<reference xml:id="fonts"><title>Font Families</title>
+<refentry version="5.0" xml:id="body.font.family">
+<refmeta>
+<refentrytitle>body.font.family</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">list</refmiscinfo>
+<refmiscinfo class="other" otherclass="list-type">open</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">serif</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">sans-serif</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">monospace</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>body.font.family</refname>
+<refpurpose>The default font family for body text</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="body.font.family.frag">
+&lt;xsl:param name="body.font.family"&gt;serif&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The body font family is the default font used for text in the page body.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="dingbat.font.family">
+<refmeta>
+<refentrytitle>dingbat.font.family</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">list</refmiscinfo>
+<refmiscinfo class="other" otherclass="list-type">open</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">serif</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">sans-serif</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">monospace</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>dingbat.font.family</refname>
+<refpurpose>The font family for copyright, quotes, and other symbols</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="dingbat.font.family.frag">
+&lt;xsl:param name="dingbat.font.family"&gt;serif&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The dingbat font family is used for dingbats. If it is defined
+as the empty string, no font change is effected around dingbats.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="monospace.font.family">
+<refmeta>
+<refentrytitle>monospace.font.family</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>monospace.font.family</refname>
+<refpurpose>The default font family for monospace environments</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="monospace.font.family.frag">
+&lt;xsl:param name="monospace.font.family"&gt;monospace&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The monospace font family is used for verbatim environments
+(program listings, screens, etc.).
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="sans.font.family">
+<refmeta>
+<refentrytitle>sans.font.family</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>sans.font.family</refname>
+<refpurpose>The default sans-serif font family</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="sans.font.family.frag">
+&lt;xsl:param name="sans.font.family"&gt;sans-serif&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The default sans-serif font family. At the present, this isn't
+actually used by the stylesheets.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="title.font.family">
+<refmeta>
+<refentrytitle>title.font.family</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">list</refmiscinfo>
+<refmiscinfo class="other" otherclass="list-type">open</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">serif</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">sans-serif</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">monospace</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>title.font.family</refname>
+<refpurpose>The default font family for titles</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="title.font.family.frag">
+&lt;xsl:param name="title.font.family"&gt;sans-serif&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The title font family is used for titles (chapter, section, figure,
+etc.)
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="symbol.font.family">
+<refmeta>
+<refentrytitle>symbol.font.family</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">list</refmiscinfo>
+<refmiscinfo class="other" otherclass="list-type">open</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">serif</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">sans-serif</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">monospace</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>symbol.font.family</refname>
+<refpurpose>The font families to be searched for symbols outside
+ of the body font</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="symbol.font.family.frag">
+&lt;xsl:param name="symbol.font.family"&gt;Symbol,ZapfDingbats&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>A typical body or title font does not contain all
+the character glyphs that DocBook supports. This parameter
+specifies additional fonts that should be searched for
+special characters not in the normal font.
+These symbol font names are automatically appended
+to the body or title font family name when fonts
+are specified in a
+<tag class="attribute">font-family</tag>
+property in the FO output.
+</para>
+<para>The symbol font names should be entered as a
+comma-separated list. The default value is
+<literal>Symbol,ZapfDingbats</literal>.
+</para>
+
+</refsection>
+</refentry>
+
+</reference>
+<reference xml:id="propsets"><title>Property Sets</title>
+<refentry version="5.0" xml:id="formal.object.properties">
+<refmeta>
+<refentrytitle>formal.object.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>formal.object.properties</refname>
+<refpurpose>Properties associated with a formal object such as a figure, or other component that has a title</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="formal.object.properties.frag">
+&lt;xsl:attribute-set name="formal.object.properties"&gt;
+ &lt;xsl:attribute name="space-before.minimum"&gt;0.5em&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="space-before.optimum"&gt;1em&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="space-before.maximum"&gt;2em&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="space-after.minimum"&gt;0.5em&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="space-after.optimum"&gt;1em&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="space-after.maximum"&gt;2em&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="keep-together.within-column"&gt;always&lt;/xsl:attribute&gt;
+&lt;/xsl:attribute-set&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The styling for formal objects in docbook. Specify the spacing
+before and after the object.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="formal.title.properties">
+<refmeta>
+<refentrytitle>formal.title.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>formal.title.properties</refname>
+<refpurpose>Style the title element of formal object such as a figure.</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="formal.title.properties.frag">
+&lt;xsl:attribute-set name="formal.title.properties" use-attribute-sets="normal.para.spacing"&gt;
+ &lt;xsl:attribute name="font-weight"&gt;bold&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="font-size"&gt;
+ &lt;xsl:value-of select="$body.font.master * 1.2"&gt;&lt;/xsl:value-of&gt;
+ &lt;xsl:text&gt;pt&lt;/xsl:text&gt;
+ &lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="hyphenate"&gt;false&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="space-after.minimum"&gt;0.4em&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="space-after.optimum"&gt;0.6em&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="space-after.maximum"&gt;0.8em&lt;/xsl:attribute&gt;
+&lt;/xsl:attribute-set&gt;
+</programlisting>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+<para>Specify how the title should be styled. Specify the font size and weight of the title of the formal object.</para>
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="informal.object.properties">
+<refmeta>
+<refentrytitle>informal.object.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>informal.object.properties</refname>
+<refpurpose>Properties associated with an informal (untitled) object, such as an informalfigure</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="informal.object.properties.frag">&lt;xsl:attribute-set name="informal.object.properties"&gt;
+ &lt;xsl:attribute name="space-before.minimum"&gt;0.5em&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="space-before.optimum"&gt;1em&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="space-before.maximum"&gt;2em&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="space-after.minimum"&gt;0.5em&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="space-after.optimum"&gt;1em&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="space-after.maximum"&gt;2em&lt;/xsl:attribute&gt;
+&lt;/xsl:attribute-set&gt;</programlisting>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+<para>The styling for informal objects in docbook. Specify the spacing before and after the object.</para>
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="monospace.properties">
+<refmeta>
+<refentrytitle>monospace.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>monospace.properties</refname>
+<refpurpose>Properties of monospaced content</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="monospace.properties.frag">
+&lt;xsl:attribute-set name="monospace.properties"&gt;
+ &lt;xsl:attribute name="font-family"&gt;
+ &lt;xsl:value-of select="$monospace.font.family"&gt;&lt;/xsl:value-of&gt;
+ &lt;/xsl:attribute&gt;
+&lt;/xsl:attribute-set&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies the font name for monospaced output. This property set
+used to set the font-size as well, but that doesn't work very well
+when different fonts are used (as they are in titles and paragraphs,
+for example).</para>
+
+<para>If you want to set the font-size in a customization layer, it's
+probably going to be more appropriate to set font-size-adjust, if your
+formatter supports it.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="verbatim.properties">
+<refmeta>
+<refentrytitle>verbatim.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>verbatim.properties</refname>
+<refpurpose>Properties associated with verbatim text</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="verbatim.properties.frag">
+&lt;xsl:attribute-set name="verbatim.properties"&gt;
+ &lt;xsl:attribute name="space-before.minimum"&gt;0.8em&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="space-before.optimum"&gt;1em&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="space-before.maximum"&gt;1.2em&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="space-after.minimum"&gt;0.8em&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="space-after.optimum"&gt;1em&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="space-after.maximum"&gt;1.2em&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="hyphenate"&gt;false&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="wrap-option"&gt;no-wrap&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="white-space-collapse"&gt;false&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="white-space-treatment"&gt;preserve&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="linefeed-treatment"&gt;preserve&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="text-align"&gt;start&lt;/xsl:attribute&gt;
+&lt;/xsl:attribute-set&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+<para>This attribute set is used on all verbatim environments.</para>
+</refsection>
+
+</refentry>
+
+<refentry version="5.0" xml:id="monospace.verbatim.properties">
+<refmeta>
+<refentrytitle>monospace.verbatim.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>monospace.verbatim.properties</refname>
+<refpurpose>What font and size do you want for monospaced content?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="monospace.verbatim.properties.frag">
+&lt;xsl:attribute-set name="monospace.verbatim.properties" use-attribute-sets="verbatim.properties monospace.properties"&gt;
+ &lt;xsl:attribute name="text-align"&gt;start&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="wrap-option"&gt;no-wrap&lt;/xsl:attribute&gt;
+&lt;/xsl:attribute-set&gt;
+</programlisting>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+<para>Specify the font name and size you want for monospaced output</para>
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="sidebar.properties">
+<refmeta>
+<refentrytitle>sidebar.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>sidebar.properties</refname>
+<refpurpose>Attribute set for sidebar properties</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="sidebar.properties.frag">
+&lt;xsl:attribute-set name="sidebar.properties" use-attribute-sets="formal.object.properties"&gt;
+ &lt;xsl:attribute name="border-style"&gt;solid&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="border-width"&gt;1pt&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="border-color"&gt;black&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="background-color"&gt;#DDDDDD&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="padding-start"&gt;12pt&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="padding-end"&gt;12pt&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="padding-top"&gt;6pt&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="padding-bottom"&gt;6pt&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="margin-{$direction.align.start}"&gt;0pt&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="margin-{$direction.align.end}"&gt;0pt&lt;/xsl:attribute&gt;
+&lt;!--
+ &lt;xsl:attribute name="margin-top"&gt;6pt&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="margin-bottom"&gt;6pt&lt;/xsl:attribute&gt;
+--&gt;
+&lt;/xsl:attribute-set&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The styling for sidebars.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="sidebar.title.properties">
+<refmeta>
+<refentrytitle>sidebar.title.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>sidebar.title.properties</refname>
+<refpurpose>Attribute set for sidebar titles</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="sidebar.title.properties.frag">
+&lt;xsl:attribute-set name="sidebar.title.properties"&gt;
+ &lt;xsl:attribute name="font-weight"&gt;bold&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="hyphenate"&gt;false&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="text-align"&gt;start&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="keep-with-next.within-column"&gt;always&lt;/xsl:attribute&gt;
+&lt;/xsl:attribute-set&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The styling for sidebars titles.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="sidebar.float.type">
+<refmeta>
+<refentrytitle>sidebar.float.type</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">list</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">none</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">before</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">left</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">start</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">right</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">end</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">inside</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">outside</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>sidebar.float.type</refname>
+<refpurpose>Select type of float for sidebar elements</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="sidebar.float.type.frag">
+&lt;xsl:param name="sidebar.float.type"&gt;none&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Selects the type of float for sidebar elements.
+</para>
+<itemizedlist>
+<listitem>
+<para>If <parameter>sidebar.float.type</parameter> is
+<quote><literal>none</literal></quote>, then
+no float is used.
+</para>
+</listitem>
+<listitem>
+<para>If <parameter>sidebar.float.type</parameter> is
+<quote><literal>before</literal></quote>, then
+the float appears at the top of the page. On some processors,
+that may be the next page rather than the current page.
+</para>
+</listitem>
+
+<listitem>
+<para>If <parameter>sidebar.float.type</parameter> is
+<quote><literal>left</literal></quote>,
+then a left side float is used.
+</para>
+</listitem>
+
+<listitem>
+<para>If <parameter>sidebar.float.type</parameter> is
+<quote><literal>start</literal></quote>,
+then when the text direction is left-to-right a left side float is used.
+When the text direction is right-to-left, a right side float is used.
+</para>
+</listitem>
+
+<listitem>
+<para>If <parameter>sidebar.float.type</parameter> is
+<quote><literal>right</literal></quote>,
+then a right side float is used.
+</para>
+</listitem>
+
+<listitem>
+<para>If <parameter>sidebar.float.type</parameter> is
+<quote><literal>end</literal></quote>,
+then when the text direction is left-to-right a right side float is used.
+When the text direction is right-to-left, a left side float is used.
+</para>
+</listitem>
+
+<listitem>
+<para>If your XSL-FO processor supports floats positioned on the
+<quote><literal>inside</literal></quote> or
+<quote><literal>outside</literal></quote>
+of double-sided pages, then you have those two
+options for side floats as well.
+</para>
+</listitem>
+</itemizedlist>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="sidebar.float.width">
+<refmeta>
+<refentrytitle>sidebar.float.width</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">length</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>sidebar.float.width</refname>
+<refpurpose>Set the default width for sidebars</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="sidebar.float.width.frag">
+&lt;xsl:param name="sidebar.float.width"&gt;1in&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Sets the default width for sidebars when used as a side float.
+The width determines the degree to which the sidebar block intrudes into
+the text area.
+</para>
+<para>If <parameter>sidebar.float.type</parameter> is
+<quote><literal>before</literal></quote> or
+<quote><literal>none</literal></quote>, then
+this parameter is ignored.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="margin.note.properties">
+<refmeta>
+<refentrytitle>margin.note.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>margin.note.properties</refname>
+<refpurpose>Attribute set for margin.note properties</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="margin.note.properties.frag">
+&lt;xsl:attribute-set name="margin.note.properties"&gt;
+ &lt;xsl:attribute name="font-size"&gt;90%&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="text-align"&gt;start&lt;/xsl:attribute&gt;
+&lt;/xsl:attribute-set&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The styling for margin notes.
+By default, margin notes are not implemented for any
+element. A stylesheet customization is needed to make
+use of this attribute-set.</para>
+
+<para>You can use a template named <quote>floater</quote>
+to create the customization.
+That template can create side floats by specifying the
+content and characteristics as template parameters.
+</para>
+
+<para>For example:</para>
+<programlisting>&lt;xsl:template match="para[@role='marginnote']"&gt;
+ &lt;xsl:call-template name="floater"&gt;
+ &lt;xsl:with-param name="position"&gt;
+ &lt;xsl:value-of select="$margin.note.float.type"/&gt;
+ &lt;/xsl:with-param&gt;
+ &lt;xsl:with-param name="width"&gt;
+ &lt;xsl:value-of select="$margin.note.width"/&gt;
+ &lt;/xsl:with-param&gt;
+ &lt;xsl:with-param name="content"&gt;
+ &lt;xsl:apply-imports/&gt;
+ &lt;/xsl:with-param&gt;
+ &lt;/xsl:call-template&gt;
+&lt;/xsl:template&gt;</programlisting>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="margin.note.title.properties">
+<refmeta>
+<refentrytitle>margin.note.title.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>margin.note.title.properties</refname>
+<refpurpose>Attribute set for margin note titles</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="margin.note.title.properties.frag">
+&lt;xsl:attribute-set name="margin.note.title.properties"&gt;
+ &lt;xsl:attribute name="font-weight"&gt;bold&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="hyphenate"&gt;false&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="text-align"&gt;start&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="keep-with-next.within-column"&gt;always&lt;/xsl:attribute&gt;
+&lt;/xsl:attribute-set&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The styling for margin note titles.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="margin.note.float.type">
+<refmeta>
+<refentrytitle>margin.note.float.type</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">list</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">none</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">before</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">left</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">start</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">right</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">end</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">inside</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">outside</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>margin.note.float.type</refname>
+<refpurpose>Select type of float for margin note customizations</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="margin.note.float.type.frag">
+&lt;xsl:param name="margin.note.float.type"&gt;none&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Selects the type of float for margin notes.
+DocBook does not define a margin note element, so this
+feature must be implemented as a customization of the stylesheet.
+See <parameter>margin.note.properties</parameter> for
+an example.
+</para>
+<itemizedlist>
+<listitem>
+<para>If <parameter>margin.note.float.type</parameter> is
+<quote><literal>none</literal></quote>, then
+no float is used.
+</para>
+</listitem>
+<listitem>
+<para>If <parameter>margin.note.float.type</parameter> is
+<quote><literal>before</literal></quote>, then
+the float appears at the top of the page. On some processors,
+that may be the next page rather than the current page.
+</para>
+</listitem>
+<listitem>
+<para>If <parameter>margin.note.float.type</parameter> is
+<quote><literal>left</literal></quote> or
+<quote><literal>start</literal></quote>, then
+a left side float is used.
+</para>
+</listitem>
+<listitem>
+<para>If <parameter>margin.note.float.type</parameter> is
+<quote><literal>right</literal></quote> or
+<quote><literal>end</literal></quote>, then
+a right side float is used.
+</para>
+</listitem>
+<listitem>
+<para>If your XSL-FO processor supports floats positioned on the
+<quote><literal>inside</literal></quote> or
+<quote><literal>outside</literal></quote>
+of double-sided pages, then you have those two
+options for side floats as well.
+</para>
+</listitem>
+</itemizedlist>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="margin.note.width">
+<refmeta>
+<refentrytitle>margin.note.width</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">length</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>margin.note.width</refname>
+<refpurpose>Set the default width for margin notes</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="margin.note.width.frag">
+&lt;xsl:param name="margin.note.width"&gt;1in&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Sets the default width for margin notes when used as a side
+float. The width determines the degree to which the margin note block
+intrudes into the text area.
+</para>
+<para>If <parameter>margin.note.float.type</parameter> is
+<quote><literal>before</literal></quote> or
+<quote><literal>none</literal></quote>, then
+this parameter is ignored.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="component.title.properties">
+<refmeta>
+<refentrytitle>component.title.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>component.title.properties</refname>
+<refpurpose>Properties for component titles</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="component.title.properties.frag">
+&lt;xsl:attribute-set name="component.title.properties"&gt;
+ &lt;xsl:attribute name="keep-with-next.within-column"&gt;always&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="space-before.optimum"&gt;&lt;xsl:value-of select="concat($body.font.master, 'pt')"&gt;&lt;/xsl:value-of&gt;&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="space-before.minimum"&gt;&lt;xsl:value-of select="concat($body.font.master, 'pt * 0.8')"&gt;&lt;/xsl:value-of&gt;&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="space-before.maximum"&gt;&lt;xsl:value-of select="concat($body.font.master, 'pt * 1.2')"&gt;&lt;/xsl:value-of&gt;&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="hyphenate"&gt;false&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="text-align"&gt;
+ &lt;xsl:choose&gt;
+ &lt;xsl:when test="((parent::article | parent::articleinfo | parent::info/parent::article) and not(ancestor::book) and not(self::bibliography)) or (parent::slides | parent::slidesinfo)"&gt;center&lt;/xsl:when&gt;
+ &lt;xsl:otherwise&gt;start&lt;/xsl:otherwise&gt;
+ &lt;/xsl:choose&gt;
+ &lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="start-indent"&gt;&lt;xsl:value-of select="$title.margin.left"&gt;&lt;/xsl:value-of&gt;&lt;/xsl:attribute&gt;
+&lt;/xsl:attribute-set&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The properties common to all component titles.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="component.titlepage.properties">
+<refmeta>
+<refentrytitle>component.titlepage.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>component.titlepage.properties</refname>
+<refpurpose>Properties for component titlepages</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="component.titlepage.properties.frag">
+&lt;xsl:attribute-set name="component.titlepage.properties"&gt;
+&lt;/xsl:attribute-set&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The properties that are applied to the outer block containing
+all the component title page information.
+Its main use is to set a <literal>span="all"</literal>
+property on the block that is a direct child of the flow.</para>
+
+<para>This attribute-set also applies to index titlepages. It is empty by default.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="section.title.properties">
+<refmeta>
+<refentrytitle>section.title.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>section.title.properties</refname>
+<refpurpose>Properties for section titles</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="section.title.properties.frag">
+&lt;xsl:attribute-set name="section.title.properties"&gt;
+ &lt;xsl:attribute name="font-family"&gt;
+ &lt;xsl:value-of select="$title.font.family"&gt;&lt;/xsl:value-of&gt;
+ &lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="font-weight"&gt;bold&lt;/xsl:attribute&gt;
+ &lt;!-- font size is calculated dynamically by section.heading template --&gt;
+ &lt;xsl:attribute name="keep-with-next.within-column"&gt;always&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="space-before.minimum"&gt;0.8em&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="space-before.optimum"&gt;1.0em&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="space-before.maximum"&gt;1.2em&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="text-align"&gt;start&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="start-indent"&gt;&lt;xsl:value-of select="$title.margin.left"&gt;&lt;/xsl:value-of&gt;&lt;/xsl:attribute&gt;
+&lt;/xsl:attribute-set&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The properties common to all section titles.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="section.title.level1.properties">
+<refmeta>
+<refentrytitle>section.title.level1.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>section.title.level1.properties</refname>
+<refpurpose>Properties for level-1 section titles</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="section.title.level1.properties.frag">
+&lt;xsl:attribute-set name="section.title.level1.properties"&gt;
+ &lt;xsl:attribute name="font-size"&gt;
+ &lt;xsl:value-of select="$body.font.master * 2.0736"&gt;&lt;/xsl:value-of&gt;
+ &lt;xsl:text&gt;pt&lt;/xsl:text&gt;
+ &lt;/xsl:attribute&gt;
+&lt;/xsl:attribute-set&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The properties of level-1 section titles.</para>
+
+</refsection>
+</refentry>
+
+
+<refentry version="5.0" xml:id="section.title.level2.properties">
+<refmeta>
+<refentrytitle>section.title.level2.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>section.title.level2.properties</refname>
+<refpurpose>Properties for level-2 section titles</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="section.title.level2.properties.frag">
+&lt;xsl:attribute-set name="section.title.level2.properties"&gt;
+ &lt;xsl:attribute name="font-size"&gt;
+ &lt;xsl:value-of select="$body.font.master * 1.728"&gt;&lt;/xsl:value-of&gt;
+ &lt;xsl:text&gt;pt&lt;/xsl:text&gt;
+ &lt;/xsl:attribute&gt;
+&lt;/xsl:attribute-set&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The properties of level-2 section titles.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="section.title.level3.properties">
+<refmeta>
+<refentrytitle>section.title.level3.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>section.title.level3.properties</refname>
+<refpurpose>Properties for level-3 section titles</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="section.title.level3.properties.frag">
+&lt;xsl:attribute-set name="section.title.level3.properties"&gt;
+ &lt;xsl:attribute name="font-size"&gt;
+ &lt;xsl:value-of select="$body.font.master * 1.44"&gt;&lt;/xsl:value-of&gt;
+ &lt;xsl:text&gt;pt&lt;/xsl:text&gt;
+ &lt;/xsl:attribute&gt;
+&lt;/xsl:attribute-set&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The properties of level-3 section titles.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="section.title.level4.properties">
+<refmeta>
+<refentrytitle>section.title.level4.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>section.title.level4.properties</refname>
+<refpurpose>Properties for level-4 section titles</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="section.title.level4.properties.frag">
+&lt;xsl:attribute-set name="section.title.level4.properties"&gt;
+ &lt;xsl:attribute name="font-size"&gt;
+ &lt;xsl:value-of select="$body.font.master * 1.2"&gt;&lt;/xsl:value-of&gt;
+ &lt;xsl:text&gt;pt&lt;/xsl:text&gt;
+ &lt;/xsl:attribute&gt;
+&lt;/xsl:attribute-set&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The properties of level-4 section titles.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="section.title.level5.properties">
+<refmeta>
+<refentrytitle>section.title.level5.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>section.title.level5.properties</refname>
+<refpurpose>Properties for level-5 section titles</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="section.title.level5.properties.frag">
+&lt;xsl:attribute-set name="section.title.level5.properties"&gt;
+ &lt;xsl:attribute name="font-size"&gt;
+ &lt;xsl:value-of select="$body.font.master"&gt;&lt;/xsl:value-of&gt;
+ &lt;xsl:text&gt;pt&lt;/xsl:text&gt;
+ &lt;/xsl:attribute&gt;
+&lt;/xsl:attribute-set&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The properties of level-5 section titles.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="section.title.level6.properties">
+<refmeta>
+<refentrytitle>section.title.level6.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>section.title.level6.properties</refname>
+<refpurpose>Properties for level-6 section titles</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="section.title.level6.properties.frag">
+&lt;xsl:attribute-set name="section.title.level6.properties"&gt;
+ &lt;xsl:attribute name="font-size"&gt;
+ &lt;xsl:value-of select="$body.font.master"&gt;&lt;/xsl:value-of&gt;
+ &lt;xsl:text&gt;pt&lt;/xsl:text&gt;
+ &lt;/xsl:attribute&gt;
+&lt;/xsl:attribute-set&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The properties of level-6 section titles. This property set is actually
+used for all titles below level 5.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="section.properties">
+<refmeta>
+<refentrytitle>section.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>section.properties</refname>
+<refpurpose>Properties for all section levels</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="section.properties.frag">
+&lt;xsl:attribute-set name="section.properties"&gt;
+&lt;/xsl:attribute-set&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The properties that apply to the containing
+block of all section levels, and therefore apply to
+the whole section.
+This attribute set is inherited by the
+more specific attribute sets such as
+<tag>section.level1.properties</tag>.
+The default is empty.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="section.level1.properties">
+<refmeta>
+<refentrytitle>section.level1.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>section.level1.properties</refname>
+<refpurpose>Properties for level-1 sections</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="section.level1.properties.frag">
+&lt;xsl:attribute-set name="section.level1.properties" use-attribute-sets="section.properties"&gt;
+&lt;/xsl:attribute-set&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The properties that apply to the containing
+block of a level-1 section, and therefore apply to
+the whole section. This includes <tag>sect1</tag>
+elements and <tag>section</tag> elements at level 1.
+</para>
+
+<para>For example, you could start each level-1 section on
+a new page by using:</para>
+<programlisting>&lt;xsl:attribute-set name="section.level1.properties"&gt;
+ &lt;xsl:attribute name="break-before"&gt;page&lt;/xsl:attribute&gt;
+&lt;/xsl:attribute-set&gt;
+</programlisting>
+
+<para>This attribute set inherits attributes from the
+general <tag>section.properties</tag> attribute set.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="section.level2.properties">
+<refmeta>
+<refentrytitle>section.level2.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>section.level2.properties</refname>
+<refpurpose>Properties for level-2 sections</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="section.level2.properties.frag">
+&lt;xsl:attribute-set name="section.level2.properties" use-attribute-sets="section.properties"&gt;
+&lt;/xsl:attribute-set&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The properties that apply to the containing
+block of a level-2 section, and therefore apply to
+the whole section. This includes <tag>sect2</tag>
+elements and <tag>section</tag> elements at level 2.
+</para>
+
+<para>For example, you could start each level-2 section on
+a new page by using:</para>
+<programlisting>&lt;xsl:attribute-set name="section.level2.properties"&gt;
+ &lt;xsl:attribute name="break-before"&gt;page&lt;/xsl:attribute&gt;
+&lt;/xsl:attribute-set&gt;
+</programlisting>
+
+<para>This attribute set inherits attributes from the
+general <tag>section.properties</tag> attribute set.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="section.level3.properties">
+<refmeta>
+<refentrytitle>section.level3.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>section.level3.properties</refname>
+<refpurpose>Properties for level-3 sections</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="section.level3.properties.frag">
+&lt;xsl:attribute-set name="section.level3.properties" use-attribute-sets="section.properties"&gt;
+&lt;/xsl:attribute-set&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The properties that apply to the containing
+block of a level-3 section, and therefore apply to
+the whole section. This includes <tag>sect3</tag>
+elements and <tag>section</tag> elements at level 3.
+</para>
+
+<para>For example, you could start each level-3 section on
+a new page by using:</para>
+<programlisting>&lt;xsl:attribute-set name="section.level3.properties"&gt;
+ &lt;xsl:attribute name="break-before"&gt;page&lt;/xsl:attribute&gt;
+&lt;/xsl:attribute-set&gt;
+</programlisting>
+
+<para>This attribute set inherits attributes from the
+general <tag>section.properties</tag> attribute set.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="section.level4.properties">
+<refmeta>
+<refentrytitle>section.level4.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>section.level4.properties</refname>
+<refpurpose>Properties for level-4 sections</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="section.level4.properties.frag">
+&lt;xsl:attribute-set name="section.level4.properties" use-attribute-sets="section.properties"&gt;
+&lt;/xsl:attribute-set&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The properties that apply to the containing
+block of a level-4 section, and therefore apply to
+the whole section. This includes <tag>sect4</tag>
+elements and <tag>section</tag> elements at level 4.
+</para>
+
+<para>For example, you could start each level-4 section on
+a new page by using:</para>
+<programlisting>&lt;xsl:attribute-set name="section.level4.properties"&gt;
+ &lt;xsl:attribute name="break-before"&gt;page&lt;/xsl:attribute&gt;
+&lt;/xsl:attribute-set&gt;
+</programlisting>
+
+<para>This attribute set inherits attributes from the
+general <tag>section.properties</tag> attribute set.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="section.level5.properties">
+<refmeta>
+<refentrytitle>section.level5.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>section.level5.properties</refname>
+<refpurpose>Properties for level-5 sections</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="section.level5.properties.frag">
+&lt;xsl:attribute-set name="section.level5.properties" use-attribute-sets="section.properties"&gt;
+&lt;/xsl:attribute-set&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The properties that apply to the containing
+block of a level-5 section, and therefore apply to
+the whole section. This includes <tag>sect5</tag>
+elements and <tag>section</tag> elements at level 5.
+</para>
+
+<para>For example, you could start each level-5 section on
+a new page by using:</para>
+<programlisting>&lt;xsl:attribute-set name="section.level5.properties"&gt;
+ &lt;xsl:attribute name="break-before"&gt;page&lt;/xsl:attribute&gt;
+&lt;/xsl:attribute-set&gt;
+</programlisting>
+
+<para>This attribute set inherits attributes from the
+general <tag>section.properties</tag> attribute set.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="section.level6.properties">
+<refmeta>
+<refentrytitle>section.level6.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>section.level6.properties</refname>
+<refpurpose>Properties for level-6 sections</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="section.level6.properties.frag">
+&lt;xsl:attribute-set name="section.level6.properties" use-attribute-sets="section.properties"&gt;
+&lt;/xsl:attribute-set&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The properties that apply to the containing
+block of a level 6 or lower section, and therefore apply to
+the whole section. This includes
+<tag>section</tag> elements at level 6 and lower.
+</para>
+
+<para>For example, you could start each level-6 section on
+a new page by using:</para>
+<programlisting>&lt;xsl:attribute-set name="section.level6.properties"&gt;
+ &lt;xsl:attribute name="break-before"&gt;page&lt;/xsl:attribute&gt;
+&lt;/xsl:attribute-set&gt;
+</programlisting>
+
+<para>This attribute set inherits attributes from the
+general <tag>section.properties</tag> attribute set.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="figure.properties">
+<refmeta>
+<refentrytitle>figure.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>figure.properties</refname>
+<refpurpose>Properties associated with a figure</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="figure.properties.frag">
+&lt;xsl:attribute-set name="figure.properties" use-attribute-sets="formal.object.properties"&gt;&lt;/xsl:attribute-set&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The styling for figures.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="example.properties">
+<refmeta>
+<refentrytitle>example.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>example.properties</refname>
+<refpurpose>Properties associated with a example</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="example.properties.frag">
+&lt;xsl:attribute-set name="example.properties" use-attribute-sets="formal.object.properties"&gt;&lt;/xsl:attribute-set&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The styling for examples.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="equation.properties">
+<refmeta>
+<refentrytitle>equation.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>equation.properties</refname>
+<refpurpose>Properties associated with a equation</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="equation.properties.frag">
+&lt;xsl:attribute-set name="equation.properties" use-attribute-sets="formal.object.properties"&gt;&lt;/xsl:attribute-set&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The styling for equations.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="equation.number.properties">
+<refmeta>
+<refentrytitle>equation.number.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>equation.number.properties</refname>
+<refpurpose>Properties that apply to the <tag>fo:table-cell</tag> containing the number
+of an <tag>equation</tag> that does not have a title.</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="equation.number.properties.frag">&lt;xsl:attribute-set name="equation.number.properties"&gt;
+ &lt;xsl:attribute name="text-align"&gt;end&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="display-align"&gt;center&lt;/xsl:attribute&gt;
+&lt;/xsl:attribute-set&gt;</programlisting>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+<para>Properties that apply to the fo:table-cell containing the number
+of an equation when it has no title. The number in an equation with a
+title is formatted along with the title, and this attribute-set does not apply.</para>
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="table.properties">
+<refmeta>
+<refentrytitle>table.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>table.properties</refname>
+<refpurpose>Properties associated with the block surrounding a table</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="table.properties.frag">
+&lt;xsl:attribute-set name="table.properties" use-attribute-sets="formal.object.properties"&gt;
+ &lt;xsl:attribute name="keep-together.within-column"&gt;auto&lt;/xsl:attribute&gt;
+&lt;/xsl:attribute-set&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Block styling properties for tables. This parameter should really
+have been called <literal>table.block.properties</literal> or something
+like that, but we&#8217;re leaving it to avoid backwards-compatibility
+problems.</para>
+
+<para>See also <parameter>table.table.properties</parameter>.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="informalfigure.properties">
+<refmeta>
+<refentrytitle>informalfigure.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>informalfigure.properties</refname>
+<refpurpose>Properties associated with an informalfigure</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="informalfigure.properties.frag">
+&lt;xsl:attribute-set name="informalfigure.properties" use-attribute-sets="informal.object.properties"&gt;&lt;/xsl:attribute-set&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The styling for informalfigures.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="informalexample.properties">
+<refmeta>
+<refentrytitle>informalexample.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>informalexample.properties</refname>
+<refpurpose>Properties associated with an informalexample</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="informalexample.properties.frag">
+&lt;xsl:attribute-set name="informalexample.properties" use-attribute-sets="informal.object.properties"&gt;&lt;/xsl:attribute-set&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The styling for informalexamples.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="informalequation.properties">
+<refmeta>
+<refentrytitle>informalequation.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>informalequation.properties</refname>
+<refpurpose>Properties associated with an informalequation</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="informalequation.properties.frag">
+&lt;xsl:attribute-set name="informalequation.properties" use-attribute-sets="informal.object.properties"&gt;&lt;/xsl:attribute-set&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The styling for informalequations.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="informaltable.properties">
+<refmeta>
+<refentrytitle>informaltable.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>informaltable.properties</refname>
+<refpurpose>Properties associated with the block surrounding an informaltable</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="informaltable.properties.frag">
+&lt;xsl:attribute-set name="informaltable.properties" use-attribute-sets="informal.object.properties"&gt;&lt;/xsl:attribute-set&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Block styling properties for informaltables. This parameter should really
+have been called <literal>informaltable.block.properties</literal> or something
+like that, but we&#8217;re leaving it to avoid backwards-compatibility
+problems.</para>
+
+<para>See also <parameter>table.table.properties</parameter>.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="procedure.properties">
+<refmeta>
+<refentrytitle>procedure.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>procedure.properties</refname>
+<refpurpose>Properties associated with a procedure</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="procedure.properties.frag">
+&lt;xsl:attribute-set name="procedure.properties" use-attribute-sets="formal.object.properties"&gt;
+ &lt;xsl:attribute name="keep-together.within-column"&gt;auto&lt;/xsl:attribute&gt;
+&lt;/xsl:attribute-set&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The styling for procedures.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="root.properties">
+<refmeta>
+<refentrytitle>root.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>root.properties</refname>
+<refpurpose>The properties of the fo:root element</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="root.properties.frag">
+&lt;xsl:attribute-set name="root.properties"&gt;
+ &lt;xsl:attribute name="font-family"&gt;
+ &lt;xsl:value-of select="$body.fontset"&gt;&lt;/xsl:value-of&gt;
+ &lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="font-size"&gt;
+ &lt;xsl:value-of select="$body.font.size"&gt;&lt;/xsl:value-of&gt;
+ &lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="text-align"&gt;
+ &lt;xsl:value-of select="$alignment"&gt;&lt;/xsl:value-of&gt;
+ &lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="line-height"&gt;
+ &lt;xsl:value-of select="$line-height"&gt;&lt;/xsl:value-of&gt;
+ &lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="font-selection-strategy"&gt;character-by-character&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="line-height-shift-adjustment"&gt;disregard-shifts&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="writing-mode"&gt;
+ &lt;xsl:value-of select="$direction.mode"&gt;&lt;/xsl:value-of&gt;
+ &lt;/xsl:attribute&gt;
+&lt;/xsl:attribute-set&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>This property set is used on the <tag>fo:root</tag> element of
+an FO file. It defines a set of default, global parameters.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="qanda.title.properties">
+<refmeta>
+<refentrytitle>qanda.title.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>qanda.title.properties</refname>
+<refpurpose>Properties for qanda set titles</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="qanda.title.properties.frag">
+&lt;xsl:attribute-set name="qanda.title.properties"&gt;
+ &lt;xsl:attribute name="font-family"&gt;
+ &lt;xsl:value-of select="$title.font.family"&gt;&lt;/xsl:value-of&gt;
+ &lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="font-weight"&gt;bold&lt;/xsl:attribute&gt;
+ &lt;!-- font size is calculated dynamically by qanda.heading template --&gt;
+ &lt;xsl:attribute name="keep-with-next.within-column"&gt;always&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="space-before.minimum"&gt;0.8em&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="space-before.optimum"&gt;1.0em&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="space-before.maximum"&gt;1.2em&lt;/xsl:attribute&gt;
+&lt;/xsl:attribute-set&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The properties common to all qanda set titles.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="qanda.title.level1.properties">
+<refmeta>
+<refentrytitle>qanda.title.level1.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>qanda.title.level1.properties</refname>
+<refpurpose>Properties for level-1 qanda set titles</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="qanda.title.level1.properties.frag">
+&lt;xsl:attribute-set name="qanda.title.level1.properties"&gt;
+ &lt;xsl:attribute name="font-size"&gt;
+ &lt;xsl:value-of select="$body.font.master * 2.0736"&gt;&lt;/xsl:value-of&gt;
+ &lt;xsl:text&gt;pt&lt;/xsl:text&gt;
+ &lt;/xsl:attribute&gt;
+&lt;/xsl:attribute-set&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The properties of level-1 qanda set titles.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="qanda.title.level2.properties">
+<refmeta>
+<refentrytitle>qanda.title.level2.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>qanda.title.level2.properties</refname>
+<refpurpose>Properties for level-2 qanda set titles</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="qanda.title.level2.properties.frag">
+&lt;xsl:attribute-set name="qanda.title.level2.properties"&gt;
+ &lt;xsl:attribute name="font-size"&gt;
+ &lt;xsl:value-of select="$body.font.master * 1.728"&gt;&lt;/xsl:value-of&gt;
+ &lt;xsl:text&gt;pt&lt;/xsl:text&gt;
+ &lt;/xsl:attribute&gt;
+&lt;/xsl:attribute-set&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The properties of level-2 qanda set titles.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="qanda.title.level3.properties">
+<refmeta>
+<refentrytitle>qanda.title.level3.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>qanda.title.level3.properties</refname>
+<refpurpose>Properties for level-3 qanda set titles</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="qanda.title.level3.properties.frag">
+&lt;xsl:attribute-set name="qanda.title.level3.properties"&gt;
+ &lt;xsl:attribute name="font-size"&gt;
+ &lt;xsl:value-of select="$body.font.master * 1.44"&gt;&lt;/xsl:value-of&gt;
+ &lt;xsl:text&gt;pt&lt;/xsl:text&gt;
+ &lt;/xsl:attribute&gt;
+&lt;/xsl:attribute-set&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The properties of level-3 qanda set titles.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="qanda.title.level4.properties">
+<refmeta>
+<refentrytitle>qanda.title.level4.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>qanda.title.level4.properties</refname>
+<refpurpose>Properties for level-4 qanda set titles</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="qanda.title.level4.properties.frag">
+&lt;xsl:attribute-set name="qanda.title.level4.properties"&gt;
+ &lt;xsl:attribute name="font-size"&gt;
+ &lt;xsl:value-of select="$body.font.master * 1.2"&gt;&lt;/xsl:value-of&gt;
+ &lt;xsl:text&gt;pt&lt;/xsl:text&gt;
+ &lt;/xsl:attribute&gt;
+&lt;/xsl:attribute-set&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The properties of level-4 qanda set titles.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="qanda.title.level5.properties">
+<refmeta>
+<refentrytitle>qanda.title.level5.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>qanda.title.level5.properties</refname>
+<refpurpose>Properties for level-5 qanda set titles</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="qanda.title.level5.properties.frag">
+&lt;xsl:attribute-set name="qanda.title.level5.properties"&gt;
+ &lt;xsl:attribute name="font-size"&gt;
+ &lt;xsl:value-of select="$body.font.master"&gt;&lt;/xsl:value-of&gt;
+ &lt;xsl:text&gt;pt&lt;/xsl:text&gt;
+ &lt;/xsl:attribute&gt;
+&lt;/xsl:attribute-set&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The properties of level-5 qanda set titles.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="qanda.title.level6.properties">
+<refmeta>
+<refentrytitle>qanda.title.level6.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>qanda.title.level6.properties</refname>
+<refpurpose>Properties for level-6 qanda set titles</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="qanda.title.level6.properties.frag">
+&lt;xsl:attribute-set name="qanda.title.level6.properties"&gt;
+ &lt;xsl:attribute name="font-size"&gt;
+ &lt;xsl:value-of select="$body.font.master"&gt;&lt;/xsl:value-of&gt;
+ &lt;xsl:text&gt;pt&lt;/xsl:text&gt;
+ &lt;/xsl:attribute&gt;
+&lt;/xsl:attribute-set&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The properties of level-6 qanda set titles.
+This property set is actually
+used for all titles below level 5.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="article.appendix.title.properties">
+<refmeta>
+<refentrytitle>article.appendix.title.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>article.appendix.title.properties</refname>
+<refpurpose>Properties for appendix titles that appear in an article</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="article.appendix.title.properties.frag">
+&lt;xsl:attribute-set name="article.appendix.title.properties" use-attribute-sets="section.title.properties section.title.level1.properties"&gt;
+ &lt;xsl:attribute name="margin-{$direction.align.start}"&gt;
+ &lt;xsl:value-of select="$title.margin.left"&gt;&lt;/xsl:value-of&gt;
+ &lt;/xsl:attribute&gt;
+&lt;/xsl:attribute-set&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The properties for the title of an appendix that
+appears inside an article. The default is to use
+the properties of sect1 titles.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="abstract.properties">
+<refmeta>
+<refentrytitle>abstract.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>abstract.properties</refname>
+<refpurpose>Properties associated with the block surrounding an abstract</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="abstract.properties.frag">
+&lt;xsl:attribute-set name="abstract.properties"&gt;
+ &lt;xsl:attribute name="start-indent"&gt;0.0in&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="end-indent"&gt;0.0in&lt;/xsl:attribute&gt;
+&lt;/xsl:attribute-set&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Block styling properties for abstract.</para>
+
+<para>See also <parameter>abstract.title.properties</parameter>.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="abstract.title.properties">
+<refmeta>
+<refentrytitle>abstract.title.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>abstract.title.properties</refname>
+<refpurpose>Properties for abstract titles</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="abstract.title.properties.frag">
+&lt;xsl:attribute-set name="abstract.title.properties"&gt;
+ &lt;xsl:attribute name="font-family"&gt;&lt;xsl:value-of select="$title.fontset"&gt;&lt;/xsl:value-of&gt;&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="font-weight"&gt;bold&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="keep-with-next.within-column"&gt;always&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="keep-with-next.within-column"&gt;always&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="space-before.optimum"&gt;&lt;xsl:value-of select="concat($body.font.master, 'pt')"&gt;&lt;/xsl:value-of&gt;&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="space-before.minimum"&gt;&lt;xsl:value-of select="concat($body.font.master, 'pt * 0.8')"&gt;&lt;/xsl:value-of&gt;&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="space-before.maximum"&gt;&lt;xsl:value-of select="concat($body.font.master, 'pt * 1.2')"&gt;&lt;/xsl:value-of&gt;&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="hyphenate"&gt;false&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="text-align"&gt;center&lt;/xsl:attribute&gt;
+&lt;/xsl:attribute-set&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The properties for abstract titles.</para>
+
+<para>See also <parameter>abstract.properties</parameter>.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="index.page.number.properties">
+<refmeta>
+<refentrytitle>index.page.number.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>index.page.number.properties</refname>
+<refpurpose>Properties associated with index page numbers</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="index.page.number.properties.frag">
+&lt;xsl:attribute-set name="index.page.number.properties"&gt;
+&lt;/xsl:attribute-set&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Properties associated with page numbers in indexes.
+Changing color to indicate the page number is a link is
+one possibility.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="revhistory.table.properties">
+<refmeta>
+<refentrytitle>revhistory.table.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>revhistory.table.properties</refname>
+<refpurpose>The properties of table used for formatting revhistory</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="revhistory.table.properties.frag">
+&lt;xsl:attribute-set name="revhistory.table.properties"&gt;
+&lt;/xsl:attribute-set&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>This property set defines appearance of revhistory table.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="revhistory.table.cell.properties">
+<refmeta>
+<refentrytitle>revhistory.table.cell.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>revhistory.table.cell.properties</refname>
+<refpurpose>The properties of table cells used for formatting revhistory</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="revhistory.table.cell.properties.frag">
+&lt;xsl:attribute-set name="revhistory.table.cell.properties"&gt;
+&lt;/xsl:attribute-set&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>This property set defines appearance of individual cells in revhistory table.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="revhistory.title.properties">
+<refmeta>
+<refentrytitle>revhistory.title.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>revhistory.title.properties</refname>
+<refpurpose>The properties of revhistory title</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="revhistory.title.properties.frag">
+&lt;xsl:attribute-set name="revhistory.title.properties"&gt;
+&lt;/xsl:attribute-set&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>This property set defines appearance of revhistory title.</para>
+
+</refsection>
+</refentry>
+
+</reference>
+<reference xml:id="profiling"><title>Profiling</title>
+<partintro xml:id="profiling_partintro">
+<para>The following parameters can be used for attribute-based
+profiling of your document. For more information about profiling, see
+<link xmlns:xlink="http://www.w3.org/1999/xlink" role="tcg" xlink:href="Profiling.html">Profiling (conditional text)</link>.</para>
+</partintro>
+<refentry version="5.0" xml:id="profile.arch">
+<refmeta>
+<refentrytitle>profile.arch</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>profile.arch</refname>
+<refpurpose>Target profile for <tag class="attribute">arch</tag>
+attribute</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="profile.arch.frag">
+&lt;xsl:param name="profile.arch"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+
+<refsection><info><title>Description</title></info>
+
+<para>The value of this parameter specifies profiles which should be
+included in the output. You can specify multiple profiles by
+separating them by semicolon. You can change separator character by
+<parameter>profile.separator</parameter>
+parameter.</para>
+
+<para>This parameter has effect only when you are using profiling
+stylesheets (<filename>profile-docbook.xsl</filename>,
+<filename>profile-chunk.xsl</filename>, &#8230;) instead of normal
+ones (<filename>docbook.xsl</filename>,
+<filename>chunk.xsl</filename>, &#8230;).</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="profile.audience">
+<refmeta>
+<refentrytitle>profile.audience</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>profile.audience</refname>
+<refpurpose>Target profile for <tag class="attribute">audience</tag>
+attribute</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="profile.audience.frag">
+&lt;xsl:param name="profile.audience"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Value of this parameter specifies profiles which should be
+included in the output. You can specify multiple profiles by
+separating them by semicolon. You can change separator character by
+<parameter>profile.separator</parameter>
+parameter.</para>
+
+<para>This parameter has effect only when you are using profiling
+stylesheets (<filename>profile-docbook.xsl</filename>,
+<filename>profile-chunk.xsl</filename>, &#8230;) instead of normal
+ones (<filename>docbook.xsl</filename>,
+<filename>chunk.xsl</filename>, &#8230;).</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="profile.condition">
+<refmeta>
+<refentrytitle>profile.condition</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>profile.condition</refname>
+<refpurpose>Target profile for <tag class="attribute">condition</tag>
+attribute</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="profile.condition.frag">
+&lt;xsl:param name="profile.condition"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The value of this parameter specifies profiles which should be
+included in the output. You can specify multiple profiles by
+separating them by semicolon. You can change separator character by
+<parameter>profile.separator</parameter>
+parameter.</para>
+
+<para>This parameter has effect only when you are using profiling
+stylesheets (<filename>profile-docbook.xsl</filename>,
+<filename>profile-chunk.xsl</filename>, &#8230;) instead of normal
+ones (<filename>docbook.xsl</filename>,
+<filename>chunk.xsl</filename>, &#8230;).</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="profile.conformance">
+<refmeta>
+<refentrytitle>profile.conformance</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>profile.conformance</refname>
+<refpurpose>Target profile for <tag class="attribute">conformance</tag>
+attribute</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="profile.conformance.frag">
+&lt;xsl:param name="profile.conformance"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The value of this parameter specifies profiles which should be
+included in the output. You can specify multiple profiles by
+separating them by semicolon. You can change separator character by
+<parameter>profile.separator</parameter>
+parameter.</para>
+
+<para>This parameter has effect only when you are using profiling
+stylesheets (<filename>profile-docbook.xsl</filename>,
+<filename>profile-chunk.xsl</filename>, &#8230;) instead of normal
+ones (<filename>docbook.xsl</filename>,
+<filename>chunk.xsl</filename>, &#8230;).</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="profile.lang">
+<refmeta>
+<refentrytitle>profile.lang</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>profile.lang</refname>
+<refpurpose>Target profile for <tag class="attribute">lang</tag>
+attribute</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="profile.lang.frag">
+&lt;xsl:param name="profile.lang"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The value of this parameter specifies profiles which should be
+included in the output. You can specify multiple profiles by
+separating them by semicolon. You can change separator character by
+<parameter>profile.separator</parameter>
+parameter.</para>
+
+<para>This parameter has effect only when you are using profiling
+stylesheets (<filename>profile-docbook.xsl</filename>,
+<filename>profile-chunk.xsl</filename>, &#8230;) instead of normal
+ones (<filename>docbook.xsl</filename>,
+<filename>chunk.xsl</filename>, &#8230;).</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="profile.os">
+<refmeta>
+<refentrytitle>profile.os</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>profile.os</refname>
+<refpurpose>Target profile for <tag class="attribute">os</tag>
+attribute</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="profile.os.frag">
+&lt;xsl:param name="profile.os"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The value of this parameter specifies profiles which should be
+included in the output. You can specify multiple profiles by
+separating them by semicolon. You can change separator character by
+<parameter>profile.separator</parameter>
+parameter.</para>
+
+<para>This parameter has effect only when you are using profiling
+stylesheets (<filename>profile-docbook.xsl</filename>,
+<filename>profile-chunk.xsl</filename>, &#8230;) instead of normal
+ones (<filename>docbook.xsl</filename>,
+<filename>chunk.xsl</filename>, &#8230;).</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="profile.revision">
+<refmeta>
+<refentrytitle>profile.revision</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>profile.revision</refname>
+<refpurpose>Target profile for <tag class="attribute">revision</tag>
+attribute</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="profile.revision.frag">
+&lt;xsl:param name="profile.revision"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The value of this parameter specifies profiles which should be
+included in the output. You can specify multiple profiles by
+separating them by semicolon. You can change separator character by
+<parameter>profile.separator</parameter>
+parameter.</para>
+
+<para>This parameter has effect only when you are using profiling
+stylesheets (<filename>profile-docbook.xsl</filename>,
+<filename>profile-chunk.xsl</filename>, &#8230;) instead of normal
+ones (<filename>docbook.xsl</filename>,
+<filename>chunk.xsl</filename>, &#8230;).</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="profile.revisionflag">
+<refmeta>
+<refentrytitle>profile.revisionflag</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>profile.revisionflag</refname>
+<refpurpose>Target profile for <tag class="attribute">revisionflag</tag>
+attribute</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="profile.revisionflag.frag">
+&lt;xsl:param name="profile.revisionflag"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The value of this parameter specifies profiles which should be
+included in the output. You can specify multiple profiles by
+separating them by semicolon. You can change separator character by
+<parameter>profile.separator</parameter>
+parameter.</para>
+
+<para>This parameter has effect only when you are using profiling
+stylesheets (<filename>profile-docbook.xsl</filename>,
+<filename>profile-chunk.xsl</filename>, &#8230;) instead of normal
+ones (<filename>docbook.xsl</filename>,
+<filename>chunk.xsl</filename>, &#8230;).</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="profile.role">
+<refmeta>
+<refentrytitle>profile.role</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>profile.role</refname>
+<refpurpose>Target profile for <tag class="attribute">role</tag>
+attribute</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="profile.role.frag">
+&lt;xsl:param name="profile.role"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The value of this parameter specifies profiles which should be
+included in the output. You can specify multiple profiles by
+separating them by semicolon. You can change separator character by
+<parameter>profile.separator</parameter>
+parameter.</para>
+
+<para>This parameter has effect only when you are using profiling
+stylesheets (<filename>profile-docbook.xsl</filename>,
+<filename>profile-chunk.xsl</filename>, &#8230;) instead of normal
+ones (<filename>docbook.xsl</filename>,
+<filename>chunk.xsl</filename>, &#8230;).</para>
+
+<warning>
+<para>Note that <tag class="attribute">role</tag> is often
+used for other purposes than profiling. For example it is commonly
+used to get emphasize in bold font:</para>
+
+<programlisting>&lt;emphasis role="bold"&gt;very important&lt;/emphasis&gt;</programlisting>
+
+<para>If you are using <tag class="attribute">role</tag> for
+these purposes do not forget to add values like <literal>bold</literal> to
+value of this parameter. If you forgot you will get document with
+small pieces missing which are very hard to track.</para>
+
+<para>For this reason it is not recommended to use <tag class="attribute">role</tag> attribute for profiling. You should
+rather use profiling specific attributes like <tag class="attribute">userlevel</tag>, <tag class="attribute">os</tag>, <tag class="attribute">arch</tag>, <tag class="attribute">condition</tag>, etc.</para>
+</warning>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="profile.security">
+<refmeta>
+<refentrytitle>profile.security</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>profile.security</refname>
+<refpurpose>Target profile for <tag class="attribute">security</tag>
+attribute</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="profile.security.frag">
+&lt;xsl:param name="profile.security"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The value of this parameter specifies profiles which should be
+included in the output. You can specify multiple profiles by
+separating them by semicolon. You can change separator character by
+<parameter>profile.separator</parameter>
+parameter.</para>
+
+<para>This parameter has effect only when you are using profiling
+stylesheets (<filename>profile-docbook.xsl</filename>,
+<filename>profile-chunk.xsl</filename>, &#8230;) instead of normal
+ones (<filename>docbook.xsl</filename>,
+<filename>chunk.xsl</filename>, &#8230;).</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="profile.status">
+<refmeta>
+<refentrytitle>profile.status</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>profile.status</refname>
+<refpurpose>Target profile for <tag class="attribute">status</tag>
+attribute</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="profile.status.frag">
+&lt;xsl:param name="profile.status"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The value of this parameter specifies profiles which should be
+included in the output. You can specify multiple profiles by
+separating them by semicolon. You can change separator character by
+<parameter>profile.separator</parameter>
+parameter.</para>
+
+<para>This parameter has effect only when you are using profiling
+stylesheets (<filename>profile-docbook.xsl</filename>,
+<filename>profile-chunk.xsl</filename>, &#8230;) instead of normal
+ones (<filename>docbook.xsl</filename>,
+<filename>chunk.xsl</filename>, &#8230;).</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="profile.userlevel">
+<refmeta>
+<refentrytitle>profile.userlevel</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>profile.userlevel</refname>
+<refpurpose>Target profile for <tag class="attribute">userlevel</tag>
+attribute</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="profile.userlevel.frag">
+&lt;xsl:param name="profile.userlevel"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The value of this parameter specifies profiles which should be
+included in the output. You can specify multiple profiles by
+separating them by semicolon. You can change separator character by
+<parameter>profile.separator</parameter>
+parameter.</para>
+
+<para>This parameter has effect only when you are using profiling
+stylesheets (<filename>profile-docbook.xsl</filename>,
+<filename>profile-chunk.xsl</filename>, &#8230;) instead of normal
+ones (<filename>docbook.xsl</filename>,
+<filename>chunk.xsl</filename>, &#8230;).</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="profile.vendor">
+<refmeta>
+<refentrytitle>profile.vendor</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>profile.vendor</refname>
+<refpurpose>Target profile for <tag class="attribute">vendor</tag>
+attribute</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="profile.vendor.frag">
+&lt;xsl:param name="profile.vendor"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The value of this parameter specifies profiles which should be
+included in the output. You can specify multiple profiles by
+separating them by semicolon. You can change separator character by
+<parameter>profile.separator</parameter>
+parameter.</para>
+
+<para>This parameter has effect only when you are using profiling
+stylesheets (<filename>profile-docbook.xsl</filename>,
+<filename>profile-chunk.xsl</filename>, &#8230;) instead of normal
+ones (<filename>docbook.xsl</filename>,
+<filename>chunk.xsl</filename>, &#8230;).</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="profile.wordsize">
+<refmeta>
+<refentrytitle>profile.wordsize</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>profile.wordsize</refname>
+<refpurpose>Target profile for <tag class="attribute">wordsize</tag>
+attribute</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="profile.wordsize.frag">
+&lt;xsl:param name="profile.wordsize"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The value of this parameter specifies profiles which should be
+included in the output. You can specify multiple profiles by
+separating them by semicolon. You can change separator character by
+<parameter>profile.separator</parameter>
+parameter.</para>
+
+<para>This parameter has effect only when you are using profiling
+stylesheets (<filename>profile-docbook.xsl</filename>,
+<filename>profile-chunk.xsl</filename>, &#8230;) instead of normal
+ones (<filename>docbook.xsl</filename>,
+<filename>chunk.xsl</filename>, &#8230;).</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="profile.attribute">
+<refmeta>
+<refentrytitle>profile.attribute</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>profile.attribute</refname>
+<refpurpose>Name of user-specified profiling attribute</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="profile.attribute.frag">
+&lt;xsl:param name="profile.attribute"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>This parameter is used in conjuction with
+<parameter>profile.value</parameter>.</para>
+
+<para>This parameter has effect only when you are using profiling
+stylesheets (<filename>profile-docbook.xsl</filename>,
+<filename>profile-chunk.xsl</filename>, &#8230;) instead of normal
+ones (<filename>docbook.xsl</filename>,
+<filename>chunk.xsl</filename>, &#8230;).</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="profile.value">
+<refmeta>
+<refentrytitle>profile.value</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>profile.value</refname>
+<refpurpose>Target profile for user-specified attribute</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="profile.value.frag">
+&lt;xsl:param name="profile.value"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>When you are using this parameter you must also specify name of
+profiling attribute with parameter
+<parameter>profile.attribute</parameter>.</para>
+
+<para>The value of this parameter specifies profiles which should be
+included in the output. You can specify multiple profiles by
+separating them by semicolon. You can change separator character by
+<parameter>profile.separator</parameter>
+parameter.</para>
+
+<para>This parameter has effect only when you are using profiling
+stylesheets (<filename>profile-docbook.xsl</filename>,
+<filename>profile-chunk.xsl</filename>, &#8230;) instead of normal
+ones (<filename>docbook.xsl</filename>,
+<filename>chunk.xsl</filename>, &#8230;).</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="profile.separator">
+<refmeta>
+<refentrytitle>profile.separator</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>profile.separator</refname>
+<refpurpose>Separator character for compound profile values</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="profile.separator.frag">
+&lt;xsl:param name="profile.separator"&gt;;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Separator character used for compound profile values. See <parameter>profile.arch</parameter></para>
+
+</refsection>
+</refentry>
+
+</reference>
+<reference xml:id="l10n"><title>Localization</title>
+<refentry version="5.0" xml:id="l10n.gentext.language">
+<refmeta>
+<refentrytitle>l10n.gentext.language</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>l10n.gentext.language</refname>
+<refpurpose>Sets the gentext language</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="l10n.gentext.language.frag">
+&lt;xsl:param name="l10n.gentext.language"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If this parameter is set to any value other than the empty string, its
+value will be used as the value for the language when generating text. Setting
+<parameter>l10n.gentext.language</parameter> overrides any settings within the
+document being formatted.</para>
+
+<para>It's much more likely that you might want to set the
+<parameter>l10n.gentext.default.language</parameter> parameter.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="l10n.gentext.default.language">
+ <refmeta>
+ <refentrytitle>l10n.gentext.default.language</refentrytitle>
+ <refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+ </refmeta>
+ <refnamediv>
+ <refname>l10n.gentext.default.language</refname>
+ <refpurpose>Sets the default language for generated text</refpurpose>
+ </refnamediv>
+
+ <refsynopsisdiv>
+<programlisting xml:id="l10n.gentext.default.language.frag">
+&lt;xsl:param name="l10n.gentext.default.language"&gt;en&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The value of the <parameter>l10n.gentext.default.language</parameter>
+parameter is used as the language for generated text if no setting is provided
+in the source document.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="l10n.gentext.use.xref.language">
+<refmeta>
+<refentrytitle>l10n.gentext.use.xref.language</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>l10n.gentext.use.xref.language</refname>
+<refpurpose>Use the language of target when generating cross-reference text?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="l10n.gentext.use.xref.language.frag">
+&lt;xsl:param name="l10n.gentext.use.xref.language" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, the language of the target will be used when
+generating cross reference text. Usually, the <quote>current</quote>
+language is used when generating text (that is, the language of the
+element that contains the cross-reference element). But setting this parameter
+allows the language of the element <emphasis>pointed to</emphasis> to control
+the generated text.</para>
+
+<para>Consider the following example:</para>
+
+<informalexample>
+<programlisting>&lt;para lang="en"&gt;See also &lt;xref linkend="chap3"/&gt;.&lt;/para&gt;
+</programlisting>
+</informalexample>
+
+<para>Suppose that Chapter 3 happens to be written in German.
+If <parameter>l10n.gentext.use.xref.language</parameter> is non-zero, the
+resulting text will be something like this:</para>
+
+<blockquote>
+<para>See also Kapital 3.</para>
+</blockquote>
+
+<para>Where the more traditional rendering would be:</para>
+
+<blockquote>
+<para>See also Chapter 3.</para>
+</blockquote>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="l10n.lang.value.rfc.compliant">
+<refmeta>
+<refentrytitle>l10n.lang.value.rfc.compliant</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>l10n.lang.value.rfc.compliant</refname>
+<refpurpose>Make value of lang attribute RFC compliant?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="l10n.lang.value.rfc.compliant.frag">
+&lt;xsl:param name="l10n.lang.value.rfc.compliant" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, ensure that the values for all <tag class="attribute">lang</tag> attributes in HTML output are RFC
+compliant<footnote><para>Section 8.1.1, <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.w3.org/TR/REC-html40/struct/dirlang.html#h-8.1.1">Language Codes</link>, in the HTML 4.0 Recommendation states that:
+
+<blockquote><para>[RFC1766] defines and explains the language codes
+that must be used in HTML documents.</para>
+<para>Briefly, language codes consist of a primary code and a possibly
+empty series of subcodes:
+
+<literallayout class="monospaced">language-code = primary-code ( "-" subcode )*</literallayout>
+</para>
+<para>And in RFC 1766, <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.ietf.org/rfc/rfc1766.txt">Tags for the Identification
+of Languages</link>, the EBNF for "language tag" is given as:
+
+<literallayout class="monospaced">Language-Tag = Primary-tag *( "-" Subtag )
+Primary-tag = 1*8ALPHA
+Subtag = 1*8ALPHA</literallayout>
+</para>
+</blockquote>
+</para></footnote>.
+
+by taking any underscore characters in any <tag class="attribute">lang</tag> values found in source documents, and
+replacing them with hyphen characters in output HTML files. For
+example, <literal>zh_CN</literal> in a source document becomes
+<literal>zh-CN</literal> in the HTML output form that source.
+
+<note>
+<para>This parameter does not cause any case change in <tag class="attribute">lang</tag> values, because RFC 1766
+explicitly states that all "language tags" (as it calls them) "are
+to be treated as case insensitive".</para>
+</note>
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="writing.mode">
+<refmeta>
+<refentrytitle>writing.mode</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>writing.mode</refname>
+<refpurpose>Direction of text flow based on locale</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="writing.mode.frag">
+&lt;xsl:param name="writing.mode"&gt;
+ &lt;xsl:call-template name="gentext"&gt;
+ &lt;xsl:with-param name="key"&gt;writing-mode&lt;/xsl:with-param&gt;
+ &lt;xsl:with-param name="lang"&gt;
+ &lt;xsl:call-template name="l10n.language"&gt;
+ &lt;xsl:with-param name="target" select="/*[1]"&gt;&lt;/xsl:with-param&gt;
+ &lt;/xsl:call-template&gt;
+ &lt;/xsl:with-param&gt;
+ &lt;/xsl:call-template&gt;
+&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Sets direction of text flow and text alignment based on locale.
+The value is normally taken from the gentext file for the
+lang attribute of the document's root element, using the
+key name 'writing-mode' to look it up in the gentext file.
+But the param can also be
+set on the command line to override that gentext value.
+</para>
+<para>Accepted values are:
+<variablelist>
+ <varlistentry>
+ <term>lr-tb</term>
+ <listitem>
+ <para>Left-to-right text flow in each line, lines stack top to bottom.</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>rl-tb</term>
+ <listitem>
+ <para>Right-to-left text flow in each line, lines stack top to bottom.</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>tb-rl</term>
+ <listitem>
+ <para>Top-to-bottom text flow in each vertical line, lines stack right to left.
+ Supported by only a few XSL-FO processors. Not supported in HTML output.</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>lr</term>
+ <listitem>
+ <para>Shorthand for lr-tb.</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>rl</term>
+ <listitem>
+ <para>Shorthand for rl-tb.</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>tb</term>
+ <listitem>
+ <para>Shorthand for tb-rl.</para>
+ </listitem>
+ </varlistentry>
+</variablelist>
+</para>
+
+</refsection>
+</refentry>
+
+</reference>
+<reference xml:id="ebnf"><title>EBNF</title>
+<refentry version="5.0" xml:id="ebnf.assignment">
+<refmeta>
+<refentrytitle>ebnf.assignment</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">rtf</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>ebnf.assignment</refname>
+<refpurpose>The EBNF production assignment operator</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="ebnf.assignment.frag">
+
+&lt;xsl:param name="ebnf.assignment"&gt;
+ &lt;fo:inline font-family="{$monospace.font.family}"&gt;
+ &lt;xsl:text&gt;::=&lt;/xsl:text&gt;
+ &lt;/fo:inline&gt;
+&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The <parameter>ebnf.assignment</parameter> parameter determines what
+text is used to show <quote>assignment</quote> in <tag>production</tag>s
+in <tag>productionset</tag>s.</para>
+
+<para>While <quote><literal>::=</literal></quote> is common, so are several
+other operators.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="ebnf.statement.terminator">
+<refmeta>
+<refentrytitle>ebnf.statement.terminator</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">rtf</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>ebnf.statement.terminator</refname>
+<refpurpose>Punctuation that ends an EBNF statement.</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="ebnf.statement.terminator.frag">
+
+&lt;xsl:param name="ebnf.statement.terminator"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The <parameter>ebnf.statement.terminator</parameter> parameter determines what
+text is used to terminate each <tag>production</tag>
+in <tag>productionset</tag>.</para>
+
+<para>Some notations end each statement with a period.</para>
+
+</refsection>
+</refentry>
+
+</reference>
+<reference xml:id="prepress"><title>Prepress</title>
+<refentry version="5.0" xml:id="crop.marks">
+<refmeta>
+<refentrytitle>crop.marks</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>crop.marks</refname>
+<refpurpose>Output crop marks?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="crop.marks.frag">
+&lt;xsl:param name="crop.marks" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, crop marks will be added to each page. Currently this
+works only with XEP if you have <parameter>xep.extensions</parameter> set.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="crop.mark.width">
+<refmeta>
+<refentrytitle>crop.mark.width</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">length</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>crop.mark.width</refname>
+<refpurpose>Width of crop marks.</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="crop.mark.width.frag">
+&lt;xsl:param name="crop.mark.width"&gt;0.5pt&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Width of crop marks. Crop marks are controlled by
+<parameter>crop.marks</parameter> parameter.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="crop.mark.offset">
+<refmeta>
+<refentrytitle>crop.mark.offset</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">length</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>crop.mark.offset</refname>
+<refpurpose>Length of crop marks.</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="crop.mark.offset.frag">
+&lt;xsl:param name="crop.mark.offset"&gt;24pt&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Length of crop marks. Crop marks are controlled by
+<parameter>crop.marks</parameter> parameter.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="crop.mark.bleed">
+<refmeta>
+<refentrytitle>crop.mark.bleed</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">length</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>crop.mark.bleed</refname>
+<refpurpose>Length of invisible part of crop marks.</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="crop.mark.bleed.frag">
+&lt;xsl:param name="crop.mark.bleed"&gt;6pt&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Length of invisible part of crop marks. Crop marks are controlled by
+<parameter>crop.marks</parameter> parameter.</para>
+
+</refsection>
+</refentry>
+
+</reference>
+
+<appendix xml:id="stylesheet"><title>The Stylesheet</title>
+
+<para>The <filename>param.xsl</filename> stylesheet is just a wrapper
+around all these parameters.</para>
+
+<programlisting xml:id="top">
+&lt;xsl:stylesheet exclude-result-prefixes="src" version="1.0"&gt;
+
+&lt;!-- This file is generated from param.xweb --&gt;
+
+&lt;!-- ********************************************************************
+ $Id: param.xweb 8543 2009-12-02 06:05:24Z bobstayton $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** --&gt;
+
+&lt;src:fragref linkend="abstract.properties.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="abstract.title.properties.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="admon.graphics.extension.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="admon.graphics.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="admon.graphics.path.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="admon.textlabel.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="admonition.properties.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="admonition.title.properties.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="graphical.admonition.properties.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="nongraphical.admonition.properties.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="alignment.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="appendix.autolabel.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="arbortext.extensions.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="article.appendix.title.properties.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="author.othername.in.middle.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="autotoc.label.separator.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="axf.extensions.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="biblioentry.item.separator.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="biblioentry.properties.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="bibliography.collection.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="bibliography.numbered.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="bibliography.style.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="blockquote.properties.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="body.font.family.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="body.font.master.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="body.font.size.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="body.margin.bottom.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="body.margin.top.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="body.start.indent.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="body.end.indent.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="bookmarks.collapse.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="bridgehead.in.toc.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="callout.defaultcolumn.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="callout.graphics.extension.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="callout.graphics.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="callout.icon.size.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="callout.graphics.number.limit.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="callout.graphics.path.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="callout.unicode.font.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="callout.unicode.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="callout.unicode.number.limit.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="callout.unicode.start.character.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="callouts.extension.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="chapter.autolabel.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="collect.xref.targets.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="column.count.back.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="column.count.body.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="column.count.front.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="column.count.index.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="column.count.lot.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="column.count.titlepage.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="column.gap.back.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="column.gap.body.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="column.gap.front.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="column.gap.index.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="column.gap.lot.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="column.gap.titlepage.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="compact.list.item.spacing.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="component.label.includes.part.label.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="component.title.properties.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="component.titlepage.properties.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="crop.marks.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="crop.mark.width.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="crop.mark.offset.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="crop.mark.bleed.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="current.docid.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="default.float.class.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="default.image.width.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="default.table.width.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="default.table.frame.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="default.table.rules.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="default.units.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="dingbat.font.family.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="double.sided.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="draft.mode.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="draft.watermark.image.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="ebnf.assignment.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="ebnf.statement.terminator.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="email.delimiters.enabled.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="email.mailto.enabled.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="equation.properties.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="equation.number.properties.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="example.properties.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="exsl.node.set.available.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="figure.properties.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="firstterm.only.link.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="footer.content.properties.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="footer.rule.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="footer.column.widths.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="footer.table.height.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="footer.table.properties.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="footers.on.blank.pages.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="footnote.font.size.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="footnote.number.format.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="footnote.number.symbols.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="footnote.mark.properties.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="footnote.properties.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="footnote.sep.leader.properties.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="fop.extensions.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="fop1.extensions.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="formal.object.properties.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="formal.procedures.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="formal.title.placement.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="formal.title.properties.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="funcsynopsis.decoration.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="funcsynopsis.style.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="function.parens.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="generate.index.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="generate.section.toc.level.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="generate.toc.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="glossary.as.blocks.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="glossary.collection.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="glossary.sort.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="glossentry.show.acronym.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="glosslist.as.blocks.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="glossterm.auto.link.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="glossterm.separation.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="glossterm.width.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="glossentry.list.item.properties.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="glossterm.list.properties.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="glossterm.block.properties.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="glossdef.list.properties.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="glossdef.block.properties.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="graphic.default.extension.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="header.content.properties.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="header.rule.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="header.column.widths.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="header.table.height.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="header.table.properties.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="headers.on.blank.pages.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="highlight.default.language.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="highlight.source.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="highlight.xslthl.config.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="hyphenate.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="hyphenate.verbatim.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="hyphenate.verbatim.characters.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="ignore.image.scaling.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="img.src.path.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="index.method.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="index.on.role.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="index.on.type.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="index.page.number.properties.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="informalequation.properties.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="informalexample.properties.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="informalfigure.properties.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="informal.object.properties.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="informaltable.properties.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="index.preferred.page.properties.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="index.div.title.properties.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="index.entry.properties.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="index.number.separator.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="index.range.separator.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="index.term.separator.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="insert.link.page.number.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="insert.xref.page.number.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="itemizedlist.properties.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="itemizedlist.label.properties.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="itemizedlist.label.width.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="keep.relative.image.uris.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="l10n.gentext.default.language.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="l10n.gentext.language.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="l10n.gentext.use.xref.language.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="l10n.lang.value.rfc.compliant.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="label.from.part.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="line-height.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="linenumbering.everyNth.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="linenumbering.extension.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="linenumbering.separator.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="linenumbering.width.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="list.block.properties.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="list.block.spacing.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="list.item.spacing.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="make.index.markup.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="make.single.year.ranges.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="make.year.ranges.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="margin.note.properties.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="margin.note.title.properties.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="margin.note.float.type.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="margin.note.width.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="marker.section.level.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="menuchoice.menu.separator.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="menuchoice.separator.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="monospace.font.family.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="monospace.properties.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="monospace.verbatim.properties.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="monospace.verbatim.font.width.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="nominal.table.width.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="normal.para.spacing.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="olink.doctitle.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="olink.base.uri.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="olink.debug.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="olink.properties.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="olink.lang.fallback.sequence.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="orderedlist.properties.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="orderedlist.label.properties.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="orderedlist.label.width.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="prefer.internal.olink.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="insert.olink.page.number.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="insert.olink.pdf.frag.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="page.height.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="page.height.portrait.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="page.margin.bottom.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="page.margin.inner.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="page.margin.outer.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="page.margin.top.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="page.orientation.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="page.width.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="page.width.portrait.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="paper.type.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="part.autolabel.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="passivetex.extensions.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="pgwide.properties.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="preface.autolabel.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="preferred.mediaobject.role.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="procedure.properties.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="process.empty.source.toc.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="process.source.toc.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="profile.arch.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="profile.audience.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="profile.attribute.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="profile.condition.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="profile.conformance.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="profile.lang.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="profile.os.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="profile.revision.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="profile.revisionflag.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="profile.role.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="profile.security.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="profile.separator.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="profile.status.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="profile.userlevel.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="profile.value.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="profile.vendor.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="profile.wordsize.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="punct.honorific.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="qanda.defaultlabel.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="qanda.in.toc.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="qanda.nested.in.toc.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="qanda.inherit.numeration.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="qandadiv.autolabel.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="qanda.title.level1.properties.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="qanda.title.level2.properties.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="qanda.title.level3.properties.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="qanda.title.level4.properties.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="qanda.title.level5.properties.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="qanda.title.level6.properties.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="qanda.title.properties.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="refentry.generate.name.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="refentry.generate.title.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="refentry.pagebreak.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="refentry.title.properties.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="refentry.xref.manvolnum.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="reference.autolabel.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="refclass.suppress.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="region.after.extent.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="region.before.extent.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="revhistory.table.properties.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="revhistory.table.cell.properties.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="revhistory.title.properties.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="root.properties.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="rootid.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="runinhead.default.title.end.punct.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="runinhead.title.end.punct.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="sans.font.family.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="section.autolabel.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="section.autolabel.max.depth.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="section.container.element.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="section.label.includes.component.label.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="section.title.level1.properties.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="section.title.level2.properties.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="section.title.level3.properties.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="section.title.level4.properties.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="section.title.level5.properties.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="section.title.level6.properties.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="section.title.properties.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="section.level1.properties.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="section.level2.properties.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="section.level3.properties.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="section.level4.properties.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="section.level5.properties.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="section.level6.properties.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="section.properties.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="segmentedlist.as.table.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="shade.verbatim.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="shade.verbatim.style.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="show.comments.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="sidebar.properties.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="sidebar.title.properties.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="sidebar.float.type.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="sidebar.float.width.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="simplesect.in.toc.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="subscript.properties.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="superscript.properties.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="symbol.font.family.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="table.cell.border.color.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="table.cell.border.style.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="table.cell.border.thickness.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="table.cell.padding.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="table.footnote.number.format.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="table.footnote.number.symbols.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="table.footnote.properties.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="table.frame.border.color.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="table.frame.border.style.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="table.frame.border.thickness.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="table.properties.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="tablecolumns.extension.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="table.table.properties.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="target.database.document.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="targets.filename.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="textdata.default.encoding.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="tex.math.delims.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="tex.math.in.alt.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="textinsert.extension.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="title.font.family.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="title.margin.left.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="toc.indent.width.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="toc.line.properties.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="toc.margin.properties.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="toc.max.depth.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="toc.section.depth.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="ulink.footnotes.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="ulink.hyphenate.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="ulink.hyphenate.chars.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="ulink.show.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="use.extensions.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="use.local.olink.style.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="use.role.as.xrefstyle.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="use.role.for.mediaobject.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="use.svg.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="variablelist.as.blocks.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="variablelist.max.termlength.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="variablelist.term.separator.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="variablelist.term.properties.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="variablelist.term.break.after.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="verbatim.properties.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="writing.mode.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="xep.extensions.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="xep.index.item.properties.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="xref.label-page.separator.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="xref.label-title.separator.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="xref.properties.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="xref.title-page.separator.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="xref.with.number.and.title.frag"&gt;&lt;/src:fragref&gt;
+
+&lt;/xsl:stylesheet&gt;
+</programlisting>
+
+</appendix>
+</book>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/param.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/param.xsl
new file mode 100644
index 0000000..b65ac4d
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/param.xsl
@@ -0,0 +1,946 @@
+<?xml version="1.0" encoding="ASCII"?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
+
+<!-- This file is generated from param.xweb -->
+
+<!-- ********************************************************************
+ $Id: param.xweb 8543 2009-12-02 06:05:24Z bobstayton $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<xsl:attribute-set name="abstract.properties">
+ <xsl:attribute name="start-indent">0.0in</xsl:attribute>
+ <xsl:attribute name="end-indent">0.0in</xsl:attribute>
+</xsl:attribute-set>
+<xsl:attribute-set name="abstract.title.properties">
+ <xsl:attribute name="font-family"><xsl:value-of select="$title.fontset"/></xsl:attribute>
+ <xsl:attribute name="font-weight">bold</xsl:attribute>
+ <xsl:attribute name="keep-with-next.within-column">always</xsl:attribute>
+ <xsl:attribute name="keep-with-next.within-column">always</xsl:attribute>
+ <xsl:attribute name="space-before.optimum"><xsl:value-of select="concat($body.font.master, 'pt')"/></xsl:attribute>
+ <xsl:attribute name="space-before.minimum"><xsl:value-of select="concat($body.font.master, 'pt * 0.8')"/></xsl:attribute>
+ <xsl:attribute name="space-before.maximum"><xsl:value-of select="concat($body.font.master, 'pt * 1.2')"/></xsl:attribute>
+ <xsl:attribute name="hyphenate">false</xsl:attribute>
+ <xsl:attribute name="text-align">center</xsl:attribute>
+</xsl:attribute-set>
+<xsl:param name="admon.graphics.extension">.png</xsl:param>
+<xsl:param name="admon.graphics" select="0"/>
+<xsl:param name="admon.graphics.path">images/</xsl:param>
+<xsl:param name="admon.textlabel" select="1"/>
+<xsl:attribute-set name="admonition.properties"/>
+<xsl:attribute-set name="admonition.title.properties">
+ <xsl:attribute name="font-size">14pt</xsl:attribute>
+ <xsl:attribute name="font-weight">bold</xsl:attribute>
+ <xsl:attribute name="hyphenate">false</xsl:attribute>
+ <xsl:attribute name="keep-with-next.within-column">always</xsl:attribute>
+</xsl:attribute-set>
+<xsl:attribute-set name="graphical.admonition.properties">
+ <xsl:attribute name="space-before.optimum">1em</xsl:attribute>
+ <xsl:attribute name="space-before.minimum">0.8em</xsl:attribute>
+ <xsl:attribute name="space-before.maximum">1.2em</xsl:attribute>
+ <xsl:attribute name="space-after.optimum">1em</xsl:attribute>
+ <xsl:attribute name="space-after.minimum">0.8em</xsl:attribute>
+ <xsl:attribute name="space-after.maximum">1.2em</xsl:attribute>
+</xsl:attribute-set>
+<xsl:attribute-set name="nongraphical.admonition.properties">
+ <xsl:attribute name="space-before.minimum">0.8em</xsl:attribute>
+ <xsl:attribute name="space-before.optimum">1em</xsl:attribute>
+ <xsl:attribute name="space-before.maximum">1.2em</xsl:attribute>
+ <xsl:attribute name="margin-{$direction.align.start}">0.25in</xsl:attribute>
+ <xsl:attribute name="margin-{$direction.align.end}">0.25in</xsl:attribute>
+</xsl:attribute-set>
+<xsl:param name="alignment">justify</xsl:param>
+<xsl:param name="appendix.autolabel">A</xsl:param>
+<xsl:param name="arbortext.extensions" select="0"/>
+<xsl:attribute-set name="article.appendix.title.properties" use-attribute-sets="section.title.properties section.title.level1.properties">
+ <xsl:attribute name="margin-{$direction.align.start}">
+ <xsl:value-of select="$title.margin.left"/>
+ </xsl:attribute>
+</xsl:attribute-set>
+<xsl:param name="author.othername.in.middle" select="1"/>
+<xsl:param name="autotoc.label.separator">. </xsl:param>
+<xsl:param name="axf.extensions" select="0"/>
+<xsl:param name="biblioentry.item.separator">. </xsl:param>
+<xsl:attribute-set name="biblioentry.properties" use-attribute-sets="normal.para.spacing">
+ <xsl:attribute name="start-indent">0.5in</xsl:attribute>
+ <xsl:attribute name="text-indent">-0.5in</xsl:attribute>
+</xsl:attribute-set>
+<xsl:param name="bibliography.collection">http://docbook.sourceforge.net/release/bibliography/bibliography.xml</xsl:param>
+
+<xsl:param name="bibliography.numbered" select="0"/>
+<xsl:param name="bibliography.style">normal</xsl:param>
+<xsl:attribute-set name="blockquote.properties">
+<xsl:attribute name="margin-{$direction.align.start}">0.5in</xsl:attribute>
+<xsl:attribute name="margin-{$direction.align.end}">0.5in</xsl:attribute>
+<xsl:attribute name="space-after.minimum">0.5em</xsl:attribute>
+<xsl:attribute name="space-after.optimum">1em</xsl:attribute>
+<xsl:attribute name="space-after.maximum">2em</xsl:attribute>
+</xsl:attribute-set>
+<xsl:param name="body.font.family">serif</xsl:param>
+<xsl:param name="body.font.master">10</xsl:param>
+<xsl:param name="body.font.size">
+ <xsl:value-of select="$body.font.master"/><xsl:text>pt</xsl:text>
+</xsl:param>
+<xsl:param name="body.margin.bottom">0.5in</xsl:param>
+<xsl:param name="body.margin.top">0.5in</xsl:param>
+<xsl:param name="body.start.indent">
+ <xsl:choose>
+ <xsl:when test="$fop.extensions != 0">0pt</xsl:when>
+ <xsl:when test="$passivetex.extensions != 0">0pt</xsl:when>
+ <xsl:otherwise>4pc</xsl:otherwise>
+ </xsl:choose>
+</xsl:param>
+<xsl:param name="body.end.indent">0pt</xsl:param>
+<xsl:param name="bookmarks.collapse" select="1"/>
+<xsl:param name="bridgehead.in.toc" select="0"/>
+<xsl:param name="callout.defaultcolumn">60</xsl:param>
+
+<xsl:param name="callout.graphics.extension">.svg</xsl:param>
+<xsl:param name="callout.graphics" select="1"/>
+<xsl:param name="callout.icon.size">7pt</xsl:param>
+
+<xsl:param name="callout.graphics.number.limit">30</xsl:param>
+<xsl:param name="callout.graphics.path">images/callouts/</xsl:param>
+<xsl:param name="callout.unicode.font">ZapfDingbats</xsl:param>
+<xsl:param name="callout.unicode" select="0"/>
+<xsl:param name="callout.unicode.number.limit">10</xsl:param>
+<xsl:param name="callout.unicode.start.character">10102</xsl:param>
+<xsl:param name="callouts.extension" select="1"/>
+<xsl:param name="chapter.autolabel" select="1"/>
+<xsl:param name="collect.xref.targets">no</xsl:param>
+<xsl:param name="column.count.back" select="1"/>
+<xsl:param name="column.count.body" select="1"/>
+<xsl:param name="column.count.front" select="1"/>
+<xsl:param name="column.count.index">2</xsl:param>
+<xsl:param name="column.count.lot" select="1"/>
+<xsl:param name="column.count.titlepage" select="1"/>
+<xsl:param name="column.gap.back">12pt</xsl:param>
+<xsl:param name="column.gap.body">12pt</xsl:param>
+<xsl:param name="column.gap.front">12pt</xsl:param>
+<xsl:param name="column.gap.index">12pt</xsl:param>
+<xsl:param name="column.gap.lot">12pt</xsl:param>
+<xsl:param name="column.gap.titlepage">12pt</xsl:param>
+<xsl:attribute-set name="compact.list.item.spacing">
+ <xsl:attribute name="space-before.optimum">0em</xsl:attribute>
+ <xsl:attribute name="space-before.minimum">0em</xsl:attribute>
+ <xsl:attribute name="space-before.maximum">0.2em</xsl:attribute>
+</xsl:attribute-set>
+<xsl:param name="component.label.includes.part.label" select="0"/>
+<xsl:attribute-set name="component.title.properties">
+ <xsl:attribute name="keep-with-next.within-column">always</xsl:attribute>
+ <xsl:attribute name="space-before.optimum"><xsl:value-of select="concat($body.font.master, 'pt')"/></xsl:attribute>
+ <xsl:attribute name="space-before.minimum"><xsl:value-of select="concat($body.font.master, 'pt * 0.8')"/></xsl:attribute>
+ <xsl:attribute name="space-before.maximum"><xsl:value-of select="concat($body.font.master, 'pt * 1.2')"/></xsl:attribute>
+ <xsl:attribute name="hyphenate">false</xsl:attribute>
+ <xsl:attribute name="text-align">
+ <xsl:choose>
+ <xsl:when test="((parent::article | parent::articleinfo | parent::info/parent::article) and not(ancestor::book) and not(self::bibliography)) or (parent::slides | parent::slidesinfo)">center</xsl:when>
+ <xsl:otherwise>start</xsl:otherwise>
+ </xsl:choose>
+ </xsl:attribute>
+ <xsl:attribute name="start-indent"><xsl:value-of select="$title.margin.left"/></xsl:attribute>
+</xsl:attribute-set>
+<xsl:attribute-set name="component.titlepage.properties">
+</xsl:attribute-set>
+<xsl:param name="crop.marks" select="0"/>
+<xsl:param name="crop.mark.width">0.5pt</xsl:param>
+<xsl:param name="crop.mark.offset">24pt</xsl:param>
+<xsl:param name="crop.mark.bleed">6pt</xsl:param>
+<xsl:param name="current.docid"/>
+<xsl:param name="default.float.class">
+ <xsl:choose>
+ <xsl:when test="contains($stylesheet.result.type,'html')">left</xsl:when>
+ <xsl:otherwise>before</xsl:otherwise>
+ </xsl:choose>
+</xsl:param>
+<xsl:param name="default.image.width"/>
+<xsl:param name="default.table.width"/>
+<xsl:param name="default.table.frame">all</xsl:param>
+<xsl:param name="default.table.rules">none</xsl:param>
+<xsl:param name="default.units">pt</xsl:param>
+<xsl:param name="dingbat.font.family">serif</xsl:param>
+<xsl:param name="double.sided" select="0"/>
+<xsl:param name="draft.mode">no</xsl:param>
+<xsl:param name="draft.watermark.image">images/draft.png</xsl:param>
+
+<xsl:param name="ebnf.assignment">
+ <fo:inline xmlns:fo="http://www.w3.org/1999/XSL/Format" font-family="{$monospace.font.family}">
+ <xsl:text>::=</xsl:text>
+ </fo:inline>
+</xsl:param>
+
+<xsl:param name="ebnf.statement.terminator"/>
+<xsl:param name="email.delimiters.enabled" select="1"/>
+<xsl:param name="email.mailto.enabled" select="0"/>
+<xsl:attribute-set name="equation.properties" use-attribute-sets="formal.object.properties"/>
+<xsl:attribute-set name="equation.number.properties">
+ <xsl:attribute name="text-align">end</xsl:attribute>
+ <xsl:attribute name="display-align">center</xsl:attribute>
+</xsl:attribute-set>
+<xsl:attribute-set name="example.properties" use-attribute-sets="formal.object.properties"/>
+<xsl:param name="exsl.node.set.available">
+ <xsl:choose>
+ <xsl:when xmlns:exsl="http://exslt.org/common" exsl:foo="" test="function-available('exsl:node-set') or contains(system-property('xsl:vendor'), 'Apache Software Foundation')">1</xsl:when>
+ <xsl:otherwise>0</xsl:otherwise>
+ </xsl:choose>
+</xsl:param>
+<xsl:attribute-set name="figure.properties" use-attribute-sets="formal.object.properties"/>
+<xsl:param name="firstterm.only.link" select="0"/>
+<xsl:attribute-set name="footer.content.properties">
+ <xsl:attribute name="font-family">
+ <xsl:value-of select="$body.fontset"/>
+ </xsl:attribute>
+ <xsl:attribute name="margin-left">
+ <xsl:value-of select="$title.margin.left"/>
+ </xsl:attribute>
+</xsl:attribute-set>
+<xsl:param name="footer.rule" select="1"/>
+<xsl:param name="footer.column.widths">1 1 1</xsl:param>
+<xsl:param name="footer.table.height">14pt</xsl:param>
+<xsl:attribute-set name="footer.table.properties">
+ <xsl:attribute name="table-layout">fixed</xsl:attribute>
+ <xsl:attribute name="width">100%</xsl:attribute>
+</xsl:attribute-set>
+<xsl:param name="footers.on.blank.pages" select="1"/>
+<xsl:param name="footnote.font.size">
+ <xsl:value-of select="$body.font.master * 0.8"/><xsl:text>pt</xsl:text>
+</xsl:param>
+<xsl:param name="footnote.number.format">1</xsl:param>
+<xsl:param name="footnote.number.symbols"/>
+<xsl:attribute-set name="footnote.mark.properties">
+ <xsl:attribute name="font-family"><xsl:value-of select="$body.fontset"/></xsl:attribute>
+ <xsl:attribute name="font-size">75%</xsl:attribute>
+ <xsl:attribute name="font-weight">normal</xsl:attribute>
+ <xsl:attribute name="font-style">normal</xsl:attribute>
+</xsl:attribute-set>
+<xsl:attribute-set name="footnote.properties">
+ <xsl:attribute name="font-family"><xsl:value-of select="$body.fontset"/></xsl:attribute>
+ <xsl:attribute name="font-size"><xsl:value-of select="$footnote.font.size"/></xsl:attribute>
+ <xsl:attribute name="font-weight">normal</xsl:attribute>
+ <xsl:attribute name="font-style">normal</xsl:attribute>
+ <xsl:attribute name="text-align"><xsl:value-of select="$alignment"/></xsl:attribute>
+ <xsl:attribute name="start-indent">0pt</xsl:attribute>
+ <xsl:attribute name="text-indent">0pt</xsl:attribute>
+ <xsl:attribute name="hyphenate"><xsl:value-of select="$hyphenate"/></xsl:attribute>
+ <xsl:attribute name="wrap-option">wrap</xsl:attribute>
+ <xsl:attribute name="linefeed-treatment">treat-as-space</xsl:attribute>
+</xsl:attribute-set>
+<xsl:attribute-set name="footnote.sep.leader.properties">
+ <xsl:attribute name="color">black</xsl:attribute>
+ <xsl:attribute name="leader-pattern">rule</xsl:attribute>
+ <xsl:attribute name="leader-length">1in</xsl:attribute>
+</xsl:attribute-set>
+<xsl:param name="fop.extensions" select="0"/>
+<xsl:param name="fop1.extensions" select="0"/>
+<xsl:attribute-set name="formal.object.properties">
+ <xsl:attribute name="space-before.minimum">0.5em</xsl:attribute>
+ <xsl:attribute name="space-before.optimum">1em</xsl:attribute>
+ <xsl:attribute name="space-before.maximum">2em</xsl:attribute>
+ <xsl:attribute name="space-after.minimum">0.5em</xsl:attribute>
+ <xsl:attribute name="space-after.optimum">1em</xsl:attribute>
+ <xsl:attribute name="space-after.maximum">2em</xsl:attribute>
+ <xsl:attribute name="keep-together.within-column">always</xsl:attribute>
+</xsl:attribute-set>
+<xsl:param name="formal.procedures" select="1"/>
+<xsl:param name="formal.title.placement">
+figure before
+example before
+equation before
+table before
+procedure before
+task before
+</xsl:param>
+<xsl:attribute-set name="formal.title.properties" use-attribute-sets="normal.para.spacing">
+ <xsl:attribute name="font-weight">bold</xsl:attribute>
+ <xsl:attribute name="font-size">
+ <xsl:value-of select="$body.font.master * 1.2"/>
+ <xsl:text>pt</xsl:text>
+ </xsl:attribute>
+ <xsl:attribute name="hyphenate">false</xsl:attribute>
+ <xsl:attribute name="space-after.minimum">0.4em</xsl:attribute>
+ <xsl:attribute name="space-after.optimum">0.6em</xsl:attribute>
+ <xsl:attribute name="space-after.maximum">0.8em</xsl:attribute>
+</xsl:attribute-set>
+<xsl:param name="funcsynopsis.decoration" select="1"/>
+<xsl:param name="funcsynopsis.style">kr</xsl:param>
+<xsl:param name="function.parens" select="0"/>
+<xsl:param name="generate.index" select="1"/>
+<xsl:param name="generate.section.toc.level" select="0"/>
+
+<xsl:param name="generate.toc">
+/appendix toc,title
+article/appendix nop
+/article toc,title
+book toc,title,figure,table,example,equation
+/chapter toc,title
+part toc,title
+/preface toc,title
+reference toc,title
+/sect1 toc
+/sect2 toc
+/sect3 toc
+/sect4 toc
+/sect5 toc
+/section toc
+set toc,title
+</xsl:param>
+<xsl:param name="glossary.as.blocks" select="0"/>
+<xsl:param name="glossary.collection"/>
+<xsl:param name="glossary.sort" select="0"/>
+<xsl:param name="glossentry.show.acronym">no</xsl:param>
+<xsl:param name="glosslist.as.blocks" select="0"/>
+<xsl:param name="glossterm.auto.link" select="0"/>
+<xsl:param name="glossterm.separation">0.25in</xsl:param>
+<xsl:param name="glossterm.width">2in</xsl:param>
+<xsl:attribute-set name="glossentry.list.item.properties">
+ <xsl:attribute name="space-before.optimum">1em</xsl:attribute>
+ <xsl:attribute name="space-before.minimum">0.8em</xsl:attribute>
+ <xsl:attribute name="space-before.maximum">1.2em</xsl:attribute>
+</xsl:attribute-set>
+<xsl:attribute-set name="glossterm.list.properties">
+</xsl:attribute-set>
+<xsl:attribute-set name="glossterm.block.properties">
+ <xsl:attribute name="space-before.optimum">1em</xsl:attribute>
+ <xsl:attribute name="space-before.minimum">0.8em</xsl:attribute>
+ <xsl:attribute name="space-before.maximum">1.2em</xsl:attribute>
+ <xsl:attribute name="keep-with-next.within-column">always</xsl:attribute>
+ <xsl:attribute name="keep-together.within-column">always</xsl:attribute>
+</xsl:attribute-set>
+<xsl:attribute-set name="glossdef.list.properties">
+</xsl:attribute-set>
+<xsl:attribute-set name="glossdef.block.properties">
+ <xsl:attribute name="margin-{$direction.align.start}">.25in</xsl:attribute>
+</xsl:attribute-set>
+<xsl:param name="graphic.default.extension"/>
+<xsl:attribute-set name="header.content.properties">
+ <xsl:attribute name="font-family">
+ <xsl:value-of select="$body.fontset"/>
+ </xsl:attribute>
+ <xsl:attribute name="margin-left">
+ <xsl:value-of select="$title.margin.left"/>
+ </xsl:attribute>
+</xsl:attribute-set>
+<xsl:param name="header.rule" select="1"/>
+<xsl:param name="header.column.widths">1 1 1</xsl:param>
+<xsl:param name="header.table.height">14pt</xsl:param>
+<xsl:attribute-set name="header.table.properties">
+ <xsl:attribute name="table-layout">fixed</xsl:attribute>
+ <xsl:attribute name="width">100%</xsl:attribute>
+</xsl:attribute-set>
+<xsl:param name="headers.on.blank.pages" select="1"/>
+<xsl:param name="highlight.default.language"/>
+<xsl:param name="highlight.source" select="0"/>
+<xsl:param name="highlight.xslthl.config"/>
+<xsl:param name="hyphenate">true</xsl:param>
+<xsl:param name="hyphenate.verbatim" select="0"/>
+<xsl:param name="hyphenate.verbatim.characters"/>
+<xsl:param name="ignore.image.scaling" select="0"/>
+<xsl:param name="img.src.path"/>
+<xsl:param name="index.method">basic</xsl:param>
+<xsl:param name="index.on.role" select="0"/>
+<xsl:param name="index.on.type" select="0"/>
+<xsl:attribute-set name="index.page.number.properties">
+</xsl:attribute-set>
+<xsl:attribute-set name="informalequation.properties" use-attribute-sets="informal.object.properties"/>
+<xsl:attribute-set name="informalexample.properties" use-attribute-sets="informal.object.properties"/>
+<xsl:attribute-set name="informalfigure.properties" use-attribute-sets="informal.object.properties"/>
+<xsl:attribute-set name="informal.object.properties">
+ <xsl:attribute name="space-before.minimum">0.5em</xsl:attribute>
+ <xsl:attribute name="space-before.optimum">1em</xsl:attribute>
+ <xsl:attribute name="space-before.maximum">2em</xsl:attribute>
+ <xsl:attribute name="space-after.minimum">0.5em</xsl:attribute>
+ <xsl:attribute name="space-after.optimum">1em</xsl:attribute>
+ <xsl:attribute name="space-after.maximum">2em</xsl:attribute>
+</xsl:attribute-set>
+<xsl:attribute-set name="informaltable.properties" use-attribute-sets="informal.object.properties"/>
+<xsl:attribute-set name="index.preferred.page.properties">
+ <xsl:attribute name="font-weight">bold</xsl:attribute>
+</xsl:attribute-set>
+<xsl:attribute-set name="index.div.title.properties">
+ <xsl:attribute name="margin-{$direction.align.start}">0pt</xsl:attribute>
+ <xsl:attribute name="font-size">14.4pt</xsl:attribute>
+ <xsl:attribute name="font-family"><xsl:value-of select="$title.fontset"/></xsl:attribute>
+ <xsl:attribute name="font-weight">bold</xsl:attribute>
+ <xsl:attribute name="keep-with-next.within-column">always</xsl:attribute>
+ <xsl:attribute name="space-before.optimum"><xsl:value-of select="concat($body.font.master,'pt')"/></xsl:attribute>
+ <xsl:attribute name="space-before.minimum"><xsl:value-of select="concat($body.font.master,'pt * 0.8')"/></xsl:attribute>
+ <xsl:attribute name="space-before.maximum"><xsl:value-of select="concat($body.font.master,'pt * 1.2')"/></xsl:attribute>
+ <xsl:attribute name="start-indent">0pt</xsl:attribute>
+</xsl:attribute-set>
+<xsl:attribute-set name="index.entry.properties">
+ <xsl:attribute name="start-indent">0pt</xsl:attribute>
+</xsl:attribute-set>
+<xsl:param name="index.number.separator"/>
+<xsl:param name="index.range.separator"/>
+<xsl:param name="index.term.separator"/>
+<xsl:param name="insert.link.page.number">no</xsl:param>
+<xsl:param name="insert.xref.page.number">no</xsl:param>
+<xsl:attribute-set name="itemizedlist.properties" use-attribute-sets="list.block.properties">
+</xsl:attribute-set>
+<xsl:attribute-set name="itemizedlist.label.properties">
+</xsl:attribute-set>
+ <xsl:param name="itemizedlist.label.width">1.0em</xsl:param>
+
+
+<xsl:param name="keep.relative.image.uris" select="0"/>
+<xsl:param name="l10n.gentext.default.language">en</xsl:param>
+<xsl:param name="l10n.gentext.language"/>
+<xsl:param name="l10n.gentext.use.xref.language" select="0"/>
+<xsl:param name="l10n.lang.value.rfc.compliant" select="1"/>
+<xsl:param name="label.from.part" select="0"/>
+<xsl:param name="line-height">normal</xsl:param>
+<xsl:param name="linenumbering.everyNth">5</xsl:param>
+<xsl:param name="linenumbering.extension" select="1"/>
+<xsl:param name="linenumbering.separator"><xsl:text> </xsl:text></xsl:param>
+<xsl:param name="linenumbering.width">3</xsl:param>
+<xsl:attribute-set name="list.block.properties">
+ <xsl:attribute name="provisional-label-separation">0.2em</xsl:attribute>
+ <xsl:attribute name="provisional-distance-between-starts">1.5em</xsl:attribute>
+</xsl:attribute-set>
+<xsl:attribute-set name="list.block.spacing">
+ <xsl:attribute name="space-before.optimum">1em</xsl:attribute>
+ <xsl:attribute name="space-before.minimum">0.8em</xsl:attribute>
+ <xsl:attribute name="space-before.maximum">1.2em</xsl:attribute>
+ <xsl:attribute name="space-after.optimum">1em</xsl:attribute>
+ <xsl:attribute name="space-after.minimum">0.8em</xsl:attribute>
+ <xsl:attribute name="space-after.maximum">1.2em</xsl:attribute>
+</xsl:attribute-set>
+<xsl:attribute-set name="list.item.spacing">
+ <xsl:attribute name="space-before.optimum">1em</xsl:attribute>
+ <xsl:attribute name="space-before.minimum">0.8em</xsl:attribute>
+ <xsl:attribute name="space-before.maximum">1.2em</xsl:attribute>
+</xsl:attribute-set>
+<xsl:param name="make.index.markup" select="0"/>
+<xsl:param name="make.single.year.ranges" select="0"/>
+<xsl:param name="make.year.ranges" select="0"/>
+<xsl:attribute-set name="margin.note.properties">
+ <xsl:attribute name="font-size">90%</xsl:attribute>
+ <xsl:attribute name="text-align">start</xsl:attribute>
+</xsl:attribute-set>
+<xsl:attribute-set name="margin.note.title.properties">
+ <xsl:attribute name="font-weight">bold</xsl:attribute>
+ <xsl:attribute name="hyphenate">false</xsl:attribute>
+ <xsl:attribute name="text-align">start</xsl:attribute>
+ <xsl:attribute name="keep-with-next.within-column">always</xsl:attribute>
+</xsl:attribute-set>
+<xsl:param name="margin.note.float.type">none</xsl:param>
+<xsl:param name="margin.note.width">1in</xsl:param>
+<xsl:param name="marker.section.level">2</xsl:param>
+<xsl:param name="menuchoice.menu.separator"> &#8594; </xsl:param>
+<xsl:param name="menuchoice.separator">+</xsl:param>
+<xsl:param name="monospace.font.family">monospace</xsl:param>
+<xsl:attribute-set name="monospace.properties">
+ <xsl:attribute name="font-family">
+ <xsl:value-of select="$monospace.font.family"/>
+ </xsl:attribute>
+</xsl:attribute-set>
+<xsl:attribute-set name="monospace.verbatim.properties" use-attribute-sets="verbatim.properties monospace.properties">
+ <xsl:attribute name="text-align">start</xsl:attribute>
+ <xsl:attribute name="wrap-option">no-wrap</xsl:attribute>
+</xsl:attribute-set>
+<xsl:param name="monospace.verbatim.font.width">0.60em</xsl:param>
+<xsl:param name="nominal.table.width">6in</xsl:param>
+<xsl:attribute-set name="normal.para.spacing">
+ <xsl:attribute name="space-before.optimum">1em</xsl:attribute>
+ <xsl:attribute name="space-before.minimum">0.8em</xsl:attribute>
+ <xsl:attribute name="space-before.maximum">1.2em</xsl:attribute>
+</xsl:attribute-set>
+<xsl:param name="olink.doctitle">no</xsl:param>
+<xsl:param name="olink.base.uri"/>
+<xsl:param name="olink.debug" select="0"/>
+<xsl:attribute-set name="olink.properties">
+ <xsl:attribute name="show-destination">replace</xsl:attribute>
+</xsl:attribute-set>
+<xsl:param name="olink.lang.fallback.sequence"/>
+<xsl:attribute-set name="orderedlist.properties" use-attribute-sets="list.block.properties">
+ <xsl:attribute name="provisional-distance-between-starts">2em</xsl:attribute>
+</xsl:attribute-set>
+<xsl:attribute-set name="orderedlist.label.properties">
+</xsl:attribute-set>
+<xsl:param name="orderedlist.label.width">1.2em</xsl:param>
+<xsl:param name="prefer.internal.olink" select="0"/>
+<xsl:param name="insert.olink.page.number">no</xsl:param>
+<xsl:param name="insert.olink.pdf.frag" select="0"/>
+<xsl:param name="page.height">
+ <xsl:choose>
+ <xsl:when test="$page.orientation = 'portrait'">
+ <xsl:value-of select="$page.height.portrait"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$page.width.portrait"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:param>
+<xsl:param name="page.height.portrait">
+ <xsl:choose>
+ <xsl:when test="$paper.type = 'A4landscape'">210mm</xsl:when>
+ <xsl:when test="$paper.type = 'USletter'">11in</xsl:when>
+ <xsl:when test="$paper.type = 'USlandscape'">8.5in</xsl:when>
+ <xsl:when test="$paper.type = '4A0'">2378mm</xsl:when>
+ <xsl:when test="$paper.type = '2A0'">1682mm</xsl:when>
+ <xsl:when test="$paper.type = 'A0'">1189mm</xsl:when>
+ <xsl:when test="$paper.type = 'A1'">841mm</xsl:when>
+ <xsl:when test="$paper.type = 'A2'">594mm</xsl:when>
+ <xsl:when test="$paper.type = 'A3'">420mm</xsl:when>
+ <xsl:when test="$paper.type = 'A4'">297mm</xsl:when>
+ <xsl:when test="$paper.type = 'A5'">210mm</xsl:when>
+ <xsl:when test="$paper.type = 'A6'">148mm</xsl:when>
+ <xsl:when test="$paper.type = 'A7'">105mm</xsl:when>
+ <xsl:when test="$paper.type = 'A8'">74mm</xsl:when>
+ <xsl:when test="$paper.type = 'A9'">52mm</xsl:when>
+ <xsl:when test="$paper.type = 'A10'">37mm</xsl:when>
+ <xsl:when test="$paper.type = 'B0'">1414mm</xsl:when>
+ <xsl:when test="$paper.type = 'B1'">1000mm</xsl:when>
+ <xsl:when test="$paper.type = 'B2'">707mm</xsl:when>
+ <xsl:when test="$paper.type = 'B3'">500mm</xsl:when>
+ <xsl:when test="$paper.type = 'B4'">353mm</xsl:when>
+ <xsl:when test="$paper.type = 'B5'">250mm</xsl:when>
+ <xsl:when test="$paper.type = 'B6'">176mm</xsl:when>
+ <xsl:when test="$paper.type = 'B7'">125mm</xsl:when>
+ <xsl:when test="$paper.type = 'B8'">88mm</xsl:when>
+ <xsl:when test="$paper.type = 'B9'">62mm</xsl:when>
+ <xsl:when test="$paper.type = 'B10'">44mm</xsl:when>
+ <xsl:when test="$paper.type = 'C0'">1297mm</xsl:when>
+ <xsl:when test="$paper.type = 'C1'">917mm</xsl:when>
+ <xsl:when test="$paper.type = 'C2'">648mm</xsl:when>
+ <xsl:when test="$paper.type = 'C3'">458mm</xsl:when>
+ <xsl:when test="$paper.type = 'C4'">324mm</xsl:when>
+ <xsl:when test="$paper.type = 'C5'">229mm</xsl:when>
+ <xsl:when test="$paper.type = 'C6'">162mm</xsl:when>
+ <xsl:when test="$paper.type = 'C7'">114mm</xsl:when>
+ <xsl:when test="$paper.type = 'C8'">81mm</xsl:when>
+ <xsl:when test="$paper.type = 'C9'">57mm</xsl:when>
+ <xsl:when test="$paper.type = 'C10'">40mm</xsl:when>
+ <xsl:otherwise>11in</xsl:otherwise>
+ </xsl:choose>
+</xsl:param>
+<xsl:param name="page.margin.bottom">0.5in</xsl:param>
+<xsl:param name="page.margin.inner">
+ <xsl:choose>
+ <xsl:when test="$double.sided != 0">1.25in</xsl:when>
+ <xsl:otherwise>1in</xsl:otherwise>
+ </xsl:choose>
+</xsl:param>
+<xsl:param name="page.margin.outer">
+ <xsl:choose>
+ <xsl:when test="$double.sided != 0">0.75in</xsl:when>
+ <xsl:otherwise>1in</xsl:otherwise>
+ </xsl:choose>
+</xsl:param>
+<xsl:param name="page.margin.top">0.5in</xsl:param>
+<xsl:param name="page.orientation">portrait</xsl:param>
+<xsl:param name="page.width">
+ <xsl:choose>
+ <xsl:when test="$page.orientation = 'portrait'">
+ <xsl:value-of select="$page.width.portrait"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$page.height.portrait"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:param>
+<xsl:param name="page.width.portrait">
+ <xsl:choose>
+ <xsl:when test="$paper.type = 'USletter'">8.5in</xsl:when>
+ <xsl:when test="$paper.type = '4A0'">1682mm</xsl:when>
+ <xsl:when test="$paper.type = '2A0'">1189mm</xsl:when>
+ <xsl:when test="$paper.type = 'A0'">841mm</xsl:when>
+ <xsl:when test="$paper.type = 'A1'">594mm</xsl:when>
+ <xsl:when test="$paper.type = 'A2'">420mm</xsl:when>
+ <xsl:when test="$paper.type = 'A3'">297mm</xsl:when>
+ <xsl:when test="$paper.type = 'A4'">210mm</xsl:when>
+ <xsl:when test="$paper.type = 'A5'">148mm</xsl:when>
+ <xsl:when test="$paper.type = 'A6'">105mm</xsl:when>
+ <xsl:when test="$paper.type = 'A7'">74mm</xsl:when>
+ <xsl:when test="$paper.type = 'A8'">52mm</xsl:when>
+ <xsl:when test="$paper.type = 'A9'">37mm</xsl:when>
+ <xsl:when test="$paper.type = 'A10'">26mm</xsl:when>
+ <xsl:when test="$paper.type = 'B0'">1000mm</xsl:when>
+ <xsl:when test="$paper.type = 'B1'">707mm</xsl:when>
+ <xsl:when test="$paper.type = 'B2'">500mm</xsl:when>
+ <xsl:when test="$paper.type = 'B3'">353mm</xsl:when>
+ <xsl:when test="$paper.type = 'B4'">250mm</xsl:when>
+ <xsl:when test="$paper.type = 'B5'">176mm</xsl:when>
+ <xsl:when test="$paper.type = 'B6'">125mm</xsl:when>
+ <xsl:when test="$paper.type = 'B7'">88mm</xsl:when>
+ <xsl:when test="$paper.type = 'B8'">62mm</xsl:when>
+ <xsl:when test="$paper.type = 'B9'">44mm</xsl:when>
+ <xsl:when test="$paper.type = 'B10'">31mm</xsl:when>
+ <xsl:when test="$paper.type = 'C0'">917mm</xsl:when>
+ <xsl:when test="$paper.type = 'C1'">648mm</xsl:when>
+ <xsl:when test="$paper.type = 'C2'">458mm</xsl:when>
+ <xsl:when test="$paper.type = 'C3'">324mm</xsl:when>
+ <xsl:when test="$paper.type = 'C4'">229mm</xsl:when>
+ <xsl:when test="$paper.type = 'C5'">162mm</xsl:when>
+ <xsl:when test="$paper.type = 'C6'">114mm</xsl:when>
+ <xsl:when test="$paper.type = 'C7'">81mm</xsl:when>
+ <xsl:when test="$paper.type = 'C8'">57mm</xsl:when>
+ <xsl:when test="$paper.type = 'C9'">40mm</xsl:when>
+ <xsl:when test="$paper.type = 'C10'">28mm</xsl:when>
+ <xsl:otherwise>8.5in</xsl:otherwise>
+ </xsl:choose>
+</xsl:param>
+<xsl:param name="paper.type">USletter</xsl:param>
+<xsl:param name="part.autolabel">I</xsl:param>
+<xsl:param name="passivetex.extensions" select="0"/>
+<xsl:attribute-set name="pgwide.properties">
+ <xsl:attribute name="start-indent">0pt</xsl:attribute>
+</xsl:attribute-set>
+<xsl:param name="preface.autolabel" select="0"/>
+<xsl:param name="preferred.mediaobject.role"/>
+<xsl:attribute-set name="procedure.properties" use-attribute-sets="formal.object.properties">
+ <xsl:attribute name="keep-together.within-column">auto</xsl:attribute>
+</xsl:attribute-set>
+<xsl:param name="process.empty.source.toc" select="0"/>
+<xsl:param name="process.source.toc" select="0"/>
+<xsl:param name="profile.arch"/>
+<xsl:param name="profile.audience"/>
+<xsl:param name="profile.attribute"/>
+<xsl:param name="profile.condition"/>
+<xsl:param name="profile.conformance"/>
+<xsl:param name="profile.lang"/>
+<xsl:param name="profile.os"/>
+<xsl:param name="profile.revision"/>
+<xsl:param name="profile.revisionflag"/>
+<xsl:param name="profile.role"/>
+<xsl:param name="profile.security"/>
+<xsl:param name="profile.separator">;</xsl:param>
+<xsl:param name="profile.status"/>
+<xsl:param name="profile.userlevel"/>
+<xsl:param name="profile.value"/>
+<xsl:param name="profile.vendor"/>
+<xsl:param name="profile.wordsize"/>
+<xsl:param name="punct.honorific">.</xsl:param>
+<xsl:param name="qanda.defaultlabel">number</xsl:param>
+<xsl:param name="qanda.in.toc" select="0"/>
+<xsl:param name="qanda.nested.in.toc" select="0"/>
+<xsl:param name="qanda.inherit.numeration" select="1"/>
+<xsl:param name="qandadiv.autolabel" select="1"/>
+<xsl:attribute-set name="qanda.title.level1.properties">
+ <xsl:attribute name="font-size">
+ <xsl:value-of select="$body.font.master * 2.0736"/>
+ <xsl:text>pt</xsl:text>
+ </xsl:attribute>
+</xsl:attribute-set>
+<xsl:attribute-set name="qanda.title.level2.properties">
+ <xsl:attribute name="font-size">
+ <xsl:value-of select="$body.font.master * 1.728"/>
+ <xsl:text>pt</xsl:text>
+ </xsl:attribute>
+</xsl:attribute-set>
+<xsl:attribute-set name="qanda.title.level3.properties">
+ <xsl:attribute name="font-size">
+ <xsl:value-of select="$body.font.master * 1.44"/>
+ <xsl:text>pt</xsl:text>
+ </xsl:attribute>
+</xsl:attribute-set>
+<xsl:attribute-set name="qanda.title.level4.properties">
+ <xsl:attribute name="font-size">
+ <xsl:value-of select="$body.font.master * 1.2"/>
+ <xsl:text>pt</xsl:text>
+ </xsl:attribute>
+</xsl:attribute-set>
+<xsl:attribute-set name="qanda.title.level5.properties">
+ <xsl:attribute name="font-size">
+ <xsl:value-of select="$body.font.master"/>
+ <xsl:text>pt</xsl:text>
+ </xsl:attribute>
+</xsl:attribute-set>
+<xsl:attribute-set name="qanda.title.level6.properties">
+ <xsl:attribute name="font-size">
+ <xsl:value-of select="$body.font.master"/>
+ <xsl:text>pt</xsl:text>
+ </xsl:attribute>
+</xsl:attribute-set>
+<xsl:attribute-set name="qanda.title.properties">
+ <xsl:attribute name="font-family">
+ <xsl:value-of select="$title.font.family"/>
+ </xsl:attribute>
+ <xsl:attribute name="font-weight">bold</xsl:attribute>
+ <!-- font size is calculated dynamically by qanda.heading template -->
+ <xsl:attribute name="keep-with-next.within-column">always</xsl:attribute>
+ <xsl:attribute name="space-before.minimum">0.8em</xsl:attribute>
+ <xsl:attribute name="space-before.optimum">1.0em</xsl:attribute>
+ <xsl:attribute name="space-before.maximum">1.2em</xsl:attribute>
+</xsl:attribute-set>
+<xsl:param name="refentry.generate.name" select="1"/>
+<xsl:param name="refentry.generate.title" select="0"/>
+<xsl:param name="refentry.pagebreak" select="1"/>
+<xsl:attribute-set name="refentry.title.properties">
+ <xsl:attribute name="font-family">
+ <xsl:value-of select="$title.font.family"/>
+ </xsl:attribute>
+ <xsl:attribute name="font-size">18pt</xsl:attribute>
+ <xsl:attribute name="font-weight">bold</xsl:attribute>
+ <xsl:attribute name="space-after">1em</xsl:attribute>
+ <xsl:attribute name="hyphenate">false</xsl:attribute>
+ <xsl:attribute name="keep-with-next.within-column">always</xsl:attribute>
+ <xsl:attribute name="space-before.minimum">0.8em</xsl:attribute>
+ <xsl:attribute name="space-before.optimum">1.0em</xsl:attribute>
+ <xsl:attribute name="space-before.maximum">1.2em</xsl:attribute>
+ <xsl:attribute name="space-after.optimum">0.5em</xsl:attribute>
+ <xsl:attribute name="space-after.minimum">0.4em</xsl:attribute>
+ <xsl:attribute name="space-after.maximum">0.6em</xsl:attribute>
+ <xsl:attribute name="start-indent"><xsl:value-of select="$title.margin.left"/></xsl:attribute>
+</xsl:attribute-set>
+<xsl:param name="refentry.xref.manvolnum" select="1"/>
+ <xsl:param name="reference.autolabel">I</xsl:param>
+<xsl:param name="refclass.suppress" select="0"/>
+<xsl:param name="region.after.extent">0.4in</xsl:param>
+<xsl:param name="region.before.extent">0.4in</xsl:param>
+<xsl:attribute-set name="revhistory.table.properties">
+</xsl:attribute-set>
+<xsl:attribute-set name="revhistory.table.cell.properties">
+</xsl:attribute-set>
+<xsl:attribute-set name="revhistory.title.properties">
+</xsl:attribute-set>
+<xsl:attribute-set name="root.properties">
+ <xsl:attribute name="font-family">
+ <xsl:value-of select="$body.fontset"/>
+ </xsl:attribute>
+ <xsl:attribute name="font-size">
+ <xsl:value-of select="$body.font.size"/>
+ </xsl:attribute>
+ <xsl:attribute name="text-align">
+ <xsl:value-of select="$alignment"/>
+ </xsl:attribute>
+ <xsl:attribute name="line-height">
+ <xsl:value-of select="$line-height"/>
+ </xsl:attribute>
+ <xsl:attribute name="font-selection-strategy">character-by-character</xsl:attribute>
+ <xsl:attribute name="line-height-shift-adjustment">disregard-shifts</xsl:attribute>
+ <xsl:attribute name="writing-mode">
+ <xsl:value-of select="$direction.mode"/>
+ </xsl:attribute>
+</xsl:attribute-set>
+<xsl:param name="rootid"/>
+<xsl:param name="runinhead.default.title.end.punct">.</xsl:param>
+<xsl:param name="runinhead.title.end.punct">.!?:</xsl:param>
+<xsl:param name="sans.font.family">sans-serif</xsl:param>
+<xsl:param name="section.autolabel" select="0"/>
+<xsl:param name="section.autolabel.max.depth">8</xsl:param>
+<xsl:param name="section.container.element">block</xsl:param>
+<xsl:param name="section.label.includes.component.label" select="0"/>
+<xsl:attribute-set name="section.title.level1.properties">
+ <xsl:attribute name="font-size">
+ <xsl:value-of select="$body.font.master * 2.0736"/>
+ <xsl:text>pt</xsl:text>
+ </xsl:attribute>
+</xsl:attribute-set>
+<xsl:attribute-set name="section.title.level2.properties">
+ <xsl:attribute name="font-size">
+ <xsl:value-of select="$body.font.master * 1.728"/>
+ <xsl:text>pt</xsl:text>
+ </xsl:attribute>
+</xsl:attribute-set>
+<xsl:attribute-set name="section.title.level3.properties">
+ <xsl:attribute name="font-size">
+ <xsl:value-of select="$body.font.master * 1.44"/>
+ <xsl:text>pt</xsl:text>
+ </xsl:attribute>
+</xsl:attribute-set>
+<xsl:attribute-set name="section.title.level4.properties">
+ <xsl:attribute name="font-size">
+ <xsl:value-of select="$body.font.master * 1.2"/>
+ <xsl:text>pt</xsl:text>
+ </xsl:attribute>
+</xsl:attribute-set>
+<xsl:attribute-set name="section.title.level5.properties">
+ <xsl:attribute name="font-size">
+ <xsl:value-of select="$body.font.master"/>
+ <xsl:text>pt</xsl:text>
+ </xsl:attribute>
+</xsl:attribute-set>
+<xsl:attribute-set name="section.title.level6.properties">
+ <xsl:attribute name="font-size">
+ <xsl:value-of select="$body.font.master"/>
+ <xsl:text>pt</xsl:text>
+ </xsl:attribute>
+</xsl:attribute-set>
+<xsl:attribute-set name="section.title.properties">
+ <xsl:attribute name="font-family">
+ <xsl:value-of select="$title.font.family"/>
+ </xsl:attribute>
+ <xsl:attribute name="font-weight">bold</xsl:attribute>
+ <!-- font size is calculated dynamically by section.heading template -->
+ <xsl:attribute name="keep-with-next.within-column">always</xsl:attribute>
+ <xsl:attribute name="space-before.minimum">0.8em</xsl:attribute>
+ <xsl:attribute name="space-before.optimum">1.0em</xsl:attribute>
+ <xsl:attribute name="space-before.maximum">1.2em</xsl:attribute>
+ <xsl:attribute name="text-align">start</xsl:attribute>
+ <xsl:attribute name="start-indent"><xsl:value-of select="$title.margin.left"/></xsl:attribute>
+</xsl:attribute-set>
+<xsl:attribute-set name="section.level1.properties" use-attribute-sets="section.properties">
+</xsl:attribute-set>
+<xsl:attribute-set name="section.level2.properties" use-attribute-sets="section.properties">
+</xsl:attribute-set>
+<xsl:attribute-set name="section.level3.properties" use-attribute-sets="section.properties">
+</xsl:attribute-set>
+<xsl:attribute-set name="section.level4.properties" use-attribute-sets="section.properties">
+</xsl:attribute-set>
+<xsl:attribute-set name="section.level5.properties" use-attribute-sets="section.properties">
+</xsl:attribute-set>
+<xsl:attribute-set name="section.level6.properties" use-attribute-sets="section.properties">
+</xsl:attribute-set>
+<xsl:attribute-set name="section.properties">
+</xsl:attribute-set>
+<xsl:param name="segmentedlist.as.table" select="0"/>
+<xsl:param name="shade.verbatim" select="0"/>
+
+<xsl:attribute-set name="shade.verbatim.style">
+ <xsl:attribute name="background-color">#E0E0E0</xsl:attribute>
+</xsl:attribute-set>
+<xsl:param name="show.comments" select="1"/>
+<xsl:attribute-set name="sidebar.properties" use-attribute-sets="formal.object.properties">
+ <xsl:attribute name="border-style">solid</xsl:attribute>
+ <xsl:attribute name="border-width">1pt</xsl:attribute>
+ <xsl:attribute name="border-color">black</xsl:attribute>
+ <xsl:attribute name="background-color">#DDDDDD</xsl:attribute>
+ <xsl:attribute name="padding-start">12pt</xsl:attribute>
+ <xsl:attribute name="padding-end">12pt</xsl:attribute>
+ <xsl:attribute name="padding-top">6pt</xsl:attribute>
+ <xsl:attribute name="padding-bottom">6pt</xsl:attribute>
+ <xsl:attribute name="margin-{$direction.align.start}">0pt</xsl:attribute>
+ <xsl:attribute name="margin-{$direction.align.end}">0pt</xsl:attribute>
+<!--
+ <xsl:attribute name="margin-top">6pt</xsl:attribute>
+ <xsl:attribute name="margin-bottom">6pt</xsl:attribute>
+-->
+</xsl:attribute-set>
+<xsl:attribute-set name="sidebar.title.properties">
+ <xsl:attribute name="font-weight">bold</xsl:attribute>
+ <xsl:attribute name="hyphenate">false</xsl:attribute>
+ <xsl:attribute name="text-align">start</xsl:attribute>
+ <xsl:attribute name="keep-with-next.within-column">always</xsl:attribute>
+</xsl:attribute-set>
+<xsl:param name="sidebar.float.type">none</xsl:param>
+<xsl:param name="sidebar.float.width">1in</xsl:param>
+<xsl:param name="simplesect.in.toc" select="0"/>
+<xsl:attribute-set name="subscript.properties">
+ <xsl:attribute name="font-size">75%</xsl:attribute>
+</xsl:attribute-set>
+<xsl:attribute-set name="superscript.properties">
+ <xsl:attribute name="font-size">75%</xsl:attribute>
+</xsl:attribute-set>
+<xsl:param name="symbol.font.family">Symbol,ZapfDingbats</xsl:param>
+
+<xsl:param name="table.cell.border.color">black</xsl:param>
+<xsl:param name="table.cell.border.style">solid</xsl:param>
+<xsl:param name="table.cell.border.thickness">0.5pt</xsl:param>
+<xsl:attribute-set name="table.cell.padding">
+ <xsl:attribute name="padding-start">2pt</xsl:attribute>
+ <xsl:attribute name="padding-end">2pt</xsl:attribute>
+ <xsl:attribute name="padding-top">2pt</xsl:attribute>
+ <xsl:attribute name="padding-bottom">2pt</xsl:attribute>
+</xsl:attribute-set>
+<xsl:param name="table.footnote.number.format">a</xsl:param>
+<xsl:param name="table.footnote.number.symbols"/>
+<xsl:attribute-set name="table.footnote.properties">
+ <xsl:attribute name="font-family"><xsl:value-of select="$body.fontset"/></xsl:attribute>
+ <xsl:attribute name="font-size"><xsl:value-of select="$footnote.font.size"/></xsl:attribute>
+ <xsl:attribute name="font-weight">normal</xsl:attribute>
+ <xsl:attribute name="font-style">normal</xsl:attribute>
+ <xsl:attribute name="space-before">2pt</xsl:attribute>
+ <xsl:attribute name="text-align"><xsl:value-of select="$alignment"/></xsl:attribute>
+</xsl:attribute-set>
+
+<xsl:param name="table.frame.border.color">black</xsl:param>
+<xsl:param name="table.frame.border.style">solid</xsl:param>
+<xsl:param name="table.frame.border.thickness">0.5pt</xsl:param>
+<xsl:attribute-set name="table.properties" use-attribute-sets="formal.object.properties">
+ <xsl:attribute name="keep-together.within-column">auto</xsl:attribute>
+</xsl:attribute-set>
+<xsl:param name="tablecolumns.extension" select="1"/>
+<xsl:attribute-set name="table.table.properties">
+ <xsl:attribute name="border-before-width.conditionality">retain</xsl:attribute>
+ <xsl:attribute name="border-collapse">collapse</xsl:attribute>
+</xsl:attribute-set>
+ <xsl:param name="target.database.document">olinkdb.xml</xsl:param>
+<xsl:param name="targets.filename">target.db</xsl:param>
+<xsl:param name="textdata.default.encoding"/>
+<xsl:param name="tex.math.delims" select="1"/>
+<xsl:param name="tex.math.in.alt"/>
+ <xsl:param name="textinsert.extension" select="1"/>
+<xsl:param name="title.font.family">sans-serif</xsl:param>
+<xsl:param name="title.margin.left">
+ <xsl:choose>
+ <xsl:when test="$fop.extensions != 0">-4pc</xsl:when>
+ <xsl:when test="$passivetex.extensions != 0">0pt</xsl:when>
+ <xsl:otherwise>0pt</xsl:otherwise>
+ </xsl:choose>
+</xsl:param>
+<xsl:param name="toc.indent.width">24</xsl:param>
+<!-- inconsistant point specification? -->
+<xsl:attribute-set name="toc.line.properties">
+ <xsl:attribute name="text-align-last">justify</xsl:attribute>
+ <xsl:attribute name="text-align">start</xsl:attribute>
+ <xsl:attribute name="end-indent"><xsl:value-of select="concat($toc.indent.width, 'pt')"/></xsl:attribute>
+ <xsl:attribute name="last-line-end-indent"><xsl:value-of select="concat('-', $toc.indent.width, 'pt')"/></xsl:attribute>
+</xsl:attribute-set>
+<xsl:attribute-set name="toc.margin.properties">
+ <xsl:attribute name="space-before.minimum">0.5em</xsl:attribute>
+ <xsl:attribute name="space-before.optimum">1em</xsl:attribute>
+ <xsl:attribute name="space-before.maximum">2em</xsl:attribute>
+ <xsl:attribute name="space-after.minimum">0.5em</xsl:attribute>
+ <xsl:attribute name="space-after.optimum">1em</xsl:attribute>
+ <xsl:attribute name="space-after.maximum">2em</xsl:attribute>
+</xsl:attribute-set>
+<xsl:param name="toc.max.depth">8</xsl:param>
+<xsl:param name="toc.section.depth">2</xsl:param>
+<xsl:param name="ulink.footnotes" select="0"/>
+<xsl:param name="ulink.hyphenate"/>
+<xsl:param name="ulink.hyphenate.chars">/</xsl:param>
+<xsl:param name="ulink.show" select="1"/>
+<xsl:param name="use.extensions" select="0"/>
+<xsl:param name="use.local.olink.style" select="0"/>
+<xsl:param name="use.role.as.xrefstyle" select="1"/>
+<xsl:param name="use.role.for.mediaobject" select="1"/>
+<xsl:param name="use.svg" select="1"/>
+<xsl:param name="variablelist.as.blocks" select="0"/>
+<xsl:param name="variablelist.max.termlength">24</xsl:param>
+<xsl:param name="variablelist.term.separator">, </xsl:param>
+<xsl:attribute-set name="variablelist.term.properties">
+</xsl:attribute-set>
+<xsl:param name="variablelist.term.break.after">0</xsl:param>
+<xsl:attribute-set name="verbatim.properties">
+ <xsl:attribute name="space-before.minimum">0.8em</xsl:attribute>
+ <xsl:attribute name="space-before.optimum">1em</xsl:attribute>
+ <xsl:attribute name="space-before.maximum">1.2em</xsl:attribute>
+ <xsl:attribute name="space-after.minimum">0.8em</xsl:attribute>
+ <xsl:attribute name="space-after.optimum">1em</xsl:attribute>
+ <xsl:attribute name="space-after.maximum">1.2em</xsl:attribute>
+ <xsl:attribute name="hyphenate">false</xsl:attribute>
+ <xsl:attribute name="wrap-option">no-wrap</xsl:attribute>
+ <xsl:attribute name="white-space-collapse">false</xsl:attribute>
+ <xsl:attribute name="white-space-treatment">preserve</xsl:attribute>
+ <xsl:attribute name="linefeed-treatment">preserve</xsl:attribute>
+ <xsl:attribute name="text-align">start</xsl:attribute>
+</xsl:attribute-set>
+<xsl:param name="writing.mode">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key">writing-mode</xsl:with-param>
+ <xsl:with-param name="lang">
+ <xsl:call-template name="l10n.language">
+ <xsl:with-param name="target" select="/*[1]"/>
+ </xsl:call-template>
+ </xsl:with-param>
+ </xsl:call-template>
+</xsl:param>
+<xsl:param name="xep.extensions" select="0"/>
+<xsl:attribute-set name="xep.index.item.properties" use-attribute-sets="index.page.number.properties">
+ <xsl:attribute name="merge-subsequent-page-numbers">true</xsl:attribute>
+ <xsl:attribute name="link-back">true</xsl:attribute>
+</xsl:attribute-set>
+<xsl:param name="xref.label-page.separator"><xsl:text> </xsl:text></xsl:param>
+<xsl:param name="xref.label-title.separator">: </xsl:param>
+<xsl:attribute-set name="xref.properties">
+</xsl:attribute-set>
+<xsl:param name="xref.title-page.separator"><xsl:text> </xsl:text></xsl:param>
+<xsl:param name="xref.with.number.and.title" select="1"/>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/passivetex.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/passivetex.xsl
new file mode 100644
index 0000000..9fa28ec
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/passivetex.xsl
@@ -0,0 +1,36 @@
+<?xml version='1.0' encoding="utf-8"?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:fo="http://www.w3.org/1999/XSL/Format"
+ version='1.0'>
+
+<!-- ********************************************************************
+ $Id: passivetex.xsl 5315 2005-10-20 10:08:42Z kosek $
+ ********************************************************************
+ This extension stops PassiveTeX from merging subsequent '-' to
+ dashes. You must set passivetex.extensions to '1' if you want get
+ this functionality.
+ ******************************************************************** -->
+
+<xsl:template name="passivetex.dash.subst">
+ <xsl:param name="string"/>
+
+ <xsl:choose>
+ <xsl:when test="contains($string, '--')">
+ <xsl:variable name="rest">
+ <xsl:call-template name="passivetex.dash.subst">
+ <xsl:with-param name="string"
+ select="concat('-', substring-after($string, '--'))"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:value-of select="concat(substring-before($string, '--'),
+ '-&#x200b;',
+ $rest)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$string"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+</xsl:stylesheet>
+
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/pdf2index b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/pdf2index
new file mode 100644
index 0000000..c14d8ec
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/pdf2index
@@ -0,0 +1,140 @@
+#!/usr/bin/perl -- # -*- Perl -*-
+
+# this needs some cleanup...
+
+my $PSTOTEXT = "pstotext";
+
+my $pdf = shift @ARGV;
+
+my $index = "";
+my $inindex = 0;
+open (F, "$PSTOTEXT $pdf |");
+while (<F>) {
+ if (/^<\/index/) {
+ $index .= $_;
+ $inindex = 0;
+ }
+ $inindex = 1 if /^<index/;
+
+ if ($inindex) {
+ $index .= $_ if /^\s*</;
+ }
+}
+
+my $cindex = "";
+while ($index =~ /^(.*?)((<phrase role=\"pageno\">.*?<\/phrase>\s*)+)/s) {
+ $cindex .= $1;
+ $_ = $2;
+ $index = $'; # '
+
+ my @pages = m/<phrase role=\"pageno\">.*?<\/phrase>\s*/sg;
+
+ # Expand ranges
+ if ($#pages >= 0) {
+ my @mpages = ();
+ foreach my $page (@pages) {
+ my $pageno = &pageno($page);
+ if ($pageno =~ /^([0-9]+)[^0-9]([0-9]+)$/) { # funky -
+ for (my $count = $1; $count <= $2; $count++) {
+ push (@mpages, "<phrase role=\"$pageno\">$count</phrase>");
+ }
+ } else {
+ push (@mpages, $page);
+ }
+ }
+ @pages = sort rangesort @mpages;
+ }
+
+ # Remove duplicates...
+ if ($#pages > 0) {
+ my @mpages = ();
+ my $current = "";
+ foreach my $page (@pages) {
+ my $pageno = &pageno($page);
+ if ($pageno ne $current) {
+ push (@mpages, $page);
+ $current = $pageno;
+ }
+ }
+ @pages = @mpages;
+ }
+
+ # Collapse ranges...
+ if ($#pages > 1) {
+ my @cpages = ();
+ while (@pages) {
+ my $count = 0;
+ my $len = &rangelen($count, @pages);
+ if ($len <= 2) {
+ my $page = shift @pages;
+ push (@cpages, $page);
+ } else {
+ my $fpage = shift @pages;
+ my $lpage = "";
+ while ($len > 1) {
+ $lpage = shift @pages;
+ $len--;
+ }
+ my $fpno = &pageno($fpage);
+ my $lpno = &pageno($lpage);
+ $fpage =~ s/>$fpno</>${fpno}-$lpno</s;
+ push (@cpages, $fpage);
+ }
+ }
+ @pages = @cpages;
+ }
+
+ my $page = shift @pages;
+ $page =~ s/\s*$//s;
+ $cindex .= $page;
+ while (@pages) {
+ $page = shift @pages;
+ $page =~ s/\s*$//s;
+ $cindex .= ", $page";
+ }
+}
+$cindex .= $index;
+
+print "$cindex\n";
+
+sub pageno {
+ my $page = shift;
+
+ $page =~ s/^<phrase.*?>//;
+ $page =~ s/^<link.*?>//;
+
+ return $1 if $page =~ /^([^<>]+)/;
+ return "?";
+}
+
+sub rangesort {
+ my $apno = &pageno($a);
+ my $bpno = &pageno($b);
+
+ # Make sure roman pages come before arabic ones, otherwise sort them in order
+ return -1 if ($apno !~ /^\d+/ && $bpno =~ /^\d+/);
+ return 1 if ($apno =~ /^\d+/ && $bpno !~ /^\d+/);
+ return $apno <=> $bpno;
+}
+
+sub rangelen {
+ my $count = shift;
+ my @pages = @_;
+ my $len = 1;
+ my $inrange = 1;
+
+ my $current = &pageno($pages[$count]);
+ while ($count < $#pages && $inrange) {
+ $count++;
+ my $next = &pageno($pages[$count]);
+ if ($current + 1 eq $next) {
+ $current = $next;
+ $inrange = 1;
+ $len++;
+ } else {
+ $inrange = 0;
+ }
+ }
+
+ return $len;
+}
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/pi.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/pi.xml
new file mode 100644
index 0000000..701d414
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/pi.xml
@@ -0,0 +1,1002 @@
+<?xml version="1.0"?>
+
+<reference><info><title>FO Processing Instruction Reference</title>
+ <releaseinfo role="meta">
+ $Id: pi.xsl 8487 2009-07-14 21:43:36Z bobstayton $
+ </releaseinfo>
+ </info>
+
+ <partintro xml:id="partintro">
+ <title>Introduction</title>
+
+
+<para>This is generated reference documentation for all
+ user-specifiable processing instructions (PIs) in the DocBook
+ XSL stylesheets for FO output.
+ <note>
+
+<para>You add these PIs at particular points in a document to
+ cause specific “exceptions†to formatting/output behavior. To
+ make global changes in formatting/output behavior across an
+ entire document, it’s better to do it by setting an
+ appropriate stylesheet parameter (if there is one).</para>
+
+ </note>
+ </para>
+
+ </partintro>
+
+<refentry xmlns:xlink="http://www.w3.org/1999/xlink" xml:id="dbfo_background-color">
+<refnamediv>
+<refname>dbfo_background-color</refname>
+<refpurpose>Sets background color for an image</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+
+ <synopsis><tag class="xmlpi">dbfo background-color="<replaceable>color</replaceable>"</tag></synopsis>
+
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>Use the <tag class="xmlpi">dbfo background-color</tag> PI before or
+ after an image (<tag>graphic</tag>, <tag>inlinegraphic</tag>,
+ <tag>imagedata</tag>, or <tag>videodata</tag> element) as a
+ sibling to the element, to set a background color for the
+ image.</para>
+
+ </refsect1><refsect1><title>Parameters</title>
+
+<variablelist>
+ <varlistentry><term>background-color="<replaceable>color</replaceable>"</term>
+ <listitem>
+
+<para>An HTML color value</para>
+
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ </refsect1><refsect1 role="tcg"><title>Related Information in <link xlink:href="http://www.sagehill.net/docbookxsl/">DocBook XSL: The Complete Guide</link></title>
+
+<para><link role="tcg" xlink:href="BGcolor.html">Background color</link></para>
+
+ </refsect1></refentry>
+
+<refentry xmlns:xlink="http://www.w3.org/1999/xlink" xml:id="dbfo_bgcolor">
+<refnamediv>
+<refname>dbfo_bgcolor</refname>
+<refpurpose>Sets background color on a table row or table cell</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+
+ <synopsis><tag class="xmlpi">dbfo bgcolor="<replaceable>color</replaceable>"</tag></synopsis>
+
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>Use the <tag class="xmlpi">dbfo bgcolor</tag> PI as child of a table row
+ or cell to set a background color for that table row or cell.</para>
+
+
+<para>This PI works for both CALS and HTML tables.</para>
+
+ </refsect1><refsect1><title>Parameters</title>
+
+<variablelist>
+ <varlistentry><term>bgcolor="<replaceable>color</replaceable>"</term>
+ <listitem>
+
+<para>An HTML color value</para>
+
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ </refsect1><refsect1 role="tcg"><title>Related Information in <link xlink:href="http://www.sagehill.net/docbookxsl/">DocBook XSL: The Complete Guide</link></title>
+
+<para><link role="tcg" xlink:href="BGtableColor.html#CellBGColor">Cell background color</link></para>
+
+ </refsect1></refentry>
+
+<refentry xmlns:xlink="http://www.w3.org/1999/xlink" xml:id="dbfo_float-type">
+<refnamediv>
+<refname>dbfo_float-type</refname>
+<refpurpose>Specifies float behavior for a sidebar</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+
+ <synopsis><tag class="xmlpi">dbfo float-type="margin.note"</tag></synopsis>
+
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>Use the <tag class="xmlpi">dbfo float-type</tag> PI to specify the float
+ behavior for a <tag>sidebar</tag> (to cause the sidebar to be
+ displayed as a marginal note).</para>
+
+ </refsect1><refsect1><title>Parameters</title>
+
+<variablelist>
+ <varlistentry><term>float-type="margin.note"</term>
+ <listitem>
+
+<para>Specifies that the <tag>sidebar</tag> should be
+ displayed as a marginal note.</para>
+
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ </refsect1><refsect1 role="params"><title>Related Global Parameters</title>
+
+<para><parameter>sidebar.float.type</parameter> (parameter),
+ <parameter>sidebar.float.width</parameter> (parameter),
+ <parameter>sidebar.properties</parameter> (attribute-set),
+ <parameter>sidebar.title.properties</parameter> (attribute-set)
+ </para>
+
+ </refsect1><refsect1 role="tcg"><title>Related Information in <link xlink:href="http://www.sagehill.net/docbookxsl/">DocBook XSL: The Complete Guide</link></title>
+
+<para><link role="tcg" xlink:href="SideFloats.html#SidebarFloats">A sidebar as
+ side float</link></para>
+
+ </refsect1></refentry>
+
+<refentry xmlns:xlink="http://www.w3.org/1999/xlink" xml:id="dbfo_funcsynopsis-style">
+<refnamediv>
+<refname>dbfo_funcsynopsis-style</refname>
+<refpurpose>Specifies presentation style for a funcsynopsis</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+
+ <synopsis><tag class="xmlpi">dbfo funcsynopsis-style="kr"|"ansi"</tag></synopsis>
+
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>Use the <tag class="xmlpi">dbfo funcsynopsis-style</tag> PI as a child of
+ a <tag>funcsynopsis</tag> or anywhere within a funcsynopsis
+ to control the presentation style for output of all
+ <tag>funcprototype</tag> instances within that funcsynopsis.</para>
+
+ </refsect1><refsect1><title>Parameters</title>
+
+<variablelist>
+ <varlistentry><term>funcsynopsis-style="kr"</term>
+ <listitem>
+
+<para>Displays <tag>funcprototype</tag> output in K&amp;R style</para>
+
+ </listitem>
+ </varlistentry>
+ <varlistentry><term>funcsynopsis-style="ansi"</term>
+ <listitem>
+
+<para>Displays <tag>funcprototype</tag> output in ANSI style</para>
+
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ </refsect1><refsect1 role="params"><title>Related Global Parameters</title>
+
+<para><parameter>funcsynopsis.style</parameter></para>
+
+ </refsect1></refentry>
+
+<refentry xmlns:xlink="http://www.w3.org/1999/xlink" xml:id="dbfo_glossary-presentation">
+<refnamediv>
+<refname>dbfo_glossary-presentation</refname>
+<refpurpose>Specifies presentation style for a glossary</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+
+ <synopsis><tag class="xmlpi">dbfo glossary-presentation="list"|"blocks"</tag></synopsis>
+
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>Use the <tag class="xmlpi">dbfo glossary-presentation</tag> PI as a child of
+ a <tag>glossary</tag> to control its presentation style.</para>
+
+ </refsect1><refsect1><title>Parameters</title>
+
+<variablelist>
+ <varlistentry><term>glossary-presentation="list"</term>
+ <listitem>
+
+<para>Displays the glossary as a list</para>
+
+ </listitem>
+ </varlistentry>
+ <varlistentry><term>glossary-presentation="blocks"</term>
+ <listitem>
+
+<para>Displays the glossary as blocks</para>
+
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ </refsect1><refsect1 role="params"><title>Related Global Parameters</title>
+
+<para><parameter>glossary.as.blocks</parameter></para>
+
+ </refsect1><refsect1 role="tcg"><title>Related Information in <link xlink:href="http://www.sagehill.net/docbookxsl/">DocBook XSL: The Complete Guide</link></title>
+
+<para><link role="tcg" xlink:href="Glossaries.html#GlossaryFormatPrint">Glossary
+ formatting in print</link></para>
+
+ </refsect1></refentry>
+
+<refentry xmlns:xlink="http://www.w3.org/1999/xlink" xml:id="dbfo_glosslist-presentation">
+<refnamediv>
+<refname>dbfo_glosslist-presentation</refname>
+<refpurpose>Specifies presentation style for a glosslist</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+
+ <synopsis><tag class="xmlpi">dbfo glosslist-presentation="list"|"blocks"</tag></synopsis>
+
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>Use the <tag class="xmlpi">dbfo glosslist-presentation</tag> PI as a child of
+ a <tag>glosslist</tag> to control its presentation style.</para>
+
+ </refsect1><refsect1><title>Parameters</title>
+
+<variablelist>
+ <varlistentry><term>glosslist-presentation="list"</term>
+ <listitem>
+
+<para>Displays the glosslist as a list</para>
+
+ </listitem>
+ </varlistentry>
+ <varlistentry><term>glosslist-presentation="blocks"</term>
+ <listitem>
+
+<para>Displays the glosslist as blocks</para>
+
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ </refsect1><refsect1 role="params"><title>Related Global Parameters</title>
+
+<para><parameter>glosslist.as.blocks</parameter> </para>
+
+ </refsect1><refsect1 role="tcg"><title>Related Information in <link xlink:href="http://www.sagehill.net/docbookxsl/">DocBook XSL: The Complete Guide</link></title>
+
+<para><link role="tcg" xlink:href="Glossaries.html#GlossaryFormatPrint">Glossary
+ formatting in print</link></para>
+
+ </refsect1></refentry>
+
+<refentry xmlns:xlink="http://www.w3.org/1999/xlink" xml:id="dbfo_glossterm-width">
+<refnamediv>
+<refname>dbfo_glossterm-width</refname>
+<refpurpose>Specifies the glossterm width for a glossary or
+ glosslist</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+
+ <synopsis><tag class="xmlpi">dbfo glossterm-width="<replaceable>width</replaceable>"</tag></synopsis>
+
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>Use the <tag class="xmlpi">dbfo glossterm-width</tag> PI as a child of a
+ <tag>glossary</tag> or <tag>glosslist</tag> to specify the
+ width for output of <tag>glossterm</tag> instances in the
+ output.</para>
+
+ </refsect1><refsect1><title>Parameters</title>
+
+<variablelist>
+ <varlistentry><term>glossterm-width="<replaceable>width</replaceable>"</term>
+ <listitem>
+
+<para>Specifies the glossterm width (including units)</para>
+
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ </refsect1><refsect1 role="params"><title>Related Global Parameters</title>
+
+<para><parameter>glossterm.width</parameter>,
+ <parameter>glossterm.separation</parameter>
+ </para>
+
+ </refsect1><refsect1 role="tcg"><title>Related Information in <link xlink:href="http://www.sagehill.net/docbookxsl/">DocBook XSL: The Complete Guide</link></title>
+
+<para><link role="tcg" xlink:href="Glossaries.html#GlossaryFormatPrint">Glossary
+ formatting in print</link></para>
+
+ </refsect1></refentry>
+
+<refentry xmlns:xlink="http://www.w3.org/1999/xlink" xml:id="dbfo_keep-together">
+<refnamediv>
+<refname>dbfo_keep-together</refname>
+<refpurpose>Specifies “keep†behavior for a table, example,
+ figure, equation, procedure, or task</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+
+ <synopsis><tag class="xmlpi">dbfo keep-together="auto"|"always"</tag></synopsis>
+
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>Use the <tag class="xmlpi">dbfo keep-together</tag> PI as a child of a
+ formal object (<tag>table</tag>, <tag>example</tag>,
+ <tag>figure</tag>, <tag>equation</tag>, <tag>procedure</tag>, or
+ <tag>task</tag>) to specify “keep†behavior (to allow the object to
+ “break†across a page).</para>
+
+
+<para>The PI also works with <tag>informaltable</tag>, <tag>informalexample</tag>,
+ <tag>informalfigure</tag> and <tag>informalequation</tag>.
+ </para>
+
+
+ </refsect1><refsect1><title>Parameters</title>
+
+<variablelist>
+ <varlistentry><term>keep-together="auto"</term>
+ <listitem>
+
+<para>Enables the object to break across a page</para>
+
+ </listitem>
+ </varlistentry>
+ <varlistentry><term>keep-together="always"</term>
+ <listitem>
+
+<para>Prevents the object from breaking across a page (the
+ default stylesheet behavior)</para>
+
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ </refsect1><refsect1 role="params"><title>Related Global Parameters</title>
+
+<para>formal.object.properties</para>
+
+ </refsect1><refsect1 role="tcg"><title>Related Information in <link xlink:href="http://www.sagehill.net/docbookxsl/">DocBook XSL: The Complete Guide</link></title>
+
+<para><link role="tcg" xlink:href="PageBreaking.html#KeepTogetherPI">Keep-together processing instruction</link></para>
+
+ </refsect1></refentry>
+
+<refentry xmlns:xlink="http://www.w3.org/1999/xlink" xml:id="dbfo_label-width">
+<refnamediv>
+<refname>dbfo_label-width</refname>
+<refpurpose>Specifies the label width for a qandaset, itemizedlist, orderedlist
+ or calloutlist</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+
+ <synopsis><tag class="xmlpi">dbfo label-width="<replaceable>width</replaceable>"</tag></synopsis>
+
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>Use the <tag class="xmlpi">dbfo label-width</tag> PI as a child of a
+ <tag>qandaset</tag>, <tag>itemizedlist</tag>, <tag>orderedlist</tag>,
+ or <tag>calloutlist</tag> to specify the width of labels.</para>
+
+ </refsect1><refsect1><title>Parameters</title>
+
+<variablelist>
+ <varlistentry><term>label-width="<replaceable>width</replaceable>"</term>
+ <listitem>
+
+<para>Specifies the label width (including units)</para>
+
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ </refsect1><refsect1 role="tcg"><title>Related Information in <link xlink:href="http://www.sagehill.net/docbookxsl/">DocBook XSL: The Complete Guide</link></title>
+
+<para><link role="tcg" xlink:href="QandAformat.html">Q and A formatting</link></para>
+
+ </refsect1></refentry>
+
+<refentry xmlns:xlink="http://www.w3.org/1999/xlink" xml:id="dbfo_linenumbering.everyNth">
+<refnamediv>
+<refname>dbfo_linenumbering.everyNth</refname>
+<refpurpose>Specifies interval for line numbers in verbatims</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+
+ <synopsis><tag class="xmlpi">dbfo linenumbering.everyNth="<replaceable>N</replaceable>"</tag></synopsis>
+
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>Use the <tag class="xmlpi">dbfo linenumbering.everyNth</tag> PI as a child
+ of a “verbatim†element – <tag>programlisting</tag>,
+ <tag>screen</tag>, <tag>synopsis</tag> — to specify
+ the interval at which lines are numbered.</para>
+
+ </refsect1><refsect1><title>Parameters</title>
+
+<variablelist>
+ <varlistentry><term>linenumbering.everyNth="<replaceable>N</replaceable>"</term>
+ <listitem>
+
+<para>Specifies numbering interval; a number is output
+ before every <replaceable>N</replaceable>th line</para>
+
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ </refsect1><refsect1 role="params"><title>Related Global Parameters</title>
+
+<para><parameter>linenumbering.everyNth</parameter></para>
+
+ </refsect1><refsect1 role="tcg"><title>Related Information in <link xlink:href="http://www.sagehill.net/docbookxsl/">DocBook XSL: The Complete Guide</link></title>
+
+<para><link role="tcg" xlink:href="AnnotateListing.html#LineNumbering">Line numbering</link></para>
+
+ </refsect1></refentry>
+
+<refentry xmlns:xlink="http://www.w3.org/1999/xlink" xml:id="dbfo_linenumbering.separator">
+<refnamediv>
+<refname>dbfo_linenumbering.separator</refname>
+<refpurpose>Specifies separator text for line numbers in verbatims</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+
+ <synopsis><tag class="xmlpi">dbfo linenumbering.separator="<replaceable>text</replaceable>"</tag></synopsis>
+
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>Use the <tag class="xmlpi">dbfo linenumbering.separator</tag> PI as a child
+ of a “verbatim†element – <tag>programlisting</tag>,
+ <tag>screen</tag>, <tag>synopsis</tag> — to specify
+ the separator text output between the line numbers and content.</para>
+
+ </refsect1><refsect1><title>Parameters</title>
+
+<variablelist>
+ <varlistentry><term>linenumbering.separator="<replaceable>text</replaceable>"</term>
+ <listitem>
+
+<para>Specifies the text (zero or more characters)</para>
+
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ </refsect1><refsect1 role="params"><title>Related Global Parameters</title>
+
+<para><parameter>linenumbering.separator</parameter></para>
+
+ </refsect1><refsect1 role="tcg"><title>Related Information in <link xlink:href="http://www.sagehill.net/docbookxsl/">DocBook XSL: The Complete Guide</link></title>
+
+<para><link role="tcg" xlink:href="AnnotateListing.html#LineNumbering">Line numbering</link></para>
+
+ </refsect1></refentry>
+
+<refentry xmlns:xlink="http://www.w3.org/1999/xlink" xml:id="dbfo_linenumbering.width">
+<refnamediv>
+<refname>dbfo_linenumbering.width</refname>
+<refpurpose>Specifies width for line numbers in verbatims</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+
+ <synopsis><tag class="xmlpi">dbfo linenumbering.width="<replaceable>width</replaceable>"</tag></synopsis>
+
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>Use the <tag class="xmlpi">dbfo linenumbering.width</tag> PI as a child
+ of a “verbatim†element – <tag>programlisting</tag>,
+ <tag>screen</tag>, <tag>synopsis</tag> — to specify
+ the width set aside for line numbers.</para>
+
+ </refsect1><refsect1><title>Parameters</title>
+
+<variablelist>
+ <varlistentry><term>linenumbering.width="<replaceable>width</replaceable>"</term>
+ <listitem>
+
+<para>Specifies the width (inluding units)</para>
+
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ </refsect1><refsect1 role="params"><title>Related Global Parameters</title>
+
+<para><parameter>linenumbering.width</parameter></para>
+
+ </refsect1><refsect1 role="tcg"><title>Related Information in <link xlink:href="http://www.sagehill.net/docbookxsl/">DocBook XSL: The Complete Guide</link></title>
+
+<para><link role="tcg" xlink:href="AnnotateListing.html#LineNumbering">Line numbering</link></para>
+
+ </refsect1></refentry>
+
+<refentry xmlns:xlink="http://www.w3.org/1999/xlink" xml:id="dbfo_list-presentation">
+<refnamediv>
+<refname>dbfo_list-presentation</refname>
+<refpurpose>Specifies presentation style for a variablelist or
+ segmentedlist</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+
+ <synopsis><tag class="xmlpi">dbfo list-presentation="list"|"blocks"|"table"</tag></synopsis>
+
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>Use the <tag class="xmlpi">dbfo list-presentation</tag> PI as a child of
+ a <tag>variablelist</tag> or <tag>segmentedlist</tag> to
+ control the presentation style for the list (to cause it, for
+ example, to be displayed as a table).</para>
+
+ </refsect1><refsect1><title>Parameters</title>
+
+<variablelist>
+ <varlistentry><term>list-presentation="list"</term>
+ <listitem>
+
+<para>Displays the list as a list</para>
+
+ </listitem>
+ </varlistentry>
+ <varlistentry><term>list-presentation="blocks"</term>
+ <listitem>
+
+<para>(<tag>variablelist</tag> only) Displays the list as blocks</para>
+
+ </listitem>
+ </varlistentry>
+ <varlistentry><term>list-presentation="table"</term>
+ <listitem>
+
+<para>(<tag>segmentedlist</tag> only) Displays the list as a table</para>
+
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ </refsect1><refsect1 role="params"><title>Related Global Parameters</title>
+
+<itemizedlist>
+ <listitem>
+
+<para><parameter>variablelist.as.blocks</parameter></para>
+
+ </listitem>
+ <listitem>
+
+<para><parameter>variablelist.as.table</parameter></para>
+
+ </listitem>
+ </itemizedlist>
+
+ </refsect1><refsect1 role="tcg"><title>Related Information in <link xlink:href="http://www.sagehill.net/docbookxsl/">DocBook XSL: The Complete Guide</link></title>
+
+<para><link role="tcg" xlink:href="Variablelists.html#ListIndents">Variable list formatting in print</link></para>
+
+ </refsect1></refentry>
+
+<refentry xmlns:xlink="http://www.w3.org/1999/xlink" xml:id="dbfo_list-width">
+<refnamediv>
+<refname>dbfo_list-width</refname>
+<refpurpose>Specifies the width of a horizontal simplelist</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+
+ <synopsis><tag class="xmlpi">dbfo list-width="<replaceable>width</replaceable>"</tag></synopsis>
+
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>Use the <tag class="xmlpi">dbfo list-width</tag> PI as a child of a
+ <tag>simplelist</tag> whose <tag class="attribute">class</tag>
+ value is <literal>horizontal</literal>, to specify the width
+ of the <tag>simplelist</tag>.</para>
+
+ </refsect1><refsect1><title>Parameters</title>
+
+<variablelist>
+ <varlistentry><term>list-width="<replaceable>width</replaceable>"</term>
+ <listitem>
+
+<para>Specifies the <tag>simplelist</tag> width (including units)</para>
+
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ </refsect1></refentry>
+
+<refentry xmlns:xlink="http://www.w3.org/1999/xlink" xml:id="dbfo_orientation">
+<refnamediv>
+<refname>dbfo_orientation</refname>
+<refpurpose>Specifies the orientation for a CALS table row or cell</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+
+ <synopsis><tag class="xmlpi">dbfo orientation="0"|"90"|"180"|"270"|"-90"|"-180"|"-270"</tag></synopsis>
+
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>Use the <tag class="xmlpi">dbfo orientation</tag> PI as a child of a CALS
+ <tag>table</tag> row or cell to specify the orientation
+ (rotation) for the row or cell.</para>
+
+ </refsect1><refsect1><title>Parameters</title>
+
+<variablelist>
+ <varlistentry><term>orientation="0"|"90"|"180"|"270"|"-90"|"-180"|"-270"</term>
+ <listitem>
+
+<para>Specifies the number of degrees by which the cell or
+ row is rotated</para>
+
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ </refsect1></refentry>
+
+<refentry xmlns:xlink="http://www.w3.org/1999/xlink" xml:id="dbfo_pgwide">
+<refnamediv>
+<refname>dbfo_pgwide</refname>
+<refpurpose>Specifies if an <tag>equation</tag> or <tag>example</tag> goes across full page width</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+
+ <synopsis><tag class="xmlpi">dbfo pgwide="0"|"1"</tag></synopsis>
+
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>Use the <tag class="xmlpi">dbfo pgwide</tag> PI as a child of an
+ <tag>equation</tag> or <tag>example</tag> to specify that the
+ content should rendered across the full width of the page.</para>
+
+ </refsect1><refsect1><title>Parameters</title>
+
+<variablelist>
+ <varlistentry><term>pgwide="0"</term>
+ <listitem>
+
+<para>If zero, the content is rendered across the current
+ text flow</para>
+
+ </listitem>
+ </varlistentry>
+ <varlistentry><term>pgwide="1"</term>
+ <listitem>
+
+<para>If <code>1</code> (or any non-zero value), the
+ content is rendered across the full width of the page</para>
+
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ </refsect1><refsect1 role="params"><title>Related Global Parameters</title>
+
+<para><parameter>pgwide.properties</parameter></para>
+
+ </refsect1></refentry>
+
+<refentry xmlns:xlink="http://www.w3.org/1999/xlink" xml:id="dbfo_rotated-width">
+<refnamediv>
+<refname>dbfo_rotated-width</refname>
+<refpurpose>Specifies the width for a CALS table <tag>entry</tag> or
+ <tag>row</tag></refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+
+ <synopsis><tag class="xmlpi">dbfo rotated-width="<replaceable>width</replaceable>"</tag></synopsis>
+
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>Use the <tag class="xmlpi">dbfo rotated-width</tag> PI as a child of
+ <tag>entry</tag> or <tag>row</tag> instance in a CALS table to specify the
+ width of that the <tag>entry</tag> or <tag>row</tag>; or
+ use it higher up in table to cause the width to be inherited
+ recursively down.</para>
+
+ </refsect1><refsect1><title>Parameters</title>
+
+<variablelist>
+ <varlistentry><term>rotated-width="<replaceable>width</replaceable>"</term>
+ <listitem>
+
+<para>Specifies the width of a row or cell (including units)</para>
+
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ </refsect1></refentry>
+
+<refentry xmlns:xlink="http://www.w3.org/1999/xlink" xml:id="dbfo_sidebar-width">
+<refnamediv>
+<refname>dbfo_sidebar-width</refname>
+<refpurpose>Specifies the width of a sidebar</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+
+ <synopsis><tag class="xmlpi">dbfo sidebar-width="<replaceable>width</replaceable>"</tag></synopsis>
+
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>Use the <tag class="xmlpi">dbfo sidebar-width</tag> PI as a child of a
+ <tag>sidebar</tag> to specify the width of the sidebar.</para>
+
+ </refsect1><refsect1><title>Parameters</title>
+
+<variablelist>
+ <varlistentry><term>sidebar-width="<replaceable>width</replaceable>"</term>
+ <listitem>
+
+<para>Specifies the <tag>sidebar</tag> width (including units)</para>
+
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ </refsect1><refsect1 role="params"><title>Related Global Parameters</title>
+
+<para><parameter>sidebar.float.type parameter</parameter>,
+ <parameter>sidebar.float.width parameter</parameter>,
+ <parameter>sidebar.properties attribute-set</parameter>,
+ <parameter>sidebar.title.properties</parameter>
+ </para>
+
+ </refsect1><refsect1 role="tcg"><title>Related Information in <link xlink:href="http://www.sagehill.net/docbookxsl/">DocBook XSL: The Complete Guide</link></title>
+
+<para><link role="tcg" xlink:href="SideFloats.html#SidebarFloats">A sidebar as
+ side float</link></para>
+
+ </refsect1></refentry>
+
+<refentry xmlns:xlink="http://www.w3.org/1999/xlink" xml:id="dbfo_start">
+<refnamediv>
+<refname>dbfo_start</refname>
+<refpurpose>(obsolete) Sets the starting number on an ordered list</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+
+ <synopsis><tag class="xmlpi">dbfo start="<replaceable>character</replaceable>"</tag></synopsis>
+
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para><emphasis>This PI is obsolete</emphasis>. The intent of
+ it was to provide a means for setting a specific starting
+ number for an ordered list. Instead of this PI, set a value
+ for the <literal>override</literal> attribute on the first
+ <tag>listitem</tag> in the list; that will have the same
+ effect as what this PI was intended for.</para>
+
+ </refsect1><refsect1><title>Parameters</title>
+
+<variablelist>
+ <varlistentry><term>start="<replaceable>character</replaceable>"</term>
+ <listitem>
+
+<para>Specifies the character to use as the starting
+ number; use 0-9, a-z, A-Z, or lowercase or uppercase
+ Roman numerals</para>
+
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ </refsect1><refsect1 role="tcg"><title>Related Information in <link xlink:href="http://www.sagehill.net/docbookxsl/">DocBook XSL: The Complete Guide</link></title>
+
+<para><link role="tcg" xlink:href="Orderedlists.html#ListStartNum">List starting number</link></para>
+
+ </refsect1></refentry>
+
+<refentry xmlns:xlink="http://www.w3.org/1999/xlink" xml:id="dbfo_table-width">
+<refnamediv>
+<refname>dbfo_table-width</refname>
+<refpurpose>Specifies the width for a CALS table or for revhistory
+ output</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+
+ <synopsis><tag class="xmlpi">dbfo table-width="<replaceable>width</replaceable>"</tag></synopsis>
+
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>Use the <tag class="xmlpi">dbfo table-width</tag> PI as a child or
+ sibling of a CALS <tag>table</tag>, or as a child of an
+ <tag>informaltable</tag>, <tag>entrytbl</tag>, or
+ <tag>revhistory</tag> instance (which is rendered as a table
+ in output) to specify the width of the table in output.</para>
+
+ </refsect1><refsect1><title>Parameters</title>
+
+<variablelist>
+ <varlistentry><term>table-width="<replaceable>width</replaceable>"</term>
+ <listitem>
+
+<para>Specifies the table width (including units or as a percentage)</para>
+
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ </refsect1><refsect1 role="tcg"><title>Related Information in <link xlink:href="http://www.sagehill.net/docbookxsl/">DocBook XSL: The Complete Guide</link></title>
+
+<para><link role="tcg" xlink:href="Tables.html#TableWidth">Table width</link></para>
+
+ </refsect1></refentry>
+
+<refentry xmlns:xlink="http://www.w3.org/1999/xlink" xml:id="dbfo_term-width">
+<refnamediv>
+<refname>dbfo_term-width</refname>
+<refpurpose>Specifies the term width for a variablelist</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+
+ <synopsis><tag class="xmlpi">dbfo term-width="<replaceable>width</replaceable>"</tag></synopsis>
+
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>Use the <tag class="xmlpi">dbfo term-width</tag> PI as a child of a
+ <tag>variablelist</tag> to specify the width for
+ <tag>term</tag> output.</para>
+
+ </refsect1><refsect1><title>Parameters</title>
+
+<variablelist>
+ <varlistentry><term>term-width="<replaceable>width</replaceable>"</term>
+ <listitem>
+
+<para>Specifies the term width (including units)</para>
+
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ </refsect1><refsect1 role="tcg"><title>Related Information in <link xlink:href="http://www.sagehill.net/docbookxsl/">DocBook XSL: The Complete Guide</link></title>
+
+<para><link role="tcg" xlink:href="Variablelists.html#ListIndents">Variable list formatting in print</link></para>
+
+ </refsect1></refentry>
+
+<refentry xmlns:xlink="http://www.w3.org/1999/xlink" xml:id="dbfo_toc">
+<refnamediv>
+<refname>dbfo_toc</refname>
+<refpurpose>Specifies whether a TOC should be generated for a qandaset</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+
+ <synopsis><tag class="xmlpi">dbfo toc="0"|"1"</tag></synopsis>
+
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>Use the <tag class="xmlpi">dbfo toc</tag> PI as a child of a
+ <tag>qandaset</tag> to specify whether a table of contents
+ (TOC) is generated for the <tag>qandaset</tag>.</para>
+
+ </refsect1><refsect1><title>Parameters</title>
+
+<variablelist>
+ <varlistentry><term>toc="0"</term>
+ <listitem>
+
+<para>If zero, no TOC is generated</para>
+
+ </listitem>
+ </varlistentry>
+ <varlistentry><term>toc="1"</term>
+ <listitem>
+
+<para>If <code>1</code> (or any non-zero value),
+ a TOC is generated</para>
+
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ </refsect1><refsect1 role="tcg"><title>Related Information in <link xlink:href="http://www.sagehill.net/docbookxsl/">DocBook XSL: The Complete Guide</link></title>
+
+<para><link role="tcg" xlink:href="QandAtoc.html">Q and A list of questions</link>,
+ <link role="tcg" xlink:href="QandAformat.html">Q and A formatting</link></para>
+
+ </refsect1></refentry>
+
+<refentry xmlns:xlink="http://www.w3.org/1999/xlink" xml:id="dbfo-need">
+<refnamediv>
+<refname>dbfo-need</refname>
+<refpurpose>Specify a need for space (a kind of soft page break)</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+
+ <synopsis><tag class="xmlpi">dbfo-need height="<replaceable>n</replaceable>" [space-before="<replaceable>n</replaceable>"]</tag></synopsis>
+
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>A “need†is a request for space on a page. If the
+ requested space is not available, the page breaks and the
+ content that follows the need request appears on the next
+ page. If the requested space is available, then no page break
+ is inserted.</para>
+
+ </refsect1><refsect1><title>Parameters</title>
+
+<variablelist>
+ <varlistentry><term>height="<replaceable>n</replaceable>"</term>
+ <listitem>
+
+<para>The amount of height needed (including units)</para>
+
+ </listitem>
+ </varlistentry>
+ <varlistentry><term>space-before="<replaceable>n</replaceable>"</term>
+ <listitem>
+
+<para>The amount of extra vertical space to add (including units)</para>
+
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ </refsect1><refsect1 role="tcg"><title>Related Information in <link xlink:href="http://www.sagehill.net/docbookxsl/">DocBook XSL: The Complete Guide</link></title>
+
+<para><link role="tcg" xlink:href="PageBreaking.html#SoftPageBreaks">Soft page breaks</link></para>
+
+ </refsect1></refentry>
+
+<refentry xmlns:xlink="http://www.w3.org/1999/xlink" xml:id="dbfo_row-height">
+<refnamediv>
+<refname>dbfo_row-height</refname>
+<refpurpose>Specifies the height for a CALS table row</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+
+ <synopsis><tag class="xmlpi">dbfo row-height="<replaceable>height</replaceable>"</tag></synopsis>
+
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>Use the <tag class="xmlpi">dbfo row-height</tag> PI as a child of a
+ <tag>row</tag> to specify the height of the row.</para>
+
+ </refsect1><refsect1><title>Parameters</title>
+
+<variablelist>
+ <varlistentry><term>row-height="<replaceable>height</replaceable>"</term>
+ <listitem>
+
+<para>Specifies the row height (including units)</para>
+
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ </refsect1><refsect1 role="tcg"><title>Related Information in <link xlink:href="http://www.sagehill.net/docbookxsl/">DocBook XSL: The Complete Guide</link></title>
+
+<para><link role="tcg" xlink:href="RowHeight.html">Row height</link></para>
+
+ </refsect1></refentry>
+</reference>
+
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/pi.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/pi.xsl
new file mode 100644
index 0000000..c5f258b
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/pi.xsl
@@ -0,0 +1,1092 @@
+<?xml version='1.0'?>
+<xsl:stylesheet
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:doc="http://nwalsh.com/xsl/documentation/1.0"
+ xmlns:fo="http://www.w3.org/1999/XSL/Format"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ exclude-result-prefixes="doc xlink"
+ version='1.0'>
+
+<!-- ********************************************************************
+ $Id: pi.xsl 8487 2009-07-14 21:43:36Z bobstayton $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<doc:reference xmlns=""><info><title>FO Processing Instruction Reference</title>
+ <releaseinfo role="meta">
+ $Id: pi.xsl 8487 2009-07-14 21:43:36Z bobstayton $
+ </releaseinfo>
+ </info>
+
+ <partintro id="partintro">
+ <title>Introduction</title>
+
+ <para>This is generated reference documentation for all
+ user-specifiable processing instructions (PIs) in the DocBook
+ XSL stylesheets for FO output.
+ <note>
+ <para>You add these PIs at particular points in a document to
+ cause specific “exceptions†to formatting/output behavior. To
+ make global changes in formatting/output behavior across an
+ entire document, it’s better to do it by setting an
+ appropriate stylesheet parameter (if there is one).</para>
+ </note>
+ </para>
+ </partintro>
+</doc:reference>
+
+<!-- ==================================================================== -->
+
+<doc:pi name="dbfo_background-color" xmlns="">
+ <refpurpose>Sets background color for an image</refpurpose>
+ <refdescription>
+ <para>Use the <tag class="xmlpi">dbfo background-color</tag> PI before or
+ after an image (<tag>graphic</tag>, <tag>inlinegraphic</tag>,
+ <tag>imagedata</tag>, or <tag>videodata</tag> element) as a
+ sibling to the element, to set a background color for the
+ image.</para>
+ </refdescription>
+ <refsynopsisdiv>
+ <synopsis><tag class="xmlpi">dbfo background-color="<replaceable>color</replaceable>"</tag></synopsis>
+ </refsynopsisdiv>
+ <refparameter>
+ <variablelist>
+ <varlistentry><term>background-color="<replaceable>color</replaceable>"</term>
+ <listitem>
+ <para>An HTML color value</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+ <refsee role="tcg">
+ <para><link role="tcg"
+ xlink:href="BGcolor.html"
+ >Background color</link></para>
+ </refsee>
+</doc:pi>
+<xsl:template name="pi.dbfo_background-color">
+ <xsl:param name="node" select="."/>
+ <xsl:call-template name="dbfo-attribute">
+ <xsl:with-param name="pis" select="$node/processing-instruction('dbfo')"/>
+ <xsl:with-param name="attribute" select="'background-color'"/>
+ </xsl:call-template>
+</xsl:template>
+
+<doc:pi name="dbfo_bgcolor" xmlns="">
+ <refpurpose>Sets background color on a table row or table cell</refpurpose>
+ <refdescription>
+ <para>Use the <tag class="xmlpi">dbfo bgcolor</tag> PI as child of a table row
+ or cell to set a background color for that table row or cell.</para>
+ <para>This PI works for both CALS and HTML tables.</para>
+ </refdescription>
+ <refsynopsisdiv>
+ <synopsis><tag class="xmlpi">dbfo bgcolor="<replaceable>color</replaceable>"</tag></synopsis>
+ </refsynopsisdiv>
+ <refparameter>
+ <variablelist>
+ <varlistentry><term>bgcolor="<replaceable>color</replaceable>"</term>
+ <listitem>
+ <para>An HTML color value</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+ <refsee role="tcg">
+ <para><link role="tcg"
+ xlink:href="BGtableColor.html#CellBGColor"
+ >Cell background color</link></para>
+ </refsee>
+</doc:pi>
+<xsl:template name="pi.dbfo_bgcolor">
+ <xsl:param name="node" select="."/>
+ <xsl:call-template name="dbfo-attribute">
+ <xsl:with-param name="pis" select="$node/processing-instruction('dbfo')"/>
+ <xsl:with-param name="attribute" select="'bgcolor'"/>
+ </xsl:call-template>
+</xsl:template>
+
+<doc:pi name="dbfo_float-type" xmlns="">
+ <refpurpose>Specifies float behavior for a sidebar</refpurpose>
+ <refdescription>
+ <para>Use the <tag class="xmlpi">dbfo float-type</tag> PI to specify the float
+ behavior for a <tag>sidebar</tag> (to cause the sidebar to be
+ displayed as a marginal note).</para>
+ </refdescription>
+ <refsynopsisdiv>
+ <synopsis><tag class="xmlpi">dbfo float-type="margin.note"</tag></synopsis>
+ </refsynopsisdiv>
+ <refparameter>
+ <variablelist>
+ <varlistentry><term>float-type="margin.note"</term>
+ <listitem>
+ <para>Specifies that the <tag>sidebar</tag> should be
+ displayed as a marginal note.</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+ <refsee role="params">
+ <para><parameter>sidebar.float.type</parameter> (parameter),
+ <parameter>sidebar.float.width</parameter> (parameter),
+ <parameter>sidebar.properties</parameter> (attribute-set),
+ <parameter>sidebar.title.properties</parameter> (attribute-set)
+ </para>
+ </refsee>
+ <refsee role="tcg">
+ <para><link role="tcg" xlink:href="SideFloats.html#SidebarFloats" >A sidebar as
+ side float</link></para>
+ </refsee>
+</doc:pi>
+<xsl:template name="pi.dbfo_float-type">
+ <xsl:param name="node" select="."/>
+ <xsl:call-template name="dbfo-attribute">
+ <xsl:with-param name="pis" select="$node/processing-instruction('dbfo')"/>
+ <xsl:with-param name="attribute" select="'float-type'"/>
+ </xsl:call-template>
+</xsl:template>
+
+<doc:pi name="dbfo_funcsynopsis-style" xmlns="">
+ <refpurpose>Specifies presentation style for a funcsynopsis</refpurpose>
+ <refdescription>
+ <para>Use the <tag class="xmlpi">dbfo funcsynopsis-style</tag> PI as a child of
+ a <tag>funcsynopsis</tag> or anywhere within a funcsynopsis
+ to control the presentation style for output of all
+ <tag>funcprototype</tag> instances within that funcsynopsis.</para>
+ </refdescription>
+ <refsynopsisdiv>
+ <synopsis><tag class="xmlpi">dbfo funcsynopsis-style="kr"|"ansi"</tag></synopsis>
+ </refsynopsisdiv>
+ <refparameter>
+ <variablelist>
+ <varlistentry><term>funcsynopsis-style="kr"</term>
+ <listitem>
+ <para>Displays <tag>funcprototype</tag> output in K&amp;R style</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry><term>funcsynopsis-style="ansi"</term>
+ <listitem>
+ <para>Displays <tag>funcprototype</tag> output in ANSI style</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+ <refsee role="params">
+ <para><parameter>funcsynopsis.style</parameter></para>
+ </refsee>
+</doc:pi>
+<xsl:template name="pi.dbfo_funcsynopsis-style">
+ <xsl:param name="node" select="."/>
+ <xsl:call-template name="dbfo-attribute">
+ <xsl:with-param name="pis" select="$node/processing-instruction('dbfo')"/>
+ <xsl:with-param name="attribute" select="'funcsynopsis-style'"/>
+ </xsl:call-template>
+</xsl:template>
+
+<doc:pi name="dbfo_glossary-presentation" xmlns="">
+ <refpurpose>Specifies presentation style for a glossary</refpurpose>
+ <refdescription>
+ <para>Use the <tag class="xmlpi">dbfo glossary-presentation</tag> PI as a child of
+ a <tag>glossary</tag> to control its presentation style.</para>
+ </refdescription>
+ <refsynopsisdiv>
+ <synopsis><tag class="xmlpi">dbfo glossary-presentation="list"|"blocks"</tag></synopsis>
+ </refsynopsisdiv>
+ <refparameter>
+ <variablelist>
+ <varlistentry><term>glossary-presentation="list"</term>
+ <listitem>
+ <para>Displays the glossary as a list</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry><term>glossary-presentation="blocks"</term>
+ <listitem>
+ <para>Displays the glossary as blocks</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+ <refsee role="params">
+ <para><parameter>glossary.as.blocks</parameter></para>
+ </refsee>
+ <refsee role="tcg">
+ <para><link role="tcg" xlink:href="Glossaries.html#GlossaryFormatPrint" >Glossary
+ formatting in print</link></para>
+ </refsee>
+</doc:pi>
+<xsl:template name="pi.dbfo_glossary-presentation">
+ <xsl:param name="node" select="."/>
+ <xsl:call-template name="dbfo-attribute">
+ <xsl:with-param name="pis" select="$node/processing-instruction('dbfo')"/>
+ <xsl:with-param name="attribute" select="'glossary-presentation'"/>
+ </xsl:call-template>
+</xsl:template>
+
+<doc:pi name="dbfo_glosslist-presentation" xmlns="">
+ <refpurpose>Specifies presentation style for a glosslist</refpurpose>
+ <refdescription>
+ <para>Use the <tag class="xmlpi">dbfo glosslist-presentation</tag> PI as a child of
+ a <tag>glosslist</tag> to control its presentation style.</para>
+ </refdescription>
+ <refsynopsisdiv>
+ <synopsis><tag class="xmlpi">dbfo glosslist-presentation="list"|"blocks"</tag></synopsis>
+ </refsynopsisdiv>
+ <refparameter>
+ <variablelist>
+ <varlistentry><term>glosslist-presentation="list"</term>
+ <listitem>
+ <para>Displays the glosslist as a list</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry><term>glosslist-presentation="blocks"</term>
+ <listitem>
+ <para>Displays the glosslist as blocks</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+ <refsee role="params">
+ <para><parameter>glosslist.as.blocks</parameter> </para>
+ </refsee>
+ <refsee role="tcg">
+ <para><link role="tcg" xlink:href="Glossaries.html#GlossaryFormatPrint" >Glossary
+ formatting in print</link></para>
+ </refsee>
+</doc:pi>
+<xsl:template name="pi.dbfo_glosslist-presentation">
+ <xsl:param name="node" select="."/>
+ <xsl:call-template name="dbfo-attribute">
+ <xsl:with-param name="pis" select="$node/processing-instruction('dbfo')"/>
+ <xsl:with-param name="attribute" select="'glosslist-presentation'"/>
+ </xsl:call-template>
+</xsl:template>
+
+<doc:pi name="dbfo_glossterm-width" xmlns="">
+ <refpurpose>Specifies the glossterm width for a glossary or
+ glosslist</refpurpose>
+ <refdescription>
+ <para>Use the <tag class="xmlpi">dbfo glossterm-width</tag> PI as a child of a
+ <tag>glossary</tag> or <tag>glosslist</tag> to specify the
+ width for output of <tag>glossterm</tag> instances in the
+ output.</para>
+ </refdescription>
+ <refsynopsisdiv>
+ <synopsis><tag class="xmlpi">dbfo glossterm-width="<replaceable>width</replaceable>"</tag></synopsis>
+ </refsynopsisdiv>
+ <refparameter>
+ <variablelist>
+ <varlistentry><term>glossterm-width="<replaceable>width</replaceable>"</term>
+ <listitem>
+ <para>Specifies the glossterm width (including units)</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+ <refsee role="params">
+ <para><parameter>glossterm.width</parameter>,
+ <parameter>glossterm.separation</parameter>
+ </para>
+ </refsee>
+ <refsee role="tcg">
+ <para><link role="tcg" xlink:href="Glossaries.html#GlossaryFormatPrint" >Glossary
+ formatting in print</link></para>
+ </refsee>
+</doc:pi>
+<xsl:template name="pi.dbfo_glossterm-width">
+ <xsl:param name="node" select="."/>
+ <xsl:call-template name="dbfo-attribute">
+ <xsl:with-param name="pis" select="$node/processing-instruction('dbfo')"/>
+ <xsl:with-param name="attribute" select="'glossterm-width'"/>
+ </xsl:call-template>
+</xsl:template>
+
+<doc:pi name="dbfo_keep-together" xmlns="">
+ <refpurpose>Specifies “keep†behavior for a table, example,
+ figure, equation, procedure, or task</refpurpose>
+ <refdescription>
+ <para>Use the <tag class="xmlpi">dbfo keep-together</tag> PI as a child of a
+ formal object (<tag>table</tag>, <tag>example</tag>,
+ <tag>figure</tag>, <tag>equation</tag>, <tag>procedure</tag>, or
+ <tag>task</tag>) to specify “keep†behavior (to allow the object to
+ “break†across a page).</para>
+ <para>The PI also works with <tag>informaltable</tag>, <tag>informalexample</tag>,
+ <tag>informalfigure</tag> and <tag>informalequation</tag>.
+ </para>
+
+ </refdescription>
+ <refsynopsisdiv>
+ <synopsis><tag class="xmlpi">dbfo keep-together="auto"|"always"</tag></synopsis>
+ </refsynopsisdiv>
+ <refparameter>
+ <variablelist>
+ <varlistentry><term>keep-together="auto"</term>
+ <listitem>
+ <para>Enables the object to break across a page</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry><term>keep-together="always"</term>
+ <listitem>
+ <para>Prevents the object from breaking across a page (the
+ default stylesheet behavior)</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+ <refsee role="params">
+ <para>formal.object.properties</para>
+ </refsee>
+ <refsee role="tcg">
+ <para><link role="tcg" xlink:href="PageBreaking.html#KeepTogetherPI"
+ >Keep-together processing instruction</link></para>
+ </refsee>
+</doc:pi>
+<xsl:template name="pi.dbfo_keep-together">
+ <xsl:param name="node" select="."/>
+ <xsl:call-template name="dbfo-attribute">
+ <xsl:with-param name="pis" select="$node/processing-instruction('dbfo')"/>
+ <xsl:with-param name="attribute" select="'keep-together'"/>
+ </xsl:call-template>
+</xsl:template>
+
+<doc:pi name="dbfo_label-width" xmlns="">
+ <refpurpose>Specifies the label width for a qandaset, itemizedlist, orderedlist
+ or calloutlist</refpurpose>
+ <refdescription>
+ <para>Use the <tag class="xmlpi">dbfo label-width</tag> PI as a child of a
+ <tag>qandaset</tag>, <tag>itemizedlist</tag>, <tag>orderedlist</tag>,
+ or <tag>calloutlist</tag> to specify the width of labels.</para>
+ </refdescription>
+ <refsynopsisdiv>
+ <synopsis><tag class="xmlpi">dbfo label-width="<replaceable>width</replaceable>"</tag></synopsis>
+ </refsynopsisdiv>
+ <refparameter>
+ <variablelist>
+ <varlistentry><term>label-width="<replaceable>width</replaceable>"</term>
+ <listitem>
+ <para>Specifies the label width (including units)</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+ <refsee role="tcg">
+ <para><link role="tcg"
+ xlink:href="QandAformat.html"
+ >Q and A formatting</link></para>
+ </refsee>
+</doc:pi>
+<xsl:template name="pi.dbfo_label-width">
+ <xsl:param name="node" select="."/>
+ <xsl:call-template name="dbfo-attribute">
+ <xsl:with-param name="pis" select="$node/processing-instruction('dbfo')"/>
+ <xsl:with-param name="attribute" select="'label-width'"/>
+ </xsl:call-template>
+</xsl:template>
+
+<doc:pi name="dbfo_linenumbering.everyNth" xmlns="">
+ <refpurpose>Specifies interval for line numbers in verbatims</refpurpose>
+ <refdescription>
+ <para>Use the <tag class="xmlpi">dbfo linenumbering.everyNth</tag> PI as a child
+ of a “verbatim†element – <tag>programlisting</tag>,
+ <tag>screen</tag>, <tag>synopsis</tag> — to specify
+ the interval at which lines are numbered.</para>
+ </refdescription>
+ <refsynopsisdiv>
+ <synopsis><tag class="xmlpi">dbfo linenumbering.everyNth="<replaceable>N</replaceable>"</tag></synopsis>
+ </refsynopsisdiv>
+ <refparameter>
+ <variablelist>
+ <varlistentry><term>linenumbering.everyNth="<replaceable>N</replaceable>"</term>
+ <listitem>
+ <para>Specifies numbering interval; a number is output
+ before every <replaceable>N</replaceable>th line</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+ <refsee role="params">
+ <para><parameter>linenumbering.everyNth</parameter></para>
+ </refsee>
+ <refsee role="tcg">
+ <para><link role="tcg"
+ xlink:href="AnnotateListing.html#LineNumbering"
+ >Line numbering</link></para>
+ </refsee>
+</doc:pi>
+<xsl:template name="pi.dbfo_linenumbering.everyNth">
+ <xsl:param name="node" select="."/>
+ <xsl:call-template name="dbfo-attribute">
+ <xsl:with-param name="pis" select="$node/processing-instruction('dbfo')"/>
+ <xsl:with-param name="attribute" select="'linenumbering.everyNth'"/>
+ </xsl:call-template>
+</xsl:template>
+
+<doc:pi name="dbfo_linenumbering.separator" xmlns="">
+ <refpurpose>Specifies separator text for line numbers in verbatims</refpurpose>
+ <refdescription>
+ <para>Use the <tag class="xmlpi">dbfo linenumbering.separator</tag> PI as a child
+ of a “verbatim†element – <tag>programlisting</tag>,
+ <tag>screen</tag>, <tag>synopsis</tag> — to specify
+ the separator text output between the line numbers and content.</para>
+ </refdescription>
+ <refsynopsisdiv>
+ <synopsis><tag class="xmlpi">dbfo linenumbering.separator="<replaceable>text</replaceable>"</tag></synopsis>
+ </refsynopsisdiv>
+ <refparameter>
+ <variablelist>
+ <varlistentry><term>linenumbering.separator="<replaceable>text</replaceable>"</term>
+ <listitem>
+ <para>Specifies the text (zero or more characters)</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+ <refsee role="params">
+ <para><parameter>linenumbering.separator</parameter></para>
+ </refsee>
+ <refsee role="tcg">
+ <para><link role="tcg"
+ xlink:href="AnnotateListing.html#LineNumbering"
+ >Line numbering</link></para>
+ </refsee>
+</doc:pi>
+<xsl:template name="pi.dbfo_linenumbering.separator">
+ <xsl:param name="node" select="."/>
+ <xsl:call-template name="dbfo-attribute">
+ <xsl:with-param name="pis" select="$node/processing-instruction('dbfo')"/>
+ <xsl:with-param name="attribute" select="'linenumbering.separator'"/>
+ </xsl:call-template>
+</xsl:template>
+
+<doc:pi name="dbfo_linenumbering.width" xmlns="">
+ <refpurpose>Specifies width for line numbers in verbatims</refpurpose>
+ <refdescription>
+ <para>Use the <tag class="xmlpi">dbfo linenumbering.width</tag> PI as a child
+ of a “verbatim†element – <tag>programlisting</tag>,
+ <tag>screen</tag>, <tag>synopsis</tag> — to specify
+ the width set aside for line numbers.</para>
+ </refdescription>
+ <refsynopsisdiv>
+ <synopsis><tag class="xmlpi">dbfo linenumbering.width="<replaceable>width</replaceable>"</tag></synopsis>
+ </refsynopsisdiv>
+ <refparameter>
+ <variablelist>
+ <varlistentry><term>linenumbering.width="<replaceable>width</replaceable>"</term>
+ <listitem>
+ <para>Specifies the width (inluding units)</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+ <refsee role="params">
+ <para><parameter>linenumbering.width</parameter></para>
+ </refsee>
+ <refsee role="tcg">
+ <para><link role="tcg"
+ xlink:href="AnnotateListing.html#LineNumbering"
+ >Line numbering</link></para>
+ </refsee>
+</doc:pi>
+<xsl:template name="pi.dbfo_linenumbering.width">
+ <xsl:param name="node" select="."/>
+ <xsl:call-template name="dbfo-attribute">
+ <xsl:with-param name="pis" select="$node/processing-instruction('dbfo')"/>
+ <xsl:with-param name="attribute" select="'linenumbering.width'"/>
+ </xsl:call-template>
+</xsl:template>
+
+<doc:pi name="dbfo_list-presentation" xmlns="">
+ <refpurpose>Specifies presentation style for a variablelist or
+ segmentedlist</refpurpose>
+ <refdescription>
+ <para>Use the <tag class="xmlpi">dbfo list-presentation</tag> PI as a child of
+ a <tag>variablelist</tag> or <tag>segmentedlist</tag> to
+ control the presentation style for the list (to cause it, for
+ example, to be displayed as a table).</para>
+ </refdescription>
+ <refsynopsisdiv>
+ <synopsis><tag class="xmlpi">dbfo list-presentation="list"|"blocks"|"table"</tag></synopsis>
+ </refsynopsisdiv>
+ <refparameter>
+ <variablelist>
+ <varlistentry><term>list-presentation="list"</term>
+ <listitem>
+ <para>Displays the list as a list</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry><term>list-presentation="blocks"</term>
+ <listitem>
+ <para>(<tag>variablelist</tag> only) Displays the list as blocks</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry><term>list-presentation="table"</term>
+ <listitem>
+ <para>(<tag>segmentedlist</tag> only) Displays the list as a table</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+ <refsee role="params">
+ <itemizedlist>
+ <listitem>
+ <para><parameter>variablelist.as.blocks</parameter></para>
+ </listitem>
+ <listitem>
+ <para><parameter>variablelist.as.table</parameter></para>
+ </listitem>
+ </itemizedlist>
+ </refsee>
+ <refsee role="tcg">
+ <para><link role="tcg"
+ xlink:href="Variablelists.html#ListIndents"
+ >Variable list formatting in print</link></para>
+ </refsee>
+</doc:pi>
+<xsl:template name="pi.dbfo_list-presentation">
+ <xsl:param name="node" select="."/>
+ <xsl:call-template name="dbfo-attribute">
+ <xsl:with-param name="pis" select="$node/processing-instruction('dbfo')"/>
+ <xsl:with-param name="attribute" select="'list-presentation'"/>
+ </xsl:call-template>
+</xsl:template>
+
+<doc:pi name="dbfo_list-width" xmlns="">
+ <refpurpose>Specifies the width of a horizontal simplelist</refpurpose>
+ <refdescription>
+ <para>Use the <tag class="xmlpi">dbfo list-width</tag> PI as a child of a
+ <tag>simplelist</tag> whose <tag class="attribute">class</tag>
+ value is <literal>horizontal</literal>, to specify the width
+ of the <tag>simplelist</tag>.</para>
+ </refdescription>
+ <refsynopsisdiv>
+ <synopsis><tag class="xmlpi">dbfo list-width="<replaceable>width</replaceable>"</tag></synopsis>
+ </refsynopsisdiv>
+ <refparameter>
+ <variablelist>
+ <varlistentry><term>list-width="<replaceable>width</replaceable>"</term>
+ <listitem>
+ <para>Specifies the <tag>simplelist</tag> width (including units)</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+</doc:pi>
+<xsl:template name="pi.dbfo_list-width">
+ <xsl:param name="node" select="."/>
+ <xsl:call-template name="dbfo-attribute">
+ <xsl:with-param name="pis" select="$node/processing-instruction('dbfo')"/>
+ <xsl:with-param name="attribute" select="'list-width'"/>
+ </xsl:call-template>
+</xsl:template>
+
+<doc:pi name="dbfo_orientation" xmlns="">
+ <refpurpose>Specifies the orientation for a CALS table row or cell</refpurpose>
+ <refdescription>
+ <para>Use the <tag class="xmlpi">dbfo orientation</tag> PI as a child of a CALS
+ <tag>table</tag> row or cell to specify the orientation
+ (rotation) for the row or cell.</para>
+ </refdescription>
+ <refsynopsisdiv>
+ <synopsis><tag class="xmlpi">dbfo orientation="0"|"90"|"180"|"270"|"-90"|"-180"|"-270"</tag></synopsis>
+ </refsynopsisdiv>
+ <refparameter>
+ <variablelist>
+ <varlistentry><term>orientation="0"|"90"|"180"|"270"|"-90"|"-180"|"-270"</term>
+ <listitem>
+ <para>Specifies the number of degrees by which the cell or
+ row is rotated</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+</doc:pi>
+<xsl:template name="pi.dbfo_orientation">
+ <xsl:param name="node" select="."/>
+ <xsl:call-template name="dbfo-attribute">
+ <xsl:with-param name="pis" select="$node/processing-instruction('dbfo')"/>
+ <xsl:with-param name="attribute" select="'orientation'"/>
+ </xsl:call-template>
+</xsl:template>
+
+<doc:pi name="dbfo_pgwide" xmlns="">
+ <refpurpose>Specifies if an <tag>equation</tag> or <tag>example</tag> goes across full page width</refpurpose>
+ <refdescription>
+ <para>Use the <tag class="xmlpi">dbfo pgwide</tag> PI as a child of an
+ <tag>equation</tag> or <tag>example</tag> to specify that the
+ content should rendered across the full width of the page.</para>
+ </refdescription>
+ <refsynopsisdiv>
+ <synopsis><tag class="xmlpi">dbfo pgwide="0"|"1"</tag></synopsis>
+ </refsynopsisdiv>
+ <refparameter>
+ <variablelist>
+ <varlistentry><term>pgwide="0"</term>
+ <listitem>
+ <para>If zero, the content is rendered across the current
+ text flow</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry><term>pgwide="1"</term>
+ <listitem>
+ <para>If <code>1</code> (or any non-zero value), the
+ content is rendered across the full width of the page</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+ <refsee role="params">
+ <para><parameter>pgwide.properties</parameter></para>
+ </refsee>
+</doc:pi>
+<xsl:template name="pi.dbfo_pgwide">
+ <xsl:param name="node" select="."/>
+ <xsl:call-template name="dbfo-attribute">
+ <xsl:with-param name="pis" select="$node/processing-instruction('dbfo')"/>
+ <xsl:with-param name="attribute" select="'pgwide'"/>
+ </xsl:call-template>
+</xsl:template>
+
+<doc:pi name="dbfo_rotated-width" xmlns="">
+ <refpurpose>Specifies the width for a CALS table <tag>entry</tag> or
+ <tag>row</tag></refpurpose>
+ <refdescription>
+ <para>Use the <tag class="xmlpi">dbfo rotated-width</tag> PI as a child of
+ <tag>entry</tag> or <tag>row</tag> instance in a CALS table to specify the
+ width of that the <tag>entry</tag> or <tag>row</tag>; or
+ use it higher up in table to cause the width to be inherited
+ recursively down.</para>
+ </refdescription>
+ <refsynopsisdiv>
+ <synopsis><tag class="xmlpi">dbfo rotated-width="<replaceable>width</replaceable>"</tag></synopsis>
+ </refsynopsisdiv>
+ <refparameter>
+ <variablelist>
+ <varlistentry><term>rotated-width="<replaceable>width</replaceable>"</term>
+ <listitem>
+ <para>Specifies the width of a row or cell (including units)</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+</doc:pi>
+<xsl:template name="pi.dbfo_rotated-width">
+ <xsl:param name="node" select="."/>
+ <xsl:call-template name="dbfo-attribute">
+ <xsl:with-param name="pis" select="$node/processing-instruction('dbfo')"/>
+ <xsl:with-param name="attribute" select="'rotated-width'"/>
+ </xsl:call-template>
+</xsl:template>
+
+<doc:pi name="dbfo_sidebar-width" xmlns="">
+ <refpurpose>Specifies the width of a sidebar</refpurpose>
+ <refdescription>
+ <para>Use the <tag class="xmlpi">dbfo sidebar-width</tag> PI as a child of a
+ <tag>sidebar</tag> to specify the width of the sidebar.</para>
+ </refdescription>
+ <refsynopsisdiv>
+ <synopsis><tag class="xmlpi">dbfo sidebar-width="<replaceable>width</replaceable>"</tag></synopsis>
+ </refsynopsisdiv>
+ <refparameter>
+ <variablelist>
+ <varlistentry><term>sidebar-width="<replaceable>width</replaceable>"</term>
+ <listitem>
+ <para>Specifies the <tag>sidebar</tag> width (including units)</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+ <refsee role="params">
+ <para><parameter>sidebar.float.type parameter</parameter>,
+ <parameter>sidebar.float.width parameter</parameter>,
+ <parameter>sidebar.properties attribute-set</parameter>,
+ <parameter>sidebar.title.properties</parameter>
+ </para>
+ </refsee>
+ <refsee role="tcg">
+ <para><link role="tcg" xlink:href="SideFloats.html#SidebarFloats" >A sidebar as
+ side float</link></para>
+ </refsee>
+</doc:pi>
+<xsl:template name="pi.dbfo_sidebar-width">
+ <xsl:param name="node" select="."/>
+ <xsl:call-template name="dbfo-attribute">
+ <xsl:with-param name="pis" select="$node/processing-instruction('dbfo')"/>
+ <xsl:with-param name="attribute" select="'sidebar-width'"/>
+ </xsl:call-template>
+</xsl:template>
+
+<doc:pi name="dbfo_start" xmlns="">
+ <refpurpose>(obsolete) Sets the starting number on an ordered list</refpurpose>
+ <refdescription>
+ <para><emphasis>This PI is obsolete</emphasis>. The intent of
+ it was to provide a means for setting a specific starting
+ number for an ordered list. Instead of this PI, set a value
+ for the <literal>override</literal> attribute on the first
+ <tag>listitem</tag> in the list; that will have the same
+ effect as what this PI was intended for.</para>
+ </refdescription>
+ <refsynopsisdiv>
+ <synopsis><tag class="xmlpi">dbfo start="<replaceable>character</replaceable>"</tag></synopsis>
+ </refsynopsisdiv>
+ <refparameter>
+ <variablelist>
+ <varlistentry><term>start="<replaceable>character</replaceable>"</term>
+ <listitem>
+ <para>Specifies the character to use as the starting
+ number; use 0-9, a-z, A-Z, or lowercase or uppercase
+ Roman numerals</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+ <refsee role="tcg">
+ <para><link role="tcg"
+ xlink:href="Orderedlists.html#ListStartNum"
+ >List starting number</link></para>
+ </refsee>
+</doc:pi>
+<xsl:template name="pi.dbfo_start">
+ <xsl:param name="node" select="."/>
+ <xsl:call-template name="pi-attribute">
+ <xsl:with-param name="pis" select="$node/processing-instruction('dbfo')"/>
+ <xsl:with-param name="attribute" select="'start'"/>
+ </xsl:call-template>
+</xsl:template>
+
+<doc:pi name="dbfo_table-width" xmlns="">
+ <refpurpose>Specifies the width for a CALS table or for revhistory
+ output</refpurpose>
+ <refdescription>
+ <para>Use the <tag class="xmlpi">dbfo table-width</tag> PI as a child or
+ sibling of a CALS <tag>table</tag>, or as a child of an
+ <tag>informaltable</tag>, <tag>entrytbl</tag>, or
+ <tag>revhistory</tag> instance (which is rendered as a table
+ in output) to specify the width of the table in output.</para>
+ </refdescription>
+ <refsynopsisdiv>
+ <synopsis><tag class="xmlpi">dbfo table-width="<replaceable>width</replaceable>"</tag></synopsis>
+ </refsynopsisdiv>
+ <refparameter>
+ <variablelist>
+ <varlistentry><term>table-width="<replaceable>width</replaceable>"</term>
+ <listitem>
+ <para>Specifies the table width (including units or as a percentage)</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+ <refsee role="tcg">
+ <para><link role="tcg"
+ xlink:href="Tables.html#TableWidth"
+ >Table width</link></para>
+ </refsee>
+</doc:pi>
+<xsl:template name="pi.dbfo_table-width">
+ <xsl:param name="node" select="."/>
+ <xsl:call-template name="dbfo-attribute">
+ <xsl:with-param name="pis" select="$node/processing-instruction('dbfo')"/>
+ <xsl:with-param name="attribute" select="'table-width'"/>
+ </xsl:call-template>
+</xsl:template>
+
+<doc:pi name="dbfo_term-width" xmlns="">
+ <refpurpose>Specifies the term width for a variablelist</refpurpose>
+ <refdescription>
+ <para>Use the <tag class="xmlpi">dbfo term-width</tag> PI as a child of a
+ <tag>variablelist</tag> to specify the width for
+ <tag>term</tag> output.</para>
+ </refdescription>
+ <refsynopsisdiv>
+ <synopsis><tag class="xmlpi">dbfo term-width="<replaceable>width</replaceable>"</tag></synopsis>
+ </refsynopsisdiv>
+ <refparameter>
+ <variablelist>
+ <varlistentry><term>term-width="<replaceable>width</replaceable>"</term>
+ <listitem>
+ <para>Specifies the term width (including units)</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+ <refsee role="tcg">
+ <para><link role="tcg"
+ xlink:href="Variablelists.html#ListIndents"
+ >Variable list formatting in print</link></para>
+ </refsee>
+</doc:pi>
+<xsl:template name="pi.dbfo_term-width">
+ <xsl:param name="node" select="."/>
+ <xsl:call-template name="dbfo-attribute">
+ <xsl:with-param name="pis" select="$node/processing-instruction('dbfo')"/>
+ <xsl:with-param name="attribute" select="'term-width'"/>
+ </xsl:call-template>
+</xsl:template>
+
+<doc:pi name="dbfo_toc" xmlns="">
+ <refpurpose>Specifies whether a TOC should be generated for a qandaset</refpurpose>
+ <refdescription>
+ <para>Use the <tag class="xmlpi">dbfo toc</tag> PI as a child of a
+ <tag>qandaset</tag> to specify whether a table of contents
+ (TOC) is generated for the <tag>qandaset</tag>.</para>
+ </refdescription>
+ <refsynopsisdiv>
+ <synopsis><tag class="xmlpi">dbfo toc="0"|"1"</tag></synopsis>
+ </refsynopsisdiv>
+ <refparameter>
+ <variablelist>
+ <varlistentry><term>toc="0"</term>
+ <listitem>
+ <para>If zero, no TOC is generated</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry><term>toc="1"</term>
+ <listitem>
+ <para>If <code>1</code> (or any non-zero value),
+ a TOC is generated</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+ <refsee role="tcg">
+ <para><link role="tcg"
+ xlink:href="QandAtoc.html"
+ >Q and A list of questions</link>,
+ <link role="tcg"
+ xlink:href="QandAformat.html"
+ >Q and A formatting</link></para>
+ </refsee>
+</doc:pi>
+<xsl:template name="pi.dbfo_toc">
+ <xsl:param name="node" select="."/>
+ <xsl:call-template name="dbfo-attribute">
+ <xsl:with-param name="pis" select="$node/processing-instruction('dbfo')"/>
+ <xsl:with-param name="attribute" select="'toc'"/>
+ </xsl:call-template>
+</xsl:template>
+
+<doc:pi name="dbfo-need" xmlns="">
+ <refpurpose>Specify a need for space (a kind of soft page break)</refpurpose>
+ <refdescription>
+ <para>A “need†is a request for space on a page. If the
+ requested space is not available, the page breaks and the
+ content that follows the need request appears on the next
+ page. If the requested space is available, then no page break
+ is inserted.</para>
+ </refdescription>
+ <refsynopsisdiv>
+ <synopsis><tag class="xmlpi">dbfo-need height="<replaceable>n</replaceable>" [space-before="<replaceable>n</replaceable>"]</tag></synopsis>
+ </refsynopsisdiv>
+ <refparameter>
+ <variablelist>
+ <varlistentry><term>height="<replaceable>n</replaceable>"</term>
+ <listitem>
+ <para>The amount of height needed (including units)</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry><term>space-before="<replaceable>n</replaceable>"</term>
+ <listitem>
+ <para>The amount of extra vertical space to add (including units)</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+ <refsee role="tcg">
+ <para><link role="tcg"
+ xlink:href="PageBreaking.html#SoftPageBreaks"
+ >Soft page breaks</link></para>
+ </refsee>
+</doc:pi>
+
+<doc:pi name="dbfo_row-height" xmlns="">
+ <refpurpose>Specifies the height for a CALS table row</refpurpose>
+ <refdescription>
+ <para>Use the <tag class="xmlpi">dbfo row-height</tag> PI as a child of a
+ <tag>row</tag> to specify the height of the row.</para>
+ </refdescription>
+ <refsynopsisdiv>
+ <synopsis><tag class="xmlpi">dbfo row-height="<replaceable>height</replaceable>"</tag></synopsis>
+ </refsynopsisdiv>
+ <refparameter>
+ <variablelist>
+ <varlistentry><term>row-height="<replaceable>height</replaceable>"</term>
+ <listitem>
+ <para>Specifies the row height (including units)</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+ <refsee role="tcg">
+ <para><link role="tcg"
+ xlink:href="RowHeight.html"
+ >Row height</link></para>
+ </refsee>
+</doc:pi>
+<xsl:template name="pi.dbfo_row-height">
+ <xsl:param name="node" select="."/>
+ <xsl:call-template name="dbfo-attribute">
+ <xsl:with-param name="pis" select="$node/processing-instruction('dbfo')"/>
+ <xsl:with-param name="attribute" select="'row-height'"/>
+ </xsl:call-template>
+</xsl:template>
+
+
+<xsl:template name="pi.dbfo-need">
+ <xsl:variable name="pi-height">
+ <xsl:call-template name="dbfo-attribute">
+ <xsl:with-param name="pis" select="."/>
+ <xsl:with-param name="attribute" select="'height'"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="height">
+ <xsl:choose>
+ <xsl:when test="$pi-height != ''">
+ <xsl:value-of select="$pi-height"/>
+ </xsl:when>
+ <xsl:otherwise>0pt</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="pi-before">
+ <xsl:call-template name="dbfo-attribute">
+ <xsl:with-param name="pis" select="."/>
+ <xsl:with-param name="attribute" select="'space-before'"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="spacer">
+ <fo:block-container width="100%" height="{$height}">
+ <fo:block><fo:leader leader-length="0pt"/></fo:block>
+ </fo:block-container>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="$fop1.extensions != 0">
+ <!-- Doesn't work in fop -->
+ </xsl:when>
+ <xsl:when test="$fop.extensions != 0">
+ <!-- Doesn't work in fop -->
+ </xsl:when>
+ <xsl:when test="$pi-before != '' and
+ not(following-sibling::listitem) and
+ not(following-sibling::step)">
+ <fo:block space-after="0pt" space-before="{$pi-before}">
+ <xsl:copy-of select="$spacer"/>
+ </fo:block>
+ </xsl:when>
+ <xsl:when test="following-sibling::para">
+ <fo:block space-after="0pt"
+ xsl:use-attribute-sets="normal.para.spacing">
+ <xsl:copy-of select="$spacer"/>
+ </fo:block>
+ </xsl:when>
+ <xsl:when test="following-sibling::table or
+ following-sibling::figure or
+ following-sibling::example or
+ following-sibling::equation">
+ <fo:block space-after="0pt"
+ xsl:use-attribute-sets="formal.object.properties">
+ <xsl:copy-of select="$spacer"/>
+ </fo:block>
+ </xsl:when>
+ <xsl:when test="following-sibling::informaltable or
+ following-sibling::informalfigure or
+ following-sibling::informalexample or
+ following-sibling::informalequation">
+ <fo:block space-after="0pt"
+ xsl:use-attribute-sets="informal.object.properties">
+ <xsl:copy-of select="$spacer"/>
+ </fo:block>
+ </xsl:when>
+ <xsl:when test="following-sibling::itemizedlist or
+ following-sibling::orderedlist or
+ following-sibling::variablelist or
+ following-sibling::simplelist">
+ <fo:block space-after="0pt"
+ xsl:use-attribute-sets="informal.object.properties">
+ <xsl:copy-of select="$spacer"/>
+ </fo:block>
+ </xsl:when>
+ <xsl:when test="following-sibling::listitem or
+ following-sibling::step">
+ <fo:list-item space-after="0pt"
+ xsl:use-attribute-sets="informal.object.properties">
+ <fo:list-item-label/>
+ <fo:list-item-body start-indent="0pt" end-indent="0pt">
+ <xsl:copy-of select="$spacer"/>
+ </fo:list-item-body>
+ </fo:list-item>
+ </xsl:when>
+ <xsl:when test="following-sibling::sect1 or
+ following-sibling::sect2 or
+ following-sibling::sect3 or
+ following-sibling::sect4 or
+ following-sibling::sect5 or
+ following-sibling::section">
+ <fo:block space-after="0pt"
+ xsl:use-attribute-sets="section.title.properties">
+ <xsl:copy-of select="$spacer"/>
+ </fo:block>
+ </xsl:when>
+ <xsl:otherwise>
+ <fo:block space-after="0pt" space-before="0em">
+ <xsl:copy-of select="$spacer"/>
+ </fo:block>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:choose>
+ <xsl:when test="$fop1.extensions != 0">
+ <!-- Doesn't work in fop -->
+ </xsl:when>
+ <xsl:when test="$fop.extensions != 0">
+ <!-- Doesn't work in fop -->
+ </xsl:when>
+ <xsl:when test="following-sibling::listitem or
+ following-sibling::step">
+ <fo:list-item space-before.precedence="force"
+ space-before="-{$height}"
+ space-after="0pt"
+ space-after.precedence="force">
+ <fo:list-item-label/>
+ <fo:list-item-body start-indent="0pt" end-indent="0pt"/>
+ </fo:list-item>
+ </xsl:when>
+ <xsl:otherwise>
+ <fo:block space-before.precedence="force"
+ space-before="-{$height}"
+ space-after="0pt"
+ space-after.precedence="force">
+ </fo:block>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template name="dbfo-attribute">
+ <!-- * dbfo-attribute is an interal utility template for retrieving -->
+ <!-- * pseudo-attributes/parameters from PIs -->
+ <xsl:param name="pis" select="processing-instruction('dbfo')"/>
+ <xsl:param name="attribute">filename</xsl:param>
+ <xsl:call-template name="pi-attribute">
+ <xsl:with-param name="pis" select="$pis"/>
+ <xsl:with-param name="attribute" select="$attribute"/>
+ </xsl:call-template>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="processing-instruction()">
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="processing-instruction('dbfo-need')">
+ <xsl:call-template name="pi.dbfo-need"/>
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/profile-docbook.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/profile-docbook.xsl
new file mode 100644
index 0000000..3b9b9c1
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/profile-docbook.xsl
@@ -0,0 +1,289 @@
+<?xml version="1.0" encoding="US-ASCII"?>
+<!--This file was created automatically by xsl2profile-->
+<!--from the DocBook XSL stylesheets.-->
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:exsl="http://exslt.org/common" xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:ng="http://docbook.org/docbook-ng" xmlns:db="http://docbook.org/ns/docbook" xmlns:exslt="http://exslt.org/common" exslt:dummy="dummy" ng:dummy="dummy" db:dummy="dummy" extension-element-prefixes="exslt" exclude-result-prefixes="db ng exsl exslt" version="1.0">
+
+<!-- It is important to use indent="no" here, otherwise verbatim -->
+<!-- environments get broken by indented tags...at least when the -->
+<!-- callout extension is used...at least with some processors -->
+<xsl:output method="xml" indent="no"/>
+
+<!-- ********************************************************************
+ $Id: docbook.xsl 8913 2010-10-01 04:44:57Z bobstayton $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<!-- ==================================================================== -->
+
+<xsl:include href="../VERSION"/>
+<xsl:include href="param.xsl"/>
+<xsl:include href="../lib/lib.xsl"/>
+<xsl:include href="../common/l10n.xsl"/>
+<xsl:include href="../common/common.xsl"/>
+<xsl:include href="../common/utility.xsl"/>
+<xsl:include href="../common/labels.xsl"/>
+<xsl:include href="../common/titles.xsl"/>
+<xsl:include href="../common/subtitles.xsl"/>
+<xsl:include href="../common/gentext.xsl"/>
+<xsl:include href="../common/olink.xsl"/>
+<xsl:include href="../common/targets.xsl"/>
+<xsl:include href="../common/pi.xsl"/>
+<xsl:include href="autotoc.xsl"/>
+<xsl:include href="autoidx.xsl"/>
+<xsl:include href="lists.xsl"/>
+<xsl:include href="callout.xsl"/>
+<xsl:include href="verbatim.xsl"/>
+<xsl:include href="graphics.xsl"/>
+<xsl:include href="xref.xsl"/>
+<xsl:include href="formal.xsl"/>
+<xsl:include href="table.xsl"/>
+<xsl:include href="htmltbl.xsl"/>
+<xsl:include href="sections.xsl"/>
+<xsl:include href="inline.xsl"/>
+<xsl:include href="footnote.xsl"/>
+<xsl:include href="fo.xsl"/>
+<xsl:include href="fo-rtf.xsl"/>
+<xsl:include href="info.xsl"/>
+<xsl:include href="keywords.xsl"/>
+<xsl:include href="division.xsl"/>
+<xsl:include href="index.xsl"/>
+<xsl:include href="toc.xsl"/>
+<xsl:include href="refentry.xsl"/>
+<xsl:include href="math.xsl"/>
+<xsl:include href="admon.xsl"/>
+<xsl:include href="component.xsl"/>
+<xsl:include href="biblio.xsl"/>
+<xsl:include href="biblio-iso690.xsl"/>
+<xsl:include href="glossary.xsl"/>
+<xsl:include href="block.xsl"/>
+<xsl:include href="task.xsl"/>
+<xsl:include href="qandaset.xsl"/>
+<xsl:include href="synop.xsl"/>
+<xsl:include href="titlepage.xsl"/>
+<xsl:include href="titlepage.templates.xsl"/>
+<xsl:include href="pagesetup.xsl"/>
+<xsl:include href="pi.xsl"/>
+<xsl:include href="spaces.xsl"/>
+<xsl:include href="ebnf.xsl"/>
+<xsl:include href="../html/chunker.xsl"/>
+<xsl:include href="annotations.xsl"/>
+<xsl:include href="../common/stripns.xsl"/>
+
+<xsl:include href="fop.xsl"/>
+<xsl:include href="fop1.xsl"/>
+<xsl:include href="passivetex.xsl"/>
+<xsl:include href="xep.xsl"/>
+<xsl:include href="axf.xsl"/>
+<xsl:include href="ptc.xsl"/>
+
+<xsl:param name="stylesheet.result.type" select="'fo'"/>
+
+<!-- ==================================================================== -->
+
+<xsl:key name="id" match="*" use="@id|@xml:id"/>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="*">
+ <xsl:message>
+ <xsl:text>Element </xsl:text>
+ <xsl:value-of select="local-name(.)"/>
+ <xsl:text> in namespace '</xsl:text>
+ <xsl:value-of select="namespace-uri(.)"/>
+ <xsl:text>' encountered</xsl:text>
+ <xsl:if test="parent::*">
+ <xsl:text> in </xsl:text>
+ <xsl:value-of select="name(parent::*)"/>
+ </xsl:if>
+ <xsl:text>, but no template matches.</xsl:text>
+ </xsl:message>
+
+ <fo:block color="red">
+ <xsl:text>&lt;</xsl:text>
+ <xsl:value-of select="name(.)"/>
+ <xsl:text>&gt;</xsl:text>
+ <xsl:apply-templates/>
+ <xsl:text>&lt;/</xsl:text>
+ <xsl:value-of select="name(.)"/>
+ <xsl:text>&gt;</xsl:text>
+ </fo:block>
+</xsl:template>
+
+<!-- Update this list if new root elements supported -->
+<xsl:variable name="root.elements" select="' appendix article bibliography book chapter colophon dedication glossary index part preface qandaset refentry reference sect1 section set setindex '"/>
+
+<xslo:include xmlns:xslo="http://www.w3.org/1999/XSL/Transform" href="../profiling/profile-mode.xsl"/><xslo:variable xmlns:xslo="http://www.w3.org/1999/XSL/Transform" name="profiled-content"><xslo:choose><xslo:when test="*/self::ng:* or */self::db:*"><xslo:message>Note: namesp. cut : stripped namespace before processing</xslo:message><xslo:variable name="stripped-content"><xslo:apply-templates select="/" mode="stripNS"/></xslo:variable><xslo:message>Note: namesp. cut : processing stripped document</xslo:message><xslo:apply-templates select="exslt:node-set($stripped-content)" mode="profile"/></xslo:when><xslo:otherwise><xslo:apply-templates select="/" mode="profile"/></xslo:otherwise></xslo:choose></xslo:variable><xslo:variable xmlns:xslo="http://www.w3.org/1999/XSL/Transform" name="profiled-nodes" select="exslt:node-set($profiled-content)"/><xsl:template match="/">
+ <!-- * Get a title for current doc so that we let the user -->
+ <!-- * know what document we are processing at this point. -->
+ <xsl:variable name="doc.title">
+ <xsl:call-template name="get.doc.title"/>
+ </xsl:variable>
+ <xsl:choose>
+ <!-- Hack! If someone hands us a DocBook V5.x or DocBook NG document,
+ toss the namespace and continue. Use the docbook5 namespaced
+ stylesheets for DocBook5 if you don't want to use this feature.-->
+ <xsl:when test="false()"/>
+ <!-- Can't process unless namespace removed -->
+ <xsl:when test="false()"/>
+ <xsl:otherwise>
+ <xsl:choose>
+ <xsl:when test="$rootid != ''">
+ <xsl:variable name="root.element" select="key('id', $rootid)"/>
+ <xsl:choose>
+ <xsl:when test="count($root.element) = 0">
+ <xsl:message terminate="yes">
+ <xsl:text>ID '</xsl:text>
+ <xsl:value-of select="$rootid"/>
+ <xsl:text>' not found in document.</xsl:text>
+ </xsl:message>
+ </xsl:when>
+ <xsl:when test="not(contains($root.elements, concat(' ', local-name($root.element), ' ')))">
+ <xsl:message terminate="yes">
+ <xsl:text>ERROR: Document root element ($rootid=</xsl:text>
+ <xsl:value-of select="$rootid"/>
+ <xsl:text>) for FO output </xsl:text>
+ <xsl:text>must be one of the following elements:</xsl:text>
+ <xsl:value-of select="$root.elements"/>
+ </xsl:message>
+ </xsl:when>
+ <!-- Otherwise proceed -->
+ <xsl:otherwise>
+ <xsl:if test="$collect.xref.targets = 'yes' or $collect.xref.targets = 'only'">
+ <xsl:apply-templates select="$root.element" mode="collect.targets"/>
+ </xsl:if>
+ <xsl:if test="$collect.xref.targets != 'only'">
+ <xsl:apply-templates select="$root.element" mode="process.root"/>
+ </xsl:if>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <!-- Otherwise process the document root element -->
+ <xsl:otherwise>
+ <xsl:variable name="document.element" select="*[1]"/>
+ <xsl:choose>
+ <xsl:when test="not(contains($root.elements, concat(' ', local-name($document.element), ' ')))">
+ <xsl:message terminate="yes">
+ <xsl:text>ERROR: Document root element for FO output </xsl:text>
+ <xsl:text>must be one of the following elements:</xsl:text>
+ <xsl:value-of select="$root.elements"/>
+ </xsl:message>
+ </xsl:when>
+ <!-- Otherwise proceed -->
+ <xsl:otherwise>
+ <xsl:if test="$collect.xref.targets = 'yes' or $collect.xref.targets = 'only'">
+ <xsl:apply-templates select="$profiled-nodes" mode="collect.targets"/>
+ </xsl:if>
+ <xsl:if test="$collect.xref.targets != 'only'">
+ <xsl:apply-templates select="$profiled-nodes" mode="process.root"/>
+ </xsl:if>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="*" mode="process.root">
+ <xsl:variable name="document.element" select="self::*"/>
+
+ <xsl:call-template name="root.messages"/>
+
+ <xsl:variable name="title">
+ <xsl:choose>
+ <xsl:when test="$document.element/title[1]">
+ <xsl:value-of select="$document.element/title[1]"/>
+ </xsl:when>
+ <xsl:otherwise>[could not find document title]</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <!-- Include all id values in XEP output -->
+ <xsl:if test="$xep.extensions != 0">
+ <xsl:processing-instruction name="xep-pdf-drop-unused-destinations">false</xsl:processing-instruction>
+ </xsl:if>
+
+ <fo:root xsl:use-attribute-sets="root.properties">
+ <xsl:attribute name="language">
+ <xsl:call-template name="l10n.language">
+ <xsl:with-param name="target" select="/*[1]"/>
+ </xsl:call-template>
+ </xsl:attribute>
+
+ <xsl:if test="$xep.extensions != 0">
+ <xsl:call-template name="xep-pis"/>
+ <xsl:call-template name="xep-document-information"/>
+ </xsl:if>
+ <xsl:if test="$axf.extensions != 0">
+ <xsl:call-template name="axf-document-information"/>
+ </xsl:if>
+
+ <xsl:call-template name="setup.pagemasters"/>
+
+ <xsl:if test="$fop.extensions != 0">
+ <xsl:apply-templates select="$document.element" mode="fop.outline"/>
+ </xsl:if>
+
+ <xsl:if test="$fop1.extensions != 0">
+ <xsl:call-template name="fop1-document-information"/>
+ <xsl:variable name="bookmarks">
+ <xsl:apply-templates select="$document.element" mode="fop1.outline"/>
+ </xsl:variable>
+ <xsl:if test="string($bookmarks) != ''">
+ <fo:bookmark-tree>
+ <xsl:copy-of select="$bookmarks"/>
+ </fo:bookmark-tree>
+ </xsl:if>
+ <xsl:apply-templates select="$document.element" mode="fop1.foxdest"/>
+ </xsl:if>
+
+ <xsl:if test="$xep.extensions != 0">
+ <xsl:variable name="bookmarks">
+ <xsl:apply-templates select="$document.element" mode="xep.outline"/>
+ </xsl:variable>
+ <xsl:if test="string($bookmarks) != ''">
+ <rx:outline xmlns:rx="http://www.renderx.com/XSL/Extensions">
+ <xsl:copy-of select="$bookmarks"/>
+ </rx:outline>
+ </xsl:if>
+ </xsl:if>
+
+ <xsl:if test="$arbortext.extensions != 0 and $ati.xsl11.bookmarks != 0">
+ <xsl:variable name="bookmarks">
+ <xsl:apply-templates select="$document.element" mode="ati.xsl11.bookmarks"/>
+ </xsl:variable>
+ <xsl:if test="string($bookmarks) != ''">
+ <fo:bookmark-tree>
+ <xsl:copy-of select="$bookmarks"/>
+ </fo:bookmark-tree>
+ </xsl:if>
+ </xsl:if>
+
+ <xsl:apply-templates select="$document.element"/>
+ </fo:root>
+</xsl:template>
+
+<xsl:template name="root.messages">
+ <!-- redefine this any way you'd like to output messages -->
+ <!-- DO NOT OUTPUT ANYTHING FROM THIS TEMPLATE -->
+ <xsl:message>
+ <xsl:text>Making </xsl:text>
+ <xsl:value-of select="$page.orientation"/>
+ <xsl:text> pages on </xsl:text>
+ <xsl:value-of select="$paper.type"/>
+ <xsl:text> paper (</xsl:text>
+ <xsl:value-of select="$page.width"/>
+ <xsl:text>x</xsl:text>
+ <xsl:value-of select="$page.height"/>
+ <xsl:text>)</xsl:text>
+ </xsl:message>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/ptc.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/ptc.xsl
new file mode 100644
index 0000000..a8874d8
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/ptc.xsl
@@ -0,0 +1,77 @@
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:fo="http://www.w3.org/1999/XSL/Format"
+ version="1.0">
+
+<!-- ================================================================ -->
+<!-- -->
+<!-- PTC/Arbortext Code for XSL 1.1 bookmark support -->
+<!-- -->
+<!-- ================================================================ -->
+
+<xsl:param name="ati.xsl11.bookmarks" select="1"/>
+
+<xsl:variable name="ati-a-dia" select=
+"'&#257;&#259;&#261;&#263;&#265;&#267;&#269;&#271;&#273;&#275;&#277;&#279;&#281;&#283;&#339;&#285;&#287;&#289;&#291;&#293;&#295;&#297;&#299;&#301;&#303;&#305;&#309;&#311;&#314;&#316;&#318;&#320;&#322;&#324;&#326;&#328;&#331;&#333;&#335;&#337;&#341;&#343;&#345;&#347;&#349;&#351;&#353;&#355;&#357;&#359;&#361;&#363;&#365;&#367;&#369;&#371;&#373;&#375;&#378;&#380;&#382;&#256;&#258;&#260;&#262;&#264;&#266;&#268;&#270;&#272;&#274;&#276;&#278;&#280;&#282;&#338;&#284;&#286;&#288;&#290;&#292;&#294;&#296;&#298;&#300;&#302;&#304;&#308;&#310;&#313;&#315;&#317;&#319;&#321;&#323;&#325;&#327;&#330;&#332;&#334;&#336;&#340;&#342;&#344;&#346;&#348;&#350;&#352;&#354;&#356;&#358;&#360;&#362;&#364;&#366;&#368;&#370;&#372;&#374;&#376;&#377;&#379;&#381;'"/>
+
+<xsl:variable name="ati-a-asc" select=
+"'aaaccccddeeeeeegggghhiiiiijklllllnnnnooorrrsssstttuuuuuuwyzzzAAACCCCDDEEEEEEGGGGHHIIIIIJKLLLLLNNNNOOORRRSSSSTTTUUUUUUWYYZZZ'"/>
+
+<xsl:template match="*" mode="ati.xsl11.bookmarks">
+ <xsl:apply-templates select="*" mode="ati.xsl11.bookmarks"/>
+</xsl:template>
+
+<xsl:template match="set|book|part|reference|preface|chapter|appendix|article
+ |glossary|bibliography|index|setindex
+ |refentry
+ |sect1|sect2|sect3|sect4|sect5|section"
+ mode="ati.xsl11.bookmarks">
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+ <xsl:variable name="bookmark-label">
+ <xsl:apply-templates select="." mode="object.title.markup"/>
+ </xsl:variable>
+
+ <!-- Put the root element bookmark at the same level as its children -->
+ <!-- If the object is a set or book, generate a bookmark for the toc -->
+
+ <xsl:choose>
+ <xsl:when test="self::index and $generate.index = 0"/>
+ <xsl:when test="parent::*">
+ <fo:bookmark internal-destination="{$id}">
+ <fo:bookmark-title>
+ <xsl:value-of select="translate($bookmark-label, $ati-a-dia, $ati-a-asc)"/>
+ </fo:bookmark-title>
+ <xsl:apply-templates select="*" mode="ati.xsl11.bookmarks"/>
+ </fo:bookmark>
+ </xsl:when>
+ <xsl:otherwise>
+ <fo:bookmark internal-destination="{$id}">
+ <fo:bookmark-title>
+ <xsl:value-of select="translate($bookmark-label, $ati-a-dia, $ati-a-asc)"/>
+ </fo:bookmark-title>
+ </fo:bookmark>
+
+ <xsl:variable name="toc.params">
+ <xsl:call-template name="find.path.params">
+ <xsl:with-param name="table" select="normalize-space($generate.toc)"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:if test="contains($toc.params, 'toc')
+ and section|sect1|refentry
+ |article|bibliography|glossary
+ |appendix">
+ <fo:bookmark internal-destination="toc...{$id}">
+ <fo:bookmark-title>
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'TableofContents'"/>
+ </xsl:call-template>
+ </fo:bookmark-title>
+ </fo:bookmark>
+ </xsl:if>
+ <xsl:apply-templates select="*" mode="ati.xsl11.bookmarks"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/qandaset.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/qandaset.xsl
new file mode 100644
index 0000000..cbf118a
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/qandaset.xsl
@@ -0,0 +1,395 @@
+<?xml version='1.0'?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:fo="http://www.w3.org/1999/XSL/Format"
+ version='1.0'>
+
+<!-- ********************************************************************
+ $Id: qandaset.xsl 8350 2009-03-17 07:24:29Z bobstayton $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<!-- ==================================================================== -->
+
+<xsl:template match="qandaset" name="process.qandaset">
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+
+ <xsl:variable name="label-length">
+ <xsl:call-template name="qandaset.label.length"/>
+ </xsl:variable>
+
+ <xsl:variable name="toc">
+ <xsl:call-template name="pi.dbfo_toc"/>
+ </xsl:variable>
+
+ <xsl:variable name="toc.params">
+ <xsl:call-template name="find.path.params">
+ <xsl:with-param name="table" select="normalize-space($generate.toc)"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="content">
+ <fo:block id="{$id}">
+ <xsl:choose>
+ <xsl:when test="parent::*">
+ <xsl:if test="blockinfo/title|info/title|title">
+ <xsl:apply-templates select="(blockinfo/title|
+ info/title|title)[1]"/>
+ </xsl:if>
+ </xsl:when>
+ <!-- If it is the root element -->
+ <xsl:otherwise>
+ <xsl:call-template name="qandaset.titlepage"/>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:if test="(contains($toc.params, 'toc') and $toc != '0')
+ or $toc = '1'">
+ <xsl:call-template name="qandaset.toc">
+ <xsl:with-param name="toc.title.p"
+ select="contains($toc.params, 'title')"/>
+ </xsl:call-template>
+ </xsl:if>
+
+ <xsl:call-template name="qandaset.toc.separator"/>
+
+ <xsl:apply-templates select="*[local-name(.) != 'title'
+ and local-name(.) != 'titleabbrev'
+ and local-name(.) != 'qandadiv'
+ and local-name(.) != 'qandaentry']"/>
+ <xsl:apply-templates select="qandadiv"/>
+
+ <xsl:if test="qandaentry">
+ <fo:list-block xsl:use-attribute-sets="list.block.spacing"
+ provisional-label-separation="0.2em">
+ <xsl:attribute name="provisional-distance-between-starts">
+ <xsl:choose>
+ <xsl:when test="$label-length != ''">
+ <xsl:value-of select="$label-length"/>
+ </xsl:when>
+ <xsl:otherwise>2.5em</xsl:otherwise>
+ </xsl:choose>
+ </xsl:attribute>
+ <xsl:apply-templates select="qandaentry"/>
+ </fo:list-block>
+ </xsl:if>
+ </fo:block>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="parent::*">
+ <xsl:copy-of select="$content"/>
+ </xsl:when>
+ <!-- Otherwise create a page sequence -->
+ <xsl:otherwise>
+ <xsl:apply-templates select="." mode="page.sequence">
+ <xsl:with-param name="content" select="$content"/>
+ <xsl:with-param name="master-reference" select="'body'"/>
+ </xsl:apply-templates>
+ </xsl:otherwise>
+ </xsl:choose>
+
+</xsl:template>
+
+<xsl:template name="qandaset.label.length">
+ <xsl:param name="deflabel">
+ <xsl:apply-templates select="." mode="qanda.defaultlabel"/>
+ </xsl:param>
+
+ <xsl:variable name="label-width">
+ <xsl:call-template name="pi.dbfo_label-width"/>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="$label-width != ''">
+ <xsl:value-of select="$label-width"/>
+ </xsl:when>
+ <xsl:when test="descendant::label">
+ <xsl:call-template name="longest.term">
+ <xsl:with-param name="terms" select="descendant::label"/>
+ <xsl:with-param name="maxlength" select="20"/>
+ </xsl:call-template>
+ <xsl:text>em * 0.50</xsl:text>
+ </xsl:when>
+ <xsl:when test="contains($deflabel, 'qnumber') and
+ $qandadiv.autolabel != 0 and
+ $qanda.inherit.numeration != 0">
+ <xsl:text>5em</xsl:text>
+ </xsl:when>
+ <xsl:when test="$deflabel ='qnumber' and
+ $qandadiv.autolabel != 0 and
+ $qanda.inherit.numeration != 0">
+ <xsl:text>4em</xsl:text>
+ </xsl:when>
+ <xsl:when test="$deflabel = 'number'">
+ <xsl:text>3em</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>2.5em</xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="qandaset/blockinfo/title|qandset/info/title|qandaset/title">
+ <xsl:variable name="enclsect" select="(ancestor::section
+ | ancestor::simplesect
+ | ancestor::sect5
+ | ancestor::sect4
+ | ancestor::sect3
+ | ancestor::sect2
+ | ancestor::sect1
+ | ancestor::refsect3
+ | ancestor::refsect2
+ | ancestor::refsect1)[last()]"/>
+ <xsl:variable name="sectlvl">
+ <xsl:call-template name="section.level">
+ <xsl:with-param name="node" select="$enclsect"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:call-template name="qanda.heading">
+ <xsl:with-param name="level" select="$sectlvl + 1"/>
+ <xsl:with-param name="marker" select="0"/>
+ <xsl:with-param name="title">
+ <xsl:apply-templates/>
+ </xsl:with-param>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="qandaset/blockinfo|qandaset/info">
+ <!-- what should this template really do? -->
+ <xsl:apply-templates select="legalnotice" mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="qandadiv">
+ <xsl:variable name="id"><xsl:call-template name="object.id"/></xsl:variable>
+
+
+ <xsl:variable name="label-length">
+ <xsl:call-template name="qandaset.label.length"/>
+ </xsl:variable>
+
+ <fo:block id="{$id}">
+ <xsl:apply-templates select="(blockinfo/title|info/title|title)[1]"/>
+ <xsl:apply-templates select="*[local-name(.) != 'title'
+ and local-name(.) != 'titleabbrev'
+ and local-name(.) != 'qandadiv'
+ and local-name(.) != 'qandaentry']"/>
+ <fo:block>
+ <xsl:apply-templates select="qandadiv"/>
+
+ <xsl:if test="qandaentry">
+ <fo:list-block xsl:use-attribute-sets="list.block.spacing"
+ provisional-label-separation="0.2em">
+ <xsl:attribute name="provisional-distance-between-starts">
+ <xsl:choose>
+ <xsl:when test="$label-length != ''">
+ <xsl:value-of select="$label-length"/>
+ </xsl:when>
+ <xsl:otherwise>2.5em</xsl:otherwise>
+ </xsl:choose>
+ </xsl:attribute>
+ <xsl:apply-templates select="qandaentry"/>
+ </fo:list-block>
+ </xsl:if>
+ </fo:block>
+ </fo:block>
+</xsl:template>
+
+<xsl:template match="qandadiv/blockinfo/title|qandadiv/info/title|qandadiv/title">
+ <xsl:variable name="enclsect" select="(ancestor::section
+ | ancestor::simplesect
+ | ancestor::sect5
+ | ancestor::sect4
+ | ancestor::sect3
+ | ancestor::sect2
+ | ancestor::sect1
+ | ancestor::refsect3
+ | ancestor::refsect2
+ | ancestor::refsect1)[last()]"/>
+ <xsl:variable name="sectlvl">
+ <xsl:call-template name="section.level">
+ <xsl:with-param name="node" select="$enclsect"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:call-template name="qanda.heading">
+ <xsl:with-param name="level" select="$sectlvl + 1 + count(ancestor::qandadiv)"/>
+ <xsl:with-param name="marker" select="0"/>
+ <xsl:with-param name="title">
+ <xsl:apply-templates select="parent::qandadiv" mode="label.markup"/>
+ <xsl:if test="$qandadiv.autolabel != 0">
+ <xsl:apply-templates select="." mode="intralabel.punctuation"/>
+ <xsl:text> </xsl:text>
+ </xsl:if>
+ <xsl:apply-templates/>
+ </xsl:with-param>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="qandaentry">
+ <!-- Omit revhistory from fo:list-block because it is a table -->
+ <xsl:apply-templates select="question|answer"/>
+</xsl:template>
+
+<xsl:template match="question">
+ <xsl:variable name="id"><xsl:call-template name="object.id"/></xsl:variable>
+
+ <xsl:variable name="entry.id">
+ <xsl:call-template name="object.id">
+ <xsl:with-param name="object" select="parent::*"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="deflabel">
+ <xsl:apply-templates select="." mode="qanda.defaultlabel"/>
+ </xsl:variable>
+
+
+ <xsl:variable name="label.content">
+ <xsl:apply-templates select="." mode="label.markup"/>
+ <xsl:if test="contains($deflabel, 'number') and not(label)">
+ <xsl:apply-templates select="." mode="intralabel.punctuation"/>
+ </xsl:if>
+ </xsl:variable>
+
+ <fo:list-item id="{$entry.id}" xsl:use-attribute-sets="list.item.spacing">
+ <fo:list-item-label id="{$id}" end-indent="label-end()">
+ <xsl:if test="string-length($label.content) &gt; 0">
+ <fo:block font-weight="bold">
+ <xsl:copy-of select="$label.content"/>
+ </fo:block>
+ </xsl:if>
+ </fo:list-item-label>
+ <fo:list-item-body start-indent="body-start()">
+ <xsl:choose>
+ <xsl:when test="$deflabel = 'none' and not(label)">
+ <fo:block font-weight="bold">
+ <xsl:apply-templates select="*[local-name(.)!='label']"/>
+ </fo:block>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="*[local-name(.)!='label']"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ <!-- Uncomment this line to get revhistory output in the question -->
+ <!-- <xsl:apply-templates select="preceding-sibling::revhistory"/> -->
+ </fo:list-item-body>
+ </fo:list-item>
+</xsl:template>
+
+<xsl:template match="answer">
+ <xsl:variable name="id"><xsl:call-template name="object.id"/></xsl:variable>
+ <xsl:variable name="entry.id">
+ <xsl:call-template name="object.id">
+ <xsl:with-param name="object" select="parent::*"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="deflabel">
+ <xsl:apply-templates select="." mode="qanda.defaultlabel"/>
+ </xsl:variable>
+
+ <xsl:variable name="answer.label">
+ <xsl:apply-templates select="." mode="label.markup"/>
+ </xsl:variable>
+
+ <fo:list-item xsl:use-attribute-sets="list.item.spacing">
+ <fo:list-item-label id="{$id}" end-indent="label-end()">
+ <xsl:choose>
+ <xsl:when test="string-length($answer.label) &gt; 0">
+ <fo:block font-weight="bold">
+ <xsl:copy-of select="$answer.label"/>
+ </fo:block>
+ </xsl:when>
+ <xsl:otherwise>
+ <fo:block/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </fo:list-item-label>
+ <fo:list-item-body start-indent="body-start()">
+ <xsl:apply-templates select="*[local-name(.)!='label' and local-name(.) != 'qandaentry']"/>
+ <!-- * handle nested answer/qandaentry instances -->
+ <!-- * (bug 1509043 from Daniel Leidert) -->
+ <xsl:if test="descendant::question">
+ <xsl:call-template name="process.qandaset"/>
+ </xsl:if>
+ </fo:list-item-body>
+ </fo:list-item>
+</xsl:template>
+
+<xsl:template match="*" mode="qanda.defaultlabel">
+ <xsl:choose>
+ <xsl:when test="ancestor-or-self::*[@defaultlabel]">
+ <xsl:value-of select="(ancestor-or-self::*[@defaultlabel])[last()]
+ /@defaultlabel"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$qanda.defaultlabel"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="label">
+ <xsl:apply-templates/>
+</xsl:template>
+
+<xsl:template name="qanda.heading">
+ <xsl:param name="level" select="1"/>
+ <xsl:param name="marker" select="0"/>
+ <xsl:param name="title"/>
+ <xsl:param name="titleabbrev"/>
+
+ <fo:block xsl:use-attribute-sets="qanda.title.properties">
+ <xsl:if test="$marker != 0">
+ <fo:marker marker-class-name="section.head.marker">
+ <xsl:choose>
+ <xsl:when test="$titleabbrev = ''">
+ <xsl:value-of select="$title"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$titleabbrev"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </fo:marker>
+ </xsl:if>
+ <xsl:choose>
+ <xsl:when test="$level=1">
+ <fo:block xsl:use-attribute-sets="qanda.title.level1.properties">
+ <xsl:copy-of select="$title"/>
+ </fo:block>
+ </xsl:when>
+ <xsl:when test="$level=2">
+ <fo:block xsl:use-attribute-sets="qanda.title.level2.properties">
+ <xsl:copy-of select="$title"/>
+ </fo:block>
+ </xsl:when>
+ <xsl:when test="$level=3">
+ <fo:block xsl:use-attribute-sets="qanda.title.level3.properties">
+ <xsl:copy-of select="$title"/>
+ </fo:block>
+ </xsl:when>
+ <xsl:when test="$level=4">
+ <fo:block xsl:use-attribute-sets="qanda.title.level4.properties">
+ <xsl:copy-of select="$title"/>
+ </fo:block>
+ </xsl:when>
+ <xsl:when test="$level=5">
+ <fo:block xsl:use-attribute-sets="qanda.title.level5.properties">
+ <xsl:copy-of select="$title"/>
+ </fo:block>
+ </xsl:when>
+ <xsl:otherwise>
+ <fo:block xsl:use-attribute-sets="qanda.title.level6.properties">
+ <xsl:copy-of select="$title"/>
+ </fo:block>
+ </xsl:otherwise>
+ </xsl:choose>
+ </fo:block>
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/refentry.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/refentry.xsl
new file mode 100644
index 0000000..1a35693
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/refentry.xsl
@@ -0,0 +1,638 @@
+<?xml version='1.0'?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:fo="http://www.w3.org/1999/XSL/Format"
+ xmlns:axf="http://www.antennahouse.com/names/XSL/Extensions"
+ version='1.0'>
+
+<!-- ********************************************************************
+ $Id: refentry.xsl 8598 2010-03-20 09:59:03Z mzjn $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<!-- ==================================================================== -->
+
+<xsl:template match="reference">
+ <xsl:if test="not(partintro)">
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+ <xsl:variable name="master-reference">
+ <xsl:call-template name="select.pagemaster"/>
+ </xsl:variable>
+
+ <fo:page-sequence hyphenate="{$hyphenate}"
+ master-reference="{$master-reference}">
+ <xsl:attribute name="language">
+ <xsl:call-template name="l10n.language"/>
+ </xsl:attribute>
+ <xsl:attribute name="format">
+ <xsl:call-template name="page.number.format">
+ <xsl:with-param name="master-reference" select="$master-reference"/>
+ </xsl:call-template>
+ </xsl:attribute>
+
+ <xsl:attribute name="initial-page-number">
+ <xsl:call-template name="initial.page.number">
+ <xsl:with-param name="master-reference" select="$master-reference"/>
+ </xsl:call-template>
+ </xsl:attribute>
+
+ <xsl:attribute name="force-page-count">
+ <xsl:call-template name="force.page.count">
+ <xsl:with-param name="master-reference" select="$master-reference"/>
+ </xsl:call-template>
+ </xsl:attribute>
+
+ <xsl:attribute name="hyphenation-character">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'hyphenation-character'"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:attribute name="hyphenation-push-character-count">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'hyphenation-push-character-count'"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:attribute name="hyphenation-remain-character-count">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'hyphenation-remain-character-count'"/>
+ </xsl:call-template>
+ </xsl:attribute>
+
+ <xsl:apply-templates select="." mode="running.head.mode">
+ <xsl:with-param name="master-reference" select="$master-reference"/>
+ </xsl:apply-templates>
+ <xsl:apply-templates select="." mode="running.foot.mode">
+ <xsl:with-param name="master-reference" select="$master-reference"/>
+ </xsl:apply-templates>
+
+ <fo:flow flow-name="xsl-region-body">
+ <xsl:call-template name="set.flow.properties">
+ <xsl:with-param name="element" select="local-name(.)"/>
+ <xsl:with-param name="master-reference" select="$master-reference"/>
+ </xsl:call-template>
+
+ <fo:block id="{$id}">
+ <xsl:call-template name="reference.titlepage"/>
+ </fo:block>
+ <!-- Create one page sequence if no pagebreaks needed -->
+ <xsl:if test="$refentry.pagebreak = 0">
+ <xsl:apply-templates select="refentry"/>
+ </xsl:if>
+ </fo:flow>
+ </fo:page-sequence>
+ </xsl:if>
+ <xsl:apply-templates select="partintro"/>
+ <xsl:if test="$refentry.pagebreak != 0">
+ <xsl:apply-templates select="refentry"/>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="reference" mode="reference.titlepage.mode">
+ <xsl:call-template name="reference.titlepage"/>
+</xsl:template>
+
+<xsl:template match="reference/partintro">
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id">
+ <xsl:with-param name="object" select="ancestor::reference"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:variable name="master-reference">
+ <xsl:call-template name="select.pagemaster"/>
+ </xsl:variable>
+
+ <fo:page-sequence hyphenate="{$hyphenate}"
+ master-reference="{$master-reference}">
+ <xsl:attribute name="language">
+ <xsl:call-template name="l10n.language"/>
+ </xsl:attribute>
+ <xsl:attribute name="format">
+ <xsl:call-template name="page.number.format">
+ <xsl:with-param name="master-reference" select="$master-reference"/>
+ </xsl:call-template>
+ </xsl:attribute>
+
+ <xsl:attribute name="initial-page-number">
+ <xsl:call-template name="initial.page.number">
+ <xsl:with-param name="master-reference" select="$master-reference"/>
+ </xsl:call-template>
+ </xsl:attribute>
+
+ <xsl:attribute name="force-page-count">
+ <xsl:call-template name="force.page.count">
+ <xsl:with-param name="master-reference" select="$master-reference"/>
+ </xsl:call-template>
+ </xsl:attribute>
+
+ <xsl:attribute name="hyphenation-character">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'hyphenation-character'"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:attribute name="hyphenation-push-character-count">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'hyphenation-push-character-count'"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:attribute name="hyphenation-remain-character-count">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'hyphenation-remain-character-count'"/>
+ </xsl:call-template>
+ </xsl:attribute>
+
+ <xsl:apply-templates select="." mode="running.head.mode">
+ <xsl:with-param name="master-reference" select="$master-reference"/>
+ </xsl:apply-templates>
+ <xsl:apply-templates select="." mode="running.foot.mode">
+ <xsl:with-param name="master-reference" select="$master-reference"/>
+ </xsl:apply-templates>
+
+ <fo:flow flow-name="xsl-region-body">
+ <xsl:call-template name="set.flow.properties">
+ <xsl:with-param name="element" select="local-name(.)"/>
+ <xsl:with-param name="master-reference" select="$master-reference"/>
+ </xsl:call-template>
+ <fo:block id="{$id}">
+ <xsl:apply-templates select=".." mode="reference.titlepage.mode"/>
+ </fo:block>
+ <xsl:if test="title">
+ <xsl:call-template name="partintro.titlepage"/>
+ </xsl:if>
+ <xsl:apply-templates/>
+ <!-- Create one page sequence if no pagebreaks needed -->
+ <xsl:if test="$refentry.pagebreak = 0">
+ <xsl:apply-templates select="../refentry"/>
+ </xsl:if>
+ </fo:flow>
+ </fo:page-sequence>
+</xsl:template>
+
+<xsl:template match="reference/docinfo|refentry/refentryinfo"></xsl:template>
+<xsl:template match="reference/info"></xsl:template>
+<xsl:template match="reference/title"></xsl:template>
+<xsl:template match="reference/subtitle"></xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="refentry">
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+
+ <xsl:variable name="master-reference">
+ <xsl:call-template name="select.pagemaster"/>
+ </xsl:variable>
+
+ <xsl:variable name="refentry.content">
+ <fo:block id="{$id}">
+ <xsl:apply-templates/>
+ </fo:block>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="not(parent::*) or
+ (parent::reference and $refentry.pagebreak != 0) or
+ parent::part">
+ <!-- make a page sequence -->
+ <fo:page-sequence hyphenate="{$hyphenate}"
+ master-reference="{$master-reference}">
+ <xsl:attribute name="language">
+ <xsl:call-template name="l10n.language"/>
+ </xsl:attribute>
+ <xsl:attribute name="format">
+ <xsl:call-template name="page.number.format">
+ <xsl:with-param name="master-reference" select="$master-reference"/>
+ </xsl:call-template>
+ </xsl:attribute>
+
+ <xsl:attribute name="initial-page-number">
+ <xsl:call-template name="initial.page.number">
+ <xsl:with-param name="master-reference" select="$master-reference"/>
+ </xsl:call-template>
+ </xsl:attribute>
+
+ <xsl:attribute name="force-page-count">
+ <xsl:call-template name="force.page.count">
+ <xsl:with-param name="master-reference" select="$master-reference"/>
+ </xsl:call-template>
+ </xsl:attribute>
+
+ <xsl:attribute name="hyphenation-character">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'hyphenation-character'"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:attribute name="hyphenation-push-character-count">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'hyphenation-push-character-count'"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:attribute name="hyphenation-remain-character-count">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'hyphenation-remain-character-count'"/>
+ </xsl:call-template>
+ </xsl:attribute>
+
+ <xsl:apply-templates select="." mode="running.head.mode">
+ <xsl:with-param name="master-reference" select="$master-reference"/>
+ </xsl:apply-templates>
+ <xsl:apply-templates select="." mode="running.foot.mode">
+ <xsl:with-param name="master-reference" select="$master-reference"/>
+ </xsl:apply-templates>
+
+ <fo:flow flow-name="xsl-region-body">
+ <xsl:call-template name="set.flow.properties">
+ <xsl:with-param name="element" select="local-name(.)"/>
+ <xsl:with-param name="master-reference" select="$master-reference"/>
+ </xsl:call-template>
+
+ <xsl:copy-of select="$refentry.content"/>
+ </fo:flow>
+ </fo:page-sequence>
+ </xsl:when>
+ <xsl:otherwise>
+ <fo:block>
+ <xsl:if test="$refentry.pagebreak != 0">
+ <xsl:attribute name="break-before">page</xsl:attribute>
+ </xsl:if>
+ <xsl:copy-of select="$refentry.content"/>
+ </fo:block>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="refmeta">
+ <xsl:apply-templates select=".//indexterm"/>
+</xsl:template>
+
+<xsl:template match="manvolnum">
+ <xsl:if test="$refentry.xref.manvolnum != 0">
+ <xsl:text>(</xsl:text>
+ <xsl:apply-templates/>
+ <xsl:text>)</xsl:text>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="refmiscinfo">
+</xsl:template>
+
+<xsl:template match="refentrytitle">
+ <xsl:call-template name="inline.charseq"/>
+</xsl:template>
+
+<xsl:template match="refnamediv">
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+
+ <fo:block id="{$id}">
+
+ <!-- if refentry.generate.name is non-zero, then we need to generate a -->
+ <!-- localized "Name" subheading for this refnamdiv (unless it has a -->
+ <!-- preceding sibling that is a refnamediv, in which case we have already -->
+ <!-- generated a "Name" subheading, so we don't need to do it again -->
+ <xsl:if test="$refentry.generate.name != 0">
+ <xsl:choose>
+ <xsl:when test="preceding-sibling::refnamediv">
+ <!-- no generated title on secondary refnamedivs! -->
+ </xsl:when>
+ <xsl:otherwise>
+ <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format"
+ xsl:use-attribute-sets="refnamediv.titlepage.recto.style"
+ font-family="{$title.fontset}">
+ <!-- Contents of what is now the format.refentry.subheading -->
+ <!-- template were formerly intended to be used only to -->
+ <!-- process those subsections of Refentry that have "real" -->
+ <!-- title children. So as a kludge to get around the fact -->
+ <!-- that the template still basically "expects" to be -->
+ <!-- processing that kind of a node, when we call the -->
+ <!-- template to process generated titles, we must call it -->
+ <!-- with values for the "offset" and "section" parameters -->
+ <!-- that are different from the default values in the -->
+ <!-- format.refentry.subheading template itself. Because -->
+ <!-- those defaults are the values appropriate for processing -->
+ <!-- "real" title nodes. -->
+ <xsl:call-template name="format.refentry.subheading">
+ <xsl:with-param name="section" select="self::*"/>
+ <xsl:with-param name="offset" select="1"/>
+ <xsl:with-param name="gentext.key" select="'RefName'"/>
+ </xsl:call-template>
+ </fo:block>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:if>
+
+ <xsl:if test="$refentry.generate.title != 0">
+ <xsl:variable name="section.level">
+ <xsl:call-template name="refentry.level">
+ <xsl:with-param name="node" select="ancestor::refentry"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="reftitle">
+ <xsl:choose>
+ <xsl:when test="../refmeta/refentrytitle">
+ <xsl:apply-templates select="../refmeta/refentrytitle"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="refname[1]"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <!-- xsl:use-attribute-sets takes only a Qname, not a variable -->
+ <xsl:choose>
+ <xsl:when test="preceding-sibling::refnamediv">
+ <!-- no title on secondary refnamedivs! -->
+ </xsl:when>
+ <xsl:when test="$section.level = 1">
+ <fo:block xsl:use-attribute-sets="refentry.title.properties">
+ <fo:block xsl:use-attribute-sets="section.title.level1.properties">
+ <xsl:value-of select="$reftitle"/>
+ </fo:block>
+ </fo:block>
+ </xsl:when>
+ <xsl:when test="$section.level = 2">
+ <fo:block xsl:use-attribute-sets="refentry.title.properties">
+ <fo:block xsl:use-attribute-sets="section.title.level2.properties">
+ <xsl:value-of select="$reftitle"/>
+ </fo:block>
+ </fo:block>
+ </xsl:when>
+ <xsl:when test="$section.level = 3">
+ <fo:block xsl:use-attribute-sets="refentry.title.properties">
+ <fo:block xsl:use-attribute-sets="section.title.level3.properties">
+ <xsl:value-of select="$reftitle"/>
+ </fo:block>
+ </fo:block>
+ </xsl:when>
+ <xsl:when test="$section.level = 4">
+ <fo:block xsl:use-attribute-sets="refentry.title.properties">
+ <fo:block xsl:use-attribute-sets="section.title.level4.properties">
+ <xsl:value-of select="$reftitle"/>
+ </fo:block>
+ </fo:block>
+ </xsl:when>
+ <xsl:when test="$section.level = 5">
+ <fo:block xsl:use-attribute-sets="refentry.title.properties">
+ <fo:block xsl:use-attribute-sets="section.title.level5.properties">
+ <xsl:value-of select="$reftitle"/>
+ </fo:block>
+ </fo:block>
+ </xsl:when>
+ <xsl:otherwise>
+ <fo:block xsl:use-attribute-sets="refentry.title.properties">
+ <fo:block xsl:use-attribute-sets="section.title.level6.properties">
+ <xsl:value-of select="$reftitle"/>
+ </fo:block>
+ </fo:block>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:if>
+
+ <fo:block>
+ <xsl:if test="not(following-sibling::refnamediv)">
+ <xsl:attribute name="space-after">1em</xsl:attribute>
+ </xsl:if>
+ <xsl:apply-templates/>
+ </fo:block>
+ </fo:block>
+</xsl:template>
+
+<xsl:template match="refname">
+ <xsl:if test="not(preceding-sibling::refdescriptor)">
+ <xsl:apply-templates/>
+ <xsl:if test="following-sibling::refname">
+ <xsl:text>, </xsl:text>
+ </xsl:if>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="refpurpose">
+ <xsl:if test="node()">
+ <xsl:text> </xsl:text>
+ <xsl:call-template name="dingbat">
+ <xsl:with-param name="dingbat">em-dash</xsl:with-param>
+ </xsl:call-template>
+ <xsl:text> </xsl:text>
+ <xsl:apply-templates/>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="refdescriptor">
+ <xsl:apply-templates/>
+</xsl:template>
+
+<xsl:template match="refclass">
+ <xsl:if test="$refclass.suppress = 0">
+ <fo:block font-weight="bold">
+ <xsl:if test="@role">
+ <xsl:value-of select="@role"/>
+ <xsl:text>: </xsl:text>
+ </xsl:if>
+ <xsl:apply-templates/>
+ </fo:block>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="refsynopsisdiv">
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+
+ <fo:block id="{$id}">
+ <xsl:if test="not(refsynopsisdivinfo/title|docinfo/title|info/title|title)">
+ <!-- * if we there is no appropriate title for this Refsynopsisdiv, -->
+ <!-- * then we need to call format.refentry.subheading to generate one -->
+ <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format"
+ xsl:use-attribute-sets="refsynopsisdiv.titlepage.recto.style"
+ font-family="{$title.fontset}">
+ <!-- Contents of what is now the format.refentry.subheading -->
+ <!-- template were formerly intended to be used only to -->
+ <!-- process those subsections of Refentry that have "real" -->
+ <!-- title children. So as a kludge to get around the fact -->
+ <!-- that the template still basically "expects" to be -->
+ <!-- processing that kind of a node, when we call the -->
+ <!-- template to process generated titles, we must call it -->
+ <!-- with values for the "offset" and "section" parameters -->
+ <!-- that are different from the default values in the -->
+ <!-- format.refentry.subheading template itself. Because -->
+ <!-- those defaults are the values appropriate for processing -->
+ <!-- "real" title nodes. -->
+ <xsl:call-template name="format.refentry.subheading">
+ <xsl:with-param name="section" select="parent::*"/>
+ <xsl:with-param name="offset" select="1"/>
+ <xsl:with-param name="gentext.key" select="'RefSynopsisDiv'"/>
+ </xsl:call-template>
+ </fo:block>
+ </xsl:if>
+ <xsl:call-template name="refsynopsisdiv.titlepage"/>
+ <xsl:apply-templates/>
+ </fo:block>
+</xsl:template>
+
+<xsl:template match="refsection">
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+
+ <fo:block id="{$id}">
+ <xsl:call-template name="refsection.titlepage"/>
+ <xsl:apply-templates/>
+ </fo:block>
+</xsl:template>
+
+<xsl:template match="refsect1">
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+
+ <fo:block id="{$id}">
+ <xsl:call-template name="refsect1.titlepage"/>
+ <xsl:apply-templates/>
+ </fo:block>
+</xsl:template>
+
+<xsl:template match="refsect2">
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+
+ <fo:block id="{$id}">
+ <xsl:call-template name="refsect2.titlepage"/>
+ <xsl:apply-templates/>
+ </fo:block>
+</xsl:template>
+
+<xsl:template match="refsect3">
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+
+ <fo:block id="{$id}">
+ <xsl:call-template name="refsect3.titlepage"/>
+ <xsl:apply-templates/>
+ </fo:block>
+</xsl:template>
+
+<xsl:template match="refsynopsisdiv/title
+ |refsection/title
+ |refsect1/title
+ |refsect2/title
+ |refsect3/title">
+ <!-- nop; titlepage.mode instead -->
+</xsl:template>
+
+<xsl:template match="refsynopsisdiv/title
+ |refsection/title
+ |refsect1/title
+ |refsect2/title
+ |refsect3/title
+ |refsynopsisdiv/info/title
+ |refsection/info/title
+ |refsect1/info/title
+ |refsect2/info/title
+ |refsect3/info/title"
+ mode="titlepage.mode"
+ priority="2">
+ <xsl:call-template name="format.refentry.subheading"/>
+</xsl:template>
+
+<xsl:template name="format.refentry.subheading">
+<!-- This template is now called to process generated titles for -->
+<!-- Refnamediv and Refsynopsisdiv, as well as "real" titles for -->
+<!-- Refsynopsisdiv, Refsection, and Refsect[1-3]. -->
+<!-- -->
+<!-- But the contents of this template were formerly intended to be used -->
+<!-- only to process those subsections of Refentry that have "real" title -->
+<!-- children. So as a kludge to get around the fact that the template -->
+<!-- still basically "expects" to be processing that kind of a node, the -->
+<!-- "offset" parameter was added and the "section" variable was changed to -->
+<!-- a parameter so that when called for a generated title on a Refnamediv -->
+<!-- or Refsynopsisdiv, we can call it like this: -->
+<!-- -->
+<!-- <xsl:call-template name="format.refentry.subheading"> -->
+<!-- <xsl:with-param name="section" select="self::*"/> -->
+<!-- <xsl:with-param name="offset" select="1"/> -->
+<!-- <xsl:with-param name="gentext.key" select="'RefName'"/> -->
+<!-- </xsl:call-template> -->
+<!-- -->
+ <xsl:param name="section"
+ select="(ancestor::refsynopsisdiv
+ |ancestor::refsection
+ |ancestor::refsect1
+ |ancestor::refsect2
+ |ancestor::refsect3)[last()]"/>
+ <xsl:param name="offset" select="0"/>
+ <xsl:param name="gentext.key"/>
+
+ <fo:block keep-with-next.within-column="always">
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id">
+ <xsl:with-param name="object" select="$section"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="level">
+ <xsl:call-template name="section.level">
+ <xsl:with-param name="node" select="$section"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="title">
+ <!-- If we have a non-empty value for the $gentext.key param, then we -->
+ <!-- generate an appropriate title here. Otherwise, we have a real -->
+ <!-- title child, so we copy contents of that to the result tree. -->
+ <xsl:choose>
+ <xsl:when test="$gentext.key != ''">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="$gentext.key"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="$section" mode="object.title.markup">
+ <xsl:with-param name="allow-anchors" select="1"/>
+ </xsl:apply-templates>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:if test="$passivetex.extensions != 0">
+ <fotex:bookmark xmlns:fotex="http://www.tug.org/fotex"
+ fotex-bookmark-level="{$level + 2 + $offset}"
+ fotex-bookmark-label="{$id}">
+ <xsl:value-of select="$title"/>
+ </fotex:bookmark>
+ </xsl:if>
+
+ <xsl:if test="$axf.extensions != 0">
+ <xsl:attribute name="axf:outline-level">
+ <xsl:value-of select="count(ancestor::*)-1 + $offset"/>
+ </xsl:attribute>
+ <xsl:attribute name="axf:outline-expand">false</xsl:attribute>
+ <xsl:attribute name="axf:outline-title">
+ <xsl:value-of select="$title"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:call-template name="section.heading">
+ <xsl:with-param name="level" select="$level + $offset"/>
+ <xsl:with-param name="title" select="$title"/>
+ </xsl:call-template>
+ </fo:block>
+</xsl:template>
+
+<xsl:template match="refsectioninfo|refsection/info"></xsl:template>
+<xsl:template match="refsect1info|refsect1/info"></xsl:template>
+<xsl:template match="refsect2info|refsect2/info"></xsl:template>
+<xsl:template match="refsect3info|refsect3/info"></xsl:template>
+
+<!-- ==================================================================== -->
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/sections.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/sections.xsl
new file mode 100644
index 0000000..4569f2d
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/sections.xsl
@@ -0,0 +1,764 @@
+<?xml version='1.0'?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:fo="http://www.w3.org/1999/XSL/Format"
+ xmlns:axf="http://www.antennahouse.com/names/XSL/Extensions"
+ version='1.0'>
+
+<!-- ********************************************************************
+ $Id: sections.xsl 6910 2007-06-28 23:23:30Z xmldoc $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<!-- ==================================================================== -->
+
+<xsl:template match="section">
+ <xsl:choose>
+ <xsl:when test="$rootid = @id or $rootid = @xml:id">
+ <xsl:call-template name="section.page.sequence"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+
+ <xsl:variable name="renderas">
+ <xsl:choose>
+ <xsl:when test="@renderas = 'sect1'">1</xsl:when>
+ <xsl:when test="@renderas = 'sect2'">2</xsl:when>
+ <xsl:when test="@renderas = 'sect3'">3</xsl:when>
+ <xsl:when test="@renderas = 'sect4'">4</xsl:when>
+ <xsl:when test="@renderas = 'sect5'">5</xsl:when>
+ <xsl:otherwise><xsl:value-of select="''"/></xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="level">
+ <xsl:choose>
+ <xsl:when test="$renderas != ''">
+ <xsl:value-of select="$renderas"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="section.level"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <!-- xsl:use-attribute-sets takes only a Qname, not a variable -->
+ <xsl:choose>
+ <xsl:when test="$level = 1">
+ <xsl:element name="fo:{$section.container.element}"
+ use-attribute-sets="section.level1.properties">
+ <xsl:attribute name="id"><xsl:value-of
+ select="$id"/></xsl:attribute>
+ <xsl:call-template name="section.content"/>
+ </xsl:element>
+ </xsl:when>
+ <xsl:when test="$level = 2">
+ <xsl:element name="fo:{$section.container.element}"
+ use-attribute-sets="section.level2.properties">
+ <xsl:attribute name="id"><xsl:value-of
+ select="$id"/></xsl:attribute>
+ <xsl:call-template name="section.content"/>
+ </xsl:element>
+ </xsl:when>
+ <xsl:when test="$level = 3">
+ <xsl:element name="fo:{$section.container.element}"
+ use-attribute-sets="section.level3.properties">
+ <xsl:attribute name="id"><xsl:value-of
+ select="$id"/></xsl:attribute>
+ <xsl:call-template name="section.content"/>
+ </xsl:element>
+ </xsl:when>
+ <xsl:when test="$level = 4">
+ <xsl:element name="fo:{$section.container.element}"
+ use-attribute-sets="section.level4.properties">
+ <xsl:attribute name="id"><xsl:value-of
+ select="$id"/></xsl:attribute>
+ <xsl:call-template name="section.content"/>
+ </xsl:element>
+ </xsl:when>
+ <xsl:when test="$level = 5">
+ <xsl:element name="fo:{$section.container.element}"
+ use-attribute-sets="section.level5.properties">
+ <xsl:attribute name="id"><xsl:value-of
+ select="$id"/></xsl:attribute>
+ <xsl:call-template name="section.content"/>
+ </xsl:element>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:element name="fo:{$section.container.element}"
+ use-attribute-sets="section.level6.properties">
+ <xsl:attribute name="id"><xsl:value-of
+ select="$id"/></xsl:attribute>
+ <xsl:call-template name="section.content"/>
+ </xsl:element>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="section.content">
+ <xsl:call-template name="section.titlepage"/>
+
+ <xsl:variable name="toc.params">
+ <xsl:call-template name="find.path.params">
+ <xsl:with-param name="table" select="normalize-space($generate.toc)"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:if test="contains($toc.params, 'toc')
+ and (count(ancestor::section)+1) &lt;=
+ $generate.section.toc.level">
+ <xsl:call-template name="section.toc">
+ <xsl:with-param name="toc.title.p"
+ select="contains($toc.params, 'title')"/>
+ </xsl:call-template>
+ <xsl:call-template name="section.toc.separator"/>
+ </xsl:if>
+
+ <xsl:apply-templates/>
+</xsl:template>
+
+<xsl:template match="/section" name="section.page.sequence">
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+
+ <xsl:variable name="master-reference">
+ <xsl:call-template name="select.pagemaster"/>
+ </xsl:variable>
+
+ <fo:page-sequence hyphenate="{$hyphenate}"
+ master-reference="{$master-reference}">
+ <xsl:attribute name="language">
+ <xsl:call-template name="l10n.language"/>
+ </xsl:attribute>
+ <xsl:attribute name="format">
+ <xsl:call-template name="page.number.format">
+ <xsl:with-param name="master-reference" select="$master-reference"/>
+ </xsl:call-template>
+ </xsl:attribute>
+
+ <xsl:attribute name="initial-page-number">
+ <xsl:call-template name="initial.page.number">
+ <xsl:with-param name="master-reference" select="$master-reference"/>
+ </xsl:call-template>
+ </xsl:attribute>
+
+ <xsl:attribute name="force-page-count">
+ <xsl:call-template name="force.page.count">
+ <xsl:with-param name="master-reference" select="$master-reference"/>
+ </xsl:call-template>
+ </xsl:attribute>
+
+ <xsl:attribute name="hyphenation-character">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'hyphenation-character'"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:attribute name="hyphenation-push-character-count">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'hyphenation-push-character-count'"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:attribute name="hyphenation-remain-character-count">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'hyphenation-remain-character-count'"/>
+ </xsl:call-template>
+ </xsl:attribute>
+
+ <xsl:apply-templates select="." mode="running.head.mode">
+ <xsl:with-param name="master-reference" select="$master-reference"/>
+ </xsl:apply-templates>
+ <xsl:apply-templates select="." mode="running.foot.mode">
+ <xsl:with-param name="master-reference" select="$master-reference"/>
+ </xsl:apply-templates>
+
+ <fo:flow flow-name="xsl-region-body">
+ <xsl:call-template name="set.flow.properties">
+ <xsl:with-param name="element" select="local-name(.)"/>
+ <xsl:with-param name="master-reference" select="$master-reference"/>
+ </xsl:call-template>
+
+ <fo:block id="{$id}"
+ xsl:use-attribute-sets="section.level1.properties">
+ <xsl:call-template name="section.titlepage"/>
+ </fo:block>
+
+ <xsl:variable name="toc.params">
+ <xsl:call-template name="find.path.params">
+ <xsl:with-param name="table" select="normalize-space($generate.toc)"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:if test="contains($toc.params, 'toc')
+ and (count(ancestor::section)+1) &lt;=
+ $generate.section.toc.level">
+ <xsl:call-template name="section.toc">
+ <xsl:with-param name="toc.title.p"
+ select="contains($toc.params, 'title')"/>
+ </xsl:call-template>
+ <xsl:call-template name="section.toc.separator"/>
+ </xsl:if>
+
+ <xsl:apply-templates/>
+ </fo:flow>
+ </fo:page-sequence>
+</xsl:template>
+
+<xsl:template match="section/title
+ |simplesect/title
+ |sect1/title
+ |sect2/title
+ |sect3/title
+ |sect4/title
+ |sect5/title
+ |section/info/title
+ |simplesect/info/title
+ |sect1/info/title
+ |sect2/info/title
+ |sect3/info/title
+ |sect4/info/title
+ |sect5/info/title
+ |section/sectioninfo/title
+ |sect1/sect1info/title
+ |sect2/sect2info/title
+ |sect3/sect3info/title
+ |sect4/sect4info/title
+ |sect5/sect5info/title"
+ mode="titlepage.mode"
+ priority="2">
+
+ <xsl:variable name="section"
+ select="(ancestor::section |
+ ancestor::simplesect |
+ ancestor::sect1 |
+ ancestor::sect2 |
+ ancestor::sect3 |
+ ancestor::sect4 |
+ ancestor::sect5)[position() = last()]"/>
+
+ <fo:block keep-with-next.within-column="always">
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id">
+ <xsl:with-param name="object" select="$section"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="renderas">
+ <xsl:choose>
+ <xsl:when test="$section/@renderas = 'sect1'">1</xsl:when>
+ <xsl:when test="$section/@renderas = 'sect2'">2</xsl:when>
+ <xsl:when test="$section/@renderas = 'sect3'">3</xsl:when>
+ <xsl:when test="$section/@renderas = 'sect4'">4</xsl:when>
+ <xsl:when test="$section/@renderas = 'sect5'">5</xsl:when>
+ <xsl:otherwise><xsl:value-of select="''"/></xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="level">
+ <xsl:choose>
+ <xsl:when test="$renderas != ''">
+ <xsl:value-of select="$renderas"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="section.level">
+ <xsl:with-param name="node" select="$section"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="marker">
+ <xsl:choose>
+ <xsl:when test="$level &lt;= $marker.section.level">1</xsl:when>
+ <xsl:otherwise>0</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="title">
+ <xsl:apply-templates select="$section" mode="object.title.markup">
+ <xsl:with-param name="allow-anchors" select="1"/>
+ </xsl:apply-templates>
+ </xsl:variable>
+
+ <xsl:variable name="marker.title">
+ <xsl:apply-templates select="$section" mode="titleabbrev.markup">
+ <xsl:with-param name="allow-anchors" select="0"/>
+ </xsl:apply-templates>
+ </xsl:variable>
+
+ <xsl:if test="$passivetex.extensions != 0">
+ <fotex:bookmark xmlns:fotex="http://www.tug.org/fotex"
+ fotex-bookmark-level="{$level + 2}"
+ fotex-bookmark-label="{$id}">
+ <xsl:value-of select="$marker.title"/>
+ </fotex:bookmark>
+ </xsl:if>
+
+ <xsl:if test="$axf.extensions != 0">
+ <xsl:attribute name="axf:outline-level">
+ <xsl:value-of select="count(ancestor::*)-1"/>
+ </xsl:attribute>
+ <xsl:attribute name="axf:outline-expand">false</xsl:attribute>
+ <xsl:attribute name="axf:outline-title">
+ <xsl:value-of select="normalize-space($title)"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:call-template name="section.heading">
+ <xsl:with-param name="level" select="$level"/>
+ <xsl:with-param name="title" select="$title"/>
+ <xsl:with-param name="marker" select="$marker"/>
+ <xsl:with-param name="marker.title" select="$marker.title"/>
+ </xsl:call-template>
+ </fo:block>
+</xsl:template>
+
+<xsl:template match="sect1">
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+
+ <xsl:element name="fo:{$section.container.element}"
+ use-attribute-sets="section.level1.properties">
+ <xsl:attribute name="id"><xsl:value-of
+ select="$id"/></xsl:attribute>
+ <xsl:call-template name="sect1.titlepage"/>
+
+ <xsl:variable name="toc.params">
+ <xsl:call-template name="find.path.params">
+ <xsl:with-param name="table" select="normalize-space($generate.toc)"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:if test="contains($toc.params, 'toc')
+ and $generate.section.toc.level &gt;= 1">
+ <xsl:call-template name="section.toc">
+ <xsl:with-param name="toc.title.p"
+ select="contains($toc.params, 'title')"/>
+ </xsl:call-template>
+ <xsl:call-template name="section.toc.separator"/>
+ </xsl:if>
+
+ <xsl:apply-templates/>
+ </xsl:element>
+</xsl:template>
+
+<xsl:template match="/sect1">
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+ <xsl:variable name="master-reference">
+ <xsl:call-template name="select.pagemaster"/>
+ </xsl:variable>
+
+ <fo:page-sequence hyphenate="{$hyphenate}"
+ master-reference="{$master-reference}">
+ <xsl:attribute name="language">
+ <xsl:call-template name="l10n.language"/>
+ </xsl:attribute>
+ <xsl:attribute name="format">
+ <xsl:call-template name="page.number.format">
+ <xsl:with-param name="master-reference" select="$master-reference"/>
+ </xsl:call-template>
+ </xsl:attribute>
+
+ <xsl:attribute name="initial-page-number">
+ <xsl:call-template name="initial.page.number">
+ <xsl:with-param name="master-reference" select="$master-reference"/>
+ </xsl:call-template>
+ </xsl:attribute>
+
+ <xsl:attribute name="force-page-count">
+ <xsl:call-template name="force.page.count">
+ <xsl:with-param name="master-reference" select="$master-reference"/>
+ </xsl:call-template>
+ </xsl:attribute>
+
+ <xsl:attribute name="hyphenation-character">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'hyphenation-character'"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:attribute name="hyphenation-push-character-count">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'hyphenation-push-character-count'"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:attribute name="hyphenation-remain-character-count">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'hyphenation-remain-character-count'"/>
+ </xsl:call-template>
+ </xsl:attribute>
+
+ <xsl:apply-templates select="." mode="running.head.mode">
+ <xsl:with-param name="master-reference" select="$master-reference"/>
+ </xsl:apply-templates>
+ <xsl:apply-templates select="." mode="running.foot.mode">
+ <xsl:with-param name="master-reference" select="$master-reference"/>
+ </xsl:apply-templates>
+
+ <fo:flow flow-name="xsl-region-body">
+ <xsl:call-template name="set.flow.properties">
+ <xsl:with-param name="element" select="local-name(.)"/>
+ <xsl:with-param name="master-reference" select="$master-reference"/>
+ </xsl:call-template>
+
+ <fo:block id="{$id}"
+ xsl:use-attribute-sets="section.level1.properties">
+ <xsl:call-template name="sect1.titlepage"/>
+ </fo:block>
+
+ <xsl:variable name="toc.params">
+ <xsl:call-template name="find.path.params">
+ <xsl:with-param name="table" select="normalize-space($generate.toc)"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:if test="contains($toc.params, 'toc')
+ and $generate.section.toc.level &gt;= 1">
+ <xsl:call-template name="section.toc">
+ <xsl:with-param name="toc.title.p"
+ select="contains($toc.params, 'title')"/>
+ </xsl:call-template>
+ <xsl:call-template name="section.toc.separator"/>
+ </xsl:if>
+
+ <xsl:apply-templates/>
+ </fo:flow>
+ </fo:page-sequence>
+</xsl:template>
+
+<xsl:template match="sect2">
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+
+ <xsl:element name="fo:{$section.container.element}"
+ use-attribute-sets="section.level2.properties">
+ <xsl:attribute name="id"><xsl:value-of
+ select="$id"/></xsl:attribute>
+ <xsl:call-template name="sect2.titlepage"/>
+
+ <xsl:variable name="toc.params">
+ <xsl:call-template name="find.path.params">
+ <xsl:with-param name="table" select="normalize-space($generate.toc)"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:if test="contains($toc.params, 'toc')
+ and $generate.section.toc.level &gt;= 2">
+ <xsl:call-template name="section.toc">
+ <xsl:with-param name="toc.title.p"
+ select="contains($toc.params, 'title')"/>
+ </xsl:call-template>
+ <xsl:call-template name="section.toc.separator"/>
+ </xsl:if>
+
+ <xsl:apply-templates/>
+ </xsl:element>
+</xsl:template>
+
+<xsl:template match="sect3">
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+
+ <xsl:element name="fo:{$section.container.element}"
+ use-attribute-sets="section.level3.properties">
+ <xsl:attribute name="id"><xsl:value-of
+ select="$id"/></xsl:attribute>
+ <xsl:call-template name="sect3.titlepage"/>
+
+ <xsl:variable name="toc.params">
+ <xsl:call-template name="find.path.params">
+ <xsl:with-param name="table" select="normalize-space($generate.toc)"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:if test="contains($toc.params, 'toc')
+ and $generate.section.toc.level &gt;= 3">
+ <xsl:call-template name="section.toc">
+ <xsl:with-param name="toc.title.p"
+ select="contains($toc.params, 'title')"/>
+ </xsl:call-template>
+ <xsl:call-template name="section.toc.separator"/>
+ </xsl:if>
+
+ <xsl:apply-templates/>
+ </xsl:element>
+</xsl:template>
+
+<xsl:template match="sect4">
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+
+ <xsl:element name="fo:{$section.container.element}"
+ use-attribute-sets="section.level4.properties">
+ <xsl:attribute name="id"><xsl:value-of
+ select="$id"/></xsl:attribute>
+ <xsl:call-template name="sect4.titlepage"/>
+
+ <xsl:variable name="toc.params">
+ <xsl:call-template name="find.path.params">
+ <xsl:with-param name="table" select="normalize-space($generate.toc)"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:if test="contains($toc.params, 'toc')
+ and $generate.section.toc.level &gt;= 4">
+ <xsl:call-template name="section.toc">
+ <xsl:with-param name="toc.title.p"
+ select="contains($toc.params, 'title')"/>
+ </xsl:call-template>
+ <xsl:call-template name="section.toc.separator"/>
+ </xsl:if>
+
+ <xsl:apply-templates/>
+ </xsl:element>
+</xsl:template>
+
+<xsl:template match="sect5">
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+
+ <xsl:element name="fo:{$section.container.element}"
+ use-attribute-sets="section.level5.properties">
+ <xsl:attribute name="id"><xsl:value-of
+ select="$id"/></xsl:attribute>
+ <xsl:call-template name="sect5.titlepage"/>
+
+ <xsl:variable name="toc.params">
+ <xsl:call-template name="find.path.params">
+ <xsl:with-param name="table" select="normalize-space($generate.toc)"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:if test="contains($toc.params, 'toc')
+ and $generate.section.toc.level &gt;= 5">
+ <xsl:call-template name="section.toc">
+ <xsl:with-param name="toc.title.p"
+ select="contains($toc.params, 'title')"/>
+ </xsl:call-template>
+ <xsl:call-template name="section.toc.separator"/>
+ </xsl:if>
+
+ <xsl:apply-templates/>
+ </xsl:element>
+</xsl:template>
+
+<xsl:template match="simplesect">
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+
+ <xsl:element name="fo:{$section.container.element}">
+ <xsl:attribute name="id"><xsl:value-of
+ select="$id"/></xsl:attribute>
+ <xsl:call-template name="simplesect.titlepage"/>
+ <xsl:apply-templates/>
+ </xsl:element>
+</xsl:template>
+
+<xsl:template match="sectioninfo"></xsl:template>
+<xsl:template match="section/info"></xsl:template>
+<xsl:template match="section/title"></xsl:template>
+<xsl:template match="section/titleabbrev"></xsl:template>
+<xsl:template match="section/subtitle"></xsl:template>
+
+<xsl:template match="sect1info"></xsl:template>
+<xsl:template match="sect1/info"></xsl:template>
+<xsl:template match="sect1/title"></xsl:template>
+<xsl:template match="sect1/titleabbrev"></xsl:template>
+<xsl:template match="sect1/subtitle"></xsl:template>
+
+<xsl:template match="sect2info"></xsl:template>
+<xsl:template match="sect2/info"></xsl:template>
+<xsl:template match="sect2/title"></xsl:template>
+<xsl:template match="sect2/titleabbrev"></xsl:template>
+<xsl:template match="sect2/subtitle"></xsl:template>
+
+<xsl:template match="sect3info"></xsl:template>
+<xsl:template match="sect3/info"></xsl:template>
+<xsl:template match="sect3/title"></xsl:template>
+<xsl:template match="sect3/titleabbrev"></xsl:template>
+<xsl:template match="sect3/subtitle"></xsl:template>
+
+<xsl:template match="sect4info"></xsl:template>
+<xsl:template match="sect4/info"></xsl:template>
+<xsl:template match="sect4/title"></xsl:template>
+<xsl:template match="sect4/titleabbrev"></xsl:template>
+<xsl:template match="sect4/subtitle"></xsl:template>
+
+<xsl:template match="sect5info"></xsl:template>
+<xsl:template match="sect5/info"></xsl:template>
+<xsl:template match="sect5/title"></xsl:template>
+<xsl:template match="sect5/titleabbrev"></xsl:template>
+<xsl:template match="sect5/subtitle"></xsl:template>
+
+<xsl:template match="simplesect/info"></xsl:template>
+<xsl:template match="simplesect/title"></xsl:template>
+<xsl:template match="simplesect/titleabbrev"></xsl:template>
+<xsl:template match="simplesect/subtitle"></xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template name="section.heading">
+ <xsl:param name="level" select="1"/>
+ <xsl:param name="marker" select="1"/>
+ <xsl:param name="title"/>
+ <xsl:param name="marker.title"/>
+
+ <fo:block xsl:use-attribute-sets="section.title.properties">
+ <xsl:if test="$marker != 0">
+ <fo:marker marker-class-name="section.head.marker">
+ <xsl:copy-of select="$marker.title"/>
+ </fo:marker>
+ </xsl:if>
+
+ <xsl:choose>
+ <xsl:when test="$level=1">
+ <fo:block xsl:use-attribute-sets="section.title.level1.properties">
+ <xsl:copy-of select="$title"/>
+ </fo:block>
+ </xsl:when>
+ <xsl:when test="$level=2">
+ <fo:block xsl:use-attribute-sets="section.title.level2.properties">
+ <xsl:copy-of select="$title"/>
+ </fo:block>
+ </xsl:when>
+ <xsl:when test="$level=3">
+ <fo:block xsl:use-attribute-sets="section.title.level3.properties">
+ <xsl:copy-of select="$title"/>
+ </fo:block>
+ </xsl:when>
+ <xsl:when test="$level=4">
+ <fo:block xsl:use-attribute-sets="section.title.level4.properties">
+ <xsl:copy-of select="$title"/>
+ </fo:block>
+ </xsl:when>
+ <xsl:when test="$level=5">
+ <fo:block xsl:use-attribute-sets="section.title.level5.properties">
+ <xsl:copy-of select="$title"/>
+ </fo:block>
+ </xsl:when>
+ <xsl:otherwise>
+ <fo:block xsl:use-attribute-sets="section.title.level6.properties">
+ <xsl:copy-of select="$title"/>
+ </fo:block>
+ </xsl:otherwise>
+ </xsl:choose>
+ </fo:block>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="bridgehead">
+ <xsl:variable name="container"
+ select="(ancestor::appendix
+ |ancestor::article
+ |ancestor::bibliography
+ |ancestor::chapter
+ |ancestor::glossary
+ |ancestor::glossdiv
+ |ancestor::index
+ |ancestor::partintro
+ |ancestor::preface
+ |ancestor::refsect1
+ |ancestor::refsect2
+ |ancestor::refsect3
+ |ancestor::sect1
+ |ancestor::sect2
+ |ancestor::sect3
+ |ancestor::sect4
+ |ancestor::sect5
+ |ancestor::section
+ |ancestor::setindex
+ |ancestor::simplesect)[last()]"/>
+
+ <xsl:variable name="clevel">
+ <xsl:choose>
+ <xsl:when test="local-name($container) = 'appendix'
+ or local-name($container) = 'chapter'
+ or local-name($container) = 'article'
+ or local-name($container) = 'bibliography'
+ or local-name($container) = 'glossary'
+ or local-name($container) = 'index'
+ or local-name($container) = 'partintro'
+ or local-name($container) = 'preface'
+ or local-name($container) = 'setindex'">2</xsl:when>
+ <xsl:when test="local-name($container) = 'glossdiv'">
+ <xsl:value-of select="count(ancestor::glossdiv)+2"/>
+ </xsl:when>
+ <xsl:when test="local-name($container) = 'sect1'
+ or local-name($container) = 'sect2'
+ or local-name($container) = 'sect3'
+ or local-name($container) = 'sect4'
+ or local-name($container) = 'sect5'
+ or local-name($container) = 'refsect1'
+ or local-name($container) = 'refsect2'
+ or local-name($container) = 'refsect3'
+ or local-name($container) = 'section'
+ or local-name($container) = 'simplesect'">
+ <xsl:variable name="slevel">
+ <xsl:call-template name="section.level">
+ <xsl:with-param name="node" select="$container"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:value-of select="$slevel + 1"/>
+ </xsl:when>
+ <xsl:otherwise>2</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="level">
+ <xsl:choose>
+ <xsl:when test="@renderas = 'sect1'">1</xsl:when>
+ <xsl:when test="@renderas = 'sect2'">2</xsl:when>
+ <xsl:when test="@renderas = 'sect3'">3</xsl:when>
+ <xsl:when test="@renderas = 'sect4'">4</xsl:when>
+ <xsl:when test="@renderas = 'sect5'">5</xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$clevel"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="marker">
+ <xsl:choose>
+ <xsl:when test="$level &lt;= $marker.section.level">1</xsl:when>
+ <xsl:otherwise>0</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="marker.title">
+ <xsl:apply-templates/>
+ </xsl:variable>
+
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+
+ <fo:block id="{$id}">
+ <xsl:call-template name="section.heading">
+ <xsl:with-param name="level" select="$level"/>
+ <xsl:with-param name="title">
+ <xsl:apply-templates/>
+ </xsl:with-param>
+ <xsl:with-param name="marker" select="$marker"/>
+ <xsl:with-param name="marker.title" select="$marker.title"/>
+ </xsl:call-template>
+ </fo:block>
+</xsl:template>
+
+</xsl:stylesheet>
+
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/spaces.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/spaces.xsl
new file mode 100644
index 0000000..d34c9cd
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/spaces.xsl
@@ -0,0 +1,274 @@
+<?xml version='1.0' encoding="utf-8"?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:fo="http://www.w3.org/1999/XSL/Format"
+ version='1.0'>
+
+<!-- ********************************************************************
+ $Id: spaces.xsl 8121 2008-09-13 17:21:11Z mzjn $
+ ********************************************************************
+ XSL-FO specification treats all space characters like ordinary spaces.
+ We need to map them to fo:leader with different widths in order to
+ simulate desired behaviour.
+ ******************************************************************** -->
+
+<xsl:template match="text()[namespace-uri(..) = '' or
+ namespace-uri(..) = 'http://docbook.org/ns/docbook']">
+ <xsl:choose>
+ <xsl:when test="$passivetex.extensions != 0">
+ <xsl:call-template name="passivetex.dash.subst">
+ <xsl:with-param name="string">
+ <xsl:call-template name="space.2000.subst">
+ <xsl:with-param name="string" select="."/>
+ </xsl:call-template>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="space.2000.subst">
+ <xsl:with-param name="string" select="."/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:param name="space.enquad.width">0.5em</xsl:param> <!-- U+2000 -->
+<xsl:param name="space.emquad.width">1em</xsl:param> <!-- U+2001 -->
+<xsl:param name="space.enspace.width">0.5em</xsl:param> <!-- U+2002 -->
+<xsl:param name="space.emspace.width">1em</xsl:param> <!-- U+2003 -->
+<xsl:param name="space.3emspace.width">0.33em</xsl:param><!-- U+2004 -->
+<xsl:param name="space.4emspace.width">0.25em</xsl:param><!-- U+2005 -->
+<xsl:param name="space.6emspace.width">0.16em</xsl:param><!-- U+2006 -->
+<xsl:param name="space.figspace.width"></xsl:param> <!-- U+2007 -->
+<xsl:param name="space.punctspace.width"></xsl:param> <!-- U+2008 -->
+<xsl:param name="space.thinspace.width">0.2em</xsl:param><!-- U+2009 -->
+<xsl:param name="space.hairspace.width">0.1em</xsl:param><!-- U+200A -->
+
+<xsl:template name="space.2000.subst">
+ <xsl:param name="string"/>
+
+ <xsl:choose>
+ <xsl:when test="contains($string, '&#x2000;') and $space.enquad.width != ''">
+ <xsl:call-template name="space.2001.subst">
+ <xsl:with-param name="string" select="substring-before($string, '&#x2000;')"/>
+ </xsl:call-template>
+ <fo:leader leader-length="{$space.enquad.width}"/>
+ <xsl:call-template name="space.2000.subst">
+ <xsl:with-param name="string" select="substring-after($string, '&#x2000;')"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="space.2001.subst">
+ <xsl:with-param name="string" select="$string"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="space.2001.subst">
+ <xsl:param name="string"/>
+
+ <xsl:choose>
+ <xsl:when test="contains($string, '&#x2001;') and $space.emquad.width != ''">
+ <xsl:call-template name="space.2002.subst">
+ <xsl:with-param name="string" select="substring-before($string, '&#x2001;')"/>
+ </xsl:call-template>
+ <fo:leader leader-length="{$space.emquad.width}"/>
+ <xsl:call-template name="space.2001.subst">
+ <xsl:with-param name="string" select="substring-after($string, '&#x2001;')"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="space.2002.subst">
+ <xsl:with-param name="string" select="$string"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="space.2002.subst">
+ <xsl:param name="string"/>
+
+ <xsl:choose>
+ <xsl:when test="contains($string, '&#x2002;') and $space.enspace.width != ''">
+ <xsl:call-template name="space.2003.subst">
+ <xsl:with-param name="string" select="substring-before($string, '&#x2002;')"/>
+ </xsl:call-template>
+ <fo:leader leader-length="{$space.enspace.width}"/>
+ <xsl:call-template name="space.2002.subst">
+ <xsl:with-param name="string" select="substring-after($string, '&#x2002;')"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="space.2003.subst">
+ <xsl:with-param name="string" select="$string"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="space.2003.subst">
+ <xsl:param name="string"/>
+
+ <xsl:choose>
+ <xsl:when test="contains($string, '&#x2003;') and $space.emspace.width != ''">
+ <xsl:call-template name="space.2004.subst">
+ <xsl:with-param name="string" select="substring-before($string, '&#x2003;')"/>
+ </xsl:call-template>
+ <fo:leader leader-length="{$space.emspace.width}"/>
+ <xsl:call-template name="space.2003.subst">
+ <xsl:with-param name="string" select="substring-after($string, '&#x2003;')"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="space.2004.subst">
+ <xsl:with-param name="string" select="$string"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="space.2004.subst">
+ <xsl:param name="string"/>
+
+ <xsl:choose>
+ <xsl:when test="contains($string, '&#x2004;') and $space.3emspace.width != ''">
+ <xsl:call-template name="space.2005.subst">
+ <xsl:with-param name="string" select="substring-before($string, '&#x2004;')"/>
+ </xsl:call-template>
+ <fo:leader leader-length="{$space.3emspace.width}"/>
+ <xsl:call-template name="space.2004.subst">
+ <xsl:with-param name="string" select="substring-after($string, '&#x2004;')"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="space.2005.subst">
+ <xsl:with-param name="string" select="$string"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="space.2005.subst">
+ <xsl:param name="string"/>
+
+ <xsl:choose>
+ <xsl:when test="contains($string, '&#x2005;') and $space.4emspace.width != ''">
+ <xsl:call-template name="space.2006.subst">
+ <xsl:with-param name="string" select="substring-before($string, '&#x2005;')"/>
+ </xsl:call-template>
+ <fo:leader leader-length="{$space.4emspace.width}"/>
+ <xsl:call-template name="space.2005.subst">
+ <xsl:with-param name="string" select="substring-after($string, '&#x2005;')"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="space.2006.subst">
+ <xsl:with-param name="string" select="$string"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="space.2006.subst">
+ <xsl:param name="string"/>
+
+ <xsl:choose>
+ <xsl:when test="contains($string, '&#x2006;') and $space.6emspace.width != ''">
+ <xsl:call-template name="space.2007.subst">
+ <xsl:with-param name="string" select="substring-before($string, '&#x2006;')"/>
+ </xsl:call-template>
+ <fo:leader leader-length="{$space.6emspace.width}"/>
+ <xsl:call-template name="space.2006.subst">
+ <xsl:with-param name="string" select="substring-after($string, '&#x2006;')"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="space.2007.subst">
+ <xsl:with-param name="string" select="$string"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="space.2007.subst">
+ <xsl:param name="string"/>
+
+ <xsl:choose>
+ <xsl:when test="contains($string, '&#x2007;') and $space.figspace.width != ''">
+ <xsl:call-template name="space.2008.subst">
+ <xsl:with-param name="string" select="substring-before($string, '&#x2007;')"/>
+ </xsl:call-template>
+ <fo:leader leader-length="{$space.figspace.width}"/>
+ <xsl:call-template name="space.2007.subst">
+ <xsl:with-param name="string" select="substring-after($string, '&#x2007;')"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="space.2008.subst">
+ <xsl:with-param name="string" select="$string"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="space.2008.subst">
+ <xsl:param name="string"/>
+
+ <xsl:choose>
+ <xsl:when test="contains($string, '&#x2008;') and $space.punctspace.width != ''">
+ <xsl:call-template name="space.2009.subst">
+ <xsl:with-param name="string" select="substring-before($string, '&#x2008;')"/>
+ </xsl:call-template>
+ <fo:leader leader-length="{$space.punctspace.width}"/>
+ <xsl:call-template name="space.2008.subst">
+ <xsl:with-param name="string" select="substring-after($string, '&#x2008;')"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="space.2009.subst">
+ <xsl:with-param name="string" select="$string"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="space.2009.subst">
+ <xsl:param name="string"/>
+
+ <xsl:choose>
+ <xsl:when test="contains($string, '&#x2009;') and $space.thinspace.width != ''">
+ <xsl:call-template name="space.200A.subst">
+ <xsl:with-param name="string" select="substring-before($string, '&#x2009;')"/>
+ </xsl:call-template>
+ <fo:leader leader-length="{$space.thinspace.width}"/>
+ <xsl:call-template name="space.2009.subst">
+ <xsl:with-param name="string" select="substring-after($string, '&#x2009;')"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="space.200A.subst">
+ <xsl:with-param name="string" select="$string"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="space.200A.subst">
+ <xsl:param name="string"/>
+
+ <xsl:choose>
+ <xsl:when test="contains($string, '&#x200A;') and $space.hairspace.width != ''">
+ <xsl:value-of select="substring-before($string, '&#x200A;')"/>
+ <fo:leader leader-length="{$space.hairspace.width}"/>
+ <xsl:call-template name="space.200A.subst">
+ <xsl:with-param name="string" select="substring-after($string, '&#x200A;')"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$string"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+</xsl:stylesheet>
+
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/synop.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/synop.xsl
new file mode 100644
index 0000000..92afc20
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/synop.xsl
@@ -0,0 +1,1007 @@
+<?xml version='1.0'?>
+<!DOCTYPE xsl:stylesheet [
+<!ENTITY RE "&#10;">
+<!ENTITY nbsp "&#160;">
+]>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:fo="http://www.w3.org/1999/XSL/Format"
+ version='1.0'>
+
+<!-- ********************************************************************
+ $Id: synop.xsl 8334 2009-03-15 14:26:23Z mzjn $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<!-- ==================================================================== -->
+
+<!-- synopsis is in verbatim -->
+
+<!-- ==================================================================== -->
+
+<xsl:template match="cmdsynopsis">
+ <fo:block xsl:use-attribute-sets="normal.para.spacing">
+ <xsl:apply-templates/>
+ </fo:block>
+</xsl:template>
+
+<xsl:template match="cmdsynopsis/command">
+ <xsl:call-template name="inline.monoseq"/>
+ <xsl:text> </xsl:text>
+</xsl:template>
+
+<xsl:template match="cmdsynopsis/command[1]" priority="2">
+ <xsl:call-template name="inline.monoseq"/>
+ <xsl:text> </xsl:text>
+</xsl:template>
+
+<xsl:template match="group|arg" name="group-or-arg">
+ <xsl:variable name="choice" select="@choice"/>
+ <xsl:variable name="rep" select="@rep"/>
+ <xsl:variable name="sepchar">
+ <xsl:choose>
+ <xsl:when test="ancestor-or-self::*/@sepchar">
+ <xsl:value-of select="ancestor-or-self::*/@sepchar"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text> </xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="preceding-sibling::*">
+ <xsl:value-of select="$sepchar"/>
+ </xsl:if>
+ <xsl:choose>
+ <xsl:when test="$choice='plain'">
+ <xsl:value-of select="$arg.choice.plain.open.str"/>
+ </xsl:when>
+ <xsl:when test="$choice='req'">
+ <xsl:value-of select="$arg.choice.req.open.str"/>
+ </xsl:when>
+ <xsl:when test="$choice='opt'">
+ <xsl:value-of select="$arg.choice.opt.open.str"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$arg.choice.def.open.str"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:apply-templates/>
+ <xsl:choose>
+ <xsl:when test="$rep='repeat'">
+ <xsl:value-of select="$arg.rep.repeat.str"/>
+ </xsl:when>
+ <xsl:when test="$rep='norepeat'">
+ <xsl:value-of select="$arg.rep.norepeat.str"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$arg.rep.def.str"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:choose>
+ <xsl:when test="$choice='plain'">
+ <xsl:value-of select="$arg.choice.plain.close.str"/>
+ </xsl:when>
+ <xsl:when test="$choice='req'">
+ <xsl:value-of select="$arg.choice.req.close.str"/>
+ </xsl:when>
+ <xsl:when test="$choice='opt'">
+ <xsl:value-of select="$arg.choice.opt.close.str"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$arg.choice.def.close.str"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="group/arg">
+ <xsl:variable name="choice" select="@choice"/>
+ <xsl:variable name="rep" select="@rep"/>
+ <xsl:if test="preceding-sibling::*">
+ <xsl:value-of select="$arg.or.sep"/>
+ </xsl:if>
+ <xsl:call-template name="group-or-arg"/>
+</xsl:template>
+
+<xsl:template match="sbr">
+ <fo:block/>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="synopfragmentref">
+ <xsl:variable name="target" select="key('id',@linkend)"/>
+ <xsl:variable name="snum">
+ <xsl:apply-templates select="$target" mode="synopfragment.number"/>
+ </xsl:variable>
+ <fo:inline font-style="italic">
+ <fo:basic-link internal-destination="{@linkend}"
+ xsl:use-attribute-sets="xref.properties">
+ <xsl:text>(</xsl:text>
+ <xsl:value-of select="$snum"/>
+ <xsl:text>)</xsl:text>
+ </fo:basic-link>
+ <xsl:text>&#160;</xsl:text>
+ <xsl:apply-templates/>
+ </fo:inline>
+</xsl:template>
+
+<xsl:template match="synopfragment" mode="synopfragment.number">
+ <xsl:number format="1"/>
+</xsl:template>
+
+<xsl:template match="synopfragment">
+ <xsl:variable name="snum">
+ <xsl:apply-templates select="." mode="synopfragment.number"/>
+ </xsl:variable>
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+ <fo:block id="{$id}">
+ <xsl:text>(</xsl:text>
+ <xsl:value-of select="$snum"/>
+ <xsl:text>)</xsl:text>
+ <xsl:text> </xsl:text>
+ <xsl:apply-templates/>
+ </fo:block>
+</xsl:template>
+
+<xsl:template match="funcsynopsis">
+ <xsl:call-template name="informal.object"/>
+</xsl:template>
+
+<xsl:template match="funcsynopsisinfo">
+ <fo:block space-after.minimum="0.8em"
+ space-after.optimum="1em"
+ space-after.maximum="1.2em">
+ <xsl:apply-templates/>
+ </fo:block>
+</xsl:template>
+
+<xsl:template match="funcprototype">
+
+ <xsl:variable name="style">
+ <xsl:call-template name="funcsynopsis.style"/>
+ </xsl:variable>
+
+ <fo:block font-family="{$monospace.font.family}"
+ space-before.minimum="0.8em"
+ space-before.optimum="1em"
+ space-before.maximum="1.2em">
+ <xsl:apply-templates/>
+
+ <xsl:if test="$style='kr'">
+ <fo:block
+ space-before.minimum="0.8em"
+ space-before.optimum="1em"
+ space-before.maximum="1.2em">
+ <xsl:apply-templates select="./paramdef" mode="kr-funcsynopsis-mode"/>
+ </fo:block>
+ </xsl:if>
+
+ </fo:block>
+</xsl:template>
+
+<xsl:template match="funcdef">
+ <fo:inline font-family="{$monospace.font.family}">
+ <xsl:apply-templates/>
+ </fo:inline>
+</xsl:template>
+
+<xsl:template match="funcdef/function">
+ <xsl:choose>
+ <xsl:when test="$funcsynopsis.decoration != 0">
+ <fo:inline font-weight="bold">
+ <xsl:apply-templates/>
+ </fo:inline>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="void">
+
+ <xsl:variable name="style">
+ <xsl:call-template name="funcsynopsis.style"/>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="$style='ansi'">
+ <xsl:text>(void);</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text>();</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="varargs">
+ <xsl:text>(...);</xsl:text>
+</xsl:template>
+
+<xsl:template match="paramdef">
+
+ <xsl:variable name="style">
+ <xsl:call-template name="funcsynopsis.style"/>
+ </xsl:variable>
+
+ <xsl:variable name="paramnum">
+ <xsl:number count="paramdef" format="1"/>
+ </xsl:variable>
+ <xsl:if test="$paramnum=1">(</xsl:if>
+ <xsl:choose>
+ <xsl:when test="$style='ansi'">
+ <xsl:apply-templates/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="./parameter"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:choose>
+ <xsl:when test="following-sibling::paramdef">
+ <xsl:text>, </xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text>);</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="paramdef/parameter">
+ <xsl:choose>
+ <xsl:when test="$funcsynopsis.decoration != 0">
+ <xsl:call-template name="inline.italicseq"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates/>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:if test="following-sibling::parameter">
+ <xsl:text>, </xsl:text>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="paramdef" mode="kr-funcsynopsis-mode">
+ <fo:block>
+ <xsl:apply-templates/>
+ <xsl:text>;</xsl:text>
+ </fo:block>
+</xsl:template>
+
+<xsl:template match="funcparams">
+ <xsl:text>(</xsl:text>
+ <xsl:apply-templates/>
+ <xsl:text>)</xsl:text>
+</xsl:template>
+
+<!-- Return value of PI or parameter -->
+<xsl:template name="funcsynopsis.style">
+ <xsl:variable name="pi.style">
+ <xsl:call-template name="pi.dbfo_funcsynopsis-style">
+ <xsl:with-param name="node" select="ancestor::funcsynopsis/descendant-or-self::*"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="$pi.style != ''">
+ <xsl:value-of select="$pi.style"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$funcsynopsis.style"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:variable name="default-classsynopsis-language">java</xsl:variable>
+
+<xsl:template match="classsynopsis
+ |fieldsynopsis
+ |methodsynopsis
+ |constructorsynopsis
+ |destructorsynopsis">
+ <xsl:param name="language">
+ <xsl:choose>
+ <xsl:when test="@language">
+ <xsl:value-of select="@language"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$default-classsynopsis-language"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:param>
+
+ <!--
+ <xsl:message>process <xsl:value-of select="local-name(.)"/> in <xsl:value-of select="$language"/></xsl:message>
+ -->
+
+ <xsl:choose>
+ <xsl:when test="$language='java' or $language='Java'">
+ <xsl:apply-templates select="." mode="java"/>
+ </xsl:when>
+ <xsl:when test="$language='perl' or $language='Perl'">
+ <xsl:apply-templates select="." mode="perl"/>
+ </xsl:when>
+ <xsl:when test="$language='idl' or $language='IDL'">
+ <xsl:apply-templates select="." mode="idl"/>
+ </xsl:when>
+ <xsl:when test="$language='cpp' or $language='c++' or $language='C++'">
+ <xsl:apply-templates select="." mode="cpp"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:message>
+ <xsl:text>Unrecognized language on </xsl:text>
+ <xsl:value-of select="local-name(.)"/>
+ <xsl:text>: </xsl:text>
+ <xsl:value-of select="$language"/>
+ </xsl:message>
+ <xsl:apply-templates select=".">
+ <xsl:with-param name="language"
+ select="$default-classsynopsis-language"/>
+ </xsl:apply-templates>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="synop-break">
+ <xsl:if test="parent::classsynopsis
+ or (following-sibling::fieldsynopsis
+ |following-sibling::methodsynopsis
+ |following-sibling::constructorsynopsis
+ |following-sibling::destructorsynopsis)">
+ <fo:inline>&RE;</fo:inline>
+ </xsl:if>
+</xsl:template>
+
+<!-- ===== Java ======================================================== -->
+
+<xsl:template match="classsynopsis" mode="java">
+ <fo:block wrap-option='no-wrap'
+ white-space-collapse='false'
+ linefeed-treatment="preserve"
+ xsl:use-attribute-sets="monospace.verbatim.properties">
+ <xsl:apply-templates select="ooclass[1]" mode="java"/>
+ <xsl:if test="ooclass[preceding-sibling::*]">
+ <xsl:text> extends</xsl:text>
+ <xsl:apply-templates select="ooclass[preceding-sibling::*]" mode="java"/>
+ <xsl:if test="oointerface|ooexception">
+ <xsl:text>&RE;&nbsp;&nbsp;&nbsp;&nbsp;</xsl:text>
+ </xsl:if>
+ </xsl:if>
+ <xsl:if test="oointerface">
+ <xsl:text>implements</xsl:text>
+ <xsl:apply-templates select="oointerface" mode="java"/>
+ <xsl:if test="ooexception">
+ <xsl:text>&RE;&nbsp;&nbsp;&nbsp;&nbsp;</xsl:text>
+ </xsl:if>
+ </xsl:if>
+ <xsl:if test="ooexception">
+ <xsl:text>throws</xsl:text>
+ <xsl:apply-templates select="ooexception" mode="java"/>
+ </xsl:if>
+ <xsl:text>&nbsp;{&RE;</xsl:text>
+ <xsl:apply-templates select="constructorsynopsis
+ |destructorsynopsis
+ |fieldsynopsis
+ |methodsynopsis
+ |classsynopsisinfo" mode="java"/>
+ <xsl:text>}</xsl:text>
+ </fo:block>
+</xsl:template>
+
+<xsl:template match="classsynopsisinfo" mode="java">
+ <xsl:apply-templates mode="java"/>
+</xsl:template>
+
+<xsl:template match="ooclass|oointerface|ooexception" mode="java">
+ <xsl:choose>
+ <xsl:when test="preceding-sibling::*">
+ <xsl:text>, </xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text> </xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:apply-templates mode="java"/>
+</xsl:template>
+
+<xsl:template match="modifier|package" mode="java">
+ <xsl:apply-templates mode="java"/>
+ <xsl:if test="following-sibling::*">
+ <xsl:text>&nbsp;</xsl:text>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="classname" mode="java">
+ <xsl:if test="local-name(preceding-sibling::*[1]) = 'classname'">
+ <xsl:text>, </xsl:text>
+ </xsl:if>
+ <xsl:apply-templates mode="java"/>
+</xsl:template>
+
+<xsl:template match="interfacename" mode="java">
+ <xsl:if test="local-name(preceding-sibling::*[1]) = 'interfacename'">
+ <xsl:text>, </xsl:text>
+ </xsl:if>
+ <xsl:apply-templates mode="java"/>
+</xsl:template>
+
+<xsl:template match="exceptionname" mode="java">
+ <xsl:if test="local-name(preceding-sibling::*[1]) = 'exceptionname'">
+ <xsl:text>, </xsl:text>
+ </xsl:if>
+ <xsl:apply-templates mode="java"/>
+</xsl:template>
+
+<xsl:template match="fieldsynopsis" mode="java">
+ <fo:block wrap-option='no-wrap'
+ white-space-collapse='false'
+ linefeed-treatment="preserve"
+ xsl:use-attribute-sets="monospace.verbatim.properties">
+ <xsl:text>&nbsp;&nbsp;</xsl:text>
+ <xsl:apply-templates mode="java"/>
+ <xsl:text>;</xsl:text>
+ <xsl:call-template name="synop-break"/>
+ </fo:block>
+</xsl:template>
+
+<xsl:template match="type" mode="java">
+ <xsl:apply-templates mode="java"/>
+ <xsl:text>&nbsp;</xsl:text>
+</xsl:template>
+
+<xsl:template match="varname" mode="java">
+ <xsl:apply-templates mode="java"/>
+ <xsl:text>&nbsp;</xsl:text>
+</xsl:template>
+
+<xsl:template match="initializer" mode="java">
+ <xsl:text>=&nbsp;</xsl:text>
+ <xsl:apply-templates mode="java"/>
+</xsl:template>
+
+<xsl:template match="void" mode="java">
+ <xsl:text>void&nbsp;</xsl:text>
+</xsl:template>
+
+<xsl:template match="methodname" mode="java">
+ <xsl:apply-templates mode="java"/>
+</xsl:template>
+
+<xsl:template match="methodparam" mode="java">
+ <xsl:param name="indent">0</xsl:param>
+ <xsl:if test="preceding-sibling::methodparam">
+ <xsl:text>,&RE;</xsl:text>
+ <xsl:if test="$indent &gt; 0">
+ <xsl:call-template name="copy-string">
+ <xsl:with-param name="string">&nbsp;</xsl:with-param>
+ <xsl:with-param name="count" select="$indent + 1"/>
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:if>
+ <xsl:apply-templates mode="java"/>
+</xsl:template>
+
+<xsl:template match="parameter" mode="java">
+ <xsl:apply-templates mode="java"/>
+</xsl:template>
+
+<xsl:template mode="java"
+ match="constructorsynopsis|destructorsynopsis|methodsynopsis">
+ <xsl:variable name="start-modifiers" select="modifier[following-sibling::*[local-name(.) != 'modifier']]"/>
+ <xsl:variable name="notmod" select="*[local-name(.) != 'modifier']"/>
+ <xsl:variable name="end-modifiers" select="modifier[preceding-sibling::*[local-name(.) != 'modifier']]"/>
+ <xsl:variable name="decl">
+ <xsl:text> </xsl:text>
+ <xsl:apply-templates select="$start-modifiers" mode="java"/>
+
+ <!-- type -->
+ <xsl:if test="local-name($notmod[1]) != 'methodname'">
+ <xsl:apply-templates select="$notmod[1]" mode="java"/>
+ </xsl:if>
+
+ <xsl:apply-templates select="methodname" mode="java"/>
+ </xsl:variable>
+
+ <fo:block wrap-option='no-wrap'
+ white-space-collapse='false'
+ linefeed-treatment="preserve"
+ xsl:use-attribute-sets="monospace.verbatim.properties">
+ <xsl:copy-of select="$decl"/>
+ <xsl:text>(</xsl:text>
+ <xsl:apply-templates select="methodparam" mode="java">
+ <xsl:with-param name="indent" select="string-length($decl)"/>
+ </xsl:apply-templates>
+ <xsl:text>)</xsl:text>
+ <xsl:if test="exceptionname">
+ <xsl:text>&RE;&nbsp;&nbsp;&nbsp;&nbsp;throws&nbsp;</xsl:text>
+ <xsl:apply-templates select="exceptionname" mode="java"/>
+ </xsl:if>
+ <xsl:if test="modifier[preceding-sibling::*[local-name(.) != 'modifier']]">
+ <xsl:text> </xsl:text>
+ <xsl:apply-templates select="$end-modifiers" mode="java"/>
+ </xsl:if>
+ <xsl:text>;</xsl:text>
+ </fo:block>
+ <xsl:call-template name="synop-break"/>
+</xsl:template>
+
+<!-- ===== C++ ========================================================= -->
+
+<xsl:template match="classsynopsis" mode="cpp">
+ <fo:block wrap-option='no-wrap'
+ white-space-collapse='false'
+ linefeed-treatment="preserve"
+ xsl:use-attribute-sets="monospace.verbatim.properties">
+ <xsl:apply-templates select="ooclass[1]" mode="cpp"/>
+ <xsl:if test="ooclass[preceding-sibling::*]">
+ <xsl:text>: </xsl:text>
+ <xsl:apply-templates select="ooclass[preceding-sibling::*]" mode="cpp"/>
+ <xsl:if test="oointerface|ooexception">
+ <xsl:text>&RE;&nbsp;&nbsp;&nbsp;&nbsp;</xsl:text>
+ </xsl:if>
+ </xsl:if>
+ <xsl:if test="oointerface">
+ <xsl:text> implements</xsl:text>
+ <xsl:apply-templates select="oointerface" mode="cpp"/>
+ <xsl:if test="ooexception">
+ <xsl:text>&RE;&nbsp;&nbsp;&nbsp;&nbsp;</xsl:text>
+ </xsl:if>
+ </xsl:if>
+ <xsl:if test="ooexception">
+ <xsl:text> throws</xsl:text>
+ <xsl:apply-templates select="ooexception" mode="cpp"/>
+ </xsl:if>
+ <xsl:text>&nbsp;{&RE;</xsl:text>
+ <xsl:apply-templates select="constructorsynopsis
+ |destructorsynopsis
+ |fieldsynopsis
+ |methodsynopsis
+ |classsynopsisinfo" mode="cpp"/>
+ <xsl:text>}</xsl:text>
+ </fo:block>
+</xsl:template>
+
+<xsl:template match="classsynopsisinfo" mode="cpp">
+ <xsl:apply-templates mode="cpp"/>
+</xsl:template>
+
+<xsl:template match="ooclass|oointerface|ooexception" mode="cpp">
+ <xsl:if test="preceding-sibling::*">
+ <xsl:text>, </xsl:text>
+ </xsl:if>
+ <xsl:apply-templates mode="cpp"/>
+</xsl:template>
+
+<xsl:template match="modifier|package" mode="cpp">
+ <xsl:apply-templates mode="cpp"/>
+ <xsl:if test="following-sibling::*">
+ <xsl:text>&nbsp;</xsl:text>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="classname" mode="cpp">
+ <xsl:if test="local-name(preceding-sibling::*[1]) = 'classname'">
+ <xsl:text>, </xsl:text>
+ </xsl:if>
+ <xsl:apply-templates mode="cpp"/>
+</xsl:template>
+
+<xsl:template match="interfacename" mode="cpp">
+ <xsl:if test="local-name(preceding-sibling::*[1]) = 'interfacename'">
+ <xsl:text>, </xsl:text>
+ </xsl:if>
+ <xsl:apply-templates mode="cpp"/>
+</xsl:template>
+
+<xsl:template match="exceptionname" mode="cpp">
+ <xsl:if test="local-name(preceding-sibling::*[1]) = 'exceptionname'">
+ <xsl:text>, </xsl:text>
+ </xsl:if>
+ <xsl:apply-templates mode="cpp"/>
+</xsl:template>
+
+<xsl:template match="fieldsynopsis" mode="cpp">
+ <fo:block wrap-option='no-wrap'
+ white-space-collapse='false'
+ linefeed-treatment="preserve"
+ xsl:use-attribute-sets="monospace.verbatim.properties">
+ <xsl:text>&nbsp;&nbsp;</xsl:text>
+ <xsl:apply-templates mode="cpp"/>
+ <xsl:text>;</xsl:text>
+ </fo:block>
+ <xsl:call-template name="synop-break"/>
+</xsl:template>
+
+<xsl:template match="type" mode="cpp">
+ <xsl:apply-templates mode="cpp"/>
+ <xsl:text>&nbsp;</xsl:text>
+</xsl:template>
+
+<xsl:template match="varname" mode="cpp">
+ <xsl:apply-templates mode="cpp"/>
+ <xsl:text>&nbsp;</xsl:text>
+</xsl:template>
+
+<xsl:template match="initializer" mode="cpp">
+ <xsl:text>=&nbsp;</xsl:text>
+ <xsl:apply-templates mode="cpp"/>
+</xsl:template>
+
+<xsl:template match="void" mode="cpp">
+ <xsl:text>void&nbsp;</xsl:text>
+</xsl:template>
+
+<xsl:template match="methodname" mode="cpp">
+ <xsl:apply-templates mode="cpp"/>
+</xsl:template>
+
+<xsl:template match="methodparam" mode="cpp">
+ <xsl:if test="preceding-sibling::methodparam">
+ <xsl:text>, </xsl:text>
+ </xsl:if>
+ <xsl:apply-templates mode="cpp"/>
+</xsl:template>
+
+<xsl:template match="parameter" mode="cpp">
+ <xsl:apply-templates mode="cpp"/>
+</xsl:template>
+
+<xsl:template mode="cpp"
+ match="constructorsynopsis|destructorsynopsis|methodsynopsis">
+ <xsl:variable name="start-modifiers" select="modifier[following-sibling::*[local-name(.) != 'modifier']]"/>
+ <xsl:variable name="notmod" select="*[local-name(.) != 'modifier']"/>
+ <xsl:variable name="end-modifiers" select="modifier[preceding-sibling::*[local-name(.) != 'modifier']]"/>
+
+ <fo:block wrap-option='no-wrap'
+ white-space-collapse='false'
+ linefeed-treatment="preserve"
+ xsl:use-attribute-sets="monospace.verbatim.properties">
+ <xsl:text> </xsl:text>
+ <xsl:apply-templates select="$start-modifiers" mode="cpp"/>
+
+ <!-- type -->
+ <xsl:if test="local-name($notmod[1]) != 'methodname'">
+ <xsl:apply-templates select="$notmod[1]" mode="cpp"/>
+ </xsl:if>
+
+ <xsl:apply-templates select="methodname" mode="cpp"/>
+ <xsl:text>(</xsl:text>
+ <xsl:apply-templates select="methodparam" mode="cpp"/>
+ <xsl:text>)</xsl:text>
+ <xsl:if test="exceptionname">
+ <xsl:text>&RE;&nbsp;&nbsp;&nbsp;&nbsp;throws&nbsp;</xsl:text>
+ <xsl:apply-templates select="exceptionname" mode="cpp"/>
+ </xsl:if>
+ <xsl:if test="modifier[preceding-sibling::*[local-name(.) != 'modifier']]">
+ <xsl:text> </xsl:text>
+ <xsl:apply-templates select="$end-modifiers" mode="cpp"/>
+ </xsl:if>
+ <xsl:text>;</xsl:text>
+ </fo:block>
+ <xsl:call-template name="synop-break"/>
+</xsl:template>
+
+<!-- ===== IDL ========================================================= -->
+
+<xsl:template match="classsynopsis" mode="idl">
+ <fo:block wrap-option='no-wrap'
+ white-space-collapse='false'
+ linefeed-treatment="preserve"
+ xsl:use-attribute-sets="monospace.verbatim.properties">
+ <xsl:text>interface </xsl:text>
+ <xsl:apply-templates select="ooclass[1]" mode="idl"/>
+ <xsl:if test="ooclass[preceding-sibling::*]">
+ <xsl:text>: </xsl:text>
+ <xsl:apply-templates select="ooclass[preceding-sibling::*]" mode="idl"/>
+ <xsl:if test="oointerface|ooexception">
+ <xsl:text>&RE;&nbsp;&nbsp;&nbsp;&nbsp;</xsl:text>
+ </xsl:if>
+ </xsl:if>
+ <xsl:if test="oointerface">
+ <xsl:text> implements</xsl:text>
+ <xsl:apply-templates select="oointerface" mode="idl"/>
+ <xsl:if test="ooexception">
+ <xsl:text>&RE;&nbsp;&nbsp;&nbsp;&nbsp;</xsl:text>
+ </xsl:if>
+ </xsl:if>
+ <xsl:if test="ooexception">
+ <xsl:text> throws</xsl:text>
+ <xsl:apply-templates select="ooexception" mode="idl"/>
+ </xsl:if>
+ <xsl:text>&nbsp;{&RE;</xsl:text>
+ <xsl:apply-templates select="constructorsynopsis
+ |destructorsynopsis
+ |fieldsynopsis
+ |methodsynopsis
+ |classsynopsisinfo" mode="idl"/>
+ <xsl:text>}</xsl:text>
+ </fo:block>
+</xsl:template>
+
+<xsl:template match="classsynopsisinfo" mode="idl">
+ <xsl:apply-templates mode="idl"/>
+</xsl:template>
+
+<xsl:template match="ooclass|oointerface|ooexception" mode="idl">
+ <xsl:if test="preceding-sibling::*">
+ <xsl:text>, </xsl:text>
+ </xsl:if>
+ <xsl:apply-templates mode="idl"/>
+</xsl:template>
+
+<xsl:template match="modifier|package" mode="idl">
+ <xsl:apply-templates mode="idl"/>
+ <xsl:if test="following-sibling::*">
+ <xsl:text>&nbsp;</xsl:text>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="classname" mode="idl">
+ <xsl:if test="local-name(preceding-sibling::*[1]) = 'classname'">
+ <xsl:text>, </xsl:text>
+ </xsl:if>
+ <xsl:apply-templates mode="idl"/>
+</xsl:template>
+
+<xsl:template match="interfacename" mode="idl">
+ <xsl:if test="local-name(preceding-sibling::*[1]) = 'interfacename'">
+ <xsl:text>, </xsl:text>
+ </xsl:if>
+ <xsl:apply-templates mode="idl"/>
+</xsl:template>
+
+<xsl:template match="exceptionname" mode="idl">
+ <xsl:if test="local-name(preceding-sibling::*[1]) = 'exceptionname'">
+ <xsl:text>, </xsl:text>
+ </xsl:if>
+ <xsl:apply-templates mode="idl"/>
+</xsl:template>
+
+<xsl:template match="fieldsynopsis" mode="idl">
+ <fo:block wrap-option='no-wrap'
+ white-space-collapse='false'
+ linefeed-treatment="preserve"
+ xsl:use-attribute-sets="monospace.verbatim.properties">
+ <xsl:text>&nbsp;&nbsp;</xsl:text>
+ <xsl:apply-templates mode="idl"/>
+ <xsl:text>;</xsl:text>
+ </fo:block>
+ <xsl:call-template name="synop-break"/>
+</xsl:template>
+
+<xsl:template match="type" mode="idl">
+ <xsl:apply-templates mode="idl"/>
+ <xsl:text>&nbsp;</xsl:text>
+</xsl:template>
+
+<xsl:template match="varname" mode="idl">
+ <xsl:apply-templates mode="idl"/>
+ <xsl:text>&nbsp;</xsl:text>
+</xsl:template>
+
+<xsl:template match="initializer" mode="idl">
+ <xsl:text>=&nbsp;</xsl:text>
+ <xsl:apply-templates mode="idl"/>
+</xsl:template>
+
+<xsl:template match="void" mode="idl">
+ <xsl:text>void&nbsp;</xsl:text>
+</xsl:template>
+
+<xsl:template match="methodname" mode="idl">
+ <xsl:apply-templates mode="idl"/>
+</xsl:template>
+
+<xsl:template match="methodparam" mode="idl">
+ <xsl:if test="preceding-sibling::methodparam">
+ <xsl:text>, </xsl:text>
+ </xsl:if>
+ <xsl:apply-templates mode="idl"/>
+</xsl:template>
+
+<xsl:template match="parameter" mode="idl">
+ <xsl:apply-templates mode="idl"/>
+</xsl:template>
+
+<xsl:template mode="idl"
+ match="constructorsynopsis|destructorsynopsis|methodsynopsis">
+ <xsl:variable name="start-modifiers" select="modifier[following-sibling::*[local-name(.) != 'modifier']]"/>
+ <xsl:variable name="notmod" select="*[local-name(.) != 'modifier']"/>
+ <xsl:variable name="end-modifiers" select="modifier[preceding-sibling::*[local-name(.) != 'modifier']]"/>
+
+ <fo:block wrap-option='no-wrap'
+ white-space-collapse='false'
+ linefeed-treatment="preserve"
+ xsl:use-attribute-sets="monospace.verbatim.properties">
+ <xsl:text> </xsl:text>
+ <xsl:apply-templates select="$start-modifiers" mode="idl"/>
+
+ <!-- type -->
+ <xsl:if test="local-name($notmod[1]) != 'methodname'">
+ <xsl:apply-templates select="$notmod[1]" mode="idl"/>
+ </xsl:if>
+
+ <xsl:apply-templates select="methodname" mode="idl"/>
+ <xsl:text>(</xsl:text>
+ <xsl:apply-templates select="methodparam" mode="idl"/>
+ <xsl:text>)</xsl:text>
+ <xsl:if test="exceptionname">
+ <xsl:text>&RE;&nbsp;&nbsp;&nbsp;&nbsp;raises(</xsl:text>
+ <xsl:apply-templates select="exceptionname" mode="idl"/>
+ <xsl:text>)</xsl:text>
+ </xsl:if>
+ <xsl:if test="modifier[preceding-sibling::*[local-name(.) != 'modifier']]">
+ <xsl:text> </xsl:text>
+ <xsl:apply-templates select="$end-modifiers" mode="idl"/>
+ </xsl:if>
+ <xsl:text>;</xsl:text>
+ </fo:block>
+ <xsl:call-template name="synop-break"/>
+</xsl:template>
+
+<!-- ===== Perl ======================================================== -->
+
+<xsl:template match="classsynopsis" mode="perl">
+ <fo:block wrap-option='no-wrap'
+ white-space-collapse='false'
+ linefeed-treatment="preserve"
+ xsl:use-attribute-sets="monospace.verbatim.properties">
+ <xsl:text>package </xsl:text>
+ <xsl:apply-templates select="ooclass[1]" mode="perl"/>
+ <xsl:text>;&RE;</xsl:text>
+
+ <xsl:if test="ooclass[preceding-sibling::*]">
+ <xsl:text>@ISA = (</xsl:text>
+ <xsl:apply-templates select="ooclass[preceding-sibling::*]" mode="perl"/>
+ <xsl:text>);&RE;</xsl:text>
+ </xsl:if>
+
+ <xsl:apply-templates select="constructorsynopsis
+ |destructorsynopsis
+ |fieldsynopsis
+ |methodsynopsis
+ |classsynopsisinfo" mode="perl"/>
+ </fo:block>
+</xsl:template>
+
+<xsl:template match="classsynopsisinfo" mode="perl">
+ <xsl:apply-templates mode="perl"/>
+</xsl:template>
+
+<xsl:template match="ooclass|oointerface|ooexception" mode="perl">
+ <xsl:if test="preceding-sibling::*">
+ <xsl:text>, </xsl:text>
+ </xsl:if>
+ <xsl:apply-templates mode="perl"/>
+</xsl:template>
+
+<xsl:template match="modifier|package" mode="perl">
+ <xsl:apply-templates mode="perl"/>
+ <xsl:if test="following-sibling::*">
+ <xsl:text>&nbsp;</xsl:text>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="classname" mode="perl">
+ <xsl:if test="local-name(preceding-sibling::*[1]) = 'classname'">
+ <xsl:text>, </xsl:text>
+ </xsl:if>
+ <xsl:apply-templates mode="perl"/>
+</xsl:template>
+
+<xsl:template match="interfacename" mode="perl">
+ <xsl:if test="local-name(preceding-sibling::*[1]) = 'interfacename'">
+ <xsl:text>, </xsl:text>
+ </xsl:if>
+ <xsl:apply-templates mode="perl"/>
+</xsl:template>
+
+<xsl:template match="exceptionname" mode="perl">
+ <xsl:if test="local-name(preceding-sibling::*[1]) = 'exceptionname'">
+ <xsl:text>, </xsl:text>
+ </xsl:if>
+ <xsl:apply-templates mode="perl"/>
+</xsl:template>
+
+<xsl:template match="fieldsynopsis" mode="perl">
+ <fo:block wrap-option='no-wrap'
+ white-space-collapse='false'
+ linefeed-treatment="preserve"
+ xsl:use-attribute-sets="monospace.verbatim.properties">
+ <xsl:text>&nbsp;&nbsp;</xsl:text>
+ <xsl:apply-templates mode="perl"/>
+ <xsl:text>;</xsl:text>
+ </fo:block>
+ <xsl:call-template name="synop-break"/>
+</xsl:template>
+
+<xsl:template match="type" mode="perl">
+ <xsl:apply-templates mode="perl"/>
+ <xsl:text>&nbsp;</xsl:text>
+</xsl:template>
+
+<xsl:template match="varname" mode="perl">
+ <xsl:apply-templates mode="perl"/>
+ <xsl:text>&nbsp;</xsl:text>
+</xsl:template>
+
+<xsl:template match="initializer" mode="perl">
+ <xsl:text>=&nbsp;</xsl:text>
+ <xsl:apply-templates mode="perl"/>
+</xsl:template>
+
+<xsl:template match="void" mode="perl">
+ <xsl:text>void&nbsp;</xsl:text>
+</xsl:template>
+
+<xsl:template match="methodname" mode="perl">
+ <xsl:apply-templates mode="perl"/>
+</xsl:template>
+
+<xsl:template match="methodparam" mode="perl">
+ <xsl:if test="preceding-sibling::methodparam">
+ <xsl:text>, </xsl:text>
+ </xsl:if>
+ <xsl:apply-templates mode="perl"/>
+</xsl:template>
+
+<xsl:template match="parameter" mode="perl">
+ <xsl:apply-templates mode="perl"/>
+</xsl:template>
+
+<xsl:template mode="perl"
+ match="constructorsynopsis|destructorsynopsis|methodsynopsis">
+ <xsl:variable name="start-modifiers" select="modifier[following-sibling::*[local-name(.) != 'modifier']]"/>
+ <xsl:variable name="notmod" select="*[local-name(.) != 'modifier']"/>
+ <xsl:variable name="end-modifiers" select="modifier[preceding-sibling::*[local-name(.) != 'modifier']]"/>
+
+ <fo:block wrap-option='no-wrap'
+ white-space-collapse='false'
+ linefeed-treatment="preserve"
+ xsl:use-attribute-sets="monospace.verbatim.properties">
+ <xsl:text>sub </xsl:text>
+
+ <xsl:apply-templates select="methodname" mode="perl"/>
+ <xsl:text> { ... };</xsl:text>
+ <xsl:call-template name="synop-break"/>
+ </fo:block>
+</xsl:template>
+
+<!-- Used when not occurring as a child of classsynopsis -->
+<xsl:template match="ooclass|oointerface|ooexception">
+ <xsl:apply-templates/>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<!-- * DocBook 5 allows linking elements (link, olink, and xref) -->
+<!-- * within the OO *synopsis elements (classsynopsis, fieldsynopsis, -->
+<!-- * methodsynopsis, constructorsynopsis, destructorsynopsis) and -->
+<!-- * their children. So we need to have mode="java|cpp|idl|perl" -->
+<!-- * per-mode matches for those linking elements in order for them -->
+<!-- * to be processed as expected. -->
+
+<xsl:template match="link|olink|xref" mode="java">
+ <xsl:apply-templates select="."/>
+</xsl:template>
+
+<xsl:template match="link|olink|xref" mode="cpp">
+ <xsl:apply-templates select="."/>
+</xsl:template>
+
+<xsl:template match="link|olink|xref" mode="idl">
+ <xsl:apply-templates select="."/>
+</xsl:template>
+
+<xsl:template match="link|olink|xref" mode="perl">
+ <xsl:apply-templates select="."/>
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/table.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/table.xml
new file mode 100644
index 0000000..f29952a
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/table.xml
@@ -0,0 +1,135 @@
+<?xml version="1.0"?>
+
+<reference xml:id="table-templates"><?dbhtml dir="fo"?>
+
+ <info>
+ <title>Formatting Object Table Reference</title>
+ <releaseinfo role="meta">
+ $Id: table.xsl 8814 2010-08-09 21:19:53Z bobstayton $
+ </releaseinfo>
+ </info>
+ <partintro xml:id="partintro">
+ <title>Introduction</title>
+
+<para>This is technical reference documentation for the FO
+ table-processing templates in the DocBook XSL Stylesheets.</para>
+
+
+<para>This is not intended to be user documentation. It is
+ provided for developers writing customization layers for the
+ stylesheets.</para>
+
+ </partintro>
+
+<refentry xmlns:xlink="http://www.w3.org/1999/xlink" xml:id="template.calc.column.width">
+<refnamediv>
+<refname>calc.column.width</refname>
+<refpurpose>Calculate an XSL FO table column width specification from a
+CALS table column width specification.</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+<synopsis>&lt;xsl:template name="calc.column.width"&gt;
+&lt;xsl:param name="colwidth"&gt;1*&lt;/xsl:param&gt;
+ ...
+&lt;/xsl:template&gt;</synopsis>
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>CALS expresses table column widths in the following basic
+forms:</para>
+
+
+
+<itemizedlist>
+<listitem>
+
+<para><emphasis>99.99units</emphasis>, a fixed length specifier.</para>
+
+</listitem>
+<listitem>
+
+<para><emphasis>99.99</emphasis>, a fixed length specifier without any units.</para>
+
+</listitem>
+<listitem>
+
+<para><emphasis>99.99*</emphasis>, a relative length specifier.</para>
+
+</listitem>
+<listitem>
+
+<para><emphasis>99.99*+99.99units</emphasis>, a combination of both.</para>
+
+</listitem>
+</itemizedlist>
+
+
+
+<para>The CALS units are points (pt), picas (pi), centimeters (cm),
+millimeters (mm), and inches (in). These are the same units as XSL,
+except that XSL abbreviates picas "pc" instead of "pi". If a length
+specifier has no units, the CALS default unit (pt) is assumed.</para>
+
+
+
+<para>Relative length specifiers are represented in XSL with the
+proportional-column-width() function.</para>
+
+
+
+<para>Here are some examples:</para>
+
+
+
+<itemizedlist>
+<listitem>
+
+<para>"36pt" becomes "36pt"</para>
+
+</listitem>
+<listitem>
+
+<para>"3pi" becomes "3pc"</para>
+
+</listitem>
+<listitem>
+
+<para>"36" becomes "36pt"</para>
+
+</listitem>
+<listitem>
+
+<para>"3*" becomes "proportional-column-width(3)"</para>
+
+</listitem>
+<listitem>
+
+<para>"3*+2pi" becomes "proportional-column-width(3)+2pc"</para>
+
+</listitem>
+<listitem>
+
+<para>"1*+2" becomes "proportional-column-width(1)+2pt"</para>
+
+</listitem>
+</itemizedlist>
+
+</refsect1><refsect1><title>Parameters</title>
+
+<variablelist>
+<varlistentry><term>colwidth</term>
+<listitem>
+
+<para>The CALS column width specification.</para>
+
+</listitem>
+</varlistentry>
+</variablelist>
+
+</refsect1><refsect1><title>Returns</title>
+
+<para>The XSL column width specification.</para>
+
+</refsect1></refentry>
+</reference>
+
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/table.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/table.xsl
new file mode 100644
index 0000000..c9a60c9
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/table.xsl
@@ -0,0 +1,1681 @@
+<?xml version='1.0'?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:doc="http://nwalsh.com/xsl/documentation/1.0"
+ xmlns:fo="http://www.w3.org/1999/XSL/Format"
+ xmlns:rx="http://www.renderx.com/XSL/Extensions"
+ xmlns:stbl="http://nwalsh.com/xslt/ext/com.nwalsh.saxon.Table"
+ xmlns:xtbl="com.nwalsh.xalan.Table"
+ xmlns:lxslt="http://xml.apache.org/xslt"
+ xmlns:ptbl="http://nwalsh.com/xslt/ext/xsltproc/python/Table"
+ exclude-result-prefixes="doc stbl xtbl lxslt ptbl"
+ version='1.0'>
+
+<xsl:include href="../common/table.xsl"/>
+
+<!-- ********************************************************************
+ $Id: table.xsl 8814 2010-08-09 21:19:53Z bobstayton $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<doc:reference xmlns="" xml:id="table-templates">
+ <?dbhtml dir="fo"?>
+ <info>
+ <title>Formatting Object Table Reference</title>
+ <releaseinfo role="meta">
+ $Id: table.xsl 8814 2010-08-09 21:19:53Z bobstayton $
+ </releaseinfo>
+ </info>
+ <partintro xml:id="partintro">
+ <title>Introduction</title>
+ <para>This is technical reference documentation for the FO
+ table-processing templates in the DocBook XSL Stylesheets.</para>
+ <para>This is not intended to be user documentation. It is
+ provided for developers writing customization layers for the
+ stylesheets.</para>
+ </partintro>
+</doc:reference>
+
+<!-- ==================================================================== -->
+
+<lxslt:component prefix="xtbl"
+ functions="adjustColumnWidths"/>
+
+<!-- ==================================================================== -->
+
+<xsl:template name="make.table.content">
+ <xsl:choose>
+ <xsl:when test="tgroup|mediaobject|graphic">
+ <xsl:call-template name="calsTable"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="." mode="htmlTable"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template name="calsTable">
+
+ <xsl:variable name="keep.together">
+ <xsl:call-template name="pi.dbfo_keep-together"/>
+ </xsl:variable>
+
+ <xsl:for-each select="tgroup">
+
+ <fo:table xsl:use-attribute-sets="table.table.properties">
+ <xsl:if test="$keep.together != ''">
+ <xsl:attribute name="keep-together.within-column">
+ <xsl:value-of select="$keep.together"/>
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:call-template name="table.frame"/>
+ <xsl:if test="following-sibling::tgroup">
+ <xsl:attribute name="border-bottom-width">0pt</xsl:attribute>
+ <xsl:attribute name="border-bottom-style">none</xsl:attribute>
+ <xsl:attribute name="padding-bottom">0pt</xsl:attribute>
+ <xsl:attribute name="margin-bottom">0pt</xsl:attribute>
+ <xsl:attribute name="space-after">0pt</xsl:attribute>
+ <xsl:attribute name="space-after.minimum">0pt</xsl:attribute>
+ <xsl:attribute name="space-after.optimum">0pt</xsl:attribute>
+ <xsl:attribute name="space-after.maximum">0pt</xsl:attribute>
+ </xsl:if>
+ <xsl:if test="preceding-sibling::tgroup">
+ <xsl:attribute name="border-top-width">0pt</xsl:attribute>
+ <xsl:attribute name="border-top-style">none</xsl:attribute>
+ <xsl:attribute name="padding-top">0pt</xsl:attribute>
+ <xsl:attribute name="margin-top">0pt</xsl:attribute>
+ <xsl:attribute name="space-before">0pt</xsl:attribute>
+ <xsl:attribute name="space-before.minimum">0pt</xsl:attribute>
+ <xsl:attribute name="space-before.optimum">0pt</xsl:attribute>
+ <xsl:attribute name="space-before.maximum">0pt</xsl:attribute>
+ </xsl:if>
+ <xsl:apply-templates select="."/>
+ </fo:table>
+
+ <xsl:for-each select="mediaobject|graphic">
+ <xsl:apply-templates select="."/>
+ </xsl:for-each>
+
+ </xsl:for-each>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<!-- Placeholder template enables wrapping a fo:table in
+ another table for purposes of layout or applying
+ extensions such as XEP table-omit-initial-header to
+ create "continued" titles on page breaks. -->
+<xsl:template name="table.layout">
+ <xsl:param name="table.content" select="NOTANODE"/>
+
+ <xsl:copy-of select="$table.content"/>
+</xsl:template>
+
+<xsl:template name="table.block">
+ <xsl:param name="table.layout" select="NOTANODE"/>
+
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+
+ <xsl:variable name="param.placement"
+ select="substring-after(normalize-space(
+ $formal.title.placement), concat(local-name(.), ' '))"/>
+
+ <xsl:variable name="placement">
+ <xsl:choose>
+ <xsl:when test="contains($param.placement, ' ')">
+ <xsl:value-of select="substring-before($param.placement, ' ')"/>
+ </xsl:when>
+ <xsl:when test="$param.placement = ''">before</xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$param.placement"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="keep.together">
+ <xsl:call-template name="pi.dbfo_keep-together"/>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="self::table">
+ <fo:block id="{$id}"
+ xsl:use-attribute-sets="table.properties">
+ <xsl:if test="$keep.together != ''">
+ <xsl:attribute name="keep-together.within-column">
+ <xsl:value-of select="$keep.together"/>
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:if test="$placement = 'before'">
+ <xsl:call-template name="formal.object.heading">
+ <xsl:with-param name="placement" select="$placement"/>
+ </xsl:call-template>
+ </xsl:if>
+ <xsl:copy-of select="$table.layout"/>
+ <xsl:call-template name="table.footnote.block"/>
+ <xsl:if test="$placement != 'before'">
+ <xsl:call-template name="formal.object.heading">
+ <xsl:with-param name="placement" select="$placement"/>
+ </xsl:call-template>
+ </xsl:if>
+ </fo:block>
+ </xsl:when>
+ <xsl:otherwise>
+ <fo:block id="{$id}"
+ xsl:use-attribute-sets="informaltable.properties">
+ <xsl:copy-of select="$table.layout"/>
+ <xsl:call-template name="table.footnote.block"/>
+ </fo:block>
+ </xsl:otherwise>
+ </xsl:choose>
+
+
+</xsl:template>
+
+<!-- Output a table's footnotes in a block -->
+<xsl:template name="table.footnote.block">
+ <xsl:if test=".//footnote">
+ <fo:block keep-with-previous.within-column="always">
+ <xsl:apply-templates select=".//footnote" mode="table.footnote.mode"/>
+ </fo:block>
+ </xsl:if>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template name="table.container">
+ <xsl:param name="table.block"/>
+ <xsl:choose>
+ <xsl:when test="@orient='land' and
+ $fop.extensions = 0 and
+ $passivetex.extensions = 0" >
+ <fo:block-container reference-orientation="90"
+ padding="6pt"
+ xsl:use-attribute-sets="list.block.spacing">
+ <xsl:attribute name="width">
+ <xsl:call-template name="table.width"/>
+ </xsl:attribute>
+ <fo:block start-indent="0pt" end-indent="0pt">
+ <xsl:copy-of select="$table.block"/>
+ </fo:block>
+ </fo:block-container>
+ </xsl:when>
+ <xsl:when test="@pgwide = 1">
+ <fo:block xsl:use-attribute-sets="pgwide.properties">
+ <xsl:copy-of select="$table.block"/>
+ </fo:block>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:copy-of select="$table.block"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template name="empty.table.cell">
+ <xsl:param name="colnum" select="0"/>
+
+ <xsl:variable name="rowsep">
+ <xsl:choose>
+ <!-- If this is the last row, rowsep never applies (except when
+ the ancestor tgroup has a following sibling tgroup) -->
+ <xsl:when test="not(ancestor-or-self::row[1]/following-sibling::row
+ or ancestor-or-self::thead/following-sibling::tbody
+ or ancestor-or-self::tbody/preceding-sibling::tfoot)
+ and not(ancestor::tgroup/following-sibling::tgroup)">
+ <xsl:value-of select="0"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="inherited.table.attribute">
+ <xsl:with-param name="entry" select="NOT-AN-ELEMENT-NAME"/>
+ <xsl:with-param name="row" select="ancestor-or-self::row[1]"/>
+ <xsl:with-param name="colnum" select="$colnum"/>
+ <xsl:with-param name="attribute" select="'rowsep'"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="colsep">
+ <xsl:choose>
+ <!-- If this is the last column, colsep never applies. -->
+ <xsl:when test="number($colnum) &gt;= ancestor::tgroup/@cols">0</xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="inherited.table.attribute">
+ <xsl:with-param name="entry" select="NOT-AN-ELEMENT-NAME"/>
+ <xsl:with-param name="row" select="ancestor-or-self::row[1]"/>
+ <xsl:with-param name="colnum" select="$colnum"/>
+ <xsl:with-param name="attribute" select="'colsep'"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <fo:table-cell text-align="center"
+ display-align="center"
+ xsl:use-attribute-sets="table.cell.padding">
+ <xsl:if test="$xep.extensions != 0">
+ <!-- Suggested by RenderX to workaround a bug in their implementation -->
+ <xsl:attribute name="keep-together.within-column">always</xsl:attribute>
+ </xsl:if>
+ <xsl:if test="$rowsep &gt; 0">
+ <xsl:call-template name="border">
+ <xsl:with-param name="side" select="'bottom'"/>
+ </xsl:call-template>
+ </xsl:if>
+
+ <xsl:if test="$colsep &gt; 0 and number($colnum) &lt; ancestor::tgroup/@cols">
+ <xsl:call-template name="border">
+ <xsl:with-param name="side" select="'end'"/>
+ </xsl:call-template>
+ </xsl:if>
+
+ <!-- fo:table-cell should not be empty -->
+ <fo:block/>
+ </fo:table-cell>
+</xsl:template>
+
+<!-- ==================================================================== -->
+<xsl:template name="table.frame">
+ <xsl:param name="frame">
+ <xsl:choose>
+ <xsl:when test="../@frame">
+ <xsl:value-of select="../@frame"/>
+ </xsl:when>
+ <xsl:when test="$default.table.frame != ''">
+ <xsl:value-of select="$default.table.frame"/>
+ </xsl:when>
+ <xsl:otherwise>all</xsl:otherwise>
+ </xsl:choose>
+ </xsl:param>
+
+
+ <xsl:choose>
+ <xsl:when test="$frame='all'">
+ <xsl:attribute name="border-start-style">
+ <xsl:value-of select="$table.frame.border.style"/>
+ </xsl:attribute>
+ <xsl:attribute name="border-end-style">
+ <xsl:value-of select="$table.frame.border.style"/>
+ </xsl:attribute>
+ <xsl:attribute name="border-top-style">
+ <xsl:value-of select="$table.frame.border.style"/>
+ </xsl:attribute>
+ <xsl:attribute name="border-bottom-style">
+ <xsl:value-of select="$table.frame.border.style"/>
+ </xsl:attribute>
+ <xsl:attribute name="border-start-width">
+ <xsl:value-of select="$table.frame.border.thickness"/>
+ </xsl:attribute>
+ <xsl:attribute name="border-end-width">
+ <xsl:value-of select="$table.frame.border.thickness"/>
+ </xsl:attribute>
+ <xsl:attribute name="border-top-width">
+ <xsl:value-of select="$table.frame.border.thickness"/>
+ </xsl:attribute>
+ <xsl:attribute name="border-bottom-width">
+ <xsl:value-of select="$table.frame.border.thickness"/>
+ </xsl:attribute>
+ <xsl:attribute name="border-start-color">
+ <xsl:value-of select="$table.frame.border.color"/>
+ </xsl:attribute>
+ <xsl:attribute name="border-end-color">
+ <xsl:value-of select="$table.frame.border.color"/>
+ </xsl:attribute>
+ <xsl:attribute name="border-top-color">
+ <xsl:value-of select="$table.frame.border.color"/>
+ </xsl:attribute>
+ <xsl:attribute name="border-bottom-color">
+ <xsl:value-of select="$table.frame.border.color"/>
+ </xsl:attribute>
+ </xsl:when>
+ <xsl:when test="$frame='bottom'">
+ <xsl:attribute name="border-start-style">none</xsl:attribute>
+ <xsl:attribute name="border-end-style">none</xsl:attribute>
+ <xsl:attribute name="border-top-style">none</xsl:attribute>
+ <xsl:attribute name="border-bottom-style">
+ <xsl:value-of select="$table.frame.border.style"/>
+ </xsl:attribute>
+ <xsl:attribute name="border-bottom-width">
+ <xsl:value-of select="$table.frame.border.thickness"/>
+ </xsl:attribute>
+ <xsl:attribute name="border-bottom-color">
+ <xsl:value-of select="$table.frame.border.color"/>
+ </xsl:attribute>
+ </xsl:when>
+ <xsl:when test="$frame='sides'">
+ <xsl:attribute name="border-start-style">
+ <xsl:value-of select="$table.frame.border.style"/>
+ </xsl:attribute>
+ <xsl:attribute name="border-end-style">
+ <xsl:value-of select="$table.frame.border.style"/>
+ </xsl:attribute>
+ <xsl:attribute name="border-top-style">none</xsl:attribute>
+ <xsl:attribute name="border-bottom-style">none</xsl:attribute>
+ <xsl:attribute name="border-start-width">
+ <xsl:value-of select="$table.frame.border.thickness"/>
+ </xsl:attribute>
+ <xsl:attribute name="border-end-width">
+ <xsl:value-of select="$table.frame.border.thickness"/>
+ </xsl:attribute>
+ <xsl:attribute name="border-start-color">
+ <xsl:value-of select="$table.frame.border.color"/>
+ </xsl:attribute>
+ <xsl:attribute name="border-end-color">
+ <xsl:value-of select="$table.frame.border.color"/>
+ </xsl:attribute>
+ </xsl:when>
+ <xsl:when test="$frame='lhs'">
+ <xsl:attribute name="border-start-style">
+ <xsl:value-of select="$table.frame.border.style"/>
+ </xsl:attribute>
+ <xsl:attribute name="border-end-style">none</xsl:attribute>
+ <xsl:attribute name="border-top-style">none</xsl:attribute>
+ <xsl:attribute name="border-bottom-style">none</xsl:attribute>
+ <xsl:attribute name="border-start-width">
+ <xsl:value-of select="$table.frame.border.thickness"/>
+ </xsl:attribute>
+ <xsl:attribute name="border-start-color">
+ <xsl:value-of select="$table.frame.border.color"/>
+ </xsl:attribute>
+ </xsl:when>
+ <xsl:when test="$frame='rhs'">
+ <xsl:attribute name="border-end-style">
+ <xsl:value-of select="$table.frame.border.style"/>
+ </xsl:attribute>
+ <xsl:attribute name="border-end-style">none</xsl:attribute>
+ <xsl:attribute name="border-top-style">none</xsl:attribute>
+ <xsl:attribute name="border-bottom-style">none</xsl:attribute>
+ <xsl:attribute name="border-end-width">
+ <xsl:value-of select="$table.frame.border.thickness"/>
+ </xsl:attribute>
+ <xsl:attribute name="border-end-color">
+ <xsl:value-of select="$table.frame.border.color"/>
+ </xsl:attribute>
+ </xsl:when>
+ <xsl:when test="$frame='top'">
+ <xsl:attribute name="border-start-style">none</xsl:attribute>
+ <xsl:attribute name="border-end-style">none</xsl:attribute>
+ <xsl:attribute name="border-top-style">
+ <xsl:value-of select="$table.frame.border.style"/>
+ </xsl:attribute>
+ <xsl:attribute name="border-bottom-style">none</xsl:attribute>
+ <xsl:attribute name="border-top-width">
+ <xsl:value-of select="$table.frame.border.thickness"/>
+ </xsl:attribute>
+ <xsl:attribute name="border-top-color">
+ <xsl:value-of select="$table.frame.border.color"/>
+ </xsl:attribute>
+ </xsl:when>
+ <xsl:when test="$frame='topbot'">
+ <xsl:attribute name="border-start-style">none</xsl:attribute>
+ <xsl:attribute name="border-end-style">none</xsl:attribute>
+ <xsl:attribute name="border-top-style">
+ <xsl:value-of select="$table.frame.border.style"/>
+ </xsl:attribute>
+ <xsl:attribute name="border-bottom-style">
+ <xsl:value-of select="$table.frame.border.style"/>
+ </xsl:attribute>
+ <xsl:attribute name="border-top-width">
+ <xsl:value-of select="$table.frame.border.thickness"/>
+ </xsl:attribute>
+ <xsl:attribute name="border-bottom-width">
+ <xsl:value-of select="$table.frame.border.thickness"/>
+ </xsl:attribute>
+ <xsl:attribute name="border-top-color">
+ <xsl:value-of select="$table.frame.border.color"/>
+ </xsl:attribute>
+ <xsl:attribute name="border-bottom-color">
+ <xsl:value-of select="$table.frame.border.color"/>
+ </xsl:attribute>
+ </xsl:when>
+ <xsl:when test="$frame='none'">
+ <xsl:attribute name="border-start-style">none</xsl:attribute>
+ <xsl:attribute name="border-end-style">none</xsl:attribute>
+ <xsl:attribute name="border-top-style">none</xsl:attribute>
+ <xsl:attribute name="border-bottom-style">none</xsl:attribute>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:message>
+ <xsl:text>Impossible frame on table: </xsl:text>
+ <xsl:value-of select="$frame"/>
+ </xsl:message>
+ <xsl:attribute name="border-start-style">none</xsl:attribute>
+ <xsl:attribute name="border-end-style">none</xsl:attribute>
+ <xsl:attribute name="border-top-style">none</xsl:attribute>
+ <xsl:attribute name="border-bottom-style">none</xsl:attribute>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template name="border">
+ <xsl:param name="side" select="'start'"/>
+
+ <xsl:attribute name="border-{$side}-width">
+ <xsl:value-of select="$table.cell.border.thickness"/>
+ </xsl:attribute>
+ <xsl:attribute name="border-{$side}-style">
+ <xsl:value-of select="$table.cell.border.style"/>
+ </xsl:attribute>
+ <xsl:attribute name="border-{$side}-color">
+ <xsl:value-of select="$table.cell.border.color"/>
+ </xsl:attribute>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="tgroup" name="tgroup">
+ <xsl:if test="not(@cols) or @cols = '' or string(number(@cols)) = 'NaN'">
+ <xsl:message terminate="yes">
+ <xsl:text>Error: CALS tables must specify the number of columns.</xsl:text>
+ </xsl:message>
+ </xsl:if>
+
+ <xsl:variable name="table.width">
+ <xsl:call-template name="table.width"/>
+ </xsl:variable>
+
+ <xsl:variable name="colspecs">
+ <xsl:choose>
+ <xsl:when test="$use.extensions != 0
+ and $tablecolumns.extension != 0">
+ <xsl:call-template name="generate.colgroup.raw">
+ <xsl:with-param name="cols" select="@cols"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="generate.colgroup">
+ <xsl:with-param name="cols" select="@cols"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="prop-columns"
+ select=".//colspec[contains(@colwidth, '*')]"/>
+ <xsl:if test="count($prop-columns) != 0 or
+ $fop.extensions != 0 or
+ $fop1.extensions != 0 or
+ $passivetex.extensions != 0">
+ <xsl:attribute name="table-layout">fixed</xsl:attribute>
+ </xsl:if>
+
+ <xsl:attribute name="width">
+ <xsl:value-of select="$table.width"/>
+ </xsl:attribute>
+
+ <xsl:choose>
+ <xsl:when test="$use.extensions != 0
+ and $tablecolumns.extension != 0">
+ <xsl:choose>
+ <xsl:when test="function-available('stbl:adjustColumnWidths')">
+ <xsl:copy-of select="stbl:adjustColumnWidths($colspecs)"/>
+ </xsl:when>
+ <xsl:when test="function-available('xtbl:adjustColumnWidths')">
+ <xsl:copy-of select="xtbl:adjustColumnWidths($colspecs)"/>
+ </xsl:when>
+ <xsl:when test="function-available('ptbl:adjustColumnWidths')">
+ <xsl:copy-of select="ptbl:adjustColumnWidths($colspecs)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:message terminate="yes">
+ <xsl:text>No adjustColumnWidths function available.</xsl:text>
+ </xsl:message>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:copy-of select="$colspecs"/>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:apply-templates select="thead"/>
+ <xsl:apply-templates select="tfoot"/>
+ <xsl:apply-templates select="tbody"/>
+</xsl:template>
+
+<xsl:template match="colspec"></xsl:template>
+
+<xsl:template name="table.width">
+
+ <xsl:variable name="numcols">
+ <xsl:call-template name="widest-html-row">
+ <xsl:with-param name="rows" select=".//tr"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="explicit.table.width">
+ <xsl:choose>
+ <xsl:when test="self::entrytbl">
+ <xsl:call-template name="pi.dbfo_table-width"/>
+ </xsl:when>
+ <xsl:when test="self::table or self::informaltable">
+ <xsl:call-template name="pi.dbfo_table-width"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <!-- * no dbfo@table-width PI as a child of this table, so check -->
+ <!-- * the parent of this table to see if the table has any -->
+ <!-- * sibling dbfo@table-width PIs (FIXME: 2007-07 MikeSmith: we -->
+ <!-- * should really instead be checking here just to see if the -->
+ <!-- * first preceding sibling of this table is a -->
+ <!-- * dbfo@table-width PI) -->
+ <xsl:call-template name="pi.dbfo_table-width">
+ <xsl:with-param name="node" select=".."/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="column.sum">
+ <xsl:choose>
+ <!-- CALS table -->
+ <xsl:when test="tgroup/@cols">
+ <!-- change context to the first tgroup -->
+ <xsl:for-each select="tgroup[1]">
+ <xsl:if test="count(colspec) = @cols">
+ <xsl:for-each select="colspec">
+ <xsl:if test="position() != 1">
+ <xsl:text> + </xsl:text>
+ </xsl:if>
+ <xsl:choose>
+ <xsl:when test="not(@colwidth)">NOWIDTH</xsl:when>
+ <xsl:when test="contains(@colwidth, '*')">NOWIDTH</xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="@colwidth"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:for-each>
+ </xsl:if>
+ </xsl:for-each>
+ </xsl:when>
+ <xsl:otherwise>
+ <!-- HTML table -->
+ <xsl:if test="count(col|colgroup/col) = $numcols">
+ <xsl:for-each select="col|colgroup/col">
+ <xsl:if test="position() != 1">
+ <xsl:text> + </xsl:text>
+ </xsl:if>
+ <xsl:choose>
+ <xsl:when test="not(@width)">NOWIDTH</xsl:when>
+ <xsl:when test="contains(@width, '%')">NOWIDTH</xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="@width"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:for-each>
+ </xsl:if>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="column.sum.width">
+ <xsl:if test="not(contains($column.sum, 'NOWIDTH'))">
+ <xsl:value-of select="$column.sum"/>
+ </xsl:if>
+ </xsl:variable>
+
+ <xsl:variable name="prop-columns"
+ select=".//colspec[contains(@colwidth, '*')]"/>
+
+ <xsl:variable name="table.width">
+ <xsl:choose>
+ <xsl:when test="$explicit.table.width != ''">
+ <xsl:value-of select="$explicit.table.width"/>
+ </xsl:when>
+ <xsl:when test="$column.sum.width != ''">
+ <xsl:value-of select="$column.sum.width"/>
+ </xsl:when>
+ <xsl:when test="$default.table.width = ''">
+ <xsl:choose>
+ <!-- These processors don't support table-layout="auto" -->
+ <xsl:when test="$fop.extensions != 0 or
+ $fop1.extensions != 0 or
+ $passivetex.extensions != 0">
+ <xsl:text>100%</xsl:text>
+ </xsl:when>
+ <!-- Proportional columns imply 100% width -->
+ <xsl:when test="count($prop-columns) != 0">
+ <xsl:text>100%</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text>auto</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$default.table.width"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:value-of select="$table.width"/>
+
+</xsl:template>
+
+<xsl:template match="spanspec"></xsl:template>
+
+<xsl:template match="thead">
+ <xsl:variable name="tgroup" select="parent::*"/>
+
+ <fo:table-header start-indent="0pt" end-indent="0pt">
+ <xsl:choose>
+ <!-- Use recursion if @morerows is used -->
+ <xsl:when test="row/entry/@morerows|ro/entrytbl/@morerows">
+ <xsl:apply-templates select="row[1]">
+ <xsl:with-param name="spans">
+ <xsl:call-template name="blank.spans">
+ <xsl:with-param name="cols" select="../@cols"/>
+ </xsl:call-template>
+ </xsl:with-param>
+ <xsl:with-param name="browserows" select="'recurse'"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="row">
+ <xsl:with-param name="spans">
+ <xsl:call-template name="blank.spans">
+ <xsl:with-param name="cols" select="../@cols"/>
+ </xsl:call-template>
+ </xsl:with-param>
+ <xsl:with-param name="browserows" select="'loop'" />
+ </xsl:apply-templates>
+ </xsl:otherwise>
+ </xsl:choose>
+ </fo:table-header>
+</xsl:template>
+
+<xsl:template match="tfoot">
+ <xsl:variable name="tgroup" select="parent::*"/>
+
+ <fo:table-footer start-indent="0pt" end-indent="0pt">
+ <xsl:choose>
+ <!-- Use recursion if @morerows is used -->
+ <xsl:when test="row/entry/@morerows|ro/entrytbl/@morerows">
+ <xsl:apply-templates select="row[1]">
+ <xsl:with-param name="spans">
+ <xsl:call-template name="blank.spans">
+ <xsl:with-param name="cols" select="../@cols"/>
+ </xsl:call-template>
+ </xsl:with-param>
+ <xsl:with-param name="browserows" select="'recurse'"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="row">
+ <xsl:with-param name="spans">
+ <xsl:call-template name="blank.spans">
+ <xsl:with-param name="cols" select="../@cols"/>
+ </xsl:call-template>
+ </xsl:with-param>
+ <xsl:with-param name="browserows" select="'loop'" />
+ </xsl:apply-templates>
+ </xsl:otherwise>
+ </xsl:choose>
+ </fo:table-footer>
+</xsl:template>
+
+<xsl:template match="tbody">
+ <xsl:variable name="tgroup" select="parent::*"/>
+
+ <fo:table-body start-indent="0pt" end-indent="0pt">
+ <xsl:choose>
+ <!-- Use recursion if @morerows is used -->
+ <xsl:when test="row/entry/@morerows|ro/entrytbl/@morerows">
+ <xsl:apply-templates select="row[1]">
+ <xsl:with-param name="spans">
+ <xsl:call-template name="blank.spans">
+ <xsl:with-param name="cols" select="../@cols"/>
+ </xsl:call-template>
+ </xsl:with-param>
+ <xsl:with-param name="browserows" select="'recurse'"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="row">
+ <xsl:with-param name="spans">
+ <xsl:call-template name="blank.spans">
+ <xsl:with-param name="cols" select="../@cols"/>
+ </xsl:call-template>
+ </xsl:with-param>
+ <xsl:with-param name="browserows" select="'loop'" />
+ </xsl:apply-templates>
+ </xsl:otherwise>
+ </xsl:choose>
+ </fo:table-body>
+</xsl:template>
+
+<xsl:template match="row">
+ <xsl:param name="spans"/>
+ <xsl:param name="browserows"/>
+
+ <xsl:choose>
+ <xsl:when test="contains($spans, '0')">
+ <xsl:call-template name="normal-row">
+ <xsl:with-param name="spans" select="$spans"/>
+ <xsl:with-param name="browserows" select="$browserows"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <!--
+ <xsl:message>
+ <xsl:text>Ignoring row: </xsl:text>
+ <xsl:value-of select="$spans"/>
+ <xsl:text> = </xsl:text>
+ <xsl:call-template name="consume-row">
+ <xsl:with-param name="spans" select="$spans"/>
+ </xsl:call-template>
+ </xsl:message>
+ -->
+
+ <xsl:if test="normalize-space(.//text()) != ''">
+ <xsl:message>Warning: overlapped row contains content!</xsl:message>
+ </xsl:if>
+
+ <fo:table-row>
+ <xsl:comment> This row intentionally left blank </xsl:comment>
+ <fo:table-cell><fo:block/></fo:table-cell>
+ </fo:table-row>
+
+ <xsl:if test="$browserows = 'recurse'">
+ <xsl:apply-templates select="following-sibling::row[1]">
+ <xsl:with-param name="spans">
+ <xsl:call-template name="consume-row">
+ <xsl:with-param name="spans" select="$spans"/>
+ </xsl:call-template>
+ </xsl:with-param>
+ </xsl:apply-templates>
+ </xsl:if>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="normal-row">
+ <xsl:param name="spans"/>
+ <xsl:param name="browserows"/>
+
+ <fo:table-row>
+ <xsl:call-template name="table.row.properties"/>
+ <xsl:call-template name="anchor"/>
+
+ <xsl:apply-templates select="(entry|entrytbl)[1]">
+ <xsl:with-param name="spans" select="$spans"/>
+ </xsl:apply-templates>
+ </fo:table-row>
+
+ <xsl:if test="$browserows = 'recurse'">
+ <xsl:if test="following-sibling::row">
+ <xsl:variable name="nextspans">
+ <xsl:apply-templates select="(entry|entrytbl)[1]" mode="span">
+ <xsl:with-param name="spans" select="$spans"/>
+ </xsl:apply-templates>
+ </xsl:variable>
+
+ <xsl:apply-templates select="following-sibling::row[1]">
+ <xsl:with-param name="spans" select="$nextspans"/>
+ <xsl:with-param name="browserows" select="$browserows"/>
+ </xsl:apply-templates>
+ </xsl:if>
+ </xsl:if>
+</xsl:template>
+
+<!-- customize this template to add row properties -->
+<xsl:template name="table.row.properties">
+
+ <xsl:variable name="row-height">
+ <xsl:if test="processing-instruction('dbfo')">
+ <xsl:call-template name="pi.dbfo_row-height"/>
+ </xsl:if>
+ </xsl:variable>
+
+ <xsl:if test="$row-height != ''">
+ <xsl:attribute name="block-progression-dimension">
+ <xsl:value-of select="$row-height"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:variable name="bgcolor">
+ <xsl:call-template name="pi.dbfo_bgcolor"/>
+ </xsl:variable>
+
+ <xsl:if test="$bgcolor != ''">
+ <xsl:attribute name="background-color">
+ <xsl:value-of select="$bgcolor"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <!-- Keep header row with next row -->
+ <xsl:if test="ancestor::thead">
+ <xsl:attribute name="keep-with-next.within-column">always</xsl:attribute>
+ </xsl:if>
+
+</xsl:template>
+
+<xsl:template match="entry|entrytbl" name="entry">
+ <xsl:param name="col" select="1"/>
+ <xsl:param name="spans"/>
+
+ <xsl:variable name="row" select="parent::row"/>
+ <xsl:variable name="group" select="$row/parent::*[1]"/>
+ <xsl:variable name="frame" select="ancestor::tgroup/parent::*/@frame"/>
+
+ <xsl:variable name="empty.cell" select="count(node()) = 0"/>
+
+ <xsl:variable name="named.colnum">
+ <xsl:call-template name="entry.colnum"/>
+ </xsl:variable>
+
+ <xsl:variable name="entry.colnum">
+ <xsl:choose>
+ <xsl:when test="$named.colnum &gt; 0">
+ <xsl:value-of select="$named.colnum"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$col"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="entry.colspan">
+ <xsl:choose>
+ <xsl:when test="@spanname or @namest">
+ <xsl:call-template name="calculate.colspan"/>
+ </xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="following.spans">
+ <xsl:call-template name="calculate.following.spans">
+ <xsl:with-param name="colspan" select="$entry.colspan"/>
+ <xsl:with-param name="spans" select="$spans"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="rowsep">
+ <xsl:choose>
+ <!-- If this is the last row, rowsep never applies (except when
+ the ancestor tgroup has a following sibling tgroup) -->
+ <xsl:when test="not(ancestor-or-self::row[1]/following-sibling::row
+ or ancestor-or-self::thead/following-sibling::tbody
+ or ancestor-or-self::tbody/preceding-sibling::tfoot)
+ and not(ancestor::tgroup/following-sibling::tgroup)">
+ <xsl:value-of select="0"/>
+ </xsl:when>
+ <!-- Check for morerows too -->
+ <xsl:when test="(@morerows and count(ancestor-or-self::row[1]/
+ following-sibling::row) = @morerows )
+ and not (ancestor-or-self::thead/following-sibling::tbody
+ or ancestor-or-self::tbody/preceding-sibling::tfoot)
+ and not(ancestor::tgroup/following-sibling::tgroup)">
+ <xsl:value-of select="0"/>
+ </xsl:when>
+
+ <xsl:otherwise>
+ <xsl:call-template name="inherited.table.attribute">
+ <xsl:with-param name="entry" select="."/>
+ <xsl:with-param name="colnum" select="$entry.colnum"/>
+ <xsl:with-param name="attribute" select="'rowsep'"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+<!--
+ <xsl:message><xsl:value-of select="."/>: <xsl:value-of select="$rowsep"/></xsl:message>
+-->
+
+ <xsl:variable name="colsep">
+ <xsl:choose>
+ <!-- If this is the last column, colsep never applies. -->
+ <xsl:when test="$following.spans = ''">0</xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="inherited.table.attribute">
+ <xsl:with-param name="entry" select="."/>
+ <xsl:with-param name="colnum" select="$entry.colnum"/>
+ <xsl:with-param name="attribute" select="'colsep'"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="valign">
+ <xsl:call-template name="inherited.table.attribute">
+ <xsl:with-param name="entry" select="."/>
+ <xsl:with-param name="colnum" select="$entry.colnum"/>
+ <xsl:with-param name="attribute" select="'valign'"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="align">
+ <xsl:call-template name="inherited.table.attribute">
+ <xsl:with-param name="entry" select="."/>
+ <xsl:with-param name="colnum" select="$entry.colnum"/>
+ <xsl:with-param name="attribute" select="'align'"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="char">
+ <xsl:call-template name="inherited.table.attribute">
+ <xsl:with-param name="entry" select="."/>
+ <xsl:with-param name="colnum" select="$entry.colnum"/>
+ <xsl:with-param name="attribute" select="'char'"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="charoff">
+ <xsl:call-template name="inherited.table.attribute">
+ <xsl:with-param name="entry" select="."/>
+ <xsl:with-param name="colnum" select="$entry.colnum"/>
+ <xsl:with-param name="attribute" select="'charoff'"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="$spans != '' and not(starts-with($spans,'0:'))">
+ <xsl:call-template name="entry">
+ <xsl:with-param name="col" select="$col+1"/>
+ <xsl:with-param name="spans" select="substring-after($spans,':')"/>
+ </xsl:call-template>
+ </xsl:when>
+
+ <xsl:when test="number($entry.colnum) &gt; $col">
+ <xsl:call-template name="empty.table.cell">
+ <xsl:with-param name="colnum" select="$col"/>
+ </xsl:call-template>
+ <xsl:call-template name="entry">
+ <xsl:with-param name="col" select="$col+1"/>
+ <xsl:with-param name="spans" select="substring-after($spans,':')"/>
+ </xsl:call-template>
+ </xsl:when>
+
+ <xsl:otherwise>
+ <xsl:variable name="cell.content">
+ <fo:block>
+ <xsl:call-template name="table.cell.block.properties"/>
+
+ <!-- are we missing any indexterms? -->
+ <xsl:if test="not(preceding-sibling::entry)
+ and not(parent::row/preceding-sibling::row)">
+ <!-- this is the first entry of the first row -->
+ <xsl:if test="ancestor::thead or
+ (ancestor::tbody
+ and not(ancestor::tbody/preceding-sibling::thead
+ or ancestor::tbody/preceding-sibling::tbody))">
+ <!-- of the thead or the first tbody -->
+ <xsl:apply-templates select="ancestor::tgroup/preceding-sibling::indexterm"/>
+ </xsl:if>
+ </xsl:if>
+
+ <!--
+ <xsl:text>(</xsl:text>
+ <xsl:value-of select="$rowsep"/>
+ <xsl:text>,</xsl:text>
+ <xsl:value-of select="$colsep"/>
+ <xsl:text>)</xsl:text>
+ -->
+ <xsl:choose>
+ <xsl:when test="$empty.cell">
+ <xsl:text>&#160;</xsl:text>
+ </xsl:when>
+ <xsl:when test="self::entrytbl">
+ <xsl:variable name="prop-columns"
+ select=".//colspec[contains(@colwidth, '*')]"/>
+ <fo:table xsl:use-attribute-sets="table.table.properties">
+ <xsl:if test="count($prop-columns) != 0">
+ <xsl:attribute name="table-layout">fixed</xsl:attribute>
+ </xsl:if>
+ <xsl:call-template name="tgroup"/>
+ </fo:table>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </fo:block>
+ </xsl:variable>
+
+ <xsl:variable name="cell-orientation">
+ <xsl:call-template name="pi.dbfo_orientation">
+ <xsl:with-param name="node" select="ancestor-or-self::entry"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="row-orientation">
+ <xsl:call-template name="pi.dbfo_orientation">
+ <xsl:with-param name="node" select="ancestor-or-self::row"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="cell-width">
+ <xsl:call-template name="pi.dbfo_rotated-width">
+ <xsl:with-param name="node" select="ancestor-or-self::entry"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="row-width">
+ <xsl:call-template name="pi.dbfo_rotated-width">
+ <xsl:with-param name="node" select="ancestor-or-self::row"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="orientation">
+ <xsl:choose>
+ <xsl:when test="$cell-orientation != ''">
+ <xsl:value-of select="$cell-orientation"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$row-orientation"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="rotated-width">
+ <xsl:choose>
+ <xsl:when test="$cell-width != ''">
+ <xsl:value-of select="$cell-width"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$row-width"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="bgcolor">
+ <xsl:call-template name="pi.dbfo_bgcolor">
+ <xsl:with-param name="node" select="ancestor-or-self::entry"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <fo:table-cell xsl:use-attribute-sets="table.cell.padding">
+ <xsl:call-template name="table.cell.properties">
+ <xsl:with-param name="bgcolor.pi" select="$bgcolor"/>
+ <xsl:with-param name="rowsep.inherit" select="$rowsep"/>
+ <xsl:with-param name="colsep.inherit" select="$colsep"/>
+ <xsl:with-param name="col" select="$col"/>
+ <xsl:with-param name="valign.inherit" select="$valign"/>
+ <xsl:with-param name="align.inherit" select="$align"/>
+ <xsl:with-param name="char.inherit" select="$char"/>
+ </xsl:call-template>
+
+ <xsl:call-template name="anchor"/>
+
+ <xsl:if test="@morerows">
+ <xsl:attribute name="number-rows-spanned">
+ <xsl:value-of select="@morerows+1"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:if test="$entry.colspan &gt; 1">
+ <xsl:attribute name="number-columns-spanned">
+ <xsl:value-of select="$entry.colspan"/>
+ </xsl:attribute>
+ </xsl:if>
+
+<!--
+ <xsl:if test="@charoff">
+ <xsl:attribute name="charoff">
+ <xsl:value-of select="@charoff"/>
+ </xsl:attribute>
+ </xsl:if>
+-->
+
+ <xsl:choose>
+ <xsl:when test="$fop.extensions = 0 and $passivetex.extensions = 0
+ and $orientation != ''">
+ <fo:block-container reference-orientation="{$orientation}">
+ <xsl:if test="$rotated-width != ''">
+ <xsl:attribute name="width">
+ <xsl:value-of select="$rotated-width"/>
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:copy-of select="$cell.content"/>
+ </fo:block-container>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:copy-of select="$cell.content"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </fo:table-cell>
+
+ <xsl:choose>
+ <xsl:when test="following-sibling::entry|following-sibling::entrytbl">
+ <xsl:apply-templates select="(following-sibling::entry
+ |following-sibling::entrytbl)[1]">
+ <xsl:with-param name="col" select="$col+$entry.colspan"/>
+ <xsl:with-param name="spans" select="$following.spans"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="finaltd">
+ <xsl:with-param name="spans" select="$following.spans"/>
+ <xsl:with-param name="col" select="$col+$entry.colspan"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- Expand this template to add properties to any fo:table-cell -->
+<xsl:template name="table.cell.properties">
+ <xsl:param name="bgcolor.pi" select="''"/>
+ <xsl:param name="rowsep.inherit" select="1"/>
+ <xsl:param name="colsep.inherit" select="1"/>
+ <xsl:param name="col" select="1"/>
+ <xsl:param name="valign.inherit" select="''"/>
+ <xsl:param name="align.inherit" select="''"/>
+ <xsl:param name="char.inherit" select="''"/>
+
+ <xsl:choose>
+ <xsl:when test="ancestor::tgroup">
+ <xsl:if test="$bgcolor.pi != ''">
+ <xsl:attribute name="background-color">
+ <xsl:value-of select="$bgcolor.pi"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:if test="$rowsep.inherit &gt; 0">
+ <xsl:call-template name="border">
+ <xsl:with-param name="side" select="'bottom'"/>
+ </xsl:call-template>
+ </xsl:if>
+
+ <xsl:if test="$colsep.inherit &gt; 0 and
+ $col &lt; (ancestor::tgroup/@cols|ancestor::entrytbl/@cols)[last()]">
+ <xsl:call-template name="border">
+ <xsl:with-param name="side" select="'end'"/>
+ </xsl:call-template>
+ </xsl:if>
+
+ <xsl:if test="$valign.inherit != ''">
+ <xsl:attribute name="display-align">
+ <xsl:choose>
+ <xsl:when test="$valign.inherit='top'">before</xsl:when>
+ <xsl:when test="$valign.inherit='middle'">center</xsl:when>
+ <xsl:when test="$valign.inherit='bottom'">after</xsl:when>
+ <xsl:otherwise>
+ <xsl:message>
+ <xsl:text>Unexpected valign value: </xsl:text>
+ <xsl:value-of select="$valign.inherit"/>
+ <xsl:text>, center used.</xsl:text>
+ </xsl:message>
+ <xsl:text>center</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:choose>
+ <xsl:when test="$align.inherit = 'char' and $char.inherit != ''">
+ <xsl:attribute name="text-align">
+ <xsl:value-of select="$char.inherit"/>
+ </xsl:attribute>
+ </xsl:when>
+ <xsl:when test="$align.inherit != ''">
+ <xsl:attribute name="text-align">
+ <xsl:value-of select="$align.inherit"/>
+ </xsl:attribute>
+ </xsl:when>
+ </xsl:choose>
+
+ </xsl:when>
+ <xsl:otherwise>
+ <!-- HTML table -->
+ <xsl:if test="$bgcolor.pi != ''">
+ <xsl:attribute name="background-color">
+ <xsl:value-of select="$bgcolor.pi"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:if test="$align.inherit != ''">
+ <xsl:attribute name="text-align">
+ <xsl:value-of select="$align.inherit"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:if test="$valign.inherit != ''">
+ <xsl:attribute name="display-align">
+ <xsl:choose>
+ <xsl:when test="$valign.inherit='top'">before</xsl:when>
+ <xsl:when test="$valign.inherit='middle'">center</xsl:when>
+ <xsl:when test="$valign.inherit='bottom'">after</xsl:when>
+ <xsl:otherwise>
+ <xsl:message>
+ <xsl:text>Unexpected valign value: </xsl:text>
+ <xsl:value-of select="$valign.inherit"/>
+ <xsl:text>, center used.</xsl:text>
+ </xsl:message>
+ <xsl:text>center</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:call-template name="html.table.cell.rules"/>
+
+ </xsl:otherwise>
+ </xsl:choose>
+
+</xsl:template>
+
+<!-- Expand this template to add properties to any cell's block -->
+<xsl:template name="table.cell.block.properties">
+ <!-- highlight this entry? -->
+ <xsl:choose>
+ <xsl:when test="ancestor::thead or ancestor::tfoot">
+ <xsl:attribute name="font-weight">bold</xsl:attribute>
+ </xsl:when>
+ <!-- Make row headers bold too -->
+ <xsl:when test="ancestor::tbody and
+ (ancestor::table[@rowheader = 'firstcol'] or
+ ancestor::informaltable[@rowheader = 'firstcol']) and
+ ancestor-or-self::entry[1][count(preceding-sibling::entry) = 0]">
+ <xsl:attribute name="font-weight">bold</xsl:attribute>
+ </xsl:when>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="entry|entrytbl" name="sentry" mode="span">
+ <xsl:param name="col" select="1"/>
+ <xsl:param name="spans"/>
+
+ <xsl:variable name="entry.colnum">
+ <xsl:call-template name="entry.colnum"/>
+ </xsl:variable>
+
+ <xsl:variable name="entry.colspan">
+ <xsl:choose>
+ <xsl:when test="@spanname or @namest">
+ <xsl:call-template name="calculate.colspan"/>
+ </xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="following.spans">
+ <xsl:call-template name="calculate.following.spans">
+ <xsl:with-param name="colspan" select="$entry.colspan"/>
+ <xsl:with-param name="spans" select="$spans"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="$spans != '' and not(starts-with($spans,'0:'))">
+ <xsl:value-of select="substring-before($spans,':')-1"/>
+ <xsl:text>:</xsl:text>
+ <xsl:call-template name="sentry">
+ <xsl:with-param name="col" select="$col+1"/>
+ <xsl:with-param name="spans" select="substring-after($spans,':')"/>
+ </xsl:call-template>
+ </xsl:when>
+
+ <xsl:when test="number($entry.colnum) &gt; $col">
+ <xsl:text>0:</xsl:text>
+ <xsl:call-template name="sentry">
+ <xsl:with-param name="col" select="$col + 1"/>
+ <xsl:with-param name="spans" select="substring-after($spans,':')"/>
+ </xsl:call-template>
+ </xsl:when>
+
+ <xsl:otherwise>
+ <xsl:call-template name="copy-string">
+ <xsl:with-param name="count" select="$entry.colspan"/>
+ <xsl:with-param name="string">
+ <xsl:choose>
+ <xsl:when test="@morerows">
+ <xsl:value-of select="@morerows"/>
+ </xsl:when>
+ <xsl:otherwise>0</xsl:otherwise>
+ </xsl:choose>
+ <xsl:text>:</xsl:text>
+ </xsl:with-param>
+ </xsl:call-template>
+
+ <xsl:choose>
+ <xsl:when test="following-sibling::entry|following-sibling::entrytbl">
+ <xsl:apply-templates select="(following-sibling::entry
+ |following-sibling::entrytbl)[1]"
+ mode="span">
+ <xsl:with-param name="col" select="$col+$entry.colspan"/>
+ <xsl:with-param name="spans" select="$following.spans"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="sfinaltd">
+ <xsl:with-param name="spans" select="$following.spans"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="generate.colgroup.raw">
+ <xsl:param name="cols" select="1"/>
+ <xsl:param name="count" select="1"/>
+
+ <xsl:choose>
+ <xsl:when test="$count>$cols"></xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="generate.col.raw">
+ <xsl:with-param name="countcol" select="$count"/>
+ </xsl:call-template>
+ <xsl:call-template name="generate.colgroup.raw">
+ <xsl:with-param name="cols" select="$cols"/>
+ <xsl:with-param name="count" select="$count+1"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="generate.colgroup">
+ <xsl:param name="cols" select="1"/>
+ <xsl:param name="count" select="1"/>
+
+ <xsl:choose>
+ <xsl:when test="$count>$cols"></xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="generate.col">
+ <xsl:with-param name="countcol" select="$count"/>
+ </xsl:call-template>
+ <xsl:call-template name="generate.colgroup">
+ <xsl:with-param name="cols" select="$cols"/>
+ <xsl:with-param name="count" select="$count+1"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="generate.col.raw">
+ <!-- generate the table-column for column countcol -->
+ <xsl:param name="countcol">1</xsl:param>
+ <xsl:param name="colspecs" select="./colspec"/>
+ <xsl:param name="count">1</xsl:param>
+ <xsl:param name="colnum">1</xsl:param>
+
+ <xsl:choose>
+ <xsl:when test="$count>count($colspecs)">
+ <fo:table-column column-number="{$countcol}"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:variable name="colspec" select="$colspecs[$count=position()]"/>
+
+ <xsl:variable name="colspec.colnum">
+ <xsl:choose>
+ <xsl:when test="$colspec/@colnum">
+ <xsl:value-of select="$colspec/@colnum"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$colnum"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="colspec.colwidth">
+ <xsl:choose>
+ <xsl:when test="$colspec/@colwidth">
+ <xsl:value-of select="$colspec/@colwidth"/>
+ </xsl:when>
+ <xsl:otherwise>1*</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="$colspec.colnum=$countcol">
+ <fo:table-column column-number="{$countcol}">
+ <xsl:attribute name="column-width">
+ <xsl:value-of select="$colspec.colwidth"/>
+ </xsl:attribute>
+ </fo:table-column>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="generate.col.raw">
+ <xsl:with-param name="countcol" select="$countcol"/>
+ <xsl:with-param name="colspecs" select="$colspecs"/>
+ <xsl:with-param name="count" select="$count+1"/>
+ <xsl:with-param name="colnum">
+ <xsl:choose>
+ <xsl:when test="$colspec/@colnum">
+ <xsl:value-of select="$colspec/@colnum + 1"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$colnum + 1"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="generate.col">
+ <!-- generate the table-column for column countcol -->
+ <xsl:param name="countcol">1</xsl:param>
+ <xsl:param name="colspecs" select="./colspec"/>
+ <xsl:param name="count">1</xsl:param>
+ <xsl:param name="colnum">1</xsl:param>
+
+ <xsl:choose>
+ <xsl:when test="$count>count($colspecs)">
+ <fo:table-column column-number="{$countcol}">
+ <xsl:variable name="colwidth">
+ <xsl:call-template name="calc.column.width"/>
+ </xsl:variable>
+ <xsl:attribute name="column-width">
+ <xsl:value-of select="$colwidth"/>
+ </xsl:attribute>
+ </fo:table-column>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:variable name="colspec" select="$colspecs[$count=position()]"/>
+
+ <xsl:variable name="colspec.colnum">
+ <xsl:choose>
+ <xsl:when test="$colspec/@colnum">
+ <xsl:value-of select="$colspec/@colnum"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$colnum"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="colspec.colwidth">
+ <xsl:choose>
+ <xsl:when test="$colspec/@colwidth">
+ <xsl:value-of select="$colspec/@colwidth"/>
+ </xsl:when>
+ <xsl:otherwise>1*</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="$colspec.colnum=$countcol">
+ <fo:table-column column-number="{$countcol}">
+ <xsl:variable name="colwidth">
+ <xsl:call-template name="calc.column.width">
+ <xsl:with-param name="colwidth">
+ <xsl:value-of select="$colspec.colwidth"/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:attribute name="column-width">
+ <xsl:value-of select="$colwidth"/>
+ </xsl:attribute>
+ </fo:table-column>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="generate.col">
+ <xsl:with-param name="countcol" select="$countcol"/>
+ <xsl:with-param name="colspecs" select="$colspecs"/>
+ <xsl:with-param name="count" select="$count+1"/>
+ <xsl:with-param name="colnum">
+ <xsl:choose>
+ <xsl:when test="$colspec/@colnum">
+ <xsl:value-of select="$colspec/@colnum + 1"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$colnum + 1"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<doc:template name="calc.column.width" xmlns="">
+<refpurpose>Calculate an XSL FO table column width specification from a
+CALS table column width specification.</refpurpose>
+
+<refdescription>
+<para>CALS expresses table column widths in the following basic
+forms:</para>
+
+<itemizedlist>
+<listitem>
+<para><emphasis>99.99units</emphasis>, a fixed length specifier.</para>
+</listitem>
+<listitem>
+<para><emphasis>99.99</emphasis>, a fixed length specifier without any units.</para>
+</listitem>
+<listitem>
+<para><emphasis>99.99*</emphasis>, a relative length specifier.</para>
+</listitem>
+<listitem>
+<para><emphasis>99.99*+99.99units</emphasis>, a combination of both.</para>
+</listitem>
+</itemizedlist>
+
+<para>The CALS units are points (pt), picas (pi), centimeters (cm),
+millimeters (mm), and inches (in). These are the same units as XSL,
+except that XSL abbreviates picas "pc" instead of "pi". If a length
+specifier has no units, the CALS default unit (pt) is assumed.</para>
+
+<para>Relative length specifiers are represented in XSL with the
+proportional-column-width() function.</para>
+
+<para>Here are some examples:</para>
+
+<itemizedlist>
+<listitem>
+<para>"36pt" becomes "36pt"</para>
+</listitem>
+<listitem>
+<para>"3pi" becomes "3pc"</para>
+</listitem>
+<listitem>
+<para>"36" becomes "36pt"</para>
+</listitem>
+<listitem>
+<para>"3*" becomes "proportional-column-width(3)"</para>
+</listitem>
+<listitem>
+<para>"3*+2pi" becomes "proportional-column-width(3)+2pc"</para>
+</listitem>
+<listitem>
+<para>"1*+2" becomes "proportional-column-width(1)+2pt"</para>
+</listitem>
+</itemizedlist>
+</refdescription>
+
+<refparameter>
+<variablelist>
+<varlistentry><term>colwidth</term>
+<listitem>
+<para>The CALS column width specification.</para>
+</listitem>
+</varlistentry>
+</variablelist>
+</refparameter>
+
+<refreturn>
+<para>The XSL column width specification.</para>
+</refreturn>
+</doc:template>
+
+<xsl:template name="calc.column.width">
+ <xsl:param name="colwidth">1*</xsl:param>
+
+ <!-- Ok, the colwidth could have any one of the following forms: -->
+ <!-- 1* = proportional width -->
+ <!-- * = same as 1* -->
+ <!-- 1unit = 1.0 units wide -->
+ <!-- 1 = 1pt wide -->
+ <!-- 1*+1unit = proportional width + some fixed width -->
+ <!-- 1*+1 = proportional width + some fixed width -->
+
+ <!-- If it has a proportional width, translate it to XSL -->
+ <xsl:if test="contains($colwidth, '*')">
+ <xsl:text>proportional-column-width(</xsl:text>
+ <xsl:choose>
+ <xsl:when test="substring-before($colwidth, '*') != ''">
+ <xsl:value-of select="substring-before($colwidth, '*')"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text>1.00</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:text>)</xsl:text>
+ </xsl:if>
+
+ <!-- Now grab the non-proportional part of the specification -->
+ <xsl:variable name="width-units">
+ <xsl:choose>
+ <xsl:when test="contains($colwidth, '*')">
+ <xsl:value-of
+ select="normalize-space(substring-after($colwidth, '*'))"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="normalize-space($colwidth)"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <!-- Ok, now the width-units could have any one of the following forms: -->
+ <!-- = <empty string> -->
+ <!-- 1unit = 1.0 units wide -->
+ <!-- 1 = 1pt wide -->
+ <!-- with an optional leading sign -->
+
+ <!-- Grab the width part by blanking out the units part and discarding -->
+ <!-- whitespace. It's not pretty, but it works. -->
+ <xsl:variable name="width"
+ select="normalize-space(translate($width-units,
+ '+-0123456789.abcdefghijklmnopqrstuvwxyz',
+ '+-0123456789.'))"/>
+
+ <!-- Grab the units part by blanking out the width part and discarding -->
+ <!-- whitespace. It's not pretty, but it works. -->
+ <xsl:variable name="units"
+ select="normalize-space(translate($width-units,
+ 'abcdefghijklmnopqrstuvwxyz+-0123456789.',
+ 'abcdefghijklmnopqrstuvwxyz'))"/>
+
+ <!-- Output the width -->
+ <xsl:value-of select="$width"/>
+
+ <!-- Output the units, translated appropriately -->
+ <xsl:choose>
+ <xsl:when test="$units = 'pi'">pc</xsl:when>
+ <xsl:when test="$units = '' and $width != ''">pt</xsl:when>
+ <xsl:otherwise><xsl:value-of select="$units"/></xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/task.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/task.xsl
new file mode 100644
index 0000000..c864bc6
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/task.xsl
@@ -0,0 +1,91 @@
+<?xml version="1.0"?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:fo="http://www.w3.org/1999/XSL/Format"
+ version="1.0">
+
+<!-- ********************************************************************
+ $Id: task.xsl 8011 2008-05-23 15:14:57Z mzjn $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<!-- ==================================================================== -->
+
+<xsl:template match="task">
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+
+ <xsl:variable name="param.placement"
+ select="substring-after(normalize-space($formal.title.placement),
+ concat(local-name(.), ' '))"/>
+
+ <xsl:variable name="placement">
+ <xsl:choose>
+ <xsl:when test="contains($param.placement, ' ')">
+ <xsl:value-of select="substring-before($param.placement, ' ')"/>
+ </xsl:when>
+ <xsl:when test="$param.placement = ''">before</xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$param.placement"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="preamble"
+ select="*[not(self::title
+ or self::titleabbrev)]"/>
+
+ <xsl:variable name="keep.together">
+ <xsl:call-template name="pi.dbfo_keep-together"/>
+ </xsl:variable>
+
+ <fo:block id="{$id}"
+ xsl:use-attribute-sets="formal.object.properties">
+
+ <xsl:if test="$keep.together != ''">
+ <xsl:attribute name="keep-together.within-column"><xsl:value-of
+ select="$keep.together"/></xsl:attribute>
+ </xsl:if>
+
+ <xsl:call-template name="anchor"/>
+
+ <xsl:if test="title and $placement = 'before'">
+ <xsl:call-template name="formal.object.heading"/>
+ </xsl:if>
+
+ <xsl:apply-templates select="$preamble"/>
+
+ <xsl:if test="title and $placement != 'before'">
+ <xsl:call-template name="formal.object.heading"/>
+ </xsl:if>
+ </fo:block>
+</xsl:template>
+
+<xsl:template match="task/title">
+ <!-- nop -->
+</xsl:template>
+
+<xsl:template match="tasksummary">
+ <xsl:call-template name="semiformal.object"/>
+</xsl:template>
+
+<xsl:template match="tasksummary/title"/>
+
+<xsl:template match="taskprerequisites">
+ <xsl:call-template name="semiformal.object"/>
+</xsl:template>
+
+<xsl:template match="taskprerequisites/title"/>
+
+<xsl:template match="taskrelated">
+ <xsl:call-template name="semiformal.object"/>
+</xsl:template>
+
+<xsl:template match="taskrelated/title"/>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/titlepage.templates.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/titlepage.templates.xml
new file mode 100644
index 0000000..e3434bc
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/titlepage.templates.xml
@@ -0,0 +1,1354 @@
+<!DOCTYPE t:templates [
+<!ENTITY hsize0 "10pt">
+<!ENTITY hsize1 "12pt">
+<!ENTITY hsize2 "14.4pt">
+<!ENTITY hsize3 "17.28pt">
+<!ENTITY hsize4 "20.736pt">
+<!ENTITY hsize5 "24.8832pt">
+<!ENTITY hsize0space "7.5pt"> <!-- 0.75 * hsize0 -->
+<!ENTITY hsize1space "9pt"> <!-- 0.75 * hsize1 -->
+<!ENTITY hsize2space "10.8pt"> <!-- 0.75 * hsize2 -->
+<!ENTITY hsize3space "12.96pt"> <!-- 0.75 * hsize3 -->
+<!ENTITY hsize4space "15.552pt"> <!-- 0.75 * hsize4 -->
+<!ENTITY hsize5space "18.6624pt"> <!-- 0.75 * hsize5 -->
+]>
+<t:templates xmlns:t="http://nwalsh.com/docbook/xsl/template/1.0"
+ xmlns:param="http://nwalsh.com/docbook/xsl/template/1.0/param"
+ xmlns:fo="http://www.w3.org/1999/XSL/Format"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+
+<!-- ********************************************************************
+ $Id: titlepage.templates.xml 8341 2009-03-16 03:00:56Z bobstayton $
+ ********************************************************************
+
+ This file is part of the DocBook XSL Stylesheet distribution.
+ See ../README or http://docbook.sf.net/ for copyright
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<!-- ==================================================================== -->
+
+<t:titlepage t:element="article" t:wrapper="fo:block"
+ font-family="{$title.fontset}">
+
+ <t:titlepage-content t:side="recto"
+ start-indent="0pt"
+ text-align="center">
+
+ <title t:named-template="component.title"
+ param:node="ancestor-or-self::article[1]"
+ keep-with-next.within-column="always"
+ font-size="&hsize5;"
+ font-weight="bold"/>
+
+ <subtitle/>
+
+ <corpauthor space-before="0.5em"
+ font-size="&hsize2;"/>
+ <authorgroup space-before="0.5em"
+ font-size="&hsize2;"/>
+ <author space-before="0.5em"
+ font-size="&hsize2;"/>
+
+ <!-- If you add editor, include this t:predicate attribute
+ because only the first editor generates the list of editors.
+ <editor t:predicate="[position() = 1]"/>
+ -->
+ <othercredit space-before="0.5em"/>
+ <releaseinfo space-before="0.5em"/>
+ <copyright space-before="0.5em"/>
+ <legalnotice text-align="start"
+ margin-left="0.5in"
+ margin-right="0.5in"
+ font-family="{$body.fontset}"/>
+ <pubdate space-before="0.5em"/>
+ <revision space-before="0.5em"/>
+ <revhistory space-before="0.5em"/>
+ <abstract space-before="0.5em"
+ text-align="start"
+ margin-left="0.5in"
+ margin-right="0.5in"
+ font-family="{$body.fontset}"/>
+ </t:titlepage-content>
+
+ <t:titlepage-content t:side="verso">
+ </t:titlepage-content>
+
+ <t:titlepage-separator>
+ </t:titlepage-separator>
+
+ <t:titlepage-before t:side="recto">
+ </t:titlepage-before>
+
+ <t:titlepage-before t:side="verso">
+ </t:titlepage-before>
+</t:titlepage>
+
+<!-- ==================================================================== -->
+
+<t:titlepage t:element="set" t:wrapper="fo:block">
+ <t:titlepage-content t:side="recto">
+ <title
+ t:named-template="division.title"
+ param:node="ancestor-or-self::set[1]"
+ text-align="center"
+ font-size="&hsize5;"
+ space-before="&hsize5space;"
+ font-weight="bold"
+ font-family="{$title.fontset}"/>
+ <subtitle
+ font-family="{$title.fontset}"
+ text-align="center"/>
+ <corpauthor/>
+ <authorgroup/>
+ <author/>
+ <othercredit/>
+ <releaseinfo/>
+ <copyright/>
+ <legalnotice/>
+ <pubdate/>
+ <revision/>
+ <revhistory/>
+ <abstract/>
+ </t:titlepage-content>
+
+ <t:titlepage-content t:side="verso">
+ </t:titlepage-content>
+
+ <t:titlepage-separator>
+ </t:titlepage-separator>
+
+ <t:titlepage-before t:side="recto">
+ </t:titlepage-before>
+
+ <t:titlepage-before t:side="verso">
+ </t:titlepage-before>
+</t:titlepage>
+
+<!-- ==================================================================== -->
+
+ <t:titlepage t:element="book" t:wrapper="fo:block">
+ <t:titlepage-content t:side="recto">
+ <title
+ t:named-template="division.title"
+ param:node="ancestor-or-self::book[1]"
+ text-align="center"
+ font-size="&hsize5;"
+ space-before="&hsize5space;"
+ font-weight="bold"
+ font-family="{$title.fontset}"/>
+ <subtitle
+ text-align="center"
+ font-size="&hsize4;"
+ space-before="&hsize4space;"
+ font-family="{$title.fontset}"/>
+ <corpauthor font-size="&hsize3;"
+ keep-with-next.within-column="always"
+ space-before="2in"/>
+ <authorgroup space-before="2in"/>
+ <author font-size="&hsize3;"
+ space-before="&hsize2space;"
+ keep-with-next.within-column="always"/>
+ <!-- If you add editor, include this t:predicate attribute
+ because only the first editor generates the list of editors.
+ <editor t:predicate="[position() = 1]"/>
+ -->
+ </t:titlepage-content>
+
+ <t:titlepage-content t:side="verso">
+ <title
+ t:named-template="book.verso.title"
+ font-size="&hsize2;"
+ font-weight="bold"
+ font-family="{$title.fontset}"/>
+ <corpauthor/>
+ <authorgroup t:named-template="verso.authorgroup"/>
+ <author/>
+ <!-- If you add editor, include this t:predicate attribute
+ because only the first editor generates the list of editors.
+ <editor t:predicate="[position() = 1]"/>
+ -->
+ <othercredit/>
+ <releaseinfo space-before="0.5em"/>
+ <pubdate space-before="1em"/>
+ <copyright/>
+ <abstract/>
+ <legalnotice font-size="8pt"/>
+ </t:titlepage-content>
+
+ <t:titlepage-separator>
+ <fo:block break-after="page"/>
+ </t:titlepage-separator>
+
+ <t:titlepage-before t:side="recto">
+ </t:titlepage-before>
+
+ <t:titlepage-before t:side="verso">
+ <fo:block break-after="page"/>
+ </t:titlepage-before>
+</t:titlepage>
+
+<!-- ==================================================================== -->
+
+<t:titlepage t:element="part" t:wrapper="fo:block">
+ <t:titlepage-content t:side="recto">
+ <title
+ t:named-template="division.title"
+ param:node="ancestor-or-self::part[1]"
+ text-align="center"
+ font-size="&hsize5;"
+ space-before="&hsize5space;"
+ font-weight="bold"
+ font-family="{$title.fontset}"/>
+ <subtitle
+ text-align="center"
+ font-size="&hsize4;"
+ space-before="&hsize4space;"
+ font-weight='bold'
+ font-style='italic'
+ font-family="{$title.fontset}"/>
+ </t:titlepage-content>
+
+ <t:titlepage-content t:side="verso">
+ </t:titlepage-content>
+
+ <t:titlepage-separator>
+ </t:titlepage-separator>
+
+ <t:titlepage-before t:side="recto">
+ </t:titlepage-before>
+
+ <t:titlepage-before t:side="verso">
+ </t:titlepage-before>
+</t:titlepage>
+
+<t:titlepage t:element="partintro" t:wrapper="fo:block">
+ <t:titlepage-content t:side="recto">
+ <title
+ text-align="center"
+ font-size="&hsize5;"
+ font-weight="bold"
+ space-before="1em"
+ font-family="{$title.fontset}"/>
+ <subtitle
+ text-align="center"
+ font-size="&hsize2;"
+ font-weight="bold"
+ font-style="italic"
+ font-family="{$title.fontset}"/>
+ <corpauthor/>
+ <authorgroup/>
+ <author/>
+ <othercredit/>
+ <releaseinfo/>
+ <copyright/>
+ <legalnotice/>
+ <pubdate/>
+ <revision/>
+ <revhistory/>
+ <abstract/>
+ </t:titlepage-content>
+
+ <t:titlepage-content t:side="verso">
+ </t:titlepage-content>
+
+ <t:titlepage-separator>
+ </t:titlepage-separator>
+
+ <t:titlepage-before t:side="recto">
+ </t:titlepage-before>
+
+ <t:titlepage-before t:side="verso">
+ </t:titlepage-before>
+</t:titlepage>
+
+<!-- ==================================================================== -->
+
+<t:titlepage t:element="reference" t:wrapper="fo:block">
+ <t:titlepage-content t:side="recto">
+ <title
+ t:named-template="division.title"
+ param:node="ancestor-or-self::reference[1]"
+ text-align="center"
+ font-size="&hsize5;"
+ space-before="&hsize5space;"
+ font-weight="bold"
+ font-family="{$title.fontset}"/>
+ <subtitle
+ font-family="{$title.fontset}"
+ text-align="center"/>
+ <corpauthor/>
+ <authorgroup/>
+ <author/>
+ <othercredit/>
+ <releaseinfo/>
+ <copyright/>
+ <legalnotice/>
+ <pubdate/>
+ <revision/>
+ <revhistory/>
+ <abstract/>
+ </t:titlepage-content>
+
+ <t:titlepage-content t:side="verso">
+ </t:titlepage-content>
+
+ <t:titlepage-separator>
+ </t:titlepage-separator>
+
+ <t:titlepage-before t:side="recto">
+ </t:titlepage-before>
+
+ <t:titlepage-before t:side="verso">
+ </t:titlepage-before>
+</t:titlepage>
+
+<!-- ==================================================================== -->
+
+<t:titlepage t:element="refsynopsisdiv" t:wrapper="fo:block">
+ <t:titlepage-content t:side="recto">
+ <title
+ font-family="{$title.fontset}"/>
+ </t:titlepage-content>
+
+ <t:titlepage-content t:side="verso">
+ </t:titlepage-content>
+
+ <t:titlepage-separator>
+ </t:titlepage-separator>
+
+ <t:titlepage-before t:side="recto">
+ </t:titlepage-before>
+
+ <t:titlepage-before t:side="verso">
+ </t:titlepage-before>
+</t:titlepage>
+
+<!-- ==================================================================== -->
+
+<t:titlepage t:element="refsection" t:wrapper="fo:block">
+ <t:titlepage-content t:side="recto">
+ <title
+ font-family="{$title.fontset}"/>
+ </t:titlepage-content>
+
+ <t:titlepage-content t:side="verso">
+ </t:titlepage-content>
+
+ <t:titlepage-separator>
+ </t:titlepage-separator>
+
+ <t:titlepage-before t:side="recto">
+ </t:titlepage-before>
+
+ <t:titlepage-before t:side="verso">
+ </t:titlepage-before>
+</t:titlepage>
+
+<!-- ==================================================================== -->
+
+<t:titlepage t:element="refsect1" t:wrapper="fo:block">
+ <t:titlepage-content t:side="recto">
+ <title
+ font-family="{$title.fontset}"/>
+ </t:titlepage-content>
+
+ <t:titlepage-content t:side="verso">
+ </t:titlepage-content>
+
+ <t:titlepage-separator>
+ </t:titlepage-separator>
+
+ <t:titlepage-before t:side="recto">
+ </t:titlepage-before>
+
+ <t:titlepage-before t:side="verso">
+ </t:titlepage-before>
+</t:titlepage>
+
+<!-- ==================================================================== -->
+
+<t:titlepage t:element="refsect2" t:wrapper="fo:block">
+ <t:titlepage-content t:side="recto">
+ <title
+ font-family="{$title.fontset}"/>
+ </t:titlepage-content>
+
+ <t:titlepage-content t:side="verso">
+ </t:titlepage-content>
+
+ <t:titlepage-separator>
+ </t:titlepage-separator>
+
+ <t:titlepage-before t:side="recto">
+ </t:titlepage-before>
+
+ <t:titlepage-before t:side="verso">
+ </t:titlepage-before>
+</t:titlepage>
+
+<!-- ==================================================================== -->
+
+<t:titlepage t:element="refsect3" t:wrapper="fo:block">
+ <t:titlepage-content t:side="recto">
+ <title
+ font-family="{$title.fontset}"/>
+ </t:titlepage-content>
+
+ <t:titlepage-content t:side="verso">
+ </t:titlepage-content>
+
+ <t:titlepage-separator>
+ </t:titlepage-separator>
+
+ <t:titlepage-before t:side="recto">
+ </t:titlepage-before>
+
+ <t:titlepage-before t:side="verso">
+ </t:titlepage-before>
+</t:titlepage>
+
+<!-- ==================================================================== -->
+
+ <t:titlepage t:element="dedication" t:wrapper="fo:block">
+ <t:titlepage-content t:side="recto">
+ <title
+ t:force="1"
+ t:named-template="component.title"
+ param:node="ancestor-or-self::dedication[1]"
+ margin-left="{$title.margin.left}"
+ font-size="&hsize5;"
+ font-family="{$title.fontset}"
+ font-weight="bold"/>
+ <subtitle
+ font-family="{$title.fontset}"/>
+ </t:titlepage-content>
+
+ <t:titlepage-content t:side="verso">
+ </t:titlepage-content>
+
+ <t:titlepage-separator>
+ </t:titlepage-separator>
+
+ <t:titlepage-before t:side="recto">
+ </t:titlepage-before>
+
+ <t:titlepage-before t:side="verso">
+ </t:titlepage-before>
+</t:titlepage>
+
+<!-- ==================================================================== -->
+
+<!-- Same formatting as dedication -->
+ <t:titlepage t:element="acknowledgements" t:wrapper="fo:block">
+ <t:titlepage-content t:side="recto">
+ <title
+ t:force="1"
+ t:named-template="component.title"
+ param:node="ancestor-or-self::acknowledgements[1]"
+ margin-left="{$title.margin.left}"
+ font-size="&hsize5;"
+ font-family="{$title.fontset}"
+ font-weight="bold"/>
+ <subtitle
+ font-family="{$title.fontset}"/>
+ </t:titlepage-content>
+
+ <t:titlepage-content t:side="verso">
+ </t:titlepage-content>
+
+ <t:titlepage-separator>
+ </t:titlepage-separator>
+
+ <t:titlepage-before t:side="recto">
+ </t:titlepage-before>
+
+ <t:titlepage-before t:side="verso">
+ </t:titlepage-before>
+</t:titlepage>
+
+
+<!-- ==================================================================== -->
+
+ <t:titlepage t:element="preface" t:wrapper="fo:block">
+ <t:titlepage-content t:side="recto">
+ <title
+ t:force="1"
+ t:named-template="component.title"
+ param:node="ancestor-or-self::preface[1]"
+ margin-left="{$title.margin.left}"
+ font-size="&hsize5;"
+ font-family="{$title.fontset}"
+ font-weight="bold"/>
+ <subtitle
+ font-family="{$title.fontset}"/>
+ <corpauthor/>
+ <authorgroup/>
+ <author/>
+ <othercredit/>
+ <releaseinfo/>
+ <copyright/>
+ <legalnotice/>
+ <pubdate/>
+ <revision/>
+ <revhistory/>
+ <abstract/>
+ </t:titlepage-content>
+
+ <t:titlepage-content t:side="verso">
+ </t:titlepage-content>
+
+ <t:titlepage-separator>
+ </t:titlepage-separator>
+
+ <t:titlepage-before t:side="recto">
+ </t:titlepage-before>
+
+ <t:titlepage-before t:side="verso">
+ </t:titlepage-before>
+</t:titlepage>
+
+<!-- ==================================================================== -->
+
+ <t:titlepage t:element="chapter" t:wrapper="fo:block"
+ font-family="{$title.fontset}">
+ <t:titlepage-content t:side="recto" margin-left="{$title.margin.left}">
+ <title t:named-template="component.title"
+ param:node="ancestor-or-self::chapter[1]"
+ font-size="&hsize5;"
+ font-weight="bold"/>
+
+ <subtitle space-before="0.5em"
+ font-style="italic"
+ font-size="&hsize2;"
+ font-weight="bold"/>
+
+ <corpauthor space-before="0.5em"
+ space-after="0.5em"
+ font-size="&hsize2;"/>
+
+ <authorgroup space-before="0.5em"
+ space-after="0.5em"
+ font-size="&hsize2;"/>
+
+ <author space-before="0.5em"
+ space-after="0.5em"
+ font-size="&hsize2;"/>
+
+ <othercredit/>
+ <releaseinfo/>
+ <copyright/>
+ <legalnotice/>
+ <pubdate/>
+ <revision/>
+ <revhistory/>
+ <abstract/>
+ </t:titlepage-content>
+
+ <t:titlepage-content t:side="verso">
+ </t:titlepage-content>
+
+ <t:titlepage-separator>
+ </t:titlepage-separator>
+
+ <t:titlepage-before t:side="recto">
+ </t:titlepage-before>
+
+ <t:titlepage-before t:side="verso">
+ </t:titlepage-before>
+</t:titlepage>
+
+<!-- ==================================================================== -->
+
+ <t:titlepage t:element="appendix" t:wrapper="fo:block">
+ <t:titlepage-content t:side="recto">
+ <title
+ t:named-template="component.title"
+ param:node="ancestor-or-self::appendix[1]"
+ margin-left="{$title.margin.left}"
+ font-size="&hsize5;"
+ font-weight="bold"
+ font-family="{$title.fontset}"/>
+ <subtitle
+ font-family="{$title.fontset}"/>
+ <corpauthor/>
+ <authorgroup/>
+ <author/>
+ <othercredit/>
+ <releaseinfo/>
+ <copyright/>
+ <legalnotice/>
+ <pubdate/>
+ <revision/>
+ <revhistory/>
+ <abstract/>
+ </t:titlepage-content>
+
+ <t:titlepage-content t:side="verso">
+ </t:titlepage-content>
+
+ <t:titlepage-separator>
+ </t:titlepage-separator>
+
+ <t:titlepage-before t:side="recto">
+ </t:titlepage-before>
+
+ <t:titlepage-before t:side="verso">
+ </t:titlepage-before>
+</t:titlepage>
+
+<!-- ==================================================================== -->
+
+<t:titlepage t:element="section" t:wrapper="fo:block">
+ <t:titlepage-content t:side="recto">
+ <title
+ margin-left="{$title.margin.left}"
+ font-family="{$title.fontset}"/>
+ <subtitle
+ font-family="{$title.fontset}"/>
+ <corpauthor/>
+ <authorgroup/>
+ <author/>
+ <othercredit/>
+ <releaseinfo/>
+ <copyright/>
+ <legalnotice/>
+ <pubdate/>
+ <revision/>
+ <revhistory/>
+ <abstract/>
+ </t:titlepage-content>
+
+ <t:titlepage-content t:side="verso">
+ </t:titlepage-content>
+
+ <t:titlepage-separator>
+ </t:titlepage-separator>
+
+ <t:titlepage-before t:side="recto">
+ </t:titlepage-before>
+
+ <t:titlepage-before t:side="verso">
+ </t:titlepage-before>
+</t:titlepage>
+
+<t:titlepage t:element="sect1" t:wrapper="fo:block">
+ <t:titlepage-content t:side="recto">
+ <title
+ margin-left="{$title.margin.left}"
+ font-family="{$title.fontset}"/>
+ <subtitle
+ font-family="{$title.fontset}"/>
+ <corpauthor/>
+ <authorgroup/>
+ <author/>
+ <othercredit/>
+ <releaseinfo/>
+ <copyright/>
+ <legalnotice/>
+ <pubdate/>
+ <revision/>
+ <revhistory/>
+ <abstract/>
+ </t:titlepage-content>
+
+ <t:titlepage-content t:side="verso">
+ </t:titlepage-content>
+
+ <t:titlepage-separator>
+ </t:titlepage-separator>
+
+ <t:titlepage-before t:side="recto">
+ </t:titlepage-before>
+
+ <t:titlepage-before t:side="verso">
+ </t:titlepage-before>
+</t:titlepage>
+
+<t:titlepage t:element="sect2" t:wrapper="fo:block">
+ <t:titlepage-content t:side="recto">
+ <title
+ margin-left="{$title.margin.left}"
+ font-family="{$title.fontset}"/>
+ <subtitle
+ font-family="{$title.fontset}"/>
+ <corpauthor/>
+ <authorgroup/>
+ <author/>
+ <othercredit/>
+ <releaseinfo/>
+ <copyright/>
+ <legalnotice/>
+ <pubdate/>
+ <revision/>
+ <revhistory/>
+ <abstract/>
+ </t:titlepage-content>
+
+ <t:titlepage-content t:side="verso">
+ </t:titlepage-content>
+
+ <t:titlepage-separator>
+ </t:titlepage-separator>
+
+ <t:titlepage-before t:side="recto">
+ </t:titlepage-before>
+
+ <t:titlepage-before t:side="verso">
+ </t:titlepage-before>
+</t:titlepage>
+
+<t:titlepage t:element="sect3" t:wrapper="fo:block">
+ <t:titlepage-content t:side="recto">
+ <title
+ margin-left="{$title.margin.left}"
+ font-family="{$title.fontset}"/>
+ <subtitle
+ font-family="{$title.fontset}"/>
+ <corpauthor/>
+ <authorgroup/>
+ <author/>
+ <othercredit/>
+ <releaseinfo/>
+ <copyright/>
+ <legalnotice/>
+ <pubdate/>
+ <revision/>
+ <revhistory/>
+ <abstract/>
+ </t:titlepage-content>
+
+ <t:titlepage-content t:side="verso">
+ </t:titlepage-content>
+
+ <t:titlepage-separator>
+ </t:titlepage-separator>
+
+ <t:titlepage-before t:side="recto">
+ </t:titlepage-before>
+
+ <t:titlepage-before t:side="verso">
+ </t:titlepage-before>
+</t:titlepage>
+
+<t:titlepage t:element="sect4" t:wrapper="fo:block">
+ <t:titlepage-content t:side="recto">
+ <title
+ margin-left="{$title.margin.left}"
+ font-family="{$title.fontset}"/>
+ <subtitle
+ font-family="{$title.fontset}"/>
+ <corpauthor/>
+ <authorgroup/>
+ <author/>
+ <othercredit/>
+ <releaseinfo/>
+ <copyright/>
+ <legalnotice/>
+ <pubdate/>
+ <revision/>
+ <revhistory/>
+ <abstract/>
+ </t:titlepage-content>
+
+ <t:titlepage-content t:side="verso">
+ </t:titlepage-content>
+
+ <t:titlepage-separator>
+ </t:titlepage-separator>
+
+ <t:titlepage-before t:side="recto">
+ </t:titlepage-before>
+
+ <t:titlepage-before t:side="verso">
+ </t:titlepage-before>
+</t:titlepage>
+
+<t:titlepage t:element="sect5" t:wrapper="fo:block">
+ <t:titlepage-content t:side="recto">
+ <title
+ margin-left="{$title.margin.left}"
+ font-family="{$title.fontset}"/>
+ <subtitle
+ font-family="{$title.fontset}"/>
+ <corpauthor/>
+ <authorgroup/>
+ <author/>
+ <othercredit/>
+ <releaseinfo/>
+ <copyright/>
+ <legalnotice/>
+ <pubdate/>
+ <revision/>
+ <revhistory/>
+ <abstract/>
+ </t:titlepage-content>
+
+ <t:titlepage-content t:side="verso">
+ </t:titlepage-content>
+
+ <t:titlepage-separator>
+ </t:titlepage-separator>
+
+ <t:titlepage-before t:side="recto">
+ </t:titlepage-before>
+
+ <t:titlepage-before t:side="verso">
+ </t:titlepage-before>
+</t:titlepage>
+
+<t:titlepage t:element="simplesect" t:wrapper="fo:block">
+ <t:titlepage-content t:side="recto">
+ <title
+ margin-left="{$title.margin.left}"
+ font-family="{$title.fontset}"/>
+ <subtitle
+ font-family="{$title.fontset}"/>
+ <corpauthor/>
+ <authorgroup/>
+ <author/>
+ <othercredit/>
+ <releaseinfo/>
+ <copyright/>
+ <legalnotice/>
+ <pubdate/>
+ <revision/>
+ <revhistory/>
+ <abstract/>
+ </t:titlepage-content>
+
+ <t:titlepage-content t:side="verso">
+ </t:titlepage-content>
+
+ <t:titlepage-separator>
+ </t:titlepage-separator>
+
+ <t:titlepage-before t:side="recto">
+ </t:titlepage-before>
+
+ <t:titlepage-before t:side="verso">
+ </t:titlepage-before>
+</t:titlepage>
+
+<!-- ==================================================================== -->
+
+ <t:titlepage t:element="bibliography" t:wrapper="fo:block">
+ <t:titlepage-content t:side="recto">
+ <title
+ t:force="1"
+ t:named-template="component.title"
+ param:node="ancestor-or-self::bibliography[1]"
+ margin-left="{$title.margin.left}"
+ font-size="&hsize5;"
+ font-family="{$title.fontset}"
+ font-weight="bold"/>
+ <subtitle
+ font-family="{$title.fontset}"/>
+ </t:titlepage-content>
+
+ <t:titlepage-content t:side="verso">
+ </t:titlepage-content>
+
+ <t:titlepage-separator>
+ </t:titlepage-separator>
+
+ <t:titlepage-before t:side="recto">
+ </t:titlepage-before>
+
+ <t:titlepage-before t:side="verso">
+ </t:titlepage-before>
+ </t:titlepage>
+
+<!-- ==================================================================== -->
+
+ <t:titlepage t:element="bibliodiv" t:wrapper="fo:block">
+ <t:titlepage-content t:side="recto">
+ <title t:named-template="component.title"
+ param:node="ancestor-or-self::bibliodiv[1]"
+ margin-left="{$title.margin.left}"
+ font-size="&hsize4;"
+ font-family="{$title.fontset}"
+ font-weight="bold"/>
+ <subtitle
+ font-family="{$title.fontset}"/>
+ </t:titlepage-content>
+
+ <t:titlepage-content t:side="verso">
+ </t:titlepage-content>
+
+ <t:titlepage-separator>
+ </t:titlepage-separator>
+
+ <t:titlepage-before t:side="recto">
+ </t:titlepage-before>
+
+ <t:titlepage-before t:side="verso">
+ </t:titlepage-before>
+ </t:titlepage>
+
+<!-- ==================================================================== -->
+
+ <t:titlepage t:element="glossary" t:wrapper="fo:block">
+ <t:titlepage-content t:side="recto">
+ <title
+ t:force="1"
+ t:named-template="component.title"
+ param:node="ancestor-or-self::glossary[1]"
+ margin-left="{$title.margin.left}"
+ font-size="&hsize5;"
+ font-family="{$title.fontset}"
+ font-weight="bold"/>
+ <subtitle
+ font-family="{$title.fontset}"/>
+ </t:titlepage-content>
+
+ <t:titlepage-content t:side="verso">
+ </t:titlepage-content>
+
+ <t:titlepage-separator>
+ </t:titlepage-separator>
+
+ <t:titlepage-before t:side="recto">
+ </t:titlepage-before>
+
+ <t:titlepage-before t:side="verso">
+ </t:titlepage-before>
+ </t:titlepage>
+
+<!-- ==================================================================== -->
+
+ <t:titlepage t:element="glossdiv" t:wrapper="fo:block">
+ <t:titlepage-content t:side="recto">
+ <title t:named-template="component.title"
+ param:node="ancestor-or-self::glossdiv[1]"
+ margin-left="{$title.margin.left}"
+ font-size="&hsize4;"
+ font-family="{$title.fontset}"
+ font-weight="bold"/>
+ <subtitle
+ font-family="{$title.fontset}"/>
+ </t:titlepage-content>
+
+ <t:titlepage-content t:side="verso">
+ </t:titlepage-content>
+
+ <t:titlepage-separator>
+ </t:titlepage-separator>
+
+ <t:titlepage-before t:side="recto">
+ </t:titlepage-before>
+
+ <t:titlepage-before t:side="verso">
+ </t:titlepage-before>
+ </t:titlepage>
+
+<!-- ==================================================================== -->
+
+ <t:titlepage t:element="index" t:wrapper="fo:block">
+ <t:titlepage-content t:side="recto">
+ <title
+ t:force="1"
+ t:named-template="component.title"
+ param:node="ancestor-or-self::index[1]"
+ param:pagewide="1"
+ margin-left="0pt"
+ font-size="&hsize5;"
+ font-family="{$title.fontset}"
+ font-weight="bold"/>
+ <subtitle
+ font-family="{$title.fontset}"/>
+ </t:titlepage-content>
+
+ <t:titlepage-content t:side="verso">
+ </t:titlepage-content>
+
+ <t:titlepage-separator>
+ </t:titlepage-separator>
+
+ <t:titlepage-before t:side="recto">
+ </t:titlepage-before>
+
+ <t:titlepage-before t:side="verso">
+ </t:titlepage-before>
+ </t:titlepage>
+
+<!-- ==================================================================== -->
+
+ <!-- The indexdiv.title template is used so that manual and -->
+ <!-- automatically generated indexdiv titles get the same -->
+ <!-- formatting. -->
+
+ <t:titlepage t:element="indexdiv" t:wrapper="fo:block">
+ <t:titlepage-content t:side="recto">
+ <title t:force="1"
+ t:named-template="indexdiv.title"
+ param:title="title"/>
+ <subtitle
+ font-family="{$title.fontset}"/>
+ </t:titlepage-content>
+
+ <t:titlepage-content t:side="verso">
+ </t:titlepage-content>
+
+ <t:titlepage-separator>
+ </t:titlepage-separator>
+
+ <t:titlepage-before t:side="recto">
+ </t:titlepage-before>
+
+ <t:titlepage-before t:side="verso">
+ </t:titlepage-before>
+ </t:titlepage>
+
+<!-- ==================================================================== -->
+
+ <t:titlepage t:element="setindex" t:wrapper="fo:block">
+ <t:titlepage-content t:side="recto">
+ <title
+ t:force="1"
+ t:named-template="component.title"
+ param:node="ancestor-or-self::setindex[1]"
+ param:pagewide="1"
+ margin-left="0pt"
+ font-size="&hsize5;"
+ font-family="{$title.fontset}"
+ font-weight="bold"/>
+ <subtitle
+ font-family="{$title.fontset}"/>
+ </t:titlepage-content>
+
+ <t:titlepage-content t:side="verso">
+ </t:titlepage-content>
+
+ <t:titlepage-separator>
+ </t:titlepage-separator>
+
+ <t:titlepage-before t:side="recto">
+ </t:titlepage-before>
+
+ <t:titlepage-before t:side="verso">
+ </t:titlepage-before>
+ </t:titlepage>
+
+<!-- ==================================================================== -->
+
+ <t:titlepage t:element="colophon" t:wrapper="fo:block">
+ <t:titlepage-content t:side="recto">
+ <title
+ t:force="1"
+ t:named-template="component.title"
+ param:node="ancestor-or-self::colophon[1]"
+ margin-left="{$title.margin.left}"
+ font-size="&hsize5;"
+ font-family="{$title.fontset}"
+ font-weight="bold"/>
+ <subtitle
+ font-family="{$title.fontset}"/>
+ </t:titlepage-content>
+
+ <t:titlepage-content t:side="verso">
+ </t:titlepage-content>
+
+ <t:titlepage-separator>
+ </t:titlepage-separator>
+
+ <t:titlepage-before t:side="recto">
+ </t:titlepage-before>
+
+ <t:titlepage-before t:side="verso">
+ </t:titlepage-before>
+</t:titlepage>
+
+<!-- ==================================================================== -->
+
+ <t:titlepage t:element="sidebar" t:wrapper="fo:block">
+ <t:titlepage-content t:side="recto">
+ <title
+ font-family="{$title.fontset}"
+ font-weight="bold"/>
+ <subtitle
+ font-family="{$title.fontset}"/>
+ </t:titlepage-content>
+
+ <t:titlepage-content t:side="verso">
+ </t:titlepage-content>
+
+ <t:titlepage-separator>
+ </t:titlepage-separator>
+
+ <t:titlepage-before t:side="recto">
+ </t:titlepage-before>
+
+ <t:titlepage-before t:side="verso">
+ </t:titlepage-before>
+ </t:titlepage>
+
+<!-- ==================================================================== -->
+<t:titlepage t:element="qandaset" t:wrapper="fo:block"
+ font-family="{$title.fontset}">
+
+ <t:titlepage-content t:side="recto"
+ start-indent="0pt"
+ text-align="center">
+
+ <title t:named-template="component.title"
+ param:node="ancestor-or-self::qandaset[1]"
+ keep-with-next.within-column="always"
+ font-size="&hsize5;"
+ font-weight="bold"/>
+
+ <subtitle/>
+
+ <corpauthor space-before="0.5em"
+ font-size="&hsize2;"/>
+ <authorgroup space-before="0.5em"
+ font-size="&hsize2;"/>
+ <author space-before="0.5em"
+ font-size="&hsize2;"/>
+
+ <othercredit space-before="0.5em"/>
+ <releaseinfo space-before="0.5em"/>
+ <copyright space-before="0.5em"/>
+ <legalnotice text-align="start"
+ margin-left="0.5in"
+ margin-right="0.5in"
+ font-family="{$body.fontset}"/>
+ <pubdate space-before="0.5em"/>
+ <revision space-before="0.5em"/>
+ <revhistory space-before="0.5em"/>
+ <abstract space-before="0.5em"
+ text-align="start"
+ margin-left="0.5in"
+ margin-right="0.5in"
+ font-family="{$body.fontset}"/>
+ </t:titlepage-content>
+
+ <t:titlepage-content t:side="verso">
+ </t:titlepage-content>
+
+ <t:titlepage-separator>
+ </t:titlepage-separator>
+
+ <t:titlepage-before t:side="recto">
+ </t:titlepage-before>
+
+ <t:titlepage-before t:side="verso">
+ </t:titlepage-before>
+</t:titlepage>
+
+<!-- ==================================================================== -->
+
+ <t:titlepage t:element="table.of.contents" t:wrapper="fo:block">
+ <t:titlepage-content t:side="recto">
+ <title
+ t:force="1"
+ t:named-template="gentext"
+ param:key="'TableofContents'"
+ space-before.minimum="1em"
+ space-before.optimum="1.5em"
+ space-before.maximum="2em"
+ space-after="0.5em"
+ margin-left="{$title.margin.left}"
+ start-indent="0pt"
+ font-size="&hsize3;"
+ font-weight="bold"
+ font-family="{$title.fontset}"/>
+ </t:titlepage-content>
+
+ <t:titlepage-content t:side="verso">
+ </t:titlepage-content>
+
+ <t:titlepage-separator>
+ </t:titlepage-separator>
+
+ <t:titlepage-before t:side="recto">
+ </t:titlepage-before>
+
+ <t:titlepage-before t:side="verso">
+ </t:titlepage-before>
+ </t:titlepage>
+
+ <t:titlepage t:element="list.of.tables" t:wrapper="fo:block">
+ <t:titlepage-content t:side="recto">
+ <title
+ t:force="1"
+ t:named-template="gentext"
+ param:key="'ListofTables'"
+ space-before.minimum="1em"
+ space-before.optimum="1.5em"
+ space-before.maximum="2em"
+ space-after="0.5em"
+ margin-left="{$title.margin.left}"
+ start-indent="0pt"
+ font-size="&hsize3;"
+ font-weight="bold"
+ font-family="{$title.fontset}"/>
+ </t:titlepage-content>
+
+ <t:titlepage-content t:side="verso">
+ </t:titlepage-content>
+
+ <t:titlepage-separator>
+ </t:titlepage-separator>
+
+ <t:titlepage-before t:side="recto">
+ </t:titlepage-before>
+
+ <t:titlepage-before t:side="verso">
+ </t:titlepage-before>
+ </t:titlepage>
+
+ <t:titlepage t:element="list.of.figures" t:wrapper="fo:block">
+ <t:titlepage-content t:side="recto">
+ <title
+ t:force="1"
+ t:named-template="gentext"
+ param:key="'ListofFigures'"
+ space-before.minimum="1em"
+ space-before.optimum="1.5em"
+ space-before.maximum="2em"
+ space-after="0.5em"
+ margin-left="{$title.margin.left}"
+ start-indent="0pt"
+ font-size="&hsize3;"
+ font-weight="bold"
+ font-family="{$title.fontset}"/>
+ </t:titlepage-content>
+
+ <t:titlepage-content t:side="verso">
+ </t:titlepage-content>
+
+ <t:titlepage-separator>
+ </t:titlepage-separator>
+
+ <t:titlepage-before t:side="recto">
+ </t:titlepage-before>
+
+ <t:titlepage-before t:side="verso">
+ </t:titlepage-before>
+ </t:titlepage>
+
+ <t:titlepage t:element="list.of.examples" t:wrapper="fo:block">
+ <t:titlepage-content t:side="recto">
+ <title
+ t:force="1"
+ t:named-template="gentext"
+ param:key="'ListofExamples'"
+ space-before.minimum="1em"
+ space-before.optimum="1.5em"
+ space-before.maximum="2em"
+ space-after="0.5em"
+ margin-left="{$title.margin.left}"
+ start-indent="0pt"
+ font-size="&hsize3;"
+ font-weight="bold"
+ font-family="{$title.fontset}"/>
+ </t:titlepage-content>
+
+ <t:titlepage-content t:side="verso">
+ </t:titlepage-content>
+
+ <t:titlepage-separator>
+ </t:titlepage-separator>
+
+ <t:titlepage-before t:side="recto">
+ </t:titlepage-before>
+
+ <t:titlepage-before t:side="verso">
+ </t:titlepage-before>
+ </t:titlepage>
+
+ <t:titlepage t:element="list.of.equations" t:wrapper="fo:block">
+ <t:titlepage-content t:side="recto">
+ <title
+ t:force="1"
+ t:named-template="gentext"
+ param:key="'ListofEquations'"
+ space-before.minimum="1em"
+ space-before.optimum="1.5em"
+ space-before.maximum="2em"
+ space-after="0.5em"
+ margin-left="{$title.margin.left}"
+ start-indent="0pt"
+ font-size="&hsize3;"
+ font-weight="bold"
+ font-family="{$title.fontset}"/>
+ </t:titlepage-content>
+
+ <t:titlepage-content t:side="verso">
+ </t:titlepage-content>
+
+ <t:titlepage-separator>
+ </t:titlepage-separator>
+
+ <t:titlepage-before t:side="recto">
+ </t:titlepage-before>
+
+ <t:titlepage-before t:side="verso">
+ </t:titlepage-before>
+ </t:titlepage>
+
+ <t:titlepage t:element="list.of.procedures" t:wrapper="fo:block">
+ <t:titlepage-content t:side="recto">
+ <title
+ t:force="1"
+ t:named-template="gentext"
+ param:key="'ListofProcedures'"
+ space-before.minimum="1em"
+ space-before.optimum="1.5em"
+ space-before.maximum="2em"
+ space-after="0.5em"
+ margin-left="{$title.margin.left}"
+ start-indent="0pt"
+ font-size="&hsize3;"
+ font-weight="bold"
+ font-family="{$title.fontset}"/>
+ </t:titlepage-content>
+
+ <t:titlepage-content t:side="verso">
+ </t:titlepage-content>
+
+ <t:titlepage-separator>
+ </t:titlepage-separator>
+
+ <t:titlepage-before t:side="recto">
+ </t:titlepage-before>
+
+ <t:titlepage-before t:side="verso">
+ </t:titlepage-before>
+ </t:titlepage>
+
+ <t:titlepage t:element="list.of.unknowns" t:wrapper="fo:block">
+ <t:titlepage-content t:side="recto">
+ <title
+ t:force="1"
+ t:named-template="gentext"
+ param:key="'ListofUnknown'"
+ space-before.minimum="1em"
+ space-before.optimum="1.5em"
+ space-before.maximum="2em"
+ space-after="0.5em"
+ margin-left="{$title.margin.left}"
+ start-indent="0pt"
+ font-size="&hsize3;"
+ font-weight="bold"
+ font-family="{$title.fontset}"/>
+ </t:titlepage-content>
+
+ <t:titlepage-content t:side="verso">
+ </t:titlepage-content>
+
+ <t:titlepage-separator>
+ </t:titlepage-separator>
+
+ <t:titlepage-before t:side="recto">
+ </t:titlepage-before>
+
+ <t:titlepage-before t:side="verso">
+ </t:titlepage-before>
+ </t:titlepage>
+
+<!-- ==================================================================== -->
+
+</t:templates>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/titlepage.templates.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/titlepage.templates.xsl
new file mode 100644
index 0000000..0b9cafa
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/titlepage.templates.xsl
@@ -0,0 +1,5182 @@
+<?xml version="1.0"?>
+
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:exsl="http://exslt.org/common" version="1.0" exclude-result-prefixes="exsl">
+
+<!-- This stylesheet was created by template/titlepage.xsl-->
+
+<xsl:template name="article.titlepage.recto">
+ <xsl:choose>
+ <xsl:when test="articleinfo/title">
+ <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="articleinfo/title"/>
+ </xsl:when>
+ <xsl:when test="artheader/title">
+ <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="artheader/title"/>
+ </xsl:when>
+ <xsl:when test="info/title">
+ <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="info/title"/>
+ </xsl:when>
+ <xsl:when test="title">
+ <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="title"/>
+ </xsl:when>
+ </xsl:choose>
+
+ <xsl:choose>
+ <xsl:when test="articleinfo/subtitle">
+ <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="articleinfo/subtitle"/>
+ </xsl:when>
+ <xsl:when test="artheader/subtitle">
+ <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="artheader/subtitle"/>
+ </xsl:when>
+ <xsl:when test="info/subtitle">
+ <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="info/subtitle"/>
+ </xsl:when>
+ <xsl:when test="subtitle">
+ <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="subtitle"/>
+ </xsl:when>
+ </xsl:choose>
+
+ <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="articleinfo/corpauthor"/>
+ <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="artheader/corpauthor"/>
+ <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="info/corpauthor"/>
+ <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="articleinfo/authorgroup"/>
+ <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="artheader/authorgroup"/>
+ <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="info/authorgroup"/>
+ <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="articleinfo/author"/>
+ <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="artheader/author"/>
+ <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="info/author"/>
+ <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="articleinfo/othercredit"/>
+ <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="artheader/othercredit"/>
+ <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="info/othercredit"/>
+ <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="articleinfo/releaseinfo"/>
+ <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="artheader/releaseinfo"/>
+ <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="info/releaseinfo"/>
+ <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="articleinfo/copyright"/>
+ <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="artheader/copyright"/>
+ <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="info/copyright"/>
+ <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="articleinfo/legalnotice"/>
+ <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="artheader/legalnotice"/>
+ <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="info/legalnotice"/>
+ <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="articleinfo/pubdate"/>
+ <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="artheader/pubdate"/>
+ <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="info/pubdate"/>
+ <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="articleinfo/revision"/>
+ <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="artheader/revision"/>
+ <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="info/revision"/>
+ <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="articleinfo/revhistory"/>
+ <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="artheader/revhistory"/>
+ <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="info/revhistory"/>
+ <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="articleinfo/abstract"/>
+ <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="artheader/abstract"/>
+ <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="info/abstract"/>
+</xsl:template>
+
+<xsl:template name="article.titlepage.verso">
+</xsl:template>
+
+<xsl:template name="article.titlepage.separator">
+</xsl:template>
+
+<xsl:template name="article.titlepage.before.recto">
+</xsl:template>
+
+<xsl:template name="article.titlepage.before.verso">
+</xsl:template>
+
+<xsl:template name="article.titlepage">
+ <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" font-family="{$title.fontset}">
+ <xsl:variable name="recto.content">
+ <xsl:call-template name="article.titlepage.before.recto"/>
+ <xsl:call-template name="article.titlepage.recto"/>
+ </xsl:variable>
+ <xsl:variable name="recto.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($recto.content) != '') or ($recto.elements.count &gt; 0)">
+ <fo:block start-indent="0pt" text-align="center"><xsl:copy-of select="$recto.content"/></fo:block>
+ </xsl:if>
+ <xsl:variable name="verso.content">
+ <xsl:call-template name="article.titlepage.before.verso"/>
+ <xsl:call-template name="article.titlepage.verso"/>
+ </xsl:variable>
+ <xsl:variable name="verso.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($verso.content) != '') or ($verso.elements.count &gt; 0)">
+ <fo:block><xsl:copy-of select="$verso.content"/></fo:block>
+ </xsl:if>
+ <xsl:call-template name="article.titlepage.separator"/>
+ </fo:block>
+</xsl:template>
+
+<xsl:template match="*" mode="article.titlepage.recto.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="*" mode="article.titlepage.verso.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="title" mode="article.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="article.titlepage.recto.style" keep-with-next.within-column="always" font-size="24.8832pt" font-weight="bold">
+<xsl:call-template name="component.title">
+<xsl:with-param name="node" select="ancestor-or-self::article[1]"/>
+</xsl:call-template>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="subtitle" mode="article.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="article.titlepage.recto.style">
+<xsl:apply-templates select="." mode="article.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="corpauthor" mode="article.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="article.titlepage.recto.style" space-before="0.5em" font-size="14.4pt">
+<xsl:apply-templates select="." mode="article.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="authorgroup" mode="article.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="article.titlepage.recto.style" space-before="0.5em" font-size="14.4pt">
+<xsl:apply-templates select="." mode="article.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="author" mode="article.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="article.titlepage.recto.style" space-before="0.5em" font-size="14.4pt">
+<xsl:apply-templates select="." mode="article.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="othercredit" mode="article.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="article.titlepage.recto.style" space-before="0.5em">
+<xsl:apply-templates select="." mode="article.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="releaseinfo" mode="article.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="article.titlepage.recto.style" space-before="0.5em">
+<xsl:apply-templates select="." mode="article.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="copyright" mode="article.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="article.titlepage.recto.style" space-before="0.5em">
+<xsl:apply-templates select="." mode="article.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="legalnotice" mode="article.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="article.titlepage.recto.style" text-align="start" margin-left="0.5in" margin-right="0.5in" font-family="{$body.fontset}">
+<xsl:apply-templates select="." mode="article.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="pubdate" mode="article.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="article.titlepage.recto.style" space-before="0.5em">
+<xsl:apply-templates select="." mode="article.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="revision" mode="article.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="article.titlepage.recto.style" space-before="0.5em">
+<xsl:apply-templates select="." mode="article.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="revhistory" mode="article.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="article.titlepage.recto.style" space-before="0.5em">
+<xsl:apply-templates select="." mode="article.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="abstract" mode="article.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="article.titlepage.recto.style" space-before="0.5em" text-align="start" margin-left="0.5in" margin-right="0.5in" font-family="{$body.fontset}">
+<xsl:apply-templates select="." mode="article.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template name="set.titlepage.recto">
+ <xsl:choose>
+ <xsl:when test="setinfo/title">
+ <xsl:apply-templates mode="set.titlepage.recto.auto.mode" select="setinfo/title"/>
+ </xsl:when>
+ <xsl:when test="info/title">
+ <xsl:apply-templates mode="set.titlepage.recto.auto.mode" select="info/title"/>
+ </xsl:when>
+ <xsl:when test="title">
+ <xsl:apply-templates mode="set.titlepage.recto.auto.mode" select="title"/>
+ </xsl:when>
+ </xsl:choose>
+
+ <xsl:choose>
+ <xsl:when test="setinfo/subtitle">
+ <xsl:apply-templates mode="set.titlepage.recto.auto.mode" select="setinfo/subtitle"/>
+ </xsl:when>
+ <xsl:when test="info/subtitle">
+ <xsl:apply-templates mode="set.titlepage.recto.auto.mode" select="info/subtitle"/>
+ </xsl:when>
+ <xsl:when test="subtitle">
+ <xsl:apply-templates mode="set.titlepage.recto.auto.mode" select="subtitle"/>
+ </xsl:when>
+ </xsl:choose>
+
+ <xsl:apply-templates mode="set.titlepage.recto.auto.mode" select="setinfo/corpauthor"/>
+ <xsl:apply-templates mode="set.titlepage.recto.auto.mode" select="info/corpauthor"/>
+ <xsl:apply-templates mode="set.titlepage.recto.auto.mode" select="setinfo/authorgroup"/>
+ <xsl:apply-templates mode="set.titlepage.recto.auto.mode" select="info/authorgroup"/>
+ <xsl:apply-templates mode="set.titlepage.recto.auto.mode" select="setinfo/author"/>
+ <xsl:apply-templates mode="set.titlepage.recto.auto.mode" select="info/author"/>
+ <xsl:apply-templates mode="set.titlepage.recto.auto.mode" select="setinfo/othercredit"/>
+ <xsl:apply-templates mode="set.titlepage.recto.auto.mode" select="info/othercredit"/>
+ <xsl:apply-templates mode="set.titlepage.recto.auto.mode" select="setinfo/releaseinfo"/>
+ <xsl:apply-templates mode="set.titlepage.recto.auto.mode" select="info/releaseinfo"/>
+ <xsl:apply-templates mode="set.titlepage.recto.auto.mode" select="setinfo/copyright"/>
+ <xsl:apply-templates mode="set.titlepage.recto.auto.mode" select="info/copyright"/>
+ <xsl:apply-templates mode="set.titlepage.recto.auto.mode" select="setinfo/legalnotice"/>
+ <xsl:apply-templates mode="set.titlepage.recto.auto.mode" select="info/legalnotice"/>
+ <xsl:apply-templates mode="set.titlepage.recto.auto.mode" select="setinfo/pubdate"/>
+ <xsl:apply-templates mode="set.titlepage.recto.auto.mode" select="info/pubdate"/>
+ <xsl:apply-templates mode="set.titlepage.recto.auto.mode" select="setinfo/revision"/>
+ <xsl:apply-templates mode="set.titlepage.recto.auto.mode" select="info/revision"/>
+ <xsl:apply-templates mode="set.titlepage.recto.auto.mode" select="setinfo/revhistory"/>
+ <xsl:apply-templates mode="set.titlepage.recto.auto.mode" select="info/revhistory"/>
+ <xsl:apply-templates mode="set.titlepage.recto.auto.mode" select="setinfo/abstract"/>
+ <xsl:apply-templates mode="set.titlepage.recto.auto.mode" select="info/abstract"/>
+</xsl:template>
+
+<xsl:template name="set.titlepage.verso">
+</xsl:template>
+
+<xsl:template name="set.titlepage.separator">
+</xsl:template>
+
+<xsl:template name="set.titlepage.before.recto">
+</xsl:template>
+
+<xsl:template name="set.titlepage.before.verso">
+</xsl:template>
+
+<xsl:template name="set.titlepage">
+ <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format">
+ <xsl:variable name="recto.content">
+ <xsl:call-template name="set.titlepage.before.recto"/>
+ <xsl:call-template name="set.titlepage.recto"/>
+ </xsl:variable>
+ <xsl:variable name="recto.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($recto.content) != '') or ($recto.elements.count &gt; 0)">
+ <fo:block><xsl:copy-of select="$recto.content"/></fo:block>
+ </xsl:if>
+ <xsl:variable name="verso.content">
+ <xsl:call-template name="set.titlepage.before.verso"/>
+ <xsl:call-template name="set.titlepage.verso"/>
+ </xsl:variable>
+ <xsl:variable name="verso.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($verso.content) != '') or ($verso.elements.count &gt; 0)">
+ <fo:block><xsl:copy-of select="$verso.content"/></fo:block>
+ </xsl:if>
+ <xsl:call-template name="set.titlepage.separator"/>
+ </fo:block>
+</xsl:template>
+
+<xsl:template match="*" mode="set.titlepage.recto.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="*" mode="set.titlepage.verso.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="title" mode="set.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="set.titlepage.recto.style" text-align="center" font-size="24.8832pt" space-before="18.6624pt" font-weight="bold" font-family="{$title.fontset}">
+<xsl:call-template name="division.title">
+<xsl:with-param name="node" select="ancestor-or-self::set[1]"/>
+</xsl:call-template>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="subtitle" mode="set.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="set.titlepage.recto.style" font-family="{$title.fontset}" text-align="center">
+<xsl:apply-templates select="." mode="set.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="corpauthor" mode="set.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="set.titlepage.recto.style">
+<xsl:apply-templates select="." mode="set.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="authorgroup" mode="set.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="set.titlepage.recto.style">
+<xsl:apply-templates select="." mode="set.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="author" mode="set.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="set.titlepage.recto.style">
+<xsl:apply-templates select="." mode="set.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="othercredit" mode="set.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="set.titlepage.recto.style">
+<xsl:apply-templates select="." mode="set.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="releaseinfo" mode="set.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="set.titlepage.recto.style">
+<xsl:apply-templates select="." mode="set.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="copyright" mode="set.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="set.titlepage.recto.style">
+<xsl:apply-templates select="." mode="set.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="legalnotice" mode="set.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="set.titlepage.recto.style">
+<xsl:apply-templates select="." mode="set.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="pubdate" mode="set.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="set.titlepage.recto.style">
+<xsl:apply-templates select="." mode="set.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="revision" mode="set.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="set.titlepage.recto.style">
+<xsl:apply-templates select="." mode="set.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="revhistory" mode="set.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="set.titlepage.recto.style">
+<xsl:apply-templates select="." mode="set.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="abstract" mode="set.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="set.titlepage.recto.style">
+<xsl:apply-templates select="." mode="set.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template name="book.titlepage.recto">
+ <xsl:choose>
+ <xsl:when test="bookinfo/title">
+ <xsl:apply-templates mode="book.titlepage.recto.auto.mode" select="bookinfo/title"/>
+ </xsl:when>
+ <xsl:when test="info/title">
+ <xsl:apply-templates mode="book.titlepage.recto.auto.mode" select="info/title"/>
+ </xsl:when>
+ <xsl:when test="title">
+ <xsl:apply-templates mode="book.titlepage.recto.auto.mode" select="title"/>
+ </xsl:when>
+ </xsl:choose>
+
+ <xsl:choose>
+ <xsl:when test="bookinfo/subtitle">
+ <xsl:apply-templates mode="book.titlepage.recto.auto.mode" select="bookinfo/subtitle"/>
+ </xsl:when>
+ <xsl:when test="info/subtitle">
+ <xsl:apply-templates mode="book.titlepage.recto.auto.mode" select="info/subtitle"/>
+ </xsl:when>
+ <xsl:when test="subtitle">
+ <xsl:apply-templates mode="book.titlepage.recto.auto.mode" select="subtitle"/>
+ </xsl:when>
+ </xsl:choose>
+
+ <xsl:apply-templates mode="book.titlepage.recto.auto.mode" select="bookinfo/corpauthor"/>
+ <xsl:apply-templates mode="book.titlepage.recto.auto.mode" select="info/corpauthor"/>
+ <xsl:apply-templates mode="book.titlepage.recto.auto.mode" select="bookinfo/authorgroup"/>
+ <xsl:apply-templates mode="book.titlepage.recto.auto.mode" select="info/authorgroup"/>
+ <xsl:apply-templates mode="book.titlepage.recto.auto.mode" select="bookinfo/author"/>
+ <xsl:apply-templates mode="book.titlepage.recto.auto.mode" select="info/author"/>
+</xsl:template>
+
+<xsl:template name="book.titlepage.verso">
+ <xsl:choose>
+ <xsl:when test="bookinfo/title">
+ <xsl:apply-templates mode="book.titlepage.verso.auto.mode" select="bookinfo/title"/>
+ </xsl:when>
+ <xsl:when test="info/title">
+ <xsl:apply-templates mode="book.titlepage.verso.auto.mode" select="info/title"/>
+ </xsl:when>
+ <xsl:when test="title">
+ <xsl:apply-templates mode="book.titlepage.verso.auto.mode" select="title"/>
+ </xsl:when>
+ </xsl:choose>
+
+ <xsl:apply-templates mode="book.titlepage.verso.auto.mode" select="bookinfo/corpauthor"/>
+ <xsl:apply-templates mode="book.titlepage.verso.auto.mode" select="info/corpauthor"/>
+ <xsl:apply-templates mode="book.titlepage.verso.auto.mode" select="bookinfo/authorgroup"/>
+ <xsl:apply-templates mode="book.titlepage.verso.auto.mode" select="info/authorgroup"/>
+ <xsl:apply-templates mode="book.titlepage.verso.auto.mode" select="bookinfo/author"/>
+ <xsl:apply-templates mode="book.titlepage.verso.auto.mode" select="info/author"/>
+ <xsl:apply-templates mode="book.titlepage.verso.auto.mode" select="bookinfo/othercredit"/>
+ <xsl:apply-templates mode="book.titlepage.verso.auto.mode" select="info/othercredit"/>
+ <xsl:apply-templates mode="book.titlepage.verso.auto.mode" select="bookinfo/releaseinfo"/>
+ <xsl:apply-templates mode="book.titlepage.verso.auto.mode" select="info/releaseinfo"/>
+ <xsl:apply-templates mode="book.titlepage.verso.auto.mode" select="bookinfo/pubdate"/>
+ <xsl:apply-templates mode="book.titlepage.verso.auto.mode" select="info/pubdate"/>
+ <xsl:apply-templates mode="book.titlepage.verso.auto.mode" select="bookinfo/copyright"/>
+ <xsl:apply-templates mode="book.titlepage.verso.auto.mode" select="info/copyright"/>
+ <xsl:apply-templates mode="book.titlepage.verso.auto.mode" select="bookinfo/abstract"/>
+ <xsl:apply-templates mode="book.titlepage.verso.auto.mode" select="info/abstract"/>
+ <xsl:apply-templates mode="book.titlepage.verso.auto.mode" select="bookinfo/legalnotice"/>
+ <xsl:apply-templates mode="book.titlepage.verso.auto.mode" select="info/legalnotice"/>
+</xsl:template>
+
+<xsl:template name="book.titlepage.separator"><fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" break-after="page"/>
+</xsl:template>
+
+<xsl:template name="book.titlepage.before.recto">
+</xsl:template>
+
+<xsl:template name="book.titlepage.before.verso"><fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" break-after="page"/>
+</xsl:template>
+
+<xsl:template name="book.titlepage">
+ <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format">
+ <xsl:variable name="recto.content">
+ <xsl:call-template name="book.titlepage.before.recto"/>
+ <xsl:call-template name="book.titlepage.recto"/>
+ </xsl:variable>
+ <xsl:variable name="recto.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($recto.content) != '') or ($recto.elements.count &gt; 0)">
+ <fo:block><xsl:copy-of select="$recto.content"/></fo:block>
+ </xsl:if>
+ <xsl:variable name="verso.content">
+ <xsl:call-template name="book.titlepage.before.verso"/>
+ <xsl:call-template name="book.titlepage.verso"/>
+ </xsl:variable>
+ <xsl:variable name="verso.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($verso.content) != '') or ($verso.elements.count &gt; 0)">
+ <fo:block><xsl:copy-of select="$verso.content"/></fo:block>
+ </xsl:if>
+ <xsl:call-template name="book.titlepage.separator"/>
+ </fo:block>
+</xsl:template>
+
+<xsl:template match="*" mode="book.titlepage.recto.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="*" mode="book.titlepage.verso.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="title" mode="book.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="book.titlepage.recto.style" text-align="center" font-size="24.8832pt" space-before="18.6624pt" font-weight="bold" font-family="{$title.fontset}">
+<xsl:call-template name="division.title">
+<xsl:with-param name="node" select="ancestor-or-self::book[1]"/>
+</xsl:call-template>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="subtitle" mode="book.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="book.titlepage.recto.style" text-align="center" font-size="20.736pt" space-before="15.552pt" font-family="{$title.fontset}">
+<xsl:apply-templates select="." mode="book.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="corpauthor" mode="book.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="book.titlepage.recto.style" font-size="17.28pt" keep-with-next.within-column="always" space-before="2in">
+<xsl:apply-templates select="." mode="book.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="authorgroup" mode="book.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="book.titlepage.recto.style" space-before="2in">
+<xsl:apply-templates select="." mode="book.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="author" mode="book.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="book.titlepage.recto.style" font-size="17.28pt" space-before="10.8pt" keep-with-next.within-column="always">
+<xsl:apply-templates select="." mode="book.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="title" mode="book.titlepage.verso.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="book.titlepage.verso.style" font-size="14.4pt" font-weight="bold" font-family="{$title.fontset}">
+<xsl:call-template name="book.verso.title">
+</xsl:call-template>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="corpauthor" mode="book.titlepage.verso.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="book.titlepage.verso.style">
+<xsl:apply-templates select="." mode="book.titlepage.verso.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="authorgroup" mode="book.titlepage.verso.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="book.titlepage.verso.style">
+<xsl:call-template name="verso.authorgroup">
+</xsl:call-template>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="author" mode="book.titlepage.verso.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="book.titlepage.verso.style">
+<xsl:apply-templates select="." mode="book.titlepage.verso.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="othercredit" mode="book.titlepage.verso.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="book.titlepage.verso.style">
+<xsl:apply-templates select="." mode="book.titlepage.verso.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="releaseinfo" mode="book.titlepage.verso.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="book.titlepage.verso.style" space-before="0.5em">
+<xsl:apply-templates select="." mode="book.titlepage.verso.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="pubdate" mode="book.titlepage.verso.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="book.titlepage.verso.style" space-before="1em">
+<xsl:apply-templates select="." mode="book.titlepage.verso.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="copyright" mode="book.titlepage.verso.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="book.titlepage.verso.style">
+<xsl:apply-templates select="." mode="book.titlepage.verso.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="abstract" mode="book.titlepage.verso.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="book.titlepage.verso.style">
+<xsl:apply-templates select="." mode="book.titlepage.verso.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="legalnotice" mode="book.titlepage.verso.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="book.titlepage.verso.style" font-size="8pt">
+<xsl:apply-templates select="." mode="book.titlepage.verso.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template name="part.titlepage.recto">
+ <xsl:choose>
+ <xsl:when test="partinfo/title">
+ <xsl:apply-templates mode="part.titlepage.recto.auto.mode" select="partinfo/title"/>
+ </xsl:when>
+ <xsl:when test="docinfo/title">
+ <xsl:apply-templates mode="part.titlepage.recto.auto.mode" select="docinfo/title"/>
+ </xsl:when>
+ <xsl:when test="info/title">
+ <xsl:apply-templates mode="part.titlepage.recto.auto.mode" select="info/title"/>
+ </xsl:when>
+ <xsl:when test="title">
+ <xsl:apply-templates mode="part.titlepage.recto.auto.mode" select="title"/>
+ </xsl:when>
+ </xsl:choose>
+
+ <xsl:choose>
+ <xsl:when test="partinfo/subtitle">
+ <xsl:apply-templates mode="part.titlepage.recto.auto.mode" select="partinfo/subtitle"/>
+ </xsl:when>
+ <xsl:when test="docinfo/subtitle">
+ <xsl:apply-templates mode="part.titlepage.recto.auto.mode" select="docinfo/subtitle"/>
+ </xsl:when>
+ <xsl:when test="info/subtitle">
+ <xsl:apply-templates mode="part.titlepage.recto.auto.mode" select="info/subtitle"/>
+ </xsl:when>
+ <xsl:when test="subtitle">
+ <xsl:apply-templates mode="part.titlepage.recto.auto.mode" select="subtitle"/>
+ </xsl:when>
+ </xsl:choose>
+
+</xsl:template>
+
+<xsl:template name="part.titlepage.verso">
+</xsl:template>
+
+<xsl:template name="part.titlepage.separator">
+</xsl:template>
+
+<xsl:template name="part.titlepage.before.recto">
+</xsl:template>
+
+<xsl:template name="part.titlepage.before.verso">
+</xsl:template>
+
+<xsl:template name="part.titlepage">
+ <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format">
+ <xsl:variable name="recto.content">
+ <xsl:call-template name="part.titlepage.before.recto"/>
+ <xsl:call-template name="part.titlepage.recto"/>
+ </xsl:variable>
+ <xsl:variable name="recto.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($recto.content) != '') or ($recto.elements.count &gt; 0)">
+ <fo:block><xsl:copy-of select="$recto.content"/></fo:block>
+ </xsl:if>
+ <xsl:variable name="verso.content">
+ <xsl:call-template name="part.titlepage.before.verso"/>
+ <xsl:call-template name="part.titlepage.verso"/>
+ </xsl:variable>
+ <xsl:variable name="verso.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($verso.content) != '') or ($verso.elements.count &gt; 0)">
+ <fo:block><xsl:copy-of select="$verso.content"/></fo:block>
+ </xsl:if>
+ <xsl:call-template name="part.titlepage.separator"/>
+ </fo:block>
+</xsl:template>
+
+<xsl:template match="*" mode="part.titlepage.recto.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="*" mode="part.titlepage.verso.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="title" mode="part.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="part.titlepage.recto.style" text-align="center" font-size="24.8832pt" space-before="18.6624pt" font-weight="bold" font-family="{$title.fontset}">
+<xsl:call-template name="division.title">
+<xsl:with-param name="node" select="ancestor-or-self::part[1]"/>
+</xsl:call-template>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="subtitle" mode="part.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="part.titlepage.recto.style" text-align="center" font-size="20.736pt" space-before="15.552pt" font-weight="bold" font-style="italic" font-family="{$title.fontset}">
+<xsl:apply-templates select="." mode="part.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template name="partintro.titlepage.recto">
+ <xsl:choose>
+ <xsl:when test="partintroinfo/title">
+ <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="partintroinfo/title"/>
+ </xsl:when>
+ <xsl:when test="docinfo/title">
+ <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="docinfo/title"/>
+ </xsl:when>
+ <xsl:when test="info/title">
+ <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="info/title"/>
+ </xsl:when>
+ <xsl:when test="title">
+ <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="title"/>
+ </xsl:when>
+ </xsl:choose>
+
+ <xsl:choose>
+ <xsl:when test="partintroinfo/subtitle">
+ <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="partintroinfo/subtitle"/>
+ </xsl:when>
+ <xsl:when test="docinfo/subtitle">
+ <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="docinfo/subtitle"/>
+ </xsl:when>
+ <xsl:when test="info/subtitle">
+ <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="info/subtitle"/>
+ </xsl:when>
+ <xsl:when test="subtitle">
+ <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="subtitle"/>
+ </xsl:when>
+ </xsl:choose>
+
+ <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="partintroinfo/corpauthor"/>
+ <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="docinfo/corpauthor"/>
+ <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="info/corpauthor"/>
+ <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="partintroinfo/authorgroup"/>
+ <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="docinfo/authorgroup"/>
+ <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="info/authorgroup"/>
+ <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="partintroinfo/author"/>
+ <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="docinfo/author"/>
+ <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="info/author"/>
+ <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="partintroinfo/othercredit"/>
+ <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="docinfo/othercredit"/>
+ <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="info/othercredit"/>
+ <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="partintroinfo/releaseinfo"/>
+ <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="docinfo/releaseinfo"/>
+ <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="info/releaseinfo"/>
+ <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="partintroinfo/copyright"/>
+ <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="docinfo/copyright"/>
+ <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="info/copyright"/>
+ <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="partintroinfo/legalnotice"/>
+ <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="docinfo/legalnotice"/>
+ <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="info/legalnotice"/>
+ <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="partintroinfo/pubdate"/>
+ <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="docinfo/pubdate"/>
+ <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="info/pubdate"/>
+ <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="partintroinfo/revision"/>
+ <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="docinfo/revision"/>
+ <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="info/revision"/>
+ <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="partintroinfo/revhistory"/>
+ <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="docinfo/revhistory"/>
+ <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="info/revhistory"/>
+ <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="partintroinfo/abstract"/>
+ <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="docinfo/abstract"/>
+ <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="info/abstract"/>
+</xsl:template>
+
+<xsl:template name="partintro.titlepage.verso">
+</xsl:template>
+
+<xsl:template name="partintro.titlepage.separator">
+</xsl:template>
+
+<xsl:template name="partintro.titlepage.before.recto">
+</xsl:template>
+
+<xsl:template name="partintro.titlepage.before.verso">
+</xsl:template>
+
+<xsl:template name="partintro.titlepage">
+ <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format">
+ <xsl:variable name="recto.content">
+ <xsl:call-template name="partintro.titlepage.before.recto"/>
+ <xsl:call-template name="partintro.titlepage.recto"/>
+ </xsl:variable>
+ <xsl:variable name="recto.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($recto.content) != '') or ($recto.elements.count &gt; 0)">
+ <fo:block><xsl:copy-of select="$recto.content"/></fo:block>
+ </xsl:if>
+ <xsl:variable name="verso.content">
+ <xsl:call-template name="partintro.titlepage.before.verso"/>
+ <xsl:call-template name="partintro.titlepage.verso"/>
+ </xsl:variable>
+ <xsl:variable name="verso.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($verso.content) != '') or ($verso.elements.count &gt; 0)">
+ <fo:block><xsl:copy-of select="$verso.content"/></fo:block>
+ </xsl:if>
+ <xsl:call-template name="partintro.titlepage.separator"/>
+ </fo:block>
+</xsl:template>
+
+<xsl:template match="*" mode="partintro.titlepage.recto.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="*" mode="partintro.titlepage.verso.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="title" mode="partintro.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="partintro.titlepage.recto.style" text-align="center" font-size="24.8832pt" font-weight="bold" space-before="1em" font-family="{$title.fontset}">
+<xsl:apply-templates select="." mode="partintro.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="subtitle" mode="partintro.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="partintro.titlepage.recto.style" text-align="center" font-size="14.4pt" font-weight="bold" font-style="italic" font-family="{$title.fontset}">
+<xsl:apply-templates select="." mode="partintro.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="corpauthor" mode="partintro.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="partintro.titlepage.recto.style">
+<xsl:apply-templates select="." mode="partintro.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="authorgroup" mode="partintro.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="partintro.titlepage.recto.style">
+<xsl:apply-templates select="." mode="partintro.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="author" mode="partintro.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="partintro.titlepage.recto.style">
+<xsl:apply-templates select="." mode="partintro.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="othercredit" mode="partintro.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="partintro.titlepage.recto.style">
+<xsl:apply-templates select="." mode="partintro.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="releaseinfo" mode="partintro.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="partintro.titlepage.recto.style">
+<xsl:apply-templates select="." mode="partintro.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="copyright" mode="partintro.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="partintro.titlepage.recto.style">
+<xsl:apply-templates select="." mode="partintro.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="legalnotice" mode="partintro.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="partintro.titlepage.recto.style">
+<xsl:apply-templates select="." mode="partintro.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="pubdate" mode="partintro.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="partintro.titlepage.recto.style">
+<xsl:apply-templates select="." mode="partintro.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="revision" mode="partintro.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="partintro.titlepage.recto.style">
+<xsl:apply-templates select="." mode="partintro.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="revhistory" mode="partintro.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="partintro.titlepage.recto.style">
+<xsl:apply-templates select="." mode="partintro.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="abstract" mode="partintro.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="partintro.titlepage.recto.style">
+<xsl:apply-templates select="." mode="partintro.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template name="reference.titlepage.recto">
+ <xsl:choose>
+ <xsl:when test="referenceinfo/title">
+ <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="referenceinfo/title"/>
+ </xsl:when>
+ <xsl:when test="docinfo/title">
+ <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="docinfo/title"/>
+ </xsl:when>
+ <xsl:when test="info/title">
+ <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="info/title"/>
+ </xsl:when>
+ <xsl:when test="title">
+ <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="title"/>
+ </xsl:when>
+ </xsl:choose>
+
+ <xsl:choose>
+ <xsl:when test="referenceinfo/subtitle">
+ <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="referenceinfo/subtitle"/>
+ </xsl:when>
+ <xsl:when test="docinfo/subtitle">
+ <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="docinfo/subtitle"/>
+ </xsl:when>
+ <xsl:when test="info/subtitle">
+ <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="info/subtitle"/>
+ </xsl:when>
+ <xsl:when test="subtitle">
+ <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="subtitle"/>
+ </xsl:when>
+ </xsl:choose>
+
+ <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="referenceinfo/corpauthor"/>
+ <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="docinfo/corpauthor"/>
+ <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="info/corpauthor"/>
+ <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="referenceinfo/authorgroup"/>
+ <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="docinfo/authorgroup"/>
+ <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="info/authorgroup"/>
+ <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="referenceinfo/author"/>
+ <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="docinfo/author"/>
+ <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="info/author"/>
+ <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="referenceinfo/othercredit"/>
+ <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="docinfo/othercredit"/>
+ <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="info/othercredit"/>
+ <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="referenceinfo/releaseinfo"/>
+ <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="docinfo/releaseinfo"/>
+ <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="info/releaseinfo"/>
+ <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="referenceinfo/copyright"/>
+ <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="docinfo/copyright"/>
+ <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="info/copyright"/>
+ <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="referenceinfo/legalnotice"/>
+ <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="docinfo/legalnotice"/>
+ <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="info/legalnotice"/>
+ <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="referenceinfo/pubdate"/>
+ <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="docinfo/pubdate"/>
+ <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="info/pubdate"/>
+ <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="referenceinfo/revision"/>
+ <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="docinfo/revision"/>
+ <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="info/revision"/>
+ <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="referenceinfo/revhistory"/>
+ <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="docinfo/revhistory"/>
+ <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="info/revhistory"/>
+ <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="referenceinfo/abstract"/>
+ <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="docinfo/abstract"/>
+ <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="info/abstract"/>
+</xsl:template>
+
+<xsl:template name="reference.titlepage.verso">
+</xsl:template>
+
+<xsl:template name="reference.titlepage.separator">
+</xsl:template>
+
+<xsl:template name="reference.titlepage.before.recto">
+</xsl:template>
+
+<xsl:template name="reference.titlepage.before.verso">
+</xsl:template>
+
+<xsl:template name="reference.titlepage">
+ <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format">
+ <xsl:variable name="recto.content">
+ <xsl:call-template name="reference.titlepage.before.recto"/>
+ <xsl:call-template name="reference.titlepage.recto"/>
+ </xsl:variable>
+ <xsl:variable name="recto.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($recto.content) != '') or ($recto.elements.count &gt; 0)">
+ <fo:block><xsl:copy-of select="$recto.content"/></fo:block>
+ </xsl:if>
+ <xsl:variable name="verso.content">
+ <xsl:call-template name="reference.titlepage.before.verso"/>
+ <xsl:call-template name="reference.titlepage.verso"/>
+ </xsl:variable>
+ <xsl:variable name="verso.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($verso.content) != '') or ($verso.elements.count &gt; 0)">
+ <fo:block><xsl:copy-of select="$verso.content"/></fo:block>
+ </xsl:if>
+ <xsl:call-template name="reference.titlepage.separator"/>
+ </fo:block>
+</xsl:template>
+
+<xsl:template match="*" mode="reference.titlepage.recto.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="*" mode="reference.titlepage.verso.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="title" mode="reference.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="reference.titlepage.recto.style" text-align="center" font-size="24.8832pt" space-before="18.6624pt" font-weight="bold" font-family="{$title.fontset}">
+<xsl:call-template name="division.title">
+<xsl:with-param name="node" select="ancestor-or-self::reference[1]"/>
+</xsl:call-template>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="subtitle" mode="reference.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="reference.titlepage.recto.style" font-family="{$title.fontset}" text-align="center">
+<xsl:apply-templates select="." mode="reference.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="corpauthor" mode="reference.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="reference.titlepage.recto.style">
+<xsl:apply-templates select="." mode="reference.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="authorgroup" mode="reference.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="reference.titlepage.recto.style">
+<xsl:apply-templates select="." mode="reference.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="author" mode="reference.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="reference.titlepage.recto.style">
+<xsl:apply-templates select="." mode="reference.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="othercredit" mode="reference.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="reference.titlepage.recto.style">
+<xsl:apply-templates select="." mode="reference.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="releaseinfo" mode="reference.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="reference.titlepage.recto.style">
+<xsl:apply-templates select="." mode="reference.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="copyright" mode="reference.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="reference.titlepage.recto.style">
+<xsl:apply-templates select="." mode="reference.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="legalnotice" mode="reference.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="reference.titlepage.recto.style">
+<xsl:apply-templates select="." mode="reference.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="pubdate" mode="reference.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="reference.titlepage.recto.style">
+<xsl:apply-templates select="." mode="reference.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="revision" mode="reference.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="reference.titlepage.recto.style">
+<xsl:apply-templates select="." mode="reference.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="revhistory" mode="reference.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="reference.titlepage.recto.style">
+<xsl:apply-templates select="." mode="reference.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="abstract" mode="reference.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="reference.titlepage.recto.style">
+<xsl:apply-templates select="." mode="reference.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template name="refsynopsisdiv.titlepage.recto">
+ <xsl:choose>
+ <xsl:when test="refsynopsisdivinfo/title">
+ <xsl:apply-templates mode="refsynopsisdiv.titlepage.recto.auto.mode" select="refsynopsisdivinfo/title"/>
+ </xsl:when>
+ <xsl:when test="docinfo/title">
+ <xsl:apply-templates mode="refsynopsisdiv.titlepage.recto.auto.mode" select="docinfo/title"/>
+ </xsl:when>
+ <xsl:when test="info/title">
+ <xsl:apply-templates mode="refsynopsisdiv.titlepage.recto.auto.mode" select="info/title"/>
+ </xsl:when>
+ <xsl:when test="title">
+ <xsl:apply-templates mode="refsynopsisdiv.titlepage.recto.auto.mode" select="title"/>
+ </xsl:when>
+ </xsl:choose>
+
+</xsl:template>
+
+<xsl:template name="refsynopsisdiv.titlepage.verso">
+</xsl:template>
+
+<xsl:template name="refsynopsisdiv.titlepage.separator">
+</xsl:template>
+
+<xsl:template name="refsynopsisdiv.titlepage.before.recto">
+</xsl:template>
+
+<xsl:template name="refsynopsisdiv.titlepage.before.verso">
+</xsl:template>
+
+<xsl:template name="refsynopsisdiv.titlepage">
+ <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format">
+ <xsl:variable name="recto.content">
+ <xsl:call-template name="refsynopsisdiv.titlepage.before.recto"/>
+ <xsl:call-template name="refsynopsisdiv.titlepage.recto"/>
+ </xsl:variable>
+ <xsl:variable name="recto.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($recto.content) != '') or ($recto.elements.count &gt; 0)">
+ <fo:block><xsl:copy-of select="$recto.content"/></fo:block>
+ </xsl:if>
+ <xsl:variable name="verso.content">
+ <xsl:call-template name="refsynopsisdiv.titlepage.before.verso"/>
+ <xsl:call-template name="refsynopsisdiv.titlepage.verso"/>
+ </xsl:variable>
+ <xsl:variable name="verso.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($verso.content) != '') or ($verso.elements.count &gt; 0)">
+ <fo:block><xsl:copy-of select="$verso.content"/></fo:block>
+ </xsl:if>
+ <xsl:call-template name="refsynopsisdiv.titlepage.separator"/>
+ </fo:block>
+</xsl:template>
+
+<xsl:template match="*" mode="refsynopsisdiv.titlepage.recto.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="*" mode="refsynopsisdiv.titlepage.verso.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="title" mode="refsynopsisdiv.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="refsynopsisdiv.titlepage.recto.style" font-family="{$title.fontset}">
+<xsl:apply-templates select="." mode="refsynopsisdiv.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template name="refsection.titlepage.recto">
+ <xsl:choose>
+ <xsl:when test="refsectioninfo/title">
+ <xsl:apply-templates mode="refsection.titlepage.recto.auto.mode" select="refsectioninfo/title"/>
+ </xsl:when>
+ <xsl:when test="docinfo/title">
+ <xsl:apply-templates mode="refsection.titlepage.recto.auto.mode" select="docinfo/title"/>
+ </xsl:when>
+ <xsl:when test="info/title">
+ <xsl:apply-templates mode="refsection.titlepage.recto.auto.mode" select="info/title"/>
+ </xsl:when>
+ <xsl:when test="title">
+ <xsl:apply-templates mode="refsection.titlepage.recto.auto.mode" select="title"/>
+ </xsl:when>
+ </xsl:choose>
+
+</xsl:template>
+
+<xsl:template name="refsection.titlepage.verso">
+</xsl:template>
+
+<xsl:template name="refsection.titlepage.separator">
+</xsl:template>
+
+<xsl:template name="refsection.titlepage.before.recto">
+</xsl:template>
+
+<xsl:template name="refsection.titlepage.before.verso">
+</xsl:template>
+
+<xsl:template name="refsection.titlepage">
+ <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format">
+ <xsl:variable name="recto.content">
+ <xsl:call-template name="refsection.titlepage.before.recto"/>
+ <xsl:call-template name="refsection.titlepage.recto"/>
+ </xsl:variable>
+ <xsl:variable name="recto.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($recto.content) != '') or ($recto.elements.count &gt; 0)">
+ <fo:block><xsl:copy-of select="$recto.content"/></fo:block>
+ </xsl:if>
+ <xsl:variable name="verso.content">
+ <xsl:call-template name="refsection.titlepage.before.verso"/>
+ <xsl:call-template name="refsection.titlepage.verso"/>
+ </xsl:variable>
+ <xsl:variable name="verso.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($verso.content) != '') or ($verso.elements.count &gt; 0)">
+ <fo:block><xsl:copy-of select="$verso.content"/></fo:block>
+ </xsl:if>
+ <xsl:call-template name="refsection.titlepage.separator"/>
+ </fo:block>
+</xsl:template>
+
+<xsl:template match="*" mode="refsection.titlepage.recto.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="*" mode="refsection.titlepage.verso.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="title" mode="refsection.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="refsection.titlepage.recto.style" font-family="{$title.fontset}">
+<xsl:apply-templates select="." mode="refsection.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template name="refsect1.titlepage.recto">
+ <xsl:choose>
+ <xsl:when test="refsect1info/title">
+ <xsl:apply-templates mode="refsect1.titlepage.recto.auto.mode" select="refsect1info/title"/>
+ </xsl:when>
+ <xsl:when test="docinfo/title">
+ <xsl:apply-templates mode="refsect1.titlepage.recto.auto.mode" select="docinfo/title"/>
+ </xsl:when>
+ <xsl:when test="info/title">
+ <xsl:apply-templates mode="refsect1.titlepage.recto.auto.mode" select="info/title"/>
+ </xsl:when>
+ <xsl:when test="title">
+ <xsl:apply-templates mode="refsect1.titlepage.recto.auto.mode" select="title"/>
+ </xsl:when>
+ </xsl:choose>
+
+</xsl:template>
+
+<xsl:template name="refsect1.titlepage.verso">
+</xsl:template>
+
+<xsl:template name="refsect1.titlepage.separator">
+</xsl:template>
+
+<xsl:template name="refsect1.titlepage.before.recto">
+</xsl:template>
+
+<xsl:template name="refsect1.titlepage.before.verso">
+</xsl:template>
+
+<xsl:template name="refsect1.titlepage">
+ <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format">
+ <xsl:variable name="recto.content">
+ <xsl:call-template name="refsect1.titlepage.before.recto"/>
+ <xsl:call-template name="refsect1.titlepage.recto"/>
+ </xsl:variable>
+ <xsl:variable name="recto.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($recto.content) != '') or ($recto.elements.count &gt; 0)">
+ <fo:block><xsl:copy-of select="$recto.content"/></fo:block>
+ </xsl:if>
+ <xsl:variable name="verso.content">
+ <xsl:call-template name="refsect1.titlepage.before.verso"/>
+ <xsl:call-template name="refsect1.titlepage.verso"/>
+ </xsl:variable>
+ <xsl:variable name="verso.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($verso.content) != '') or ($verso.elements.count &gt; 0)">
+ <fo:block><xsl:copy-of select="$verso.content"/></fo:block>
+ </xsl:if>
+ <xsl:call-template name="refsect1.titlepage.separator"/>
+ </fo:block>
+</xsl:template>
+
+<xsl:template match="*" mode="refsect1.titlepage.recto.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="*" mode="refsect1.titlepage.verso.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="title" mode="refsect1.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="refsect1.titlepage.recto.style" font-family="{$title.fontset}">
+<xsl:apply-templates select="." mode="refsect1.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template name="refsect2.titlepage.recto">
+ <xsl:choose>
+ <xsl:when test="refsect2info/title">
+ <xsl:apply-templates mode="refsect2.titlepage.recto.auto.mode" select="refsect2info/title"/>
+ </xsl:when>
+ <xsl:when test="docinfo/title">
+ <xsl:apply-templates mode="refsect2.titlepage.recto.auto.mode" select="docinfo/title"/>
+ </xsl:when>
+ <xsl:when test="info/title">
+ <xsl:apply-templates mode="refsect2.titlepage.recto.auto.mode" select="info/title"/>
+ </xsl:when>
+ <xsl:when test="title">
+ <xsl:apply-templates mode="refsect2.titlepage.recto.auto.mode" select="title"/>
+ </xsl:when>
+ </xsl:choose>
+
+</xsl:template>
+
+<xsl:template name="refsect2.titlepage.verso">
+</xsl:template>
+
+<xsl:template name="refsect2.titlepage.separator">
+</xsl:template>
+
+<xsl:template name="refsect2.titlepage.before.recto">
+</xsl:template>
+
+<xsl:template name="refsect2.titlepage.before.verso">
+</xsl:template>
+
+<xsl:template name="refsect2.titlepage">
+ <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format">
+ <xsl:variable name="recto.content">
+ <xsl:call-template name="refsect2.titlepage.before.recto"/>
+ <xsl:call-template name="refsect2.titlepage.recto"/>
+ </xsl:variable>
+ <xsl:variable name="recto.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($recto.content) != '') or ($recto.elements.count &gt; 0)">
+ <fo:block><xsl:copy-of select="$recto.content"/></fo:block>
+ </xsl:if>
+ <xsl:variable name="verso.content">
+ <xsl:call-template name="refsect2.titlepage.before.verso"/>
+ <xsl:call-template name="refsect2.titlepage.verso"/>
+ </xsl:variable>
+ <xsl:variable name="verso.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($verso.content) != '') or ($verso.elements.count &gt; 0)">
+ <fo:block><xsl:copy-of select="$verso.content"/></fo:block>
+ </xsl:if>
+ <xsl:call-template name="refsect2.titlepage.separator"/>
+ </fo:block>
+</xsl:template>
+
+<xsl:template match="*" mode="refsect2.titlepage.recto.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="*" mode="refsect2.titlepage.verso.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="title" mode="refsect2.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="refsect2.titlepage.recto.style" font-family="{$title.fontset}">
+<xsl:apply-templates select="." mode="refsect2.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template name="refsect3.titlepage.recto">
+ <xsl:choose>
+ <xsl:when test="refsect3info/title">
+ <xsl:apply-templates mode="refsect3.titlepage.recto.auto.mode" select="refsect3info/title"/>
+ </xsl:when>
+ <xsl:when test="docinfo/title">
+ <xsl:apply-templates mode="refsect3.titlepage.recto.auto.mode" select="docinfo/title"/>
+ </xsl:when>
+ <xsl:when test="info/title">
+ <xsl:apply-templates mode="refsect3.titlepage.recto.auto.mode" select="info/title"/>
+ </xsl:when>
+ <xsl:when test="title">
+ <xsl:apply-templates mode="refsect3.titlepage.recto.auto.mode" select="title"/>
+ </xsl:when>
+ </xsl:choose>
+
+</xsl:template>
+
+<xsl:template name="refsect3.titlepage.verso">
+</xsl:template>
+
+<xsl:template name="refsect3.titlepage.separator">
+</xsl:template>
+
+<xsl:template name="refsect3.titlepage.before.recto">
+</xsl:template>
+
+<xsl:template name="refsect3.titlepage.before.verso">
+</xsl:template>
+
+<xsl:template name="refsect3.titlepage">
+ <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format">
+ <xsl:variable name="recto.content">
+ <xsl:call-template name="refsect3.titlepage.before.recto"/>
+ <xsl:call-template name="refsect3.titlepage.recto"/>
+ </xsl:variable>
+ <xsl:variable name="recto.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($recto.content) != '') or ($recto.elements.count &gt; 0)">
+ <fo:block><xsl:copy-of select="$recto.content"/></fo:block>
+ </xsl:if>
+ <xsl:variable name="verso.content">
+ <xsl:call-template name="refsect3.titlepage.before.verso"/>
+ <xsl:call-template name="refsect3.titlepage.verso"/>
+ </xsl:variable>
+ <xsl:variable name="verso.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($verso.content) != '') or ($verso.elements.count &gt; 0)">
+ <fo:block><xsl:copy-of select="$verso.content"/></fo:block>
+ </xsl:if>
+ <xsl:call-template name="refsect3.titlepage.separator"/>
+ </fo:block>
+</xsl:template>
+
+<xsl:template match="*" mode="refsect3.titlepage.recto.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="*" mode="refsect3.titlepage.verso.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="title" mode="refsect3.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="refsect3.titlepage.recto.style" font-family="{$title.fontset}">
+<xsl:apply-templates select="." mode="refsect3.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template name="dedication.titlepage.recto">
+ <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="dedication.titlepage.recto.style" margin-left="{$title.margin.left}" font-size="24.8832pt" font-family="{$title.fontset}" font-weight="bold">
+<xsl:call-template name="component.title">
+<xsl:with-param name="node" select="ancestor-or-self::dedication[1]"/>
+</xsl:call-template></fo:block>
+ <xsl:choose>
+ <xsl:when test="dedicationinfo/subtitle">
+ <xsl:apply-templates mode="dedication.titlepage.recto.auto.mode" select="dedicationinfo/subtitle"/>
+ </xsl:when>
+ <xsl:when test="docinfo/subtitle">
+ <xsl:apply-templates mode="dedication.titlepage.recto.auto.mode" select="docinfo/subtitle"/>
+ </xsl:when>
+ <xsl:when test="info/subtitle">
+ <xsl:apply-templates mode="dedication.titlepage.recto.auto.mode" select="info/subtitle"/>
+ </xsl:when>
+ <xsl:when test="subtitle">
+ <xsl:apply-templates mode="dedication.titlepage.recto.auto.mode" select="subtitle"/>
+ </xsl:when>
+ </xsl:choose>
+
+</xsl:template>
+
+<xsl:template name="dedication.titlepage.verso">
+</xsl:template>
+
+<xsl:template name="dedication.titlepage.separator">
+</xsl:template>
+
+<xsl:template name="dedication.titlepage.before.recto">
+</xsl:template>
+
+<xsl:template name="dedication.titlepage.before.verso">
+</xsl:template>
+
+<xsl:template name="dedication.titlepage">
+ <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format">
+ <xsl:variable name="recto.content">
+ <xsl:call-template name="dedication.titlepage.before.recto"/>
+ <xsl:call-template name="dedication.titlepage.recto"/>
+ </xsl:variable>
+ <xsl:variable name="recto.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($recto.content) != '') or ($recto.elements.count &gt; 0)">
+ <fo:block><xsl:copy-of select="$recto.content"/></fo:block>
+ </xsl:if>
+ <xsl:variable name="verso.content">
+ <xsl:call-template name="dedication.titlepage.before.verso"/>
+ <xsl:call-template name="dedication.titlepage.verso"/>
+ </xsl:variable>
+ <xsl:variable name="verso.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($verso.content) != '') or ($verso.elements.count &gt; 0)">
+ <fo:block><xsl:copy-of select="$verso.content"/></fo:block>
+ </xsl:if>
+ <xsl:call-template name="dedication.titlepage.separator"/>
+ </fo:block>
+</xsl:template>
+
+<xsl:template match="*" mode="dedication.titlepage.recto.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="*" mode="dedication.titlepage.verso.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="subtitle" mode="dedication.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="dedication.titlepage.recto.style" font-family="{$title.fontset}">
+<xsl:apply-templates select="." mode="dedication.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template name="acknowledgements.titlepage.recto">
+ <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="acknowledgements.titlepage.recto.style" margin-left="{$title.margin.left}" font-size="24.8832pt" font-family="{$title.fontset}" font-weight="bold">
+<xsl:call-template name="component.title">
+<xsl:with-param name="node" select="ancestor-or-self::acknowledgements[1]"/>
+</xsl:call-template></fo:block>
+ <xsl:choose>
+ <xsl:when test="acknowledgementsinfo/subtitle">
+ <xsl:apply-templates mode="acknowledgements.titlepage.recto.auto.mode" select="acknowledgementsinfo/subtitle"/>
+ </xsl:when>
+ <xsl:when test="docinfo/subtitle">
+ <xsl:apply-templates mode="acknowledgements.titlepage.recto.auto.mode" select="docinfo/subtitle"/>
+ </xsl:when>
+ <xsl:when test="info/subtitle">
+ <xsl:apply-templates mode="acknowledgements.titlepage.recto.auto.mode" select="info/subtitle"/>
+ </xsl:when>
+ <xsl:when test="subtitle">
+ <xsl:apply-templates mode="acknowledgements.titlepage.recto.auto.mode" select="subtitle"/>
+ </xsl:when>
+ </xsl:choose>
+
+</xsl:template>
+
+<xsl:template name="acknowledgements.titlepage.verso">
+</xsl:template>
+
+<xsl:template name="acknowledgements.titlepage.separator">
+</xsl:template>
+
+<xsl:template name="acknowledgements.titlepage.before.recto">
+</xsl:template>
+
+<xsl:template name="acknowledgements.titlepage.before.verso">
+</xsl:template>
+
+<xsl:template name="acknowledgements.titlepage">
+ <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format">
+ <xsl:variable name="recto.content">
+ <xsl:call-template name="acknowledgements.titlepage.before.recto"/>
+ <xsl:call-template name="acknowledgements.titlepage.recto"/>
+ </xsl:variable>
+ <xsl:variable name="recto.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($recto.content) != '') or ($recto.elements.count &gt; 0)">
+ <fo:block><xsl:copy-of select="$recto.content"/></fo:block>
+ </xsl:if>
+ <xsl:variable name="verso.content">
+ <xsl:call-template name="acknowledgements.titlepage.before.verso"/>
+ <xsl:call-template name="acknowledgements.titlepage.verso"/>
+ </xsl:variable>
+ <xsl:variable name="verso.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($verso.content) != '') or ($verso.elements.count &gt; 0)">
+ <fo:block><xsl:copy-of select="$verso.content"/></fo:block>
+ </xsl:if>
+ <xsl:call-template name="acknowledgements.titlepage.separator"/>
+ </fo:block>
+</xsl:template>
+
+<xsl:template match="*" mode="acknowledgements.titlepage.recto.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="*" mode="acknowledgements.titlepage.verso.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="subtitle" mode="acknowledgements.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="acknowledgements.titlepage.recto.style" font-family="{$title.fontset}">
+<xsl:apply-templates select="." mode="acknowledgements.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template name="preface.titlepage.recto">
+ <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="preface.titlepage.recto.style" margin-left="{$title.margin.left}" font-size="24.8832pt" font-family="{$title.fontset}" font-weight="bold">
+<xsl:call-template name="component.title">
+<xsl:with-param name="node" select="ancestor-or-self::preface[1]"/>
+</xsl:call-template></fo:block>
+ <xsl:choose>
+ <xsl:when test="prefaceinfo/subtitle">
+ <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="prefaceinfo/subtitle"/>
+ </xsl:when>
+ <xsl:when test="docinfo/subtitle">
+ <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="docinfo/subtitle"/>
+ </xsl:when>
+ <xsl:when test="info/subtitle">
+ <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="info/subtitle"/>
+ </xsl:when>
+ <xsl:when test="subtitle">
+ <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="subtitle"/>
+ </xsl:when>
+ </xsl:choose>
+
+ <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="prefaceinfo/corpauthor"/>
+ <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="docinfo/corpauthor"/>
+ <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="info/corpauthor"/>
+ <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="prefaceinfo/authorgroup"/>
+ <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="docinfo/authorgroup"/>
+ <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="info/authorgroup"/>
+ <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="prefaceinfo/author"/>
+ <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="docinfo/author"/>
+ <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="info/author"/>
+ <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="prefaceinfo/othercredit"/>
+ <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="docinfo/othercredit"/>
+ <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="info/othercredit"/>
+ <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="prefaceinfo/releaseinfo"/>
+ <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="docinfo/releaseinfo"/>
+ <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="info/releaseinfo"/>
+ <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="prefaceinfo/copyright"/>
+ <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="docinfo/copyright"/>
+ <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="info/copyright"/>
+ <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="prefaceinfo/legalnotice"/>
+ <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="docinfo/legalnotice"/>
+ <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="info/legalnotice"/>
+ <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="prefaceinfo/pubdate"/>
+ <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="docinfo/pubdate"/>
+ <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="info/pubdate"/>
+ <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="prefaceinfo/revision"/>
+ <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="docinfo/revision"/>
+ <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="info/revision"/>
+ <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="prefaceinfo/revhistory"/>
+ <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="docinfo/revhistory"/>
+ <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="info/revhistory"/>
+ <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="prefaceinfo/abstract"/>
+ <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="docinfo/abstract"/>
+ <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="info/abstract"/>
+</xsl:template>
+
+<xsl:template name="preface.titlepage.verso">
+</xsl:template>
+
+<xsl:template name="preface.titlepage.separator">
+</xsl:template>
+
+<xsl:template name="preface.titlepage.before.recto">
+</xsl:template>
+
+<xsl:template name="preface.titlepage.before.verso">
+</xsl:template>
+
+<xsl:template name="preface.titlepage">
+ <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format">
+ <xsl:variable name="recto.content">
+ <xsl:call-template name="preface.titlepage.before.recto"/>
+ <xsl:call-template name="preface.titlepage.recto"/>
+ </xsl:variable>
+ <xsl:variable name="recto.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($recto.content) != '') or ($recto.elements.count &gt; 0)">
+ <fo:block><xsl:copy-of select="$recto.content"/></fo:block>
+ </xsl:if>
+ <xsl:variable name="verso.content">
+ <xsl:call-template name="preface.titlepage.before.verso"/>
+ <xsl:call-template name="preface.titlepage.verso"/>
+ </xsl:variable>
+ <xsl:variable name="verso.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($verso.content) != '') or ($verso.elements.count &gt; 0)">
+ <fo:block><xsl:copy-of select="$verso.content"/></fo:block>
+ </xsl:if>
+ <xsl:call-template name="preface.titlepage.separator"/>
+ </fo:block>
+</xsl:template>
+
+<xsl:template match="*" mode="preface.titlepage.recto.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="*" mode="preface.titlepage.verso.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="subtitle" mode="preface.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="preface.titlepage.recto.style" font-family="{$title.fontset}">
+<xsl:apply-templates select="." mode="preface.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="corpauthor" mode="preface.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="preface.titlepage.recto.style">
+<xsl:apply-templates select="." mode="preface.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="authorgroup" mode="preface.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="preface.titlepage.recto.style">
+<xsl:apply-templates select="." mode="preface.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="author" mode="preface.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="preface.titlepage.recto.style">
+<xsl:apply-templates select="." mode="preface.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="othercredit" mode="preface.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="preface.titlepage.recto.style">
+<xsl:apply-templates select="." mode="preface.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="releaseinfo" mode="preface.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="preface.titlepage.recto.style">
+<xsl:apply-templates select="." mode="preface.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="copyright" mode="preface.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="preface.titlepage.recto.style">
+<xsl:apply-templates select="." mode="preface.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="legalnotice" mode="preface.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="preface.titlepage.recto.style">
+<xsl:apply-templates select="." mode="preface.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="pubdate" mode="preface.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="preface.titlepage.recto.style">
+<xsl:apply-templates select="." mode="preface.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="revision" mode="preface.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="preface.titlepage.recto.style">
+<xsl:apply-templates select="." mode="preface.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="revhistory" mode="preface.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="preface.titlepage.recto.style">
+<xsl:apply-templates select="." mode="preface.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="abstract" mode="preface.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="preface.titlepage.recto.style">
+<xsl:apply-templates select="." mode="preface.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template name="chapter.titlepage.recto">
+ <xsl:choose>
+ <xsl:when test="chapterinfo/title">
+ <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="chapterinfo/title"/>
+ </xsl:when>
+ <xsl:when test="docinfo/title">
+ <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="docinfo/title"/>
+ </xsl:when>
+ <xsl:when test="info/title">
+ <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="info/title"/>
+ </xsl:when>
+ <xsl:when test="title">
+ <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="title"/>
+ </xsl:when>
+ </xsl:choose>
+
+ <xsl:choose>
+ <xsl:when test="chapterinfo/subtitle">
+ <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="chapterinfo/subtitle"/>
+ </xsl:when>
+ <xsl:when test="docinfo/subtitle">
+ <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="docinfo/subtitle"/>
+ </xsl:when>
+ <xsl:when test="info/subtitle">
+ <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="info/subtitle"/>
+ </xsl:when>
+ <xsl:when test="subtitle">
+ <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="subtitle"/>
+ </xsl:when>
+ </xsl:choose>
+
+ <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="chapterinfo/corpauthor"/>
+ <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="docinfo/corpauthor"/>
+ <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="info/corpauthor"/>
+ <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="chapterinfo/authorgroup"/>
+ <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="docinfo/authorgroup"/>
+ <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="info/authorgroup"/>
+ <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="chapterinfo/author"/>
+ <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="docinfo/author"/>
+ <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="info/author"/>
+ <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="chapterinfo/othercredit"/>
+ <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="docinfo/othercredit"/>
+ <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="info/othercredit"/>
+ <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="chapterinfo/releaseinfo"/>
+ <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="docinfo/releaseinfo"/>
+ <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="info/releaseinfo"/>
+ <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="chapterinfo/copyright"/>
+ <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="docinfo/copyright"/>
+ <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="info/copyright"/>
+ <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="chapterinfo/legalnotice"/>
+ <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="docinfo/legalnotice"/>
+ <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="info/legalnotice"/>
+ <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="chapterinfo/pubdate"/>
+ <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="docinfo/pubdate"/>
+ <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="info/pubdate"/>
+ <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="chapterinfo/revision"/>
+ <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="docinfo/revision"/>
+ <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="info/revision"/>
+ <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="chapterinfo/revhistory"/>
+ <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="docinfo/revhistory"/>
+ <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="info/revhistory"/>
+ <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="chapterinfo/abstract"/>
+ <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="docinfo/abstract"/>
+ <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="info/abstract"/>
+</xsl:template>
+
+<xsl:template name="chapter.titlepage.verso">
+</xsl:template>
+
+<xsl:template name="chapter.titlepage.separator">
+</xsl:template>
+
+<xsl:template name="chapter.titlepage.before.recto">
+</xsl:template>
+
+<xsl:template name="chapter.titlepage.before.verso">
+</xsl:template>
+
+<xsl:template name="chapter.titlepage">
+ <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" font-family="{$title.fontset}">
+ <xsl:variable name="recto.content">
+ <xsl:call-template name="chapter.titlepage.before.recto"/>
+ <xsl:call-template name="chapter.titlepage.recto"/>
+ </xsl:variable>
+ <xsl:variable name="recto.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($recto.content) != '') or ($recto.elements.count &gt; 0)">
+ <fo:block margin-left="{$title.margin.left}"><xsl:copy-of select="$recto.content"/></fo:block>
+ </xsl:if>
+ <xsl:variable name="verso.content">
+ <xsl:call-template name="chapter.titlepage.before.verso"/>
+ <xsl:call-template name="chapter.titlepage.verso"/>
+ </xsl:variable>
+ <xsl:variable name="verso.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($verso.content) != '') or ($verso.elements.count &gt; 0)">
+ <fo:block><xsl:copy-of select="$verso.content"/></fo:block>
+ </xsl:if>
+ <xsl:call-template name="chapter.titlepage.separator"/>
+ </fo:block>
+</xsl:template>
+
+<xsl:template match="*" mode="chapter.titlepage.recto.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="*" mode="chapter.titlepage.verso.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="title" mode="chapter.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="chapter.titlepage.recto.style" font-size="24.8832pt" font-weight="bold">
+<xsl:call-template name="component.title">
+<xsl:with-param name="node" select="ancestor-or-self::chapter[1]"/>
+</xsl:call-template>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="subtitle" mode="chapter.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="chapter.titlepage.recto.style" space-before="0.5em" font-style="italic" font-size="14.4pt" font-weight="bold">
+<xsl:apply-templates select="." mode="chapter.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="corpauthor" mode="chapter.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="chapter.titlepage.recto.style" space-before="0.5em" space-after="0.5em" font-size="14.4pt">
+<xsl:apply-templates select="." mode="chapter.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="authorgroup" mode="chapter.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="chapter.titlepage.recto.style" space-before="0.5em" space-after="0.5em" font-size="14.4pt">
+<xsl:apply-templates select="." mode="chapter.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="author" mode="chapter.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="chapter.titlepage.recto.style" space-before="0.5em" space-after="0.5em" font-size="14.4pt">
+<xsl:apply-templates select="." mode="chapter.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="othercredit" mode="chapter.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="chapter.titlepage.recto.style">
+<xsl:apply-templates select="." mode="chapter.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="releaseinfo" mode="chapter.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="chapter.titlepage.recto.style">
+<xsl:apply-templates select="." mode="chapter.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="copyright" mode="chapter.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="chapter.titlepage.recto.style">
+<xsl:apply-templates select="." mode="chapter.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="legalnotice" mode="chapter.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="chapter.titlepage.recto.style">
+<xsl:apply-templates select="." mode="chapter.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="pubdate" mode="chapter.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="chapter.titlepage.recto.style">
+<xsl:apply-templates select="." mode="chapter.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="revision" mode="chapter.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="chapter.titlepage.recto.style">
+<xsl:apply-templates select="." mode="chapter.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="revhistory" mode="chapter.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="chapter.titlepage.recto.style">
+<xsl:apply-templates select="." mode="chapter.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="abstract" mode="chapter.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="chapter.titlepage.recto.style">
+<xsl:apply-templates select="." mode="chapter.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template name="appendix.titlepage.recto">
+ <xsl:choose>
+ <xsl:when test="appendixinfo/title">
+ <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="appendixinfo/title"/>
+ </xsl:when>
+ <xsl:when test="docinfo/title">
+ <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="docinfo/title"/>
+ </xsl:when>
+ <xsl:when test="info/title">
+ <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="info/title"/>
+ </xsl:when>
+ <xsl:when test="title">
+ <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="title"/>
+ </xsl:when>
+ </xsl:choose>
+
+ <xsl:choose>
+ <xsl:when test="appendixinfo/subtitle">
+ <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="appendixinfo/subtitle"/>
+ </xsl:when>
+ <xsl:when test="docinfo/subtitle">
+ <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="docinfo/subtitle"/>
+ </xsl:when>
+ <xsl:when test="info/subtitle">
+ <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="info/subtitle"/>
+ </xsl:when>
+ <xsl:when test="subtitle">
+ <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="subtitle"/>
+ </xsl:when>
+ </xsl:choose>
+
+ <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="appendixinfo/corpauthor"/>
+ <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="docinfo/corpauthor"/>
+ <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="info/corpauthor"/>
+ <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="appendixinfo/authorgroup"/>
+ <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="docinfo/authorgroup"/>
+ <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="info/authorgroup"/>
+ <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="appendixinfo/author"/>
+ <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="docinfo/author"/>
+ <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="info/author"/>
+ <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="appendixinfo/othercredit"/>
+ <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="docinfo/othercredit"/>
+ <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="info/othercredit"/>
+ <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="appendixinfo/releaseinfo"/>
+ <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="docinfo/releaseinfo"/>
+ <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="info/releaseinfo"/>
+ <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="appendixinfo/copyright"/>
+ <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="docinfo/copyright"/>
+ <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="info/copyright"/>
+ <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="appendixinfo/legalnotice"/>
+ <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="docinfo/legalnotice"/>
+ <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="info/legalnotice"/>
+ <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="appendixinfo/pubdate"/>
+ <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="docinfo/pubdate"/>
+ <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="info/pubdate"/>
+ <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="appendixinfo/revision"/>
+ <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="docinfo/revision"/>
+ <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="info/revision"/>
+ <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="appendixinfo/revhistory"/>
+ <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="docinfo/revhistory"/>
+ <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="info/revhistory"/>
+ <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="appendixinfo/abstract"/>
+ <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="docinfo/abstract"/>
+ <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="info/abstract"/>
+</xsl:template>
+
+<xsl:template name="appendix.titlepage.verso">
+</xsl:template>
+
+<xsl:template name="appendix.titlepage.separator">
+</xsl:template>
+
+<xsl:template name="appendix.titlepage.before.recto">
+</xsl:template>
+
+<xsl:template name="appendix.titlepage.before.verso">
+</xsl:template>
+
+<xsl:template name="appendix.titlepage">
+ <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format">
+ <xsl:variable name="recto.content">
+ <xsl:call-template name="appendix.titlepage.before.recto"/>
+ <xsl:call-template name="appendix.titlepage.recto"/>
+ </xsl:variable>
+ <xsl:variable name="recto.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($recto.content) != '') or ($recto.elements.count &gt; 0)">
+ <fo:block><xsl:copy-of select="$recto.content"/></fo:block>
+ </xsl:if>
+ <xsl:variable name="verso.content">
+ <xsl:call-template name="appendix.titlepage.before.verso"/>
+ <xsl:call-template name="appendix.titlepage.verso"/>
+ </xsl:variable>
+ <xsl:variable name="verso.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($verso.content) != '') or ($verso.elements.count &gt; 0)">
+ <fo:block><xsl:copy-of select="$verso.content"/></fo:block>
+ </xsl:if>
+ <xsl:call-template name="appendix.titlepage.separator"/>
+ </fo:block>
+</xsl:template>
+
+<xsl:template match="*" mode="appendix.titlepage.recto.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="*" mode="appendix.titlepage.verso.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="title" mode="appendix.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="appendix.titlepage.recto.style" margin-left="{$title.margin.left}" font-size="24.8832pt" font-weight="bold" font-family="{$title.fontset}">
+<xsl:call-template name="component.title">
+<xsl:with-param name="node" select="ancestor-or-self::appendix[1]"/>
+</xsl:call-template>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="subtitle" mode="appendix.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="appendix.titlepage.recto.style" font-family="{$title.fontset}">
+<xsl:apply-templates select="." mode="appendix.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="corpauthor" mode="appendix.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="appendix.titlepage.recto.style">
+<xsl:apply-templates select="." mode="appendix.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="authorgroup" mode="appendix.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="appendix.titlepage.recto.style">
+<xsl:apply-templates select="." mode="appendix.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="author" mode="appendix.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="appendix.titlepage.recto.style">
+<xsl:apply-templates select="." mode="appendix.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="othercredit" mode="appendix.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="appendix.titlepage.recto.style">
+<xsl:apply-templates select="." mode="appendix.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="releaseinfo" mode="appendix.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="appendix.titlepage.recto.style">
+<xsl:apply-templates select="." mode="appendix.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="copyright" mode="appendix.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="appendix.titlepage.recto.style">
+<xsl:apply-templates select="." mode="appendix.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="legalnotice" mode="appendix.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="appendix.titlepage.recto.style">
+<xsl:apply-templates select="." mode="appendix.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="pubdate" mode="appendix.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="appendix.titlepage.recto.style">
+<xsl:apply-templates select="." mode="appendix.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="revision" mode="appendix.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="appendix.titlepage.recto.style">
+<xsl:apply-templates select="." mode="appendix.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="revhistory" mode="appendix.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="appendix.titlepage.recto.style">
+<xsl:apply-templates select="." mode="appendix.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="abstract" mode="appendix.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="appendix.titlepage.recto.style">
+<xsl:apply-templates select="." mode="appendix.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template name="section.titlepage.recto">
+ <xsl:choose>
+ <xsl:when test="sectioninfo/title">
+ <xsl:apply-templates mode="section.titlepage.recto.auto.mode" select="sectioninfo/title"/>
+ </xsl:when>
+ <xsl:when test="info/title">
+ <xsl:apply-templates mode="section.titlepage.recto.auto.mode" select="info/title"/>
+ </xsl:when>
+ <xsl:when test="title">
+ <xsl:apply-templates mode="section.titlepage.recto.auto.mode" select="title"/>
+ </xsl:when>
+ </xsl:choose>
+
+ <xsl:choose>
+ <xsl:when test="sectioninfo/subtitle">
+ <xsl:apply-templates mode="section.titlepage.recto.auto.mode" select="sectioninfo/subtitle"/>
+ </xsl:when>
+ <xsl:when test="info/subtitle">
+ <xsl:apply-templates mode="section.titlepage.recto.auto.mode" select="info/subtitle"/>
+ </xsl:when>
+ <xsl:when test="subtitle">
+ <xsl:apply-templates mode="section.titlepage.recto.auto.mode" select="subtitle"/>
+ </xsl:when>
+ </xsl:choose>
+
+ <xsl:apply-templates mode="section.titlepage.recto.auto.mode" select="sectioninfo/corpauthor"/>
+ <xsl:apply-templates mode="section.titlepage.recto.auto.mode" select="info/corpauthor"/>
+ <xsl:apply-templates mode="section.titlepage.recto.auto.mode" select="sectioninfo/authorgroup"/>
+ <xsl:apply-templates mode="section.titlepage.recto.auto.mode" select="info/authorgroup"/>
+ <xsl:apply-templates mode="section.titlepage.recto.auto.mode" select="sectioninfo/author"/>
+ <xsl:apply-templates mode="section.titlepage.recto.auto.mode" select="info/author"/>
+ <xsl:apply-templates mode="section.titlepage.recto.auto.mode" select="sectioninfo/othercredit"/>
+ <xsl:apply-templates mode="section.titlepage.recto.auto.mode" select="info/othercredit"/>
+ <xsl:apply-templates mode="section.titlepage.recto.auto.mode" select="sectioninfo/releaseinfo"/>
+ <xsl:apply-templates mode="section.titlepage.recto.auto.mode" select="info/releaseinfo"/>
+ <xsl:apply-templates mode="section.titlepage.recto.auto.mode" select="sectioninfo/copyright"/>
+ <xsl:apply-templates mode="section.titlepage.recto.auto.mode" select="info/copyright"/>
+ <xsl:apply-templates mode="section.titlepage.recto.auto.mode" select="sectioninfo/legalnotice"/>
+ <xsl:apply-templates mode="section.titlepage.recto.auto.mode" select="info/legalnotice"/>
+ <xsl:apply-templates mode="section.titlepage.recto.auto.mode" select="sectioninfo/pubdate"/>
+ <xsl:apply-templates mode="section.titlepage.recto.auto.mode" select="info/pubdate"/>
+ <xsl:apply-templates mode="section.titlepage.recto.auto.mode" select="sectioninfo/revision"/>
+ <xsl:apply-templates mode="section.titlepage.recto.auto.mode" select="info/revision"/>
+ <xsl:apply-templates mode="section.titlepage.recto.auto.mode" select="sectioninfo/revhistory"/>
+ <xsl:apply-templates mode="section.titlepage.recto.auto.mode" select="info/revhistory"/>
+ <xsl:apply-templates mode="section.titlepage.recto.auto.mode" select="sectioninfo/abstract"/>
+ <xsl:apply-templates mode="section.titlepage.recto.auto.mode" select="info/abstract"/>
+</xsl:template>
+
+<xsl:template name="section.titlepage.verso">
+</xsl:template>
+
+<xsl:template name="section.titlepage.separator">
+</xsl:template>
+
+<xsl:template name="section.titlepage.before.recto">
+</xsl:template>
+
+<xsl:template name="section.titlepage.before.verso">
+</xsl:template>
+
+<xsl:template name="section.titlepage">
+ <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format">
+ <xsl:variable name="recto.content">
+ <xsl:call-template name="section.titlepage.before.recto"/>
+ <xsl:call-template name="section.titlepage.recto"/>
+ </xsl:variable>
+ <xsl:variable name="recto.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($recto.content) != '') or ($recto.elements.count &gt; 0)">
+ <fo:block><xsl:copy-of select="$recto.content"/></fo:block>
+ </xsl:if>
+ <xsl:variable name="verso.content">
+ <xsl:call-template name="section.titlepage.before.verso"/>
+ <xsl:call-template name="section.titlepage.verso"/>
+ </xsl:variable>
+ <xsl:variable name="verso.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($verso.content) != '') or ($verso.elements.count &gt; 0)">
+ <fo:block><xsl:copy-of select="$verso.content"/></fo:block>
+ </xsl:if>
+ <xsl:call-template name="section.titlepage.separator"/>
+ </fo:block>
+</xsl:template>
+
+<xsl:template match="*" mode="section.titlepage.recto.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="*" mode="section.titlepage.verso.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="title" mode="section.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="section.titlepage.recto.style" margin-left="{$title.margin.left}" font-family="{$title.fontset}">
+<xsl:apply-templates select="." mode="section.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="subtitle" mode="section.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="section.titlepage.recto.style" font-family="{$title.fontset}">
+<xsl:apply-templates select="." mode="section.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="corpauthor" mode="section.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="section.titlepage.recto.style">
+<xsl:apply-templates select="." mode="section.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="authorgroup" mode="section.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="section.titlepage.recto.style">
+<xsl:apply-templates select="." mode="section.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="author" mode="section.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="section.titlepage.recto.style">
+<xsl:apply-templates select="." mode="section.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="othercredit" mode="section.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="section.titlepage.recto.style">
+<xsl:apply-templates select="." mode="section.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="releaseinfo" mode="section.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="section.titlepage.recto.style">
+<xsl:apply-templates select="." mode="section.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="copyright" mode="section.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="section.titlepage.recto.style">
+<xsl:apply-templates select="." mode="section.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="legalnotice" mode="section.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="section.titlepage.recto.style">
+<xsl:apply-templates select="." mode="section.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="pubdate" mode="section.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="section.titlepage.recto.style">
+<xsl:apply-templates select="." mode="section.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="revision" mode="section.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="section.titlepage.recto.style">
+<xsl:apply-templates select="." mode="section.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="revhistory" mode="section.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="section.titlepage.recto.style">
+<xsl:apply-templates select="." mode="section.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="abstract" mode="section.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="section.titlepage.recto.style">
+<xsl:apply-templates select="." mode="section.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template name="sect1.titlepage.recto">
+ <xsl:choose>
+ <xsl:when test="sect1info/title">
+ <xsl:apply-templates mode="sect1.titlepage.recto.auto.mode" select="sect1info/title"/>
+ </xsl:when>
+ <xsl:when test="info/title">
+ <xsl:apply-templates mode="sect1.titlepage.recto.auto.mode" select="info/title"/>
+ </xsl:when>
+ <xsl:when test="title">
+ <xsl:apply-templates mode="sect1.titlepage.recto.auto.mode" select="title"/>
+ </xsl:when>
+ </xsl:choose>
+
+ <xsl:choose>
+ <xsl:when test="sect1info/subtitle">
+ <xsl:apply-templates mode="sect1.titlepage.recto.auto.mode" select="sect1info/subtitle"/>
+ </xsl:when>
+ <xsl:when test="info/subtitle">
+ <xsl:apply-templates mode="sect1.titlepage.recto.auto.mode" select="info/subtitle"/>
+ </xsl:when>
+ <xsl:when test="subtitle">
+ <xsl:apply-templates mode="sect1.titlepage.recto.auto.mode" select="subtitle"/>
+ </xsl:when>
+ </xsl:choose>
+
+ <xsl:apply-templates mode="sect1.titlepage.recto.auto.mode" select="sect1info/corpauthor"/>
+ <xsl:apply-templates mode="sect1.titlepage.recto.auto.mode" select="info/corpauthor"/>
+ <xsl:apply-templates mode="sect1.titlepage.recto.auto.mode" select="sect1info/authorgroup"/>
+ <xsl:apply-templates mode="sect1.titlepage.recto.auto.mode" select="info/authorgroup"/>
+ <xsl:apply-templates mode="sect1.titlepage.recto.auto.mode" select="sect1info/author"/>
+ <xsl:apply-templates mode="sect1.titlepage.recto.auto.mode" select="info/author"/>
+ <xsl:apply-templates mode="sect1.titlepage.recto.auto.mode" select="sect1info/othercredit"/>
+ <xsl:apply-templates mode="sect1.titlepage.recto.auto.mode" select="info/othercredit"/>
+ <xsl:apply-templates mode="sect1.titlepage.recto.auto.mode" select="sect1info/releaseinfo"/>
+ <xsl:apply-templates mode="sect1.titlepage.recto.auto.mode" select="info/releaseinfo"/>
+ <xsl:apply-templates mode="sect1.titlepage.recto.auto.mode" select="sect1info/copyright"/>
+ <xsl:apply-templates mode="sect1.titlepage.recto.auto.mode" select="info/copyright"/>
+ <xsl:apply-templates mode="sect1.titlepage.recto.auto.mode" select="sect1info/legalnotice"/>
+ <xsl:apply-templates mode="sect1.titlepage.recto.auto.mode" select="info/legalnotice"/>
+ <xsl:apply-templates mode="sect1.titlepage.recto.auto.mode" select="sect1info/pubdate"/>
+ <xsl:apply-templates mode="sect1.titlepage.recto.auto.mode" select="info/pubdate"/>
+ <xsl:apply-templates mode="sect1.titlepage.recto.auto.mode" select="sect1info/revision"/>
+ <xsl:apply-templates mode="sect1.titlepage.recto.auto.mode" select="info/revision"/>
+ <xsl:apply-templates mode="sect1.titlepage.recto.auto.mode" select="sect1info/revhistory"/>
+ <xsl:apply-templates mode="sect1.titlepage.recto.auto.mode" select="info/revhistory"/>
+ <xsl:apply-templates mode="sect1.titlepage.recto.auto.mode" select="sect1info/abstract"/>
+ <xsl:apply-templates mode="sect1.titlepage.recto.auto.mode" select="info/abstract"/>
+</xsl:template>
+
+<xsl:template name="sect1.titlepage.verso">
+</xsl:template>
+
+<xsl:template name="sect1.titlepage.separator">
+</xsl:template>
+
+<xsl:template name="sect1.titlepage.before.recto">
+</xsl:template>
+
+<xsl:template name="sect1.titlepage.before.verso">
+</xsl:template>
+
+<xsl:template name="sect1.titlepage">
+ <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format">
+ <xsl:variable name="recto.content">
+ <xsl:call-template name="sect1.titlepage.before.recto"/>
+ <xsl:call-template name="sect1.titlepage.recto"/>
+ </xsl:variable>
+ <xsl:variable name="recto.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($recto.content) != '') or ($recto.elements.count &gt; 0)">
+ <fo:block><xsl:copy-of select="$recto.content"/></fo:block>
+ </xsl:if>
+ <xsl:variable name="verso.content">
+ <xsl:call-template name="sect1.titlepage.before.verso"/>
+ <xsl:call-template name="sect1.titlepage.verso"/>
+ </xsl:variable>
+ <xsl:variable name="verso.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($verso.content) != '') or ($verso.elements.count &gt; 0)">
+ <fo:block><xsl:copy-of select="$verso.content"/></fo:block>
+ </xsl:if>
+ <xsl:call-template name="sect1.titlepage.separator"/>
+ </fo:block>
+</xsl:template>
+
+<xsl:template match="*" mode="sect1.titlepage.recto.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="*" mode="sect1.titlepage.verso.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="title" mode="sect1.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="sect1.titlepage.recto.style" margin-left="{$title.margin.left}" font-family="{$title.fontset}">
+<xsl:apply-templates select="." mode="sect1.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="subtitle" mode="sect1.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="sect1.titlepage.recto.style" font-family="{$title.fontset}">
+<xsl:apply-templates select="." mode="sect1.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="corpauthor" mode="sect1.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="sect1.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect1.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="authorgroup" mode="sect1.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="sect1.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect1.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="author" mode="sect1.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="sect1.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect1.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="othercredit" mode="sect1.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="sect1.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect1.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="releaseinfo" mode="sect1.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="sect1.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect1.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="copyright" mode="sect1.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="sect1.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect1.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="legalnotice" mode="sect1.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="sect1.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect1.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="pubdate" mode="sect1.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="sect1.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect1.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="revision" mode="sect1.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="sect1.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect1.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="revhistory" mode="sect1.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="sect1.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect1.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="abstract" mode="sect1.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="sect1.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect1.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template name="sect2.titlepage.recto">
+ <xsl:choose>
+ <xsl:when test="sect2info/title">
+ <xsl:apply-templates mode="sect2.titlepage.recto.auto.mode" select="sect2info/title"/>
+ </xsl:when>
+ <xsl:when test="info/title">
+ <xsl:apply-templates mode="sect2.titlepage.recto.auto.mode" select="info/title"/>
+ </xsl:when>
+ <xsl:when test="title">
+ <xsl:apply-templates mode="sect2.titlepage.recto.auto.mode" select="title"/>
+ </xsl:when>
+ </xsl:choose>
+
+ <xsl:choose>
+ <xsl:when test="sect2info/subtitle">
+ <xsl:apply-templates mode="sect2.titlepage.recto.auto.mode" select="sect2info/subtitle"/>
+ </xsl:when>
+ <xsl:when test="info/subtitle">
+ <xsl:apply-templates mode="sect2.titlepage.recto.auto.mode" select="info/subtitle"/>
+ </xsl:when>
+ <xsl:when test="subtitle">
+ <xsl:apply-templates mode="sect2.titlepage.recto.auto.mode" select="subtitle"/>
+ </xsl:when>
+ </xsl:choose>
+
+ <xsl:apply-templates mode="sect2.titlepage.recto.auto.mode" select="sect2info/corpauthor"/>
+ <xsl:apply-templates mode="sect2.titlepage.recto.auto.mode" select="info/corpauthor"/>
+ <xsl:apply-templates mode="sect2.titlepage.recto.auto.mode" select="sect2info/authorgroup"/>
+ <xsl:apply-templates mode="sect2.titlepage.recto.auto.mode" select="info/authorgroup"/>
+ <xsl:apply-templates mode="sect2.titlepage.recto.auto.mode" select="sect2info/author"/>
+ <xsl:apply-templates mode="sect2.titlepage.recto.auto.mode" select="info/author"/>
+ <xsl:apply-templates mode="sect2.titlepage.recto.auto.mode" select="sect2info/othercredit"/>
+ <xsl:apply-templates mode="sect2.titlepage.recto.auto.mode" select="info/othercredit"/>
+ <xsl:apply-templates mode="sect2.titlepage.recto.auto.mode" select="sect2info/releaseinfo"/>
+ <xsl:apply-templates mode="sect2.titlepage.recto.auto.mode" select="info/releaseinfo"/>
+ <xsl:apply-templates mode="sect2.titlepage.recto.auto.mode" select="sect2info/copyright"/>
+ <xsl:apply-templates mode="sect2.titlepage.recto.auto.mode" select="info/copyright"/>
+ <xsl:apply-templates mode="sect2.titlepage.recto.auto.mode" select="sect2info/legalnotice"/>
+ <xsl:apply-templates mode="sect2.titlepage.recto.auto.mode" select="info/legalnotice"/>
+ <xsl:apply-templates mode="sect2.titlepage.recto.auto.mode" select="sect2info/pubdate"/>
+ <xsl:apply-templates mode="sect2.titlepage.recto.auto.mode" select="info/pubdate"/>
+ <xsl:apply-templates mode="sect2.titlepage.recto.auto.mode" select="sect2info/revision"/>
+ <xsl:apply-templates mode="sect2.titlepage.recto.auto.mode" select="info/revision"/>
+ <xsl:apply-templates mode="sect2.titlepage.recto.auto.mode" select="sect2info/revhistory"/>
+ <xsl:apply-templates mode="sect2.titlepage.recto.auto.mode" select="info/revhistory"/>
+ <xsl:apply-templates mode="sect2.titlepage.recto.auto.mode" select="sect2info/abstract"/>
+ <xsl:apply-templates mode="sect2.titlepage.recto.auto.mode" select="info/abstract"/>
+</xsl:template>
+
+<xsl:template name="sect2.titlepage.verso">
+</xsl:template>
+
+<xsl:template name="sect2.titlepage.separator">
+</xsl:template>
+
+<xsl:template name="sect2.titlepage.before.recto">
+</xsl:template>
+
+<xsl:template name="sect2.titlepage.before.verso">
+</xsl:template>
+
+<xsl:template name="sect2.titlepage">
+ <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format">
+ <xsl:variable name="recto.content">
+ <xsl:call-template name="sect2.titlepage.before.recto"/>
+ <xsl:call-template name="sect2.titlepage.recto"/>
+ </xsl:variable>
+ <xsl:variable name="recto.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($recto.content) != '') or ($recto.elements.count &gt; 0)">
+ <fo:block><xsl:copy-of select="$recto.content"/></fo:block>
+ </xsl:if>
+ <xsl:variable name="verso.content">
+ <xsl:call-template name="sect2.titlepage.before.verso"/>
+ <xsl:call-template name="sect2.titlepage.verso"/>
+ </xsl:variable>
+ <xsl:variable name="verso.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($verso.content) != '') or ($verso.elements.count &gt; 0)">
+ <fo:block><xsl:copy-of select="$verso.content"/></fo:block>
+ </xsl:if>
+ <xsl:call-template name="sect2.titlepage.separator"/>
+ </fo:block>
+</xsl:template>
+
+<xsl:template match="*" mode="sect2.titlepage.recto.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="*" mode="sect2.titlepage.verso.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="title" mode="sect2.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="sect2.titlepage.recto.style" margin-left="{$title.margin.left}" font-family="{$title.fontset}">
+<xsl:apply-templates select="." mode="sect2.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="subtitle" mode="sect2.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="sect2.titlepage.recto.style" font-family="{$title.fontset}">
+<xsl:apply-templates select="." mode="sect2.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="corpauthor" mode="sect2.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="sect2.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect2.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="authorgroup" mode="sect2.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="sect2.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect2.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="author" mode="sect2.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="sect2.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect2.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="othercredit" mode="sect2.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="sect2.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect2.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="releaseinfo" mode="sect2.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="sect2.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect2.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="copyright" mode="sect2.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="sect2.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect2.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="legalnotice" mode="sect2.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="sect2.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect2.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="pubdate" mode="sect2.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="sect2.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect2.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="revision" mode="sect2.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="sect2.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect2.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="revhistory" mode="sect2.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="sect2.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect2.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="abstract" mode="sect2.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="sect2.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect2.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template name="sect3.titlepage.recto">
+ <xsl:choose>
+ <xsl:when test="sect3info/title">
+ <xsl:apply-templates mode="sect3.titlepage.recto.auto.mode" select="sect3info/title"/>
+ </xsl:when>
+ <xsl:when test="info/title">
+ <xsl:apply-templates mode="sect3.titlepage.recto.auto.mode" select="info/title"/>
+ </xsl:when>
+ <xsl:when test="title">
+ <xsl:apply-templates mode="sect3.titlepage.recto.auto.mode" select="title"/>
+ </xsl:when>
+ </xsl:choose>
+
+ <xsl:choose>
+ <xsl:when test="sect3info/subtitle">
+ <xsl:apply-templates mode="sect3.titlepage.recto.auto.mode" select="sect3info/subtitle"/>
+ </xsl:when>
+ <xsl:when test="info/subtitle">
+ <xsl:apply-templates mode="sect3.titlepage.recto.auto.mode" select="info/subtitle"/>
+ </xsl:when>
+ <xsl:when test="subtitle">
+ <xsl:apply-templates mode="sect3.titlepage.recto.auto.mode" select="subtitle"/>
+ </xsl:when>
+ </xsl:choose>
+
+ <xsl:apply-templates mode="sect3.titlepage.recto.auto.mode" select="sect3info/corpauthor"/>
+ <xsl:apply-templates mode="sect3.titlepage.recto.auto.mode" select="info/corpauthor"/>
+ <xsl:apply-templates mode="sect3.titlepage.recto.auto.mode" select="sect3info/authorgroup"/>
+ <xsl:apply-templates mode="sect3.titlepage.recto.auto.mode" select="info/authorgroup"/>
+ <xsl:apply-templates mode="sect3.titlepage.recto.auto.mode" select="sect3info/author"/>
+ <xsl:apply-templates mode="sect3.titlepage.recto.auto.mode" select="info/author"/>
+ <xsl:apply-templates mode="sect3.titlepage.recto.auto.mode" select="sect3info/othercredit"/>
+ <xsl:apply-templates mode="sect3.titlepage.recto.auto.mode" select="info/othercredit"/>
+ <xsl:apply-templates mode="sect3.titlepage.recto.auto.mode" select="sect3info/releaseinfo"/>
+ <xsl:apply-templates mode="sect3.titlepage.recto.auto.mode" select="info/releaseinfo"/>
+ <xsl:apply-templates mode="sect3.titlepage.recto.auto.mode" select="sect3info/copyright"/>
+ <xsl:apply-templates mode="sect3.titlepage.recto.auto.mode" select="info/copyright"/>
+ <xsl:apply-templates mode="sect3.titlepage.recto.auto.mode" select="sect3info/legalnotice"/>
+ <xsl:apply-templates mode="sect3.titlepage.recto.auto.mode" select="info/legalnotice"/>
+ <xsl:apply-templates mode="sect3.titlepage.recto.auto.mode" select="sect3info/pubdate"/>
+ <xsl:apply-templates mode="sect3.titlepage.recto.auto.mode" select="info/pubdate"/>
+ <xsl:apply-templates mode="sect3.titlepage.recto.auto.mode" select="sect3info/revision"/>
+ <xsl:apply-templates mode="sect3.titlepage.recto.auto.mode" select="info/revision"/>
+ <xsl:apply-templates mode="sect3.titlepage.recto.auto.mode" select="sect3info/revhistory"/>
+ <xsl:apply-templates mode="sect3.titlepage.recto.auto.mode" select="info/revhistory"/>
+ <xsl:apply-templates mode="sect3.titlepage.recto.auto.mode" select="sect3info/abstract"/>
+ <xsl:apply-templates mode="sect3.titlepage.recto.auto.mode" select="info/abstract"/>
+</xsl:template>
+
+<xsl:template name="sect3.titlepage.verso">
+</xsl:template>
+
+<xsl:template name="sect3.titlepage.separator">
+</xsl:template>
+
+<xsl:template name="sect3.titlepage.before.recto">
+</xsl:template>
+
+<xsl:template name="sect3.titlepage.before.verso">
+</xsl:template>
+
+<xsl:template name="sect3.titlepage">
+ <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format">
+ <xsl:variable name="recto.content">
+ <xsl:call-template name="sect3.titlepage.before.recto"/>
+ <xsl:call-template name="sect3.titlepage.recto"/>
+ </xsl:variable>
+ <xsl:variable name="recto.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($recto.content) != '') or ($recto.elements.count &gt; 0)">
+ <fo:block><xsl:copy-of select="$recto.content"/></fo:block>
+ </xsl:if>
+ <xsl:variable name="verso.content">
+ <xsl:call-template name="sect3.titlepage.before.verso"/>
+ <xsl:call-template name="sect3.titlepage.verso"/>
+ </xsl:variable>
+ <xsl:variable name="verso.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($verso.content) != '') or ($verso.elements.count &gt; 0)">
+ <fo:block><xsl:copy-of select="$verso.content"/></fo:block>
+ </xsl:if>
+ <xsl:call-template name="sect3.titlepage.separator"/>
+ </fo:block>
+</xsl:template>
+
+<xsl:template match="*" mode="sect3.titlepage.recto.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="*" mode="sect3.titlepage.verso.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="title" mode="sect3.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="sect3.titlepage.recto.style" margin-left="{$title.margin.left}" font-family="{$title.fontset}">
+<xsl:apply-templates select="." mode="sect3.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="subtitle" mode="sect3.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="sect3.titlepage.recto.style" font-family="{$title.fontset}">
+<xsl:apply-templates select="." mode="sect3.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="corpauthor" mode="sect3.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="sect3.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect3.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="authorgroup" mode="sect3.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="sect3.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect3.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="author" mode="sect3.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="sect3.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect3.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="othercredit" mode="sect3.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="sect3.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect3.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="releaseinfo" mode="sect3.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="sect3.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect3.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="copyright" mode="sect3.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="sect3.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect3.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="legalnotice" mode="sect3.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="sect3.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect3.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="pubdate" mode="sect3.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="sect3.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect3.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="revision" mode="sect3.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="sect3.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect3.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="revhistory" mode="sect3.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="sect3.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect3.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="abstract" mode="sect3.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="sect3.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect3.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template name="sect4.titlepage.recto">
+ <xsl:choose>
+ <xsl:when test="sect4info/title">
+ <xsl:apply-templates mode="sect4.titlepage.recto.auto.mode" select="sect4info/title"/>
+ </xsl:when>
+ <xsl:when test="info/title">
+ <xsl:apply-templates mode="sect4.titlepage.recto.auto.mode" select="info/title"/>
+ </xsl:when>
+ <xsl:when test="title">
+ <xsl:apply-templates mode="sect4.titlepage.recto.auto.mode" select="title"/>
+ </xsl:when>
+ </xsl:choose>
+
+ <xsl:choose>
+ <xsl:when test="sect4info/subtitle">
+ <xsl:apply-templates mode="sect4.titlepage.recto.auto.mode" select="sect4info/subtitle"/>
+ </xsl:when>
+ <xsl:when test="info/subtitle">
+ <xsl:apply-templates mode="sect4.titlepage.recto.auto.mode" select="info/subtitle"/>
+ </xsl:when>
+ <xsl:when test="subtitle">
+ <xsl:apply-templates mode="sect4.titlepage.recto.auto.mode" select="subtitle"/>
+ </xsl:when>
+ </xsl:choose>
+
+ <xsl:apply-templates mode="sect4.titlepage.recto.auto.mode" select="sect4info/corpauthor"/>
+ <xsl:apply-templates mode="sect4.titlepage.recto.auto.mode" select="info/corpauthor"/>
+ <xsl:apply-templates mode="sect4.titlepage.recto.auto.mode" select="sect4info/authorgroup"/>
+ <xsl:apply-templates mode="sect4.titlepage.recto.auto.mode" select="info/authorgroup"/>
+ <xsl:apply-templates mode="sect4.titlepage.recto.auto.mode" select="sect4info/author"/>
+ <xsl:apply-templates mode="sect4.titlepage.recto.auto.mode" select="info/author"/>
+ <xsl:apply-templates mode="sect4.titlepage.recto.auto.mode" select="sect4info/othercredit"/>
+ <xsl:apply-templates mode="sect4.titlepage.recto.auto.mode" select="info/othercredit"/>
+ <xsl:apply-templates mode="sect4.titlepage.recto.auto.mode" select="sect4info/releaseinfo"/>
+ <xsl:apply-templates mode="sect4.titlepage.recto.auto.mode" select="info/releaseinfo"/>
+ <xsl:apply-templates mode="sect4.titlepage.recto.auto.mode" select="sect4info/copyright"/>
+ <xsl:apply-templates mode="sect4.titlepage.recto.auto.mode" select="info/copyright"/>
+ <xsl:apply-templates mode="sect4.titlepage.recto.auto.mode" select="sect4info/legalnotice"/>
+ <xsl:apply-templates mode="sect4.titlepage.recto.auto.mode" select="info/legalnotice"/>
+ <xsl:apply-templates mode="sect4.titlepage.recto.auto.mode" select="sect4info/pubdate"/>
+ <xsl:apply-templates mode="sect4.titlepage.recto.auto.mode" select="info/pubdate"/>
+ <xsl:apply-templates mode="sect4.titlepage.recto.auto.mode" select="sect4info/revision"/>
+ <xsl:apply-templates mode="sect4.titlepage.recto.auto.mode" select="info/revision"/>
+ <xsl:apply-templates mode="sect4.titlepage.recto.auto.mode" select="sect4info/revhistory"/>
+ <xsl:apply-templates mode="sect4.titlepage.recto.auto.mode" select="info/revhistory"/>
+ <xsl:apply-templates mode="sect4.titlepage.recto.auto.mode" select="sect4info/abstract"/>
+ <xsl:apply-templates mode="sect4.titlepage.recto.auto.mode" select="info/abstract"/>
+</xsl:template>
+
+<xsl:template name="sect4.titlepage.verso">
+</xsl:template>
+
+<xsl:template name="sect4.titlepage.separator">
+</xsl:template>
+
+<xsl:template name="sect4.titlepage.before.recto">
+</xsl:template>
+
+<xsl:template name="sect4.titlepage.before.verso">
+</xsl:template>
+
+<xsl:template name="sect4.titlepage">
+ <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format">
+ <xsl:variable name="recto.content">
+ <xsl:call-template name="sect4.titlepage.before.recto"/>
+ <xsl:call-template name="sect4.titlepage.recto"/>
+ </xsl:variable>
+ <xsl:variable name="recto.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($recto.content) != '') or ($recto.elements.count &gt; 0)">
+ <fo:block><xsl:copy-of select="$recto.content"/></fo:block>
+ </xsl:if>
+ <xsl:variable name="verso.content">
+ <xsl:call-template name="sect4.titlepage.before.verso"/>
+ <xsl:call-template name="sect4.titlepage.verso"/>
+ </xsl:variable>
+ <xsl:variable name="verso.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($verso.content) != '') or ($verso.elements.count &gt; 0)">
+ <fo:block><xsl:copy-of select="$verso.content"/></fo:block>
+ </xsl:if>
+ <xsl:call-template name="sect4.titlepage.separator"/>
+ </fo:block>
+</xsl:template>
+
+<xsl:template match="*" mode="sect4.titlepage.recto.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="*" mode="sect4.titlepage.verso.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="title" mode="sect4.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="sect4.titlepage.recto.style" margin-left="{$title.margin.left}" font-family="{$title.fontset}">
+<xsl:apply-templates select="." mode="sect4.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="subtitle" mode="sect4.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="sect4.titlepage.recto.style" font-family="{$title.fontset}">
+<xsl:apply-templates select="." mode="sect4.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="corpauthor" mode="sect4.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="sect4.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect4.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="authorgroup" mode="sect4.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="sect4.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect4.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="author" mode="sect4.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="sect4.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect4.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="othercredit" mode="sect4.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="sect4.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect4.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="releaseinfo" mode="sect4.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="sect4.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect4.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="copyright" mode="sect4.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="sect4.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect4.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="legalnotice" mode="sect4.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="sect4.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect4.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="pubdate" mode="sect4.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="sect4.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect4.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="revision" mode="sect4.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="sect4.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect4.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="revhistory" mode="sect4.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="sect4.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect4.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="abstract" mode="sect4.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="sect4.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect4.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template name="sect5.titlepage.recto">
+ <xsl:choose>
+ <xsl:when test="sect5info/title">
+ <xsl:apply-templates mode="sect5.titlepage.recto.auto.mode" select="sect5info/title"/>
+ </xsl:when>
+ <xsl:when test="info/title">
+ <xsl:apply-templates mode="sect5.titlepage.recto.auto.mode" select="info/title"/>
+ </xsl:when>
+ <xsl:when test="title">
+ <xsl:apply-templates mode="sect5.titlepage.recto.auto.mode" select="title"/>
+ </xsl:when>
+ </xsl:choose>
+
+ <xsl:choose>
+ <xsl:when test="sect5info/subtitle">
+ <xsl:apply-templates mode="sect5.titlepage.recto.auto.mode" select="sect5info/subtitle"/>
+ </xsl:when>
+ <xsl:when test="info/subtitle">
+ <xsl:apply-templates mode="sect5.titlepage.recto.auto.mode" select="info/subtitle"/>
+ </xsl:when>
+ <xsl:when test="subtitle">
+ <xsl:apply-templates mode="sect5.titlepage.recto.auto.mode" select="subtitle"/>
+ </xsl:when>
+ </xsl:choose>
+
+ <xsl:apply-templates mode="sect5.titlepage.recto.auto.mode" select="sect5info/corpauthor"/>
+ <xsl:apply-templates mode="sect5.titlepage.recto.auto.mode" select="info/corpauthor"/>
+ <xsl:apply-templates mode="sect5.titlepage.recto.auto.mode" select="sect5info/authorgroup"/>
+ <xsl:apply-templates mode="sect5.titlepage.recto.auto.mode" select="info/authorgroup"/>
+ <xsl:apply-templates mode="sect5.titlepage.recto.auto.mode" select="sect5info/author"/>
+ <xsl:apply-templates mode="sect5.titlepage.recto.auto.mode" select="info/author"/>
+ <xsl:apply-templates mode="sect5.titlepage.recto.auto.mode" select="sect5info/othercredit"/>
+ <xsl:apply-templates mode="sect5.titlepage.recto.auto.mode" select="info/othercredit"/>
+ <xsl:apply-templates mode="sect5.titlepage.recto.auto.mode" select="sect5info/releaseinfo"/>
+ <xsl:apply-templates mode="sect5.titlepage.recto.auto.mode" select="info/releaseinfo"/>
+ <xsl:apply-templates mode="sect5.titlepage.recto.auto.mode" select="sect5info/copyright"/>
+ <xsl:apply-templates mode="sect5.titlepage.recto.auto.mode" select="info/copyright"/>
+ <xsl:apply-templates mode="sect5.titlepage.recto.auto.mode" select="sect5info/legalnotice"/>
+ <xsl:apply-templates mode="sect5.titlepage.recto.auto.mode" select="info/legalnotice"/>
+ <xsl:apply-templates mode="sect5.titlepage.recto.auto.mode" select="sect5info/pubdate"/>
+ <xsl:apply-templates mode="sect5.titlepage.recto.auto.mode" select="info/pubdate"/>
+ <xsl:apply-templates mode="sect5.titlepage.recto.auto.mode" select="sect5info/revision"/>
+ <xsl:apply-templates mode="sect5.titlepage.recto.auto.mode" select="info/revision"/>
+ <xsl:apply-templates mode="sect5.titlepage.recto.auto.mode" select="sect5info/revhistory"/>
+ <xsl:apply-templates mode="sect5.titlepage.recto.auto.mode" select="info/revhistory"/>
+ <xsl:apply-templates mode="sect5.titlepage.recto.auto.mode" select="sect5info/abstract"/>
+ <xsl:apply-templates mode="sect5.titlepage.recto.auto.mode" select="info/abstract"/>
+</xsl:template>
+
+<xsl:template name="sect5.titlepage.verso">
+</xsl:template>
+
+<xsl:template name="sect5.titlepage.separator">
+</xsl:template>
+
+<xsl:template name="sect5.titlepage.before.recto">
+</xsl:template>
+
+<xsl:template name="sect5.titlepage.before.verso">
+</xsl:template>
+
+<xsl:template name="sect5.titlepage">
+ <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format">
+ <xsl:variable name="recto.content">
+ <xsl:call-template name="sect5.titlepage.before.recto"/>
+ <xsl:call-template name="sect5.titlepage.recto"/>
+ </xsl:variable>
+ <xsl:variable name="recto.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($recto.content) != '') or ($recto.elements.count &gt; 0)">
+ <fo:block><xsl:copy-of select="$recto.content"/></fo:block>
+ </xsl:if>
+ <xsl:variable name="verso.content">
+ <xsl:call-template name="sect5.titlepage.before.verso"/>
+ <xsl:call-template name="sect5.titlepage.verso"/>
+ </xsl:variable>
+ <xsl:variable name="verso.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($verso.content) != '') or ($verso.elements.count &gt; 0)">
+ <fo:block><xsl:copy-of select="$verso.content"/></fo:block>
+ </xsl:if>
+ <xsl:call-template name="sect5.titlepage.separator"/>
+ </fo:block>
+</xsl:template>
+
+<xsl:template match="*" mode="sect5.titlepage.recto.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="*" mode="sect5.titlepage.verso.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="title" mode="sect5.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="sect5.titlepage.recto.style" margin-left="{$title.margin.left}" font-family="{$title.fontset}">
+<xsl:apply-templates select="." mode="sect5.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="subtitle" mode="sect5.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="sect5.titlepage.recto.style" font-family="{$title.fontset}">
+<xsl:apply-templates select="." mode="sect5.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="corpauthor" mode="sect5.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="sect5.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect5.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="authorgroup" mode="sect5.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="sect5.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect5.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="author" mode="sect5.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="sect5.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect5.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="othercredit" mode="sect5.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="sect5.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect5.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="releaseinfo" mode="sect5.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="sect5.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect5.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="copyright" mode="sect5.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="sect5.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect5.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="legalnotice" mode="sect5.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="sect5.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect5.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="pubdate" mode="sect5.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="sect5.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect5.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="revision" mode="sect5.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="sect5.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect5.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="revhistory" mode="sect5.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="sect5.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect5.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="abstract" mode="sect5.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="sect5.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect5.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template name="simplesect.titlepage.recto">
+ <xsl:choose>
+ <xsl:when test="simplesectinfo/title">
+ <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="simplesectinfo/title"/>
+ </xsl:when>
+ <xsl:when test="docinfo/title">
+ <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="docinfo/title"/>
+ </xsl:when>
+ <xsl:when test="info/title">
+ <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="info/title"/>
+ </xsl:when>
+ <xsl:when test="title">
+ <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="title"/>
+ </xsl:when>
+ </xsl:choose>
+
+ <xsl:choose>
+ <xsl:when test="simplesectinfo/subtitle">
+ <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="simplesectinfo/subtitle"/>
+ </xsl:when>
+ <xsl:when test="docinfo/subtitle">
+ <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="docinfo/subtitle"/>
+ </xsl:when>
+ <xsl:when test="info/subtitle">
+ <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="info/subtitle"/>
+ </xsl:when>
+ <xsl:when test="subtitle">
+ <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="subtitle"/>
+ </xsl:when>
+ </xsl:choose>
+
+ <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="simplesectinfo/corpauthor"/>
+ <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="docinfo/corpauthor"/>
+ <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="info/corpauthor"/>
+ <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="simplesectinfo/authorgroup"/>
+ <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="docinfo/authorgroup"/>
+ <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="info/authorgroup"/>
+ <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="simplesectinfo/author"/>
+ <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="docinfo/author"/>
+ <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="info/author"/>
+ <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="simplesectinfo/othercredit"/>
+ <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="docinfo/othercredit"/>
+ <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="info/othercredit"/>
+ <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="simplesectinfo/releaseinfo"/>
+ <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="docinfo/releaseinfo"/>
+ <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="info/releaseinfo"/>
+ <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="simplesectinfo/copyright"/>
+ <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="docinfo/copyright"/>
+ <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="info/copyright"/>
+ <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="simplesectinfo/legalnotice"/>
+ <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="docinfo/legalnotice"/>
+ <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="info/legalnotice"/>
+ <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="simplesectinfo/pubdate"/>
+ <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="docinfo/pubdate"/>
+ <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="info/pubdate"/>
+ <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="simplesectinfo/revision"/>
+ <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="docinfo/revision"/>
+ <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="info/revision"/>
+ <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="simplesectinfo/revhistory"/>
+ <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="docinfo/revhistory"/>
+ <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="info/revhistory"/>
+ <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="simplesectinfo/abstract"/>
+ <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="docinfo/abstract"/>
+ <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="info/abstract"/>
+</xsl:template>
+
+<xsl:template name="simplesect.titlepage.verso">
+</xsl:template>
+
+<xsl:template name="simplesect.titlepage.separator">
+</xsl:template>
+
+<xsl:template name="simplesect.titlepage.before.recto">
+</xsl:template>
+
+<xsl:template name="simplesect.titlepage.before.verso">
+</xsl:template>
+
+<xsl:template name="simplesect.titlepage">
+ <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format">
+ <xsl:variable name="recto.content">
+ <xsl:call-template name="simplesect.titlepage.before.recto"/>
+ <xsl:call-template name="simplesect.titlepage.recto"/>
+ </xsl:variable>
+ <xsl:variable name="recto.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($recto.content) != '') or ($recto.elements.count &gt; 0)">
+ <fo:block><xsl:copy-of select="$recto.content"/></fo:block>
+ </xsl:if>
+ <xsl:variable name="verso.content">
+ <xsl:call-template name="simplesect.titlepage.before.verso"/>
+ <xsl:call-template name="simplesect.titlepage.verso"/>
+ </xsl:variable>
+ <xsl:variable name="verso.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($verso.content) != '') or ($verso.elements.count &gt; 0)">
+ <fo:block><xsl:copy-of select="$verso.content"/></fo:block>
+ </xsl:if>
+ <xsl:call-template name="simplesect.titlepage.separator"/>
+ </fo:block>
+</xsl:template>
+
+<xsl:template match="*" mode="simplesect.titlepage.recto.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="*" mode="simplesect.titlepage.verso.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="title" mode="simplesect.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="simplesect.titlepage.recto.style" margin-left="{$title.margin.left}" font-family="{$title.fontset}">
+<xsl:apply-templates select="." mode="simplesect.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="subtitle" mode="simplesect.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="simplesect.titlepage.recto.style" font-family="{$title.fontset}">
+<xsl:apply-templates select="." mode="simplesect.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="corpauthor" mode="simplesect.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="simplesect.titlepage.recto.style">
+<xsl:apply-templates select="." mode="simplesect.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="authorgroup" mode="simplesect.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="simplesect.titlepage.recto.style">
+<xsl:apply-templates select="." mode="simplesect.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="author" mode="simplesect.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="simplesect.titlepage.recto.style">
+<xsl:apply-templates select="." mode="simplesect.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="othercredit" mode="simplesect.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="simplesect.titlepage.recto.style">
+<xsl:apply-templates select="." mode="simplesect.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="releaseinfo" mode="simplesect.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="simplesect.titlepage.recto.style">
+<xsl:apply-templates select="." mode="simplesect.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="copyright" mode="simplesect.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="simplesect.titlepage.recto.style">
+<xsl:apply-templates select="." mode="simplesect.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="legalnotice" mode="simplesect.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="simplesect.titlepage.recto.style">
+<xsl:apply-templates select="." mode="simplesect.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="pubdate" mode="simplesect.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="simplesect.titlepage.recto.style">
+<xsl:apply-templates select="." mode="simplesect.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="revision" mode="simplesect.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="simplesect.titlepage.recto.style">
+<xsl:apply-templates select="." mode="simplesect.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="revhistory" mode="simplesect.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="simplesect.titlepage.recto.style">
+<xsl:apply-templates select="." mode="simplesect.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="abstract" mode="simplesect.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="simplesect.titlepage.recto.style">
+<xsl:apply-templates select="." mode="simplesect.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template name="bibliography.titlepage.recto">
+ <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="bibliography.titlepage.recto.style" margin-left="{$title.margin.left}" font-size="24.8832pt" font-family="{$title.fontset}" font-weight="bold">
+<xsl:call-template name="component.title">
+<xsl:with-param name="node" select="ancestor-or-self::bibliography[1]"/>
+</xsl:call-template></fo:block>
+ <xsl:choose>
+ <xsl:when test="bibliographyinfo/subtitle">
+ <xsl:apply-templates mode="bibliography.titlepage.recto.auto.mode" select="bibliographyinfo/subtitle"/>
+ </xsl:when>
+ <xsl:when test="docinfo/subtitle">
+ <xsl:apply-templates mode="bibliography.titlepage.recto.auto.mode" select="docinfo/subtitle"/>
+ </xsl:when>
+ <xsl:when test="info/subtitle">
+ <xsl:apply-templates mode="bibliography.titlepage.recto.auto.mode" select="info/subtitle"/>
+ </xsl:when>
+ <xsl:when test="subtitle">
+ <xsl:apply-templates mode="bibliography.titlepage.recto.auto.mode" select="subtitle"/>
+ </xsl:when>
+ </xsl:choose>
+
+</xsl:template>
+
+<xsl:template name="bibliography.titlepage.verso">
+</xsl:template>
+
+<xsl:template name="bibliography.titlepage.separator">
+</xsl:template>
+
+<xsl:template name="bibliography.titlepage.before.recto">
+</xsl:template>
+
+<xsl:template name="bibliography.titlepage.before.verso">
+</xsl:template>
+
+<xsl:template name="bibliography.titlepage">
+ <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format">
+ <xsl:variable name="recto.content">
+ <xsl:call-template name="bibliography.titlepage.before.recto"/>
+ <xsl:call-template name="bibliography.titlepage.recto"/>
+ </xsl:variable>
+ <xsl:variable name="recto.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($recto.content) != '') or ($recto.elements.count &gt; 0)">
+ <fo:block><xsl:copy-of select="$recto.content"/></fo:block>
+ </xsl:if>
+ <xsl:variable name="verso.content">
+ <xsl:call-template name="bibliography.titlepage.before.verso"/>
+ <xsl:call-template name="bibliography.titlepage.verso"/>
+ </xsl:variable>
+ <xsl:variable name="verso.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($verso.content) != '') or ($verso.elements.count &gt; 0)">
+ <fo:block><xsl:copy-of select="$verso.content"/></fo:block>
+ </xsl:if>
+ <xsl:call-template name="bibliography.titlepage.separator"/>
+ </fo:block>
+</xsl:template>
+
+<xsl:template match="*" mode="bibliography.titlepage.recto.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="*" mode="bibliography.titlepage.verso.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="subtitle" mode="bibliography.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="bibliography.titlepage.recto.style" font-family="{$title.fontset}">
+<xsl:apply-templates select="." mode="bibliography.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template name="bibliodiv.titlepage.recto">
+ <xsl:choose>
+ <xsl:when test="bibliodivinfo/title">
+ <xsl:apply-templates mode="bibliodiv.titlepage.recto.auto.mode" select="bibliodivinfo/title"/>
+ </xsl:when>
+ <xsl:when test="docinfo/title">
+ <xsl:apply-templates mode="bibliodiv.titlepage.recto.auto.mode" select="docinfo/title"/>
+ </xsl:when>
+ <xsl:when test="info/title">
+ <xsl:apply-templates mode="bibliodiv.titlepage.recto.auto.mode" select="info/title"/>
+ </xsl:when>
+ <xsl:when test="title">
+ <xsl:apply-templates mode="bibliodiv.titlepage.recto.auto.mode" select="title"/>
+ </xsl:when>
+ </xsl:choose>
+
+ <xsl:choose>
+ <xsl:when test="bibliodivinfo/subtitle">
+ <xsl:apply-templates mode="bibliodiv.titlepage.recto.auto.mode" select="bibliodivinfo/subtitle"/>
+ </xsl:when>
+ <xsl:when test="docinfo/subtitle">
+ <xsl:apply-templates mode="bibliodiv.titlepage.recto.auto.mode" select="docinfo/subtitle"/>
+ </xsl:when>
+ <xsl:when test="info/subtitle">
+ <xsl:apply-templates mode="bibliodiv.titlepage.recto.auto.mode" select="info/subtitle"/>
+ </xsl:when>
+ <xsl:when test="subtitle">
+ <xsl:apply-templates mode="bibliodiv.titlepage.recto.auto.mode" select="subtitle"/>
+ </xsl:when>
+ </xsl:choose>
+
+</xsl:template>
+
+<xsl:template name="bibliodiv.titlepage.verso">
+</xsl:template>
+
+<xsl:template name="bibliodiv.titlepage.separator">
+</xsl:template>
+
+<xsl:template name="bibliodiv.titlepage.before.recto">
+</xsl:template>
+
+<xsl:template name="bibliodiv.titlepage.before.verso">
+</xsl:template>
+
+<xsl:template name="bibliodiv.titlepage">
+ <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format">
+ <xsl:variable name="recto.content">
+ <xsl:call-template name="bibliodiv.titlepage.before.recto"/>
+ <xsl:call-template name="bibliodiv.titlepage.recto"/>
+ </xsl:variable>
+ <xsl:variable name="recto.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($recto.content) != '') or ($recto.elements.count &gt; 0)">
+ <fo:block><xsl:copy-of select="$recto.content"/></fo:block>
+ </xsl:if>
+ <xsl:variable name="verso.content">
+ <xsl:call-template name="bibliodiv.titlepage.before.verso"/>
+ <xsl:call-template name="bibliodiv.titlepage.verso"/>
+ </xsl:variable>
+ <xsl:variable name="verso.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($verso.content) != '') or ($verso.elements.count &gt; 0)">
+ <fo:block><xsl:copy-of select="$verso.content"/></fo:block>
+ </xsl:if>
+ <xsl:call-template name="bibliodiv.titlepage.separator"/>
+ </fo:block>
+</xsl:template>
+
+<xsl:template match="*" mode="bibliodiv.titlepage.recto.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="*" mode="bibliodiv.titlepage.verso.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="title" mode="bibliodiv.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="bibliodiv.titlepage.recto.style" margin-left="{$title.margin.left}" font-size="20.736pt" font-family="{$title.fontset}" font-weight="bold">
+<xsl:call-template name="component.title">
+<xsl:with-param name="node" select="ancestor-or-self::bibliodiv[1]"/>
+</xsl:call-template>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="subtitle" mode="bibliodiv.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="bibliodiv.titlepage.recto.style" font-family="{$title.fontset}">
+<xsl:apply-templates select="." mode="bibliodiv.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template name="glossary.titlepage.recto">
+ <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="glossary.titlepage.recto.style" margin-left="{$title.margin.left}" font-size="24.8832pt" font-family="{$title.fontset}" font-weight="bold">
+<xsl:call-template name="component.title">
+<xsl:with-param name="node" select="ancestor-or-self::glossary[1]"/>
+</xsl:call-template></fo:block>
+ <xsl:choose>
+ <xsl:when test="glossaryinfo/subtitle">
+ <xsl:apply-templates mode="glossary.titlepage.recto.auto.mode" select="glossaryinfo/subtitle"/>
+ </xsl:when>
+ <xsl:when test="docinfo/subtitle">
+ <xsl:apply-templates mode="glossary.titlepage.recto.auto.mode" select="docinfo/subtitle"/>
+ </xsl:when>
+ <xsl:when test="info/subtitle">
+ <xsl:apply-templates mode="glossary.titlepage.recto.auto.mode" select="info/subtitle"/>
+ </xsl:when>
+ <xsl:when test="subtitle">
+ <xsl:apply-templates mode="glossary.titlepage.recto.auto.mode" select="subtitle"/>
+ </xsl:when>
+ </xsl:choose>
+
+</xsl:template>
+
+<xsl:template name="glossary.titlepage.verso">
+</xsl:template>
+
+<xsl:template name="glossary.titlepage.separator">
+</xsl:template>
+
+<xsl:template name="glossary.titlepage.before.recto">
+</xsl:template>
+
+<xsl:template name="glossary.titlepage.before.verso">
+</xsl:template>
+
+<xsl:template name="glossary.titlepage">
+ <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format">
+ <xsl:variable name="recto.content">
+ <xsl:call-template name="glossary.titlepage.before.recto"/>
+ <xsl:call-template name="glossary.titlepage.recto"/>
+ </xsl:variable>
+ <xsl:variable name="recto.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($recto.content) != '') or ($recto.elements.count &gt; 0)">
+ <fo:block><xsl:copy-of select="$recto.content"/></fo:block>
+ </xsl:if>
+ <xsl:variable name="verso.content">
+ <xsl:call-template name="glossary.titlepage.before.verso"/>
+ <xsl:call-template name="glossary.titlepage.verso"/>
+ </xsl:variable>
+ <xsl:variable name="verso.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($verso.content) != '') or ($verso.elements.count &gt; 0)">
+ <fo:block><xsl:copy-of select="$verso.content"/></fo:block>
+ </xsl:if>
+ <xsl:call-template name="glossary.titlepage.separator"/>
+ </fo:block>
+</xsl:template>
+
+<xsl:template match="*" mode="glossary.titlepage.recto.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="*" mode="glossary.titlepage.verso.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="subtitle" mode="glossary.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="glossary.titlepage.recto.style" font-family="{$title.fontset}">
+<xsl:apply-templates select="." mode="glossary.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template name="glossdiv.titlepage.recto">
+ <xsl:choose>
+ <xsl:when test="glossdivinfo/title">
+ <xsl:apply-templates mode="glossdiv.titlepage.recto.auto.mode" select="glossdivinfo/title"/>
+ </xsl:when>
+ <xsl:when test="docinfo/title">
+ <xsl:apply-templates mode="glossdiv.titlepage.recto.auto.mode" select="docinfo/title"/>
+ </xsl:when>
+ <xsl:when test="info/title">
+ <xsl:apply-templates mode="glossdiv.titlepage.recto.auto.mode" select="info/title"/>
+ </xsl:when>
+ <xsl:when test="title">
+ <xsl:apply-templates mode="glossdiv.titlepage.recto.auto.mode" select="title"/>
+ </xsl:when>
+ </xsl:choose>
+
+ <xsl:choose>
+ <xsl:when test="glossdivinfo/subtitle">
+ <xsl:apply-templates mode="glossdiv.titlepage.recto.auto.mode" select="glossdivinfo/subtitle"/>
+ </xsl:when>
+ <xsl:when test="docinfo/subtitle">
+ <xsl:apply-templates mode="glossdiv.titlepage.recto.auto.mode" select="docinfo/subtitle"/>
+ </xsl:when>
+ <xsl:when test="info/subtitle">
+ <xsl:apply-templates mode="glossdiv.titlepage.recto.auto.mode" select="info/subtitle"/>
+ </xsl:when>
+ <xsl:when test="subtitle">
+ <xsl:apply-templates mode="glossdiv.titlepage.recto.auto.mode" select="subtitle"/>
+ </xsl:when>
+ </xsl:choose>
+
+</xsl:template>
+
+<xsl:template name="glossdiv.titlepage.verso">
+</xsl:template>
+
+<xsl:template name="glossdiv.titlepage.separator">
+</xsl:template>
+
+<xsl:template name="glossdiv.titlepage.before.recto">
+</xsl:template>
+
+<xsl:template name="glossdiv.titlepage.before.verso">
+</xsl:template>
+
+<xsl:template name="glossdiv.titlepage">
+ <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format">
+ <xsl:variable name="recto.content">
+ <xsl:call-template name="glossdiv.titlepage.before.recto"/>
+ <xsl:call-template name="glossdiv.titlepage.recto"/>
+ </xsl:variable>
+ <xsl:variable name="recto.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($recto.content) != '') or ($recto.elements.count &gt; 0)">
+ <fo:block><xsl:copy-of select="$recto.content"/></fo:block>
+ </xsl:if>
+ <xsl:variable name="verso.content">
+ <xsl:call-template name="glossdiv.titlepage.before.verso"/>
+ <xsl:call-template name="glossdiv.titlepage.verso"/>
+ </xsl:variable>
+ <xsl:variable name="verso.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($verso.content) != '') or ($verso.elements.count &gt; 0)">
+ <fo:block><xsl:copy-of select="$verso.content"/></fo:block>
+ </xsl:if>
+ <xsl:call-template name="glossdiv.titlepage.separator"/>
+ </fo:block>
+</xsl:template>
+
+<xsl:template match="*" mode="glossdiv.titlepage.recto.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="*" mode="glossdiv.titlepage.verso.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="title" mode="glossdiv.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="glossdiv.titlepage.recto.style" margin-left="{$title.margin.left}" font-size="20.736pt" font-family="{$title.fontset}" font-weight="bold">
+<xsl:call-template name="component.title">
+<xsl:with-param name="node" select="ancestor-or-self::glossdiv[1]"/>
+</xsl:call-template>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="subtitle" mode="glossdiv.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="glossdiv.titlepage.recto.style" font-family="{$title.fontset}">
+<xsl:apply-templates select="." mode="glossdiv.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template name="index.titlepage.recto">
+ <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="index.titlepage.recto.style" margin-left="0pt" font-size="24.8832pt" font-family="{$title.fontset}" font-weight="bold">
+<xsl:call-template name="component.title">
+<xsl:with-param name="node" select="ancestor-or-self::index[1]"/>
+<xsl:with-param name="pagewide" select="1"/>
+</xsl:call-template></fo:block>
+ <xsl:choose>
+ <xsl:when test="indexinfo/subtitle">
+ <xsl:apply-templates mode="index.titlepage.recto.auto.mode" select="indexinfo/subtitle"/>
+ </xsl:when>
+ <xsl:when test="docinfo/subtitle">
+ <xsl:apply-templates mode="index.titlepage.recto.auto.mode" select="docinfo/subtitle"/>
+ </xsl:when>
+ <xsl:when test="info/subtitle">
+ <xsl:apply-templates mode="index.titlepage.recto.auto.mode" select="info/subtitle"/>
+ </xsl:when>
+ <xsl:when test="subtitle">
+ <xsl:apply-templates mode="index.titlepage.recto.auto.mode" select="subtitle"/>
+ </xsl:when>
+ </xsl:choose>
+
+</xsl:template>
+
+<xsl:template name="index.titlepage.verso">
+</xsl:template>
+
+<xsl:template name="index.titlepage.separator">
+</xsl:template>
+
+<xsl:template name="index.titlepage.before.recto">
+</xsl:template>
+
+<xsl:template name="index.titlepage.before.verso">
+</xsl:template>
+
+<xsl:template name="index.titlepage">
+ <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format">
+ <xsl:variable name="recto.content">
+ <xsl:call-template name="index.titlepage.before.recto"/>
+ <xsl:call-template name="index.titlepage.recto"/>
+ </xsl:variable>
+ <xsl:variable name="recto.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($recto.content) != '') or ($recto.elements.count &gt; 0)">
+ <fo:block><xsl:copy-of select="$recto.content"/></fo:block>
+ </xsl:if>
+ <xsl:variable name="verso.content">
+ <xsl:call-template name="index.titlepage.before.verso"/>
+ <xsl:call-template name="index.titlepage.verso"/>
+ </xsl:variable>
+ <xsl:variable name="verso.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($verso.content) != '') or ($verso.elements.count &gt; 0)">
+ <fo:block><xsl:copy-of select="$verso.content"/></fo:block>
+ </xsl:if>
+ <xsl:call-template name="index.titlepage.separator"/>
+ </fo:block>
+</xsl:template>
+
+<xsl:template match="*" mode="index.titlepage.recto.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="*" mode="index.titlepage.verso.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="subtitle" mode="index.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="index.titlepage.recto.style" font-family="{$title.fontset}">
+<xsl:apply-templates select="." mode="index.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template name="indexdiv.titlepage.recto">
+ <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="indexdiv.titlepage.recto.style">
+<xsl:call-template name="indexdiv.title">
+<xsl:with-param name="title" select="title"/>
+</xsl:call-template></fo:block>
+ <xsl:choose>
+ <xsl:when test="indexdivinfo/subtitle">
+ <xsl:apply-templates mode="indexdiv.titlepage.recto.auto.mode" select="indexdivinfo/subtitle"/>
+ </xsl:when>
+ <xsl:when test="docinfo/subtitle">
+ <xsl:apply-templates mode="indexdiv.titlepage.recto.auto.mode" select="docinfo/subtitle"/>
+ </xsl:when>
+ <xsl:when test="info/subtitle">
+ <xsl:apply-templates mode="indexdiv.titlepage.recto.auto.mode" select="info/subtitle"/>
+ </xsl:when>
+ <xsl:when test="subtitle">
+ <xsl:apply-templates mode="indexdiv.titlepage.recto.auto.mode" select="subtitle"/>
+ </xsl:when>
+ </xsl:choose>
+
+</xsl:template>
+
+<xsl:template name="indexdiv.titlepage.verso">
+</xsl:template>
+
+<xsl:template name="indexdiv.titlepage.separator">
+</xsl:template>
+
+<xsl:template name="indexdiv.titlepage.before.recto">
+</xsl:template>
+
+<xsl:template name="indexdiv.titlepage.before.verso">
+</xsl:template>
+
+<xsl:template name="indexdiv.titlepage">
+ <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format">
+ <xsl:variable name="recto.content">
+ <xsl:call-template name="indexdiv.titlepage.before.recto"/>
+ <xsl:call-template name="indexdiv.titlepage.recto"/>
+ </xsl:variable>
+ <xsl:variable name="recto.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($recto.content) != '') or ($recto.elements.count &gt; 0)">
+ <fo:block><xsl:copy-of select="$recto.content"/></fo:block>
+ </xsl:if>
+ <xsl:variable name="verso.content">
+ <xsl:call-template name="indexdiv.titlepage.before.verso"/>
+ <xsl:call-template name="indexdiv.titlepage.verso"/>
+ </xsl:variable>
+ <xsl:variable name="verso.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($verso.content) != '') or ($verso.elements.count &gt; 0)">
+ <fo:block><xsl:copy-of select="$verso.content"/></fo:block>
+ </xsl:if>
+ <xsl:call-template name="indexdiv.titlepage.separator"/>
+ </fo:block>
+</xsl:template>
+
+<xsl:template match="*" mode="indexdiv.titlepage.recto.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="*" mode="indexdiv.titlepage.verso.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="subtitle" mode="indexdiv.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="indexdiv.titlepage.recto.style" font-family="{$title.fontset}">
+<xsl:apply-templates select="." mode="indexdiv.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template name="setindex.titlepage.recto">
+ <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="setindex.titlepage.recto.style" margin-left="0pt" font-size="24.8832pt" font-family="{$title.fontset}" font-weight="bold">
+<xsl:call-template name="component.title">
+<xsl:with-param name="node" select="ancestor-or-self::setindex[1]"/>
+<xsl:with-param name="pagewide" select="1"/>
+</xsl:call-template></fo:block>
+ <xsl:choose>
+ <xsl:when test="setindexinfo/subtitle">
+ <xsl:apply-templates mode="setindex.titlepage.recto.auto.mode" select="setindexinfo/subtitle"/>
+ </xsl:when>
+ <xsl:when test="docinfo/subtitle">
+ <xsl:apply-templates mode="setindex.titlepage.recto.auto.mode" select="docinfo/subtitle"/>
+ </xsl:when>
+ <xsl:when test="info/subtitle">
+ <xsl:apply-templates mode="setindex.titlepage.recto.auto.mode" select="info/subtitle"/>
+ </xsl:when>
+ <xsl:when test="subtitle">
+ <xsl:apply-templates mode="setindex.titlepage.recto.auto.mode" select="subtitle"/>
+ </xsl:when>
+ </xsl:choose>
+
+</xsl:template>
+
+<xsl:template name="setindex.titlepage.verso">
+</xsl:template>
+
+<xsl:template name="setindex.titlepage.separator">
+</xsl:template>
+
+<xsl:template name="setindex.titlepage.before.recto">
+</xsl:template>
+
+<xsl:template name="setindex.titlepage.before.verso">
+</xsl:template>
+
+<xsl:template name="setindex.titlepage">
+ <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format">
+ <xsl:variable name="recto.content">
+ <xsl:call-template name="setindex.titlepage.before.recto"/>
+ <xsl:call-template name="setindex.titlepage.recto"/>
+ </xsl:variable>
+ <xsl:variable name="recto.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($recto.content) != '') or ($recto.elements.count &gt; 0)">
+ <fo:block><xsl:copy-of select="$recto.content"/></fo:block>
+ </xsl:if>
+ <xsl:variable name="verso.content">
+ <xsl:call-template name="setindex.titlepage.before.verso"/>
+ <xsl:call-template name="setindex.titlepage.verso"/>
+ </xsl:variable>
+ <xsl:variable name="verso.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($verso.content) != '') or ($verso.elements.count &gt; 0)">
+ <fo:block><xsl:copy-of select="$verso.content"/></fo:block>
+ </xsl:if>
+ <xsl:call-template name="setindex.titlepage.separator"/>
+ </fo:block>
+</xsl:template>
+
+<xsl:template match="*" mode="setindex.titlepage.recto.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="*" mode="setindex.titlepage.verso.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="subtitle" mode="setindex.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="setindex.titlepage.recto.style" font-family="{$title.fontset}">
+<xsl:apply-templates select="." mode="setindex.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template name="colophon.titlepage.recto">
+ <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="colophon.titlepage.recto.style" margin-left="{$title.margin.left}" font-size="24.8832pt" font-family="{$title.fontset}" font-weight="bold">
+<xsl:call-template name="component.title">
+<xsl:with-param name="node" select="ancestor-or-self::colophon[1]"/>
+</xsl:call-template></fo:block>
+ <xsl:choose>
+ <xsl:when test="colophoninfo/subtitle">
+ <xsl:apply-templates mode="colophon.titlepage.recto.auto.mode" select="colophoninfo/subtitle"/>
+ </xsl:when>
+ <xsl:when test="docinfo/subtitle">
+ <xsl:apply-templates mode="colophon.titlepage.recto.auto.mode" select="docinfo/subtitle"/>
+ </xsl:when>
+ <xsl:when test="info/subtitle">
+ <xsl:apply-templates mode="colophon.titlepage.recto.auto.mode" select="info/subtitle"/>
+ </xsl:when>
+ <xsl:when test="subtitle">
+ <xsl:apply-templates mode="colophon.titlepage.recto.auto.mode" select="subtitle"/>
+ </xsl:when>
+ </xsl:choose>
+
+</xsl:template>
+
+<xsl:template name="colophon.titlepage.verso">
+</xsl:template>
+
+<xsl:template name="colophon.titlepage.separator">
+</xsl:template>
+
+<xsl:template name="colophon.titlepage.before.recto">
+</xsl:template>
+
+<xsl:template name="colophon.titlepage.before.verso">
+</xsl:template>
+
+<xsl:template name="colophon.titlepage">
+ <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format">
+ <xsl:variable name="recto.content">
+ <xsl:call-template name="colophon.titlepage.before.recto"/>
+ <xsl:call-template name="colophon.titlepage.recto"/>
+ </xsl:variable>
+ <xsl:variable name="recto.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($recto.content) != '') or ($recto.elements.count &gt; 0)">
+ <fo:block><xsl:copy-of select="$recto.content"/></fo:block>
+ </xsl:if>
+ <xsl:variable name="verso.content">
+ <xsl:call-template name="colophon.titlepage.before.verso"/>
+ <xsl:call-template name="colophon.titlepage.verso"/>
+ </xsl:variable>
+ <xsl:variable name="verso.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($verso.content) != '') or ($verso.elements.count &gt; 0)">
+ <fo:block><xsl:copy-of select="$verso.content"/></fo:block>
+ </xsl:if>
+ <xsl:call-template name="colophon.titlepage.separator"/>
+ </fo:block>
+</xsl:template>
+
+<xsl:template match="*" mode="colophon.titlepage.recto.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="*" mode="colophon.titlepage.verso.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="subtitle" mode="colophon.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="colophon.titlepage.recto.style" font-family="{$title.fontset}">
+<xsl:apply-templates select="." mode="colophon.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template name="sidebar.titlepage.recto">
+ <xsl:choose>
+ <xsl:when test="sidebarinfo/title">
+ <xsl:apply-templates mode="sidebar.titlepage.recto.auto.mode" select="sidebarinfo/title"/>
+ </xsl:when>
+ <xsl:when test="docinfo/title">
+ <xsl:apply-templates mode="sidebar.titlepage.recto.auto.mode" select="docinfo/title"/>
+ </xsl:when>
+ <xsl:when test="info/title">
+ <xsl:apply-templates mode="sidebar.titlepage.recto.auto.mode" select="info/title"/>
+ </xsl:when>
+ <xsl:when test="title">
+ <xsl:apply-templates mode="sidebar.titlepage.recto.auto.mode" select="title"/>
+ </xsl:when>
+ </xsl:choose>
+
+ <xsl:choose>
+ <xsl:when test="sidebarinfo/subtitle">
+ <xsl:apply-templates mode="sidebar.titlepage.recto.auto.mode" select="sidebarinfo/subtitle"/>
+ </xsl:when>
+ <xsl:when test="docinfo/subtitle">
+ <xsl:apply-templates mode="sidebar.titlepage.recto.auto.mode" select="docinfo/subtitle"/>
+ </xsl:when>
+ <xsl:when test="info/subtitle">
+ <xsl:apply-templates mode="sidebar.titlepage.recto.auto.mode" select="info/subtitle"/>
+ </xsl:when>
+ <xsl:when test="subtitle">
+ <xsl:apply-templates mode="sidebar.titlepage.recto.auto.mode" select="subtitle"/>
+ </xsl:when>
+ </xsl:choose>
+
+</xsl:template>
+
+<xsl:template name="sidebar.titlepage.verso">
+</xsl:template>
+
+<xsl:template name="sidebar.titlepage.separator">
+</xsl:template>
+
+<xsl:template name="sidebar.titlepage.before.recto">
+</xsl:template>
+
+<xsl:template name="sidebar.titlepage.before.verso">
+</xsl:template>
+
+<xsl:template name="sidebar.titlepage">
+ <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format">
+ <xsl:variable name="recto.content">
+ <xsl:call-template name="sidebar.titlepage.before.recto"/>
+ <xsl:call-template name="sidebar.titlepage.recto"/>
+ </xsl:variable>
+ <xsl:variable name="recto.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($recto.content) != '') or ($recto.elements.count &gt; 0)">
+ <fo:block><xsl:copy-of select="$recto.content"/></fo:block>
+ </xsl:if>
+ <xsl:variable name="verso.content">
+ <xsl:call-template name="sidebar.titlepage.before.verso"/>
+ <xsl:call-template name="sidebar.titlepage.verso"/>
+ </xsl:variable>
+ <xsl:variable name="verso.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($verso.content) != '') or ($verso.elements.count &gt; 0)">
+ <fo:block><xsl:copy-of select="$verso.content"/></fo:block>
+ </xsl:if>
+ <xsl:call-template name="sidebar.titlepage.separator"/>
+ </fo:block>
+</xsl:template>
+
+<xsl:template match="*" mode="sidebar.titlepage.recto.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="*" mode="sidebar.titlepage.verso.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="title" mode="sidebar.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="sidebar.titlepage.recto.style" font-family="{$title.fontset}" font-weight="bold">
+<xsl:apply-templates select="." mode="sidebar.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="subtitle" mode="sidebar.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="sidebar.titlepage.recto.style" font-family="{$title.fontset}">
+<xsl:apply-templates select="." mode="sidebar.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template name="qandaset.titlepage.recto">
+ <xsl:choose>
+ <xsl:when test="qandasetinfo/title">
+ <xsl:apply-templates mode="qandaset.titlepage.recto.auto.mode" select="qandasetinfo/title"/>
+ </xsl:when>
+ <xsl:when test="blockinfo/title">
+ <xsl:apply-templates mode="qandaset.titlepage.recto.auto.mode" select="blockinfo/title"/>
+ </xsl:when>
+ <xsl:when test="info/title">
+ <xsl:apply-templates mode="qandaset.titlepage.recto.auto.mode" select="info/title"/>
+ </xsl:when>
+ <xsl:when test="title">
+ <xsl:apply-templates mode="qandaset.titlepage.recto.auto.mode" select="title"/>
+ </xsl:when>
+ </xsl:choose>
+
+ <xsl:choose>
+ <xsl:when test="qandasetinfo/subtitle">
+ <xsl:apply-templates mode="qandaset.titlepage.recto.auto.mode" select="qandasetinfo/subtitle"/>
+ </xsl:when>
+ <xsl:when test="blockinfo/subtitle">
+ <xsl:apply-templates mode="qandaset.titlepage.recto.auto.mode" select="blockinfo/subtitle"/>
+ </xsl:when>
+ <xsl:when test="info/subtitle">
+ <xsl:apply-templates mode="qandaset.titlepage.recto.auto.mode" select="info/subtitle"/>
+ </xsl:when>
+ <xsl:when test="subtitle">
+ <xsl:apply-templates mode="qandaset.titlepage.recto.auto.mode" select="subtitle"/>
+ </xsl:when>
+ </xsl:choose>
+
+ <xsl:apply-templates mode="qandaset.titlepage.recto.auto.mode" select="qandasetinfo/corpauthor"/>
+ <xsl:apply-templates mode="qandaset.titlepage.recto.auto.mode" select="blockinfo/corpauthor"/>
+ <xsl:apply-templates mode="qandaset.titlepage.recto.auto.mode" select="info/corpauthor"/>
+ <xsl:apply-templates mode="qandaset.titlepage.recto.auto.mode" select="qandasetinfo/authorgroup"/>
+ <xsl:apply-templates mode="qandaset.titlepage.recto.auto.mode" select="blockinfo/authorgroup"/>
+ <xsl:apply-templates mode="qandaset.titlepage.recto.auto.mode" select="info/authorgroup"/>
+ <xsl:apply-templates mode="qandaset.titlepage.recto.auto.mode" select="qandasetinfo/author"/>
+ <xsl:apply-templates mode="qandaset.titlepage.recto.auto.mode" select="blockinfo/author"/>
+ <xsl:apply-templates mode="qandaset.titlepage.recto.auto.mode" select="info/author"/>
+ <xsl:apply-templates mode="qandaset.titlepage.recto.auto.mode" select="qandasetinfo/othercredit"/>
+ <xsl:apply-templates mode="qandaset.titlepage.recto.auto.mode" select="blockinfo/othercredit"/>
+ <xsl:apply-templates mode="qandaset.titlepage.recto.auto.mode" select="info/othercredit"/>
+ <xsl:apply-templates mode="qandaset.titlepage.recto.auto.mode" select="qandasetinfo/releaseinfo"/>
+ <xsl:apply-templates mode="qandaset.titlepage.recto.auto.mode" select="blockinfo/releaseinfo"/>
+ <xsl:apply-templates mode="qandaset.titlepage.recto.auto.mode" select="info/releaseinfo"/>
+ <xsl:apply-templates mode="qandaset.titlepage.recto.auto.mode" select="qandasetinfo/copyright"/>
+ <xsl:apply-templates mode="qandaset.titlepage.recto.auto.mode" select="blockinfo/copyright"/>
+ <xsl:apply-templates mode="qandaset.titlepage.recto.auto.mode" select="info/copyright"/>
+ <xsl:apply-templates mode="qandaset.titlepage.recto.auto.mode" select="qandasetinfo/legalnotice"/>
+ <xsl:apply-templates mode="qandaset.titlepage.recto.auto.mode" select="blockinfo/legalnotice"/>
+ <xsl:apply-templates mode="qandaset.titlepage.recto.auto.mode" select="info/legalnotice"/>
+ <xsl:apply-templates mode="qandaset.titlepage.recto.auto.mode" select="qandasetinfo/pubdate"/>
+ <xsl:apply-templates mode="qandaset.titlepage.recto.auto.mode" select="blockinfo/pubdate"/>
+ <xsl:apply-templates mode="qandaset.titlepage.recto.auto.mode" select="info/pubdate"/>
+ <xsl:apply-templates mode="qandaset.titlepage.recto.auto.mode" select="qandasetinfo/revision"/>
+ <xsl:apply-templates mode="qandaset.titlepage.recto.auto.mode" select="blockinfo/revision"/>
+ <xsl:apply-templates mode="qandaset.titlepage.recto.auto.mode" select="info/revision"/>
+ <xsl:apply-templates mode="qandaset.titlepage.recto.auto.mode" select="qandasetinfo/revhistory"/>
+ <xsl:apply-templates mode="qandaset.titlepage.recto.auto.mode" select="blockinfo/revhistory"/>
+ <xsl:apply-templates mode="qandaset.titlepage.recto.auto.mode" select="info/revhistory"/>
+ <xsl:apply-templates mode="qandaset.titlepage.recto.auto.mode" select="qandasetinfo/abstract"/>
+ <xsl:apply-templates mode="qandaset.titlepage.recto.auto.mode" select="blockinfo/abstract"/>
+ <xsl:apply-templates mode="qandaset.titlepage.recto.auto.mode" select="info/abstract"/>
+</xsl:template>
+
+<xsl:template name="qandaset.titlepage.verso">
+</xsl:template>
+
+<xsl:template name="qandaset.titlepage.separator">
+</xsl:template>
+
+<xsl:template name="qandaset.titlepage.before.recto">
+</xsl:template>
+
+<xsl:template name="qandaset.titlepage.before.verso">
+</xsl:template>
+
+<xsl:template name="qandaset.titlepage">
+ <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" font-family="{$title.fontset}">
+ <xsl:variable name="recto.content">
+ <xsl:call-template name="qandaset.titlepage.before.recto"/>
+ <xsl:call-template name="qandaset.titlepage.recto"/>
+ </xsl:variable>
+ <xsl:variable name="recto.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($recto.content) != '') or ($recto.elements.count &gt; 0)">
+ <fo:block start-indent="0pt" text-align="center"><xsl:copy-of select="$recto.content"/></fo:block>
+ </xsl:if>
+ <xsl:variable name="verso.content">
+ <xsl:call-template name="qandaset.titlepage.before.verso"/>
+ <xsl:call-template name="qandaset.titlepage.verso"/>
+ </xsl:variable>
+ <xsl:variable name="verso.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($verso.content) != '') or ($verso.elements.count &gt; 0)">
+ <fo:block><xsl:copy-of select="$verso.content"/></fo:block>
+ </xsl:if>
+ <xsl:call-template name="qandaset.titlepage.separator"/>
+ </fo:block>
+</xsl:template>
+
+<xsl:template match="*" mode="qandaset.titlepage.recto.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="*" mode="qandaset.titlepage.verso.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="title" mode="qandaset.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="qandaset.titlepage.recto.style" keep-with-next.within-column="always" font-size="24.8832pt" font-weight="bold">
+<xsl:call-template name="component.title">
+<xsl:with-param name="node" select="ancestor-or-self::qandaset[1]"/>
+</xsl:call-template>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="subtitle" mode="qandaset.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="qandaset.titlepage.recto.style">
+<xsl:apply-templates select="." mode="qandaset.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="corpauthor" mode="qandaset.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="qandaset.titlepage.recto.style" space-before="0.5em" font-size="14.4pt">
+<xsl:apply-templates select="." mode="qandaset.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="authorgroup" mode="qandaset.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="qandaset.titlepage.recto.style" space-before="0.5em" font-size="14.4pt">
+<xsl:apply-templates select="." mode="qandaset.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="author" mode="qandaset.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="qandaset.titlepage.recto.style" space-before="0.5em" font-size="14.4pt">
+<xsl:apply-templates select="." mode="qandaset.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="othercredit" mode="qandaset.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="qandaset.titlepage.recto.style" space-before="0.5em">
+<xsl:apply-templates select="." mode="qandaset.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="releaseinfo" mode="qandaset.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="qandaset.titlepage.recto.style" space-before="0.5em">
+<xsl:apply-templates select="." mode="qandaset.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="copyright" mode="qandaset.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="qandaset.titlepage.recto.style" space-before="0.5em">
+<xsl:apply-templates select="." mode="qandaset.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="legalnotice" mode="qandaset.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="qandaset.titlepage.recto.style" text-align="start" margin-left="0.5in" margin-right="0.5in" font-family="{$body.fontset}">
+<xsl:apply-templates select="." mode="qandaset.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="pubdate" mode="qandaset.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="qandaset.titlepage.recto.style" space-before="0.5em">
+<xsl:apply-templates select="." mode="qandaset.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="revision" mode="qandaset.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="qandaset.titlepage.recto.style" space-before="0.5em">
+<xsl:apply-templates select="." mode="qandaset.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="revhistory" mode="qandaset.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="qandaset.titlepage.recto.style" space-before="0.5em">
+<xsl:apply-templates select="." mode="qandaset.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="abstract" mode="qandaset.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="qandaset.titlepage.recto.style" space-before="0.5em" text-align="start" margin-left="0.5in" margin-right="0.5in" font-family="{$body.fontset}">
+<xsl:apply-templates select="." mode="qandaset.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template name="table.of.contents.titlepage.recto">
+ <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="table.of.contents.titlepage.recto.style" space-before.minimum="1em" space-before.optimum="1.5em" space-before.maximum="2em" space-after="0.5em" margin-left="{$title.margin.left}" start-indent="0pt" font-size="17.28pt" font-weight="bold" font-family="{$title.fontset}">
+<xsl:call-template name="gentext">
+<xsl:with-param name="key" select="'TableofContents'"/>
+</xsl:call-template></fo:block>
+</xsl:template>
+
+<xsl:template name="table.of.contents.titlepage.verso">
+</xsl:template>
+
+<xsl:template name="table.of.contents.titlepage.separator">
+</xsl:template>
+
+<xsl:template name="table.of.contents.titlepage.before.recto">
+</xsl:template>
+
+<xsl:template name="table.of.contents.titlepage.before.verso">
+</xsl:template>
+
+<xsl:template name="table.of.contents.titlepage">
+ <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format">
+ <xsl:variable name="recto.content">
+ <xsl:call-template name="table.of.contents.titlepage.before.recto"/>
+ <xsl:call-template name="table.of.contents.titlepage.recto"/>
+ </xsl:variable>
+ <xsl:variable name="recto.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($recto.content) != '') or ($recto.elements.count &gt; 0)">
+ <fo:block><xsl:copy-of select="$recto.content"/></fo:block>
+ </xsl:if>
+ <xsl:variable name="verso.content">
+ <xsl:call-template name="table.of.contents.titlepage.before.verso"/>
+ <xsl:call-template name="table.of.contents.titlepage.verso"/>
+ </xsl:variable>
+ <xsl:variable name="verso.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($verso.content) != '') or ($verso.elements.count &gt; 0)">
+ <fo:block><xsl:copy-of select="$verso.content"/></fo:block>
+ </xsl:if>
+ <xsl:call-template name="table.of.contents.titlepage.separator"/>
+ </fo:block>
+</xsl:template>
+
+<xsl:template match="*" mode="table.of.contents.titlepage.recto.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="*" mode="table.of.contents.titlepage.verso.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template name="list.of.tables.titlepage.recto">
+ <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="list.of.tables.titlepage.recto.style" space-before.minimum="1em" space-before.optimum="1.5em" space-before.maximum="2em" space-after="0.5em" margin-left="{$title.margin.left}" start-indent="0pt" font-size="17.28pt" font-weight="bold" font-family="{$title.fontset}">
+<xsl:call-template name="gentext">
+<xsl:with-param name="key" select="'ListofTables'"/>
+</xsl:call-template></fo:block>
+</xsl:template>
+
+<xsl:template name="list.of.tables.titlepage.verso">
+</xsl:template>
+
+<xsl:template name="list.of.tables.titlepage.separator">
+</xsl:template>
+
+<xsl:template name="list.of.tables.titlepage.before.recto">
+</xsl:template>
+
+<xsl:template name="list.of.tables.titlepage.before.verso">
+</xsl:template>
+
+<xsl:template name="list.of.tables.titlepage">
+ <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format">
+ <xsl:variable name="recto.content">
+ <xsl:call-template name="list.of.tables.titlepage.before.recto"/>
+ <xsl:call-template name="list.of.tables.titlepage.recto"/>
+ </xsl:variable>
+ <xsl:variable name="recto.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($recto.content) != '') or ($recto.elements.count &gt; 0)">
+ <fo:block><xsl:copy-of select="$recto.content"/></fo:block>
+ </xsl:if>
+ <xsl:variable name="verso.content">
+ <xsl:call-template name="list.of.tables.titlepage.before.verso"/>
+ <xsl:call-template name="list.of.tables.titlepage.verso"/>
+ </xsl:variable>
+ <xsl:variable name="verso.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($verso.content) != '') or ($verso.elements.count &gt; 0)">
+ <fo:block><xsl:copy-of select="$verso.content"/></fo:block>
+ </xsl:if>
+ <xsl:call-template name="list.of.tables.titlepage.separator"/>
+ </fo:block>
+</xsl:template>
+
+<xsl:template match="*" mode="list.of.tables.titlepage.recto.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="*" mode="list.of.tables.titlepage.verso.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template name="list.of.figures.titlepage.recto">
+ <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="list.of.figures.titlepage.recto.style" space-before.minimum="1em" space-before.optimum="1.5em" space-before.maximum="2em" space-after="0.5em" margin-left="{$title.margin.left}" start-indent="0pt" font-size="17.28pt" font-weight="bold" font-family="{$title.fontset}">
+<xsl:call-template name="gentext">
+<xsl:with-param name="key" select="'ListofFigures'"/>
+</xsl:call-template></fo:block>
+</xsl:template>
+
+<xsl:template name="list.of.figures.titlepage.verso">
+</xsl:template>
+
+<xsl:template name="list.of.figures.titlepage.separator">
+</xsl:template>
+
+<xsl:template name="list.of.figures.titlepage.before.recto">
+</xsl:template>
+
+<xsl:template name="list.of.figures.titlepage.before.verso">
+</xsl:template>
+
+<xsl:template name="list.of.figures.titlepage">
+ <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format">
+ <xsl:variable name="recto.content">
+ <xsl:call-template name="list.of.figures.titlepage.before.recto"/>
+ <xsl:call-template name="list.of.figures.titlepage.recto"/>
+ </xsl:variable>
+ <xsl:variable name="recto.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($recto.content) != '') or ($recto.elements.count &gt; 0)">
+ <fo:block><xsl:copy-of select="$recto.content"/></fo:block>
+ </xsl:if>
+ <xsl:variable name="verso.content">
+ <xsl:call-template name="list.of.figures.titlepage.before.verso"/>
+ <xsl:call-template name="list.of.figures.titlepage.verso"/>
+ </xsl:variable>
+ <xsl:variable name="verso.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($verso.content) != '') or ($verso.elements.count &gt; 0)">
+ <fo:block><xsl:copy-of select="$verso.content"/></fo:block>
+ </xsl:if>
+ <xsl:call-template name="list.of.figures.titlepage.separator"/>
+ </fo:block>
+</xsl:template>
+
+<xsl:template match="*" mode="list.of.figures.titlepage.recto.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="*" mode="list.of.figures.titlepage.verso.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template name="list.of.examples.titlepage.recto">
+ <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="list.of.examples.titlepage.recto.style" space-before.minimum="1em" space-before.optimum="1.5em" space-before.maximum="2em" space-after="0.5em" margin-left="{$title.margin.left}" start-indent="0pt" font-size="17.28pt" font-weight="bold" font-family="{$title.fontset}">
+<xsl:call-template name="gentext">
+<xsl:with-param name="key" select="'ListofExamples'"/>
+</xsl:call-template></fo:block>
+</xsl:template>
+
+<xsl:template name="list.of.examples.titlepage.verso">
+</xsl:template>
+
+<xsl:template name="list.of.examples.titlepage.separator">
+</xsl:template>
+
+<xsl:template name="list.of.examples.titlepage.before.recto">
+</xsl:template>
+
+<xsl:template name="list.of.examples.titlepage.before.verso">
+</xsl:template>
+
+<xsl:template name="list.of.examples.titlepage">
+ <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format">
+ <xsl:variable name="recto.content">
+ <xsl:call-template name="list.of.examples.titlepage.before.recto"/>
+ <xsl:call-template name="list.of.examples.titlepage.recto"/>
+ </xsl:variable>
+ <xsl:variable name="recto.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($recto.content) != '') or ($recto.elements.count &gt; 0)">
+ <fo:block><xsl:copy-of select="$recto.content"/></fo:block>
+ </xsl:if>
+ <xsl:variable name="verso.content">
+ <xsl:call-template name="list.of.examples.titlepage.before.verso"/>
+ <xsl:call-template name="list.of.examples.titlepage.verso"/>
+ </xsl:variable>
+ <xsl:variable name="verso.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($verso.content) != '') or ($verso.elements.count &gt; 0)">
+ <fo:block><xsl:copy-of select="$verso.content"/></fo:block>
+ </xsl:if>
+ <xsl:call-template name="list.of.examples.titlepage.separator"/>
+ </fo:block>
+</xsl:template>
+
+<xsl:template match="*" mode="list.of.examples.titlepage.recto.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="*" mode="list.of.examples.titlepage.verso.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template name="list.of.equations.titlepage.recto">
+ <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="list.of.equations.titlepage.recto.style" space-before.minimum="1em" space-before.optimum="1.5em" space-before.maximum="2em" space-after="0.5em" margin-left="{$title.margin.left}" start-indent="0pt" font-size="17.28pt" font-weight="bold" font-family="{$title.fontset}">
+<xsl:call-template name="gentext">
+<xsl:with-param name="key" select="'ListofEquations'"/>
+</xsl:call-template></fo:block>
+</xsl:template>
+
+<xsl:template name="list.of.equations.titlepage.verso">
+</xsl:template>
+
+<xsl:template name="list.of.equations.titlepage.separator">
+</xsl:template>
+
+<xsl:template name="list.of.equations.titlepage.before.recto">
+</xsl:template>
+
+<xsl:template name="list.of.equations.titlepage.before.verso">
+</xsl:template>
+
+<xsl:template name="list.of.equations.titlepage">
+ <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format">
+ <xsl:variable name="recto.content">
+ <xsl:call-template name="list.of.equations.titlepage.before.recto"/>
+ <xsl:call-template name="list.of.equations.titlepage.recto"/>
+ </xsl:variable>
+ <xsl:variable name="recto.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($recto.content) != '') or ($recto.elements.count &gt; 0)">
+ <fo:block><xsl:copy-of select="$recto.content"/></fo:block>
+ </xsl:if>
+ <xsl:variable name="verso.content">
+ <xsl:call-template name="list.of.equations.titlepage.before.verso"/>
+ <xsl:call-template name="list.of.equations.titlepage.verso"/>
+ </xsl:variable>
+ <xsl:variable name="verso.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($verso.content) != '') or ($verso.elements.count &gt; 0)">
+ <fo:block><xsl:copy-of select="$verso.content"/></fo:block>
+ </xsl:if>
+ <xsl:call-template name="list.of.equations.titlepage.separator"/>
+ </fo:block>
+</xsl:template>
+
+<xsl:template match="*" mode="list.of.equations.titlepage.recto.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="*" mode="list.of.equations.titlepage.verso.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template name="list.of.procedures.titlepage.recto">
+ <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="list.of.procedures.titlepage.recto.style" space-before.minimum="1em" space-before.optimum="1.5em" space-before.maximum="2em" space-after="0.5em" margin-left="{$title.margin.left}" start-indent="0pt" font-size="17.28pt" font-weight="bold" font-family="{$title.fontset}">
+<xsl:call-template name="gentext">
+<xsl:with-param name="key" select="'ListofProcedures'"/>
+</xsl:call-template></fo:block>
+</xsl:template>
+
+<xsl:template name="list.of.procedures.titlepage.verso">
+</xsl:template>
+
+<xsl:template name="list.of.procedures.titlepage.separator">
+</xsl:template>
+
+<xsl:template name="list.of.procedures.titlepage.before.recto">
+</xsl:template>
+
+<xsl:template name="list.of.procedures.titlepage.before.verso">
+</xsl:template>
+
+<xsl:template name="list.of.procedures.titlepage">
+ <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format">
+ <xsl:variable name="recto.content">
+ <xsl:call-template name="list.of.procedures.titlepage.before.recto"/>
+ <xsl:call-template name="list.of.procedures.titlepage.recto"/>
+ </xsl:variable>
+ <xsl:variable name="recto.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($recto.content) != '') or ($recto.elements.count &gt; 0)">
+ <fo:block><xsl:copy-of select="$recto.content"/></fo:block>
+ </xsl:if>
+ <xsl:variable name="verso.content">
+ <xsl:call-template name="list.of.procedures.titlepage.before.verso"/>
+ <xsl:call-template name="list.of.procedures.titlepage.verso"/>
+ </xsl:variable>
+ <xsl:variable name="verso.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($verso.content) != '') or ($verso.elements.count &gt; 0)">
+ <fo:block><xsl:copy-of select="$verso.content"/></fo:block>
+ </xsl:if>
+ <xsl:call-template name="list.of.procedures.titlepage.separator"/>
+ </fo:block>
+</xsl:template>
+
+<xsl:template match="*" mode="list.of.procedures.titlepage.recto.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="*" mode="list.of.procedures.titlepage.verso.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template name="list.of.unknowns.titlepage.recto">
+ <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="list.of.unknowns.titlepage.recto.style" space-before.minimum="1em" space-before.optimum="1.5em" space-before.maximum="2em" space-after="0.5em" margin-left="{$title.margin.left}" start-indent="0pt" font-size="17.28pt" font-weight="bold" font-family="{$title.fontset}">
+<xsl:call-template name="gentext">
+<xsl:with-param name="key" select="'ListofUnknown'"/>
+</xsl:call-template></fo:block>
+</xsl:template>
+
+<xsl:template name="list.of.unknowns.titlepage.verso">
+</xsl:template>
+
+<xsl:template name="list.of.unknowns.titlepage.separator">
+</xsl:template>
+
+<xsl:template name="list.of.unknowns.titlepage.before.recto">
+</xsl:template>
+
+<xsl:template name="list.of.unknowns.titlepage.before.verso">
+</xsl:template>
+
+<xsl:template name="list.of.unknowns.titlepage">
+ <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format">
+ <xsl:variable name="recto.content">
+ <xsl:call-template name="list.of.unknowns.titlepage.before.recto"/>
+ <xsl:call-template name="list.of.unknowns.titlepage.recto"/>
+ </xsl:variable>
+ <xsl:variable name="recto.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($recto.content) != '') or ($recto.elements.count &gt; 0)">
+ <fo:block><xsl:copy-of select="$recto.content"/></fo:block>
+ </xsl:if>
+ <xsl:variable name="verso.content">
+ <xsl:call-template name="list.of.unknowns.titlepage.before.verso"/>
+ <xsl:call-template name="list.of.unknowns.titlepage.verso"/>
+ </xsl:variable>
+ <xsl:variable name="verso.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($verso.content) != '') or ($verso.elements.count &gt; 0)">
+ <fo:block><xsl:copy-of select="$verso.content"/></fo:block>
+ </xsl:if>
+ <xsl:call-template name="list.of.unknowns.titlepage.separator"/>
+ </fo:block>
+</xsl:template>
+
+<xsl:template match="*" mode="list.of.unknowns.titlepage.recto.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="*" mode="list.of.unknowns.titlepage.verso.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+</xsl:stylesheet>
+
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/titlepage.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/titlepage.xsl
new file mode 100644
index 0000000..2e2ec75
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/titlepage.xsl
@@ -0,0 +1,767 @@
+<?xml version='1.0'?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:fo="http://www.w3.org/1999/XSL/Format"
+ version='1.0'>
+
+<!-- ********************************************************************
+ $Id: titlepage.xsl 8804 2010-08-09 16:41:43Z bobstayton $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<!-- ==================================================================== -->
+
+<xsl:attribute-set name="book.titlepage.recto.style">
+ <xsl:attribute name="font-family">
+ <xsl:value-of select="$title.fontset"/>
+ </xsl:attribute>
+ <xsl:attribute name="font-weight">bold</xsl:attribute>
+ <xsl:attribute name="font-size">12pt</xsl:attribute>
+ <xsl:attribute name="text-align">center</xsl:attribute>
+</xsl:attribute-set>
+
+<xsl:attribute-set name="book.titlepage.verso.style">
+ <xsl:attribute name="font-size">10pt</xsl:attribute>
+</xsl:attribute-set>
+
+<xsl:attribute-set name="article.titlepage.recto.style"/>
+<xsl:attribute-set name="article.titlepage.verso.style"/>
+
+<xsl:attribute-set name="set.titlepage.recto.style"/>
+<xsl:attribute-set name="set.titlepage.verso.style"/>
+
+<xsl:attribute-set name="part.titlepage.recto.style">
+ <xsl:attribute name="text-align">center</xsl:attribute>
+</xsl:attribute-set>
+
+<xsl:attribute-set name="part.titlepage.verso.style"/>
+
+<xsl:attribute-set name="partintro.titlepage.recto.style"/>
+<xsl:attribute-set name="partintro.titlepage.verso.style"/>
+
+<xsl:attribute-set name="reference.titlepage.recto.style"/>
+<xsl:attribute-set name="reference.titlepage.verso.style"/>
+
+<xsl:attribute-set name="dedication.titlepage.recto.style"/>
+<xsl:attribute-set name="dedication.titlepage.verso.style"/>
+
+<xsl:attribute-set name="acknowledgements.titlepage.recto.style"/>
+<xsl:attribute-set name="acknowledgements.titlepage.verso.style"/>
+
+<xsl:attribute-set name="preface.titlepage.recto.style"/>
+<xsl:attribute-set name="preface.titlepage.verso.style"/>
+
+<xsl:attribute-set name="chapter.titlepage.recto.style"/>
+<xsl:attribute-set name="chapter.titlepage.verso.style"/>
+
+<xsl:attribute-set name="appendix.titlepage.recto.style"/>
+<xsl:attribute-set name="appendix.titlepage.verso.style"/>
+
+<xsl:attribute-set name="bibliography.titlepage.recto.style"/>
+<xsl:attribute-set name="bibliography.titlepage.verso.style"/>
+
+<xsl:attribute-set name="bibliodiv.titlepage.recto.style"/>
+<xsl:attribute-set name="bibliodiv.titlepage.verso.style"/>
+
+<xsl:attribute-set name="glossary.titlepage.recto.style"/>
+<xsl:attribute-set name="glossary.titlepage.verso.style"/>
+
+<xsl:attribute-set name="glossdiv.titlepage.recto.style"/>
+<xsl:attribute-set name="glossdiv.titlepage.verso.style"/>
+
+<xsl:attribute-set name="index.titlepage.recto.style"/>
+<xsl:attribute-set name="index.titlepage.verso.style"/>
+
+<xsl:attribute-set name="setindex.titlepage.recto.style"/>
+<xsl:attribute-set name="setindex.titlepage.verso.style"/>
+
+<xsl:attribute-set name="indexdiv.titlepage.recto.style"/>
+<xsl:attribute-set name="indexdiv.titlepage.verso.style"/>
+
+<xsl:attribute-set name="colophon.titlepage.recto.style"/>
+<xsl:attribute-set name="colophon.titlepage.verso.style"/>
+
+<xsl:attribute-set name="sidebar.titlepage.recto.style"/>
+<xsl:attribute-set name="sidebar.titlepage.verso.style"/>
+
+<xsl:attribute-set name="qandaset.titlepage.recto.style"/>
+<xsl:attribute-set name="qandaset.titlepage.verso.style"/>
+
+<xsl:attribute-set name="section.titlepage.recto.style">
+ <xsl:attribute name="keep-together.within-column">always</xsl:attribute>
+</xsl:attribute-set>
+
+<xsl:attribute-set name="section.titlepage.verso.style">
+ <xsl:attribute name="keep-together.within-column">always</xsl:attribute>
+ <xsl:attribute name="keep-with-next.within-column">always</xsl:attribute>
+</xsl:attribute-set>
+
+<xsl:attribute-set name="sect1.titlepage.recto.style"
+ use-attribute-sets="section.titlepage.recto.style"/>
+<xsl:attribute-set name="sect1.titlepage.verso.style"
+ use-attribute-sets="section.titlepage.verso.style"/>
+
+<xsl:attribute-set name="sect2.titlepage.recto.style"
+ use-attribute-sets="section.titlepage.recto.style"/>
+<xsl:attribute-set name="sect2.titlepage.verso.style"
+ use-attribute-sets="section.titlepage.verso.style"/>
+
+<xsl:attribute-set name="sect3.titlepage.recto.style"
+ use-attribute-sets="section.titlepage.recto.style"/>
+<xsl:attribute-set name="sect3.titlepage.verso.style"
+ use-attribute-sets="section.titlepage.verso.style"/>
+
+<xsl:attribute-set name="sect4.titlepage.recto.style"
+ use-attribute-sets="section.titlepage.recto.style"/>
+<xsl:attribute-set name="sect4.titlepage.verso.style"
+ use-attribute-sets="section.titlepage.verso.style"/>
+
+<xsl:attribute-set name="sect5.titlepage.recto.style"
+ use-attribute-sets="section.titlepage.recto.style"/>
+<xsl:attribute-set name="sect5.titlepage.verso.style"
+ use-attribute-sets="section.titlepage.verso.style"/>
+
+<xsl:attribute-set name="simplesect.titlepage.recto.style"
+ use-attribute-sets="section.titlepage.recto.style"/>
+<xsl:attribute-set name="simplesect.titlepage.verso.style"
+ use-attribute-sets="section.titlepage.verso.style"/>
+
+<xsl:attribute-set name="refnamediv.titlepage.recto.style"
+ use-attribute-sets="section.titlepage.recto.style"/>
+<xsl:attribute-set name="refnamediv.titlepage.verso.style"
+ use-attribute-sets="section.titlepage.verso.style"/>
+
+<xsl:attribute-set name="refsynopsisdiv.titlepage.recto.style"
+ use-attribute-sets="section.titlepage.recto.style"/>
+<xsl:attribute-set name="refsynopsisdiv.titlepage.verso.style"
+ use-attribute-sets="section.titlepage.verso.style"/>
+
+<xsl:attribute-set name="refsection.titlepage.recto.style"
+ use-attribute-sets="section.titlepage.recto.style"/>
+<xsl:attribute-set name="refsection.titlepage.verso.style"
+ use-attribute-sets="section.titlepage.verso.style"/>
+
+<xsl:attribute-set name="refsect1.titlepage.recto.style"
+ use-attribute-sets="section.titlepage.recto.style"/>
+<xsl:attribute-set name="refsect1.titlepage.verso.style"
+ use-attribute-sets="section.titlepage.verso.style"/>
+
+<xsl:attribute-set name="refsect2.titlepage.recto.style"
+ use-attribute-sets="section.titlepage.recto.style"/>
+<xsl:attribute-set name="refsect2.titlepage.verso.style"
+ use-attribute-sets="section.titlepage.verso.style"/>
+
+<xsl:attribute-set name="refsect3.titlepage.recto.style"
+ use-attribute-sets="section.titlepage.recto.style"/>
+<xsl:attribute-set name="refsect3.titlepage.verso.style"
+ use-attribute-sets="section.titlepage.verso.style"/>
+
+<xsl:attribute-set name="table.of.contents.titlepage.recto.style"/>
+<xsl:attribute-set name="table.of.contents.titlepage.verso.style"/>
+
+<xsl:attribute-set name="list.of.tables.titlepage.recto.style"/>
+<xsl:attribute-set name="list.of.tables.contents.titlepage.verso.style"/>
+
+<xsl:attribute-set name="list.of.figures.titlepage.recto.style"/>
+<xsl:attribute-set name="list.of.figures.contents.titlepage.verso.style"/>
+
+<xsl:attribute-set name="list.of.equations.titlepage.recto.style"/>
+<xsl:attribute-set name="list.of.equations.contents.titlepage.verso.style"/>
+
+<xsl:attribute-set name="list.of.examples.titlepage.recto.style"/>
+<xsl:attribute-set name="list.of.examples.contents.titlepage.verso.style"/>
+
+<xsl:attribute-set name="list.of.procedures.titlepage.recto.style"/>
+<xsl:attribute-set name="list.of.procedures.contents.titlepage.verso.style"/>
+
+<xsl:attribute-set name="list.of.unknowns.titlepage.recto.style"/>
+<xsl:attribute-set name="list.of.unknowns.contents.titlepage.verso.style"/>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="*" mode="titlepage.mode">
+ <!-- if an element isn't found in this mode, try the default mode -->
+ <xsl:apply-templates select="."/>
+</xsl:template>
+
+<xsl:template match="abbrev" mode="titlepage.mode">
+ <xsl:apply-templates mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="abstract" mode="titlepage.mode">
+ <fo:block xsl:use-attribute-sets="abstract.properties">
+ <fo:block xsl:use-attribute-sets="abstract.title.properties">
+ <xsl:choose>
+ <xsl:when test="title|info/title">
+ <xsl:apply-templates select="title|info/title"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'Abstract'"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </fo:block>
+ <xsl:apply-templates select="*[not(self::title)]" mode="titlepage.mode"/>
+ </fo:block>
+</xsl:template>
+
+<xsl:template match="abstract/title" mode="titlepage.mode"/>
+
+<xsl:template match="abstract/title" mode="titlepage.abstract.title.mode">
+ <xsl:apply-templates mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="address" mode="titlepage.mode">
+ <!-- use the normal address handling code -->
+ <xsl:apply-templates select="."/>
+</xsl:template>
+
+<xsl:template match="affiliation" mode="titlepage.mode">
+ <fo:block>
+ <xsl:apply-templates mode="titlepage.mode"/>
+ </fo:block>
+</xsl:template>
+
+<xsl:template match="artpagenums" mode="titlepage.mode">
+ <xsl:apply-templates mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="author" mode="titlepage.mode">
+ <fo:block>
+ <xsl:call-template name="anchor"/>
+ <xsl:choose>
+ <xsl:when test="orgname">
+ <xsl:apply-templates/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="person.name"/>
+ <xsl:if test="affiliation/orgname">
+ <xsl:text>, </xsl:text>
+ <xsl:apply-templates select="affiliation/orgname" mode="titlepage.mode"/>
+ </xsl:if>
+ <xsl:if test="email|affiliation/address/email">
+ <xsl:text> </xsl:text>
+ <xsl:apply-templates select="(email|affiliation/address/email)[1]"/>
+ </xsl:if>
+ </xsl:otherwise>
+ </xsl:choose>
+ </fo:block>
+</xsl:template>
+
+<xsl:template match="authorblurb" mode="titlepage.mode">
+ <xsl:apply-templates mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="authorgroup" mode="titlepage.mode">
+ <fo:wrapper>
+ <xsl:call-template name="anchor"/>
+ <xsl:apply-templates mode="titlepage.mode"/>
+ </fo:wrapper>
+</xsl:template>
+
+<xsl:template match="authorinitials" mode="titlepage.mode">
+ <xsl:apply-templates mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="bibliomisc" mode="titlepage.mode">
+ <xsl:apply-templates mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="bibliomset" mode="titlepage.mode">
+ <xsl:apply-templates mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="collab" mode="titlepage.mode">
+ <xsl:apply-templates mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="confgroup" mode="titlepage.mode">
+ <fo:block>
+ <xsl:apply-templates mode="titlepage.mode"/>
+ </fo:block>
+</xsl:template>
+
+<xsl:template match="confdates" mode="titlepage.mode">
+ <fo:block>
+ <xsl:apply-templates mode="titlepage.mode"/>
+ </fo:block>
+</xsl:template>
+
+<xsl:template match="conftitle" mode="titlepage.mode">
+ <fo:block>
+ <xsl:apply-templates mode="titlepage.mode"/>
+ </fo:block>
+</xsl:template>
+
+<xsl:template match="confnum" mode="titlepage.mode">
+ <!-- suppress -->
+</xsl:template>
+
+<xsl:template match="contractnum" mode="titlepage.mode">
+ <xsl:apply-templates mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="contractsponsor" mode="titlepage.mode">
+ <xsl:apply-templates mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="contrib" mode="titlepage.mode">
+ <xsl:apply-templates mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="copyright" mode="titlepage.mode">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'Copyright'"/>
+ </xsl:call-template>
+ <xsl:call-template name="gentext.space"/>
+ <xsl:call-template name="dingbat">
+ <xsl:with-param name="dingbat">copyright</xsl:with-param>
+ </xsl:call-template>
+ <xsl:call-template name="gentext.space"/>
+ <xsl:call-template name="copyright.years">
+ <xsl:with-param name="years" select="year"/>
+ <xsl:with-param name="print.ranges" select="$make.year.ranges"/>
+ <xsl:with-param name="single.year.ranges"
+ select="$make.single.year.ranges"/>
+ </xsl:call-template>
+ <xsl:call-template name="gentext.space"/>
+ <xsl:apply-templates select="holder" mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="year" mode="titlepage.mode">
+ <xsl:apply-templates/>
+</xsl:template>
+
+<xsl:template match="holder" mode="titlepage.mode">
+ <xsl:apply-templates/>
+ <xsl:if test="position() &lt; last()">
+ <xsl:text>, </xsl:text>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="corpauthor" mode="titlepage.mode">
+ <xsl:apply-templates mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="corpcredit" mode="titlepage.mode">
+ <xsl:apply-templates mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="corpname" mode="titlepage.mode">
+ <xsl:apply-templates mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="date" mode="titlepage.mode">
+ <xsl:apply-templates mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="edition" mode="titlepage.mode">
+ <xsl:apply-templates mode="titlepage.mode"/>
+ <xsl:call-template name="gentext.space"/>
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'Edition'"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="editor" mode="titlepage.mode">
+ <!-- The first editor is dealt with in the following template,
+ which in turn displays all editors of the same mode. -->
+</xsl:template>
+
+<xsl:template match="editor[1]" priority="2" mode="titlepage.mode">
+ <xsl:call-template name="gentext.edited.by"/>
+ <xsl:call-template name="gentext.space"/>
+ <xsl:call-template name="person.name.list">
+ <xsl:with-param name="person.list" select="../editor"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="firstname" mode="titlepage.mode">
+ <xsl:apply-templates mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="graphic" mode="titlepage.mode">
+ <!-- use the normal graphic handling code -->
+ <xsl:apply-templates select="."/>
+</xsl:template>
+
+<xsl:template match="honorific" mode="titlepage.mode">
+ <xsl:apply-templates mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="isbn" mode="titlepage.mode">
+ <xsl:apply-templates mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="issn" mode="titlepage.mode">
+ <xsl:apply-templates mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="biblioid" mode="titlepage.mode">
+ <xsl:apply-templates mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="itermset" mode="titlepage.mode">
+ <!-- discard -->
+</xsl:template>
+
+<xsl:template match="invpartnumber" mode="titlepage.mode">
+ <xsl:apply-templates mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="issuenum" mode="titlepage.mode">
+ <xsl:apply-templates mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="jobtitle" mode="titlepage.mode">
+ <fo:block>
+ <xsl:apply-templates mode="titlepage.mode"/>
+ </fo:block>
+</xsl:template>
+
+<xsl:template match="keywordset" mode="titlepage.mode">
+</xsl:template>
+
+<xsl:template match="legalnotice" mode="titlepage.mode">
+
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+
+ <fo:block id="{$id}">
+ <xsl:if test="title"> <!-- FIXME: add param for using default title? -->
+ <xsl:call-template name="formal.object.heading"/>
+ </xsl:if>
+ <xsl:apply-templates mode="titlepage.mode"/>
+ </fo:block>
+</xsl:template>
+
+<xsl:template match="legalnotice/title" mode="titlepage.mode">
+</xsl:template>
+
+<xsl:template match="lineage" mode="titlepage.mode">
+ <xsl:apply-templates mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="modespec" mode="titlepage.mode">
+ <!-- discard -->
+</xsl:template>
+
+<xsl:template match="orgdiv" mode="titlepage.mode">
+ <xsl:if test="preceding-sibling::*[1][self::orgname]">
+ <xsl:text> </xsl:text>
+ </xsl:if>
+ <xsl:apply-templates mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="orgname" mode="titlepage.mode">
+ <xsl:apply-templates mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="othercredit" mode="titlepage.mode">
+ <xsl:variable name="contrib" select="string(contrib)"/>
+ <xsl:choose>
+ <xsl:when test="contrib">
+ <xsl:if test="not(preceding-sibling::othercredit[string(contrib)=$contrib])">
+ <fo:block>
+ <xsl:apply-templates mode="titlepage.mode" select="contrib"/>
+ <xsl:text>: </xsl:text>
+ <xsl:call-template name="person.name"/>
+ <xsl:apply-templates mode="titlepage.mode" select="affiliation"/>
+ <xsl:apply-templates select="following-sibling::othercredit[string(contrib)=$contrib]" mode="titlepage.othercredits"/>
+ </fo:block>
+ </xsl:if>
+ </xsl:when>
+ <xsl:otherwise>
+ <fo:block><xsl:call-template name="person.name"/></fo:block>
+ <xsl:apply-templates mode="titlepage.mode" select="./affiliation"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="othercredit" mode="titlepage.othercredits">
+ <xsl:text>, </xsl:text>
+ <xsl:call-template name="person.name"/>
+</xsl:template>
+
+<xsl:template match="othername" mode="titlepage.mode">
+ <xsl:apply-templates mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="pagenums" mode="titlepage.mode">
+ <xsl:apply-templates mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="printhistory" mode="titlepage.mode">
+ <xsl:apply-templates mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="productname" mode="titlepage.mode">
+ <xsl:apply-templates mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="productnumber" mode="titlepage.mode">
+ <xsl:apply-templates mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="pubdate" mode="titlepage.mode">
+ <xsl:apply-templates mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="publisher" mode="titlepage.mode">
+ <fo:block>
+ <xsl:apply-templates mode="titlepage.mode"/>
+ </fo:block>
+</xsl:template>
+
+<xsl:template match="publishername" mode="titlepage.mode">
+ <xsl:apply-templates mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="pubsnumber" mode="titlepage.mode">
+ <xsl:apply-templates mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="releaseinfo" mode="titlepage.mode">
+ <xsl:apply-templates mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="revhistory" mode="titlepage.mode">
+
+ <xsl:variable name="explicit.table.width">
+ <xsl:call-template name="pi.dbfo_table-width"/>
+ </xsl:variable>
+
+ <xsl:variable name="table.width">
+ <xsl:choose>
+ <xsl:when test="$explicit.table.width != ''">
+ <xsl:value-of select="$explicit.table.width"/>
+ </xsl:when>
+ <xsl:when test="$default.table.width = ''">
+ <xsl:text>100%</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$default.table.width"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <fo:table table-layout="fixed" width="{$table.width}" xsl:use-attribute-sets="revhistory.table.properties">
+ <fo:table-column column-number="1" column-width="proportional-column-width(1)"/>
+ <fo:table-column column-number="2" column-width="proportional-column-width(1)"/>
+ <fo:table-column column-number="3" column-width="proportional-column-width(1)"/>
+ <fo:table-body start-indent="0pt" end-indent="0pt">
+ <fo:table-row>
+ <fo:table-cell number-columns-spanned="3" xsl:use-attribute-sets="revhistory.table.cell.properties">
+ <fo:block xsl:use-attribute-sets="revhistory.title.properties">
+ <xsl:choose>
+ <xsl:when test="title|info/title">
+ <xsl:apply-templates select="title|info/title" mode="titlepage.mode"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'RevHistory'"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </fo:block>
+ </fo:table-cell>
+ </fo:table-row>
+ <xsl:apply-templates select="*[not(self::title)]" mode="titlepage.mode"/>
+ </fo:table-body>
+ </fo:table>
+
+</xsl:template>
+
+
+<xsl:template match="revhistory/revision" mode="titlepage.mode">
+ <xsl:variable name="revnumber" select="revnumber"/>
+ <xsl:variable name="revdate" select="date"/>
+ <xsl:variable name="revauthor" select="authorinitials|author"/>
+ <xsl:variable name="revremark" select="revremark|revdescription"/>
+ <fo:table-row>
+ <fo:table-cell xsl:use-attribute-sets="revhistory.table.cell.properties">
+ <fo:block>
+ <xsl:if test="$revnumber">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'Revision'"/>
+ </xsl:call-template>
+ <xsl:call-template name="gentext.space"/>
+ <xsl:apply-templates select="$revnumber[1]" mode="titlepage.mode"/>
+ </xsl:if>
+ </fo:block>
+ </fo:table-cell>
+ <fo:table-cell xsl:use-attribute-sets="revhistory.table.cell.properties">
+ <fo:block>
+ <xsl:apply-templates select="$revdate[1]" mode="titlepage.mode"/>
+ </fo:block>
+ </fo:table-cell>
+ <fo:table-cell xsl:use-attribute-sets="revhistory.table.cell.properties">
+ <fo:block>
+ <xsl:for-each select="$revauthor">
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+ <xsl:if test="position() != last()">
+ <xsl:text>, </xsl:text>
+ </xsl:if>
+ </xsl:for-each>
+ </fo:block>
+ </fo:table-cell>
+ </fo:table-row>
+ <xsl:if test="$revremark">
+ <fo:table-row>
+ <fo:table-cell number-columns-spanned="3" xsl:use-attribute-sets="revhistory.table.cell.properties">
+ <fo:block>
+ <xsl:apply-templates select="$revremark[1]" mode="titlepage.mode"/>
+ </fo:block>
+ </fo:table-cell>
+ </fo:table-row>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="revision/revnumber" mode="titlepage.mode">
+ <xsl:apply-templates mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="revision/date" mode="titlepage.mode">
+ <xsl:apply-templates mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="revision/authorinitials" mode="titlepage.mode">
+ <xsl:apply-templates mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="revision/author" mode="titlepage.mode">
+ <xsl:apply-templates mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="revision/revremark" mode="titlepage.mode">
+ <xsl:apply-templates mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="revision/revdescription" mode="titlepage.mode">
+ <xsl:apply-templates mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="seriesvolnums" mode="titlepage.mode">
+ <xsl:apply-templates mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="shortaffil" mode="titlepage.mode">
+ <xsl:apply-templates mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="subjectset" mode="titlepage.mode">
+ <!-- discard -->
+</xsl:template>
+
+<xsl:template match="subtitle" mode="titlepage.mode">
+ <xsl:apply-templates mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="surname" mode="titlepage.mode">
+ <xsl:apply-templates mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="title" mode="titlepage.mode">
+ <xsl:apply-templates mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="titleabbrev" mode="titlepage.mode">
+ <xsl:apply-templates mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="volumenum" mode="titlepage.mode">
+ <xsl:apply-templates mode="titlepage.mode"/>
+</xsl:template>
+
+<!-- ==================================================================== -->
+<!-- Book templates -->
+
+<!-- Note: these templates cannot use *.titlepage.recto.mode or
+ *.titlepage.verso.mode. If they do then subsequent use of a custom
+ titlepage.templates.xml file will not work correctly. -->
+
+<!-- book recto -->
+
+<xsl:template match="bookinfo/authorgroup|book/info/authorgroup"
+ mode="titlepage.mode" priority="2">
+ <fo:block>
+ <xsl:call-template name="anchor"/>
+ <xsl:apply-templates mode="titlepage.mode"/>
+ </fo:block>
+</xsl:template>
+
+<!-- book verso -->
+
+<xsl:template name="book.verso.title">
+ <fo:block>
+ <xsl:apply-templates mode="titlepage.mode"/>
+
+ <xsl:if test="following-sibling::subtitle
+ |following-sibling::info/subtitle
+ |following-sibling::bookinfo/subtitle">
+ <xsl:text>: </xsl:text>
+
+ <xsl:apply-templates select="(following-sibling::subtitle
+ |following-sibling::info/subtitle
+ |following-sibling::bookinfo/subtitle)[1]"
+ mode="book.verso.subtitle.mode"/>
+ </xsl:if>
+ </fo:block>
+</xsl:template>
+
+<xsl:template match="subtitle" mode="book.verso.subtitle.mode">
+ <xsl:apply-templates mode="titlepage.mode"/>
+ <xsl:if test="following-sibling::subtitle">
+ <xsl:text>: </xsl:text>
+ <xsl:apply-templates select="following-sibling::subtitle[1]"
+ mode="book.verso.subtitle.mode"/>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template name="verso.authorgroup">
+ <fo:block>
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'by'"/>
+ </xsl:call-template>
+ <xsl:text> </xsl:text>
+ <xsl:call-template name="person.name.list">
+ <xsl:with-param name="person.list" select="author|corpauthor|editor"/>
+ </xsl:call-template>
+ </fo:block>
+ <xsl:apply-templates select="othercredit" mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="bookinfo/author|book/info/author"
+ mode="titlepage.mode" priority="2">
+ <fo:block>
+ <xsl:call-template name="person.name"/>
+ </fo:block>
+</xsl:template>
+
+<xsl:template match="bookinfo/corpauthor|book/info/corpauthor"
+ mode="titlepage.mode" priority="2">
+ <fo:block>
+ <xsl:apply-templates/>
+ </fo:block>
+</xsl:template>
+
+<xsl:template match="bookinfo/pubdate|book/info/pubdate"
+ mode="titlepage.mode" priority="2">
+ <fo:block>
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'pubdate'"/>
+ </xsl:call-template>
+ <xsl:text> </xsl:text>
+ <xsl:apply-templates mode="titlepage.mode"/>
+ </fo:block>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/toc.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/toc.xsl
new file mode 100644
index 0000000..cf32724
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/toc.xsl
@@ -0,0 +1,332 @@
+<?xml version='1.0'?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:fo="http://www.w3.org/1999/XSL/Format"
+ version='1.0'>
+
+<!-- ********************************************************************
+ $Id: toc.xsl 8323 2009-03-12 22:52:17Z bobstayton $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<!-- ==================================================================== -->
+
+<!-- only set, book and part puts toc in its own page sequence -->
+
+<xsl:template match="set/toc | book/toc | part/toc">
+ <xsl:variable name="toc.params">
+ <xsl:call-template name="find.path.params">
+ <xsl:with-param name="node" select="parent::*"/>
+ <xsl:with-param name="table" select="normalize-space($generate.toc)"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <!-- Do not output the toc element if one is already generated
+ by the use of $generate.toc parameter, or if
+ generating a source toc is turned off -->
+ <xsl:if test="not(contains($toc.params, 'toc')) and
+ ($process.source.toc != 0 or $process.empty.source.toc != 0)">
+ <!-- Don't generate a page sequence unless there is content -->
+ <xsl:variable name="content">
+ <xsl:choose>
+ <xsl:when test="* and $process.source.toc != 0">
+ <xsl:apply-templates />
+ </xsl:when>
+ <xsl:when test="count(*) = 0 and $process.empty.source.toc != 0">
+ <!-- trick to switch context node to parent element -->
+ <xsl:for-each select="parent::*">
+ <xsl:choose>
+ <xsl:when test="self::set">
+ <xsl:call-template name="set.toc">
+ <xsl:with-param name="toc.title.p"
+ select="contains($toc.params, 'title')"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="self::book">
+ <xsl:call-template name="division.toc">
+ <xsl:with-param name="toc.title.p"
+ select="contains($toc.params, 'title')"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="self::part">
+ <xsl:call-template name="division.toc">
+ <xsl:with-param name="toc.title.p"
+ select="contains($toc.params, 'title')"/>
+ </xsl:call-template>
+ </xsl:when>
+ </xsl:choose>
+ </xsl:for-each>
+ </xsl:when>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:if test="string-length(normalize-space($content)) != 0">
+ <xsl:variable name="lot-master-reference">
+ <xsl:call-template name="select.pagemaster">
+ <xsl:with-param name="pageclass" select="'lot'"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:call-template name="page.sequence">
+ <xsl:with-param name="master-reference"
+ select="$lot-master-reference"/>
+ <xsl:with-param name="element" select="'toc'"/>
+ <xsl:with-param name="gentext-key" select="'TableofContents'"/>
+ <xsl:with-param name="content" select="$content"/>
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="chapter/toc | appendix/toc | preface/toc | article/toc">
+ <xsl:variable name="toc.params">
+ <xsl:call-template name="find.path.params">
+ <xsl:with-param name="node" select="parent::*"/>
+ <xsl:with-param name="table" select="normalize-space($generate.toc)"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <!-- Do not output the toc element if one is already generated
+ by the use of $generate.toc parameter, or if
+ generating a source toc is turned off -->
+ <xsl:if test="not(contains($toc.params, 'toc')) and
+ ($process.source.toc != 0 or $process.empty.source.toc != 0)">
+ <xsl:choose>
+ <xsl:when test="* and $process.source.toc != 0">
+ <fo:block>
+ <xsl:apply-templates/>
+ </fo:block>
+ </xsl:when>
+ <xsl:when test="count(*) = 0 and $process.empty.source.toc != 0">
+ <!-- trick to switch context node to section element -->
+ <xsl:for-each select="parent::*">
+ <xsl:call-template name="component.toc">
+ <xsl:with-param name="toc.title.p"
+ select="contains($toc.params, 'title')"/>
+ </xsl:call-template>
+ </xsl:for-each>
+ </xsl:when>
+ </xsl:choose>
+ <xsl:call-template name="component.toc.separator"/>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="section/toc
+ |sect1/toc
+ |sect2/toc
+ |sect3/toc
+ |sect4/toc
+ |sect5/toc">
+
+ <xsl:variable name="toc.params">
+ <xsl:call-template name="find.path.params">
+ <xsl:with-param name="node" select="parent::*"/>
+ <xsl:with-param name="table" select="normalize-space($generate.toc)"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <!-- Do not output the toc element if one is already generated
+ by the use of $generate.toc parameter, or if
+ generating a source toc is turned off -->
+ <xsl:if test="not(contains($toc.params, 'toc')) and
+ ($process.source.toc != 0 or $process.empty.source.toc != 0)">
+ <xsl:choose>
+ <xsl:when test="* and $process.source.toc != 0">
+ <fo:block>
+ <xsl:apply-templates/>
+ </fo:block>
+ </xsl:when>
+ <xsl:when test="count(*) = 0 and $process.empty.source.toc != 0">
+ <!-- trick to switch context node to section element -->
+ <xsl:for-each select="parent::*">
+ <xsl:call-template name="section.toc">
+ <xsl:with-param name="toc.title.p"
+ select="contains($toc.params, 'title')"/>
+ </xsl:call-template>
+ </xsl:for-each>
+ </xsl:when>
+ </xsl:choose>
+ <xsl:call-template name="section.toc.separator"/>
+ </xsl:if>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="tocpart|tocchap
+ |toclevel1|toclevel2|toclevel3|toclevel4|toclevel5">
+ <xsl:apply-templates select="tocentry"/>
+ <xsl:if test="tocchap|toclevel1|toclevel2|toclevel3|toclevel4|toclevel5">
+ <fo:block start-indent="{count(ancestor::*)*2}pc">
+ <xsl:apply-templates select="tocchap|toclevel1|toclevel2|toclevel3|toclevel4|toclevel5"/>
+ </fo:block>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="tocentry|lotentry|tocdiv|tocfront|tocback">
+ <fo:block text-align-last="justify"
+ end-indent="2pc"
+ last-line-end-indent="-2pc">
+ <fo:inline keep-with-next.within-line="always">
+ <xsl:choose>
+ <xsl:when test="@linkend">
+ <fo:basic-link internal-destination="{@linkend}">
+ <xsl:apply-templates/>
+ </fo:basic-link>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </fo:inline>
+
+ <xsl:choose>
+ <xsl:when test="@linkend">
+ <fo:inline keep-together.within-line="always">
+ <xsl:text> </xsl:text>
+ <fo:leader leader-pattern="dots"
+ keep-with-next.within-line="always"/>
+ <xsl:text> </xsl:text>
+ <fo:basic-link internal-destination="{@linkend}">
+ <xsl:choose>
+ <xsl:when test="@pagenum">
+ <xsl:value-of select="@pagenum"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <fo:page-number-citation ref-id="{@linkend}"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </fo:basic-link>
+ </fo:inline>
+ </xsl:when>
+ <xsl:when test="@pagenum">
+ <fo:inline keep-together.within-line="always">
+ <xsl:text> </xsl:text>
+ <fo:leader leader-pattern="dots"
+ keep-with-next.within-line="always"/>
+ <xsl:text> </xsl:text>
+ <xsl:value-of select="@pagenum"/>
+ </fo:inline>
+ </xsl:when>
+ <xsl:otherwise>
+ <!-- just the leaders, what else can I do? -->
+ <fo:inline keep-together.within-line="always">
+ <xsl:text> </xsl:text>
+ <fo:leader leader-pattern="space"
+ keep-with-next.within-line="always"/>
+ </fo:inline>
+ </xsl:otherwise>
+ </xsl:choose>
+ </fo:block>
+</xsl:template>
+
+<xsl:template match="toc/title">
+ <fo:block font-weight="bold">
+ <xsl:apply-templates/>
+ </fo:block>
+</xsl:template>
+
+<xsl:template match="toc/subtitle">
+ <fo:block font-weight="bold">
+ <xsl:apply-templates/>
+ </fo:block>
+</xsl:template>
+
+<xsl:template match="toc/titleabbrev">
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<!-- A lot element must have content, because there is no attribute
+ to select what kind of list should be generated -->
+<xsl:template match="book/lot | part/lot">
+ <!-- Don't generate a page sequence unless there is content -->
+ <xsl:variable name="content">
+ <xsl:choose>
+ <xsl:when test="* and $process.source.toc != 0">
+ <xsl:apply-templates />
+ </xsl:when>
+ <xsl:when test="not(child::*) and $process.empty.source.toc != 0">
+ <xsl:call-template name="process.empty.lot"/>
+ </xsl:when>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:if test="string-length(normalize-space($content)) != 0">
+ <xsl:variable name="lot-master-reference">
+ <xsl:call-template name="select.pagemaster">
+ <xsl:with-param name="pageclass" select="'lot'"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:call-template name="page.sequence">
+ <xsl:with-param name="master-reference"
+ select="$lot-master-reference"/>
+ <xsl:with-param name="element" select="'toc'"/>
+ <xsl:with-param name="content" select="$content"/>
+ </xsl:call-template>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="chapter/lot | appendix/lot | preface/lot | article/lot">
+ <xsl:choose>
+ <xsl:when test="* and $process.source.toc != 0">
+ <fo:block>
+ <xsl:apply-templates/>
+ </fo:block>
+ <xsl:call-template name="component.toc.separator"/>
+ </xsl:when>
+ <xsl:when test="not(child::*) and $process.empty.source.toc != 0">
+ <xsl:call-template name="process.empty.lot"/>
+ </xsl:when>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="section/lot
+ |sect1/lot
+ |sect2/lot
+ |sect3/lot
+ |sect4/lot
+ |sect5/lot">
+ <xsl:choose>
+ <xsl:when test="* and $process.source.toc != 0">
+ <fo:block>
+ <xsl:apply-templates/>
+ </fo:block>
+ <xsl:call-template name="section.toc.separator"/>
+ </xsl:when>
+ <xsl:when test="not(child::*) and $process.empty.source.toc != 0">
+ <xsl:call-template name="process.empty.lot"/>
+ </xsl:when>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="process.empty.lot">
+ <!-- An empty lot element does not provide any information to indicate
+ what should be included in it. You can customize this
+ template to generate a lot based on @role or something -->
+ <xsl:message>
+ <xsl:text>Warning: don't know what to generate for </xsl:text>
+ <xsl:text>lot that has no children.</xsl:text>
+ </xsl:message>
+</xsl:template>
+
+<xsl:template match="lot/title">
+ <fo:block font-weight="bold">
+ <xsl:apply-templates/>
+ </fo:block>
+</xsl:template>
+
+<xsl:template match="lot/subtitle">
+ <fo:block font-weight="bold">
+ <xsl:apply-templates/>
+ </fo:block>
+</xsl:template>
+
+<xsl:template match="lot/titleabbrev">
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/verbatim.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/verbatim.xsl
new file mode 100644
index 0000000..098489a
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/verbatim.xsl
@@ -0,0 +1,465 @@
+<?xml version='1.0'?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:fo="http://www.w3.org/1999/XSL/Format"
+ xmlns:sverb="http://nwalsh.com/xslt/ext/com.nwalsh.saxon.Verbatim"
+ xmlns:xverb="com.nwalsh.xalan.Verbatim"
+ xmlns:lxslt="http://xml.apache.org/xslt"
+ xmlns:exsl="http://exslt.org/common"
+ exclude-result-prefixes="sverb xverb lxslt exsl"
+ version='1.0'>
+
+<!-- ********************************************************************
+ $Id: verbatim.xsl 8344 2009-03-16 06:35:43Z bobstayton $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<!-- XSLTHL highlighting is turned off by default. See highlighting/README
+ for instructions on how to turn on XSLTHL -->
+<xsl:template name="apply-highlighting">
+ <xsl:apply-templates/>
+</xsl:template>
+
+<lxslt:component prefix="xverb"
+ functions="numberLines"/>
+
+<xsl:template match="programlisting|screen|synopsis">
+ <xsl:param name="suppress-numbers" select="'0'"/>
+ <xsl:variable name="id"><xsl:call-template name="object.id"/></xsl:variable>
+
+ <xsl:variable name="content">
+ <xsl:choose>
+ <xsl:when test="$suppress-numbers = '0'
+ and @linenumbering = 'numbered'
+ and $use.extensions != '0'
+ and $linenumbering.extension != '0'">
+ <xsl:call-template name="number.rtf.lines">
+ <xsl:with-param name="rtf">
+ <xsl:choose>
+ <xsl:when test="$highlight.source != 0">
+ <xsl:call-template name="apply-highlighting"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:choose>
+ <xsl:when test="$highlight.source != 0">
+ <xsl:call-template name="apply-highlighting"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="block.content">
+ <xsl:choose>
+ <xsl:when test="$shade.verbatim != 0">
+ <fo:block id="{$id}"
+ xsl:use-attribute-sets="monospace.verbatim.properties shade.verbatim.style">
+ <xsl:choose>
+ <xsl:when test="$hyphenate.verbatim != 0 and
+ $exsl.node.set.available != 0">
+ <xsl:apply-templates select="exsl:node-set($content)"
+ mode="hyphenate.verbatim"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:copy-of select="$content"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </fo:block>
+ </xsl:when>
+ <xsl:otherwise>
+ <fo:block id="{$id}"
+ xsl:use-attribute-sets="monospace.verbatim.properties">
+ <xsl:choose>
+ <xsl:when test="$hyphenate.verbatim != 0 and
+ $exsl.node.set.available != 0">
+ <xsl:apply-templates select="exsl:node-set($content)"
+ mode="hyphenate.verbatim"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:copy-of select="$content"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </fo:block>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:choose>
+ <!-- Need a block-container for these features -->
+ <xsl:when test="@width != '' or
+ (self::programlisting and
+ starts-with($writing.mode, 'rl'))">
+ <fo:block-container start-indent="0pt" end-indent="0pt">
+ <xsl:if test="@width != ''">
+ <xsl:attribute name="width">
+ <xsl:value-of select="concat(@width, '*', $monospace.verbatim.font.width)"/>
+ </xsl:attribute>
+ </xsl:if>
+ <!-- All known program code is left-to-right -->
+ <xsl:if test="self::programlisting and
+ starts-with($writing.mode, 'rl')">
+ <xsl:attribute name="writing-mode">lr-tb</xsl:attribute>
+ </xsl:if>
+ <xsl:copy-of select="$block.content"/>
+ </fo:block-container>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:copy-of select="$block.content"/>
+ </xsl:otherwise>
+ </xsl:choose>
+
+</xsl:template>
+
+<xsl:template match="literallayout">
+ <xsl:param name="suppress-numbers" select="'0'"/>
+
+ <xsl:variable name="id"><xsl:call-template name="object.id"/></xsl:variable>
+
+ <xsl:variable name="content">
+ <xsl:choose>
+ <xsl:when test="$suppress-numbers = '0'
+ and @linenumbering = 'numbered'
+ and $use.extensions != '0'
+ and $linenumbering.extension != '0'">
+ <xsl:call-template name="number.rtf.lines">
+ <xsl:with-param name="rtf">
+ <xsl:apply-templates/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="@class='monospaced'">
+ <xsl:choose>
+ <xsl:when test="$shade.verbatim != 0">
+ <fo:block id="{$id}"
+ xsl:use-attribute-sets="monospace.verbatim.properties shade.verbatim.style">
+
+ <xsl:copy-of select="$content"/>
+ </fo:block>
+ </xsl:when>
+ <xsl:otherwise>
+ <fo:block id="{$id}"
+ xsl:use-attribute-sets="monospace.verbatim.properties">
+ <xsl:copy-of select="$content"/>
+ </fo:block>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:choose>
+ <xsl:when test="$shade.verbatim != 0">
+ <fo:block id="{$id}"
+ xsl:use-attribute-sets="verbatim.properties shade.verbatim.style">
+ <xsl:copy-of select="$content"/>
+ </fo:block>
+ </xsl:when>
+ <xsl:otherwise>
+ <fo:block id="{$id}"
+ xsl:use-attribute-sets="verbatim.properties">
+ <xsl:copy-of select="$content"/>
+ </fo:block>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="address">
+ <xsl:param name="suppress-numbers" select="'0'"/>
+
+ <xsl:variable name="content">
+ <xsl:choose>
+ <xsl:when test="$suppress-numbers = '0'
+ and @linenumbering = 'numbered'
+ and $use.extensions != '0'
+ and $linenumbering.extension != '0'">
+ <xsl:call-template name="number.rtf.lines">
+ <xsl:with-param name="rtf">
+ <xsl:apply-templates/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <fo:block xsl:use-attribute-sets="verbatim.properties">
+ <xsl:copy-of select="$content"/>
+ </fo:block>
+</xsl:template>
+
+<xsl:template name="number.rtf.lines">
+ <xsl:param name="rtf" select="''"/>
+ <xsl:param name="pi.context" select="."/>
+
+ <!-- Save the global values -->
+ <xsl:variable name="global.linenumbering.everyNth"
+ select="$linenumbering.everyNth"/>
+
+ <xsl:variable name="global.linenumbering.separator"
+ select="$linenumbering.separator"/>
+
+ <xsl:variable name="global.linenumbering.width"
+ select="$linenumbering.width"/>
+
+ <!-- Extract the <?dbfo linenumbering.*?> PI values -->
+ <xsl:variable name="pi.linenumbering.everyNth">
+ <xsl:call-template name="pi.dbfo_linenumbering.everyNth">
+ <xsl:with-param name="node" select="$pi.context"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="pi.linenumbering.separator">
+ <xsl:call-template name="pi.dbfo_linenumbering.separator">
+ <xsl:with-param name="node" select="$pi.context"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="pi.linenumbering.width">
+ <xsl:call-template name="pi.dbfo_linenumbering.width">
+ <xsl:with-param name="node" select="$pi.context"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <!-- Construct the 'in-context' values -->
+ <xsl:variable name="linenumbering.everyNth">
+ <xsl:choose>
+ <xsl:when test="$pi.linenumbering.everyNth != ''">
+ <xsl:value-of select="$pi.linenumbering.everyNth"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$global.linenumbering.everyNth"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="linenumbering.separator">
+ <xsl:choose>
+ <xsl:when test="$pi.linenumbering.separator != ''">
+ <xsl:value-of select="$pi.linenumbering.separator"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$global.linenumbering.separator"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="linenumbering.width">
+ <xsl:choose>
+ <xsl:when test="$pi.linenumbering.width != ''">
+ <xsl:value-of select="$pi.linenumbering.width"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$global.linenumbering.width"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="linenumbering.startinglinenumber">
+ <xsl:choose>
+ <xsl:when test="$pi.context/@startinglinenumber">
+ <xsl:value-of select="$pi.context/@startinglinenumber"/>
+ </xsl:when>
+ <xsl:when test="$pi.context/@continuation='continues'">
+ <xsl:variable name="lastLine">
+ <xsl:choose>
+ <xsl:when test="$pi.context/self::programlisting">
+ <xsl:call-template name="lastLineNumber">
+ <xsl:with-param name="listings"
+ select="preceding::programlisting[@linenumbering='numbered']"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="$pi.context/self::screen">
+ <xsl:call-template name="lastLineNumber">
+ <xsl:with-param name="listings"
+ select="preceding::screen[@linenumbering='numbered']"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="$pi.context/self::literallayout">
+ <xsl:call-template name="lastLineNumber">
+ <xsl:with-param name="listings"
+ select="preceding::literallayout[@linenumbering='numbered']"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="$pi.context/self::address">
+ <xsl:call-template name="lastLineNumber">
+ <xsl:with-param name="listings"
+ select="preceding::address[@linenumbering='numbered']"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="$pi.context/self::synopsis">
+ <xsl:call-template name="lastLineNumber">
+ <xsl:with-param name="listings"
+ select="preceding::synopsis[@linenumbering='numbered']"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:message>
+ <xsl:text>Unexpected verbatim environment: </xsl:text>
+ <xsl:value-of select="local-name(.)"/>
+ </xsl:message>
+ <xsl:value-of select="0"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:value-of select="$lastLine + 1"/>
+ </xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="function-available('sverb:numberLines')">
+ <xsl:copy-of select="sverb:numberLines($rtf)"/>
+ </xsl:when>
+ <xsl:when test="function-available('xverb:numberLines')">
+ <xsl:copy-of select="xverb:numberLines($rtf)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:message terminate="yes">
+ <xsl:text>No numberLines function available.</xsl:text>
+ </xsl:message>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ======================================================================== -->
+
+<xsl:template name="lastLineNumber">
+ <xsl:param name="listings"/>
+ <xsl:param name="number" select="0"/>
+
+ <xsl:variable name="lines">
+ <xsl:call-template name="countLines">
+ <xsl:with-param name="listing" select="string($listings[1])"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="not($listings)">
+ <xsl:value-of select="$number"/>
+ </xsl:when>
+ <xsl:when test="$listings[1]/@startinglinenumber">
+ <xsl:value-of select="$number + $listings[1]/@startinglinenumber + $lines - 1"/>
+ </xsl:when>
+ <xsl:when test="$listings[1]/@continuation='continues'">
+ <xsl:call-template name="lastLineNumber">
+ <xsl:with-param name="listings" select="listings[position() &gt; 1]"/>
+ <xsl:with-param name="number" select="$number + $lines"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$lines"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="countLines">
+ <xsl:param name="listing"/>
+ <xsl:param name="count" select="1"/>
+
+ <xsl:choose>
+ <xsl:when test="contains($listing, '&#10;')">
+ <xsl:call-template name="countLines">
+ <xsl:with-param name="listing" select="substring-after($listing, '&#10;')"/>
+ <xsl:with-param name="count" select="$count + 1"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$count"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ======================================================================== -->
+
+<xsl:template match="node()|@*" mode="hyphenate.verbatim">
+ <xsl:copy>
+ <xsl:copy-of select="@*"/>
+ <xsl:apply-templates mode="hyphenate.verbatim"/>
+ </xsl:copy>
+</xsl:template>
+
+<xsl:template match="text()" mode="hyphenate.verbatim" priority="2">
+ <xsl:call-template name="hyphenate.verbatim.block">
+ <xsl:with-param name="content" select="."/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template name="hyphenate.verbatim.block">
+ <xsl:param name="content" select="''"/>
+ <xsl:param name="count" select="1"/>
+
+ <!-- recurse on lines first to keep recursion depth reasonable -->
+ <xsl:choose>
+ <xsl:when test="contains($content, '&#xA;')">
+ <xsl:variable name="line" select="substring-before($content, '&#xA;')"/>
+ <xsl:variable name="rest" select="substring-after($content, '&#xA;')"/>
+ <xsl:call-template name="hyphenate.verbatim">
+ <xsl:with-param name="content" select="concat($line, '&#xA;')"/>
+ </xsl:call-template>
+ <xsl:call-template name="hyphenate.verbatim.block">
+ <xsl:with-param name="content" select="$rest"/>
+ <xsl:with-param name="count" select="$count + 1"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="hyphenate.verbatim">
+ <xsl:with-param name="content" select="$content"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+
+</xsl:template>
+
+<xsl:template name="hyphenate.verbatim">
+ <xsl:param name="content"/>
+ <xsl:variable name="head" select="substring($content, 1, 1)"/>
+ <xsl:variable name="tail" select="substring($content, 2)"/>
+ <xsl:choose>
+ <!-- Place soft-hyphen after space or non-breakable space. -->
+ <xsl:when test="$head = ' ' or $head = '&#160;'">
+ <xsl:text>&#160;</xsl:text>
+ <xsl:text>&#x00AD;</xsl:text>
+ </xsl:when>
+ <xsl:when test="$hyphenate.verbatim.characters != '' and
+ translate($head, $hyphenate.verbatim.characters, '') = '' and not($tail = '')">
+ <xsl:value-of select="$head"/>
+ <xsl:text>&#x00AD;</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$head"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:if test="$tail">
+ <xsl:call-template name="hyphenate.verbatim">
+ <xsl:with-param name="content" select="$tail"/>
+ </xsl:call-template>
+ </xsl:if>
+</xsl:template>
+
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/xep.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/xep.xsl
new file mode 100644
index 0000000..14ce59f
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/xep.xsl
@@ -0,0 +1,180 @@
+<?xml version='1.0'?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:fo="http://www.w3.org/1999/XSL/Format"
+ xmlns:rx="http://www.renderx.com/XSL/Extensions"
+ version='1.0'>
+
+<!-- ********************************************************************
+ $Id: xep.xsl 7531 2007-10-17 18:06:49Z dcramer $
+ ********************************************************************
+ (c) Stephane Bline Peregrine Systems 2001
+ Implementation of xep extensions:
+ * Pdf bookmarks (based on the XEP 2.5 implementation)
+ * Document information (XEP 2.5 meta information extensions)
+ ******************************************************************** -->
+
+<!-- FIXME: Norm, I changed things so that the top-level element (book or set)
+ does not appear in the TOC. Is this the right thing? -->
+
+<xsl:template name="xep-document-information">
+ <rx:meta-info>
+ <xsl:variable name="authors"
+ select="(//author|//editor|//corpauthor|//authorgroup)[1]"/>
+ <xsl:if test="$authors">
+ <xsl:variable name="author">
+ <xsl:choose>
+ <xsl:when test="$authors[self::authorgroup]">
+ <xsl:call-template name="person.name.list">
+ <xsl:with-param name="person.list"
+ select="$authors/*[self::author|self::corpauthor|
+ self::othercredit|self::editor]"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="$authors[self::corpauthor]">
+ <xsl:value-of select="$authors"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="person.name">
+ <xsl:with-param name="node" select="$authors"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:element name="rx:meta-field">
+ <xsl:attribute name="name">author</xsl:attribute>
+ <xsl:attribute name="value">
+ <xsl:value-of select="normalize-space($author)"/>
+ </xsl:attribute>
+ </xsl:element>
+ </xsl:if>
+
+ <xsl:variable name="title">
+ <xsl:apply-templates select="/*[1]" mode="label.markup"/>
+ <xsl:apply-templates select="/*[1]" mode="title.markup"/>
+ </xsl:variable>
+
+ <xsl:element name="rx:meta-field">
+ <xsl:attribute name="name">creator</xsl:attribute>
+ <xsl:attribute name="value">
+ <xsl:text>DocBook </xsl:text>
+ <xsl:value-of select="$DistroTitle"/>
+ <xsl:text> V</xsl:text>
+ <xsl:value-of select="$VERSION"/>
+ </xsl:attribute>
+ </xsl:element>
+
+ <xsl:element name="rx:meta-field">
+ <xsl:attribute name="name">title</xsl:attribute>
+ <xsl:attribute name="value">
+ <xsl:value-of select="normalize-space($title)"/>
+ </xsl:attribute>
+ </xsl:element>
+
+ <xsl:if test="//keyword">
+ <xsl:element name="rx:meta-field">
+ <xsl:attribute name="name">keywords</xsl:attribute>
+ <xsl:attribute name="value">
+ <xsl:for-each select="//keyword">
+ <xsl:value-of select="normalize-space(.)"/>
+ <xsl:if test="position() != last()">
+ <xsl:text>, </xsl:text>
+ </xsl:if>
+ </xsl:for-each>
+ </xsl:attribute>
+ </xsl:element>
+ </xsl:if>
+
+ <xsl:if test="//subjectterm">
+ <xsl:element name="rx:meta-field">
+ <xsl:attribute name="name">subject</xsl:attribute>
+ <xsl:attribute name="value">
+ <xsl:for-each select="//subjectterm">
+ <xsl:value-of select="normalize-space(.)"/>
+ <xsl:if test="position() != last()">
+ <xsl:text>, </xsl:text>
+ </xsl:if>
+ </xsl:for-each>
+ </xsl:attribute>
+ </xsl:element>
+ </xsl:if>
+ </rx:meta-info>
+</xsl:template>
+
+<!-- ********************************************************************
+ Pdf bookmarks
+ ******************************************************************** -->
+
+<xsl:template match="*" mode="xep.outline">
+ <xsl:apply-templates select="*" mode="xep.outline"/>
+</xsl:template>
+
+<xsl:template match="set|book|part|reference|preface|chapter|appendix|article
+ |glossary|bibliography|index|setindex
+ |refentry|refsynopsisdiv
+ |refsect1|refsect2|refsect3|refsection
+ |sect1|sect2|sect3|sect4|sect5|section"
+ mode="xep.outline">
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+ <xsl:variable name="bookmark-label">
+ <xsl:apply-templates select="." mode="object.title.markup"/>
+ </xsl:variable>
+
+ <!-- Put the root element bookmark at the same level as its children -->
+ <!-- If the object is a set or book, generate a bookmark for the toc -->
+ <xsl:choose>
+ <xsl:when test="self::index and $generate.index = 0"/>
+ <xsl:when test="parent::*">
+ <rx:bookmark internal-destination="{$id}">
+ <rx:bookmark-label>
+ <xsl:value-of select="normalize-space($bookmark-label)"/>
+ </rx:bookmark-label>
+ <xsl:apply-templates select="*" mode="xep.outline"/>
+ </rx:bookmark>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:if test="$bookmark-label != ''">
+ <rx:bookmark internal-destination="{$id}">
+ <rx:bookmark-label>
+ <xsl:value-of select="normalize-space($bookmark-label)"/>
+ </rx:bookmark-label>
+ </rx:bookmark>
+ </xsl:if>
+
+ <xsl:variable name="toc.params">
+ <xsl:call-template name="find.path.params">
+ <xsl:with-param name="table" select="normalize-space($generate.toc)"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:if test="contains($toc.params, 'toc')
+ and set|book|part|reference|section|sect1|refentry
+ |article|bibliography|glossary|chapter
+ |appendix">
+ <rx:bookmark internal-destination="toc...{$id}">
+ <rx:bookmark-label>
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'TableofContents'"/>
+ </xsl:call-template>
+ </rx:bookmark-label>
+ </rx:bookmark>
+ </xsl:if>
+ <xsl:apply-templates select="*" mode="xep.outline"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="xep-pis">
+ <xsl:if test="$crop.marks != 0">
+ <xsl:processing-instruction name="xep-pdf-crop-mark-width"><xsl:value-of select="$crop.mark.width"/></xsl:processing-instruction>
+ <xsl:processing-instruction name="xep-pdf-crop-offset"><xsl:value-of select="$crop.mark.offset"/></xsl:processing-instruction>
+ <xsl:processing-instruction name="xep-pdf-bleed"><xsl:value-of select="$crop.mark.bleed"/></xsl:processing-instruction>
+ </xsl:if>
+
+ <xsl:call-template name="user-xep-pis"/>
+</xsl:template>
+
+<!-- Placeholder for user defined PIs -->
+<xsl:template name="user-xep-pis"/>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/xref.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/xref.xsl
new file mode 100644
index 0000000..771d39b
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/fo/xref.xsl
@@ -0,0 +1,1538 @@
+<?xml version='1.0'?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:fo="http://www.w3.org/1999/XSL/Format"
+ xmlns:exsl="http://exslt.org/common"
+ xmlns:xlink='http://www.w3.org/1999/xlink'
+ exclude-result-prefixes="exsl xlink"
+ version='1.0'>
+
+<!-- ********************************************************************
+ $Id: xref.xsl 8913 2010-10-01 04:44:57Z bobstayton $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<!-- Use internal variable for olink xlink role for consistency -->
+<xsl:variable
+ name="xolink.role">http://docbook.org/xlink/role/olink</xsl:variable>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="anchor">
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+ <fo:inline id="{$id}"/>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="xref" name="xref">
+ <xsl:param name="xhref" select="@xlink:href"/>
+ <!-- is the @xlink:href a local idref link? -->
+ <xsl:param name="xlink.idref">
+ <xsl:if test="starts-with($xhref,'#')
+ and (not(contains($xhref,'&#40;'))
+ or starts-with($xhref, '#xpointer&#40;id&#40;'))">
+ <xsl:call-template name="xpointer.idref">
+ <xsl:with-param name="xpointer" select="$xhref"/>
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:param>
+ <xsl:param name="xlink.targets" select="key('id',$xlink.idref)"/>
+ <xsl:param name="linkend.targets" select="key('id',@linkend)"/>
+ <xsl:param name="target" select="($xlink.targets | $linkend.targets)[1]"/>
+ <xsl:param name="refelem" select="local-name($target)"/>
+
+ <xsl:variable name="xrefstyle">
+ <xsl:choose>
+ <xsl:when test="@role and not(@xrefstyle)
+ and $use.role.as.xrefstyle != 0">
+ <xsl:value-of select="@role"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="@xrefstyle"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="content">
+ <fo:inline xsl:use-attribute-sets="xref.properties">
+ <xsl:choose>
+ <xsl:when test="@endterm">
+ <xsl:variable name="etargets" select="key('id',@endterm)"/>
+ <xsl:variable name="etarget" select="$etargets[1]"/>
+ <xsl:choose>
+ <xsl:when test="count($etarget) = 0">
+ <xsl:message>
+ <xsl:value-of select="count($etargets)"/>
+ <xsl:text>Endterm points to nonexistent ID: </xsl:text>
+ <xsl:value-of select="@endterm"/>
+ </xsl:message>
+ <xsl:text>???</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="$etarget" mode="endterm"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+
+ <xsl:when test="$target/@xreflabel">
+ <xsl:call-template name="xref.xreflabel">
+ <xsl:with-param name="target" select="$target"/>
+ </xsl:call-template>
+ </xsl:when>
+
+ <xsl:when test="$target">
+ <xsl:if test="not(parent::citation)">
+ <xsl:apply-templates select="$target" mode="xref-to-prefix"/>
+ </xsl:if>
+
+ <xsl:apply-templates select="$target" mode="xref-to">
+ <xsl:with-param name="referrer" select="."/>
+ <xsl:with-param name="xrefstyle" select="$xrefstyle"/>
+ </xsl:apply-templates>
+
+ <xsl:if test="not(parent::citation)">
+ <xsl:apply-templates select="$target" mode="xref-to-suffix"/>
+ </xsl:if>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:message>
+ <xsl:text>ERROR: xref linking to </xsl:text>
+ <xsl:value-of select="@linkend|@xlink:href"/>
+ <xsl:text> has no generated link text.</xsl:text>
+ </xsl:message>
+ <xsl:text>???</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ </fo:inline>
+ </xsl:variable>
+
+ <!-- Convert it into an active link -->
+ <xsl:call-template name="simple.xlink">
+ <xsl:with-param name="content" select="$content"/>
+ </xsl:call-template>
+
+ <!-- Add standard page reference? -->
+ <xsl:choose>
+ <xsl:when test="not($target)">
+ <!-- page numbers only for local targets -->
+ </xsl:when>
+ <xsl:when test="starts-with(normalize-space($xrefstyle), 'select:')
+ and contains($xrefstyle, 'nopage')">
+ <!-- negative xrefstyle in instance turns it off -->
+ </xsl:when>
+ <!-- positive xrefstyle already handles it -->
+ <xsl:when test="not(starts-with(normalize-space($xrefstyle), 'select:')
+ and (contains($xrefstyle, 'page')
+ or contains($xrefstyle, 'Page')))
+ and ( $insert.xref.page.number = 'yes'
+ or $insert.xref.page.number = '1')
+ or (local-name($target) = 'para' and
+ $xrefstyle = '')">
+ <xsl:apply-templates select="$target" mode="page.citation">
+ <xsl:with-param name="id" select="$target/@id|$target/@xml:id"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<!-- Handled largely like an xref -->
+<!-- To be done: add support for begin, end, and units attributes -->
+<xsl:template match="biblioref" name="biblioref">
+ <xsl:variable name="targets" select="key('id',@linkend)"/>
+ <xsl:variable name="target" select="$targets[1]"/>
+ <xsl:variable name="refelem" select="local-name($target)"/>
+
+ <xsl:call-template name="check.id.unique">
+ <xsl:with-param name="linkend" select="@linkend"/>
+ </xsl:call-template>
+
+ <xsl:choose>
+ <xsl:when test="$refelem=''">
+ <xsl:message>
+ <xsl:text>XRef to nonexistent id: </xsl:text>
+ <xsl:value-of select="@linkend"/>
+ </xsl:message>
+ <xsl:text>???</xsl:text>
+ </xsl:when>
+
+ <xsl:when test="@endterm">
+ <fo:basic-link internal-destination="{@linkend}"
+ xsl:use-attribute-sets="xref.properties">
+ <xsl:variable name="etargets" select="key('id',@endterm)"/>
+ <xsl:variable name="etarget" select="$etargets[1]"/>
+ <xsl:choose>
+ <xsl:when test="count($etarget) = 0">
+ <xsl:message>
+ <xsl:value-of select="count($etargets)"/>
+ <xsl:text>Endterm points to nonexistent ID: </xsl:text>
+ <xsl:value-of select="@endterm"/>
+ </xsl:message>
+ <xsl:text>???</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="$etarget" mode="endterm"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </fo:basic-link>
+ </xsl:when>
+
+ <xsl:when test="$target/@xreflabel">
+ <fo:basic-link internal-destination="{@linkend}"
+ xsl:use-attribute-sets="xref.properties">
+ <xsl:call-template name="xref.xreflabel">
+ <xsl:with-param name="target" select="$target"/>
+ </xsl:call-template>
+ </fo:basic-link>
+ </xsl:when>
+
+ <xsl:otherwise>
+ <xsl:if test="not(parent::citation)">
+ <xsl:apply-templates select="$target" mode="xref-to-prefix"/>
+ </xsl:if>
+
+ <fo:basic-link internal-destination="{@linkend}"
+ xsl:use-attribute-sets="xref.properties">
+ <xsl:apply-templates select="$target" mode="xref-to">
+ <xsl:with-param name="referrer" select="."/>
+ <xsl:with-param name="xrefstyle">
+ <xsl:choose>
+ <xsl:when test="@role and not(@xrefstyle) and $use.role.as.xrefstyle != 0">
+ <xsl:value-of select="@role"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="@xrefstyle"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:with-param>
+ </xsl:apply-templates>
+ </fo:basic-link>
+
+ <xsl:if test="not(parent::citation)">
+ <xsl:apply-templates select="$target" mode="xref-to-suffix"/>
+ </xsl:if>
+ </xsl:otherwise>
+ </xsl:choose>
+
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="*" mode="endterm">
+ <!-- Process the children of the endterm element -->
+ <xsl:variable name="endterm">
+ <xsl:apply-templates select="child::node()"/>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="$exsl.node.set.available != 0">
+ <xsl:apply-templates select="exsl:node-set($endterm)" mode="remove-ids"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:copy-of select="$endterm"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="*" mode="remove-ids">
+ <xsl:copy>
+ <xsl:for-each select="@*">
+ <xsl:choose>
+ <xsl:when test="name(.) != 'id'">
+ <xsl:copy/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:message>removing <xsl:value-of select="name(.)"/></xsl:message>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:for-each>
+ <xsl:apply-templates mode="remove-ids"/>
+ </xsl:copy>
+</xsl:template>
+
+<!--- ==================================================================== -->
+
+<xsl:template match="*" mode="xref-to-prefix"/>
+<xsl:template match="*" mode="xref-to-suffix"/>
+
+<xsl:template match="*" mode="xref-to">
+ <xsl:param name="referrer"/>
+ <xsl:param name="xrefstyle"/>
+ <xsl:param name="verbose" select="1"/>
+
+
+ <xsl:if test="$verbose != 0">
+ <xsl:message>
+ <xsl:text>Don't know what gentext to create for xref to: "</xsl:text>
+ <xsl:value-of select="name(.)"/>
+ <xsl:text>"</xsl:text>
+ </xsl:message>
+ <xsl:text>???</xsl:text>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="title" mode="xref-to">
+ <xsl:param name="referrer"/>
+ <xsl:param name="xrefstyle"/>
+ <xsl:param name="verbose" select="1"/>
+
+ <!-- if you xref to a title, xref to the parent... -->
+ <xsl:choose>
+ <!-- FIXME: how reliable is this? -->
+ <xsl:when test="contains(local-name(parent::*), 'info')">
+ <xsl:apply-templates select="parent::*[2]" mode="xref-to">
+ <xsl:with-param name="referrer" select="$referrer"/>
+ <xsl:with-param name="xrefstyle" select="$xrefstyle"/>
+ <xsl:with-param name="verbose" select="$verbose"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="parent::*" mode="xref-to">
+ <xsl:with-param name="referrer" select="$referrer"/>
+ <xsl:with-param name="xrefstyle" select="$xrefstyle"/>
+ <xsl:with-param name="verbose" select="$verbose"/>
+ </xsl:apply-templates>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="abstract|article|authorblurb|bibliodiv|bibliomset
+ |biblioset|blockquote|calloutlist|caution|colophon
+ |constraintdef|formalpara|glossdiv|important|indexdiv
+ |itemizedlist|legalnotice|lot|msg|msgexplan|msgmain
+ |msgrel|msgset|msgsub|note|orderedlist|partintro
+ |productionset|qandadiv|refsynopsisdiv|segmentedlist
+ |set|setindex|sidebar|tip|toc|variablelist|warning"
+ mode="xref-to">
+ <xsl:param name="referrer"/>
+ <xsl:param name="xrefstyle"/>
+ <xsl:param name="verbose" select="1"/>
+
+ <!-- catch-all for things with (possibly optional) titles -->
+ <xsl:apply-templates select="." mode="object.xref.markup">
+ <xsl:with-param name="purpose" select="'xref'"/>
+ <xsl:with-param name="xrefstyle" select="$xrefstyle"/>
+ <xsl:with-param name="referrer" select="$referrer"/>
+ <xsl:with-param name="verbose" select="$verbose"/>
+ </xsl:apply-templates>
+</xsl:template>
+
+<xsl:template match="author|editor|othercredit|personname" mode="xref-to">
+ <xsl:param name="referrer"/>
+ <xsl:param name="xrefstyle"/>
+ <xsl:param name="verbose" select="1"/>
+
+ <xsl:call-template name="person.name"/>
+</xsl:template>
+
+<xsl:template match="authorgroup" mode="xref-to">
+ <xsl:param name="referrer"/>
+ <xsl:param name="xrefstyle"/>
+ <xsl:param name="verbose" select="1"/>
+
+ <xsl:call-template name="person.name.list"/>
+</xsl:template>
+
+<xsl:template match="figure|example|table|equation" mode="xref-to">
+ <xsl:param name="referrer"/>
+ <xsl:param name="xrefstyle"/>
+ <xsl:param name="verbose" select="1"/>
+
+ <xsl:apply-templates select="." mode="object.xref.markup">
+ <xsl:with-param name="purpose" select="'xref'"/>
+ <xsl:with-param name="xrefstyle" select="$xrefstyle"/>
+ <xsl:with-param name="referrer" select="$referrer"/>
+ <xsl:with-param name="verbose" select="$verbose"/>
+ </xsl:apply-templates>
+</xsl:template>
+
+<xsl:template match="procedure" mode="xref-to">
+ <xsl:param name="referrer"/>
+ <xsl:param name="xrefstyle"/>
+ <xsl:param name="verbose"/>
+
+ <xsl:apply-templates select="." mode="object.xref.markup">
+ <xsl:with-param name="purpose" select="'xref'"/>
+ <xsl:with-param name="xrefstyle" select="$xrefstyle"/>
+ <xsl:with-param name="referrer" select="$referrer"/>
+ <xsl:with-param name="verbose" select="$verbose"/>
+ </xsl:apply-templates>
+</xsl:template>
+
+<xsl:template match="task" mode="xref-to">
+ <xsl:param name="referrer"/>
+ <xsl:param name="xrefstyle"/>
+ <xsl:param name="verbose"/>
+
+ <xsl:apply-templates select="." mode="object.xref.markup">
+ <xsl:with-param name="purpose" select="'xref'"/>
+ <xsl:with-param name="xrefstyle" select="$xrefstyle"/>
+ <xsl:with-param name="referrer" select="$referrer"/>
+ <xsl:with-param name="verbose" select="$verbose"/>
+ </xsl:apply-templates>
+</xsl:template>
+
+<xsl:template match="cmdsynopsis" mode="xref-to">
+ <xsl:param name="referrer"/>
+ <xsl:param name="xrefstyle"/>
+ <xsl:param name="verbose" select="1"/>
+
+ <xsl:apply-templates select="(.//command)[1]" mode="xref"/>
+</xsl:template>
+
+<xsl:template match="funcsynopsis" mode="xref-to">
+ <xsl:param name="referrer"/>
+ <xsl:param name="xrefstyle"/>
+ <xsl:param name="verbose" select="1"/>
+
+ <xsl:apply-templates select="(.//function)[1]" mode="xref"/>
+</xsl:template>
+
+<xsl:template match="dedication|acknowledgements|preface|chapter|appendix" mode="xref-to">
+ <xsl:param name="referrer"/>
+ <xsl:param name="xrefstyle"/>
+ <xsl:param name="verbose" select="1"/>
+
+ <xsl:apply-templates select="." mode="object.xref.markup">
+ <xsl:with-param name="purpose" select="'xref'"/>
+ <xsl:with-param name="xrefstyle" select="$xrefstyle"/>
+ <xsl:with-param name="referrer" select="$referrer"/>
+ <xsl:with-param name="verbose" select="$verbose"/>
+ </xsl:apply-templates>
+</xsl:template>
+
+<xsl:template match="bibliography" mode="xref-to">
+ <xsl:param name="referrer"/>
+ <xsl:param name="xrefstyle"/>
+ <xsl:param name="verbose" select="1"/>
+
+ <xsl:apply-templates select="." mode="object.xref.markup">
+ <xsl:with-param name="purpose" select="'xref'"/>
+ <xsl:with-param name="xrefstyle" select="$xrefstyle"/>
+ <xsl:with-param name="referrer" select="$referrer"/>
+ <xsl:with-param name="verbose" select="$verbose"/>
+ </xsl:apply-templates>
+</xsl:template>
+
+<xsl:template match="biblioentry|bibliomixed" mode="xref-to-prefix">
+ <xsl:text>[</xsl:text>
+</xsl:template>
+
+<xsl:template match="biblioentry|bibliomixed" mode="xref-to-suffix">
+ <xsl:text>]</xsl:text>
+</xsl:template>
+
+<xsl:template match="biblioentry|bibliomixed" mode="xref-to">
+ <xsl:param name="referrer"/>
+ <xsl:param name="xrefstyle"/>
+ <xsl:param name="verbose" select="1"/>
+
+ <!-- handles both biblioentry and bibliomixed -->
+ <xsl:choose>
+ <xsl:when test="string(.) = ''">
+ <xsl:variable name="bib" select="document($bibliography.collection,.)"/>
+ <xsl:variable name="id" select="(@id|@xml:id)[1]"/>
+ <xsl:variable name="entry" select="$bib/bibliography/
+ *[@id=$id or @xml:id=$id][1]"/>
+ <xsl:choose>
+ <xsl:when test="$entry">
+ <xsl:choose>
+ <xsl:when test="$bibliography.numbered != 0">
+ <xsl:number from="bibliography" count="biblioentry|bibliomixed"
+ level="any" format="1"/>
+ </xsl:when>
+ <xsl:when test="local-name($entry/*[1]) = 'abbrev'">
+ <xsl:apply-templates select="$entry/*[1]"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="(@id|@xml:id)[1]"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:message>
+ <xsl:text>No bibliography entry: </xsl:text>
+ <xsl:value-of select="$id"/>
+ <xsl:text> found in </xsl:text>
+ <xsl:value-of select="$bibliography.collection"/>
+ </xsl:message>
+ <xsl:value-of select="(@id|@xml:id)[1]"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:choose>
+ <xsl:when test="$bibliography.numbered != 0">
+ <xsl:number from="bibliography" count="biblioentry|bibliomixed"
+ level="any" format="1"/>
+ </xsl:when>
+ <xsl:when test="local-name(*[1]) = 'abbrev'">
+ <xsl:apply-templates select="*[1]"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="(@id|@xml:id)[1]"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="glossary" mode="xref-to">
+ <xsl:param name="referrer"/>
+ <xsl:param name="xrefstyle"/>
+ <xsl:param name="verbose" select="1"/>
+
+ <xsl:apply-templates select="." mode="object.xref.markup">
+ <xsl:with-param name="purpose" select="'xref'"/>
+ <xsl:with-param name="xrefstyle" select="$xrefstyle"/>
+ <xsl:with-param name="referrer" select="$referrer"/>
+ <xsl:with-param name="verbose" select="$verbose"/>
+ </xsl:apply-templates>
+</xsl:template>
+
+<xsl:template match="glossentry" mode="xref-to">
+ <xsl:choose>
+ <xsl:when test="$glossentry.show.acronym = 'primary'">
+ <xsl:choose>
+ <xsl:when test="acronym|abbrev">
+ <xsl:apply-templates select="(acronym|abbrev)[1]"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="glossterm[1]" mode="xref-to"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="glossterm[1]" mode="xref-to"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="glossterm|firstterm" mode="xref-to">
+ <xsl:apply-templates/>
+</xsl:template>
+
+<xsl:template match="index" mode="xref-to">
+ <xsl:param name="referrer"/>
+ <xsl:param name="xrefstyle"/>
+ <xsl:param name="verbose" select="1"/>
+
+ <xsl:apply-templates select="." mode="object.xref.markup">
+ <xsl:with-param name="purpose" select="'xref'"/>
+ <xsl:with-param name="xrefstyle" select="$xrefstyle"/>
+ <xsl:with-param name="referrer" select="$referrer"/>
+ <xsl:with-param name="verbose" select="$verbose"/>
+ </xsl:apply-templates>
+</xsl:template>
+
+<xsl:template match="listitem" mode="xref-to">
+ <xsl:param name="referrer"/>
+ <xsl:param name="xrefstyle"/>
+ <xsl:param name="verbose" select="1"/>
+
+ <xsl:apply-templates select="." mode="object.xref.markup">
+ <xsl:with-param name="purpose" select="'xref'"/>
+ <xsl:with-param name="xrefstyle" select="$xrefstyle"/>
+ <xsl:with-param name="referrer" select="$referrer"/>
+ <xsl:with-param name="verbose" select="$verbose"/>
+ </xsl:apply-templates>
+</xsl:template>
+
+<xsl:template match="section|simplesect
+ |sect1|sect2|sect3|sect4|sect5
+ |refsect1|refsect2|refsect3|refsection" mode="xref-to">
+ <xsl:param name="referrer"/>
+ <xsl:param name="xrefstyle"/>
+ <xsl:param name="verbose" select="1"/>
+
+ <xsl:apply-templates select="." mode="object.xref.markup">
+ <xsl:with-param name="purpose" select="'xref'"/>
+ <xsl:with-param name="xrefstyle" select="$xrefstyle"/>
+ <xsl:with-param name="referrer" select="$referrer"/>
+ <xsl:with-param name="verbose" select="$verbose"/>
+ </xsl:apply-templates>
+ <!-- What about "in Chapter X"? -->
+</xsl:template>
+
+<xsl:template match="bridgehead" mode="xref-to">
+ <xsl:param name="referrer"/>
+ <xsl:param name="xrefstyle"/>
+ <xsl:param name="verbose" select="1"/>
+
+ <xsl:apply-templates select="." mode="object.xref.markup">
+ <xsl:with-param name="purpose" select="'xref'"/>
+ <xsl:with-param name="xrefstyle" select="$xrefstyle"/>
+ <xsl:with-param name="referrer" select="$referrer"/>
+ <xsl:with-param name="verbose" select="$verbose"/>
+ </xsl:apply-templates>
+ <!-- What about "in Chapter X"? -->
+</xsl:template>
+
+<xsl:template match="qandaset" mode="xref-to">
+ <xsl:param name="referrer"/>
+ <xsl:param name="xrefstyle"/>
+ <xsl:param name="verbose" select="1"/>
+
+ <xsl:apply-templates select="." mode="object.xref.markup">
+ <xsl:with-param name="purpose" select="'xref'"/>
+ <xsl:with-param name="xrefstyle" select="$xrefstyle"/>
+ <xsl:with-param name="referrer" select="$referrer"/>
+ <xsl:with-param name="verbose" select="$verbose"/>
+ </xsl:apply-templates>
+</xsl:template>
+
+<xsl:template match="qandadiv" mode="xref-to">
+ <xsl:param name="referrer"/>
+ <xsl:param name="xrefstyle"/>
+ <xsl:param name="verbose" select="1"/>
+
+ <xsl:apply-templates select="." mode="object.xref.markup">
+ <xsl:with-param name="purpose" select="'xref'"/>
+ <xsl:with-param name="xrefstyle" select="$xrefstyle"/>
+ <xsl:with-param name="referrer" select="$referrer"/>
+ <xsl:with-param name="verbose" select="$verbose"/>
+ </xsl:apply-templates>
+</xsl:template>
+
+<xsl:template match="qandaentry" mode="xref-to">
+ <xsl:param name="referrer"/>
+ <xsl:param name="xrefstyle"/>
+ <xsl:param name="verbose" select="1"/>
+
+ <xsl:apply-templates select="question[1]" mode="xref-to">
+ <xsl:with-param name="xrefstyle" select="$xrefstyle"/>
+ <xsl:with-param name="referrer" select="$referrer"/>
+ <xsl:with-param name="verbose" select="$verbose"/>
+ </xsl:apply-templates>
+</xsl:template>
+
+<xsl:template match="question|answer" mode="xref-to">
+ <xsl:param name="referrer"/>
+ <xsl:param name="xrefstyle"/>
+ <xsl:param name="verbose" select="1"/>
+
+ <xsl:choose>
+ <xsl:when test="string-length(label) != 0">
+ <xsl:apply-templates select="." mode="label.markup"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="." mode="object.xref.markup">
+ <xsl:with-param name="purpose" select="'xref'"/>
+ <xsl:with-param name="xrefstyle" select="$xrefstyle"/>
+ <xsl:with-param name="referrer" select="$referrer"/>
+ <xsl:with-param name="verbose" select="$verbose"/>
+ </xsl:apply-templates>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="part|reference" mode="xref-to">
+ <xsl:param name="referrer"/>
+ <xsl:param name="xrefstyle"/>
+ <xsl:param name="verbose" select="1"/>
+
+ <xsl:apply-templates select="." mode="object.xref.markup">
+ <xsl:with-param name="purpose" select="'xref'"/>
+ <xsl:with-param name="xrefstyle" select="$xrefstyle"/>
+ <xsl:with-param name="referrer" select="$referrer"/>
+ <xsl:with-param name="verbose" select="$verbose"/>
+ </xsl:apply-templates>
+</xsl:template>
+
+<xsl:template match="refentry" mode="xref-to">
+ <xsl:param name="referrer"/>
+ <xsl:param name="xrefstyle"/>
+ <xsl:param name="verbose" select="1"/>
+
+ <xsl:choose>
+ <xsl:when test="refmeta/refentrytitle">
+ <xsl:apply-templates select="refmeta/refentrytitle"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="refnamediv/refname[1]"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:apply-templates select="refmeta/manvolnum"/>
+</xsl:template>
+
+<xsl:template match="refnamediv" mode="xref-to">
+ <xsl:param name="referrer"/>
+ <xsl:param name="xrefstyle"/>
+ <xsl:param name="verbose" select="1"/>
+
+ <xsl:apply-templates select="refname[1]" mode="xref-to">
+ <xsl:with-param name="xrefstyle" select="$xrefstyle"/>
+ <xsl:with-param name="referrer" select="$referrer"/>
+ <xsl:with-param name="verbose" select="$verbose"/>
+ </xsl:apply-templates>
+</xsl:template>
+
+<xsl:template match="refname" mode="xref-to">
+ <xsl:param name="referrer"/>
+ <xsl:param name="xrefstyle"/>
+ <xsl:param name="verbose" select="1"/>
+
+ <xsl:apply-templates mode="xref-to">
+ <xsl:with-param name="xrefstyle" select="$xrefstyle"/>
+ <xsl:with-param name="referrer" select="$referrer"/>
+ <xsl:with-param name="verbose" select="$verbose"/>
+ </xsl:apply-templates>
+</xsl:template>
+
+<xsl:template match="step" mode="xref-to">
+ <xsl:param name="referrer"/>
+ <xsl:param name="xrefstyle"/>
+ <xsl:param name="verbose" select="1"/>
+
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'Step'"/>
+ </xsl:call-template>
+ <xsl:text> </xsl:text>
+ <xsl:apply-templates select="." mode="number"/>
+</xsl:template>
+
+<xsl:template match="varlistentry" mode="xref-to">
+ <xsl:param name="referrer"/>
+ <xsl:param name="xrefstyle"/>
+ <xsl:param name="verbose" select="1"/>
+
+ <xsl:apply-templates select="term[1]" mode="xref-to">
+ <xsl:with-param name="xrefstyle" select="$xrefstyle"/>
+ <xsl:with-param name="referrer" select="$referrer"/>
+ <xsl:with-param name="verbose" select="$verbose"/>
+ </xsl:apply-templates>
+</xsl:template>
+
+<xsl:template match="varlistentry/term" mode="xref-to">
+ <xsl:param name="verbose" select="1"/>
+ <!-- to avoid the comma that will be generated if there are several terms -->
+ <xsl:apply-templates/>
+</xsl:template>
+
+<xsl:template match="co" mode="xref-to">
+ <xsl:param name="referrer"/>
+ <xsl:param name="xrefstyle"/>
+ <xsl:param name="verbose" select="1"/>
+
+ <xsl:apply-templates select="." mode="callout-bug"/>
+</xsl:template>
+
+<xsl:template match="area|areaset" mode="xref-to">
+ <xsl:param name="referrer"/>
+ <xsl:param name="xrefstyle"/>
+
+ <xsl:call-template name="callout-bug">
+ <xsl:with-param name="conum">
+ <xsl:apply-templates select="." mode="conumber"/>
+ </xsl:with-param>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="book" mode="xref-to">
+ <xsl:param name="referrer"/>
+ <xsl:param name="xrefstyle"/>
+ <xsl:param name="verbose" select="1"/>
+
+ <xsl:apply-templates select="." mode="object.xref.markup">
+ <xsl:with-param name="purpose" select="'xref'"/>
+ <xsl:with-param name="xrefstyle" select="$xrefstyle"/>
+ <xsl:with-param name="referrer" select="$referrer"/>
+ <xsl:with-param name="verbose" select="$verbose"/>
+ </xsl:apply-templates>
+</xsl:template>
+
+<!-- These are elements for which no link text exists, so an xref to one
+ uses the xrefstyle attribute if specified, or if not it falls back
+ to the container element's link text -->
+<xsl:template match="para|phrase|simpara|anchor|quote" mode="xref-to">
+ <xsl:param name="referrer"/>
+ <xsl:param name="xrefstyle"/>
+ <xsl:param name="verbose"/>
+
+ <xsl:variable name="context" select="(ancestor::simplesect
+ |ancestor::section
+ |ancestor::sect1
+ |ancestor::sect2
+ |ancestor::sect3
+ |ancestor::sect4
+ |ancestor::sect5
+ |ancestor::refsection
+ |ancestor::refsect1
+ |ancestor::refsect2
+ |ancestor::refsect3
+ |ancestor::chapter
+ |ancestor::appendix
+ |ancestor::preface
+ |ancestor::partintro
+ |ancestor::dedication
+ |ancestor::acknowledgements
+ |ancestor::colophon
+ |ancestor::bibliography
+ |ancestor::index
+ |ancestor::glossary
+ |ancestor::glossentry
+ |ancestor::listitem
+ |ancestor::varlistentry)[last()]"/>
+
+ <xsl:choose>
+ <xsl:when test="$xrefstyle != ''">
+ <xsl:apply-templates select="." mode="object.xref.markup">
+ <xsl:with-param name="xrefstyle" select="$xrefstyle"/>
+ <xsl:with-param name="referrer" select="$referrer"/>
+ <xsl:with-param name="verbose" select="$verbose"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:if test="$verbose != 0">
+ <xsl:message>
+ <xsl:text>WARNING: xref to &lt;</xsl:text>
+ <xsl:value-of select="local-name()"/>
+ <xsl:text> id="</xsl:text>
+ <xsl:value-of select="@id|@xml:id"/>
+ <xsl:text>"&gt; has no generated text. Trying its ancestor elements.</xsl:text>
+ </xsl:message>
+ </xsl:if>
+ <xsl:apply-templates select="$context" mode="xref-to">
+ <xsl:with-param name="xrefstyle" select="$xrefstyle"/>
+ <xsl:with-param name="referrer" select="$referrer"/>
+ <xsl:with-param name="verbose" select="$verbose"/>
+ </xsl:apply-templates>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="indexterm" mode="xref-to">
+ <xsl:value-of select="primary"/>
+</xsl:template>
+
+<xsl:template match="primary|secondary|tertiary" mode="xref-to">
+ <xsl:value-of select="."/>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="link" name="link">
+ <xsl:param name="linkend" select="@linkend"/>
+ <xsl:param name="targets" select="key('id',$linkend)"/>
+ <xsl:param name="target" select="$targets[1]"/>
+
+ <xsl:variable name="xrefstyle">
+ <xsl:choose>
+ <xsl:when test="@role and not(@xrefstyle)
+ and $use.role.as.xrefstyle != 0">
+ <xsl:value-of select="@role"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="@xrefstyle"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="content">
+ <fo:inline xsl:use-attribute-sets="xref.properties">
+ <xsl:choose>
+ <xsl:when test="count(child::node()) &gt; 0">
+ <!-- If it has content, use it -->
+ <xsl:apply-templates/>
+ </xsl:when>
+ <!-- look for an endterm -->
+ <xsl:when test="@endterm">
+ <xsl:variable name="etargets" select="key('id',@endterm)"/>
+ <xsl:variable name="etarget" select="$etargets[1]"/>
+ <xsl:choose>
+ <xsl:when test="count($etarget) = 0">
+ <xsl:message>
+ <xsl:value-of select="count($etargets)"/>
+ <xsl:text>Endterm points to nonexistent ID: </xsl:text>
+ <xsl:value-of select="@endterm"/>
+ </xsl:message>
+ <xsl:text>???</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="$etarget" mode="endterm"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <!-- Use the xlink:href if no other text -->
+ <xsl:when test="@xlink:href">
+ <xsl:call-template name="hyphenate-url">
+ <xsl:with-param name="url" select="@xlink:href"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:message>
+ <xsl:text>Link element has no content and no Endterm. </xsl:text>
+ <xsl:text>Nothing to show in the link to </xsl:text>
+ <xsl:value-of select="$target"/>
+ </xsl:message>
+ <xsl:text>???</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ </fo:inline>
+ </xsl:variable>
+
+ <xsl:call-template name="simple.xlink">
+ <xsl:with-param name="node" select="."/>
+ <xsl:with-param name="linkend" select="$linkend"/>
+ <xsl:with-param name="content" select="$content"/>
+ </xsl:call-template>
+
+ <!-- Add standard page reference? -->
+ <xsl:choose>
+ <!-- page numbering on link only enabled for @linkend -->
+ <!-- There is no link element in DB5 with xlink:href -->
+ <xsl:when test="not($linkend)">
+ </xsl:when>
+ <!-- negative xrefstyle in instance turns it off -->
+ <xsl:when test="starts-with(normalize-space($xrefstyle), 'select:')
+ and contains($xrefstyle, 'nopage')">
+ </xsl:when>
+ <xsl:when test="(starts-with(normalize-space($xrefstyle), 'select:')
+ and $insert.link.page.number = 'maybe'
+ and (contains($xrefstyle, 'page')
+ or contains($xrefstyle, 'Page')))
+ or ( $insert.link.page.number = 'yes'
+ or $insert.link.page.number = '1')
+ or local-name($target) = 'para'">
+ <xsl:apply-templates select="$target" mode="page.citation">
+ <xsl:with-param name="id" select="$linkend"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="ulink" name="ulink">
+ <xsl:param name="url" select="@url"/>
+
+ <xsl:variable name ="ulink.url">
+ <xsl:call-template name="fo-external-image">
+ <xsl:with-param name="filename" select="$url"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <fo:basic-link xsl:use-attribute-sets="xref.properties"
+ external-destination="{$ulink.url}">
+ <xsl:choose>
+ <xsl:when test="count(child::node())=0 or (string(.) = $url)">
+ <xsl:call-template name="hyphenate-url">
+ <xsl:with-param name="url" select="$url"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </fo:basic-link>
+ <!-- * Call the template for determining whether the URL for this -->
+ <!-- * hyperlink is displayed, and how to display it (either inline or -->
+ <!-- * as a numbered footnote). -->
+ <xsl:call-template name="hyperlink.url.display">
+ <xsl:with-param name="url" select="$url"/>
+ <xsl:with-param name="ulink.url" select="$ulink.url"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template name="hyperlink.url.display">
+ <!-- * This template is called for all external hyperlinks (ulinks and -->
+ <!-- * for all simple xlinks); it determines whether the URL for the -->
+ <!-- * hyperlink is displayed, and how to display it (either inline or -->
+ <!-- * as a numbered footnote). -->
+ <xsl:param name="url"/>
+ <xsl:param name="ulink.url">
+ <!-- * ulink.url is just the value of the URL wrapped in 'url(...)' -->
+ <xsl:call-template name="fo-external-image">
+ <xsl:with-param name="filename" select="$url"/>
+ </xsl:call-template>
+ </xsl:param>
+
+ <xsl:if test="count(child::node()) != 0
+ and string(.) != $url
+ and $ulink.show != 0">
+ <!-- * Display the URL for this hyperlink only if it is non-empty, -->
+ <!-- * and the value of its content is not a URL that is the same as -->
+ <!-- * URL it links to, and if ulink.show is non-zero. -->
+ <xsl:choose>
+ <xsl:when test="$ulink.footnotes != 0 and not(ancestor::footnote)">
+ <!-- * ulink.show and ulink.footnote are both non-zero; that -->
+ <!-- * means we display the URL as a footnote (instead of inline) -->
+ <fo:footnote>
+ <xsl:call-template name="ulink.footnote.number"/>
+ <fo:footnote-body xsl:use-attribute-sets="footnote.properties">
+ <fo:block>
+ <xsl:call-template name="ulink.footnote.number"/>
+ <xsl:text> </xsl:text>
+ <fo:basic-link external-destination="{$ulink.url}">
+ <xsl:value-of select="$url"/>
+ </fo:basic-link>
+ </fo:block>
+ </fo:footnote-body>
+ </fo:footnote>
+ </xsl:when>
+ <xsl:otherwise>
+ <!-- * ulink.show is non-zero, but ulink.footnote is not; that -->
+ <!-- * means we display the URL inline -->
+ <fo:inline hyphenate="false">
+ <!-- * put square brackets around the URL -->
+ <xsl:text> [</xsl:text>
+ <fo:basic-link external-destination="{$ulink.url}">
+ <xsl:call-template name="hyphenate-url">
+ <xsl:with-param name="url" select="$url"/>
+ </xsl:call-template>
+ </fo:basic-link>
+ <xsl:text>]</xsl:text>
+ </fo:inline>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:if>
+
+</xsl:template>
+
+<xsl:template name="ulink.footnote.number">
+ <fo:inline xsl:use-attribute-sets="footnote.mark.properties">
+ <xsl:choose>
+ <xsl:when test="$fop.extensions != 0">
+ <xsl:attribute name="vertical-align">super</xsl:attribute>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:attribute name="baseline-shift">super</xsl:attribute>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:variable name="fnum">
+ <!-- * Determine the footnote number to display for this hyperlink, -->
+ <!-- * by counting all foonotes, ulinks, and any elements that have -->
+ <!-- * an xlink:href attribute that meets the following criteria: -->
+ <!-- * -->
+ <!-- * - the content of the element is not a URI that is the same -->
+ <!-- * URI as the value of the href attribute -->
+ <!-- * - the href attribute is not an internal ID reference (does -->
+ <!-- * not start with a hash sign) -->
+ <!-- * - the href is not part of an olink reference (the element -->
+ <!-- * - does not have an xlink:role attribute that indicates it is -->
+ <!-- * an olink, and the href does not contain a hash sign) -->
+ <!-- * - the element either has no xlink:type attribute or has -->
+ <!-- * an xlink:type attribute whose value is 'simple' -->
+ <!-- FIXME: list in @from is probably not complete -->
+ <xsl:number level="any"
+ from="chapter|appendix|preface|article|refentry|bibliography[not(parent::article)]"
+ count="footnote[not(@label)][not(ancestor::tgroup)]
+ |ulink[node()][@url != .][not(ancestor::footnote)]
+ |*[node()][@xlink:href][not(@xlink:href = .)][not(starts-with(@xlink:href,'#'))]
+ [not(contains(@xlink:href,'#') and @xlink:role = $xolink.role)]
+ [not(@xlink:type) or @xlink:type='simple']
+ [not(ancestor::footnote)]"
+ format="1"/>
+ </xsl:variable>
+ <xsl:choose>
+ <xsl:when test="string-length($footnote.number.symbols) &gt;= $fnum">
+ <xsl:value-of select="substring($footnote.number.symbols, $fnum, 1)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:number value="$fnum" format="{$footnote.number.format}"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </fo:inline>
+</xsl:template>
+
+<xsl:template name="hyphenate-url">
+ <xsl:param name="url" select="''"/>
+ <xsl:choose>
+ <xsl:when test="$ulink.hyphenate = ''">
+ <xsl:value-of select="$url"/>
+ </xsl:when>
+ <xsl:when test="string-length($url) &gt; 1">
+ <xsl:variable name="char" select="substring($url, 1, 1)"/>
+ <xsl:value-of select="$char"/>
+ <xsl:if test="contains($ulink.hyphenate.chars, $char)">
+ <!-- Do not hyphen in-between // -->
+ <xsl:if test="not($char = '/' and substring($url,2,1) = '/')">
+ <xsl:copy-of select="$ulink.hyphenate"/>
+ </xsl:if>
+ </xsl:if>
+ <!-- recurse to the next character -->
+ <xsl:call-template name="hyphenate-url">
+ <xsl:with-param name="url" select="substring($url, 2)"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$url"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="olink" name="olink">
+ <!-- olink content may be passed in from xlink olink -->
+ <xsl:param name="content" select="NOTANELEMENT"/>
+
+ <xsl:variable name="localinfo" select="@localinfo"/>
+
+ <xsl:choose>
+ <!-- olinks resolved by stylesheet and target database -->
+ <xsl:when test="@targetdoc or @targetptr or
+ (@xlink:role=$xolink.role and
+ contains(@xlink:href, '#') )" >
+
+ <xsl:variable name="targetdoc.att">
+ <xsl:choose>
+ <xsl:when test="@targetdoc != ''">
+ <xsl:value-of select="@targetdoc"/>
+ </xsl:when>
+ <xsl:when test="@xlink:role=$xolink.role and
+ contains(@xlink:href, '#')" >
+ <xsl:value-of select="substring-before(@xlink:href, '#')"/>
+ </xsl:when>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="targetptr.att">
+ <xsl:choose>
+ <xsl:when test="@targetptr != ''">
+ <xsl:value-of select="@targetptr"/>
+ </xsl:when>
+ <xsl:when test="@xlink:role=$xolink.role and
+ contains(@xlink:href, '#')" >
+ <xsl:value-of select="substring-after(@xlink:href, '#')"/>
+ </xsl:when>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="olink.lang">
+ <xsl:call-template name="l10n.language">
+ <xsl:with-param name="xref-context" select="true()"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="target.database.filename">
+ <xsl:call-template name="select.target.database">
+ <xsl:with-param name="targetdoc.att" select="$targetdoc.att"/>
+ <xsl:with-param name="targetptr.att" select="$targetptr.att"/>
+ <xsl:with-param name="olink.lang" select="$olink.lang"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="target.database"
+ select="document($target.database.filename, /)"/>
+
+ <xsl:if test="$olink.debug != 0">
+ <xsl:message>
+ <xsl:text>Olink debug: root element of target.database is '</xsl:text>
+ <xsl:value-of select="local-name($target.database/*[1])"/>
+ <xsl:text>'.</xsl:text>
+ </xsl:message>
+ </xsl:if>
+
+ <xsl:variable name="olink.key">
+ <xsl:call-template name="select.olink.key">
+ <xsl:with-param name="targetdoc.att" select="$targetdoc.att"/>
+ <xsl:with-param name="targetptr.att" select="$targetptr.att"/>
+ <xsl:with-param name="olink.lang" select="$olink.lang"/>
+ <xsl:with-param name="target.database" select="$target.database"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:if test="string-length($olink.key) = 0">
+ <xsl:message>
+ <xsl:text>Error: unresolved olink: </xsl:text>
+ <xsl:text>targetdoc/targetptr = '</xsl:text>
+ <xsl:value-of select="$targetdoc.att"/>
+ <xsl:text>/</xsl:text>
+ <xsl:value-of select="$targetptr.att"/>
+ <xsl:text>'.</xsl:text>
+ </xsl:message>
+ </xsl:if>
+
+ <xsl:variable name="href">
+ <xsl:call-template name="make.olink.href">
+ <xsl:with-param name="olink.key" select="$olink.key"/>
+ <xsl:with-param name="target.database" select="$target.database"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <!-- Olink that points to internal id can be a link -->
+ <xsl:variable name="linkend">
+ <xsl:call-template name="olink.as.linkend">
+ <xsl:with-param name="olink.key" select="$olink.key"/>
+ <xsl:with-param name="olink.lang" select="$olink.lang"/>
+ <xsl:with-param name="target.database" select="$target.database"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="hottext">
+ <xsl:choose>
+ <xsl:when test="string-length($content) != 0">
+ <xsl:copy-of select="$content"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="olink.hottext">
+ <xsl:with-param name="olink.key" select="$olink.key"/>
+ <xsl:with-param name="olink.lang" select="$olink.lang"/>
+ <xsl:with-param name="target.database" select="$target.database"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="olink.docname.citation">
+ <xsl:call-template name="olink.document.citation">
+ <xsl:with-param name="olink.key" select="$olink.key"/>
+ <xsl:with-param name="target.database" select="$target.database"/>
+ <xsl:with-param name="olink.lang" select="$olink.lang"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="olink.page.citation">
+ <xsl:call-template name="olink.page.citation">
+ <xsl:with-param name="olink.key" select="$olink.key"/>
+ <xsl:with-param name="target.database" select="$target.database"/>
+ <xsl:with-param name="olink.lang" select="$olink.lang"/>
+ <xsl:with-param name="linkend" select="$linkend"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="$linkend != ''">
+ <fo:basic-link internal-destination="{$linkend}"
+ xsl:use-attribute-sets="xref.properties">
+ <xsl:call-template name="anchor"/>
+ <xsl:copy-of select="$hottext"/>
+ <xsl:copy-of select="$olink.page.citation"/>
+ </fo:basic-link>
+ </xsl:when>
+ <xsl:when test="$href != ''">
+ <xsl:choose>
+ <xsl:when test="$fop1.extensions != 0">
+ <xsl:variable name="mybeg" select="substring-before($href,'#')"/>
+ <xsl:variable name="myend" select="substring-after($href,'#')"/>
+ <fo:basic-link external-destination="url({concat($mybeg,'#dest=',$myend)})"
+ xsl:use-attribute-sets="olink.properties">
+ <xsl:copy-of select="$hottext"/>
+ </fo:basic-link>
+ <xsl:copy-of select="$olink.page.citation"/>
+ <xsl:copy-of select="$olink.docname.citation"/>
+ </xsl:when>
+ <xsl:when test="$xep.extensions != 0">
+ <fo:basic-link external-destination="url({$href})"
+ xsl:use-attribute-sets="olink.properties">
+ <xsl:call-template name="anchor"/>
+ <xsl:copy-of select="$hottext"/>
+ </fo:basic-link>
+ <xsl:copy-of select="$olink.page.citation"/>
+ <xsl:copy-of select="$olink.docname.citation"/>
+ </xsl:when>
+ <xsl:when test="$axf.extensions != 0">
+ <fo:basic-link external-destination="{$href}"
+ xsl:use-attribute-sets="olink.properties">
+ <xsl:copy-of select="$hottext"/>
+ </fo:basic-link>
+ <xsl:copy-of select="$olink.page.citation"/>
+ <xsl:copy-of select="$olink.docname.citation"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <fo:basic-link external-destination="{$href}"
+ xsl:use-attribute-sets="olink.properties">
+ <xsl:copy-of select="$hottext"/>
+ </fo:basic-link>
+ <xsl:copy-of select="$olink.page.citation"/>
+ <xsl:copy-of select="$olink.docname.citation"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:copy-of select="$hottext"/>
+ <xsl:copy-of select="$olink.page.citation"/>
+ <xsl:copy-of select="$olink.docname.citation"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+
+ <!-- olink never implemented in FO for old olink entity syntax -->
+ <xsl:otherwise>
+ <xsl:apply-templates/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="*" mode="insert.olink.docname.markup">
+ <xsl:param name="docname" select="''"/>
+
+ <fo:inline font-style="italic">
+ <xsl:value-of select="$docname"/>
+ </fo:inline>
+
+</xsl:template>
+
+<!-- This prevents error message when processing olinks with xrefstyle -->
+<xsl:template match="olink" mode="object.xref.template"/>
+
+
+<xsl:template name="olink.as.linkend">
+ <xsl:param name="olink.key" select="''"/>
+ <xsl:param name="olink.lang" select="''"/>
+ <xsl:param name="target.database" select="NotANode"/>
+
+ <xsl:variable name="targetdoc">
+ <xsl:value-of select="substring-before($olink.key, '/')"/>
+ </xsl:variable>
+
+ <xsl:variable name="targetptr">
+ <xsl:value-of
+ select="substring-before(substring-after($olink.key, '/'), '/')"/>
+ </xsl:variable>
+
+ <xsl:variable name="target.lang">
+ <xsl:variable name="candidate">
+ <xsl:for-each select="$target.database" >
+ <xsl:value-of
+ select="key('targetptr-key', $olink.key)[1]/@lang" />
+ </xsl:for-each>
+ </xsl:variable>
+ <xsl:choose>
+ <xsl:when test="$candidate != ''">
+ <xsl:value-of select="$candidate"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$olink.lang"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:if test="$current.docid = $targetdoc and
+ $olink.lang = $target.lang">
+ <xsl:variable name="targets" select="key('id',$targetptr)"/>
+ <xsl:variable name="target" select="$targets[1]"/>
+ <xsl:if test="$target">
+ <xsl:value-of select="$targetptr"/>
+ </xsl:if>
+ </xsl:if>
+
+</xsl:template>
+
+
+<xsl:template name="olink.outline">
+ <xsl:param name="outline.base.uri"/>
+ <xsl:param name="localinfo"/>
+ <xsl:param name="return" select="href"/>
+
+ <xsl:message terminate="yes">Fatal error: olink.outline template: what is this supposed to do?</xsl:message>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template name="title.xref">
+ <xsl:param name="target" select="."/>
+ <xsl:choose>
+ <xsl:when test="local-name($target) = 'figure'
+ or local-name($target) = 'example'
+ or local-name($target) = 'equation'
+ or local-name($target) = 'table'
+ or local-name($target) = 'dedication'
+ or local-name($target) = 'acknowledgements'
+ or local-name($target) = 'preface'
+ or local-name($target) = 'bibliography'
+ or local-name($target) = 'glossary'
+ or local-name($target) = 'index'
+ or local-name($target) = 'setindex'
+ or local-name($target) = 'colophon'">
+ <xsl:call-template name="gentext.startquote"/>
+ <xsl:apply-templates select="$target" mode="title.markup"/>
+ <xsl:call-template name="gentext.endquote"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <fo:inline font-style="italic">
+ <xsl:apply-templates select="$target" mode="title.markup"/>
+ </fo:inline>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="number.xref">
+ <xsl:param name="target" select="."/>
+ <xsl:apply-templates select="$target" mode="label.markup"/>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template name="xref.xreflabel">
+ <!-- called to process an xreflabel...you might use this to make -->
+ <!-- xreflabels come out in the right font for different targets, -->
+ <!-- for example. -->
+ <xsl:param name="target" select="."/>
+ <xsl:value-of select="$target/@xreflabel"/>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="title" mode="xref">
+ <xsl:apply-templates/>
+</xsl:template>
+
+<xsl:template match="command" mode="xref">
+ <xsl:call-template name="inline.boldseq"/>
+</xsl:template>
+
+<xsl:template match="function" mode="xref">
+ <xsl:call-template name="inline.monoseq"/>
+</xsl:template>
+
+<xsl:template match="*" mode="page.citation">
+ <xsl:param name="id" select="'???'"/>
+
+ <fo:basic-link internal-destination="{$id}"
+ xsl:use-attribute-sets="xref.properties">
+ <fo:inline keep-together.within-line="always">
+ <xsl:call-template name="substitute-markup">
+ <xsl:with-param name="template">
+ <xsl:call-template name="gentext.template">
+ <xsl:with-param name="name" select="'page.citation'"/>
+ <xsl:with-param name="context" select="'xref'"/>
+ </xsl:call-template>
+ </xsl:with-param>
+ </xsl:call-template>
+ </fo:inline>
+ </fo:basic-link>
+</xsl:template>
+
+<xsl:template match="*" mode="pagenumber.markup">
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+ <fo:page-number-citation ref-id="{$id}"/>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="*" mode="insert.title.markup">
+ <xsl:param name="purpose"/>
+ <xsl:param name="xrefstyle"/>
+ <xsl:param name="title"/>
+
+ <xsl:choose>
+ <!-- FIXME: what about the case where titleabbrev is inside the info? -->
+ <xsl:when test="$purpose = 'xref' and titleabbrev">
+ <xsl:apply-templates select="." mode="titleabbrev.markup"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:copy-of select="$title"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="chapter|appendix" mode="insert.title.markup">
+ <xsl:param name="purpose"/>
+ <xsl:param name="xrefstyle"/>
+ <xsl:param name="title"/>
+
+ <xsl:choose>
+ <xsl:when test="$purpose = 'xref'">
+ <fo:inline font-style="italic">
+ <xsl:copy-of select="$title"/>
+ </fo:inline>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:copy-of select="$title"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="*" mode="insert.subtitle.markup">
+ <xsl:param name="purpose"/>
+ <xsl:param name="xrefstyle"/>
+ <xsl:param name="subtitle"/>
+
+ <xsl:copy-of select="$subtitle"/>
+</xsl:template>
+
+<xsl:template match="*" mode="insert.label.markup">
+ <xsl:param name="purpose"/>
+ <xsl:param name="xrefstyle"/>
+ <xsl:param name="label"/>
+
+ <xsl:copy-of select="$label"/>
+</xsl:template>
+
+<xsl:template match="*" mode="insert.pagenumber.markup">
+ <xsl:param name="purpose"/>
+ <xsl:param name="xrefstyle"/>
+ <xsl:param name="pagenumber"/>
+
+ <xsl:copy-of select="$pagenumber"/>
+</xsl:template>
+
+<xsl:template match="*" mode="insert.direction.markup">
+ <xsl:param name="purpose"/>
+ <xsl:param name="xrefstyle"/>
+ <xsl:param name="direction"/>
+
+ <xsl:copy-of select="$direction"/>
+</xsl:template>
+
+<xsl:template match="olink" mode="pagenumber.markup">
+ <!-- Local olinks can use page-citation -->
+ <xsl:variable name="targetdoc.att" select="@targetdoc"/>
+ <xsl:variable name="targetptr.att" select="@targetptr"/>
+
+ <xsl:variable name="olink.lang">
+ <xsl:call-template name="l10n.language">
+ <xsl:with-param name="xref-context" select="true()"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="target.database.filename">
+ <xsl:call-template name="select.target.database">
+ <xsl:with-param name="targetdoc.att" select="$targetdoc.att"/>
+ <xsl:with-param name="targetptr.att" select="$targetptr.att"/>
+ <xsl:with-param name="olink.lang" select="$olink.lang"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="target.database"
+ select="document($target.database.filename, /)"/>
+
+ <xsl:if test="$olink.debug != 0">
+ <xsl:message>
+ <xsl:text>Olink debug: root element of target.database is '</xsl:text>
+ <xsl:value-of select="local-name($target.database/*[1])"/>
+ <xsl:text>'.</xsl:text>
+ </xsl:message>
+ </xsl:if>
+
+ <xsl:variable name="olink.key">
+ <xsl:call-template name="select.olink.key">
+ <xsl:with-param name="targetdoc.att" select="$targetdoc.att"/>
+ <xsl:with-param name="targetptr.att" select="$targetptr.att"/>
+ <xsl:with-param name="olink.lang" select="$olink.lang"/>
+ <xsl:with-param name="target.database" select="$target.database"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <!-- Olink that points to internal id can be a link -->
+ <xsl:variable name="linkend">
+ <xsl:call-template name="olink.as.linkend">
+ <xsl:with-param name="olink.key" select="$olink.key"/>
+ <xsl:with-param name="olink.lang" select="$olink.lang"/>
+ <xsl:with-param name="target.database" select="$target.database"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="$linkend != ''">
+ <fo:page-number-citation ref-id="{$linkend}"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:message>
+ <xsl:text>Olink error: no page number linkend for local olink '</xsl:text>
+ <xsl:value-of select="$olink.key"/>
+ <xsl:text>'</xsl:text>
+ </xsl:message>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/highlighting/README b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/highlighting/README
new file mode 100644
index 0000000..0b31d32
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/highlighting/README
@@ -0,0 +1,16 @@
+To use the syntax higlighting extension with DocBook-XSL 1.74.3+, you must:
+1. Use a processor that works with the extension: Saxon 6 or Xalan-J.
+2. Add the latest version of xslthl-2.X.X.jar to your classpath.
+3. Set the highlight.source parameter to 1.
+4. Import into your customization one of the following stylesheet module:
+ * html/highlight.xsl
+ * xhtml/highlight.xsl
+ * xhtml-1_1/highlight.xsl
+ * fo/highlight.xsl
+5. Use that customiztion layer.
+
+
+Note: Saxon 8.5 or later is also supported, but since it is an XSLT 2.0
+processor it is not guaranteed to work with DocBook-XSL in all
+circumstances.
+
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/highlighting/c-hl.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/highlighting/c-hl.xml
new file mode 100644
index 0000000..1503dd1
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/highlighting/c-hl.xml
@@ -0,0 +1,101 @@
+<?xml version="1.0" encoding="UTF-8"?>
+ <!--
+ Syntax highlighting definition for C xslthl - XSLT Syntax Highlighting http://sourceforge.net/projects/xslthl/
+ Copyright (C) 2005-2008 Michal Molhanec, Jirka Kosek, Michiel Hendriks This software is provided 'as-is', without any
+ express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this
+ software. Permission is granted to anyone to use this software for any purpose, including commercial applications, and
+ to alter it and redistribute it freely, subject to the following restrictions: 1. The origin of this software must not
+ be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an
+ acknowledgment in the product documentation would be appreciated but is not required. 2. Altered source versions must
+ be plainly marked as such, and must not be misrepresented as being the original software. 3. This notice may not be
+ removed or altered from any source distribution. Michal Molhanec <mol1111 at users.sourceforge.net> Jirka Kosek <kosek
+ at users.sourceforge.net> Michiel Hendriks <elmuerte at users.sourceforge.net>
+ -->
+<highlighters>
+ <highlighter type="multiline-comment">
+ <start>/**</start>
+ <end>*/</end>
+ <style>doccomment</style>
+ </highlighter>
+ <highlighter type="oneline-comment">
+ <start>///</start>
+ <style>doccomment</style>
+ </highlighter>
+ <highlighter type="multiline-comment">
+ <start>/*</start>
+ <end>*/</end>
+ </highlighter>
+ <highlighter type="oneline-comment">//</highlighter>
+ <highlighter type="oneline-comment">
+ <!-- use the online-comment highlighter to detect directives -->
+ <start>#</start>
+ <lineBreakEscape>\</lineBreakEscape>
+ <style>directive</style>
+ </highlighter>
+ <highlighter type="string">
+ <string>"</string>
+ <escape>\</escape>
+ </highlighter>
+ <highlighter type="string">
+ <string>'</string>
+ <escape>\</escape>
+ </highlighter>
+ <highlighter type="hexnumber">
+ <prefix>0x</prefix>
+ <suffix>ul</suffix>
+ <suffix>lu</suffix>
+ <suffix>u</suffix>
+ <suffix>l</suffix>
+ <ignoreCase />
+ </highlighter>
+ <highlighter type="number">
+ <point>.</point>
+ <pointStarts />
+ <exponent>e</exponent>
+ <suffix>ul</suffix>
+ <suffix>lu</suffix>
+ <suffix>u</suffix>
+ <suffix>f</suffix>
+ <suffix>l</suffix>
+ <ignoreCase />
+ </highlighter>
+ <highlighter type="keywords">
+ <keyword>auto</keyword>
+ <keyword>_Bool</keyword>
+ <keyword>break</keyword>
+ <keyword>case</keyword>
+ <keyword>char</keyword>
+ <keyword>_Complex</keyword>
+ <keyword>const</keyword>
+ <keyword>continue</keyword>
+ <keyword>default</keyword>
+ <keyword>do</keyword>
+ <keyword>double</keyword>
+ <keyword>else</keyword>
+ <keyword>enum</keyword>
+ <keyword>extern</keyword>
+ <keyword>float</keyword>
+ <keyword>for</keyword>
+ <keyword>goto</keyword>
+ <keyword>if</keyword>
+ <keyword>_Imaginary</keyword>
+ <keyword>inline</keyword>
+ <keyword>int</keyword>
+ <keyword>long</keyword>
+ <keyword>register</keyword>
+ <keyword>restrict</keyword>
+ <keyword>return</keyword>
+ <keyword>short</keyword>
+ <keyword>signed</keyword>
+ <keyword>sizeof</keyword>
+ <keyword>static</keyword>
+ <keyword>struct</keyword>
+ <keyword>switch</keyword>
+ <keyword>typedef</keyword>
+ <keyword>union</keyword>
+ <keyword>unsigned</keyword>
+ <keyword>void</keyword>
+ <keyword>volatile</keyword>
+ <keyword>while</keyword>
+ </highlighter>
+</highlighters> \ No newline at end of file
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/highlighting/common.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/highlighting/common.xsl
new file mode 100644
index 0000000..e9b5650
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/highlighting/common.xsl
@@ -0,0 +1,120 @@
+<?xml version='1.0'?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+
+ xmlns:s6hl="http://net.sf.xslthl/ConnectorSaxon6"
+ xmlns:sbhl="http://net.sf.xslthl/ConnectorSaxonB"
+ xmlns:xhl="http://net.sf.xslthl/ConnectorXalan"
+ xmlns:saxon6="http://icl.com/saxon"
+ xmlns:saxonb="http://saxon.sf.net/"
+ xmlns:xalan="http://xml.apache.org/xalan"
+
+ xmlns:exsl="http://exslt.org/common"
+ xmlns:xslthl="http://xslthl.sf.net"
+ exclude-result-prefixes="exsl xslthl s6hl sbhl xhl"
+ version='1.0'>
+
+<!-- ********************************************************************
+ $Id: common.xsl 8257 2009-02-20 04:40:16Z abdelazer $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ and other information.
+
+ ******************************************************************** -->
+
+<!-- this construction is needed to have the saxon and xalan connectors working alongside each other -->
+<xalan:component prefix="xhl" functions="highlight">
+ <xalan:script lang="javaclass" src="xalan://net.sf.xslthl.ConnectorXalan" />
+</xalan:component>
+
+<!-- for saxon 6 -->
+<saxon6:script implements-prefix="s6hl" language="java" src="java:net.sf.xslthl.ConnectorSaxon6" />
+
+<!-- for saxon 8.5 and later -->
+<saxonb:script implements-prefix="sbhl" language="java" src="java:net.sf.xslthl.ConnectorSaxonB" />
+
+
+<!-- You can override this template to do more complex mapping of
+ language attribute to highlighter language ID (see xslthl-config.xml) -->
+<xsl:template name="language.to.xslthl">
+ <xsl:param name="context"/>
+
+ <xsl:choose>
+ <xsl:when test="$context/@language != ''">
+ <xsl:value-of select="$context/@language"/>
+ </xsl:when>
+ <xsl:when test="$highlight.default.language != ''">
+ <xsl:value-of select="$highlight.default.language"/>
+ </xsl:when>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="apply-highlighting">
+ <xsl:choose>
+ <!-- Do we want syntax highlighting -->
+ <xsl:when test="$highlight.source != 0">
+ <xsl:variable name="language">
+ <xsl:call-template name="language.to.xslthl">
+ <xsl:with-param name="context" select="."/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:choose>
+ <xsl:when test="$language != ''">
+ <xsl:variable name="content">
+ <xsl:apply-templates/>
+ </xsl:variable>
+ <xsl:choose>
+ <xsl:when test="function-available('s6hl:highlight')">
+ <xsl:apply-templates select="s6hl:highlight($language, exsl:node-set($content), $highlight.xslthl.config)"
+ mode="xslthl"/>
+ </xsl:when>
+ <xsl:when test="function-available('sbhl:highlight')">
+ <xsl:apply-templates select="sbhl:highlight($language, exsl:node-set($content), $highlight.xslthl.config)"
+ mode="xslthl"/>
+ </xsl:when>
+ <xsl:when test="function-available('xhl:highlight')">
+ <xsl:apply-templates select="xhl:highlight($language, exsl:node-set($content), $highlight.xslthl.config)"
+ mode="xslthl"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:copy-of select="$content"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <!-- No syntax highlighting -->
+ <xsl:otherwise>
+ <xsl:apply-templates/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- A fallback when the specific style isn't recognized -->
+<xsl:template match="xslthl:*" mode="xslthl">
+ <xsl:message>
+ <xsl:text>unprocessed xslthl style: </xsl:text>
+ <xsl:value-of select="local-name(.)" />
+ </xsl:message>
+ <xsl:apply-templates mode="xslthl"/>
+</xsl:template>
+
+<!-- Copy over already produced markup (FO/HTML) -->
+<xsl:template match="node()" mode="xslthl" priority="-1">
+ <xsl:copy>
+ <xsl:apply-templates select="node()" mode="xslthl"/>
+ </xsl:copy>
+</xsl:template>
+
+<xsl:template match="*" mode="xslthl">
+ <xsl:copy>
+ <xsl:copy-of select="@*"/>
+ <xsl:apply-templates select="node()" mode="xslthl"/>
+ </xsl:copy>
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/highlighting/cpp-hl.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/highlighting/cpp-hl.xml
new file mode 100644
index 0000000..db57d5e
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/highlighting/cpp-hl.xml
@@ -0,0 +1,150 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+Syntax highlighting definition for C++
+
+xslthl - XSLT Syntax Highlighting
+http://sourceforge.net/projects/xslthl/
+Copyright (C) 2005-2008 Michal Molhanec, Jirka Kosek, Michiel Hendriks
+
+This software is provided 'as-is', without any express or implied
+warranty. In no event will the authors be held liable for any damages
+arising from the use of this software.
+
+Permission is granted to anyone to use this software for any purpose,
+including commercial applications, and to alter it and redistribute it
+freely, subject to the following restrictions:
+
+1. The origin of this software must not be misrepresented; you must not
+ claim that you wrote the original software. If you use this software
+ in a product, an acknowledgment in the product documentation would be
+ appreciated but is not required.
+2. Altered source versions must be plainly marked as such, and must not be
+ misrepresented as being the original software.
+3. This notice may not be removed or altered from any source distribution.
+
+Michal Molhanec <mol1111 at users.sourceforge.net>
+Jirka Kosek <kosek at users.sourceforge.net>
+Michiel Hendriks <elmuerte at users.sourceforge.net>
+
+-->
+<highlighters>
+ <highlighter type="multiline-comment">
+ <start>/**</start>
+ <end>*/</end>
+ <style>doccomment</style>
+ </highlighter>
+ <highlighter type="oneline-comment">
+ <start>///</start>
+ <style>doccomment</style>
+ </highlighter>
+ <highlighter type="multiline-comment">
+ <start>/*</start>
+ <end>*/</end>
+ </highlighter>
+ <highlighter type="oneline-comment">//</highlighter>
+ <highlighter type="oneline-comment">
+ <!-- use the online-comment highlighter to detect directives -->
+ <start>#</start>
+ <lineBreakEscape>\</lineBreakEscape>
+ <style>directive</style>
+ </highlighter>
+ <highlighter type="string">
+ <string>"</string>
+ <escape>\</escape>
+ </highlighter>
+ <highlighter type="string">
+ <string>'</string>
+ <escape>\</escape>
+ </highlighter>
+ <highlighter type="hexnumber">
+ <prefix>0x</prefix>
+ <suffix>ul</suffix>
+ <suffix>lu</suffix>
+ <suffix>u</suffix>
+ <suffix>l</suffix>
+ <ignoreCase />
+ </highlighter>
+ <highlighter type="number">
+ <point>.</point>
+ <pointStarts />
+ <exponent>e</exponent>
+ <suffix>ul</suffix>
+ <suffix>lu</suffix>
+ <suffix>u</suffix>
+ <suffix>f</suffix>
+ <suffix>l</suffix>
+ <ignoreCase />
+ </highlighter>
+ <highlighter type="keywords">
+ <!-- C keywords -->
+ <keyword>auto</keyword>
+ <keyword>_Bool</keyword>
+ <keyword>break</keyword>
+ <keyword>case</keyword>
+ <keyword>char</keyword>
+ <keyword>_Complex</keyword>
+ <keyword>const</keyword>
+ <keyword>continue</keyword>
+ <keyword>default</keyword>
+ <keyword>do</keyword>
+ <keyword>double</keyword>
+ <keyword>else</keyword>
+ <keyword>enum</keyword>
+ <keyword>extern</keyword>
+ <keyword>float</keyword>
+ <keyword>for</keyword>
+ <keyword>goto</keyword>
+ <keyword>if</keyword>
+ <keyword>_Imaginary</keyword>
+ <keyword>inline</keyword>
+ <keyword>int</keyword>
+ <keyword>long</keyword>
+ <keyword>register</keyword>
+ <keyword>restrict</keyword>
+ <keyword>return</keyword>
+ <keyword>short</keyword>
+ <keyword>signed</keyword>
+ <keyword>sizeof</keyword>
+ <keyword>static</keyword>
+ <keyword>struct</keyword>
+ <keyword>switch</keyword>
+ <keyword>typedef</keyword>
+ <keyword>union</keyword>
+ <keyword>unsigned</keyword>
+ <keyword>void</keyword>
+ <keyword>volatile</keyword>
+ <keyword>while</keyword>
+ <!-- C++ keywords -->
+ <keyword>asm</keyword>
+ <keyword>dynamic_cast</keyword>
+ <keyword>namespace</keyword>
+ <keyword>reinterpret_cast</keyword>
+ <keyword>try</keyword>
+ <keyword>bool</keyword>
+ <keyword>explicit</keyword>
+ <keyword>new</keyword>
+ <keyword>static_cast</keyword>
+ <keyword>typeid</keyword>
+ <keyword>catch</keyword>
+ <keyword>false</keyword>
+ <keyword>operator</keyword>
+ <keyword>template</keyword>
+ <keyword>typename</keyword>
+ <keyword>class</keyword>
+ <keyword>friend</keyword>
+ <keyword>private</keyword>
+ <keyword>this</keyword>
+ <keyword>using</keyword>
+ <keyword>const_cast</keyword>
+ <keyword>inline</keyword>
+ <keyword>public</keyword>
+ <keyword>throw</keyword>
+ <keyword>virtual</keyword>
+ <keyword>delete</keyword>
+ <keyword>mutable</keyword>
+ <keyword>protected</keyword>
+ <keyword>true</keyword>
+ <keyword>wchar_t</keyword>
+ </highlighter>
+</highlighters> \ No newline at end of file
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/highlighting/csharp-hl.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/highlighting/csharp-hl.xml
new file mode 100644
index 0000000..99c2e3e
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/highlighting/csharp-hl.xml
@@ -0,0 +1,187 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+Syntax highlighting definition for C#
+
+xslthl - XSLT Syntax Highlighting
+http://sourceforge.net/projects/xslthl/
+Copyright (C) 2005-2008 Michal Molhanec, Jirka Kosek, Michiel Hendriks
+
+This software is provided 'as-is', without any express or implied
+warranty. In no event will the authors be held liable for any damages
+arising from the use of this software.
+
+Permission is granted to anyone to use this software for any purpose,
+including commercial applications, and to alter it and redistribute it
+freely, subject to the following restrictions:
+
+1. The origin of this software must not be misrepresented; you must not
+ claim that you wrote the original software. If you use this software
+ in a product, an acknowledgment in the product documentation would be
+ appreciated but is not required.
+2. Altered source versions must be plainly marked as such, and must not be
+ misrepresented as being the original software.
+3. This notice may not be removed or altered from any source distribution.
+
+Michal Molhanec <mol1111 at users.sourceforge.net>
+Jirka Kosek <kosek at users.sourceforge.net>
+Michiel Hendriks <elmuerte at users.sourceforge.net>
+
+-->
+<highlighters>
+ <highlighter type="multiline-comment">
+ <start>/**</start>
+ <end>*/</end>
+ <style>doccomment</style>
+ </highlighter>
+ <highlighter type="oneline-comment">
+ <start>///</start>
+ <style>doccomment</style>
+ </highlighter>
+ <highlighter type="multiline-comment">
+ <start>/*</start>
+ <end>*/</end>
+ </highlighter>
+ <highlighter type="oneline-comment">//</highlighter>
+ <highlighter type="annotation">
+ <!-- annotations are called (custom) "attributes" in .NET -->
+ <start>[</start>
+ <end>]</end>
+ <valueStart>(</valueStart>
+ <valueEnd>)</valueEnd>
+ </highlighter>
+ <highlighter type="oneline-comment">
+ <!-- C# supports a couple of directives -->
+ <start>#</start>
+ <lineBreakEscape>\</lineBreakEscape>
+ <style>directive</style>
+ </highlighter>
+ <highlighter type="string">
+ <!-- strings starting with an "@" can span multiple lines -->
+ <string>@"</string>
+ <endString>"</endString>
+ <escape>\</escape>
+ <spanNewLines />
+ </highlighter>
+ <highlighter type="string">
+ <string>"</string>
+ <escape>\</escape>
+ </highlighter>
+ <highlighter type="string">
+ <string>'</string>
+ <escape>\</escape>
+ </highlighter>
+ <highlighter type="hexnumber">
+ <prefix>0x</prefix>
+ <suffix>ul</suffix>
+ <suffix>lu</suffix>
+ <suffix>u</suffix>
+ <suffix>l</suffix>
+ <ignoreCase />
+ </highlighter>
+ <highlighter type="number">
+ <point>.</point>
+ <pointStarts />
+ <exponent>e</exponent>
+ <suffix>ul</suffix>
+ <suffix>lu</suffix>
+ <suffix>u</suffix>
+ <suffix>f</suffix>
+ <suffix>d</suffix>
+ <suffix>m</suffix>
+ <suffix>l</suffix>
+ <ignoreCase />
+ </highlighter>
+ <highlighter type="keywords">
+ <keyword>abstract</keyword>
+ <keyword>as</keyword>
+ <keyword>base</keyword>
+ <keyword>bool</keyword>
+ <keyword>break</keyword>
+ <keyword>byte</keyword>
+ <keyword>case</keyword>
+ <keyword>catch</keyword>
+ <keyword>char</keyword>
+ <keyword>checked</keyword>
+ <keyword>class</keyword>
+ <keyword>const</keyword>
+ <keyword>continue</keyword>
+ <keyword>decimal</keyword>
+ <keyword>default</keyword>
+ <keyword>delegate</keyword>
+ <keyword>do</keyword>
+ <keyword>double</keyword>
+ <keyword>else</keyword>
+ <keyword>enum</keyword>
+ <keyword>event</keyword>
+ <keyword>explicit</keyword>
+ <keyword>extern</keyword>
+ <keyword>false</keyword>
+ <keyword>finally</keyword>
+ <keyword>fixed</keyword>
+ <keyword>float</keyword>
+ <keyword>for</keyword>
+ <keyword>foreach</keyword>
+ <keyword>goto</keyword>
+ <keyword>if</keyword>
+ <keyword>implicit</keyword>
+ <keyword>in</keyword>
+ <keyword>int</keyword>
+ <keyword>interface</keyword>
+ <keyword>internal</keyword>
+ <keyword>is</keyword>
+ <keyword>lock</keyword>
+ <keyword>long</keyword>
+ <keyword>namespace</keyword>
+ <keyword>new</keyword>
+ <keyword>null</keyword>
+ <keyword>object</keyword>
+ <keyword>operator</keyword>
+ <keyword>out</keyword>
+ <keyword>override</keyword>
+ <keyword>params</keyword>
+ <keyword>private</keyword>
+ <keyword>protected</keyword>
+ <keyword>public</keyword>
+ <keyword>readonly</keyword>
+ <keyword>ref</keyword>
+ <keyword>return</keyword>
+ <keyword>sbyte</keyword>
+ <keyword>sealed</keyword>
+ <keyword>short</keyword>
+ <keyword>sizeof</keyword>
+ <keyword>stackalloc</keyword>
+ <keyword>static</keyword>
+ <keyword>string</keyword>
+ <keyword>struct</keyword>
+ <keyword>switch</keyword>
+ <keyword>this</keyword>
+ <keyword>throw</keyword>
+ <keyword>true</keyword>
+ <keyword>try</keyword>
+ <keyword>typeof</keyword>
+ <keyword>uint</keyword>
+ <keyword>ulong</keyword>
+ <keyword>unchecked</keyword>
+ <keyword>unsafe</keyword>
+ <keyword>ushort</keyword>
+ <keyword>using</keyword>
+ <keyword>virtual</keyword>
+ <keyword>void</keyword>
+ <keyword>volatile</keyword>
+ <keyword>while</keyword>
+ </highlighter>
+ <highlighter type="keywords">
+ <!-- special words, not really keywords -->
+ <keyword>add</keyword>
+ <keyword>alias</keyword>
+ <keyword>get</keyword>
+ <keyword>global</keyword>
+ <keyword>partial</keyword>
+ <keyword>remove</keyword>
+ <keyword>set</keyword>
+ <keyword>value</keyword>
+ <keyword>where</keyword>
+ <keyword>yield</keyword>
+ </highlighter>
+</highlighters> \ No newline at end of file
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/highlighting/delphi-hl.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/highlighting/delphi-hl.xml
new file mode 100644
index 0000000..d5b4d1a
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/highlighting/delphi-hl.xml
@@ -0,0 +1,200 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+Syntax highlighting definition for Delphi (also suitable for Pascal)
+
+xslthl - XSLT Syntax Highlighting
+http://sourceforge.net/projects/xslthl/
+Copyright (C) 2005-2008 Michal Molhanec, Jirka Kosek, Michiel Hendriks
+
+This software is provided 'as-is', without any express or implied
+warranty. In no event will the authors be held liable for any damages
+arising from the use of this software.
+
+Permission is granted to anyone to use this software for any purpose,
+including commercial applications, and to alter it and redistribute it
+freely, subject to the following restrictions:
+
+1. The origin of this software must not be misrepresented; you must not
+ claim that you wrote the original software. If you use this software
+ in a product, an acknowledgment in the product documentation would be
+ appreciated but is not required.
+2. Altered source versions must be plainly marked as such, and must not be
+ misrepresented as being the original software.
+3. This notice may not be removed or altered from any source distribution.
+
+Michal Molhanec <mol1111 at users.sourceforge.net>
+Jirka Kosek <kosek at users.sourceforge.net>
+Michiel Hendriks <elmuerte at users.sourceforge.net>
+
+-->
+<highlighters>
+ <highlighter type="multiline-comment">
+ <!-- multiline comments starting with an $ are directives -->
+ <start>{$</start>
+ <end>}</end>
+ <style>directive</style>
+ </highlighter>
+ <highlighter type="multiline-comment">
+ <!-- multiline comments starting with an $ are directives -->
+ <start>(*$</start>
+ <end>)</end>
+ <style>directive</style>
+ </highlighter>
+ <highlighter type="multiline-comment">
+ <start>{</start>
+ <end>}</end>
+ </highlighter>
+ <highlighter type="multiline-comment">
+ <start>(*</start>
+ <end>*)</end>
+ </highlighter>
+ <highlighter type="oneline-comment">//</highlighter>
+ <highlighter type="string">
+ <string>'</string>
+ <doubleEscapes />
+ </highlighter>
+ <highlighter type="hexnumber">
+ <prefix>#$</prefix>
+ <ignoreCase />
+ <style>string</style>
+ </highlighter>
+ <highlighter type="number">
+ <prefix>#</prefix>
+ <ignoreCase />
+ <style>string</style>
+ </highlighter>
+ <highlighter type="hexnumber">
+ <prefix>$</prefix>
+ <ignoreCase />
+ </highlighter>
+ <highlighter type="number">
+ <point>.</point>
+ <exponent>e</exponent>
+ <ignoreCase />
+ </highlighter>
+ <highlighter type="keywords">
+ <!-- Reserved words -->
+ <keyword>and</keyword>
+ <keyword>else</keyword>
+ <keyword>inherited</keyword>
+ <keyword>packed</keyword>
+ <keyword>then</keyword>
+ <keyword>array</keyword>
+ <keyword>end</keyword>
+ <keyword>initialization</keyword>
+ <keyword>procedure</keyword>
+ <keyword>threadvar</keyword>
+ <keyword>as</keyword>
+ <keyword>except</keyword>
+ <keyword>inline</keyword>
+ <keyword>program</keyword>
+ <keyword>to</keyword>
+ <keyword>asm</keyword>
+ <keyword>exports</keyword>
+ <keyword>interface</keyword>
+ <keyword>property</keyword>
+ <keyword>try</keyword>
+ <keyword>begin</keyword>
+ <keyword>file</keyword>
+ <keyword>is</keyword>
+ <keyword>raise</keyword>
+ <keyword>type</keyword>
+ <keyword>case</keyword>
+ <keyword>final</keyword>
+ <keyword>label</keyword>
+ <keyword>record</keyword>
+ <keyword>unit</keyword>
+ <keyword>class</keyword>
+ <keyword>finalization</keyword>
+ <keyword>library</keyword>
+ <keyword>repeat</keyword>
+ <keyword>unsafe</keyword>
+ <keyword>const</keyword>
+ <keyword>finally</keyword>
+ <keyword>mod</keyword>
+ <keyword>resourcestring</keyword>
+ <keyword>until</keyword>
+ <keyword>constructor</keyword>
+ <keyword>for</keyword>
+ <keyword>nil</keyword>
+ <keyword>sealed</keyword>
+ <keyword>uses</keyword>
+ <keyword>destructor</keyword>
+ <keyword>function</keyword>
+ <keyword>not</keyword>
+ <keyword>set</keyword>
+ <keyword>var</keyword>
+ <keyword>dispinterface</keyword>
+ <keyword>goto</keyword>
+ <keyword>object</keyword>
+ <keyword>shl</keyword>
+ <keyword>while</keyword>
+ <keyword>div</keyword>
+ <keyword>if</keyword>
+ <keyword>of</keyword>
+ <keyword>shr</keyword>
+ <keyword>with</keyword>
+ <keyword>do</keyword>
+ <keyword>implementation</keyword>
+ <keyword>or</keyword>
+ <keyword>static</keyword>
+ <keyword>xor</keyword>
+ <keyword>downto</keyword>
+ <keyword>in</keyword>
+ <keyword>out</keyword>
+ <keyword>string</keyword>
+
+ <!-- Special meaning -->
+ <keyword>at</keyword>
+ <keyword>on</keyword>
+
+ <!-- Directives -->
+ <keyword>absolute</keyword>
+ <keyword>dynamic</keyword>
+ <keyword>local</keyword>
+ <keyword>platform</keyword>
+ <keyword>requires</keyword>
+ <keyword>abstract</keyword>
+ <keyword>export</keyword>
+ <keyword>message</keyword>
+ <keyword>private</keyword>
+ <keyword>resident</keyword>
+ <keyword>assembler</keyword>
+ <keyword>external</keyword>
+ <keyword>name</keyword>
+ <keyword>protected</keyword>
+ <keyword>safecall</keyword>
+ <keyword>automated</keyword>
+ <keyword>far</keyword>
+ <keyword>near</keyword>
+ <keyword>public</keyword>
+ <keyword>stdcall</keyword>
+ <keyword>cdecl</keyword>
+ <keyword>forward</keyword>
+ <keyword>nodefault</keyword>
+ <keyword>published</keyword>
+ <keyword>stored</keyword>
+ <keyword>contains</keyword>
+ <keyword>implements</keyword>
+ <keyword>overload</keyword>
+ <keyword>read</keyword>
+ <keyword>varargs</keyword>
+ <keyword>default</keyword>
+ <keyword>index</keyword>
+ <keyword>override</keyword>
+ <keyword>readonly</keyword>
+ <keyword>virtual</keyword>
+ <keyword>deprecated</keyword>
+ <keyword>inline</keyword>
+ <keyword>package</keyword>
+ <keyword>register</keyword>
+ <keyword>write</keyword>
+ <keyword>dispid</keyword>
+ <keyword>library</keyword>
+ <keyword>pascal</keyword>
+ <keyword>reintroduce</keyword>
+ <keyword>writeonly</keyword>
+ <ignoreCase />
+ </highlighter>
+</highlighters> \ No newline at end of file
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/highlighting/ini-hl.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/highlighting/ini-hl.xml
new file mode 100644
index 0000000..8a938f3
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/highlighting/ini-hl.xml
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+Syntax highlighting definition for ini files
+
+xslthl - XSLT Syntax Highlighting
+http://sourceforge.net/projects/xslthl/
+Copyright (C) 2005-2008 Michal Molhanec, Jirka Kosek, Michiel Hendriks
+
+This software is provided 'as-is', without any express or implied
+warranty. In no event will the authors be held liable for any damages
+arising from the use of this software.
+
+Permission is granted to anyone to use this software for any purpose,
+including commercial applications, and to alter it and redistribute it
+freely, subject to the following restrictions:
+
+1. The origin of this software must not be misrepresented; you must not
+ claim that you wrote the original software. If you use this software
+ in a product, an acknowledgment in the product documentation would be
+ appreciated but is not required.
+2. Altered source versions must be plainly marked as such, and must not be
+ misrepresented as being the original software.
+3. This notice may not be removed or altered from any source distribution.
+
+Michal Molhanec <mol1111 at users.sourceforge.net>
+Jirka Kosek <kosek at users.sourceforge.net>
+Michiel Hendriks <elmuerte at users.sourceforge.net>
+
+-->
+<highlighters>
+ <highlighter type="oneline-comment">;</highlighter>
+ <highlighter type="regex">
+ <!-- ini sections -->
+ <pattern>^(\[.+\]\s*)$</pattern>
+ <style>keyword</style>
+ <flags>MULTILINE</flags>
+ </highlighter>
+ <highlighter type="regex">
+ <!-- the keys in an ini section -->
+ <pattern>^(.+)(?==)</pattern>
+ <style>attribute</style>
+ <flags>MULTILINE</flags>
+ </highlighter>
+</highlighters> \ No newline at end of file
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/highlighting/java-hl.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/highlighting/java-hl.xml
new file mode 100644
index 0000000..672d518
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/highlighting/java-hl.xml
@@ -0,0 +1,117 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+Syntax highlighting definition for Java
+
+xslthl - XSLT Syntax Highlighting
+http://sourceforge.net/projects/xslthl/
+Copyright (C) 2005-2008 Michal Molhanec, Jirka Kosek, Michiel Hendriks
+
+This software is provided 'as-is', without any express or implied
+warranty. In no event will the authors be held liable for any damages
+arising from the use of this software.
+
+Permission is granted to anyone to use this software for any purpose,
+including commercial applications, and to alter it and redistribute it
+freely, subject to the following restrictions:
+
+1. The origin of this software must not be misrepresented; you must not
+ claim that you wrote the original software. If you use this software
+ in a product, an acknowledgment in the product documentation would be
+ appreciated but is not required.
+2. Altered source versions must be plainly marked as such, and must not be
+ misrepresented as being the original software.
+3. This notice may not be removed or altered from any source distribution.
+
+Michal Molhanec <mol1111 at users.sourceforge.net>
+Jirka Kosek <kosek at users.sourceforge.net>
+Michiel Hendriks <elmuerte at users.sourceforge.net>
+
+-->
+<highlighters>
+ <highlighter type="multiline-comment">
+ <start>/**</start>
+ <end>*/</end>
+ <style>doccomment</style>
+ </highlighter>
+ <highlighter type="multiline-comment">
+ <start>/*</start>
+ <end>*/</end>
+ </highlighter>
+ <highlighter type="oneline-comment">//</highlighter>
+ <highlighter type="string">
+ <string>"</string>
+ <escape>\</escape>
+ </highlighter>
+ <highlighter type="string">
+ <string>'</string>
+ <escape>\</escape>
+ </highlighter>
+ <highlighter type="annotation">
+ <start>@</start>
+ <valueStart>(</valueStart>
+ <valueEnd>)</valueEnd>
+ </highlighter>
+ <highlighter type="hexnumber">
+ <prefix>0x</prefix>
+ <ignoreCase />
+ </highlighter>
+ <highlighter type="number">
+ <point>.</point>
+ <exponent>e</exponent>
+ <suffix>f</suffix>
+ <suffix>d</suffix>
+ <suffix>l</suffix>
+ <ignoreCase />
+ </highlighter>
+ <highlighter type="keywords">
+ <keyword>abstract</keyword>
+ <keyword>boolean</keyword>
+ <keyword>break</keyword>
+ <keyword>byte</keyword>
+ <keyword>case</keyword>
+ <keyword>catch</keyword>
+ <keyword>char</keyword>
+ <keyword>class</keyword>
+ <keyword>const</keyword>
+ <keyword>continue</keyword>
+ <keyword>default</keyword>
+ <keyword>do</keyword>
+ <keyword>double</keyword>
+ <keyword>else</keyword>
+ <keyword>extends</keyword>
+ <keyword>final</keyword>
+ <keyword>finally</keyword>
+ <keyword>float</keyword>
+ <keyword>for</keyword>
+ <keyword>goto</keyword>
+ <keyword>if</keyword>
+ <keyword>implements</keyword>
+ <keyword>import</keyword>
+ <keyword>instanceof</keyword>
+ <keyword>int</keyword>
+ <keyword>interface</keyword>
+ <keyword>long</keyword>
+ <keyword>native</keyword>
+ <keyword>new</keyword>
+ <keyword>package</keyword>
+ <keyword>private</keyword>
+ <keyword>protected</keyword>
+ <keyword>public</keyword>
+ <keyword>return</keyword>
+ <keyword>short</keyword>
+ <keyword>static</keyword>
+ <keyword>strictfp</keyword>
+ <keyword>super</keyword>
+ <keyword>switch</keyword>
+ <keyword>synchronized</keyword>
+ <keyword>this</keyword>
+ <keyword>throw</keyword>
+ <keyword>throws</keyword>
+ <keyword>transient</keyword>
+ <keyword>try</keyword>
+ <keyword>void</keyword>
+ <keyword>volatile</keyword>
+ <keyword>while</keyword>
+ </highlighter>
+</highlighters> \ No newline at end of file
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/highlighting/javascript-hl.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/highlighting/javascript-hl.xml
new file mode 100644
index 0000000..08c90ba
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/highlighting/javascript-hl.xml
@@ -0,0 +1,147 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+Syntax highlighting definition for JavaScript
+
+xslthl - XSLT Syntax Highlighting
+http://sourceforge.net/projects/xslthl/
+Copyright (C) 2005-2008 Michal Molhanec, Jirka Kosek, Michiel Hendriks
+
+This software is provided 'as-is', without any express or implied
+warranty. In no event will the authors be held liable for any damages
+arising from the use of this software.
+
+Permission is granted to anyone to use this software for any purpose,
+including commercial applications, and to alter it and redistribute it
+freely, subject to the following restrictions:
+
+1. The origin of this software must not be misrepresented; you must not
+ claim that you wrote the original software. If you use this software
+ in a product, an acknowledgment in the product documentation would be
+ appreciated but is not required.
+2. Altered source versions must be plainly marked as such, and must not be
+ misrepresented as being the original software.
+3. This notice may not be removed or altered from any source distribution.
+
+Michal Molhanec <mol1111 at users.sourceforge.net>
+Jirka Kosek <kosek at users.sourceforge.net>
+Michiel Hendriks <elmuerte at users.sourceforge.net>
+
+-->
+<highlighters>
+ <highlighter type="multiline-comment">
+ <start>/*</start>
+ <end>*/</end>
+ </highlighter>
+ <highlighter type="oneline-comment">//</highlighter>
+ <highlighter type="string">
+ <string>"</string>
+ <escape>\</escape>
+ </highlighter>
+ <highlighter type="string">
+ <string>'</string>
+ <escape>\</escape>
+ </highlighter>
+ <highlighter type="hexnumber">
+ <prefix>0x</prefix>
+ <ignoreCase />
+ </highlighter>
+ <highlighter type="number">
+ <point>.</point>
+ <exponent>e</exponent>
+ <ignoreCase />
+ </highlighter>
+ <highlighter type="keywords">
+ <keyword>break</keyword>
+ <keyword>case</keyword>
+ <keyword>catch</keyword>
+ <keyword>continue</keyword>
+ <keyword>default</keyword>
+ <keyword>delete</keyword>
+ <keyword>do</keyword>
+ <keyword>else</keyword>
+ <keyword>finally</keyword>
+ <keyword>for</keyword>
+ <keyword>function</keyword>
+ <keyword>if</keyword>
+ <keyword>in</keyword>
+ <keyword>instanceof</keyword>
+ <keyword>new</keyword>
+ <keyword>return</keyword>
+ <keyword>switch</keyword>
+ <keyword>this</keyword>
+ <keyword>throw</keyword>
+ <keyword>try</keyword>
+ <keyword>typeof</keyword>
+ <keyword>var</keyword>
+ <keyword>void</keyword>
+ <keyword>while</keyword>
+ <keyword>with</keyword>
+ <!-- future keywords -->
+ <keyword>abstract</keyword>
+ <keyword>boolean</keyword>
+ <keyword>byte</keyword>
+ <keyword>char</keyword>
+ <keyword>class</keyword>
+ <keyword>const</keyword>
+ <keyword>debugger</keyword>
+ <keyword>double</keyword>
+ <keyword>enum</keyword>
+ <keyword>export</keyword>
+ <keyword>extends</keyword>
+ <keyword>final</keyword>
+ <keyword>float</keyword>
+ <keyword>goto</keyword>
+ <keyword>implements</keyword>
+ <keyword>import</keyword>
+ <keyword>int</keyword>
+ <keyword>interface</keyword>
+ <keyword>long</keyword>
+ <keyword>native</keyword>
+ <keyword>package</keyword>
+ <keyword>private</keyword>
+ <keyword>protected</keyword>
+ <keyword>public</keyword>
+ <keyword>short</keyword>
+ <keyword>static</keyword>
+ <keyword>super</keyword>
+ <keyword>synchronized</keyword>
+ <keyword>throws</keyword>
+ <keyword>transient</keyword>
+ <keyword>volatile</keyword>
+ </highlighter>
+ <highlighter type="keywords">
+ <keyword>prototype</keyword>
+ <!-- Global Objects -->
+ <keyword>Array</keyword>
+ <keyword>Boolean</keyword>
+ <keyword>Date</keyword>
+ <keyword>Error</keyword>
+ <keyword>EvalError</keyword>
+ <keyword>Function</keyword>
+ <keyword>Math</keyword>
+ <keyword>Number</keyword>
+ <keyword>Object</keyword>
+ <keyword>RangeError</keyword>
+ <keyword>ReferenceError</keyword>
+ <keyword>RegExp</keyword>
+ <keyword>String</keyword>
+ <keyword>SyntaxError</keyword>
+ <keyword>TypeError</keyword>
+ <keyword>URIError</keyword>
+ <!-- Global functions -->
+ <keyword>decodeURI</keyword>
+ <keyword>decodeURIComponent</keyword>
+ <keyword>encodeURI</keyword>
+ <keyword>encodeURIComponent</keyword>
+ <keyword>eval</keyword>
+ <keyword>isFinite</keyword>
+ <keyword>isNaN</keyword>
+ <keyword>parseFloat</keyword>
+ <keyword>parseInt</keyword>
+ <!-- Global properties -->
+ <keyword>Infinity</keyword>
+ <keyword>NaN</keyword>
+ <keyword>undefined</keyword>
+ </highlighter>
+</highlighters> \ No newline at end of file
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/highlighting/m2-hl.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/highlighting/m2-hl.xml
new file mode 100644
index 0000000..b145f74
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/highlighting/m2-hl.xml
@@ -0,0 +1,90 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+Syntax highlighting definition for Modulo-2
+
+xslthl - XSLT Syntax Highlighting
+http://sourceforge.net/projects/xslthl/
+Copyright (C) 2005-2008 Michal Molhanec, Jirka Kosek, Michiel Hendriks
+
+This software is provided 'as-is', without any express or implied
+warranty. In no event will the authors be held liable for any damages
+arising from the use of this software.
+
+Permission is granted to anyone to use this software for any purpose,
+including commercial applications, and to alter it and redistribute it
+freely, subject to the following restrictions:
+
+1. The origin of this software must not be misrepresented; you must not
+ claim that you wrote the original software. If you use this software
+ in a product, an acknowledgment in the product documentation would be
+ appreciated but is not required.
+2. Altered source versions must be plainly marked as such, and must not be
+ misrepresented as being the original software.
+3. This notice may not be removed or altered from any source distribution.
+
+Michal Molhanec <mol1111 at users.sourceforge.net>
+Jirka Kosek <kosek at users.sourceforge.net>
+Michiel Hendriks <elmuerte at users.sourceforge.net>
+
+-->
+<highlighters>
+ <highlighter type="nested-multiline-comment">
+ <start>(*</start>
+ <end>*)</end>
+ </highlighter>
+ <highlighter type="string">
+ <string>"</string>
+ </highlighter>
+ <highlighter type="string">
+ <string>'</string>
+ </highlighter>
+ <highlighter type="number">
+ <point>.</point>
+ <exponent>e</exponent>
+ <ignoreCase />
+ </highlighter>
+ <highlighter type="keywords">
+ <keyword>and</keyword>
+ <keyword>array</keyword>
+ <keyword>begin</keyword>
+ <keyword>by</keyword>
+ <keyword>case</keyword>
+ <keyword>const</keyword>
+ <keyword>definition</keyword>
+ <keyword>div</keyword>
+ <keyword>do</keyword>
+ <keyword>else</keyword>
+ <keyword>elsif</keyword>
+ <keyword>end</keyword>
+ <keyword>exit</keyword>
+ <keyword>export</keyword>
+ <keyword>for</keyword>
+ <keyword>from</keyword>
+ <keyword>if</keyword>
+ <keyword>implementation</keyword>
+ <keyword>import</keyword>
+ <keyword>in</keyword>
+ <keyword>loop</keyword>
+ <keyword>mod</keyword>
+ <keyword>module</keyword>
+ <keyword>not</keyword>
+ <keyword>of</keyword>
+ <keyword>or</keyword>
+ <keyword>pointer</keyword>
+ <keyword>procedure</keyword>
+ <keyword>qualified</keyword>
+ <keyword>record</keyword>
+ <keyword>repeat</keyword>
+ <keyword>return</keyword>
+ <keyword>set</keyword>
+ <keyword>then</keyword>
+ <keyword>to</keyword>
+ <keyword>type</keyword>
+ <keyword>until</keyword>
+ <keyword>var</keyword>
+ <keyword>while</keyword>
+ <keyword>with</keyword>
+ <ignoreCase />
+ </highlighter>
+</highlighters> \ No newline at end of file
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/highlighting/myxml-hl.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/highlighting/myxml-hl.xml
new file mode 100644
index 0000000..afa4be7
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/highlighting/myxml-hl.xml
@@ -0,0 +1,116 @@
+<?xml version='1.0'?>
+<!--
+
+ Bakalarska prace: Zvyraznovani syntaxe v XSLT
+ Michal Molhanec 2005
+
+ myxml-hl.xml - konfigurace zvyraznovace XML, ktera zvlast zvyrazni
+ HTML elementy a XSL elementy
+
+-->
+<highlighters>
+
+<wholehighlighter type='xml'>
+ <elementSet>
+ <style>html</style>
+ <element>A</element>
+ <element>ABBR</element>
+ <element>ACRONYM</element>
+ <element>ADDRESS</element>
+ <element>APPLET</element>
+ <element>AREA</element>
+ <element>B</element>
+ <element>BASE</element>
+ <element>BASEFONT</element>
+ <element>BDO</element>
+ <element>BIG</element>
+ <element>BLOCKQUOTE</element>
+ <element>BODY</element>
+ <element>BR</element>
+ <element>BUTTON</element>
+ <element>CAPTION</element>
+ <element>CENTER</element>
+ <element>CITE</element>
+ <element>CODE</element>
+ <element>COL</element>
+ <element>COLGROUP</element>
+ <element>DD</element>
+ <element>DEL</element>
+ <element>DFN</element>
+ <element>DIR</element>
+ <element>DIV</element>
+ <element>DL</element>
+ <element>DT</element>
+ <element>EM</element>
+ <element>FIELDSET</element>
+ <element>FONT</element>
+ <element>FORM</element>
+ <element>FRAME</element>
+ <element>FRAMESET</element>
+ <element>H1</element>
+ <element>H2</element>
+ <element>H3</element>
+ <element>H4</element>
+ <element>H5</element>
+ <element>H6</element>
+ <element>HEAD</element>
+ <element>HR</element>
+ <element>HTML</element>
+ <element>I</element>
+ <element>IFRAME</element>
+ <element>IMG</element>
+ <element>INPUT</element>
+ <element>INS</element>
+ <element>ISINDEX</element>
+ <element>KBD</element>
+ <element>LABEL</element>
+ <element>LEGEND</element>
+ <element>LI</element>
+ <element>LINK</element>
+ <element>MAP</element>
+ <element>MENU</element>
+ <element>META</element>
+ <element>NOFRAMES</element>
+ <element>NOSCRIPT</element>
+ <element>OBJECT</element>
+ <element>OL</element>
+ <element>OPTGROUP</element>
+ <element>OPTION</element>
+ <element>P</element>
+ <element>PARAM</element>
+ <element>PRE</element>
+ <element>Q</element>
+ <element>S</element>
+ <element>SAMP</element>
+ <element>SCRIPT</element>
+ <element>SELECT</element>
+ <element>SMALL</element>
+ <element>SPAN</element>
+ <element>STRIKE</element>
+ <element>STRONG</element>
+ <element>STYLE</element>
+ <element>SUB</element>
+ <element>SUP</element>
+ <element>TABLE</element>
+ <element>TBODY</element>
+ <element>TD</element>
+ <element>TEXTAREA</element>
+ <element>TFOOT</element>
+ <element>TH</element>
+ <element>THEAD</element>
+ <element>TITLE</element>
+ <element>TR</element>
+ <element>TT</element>
+ <element>U</element>
+ <element>UL</element>
+ <element>VAR</element>
+ <element>XMP</element>
+ <ignoreCase/>
+ </elementSet>
+ <elementPrefix>
+ <style>xslt</style>
+ <prefix>xsl:</prefix>
+ </elementPrefix>
+</wholehighlighter>
+
+</highlighters> \ No newline at end of file
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/highlighting/perl-hl.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/highlighting/perl-hl.xml
new file mode 100644
index 0000000..da1924a
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/highlighting/perl-hl.xml
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+Syntax highlighting definition for Perl
+
+xslthl - XSLT Syntax Highlighting
+http://sourceforge.net/projects/xslthl/
+Copyright (C) 2005-2008 Michal Molhanec, Jirka Kosek, Michiel Hendriks
+
+This software is provided 'as-is', without any express or implied
+warranty. In no event will the authors be held liable for any damages
+arising from the use of this software.
+
+Permission is granted to anyone to use this software for any purpose,
+including commercial applications, and to alter it and redistribute it
+freely, subject to the following restrictions:
+
+1. The origin of this software must not be misrepresented; you must not
+ claim that you wrote the original software. If you use this software
+ in a product, an acknowledgment in the product documentation would be
+ appreciated but is not required.
+2. Altered source versions must be plainly marked as such, and must not be
+ misrepresented as being the original software.
+3. This notice may not be removed or altered from any source distribution.
+
+Michal Molhanec <mol1111 at users.sourceforge.net>
+Jirka Kosek <kosek at users.sourceforge.net>
+Michiel Hendriks <elmuerte at users.sourceforge.net>
+
+-->
+<highlighters>
+ <highlighter type="oneline-comment">#</highlighter>
+ <highlighter type="heredoc">
+ <start>&lt;&lt;</start>
+ <quote>'</quote>
+ <quote>"</quote>
+ <noWhiteSpace/>
+ </highlighter>
+ <highlighter type="string">
+ <string>"</string>
+ <escape>\</escape>
+ </highlighter>
+ <highlighter type="string">
+ <string>'</string>
+ <escape>\</escape>
+ <spanNewLines/>
+ </highlighter>
+ <highlighter type="hexnumber">
+ <prefix>0x</prefix>
+ <ignoreCase />
+ </highlighter>
+ <highlighter type="number">
+ <point>.</point>
+ <pointStarts />
+ <ignoreCase />
+ </highlighter>
+ <highlighter type="keywords">
+ <keyword>if</keyword>
+ <keyword>unless</keyword>
+ <keyword>while</keyword>
+ <keyword>until</keyword>
+ <keyword>foreach</keyword>
+ <keyword>else</keyword>
+ <keyword>elsif</keyword>
+ <keyword>for</keyword>
+ <keyword>when</keyword>
+ <keyword>default</keyword>
+ <keyword>given</keyword>
+ <!-- Keywords related to the control flow of your perl program -->
+ <keyword>caller</keyword>
+ <keyword>continue</keyword>
+ <keyword>die</keyword>
+ <keyword>do</keyword>
+ <keyword>dump</keyword>
+ <keyword>eval</keyword>
+ <keyword>exit</keyword>
+ <keyword>goto</keyword>
+ <keyword>last</keyword>
+ <keyword>next</keyword>
+ <keyword>redo</keyword>
+ <keyword>return</keyword>
+ <keyword>sub</keyword>
+ <keyword>wantarray</keyword>
+ <!-- Keywords related to scoping -->
+ <keyword>caller</keyword>
+ <keyword>import</keyword>
+ <keyword>local</keyword>
+ <keyword>my</keyword>
+ <keyword>package</keyword>
+ <keyword>use</keyword>
+ <!-- Keywords related to perl modules -->
+ <keyword>do</keyword>
+ <keyword>import</keyword>
+ <keyword>no</keyword>
+ <keyword>package</keyword>
+ <keyword>require</keyword>
+ <keyword>use</keyword>
+ <!-- Keywords related to classes and object-orientedness -->
+ <keyword>bless</keyword>
+ <keyword>dbmclose</keyword>
+ <keyword>dbmopen</keyword>
+ <keyword>package</keyword>
+ <keyword>ref</keyword>
+ <keyword>tie</keyword>
+ <keyword>tied</keyword>
+ <keyword>untie</keyword>
+ <keyword>use</keyword>
+ <!-- operators -->
+ <keyword>and</keyword>
+ <keyword>or</keyword>
+ <keyword>not</keyword>
+ <keyword>eq</keyword>
+ <keyword>ne</keyword>
+ <keyword>lt</keyword>
+ <keyword>gt</keyword>
+ <keyword>le</keyword>
+ <keyword>ge</keyword>
+ <keyword>cmp</keyword>
+ </highlighter>
+</highlighters> \ No newline at end of file
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/highlighting/php-hl.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/highlighting/php-hl.xml
new file mode 100644
index 0000000..4a70225
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/highlighting/php-hl.xml
@@ -0,0 +1,149 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+Syntax highlighting definition for PHP
+
+xslthl - XSLT Syntax Highlighting
+http://sourceforge.net/projects/xslthl/
+Copyright (C) 2005-2008 Michal Molhanec, Jirka Kosek, Michiel Hendriks
+
+This software is provided 'as-is', without any express or implied
+warranty. In no event will the authors be held liable for any damages
+arising from the use of this software.
+
+Permission is granted to anyone to use this software for any purpose,
+including commercial applications, and to alter it and redistribute it
+freely, subject to the following restrictions:
+
+1. The origin of this software must not be misrepresented; you must not
+ claim that you wrote the original software. If you use this software
+ in a product, an acknowledgment in the product documentation would be
+ appreciated but is not required.
+2. Altered source versions must be plainly marked as such, and must not be
+ misrepresented as being the original software.
+3. This notice may not be removed or altered from any source distribution.
+
+Michal Molhanec <mol1111 at users.sourceforge.net>
+Jirka Kosek <kosek at users.sourceforge.net>
+Michiel Hendriks <elmuerte at users.sourceforge.net>
+
+-->
+<highlighters>
+ <highlighter type="multiline-comment">
+ <start>/**</start>
+ <end>*/</end>
+ <style>doccomment</style>
+ </highlighter>
+ <highlighter type="oneline-comment">
+ <start>///</start>
+ <style>doccomment</style>
+ </highlighter>
+ <highlighter type="multiline-comment">
+ <start>/*</start>
+ <end>*/</end>
+ </highlighter>
+ <highlighter type="oneline-comment">//</highlighter>
+ <highlighter type="oneline-comment">#</highlighter>
+ <highlighter type="string">
+ <string>"</string>
+ <escape>\</escape>
+ <spanNewLines />
+ </highlighter>
+ <highlighter type="string">
+ <string>'</string>
+ <escape>\</escape>
+ <spanNewLines />
+ </highlighter>
+ <highlighter type="heredoc">
+ <start>&lt;&lt;&lt;</start>
+ </highlighter>
+ <highlighter type="hexnumber">
+ <prefix>0x</prefix>
+ <ignoreCase />
+ </highlighter>
+ <highlighter type="number">
+ <point>.</point>
+ <exponent>e</exponent>
+ <ignoreCase />
+ </highlighter>
+ <highlighter type="keywords">
+ <keyword>and</keyword>
+ <keyword>or</keyword>
+ <keyword>xor</keyword>
+ <keyword>__FILE__</keyword>
+ <keyword>exception</keyword>
+ <keyword>__LINE__</keyword>
+ <keyword>array</keyword>
+ <keyword>as</keyword>
+ <keyword>break</keyword>
+ <keyword>case</keyword>
+ <keyword>class</keyword>
+ <keyword>const</keyword>
+ <keyword>continue</keyword>
+ <keyword>declare</keyword>
+ <keyword>default</keyword>
+ <keyword>die</keyword>
+ <keyword>do</keyword>
+ <keyword>echo</keyword>
+ <keyword>else</keyword>
+ <keyword>elseif</keyword>
+ <keyword>empty</keyword>
+ <keyword>enddeclare</keyword>
+ <keyword>endfor</keyword>
+ <keyword>endforeach</keyword>
+ <keyword>endif</keyword>
+ <keyword>endswitch</keyword>
+ <keyword>endwhile</keyword>
+ <keyword>eval</keyword>
+ <keyword>exit</keyword>
+ <keyword>extends</keyword>
+ <keyword>for</keyword>
+ <keyword>foreach</keyword>
+ <keyword>function</keyword>
+ <keyword>global</keyword>
+ <keyword>if</keyword>
+ <keyword>include</keyword>
+ <keyword>include_once</keyword>
+ <keyword>isset</keyword>
+ <keyword>list</keyword>
+ <keyword>new</keyword>
+ <keyword>print</keyword>
+ <keyword>require</keyword>
+ <keyword>require_once</keyword>
+ <keyword>return</keyword>
+ <keyword>static</keyword>
+ <keyword>switch</keyword>
+ <keyword>unset</keyword>
+ <keyword>use</keyword>
+ <keyword>var</keyword>
+ <keyword>while</keyword>
+ <keyword>__FUNCTION__</keyword>
+ <keyword>__CLASS__</keyword>
+ <keyword>__METHOD__</keyword>
+ <keyword>final</keyword>
+ <keyword>php_user_filter</keyword>
+ <keyword>interface</keyword>
+ <keyword>implements</keyword>
+ <keyword>extends</keyword>
+ <keyword>public</keyword>
+ <keyword>private</keyword>
+ <keyword>protected</keyword>
+ <keyword>abstract</keyword>
+ <keyword>clone</keyword>
+ <keyword>try</keyword>
+ <keyword>catch</keyword>
+ <keyword>throw</keyword>
+ <keyword>cfunction</keyword>
+ <keyword>old_function</keyword>
+ <keyword>true</keyword>
+ <keyword>false</keyword>
+ <ignoreCase />
+ </highlighter>
+ <highlighter type="word">
+ <!-- highlight the php open and close tags as directives -->
+ <word>?&gt;</word>
+ <word>&lt;?php</word>
+ <word>&lt;?=</word>
+ <style>directive</style>
+ </highlighter>
+</highlighters> \ No newline at end of file
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/highlighting/python-hl.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/highlighting/python-hl.xml
new file mode 100644
index 0000000..791bc7a
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/highlighting/python-hl.xml
@@ -0,0 +1,100 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+Syntax highlighting definition for Python
+
+xslthl - XSLT Syntax Highlighting
+http://sourceforge.net/projects/xslthl/
+Copyright (C) 2005-2008 Michal Molhanec, Jirka Kosek, Michiel Hendriks
+
+This software is provided 'as-is', without any express or implied
+warranty. In no event will the authors be held liable for any damages
+arising from the use of this software.
+
+Permission is granted to anyone to use this software for any purpose,
+including commercial applications, and to alter it and redistribute it
+freely, subject to the following restrictions:
+
+1. The origin of this software must not be misrepresented; you must not
+ claim that you wrote the original software. If you use this software
+ in a product, an acknowledgment in the product documentation would be
+ appreciated but is not required.
+2. Altered source versions must be plainly marked as such, and must not be
+ misrepresented as being the original software.
+3. This notice may not be removed or altered from any source distribution.
+
+Michal Molhanec <mol1111 at users.sourceforge.net>
+Jirka Kosek <kosek at users.sourceforge.net>
+Michiel Hendriks <elmuerte at users.sourceforge.net>
+
+-->
+<highlighters>
+ <highlighter type="annotation">
+ <!-- these are actually called decorators -->
+ <start>@</start>
+ <valueStart>(</valueStart>
+ <valueEnd>)</valueEnd>
+ </highlighter>
+ <highlighter type="oneline-comment">#</highlighter>
+ <highlighter type="string">
+ <string>"""</string>
+ <spanNewLines />
+ </highlighter>
+ <highlighter type="string">
+ <string>'''</string>
+ <spanNewLines />
+ </highlighter>
+ <highlighter type="string">
+ <string>"</string>
+ <escape>\</escape>
+ </highlighter>
+ <highlighter type="string">
+ <string>'</string>
+ <escape>\</escape>
+ </highlighter>
+ <highlighter type="hexnumber">
+ <prefix>0x</prefix>
+ <suffix>l</suffix>
+ <ignoreCase />
+ </highlighter>
+ <highlighter type="number">
+ <point>.</point>
+ <pointStarts />
+ <exponent>e</exponent>
+ <suffix>l</suffix>
+ <ignoreCase />
+ </highlighter>
+ <highlighter type="keywords">
+ <keyword>and</keyword>
+ <keyword>del</keyword>
+ <keyword>from</keyword>
+ <keyword>not</keyword>
+ <keyword>while</keyword>
+ <keyword>as</keyword>
+ <keyword>elif</keyword>
+ <keyword>global</keyword>
+ <keyword>or</keyword>
+ <keyword>with</keyword>
+ <keyword>assert</keyword>
+ <keyword>else</keyword>
+ <keyword>if</keyword>
+ <keyword>pass</keyword>
+ <keyword>yield</keyword>
+ <keyword>break</keyword>
+ <keyword>except</keyword>
+ <keyword>import</keyword>
+ <keyword>print</keyword>
+ <keyword>class</keyword>
+ <keyword>exec</keyword>
+ <keyword>in</keyword>
+ <keyword>raise</keyword>
+ <keyword>continue</keyword>
+ <keyword>finally</keyword>
+ <keyword>is</keyword>
+ <keyword>return</keyword>
+ <keyword>def</keyword>
+ <keyword>for</keyword>
+ <keyword>lambda</keyword>
+ <keyword>try</keyword>
+ </highlighter>
+</highlighters> \ No newline at end of file
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/highlighting/ruby-hl.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/highlighting/ruby-hl.xml
new file mode 100644
index 0000000..78189b0
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/highlighting/ruby-hl.xml
@@ -0,0 +1,109 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+Syntax highlighting definition for Ruby
+
+xslthl - XSLT Syntax Highlighting
+http://sourceforge.net/projects/xslthl/
+Copyright (C) 2005-2008 Michal Molhanec, Jirka Kosek, Michiel Hendriks
+
+This software is provided 'as-is', without any express or implied
+warranty. In no event will the authors be held liable for any damages
+arising from the use of this software.
+
+Permission is granted to anyone to use this software for any purpose,
+including commercial applications, and to alter it and redistribute it
+freely, subject to the following restrictions:
+
+1. The origin of this software must not be misrepresented; you must not
+ claim that you wrote the original software. If you use this software
+ in a product, an acknowledgment in the product documentation would be
+ appreciated but is not required.
+2. Altered source versions must be plainly marked as such, and must not be
+ misrepresented as being the original software.
+3. This notice may not be removed or altered from any source distribution.
+
+Michal Molhanec <mol1111 at users.sourceforge.net>
+Jirka Kosek <kosek at users.sourceforge.net>
+Michiel Hendriks <elmuerte at users.sourceforge.net>
+
+-->
+<highlighters>
+ <highlighter type="oneline-comment">#</highlighter>
+ <highlighter type="heredoc">
+ <start>&lt;&lt;</start>
+ <noWhiteSpace/>
+ </highlighter>
+ <highlighter type="string">
+ <string>"</string>
+ <escape>\</escape>
+ </highlighter>
+ <highlighter type="string">
+ <string>%Q{</string>
+ <endString>}</endString>
+ <escape>\</escape>
+ </highlighter>
+ <highlighter type="string">
+ <string>%/</string>
+ <endString>/</endString>
+ <escape>\</escape>
+ </highlighter>
+ <highlighter type="string">
+ <string>'</string>
+ <escape>\</escape>
+ </highlighter>
+ <highlighter type="string">
+ <string>%q{</string>
+ <endString>}</endString>
+ <escape>\</escape>
+ </highlighter>
+ <highlighter type="hexnumber">
+ <prefix>0x</prefix>
+ <ignoreCase />
+ </highlighter>
+ <highlighter type="number">
+ <point>.</point>
+ <exponent>e</exponent>
+ <ignoreCase />
+ </highlighter>
+ <highlighter type="keywords">
+ <keyword>alias</keyword>
+ <keyword>and</keyword>
+ <keyword>BEGIN</keyword>
+ <keyword>begin</keyword>
+ <keyword>break</keyword>
+ <keyword>case</keyword>
+ <keyword>class</keyword>
+ <keyword>def</keyword>
+ <keyword>defined</keyword>
+ <keyword>do</keyword>
+ <keyword>else</keyword>
+ <keyword>elsif</keyword>
+ <keyword>END</keyword>
+ <keyword>end</keyword>
+ <keyword>ensure</keyword>
+ <keyword>false</keyword>
+ <keyword>for</keyword>
+ <keyword>if</keyword>
+ <keyword>in</keyword>
+ <keyword>module</keyword>
+ <keyword>next</keyword>
+ <keyword>nil</keyword>
+ <keyword>not</keyword>
+ <keyword>or</keyword>
+ <keyword>redo</keyword>
+ <keyword>rescue</keyword>
+ <keyword>retry</keyword>
+ <keyword>return</keyword>
+ <keyword>self</keyword>
+ <keyword>super</keyword>
+ <keyword>then</keyword>
+ <keyword>true</keyword>
+ <keyword>undef</keyword>
+ <keyword>unless</keyword>
+ <keyword>until</keyword>
+ <keyword>when</keyword>
+ <keyword>while</keyword>
+ <keyword>yield</keyword>
+ </highlighter>
+</highlighters> \ No newline at end of file
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/highlighting/tcl-hl.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/highlighting/tcl-hl.xml
new file mode 100644
index 0000000..7a8fa9f
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/highlighting/tcl-hl.xml
@@ -0,0 +1,180 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+xslthl highlighter definition fof Tcl/Tk.
+written by Arndt Roger Schneider
+
+Copyright 2008 Arndt Roger Schneider
+License: xlib/libpng
+
+This software is provided "as-is", without any express or implied
+warranty. In no event will the authors be held liable for any damages
+arising from the use of this software.
+
+Permission is granted to anyone to use this software for any purpose,
+including commercial applications, and to alter it and redistribute it
+freely, subject to the following restrictions:
+
+1. The origin of this software must not be misrepresented; you must
+ not claim that you wrote the original software. If you use this
+ software in a product, an acknowledgment in the product
+ documentation would be appreciated but is not required.
+
+2. Altered source versions must be plainly marked as such, and must
+ not be misrepresented as being the original software.
+
+3. This notice may not be removed or altered from any source
+ distribution.
+
+-->
+<highlighters>
+ <highlighter type="oneline-comment">#</highlighter>
+ <highlighter type="string">
+ <string>"</string>
+ <escape>\</escape>
+ </highlighter>
+ <highlighter type="regex">
+ <pattern>-[\p{javaJavaIdentifierStart}][\p{javaJavaIdentifierPart}]+
+ </pattern>
+ <style>none</style>
+ </highlighter>
+ <highlighter type="number">
+ <point>.</point>
+ <ignoreCase />
+ </highlighter>
+ <highlighter type="keywords">
+ <!-- Tcl and itcl / structural -->
+ <keyword>if</keyword>
+ <keyword>then</keyword>
+ <keyword>else</keyword>
+ <keyword>elseif</keyword>
+ <keyword>for</keyword>
+ <keyword>foreach</keyword>
+ <keyword>break</keyword>
+ <keyword>continue</keyword>
+ <keyword>while</keyword>
+ <keyword>eval</keyword>
+ <keyword>case</keyword>
+ <keyword>in</keyword>
+ <keyword>switch</keyword>
+ <keyword>default</keyword>
+ <keyword>exit</keyword>
+ <keyword>error</keyword>
+ <keyword>proc</keyword>
+ <keyword>rename</keyword>
+ <keyword>exec</keyword>
+ <keyword>return</keyword>
+ <keyword>uplevel</keyword>
+ <keyword>upvar</keyword>
+ <keyword>constructor</keyword>
+ <keyword>destructor</keyword>
+ <keyword>itcl_class</keyword>
+ <keyword>loop</keyword>
+ <keyword>for_array_keys</keyword>
+ <keyword>for_recursive_glob</keyword>
+ <keyword>for_file</keyword>
+ <keyword>method</keyword>
+ <keyword>body</keyword>
+ <keyword>configbody</keyword>
+ <keyword>catch</keyword>
+ <keyword>namespace</keyword>
+ <keyword>class</keyword>
+ <keyword>array</keyword>
+ <keyword>set</keyword>
+ <keyword>unset</keyword>
+ <keyword>package</keyword>
+ <keyword>source</keyword>
+
+ <!-- Additional commands -->
+ <keyword>subst</keyword>
+ <keyword>list</keyword>
+ <keyword>format</keyword>
+ <keyword>lappend</keyword>
+ <keyword>option</keyword>
+ <keyword>expr</keyword>
+ <keyword>puts</keyword>
+ <keyword>winfo</keyword>
+ <keyword>lindex</keyword>
+ <keyword>string</keyword>
+
+
+ <!-- Runtime Library / structural -->
+ <keyword>verified</keyword>
+ <keyword>seteach</keyword>
+ <keyword>fixme</keyword>
+ <keyword>debug</keyword>
+ <keyword>rtl::debug</keyword>
+ <keyword>rtl::verified</keyword>
+ <keyword>rtl::template</keyword>
+ <keyword>rtl::seteach</keyword>
+
+ <!-- Runtime Library / Additional -->
+ <keyword>mkProc</keyword>
+ <keyword>getCreator</keyword>
+ <keyword>properties</keyword>
+ <keyword>lappendunique</keyword>
+ <keyword>rtl::lappendunique</keyword>
+
+ <!-- geometry managers from Tk -->
+ <keyword>place</keyword>
+ <keyword>pack</keyword>
+ <keyword>grid</keyword>
+
+
+ <!-- Additional Tk stuff -->
+ <keyword>image</keyword>
+ <keyword>font</keyword>
+ <keyword>focus</keyword>
+ <keyword>tk</keyword>
+ <keyword>bind</keyword>
+ <keyword>after</keyword>
+
+ <!-- Window classes from Tk, ... -->
+ <keyword>toplevel</keyword>
+ <keyword>frame</keyword>
+ <keyword>entry</keyword>
+ <keyword>listbox</keyword>
+ <keyword>button</keyword>
+ <keyword>radiobutton</keyword>
+ <keyword>checkbutton</keyword>
+ <keyword>canvas</keyword>
+ <keyword>menu</keyword>
+ <keyword>menubutton</keyword>
+ <keyword>text</keyword>
+ <keyword>label</keyword>
+ <keyword>message</keyword>
+ <!--
+ The rest of Tk's windows is omitted: scrollbar, scale, panedwindow, labelframe, spinbox ...
+ -->
+
+ <!-- ... from tkZinc, ... -->
+ <keyword>zinc</keyword>
+
+ <!-- ... from tkpath, ... -->
+ <keyword>tkpath::gradient</keyword>
+
+ <!-- ... from Runtime Library, ... -->
+ <keyword>rtl_combobox</keyword>
+ <keyword>rtl_tree</keyword>
+ <keyword>rtl_tabset</keyword>
+ <keyword>rtl_mlistbox</keyword>
+ <keyword>rtl_gridwin</keyword>
+ <keyword>rtlysizer</keyword>
+ <keyword>rtlxsizer</keyword>
+ <!--
+ The rest of RTL's windows is omitted: spinbox, decoratedframe, symbolbar, symbolbarcustomize, question ...
+ -->
+
+ <!-- ... from GEI, ... -->
+ <keyword>goolbar</keyword>
+ <keyword>gstripes</keyword>
+ <keyword>zoolbar</keyword>
+ <keyword>gistbox</keyword>
+ <keyword>gooleditor</keyword>
+ <keyword>galette</keyword>
+ </highlighter>
+</highlighters>
+ <!--
+ Local Variables: mode: sgml coding: utf-8-unix sgml-indent-step: 2 sgml-indent-data: t sgml-set-face: t
+ sgml-insert-missing-element-comment: nil End:
+ --> \ No newline at end of file
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/highlighting/xslthl-config.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/highlighting/xslthl-config.xml
new file mode 100644
index 0000000..b24e469
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/highlighting/xslthl-config.xml
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+xslthl - XSLT Syntax Highlighting
+http://sourceforge.net/projects/xslthl/
+Copyright (C) 2005-2008 Michal Molhanec, Jirka Kosek, Michiel Hendriks
+
+This software is provided 'as-is', without any express or implied
+warranty. In no event will the authors be held liable for any damages
+arising from the use of this software.
+
+Permission is granted to anyone to use this software for any purpose,
+including commercial applications, and to alter it and redistribute it
+freely, subject to the following restrictions:
+
+1. The origin of this software must not be misrepresented; you must not
+ claim that you wrote the original software. If you use this software
+ in a product, an acknowledgment in the product documentation would be
+ appreciated but is not required.
+2. Altered source versions must be plainly marked as such, and must not be
+ misrepresented as being the original software.
+3. This notice may not be removed or altered from any source distribution.
+
+Michal Molhanec <mol1111 at users.sourceforge.net>
+Jirka Kosek <kosek at users.sourceforge.net>
+Michiel Hendriks <elmuerte at users.sourceforge.net>
+
+-->
+<xslthl-config>
+ <highlighter id="java" file="java-hl.xml" />
+ <highlighter id="delphi" file="delphi-hl.xml" />
+ <highlighter id="pascal" file="delphi-hl.xml" />
+ <highlighter id="ini" file="ini-hl.xml" />
+ <highlighter id="php" file="php-hl.xml" />
+ <highlighter id="myxml" file="myxml-hl.xml" />
+ <highlighter id="m2" file="m2-hl.xml" />
+ <highlighter id="tcl" file="tcl-hl.xml" />
+ <highlighter id="c" file="c-hl.xml" />
+ <highlighter id="cpp" file="cpp-hl.xml" />
+ <highlighter id="csharp" file="csharp-hl.xml" />
+ <highlighter id="python" file="python-hl.xml" />
+ <highlighter id="ruby" file="ruby-hl.xml" />
+ <highlighter id="perl" file="perl-hl.xml" />
+ <highlighter id="javascript" file="javascript-hl.xml" />
+ <namespace prefix="xslthl" uri="http://xslthl.sf.net" />
+</xslthl-config> \ No newline at end of file
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/admon.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/admon.xsl
new file mode 100644
index 0000000..3d1462d
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/admon.xsl
@@ -0,0 +1,134 @@
+<?xml version='1.0'?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version='1.0'>
+
+<!-- ********************************************************************
+ $Id: admon.xsl 8421 2009-05-04 07:49:49Z bobstayton $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<xsl:template match="*" mode="admon.graphic.width">
+ <xsl:param name="node" select="."/>
+ <xsl:text>25</xsl:text>
+</xsl:template>
+
+<xsl:template match="note|important|warning|caution|tip">
+ <xsl:choose>
+ <xsl:when test="$admon.graphics != 0">
+ <xsl:call-template name="graphical.admonition"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="nongraphical.admonition"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="admon.graphic">
+ <xsl:param name="node" select="."/>
+ <xsl:value-of select="$admon.graphics.path"/>
+ <xsl:choose>
+ <xsl:when test="local-name($node)='note'">note</xsl:when>
+ <xsl:when test="local-name($node)='warning'">warning</xsl:when>
+ <xsl:when test="local-name($node)='caution'">caution</xsl:when>
+ <xsl:when test="local-name($node)='tip'">tip</xsl:when>
+ <xsl:when test="local-name($node)='important'">important</xsl:when>
+ <xsl:otherwise>note</xsl:otherwise>
+ </xsl:choose>
+ <xsl:value-of select="$admon.graphics.extension"/>
+</xsl:template>
+
+<xsl:template name="graphical.admonition">
+ <xsl:variable name="admon.type">
+ <xsl:choose>
+ <xsl:when test="local-name(.)='note'">Note</xsl:when>
+ <xsl:when test="local-name(.)='warning'">Warning</xsl:when>
+ <xsl:when test="local-name(.)='caution'">Caution</xsl:when>
+ <xsl:when test="local-name(.)='tip'">Tip</xsl:when>
+ <xsl:when test="local-name(.)='important'">Important</xsl:when>
+ <xsl:otherwise>Note</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="alt">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="$admon.type"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <div>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:if test="$admon.style != ''">
+ <xsl:attribute name="style">
+ <xsl:value-of select="$admon.style"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <table border="0">
+ <xsl:attribute name="summary">
+ <xsl:value-of select="$admon.type"/>
+ <xsl:if test="title|info/title">
+ <xsl:text>: </xsl:text>
+ <xsl:value-of select="(title|info/title)[1]"/>
+ </xsl:if>
+ </xsl:attribute>
+ <tr>
+ <td rowspan="2" align="center" valign="top">
+ <xsl:attribute name="width">
+ <xsl:apply-templates select="." mode="admon.graphic.width"/>
+ </xsl:attribute>
+ <img alt="[{$alt}]">
+ <xsl:attribute name="src">
+ <xsl:call-template name="admon.graphic"/>
+ </xsl:attribute>
+ </img>
+ </td>
+ <th align="{$direction.align.start}">
+ <xsl:call-template name="anchor"/>
+ <xsl:if test="$admon.textlabel != 0 or title or info/title">
+ <xsl:apply-templates select="." mode="object.title.markup"/>
+ </xsl:if>
+ </th>
+ </tr>
+ <tr>
+ <td align="{$direction.align.start}" valign="top">
+ <xsl:apply-templates/>
+ </td>
+ </tr>
+ </table>
+ </div>
+</xsl:template>
+
+<xsl:template name="nongraphical.admonition">
+ <div>
+ <xsl:call-template name="common.html.attributes">
+ <xsl:with-param name="inherit" select="1"/>
+ </xsl:call-template>
+ <xsl:if test="$admon.style">
+ <xsl:attribute name="style">
+ <xsl:value-of select="$admon.style"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:if test="$admon.textlabel != 0 or title or info/title">
+ <h3 class="title">
+ <xsl:call-template name="anchor"/>
+ <xsl:apply-templates select="." mode="object.title.markup"/>
+ </h3>
+ </xsl:if>
+
+ <xsl:apply-templates/>
+ </div>
+</xsl:template>
+
+<xsl:template match="note/title"></xsl:template>
+<xsl:template match="important/title"></xsl:template>
+<xsl:template match="warning/title"></xsl:template>
+<xsl:template match="caution/title"></xsl:template>
+<xsl:template match="tip/title"></xsl:template>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/annotations.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/annotations.xsl
new file mode 100644
index 0000000..f010632
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/annotations.xsl
@@ -0,0 +1,169 @@
+<?xml version='1.0'?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version='1.0'>
+
+<xsl:template name="add.annotation.links">
+ <xsl:param name="scripts" select="normalize-space($annotation.js)"/>
+ <xsl:choose>
+ <xsl:when test="contains($scripts, ' ')">
+ <script type="text/javascript" src="{substring-before($scripts, ' ')}"/>
+ <xsl:call-template name="add.annotation.links">
+ <xsl:with-param name="scripts" select="substring-after($scripts, ' ')"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <script type="text/javascript" src="{$scripts}"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="annotation"/>
+
+<xsl:template name="apply-annotations">
+ <xsl:if test="$annotation.support != 0">
+ <!-- do any annotations apply to the context node? -->
+ <xsl:variable name="id" select="(@id|@xml:id)[1]"/>
+
+ <xsl:variable name="aids">
+ <xsl:for-each select="//annotation">
+ <xsl:if test="@annotates=$id
+ or starts-with(@annotates, concat($id, ' '))
+ or contains(@annotates, concat(' ', $id, ' '))
+ or substring(@annotates, string-length(@annotates)-3)
+ = concat(' ', $id)">
+ <xsl:value-of select="generate-id()"/>
+ <xsl:text> </xsl:text>
+ </xsl:if>
+ </xsl:for-each>
+ <xsl:if test="normalize-space(@annotations) != ''">
+ <xsl:call-template name="annotations-pointed-to">
+ <xsl:with-param name="annotations"
+ select="normalize-space(@annotations)"/>
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:variable>
+
+ <xsl:if test="$aids != ''">
+ <xsl:call-template name="apply-annotations-by-gid">
+ <xsl:with-param name="gids" select="normalize-space($aids)"/>
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template name="annotations-pointed-to">
+ <xsl:param name="annotations"/>
+ <xsl:choose>
+ <xsl:when test="contains($annotations, ' ')">
+ <xsl:variable name='a'
+ select="key('id', substring-before($annotations, ' '))"/>
+ <xsl:if test="$a">
+ <xsl:value-of select="generate-id($a)"/>
+ <xsl:text> </xsl:text>
+ </xsl:if>
+ <xsl:call-template name="annotations-pointed-to">
+ <xsl:with-param name="annotations"
+ select="substring-after($annotations, ' ')"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:variable name='a'
+ select="key('id', $annotations)"/>
+ <xsl:if test="$a">
+ <xsl:value-of select="generate-id($a)"/>
+ <xsl:text> </xsl:text>
+ </xsl:if>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="apply-annotations-by-gid">
+ <xsl:param name="gids"/>
+
+ <xsl:choose>
+ <xsl:when test="contains($gids, ' ')">
+ <xsl:variable name="gid" select="substring-before($gids, ' ')"/>
+ <xsl:apply-templates select="key('gid', $gid)"
+ mode="annotation-inline"/>
+ <xsl:call-template name="apply-annotations-by-gid">
+ <xsl:with-param name="gids"
+ select="substring-after($gids, ' ')"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="key('gid', $gids)"
+ mode="annotation-inline"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="annotation" mode="annotation-inline">
+ <xsl:variable name="title">
+ <xsl:choose>
+ <xsl:when test="title">
+ <xsl:value-of select="title"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text>[Annotation #</xsl:text>
+ <xsl:number count="annotation" level="any" format="1"/>
+ <xsl:text>]</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <a href="#annot-{generate-id(.)}" title="{$title}"
+ name="anch-{generate-id(.)}" id="anch-{generate-id(.)}">
+ <xsl:apply-templates select="." mode="class.attribute"/>
+ <xsl:attribute name="onClick">
+ <xsl:text>popup_</xsl:text>
+ <xsl:value-of select="generate-id(.)"/>
+ <xsl:text>.showPopup('anch-</xsl:text>
+ <xsl:value-of select="generate-id(.)"/>
+ <xsl:text>'); return false;</xsl:text>
+ </xsl:attribute>
+ <img src="{$annotation.graphic.open}" border="0" alt="{$title}"/>
+ </a>
+</xsl:template>
+
+<xsl:template match="annotation" mode="annotation-popup">
+ <div class="annotation-nocss">
+ <p>
+ <a name="annot-{generate-id(.)}"/>
+ <xsl:text>Annotation #</xsl:text>
+ <xsl:number count="annotation" level="any" format="1"/>
+ <xsl:text>:</xsl:text>
+ </p>
+ </div>
+
+ <div id="popup-{generate-id(.)}" class="annotation-popup">
+ <xsl:if test="string-length(.) &gt; 300">
+ <xsl:attribute name="style">width:400px</xsl:attribute>
+ </xsl:if>
+
+ <xsl:call-template name="annotation-title"/>
+ <div class="annotation-body">
+ <xsl:apply-templates select="*[local-name(.) != 'title']"/>
+ </div>
+ <div class="annotation-close">
+ <a href="#" onclick="popup_{generate-id(.)}.hidePopup();return false;">
+ <xsl:apply-templates select="." mode="class.attribute"/>
+ <img src="{$annotation.graphic.close}" alt="X" border="0"/>
+ </a>
+ </div>
+ </div>
+</xsl:template>
+
+<xsl:template name="annotation-title">
+ <div class="annotation-title">
+ <xsl:choose>
+ <xsl:when test="title">
+ <xsl:apply-templates select="title/node()"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text>Annotation</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ </div>
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/autoidx-kimber.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/autoidx-kimber.xsl
new file mode 100644
index 0000000..f67b1f6
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/autoidx-kimber.xsl
@@ -0,0 +1,165 @@
+<?xml version="1.0"?>
+<!DOCTYPE xsl:stylesheet [
+<!ENTITY % common.entities SYSTEM "../common/entities.ent">
+%common.entities;
+
+<!-- Documents using the kimber index method must have a lang attribute -->
+<!-- Only one of these should be present in the entity -->
+<!ENTITY lang 'concat(/*/@lang, /*/@xml:lang)'>
+
+]>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:k="http://www.isogen.com/functions/com.isogen.saxoni18n.Saxoni18nService"
+ exclude-result-prefixes="k"
+ version="1.0">
+
+<!-- ********************************************************************
+ $Id: autoidx-kimber.xsl 8729 2010-07-15 16:43:56Z bobstayton $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<!-- ==================================================================== -->
+<!-- The "kimber" method contributed by Eliot Kimber of Innodata Isogen. -->
+<!-- ==================================================================== -->
+<!-- *** THIS MODULE ONLY WORKS WITH SAXON 6 OR SAXON 8 *** -->
+<!-- ==================================================================== -->
+
+
+<xsl:include href="../common/autoidx-kimber.xsl"/>
+
+<!-- Java sort apparently works only on lang part, not country -->
+<xsl:param name="sort.lang">
+ <xsl:choose>
+ <xsl:when test="contains(&lang;, '-')">
+ <xsl:value-of select="substring-before(&lang;, '-')"/>
+ </xsl:when>
+ <xsl:when test="contains(&lang;, '_')">
+ <xsl:value-of select="substring-before(&lang;, '_')"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="&lang;"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:param>
+
+<xsl:template name="generate-kimber-index">
+ <xsl:param name="scope" select="NOTANODE"/>
+
+ <xsl:variable name="vendor" select="system-property('xsl:vendor')"/>
+ <xsl:if test="not(contains($vendor, 'SAXON '))">
+ <xsl:message terminate="yes">
+ <xsl:text>ERROR: the 'kimber' index method requires the </xsl:text>
+ <xsl:text>Saxon version 6 or 8 XSLT processor.</xsl:text>
+ </xsl:message>
+ </xsl:if>
+
+ <xsl:if test="not(function-available('k:getIndexGroupKey'))">
+ <xsl:message terminate="yes">
+ <xsl:text>ERROR: the 'kimber' index method requires the </xsl:text>
+ <xsl:text>Innodata Isogen &#x0A;Java extensions for </xsl:text>
+ <xsl:text>internationalized indexes. &#x0A;Install those </xsl:text>
+ <xsl:text>extensions, or use a different index method.&#x0A;</xsl:text>
+ <xsl:text>For more information, see:&#x0A;</xsl:text>
+ <xsl:text>http://www.innodata-isogen.com/knowledge_center/tools_downloads/i18nsupport</xsl:text>
+ </xsl:message>
+ </xsl:if>
+
+ <xsl:variable name="role">
+ <xsl:if test="$index.on.role != 0">
+ <xsl:value-of select="@role"/>
+ </xsl:if>
+ </xsl:variable>
+
+ <xsl:variable name="type">
+ <xsl:if test="$index.on.type != 0">
+ <xsl:value-of select="@type"/>
+ </xsl:if>
+ </xsl:variable>
+
+ <xsl:variable name="terms"
+ select="//indexterm[count(.|key('k-group', k:getIndexGroupKey(&lang;, &primary;))[&scope;][1]) = 1 and not(@class = 'endofrange')]"/>
+
+ <xsl:variable name="alphabetical"
+ select="$terms[not(starts-with(
+ k:getIndexGroupKey(&lang;, &primary;),
+ '#NUMERIC'
+ ))]"/>
+
+ <xsl:variable name="others"
+ select="$terms[starts-with(
+ k:getIndexGroupKey(&lang;, &primary;),
+ '#NUMERIC'
+ )]"/>
+
+ <div class="index">
+ <xsl:if test="$others">
+ <div class="indexdev">
+ <h3>
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'index symbols'"/>
+ </xsl:call-template>
+ </h3>
+ <dl>
+ <xsl:apply-templates select="$others"
+ mode="index-symbol-div">
+ <xsl:with-param name="scope" select="$scope"/>
+ <xsl:with-param name="role" select="$role"/>
+ <xsl:with-param name="type" select="$type"/>
+ <xsl:sort lang="{$sort.lang}"
+ select="k:getIndexGroupSortKey(&lang;,
+ k:getIndexGroupKey(&lang;, &primary;))"/>
+ </xsl:apply-templates>
+ </dl>
+ </div>
+ </xsl:if>
+
+ <xsl:apply-templates select="$alphabetical"
+ mode="index-div-kimber">
+ <xsl:with-param name="scope" select="$scope"/>
+ <xsl:with-param name="role" select="$role"/>
+ <xsl:with-param name="type" select="$type"/>
+ <xsl:sort lang="{$sort.lang}"
+ select="k:getIndexGroupSortKey(&lang;,
+ k:getIndexGroupKey(&lang;, &primary;))"/>
+ </xsl:apply-templates>
+ </div>
+
+</xsl:template>
+
+<xsl:template match="indexterm" mode="index-div-kimber">
+ <xsl:param name="scope" select="."/>
+ <xsl:param name="role" select="''"/>
+ <xsl:param name="type" select="''"/>
+
+ <xsl:variable name="key"
+ select="k:getIndexGroupKey(&lang;, &primary;)"/>
+
+ <xsl:variable name="label"
+ select="k:getIndexGroupLabel(&lang;, $key)"/>
+
+ <xsl:if test="key('k-group', $label)[&scope;][count(.|key('primary', &primary;)[&scope;][1]) = 1]">
+ <div class="indexdiv">
+ <h3>
+ <xsl:value-of select="$label"/>
+ </h3>
+ <dl>
+ <xsl:apply-templates select="key('k-group', $key)[&scope;]
+ [count(.|key('primary', &primary;)[&scope;]
+ [1])=1]"
+ mode="index-primary">
+ <xsl:sort select="&primary;" lang="{$sort.lang}"/>
+ <xsl:with-param name="scope" select="$scope"/>
+ <xsl:with-param name="role" select="$role"/>
+ <xsl:with-param name="type" select="$type"/>
+ </xsl:apply-templates>
+ </dl>
+ </div>
+ </xsl:if>
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/autoidx-kosek.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/autoidx-kosek.xsl
new file mode 100644
index 0000000..d03ff4f
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/autoidx-kosek.xsl
@@ -0,0 +1,120 @@
+<?xml version="1.0"?>
+<!DOCTYPE xsl:stylesheet [
+<!ENTITY % common.entities SYSTEM "../common/entities.ent">
+%common.entities;
+]>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:i="urn:cz-kosek:functions:index"
+ xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0"
+ xmlns:func="http://exslt.org/functions"
+ xmlns:k="http://www.isogen.com/functions/com.isogen.saxoni18n.Saxoni18nService"
+ xmlns:exslt="http://exslt.org/common"
+ extension-element-prefixes="func exslt"
+ exclude-result-prefixes="func exslt i l k"
+ version="1.0">
+
+<!-- ********************************************************************
+ $Id: autoidx-kosek.xsl 8725 2010-07-15 08:08:04Z kosek $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<!-- ==================================================================== -->
+<!-- The "kosek" method contributed by Jirka Kosek. -->
+
+<xsl:include href="../common/autoidx-kosek.xsl"/>
+
+<xsl:template name="generate-kosek-index">
+ <xsl:param name="scope" select="(ancestor::book|/)[last()]"/>
+
+ <xsl:variable name="vendor" select="system-property('xsl:vendor')"/>
+ <xsl:if test="contains($vendor, 'libxslt')">
+ <xsl:message terminate="yes">
+ <xsl:text>ERROR: the 'kosek' index method does not </xsl:text>
+ <xsl:text>work with the xsltproc XSLT processor.</xsl:text>
+ </xsl:message>
+ </xsl:if>
+
+ <xsl:if test="contains($vendor, 'Saxonica')">
+ <xsl:message terminate="yes">
+ <xsl:text>ERROR: the 'kosek' index method does not </xsl:text>
+ <xsl:text>work with the Saxon 8 XSLT processor.</xsl:text>
+ </xsl:message>
+ </xsl:if>
+
+ <xsl:if test="$exsl.node.set.available = 0">
+ <xsl:message terminate="yes">
+ <xsl:text>ERROR: the 'kosek' index method requires the </xsl:text>
+ <xsl:text>exslt:node-set() function. Use a processor that </xsl:text>
+ <xsl:text>has it, or use a different index method.</xsl:text>
+ </xsl:message>
+ </xsl:if>
+
+ <xsl:if test="not(function-available('i:group-index'))">
+ <xsl:message terminate="yes">
+ <xsl:text>ERROR: the 'kosek' index method requires the&#xA;</xsl:text>
+ <xsl:text>index extension functions be imported:&#xA;</xsl:text>
+ <xsl:text> xsl:import href="common/autoidx-kosek.xsl"</xsl:text>
+ </xsl:message>
+ </xsl:if>
+
+ <xsl:variable name="role">
+ <xsl:if test="$index.on.role != 0">
+ <xsl:value-of select="@role"/>
+ </xsl:if>
+ </xsl:variable>
+
+ <xsl:variable name="type">
+ <xsl:if test="$index.on.type != 0">
+ <xsl:value-of select="@type"/>
+ </xsl:if>
+ </xsl:variable>
+
+ <xsl:variable name="terms"
+ select="//indexterm[count(.|key('group-code', i:group-index(&primary;))[&scope;][1]) = 1 and not(@class = 'endofrange')]"/>
+
+ <div class="index">
+ <xsl:apply-templates select="$terms" mode="index-div-kosek">
+ <xsl:with-param name="scope" select="$scope"/>
+ <xsl:with-param name="role" select="$role"/>
+ <xsl:with-param name="type" select="$type"/>
+ <xsl:sort select="i:group-index(&primary;)" data-type="number"/>
+ </xsl:apply-templates>
+ </div>
+</xsl:template>
+
+<xsl:template match="indexterm" mode="index-div-kosek">
+ <xsl:param name="scope" select="."/>
+ <xsl:param name="role" select="''"/>
+ <xsl:param name="type" select="''"/>
+
+ <xsl:variable name="key"
+ select="i:group-index(&primary;)"/>
+
+ <xsl:variable name="lang">
+ <xsl:call-template name="l10n.language"/>
+ </xsl:variable>
+
+ <xsl:if test="key('group-code', $key)[&scope;][count(.|key('primary', &primary;)[&scope;][1]) = 1]">
+ <div class="indexdiv">
+ <h3>
+ <xsl:value-of select="i:group-letter($key)"/>
+ </h3>
+ <dl>
+ <xsl:apply-templates select="key('group-code', $key)[&scope;][count(.|key('primary', &primary;)[&scope;][1])=1]"
+ mode="index-primary">
+ <xsl:sort select="&primary;" lang="{$lang}"/>
+ <xsl:with-param name="scope" select="$scope"/>
+ <xsl:with-param name="role" select="$role"/>
+ <xsl:with-param name="type" select="$type"/>
+ </xsl:apply-templates>
+ </dl>
+ </div>
+ </xsl:if>
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/autoidx-ng.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/autoidx-ng.xsl
new file mode 100644
index 0000000..9407b5c
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/autoidx-ng.xsl
@@ -0,0 +1,20 @@
+<?xml version="1.0"?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="1.0">
+
+<!-- ********************************************************************
+ $Id: autoidx-ng.xsl 6910 2007-06-28 23:23:30Z xmldoc $
+ ********************************************************************
+
+ This file is part of the DocBook XSL Stylesheet distribution.
+ See ../README or http://docbook.sf.net/ for copyright
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<!-- You should have this directly in your customization file. -->
+<!-- This file is there only to retain backward compatibility. -->
+<xsl:import href="autoidx-kosek.xsl"/>
+<xsl:param name="index.method">kosek</xsl:param>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/autoidx.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/autoidx.xsl
new file mode 100644
index 0000000..7268fcd
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/autoidx.xsl
@@ -0,0 +1,739 @@
+<?xml version="1.0"?>
+<!DOCTYPE xsl:stylesheet [
+<!ENTITY % common.entities SYSTEM "../common/entities.ent">
+%common.entities;
+]>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:exslt="http://exslt.org/common"
+ extension-element-prefixes="exslt"
+ exclude-result-prefixes="exslt"
+ version="1.0">
+
+<!-- ********************************************************************
+ $Id: autoidx.xsl 8516 2009-08-12 02:54:56Z abdelazer $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<!-- ==================================================================== -->
+<!-- The "basic" method derived from Jeni Tennison's work. -->
+<!-- The "kosek" method contributed by Jirka Kosek. -->
+<!-- The "kimber" method contributed by Eliot Kimber of Innodata Isogen. -->
+
+<xsl:variable name="kimber.imported" select="0"/>
+<xsl:variable name="kosek.imported" select="0"/>
+
+<xsl:key name="letter"
+ match="indexterm"
+ use="translate(substring(&primary;, 1, 1),&lowercase;,&uppercase;)"/>
+
+<xsl:key name="primary"
+ match="indexterm"
+ use="&primary;"/>
+
+<xsl:key name="secondary"
+ match="indexterm"
+ use="concat(&primary;, &sep;, &secondary;)"/>
+
+<xsl:key name="tertiary"
+ match="indexterm"
+ use="concat(&primary;, &sep;, &secondary;, &sep;, &tertiary;)"/>
+
+<xsl:key name="endofrange"
+ match="indexterm[@class='endofrange']"
+ use="@startref"/>
+
+<xsl:key name="primary-section"
+ match="indexterm[not(secondary) and not(see)]"
+ use="concat(&primary;, &sep;, &section.id;)"/>
+
+<xsl:key name="secondary-section"
+ match="indexterm[not(tertiary) and not(see)]"
+ use="concat(&primary;, &sep;, &secondary;, &sep;, &section.id;)"/>
+
+<xsl:key name="tertiary-section"
+ match="indexterm[not(see)]"
+ use="concat(&primary;, &sep;, &secondary;, &sep;, &tertiary;, &sep;, &section.id;)"/>
+
+<xsl:key name="see-also"
+ match="indexterm[seealso]"
+ use="concat(&primary;, &sep;, &secondary;, &sep;, &tertiary;, &sep;, seealso)"/>
+
+<xsl:key name="see"
+ match="indexterm[see]"
+ use="concat(&primary;, &sep;, &secondary;, &sep;, &tertiary;, &sep;, see)"/>
+
+<xsl:key name="sections" match="*[@id or @xml:id]" use="@id|@xml:id"/>
+
+
+<xsl:template name="generate-index">
+ <xsl:param name="scope" select="(ancestor::book|/)[last()]"/>
+
+ <xsl:choose>
+ <xsl:when test="$index.method = 'kosek'">
+ <xsl:call-template name="generate-kosek-index">
+ <xsl:with-param name="scope" select="$scope"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="$index.method = 'kimber'">
+ <xsl:call-template name="generate-kimber-index">
+ <xsl:with-param name="scope" select="$scope"/>
+ </xsl:call-template>
+ </xsl:when>
+
+ <xsl:otherwise>
+ <xsl:call-template name="generate-basic-index">
+ <xsl:with-param name="scope" select="$scope"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="generate-basic-index">
+ <xsl:param name="scope" select="NOTANODE"/>
+
+ <xsl:variable name="role">
+ <xsl:if test="$index.on.role != 0">
+ <xsl:value-of select="@role"/>
+ </xsl:if>
+ </xsl:variable>
+
+ <xsl:variable name="type">
+ <xsl:if test="$index.on.type != 0">
+ <xsl:value-of select="@type"/>
+ </xsl:if>
+ </xsl:variable>
+
+ <xsl:variable name="terms"
+ select="//indexterm
+ [count(.|key('letter',
+ translate(substring(&primary;, 1, 1),
+ &lowercase;,
+ &uppercase;))
+ [&scope;][1]) = 1
+ and not(@class = 'endofrange')]"/>
+
+ <xsl:variable name="alphabetical"
+ select="$terms[contains(concat(&lowercase;, &uppercase;),
+ substring(&primary;, 1, 1))]"/>
+
+ <xsl:variable name="others" select="$terms[not(contains(concat(&lowercase;,
+ &uppercase;),
+ substring(&primary;, 1, 1)))]"/>
+ <div class="index">
+ <xsl:if test="$others">
+ <xsl:choose>
+ <xsl:when test="normalize-space($type) != '' and
+ $others[@type = $type][count(.|key('primary', &primary;)[&scope;][1]) = 1]">
+ <div class="indexdiv">
+ <h3>
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'index symbols'"/>
+ </xsl:call-template>
+ </h3>
+ <dl>
+ <xsl:apply-templates select="$others[count(.|key('primary', &primary;)[&scope;][1]) = 1]"
+ mode="index-symbol-div">
+ <xsl:with-param name="position" select="position()"/>
+ <xsl:with-param name="scope" select="$scope"/>
+ <xsl:with-param name="role" select="$role"/>
+ <xsl:with-param name="type" select="$type"/>
+ <xsl:sort select="translate(&primary;, &lowercase;, &uppercase;)"/>
+ </xsl:apply-templates>
+ </dl>
+ </div>
+ </xsl:when>
+ <xsl:when test="normalize-space($type) != ''">
+ <!-- Output nothing, as there isn't a match for $other using this $type -->
+ </xsl:when>
+ <xsl:otherwise>
+ <div class="indexdiv">
+ <h3>
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'index symbols'"/>
+ </xsl:call-template>
+ </h3>
+ <dl>
+ <xsl:apply-templates select="$others[count(.|key('primary',
+ &primary;)[&scope;][1]) = 1]"
+ mode="index-symbol-div">
+ <xsl:with-param name="position" select="position()"/>
+ <xsl:with-param name="scope" select="$scope"/>
+ <xsl:with-param name="role" select="$role"/>
+ <xsl:with-param name="type" select="$type"/>
+ <xsl:sort select="translate(&primary;, &lowercase;, &uppercase;)"/>
+ </xsl:apply-templates>
+ </dl>
+ </div>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:if>
+
+ <xsl:apply-templates select="$alphabetical[count(.|key('letter',
+ translate(substring(&primary;, 1, 1),
+ &lowercase;,&uppercase;))[&scope;][1]) = 1]"
+ mode="index-div-basic">
+ <xsl:with-param name="position" select="position()"/>
+ <xsl:with-param name="scope" select="$scope"/>
+ <xsl:with-param name="role" select="$role"/>
+ <xsl:with-param name="type" select="$type"/>
+ <xsl:sort select="translate(&primary;, &lowercase;, &uppercase;)"/>
+ </xsl:apply-templates>
+ </div>
+</xsl:template>
+
+<!-- This template not used if html/autoidx-kosek.xsl is imported -->
+<xsl:template name="generate-kosek-index">
+ <xsl:param name="scope" select="NOTANODE"/>
+
+ <xsl:variable name="vendor" select="system-property('xsl:vendor')"/>
+ <xsl:if test="contains($vendor, 'libxslt')">
+ <xsl:message terminate="yes">
+ <xsl:text>ERROR: the 'kosek' index method does not </xsl:text>
+ <xsl:text>work with the xsltproc XSLT processor.</xsl:text>
+ </xsl:message>
+ </xsl:if>
+
+
+ <xsl:if test="$exsl.node.set.available = 0">
+ <xsl:message terminate="yes">
+ <xsl:text>ERROR: the 'kosek' index method requires the </xsl:text>
+ <xsl:text>exslt:node-set() function. Use a processor that </xsl:text>
+ <xsl:text>has it, or use a different index method.</xsl:text>
+ </xsl:message>
+ </xsl:if>
+
+ <xsl:if test="$kosek.imported = 0">
+ <xsl:message terminate="yes">
+ <xsl:text>ERROR: the 'kosek' index method requires the&#xA;</xsl:text>
+ <xsl:text>kosek index extensions be imported:&#xA;</xsl:text>
+ <xsl:text> xsl:import href="html/autoidx-kosek.xsl"</xsl:text>
+ </xsl:message>
+ </xsl:if>
+
+</xsl:template>
+
+<!-- This template not used if html/autoidx-kimber.xsl is imported -->
+<xsl:template name="generate-kimber-index">
+ <xsl:param name="scope" select="NOTANODE"/>
+
+ <xsl:variable name="vendor" select="system-property('xsl:vendor')"/>
+ <xsl:if test="not(contains($vendor, 'SAXON '))">
+ <xsl:message terminate="yes">
+ <xsl:text>ERROR: the 'kimber' index method requires the </xsl:text>
+ <xsl:text>Saxon version 6 or 8 XSLT processor.</xsl:text>
+ </xsl:message>
+ </xsl:if>
+
+ <xsl:if test="$kimber.imported = 0">
+ <xsl:message terminate="yes">
+ <xsl:text>ERROR: the 'kimber' index method requires the&#xA;</xsl:text>
+ <xsl:text>kimber index extensions be imported:&#xA;</xsl:text>
+ <xsl:text> xsl:import href="html/autoidx-kimber.xsl"</xsl:text>
+ </xsl:message>
+ </xsl:if>
+
+</xsl:template>
+
+<xsl:template match="indexterm" mode="index-div-basic">
+ <xsl:param name="scope" select="."/>
+ <xsl:param name="role" select="''"/>
+ <xsl:param name="type" select="''"/>
+
+ <xsl:variable name="key"
+ select="translate(substring(&primary;, 1, 1),
+ &lowercase;,&uppercase;)"/>
+
+ <xsl:if test="key('letter', $key)[&scope;]
+ [count(.|key('primary', &primary;)[&scope;][1]) = 1]">
+ <div class="indexdiv">
+ <xsl:if test="contains(concat(&lowercase;, &uppercase;), $key)">
+ <h3>
+ <xsl:value-of select="translate($key, &lowercase;, &uppercase;)"/>
+ </h3>
+ </xsl:if>
+ <dl>
+ <xsl:apply-templates select="key('letter', $key)[&scope;]
+ [count(.|key('primary', &primary;)
+ [&scope;][1])=1]"
+ mode="index-primary">
+ <xsl:with-param name="position" select="position()"/>
+ <xsl:with-param name="scope" select="$scope"/>
+ <xsl:with-param name="role" select="$role"/>
+ <xsl:with-param name="type" select="$type"/>
+ <xsl:sort select="translate(&primary;, &lowercase;, &uppercase;)"/>
+ </xsl:apply-templates>
+ </dl>
+ </div>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="indexterm" mode="index-symbol-div">
+ <xsl:param name="scope" select="/"/>
+ <xsl:param name="role" select="''"/>
+ <xsl:param name="type" select="''"/>
+
+ <xsl:variable name="key" select="translate(substring(&primary;, 1, 1),
+ &lowercase;,&uppercase;)"/>
+
+ <xsl:apply-templates select="key('letter', $key)
+ [&scope;][count(.|key('primary', &primary;)[1]) = 1]"
+ mode="index-primary">
+ <xsl:with-param name="position" select="position()"/>
+ <xsl:with-param name="scope" select="$scope"/>
+ <xsl:with-param name="role" select="$role"/>
+ <xsl:with-param name="type" select="$type"/>
+ <xsl:sort select="translate(&primary;, &lowercase;, &uppercase;)"/>
+ </xsl:apply-templates>
+</xsl:template>
+
+<xsl:template match="indexterm" mode="index-primary">
+ <xsl:param name="scope" select="."/>
+ <xsl:param name="role" select="''"/>
+ <xsl:param name="type" select="''"/>
+
+ <xsl:variable name="key" select="&primary;"/>
+ <xsl:variable name="refs" select="key('primary', $key)[&scope;]"/>
+ <dt>
+ <xsl:for-each select="$refs/primary">
+ <xsl:if test="@id or @xml:id">
+ <a name="{(@id|@xml:id)[1]}"/>
+ </xsl:if>
+ </xsl:for-each>
+ <xsl:value-of select="primary"/>
+ <xsl:choose>
+ <xsl:when test="$index.links.to.section = 1">
+ <xsl:for-each select="$refs[generate-id() = generate-id(key('primary-section', concat($key, &sep;, &section.id;))[&scope;][1])]">
+ <xsl:apply-templates select="." mode="reference">
+ <xsl:with-param name="position" select="position()"/>
+ <xsl:with-param name="scope" select="$scope"/>
+ <xsl:with-param name="role" select="$role"/>
+ <xsl:with-param name="type" select="$type"/>
+ </xsl:apply-templates>
+ </xsl:for-each>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:for-each select="$refs[&scope;]">
+ <xsl:apply-templates select="." mode="reference">
+ <xsl:with-param name="position" select="position()"/>
+ <xsl:with-param name="scope" select="$scope"/>
+ <xsl:with-param name="role" select="$role"/>
+ <xsl:with-param name="type" select="$type"/>
+ </xsl:apply-templates>
+ </xsl:for-each>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:if test="$refs[not(secondary)]/*[self::see]">
+ <xsl:apply-templates select="$refs[generate-id() = generate-id(key('see', concat(&primary;, &sep;, &sep;, &sep;, see))[&scope;][1])]"
+ mode="index-see">
+ <xsl:with-param name="position" select="position()"/>
+ <xsl:with-param name="scope" select="$scope"/>
+ <xsl:with-param name="role" select="$role"/>
+ <xsl:with-param name="type" select="$type"/>
+ <xsl:sort select="translate(see, &lowercase;, &uppercase;)"/>
+ </xsl:apply-templates>
+ </xsl:if>
+ </dt>
+ <xsl:if test="$refs/secondary or $refs[not(secondary)]/*[self::seealso]">
+ <dd>
+ <dl>
+ <xsl:apply-templates select="$refs[generate-id() = generate-id(key('see-also', concat(&primary;, &sep;, &sep;, &sep;, seealso))[&scope;][1])]"
+ mode="index-seealso">
+ <xsl:with-param name="position" select="position()"/>
+ <xsl:with-param name="scope" select="$scope"/>
+ <xsl:with-param name="role" select="$role"/>
+ <xsl:with-param name="type" select="$type"/>
+ <xsl:sort select="translate(seealso, &lowercase;, &uppercase;)"/>
+ </xsl:apply-templates>
+ <xsl:apply-templates select="$refs[secondary and count(.|key('secondary', concat($key, &sep;, &secondary;))[&scope;][1]) = 1]"
+ mode="index-secondary">
+ <xsl:with-param name="position" select="position()"/>
+ <xsl:with-param name="scope" select="$scope"/>
+ <xsl:with-param name="role" select="$role"/>
+ <xsl:with-param name="type" select="$type"/>
+ <xsl:sort select="translate(&secondary;, &lowercase;, &uppercase;)"/>
+ </xsl:apply-templates>
+ </dl>
+ </dd>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="indexterm" mode="index-secondary">
+ <xsl:param name="scope" select="."/>
+ <xsl:param name="role" select="''"/>
+ <xsl:param name="type" select="''"/>
+
+ <xsl:variable name="key" select="concat(&primary;, &sep;, &secondary;)"/>
+ <xsl:variable name="refs" select="key('secondary', $key)[&scope;]"/>
+ <dt>
+ <xsl:for-each select="$refs/secondary">
+ <xsl:if test="@id or @xml:id">
+ <a name="{(@id|@xml:id)[1]}"/>
+ </xsl:if>
+ </xsl:for-each>
+ <xsl:value-of select="secondary"/>
+ <xsl:choose>
+ <xsl:when test="$index.links.to.section = 1">
+ <xsl:for-each select="$refs[generate-id() = generate-id(key('secondary-section', concat($key, &sep;, &section.id;))[&scope;][1])]">
+ <xsl:apply-templates select="." mode="reference">
+ <xsl:with-param name="position" select="position()"/>
+ <xsl:with-param name="scope" select="$scope"/>
+ <xsl:with-param name="role" select="$role"/>
+ <xsl:with-param name="type" select="$type"/>
+ </xsl:apply-templates>
+ </xsl:for-each>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:for-each select="$refs[&scope;]">
+ <xsl:apply-templates select="." mode="reference">
+ <xsl:with-param name="position" select="position()"/>
+ <xsl:with-param name="scope" select="$scope"/>
+ <xsl:with-param name="role" select="$role"/>
+ <xsl:with-param name="type" select="$type"/>
+ </xsl:apply-templates>
+ </xsl:for-each>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:if test="$refs[not(tertiary)]/*[self::see]">
+ <xsl:apply-templates select="$refs[generate-id() = generate-id(key('see', concat(&primary;, &sep;, &secondary;, &sep;, &sep;, see))[&scope;][1])]"
+ mode="index-see">
+ <xsl:with-param name="position" select="position()"/>
+ <xsl:with-param name="scope" select="$scope"/>
+ <xsl:with-param name="role" select="$role"/>
+ <xsl:with-param name="type" select="$type"/>
+ <xsl:sort select="translate(see, &lowercase;, &uppercase;)"/>
+ </xsl:apply-templates>
+ </xsl:if>
+ </dt>
+ <xsl:if test="$refs/tertiary or $refs[not(tertiary)]/*[self::seealso]">
+ <dd>
+ <dl>
+ <xsl:apply-templates select="$refs[generate-id() = generate-id(key('see-also', concat(&primary;, &sep;, &secondary;, &sep;, &sep;, seealso))[&scope;][1])]"
+ mode="index-seealso">
+ <xsl:with-param name="position" select="position()"/>
+ <xsl:with-param name="scope" select="$scope"/>
+ <xsl:with-param name="role" select="$role"/>
+ <xsl:with-param name="type" select="$type"/>
+ <xsl:sort select="translate(seealso, &lowercase;, &uppercase;)"/>
+ </xsl:apply-templates>
+ <xsl:apply-templates select="$refs[tertiary and count(.|key('tertiary', concat($key, &sep;, &tertiary;))[&scope;][1]) = 1]"
+ mode="index-tertiary">
+ <xsl:with-param name="position" select="position()"/>
+ <xsl:with-param name="scope" select="$scope"/>
+ <xsl:with-param name="role" select="$role"/>
+ <xsl:with-param name="type" select="$type"/>
+ <xsl:sort select="translate(&tertiary;, &lowercase;, &uppercase;)"/>
+ </xsl:apply-templates>
+ </dl>
+ </dd>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="indexterm" mode="index-tertiary">
+ <xsl:param name="scope" select="."/>
+ <xsl:param name="role" select="''"/>
+ <xsl:param name="type" select="''"/>
+
+ <xsl:variable name="key" select="concat(&primary;, &sep;, &secondary;, &sep;, &tertiary;)"/>
+ <xsl:variable name="refs" select="key('tertiary', $key)[&scope;]"/>
+ <dt>
+ <xsl:for-each select="$refs/tertiary">
+ <xsl:if test="@id or @xml:id">
+ <a name="{(@id|@xml:id)[1]}"/>
+ </xsl:if>
+ </xsl:for-each>
+ <xsl:value-of select="tertiary"/>
+ <xsl:choose>
+ <xsl:when test="$index.links.to.section = 1">
+ <xsl:for-each select="$refs[generate-id() = generate-id(key('tertiary-section', concat($key, &sep;, &section.id;))[&scope;][1])]">
+ <xsl:apply-templates select="." mode="reference">
+ <xsl:with-param name="position" select="position()"/>
+ <xsl:with-param name="scope" select="$scope"/>
+ <xsl:with-param name="role" select="$role"/>
+ <xsl:with-param name="type" select="$type"/>
+ </xsl:apply-templates>
+ </xsl:for-each>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:for-each select="$refs[&scope;]">
+ <xsl:apply-templates select="." mode="reference">
+ <xsl:with-param name="position" select="position()"/>
+ <xsl:with-param name="scope" select="$scope"/>
+ <xsl:with-param name="role" select="$role"/>
+ <xsl:with-param name="type" select="$type"/>
+ </xsl:apply-templates>
+ </xsl:for-each>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:if test="$refs/see">
+ <xsl:apply-templates select="$refs[generate-id() = generate-id(key('see', concat(&primary;, &sep;, &secondary;, &sep;, &tertiary;, &sep;, see))[&scope;][1])]"
+ mode="index-see">
+ <xsl:with-param name="position" select="position()"/>
+ <xsl:with-param name="scope" select="$scope"/>
+ <xsl:with-param name="role" select="$role"/>
+ <xsl:with-param name="type" select="$type"/>
+ <xsl:sort select="translate(see, &lowercase;, &uppercase;)"/>
+ </xsl:apply-templates>
+ </xsl:if>
+ </dt>
+ <xsl:if test="$refs/seealso">
+ <dd>
+ <dl>
+ <xsl:apply-templates select="$refs[generate-id() = generate-id(key('see-also', concat(&primary;, &sep;, &secondary;, &sep;, &tertiary;, &sep;, seealso))[&scope;][1])]"
+ mode="index-seealso">
+ <xsl:with-param name="position" select="position()"/>
+ <xsl:with-param name="scope" select="$scope"/>
+ <xsl:with-param name="role" select="$role"/>
+ <xsl:with-param name="type" select="$type"/>
+ <xsl:sort select="translate(seealso, &lowercase;, &uppercase;)"/>
+ </xsl:apply-templates>
+ </dl>
+ </dd>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="indexterm" mode="reference">
+ <xsl:param name="scope" select="."/>
+ <xsl:param name="role" select="''"/>
+ <xsl:param name="type" select="''"/>
+ <xsl:param name="position"/>
+
+ <xsl:variable name="term.separator">
+ <xsl:call-template name="index.separator">
+ <xsl:with-param name="key" select="'index.term.separator'"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="number.separator">
+ <xsl:call-template name="index.separator">
+ <xsl:with-param name="key" select="'index.number.separator'"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="range.separator">
+ <xsl:call-template name="index.separator">
+ <xsl:with-param name="key" select="'index.range.separator'"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="$position = 1">
+ <xsl:value-of select="$term.separator"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$number.separator"/>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:choose>
+ <xsl:when test="@zone and string(@zone)">
+ <xsl:call-template name="reference">
+ <xsl:with-param name="zones" select="normalize-space(@zone)"/>
+ <xsl:with-param name="position" select="position()"/>
+ <xsl:with-param name="scope" select="$scope"/>
+ <xsl:with-param name="role" select="$role"/>
+ <xsl:with-param name="type" select="$type"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <a>
+ <xsl:apply-templates select="." mode="class.attribute"/>
+ <xsl:variable name="title">
+ <xsl:choose>
+ <xsl:when test="&section;/titleabbrev and $index.prefer.titleabbrev != 0">
+ <xsl:apply-templates select="&section;" mode="titleabbrev.markup"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="&section;" mode="title.markup"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:attribute name="href">
+ <xsl:choose>
+ <xsl:when test="$index.links.to.section = 1">
+ <xsl:call-template name="href.target">
+ <xsl:with-param name="object" select="&section;"/>
+ <xsl:with-param name="context" select="//index[&scope;][1]"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="href.target">
+ <xsl:with-param name="object" select="."/>
+ <xsl:with-param name="context" select="//index[&scope;][1]"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ </xsl:attribute>
+
+ <xsl:value-of select="$title"/> <!-- text only -->
+ </a>
+
+ <xsl:variable name="id" select="(@id|@xml:id)[1]"/>
+ <xsl:if test="key('endofrange', $id)[&scope;]">
+ <xsl:apply-templates select="key('endofrange', $id)[&scope;][last()]"
+ mode="reference">
+ <xsl:with-param name="position" select="position()"/>
+ <xsl:with-param name="scope" select="$scope"/>
+ <xsl:with-param name="role" select="$role"/>
+ <xsl:with-param name="type" select="$type"/>
+ <xsl:with-param name="separator" select="$range.separator"/>
+ </xsl:apply-templates>
+ </xsl:if>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="reference">
+ <xsl:param name="scope" select="."/>
+ <xsl:param name="role" select="''"/>
+ <xsl:param name="type" select="''"/>
+ <xsl:param name="zones"/>
+
+ <xsl:choose>
+ <xsl:when test="contains($zones, ' ')">
+ <xsl:variable name="zone" select="substring-before($zones, ' ')"/>
+ <xsl:variable name="target" select="key('sections', $zone)"/>
+
+ <a>
+ <xsl:apply-templates select="." mode="class.attribute"/>
+ <xsl:attribute name="href">
+ <xsl:call-template name="href.target">
+ <xsl:with-param name="object" select="$target[1]"/>
+ <xsl:with-param name="context" select="//index[&scope;][1]"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:apply-templates select="$target[1]" mode="index-title-content"/>
+ </a>
+ <xsl:text>, </xsl:text>
+ <xsl:call-template name="reference">
+ <xsl:with-param name="zones" select="substring-after($zones, ' ')"/>
+ <xsl:with-param name="position" select="position()"/>
+ <xsl:with-param name="scope" select="$scope"/>
+ <xsl:with-param name="role" select="$role"/>
+ <xsl:with-param name="type" select="$type"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:variable name="zone" select="$zones"/>
+ <xsl:variable name="target" select="key('sections', $zone)"/>
+
+ <a>
+ <xsl:apply-templates select="." mode="class.attribute"/>
+ <xsl:attribute name="href">
+ <xsl:call-template name="href.target">
+ <xsl:with-param name="object" select="$target[1]"/>
+ <xsl:with-param name="context" select="//index[&scope;][1]"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:apply-templates select="$target[1]" mode="index-title-content"/>
+ </a>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="indexterm" mode="index-see">
+ <xsl:param name="scope" select="."/>
+ <xsl:param name="role" select="''"/>
+ <xsl:param name="type" select="''"/>
+
+ <xsl:text> (</xsl:text>
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'see'"/>
+ </xsl:call-template>
+ <xsl:text> </xsl:text>
+ <xsl:value-of select="see"/>
+ <xsl:text>)</xsl:text>
+</xsl:template>
+
+<xsl:template match="indexterm" mode="index-seealso">
+ <xsl:param name="scope" select="."/>
+ <xsl:param name="role" select="''"/>
+ <xsl:param name="type" select="''"/>
+
+ <xsl:for-each select="seealso">
+ <xsl:sort select="translate(., &lowercase;, &uppercase;)"/>
+ <dt>
+ <xsl:text>(</xsl:text>
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'seealso'"/>
+ </xsl:call-template>
+ <xsl:text> </xsl:text>
+ <xsl:value-of select="."/>
+ <xsl:text>)</xsl:text>
+ </dt>
+ </xsl:for-each>
+</xsl:template>
+
+<xsl:template match="*" mode="index-title-content">
+ <xsl:variable name="title">
+ <xsl:apply-templates select="&section;" mode="title.markup"/>
+ </xsl:variable>
+
+ <xsl:value-of select="$title"/>
+</xsl:template>
+
+<xsl:template name="index.separator">
+ <xsl:param name="key" select="''"/>
+ <xsl:param name="lang">
+ <xsl:call-template name="l10n.language"/>
+ </xsl:param>
+
+ <xsl:choose>
+ <xsl:when test="$key = 'index.term.separator'">
+ <xsl:choose>
+ <!-- Use the override if not blank -->
+ <xsl:when test="$index.term.separator != ''">
+ <xsl:copy-of select="$index.term.separator"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="gentext.template">
+ <xsl:with-param name="lang" select="$lang"/>
+ <xsl:with-param name="context">index</xsl:with-param>
+ <xsl:with-param name="name">term-separator</xsl:with-param>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:when test="$key = 'index.number.separator'">
+ <xsl:choose>
+ <!-- Use the override if not blank -->
+ <xsl:when test="$index.number.separator != ''">
+ <xsl:copy-of select="$index.number.separator"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="gentext.template">
+ <xsl:with-param name="lang" select="$lang"/>
+ <xsl:with-param name="context">index</xsl:with-param>
+ <xsl:with-param name="name">number-separator</xsl:with-param>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:when test="$key = 'index.range.separator'">
+ <xsl:choose>
+ <!-- Use the override if not blank -->
+ <xsl:when test="$index.range.separator != ''">
+ <xsl:copy-of select="$index.range.separator"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="gentext.template">
+ <xsl:with-param name="lang" select="$lang"/>
+ <xsl:with-param name="context">index</xsl:with-param>
+ <xsl:with-param name="name">range-separator</xsl:with-param>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ </xsl:choose>
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/autotoc.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/autotoc.xsl
new file mode 100644
index 0000000..0859b49
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/autotoc.xsl
@@ -0,0 +1,707 @@
+<?xml version='1.0'?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version='1.0'>
+
+<!-- ********************************************************************
+ $Id: autotoc.xsl 8558 2009-12-11 00:33:17Z bobstayton $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<xsl:variable name="toc.listitem.type">
+ <xsl:choose>
+ <xsl:when test="$toc.list.type = 'dl'">dt</xsl:when>
+ <xsl:otherwise>li</xsl:otherwise>
+ </xsl:choose>
+</xsl:variable>
+
+<!-- this is just hack because dl and ul aren't completely isomorphic -->
+<xsl:variable name="toc.dd.type">
+ <xsl:choose>
+ <xsl:when test="$toc.list.type = 'dl'">dd</xsl:when>
+ <xsl:otherwise></xsl:otherwise>
+ </xsl:choose>
+</xsl:variable>
+
+<xsl:template name="make.toc">
+ <xsl:param name="toc-context" select="."/>
+ <xsl:param name="toc.title.p" select="true()"/>
+ <xsl:param name="nodes" select="/NOT-AN-ELEMENT"/>
+
+ <xsl:variable name="nodes.plus" select="$nodes | qandaset"/>
+
+ <xsl:variable name="toc.title">
+ <xsl:if test="$toc.title.p">
+ <xsl:choose>
+ <xsl:when test="$make.clean.html != 0">
+ <div class="toc-title">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key">TableofContents</xsl:with-param>
+ </xsl:call-template>
+ </div>
+ </xsl:when>
+ <xsl:otherwise>
+ <p>
+ <b>
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key">TableofContents</xsl:with-param>
+ </xsl:call-template>
+ </b>
+ </p>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:if>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="$manual.toc != ''">
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+ <xsl:variable name="toc" select="document($manual.toc, .)"/>
+ <xsl:variable name="tocentry" select="$toc//tocentry[@linkend=$id]"/>
+ <xsl:if test="$tocentry and $tocentry/*">
+ <div class="toc">
+ <xsl:copy-of select="$toc.title"/>
+ <xsl:element name="{$toc.list.type}">
+ <xsl:call-template name="manual-toc">
+ <xsl:with-param name="tocentry" select="$tocentry/*[1]"/>
+ </xsl:call-template>
+ </xsl:element>
+ </div>
+ </xsl:if>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:choose>
+ <xsl:when test="$qanda.in.toc != 0">
+ <xsl:if test="$nodes.plus">
+ <div class="toc">
+ <xsl:copy-of select="$toc.title"/>
+ <xsl:element name="{$toc.list.type}">
+ <xsl:apply-templates select="$nodes.plus" mode="toc">
+ <xsl:with-param name="toc-context" select="$toc-context"/>
+ </xsl:apply-templates>
+ </xsl:element>
+ </div>
+ </xsl:if>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:if test="$nodes">
+ <div class="toc">
+ <xsl:copy-of select="$toc.title"/>
+ <xsl:element name="{$toc.list.type}">
+ <xsl:apply-templates select="$nodes" mode="toc">
+ <xsl:with-param name="toc-context" select="$toc-context"/>
+ </xsl:apply-templates>
+ </xsl:element>
+ </div>
+ </xsl:if>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="make.lots">
+ <xsl:param name="toc.params" select="''"/>
+ <xsl:param name="toc"/>
+
+ <xsl:if test="contains($toc.params, 'toc')">
+ <xsl:copy-of select="$toc"/>
+ </xsl:if>
+
+ <xsl:if test="contains($toc.params, 'figure')">
+ <xsl:call-template name="list.of.titles">
+ <xsl:with-param name="titles" select="'figure'"/>
+ <xsl:with-param name="nodes" select=".//figure"/>
+ </xsl:call-template>
+ </xsl:if>
+
+ <xsl:if test="contains($toc.params, 'table')">
+ <xsl:call-template name="list.of.titles">
+ <xsl:with-param name="titles" select="'table'"/>
+ <xsl:with-param name="nodes" select=".//table"/>
+ </xsl:call-template>
+ </xsl:if>
+
+ <xsl:if test="contains($toc.params, 'example')">
+ <xsl:call-template name="list.of.titles">
+ <xsl:with-param name="titles" select="'example'"/>
+ <xsl:with-param name="nodes" select=".//example"/>
+ </xsl:call-template>
+ </xsl:if>
+
+ <xsl:if test="contains($toc.params, 'equation')">
+ <xsl:call-template name="list.of.titles">
+ <xsl:with-param name="titles" select="'equation'"/>
+ <xsl:with-param name="nodes" select=".//equation[title or info/title]"/>
+ </xsl:call-template>
+ </xsl:if>
+
+ <xsl:if test="contains($toc.params, 'procedure')">
+ <xsl:call-template name="list.of.titles">
+ <xsl:with-param name="titles" select="'procedure'"/>
+ <xsl:with-param name="nodes" select=".//procedure[title]"/>
+ </xsl:call-template>
+ </xsl:if>
+</xsl:template>
+
+<!-- ====================================================================== -->
+
+<xsl:template name="set.toc">
+ <xsl:param name="toc-context" select="."/>
+ <xsl:param name="toc.title.p" select="true()"/>
+
+ <xsl:call-template name="make.toc">
+ <xsl:with-param name="toc-context" select="$toc-context"/>
+ <xsl:with-param name="toc.title.p" select="$toc.title.p"/>
+ <xsl:with-param name="nodes" select="book|setindex"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template name="division.toc">
+ <xsl:param name="toc-context" select="."/>
+ <xsl:param name="toc.title.p" select="true()"/>
+
+ <xsl:call-template name="make.toc">
+ <xsl:with-param name="toc-context" select="$toc-context"/>
+ <xsl:with-param name="toc.title.p" select="$toc.title.p"/>
+ <xsl:with-param name="nodes" select="part|reference
+ |preface|chapter|appendix
+ |article
+ |bibliography|glossary|index
+ |refentry
+ |bridgehead[$bridgehead.in.toc != 0]"/>
+
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template name="component.toc">
+ <xsl:param name="toc-context" select="."/>
+ <xsl:param name="toc.title.p" select="true()"/>
+
+ <xsl:call-template name="make.toc">
+ <xsl:with-param name="toc-context" select="$toc-context"/>
+ <xsl:with-param name="toc.title.p" select="$toc.title.p"/>
+ <xsl:with-param name="nodes" select="section|sect1
+ |simplesect[$simplesect.in.toc != 0]
+ |refentry
+ |article|bibliography|glossary
+ |appendix|index
+ |bridgehead[not(@renderas)
+ and $bridgehead.in.toc != 0]
+ |.//bridgehead[@renderas='sect1'
+ and $bridgehead.in.toc != 0]"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template name="component.toc.separator">
+ <!-- Customize to output something between
+ component.toc and first output -->
+</xsl:template>
+
+<xsl:template name="section.toc">
+ <xsl:param name="toc-context" select="."/>
+ <xsl:param name="toc.title.p" select="true()"/>
+
+ <xsl:call-template name="make.toc">
+ <xsl:with-param name="toc-context" select="$toc-context"/>
+ <xsl:with-param name="toc.title.p" select="$toc.title.p"/>
+ <xsl:with-param name="nodes"
+ select="section|sect1|sect2|sect3|sect4|sect5|refentry
+ |bridgehead[$bridgehead.in.toc != 0]"/>
+
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template name="section.toc.separator">
+ <!-- Customize to output something between
+ section.toc and first output -->
+</xsl:template>
+<!-- ==================================================================== -->
+
+<xsl:template name="subtoc">
+ <xsl:param name="toc-context" select="."/>
+ <xsl:param name="nodes" select="NOT-AN-ELEMENT"/>
+
+ <xsl:variable name="nodes.plus" select="$nodes | qandaset"/>
+
+ <xsl:variable name="subtoc">
+ <xsl:element name="{$toc.list.type}">
+ <xsl:choose>
+ <xsl:when test="$qanda.in.toc != 0">
+ <xsl:apply-templates mode="toc" select="$nodes.plus">
+ <xsl:with-param name="toc-context" select="$toc-context"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates mode="toc" select="$nodes">
+ <xsl:with-param name="toc-context" select="$toc-context"/>
+ </xsl:apply-templates>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:element>
+ </xsl:variable>
+
+ <xsl:variable name="depth">
+ <xsl:choose>
+ <xsl:when test="local-name(.) = 'section'">
+ <xsl:value-of select="count(ancestor::section) + 1"/>
+ </xsl:when>
+ <xsl:when test="local-name(.) = 'sect1'">1</xsl:when>
+ <xsl:when test="local-name(.) = 'sect2'">2</xsl:when>
+ <xsl:when test="local-name(.) = 'sect3'">3</xsl:when>
+ <xsl:when test="local-name(.) = 'sect4'">4</xsl:when>
+ <xsl:when test="local-name(.) = 'sect5'">5</xsl:when>
+ <xsl:when test="local-name(.) = 'refsect1'">1</xsl:when>
+ <xsl:when test="local-name(.) = 'refsect2'">2</xsl:when>
+ <xsl:when test="local-name(.) = 'refsect3'">3</xsl:when>
+ <xsl:when test="local-name(.) = 'simplesect'">
+ <!-- sigh... -->
+ <xsl:choose>
+ <xsl:when test="local-name(..) = 'section'">
+ <xsl:value-of select="count(ancestor::section)"/>
+ </xsl:when>
+ <xsl:when test="local-name(..) = 'sect1'">2</xsl:when>
+ <xsl:when test="local-name(..) = 'sect2'">3</xsl:when>
+ <xsl:when test="local-name(..) = 'sect3'">4</xsl:when>
+ <xsl:when test="local-name(..) = 'sect4'">5</xsl:when>
+ <xsl:when test="local-name(..) = 'sect5'">6</xsl:when>
+ <xsl:when test="local-name(..) = 'refsect1'">2</xsl:when>
+ <xsl:when test="local-name(..) = 'refsect2'">3</xsl:when>
+ <xsl:when test="local-name(..) = 'refsect3'">4</xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>0</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="depth.from.context" select="count(ancestor::*)-count($toc-context/ancestor::*)"/>
+
+ <xsl:variable name="subtoc.list">
+ <xsl:choose>
+ <xsl:when test="$toc.dd.type = ''">
+ <xsl:copy-of select="$subtoc"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:element name="{$toc.dd.type}">
+ <xsl:copy-of select="$subtoc"/>
+ </xsl:element>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:element name="{$toc.listitem.type}">
+ <xsl:call-template name="toc.line">
+ <xsl:with-param name="toc-context" select="$toc-context"/>
+ </xsl:call-template>
+ <xsl:if test="$toc.listitem.type = 'li'
+ and $toc.section.depth > $depth and
+ ( ($qanda.in.toc = 0 and count($nodes)&gt;0) or
+ ($qanda.in.toc != 0 and count($nodes.plus)&gt;0) )
+ and $toc.max.depth > $depth.from.context">
+ <xsl:copy-of select="$subtoc.list"/>
+ </xsl:if>
+ </xsl:element>
+ <xsl:if test="$toc.listitem.type != 'li'
+ and $toc.section.depth > $depth and
+ ( ($qanda.in.toc = 0 and count($nodes)&gt;0) or
+ ($qanda.in.toc != 0 and count($nodes.plus)&gt;0) )
+ and $toc.max.depth > $depth.from.context">
+ <xsl:copy-of select="$subtoc.list"/>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template name="toc.line">
+ <xsl:param name="toc-context" select="."/>
+ <xsl:param name="depth" select="1"/>
+ <xsl:param name="depth.from.context" select="8"/>
+
+ <span>
+ <xsl:attribute name="class"><xsl:value-of select="local-name(.)"/></xsl:attribute>
+
+ <!-- * if $autotoc.label.in.hyperlink is zero, then output the label -->
+ <!-- * before the hyperlinked title (as the DSSSL stylesheet does) -->
+ <xsl:if test="$autotoc.label.in.hyperlink = 0">
+ <xsl:variable name="label">
+ <xsl:apply-templates select="." mode="label.markup"/>
+ </xsl:variable>
+ <xsl:copy-of select="$label"/>
+ <xsl:if test="$label != ''">
+ <xsl:value-of select="$autotoc.label.separator"/>
+ </xsl:if>
+ </xsl:if>
+
+ <a>
+ <xsl:attribute name="href">
+ <xsl:call-template name="href.target">
+ <xsl:with-param name="context" select="$toc-context"/>
+ <xsl:with-param name="toc-context" select="$toc-context"/>
+ </xsl:call-template>
+ </xsl:attribute>
+
+ <!-- * if $autotoc.label.in.hyperlink is non-zero, then output the label -->
+ <!-- * as part of the hyperlinked title -->
+ <xsl:if test="not($autotoc.label.in.hyperlink = 0)">
+ <xsl:variable name="label">
+ <xsl:apply-templates select="." mode="label.markup"/>
+ </xsl:variable>
+ <xsl:copy-of select="$label"/>
+ <xsl:if test="$label != ''">
+ <xsl:value-of select="$autotoc.label.separator"/>
+ </xsl:if>
+ </xsl:if>
+
+ <xsl:apply-templates select="." mode="titleabbrev.markup"/>
+ </a>
+ </span>
+</xsl:template>
+
+<xsl:template match="book" mode="toc">
+ <xsl:param name="toc-context" select="."/>
+
+ <xsl:call-template name="subtoc">
+ <xsl:with-param name="toc-context" select="$toc-context"/>
+ <xsl:with-param name="nodes" select="part|reference
+ |preface|chapter|appendix
+ |article
+ |bibliography|glossary|index
+ |refentry
+ |bridgehead[$bridgehead.in.toc != 0]"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="setindex" mode="toc">
+ <xsl:param name="toc-context" select="."/>
+
+ <!-- If the setindex tag is not empty, it should be it in the TOC -->
+ <xsl:if test="* or $generate.index != 0">
+ <xsl:call-template name="subtoc">
+ <xsl:with-param name="toc-context" select="$toc-context"/>
+ </xsl:call-template>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="part|reference" mode="toc">
+ <xsl:param name="toc-context" select="."/>
+
+ <xsl:call-template name="subtoc">
+ <xsl:with-param name="toc-context" select="$toc-context"/>
+ <xsl:with-param name="nodes" select="appendix|chapter|article
+ |index|glossary|bibliography
+ |preface|reference|refentry
+ |bridgehead[$bridgehead.in.toc != 0]"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="preface|chapter|appendix|article" mode="toc">
+ <xsl:param name="toc-context" select="."/>
+
+ <xsl:call-template name="subtoc">
+ <xsl:with-param name="toc-context" select="$toc-context"/>
+ <xsl:with-param name="nodes" select="section|sect1
+ |simplesect[$simplesect.in.toc != 0]
+ |refentry
+ |glossary|bibliography|index
+ |bridgehead[$bridgehead.in.toc != 0]"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="sect1" mode="toc">
+ <xsl:param name="toc-context" select="."/>
+ <xsl:call-template name="subtoc">
+ <xsl:with-param name="toc-context" select="$toc-context"/>
+ <xsl:with-param name="nodes" select="sect2
+ |bridgehead[$bridgehead.in.toc != 0]"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="sect2" mode="toc">
+ <xsl:param name="toc-context" select="."/>
+
+ <xsl:call-template name="subtoc">
+ <xsl:with-param name="toc-context" select="$toc-context"/>
+ <xsl:with-param name="nodes" select="sect3
+ |bridgehead[$bridgehead.in.toc != 0]"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="sect3" mode="toc">
+ <xsl:param name="toc-context" select="."/>
+
+ <xsl:call-template name="subtoc">
+ <xsl:with-param name="toc-context" select="$toc-context"/>
+ <xsl:with-param name="nodes" select="sect4
+ |bridgehead[$bridgehead.in.toc != 0]"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="sect4" mode="toc">
+ <xsl:param name="toc-context" select="."/>
+
+ <xsl:call-template name="subtoc">
+ <xsl:with-param name="toc-context" select="$toc-context"/>
+ <xsl:with-param name="nodes" select="sect5
+ |bridgehead[$bridgehead.in.toc != 0]"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="sect5" mode="toc">
+ <xsl:param name="toc-context" select="."/>
+
+ <xsl:call-template name="subtoc">
+ <xsl:with-param name="toc-context" select="$toc-context"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="simplesect" mode="toc">
+ <xsl:param name="toc-context" select="."/>
+
+ <xsl:call-template name="subtoc">
+ <xsl:with-param name="toc-context" select="$toc-context"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="section" mode="toc">
+ <xsl:param name="toc-context" select="."/>
+
+ <xsl:call-template name="subtoc">
+ <xsl:with-param name="toc-context" select="$toc-context"/>
+ <xsl:with-param name="nodes" select="section|refentry
+ |simplesect[$simplesect.in.toc != 0]
+ |bridgehead[$bridgehead.in.toc != 0]"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="bridgehead" mode="toc">
+ <xsl:param name="toc-context" select="."/>
+
+ <xsl:if test="$bridgehead.in.toc != 0">
+ <xsl:call-template name="subtoc">
+ <xsl:with-param name="toc-context" select="$toc-context"/>
+ </xsl:call-template>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="bibliography|glossary" mode="toc">
+ <xsl:param name="toc-context" select="."/>
+
+ <xsl:call-template name="subtoc">
+ <xsl:with-param name="toc-context" select="$toc-context"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="index" mode="toc">
+ <xsl:param name="toc-context" select="."/>
+
+ <!-- If the index tag is not empty, it should be it in the TOC -->
+ <xsl:if test="* or $generate.index != 0">
+ <xsl:call-template name="subtoc">
+ <xsl:with-param name="toc-context" select="$toc-context"/>
+ </xsl:call-template>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="refentry" mode="toc">
+ <xsl:param name="toc-context" select="."/>
+
+ <xsl:variable name="refmeta" select=".//refmeta"/>
+ <xsl:variable name="refentrytitle" select="$refmeta//refentrytitle"/>
+ <xsl:variable name="refnamediv" select=".//refnamediv"/>
+ <xsl:variable name="refname" select="$refnamediv//refname"/>
+ <xsl:variable name="refdesc" select="$refnamediv//refdescriptor"/>
+ <xsl:variable name="title">
+ <xsl:choose>
+ <xsl:when test="$refentrytitle">
+ <xsl:apply-templates select="$refentrytitle[1]"
+ mode="titleabbrev.markup"/>
+ </xsl:when>
+ <xsl:when test="$refdesc">
+ <xsl:apply-templates select="$refdesc"
+ mode="titleabbrev.markup"/>
+ </xsl:when>
+ <xsl:when test="$refname">
+ <xsl:apply-templates select="$refname[1]"
+ mode="titleabbrev.markup"/>
+ </xsl:when>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:element name="{$toc.listitem.type}">
+ <span class='refentrytitle'>
+ <a>
+ <xsl:attribute name="href">
+ <xsl:call-template name="href.target">
+ <xsl:with-param name="toc-context" select="$toc-context"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:copy-of select="$title"/>
+ </a>
+ </span>
+ <span class='refpurpose'>
+ <xsl:if test="$annotate.toc != 0">
+ <!-- * DocBook 5 says inlinemediaobject (among other things) -->
+ <!-- * is allowed in refpurpose; so we need to run -->
+ <!-- * apply-templates on refpurpose here, instead of value-of -->
+ <xsl:apply-templates select="refnamediv/refpurpose"/>
+ </xsl:if>
+ </span>
+ </xsl:element>
+</xsl:template>
+
+<xsl:template match="title" mode="toc">
+ <xsl:param name="toc-context" select="."/>
+
+ <a>
+ <xsl:attribute name="href">
+ <xsl:call-template name="href.target">
+ <xsl:with-param name="object" select=".."/>
+ <xsl:with-param name="toc-context" select="$toc-context"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:apply-templates/>
+ </a>
+</xsl:template>
+
+<xsl:template name="manual-toc">
+ <xsl:param name="toc-context" select="."/>
+ <xsl:param name="tocentry"/>
+
+ <!-- be careful, we don't want to change the current document to the other tree! -->
+
+ <xsl:if test="$tocentry">
+ <xsl:variable name="node" select="key('id', $tocentry/@linkend)"/>
+
+ <xsl:element name="{$toc.listitem.type}">
+ <xsl:variable name="label">
+ <xsl:apply-templates select="$node" mode="label.markup"/>
+ </xsl:variable>
+ <xsl:copy-of select="$label"/>
+ <xsl:if test="$label != ''">
+ <xsl:value-of select="$autotoc.label.separator"/>
+ </xsl:if>
+ <a>
+ <xsl:attribute name="href">
+ <xsl:call-template name="href.target">
+ <xsl:with-param name="object" select="$node"/>
+ <xsl:with-param name="toc-context" select="$toc-context"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:apply-templates select="$node" mode="titleabbrev.markup"/>
+ </a>
+ </xsl:element>
+
+ <xsl:if test="$tocentry/*">
+ <xsl:element name="{$toc.list.type}">
+ <xsl:call-template name="manual-toc">
+ <xsl:with-param name="tocentry" select="$tocentry/*[1]"/>
+ </xsl:call-template>
+ </xsl:element>
+ </xsl:if>
+
+ <xsl:if test="$tocentry/following-sibling::*">
+ <xsl:call-template name="manual-toc">
+ <xsl:with-param name="tocentry" select="$tocentry/following-sibling::*[1]"/>
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:if>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template name="list.of.titles">
+ <xsl:param name="toc-context" select="."/>
+ <xsl:param name="titles" select="'table'"/>
+ <xsl:param name="nodes" select=".//table"/>
+
+ <xsl:if test="$nodes">
+ <div class="list-of-{$titles}s">
+ <xsl:choose>
+ <xsl:when test="$make.clean.html != 0">
+ <div class="toc-title">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key">
+ <xsl:choose>
+ <xsl:when test="$titles='table'">ListofTables</xsl:when>
+ <xsl:when test="$titles='figure'">ListofFigures</xsl:when>
+ <xsl:when test="$titles='equation'">ListofEquations</xsl:when>
+ <xsl:when test="$titles='example'">ListofExamples</xsl:when>
+ <xsl:when test="$titles='procedure'">ListofProcedures</xsl:when>
+ <xsl:otherwise>ListofUnknown</xsl:otherwise>
+ </xsl:choose>
+ </xsl:with-param>
+ </xsl:call-template>
+ </div>
+ </xsl:when>
+ <xsl:otherwise>
+ <p>
+ <b>
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key">
+ <xsl:choose>
+ <xsl:when test="$titles='table'">ListofTables</xsl:when>
+ <xsl:when test="$titles='figure'">ListofFigures</xsl:when>
+ <xsl:when test="$titles='equation'">ListofEquations</xsl:when>
+ <xsl:when test="$titles='example'">ListofExamples</xsl:when>
+ <xsl:when test="$titles='procedure'">ListofProcedures</xsl:when>
+ <xsl:otherwise>ListofUnknown</xsl:otherwise>
+ </xsl:choose>
+ </xsl:with-param>
+ </xsl:call-template>
+ </b>
+ </p>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:element name="{$toc.list.type}">
+ <xsl:apply-templates select="$nodes" mode="toc">
+ <xsl:with-param name="toc-context" select="$toc-context"/>
+ </xsl:apply-templates>
+ </xsl:element>
+ </div>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="figure|table|example|equation|procedure" mode="toc">
+ <xsl:param name="toc-context" select="."/>
+
+ <xsl:element name="{$toc.listitem.type}">
+ <xsl:variable name="label">
+ <xsl:apply-templates select="." mode="label.markup"/>
+ </xsl:variable>
+ <xsl:copy-of select="$label"/>
+ <xsl:if test="$label != ''">
+ <xsl:value-of select="$autotoc.label.separator"/>
+ </xsl:if>
+ <a>
+ <xsl:attribute name="href">
+ <xsl:call-template name="href.target">
+ <xsl:with-param name="toc-context" select="$toc-context"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:apply-templates select="." mode="titleabbrev.markup"/>
+ </a>
+ </xsl:element>
+</xsl:template>
+
+<!-- Used only if qanda.in.toc parameter is non-zero -->
+<xsl:template match="qandaset" mode="toc">
+ <xsl:param name="toc-context" select="."/>
+ <xsl:call-template name="subtoc">
+ <xsl:with-param name="toc-context" select="$toc-context"/>
+ <xsl:with-param name="nodes" select="qandadiv | qandaentry"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="qandadiv|qandaentry" mode="toc">
+ <xsl:apply-templates select="." mode="qandatoc.mode"/>
+</xsl:template>
+
+</xsl:stylesheet>
+
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/biblio-iso690.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/biblio-iso690.xsl
new file mode 100644
index 0000000..d420bec
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/biblio-iso690.xsl
@@ -0,0 +1,1300 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version='1.0'>
+
+
+<!-- ********************************************************************
+ $Id: biblio.xsl 6402 2006-11-12 08:23:21Z bobstayton $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ The original code for processing bibliography in ISO690 style
+ was provided by Jana Dvorakova <jana4u@seznam.cz>
+
+ ******************************************************************** -->
+
+<!-- ==================================================================== -->
+
+<!-- if biblioentry.alt.primary.seps is set to nonzero value then use alternative separators for primary responsibility - $alt.person.two.sep, $alt.person.last.sep, $alt.person.more.sep -->
+<xsl:param name="biblioentry.alt.primary.seps" select="0"/>
+
+<!-- how many authors will be printed if there is more than three authors - set to number 1 (default value), 2 or 3 -->
+<xsl:param name="biblioentry.primary.count" select="1"/>
+
+<!-- ==================================================================== -->
+
+<xsl:template name="iso690.makecitation">
+<!-- Types of resources -->
+ <xsl:choose>
+
+ <!-- SYSTEMS OF ELECTRONIC COMMUNICATION : ENTIRE MESSAGE SYSTEM -->
+ <!-- same as Monographs -->
+ <xsl:when test="./@role='messagesystem'">
+ <xsl:call-template name="iso690.monogr"/>
+ </xsl:when>
+
+ <!-- SYSTEMS OF ELECTRONIC COMMUNICATION : ELECTRONIC MESSAGES -->
+ <!-- same as Contributions to Monographs -->
+ <xsl:when test="./@role='message'">
+ <xsl:call-template name="iso690.paper.mon"/>
+ </xsl:when>
+
+ <!-- SERIALS -->
+ <xsl:when test="./@role='serial' or ./biblioid/@class='issn' or ./issn">
+ <xsl:call-template name="iso690.serial"/>
+ </xsl:when>
+
+ <!-- PARTS OF MONOGRAPHS -->
+ <xsl:when test="./@role='part' or (./bibliomisc[@role='secnum']|./bibliomisc[@role='sectitle'])">
+ <xsl:call-template name="iso690.monogr.part"/>
+ </xsl:when>
+
+ <!-- CONTRIBUTIONS TO MONOGRAPHS -->
+ <xsl:when test="./@role='contribution' or (./biblioset/@relation='part' and ./biblioset/@relation='book')">
+ <xsl:call-template name="iso690.paper.mon"/>
+ </xsl:when>
+
+ <!-- ARTICLES, ETC., IN SERIALS -->
+ <xsl:when test="./@role='article' or (./biblioset/@relation='journal' and ./biblioset/@relation='article')">
+ <xsl:call-template name="iso690.article"/>
+ </xsl:when>
+
+ <!-- PATENT DOCUMENTS -->
+ <xsl:when test="./@role='patent' or (./bibliomisc[@role='patenttype'] and ./bibliomisc[@role='patentnum'])">
+ <xsl:call-template name="iso690.patent"/>
+ </xsl:when>
+
+ <!-- MONOGRAPHS -->
+ <xsl:otherwise>
+ <xsl:call-template name="iso690.monogr"/>
+ </xsl:otherwise>
+
+ </xsl:choose>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<!-- MONOGRAPHS -->
+<xsl:template name="iso690.monogr">
+ <!-- Primary responsibility -->
+ <xsl:call-template name="iso690.primary"/>
+ <!-- Title and Type of medium -->
+ <xsl:call-template name="iso690.title"/>
+ <!-- Subordinate responsibility -->
+ <xsl:call-template name="iso690.secondary"/>
+ <!-- Edition -->
+ <xsl:call-template name="iso690.edition"/>
+ <!-- Place of publication, Publisher, Year/Date of publication, Date of update/revision, Date of citation -->
+ <xsl:call-template name="iso690.pub"/>
+ <!-- Extent -->
+ <xsl:call-template name="iso690.extent"/>
+ <!-- Series -->
+ <xsl:call-template name="iso690.serie"/>
+ <!-- Notes -->
+ <xsl:call-template name="iso690.notice"/>
+ <!-- Avaibility and access -->
+ <xsl:call-template name="iso690.access"/>
+ <!-- Standard number -->
+ <xsl:call-template name="iso690.isbn"/>
+</xsl:template>
+
+<!-- SERIALS -->
+<xsl:template name="iso690.serial">
+ <!-- Title and Type of medium -->
+ <xsl:call-template name="iso690.title"/>
+ <!-- Responsibility [nonEL] -->
+ <xsl:if test="not(./bibliomisc[@role='medium'])">
+ <xsl:call-template name="iso690.secondary"/>
+ </xsl:if>
+ <!-- Edition -->
+ <xsl:call-template name="iso690.edition">
+ <xsl:with-param name="after" select="./bibliomisc[@role='issuing']"/>
+ </xsl:call-template>
+ <!-- Issue designation (date and/or num) [nonEL] -->
+ <xsl:if test="not(./bibliomisc[@role='medium'])">
+ <xsl:call-template name="iso690.issuing"/>
+ </xsl:if>
+ <!-- Place of publication, Publisher, Year/Date of publication, Date of update/revision, Date of citation -->
+ <xsl:call-template name="iso690.pub"/>
+ <!-- Series -->
+ <xsl:call-template name="iso690.serie"/>
+ <!-- Notes -->
+ <xsl:call-template name="iso690.notice"/>
+ <!-- Avaibility and access -->
+ <xsl:call-template name="iso690.access"/>
+ <!-- Standard number -->
+ <xsl:call-template name="iso690.issn"/>
+</xsl:template>
+
+<!-- PARTS OF MONOGRAPHS -->
+<xsl:template name="iso690.monogr.part">
+ <!-- Primary responsibility of host document -->
+ <xsl:call-template name="iso690.primary"/>
+ <!-- Title and Type of medium of host document -->
+ <xsl:call-template name="iso690.title"/>
+ <!-- Subordinate responsibility of host document [EL] -->
+ <xsl:if test="./bibliomisc[@role='medium']">
+ <xsl:call-template name="iso690.secondary"/>
+ </xsl:if>
+ <!-- Edition -->
+ <xsl:call-template name="iso690.edition">
+ <xsl:with-param name="after" select="./volumenum"/>
+ </xsl:call-template>
+ <!-- Numeration of the part [nonEL]-->
+ <xsl:if test="not(./bibliomisc[@role='medium'])">
+ <xsl:call-template name="iso690.partnr"/>
+ <!-- Subordinate responsibility [nonEL] -->
+ <xsl:call-template name="iso690.secondary"/>
+ </xsl:if>
+ <!-- Place of publication, Publisher, Year/Date of publication, Date of update/revision, Date of citation -->
+ <xsl:call-template name="iso690.pub"/>
+ <!-- Location within host -->
+ <xsl:call-template name="iso690.part.location"/>
+ <xsl:if test="./bibliomisc[@role='medium']">
+ <!-- Numeration within host document [EL] -->
+ <!-- Notes [EL] -->
+ <xsl:call-template name="iso690.notice"/>
+ <!-- Avaibility and access [EL] -->
+ <xsl:call-template name="iso690.access"/>
+ <!-- Standard number [EL] -->
+ <xsl:call-template name="iso690.isbn"/>
+ </xsl:if>
+</xsl:template>
+
+<!-- CONTRIBUTIONS TO MONOGRAPHS -->
+<xsl:template name="iso690.paper.mon">
+<!-- Contribution -->
+ <xsl:apply-templates mode="iso690.paper.part" select="./biblioset[@relation='part']"/>
+<!-- In -->
+ <xsl:text>In </xsl:text>
+<!-- Host -->
+ <xsl:apply-templates mode="iso690.paper.book" select="./biblioset[@relation='book']"/>
+</xsl:template>
+
+<xsl:template match="biblioset" mode="iso690.paper.part">
+<!-- Contribution -->
+ <!-- Primary responsibility -->
+ <xsl:call-template name="iso690.primary"/>
+ <!-- Title -->
+ <xsl:call-template name="iso690.title">
+ <xsl:with-param name="italic" select="0"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="biblioset" mode="iso690.paper.book">
+<!-- Host -->
+ <!-- Primary responsibility -->
+ <xsl:call-template name="iso690.primary"/>
+ <!-- Title and Type of medium -->
+ <xsl:call-template name="iso690.title"/>
+ <!-- Subordinate responsibility [EL] -->
+ <xsl:if test="./bibliomisc[@role='medium']">
+ <xsl:call-template name="iso690.secondary"/>
+ </xsl:if>
+ <!-- Edition -->
+ <xsl:call-template name="iso690.edition"/>
+ <!-- Place of publication, Publisher, Year/Date of publication, Date of update/revision, Date of citation -->
+ <xsl:call-template name="iso690.paper.pub"/>
+ <!-- Numeration within host document [EL] -->
+ <!-- Location within host -->
+ <xsl:call-template name="iso690.location"/>
+ <xsl:if test="./bibliomisc[@role='medium']">
+ <!-- Notes [EL] -->
+ <xsl:call-template name="iso690.notice"/>
+ <!-- Avaibility and access [EL] -->
+ <xsl:call-template name="iso690.access"/>
+ <!-- Standard number [EL] -->
+ <xsl:call-template name="iso690.isbn"/>
+ </xsl:if>
+</xsl:template>
+
+<!-- ARTICLES, ETC., IN SERIALS -->
+<xsl:template name="iso690.article">
+<!-- Article -->
+ <xsl:apply-templates mode="iso690.article.art" select="./biblioset[@relation='article']"/>
+<!-- Serial -->
+ <xsl:apply-templates mode="iso690.article.jour" select="./biblioset[@relation='journal']"/>
+</xsl:template>
+
+<xsl:template match="biblioset" mode="iso690.article.art">
+<!-- Article -->
+ <!-- Primary responsibility -->
+ <xsl:call-template name="iso690.primary"/>
+ <!-- Title -->
+ <xsl:call-template name="iso690.title">
+ <xsl:with-param name="italic" select="0"/>
+ </xsl:call-template>
+ <!-- Subordinate responsibility [nonEL] -->
+ <xsl:if test="not(../*/bibliomisc[@role='medium'])">
+ <xsl:call-template name="iso690.secondary"/>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="biblioset" mode="iso690.article.jour">
+<!-- Serial -->
+ <!-- Title and Type of medium -->
+ <xsl:call-template name="iso690.title"/>
+ <!-- Edition -->
+ <xsl:call-template name="iso690.edition">
+ <xsl:with-param name="after" select="./pubdate[not(@role='issuing')]|./volumenum|./issuenum|./pagenums"/>
+ </xsl:call-template>
+ <!-- Number designation [EL] -->
+ <!-- Location within host -->
+ <xsl:call-template name="iso690.article.location"/>
+ <xsl:if test="./bibliomisc[@role='medium']">
+ <!-- Notes [EL] -->
+ <xsl:call-template name="iso690.notice"/>
+ <!-- Avaibility and access [EL] -->
+ <xsl:call-template name="iso690.access"/>
+ <!-- Standard number [EL] -->
+ <xsl:call-template name="iso690.issn"/>
+ </xsl:if>
+</xsl:template>
+
+<!-- PATENT DOCUMENTS -->
+<xsl:template name="iso690.patent">
+ <!-- Primary responsibility (applicant) -->
+ <xsl:call-template name="iso690.primary"/>
+ <!-- Title of the invention -->
+ <xsl:call-template name="iso690.title"/>
+ <!-- Subordinate responsibility -->
+ <xsl:call-template name="iso690.secondary"/>
+ <!-- Notes -->
+ <xsl:call-template name="iso690.notice"/>
+ <!-- Identification -->
+ <xsl:call-template name="iso690.pat.ident"/>
+</xsl:template>
+
+<!-- ==================================================================== -->
+<!-- Elements -->
+
+<!-- Primary responsibility -->
+<xsl:template name="iso690.primary">
+ <xsl:param name="primary.sep">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'primary.sep'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:choose>
+ <xsl:when test="./authorgroup/author|./author">
+ <xsl:call-template name="iso690.author.list">
+ <xsl:with-param name="person.list" select=".//authorgroup/author|.//author"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="./authorgroup/editor|./editor">
+ <xsl:call-template name="iso690.author.list">
+ <xsl:with-param name="person.list" select=".//authorgroup/editor|.//editor"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="./authorgroup/corpauthor|./corpauthor">
+ <xsl:call-template name="iso690.author.list">
+ <xsl:with-param name="person.list" select=".//authorgroup/corpauthor|.//corpauthor"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:if test="(./firstname)and(./surname)">
+ <xsl:call-template name="iso690.author"/>
+ <xsl:call-template name="iso690.endsep">
+ <xsl:with-param name="text" select="string(./firstname[1])"/>
+ <xsl:with-param name="sep" select="$primary.sep"/>
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="iso690.author.list">
+ <xsl:param name="person.list"
+ select="author|corpauthor|editor"/>
+ <xsl:param name="person.count" select="count($person.list)"/>
+ <xsl:param name="count" select="1"/>
+ <xsl:param name="group" select="./authorgroup[@role='many']"/>
+ <xsl:param name="many" select="0"/>
+
+ <xsl:param name="primary.many">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'primary.many'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:param name="primary.editor">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'primary.editor'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:param name="primary.sep">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'primary.sep'"/></xsl:call-template>
+ </xsl:param>
+
+ <xsl:choose>
+ <xsl:when test="$count &gt; $person.count"></xsl:when>
+ <xsl:otherwise>
+ <xsl:choose>
+ <xsl:when test="$person.count &lt; 4 and not($group)">
+ <xsl:call-template name="iso690.author">
+ <xsl:with-param name="node" select="$person.list[position()=$count]"/>
+ </xsl:call-template>
+ <xsl:choose>
+ <xsl:when test="$person.count = 2 and $count = 1 and $biblioentry.alt.primary.seps != 0">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'alt.person.two.sep'"/></xsl:call-template>
+ </xsl:when>
+ <xsl:when test="$person.count = 2 and $count = 1">
+ <xsl:call-template name="gentext.template">
+ <xsl:with-param name="context" select="'authorgroup'"/>
+ <xsl:with-param name="name" select="'sep2'"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="$person.count &gt; 2 and $count+1 = $person.count and $biblioentry.alt.primary.seps != 0">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'alt.person.last.sep'"/></xsl:call-template>
+ </xsl:when>
+ <xsl:when test="$person.count &gt; 2 and $count+1 = $person.count">
+ <xsl:call-template name="gentext.template">
+ <xsl:with-param name="context" select="'authorgroup'"/>
+ <xsl:with-param name="name" select="'seplast'"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="$count &lt; $person.count and $biblioentry.alt.primary.seps != 0">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'alt.person.more.sep'"/></xsl:call-template>
+ </xsl:when>
+ <xsl:when test="$count &lt; $person.count">
+ <xsl:call-template name="gentext.template">
+ <xsl:with-param name="context" select="'authorgroup'"/>
+ <xsl:with-param name="name" select="'sep'"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="($count = $person.count)">
+ <xsl:choose>
+ <xsl:when test="$many!=0">
+ <xsl:if test="name($person.list[position()=$count])='editor'">
+ <xsl:value-of select="$primary.editor"/>
+ </xsl:if>
+ <xsl:value-of select="$primary.many"/>
+ <xsl:call-template name="iso690.endsep">
+ <xsl:with-param name="text" select="$primary.many"/>
+ <xsl:with-param name="sep" select="$primary.sep"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="name($person.list[position()=$count])='editor'">
+ <xsl:value-of select="$primary.editor"/>
+ <xsl:value-of select="$primary.sep"/>
+ </xsl:when>
+ <xsl:when test="name($person.list[position()=$count])='corpauthor'">
+ <xsl:call-template name="iso690.endsep">
+ <xsl:with-param name="text" select="string($person.list[position()=$count])"/>
+ <xsl:with-param name="sep" select="$primary.sep"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="iso690.endsep">
+ <xsl:with-param name="text" select="string($person.list[position()=$count]//firstname[1])"/>
+ <xsl:with-param name="sep" select="$primary.sep"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ </xsl:choose>
+
+ <xsl:call-template name="iso690.author.list">
+ <xsl:with-param name="person.list" select="$person.list"/>
+ <xsl:with-param name="person.count" select="$person.count"/>
+ <xsl:with-param name="count" select="$count+1"/>
+ <xsl:with-param name="many" select="$many"/>
+ <xsl:with-param name="group"/>
+ </xsl:call-template>
+ </xsl:when>
+
+ <xsl:otherwise>
+ <xsl:choose>
+ <xsl:when test="($biblioentry.primary.count&gt;=3) and ($person.count&gt;=3)">
+ <xsl:call-template name="iso690.author.list">
+ <xsl:with-param name="person.list" select="$person.list[1]|$person.list[2]|$person.list[3]"/>
+ <xsl:with-param name="person.count" select="3"/>
+ <xsl:with-param name="count" select="1"/>
+ <xsl:with-param name="many" select="1"/>
+ <xsl:with-param name="group"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="($biblioentry.primary.count&gt;1) and ($person.count&gt;1)">
+ <xsl:call-template name="iso690.author.list">
+ <xsl:with-param name="person.list" select="$person.list[1]|$person.list[2]"/>
+ <xsl:with-param name="person.count" select="2"/>
+ <xsl:with-param name="count" select="1"/>
+ <xsl:with-param name="many" select="1"/>
+ <xsl:with-param name="group"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="iso690.author.list">
+ <xsl:with-param name="person.list" select="$person.list[1]"/>
+ <xsl:with-param name="person.count" select="1"/>
+ <xsl:with-param name="count" select="1"/>
+ <xsl:with-param name="many" select="1"/>
+ <xsl:with-param name="group"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="iso690.author">
+ <xsl:param name="node" select="."/>
+ <xsl:param name="lastfirst.sep">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'lastfirst.sep'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:choose>
+ <xsl:when test="name($node)!='corpauthor'">
+ <span style="text-transform:uppercase">
+ <xsl:apply-templates mode="iso690.mode" select="$node//surname[1]"/>
+ </span>
+ <xsl:if test="$node//surname and $node//firstname">
+ <xsl:value-of select="$lastfirst.sep"/>
+ </xsl:if>
+ <xsl:apply-templates mode="iso690.mode" select="$node//firstname[1]"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <span style="text-transform:uppercase">
+ <xsl:apply-templates mode="iso690.mode" select="$node"/>
+ </span>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="corpauthor|firstname|surname" mode="iso690.mode">
+ <xsl:apply-templates mode="iso690.mode"/>
+</xsl:template>
+
+<!-- Title and Type of medium -->
+<xsl:template name="iso690.title">
+ <xsl:param name="medium" select="./bibliomisc[@role='medium']"/>
+ <xsl:param name="italic" select="1"/>
+ <xsl:param name="sep">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'title.sep'"/></xsl:call-template>
+ </xsl:param>
+
+ <xsl:apply-templates mode="iso690.mode" select="./title">
+ <xsl:with-param name="medium" select="$medium"/>
+ <xsl:with-param name="italic" select="$italic"/>
+ <xsl:with-param name="sep" select="$sep"/>
+ </xsl:apply-templates>
+</xsl:template>
+
+<xsl:template match="title" mode="iso690.mode">
+ <xsl:param name="medium"/>
+ <xsl:param name="italic" select="1"/>
+ <xsl:param name="sep">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'title.sep'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:param name="medium1">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'medium1'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:param name="medium2">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'medium2'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:choose>
+ <xsl:when test="$italic=1">
+ <xsl:call-template name="iso690.italic.title"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="iso690.make.title"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:if test="$medium">
+ <xsl:value-of select="$medium1"/>
+ <xsl:apply-templates mode="iso690.mode" select="$medium"/>
+ <xsl:value-of select="$medium2"/>
+ </xsl:if>
+ <xsl:call-template name="iso690.endsep">
+ <xsl:with-param name="text" select="concat(string(.),string(../subtitle))"/>
+ <xsl:with-param name="sep" select="$sep"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template name="iso690.italic.title">
+ <i>
+ <xsl:call-template name="iso690.make.title"/>
+ </i>
+</xsl:template>
+
+<xsl:template name="iso690.make.title">
+ <xsl:param name="submaintitle.sep">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'submaintitle.sep'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:apply-templates mode="iso690.mode"/>
+ <xsl:if test="../subtitle">
+ <xsl:value-of select="$submaintitle.sep"/>
+ <xsl:apply-templates mode="iso690.mode" select="../subtitle"/>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="subtitle" mode="iso690.mode">
+ <xsl:apply-templates mode="iso690.mode"/>
+</xsl:template>
+
+<xsl:template match="bibliomisc[@role='medium']" mode="iso690.mode">
+ <xsl:apply-templates mode="iso690.mode"/>
+</xsl:template>
+
+<!-- Subordinate responsibility -->
+<xsl:template name="iso690.secondary">
+ <xsl:param name="secondary.sep">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'secondary.sep'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:param name="secondary.person.sep">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'secondary.person.sep'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:for-each select="./bibliomisc[@role='secondary']">
+ <xsl:apply-templates mode="iso690.mode" select="."/>
+ <xsl:choose>
+ <xsl:when test="position()=count(../bibliomisc[@role='secondary'])">
+ <xsl:call-template name="iso690.endsep">
+ <xsl:with-param name="text" select="string(.)"/>
+ <xsl:with-param name="sep" select="$secondary.sep"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$secondary.person.sep"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:for-each>
+</xsl:template>
+
+<xsl:template match="bibliomisc[@role='secondary']" mode="iso690.mode">
+ <xsl:apply-templates mode="iso690.mode"/>
+</xsl:template>
+
+<!-- Edition -->
+<xsl:template name="iso690.edition">
+ <xsl:param name="after"/>
+ <xsl:param name="edition.serial.sep">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'edition.serial.sep'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:choose>
+ <xsl:when test="string($after)!=''">
+ <xsl:apply-templates mode="iso690.mode" select="./edition">
+ <xsl:with-param name="sep" select="$edition.serial.sep"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates mode="iso690.mode" select="./edition"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="edition" mode="iso690.mode">
+ <xsl:param name="sep">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'edition.sep'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:apply-templates mode="iso690.mode"/>
+ <xsl:call-template name="iso690.endsep">
+ <xsl:with-param name="text" select="string(.)"/>
+ <xsl:with-param name="sep" select="$sep"/>
+ </xsl:call-template>
+</xsl:template>
+
+<!-- Issue designation (date and/or num) -->
+<xsl:template name="iso690.issuing">
+ <xsl:param name="issuing.div">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'issuing.div'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:param name="issuing.range">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'issuing.range'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:param name="issuing.sep">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'issuing.sep'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:choose>
+ <xsl:when test="./pubdate[@role='issuing'] and ./volumenum[2] and ./issuenum[2]">
+ <xsl:call-template name="iso690.issuedate"/>
+ <xsl:apply-templates mode="iso690.mode" select="./volumenum[1]">
+ <xsl:with-param name="sep" select="$issuing.div"/>
+ </xsl:apply-templates>
+ <xsl:apply-templates mode="iso690.mode" select="./issuenum[1]">
+ <xsl:with-param name="sep" select="$issuing.range"/>
+ </xsl:apply-templates>
+ <xsl:apply-templates mode="iso690.mode" select="./volumenum[2]">
+ <xsl:with-param name="sep" select="$issuing.div"/>
+ </xsl:apply-templates>
+ <xsl:apply-templates mode="iso690.mode" select="./issuenum[2]">
+ <xsl:with-param name="sep" select="$issuing.sep"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:when test="./pubdate[@role='issuing'] and ./volumenum[2]">
+ <xsl:call-template name="iso690.issuedate"/>
+ <xsl:apply-templates mode="iso690.mode" select="./volumenum[1]">
+ <xsl:with-param name="sep" select="$issuing.range"/>
+ </xsl:apply-templates>
+ <xsl:apply-templates mode="iso690.mode" select="./volumenum[2]">
+ <xsl:with-param name="sep" select="$issuing.sep"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:when test="./pubdate[@role='issuing'] and ./volumenum and ./issuenum">
+ <xsl:apply-templates mode="iso690.mode" select="./pubdate[@role='issuing']">
+ <xsl:with-param name="sep" select="$issuing.div"/>
+ </xsl:apply-templates>
+ <xsl:apply-templates mode="iso690.mode" select="./volumenum">
+ <xsl:with-param name="sep" select="$issuing.div"/>
+ </xsl:apply-templates>
+ <xsl:apply-templates mode="iso690.mode" select="./issuenum">
+ <xsl:with-param name="sep" select="$issuing.sep"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:when test="./pubdate[@role='issuing']">
+ <xsl:apply-templates mode="iso690.mode" select="./pubdate[@role='issuing']">
+ <xsl:with-param name="sep" select="$issuing.sep"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:when test="./volumenum">
+ <xsl:apply-templates mode="iso690.mode" select="./volumenum">
+ <xsl:with-param name="sep" select="$issuing.sep"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:when test="./issuenum">
+ <xsl:apply-templates mode="iso690.mode" select="./issuenum">
+ <xsl:with-param name="sep" select="$issuing.sep"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="iso690.issuedate">
+ <xsl:param name="issuing.div">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'issuing.div'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:param name="issuing.range">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'issuing.range'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:param name="issuing.sep">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'issuing.sep'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:choose>
+ <xsl:when test="./pubdate[@role='issuing'][2]">
+ <xsl:apply-templates mode="iso690.mode" select="./pubdate[@role='issuing'][1]">
+ <xsl:with-param name="sep" select="$issuing.range"/>
+ </xsl:apply-templates>
+ <xsl:apply-templates mode="iso690.mode" select="./pubdate[@role='issuing'][2]">
+ <xsl:with-param name="sep" select="$issuing.div"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates mode="iso690.mode" select="./pubdate[@role='issuing']">
+ <xsl:with-param name="sep" select="$issuing.div"/>
+ </xsl:apply-templates>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="pubdate[@role='issuing']" mode="iso690.mode">
+ <xsl:param name="sep"/>
+ <xsl:variable name="substr" select="substring(string(.),string-length(string(.)))"/>
+ <xsl:apply-templates mode="iso690.mode"/>
+ <xsl:call-template name="iso690.space">
+ <xsl:with-param name="text" select="$substr"/>
+ </xsl:call-template>
+ <xsl:choose>
+ <xsl:when test="$substr='-'">
+ <xsl:call-template name="iso690.endsep">
+ <xsl:with-param name="text" select="' '"/>
+ <xsl:with-param name="sep" select="$sep"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="iso690.endsep">
+ <xsl:with-param name="text" select="string(.)"/>
+ <xsl:with-param name="sep" select="$sep"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- Numeration of the part -->
+<xsl:template name="iso690.partnr">
+ <xsl:param name="partnr.sep">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'partnr.sep'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:apply-templates mode="iso690.mode" select="./volumenum">
+ <xsl:with-param name="sep" select="$partnr.sep"/>
+ </xsl:apply-templates>
+</xsl:template>
+
+<!-- Place of publication, Publisher, Year/Date of publication, Date of update/revision, Date of citation -->
+<xsl:template name="iso690.pub">
+ <xsl:param name="onlydate" select="0"/>
+ <xsl:param name="placesep">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'placepubl.sep'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:param name="pubsep">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'publyear.sep'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:param name="endsep">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'pubinfo.sep'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:choose>
+ <xsl:when test="(./publisher/publishername|./publishername|./publisher/address/city)and($onlydate=0)and(./pubdate[not(@role='issuing')]|./copyright/year|./date[@role='upd']|./date[@role='upd'])">
+ <xsl:apply-templates mode="iso690.mode" select="./publisher/address/city">
+ <xsl:with-param name="sep" select="$placesep"/>
+ </xsl:apply-templates>
+ <xsl:apply-templates mode="iso690.mode" select="./publisher/publishername|./publishername">
+ <xsl:with-param name="sep" select="$pubsep"/>
+ </xsl:apply-templates>
+ <xsl:apply-templates mode="iso690.mode" select="./pubdate[not(@role='issuing')]|./copyright/year">
+ <xsl:with-param name="sep" select="$endsep"/>
+ </xsl:apply-templates>
+ <xsl:if test="not(./pubdate[not(@role='issuing')]|./copyright/year)">
+ <xsl:call-template name="iso690.data">
+ <xsl:with-param name="sep" select="$endsep"/>
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:when>
+ <xsl:when test="(./publisher/publishername|./publishername)and(./publisher/address/city)and($onlydate=0)">
+ <xsl:apply-templates mode="iso690.mode" select="./publisher/address/city">
+ <xsl:with-param name="sep" select="$placesep"/>
+ </xsl:apply-templates>
+ <xsl:apply-templates mode="iso690.mode" select="./publisher/publishername|./publishername">
+ <xsl:with-param name="sep" select="$endsep"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:when test="($onlydate=1)or(./pubdate[not(@role='issuing')]|./copyright/year)">
+ <xsl:apply-templates mode="iso690.mode" select="./pubdate[not(@role='issuing')]|./copyright/year">
+ <xsl:with-param name="sep" select="$endsep"/>
+ </xsl:apply-templates>
+ <xsl:if test="$onlydate=1">
+ <xsl:call-template name="iso690.location">
+ <xsl:with-param name="onlypages" select="1"/>
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:when>
+ <xsl:when test="not(./pubdate[not(@role='issuing')]|./copyright/year)">
+ <xsl:call-template name="iso690.data">
+ <xsl:with-param name="sep" select="$endsep"/>
+ </xsl:call-template>
+ </xsl:when>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="iso690.paper.pub">
+ <xsl:param name="spec.pubinfo.sep">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'spec.pubinfo.sep'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:choose>
+ <xsl:when test="./volumnum|./issuenum|./pagenums">
+ <xsl:call-template name="iso690.pub">
+ <xsl:with-param name="endsep" select="$spec.pubinfo.sep"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="iso690.pub"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="iso690.data">
+ <xsl:param name="sep"/>
+ <xsl:param name="datecit2">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'datecit2'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:apply-templates mode="iso690.mode" select="./date[@role='upd']">
+ <xsl:with-param name="sep"/>
+ </xsl:apply-templates>
+ <xsl:apply-templates mode="iso690.mode" select="./date[@role='cit']"/>
+ <xsl:choose>
+ <xsl:when test="./date[@role='cit']">
+ <xsl:call-template name="iso690.endsep">
+ <xsl:with-param name="text" select="$datecit2"/>
+ <xsl:with-param name="sep" select="$sep"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="./date[@role='upd']">
+ <xsl:call-template name="iso690.endsep">
+ <xsl:with-param name="text" select="string(./date[@role='upd'])"/>
+ <xsl:with-param name="sep" select="$sep"/>
+ </xsl:call-template>
+ </xsl:when>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="publisher/address/city|publishername" mode="iso690.mode">
+ <xsl:param name="sep"/>
+ <xsl:param name="upd" select="0"/>
+ <xsl:apply-templates mode="iso690.mode"/>
+ <xsl:call-template name="iso690.endsep">
+ <xsl:with-param name="text" select="string(.)"/>
+ <xsl:with-param name="sep" select="$sep"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="pubdate|copyright/year" mode="iso690.mode">
+ <xsl:param name="sep"/>
+ <xsl:param name="upd" select="1"/>
+ <xsl:param name="datecit2">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'datecit2'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:variable name="substr" select="substring(string(.),string-length(string(.)))"/>
+ <xsl:if test="name(.)!='pubdate'">
+ <xsl:value-of select="'&#x00A9;'"/><!-- copyright -->
+ </xsl:if>
+ <xsl:apply-templates mode="iso690.mode"/>
+ <xsl:call-template name="iso690.space">
+ <xsl:with-param name="text" select="$substr"/>
+ </xsl:call-template>
+ <xsl:if test="$upd!=0">
+ <xsl:choose>
+ <xsl:when test="name(.)='pubdate'">
+ <xsl:apply-templates mode="iso690.mode" select="../date[@role='upd']"/>
+ <xsl:apply-templates mode="iso690.mode" select="../date[@role='cit']"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates mode="iso690.mode" select="../../date[@role='upd']"/>
+ <xsl:apply-templates mode="iso690.mode" select="../../date[@role='cit']"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:if>
+ <xsl:choose>
+ <xsl:when test="../date[@role='cit']|../../date[@role='cit'] and $upd!=0">
+ <xsl:call-template name="iso690.endsep">
+ <xsl:with-param name="text" select="$datecit2"/>
+ <xsl:with-param name="sep" select="$sep"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="../date[@role='upd']|../../date[@role='upd'] and $upd!=0">
+ <xsl:call-template name="iso690.endsep">
+ <xsl:with-param name="text" select="string(../date[@role='upd'])"/>
+ <xsl:with-param name="sep" select="$sep"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="$substr='-'">
+ <xsl:call-template name="iso690.endsep">
+ <xsl:with-param name="text" select="' '"/>
+ <xsl:with-param name="sep" select="$sep"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="iso690.endsep">
+ <xsl:with-param name="text" select="string(.)"/>
+ <xsl:with-param name="sep" select="$sep"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="iso690.space">
+ <xsl:param name="text" select="substring(string(.),string-length(string(.)))"/>
+ <xsl:if test="$text='-'">
+ <xsl:value-of select="' '"/>
+ </xsl:if>
+</xsl:template>
+
+<!-- Date of update/revision -->
+<xsl:template match="date[@role='upd']" mode="iso690.mode">
+ <xsl:param name="sep">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'upd.sep'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:value-of select="$sep"/>
+ <xsl:apply-templates mode="iso690.mode"/>
+</xsl:template>
+
+<!-- Date of citation -->
+<xsl:template match="date[@role='cit']" mode="iso690.mode">
+ <xsl:param name="datecit1">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'datecit1'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:param name="datecit2">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'datecit2'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:value-of select="$datecit1"/>
+ <xsl:apply-templates mode="iso690.mode"/>
+ <xsl:value-of select="$datecit2"/>
+</xsl:template>
+
+<!-- Extent -->
+<xsl:template name="iso690.extent">
+ <xsl:param name="extent.sep">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'extent.sep'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:apply-templates mode="iso690.mode" select="./pagenums">
+ <xsl:with-param name="sep" select="$extent.sep"/>
+ </xsl:apply-templates>
+</xsl:template>
+
+<!-- Location within host -->
+<xsl:template name="iso690.part.location">
+ <xsl:param name="location.sep">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'location.sep'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:choose>
+ <xsl:when test="./pagenums">
+ <xsl:apply-templates mode="iso690.mode" select="./bibliomisc[@role='secnum']"/>
+ <xsl:apply-templates mode="iso690.mode" select="./bibliomisc[@role='sectitle']"/>
+ <xsl:apply-templates mode="iso690.mode" select="./pagenums"/>
+ </xsl:when>
+ <xsl:when test="./bibliomisc[@role='sectitle']">
+ <xsl:apply-templates mode="iso690.mode" select="./bibliomisc[@role='secnum']"/>
+ <xsl:apply-templates mode="iso690.mode" select="./bibliomisc[@role='sectitle']">
+ <xsl:with-param name="sep" select="$location.sep"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates mode="iso690.mode" select="./bibliomisc[@role='secnum']">
+ <xsl:with-param name="sep" select="$location.sep"/>
+ </xsl:apply-templates>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="iso690.article.location">
+ <xsl:param name="location.sep">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'location.sep'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:param name="locs.sep">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'locs.sep'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:choose>
+ <xsl:when test="not(./date[@role='upd']|./date[@role='cit'])">
+ <xsl:choose>
+ <xsl:when test="./volumenum|./issuenum|./pagenums">
+ <xsl:apply-templates mode="iso690.mode" select="./pubdate[not(@role='issuing')]">
+ <xsl:with-param name="upd" select="0"/>
+ <xsl:with-param name="sep" select="$locs.sep"/>
+ </xsl:apply-templates>
+ <xsl:call-template name="iso690.location"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates mode="iso690.mode" select="./pubdate[not(@role='issuing')]">
+ <xsl:with-param name="sep" select="$location.sep"/>
+ </xsl:apply-templates>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:choose>
+ <xsl:when test="./volumenum|./issuenum|./pagenums">
+ <xsl:apply-templates mode="iso690.mode" select="./pubdate[not(@role='issuing')]">
+ <xsl:with-param name="upd" select="0"/>
+ <xsl:with-param name="sep" select="$locs.sep"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates mode="iso690.mode" select="./pubdate[not(@role='issuing')]">
+ <xsl:with-param name="upd" select="0"/>
+ <xsl:with-param name="sep" select="$location.sep"/>
+ </xsl:apply-templates>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:choose>
+ <xsl:when test="./issuenum">
+ <xsl:apply-templates mode="iso690.mode" select="./volumenum"/>
+ <xsl:apply-templates mode="iso690.mode" select="./issuenum">
+ <xsl:with-param name="sep"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates mode="iso690.mode" select="./volumenum">
+ <xsl:with-param name="sep"/>
+ </xsl:apply-templates>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:choose>
+ <xsl:when test="./pagenums">
+ <xsl:call-template name="iso690.data">
+ <xsl:with-param name="sep" select="$locs.sep"/>
+ </xsl:call-template>
+ <xsl:apply-templates mode="iso690.mode" select="./pagenums"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="iso690.data">
+ <xsl:with-param name="sep" select="$location.sep"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="iso690.location">
+ <xsl:param name="location.sep">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'location.sep'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:choose>
+ <xsl:when test="./volumenum and not(./issuenum) and not(./pagenums)">
+ <xsl:apply-templates mode="iso690.mode" select="./volumenum">
+ <xsl:with-param name="sep" select="$location.sep"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:when test="./issuenum and not(./pagenums)">
+ <xsl:apply-templates mode="iso690.mode" select="./volumenum"/>
+ <xsl:apply-templates mode="iso690.mode" select="./issuenum">
+ <xsl:with-param name="sep" select="$location.sep"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:when test="./pagenums">
+ <xsl:apply-templates mode="iso690.mode" select="./volumenum"/>
+ <xsl:apply-templates mode="iso690.mode" select="./issuenum"/>
+ <xsl:apply-templates mode="iso690.mode" select="./pagenums"/>
+ </xsl:when>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="bibliomisc[@role='secnum']|bibliomisc[@role='sectitle']" mode="iso690.mode">
+ <xsl:param name="sep">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'locs.sep'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:apply-templates mode="iso690.mode"/>
+ <xsl:call-template name="iso690.endsep">
+ <xsl:with-param name="text" select="string(.)"/>
+ <xsl:with-param name="sep" select="$sep"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="volumenum|issuenum" mode="iso690.mode">
+ <xsl:param name="sep">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'locs.sep'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:apply-templates mode="iso690.mode"/>
+ <xsl:call-template name="iso690.endsep">
+ <xsl:with-param name="text" select="string(.)"/>
+ <xsl:with-param name="sep" select="$sep"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="pagenums" mode="iso690.mode">
+ <xsl:param name="sep">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'location.sep'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:apply-templates mode="iso690.mode"/>
+ <xsl:call-template name="iso690.endsep">
+ <xsl:with-param name="text" select="string(.)"/>
+ <xsl:with-param name="sep" select="$sep"/>
+ </xsl:call-template>
+</xsl:template>
+
+<!-- Series -->
+<xsl:template name="iso690.serie">
+ <xsl:apply-templates mode="iso690.mode" select=".//bibliomisc[@role='serie']"/>
+</xsl:template>
+
+<!-- Notes -->
+<xsl:template name="iso690.notice">
+ <xsl:apply-templates mode="iso690.mode" select=".//bibliomisc[not(@role)]"/>
+</xsl:template>
+
+<xsl:template match="bibliomisc[not(@role)]|bibliomisc[@role='serie']" mode="iso690.mode">
+ <xsl:param name="notice.sep">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'notice.sep'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:apply-templates mode="iso690.mode"/>
+ <xsl:call-template name="iso690.endsep">
+ <xsl:with-param name="text" select="string(.)"/>
+ <xsl:with-param name="sep" select="$notice.sep"/>
+ </xsl:call-template>
+</xsl:template>
+
+<!-- Avaibility and access -->
+<xsl:template name="iso690.access">
+ <xsl:for-each select="./biblioid[@class='uri']|./bibliomisc[@role='access']">
+ <xsl:choose>
+ <xsl:when test="position()=1">
+ <xsl:apply-templates mode="iso690.mode" select="."/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates mode="iso690.mode" select=".">
+ <xsl:with-param name="firstacc" select="0"/>
+ </xsl:apply-templates>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:for-each>
+</xsl:template>
+
+<xsl:template match="biblioid[@class='uri']/ulink|bibliomisc[@role='access']/ulink" mode="iso690.mode">
+ <xsl:param name="link1">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'link1'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:param name="link2">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'link2'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:value-of select="$link1"/>
+ <xsl:call-template name="ulink"/>
+ <xsl:value-of select="$link2"/>
+</xsl:template>
+
+<xsl:template match="biblioid[@class='uri']|bibliomisc[@role='access']" mode="iso690.mode">
+ <xsl:param name="firstacc" select="1"/>
+ <xsl:param name="access">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'access'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:param name="acctoo">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'acctoo'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:param name="onwww">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'onwww'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:param name="oninet">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'oninet'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:param name="access.end">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'access.end'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:param name="access.sep">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'access.sep'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:choose>
+ <xsl:when test="$firstacc=1">
+ <xsl:value-of select="$access"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$acctoo"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:choose>
+ <xsl:when test="(./ulink)and(string(./ulink)=string(.))">
+ <xsl:choose>
+ <xsl:when test="(starts-with(./ulink/@url,'http://')or(starts-with(./ulink/@url,'https://')))">
+ <xsl:value-of select="$onwww"/>
+ <xsl:value-of select="$access.end"/>
+ <xsl:apply-templates mode="iso690.mode" select="./ulink"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$oninet"/>
+ <xsl:value-of select="$access.end"/>
+ <xsl:apply-templates mode="iso690.mode" select="./ulink"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:when test="(./ulink)and(string(./ulink)!=string(.))">
+ <xsl:value-of select="text()[1]"/>
+ <xsl:call-template name="iso690.endsep">
+ <xsl:with-param name="text" select="text()[1]"/>
+ <xsl:with-param name="sep" select="$access.end"/>
+ </xsl:call-template>
+ <xsl:apply-templates mode="iso690.mode" select="./ulink"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates mode="iso690.mode"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:value-of select="$access.sep"/>
+</xsl:template>
+
+<!-- Standard number - ISBN -->
+<xsl:template name="iso690.isbn">
+ <xsl:choose>
+ <xsl:when test="./biblioid/@class='isbn'">
+ <xsl:apply-templates mode="iso690.mode" select="./biblioid[@class='isbn']"/>
+ </xsl:when>
+ <xsl:when test="./isbn">
+ <xsl:apply-templates mode="iso690.mode" select="./isbn"/>
+ </xsl:when>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="isbn|biblioid[@class='isbn']" mode="iso690.mode">
+ <xsl:param name="isbn">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'isbn'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:param name="stdnum.sep">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'stdnum.sep'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:value-of select="$isbn"/>
+ <xsl:apply-templates mode="iso690.mode"/>
+ <xsl:value-of select="$stdnum.sep"/>
+</xsl:template>
+
+<!-- Standard number - ISSN -->
+<xsl:template name="iso690.issn">
+ <xsl:choose>
+ <xsl:when test="./biblioid/@class='issn'">
+ <xsl:apply-templates mode="iso690.mode" select="./biblioid[@class='issn']"/>
+ </xsl:when>
+ <xsl:when test="./issn">
+ <xsl:apply-templates mode="iso690.mode" select="./issn"/>
+ </xsl:when>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="issn|biblioid[@class='issn']" mode="iso690.mode">
+ <xsl:param name="issn">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'issn'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:param name="stdnum.sep">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'stdnum.sep'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:value-of select="$issn"/>
+ <xsl:apply-templates mode="iso690.mode"/>
+ <xsl:value-of select="$stdnum.sep"/>
+</xsl:template>
+
+<!-- Identification of patent document -->
+<xsl:template name="iso690.pat.ident">
+ <xsl:param name="patdate.sep">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'patdate.sep'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:apply-templates mode="iso690.mode" select="./address/country"/>
+ <xsl:apply-templates mode="iso690.mode" select="./bibliomisc[@role='patenttype']"/>
+ <xsl:choose>
+ <xsl:when test="./biblioid[@class='other' and @otherclass='patentnum']">
+ <xsl:apply-templates mode="iso690.mode" select="./biblioid[@class='other' and @otherclass='patentnum']"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates mode="iso690.mode" select="./bibliomisc[@role='patentnum']"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:apply-templates mode="iso690.mode" select="./pubdate[not(@role='issuing')]">
+ <xsl:with-param name="sep" select="$patdate.sep"/>
+ </xsl:apply-templates>
+</xsl:template>
+
+<!-- Country or issuing office -->
+<xsl:template match="address/country" mode="iso690.mode">
+ <xsl:param name="patcountry.sep">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'patcountry.sep'"/></xsl:call-template>
+ </xsl:param>
+ <i>
+ <xsl:apply-templates mode="iso690.mode"/>
+ </i>
+ <xsl:value-of select="$patcountry.sep"/>
+</xsl:template>
+
+<!-- Kind of patent document -->
+<xsl:template match="bibliomisc[@role='patenttype']" mode="iso690.mode">
+ <xsl:param name="pattype.sep">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'pattype.sep'"/></xsl:call-template>
+ </xsl:param>
+ <i>
+ <xsl:apply-templates mode="iso690.mode"/>
+ </i>
+ <xsl:value-of select="$pattype.sep"/>
+</xsl:template>
+
+<!-- Number -->
+<xsl:template match="biblioid[@class='other' and @otherclass='patentnum']|bibliomisc[@role='patentnum']" mode="iso690.mode">
+ <xsl:param name="patnum.sep">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'patnum.sep'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:apply-templates mode="iso690.mode"/>
+ <xsl:value-of select="$patnum.sep"/>
+</xsl:template>
+
+<!-- ==================================================================== -->
+<!-- Supplementary templates -->
+
+<xsl:template name="iso690.endsep">
+ <xsl:param name="text"/>
+ <xsl:param name="sep" select=". "/>
+ <xsl:choose>
+ <xsl:when test="substring($text,string-length($text))!=substring($sep,1,1)">
+ <xsl:value-of select="$sep"/>
+ </xsl:when>
+ <xsl:when test="substring($text,string-length($text))=' '">
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="' '"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="*" mode="iso690.mode">
+ <xsl:apply-templates select="."/><!-- try the default mode -->
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/biblio.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/biblio.xsl
new file mode 100644
index 0000000..f145bb9
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/biblio.xsl
@@ -0,0 +1,1253 @@
+<?xml version='1.0'?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version='1.0'>
+
+<!-- ********************************************************************
+ $Id: biblio.xsl 8421 2009-05-04 07:49:49Z bobstayton $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<!-- ==================================================================== -->
+
+<xsl:template match="bibliography">
+ <xsl:call-template name="id.warning"/>
+
+ <div>
+ <xsl:call-template name="common.html.attributes">
+ <xsl:with-param name="inherit" select="1"/>
+ </xsl:call-template>
+ <xsl:if test="$generate.id.attributes != 0">
+ <xsl:attribute name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:call-template name="bibliography.titlepage"/>
+
+ <xsl:apply-templates/>
+
+ <xsl:if test="not(parent::article)">
+ <xsl:call-template name="process.footnotes"/>
+ </xsl:if>
+ </div>
+</xsl:template>
+
+<xsl:template match="bibliography/bibliographyinfo"></xsl:template>
+<xsl:template match="bibliography/info"></xsl:template>
+<xsl:template match="bibliography/title"></xsl:template>
+<xsl:template match="bibliography/subtitle"></xsl:template>
+<xsl:template match="bibliography/titleabbrev"></xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="bibliodiv">
+ <xsl:call-template name="id.warning"/>
+
+ <div>
+ <xsl:call-template name="common.html.attributes">
+ <xsl:with-param name="inherit" select="0"/>
+ </xsl:call-template>
+ <xsl:apply-templates/>
+ </div>
+</xsl:template>
+
+<xsl:template match="bibliodiv/title">
+ <h3>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:call-template name="anchor">
+ <xsl:with-param name="node" select=".."/>
+ <xsl:with-param name="conditional" select="0"/>
+ </xsl:call-template>
+ <xsl:apply-templates/>
+ </h3>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="bibliolist">
+ <div>
+ <xsl:call-template name="common.html.attributes">
+ <xsl:with-param name="inherit" select="0"/>
+ </xsl:call-template>
+ <xsl:call-template name="anchor"/>
+ <xsl:if test="blockinfo/title|info/title|title">
+ <xsl:call-template name="formal.object.heading"/>
+ </xsl:if>
+ <xsl:apply-templates select="*[not(self::blockinfo)
+ and not(self::info)
+ and not(self::title)
+ and not(self::titleabbrev)
+ and not(self::biblioentry)
+ and not(self::bibliomixed)]"/>
+ <xsl:apply-templates select="biblioentry|bibliomixed"/>
+ </div>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="biblioentry">
+ <xsl:param name="label">
+ <xsl:call-template name="biblioentry.label"/>
+ </xsl:param>
+
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="string(.) = ''">
+ <xsl:variable name="bib" select="document($bibliography.collection,.)"/>
+ <xsl:variable name="entry" select="$bib/bibliography//
+ *[@id=$id or @xml:id=$id][1]"/>
+ <xsl:choose>
+ <xsl:when test="$entry">
+ <xsl:choose>
+ <xsl:when test="$bibliography.numbered != 0">
+ <xsl:apply-templates select="$entry">
+ <xsl:with-param name="label" select="$label"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="$entry"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:message>
+ <xsl:text>No bibliography entry: </xsl:text>
+ <xsl:value-of select="$id"/>
+ <xsl:text> found in </xsl:text>
+ <xsl:value-of select="$bibliography.collection"/>
+ </xsl:message>
+ <div>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:call-template name="anchor"/>
+ <p>
+ <xsl:copy-of select="$label"/>
+ <xsl:text>Error: no bibliography entry: </xsl:text>
+ <xsl:value-of select="$id"/>
+ <xsl:text> found in </xsl:text>
+ <xsl:value-of select="$bibliography.collection"/>
+ </p>
+ </div>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <div>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:call-template name="anchor">
+ <xsl:with-param name="conditional" select="0"/>
+ </xsl:call-template>
+ <p>
+ <xsl:copy-of select="$label"/>
+ <xsl:choose>
+ <xsl:when test="$bibliography.style = 'iso690'">
+ <xsl:call-template name="iso690.makecitation"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </p>
+ </div>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="bibliomixed">
+ <xsl:param name="label">
+ <xsl:call-template name="biblioentry.label"/>
+ </xsl:param>
+
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="string(.) = ''">
+ <xsl:variable name="bib" select="document($bibliography.collection,.)"/>
+ <xsl:variable name="entry" select="$bib/bibliography//
+ *[@id=$id or @xml:id=$id][1]"/>
+ <xsl:choose>
+ <xsl:when test="$entry">
+ <xsl:choose>
+ <xsl:when test="$bibliography.numbered != 0">
+ <xsl:apply-templates select="$entry">
+ <xsl:with-param name="label" select="$label"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="$entry"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:message>
+ <xsl:text>No bibliography entry: </xsl:text>
+ <xsl:value-of select="$id"/>
+ <xsl:text> found in </xsl:text>
+ <xsl:value-of select="$bibliography.collection"/>
+ </xsl:message>
+ <div>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:call-template name="anchor"/>
+ <p>
+ <xsl:copy-of select="$label"/>
+ <xsl:text>Error: no bibliography entry: </xsl:text>
+ <xsl:value-of select="$id"/>
+ <xsl:text> found in </xsl:text>
+ <xsl:value-of select="$bibliography.collection"/>
+ </p>
+ </div>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <div>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:call-template name="anchor">
+ <xsl:with-param name="conditional" select="0"/>
+ </xsl:call-template>
+ <p>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:copy-of select="$label"/>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </p>
+ </div>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="biblioentry.label">
+ <xsl:param name="node" select="."/>
+
+ <xsl:choose>
+ <xsl:when test="$bibliography.numbered != 0">
+ <xsl:text>[</xsl:text>
+ <xsl:number from="bibliography" count="biblioentry|bibliomixed"
+ level="any" format="1"/>
+ <xsl:text>] </xsl:text>
+ </xsl:when>
+ <xsl:when test="local-name($node/child::*[1]) = 'abbrev'">
+ <xsl:text>[</xsl:text>
+ <xsl:apply-templates select="$node/abbrev[1]"/>
+ <xsl:text>] </xsl:text>
+ </xsl:when>
+ <xsl:when test="$node/@xreflabel">
+ <xsl:text>[</xsl:text>
+ <xsl:value-of select="$node/@xreflabel"/>
+ <xsl:text>] </xsl:text>
+ </xsl:when>
+ <xsl:when test="$node/@id">
+ <xsl:text>[</xsl:text>
+ <xsl:value-of select="$node/@id"/>
+ <xsl:text>] </xsl:text>
+ </xsl:when>
+ <xsl:when test="$node/@xml:id">
+ <xsl:text>[</xsl:text>
+ <xsl:value-of select="$node/@xml:id"/>
+ <xsl:text>] </xsl:text>
+ </xsl:when>
+ <xsl:otherwise><!-- nop --></xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="*" mode="bibliography.mode">
+ <xsl:apply-templates select="."/><!-- try the default mode -->
+</xsl:template>
+
+<xsl:template match="abbrev" mode="bibliography.mode">
+ <xsl:if test="preceding-sibling::*">
+ <xsl:apply-templates mode="bibliography.mode"/>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="abstract" mode="bibliography.mode">
+ <!-- suppressed -->
+</xsl:template>
+
+<xsl:template match="address" mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:copy-of select="$biblioentry.item.separator"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="affiliation" mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:copy-of select="$biblioentry.item.separator"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="shortaffil" mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:copy-of select="$biblioentry.item.separator"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="jobtitle" mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:copy-of select="$biblioentry.item.separator"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="artheader|articleinfo|info" mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:copy-of select="$biblioentry.item.separator"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="artpagenums" mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:copy-of select="$biblioentry.item.separator"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="author" mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:call-template name="person.name"/>
+ <xsl:copy-of select="$biblioentry.item.separator"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="authorblurb|personblurb" mode="bibliography.mode">
+ <!-- suppressed -->
+</xsl:template>
+
+<xsl:template match="authorgroup" mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:call-template name="person.name.list"/>
+ <xsl:copy-of select="$biblioentry.item.separator"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="authorinitials" mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:copy-of select="$biblioentry.item.separator"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="bibliomisc" mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:copy-of select="$biblioentry.item.separator"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="bibliomset" mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:copy-of select="$biblioentry.item.separator"/>
+ </span>
+</xsl:template>
+
+<!-- ================================================== -->
+
+<xsl:template match="biblioset" mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="biblioset/title|biblioset/citetitle"
+ mode="bibliography.mode">
+ <xsl:variable name="relation" select="../@relation"/>
+ <xsl:choose>
+ <xsl:when test="$relation='article' or @pubwork='article'">
+ <xsl:call-template name="gentext.startquote"/>
+ <xsl:apply-templates/>
+ <xsl:call-template name="gentext.endquote"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <i><xsl:apply-templates/></i>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:copy-of select="$biblioentry.item.separator"/>
+</xsl:template>
+
+<!-- ================================================== -->
+
+<xsl:template match="bookbiblio" mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:copy-of select="$biblioentry.item.separator"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="citetitle" mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:choose>
+ <xsl:when test="@pubwork = 'article'">
+ <xsl:call-template name="gentext.startquote"/>
+ <xsl:call-template name="inline.charseq"/>
+ <xsl:call-template name="gentext.endquote"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="inline.italicseq"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:copy-of select="$biblioentry.item.separator"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="collab" mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:copy-of select="$biblioentry.item.separator"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="collabname" mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:copy-of select="$biblioentry.item.separator"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="confgroup" mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:copy-of select="$biblioentry.item.separator"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="confdates" mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:copy-of select="$biblioentry.item.separator"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="conftitle" mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:copy-of select="$biblioentry.item.separator"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="confnum" mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:copy-of select="$biblioentry.item.separator"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="confsponsor" mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:copy-of select="$biblioentry.item.separator"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="contractnum" mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:copy-of select="$biblioentry.item.separator"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="contractsponsor" mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:copy-of select="$biblioentry.item.separator"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="contrib" mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:copy-of select="$biblioentry.item.separator"/>
+ </span>
+</xsl:template>
+
+<!-- ================================================== -->
+
+<xsl:template match="copyright" mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'Copyright'"/>
+ </xsl:call-template>
+ <xsl:call-template name="gentext.space"/>
+ <xsl:call-template name="dingbat">
+ <xsl:with-param name="dingbat">copyright</xsl:with-param>
+ </xsl:call-template>
+ <xsl:call-template name="gentext.space"/>
+ <xsl:apply-templates select="year" mode="bibliography.mode"/>
+ <xsl:if test="holder">
+ <xsl:call-template name="gentext.space"/>
+ <xsl:apply-templates select="holder" mode="bibliography.mode"/>
+ </xsl:if>
+ <xsl:copy-of select="$biblioentry.item.separator"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="year" mode="bibliography.mode">
+ <xsl:apply-templates/><xsl:text>, </xsl:text>
+</xsl:template>
+
+<xsl:template match="year[position()=last()]" mode="bibliography.mode">
+ <xsl:apply-templates/>
+</xsl:template>
+
+<xsl:template match="holder" mode="bibliography.mode">
+ <xsl:apply-templates/>
+</xsl:template>
+
+<!-- ================================================== -->
+
+<xsl:template match="corpauthor" mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:copy-of select="$biblioentry.item.separator"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="corpcredit" mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:copy-of select="$biblioentry.item.separator"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="corpname" mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:copy-of select="$biblioentry.item.separator"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="date" mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:copy-of select="$biblioentry.item.separator"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="edition" mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:copy-of select="$biblioentry.item.separator"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="editor" mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:call-template name="person.name"/>
+ <xsl:copy-of select="$biblioentry.item.separator"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="firstname" mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:copy-of select="$biblioentry.item.separator"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="honorific" mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:copy-of select="$biblioentry.item.separator"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="indexterm" mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:copy-of select="$biblioentry.item.separator"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="invpartnumber" mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:copy-of select="$biblioentry.item.separator"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="isbn" mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:copy-of select="$biblioentry.item.separator"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="issn" mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:copy-of select="$biblioentry.item.separator"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="issuenum" mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:copy-of select="$biblioentry.item.separator"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="lineage" mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:copy-of select="$biblioentry.item.separator"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="orgname" mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:copy-of select="$biblioentry.item.separator"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="orgdiv" mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:copy-of select="$biblioentry.item.separator"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="othercredit" mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:copy-of select="$biblioentry.item.separator"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="othername" mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:copy-of select="$biblioentry.item.separator"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="pagenums" mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:copy-of select="$biblioentry.item.separator"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="printhistory" mode="bibliography.mode">
+ <!-- suppressed -->
+</xsl:template>
+
+<xsl:template match="productname" mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:copy-of select="$biblioentry.item.separator"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="productnumber" mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:copy-of select="$biblioentry.item.separator"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="pubdate" mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:copy-of select="$biblioentry.item.separator"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="publisher" mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="publishername" mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:copy-of select="$biblioentry.item.separator"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="pubsnumber" mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:copy-of select="$biblioentry.item.separator"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="releaseinfo" mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:copy-of select="$biblioentry.item.separator"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="revhistory" mode="bibliography.mode">
+ <!-- suppressed; how could this be represented? -->
+</xsl:template>
+
+<xsl:template match="seriesinfo" mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="seriesvolnums" mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:copy-of select="$biblioentry.item.separator"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="subtitle" mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:copy-of select="$biblioentry.item.separator"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="surname" mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:copy-of select="$biblioentry.item.separator"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="title" mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <i><xsl:apply-templates mode="bibliography.mode"/></i>
+ <xsl:copy-of select="$biblioentry.item.separator"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="titleabbrev" mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:copy-of select="$biblioentry.item.separator"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="volumenum" mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:copy-of select="$biblioentry.item.separator"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="bibliocoverage|biblioid|bibliorelation|bibliosource"
+ mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:copy-of select="$biblioentry.item.separator"/>
+ </span>
+</xsl:template>
+
+<!-- See FR #1934434 and http://doi.org -->
+<xsl:template match="biblioid[@class='doi']"
+ mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <a href="{concat('http://dx.doi.org/', .)}">doi:<xsl:value-of select="."/></a>
+ </span>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="*" mode="bibliomixed.mode">
+ <xsl:apply-templates select="."/><!-- try the default mode -->
+</xsl:template>
+
+<xsl:template match="abbrev" mode="bibliomixed.mode">
+ <xsl:if test="preceding-sibling::*">
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="abstract" mode="bibliomixed.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="address" mode="bibliomixed.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="affiliation" mode="bibliomixed.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="shortaffil" mode="bibliomixed.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="jobtitle" mode="bibliomixed.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="artpagenums" mode="bibliomixed.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="author" mode="bibliomixed.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="authorblurb|personblurb" mode="bibliomixed.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="authorgroup" mode="bibliomixed.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="authorinitials" mode="bibliomixed.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="bibliomisc" mode="bibliomixed.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </span>
+</xsl:template>
+
+<!-- ================================================== -->
+
+<xsl:template match="bibliomset" mode="bibliomixed.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="bibliomset/title|bibliomset/citetitle"
+ mode="bibliomixed.mode">
+ <xsl:variable name="relation" select="../@relation"/>
+ <xsl:choose>
+ <xsl:when test="$relation='article' or @pubwork='article'">
+ <xsl:call-template name="gentext.startquote"/>
+ <xsl:apply-templates/>
+ <xsl:call-template name="gentext.endquote"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <i><xsl:apply-templates/></i>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ================================================== -->
+
+<xsl:template match="biblioset" mode="bibliomixed.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="citetitle" mode="bibliomixed.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:choose>
+ <xsl:when test="@pubwork = 'article'">
+ <xsl:call-template name="gentext.startquote"/>
+ <xsl:call-template name="inline.charseq"/>
+ <xsl:call-template name="gentext.endquote"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="inline.italicseq"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </span>
+</xsl:template>
+
+
+<xsl:template match="collab" mode="bibliomixed.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="confgroup" mode="bibliomixed.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="contractnum" mode="bibliomixed.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="contractsponsor" mode="bibliomixed.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="contrib" mode="bibliomixed.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="copyright" mode="bibliomixed.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="corpauthor" mode="bibliomixed.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="corpcredit" mode="bibliomixed.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="corpname" mode="bibliomixed.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="date" mode="bibliomixed.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="edition" mode="bibliomixed.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="editor" mode="bibliomixed.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="firstname" mode="bibliomixed.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="honorific" mode="bibliomixed.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="indexterm" mode="bibliomixed.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="invpartnumber" mode="bibliomixed.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="isbn" mode="bibliomixed.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="issn" mode="bibliomixed.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="issuenum" mode="bibliomixed.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="lineage" mode="bibliomixed.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="orgname" mode="bibliomixed.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="othercredit" mode="bibliomixed.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="othername" mode="bibliomixed.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="pagenums" mode="bibliomixed.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="printhistory" mode="bibliomixed.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="productname" mode="bibliomixed.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="productnumber" mode="bibliomixed.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="pubdate" mode="bibliomixed.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="publisher" mode="bibliomixed.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="publishername" mode="bibliomixed.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="pubsnumber" mode="bibliomixed.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="releaseinfo" mode="bibliomixed.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="revhistory" mode="bibliomixed.mode">
+ <!-- suppressed; how could this be represented? -->
+</xsl:template>
+
+<xsl:template match="seriesvolnums" mode="bibliomixed.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="subtitle" mode="bibliomixed.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="surname" mode="bibliomixed.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="title" mode="bibliomixed.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="titleabbrev" mode="bibliomixed.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="volumenum" mode="bibliomixed.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="bibliocoverage|biblioid|bibliorelation|bibliosource"
+ mode="bibliomixed.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </span>
+</xsl:template>
+
+<!-- See FR #1934434 and http://doi.org -->
+<xsl:template match="biblioid[@class='doi']"
+ mode="bibliomixed.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <a href="{concat('http://dx.doi.org/', .)}">doi:<xsl:value-of select="."/></a>
+ </span>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/block.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/block.xsl
new file mode 100644
index 0000000..c76beaf
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/block.xsl
@@ -0,0 +1,538 @@
+<?xml version='1.0'?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version='1.0'>
+
+<!-- ********************************************************************
+ $Id: block.xsl 8831 2010-08-13 17:08:49Z mzjn $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<!-- ==================================================================== -->
+<!-- What should we do about styling blockinfo? -->
+
+<xsl:template match="blockinfo|info">
+ <!-- suppress -->
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template name="block.object">
+ <div>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:call-template name="anchor"/>
+ <xsl:apply-templates/>
+ </div>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="para">
+ <xsl:call-template name="paragraph">
+ <xsl:with-param name="class">
+ <xsl:if test="@role and $para.propagates.style != 0">
+ <xsl:value-of select="@role"/>
+ </xsl:if>
+ </xsl:with-param>
+ <xsl:with-param name="content">
+ <xsl:if test="position() = 1 and parent::listitem">
+ <xsl:call-template name="anchor">
+ <xsl:with-param name="node" select="parent::listitem"/>
+ </xsl:call-template>
+ </xsl:if>
+
+ <xsl:call-template name="anchor"/>
+ <xsl:apply-templates/>
+ </xsl:with-param>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template name="paragraph">
+ <xsl:param name="class" select="''"/>
+ <xsl:param name="content"/>
+
+ <xsl:variable name="p">
+ <p>
+ <xsl:choose>
+ <xsl:when test="$class != ''">
+ <xsl:call-template name="common.html.attributes">
+ <xsl:with-param name="class" select="$class"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="locale.html.attributes"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:copy-of select="$content"/>
+ </p>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="$html.cleanup != 0">
+ <xsl:call-template name="unwrap.p">
+ <xsl:with-param name="p" select="$p"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:copy-of select="$p"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="simpara">
+ <!-- see also listitem/simpara in lists.xsl -->
+ <p>
+ <xsl:call-template name="locale.html.attributes"/>
+ <xsl:if test="@role and $para.propagates.style != 0">
+ <xsl:apply-templates select="." mode="class.attribute">
+ <xsl:with-param name="class" select="@role"/>
+ </xsl:apply-templates>
+ </xsl:if>
+
+ <xsl:call-template name="anchor"/>
+ <xsl:apply-templates/>
+ </p>
+</xsl:template>
+
+<xsl:template match="formalpara">
+ <xsl:call-template name="paragraph">
+ <xsl:with-param name="class">
+ <xsl:if test="@role and $para.propagates.style != 0">
+ <xsl:value-of select="@role"/>
+ </xsl:if>
+ </xsl:with-param>
+ <xsl:with-param name="content">
+ <xsl:call-template name="anchor"/>
+ <xsl:apply-templates/>
+ </xsl:with-param>
+ </xsl:call-template>
+</xsl:template>
+
+<!-- Only use title from info -->
+<xsl:template match="formalpara/info">
+ <xsl:apply-templates select="title"/>
+</xsl:template>
+
+<xsl:template match="formalpara/title|formalpara/info/title">
+ <xsl:variable name="titleStr">
+ <xsl:apply-templates/>
+ </xsl:variable>
+ <xsl:variable name="lastChar">
+ <xsl:if test="$titleStr != ''">
+ <xsl:value-of select="substring($titleStr,string-length($titleStr),1)"/>
+ </xsl:if>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="$make.clean.html != 0">
+ <span class="formalpara-title">
+ <xsl:copy-of select="$titleStr"/>
+ <xsl:if test="$lastChar != ''
+ and not(contains($runinhead.title.end.punct, $lastChar))">
+ <xsl:value-of select="$runinhead.default.title.end.punct"/>
+ </xsl:if>
+ <xsl:text>&#160;</xsl:text>
+ </span>
+ </xsl:when>
+ <xsl:otherwise>
+ <b>
+ <xsl:copy-of select="$titleStr"/>
+ <xsl:if test="$lastChar != ''
+ and not(contains($runinhead.title.end.punct, $lastChar))">
+ <xsl:value-of select="$runinhead.default.title.end.punct"/>
+ </xsl:if>
+ <xsl:text>&#160;</xsl:text>
+ </b>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="formalpara/para">
+ <xsl:apply-templates/>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="blockquote">
+ <div>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:call-template name="anchor"/>
+
+ <xsl:choose>
+ <xsl:when test="attribution">
+ <table border="0" width="100%"
+ cellspacing="0" cellpadding="0" class="blockquote"
+ summary="Block quote">
+ <tr>
+ <td width="10%" valign="top">&#160;</td>
+ <td width="80%" valign="top">
+ <xsl:apply-templates select="child::*[local-name(.)!='attribution']"/>
+ </td>
+ <td width="10%" valign="top">&#160;</td>
+ </tr>
+ <tr>
+ <td width="10%" valign="top">&#160;</td>
+ <td colspan="2" align="{$direction.align.end}" valign="top">
+ <xsl:text>--</xsl:text>
+ <xsl:apply-templates select="attribution"/>
+ </td>
+ </tr>
+ </table>
+ </xsl:when>
+ <xsl:otherwise>
+ <blockquote>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates/>
+ </blockquote>
+ </xsl:otherwise>
+ </xsl:choose>
+ </div>
+</xsl:template>
+
+<xsl:template match="blockquote/title|blockquote/info/title">
+ <xsl:choose>
+ <xsl:when test="$make.clean.html != 0">
+ <div class="blockquote-title">
+ <xsl:apply-templates/>
+ </div>
+ </xsl:when>
+ <xsl:otherwise>
+ <div class="blockquote-title">
+ <p>
+ <b>
+ <xsl:apply-templates/>
+ </b>
+ </p>
+ </div>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- Use an em dash per Chicago Manual of Style and https://sourceforge.net/tracker/index.php?func=detail&aid=2793878&group_id=21935&atid=373747 -->
+<xsl:template match="epigraph">
+ <div>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates select="para|simpara|formalpara|literallayout"/>
+ <xsl:if test="attribution">
+ <div class="attribution">
+ <span>&#x2014;<xsl:apply-templates select="attribution"/></span>
+ </div>
+ </xsl:if>
+ </div>
+</xsl:template>
+
+<xsl:template match="attribution">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates/>
+ </span>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="abstract|sidebar">
+ <div>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:call-template name="anchor"/>
+ <xsl:call-template name="sidebar.titlepage"/>
+ <xsl:apply-templates/>
+ </div>
+</xsl:template>
+
+<xsl:template match="abstract/title|sidebar/title">
+</xsl:template>
+
+<xsl:template match="sidebar/sidebarinfo|sidebar/info"/>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="msgset">
+ <xsl:apply-templates/>
+</xsl:template>
+
+<xsl:template match="msgentry">
+ <xsl:call-template name="block.object"/>
+</xsl:template>
+
+<xsl:template match="simplemsgentry">
+ <xsl:call-template name="block.object"/>
+</xsl:template>
+
+<xsl:template match="msg">
+ <xsl:call-template name="block.object"/>
+</xsl:template>
+
+<xsl:template match="msgmain">
+ <xsl:apply-templates/>
+</xsl:template>
+
+<xsl:template match="msgmain/title">
+ <xsl:choose>
+ <xsl:when test="$make.clean.html != 0">
+ <span class="msgmain-title">
+ <xsl:apply-templates/>
+ </span>
+ </xsl:when>
+ <xsl:otherwise>
+ <b><xsl:apply-templates/></b>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="msgsub">
+ <xsl:apply-templates/>
+</xsl:template>
+
+<xsl:template match="msgsub/title">
+ <xsl:choose>
+ <xsl:when test="$make.clean.html != 0">
+ <span class="msgsub-title">
+ <xsl:apply-templates/>
+ </span>
+ </xsl:when>
+ <xsl:otherwise>
+ <b><xsl:apply-templates/></b>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="msgrel">
+ <xsl:apply-templates/>
+</xsl:template>
+
+<xsl:template match="msgrel/title">
+ <xsl:choose>
+ <xsl:when test="$make.clean.html != 0">
+ <span class="msgrel-title">
+ <xsl:apply-templates/>
+ </span>
+ </xsl:when>
+ <xsl:otherwise>
+ <b><xsl:apply-templates/></b>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="msgtext">
+ <xsl:apply-templates/>
+</xsl:template>
+
+<xsl:template match="msginfo">
+ <xsl:call-template name="block.object"/>
+</xsl:template>
+
+<xsl:template match="msglevel">
+ <xsl:choose>
+ <xsl:when test="$make.clean.html != 0">
+ <div class="msglevel">
+ <span class="msglevel-title">
+ <xsl:call-template name="gentext.template">
+ <xsl:with-param name="context" select="'msgset'"/>
+ <xsl:with-param name="name" select="'MsgLevel'"/>
+ </xsl:call-template>
+ </span>
+ <xsl:apply-templates/>
+ </div>
+ </xsl:when>
+ <xsl:otherwise>
+ <p>
+ <b>
+ <xsl:call-template name="gentext.template">
+ <xsl:with-param name="context" select="'msgset'"/>
+ <xsl:with-param name="name" select="'MsgLevel'"/>
+ </xsl:call-template>
+ </b>
+ <xsl:apply-templates/>
+ </p>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="msgorig">
+ <xsl:choose>
+ <xsl:when test="$make.clean.html != 0">
+ <div class="msgorig">
+ <span class="msgorig-title">
+ <xsl:call-template name="gentext.template">
+ <xsl:with-param name="context" select="'msgset'"/>
+ <xsl:with-param name="name" select="'MsgOrig'"/>
+ </xsl:call-template>
+ </span>
+ <xsl:apply-templates/>
+ </div>
+ </xsl:when>
+ <xsl:otherwise>
+ <p>
+ <b>
+ <xsl:call-template name="gentext.template">
+ <xsl:with-param name="context" select="'msgset'"/>
+ <xsl:with-param name="name" select="'MsgOrig'"/>
+ </xsl:call-template>
+ </b>
+ <xsl:apply-templates/>
+ </p>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="msgaud">
+ <xsl:choose>
+ <xsl:when test="$make.clean.html != 0">
+ <div class="msgaud">
+ <span class="msgaud-title">
+ <xsl:call-template name="gentext.template">
+ <xsl:with-param name="context" select="'msgset'"/>
+ <xsl:with-param name="name" select="'MsgAud'"/>
+ </xsl:call-template>
+ </span>
+ <xsl:apply-templates/>
+ </div>
+ </xsl:when>
+ <xsl:otherwise>
+ <p>
+ <b>
+ <xsl:call-template name="gentext.template">
+ <xsl:with-param name="context" select="'msgset'"/>
+ <xsl:with-param name="name" select="'MsgAud'"/>
+ </xsl:call-template>
+ </b>
+ <xsl:apply-templates/>
+ </p>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="msgexplan">
+ <xsl:call-template name="block.object"/>
+</xsl:template>
+
+<xsl:template match="msgexplan/title">
+ <xsl:choose>
+ <xsl:when test="$make.clean.html != 0">
+ <div class="msgexplan">
+ <span class="msgexplan-title">
+ <xsl:apply-templates/>
+ </span>
+ </div>
+ </xsl:when>
+ <xsl:otherwise>
+ <p>
+ <b>
+ <xsl:apply-templates/>
+ </b>
+ </p>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="revhistory">
+ <div>
+ <xsl:call-template name="common.html.attributes"/>
+ <table border="0" width="100%" summary="Revision history">
+ <tr>
+ <th align="{$direction.align.start}" valign="top" colspan="3">
+ <b>
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'RevHistory'"/>
+ </xsl:call-template>
+ </b>
+ </th>
+ </tr>
+ <xsl:apply-templates/>
+ </table>
+ </div>
+</xsl:template>
+
+<xsl:template match="revhistory/revision">
+ <xsl:variable name="revnumber" select="revnumber"/>
+ <xsl:variable name="revdate" select="date"/>
+ <xsl:variable name="revauthor" select="authorinitials|author"/>
+ <xsl:variable name="revremark" select="revremark|revdescription"/>
+ <tr>
+ <td align="{$direction.align.start}">
+ <xsl:if test="$revnumber">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'Revision'"/>
+ </xsl:call-template>
+ <xsl:call-template name="gentext.space"/>
+ <xsl:apply-templates select="$revnumber"/>
+ </xsl:if>
+ </td>
+ <td align="{$direction.align.start}">
+ <xsl:apply-templates select="$revdate"/>
+ </td>
+ <xsl:choose>
+ <xsl:when test="count($revauthor)=0">
+ <td align="{$direction.align.start}">
+ <xsl:call-template name="dingbat">
+ <xsl:with-param name="dingbat">nbsp</xsl:with-param>
+ </xsl:call-template>
+ </td>
+ </xsl:when>
+ <xsl:otherwise>
+ <td align="{$direction.align.start}">
+ <xsl:for-each select="$revauthor">
+ <xsl:apply-templates select="."/>
+ <xsl:if test="position() != last()">
+ <xsl:text>, </xsl:text>
+ </xsl:if>
+ </xsl:for-each>
+ </td>
+ </xsl:otherwise>
+ </xsl:choose>
+ </tr>
+ <xsl:if test="$revremark">
+ <tr>
+ <td align="{$direction.align.start}" colspan="3">
+ <xsl:apply-templates select="$revremark"/>
+ </td>
+ </tr>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="revision/revnumber">
+ <xsl:apply-templates/>
+</xsl:template>
+
+<xsl:template match="revision/date">
+ <xsl:apply-templates/>
+</xsl:template>
+
+<xsl:template match="revision/authorinitials">
+ <xsl:text>, </xsl:text>
+ <xsl:apply-templates/>
+</xsl:template>
+
+<xsl:template match="revision/authorinitials[1]" priority="2">
+ <xsl:apply-templates/>
+</xsl:template>
+
+<xsl:template match="revision/revremark">
+ <xsl:apply-templates/>
+</xsl:template>
+
+<xsl:template match="revision/revdescription">
+ <xsl:apply-templates/>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="ackno|acknowledgements[parent::article]">
+ <xsl:call-template name="block.object"/>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="highlights">
+ <xsl:call-template name="block.object"/>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/callout.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/callout.xsl
new file mode 100644
index 0000000..88a9bd0
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/callout.xsl
@@ -0,0 +1,201 @@
+<?xml version='1.0'?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:sverb="http://nwalsh.com/xslt/ext/com.nwalsh.saxon.Verbatim"
+ xmlns:xverb="xalan://com.nwalsh.xalan.Verbatim"
+ xmlns:lxslt="http://xml.apache.org/xslt"
+ exclude-result-prefixes="sverb xverb lxslt"
+ version='1.0'>
+
+<!-- ********************************************************************
+ $Id: callout.xsl 8421 2009-05-04 07:49:49Z bobstayton $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<lxslt:component prefix="xverb"
+ functions="insertCallouts"/>
+
+<xsl:template match="programlistingco|screenco">
+ <xsl:variable name="verbatim" select="programlisting|screen"/>
+
+ <xsl:choose>
+ <xsl:when test="$use.extensions != '0'
+ and $callouts.extension != '0'">
+ <xsl:variable name="rtf">
+ <xsl:apply-templates select="$verbatim">
+ <xsl:with-param name="suppress-numbers" select="'1'"/>
+ </xsl:apply-templates>
+ </xsl:variable>
+
+ <xsl:variable name="rtf-with-callouts">
+ <xsl:choose>
+ <xsl:when test="function-available('sverb:insertCallouts')">
+ <xsl:copy-of select="sverb:insertCallouts(areaspec,$rtf)"/>
+ </xsl:when>
+ <xsl:when test="function-available('xverb:insertCallouts')">
+ <xsl:copy-of select="xverb:insertCallouts(areaspec,$rtf)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:message terminate="yes">
+ <xsl:text>No insertCallouts function is available.</xsl:text>
+ </xsl:message>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="$verbatim/@linenumbering = 'numbered'
+ and $linenumbering.extension != '0'">
+ <div>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:call-template name="number.rtf.lines">
+ <xsl:with-param name="rtf" select="$rtf-with-callouts"/>
+ <xsl:with-param name="pi.context"
+ select="programlisting|screen"/>
+ </xsl:call-template>
+ <xsl:apply-templates select="calloutlist"/>
+ </div>
+ </xsl:when>
+ <xsl:otherwise>
+ <div>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:copy-of select="$rtf-with-callouts"/>
+ <xsl:apply-templates select="calloutlist"/>
+ </div>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <div>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates/>
+ </div>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="areaspec|areaset|area">
+</xsl:template>
+
+<xsl:template match="areaset" mode="conumber">
+ <xsl:number count="area|areaset" format="1"/>
+</xsl:template>
+
+<xsl:template match="area" mode="conumber">
+ <xsl:number count="area|areaset" format="1"/>
+</xsl:template>
+
+<xsl:template match="co" name="co">
+ <!-- Support a single linkend in HTML -->
+ <xsl:variable name="targets" select="key('id', @linkends)"/>
+ <xsl:variable name="target" select="$targets[1]"/>
+ <xsl:choose>
+ <xsl:when test="$target">
+ <a>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:if test="@id or @xml:id">
+ <xsl:attribute name="name">
+ <xsl:value-of select="(@id|@xml:id)[1]"/>
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:attribute name="href">
+ <xsl:call-template name="href.target">
+ <xsl:with-param name="object" select="$target"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:apply-templates select="." mode="callout-bug"/>
+ </a>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="anchor"/>
+ <xsl:apply-templates select="." mode="callout-bug"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="coref">
+ <!-- tricky; this relies on the fact that we can process the "co" that's -->
+ <!-- "over there" as if it were "right here" -->
+
+ <xsl:variable name="co" select="key('id', @linkend)"/>
+ <xsl:choose>
+ <xsl:when test="not($co)">
+ <xsl:message>
+ <xsl:text>Error: coref link is broken: </xsl:text>
+ <xsl:value-of select="@linkend"/>
+ </xsl:message>
+ </xsl:when>
+ <xsl:when test="local-name($co) != 'co'">
+ <xsl:message>
+ <xsl:text>Error: coref doesn't point to a co: </xsl:text>
+ <xsl:value-of select="@linkend"/>
+ </xsl:message>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="$co"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="co" mode="callout-bug">
+ <xsl:call-template name="callout-bug">
+ <xsl:with-param name="conum">
+ <xsl:number count="co"
+ level="any"
+ from="programlisting|screen|literallayout|synopsis"
+ format="1"/>
+ </xsl:with-param>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template name="callout-bug">
+ <xsl:param name="conum" select='1'/>
+
+ <xsl:choose>
+ <xsl:when test="$callout.graphics != 0
+ and $conum &lt;= $callout.graphics.number.limit">
+ <img src="{$callout.graphics.path}{$conum}{$callout.graphics.extension}"
+ alt="{$conum}" border="0"/>
+ </xsl:when>
+ <xsl:when test="$callout.unicode != 0
+ and $conum &lt;= $callout.unicode.number.limit">
+ <xsl:choose>
+ <xsl:when test="$callout.unicode.start.character = 10102">
+ <xsl:choose>
+ <xsl:when test="$conum = 1">&#10102;</xsl:when>
+ <xsl:when test="$conum = 2">&#10103;</xsl:when>
+ <xsl:when test="$conum = 3">&#10104;</xsl:when>
+ <xsl:when test="$conum = 4">&#10105;</xsl:when>
+ <xsl:when test="$conum = 5">&#10106;</xsl:when>
+ <xsl:when test="$conum = 6">&#10107;</xsl:when>
+ <xsl:when test="$conum = 7">&#10108;</xsl:when>
+ <xsl:when test="$conum = 8">&#10109;</xsl:when>
+ <xsl:when test="$conum = 9">&#10110;</xsl:when>
+ <xsl:when test="$conum = 10">&#10111;</xsl:when>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:message>
+ <xsl:text>Don't know how to generate Unicode callouts </xsl:text>
+ <xsl:text>when $callout.unicode.start.character is </xsl:text>
+ <xsl:value-of select="$callout.unicode.start.character"/>
+ </xsl:message>
+ <xsl:text>(</xsl:text>
+ <xsl:value-of select="$conum"/>
+ <xsl:text>)</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text>(</xsl:text>
+ <xsl:value-of select="$conum"/>
+ <xsl:text>)</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/changebars.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/changebars.xsl
new file mode 100644
index 0000000..dae1cc3
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/changebars.xsl
@@ -0,0 +1,121 @@
+<?xml version="1.0"?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="1.0">
+
+<!-- ********************************************************************
+ $Id: changebars.xsl 8128 2008-09-29 17:16:10Z mzjn $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<!-- ==================================================================== -->
+<xsl:import href="docbook.xsl"/>
+
+<xsl:param name="show.revisionflag" select="'1'"/>
+
+<xsl:template name="system.head.content">
+<xsl:param name="node" select="."/>
+
+<style type="text/css">
+<xsl:text>
+div.added { background-color: #ffff99;
+ text-decoration: underline; }
+div.deleted { text-decoration: line-through;
+ background-color: #FF7F7F; }
+div.changed { background-color: #99ff99; }
+div.off { }
+
+span.added { background-color: #ffff99;
+ text-decoration: underline; }
+span.deleted { text-decoration: line-through;
+ background-color: #FF7F7F; }
+span.changed { background-color: #99ff99; }
+span.off { }
+</xsl:text>
+</style>
+</xsl:template>
+
+<xsl:template match="*[@revisionflag]">
+ <xsl:call-template name="block.or.inline.revision"/>
+</xsl:template>
+
+<xsl:template name="block.or.inline.revision">
+ <xsl:param name="revisionflag" select="@revisionflag"/>
+
+ <xsl:choose>
+ <xsl:when test="local-name(.) = 'para'
+ or local-name(.) = 'formalpara'
+ or local-name(.) = 'simpara'
+ or local-name(.) = 'simplesect'
+ or local-name(.) = 'section'
+ or local-name(.) = 'sect1'
+ or local-name(.) = 'sect2'
+ or local-name(.) = 'sect3'
+ or local-name(.) = 'sect4'
+ or local-name(.) = 'sect5'
+ or local-name(.) = 'chapter'
+ or local-name(.) = 'preface'
+ or local-name(.) = 'itemizedlist'
+ or local-name(.) = 'orderedlist'
+ or local-name(.) = 'variablelist'
+ or local-name(.) = 'varlistentry'
+ or local-name(.) = 'informaltable'
+ or local-name(.) = 'informalexample'
+ or local-name(.) = 'note'
+ or local-name(.) = 'example'
+ or local-name(.) = 'mediaobject'
+ or local-name(.) = 'sidebar'
+ or local-name(.) = 'glossary'
+ or local-name(.) = 'glossentry'
+ or local-name(.) = 'bibliography'
+ or local-name(.) = 'index'
+ or local-name(.) = 'appendix'">
+ <div class='{$revisionflag}'>
+ <xsl:apply-imports/>
+ </div>
+ </xsl:when>
+ <xsl:when test="local-name(.) = 'phrase'
+ or local-name(.) = 'ulink'
+ or local-name(.) = 'link'
+ or local-name(.) = 'olink'
+ or local-name(.) = 'inlinemediaobject'
+ or local-name(.) = 'filename'
+ or local-name(.) = 'literal'
+ or local-name(.) = 'member'
+ or local-name(.) = 'term'
+ or local-name(.) = 'guilabel'
+ or local-name(.) = 'glossterm'
+ or local-name(.) = 'sgmltag'
+ or local-name(.) = 'tag'
+ or local-name(.) = 'quote'
+ or local-name(.) = 'emphasis'
+ or local-name(.) = 'command'
+ or local-name(.) = 'xref'">
+ <span class='{$revisionflag}'>
+ <xsl:apply-imports/>
+ </span>
+ </xsl:when>
+ <xsl:when test="local-name(.) = 'listitem'
+ or local-name(.) = 'entry'
+ or local-name(.) = 'title'">
+ <!-- nop; these are handled directly in the stylesheet -->
+ <xsl:apply-imports/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:message>
+ <xsl:text>Revisionflag on unexpected element: </xsl:text>
+ <xsl:value-of select="local-name(.)"/>
+ <xsl:text> (Assuming block)</xsl:text>
+ </xsl:message>
+ <div class='{$revisionflag}'>
+ <xsl:apply-imports/>
+ </div>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/chunk-changebars.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/chunk-changebars.xsl
new file mode 100644
index 0000000..6bfd3c0
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/chunk-changebars.xsl
@@ -0,0 +1,99 @@
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:exsl="http://exslt.org/common"
+ xmlns:cf="http://docbook.sourceforge.net/xmlns/chunkfast/1.0"
+ version="1.0"
+ exclude-result-prefixes="exsl cf">
+
+<!-- ********************************************************************
+ $Id: chunk-changebars.xsl 8399 2009-04-08 07:37:42Z bobstayton $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<!-- ==================================================================== -->
+
+<!-- This file is a variant of chunk.xsl, to be used for generating chunked
+ output with highlighting based on change markup. -->
+
+<xsl:import href="changebars.xsl"/>
+<xsl:import href="chunk-common.xsl"/>
+
+<!-- This customization of "process-chunk-element" is needed in order to make change
+ highlighting be inherited by chunked children of an element with change markup. -->
+<xsl:template name="process-chunk-element">
+ <xsl:param name="content">
+ <xsl:choose>
+
+ <xsl:when test="ancestor-or-self::*[@revisionflag] and $show.revisionflag != 0">
+ <xsl:variable name="revisionflag" select="ancestor-or-self::*[@revisionflag][1]/@revisionflag" />
+ <xsl:call-template name="block.or.inline.revision">
+ <xsl:with-param name="revisionflag" select="$revisionflag"/>
+ </xsl:call-template>
+ </xsl:when>
+
+ <xsl:otherwise>
+ <xsl:apply-imports/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:param>
+
+ <xsl:choose>
+ <xsl:when test="$chunk.fast != 0 and $exsl.node.set.available != 0">
+ <xsl:variable name="chunks" select="exsl:node-set($chunk.hierarchy)//cf:div"/>
+ <xsl:variable name="genid" select="generate-id()"/>
+
+ <xsl:variable name="div" select="$chunks[@id=$genid or @xml:id=$genid]"/>
+
+ <xsl:variable name="prevdiv"
+ select="($div/preceding-sibling::cf:div|$div/preceding::cf:div|$div/parent::cf:div)[last()]"/>
+ <xsl:variable name="prev" select="key('genid', ($prevdiv/@id|$prevdiv/@xml:id)[1])"/>
+
+ <xsl:variable name="nextdiv"
+ select="($div/following-sibling::cf:div|$div/following::cf:div|$div/cf:div)[1]"/>
+ <xsl:variable name="next" select="key('genid', ($nextdiv/@id|$nextdiv/@xml:id)[1])"/>
+
+ <xsl:choose>
+ <xsl:when test="$onechunk != 0 and parent::*">
+ <xsl:copy-of select="$content"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="process-chunk">
+ <xsl:with-param name="prev" select="$prev"/>
+ <xsl:with-param name="next" select="$next"/>
+ <xsl:with-param name="content" select="$content"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:choose>
+ <xsl:when test="$onechunk != 0 and not(parent::*)">
+ <xsl:call-template name="chunk-all-sections">
+ <xsl:with-param name="content" select="$content"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="$onechunk != 0">
+ <xsl:copy-of select="$content"/>
+ </xsl:when>
+ <xsl:when test="$chunk.first.sections = 0">
+ <xsl:call-template name="chunk-first-section-with-parent">
+ <xsl:with-param name="content" select="$content"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="chunk-all-sections">
+ <xsl:with-param name="content" select="$content"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:include href="chunk-code.xsl"/>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/chunk-code.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/chunk-code.xsl
new file mode 100644
index 0000000..694e9fe
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/chunk-code.xsl
@@ -0,0 +1,674 @@
+<?xml version="1.0"?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:exsl="http://exslt.org/common"
+ xmlns:cf="http://docbook.sourceforge.net/xmlns/chunkfast/1.0"
+ xmlns:ng="http://docbook.org/docbook-ng"
+ xmlns:db="http://docbook.org/ns/docbook"
+ exclude-result-prefixes="exsl cf ng db"
+ version="1.0">
+
+<!-- ********************************************************************
+ $Id: chunk-code.xsl 8596 2010-03-20 04:36:45Z bobstayton $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<!-- ==================================================================== -->
+
+
+<xsl:template match="*" mode="chunk-filename">
+ <!-- returns the filename of a chunk -->
+ <xsl:variable name="ischunk">
+ <xsl:call-template name="chunk"/>
+ </xsl:variable>
+
+ <xsl:variable name="fn">
+ <xsl:apply-templates select="." mode="recursive-chunk-filename"/>
+ </xsl:variable>
+
+ <!--
+ <xsl:message>
+ <xsl:value-of select="$ischunk"/>
+ <xsl:text> (</xsl:text>
+ <xsl:value-of select="local-name(.)"/>
+ <xsl:text>) </xsl:text>
+ <xsl:value-of select="$fn"/>
+ <xsl:text>, </xsl:text>
+ <xsl:call-template name="dbhtml-dir"/>
+ </xsl:message>
+ -->
+
+ <!-- 2003-11-25 by ndw:
+ The following test used to read test="$ischunk != 0 and $fn != ''"
+ I've removed the ischunk part of the test so that href.to.uri and
+ href.from.uri will be fully qualified even if the source or target
+ isn't a chunk. I *think* that if $fn != '' then it's appropriate
+ to put the directory on the front, even if the element isn't a
+ chunk. I could be wrong. -->
+
+ <xsl:if test="$fn != ''">
+ <xsl:call-template name="dbhtml-dir"/>
+ </xsl:if>
+
+ <xsl:value-of select="$fn"/>
+ <!-- You can't add the html.ext here because dbhtml filename= may already -->
+ <!-- have added it. It really does have to be handled in the recursive template -->
+</xsl:template>
+
+<xsl:template match="*" mode="recursive-chunk-filename">
+ <xsl:param name="recursive" select="false()"/>
+
+ <!-- returns the filename of a chunk -->
+ <xsl:variable name="ischunk">
+ <xsl:call-template name="chunk"/>
+ </xsl:variable>
+
+ <xsl:variable name="dbhtml-filename">
+ <xsl:call-template name="pi.dbhtml_filename"/>
+ </xsl:variable>
+
+ <xsl:variable name="filename">
+ <xsl:choose>
+ <xsl:when test="$dbhtml-filename != ''">
+ <xsl:value-of select="$dbhtml-filename"/>
+ </xsl:when>
+ <!-- if this is the root element, use the root.filename -->
+ <xsl:when test="not(parent::*) and $root.filename != ''">
+ <xsl:value-of select="$root.filename"/>
+ <xsl:value-of select="$html.ext"/>
+ </xsl:when>
+ <!-- Special case -->
+ <xsl:when test="self::legalnotice and not($generate.legalnotice.link = 0)">
+ <xsl:choose>
+ <xsl:when test="(@id or @xml:id) and not($use.id.as.filename = 0)">
+ <!-- * if this legalnotice has an ID, then go ahead and use -->
+ <!-- * just the value of that ID as the basename for the file -->
+ <!-- * (that is, without prepending an "ln-" too it) -->
+ <xsl:value-of select="(@id|@xml:id)[1]"/>
+ <xsl:value-of select="$html.ext"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <!-- * otherwise, if this legalnotice does not have an ID, -->
+ <!-- * then we generate an ID... -->
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+ <!-- * ...and then we take that generated ID, prepend an -->
+ <!-- * "ln-" to it, and use that as the basename for the file -->
+ <xsl:value-of select="concat('ln-',$id,$html.ext)"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <!-- if there's no dbhtml filename, and if we're to use IDs as -->
+ <!-- filenames, then use the ID to generate the filename. -->
+ <xsl:when test="(@id or @xml:id) and $use.id.as.filename != 0">
+ <xsl:value-of select="(@id|@xml:id)[1]"/>
+ <xsl:value-of select="$html.ext"/>
+ </xsl:when>
+ <xsl:otherwise></xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="$ischunk='0'">
+ <!-- if called on something that isn't a chunk, walk up... -->
+ <xsl:choose>
+ <xsl:when test="count(parent::*)>0">
+ <xsl:apply-templates mode="recursive-chunk-filename" select="parent::*">
+ <xsl:with-param name="recursive" select="$recursive"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <!-- unless there is no up, in which case return "" -->
+ <xsl:otherwise></xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+
+ <xsl:when test="not($recursive) and $filename != ''">
+ <!-- if this chunk has an explicit name, use it -->
+ <xsl:value-of select="$filename"/>
+ </xsl:when>
+
+ <xsl:when test="self::set">
+ <xsl:value-of select="$root.filename"/>
+ <xsl:if test="not($recursive)">
+ <xsl:value-of select="$html.ext"/>
+ </xsl:if>
+ </xsl:when>
+
+ <xsl:when test="self::book">
+ <xsl:text>bk</xsl:text>
+ <xsl:number level="any" format="01"/>
+ <xsl:if test="not($recursive)">
+ <xsl:value-of select="$html.ext"/>
+ </xsl:if>
+ </xsl:when>
+
+ <xsl:when test="self::article">
+ <xsl:if test="/set">
+ <!-- in a set, make sure we inherit the right book info... -->
+ <xsl:apply-templates mode="recursive-chunk-filename" select="parent::*">
+ <xsl:with-param name="recursive" select="true()"/>
+ </xsl:apply-templates>
+ </xsl:if>
+
+ <xsl:text>ar</xsl:text>
+ <xsl:number level="any" format="01" from="book"/>
+ <xsl:if test="not($recursive)">
+ <xsl:value-of select="$html.ext"/>
+ </xsl:if>
+ </xsl:when>
+
+ <xsl:when test="self::preface">
+ <xsl:if test="/set">
+ <!-- in a set, make sure we inherit the right book info... -->
+ <xsl:apply-templates mode="recursive-chunk-filename" select="parent::*">
+ <xsl:with-param name="recursive" select="true()"/>
+ </xsl:apply-templates>
+ </xsl:if>
+
+ <xsl:text>pr</xsl:text>
+ <xsl:number level="any" format="01" from="book"/>
+ <xsl:if test="not($recursive)">
+ <xsl:value-of select="$html.ext"/>
+ </xsl:if>
+ </xsl:when>
+
+ <xsl:when test="self::chapter">
+ <xsl:if test="/set">
+ <!-- in a set, make sure we inherit the right book info... -->
+ <xsl:apply-templates mode="recursive-chunk-filename" select="parent::*">
+ <xsl:with-param name="recursive" select="true()"/>
+ </xsl:apply-templates>
+ </xsl:if>
+
+ <xsl:text>ch</xsl:text>
+ <xsl:number level="any" format="01" from="book"/>
+ <xsl:if test="not($recursive)">
+ <xsl:value-of select="$html.ext"/>
+ </xsl:if>
+ </xsl:when>
+
+ <xsl:when test="self::appendix">
+ <xsl:if test="/set">
+ <!-- in a set, make sure we inherit the right book info... -->
+ <xsl:apply-templates mode="recursive-chunk-filename" select="parent::*">
+ <xsl:with-param name="recursive" select="true()"/>
+ </xsl:apply-templates>
+ </xsl:if>
+
+ <xsl:text>ap</xsl:text>
+ <xsl:number level="any" format="a" from="book"/>
+ <xsl:if test="not($recursive)">
+ <xsl:value-of select="$html.ext"/>
+ </xsl:if>
+ </xsl:when>
+
+ <xsl:when test="self::part">
+ <xsl:choose>
+ <xsl:when test="/set">
+ <!-- in a set, make sure we inherit the right book info... -->
+ <xsl:apply-templates mode="recursive-chunk-filename" select="parent::*">
+ <xsl:with-param name="recursive" select="true()"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:otherwise>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:text>pt</xsl:text>
+ <xsl:number level="any" format="01" from="book"/>
+ <xsl:if test="not($recursive)">
+ <xsl:value-of select="$html.ext"/>
+ </xsl:if>
+ </xsl:when>
+
+ <xsl:when test="self::reference">
+ <xsl:choose>
+ <xsl:when test="/set">
+ <!-- in a set, make sure we inherit the right book info... -->
+ <xsl:apply-templates mode="recursive-chunk-filename" select="parent::*">
+ <xsl:with-param name="recursive" select="true()"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:otherwise>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:text>rn</xsl:text>
+ <xsl:number level="any" format="01" from="book"/>
+ <xsl:if test="not($recursive)">
+ <xsl:value-of select="$html.ext"/>
+ </xsl:if>
+ </xsl:when>
+
+ <xsl:when test="self::refentry">
+ <xsl:choose>
+ <xsl:when test="parent::reference">
+ <xsl:apply-templates mode="recursive-chunk-filename" select="parent::*">
+ <xsl:with-param name="recursive" select="true()"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:if test="/set">
+ <!-- in a set, make sure we inherit the right book info... -->
+ <xsl:apply-templates mode="recursive-chunk-filename" select="parent::*">
+ <xsl:with-param name="recursive" select="true()"/>
+ </xsl:apply-templates>
+ </xsl:if>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:text>re</xsl:text>
+ <xsl:number level="any" format="01" from="book"/>
+ <xsl:if test="not($recursive)">
+ <xsl:value-of select="$html.ext"/>
+ </xsl:if>
+ </xsl:when>
+
+ <xsl:when test="self::colophon">
+ <xsl:choose>
+ <xsl:when test="/set">
+ <!-- in a set, make sure we inherit the right book info... -->
+ <xsl:apply-templates mode="recursive-chunk-filename" select="parent::*">
+ <xsl:with-param name="recursive" select="true()"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:otherwise>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:text>co</xsl:text>
+ <xsl:number level="any" format="01" from="book"/>
+ <xsl:if test="not($recursive)">
+ <xsl:value-of select="$html.ext"/>
+ </xsl:if>
+ </xsl:when>
+
+ <xsl:when test="self::sect1
+ or self::sect2
+ or self::sect3
+ or self::sect4
+ or self::sect5
+ or self::section">
+ <xsl:apply-templates mode="recursive-chunk-filename" select="parent::*">
+ <xsl:with-param name="recursive" select="true()"/>
+ </xsl:apply-templates>
+ <xsl:text>s</xsl:text>
+ <xsl:number format="01"/>
+ <xsl:if test="not($recursive)">
+ <xsl:value-of select="$html.ext"/>
+ </xsl:if>
+ </xsl:when>
+
+ <xsl:when test="self::bibliography">
+ <xsl:choose>
+ <xsl:when test="/set">
+ <!-- in a set, make sure we inherit the right book info... -->
+ <xsl:apply-templates mode="recursive-chunk-filename" select="parent::*">
+ <xsl:with-param name="recursive" select="true()"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:otherwise>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:text>bi</xsl:text>
+ <xsl:number level="any" format="01" from="book"/>
+ <xsl:if test="not($recursive)">
+ <xsl:value-of select="$html.ext"/>
+ </xsl:if>
+ </xsl:when>
+
+ <xsl:when test="self::glossary">
+ <xsl:choose>
+ <xsl:when test="/set">
+ <!-- in a set, make sure we inherit the right book info... -->
+ <xsl:apply-templates mode="recursive-chunk-filename" select="parent::*">
+ <xsl:with-param name="recursive" select="true()"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:otherwise>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:text>go</xsl:text>
+ <xsl:number level="any" format="01" from="book"/>
+ <xsl:if test="not($recursive)">
+ <xsl:value-of select="$html.ext"/>
+ </xsl:if>
+ </xsl:when>
+
+ <xsl:when test="self::index">
+ <xsl:choose>
+ <xsl:when test="/set">
+ <!-- in a set, make sure we inherit the right book info... -->
+ <xsl:apply-templates mode="recursive-chunk-filename" select="parent::*">
+ <xsl:with-param name="recursive" select="true()"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:otherwise>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:text>ix</xsl:text>
+ <xsl:number level="any" format="01" from="book"/>
+ <xsl:if test="not($recursive)">
+ <xsl:value-of select="$html.ext"/>
+ </xsl:if>
+ </xsl:when>
+
+ <xsl:when test="self::setindex">
+ <xsl:text>si</xsl:text>
+ <xsl:number level="any" format="01" from="set"/>
+ <xsl:if test="not($recursive)">
+ <xsl:value-of select="$html.ext"/>
+ </xsl:if>
+ </xsl:when>
+
+ <xsl:otherwise>
+ <xsl:text>chunk-filename-error-</xsl:text>
+ <xsl:value-of select="name(.)"/>
+ <xsl:number level="any" format="01" from="set"/>
+ <xsl:if test="not($recursive)">
+ <xsl:value-of select="$html.ext"/>
+ </xsl:if>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+
+
+<xsl:template match="processing-instruction('dbhtml')">
+ <!-- nop -->
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+
+<xsl:template match="*" mode="find.chunks">
+ <xsl:variable name="chunk">
+ <xsl:call-template name="chunk"/>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="$chunk != 0">
+ <cf:div id="{generate-id()}">
+ <xsl:apply-templates select="." mode="class.attribute"/>
+ <xsl:apply-templates select="*" mode="find.chunks"/>
+ </cf:div>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="*" mode="find.chunks"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="/">
+ <!-- * Get a title for current doc so that we let the user -->
+ <!-- * know what document we are processing at this point. -->
+ <xsl:variable name="doc.title">
+ <xsl:call-template name="get.doc.title"/>
+ </xsl:variable>
+ <xsl:choose>
+ <!-- Hack! If someone hands us a DocBook V5.x or DocBook NG document,
+ toss the namespace and continue. Use the docbook5 namespaced
+ stylesheets for DocBook5 if you don't want to use this feature.-->
+ <xsl:when test="$exsl.node.set.available != 0
+ and (*/self::ng:* or */self::db:*)">
+ <xsl:call-template name="log.message">
+ <xsl:with-param name="level">Note</xsl:with-param>
+ <xsl:with-param name="source" select="$doc.title"/>
+ <xsl:with-param name="context-desc">
+ <xsl:text>namesp. cut</xsl:text>
+ </xsl:with-param>
+ <xsl:with-param name="message">
+ <xsl:text>stripped namespace before processing</xsl:text>
+ </xsl:with-param>
+ </xsl:call-template>
+ <xsl:variable name="nons">
+ <xsl:apply-templates mode="stripNS"/>
+ </xsl:variable>
+ <xsl:call-template name="log.message">
+ <xsl:with-param name="level">Note</xsl:with-param>
+ <xsl:with-param name="source" select="$doc.title"/>
+ <xsl:with-param name="context-desc">
+ <xsl:text>namesp. cut</xsl:text>
+ </xsl:with-param>
+ <xsl:with-param name="message">
+ <xsl:text>processing stripped document</xsl:text>
+ </xsl:with-param>
+ </xsl:call-template>
+ <xsl:apply-templates select="exsl:node-set($nons)"/>
+ </xsl:when>
+ <!-- Can't process unless namespace removed -->
+ <xsl:when test="*/self::ng:* or */self::db:*">
+ <xsl:message terminate="yes">
+ <xsl:text>Unable to strip the namespace from DB5 document,</xsl:text>
+ <xsl:text> cannot proceed.</xsl:text>
+ </xsl:message>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:choose>
+ <xsl:when test="$rootid != ''">
+ <xsl:choose>
+ <xsl:when test="count(key('id',$rootid)) = 0">
+ <xsl:message terminate="yes">
+ <xsl:text>ID '</xsl:text>
+ <xsl:value-of select="$rootid"/>
+ <xsl:text>' not found in document.</xsl:text>
+ </xsl:message>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:if test="$collect.xref.targets = 'yes' or
+ $collect.xref.targets = 'only'">
+ <xsl:apply-templates select="key('id', $rootid)"
+ mode="collect.targets"/>
+ </xsl:if>
+ <xsl:if test="$collect.xref.targets != 'only'">
+ <xsl:apply-templates select="key('id',$rootid)"
+ mode="process.root"/>
+ <xsl:if test="$tex.math.in.alt != ''">
+ <xsl:apply-templates select="key('id',$rootid)"
+ mode="collect.tex.math"/>
+ </xsl:if>
+ <xsl:if test="$generate.manifest != 0">
+ <xsl:call-template name="generate.manifest">
+ <xsl:with-param name="node" select="key('id',$rootid)"/>
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:if>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:if test="$collect.xref.targets = 'yes' or
+ $collect.xref.targets = 'only'">
+ <xsl:apply-templates select="/" mode="collect.targets"/>
+ </xsl:if>
+ <xsl:if test="$collect.xref.targets != 'only'">
+ <xsl:apply-templates select="/" mode="process.root"/>
+ <xsl:if test="$tex.math.in.alt != ''">
+ <xsl:apply-templates select="/" mode="collect.tex.math"/>
+ </xsl:if>
+ <xsl:if test="$generate.manifest != 0">
+ <xsl:call-template name="generate.manifest">
+ <xsl:with-param name="node" select="/"/>
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:if>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="*" mode="process.root">
+ <xsl:apply-templates select="."/>
+ <xsl:call-template name="generate.css"/>
+</xsl:template>
+
+<!-- ====================================================================== -->
+
+<xsl:template match="set|book|part|preface|chapter|appendix
+ |article
+ |reference|refentry
+ |book/glossary|article/glossary|part/glossary
+ |book/bibliography|article/bibliography|part/bibliography
+ |colophon">
+ <xsl:choose>
+ <xsl:when test="$onechunk != 0 and parent::*">
+ <xsl:apply-imports/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="process-chunk-element"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="sect1|sect2|sect3|sect4|sect5|section">
+ <xsl:variable name="ischunk">
+ <xsl:call-template name="chunk"/>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="not(parent::*)">
+ <xsl:call-template name="process-chunk-element"/>
+ </xsl:when>
+ <xsl:when test="$ischunk = 0">
+ <xsl:apply-imports/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="process-chunk-element"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="setindex
+ |book/index
+ |article/index
+ |part/index">
+ <!-- some implementations use completely empty index tags to indicate -->
+ <!-- where an automatically generated index should be inserted. so -->
+ <!-- if the index is completely empty, skip it. -->
+ <xsl:if test="count(*)>0 or $generate.index != '0'">
+ <xsl:call-template name="process-chunk-element"/>
+ </xsl:if>
+</xsl:template>
+
+<!-- Resolve xml:base attributes -->
+<xsl:template match="@fileref">
+ <!-- need a check for absolute urls -->
+ <xsl:choose>
+ <xsl:when test="contains(., ':')">
+ <!-- it has a uri scheme so it is an absolute uri -->
+ <xsl:value-of select="."/>
+ </xsl:when>
+ <xsl:when test="$keep.relative.image.uris != 0">
+ <!-- leave it alone -->
+ <xsl:value-of select="."/>
+ </xsl:when>
+ <xsl:otherwise>
+ <!-- its a relative uri -->
+ <xsl:call-template name="relative-uri">
+ <xsl:with-param name="destdir">
+ <xsl:call-template name="dbhtml-dir">
+ <xsl:with-param name="context" select=".."/>
+ </xsl:call-template>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ==================================================================== -->
+<xsl:template match="set|book|part|preface|chapter|appendix
+ |article
+ |reference|refentry
+ |sect1|sect2|sect3|sect4|sect5
+ |section
+ |book/glossary|article/glossary|part/glossary
+ |book/bibliography|article/bibliography|part/bibliography
+ |colophon"
+ mode="enumerate-files">
+ <xsl:variable name="ischunk"><xsl:call-template name="chunk"/></xsl:variable>
+ <xsl:if test="$ischunk='1'">
+ <xsl:call-template name="make-relative-filename">
+ <xsl:with-param name="base.dir">
+ <xsl:if test="$manifest.in.base.dir = 0">
+ <xsl:value-of select="$base.dir"/>
+ </xsl:if>
+ </xsl:with-param>
+ <xsl:with-param name="base.name">
+ <xsl:apply-templates mode="chunk-filename" select="."/>
+ </xsl:with-param>
+ </xsl:call-template>
+ <xsl:text>&#10;</xsl:text>
+ </xsl:if>
+ <xsl:apply-templates select="*" mode="enumerate-files"/>
+</xsl:template>
+
+<xsl:template match="book/index|article/index|part/index"
+ mode="enumerate-files">
+ <xsl:if test="$htmlhelp.output != 1">
+ <xsl:variable name="ischunk"><xsl:call-template name="chunk"/></xsl:variable>
+ <xsl:if test="$ischunk='1'">
+ <xsl:call-template name="make-relative-filename">
+ <xsl:with-param name="base.dir">
+ <xsl:if test="$manifest.in.base.dir = 0">
+ <xsl:value-of select="$base.dir"/>
+ </xsl:if>
+ </xsl:with-param>
+ <xsl:with-param name="base.name">
+ <xsl:apply-templates mode="chunk-filename" select="."/>
+ </xsl:with-param>
+ </xsl:call-template>
+ <xsl:text>&#10;</xsl:text>
+ </xsl:if>
+ <xsl:apply-templates select="*" mode="enumerate-files"/>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="legalnotice" mode="enumerate-files">
+ <xsl:variable name="id"><xsl:call-template name="object.id"/></xsl:variable>
+ <xsl:if test="$generate.legalnotice.link != 0">
+ <xsl:call-template name="make-relative-filename">
+ <xsl:with-param name="base.dir">
+ <xsl:if test="$manifest.in.base.dir = 0">
+ <xsl:value-of select="$base.dir"/>
+ </xsl:if>
+ </xsl:with-param>
+ <xsl:with-param name="base.name">
+ <xsl:apply-templates mode="chunk-filename" select="."/>
+ </xsl:with-param>
+ </xsl:call-template>
+ <xsl:text>&#10;</xsl:text>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="mediaobject[imageobject] | inlinemediaobject[imageobject]" mode="enumerate-files">
+ <xsl:variable name="longdesc.uri">
+ <xsl:call-template name="longdesc.uri">
+ <xsl:with-param name="mediaobject"
+ select="."/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:variable name="mediaobject" select="."/>
+
+ <xsl:if test="$html.longdesc != 0 and $mediaobject/textobject[not(phrase)]">
+ <xsl:call-template name="longdesc.uri">
+ <xsl:with-param name="mediaobject" select="$mediaobject"/>
+ </xsl:call-template>
+ <xsl:text>&#10;</xsl:text>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="text()" mode="enumerate-files">
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/chunk-common.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/chunk-common.xsl
new file mode 100644
index 0000000..0ea2df5
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/chunk-common.xsl
@@ -0,0 +1,1920 @@
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:exsl="http://exslt.org/common"
+ xmlns:cf="http://docbook.sourceforge.net/xmlns/chunkfast/1.0"
+ xmlns:ng="http://docbook.org/docbook-ng"
+ xmlns:db="http://docbook.org/ns/docbook"
+ version="1.0"
+ exclude-result-prefixes="exsl cf ng db">
+
+<!-- ********************************************************************
+ $Id: chunk-common.xsl 8551 2009-12-07 06:03:50Z bobstayton $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<!-- ==================================================================== -->
+
+<xsl:param name="onechunk" select="0"/>
+<xsl:param name="refentry.separator" select="0"/>
+<xsl:param name="chunk.fast" select="0"/>
+
+<xsl:key name="genid" match="*" use="generate-id()"/>
+
+<!-- ==================================================================== -->
+
+<xsl:variable name="chunk.hierarchy">
+ <xsl:if test="$chunk.fast != 0">
+ <xsl:choose>
+ <xsl:when test="$exsl.node.set.available != 0">
+ <xsl:message>Computing chunks...</xsl:message>
+ <xsl:apply-templates select="/*" mode="find.chunks"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:message>
+ <xsl:text>Fast chunking requires exsl:node-set(). </xsl:text>
+ <xsl:text>Using "slow" chunking.</xsl:text>
+ </xsl:message>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:if>
+</xsl:variable>
+
+<!-- ==================================================================== -->
+
+<xsl:template name="process-chunk-element">
+ <xsl:param name="content">
+ <xsl:apply-imports/>
+ </xsl:param>
+
+ <xsl:choose>
+ <xsl:when test="$chunk.fast != 0 and $exsl.node.set.available != 0">
+ <xsl:variable name="chunks" select="exsl:node-set($chunk.hierarchy)//cf:div"/>
+ <xsl:variable name="genid" select="generate-id()"/>
+
+ <xsl:variable name="div" select="$chunks[@id=$genid or @xml:id=$genid]"/>
+
+ <xsl:variable name="prevdiv"
+ select="($div/preceding-sibling::cf:div|$div/preceding::cf:div|$div/parent::cf:div)[last()]"/>
+ <xsl:variable name="prev" select="key('genid', ($prevdiv/@id|$prevdiv/@xml:id)[1])"/>
+
+ <xsl:variable name="nextdiv"
+ select="($div/following-sibling::cf:div|$div/following::cf:div|$div/cf:div)[1]"/>
+ <xsl:variable name="next" select="key('genid', ($nextdiv/@id|$nextdiv/@xml:id)[1])"/>
+
+ <xsl:choose>
+ <xsl:when test="$onechunk != 0 and parent::*">
+ <xsl:copy-of select="$content"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="process-chunk">
+ <xsl:with-param name="prev" select="$prev"/>
+ <xsl:with-param name="next" select="$next"/>
+ <xsl:with-param name="content" select="$content"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:choose>
+ <xsl:when test="$onechunk != 0 and not(parent::*)">
+ <xsl:call-template name="chunk-all-sections">
+ <xsl:with-param name="content" select="$content"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="$onechunk != 0">
+ <xsl:copy-of select="$content"/>
+ </xsl:when>
+ <xsl:when test="$chunk.first.sections = 0">
+ <xsl:call-template name="chunk-first-section-with-parent">
+ <xsl:with-param name="content" select="$content"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="chunk-all-sections">
+ <xsl:with-param name="content" select="$content"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="process-chunk">
+ <xsl:param name="prev" select="."/>
+ <xsl:param name="next" select="."/>
+ <xsl:param name="content">
+ <xsl:apply-imports/>
+ </xsl:param>
+
+ <xsl:variable name="ischunk">
+ <xsl:call-template name="chunk"/>
+ </xsl:variable>
+
+ <xsl:variable name="chunkfn">
+ <xsl:if test="$ischunk='1'">
+ <xsl:apply-templates mode="chunk-filename" select="."/>
+ </xsl:if>
+ </xsl:variable>
+
+ <xsl:if test="$ischunk='0'">
+ <xsl:message>
+ <xsl:text>Error </xsl:text>
+ <xsl:value-of select="name(.)"/>
+ <xsl:text> is not a chunk!</xsl:text>
+ </xsl:message>
+ </xsl:if>
+
+ <xsl:variable name="filename">
+ <xsl:call-template name="make-relative-filename">
+ <xsl:with-param name="base.dir" select="$base.dir"/>
+ <xsl:with-param name="base.name" select="$chunkfn"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:call-template name="write.chunk">
+ <xsl:with-param name="filename" select="$filename"/>
+ <xsl:with-param name="content">
+ <xsl:call-template name="chunk-element-content">
+ <xsl:with-param name="prev" select="$prev"/>
+ <xsl:with-param name="next" select="$next"/>
+ <xsl:with-param name="content" select="$content"/>
+ </xsl:call-template>
+ </xsl:with-param>
+ <xsl:with-param name="quiet" select="$chunk.quietly"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template name="chunk-first-section-with-parent">
+ <xsl:param name="content">
+ <xsl:apply-imports/>
+ </xsl:param>
+
+ <!-- These xpath expressions are really hairy. The trick is to pick sections -->
+ <!-- that are not first children and are not the children of first children -->
+
+ <!-- Break these variables into pieces to work around
+ http://nagoya.apache.org/bugzilla/show_bug.cgi?id=6063 -->
+
+ <xsl:variable name="prev-v1"
+ select="(ancestor::sect1[$chunk.section.depth &gt; 0
+ and not(ancestor::*/processing-instruction('dbhtml')[normalize-space(.) ='stop-chunking'])
+ and preceding-sibling::sect1][1]
+
+ |ancestor::sect2[$chunk.section.depth &gt; 1
+ and not(ancestor::*/processing-instruction('dbhtml')[normalize-space(.) ='stop-chunking'])
+ and preceding-sibling::sect2
+ and parent::sect1[preceding-sibling::sect1]][1]
+
+ |ancestor::sect3[$chunk.section.depth &gt; 2
+ and not(ancestor::*/processing-instruction('dbhtml')[normalize-space(.) ='stop-chunking'])
+ and preceding-sibling::sect3
+ and parent::sect2[preceding-sibling::sect2]
+ and ancestor::sect1[preceding-sibling::sect1]][1]
+
+ |ancestor::sect4[$chunk.section.depth &gt; 3
+ and not(ancestor::*/processing-instruction('dbhtml')[normalize-space(.) ='stop-chunking'])
+ and preceding-sibling::sect4
+ and parent::sect3[preceding-sibling::sect3]
+ and ancestor::sect2[preceding-sibling::sect2]
+ and ancestor::sect1[preceding-sibling::sect1]][1]
+
+ |ancestor::sect5[$chunk.section.depth &gt; 4
+ and not(ancestor::*/processing-instruction('dbhtml')[normalize-space(.) ='stop-chunking'])
+ and preceding-sibling::sect5
+ and parent::sect4[preceding-sibling::sect4]
+ and ancestor::sect3[preceding-sibling::sect3]
+ and ancestor::sect2[preceding-sibling::sect2]
+ and ancestor::sect1[preceding-sibling::sect1]][1]
+
+ |ancestor::section[$chunk.section.depth &gt; count(ancestor::section)
+ and not(ancestor::*/processing-instruction('dbhtml')[normalize-space(.) ='stop-chunking'])
+ and not(ancestor::section[not(preceding-sibling::section)])][1])[last()]"/>
+
+ <xsl:variable name="prev-v2"
+ select="(preceding::sect1[$chunk.section.depth &gt; 0
+ and not(ancestor::*/processing-instruction('dbhtml')[normalize-space(.) ='stop-chunking'])
+ and preceding-sibling::sect1][1]
+
+ |preceding::sect2[$chunk.section.depth &gt; 1
+ and not(ancestor::*/processing-instruction('dbhtml')[normalize-space(.) ='stop-chunking'])
+ and preceding-sibling::sect2
+ and parent::sect1[preceding-sibling::sect1]][1]
+
+ |preceding::sect3[$chunk.section.depth &gt; 2
+ and not(ancestor::*/processing-instruction('dbhtml')[normalize-space(.) ='stop-chunking'])
+ and preceding-sibling::sect3
+ and parent::sect2[preceding-sibling::sect2]
+ and ancestor::sect1[preceding-sibling::sect1]][1]
+
+ |preceding::sect4[$chunk.section.depth &gt; 3
+ and not(ancestor::*/processing-instruction('dbhtml')[normalize-space(.) ='stop-chunking'])
+ and preceding-sibling::sect4
+ and parent::sect3[preceding-sibling::sect3]
+ and ancestor::sect2[preceding-sibling::sect2]
+ and ancestor::sect1[preceding-sibling::sect1]][1]
+
+ |preceding::sect5[$chunk.section.depth &gt; 4
+ and not(ancestor::*/processing-instruction('dbhtml')[normalize-space(.) ='stop-chunking'])
+ and preceding-sibling::sect5
+ and parent::sect4[preceding-sibling::sect4]
+ and ancestor::sect3[preceding-sibling::sect3]
+ and ancestor::sect2[preceding-sibling::sect2]
+ and ancestor::sect1[preceding-sibling::sect1]][1]
+
+ |preceding::section[$chunk.section.depth &gt; count(ancestor::section)
+ and not(ancestor::*/processing-instruction('dbhtml')[normalize-space(.) ='stop-chunking'])
+ and preceding-sibling::section
+ and not(ancestor::section[not(preceding-sibling::section)])][1])[last()]"/>
+
+ <xsl:variable name="prev"
+ select="(preceding::book[1]
+ |preceding::preface[1]
+ |preceding::chapter[1]
+ |preceding::appendix[1]
+ |preceding::part[1]
+ |preceding::reference[1]
+ |preceding::refentry[1]
+ |preceding::colophon[1]
+ |preceding::article[1]
+ |preceding::bibliography[parent::article or parent::book or parent::part][1]
+ |preceding::glossary[parent::article or parent::book or parent::part][1]
+ |preceding::index[$generate.index != 0]
+ [parent::article or parent::book or parent::part][1]
+ |preceding::setindex[$generate.index != 0][1]
+ |ancestor::set
+ |ancestor::book[1]
+ |ancestor::preface[1]
+ |ancestor::chapter[1]
+ |ancestor::appendix[1]
+ |ancestor::part[1]
+ |ancestor::reference[1]
+ |ancestor::article[1]
+ |$prev-v1
+ |$prev-v2)[last()]"/>
+
+ <xsl:variable name="next-v1"
+ select="(following::sect1[$chunk.section.depth &gt; 0
+ and not(ancestor::*/processing-instruction('dbhtml')[normalize-space(.) ='stop-chunking'])
+ and preceding-sibling::sect1][1]
+
+ |following::sect2[$chunk.section.depth &gt; 1
+ and not(ancestor::*/processing-instruction('dbhtml')[normalize-space(.) ='stop-chunking'])
+ and preceding-sibling::sect2
+ and parent::sect1[preceding-sibling::sect1]][1]
+
+ |following::sect3[$chunk.section.depth &gt; 2
+ and not(ancestor::*/processing-instruction('dbhtml')[normalize-space(.) ='stop-chunking'])
+ and preceding-sibling::sect3
+ and parent::sect2[preceding-sibling::sect2]
+ and ancestor::sect1[preceding-sibling::sect1]][1]
+
+ |following::sect4[$chunk.section.depth &gt; 3
+ and not(ancestor::*/processing-instruction('dbhtml')[normalize-space(.) ='stop-chunking'])
+ and preceding-sibling::sect4
+ and parent::sect3[preceding-sibling::sect3]
+ and ancestor::sect2[preceding-sibling::sect2]
+ and ancestor::sect1[preceding-sibling::sect1]][1]
+
+ |following::sect5[$chunk.section.depth &gt; 4
+ and not(ancestor::*/processing-instruction('dbhtml')[normalize-space(.) ='stop-chunking'])
+ and preceding-sibling::sect5
+ and parent::sect4[preceding-sibling::sect4]
+ and ancestor::sect3[preceding-sibling::sect3]
+ and ancestor::sect2[preceding-sibling::sect2]
+ and ancestor::sect1[preceding-sibling::sect1]][1]
+
+ |following::section[$chunk.section.depth &gt; count(ancestor::section)
+ and not(ancestor::*/processing-instruction('dbhtml')[normalize-space(.) ='stop-chunking'])
+ and preceding-sibling::section
+ and not(ancestor::section[not(preceding-sibling::section)])][1])[1]"/>
+
+ <xsl:variable name="next-v2"
+ select="(descendant::sect1[$chunk.section.depth &gt; 0
+ and not(ancestor::*/processing-instruction('dbhtml')[normalize-space(.) ='stop-chunking'])
+ and preceding-sibling::sect1][1]
+
+ |descendant::sect2[$chunk.section.depth &gt; 1
+ and not(ancestor::*/processing-instruction('dbhtml')[normalize-space(.) ='stop-chunking'])
+ and preceding-sibling::sect2
+ and parent::sect1[preceding-sibling::sect1]][1]
+
+ |descendant::sect3[$chunk.section.depth &gt; 2
+ and not(ancestor::*/processing-instruction('dbhtml')[normalize-space(.) ='stop-chunking'])
+ and preceding-sibling::sect3
+ and parent::sect2[preceding-sibling::sect2]
+ and ancestor::sect1[preceding-sibling::sect1]][1]
+
+ |descendant::sect4[$chunk.section.depth &gt; 3
+ and not(ancestor::*/processing-instruction('dbhtml')[normalize-space(.) ='stop-chunking'])
+ and preceding-sibling::sect4
+ and parent::sect3[preceding-sibling::sect3]
+ and ancestor::sect2[preceding-sibling::sect2]
+ and ancestor::sect1[preceding-sibling::sect1]][1]
+
+ |descendant::sect5[$chunk.section.depth &gt; 4
+ and not(ancestor::*/processing-instruction('dbhtml')[normalize-space(.) ='stop-chunking'])
+ and preceding-sibling::sect5
+ and parent::sect4[preceding-sibling::sect4]
+ and ancestor::sect3[preceding-sibling::sect3]
+ and ancestor::sect2[preceding-sibling::sect2]
+ and ancestor::sect1[preceding-sibling::sect1]][1]
+
+ |descendant::section[$chunk.section.depth &gt; count(ancestor::section)
+ and not(ancestor::*/processing-instruction('dbhtml')[normalize-space(.) ='stop-chunking'])
+ and preceding-sibling::section
+ and not(ancestor::section[not(preceding-sibling::section)])])[1]"/>
+
+ <xsl:variable name="next"
+ select="(following::book[1]
+ |following::preface[1]
+ |following::chapter[1]
+ |following::appendix[1]
+ |following::part[1]
+ |following::reference[1]
+ |following::refentry[1]
+ |following::colophon[1]
+ |following::bibliography[parent::article or parent::book or parent::part][1]
+ |following::glossary[parent::article or parent::book or parent::part][1]
+ |following::index[$generate.index != 0]
+ [parent::article or parent::book or parent::part][1]
+ |following::article[1]
+ |following::setindex[$generate.index != 0][1]
+ |descendant::book[1]
+ |descendant::preface[1]
+ |descendant::chapter[1]
+ |descendant::appendix[1]
+ |descendant::article[1]
+ |descendant::bibliography[parent::article or parent::book or parent::part][1]
+ |descendant::glossary[parent::article or parent::book or parent::part][1]
+ |descendant::index[$generate.index != 0]
+ [parent::article or parent::book or parent::part][1]
+ |descendant::colophon[1]
+ |descendant::setindex[$generate.index != 0][1]
+ |descendant::part[1]
+ |descendant::reference[1]
+ |descendant::refentry[1]
+ |$next-v1
+ |$next-v2)[1]"/>
+
+ <xsl:call-template name="process-chunk">
+ <xsl:with-param name="prev" select="$prev"/>
+ <xsl:with-param name="next" select="$next"/>
+ <xsl:with-param name="content" select="$content"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template name="chunk-all-sections">
+ <xsl:param name="content">
+ <xsl:apply-imports/>
+ </xsl:param>
+
+ <xsl:variable name="prev-v1"
+ select="(preceding::sect1[$chunk.section.depth &gt; 0 and not(ancestor::*/processing-instruction('dbhtml')[normalize-space(.) ='stop-chunking'])][1]
+ |preceding::sect2[$chunk.section.depth &gt; 1 and not(ancestor::*/processing-instruction('dbhtml')[normalize-space(.) ='stop-chunking'])][1]
+ |preceding::sect3[$chunk.section.depth &gt; 2 and not(ancestor::*/processing-instruction('dbhtml')[normalize-space(.) ='stop-chunking'])][1]
+ |preceding::sect4[$chunk.section.depth &gt; 3 and not(ancestor::*/processing-instruction('dbhtml')[normalize-space(.) ='stop-chunking'])][1]
+ |preceding::sect5[$chunk.section.depth &gt; 4 and not(ancestor::*/processing-instruction('dbhtml')[normalize-space(.) ='stop-chunking'])][1]
+ |preceding::section[$chunk.section.depth &gt; count(ancestor::section) and not(ancestor::*/processing-instruction('dbhtml')[normalize-space(.) ='stop-chunking'])][1])[last()]"/>
+
+ <xsl:variable name="prev-v2"
+ select="(ancestor::sect1[$chunk.section.depth &gt; 0 and not(ancestor::*/processing-instruction('dbhtml')[normalize-space(.) ='stop-chunking'])][1]
+ |ancestor::sect2[$chunk.section.depth &gt; 1 and not(ancestor::*/processing-instruction('dbhtml')[normalize-space(.) ='stop-chunking'])][1]
+ |ancestor::sect3[$chunk.section.depth &gt; 2 and not(ancestor::*/processing-instruction('dbhtml')[normalize-space(.) ='stop-chunking'])][1]
+ |ancestor::sect4[$chunk.section.depth &gt; 3 and not(ancestor::*/processing-instruction('dbhtml')[normalize-space(.) ='stop-chunking'])][1]
+ |ancestor::sect5[$chunk.section.depth &gt; 4 and not(ancestor::*/processing-instruction('dbhtml')[normalize-space(.) ='stop-chunking'])][1]
+ |ancestor::section[$chunk.section.depth &gt; count(ancestor::section) and not(ancestor::*/processing-instruction('dbhtml')[normalize-space(.) ='stop-chunking'])][1])[last()]"/>
+
+ <xsl:variable name="prev"
+ select="(preceding::book[1]
+ |preceding::preface[1]
+ |preceding::chapter[1]
+ |preceding::appendix[1]
+ |preceding::part[1]
+ |preceding::reference[1]
+ |preceding::refentry[1]
+ |preceding::colophon[1]
+ |preceding::article[1]
+ |preceding::bibliography[parent::article or parent::book or parent::part][1]
+ |preceding::glossary[parent::article or parent::book or parent::part][1]
+ |preceding::index[$generate.index != 0]
+ [parent::article or parent::book or parent::part][1]
+ |preceding::setindex[$generate.index != 0][1]
+ |ancestor::set
+ |ancestor::book[1]
+ |ancestor::preface[1]
+ |ancestor::chapter[1]
+ |ancestor::appendix[1]
+ |ancestor::part[1]
+ |ancestor::reference[1]
+ |ancestor::article[1]
+ |$prev-v1
+ |$prev-v2)[last()]"/>
+
+ <xsl:variable name="next-v1"
+ select="(following::sect1[$chunk.section.depth &gt; 0 and not(ancestor::*/processing-instruction('dbhtml')[normalize-space(.) ='stop-chunking'])][1]
+ |following::sect2[$chunk.section.depth &gt; 1 and not(ancestor::*/processing-instruction('dbhtml')[normalize-space(.) ='stop-chunking'])][1]
+ |following::sect3[$chunk.section.depth &gt; 2 and not(ancestor::*/processing-instruction('dbhtml')[normalize-space(.) ='stop-chunking'])][1]
+ |following::sect4[$chunk.section.depth &gt; 3 and not(ancestor::*/processing-instruction('dbhtml')[normalize-space(.) ='stop-chunking'])][1]
+ |following::sect5[$chunk.section.depth &gt; 4 and not(ancestor::*/processing-instruction('dbhtml')[normalize-space(.) ='stop-chunking'])][1]
+ |following::section[$chunk.section.depth &gt; count(ancestor::section) and not(ancestor::*/processing-instruction('dbhtml')[normalize-space(.) ='stop-chunking'])][1])[1]"/>
+
+ <xsl:variable name="next-v2"
+ select="(descendant::sect1[$chunk.section.depth &gt; 0 and not(ancestor::*/processing-instruction('dbhtml')[normalize-space(.) ='stop-chunking'])][1]
+ |descendant::sect2[$chunk.section.depth &gt; 1 and not(ancestor::*/processing-instruction('dbhtml')[normalize-space(.) ='stop-chunking'])][1]
+ |descendant::sect3[$chunk.section.depth &gt; 2 and not(ancestor::*/processing-instruction('dbhtml')[normalize-space(.) ='stop-chunking'])][1]
+ |descendant::sect4[$chunk.section.depth &gt; 3 and not(ancestor::*/processing-instruction('dbhtml')[normalize-space(.) ='stop-chunking'])][1]
+ |descendant::sect5[$chunk.section.depth &gt; 4 and not(ancestor::*/processing-instruction('dbhtml')[normalize-space(.) ='stop-chunking'])][1]
+ |descendant::section[$chunk.section.depth
+ &gt; count(ancestor::section) and not(ancestor::*/processing-instruction('dbhtml')[normalize-space(.) ='stop-chunking'])][1])[1]"/>
+
+ <xsl:variable name="next"
+ select="(following::book[1]
+ |following::preface[1]
+ |following::chapter[1]
+ |following::appendix[1]
+ |following::part[1]
+ |following::reference[1]
+ |following::refentry[1]
+ |following::colophon[1]
+ |following::bibliography[parent::article or parent::book or parent::part][1]
+ |following::glossary[parent::article or parent::book or parent::part][1]
+ |following::index[$generate.index != 0]
+ [parent::article or parent::book][1]
+ |following::article[1]
+ |following::setindex[$generate.index != 0][1]
+ |descendant::book[1]
+ |descendant::preface[1]
+ |descendant::chapter[1]
+ |descendant::appendix[1]
+ |descendant::article[1]
+ |descendant::bibliography[parent::article or parent::book][1]
+ |descendant::glossary[parent::article or parent::book or parent::part][1]
+ |descendant::index[$generate.index != 0]
+ [parent::article or parent::book][1]
+ |descendant::colophon[1]
+ |descendant::setindex[$generate.index != 0][1]
+ |descendant::part[1]
+ |descendant::reference[1]
+ |descendant::refentry[1]
+ |$next-v1
+ |$next-v2)[1]"/>
+
+ <xsl:call-template name="process-chunk">
+ <xsl:with-param name="prev" select="$prev"/>
+ <xsl:with-param name="next" select="$next"/>
+ <xsl:with-param name="content" select="$content"/>
+ </xsl:call-template>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<!-- ==================================================================== -->
+
+<xsl:template name="make.lots">
+ <xsl:param name="toc.params" select="''"/>
+ <xsl:param name="toc"/>
+
+ <xsl:variable name="lots">
+ <xsl:if test="contains($toc.params, 'toc')">
+ <xsl:copy-of select="$toc"/>
+ </xsl:if>
+
+ <xsl:if test="contains($toc.params, 'figure')">
+ <xsl:choose>
+ <xsl:when test="$chunk.separate.lots != '0'">
+ <xsl:call-template name="make.lot.chunk">
+ <xsl:with-param name="type" select="'figure'"/>
+ <xsl:with-param name="lot">
+ <xsl:call-template name="list.of.titles">
+ <xsl:with-param name="titles" select="'figure'"/>
+ <xsl:with-param name="nodes" select=".//figure"/>
+ </xsl:call-template>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="list.of.titles">
+ <xsl:with-param name="titles" select="'figure'"/>
+ <xsl:with-param name="nodes" select=".//figure"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:if>
+
+ <xsl:if test="contains($toc.params, 'table')">
+ <xsl:choose>
+ <xsl:when test="$chunk.separate.lots != '0'">
+ <xsl:call-template name="make.lot.chunk">
+ <xsl:with-param name="type" select="'table'"/>
+ <xsl:with-param name="lot">
+ <xsl:call-template name="list.of.titles">
+ <xsl:with-param name="titles" select="'table'"/>
+ <xsl:with-param name="nodes" select=".//table"/>
+ </xsl:call-template>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="list.of.titles">
+ <xsl:with-param name="titles" select="'table'"/>
+ <xsl:with-param name="nodes" select=".//table"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:if>
+
+ <xsl:if test="contains($toc.params, 'example')">
+ <xsl:choose>
+ <xsl:when test="$chunk.separate.lots != '0'">
+ <xsl:call-template name="make.lot.chunk">
+ <xsl:with-param name="type" select="'example'"/>
+ <xsl:with-param name="lot">
+ <xsl:call-template name="list.of.titles">
+ <xsl:with-param name="titles" select="'example'"/>
+ <xsl:with-param name="nodes" select=".//example"/>
+ </xsl:call-template>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="list.of.titles">
+ <xsl:with-param name="titles" select="'example'"/>
+ <xsl:with-param name="nodes" select=".//example"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:if>
+
+ <xsl:if test="contains($toc.params, 'equation')">
+ <xsl:choose>
+ <xsl:when test="$chunk.separate.lots != '0'">
+ <xsl:call-template name="make.lot.chunk">
+ <xsl:with-param name="type" select="'equation'"/>
+ <xsl:with-param name="lot">
+ <xsl:call-template name="list.of.titles">
+ <xsl:with-param name="titles" select="'equation'"/>
+ <xsl:with-param name="nodes" select=".//equation[title or info/title]"/>
+ </xsl:call-template>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="list.of.titles">
+ <xsl:with-param name="titles" select="'equation'"/>
+ <xsl:with-param name="nodes" select=".//equation[title or info/title]"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:if>
+
+ <xsl:if test="contains($toc.params, 'procedure')">
+ <xsl:choose>
+ <xsl:when test="$chunk.separate.lots != '0'">
+ <xsl:call-template name="make.lot.chunk">
+ <xsl:with-param name="type" select="'procedure'"/>
+ <xsl:with-param name="lot">
+ <xsl:call-template name="list.of.titles">
+ <xsl:with-param name="titles" select="'procedure'"/>
+ <xsl:with-param name="nodes" select=".//procedure[title]"/>
+ </xsl:call-template>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="list.of.titles">
+ <xsl:with-param name="titles" select="'procedure'"/>
+ <xsl:with-param name="nodes" select=".//procedure[title]"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:if>
+ </xsl:variable>
+
+ <xsl:if test="string($lots) != ''">
+ <xsl:choose>
+ <xsl:when test="$chunk.tocs.and.lots != 0 and not(parent::*)">
+ <xsl:call-template name="write.chunk">
+ <xsl:with-param name="filename">
+ <xsl:call-template name="make-relative-filename">
+ <xsl:with-param name="base.dir" select="$base.dir"/>
+ <xsl:with-param name="base.name">
+ <xsl:call-template name="dbhtml-dir"/>
+ <xsl:apply-templates select="." mode="recursive-chunk-filename">
+ <xsl:with-param name="recursive" select="true()"/>
+ </xsl:apply-templates>
+ <xsl:text>-toc</xsl:text>
+ <xsl:value-of select="$html.ext"/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:with-param>
+ <xsl:with-param name="content">
+ <xsl:call-template name="chunk-element-content">
+ <xsl:with-param name="prev" select="/foo"/>
+ <xsl:with-param name="next" select="/foo"/>
+ <xsl:with-param name="nav.context" select="'toc'"/>
+ <xsl:with-param name="content">
+ <xsl:if test="$chunk.tocs.and.lots.has.title != 0">
+ <h1>
+ <xsl:apply-templates select="." mode="object.title.markup"/>
+ </h1>
+ </xsl:if>
+ <xsl:copy-of select="$lots"/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:with-param>
+ <xsl:with-param name="quiet" select="$chunk.quietly"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:copy-of select="$lots"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template name="make.lot.chunk">
+ <xsl:param name="type" select="''"/>
+ <xsl:param name="lot"/>
+
+ <xsl:if test="string($lot) != ''">
+ <xsl:variable name="filename">
+ <xsl:call-template name="make-relative-filename">
+ <xsl:with-param name="base.dir" select="$base.dir"/>
+ <xsl:with-param name="base.name">
+ <xsl:call-template name="dbhtml-dir"/>
+ <xsl:value-of select="$type"/>
+ <xsl:text>-toc</xsl:text>
+ <xsl:value-of select="$html.ext"/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="href">
+ <xsl:call-template name="make-relative-filename">
+ <xsl:with-param name="base.name">
+ <xsl:call-template name="dbhtml-dir"/>
+ <xsl:value-of select="$type"/>
+ <xsl:text>-toc</xsl:text>
+ <xsl:value-of select="$html.ext"/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:call-template name="write.chunk">
+ <xsl:with-param name="filename" select="$filename"/>
+ <xsl:with-param name="content">
+ <xsl:call-template name="chunk-element-content">
+ <xsl:with-param name="prev" select="/foo"/>
+ <xsl:with-param name="next" select="/foo"/>
+ <xsl:with-param name="nav.context" select="'toc'"/>
+ <xsl:with-param name="content">
+ <xsl:copy-of select="$lot"/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:with-param>
+ <xsl:with-param name="quiet" select="$chunk.quietly"/>
+ </xsl:call-template>
+ <!-- And output a link to this file -->
+ <div>
+ <xsl:attribute name="class">
+ <xsl:text>ListofTitles</xsl:text>
+ </xsl:attribute>
+ <a href="{$href}">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key">
+ <xsl:choose>
+ <xsl:when test="$type='table'">ListofTables</xsl:when>
+ <xsl:when test="$type='figure'">ListofFigures</xsl:when>
+ <xsl:when test="$type='equation'">ListofEquations</xsl:when>
+ <xsl:when test="$type='example'">ListofExamples</xsl:when>
+ <xsl:when test="$type='procedure'">ListofProcedures</xsl:when>
+ <xsl:otherwise>ListofUnknown</xsl:otherwise>
+ </xsl:choose>
+ </xsl:with-param>
+ </xsl:call-template>
+ </a>
+ </div>
+ </xsl:if>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template name="in.other.chunk">
+ <xsl:param name="chunk" select="."/>
+ <xsl:param name="node" select="."/>
+
+ <xsl:variable name="is.chunk">
+ <xsl:call-template name="chunk">
+ <xsl:with-param name="node" select="$node"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+<!--
+ <xsl:message>
+ <xsl:text>in.other.chunk: </xsl:text>
+ <xsl:value-of select="name($chunk)"/>
+ <xsl:text> </xsl:text>
+ <xsl:value-of select="name($node)"/>
+ <xsl:text> </xsl:text>
+ <xsl:value-of select="$chunk = $node"/>
+ <xsl:text> </xsl:text>
+ <xsl:value-of select="$is.chunk"/>
+ </xsl:message>
+-->
+
+ <xsl:choose>
+ <xsl:when test="$chunk = $node">0</xsl:when>
+ <xsl:when test="$is.chunk = 1">1</xsl:when>
+ <xsl:when test="count($node) = 0">0</xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="in.other.chunk">
+ <xsl:with-param name="chunk" select="$chunk"/>
+ <xsl:with-param name="node" select="$node/parent::*"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="count.footnotes.in.this.chunk">
+ <xsl:param name="node" select="."/>
+ <xsl:param name="footnotes" select="$node//footnote"/>
+ <xsl:param name="count" select="0"/>
+
+<!--
+ <xsl:message>
+ <xsl:text>count.footnotes.in.this.chunk: </xsl:text>
+ <xsl:value-of select="name($node)"/>
+ </xsl:message>
+-->
+
+ <xsl:variable name="in.other.chunk">
+ <xsl:call-template name="in.other.chunk">
+ <xsl:with-param name="chunk" select="$node"/>
+ <xsl:with-param name="node" select="$footnotes[1]"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="count($footnotes) = 0">
+ <xsl:value-of select="$count"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:choose>
+ <xsl:when test="$in.other.chunk != 0">
+ <xsl:call-template name="count.footnotes.in.this.chunk">
+ <xsl:with-param name="node" select="$node"/>
+ <xsl:with-param name="footnotes"
+ select="$footnotes[position() &gt; 1]"/>
+ <xsl:with-param name="count" select="$count"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="$footnotes[1]/ancestor::table
+ |$footnotes[1]/ancestor::informaltable">
+ <xsl:call-template name="count.footnotes.in.this.chunk">
+ <xsl:with-param name="node" select="$node"/>
+ <xsl:with-param name="footnotes"
+ select="$footnotes[position() &gt; 1]"/>
+ <xsl:with-param name="count" select="$count"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="count.footnotes.in.this.chunk">
+ <xsl:with-param name="node" select="$node"/>
+ <xsl:with-param name="footnotes"
+ select="$footnotes[position() &gt; 1]"/>
+ <xsl:with-param name="count" select="$count + 1"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="process.footnotes.in.this.chunk">
+ <xsl:param name="node" select="."/>
+ <xsl:param name="footnotes" select="$node//footnote"/>
+
+<!--
+ <xsl:message>process.footnotes.in.this.chunk</xsl:message>
+-->
+
+ <xsl:variable name="in.other.chunk">
+ <xsl:call-template name="in.other.chunk">
+ <xsl:with-param name="chunk" select="$node"/>
+ <xsl:with-param name="node" select="$footnotes[1]"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="count($footnotes) = 0">
+ <!-- nop -->
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:choose>
+ <xsl:when test="$in.other.chunk != 0">
+ <xsl:call-template name="process.footnotes.in.this.chunk">
+ <xsl:with-param name="node" select="$node"/>
+ <xsl:with-param name="footnotes"
+ select="$footnotes[position() &gt; 1]"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="$footnotes[1]/ancestor::table
+ |$footnotes[1]/ancestor::informaltable">
+ <xsl:call-template name="process.footnotes.in.this.chunk">
+ <xsl:with-param name="node" select="$node"/>
+ <xsl:with-param name="footnotes"
+ select="$footnotes[position() &gt; 1]"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="$footnotes[1]"
+ mode="process.footnote.mode"/>
+ <xsl:call-template name="process.footnotes.in.this.chunk">
+ <xsl:with-param name="node" select="$node"/>
+ <xsl:with-param name="footnotes"
+ select="$footnotes[position() &gt; 1]"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="process.footnotes">
+ <xsl:variable name="footnotes" select=".//footnote"/>
+ <xsl:variable name="fcount">
+ <xsl:call-template name="count.footnotes.in.this.chunk">
+ <xsl:with-param name="node" select="."/>
+ <xsl:with-param name="footnotes" select="$footnotes"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+<!--
+ <xsl:message>
+ <xsl:value-of select="name(.)"/>
+ <xsl:text> fcount: </xsl:text>
+ <xsl:value-of select="$fcount"/>
+ </xsl:message>
+-->
+
+ <!-- Only bother to do this if there's at least one non-table footnote -->
+ <xsl:if test="$fcount &gt; 0">
+ <div class="footnotes">
+ <br/>
+ <hr width="100" align="{$direction.align.start}"/>
+ <xsl:call-template name="process.footnotes.in.this.chunk">
+ <xsl:with-param name="node" select="."/>
+ <xsl:with-param name="footnotes" select="$footnotes"/>
+ </xsl:call-template>
+ </div>
+ </xsl:if>
+
+ <!-- FIXME: When chunking, only the annotations actually used
+ in this chunk should be referenced. I don't think it
+ does any harm to reference them all, but it adds
+ unnecessary bloat to each chunk. -->
+ <xsl:if test="$annotation.support != 0 and //annotation">
+ <div class="annotation-list">
+ <div class="annotation-nocss">
+ <p>The following annotations are from this essay. You are seeing
+ them here because your browser doesn’t support the user-interface
+ techniques used to make them appear as ‘popups’ on modern browsers.</p>
+ </div>
+
+ <xsl:apply-templates select="//annotation"
+ mode="annotation-popup"/>
+ </div>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template name="process.chunk.footnotes">
+ <xsl:variable name="is.chunk">
+ <xsl:call-template name="chunk"/>
+ </xsl:variable>
+ <xsl:if test="$is.chunk = 1">
+ <xsl:call-template name="process.footnotes"/>
+ </xsl:if>
+</xsl:template>
+
+<!-- ====================================================================== -->
+
+<xsl:template name="chunk">
+ <xsl:param name="node" select="."/>
+ <!-- returns 1 if $node is a chunk -->
+
+ <!-- ==================================================================== -->
+ <!-- What's a chunk?
+
+ The root element
+ appendix
+ article
+ bibliography in article or part or book
+ book
+ chapter
+ colophon
+ glossary in article or part or book
+ index in article or part or book
+ part
+ preface
+ refentry
+ reference
+ sect{1,2,3,4,5} if position()>1 && depth < chunk.section.depth
+ section if position()>1 && depth < chunk.section.depth
+ set
+ setindex
+ -->
+ <!-- ==================================================================== -->
+
+<!--
+ <xsl:message>
+ <xsl:text>chunk: </xsl:text>
+ <xsl:value-of select="name($node)"/>
+ <xsl:text>(</xsl:text>
+ <xsl:value-of select="$node/@id"/>
+ <xsl:text>)</xsl:text>
+ <xsl:text> csd: </xsl:text>
+ <xsl:value-of select="$chunk.section.depth"/>
+ <xsl:text> cfs: </xsl:text>
+ <xsl:value-of select="$chunk.first.sections"/>
+ <xsl:text> ps: </xsl:text>
+ <xsl:value-of select="count($node/parent::section)"/>
+ <xsl:text> prs: </xsl:text>
+ <xsl:value-of select="count($node/preceding-sibling::section)"/>
+ </xsl:message>
+-->
+
+ <xsl:choose>
+ <xsl:when test="$node/parent::*/processing-instruction('dbhtml')[normalize-space(.) = 'stop-chunking']">0</xsl:when>
+ <xsl:when test="not($node/parent::*)">1</xsl:when>
+
+ <xsl:when test="local-name($node) = 'sect1'
+ and $chunk.section.depth &gt;= 1
+ and ($chunk.first.sections != 0
+ or count($node/preceding-sibling::sect1) &gt; 0)">
+ <xsl:text>1</xsl:text>
+ </xsl:when>
+ <xsl:when test="local-name($node) = 'sect2'
+ and $chunk.section.depth &gt;= 2
+ and ($chunk.first.sections != 0
+ or count($node/preceding-sibling::sect2) &gt; 0)">
+ <xsl:call-template name="chunk">
+ <xsl:with-param name="node" select="$node/parent::*"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="local-name($node) = 'sect3'
+ and $chunk.section.depth &gt;= 3
+ and ($chunk.first.sections != 0
+ or count($node/preceding-sibling::sect3) &gt; 0)">
+ <xsl:call-template name="chunk">
+ <xsl:with-param name="node" select="$node/parent::*"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="local-name($node) = 'sect4'
+ and $chunk.section.depth &gt;= 4
+ and ($chunk.first.sections != 0
+ or count($node/preceding-sibling::sect4) &gt; 0)">
+ <xsl:call-template name="chunk">
+ <xsl:with-param name="node" select="$node/parent::*"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="local-name($node) = 'sect5'
+ and $chunk.section.depth &gt;= 5
+ and ($chunk.first.sections != 0
+ or count($node/preceding-sibling::sect5) &gt; 0)">
+ <xsl:call-template name="chunk">
+ <xsl:with-param name="node" select="$node/parent::*"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="local-name($node) = 'section'
+ and $chunk.section.depth &gt;= count($node/ancestor::section)+1
+ and ($chunk.first.sections != 0
+ or count($node/preceding-sibling::section) &gt; 0)">
+ <xsl:call-template name="chunk">
+ <xsl:with-param name="node" select="$node/parent::*"/>
+ </xsl:call-template>
+ </xsl:when>
+
+ <xsl:when test="local-name($node)='preface'">1</xsl:when>
+ <xsl:when test="local-name($node)='chapter'">1</xsl:when>
+ <xsl:when test="local-name($node)='appendix'">1</xsl:when>
+ <xsl:when test="local-name($node)='article'">1</xsl:when>
+ <xsl:when test="local-name($node)='part'">1</xsl:when>
+ <xsl:when test="local-name($node)='reference'">1</xsl:when>
+ <xsl:when test="local-name($node)='refentry'">1</xsl:when>
+ <xsl:when test="local-name($node)='index' and ($generate.index != 0 or count($node/*) > 0)
+ and (local-name($node/parent::*) = 'article'
+ or local-name($node/parent::*) = 'book'
+ or local-name($node/parent::*) = 'part'
+ )">1</xsl:when>
+ <xsl:when test="local-name($node)='bibliography'
+ and (local-name($node/parent::*) = 'article'
+ or local-name($node/parent::*) = 'book'
+ or local-name($node/parent::*) = 'part'
+ )">1</xsl:when>
+ <xsl:when test="local-name($node)='glossary'
+ and (local-name($node/parent::*) = 'article'
+ or local-name($node/parent::*) = 'book'
+ or local-name($node/parent::*) = 'part'
+ )">1</xsl:when>
+ <xsl:when test="local-name($node)='colophon'">1</xsl:when>
+ <xsl:when test="local-name($node)='book'">1</xsl:when>
+ <xsl:when test="local-name($node)='set'">1</xsl:when>
+ <xsl:when test="local-name($node)='setindex'">1</xsl:when>
+ <xsl:when test="local-name($node)='legalnotice'
+ and $generate.legalnotice.link != 0">1</xsl:when>
+ <xsl:otherwise>0</xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ==================================================================== -->
+<xsl:template name="href.target.uri">
+ <xsl:param name="object" select="."/>
+ <xsl:variable name="ischunk">
+ <xsl:call-template name="chunk">
+ <xsl:with-param name="node" select="$object"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:apply-templates mode="chunk-filename" select="$object"/>
+
+ <xsl:if test="$ischunk='0'">
+ <xsl:text>#</xsl:text>
+ <xsl:call-template name="object.id">
+ <xsl:with-param name="object" select="$object"/>
+ </xsl:call-template>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template name="href.target">
+ <xsl:param name="context" select="."/>
+ <xsl:param name="object" select="."/>
+ <xsl:param name="toc-context" select="."/>
+ <!-- * If $toc-context contains some node other than the current node, -->
+ <!-- * it means we're processing a link in a TOC. In that case, to -->
+ <!-- * ensure the link will work correctly, we need to take a look at -->
+ <!-- * where the file containing the TOC will get written, and where -->
+ <!-- * the file that's being linked to will get written. -->
+ <xsl:variable name="toc-output-dir">
+ <xsl:if test="not($toc-context = .)">
+ <!-- * Get the $toc-context node and all its ancestors, look down -->
+ <!-- * through them to find the last/closest node to the -->
+ <!-- * toc-context node that has a "dbhtml dir" PI, and get the -->
+ <!-- * directory name from that. That's the name of the directory -->
+ <!-- * to which the current toc output file will get written. -->
+ <xsl:call-template name="dbhtml-dir">
+ <xsl:with-param name="context"
+ select="$toc-context/ancestor-or-self::*[processing-instruction('dbhtml')[contains(.,'dir')]][last()]"/>
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:variable>
+ <xsl:variable name="linked-file-output-dir">
+ <xsl:if test="not($toc-context = .)">
+ <!-- * Get the current node and all its ancestors, look down -->
+ <!-- * through them to find the last/closest node to the current -->
+ <!-- * node that has a "dbhtml dir" PI, and get the directory name -->
+ <!-- * from that. That's the name of the directory to which the -->
+ <!-- * file that's being linked to will get written. -->
+ <xsl:call-template name="dbhtml-dir">
+ <xsl:with-param name="context"
+ select="ancestor-or-self::*[processing-instruction('dbhtml')[contains(.,'dir')]][last()]"/>
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:variable>
+ <xsl:variable name="href.to.uri">
+ <xsl:call-template name="href.target.uri">
+ <xsl:with-param name="object" select="$object"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:variable name="href.from.uri">
+ <xsl:choose>
+ <xsl:when test="not($toc-context = .)">
+ <xsl:call-template name="href.target.uri">
+ <xsl:with-param name="object" select="$toc-context"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="href.target.uri">
+ <xsl:with-param name="object" select="$context"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <!-- * <xsl:message>toc-context: <xsl:value-of select="local-name($toc-context)"/></xsl:message> -->
+ <!-- * <xsl:message>node: <xsl:value-of select="local-name(.)"/></xsl:message> -->
+ <!-- * <xsl:message>context: <xsl:value-of select="local-name($context)"/></xsl:message> -->
+ <!-- * <xsl:message>object: <xsl:value-of select="local-name($object)"/></xsl:message> -->
+ <!-- * <xsl:message>toc-output-dir: <xsl:value-of select="$toc-output-dir"/></xsl:message> -->
+ <!-- * <xsl:message>linked-file-output-dir: <xsl:value-of select="$linked-file-output-dir"/></xsl:message> -->
+ <!-- * <xsl:message>href.to.uri: <xsl:value-of select="$href.to.uri"/></xsl:message> -->
+ <!-- * <xsl:message>href.from.uri: <xsl:value-of select="$href.from.uri"/></xsl:message> -->
+ <xsl:variable name="href.to">
+ <xsl:choose>
+ <!-- * 2007-07-19, MikeSmith: Added the following conditional to -->
+ <!-- * deal with a problem case for links in TOCs. It checks to see -->
+ <!-- * if the output dir that a TOC will get written to is -->
+ <!-- * different from the output dir of the file being linked to. -->
+ <!-- * If it is different, we do not call trim.common.uri.paths. -->
+ <!-- * -->
+ <!-- * Reason why I added that conditional is: I ran into a bug for -->
+ <!-- * this case: -->
+ <!-- * -->
+ <!-- * 1. we are chunking into separate dirs -->
+ <!-- * -->
+ <!-- * 2. output for the TOC is written to current dir, but the file -->
+ <!-- * being linked to is written to some subdir "foo". -->
+ <!-- * -->
+ <!-- * For that case, links to that file in that TOC did not show -->
+ <!-- * the correct path - they omitted the "foo". -->
+ <!-- * -->
+ <!-- * The cause of that problem was that the trim.common.uri.paths -->
+ <!-- * template[1] was being called under all conditions. But it's -->
+ <!-- * apparent that we don't want to call trim.common.uri.paths in -->
+ <!-- * the case where a linked file is being written to a different -->
+ <!-- * directory than the TOC that contains the link, because doing -->
+ <!-- * so will cause a necessary (not redundant) directory-name -->
+ <!-- * part of the link to get inadvertently trimmed, resulting in -->
+ <!-- * a broken link to that file. Thus, added the conditional. -->
+ <!-- * -->
+ <!-- * [1] The purpose of the trim.common.uri.paths template is to -->
+ <!-- * prevent cases where, if we didn't call it, we end up with -->
+ <!-- * unnecessary, redundant directory names getting output; for -->
+ <!-- * example, "foo/foo/refname.html". -->
+ <xsl:when test="not($toc-output-dir = $linked-file-output-dir)">
+ <xsl:value-of select="$href.to.uri"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="trim.common.uri.paths">
+ <xsl:with-param name="uriA" select="$href.to.uri"/>
+ <xsl:with-param name="uriB" select="$href.from.uri"/>
+ <xsl:with-param name="return" select="'A'"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:variable name="href.from">
+ <xsl:call-template name="trim.common.uri.paths">
+ <xsl:with-param name="uriA" select="$href.to.uri"/>
+ <xsl:with-param name="uriB" select="$href.from.uri"/>
+ <xsl:with-param name="return" select="'B'"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:variable name="depth">
+ <xsl:call-template name="count.uri.path.depth">
+ <xsl:with-param name="filename" select="$href.from"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:variable name="href">
+ <xsl:call-template name="copy-string">
+ <xsl:with-param name="string" select="'../'"/>
+ <xsl:with-param name="count" select="$depth"/>
+ </xsl:call-template>
+ <xsl:value-of select="$href.to"/>
+ </xsl:variable>
+ <!--
+ <xsl:message>
+ <xsl:text>In </xsl:text>
+ <xsl:value-of select="name(.)"/>
+ <xsl:text> (</xsl:text>
+ <xsl:value-of select="$href.from"/>
+ <xsl:text>,</xsl:text>
+ <xsl:value-of select="$depth"/>
+ <xsl:text>) </xsl:text>
+ <xsl:value-of select="name($object)"/>
+ <xsl:text> href=</xsl:text>
+ <xsl:value-of select="$href"/>
+ </xsl:message>
+ -->
+ <xsl:value-of select="$href"/>
+</xsl:template>
+
+<!-- Returns the complete olink href value if found -->
+<!-- Must take into account any dbhtml dir of the chunk containing the olink -->
+<xsl:template name="make.olink.href">
+ <xsl:param name="olink.key" select="''"/>
+ <xsl:param name="target.database"/>
+
+ <xsl:if test="$olink.key != ''">
+ <xsl:variable name="target.href" >
+ <xsl:for-each select="$target.database" >
+ <xsl:value-of select="key('targetptr-key', $olink.key)[1]/@href" />
+ </xsl:for-each>
+ </xsl:variable>
+
+ <!-- an olink starting point may be in a subdirectory, so need
+ the "from" reference point to compute a relative path -->
+
+ <xsl:variable name="from.href">
+ <xsl:call-template name="olink.from.uri">
+ <xsl:with-param name="target.database" select="$target.database"/>
+ <xsl:with-param name="object" select="."/>
+ <xsl:with-param name="object.targetdoc" select="$current.docid"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <!-- If the from.href has directory path, then must "../" upward
+ to document level -->
+ <xsl:variable name="upward.from.path">
+ <xsl:call-template name="upward.path">
+ <xsl:with-param name="path" select="$from.href"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="targetdoc">
+ <xsl:value-of select="substring-before($olink.key, '/')"/>
+ </xsl:variable>
+
+ <!-- Does the target database use a sitemap? -->
+ <xsl:variable name="use.sitemap">
+ <xsl:choose>
+ <xsl:when test="$target.database//sitemap">1</xsl:when>
+ <xsl:otherwise>0</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+
+ <!-- Get the baseuri for this targetptr -->
+ <xsl:variable name="baseuri" >
+ <xsl:choose>
+ <!-- Does the database use a sitemap? -->
+ <xsl:when test="$use.sitemap != 0" >
+ <xsl:choose>
+ <!-- Was current.docid parameter set? -->
+ <xsl:when test="$current.docid != ''">
+ <!-- Was it found in the database? -->
+ <xsl:variable name="currentdoc.key" >
+ <xsl:for-each select="$target.database" >
+ <xsl:value-of select="key('targetdoc-key',
+ $current.docid)/@targetdoc" />
+ </xsl:for-each>
+ </xsl:variable>
+ <xsl:choose>
+ <xsl:when test="$currentdoc.key != ''">
+ <xsl:for-each select="$target.database" >
+ <xsl:call-template name="targetpath" >
+ <xsl:with-param name="dirnode"
+ select="key('targetdoc-key', $current.docid)/parent::dir"/>
+ <xsl:with-param name="targetdoc" select="$targetdoc"/>
+ </xsl:call-template>
+ </xsl:for-each >
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:message>
+ <xsl:text>Olink error: cannot compute relative </xsl:text>
+ <xsl:text>sitemap path because $current.docid '</xsl:text>
+ <xsl:value-of select="$current.docid"/>
+ <xsl:text>' not found in target database.</xsl:text>
+ </xsl:message>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:message>
+ <xsl:text>Olink warning: cannot compute relative </xsl:text>
+ <xsl:text>sitemap path without $current.docid parameter</xsl:text>
+ </xsl:message>
+ </xsl:otherwise>
+ </xsl:choose>
+ <!-- In either case, add baseuri from its document entry-->
+ <xsl:variable name="docbaseuri">
+ <xsl:for-each select="$target.database" >
+ <xsl:value-of select="key('targetdoc-key', $targetdoc)/@baseuri" />
+ </xsl:for-each>
+ </xsl:variable>
+ <xsl:if test="$docbaseuri != ''" >
+ <xsl:value-of select="$docbaseuri"/>
+ </xsl:if>
+ </xsl:when>
+ <!-- No database sitemap in use -->
+ <xsl:otherwise>
+ <!-- Just use any baseuri from its document entry -->
+ <xsl:variable name="docbaseuri">
+ <xsl:for-each select="$target.database" >
+ <xsl:value-of select="key('targetdoc-key', $targetdoc)/@baseuri" />
+ </xsl:for-each>
+ </xsl:variable>
+ <xsl:if test="$docbaseuri != ''" >
+ <xsl:value-of select="$docbaseuri"/>
+ </xsl:if>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <!-- Form the href information -->
+ <xsl:if test="not(contains($baseuri, ':'))">
+ <!-- if not an absolute uri, add upward path from olink chunk -->
+ <xsl:value-of select="$upward.from.path"/>
+ </xsl:if>
+
+ <xsl:if test="$baseuri != ''">
+ <xsl:value-of select="$baseuri"/>
+ <xsl:if test="substring($target.href,1,1) != '#'">
+ <!--xsl:text>/</xsl:text-->
+ </xsl:if>
+ </xsl:if>
+ <!-- optionally turn off frag for PDF references -->
+ <xsl:if test="not($insert.olink.pdf.frag = 0 and
+ translate(substring($baseuri, string-length($baseuri) - 3),
+ 'PDF', 'pdf') = '.pdf'
+ and starts-with($target.href, '#') )">
+ <xsl:value-of select="$target.href"/>
+ </xsl:if>
+ </xsl:if>
+</xsl:template>
+
+<!-- Computes "../" to reach top -->
+<xsl:template name="upward.path">
+ <xsl:param name="path" select="''"/>
+ <xsl:choose>
+ <!-- Don't bother with absolute uris -->
+ <xsl:when test="contains($path, ':')"/>
+ <xsl:when test="starts-with($path, '/')"/>
+ <xsl:when test="contains($path, '/')">
+ <xsl:text>../</xsl:text>
+ <xsl:call-template name="upward.path">
+ <xsl:with-param name="path" select="substring-after($path, '/')"/>
+ </xsl:call-template>
+ </xsl:when>
+ </xsl:choose>
+
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template name="html.head">
+ <xsl:param name="prev" select="/foo"/>
+ <xsl:param name="next" select="/foo"/>
+ <xsl:variable name="this" select="."/>
+ <xsl:variable name="home" select="/*[1]"/>
+ <xsl:variable name="up" select="parent::*"/>
+
+ <head>
+ <xsl:call-template name="system.head.content"/>
+ <xsl:call-template name="head.content"/>
+
+ <xsl:if test="$home">
+ <link rel="home">
+ <xsl:attribute name="href">
+ <xsl:call-template name="href.target">
+ <xsl:with-param name="object" select="$home"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:attribute name="title">
+ <xsl:apply-templates select="$home"
+ mode="object.title.markup.textonly"/>
+ </xsl:attribute>
+ </link>
+ </xsl:if>
+
+ <xsl:if test="$up">
+ <link rel="up">
+ <xsl:attribute name="href">
+ <xsl:call-template name="href.target">
+ <xsl:with-param name="object" select="$up"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:attribute name="title">
+ <xsl:apply-templates select="$up" mode="object.title.markup.textonly"/>
+ </xsl:attribute>
+ </link>
+ </xsl:if>
+
+ <xsl:if test="$prev">
+ <link rel="prev">
+ <xsl:attribute name="href">
+ <xsl:call-template name="href.target">
+ <xsl:with-param name="object" select="$prev"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:attribute name="title">
+ <xsl:apply-templates select="$prev" mode="object.title.markup.textonly"/>
+ </xsl:attribute>
+ </link>
+ </xsl:if>
+
+ <xsl:if test="$next">
+ <link rel="next">
+ <xsl:attribute name="href">
+ <xsl:call-template name="href.target">
+ <xsl:with-param name="object" select="$next"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:attribute name="title">
+ <xsl:apply-templates select="$next" mode="object.title.markup.textonly"/>
+ </xsl:attribute>
+ </link>
+ </xsl:if>
+
+ <xsl:if test="$html.extra.head.links != 0">
+ <xsl:for-each select="//part
+ |//reference
+ |//preface
+ |//chapter
+ |//article
+ |//refentry
+ |//appendix[not(parent::article)]|appendix
+ |//glossary[not(parent::article)]|glossary
+ |//index[not(parent::article)]|index">
+ <link rel="{local-name(.)}">
+ <xsl:attribute name="href">
+ <xsl:call-template name="href.target">
+ <xsl:with-param name="context" select="$this"/>
+ <xsl:with-param name="object" select="."/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:attribute name="title">
+ <xsl:apply-templates select="." mode="object.title.markup.textonly"/>
+ </xsl:attribute>
+ </link>
+ </xsl:for-each>
+
+ <xsl:for-each select="section|sect1|refsection|refsect1">
+ <link>
+ <xsl:attribute name="rel">
+ <xsl:choose>
+ <xsl:when test="local-name($this) = 'section'
+ or local-name($this) = 'refsection'">
+ <xsl:value-of select="'subsection'"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="'section'"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:attribute>
+ <xsl:attribute name="href">
+ <xsl:call-template name="href.target">
+ <xsl:with-param name="context" select="$this"/>
+ <xsl:with-param name="object" select="."/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:attribute name="title">
+ <xsl:apply-templates select="." mode="object.title.markup.textonly"/>
+ </xsl:attribute>
+ </link>
+ </xsl:for-each>
+
+ <xsl:for-each select="sect2|sect3|sect4|sect5|refsect2|refsect3">
+ <link rel="subsection">
+ <xsl:attribute name="href">
+ <xsl:call-template name="href.target">
+ <xsl:with-param name="context" select="$this"/>
+ <xsl:with-param name="object" select="."/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:attribute name="title">
+ <xsl:apply-templates select="." mode="object.title.markup.textonly"/>
+ </xsl:attribute>
+ </link>
+ </xsl:for-each>
+ </xsl:if>
+
+ <!-- * if we have a legalnotice and user wants it output as a -->
+ <!-- * separate page and $html.head.legalnotice.link.types is -->
+ <!-- * non-empty, we generate a link or links for each value in -->
+ <!-- * $html.head.legalnotice.link.types -->
+ <xsl:if test="//legalnotice
+ and not($generate.legalnotice.link = 0)
+ and not($html.head.legalnotice.link.types = '')">
+ <xsl:call-template name="make.legalnotice.head.links"/>
+ </xsl:if>
+
+ <xsl:call-template name="user.head.content"/>
+ </head>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template name="header.navigation">
+ <xsl:param name="prev" select="/foo"/>
+ <xsl:param name="next" select="/foo"/>
+ <xsl:param name="nav.context"/>
+
+ <xsl:variable name="home" select="/*[1]"/>
+ <xsl:variable name="up" select="parent::*"/>
+
+ <xsl:variable name="row1" select="$navig.showtitles != 0"/>
+ <xsl:variable name="row2" select="count($prev) &gt; 0
+ or (count($up) &gt; 0
+ and generate-id($up) != generate-id($home)
+ and $navig.showtitles != 0)
+ or count($next) &gt; 0"/>
+
+ <xsl:if test="$suppress.navigation = '0' and $suppress.header.navigation = '0'">
+ <div class="navheader">
+ <xsl:if test="$row1 or $row2">
+ <table width="100%" summary="Navigation header">
+ <xsl:if test="$row1">
+ <tr>
+ <th colspan="3" align="center">
+ <xsl:apply-templates select="." mode="object.title.markup"/>
+ </th>
+ </tr>
+ </xsl:if>
+
+ <xsl:if test="$row2">
+ <tr>
+ <td width="20%" align="{$direction.align.start}">
+ <xsl:if test="count($prev)>0">
+ <a accesskey="p">
+ <xsl:attribute name="href">
+ <xsl:call-template name="href.target">
+ <xsl:with-param name="object" select="$prev"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:call-template name="navig.content">
+ <xsl:with-param name="direction" select="'prev'"/>
+ </xsl:call-template>
+ </a>
+ </xsl:if>
+ <xsl:text>&#160;</xsl:text>
+ </td>
+ <th width="60%" align="center">
+ <xsl:choose>
+ <xsl:when test="count($up) > 0
+ and generate-id($up) != generate-id($home)
+ and $navig.showtitles != 0">
+ <xsl:apply-templates select="$up" mode="object.title.markup"/>
+ </xsl:when>
+ <xsl:otherwise>&#160;</xsl:otherwise>
+ </xsl:choose>
+ </th>
+ <td width="20%" align="{$direction.align.end}">
+ <xsl:text>&#160;</xsl:text>
+ <xsl:if test="count($next)>0">
+ <a accesskey="n">
+ <xsl:attribute name="href">
+ <xsl:call-template name="href.target">
+ <xsl:with-param name="object" select="$next"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:call-template name="navig.content">
+ <xsl:with-param name="direction" select="'next'"/>
+ </xsl:call-template>
+ </a>
+ </xsl:if>
+ </td>
+ </tr>
+ </xsl:if>
+ </table>
+ </xsl:if>
+ <xsl:if test="$header.rule != 0">
+ <hr/>
+ </xsl:if>
+ </div>
+ </xsl:if>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template name="footer.navigation">
+ <xsl:param name="prev" select="/foo"/>
+ <xsl:param name="next" select="/foo"/>
+ <xsl:param name="nav.context"/>
+
+ <xsl:variable name="home" select="/*[1]"/>
+ <xsl:variable name="up" select="parent::*"/>
+
+ <xsl:variable name="row1" select="count($prev) &gt; 0
+ or count($up) &gt; 0
+ or count($next) &gt; 0"/>
+
+ <xsl:variable name="row2" select="($prev and $navig.showtitles != 0)
+ or (generate-id($home) != generate-id(.)
+ or $nav.context = 'toc')
+ or ($chunk.tocs.and.lots != 0
+ and $nav.context != 'toc')
+ or ($next and $navig.showtitles != 0)"/>
+
+ <xsl:if test="$suppress.navigation = '0' and $suppress.footer.navigation = '0'">
+ <div class="navfooter">
+ <xsl:if test="$footer.rule != 0">
+ <hr/>
+ </xsl:if>
+
+ <xsl:if test="$row1 or $row2">
+ <table width="100%" summary="Navigation footer">
+ <xsl:if test="$row1">
+ <tr>
+ <td width="40%" align="{$direction.align.start}">
+ <xsl:if test="count($prev)>0">
+ <a accesskey="p">
+ <xsl:attribute name="href">
+ <xsl:call-template name="href.target">
+ <xsl:with-param name="object" select="$prev"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:call-template name="navig.content">
+ <xsl:with-param name="direction" select="'prev'"/>
+ </xsl:call-template>
+ </a>
+ </xsl:if>
+ <xsl:text>&#160;</xsl:text>
+ </td>
+ <td width="20%" align="center">
+ <xsl:choose>
+ <xsl:when test="count($up)&gt;0
+ and generate-id($up) != generate-id($home)">
+ <a accesskey="u">
+ <xsl:attribute name="href">
+ <xsl:call-template name="href.target">
+ <xsl:with-param name="object" select="$up"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:call-template name="navig.content">
+ <xsl:with-param name="direction" select="'up'"/>
+ </xsl:call-template>
+ </a>
+ </xsl:when>
+ <xsl:otherwise>&#160;</xsl:otherwise>
+ </xsl:choose>
+ </td>
+ <td width="40%" align="{$direction.align.end}">
+ <xsl:text>&#160;</xsl:text>
+ <xsl:if test="count($next)>0">
+ <a accesskey="n">
+ <xsl:attribute name="href">
+ <xsl:call-template name="href.target">
+ <xsl:with-param name="object" select="$next"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:call-template name="navig.content">
+ <xsl:with-param name="direction" select="'next'"/>
+ </xsl:call-template>
+ </a>
+ </xsl:if>
+ </td>
+ </tr>
+ </xsl:if>
+
+ <xsl:if test="$row2">
+ <tr>
+ <td width="40%" align="{$direction.align.start}" valign="top">
+ <xsl:if test="$navig.showtitles != 0">
+ <xsl:apply-templates select="$prev" mode="object.title.markup"/>
+ </xsl:if>
+ <xsl:text>&#160;</xsl:text>
+ </td>
+ <td width="20%" align="center">
+ <xsl:choose>
+ <xsl:when test="$home != . or $nav.context = 'toc'">
+ <a accesskey="h">
+ <xsl:attribute name="href">
+ <xsl:call-template name="href.target">
+ <xsl:with-param name="object" select="$home"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:call-template name="navig.content">
+ <xsl:with-param name="direction" select="'home'"/>
+ </xsl:call-template>
+ </a>
+ <xsl:if test="$chunk.tocs.and.lots != 0 and $nav.context != 'toc'">
+ <xsl:text>&#160;|&#160;</xsl:text>
+ </xsl:if>
+ </xsl:when>
+ <xsl:otherwise>&#160;</xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:if test="$chunk.tocs.and.lots != 0 and $nav.context != 'toc'">
+ <a accesskey="t">
+ <xsl:attribute name="href">
+ <xsl:apply-templates select="/*[1]"
+ mode="recursive-chunk-filename">
+ <xsl:with-param name="recursive" select="true()"/>
+ </xsl:apply-templates>
+ <xsl:text>-toc</xsl:text>
+ <xsl:value-of select="$html.ext"/>
+ </xsl:attribute>
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'nav-toc'"/>
+ </xsl:call-template>
+ </a>
+ </xsl:if>
+ </td>
+ <td width="40%" align="{$direction.align.end}" valign="top">
+ <xsl:text>&#160;</xsl:text>
+ <xsl:if test="$navig.showtitles != 0">
+ <xsl:apply-templates select="$next" mode="object.title.markup"/>
+ </xsl:if>
+ </td>
+ </tr>
+ </xsl:if>
+ </table>
+ </xsl:if>
+ </div>
+ </xsl:if>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template name="navig.content">
+ <xsl:param name="direction" select="next"/>
+ <xsl:variable name="navtext">
+ <xsl:choose>
+ <xsl:when test="$direction = 'prev'">
+ <xsl:call-template name="gentext.nav.prev"/>
+ </xsl:when>
+ <xsl:when test="$direction = 'next'">
+ <xsl:call-template name="gentext.nav.next"/>
+ </xsl:when>
+ <xsl:when test="$direction = 'up'">
+ <xsl:call-template name="gentext.nav.up"/>
+ </xsl:when>
+ <xsl:when test="$direction = 'home'">
+ <xsl:call-template name="gentext.nav.home"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text>xxx</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="$navig.graphics != 0">
+ <img>
+ <xsl:attribute name="src">
+ <xsl:value-of select="$navig.graphics.path"/>
+ <xsl:value-of select="$direction"/>
+ <xsl:value-of select="$navig.graphics.extension"/>
+ </xsl:attribute>
+ <xsl:attribute name="alt">
+ <xsl:value-of select="$navtext"/>
+ </xsl:attribute>
+ </img>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$navtext"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<!-- * The following template assumes that the first legalnotice -->
+<!-- * instance found in a document applies to the contents of the -->
+<!-- * entire document. It generates an HTML link in each chunk, back -->
+<!-- * to the file containing the contents of the first legalnotice. -->
+<!-- * -->
+<!-- * Actually, it may generate multiple link instances in each chunk, -->
+<!-- * because it walks through the space-separated list of link -->
+<!-- * types specified in the $html.head.legalnotice.link.types param, -->
+<!-- * popping off link types and generating links for them until it -->
+<!-- * depletes the list. -->
+
+<xsl:template name="make.legalnotice.head.links">
+ <!-- * the following ID is used as part of the legalnotice filename; -->
+ <!-- * we need it in order to construct the filename for use in the -->
+ <!-- * value of the href attribute on the link -->
+
+ <xsl:param name="ln-node" select="(//legalnotice)[1]"/>
+
+ <xsl:param name="linktype">
+ <xsl:choose>
+ <xsl:when test="contains($html.head.legalnotice.link.types, ' ')">
+ <xsl:value-of
+ select="normalize-space(
+ substring-before($html.head.legalnotice.link.types, ' '))"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$html.head.legalnotice.link.types"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:param>
+ <xsl:param
+ name="remaining.linktypes"
+ select="concat(
+ normalize-space(
+ substring-after($html.head.legalnotice.link.types, ' ')),' ')"/>
+ <xsl:if test="not($linktype = '')">
+
+ <!-- Compute name of legalnotice file (see titlepage.xsl) -->
+ <xsl:variable name="file">
+ <xsl:call-template name="ln.or.rh.filename">
+ <xsl:with-param name="node" select="$ln-node"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <link rel="{$linktype}">
+ <xsl:attribute name="href">
+ <xsl:value-of select="$file"/>
+ </xsl:attribute>
+ <xsl:attribute name="title">
+ <xsl:apply-templates select="(//legalnotice)[1]"
+ mode="object.title.markup.textonly"/>
+ </xsl:attribute>
+ </link>
+ <xsl:call-template name="make.legalnotice.head.links">
+ <!-- * pop the next value off the list of link types -->
+ <xsl:with-param
+ name="linktype"
+ select="substring-before($remaining.linktypes, ' ')"/>
+ <!-- * remove the link type from the list of remaining link types -->
+ <xsl:with-param
+ name="remaining.linktypes"
+ select="substring-after($remaining.linktypes, ' ')"/>
+ </xsl:call-template>
+ </xsl:if>
+</xsl:template>
+
+<!-- ==================================================================== -->
+<xsl:template name="chunk-element-content">
+ <xsl:param name="prev"/>
+ <xsl:param name="next"/>
+ <xsl:param name="nav.context"/>
+ <xsl:param name="content">
+ <xsl:apply-imports/>
+ </xsl:param>
+
+ <xsl:call-template name="user.preroot"/>
+
+ <html>
+ <xsl:call-template name="html.head">
+ <xsl:with-param name="prev" select="$prev"/>
+ <xsl:with-param name="next" select="$next"/>
+ </xsl:call-template>
+
+ <body>
+ <xsl:call-template name="body.attributes"/>
+ <xsl:call-template name="user.header.navigation"/>
+
+ <xsl:call-template name="header.navigation">
+ <xsl:with-param name="prev" select="$prev"/>
+ <xsl:with-param name="next" select="$next"/>
+ <xsl:with-param name="nav.context" select="$nav.context"/>
+ </xsl:call-template>
+
+ <xsl:call-template name="user.header.content"/>
+
+ <xsl:copy-of select="$content"/>
+
+ <xsl:call-template name="user.footer.content"/>
+
+ <xsl:call-template name="footer.navigation">
+ <xsl:with-param name="prev" select="$prev"/>
+ <xsl:with-param name="next" select="$next"/>
+ <xsl:with-param name="nav.context" select="$nav.context"/>
+ </xsl:call-template>
+
+ <xsl:call-template name="user.footer.navigation"/>
+ </body>
+ </html>
+ <xsl:value-of select="$chunk.append"/>
+</xsl:template>
+
+<!-- ==================================================================== -->
+<xsl:template name="generate.manifest">
+ <xsl:param name="node" select="/"/>
+ <xsl:call-template name="write.text.chunk">
+ <xsl:with-param name="filename">
+ <xsl:if test="$manifest.in.base.dir != 0">
+ <xsl:value-of select="$base.dir"/>
+ </xsl:if>
+ <xsl:value-of select="$manifest"/>
+ </xsl:with-param>
+ <xsl:with-param name="method" select="'text'"/>
+ <xsl:with-param name="content">
+ <xsl:apply-templates select="$node" mode="enumerate-files"/>
+ </xsl:with-param>
+ <xsl:with-param name="encoding" select="$chunker.output.encoding"/>
+ </xsl:call-template>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template name="dbhtml-dir">
+ <xsl:param name="context" select="."/>
+ <!-- directories are now inherited from previous levels -->
+ <xsl:variable name="ppath">
+ <xsl:if test="$context/parent::*">
+ <xsl:call-template name="dbhtml-dir">
+ <xsl:with-param name="context" select="$context/parent::*"/>
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:variable>
+ <xsl:variable name="path">
+ <xsl:call-template name="pi.dbhtml_dir">
+ <xsl:with-param name="node" select="$context"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:choose>
+ <xsl:when test="$path = ''">
+ <xsl:if test="$ppath != ''">
+ <xsl:value-of select="$ppath"/>
+ </xsl:if>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:if test="$ppath != ''">
+ <xsl:value-of select="$ppath"/>
+ <xsl:if test="substring($ppath, string-length($ppath), 1) != '/'">
+ <xsl:text>/</xsl:text>
+ </xsl:if>
+ </xsl:if>
+ <xsl:value-of select="$path"/>
+ <xsl:text>/</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/chunk.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/chunk.xsl
new file mode 100644
index 0000000..a89e242
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/chunk.xsl
@@ -0,0 +1,52 @@
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:exsl="http://exslt.org/common"
+ version="1.0"
+ exclude-result-prefixes="exsl">
+
+<!-- ********************************************************************
+ $Id: chunk.xsl 6910 2007-06-28 23:23:30Z xmldoc $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<!-- ==================================================================== -->
+
+<!-- First import the non-chunking templates that format elements
+ within each chunk file. In a customization, you should
+ create a separate non-chunking customization layer such
+ as mydocbook.xsl that imports the original docbook.xsl and
+ customizes any presentation templates. Then your chunking
+ customization should import mydocbook.xsl instead of
+ docbook.xsl. -->
+<xsl:import href="docbook.xsl"/>
+
+<!-- chunk-common.xsl contains all the named templates for chunking.
+ In a customization file, you import chunk-common.xsl, then
+ add any customized chunking templates of the same name.
+ They will have import precedence over the original
+ chunking templates in chunk-common.xsl. -->
+<xsl:import href="chunk-common.xsl"/>
+
+<!-- The manifest.xsl module is no longer imported because its
+ templates were moved into chunk-common and chunk-code -->
+
+<!-- chunk-code.xsl contains all the chunking templates that use
+ a match attribute. In a customization it should be referenced
+ using <xsl:include> instead of <xsl:import>, and then add
+ any customized chunking templates with match attributes. But be sure
+ to add a priority="1" to such customized templates to resolve
+ its conflict with the original, since they have the
+ same import precedence.
+
+ Using xsl:include prevents adding another layer
+ of import precedence, which would cause any
+ customizations that use xsl:apply-imports to wrongly
+ apply the chunking version instead of the original
+ non-chunking version to format an element. -->
+<xsl:include href="chunk-code.xsl"/>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/chunker.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/chunker.xsl
new file mode 100644
index 0000000..89a5d23
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/chunker.xsl
@@ -0,0 +1,439 @@
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:saxon="http://icl.com/saxon"
+ xmlns:lxslt="http://xml.apache.org/xslt"
+ xmlns:redirect="http://xml.apache.org/xalan/redirect"
+ xmlns:exsl="http://exslt.org/common"
+ xmlns:doc="http://nwalsh.com/xsl/documentation/1.0"
+ version="1.0"
+ exclude-result-prefixes="saxon lxslt redirect exsl doc"
+ extension-element-prefixes="saxon redirect lxslt exsl">
+
+<!-- ********************************************************************
+ $Id: chunker.xsl 8526 2009-10-14 18:59:40Z bobstayton $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<!-- ==================================================================== -->
+
+<!-- This stylesheet works with XSLT implementations that support -->
+<!-- exsl:document, saxon:output, or Xalan's redirect:write -->
+<!-- Note: Only Saxon 6.4.2 or later is supported. -->
+
+<xsl:param name="chunker.output.method" select="'html'"/>
+<xsl:param name="chunker.output.encoding" select="'ISO-8859-1'"/>
+<xsl:param name="chunker.output.indent" select="'no'"/>
+<xsl:param name="chunker.output.omit-xml-declaration" select="'no'"/>
+<xsl:param name="chunker.output.standalone" select="'no'"/>
+<xsl:param name="chunker.output.doctype-public" select="''"/>
+<xsl:param name="chunker.output.doctype-system" select="''"/>
+<xsl:param name="chunker.output.media-type" select="''"/>
+<xsl:param name="chunker.output.cdata-section-elements" select="''"/>
+<xsl:param name="chunker.output.quiet" select="0"/>
+
+<xsl:param name="saxon.character.representation" select="'entity;decimal'"/>
+
+<!-- ==================================================================== -->
+
+<xsl:template name="make-relative-filename">
+ <xsl:param name="base.dir" select="'./'"/>
+ <xsl:param name="base.name" select="''"/>
+
+ <xsl:choose>
+ <!-- put Saxon first to work around a bug in libxslt -->
+ <xsl:when test="element-available('saxon:output')">
+ <!-- Saxon doesn't make the chunks relative -->
+ <xsl:value-of select="concat($base.dir,$base.name)"/>
+ </xsl:when>
+ <xsl:when test="element-available('exsl:document')">
+ <!-- EXSL document does make the chunks relative, I think -->
+ <xsl:choose>
+ <xsl:when test="count(parent::*) = 0">
+ <xsl:value-of select="concat($base.dir,$base.name)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$base.name"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:when test="element-available('redirect:write')">
+ <!-- Xalan doesn't make the chunks relative -->
+ <xsl:value-of select="concat($base.dir,$base.name)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:message terminate="yes">
+ <xsl:text>Don't know how to chunk with </xsl:text>
+ <xsl:value-of select="system-property('xsl:vendor')"/>
+ </xsl:message>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="write.chunk">
+ <xsl:param name="filename" select="''"/>
+ <xsl:param name="quiet" select="$chunker.output.quiet"/>
+ <xsl:param name="suppress-context-node-name" select="0"/>
+ <xsl:param name="message-prolog"/>
+ <xsl:param name="message-epilog"/>
+
+ <xsl:param name="method" select="$chunker.output.method"/>
+ <xsl:param name="encoding" select="$chunker.output.encoding"/>
+ <xsl:param name="indent" select="$chunker.output.indent"/>
+ <xsl:param name="omit-xml-declaration"
+ select="$chunker.output.omit-xml-declaration"/>
+ <xsl:param name="standalone" select="$chunker.output.standalone"/>
+ <xsl:param name="doctype-public" select="$chunker.output.doctype-public"/>
+ <xsl:param name="doctype-system" select="$chunker.output.doctype-system"/>
+ <xsl:param name="media-type" select="$chunker.output.media-type"/>
+ <xsl:param name="cdata-section-elements"
+ select="$chunker.output.cdata-section-elements"/>
+
+ <xsl:param name="content"/>
+
+ <xsl:if test="$quiet = 0">
+ <xsl:message>
+ <xsl:if test="not($message-prolog = '')">
+ <xsl:value-of select="$message-prolog"/>
+ </xsl:if>
+ <xsl:text>Writing </xsl:text>
+ <xsl:value-of select="$filename"/>
+ <xsl:if test="name(.) != '' and $suppress-context-node-name = 0">
+ <xsl:text> for </xsl:text>
+ <xsl:value-of select="name(.)"/>
+ <xsl:if test="@id or @xml:id">
+ <xsl:text>(</xsl:text>
+ <xsl:value-of select="(@id|@xml:id)[1]"/>
+ <xsl:text>)</xsl:text>
+ </xsl:if>
+ </xsl:if>
+ <xsl:if test="not($message-epilog = '')">
+ <xsl:value-of select="$message-epilog"/>
+ </xsl:if>
+ </xsl:message>
+ </xsl:if>
+
+ <xsl:choose>
+ <xsl:when test="element-available('exsl:document')">
+ <xsl:choose>
+ <!-- Handle the permutations ... -->
+ <xsl:when test="$media-type != ''">
+ <xsl:choose>
+ <xsl:when test="$doctype-public != '' and $doctype-system != ''">
+ <exsl:document href="{$filename}"
+ method="{$method}"
+ encoding="{$encoding}"
+ indent="{$indent}"
+ omit-xml-declaration="{$omit-xml-declaration}"
+ cdata-section-elements="{$cdata-section-elements}"
+ media-type="{$media-type}"
+ doctype-public="{$doctype-public}"
+ doctype-system="{$doctype-system}"
+ standalone="{$standalone}">
+ <xsl:copy-of select="$content"/>
+ </exsl:document>
+ </xsl:when>
+ <xsl:when test="$doctype-public != '' and $doctype-system = ''">
+ <exsl:document href="{$filename}"
+ method="{$method}"
+ encoding="{$encoding}"
+ indent="{$indent}"
+ omit-xml-declaration="{$omit-xml-declaration}"
+ cdata-section-elements="{$cdata-section-elements}"
+ media-type="{$media-type}"
+ doctype-public="{$doctype-public}"
+ standalone="{$standalone}">
+ <xsl:copy-of select="$content"/>
+ </exsl:document>
+ </xsl:when>
+ <xsl:when test="$doctype-public = '' and $doctype-system != ''">
+ <exsl:document href="{$filename}"
+ method="{$method}"
+ encoding="{$encoding}"
+ indent="{$indent}"
+ omit-xml-declaration="{$omit-xml-declaration}"
+ cdata-section-elements="{$cdata-section-elements}"
+ media-type="{$media-type}"
+ doctype-system="{$doctype-system}"
+ standalone="{$standalone}">
+ <xsl:copy-of select="$content"/>
+ </exsl:document>
+ </xsl:when>
+ <xsl:otherwise><!-- $doctype-public = '' and $doctype-system = ''"> -->
+ <exsl:document href="{$filename}"
+ method="{$method}"
+ encoding="{$encoding}"
+ indent="{$indent}"
+ omit-xml-declaration="{$omit-xml-declaration}"
+ cdata-section-elements="{$cdata-section-elements}"
+ media-type="{$media-type}"
+ standalone="{$standalone}">
+ <xsl:copy-of select="$content"/>
+ </exsl:document>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:choose>
+ <xsl:when test="$doctype-public != '' and $doctype-system != ''">
+ <exsl:document href="{$filename}"
+ method="{$method}"
+ encoding="{$encoding}"
+ indent="{$indent}"
+ omit-xml-declaration="{$omit-xml-declaration}"
+ cdata-section-elements="{$cdata-section-elements}"
+ doctype-public="{$doctype-public}"
+ doctype-system="{$doctype-system}"
+ standalone="{$standalone}">
+ <xsl:copy-of select="$content"/>
+ </exsl:document>
+ </xsl:when>
+ <xsl:when test="$doctype-public != '' and $doctype-system = ''">
+ <exsl:document href="{$filename}"
+ method="{$method}"
+ encoding="{$encoding}"
+ indent="{$indent}"
+ omit-xml-declaration="{$omit-xml-declaration}"
+ cdata-section-elements="{$cdata-section-elements}"
+ doctype-public="{$doctype-public}"
+ standalone="{$standalone}">
+ <xsl:copy-of select="$content"/>
+ </exsl:document>
+ </xsl:when>
+ <xsl:when test="$doctype-public = '' and $doctype-system != ''">
+ <exsl:document href="{$filename}"
+ method="{$method}"
+ encoding="{$encoding}"
+ indent="{$indent}"
+ omit-xml-declaration="{$omit-xml-declaration}"
+ cdata-section-elements="{$cdata-section-elements}"
+ doctype-system="{$doctype-system}"
+ standalone="{$standalone}">
+ <xsl:copy-of select="$content"/>
+ </exsl:document>
+ </xsl:when>
+ <xsl:otherwise><!-- $doctype-public = '' and $doctype-system = ''"> -->
+ <exsl:document href="{$filename}"
+ method="{$method}"
+ encoding="{$encoding}"
+ indent="{$indent}"
+ omit-xml-declaration="{$omit-xml-declaration}"
+ cdata-section-elements="{$cdata-section-elements}"
+ standalone="{$standalone}">
+ <xsl:copy-of select="$content"/>
+ </exsl:document>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+
+ <xsl:when test="element-available('saxon:output')">
+ <xsl:choose>
+ <!-- Handle the permutations ... -->
+ <xsl:when test="$media-type != ''">
+ <xsl:choose>
+ <xsl:when test="$doctype-public != '' and $doctype-system != ''">
+ <saxon:output saxon:character-representation="{$saxon.character.representation}"
+ href="{$filename}"
+ method="{$method}"
+ encoding="{$encoding}"
+ indent="{$indent}"
+ omit-xml-declaration="{$omit-xml-declaration}"
+ cdata-section-elements="{$cdata-section-elements}"
+ media-type="{$media-type}"
+ doctype-public="{$doctype-public}"
+ doctype-system="{$doctype-system}"
+ standalone="{$standalone}">
+ <xsl:copy-of select="$content"/>
+ </saxon:output>
+ </xsl:when>
+ <xsl:when test="$doctype-public != '' and $doctype-system = ''">
+ <saxon:output saxon:character-representation="{$saxon.character.representation}"
+ href="{$filename}"
+ method="{$method}"
+ encoding="{$encoding}"
+ indent="{$indent}"
+ omit-xml-declaration="{$omit-xml-declaration}"
+ cdata-section-elements="{$cdata-section-elements}"
+ media-type="{$media-type}"
+ doctype-public="{$doctype-public}"
+ standalone="{$standalone}">
+ <xsl:copy-of select="$content"/>
+ </saxon:output>
+ </xsl:when>
+ <xsl:when test="$doctype-public = '' and $doctype-system != ''">
+ <saxon:output saxon:character-representation="{$saxon.character.representation}"
+ href="{$filename}"
+ method="{$method}"
+ encoding="{$encoding}"
+ indent="{$indent}"
+ omit-xml-declaration="{$omit-xml-declaration}"
+ cdata-section-elements="{$cdata-section-elements}"
+ media-type="{$media-type}"
+ doctype-system="{$doctype-system}"
+ standalone="{$standalone}">
+ <xsl:copy-of select="$content"/>
+ </saxon:output>
+ </xsl:when>
+ <xsl:otherwise><!-- $doctype-public = '' and $doctype-system = ''"> -->
+ <saxon:output saxon:character-representation="{$saxon.character.representation}"
+ href="{$filename}"
+ method="{$method}"
+ encoding="{$encoding}"
+ indent="{$indent}"
+ omit-xml-declaration="{$omit-xml-declaration}"
+ cdata-section-elements="{$cdata-section-elements}"
+ media-type="{$media-type}"
+ standalone="{$standalone}">
+ <xsl:copy-of select="$content"/>
+ </saxon:output>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:choose>
+ <xsl:when test="$doctype-public != '' and $doctype-system != ''">
+ <saxon:output saxon:character-representation="{$saxon.character.representation}"
+ href="{$filename}"
+ method="{$method}"
+ encoding="{$encoding}"
+ indent="{$indent}"
+ omit-xml-declaration="{$omit-xml-declaration}"
+ cdata-section-elements="{$cdata-section-elements}"
+ doctype-public="{$doctype-public}"
+ doctype-system="{$doctype-system}"
+ standalone="{$standalone}">
+ <xsl:copy-of select="$content"/>
+ </saxon:output>
+ </xsl:when>
+ <xsl:when test="$doctype-public != '' and $doctype-system = ''">
+ <saxon:output saxon:character-representation="{$saxon.character.representation}"
+ href="{$filename}"
+ method="{$method}"
+ encoding="{$encoding}"
+ indent="{$indent}"
+ omit-xml-declaration="{$omit-xml-declaration}"
+ cdata-section-elements="{$cdata-section-elements}"
+ doctype-public="{$doctype-public}"
+ standalone="{$standalone}">
+ <xsl:copy-of select="$content"/>
+ </saxon:output>
+ </xsl:when>
+ <xsl:when test="$doctype-public = '' and $doctype-system != ''">
+ <saxon:output saxon:character-representation="{$saxon.character.representation}"
+ href="{$filename}"
+ method="{$method}"
+ encoding="{$encoding}"
+ indent="{$indent}"
+ omit-xml-declaration="{$omit-xml-declaration}"
+ cdata-section-elements="{$cdata-section-elements}"
+ doctype-system="{$doctype-system}"
+ standalone="{$standalone}">
+ <xsl:copy-of select="$content"/>
+ </saxon:output>
+ </xsl:when>
+ <xsl:otherwise><!-- $doctype-public = '' and $doctype-system = ''"> -->
+ <saxon:output saxon:character-representation="{$saxon.character.representation}"
+ href="{$filename}"
+ method="{$method}"
+ encoding="{$encoding}"
+ indent="{$indent}"
+ omit-xml-declaration="{$omit-xml-declaration}"
+ cdata-section-elements="{$cdata-section-elements}"
+ standalone="{$standalone}">
+ <xsl:copy-of select="$content"/>
+ </saxon:output>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+
+ <xsl:when test="element-available('redirect:write')">
+ <!-- Xalan uses redirect -->
+ <redirect:write file="{$filename}">
+ <xsl:copy-of select="$content"/>
+ </redirect:write>
+ </xsl:when>
+
+ <xsl:otherwise>
+ <!-- it doesn't matter since we won't be making chunks... -->
+ <xsl:message terminate="yes">
+ <xsl:text>Can't make chunks with </xsl:text>
+ <xsl:value-of select="system-property('xsl:vendor')"/>
+ <xsl:text>'s processor.</xsl:text>
+ </xsl:message>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="write.chunk.with.doctype">
+ <xsl:param name="filename" select="''"/>
+ <xsl:param name="quiet" select="$chunker.output.quiet"/>
+
+ <xsl:param name="method" select="$chunker.output.method"/>
+ <xsl:param name="encoding" select="$chunker.output.encoding"/>
+ <xsl:param name="indent" select="$chunker.output.indent"/>
+ <xsl:param name="omit-xml-declaration"
+ select="$chunker.output.omit-xml-declaration"/>
+ <xsl:param name="standalone" select="$chunker.output.standalone"/>
+ <xsl:param name="doctype-public" select="$chunker.output.doctype-public"/>
+ <xsl:param name="doctype-system" select="$chunker.output.doctype-system"/>
+ <xsl:param name="media-type" select="$chunker.output.media-type"/>
+ <xsl:param name="cdata-section-elements"
+ select="$chunker.output.cdata-section-elements"/>
+
+ <xsl:param name="content"/>
+
+ <xsl:call-template name="write.chunk">
+ <xsl:with-param name="filename" select="$filename"/>
+ <xsl:with-param name="quiet" select="$quiet"/>
+ <xsl:with-param name="method" select="$method"/>
+ <xsl:with-param name="encoding" select="$encoding"/>
+ <xsl:with-param name="indent" select="$indent"/>
+ <xsl:with-param name="omit-xml-declaration" select="$omit-xml-declaration"/>
+ <xsl:with-param name="standalone" select="$standalone"/>
+ <xsl:with-param name="doctype-public" select="$doctype-public"/>
+ <xsl:with-param name="doctype-system" select="$doctype-system"/>
+ <xsl:with-param name="media-type" select="$media-type"/>
+ <xsl:with-param name="cdata-section-elements" select="$cdata-section-elements"/>
+ <xsl:with-param name="content" select="$content"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template name="write.text.chunk">
+ <xsl:param name="filename" select="''"/>
+ <xsl:param name="quiet" select="$chunker.output.quiet"/>
+ <xsl:param name="suppress-context-node-name" select="0"/>
+ <xsl:param name="message-prolog"/>
+ <xsl:param name="message-epilog"/>
+ <xsl:param name="method" select="'text'"/>
+ <xsl:param name="encoding" select="$chunker.output.encoding"/>
+ <xsl:param name="media-type" select="$chunker.output.media-type"/>
+ <xsl:param name="content"/>
+
+ <xsl:call-template name="write.chunk">
+ <xsl:with-param name="filename" select="$filename"/>
+ <xsl:with-param name="quiet" select="$quiet"/>
+ <xsl:with-param name="suppress-context-node-name" select="$suppress-context-node-name"/>
+ <xsl:with-param name="message-prolog" select="$message-prolog"/>
+ <xsl:with-param name="message-epilog" select="$message-epilog"/>
+ <xsl:with-param name="method" select="$method"/>
+ <xsl:with-param name="encoding" select="$encoding"/>
+ <xsl:with-param name="indent" select="'no'"/>
+ <xsl:with-param name="omit-xml-declaration" select="'no'"/>
+ <xsl:with-param name="standalone" select="'no'"/>
+ <xsl:with-param name="doctype-public"/>
+ <xsl:with-param name="doctype-system"/>
+ <xsl:with-param name="media-type" select="$media-type"/>
+ <xsl:with-param name="cdata-section-elements"/>
+ <xsl:with-param name="content" select="$content"/>
+ </xsl:call-template>
+</xsl:template>
+
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/chunkfast.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/chunkfast.xsl
new file mode 100644
index 0000000..35a4631
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/chunkfast.xsl
@@ -0,0 +1,72 @@
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:exsl="http://exslt.org/common"
+ xmlns:cf="http://docbook.sourceforge.net/xmlns/chunkfast/1.0"
+ version="1.0"
+ exclude-result-prefixes="cf exsl">
+
+<!-- ********************************************************************
+ $Id: chunkfast.xsl 8345 2009-03-16 06:44:07Z bobstayton $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<!-- ==================================================================== -->
+
+<xsl:import href="chunk.xsl"/>
+<xsl:param name="chunk.fast" select="1"/>
+
+<xsl:variable name="chunks" select="exsl:node-set($chunk.hierarchy)//cf:div"/>
+
+<!-- ==================================================================== -->
+
+<xsl:template name="process-chunk-element">
+ <xsl:choose>
+ <xsl:when test="$chunk.fast != 0 and $exsl.node.set.available != 0">
+ <xsl:variable name="genid" select="generate-id()"/>
+
+ <xsl:variable name="div" select="$chunks[@id=$genid or @xml:id=$genid]"/>
+
+ <xsl:variable name="prevdiv"
+ select="($div/preceding-sibling::cf:div|$div/preceding::cf:div|$div/parent::cf:div)[last()]"/>
+ <xsl:variable name="prev" select="key('genid', ($prevdiv/@id|$prevdiv/@xml:id)[1])"/>
+
+ <xsl:variable name="nextdiv"
+ select="($div/following-sibling::cf:div|$div/following::cf:div|$div/cf:div)[1]"/>
+ <xsl:variable name="next" select="key('genid', ($nextdiv/@id|$nextdiv/@xml:id)[1])"/>
+
+ <xsl:choose>
+ <xsl:when test="$onechunk != 0 and parent::*">
+ <xsl:apply-imports/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="process-chunk">
+ <xsl:with-param name="prev" select="$prev"/>
+ <xsl:with-param name="next" select="$next"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:choose>
+ <xsl:when test="$onechunk != 0 and not(parent::*)">
+ <xsl:call-template name="chunk-all-sections"/>
+ </xsl:when>
+ <xsl:when test="$onechunk != 0">
+ <xsl:apply-imports/>
+ </xsl:when>
+ <xsl:when test="$chunk.first.sections = 0">
+ <xsl:call-template name="chunk-first-section-with-parent"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="chunk-all-sections"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/chunktoc.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/chunktoc.xsl
new file mode 100644
index 0000000..8422aa4
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/chunktoc.xsl
@@ -0,0 +1,543 @@
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:doc="http://nwalsh.com/xsl/documentation/1.0"
+ xmlns:exsl="http://exslt.org/common"
+ xmlns:ng="http://docbook.org/docbook-ng"
+ xmlns:db="http://docbook.org/ns/docbook"
+ version="1.0"
+ exclude-result-prefixes="doc exsl ng db">
+
+<!-- ********************************************************************
+ $Id: chunktoc.xsl 8545 2009-12-02 07:22:10Z bobstayton $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<!-- ==================================================================== -->
+
+<xsl:import href="docbook.xsl"/>
+<xsl:import href="chunk-common.xsl"/>
+
+<xsl:template name="chunk">
+ <xsl:param name="node" select="."/>
+ <!-- returns 1 if $node is a chunk -->
+
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id">
+ <xsl:with-param name="object" select="$node"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="chunks" select="document($chunk.toc,/)"/>
+
+ <xsl:choose>
+ <xsl:when test="$chunks//tocentry[@linkend=$id]">1</xsl:when>
+ <xsl:otherwise>0</xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="*" mode="chunk-filename">
+ <!-- returns the filename of a chunk -->
+
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+
+ <xsl:variable name="chunks" select="document($chunk.toc,/)"/>
+
+ <xsl:variable name="chunk" select="$chunks//tocentry[@linkend=$id]"/>
+ <xsl:variable name="filename">
+ <xsl:call-template name="pi.dbhtml_filename">
+ <xsl:with-param name="node" select="$chunk"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="$chunk">
+ <xsl:value-of select="$filename"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="parent::*" mode="chunk-filename"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template name="process-chunk">
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+
+ <xsl:variable name="chunks" select="document($chunk.toc,/)"/>
+
+ <xsl:variable name="chunk" select="$chunks//tocentry[@linkend=$id]"/>
+ <xsl:variable name="prev-id"
+ select="($chunk/preceding::tocentry
+ |$chunk/ancestor::tocentry)[last()]/@linkend"/>
+ <xsl:variable name="next-id"
+ select="($chunk/following::tocentry
+ |$chunk/child::tocentry)[1]/@linkend"/>
+
+ <xsl:variable name="prev" select="key('id',$prev-id)"/>
+ <xsl:variable name="next" select="key('id',$next-id)"/>
+
+ <xsl:variable name="ischunk">
+ <xsl:call-template name="chunk"/>
+ </xsl:variable>
+
+ <xsl:variable name="chunkfn">
+ <xsl:if test="$ischunk='1'">
+ <xsl:apply-templates mode="chunk-filename" select="."/>
+ </xsl:if>
+ </xsl:variable>
+
+ <xsl:variable name="filename">
+ <xsl:call-template name="make-relative-filename">
+ <xsl:with-param name="base.dir" select="$base.dir"/>
+ <xsl:with-param name="base.name" select="$chunkfn"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="$ischunk = 0">
+ <xsl:apply-imports/>
+ </xsl:when>
+
+ <xsl:otherwise>
+ <xsl:call-template name="write.chunk">
+ <xsl:with-param name="filename" select="$filename"/>
+ <xsl:with-param name="content">
+ <xsl:call-template name="chunk-element-content">
+ <xsl:with-param name="prev" select="$prev"/>
+ <xsl:with-param name="next" select="$next"/>
+ </xsl:call-template>
+ </xsl:with-param>
+ <xsl:with-param name="quiet" select="$chunk.quietly"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="set">
+ <xsl:call-template name="process-chunk"/>
+</xsl:template>
+
+<xsl:template match="book">
+ <xsl:call-template name="process-chunk"/>
+</xsl:template>
+
+<xsl:template match="appendix">
+ <xsl:call-template name="process-chunk"/>
+</xsl:template>
+
+<xsl:template match="book/glossary">
+ <xsl:call-template name="process-chunk"/>
+</xsl:template>
+
+<xsl:template match="book/bibliography">
+ <xsl:call-template name="process-chunk"/>
+</xsl:template>
+
+<xsl:template match="dedication" mode="dedication">
+ <xsl:call-template name="process-chunk"/>
+</xsl:template>
+
+<xsl:template match="preface|chapter">
+ <xsl:call-template name="process-chunk"/>
+</xsl:template>
+
+<xsl:template match="part|reference">
+ <xsl:call-template name="process-chunk"/>
+</xsl:template>
+
+<xsl:template match="refentry">
+ <xsl:call-template name="process-chunk"/>
+</xsl:template>
+
+<xsl:template match="colophon">
+ <xsl:call-template name="process-chunk"/>
+</xsl:template>
+
+<xsl:template match="article">
+ <xsl:call-template name="process-chunk"/>
+</xsl:template>
+
+<xsl:template match="article/glossary">
+ <xsl:call-template name="process-chunk"/>
+</xsl:template>
+
+<xsl:template match="article/bibliography">
+ <xsl:call-template name="process-chunk"/>
+</xsl:template>
+
+<xsl:template match="sect1|sect2|sect3|sect4|sect5|section">
+ <xsl:variable name="ischunk">
+ <xsl:call-template name="chunk"/>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="$ischunk != 0">
+ <xsl:call-template name="process-chunk"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-imports/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="setindex
+ |book/index
+ |article/index">
+ <!-- some implementations use completely empty index tags to indicate -->
+ <!-- where an automatically generated index should be inserted. so -->
+ <!-- if the index is completely empty, skip it. -->
+ <xsl:if test="count(*)>0 or $generate.index != '0'">
+ <xsl:call-template name="process-chunk"/>
+ </xsl:if>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="/">
+ <!-- * Get a title for current doc so that we let the user -->
+ <!-- * know what document we are processing at this point. -->
+ <xsl:variable name="doc.title">
+ <xsl:call-template name="get.doc.title"/>
+ </xsl:variable>
+ <xsl:choose>
+ <xsl:when test="$chunk.toc = ''">
+ <xsl:message terminate="yes">
+ <xsl:text>The chunk.toc file is not set.</xsl:text>
+ </xsl:message>
+ </xsl:when>
+ <!-- Hack! If someone hands us a DocBook V5.x or DocBook NG document,
+ toss the namespace and continue. Use the docbook5 namespaced
+ stylesheets for DocBook5 if you don't want to use this feature.-->
+ <!-- include extra test for Xalan quirk -->
+ <xsl:when test="$exsl.node.set.available != 0
+ and (*/self::ng:* or */self::db:*)">
+ <xsl:call-template name="log.message">
+ <xsl:with-param name="level">Note</xsl:with-param>
+ <xsl:with-param name="source" select="$doc.title"/>
+ <xsl:with-param name="context-desc">
+ <xsl:text>namesp. cut</xsl:text>
+ </xsl:with-param>
+ <xsl:with-param name="message">
+ <xsl:text>stripped namespace before processing</xsl:text>
+ </xsl:with-param>
+ </xsl:call-template>
+ <xsl:variable name="nons">
+ <xsl:apply-templates mode="stripNS"/>
+ </xsl:variable>
+ <xsl:call-template name="log.message">
+ <xsl:with-param name="level">Note</xsl:with-param>
+ <xsl:with-param name="source" select="$doc.title"/>
+ <xsl:with-param name="context-desc">
+ <xsl:text>namesp. cut</xsl:text>
+ </xsl:with-param>
+ <xsl:with-param name="message">
+ <xsl:text>processing stripped document</xsl:text>
+ </xsl:with-param>
+ </xsl:call-template>
+ <xsl:apply-templates select="exsl:node-set($nons)"/>
+ </xsl:when>
+ <!-- Can't process unless namespace removed -->
+ <xsl:when test="*/self::ng:* or */self::db:*">
+ <xsl:message terminate="yes">
+ <xsl:text>Unable to strip the namespace from DB5 document,</xsl:text>
+ <xsl:text> cannot proceed.</xsl:text>
+ </xsl:message>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:choose>
+ <xsl:when test="$rootid != ''">
+ <xsl:choose>
+ <xsl:when test="count(key('id',$rootid)) = 0">
+ <xsl:message terminate="yes">
+ <xsl:text>ID '</xsl:text>
+ <xsl:value-of select="$rootid"/>
+ <xsl:text>' not found in document.</xsl:text>
+ </xsl:message>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:if test="$collect.xref.targets = 'yes' or
+ $collect.xref.targets = 'only'">
+ <xsl:apply-templates select="key('id', $rootid)"
+ mode="collect.targets"/>
+ </xsl:if>
+ <xsl:if test="$collect.xref.targets != 'only'">
+ <xsl:apply-templates select="key('id',$rootid)"
+ mode="process.root"/>
+ <xsl:if test="$tex.math.in.alt != ''">
+ <xsl:apply-templates select="key('id',$rootid)"
+ mode="collect.tex.math"/>
+ </xsl:if>
+ <xsl:if test="$generate.manifest != 0">
+ <xsl:call-template name="generate.manifest">
+ <xsl:with-param name="node" select="key('id',$rootid)"/>
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:if>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:if test="$collect.xref.targets = 'yes' or
+ $collect.xref.targets = 'only'">
+ <xsl:apply-templates select="/" mode="collect.targets"/>
+ </xsl:if>
+ <xsl:if test="$collect.xref.targets != 'only'">
+ <xsl:apply-templates select="/" mode="process.root"/>
+ <xsl:if test="$tex.math.in.alt != ''">
+ <xsl:apply-templates select="/" mode="collect.tex.math"/>
+ </xsl:if>
+ <xsl:if test="$generate.manifest != 0">
+ <xsl:call-template name="generate.manifest">
+ <xsl:with-param name="node" select="/"/>
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:if>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="*" mode="process.root">
+ <xsl:apply-templates select="."/>
+</xsl:template>
+
+<xsl:template name="make.lots">
+ <xsl:param name="toc.params" select="''"/>
+ <xsl:param name="toc"/>
+
+ <xsl:variable name="lots">
+ <xsl:if test="contains($toc.params, 'toc')">
+ <xsl:copy-of select="$toc"/>
+ </xsl:if>
+
+ <xsl:if test="contains($toc.params, 'figure')">
+ <xsl:choose>
+ <xsl:when test="$chunk.separate.lots != '0'">
+ <xsl:call-template name="make.lot.chunk">
+ <xsl:with-param name="type" select="'figure'"/>
+ <xsl:with-param name="lot">
+ <xsl:call-template name="list.of.titles">
+ <xsl:with-param name="titles" select="'figure'"/>
+ <xsl:with-param name="nodes" select=".//figure"/>
+ </xsl:call-template>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="list.of.titles">
+ <xsl:with-param name="titles" select="'figure'"/>
+ <xsl:with-param name="nodes" select=".//figure"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:if>
+
+ <xsl:if test="contains($toc.params, 'table')">
+ <xsl:choose>
+ <xsl:when test="$chunk.separate.lots != '0'">
+ <xsl:call-template name="make.lot.chunk">
+ <xsl:with-param name="type" select="'table'"/>
+ <xsl:with-param name="lot">
+ <xsl:call-template name="list.of.titles">
+ <xsl:with-param name="titles" select="'table'"/>
+ <xsl:with-param name="nodes" select=".//table"/>
+ </xsl:call-template>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="list.of.titles">
+ <xsl:with-param name="titles" select="'table'"/>
+ <xsl:with-param name="nodes" select=".//table"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:if>
+
+ <xsl:if test="contains($toc.params, 'example')">
+ <xsl:choose>
+ <xsl:when test="$chunk.separate.lots != '0'">
+ <xsl:call-template name="make.lot.chunk">
+ <xsl:with-param name="type" select="'example'"/>
+ <xsl:with-param name="lot">
+ <xsl:call-template name="list.of.titles">
+ <xsl:with-param name="titles" select="'example'"/>
+ <xsl:with-param name="nodes" select=".//example"/>
+ </xsl:call-template>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="list.of.titles">
+ <xsl:with-param name="titles" select="'example'"/>
+ <xsl:with-param name="nodes" select=".//example"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:if>
+
+ <xsl:if test="contains($toc.params, 'equation')">
+ <xsl:choose>
+ <xsl:when test="$chunk.separate.lots != '0'">
+ <xsl:call-template name="make.lot.chunk">
+ <xsl:with-param name="type" select="'equation'"/>
+ <xsl:with-param name="lot">
+ <xsl:call-template name="list.of.titles">
+ <xsl:with-param name="titles" select="'equation'"/>
+ <xsl:with-param name="nodes" select=".//equation"/>
+ </xsl:call-template>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="list.of.titles">
+ <xsl:with-param name="titles" select="'equation'"/>
+ <xsl:with-param name="nodes" select=".//equation"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:if>
+
+ <xsl:if test="contains($toc.params, 'procedure')">
+ <xsl:choose>
+ <xsl:when test="$chunk.separate.lots != '0'">
+ <xsl:call-template name="make.lot.chunk">
+ <xsl:with-param name="type" select="'procedure'"/>
+ <xsl:with-param name="lot">
+ <xsl:call-template name="list.of.titles">
+ <xsl:with-param name="titles" select="'procedure'"/>
+ <xsl:with-param name="nodes" select=".//procedure[title]"/>
+ </xsl:call-template>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="list.of.titles">
+ <xsl:with-param name="titles" select="'procedure'"/>
+ <xsl:with-param name="nodes" select=".//procedure[title]"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:if>
+ </xsl:variable>
+
+ <xsl:if test="string($lots) != ''">
+ <xsl:choose>
+ <xsl:when test="$chunk.tocs.and.lots != 0 and not(parent::*)">
+ <xsl:call-template name="write.chunk">
+ <xsl:with-param name="filename">
+ <xsl:call-template name="make-relative-filename">
+ <xsl:with-param name="base.dir" select="$base.dir"/>
+ <xsl:with-param name="base.name">
+ <xsl:call-template name="dbhtml-dir"/>
+ <xsl:apply-templates select="." mode="recursive-chunk-filename">
+ <xsl:with-param name="recursive" select="true()"/>
+ </xsl:apply-templates>
+ <xsl:text>-toc</xsl:text>
+ <xsl:value-of select="$html.ext"/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:with-param>
+ <xsl:with-param name="content">
+ <xsl:call-template name="chunk-element-content">
+ <xsl:with-param name="prev" select="/foo"/>
+ <xsl:with-param name="next" select="/foo"/>
+ <xsl:with-param name="nav.context" select="'toc'"/>
+ <xsl:with-param name="content">
+ <h1>
+ <xsl:apply-templates select="." mode="object.title.markup"/>
+ </h1>
+ <xsl:copy-of select="$lots"/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:with-param>
+ <xsl:with-param name="quiet" select="$chunk.quietly"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:copy-of select="$lots"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template name="make.lot.chunk">
+ <xsl:param name="type" select="''"/>
+ <xsl:param name="lot"/>
+
+ <xsl:if test="string($lot) != ''">
+ <xsl:variable name="filename">
+ <xsl:call-template name="make-relative-filename">
+ <xsl:with-param name="base.dir" select="$base.dir"/>
+ <xsl:with-param name="base.name">
+ <xsl:call-template name="dbhtml-dir"/>
+ <xsl:value-of select="$type"/>
+ <xsl:text>-toc</xsl:text>
+ <xsl:value-of select="$html.ext"/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="href">
+ <xsl:call-template name="make-relative-filename">
+ <xsl:with-param name="base.name">
+ <xsl:call-template name="dbhtml-dir"/>
+ <xsl:value-of select="$type"/>
+ <xsl:text>-toc</xsl:text>
+ <xsl:value-of select="$html.ext"/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:call-template name="write.chunk">
+ <xsl:with-param name="filename" select="$filename"/>
+ <xsl:with-param name="content">
+ <xsl:call-template name="chunk-element-content">
+ <xsl:with-param name="prev" select="/foo"/>
+ <xsl:with-param name="next" select="/foo"/>
+ <xsl:with-param name="nav.context" select="'toc'"/>
+ <xsl:with-param name="content">
+ <xsl:copy-of select="$lot"/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:with-param>
+ <xsl:with-param name="quiet" select="$chunk.quietly"/>
+ </xsl:call-template>
+ <!-- And output a link to this file -->
+ <div>
+ <xsl:attribute name="class">
+ <xsl:text>ListofTitles</xsl:text>
+ </xsl:attribute>
+ <a href="{$href}">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key">
+ <xsl:choose>
+ <xsl:when test="$type='table'">ListofTables</xsl:when>
+ <xsl:when test="$type='figure'">ListofFigures</xsl:when>
+ <xsl:when test="$type='equation'">ListofEquations</xsl:when>
+ <xsl:when test="$type='example'">ListofExamples</xsl:when>
+ <xsl:when test="$type='procedure'">ListofProcedures</xsl:when>
+ <xsl:otherwise>ListofUnknown</xsl:otherwise>
+ </xsl:choose>
+ </xsl:with-param>
+ </xsl:call-template>
+ </a>
+ </div>
+ </xsl:if>
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/component.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/component.xsl
new file mode 100644
index 0000000..666ea17
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/component.xsl
@@ -0,0 +1,425 @@
+<?xml version='1.0'?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version='1.0'>
+
+<!-- ********************************************************************
+ $Id: component.xsl 8568 2010-01-11 03:16:56Z bobstayton $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<!-- ==================================================================== -->
+
+<xsl:template name="component.title">
+ <xsl:param name="node" select="."/>
+
+ <xsl:variable name="level">
+ <xsl:choose>
+ <xsl:when test="ancestor::section">
+ <xsl:value-of select="count(ancestor::section)+1"/>
+ </xsl:when>
+ <xsl:when test="ancestor::sect5">6</xsl:when>
+ <xsl:when test="ancestor::sect4">5</xsl:when>
+ <xsl:when test="ancestor::sect3">4</xsl:when>
+ <xsl:when test="ancestor::sect2">3</xsl:when>
+ <xsl:when test="ancestor::sect1">2</xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <!-- Let's handle the case where a component (bibliography, for example)
+ occurs inside a section; will we need parameters for this? -->
+
+ <xsl:element name="h{$level+1}">
+ <xsl:attribute name="class">title</xsl:attribute>
+ <xsl:if test="$generate.id.attributes = 0">
+ <xsl:call-template name="anchor">
+ <xsl:with-param name="node" select="$node"/>
+ <xsl:with-param name="conditional" select="0"/>
+ </xsl:call-template>
+ </xsl:if>
+ <xsl:apply-templates select="$node" mode="object.title.markup">
+ <xsl:with-param name="allow-anchors" select="1"/>
+ </xsl:apply-templates>
+ </xsl:element>
+</xsl:template>
+
+<xsl:template name="component.subtitle">
+ <xsl:param name="node" select="."/>
+ <xsl:variable name="subtitle"
+ select="($node/docinfo/subtitle
+ |$node/info/subtitle
+ |$node/prefaceinfo/subtitle
+ |$node/chapterinfo/subtitle
+ |$node/appendixinfo/subtitle
+ |$node/articleinfo/subtitle
+ |$node/artheader/subtitle
+ |$node/subtitle)[1]"/>
+
+ <xsl:if test="$subtitle">
+ <h3 class="subtitle">
+ <i>
+ <xsl:apply-templates select="$node" mode="object.subtitle.markup"/>
+ </i>
+ </h3>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template name="component.separator">
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="dedication" mode="dedication">
+ <xsl:call-template name="id.warning"/>
+
+ <div>
+ <xsl:call-template name="common.html.attributes">
+ <xsl:with-param name="inherit" select="1"/>
+ </xsl:call-template>
+ <xsl:call-template name="dedication.titlepage"/>
+ <xsl:apply-templates/>
+ <xsl:call-template name="process.footnotes"/>
+ </div>
+</xsl:template>
+
+<xsl:template match="dedication/title|dedication/info/title"
+ mode="titlepage.mode" priority="2">
+ <xsl:call-template name="component.title">
+ <xsl:with-param name="node" select="ancestor::dedication[1]"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="dedication/subtitle|dedication/info/subtitle"
+ mode="titlepage.mode" priority="2">
+ <xsl:call-template name="component.subtitle">
+ <xsl:with-param name="node" select="ancestor::dedication[1]"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="dedication"></xsl:template> <!-- see mode="dedication" -->
+<xsl:template match="dedication/title"></xsl:template>
+<xsl:template match="dedication/subtitle"></xsl:template>
+<xsl:template match="dedication/titleabbrev"></xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="acknowledgements" mode="acknowledgements">
+ <xsl:call-template name="id.warning"/>
+
+ <div>
+ <xsl:call-template name="common.html.attributes">
+ <xsl:with-param name="inherit" select="1"/>
+ </xsl:call-template>
+ <xsl:call-template name="acknowledgements.titlepage"/>
+ <xsl:apply-templates/>
+ <xsl:call-template name="process.footnotes"/>
+ </div>
+</xsl:template>
+
+<xsl:template match="acknowledgements/title|acknowledgements/info/title"
+ mode="titlepage.mode" priority="2">
+ <xsl:call-template name="component.title">
+ <xsl:with-param name="node" select="ancestor::acknowledgements[1]"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="acknowledgements/subtitle|acknowledgements/info/subtitle"
+ mode="titlepage.mode" priority="2">
+ <xsl:call-template name="component.subtitle">
+ <xsl:with-param name="node" select="ancestor::acknowledgements[1]"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="acknowledgements"></xsl:template> <!-- see mode="acknowledgements" -->
+<xsl:template match="acknowledgements/title"></xsl:template>
+<xsl:template match="acknowledgements/subtitle"></xsl:template>
+<xsl:template match="acknowledgements/titleabbrev"></xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="colophon">
+ <xsl:call-template name="id.warning"/>
+
+ <div>
+ <xsl:call-template name="common.html.attributes">
+ <xsl:with-param name="inherit" select="1"/>
+ </xsl:call-template>
+ <xsl:if test="$generate.id.attributes != 0">
+ <xsl:attribute name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:call-template name="component.separator"/>
+ <xsl:call-template name="component.title"/>
+ <xsl:call-template name="component.subtitle"/>
+
+ <xsl:apply-templates/>
+ <xsl:call-template name="process.footnotes"/>
+ </div>
+</xsl:template>
+
+<xsl:template match="colophon/title"></xsl:template>
+<xsl:template match="colophon/subtitle"></xsl:template>
+<xsl:template match="colophon/titleabbrev"></xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="preface">
+ <xsl:call-template name="id.warning"/>
+
+ <div>
+ <xsl:call-template name="common.html.attributes">
+ <xsl:with-param name="inherit" select="1"/>
+ </xsl:call-template>
+ <xsl:if test="$generate.id.attributes != 0">
+ <xsl:attribute name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:call-template name="component.separator"/>
+ <xsl:call-template name="preface.titlepage"/>
+
+ <xsl:variable name="toc.params">
+ <xsl:call-template name="find.path.params">
+ <xsl:with-param name="table" select="normalize-space($generate.toc)"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:if test="contains($toc.params, 'toc')">
+ <xsl:call-template name="component.toc">
+ <xsl:with-param name="toc.title.p" select="contains($toc.params, 'title')"/>
+ </xsl:call-template>
+ <xsl:call-template name="component.toc.separator"/>
+ </xsl:if>
+ <xsl:apply-templates/>
+ <xsl:call-template name="process.footnotes"/>
+ </div>
+</xsl:template>
+
+<xsl:template match="preface/title" mode="titlepage.mode" priority="2">
+ <xsl:call-template name="component.title">
+ <xsl:with-param name="node" select="ancestor::preface[1]"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="preface/subtitle
+ |preface/prefaceinfo/subtitle
+ |preface/info/subtitle
+ |preface/docinfo/subtitle"
+ mode="titlepage.mode" priority="2">
+ <xsl:call-template name="component.subtitle">
+ <xsl:with-param name="node" select="ancestor::preface[1]"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="preface/docinfo|prefaceinfo"></xsl:template>
+<xsl:template match="preface/info"></xsl:template>
+<xsl:template match="preface/title"></xsl:template>
+<xsl:template match="preface/titleabbrev"></xsl:template>
+<xsl:template match="preface/subtitle"></xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="chapter">
+ <xsl:call-template name="id.warning"/>
+
+ <div>
+ <xsl:call-template name="common.html.attributes">
+ <xsl:with-param name="inherit" select="1"/>
+ </xsl:call-template>
+ <xsl:if test="$generate.id.attributes != 0">
+ <xsl:attribute name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:call-template name="component.separator"/>
+ <xsl:call-template name="chapter.titlepage"/>
+
+ <xsl:variable name="toc.params">
+ <xsl:call-template name="find.path.params">
+ <xsl:with-param name="table" select="normalize-space($generate.toc)"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:if test="contains($toc.params, 'toc')">
+ <xsl:call-template name="component.toc">
+ <xsl:with-param name="toc.title.p" select="contains($toc.params, 'title')"/>
+ </xsl:call-template>
+ <xsl:call-template name="component.toc.separator"/>
+ </xsl:if>
+ <xsl:apply-templates/>
+ <xsl:call-template name="process.footnotes"/>
+ </div>
+</xsl:template>
+
+<xsl:template match="chapter/title|chapter/chapterinfo/title|chapter/info/title"
+ mode="titlepage.mode" priority="2">
+ <xsl:call-template name="component.title">
+ <xsl:with-param name="node" select="ancestor::chapter[1]"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="chapter/subtitle
+ |chapter/chapterinfo/subtitle
+ |chapter/info/subtitle
+ |chapter/docinfo/subtitle"
+ mode="titlepage.mode" priority="2">
+ <xsl:call-template name="component.subtitle">
+ <xsl:with-param name="node" select="ancestor::chapter[1]"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="chapter/docinfo|chapterinfo"></xsl:template>
+<xsl:template match="chapter/info"></xsl:template>
+<xsl:template match="chapter/title"></xsl:template>
+<xsl:template match="chapter/titleabbrev"></xsl:template>
+<xsl:template match="chapter/subtitle"></xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="appendix">
+ <xsl:variable name="ischunk">
+ <xsl:call-template name="chunk"/>
+ </xsl:variable>
+
+ <xsl:call-template name="id.warning"/>
+
+ <div>
+ <xsl:call-template name="common.html.attributes">
+ <xsl:with-param name="inherit" select="1"/>
+ </xsl:call-template>
+ <xsl:if test="$generate.id.attributes != 0">
+ <xsl:attribute name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:choose>
+ <xsl:when test="parent::article and $ischunk = 0">
+ <xsl:call-template name="section.heading">
+ <xsl:with-param name="level" select="1"/>
+ <xsl:with-param name="title">
+ <xsl:apply-templates select="." mode="object.title.markup"/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="component.separator"/>
+ <xsl:call-template name="appendix.titlepage"/>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:variable name="toc.params">
+ <xsl:call-template name="find.path.params">
+ <xsl:with-param name="table" select="normalize-space($generate.toc)"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:if test="contains($toc.params, 'toc')">
+ <xsl:call-template name="component.toc">
+ <xsl:with-param name="toc.title.p" select="contains($toc.params, 'title')"/>
+ </xsl:call-template>
+ <xsl:call-template name="component.toc.separator"/>
+ </xsl:if>
+
+ <xsl:apply-templates/>
+
+ <xsl:if test="not(parent::article) or $ischunk != 0">
+ <xsl:call-template name="process.footnotes"/>
+ </xsl:if>
+ </div>
+</xsl:template>
+
+<xsl:template match="appendix/title|appendix/appendixinfo/title"
+ mode="titlepage.mode" priority="2">
+ <xsl:call-template name="component.title">
+ <xsl:with-param name="node" select="ancestor::appendix[1]"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="appendix/subtitle
+ |appendix/appendixinfo/subtitle
+ |appendix/info/subtitle
+ |appendix/docinfo/subtitle"
+ mode="titlepage.mode" priority="2">
+ <xsl:call-template name="component.subtitle">
+ <xsl:with-param name="node" select="ancestor::appendix[1]"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="appendix/docinfo|appendixinfo"></xsl:template>
+<xsl:template match="appendix/info"></xsl:template>
+<xsl:template match="appendix/title"></xsl:template>
+<xsl:template match="appendix/titleabbrev"></xsl:template>
+<xsl:template match="appendix/subtitle"></xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="article">
+ <xsl:call-template name="id.warning"/>
+
+ <div>
+ <xsl:call-template name="common.html.attributes">
+ <xsl:with-param name="inherit" select="1"/>
+ </xsl:call-template>
+ <xsl:if test="$generate.id.attributes != 0">
+ <xsl:attribute name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:call-template name="article.titlepage"/>
+
+ <xsl:variable name="toc.params">
+ <xsl:call-template name="find.path.params">
+ <xsl:with-param name="table" select="normalize-space($generate.toc)"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:call-template name="make.lots">
+ <xsl:with-param name="toc.params" select="$toc.params"/>
+ <xsl:with-param name="toc">
+ <xsl:call-template name="component.toc">
+ <xsl:with-param name="toc.title.p" select="contains($toc.params, 'title')"/>
+ </xsl:call-template>
+ </xsl:with-param>
+ </xsl:call-template>
+
+ <xsl:apply-templates/>
+ <xsl:call-template name="process.footnotes"/>
+ </div>
+</xsl:template>
+
+<xsl:template match="article/title|article/articleinfo/title" mode="titlepage.mode" priority="2">
+ <xsl:call-template name="component.title">
+ <xsl:with-param name="node" select="ancestor::article[1]"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="article/subtitle
+ |article/articleinfo/subtitle
+ |article/info/subtitle
+ |article/artheader/subtitle"
+ mode="titlepage.mode" priority="2">
+ <xsl:call-template name="component.subtitle">
+ <xsl:with-param name="node" select="ancestor::article[1]"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="article/artheader|article/articleinfo"></xsl:template>
+<xsl:template match="article/info"></xsl:template>
+<xsl:template match="article/title"></xsl:template>
+<xsl:template match="article/titleabbrev"></xsl:template>
+<xsl:template match="article/subtitle"></xsl:template>
+
+<!-- ==================================================================== -->
+
+</xsl:stylesheet>
+
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/division.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/division.xsl
new file mode 100644
index 0000000..e910fdd
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/division.xsl
@@ -0,0 +1,217 @@
+<?xml version='1.0'?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version='1.0'>
+
+<!-- ********************************************************************
+ $Id: division.xsl 8421 2009-05-04 07:49:49Z bobstayton $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<!-- ==================================================================== -->
+
+<xsl:template match="set">
+ <xsl:call-template name="id.warning"/>
+
+ <div>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:call-template name="dir">
+ <xsl:with-param name="inherit" select="1"/>
+ </xsl:call-template>
+ <xsl:call-template name="language.attribute"/>
+ <xsl:if test="$generate.id.attributes != 0">
+ <xsl:attribute name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:call-template name="set.titlepage"/>
+
+ <xsl:variable name="toc.params">
+ <xsl:call-template name="find.path.params">
+ <xsl:with-param name="table" select="normalize-space($generate.toc)"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:call-template name="make.lots">
+ <xsl:with-param name="toc.params" select="$toc.params"/>
+ <xsl:with-param name="toc">
+ <xsl:call-template name="set.toc">
+ <xsl:with-param name="toc.title.p" select="contains($toc.params, 'title')"/>
+ </xsl:call-template>
+ </xsl:with-param>
+ </xsl:call-template>
+
+ <xsl:apply-templates/>
+ </div>
+</xsl:template>
+
+<xsl:template match="set/setinfo"></xsl:template>
+<xsl:template match="set/title"></xsl:template>
+<xsl:template match="set/titleabbrev"></xsl:template>
+<xsl:template match="set/subtitle"></xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="book">
+ <xsl:call-template name="id.warning"/>
+
+ <div>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:if test="$generate.id.attributes != 0">
+ <xsl:attribute name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:call-template name="book.titlepage"/>
+
+ <xsl:apply-templates select="dedication" mode="dedication"/>
+ <xsl:apply-templates select="acknowledgements" mode="acknowledgements"/>
+
+ <xsl:variable name="toc.params">
+ <xsl:call-template name="find.path.params">
+ <xsl:with-param name="table" select="normalize-space($generate.toc)"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:call-template name="make.lots">
+ <xsl:with-param name="toc.params" select="$toc.params"/>
+ <xsl:with-param name="toc">
+ <xsl:call-template name="division.toc">
+ <xsl:with-param name="toc.title.p" select="contains($toc.params, 'title')"/>
+ </xsl:call-template>
+ </xsl:with-param>
+ </xsl:call-template>
+
+ <xsl:apply-templates/>
+ </div>
+</xsl:template>
+
+<xsl:template match="book/bookinfo"></xsl:template>
+<xsl:template match="book/info"></xsl:template>
+<xsl:template match="book/title"></xsl:template>
+<xsl:template match="book/titleabbrev"></xsl:template>
+<xsl:template match="book/subtitle"></xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="part">
+ <xsl:call-template name="id.warning"/>
+
+ <div>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:if test="$generate.id.attributes != 0">
+ <xsl:attribute name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:call-template name="part.titlepage"/>
+
+ <xsl:variable name="toc.params">
+ <xsl:call-template name="find.path.params">
+ <xsl:with-param name="table" select="normalize-space($generate.toc)"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:if test="not(partintro) and contains($toc.params, 'toc')">
+ <xsl:call-template name="division.toc"/>
+ </xsl:if>
+ <xsl:apply-templates/>
+ </div>
+</xsl:template>
+
+<xsl:template match="part" mode="make.part.toc">
+ <xsl:call-template name="division.toc"/>
+</xsl:template>
+
+<xsl:template match="reference" mode="make.part.toc">
+ <xsl:call-template name="division.toc"/>
+</xsl:template>
+
+<xsl:template match="part/docinfo"></xsl:template>
+<xsl:template match="part/partinfo"></xsl:template>
+<xsl:template match="part/info"></xsl:template>
+<xsl:template match="part/title"></xsl:template>
+<xsl:template match="part/titleabbrev"></xsl:template>
+<xsl:template match="part/subtitle"></xsl:template>
+
+<xsl:template match="partintro">
+ <xsl:call-template name="id.warning"/>
+
+ <div>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:if test="$generate.id.attributes != 0">
+ <xsl:attribute name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:call-template name="partintro.titlepage"/>
+ <xsl:apply-templates/>
+
+ <xsl:variable name="toc.params">
+ <xsl:call-template name="find.path.params">
+ <xsl:with-param name="node" select="parent::*"/>
+ <xsl:with-param name="table" select="normalize-space($generate.toc)"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:if test="contains($toc.params, 'toc')">
+ <!-- not ancestor::part because partintro appears in reference -->
+ <xsl:apply-templates select="parent::*" mode="make.part.toc"/>
+ </xsl:if>
+ <xsl:call-template name="process.footnotes"/>
+ </div>
+</xsl:template>
+
+<xsl:template match="partintro/title"></xsl:template>
+<xsl:template match="partintro/titleabbrev"></xsl:template>
+<xsl:template match="partintro/subtitle"></xsl:template>
+
+<xsl:template match="partintro/title" mode="partintro.title.mode">
+ <h2>
+ <xsl:apply-templates/>
+ </h2>
+</xsl:template>
+
+<xsl:template match="partintro/subtitle" mode="partintro.title.mode">
+ <h3>
+ <i><xsl:apply-templates/></i>
+ </h3>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="book" mode="division.number">
+ <xsl:number from="set" count="book" format="1."/>
+</xsl:template>
+
+<xsl:template match="part" mode="division.number">
+ <xsl:number from="book" count="part" format="I."/>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template name="division.title">
+ <xsl:param name="node" select="."/>
+
+ <h1>
+ <xsl:attribute name="class">title</xsl:attribute>
+ <xsl:if test="$generate.id.attributes = 0">
+ <xsl:call-template name="anchor">
+ <xsl:with-param name="node" select="$node"/>
+ <xsl:with-param name="conditional" select="0"/>
+ </xsl:call-template>
+ </xsl:if>
+ <xsl:apply-templates select="$node" mode="object.title.markup">
+ <xsl:with-param name="allow-anchors" select="1"/>
+ </xsl:apply-templates>
+ </h1>
+</xsl:template>
+
+</xsl:stylesheet>
+
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/docbook.css.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/docbook.css.xml
new file mode 100644
index 0000000..d93a25c
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/docbook.css.xml
@@ -0,0 +1,109 @@
+<?xml version="1.0"?>
+<style>
+
+/********************************/
+/* start of styles in block.xsl */
+
+.formalpara-title {
+ font-weight: bold;
+}
+
+div.blockquote-title {
+ font-weight: bold;
+ margin-top: 1em;
+ margin-bottom: 1em;
+}
+
+span.msgmain-title {
+ font-weight: bold;
+}
+
+span.msgsub-title {
+ font-weight: bold;
+}
+
+span.msgrel-title {
+ font-weight: bold;
+}
+
+div.msglevel, div.msgorig, div.msgaud {
+ margin-top: 1em;
+ margin-bottom: 1em;
+}
+
+span.msglevel-title, span.msgorig-title, span.msgaud-title {
+ font-weight: bold;
+}
+
+div.msgexplan {
+ margin-top: 1em;
+ margin-bottom: 1em;
+}
+
+span.msgexplan-title {
+ font-weight: bold;
+}
+
+/* end of styles in block.xsl */
+/********************************/
+
+/********************************/
+/* start of styles in autotoc.xsl */
+
+ font-weight: bold;
+ margin-top: 1em;
+ margin-bottom: 1em;
+}
+
+
+/* end of styles in autotoc.xsl */
+/********************************/
+
+/********************************/
+/* start of styles in formal.xsl */
+
+div.figure-title {
+ font-weight: bold;
+}
+
+div.example-title {
+ font-weight: bold;
+}
+
+div.equation-title {
+ font-weight: bold;
+}
+
+div.table-title {
+ font-weight: bold;
+}
+
+div.sidebar-title {
+ font-weight: bold;
+}
+
+
+/* end of styles in formal.xsl */
+/********************************/
+
+/********************************/
+/* start of styles in verbatim.xsl */
+
+div.programlisting {
+ white-space: pre;
+ font-family: monospace;
+}
+
+div.screen {
+ white-space: pre;
+ font-family: monospace;
+}
+
+div.synopsis {
+ white-space: pre;
+ font-family: monospace;
+}
+
+/* end of styles in verbatim.xsl */
+/********************************/
+</style>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/docbook.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/docbook.xsl
new file mode 100644
index 0000000..523ed0d
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/docbook.xsl
@@ -0,0 +1,480 @@
+<?xml version='1.0'?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:ng="http://docbook.org/docbook-ng"
+ xmlns:db="http://docbook.org/ns/docbook"
+ xmlns:exsl="http://exslt.org/common"
+ xmlns:exslt="http://exslt.org/common"
+ exclude-result-prefixes="db ng exsl exslt"
+ version='1.0'>
+
+<xsl:output method="html"
+ encoding="ISO-8859-1"
+ indent="no"/>
+
+<!-- ********************************************************************
+ $Id: docbook.xsl 8783 2010-07-28 10:59:39Z mzjn $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<!-- ==================================================================== -->
+
+<xsl:include href="../VERSION"/>
+<xsl:include href="param.xsl"/>
+<xsl:include href="../lib/lib.xsl"/>
+<xsl:include href="../common/l10n.xsl"/>
+<xsl:include href="../common/common.xsl"/>
+<xsl:include href="../common/utility.xsl"/>
+<xsl:include href="../common/labels.xsl"/>
+<xsl:include href="../common/titles.xsl"/>
+<xsl:include href="../common/subtitles.xsl"/>
+<xsl:include href="../common/gentext.xsl"/>
+<xsl:include href="../common/targets.xsl"/>
+<xsl:include href="../common/olink.xsl"/>
+<xsl:include href="../common/pi.xsl"/>
+<xsl:include href="autotoc.xsl"/>
+<xsl:include href="autoidx.xsl"/>
+<xsl:include href="lists.xsl"/>
+<xsl:include href="callout.xsl"/>
+<xsl:include href="verbatim.xsl"/>
+<xsl:include href="graphics.xsl"/>
+<xsl:include href="xref.xsl"/>
+<xsl:include href="formal.xsl"/>
+<xsl:include href="table.xsl"/>
+<xsl:include href="htmltbl.xsl"/>
+<xsl:include href="sections.xsl"/>
+<xsl:include href="inline.xsl"/>
+<xsl:include href="footnote.xsl"/>
+<xsl:include href="html.xsl"/>
+<xsl:include href="info.xsl"/>
+<xsl:include href="keywords.xsl"/>
+<xsl:include href="division.xsl"/>
+<xsl:include href="toc.xsl"/>
+<xsl:include href="index.xsl"/>
+<xsl:include href="refentry.xsl"/>
+<xsl:include href="math.xsl"/>
+<xsl:include href="admon.xsl"/>
+<xsl:include href="component.xsl"/>
+<xsl:include href="biblio.xsl"/>
+<xsl:include href="biblio-iso690.xsl"/>
+<xsl:include href="glossary.xsl"/>
+<xsl:include href="block.xsl"/>
+<xsl:include href="task.xsl"/>
+<xsl:include href="qandaset.xsl"/>
+<xsl:include href="synop.xsl"/>
+<xsl:include href="titlepage.xsl"/>
+<xsl:include href="titlepage.templates.xsl"/>
+<xsl:include href="pi.xsl"/>
+<xsl:include href="ebnf.xsl"/>
+<xsl:include href="chunker.xsl"/>
+<xsl:include href="html-rtf.xsl"/>
+<xsl:include href="annotations.xsl"/>
+<xsl:include href="../common/stripns.xsl"/>
+
+<xsl:param name="stylesheet.result.type" select="'html'"/>
+<xsl:param name="htmlhelp.output" select="0"/>
+
+<!-- ==================================================================== -->
+
+<xsl:key name="id" match="*" use="@id|@xml:id"/>
+<xsl:key name="gid" match="*" use="generate-id()"/>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="*">
+ <xsl:message>
+ <xsl:text>Element </xsl:text>
+ <xsl:value-of select="local-name(.)"/>
+ <xsl:text> in namespace '</xsl:text>
+ <xsl:value-of select="namespace-uri(.)"/>
+ <xsl:text>' encountered</xsl:text>
+ <xsl:if test="parent::*">
+ <xsl:text> in </xsl:text>
+ <xsl:value-of select="name(parent::*)"/>
+ </xsl:if>
+ <xsl:text>, but no template matches.</xsl:text>
+ </xsl:message>
+
+ <span style="color: red">
+ <xsl:text>&lt;</xsl:text>
+ <xsl:value-of select="name(.)"/>
+ <xsl:text>&gt;</xsl:text>
+ <xsl:apply-templates/>
+ <xsl:text>&lt;/</xsl:text>
+ <xsl:value-of select="name(.)"/>
+ <xsl:text>&gt;</xsl:text>
+ </span>
+</xsl:template>
+
+<xsl:template match="text()">
+ <xsl:value-of select="."/>
+</xsl:template>
+
+<xsl:template name="body.attributes">
+ <xsl:attribute name="bgcolor">white</xsl:attribute>
+ <xsl:attribute name="text">black</xsl:attribute>
+ <xsl:attribute name="link">#0000FF</xsl:attribute>
+ <xsl:attribute name="vlink">#840084</xsl:attribute>
+ <xsl:attribute name="alink">#0000FF</xsl:attribute>
+ <xsl:if test="starts-with($writing.mode, 'rl')">
+ <xsl:attribute name="dir">rtl</xsl:attribute>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template name="head.content">
+ <xsl:param name="node" select="."/>
+ <xsl:param name="title">
+ <xsl:apply-templates select="$node" mode="object.title.markup.textonly"/>
+ </xsl:param>
+
+ <title>
+ <xsl:copy-of select="$title"/>
+ </title>
+
+ <xsl:if test="$html.base != ''">
+ <base href="{$html.base}"/>
+ </xsl:if>
+
+ <!-- Insert links to CSS files or insert literal style elements -->
+ <xsl:call-template name="generate.css"/>
+
+ <xsl:if test="$html.stylesheet != ''">
+ <xsl:call-template name="output.html.stylesheets">
+ <xsl:with-param name="stylesheets" select="normalize-space($html.stylesheet)"/>
+ </xsl:call-template>
+ </xsl:if>
+
+ <xsl:if test="$link.mailto.url != ''">
+ <link rev="made"
+ href="{$link.mailto.url}"/>
+ </xsl:if>
+
+ <meta name="generator" content="DocBook {$DistroTitle} V{$VERSION}"/>
+
+ <xsl:if test="$generate.meta.abstract != 0">
+ <xsl:variable name="info" select="(articleinfo
+ |bookinfo
+ |prefaceinfo
+ |chapterinfo
+ |appendixinfo
+ |sectioninfo
+ |sect1info
+ |sect2info
+ |sect3info
+ |sect4info
+ |sect5info
+ |referenceinfo
+ |refentryinfo
+ |partinfo
+ |info
+ |docinfo)[1]"/>
+ <xsl:if test="$info and $info/abstract">
+ <meta name="description">
+ <xsl:attribute name="content">
+ <xsl:for-each select="$info/abstract[1]/*">
+ <xsl:value-of select="normalize-space(.)"/>
+ <xsl:if test="position() &lt; last()">
+ <xsl:text> </xsl:text>
+ </xsl:if>
+ </xsl:for-each>
+ </xsl:attribute>
+ </meta>
+ </xsl:if>
+ </xsl:if>
+
+ <xsl:if test="($draft.mode = 'yes' or
+ ($draft.mode = 'maybe' and
+ ancestor-or-self::*[@status][1]/@status = 'draft'))
+ and $draft.watermark.image != ''">
+ <style type="text/css"><xsl:text>
+body { background-image: url('</xsl:text>
+<xsl:value-of select="$draft.watermark.image"/><xsl:text>');
+ background-repeat: no-repeat;
+ background-position: top left;
+ /* The following properties make the watermark "fixed" on the page. */
+ /* I think that's just a bit too distracting for the reader... */
+ /* background-attachment: fixed; */
+ /* background-position: center center; */
+ }</xsl:text>
+ </style>
+ </xsl:if>
+ <xsl:apply-templates select="." mode="head.keywords.content"/>
+</xsl:template>
+
+<xsl:template name="output.html.stylesheets">
+ <xsl:param name="stylesheets" select="''"/>
+
+ <xsl:choose>
+ <xsl:when test="contains($stylesheets, ' ')">
+ <xsl:variable name="css.filename" select="substring-before($stylesheets, ' ')"/>
+
+ <xsl:call-template name="make.css.link">
+ <xsl:with-param name="css.filename" select="$css.filename"/>
+ </xsl:call-template>
+
+ <xsl:call-template name="output.html.stylesheets">
+ <xsl:with-param name="stylesheets" select="substring-after($stylesheets, ' ')"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="$stylesheets != ''">
+ <xsl:call-template name="make.css.link">
+ <xsl:with-param name="css.filename" select="$stylesheets"/>
+ </xsl:call-template>
+ </xsl:when>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ============================================================ -->
+
+<xsl:template match="*" mode="head.keywords.content">
+ <xsl:apply-templates select="chapterinfo/keywordset" mode="html.header"/>
+ <xsl:apply-templates select="appendixinfo/keywordset" mode="html.header"/>
+ <xsl:apply-templates select="prefaceinfo/keywordset" mode="html.header"/>
+ <xsl:apply-templates select="bookinfo/keywordset" mode="html.header"/>
+ <xsl:apply-templates select="setinfo/keywordset" mode="html.header"/>
+ <xsl:apply-templates select="articleinfo/keywordset" mode="html.header"/>
+ <xsl:apply-templates select="artheader/keywordset" mode="html.header"/>
+ <xsl:apply-templates select="sect1info/keywordset" mode="html.header"/>
+ <xsl:apply-templates select="sect2info/keywordset" mode="html.header"/>
+ <xsl:apply-templates select="sect3info/keywordset" mode="html.header"/>
+ <xsl:apply-templates select="sect4info/keywordset" mode="html.header"/>
+ <xsl:apply-templates select="sect5info/keywordset" mode="html.header"/>
+ <xsl:apply-templates select="sectioninfo/keywordset" mode="html.header"/>
+ <xsl:apply-templates select="refsect1info/keywordset" mode="html.header"/>
+ <xsl:apply-templates select="refsect2info/keywordset" mode="html.header"/>
+ <xsl:apply-templates select="refsect3info/keywordset" mode="html.header"/>
+ <xsl:apply-templates select="bibliographyinfo/keywordset" mode="html.header"/>
+ <xsl:apply-templates select="glossaryinfo/keywordset" mode="html.header"/>
+ <xsl:apply-templates select="indexinfo/keywordset" mode="html.header"/>
+ <xsl:apply-templates select="refentryinfo/keywordset" mode="html.header"/>
+ <xsl:apply-templates select="partinfo/keywordset" mode="html.header"/>
+ <xsl:apply-templates select="referenceinfo/keywordset" mode="html.header"/>
+ <xsl:apply-templates select="docinfo/keywordset" mode="html.header"/>
+ <xsl:apply-templates select="info/keywordset" mode="html.header"/>
+
+ <xsl:if test="$inherit.keywords != 0
+ and parent::*">
+ <xsl:apply-templates select="parent::*" mode="head.keywords.content"/>
+ </xsl:if>
+</xsl:template>
+
+<!-- ============================================================ -->
+
+<xsl:template name="system.head.content">
+ <xsl:param name="node" select="."/>
+
+ <!-- FIXME: When chunking, only the annotations actually used
+ in this chunk should be referenced. I don't think it
+ does any harm to reference them all, but it adds
+ unnecessary bloat to each chunk. -->
+ <xsl:if test="$annotation.support != 0 and //annotation">
+ <xsl:call-template name="add.annotation.links"/>
+ <script type="text/javascript">
+ <xsl:text>&#10;// Create PopupWindow objects</xsl:text>
+ <xsl:for-each select="//annotation">
+ <xsl:text>&#10;var popup_</xsl:text>
+ <xsl:value-of select="generate-id(.)"/>
+ <xsl:text> = new PopupWindow("popup-</xsl:text>
+ <xsl:value-of select="generate-id(.)"/>
+ <xsl:text>");&#10;</xsl:text>
+ <xsl:text>popup_</xsl:text>
+ <xsl:value-of select="generate-id(.)"/>
+ <xsl:text>.offsetY = 15;&#10;</xsl:text>
+ <xsl:text>popup_</xsl:text>
+ <xsl:value-of select="generate-id(.)"/>
+ <xsl:text>.autoHide();&#10;</xsl:text>
+ </xsl:for-each>
+ </script>
+
+ <style type="text/css">
+ <xsl:value-of select="$annotation.css"/>
+ </style>
+ </xsl:if>
+
+ <!-- system.head.content is like user.head.content, except that
+ it is called before head.content. This is important because it
+ means, for example, that <style> elements output by system.head.content
+ have a lower CSS precedence than the users stylesheet. -->
+</xsl:template>
+
+<!-- ============================================================ -->
+
+<xsl:template name="user.preroot">
+ <!-- Pre-root output, can be used to output comments and PIs. -->
+ <!-- This must not output any element content! -->
+</xsl:template>
+
+<xsl:template name="user.head.content">
+ <xsl:param name="node" select="."/>
+</xsl:template>
+
+<xsl:template name="user.header.navigation">
+ <xsl:param name="node" select="."/>
+</xsl:template>
+
+<xsl:template name="user.header.content">
+ <xsl:param name="node" select="."/>
+</xsl:template>
+
+<xsl:template name="user.footer.content">
+ <xsl:param name="node" select="."/>
+</xsl:template>
+
+<xsl:template name="user.footer.navigation">
+ <xsl:param name="node" select="."/>
+</xsl:template>
+
+<xsl:template match="/">
+ <!-- * Get a title for current doc so that we let the user -->
+ <!-- * know what document we are processing at this point. -->
+ <xsl:variable name="doc.title">
+ <xsl:call-template name="get.doc.title"/>
+ </xsl:variable>
+ <xsl:choose>
+ <!-- Hack! If someone hands us a DocBook V5.x or DocBook NG document,
+ toss the namespace and continue. Use the docbook5 namespaced
+ stylesheets for DocBook5 if you don't want to use this feature.-->
+ <!-- include extra test for Xalan quirk -->
+ <xsl:when test="$exsl.node.set.available != 0
+ and (*/self::ng:* or */self::db:*)">
+ <xsl:call-template name="log.message">
+ <xsl:with-param name="level">Note</xsl:with-param>
+ <xsl:with-param name="source" select="$doc.title"/>
+ <xsl:with-param name="context-desc">
+ <xsl:text>namesp. cut</xsl:text>
+ </xsl:with-param>
+ <xsl:with-param name="message">
+ <xsl:text>stripped namespace before processing</xsl:text>
+ </xsl:with-param>
+ </xsl:call-template>
+ <xsl:variable name="nons">
+ <xsl:apply-templates mode="stripNS"/>
+ </xsl:variable>
+ <!--
+ <xsl:message>Saving stripped document.</xsl:message>
+ <xsl:call-template name="write.chunk">
+ <xsl:with-param name="filename" select="'/tmp/stripped.xml'"/>
+ <xsl:with-param name="method" select="'xml'"/>
+ <xsl:with-param name="content">
+ <xsl:copy-of select="exsl:node-set($nons)"/>
+ </xsl:with-param>
+ </xsl:call-template>
+ -->
+ <xsl:call-template name="log.message">
+ <xsl:with-param name="level">Note</xsl:with-param>
+ <xsl:with-param name="source" select="$doc.title"/>
+ <xsl:with-param name="context-desc">
+ <xsl:text>namesp. cut</xsl:text>
+ </xsl:with-param>
+ <xsl:with-param name="message">
+ <xsl:text>processing stripped document</xsl:text>
+ </xsl:with-param>
+ </xsl:call-template>
+ <xsl:apply-templates select="exsl:node-set($nons)"/>
+ </xsl:when>
+ <!-- Can't process unless namespace removed -->
+ <xsl:when test="*/self::ng:* or */self::db:*">
+ <xsl:message terminate="yes">
+ <xsl:text>Unable to strip the namespace from DB5 document,</xsl:text>
+ <xsl:text> cannot proceed.</xsl:text>
+ </xsl:message>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:choose>
+ <xsl:when test="$rootid != ''">
+ <xsl:choose>
+ <xsl:when test="count(key('id',$rootid)) = 0">
+ <xsl:message terminate="yes">
+ <xsl:text>ID '</xsl:text>
+ <xsl:value-of select="$rootid"/>
+ <xsl:text>' not found in document.</xsl:text>
+ </xsl:message>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:if test="$collect.xref.targets = 'yes' or
+ $collect.xref.targets = 'only'">
+ <xsl:apply-templates select="key('id', $rootid)"
+ mode="collect.targets"/>
+ </xsl:if>
+ <xsl:if test="$collect.xref.targets != 'only'">
+ <xsl:apply-templates select="key('id',$rootid)"
+ mode="process.root"/>
+ <xsl:if test="$tex.math.in.alt != ''">
+ <xsl:apply-templates select="key('id',$rootid)"
+ mode="collect.tex.math"/>
+ </xsl:if>
+ </xsl:if>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:if test="$collect.xref.targets = 'yes' or
+ $collect.xref.targets = 'only'">
+ <xsl:apply-templates select="/" mode="collect.targets"/>
+ </xsl:if>
+ <xsl:if test="$collect.xref.targets != 'only'">
+ <xsl:apply-templates select="/" mode="process.root"/>
+ <xsl:if test="$tex.math.in.alt != ''">
+ <xsl:apply-templates select="/" mode="collect.tex.math"/>
+ </xsl:if>
+ </xsl:if>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="*" mode="process.root">
+ <xsl:variable name="doc" select="self::*"/>
+
+ <xsl:call-template name="user.preroot"/>
+ <xsl:call-template name="root.messages"/>
+
+ <html>
+ <head>
+ <xsl:call-template name="system.head.content">
+ <xsl:with-param name="node" select="$doc"/>
+ </xsl:call-template>
+ <xsl:call-template name="head.content">
+ <xsl:with-param name="node" select="$doc"/>
+ </xsl:call-template>
+ <xsl:call-template name="user.head.content">
+ <xsl:with-param name="node" select="$doc"/>
+ </xsl:call-template>
+ </head>
+ <body>
+ <xsl:call-template name="body.attributes"/>
+ <xsl:call-template name="user.header.content">
+ <xsl:with-param name="node" select="$doc"/>
+ </xsl:call-template>
+ <xsl:apply-templates select="."/>
+ <xsl:call-template name="user.footer.content">
+ <xsl:with-param name="node" select="$doc"/>
+ </xsl:call-template>
+ </body>
+ </html>
+ <xsl:value-of select="$html.append"/>
+
+ <!-- Generate any css files only once, not once per chunk -->
+ <xsl:call-template name="generate.css.files"/>
+</xsl:template>
+
+<xsl:template name="root.messages">
+ <!-- redefine this any way you'd like to output messages -->
+ <!-- DO NOT OUTPUT ANYTHING FROM THIS TEMPLATE -->
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template name="chunk">
+ <xsl:param name="node" select="."/>
+
+ <!-- The default is that we are not chunking... -->
+ <xsl:text>0</xsl:text>
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/ebnf.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/ebnf.xsl
new file mode 100644
index 0000000..b2ab23a
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/ebnf.xsl
@@ -0,0 +1,329 @@
+<?xml version='1.0'?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:doc="http://nwalsh.com/xsl/documentation/1.0"
+ exclude-result-prefixes="doc"
+ version='1.0'>
+
+<!-- ********************************************************************
+ $Id: ebnf.xsl 8178 2008-12-15 22:26:38Z bobstayton $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<doc:reference xmlns="">
+<referenceinfo>
+<releaseinfo role="meta">
+$Id: ebnf.xsl 8178 2008-12-15 22:26:38Z bobstayton $
+</releaseinfo>
+<author><surname>Walsh</surname>
+<firstname>Norman</firstname></author>
+<copyright><year>1999</year><year>2000</year>
+<holder>Norman Walsh</holder>
+</copyright>
+</referenceinfo>
+<title>HTML EBNF Reference</title>
+
+<partintro>
+<section><title>Introduction</title>
+
+<para>This is technical reference documentation for the DocBook XSL
+Stylesheets; it documents (some of) the parameters, templates, and
+other elements of the stylesheets.</para>
+
+<para>This reference describes the templates and parameters relevant
+to formatting EBNF markup.</para>
+
+<para>This is not intended to be <quote>user</quote> documentation.
+It is provided for developers writing customization layers for the
+stylesheets, and for anyone who's interested in <quote>how it
+works</quote>.</para>
+
+<para>Although I am trying to be thorough, this documentation is known
+to be incomplete. Don't forget to read the source, too :-)</para>
+</section>
+</partintro>
+</doc:reference>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="productionset">
+ <table width="100%" cellpadding="5">
+ <xsl:if test="$ebnf.table.bgcolor != ''">
+ <xsl:attribute name="bgcolor">
+ <xsl:value-of select="$ebnf.table.bgcolor"/>
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:if test="$ebnf.table.border != 0">
+ <xsl:attribute name="border">1</xsl:attribute>
+ </xsl:if>
+ <xsl:attribute name="class">
+ <xsl:value-of select="local-name(.)"/>
+ </xsl:attribute>
+ <xsl:attribute name="summary">
+ <xsl:text>EBNF</xsl:text>
+ <xsl:if test="title">
+ <xsl:text> for </xsl:text>
+ <xsl:value-of select="title"/>
+ </xsl:if>
+ </xsl:attribute>
+
+ <xsl:if test="title">
+ <tr>
+ <th align="{$direction.align.start}" valign="top">
+ <xsl:apply-templates select="." mode="class.attribute"/>
+ <xsl:apply-templates select="title"/>
+ </th>
+ </tr>
+ </xsl:if>
+ <tr>
+ <td>
+ <table border="0" width="99%" cellpadding="0">
+ <xsl:if test="$ebnf.table.bgcolor != ''">
+ <xsl:attribute name="bgcolor">
+ <xsl:value-of select="$ebnf.table.bgcolor"/>
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:attribute name="class">
+ <xsl:value-of select="local-name(.)"/>
+ </xsl:attribute>
+ <xsl:attribute name="summary">EBNF productions</xsl:attribute>
+ <xsl:apply-templates select="production|productionrecap"/>
+ </table>
+ </td>
+ </tr>
+ </table>
+</xsl:template>
+
+<xsl:template match="productionset/title">
+ <xsl:apply-templates/>
+</xsl:template>
+
+<xsl:template match="production">
+ <xsl:param name="recap" select="false()"/>
+ <tr>
+ <td align="{$direction.align.start}" valign="top" width="3%">
+ <xsl:text>[</xsl:text>
+ <xsl:number count="production" level="any"/>
+ <xsl:text>]</xsl:text>
+ </td>
+ <td align="{$direction.align.end}" valign="top" width="10%">
+ <xsl:choose>
+ <xsl:when test="$recap">
+ <a>
+ <xsl:attribute name="href">
+ <xsl:call-template name="href.target">
+ <xsl:with-param name="object" select="."/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:apply-templates select="lhs"/>
+ </a>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="anchor"/>
+ <xsl:apply-templates select="lhs"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </td>
+ <td valign="top" width="5%" align="center">
+ <xsl:copy-of select="$ebnf.assignment"/>
+ </td>
+ <td valign="top" width="52%">
+ <xsl:apply-templates select="rhs"/>
+ <xsl:copy-of select="$ebnf.statement.terminator"/>
+ </td>
+ <td align="{$direction.align.start}" valign="top" width="30%">
+ <xsl:choose>
+ <xsl:when test="rhs/lineannotation|constraint">
+ <xsl:apply-templates select="rhs/lineannotation" mode="rhslo"/>
+ <xsl:apply-templates select="constraint"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text>&#160;</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ </td>
+ </tr>
+</xsl:template>
+
+<xsl:template match="productionrecap">
+ <xsl:variable name="targets" select="key('id',@linkend)"/>
+ <xsl:variable name="target" select="$targets[1]"/>
+
+ <xsl:if test="count($targets)=0">
+ <xsl:message>
+ <xsl:text>Error: no ID for productionrecap linkend: </xsl:text>
+ <xsl:value-of select="@linkend"/>
+ <xsl:text>.</xsl:text>
+ </xsl:message>
+ </xsl:if>
+
+ <xsl:if test="count($targets)>1">
+ <xsl:message>
+ <xsl:text>Warning: multiple "IDs" for productionrecap linkend: </xsl:text>
+ <xsl:value-of select="@linkend"/>
+ <xsl:text>.</xsl:text>
+ </xsl:message>
+ </xsl:if>
+
+ <xsl:apply-templates select="$target">
+ <xsl:with-param name="recap" select="true()"/>
+ </xsl:apply-templates>
+</xsl:template>
+
+<xsl:template match="lhs">
+ <xsl:apply-templates/>
+</xsl:template>
+
+<xsl:template match="rhs">
+ <xsl:apply-templates/>
+ <xsl:if test="following-sibling::rhs">
+ <xsl:text> |</xsl:text>
+ <br/>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="nonterminal">
+ <xsl:variable name="linkend">
+ <xsl:call-template name="xpointer.idref">
+ <xsl:with-param name="xpointer" select="@def"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:call-template name="check.id.unique">
+ <xsl:with-param name="linkend" select="$linkend"/>
+ </xsl:call-template>
+
+ <xsl:call-template name="check.idref.targets">
+ <xsl:with-param name="linkend" select="$linkend"/>
+ <xsl:with-param name="element-list">production</xsl:with-param>
+ </xsl:call-template>
+
+ <!-- If you don't provide content, you can't point outside this doc. -->
+ <xsl:choose>
+ <xsl:when test="*|text()"><!--nop--></xsl:when>
+ <xsl:otherwise>
+ <xsl:if test="$linkend = ''">
+ <xsl:message>
+ <xsl:text>Non-terminals with no content must point to </xsl:text>
+ <xsl:text>production elements in the current document.</xsl:text>
+ </xsl:message>
+ <xsl:message>
+ <xsl:text>Invalid xpointer for empty nt: </xsl:text>
+ <xsl:value-of select="@def"/>
+ </xsl:message>
+ </xsl:if>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:variable name="href">
+ <xsl:choose>
+ <xsl:when test="$linkend != ''">
+ <xsl:variable name="targets" select="key('id',$linkend)"/>
+ <xsl:variable name="target" select="$targets[1]"/>
+ <xsl:call-template name="href.target">
+ <xsl:with-param name="object" select="$target"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="@def"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <a href="{$href}">
+ <xsl:choose>
+ <xsl:when test="*|text()">
+ <xsl:apply-templates/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:choose>
+ <xsl:when test="$linkend != ''">
+ <xsl:variable name="targets" select="key('id',$linkend)"/>
+ <xsl:variable name="target" select="$targets[1]"/>
+ <xsl:apply-templates select="$target/lhs"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text>???</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+ </a>
+</xsl:template>
+
+<xsl:template match="rhs/lineannotation">
+ <!--nop-->
+</xsl:template>
+
+<xsl:template match="rhs/lineannotation" mode="rhslo">
+ <xsl:text>/*&#160;</xsl:text>
+ <xsl:apply-templates/>
+ <xsl:text>&#160;*/</xsl:text>
+ <br/>
+</xsl:template>
+
+<xsl:template match="constraint">
+ <xsl:call-template name="check.id.unique">
+ <xsl:with-param name="linkend" select="@linkend"/>
+ </xsl:call-template>
+
+ <xsl:call-template name="check.idref.targets">
+ <xsl:with-param name="linkend" select="@linkend"/>
+ <xsl:with-param name="element-list">constraintdef</xsl:with-param>
+ </xsl:call-template>
+
+ <xsl:variable name="href">
+ <xsl:variable name="targets" select="key('id',@linkend)"/>
+ <xsl:variable name="target" select="$targets[1]"/>
+ <xsl:call-template name="href.target">
+ <xsl:with-param name="object" select="$target"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:text>[&#160;</xsl:text>
+
+ <xsl:choose>
+ <xsl:when test="@role">
+ <xsl:value-of select="@role"/>
+ <xsl:text>: </xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:variable name="targets" select="key('id',@linkend)"/>
+ <xsl:variable name="target" select="$targets[1]"/>
+ <xsl:if test="$target/@role">
+ <xsl:value-of select="$target/@role"/>
+ <xsl:text>: </xsl:text>
+ </xsl:if>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <a href="{$href}">
+ <xsl:variable name="targets" select="key('id',@linkend)"/>
+ <xsl:variable name="target" select="$targets[1]"/>
+ <xsl:apply-templates select="$target" mode="title.markup"/>
+ </a>
+ <xsl:text>&#160;]</xsl:text>
+ <xsl:if test="following-sibling::constraint">
+ <br/>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="constraintdef">
+ <div>
+ <xsl:apply-templates select="." mode="class.attribute"/>
+ <xsl:call-template name="anchor"/>
+ <xsl:apply-templates/>
+ </div>
+</xsl:template>
+
+<xsl:template match="constraintdef/title">
+ <p><b><xsl:apply-templates/></b></p>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/footnote.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/footnote.xsl
new file mode 100644
index 0000000..035e3f3
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/footnote.xsl
@@ -0,0 +1,313 @@
+<?xml version='1.0'?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:exsl="http://exslt.org/common"
+ exclude-result-prefixes="exsl"
+ version='1.0'>
+
+<!-- ********************************************************************
+ $Id: footnote.xsl 8812 2010-08-09 20:51:51Z bobstayton $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<xsl:template match="footnote">
+ <xsl:variable name="name">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+ <xsl:variable name="href">
+ <xsl:text>#ftn.</xsl:text>
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="ancestor::table or ancestor::informaltable">
+ <sup>
+ <xsl:text>[</xsl:text>
+ <a name="{$name}" href="{$href}">
+ <xsl:apply-templates select="." mode="class.attribute"/>
+ <xsl:apply-templates select="." mode="footnote.number"/>
+ </a>
+ <xsl:text>]</xsl:text>
+ </sup>
+ </xsl:when>
+ <xsl:otherwise>
+ <sup>
+ <xsl:text>[</xsl:text>
+ <a name="{$name}" href="{$href}">
+ <xsl:apply-templates select="." mode="class.attribute"/>
+ <xsl:apply-templates select="." mode="footnote.number"/>
+ </a>
+ <xsl:text>]</xsl:text>
+ </sup>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="footnoteref">
+ <xsl:variable name="targets" select="key('id',@linkend)"/>
+ <xsl:variable name="footnote" select="$targets[1]"/>
+
+ <xsl:if test="not(local-name($footnote) = 'footnote')">
+ <xsl:message terminate="yes">
+ERROR: A footnoteref element has a linkend that points to an element that is not a footnote.
+Typically this happens when an id attribute is accidentally applied to the child of a footnote element.
+target element: <xsl:value-of select="local-name($footnote)"/>
+linkend/id: <xsl:value-of select="@linkend"/>
+ </xsl:message>
+ </xsl:if>
+
+ <xsl:variable name="target.href">
+ <xsl:call-template name="href.target">
+ <xsl:with-param name="object" select="$footnote"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="href">
+ <xsl:value-of select="substring-before($target.href, '#')"/>
+ <xsl:text>#ftn.</xsl:text>
+ <xsl:value-of select="substring-after($target.href, '#')"/>
+ </xsl:variable>
+
+ <sup>
+ <xsl:text>[</xsl:text>
+ <a href="{$href}">
+ <xsl:apply-templates select="." mode="class.attribute"/>
+ <xsl:apply-templates select="$footnote" mode="footnote.number"/>
+ </a>
+ <xsl:text>]</xsl:text>
+ </sup>
+</xsl:template>
+
+<xsl:template match="footnote" mode="footnote.number">
+ <xsl:choose>
+ <xsl:when test="string-length(@label) != 0">
+ <xsl:value-of select="@label"/>
+ </xsl:when>
+ <xsl:when test="ancestor::table or ancestor::informaltable">
+ <xsl:variable name="tfnum">
+ <xsl:number level="any" from="table|informaltable" format="1"/>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="string-length($table.footnote.number.symbols) &gt;= $tfnum">
+ <xsl:value-of select="substring($table.footnote.number.symbols, $tfnum, 1)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:number level="any" from="table | informaltable"
+ format="{$table.footnote.number.format}"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:variable name="pfoot" select="preceding::footnote[not(@label)]"/>
+ <xsl:variable name="ptfoot" select="preceding::table//footnote |
+ preceding::informaltable//footnote"/>
+ <xsl:variable name="fnum" select="count($pfoot) - count($ptfoot) + 1"/>
+
+ <xsl:choose>
+ <xsl:when test="string-length($footnote.number.symbols) &gt;= $fnum">
+ <xsl:value-of select="substring($footnote.number.symbols, $fnum, 1)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:number value="$fnum" format="{$footnote.number.format}"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="footnote/para[1]|footnote/simpara[1]" priority="2">
+ <!-- this only works if the first thing in a footnote is a para, -->
+ <!-- which is ok, because it usually is. -->
+ <xsl:variable name="name">
+ <xsl:text>ftn.</xsl:text>
+ <xsl:call-template name="object.id">
+ <xsl:with-param name="object" select="ancestor::footnote"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:variable name="href">
+ <xsl:text>#</xsl:text>
+ <xsl:call-template name="object.id">
+ <xsl:with-param name="object" select="ancestor::footnote"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:call-template name="paragraph">
+ <xsl:with-param name="class">
+ <xsl:if test="@role and $para.propagates.style != 0">
+ <xsl:value-of select="@role"/>
+ </xsl:if>
+ </xsl:with-param>
+ <xsl:with-param name="content">
+ <sup>
+ <xsl:text>[</xsl:text>
+ <a id="{$name}" href="{$href}">
+ <xsl:apply-templates select="." mode="class.attribute"/>
+ <xsl:apply-templates select="ancestor::footnote" mode="footnote.number"/>
+ </a>
+ <xsl:text>] </xsl:text>
+ </sup>
+ <xsl:apply-templates/>
+ </xsl:with-param>
+ </xsl:call-template>
+
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="*" mode="footnote.body.number">
+ <xsl:variable name="name">
+ <xsl:text>ftn.</xsl:text>
+ <xsl:call-template name="object.id">
+ <xsl:with-param name="object" select="ancestor::footnote"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:variable name="href">
+ <xsl:text>#</xsl:text>
+ <xsl:call-template name="object.id">
+ <xsl:with-param name="object" select="ancestor::footnote"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:variable name="footnote.mark">
+ <sup>
+ <xsl:text>[</xsl:text>
+ <a name="{$name}" href="{$href}">
+ <xsl:apply-templates select="." mode="class.attribute"/>
+ <xsl:apply-templates select="ancestor::footnote"
+ mode="footnote.number"/>
+ </a>
+ <xsl:text>] </xsl:text>
+ </sup>
+ </xsl:variable>
+
+ <xsl:variable name="html">
+ <xsl:apply-templates select="."/>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="$exsl.node.set.available != 0">
+ <xsl:variable name="html-nodes" select="exsl:node-set($html)"/>
+ <xsl:choose>
+ <xsl:when test="$html-nodes//p">
+ <xsl:apply-templates select="$html-nodes" mode="insert.html.p">
+ <xsl:with-param name="mark" select="$footnote.mark"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="$html-nodes" mode="insert.html.text">
+ <xsl:with-param name="mark" select="$footnote.mark"/>
+ </xsl:apply-templates>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:copy-of select="$html"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<!--
+<xsl:template name="count-element-from">
+ <xsl:param name="from" select=".."/>
+ <xsl:param name="to" select="."/>
+ <xsl:param name="count" select="0"/>
+ <xsl:param name="list" select="$from/following::*[local-name(.)=local-name($to)]
+ |$from/descendant-or-self::*[local-name(.)=local-name($to)]"/>
+
+ <xsl:choose>
+ <xsl:when test="not($list)">
+ <xsl:text>-1</xsl:text>
+ </xsl:when>
+ <xsl:when test="$list[1] = $to">
+ <xsl:value-of select="$count + 1"/>
+ </xsl:when>
+ <xsl:otherwise>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+-->
+
+<!-- ==================================================================== -->
+
+<xsl:template name="process.footnotes">
+ <xsl:variable name="footnotes" select=".//footnote"/>
+ <xsl:variable name="table.footnotes"
+ select=".//table//footnote | .//informaltable//footnote"/>
+
+ <!-- Only bother to do this if there's at least one non-table footnote -->
+ <xsl:if test="count($footnotes)>count($table.footnotes)">
+ <div class="footnotes">
+ <br/>
+ <hr width="100" align="{$direction.align.start}"/>
+ <xsl:apply-templates select="$footnotes" mode="process.footnote.mode"/>
+ </div>
+ </xsl:if>
+
+ <xsl:if test="$annotation.support != 0 and //annotation">
+ <div class="annotation-list">
+ <div class="annotation-nocss">
+ <p>The following annotations are from this essay. You are seeing
+ them here because your browser doesn’t support the user-interface
+ techniques used to make them appear as ‘popups’ on modern browsers.</p>
+ </div>
+
+ <xsl:apply-templates select="//annotation"
+ mode="annotation-popup"/>
+ </div>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template name="process.chunk.footnotes">
+ <!-- nop -->
+</xsl:template>
+
+<xsl:template match="footnote" name="process.footnote" mode="process.footnote.mode">
+ <xsl:choose>
+ <xsl:when test="local-name(*[1]) = 'para' or local-name(*[1]) = 'simpara'">
+ <div>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates/>
+ </div>
+ </xsl:when>
+
+ <xsl:when test="$html.cleanup != 0 and
+ $exsl.node.set.available != 0">
+ <div>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates select="*[1]" mode="footnote.body.number"/>
+ <xsl:apply-templates select="*[position() &gt; 1]"/>
+ </div>
+ </xsl:when>
+
+ <xsl:otherwise>
+ <xsl:message>
+ <xsl:text>Warning: footnote number may not be generated </xsl:text>
+ <xsl:text>correctly; </xsl:text>
+ <xsl:value-of select="local-name(*[1])"/>
+ <xsl:text> unexpected as first child of footnote.</xsl:text>
+ </xsl:message>
+ <div>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates/>
+ </div>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="table//footnote | informaltable//footnote"
+ mode="process.footnote.mode">
+</xsl:template>
+
+<xsl:template match="footnote" mode="table.footnote.mode">
+ <xsl:call-template name="process.footnote"/>
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/formal.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/formal.xsl
new file mode 100644
index 0000000..768ca58
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/formal.xsl
@@ -0,0 +1,425 @@
+<?xml version='1.0'?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version='1.0'>
+
+<!-- ********************************************************************
+ $Id: formal.xsl 8806 2010-08-09 18:25:58Z bobstayton $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<xsl:param name="formal.object.break.after">1</xsl:param>
+
+<xsl:template name="formal.object">
+ <xsl:param name="placement" select="'before'"/>
+ <xsl:param name="class">
+ <xsl:apply-templates select="." mode="class.value"/>
+ </xsl:param>
+
+ <xsl:call-template name="id.warning"/>
+
+ <xsl:variable name="content">
+ <div class="{$class}">
+ <xsl:call-template name="anchor">
+ <xsl:with-param name="conditional" select="0"/>
+ </xsl:call-template>
+
+ <xsl:choose>
+ <xsl:when test="$placement = 'before'">
+ <xsl:call-template name="formal.object.heading"/>
+ <div class="{$class}-contents">
+ <xsl:apply-templates/>
+ </div>
+ <!-- HACK: This doesn't belong inside formal.object; it
+ should be done by the table template, but I want
+ the link to be inside the DIV, so... -->
+ <xsl:if test="local-name(.) = 'table'">
+ <xsl:call-template name="table.longdesc"/>
+ </xsl:if>
+
+ <xsl:if test="$spacing.paras != 0"><p/></xsl:if>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:if test="$spacing.paras != 0"><p/></xsl:if>
+ <div class="{$class}-contents"><xsl:apply-templates/></div>
+ <!-- HACK: This doesn't belong inside formal.object; it
+ should be done by the table template, but I want
+ the link to be inside the DIV, so... -->
+ <xsl:if test="local-name(.) = 'table'">
+ <xsl:call-template name="table.longdesc"/>
+ </xsl:if>
+
+ <xsl:call-template name="formal.object.heading"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </div>
+ <xsl:if test="not($formal.object.break.after = '0')">
+ <br class="{$class}-break"/>
+ </xsl:if>
+ </xsl:variable>
+
+ <xsl:variable name="floatstyle">
+ <xsl:call-template name="floatstyle"/>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="$floatstyle != ''">
+ <xsl:call-template name="floater">
+ <xsl:with-param name="class"><xsl:value-of
+ select="$class"/>-float</xsl:with-param>
+ <xsl:with-param name="floatstyle" select="$floatstyle"/>
+ <xsl:with-param name="content" select="$content"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:copy-of select="$content"/>
+ </xsl:otherwise>
+ </xsl:choose>
+
+</xsl:template>
+
+<xsl:template name="formal.object.heading">
+ <xsl:param name="object" select="."/>
+ <xsl:param name="title">
+ <xsl:apply-templates select="$object" mode="object.title.markup">
+ <xsl:with-param name="allow-anchors" select="1"/>
+ </xsl:apply-templates>
+ </xsl:param>
+
+
+ <xsl:choose>
+ <xsl:when test="$make.clean.html != 0">
+ <xsl:variable name="html.class" select="concat(local-name($object),'-title')"/>
+ <div class="{$html.class}">
+ <xsl:copy-of select="$title"/>
+ </div>
+ </xsl:when>
+ <xsl:otherwise>
+ <p class="title">
+ <b>
+ <xsl:copy-of select="$title"/>
+ </b>
+ </p>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="informal.object">
+ <xsl:param name="class" select="local-name(.)"/>
+
+ <xsl:variable name="content">
+ <div class="{$class}">
+ <xsl:if test="$spacing.paras != 0"><p/></xsl:if>
+ <xsl:call-template name="anchor"/>
+ <xsl:apply-templates/>
+
+ <!-- HACK: This doesn't belong inside formal.object; it
+ should be done by the table template, but I want
+ the link to be inside the DIV, so... -->
+ <xsl:if test="local-name(.) = 'informaltable'">
+ <xsl:call-template name="table.longdesc"/>
+ </xsl:if>
+
+ <xsl:if test="$spacing.paras != 0"><p/></xsl:if>
+ </div>
+ </xsl:variable>
+
+ <xsl:variable name="floatstyle">
+ <xsl:call-template name="floatstyle"/>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="$floatstyle != ''">
+ <xsl:call-template name="floater">
+ <xsl:with-param name="class"><xsl:value-of
+ select="$class"/>-float</xsl:with-param>
+ <xsl:with-param name="floatstyle" select="$floatstyle"/>
+ <xsl:with-param name="content" select="$content"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:copy-of select="$content"/>
+ </xsl:otherwise>
+ </xsl:choose>
+
+</xsl:template>
+
+<xsl:template name="semiformal.object">
+ <xsl:param name="placement" select="'before'"/>
+ <xsl:param name="class" select="local-name(.)"/>
+
+ <xsl:choose>
+ <xsl:when test="title or info/title">
+ <xsl:call-template name="formal.object">
+ <xsl:with-param name="placement" select="$placement"/>
+ <xsl:with-param name="class" select="$class"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="informal.object">
+ <xsl:with-param name="class" select="$class"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="figure">
+ <xsl:variable name="param.placement"
+ select="substring-after(normalize-space($formal.title.placement),
+ concat(local-name(.), ' '))"/>
+
+ <xsl:variable name="placement">
+ <xsl:choose>
+ <xsl:when test="contains($param.placement, ' ')">
+ <xsl:value-of select="substring-before($param.placement, ' ')"/>
+ </xsl:when>
+ <xsl:when test="$param.placement = ''">before</xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$param.placement"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:call-template name="formal.object">
+ <xsl:with-param name="placement" select="$placement"/>
+ </xsl:call-template>
+
+</xsl:template>
+
+<xsl:template match="table">
+ <xsl:choose>
+ <xsl:when test="tgroup|mediaobject|graphic">
+ <xsl:call-template name="calsTable"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <!-- do not use xsl:copy because of XHTML's needs -->
+ <xsl:element name="table" namespace="">
+ <xsl:apply-templates select="@*" mode="htmlTableAtt"/>
+ <xsl:attribute name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:attribute>
+ <xsl:call-template name="htmlTable"/>
+ </xsl:element>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="calsTable">
+ <xsl:if test="tgroup/tbody/tr
+ |tgroup/thead/tr
+ |tgroup/tfoot/tr">
+ <xsl:message terminate="yes">Broken table: tr descendent of CALS Table.</xsl:message>
+ </xsl:if>
+
+ <xsl:variable name="param.placement"
+ select="substring-after(normalize-space($formal.title.placement),
+ concat(local-name(.), ' '))"/>
+
+ <xsl:variable name="placement">
+ <xsl:choose>
+ <xsl:when test="contains($param.placement, ' ')">
+ <xsl:value-of select="substring-before($param.placement, ' ')"/>
+ </xsl:when>
+ <xsl:when test="$param.placement = ''">before</xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$param.placement"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:call-template name="formal.object">
+ <xsl:with-param name="placement" select="$placement"/>
+ <xsl:with-param name="class">
+ <xsl:choose>
+ <xsl:when test="@tabstyle">
+ <!-- hack, this will only ever occur on table, not example -->
+ <xsl:value-of select="@tabstyle"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="local-name(.)"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:with-param>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template name="htmlTable">
+ <xsl:if test="tgroup/tbody/row
+ |tgroup/thead/row
+ |tgroup/tfoot/row">
+ <xsl:message terminate="yes">Broken table: row descendent of HTML table.</xsl:message>
+ </xsl:if>
+
+ <xsl:apply-templates mode="htmlTable"/>
+
+ <xsl:if test=".//footnote|../title//footnote">
+ <tbody class="footnotes">
+ <tr>
+ <td colspan="50">
+ <xsl:apply-templates select=".//footnote|../title//footnote" mode="table.footnote.mode"/>
+ </td>
+ </tr>
+ </tbody>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="example">
+ <xsl:variable name="param.placement"
+ select="substring-after(normalize-space($formal.title.placement),
+ concat(local-name(.), ' '))"/>
+
+ <xsl:variable name="placement">
+ <xsl:choose>
+ <xsl:when test="contains($param.placement, ' ')">
+ <xsl:value-of select="substring-before($param.placement, ' ')"/>
+ </xsl:when>
+ <xsl:when test="$param.placement = ''">before</xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$param.placement"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:call-template name="formal.object">
+ <xsl:with-param name="placement" select="$placement"/>
+ </xsl:call-template>
+
+</xsl:template>
+
+<xsl:template match="equation">
+ <xsl:variable name="param.placement"
+ select="substring-after(normalize-space($formal.title.placement),
+ concat(local-name(.), ' '))"/>
+
+ <xsl:variable name="placement">
+ <xsl:choose>
+ <xsl:when test="contains($param.placement, ' ')">
+ <xsl:value-of select="substring-before($param.placement, ' ')"/>
+ </xsl:when>
+ <xsl:when test="$param.placement = ''">before</xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$param.placement"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:call-template name="formal.object">
+ <xsl:with-param name="placement" select="$placement"/>
+ </xsl:call-template>
+
+</xsl:template>
+
+<xsl:template match="figure/title"></xsl:template>
+<xsl:template match="figure/titleabbrev"></xsl:template>
+<xsl:template match="table/title"></xsl:template>
+<xsl:template match="table/titleabbrev"></xsl:template>
+<xsl:template match="table/textobject"></xsl:template>
+<xsl:template match="example/title"></xsl:template>
+<xsl:template match="example/titleabbrev"></xsl:template>
+<xsl:template match="equation/title"></xsl:template>
+<xsl:template match="equation/titleabbrev"></xsl:template>
+
+<xsl:template match="informalfigure">
+ <xsl:call-template name="informal.object"/>
+</xsl:template>
+
+<xsl:template match="informalexample">
+ <xsl:call-template name="informal.object"/>
+</xsl:template>
+
+<xsl:template match="informaltable">
+ <xsl:choose>
+ <xsl:when test="tgroup|mediaobject|graphic">
+ <xsl:call-template name="informal.object">
+ <xsl:with-param name="class">
+ <xsl:choose>
+ <xsl:when test="@tabstyle">
+ <xsl:value-of select="@tabstyle"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="local-name(.)"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:element name="table" namespace="">
+ <xsl:apply-templates select="@*" mode="htmlTableAtt"/>
+ <xsl:attribute name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:attribute>
+ <xsl:call-template name="htmlTable"/>
+ </xsl:element>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="informaltable/textobject"></xsl:template>
+
+<xsl:template name="table.longdesc">
+ <!-- HACK: This doesn't belong inside formal.objectt; it should be done by -->
+ <!-- the table template, but I want the link to be inside the DIV, so... -->
+ <xsl:variable name="longdesc.uri">
+ <xsl:call-template name="longdesc.uri">
+ <xsl:with-param name="mediaobject" select="."/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="irrelevant">
+ <!-- write.longdesc returns the filename ... -->
+ <xsl:call-template name="write.longdesc">
+ <xsl:with-param name="mediaobject" select="."/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:if test="$html.longdesc != 0 and $html.longdesc.link != 0
+ and textobject[not(phrase)]">
+ <xsl:call-template name="longdesc.link">
+ <xsl:with-param name="longdesc.uri" select="$longdesc.uri"/>
+ </xsl:call-template>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="informalequation">
+ <xsl:call-template name="informal.object"/>
+</xsl:template>
+
+<xsl:template name="floatstyle">
+ <xsl:if test="(@float and @float != '0') or @floatstyle != ''">
+ <xsl:choose>
+ <xsl:when test="@floatstyle != ''">
+ <xsl:value-of select="@floatstyle"/>
+ </xsl:when>
+ <xsl:when test="@float = '1'">
+ <xsl:value-of select="$default.float.class"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="@float"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template name="floater">
+ <xsl:param name="content"/>
+ <xsl:param name="class" select="'float'"/>
+ <xsl:param name="floatstyle" select="'left'"/>
+
+ <div class="{$class}">
+ <xsl:if test="$floatstyle = 'left' or $floatstyle = 'right'">
+ <xsl:attribute name="style">
+ <xsl:text>float: </xsl:text>
+ <xsl:value-of select="$floatstyle"/>
+ <xsl:text>;</xsl:text>
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:copy-of select="$content"/>
+ </div>
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/glossary.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/glossary.xsl
new file mode 100644
index 0000000..f98ddbc
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/glossary.xsl
@@ -0,0 +1,492 @@
+<?xml version='1.0'?>
+<!DOCTYPE xsl:stylesheet [
+<!ENTITY % common.entities SYSTEM "../common/entities.ent">
+%common.entities;
+]>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:xlink='http://www.w3.org/1999/xlink'
+ exclude-result-prefixes="xlink"
+ version='1.0'>
+
+<!-- ********************************************************************
+ $Id: glossary.xsl 8421 2009-05-04 07:49:49Z bobstayton $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<!-- ==================================================================== -->
+
+<xsl:template match="glossary">
+ &setup-language-variable;
+ <xsl:call-template name="id.warning"/>
+
+ <div>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:if test="$generate.id.attributes != 0">
+ <xsl:attribute name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:call-template name="glossary.titlepage"/>
+
+ <xsl:choose>
+ <xsl:when test="glossdiv">
+ <xsl:apply-templates select="(glossdiv[1]/preceding-sibling::*)"/>
+ </xsl:when>
+ <xsl:when test="glossentry">
+ <xsl:apply-templates select="(glossentry[1]/preceding-sibling::*)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates/>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:choose>
+ <xsl:when test="glossdiv">
+ <xsl:apply-templates select="glossdiv"/>
+ </xsl:when>
+ <xsl:when test="glossentry">
+ <dl>
+ <xsl:choose>
+ <xsl:when test="$glossary.sort != 0">
+ <xsl:apply-templates select="glossentry">
+ <xsl:sort lang="{$language}" select="normalize-space(translate(concat(@sortas, glossterm[not(parent::glossentry/@sortas) or parent::glossentry/@sortas = '']), &lowercase;, &uppercase;))"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="glossentry"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </dl>
+ </xsl:when>
+ <xsl:otherwise>
+ <!-- empty glossary -->
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:if test="not(parent::article)">
+ <xsl:call-template name="process.footnotes"/>
+ </xsl:if>
+ </div>
+</xsl:template>
+
+<xsl:template match="glossary/glossaryinfo"></xsl:template>
+<xsl:template match="glossary/info"></xsl:template>
+<xsl:template match="glossary/title"></xsl:template>
+<xsl:template match="glossary/subtitle"></xsl:template>
+<xsl:template match="glossary/titleabbrev"></xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="glosslist">
+ &setup-language-variable;
+ <div>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:call-template name="anchor"/>
+ <xsl:if test="blockinfo/title|info/title|title">
+ <xsl:call-template name="formal.object.heading"/>
+ </xsl:if>
+ <dl>
+ <xsl:choose>
+ <xsl:when test="$glossary.sort != 0">
+ <xsl:apply-templates select="glossentry">
+ <xsl:sort lang="{$language}" select="normalize-space(translate(concat(@sortas, glossterm[not(parent::glossentry/@sortas) or parent::glossentry/@sortas = '']), &lowercase;, &uppercase;))"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="glossentry"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </dl>
+ </div>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="glossdiv">
+ &setup-language-variable;
+ <xsl:call-template name="id.warning"/>
+
+ <div>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates select="(glossentry[1]/preceding-sibling::*)"/>
+
+ <dl>
+ <xsl:choose>
+ <xsl:when test="$glossary.sort != 0">
+ <xsl:apply-templates select="glossentry">
+ <xsl:sort lang="{$language}"
+ select="translate(glossterm, $lowercase,
+ $uppercase)"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="glossentry"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </dl>
+ </div>
+</xsl:template>
+
+<xsl:template match="glossdiv/title">
+ <h3>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates/>
+ </h3>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<!--
+GlossEntry ::=
+ GlossTerm, Acronym?, Abbrev?,
+ (IndexTerm)*,
+ RevHistory?,
+ (GlossSee | GlossDef+)
+-->
+
+<xsl:template match="glossentry">
+ <xsl:choose>
+ <xsl:when test="$glossentry.show.acronym = 'primary'">
+ <dt>
+ <xsl:call-template name="anchor">
+ <xsl:with-param name="conditional">
+ <xsl:choose>
+ <xsl:when test="$glossterm.auto.link != 0">0</xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:with-param>
+ </xsl:call-template>
+
+ <xsl:choose>
+ <xsl:when test="acronym|abbrev">
+ <xsl:apply-templates select="acronym|abbrev"/>
+ <xsl:text> (</xsl:text>
+ <xsl:apply-templates select="glossterm"/>
+ <xsl:text>)</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="glossterm"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </dt>
+ </xsl:when>
+ <xsl:when test="$glossentry.show.acronym = 'yes'">
+ <dt>
+ <xsl:call-template name="anchor">
+ <xsl:with-param name="conditional">
+ <xsl:choose>
+ <xsl:when test="$glossterm.auto.link != 0">0</xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:with-param>
+ </xsl:call-template>
+
+ <xsl:apply-templates select="glossterm"/>
+
+ <xsl:if test="acronym|abbrev">
+ <xsl:text> (</xsl:text>
+ <xsl:apply-templates select="acronym|abbrev"/>
+ <xsl:text>)</xsl:text>
+ </xsl:if>
+ </dt>
+ </xsl:when>
+ <xsl:otherwise>
+ <dt>
+ <xsl:call-template name="anchor">
+ <xsl:with-param name="conditional">
+ <xsl:choose>
+ <xsl:when test="$glossterm.auto.link != 0">0</xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:with-param>
+ </xsl:call-template>
+
+ <xsl:apply-templates select="glossterm"/>
+ </dt>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:apply-templates select="indexterm|revhistory|glosssee|glossdef"/>
+</xsl:template>
+
+<xsl:template match="glossentry/glossterm">
+ <xsl:apply-templates/>
+ <xsl:if test="following-sibling::glossterm">, </xsl:if>
+</xsl:template>
+
+<xsl:template match="glossentry/acronym">
+ <xsl:apply-templates/>
+ <xsl:if test="following-sibling::acronym|following-sibling::abbrev">, </xsl:if>
+</xsl:template>
+
+<xsl:template match="glossentry/abbrev">
+ <xsl:apply-templates/>
+ <xsl:if test="following-sibling::acronym|following-sibling::abbrev">, </xsl:if>
+</xsl:template>
+
+<xsl:template match="glossentry/revhistory">
+</xsl:template>
+
+<xsl:template match="glossentry/glosssee">
+ <xsl:variable name="otherterm" select="@otherterm"/>
+ <xsl:variable name="targets" select="key('id', $otherterm)"/>
+ <xsl:variable name="target" select="$targets[1]"/>
+ <xsl:variable name="xlink" select="@xlink:href"/>
+
+ <dd>
+ <p>
+ <xsl:variable name="template">
+ <xsl:call-template name="gentext.template">
+ <xsl:with-param name="context" select="'glossary'"/>
+ <xsl:with-param name="name" select="'see'"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="title">
+ <xsl:choose>
+ <xsl:when test="$target">
+ <a>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:attribute name="href">
+ <xsl:call-template name="href.target">
+ <xsl:with-param name="object" select="$target"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:apply-templates select="$target" mode="xref-to"/>
+ </a>
+ </xsl:when>
+ <xsl:when test="$xlink">
+ <xsl:call-template name="simple.xlink">
+ <xsl:with-param name="content">
+ <xsl:apply-templates/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="$otherterm != '' and not($target)">
+ <xsl:message>
+ <xsl:text>Warning: glosssee @otherterm reference not found: </xsl:text>
+ <xsl:value-of select="$otherterm"/>
+ </xsl:message>
+ <xsl:apply-templates/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:call-template name="substitute-markup">
+ <xsl:with-param name="template" select="$template"/>
+ <xsl:with-param name="title" select="$title"/>
+ </xsl:call-template>
+ </p>
+ </dd>
+</xsl:template>
+
+<xsl:template match="glossentry/glossdef">
+ <dd>
+ <xsl:apply-templates select="*[local-name(.) != 'glossseealso']"/>
+ <xsl:if test="glossseealso">
+ <p>
+ <xsl:variable name="template">
+ <xsl:call-template name="gentext.template">
+ <xsl:with-param name="context" select="'glossary'"/>
+ <xsl:with-param name="name" select="'seealso'"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:variable name="title">
+ <xsl:apply-templates select="glossseealso"/>
+ </xsl:variable>
+ <xsl:call-template name="substitute-markup">
+ <xsl:with-param name="template" select="$template"/>
+ <xsl:with-param name="title" select="$title"/>
+ </xsl:call-template>
+ </p>
+ </xsl:if>
+ </dd>
+</xsl:template>
+
+<xsl:template match="glossseealso">
+ <xsl:variable name="otherterm" select="@otherterm"/>
+ <xsl:variable name="targets" select="key('id', $otherterm)"/>
+ <xsl:variable name="target" select="$targets[1]"/>
+ <xsl:variable name="xlink" select="@xlink:href"/>
+
+ <xsl:choose>
+ <xsl:when test="$target">
+ <a>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:attribute name="href">
+ <xsl:call-template name="href.target">
+ <xsl:with-param name="object" select="$target"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:apply-templates select="$target" mode="xref-to"/>
+ </a>
+ </xsl:when>
+ <xsl:when test="$xlink">
+ <xsl:call-template name="simple.xlink">
+ <xsl:with-param name="content">
+ <xsl:apply-templates/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="$otherterm != '' and not($target)">
+ <xsl:message>
+ <xsl:text>Warning: glossseealso @otherterm reference not found: </xsl:text>
+ <xsl:value-of select="$otherterm"/>
+ </xsl:message>
+ <xsl:apply-templates/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates/>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:choose>
+ <xsl:when test="position() = last()"/>
+ <xsl:otherwise>
+ <xsl:call-template name="gentext.template">
+ <xsl:with-param name="context" select="'glossary'"/>
+ <xsl:with-param name="name" select="'seealso-separator'"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<!-- Glossary collection -->
+
+<xsl:template match="glossary[@role='auto']" priority="2">
+ &setup-language-variable;
+ <xsl:variable name="terms"
+ select="//glossterm[not(parent::glossdef)]|//firstterm"/>
+ <xsl:variable name="collection" select="document($glossary.collection, .)"/>
+
+ <xsl:call-template name="id.warning"/>
+
+ <xsl:if test="$glossary.collection = ''">
+ <xsl:message>
+ <xsl:text>Warning: processing automatic glossary </xsl:text>
+ <xsl:text>without a glossary.collection file.</xsl:text>
+ </xsl:message>
+ </xsl:if>
+
+ <xsl:if test="not($collection) and $glossary.collection != ''">
+ <xsl:message>
+ <xsl:text>Warning: processing automatic glossary but unable to </xsl:text>
+ <xsl:text>open glossary.collection file '</xsl:text>
+ <xsl:value-of select="$glossary.collection"/>
+ <xsl:text>'</xsl:text>
+ </xsl:message>
+ </xsl:if>
+
+ <div>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:if test="$generate.id.attributes != 0">
+ <xsl:attribute name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:call-template name="glossary.titlepage"/>
+
+ <xsl:choose>
+ <xsl:when test="glossdiv and $collection//glossdiv">
+ <xsl:for-each select="$collection//glossdiv">
+ <!-- first see if there are any in this div -->
+ <xsl:variable name="exist.test">
+ <xsl:for-each select="glossentry">
+ <xsl:variable name="cterm" select="glossterm"/>
+ <xsl:if test="$terms[@baseform = $cterm or . = $cterm]">
+ <xsl:value-of select="glossterm"/>
+ </xsl:if>
+ </xsl:for-each>
+ </xsl:variable>
+
+ <xsl:if test="$exist.test != ''">
+ <xsl:apply-templates select="." mode="auto-glossary">
+ <xsl:with-param name="terms" select="$terms"/>
+ </xsl:apply-templates>
+ </xsl:if>
+ </xsl:for-each>
+ </xsl:when>
+ <xsl:otherwise>
+ <dl>
+ <xsl:choose>
+ <xsl:when test="$glossary.sort != 0">
+ <xsl:for-each select="$collection//glossentry">
+ <xsl:sort lang="{$language}" select="normalize-space(translate(concat(@sortas, glossterm[not(parent::glossentry/@sortas) or parent::glossentry/@sortas = '']), &lowercase;, &uppercase;))"/>
+ <xsl:variable name="cterm" select="glossterm"/>
+ <xsl:if test="$terms[@baseform = $cterm or . = $cterm]">
+ <xsl:apply-templates select="." mode="auto-glossary"/>
+ </xsl:if>
+ </xsl:for-each>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:for-each select="$collection//glossentry">
+ <xsl:variable name="cterm" select="glossterm"/>
+ <xsl:if test="$terms[@baseform = $cterm or . = $cterm]">
+ <xsl:apply-templates select="." mode="auto-glossary"/>
+ </xsl:if>
+ </xsl:for-each>
+ </xsl:otherwise>
+ </xsl:choose>
+ </dl>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:if test="not(parent::article)">
+ <xsl:call-template name="process.footnotes"/>
+ </xsl:if>
+ </div>
+</xsl:template>
+
+<xsl:template match="*" mode="auto-glossary">
+ <!-- pop back out to the default mode for most elements -->
+ <xsl:apply-templates select="."/>
+</xsl:template>
+
+<xsl:template match="glossdiv" mode="auto-glossary">
+ <xsl:param name="terms" select="."/>
+
+ &setup-language-variable;
+
+ <div>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates select="(glossentry[1]/preceding-sibling::*)"/>
+
+ <dl>
+ <xsl:choose>
+ <xsl:when test="$glossary.sort != 0">
+ <xsl:for-each select="glossentry">
+ <xsl:sort lang="{$language}" select="normalize-space(translate(concat(@sortas, glossterm[not(parent::glossentry/@sortas) or parent::glossentry/@sortas = '']), &lowercase;, &uppercase;))"/>!
+ <xsl:variable name="cterm" select="glossterm"/>
+ <xsl:if test="$terms[@baseform = $cterm or . = $cterm]">
+ <xsl:apply-templates select="." mode="auto-glossary"/>
+ </xsl:if>
+ </xsl:for-each>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:for-each select="glossentry">
+ <xsl:variable name="cterm" select="glossterm"/>
+ <xsl:if test="$terms[@baseform = $cterm or . = $cterm]">
+ <xsl:apply-templates select="." mode="auto-glossary"/>
+ </xsl:if>
+ </xsl:for-each>
+ </xsl:otherwise>
+ </xsl:choose>
+ </dl>
+ </div>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/graphics.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/graphics.xsl
new file mode 100644
index 0000000..93ea95f
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/graphics.xsl
@@ -0,0 +1,1515 @@
+<?xml version='1.0'?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:stext="http://nwalsh.com/xslt/ext/com.nwalsh.saxon.TextFactory"
+ xmlns:simg="http://nwalsh.com/xslt/ext/com.nwalsh.saxon.ImageIntrinsics"
+ xmlns:ximg="xalan://com.nwalsh.xalan.ImageIntrinsics"
+ xmlns:xtext="xalan://com.nwalsh.xalan.Text"
+ xmlns:lxslt="http://xml.apache.org/xslt"
+ exclude-result-prefixes="xlink stext xtext lxslt simg ximg"
+ extension-element-prefixes="stext xtext"
+ version='1.0'>
+
+<!-- ********************************************************************
+ $Id: graphics.xsl 8421 2009-05-04 07:49:49Z bobstayton $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ Contributors:
+ Colin Paul Adams, <colin@colina.demon.co.uk>
+
+ ******************************************************************** -->
+
+<lxslt:component prefix="xtext" elements="insertfile"/>
+<lxslt:component prefix="ximg" functions="new getWidth getDepth"/>
+
+<!-- ==================================================================== -->
+<!-- Graphic format tests for the HTML backend -->
+
+<xsl:template name="is.graphic.format">
+ <xsl:param name="format"></xsl:param>
+ <xsl:if test="$format = 'SVG'
+ or $format = 'PNG'
+ or $format = 'JPG'
+ or $format = 'JPEG'
+ or $format = 'linespecific'
+ or $format = 'GIF'
+ or $format = 'GIF87a'
+ or $format = 'GIF89a'
+ or $format = 'BMP'">1</xsl:if>
+</xsl:template>
+
+<xsl:template name="is.graphic.extension">
+ <xsl:param name="ext"></xsl:param>
+ <xsl:variable name="lcext" select="translate($ext,
+ 'ABCDEFGHIJKLMNOPQRSTUVWXYZ',
+ 'abcdefghijklmnopqrstuvwxyz')"/>
+ <xsl:if test="$lcext = 'svg'
+ or $lcext = 'png'
+ or $lcext = 'jpeg'
+ or $lcext = 'jpg'
+ or $lcext = 'avi'
+ or $lcext = 'mpg'
+ or $lcext = 'mpeg'
+ or $lcext = 'qt'
+ or $lcext = 'gif'
+ or $lcext = 'bmp'">1</xsl:if>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="screenshot">
+ <div>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates/>
+ </div>
+</xsl:template>
+
+<xsl:template match="screeninfo">
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template name="process.image">
+ <!-- When this template is called, the current node should be -->
+ <!-- a graphic, inlinegraphic, imagedata, or videodata. All -->
+ <!-- those elements have the same set of attributes, so we can -->
+ <!-- handle them all in one place. -->
+ <xsl:param name="tag" select="'img'"/>
+ <xsl:param name="alt"/>
+ <xsl:param name="longdesc"/>
+
+ <!-- The HTML img element only supports the notion of content-area
+ scaling; it doesn't support the distinction between a
+ content-area and a viewport-area, so we have to make some
+ compromises.
+
+ 1. If only the content-area is specified, everything is fine.
+ (If you ask for a three inch image, that's what you'll get.)
+
+ 2. If only the viewport-area is provided:
+ - If scalefit=1, treat it as both the content-area and
+ the viewport-area. (If you ask for an image in a five inch
+ area, we'll make the image five inches to fill that area.)
+ - If scalefit=0, ignore the viewport-area specification.
+
+ Note: this is not quite the right semantic and has the additional
+ problem that it can result in anamorphic scaling, which scalefit
+ should never cause.
+
+ 3. If both the content-area and the viewport-area is specified
+ on a graphic element, ignore the viewport-area.
+ (If you ask for a three inch image in a five inch area, we'll assume
+ it's better to give you a three inch image in an unspecified area
+ than a five inch image in a five inch area.
+
+ Relative units also cause problems. As a general rule, the stylesheets
+ are operating too early and too loosely coupled with the rendering engine
+ to know things like the current font size or the actual dimensions of
+ an image. Therefore:
+
+ 1. We use a fixed size for pixels, $pixels.per.inch
+
+ 2. We use a fixed size for "em"s, $points.per.em
+
+ Percentages are problematic. In the following discussion, we speak
+ of width and contentwidth, but the same issues apply to depth and
+ contentdepth
+
+ 1. A width of 50% means "half of the available space for the image."
+ That's fine. But note that in HTML, this is a dynamic property and
+ the image size will vary if the browser window is resized.
+
+ 2. A contentwidth of 50% means "half of the actual image width". But
+ the stylesheets have no way to assess the image's actual size. Treating
+ this as a width of 50% is one possibility, but it produces behavior
+ (dynamic scaling) that seems entirely out of character with the
+ meaning.
+
+ Instead, the stylesheets define a $nominal.image.width
+ and convert percentages to actual values based on that nominal size.
+
+ Scale can be problematic. Scale applies to the contentwidth, so
+ a scale of 50 when a contentwidth is not specified is analagous to a
+ width of 50%. (If a contentwidth is specified, the scaling factor can
+ be applied to that value and no problem exists.)
+
+ If scale is specified but contentwidth is not supplied, the
+ nominal.image.width is used to calculate a base size
+ for scaling.
+
+ Warning: as a consequence of these decisions, unless the aspect ratio
+ of your image happens to be exactly the same as (nominal width / nominal height),
+ specifying contentwidth="50%" and contentdepth="50%" is NOT going to
+ scale the way you expect (or really, the way it should).
+
+ Don't do that. In fact, a percentage value is not recommended for content
+ size at all. Use scale instead.
+
+ Finally, align and valign are troublesome. Horizontal alignment is now
+ supported by wrapping the image in a <div align="{@align}"> (in block
+ contexts!). I can't think of anything (practical) to do about vertical
+ alignment.
+ -->
+
+ <xsl:variable name="width-units">
+ <xsl:choose>
+ <xsl:when test="$ignore.image.scaling != 0"></xsl:when>
+ <xsl:when test="@width">
+ <xsl:call-template name="length-units">
+ <xsl:with-param name="length" select="@width"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="not(@depth) and $default.image.width != ''">
+ <xsl:call-template name="length-units">
+ <xsl:with-param name="length" select="$default.image.width"/>
+ </xsl:call-template>
+ </xsl:when>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="width">
+ <xsl:choose>
+ <xsl:when test="$ignore.image.scaling != 0"></xsl:when>
+ <xsl:when test="@width">
+ <xsl:choose>
+ <xsl:when test="$width-units = '%'">
+ <xsl:value-of select="@width"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="length-spec">
+ <xsl:with-param name="length" select="@width"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:when test="not(@depth) and $default.image.width != ''">
+ <xsl:value-of select="$default.image.width"/>
+ </xsl:when>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="scalefit">
+ <xsl:choose>
+ <xsl:when test="$ignore.image.scaling != 0">0</xsl:when>
+ <xsl:when test="@contentwidth or @contentdepth">0</xsl:when>
+ <xsl:when test="@scale">0</xsl:when>
+ <xsl:when test="@scalefit"><xsl:value-of select="@scalefit"/></xsl:when>
+ <xsl:when test="$width != '' or @depth">1</xsl:when>
+ <xsl:otherwise>0</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="scale">
+ <xsl:choose>
+ <xsl:when test="$ignore.image.scaling != 0">1.0</xsl:when>
+ <xsl:when test="@contentwidth or @contentdepth">1.0</xsl:when>
+ <xsl:when test="@scale">
+ <xsl:value-of select="@scale div 100.0"/>
+ </xsl:when>
+ <xsl:otherwise>1.0</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="filename">
+ <xsl:choose>
+ <xsl:when test="local-name(.) = 'graphic'
+ or local-name(.) = 'inlinegraphic'">
+ <!-- handle legacy graphic and inlinegraphic by new template -->
+ <xsl:call-template name="mediaobject.filename">
+ <xsl:with-param name="object" select="."/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <!-- imagedata, videodata, audiodata -->
+ <xsl:call-template name="mediaobject.filename">
+ <xsl:with-param name="object" select=".."/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="output_filename">
+ <xsl:choose>
+ <xsl:when test="@entityref">
+ <xsl:value-of select="$filename"/>
+ </xsl:when>
+ <!--
+ Moved test for $keep.relative.image.uris to template below:
+ <xsl:template match="@fileref">
+ -->
+ <xsl:otherwise>
+ <xsl:value-of select="$filename"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="img.src.path.pi">
+ <xsl:call-template name="pi.dbhtml_img.src.path">
+ <xsl:with-param name="node" select=".."/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="filename.for.graphicsize">
+ <xsl:choose>
+ <xsl:when test="$img.src.path.pi != ''">
+ <xsl:value-of select="concat($img.src.path.pi, $filename)"/>
+ </xsl:when>
+ <xsl:when test="$img.src.path != '' and
+ $graphicsize.use.img.src.path != 0 and
+ $tag = 'img' and
+ not(starts-with($filename, '/')) and
+ not(contains($filename, '://'))">
+ <xsl:value-of select="concat($img.src.path, $filename)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$filename"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="realintrinsicwidth">
+ <!-- This funny compound test works around a bug in XSLTC -->
+ <xsl:choose>
+ <xsl:when test="$use.extensions != 0 and $graphicsize.extension != 0">
+ <xsl:choose>
+ <xsl:when test="function-available('simg:getWidth')">
+ <xsl:value-of select="simg:getWidth(simg:new($filename.for.graphicsize),
+ $nominal.image.width)"/>
+ </xsl:when>
+ <xsl:when test="function-available('ximg:getWidth')">
+ <xsl:value-of select="ximg:getWidth(ximg:new($filename.for.graphicsize),
+ $nominal.image.width)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="0"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="0"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="intrinsicwidth">
+ <xsl:choose>
+ <xsl:when test="$realintrinsicwidth = 0">
+ <xsl:value-of select="$nominal.image.width"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$realintrinsicwidth"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="intrinsicdepth">
+ <!-- This funny compound test works around a bug in XSLTC -->
+ <xsl:choose>
+ <xsl:when test="$use.extensions != 0 and $graphicsize.extension != 0">
+ <xsl:choose>
+ <xsl:when test="function-available('simg:getDepth')">
+ <xsl:value-of select="simg:getDepth(simg:new($filename.for.graphicsize),
+ $nominal.image.depth)"/>
+ </xsl:when>
+ <xsl:when test="function-available('ximg:getDepth')">
+ <xsl:value-of select="ximg:getDepth(ximg:new($filename.for.graphicsize),
+ $nominal.image.depth)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$nominal.image.depth"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$nominal.image.depth"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="contentwidth">
+ <xsl:choose>
+ <xsl:when test="$ignore.image.scaling != 0"></xsl:when>
+ <xsl:when test="@contentwidth">
+ <xsl:variable name="units">
+ <xsl:call-template name="length-units">
+ <xsl:with-param name="length" select="@contentwidth"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="$units = '%'">
+ <xsl:variable name="cmagnitude">
+ <xsl:call-template name="length-magnitude">
+ <xsl:with-param name="length" select="@contentwidth"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:value-of select="$intrinsicwidth * $cmagnitude div 100.0"/>
+ <xsl:text>px</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="length-spec">
+ <xsl:with-param name="length" select="@contentwidth"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$intrinsicwidth"/>
+ <xsl:text>px</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="scaled.contentwidth">
+ <xsl:if test="$contentwidth != ''">
+ <xsl:variable name="cwidth.in.points">
+ <xsl:call-template name="length-in-points">
+ <xsl:with-param name="length" select="$contentwidth"/>
+ <xsl:with-param name="pixels.per.inch" select="$pixels.per.inch"/>
+ <xsl:with-param name="em.size" select="$points.per.em"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:value-of select="$cwidth.in.points div 72.0 * $pixels.per.inch * $scale"/>
+ </xsl:if>
+ </xsl:variable>
+
+ <xsl:variable name="html.width">
+ <xsl:choose>
+ <xsl:when test="$ignore.image.scaling != 0"></xsl:when>
+ <xsl:when test="$width-units = '%'">
+ <xsl:value-of select="$width"/>
+ </xsl:when>
+ <xsl:when test="$width != ''">
+ <xsl:variable name="width.in.points">
+ <xsl:call-template name="length-in-points">
+ <xsl:with-param name="length" select="$width"/>
+ <xsl:with-param name="pixels.per.inch" select="$pixels.per.inch"/>
+ <xsl:with-param name="em.size" select="$points.per.em"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:value-of select="round($width.in.points div 72.0 * $pixels.per.inch)"/>
+ </xsl:when>
+ <xsl:otherwise></xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="contentdepth">
+ <xsl:choose>
+ <xsl:when test="$ignore.image.scaling != 0"></xsl:when>
+ <xsl:when test="@contentdepth">
+ <xsl:variable name="units">
+ <xsl:call-template name="length-units">
+ <xsl:with-param name="length" select="@contentdepth"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="$units = '%'">
+ <xsl:variable name="cmagnitude">
+ <xsl:call-template name="length-magnitude">
+ <xsl:with-param name="length" select="@contentdepth"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:value-of select="$intrinsicdepth * $cmagnitude div 100.0"/>
+ <xsl:text>px</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="length-spec">
+ <xsl:with-param name="length" select="@contentdepth"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$intrinsicdepth"/>
+ <xsl:text>px</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="scaled.contentdepth">
+ <xsl:if test="$contentdepth != ''">
+ <xsl:variable name="cdepth.in.points">
+ <xsl:call-template name="length-in-points">
+ <xsl:with-param name="length" select="$contentdepth"/>
+ <xsl:with-param name="pixels.per.inch" select="$pixels.per.inch"/>
+ <xsl:with-param name="em.size" select="$points.per.em"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:value-of select="$cdepth.in.points div 72.0 * $pixels.per.inch * $scale"/>
+ </xsl:if>
+ </xsl:variable>
+
+ <xsl:variable name="depth-units">
+ <xsl:if test="@depth">
+ <xsl:call-template name="length-units">
+ <xsl:with-param name="length" select="@depth"/>
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:variable>
+
+ <xsl:variable name="depth">
+ <xsl:if test="@depth">
+ <xsl:choose>
+ <xsl:when test="$depth-units = '%'">
+ <xsl:value-of select="@depth"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="length-spec">
+ <xsl:with-param name="length" select="@depth"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:if>
+ </xsl:variable>
+
+ <xsl:variable name="html.depth">
+ <xsl:choose>
+ <xsl:when test="$ignore.image.scaling != 0"></xsl:when>
+ <xsl:when test="$depth-units = '%'">
+ <xsl:value-of select="$depth"/>
+ </xsl:when>
+ <xsl:when test="@depth and @depth != ''">
+ <xsl:variable name="depth.in.points">
+ <xsl:call-template name="length-in-points">
+ <xsl:with-param name="length" select="$depth"/>
+ <xsl:with-param name="pixels.per.inch" select="$pixels.per.inch"/>
+ <xsl:with-param name="em.size" select="$points.per.em"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:value-of select="round($depth.in.points div 72.0 * $pixels.per.inch)"/>
+ </xsl:when>
+ <xsl:otherwise></xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="viewport">
+ <xsl:choose>
+ <xsl:when test="$ignore.image.scaling != 0">0</xsl:when>
+ <xsl:when test="local-name(.) = 'inlinegraphic'
+ or ancestor::inlinemediaobject
+ or ancestor::inlineequation">0</xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$make.graphic.viewport"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+<!--
+ <xsl:message>=====================================
+scale: <xsl:value-of select="$scale"/>, <xsl:value-of select="$scalefit"/>
+@contentwidth <xsl:value-of select="@contentwidth"/>
+$contentwidth <xsl:value-of select="$contentwidth"/>
+scaled.contentwidth: <xsl:value-of select="$scaled.contentwidth"/>
+@width: <xsl:value-of select="@width"/>
+width: <xsl:value-of select="$width"/>
+html.width: <xsl:value-of select="$html.width"/>
+@contentdepth <xsl:value-of select="@contentdepth"/>
+$contentdepth <xsl:value-of select="$contentdepth"/>
+scaled.contentdepth: <xsl:value-of select="$scaled.contentdepth"/>
+@depth: <xsl:value-of select="@depth"/>
+depth: <xsl:value-of select="$depth"/>
+html.depth: <xsl:value-of select="$html.depth"/>
+align: <xsl:value-of select="@align"/>
+valign: <xsl:value-of select="@valign"/></xsl:message>
+-->
+
+ <xsl:variable name="scaled"
+ select="@width|@depth|@contentwidth|@contentdepth
+ |@scale|@scalefit"/>
+
+ <xsl:variable name="img">
+ <xsl:choose>
+ <xsl:when test="@format = 'SVG'">
+ <object type="image/svg+xml">
+ <xsl:attribute name="data">
+ <xsl:choose>
+ <xsl:when test="$img.src.path != '' and
+ $tag = 'img' and
+ not(starts-with($output_filename, '/')) and
+ not(contains($output_filename, '://'))">
+ <xsl:value-of select="$img.src.path"/>
+ </xsl:when>
+ </xsl:choose>
+ <xsl:value-of select="$output_filename"/>
+ </xsl:attribute>
+ <xsl:call-template name="process.image.attributes">
+ <!--xsl:with-param name="alt" select="$alt"/ there's no alt here-->
+ <xsl:with-param name="html.depth" select="$html.depth"/>
+ <xsl:with-param name="html.width" select="$html.width"/>
+ <xsl:with-param name="longdesc" select="$longdesc"/>
+ <xsl:with-param name="scale" select="$scale"/>
+ <xsl:with-param name="scalefit" select="$scalefit"/>
+ <xsl:with-param name="scaled.contentdepth" select="$scaled.contentdepth"/>
+ <xsl:with-param name="scaled.contentwidth" select="$scaled.contentwidth"/>
+ <xsl:with-param name="viewport" select="$viewport"/>
+ </xsl:call-template>
+ <xsl:if test="@align">
+ <xsl:attribute name="align">
+ <xsl:choose>
+ <xsl:when test="@align = 'center'">middle</xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="@align"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:if test="$use.embed.for.svg != 0">
+ <embed type="image/svg+xml">
+ <xsl:attribute name="src">
+ <xsl:choose>
+ <xsl:when test="$img.src.path != '' and
+ $tag = 'img' and
+ not(starts-with($output_filename, '/')) and
+ not(contains($output_filename, '://'))">
+ <xsl:value-of select="$img.src.path"/>
+ </xsl:when>
+ </xsl:choose>
+ <xsl:value-of select="$output_filename"/>
+ </xsl:attribute>
+ <xsl:call-template name="process.image.attributes">
+ <!--xsl:with-param name="alt" select="$alt"/ there's no alt here -->
+ <xsl:with-param name="html.depth" select="$html.depth"/>
+ <xsl:with-param name="html.width" select="$html.width"/>
+ <xsl:with-param name="longdesc" select="$longdesc"/>
+ <xsl:with-param name="scale" select="$scale"/>
+ <xsl:with-param name="scalefit" select="$scalefit"/>
+ <xsl:with-param name="scaled.contentdepth" select="$scaled.contentdepth"/>
+ <xsl:with-param name="scaled.contentwidth" select="$scaled.contentwidth"/>
+ <xsl:with-param name="viewport" select="$viewport"/>
+ </xsl:call-template>
+ </embed>
+ </xsl:if>
+ </object>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:element name="{$tag}">
+ <xsl:if test="$tag = 'img' and ../../self::imageobjectco">
+ <xsl:variable name="mapname">
+ <xsl:call-template name="object.id">
+ <xsl:with-param name="object" select="../../areaspec"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:choose>
+ <xsl:when test="$scaled">
+ <!-- It might be possible to handle some scaling; needs -->
+ <!-- more investigation -->
+ <xsl:message>
+ <xsl:text>Warning: imagemaps not supported </xsl:text>
+ <xsl:text>on scaled images</xsl:text>
+ </xsl:message>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:attribute name="border">0</xsl:attribute>
+ <xsl:attribute name="usemap">
+ <xsl:value-of select="concat('#', $mapname)"/>
+ </xsl:attribute>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:if>
+
+ <xsl:attribute name="src">
+ <xsl:choose>
+ <xsl:when test="$img.src.path != '' and
+ $tag = 'img' and
+ not(starts-with($output_filename, '/')) and
+ not(contains($output_filename, '://'))">
+ <xsl:value-of select="$img.src.path"/>
+ </xsl:when>
+ </xsl:choose>
+ <xsl:value-of select="$output_filename"/>
+ </xsl:attribute>
+
+ <xsl:if test="@align">
+ <xsl:attribute name="align">
+ <xsl:choose>
+ <xsl:when test="@align = 'center'">middle</xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="@align"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:call-template name="process.image.attributes">
+ <xsl:with-param name="alt">
+ <xsl:choose>
+ <xsl:when test="$alt != ''">
+ <xsl:copy-of select="$alt"/>
+ </xsl:when>
+ <xsl:when test="ancestor::figure">
+ <xsl:value-of select="normalize-space(ancestor::figure/title)"/>
+ </xsl:when>
+ </xsl:choose>
+ </xsl:with-param>
+ <xsl:with-param name="html.depth" select="$html.depth"/>
+ <xsl:with-param name="html.width" select="$html.width"/>
+ <xsl:with-param name="longdesc" select="$longdesc"/>
+ <xsl:with-param name="scale" select="$scale"/>
+ <xsl:with-param name="scalefit" select="$scalefit"/>
+ <xsl:with-param name="scaled.contentdepth" select="$scaled.contentdepth"/>
+ <xsl:with-param name="scaled.contentwidth" select="$scaled.contentwidth"/>
+ <xsl:with-param name="viewport" select="$viewport"/>
+ </xsl:call-template>
+ </xsl:element>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="bgcolor">
+ <xsl:call-template name="pi.dbhtml_background-color">
+ <xsl:with-param name="node" select=".."/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="use.viewport"
+ select="$viewport != 0
+ and ($html.width != ''
+ or ($html.depth != '' and $depth-units != '%')
+ or $bgcolor != ''
+ or @valign)"/>
+
+ <xsl:choose>
+ <xsl:when test="$use.viewport">
+ <table border="0" summary="manufactured viewport for HTML img"
+ cellspacing="0" cellpadding="0">
+ <xsl:if test="$html.width != ''">
+ <xsl:attribute name="width">
+ <xsl:value-of select="$html.width"/>
+ </xsl:attribute>
+ </xsl:if>
+ <tr>
+ <xsl:if test="$html.depth != '' and $depth-units != '%'">
+ <!-- don't do this for percentages because browsers get confused -->
+ <xsl:choose>
+ <xsl:when test="$css.decoration != 0">
+ <xsl:attribute name="style">
+ <xsl:text>height: </xsl:text>
+ <xsl:value-of select="$html.depth"/>
+ <xsl:text>px</xsl:text>
+ </xsl:attribute>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:attribute name="height">
+ <xsl:value-of select="$html.depth"/>
+ </xsl:attribute>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:if>
+ <td>
+ <xsl:if test="$bgcolor != ''">
+ <xsl:choose>
+ <xsl:when test="$css.decoration != 0">
+ <xsl:attribute name="style">
+ <xsl:text>background-color: </xsl:text>
+ <xsl:value-of select="$bgcolor"/>
+ </xsl:attribute>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:attribute name="bgcolor">
+ <xsl:value-of select="$bgcolor"/>
+ </xsl:attribute>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:if>
+ <xsl:if test="@align">
+ <xsl:attribute name="align">
+ <xsl:value-of select="@align"/>
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:if test="@valign">
+ <xsl:attribute name="valign">
+ <xsl:value-of select="@valign"/>
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:copy-of select="$img"/>
+ </td>
+ </tr>
+ </table>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:copy-of select="$img"/>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:if test="$tag = 'img' and ../../self::imageobjectco and not($scaled)">
+ <xsl:variable name="mapname">
+ <xsl:call-template name="object.id">
+ <xsl:with-param name="object" select="../../areaspec"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <map name="{$mapname}">
+ <xsl:for-each select="../../areaspec//area">
+ <xsl:variable name="units">
+ <xsl:choose>
+ <xsl:when test="@units = 'other' and @otherunits">
+ <xsl:value-of select="@otherunits"/>
+ </xsl:when>
+ <xsl:when test="@units">
+ <xsl:value-of select="@units"/>
+ </xsl:when>
+ <!-- areaspec|areaset/area -->
+ <xsl:when test="../@units = 'other' and ../@otherunits">
+ <xsl:value-of select="../@otherunits"/>
+ </xsl:when>
+ <xsl:when test="../@units">
+ <xsl:value-of select="../@units"/>
+ </xsl:when>
+ <!-- areaspec/areaset/area -->
+ <xsl:when test="../../@units = 'other' and ../../@otherunits">
+ <xsl:value-of select="../@otherunits"/>
+ </xsl:when>
+ <xsl:when test="../../@units">
+ <xsl:value-of select="../../@units"/>
+ </xsl:when>
+ <xsl:otherwise>calspair</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="$units = 'calspair' or
+ $units = 'imagemap'">
+ <xsl:variable name="coords" select="normalize-space(@coords)"/>
+
+ <area shape="rect">
+ <xsl:variable name="linkends">
+ <xsl:choose>
+ <xsl:when test="@linkends">
+ <xsl:value-of select="normalize-space(@linkends)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="normalize-space(../@linkends)"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="href">
+ <xsl:choose>
+ <xsl:when test="@xlink:href">
+ <xsl:value-of select="@xlink:href"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="../@xlink:href"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="$linkends != ''">
+ <xsl:variable name="linkend">
+ <xsl:choose>
+ <xsl:when test="contains($linkends, ' ')">
+ <xsl:value-of select="substring-before($linkends, ' ')"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$linkends"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="target" select="key('id', $linkend)[1]"/>
+
+ <xsl:if test="$target">
+ <xsl:attribute name="href">
+ <xsl:call-template name="href.target">
+ <xsl:with-param name="object" select="$target"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ </xsl:if>
+ </xsl:when>
+ <xsl:when test="$href != ''">
+ <xsl:attribute name="href">
+ <xsl:value-of select="$href"/>
+ </xsl:attribute>
+ </xsl:when>
+ </xsl:choose>
+
+ <xsl:if test="alt">
+ <xsl:attribute name="alt">
+ <xsl:value-of select="alt[1]"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:attribute name="coords">
+ <xsl:choose>
+ <xsl:when test="$units = 'calspair'">
+
+ <xsl:variable name="p1"
+ select="substring-before($coords, ' ')"/>
+ <xsl:variable name="p2"
+ select="substring-after($coords, ' ')"/>
+
+ <xsl:variable name="x1" select="substring-before($p1,',')"/>
+ <xsl:variable name="y1" select="substring-after($p1,',')"/>
+ <xsl:variable name="x2" select="substring-before($p2,',')"/>
+ <xsl:variable name="y2" select="substring-after($p2,',')"/>
+
+ <xsl:variable name="x1p" select="$x1 div 100.0"/>
+ <xsl:variable name="y1p" select="$y1 div 100.0"/>
+ <xsl:variable name="x2p" select="$x2 div 100.0"/>
+ <xsl:variable name="y2p" select="$y2 div 100.0"/>
+
+ <!--
+ <xsl:message>
+ <xsl:text>units: </xsl:text>
+ <xsl:value-of select="$units"/>
+ <xsl:text> </xsl:text>
+ <xsl:value-of select="$x1p"/><xsl:text>, </xsl:text>
+ <xsl:value-of select="$y1p"/><xsl:text>, </xsl:text>
+ <xsl:value-of select="$x2p"/><xsl:text>, </xsl:text>
+ <xsl:value-of select="$y2p"/><xsl:text>, </xsl:text>
+ </xsl:message>
+
+ <xsl:message>
+ <xsl:text> </xsl:text>
+ <xsl:value-of select="$intrinsicwidth"/>
+ <xsl:text>, </xsl:text>
+ <xsl:value-of select="$intrinsicdepth"/>
+ </xsl:message>
+
+ <xsl:message>
+ <xsl:text> </xsl:text>
+ <xsl:value-of select="$units"/>
+ <xsl:text> </xsl:text>
+ <xsl:value-of
+ select="round($x1p * $intrinsicwidth div 100.0)"/>
+ <xsl:text>,</xsl:text>
+ <xsl:value-of select="round($intrinsicdepth
+ - ($y2p * $intrinsicdepth div 100.0))"/>
+ <xsl:text>,</xsl:text>
+ <xsl:value-of select="round($x2p *
+ $intrinsicwidth div 100.0)"/>
+ <xsl:text>,</xsl:text>
+ <xsl:value-of select="round($intrinsicdepth
+ - ($y1p * $intrinsicdepth div 100.0))"/>
+ </xsl:message>
+ -->
+ <xsl:value-of
+ select="round($x1p * $intrinsicwidth div 100.0)"/>
+ <xsl:text>,</xsl:text>
+ <xsl:value-of select="round($intrinsicdepth
+ - ($y2p * $intrinsicdepth div 100.0))"/>
+ <xsl:text>,</xsl:text>
+ <xsl:value-of
+ select="round($x2p * $intrinsicwidth div 100.0)"/>
+ <xsl:text>,</xsl:text>
+ <xsl:value-of select="round($intrinsicdepth
+ - ($y1p * $intrinsicdepth div 100.0))"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:copy-of select="$coords"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:attribute>
+ </area>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:message>
+ <xsl:text>Warning: only calspair or </xsl:text>
+ <xsl:text>otherunits='imagemap' supported </xsl:text>
+ <xsl:text>in imageobjectco</xsl:text>
+ </xsl:message>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:for-each>
+ </map>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template name="process.image.attributes">
+ <xsl:param name="alt"/>
+ <xsl:param name="html.width"/>
+ <xsl:param name="html.depth"/>
+ <xsl:param name="longdesc"/>
+ <xsl:param name="scale"/>
+ <xsl:param name="scalefit"/>
+ <xsl:param name="scaled.contentdepth"/>
+ <xsl:param name="scaled.contentwidth"/>
+ <xsl:param name="viewport"/>
+
+ <xsl:choose>
+ <xsl:when test="@contentwidth or @contentdepth">
+ <!-- ignore @width/@depth, @scale, and @scalefit if specified -->
+ <xsl:if test="@contentwidth and $scaled.contentwidth != ''">
+ <xsl:attribute name="width">
+ <xsl:value-of select="$scaled.contentwidth"/>
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:if test="@contentdepth and $scaled.contentdepth != ''">
+ <xsl:attribute name="height">
+ <xsl:value-of select="$scaled.contentdepth"/>
+ </xsl:attribute>
+ </xsl:if>
+ </xsl:when>
+
+ <xsl:when test="number($scale) != 1.0">
+ <!-- scaling is always uniform, so we only have to specify one dimension -->
+ <!-- ignore @scalefit if specified -->
+ <xsl:attribute name="width">
+ <xsl:value-of select="$scaled.contentwidth"/>
+ </xsl:attribute>
+ </xsl:when>
+
+ <xsl:when test="$scalefit != 0">
+ <xsl:choose>
+ <xsl:when test="contains($html.width, '%')">
+ <xsl:choose>
+ <xsl:when test="$viewport != 0">
+ <!-- The *viewport* will be scaled, so use 100% here! -->
+ <xsl:attribute name="width">
+ <xsl:value-of select="'100%'"/>
+ </xsl:attribute>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:attribute name="width">
+ <xsl:value-of select="$html.width"/>
+ </xsl:attribute>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+
+ <xsl:when test="contains($html.depth, '%')">
+ <!-- HTML doesn't deal with this case very well...do nothing -->
+ </xsl:when>
+
+ <xsl:when test="$scaled.contentwidth != '' and $html.width != ''
+ and $scaled.contentdepth != '' and $html.depth != ''">
+ <!-- scalefit should not be anamorphic; figure out which direction -->
+ <!-- has the limiting scale factor and scale in that direction -->
+ <xsl:choose>
+ <xsl:when test="$html.width div $scaled.contentwidth &gt;
+ $html.depth div $scaled.contentdepth">
+ <xsl:attribute name="height">
+ <xsl:value-of select="$html.depth"/>
+ </xsl:attribute>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:attribute name="width">
+ <xsl:value-of select="$html.width"/>
+ </xsl:attribute>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+
+ <xsl:when test="$scaled.contentwidth != '' and $html.width != ''">
+ <xsl:attribute name="width">
+ <xsl:value-of select="$html.width"/>
+ </xsl:attribute>
+ </xsl:when>
+
+ <xsl:when test="$scaled.contentdepth != '' and $html.depth != ''">
+ <xsl:attribute name="height">
+ <xsl:value-of select="$html.depth"/>
+ </xsl:attribute>
+ </xsl:when>
+ </xsl:choose>
+ </xsl:when>
+ </xsl:choose>
+
+ <xsl:if test="$alt != ''">
+ <xsl:attribute name="alt">
+ <xsl:value-of select="normalize-space($alt)"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:if test="$longdesc != ''">
+ <xsl:attribute name="longdesc">
+ <xsl:value-of select="$longdesc"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:if test="@align and $viewport = 0">
+ <xsl:attribute name="align">
+ <xsl:choose>
+ <xsl:when test="@align = 'center'">middle</xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="@align"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:attribute>
+ </xsl:if>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="graphic">
+ <xsl:choose>
+ <xsl:when test="parent::inlineequation">
+ <xsl:call-template name="anchor"/>
+ <xsl:call-template name="process.image"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <div>
+ <xsl:if test="@align">
+ <xsl:attribute name="align">
+ <xsl:value-of select="@align"/>
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:call-template name="anchor"/>
+ <xsl:call-template name="process.image"/>
+ </div>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="inlinegraphic">
+ <xsl:variable name="filename">
+ <xsl:choose>
+ <xsl:when test="@entityref">
+ <xsl:value-of select="unparsed-entity-uri(@entityref)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="@fileref"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:call-template name="anchor"/>
+
+ <xsl:choose>
+ <xsl:when test="@format='linespecific'">
+ <xsl:choose>
+ <xsl:when test="$use.extensions != '0'
+ and $textinsert.extension != '0'">
+ <xsl:choose>
+ <xsl:when test="element-available('stext:insertfile')">
+ <stext:insertfile href="{$filename}" encoding="{$textdata.default.encoding}"/>
+ </xsl:when>
+ <xsl:when test="element-available('xtext:insertfile')">
+ <xtext:insertfile href="{$filename}"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:message terminate="yes">
+ <xsl:text>No insertfile extension available.</xsl:text>
+ </xsl:message>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:message terminate="yes">
+ <xsl:text>Cannot insert </xsl:text><xsl:value-of select="$filename"/>
+ <xsl:text>. Check use.extensions and textinsert.extension parameters.</xsl:text>
+ </xsl:message>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="process.image"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="mediaobject|mediaobjectco">
+
+ <xsl:variable name="olist" select="imageobject|imageobjectco
+ |videoobject|audioobject
+ |textobject"/>
+
+ <xsl:variable name="object.index">
+ <xsl:call-template name="select.mediaobject.index">
+ <xsl:with-param name="olist" select="$olist"/>
+ <xsl:with-param name="count" select="1"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="object" select="$olist[position() = $object.index]"/>
+
+ <xsl:variable name="align">
+ <xsl:value-of select="$object/descendant::imagedata[@align][1]/@align"/>
+ </xsl:variable>
+
+ <div>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:if test="$align != '' ">
+ <xsl:attribute name="align">
+ <xsl:value-of select="$align"/>
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:call-template name="anchor"/>
+
+ <xsl:apply-templates select="$object"/>
+ <xsl:apply-templates select="caption"/>
+ </div>
+</xsl:template>
+
+<xsl:template match="inlinemediaobject">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:call-template name="anchor"/>
+ <xsl:call-template name="select.mediaobject"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="programlisting/inlinemediaobject
+ |screen/inlinemediaobject" priority="2">
+ <!-- the additional span causes problems in some cases -->
+ <xsl:call-template name="select.mediaobject"/>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="imageobjectco">
+ <xsl:call-template name="anchor"/>
+ <xsl:apply-templates select="imageobject"/>
+ <xsl:apply-templates select="calloutlist"/>
+</xsl:template>
+
+<xsl:template match="imageobject">
+ <xsl:apply-templates select="imagedata"/>
+</xsl:template>
+
+<xsl:template match="imagedata">
+ <xsl:variable name="filename">
+ <xsl:call-template name="mediaobject.filename">
+ <xsl:with-param name="object" select=".."/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:choose>
+ <!-- Handle MathML and SVG markup in imagedata -->
+ <xsl:when test="mml:*" xmlns:mml="http://www.w3.org/1998/Math/MathML">
+ <xsl:apply-templates/>
+ </xsl:when>
+
+ <xsl:when test="svg:*" xmlns:svg="http://www.w3.org/2000/svg">
+ <xsl:apply-templates/>
+ </xsl:when>
+
+ <xsl:when test="@format='linespecific'">
+ <xsl:choose>
+ <xsl:when test="$use.extensions != '0'
+ and $textinsert.extension != '0'">
+ <xsl:choose>
+ <xsl:when test="element-available('stext:insertfile')">
+ <stext:insertfile href="{$filename}" encoding="{$textdata.default.encoding}"/>
+ </xsl:when>
+ <xsl:when test="element-available('xtext:insertfile')">
+ <xtext:insertfile href="{$filename}"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:message terminate="yes">
+ <xsl:text>No insertfile extension available.</xsl:text>
+ </xsl:message>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <a xlink:type="simple" xlink:show="embed" xlink:actuate="onLoad"
+ href="{$filename}"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:variable name="longdesc.uri">
+ <xsl:call-template name="longdesc.uri">
+ <xsl:with-param name="mediaobject"
+ select="ancestor::imageobject/parent::*"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="phrases"
+ select="ancestor::mediaobject/textobject[phrase]
+ |ancestor::inlinemediaobject/textobject[phrase]
+ |ancestor::mediaobjectco/textobject[phrase]"/>
+
+ <xsl:call-template name="process.image">
+ <xsl:with-param name="alt">
+ <xsl:apply-templates select="$phrases[not(@role) or @role!='tex'][1]"/>
+ </xsl:with-param>
+ <xsl:with-param name="longdesc">
+ <xsl:call-template name="write.longdesc">
+ <xsl:with-param name="mediaobject"
+ select="ancestor::imageobject/parent::*"/>
+ </xsl:call-template>
+ </xsl:with-param>
+ </xsl:call-template>
+
+ <xsl:if test="$html.longdesc != 0 and $html.longdesc.link != 0
+ and ancestor::imageobject/parent::*/textobject[not(phrase)]">
+ <xsl:call-template name="longdesc.link">
+ <xsl:with-param name="longdesc.uri" select="$longdesc.uri"/>
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template name="longdesc.uri">
+ <xsl:param name="mediaobject" select="."/>
+ <xsl:if test="$html.longdesc">
+ <xsl:if test="$mediaobject/textobject[not(phrase)]">
+ <xsl:variable name="dbhtml.dir">
+ <xsl:call-template name="dbhtml-dir"/>
+ </xsl:variable>
+ <xsl:variable name="filename">
+ <xsl:call-template name="make-relative-filename">
+ <xsl:with-param name="base.dir">
+ <xsl:choose>
+ <xsl:when test="$dbhtml.dir != ''">
+ <xsl:value-of select="$dbhtml.dir"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$base.dir"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:with-param>
+ <xsl:with-param name="base.name">
+ <xsl:choose>
+ <xsl:when test="
+ $mediaobject/@*[local-name() = 'id']
+ and not($use.id.as.filename = 0)">
+ <!-- * if this mediaobject has an ID, then we use the -->
+ <!-- * value of that ID as basename for the "longdesc" -->
+ <!-- * file (that is, without prepending an "ld-" too it) -->
+ <xsl:value-of select="$mediaobject/@*[local-name() = 'id']"/>
+ <xsl:value-of select="$html.ext"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <!-- * otherwise, if this mediaobject does not have an -->
+ <!-- * ID, then we generate an ID... -->
+ <xsl:variable name="image-id">
+ <xsl:call-template name="object.id">
+ <xsl:with-param name="object" select="$mediaobject"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <!-- * ...and then we take that generated ID, prepend an -->
+ <!-- * "ld-" to it, and use that as the basename for the file -->
+ <xsl:value-of select="concat('ld-',$image-id,$html.ext)"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:value-of select="$filename"/>
+ </xsl:if>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template name="write.longdesc">
+ <xsl:param name="mediaobject" select="."/>
+ <xsl:if test="$html.longdesc != 0 and $mediaobject/textobject[not(phrase)]">
+ <xsl:variable name="filename">
+ <xsl:call-template name="longdesc.uri">
+ <xsl:with-param name="mediaobject" select="$mediaobject"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:value-of select="$filename"/>
+
+ <xsl:call-template name="write.chunk">
+ <xsl:with-param name="filename" select="$filename"/>
+ <xsl:with-param name="quiet" select="$chunk.quietly"/>
+ <xsl:with-param name="content">
+ <xsl:call-template name="user.preroot"/>
+ <html>
+ <head>
+ <xsl:call-template name="system.head.content"/>
+ <xsl:call-template name="head.content">
+ <xsl:with-param name="title" select="'Long Description'"/>
+ </xsl:call-template>
+ <xsl:call-template name="user.head.content"/>
+ </head>
+ <body>
+ <xsl:call-template name="body.attributes"/>
+ <xsl:for-each select="$mediaobject/textobject[not(phrase)]">
+ <xsl:apply-templates select="./*"/>
+ </xsl:for-each>
+ </body>
+ </html>
+ <xsl:value-of select="$chunk.append"/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template name="longdesc.link">
+ <xsl:param name="longdesc.uri" select="''"/>
+
+ <xsl:variable name="this.uri">
+ <xsl:call-template name="make-relative-filename">
+ <xsl:with-param name="base.dir" select="$base.dir"/>
+ <xsl:with-param name="base.name">
+ <xsl:call-template name="href.target.uri"/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="href.to">
+ <xsl:call-template name="trim.common.uri.paths">
+ <xsl:with-param name="uriA" select="$longdesc.uri"/>
+ <xsl:with-param name="uriB" select="$this.uri"/>
+ <xsl:with-param name="return" select="'A'"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <div class="longdesc-link" align="{$direction.align.end}">
+ <br clear="all"/>
+ <span class="longdesc-link">
+ <xsl:text>[</xsl:text>
+ <a href="{$href.to}" target="longdesc">D</a>
+ <xsl:text>]</xsl:text>
+ </span>
+ </div>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="videoobject">
+ <xsl:apply-templates select="videodata"/>
+</xsl:template>
+
+<xsl:template match="videodata">
+ <xsl:call-template name="process.image">
+ <xsl:with-param name="tag" select="'embed'"/>
+ <xsl:with-param name="alt">
+ <xsl:apply-templates select="(../../textobject/phrase)[1]"/>
+ </xsl:with-param>
+ </xsl:call-template>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="audioobject">
+ <xsl:apply-templates select="audiodata"/>
+</xsl:template>
+
+<xsl:template match="audiodata">
+ <xsl:call-template name="process.image">
+ <xsl:with-param name="tag" select="'embed'"/>
+ <xsl:with-param name="alt">
+ <xsl:apply-templates select="(../../textobject/phrase)[1]"/>
+ </xsl:with-param>
+ </xsl:call-template>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="textobject">
+ <xsl:apply-templates/>
+</xsl:template>
+
+<xsl:template match="textdata">
+ <xsl:variable name="filename">
+ <xsl:choose>
+ <xsl:when test="@entityref">
+ <xsl:value-of select="unparsed-entity-uri(@entityref)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="@fileref"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="encoding">
+ <xsl:choose>
+ <xsl:when test="@encoding">
+ <xsl:value-of select="@encoding"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$textdata.default.encoding"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="$use.extensions != '0'
+ and $textinsert.extension != '0'">
+ <xsl:choose>
+ <xsl:when test="element-available('stext:insertfile')">
+ <stext:insertfile href="{$filename}" encoding="{$encoding}"/>
+ </xsl:when>
+ <xsl:when test="element-available('xtext:insertfile')">
+ <xtext:insertfile href="{$filename}"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:message terminate="yes">
+ <xsl:text>No insertfile extension available.</xsl:text>
+ </xsl:message>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:message terminate="yes">
+ <xsl:text>Cannot insert </xsl:text><xsl:value-of select="$filename"/>
+ <xsl:text>. Check use.extensions and textinsert.extension parameters.</xsl:text>
+ </xsl:message>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="caption">
+ <div>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:if test="@align = 'right' or @align = 'left' or @align='center'">
+ <xsl:attribute name="align"><xsl:value-of
+ select="@align"/></xsl:attribute>
+ </xsl:if>
+ <xsl:apply-templates/>
+ </div>
+</xsl:template>
+
+<!-- ==================================================================== -->
+<!-- "Support" for SVG -->
+
+<xsl:template match="svg:*" xmlns:svg="http://www.w3.org/2000/svg">
+ <xsl:copy>
+ <xsl:copy-of select="@*"/>
+ <xsl:apply-templates/>
+ </xsl:copy>
+</xsl:template>
+
+
+<!-- The following works sometimes, but needs to take into account
+ 1. When there is no /*/@xml:base
+ 2. When the chunks are going somewhere else
+<xsl:variable name="relpath">
+ <xsl:call-template name="relative-uri">
+ <xsl:with-param name="filename" select="@fileref"/>
+ </xsl:call-template>
+</xsl:variable>
+
+<xsl:choose>
+ <xsl:when test="/*/@xml:base
+ and starts-with($relpath,/*/@xml:base)">
+ <xsl:value-of select="substring-after($relpath,/*/@xml:base)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="@fileref"/>
+ </xsl:otherwise>
+</xsl:choose>
+<xsl:value-of select="@fileref"/>
+ </xsl:when>
+-->
+<!-- Resolve xml:base attributes -->
+<xsl:template match="@fileref">
+ <!-- need a check for absolute urls -->
+ <xsl:choose>
+ <xsl:when test="contains(., ':')">
+ <!-- it has a uri scheme so it is an absolute uri -->
+ <xsl:value-of select="."/>
+ </xsl:when>
+ <xsl:when test="$keep.relative.image.uris != 0">
+ <!-- leave it alone -->
+ <xsl:value-of select="."/>
+ </xsl:when>
+ <xsl:otherwise>
+ <!-- its a relative uri that needs xml:base processing -->
+ <xsl:call-template name="relative-uri">
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/highlight.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/highlight.xsl
new file mode 100644
index 0000000..f7307a4
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/highlight.xsl
@@ -0,0 +1,86 @@
+<?xml version="1.0"?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xslthl="http://xslthl.sf.net" exclude-result-prefixes="xslthl" version="1.0">
+ <!-- ********************************************************************
+ $Id: highlight.xsl 8911 2010-09-28 17:02:06Z abdelazer $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ and other information.
+
+ ******************************************************************** -->
+ <xsl:import href="../highlighting/common.xsl"/>
+ <xsl:template match="xslthl:keyword" mode="xslthl">
+ <strong class="hl-keyword">
+ <xsl:apply-templates mode="xslthl"/>
+ </strong>
+ </xsl:template>
+ <xsl:template match="xslthl:string" mode="xslthl">
+ <strong class="hl-string">
+ <em style="color:red">
+ <xsl:apply-templates mode="xslthl"/>
+ </em>
+ </strong>
+ </xsl:template>
+ <xsl:template match="xslthl:comment" mode="xslthl">
+ <em class="hl-comment" style="color: silver">
+ <xsl:apply-templates mode="xslthl"/>
+ </em>
+ </xsl:template>
+ <xsl:template match="xslthl:directive" mode="xslthl">
+ <span class="hl-directive" style="color: maroon">
+ <xsl:apply-templates mode="xslthl"/>
+ </span>
+ </xsl:template>
+ <xsl:template match="xslthl:tag" mode="xslthl">
+ <strong class="hl-tag" style="color: #000096">
+ <xsl:apply-templates mode="xslthl"/>
+ </strong>
+ </xsl:template>
+ <xsl:template match="xslthl:attribute" mode="xslthl">
+ <span class="hl-attribute" style="color: #F5844C">
+ <xsl:apply-templates mode="xslthl"/>
+ </span>
+ </xsl:template>
+ <xsl:template match="xslthl:value" mode="xslthl">
+ <span class="hl-value" style="color: #993300">
+ <xsl:apply-templates mode="xslthl"/>
+ </span>
+ </xsl:template>
+ <xsl:template match="xslthl:html" mode="xslthl">
+ <strong>
+ <em style="color: red">
+ <xsl:apply-templates mode="xslthl"/>
+ </em>
+ </strong>
+ </xsl:template>
+ <xsl:template match="xslthl:xslt" mode="xslthl">
+ <strong style="color: #0066FF">
+ <xsl:apply-templates mode="xslthl"/>
+ </strong>
+ </xsl:template>
+ <!-- Not emitted since XSLTHL 2.0 -->
+ <xsl:template match="xslthl:section" mode="xslthl">
+ <strong>
+ <xsl:apply-templates mode="xslthl"/>
+ </strong>
+ </xsl:template>
+ <xsl:template match="xslthl:number" mode="xslthl">
+ <span class="hl-number">
+ <xsl:apply-templates mode="xslthl"/>
+ </span>
+ </xsl:template>
+ <xsl:template match="xslthl:annotation" mode="xslthl">
+ <em>
+ <span class="hl-annotation" style="color: gray">
+ <xsl:apply-templates mode="xslthl"/>
+ </span>
+ </em>
+ </xsl:template>
+ <!-- Not sure which element will be in final XSLTHL 2.0 -->
+ <xsl:template match="xslthl:doccomment|xslthl:doctype" mode="xslthl">
+ <strong class="hl-tag" style="color: blue">
+ <xsl:apply-templates mode="xslthl"/>
+ </strong>
+ </xsl:template>
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/html-rtf.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/html-rtf.xsl
new file mode 100644
index 0000000..8de6bb3
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/html-rtf.xsl
@@ -0,0 +1,336 @@
+<?xml version="1.0"?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:exsl="http://exslt.org/common"
+ xmlns:set="http://exslt.org/sets"
+ exclude-result-prefixes="exsl set"
+ version="1.0">
+
+<!-- ********************************************************************
+ $Id: html-rtf.xsl 8345 2009-03-16 06:44:07Z bobstayton $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<!-- ==================================================================== -->
+
+<!-- This module contains templates that match against HTML nodes. It is used
+ to post-process result tree fragments for some sorts of cleanup.
+ These templates can only ever be fired by a processor that supports
+ exslt:node-set(). -->
+
+<!-- ==================================================================== -->
+
+<!-- insert.html.p mode templates insert a particular RTF at the beginning
+ of the first paragraph in the primary RTF. -->
+
+<xsl:template match="/" mode="insert.html.p">
+ <xsl:param name="mark" select="'?'"/>
+ <xsl:apply-templates mode="insert.html.p">
+ <xsl:with-param name="mark" select="$mark"/>
+ </xsl:apply-templates>
+</xsl:template>
+
+<xsl:template match="*" mode="insert.html.p">
+ <xsl:param name="mark" select="'?'"/>
+ <xsl:copy>
+ <xsl:copy-of select="@*"/>
+ <xsl:apply-templates mode="insert.html.p">
+ <xsl:with-param name="mark" select="$mark"/>
+ </xsl:apply-templates>
+ </xsl:copy>
+</xsl:template>
+
+<xsl:template xmlns:html="http://www.w3.org/1999/xhtml"
+ match="html:p|p" mode="insert.html.p">
+ <xsl:param name="mark" select="'?'"/>
+ <xsl:copy>
+ <xsl:copy-of select="@*"/>
+ <xsl:if test="not(preceding::p|preceding::html:p)">
+ <xsl:copy-of select="$mark"/>
+ </xsl:if>
+ <xsl:apply-templates mode="insert.html.p">
+ <xsl:with-param name="mark" select="$mark"/>
+ </xsl:apply-templates>
+ </xsl:copy>
+</xsl:template>
+
+<xsl:template match="text()|processing-instruction()|comment()" mode="insert.html.p">
+ <xsl:param name="mark" select="'?'"/>
+ <xsl:copy/>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<!-- insert.html.text mode templates insert a particular RTF at the beginning
+ of the first text-node in the primary RTF. -->
+
+<xsl:template match="/" mode="insert.html.text">
+ <xsl:param name="mark" select="'?'"/>
+ <xsl:apply-templates mode="insert.html.text">
+ <xsl:with-param name="mark" select="$mark"/>
+ </xsl:apply-templates>
+</xsl:template>
+
+<xsl:template match="*" mode="insert.html.text">
+ <xsl:param name="mark" select="'?'"/>
+ <xsl:copy>
+ <xsl:copy-of select="@*"/>
+ <xsl:apply-templates mode="insert.html.text">
+ <xsl:with-param name="mark" select="$mark"/>
+ </xsl:apply-templates>
+ </xsl:copy>
+</xsl:template>
+
+<xsl:template match="text()|processing-instruction()|comment()" mode="insert.html.text">
+ <xsl:param name="mark" select="'?'"/>
+
+ <xsl:if test="not(preceding::text())">
+ <xsl:copy-of select="$mark"/>
+ </xsl:if>
+
+ <xsl:copy/>
+</xsl:template>
+
+<xsl:template match="processing-instruction()|comment()" mode="insert.html.text">
+ <xsl:param name="mark" select="'?'"/>
+ <xsl:copy/>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<!-- unwrap.p mode templates remove blocks from HTML p elements (and
+ other places where blocks aren't allowed) -->
+
+<xsl:template name="unwrap.p">
+ <xsl:param name="p"/>
+ <xsl:choose>
+ <xsl:when test="$exsl.node.set.available != 0
+ and function-available('set:leading')
+ and function-available('set:trailing')">
+ <xsl:apply-templates select="exsl:node-set($p)" mode="unwrap.p"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:copy-of select="$p"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template xmlns:html="http://www.w3.org/1999/xhtml"
+ match="html:p|p" mode="unwrap.p">
+ <!-- xmlns:html is necessary for the xhtml stylesheet case -->
+ <xsl:variable name="blocks" xmlns:html="http://www.w3.org/1999/xhtml"
+ select="address|blockquote|div|hr|h1|h2|h3|h4|h5|h6
+ |layer|p|pre|table|dl|menu|ol|ul|form
+ |html:address|html:blockquote|html:div|html:hr
+ |html:h1|html:h2|html:h3|html:h4|html:h5|html:h6
+ |html:layer|html:p|html:pre|html:table|html:dl
+ |html:menu|html:ol|html:ul|html:form"/>
+ <xsl:choose>
+ <xsl:when test="$blocks">
+ <xsl:call-template name="unwrap.p.nodes">
+ <xsl:with-param name="wrap" select="."/>
+ <xsl:with-param name="first" select="1"/>
+ <xsl:with-param name="nodes" select="node()"/>
+ <xsl:with-param name="blocks" select="$blocks"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:copy>
+ <xsl:copy-of select="@*"/>
+ <xsl:apply-templates mode="unwrap.p"/>
+ </xsl:copy>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="*" mode="unwrap.p">
+ <xsl:copy>
+ <xsl:copy-of select="@*"/>
+ <xsl:apply-templates mode="unwrap.p"/>
+ </xsl:copy>
+</xsl:template>
+
+<xsl:template match="text()|processing-instruction()|comment()" mode="unwrap.p">
+ <xsl:copy/>
+</xsl:template>
+
+<xsl:template name="unwrap.p.nodes">
+ <xsl:param name="wrap" select="."/>
+ <xsl:param name="first" select="0"/>
+ <xsl:param name="nodes"/>
+ <xsl:param name="blocks"/>
+ <xsl:variable name="block" select="$blocks[1]"/>
+
+ <!-- This template should never get called if these functions aren't available -->
+ <!-- but this test is still necessary so that processors don't choke on the -->
+ <!-- function calls if they don't support the set: functions -->
+ <xsl:if test="function-available('set:leading')
+ and function-available('set:trailing')">
+ <xsl:choose>
+ <xsl:when test="$blocks">
+ <xsl:variable name="leading" select="set:leading($nodes,$block)"/>
+ <xsl:variable name="trailing" select="set:trailing($nodes,$block)"/>
+
+ <xsl:if test="(($wrap/@id or $wrap/@xml:id)
+ and $first = 1) or $leading">
+ <xsl:element name="{local-name($wrap)}" namespace="{namespace-uri($wrap)}">
+ <xsl:for-each select="$wrap/@*">
+ <xsl:if test="$first != 0 or local-name(.) != 'id'">
+ <xsl:copy/>
+ </xsl:if>
+ </xsl:for-each>
+ <xsl:apply-templates select="$leading" mode="unwrap.p"/>
+ </xsl:element>
+ </xsl:if>
+
+ <xsl:apply-templates select="$block" mode="unwrap.p"/>
+
+ <xsl:if test="$trailing">
+ <xsl:call-template name="unwrap.p.nodes">
+ <xsl:with-param name="wrap" select="$wrap"/>
+ <xsl:with-param name="nodes" select="$trailing"/>
+ <xsl:with-param name="blocks" select="$blocks[position() &gt; 1]"/>
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:when>
+
+ <xsl:otherwise>
+ <xsl:if test="(($wrap/@id or $wrap/@xml:id) and $first = 1) or $nodes">
+ <xsl:element name="{local-name($wrap)}" namespace="{namespace-uri($wrap)}">
+ <xsl:for-each select="$wrap/@*">
+ <xsl:if test="$first != 0 or local-name(.) != 'id'">
+ <xsl:copy/>
+ </xsl:if>
+ </xsl:for-each>
+ <xsl:apply-templates select="$nodes" mode="unwrap.p"/>
+ </xsl:element>
+ </xsl:if>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:if>
+</xsl:template>
+
+<!-- ==================================================================== -->
+<!-- make.verbatim.mode replaces spaces and newlines -->
+
+<xsl:template match="/" mode="make.verbatim.mode">
+ <xsl:apply-templates mode="make.verbatim.mode"/>
+</xsl:template>
+
+<xsl:template match="*" mode="make.verbatim.mode">
+ <xsl:copy>
+ <xsl:copy-of select="@*"/>
+ <xsl:apply-templates mode="make.verbatim.mode"/>
+ </xsl:copy>
+</xsl:template>
+
+<xsl:template match="processing-instruction()|comment()" mode="make.verbatim.mode">
+ <xsl:copy/>
+</xsl:template>
+
+<xsl:template match="text()" mode="make.verbatim.mode">
+ <xsl:variable name="text" select="translate(., ' ', '&#160;')"/>
+
+ <xsl:choose>
+ <xsl:when test="not(contains($text, '&#xA;'))">
+ <xsl:value-of select="$text"/>
+ </xsl:when>
+
+ <xsl:otherwise>
+ <xsl:variable name="len" select="string-length($text)"/>
+
+ <xsl:choose>
+ <xsl:when test="$len = 1">
+ <br/><xsl:text>&#xA;</xsl:text>
+ </xsl:when>
+
+ <xsl:otherwise>
+ <xsl:variable name="half" select="$len div 2"/>
+ <xsl:call-template name="make-verbatim-recursive">
+ <xsl:with-param name="text" select="substring($text, 1, $half)"/>
+ </xsl:call-template>
+ <xsl:call-template name="make-verbatim-recursive">
+ <xsl:with-param name="text"
+ select="substring($text, ($half + 1), $len)"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="make-verbatim-recursive">
+ <xsl:param name="text" select="''"/>
+
+ <xsl:choose>
+ <xsl:when test="not(contains($text, '&#xA;'))">
+ <xsl:value-of select="$text"/>
+ </xsl:when>
+
+ <xsl:otherwise>
+ <xsl:variable name="len" select="string-length($text)"/>
+
+ <xsl:choose>
+ <xsl:when test="$len = 1">
+ <br/><xsl:text>&#xA;</xsl:text>
+ </xsl:when>
+
+ <xsl:otherwise>
+ <xsl:variable name="half" select="$len div 2"/>
+ <xsl:call-template name="make-verbatim-recursive">
+ <xsl:with-param name="text" select="substring($text, 1, $half)"/>
+ </xsl:call-template>
+ <xsl:call-template name="make-verbatim-recursive">
+ <xsl:with-param name="text"
+ select="substring($text, ($half + 1), $len)"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<!-- remove.empty.div mode templates remove empty blocks -->
+
+<xsl:template name="remove.empty.div">
+ <xsl:param name="div"/>
+ <xsl:choose>
+ <xsl:when test="$exsl.node.set.available != 0">
+ <xsl:apply-templates select="exsl:node-set($div)" mode="remove.empty.div"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:copy-of select="$div"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template xmlns:html="http://www.w3.org/1999/xhtml"
+ match="html:p|p|html:div|div" mode="remove.empty.div">
+ <xsl:if test="node()">
+ <xsl:copy>
+ <xsl:copy-of select="@*"/>
+ <xsl:apply-templates mode="remove.empty.div"/>
+ </xsl:copy>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="*" mode="remove.empty.div">
+ <xsl:copy>
+ <xsl:copy-of select="@*"/>
+ <xsl:apply-templates mode="remove.empty.div"/>
+ </xsl:copy>
+</xsl:template>
+
+<xsl:template match="text()|processing-instruction()|comment()" mode="remove.empty.div">
+ <xsl:copy/>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/html.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/html.xsl
new file mode 100644
index 0000000..bf76e83
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/html.xsl
@@ -0,0 +1,612 @@
+<?xml version='1.0'?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version='1.0'>
+
+<!-- ********************************************************************
+ $Id: html.xsl 8556 2009-12-11 00:05:45Z bobstayton $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<!-- These variables set the align attribute value for HTML output based on
+ the writing-mode specified in the gentext file for the document's lang. -->
+
+<xsl:variable name="direction.align.start">
+ <xsl:choose>
+ <xsl:when test="starts-with($writing.mode, 'lr')">left</xsl:when>
+ <xsl:when test="starts-with($writing.mode, 'rl')">right</xsl:when>
+ <xsl:otherwise>left</xsl:otherwise>
+ </xsl:choose>
+</xsl:variable>
+
+<xsl:variable name="direction.align.end">
+ <xsl:choose>
+ <xsl:when test="starts-with($writing.mode, 'lr')">right</xsl:when>
+ <xsl:when test="starts-with($writing.mode, 'rl')">left</xsl:when>
+ <xsl:otherwise>right</xsl:otherwise>
+ </xsl:choose>
+</xsl:variable>
+
+<xsl:variable name="direction.mode">
+ <xsl:choose>
+ <xsl:when test="starts-with($writing.mode, 'lr')">ltr</xsl:when>
+ <xsl:when test="starts-with($writing.mode, 'rl')">rtl</xsl:when>
+ <xsl:otherwise>ltr</xsl:otherwise>
+ </xsl:choose>
+</xsl:variable>
+
+<!-- The generate.html.title template is currently used for generating HTML -->
+<!-- "title" attributes for some inline elements only, but not for any -->
+<!-- block elements. It is called in eleven places in the inline.xsl -->
+<!-- file. But it's called by all the inline.* templates (e.g., -->
+<!-- inline.boldseq), which in turn are called by other (element) -->
+<!-- templates, so it results, currently, in supporting generation of the -->
+<!-- HTML "title" attribute for a total of about 92 elements. -->
+<!-- You can use mode="html.title.attribute" to get a title for -->
+<!-- an element specified by a param, including targets of cross references. -->
+<xsl:template name="generate.html.title">
+ <xsl:apply-templates select="." mode="html.title.attribute"/>
+</xsl:template>
+
+<!-- Generate a title attribute for the context node -->
+<xsl:template match="*" mode="html.title.attribute">
+ <xsl:variable name="is.title">
+ <xsl:call-template name="gentext.template.exists">
+ <xsl:with-param name="context" select="'title'"/>
+ <xsl:with-param name="name" select="local-name(.)"/>
+ <xsl:with-param name="lang">
+ <xsl:call-template name="l10n.language"/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="is.title-numbered">
+ <xsl:call-template name="gentext.template.exists">
+ <xsl:with-param name="context" select="'title-numbered'"/>
+ <xsl:with-param name="name" select="local-name(.)"/>
+ <xsl:with-param name="lang">
+ <xsl:call-template name="l10n.language"/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="is.title-unnumbered">
+ <xsl:call-template name="gentext.template.exists">
+ <xsl:with-param name="context" select="'title-unnumbered'"/>
+ <xsl:with-param name="name" select="local-name(.)"/>
+ <xsl:with-param name="lang">
+ <xsl:call-template name="l10n.language"/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="has.title.markup">
+ <xsl:apply-templates select="." mode="title.markup">
+ <xsl:with-param name="verbose" select="0"/>
+ </xsl:apply-templates>
+ </xsl:variable>
+
+ <xsl:variable name="gentext.title">
+ <xsl:if test="$has.title.markup != '???TITLE???' and
+ ($is.title != 0 or
+ $is.title-numbered != 0 or
+ $is.title-unnumbered != 0)">
+ <xsl:apply-templates select="."
+ mode="object.title.markup.textonly"/>
+ </xsl:if>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="string-length($gentext.title) != 0">
+ <xsl:attribute name="title">
+ <xsl:value-of select="$gentext.title"/>
+ </xsl:attribute>
+ </xsl:when>
+ <!-- Fall back to alt if available -->
+ <xsl:when test="alt">
+ <xsl:attribute name="title">
+ <xsl:value-of select="normalize-space(alt)"/>
+ </xsl:attribute>
+ </xsl:when>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="qandaentry" mode="html.title.attribute">
+ <xsl:apply-templates select="question" mode="html.title.attribute"/>
+</xsl:template>
+
+<xsl:template match="question" mode="html.title.attribute">
+ <xsl:variable name="label.text">
+ <xsl:apply-templates select="." mode="qanda.label"/>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="string-length($label.text) != 0">
+ <xsl:attribute name="title">
+ <xsl:value-of select="$label.text"/>
+ </xsl:attribute>
+ </xsl:when>
+ <!-- Fall back to alt if available -->
+ <xsl:when test="alt">
+ <xsl:attribute name="title">
+ <xsl:value-of select="normalize-space(alt)"/>
+ </xsl:attribute>
+ </xsl:when>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="dir">
+ <xsl:param name="inherit" select="0"/>
+
+ <xsl:variable name="dir">
+ <xsl:choose>
+ <xsl:when test="@dir">
+ <xsl:value-of select="@dir"/>
+ </xsl:when>
+ <xsl:when test="$inherit != 0">
+ <xsl:value-of select="ancestor::*/@dir[1]"/>
+ </xsl:when>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:if test="$dir != ''">
+ <xsl:attribute name="dir">
+ <xsl:value-of select="$dir"/>
+ </xsl:attribute>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template name="anchor">
+ <xsl:param name="node" select="."/>
+ <xsl:param name="conditional" select="1"/>
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id">
+ <xsl:with-param name="object" select="$node"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:if test="$conditional = 0 or $node/@id or $node/@xml:id">
+ <a name="{$id}"/>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template name="href.target.uri">
+ <xsl:param name="context" select="."/>
+ <xsl:param name="object" select="."/>
+ <xsl:text>#</xsl:text>
+ <xsl:call-template name="object.id">
+ <xsl:with-param name="object" select="$object"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template name="href.target">
+ <xsl:param name="context" select="."/>
+ <xsl:param name="object" select="."/>
+ <xsl:text>#</xsl:text>
+ <xsl:call-template name="object.id">
+ <xsl:with-param name="object" select="$object"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template name="href.target.with.base.dir">
+ <xsl:param name="context" select="."/>
+ <xsl:param name="object" select="."/>
+ <xsl:if test="$manifest.in.base.dir = 0">
+ <xsl:value-of select="$base.dir"/>
+ </xsl:if>
+ <xsl:call-template name="href.target">
+ <xsl:with-param name="context" select="$context"/>
+ <xsl:with-param name="object" select="$object"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template name="dingbat">
+ <xsl:param name="dingbat">bullet</xsl:param>
+ <xsl:call-template name="dingbat.characters">
+ <xsl:with-param name="dingbat" select="$dingbat"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template name="dingbat.characters">
+ <!-- now that I'm using the real serializer, all that dingbat malarky -->
+ <!-- isn't necessary anymore... -->
+ <xsl:param name="dingbat">bullet</xsl:param>
+ <xsl:choose>
+ <xsl:when test="$dingbat='bullet'">&#x2022;</xsl:when>
+ <xsl:when test="$dingbat='copyright'">&#x00A9;</xsl:when>
+ <xsl:when test="$dingbat='trademark'">&#x2122;</xsl:when>
+ <xsl:when test="$dingbat='trade'">&#x2122;</xsl:when>
+ <xsl:when test="$dingbat='registered'">&#x00AE;</xsl:when>
+ <xsl:when test="$dingbat='service'">(SM)</xsl:when>
+ <xsl:when test="$dingbat='nbsp'">&#x00A0;</xsl:when>
+ <xsl:when test="$dingbat='ldquo'">&#x201C;</xsl:when>
+ <xsl:when test="$dingbat='rdquo'">&#x201D;</xsl:when>
+ <xsl:when test="$dingbat='lsquo'">&#x2018;</xsl:when>
+ <xsl:when test="$dingbat='rsquo'">&#x2019;</xsl:when>
+ <xsl:when test="$dingbat='em-dash'">&#x2014;</xsl:when>
+ <xsl:when test="$dingbat='mdash'">&#x2014;</xsl:when>
+ <xsl:when test="$dingbat='en-dash'">&#x2013;</xsl:when>
+ <xsl:when test="$dingbat='ndash'">&#x2013;</xsl:when>
+ <xsl:otherwise>
+ <xsl:text>&#x2022;</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="id.warning">
+ <xsl:if test="$id.warnings != 0 and not(@id) and not(@xml:id) and parent::*">
+ <xsl:variable name="title">
+ <xsl:choose>
+ <xsl:when test="title">
+ <xsl:value-of select="title[1]"/>
+ </xsl:when>
+ <xsl:when test="substring(local-name(*[1]),
+ string-length(local-name(*[1])-3) = 'info')
+ and *[1]/title">
+ <xsl:value-of select="*[1]/title[1]"/>
+ </xsl:when>
+ <xsl:when test="refmeta/refentrytitle">
+ <xsl:value-of select="refmeta/refentrytitle"/>
+ </xsl:when>
+ <xsl:when test="refnamediv/refname">
+ <xsl:value-of select="refnamediv/refname[1]"/>
+ </xsl:when>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:message>
+ <xsl:text>ID recommended on </xsl:text>
+ <xsl:value-of select="local-name(.)"/>
+ <xsl:if test="$title != ''">
+ <xsl:text>: </xsl:text>
+ <xsl:choose>
+ <xsl:when test="string-length($title) &gt; 40">
+ <xsl:value-of select="substring($title,1,40)"/>
+ <xsl:text>...</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$title"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:if>
+ </xsl:message>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template name="generate.class.attribute">
+ <xsl:param name="class" select="local-name(.)"/>
+ <xsl:apply-templates select="." mode="class.attribute">
+ <xsl:with-param name="class" select="$class"/>
+ </xsl:apply-templates>
+</xsl:template>
+
+<xsl:template match="*" mode="class.attribute">
+ <xsl:param name="class" select="local-name(.)"/>
+ <!-- permit customization of class attributes -->
+ <!-- Use element name by default -->
+ <xsl:attribute name="class">
+ <xsl:apply-templates select="." mode="class.value">
+ <xsl:with-param name="class" select="$class"/>
+ </xsl:apply-templates>
+ </xsl:attribute>
+</xsl:template>
+
+<xsl:template match="*" mode="class.value">
+ <xsl:param name="class" select="local-name(.)"/>
+ <!-- permit customization of class value only -->
+ <!-- Use element name by default -->
+ <xsl:value-of select="$class"/>
+</xsl:template>
+
+<!-- Apply common attributes such as class, lang, dir -->
+<xsl:template name="common.html.attributes">
+ <xsl:param name="inherit" select="0"/>
+ <xsl:param name="class" select="local-name(.)"/>
+ <xsl:apply-templates select="." mode="common.html.attributes">
+ <xsl:with-param name="class" select="$class"/>
+ <xsl:with-param name="inherit" select="$inherit"/>
+ </xsl:apply-templates>
+</xsl:template>
+
+<xsl:template match="*" mode="common.html.attributes">
+ <xsl:param name="class" select="local-name(.)"/>
+ <xsl:param name="inherit" select="0"/>
+ <xsl:call-template name="generate.html.lang"/>
+ <xsl:call-template name="dir">
+ <xsl:with-param name="inherit" select="$inherit"/>
+ </xsl:call-template>
+ <xsl:apply-templates select="." mode="class.attribute">
+ <xsl:with-param name="class" select="$class"/>
+ </xsl:apply-templates>
+ <xsl:call-template name="generate.html.title"/>
+</xsl:template>
+
+<!-- Apply common attributes not including class -->
+<xsl:template name="locale.html.attributes">
+ <xsl:apply-templates select="." mode="locale.html.attributes"/>
+</xsl:template>
+
+<xsl:template match="*" mode="locale.html.attributes">
+ <xsl:call-template name="generate.html.lang"/>
+ <xsl:call-template name="dir"/>
+ <xsl:call-template name="generate.html.title"/>
+</xsl:template>
+
+<!-- Pass through any lang attributes -->
+<xsl:template name="generate.html.lang">
+ <xsl:apply-templates select="." mode="html.lang.attribute"/>
+</xsl:template>
+
+<xsl:template match="*" mode="html.lang.attribute">
+ <!-- match the attribute name to the output type -->
+ <xsl:choose>
+ <xsl:when test="@lang and $stylesheet.result.type = 'html'">
+ <xsl:attribute name="lang">
+ <xsl:value-of select="@lang"/>
+ </xsl:attribute>
+ </xsl:when>
+ <xsl:when test="@lang and $stylesheet.result.type = 'xhtml'">
+ <xsl:attribute name="xml:lang">
+ <xsl:value-of select="@lang"/>
+ </xsl:attribute>
+ </xsl:when>
+ <xsl:when test="@xml:lang and $stylesheet.result.type = 'html'">
+ <xsl:attribute name="lang">
+ <xsl:value-of select="@xml:lang"/>
+ </xsl:attribute>
+ </xsl:when>
+ <xsl:when test="@xml:lang and $stylesheet.result.type = 'xhtml'">
+ <xsl:attribute name="xml:lang">
+ <xsl:value-of select="@xml:lang"/>
+ </xsl:attribute>
+ </xsl:when>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ==================================================================== -->
+<!-- Insert link to css or insert literal CSS in head element -->
+<xsl:template name="generate.css">
+ <xsl:choose>
+ <xsl:when test="$generate.css.header = 0">
+ <xsl:call-template name="generate.css.links"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="generate.css.headers"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="generate.css.headers">
+ <xsl:call-template name="generate.default.css.header"/>
+ <xsl:call-template name="generate.custom.css.header"/>
+</xsl:template>
+
+<xsl:template name="generate.default.css.header">
+ <xsl:if test="$make.clean.html != 0 and
+ $docbook.css.source != ''">
+ <!-- Select default file relative to stylesheet -->
+ <xsl:variable name="css.node" select="document($docbook.css.source)/*[1]"/>
+
+ <xsl:call-template name="output.css.header">
+ <xsl:with-param name="css.node" select="$css.node"/>
+ </xsl:call-template>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template name="generate.custom.css.header">
+ <xsl:if test="$custom.css.source != ''">
+ <!-- Select custom file relative to document -->
+ <xsl:variable name="css.node" select="document($custom.css.source,.)/*[1]"/>
+
+ <xsl:call-template name="output.css.header">
+ <xsl:with-param name="css.node" select="$css.node"/>
+ </xsl:call-template>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template name="output.css.header">
+ <xsl:param name="css.node"/>
+
+ <xsl:choose>
+ <xsl:when test="count($css.node) = 0">
+ </xsl:when>
+ <xsl:otherwise>
+ <style type="text/css">
+ <xsl:copy-of select="$css.node/text()"/>
+ </style>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ==================================================================== -->
+<xsl:template name="generate.css.links">
+ <xsl:call-template name="generate.default.css.link"/>
+ <xsl:call-template name="generate.custom.css.link"/>
+</xsl:template>
+
+<xsl:template name="generate.default.css.link">
+ <xsl:if test="$make.clean.html != 0 and
+ $docbook.css.link != 0 and
+ $docbook.css.source != ''">
+ <xsl:variable name="filename">
+ <xsl:call-template name="css.output.filename">
+ <xsl:with-param name="src" select="$docbook.css.source"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:call-template name="make.css.link">
+ <xsl:with-param name="css.filename" select="$filename"/>
+ </xsl:call-template>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template name="generate.custom.css.link">
+ <xsl:if test="$custom.css.source != ''">
+ <xsl:variable name="filename">
+ <xsl:call-template name="css.output.filename">
+ <xsl:with-param name="src" select="$custom.css.source"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:call-template name="make.css.link">
+ <xsl:with-param name="css.filename" select="$filename"/>
+ </xsl:call-template>
+ </xsl:if>
+</xsl:template>
+
+<!-- a CSS link reference must take into account the relative
+ path to a CSS file when chunked HTML is output to more than one directory -->
+<xsl:template name="make.css.link">
+ <xsl:param name="css.filename" select="''"/>
+
+ <xsl:variable name="href.to.uri" select="$css.filename"/>
+
+ <xsl:variable name="href.from.uri">
+ <xsl:call-template name="href.target.uri">
+ <xsl:with-param name="object" select="."/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="href.to">
+ <xsl:call-template name="trim.common.uri.paths">
+ <xsl:with-param name="uriA" select="$href.to.uri"/>
+ <xsl:with-param name="uriB" select="$href.from.uri"/>
+ <xsl:with-param name="return" select="'A'"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="href.from">
+ <xsl:call-template name="trim.common.uri.paths">
+ <xsl:with-param name="uriA" select="$href.to.uri"/>
+ <xsl:with-param name="uriB" select="$href.from.uri"/>
+ <xsl:with-param name="return" select="'B'"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:variable name="depth">
+ <xsl:call-template name="count.uri.path.depth">
+ <xsl:with-param name="filename" select="$href.from"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:variable name="href">
+ <xsl:call-template name="copy-string">
+ <xsl:with-param name="string" select="'../'"/>
+ <xsl:with-param name="count" select="$depth"/>
+ </xsl:call-template>
+ <xsl:value-of select="$href.to"/>
+ </xsl:variable>
+
+ <xsl:if test="string-length($css.filename) != 0">
+ <link rel="stylesheet"
+ type="text/css"
+ href="{$href}"/>
+ </xsl:if>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template name="generate.css.files">
+ <xsl:call-template name="generate.default.css.file"/>
+ <xsl:call-template name="generate.custom.css.file"/>
+</xsl:template>
+
+<xsl:template name="generate.default.css.file">
+ <xsl:if test="$make.clean.html != 0 and
+ $generate.css.header = 0 and
+ $docbook.css.source != ''">
+ <!-- Select default file relative to stylesheet -->
+ <xsl:variable name="css.node" select="document($docbook.css.source)/*[1]"/>
+
+ <xsl:call-template name="generate.css.file">
+ <xsl:with-param name="src" select="$docbook.css.source"/>
+ <xsl:with-param name="css.node" select="$css.node"/>
+ </xsl:call-template>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template name="generate.custom.css.file">
+ <xsl:if test="$custom.css.source != '' and
+ $generate.css.header = 0">
+ <!-- Select custom file relative to document -->
+ <xsl:variable name="css.node" select="document($custom.css.source,.)/*[1]"/>
+
+ <xsl:call-template name="generate.css.file">
+ <xsl:with-param name="src" select="$custom.css.source"/>
+ <xsl:with-param name="css.node" select="$css.node"/>
+ </xsl:call-template>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template name="generate.css.file">
+ <xsl:param name="css.node"/>
+ <xsl:param name="src" select="''"/>
+
+ <xsl:variable name="css.text" select="$css.node/text()"/>
+
+ <xsl:choose>
+ <xsl:when test="count($css.node) = 0">
+ <xsl:message>
+ <xsl:text>ERROR: no root element for CSS source file'</xsl:text>
+ <xsl:value-of select="$src"/>
+ <xsl:text>'.</xsl:text>
+ </xsl:message>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:variable name="filename">
+ <xsl:call-template name="css.output.pathname">
+ <xsl:with-param name="src" select="$src"/>
+ <xsl:with-param name="content" select="$css.node"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:call-template name="write.text.chunk">
+ <xsl:with-param name="filename" select="$filename"/>
+ <xsl:with-param name="content" select="$css.text"/>
+ </xsl:call-template>
+
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="css.output.filename">
+ <xsl:param name="content"/>
+ <xsl:param name="src" select="''"/>
+
+ <xsl:variable name="candidate">
+ <xsl:choose>
+ <xsl:when test="string-length($src) = 0">
+ <xsl:message>
+ <xsl:text>ERROR: missing CSS input filename.</xsl:text>
+ </xsl:message>
+ </xsl:when>
+ <xsl:when test="substring($src,string-length($src)-3) = '.xml'">
+ <xsl:value-of select="substring($src, 1, string-length($src) - 4)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$src"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:value-of select="$candidate"/>
+</xsl:template>
+
+<xsl:template name="css.output.pathname">
+ <xsl:param name="content"/>
+ <xsl:param name="src" select="''"/>
+
+ <xsl:variable name="file">
+ <xsl:call-template name="css.output.filename">
+ <xsl:with-param name="content" select="$content"/>
+ <xsl:with-param name="src" select="$src"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="path" select="concat($base.dir, $file)"/>
+ <xsl:value-of select="$path"/>
+
+</xsl:template>
+
+</xsl:stylesheet>
+
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/htmltbl.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/htmltbl.xsl
new file mode 100644
index 0000000..1fb5d6f
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/htmltbl.xsl
@@ -0,0 +1,135 @@
+<?xml version="1.0"?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="1.0">
+
+<!-- ********************************************************************
+ $Id: htmltbl.xsl 8477 2009-07-13 11:38:55Z nwalsh $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<!-- ==================================================================== -->
+
+<xsl:template match="colgroup" mode="htmlTable">
+ <xsl:element name="{local-name()}" namespace="">
+ <xsl:apply-templates select="@*" mode="htmlTableAtt"/>
+ <xsl:apply-templates mode="htmlTable"/>
+ </xsl:element>
+</xsl:template>
+
+<xsl:template match="col" mode="htmlTable">
+ <xsl:element name="{local-name()}" namespace="">
+ <xsl:apply-templates select="@*" mode="htmlTableAtt"/>
+ </xsl:element>
+</xsl:template>
+
+<xsl:template match="caption" mode="htmlTable">
+ <!-- do not use xsl:copy because of XHTML's needs -->
+ <caption>
+ <xsl:apply-templates select="@*" mode="htmlTableAtt"/>
+
+ <xsl:apply-templates select=".." mode="object.title.markup">
+ <xsl:with-param name="allow-anchors" select="1"/>
+ </xsl:apply-templates>
+
+ </caption>
+</xsl:template>
+
+<xsl:template match="tbody|thead|tfoot|tr" mode="htmlTable">
+ <xsl:element name="{local-name(.)}">
+ <xsl:apply-templates select="@*" mode="htmlTableAtt"/>
+ <xsl:apply-templates mode="htmlTable"/>
+ </xsl:element>
+</xsl:template>
+
+<xsl:template match="th|td" mode="htmlTable">
+ <xsl:element name="{local-name(.)}">
+ <xsl:apply-templates select="@*" mode="htmlTableAtt"/>
+ <xsl:apply-templates/> <!-- *not* mode=htmlTable -->
+ </xsl:element>
+</xsl:template>
+
+<!-- don't copy through DocBook-specific attributes on HTML table markup -->
+<!-- default behavior is to not copy through because there are more
+ DocBook attributes than HTML attributes -->
+<xsl:template mode="htmlTableAtt" match="@*"/>
+
+<!-- copy these through -->
+<xsl:template mode="htmlTableAtt"
+ match="@abbr
+ | @align
+ | @axis
+ | @bgcolor
+ | @border
+ | @cellpadding
+ | @cellspacing
+ | @char
+ | @charoff
+ | @class
+ | @dir
+ | @frame
+ | @headers
+ | @height
+ | @lang
+ | @nowrap
+ | @onclick
+ | @ondblclick
+ | @onkeydown
+ | @onkeypress
+ | @onkeyup
+ | @onmousedown
+ | @onmousemove
+ | @onmouseout
+ | @onmouseover
+ | @onmouseup
+ | @rules
+ | @style
+ | @summary
+ | @title
+ | @valign
+ | @valign
+ | @width
+ | @xml:lang">
+ <xsl:copy-of select="."/>
+</xsl:template>
+
+<xsl:template match="@span|@rowspan|@colspan" mode="htmlTableAtt">
+ <!-- No need to copy through the DTD's default value "1" of the attribute -->
+ <xsl:if test="number(.) != 1">
+ <xsl:attribute name="{local-name(.)}">
+ <xsl:value-of select="."/>
+ </xsl:attribute>
+ </xsl:if>
+</xsl:template>
+
+<!-- map floatstyle to HTML float values -->
+<xsl:template match="@floatstyle" mode="htmlTableAtt">
+ <xsl:attribute name="style">
+ <xsl:text>float: </xsl:text>
+ <xsl:choose>
+ <xsl:when test="contains(., 'left')">left</xsl:when>
+ <xsl:when test="contains(., 'right')">right</xsl:when>
+ <xsl:when test="contains(., 'start')">
+ <xsl:value-of select="$direction.align.start"/>
+ </xsl:when>
+ <xsl:when test="contains(., 'end')">
+ <xsl:value-of select="$direction.align.end"/>
+ </xsl:when>
+ <xsl:when test="contains(., 'inside')">
+ <xsl:value-of select="$direction.align.start"/>
+ </xsl:when>
+ <xsl:when test="contains(., 'outside')">
+ <xsl:value-of select="$direction.align.end"/>
+ </xsl:when>
+ <xsl:when test="contains(., 'before')">none</xsl:when>
+ <xsl:when test="contains(., 'none')">none</xsl:when>
+ </xsl:choose>
+ <xsl:text>;</xsl:text>
+ </xsl:attribute>
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/index.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/index.xsl
new file mode 100644
index 0000000..1837020
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/index.xsl
@@ -0,0 +1,288 @@
+<?xml version='1.0'?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version='1.0'>
+
+<!-- ********************************************************************
+ $Id: index.xsl 8421 2009-05-04 07:49:49Z bobstayton $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<!-- ==================================================================== -->
+
+<xsl:template match="index">
+ <!-- some implementations use completely empty index tags to indicate -->
+ <!-- where an automatically generated index should be inserted. so -->
+ <!-- if the index is completely empty, skip it. Unless generate.index -->
+ <!-- is non-zero, in which case, this is where the automatically -->
+ <!-- generated index should go. -->
+
+ <xsl:call-template name="id.warning"/>
+
+ <xsl:if test="count(*)>0 or $generate.index != '0'">
+ <div>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:if test="$generate.id.attributes != 0">
+ <xsl:attribute name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:call-template name="index.titlepage"/>
+ <xsl:choose>
+ <xsl:when test="indexdiv">
+ <xsl:apply-templates/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="*[not(self::indexentry)]"/>
+ <!-- Because it's actually valid for Index to have neither any -->
+ <!-- Indexdivs nor any Indexentries, we need to check and make -->
+ <!-- sure that at least one Indexentry exists, and generate a -->
+ <!-- wrapper dl if there is at least one; otherwise, do nothing. -->
+ <xsl:if test="indexentry">
+ <!-- The indexentry template assumes a parent dl wrapper has -->
+ <!-- been generated; for Indexes that have Indexdivs, the dl -->
+ <!-- wrapper is generated by the indexdiv template; however, -->
+ <!-- for Indexes that lack Indexdivs, if we don't generate a -->
+ <!-- dl here, HTML output will not be valid. -->
+ <dl>
+ <xsl:apply-templates select="indexentry"/>
+ </dl>
+ </xsl:if>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:if test="count(indexentry) = 0 and count(indexdiv) = 0">
+ <xsl:call-template name="generate-index">
+ <xsl:with-param name="scope" select="(ancestor::book|/)[last()]"/>
+ </xsl:call-template>
+ </xsl:if>
+
+ <xsl:if test="not(parent::article)">
+ <xsl:call-template name="process.footnotes"/>
+ </xsl:if>
+ </div>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="setindex">
+ <!-- some implementations use completely empty index tags to indicate -->
+ <!-- where an automatically generated index should be inserted. so -->
+ <!-- if the index is completely empty, skip it. Unless generate.index -->
+ <!-- is non-zero, in which case, this is where the automatically -->
+ <!-- generated index should go. -->
+
+ <xsl:call-template name="id.warning"/>
+
+ <xsl:if test="count(*)>0 or $generate.index != '0'">
+ <div>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:if test="$generate.id.attributes != 0">
+ <xsl:attribute name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:call-template name="setindex.titlepage"/>
+ <xsl:apply-templates/>
+
+ <xsl:if test="count(indexentry) = 0 and count(indexdiv) = 0">
+ <xsl:call-template name="generate-index">
+ <xsl:with-param name="scope" select="/"/>
+ </xsl:call-template>
+ </xsl:if>
+
+ <xsl:if test="not(parent::article)">
+ <xsl:call-template name="process.footnotes"/>
+ </xsl:if>
+ </div>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="index/indexinfo"></xsl:template>
+<xsl:template match="index/info"></xsl:template>
+<xsl:template match="index/title"></xsl:template>
+<xsl:template match="index/subtitle"></xsl:template>
+<xsl:template match="index/titleabbrev"></xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="indexdiv">
+ <xsl:call-template name="id.warning"/>
+
+ <div>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:if test="$generate.id.attributes != 0">
+ <xsl:attribute name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:call-template name="anchor"/>
+ <xsl:apply-templates select="*[not(self::indexentry)]"/>
+ <dl>
+ <xsl:apply-templates select="indexentry"/>
+ </dl>
+ </div>
+</xsl:template>
+
+<xsl:template match="indexdiv/title">
+ <h3>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates/>
+ </h3>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="indexterm">
+ <!-- this one must have a name, even if it doesn't have an ID -->
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+
+ <a class="indexterm" name="{$id}"/>
+</xsl:template>
+
+<xsl:template match="primary|secondary|tertiary|see|seealso">
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="indexentry">
+ <xsl:apply-templates select="primaryie"/>
+</xsl:template>
+
+<xsl:template match="primaryie">
+ <dt>
+ <xsl:apply-templates/>
+ </dt>
+ <dd>
+ <xsl:apply-templates select="following-sibling::seeie
+ [not(preceding-sibling::secondaryie)]"
+ mode="indexentry"/>
+ <xsl:apply-templates select="following-sibling::seealsoie
+ [not(preceding-sibling::secondaryie)]"
+ mode="indexentry"/>
+ <xsl:apply-templates select="following-sibling::secondaryie"
+ mode="indexentry"/>
+ </dd>
+</xsl:template>
+
+<!-- Handled in mode to convert flat list to structured output -->
+<xsl:template match="secondaryie">
+</xsl:template>
+<xsl:template match="tertiaryie">
+</xsl:template>
+<xsl:template match="seeie|seealsoie">
+</xsl:template>
+
+<xsl:template match="secondaryie" mode="indexentry">
+ <dl>
+ <dt>
+ <xsl:apply-templates/>
+ </dt>
+ <dd>
+ <!-- select following see* elements up to next secondaryie or tertiary or end -->
+ <xsl:variable name="after.this"
+ select="following-sibling::*"/>
+ <xsl:variable name="next.entry"
+ select="(following-sibling::secondaryie|following-sibling::tertiaryie)[1]"/>
+ <xsl:variable name="before.entry"
+ select="$next.entry/preceding-sibling::*"/>
+ <xsl:variable name="see.intersection"
+ select="$after.this[count(.|$before.entry) = count($before.entry)]
+ [self::seeie or self::seealsoie]"/>
+ <xsl:choose>
+ <xsl:when test="count($see.intersection) != 0">
+ <xsl:apply-templates select="$see.intersection" mode="indexentry"/>
+ </xsl:when>
+ <xsl:when test="count($next.entry) = 0">
+ <xsl:apply-templates select="following-sibling::seeie"
+ mode="indexentry"/>
+ <xsl:apply-templates select="following-sibling::seealsoie"
+ mode="indexentry"/>
+ </xsl:when>
+ </xsl:choose>
+
+ <!-- now process any tertiaryie before the next secondaryie -->
+ <xsl:variable name="before.next.secondary"
+ select="following-sibling::secondaryie[1]/preceding-sibling::*"/>
+ <xsl:variable name="tertiary.intersection"
+ select="$after.this[count(.|$before.next.secondary) =
+ count($before.next.secondary)]
+ [not(self::seeie) and not(self::seealsoie)]"/>
+ <xsl:choose>
+ <xsl:when test="count($tertiary.intersection) != 0">
+ <xsl:apply-templates select="$tertiary.intersection"
+ mode="indexentry"/>
+ </xsl:when>
+ <xsl:when test="not(following-sibling::secondaryie)">
+ <xsl:apply-templates select="following-sibling::tertiaryie"
+ mode="indexentry"/>
+ </xsl:when>
+ </xsl:choose>
+ </dd>
+ </dl>
+</xsl:template>
+
+<xsl:template match="tertiaryie" mode="indexentry">
+ <dl>
+ <dt>
+ <xsl:apply-templates/>
+ </dt>
+ <dd>
+ <!-- select following see* elements up to next secondaryie or tertiary or end -->
+ <xsl:variable name="after.this"
+ select="following-sibling::*"/>
+ <xsl:variable name="next.entry"
+ select="(following-sibling::secondaryie|following-sibling::tertiaryie)[1]"/>
+ <xsl:variable name="before.entry"
+ select="$next.entry/preceding-sibling::*"/>
+ <xsl:variable name="see.intersection"
+ select="$after.this[count(.|$before.entry) = count($before.entry)]
+ [self::seeie or self::seealsoie]"/>
+ <xsl:choose>
+ <xsl:when test="count($see.intersection) != 0">
+ <xsl:apply-templates select="$see.intersection" mode="indexentry"/>
+ </xsl:when>
+ <xsl:when test="count($next.entry) = 0">
+ <xsl:apply-templates select="following-sibling::seeie"
+ mode="indexentry"/>
+ <xsl:apply-templates select="following-sibling::seealsoie"
+ mode="indexentry"/>
+ </xsl:when>
+ </xsl:choose>
+ </dd>
+ </dl>
+</xsl:template>
+
+<xsl:template match="seeie" mode="indexentry">
+ <dt>
+ <xsl:text>(</xsl:text>
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'see'"/>
+ </xsl:call-template>
+ <xsl:text> </xsl:text>
+ <xsl:apply-templates/>
+ <xsl:text>)</xsl:text>
+ </dt>
+</xsl:template>
+
+<xsl:template match="seealsoie" mode="indexentry">
+ <div>
+ <xsl:text>(</xsl:text>
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'seealso'"/>
+ </xsl:call-template>
+ <xsl:text> </xsl:text>
+ <xsl:apply-templates/>
+ <xsl:text>)</xsl:text>
+ </div>
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/info.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/info.xsl
new file mode 100644
index 0000000..404ac13
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/info.xsl
@@ -0,0 +1,43 @@
+<?xml version='1.0'?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version='1.0'>
+
+<!-- ********************************************************************
+ $Id: info.xsl 8421 2009-05-04 07:49:49Z bobstayton $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<!-- These templates define the "default behavior" for info
+ elements. Even if you don't process the *info wrappers,
+ some of these elements are needed because the elements are
+ processed from named templates that are called with modes.
+ Since modes aren't sticky, these rules apply.
+ (TODO: clarify this comment) -->
+
+<!-- ==================================================================== -->
+<!-- called from named templates in a given mode -->
+
+<xsl:template match="corpauthor">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates/>
+ </span>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="jobtitle">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates/>
+ </span>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/inline.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/inline.xsl
new file mode 100644
index 0000000..cd3d342
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/inline.xsl
@@ -0,0 +1,1490 @@
+<?xml version='1.0'?>
+<!DOCTYPE xsl:stylesheet [
+<!ENTITY % common.entities SYSTEM "../common/entities.ent">
+%common.entities;
+]>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:xlink='http://www.w3.org/1999/xlink'
+ xmlns:suwl="http://nwalsh.com/xslt/ext/com.nwalsh.saxon.UnwrapLinks"
+ exclude-result-prefixes="xlink suwl"
+ version='1.0'>
+
+<!-- ********************************************************************
+ $Id: inline.xsl 8811 2010-08-09 20:24:45Z mzjn $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<xsl:key name="glossentries" match="glossentry" use="normalize-space(glossterm)"/>
+<xsl:key name="glossentries" match="glossentry" use="normalize-space(glossterm/@baseform)"/>
+
+<xsl:template name="simple.xlink">
+ <xsl:param name="node" select="."/>
+ <xsl:param name="content">
+ <xsl:apply-templates/>
+ </xsl:param>
+ <xsl:param name="linkend" select="$node/@linkend"/>
+ <xsl:param name="xhref" select="$node/@xlink:href"/>
+
+ <!-- Support for @xlink:show -->
+ <xsl:variable name="target.show">
+ <xsl:choose>
+ <xsl:when test="$node/@xlink:show = 'new'">_blank</xsl:when>
+ <xsl:when test="$node/@xlink:show = 'replace'">_top</xsl:when>
+ <xsl:otherwise></xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="link">
+ <xsl:choose>
+ <xsl:when test="$xhref and
+ (not($node/@xlink:type) or
+ $node/@xlink:type='simple')">
+
+ <!-- Is it a local idref or a uri? -->
+ <xsl:variable name="is.idref">
+ <xsl:choose>
+ <!-- if the href starts with # and does not contain an "(" -->
+ <!-- or if the href starts with #xpointer(id(, it's just an ID -->
+ <xsl:when test="starts-with($xhref,'#')
+ and (not(contains($xhref,'&#40;'))
+ or starts-with($xhref,
+ '#xpointer&#40;id&#40;'))">1</xsl:when>
+ <xsl:otherwise>0</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <!-- Is it an olink ? -->
+ <xsl:variable name="is.olink">
+ <xsl:choose>
+ <!-- If xlink:role="http://docbook.org/xlink/role/olink" -->
+ <!-- and if the href contains # -->
+ <xsl:when test="contains($xhref,'#') and
+ @xlink:role = $xolink.role">1</xsl:when>
+ <xsl:otherwise>0</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="$is.olink = 1">
+ <xsl:call-template name="olink">
+ <xsl:with-param name="content" select="$content"/>
+ </xsl:call-template>
+ </xsl:when>
+
+ <xsl:when test="$is.idref = 1">
+
+ <xsl:variable name="idref">
+ <xsl:call-template name="xpointer.idref">
+ <xsl:with-param name="xpointer" select="$xhref"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="targets" select="key('id',$idref)"/>
+ <xsl:variable name="target" select="$targets[1]"/>
+
+ <xsl:call-template name="check.id.unique">
+ <xsl:with-param name="linkend" select="$idref"/>
+ </xsl:call-template>
+
+ <xsl:choose>
+ <xsl:when test="count($target) = 0">
+ <xsl:message>
+ <xsl:text>XLink to nonexistent id: </xsl:text>
+ <xsl:value-of select="$idref"/>
+ </xsl:message>
+ <xsl:copy-of select="$content"/>
+ </xsl:when>
+
+ <xsl:otherwise>
+ <a>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+
+ <xsl:attribute name="href">
+ <xsl:call-template name="href.target">
+ <xsl:with-param name="object" select="$target"/>
+ </xsl:call-template>
+ </xsl:attribute>
+
+ <xsl:choose>
+ <xsl:when test="$node/@xlink:title">
+ <xsl:attribute name="title">
+ <xsl:value-of select="$node/@xlink:title"/>
+ </xsl:attribute>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="$target"
+ mode="html.title.attribute"/>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:if test="$target.show !=''">
+ <xsl:attribute name="target">
+ <xsl:value-of select="$target.show"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:copy-of select="$content"/>
+
+ </a>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+
+ <!-- otherwise it's a URI -->
+ <xsl:otherwise>
+ <a>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:attribute name="href">
+ <xsl:value-of select="$xhref"/>
+ </xsl:attribute>
+ <xsl:if test="$node/@xlink:title">
+ <xsl:attribute name="title">
+ <xsl:value-of select="$node/@xlink:title"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <!-- For URIs, use @xlink:show if defined, otherwise use ulink.target -->
+ <xsl:choose>
+ <xsl:when test="$target.show !=''">
+ <xsl:attribute name="target">
+ <xsl:value-of select="$target.show"/>
+ </xsl:attribute>
+ </xsl:when>
+ <xsl:when test="$ulink.target !=''">
+ <xsl:attribute name="target">
+ <xsl:value-of select="$ulink.target"/>
+ </xsl:attribute>
+ </xsl:when>
+ </xsl:choose>
+
+ <xsl:copy-of select="$content"/>
+ </a>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+
+ <xsl:when test="$linkend">
+ <xsl:variable name="targets" select="key('id',$linkend)"/>
+ <xsl:variable name="target" select="$targets[1]"/>
+
+ <xsl:call-template name="check.id.unique">
+ <xsl:with-param name="linkend" select="$linkend"/>
+ </xsl:call-template>
+
+ <a>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:attribute name="href">
+ <xsl:call-template name="href.target">
+ <xsl:with-param name="object" select="$target"/>
+ </xsl:call-template>
+ </xsl:attribute>
+
+ <xsl:apply-templates select="$target" mode="html.title.attribute"/>
+
+ <xsl:copy-of select="$content"/>
+
+ </a>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:copy-of select="$content"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="function-available('suwl:unwrapLinks')">
+ <xsl:copy-of select="suwl:unwrapLinks($link)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:copy-of select="$link"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="inline.charseq">
+ <xsl:param name="content">
+ <xsl:call-template name="anchor"/>
+ <xsl:call-template name="simple.xlink">
+ <xsl:with-param name="content">
+ <xsl:apply-templates/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:param>
+ <!-- * if you want output from the inline.charseq template wrapped in -->
+ <!-- * something other than a Span, call the template with some value -->
+ <!-- * for the 'wrapper-name' param -->
+ <xsl:param name="wrapper-name">span</xsl:param>
+ <xsl:element name="{$wrapper-name}">
+ <xsl:attribute name="class">
+ <xsl:value-of select="local-name(.)"/>
+ </xsl:attribute>
+ <xsl:call-template name="dir"/>
+ <xsl:call-template name="generate.html.title"/>
+ <xsl:copy-of select="$content"/>
+ <xsl:call-template name="apply-annotations"/>
+ </xsl:element>
+</xsl:template>
+
+<xsl:template name="inline.monoseq">
+ <xsl:param name="content">
+ <xsl:call-template name="anchor"/>
+ <xsl:call-template name="simple.xlink">
+ <xsl:with-param name="content">
+ <xsl:apply-templates/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:param>
+ <code>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:copy-of select="$content"/>
+ <xsl:call-template name="apply-annotations"/>
+ </code>
+</xsl:template>
+
+<xsl:template name="inline.boldseq">
+ <xsl:param name="content">
+ <xsl:call-template name="anchor"/>
+ <xsl:call-template name="simple.xlink">
+ <xsl:with-param name="content">
+ <xsl:apply-templates/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:param>
+
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+
+ <!-- don't put <strong> inside figure, example, or table titles -->
+ <xsl:choose>
+ <xsl:when test="local-name(..) = 'title'
+ and (local-name(../..) = 'figure'
+ or local-name(../..) = 'example'
+ or local-name(../..) = 'table')">
+ <xsl:copy-of select="$content"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <strong>
+ <xsl:copy-of select="$content"/>
+ </strong>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:call-template name="apply-annotations"/>
+ </span>
+</xsl:template>
+
+<xsl:template name="inline.italicseq">
+ <xsl:param name="content">
+ <xsl:call-template name="anchor"/>
+ <xsl:call-template name="simple.xlink">
+ <xsl:with-param name="content">
+ <xsl:apply-templates/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:param>
+ <em>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:copy-of select="$content"/>
+ <xsl:call-template name="apply-annotations"/>
+ </em>
+</xsl:template>
+
+<xsl:template name="inline.boldmonoseq">
+ <xsl:param name="content">
+ <xsl:call-template name="anchor"/>
+ <xsl:call-template name="simple.xlink">
+ <xsl:with-param name="content">
+ <xsl:apply-templates/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:param>
+ <!-- don't put <strong> inside figure, example, or table titles -->
+ <!-- or other titles that may already be represented with <strong>'s. -->
+ <xsl:choose>
+ <xsl:when test="local-name(..) = 'title'
+ and (local-name(../..) = 'figure'
+ or local-name(../..) = 'example'
+ or local-name(../..) = 'table'
+ or local-name(../..) = 'formalpara')">
+ <code>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:copy-of select="$content"/>
+ <xsl:call-template name="apply-annotations"/>
+ </code>
+ </xsl:when>
+ <xsl:otherwise>
+ <strong>
+ <xsl:call-template name="common.html.attributes"/>
+ <code>
+ <xsl:call-template name="generate.html.title"/>
+ <xsl:call-template name="dir"/>
+ <xsl:copy-of select="$content"/>
+ </code>
+ <xsl:call-template name="apply-annotations"/>
+ </strong>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="inline.italicmonoseq">
+ <xsl:param name="content">
+ <xsl:call-template name="anchor"/>
+ <xsl:call-template name="simple.xlink">
+ <xsl:with-param name="content">
+ <xsl:apply-templates/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:param>
+ <em>
+ <xsl:call-template name="common.html.attributes"/>
+ <code>
+ <xsl:call-template name="generate.html.title"/>
+ <xsl:call-template name="dir"/>
+ <xsl:copy-of select="$content"/>
+ <xsl:call-template name="apply-annotations"/>
+ </code>
+ </em>
+</xsl:template>
+
+<xsl:template name="inline.superscriptseq">
+ <xsl:param name="content">
+ <xsl:call-template name="anchor"/>
+ <xsl:call-template name="simple.xlink">
+ <xsl:with-param name="content">
+ <xsl:apply-templates/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:param>
+ <sup>
+ <xsl:call-template name="generate.html.title"/>
+ <xsl:call-template name="dir"/>
+ <xsl:copy-of select="$content"/>
+ <xsl:call-template name="apply-annotations"/>
+ </sup>
+</xsl:template>
+
+<xsl:template name="inline.subscriptseq">
+ <xsl:param name="content">
+ <xsl:call-template name="anchor"/>
+ <xsl:call-template name="simple.xlink">
+ <xsl:with-param name="content">
+ <xsl:apply-templates/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:param>
+ <sub>
+ <xsl:call-template name="generate.html.title"/>
+ <xsl:call-template name="dir"/>
+ <xsl:copy-of select="$content"/>
+ <xsl:call-template name="apply-annotations"/>
+ </sub>
+</xsl:template>
+
+<!-- ==================================================================== -->
+<!-- some special cases -->
+
+<xsl:template match="author">
+ <xsl:param name="content">
+ <xsl:call-template name="anchor"/>
+ <xsl:call-template name="simple.xlink">
+ <xsl:with-param name="content">
+ <xsl:call-template name="person.name"/>
+ </xsl:with-param>
+ </xsl:call-template>
+ <xsl:call-template name="apply-annotations"/>
+ </xsl:param>
+
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:copy-of select="$content"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="editor">
+ <xsl:param name="content">
+ <xsl:call-template name="anchor"/>
+ <xsl:call-template name="simple.xlink">
+ <xsl:with-param name="content">
+ <xsl:call-template name="person.name"/>
+ </xsl:with-param>
+ </xsl:call-template>
+ <xsl:call-template name="apply-annotations"/>
+ </xsl:param>
+
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:copy-of select="$content"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="othercredit">
+ <xsl:param name="content">
+ <xsl:call-template name="anchor"/>
+ <xsl:call-template name="simple.xlink">
+ <xsl:with-param name="content">
+ <xsl:call-template name="person.name"/>
+ </xsl:with-param>
+ </xsl:call-template>
+ <xsl:call-template name="apply-annotations"/>
+ </xsl:param>
+
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:copy-of select="$content"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="authorinitials">
+ <xsl:call-template name="inline.charseq"/>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="accel">
+ <xsl:call-template name="inline.charseq"/>
+</xsl:template>
+
+<xsl:template match="action">
+ <xsl:call-template name="inline.charseq"/>
+</xsl:template>
+
+<xsl:template match="application">
+ <xsl:call-template name="inline.charseq"/>
+</xsl:template>
+
+<xsl:template match="classname">
+ <xsl:call-template name="inline.monoseq"/>
+</xsl:template>
+
+<xsl:template match="exceptionname">
+ <xsl:call-template name="inline.monoseq"/>
+</xsl:template>
+
+<xsl:template match="interfacename">
+ <xsl:call-template name="inline.monoseq"/>
+</xsl:template>
+
+<xsl:template match="methodname">
+ <xsl:call-template name="inline.monoseq"/>
+</xsl:template>
+
+<xsl:template match="command">
+ <xsl:call-template name="inline.boldseq"/>
+</xsl:template>
+
+<xsl:template match="computeroutput">
+ <xsl:call-template name="inline.monoseq"/>
+</xsl:template>
+
+<xsl:template match="constant">
+ <xsl:call-template name="inline.monoseq"/>
+</xsl:template>
+
+<xsl:template match="database">
+ <xsl:call-template name="inline.charseq"/>
+</xsl:template>
+
+<xsl:template match="date">
+ <!-- should this support locale-specific formatting? how? -->
+ <xsl:call-template name="inline.charseq"/>
+</xsl:template>
+
+<xsl:template match="errorcode">
+ <xsl:call-template name="inline.charseq"/>
+</xsl:template>
+
+<xsl:template match="errorname">
+ <xsl:call-template name="inline.charseq"/>
+</xsl:template>
+
+<xsl:template match="errortype">
+ <xsl:call-template name="inline.charseq"/>
+</xsl:template>
+
+<xsl:template match="errortext">
+ <xsl:call-template name="inline.charseq"/>
+</xsl:template>
+
+<xsl:template match="envar">
+ <xsl:call-template name="inline.monoseq"/>
+</xsl:template>
+
+<xsl:template match="filename">
+ <xsl:call-template name="inline.monoseq"/>
+</xsl:template>
+
+<xsl:template match="function">
+ <xsl:choose>
+ <xsl:when test="$function.parens != '0'
+ and (parameter or function or replaceable)">
+ <xsl:variable name="nodes" select="text()|*"/>
+ <xsl:call-template name="inline.monoseq">
+ <xsl:with-param name="content">
+ <xsl:call-template name="simple.xlink">
+ <xsl:with-param name="content">
+ <xsl:apply-templates select="$nodes[1]"/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:with-param>
+ </xsl:call-template>
+ <xsl:text>(</xsl:text>
+ <xsl:apply-templates select="$nodes[position()>1]"/>
+ <xsl:text>)</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="inline.monoseq"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="function/parameter" priority="2">
+ <xsl:call-template name="inline.italicmonoseq"/>
+ <xsl:if test="following-sibling::*">
+ <xsl:text>, </xsl:text>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="function/replaceable" priority="2">
+ <xsl:call-template name="inline.italicmonoseq"/>
+ <xsl:if test="following-sibling::*">
+ <xsl:text>, </xsl:text>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="guibutton">
+ <xsl:call-template name="inline.charseq"/>
+</xsl:template>
+
+<xsl:template match="guiicon">
+ <xsl:call-template name="inline.charseq"/>
+</xsl:template>
+
+<xsl:template match="guilabel">
+ <xsl:call-template name="inline.charseq"/>
+</xsl:template>
+
+<xsl:template match="guimenu">
+ <xsl:call-template name="inline.charseq"/>
+</xsl:template>
+
+<xsl:template match="guimenuitem">
+ <xsl:call-template name="inline.charseq"/>
+</xsl:template>
+
+<xsl:template match="guisubmenu">
+ <xsl:call-template name="inline.charseq"/>
+</xsl:template>
+
+<xsl:template match="hardware">
+ <xsl:call-template name="inline.charseq"/>
+</xsl:template>
+
+<xsl:template match="interface">
+ <xsl:call-template name="inline.charseq"/>
+</xsl:template>
+
+<xsl:template match="interfacedefinition">
+ <xsl:call-template name="inline.charseq"/>
+</xsl:template>
+
+<xsl:template match="keycap">
+ <xsl:call-template name="inline.boldseq"/>
+</xsl:template>
+
+<xsl:template match="keycode">
+ <xsl:call-template name="inline.charseq"/>
+</xsl:template>
+
+<xsl:template match="keysym">
+ <xsl:call-template name="inline.charseq"/>
+</xsl:template>
+
+<xsl:template match="literal">
+ <xsl:call-template name="inline.monoseq"/>
+</xsl:template>
+
+<xsl:template match="code">
+ <xsl:call-template name="inline.monoseq"/>
+</xsl:template>
+
+<xsl:template match="medialabel">
+ <xsl:call-template name="inline.italicseq"/>
+</xsl:template>
+
+<xsl:template match="shortcut">
+ <xsl:call-template name="inline.boldseq"/>
+</xsl:template>
+
+<xsl:template match="mousebutton">
+ <xsl:call-template name="inline.charseq"/>
+</xsl:template>
+
+<xsl:template match="option">
+ <xsl:call-template name="inline.monoseq"/>
+</xsl:template>
+
+<xsl:template match="package">
+ <xsl:call-template name="inline.charseq"/>
+</xsl:template>
+
+<xsl:template match="parameter">
+ <xsl:call-template name="inline.italicmonoseq"/>
+</xsl:template>
+
+<xsl:template match="property">
+ <xsl:call-template name="inline.charseq"/>
+</xsl:template>
+
+<xsl:template match="prompt">
+ <xsl:call-template name="inline.monoseq"/>
+</xsl:template>
+
+<xsl:template match="replaceable" priority="1">
+ <xsl:call-template name="inline.italicmonoseq"/>
+</xsl:template>
+
+<xsl:template match="returnvalue">
+ <xsl:call-template name="inline.charseq"/>
+</xsl:template>
+
+<xsl:template match="structfield">
+ <xsl:call-template name="inline.italicmonoseq"/>
+</xsl:template>
+
+<xsl:template match="structname">
+ <xsl:call-template name="inline.charseq"/>
+</xsl:template>
+
+<xsl:template match="symbol">
+ <xsl:call-template name="inline.charseq"/>
+</xsl:template>
+
+<xsl:template match="systemitem">
+ <xsl:call-template name="inline.monoseq"/>
+</xsl:template>
+
+<xsl:template match="token">
+ <xsl:call-template name="inline.charseq"/>
+</xsl:template>
+
+<xsl:template match="type">
+ <xsl:call-template name="inline.charseq"/>
+</xsl:template>
+
+<xsl:template match="userinput">
+ <xsl:call-template name="inline.boldmonoseq"/>
+</xsl:template>
+
+<xsl:template match="abbrev">
+ <xsl:call-template name="inline.charseq">
+ <xsl:with-param name="wrapper-name">abbr</xsl:with-param>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="acronym">
+ <xsl:call-template name="inline.charseq">
+ <xsl:with-param name="wrapper-name">acronym</xsl:with-param>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="citerefentry">
+ <xsl:choose>
+ <xsl:when test="$citerefentry.link != '0'">
+ <a>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:attribute name="href">
+ <xsl:call-template name="generate.citerefentry.link"/>
+ </xsl:attribute>
+ <xsl:call-template name="inline.charseq"/>
+ </a>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="inline.charseq"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="generate.citerefentry.link">
+ <!-- nop -->
+</xsl:template>
+
+<xsl:template name="x.generate.citerefentry.link">
+ <xsl:text>http://example.com/cgi-bin/man.cgi?</xsl:text>
+ <xsl:value-of select="refentrytitle"/>
+ <xsl:text>(</xsl:text>
+ <xsl:value-of select="manvolnum"/>
+ <xsl:text>)</xsl:text>
+</xsl:template>
+
+<xsl:template match="citetitle">
+ <xsl:choose>
+ <xsl:when test="@pubwork = 'article'">
+ <xsl:call-template name="gentext.startquote"/>
+ <xsl:call-template name="inline.charseq"/>
+ <xsl:call-template name="gentext.endquote"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="inline.italicseq"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="emphasis">
+ <span>
+ <xsl:choose>
+ <!-- We don't want empty @class values, so do not propagate empty @roles -->
+ <xsl:when test="@role and
+ normalize-space(@role) != '' and
+ $emphasis.propagates.style != 0">
+ <xsl:apply-templates select="." mode="common.html.attributes">
+ <xsl:with-param name="class" select="@role"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:call-template name="anchor"/>
+
+ <xsl:call-template name="simple.xlink">
+ <xsl:with-param name="content">
+ <xsl:choose>
+ <xsl:when test="@role = 'bold' or @role='strong'">
+ <!-- backwards compatibility: make bold into b elements, but -->
+ <!-- don't put bold inside figure, example, or table titles -->
+ <xsl:choose>
+ <xsl:when test="local-name(..) = 'title'
+ and (local-name(../..) = 'figure'
+ or local-name(../..) = 'example'
+ or local-name(../..) = 'table')">
+ <xsl:apply-templates/>
+ </xsl:when>
+ <xsl:otherwise>
+ <strong><xsl:apply-templates/></strong>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:when test="@role and $emphasis.propagates.style != 0">
+ <xsl:apply-templates/>
+ </xsl:when>
+ <xsl:otherwise>
+ <em><xsl:apply-templates/></em>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:with-param>
+ </xsl:call-template>
+ </span>
+</xsl:template>
+
+<xsl:template match="foreignphrase">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:call-template name="inline.italicseq"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="markup">
+ <xsl:call-template name="inline.charseq"/>
+</xsl:template>
+
+<xsl:template match="phrase">
+ <span>
+ <xsl:call-template name="locale.html.attributes"/>
+ <!-- We don't want empty @class values, so do not propagate empty @roles -->
+ <xsl:if test="@role and
+ normalize-space(@role) != '' and
+ $phrase.propagates.style != 0">
+ <xsl:apply-templates select="." mode="class.attribute">
+ <xsl:with-param name="class" select="@role"/>
+ </xsl:apply-templates>
+ </xsl:if>
+ <xsl:call-template name="dir"/>
+ <xsl:call-template name="anchor"/>
+ <xsl:call-template name="simple.xlink">
+ <xsl:with-param name="content">
+ <xsl:apply-templates/>
+ </xsl:with-param>
+ </xsl:call-template>
+ <xsl:call-template name="apply-annotations"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="quote">
+ <xsl:variable name="depth">
+ <xsl:call-template name="dot.count">
+ <xsl:with-param name="string">
+ <xsl:number level="multiple"/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:variable>
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:call-template name="anchor"/>
+ <xsl:choose>
+ <xsl:when test="$depth mod 2 = 0">
+ <xsl:call-template name="gentext.startquote"/>
+ <xsl:call-template name="inline.charseq"/>
+ <xsl:call-template name="gentext.endquote"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="gentext.nestedstartquote"/>
+ <xsl:call-template name="inline.charseq"/>
+ <xsl:call-template name="gentext.nestedendquote"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </span>
+</xsl:template>
+
+<xsl:template match="varname">
+ <xsl:call-template name="inline.monoseq"/>
+</xsl:template>
+
+<xsl:template match="wordasword">
+ <xsl:call-template name="inline.italicseq"/>
+</xsl:template>
+
+<xsl:template match="lineannotation">
+ <em>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:call-template name="inline.charseq"/>
+ </em>
+</xsl:template>
+
+<xsl:template match="superscript">
+ <xsl:call-template name="inline.superscriptseq"/>
+</xsl:template>
+
+<xsl:template match="subscript">
+ <xsl:call-template name="inline.subscriptseq"/>
+</xsl:template>
+
+<xsl:template match="trademark">
+ <xsl:call-template name="inline.charseq"/>
+ <xsl:choose>
+ <xsl:when test="@class = 'copyright'
+ or @class = 'registered'">
+ <xsl:call-template name="dingbat">
+ <xsl:with-param name="dingbat" select="@class"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="@class = 'service'">
+ <sup>SM</sup>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="dingbat">
+ <xsl:with-param name="dingbat" select="'trademark'"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="firstterm">
+ <xsl:call-template name="glossterm">
+ <xsl:with-param name="firstterm" select="1"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="glossterm" name="glossterm">
+ <xsl:param name="firstterm" select="0"/>
+
+ <!-- To avoid extra <a name=""> anchor from inline.italicseq -->
+ <xsl:variable name="content">
+ <xsl:apply-templates/>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="($firstterm.only.link = 0 or $firstterm = 1) and @linkend">
+ <xsl:variable name="targets" select="key('id',@linkend)"/>
+ <xsl:variable name="target" select="$targets[1]"/>
+
+ <xsl:call-template name="check.id.unique">
+ <xsl:with-param name="linkend" select="@linkend"/>
+ </xsl:call-template>
+
+ <xsl:choose>
+ <xsl:when test="$target">
+ <a>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:if test="@id or @xml:id">
+ <xsl:attribute name="name">
+ <xsl:value-of select="(@id|@xml:id)[1]"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:attribute name="href">
+ <xsl:call-template name="href.target">
+ <xsl:with-param name="object" select="$target"/>
+ </xsl:call-template>
+ </xsl:attribute>
+
+ <xsl:call-template name="inline.italicseq">
+ <xsl:with-param name="content" select="$content"/>
+ </xsl:call-template>
+ </a>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="inline.italicseq">
+ <xsl:with-param name="content" select="$content"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+
+ <xsl:when test="not(@linkend)
+ and ($firstterm.only.link = 0 or $firstterm = 1)
+ and ($glossterm.auto.link != 0)
+ and $glossary.collection != ''">
+ <xsl:variable name="term">
+ <xsl:choose>
+ <xsl:when test="@baseform"><xsl:value-of select="@baseform"/></xsl:when>
+ <xsl:otherwise><xsl:value-of select="."/></xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="cterm"
+ select="(document($glossary.collection,.)//glossentry[glossterm=$term])[1]"/>
+
+ <!-- HACK HACK HACK! But it works... -->
+ <!-- You'd need to do more work if you wanted to chunk on glossdiv, though -->
+
+ <xsl:variable name="glossary" select="//glossary[@role='auto']"/>
+
+ <xsl:if test="count($glossary) != 1">
+ <xsl:message>
+ <xsl:text>Warning: glossary.collection specified, but there are </xsl:text>
+ <xsl:value-of select="count($glossary)"/>
+ <xsl:text> automatic glossaries</xsl:text>
+ </xsl:message>
+ </xsl:if>
+
+ <xsl:variable name="glosschunk">
+ <xsl:call-template name="href.target">
+ <xsl:with-param name="object" select="$glossary"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="chunkbase">
+ <xsl:choose>
+ <xsl:when test="contains($glosschunk, '#')">
+ <xsl:value-of select="substring-before($glosschunk, '#')"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$glosschunk"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="not($cterm)">
+ <xsl:message>
+ <xsl:text>There's no entry for </xsl:text>
+ <xsl:value-of select="$term"/>
+ <xsl:text> in </xsl:text>
+ <xsl:value-of select="$glossary.collection"/>
+ </xsl:message>
+ <xsl:call-template name="inline.italicseq"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id">
+ <xsl:with-param name="object" select="$cterm"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <a href="{$chunkbase}#{$id}">
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:call-template name="inline.italicseq">
+ <xsl:with-param name="content" select="$content"/>
+ </xsl:call-template>
+ </a>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+
+ <xsl:when test="not(@linkend)
+ and ($firstterm.only.link = 0 or $firstterm = 1)
+ and $glossterm.auto.link != 0">
+ <xsl:variable name="term">
+ <xsl:choose>
+ <xsl:when test="@baseform">
+ <xsl:value-of select="normalize-space(@baseform)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="normalize-space(.)"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:variable name="targets"
+ select="key('glossentries', $term)"/>
+ <xsl:variable name="target" select="$targets[1]"/>
+
+ <xsl:choose>
+ <xsl:when test="count($targets)=0">
+ <xsl:message>
+ <xsl:text>Error: no glossentry for glossterm: </xsl:text>
+ <xsl:value-of select="."/>
+ <xsl:text>.</xsl:text>
+ </xsl:message>
+ <xsl:call-template name="inline.italicseq"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <a>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:if test="@id or @xml:id">
+ <xsl:attribute name="name">
+ <xsl:value-of select="(@id|@xml:id)[1]"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:attribute name="href">
+ <xsl:call-template name="href.target">
+ <xsl:with-param name="object" select="$target"/>
+ </xsl:call-template>
+ </xsl:attribute>
+
+ <xsl:call-template name="inline.italicseq">
+ <xsl:with-param name="content" select="$content"/>
+ </xsl:call-template>
+ </a>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+
+ <xsl:otherwise>
+ <xsl:call-template name="inline.italicseq"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="termdef">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:call-template name="gentext.template">
+ <xsl:with-param name="context" select="'termdef'"/>
+ <xsl:with-param name="name" select="'prefix'"/>
+ </xsl:call-template>
+ <xsl:apply-templates/>
+ <xsl:call-template name="gentext.template">
+ <xsl:with-param name="context" select="'termdef'"/>
+ <xsl:with-param name="name" select="'suffix'"/>
+ </xsl:call-template>
+ </span>
+</xsl:template>
+
+<xsl:template match="sgmltag|tag">
+ <xsl:call-template name="format.sgmltag"/>
+</xsl:template>
+
+<xsl:template name="format.sgmltag">
+ <xsl:param name="class">
+ <xsl:choose>
+ <xsl:when test="@class">
+ <xsl:value-of select="@class"/>
+ </xsl:when>
+ <xsl:otherwise>element</xsl:otherwise>
+ </xsl:choose>
+ </xsl:param>
+
+ <xsl:variable name="content">
+ <xsl:choose>
+ <xsl:when test="$class='attribute'">
+ <xsl:apply-templates/>
+ </xsl:when>
+ <xsl:when test="$class='attvalue'">
+ <xsl:apply-templates/>
+ </xsl:when>
+ <xsl:when test="$class='element'">
+ <xsl:apply-templates/>
+ </xsl:when>
+ <xsl:when test="$class='endtag'">
+ <xsl:text>&lt;/</xsl:text>
+ <xsl:apply-templates/>
+ <xsl:text>&gt;</xsl:text>
+ </xsl:when>
+ <xsl:when test="$class='genentity'">
+ <xsl:text>&amp;</xsl:text>
+ <xsl:apply-templates/>
+ <xsl:text>;</xsl:text>
+ </xsl:when>
+ <xsl:when test="$class='numcharref'">
+ <xsl:text>&amp;#</xsl:text>
+ <xsl:apply-templates/>
+ <xsl:text>;</xsl:text>
+ </xsl:when>
+ <xsl:when test="$class='paramentity'">
+ <xsl:text>%</xsl:text>
+ <xsl:apply-templates/>
+ <xsl:text>;</xsl:text>
+ </xsl:when>
+ <xsl:when test="$class='pi'">
+ <xsl:text>&lt;?</xsl:text>
+ <xsl:apply-templates/>
+ <xsl:text>&gt;</xsl:text>
+ </xsl:when>
+ <xsl:when test="$class='xmlpi'">
+ <xsl:text>&lt;?</xsl:text>
+ <xsl:apply-templates/>
+ <xsl:text>?&gt;</xsl:text>
+ </xsl:when>
+ <xsl:when test="$class='starttag'">
+ <xsl:text>&lt;</xsl:text>
+ <xsl:apply-templates/>
+ <xsl:text>&gt;</xsl:text>
+ </xsl:when>
+ <xsl:when test="$class='emptytag'">
+ <xsl:text>&lt;</xsl:text>
+ <xsl:apply-templates/>
+ <xsl:text>/&gt;</xsl:text>
+ </xsl:when>
+ <xsl:when test="$class='sgmlcomment' or $class='comment'">
+ <xsl:text>&lt;!--</xsl:text>
+ <xsl:apply-templates/>
+ <xsl:text>--&gt;</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <code>
+ <xsl:apply-templates select="." mode="common.html.attributes">
+ <xsl:with-param name="class" select="concat('sgmltag-', $class)"/>
+ </xsl:apply-templates>
+ <xsl:call-template name="simple.xlink">
+ <xsl:with-param name="content" select="$content"/>
+ </xsl:call-template>
+ </code>
+</xsl:template>
+
+<xsl:template match="email">
+ <xsl:call-template name="inline.monoseq">
+ <xsl:with-param name="content">
+ <xsl:if test="not($email.delimiters.enabled = 0)">
+ <xsl:text>&lt;</xsl:text>
+ </xsl:if>
+ <a>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:attribute name="href">
+ <xsl:text>mailto:</xsl:text>
+ <xsl:value-of select="."/>
+ </xsl:attribute>
+ <xsl:apply-templates/>
+ </a>
+ <xsl:if test="not($email.delimiters.enabled = 0)">
+ <xsl:text>&gt;</xsl:text>
+ </xsl:if>
+ </xsl:with-param>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="keycombo">
+ <xsl:variable name="action" select="@action"/>
+ <xsl:variable name="joinchar">
+ <xsl:choose>
+ <xsl:when test="$action='seq'"><xsl:text> </xsl:text></xsl:when>
+ <xsl:when test="$action='simul'">+</xsl:when>
+ <xsl:when test="$action='press'">-</xsl:when>
+ <xsl:when test="$action='click'">-</xsl:when>
+ <xsl:when test="$action='double-click'">-</xsl:when>
+ <xsl:when test="$action='other'"></xsl:when>
+ <xsl:otherwise>+</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:for-each select="*">
+ <xsl:if test="position()>1"><xsl:value-of select="$joinchar"/></xsl:if>
+ <xsl:apply-templates select="."/>
+ </xsl:for-each>
+</xsl:template>
+
+<xsl:template match="uri">
+ <xsl:call-template name="inline.monoseq"/>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="menuchoice">
+ <xsl:variable name="shortcut" select="./shortcut"/>
+ <xsl:call-template name="process.menuchoice"/>
+ <xsl:if test="$shortcut">
+ <xsl:text> (</xsl:text>
+ <xsl:apply-templates select="$shortcut"/>
+ <xsl:text>)</xsl:text>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template name="process.menuchoice">
+ <xsl:param name="nodelist" select="guibutton|guiicon|guilabel|guimenu|guimenuitem|guisubmenu|interface"/><!-- not(shortcut) -->
+ <xsl:param name="count" select="1"/>
+
+ <xsl:choose>
+ <xsl:when test="$count>count($nodelist)"></xsl:when>
+ <xsl:when test="$count=1">
+ <xsl:apply-templates select="$nodelist[$count=position()]"/>
+ <xsl:call-template name="process.menuchoice">
+ <xsl:with-param name="nodelist" select="$nodelist"/>
+ <xsl:with-param name="count" select="$count+1"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:variable name="node" select="$nodelist[$count=position()]"/>
+ <xsl:choose>
+ <xsl:when test="local-name($node)='guimenuitem'
+ or local-name($node)='guisubmenu'">
+ <xsl:value-of select="$menuchoice.menu.separator"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$menuchoice.separator"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:apply-templates select="$node"/>
+ <xsl:call-template name="process.menuchoice">
+ <xsl:with-param name="nodelist" select="$nodelist"/>
+ <xsl:with-param name="count" select="$count+1"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="optional">
+ <xsl:value-of select="$arg.choice.opt.open.str"/>
+ <xsl:call-template name="inline.charseq"/>
+ <xsl:value-of select="$arg.choice.opt.close.str"/>
+</xsl:template>
+
+<xsl:template match="citation">
+ <!-- todo: integrate with bibliography collection -->
+ <xsl:variable name="targets" select="(//biblioentry | //bibliomixed)[abbrev = string(current())]"/>
+ <xsl:variable name="target" select="$targets[1]"/>
+
+ <xsl:choose>
+ <!-- try automatic linking based on match to abbrev -->
+ <xsl:when test="$target and not(xref) and not(link)">
+
+ <xsl:text>[</xsl:text>
+ <a>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:attribute name="href">
+ <xsl:call-template name="href.target">
+ <xsl:with-param name="object" select="$target"/>
+ </xsl:call-template>
+ </xsl:attribute>
+
+ <xsl:choose>
+ <xsl:when test="$bibliography.numbered != 0">
+ <xsl:apply-templates select="$target" mode="citation"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="inline.charseq"/>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ </a>
+ <xsl:text>]</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text>[</xsl:text>
+ <xsl:call-template name="inline.charseq"/>
+ <xsl:text>]</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="citebiblioid">
+ <xsl:variable name="targets" select="//*[biblioid = string(current())]"/>
+ <xsl:variable name="target" select="$targets[1]"/>
+
+ <xsl:choose>
+ <!-- try automatic linking based on match to parent of biblioid -->
+ <xsl:when test="$target and not(xref) and not(link)">
+
+ <xsl:text>[</xsl:text>
+ <a>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:attribute name="href">
+ <xsl:call-template name="href.target">
+ <xsl:with-param name="object" select="$target"/>
+ </xsl:call-template>
+ </xsl:attribute>
+
+ <xsl:call-template name="inline.charseq"/>
+
+ </a>
+ <xsl:text>]</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text>[</xsl:text>
+ <xsl:call-template name="inline.charseq"/>
+ <xsl:text>]</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="biblioentry|bibliomixed" mode="citation">
+ <xsl:number from="bibliography" count="biblioentry|bibliomixed"
+ level="any" format="1"/>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="comment[&comment.block.parents;]|remark[&comment.block.parents;]">
+ <xsl:if test="$show.comments != 0">
+ <p class="remark"><em><xsl:call-template name="inline.charseq"/></em></p>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="comment|remark">
+ <xsl:if test="$show.comments != 0">
+ <em><xsl:call-template name="inline.charseq"/></em>
+ </xsl:if>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="productname">
+ <xsl:call-template name="inline.charseq"/>
+ <xsl:if test="@class">
+ <xsl:call-template name="dingbat">
+ <xsl:with-param name="dingbat" select="@class"/>
+ </xsl:call-template>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="productnumber">
+ <xsl:call-template name="inline.charseq"/>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="pob|street|city|state|postcode|country|otheraddr">
+ <xsl:call-template name="inline.charseq"/>
+</xsl:template>
+
+<xsl:template match="phone|fax">
+ <xsl:call-template name="inline.charseq"/>
+</xsl:template>
+
+<!-- in Addresses, for example -->
+<xsl:template match="honorific|firstname|surname|lineage|othername">
+ <xsl:call-template name="inline.charseq"/>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="person">
+ <xsl:param name="content">
+ <xsl:call-template name="anchor"/>
+ <xsl:call-template name="simple.xlink">
+ <xsl:with-param name="content">
+ <xsl:apply-templates select="personname"/>
+ </xsl:with-param>
+ </xsl:call-template>
+ <xsl:call-template name="apply-annotations"/>
+ </xsl:param>
+
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:copy-of select="$content"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="personname">
+ <xsl:param name="content">
+ <xsl:call-template name="anchor"/>
+ <xsl:call-template name="simple.xlink">
+ <xsl:with-param name="content">
+ <xsl:call-template name="person.name"/>
+ </xsl:with-param>
+ </xsl:call-template>
+ <xsl:call-template name="apply-annotations"/>
+ </xsl:param>
+
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:copy-of select="$content"/>
+ </span>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="org">
+ <xsl:param name="content">
+ <xsl:call-template name="anchor"/>
+ <xsl:call-template name="simple.xlink">
+ <xsl:with-param name="content">
+ <xsl:apply-templates/>
+ </xsl:with-param>
+ </xsl:call-template>
+ <xsl:call-template name="apply-annotations"/>
+ </xsl:param>
+
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:copy-of select="$content"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="orgname">
+ <xsl:param name="content">
+ <xsl:call-template name="anchor"/>
+ <xsl:call-template name="simple.xlink">
+ <xsl:with-param name="content">
+ <xsl:apply-templates/>
+ </xsl:with-param>
+ </xsl:call-template>
+ <xsl:call-template name="apply-annotations"/>
+ </xsl:param>
+
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:copy-of select="$content"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="orgdiv">
+ <xsl:param name="content">
+ <xsl:call-template name="anchor"/>
+ <xsl:call-template name="simple.xlink">
+ <xsl:with-param name="content">
+ <xsl:apply-templates/>
+ </xsl:with-param>
+ </xsl:call-template>
+ <xsl:call-template name="apply-annotations"/>
+ </xsl:param>
+
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:copy-of select="$content"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="affiliation">
+ <xsl:param name="content">
+ <xsl:call-template name="anchor"/>
+ <xsl:call-template name="simple.xlink">
+ <xsl:with-param name="content">
+ <xsl:call-template name="person.name"/>
+ </xsl:with-param>
+ </xsl:call-template>
+ <xsl:call-template name="apply-annotations"/>
+ </xsl:param>
+
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:copy-of select="$content"/>
+ </span>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="beginpage">
+ <!-- does nothing; this *is not* markup to force a page break. -->
+</xsl:template>
+
+</xsl:stylesheet>
+
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/keywords.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/keywords.xsl
new file mode 100644
index 0000000..c12e39f
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/keywords.xsl
@@ -0,0 +1,35 @@
+<?xml version='1.0'?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version='1.0'>
+
+<!-- ********************************************************************
+ $Id: keywords.xsl 6910 2007-06-28 23:23:30Z xmldoc $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<xsl:template match="keywordset"></xsl:template>
+<xsl:template match="subjectset"></xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="keywordset" mode="html.header">
+ <meta name="keywords">
+ <xsl:attribute name="content">
+ <xsl:apply-templates select="keyword" mode="html.header"/>
+ </xsl:attribute>
+ </meta>
+</xsl:template>
+
+<xsl:template match="keyword" mode="html.header">
+ <xsl:apply-templates/>
+ <xsl:if test="following-sibling::keyword">, </xsl:if>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/lists.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/lists.xsl
new file mode 100644
index 0000000..52123b0
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/lists.xsl
@@ -0,0 +1,1183 @@
+<?xml version='1.0'?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version='1.0'>
+
+<!-- ********************************************************************
+ $Id: lists.xsl 8524 2009-10-10 02:45:47Z abdelazer $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<!-- ==================================================================== -->
+
+<xsl:template match="itemizedlist">
+ <div>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:call-template name="anchor"/>
+ <xsl:if test="title">
+ <xsl:call-template name="formal.object.heading"/>
+ </xsl:if>
+
+ <!-- Preserve order of PIs and comments -->
+ <xsl:apply-templates
+ select="*[not(self::listitem
+ or self::title
+ or self::titleabbrev)]
+ |comment()[not(preceding-sibling::listitem)]
+ |processing-instruction()[not(preceding-sibling::listitem)]"/>
+
+ <ul>
+ <xsl:call-template name="generate.class.attribute"/>
+ <xsl:if test="$css.decoration != 0">
+ <xsl:attribute name="type">
+ <xsl:call-template name="list.itemsymbol"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:if test="@spacing='compact'">
+ <xsl:attribute name="compact">
+ <xsl:value-of select="@spacing"/>
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:apply-templates
+ select="listitem
+ |comment()[preceding-sibling::listitem]
+ |processing-instruction()[preceding-sibling::listitem]"/>
+ </ul>
+ </div>
+</xsl:template>
+
+<xsl:template match="itemizedlist/title">
+ <!-- nop -->
+</xsl:template>
+
+<xsl:template match="itemizedlist/listitem">
+ <xsl:variable name="mark" select="../@mark"/>
+ <xsl:variable name="override" select="@override"/>
+
+ <xsl:variable name="usemark">
+ <xsl:choose>
+ <xsl:when test="$override != ''">
+ <xsl:value-of select="$override"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$mark"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="cssmark">
+ <xsl:choose>
+ <xsl:when test="$usemark = 'opencircle'">circle</xsl:when>
+ <xsl:when test="$usemark = 'bullet'">disc</xsl:when>
+ <xsl:when test="$usemark = 'box'">square</xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$usemark"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <li>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:if test="$css.decoration = '1' and $cssmark != ''">
+ <xsl:attribute name="style">
+ <xsl:text>list-style-type: </xsl:text>
+ <xsl:value-of select="$cssmark"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <!-- we can't just drop the anchor in since some browsers (Opera)
+ get confused about line breaks if we do. So if the first child
+ is a para, assume the para will put in the anchor. Otherwise,
+ put the anchor in anyway. -->
+ <xsl:if test="local-name(child::*[1]) != 'para'">
+ <xsl:call-template name="anchor"/>
+ </xsl:if>
+
+ <xsl:choose>
+ <xsl:when test="$show.revisionflag != 0 and @revisionflag">
+ <div class="{@revisionflag}">
+ <xsl:apply-templates/>
+ </div>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </li>
+</xsl:template>
+
+<xsl:template match="orderedlist">
+ <xsl:variable name="start">
+ <xsl:call-template name="orderedlist-starting-number"/>
+ </xsl:variable>
+
+ <xsl:variable name="numeration">
+ <xsl:call-template name="list.numeration"/>
+ </xsl:variable>
+
+ <xsl:variable name="type">
+ <xsl:choose>
+ <xsl:when test="$numeration='arabic'">1</xsl:when>
+ <xsl:when test="$numeration='loweralpha'">a</xsl:when>
+ <xsl:when test="$numeration='lowerroman'">i</xsl:when>
+ <xsl:when test="$numeration='upperalpha'">A</xsl:when>
+ <xsl:when test="$numeration='upperroman'">I</xsl:when>
+ <!-- What!? This should never happen -->
+ <xsl:otherwise>
+ <xsl:message>
+ <xsl:text>Unexpected numeration: </xsl:text>
+ <xsl:value-of select="$numeration"/>
+ </xsl:message>
+ <xsl:value-of select="1"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <div>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:call-template name="anchor"/>
+
+ <xsl:if test="title">
+ <xsl:call-template name="formal.object.heading"/>
+ </xsl:if>
+
+ <!-- Preserve order of PIs and comments -->
+ <xsl:apply-templates
+ select="*[not(self::listitem
+ or self::title
+ or self::titleabbrev)]
+ |comment()[not(preceding-sibling::listitem)]
+ |processing-instruction()[not(preceding-sibling::listitem)]"/>
+
+ <xsl:choose>
+ <xsl:when test="@inheritnum='inherit' and ancestor::listitem[parent::orderedlist]">
+ <table border="0">
+ <xsl:call-template name="generate.class.attribute"/>
+ <col align="{$direction.align.start}" valign="top"/>
+ <tbody>
+ <xsl:apply-templates
+ mode="orderedlist-table"
+ select="listitem
+ |comment()[preceding-sibling::listitem]
+ |processing-instruction()[preceding-sibling::listitem]"/>
+ </tbody>
+ </table>
+ </xsl:when>
+ <xsl:otherwise>
+ <ol>
+ <xsl:call-template name="generate.class.attribute"/>
+ <xsl:if test="$start != '1'">
+ <xsl:attribute name="start">
+ <xsl:value-of select="$start"/>
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:if test="$numeration != ''">
+ <xsl:attribute name="type">
+ <xsl:value-of select="$type"/>
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:if test="@spacing='compact'">
+ <xsl:attribute name="compact">
+ <xsl:value-of select="@spacing"/>
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:apply-templates
+ select="listitem
+ |comment()[preceding-sibling::listitem]
+ |processing-instruction()[preceding-sibling::listitem]"/>
+ </ol>
+ </xsl:otherwise>
+ </xsl:choose>
+ </div>
+</xsl:template>
+
+<xsl:template match="orderedlist/title">
+ <!-- nop -->
+</xsl:template>
+
+<xsl:template match="orderedlist/listitem">
+ <li>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:if test="@override">
+ <xsl:attribute name="value">
+ <xsl:value-of select="@override"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <!-- we can't just drop the anchor in since some browsers (Opera)
+ get confused about line breaks if we do. So if the first child
+ is a para, assume the para will put in the anchor. Otherwise,
+ put the anchor in anyway. -->
+ <xsl:if test="local-name(child::*[1]) != 'para'">
+ <xsl:call-template name="anchor"/>
+ </xsl:if>
+
+ <xsl:choose>
+ <xsl:when test="$show.revisionflag != 0 and @revisionflag">
+ <div class="{@revisionflag}">
+ <xsl:apply-templates/>
+ </div>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </li>
+</xsl:template>
+
+<xsl:template match="orderedlist/listitem" mode="orderedlist-table">
+ <tr>
+ <td>
+ <xsl:apply-templates select="." mode="item-number"/>
+ </td>
+ <td>
+ <xsl:if test="local-name(child::*[1]) != 'para'">
+ <xsl:call-template name="anchor"/>
+ </xsl:if>
+
+ <xsl:choose>
+ <xsl:when test="$show.revisionflag != 0 and @revisionflag">
+ <div class="{@revisionflag}">
+ <xsl:apply-templates/>
+ </div>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </td>
+ </tr>
+</xsl:template>
+
+<xsl:template match="variablelist">
+ <xsl:variable name="pi-presentation">
+ <xsl:call-template name="pi.dbhtml_list-presentation"/>
+ </xsl:variable>
+
+ <xsl:variable name="presentation">
+ <xsl:choose>
+ <xsl:when test="$pi-presentation != ''">
+ <xsl:value-of select="$pi-presentation"/>
+ </xsl:when>
+ <xsl:when test="$variablelist.as.table != 0">
+ <xsl:value-of select="'table'"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="'list'"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="list-width">
+ <xsl:call-template name="pi.dbhtml_list-width"/>
+ </xsl:variable>
+
+ <xsl:variable name="term-width">
+ <xsl:call-template name="pi.dbhtml_term-width"/>
+ </xsl:variable>
+
+ <xsl:variable name="table-summary">
+ <xsl:call-template name="pi.dbhtml_table-summary"/>
+ </xsl:variable>
+
+ <div>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:call-template name="anchor"/>
+ <xsl:if test="title">
+ <xsl:call-template name="formal.object.heading"/>
+ </xsl:if>
+
+ <xsl:choose>
+ <xsl:when test="$presentation = 'table'">
+ <!-- Preserve order of PIs and comments -->
+ <xsl:apply-templates
+ select="*[not(self::varlistentry
+ or self::title
+ or self::titleabbrev)]
+ |comment()[not(preceding-sibling::varlistentry)]
+ |processing-instruction()[not(preceding-sibling::varlistentry)]"/>
+ <table border="0">
+ <xsl:if test="$list-width != ''">
+ <xsl:attribute name="width">
+ <xsl:value-of select="$list-width"/>
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:if test="$table-summary != ''">
+ <xsl:attribute name="summary">
+ <xsl:value-of select="$table-summary"/>
+ </xsl:attribute>
+ </xsl:if>
+ <col align="{$direction.align.start}" valign="top">
+ <xsl:if test="$term-width != ''">
+ <xsl:attribute name="width">
+ <xsl:value-of select="$term-width"/>
+ </xsl:attribute>
+ </xsl:if>
+ </col>
+ <tbody>
+ <xsl:apply-templates mode="varlist-table"
+ select="varlistentry
+ |comment()[preceding-sibling::varlistentry]
+ |processing-instruction()[preceding-sibling::varlistentry]"/>
+ </tbody>
+ </table>
+ </xsl:when>
+ <xsl:otherwise>
+ <!-- Preserve order of PIs and comments -->
+ <xsl:apply-templates
+ select="*[not(self::varlistentry
+ or self::title
+ or self::titleabbrev)]
+ |comment()[not(preceding-sibling::varlistentry)]
+ |processing-instruction()[not(preceding-sibling::varlistentry)]"/>
+ <dl>
+ <xsl:apply-templates
+ select="varlistentry
+ |comment()[preceding-sibling::varlistentry]
+ |processing-instruction()[preceding-sibling::varlistentry]"/>
+ </dl>
+ </xsl:otherwise>
+ </xsl:choose>
+ </div>
+</xsl:template>
+
+<xsl:template match="variablelist/title">
+ <!-- nop -->
+</xsl:template>
+
+<xsl:template match="itemizedlist/titleabbrev|orderedlist/titleabbrev">
+ <!--nop-->
+</xsl:template>
+
+<xsl:template match="variablelist/titleabbrev">
+ <!--nop-->
+</xsl:template>
+
+<xsl:template match="listitem" mode="xref">
+ <xsl:number format="1"/>
+</xsl:template>
+
+<xsl:template match="listitem/simpara" priority="2">
+ <!-- If a listitem contains only a single simpara, don't output
+ the <p> wrapper; this has the effect of creating an li
+ with simple text content. -->
+ <xsl:choose>
+ <xsl:when test="not(preceding-sibling::*)
+ and not (following-sibling::*)">
+ <xsl:call-template name="anchor"/>
+ <xsl:apply-templates/>
+ </xsl:when>
+ <xsl:otherwise>
+ <p>
+ <xsl:choose>
+ <xsl:when test="@role and $para.propagates.style != 0">
+ <xsl:call-template name="common.html.attributes">
+ <xsl:with-param name="class" select="@role"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="common.html.attributes"/>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:call-template name="anchor"/>
+ <xsl:apply-templates/>
+ </p>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="varlistentry">
+ <dt>
+ <xsl:call-template name="anchor"/>
+ <xsl:apply-templates select="term"/>
+ </dt>
+ <dd>
+ <xsl:apply-templates select="listitem"/>
+ </dd>
+</xsl:template>
+
+<xsl:template match="varlistentry" mode="varlist-table">
+ <xsl:variable name="presentation">
+ <xsl:call-template name="pi.dbhtml_term-presentation">
+ <xsl:with-param name="node" select=".."/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="separator">
+ <xsl:call-template name="pi.dbhtml_term-separator">
+ <xsl:with-param name="node" select=".."/>
+ </xsl:call-template>
+ </xsl:variable>
+ <tr>
+ <xsl:call-template name="tr.attributes">
+ <xsl:with-param name="rownum">
+ <xsl:number from="variablelist" count="varlistentry"/>
+ </xsl:with-param>
+ </xsl:call-template>
+
+ <td>
+ <p>
+ <xsl:call-template name="anchor"/>
+ <xsl:choose>
+ <xsl:when test="$presentation = 'bold'">
+ <strong>
+ <xsl:apply-templates select="term"/>
+ <xsl:value-of select="$separator"/>
+ </strong>
+ </xsl:when>
+ <xsl:when test="$presentation = 'italic'">
+ <em>
+ <xsl:apply-templates select="term"/>
+ <xsl:value-of select="$separator"/>
+ </em>
+ </xsl:when>
+ <xsl:when test="$presentation = 'bold-italic'">
+ <strong>
+ <em>
+ <xsl:apply-templates select="term"/>
+ <xsl:value-of select="$separator"/>
+ </em>
+ </strong>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="term"/>
+ <xsl:value-of select="$separator"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </p>
+ </td>
+ <td>
+ <xsl:apply-templates select="listitem"/>
+ </td>
+ </tr>
+</xsl:template>
+
+<xsl:template match="varlistentry/term">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:call-template name="anchor"/>
+ <xsl:call-template name="simple.xlink">
+ <xsl:with-param name="content">
+ <xsl:apply-templates/>
+ </xsl:with-param>
+ </xsl:call-template>
+ <xsl:choose>
+ <xsl:when test="position() = last()"/> <!-- do nothing -->
+ <xsl:otherwise>
+ <!-- * if we have multiple terms in the same varlistentry, generate -->
+ <!-- * a separator (", " by default) and/or an additional line -->
+ <!-- * break after each one except the last -->
+ <xsl:value-of select="$variablelist.term.separator"/>
+ <xsl:if test="not($variablelist.term.break.after = '0')">
+ <br/>
+ </xsl:if>
+ </xsl:otherwise>
+ </xsl:choose>
+ </span>
+</xsl:template>
+
+<xsl:template match="varlistentry/listitem">
+ <!-- we can't just drop the anchor in since some browsers (Opera)
+ get confused about line breaks if we do. So if the first child
+ is a para, assume the para will put in the anchor. Otherwise,
+ put the anchor in anyway. -->
+ <xsl:if test="local-name(child::*[1]) != 'para'">
+ <xsl:call-template name="anchor"/>
+ </xsl:if>
+
+ <xsl:choose>
+ <xsl:when test="$show.revisionflag != 0 and @revisionflag">
+ <div class="{@revisionflag}">
+ <xsl:apply-templates/>
+ </div>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="simplelist">
+ <!-- with no type specified, the default is 'vert' -->
+ <xsl:call-template name="anchor"/>
+ <table border="0" summary="Simple list">
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:call-template name="simplelist.vert">
+ <xsl:with-param name="cols">
+ <xsl:choose>
+ <xsl:when test="@columns">
+ <xsl:value-of select="@columns"/>
+ </xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:with-param>
+ </xsl:call-template>
+ </table>
+</xsl:template>
+
+<xsl:template match="simplelist[@type='inline']">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <!-- if dbchoice PI exists, use that to determine the choice separator -->
+ <!-- (that is, equivalent of "and" or "or" in current locale), or literal -->
+ <!-- value of "choice" otherwise -->
+ <xsl:variable name="localized-choice-separator">
+ <xsl:choose>
+ <xsl:when test="processing-instruction('dbchoice')">
+ <xsl:call-template name="select.choice.separator"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <!-- empty -->
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:for-each select="member">
+ <xsl:call-template name="simple.xlink">
+ <xsl:with-param name="content">
+ <xsl:apply-templates/>
+ </xsl:with-param>
+ </xsl:call-template>
+ <xsl:choose>
+ <xsl:when test="position() = last()"/> <!-- do nothing -->
+ <xsl:otherwise>
+ <xsl:text>, </xsl:text>
+ <xsl:if test="position() = last() - 1">
+ <xsl:if test="$localized-choice-separator != ''">
+ <xsl:value-of select="$localized-choice-separator"/>
+ <xsl:text> </xsl:text>
+ </xsl:if>
+ </xsl:if>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:for-each>
+ </span>
+</xsl:template>
+
+<xsl:template match="simplelist[@type='horiz']">
+ <xsl:call-template name="anchor"/>
+ <table border="0" summary="Simple list">
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:call-template name="simplelist.horiz">
+ <xsl:with-param name="cols">
+ <xsl:choose>
+ <xsl:when test="@columns">
+ <xsl:value-of select="@columns"/>
+ </xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:with-param>
+ </xsl:call-template>
+ </table>
+</xsl:template>
+
+<xsl:template match="simplelist[@type='vert']">
+ <xsl:call-template name="anchor"/>
+ <table border="0" summary="Simple list">
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:call-template name="simplelist.vert">
+ <xsl:with-param name="cols">
+ <xsl:choose>
+ <xsl:when test="@columns">
+ <xsl:value-of select="@columns"/>
+ </xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:with-param>
+ </xsl:call-template>
+ </table>
+</xsl:template>
+
+<xsl:template name="simplelist.horiz">
+ <xsl:param name="cols">1</xsl:param>
+ <xsl:param name="cell">1</xsl:param>
+ <xsl:param name="members" select="./member"/>
+
+ <xsl:if test="$cell &lt;= count($members)">
+ <tr>
+ <xsl:call-template name="tr.attributes">
+ <xsl:with-param name="row" select="$members[1]"/>
+ <xsl:with-param name="rownum" select="(($cell - 1) div $cols) + 1"/>
+ </xsl:call-template>
+
+ <xsl:call-template name="simplelist.horiz.row">
+ <xsl:with-param name="cols" select="$cols"/>
+ <xsl:with-param name="cell" select="$cell"/>
+ <xsl:with-param name="members" select="$members"/>
+ </xsl:call-template>
+ </tr>
+ <xsl:call-template name="simplelist.horiz">
+ <xsl:with-param name="cols" select="$cols"/>
+ <xsl:with-param name="cell" select="$cell + $cols"/>
+ <xsl:with-param name="members" select="$members"/>
+ </xsl:call-template>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template name="simplelist.horiz.row">
+ <xsl:param name="cols">1</xsl:param>
+ <xsl:param name="cell">1</xsl:param>
+ <xsl:param name="members" select="./member"/>
+ <xsl:param name="curcol">1</xsl:param>
+
+ <xsl:if test="$curcol &lt;= $cols">
+ <td>
+ <xsl:choose>
+ <xsl:when test="$members[position()=$cell]">
+ <xsl:apply-templates select="$members[position()=$cell]"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text>&#160;</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ </td>
+ <xsl:call-template name="simplelist.horiz.row">
+ <xsl:with-param name="cols" select="$cols"/>
+ <xsl:with-param name="cell" select="$cell+1"/>
+ <xsl:with-param name="members" select="$members"/>
+ <xsl:with-param name="curcol" select="$curcol+1"/>
+ </xsl:call-template>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template name="simplelist.vert">
+ <xsl:param name="cols">1</xsl:param>
+ <xsl:param name="cell">1</xsl:param>
+ <xsl:param name="members" select="./member"/>
+ <xsl:param name="rows"
+ select="floor((count($members)+$cols - 1) div $cols)"/>
+
+ <xsl:if test="$cell &lt;= $rows">
+ <tr>
+ <xsl:call-template name="tr.attributes">
+ <xsl:with-param name="row" select="$members[1]"/>
+ <xsl:with-param name="rownum" select="$cell"/>
+ </xsl:call-template>
+
+ <xsl:call-template name="simplelist.vert.row">
+ <xsl:with-param name="cols" select="$cols"/>
+ <xsl:with-param name="rows" select="$rows"/>
+ <xsl:with-param name="cell" select="$cell"/>
+ <xsl:with-param name="members" select="$members"/>
+ </xsl:call-template>
+ </tr>
+ <xsl:call-template name="simplelist.vert">
+ <xsl:with-param name="cols" select="$cols"/>
+ <xsl:with-param name="cell" select="$cell+1"/>
+ <xsl:with-param name="members" select="$members"/>
+ <xsl:with-param name="rows" select="$rows"/>
+ </xsl:call-template>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template name="simplelist.vert.row">
+ <xsl:param name="cols">1</xsl:param>
+ <xsl:param name="rows">1</xsl:param>
+ <xsl:param name="cell">1</xsl:param>
+ <xsl:param name="members" select="./member"/>
+ <xsl:param name="curcol">1</xsl:param>
+
+ <xsl:if test="$curcol &lt;= $cols">
+ <td>
+ <xsl:choose>
+ <xsl:when test="$members[position()=$cell]">
+ <xsl:apply-templates select="$members[position()=$cell]"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text>&#160;</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ </td>
+ <xsl:call-template name="simplelist.vert.row">
+ <xsl:with-param name="cols" select="$cols"/>
+ <xsl:with-param name="rows" select="$rows"/>
+ <xsl:with-param name="cell" select="$cell+$rows"/>
+ <xsl:with-param name="members" select="$members"/>
+ <xsl:with-param name="curcol" select="$curcol+1"/>
+ </xsl:call-template>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="member">
+ <xsl:call-template name="anchor"/>
+ <xsl:call-template name="simple.xlink">
+ <xsl:with-param name="content">
+ <xsl:apply-templates/>
+ </xsl:with-param>
+ </xsl:call-template>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="procedure">
+ <xsl:variable name="param.placement"
+ select="substring-after(normalize-space($formal.title.placement),
+ concat(local-name(.), ' '))"/>
+
+ <xsl:variable name="placement">
+ <xsl:choose>
+ <xsl:when test="contains($param.placement, ' ')">
+ <xsl:value-of select="substring-before($param.placement, ' ')"/>
+ </xsl:when>
+ <xsl:when test="$param.placement = ''">before</xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$param.placement"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <!-- Preserve order of PIs and comments -->
+ <xsl:variable name="preamble"
+ select="*[not(self::step
+ or self::title
+ or self::titleabbrev)]
+ |comment()[not(preceding-sibling::step)]
+ |processing-instruction()[not(preceding-sibling::step)]"/>
+
+ <div>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:call-template name="anchor">
+ <xsl:with-param name="conditional">
+ <xsl:choose>
+ <xsl:when test="title">0</xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:with-param>
+ </xsl:call-template>
+
+ <xsl:if test="title and $placement = 'before'">
+ <xsl:call-template name="formal.object.heading"/>
+ </xsl:if>
+
+ <xsl:apply-templates select="$preamble"/>
+
+ <xsl:choose>
+ <xsl:when test="count(step) = 1">
+ <ul>
+ <xsl:call-template name="generate.class.attribute"/>
+ <xsl:apply-templates
+ select="step
+ |comment()[preceding-sibling::step]
+ |processing-instruction()[preceding-sibling::step]"/>
+ </ul>
+ </xsl:when>
+ <xsl:otherwise>
+ <ol>
+ <xsl:call-template name="generate.class.attribute"/>
+ <xsl:attribute name="type">
+ <xsl:value-of select="substring($procedure.step.numeration.formats,1,1)"/>
+ </xsl:attribute>
+ <xsl:apply-templates
+ select="step
+ |comment()[preceding-sibling::step]
+ |processing-instruction()[preceding-sibling::step]"/>
+ </ol>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:if test="title and $placement != 'before'">
+ <xsl:call-template name="formal.object.heading"/>
+ </xsl:if>
+ </div>
+</xsl:template>
+
+<xsl:template match="procedure/title">
+ <!-- nop -->
+</xsl:template>
+
+<xsl:template match="substeps">
+ <xsl:variable name="numeration">
+ <xsl:call-template name="procedure.step.numeration"/>
+ </xsl:variable>
+
+ <xsl:call-template name="anchor"/>
+
+ <ol type="{$numeration}">
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates/>
+ </ol>
+</xsl:template>
+
+<xsl:template match="step">
+ <li>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:call-template name="anchor"/>
+ <xsl:apply-templates/>
+ </li>
+</xsl:template>
+
+<xsl:template match="stepalternatives">
+ <xsl:call-template name="anchor"/>
+ <ul>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates/>
+ </ul>
+</xsl:template>
+
+<xsl:template match="step/title">
+ <p>
+ <xsl:call-template name="common.html.attributes"/>
+ <b>
+ <xsl:apply-templates/>
+ </b>
+ </p>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="segmentedlist">
+ <xsl:variable name="presentation">
+ <xsl:call-template name="pi.dbhtml_list-presentation"/>
+ </xsl:variable>
+
+ <div>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:call-template name="anchor"/>
+
+ <xsl:choose>
+ <xsl:when test="$presentation = 'table'">
+ <xsl:apply-templates select="." mode="seglist-table"/>
+ </xsl:when>
+ <xsl:when test="$presentation = 'list'">
+ <xsl:apply-templates/>
+ </xsl:when>
+ <xsl:when test="$segmentedlist.as.table != 0">
+ <xsl:apply-templates select="." mode="seglist-table"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </div>
+</xsl:template>
+
+<xsl:template match="segmentedlist/title">
+ <div>
+ <xsl:call-template name="common.html.attributes"/>
+ <strong>
+ <span>
+ <xsl:call-template name="generate.class.attribute"/>
+ <xsl:apply-templates/>
+ </span>
+ </strong>
+ </div>
+</xsl:template>
+
+<xsl:template match="segtitle">
+</xsl:template>
+
+<xsl:template match="segtitle" mode="segtitle-in-seg">
+ <xsl:apply-templates/>
+</xsl:template>
+
+<xsl:template match="seglistitem">
+ <div>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:call-template name="anchor"/>
+ <xsl:apply-templates/>
+ </div>
+</xsl:template>
+
+<xsl:template match="seg">
+ <xsl:variable name="segnum" select="count(preceding-sibling::seg)+1"/>
+ <xsl:variable name="seglist" select="ancestor::segmentedlist"/>
+ <xsl:variable name="segtitles" select="$seglist/segtitle"/>
+
+ <!--
+ Note: segtitle is only going to be the right thing in a well formed
+ SegmentedList. If there are too many Segs or too few SegTitles,
+ you'll get something odd...maybe an error
+ -->
+
+ <div>
+ <xsl:call-template name="common.html.attributes"/>
+ <strong>
+ <span class="segtitle">
+ <xsl:apply-templates select="$segtitles[$segnum=position()]"
+ mode="segtitle-in-seg"/>
+ <xsl:text>: </xsl:text>
+ </span>
+ </strong>
+ <xsl:apply-templates/>
+ </div>
+</xsl:template>
+
+<xsl:template match="segmentedlist" mode="seglist-table">
+ <xsl:variable name="table-summary">
+ <xsl:call-template name="pi.dbhtml_table-summary"/>
+ </xsl:variable>
+
+ <xsl:variable name="list-width">
+ <xsl:call-template name="pi.dbhtml_list-width"/>
+ </xsl:variable>
+
+ <xsl:apply-templates select="title"/>
+
+ <table border="0">
+ <xsl:if test="$list-width != ''">
+ <xsl:attribute name="width">
+ <xsl:value-of select="$list-width"/>
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:if test="$table-summary != ''">
+ <xsl:attribute name="summary">
+ <xsl:value-of select="$table-summary"/>
+ </xsl:attribute>
+ </xsl:if>
+ <thead>
+ <tr class="segtitle">
+ <xsl:call-template name="tr.attributes">
+ <xsl:with-param name="row" select="segtitle[1]"/>
+ <xsl:with-param name="rownum" select="1"/>
+ </xsl:call-template>
+ <xsl:apply-templates select="segtitle" mode="seglist-table"/>
+ </tr>
+ </thead>
+ <tbody>
+ <xsl:apply-templates select="seglistitem" mode="seglist-table"/>
+ </tbody>
+ </table>
+</xsl:template>
+
+<xsl:template match="segtitle" mode="seglist-table">
+ <th><xsl:apply-templates/></th>
+</xsl:template>
+
+<xsl:template match="seglistitem" mode="seglist-table">
+ <xsl:variable name="seglinum">
+ <xsl:number from="segmentedlist" count="seglistitem"/>
+ </xsl:variable>
+
+ <tr>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:call-template name="tr.attributes">
+ <xsl:with-param name="rownum" select="$seglinum + 1"/>
+ </xsl:call-template>
+ <xsl:apply-templates mode="seglist-table"/>
+ </tr>
+</xsl:template>
+
+<xsl:template match="seg" mode="seglist-table">
+ <td>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates/>
+ </td>
+</xsl:template>
+
+<xsl:template match="seg[1]" mode="seglist-table">
+ <td>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:call-template name="anchor">
+ <xsl:with-param name="node" select="ancestor::seglistitem"/>
+ </xsl:call-template>
+ <xsl:apply-templates/>
+ </td>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="calloutlist">
+ <div>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:call-template name="anchor"/>
+ <xsl:if test="title|info/title">
+ <xsl:call-template name="formal.object.heading"/>
+ </xsl:if>
+
+ <!-- Preserve order of PIs and comments -->
+ <xsl:apply-templates
+ select="*[not(self::callout or self::title or self::titleabbrev)]
+ |comment()[not(preceding-sibling::callout)]
+ |processing-instruction()[not(preceding-sibling::callout)]"/>
+
+ <xsl:choose>
+ <xsl:when test="$callout.list.table != 0">
+ <table border="0" summary="Callout list">
+ <xsl:apply-templates select="callout
+ |comment()[preceding-sibling::callout]
+ |processing-instruction()[preceding-sibling::callout]"/>
+ </table>
+ </xsl:when>
+ <xsl:otherwise>
+ <dl compact="compact">
+ <xsl:apply-templates select="callout
+ |comment()[preceding-sibling::callout]
+ |processing-instruction()[preceding-sibling::callout]"/>
+ </dl>
+ </xsl:otherwise>
+ </xsl:choose>
+ </div>
+</xsl:template>
+
+<xsl:template match="calloutlist/title">
+</xsl:template>
+
+<xsl:template match="callout">
+ <xsl:choose>
+ <xsl:when test="$callout.list.table != 0">
+ <tr>
+ <xsl:call-template name="tr.attributes">
+ <xsl:with-param name="rownum">
+ <xsl:number from="calloutlist" count="callout"/>
+ </xsl:with-param>
+ </xsl:call-template>
+
+ <td width="5%" valign="top" align="{$direction.align.start}">
+ <p>
+ <xsl:call-template name="anchor"/>
+ <xsl:call-template name="callout.arearefs">
+ <xsl:with-param name="arearefs" select="@arearefs"/>
+ </xsl:call-template>
+ </p>
+ </td>
+ <td valign="top" align="{$direction.align.start}">
+ <xsl:apply-templates/>
+ </td>
+ </tr>
+ </xsl:when>
+ <xsl:otherwise>
+ <dt>
+ <xsl:call-template name="anchor"/>
+ <xsl:call-template name="callout.arearefs">
+ <xsl:with-param name="arearefs" select="@arearefs"/>
+ </xsl:call-template>
+ </dt>
+ <dd><xsl:apply-templates/></dd>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="callout/simpara" priority="2">
+ <!-- If a callout contains only a single simpara, don't output
+ the <p> wrapper; this has the effect of creating an li
+ with simple text content. -->
+ <xsl:choose>
+ <xsl:when test="not(preceding-sibling::*)
+ and not (following-sibling::*)">
+ <xsl:call-template name="anchor"/>
+ <xsl:apply-templates/>
+ </xsl:when>
+ <xsl:otherwise>
+ <p>
+ <xsl:if test="@role and $para.propagates.style != 0">
+ <xsl:choose>
+ <xsl:when test="@role and $para.propagates.style != 0">
+ <xsl:call-template name="common.html.attributes">
+ <xsl:with-param name="class" select="@role"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="common.html.attributes"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:if>
+
+ <xsl:call-template name="anchor"/>
+ <xsl:apply-templates/>
+ </p>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="callout.arearefs">
+ <xsl:param name="arearefs"></xsl:param>
+ <xsl:if test="$arearefs!=''">
+ <xsl:choose>
+ <xsl:when test="substring-before($arearefs,' ')=''">
+ <xsl:call-template name="callout.arearef">
+ <xsl:with-param name="arearef" select="$arearefs"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="callout.arearef">
+ <xsl:with-param name="arearef"
+ select="substring-before($arearefs,' ')"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:call-template name="callout.arearefs">
+ <xsl:with-param name="arearefs"
+ select="substring-after($arearefs,' ')"/>
+ </xsl:call-template>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template name="callout.arearef">
+ <xsl:param name="arearef"></xsl:param>
+ <xsl:variable name="targets" select="key('id',$arearef)"/>
+ <xsl:variable name="target" select="$targets[1]"/>
+
+ <xsl:call-template name="check.id.unique">
+ <xsl:with-param name="linkend" select="$arearef"/>
+ </xsl:call-template>
+
+ <xsl:choose>
+ <xsl:when test="count($target)=0">
+ <xsl:text>???</xsl:text>
+ </xsl:when>
+ <xsl:when test="local-name($target)='co'">
+ <a>
+ <xsl:attribute name="href">
+ <xsl:text>#</xsl:text>
+ <xsl:value-of select="$arearef"/>
+ </xsl:attribute>
+ <xsl:apply-templates select="$target" mode="callout-bug"/>
+ </a>
+ <xsl:text> </xsl:text>
+ </xsl:when>
+ <xsl:when test="local-name($target)='areaset'">
+ <xsl:call-template name="callout-bug">
+ <xsl:with-param name="conum">
+ <xsl:apply-templates select="$target" mode="conumber"/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="local-name($target)='area'">
+ <xsl:choose>
+ <xsl:when test="$target/parent::areaset">
+ <xsl:call-template name="callout-bug">
+ <xsl:with-param name="conum">
+ <xsl:apply-templates select="$target/parent::areaset"
+ mode="conumber"/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="callout-bug">
+ <xsl:with-param name="conum">
+ <xsl:apply-templates select="$target" mode="conumber"/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text>???</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template name="orderedlist-starting-number">
+ <xsl:param name="list" select="."/>
+ <xsl:variable name="pi-start">
+ <xsl:call-template name="pi.dbhtml_start">
+ <xsl:with-param name="node" select="$list"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:call-template name="output-orderedlist-starting-number">
+ <xsl:with-param name="list" select="$list"/>
+ <xsl:with-param name="pi-start" select="$pi-start"/>
+ </xsl:call-template>
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/maketoc.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/maketoc.xsl
new file mode 100644
index 0000000..1ba3931
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/maketoc.xsl
@@ -0,0 +1,86 @@
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:doc="http://nwalsh.com/xsl/documentation/1.0"
+ version="1.0"
+ exclude-result-prefixes="doc">
+
+<!-- ********************************************************************
+ $Id: maketoc.xsl 6910 2007-06-28 23:23:30Z xmldoc $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<!-- ==================================================================== -->
+
+<xsl:import href="docbook.xsl"/>
+<xsl:import href="chunk.xsl"/>
+
+<xsl:output method="xml" indent="no" encoding='utf-8'/>
+
+<xsl:param name="toc.list.type" select="'tocentry'"/>
+
+<!-- refentry in autotoc.xsl does not use subtoc, so must
+ handle it explicitly here. -->
+<xsl:template match="refentry" mode="toc">
+ <xsl:param name="toc-context" select="."/>
+
+ <xsl:call-template name="subtoc">
+ <xsl:with-param name="toc-context" select="$toc-context"/>
+ </xsl:call-template>
+</xsl:template>
+
+
+<xsl:template name="subtoc">
+ <xsl:param name="nodes" select="NOT-AN-ELEMENT"/>
+ <xsl:variable name="filename">
+ <xsl:apply-templates select="." mode="chunk-filename"/>
+ </xsl:variable>
+
+ <xsl:variable name="chunk">
+ <xsl:call-template name="chunk"/>
+ </xsl:variable>
+
+ <xsl:if test="$chunk != 0">
+ <xsl:call-template name="indent-spaces"/>
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+ <tocentry linkend="{$id}">
+ <xsl:processing-instruction name="dbhtml">
+ <xsl:text>filename="</xsl:text>
+ <xsl:value-of select="$filename"/>
+ <xsl:text>"</xsl:text>
+ </xsl:processing-instruction>
+ <xsl:text>&#xA;</xsl:text>
+ <xsl:apply-templates mode="toc" select="$nodes"/>
+ <xsl:call-template name="indent-spaces"/>
+ </tocentry>
+ <xsl:text>&#xA;</xsl:text>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template name="indent-spaces">
+ <xsl:param name="node" select="."/>
+ <xsl:text> </xsl:text>
+ <xsl:if test="$node/parent::*">
+ <xsl:call-template name="indent-spaces">
+ <xsl:with-param name="node" select="$node/parent::*"/>
+ </xsl:call-template>
+ </xsl:if>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="/" priority="-1">
+ <xsl:text>&#xA;</xsl:text>
+ <toc role="chunk-toc">
+ <xsl:text>&#xA;</xsl:text>
+ <xsl:apply-templates select="/" mode="toc"/>
+ </toc>
+ <xsl:text>&#xA;</xsl:text>
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/manifest.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/manifest.xsl
new file mode 100644
index 0000000..01faacc
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/manifest.xsl
@@ -0,0 +1,22 @@
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:doc="http://nwalsh.com/xsl/documentation/1.0"
+ version="1.0"
+ exclude-result-prefixes="doc">
+
+<!-- ********************************************************************
+ $Id: manifest.xsl 6910 2007-06-28 23:23:30Z xmldoc $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<!-- ==================================================================== -->
+<!-- OBSOLETE. The templates from this file were moved to -->
+<!-- chunk-common.xsl and chunk-code.xsl. -->
+<!-- ==================================================================== -->
+
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/math.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/math.xsl
new file mode 100644
index 0000000..801b106
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/math.xsl
@@ -0,0 +1,270 @@
+<?xml version='1.0'?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:mml="http://www.w3.org/1998/Math/MathML"
+ exclude-result-prefixes="mml"
+ version='1.0'>
+
+<!-- ********************************************************************
+ $Id: math.xsl 8421 2009-05-04 07:49:49Z bobstayton $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<xsl:template match="inlineequation">
+ <xsl:apply-templates/>
+</xsl:template>
+
+<xsl:template match="alt">
+</xsl:template>
+
+<xsl:template match="mathphrase">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates/>
+ </span>
+</xsl:template>
+
+<!-- "Support" for MathML -->
+
+<xsl:template match="mml:*" xmlns:mml="http://www.w3.org/1998/Math/MathML">
+ <xsl:copy>
+ <xsl:copy-of select="@*"/>
+ <xsl:apply-templates/>
+ </xsl:copy>
+</xsl:template>
+
+<!-- Support for TeX math in alt -->
+
+<xsl:template match="*" mode="collect.tex.math">
+ <xsl:call-template name="write.text.chunk">
+ <xsl:with-param name="filename" select="$tex.math.file"/>
+ <xsl:with-param name="method" select="'text'"/>
+ <xsl:with-param name="content">
+ <xsl:choose>
+ <xsl:when test="$tex.math.in.alt = 'plain'">
+ <xsl:call-template name="tex.math.plain.head"/>
+ <xsl:apply-templates select="." mode="collect.tex.math.plain"/>
+ <xsl:call-template name="tex.math.plain.tail"/>
+ </xsl:when>
+ <xsl:when test="$tex.math.in.alt = 'latex'">
+ <xsl:call-template name="tex.math.latex.head"/>
+ <xsl:apply-templates select="." mode="collect.tex.math.latex"/>
+ <xsl:call-template name="tex.math.latex.tail"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:message>
+ Unsupported TeX math notation:
+ <xsl:value-of select="$tex.math.in.alt"/>
+ </xsl:message>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:with-param>
+ <xsl:with-param name="encoding" select="$chunker.output.encoding"/>
+ </xsl:call-template>
+</xsl:template>
+
+<!-- PlainTeX -->
+
+<xsl:template name="tex.math.plain.head">
+ <xsl:text>\nopagenumbers &#xA;</xsl:text>
+</xsl:template>
+
+<xsl:template name="tex.math.plain.tail">
+ <xsl:text>\bye &#xA;</xsl:text>
+</xsl:template>
+
+<xsl:template match="inlineequation" mode="collect.tex.math.plain">
+ <xsl:variable name="filename">
+ <xsl:choose>
+ <xsl:when test="graphic">
+ <xsl:call-template name="mediaobject.filename">
+ <xsl:with-param name="object" select="graphic"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="select.mediaobject.filename">
+ <xsl:with-param name="olist" select="inlinemediaobject/*"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:variable name="output.delims">
+ <xsl:call-template name="tex.math.output.delims"/>
+ </xsl:variable>
+ <xsl:variable name="tex" select="alt[@role='tex'] | inlinemediaobject/textobject[@role='tex']"/>
+ <xsl:if test="$tex">
+ <xsl:text>\special{dvi2bitmap outputfile </xsl:text>
+ <xsl:value-of select="$filename"/>
+ <xsl:text>} &#xA;</xsl:text>
+ <xsl:if test="$output.delims != 0">
+ <xsl:text>$</xsl:text>
+ </xsl:if>
+ <xsl:value-of select="$tex"/>
+ <xsl:if test="$output.delims != 0">
+ <xsl:text>$ &#xA;</xsl:text>
+ </xsl:if>
+ <xsl:text>\vfill\eject &#xA;</xsl:text>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="equation|informalequation" mode="collect.tex.math.plain">
+ <xsl:variable name="filename">
+ <xsl:choose>
+ <xsl:when test="graphic">
+ <xsl:call-template name="mediaobject.filename">
+ <xsl:with-param name="object" select="graphic"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="select.mediaobject.filename">
+ <xsl:with-param name="olist" select="mediaobject/*"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:variable name="output.delims">
+ <xsl:call-template name="tex.math.output.delims"/>
+ </xsl:variable>
+ <xsl:variable name="tex" select="alt[@role='tex'] | mediaobject/textobject[@role='tex']"/>
+ <xsl:if test="$tex">
+ <xsl:text>\special{dvi2bitmap outputfile </xsl:text>
+ <xsl:value-of select="$filename"/>
+ <xsl:text>} &#xA;</xsl:text>
+ <xsl:if test="$output.delims != 0">
+ <xsl:text>$$</xsl:text>
+ </xsl:if>
+ <xsl:value-of select="$tex"/>
+ <xsl:if test="$output.delims != 0">
+ <xsl:text>$$ &#xA;</xsl:text>
+ </xsl:if>
+ <xsl:text>\vfill\eject &#xA;</xsl:text>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="text()" mode="collect.tex.math.plain"/>
+
+<!-- LaTeX -->
+
+<xsl:template name="tex.math.latex.head">
+ <xsl:text>\documentclass{article} &#xA;</xsl:text>
+ <xsl:text>\pagestyle{empty} &#xA;</xsl:text>
+ <xsl:text>\begin{document} &#xA;</xsl:text>
+</xsl:template>
+
+<xsl:template name="tex.math.latex.tail">
+ <xsl:text>\end{document} &#xA;</xsl:text>
+</xsl:template>
+
+<xsl:template match="inlineequation" mode="collect.tex.math.latex">
+ <xsl:variable name="filename">
+ <xsl:choose>
+ <xsl:when test="graphic">
+ <xsl:call-template name="mediaobject.filename">
+ <xsl:with-param name="object" select="graphic"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="select.mediaobject.filename">
+ <xsl:with-param name="olist" select="inlinemediaobject/*"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:variable name="output.delims">
+ <xsl:call-template name="tex.math.output.delims"/>
+ </xsl:variable>
+ <xsl:variable name="tex" select="alt[@role='tex'] | inlinemediaobject/textobject[@role='tex']"/>
+ <xsl:if test="$tex">
+ <xsl:text>\special{dvi2bitmap outputfile </xsl:text>
+ <xsl:value-of select="$filename"/>
+ <xsl:text>} &#xA;</xsl:text>
+ <xsl:if test="$output.delims != 0">
+ <xsl:text>$</xsl:text>
+ </xsl:if>
+ <xsl:value-of select="$tex"/>
+ <xsl:if test="$output.delims != 0">
+ <xsl:text>$ &#xA;</xsl:text>
+ </xsl:if>
+ <xsl:text>\newpage &#xA;</xsl:text>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="equation|informalequation" mode="collect.tex.math.latex">
+ <xsl:variable name="filename">
+ <xsl:choose>
+ <xsl:when test="graphic">
+ <xsl:call-template name="mediaobject.filename">
+ <xsl:with-param name="object" select="graphic"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="select.mediaobject.filename">
+ <xsl:with-param name="olist" select="mediaobject/*"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:variable name="output.delims">
+ <xsl:call-template name="tex.math.output.delims"/>
+ </xsl:variable>
+ <xsl:variable name="tex" select="alt[@role='tex'] | mediaobject/textobject[@role='tex']"/>
+ <xsl:if test="$tex">
+ <xsl:text>\special{dvi2bitmap outputfile </xsl:text>
+ <xsl:value-of select="$filename"/>
+ <xsl:text>} &#xA;</xsl:text>
+ <xsl:if test="$output.delims != 0">
+ <xsl:text>$$</xsl:text>
+ </xsl:if>
+ <xsl:value-of select="$tex"/>
+ <xsl:if test="$output.delims != 0">
+ <xsl:text>$$ &#xA;</xsl:text>
+ </xsl:if>
+ <xsl:text>\newpage &#xA;</xsl:text>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="text()" mode="collect.tex.math.latex"/>
+
+<!-- Extracting image filename from mediaobject and graphic elements -->
+
+<xsl:template name="select.mediaobject.filename">
+ <xsl:param name="olist"
+ select="imageobject|imageobjectco
+ |videoobject|audioobject|textobject"/>
+
+ <xsl:variable name="mediaobject.index">
+ <xsl:call-template name="select.mediaobject.index">
+ <xsl:with-param name="olist" select="$olist"/>
+ <xsl:with-param name="count" select="1"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:if test="$mediaobject.index != ''">
+ <xsl:call-template name="mediaobject.filename">
+ <xsl:with-param name="object"
+ select="$olist[position() = $mediaobject.index]"/>
+ </xsl:call-template>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template name="tex.math.output.delims">
+ <xsl:variable name="pi.delims">
+ <xsl:call-template name="pi.dbtex_delims">
+ <xsl:with-param name="node" select="descendant-or-self::*"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:variable name="result">
+ <xsl:choose>
+ <xsl:when test="$pi.delims = 'no'">0</xsl:when>
+ <xsl:when test="$pi.delims = '' and $tex.math.delims = 0">0</xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:value-of select="$result"/>
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/oldchunker.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/oldchunker.xsl
new file mode 100644
index 0000000..fe6b17c
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/oldchunker.xsl
@@ -0,0 +1,202 @@
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:saxon="http://icl.com/saxon"
+ xmlns:lxslt="http://xml.apache.org/xslt"
+ xmlns:redirect="http://xml.apache.org/xalan/redirect"
+ xmlns:doc="http://nwalsh.com/xsl/documentation/1.0"
+ version="1.1"
+ exclude-result-prefixes="doc"
+ extension-element-prefixes="saxon redirect lxslt">
+
+<!-- ********************************************************************
+ $Id: oldchunker.xsl 6910 2007-06-28 23:23:30Z xmldoc $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<!-- ==================================================================== -->
+
+<!-- This stylesheet works with Saxon and Xalan; for XT use xtchunker.xsl -->
+
+<!-- ==================================================================== -->
+
+<xsl:param name="default.encoding" select="'ISO-8859-1'" doc:type='string'/>
+
+<doc:param name="default.encoding" xmlns="">
+<refpurpose>Encoding used in generated HTML pages</refpurpose>
+<refdescription>
+<para>This encoding is used in files generated by chunking stylesheet. Currently
+only Saxon is able to change output encoding.
+</para>
+</refdescription>
+</doc:param>
+
+<!-- ==================================================================== -->
+
+<xsl:param name="saxon.character.representation" select="'entity;decimal'" doc:type='string'/>
+
+<doc:param name="saxon.character.representation" xmlns="">
+<refpurpose>Saxon character representation used in generated HTML pages</refpurpose>
+<refdescription>
+<para>This character representation is used in files generated by chunking stylesheet. If
+you want to suppress entity references for characters with direct representation
+in default.encoding, set this parameter to value <literal>native</literal>.
+</para>
+</refdescription>
+</doc:param>
+
+<!-- ==================================================================== -->
+
+<xsl:template name="make-relative-filename">
+ <xsl:param name="base.dir" select="'./'"/>
+ <xsl:param name="base.name" select="''"/>
+
+ <xsl:variable name="vendor" select="system-property('xsl:vendor')"/>
+
+ <xsl:choose>
+ <xsl:when test="contains($vendor, 'SAXON')">
+ <!-- Saxon doesn't make the chunks relative -->
+ <xsl:value-of select="concat($base.dir,$base.name)"/>
+ </xsl:when>
+ <xsl:when test="contains($vendor, 'Apache')">
+ <!-- Xalan doesn't make the chunks relative -->
+ <xsl:value-of select="concat($base.dir,$base.name)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:message terminate="yes">
+ <xsl:text>Chunking isn't supported with </xsl:text>
+ <xsl:value-of select="$vendor"/>
+ </xsl:message>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="write.chunk">
+ <xsl:param name="filename" select="''"/>
+ <xsl:param name="method" select="'html'"/>
+ <xsl:param name="encoding" select="$default.encoding"/>
+ <xsl:param name="indent" select="'no'"/>
+ <xsl:param name="content" select="''"/>
+
+ <xsl:message>
+ <xsl:text>Writing </xsl:text>
+ <xsl:value-of select="$filename"/>
+ <xsl:if test="name(.) != ''">
+ <xsl:text> for </xsl:text>
+ <xsl:value-of select="name(.)"/>
+ <xsl:if test="@id">
+ <xsl:text>(</xsl:text>
+ <xsl:value-of select="@id"/>
+ <xsl:text>)</xsl:text>
+ </xsl:if>
+ </xsl:if>
+ </xsl:message>
+
+ <xsl:variable name="vendor" select="system-property('xsl:vendor')"/>
+
+ <xsl:choose>
+ <xsl:when test="contains($vendor, 'SAXON 6.2')">
+ <!-- Saxon 6.2.x uses xsl:document -->
+ <xsl:document href="{$filename}"
+ method="{$method}"
+ encoding="{$encoding}"
+ indent="{$indent}"
+ saxon:character-representation="{$saxon.character.representation}">
+ <xsl:copy-of select="$content"/>
+ </xsl:document>
+ </xsl:when>
+ <xsl:when test="contains($vendor, 'SAXON')">
+ <!-- Saxon uses saxon:output -->
+ <saxon:output file="{$filename}"
+ href="{$filename}"
+ method="{$method}"
+ encoding="{$encoding}"
+ indent="{$indent}"
+ saxon:character-representation="{$saxon.character.representation}">
+ <xsl:copy-of select="$content"/>
+ </saxon:output>
+ </xsl:when>
+ <xsl:when test="contains($vendor, 'Apache')">
+ <!-- Xalan uses redirect -->
+ <redirect:write file="{$filename}">
+ <xsl:copy-of select="$content"/>
+ </redirect:write>
+ </xsl:when>
+ <xsl:otherwise>
+ <!-- it doesn't matter since we won't be making chunks... -->
+ <xsl:message terminate="yes">
+ <xsl:text>Can't make chunks with </xsl:text>
+ <xsl:value-of select="$vendor"/>
+ <xsl:text>'s processor.</xsl:text>
+ </xsl:message>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="write.chunk.with.doctype">
+ <xsl:param name="filename" select="''"/>
+ <xsl:param name="method" select="'html'"/>
+ <xsl:param name="encoding" select="$default.encoding"/>
+ <xsl:param name="indent" select="'no'"/>
+ <xsl:param name="doctype-public" select="''"/>
+ <xsl:param name="doctype-system" select="''"/>
+ <xsl:param name="content" select="''"/>
+
+ <xsl:message>
+ <xsl:text>Writing </xsl:text>
+ <xsl:value-of select="$filename"/>
+ <xsl:if test="name(.) != ''">
+ <xsl:text> for </xsl:text>
+ <xsl:value-of select="name(.)"/>
+ </xsl:if>
+ </xsl:message>
+
+ <xsl:variable name="vendor" select="system-property('xsl:vendor')"/>
+
+ <xsl:choose>
+ <xsl:when test="contains($vendor, 'SAXON 6.2')">
+ <!-- Saxon 6.2.x uses xsl:document -->
+ <xsl:document href="{$filename}"
+ method="{$method}"
+ encoding="{$encoding}"
+ indent="{$indent}"
+ doctype-public="{$doctype-public}"
+ doctype-system="{$doctype-system}"
+ saxon:character-representation="{$saxon.character.representation}">
+ <xsl:copy-of select="$content"/>
+ </xsl:document>
+ </xsl:when>
+ <xsl:when test="contains($vendor, 'SAXON')">
+ <!-- Saxon uses saxon:output -->
+ <saxon:output file="{$filename}"
+ href="{$filename}"
+ method="{$method}"
+ encoding="{$encoding}"
+ indent="{$indent}"
+ doctype-public="{$doctype-public}"
+ doctype-system="{$doctype-system}"
+ saxon:character-representation="{$saxon.character.representation}">
+ <xsl:copy-of select="$content"/>
+ </saxon:output>
+ </xsl:when>
+ <xsl:when test="contains($vendor, 'Apache')">
+ <!-- Xalan uses redirect -->
+ <redirect:write file="{$filename}">
+ <xsl:copy-of select="$content"/>
+ </redirect:write>
+ </xsl:when>
+ <xsl:otherwise>
+ <!-- it doesn't matter since we won't be making chunks... -->
+ <xsl:message terminate="yes">
+ <xsl:text>Can't make chunks with </xsl:text>
+ <xsl:value-of select="$vendor"/>
+ <xsl:text>'s processor.</xsl:text>
+ </xsl:message>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/onechunk.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/onechunk.xsl
new file mode 100644
index 0000000..527dccf
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/onechunk.xsl
@@ -0,0 +1,37 @@
+<?xml version="1.0"?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:doc="http://nwalsh.com/xsl/documentation/1.0"
+ version="1.0"
+ exclude-result-prefixes="doc">
+
+<!-- ********************************************************************
+ $Id: onechunk.xsl 6910 2007-06-28 23:23:30Z xmldoc $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<!-- ==================================================================== -->
+
+<xsl:import href="chunk.xsl"/>
+
+<!-- Ok, using the onechunk parameter makes this all work again. -->
+<!-- It does have the disadvantage that it only works for documents that have -->
+<!-- a root element that is considered a chunk by the chunk.xsl stylesheet. -->
+<!-- Ideally, onechunk would let anything be a chunk. But not today. -->
+
+<xsl:param name="onechunk" select="1"/>
+<xsl:param name="suppress.navigation">1</xsl:param>
+
+<xsl:template name="href.target.uri">
+ <xsl:param name="object" select="."/>
+ <xsl:text>#</xsl:text>
+ <xsl:call-template name="object.id">
+ <xsl:with-param name="object" select="$object"/>
+ </xsl:call-template>
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/param.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/param.xml
new file mode 100644
index 0000000..e70de9c
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/param.xml
@@ -0,0 +1,10905 @@
+<?xml version="1.0" encoding="ASCII"?>
+<book version="5.0">
+<info>
+<title>HTML Parameter Reference</title>
+<releaseinfo role="meta">
+$Id: param.xweb 8552 2009-12-07 17:45:26Z bobstayton $
+</releaseinfo>
+<author>
+ <personname>
+ <surname>Walsh</surname>
+ <firstname>Norman</firstname>
+ </personname>
+</author>
+<copyright>
+ <year>1999</year>
+ <year>2000</year>
+ <year>2001</year>
+ <year>2002</year>
+ <year>2003</year>
+ <year>2004</year>
+ <year>2005</year>
+ <year>2006</year>
+ <year>2007</year>
+ <holder>Norman Walsh</holder>
+</copyright>
+<abstract>
+ <para>This is reference documentation for all user-configurable
+ parameters in the DocBook XSL HTML stylesheets (for generating
+ HTML output).</para>
+</abstract>
+</info>
+<reference xml:id="admons"><title>Admonitions</title>
+<refentry version="5.0" xml:id="admon.graphics.extension">
+<refmeta>
+<refentrytitle>admon.graphics.extension</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>admon.graphics.extension</refname>
+<refpurpose>Filename extension for admonition graphics</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="admon.graphics.extension.frag">
+&lt;xsl:param name="admon.graphics.extension"&gt;.png&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Sets the filename extension to use on admonition graphics.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="admon.graphics.path">
+<refmeta>
+<refentrytitle>admon.graphics.path</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>admon.graphics.path</refname>
+<refpurpose>Path to admonition graphics</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="admon.graphics.path.frag">&lt;xsl:param name="admon.graphics.path"&gt;images/&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Sets the path to the directory containing the admonition graphics
+(caution.png, important.png etc). This location is normally relative
+to the output html directory. See <parameter>base.dir</parameter></para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="admon.graphics">
+<refmeta>
+<refentrytitle>admon.graphics</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>admon.graphics</refname>
+<refpurpose>Use graphics in admonitions?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="admon.graphics.frag">
+&lt;xsl:param name="admon.graphics" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If true (non-zero), admonitions are presented in an alternate style that uses
+a graphic. Default graphics are provided in the distribution.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="admon.textlabel">
+<refmeta>
+<refentrytitle>admon.textlabel</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>admon.textlabel</refname>
+<refpurpose>Use text label in admonitions?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="admon.textlabel.frag">
+&lt;xsl:param name="admon.textlabel" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If true (non-zero), admonitions are presented with a generated
+text label such as Note or Warning in the appropriate language.
+If zero, such labels are turned off, but any title child
+of the admonition element are still output.
+The default value is 1.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="admon.style">
+<refmeta>
+<refentrytitle>admon.style</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>admon.style</refname>
+<refpurpose>Specifies the CSS style attribute that should be added to
+admonitions.</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="admon.style.frag">&lt;xsl:param name="admon.style"&gt;
+ &lt;xsl:value-of select="concat('margin-', $direction.align.start, ': 0.5in; margin-', $direction.align.end, ': 0.5in;')"&gt;&lt;/xsl:value-of&gt;
+&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies the value of the CSS <tag class="attribute">style</tag>
+attribute that should be added to admonitions.
+</para>
+
+</refsection>
+</refentry>
+
+</reference>
+<reference xml:id="callouts"><title>Callouts</title>
+<refentry version="5.0" xml:id="callout.defaultcolumn">
+<refmeta>
+<refentrytitle>callout.defaultcolumn</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">integer</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>callout.defaultcolumn</refname>
+<refpurpose>Indicates what column callouts appear in by default</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="callout.defaultcolumn.frag">
+&lt;xsl:param name="callout.defaultcolumn"&gt;60&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If a callout does not identify a column (for example, if it uses
+the <literal>linerange</literal> <tag class="attribute">unit</tag>),
+it will appear in the default column.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="callout.graphics.extension">
+<refmeta>
+<refentrytitle>callout.graphics.extension</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>callout.graphics.extension</refname>
+<refpurpose>Filename extension for callout graphics</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="callout.graphics.extension.frag">
+&lt;xsl:param name="callout.graphics.extension"&gt;.png&lt;/xsl:param&gt;
+
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+<para>Sets the filename extension to use on callout graphics. </para>
+
+<itemizedlist>
+<para>The Docbook XSL distribution provides callout graphics in the following formats:</para>
+<listitem><para>SVG (extension: <filename class="extension">.svg</filename>)</para></listitem>
+<listitem><para>PNG (extension: <filename class="extension">.png</filename>)</para></listitem>
+<listitem><para>GIF (extension: <filename class="extension">.gif</filename>)</para></listitem>
+</itemizedlist>
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="callout.graphics.number.limit">
+<refmeta>
+<refentrytitle>callout.graphics.number.limit</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">integer</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>callout.graphics.number.limit</refname>
+<refpurpose>Number of the largest callout graphic</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="callout.graphics.number.limit.frag">
+&lt;xsl:param name="callout.graphics.number.limit"&gt;15&lt;/xsl:param&gt;
+
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If <parameter>callout.graphics</parameter> is non-zero, graphics
+are used to represent callout numbers instead of plain text. The value
+of <parameter>callout.graphics.number.limit</parameter> is the largest
+number for which a graphic exists. If the callout number exceeds this
+limit, the default presentation "(plain text instead of a graphic)"
+will be used.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="callout.graphics.path">
+<refmeta>
+<refentrytitle>callout.graphics.path</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>callout.graphics.path</refname>
+<refpurpose>Path to callout graphics</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="callout.graphics.path.frag">
+&lt;xsl:param name="callout.graphics.path"&gt;images/callouts/&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Sets the path to the directory holding the callout graphics. his
+location is normally relative to the output html directory. see
+base.dir. Always terminate the directory with / since the graphic file
+is appended to this string, hence needs the separator.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="callout.graphics">
+<refmeta>
+<refentrytitle>callout.graphics</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>callout.graphics</refname>
+<refpurpose>Use graphics for callouts?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="callout.graphics.frag">
+&lt;xsl:param name="callout.graphics" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, callouts are presented with graphics (e.g., reverse-video
+circled numbers instead of "(1)", "(2)", etc.).
+Default graphics are provided in the distribution.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="callout.list.table">
+<refmeta>
+<refentrytitle>callout.list.table</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>callout.list.table</refname>
+<refpurpose>Present callout lists using a table?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="callout.list.table.frag">
+&lt;xsl:param name="callout.list.table" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The default presentation of <tag>calloutlist</tag>s uses
+an HTML <tag>DL</tag> element. Some browsers don't align DLs very well
+if <parameter>callout.graphics</parameter> is used. With this option
+turned on, <tag>calloutlist</tag>s are presented in an HTML
+<tag>TABLE</tag>, which usually results in better alignment
+of the callout number with the callout description.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="callout.unicode.number.limit">
+<refmeta>
+<refentrytitle>callout.unicode.number.limit</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">integer</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>callout.unicode.number.limit</refname>
+<refpurpose>Number of the largest unicode callout character</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="callout.unicode.number.limit.frag">
+&lt;xsl:param name="callout.unicode.number.limit"&gt;10&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If <parameter>callout.unicode</parameter>
+is non-zero, unicode characters are used to represent
+callout numbers. The value of
+<parameter>callout.unicode.number.limit</parameter>
+is
+the largest number for which a unicode character exists. If the callout number
+exceeds this limit, the default presentation "(nnn)" will always
+be used.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="callout.unicode.start.character">
+<refmeta>
+<refentrytitle>callout.unicode.start.character</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">integer</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>callout.unicode.start.character</refname>
+<refpurpose>First Unicode character to use, decimal value.</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="callout.unicode.start.character.frag">
+&lt;xsl:param name="callout.unicode.start.character"&gt;10102&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If <parameter>callout.graphics</parameter> is zero and <parameter>callout.unicode</parameter>
+is non-zero, unicode characters are used to represent
+callout numbers. The value of
+<parameter>callout.unicode.start.character</parameter>
+is the decimal unicode value used for callout number one. Currently,
+only 10102 is supported in the stylesheets for this parameter.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="callout.unicode">
+<refmeta>
+<refentrytitle>callout.unicode</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>callout.unicode</refname>
+<refpurpose>Use Unicode characters rather than images for callouts.</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="callout.unicode.frag">&lt;xsl:param name="callout.unicode" select="0"&gt;&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The stylesheets can use either an image of the numbers one to ten, or the single Unicode character which represents the numeral, in white on a black background. Use this to select the Unicode character option.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="callouts.extension">
+<refmeta>
+<refentrytitle>callouts.extension</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>callouts.extension</refname>
+<refpurpose>Enable the callout extension</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="callouts.extension.frag">
+&lt;xsl:param name="callouts.extension" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The callouts extension processes <tag>areaset</tag>
+elements in <tag>programlistingco</tag> and other text-based
+callout elements.
+</para>
+
+</refsection>
+</refentry>
+
+</reference>
+<reference xml:id="ebnf"><title>EBNF</title>
+<refentry version="5.0" xml:id="ebnf.table.bgcolor">
+<refmeta>
+<refentrytitle>ebnf.table.bgcolor</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">color</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>ebnf.table.bgcolor</refname>
+<refpurpose>Background color for EBNF tables</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="ebnf.table.bgcolor.frag">
+&lt;xsl:param name="ebnf.table.bgcolor"&gt;#F5DCB3&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Sets the background color for EBNF tables (a pale brown). No
+<tag>bgcolor</tag> attribute is output if
+<parameter>ebnf.table.bgcolor</parameter> is set to the null string. </para>
+
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="ebnf.table.border">
+<refmeta>
+<refentrytitle>ebnf.table.border</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>ebnf.table.border</refname>
+<refpurpose>Selects border on EBNF tables</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="ebnf.table.border.frag">&lt;xsl:param name="ebnf.table.border" select="1"&gt;&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Selects the border on EBNF tables. If non-zero, the tables have
+borders, otherwise they don't.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="ebnf.assignment">
+<refmeta>
+<refentrytitle>ebnf.assignment</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">rtf</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>ebnf.assignment</refname>
+<refpurpose>The EBNF production assignment operator</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="ebnf.assignment.frag">
+&lt;xsl:param name="ebnf.assignment"&gt;
+&lt;code&gt;::=&lt;/code&gt;
+&lt;/xsl:param&gt;
+
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The <parameter>ebnf.assignment</parameter> parameter determines what
+text is used to show <quote>assignment</quote> in <tag>production</tag>s
+in <tag>productionset</tag>s.</para>
+
+<para>While <quote><literal>::=</literal></quote> is common, so are several
+other operators.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="ebnf.statement.terminator">
+<refmeta>
+<refentrytitle>ebnf.statement.terminator</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">rtf</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>ebnf.statement.terminator</refname>
+<refpurpose>Punctuation that ends an EBNF statement.</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="ebnf.statement.terminator.frag">
+&lt;xsl:param name="ebnf.statement.terminator"&gt;&lt;/xsl:param&gt;
+
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The <parameter>ebnf.statement.terminator</parameter> parameter determines what
+text is used to terminate each <tag>production</tag>
+in <tag>productionset</tag>.</para>
+
+<para>Some notations end each statement with a period.</para>
+
+</refsection>
+</refentry>
+
+</reference>
+<reference xml:id="toc_index"><title>ToC/LoT/Index Generation</title>
+<refentry version="5.0" xml:id="annotate.toc">
+<refmeta>
+<refentrytitle>annotate.toc</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>annotate.toc</refname>
+<refpurpose>Annotate the Table of Contents?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="annotate.toc.frag">&lt;xsl:param name="annotate.toc" select="1"&gt;&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If true, TOCs will be annotated. At present, this just means
+that the <tag>refpurpose</tag> of <tag>refentry</tag>
+TOC entries will be displayed.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="autotoc.label.separator">
+<refmeta>
+<refentrytitle>autotoc.label.separator</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>autotoc.label.separator</refname>
+<refpurpose>Separator between labels and titles in the ToC</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="autotoc.label.separator.frag">
+&lt;xsl:param name="autotoc.label.separator"&gt;. &lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>String used to separate labels and titles in a table of contents.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="autotoc.label.in.hyperlink">
+<refmeta>
+<refentrytitle>autotoc.label.in.hyperlink</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>autotoc.label.in.hyperlink</refname>
+<refpurpose>Include label in hyperlinked titles in TOC?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="autotoc.label.in.hyperlink.frag">&lt;xsl:param name="autotoc.label.in.hyperlink" select="1"&gt;&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If the value of
+<parameter>autotoc.label.in.hyperlink</parameter> is non-zero, labels
+are included in hyperlinked titles in the TOC. If it is instead zero,
+labels are still displayed prior to the hyperlinked titles, but
+are not hyperlinked along with the titles.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="process.source.toc">
+<refmeta>
+<refentrytitle>process.source.toc</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>process.source.toc</refname>
+<refpurpose>Process a non-empty <tag>toc</tag> element if it occurs in a source document?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="process.source.toc.frag">&lt;xsl:param name="process.source.toc" select="0"&gt;&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies that the contents of a non-empty "hard-coded"
+<tag>toc</tag> element in a source document are processed to
+generate a TOC in output.
+<note>
+ <para>This parameter has no effect on automated generation of
+ TOCs. An automated TOC may still be generated along with the
+ "hard-coded" TOC. To suppress automated TOC generation, adjust the
+ value of the <parameter>generate.toc</parameter> paramameter.</para>
+
+ <para>The <tag>process.source.toc</tag> parameter also has
+ no effect if the <tag>toc</tag> element is empty; handling
+ for empty <tag>toc</tag> is controlled by the
+ <parameter>process.empty.source.toc</parameter> parameter.</para>
+</note>
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="process.empty.source.toc">
+<refmeta>
+<refentrytitle>process.empty.source.toc</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>process.empty.source.toc</refname>
+<refpurpose>Generate automated TOC if <tag>toc</tag> element occurs in a source document?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="process.empty.source.toc.frag">&lt;xsl:param name="process.empty.source.toc" select="0"&gt;&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies that if an empty <tag>toc</tag> element is found in a
+source document, an automated TOC is generated at this point in the
+document.
+<note>
+ <para>Depending on what the value of the
+ <parameter>generate.toc</parameter> parameter is, setting this
+ parameter to <literal>1</literal> could result in generation of
+ duplicate automated TOCs. So the
+ <parameter>process.empty.source.toc</parameter> is primarily useful
+ as an "override": by placing an empty <tag>toc</tag> in your
+ document and setting this parameter to <literal>1</literal>, you can
+ force a TOC to be generated even if <tag>generate.toc</tag>
+ says not to.</para>
+</note>
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="bridgehead.in.toc">
+<refmeta>
+<refentrytitle>bridgehead.in.toc</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>bridgehead.in.toc</refname>
+<refpurpose>Should bridgehead elements appear in the TOC?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="bridgehead.in.toc.frag">&lt;xsl:param name="bridgehead.in.toc" select="0"&gt;&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, <tag>bridgehead</tag>s appear in the TOC. Note that
+this option is not fully supported and may be removed in a future
+version of the stylesheets.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="simplesect.in.toc">
+<refmeta>
+<refentrytitle>simplesect.in.toc</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>simplesect.in.toc</refname>
+<refpurpose>Should <tag>simplesect</tag> elements appear in the TOC?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="simplesect.in.toc.frag">&lt;xsl:param name="simplesect.in.toc" select="0"&gt;&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, <tag>simplesect</tag>s will be included in the TOC.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="manual.toc">
+<refmeta>
+<refentrytitle>manual.toc</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>manual.toc</refname>
+<refpurpose>An explicit TOC to be used for the TOC</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="manual.toc.frag">
+&lt;xsl:param name="manual.toc"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The <parameter>manual.toc</parameter> identifies an explicit TOC that
+will be used for building the printed TOC.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="toc.list.type">
+<refmeta>
+<refentrytitle>toc.list.type</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">list</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">dl</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">ul</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">ol</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>toc.list.type</refname>
+<refpurpose>Type of HTML list element to use for Tables of Contents</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="toc.list.type.frag">&lt;xsl:param name="toc.list.type"&gt;dl&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>When an automatically generated Table of Contents (or List of Titles)
+is produced, this HTML element will be used to make the list.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="toc.section.depth">
+<refmeta>
+<refentrytitle>toc.section.depth</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">integer</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>toc.section.depth</refname>
+<refpurpose>How deep should recursive <tag>section</tag>s appear
+in the TOC?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="toc.section.depth.frag">&lt;xsl:param name="toc.section.depth"&gt;2&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies the depth to which recursive sections should appear in the
+TOC.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="toc.max.depth">
+<refmeta>
+<refentrytitle>toc.max.depth</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">integer</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>toc.max.depth</refname>
+<refpurpose>How many levels should be created for each TOC?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="toc.max.depth.frag">&lt;xsl:param name="toc.max.depth"&gt;8&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies the maximal depth of TOC on all levels.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="generate.toc">
+<refmeta>
+<refentrytitle>generate.toc</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">table</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>generate.toc</refname>
+<refpurpose>Control generation of ToCs and LoTs</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="generate.toc.frag">
+&lt;xsl:param name="generate.toc"&gt;
+appendix toc,title
+article/appendix nop
+article toc,title
+book toc,title,figure,table,example,equation
+chapter toc,title
+part toc,title
+preface toc,title
+qandadiv toc
+qandaset toc
+reference toc,title
+sect1 toc
+sect2 toc
+sect3 toc
+sect4 toc
+sect5 toc
+section toc
+set toc,title
+&lt;/xsl:param&gt;
+
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>This parameter has a structured value. It is a table of space-delimited
+path/value pairs. Each path identifies some element in the source document
+using a restricted subset of XPath (only the implicit child axis, no wildcards,
+no predicates). Paths can be either relative or absolute.</para>
+
+<para>When processing a particular element, the stylesheets consult this table to
+determine if a ToC (or LoT(s)) should be generated.</para>
+
+<para>For example, consider the entry:</para>
+
+<screen>book toc,figure</screen>
+
+<para>This indicates that whenever a <tag>book</tag> is formatted, a
+Table Of Contents and a List of Figures should be generated. Similarly,</para>
+
+<screen>/chapter toc</screen>
+
+<para>indicates that whenever a document <emphasis>that has a root
+of</emphasis> <tag>chapter</tag> is formatted, a Table of
+Contents should be generated. The entry <literal>chapter</literal> would match
+all chapters, but <literal>/chapter</literal> matches only <tag>chapter</tag>
+document elements.</para>
+
+<para>Generally, the longest match wins. So, for example, if you want to distinguish
+articles in books from articles in parts, you could use these two entries:</para>
+
+<screen>book/article toc,figure
+part/article toc</screen>
+
+<para>Note that an article in a part can never match a <literal>book/article</literal>,
+so if you want nothing to be generated for articles in parts, you can simply leave
+that rule out.</para>
+
+<para>If you want to leave the rule in, to make it explicit that you're turning
+something off, use the value <quote>nop</quote>. For example, the following
+entry disables ToCs and LoTs for articles:</para>
+
+<screen>article nop</screen>
+
+<para>Do not simply leave the word <quote>article</quote> in the file
+without a matching value. That'd be just begging the silly little
+path/value parser to get confused.</para>
+
+<para>Section ToCs are further controlled by the
+<parameter>generate.section.toc.level</parameter> parameter.
+For a given section level to have a ToC, it must have both an entry in
+<parameter>generate.toc</parameter> and be within the range enabled by
+<parameter>generate.section.toc.level</parameter>.</para>
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="generate.section.toc.level">
+<refmeta>
+<refentrytitle>generate.section.toc.level</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">integer</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>generate.section.toc.level</refname>
+<refpurpose>Control depth of TOC generation in sections</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="generate.section.toc.level.frag">
+&lt;xsl:param name="generate.section.toc.level" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The <parameter>generate.section.toc.level</parameter> parameter
+controls the depth of <tag>section</tag> in which TOCs will be generated. Note
+that this is related to, but not the same as
+<parameter>toc.section.depth</parameter>, which controls the depth to
+which TOC entries will be generated in a given TOC.</para>
+<para>If, for example, <parameter>generate.section.toc.level</parameter>
+is <literal>3</literal>, TOCs will be generated in first, second, and third
+level sections, but not in fourth level sections.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="generate.index">
+<refmeta>
+<refentrytitle>generate.index</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>generate.index</refname>
+<refpurpose>Do you want an index?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="generate.index.frag">&lt;xsl:param name="generate.index" select="1"&gt;&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specify if an index should be generated. </para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="index.method">
+<refmeta>
+<refentrytitle>index.method</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">list</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">basic</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">kosek</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">kimber</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>index.method</refname>
+<refpurpose>Select method used to group index entries in an index</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="index.method.frag">
+&lt;xsl:param name="index.method"&gt;basic&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>This parameter lets you select which method to use for sorting and grouping
+ index entries in an index.
+Indexes in Latin-based languages that have accented characters typically
+sort together accented words and unaccented words.
+Thus <quote>&#193;</quote> (U+00C1 LATIN CAPITAL LETTER A WITH ACUTE) would sort together
+with <quote>A</quote> (U+0041 LATIN CAPITAL LETTER A), so both would appear in the <quote>A</quote>
+section of the index.
+Languages using other alphabets (such as Russian, which is written in the Cyrillic alphabet)
+and languages using ideographic chararacters (such as Japanese)
+require grouping specific to the languages and alphabets.
+</para>
+
+<para>The default indexing method is limited.
+It can group accented characters in Latin-based languages only.
+It cannot handle non-Latin alphabets or ideographic languages.
+The other indexing methods require extensions of one type or
+another, and do not work with
+all XSLT processors, which is why they are not used by default.</para>
+
+<para>The three choices for indexing method are:</para>
+<variablelist>
+<varlistentry>
+<term><literal>basic</literal></term>
+<listitem>
+<para>
+(default) Sort and groups words based only on the Latin alphabet.
+Words with accented Latin letters will group and sort with
+their respective primary letter, but
+words in non-Latin alphabets will be
+put in the <quote>Symbols</quote> section of the index.
+</para>
+</listitem>
+</varlistentry>
+<varlistentry>
+<term><literal>kosek</literal></term>
+<listitem>
+<para>
+This method sorts and groups words based on letter groups configured in
+the DocBook locale file for the given language.
+See, for example, the French locale file <filename>common/fr.xml</filename>.
+This method requires that the XSLT processor
+supports the EXSLT extensions (most do).
+It also requires support for using
+user-defined functions in xsl:key (xsltproc does not).
+</para>
+<para>This method is suitable for any language for which you can
+list all the individual characters that should appear
+in each letter group in an index.
+It is probably not practical to use it for ideographic languages
+such as Chinese that have hundreds or thousands of characters.
+</para>
+
+<para>To use the kosek method, you must:</para>
+
+<orderedlist>
+<listitem>
+<para>Use a processor that supports its extensions, such as
+Saxon 6 or Xalan (xsltproc and Saxon 8 do not).
+</para>
+</listitem>
+<listitem>
+<para>Set the index.method parameter's value to <quote>kosek</quote>.
+</para>
+</listitem>
+<listitem>
+<para>Import the appropriate index extensions stylesheet module
+<filename>fo/autoidx-kosek.xsl</filename> or
+<filename>html/autoidx-kosek.xsl</filename> into your
+customization.
+</para>
+</listitem>
+</orderedlist>
+
+</listitem>
+</varlistentry>
+<varlistentry>
+<term><literal>kimber</literal></term>
+<listitem>
+<para>
+This method uses extensions to the Saxon processor to implement
+sophisticated indexing processes. It uses its own
+configuration file, which can include information for any number of
+languages. Each language's configuration can group
+words using one of two processes. In the
+enumerated process similar to that used in the kosek method,
+you indicate the groupings character-by-character.
+In the between-key process, you specify the
+break-points in the sort order that should start a new group.
+The latter configuration is useful for ideographic languages
+such as Chinese, Japanese, and Korean.
+You can also define your own collation algorithms and how you
+want mixed Latin-alphabet words sorted.</para>
+<itemizedlist>
+<listitem>
+<para>For a whitepaper describing the extensions, see:
+<link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.innodata-isogen.com/knowledge_center/white_papers/back_of_book_for_xsl_fo.pdf">http://www.innodata-isogen.com/knowledge_center/white_papers/back_of_book_for_xsl_fo.pdf</link>.
+</para>
+</listitem>
+<listitem>
+<para>To download the extension library, see
+<link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.innodata-isogen.com/knowledge_center/tools_downloads/i18nsupport">http://www.innodata-isogen.com/knowledge_center/tools_downloads/i18nsupport</link>.
+</para>
+</listitem>
+</itemizedlist>
+
+<para>To use the kimber method, you must:</para>
+
+<orderedlist>
+<listitem>
+<para>Use Saxon (version 6 or 8) as your XSLT processor.
+</para>
+</listitem>
+<listitem>
+<para>Install and configure the Innodata Isogen library, using
+the documentation that comes with it.
+</para>
+</listitem>
+<listitem>
+<para>Set the index.method parameter's value to <quote>kimber</quote>.
+</para>
+</listitem>
+<listitem>
+<para>Import the appropriate index extensions stylesheet module
+<filename>fo/autoidx-kimber.xsl</filename> or
+<filename>html/autoidx-kimber.xsl</filename> into your
+customization.
+</para>
+</listitem>
+</orderedlist>
+
+</listitem>
+</varlistentry>
+</variablelist>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="index.on.type">
+<refmeta>
+<refentrytitle>index.on.type</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>index.on.type</refname>
+<refpurpose>Select indexterms based on <tag class="attribute">type</tag>
+attribute value</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="index.on.type.frag">
+&lt;xsl:param name="index.on.type" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>
+If non-zero,
+then an <tag>index</tag> element that has a
+<tag class="attribute">type</tag> attribute
+value will contain only those <tag>indexterm</tag>
+elements with a matching <tag class="attribute">type</tag> attribute value.
+If an <tag>index</tag> has no <tag class="attribute">type</tag>
+attribute or it is blank, then the index will contain
+all <tag>indexterm</tag>s in the current scope.
+</para>
+
+<para>
+If <literal>index.on.type</literal> is zero, then the
+<tag class="attribute">type</tag> attribute has no effect
+on selecting indexterms for an index.
+</para>
+
+<para>For those using DocBook version 4.2 or earlier,
+the <tag class="attribute">type</tag> attribute is not available
+for index terms. However, you can achieve the same
+effect by using the <tag class="attribute">role</tag> attribute
+in the same manner on <tag>indexterm</tag>
+and <tag>index</tag>, and setting the stylesheet parameter
+<parameter>index.on.role</parameter> to a nonzero value.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="index.on.role">
+<refmeta>
+<refentrytitle>index.on.role</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>index.on.role</refname>
+<refpurpose>Select indexterms based on <tag class="attribute">role</tag> value</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="index.on.role.frag">
+&lt;xsl:param name="index.on.role" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>
+If non-zero,
+then an <tag>index</tag> element that has a
+<tag class="attribute">role</tag> attribute
+value will contain only those <tag>indexterm</tag>
+elements with a matching role value.
+If an <tag>index</tag> has no <tag class="attribute">role</tag>
+attribute or it is blank, then the index will contain
+all <tag>indexterm</tag>s in the current scope.
+</para>
+<para>
+If <literal>index.on.role</literal> is zero, then the
+<tag class="attribute">role</tag> attribute has no effect
+on selecting indexterms for an index.
+</para>
+
+<para>If you are using DocBook version 4.3 or later, you should
+use the <tag class="attribute">type</tag> attribute instead of <tag class="attribute">role</tag>
+on <tag>indexterm</tag> and <tag>index</tag>,
+and set the <parameter>index.on.type</parameter> to a nonzero
+value.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="index.links.to.section">
+<refmeta>
+<refentrytitle>index.links.to.section</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>index.links.to.section</refname>
+<refpurpose>HTML index entries link to container section title</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="index.links.to.section.frag">
+&lt;xsl:param name="index.links.to.section" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If zero, then an index entry in an index links
+directly to the location of the
+generated <tag>anchor</tag> that is output
+for the indexterm. If two identical indexterm elements
+exist in the same section, then both entries appear
+in the index with the same title but link to different
+locations.</para>
+
+<para>If non-zero, then an index entry in an index links to the
+section title containing the <tag>indexterm</tag>, rather than
+directly to the <tag>anchor</tag> output for the indexterm.
+Duplicate indexterm entries in the same section are dropped.
+</para>
+
+<para>The default value is 1, so index entries link to
+section titles by default.</para>
+
+<para>In both cases, the link text in an index entry is the
+title of the section containing the indexterm.
+That is because HTML does not have numbered pages.
+It also provides the reader with context information
+for each link.</para>
+
+<para>This parameter lets you choose which style of
+index linking you want. </para>
+
+<itemizedlist>
+<listitem>
+<para>When set to 0, an index entry takes you
+to the precise location of its corresponding indexterm.
+However, if you have a lot of duplicate
+entries in sections, then you have a lot of duplicate
+titles in the index, which makes it more cluttered.
+The reader may not recognize why duplicate titles
+appear until they follow the links. Also, the links
+may land the reader in the middle of a section where the
+section title is not visible, which may also be
+confusing to the reader.</para>
+</listitem>
+<listitem>
+<para>When set to 1, an index entry link is
+less precise, but duplicate titles in the
+index entries are eliminated.
+Landing on the section title location may confirm the reader's
+expectation that a link that
+shows a section title will take them to that section title,
+not a location within the section.
+</para>
+</listitem>
+</itemizedlist>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="index.prefer.titleabbrev">
+<refmeta>
+<refentrytitle>index.prefer.titleabbrev</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>index.prefer.titleabbrev</refname>
+<refpurpose>Should abbreviated titles be used as back references?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="index.prefer.titleabbrev.frag">
+&lt;xsl:param name="index.prefer.titleabbrev" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, and if a <tag>titleabbrev</tag> is defined, the abbreviated title
+is used as the link text of a back reference in the index.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="index.term.separator">
+<refmeta>
+<refentrytitle>index.term.separator</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>index.term.separator</refname>
+<refpurpose>Override for punctuation separating an index term
+from its list of page references in an index</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="index.term.separator.frag">
+&lt;xsl:param name="index.term.separator"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>This parameter permits you to override
+the text to insert between
+the end of an index term and its list of page references.
+Typically that might be a comma and a space.
+</para>
+
+<para>Because this text may be locale dependent,
+this parameter's value is normally taken from a gentext
+template named 'term-separator' in the
+context 'index' in the stylesheet
+locale file for the language
+of the current document.
+This parameter can be used to override the gentext string,
+and would typically be used on the command line.
+This parameter would apply to all languages.
+</para>
+
+<para>So this text string can be customized in two ways.
+You can reset the default gentext string using
+the <parameter>local.l10n.xml</parameter> parameter, or you can
+fill in the content for this normally empty
+override parameter.
+The content can be a simple string, or it can be
+something more complex such as a call-template.
+For fo output, it could be an <tag>fo:leader</tag>
+element to provide space of a specific length, or a dot leader.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="index.number.separator">
+<refmeta>
+<refentrytitle>index.number.separator</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>index.number.separator</refname>
+<refpurpose>Override for punctuation separating page numbers in index</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="index.number.separator.frag">
+&lt;xsl:param name="index.number.separator"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>This parameter permits you to override the text to insert between
+page references in a formatted index entry. Typically
+that would be a comma and a space.
+</para>
+
+<para>Because this text may be locale dependent,
+this parameter's value is normally taken from a gentext
+template named 'number-separator' in the
+context 'index' in the stylesheet
+locale file for the language
+of the current document.
+This parameter can be used to override the gentext string,
+and would typically be used on the command line.
+This parameter would apply to all languages.
+</para>
+
+<para>So this text string can be customized in two ways.
+You can reset the default gentext string using
+the <parameter>local.l10n.xml</parameter> parameter, or you can
+override the gentext with the content of this parameter.
+The content can be a simple string, or it can be
+something more complex such as a call-template.
+</para>
+
+<para>In HTML index output, section title references are used instead of
+page number references. This punctuation appears between
+such section titles in an HTML index.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="index.range.separator">
+<refmeta>
+<refentrytitle>index.range.separator</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>index.range.separator</refname>
+<refpurpose>Override for punctuation separating the two numbers
+in a page range in index</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="index.range.separator.frag">
+&lt;xsl:param name="index.range.separator"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>This parameter permits you
+to override the text to insert between
+the two numbers of a page range in an index.
+This parameter is only used by those XSL-FO processors
+that support an extension for generating such page ranges
+(such as XEP).</para>
+
+<para>Because this text may be locale dependent,
+this parameter's value is normally taken from a gentext
+template named 'range-separator' in the
+context 'index' in the stylesheet
+locale file for the language
+of the current document.
+This parameter can be used to override the gentext string,
+and would typically be used on the command line.
+This parameter would apply to all languages.
+</para>
+
+<para>So this text string can be customized in two ways.
+You can reset the default gentext string using
+the <parameter>local.l10n.xml</parameter> parameter, or you can
+override the gentext with the content of this parameter.
+The content can be a simple string, or it can be
+something more complex such as a call-template.
+</para>
+
+<para>In HTML index output, section title references are used instead of
+page number references. So there are no page ranges
+and this parameter has no effect.
+</para>
+
+</refsection>
+</refentry>
+
+</reference>
+<reference xml:id="dbk_ext"><title>Stylesheet Extensions</title>
+<refentry version="5.0" xml:id="linenumbering.everyNth">
+<refmeta>
+<refentrytitle>linenumbering.everyNth</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">integer</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>linenumbering.everyNth</refname>
+<refpurpose>Indicate which lines should be numbered</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="linenumbering.everyNth.frag">
+&lt;xsl:param name="linenumbering.everyNth"&gt;5&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If line numbering is enabled, everyNth line will be
+numbered. Note that numbering is one based, not zero based.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="linenumbering.extension">
+<refmeta>
+<refentrytitle>linenumbering.extension</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>linenumbering.extension</refname>
+<refpurpose>Enable the line numbering extension</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="linenumbering.extension.frag">
+&lt;xsl:param name="linenumbering.extension" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, verbatim environments (<tag>address</tag>, <tag>literallayout</tag>,
+<tag>programlisting</tag>, <tag>screen</tag>, <tag>synopsis</tag>) that specify line numbering will
+have line numbers.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="linenumbering.separator">
+<refmeta>
+<refentrytitle>linenumbering.separator</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>linenumbering.separator</refname>
+<refpurpose>Specify a separator between line numbers and lines</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="linenumbering.separator.frag">
+&lt;xsl:param name="linenumbering.separator"&gt;&lt;xsl:text&gt; &lt;/xsl:text&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The separator is inserted between line numbers and lines in the
+verbatim environment. The default value is a single white space.
+ Note the interaction with <parameter>linenumbering.width</parameter>
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="linenumbering.width">
+<refmeta>
+<refentrytitle>linenumbering.width</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">integer</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>linenumbering.width</refname>
+<refpurpose>Indicates the width of line numbers</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="linenumbering.width.frag">
+&lt;xsl:param name="linenumbering.width"&gt;3&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If line numbering is enabled, line numbers will appear right
+justified in a field "width" characters wide.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="tablecolumns.extension">
+<refmeta>
+<refentrytitle>tablecolumns.extension</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>tablecolumns.extension</refname>
+<refpurpose>Enable the table columns extension function</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="tablecolumns.extension.frag">
+&lt;xsl:param name="tablecolumns.extension" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The table columns extension function adjusts the widths of table
+columns in the HTML result to more accurately reflect the specifications
+in the CALS table.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="textinsert.extension">
+ <refmeta>
+ <refentrytitle>textinsert.extension</refentrytitle>
+ <refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+ </refmeta>
+ <refnamediv>
+ <refname>textinsert.extension</refname>
+ <refpurpose>Enables the textinsert extension element</refpurpose>
+ </refnamediv>
+ <refsynopsisdiv>
+ <programlisting xml:id="textinsert.extension.frag">
+ &lt;xsl:param name="textinsert.extension" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+ </refsynopsisdiv>
+ <refsection><info><title>Description</title></info>
+ <para>The textinsert extension element inserts the contents of
+ a file into the result tree (as text).</para>
+ <note>
+ <para>To use the textinsert extension element, you must use
+ either Saxon or Xalan as your XSLT processor (it doesn&#8217;t
+ work with xsltproc), along with either the DocBook Saxon
+ extensions or DocBook Xalan extensions (for more
+ information about those extensions, see <link xmlns:xlink="http://www.w3.org/1999/xlink" role="tcg" xlink:href="InstallingAProcessor.html#SaxonExtensions">DocBook Saxon Extensions</link> and <link xmlns:xlink="http://www.w3.org/1999/xlink" role="tcg" xlink:href="InstallingAProcessor.html#XalanExtensions">DocBook Xalan Extensions</link>), and you must set both
+ the <parameter>use.extensions</parameter> and
+ <parameter>textinsert.extension</parameter> parameters to
+ <literal>1</literal>.</para>
+ <para>As an alternative to using the textinsert element,
+ consider using an Xinclude element with the
+ <literal>parse="text"</literal> attribute and value
+ specified, as detailed in <link xmlns:xlink="http://www.w3.org/1999/xlink" role="tcg" xlink:href="ExternalCode.html#XIncludeCode">Using XInclude for text inclusions</link>.</para>
+ </note>
+ </refsection>
+ <refsection><info><title>See Also</title></info>
+ <para>You can also use the <tag class="xmlpi">dbhtml-include&#160;href</tag> processing
+ instruction to insert external files &#8212; both files containing
+ plain text and files with markup content (including HTML
+ content).</para>
+ </refsection>
+ <refsection><info><title>More information</title></info>
+ <para>For how-to documentation on inserting contents of
+ external code files and other text files into output, see
+ <link xmlns:xlink="http://www.w3.org/1999/xlink" role="tcg" xlink:href="ExternalCode.html">External code files</link>.</para>
+ <para>For guidelines on inserting contents of
+ HTML files into output, see <link xmlns:xlink="http://www.w3.org/1999/xlink" role="tcg" xlink:href="InsertExtHtml.html">Inserting external HTML code</link>.</para>
+ </refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="textdata.default.encoding">
+<refmeta>
+<refentrytitle>textdata.default.encoding</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>textdata.default.encoding</refname>
+<refpurpose>Default encoding of external text files which are included
+using textdata element</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="textdata.default.encoding.frag">
+&lt;xsl:param name="textdata.default.encoding"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies the encoding of any external text files included using
+<tag>textdata</tag> element. This value is used only when you do
+not specify encoding by the appropriate attribute
+directly on textdata. An empty string is interpreted as the system
+default encoding.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="graphicsize.extension">
+<refmeta>
+<refentrytitle>graphicsize.extension</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>graphicsize.extension</refname>
+<refpurpose>Enable the getWidth()/getDepth() extension functions</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="graphicsize.extension.frag">
+&lt;xsl:param name="graphicsize.extension" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero (and if <parameter>use.extensions</parameter> is non-zero
+and if you're using a processor that supports extension functions), the
+<function>getWidth</function> and <function>getDepth</function> functions
+will be used to extract image sizes from graphics.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="graphicsize.use.img.src.path">
+<refmeta>
+<refentrytitle>graphicsize.use.img.src.path</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>graphicsize.use.img.src.path</refname>
+<refpurpose>Prepend <parameter>img.src.path</parameter> before
+filenames passed to extension functions</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="graphicsize.use.img.src.path.frag">
+&lt;xsl:param name="graphicsize.use.img.src.path" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero <parameter>img.src.path</parameter> parameter will
+be appended before filenames passed to extension functions for
+measuring image dimensions.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="use.extensions">
+<refmeta>
+<refentrytitle>use.extensions</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>use.extensions</refname>
+<refpurpose>Enable extensions</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="use.extensions.frag">
+&lt;xsl:param name="use.extensions" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, extensions may be used. Each extension is
+further controlled by its own parameter. But if
+<parameter>use.extensions</parameter> is zero, no extensions will
+be used.
+</para>
+
+</refsection>
+</refentry>
+
+</reference>
+<reference xml:id="labels"><title>Automatic labelling</title>
+<refentry version="5.0" xml:id="chapter.autolabel">
+<refmeta>
+<refentrytitle>chapter.autolabel</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">list</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">0<alt>none</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">1<alt>1,2,3...</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">A<alt>A,B,C...</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">a<alt>a,b,c...</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">i<alt>i,ii,iii...</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">I<alt>I,II,III...</alt></refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>chapter.autolabel</refname>
+<refpurpose>Specifies the labeling format for Chapter titles</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="chapter.autolabel.frag">
+&lt;xsl:param name="chapter.autolabel" select="1"&gt;&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, then chapters will be numbered using the parameter
+value as the number format if the value matches one of the following:
+</para>
+
+<variablelist>
+ <varlistentry>
+ <term>1 or arabic</term>
+ <listitem>
+ <para>Arabic numeration (1, 2, 3 ...).</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>A or upperalpha</term>
+ <listitem>
+ <para>Uppercase letter numeration (A, B, C ...).</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>a or loweralpha</term>
+ <listitem>
+ <para>Lowercase letter numeration (a, b, c ...).</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>I or upperroman</term>
+ <listitem>
+ <para>Uppercase roman numeration (I, II, III ...).</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>i or lowerroman</term>
+ <listitem>
+ <para>Lowercase roman letter numeration (i, ii, iii ...).</para>
+ </listitem>
+ </varlistentry>
+</variablelist>
+
+<para>Any nonzero value other than the above will generate
+the default number format (arabic).
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="appendix.autolabel">
+<refmeta>
+<refentrytitle>appendix.autolabel</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">list</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">0<alt>none</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">1<alt>1,2,3...</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">A<alt>A,B,C...</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">a<alt>a,b,c...</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">i<alt>i,ii,iii...</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">I<alt>I,II,III...</alt></refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>appendix.autolabel</refname>
+<refpurpose>Specifies the labeling format for Appendix titles</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="appendix.autolabel.frag">
+&lt;xsl:param name="appendix.autolabel"&gt;A&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, then appendices will be numbered using the
+parameter value as the number format if the value matches one of the
+following:
+</para>
+
+<variablelist>
+ <varlistentry>
+ <term>1 or arabic</term>
+ <listitem>
+ <para>Arabic numeration (1, 2, 3 ...).</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>A or upperalpha</term>
+ <listitem>
+ <para>Uppercase letter numeration (A, B, C ...).</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>a or loweralpha</term>
+ <listitem>
+ <para>Lowercase letter numeration (a, b, c ...).</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>I or upperroman</term>
+ <listitem>
+ <para>Uppercase roman numeration (I, II, III ...).</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>i or lowerroman</term>
+ <listitem>
+ <para>Lowercase roman letter numeration (i, ii, iii ...).</para>
+ </listitem>
+ </varlistentry>
+</variablelist>
+
+<para>Any nonzero value other than the above will generate
+the default number format (upperalpha).
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="part.autolabel">
+<refmeta>
+<refentrytitle>part.autolabel</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">list</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">0<alt>none</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">1<alt>1,2,3...</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">A<alt>A,B,C...</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">a<alt>a,b,c...</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">i<alt>i,ii,iii...</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">I<alt>I,II,III...</alt></refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>part.autolabel</refname>
+<refpurpose>Specifies the labeling format for Part titles</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="part.autolabel.frag">
+&lt;xsl:param name="part.autolabel"&gt;I&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, then parts will be numbered using the parameter
+value as the number format if the value matches one of the following:
+</para>
+
+<variablelist>
+ <varlistentry>
+ <term>1 or arabic</term>
+ <listitem>
+ <para>Arabic numeration (1, 2, 3 ...).</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>A or upperalpha</term>
+ <listitem>
+ <para>Uppercase letter numeration (A, B, C ...).</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>a or loweralpha</term>
+ <listitem>
+ <para>Lowercase letter numeration (a, b, c ...).</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>I or upperroman</term>
+ <listitem>
+ <para>Uppercase roman numeration (I, II, III ...).</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>i or lowerroman</term>
+ <listitem>
+ <para>Lowercase roman letter numeration (i, ii, iii ...).</para>
+ </listitem>
+ </varlistentry>
+</variablelist>
+
+<para>Any nonzero value other than the above will generate
+the default number format (upperroman).
+</para>
+
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="reference.autolabel">
+<refmeta>
+<refentrytitle>reference.autolabel</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">list</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">0<alt>none</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">1<alt>1,2,3...</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">A<alt>A,B,C...</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">a<alt>a,b,c...</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">i<alt>i,ii,iii...</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">I<alt>I,II,III...</alt></refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>reference.autolabel</refname>
+<refpurpose>Specifies the labeling format for Reference titles</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+<programlisting xml:id="reference.autolabel.frag">
+ &lt;xsl:param name="reference.autolabel"&gt;I&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+<para>If non-zero, references will be numbered using the parameter
+ value as the number format if the value matches one of the
+ following:
+</para>
+<variablelist>
+ <varlistentry>
+ <term>1 or arabic</term>
+ <listitem>
+ <para>Arabic numeration (1, 2, 3 ...).</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>A or upperalpha</term>
+ <listitem>
+ <para>Uppercase letter numeration (A, B, C ...).</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>a or loweralpha</term>
+ <listitem>
+ <para>Lowercase letter numeration (a, b, c ...).</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>I or upperroman</term>
+ <listitem>
+ <para>Uppercase roman numeration (I, II, III ...).</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>i or lowerroman</term>
+ <listitem>
+ <para>Lowercase roman letter numeration (i, ii, iii ...).</para>
+ </listitem>
+ </varlistentry>
+</variablelist>
+<para>Any non-zero value other than the above will generate
+the default number format (upperroman).
+</para>
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="preface.autolabel">
+<refmeta>
+<refentrytitle>preface.autolabel</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">list</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">0<alt>none</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">1<alt>1,2,3...</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">A<alt>A,B,C...</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">a<alt>a,b,c...</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">i<alt>i,ii,iii...</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">I<alt>I,II,III...</alt></refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>preface.autolabel</refname>
+<refpurpose>Specifices the labeling format for Preface titles</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="preface.autolabel.frag">&lt;xsl:param name="preface.autolabel" select="0"&gt;&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero then prefaces will be numbered using the parameter
+value as the number format if the value matches one of the following:
+</para>
+
+<variablelist>
+ <varlistentry>
+ <term>1 or arabic</term>
+ <listitem>
+ <para>Arabic numeration (1, 2, 3 ...).</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>A or upperalpha</term>
+ <listitem>
+ <para>Uppercase letter numeration (A, B, C ...).</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>a or loweralpha</term>
+ <listitem>
+ <para>Lowercase letter numeration (a, b, c ...).</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>I or upperroman</term>
+ <listitem>
+ <para>Uppercase roman numeration (I, II, III ...).</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>i or lowerroman</term>
+ <listitem>
+ <para>Lowercase roman letter numeration (i, ii, iii ...).</para>
+ </listitem>
+ </varlistentry>
+</variablelist>
+
+<para>Any nonzero value other than the above will generate
+the default number format (arabic).
+</para>
+
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="qandadiv.autolabel">
+<refmeta>
+<refentrytitle>qandadiv.autolabel</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>qandadiv.autolabel</refname>
+<refpurpose>Are divisions in QAndASets enumerated?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="qandadiv.autolabel.frag">&lt;xsl:param name="qandadiv.autolabel" select="1"&gt;&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, unlabeled qandadivs will be enumerated.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="section.autolabel">
+<refmeta>
+<refentrytitle>section.autolabel</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>section.autolabel</refname>
+<refpurpose>Are sections enumerated?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="section.autolabel.frag">&lt;xsl:param name="section.autolabel" select="0"&gt;&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If true (non-zero), unlabeled sections will be enumerated.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="section.autolabel.max.depth">
+<refmeta>
+<refentrytitle>section.autolabel.max.depth</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">integer</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>section.autolabel.max.depth</refname>
+<refpurpose>The deepest level of sections that are numbered.</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="section.autolabel.max.depth.frag">
+&lt;xsl:param name="section.autolabel.max.depth"&gt;8&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>When section numbering is turned on by the
+<parameter>section.autolabel</parameter> parameter, then this
+parameter controls the depth of <tag>section</tag> nesting that is
+numbered. Sections nested to a level deeper than this value will not
+be numbered.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="section.label.includes.component.label">
+<refmeta>
+<refentrytitle>section.label.includes.component.label</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>section.label.includes.component.label</refname>
+<refpurpose>Do section labels include the component label?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="section.label.includes.component.label.frag">&lt;xsl:param name="section.label.includes.component.label" select="0"&gt;&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, section labels are prefixed with the label of the
+component that contains them.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="label.from.part">
+<refmeta>
+<refentrytitle>label.from.part</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>label.from.part</refname>
+<refpurpose>Renumber components in each part?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="label.from.part.frag">
+&lt;xsl:param name="label.from.part" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If <parameter>label.from.part</parameter> is non-zero, then
+ numbering of components &#8212; <tag>preface</tag>,
+ <tag>chapter</tag>, <tag>appendix</tag>, and
+ <tag>reference</tag> (when <tag>reference</tag> occurs at the
+ component level) &#8212; is re-started within each
+ <tag>part</tag>.</para>
+<para>If <parameter>label.from.part</parameter> is zero (the
+ default), numbering of components is <emphasis>not</emphasis>
+ re-started within each <tag>part</tag>; instead, components are
+ numbered sequentially throughout each <tag>book</tag>,
+ regardless of whether or not they occur within <tag>part</tag>
+ instances.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="component.label.includes.part.label">
+<refmeta>
+<refentrytitle>component.label.includes.part.label</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>component.label.includes.part.label</refname>
+<refpurpose>Do component labels include the part label?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="component.label.includes.part.label.frag">&lt;xsl:param name="component.label.includes.part.label" select="0"&gt;&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, number labels for <tag>chapter</tag>,
+<tag>appendix</tag>, and other component elements are prefixed with
+the label of the part element that contains them. So you might see
+Chapter II.3 instead of Chapter 3. Also, the labels for formal
+elements such as <tag>table</tag> and <tag>figure</tag> will include
+the part label. If there is no part element container, then no prefix
+is generated.
+</para>
+<para>
+This feature is most useful when the
+<parameter>label.from.part</parameter> parameter is turned on.
+In that case, there would be more than one <tag>chapter</tag>
+<quote>1</quote>, and the extra part label prefix will identify
+each chapter unambiguously.
+</para>
+
+</refsection>
+</refentry>
+
+</reference>
+
+<reference xml:id="html"><title>HTML</title>
+<refentry version="5.0" xml:id="html.base">
+<refmeta>
+<refentrytitle>html.base</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">uri</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>html.base</refname>
+<refpurpose>An HTML base URI</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="html.base.frag">
+&lt;xsl:param name="html.base"&gt;&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If html.base is set, it is used for the <tag>base</tag> element
+in the <tag>head</tag> of the html documents. The parameter specifies
+the base URL for all relative URLs in the document. This is useful
+for dynamically served html where the base URI needs to be
+shifted.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="html.stylesheet.type">
+<refmeta>
+<refentrytitle>html.stylesheet.type</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>html.stylesheet.type</refname>
+<refpurpose>The type of the stylesheet used in the generated HTML</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="html.stylesheet.type.frag">&lt;xsl:param name="html.stylesheet.type"&gt;text/css&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The type of the stylesheet to place in the HTML <tag>link</tag> tag.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="html.stylesheet">
+<refmeta>
+<refentrytitle>html.stylesheet</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>html.stylesheet</refname>
+<refpurpose>Name of the stylesheet(s) to use in the generated HTML</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="html.stylesheet.frag">
+&lt;xsl:param name="html.stylesheet"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The <parameter>html.stylesheet</parameter> parameter is either
+empty, indicating that no stylesheet <tag>link</tag> tag should be
+generated in the html output, or it is a list of one or more
+stylesheet files.</para>
+
+<para>Multiple stylesheets are space-delimited. If you need to
+reference a stylesheet URI that includes a space, encode it with
+<literal>%20</literal>. A separate html <literal>link</literal> element will
+be generated for each stylesheet in the order they are listed in the
+parameter.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="css.decoration">
+<refmeta>
+<refentrytitle>css.decoration</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>css.decoration</refname>
+<refpurpose>Enable CSS decoration of elements</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="css.decoration.frag">
+&lt;xsl:param name="css.decoration" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>
+If non-zero, then html elements produced by the stylesheet may be
+decorated with <literal>style</literal> attributes. For example, the
+<literal>li</literal> tags produced for list items may include a
+fragment of CSS in the <literal>style</literal> attribute which sets
+the CSS property "list-style-type".
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="spacing.paras">
+<refmeta>
+<refentrytitle>spacing.paras</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>spacing.paras</refname>
+<refpurpose>Insert additional &lt;p&gt; elements for spacing?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="spacing.paras.frag">
+&lt;xsl:param name="spacing.paras" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>When non-zero, additional, empty paragraphs are inserted in
+several contexts (for example, around informal figures), to create a
+more pleasing visual appearance in many browsers.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="emphasis.propagates.style">
+<refmeta>
+<refentrytitle>emphasis.propagates.style</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>emphasis.propagates.style</refname>
+<refpurpose>Pass emphasis role attribute through to HTML?</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+<programlisting xml:id="emphasis.propagates.style.frag">
+&lt;xsl:param name="emphasis.propagates.style" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+<para>If non-zero, the <literal>role</literal> attribute of
+<tag>emphasis</tag> elements will be passed through to the HTML as a
+class attribute on a <literal>span</literal> that surrounds the
+emphasis.</para>
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="para.propagates.style">
+<refmeta>
+<refentrytitle>para.propagates.style</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>para.propagates.style</refname>
+<refpurpose>Pass para role attribute through to HTML?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="para.propagates.style.frag">
+&lt;xsl:param name="para.propagates.style" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If true, the role attribute of <tag>para</tag> elements
+will be passed through to the HTML as a class attribute on the
+<tag>p</tag> generated for the paragraph.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="phrase.propagates.style">
+<refmeta>
+<refentrytitle>phrase.propagates.style</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>phrase.propagates.style</refname>
+<refpurpose>Pass phrase role attribute through to HTML?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="phrase.propagates.style.frag">
+&lt;xsl:param name="phrase.propagates.style" select="1"&gt;&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, the role attribute of <tag>phrase</tag> elements
+will be passed through to the HTML as a <literal>class</literal>
+attribute on a <literal>span</literal> that surrounds the
+phrase.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="entry.propagates.style">
+<refmeta>
+<refentrytitle>entry.propagates.style</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>entry.propagates.style</refname>
+<refpurpose>Pass entry role attribute through to HTML?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="entry.propagates.style.frag">
+&lt;xsl:param name="entry.propagates.style" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If true, the role attribute of <tag>entry</tag> elements
+will be passed through to the HTML as a class attribute on the
+<tag>td</tag> or <tag>th</tag> generated for the table
+cell.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="html.longdesc">
+<refmeta>
+<refentrytitle>html.longdesc</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>html.longdesc</refname>
+<refpurpose>Should longdesc URIs be created?</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+<programlisting xml:id="html.longdesc.frag">
+&lt;xsl:param name="html.longdesc" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+<para>If non-zero, HTML files will be created for the
+<literal>longdesc</literal> attribute. These files
+are created from the <tag>textobject</tag>s in
+<tag>mediaobject</tag>s and
+<tag>inlinemediaobject</tag>.
+</para>
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="html.longdesc.link">
+<refmeta>
+<refentrytitle>html.longdesc.link</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>html.longdesc.link</refname>
+<refpurpose>Should a link to the longdesc be included in the HTML?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="html.longdesc.link.frag">
+&lt;xsl:param name="html.longdesc.link" select="$html.longdesc"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, links will be created to the
+HTML files created for the
+<literal>longdesc</literal> attribute. It makes no
+sense to enable this option without also enabling the
+<parameter>html.longdesc</parameter> parameter.</para>
+
+
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="make.valid.html">
+<refmeta>
+<refentrytitle>make.valid.html</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>make.valid.html</refname>
+<refpurpose>Attempt to make sure the HTML output is valid HTML</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="make.valid.html.frag">
+&lt;xsl:param name="make.valid.html" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If <parameter>make.valid.html</parameter> is true, the stylesheets take
+extra effort to ensure that the resulting HTML is valid. This may mean that some
+<tag>para</tag> tags are translated into HTML <tag>div</tag>s or
+that other substitutions occur.</para>
+
+<para>This parameter is different from <parameter>html.cleanup</parameter>
+because it changes the resulting markup; it does not use extension functions
+to manipulate result-tree-fragments and is therefore applicable to any
+XSLT processor.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="html.cleanup">
+<refmeta>
+<refentrytitle>html.cleanup</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>html.cleanup</refname>
+<refpurpose>Attempt to clean up the resulting HTML?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="html.cleanup.frag">
+&lt;xsl:param name="html.cleanup" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, and if the <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.exslt.org/">EXSLT</link>
+extensions are supported by your processor, the resulting HTML will be
+<quote>cleaned up</quote>. This improves the chances that the
+resulting HTML will be valid. It may also improve the formatting of
+some elements.</para>
+
+<para>This parameter is different from <parameter>make.valid.html</parameter>
+because it uses extension functions to manipulate result-tree-fragments.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="html.append">
+<refmeta>
+<refentrytitle>html.append</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>html.append</refname>
+<refpurpose>Specifies content to append to HTML output</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="html.append.frag">&lt;xsl:param name="html.append"&gt;&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies content to append to the end of HTML files output by
+the <filename>html/docbook.xsl</filename> stylesheet, after the
+closing <code>&lt;html&gt;</code> tag. You probably don&#8217;t want to set any
+value for this parameter; but if you do, the only value it should ever
+be set to is a newline character: <code>&amp;#x0a;</code> or
+<code>&amp;#10;</code></para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="draft.mode">
+<refmeta>
+<refentrytitle>draft.mode</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">list</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">no</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">yes</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">maybe</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>draft.mode</refname>
+<refpurpose>Select draft mode</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="draft.mode.frag">
+&lt;xsl:param name="draft.mode"&gt;no&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Selects draft mode. If <parameter>draft.mode</parameter> is
+<quote><literal>yes</literal></quote>, the entire document will be treated
+as a draft. If it is <quote><literal>no</literal></quote>, the entire document
+will be treated as a final copy. If it is <quote><literal>maybe</literal></quote>,
+individual sections will be treated as draft or final independently, depending
+on how their <literal>status</literal> attribute is set.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="draft.watermark.image">
+<refmeta>
+<refentrytitle>draft.watermark.image</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">uri</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>draft.watermark.image</refname>
+<refpurpose>The URI of the image to be used for draft watermarks</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="draft.watermark.image.frag">
+&lt;xsl:param name="draft.watermark.image"&gt;images/draft.png&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The image to be used for draft watermarks.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="generate.id.attributes">
+<refmeta>
+<refentrytitle>generate.id.attributes</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>generate.id.attributes</refname>
+<refpurpose>Generate ID attributes on container elements?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="generate.id.attributes.frag">
+&lt;xsl:param name="generate.id.attributes" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, the HTML stylesheet will generate ID attributes on
+containers. For example, the markup:</para>
+
+<screen>&lt;section id="foo"&gt;&lt;title&gt;Some Title&lt;/title&gt;
+&lt;para&gt;Some para.&lt;/para&gt;
+&lt;/section&gt;</screen>
+
+<para>might produce:</para>
+
+<screen>&lt;div class="section" id="foo"&gt;
+&lt;h2&gt;Some Title&lt;/h2&gt;
+&lt;p&gt;Some para.&lt;/p&gt;
+&lt;/div&gt;</screen>
+
+<para>The alternative is to generate anchors:</para>
+
+<screen>&lt;div class="section"&gt;
+&lt;h2&gt;&lt;a name="foo"&gt;&lt;/a&gt;Some Title&lt;/h2&gt;
+&lt;p&gt;Some para.&lt;/p&gt;
+&lt;/div&gt;</screen>
+
+<para>Because the <tag class="attribute">name</tag> attribute of
+the <tag>a</tag> element and the <tag class="attribute">id</tag>
+attribute of other tags are both of type <quote>ID</quote>, producing both
+generates invalid documents.</para>
+
+<para>As of version 1.50, you can use this switch to control which type of
+identifier is generated. For backwards-compatibility, generating
+<tag>a</tag> anchors is preferred.</para>
+
+<para>Note: at present, this switch is incompletely implemented.
+Disabling ID attributes will suppress them, but enabling ID attributes
+will not suppress the anchors.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="generate.meta.abstract">
+<refmeta>
+<refentrytitle>generate.meta.abstract</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>generate.meta.abstract</refname>
+<refpurpose>Generate HTML <tag>META</tag> element from <tag>abstract</tag>?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="generate.meta.abstract.frag">
+&lt;xsl:param name="generate.meta.abstract" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, document abstracts will be reproduced in the HTML
+<literal>head</literal>, with <literal>&gt;meta name="description" content="..."</literal></para>
+
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="make.clean.html">
+<refmeta>
+<refentrytitle>make.clean.html</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>make.clean.html</refname>
+<refpurpose>Make HTML conform to modern coding standards</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="make.clean.html.frag">
+&lt;xsl:param name="make.clean.html" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If <parameter>make.clean.html</parameter> is true, the stylesheets take
+extra effort to ensure that the resulting HTML is conforms to
+modern HTML coding standards. In addition to eliminating
+excessive and noncompliant coding, it moves presentation
+HTML coding to a CSS stylesheet.</para>
+
+<para>The resulting HTML is dependent on
+CSS for formatting, and so the stylesheet is capable of
+generating a supporting CSS file. The <parameter>docbook.css.source</parameter>
+and <parameter>custom.css.source</parameter> parameters control
+how a CSS file is generated.</para>
+
+<para>If you require your CSS to reside in the HTML
+<tag>head</tag> element, then the <parameter>generate.css.header</parameter>
+can be used to do that.</para>
+
+<para>The <parameter>make.clean.html</parameter> parameter is
+different from <parameter>html.cleanup</parameter>
+because the former changes the resulting markup; it does not use extension functions
+like the latter to manipulate result-tree-fragments,
+and is therefore applicable to any XSLT processor.</para>
+
+<para>If <parameter>make.clean.html</parameter> is set to zero (the default),
+then the stylesheet retains its original
+<quote>old style</quote>
+HTML formatting features.</para>
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="docbook.css.source">
+ <refmeta>
+ <refentrytitle>docbook.css.source</refentrytitle>
+ <refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+ </refmeta>
+ <refnamediv>
+ <refname>docbook.css.source</refname>
+ <refpurpose>Name of the default CSS input file</refpurpose>
+ </refnamediv>
+
+ <refsynopsisdiv>
+ <programlisting xml:id="docbook.css.source.frag">&lt;xsl:param name="docbook.css.source"&gt;docbook.css.xml&lt;/xsl:param&gt;</programlisting>
+ </refsynopsisdiv>
+
+ <refsection><info><title>Description</title></info>
+
+<para>The <parameter>docbook.css.source</parameter> parameter
+specifies the name of the file containing the default DocBook
+CSS styles. Those styles are necessary when the
+<parameter>make.clean.html</parameter> parameter is nonzero.</para>
+
+<para>The file is a well-formed XML file that
+must consist of a single <tag>style</tag> root
+element that contains CSS styles as its text content.
+The default value of the parameter (and filename)
+is <literal>docbook.css.xml</literal>.
+The stylesheets ship with the default file. You can substitute
+your own and specify its path in this parameter.</para>
+
+<para>If <parameter>docbook.css.source</parameter> is not blank,
+and <parameter>make.clean.html</parameter> is nonzero, then
+the stylesheet takes the following actions:</para>
+
+<orderedlist>
+ <listitem>
+ <para>The stylesheet uses the XSLT <literal>document()</literal>
+ function to open the file specified by the parameter and
+ load it into a variable.</para>
+ </listitem>
+ <listitem>
+ <para>The stylesheet forms an output pathname consisting of the
+ value of the <parameter>base.dir</parameter> parameter (if it is set)
+ and the value of <parameter>docbook.css.source</parameter>,
+ with the <literal>.xml</literal> suffix stripped off.
+ </para>
+ </listitem>
+ <listitem>
+ <para>The stylesheet removes the <tag>style</tag>
+ wrapper element and writes just the CSS text content to the output file.</para>
+ </listitem>
+ <listitem>
+ <para>The stylesheet adds a <tag>link</tag> element to the
+ HTML <tag>HEAD</tag> element to reference the external CSS stylesheet.
+ For example:</para>
+ <programlisting>&lt;link rel="stylesheet" href="docbook.css" type="text/css"&gt;
+ </programlisting>
+ <para>However, if the <parameter>docbook.css.link</parameter>
+ parameter is set to zero, then no <tag>link</tag> is written
+ for the default CSS file. That is useful if a custom
+ CSS file will import the default CSS stylesheet to ensure
+ proper cascading of styles.</para>
+ </listitem>
+</orderedlist>
+
+<para>If the <parameter>docbook.css.source</parameter> parameter
+is changed from its default <literal>docbook.css.xml</literal> to blank,
+then no default CSS is generated. Likewise if the
+<parameter>make.clean.html</parameter> parameter is set to zero,
+then no default CSS is generated. The
+<parameter>custom.css.source</parameter> parameter can be used
+instead to generate a complete custom CSS file.</para>
+
+<para>You can use the <parameter>generate.css.header</parameter>
+parameter to instead write the CSS to each HTML <tag>HEAD</tag>
+element in a <tag>style</tag> tag instead of an external CSS file.</para>
+
+ </refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="docbook.css.link">
+<refmeta>
+<refentrytitle>docbook.css.link</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>docbook.css.link</refname>
+<refpurpose>Insert a link referencing the default CSS stylesheet</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="docbook.css.link.frag">
+&lt;xsl:param name="docbook.css.link" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The stylesheets are capable of generating a default
+CSS stylesheet file. The parameters
+<parameter>make.clean.html</parameter> and
+<parameter>docbook.css.source</parameter> control that feature.</para>
+
+<para>Normally if a default CSS file is generated, then
+the stylesheet inserts a <tag>link</tag> tag in the HTML
+<tag>HEAD</tag> element to reference it.
+However, you can omit that <tag>link</tag> reference if
+you set the <parameter>docbook.css.link</parameter> to zero
+(1 is the default).</para>
+
+<para>This parameter is useful when you want to import the
+default CSS into a custom CSS file generated using the
+<parameter>custom.css.source</parameter> parameter.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="custom.css.source">
+ <refmeta>
+ <refentrytitle>custom.css.source</refentrytitle>
+ <refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+ </refmeta>
+ <refnamediv>
+ <refname>custom.css.source</refname>
+ <refpurpose>Name of a custom CSS input file</refpurpose>
+ </refnamediv>
+
+ <refsynopsisdiv>
+ <programlisting xml:id="custom.css.source.frag">&lt;xsl:param name="custom.css.source"&gt;&lt;/xsl:param&gt;</programlisting>
+ </refsynopsisdiv>
+
+ <refsection><info><title>Description</title></info>
+
+<para>The <parameter>custom.css.source</parameter>
+parameter enables you to add CSS styles to DocBook's
+HTML output.</para>
+
+<para>The parameter
+specifies the name of a file containing custom
+CSS styles. The file must be a well-formed XML file that
+consists of a single <tag>style</tag> root
+element that contains CSS styles as its text content.
+For example:</para>
+<programlisting>&lt;?xml version="1.0"?&gt;
+&lt;style&gt;
+h2 {
+ font-weight: bold;
+ color: blue;
+}
+...
+&lt;/style&gt;
+</programlisting>
+
+<para>The filename specified by the parameter
+should have a <literal>.xml</literal>
+filename suffix, although that is not required.
+The default value of this parameter is blank.</para>
+
+<para>If <parameter>custom.css.source</parameter> is not blank, then
+the stylesheet takes the following actions.
+These actions take place regardless of the value of
+the <parameter>make.clean.html</parameter> parameter.</para>
+
+<orderedlist>
+ <listitem>
+ <para>The stylesheet uses the XSLT <literal>document()</literal>
+ function to open the file specified by the parameter and
+ load it into a variable.</para>
+ </listitem>
+ <listitem>
+ <para>The stylesheet forms an output pathname consisting of the
+ value of the <parameter>base.dir</parameter> parameter (if it is set)
+ and the value of <parameter>custom.css.source</parameter>,
+ with the <literal>.xml</literal> suffix stripped off.
+ </para>
+ </listitem>
+ <listitem>
+ <para>The stylesheet removes the <tag>style</tag>
+ wrapper element and writes just the CSS text content to the output file.</para>
+ </listitem>
+ <listitem>
+ <para>The stylesheet adds a <tag>link</tag> element to the
+ HTML <tag>HEAD</tag> element to reference this external CSS stylesheet.
+ For example:
+ <programlisting>&lt;link rel="stylesheet" href="custom.css" type="text/css"&gt;
+ </programlisting>
+ </para>
+ </listitem>
+</orderedlist>
+
+
+
+<para>If the <parameter>make.clean.html</parameter> parameter is nonzero
+(the default is zero),
+and if the <parameter>docbook.css.source</parameter> parameter
+is not blank (the default is not blank),
+then the stylesheet will also generate a default CSS file
+and add a <tag>link</tag> tag to reference it.
+The <tag>link</tag> to the custom CSS comes after the
+<tag>link</tag> to the default, so it should cascade properly
+in most browsers.
+If you do not want two <tag>link</tag> tags, and
+instead want your custom CSS to import the default generated
+CSS file, then do the following:
+</para>
+
+<orderedlist>
+ <listitem>
+ <para>Add a line like the following to your custom CSS source file:</para>
+ <programlisting>@import url("docbook.css")
+ </programlisting>
+ </listitem>
+ <listitem>
+ <para>Set the <parameter>docbook.css.link</parameter> parameter
+ to zero. This will omit the <tag>link</tag> tag
+ that references the default CSS file.</para>
+ </listitem>
+</orderedlist>
+
+<para>If you set <parameter>make.clean.html</parameter> to nonzero but
+you do not want the default CSS generated, then also set
+the <parameter>docbook.css.source</parameter> parameter to blank.
+Then no default CSS will be generated, and so
+all CSS styles must come from your custom CSS file.</para>
+
+<para>You can use the <parameter>generate.css.header</parameter>
+parameter to instead write the CSS to each HTML <tag>HEAD</tag>
+element in a <tag>style</tag> tag instead of an external CSS file.</para>
+
+ </refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="generate.css.header">
+<refmeta>
+<refentrytitle>generate.css.header</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>generate.css.header</refname>
+<refpurpose>Insert generated CSS styles in HEAD element</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="generate.css.header.frag">
+&lt;xsl:param name="generate.css.header" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The stylesheets are capable of generating both default
+and custom CSS stylesheet files. The parameters
+<parameter>make.clean.html</parameter>,
+<parameter>docbook.css.source</parameter>, and
+<parameter>custom.css.source</parameter> control that feature.</para>
+
+<para>If you require that CSS styles reside in the HTML
+<tag>HEAD</tag> element instead of external CSS files,
+then set the <parameter>generate.css.header</parameter>
+parameter to nonzero (it is zero by default).
+Then instead of generating the CSS in external files,
+they are wrapped in <tag>style</tag> elements in
+the <tag>HEAD</tag> element of each HTML output file.
+</para>
+
+</refsection>
+</refentry>
+
+</reference>
+<reference xml:id="xslt"><title>XSLT Processing</title>
+<refentry version="5.0" xml:id="rootid">
+<refmeta>
+<refentrytitle>rootid</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>rootid</refname>
+<refpurpose>Specify the root element to format</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="rootid.frag">
+&lt;xsl:param name="rootid"&gt;&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If <parameter>rootid</parameter> is not empty, it must be the
+value of an ID that occurs in the document being formatted. The entire
+document will be loaded and parsed, but formatting will begin at the
+element identified, rather than at the root. For example, this allows
+you to process only <tag>chapter</tag> 4 of a <tag>book</tag>.</para>
+<para>Because the entire document is available to the processor, automatic
+numbering, cross references, and other dependencies are correctly
+resolved.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="suppress.navigation">
+<refmeta>
+<refentrytitle>suppress.navigation</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>suppress.navigation</refname>
+<refpurpose>Disable header and footer navigation</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="suppress.navigation.frag">
+&lt;xsl:param name="suppress.navigation" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>
+If non-zero, header and footer navigation will be suppressed.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="suppress.header.navigation">
+<refmeta>
+<refentrytitle>suppress.header.navigation</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>suppress.header.navigation</refname>
+<refpurpose>Disable header navigation</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="suppress.header.navigation.frag">
+&lt;xsl:param name="suppress.header.navigation" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, header navigation will be suppressed.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="suppress.footer.navigation">
+<refmeta>
+<refentrytitle>suppress.footer.navigation</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>suppress.footer.navigation</refname>
+<refpurpose>Disable footer navigation</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="suppress.footer.navigation.frag">&lt;xsl:param name="suppress.footer.navigation"&gt;0&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>
+If non-zero, footer navigation will be suppressed.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="header.rule">
+<refmeta>
+<refentrytitle>header.rule</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>header.rule</refname>
+<refpurpose>Rule under headers?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="header.rule.frag">
+&lt;xsl:param name="header.rule" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, a rule will be drawn below the page headers.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="footer.rule">
+<refmeta>
+<refentrytitle>footer.rule</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>footer.rule</refname>
+<refpurpose>Rule over footers?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="footer.rule.frag">
+&lt;xsl:param name="footer.rule" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, a rule will be drawn above the page footers.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="id.warnings">
+<refmeta>
+<refentrytitle>id.warnings</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>id.warnings</refname>
+<refpurpose>Should warnings be generated for titled elements without IDs?</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+<programlisting xml:id="id.warnings.frag">
+&lt;xsl:param name="id.warnings" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+<para>If non-zero, the stylesheet will issue a warning for any element
+(other than the root element) which has a <tag>title</tag> but does not have an
+ID.</para>
+</refsection>
+</refentry>
+
+</reference>
+<reference xml:id="meta"><title>Meta/*Info and Titlepages</title>
+<refentry version="5.0" xml:id="inherit.keywords">
+<refmeta>
+<refentrytitle>inherit.keywords</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>inherit.keywords</refname>
+<refpurpose>Inherit keywords from ancestor elements?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="inherit.keywords.frag">
+&lt;xsl:param name="inherit.keywords" select="1"&gt;&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If <parameter>inherit.keywords</parameter>
+is non-zero, the keyword <literal>meta</literal> for each HTML
+<literal>head</literal> element will include all of the keywords from
+ancestor elements. Otherwise, only the keywords from the current section
+will be used.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="make.single.year.ranges">
+<refmeta>
+<refentrytitle>make.single.year.ranges</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>make.single.year.ranges</refname>
+<refpurpose>Print single-year ranges (e.g., 1998-1999)</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="make.single.year.ranges.frag">
+&lt;xsl:param name="make.single.year.ranges" select="0"&gt;&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, year ranges that span a single year will be printed
+in range notation (1998-1999) instead of discrete notation
+(1998, 1999).</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="make.year.ranges">
+<refmeta>
+<refentrytitle>make.year.ranges</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>make.year.ranges</refname>
+<refpurpose>Collate copyright years into ranges?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="make.year.ranges.frag">&lt;xsl:param name="make.year.ranges" select="0"&gt;&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, multiple copyright <tag>year</tag> elements will be
+collated into ranges.
+This works only if each year number is put into a separate
+year element. The copyright element permits multiple
+year elements. If a year element contains a dash or
+a comma, then that year element will not be merged into
+any range.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="author.othername.in.middle">
+<refmeta>
+<refentrytitle>author.othername.in.middle</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>author.othername.in.middle</refname>
+<refpurpose>Is <tag>othername</tag> in <tag>author</tag> a
+middle name?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="author.othername.in.middle.frag">
+&lt;xsl:param name="author.othername.in.middle" select="1"&gt;&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, the <tag>othername</tag> of an <tag>author</tag>
+appears between the <tag>firstname</tag> and
+<tag>surname</tag>. Otherwise, <tag>othername</tag>
+is suppressed.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="blurb.on.titlepage.enabled">
+<refmeta>
+<refentrytitle>blurb.on.titlepage.enabled</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>blurb.on.titlepage.enabled</refname>
+<refpurpose>Display personblurb and authorblurb on title pages?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="blurb.on.titlepage.enabled.frag">
+&lt;xsl:param name="blurb.on.titlepage.enabled" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, output from <tag>authorblurb</tag> and
+<tag>personblurb</tag> elements is displayed on title pages. If zero
+(the default), output from those elements is suppressed on title pages
+(unless you are using a <literal>titlepage</literal> customization
+that causes them to be included).</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="contrib.inline.enabled">
+<refmeta>
+<refentrytitle>contrib.inline.enabled</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>contrib.inline.enabled</refname>
+<refpurpose>Display contrib output inline?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="contrib.inline.enabled.frag">&lt;xsl:param name="contrib.inline.enabled"&gt;1&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero (the default), output of the <tag>contrib</tag> element is
+displayed as inline content rather than as block content.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="editedby.enabled">
+<refmeta>
+<refentrytitle>editedby.enabled</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>editedby.enabled</refname>
+<refpurpose>Display &#8220;Edited by&#8221; heading above editor name?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="editedby.enabled.frag">&lt;xsl:param name="editedby.enabled"&gt;1&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, a localized <emphasis role="bold">Edited
+by</emphasis> heading is displayed above editor names in output of the
+<tag>editor</tag> element.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="abstract.notitle.enabled">
+<refmeta>
+<refentrytitle>abstract.notitle.enabled</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>abstract.notitle.enabled</refname>
+<refpurpose>Suppress display of abstract titles?</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+ <programlisting xml:id="abstract.notitle.enabled.frag">&lt;xsl:param name="abstract.notitle.enabled" select="0"&gt;&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+<para>If non-zero, in output of the <tag>abstract</tag> element on titlepages,
+display of the abstract title is suppressed.</para>
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="othercredit.like.author.enabled">
+<refmeta>
+<refentrytitle>othercredit.like.author.enabled</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>othercredit.like.author.enabled</refname>
+<refpurpose>Display othercredit in same style as author?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="othercredit.like.author.enabled.frag">&lt;xsl:param name="othercredit.like.author.enabled"&gt;0&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, output of the
+<tag>othercredit</tag> element on titlepages is displayed in
+the same style as <tag>author</tag> and
+<tag>editor</tag> output. If zero then
+<tag>othercredit</tag> output is displayed using a style
+different than that of <tag>author</tag> and
+<tag>editor</tag>.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="generate.legalnotice.link">
+<refmeta>
+<refentrytitle>generate.legalnotice.link</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>generate.legalnotice.link</refname>
+<refpurpose>Write legalnotice to separate chunk and generate link?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="generate.legalnotice.link.frag">&lt;xsl:param name="generate.legalnotice.link" select="0"&gt;&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If the value of <parameter>generate.legalnotice.link</parameter>
+is non-zero, the stylesheet:
+
+<itemizedlist>
+ <listitem>
+ <para>writes the contents of <tag>legalnotice</tag> to a separate
+ HTML file</para>
+ </listitem>
+ <listitem>
+ <para>inserts a hyperlink to the <tag>legalnotice</tag> file</para>
+ </listitem>
+ <listitem>
+ <para>adds (in the HTML <literal>head</literal>) either a single
+ <literal>link</literal> or element or multiple
+ <literal>link</literal> elements (depending on the value of the
+ <parameter>html.head.legalnotice.link.multiple</parameter>
+ parameter), with the value or values derived from the
+ <parameter>html.head.legalnotice.link.types</parameter>
+ parameter</para>
+ </listitem>
+ </itemizedlist>
+
+ Otherwise, if <parameter>generate.legalnotice.link</parameter> is
+ zero, <tag>legalnotice</tag> contents are rendered on the title
+ page.</para>
+
+<para>The name of the separate HTML file is computed as follows:
+
+<orderedlist>
+<listitem>
+ <para>If a filename is given by the <tag class="xmlpi">dbhtml filename</tag>
+processing instruction, that filename is used.</para>
+</listitem>
+<listitem>
+ <para>If the legalnotice has an <tag class="attribute">id</tag>/<tag class="attribute">xml:id</tag>
+attribute, and if <parameter>use.id.as.filename</parameter> != 0, the filename
+is the concatenation of the id value and the value of the <parameter>html.ext</parameter>
+parameter.</para>
+</listitem>
+<listitem>
+ <para>If the legalnotice does not have an <tag class="attribute">id</tag>/<tag class="attribute">xml:id</tag>
+ attribute, or if <parameter>use.id.as.filename</parameter> = 0, the filename is the concatenation of "ln-",
+auto-generated id value, and <parameter>html.ext</parameter> value.
+ </para>
+</listitem>
+</orderedlist>
+
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="generate.revhistory.link">
+<refmeta>
+<refentrytitle>generate.revhistory.link</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>generate.revhistory.link</refname>
+<refpurpose>Write revhistory to separate chunk and generate link?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="generate.revhistory.link.frag">&lt;xsl:param name="generate.revhistory.link" select="0"&gt;&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, the contents of <tag>revhistory</tag> are written
+to a separate HTML file and a link to the file is
+generated. Otherwise, <tag>revhistory</tag> contents are rendered on
+the title page.</para>
+
+<para>The name of the separate HTML file is computed as follows:
+
+<orderedlist>
+<listitem>
+ <para>If a filename is given by the <tag class="xmlpi">dbhtml filename</tag> processing instruction,
+that filename is used.</para>
+</listitem>
+<listitem>
+ <para>If the revhistory has an <tag class="attribute">id</tag>/<tag class="attribute">xml:id</tag>
+attribute, and if <parameter>use.id.as.filename</parameter> != 0, the filename is the concatenation of
+the id value and the value of the <parameter>html.ext</parameter> parameter.</para>
+</listitem>
+<listitem>
+ <para>If the revhistory does not have an <tag class="attribute">id</tag>/<tag class="attribute">xml:id</tag>
+attribute, or if <parameter>use.id.as.filename</parameter> = 0, the filename is the concatenation of "rh-",
+auto-generated id value, and <parameter>html.ext</parameter> value.
+ </para>
+</listitem>
+</orderedlist>
+
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="html.head.legalnotice.link.types">
+<refmeta>
+<refentrytitle>html.head.legalnotice.link.types</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>html.head.legalnotice.link.types</refname>
+<refpurpose>Specifies link types for legalnotice link in html head</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="html.head.legalnotice.link.types.frag">
+&lt;xsl:param name="html.head.legalnotice.link.types"&gt;copyright&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The value of
+<parameter>html.head.legalnotice.link.types</parameter> is a
+space-separated list of link types, as described in <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.w3.org/TR/html401/types.html#type-links">Section 6.12
+of the HTML 4.01 specification</link>. If the value of the
+<parameter>generate.legalnotice.link</parameter> parameter is
+non-zero, then the stylesheet generates (in the
+<literal>head</literal> section of the HTML source) either a single
+HTML <literal>link</literal> element or, if the value of the
+<parameter>html.head.legalnotice.link.multiple</parameter> is
+non-zero, one <literal>link</literal> element for each link type
+specified. Each <literal>link</literal> has the following attributes:
+
+<itemizedlist>
+ <listitem>
+ <para>a <tag class="attribute">rel</tag> attribute whose
+ value is derived from the value of
+ <parameter>html.head.legalnotice.link.types</parameter></para>
+ </listitem>
+ <listitem>
+ <para>an <tag class="attribute">href</tag> attribute whose
+ value is set to the URL of the file containing the
+ <tag>legalnotice</tag></para>
+ </listitem>
+ <listitem>
+ <para>a <tag class="attribute">title</tag> attribute whose
+ value is set to the title of the corresponding
+ <tag>legalnotice</tag> (or a title programatically
+ determined by the stylesheet)</para>
+ </listitem>
+</itemizedlist>
+
+For example:
+
+<screen> &lt;link rel="license" href="ln-id2524073.html" title="Legal Notice"&gt;</screen>
+</para>
+
+<refsection><info><title>About the default value</title></info>
+
+ <para>In an ideal world, the default value of
+ <parameter>html.head.legalnotice.link.types</parameter> would
+ probably be &#8220;<literal>license</literal>&#8221;, since the content of the
+ DocBook <tag>legalnotice</tag> is typically license
+ information, not copyright information. However, the default value
+ is &#8220;<literal>copyright</literal>&#8221; for pragmatic reasons: because
+ that&#8217;s among the set of &#8220;recognized link types&#8221; listed in <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.w3.org/TR/html401/types.html#type-links">Section
+ 6.12 of the HTML 4.01 specification</link>, and because certain
+ browsers and browser extensions are preconfigured to recognize that
+ value.</para>
+</refsection>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="html.head.legalnotice.link.multiple">
+<refmeta>
+<refentrytitle>html.head.legalnotice.link.multiple</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>html.head.legalnotice.link.multiple</refname>
+<refpurpose>Generate multiple link instances in html head for legalnotice?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="html.head.legalnotice.link.multiple.frag">
+&lt;xsl:param name="html.head.legalnotice.link.multiple" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If <parameter>html.head.legalnotice.link.multiple</parameter> is
+non-zero and the value of
+<parameter>html.head.legalnotice.link.types</parameter> contains
+multiple link types, then the stylesheet generates (in the
+<literal>head</literal> section of the HTML source) one
+<literal>link</literal> element for each link type specified. For
+example, if the value of
+<parameter>html.head.legalnotice.link.types</parameter> is
+&#8220;<literal>copyright license</literal>&#8221;:
+
+<screen> &lt;link rel="copyright" href="ln-id2524073.html" title="Legal Notice"&gt;
+ &lt;link rel="license" href="ln-id2524073.html" title="Legal Notice"&gt;</screen>
+
+ Otherwise, the stylesheet generates generates a single
+ <literal>link</literal> instance; for example:
+
+<screen> &lt;link rel="copyright license" href="ln-id2524073.html" title="Legal Notice"&gt;</screen>
+
+</para>
+</refsection>
+</refentry>
+
+</reference>
+<reference xml:id="refentry"><title>Reference Pages</title>
+<refentry version="5.0" xml:id="funcsynopsis.decoration">
+<refmeta>
+<refentrytitle>funcsynopsis.decoration</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>funcsynopsis.decoration</refname>
+<refpurpose>Decorate elements of a <tag>funcsynopsis</tag>?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="funcsynopsis.decoration.frag">
+&lt;xsl:param name="funcsynopsis.decoration" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, elements of the <tag>funcsynopsis</tag> will be
+decorated (e.g. rendered as bold or italic text). The decoration is controlled by
+templates that can be redefined in a customization layer.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="funcsynopsis.style">
+<refmeta>
+<refentrytitle>funcsynopsis.style</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">list</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">ansi</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">kr</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>funcsynopsis.style</refname>
+<refpurpose>What style of <tag>funcsynopsis</tag> should be generated?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="funcsynopsis.style.frag">&lt;xsl:param name="funcsynopsis.style"&gt;kr&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If <parameter>funcsynopsis.style</parameter> is <literal>ansi</literal>,
+ANSI-style function synopses are generated for a
+<tag>funcsynopsis</tag>, otherwise K&amp;R-style
+function synopses are generated.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="function.parens">
+<refmeta>
+<refentrytitle>function.parens</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>function.parens</refname>
+<refpurpose>Generate parens after a function?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="function.parens.frag">
+&lt;xsl:param name="function.parens" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, the formatting of a <tag>function</tag> element
+will include generated parentheses.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="refentry.generate.name">
+<refmeta>
+<refentrytitle>refentry.generate.name</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>refentry.generate.name</refname>
+<refpurpose>Output NAME header before <tag>refname</tag>s?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="refentry.generate.name.frag">
+&lt;xsl:param name="refentry.generate.name" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, a "NAME" section title is output before the list
+of <tag>refname</tag>s. This parameter and
+<parameter>refentry.generate.title</parameter> are mutually
+exclusive. This means that if you change this parameter to zero, you
+should set <parameter>refentry.generate.title</parameter> to non-zero unless
+you want get quite strange output.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="refentry.generate.title">
+<refmeta>
+<refentrytitle>refentry.generate.title</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>refentry.generate.title</refname>
+<refpurpose>Output title before <tag>refname</tag>s?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="refentry.generate.title.frag">
+&lt;xsl:param name="refentry.generate.title" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, the reference page title or first name is
+output before the list of <tag>refname</tag>s. This parameter and
+<parameter>refentry.generate.name</parameter> are mutually exclusive.
+This means that if you change this parameter to non-zero, you
+should set <parameter>refentry.generate.name</parameter> to zero unless
+you want get quite strange output.</para>
+
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="refentry.xref.manvolnum">
+<refmeta>
+<refentrytitle>refentry.xref.manvolnum</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>refentry.xref.manvolnum</refname>
+<refpurpose>Output <tag>manvolnum</tag> as part of
+<tag>refentry</tag> cross-reference?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="refentry.xref.manvolnum.frag">
+&lt;xsl:param name="refentry.xref.manvolnum" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>if non-zero, the <tag>manvolnum</tag> is used when cross-referencing
+<tag>refentry</tag>s, either with <tag>xref</tag>
+or <tag>citerefentry</tag>.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="citerefentry.link">
+<refmeta>
+<refentrytitle>citerefentry.link</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>citerefentry.link</refname>
+<refpurpose>Generate URL links when cross-referencing RefEntrys?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="citerefentry.link.frag">
+&lt;xsl:param name="citerefentry.link" select="0"&gt;&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, a web link will be generated, presumably
+to an online man-&gt;HTML gateway. The text of the link is
+generated by the <literal>generate.citerefentry.link</literal> template.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="refentry.separator">
+<refmeta>
+<refentrytitle>refentry.separator</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>refentry.separator</refname>
+<refpurpose>Generate a separator between consecutive RefEntry elements?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="refentry.separator.frag">
+&lt;xsl:param name="refentry.separator" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If true, a separator will be generated between consecutive
+reference pages.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="refclass.suppress">
+<refmeta>
+<refentrytitle>refclass.suppress</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>refclass.suppress</refname>
+<refpurpose>Suppress display of refclass contents?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="refclass.suppress.frag">
+&lt;xsl:param name="refclass.suppress" select="0"&gt;&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If the value of <parameter>refclass.suppress</parameter> is
+non-zero, then display of <tag>refclass</tag> contents is
+suppressed in output.</para>
+
+</refsection>
+</refentry>
+
+</reference>
+<reference xml:id="tables"><title>Tables</title>
+<refentry version="5.0" xml:id="default.table.width">
+<refmeta>
+<refentrytitle>default.table.width</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">length</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>default.table.width</refname>
+<refpurpose>The default width of tables</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+<programlisting xml:id="default.table.width.frag">
+&lt;xsl:param name="default.table.width"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+<para>If non-zero, this value will be used for the
+<literal>width</literal> attribute on <tag>table</tag>s that do not specify an
+alternate width (with the <tag class="xmlpi">dbhtml table-width</tag> or
+<tag class="xmlpi">dbfo table-width</tag> processing instruction).</para>
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="nominal.table.width">
+<refmeta>
+<refentrytitle>nominal.table.width</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">length</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>nominal.table.width</refname>
+<refpurpose>The (absolute) nominal width of tables</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="nominal.table.width.frag">
+&lt;xsl:param name="nominal.table.width"&gt;6in&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>In order to convert CALS column widths into HTML column widths, it
+is sometimes necessary to have an absolute table width to use for conversion
+of mixed absolute and relative widths. This value must be an absolute
+length (not a percentage).</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="table.borders.with.css">
+<refmeta>
+<refentrytitle>table.borders.with.css</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>table.borders.with.css</refname>
+<refpurpose>Use CSS to specify table, row, and cell borders?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="table.borders.with.css.frag">
+&lt;xsl:param name="table.borders.with.css" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, CSS will be used to draw table borders.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="table.cell.border.style">
+<refmeta>
+<refentrytitle>table.cell.border.style</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">list</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">none</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">solid</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">dotted</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">dashed</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">double</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">groove</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">ridge</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">inset</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">outset</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">solid</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>table.cell.border.style</refname>
+<refpurpose>Specifies the border style of table cells</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="table.cell.border.style.frag">
+&lt;xsl:param name="table.cell.border.style"&gt;solid&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies the border style of table cells.</para>
+
+<note>
+ <para>To control properties of cell borders in HTML output, you must also turn on the
+ <parameter>table.borders.with.css</parameter> parameter.</para>
+</note>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="table.cell.border.thickness">
+<refmeta>
+<refentrytitle>table.cell.border.thickness</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">length</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>table.cell.border.thickness</refname>
+<refpurpose>Specifies the thickness of table cell borders</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="table.cell.border.thickness.frag">
+&lt;xsl:param name="table.cell.border.thickness"&gt;0.5pt&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, specifies the thickness of borders on table
+cells. The units are points. See <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.w3.org/TR/CSS21/box.html#border-width-properties">
+CSS</link></para>
+
+<note>
+ <para>To control properties of cell borders in HTML output, you must also turn on the
+ <parameter>table.borders.with.css</parameter> parameter.</para>
+</note>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="table.cell.border.color">
+<refmeta>
+<refentrytitle>table.cell.border.color</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">color</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>table.cell.border.color</refname>
+<refpurpose>Specifies the border color of table cells</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="table.cell.border.color.frag">
+&lt;xsl:param name="table.cell.border.color"&gt;&lt;/xsl:param&gt;
+
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Set the color of table cell borders. If non-zero, the value is used
+for the border coloration. See <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.w3.org/TR/CSS21/syndata.html#value-def-color">CSS</link>. A
+<literal>color</literal> is either a keyword or a numerical RGB specification.
+Keywords are aqua, black, blue, fuchsia, gray, green, lime, maroon,
+navy, olive, orange, purple, red, silver, teal, white, and
+yellow.</para>
+
+<note>
+ <para>To control properties of cell borders in HTML output, you must also turn on the
+ <parameter>table.borders.with.css</parameter> parameter.</para>
+</note>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="table.frame.border.style">
+<refmeta>
+<refentrytitle>table.frame.border.style</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">list</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">none</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">solid</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">dotted</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">dashed</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">double</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">groove</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">ridge</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">inset</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">outset</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">solid</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>table.frame.border.style</refname>
+<refpurpose>Specifies the border style of table frames</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="table.frame.border.style.frag">
+&lt;xsl:param name="table.frame.border.style"&gt;solid&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies the border style of table frames.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="table.frame.border.thickness">
+<refmeta>
+<refentrytitle>table.frame.border.thickness</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">length</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>table.frame.border.thickness</refname>
+<refpurpose>Specifies the thickness of the frame border</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="table.frame.border.thickness.frag">
+&lt;xsl:param name="table.frame.border.thickness"&gt;0.5pt&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies the thickness of the border on the table's frame.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="table.frame.border.color">
+<refmeta>
+<refentrytitle>table.frame.border.color</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">color</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>table.frame.border.color</refname>
+<refpurpose>Specifies the border color of table frames</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="table.frame.border.color.frag">
+&lt;xsl:param name="table.frame.border.color"&gt;&lt;/xsl:param&gt;
+
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies the border color of table frames.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="default.table.frame">
+<refmeta>
+<refentrytitle>default.table.frame</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>default.table.frame</refname>
+<refpurpose>The default framing of tables</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="default.table.frame.frag">
+&lt;xsl:param name="default.table.frame"&gt;all&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>This value will be used when there is no frame attribute on the
+table. </para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="html.cellspacing">
+<refmeta>
+<refentrytitle>html.cellspacing</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">integer</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>html.cellspacing</refname>
+<refpurpose>Default value for cellspacing in HTML tables</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="html.cellspacing.frag">
+&lt;xsl:param name="html.cellspacing"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, this value will be used as the default cellspacing
+value in HTML tables. nn for pixels or nn% for percentage
+length. E.g. 5 or 5%</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="html.cellpadding">
+<refmeta>
+<refentrytitle>html.cellpadding</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">integer</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>html.cellpadding</refname>
+<refpurpose>Default value for cellpadding in HTML tables</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="html.cellpadding.frag">
+&lt;xsl:param name="html.cellpadding"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, this value will be used as the default cellpadding value
+in HTML tables. nn for pixels or nn% for percentage length. E.g. 5 or
+5%</para>
+
+</refsection>
+</refentry>
+
+</reference>
+<reference xml:id="qa"><title>QAndASet</title>
+<refentry version="5.0" xml:id="qanda.defaultlabel">
+<refmeta>
+<refentrytitle>qanda.defaultlabel</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">list</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">number</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">qanda</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">none</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>qanda.defaultlabel</refname>
+<refpurpose>Sets the default for defaultlabel on QandASet.</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="qanda.defaultlabel.frag">
+&lt;xsl:param name="qanda.defaultlabel"&gt;number&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If no <literal>defaultlabel</literal> attribute is specified on
+a <tag>qandaset</tag>, this value is used. It is generally one of the legal
+values for the defaultlabel attribute (<literal>none</literal>,
+<literal>number</literal> or
+<literal>qanda</literal>), or one of the additional stylesheet-specific values
+(<literal>qnumber</literal> or <literal>qnumberanda</literal>).
+The default value is 'number'.
+</para>
+<para>The values are rendered as follows:</para>
+<variablelist>
+<varlistentry><term><literal>qanda</literal></term>
+<listitem>
+<para><tag>question</tag>s are labeled "Q:" and
+<tag>answer</tag>s are labeled "A:". </para>
+</listitem>
+</varlistentry>
+
+<varlistentry><term><literal>number</literal></term>
+<listitem>
+<para>The questions are enumerated and the answers
+are not labeled. </para>
+</listitem>
+</varlistentry>
+
+<varlistentry><term><literal>qnumber</literal></term>
+<listitem>
+<para>The questions are labeled "Q:" followed by a number, and answers are not
+labeled.
+When sections are numbered, adding a label
+to the number distinguishes the question numbers
+from the section numbers.
+This value is not allowed in the
+<tag class="attribute">defaultlabel</tag> attribute
+of a <tag>qandaset</tag> element.</para>
+</listitem>
+</varlistentry>
+
+<varlistentry><term><literal>qnumberanda</literal></term>
+<listitem>
+<para>The questions are labeled "Q:" followed by a number, and
+the answers are labeled "A:".
+When sections are numbered, adding a label
+to the number distinguishes the question numbers
+from the section numbers.
+This value is not allowed in the
+<tag class="attribute">defaultlabel</tag> attribute
+of a <tag>qandaset</tag> element.</para>
+</listitem>
+</varlistentry>
+
+<varlistentry><term><literal>none</literal></term>
+<listitem>
+<para>No distinguishing label precedes Questions or Answers.
+</para>
+</listitem>
+</varlistentry>
+</variablelist>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="qanda.inherit.numeration">
+<refmeta>
+<refentrytitle>qanda.inherit.numeration</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>qanda.inherit.numeration</refname>
+<refpurpose>Does enumeration of QandASet components inherit the numeration of parent elements?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="qanda.inherit.numeration.frag">
+&lt;xsl:param name="qanda.inherit.numeration" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, numbered <tag>qandadiv</tag> elements and
+<tag>question</tag> and <tag>answer</tag> inherit the enumeration of
+the ancestors of the <tag>qandaset</tag>.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="qanda.in.toc">
+<refmeta>
+<refentrytitle>qanda.in.toc</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>qanda.in.toc</refname>
+<refpurpose>Should qandaentry questions appear in
+the document table of contents?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="qanda.in.toc.frag">&lt;xsl:param name="qanda.in.toc" select="0"&gt;&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If true (non-zero), then the generated table of contents
+for a document will include <tag>qandaset</tag> titles,
+<tag>qandadiv</tag> titles,
+and <tag>question</tag> elements. The default value (zero) excludes
+them from the TOC.
+</para>
+<para>This parameter does not affect any tables of contents
+that may be generated inside a qandaset or qandadiv.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="qanda.nested.in.toc">
+<refmeta>
+<refentrytitle>qanda.nested.in.toc</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>qanda.nested.in.toc</refname>
+<refpurpose>Should nested answer/qandaentry instances appear in TOC?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="qanda.nested.in.toc.frag">
+&lt;xsl:param name="qanda.nested.in.toc" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, instances of <tag>qandaentry</tag>
+that are children of <tag>answer</tag> elements are shown in
+the TOC.</para>
+
+</refsection>
+</refentry>
+
+</reference>
+<reference xml:id="links"><title>Linking</title>
+<refentry version="5.0" xml:id="target.database.document">
+<refmeta>
+<refentrytitle>target.database.document</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">uri</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>target.database.document</refname>
+<refpurpose>Name of master database file for resolving
+olinks</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+<programlisting xml:id="target.database.document.frag">
+ &lt;xsl:param name="target.database.document"&gt;olinkdb.xml&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+
+<para>
+To resolve olinks between documents, the stylesheets use a master
+database document that identifies the target datafiles for all the
+documents within the scope of the olinks. This parameter value is the
+URI of the master document to be read during processing to resolve
+olinks. The default value is <filename>olinkdb.xml</filename>.</para>
+
+<para>The data structure of the file is defined in the
+<filename>targetdatabase.dtd</filename> DTD. The database file
+provides the high level elements to record the identifiers, locations,
+and relationships of documents. The cross reference data for
+individual documents is generally pulled into the database using
+system entity references or XIncludes. See also
+<parameter>targets.filename</parameter>. </para> </refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="targets.filename">
+<refmeta>
+<refentrytitle>targets.filename</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>targets.filename</refname>
+<refpurpose>Name of cross reference targets data file</refpurpose>
+</refnamediv>
+<refsynopsisdiv> <programlisting xml:id="targets.filename.frag">
+&lt;xsl:param name="targets.filename"&gt;target.db&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+
+<para>
+In order to resolve olinks efficiently, the stylesheets can
+generate an external data file containing information about
+all potential cross reference endpoints in a document.
+This parameter lets you change the name of the generated
+file from the default name <filename>target.db</filename>.
+The name must agree with that used in the target database
+used to resolve olinks during processing.
+See also <parameter>target.database.document</parameter>.
+</para>
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="olink.base.uri">
+<refmeta>
+<refentrytitle>olink.base.uri</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">uri</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>olink.base.uri</refname>
+<refpurpose>Base URI used in olink hrefs</refpurpose>
+</refnamediv>
+<refsynopsisdiv> <programlisting xml:id="olink.base.uri.frag">
+&lt;xsl:param name="olink.base.uri"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+
+<para>When cross reference data is collected for resolving olinks, it
+may be necessary to prepend a base URI to each target's href. This
+parameter lets you set that base URI when cross reference data is
+collected. This feature is needed when you want to link to a document
+that is processed without chunking. The output filename for such a
+document is not known to the XSL stylesheet; the only target
+information consists of fragment identifiers such as
+<literal>#idref</literal>. To enable the resolution of olinks between
+documents, you should pass the name of the HTML output file as the
+value of this parameter. Then the hrefs recorded in the cross
+reference data collection look like
+<literal>outfile.html#idref</literal>, which can be reached as links
+from other documents.</para>
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="use.local.olink.style">
+<refmeta>
+<refentrytitle>use.local.olink.style</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>use.local.olink.style</refname>
+<refpurpose>Process olinks using xref style of current
+document</refpurpose>
+</refnamediv>
+<refsynopsisdiv> <programlisting xml:id="use.local.olink.style.frag">
+&lt;xsl:param name="use.local.olink.style" select="0"&gt;&lt;/xsl:param&gt; </programlisting>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+
+<para>When cross reference data is collected for use by olinks, the data for each potential target includes one field containing a completely assembled cross reference string, as if it were an xref generated in that document. Other fields record the separate title, number, and element name of each target. When an olink is formed to a target from another document, the olink resolves to that preassembled string by default. If the <parameter>use.local.olink.style</parameter> parameter is set to non-zero, then instead the cross
+reference string is formed again from the target title, number, and
+element name, using the stylesheet processing the targeting document.
+Then olinks will match the xref style in the targeting document
+rather than in the target document. If both documents are processed
+with the same stylesheet, then the results will be the same.</para>
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="current.docid">
+<refmeta>
+<refentrytitle>current.docid</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>current.docid</refname>
+<refpurpose>targetdoc identifier for the document being
+processed</refpurpose>
+</refnamediv>
+<refsynopsisdiv> <programlisting xml:id="current.docid.frag">
+&lt;xsl:param name="current.docid"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+
+<para>When olinks between documents are resolved for HTML output, the stylesheet can compute the relative path between the current document and the target document. The stylesheet needs to know the <literal>targetdoc</literal> identifiers for both documents, as they appear in the <parameter>target.database.document</parameter> database file. This parameter passes to the stylesheet
+the targetdoc identifier of the current document, since that
+identifier does not appear in the document itself. </para>
+<para>This parameter can also be used for print output. If an olink's <literal>targetdoc</literal> id differs from the <literal>current.docid</literal>, then the stylesheet can append the target document's title to the generated olink text. That identifies to the reader that the link is to a different document, not the current document. See also <parameter>olink.doctitle</parameter> to enable that feature.</para>
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="olink.doctitle">
+<refmeta>
+<refentrytitle>olink.doctitle</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">list</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">no</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">yes</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">maybe</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>olink.doctitle</refname>
+<refpurpose>show the document title for external olinks?</refpurpose>
+
+</refnamediv>
+<refsynopsisdiv> <programlisting xml:id="olink.doctitle.frag">
+&lt;xsl:param name="olink.doctitle"&gt;no&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+
+<para>When olinks between documents are resolved, the generated text
+may not make it clear that the reference is to another document.
+It is possible for the stylesheets to append the other document's
+title to external olinks. For this to happen, two parameters must
+be set.</para>
+<itemizedlist>
+<listitem>
+<para>This <parameter>olink.doctitle</parameter> parameter
+should be set to either <literal>yes</literal> or <literal>maybe</literal>
+to enable this feature.
+</para>
+</listitem>
+<listitem>
+<para>And you should also set the <parameter>current.docid</parameter>
+parameter to the document id for the document currently
+being processed for output.
+</para>
+</listitem>
+</itemizedlist>
+
+<para>
+Then if an olink's <literal>targetdoc</literal> id differs from
+the <literal>current.docid</literal> value, the stylesheet knows
+that it is a reference to another document and can
+append the target document's
+title to the generated olink text. </para>
+
+<para>The text for the target document's title is copied from the
+olink database from the <tag>ttl</tag> element
+of the top-level <tag>div</tag> for that document.
+If that <tag>ttl</tag> element is missing or empty,
+no title is output.
+</para>
+
+<para>The supported values for <parameter>olink.doctitle</parameter> are:
+</para>
+<variablelist>
+<varlistentry>
+<term><literal>yes</literal></term>
+<listitem>
+<para>
+Always insert the title to the target document if it is not
+the current document.
+</para>
+</listitem>
+</varlistentry>
+<varlistentry>
+<term><literal>no</literal></term>
+<listitem>
+<para>
+Never insert the title to the target document, even if requested
+in an <tag class="attribute">xrefstyle</tag> attribute.
+</para>
+</listitem>
+</varlistentry>
+<varlistentry>
+<term><literal>maybe</literal></term>
+<listitem>
+<para>
+Only insert the title to the target document, if requested
+in an <tag class="attribute">xrefstyle</tag> attribute.
+</para>
+</listitem>
+</varlistentry>
+</variablelist>
+<para>An <tag class="attribute">xrefstyle</tag> attribute
+may override the global setting for individual olinks.
+The following values are supported in an
+<tag class="attribute">xrefstyle</tag>
+attribute using the <literal>select:</literal> syntax:
+</para>
+
+<variablelist>
+<varlistentry>
+<term><literal>docname</literal></term>
+<listitem>
+<para>
+Insert the target document name for this olink using the
+<literal>docname</literal> gentext template, but only
+if the value of <parameter>olink.doctitle</parameter>
+is not <literal>no</literal>.
+</para>
+</listitem>
+</varlistentry>
+<varlistentry>
+<term><literal>docnamelong</literal></term>
+<listitem>
+<para>
+Insert the target document name for this olink using the
+<literal>docnamelong</literal> gentext template, but only
+if the value of <parameter>olink.doctitle</parameter>
+is not <literal>no</literal>.
+</para>
+</listitem>
+</varlistentry>
+<varlistentry>
+<term><literal>nodocname</literal></term>
+<listitem>
+<para>
+Omit the target document name even if
+the value of <parameter>olink.doctitle</parameter>
+is <literal>yes</literal>.
+</para>
+</listitem>
+</varlistentry>
+</variablelist>
+<para>Another way of inserting the target document name
+for a single olink is to employ an
+<tag class="attribute">xrefstyle</tag>
+attribute using the <literal>template:</literal> syntax.
+The <literal>%o</literal> placeholder (the letter o, not zero)
+in such a template
+will be filled in with the target document's title when it is processed.
+This will occur regardless of
+the value of <parameter>olink.doctitle</parameter>.
+</para>
+<para>Note that prior to version 1.66 of the XSL stylesheets,
+the allowed values for this parameter were 0 and 1. Those
+values are still supported and mapped to 'no' and 'yes', respectively.
+</para>
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="olink.debug">
+<refmeta>
+<refentrytitle>olink.debug</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>olink.debug</refname>
+<refpurpose>Turn on debugging messages for olinks</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="olink.debug.frag">
+&lt;xsl:param name="olink.debug" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, then each olink will generate several
+messages about how it is being resolved during processing.
+This is useful when an olink does not resolve properly
+and the standard error messages are not sufficient to
+find the problem.
+</para>
+
+<para>You may need to read through the olink XSL templates
+to understand the context for some of the debug messages.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="olink.properties">
+<refmeta>
+<refentrytitle>olink.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>olink.properties</refname>
+<refpurpose>Properties associated with the cross-reference
+text of an olink.</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="olink.properties.frag">
+&lt;xsl:attribute-set name="olink.properties"&gt;
+ &lt;xsl:attribute name="show-destination"&gt;replace&lt;/xsl:attribute&gt;
+&lt;/xsl:attribute-set&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>This <literal>attribute set</literal> is applied to the
+<literal>fo:basic-link</literal> element of an olink. It is not applied to the
+optional page number or optional title of the external
+document.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="olink.lang.fallback.sequence">
+<refmeta>
+<refentrytitle>olink.lang.fallback.sequence</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>olink.lang.fallback.sequence</refname>
+<refpurpose>look up translated documents if olink not found?</refpurpose>
+
+</refnamediv>
+<refsynopsisdiv> <programlisting xml:id="olink.lang.fallback.sequence.frag">
+&lt;xsl:param name="olink.lang.fallback.sequence"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+
+
+<para>This parameter defines a list of lang values
+to search among to resolve olinks.
+</para>
+
+<para>Normally an olink tries to resolve to a document in the same
+language as the olink itself. The language of an olink
+is determined by its nearest ancestor element with a
+<tag class="attribute">lang</tag> attribute, otherwise the
+value of the <parameter>l10n.gentext.default.lang</parameter>
+parameter.
+</para>
+
+<para>An olink database can contain target data for the same
+document in multiple languages. Each set of data has the
+same value for the <tag>targetdoc</tag> attribute in
+the <tag>document</tag> element in the database, but with a
+different <tag>lang</tag> attribute value.
+</para>
+
+<para>When an olink is being resolved, the target is first
+sought in the document with the same language as the olink.
+If no match is found there, then this parameter is consulted
+for additional languages to try.</para>
+
+<para>The <parameter>olink.lang.fallback.sequence</parameter>
+must be a whitespace separated list of lang values to
+try. The first one with a match in the olink database is used.
+The default value is empty.</para>
+
+<para>For example, a document might be written in German
+and contain an olink with
+<literal>targetdoc="adminguide"</literal>.
+When the document is processed, the processor
+first looks for a target dataset in the
+olink database starting with:</para>
+
+<literallayout><literal>&lt;document targetdoc="adminguide" lang="de"&gt;</literal>.
+</literallayout>
+
+<para>If there is no such element, then the
+<parameter>olink.lang.fallback.sequence</parameter>
+parameter is consulted.
+If its value is, for example, <quote>fr en</quote>, then the processor next
+looks for <literal>targetdoc="adminguide" lang="fr"</literal>, and
+then for <literal>targetdoc="adminguide" lang="en"</literal>.
+If there is still no match, it looks for
+<literal>targetdoc="adminguide"</literal> with no
+lang attribute.
+</para>
+
+<para>This parameter is useful when a set of documents is only
+partially translated, or is in the process of being translated.
+If a target of an olink has not yet been translated, then this
+parameter permits the processor to look for the document in
+other languages. This assumes the reader would rather have
+a link to a document in a different language than to have
+a broken link.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="insert.olink.page.number">
+<refmeta>
+<refentrytitle>insert.olink.page.number</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">list</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">no</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">yes</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">maybe</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>insert.olink.page.number</refname>
+<refpurpose>Turns page numbers in olinks on and off</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="insert.olink.page.number.frag">
+&lt;xsl:param name="insert.olink.page.number"&gt;no&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The value of this parameter determines if
+cross references made between documents with
+<tag>olink</tag> will
+include page number citations.
+In most cases this is only applicable to references in printed output.
+</para>
+<para>The parameter has three possible values.
+</para>
+<variablelist>
+<varlistentry>
+<term>no</term>
+<listitem><para>No page number references will be generated for olinks.
+</para></listitem>
+</varlistentry>
+<varlistentry>
+<term>yes</term>
+<listitem><para>Page number references will be generated
+for all <tag>olink</tag> references.
+The style of page reference may be changed
+if an <tag class="attribute">xrefstyle</tag>
+attribute is used.
+</para></listitem>
+</varlistentry>
+<varlistentry>
+<term>maybe</term>
+<listitem><para>Page number references will not be generated
+for an <tag>olink</tag> element unless
+it has an
+<tag class="attribute">xrefstyle</tag>
+attribute whose value specifies a page reference.
+</para></listitem>
+</varlistentry>
+</variablelist>
+<para>Olinks that point to targets within the same document
+are treated as <tag>xref</tag>s, and controlled by
+the <parameter>insert.xref.page.number</parameter> parameter.
+</para>
+
+<para>Page number references for olinks to
+external documents can only be inserted if the
+information exists in the olink database.
+This means each olink target element
+(<tag>div</tag> or <tag>obj</tag>)
+must have a <tag class="attribute">page</tag> attribute
+whose value is its page number in the target document.
+The XSL stylesheets are not able to extract that information
+during processing because pages have not yet been created in
+XSLT transformation. Only the XSL-FO processor knows what
+page each element is placed on.
+Therefore some postprocessing must take place to populate
+page numbers in the olink database.
+</para>
+
+
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="insert.olink.pdf.frag">
+<refmeta>
+<refentrytitle>insert.olink.pdf.frag</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>insert.olink.pdf.frag</refname>
+<refpurpose>Add fragment identifiers for links into PDF files</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="insert.olink.pdf.frag.frag">
+&lt;xsl:param name="insert.olink.pdf.frag" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The value of this parameter determines whether
+the cross reference URIs to PDF documents made with
+<tag>olink</tag> will
+include fragment identifiers.
+</para>
+
+<para>When forming a URI to link to a PDF document,
+a fragment identifier (typically a '#' followed by an
+id value) appended to the PDF filename can be used by
+the PDF viewer to open
+the PDF file to a location within the document instead of
+the first page.
+However, not all PDF files have id
+values embedded in them, and not all PDF viewers can
+handle fragment identifiers.
+</para>
+
+<para>If <parameter>insert.olink.pdf.frag</parameter> is set
+to a non-zero value, then any olink targeting a
+PDF file will have the fragment identifier appended to the URI.
+The URI is formed by concatenating the value of the
+<parameter>olink.base.uri</parameter> parameter, the
+value of the <tag class="attribute">baseuri</tag>
+attribute from the <tag class="element">document</tag>
+element in the olink database with the matching
+<tag class="attribute">targetdoc</tag> value,
+and the value of the <tag class="attribute">href</tag>
+attribute for the targeted element in the olink database.
+The <tag class="attribute">href</tag> attribute
+contains the fragment identifier.
+</para>
+
+<para>If <parameter>insert.olink.pdf.frag</parameter> is set
+to zero (the default value), then
+the <tag class="attribute">href</tag> attribute
+from the olink database
+is not appended to PDF olinks, so the fragment identifier is left off.
+A PDF olink is any olink for which the
+<tag class="attribute">baseuri</tag> attribute
+from the matching <tag class="element">document</tag>
+element in the olink database ends with '.pdf'.
+Any other olinks will still have the fragment identifier added.
+</para>
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="prefer.internal.olink">
+<refmeta>
+<refentrytitle>prefer.internal.olink</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>prefer.internal.olink</refname>
+<refpurpose>Prefer a local olink reference to an external reference</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="prefer.internal.olink.frag">
+&lt;xsl:param name="prefer.internal.olink" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If you are re-using XML content modules in multiple documents,
+you may want to redirect some of your olinks. This parameter
+permits you to redirect an olink to the current document.
+</para>
+
+<para>For example: you are writing documentation for a product,
+which includes 3 manuals: a little installation
+booklet (booklet.xml), a user
+guide (user.xml), and a reference manual (reference.xml).
+All 3 documents begin with the same introduction section (intro.xml) that
+contains a reference to the customization section (custom.xml) which is
+included in both user.xml and reference.xml documents.
+</para>
+
+<para>How do you write the link to custom.xml in intro.xml
+so that it is interpreted correctly in all 3 documents?</para>
+<itemizedlist>
+<listitem><para>If you use xref, it will fail in user.xml.</para>
+</listitem>
+<listitem><para>If you use olink (pointing to reference.xml),
+the reference in user.xml
+will point to the customization section of the reference manual, while it is
+actually available in user.xml.</para>
+</listitem>
+</itemizedlist>
+
+<para>If you set the <parameter>prefer.internal.olink</parameter>
+parameter to a non-zero value, then the processor will
+first look in the olink database
+for the olink's <tag>targetptr</tag> attribute value
+in document matching the <parameter>current.docid</parameter>
+parameter value. If it isn't found there, then
+it tries the document in the database
+with the <tag>targetdoc</tag>
+value that matches the olink's <tag>targetdoc</tag>
+attribute.
+</para>
+
+<para>This feature permits an olink reference to resolve to
+the current document if there is an element
+with an id matching the olink's <tag>targetptr</tag>
+value. The current document's olink data must be
+included in the target database for this to work.</para>
+
+<caution>
+<para>There is a potential for incorrect links if
+the same <tag>id</tag> attribute value is used for different
+content in different documents.
+Some of your olinks may be redirected to the current document
+when they shouldn't be. It is not possible to control
+individual olink instances.</para>
+</caution>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="link.mailto.url">
+<refmeta>
+<refentrytitle>link.mailto.url</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>link.mailto.url</refname>
+<refpurpose>Mailto URL for the LINK REL=made HTML HEAD element</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="link.mailto.url.frag">
+&lt;xsl:param name="link.mailto.url"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If not the empty string, this address will be used for the
+rel=made <literal>link</literal> element in the html <literal>head</literal>
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="ulink.target">
+<refmeta>
+<refentrytitle>ulink.target</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>ulink.target</refname>
+<refpurpose>The HTML anchor target for ULinks</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="ulink.target.frag">
+&lt;xsl:param name="ulink.target"&gt;_top&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If <parameter>ulink.target</parameter> is non-zero, its value will
+be used for the <literal>target</literal> attribute
+on anchors generated for <tag>ulink</tag>s.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="olink.fragid">
+<refmeta>
+<refentrytitle>olink.fragid</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>olink.fragid</refname>
+<refpurpose>Names the fragment identifier portion of an OLink resolver query</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+<programlisting xml:id="olink.fragid.frag">
+&lt;xsl:param name="olink.fragid"&gt;fragid=&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+<para>The fragment identifier portion of an <tag>olink</tag> target.</para>
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="olink.outline.ext">
+<refmeta>
+<refentrytitle>olink.outline.ext</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>olink.outline.ext</refname>
+<refpurpose>The extension of OLink outline files</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="olink.outline.ext.frag">
+&lt;xsl:param name="olink.outline.ext"&gt;.olink&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The extension to be expected for OLink outline files</para>
+<para>Bob has this parameter as dead. Please don't use</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="olink.pubid">
+<refmeta>
+<refentrytitle>olink.pubid</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>olink.pubid</refname>
+<refpurpose>Names the public identifier portion of an OLink resolver query</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="olink.pubid.frag">
+&lt;xsl:param name="olink.pubid"&gt;pubid&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para/>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="olink.sysid">
+<refmeta>
+<refentrytitle>olink.sysid</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>olink.sysid</refname>
+<refpurpose>Names the system identifier portion of an OLink resolver query</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="olink.sysid.frag">
+&lt;xsl:param name="olink.sysid"&gt;sysid&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>FIXME</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="olink.resolver">
+<refmeta>
+<refentrytitle>olink.resolver</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>olink.resolver</refname>
+<refpurpose>The root name of the OLink resolver (usually a script)</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+<programlisting xml:id="olink.resolver.frag">
+ &lt;xsl:param name="olink.resolver"&gt;/cgi-bin/olink&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+<para>FIXME:</para>
+</refsection>
+</refentry>
+
+</reference>
+<reference xml:id="xrefs"><title>Cross References</title>
+<refentry version="5.0" xml:id="collect.xref.targets">
+<refmeta>
+<refentrytitle>collect.xref.targets</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">list</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">no</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">yes</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">only</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>collect.xref.targets</refname>
+<refpurpose>Controls whether cross reference data is
+collected</refpurpose>
+</refnamediv>
+<refsynopsisdiv> <programlisting xml:id="collect.xref.targets.frag">
+&lt;xsl:param name="collect.xref.targets"&gt;no&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+
+<para>
+In order to resolve olinks efficiently, the stylesheets can
+generate an external data file containing information about
+all potential cross reference endpoints in a document.
+This parameter determines whether the collection process is run when the document is processed by the stylesheet. The default value is <literal>no</literal>, which means the data file is not generated during processing. The other choices are <literal>yes</literal>, which means the data file is created and the document is processed for output, and <literal>only</literal>, which means the data file is created but the document is not processed for output.
+See also <parameter>targets.filename</parameter>.
+</para>
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="insert.xref.page.number">
+<refmeta>
+<refentrytitle>insert.xref.page.number</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">list</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">no</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">yes</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">maybe</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>insert.xref.page.number</refname>
+<refpurpose>Turns page numbers in xrefs on and off</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="insert.xref.page.number.frag">
+&lt;xsl:param name="insert.xref.page.number"&gt;no&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The value of this parameter determines if
+cross references (<tag>xref</tag>s) in
+printed output will
+include page number citations.
+It has three possible values.
+</para>
+<variablelist>
+<varlistentry>
+<term>no</term>
+<listitem><para>No page number references will be generated.
+</para></listitem>
+</varlistentry>
+<varlistentry>
+<term>yes</term>
+<listitem><para>Page number references will be generated
+for all <tag>xref</tag> elements.
+The style of page reference may be changed
+if an <tag class="attribute">xrefstyle</tag>
+attribute is used.
+</para></listitem>
+</varlistentry>
+<varlistentry>
+<term>maybe</term>
+<listitem><para>Page number references will not be generated
+for an <tag>xref</tag> element unless
+it has an
+<tag class="attribute">xrefstyle</tag>
+attribute whose value specifies a page reference.
+</para></listitem>
+</varlistentry>
+</variablelist>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="use.role.as.xrefstyle">
+<refmeta>
+<refentrytitle>use.role.as.xrefstyle</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>use.role.as.xrefstyle</refname>
+<refpurpose>Use <tag class="attribute">role</tag> attribute for
+<tag class="attribute">xrefstyle</tag> on <tag>xref</tag>?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="use.role.as.xrefstyle.frag">
+&lt;xsl:param name="use.role.as.xrefstyle" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>In DocBook documents that conform to a schema older than V4.3, this parameter allows
+<tag class="attribute">role</tag> to serve the purpose of specifying the cross reference style.</para>
+
+<para>If non-zero, the <tag class="attribute">role</tag> attribute on
+<tag>xref</tag> will be used to select the cross reference style.
+In DocBook V4.3, the <tag class="attribute">xrefstyle</tag> attribute was added for this purpose.
+If the <tag class="attribute">xrefstyle</tag> attribute is present,
+<tag class="attribute">role</tag> will be ignored, regardless of the setting
+of this parameter.</para>
+
+</refsection>
+
+<refsection><info><title>Example</title></info>
+
+<para>The following small stylesheet shows how to configure the
+stylesheets to make use of the cross reference style:</para>
+
+<programlisting>&lt;?xml version="1.0"?&gt;
+&lt;xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="1.0"&gt;
+
+&lt;xsl:import href="../xsl/html/docbook.xsl"/&gt;
+
+&lt;xsl:output method="html"/&gt;
+
+&lt;xsl:param name="local.l10n.xml" select="document('')"/&gt;
+&lt;l:i18n xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0"&gt;
+ &lt;l:l10n xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0" language="en"&gt;
+ &lt;l:context name="xref"&gt;
+ &lt;l:template name="chapter" style="title" text="Chapter %n, %t"/&gt;
+ &lt;l:template name="chapter" text="Chapter %n"/&gt;
+ &lt;/l:context&gt;
+ &lt;/l:l10n&gt;
+&lt;/l:i18n&gt;
+
+&lt;/xsl:stylesheet&gt;</programlisting>
+
+<para>With this stylesheet, the cross references in the following document:</para>
+
+<programlisting>&lt;?xml version="1.0" encoding="utf-8"?&gt;
+&lt;!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
+ "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd"&gt;
+&lt;book id="book"&gt;&lt;title&gt;Book&lt;/title&gt;
+
+&lt;preface&gt;
+&lt;title&gt;Preface&lt;/title&gt;
+
+&lt;para&gt;Normal: &lt;xref linkend="ch1"/&gt;.&lt;/para&gt;
+&lt;para&gt;Title: &lt;xref xrefstyle="title" linkend="ch1"/&gt;.&lt;/para&gt;
+
+&lt;/preface&gt;
+
+&lt;chapter id="ch1"&gt;
+&lt;title&gt;First Chapter&lt;/title&gt;
+
+&lt;para&gt;Irrelevant.&lt;/para&gt;
+
+&lt;/chapter&gt;
+&lt;/book&gt;</programlisting>
+
+<para>will appear as:</para>
+
+<informalexample>
+<para>Normal: Chapter 1.</para>
+<para>Title: Chapter 1, <emphasis>First Chapter</emphasis>.</para>
+</informalexample>
+</refsection>
+
+</refentry>
+
+<refentry version="5.0" xml:id="xref.with.number.and.title">
+<refmeta>
+<refentrytitle>xref.with.number.and.title</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>xref.with.number.and.title</refname>
+<refpurpose>Use number and title in cross references</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="xref.with.number.and.title.frag">
+&lt;xsl:param name="xref.with.number.and.title" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>A cross reference may include the number (for example, the number of
+an example or figure) and the <tag>title</tag> which is a required child of some
+targets. This parameter inserts both the relevant number as well as
+the title into the link. </para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="xref.label-page.separator">
+<refmeta>
+<refentrytitle>xref.label-page.separator</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>xref.label-page.separator</refname>
+<refpurpose>Punctuation or space separating label from page number in xref</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="xref.label-page.separator.frag">&lt;xsl:param name="xref.label-page.separator"&gt;&lt;xsl:text&gt; &lt;/xsl:text&gt;&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>
+This parameter allows you to control the punctuation of certain
+types of generated cross reference text.
+When cross reference text is generated for an
+<tag class="element">xref</tag> or
+<tag class="element">olink</tag> element
+using an <tag class="attribute">xrefstyle</tag> attribute
+that makes use of the <literal>select:</literal> feature,
+and the selected components include both label and page
+but no title,
+then the value of this parameter is inserted between
+label and page number in the output.
+If a title is included, then other separators are used.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="xref.label-title.separator">
+<refmeta>
+<refentrytitle>xref.label-title.separator</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>xref.label-title.separator</refname>
+<refpurpose>Punctuation or space separating label from title in xref</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="xref.label-title.separator.frag">&lt;xsl:param name="xref.label-title.separator"&gt;: &lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>
+This parameter allows you to control the punctuation of certain
+types of generated cross reference text.
+When cross reference text is generated for an
+<tag class="element">xref</tag> or
+<tag class="element">olink</tag> element
+using an <tag class="attribute">xrefstyle</tag> attribute
+that makes use of the <literal>select:</literal> feature,
+and the selected components include both label and title,
+then the value of this parameter is inserted between
+label and title in the output.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="xref.title-page.separator">
+<refmeta>
+<refentrytitle>xref.title-page.separator</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>xref.title-page.separator</refname>
+<refpurpose>Punctuation or space separating title from page number in xref</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="xref.title-page.separator.frag">&lt;xsl:param name="xref.title-page.separator"&gt;&lt;xsl:text&gt; &lt;/xsl:text&gt;&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>
+This parameter allows you to control the punctuation of certain
+types of generated cross reference text.
+When cross reference text is generated for an
+<tag class="element">xref</tag> or
+<tag class="element">olink</tag> element
+using an <tag class="attribute">xrefstyle</tag> attribute
+that makes use of the <literal>select:</literal> feature,
+and the selected components include both title and page number,
+then the value of this parameter is inserted between
+title and page number in the output.
+</para>
+
+</refsection>
+</refentry>
+
+</reference>
+<reference xml:id="lists"><title>Lists</title>
+<refentry version="5.0" xml:id="segmentedlist.as.table">
+<refmeta>
+<refentrytitle>segmentedlist.as.table</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>segmentedlist.as.table</refname>
+<refpurpose>Format segmented lists as tables?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="segmentedlist.as.table.frag">
+&lt;xsl:param name="segmentedlist.as.table" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, <tag>segmentedlist</tag>s will be formatted as
+tables.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="variablelist.as.table">
+<refmeta>
+<refentrytitle>variablelist.as.table</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>variablelist.as.table</refname>
+<refpurpose>Format <tag>variablelist</tag>s as tables?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="variablelist.as.table.frag">
+&lt;xsl:param name="variablelist.as.table" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, <tag>variablelist</tag>s will be formatted as
+tables. A processing instruction exists to specify a particular width for the
+column containing the <tag>term</tag>s:
+<tag class="xmlpi">dbhtml term-width=".25in"</tag></para>
+
+<para>You can override this setting with a processing instruction as the
+child of <tag>variablelist</tag>: <tag class="xmlpi">dbhtml
+list-presentation="table"</tag> or <tag class="xmlpi">dbhtml
+list-presentation="list"</tag>.</para>
+
+<para>This parameter only applies to the HTML transformations. In the
+FO case, proper list markup is robust enough to handle the formatting.
+But see also <parameter>variablelist.as.blocks</parameter>.</para>
+
+<programlisting> &lt;variablelist&gt;
+ &lt;?dbhtml list-presentation="table"?&gt;
+ &lt;?dbhtml term-width="1.5in"?&gt;
+ &lt;?dbfo list-presentation="list"?&gt;
+ &lt;?dbfo term-width="1in"?&gt;
+ &lt;varlistentry&gt;
+ &lt;term&gt;list&lt;/term&gt;
+ &lt;listitem&gt;
+ &lt;para&gt;
+ Formatted as a table even if variablelist.as.table is set to 0.
+ &lt;/para&gt;
+ &lt;/listitem&gt;
+ &lt;/varlistentry&gt;
+ &lt;/variablelist&gt;</programlisting>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="variablelist.term.separator">
+<refmeta>
+<refentrytitle>variablelist.term.separator</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>variablelist.term.separator</refname>
+<refpurpose>Text to separate <tag>term</tag>s within a multi-term
+<tag>varlistentry</tag></refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="variablelist.term.separator.frag">
+&lt;xsl:param name="variablelist.term.separator"&gt;, &lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>When a <tag>varlistentry</tag> contains multiple <tag>term</tag>
+elements, the string specified in the value of the
+<parameter>variablelist.term.separator</parameter> parameter is placed
+after each <tag>term</tag> except the last.</para>
+
+<note>
+ <para>To generate a line break between multiple <tag>term</tag>s in
+ a <tag>varlistentry</tag>, set a non-zero value for the
+ <parameter>variablelist.term.break.after</parameter> parameter. If
+ you do so, you may also want to set the value of the
+ <parameter>variablelist.term.separator</parameter> parameter to an
+ empty string (to suppress rendering of the default comma and space
+ after each <tag>term</tag>).</para>
+</note>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="variablelist.term.break.after">
+<refmeta>
+<refentrytitle>variablelist.term.break.after</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>variablelist.term.break.after</refname>
+<refpurpose>Generate line break after each <tag>term</tag> within a
+multi-term <tag>varlistentry</tag>?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="variablelist.term.break.after.frag">
+&lt;xsl:param name="variablelist.term.break.after"&gt;0&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Set a non-zero value for the
+<parameter>variablelist.term.break.after</parameter> parameter to
+generate a line break between <tag>term</tag>s in a
+multi-term <tag>varlistentry</tag>.</para>
+
+<note>
+<para>If you set a non-zero value for
+<parameter>variablelist.term.break.after</parameter>, you may also
+want to set the value of the
+<parameter>variablelist.term.separator</parameter> parameter to an
+empty string (to suppress rendering of the default comma and space
+after each <tag>term</tag>).</para>
+</note>
+
+</refsection>
+</refentry>
+
+</reference>
+<reference xml:id="biblio"><title>Bibliography</title>
+<refentry version="5.0" xml:id="bibliography.style">
+<refmeta>
+<refentrytitle>bibliography.style</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">list</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">normal</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">iso690</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>bibliography.style</refname>
+<refpurpose>Style used for formatting of biblioentries.</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="bibliography.style.frag">
+&lt;xsl:param name="bibliography.style"&gt;normal&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Currently only <literal>normal</literal> and
+<literal>iso690</literal> styles are supported.</para>
+
+<para>In order to use ISO690 style to the full extent you might need
+to use additional markup described on <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://wiki.docbook.org/topic/ISO690Bibliography">the
+following WiKi page</link>.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="biblioentry.item.separator">
+<refmeta>
+<refentrytitle>biblioentry.item.separator</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>biblioentry.item.separator</refname>
+<refpurpose>Text to separate bibliography entries</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="biblioentry.item.separator.frag">&lt;xsl:param name="biblioentry.item.separator"&gt;. &lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Text to separate bibliography entries
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="bibliography.collection">
+<refmeta>
+<refentrytitle>bibliography.collection</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>bibliography.collection</refname>
+<refpurpose>Name of the bibliography collection file</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="bibliography.collection.frag">
+&lt;xsl:param name="bibliography.collection"&gt;http://docbook.sourceforge.net/release/bibliography/bibliography.xml&lt;/xsl:param&gt;
+
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Maintaining bibliography entries across a set of documents is tedious, time
+consuming, and error prone. It makes much more sense, usually, to store all of
+the bibliography entries in a single place and simply <quote>extract</quote>
+the ones you need in each document.</para>
+
+<para>That's the purpose of the
+<parameter>bibliography.collection</parameter> parameter. To setup a global
+bibliography <quote>database</quote>, follow these steps:</para>
+
+<para>First, create a stand-alone bibliography document that contains all of
+the documents that you wish to reference. Make sure that each bibliography
+entry (whether you use <tag>biblioentry</tag> or <tag>bibliomixed</tag>)
+has an ID.</para>
+
+<para>My global bibliography, <filename>~/bibliography.xml</filename> begins
+like this:</para>
+
+<informalexample>
+<programlisting>&lt;!DOCTYPE bibliography
+ PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN"
+ "http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd"&gt;
+&lt;bibliography&gt;&lt;title&gt;References&lt;/title&gt;
+
+&lt;bibliomixed id="xml-rec"&gt;&lt;abbrev&gt;XML 1.0&lt;/abbrev&gt;Tim Bray,
+Jean Paoli, C. M. Sperberg-McQueen, and Eve Maler, editors.
+&lt;citetitle&gt;&lt;ulink url="http://www.w3.org/TR/REC-xml"&gt;Extensible Markup
+Language (XML) 1.0 Second Edition&lt;/ulink&gt;&lt;/citetitle&gt;.
+World Wide Web Consortium, 2000.
+&lt;/bibliomixed&gt;
+
+&lt;bibliomixed id="xml-names"&gt;&lt;abbrev&gt;Namespaces&lt;/abbrev&gt;Tim Bray,
+Dave Hollander,
+and Andrew Layman, editors.
+&lt;citetitle&gt;&lt;ulink url="http://www.w3.org/TR/REC-xml-names/"&gt;Namespaces in
+XML&lt;/ulink&gt;&lt;/citetitle&gt;.
+World Wide Web Consortium, 1999.
+&lt;/bibliomixed&gt;
+
+&lt;!-- ... --&gt;
+&lt;/bibliography&gt;
+</programlisting>
+</informalexample>
+
+<para>When you create a bibliography in your document, simply
+provide <emphasis>empty</emphasis> <tag>bibliomixed</tag>
+entries for each document that you wish to cite. Make sure that these
+elements have the same ID as the corresponding <quote>real</quote>
+entry in your global bibliography.</para>
+
+<para>For example:</para>
+
+<informalexample>
+<programlisting>&lt;bibliography&gt;&lt;title&gt;Bibliography&lt;/title&gt;
+
+&lt;bibliomixed id="xml-rec"/&gt;
+&lt;bibliomixed id="xml-names"/&gt;
+&lt;bibliomixed id="DKnuth86"&gt;Donald E. Knuth. &lt;citetitle&gt;Computers and
+Typesetting: Volume B, TeX: The Program&lt;/citetitle&gt;. Addison-Wesley,
+1986. ISBN 0-201-13437-3.
+&lt;/bibliomixed&gt;
+&lt;bibliomixed id="relaxng"/&gt;
+
+&lt;/bibliography&gt;</programlisting>
+</informalexample>
+
+<para>Note that it's perfectly acceptable to mix entries from your
+global bibliography with <quote>normal</quote> entries. You can use
+<tag>xref</tag> or other elements to cross-reference your
+bibliography entries in exactly the same way you do now.</para>
+
+<para>Finally, when you are ready to format your document, simply set the
+<parameter>bibliography.collection</parameter> parameter (in either a
+customization layer or directly through your processor's interface) to
+point to your global bibliography.</para>
+
+<para>The stylesheets will format the bibliography in your document as if
+all of the entries referenced appeared there literally.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="bibliography.numbered">
+<refmeta>
+<refentrytitle>bibliography.numbered</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>bibliography.numbered</refname>
+<refpurpose>Should bibliography entries be numbered?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="bibliography.numbered.frag">
+&lt;xsl:param name="bibliography.numbered" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero bibliography entries will be numbered</para>
+
+</refsection>
+</refentry>
+
+</reference>
+<reference xml:id="glossary"><title>Glossary</title>
+<refentry version="5.0" xml:id="glossterm.auto.link">
+<refmeta>
+<refentrytitle>glossterm.auto.link</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>glossterm.auto.link</refname>
+<refpurpose>Generate links from glossterm to glossentry automatically?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="glossterm.auto.link.frag">
+&lt;xsl:param name="glossterm.auto.link" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, links from inline <tag>glossterm</tag>s to the corresponding
+<tag>glossentry</tag> elements in a <tag>glossary</tag> or <tag>glosslist</tag>
+will be automatically generated. This is useful when your glossterms are consistent
+and you don't want to add links manually.</para>
+
+<para>The automatic link generation feature is not used on <tag>glossterm</tag> elements
+that have a <tag class="attribute">linkend</tag> attribute.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="firstterm.only.link">
+<refmeta>
+<refentrytitle>firstterm.only.link</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>firstterm.only.link</refname>
+<refpurpose>Does automatic glossterm linking only apply to firstterms?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="firstterm.only.link.frag">
+&lt;xsl:param name="firstterm.only.link" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, only <tag>firstterm</tag>s will be automatically linked
+to the glossary. If glossary linking is not enabled, this parameter
+has no effect.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="glossary.collection">
+<refmeta>
+<refentrytitle>glossary.collection</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>glossary.collection</refname>
+<refpurpose>Name of the glossary collection file</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="glossary.collection.frag">
+&lt;xsl:param name="glossary.collection"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Glossaries maintained independently across a set of documents
+are likely to become inconsistent unless considerable effort is
+expended to keep them in sync. It makes much more sense, usually, to
+store all of the glossary entries in a single place and simply
+<quote>extract</quote> the ones you need in each document.</para>
+
+<para>That's the purpose of the
+<parameter>glossary.collection</parameter> parameter. To setup a global
+glossary <quote>database</quote>, follow these steps:</para>
+
+<refsection><info><title>Setting Up the Glossary Database</title></info>
+
+<para>First, create a stand-alone glossary document that contains all of
+the entries that you wish to reference. Make sure that each glossary
+entry has an ID.</para>
+
+<para>Here's an example glossary:</para>
+
+<informalexample>
+<programlisting>
+&lt;?xml version="1.0" encoding="utf-8"?&gt;
+&lt;!DOCTYPE glossary
+ PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN"
+ "http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd"&gt;
+&lt;glossary&gt;
+&lt;glossaryinfo&gt;
+&lt;editor&gt;&lt;firstname&gt;Eric&lt;/firstname&gt;&lt;surname&gt;Raymond&lt;/surname&gt;&lt;/editor&gt;
+&lt;title&gt;Jargon File 4.2.3 (abridged)&lt;/title&gt;
+&lt;releaseinfo&gt;Just some test data&lt;/releaseinfo&gt;
+&lt;/glossaryinfo&gt;
+
+&lt;glossdiv&gt;&lt;title&gt;0&lt;/title&gt;
+
+&lt;glossentry&gt;
+&lt;glossterm&gt;0&lt;/glossterm&gt;
+&lt;glossdef&gt;
+&lt;para&gt;Numeric zero, as opposed to the letter `O' (the 15th letter of
+the English alphabet). In their unmodified forms they look a lot
+alike, and various kluges invented to make them visually distinct have
+compounded the confusion. If your zero is center-dotted and letter-O
+is not, or if letter-O looks almost rectangular but zero looks more
+like an American football stood on end (or the reverse), you're
+probably looking at a modern character display (though the dotted zero
+seems to have originated as an option on IBM 3270 controllers). If
+your zero is slashed but letter-O is not, you're probably looking at
+an old-style ASCII graphic set descended from the default typewheel on
+the venerable ASR-33 Teletype (Scandinavians, for whom /O is a letter,
+curse this arrangement). (Interestingly, the slashed zero long
+predates computers; Florian Cajori's monumental "A History of
+Mathematical Notations" notes that it was used in the twelfth and
+thirteenth centuries.) If letter-O has a slash across it and the zero
+does not, your display is tuned for a very old convention used at IBM
+and a few other early mainframe makers (Scandinavians curse &lt;emphasis&gt;this&lt;/emphasis&gt;
+arrangement even more, because it means two of their letters collide).
+Some Burroughs/Unisys equipment displays a zero with a &lt;emphasis&gt;reversed&lt;/emphasis&gt;
+slash. Old CDC computers rendered letter O as an unbroken oval and 0
+as an oval broken at upper right and lower left. And yet another
+convention common on early line printers left zero unornamented but
+added a tail or hook to the letter-O so that it resembled an inverted
+Q or cursive capital letter-O (this was endorsed by a draft ANSI
+standard for how to draw ASCII characters, but the final standard
+changed the distinguisher to a tick-mark in the upper-left corner).
+Are we sufficiently confused yet?&lt;/para&gt;
+&lt;/glossdef&gt;
+&lt;/glossentry&gt;
+
+&lt;glossentry&gt;
+&lt;glossterm&gt;1TBS&lt;/glossterm&gt;
+&lt;glossdef&gt;
+&lt;para role="accidence"&gt;
+&lt;phrase role="pronounce"&gt;&lt;/phrase&gt;
+&lt;phrase role="partsofspeach"&gt;n&lt;/phrase&gt;
+&lt;/para&gt;
+&lt;para&gt;The "One True Brace Style"&lt;/para&gt;
+&lt;glossseealso&gt;indent style&lt;/glossseealso&gt;
+&lt;/glossdef&gt;
+&lt;/glossentry&gt;
+
+&lt;!-- ... --&gt;
+
+&lt;/glossdiv&gt;
+
+&lt;!-- ... --&gt;
+
+&lt;/glossary&gt;</programlisting>
+</informalexample>
+
+</refsection>
+
+<refsection><info><title>Marking Up Glossary Terms</title></info>
+
+<para>That takes care of the glossary database, now you have to get the entries
+into your document. Unlike bibliography entries, which can be empty, creating
+<quote>placeholder</quote> glossary entries would be very tedious. So instead,
+support for <parameter>glossary.collection</parameter> relies on implicit linking.</para>
+
+<para>In your source document, simply use <tag>firstterm</tag> and
+<tag>glossterm</tag> to identify the terms you wish to have included
+in the glossary. The stylesheets assume that you will either set the
+<tag class="attribute">baseform</tag> attribute correctly, or that the
+content of the element exactly matches a term in your glossary.</para>
+
+<para>If you're using a <parameter>glossary.collection</parameter>, don't
+make explicit links on the terms in your document.</para>
+
+<para>So, in your document, you might write things like this:</para>
+
+<informalexample>
+<programlisting>&lt;para&gt;This is dummy text, without any real meaning.
+The point is simply to reference glossary terms like &lt;glossterm&gt;0&lt;/glossterm&gt;
+and the &lt;firstterm baseform="1TBS"&gt;One True Brace Style (1TBS)&lt;/firstterm&gt;.
+The &lt;glossterm&gt;1TBS&lt;/glossterm&gt;, as you can probably imagine, is a nearly
+religious issue.&lt;/para&gt;</programlisting>
+</informalexample>
+
+<para>If you set the <parameter>firstterm.only.link</parameter> parameter,
+only the terms marked with <tag>firstterm</tag> will be links.
+Otherwise, all the terms will be linked.</para>
+
+</refsection>
+
+<refsection><info><title>Marking Up the Glossary</title></info>
+
+<para>The glossary itself has to be identified for the stylesheets. For lack
+of a better choice, the <tag class="attribute">role</tag> is used.
+To identify the glossary as the target for automatic processing, set
+the role to <quote><literal>auto</literal></quote>. The title of this
+glossary (and any other information from the <tag>glossaryinfo</tag>
+that's rendered by your stylesheet) will be displayed, but the entries will
+come from the database.
+</para>
+
+<para>Unfortunately, the glossary can't be empty, so you must put in
+at least one <tag>glossentry</tag>. The content of this entry
+is irrelevant, it will not be rendered:</para>
+
+<informalexample>
+<programlisting>&lt;glossary role="auto"&gt;
+&lt;glossentry&gt;
+&lt;glossterm&gt;Irrelevant&lt;/glossterm&gt;
+&lt;glossdef&gt;
+&lt;para&gt;If you can see this, the document was processed incorrectly. Use
+the &lt;parameter&gt;glossary.collection&lt;/parameter&gt; parameter.&lt;/para&gt;
+&lt;/glossdef&gt;
+&lt;/glossentry&gt;
+&lt;/glossary&gt;</programlisting>
+</informalexample>
+
+<para>What about glossary divisions? If your glossary database has glossary
+divisions <emphasis>and</emphasis> your automatic glossary contains at least
+one <tag>glossdiv</tag>, the automic glossary will have divisions.
+If the <tag>glossdiv</tag> is missing from either location, no divisions
+will be rendered.</para>
+
+<para>Glossary entries (and divisions, if appropriate) in the glossary will
+occur in precisely the order they occur in your database.</para>
+
+</refsection>
+
+<refsection><info><title>Formatting the Document</title></info>
+
+<para>Finally, when you are ready to format your document, simply set the
+<parameter>glossary.collection</parameter> parameter (in either a
+customization layer or directly through your processor's interface) to
+point to your global glossary.</para>
+
+<para>The stylesheets will format the glossary in your document as if
+all of the entries implicilty referenced appeared there literally.</para>
+</refsection>
+
+<refsection><info><title>Limitations</title></info>
+
+<para>Glossary cross-references <emphasis>within the glossary</emphasis> are
+not supported. For example, this <emphasis>will not</emphasis> work:</para>
+
+<informalexample>
+<programlisting>&lt;glossentry&gt;
+&lt;glossterm&gt;gloss-1&lt;/glossterm&gt;
+&lt;glossdef&gt;&lt;para&gt;A description that references &lt;glossterm&gt;gloss-2&lt;/glossterm&gt;.&lt;/para&gt;
+&lt;glossseealso&gt;gloss-2&lt;/glossseealso&gt;
+&lt;/glossdef&gt;
+&lt;/glossentry&gt;</programlisting>
+</informalexample>
+
+<para>If you put glossary cross-references in your glossary that way,
+you'll get the cryptic error: <computeroutput>Warning:
+glossary.collection specified, but there are 0 automatic
+glossaries</computeroutput>.</para>
+
+<para>Instead, you must do two things:</para>
+
+<orderedlist>
+<listitem>
+<para>Markup your glossary using <tag>glossseealso</tag>:</para>
+
+<informalexample>
+<programlisting>&lt;glossentry&gt;
+&lt;glossterm&gt;gloss-1&lt;/glossterm&gt;
+&lt;glossdef&gt;&lt;para&gt;A description that references &lt;glossterm&gt;gloss-2&lt;/glossterm&gt;.&lt;/para&gt;
+&lt;glossseealso&gt;gloss-2&lt;/glossseealso&gt;
+&lt;/glossdef&gt;
+&lt;/glossentry&gt;</programlisting>
+</informalexample>
+</listitem>
+
+<listitem>
+<para>Make sure there is at least one <tag>glossterm</tag> reference to
+<glossterm>gloss-2</glossterm> <emphasis>in your document</emphasis>. The
+easiest way to do that is probably within a <tag>remark</tag> in your
+automatic glossary:</para>
+
+<informalexample>
+<programlisting>&lt;glossary role="auto"&gt;
+&lt;remark&gt;Make sure there's a reference to &lt;glossterm&gt;gloss-2&lt;/glossterm&gt;.&lt;/remark&gt;
+&lt;glossentry&gt;
+&lt;glossterm&gt;Irrelevant&lt;/glossterm&gt;
+&lt;glossdef&gt;
+&lt;para&gt;If you can see this, the document was processed incorrectly. Use
+the &lt;parameter&gt;glossary.collection&lt;/parameter&gt; parameter.&lt;/para&gt;
+&lt;/glossdef&gt;
+&lt;/glossentry&gt;
+&lt;/glossary&gt;</programlisting>
+</informalexample>
+</listitem>
+</orderedlist>
+</refsection>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="glossary.sort">
+<refmeta>
+<refentrytitle>glossary.sort</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>glossary.sort</refname>
+<refpurpose>Sort glossentry elements?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="glossary.sort.frag">
+&lt;xsl:param name="glossary.sort" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, then the glossentry elements within a
+glossary, glossdiv, or glosslist are sorted on the glossterm, using
+the current lang setting. If zero (the default), then
+glossentry elements are not sorted and are presented
+in document order.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="glossentry.show.acronym">
+<refmeta>
+<refentrytitle>glossentry.show.acronym</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">list</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">no</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">yes</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">primary</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>glossentry.show.acronym</refname>
+<refpurpose>Display <tag>glossentry</tag> acronyms?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="glossentry.show.acronym.frag">
+&lt;xsl:param name="glossentry.show.acronym"&gt;no&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>A setting of <quote>yes</quote> means they should be displayed;
+<quote>no</quote> means they shouldn't. If <quote>primary</quote> is used,
+then they are shown as the primary text for the entry.</para>
+
+<note>
+<para>This setting controls both <tag>acronym</tag> and
+<tag>abbrev</tag> elements in the <tag>glossentry</tag>.</para>
+</note>
+
+</refsection>
+</refentry>
+
+</reference>
+<reference xml:id="misc"><title>Miscellaneous</title>
+<refentry version="5.0" xml:id="formal.procedures">
+<refmeta>
+<refentrytitle>formal.procedures</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>formal.procedures</refname>
+<refpurpose>Selects formal or informal procedures</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="formal.procedures.frag">
+&lt;xsl:param name="formal.procedures" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Formal procedures are numbered and always have a title.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="formal.title.placement">
+<refmeta>
+<refentrytitle>formal.title.placement</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">table</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>formal.title.placement</refname>
+<refpurpose>Specifies where formal object titles should occur</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="formal.title.placement.frag">
+&lt;xsl:param name="formal.title.placement"&gt;
+figure before
+example before
+equation before
+table before
+procedure before
+task before
+&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies where formal object titles should occur. For each formal object
+type (<tag>figure</tag>,
+<tag>example</tag>,
+<tag>equation</tag>,
+<tag>table</tag>, and <tag>procedure</tag>)
+you can specify either the keyword
+<quote><literal>before</literal></quote> or
+<quote><literal>after</literal></quote>.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="runinhead.default.title.end.punct">
+<refmeta>
+<refentrytitle>runinhead.default.title.end.punct</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>runinhead.default.title.end.punct</refname>
+<refpurpose>Default punctuation character on a run-in-head</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="runinhead.default.title.end.punct.frag">&lt;xsl:param name="runinhead.default.title.end.punct"&gt;.&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, For a <tag>formalpara</tag>, use the specified
+string as the separator between the title and following text. The period is the default value.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="runinhead.title.end.punct">
+<refmeta>
+<refentrytitle>runinhead.title.end.punct</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>runinhead.title.end.punct</refname>
+<refpurpose>Characters that count as punctuation on a run-in-head</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="runinhead.title.end.punct.frag">
+&lt;xsl:param name="runinhead.title.end.punct"&gt;.!?:&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specify which characters are to be counted as punctuation. These
+characters are checked for a match with the last character of the
+title. If no match is found, the
+<parameter>runinhead.default.title.end.punct</parameter> contents are
+inserted. This is to avoid duplicated punctuation in the output.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="show.comments">
+<refmeta>
+<refentrytitle>show.comments</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>show.comments</refname>
+<refpurpose>Display <tag>remark</tag> elements?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="show.comments.frag">
+&lt;xsl:param name="show.comments" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, comments will be displayed, otherwise they
+are suppressed. Comments here refers to the <tag>remark</tag> element
+(which was called <literal>comment</literal> prior to DocBook
+4.0), not XML comments (&lt;-- like this --&gt;) which are
+unavailable.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="show.revisionflag">
+<refmeta>
+<refentrytitle>show.revisionflag</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>show.revisionflag</refname>
+<refpurpose>Enable decoration of elements that have a revisionflag</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="show.revisionflag.frag">
+&lt;xsl:param name="show.revisionflag" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>
+If <parameter>show.revisionflag</parameter> is turned on, then the stylesheets
+may produce additional markup designed to allow a CSS stylesheet to
+highlight elements that have specific revisionflag settings.</para>
+
+<para>The markup inserted will be usually be either a &lt;span&gt; or
+&lt;div&gt; with an appropriate <literal>class</literal>
+attribute. (The value of the class attribute will be the same as the
+value of the revisionflag attribute). In some contexts, for example
+tables, where extra markup would be structurally illegal, the class
+attribute will be added to the appropriate container element.</para>
+
+<para>In general, the stylesheets only test for revisionflag in contexts
+where an importing stylesheet would have to redefine whole templates.
+Most of the revisionflag processing is expected to be done by another
+stylesheet, for example <filename>changebars.xsl</filename>.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="shade.verbatim">
+<refmeta>
+<refentrytitle>shade.verbatim</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>shade.verbatim</refname>
+<refpurpose>Should verbatim environments be shaded?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="shade.verbatim.frag">&lt;xsl:param name="shade.verbatim" select="0"&gt;&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>In the FO stylesheet, if this parameter is non-zero then the
+<property>shade.verbatim.style</property> properties will be applied
+to verbatim environments.</para>
+
+<para>In the HTML stylesheet, this parameter is now deprecated. Use
+CSS instead.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="shade.verbatim.style">
+<refmeta>
+<refentrytitle>shade.verbatim.style</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>shade.verbatim.style</refname>
+<refpurpose>Properties that specify the style of shaded verbatim listings</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="shade.verbatim.style.frag">
+&lt;xsl:attribute-set name="shade.verbatim.style"&gt;
+ &lt;xsl:attribute name="border"&gt;0&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="bgcolor"&gt;#E0E0E0&lt;/xsl:attribute&gt;
+&lt;/xsl:attribute-set&gt;
+
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Properties that specify the style of shaded verbatim listings. The
+parameters specified (the border and background color) are added to
+the styling of the xsl-fo output. A border might be specified as "thin
+black solid" for example. See <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.w3.org/TR/2004/WD-xsl11-20041216/#border">xsl-fo</link></para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="punct.honorific">
+<refmeta>
+<refentrytitle>punct.honorific</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>punct.honorific</refname>
+<refpurpose>Punctuation after an honorific in a personal name.</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="punct.honorific.frag">
+&lt;xsl:param name="punct.honorific"&gt;.&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>This parameter specifies the punctuation that should be added after an
+honorific in a personal name.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="tex.math.in.alt">
+<refmeta>
+<refentrytitle>tex.math.in.alt</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">list</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">plain</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">latex</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>tex.math.in.alt</refname>
+<refpurpose>TeX notation used for equations</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="tex.math.in.alt.frag">
+&lt;xsl:param name="tex.math.in.alt"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If you want type math directly in TeX notation in equations,
+this parameter specifies notation used. Currently are supported two
+values -- <literal>plain</literal> and <literal>latex</literal>. Empty
+value means that you are not using TeX math at all.</para>
+
+<para>Preferred way for including TeX alternative of math is inside of
+<tag>textobject</tag> element. Eg.:</para>
+
+<programlisting>&lt;inlineequation&gt;
+&lt;inlinemediaobject&gt;
+&lt;imageobject&gt;
+&lt;imagedata fileref="eq1.gif"/&gt;
+&lt;/imageobject&gt;
+&lt;textobject&gt;&lt;phrase&gt;E=mc squared&lt;/phrase&gt;&lt;/textobject&gt;
+&lt;textobject role="tex"&gt;&lt;phrase&gt;E=mc^2&lt;/phrase&gt;&lt;/textobject&gt;
+&lt;/inlinemediaobject&gt;
+&lt;/inlineequation&gt;</programlisting>
+
+<para>If you are using <tag>graphic</tag> element, you can
+store TeX inside <tag>alt</tag> element:</para>
+
+<programlisting>&lt;inlineequation&gt;
+&lt;alt role="tex"&gt;a^2+b^2=c^2&lt;/alt&gt;
+&lt;graphic fileref="a2b2c2.gif"/&gt;
+&lt;/inlineequation&gt;</programlisting>
+
+<para>If you want use this feature, you should process your FO with
+PassiveTeX, which only supports TeX math notation. When calling
+stylsheet, don't forget to specify also
+passivetex.extensions=1.</para>
+
+<para>If you want equations in HTML, just process generated file
+<filename>tex-math-equations.tex</filename> by TeX or LaTeX. Then run
+dvi2bitmap program on result DVI file. You will get images for
+equations in your document.</para>
+
+<warning>
+ <para>This feature is useful for print/PDF output only if you
+ use the obsolete and now unsupported PassiveTeX XSL-FO
+ engine.</para>
+</warning>
+
+</refsection>
+
+<refsection><info><title>Related Parameters</title></info>
+ <para><parameter>tex.math.delims</parameter>,
+ <parameter>passivetex.extensions</parameter>,
+ <parameter>tex.math.file</parameter></para>
+</refsection>
+
+</refentry>
+
+<refentry version="5.0" xml:id="tex.math.file">
+<refmeta>
+<refentrytitle>tex.math.file</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>tex.math.file</refname>
+<refpurpose>Name of temporary file for generating images from equations</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="tex.math.file.frag">
+&lt;xsl:param name="tex.math.file"&gt;tex-math-equations.tex&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Name of auxiliary file for TeX equations. This file can be
+processed by dvi2bitmap to get bitmap versions of equations for HTML
+output.</para>
+
+</refsection>
+<refsection><info><title>Related Parameters</title></info>
+ <para><parameter>tex.math.in.alt</parameter>,
+ <parameter>tex.math.delims</parameter>,
+ </para>
+</refsection>
+<refsection><info><title>More information</title></info>
+ <para>For how-to documentation on embedding TeX equations and
+ generating output from them, see
+ <link xmlns:xlink="http://www.w3.org/1999/xlink" role="tcg" xlink:href="TexMath.html">DBTeXMath</link>.</para>
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="tex.math.delims">
+<refmeta>
+<refentrytitle>tex.math.delims</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>tex.math.delims</refname>
+<refpurpose>Should equations output for processing by TeX be
+surrounded by math mode delimiters?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="tex.math.delims.frag">
+&lt;xsl:param name="tex.math.delims" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>For compatibility with DSSSL based DBTeXMath from Allin Cottrell
+you should set this parameter to 0.</para>
+
+<warning>
+ <para>This feature is useful for print/PDF output only if you
+ use the obsolete and now unsupported PassiveTeX XSL-FO
+ engine.</para>
+</warning>
+
+</refsection>
+<refsection><info><title>Related Parameters</title></info>
+ <para><parameter>tex.math.in.alt</parameter>,
+ <parameter>passivetex.extensions</parameter></para>
+</refsection>
+
+<refsection><info><title>See Also</title></info>
+ <para>You can also use the <tag class="xmlpi">dbtex delims</tag> processing
+ instruction to control whether delimiters are output.</para>
+</refsection>
+
+
+</refentry>
+
+<refentry version="5.0" xml:id="pixels.per.inch">
+<refmeta>
+<refentrytitle>pixels.per.inch</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">integer</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>pixels.per.inch</refname>
+<refpurpose>How many pixels are there per inch?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="pixels.per.inch.frag">
+&lt;xsl:param name="pixels.per.inch"&gt;90&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>When lengths are converted to pixels, this value is used to
+determine the size of a pixel. The default value is taken from the
+<link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.w3.org/TR/2004/WD-xsl11-20041216/">XSL
+Recommendation</link>.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="points.per.em">
+<refmeta>
+<refentrytitle>points.per.em</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">number</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>points.per.em</refname>
+<refpurpose>Specify the nominal size of an em-space in points</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="points.per.em.frag">
+&lt;xsl:param name="points.per.em"&gt;10&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The fixed value used for calculations based upon the size of a
+character. The assumption made is that ten point font is in use. This
+assumption may not be valid.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="use.svg">
+<refmeta>
+<refentrytitle>use.svg</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>use.svg</refname>
+<refpurpose>Allow SVG in the result tree?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="use.svg.frag">
+&lt;xsl:param name="use.svg" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, SVG will be considered an acceptable image format. SVG
+is passed through to the result tree, so correct rendering of the resulting
+diagram depends on the formatter (FO processor or web browser) that is used
+to process the output from the stylesheet.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="menuchoice.separator">
+<refmeta>
+<refentrytitle>menuchoice.separator</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>menuchoice.separator</refname>
+<refpurpose>Separator between items of a <tag>menuchoice</tag>
+other than <tag>guimenuitem</tag> and
+<tag>guisubmenu</tag></refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="menuchoice.separator.frag">
+&lt;xsl:param name="menuchoice.separator"&gt;+&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Separator used to connect items of a <tag>menuchoice</tag> other
+than <tag>guimenuitem</tag> and <tag>guisubmenu</tag>. The latter
+elements are linked with <parameter>menuchoice.menu.separator</parameter>.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="menuchoice.menu.separator">
+<refmeta>
+<refentrytitle>menuchoice.menu.separator</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>menuchoice.menu.separator</refname>
+<refpurpose>Separator between items of a <tag>menuchoice</tag>
+with <tag>guimenuitem</tag> or
+<tag>guisubmenu</tag></refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="menuchoice.menu.separator.frag">
+&lt;xsl:param name="menuchoice.menu.separator"&gt; &#8594; &lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Separator used to connect items of a <tag>menuchoice</tag> with
+<tag>guimenuitem</tag> or <tag>guisubmenu</tag>. Other elements
+are linked with <parameter>menuchoice.separator</parameter>.
+</para>
+<para>The default value is &amp;#x2192;, which is the
+&amp;rarr; (right arrow) character entity.
+The current FOP (0.20.5) requires setting the font-family
+explicitly.
+</para>
+<para>The default value also includes spaces around the arrow,
+which will allow a line to break. Replace the spaces with
+&amp;#xA0; (nonbreaking space) if you don't want those
+spaces to break.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="default.float.class">
+<refmeta>
+<refentrytitle>default.float.class</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>default.float.class</refname>
+<refpurpose>Specifies the default float class</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="default.float.class.frag">
+&lt;xsl:param name="default.float.class"&gt;
+ &lt;xsl:choose&gt;
+ &lt;xsl:when test="contains($stylesheet.result.type,'html')"&gt;left&lt;/xsl:when&gt;
+ &lt;xsl:otherwise&gt;before&lt;/xsl:otherwise&gt;
+ &lt;/xsl:choose&gt;
+&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Selects the direction in which a float should be placed. for
+xsl-fo this is before, for html it is left. For Western texts, the
+before direction is the top of the page.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="footnote.number.format">
+<refmeta>
+<refentrytitle>footnote.number.format</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">list</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">1<alt>1,2,3...</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">A<alt>A,B,C...</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">a<alt>a,b,c...</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">i<alt>i,ii,iii...</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">I<alt>I,II,III...</alt></refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>footnote.number.format</refname>
+<refpurpose>Identifies the format used for footnote numbers</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="footnote.number.format.frag">
+&lt;xsl:param name="footnote.number.format"&gt;1&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The <parameter>footnote.number.format</parameter> specifies the format
+to use for footnote numeration (1, i, I, a, or A).</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="table.footnote.number.format">
+<refmeta>
+<refentrytitle>table.footnote.number.format</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">list</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">1<alt>1,2,3...</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">A<alt>A,B,C...</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">a<alt>a,b,c...</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">i<alt>i,ii,iii...</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">I<alt>I,II,III...</alt></refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>table.footnote.number.format</refname>
+<refpurpose>Identifies the format used for footnote numbers in tables</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="table.footnote.number.format.frag">
+&lt;xsl:param name="table.footnote.number.format"&gt;a&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The <parameter>table.footnote.number.format</parameter> specifies the format
+to use for footnote numeration (1, i, I, a, or A) in tables.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="footnote.number.symbols">
+<refmeta>
+<refentrytitle>footnote.number.symbols</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype"/>
+</refmeta>
+<refnamediv>
+<refname>footnote.number.symbols</refname>
+<refpurpose>Special characters to use as footnote markers</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="footnote.number.symbols.frag">
+&lt;xsl:param name="footnote.number.symbols"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If <parameter>footnote.number.symbols</parameter> is not the empty string,
+footnotes will use the characters it contains as footnote symbols. For example,
+<quote>*&amp;#x2020;&amp;#x2021;&amp;#x25CA;&amp;#x2720;</quote> will identify
+footnotes with <quote>*</quote>, <quote>&#8224;</quote>, <quote>&#8225;</quote>,
+<quote>&#9674;</quote>, and <quote>&#10016;</quote>. If there are more footnotes
+than symbols, the stylesheets will fall back to numbered footnotes using
+<parameter>footnote.number.format</parameter>.</para>
+
+<para>The use of symbols for footnotes depends on the ability of your
+processor (or browser) to render the symbols you select. Not all systems are
+capable of displaying the full range of Unicode characters. If the quoted characters
+in the preceding paragraph are not displayed properly, that's a good indicator
+that you may have trouble using those symbols for footnotes.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="table.footnote.number.symbols">
+<refmeta>
+<refentrytitle>table.footnote.number.symbols</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>table.footnote.number.symbols</refname>
+<refpurpose>Special characters to use a footnote markers in tables</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="table.footnote.number.symbols.frag">
+&lt;xsl:param name="table.footnote.number.symbols"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If <parameter>table.footnote.number.symbols</parameter> is not the empty string,
+table footnotes will use the characters it contains as footnote symbols. For example,
+<quote>*&amp;#x2020;&amp;#x2021;&amp;#x25CA;&amp;#x2720;</quote> will identify
+footnotes with <quote>*</quote>, <quote>&#8224;</quote>, <quote>&#8225;</quote>,
+<quote>&#9674;</quote>, and <quote>&#10016;</quote>. If there are more footnotes
+than symbols, the stylesheets will fall back to numbered footnotes using
+<parameter>table.footnote.number.format</parameter>.</para>
+
+<para>The use of symbols for footnotes depends on the ability of your
+processor (or browser) to render the symbols you select. Not all systems are
+capable of displaying the full range of Unicode characters. If the quoted characters
+in the preceding paragraph are not displayed properly, that's a good indicator
+that you may have trouble using those symbols for footnotes.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="highlight.source">
+<refmeta>
+<refentrytitle>highlight.source</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>highlight.source</refname>
+<refpurpose>Should the content of <tag>programlisting</tag>
+be syntactically highlighted?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="highlight.source.frag">
+&lt;xsl:param name="highlight.source" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>When this parameter is non-zero, the stylesheets will try to do syntax highlighting of the
+content of <tag>programlisting</tag> elements. You specify the language for each programlisting
+by using the <tag class="attribute">language</tag> attribute. The <parameter>highlight.default.language</parameter>
+parameter can be used to specify the language for programlistings without a <tag class="attribute">language</tag>
+attribute. Syntax highlighting also works for <tag>screen</tag> and <tag>synopsis</tag> elements.</para>
+
+<para>The actual highlighting work is done by the XSLTHL extension module. This is an external Java library that has to be
+downloaded separately (see below).</para>
+
+<itemizedlist>
+<para>In order to use this extension, you must</para>
+
+<listitem><para>add <filename>xslthl-2.x.x.jar</filename> to your Java classpath. The latest version is available
+from <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://sourceforge.net/projects/xslthl">the XSLT syntax highlighting project</link>
+at SourceForge.</para>
+</listitem>
+<listitem>
+<para>use a customization layer in which you import one of the following stylesheet modules:
+<itemizedlist>
+ <listitem>
+ <para><filename>html/highlight.xsl</filename>
+ </para>
+ </listitem>
+<listitem>
+ <para><filename>xhtml/highlight.xsl</filename>
+ </para>
+ </listitem>
+<listitem>
+ <para><filename>xhtml-1_1/highlight.xsl</filename>
+ </para>
+ </listitem>
+<listitem>
+ <para><filename>fo/highlight.xsl</filename>
+ </para>
+</listitem>
+</itemizedlist>
+</para>
+</listitem>
+<listitem><para>let either the <literal>xslthl.config</literal> Java system property or the
+<parameter>highlight.xslthl.config</parameter> parameter point to the configuration file for syntax
+highlighting (using URL syntax). DocBook XSL comes with a ready-to-use configuration file,
+<filename>highlighting/xslthl-config.xml</filename>.</para>
+</listitem>
+</itemizedlist>
+
+<para>The extension works with Saxon 6.5.x and Xalan-J. (Saxon 8.5 or later is also supported, but since it is
+an XSLT 2.0 processor it is not guaranteed to work with DocBook XSL in all circumstances.)</para>
+
+<para>The following is an example of a Saxon 6 command adapted for syntax highlighting, to be used on Windows:</para>
+
+<informalexample>
+<para><command>java -cp c:/Java/saxon.jar;c:/Java/xslthl-2.0.1.jar
+-Dxslthl.config=file:///c:/docbook-xsl/highlighting/xslthl-config.xml com.icl.saxon.StyleSheet
+-o test.html test.xml myhtml.xsl</command></para>
+</informalexample>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="highlight.xslthl.config">
+<refmeta>
+<refentrytitle>highlight.xslthl.config</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">uri</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>highlight.xslthl.config</refname>
+<refpurpose>Location of XSLTHL configuration file</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="highlight.xslthl.config.frag">
+&lt;xsl:param name="highlight.xslthl.config"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>This location has precedence over the corresponding Java property.</para>
+
+<para>Please note that usually you have to specify location as URL not
+just as a simple path on the local
+filesystem. E.g. <filename>file:///home/user/xslthl/my-xslthl-config.xml</filename>.</para>
+
+
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="highlight.default.language">
+<refmeta>
+<refentrytitle>highlight.default.language</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>highlight.default.language</refname>
+<refpurpose>Default language of programlisting</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="highlight.default.language.frag">
+&lt;xsl:param name="highlight.default.language"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>This language is used when there is no language attribute on programlisting.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="email.delimiters.enabled">
+<refmeta>
+<refentrytitle>email.delimiters.enabled</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>email.delimiters.enabled</refname>
+<refpurpose>Generate delimiters around email addresses?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="email.delimiters.enabled.frag">
+&lt;xsl:param name="email.delimiters.enabled" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, delimiters
+
+<footnote><para>For delimiters, the
+stylesheets are currently hard-coded to output angle
+brackets.</para></footnote>
+
+are generated around e-mail addresses
+(the output of the <tag>email</tag> element).</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="exsl.node.set.available">
+<refmeta>
+<refentrytitle>exsl.node.set.available</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>exsl.node.set.available</refname>
+<refpurpose>Is the test function-available('exsl:node-set') true?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="exsl.node.set.available.frag">&lt;xsl:param name="exsl.node.set.available"&gt;
+ &lt;xsl:choose&gt;
+ &lt;xsl:when exsl:foo="" test="function-available('exsl:node-set') or contains(system-property('xsl:vendor'), 'Apache Software Foundation')"&gt;1&lt;/xsl:when&gt;
+ &lt;xsl:otherwise&gt;0&lt;/xsl:otherwise&gt;
+ &lt;/xsl:choose&gt;
+&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero,
+then the exsl:node-set() function is available to be used in
+the stylesheet.
+If zero, then the function is not available.
+This param automatically detects the presence of
+the function and does not normally need to be set manually.</para>
+
+<para>This param was created to handle a long-standing
+bug in the Xalan processor that fails to detect the
+function even though it is available.</para>
+
+</refsection>
+</refentry>
+
+</reference>
+<reference xml:id="annos"><title>Annotations</title>
+<refentry version="5.0" xml:id="annotation.support">
+<refmeta>
+<refentrytitle>annotation.support</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>annotation.support</refname>
+<refpurpose>Enable annotations?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="annotation.support.frag">
+&lt;xsl:param name="annotation.support" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, the stylesheets will attempt to support annotation
+elements in HTML by including some JavaScript (see
+<parameter>annotation.js</parameter>).</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="annotation.js">
+<refmeta>
+<refentrytitle>annotation.js</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>annotation.js</refname>
+<refpurpose>URIs identifying JavaScript files with support for annotation popups</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="annotation.js.frag">
+
+&lt;xsl:param name="annotation.js"&gt;
+&lt;xsl:text&gt;http://docbook.sourceforge.net/release/script/AnchorPosition.js http://docbook.sourceforge.net/release/script/PopupWindow.js&lt;/xsl:text&gt;&lt;/xsl:param&gt;
+
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If <property>annotation.support</property> is enabled and the
+document contains <tag>annotation</tag>s, then the URIs listed
+in this parameter will be included. These JavaScript files are required
+for popup annotation support.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="annotation.css">
+<refmeta>
+<refentrytitle>annotation.css</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>annotation.css</refname>
+<refpurpose>CSS rules for annotations</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="annotation.css.frag">
+&lt;xsl:param name="annotation.css"&gt;
+/* ======================================================================
+ Annotations
+*/
+
+div.annotation-list { visibility: hidden;
+ }
+
+div.annotation-nocss { position: absolute;
+ visibility: hidden;
+ }
+
+div.annotation-popup { position: absolute;
+ z-index: 4;
+ visibility: hidden;
+ padding: 0px;
+ margin: 2px;
+ border-style: solid;
+ border-width: 1px;
+ width: 200px;
+ background-color: white;
+ }
+
+div.annotation-title { padding: 1px;
+ font-weight: bold;
+ border-bottom-style: solid;
+ border-bottom-width: 1px;
+ color: white;
+ background-color: black;
+ }
+
+div.annotation-body { padding: 2px;
+ }
+
+div.annotation-body p { margin-top: 0px;
+ padding-top: 0px;
+ }
+
+div.annotation-close { position: absolute;
+ top: 2px;
+ right: 2px;
+ }
+&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If <parameter>annotation.support</parameter> is enabled and the
+document contains <tag>annotation</tag>s, then the CSS in this
+parameter will be included in the document.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="annotation.graphic.open">
+<refmeta>
+<refentrytitle>annotation.graphic.open</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">uri</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>annotation.graphic.open</refname>
+<refpurpose>Image for identifying a link that opens an annotation popup</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="annotation.graphic.open.frag">
+&lt;xsl:param name="annotation.graphic.open"&gt;http://docbook.sourceforge.net/release/images/annot-open.png&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>This image is used inline to identify the location of
+annotations. It may be replaced by a user provided graphic. The size should be approximately 10x10 pixels.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="annotation.graphic.close">
+<refmeta>
+<refentrytitle>annotation.graphic.close</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">uri</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>annotation.graphic.close</refname>
+<refpurpose>Image for identifying a link that closes an annotation popup</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="annotation.graphic.close.frag">
+&lt;xsl:param name="annotation.graphic.close"&gt;
+http://docbook.sourceforge.net/release/images/annot-close.png&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>This image is used on popup annotations as the &#8220;x&#8221; that the
+user can click to dismiss the popup.</para>
+<para>This image is used on popup annotations as the &#8220;x&#8221; that the user can
+click to dismiss the popup. It may be replaced by a user provided graphic. The size should be approximately 10x10 pixels.</para>
+
+</refsection>
+</refentry>
+
+</reference>
+<reference xml:id="graphics"><title>Graphics</title>
+<refentry version="5.0" xml:id="img.src.path">
+<refmeta>
+<refentrytitle>img.src.path</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>img.src.path</refname>
+<refpurpose>Path to HTML/FO image files</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="img.src.path.frag">&lt;xsl:param name="img.src.path"&gt;&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Add a path prefix to the value of the <tag class="attribute">fileref</tag>
+attribute of <tag>graphic</tag>, <tag>inlinegraphic</tag>, and <tag>imagedata</tag> elements. The resulting
+compound path is used in the output as the value of the <tag class="attribute">src</tag>
+attribute of <tag class="element">img</tag> (HTML) or <tag class="element">external-graphic</tag> (FO).
+</para>
+
+<para>
+The path given by <literal>img.src.path</literal> could be relative to the directory where the HTML/FO
+files are created, or it could be an absolute URI.
+The default value is empty.
+Be sure to include a trailing slash if needed.
+</para>
+
+<para>This prefix is not applied to any filerefs that start
+with "/" or contain "//:".
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="keep.relative.image.uris">
+<refmeta>
+<refentrytitle>keep.relative.image.uris</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>keep.relative.image.uris</refname>
+<refpurpose>Should image URIs be resolved against xml:base?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="keep.relative.image.uris.frag">
+&lt;xsl:param name="keep.relative.image.uris" select="1"&gt;&lt;/xsl:param&gt;
+
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, relative URIs (in, for example
+<literal>fileref</literal> attributes) will be used in the generated
+output. Otherwise, the URIs will be made absolute with respect to the
+base URI.</para>
+
+<para>Note that the stylesheets calculate (and use) the absolute form
+for some purposes, this only applies to the resulting output.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="graphic.default.extension">
+<refmeta>
+<refentrytitle>graphic.default.extension</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>graphic.default.extension</refname>
+<refpurpose>Default extension for graphic filenames</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="graphic.default.extension.frag">&lt;xsl:param name="graphic.default.extension"&gt;&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If a <tag>graphic</tag> or <tag>mediaobject</tag>
+includes a reference to a filename that does not include an extension,
+and the <tag class="attribute">format</tag> attribute is
+<emphasis>unspecified</emphasis>, the default extension will be used.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="default.image.width">
+<refmeta>
+<refentrytitle>default.image.width</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">length</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>default.image.width</refname>
+<refpurpose>The default width of images</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="default.image.width.frag">
+&lt;xsl:param name="default.image.width"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If specified, this value will be used for the
+<tag class="attribute">width</tag> attribute on images that do not specify any
+<emphasis xmlns:xlink="http://www.w3.org/1999/xlink" xlink:title="DocBook 5: The Definitive Guide" xlink:href="http://docbook.org/tdg5/en/html/imagedata.html#viewport.area">viewport dimensions</emphasis>.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="nominal.image.width">
+<refmeta>
+<refentrytitle>nominal.image.width</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">length</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>nominal.image.width</refname>
+<refpurpose>The nominal image width</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="nominal.image.width.frag">
+&lt;xsl:param name="nominal.image.width" select="6 * $pixels.per.inch"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Graphic widths expressed as a percentage are problematic. In the
+following discussion, we speak of width and contentwidth, but
+the same issues apply to depth and contentdepth.</para>
+
+<para>A width of 50% means "half of the available space for the image."
+That's fine. But note that in HTML, this is a dynamic property and
+the image size will vary if the browser window is resized.</para>
+
+<para>A contentwidth of 50% means "half of the actual image width".
+But what does that mean if the stylesheets cannot assess the image's
+actual size? Treating this as a width of 50% is one possibility, but
+it produces behavior (dynamic scaling) that seems entirely out of
+character with the meaning.</para>
+
+<para>Instead, the stylesheets define a
+<parameter>nominal.image.width</parameter> and convert percentages to
+actual values based on that nominal size.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="nominal.image.depth">
+<refmeta>
+<refentrytitle>nominal.image.depth</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">length</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>nominal.image.depth</refname>
+<refpurpose>Nominal image depth</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="nominal.image.depth.frag">
+&lt;xsl:param name="nominal.image.depth" select="4 * $pixels.per.inch"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>See <parameter>nominal.image.width</parameter>.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="use.embed.for.svg">
+<refmeta>
+<refentrytitle>use.embed.for.svg</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>use.embed.for.svg</refname>
+<refpurpose>Use HTML <tag>embed</tag> for SVG?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="use.embed.for.svg.frag">
+&lt;xsl:param name="use.embed.for.svg" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, an <tag>embed</tag> element will be created for
+SVG figures. An <tag>object</tag> is <emphasis>always</emphasis> created,
+this parameter merely controls whether or not an additional <tag>embed</tag>
+is generated inside the <tag>object</tag>.</para>
+
+<para>On the plus side, this may be more portable among browsers and plug-ins.
+On the minus side, it isn't valid HTML.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="make.graphic.viewport">
+<refmeta>
+<refentrytitle>make.graphic.viewport</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>make.graphic.viewport</refname>
+<refpurpose>Use tables in HTML to make viewports for graphics</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="make.graphic.viewport.frag">
+&lt;xsl:param name="make.graphic.viewport" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The HTML <tag>img</tag> element only supports the notion
+of content-area scaling; it doesn't support the distinction between a
+content-area and a viewport-area, so we have to make some compromises.</para>
+
+<para>If <parameter>make.graphic.viewport</parameter> is non-zero, a table
+will be used to frame the image. This creates an effective viewport-area.
+</para>
+
+<para>Tables and alignment don't work together, so this parameter is ignored
+if alignment is specified on an image.</para>
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="preferred.mediaobject.role">
+<refmeta>
+<refentrytitle>preferred.mediaobject.role</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>preferred.mediaobject.role</refname>
+<refpurpose>Select which mediaobject to use based on
+this value of an object's <tag class="attribute">role</tag> attribute.
+</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="preferred.mediaobject.role.frag">
+&lt;xsl:param name="preferred.mediaobject.role"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>A mediaobject may contain several objects such as imageobjects.
+If the parameter <parameter>use.role.for.mediaobject</parameter> is
+non-zero, then the <literal>role</literal> attribute on
+<tag>imageobject</tag>s and other objects within a
+<tag>mediaobject</tag> container will be used to select which object
+will be used. If one of the objects has a role value that matches the
+<parameter>preferred.mediaobject.role</parameter> parameter, then it
+has first priority for selection. If more than one has such a role
+value, the first one is used.
+</para>
+<para>
+See the <parameter>use.role.for.mediaobject</parameter> parameter
+for the sequence of selection.</para>
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="use.role.for.mediaobject">
+<refmeta>
+<refentrytitle>use.role.for.mediaobject</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>use.role.for.mediaobject</refname>
+<refpurpose>Use <tag class="attribute">role</tag> attribute
+value for selecting which of several objects within a mediaobject to use.
+</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="use.role.for.mediaobject.frag">
+&lt;xsl:param name="use.role.for.mediaobject" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, the <tag class="attribute">role</tag> attribute on
+<tag>imageobject</tag>s or other objects within a <tag>mediaobject</tag> container will be used to select which object will be
+used.
+</para>
+<para>
+The order of selection when then parameter is non-zero is:
+</para>
+<orderedlist>
+<listitem>
+ <para>If the stylesheet parameter <parameter>preferred.mediaobject.role</parameter> has a value, then the object whose role equals that value is selected.</para>
+</listitem>
+<listitem>
+<para>Else if an object's role attribute has a value of
+<literal>html</literal> for HTML processing or
+<literal>fo</literal> for FO output, then the first
+of such objects is selected.
+</para>
+</listitem>
+<listitem>
+<para>Else the first suitable object is selected.</para>
+</listitem>
+</orderedlist>
+<para>
+If the value of
+<parameter>use.role.for.mediaobject</parameter>
+is zero, then role attributes are not considered
+and the first suitable object
+with or without a role value is used.
+</para>
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="ignore.image.scaling">
+<refmeta>
+<refentrytitle>ignore.image.scaling</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>ignore.image.scaling</refname>
+<refpurpose>Tell the stylesheets to ignore the author's image scaling attributes</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="ignore.image.scaling.frag">
+&lt;xsl:param name="ignore.image.scaling" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, the scaling attributes on graphics and media objects are
+ignored.</para>
+
+</refsection>
+</refentry>
+
+</reference>
+<reference xml:id="chunking"><title>Chunking</title>
+<refentry version="5.0" xml:id="chunker.output.cdata-section-elements">
+<refmeta>
+<refentrytitle>chunker.output.cdata-section-elements</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>chunker.output.cdata-section-elements</refname>
+<refpurpose>List of elements to escape with CDATA sections</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+<programlisting xml:id="chunker.output.cdata-section-elements.frag">
+&lt;xsl:param name="chunker.output.cdata-section-elements"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+<para>This parameter specifies the list of elements that should be escaped
+as CDATA sections by the chunking stylesheet. Not all processors support
+specification of this parameter.
+</para>
+<note>
+<para>This parameter is documented here, but the declaration is actually
+in the <filename>chunker.xsl</filename> stylesheet module.</para>
+</note>
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="chunker.output.doctype-public">
+<refmeta>
+<refentrytitle>chunker.output.doctype-public</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>chunker.output.doctype-public</refname>
+<refpurpose>Public identifer to use in the document type of generated pages</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+<programlisting xml:id="chunker.output.doctype-public.frag">
+&lt;xsl:param name="chunker.output.doctype-public"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+<para>This parameter specifies the public identifier that should be used by
+the chunking stylesheet in the document type declaration of chunked pages.
+Not all processors support specification of
+this parameter.
+</para>
+<note>
+<para>This parameter is documented here, but the declaration is actually
+in the <filename>chunker.xsl</filename> stylesheet module.</para>
+</note>
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="chunker.output.doctype-system">
+<refmeta>
+<refentrytitle>chunker.output.doctype-system</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">uri</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>chunker.output.doctype-system</refname>
+<refpurpose>System identifier to use for the document type in generated pages</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+<programlisting xml:id="chunker.output.doctype-system.frag">
+&lt;xsl:param name="chunker.output.doctype-system"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+<para>This parameter specifies the system identifier that should be used by
+the chunking stylesheet in the document type declaration of chunked pages.
+Not all processors support specification of
+this parameter.
+</para>
+<note>
+<para>This parameter is documented here, but the declaration is actually
+in the <filename>chunker.xsl</filename> stylesheet module.</para>
+</note>
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="chunker.output.encoding">
+<refmeta>
+<refentrytitle>chunker.output.encoding</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>chunker.output.encoding</refname>
+<refpurpose>Encoding used in generated pages</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+<programlisting xml:id="chunker.output.encoding.frag">
+&lt;xsl:param name="chunker.output.encoding"&gt;ISO-8859-1&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+<para>This parameter specifies the encoding to be used in files
+generated by the chunking stylesheet. Not all processors support
+specification of this parameter.
+</para>
+<para>This parameter used to be named <literal>default.encoding</literal>.</para>
+<note>
+<para>This parameter is documented here, but the declaration is actually
+in the <filename>chunker.xsl</filename> stylesheet module.</para>
+</note>
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="chunker.output.indent">
+<refmeta>
+<refentrytitle>chunker.output.indent</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>chunker.output.indent</refname>
+<refpurpose>Specification of indentation on generated pages</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+<programlisting xml:id="chunker.output.indent.frag">
+&lt;xsl:param name="chunker.output.indent"&gt;no&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+<para>This parameter specifies the value of the indent
+specification for generated pages. Not all processors support
+specification of this parameter.
+</para>
+<note>
+<para>This parameter is documented here, but the declaration is actually
+in the <filename>chunker.xsl</filename> stylesheet module.</para>
+</note>
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="chunker.output.media-type">
+<refmeta>
+<refentrytitle>chunker.output.media-type</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>chunker.output.media-type</refname>
+<refpurpose>Media type to use in generated pages</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+<programlisting xml:id="chunker.output.media-type.frag">
+&lt;xsl:param name="chunker.output.media-type"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+<para>This parameter specifies the media type that should be used by
+the chunking stylesheet. Not all processors support specification of
+this parameter.
+</para>
+<para>This parameter specifies the media type that should be used by the
+chunking stylesheet. This should be one from those defined in
+<link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.ietf.org/rfc/rfc2045.txt">[RFC2045]</link> and
+ <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.ietf.org/rfc/rfc2046.txt">[RFC2046]</link> </para>
+<note>
+<para>This parameter is documented here, but the declaration is actually
+in the <filename>chunker.xsl</filename> stylesheet module.</para>
+<para>It must be one from html, xml or text</para>
+</note>
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="chunker.output.method">
+<refmeta>
+<refentrytitle>chunker.output.method</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">list</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">html</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">xml</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>chunker.output.method</refname>
+<refpurpose>Method used in generated pages</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+<programlisting xml:id="chunker.output.method.frag">
+&lt;xsl:param name="chunker.output.method"&gt;html&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+<para>This parameter specifies the output method to be used in files
+generated by the chunking stylesheet.
+</para>
+<para>This parameter used to be named <literal>output.method</literal>.</para>
+<note>
+<para>This parameter is documented here, but the declaration is actually
+in the <filename>chunker.xsl</filename> stylesheet module.</para>
+</note>
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="chunker.output.omit-xml-declaration">
+<refmeta>
+<refentrytitle>chunker.output.omit-xml-declaration</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>chunker.output.omit-xml-declaration</refname>
+<refpurpose>Omit-xml-declaration for generated pages</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+<programlisting xml:id="chunker.output.omit-xml-declaration.frag">
+&lt;xsl:param name="chunker.output.omit-xml-declaration"&gt;no&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+<para>This parameter specifies the value of the omit-xml-declaration
+specification for generated pages. Not all processors support
+specification of this parameter.
+</para>
+<note>
+<para>This parameter is documented here, but the declaration is actually
+in the <filename>chunker.xsl</filename> stylesheet module.</para>
+</note>
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="chunker.output.standalone">
+<refmeta>
+<refentrytitle>chunker.output.standalone</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>chunker.output.standalone</refname>
+<refpurpose>Standalone declaration for generated pages</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+<programlisting xml:id="chunker.output.standalone.frag">
+&lt;xsl:param name="chunker.output.standalone"&gt;no&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+<para>This parameter specifies the value of the standalone
+ specification for generated pages. It must be either
+ <literal>yes</literal> or <literal>no</literal>. Not all
+ processors support specification of this parameter.
+</para>
+<note>
+<para>This parameter is documented here, but the declaration is actually
+in the <filename>chunker.xsl</filename> stylesheet module.</para>
+</note>
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="saxon.character.representation">
+<refmeta>
+<refentrytitle>saxon.character.representation</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>saxon.character.representation</refname>
+<refpurpose>Saxon character representation used in generated HTML pages</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+ <programlisting xml:id="saxon.character.representation.frag">&lt;xsl:param name="saxon.character.representation" select="'entity;decimal'"&gt;&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>This parameter has effect only when Saxon 6 is used (version 6.4.2 or later).
+It sets the character representation in files generated by the chunking stylesheets.
+If you want to suppress entity references for characters with direct representations in
+<parameter>chunker.output.encoding</parameter>, set the parameter value to <literal>native</literal>.
+</para>
+
+<para> For more information, see <link xmlns:xlink="http://www.w3.org/1999/xlink" role="tcg" xlink:href="OutputEncoding.html#SaxonCharacter">Saxon output character representation</link>.</para>
+
+<note>
+<para>This parameter is documented here, but the declaration is actually
+in the <filename>chunker.xsl</filename> stylesheet module.</para>
+</note>
+
+</refsection>
+
+</refentry>
+
+<refentry version="5.0" xml:id="html.ext">
+<refmeta>
+<refentrytitle>html.ext</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>html.ext</refname>
+<refpurpose>Identifies the extension of generated HTML files</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="html.ext.frag">
+&lt;xsl:param name="html.ext"&gt;.html&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The extension identified by <parameter>html.ext</parameter> will
+be used as the filename extension for chunks created by this
+stylesheet. </para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="use.id.as.filename">
+<refmeta>
+<refentrytitle>use.id.as.filename</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>use.id.as.filename</refname>
+<refpurpose>Use ID value of chunk elements as the filename?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="use.id.as.filename.frag">
+&lt;xsl:param name="use.id.as.filename" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If <parameter>use.id.as.filename</parameter>
+is non-zero, the filename of chunk elements that have IDs will be
+derived from the ID value.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="html.extra.head.links">
+<refmeta>
+<refentrytitle>html.extra.head.links</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>html.extra.head.links</refname>
+<refpurpose>Toggle extra HTML head link information</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="html.extra.head.links.frag">
+&lt;xsl:param name="html.extra.head.links" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, extra <tag>link</tag> elements will be
+generated in the <tag>head</tag> of chunked HTML files. These
+extra links point to chapters, appendixes, sections, etc. as supported
+by the <quote>Site Navigation Bar</quote> in Mozilla 1.0 (as of CR1, at least).
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="root.filename">
+<refmeta>
+<refentrytitle>root.filename</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">uri</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>root.filename</refname>
+<refpurpose>Identifies the name of the root HTML file when chunking</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="root.filename.frag">
+&lt;xsl:param name="root.filename"&gt;index&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The <parameter>root.filename</parameter> is the base filename for
+the chunk created for the root of each document processed.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="base.dir">
+<refmeta>
+<refentrytitle>base.dir</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">uri</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>base.dir</refname>
+<refpurpose>The base directory of chunks</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="base.dir.frag">
+&lt;xsl:param name="base.dir"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If specified, the <parameter>base.dir</parameter> identifies
+the output directory for chunks. (If not specified, the output directory
+is system dependent.)</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="generate.manifest">
+ <refmeta>
+ <refentrytitle>generate.manifest</refentrytitle>
+ <refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+ </refmeta>
+ <refnamediv>
+ <refname>generate.manifest</refname>
+ <refpurpose>Generate a manifest file?</refpurpose>
+ </refnamediv>
+
+ <refsynopsisdiv>
+ <programlisting xml:id="generate.manifest.frag">&lt;xsl:param name="generate.manifest" select="0"&gt;&lt;/xsl:param&gt;</programlisting>
+ </refsynopsisdiv>
+
+ <refsection><info><title>Description</title></info>
+
+ <para>If non-zero, a list of HTML files generated by the
+ stylesheet transformation is written to the file named by
+ the <parameter>manifest</parameter> parameter.</para>
+
+ </refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="manifest">
+ <refmeta>
+ <refentrytitle>manifest</refentrytitle>
+ <refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+ </refmeta>
+ <refnamediv>
+ <refname>manifest</refname>
+ <refpurpose>Name of manifest file</refpurpose>
+ </refnamediv>
+
+ <refsynopsisdiv>
+ <programlisting xml:id="manifest.frag">
+ &lt;xsl:param name="manifest"&gt;HTML.manifest&lt;/xsl:param&gt;
+ </programlisting>
+ </refsynopsisdiv>
+
+ <refsection><info><title>Description</title></info>
+
+ <para>The name of the file to which a manifest is written (if the
+ value of the <parameter>generate.manifest</parameter> parameter
+ is non-zero).</para>
+
+ </refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="manifest.in.base.dir">
+<refmeta>
+<refentrytitle>manifest.in.base.dir</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>manifest.in.base.dir</refname>
+<refpurpose>Should the manifest file be written into <parameter>base.dir</parameter>?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="manifest.in.base.dir.frag">
+&lt;xsl:param name="manifest.in.base.dir" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, the manifest file as well as project files for HTML Help and
+Eclipse Help are written into <parameter>base.dir</parameter> instead
+of the current directory.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="chunk.toc">
+<refmeta>
+<refentrytitle>chunk.toc</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>chunk.toc</refname>
+<refpurpose>An explicit TOC to be used for chunking</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="chunk.toc.frag">
+&lt;xsl:param name="chunk.toc"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The <parameter>chunk.toc</parameter> identifies an explicit TOC that
+will be used for chunking. This parameter is only used by the
+<filename>chunktoc.xsl</filename> stylesheet (and customization layers built
+from it).</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="chunk.tocs.and.lots">
+<refmeta>
+<refentrytitle>chunk.tocs.and.lots</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>chunk.tocs.and.lots</refname>
+<refpurpose>Should ToC and LoTs be in separate chunks?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="chunk.tocs.and.lots.frag">
+&lt;xsl:param name="chunk.tocs.and.lots" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, ToC and LoT (List of Examples, List of Figures, etc.)
+will be put in a separate chunk. At the moment, this chunk is not in the
+normal forward/backward navigation list. Instead, a new link is added to the
+navigation footer.</para>
+
+<para>This feature is still somewhat experimental. Feedback welcome.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="chunk.separate.lots">
+<refmeta>
+<refentrytitle>chunk.separate.lots</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>chunk.separate.lots</refname>
+<refpurpose>Should each LoT be in its own separate chunk?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="chunk.separate.lots.frag">
+&lt;xsl:param name="chunk.separate.lots" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, each of the ToC and LoTs
+(List of Examples, List of Figures, etc.)
+will be put in its own separate chunk.
+The title page includes generated links to each of the separate files.
+</para>
+<para>
+This feature depends on the
+<parameter>chunk.tocs.and.lots</parameter>
+parameter also being non-zero.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="chunk.tocs.and.lots.has.title">
+<refmeta>
+<refentrytitle>chunk.tocs.and.lots.has.title</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>chunk.tocs.and.lots.has.title</refname>
+<refpurpose>Should ToC and LoTs in a separate chunks have title?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="chunk.tocs.and.lots.has.title.frag">
+&lt;xsl:param name="chunk.tocs.and.lots.has.title" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero title of document is shown before ToC/LoT in
+separate chunk.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="chunk.section.depth">
+<refmeta>
+<refentrytitle>chunk.section.depth</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">integer</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>chunk.section.depth</refname>
+<refpurpose>Depth to which sections should be chunked</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="chunk.section.depth.frag">
+&lt;xsl:param name="chunk.section.depth" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>This parameter sets the depth of section chunking.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="chunk.first.sections">
+<refmeta>
+<refentrytitle>chunk.first.sections</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>chunk.first.sections</refname>
+<refpurpose>Chunk the first top-level section?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="chunk.first.sections.frag">
+&lt;xsl:param name="chunk.first.sections" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, a chunk will be created for the first top-level
+<tag>sect1</tag> or <tag>section</tag> elements in
+each component. Otherwise, that section will be part of the chunk for
+its parent.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="chunk.quietly">
+<refmeta>
+<refentrytitle>chunk.quietly</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>chunk.quietly</refname>
+<refpurpose>Omit the chunked filename messages.</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="chunk.quietly.frag">
+&lt;xsl:param name="chunk.quietly" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If zero (the default), the XSL processor emits a message naming
+each separate chunk filename as it is being output.
+If nonzero, then the messages are suppressed.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="chunk.append">
+<refmeta>
+<refentrytitle>chunk.append</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>chunk.append</refname>
+<refpurpose>Specifies content to append to chunked HTML output</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="chunk.append.frag">&lt;xsl:param name="chunk.append"&gt;&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies content to append to the end of HTML files output by
+the <filename>html/chunk.xsl</filename> stylesheet, after the closing
+<code>&lt;html&gt;</code> tag. You probably don&#8217;t want to set any value
+for this parameter; but if you do, the only value it should ever be
+set to is a newline character: <code>&amp;#x0a;</code> or
+<code>&amp;#10;</code></para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="navig.graphics">
+<refmeta>
+<refentrytitle>navig.graphics</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>navig.graphics</refname>
+<refpurpose>Use graphics in navigational headers and footers?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="navig.graphics.frag">
+&lt;xsl:param name="navig.graphics" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, the navigational headers and footers in chunked
+HTML are presented in an alternate style that uses graphical icons for
+Next, Previous, Up, and Home. Default graphics are provided in the
+distribution. If zero, text is used instead of graphics.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="navig.graphics.extension">
+<refmeta>
+<refentrytitle>navig.graphics.extension</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>navig.graphics.extension</refname>
+<refpurpose>Extension for navigational graphics</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="navig.graphics.extension.frag">
+&lt;xsl:param name="navig.graphics.extension"&gt;.gif&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Sets the filename extension to use on navigational graphics used
+in the headers and footers of chunked HTML.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="navig.graphics.path">
+<refmeta>
+<refentrytitle>navig.graphics.path</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>navig.graphics.path</refname>
+<refpurpose>Path to navigational graphics</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="navig.graphics.path.frag">
+&lt;xsl:param name="navig.graphics.path"&gt;images/&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Sets the path, probably relative to the directory where the HTML
+files are created, to the navigational graphics used in the
+headers and footers of chunked HTML.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="navig.showtitles">
+<refmeta>
+<refentrytitle>navig.showtitles</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>navig.showtitles</refname>
+<refpurpose>Display titles in HTML headers and footers?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="navig.showtitles.frag">&lt;xsl:param name="navig.showtitles"&gt;1&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero,
+the headers and footers of chunked HTML
+display the titles of the next and previous chunks,
+along with the words 'Next' and 'Previous' (or the
+equivalent graphical icons if navig.graphics is true).
+If false (zero), then only the words 'Next' and 'Previous'
+(or the icons) are displayed.
+</para>
+
+</refsection>
+</refentry>
+
+</reference>
+<reference xml:id="profiling"><title>Profiling</title>
+<partintro xml:id="partintro">
+<para>The following parameters can be used for attribute-based
+profiling of your document. For more information about profiling, see
+<link xmlns:xlink="http://www.w3.org/1999/xlink" role="tcg" xlink:href="Profiling.html">Profiling (conditional text)</link>.</para>
+</partintro>
+<refentry version="5.0" xml:id="profile.arch">
+<refmeta>
+<refentrytitle>profile.arch</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>profile.arch</refname>
+<refpurpose>Target profile for <tag class="attribute">arch</tag>
+attribute</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="profile.arch.frag">
+&lt;xsl:param name="profile.arch"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+
+<refsection><info><title>Description</title></info>
+
+<para>The value of this parameter specifies profiles which should be
+included in the output. You can specify multiple profiles by
+separating them by semicolon. You can change separator character by
+<parameter>profile.separator</parameter>
+parameter.</para>
+
+<para>This parameter has effect only when you are using profiling
+stylesheets (<filename>profile-docbook.xsl</filename>,
+<filename>profile-chunk.xsl</filename>, &#8230;) instead of normal
+ones (<filename>docbook.xsl</filename>,
+<filename>chunk.xsl</filename>, &#8230;).</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="profile.audience">
+<refmeta>
+<refentrytitle>profile.audience</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>profile.audience</refname>
+<refpurpose>Target profile for <tag class="attribute">audience</tag>
+attribute</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="profile.audience.frag">
+&lt;xsl:param name="profile.audience"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Value of this parameter specifies profiles which should be
+included in the output. You can specify multiple profiles by
+separating them by semicolon. You can change separator character by
+<parameter>profile.separator</parameter>
+parameter.</para>
+
+<para>This parameter has effect only when you are using profiling
+stylesheets (<filename>profile-docbook.xsl</filename>,
+<filename>profile-chunk.xsl</filename>, &#8230;) instead of normal
+ones (<filename>docbook.xsl</filename>,
+<filename>chunk.xsl</filename>, &#8230;).</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="profile.condition">
+<refmeta>
+<refentrytitle>profile.condition</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>profile.condition</refname>
+<refpurpose>Target profile for <tag class="attribute">condition</tag>
+attribute</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="profile.condition.frag">
+&lt;xsl:param name="profile.condition"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The value of this parameter specifies profiles which should be
+included in the output. You can specify multiple profiles by
+separating them by semicolon. You can change separator character by
+<parameter>profile.separator</parameter>
+parameter.</para>
+
+<para>This parameter has effect only when you are using profiling
+stylesheets (<filename>profile-docbook.xsl</filename>,
+<filename>profile-chunk.xsl</filename>, &#8230;) instead of normal
+ones (<filename>docbook.xsl</filename>,
+<filename>chunk.xsl</filename>, &#8230;).</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="profile.conformance">
+<refmeta>
+<refentrytitle>profile.conformance</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>profile.conformance</refname>
+<refpurpose>Target profile for <tag class="attribute">conformance</tag>
+attribute</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="profile.conformance.frag">
+&lt;xsl:param name="profile.conformance"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The value of this parameter specifies profiles which should be
+included in the output. You can specify multiple profiles by
+separating them by semicolon. You can change separator character by
+<parameter>profile.separator</parameter>
+parameter.</para>
+
+<para>This parameter has effect only when you are using profiling
+stylesheets (<filename>profile-docbook.xsl</filename>,
+<filename>profile-chunk.xsl</filename>, &#8230;) instead of normal
+ones (<filename>docbook.xsl</filename>,
+<filename>chunk.xsl</filename>, &#8230;).</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="profile.lang">
+<refmeta>
+<refentrytitle>profile.lang</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>profile.lang</refname>
+<refpurpose>Target profile for <tag class="attribute">lang</tag>
+attribute</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="profile.lang.frag">
+&lt;xsl:param name="profile.lang"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The value of this parameter specifies profiles which should be
+included in the output. You can specify multiple profiles by
+separating them by semicolon. You can change separator character by
+<parameter>profile.separator</parameter>
+parameter.</para>
+
+<para>This parameter has effect only when you are using profiling
+stylesheets (<filename>profile-docbook.xsl</filename>,
+<filename>profile-chunk.xsl</filename>, &#8230;) instead of normal
+ones (<filename>docbook.xsl</filename>,
+<filename>chunk.xsl</filename>, &#8230;).</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="profile.os">
+<refmeta>
+<refentrytitle>profile.os</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>profile.os</refname>
+<refpurpose>Target profile for <tag class="attribute">os</tag>
+attribute</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="profile.os.frag">
+&lt;xsl:param name="profile.os"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The value of this parameter specifies profiles which should be
+included in the output. You can specify multiple profiles by
+separating them by semicolon. You can change separator character by
+<parameter>profile.separator</parameter>
+parameter.</para>
+
+<para>This parameter has effect only when you are using profiling
+stylesheets (<filename>profile-docbook.xsl</filename>,
+<filename>profile-chunk.xsl</filename>, &#8230;) instead of normal
+ones (<filename>docbook.xsl</filename>,
+<filename>chunk.xsl</filename>, &#8230;).</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="profile.revision">
+<refmeta>
+<refentrytitle>profile.revision</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>profile.revision</refname>
+<refpurpose>Target profile for <tag class="attribute">revision</tag>
+attribute</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="profile.revision.frag">
+&lt;xsl:param name="profile.revision"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The value of this parameter specifies profiles which should be
+included in the output. You can specify multiple profiles by
+separating them by semicolon. You can change separator character by
+<parameter>profile.separator</parameter>
+parameter.</para>
+
+<para>This parameter has effect only when you are using profiling
+stylesheets (<filename>profile-docbook.xsl</filename>,
+<filename>profile-chunk.xsl</filename>, &#8230;) instead of normal
+ones (<filename>docbook.xsl</filename>,
+<filename>chunk.xsl</filename>, &#8230;).</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="profile.revisionflag">
+<refmeta>
+<refentrytitle>profile.revisionflag</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>profile.revisionflag</refname>
+<refpurpose>Target profile for <tag class="attribute">revisionflag</tag>
+attribute</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="profile.revisionflag.frag">
+&lt;xsl:param name="profile.revisionflag"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The value of this parameter specifies profiles which should be
+included in the output. You can specify multiple profiles by
+separating them by semicolon. You can change separator character by
+<parameter>profile.separator</parameter>
+parameter.</para>
+
+<para>This parameter has effect only when you are using profiling
+stylesheets (<filename>profile-docbook.xsl</filename>,
+<filename>profile-chunk.xsl</filename>, &#8230;) instead of normal
+ones (<filename>docbook.xsl</filename>,
+<filename>chunk.xsl</filename>, &#8230;).</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="profile.role">
+<refmeta>
+<refentrytitle>profile.role</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>profile.role</refname>
+<refpurpose>Target profile for <tag class="attribute">role</tag>
+attribute</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="profile.role.frag">
+&lt;xsl:param name="profile.role"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The value of this parameter specifies profiles which should be
+included in the output. You can specify multiple profiles by
+separating them by semicolon. You can change separator character by
+<parameter>profile.separator</parameter>
+parameter.</para>
+
+<para>This parameter has effect only when you are using profiling
+stylesheets (<filename>profile-docbook.xsl</filename>,
+<filename>profile-chunk.xsl</filename>, &#8230;) instead of normal
+ones (<filename>docbook.xsl</filename>,
+<filename>chunk.xsl</filename>, &#8230;).</para>
+
+<warning>
+<para>Note that <tag class="attribute">role</tag> is often
+used for other purposes than profiling. For example it is commonly
+used to get emphasize in bold font:</para>
+
+<programlisting>&lt;emphasis role="bold"&gt;very important&lt;/emphasis&gt;</programlisting>
+
+<para>If you are using <tag class="attribute">role</tag> for
+these purposes do not forget to add values like <literal>bold</literal> to
+value of this parameter. If you forgot you will get document with
+small pieces missing which are very hard to track.</para>
+
+<para>For this reason it is not recommended to use <tag class="attribute">role</tag> attribute for profiling. You should
+rather use profiling specific attributes like <tag class="attribute">userlevel</tag>, <tag class="attribute">os</tag>, <tag class="attribute">arch</tag>, <tag class="attribute">condition</tag>, etc.</para>
+</warning>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="profile.security">
+<refmeta>
+<refentrytitle>profile.security</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>profile.security</refname>
+<refpurpose>Target profile for <tag class="attribute">security</tag>
+attribute</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="profile.security.frag">
+&lt;xsl:param name="profile.security"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The value of this parameter specifies profiles which should be
+included in the output. You can specify multiple profiles by
+separating them by semicolon. You can change separator character by
+<parameter>profile.separator</parameter>
+parameter.</para>
+
+<para>This parameter has effect only when you are using profiling
+stylesheets (<filename>profile-docbook.xsl</filename>,
+<filename>profile-chunk.xsl</filename>, &#8230;) instead of normal
+ones (<filename>docbook.xsl</filename>,
+<filename>chunk.xsl</filename>, &#8230;).</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="profile.status">
+<refmeta>
+<refentrytitle>profile.status</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>profile.status</refname>
+<refpurpose>Target profile for <tag class="attribute">status</tag>
+attribute</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="profile.status.frag">
+&lt;xsl:param name="profile.status"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The value of this parameter specifies profiles which should be
+included in the output. You can specify multiple profiles by
+separating them by semicolon. You can change separator character by
+<parameter>profile.separator</parameter>
+parameter.</para>
+
+<para>This parameter has effect only when you are using profiling
+stylesheets (<filename>profile-docbook.xsl</filename>,
+<filename>profile-chunk.xsl</filename>, &#8230;) instead of normal
+ones (<filename>docbook.xsl</filename>,
+<filename>chunk.xsl</filename>, &#8230;).</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="profile.userlevel">
+<refmeta>
+<refentrytitle>profile.userlevel</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>profile.userlevel</refname>
+<refpurpose>Target profile for <tag class="attribute">userlevel</tag>
+attribute</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="profile.userlevel.frag">
+&lt;xsl:param name="profile.userlevel"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The value of this parameter specifies profiles which should be
+included in the output. You can specify multiple profiles by
+separating them by semicolon. You can change separator character by
+<parameter>profile.separator</parameter>
+parameter.</para>
+
+<para>This parameter has effect only when you are using profiling
+stylesheets (<filename>profile-docbook.xsl</filename>,
+<filename>profile-chunk.xsl</filename>, &#8230;) instead of normal
+ones (<filename>docbook.xsl</filename>,
+<filename>chunk.xsl</filename>, &#8230;).</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="profile.vendor">
+<refmeta>
+<refentrytitle>profile.vendor</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>profile.vendor</refname>
+<refpurpose>Target profile for <tag class="attribute">vendor</tag>
+attribute</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="profile.vendor.frag">
+&lt;xsl:param name="profile.vendor"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The value of this parameter specifies profiles which should be
+included in the output. You can specify multiple profiles by
+separating them by semicolon. You can change separator character by
+<parameter>profile.separator</parameter>
+parameter.</para>
+
+<para>This parameter has effect only when you are using profiling
+stylesheets (<filename>profile-docbook.xsl</filename>,
+<filename>profile-chunk.xsl</filename>, &#8230;) instead of normal
+ones (<filename>docbook.xsl</filename>,
+<filename>chunk.xsl</filename>, &#8230;).</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="profile.wordsize">
+<refmeta>
+<refentrytitle>profile.wordsize</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>profile.wordsize</refname>
+<refpurpose>Target profile for <tag class="attribute">wordsize</tag>
+attribute</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="profile.wordsize.frag">
+&lt;xsl:param name="profile.wordsize"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The value of this parameter specifies profiles which should be
+included in the output. You can specify multiple profiles by
+separating them by semicolon. You can change separator character by
+<parameter>profile.separator</parameter>
+parameter.</para>
+
+<para>This parameter has effect only when you are using profiling
+stylesheets (<filename>profile-docbook.xsl</filename>,
+<filename>profile-chunk.xsl</filename>, &#8230;) instead of normal
+ones (<filename>docbook.xsl</filename>,
+<filename>chunk.xsl</filename>, &#8230;).</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="profile.attribute">
+<refmeta>
+<refentrytitle>profile.attribute</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>profile.attribute</refname>
+<refpurpose>Name of user-specified profiling attribute</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="profile.attribute.frag">
+&lt;xsl:param name="profile.attribute"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>This parameter is used in conjuction with
+<parameter>profile.value</parameter>.</para>
+
+<para>This parameter has effect only when you are using profiling
+stylesheets (<filename>profile-docbook.xsl</filename>,
+<filename>profile-chunk.xsl</filename>, &#8230;) instead of normal
+ones (<filename>docbook.xsl</filename>,
+<filename>chunk.xsl</filename>, &#8230;).</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="profile.value">
+<refmeta>
+<refentrytitle>profile.value</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>profile.value</refname>
+<refpurpose>Target profile for user-specified attribute</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="profile.value.frag">
+&lt;xsl:param name="profile.value"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>When you are using this parameter you must also specify name of
+profiling attribute with parameter
+<parameter>profile.attribute</parameter>.</para>
+
+<para>The value of this parameter specifies profiles which should be
+included in the output. You can specify multiple profiles by
+separating them by semicolon. You can change separator character by
+<parameter>profile.separator</parameter>
+parameter.</para>
+
+<para>This parameter has effect only when you are using profiling
+stylesheets (<filename>profile-docbook.xsl</filename>,
+<filename>profile-chunk.xsl</filename>, &#8230;) instead of normal
+ones (<filename>docbook.xsl</filename>,
+<filename>chunk.xsl</filename>, &#8230;).</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="profile.separator">
+<refmeta>
+<refentrytitle>profile.separator</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>profile.separator</refname>
+<refpurpose>Separator character for compound profile values</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="profile.separator.frag">
+&lt;xsl:param name="profile.separator"&gt;;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Separator character used for compound profile values. See <parameter>profile.arch</parameter></para>
+
+</refsection>
+</refentry>
+
+</reference>
+<reference xml:id="htmlhelp"><title>HTML Help</title>
+<refentry version="5.0" xml:id="htmlhelp.encoding">
+<refmeta>
+<refentrytitle>htmlhelp.encoding</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>htmlhelp.encoding</refname>
+<refpurpose>Character encoding to use in files for HTML Help compiler.</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="htmlhelp.encoding.frag">
+&lt;xsl:param name="htmlhelp.encoding"&gt;iso-8859-1&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>HTML Help Compiler is not UTF-8 aware, so you should always use an
+appropriate single-byte encoding here. Use one from <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="ftp://ftp.isi.edu/in-notes/iana/assignments/character-sets">iana</link>, the registered charset values.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="htmlhelp.autolabel">
+<refmeta>
+<refentrytitle>htmlhelp.autolabel</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>htmlhelp.autolabel</refname>
+<refpurpose>Should tree-like ToC use autonumbering feature?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="htmlhelp.autolabel.frag">
+&lt;xsl:param name="htmlhelp.autolabel" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Set this to non-zero to include chapter and section numbers into ToC
+in the left panel.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="htmlhelp.chm">
+<refmeta>
+<refentrytitle>htmlhelp.chm</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>htmlhelp.chm</refname>
+<refpurpose>Filename of output HTML Help file.</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="htmlhelp.chm.frag">
+&lt;xsl:param name="htmlhelp.chm"&gt;htmlhelp.chm&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Set the name of resulting CHM file</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="htmlhelp.default.topic">
+<refmeta>
+<refentrytitle>htmlhelp.default.topic</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>htmlhelp.default.topic</refname>
+<refpurpose>Name of file with default topic</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="htmlhelp.default.topic.frag">
+&lt;xsl:param name="htmlhelp.default.topic"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Normally first chunk of document is displayed when you open HTML
+Help file. If you want to display another topic, simply set its
+filename by this parameter.</para>
+
+<para>This is useful especially if you don't generate ToC in front of
+your document and you also hide root element in ToC. E.g.:</para>
+
+<programlisting>&lt;xsl:param name="generate.book.toc" select="0"/&gt;
+&lt;xsl:param name="htmlhelp.hhc.show.root" select="0"/&gt;
+&lt;xsl:param name="htmlhelp.default.topic"&gt;pr01.html&lt;/xsl:param&gt;
+</programlisting>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="htmlhelp.display.progress">
+<refmeta>
+<refentrytitle>htmlhelp.display.progress</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>htmlhelp.display.progress</refname>
+<refpurpose>Display compile progress?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="htmlhelp.display.progress.frag">
+&lt;xsl:param name="htmlhelp.display.progress" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Set to non-zero to to display compile progress
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="htmlhelp.hhp">
+<refmeta>
+<refentrytitle>htmlhelp.hhp</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>htmlhelp.hhp</refname>
+<refpurpose>Filename of project file.</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="htmlhelp.hhp.frag">
+&lt;xsl:param name="htmlhelp.hhp"&gt;htmlhelp.hhp&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Change this parameter if you want different name of project
+file than htmlhelp.hhp.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="htmlhelp.hhc">
+<refmeta>
+<refentrytitle>htmlhelp.hhc</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>htmlhelp.hhc</refname>
+<refpurpose>Filename of TOC file.</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="htmlhelp.hhc.frag">
+&lt;xsl:param name="htmlhelp.hhc"&gt;toc.hhc&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Set the name of the TOC file. The default is <filename>toc.hhc</filename>.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="htmlhelp.hhk">
+<refmeta>
+<refentrytitle>htmlhelp.hhk</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>htmlhelp.hhk</refname>
+<refpurpose>Filename of index file.</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="htmlhelp.hhk.frag">
+&lt;xsl:param name="htmlhelp.hhk"&gt;index.hhk&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>set the name of the index file. The default is <filename>index.hhk</filename>.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="htmlhelp.hhp.tail">
+<refmeta>
+<refentrytitle>htmlhelp.hhp.tail</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>htmlhelp.hhp.tail</refname>
+<refpurpose>Additional content for project file.</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="htmlhelp.hhp.tail.frag">
+&lt;xsl:param name="htmlhelp.hhp.tail"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If you want to include some additional parameters into project file,
+store appropriate part of project file into this parameter.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="htmlhelp.hhp.window">
+<refmeta>
+<refentrytitle>htmlhelp.hhp.window</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>htmlhelp.hhp.window</refname>
+<refpurpose>Name of default window.</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="htmlhelp.hhp.window.frag">
+&lt;xsl:param name="htmlhelp.hhp.window"&gt;Main&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Name of default window. If empty no [WINDOWS] section will be
+added to project file.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="htmlhelp.hhp.windows">
+<refmeta>
+<refentrytitle>htmlhelp.hhp.windows</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>htmlhelp.hhp.windows</refname>
+<refpurpose>Definition of additional windows</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="htmlhelp.hhp.windows.frag">
+&lt;xsl:param name="htmlhelp.hhp.windows"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Content of this parameter is placed at the end of [WINDOWS]
+section of project file. You can use it for defining your own
+addtional windows.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="htmlhelp.enhanced.decompilation">
+<refmeta>
+<refentrytitle>htmlhelp.enhanced.decompilation</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>htmlhelp.enhanced.decompilation</refname>
+<refpurpose>Allow enhanced decompilation of CHM?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="htmlhelp.enhanced.decompilation.frag">
+&lt;xsl:param name="htmlhelp.enhanced.decompilation" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>When non-zero this parameter enables enhanced decompilation of CHM.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="htmlhelp.enumerate.images">
+<refmeta>
+<refentrytitle>htmlhelp.enumerate.images</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>htmlhelp.enumerate.images</refname>
+<refpurpose>Should the paths to all used images be added to the project file?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="htmlhelp.enumerate.images.frag">
+&lt;xsl:param name="htmlhelp.enumerate.images" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Set to non-zero if you insert images into your documents as
+external binary entities or if you are using absolute image paths.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="htmlhelp.force.map.and.alias">
+<refmeta>
+<refentrytitle>htmlhelp.force.map.and.alias</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>htmlhelp.force.map.and.alias</refname>
+<refpurpose>Should [MAP] and [ALIAS] sections be added to the project file unconditionally?</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+<programlisting xml:id="htmlhelp.force.map.and.alias.frag">
+&lt;xsl:param name="htmlhelp.force.map.and.alias" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+ <para>Set to non-zero if you have your own
+ <literal>alias.h</literal> and <literal>context.h</literal>
+ files and you want to include references to them in the project
+ file.</para>
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="htmlhelp.map.file">
+<refmeta>
+<refentrytitle>htmlhelp.map.file</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>htmlhelp.map.file</refname>
+<refpurpose>Filename of map file.</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+<programlisting xml:id="htmlhelp.map.file.frag">
+&lt;xsl:param name="htmlhelp.map.file"&gt;context.h&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+<para>Set the name of map file. The default is
+ <filename>context.h</filename>. (used for context-sensitive
+ help).</para>
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="htmlhelp.alias.file">
+<refmeta>
+<refentrytitle>htmlhelp.alias.file</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>htmlhelp.alias.file</refname>
+<refpurpose>Filename of alias file.</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="htmlhelp.alias.file.frag">
+&lt;xsl:param name="htmlhelp.alias.file"&gt;alias.h&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies the filename of the alias file (used for context-sensitive help).</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="htmlhelp.hhc.section.depth">
+<refmeta>
+<refentrytitle>htmlhelp.hhc.section.depth</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">integer</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>htmlhelp.hhc.section.depth</refname>
+<refpurpose>Depth of TOC for sections in a left pane.</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="htmlhelp.hhc.section.depth.frag">
+&lt;xsl:param name="htmlhelp.hhc.section.depth"&gt;5&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Set the section depth in the left pane of HTML Help viewer. </para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="htmlhelp.hhc.show.root">
+<refmeta>
+<refentrytitle>htmlhelp.hhc.show.root</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>htmlhelp.hhc.show.root</refname>
+<refpurpose>Should there be an entry for the root element in the ToC?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="htmlhelp.hhc.show.root.frag">
+&lt;xsl:param name="htmlhelp.hhc.show.root" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If set to zero, there will be no entry for the root element in the
+ToC. This is useful when you want to provide the user with an expanded
+ToC as a default.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="htmlhelp.hhc.folders.instead.books">
+<refmeta>
+<refentrytitle>htmlhelp.hhc.folders.instead.books</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>htmlhelp.hhc.folders.instead.books</refname>
+<refpurpose>Use folder icons in ToC (instead of book icons)?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="htmlhelp.hhc.folders.instead.books.frag">
+&lt;xsl:param name="htmlhelp.hhc.folders.instead.books" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Set to non-zero for folder-like icons or zero for book-like icons in the ToC.
+If you want to use folder-like icons, you must switch off the binary ToC using
+<parameter>htmlhelp.hhc.binary</parameter>.
+
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="htmlhelp.hhc.binary">
+<refmeta>
+<refentrytitle>htmlhelp.hhc.binary</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>htmlhelp.hhc.binary</refname>
+<refpurpose>Generate binary ToC?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="htmlhelp.hhc.binary.frag">
+&lt;xsl:param name="htmlhelp.hhc.binary" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Set to non-zero to generate a binary TOC. You must create a binary TOC
+if you want to add Prev/Next buttons to toolbar (which is default
+behaviour). Files with binary TOC can't be merged.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="htmlhelp.hhc.width">
+<refmeta>
+<refentrytitle>htmlhelp.hhc.width</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">integer</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>htmlhelp.hhc.width</refname>
+<refpurpose>Width of navigation pane</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="htmlhelp.hhc.width.frag">
+&lt;xsl:param name="htmlhelp.hhc.width"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>This parameter specifies the width of the navigation pane (containing TOC and
+other navigation tabs) in pixels.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="htmlhelp.title">
+<refmeta>
+<refentrytitle>htmlhelp.title</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>htmlhelp.title</refname>
+<refpurpose>Title of HTML Help</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="htmlhelp.title.frag">
+&lt;xsl:param name="htmlhelp.title"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Content of this parameter will be used as a title for generated
+HTML Help. If empty, title will be automatically taken from document.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="htmlhelp.show.menu">
+<refmeta>
+<refentrytitle>htmlhelp.show.menu</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>htmlhelp.show.menu</refname>
+<refpurpose>Should the menu bar be shown?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="htmlhelp.show.menu.frag">
+&lt;xsl:param name="htmlhelp.show.menu" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Set to non-zero to have an application menu bar in your HTML Help window.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="htmlhelp.show.toolbar.text">
+<refmeta>
+<refentrytitle>htmlhelp.show.toolbar.text</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>htmlhelp.show.toolbar.text</refname>
+<refpurpose>Show text under toolbar buttons?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="htmlhelp.show.toolbar.text.frag">
+&lt;xsl:param name="htmlhelp.show.toolbar.text" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Set to non-zero to display texts under toolbar buttons, zero to switch
+off displays.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="htmlhelp.show.advanced.search">
+<refmeta>
+<refentrytitle>htmlhelp.show.advanced.search</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>htmlhelp.show.advanced.search</refname>
+<refpurpose>Should advanced search features be available?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="htmlhelp.show.advanced.search.frag">
+&lt;xsl:param name="htmlhelp.show.advanced.search" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If you want advanced search features in your help, turn this
+parameter to 1.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="htmlhelp.show.favorities">
+<refmeta>
+<refentrytitle>htmlhelp.show.favorities</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>htmlhelp.show.favorities</refname>
+<refpurpose>Should the Favorites tab be shown?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="htmlhelp.show.favorities.frag">
+&lt;xsl:param name="htmlhelp.show.favorities" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Set to non-zero to include a Favorites tab in the navigation pane
+of the help window.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="htmlhelp.button.hideshow">
+<refmeta>
+<refentrytitle>htmlhelp.button.hideshow</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>htmlhelp.button.hideshow</refname>
+<refpurpose>Should the Hide/Show button be shown?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="htmlhelp.button.hideshow.frag">
+&lt;xsl:param name="htmlhelp.button.hideshow" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Set to non-zero to include the Hide/Show button shown on toolbar</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="htmlhelp.button.back">
+<refmeta>
+<refentrytitle>htmlhelp.button.back</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>htmlhelp.button.back</refname>
+<refpurpose>Should the Back button be shown?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="htmlhelp.button.back.frag">
+&lt;xsl:param name="htmlhelp.button.back" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Set to non-zero to include the Hide/Show button shown on toolbar</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="htmlhelp.button.forward">
+<refmeta>
+<refentrytitle>htmlhelp.button.forward</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>htmlhelp.button.forward</refname>
+<refpurpose>Should the Forward button be shown?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="htmlhelp.button.forward.frag">
+&lt;xsl:param name="htmlhelp.button.forward" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Set to non-zero to include the Forward button on the toolbar.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="htmlhelp.button.stop">
+<refmeta>
+<refentrytitle>htmlhelp.button.stop</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>htmlhelp.button.stop</refname>
+<refpurpose>Should the Stop button be shown?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="htmlhelp.button.stop.frag">
+&lt;xsl:param name="htmlhelp.button.stop" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If you want Stop button shown on toolbar, turn this
+parameter to 1.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="htmlhelp.button.refresh">
+<refmeta>
+<refentrytitle>htmlhelp.button.refresh</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>htmlhelp.button.refresh</refname>
+<refpurpose>Should the Refresh button be shown?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="htmlhelp.button.refresh.frag">
+&lt;xsl:param name="htmlhelp.button.refresh" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Set to non-zero to include the Stop button on the toolbar.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="htmlhelp.button.home">
+<refmeta>
+<refentrytitle>htmlhelp.button.home</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>htmlhelp.button.home</refname>
+<refpurpose>Should the Home button be shown?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="htmlhelp.button.home.frag">
+&lt;xsl:param name="htmlhelp.button.home" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Set to non-zero to include the Home button on the toolbar.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="htmlhelp.button.home.url">
+<refmeta>
+<refentrytitle>htmlhelp.button.home.url</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>htmlhelp.button.home.url</refname>
+<refpurpose>URL address of page accessible by Home button</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="htmlhelp.button.home.url.frag">
+&lt;xsl:param name="htmlhelp.button.home.url"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>URL address of page accessible by Home button.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="htmlhelp.button.options">
+<refmeta>
+<refentrytitle>htmlhelp.button.options</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>htmlhelp.button.options</refname>
+<refpurpose>Should the Options button be shown?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="htmlhelp.button.options.frag">
+&lt;xsl:param name="htmlhelp.button.options" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If you want Options button shown on toolbar, turn this
+parameter to 1.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="htmlhelp.button.print">
+<refmeta>
+<refentrytitle>htmlhelp.button.print</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>htmlhelp.button.print</refname>
+<refpurpose>Should the Print button be shown?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="htmlhelp.button.print.frag">
+&lt;xsl:param name="htmlhelp.button.print" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Set to non-zero to include the Print button on the toolbar.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="htmlhelp.button.locate">
+<refmeta>
+<refentrytitle>htmlhelp.button.locate</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>htmlhelp.button.locate</refname>
+<refpurpose>Should the Locate button be shown?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="htmlhelp.button.locate.frag">
+&lt;xsl:param name="htmlhelp.button.locate" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If you want Locate button shown on toolbar, turn this
+parameter to 1.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="htmlhelp.button.jump1">
+<refmeta>
+<refentrytitle>htmlhelp.button.jump1</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>htmlhelp.button.jump1</refname>
+<refpurpose>Should the Jump1 button be shown?</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+<programlisting xml:id="htmlhelp.button.jump1.frag">
+&lt;xsl:param name="htmlhelp.button.jump1" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+ <para>Set to non-zero to include the <literal>Jump1</literal> button on the toolbar.</para>
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="htmlhelp.button.jump1.url">
+<refmeta>
+<refentrytitle>htmlhelp.button.jump1.url</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>htmlhelp.button.jump1.url</refname>
+<refpurpose>URL address of page accessible by Jump1 button</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="htmlhelp.button.jump1.url.frag">
+&lt;xsl:param name="htmlhelp.button.jump1.url"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>URL address of page accessible by Jump1 button.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="htmlhelp.button.jump1.title">
+<refmeta>
+<refentrytitle>htmlhelp.button.jump1.title</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>htmlhelp.button.jump1.title</refname>
+<refpurpose>Title of Jump1 button</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="htmlhelp.button.jump1.title.frag">
+&lt;xsl:param name="htmlhelp.button.jump1.title"&gt;User1&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Title of Jump1 button.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="htmlhelp.button.jump2">
+<refmeta>
+<refentrytitle>htmlhelp.button.jump2</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>htmlhelp.button.jump2</refname>
+<refpurpose>Should the Jump2 button be shown?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="htmlhelp.button.jump2.frag">
+&lt;xsl:param name="htmlhelp.button.jump2" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Set to non-zero to include the Jump2 button on the toolbar.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="htmlhelp.button.jump2.url">
+<refmeta>
+<refentrytitle>htmlhelp.button.jump2.url</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>htmlhelp.button.jump2.url</refname>
+<refpurpose>URL address of page accessible by Jump2 button</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="htmlhelp.button.jump2.url.frag">
+&lt;xsl:param name="htmlhelp.button.jump2.url"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>URL address of page accessible by Jump2 button.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="htmlhelp.button.jump2.title">
+<refmeta>
+<refentrytitle>htmlhelp.button.jump2.title</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>htmlhelp.button.jump2.title</refname>
+<refpurpose>Title of Jump2 button</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="htmlhelp.button.jump2.title.frag">
+&lt;xsl:param name="htmlhelp.button.jump2.title"&gt;User2&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Title of Jump2 button.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="htmlhelp.button.next">
+<refmeta>
+<refentrytitle>htmlhelp.button.next</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>htmlhelp.button.next</refname>
+<refpurpose>Should the Next button be shown?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="htmlhelp.button.next.frag">
+&lt;xsl:param name="htmlhelp.button.next" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Set to non-zero to include the Next button on the toolbar.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="htmlhelp.button.prev">
+<refmeta>
+<refentrytitle>htmlhelp.button.prev</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>htmlhelp.button.prev</refname>
+<refpurpose>Should the Prev button be shown?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="htmlhelp.button.prev.frag">
+&lt;xsl:param name="htmlhelp.button.prev" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Set to non-zero to include the Prev button on the toolbar.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="htmlhelp.button.zoom">
+<refmeta>
+<refentrytitle>htmlhelp.button.zoom</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>htmlhelp.button.zoom</refname>
+<refpurpose>Should the Zoom button be shown?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="htmlhelp.button.zoom.frag">
+&lt;xsl:param name="htmlhelp.button.zoom" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Set to non-zero to include the Zoom button on the toolbar.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="htmlhelp.remember.window.position">
+<refmeta>
+<refentrytitle>htmlhelp.remember.window.position</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>htmlhelp.remember.window.position</refname>
+<refpurpose>Remember help window position?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="htmlhelp.remember.window.position.frag">
+&lt;xsl:param name="htmlhelp.remember.window.position" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Set to non-zero to remember help window position between starts.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="htmlhelp.window.geometry">
+<refmeta>
+<refentrytitle>htmlhelp.window.geometry</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>htmlhelp.window.geometry</refname>
+<refpurpose>Set initial geometry of help window</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="htmlhelp.window.geometry.frag">
+&lt;xsl:param name="htmlhelp.window.geometry"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>This parameter specifies initial position of help
+window. E.g.</para>
+
+<programlisting>&lt;xsl:param name="htmlhelp.window.geometry"&gt;[160,64,992,704]&lt;/xsl:param&gt;</programlisting>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="htmlhelp.use.hhk">
+<refmeta>
+<refentrytitle>htmlhelp.use.hhk</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>htmlhelp.use.hhk</refname>
+<refpurpose>Should the index be built using the HHK file?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="htmlhelp.use.hhk.frag">
+&lt;xsl:param name="htmlhelp.use.hhk" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, the index is created using the HHK file (instead of using <tag role="html">object</tag>
+elements in the HTML files). For more information, see <link xmlns:xlink="http://www.w3.org/1999/xlink" role="tcg" xlink:href="HtmlHelp.html#HHGenIndex">Generating an index</link>.</para>
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="htmlhelp.only">
+<refmeta>
+<refentrytitle>htmlhelp.only</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>htmlhelp.only</refname>
+<refpurpose>Should only project files be generated?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="htmlhelp.only.frag">
+&lt;xsl:param name="htmlhelp.only" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+
+<para>Set to non-zero if you want to play with various HTML Help parameters
+and you don't need to regenerate all HTML files. This setting will not
+process whole document, only project files (hhp, hhc, hhk,...) will be
+generated.</para>
+
+
+</refsection>
+</refentry>
+
+</reference>
+<reference xml:id="eclipse_help"><title>Eclipse Help Platform</title>
+<refentry version="5.0" xml:id="eclipse.autolabel">
+<refmeta>
+<refentrytitle>eclipse.autolabel</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>eclipse.autolabel</refname>
+<refpurpose>Should tree-like ToC use autonumbering feature?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="eclipse.autolabel.frag">
+&lt;xsl:param name="eclipse.autolabel" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If you want to include chapter and section numbers into ToC in
+the left panel, set this parameter to 1.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="eclipse.plugin.name">
+<refmeta>
+<refentrytitle>eclipse.plugin.name</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>eclipse.plugin.name</refname>
+<refpurpose>Eclipse Help plugin name</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="eclipse.plugin.name.frag">
+&lt;xsl:param name="eclipse.plugin.name"&gt;DocBook Online Help Sample&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Eclipse Help plugin name.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="eclipse.plugin.id">
+<refmeta>
+<refentrytitle>eclipse.plugin.id</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>eclipse.plugin.id</refname>
+<refpurpose>Eclipse Help plugin id</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="eclipse.plugin.id.frag">
+&lt;xsl:param name="eclipse.plugin.id"&gt;com.example.help&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Eclipse Help plugin id. You should change this id to something
+unique for each help.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="eclipse.plugin.provider">
+<refmeta>
+<refentrytitle>eclipse.plugin.provider</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>eclipse.plugin.provider</refname>
+<refpurpose>Eclipse Help plugin provider name</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="eclipse.plugin.provider.frag">
+&lt;xsl:param name="eclipse.plugin.provider"&gt;Example provider&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Eclipse Help plugin provider name.</para>
+
+</refsection>
+</refentry>
+
+</reference>
+<reference xml:id="javahelp"><title>JavaHelp</title>
+<refentry version="5.0" xml:id="javahelp.encoding">
+<refmeta>
+<refentrytitle>javahelp.encoding</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>javahelp.encoding</refname>
+<refpurpose>Character encoding to use in control files for JavaHelp.</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="javahelp.encoding.frag">
+&lt;xsl:param name="javahelp.encoding"&gt;iso-8859-1&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>JavaHelp crashes on some characters when written as character
+references. In that case you can use this parameter to select an appropriate encoding.</para>
+
+</refsection>
+</refentry>
+
+
+
+
+</reference>
+<reference xml:id="l10n"><title>Localization</title>
+<refentry version="5.0" xml:id="l10n.gentext.language">
+<refmeta>
+<refentrytitle>l10n.gentext.language</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>l10n.gentext.language</refname>
+<refpurpose>Sets the gentext language</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="l10n.gentext.language.frag">
+&lt;xsl:param name="l10n.gentext.language"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If this parameter is set to any value other than the empty string, its
+value will be used as the value for the language when generating text. Setting
+<parameter>l10n.gentext.language</parameter> overrides any settings within the
+document being formatted.</para>
+
+<para>It's much more likely that you might want to set the
+<parameter>l10n.gentext.default.language</parameter> parameter.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="l10n.gentext.default.language">
+ <refmeta>
+ <refentrytitle>l10n.gentext.default.language</refentrytitle>
+ <refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+ </refmeta>
+ <refnamediv>
+ <refname>l10n.gentext.default.language</refname>
+ <refpurpose>Sets the default language for generated text</refpurpose>
+ </refnamediv>
+
+ <refsynopsisdiv>
+<programlisting xml:id="l10n.gentext.default.language.frag">
+&lt;xsl:param name="l10n.gentext.default.language"&gt;en&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The value of the <parameter>l10n.gentext.default.language</parameter>
+parameter is used as the language for generated text if no setting is provided
+in the source document.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="l10n.gentext.use.xref.language">
+<refmeta>
+<refentrytitle>l10n.gentext.use.xref.language</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>l10n.gentext.use.xref.language</refname>
+<refpurpose>Use the language of target when generating cross-reference text?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="l10n.gentext.use.xref.language.frag">
+&lt;xsl:param name="l10n.gentext.use.xref.language" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, the language of the target will be used when
+generating cross reference text. Usually, the <quote>current</quote>
+language is used when generating text (that is, the language of the
+element that contains the cross-reference element). But setting this parameter
+allows the language of the element <emphasis>pointed to</emphasis> to control
+the generated text.</para>
+
+<para>Consider the following example:</para>
+
+<informalexample>
+<programlisting>&lt;para lang="en"&gt;See also &lt;xref linkend="chap3"/&gt;.&lt;/para&gt;
+</programlisting>
+</informalexample>
+
+<para>Suppose that Chapter 3 happens to be written in German.
+If <parameter>l10n.gentext.use.xref.language</parameter> is non-zero, the
+resulting text will be something like this:</para>
+
+<blockquote>
+<para>See also Kapital 3.</para>
+</blockquote>
+
+<para>Where the more traditional rendering would be:</para>
+
+<blockquote>
+<para>See also Chapter 3.</para>
+</blockquote>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="l10n.lang.value.rfc.compliant">
+<refmeta>
+<refentrytitle>l10n.lang.value.rfc.compliant</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>l10n.lang.value.rfc.compliant</refname>
+<refpurpose>Make value of lang attribute RFC compliant?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="l10n.lang.value.rfc.compliant.frag">
+&lt;xsl:param name="l10n.lang.value.rfc.compliant" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, ensure that the values for all <tag class="attribute">lang</tag> attributes in HTML output are RFC
+compliant<footnote><para>Section 8.1.1, <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.w3.org/TR/REC-html40/struct/dirlang.html#h-8.1.1">Language Codes</link>, in the HTML 4.0 Recommendation states that:
+
+<blockquote><para>[RFC1766] defines and explains the language codes
+that must be used in HTML documents.</para>
+<para>Briefly, language codes consist of a primary code and a possibly
+empty series of subcodes:
+
+<literallayout class="monospaced">language-code = primary-code ( "-" subcode )*</literallayout>
+</para>
+<para>And in RFC 1766, <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.ietf.org/rfc/rfc1766.txt">Tags for the Identification
+of Languages</link>, the EBNF for "language tag" is given as:
+
+<literallayout class="monospaced">Language-Tag = Primary-tag *( "-" Subtag )
+Primary-tag = 1*8ALPHA
+Subtag = 1*8ALPHA</literallayout>
+</para>
+</blockquote>
+</para></footnote>.
+
+by taking any underscore characters in any <tag class="attribute">lang</tag> values found in source documents, and
+replacing them with hyphen characters in output HTML files. For
+example, <literal>zh_CN</literal> in a source document becomes
+<literal>zh-CN</literal> in the HTML output form that source.
+
+<note>
+<para>This parameter does not cause any case change in <tag class="attribute">lang</tag> values, because RFC 1766
+explicitly states that all "language tags" (as it calls them) "are
+to be treated as case insensitive".</para>
+</note>
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="writing.mode">
+<refmeta>
+<refentrytitle>writing.mode</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>writing.mode</refname>
+<refpurpose>Direction of text flow based on locale</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="writing.mode.frag">
+&lt;xsl:param name="writing.mode"&gt;
+ &lt;xsl:call-template name="gentext"&gt;
+ &lt;xsl:with-param name="key"&gt;writing-mode&lt;/xsl:with-param&gt;
+ &lt;xsl:with-param name="lang"&gt;
+ &lt;xsl:call-template name="l10n.language"&gt;
+ &lt;xsl:with-param name="target" select="/*[1]"&gt;&lt;/xsl:with-param&gt;
+ &lt;/xsl:call-template&gt;
+ &lt;/xsl:with-param&gt;
+ &lt;/xsl:call-template&gt;
+&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Sets direction of text flow and text alignment based on locale.
+The value is normally taken from the gentext file for the
+lang attribute of the document's root element, using the
+key name 'writing-mode' to look it up in the gentext file.
+But the param can also be
+set on the command line to override that gentext value.
+</para>
+<para>Accepted values are:
+<variablelist>
+ <varlistentry>
+ <term>lr-tb</term>
+ <listitem>
+ <para>Left-to-right text flow in each line, lines stack top to bottom.</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>rl-tb</term>
+ <listitem>
+ <para>Right-to-left text flow in each line, lines stack top to bottom.</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>tb-rl</term>
+ <listitem>
+ <para>Top-to-bottom text flow in each vertical line, lines stack right to left.
+ Supported by only a few XSL-FO processors. Not supported in HTML output.</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>lr</term>
+ <listitem>
+ <para>Shorthand for lr-tb.</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>rl</term>
+ <listitem>
+ <para>Shorthand for rl-tb.</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>tb</term>
+ <listitem>
+ <para>Shorthand for tb-rl.</para>
+ </listitem>
+ </varlistentry>
+</variablelist>
+</para>
+
+</refsection>
+</refentry>
+
+</reference>
+<appendix xml:id="stylesheet"><title>The Stylesheet</title>
+
+<para>The <filename>param.xsl</filename> stylesheet is just a wrapper
+around all these parameters.</para>
+
+<programlisting xml:id="top">
+
+&lt;!-- This file is generated from param.xweb --&gt;
+
+&lt;xsl:stylesheet exclude-result-prefixes="src" version="1.0"&gt;
+
+&lt;!-- ********************************************************************
+ $Id: param.xweb 8552 2009-12-07 17:45:26Z bobstayton $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** --&gt;
+
+&lt;src:fragref linkend="abstract.notitle.enabled.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="admon.graphics.extension.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="admon.graphics.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="admon.graphics.path.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="admon.style.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="admon.textlabel.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="annotate.toc.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="annotation.css.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="annotation.graphic.close.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="annotation.graphic.open.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="annotation.js.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="annotation.support.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="appendix.autolabel.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="author.othername.in.middle.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="autotoc.label.in.hyperlink.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="autotoc.label.separator.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="base.dir.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="biblioentry.item.separator.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="bibliography.collection.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="bibliography.numbered.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="bibliography.style.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="blurb.on.titlepage.enabled.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="bridgehead.in.toc.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="callout.defaultcolumn.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="callout.graphics.extension.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="callout.graphics.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="callout.graphics.number.limit.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="callout.graphics.path.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="callout.list.table.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="callout.unicode.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="callout.unicode.number.limit.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="callout.unicode.start.character.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="callouts.extension.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="chapter.autolabel.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="chunk.append.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="chunk.first.sections.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="chunk.quietly.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="chunk.section.depth.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="chunk.separate.lots.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="chunk.toc.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="chunk.tocs.and.lots.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="chunk.tocs.and.lots.has.title.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="citerefentry.link.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="collect.xref.targets.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="component.label.includes.part.label.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="contrib.inline.enabled.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="css.decoration.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="current.docid.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="custom.css.source.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="default.float.class.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="default.image.width.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="default.table.frame.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="default.table.width.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="docbook.css.link.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="docbook.css.source.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="draft.mode.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="draft.watermark.image.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="ebnf.assignment.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="ebnf.statement.terminator.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="ebnf.table.bgcolor.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="ebnf.table.border.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="eclipse.autolabel.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="eclipse.plugin.id.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="eclipse.plugin.name.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="eclipse.plugin.provider.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="editedby.enabled.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="email.delimiters.enabled.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="emphasis.propagates.style.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="entry.propagates.style.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="exsl.node.set.available.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="firstterm.only.link.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="footer.rule.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="footnote.number.format.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="footnote.number.symbols.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="formal.procedures.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="formal.title.placement.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="funcsynopsis.decoration.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="funcsynopsis.style.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="function.parens.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="generate.css.header.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="generate.id.attributes.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="generate.index.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="generate.legalnotice.link.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="generate.manifest.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="generate.meta.abstract.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="generate.revhistory.link.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="generate.section.toc.level.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="generate.toc.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="glossary.collection.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="glossary.sort.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="glossentry.show.acronym.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="glossterm.auto.link.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="graphic.default.extension.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="graphicsize.extension.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="graphicsize.use.img.src.path.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="header.rule.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="highlight.default.language.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="highlight.source.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="highlight.xslthl.config.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="html.append.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="html.base.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="html.cellpadding.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="html.cellspacing.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="html.cleanup.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="html.ext.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="html.extra.head.links.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="html.head.legalnotice.link.multiple.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="html.head.legalnotice.link.types.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="html.longdesc.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="html.longdesc.link.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="html.stylesheet.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="html.stylesheet.type.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="htmlhelp.alias.file.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="htmlhelp.autolabel.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="htmlhelp.button.back.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="htmlhelp.button.forward.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="htmlhelp.button.hideshow.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="htmlhelp.button.home.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="htmlhelp.button.home.url.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="htmlhelp.button.jump1.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="htmlhelp.button.jump1.title.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="htmlhelp.button.jump1.url.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="htmlhelp.button.jump2.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="htmlhelp.button.jump2.title.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="htmlhelp.button.jump2.url.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="htmlhelp.button.locate.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="htmlhelp.button.next.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="htmlhelp.button.options.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="htmlhelp.button.prev.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="htmlhelp.button.print.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="htmlhelp.button.refresh.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="htmlhelp.button.stop.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="htmlhelp.button.zoom.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="htmlhelp.chm.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="htmlhelp.default.topic.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="htmlhelp.display.progress.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="htmlhelp.encoding.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="htmlhelp.enhanced.decompilation.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="htmlhelp.enumerate.images.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="htmlhelp.force.map.and.alias.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="htmlhelp.hhc.binary.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="htmlhelp.hhc.folders.instead.books.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="htmlhelp.hhc.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="htmlhelp.hhc.section.depth.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="htmlhelp.hhc.show.root.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="htmlhelp.hhc.width.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="htmlhelp.hhk.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="htmlhelp.hhp.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="htmlhelp.hhp.tail.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="htmlhelp.hhp.window.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="htmlhelp.hhp.windows.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="htmlhelp.map.file.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="htmlhelp.only.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="htmlhelp.remember.window.position.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="htmlhelp.show.advanced.search.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="htmlhelp.show.favorities.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="htmlhelp.show.menu.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="htmlhelp.show.toolbar.text.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="htmlhelp.title.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="htmlhelp.use.hhk.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="htmlhelp.window.geometry.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="id.warnings.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="ignore.image.scaling.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="img.src.path.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="index.links.to.section.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="index.method.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="index.number.separator.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="index.on.role.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="index.on.type.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="index.prefer.titleabbrev.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="index.range.separator.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="index.term.separator.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="inherit.keywords.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="insert.olink.page.number.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="insert.olink.pdf.frag.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="insert.xref.page.number.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="javahelp.encoding.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="keep.relative.image.uris.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="l10n.gentext.default.language.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="l10n.gentext.language.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="l10n.gentext.use.xref.language.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="l10n.lang.value.rfc.compliant.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="label.from.part.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="linenumbering.everyNth.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="linenumbering.extension.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="linenumbering.separator.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="linenumbering.width.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="link.mailto.url.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="make.clean.html.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="make.graphic.viewport.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="make.single.year.ranges.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="make.valid.html.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="make.year.ranges.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="manifest.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="manifest.in.base.dir.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="manual.toc.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="menuchoice.menu.separator.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="menuchoice.separator.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="navig.graphics.extension.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="navig.graphics.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="navig.graphics.path.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="navig.showtitles.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="nominal.image.depth.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="nominal.image.width.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="nominal.table.width.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="olink.base.uri.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="olink.debug.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="olink.doctitle.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="olink.fragid.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="olink.lang.fallback.sequence.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="olink.outline.ext.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="olink.properties.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="olink.pubid.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="olink.resolver.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="olink.sysid.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="othercredit.like.author.enabled.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="para.propagates.style.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="part.autolabel.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="phrase.propagates.style.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="pixels.per.inch.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="points.per.em.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="preface.autolabel.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="prefer.internal.olink.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="preferred.mediaobject.role.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="process.empty.source.toc.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="process.source.toc.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="profile.arch.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="profile.attribute.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="profile.audience.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="profile.condition.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="profile.conformance.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="profile.lang.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="profile.os.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="profile.revision.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="profile.revisionflag.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="profile.role.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="profile.security.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="profile.separator.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="profile.status.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="profile.userlevel.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="profile.value.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="profile.vendor.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="profile.wordsize.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="punct.honorific.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="qanda.defaultlabel.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="qanda.in.toc.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="qanda.inherit.numeration.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="qanda.nested.in.toc.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="qandadiv.autolabel.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="refclass.suppress.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="refentry.generate.name.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="refentry.generate.title.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="refentry.separator.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="refentry.xref.manvolnum.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="reference.autolabel.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="root.filename.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="rootid.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="runinhead.default.title.end.punct.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="runinhead.title.end.punct.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="section.autolabel.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="section.autolabel.max.depth.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="section.label.includes.component.label.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="segmentedlist.as.table.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="shade.verbatim.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="shade.verbatim.style.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="show.comments.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="show.revisionflag.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="simplesect.in.toc.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="spacing.paras.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="suppress.footer.navigation.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="suppress.header.navigation.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="suppress.navigation.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="table.borders.with.css.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="table.cell.border.color.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="table.cell.border.style.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="table.cell.border.thickness.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="table.footnote.number.format.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="table.footnote.number.symbols.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="table.frame.border.color.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="table.frame.border.style.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="table.frame.border.thickness.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="tablecolumns.extension.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="target.database.document.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="targets.filename.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="tex.math.delims.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="tex.math.file.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="tex.math.in.alt.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="textdata.default.encoding.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="textinsert.extension.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="toc.list.type.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="toc.max.depth.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="toc.section.depth.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="ulink.target.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="use.embed.for.svg.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="use.extensions.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="use.id.as.filename.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="use.local.olink.style.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="use.role.as.xrefstyle.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="use.role.for.mediaobject.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="use.svg.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="variablelist.as.table.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="variablelist.term.break.after.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="variablelist.term.separator.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="writing.mode.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="xref.label-page.separator.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="xref.label-title.separator.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="xref.title-page.separator.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="xref.with.number.and.title.frag"&gt;&lt;/src:fragref&gt;
+
+&lt;/xsl:stylesheet&gt;
+</programlisting>
+
+</appendix>
+</book>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/param.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/param.xsl
new file mode 100644
index 0000000..d5e6086
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/param.xsl
@@ -0,0 +1,434 @@
+<?xml version="1.0" encoding="ASCII"?>
+<!-- This file is generated from param.xweb -->
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
+
+<!-- ********************************************************************
+ $Id: param.xweb 8552 2009-12-07 17:45:26Z bobstayton $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<xsl:param name="abstract.notitle.enabled" select="0"/>
+<xsl:param name="admon.graphics.extension">.png</xsl:param>
+<xsl:param name="admon.graphics" select="0"/>
+<xsl:param name="admon.graphics.path">images/</xsl:param>
+<xsl:param name="admon.style">
+ <xsl:value-of select="concat('margin-', $direction.align.start, ': 0.5in; margin-', $direction.align.end, ': 0.5in;')"/>
+</xsl:param>
+<xsl:param name="admon.textlabel" select="1"/>
+<xsl:param name="annotate.toc" select="1"/>
+<xsl:param name="annotation.css">
+/* ======================================================================
+ Annotations
+*/
+
+div.annotation-list { visibility: hidden;
+ }
+
+div.annotation-nocss { position: absolute;
+ visibility: hidden;
+ }
+
+div.annotation-popup { position: absolute;
+ z-index: 4;
+ visibility: hidden;
+ padding: 0px;
+ margin: 2px;
+ border-style: solid;
+ border-width: 1px;
+ width: 200px;
+ background-color: white;
+ }
+
+div.annotation-title { padding: 1px;
+ font-weight: bold;
+ border-bottom-style: solid;
+ border-bottom-width: 1px;
+ color: white;
+ background-color: black;
+ }
+
+div.annotation-body { padding: 2px;
+ }
+
+div.annotation-body p { margin-top: 0px;
+ padding-top: 0px;
+ }
+
+div.annotation-close { position: absolute;
+ top: 2px;
+ right: 2px;
+ }
+</xsl:param>
+<xsl:param name="annotation.graphic.close">
+http://docbook.sourceforge.net/release/images/annot-close.png</xsl:param>
+<xsl:param name="annotation.graphic.open">http://docbook.sourceforge.net/release/images/annot-open.png</xsl:param>
+
+<xsl:param name="annotation.js">
+<xsl:text>http://docbook.sourceforge.net/release/script/AnchorPosition.js http://docbook.sourceforge.net/release/script/PopupWindow.js</xsl:text></xsl:param>
+
+<xsl:param name="annotation.support" select="0"/>
+<xsl:param name="appendix.autolabel">A</xsl:param>
+<xsl:param name="author.othername.in.middle" select="1"/>
+<xsl:param name="autotoc.label.in.hyperlink" select="1"/>
+<xsl:param name="autotoc.label.separator">. </xsl:param>
+<xsl:param name="base.dir"/>
+<xsl:param name="biblioentry.item.separator">. </xsl:param>
+<xsl:param name="bibliography.collection">http://docbook.sourceforge.net/release/bibliography/bibliography.xml</xsl:param>
+
+<xsl:param name="bibliography.numbered" select="0"/>
+<xsl:param name="bibliography.style">normal</xsl:param>
+<xsl:param name="blurb.on.titlepage.enabled" select="0"/>
+<xsl:param name="bridgehead.in.toc" select="0"/>
+<xsl:param name="callout.defaultcolumn">60</xsl:param>
+<xsl:param name="callout.graphics.extension">.png</xsl:param>
+
+<xsl:param name="callout.graphics" select="1"/>
+<xsl:param name="callout.graphics.number.limit">15</xsl:param>
+
+<xsl:param name="callout.graphics.path">images/callouts/</xsl:param>
+<xsl:param name="callout.list.table" select="1"/>
+<xsl:param name="callout.unicode" select="0"/>
+<xsl:param name="callout.unicode.number.limit">10</xsl:param>
+<xsl:param name="callout.unicode.start.character">10102</xsl:param>
+<xsl:param name="callouts.extension" select="1"/>
+<xsl:param name="chapter.autolabel" select="1"/>
+<xsl:param name="chunk.append"/>
+<xsl:param name="chunk.first.sections" select="0"/>
+<xsl:param name="chunk.quietly" select="0"/>
+<xsl:param name="chunk.section.depth" select="1"/>
+<xsl:param name="chunk.separate.lots" select="0"/>
+<xsl:param name="chunk.toc"/>
+<xsl:param name="chunk.tocs.and.lots" select="0"/>
+<xsl:param name="chunk.tocs.and.lots.has.title" select="1"/>
+<xsl:param name="citerefentry.link" select="0"/>
+<xsl:param name="collect.xref.targets">no</xsl:param>
+<xsl:param name="component.label.includes.part.label" select="0"/>
+<xsl:param name="contrib.inline.enabled">1</xsl:param>
+<xsl:param name="css.decoration" select="1"/>
+<xsl:param name="current.docid"/>
+<xsl:param name="custom.css.source"/>
+<xsl:param name="default.float.class">
+ <xsl:choose>
+ <xsl:when test="contains($stylesheet.result.type,'html')">left</xsl:when>
+ <xsl:otherwise>before</xsl:otherwise>
+ </xsl:choose>
+</xsl:param>
+<xsl:param name="default.image.width"/>
+<xsl:param name="default.table.frame">all</xsl:param>
+<xsl:param name="default.table.width"/>
+<xsl:param name="docbook.css.link" select="1"/>
+<xsl:param name="docbook.css.source">docbook.css.xml</xsl:param>
+<xsl:param name="draft.mode">no</xsl:param>
+<xsl:param name="draft.watermark.image">images/draft.png</xsl:param>
+<xsl:param name="ebnf.assignment">
+<code>::=</code>
+</xsl:param>
+
+<xsl:param name="ebnf.statement.terminator"/>
+
+<xsl:param name="ebnf.table.bgcolor">#F5DCB3</xsl:param>
+<xsl:param name="ebnf.table.border" select="1"/>
+<xsl:param name="eclipse.autolabel" select="0"/>
+<xsl:param name="eclipse.plugin.id">com.example.help</xsl:param>
+<xsl:param name="eclipse.plugin.name">DocBook Online Help Sample</xsl:param>
+<xsl:param name="eclipse.plugin.provider">Example provider</xsl:param>
+<xsl:param name="editedby.enabled">1</xsl:param>
+<xsl:param name="email.delimiters.enabled" select="1"/>
+<xsl:param name="emphasis.propagates.style" select="1"/>
+<xsl:param name="entry.propagates.style" select="1"/>
+<xsl:param name="exsl.node.set.available">
+ <xsl:choose>
+ <xsl:when xmlns:exsl="http://exslt.org/common" exsl:foo="" test="function-available('exsl:node-set') or contains(system-property('xsl:vendor'), 'Apache Software Foundation')">1</xsl:when>
+ <xsl:otherwise>0</xsl:otherwise>
+ </xsl:choose>
+</xsl:param>
+<xsl:param name="firstterm.only.link" select="0"/>
+<xsl:param name="footer.rule" select="1"/>
+<xsl:param name="footnote.number.format">1</xsl:param>
+<xsl:param name="footnote.number.symbols"/>
+<xsl:param name="formal.procedures" select="1"/>
+<xsl:param name="formal.title.placement">
+figure before
+example before
+equation before
+table before
+procedure before
+task before
+</xsl:param>
+<xsl:param name="funcsynopsis.decoration" select="1"/>
+<xsl:param name="funcsynopsis.style">kr</xsl:param>
+<xsl:param name="function.parens" select="0"/>
+<xsl:param name="generate.css.header" select="0"/>
+<xsl:param name="generate.id.attributes" select="0"/>
+<xsl:param name="generate.index" select="1"/>
+<xsl:param name="generate.legalnotice.link" select="0"/>
+<xsl:param name="generate.manifest" select="0"/>
+<xsl:param name="generate.meta.abstract" select="1"/>
+<xsl:param name="generate.revhistory.link" select="0"/>
+<xsl:param name="generate.section.toc.level" select="0"/>
+<xsl:param name="generate.toc">
+appendix toc,title
+article/appendix nop
+article toc,title
+book toc,title,figure,table,example,equation
+chapter toc,title
+part toc,title
+preface toc,title
+qandadiv toc
+qandaset toc
+reference toc,title
+sect1 toc
+sect2 toc
+sect3 toc
+sect4 toc
+sect5 toc
+section toc
+set toc,title
+</xsl:param>
+
+<xsl:param name="glossary.collection"/>
+<xsl:param name="glossary.sort" select="0"/>
+<xsl:param name="glossentry.show.acronym">no</xsl:param>
+<xsl:param name="glossterm.auto.link" select="0"/>
+<xsl:param name="graphic.default.extension"/>
+<xsl:param name="graphicsize.extension" select="1"/>
+<xsl:param name="graphicsize.use.img.src.path" select="0"/>
+<xsl:param name="header.rule" select="1"/>
+<xsl:param name="highlight.default.language"/>
+<xsl:param name="highlight.source" select="0"/>
+<xsl:param name="highlight.xslthl.config"/>
+<xsl:param name="html.append"/>
+<xsl:param name="html.base"/>
+<xsl:param name="html.cellpadding"/>
+<xsl:param name="html.cellspacing"/>
+<xsl:param name="html.cleanup" select="1"/>
+<xsl:param name="html.ext">.html</xsl:param>
+<xsl:param name="html.extra.head.links" select="0"/>
+<xsl:param name="html.head.legalnotice.link.multiple" select="1"/>
+<xsl:param name="html.head.legalnotice.link.types">copyright</xsl:param>
+<xsl:param name="html.longdesc" select="1"/>
+<xsl:param name="html.longdesc.link" select="$html.longdesc"/>
+<xsl:param name="html.stylesheet"/>
+<xsl:param name="html.stylesheet.type">text/css</xsl:param>
+<xsl:param name="htmlhelp.alias.file">alias.h</xsl:param>
+<xsl:param name="htmlhelp.autolabel" select="0"/>
+<xsl:param name="htmlhelp.button.back" select="1"/>
+<xsl:param name="htmlhelp.button.forward" select="0"/>
+<xsl:param name="htmlhelp.button.hideshow" select="1"/>
+<xsl:param name="htmlhelp.button.home" select="0"/>
+<xsl:param name="htmlhelp.button.home.url"/>
+<xsl:param name="htmlhelp.button.jump1" select="0"/>
+<xsl:param name="htmlhelp.button.jump1.title">User1</xsl:param>
+<xsl:param name="htmlhelp.button.jump1.url"/>
+<xsl:param name="htmlhelp.button.jump2" select="0"/>
+<xsl:param name="htmlhelp.button.jump2.title">User2</xsl:param>
+<xsl:param name="htmlhelp.button.jump2.url"/>
+<xsl:param name="htmlhelp.button.locate" select="0"/>
+<xsl:param name="htmlhelp.button.next" select="1"/>
+<xsl:param name="htmlhelp.button.options" select="1"/>
+<xsl:param name="htmlhelp.button.prev" select="1"/>
+<xsl:param name="htmlhelp.button.print" select="1"/>
+<xsl:param name="htmlhelp.button.refresh" select="0"/>
+<xsl:param name="htmlhelp.button.stop" select="0"/>
+<xsl:param name="htmlhelp.button.zoom" select="0"/>
+<xsl:param name="htmlhelp.chm">htmlhelp.chm</xsl:param>
+<xsl:param name="htmlhelp.default.topic"/>
+<xsl:param name="htmlhelp.display.progress" select="1"/>
+<xsl:param name="htmlhelp.encoding">iso-8859-1</xsl:param>
+<xsl:param name="htmlhelp.enhanced.decompilation" select="0"/>
+<xsl:param name="htmlhelp.enumerate.images" select="0"/>
+<xsl:param name="htmlhelp.force.map.and.alias" select="0"/>
+<xsl:param name="htmlhelp.hhc.binary" select="1"/>
+<xsl:param name="htmlhelp.hhc.folders.instead.books" select="1"/>
+<xsl:param name="htmlhelp.hhc">toc.hhc</xsl:param>
+<xsl:param name="htmlhelp.hhc.section.depth">5</xsl:param>
+<xsl:param name="htmlhelp.hhc.show.root" select="1"/>
+<xsl:param name="htmlhelp.hhc.width"/>
+<xsl:param name="htmlhelp.hhk">index.hhk</xsl:param>
+<xsl:param name="htmlhelp.hhp">htmlhelp.hhp</xsl:param>
+<xsl:param name="htmlhelp.hhp.tail"/>
+<xsl:param name="htmlhelp.hhp.window">Main</xsl:param>
+<xsl:param name="htmlhelp.hhp.windows"/>
+<xsl:param name="htmlhelp.map.file">context.h</xsl:param>
+<xsl:param name="htmlhelp.only" select="0"/>
+<xsl:param name="htmlhelp.remember.window.position" select="0"/>
+<xsl:param name="htmlhelp.show.advanced.search" select="0"/>
+<xsl:param name="htmlhelp.show.favorities" select="0"/>
+<xsl:param name="htmlhelp.show.menu" select="0"/>
+<xsl:param name="htmlhelp.show.toolbar.text" select="1"/>
+<xsl:param name="htmlhelp.title"/>
+<xsl:param name="htmlhelp.use.hhk" select="0"/>
+<xsl:param name="htmlhelp.window.geometry"/>
+<xsl:param name="id.warnings" select="0"/>
+<xsl:param name="ignore.image.scaling" select="0"/>
+<xsl:param name="img.src.path"/>
+<xsl:param name="index.links.to.section" select="1"/>
+<xsl:param name="index.method">basic</xsl:param>
+<xsl:param name="index.number.separator"/>
+<xsl:param name="index.on.role" select="0"/>
+<xsl:param name="index.on.type" select="0"/>
+<xsl:param name="index.prefer.titleabbrev" select="0"/>
+<xsl:param name="index.range.separator"/>
+<xsl:param name="index.term.separator"/>
+<xsl:param name="inherit.keywords" select="1"/>
+<xsl:param name="insert.olink.page.number">no</xsl:param>
+<xsl:param name="insert.olink.pdf.frag" select="0"/>
+<xsl:param name="insert.xref.page.number">no</xsl:param>
+<xsl:param name="javahelp.encoding">iso-8859-1</xsl:param>
+<xsl:param name="keep.relative.image.uris" select="1"/>
+
+<xsl:param name="l10n.gentext.default.language">en</xsl:param>
+<xsl:param name="l10n.gentext.language"/>
+<xsl:param name="l10n.gentext.use.xref.language" select="0"/>
+<xsl:param name="l10n.lang.value.rfc.compliant" select="1"/>
+<xsl:param name="label.from.part" select="0"/>
+<xsl:param name="linenumbering.everyNth">5</xsl:param>
+<xsl:param name="linenumbering.extension" select="1"/>
+<xsl:param name="linenumbering.separator"><xsl:text> </xsl:text></xsl:param>
+<xsl:param name="linenumbering.width">3</xsl:param>
+<xsl:param name="link.mailto.url"/>
+<xsl:param name="make.clean.html" select="0"/>
+<xsl:param name="make.graphic.viewport" select="1"/>
+<xsl:param name="make.single.year.ranges" select="0"/>
+<xsl:param name="make.valid.html" select="0"/>
+<xsl:param name="make.year.ranges" select="0"/>
+ <xsl:param name="manifest">HTML.manifest</xsl:param>
+
+<xsl:param name="manifest.in.base.dir" select="0"/>
+<xsl:param name="manual.toc"/>
+<xsl:param name="menuchoice.menu.separator"> &#8594; </xsl:param>
+<xsl:param name="menuchoice.separator">+</xsl:param>
+<xsl:param name="navig.graphics.extension">.gif</xsl:param>
+<xsl:param name="navig.graphics" select="0"/>
+<xsl:param name="navig.graphics.path">images/</xsl:param>
+<xsl:param name="navig.showtitles">1</xsl:param>
+<xsl:param name="nominal.image.depth" select="4 * $pixels.per.inch"/>
+<xsl:param name="nominal.image.width" select="6 * $pixels.per.inch"/>
+<xsl:param name="nominal.table.width">6in</xsl:param>
+<xsl:param name="olink.base.uri"/>
+<xsl:param name="olink.debug" select="0"/>
+<xsl:param name="olink.doctitle">no</xsl:param>
+<xsl:param name="olink.fragid">fragid=</xsl:param>
+<xsl:param name="olink.lang.fallback.sequence"/>
+<xsl:param name="olink.outline.ext">.olink</xsl:param>
+<xsl:attribute-set name="olink.properties">
+ <xsl:attribute name="show-destination">replace</xsl:attribute>
+</xsl:attribute-set>
+<xsl:param name="olink.pubid">pubid</xsl:param>
+ <xsl:param name="olink.resolver">/cgi-bin/olink</xsl:param>
+<xsl:param name="olink.sysid">sysid</xsl:param>
+<xsl:param name="othercredit.like.author.enabled">0</xsl:param>
+<xsl:param name="para.propagates.style" select="1"/>
+<xsl:param name="part.autolabel">I</xsl:param>
+<xsl:param name="phrase.propagates.style" select="1"/>
+<xsl:param name="pixels.per.inch">90</xsl:param>
+<xsl:param name="points.per.em">10</xsl:param>
+<xsl:param name="preface.autolabel" select="0"/>
+<xsl:param name="prefer.internal.olink" select="0"/>
+<xsl:param name="preferred.mediaobject.role"/>
+<xsl:param name="process.empty.source.toc" select="0"/>
+<xsl:param name="process.source.toc" select="0"/>
+<xsl:param name="profile.arch"/>
+<xsl:param name="profile.attribute"/>
+<xsl:param name="profile.audience"/>
+<xsl:param name="profile.condition"/>
+<xsl:param name="profile.conformance"/>
+<xsl:param name="profile.lang"/>
+<xsl:param name="profile.os"/>
+<xsl:param name="profile.revision"/>
+<xsl:param name="profile.revisionflag"/>
+<xsl:param name="profile.role"/>
+<xsl:param name="profile.security"/>
+<xsl:param name="profile.separator">;</xsl:param>
+<xsl:param name="profile.status"/>
+<xsl:param name="profile.userlevel"/>
+<xsl:param name="profile.value"/>
+<xsl:param name="profile.vendor"/>
+<xsl:param name="profile.wordsize"/>
+<xsl:param name="punct.honorific">.</xsl:param>
+<xsl:param name="qanda.defaultlabel">number</xsl:param>
+<xsl:param name="qanda.in.toc" select="0"/>
+<xsl:param name="qanda.inherit.numeration" select="1"/>
+<xsl:param name="qanda.nested.in.toc" select="0"/>
+<xsl:param name="qandadiv.autolabel" select="1"/>
+<xsl:param name="refclass.suppress" select="0"/>
+<xsl:param name="refentry.generate.name" select="1"/>
+<xsl:param name="refentry.generate.title" select="0"/>
+<xsl:param name="refentry.separator" select="1"/>
+<xsl:param name="refentry.xref.manvolnum" select="1"/>
+ <xsl:param name="reference.autolabel">I</xsl:param>
+<xsl:param name="root.filename">index</xsl:param>
+<xsl:param name="rootid"/>
+<xsl:param name="runinhead.default.title.end.punct">.</xsl:param>
+<xsl:param name="runinhead.title.end.punct">.!?:</xsl:param>
+<xsl:param name="section.autolabel" select="0"/>
+<xsl:param name="section.autolabel.max.depth">8</xsl:param>
+<xsl:param name="section.label.includes.component.label" select="0"/>
+<xsl:param name="segmentedlist.as.table" select="0"/>
+<xsl:param name="shade.verbatim" select="0"/>
+<xsl:attribute-set name="shade.verbatim.style">
+ <xsl:attribute name="border">0</xsl:attribute>
+ <xsl:attribute name="bgcolor">#E0E0E0</xsl:attribute>
+</xsl:attribute-set>
+
+<xsl:param name="show.comments" select="1"/>
+<xsl:param name="show.revisionflag" select="0"/>
+<xsl:param name="simplesect.in.toc" select="0"/>
+<xsl:param name="spacing.paras" select="0"/>
+<xsl:param name="suppress.footer.navigation">0</xsl:param>
+<xsl:param name="suppress.header.navigation" select="0"/>
+<xsl:param name="suppress.navigation" select="0"/>
+<xsl:param name="table.borders.with.css" select="0"/>
+<xsl:param name="table.cell.border.color"/>
+
+<xsl:param name="table.cell.border.style">solid</xsl:param>
+<xsl:param name="table.cell.border.thickness">0.5pt</xsl:param>
+<xsl:param name="table.footnote.number.format">a</xsl:param>
+<xsl:param name="table.footnote.number.symbols"/>
+<xsl:param name="table.frame.border.color"/>
+
+<xsl:param name="table.frame.border.style">solid</xsl:param>
+<xsl:param name="table.frame.border.thickness">0.5pt</xsl:param>
+<xsl:param name="tablecolumns.extension" select="1"/>
+ <xsl:param name="target.database.document">olinkdb.xml</xsl:param>
+<xsl:param name="targets.filename">target.db</xsl:param>
+<xsl:param name="tex.math.delims" select="1"/>
+<xsl:param name="tex.math.file">tex-math-equations.tex</xsl:param>
+<xsl:param name="tex.math.in.alt"/>
+<xsl:param name="textdata.default.encoding"/>
+ <xsl:param name="textinsert.extension" select="1"/>
+<xsl:param name="toc.list.type">dl</xsl:param>
+<xsl:param name="toc.max.depth">8</xsl:param>
+<xsl:param name="toc.section.depth">2</xsl:param>
+<xsl:param name="ulink.target">_top</xsl:param>
+<xsl:param name="use.embed.for.svg" select="0"/>
+<xsl:param name="use.extensions" select="0"/>
+<xsl:param name="use.id.as.filename" select="0"/>
+<xsl:param name="use.local.olink.style" select="0"/>
+<xsl:param name="use.role.as.xrefstyle" select="1"/>
+<xsl:param name="use.role.for.mediaobject" select="1"/>
+<xsl:param name="use.svg" select="1"/>
+<xsl:param name="variablelist.as.table" select="0"/>
+<xsl:param name="variablelist.term.break.after">0</xsl:param>
+<xsl:param name="variablelist.term.separator">, </xsl:param>
+<xsl:param name="writing.mode">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key">writing-mode</xsl:with-param>
+ <xsl:with-param name="lang">
+ <xsl:call-template name="l10n.language">
+ <xsl:with-param name="target" select="/*[1]"/>
+ </xsl:call-template>
+ </xsl:with-param>
+ </xsl:call-template>
+</xsl:param>
+<xsl:param name="xref.label-page.separator"><xsl:text> </xsl:text></xsl:param>
+<xsl:param name="xref.label-title.separator">: </xsl:param>
+<xsl:param name="xref.title-page.separator"><xsl:text> </xsl:text></xsl:param>
+<xsl:param name="xref.with.number.and.title" select="1"/>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/pi.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/pi.xml
new file mode 100644
index 0000000..a8f357e
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/pi.xml
@@ -0,0 +1,1113 @@
+<?xml version="1.0"?>
+
+<reference><info><title>HTML Processing Instruction Reference</title>
+ <releaseinfo role="meta">
+ $Id: pi.xsl 8394 2009-04-02 20:31:30Z mzjn $
+ </releaseinfo>
+ </info>
+ <partintro xml:id="partintro">
+ <title>Introduction</title>
+
+<para>This is generated reference documentation for all
+ user-specifiable processing instructions (PIs) in the DocBook
+ XSL stylesheets for HTML output.
+ <note>
+
+<para>You add these PIs at particular points in a document to
+ cause specific “exceptions†to formatting/output behavior. To
+ make global changes in formatting/output behavior across an
+ entire document, it’s better to do it by setting an
+ appropriate stylesheet parameter (if there is one).</para>
+
+ </note>
+ </para>
+
+ </partintro>
+
+<refentry xmlns:xlink="http://www.w3.org/1999/xlink" xml:id="dbhtml_background-color">
+<refnamediv>
+<refname>dbhtml_background-color</refname>
+<refpurpose>Sets background color for an image</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+
+ <synopsis><tag class="xmlpi">dbhtml background-color="<replaceable>color</replaceable>"</tag></synopsis>
+
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>Use the <tag class="xmlpi">dbhtml background-color</tag> PI before or
+ after an image (<tag>graphic</tag>, <tag>inlinegraphic</tag>,
+ <tag>imagedata</tag>, or <tag>videodata</tag> element) as a
+ sibling to the element, to set a background color for the
+ image.</para>
+
+ </refsect1><refsect1><title>Parameters</title>
+
+<variablelist>
+ <varlistentry><term>background-color="<replaceable>color</replaceable>"</term>
+ <listitem>
+
+<para>An HTML color value</para>
+
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ </refsect1><refsect1 role="tcg"><title>Related Information in <link xlink:href="http://www.sagehill.net/docbookxsl/">DocBook XSL: The Complete Guide</link></title>
+
+<para><link role="tcg" xlink:href="BGcolor.html">Background color</link></para>
+
+ </refsect1></refentry>
+
+<refentry xmlns:xlink="http://www.w3.org/1999/xlink" xml:id="dbhtml_bgcolor">
+<refnamediv>
+<refname>dbhtml_bgcolor</refname>
+<refpurpose>Sets background color on a CALS table row or table cell</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+
+ <synopsis><tag class="xmlpi">dbhtml bgcolor="<replaceable>color</replaceable>"</tag></synopsis>
+
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>Use the <tag class="xmlpi">dbhtml bgcolor</tag> PI as child of a CALS table row
+ or cell to set a background color for that table row or cell.</para>
+
+ </refsect1><refsect1><title>Parameters</title>
+
+<variablelist>
+ <varlistentry><term>bgcolor="<replaceable>color</replaceable>"</term>
+ <listitem>
+
+<para>An HTML color value</para>
+
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ </refsect1><refsect1 role="tcg"><title>Related Information in <link xlink:href="http://www.sagehill.net/docbookxsl/">DocBook XSL: The Complete Guide</link></title>
+
+<para><link role="tcg" xlink:href="BGtableColor.html#CellBGColor">Cell background color</link></para>
+
+ </refsect1></refentry>
+
+<refentry xmlns:xlink="http://www.w3.org/1999/xlink" xml:id="dbhtml_cellpadding">
+<refnamediv>
+<refname>dbhtml_cellpadding</refname>
+<refpurpose>Specifies cellpadding in CALS table or qandaset output</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+
+ <synopsis><tag class="xmlpi">dbhtml cellpadding="<replaceable>number</replaceable>"</tag></synopsis>
+
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>Use the <tag class="xmlpi">dbhtml cellpadding</tag> PI as a child of a
+ CALS <tag>table</tag> or <tag>qandaset</tag> to specify the value
+ for the HTML <literal>cellpadding</literal> attribute in the
+ output HTML table.</para>
+
+ </refsect1><refsect1><title>Parameters</title>
+
+<variablelist>
+ <varlistentry><term>cellpadding="<replaceable>number</replaceable>"</term>
+ <listitem>
+
+<para>Specifies the cellpadding</para>
+
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ </refsect1><refsect1 role="params"><title>Related Global Parameters</title>
+
+<para><parameter>html.cellpadding</parameter></para>
+
+ </refsect1><refsect1 role="tcg"><title>Related Information in <link xlink:href="http://www.sagehill.net/docbookxsl/">DocBook XSL: The Complete Guide</link></title>
+
+<para><link role="tcg" xlink:href="CellSpacing.html">Cell spacing and cell padding</link>,
+ <link role="tcg" xlink:href="QandAformat.html">Q and A formatting</link></para>
+
+ </refsect1></refentry>
+
+<refentry xmlns:xlink="http://www.w3.org/1999/xlink" xml:id="dbhtml_cellspacing">
+<refnamediv>
+<refname>dbhtml_cellspacing</refname>
+<refpurpose>Specifies cellspacing in CALS table or qandaset output</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+
+ <synopsis><tag class="xmlpi">dbhtml cellspacing="<replaceable>number</replaceable>"</tag></synopsis>
+
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>Use the <tag class="xmlpi">dbhtml cellspacing</tag> PI as a child of a
+ CALS <tag>table</tag> or <tag>qandaset</tag> to specify the value
+ for the HTML <literal>cellspacing</literal> attribute in the
+ output HTML table.</para>
+
+ </refsect1><refsect1><title>Parameters</title>
+
+<variablelist>
+ <varlistentry><term>cellspacing="<replaceable>number</replaceable>"</term>
+ <listitem>
+
+<para>Specifies the cellspacing</para>
+
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ </refsect1><refsect1 role="params"><title>Related Global Parameters</title>
+
+<para><parameter>html.cellspacing</parameter></para>
+
+ </refsect1><refsect1 role="tcg"><title>Related Information in <link xlink:href="http://www.sagehill.net/docbookxsl/">DocBook XSL: The Complete Guide</link></title>
+
+<para><link role="tcg" xlink:href="CellSpacing.html">Cell spacing and cell padding</link>,
+ <link role="tcg" xlink:href="QandAformat.html">Q and A formatting</link></para>
+
+ </refsect1></refentry>
+
+<refentry xmlns:xlink="http://www.w3.org/1999/xlink" xml:id="dbhtml_class">
+<refnamediv>
+<refname>dbhtml_class</refname>
+<refpurpose>Set value of the class attribute for a CALS table row</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+
+ <synopsis><tag class="xmlpi">dbhtml class="<replaceable>name</replaceable>"</tag></synopsis>
+
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>Use the <tag class="xmlpi">dbhtml class</tag> PI as a child of a
+ <tag>row</tag> to specify a <literal>class</literal>
+ attribute and value in the HTML output for that row.</para>
+
+ </refsect1><refsect1><title>Parameters</title>
+
+<variablelist>
+ <varlistentry><term>class="<replaceable>name</replaceable>"</term>
+ <listitem>
+
+<para>Specifies the class name</para>
+
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ </refsect1><refsect1 role="tcg"><title>Related Information in <link xlink:href="http://www.sagehill.net/docbookxsl/">DocBook XSL: The Complete Guide</link></title>
+
+<para><link role="tcg" xlink:href="CSSTableCells.html">Table styles in HTML output</link></para>
+
+ </refsect1></refentry>
+
+<refentry xmlns:xlink="http://www.w3.org/1999/xlink" xml:id="dbhtml_dir">
+<refnamediv>
+<refname>dbhtml_dir</refname>
+<refpurpose>Specifies a directory name in which to write files</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+
+ <synopsis><tag class="xmlpi">dbhtml dir="<replaceable>path</replaceable>"</tag></synopsis>
+
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>When chunking output, use the <tag class="xmlpi">dbhtml dir</tag> PI
+ as a child of a chunk source to cause the output of that
+ chunk to be written to the specified directory; also, use it
+ as a child of a <tag>mediaobject</tag> to specify a
+ directory into which any long-description files for that
+ <tag>mediaobject</tag> will be written.</para>
+
+ </refsect1><refsect1><title>Parameters</title>
+
+<variablelist>
+ <varlistentry><term>dir="<replaceable>path</replaceable>"</term>
+ <listitem>
+
+<para>Specifies the pathname for the directory</para>
+
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ </refsect1><refsect1 role="params"><title>Related Global Parameters</title>
+
+<para><parameter>base.dir</parameter></para>
+
+ </refsect1><refsect1 role="tcg"><title>Related Information in <link xlink:href="http://www.sagehill.net/docbookxsl/">DocBook XSL: The Complete Guide</link></title>
+
+<para><link role="tcg" xlink:href="Chunking.html#dbhtmlDirPI">dbhtml dir processing instruction</link></para>
+
+ </refsect1></refentry>
+
+<refentry xmlns:xlink="http://www.w3.org/1999/xlink" xml:id="dbhtml_filename">
+<refnamediv>
+<refname>dbhtml_filename</refname>
+<refpurpose>Specifies a filename for a chunk</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+
+ <synopsis><tag class="xmlpi">dbhtml filename="<replaceable>filename</replaceable>"</tag></synopsis>
+
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>When chunking output, use the <tag class="xmlpi">dbhtml filename</tag>
+ PI as a child of a chunk source to specify a filename for
+ the output file for that chunk.</para>
+
+ </refsect1><refsect1><title>Parameters</title>
+
+<variablelist>
+ <varlistentry><term>filename="<replaceable>path</replaceable>"</term>
+ <listitem>
+
+<para>Specifies the filename for the file</para>
+
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ </refsect1><refsect1 role="params"><title>Related Global Parameters</title>
+
+<para><parameter>use.id.as.filename</parameter></para>
+
+ </refsect1><refsect1 role="tcg"><title>Related Information in <link xlink:href="http://www.sagehill.net/docbookxsl/">DocBook XSL: The Complete Guide</link></title>
+
+<para><link role="tcg" xlink:href="Chunking.html#DbhtmlFilenames">dbhtml filenames</link></para>
+
+ </refsect1></refentry>
+
+<refentry xmlns:xlink="http://www.w3.org/1999/xlink" xml:id="dbhtml_funcsynopsis-style">
+<refnamediv>
+<refname>dbhtml_funcsynopsis-style</refname>
+<refpurpose>Specifies presentation style for a funcsynopsis</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+
+ <synopsis><tag class="xmlpi">dbhtml funcsynopsis-style="kr"|"ansi"</tag></synopsis>
+
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>Use the <tag class="xmlpi">dbhtml funcsynopsis-style</tag> PI as a child of
+ a <tag>funcsynopsis</tag> or anywhere within a funcsynopsis
+ to control the presentation style for output of all
+ <tag>funcprototype</tag> instances within that funcsynopsis.</para>
+
+ </refsect1><refsect1><title>Parameters</title>
+
+<variablelist>
+ <varlistentry><term>funcsynopsis-style="kr"</term>
+ <listitem>
+
+<para>Displays <tag>funcprototype</tag> output in K&amp;R style</para>
+
+ </listitem>
+ </varlistentry>
+ <varlistentry><term>funcsynopsis-style="ansi"</term>
+ <listitem>
+
+<para>Displays <tag>funcprototype</tag> output in ANSI style</para>
+
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ </refsect1><refsect1 role="params"><title>Related Global Parameters</title>
+
+<para><parameter>funcsynopsis.style</parameter></para>
+
+ </refsect1></refentry>
+
+<refentry xmlns:xlink="http://www.w3.org/1999/xlink" xml:id="dbhtml_img.src.path">
+<refnamediv>
+<refname>dbhtml_img.src.path</refname>
+<refpurpose>Specifies a path to the location of an image file</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+
+ <synopsis><tag class="xmlpi">dbhtml img.src.path="<replaceable>path</replaceable>"</tag></synopsis>
+
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>Use the <tag class="xmlpi">dbhtml img.src.path</tag> PI before or
+ after an image (<tag>graphic</tag>,
+ <tag>inlinegraphic</tag>, <tag>imagedata</tag>, or
+ <tag>videodata</tag> element) as a sibling to the element,
+ to specify a path to the location of the image; in HTML
+ output, the value specified for the
+ <code>img.src.path</code> attribute is prepended to the
+ filename.</para>
+
+ </refsect1><refsect1><title>Parameters</title>
+
+<variablelist>
+ <varlistentry><term>img.src.path="<replaceable>path</replaceable>"</term>
+ <listitem>
+
+<para>Specifies the pathname to prepend to the name of the image file</para>
+
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ </refsect1><refsect1 role="params"><title>Related Global Parameters</title>
+
+<para><parameter>img.src.path</parameter></para>
+
+ </refsect1><refsect1 role="tcg"><title>Related Information in <link xlink:href="http://www.sagehill.net/docbookxsl/">DocBook XSL: The Complete Guide</link></title>
+
+<para><link role="tcg" xlink:href="GraphicsLocations.html#UsingFileref">Using fileref</link></para>
+
+ </refsect1></refentry>
+
+<refentry xmlns:xlink="http://www.w3.org/1999/xlink" xml:id="dbhtml_label-width">
+<refnamediv>
+<refname>dbhtml_label-width</refname>
+<refpurpose>Specifies the label width for a qandaset</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+
+ <synopsis><tag class="xmlpi">dbhtml label-width="<replaceable>width</replaceable>"</tag></synopsis>
+
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>Use the <tag class="xmlpi">dbhtml label-width</tag> PI as a child of a
+ <tag>qandaset</tag> to specify the width of labels.</para>
+
+ </refsect1><refsect1><title>Parameters</title>
+
+<variablelist>
+ <varlistentry><term>label-width="<replaceable>width</replaceable>"</term>
+ <listitem>
+
+<para>Specifies the label width (including units)</para>
+
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ </refsect1><refsect1 role="tcg"><title>Related Information in <link xlink:href="http://www.sagehill.net/docbookxsl/">DocBook XSL: The Complete Guide</link></title>
+
+<para><link role="tcg" xlink:href="QandAformat.html">Q and A formatting</link></para>
+
+ </refsect1></refentry>
+
+<refentry xmlns:xlink="http://www.w3.org/1999/xlink" xml:id="dbhtml_linenumbering.everyNth">
+<refnamediv>
+<refname>dbhtml_linenumbering.everyNth</refname>
+<refpurpose>Specifies interval for line numbers in verbatims</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+
+ <synopsis><tag class="xmlpi">dbhtml linenumbering.everyNth="<replaceable>N</replaceable>"</tag></synopsis>
+
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>Use the <tag class="xmlpi">dbhtml linenumbering.everyNth</tag> PI as a child
+ of a “verbatim†element – <tag>programlisting</tag>,
+ <tag>screen</tag>, <tag>synopsis</tag> — to specify
+ the interval at which lines are numbered.</para>
+
+ </refsect1><refsect1><title>Parameters</title>
+
+<variablelist>
+ <varlistentry><term>linenumbering.everyNth="<replaceable>N</replaceable>"</term>
+ <listitem>
+
+<para>Specifies numbering interval; a number is output
+ before every <replaceable>N</replaceable>th line</para>
+
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ </refsect1><refsect1 role="params"><title>Related Global Parameters</title>
+
+<para><parameter>linenumbering.everyNth</parameter></para>
+
+ </refsect1><refsect1 role="tcg"><title>Related Information in <link xlink:href="http://www.sagehill.net/docbookxsl/">DocBook XSL: The Complete Guide</link></title>
+
+<para><link role="tcg" xlink:href="AnnotateListing.html#LineNumbering">Line numbering</link></para>
+
+ </refsect1></refentry>
+
+<refentry xmlns:xlink="http://www.w3.org/1999/xlink" xml:id="dbhtml_linenumbering.separator">
+<refnamediv>
+<refname>dbhtml_linenumbering.separator</refname>
+<refpurpose>Specifies separator text for line numbers in verbatims</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+
+ <synopsis><tag class="xmlpi">dbhtml linenumbering.separator="<replaceable>text</replaceable>"</tag></synopsis>
+
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>Use the <tag class="xmlpi">dbhtml linenumbering.separator</tag> PI as a child
+ of a “verbatim†element – <tag>programlisting</tag>,
+ <tag>screen</tag>, <tag>synopsis</tag> — to specify
+ the separator text output between the line numbers and content.</para>
+
+ </refsect1><refsect1><title>Parameters</title>
+
+<variablelist>
+ <varlistentry><term>linenumbering.separator="<replaceable>text</replaceable>"</term>
+ <listitem>
+
+<para>Specifies the text (zero or more characters)</para>
+
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ </refsect1><refsect1 role="params"><title>Related Global Parameters</title>
+
+<para><parameter>linenumbering.separator</parameter></para>
+
+ </refsect1><refsect1 role="tcg"><title>Related Information in <link xlink:href="http://www.sagehill.net/docbookxsl/">DocBook XSL: The Complete Guide</link></title>
+
+<para><link role="tcg" xlink:href="AnnotateListing.html#LineNumbering">Line numbering</link></para>
+
+ </refsect1></refentry>
+
+<refentry xmlns:xlink="http://www.w3.org/1999/xlink" xml:id="dbhtml_linenumbering.width">
+<refnamediv>
+<refname>dbhtml_linenumbering.width</refname>
+<refpurpose>Specifies width for line numbers in verbatims</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+
+ <synopsis><tag class="xmlpi">dbhtml linenumbering.width="<replaceable>width</replaceable>"</tag></synopsis>
+
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>Use the <tag class="xmlpi">dbhtml linenumbering.width</tag> PI as a child
+ of a “verbatim†element – <tag>programlisting</tag>,
+ <tag>screen</tag>, <tag>synopsis</tag> — to specify
+ the width set aside for line numbers.</para>
+
+ </refsect1><refsect1><title>Parameters</title>
+
+<variablelist>
+ <varlistentry><term>linenumbering.width="<replaceable>width</replaceable>"</term>
+ <listitem>
+
+<para>Specifies the width (inluding units)</para>
+
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ </refsect1><refsect1 role="params"><title>Related Global Parameters</title>
+
+<para><parameter>linenumbering.width</parameter></para>
+
+ </refsect1><refsect1 role="tcg"><title>Related Information in <link xlink:href="http://www.sagehill.net/docbookxsl/">DocBook XSL: The Complete Guide</link></title>
+
+<para><link role="tcg" xlink:href="AnnotateListing.html#LineNumbering">Line numbering</link></para>
+
+ </refsect1></refentry>
+
+<refentry xmlns:xlink="http://www.w3.org/1999/xlink" xml:id="dbhtml_list-presentation">
+<refnamediv>
+<refname>dbhtml_list-presentation</refname>
+<refpurpose>Specifies presentation style for a variablelist or
+ segmentedlist</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+
+ <synopsis><tag class="xmlpi">dbhtml list-presentation="list"|"table"</tag></synopsis>
+
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>Use the <tag class="xmlpi">dbhtml list-presentation</tag> PI as a child of
+ a <tag>variablelist</tag> or <tag>segmentedlist</tag> to
+ control the presentation style for the list (to cause it, for
+ example, to be displayed as a table).</para>
+
+ </refsect1><refsect1><title>Parameters</title>
+
+<variablelist>
+ <varlistentry><term>list-presentation="list"</term>
+ <listitem>
+
+<para>Displays the list as a list</para>
+
+ </listitem>
+ </varlistentry>
+ <varlistentry><term>list-presentation="table"</term>
+ <listitem>
+
+<para>Displays the list as a table</para>
+
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ </refsect1><refsect1 role="params"><title>Related Global Parameters</title>
+
+<itemizedlist>
+ <listitem>
+
+<para><parameter>variablelist.as.table</parameter></para>
+
+ </listitem>
+ <listitem>
+
+<para><parameter>segmentedlist.as.table</parameter></para>
+
+ </listitem>
+ </itemizedlist>
+
+ </refsect1><refsect1 role="tcg"><title>Related Information in <link xlink:href="http://www.sagehill.net/docbookxsl/">DocBook XSL: The Complete Guide</link></title>
+
+<para><link role="tcg" xlink:href="Variablelists.html#VarListFormatting">Variable list formatting in HTML</link></para>
+
+ </refsect1></refentry>
+
+<refentry xmlns:xlink="http://www.w3.org/1999/xlink" xml:id="dbhtml_list-width">
+<refnamediv>
+<refname>dbhtml_list-width</refname>
+<refpurpose>Specifies the width of a variablelist or simplelist</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+
+ <synopsis><tag class="xmlpi">dbhtml list-width="<replaceable>width</replaceable>"</tag></synopsis>
+
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>Use the <tag class="xmlpi">dbhtml list-width</tag> PI as a child of a
+ <tag>variablelist</tag> or a <tag>simplelist</tag> presented
+ as a table, to specify the output width.</para>
+
+ </refsect1><refsect1><title>Parameters</title>
+
+<variablelist>
+ <varlistentry><term>list-width="<replaceable>width</replaceable>"</term>
+ <listitem>
+
+<para>Specifies the output width (including units)</para>
+
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ </refsect1><refsect1 role="tcg"><title>Related Information in <link xlink:href="http://www.sagehill.net/docbookxsl/">DocBook XSL: The Complete Guide</link></title>
+
+<para><link role="tcg" xlink:href="Variablelists.html#VarListFormatting">Variable list formatting in HTML</link></para>
+
+ </refsect1></refentry>
+
+<refentry xmlns:xlink="http://www.w3.org/1999/xlink" xml:id="dbhtml_row-height">
+<refnamediv>
+<refname>dbhtml_row-height</refname>
+<refpurpose>Specifies the height for a CALS table row</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+
+ <synopsis><tag class="xmlpi">dbhtml row-height="<replaceable>height</replaceable>"</tag></synopsis>
+
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>Use the <tag class="xmlpi">dbhtml row-height</tag> PI as a child of a
+ <tag>row</tag> to specify the height of the row.</para>
+
+ </refsect1><refsect1><title>Parameters</title>
+
+<variablelist>
+ <varlistentry><term>row-height="<replaceable>height</replaceable>"</term>
+ <listitem>
+
+<para>Specifies the row height (including units)</para>
+
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ </refsect1><refsect1 role="tcg"><title>Related Information in <link xlink:href="http://www.sagehill.net/docbookxsl/">DocBook XSL: The Complete Guide</link></title>
+
+<para><link role="tcg" xlink:href="RowHeight.html">Row height</link></para>
+
+ </refsect1></refentry>
+
+<refentry xmlns:xlink="http://www.w3.org/1999/xlink" xml:id="dbhtml_start">
+<refnamediv>
+<refname>dbhtml_start</refname>
+<refpurpose>(obsolete) Sets the starting number on an ordered list</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+
+ <synopsis><tag class="xmlpi">dbhtml start="<replaceable>character</replaceable>"</tag></synopsis>
+
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para><emphasis>This PI is obsolete</emphasis>. The intent of
+ this PI was to provide a means for setting a specific starting
+ number for an ordered list. Instead of this PI, set a value
+ for the <literal>override</literal> attribute on the first
+ <tag>listitem</tag> in the list; that will have the same
+ effect as what this PI was intended for.</para>
+
+ </refsect1><refsect1><title>Parameters</title>
+
+<variablelist>
+ <varlistentry><term>start="<replaceable>character</replaceable>"</term>
+ <listitem>
+
+<para>Specifies the character to use as the starting
+ number; use 0-9, a-z, A-Z, or lowercase or uppercase
+ Roman numerals</para>
+
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ </refsect1><refsect1 role="tcg"><title>Related Information in <link xlink:href="http://www.sagehill.net/docbookxsl/">DocBook XSL: The Complete Guide</link></title>
+
+<para><link role="tcg" xlink:href="Orderedlists.html#ListStartNum">List starting number</link></para>
+
+ </refsect1></refentry>
+
+<refentry xmlns:xlink="http://www.w3.org/1999/xlink" xml:id="dbhtml_stop-chunking">
+<refnamediv>
+<refname>dbhtml_stop-chunking</refname>
+<refpurpose>Do not chunk any descendants of this element.</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+
+ <synopsis><tag class="xmlpi">dbhtml stop-chunking</tag></synopsis>
+
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>When generating chunked HTML output, adding this PI as the child of an element that contains elements that would normally be generated on separate pages if generating chunked output causes chunking to stop at this point. No descendants of the current element will be split into new HTML pages:
+<programlisting>&lt;section&gt;
+&lt;title&gt;Configuring pencil&lt;/title&gt;
+&lt;?dbhtml stop-chunking?&gt;
+
+...
+
+&lt;/section&gt;</programlisting>
+</para>
+
+ </refsect1><refsect1 role="tcg"><title>Related Information in <link xlink:href="http://www.sagehill.net/docbookxsl/">DocBook XSL: The Complete Guide</link></title>
+
+<para><link role="tcg" xlink:href="Chunking.html">Chunking into multiple HTML files</link></para>
+
+ </refsect1></refentry>
+
+<refentry xmlns:xlink="http://www.w3.org/1999/xlink" xml:id="dbhtml_table-summary">
+<refnamediv>
+<refname>dbhtml_table-summary</refname>
+<refpurpose>Specifies summary for CALS table, variablelist, segmentedlist, or qandaset output</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+
+ <synopsis><tag class="xmlpi">dbhtml table-summary="<replaceable>text</replaceable>"</tag></synopsis>
+
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>Use the <tag class="xmlpi">dbhtml table-summary</tag> PI as a child of
+ a CALS <tag>table</tag>, <tag>variablelist</tag>,
+ <tag>segmentedlist</tag>, or <tag>qandaset</tag> to specify
+ the text for the HTML <literal>summary</literal> attribute
+ in the output HTML table.</para>
+
+ </refsect1><refsect1><title>Parameters</title>
+
+<variablelist>
+ <varlistentry><term>table-summary="<replaceable>text</replaceable>"</term>
+ <listitem>
+
+<para>Specifies the summary text (zero or more characters)</para>
+
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ </refsect1><refsect1 role="tcg"><title>Related Information in <link xlink:href="http://www.sagehill.net/docbookxsl/">DocBook XSL: The Complete Guide</link></title>
+
+<para><link role="tcg" xlink:href="Variablelists.html#VarListFormatting">Variable list formatting in HTML</link>,
+ <link role="tcg" xlink:href="TableSummary.html">Table summary text</link></para>
+
+ </refsect1></refentry>
+
+<refentry xmlns:xlink="http://www.w3.org/1999/xlink" xml:id="dbhtml_table-width">
+<refnamediv>
+<refname>dbhtml_table-width</refname>
+<refpurpose>Specifies the width for a CALS table</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+
+ <synopsis><tag class="xmlpi">dbhtml table-width="<replaceable>width</replaceable>"</tag></synopsis>
+
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>Use the <tag class="xmlpi">dbhtml table-width</tag> PI as a child of a
+ CALS <tag>table</tag> to specify the width of the table in
+ output.</para>
+
+ </refsect1><refsect1><title>Parameters</title>
+
+<variablelist>
+ <varlistentry><term>table-width="<replaceable>width</replaceable>"</term>
+ <listitem>
+
+<para>Specifies the table width (including units or as a percentage)</para>
+
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ </refsect1><refsect1 role="params"><title>Related Global Parameters</title>
+
+<para><parameter>default.table.width</parameter></para>
+
+ </refsect1><refsect1 role="tcg"><title>Related Information in <link xlink:href="http://www.sagehill.net/docbookxsl/">DocBook XSL: The Complete Guide</link></title>
+
+<para><link role="tcg" xlink:href="Tables.html#TableWidth">Table width</link></para>
+
+ </refsect1></refentry>
+
+<refentry xmlns:xlink="http://www.w3.org/1999/xlink" xml:id="dbhtml_term-presentation">
+<refnamediv>
+<refname>dbhtml_term-presentation</refname>
+<refpurpose>Sets character formatting for terms in a variablelist</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+
+ <synopsis><tag class="xmlpi">dbhtml term-presentation="bold"|"italic"|"bold-italic"</tag></synopsis>
+
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>Use the <tag class="xmlpi">dbhtml term-presentation</tag> PI as a child
+ of a <tag>variablelist</tag> to set character formatting for
+ the <tag>term</tag> output of the list.</para>
+
+ </refsect1><refsect1><title>Parameters</title>
+
+<variablelist>
+ <varlistentry><term>term-presentation="<replaceable>bold</replaceable>"</term>
+ <listitem>
+
+<para>Specifies that terms are displayed in bold</para>
+
+ </listitem>
+ </varlistentry>
+ <varlistentry><term>term-presentation="<replaceable>italic</replaceable>"</term>
+ <listitem>
+
+<para>Specifies that terms are displayed in italic</para>
+
+ </listitem>
+ </varlistentry>
+ <varlistentry><term>term-presentation="<replaceable>bold-italic</replaceable>"</term>
+ <listitem>
+
+<para>Specifies that terms are displayed in bold-italic</para>
+
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ </refsect1><refsect1 role="tcg"><title>Related Information in <link xlink:href="http://www.sagehill.net/docbookxsl/">DocBook XSL: The Complete Guide</link></title>
+
+<para><link role="tcg" xlink:href="Variablelists.html#VarListFormatting">Variable list formatting in HTML</link></para>
+
+ </refsect1></refentry>
+
+<refentry xmlns:xlink="http://www.w3.org/1999/xlink" xml:id="dbhtml_term-separator">
+<refnamediv>
+<refname>dbhtml_term-separator</refname>
+<refpurpose>Specifies separator text among terms in a varlistentry</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+
+ <synopsis><tag class="xmlpi">dbhtml term-separator="<replaceable>text</replaceable>"</tag></synopsis>
+
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>Use the <tag class="xmlpi">dbhtml term-separator</tag> PI as a child
+ of a <tag>variablelist</tag> to specify the separator text
+ among <tag>term</tag> instances.</para>
+
+ </refsect1><refsect1><title>Parameters</title>
+
+<variablelist>
+ <varlistentry><term>term-separator="<replaceable>text</replaceable>"</term>
+ <listitem>
+
+<para>Specifies the text (zero or more characters)</para>
+
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ </refsect1><refsect1 role="params"><title>Related Global Parameters</title>
+
+<para><parameter>variablelist.term.separator</parameter></para>
+
+ </refsect1><refsect1 role="tcg"><title>Related Information in <link xlink:href="http://www.sagehill.net/docbookxsl/">DocBook XSL: The Complete Guide</link></title>
+
+<para><link role="tcg" xlink:href="Variablelists.html#VarListFormatting">Variable list formatting in HTML</link></para>
+
+ </refsect1></refentry>
+
+<refentry xmlns:xlink="http://www.w3.org/1999/xlink" xml:id="dbhtml_term-width">
+<refnamediv>
+<refname>dbhtml_term-width</refname>
+<refpurpose>Specifies the term width for a variablelist</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+
+ <synopsis><tag class="xmlpi">dbhtml term-width="<replaceable>width</replaceable>"</tag></synopsis>
+
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>Use the <tag class="xmlpi">dbhtml term-width</tag> PI as a child of a
+ <tag>variablelist</tag> to specify the width for
+ <tag>term</tag> output.</para>
+
+ </refsect1><refsect1><title>Parameters</title>
+
+<variablelist>
+ <varlistentry><term>term-width="<replaceable>width</replaceable>"</term>
+ <listitem>
+
+<para>Specifies the term width (including units)</para>
+
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ </refsect1><refsect1 role="tcg"><title>Related Information in <link xlink:href="http://www.sagehill.net/docbookxsl/">DocBook XSL: The Complete Guide</link></title>
+
+<para><link role="tcg" xlink:href="Variablelists.html#VarListFormatting">Variable list formatting in HTML</link></para>
+
+ </refsect1></refentry>
+
+<refentry xmlns:xlink="http://www.w3.org/1999/xlink" xml:id="dbhtml_toc">
+<refnamediv>
+<refname>dbhtml_toc</refname>
+<refpurpose>Specifies whether a TOC should be generated for a qandaset</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+
+ <synopsis><tag class="xmlpi">dbhtml toc="0"|"1"</tag></synopsis>
+
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>Use the <tag class="xmlpi">dbhtml toc</tag> PI as a child of a
+ <tag>qandaset</tag> to specify whether a table of contents
+ (TOC) is generated for the <tag>qandaset</tag>.</para>
+
+ </refsect1><refsect1><title>Parameters</title>
+
+<variablelist>
+ <varlistentry><term>toc="0"</term>
+ <listitem>
+
+<para>If zero, no TOC is generated</para>
+
+ </listitem>
+ </varlistentry>
+ <varlistentry><term>toc="1"</term>
+ <listitem>
+
+<para>If <code>1</code> (or any non-zero value),
+ a TOC is generated</para>
+
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ </refsect1><refsect1 role="tcg"><title>Related Information in <link xlink:href="http://www.sagehill.net/docbookxsl/">DocBook XSL: The Complete Guide</link></title>
+
+<para><link role="tcg" xlink:href="QandAtoc.html">Q and A list of questions</link>,
+ <link role="tcg" xlink:href="QandAformat.html">Q and A formatting</link></para>
+
+ </refsect1></refentry>
+
+<refentry xmlns:xlink="http://www.w3.org/1999/xlink" xml:id="dbcmdlist">
+<refnamediv>
+<refname>dbcmdlist</refname>
+<refpurpose>Generates a hyperlinked list of commands</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+
+ <synopsis><tag class="xmlpi">dbcmdlist</tag></synopsis>
+
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>Use the <tag class="xmlpi">dbcmdlist</tag> PI as the child of any
+ element (for example, <tag>refsynopsisdiv</tag>) containing multiple
+ <tag>cmdsynopsis</tag> instances; a hyperlinked navigational
+ “command list†will be generated at the top of output for that
+ element, enabling users to quickly jump
+ to each command synopsis.</para>
+
+ </refsect1><refsect1><title>Parameters</title>
+
+<para>[No parameters]</para>
+
+ </refsect1></refentry>
+
+<refentry xmlns:xlink="http://www.w3.org/1999/xlink" xml:id="dbfunclist">
+<refnamediv>
+<refname>dbfunclist</refname>
+<refpurpose>Generates a hyperlinked list of functions</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+
+ <synopsis><tag class="xmlpi">dbfunclist</tag></synopsis>
+
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>Use the <tag class="xmlpi">dbfunclist</tag> PI as the child of any
+ element (for example, <tag>refsynopsisdiv</tag>) containing multiple
+ <tag>funcsynopsis</tag> instances; a hyperlinked
+ navigational “function list†will be generated at the top of
+ output for that element, enabling users to quickly
+ jump to to each function synopsis.</para>
+
+ </refsect1><refsect1><title>Parameters</title>
+
+<para>[No parameters]</para>
+
+ </refsect1></refentry>
+
+<refentry xmlns:xlink="http://www.w3.org/1999/xlink" xml:id="dbhtml-include_href">
+<refnamediv>
+<refname>dbhtml-include_href</refname>
+<refpurpose>Copies an external well-formed HTML/XML file into current doc</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+
+ <synopsis><tag class="xmlpi">dbhtml-include href="<replaceable>URI</replaceable>"</tag></synopsis>
+
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>Use the <tag class="xmlpi">dbhtml-include href</tag> PI anywhere in a
+ document to cause the contents of the file referenced by the
+ <code>href</code> pseudo-attribute to be copied/inserted “as
+ is†into your HTML output at the point in document order
+ where the PI occurs in the source.</para>
+
+ <note>
+
+<para>The referenced file may contain plain text (as long as
+ it is “wrapped†in an <tag>html</tag> element — see the
+ note below) or markup in any arbitrary vocabulary,
+ including HTML — but it must conform to XML
+ well-formedness constraints (because the feature in XSLT
+ 1.0 for opening external files, the
+ <function>document()</function> function, can only handle
+ files that meet XML well-formedness constraints).</para>
+
+
+<para>Among other things, XML well-formedness constraints
+ require a document to have <emphasis>a single root
+ element</emphasis>. So if the content you want to
+ include is plain text or is markup that does
+ <emphasis>not</emphasis> have a single root element,
+ <emphasis role="strong">wrap the content in an
+ <tag>html</tag> element</emphasis>. The stylesheets will
+ strip out that surrounding <tag>html</tag> “wrapper†when
+ they find it, leaving just the content you want to
+ insert.</para>
+
+ </note>
+ </refsect1><refsect1><title>Parameters</title>
+
+<variablelist>
+ <varlistentry><term>href="<replaceable>URI</replaceable>"</term>
+ <listitem>
+
+<para>Specifies the URI for the file to include; the URI
+ can be, for example, a remote <literal>http:</literal>
+ URI, or a local filesystem <literal>file:</literal>
+ URI</para>
+
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ </refsect1><refsect1 role="params"><title>Related Global Parameters</title>
+
+<para><parameter>textinsert.extension</parameter></para>
+
+ </refsect1><refsect1 role="tcg"><title>Related Information in <link xlink:href="http://www.sagehill.net/docbookxsl/">DocBook XSL: The Complete Guide</link></title>
+
+<para><link role="tcg" xlink:href="InsertExtHtml.html">Inserting external HTML code</link>,
+ <link role="tcg" xlink:href="ExternalCode.html">External code files</link></para>
+
+ </refsect1></refentry>
+
+<refentry xmlns:xlink="http://www.w3.org/1999/xlink" xml:id="dbhh">
+<refnamediv>
+<refname>dbhh</refname>
+<refpurpose>Sets topic name and topic id for context-sensitive HTML Help</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+
+ <synopsis><tag class="xmlpi">dbhh topicname="<replaceable>name</replaceable>" topicid="<replaceable>id</replaceable>"</tag></synopsis>
+
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>Use the <tag class="xmlpi">dbhh</tag> PI as a child of components
+ that should be used as targets for context-sensitive help requests.</para>
+
+ </refsect1><refsect1><title>Parameters</title>
+
+<variablelist>
+ <varlistentry><term>topicname="<replaceable>name</replaceable>"</term>
+ <listitem>
+
+<para>Specifies a unique string constant that identifies a help topic</para>
+
+ </listitem>
+ </varlistentry>
+ <varlistentry><term>topicid="<replaceable>id</replaceable>"</term>
+ <listitem>
+
+<para>Specifies a unique integer value for the <literal>topicname</literal> string</para>
+
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ </refsect1><refsect1 role="tcg"><title>Related Information in <link xlink:href="http://www.sagehill.net/docbookxsl/">DocBook XSL: The Complete Guide</link></title>
+
+<para><link role="tcg" xlink:href="HtmlHelp.html#HHContextHelp">Context-sensitive help</link></para>
+
+ </refsect1></refentry>
+</reference>
+
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/pi.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/pi.xsl
new file mode 100644
index 0000000..ac1345f
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/pi.xsl
@@ -0,0 +1,1263 @@
+<?xml version='1.0'?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:doc="http://nwalsh.com/xsl/documentation/1.0"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ exclude-result-prefixes="doc"
+ version='1.0'>
+
+<!-- ********************************************************************
+ $Id: pi.xsl 8394 2009-04-02 20:31:30Z mzjn $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<doc:reference xmlns=""><info><title>HTML Processing Instruction Reference</title>
+ <releaseinfo role="meta">
+ $Id: pi.xsl 8394 2009-04-02 20:31:30Z mzjn $
+ </releaseinfo>
+ </info>
+ <partintro xml:id="partintro">
+ <title>Introduction</title>
+ <para>This is generated reference documentation for all
+ user-specifiable processing instructions (PIs) in the DocBook
+ XSL stylesheets for HTML output.
+ <note>
+ <para>You add these PIs at particular points in a document to
+ cause specific “exceptions†to formatting/output behavior. To
+ make global changes in formatting/output behavior across an
+ entire document, it’s better to do it by setting an
+ appropriate stylesheet parameter (if there is one).</para>
+ </note>
+ </para>
+ </partintro>
+</doc:reference>
+
+<!-- ==================================================================== -->
+
+<doc:pi name="dbhtml_background-color" xmlns="">
+ <refpurpose>Sets background color for an image</refpurpose>
+ <refdescription>
+ <para>Use the <tag class="xmlpi">dbhtml background-color</tag> PI before or
+ after an image (<tag>graphic</tag>, <tag>inlinegraphic</tag>,
+ <tag>imagedata</tag>, or <tag>videodata</tag> element) as a
+ sibling to the element, to set a background color for the
+ image.</para>
+ </refdescription>
+ <refsynopsisdiv>
+ <synopsis><tag class="xmlpi">dbhtml background-color="<replaceable>color</replaceable>"</tag></synopsis>
+ </refsynopsisdiv>
+ <refparameter>
+ <variablelist>
+ <varlistentry><term>background-color="<replaceable>color</replaceable>"</term>
+ <listitem>
+ <para>An HTML color value</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+ <refsee role="tcg">
+ <para><link role="tcg"
+ xlink:href="BGcolor.html"
+ >Background color</link></para>
+ </refsee>
+</doc:pi>
+<xsl:template name="pi.dbhtml_background-color">
+ <xsl:param name="node" select="."/>
+ <xsl:call-template name="dbhtml-attribute">
+ <xsl:with-param name="pis" select="$node/processing-instruction('dbhtml')"/>
+ <xsl:with-param name="attribute" select="'background-color'"/>
+ </xsl:call-template>
+</xsl:template>
+
+<doc:pi name="dbhtml_bgcolor" xmlns="">
+ <refpurpose>Sets background color on a CALS table row or table cell</refpurpose>
+ <refdescription>
+ <para>Use the <tag class="xmlpi">dbhtml bgcolor</tag> PI as child of a CALS table row
+ or cell to set a background color for that table row or cell.</para>
+ </refdescription>
+ <refsynopsisdiv>
+ <synopsis><tag class="xmlpi">dbhtml bgcolor="<replaceable>color</replaceable>"</tag></synopsis>
+ </refsynopsisdiv>
+ <refparameter>
+ <variablelist>
+ <varlistentry><term>bgcolor="<replaceable>color</replaceable>"</term>
+ <listitem>
+ <para>An HTML color value</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+ <refsee role="tcg">
+ <para><link role="tcg"
+ xlink:href="BGtableColor.html#CellBGColor"
+ >Cell background color</link></para>
+ </refsee>
+</doc:pi>
+<xsl:template name="pi.dbhtml_bgcolor">
+ <xsl:param name="node" select="."/>
+ <xsl:call-template name="dbhtml-attribute">
+ <xsl:with-param name="pis" select="$node/processing-instruction('dbhtml')"/>
+ <xsl:with-param name="attribute" select="'bgcolor'"/>
+ </xsl:call-template>
+</xsl:template>
+
+<doc:pi name="dbhtml_cellpadding" xmlns="">
+ <refpurpose>Specifies cellpadding in CALS table or qandaset output</refpurpose>
+ <refdescription>
+ <para>Use the <tag class="xmlpi">dbhtml cellpadding</tag> PI as a child of a
+ CALS <tag>table</tag> or <tag>qandaset</tag> to specify the value
+ for the HTML <literal>cellpadding</literal> attribute in the
+ output HTML table.</para>
+ </refdescription>
+ <refsynopsisdiv>
+ <synopsis><tag class="xmlpi">dbhtml cellpadding="<replaceable>number</replaceable>"</tag></synopsis>
+ </refsynopsisdiv>
+ <refparameter>
+ <variablelist>
+ <varlistentry><term>cellpadding="<replaceable>number</replaceable>"</term>
+ <listitem>
+ <para>Specifies the cellpadding</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+ <refsee role="params">
+ <para><parameter>html.cellpadding</parameter></para>
+ </refsee>
+ <refsee role="tcg">
+ <para><link role="tcg"
+ xlink:href="CellSpacing.html"
+ >Cell spacing and cell padding</link>,
+ <link role="tcg" xlink:href="QandAformat.html"
+ >Q and A formatting</link></para>
+ </refsee>
+</doc:pi>
+<xsl:template name="pi.dbhtml_cellpadding">
+ <xsl:param name="node" select="."/>
+ <xsl:call-template name="dbhtml-attribute">
+ <xsl:with-param name="pis" select="$node/processing-instruction('dbhtml')"/>
+ <xsl:with-param name="attribute" select="'cellpadding'"/>
+ </xsl:call-template>
+</xsl:template>
+
+<doc:pi name="dbhtml_cellspacing" xmlns="">
+ <refpurpose>Specifies cellspacing in CALS table or qandaset output</refpurpose>
+ <refdescription>
+ <para>Use the <tag class="xmlpi">dbhtml cellspacing</tag> PI as a child of a
+ CALS <tag>table</tag> or <tag>qandaset</tag> to specify the value
+ for the HTML <literal>cellspacing</literal> attribute in the
+ output HTML table.</para>
+ </refdescription>
+ <refsynopsisdiv>
+ <synopsis><tag class="xmlpi">dbhtml cellspacing="<replaceable>number</replaceable>"</tag></synopsis>
+ </refsynopsisdiv>
+ <refparameter>
+ <variablelist>
+ <varlistentry><term>cellspacing="<replaceable>number</replaceable>"</term>
+ <listitem>
+ <para>Specifies the cellspacing</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+ <refsee role="params">
+ <para><parameter>html.cellspacing</parameter></para>
+ </refsee>
+ <refsee role="tcg">
+ <para><link role="tcg"
+ xlink:href="CellSpacing.html"
+ >Cell spacing and cell padding</link>,
+ <link role="tcg"
+ xlink:href="QandAformat.html"
+ >Q and A formatting</link></para>
+ </refsee>
+</doc:pi>
+<xsl:template name="pi.dbhtml_cellspacing">
+ <xsl:param name="node" select="."/>
+ <xsl:call-template name="dbhtml-attribute">
+ <xsl:with-param name="pis" select="$node/processing-instruction('dbhtml')"/>
+ <xsl:with-param name="attribute" select="'cellspacing'"/>
+ </xsl:call-template>
+</xsl:template>
+
+<doc:pi name="dbhtml_class" xmlns="">
+ <refpurpose>Set value of the class attribute for a CALS table row</refpurpose>
+ <refdescription>
+ <para>Use the <tag class="xmlpi">dbhtml class</tag> PI as a child of a
+ <tag>row</tag> to specify a <literal>class</literal>
+ attribute and value in the HTML output for that row.</para>
+ </refdescription>
+ <refsynopsisdiv>
+ <synopsis><tag class="xmlpi">dbhtml class="<replaceable>name</replaceable>"</tag></synopsis>
+ </refsynopsisdiv>
+ <refparameter>
+ <variablelist>
+ <varlistentry><term>class="<replaceable>name</replaceable>"</term>
+ <listitem>
+ <para>Specifies the class name</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+ <refsee role="tcg">
+ <para><link role="tcg"
+ xlink:href="CSSTableCells.html"
+ >Table styles in HTML output</link></para>
+ </refsee>
+</doc:pi>
+<xsl:template name="pi.dbhtml_class">
+ <xsl:param name="node" select="."/>
+ <xsl:call-template name="dbhtml-attribute">
+ <xsl:with-param name="pis" select="$node/processing-instruction('dbhtml')"/>
+ <xsl:with-param name="attribute" select="'class'"/>
+ </xsl:call-template>
+</xsl:template>
+
+<doc:pi name="dbhtml_dir" xmlns="">
+ <refpurpose>Specifies a directory name in which to write files</refpurpose>
+ <refdescription>
+ <para>When chunking output, use the <tag class="xmlpi">dbhtml dir</tag> PI
+ as a child of a chunk source to cause the output of that
+ chunk to be written to the specified directory; also, use it
+ as a child of a <tag>mediaobject</tag> to specify a
+ directory into which any long-description files for that
+ <tag>mediaobject</tag> will be written.</para>
+ </refdescription>
+ <refsynopsisdiv>
+ <synopsis><tag class="xmlpi">dbhtml dir="<replaceable>path</replaceable>"</tag></synopsis>
+ </refsynopsisdiv>
+ <refparameter>
+ <variablelist>
+ <varlistentry><term>dir="<replaceable>path</replaceable>"</term>
+ <listitem>
+ <para>Specifies the pathname for the directory</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+ <refsee role="params">
+ <para><parameter>base.dir</parameter></para>
+ </refsee>
+ <refsee role="tcg">
+ <para><link role="tcg"
+ xlink:href="Chunking.html#dbhtmlDirPI"
+ >dbhtml dir processing instruction</link></para>
+ </refsee>
+</doc:pi>
+<xsl:template name="pi.dbhtml_dir">
+ <xsl:param name="node" select="."/>
+ <xsl:call-template name="dbhtml-attribute">
+ <xsl:with-param name="pis" select="$node/processing-instruction('dbhtml')"/>
+ <xsl:with-param name="attribute" select="'dir'"/>
+ </xsl:call-template>
+</xsl:template>
+
+<doc:pi name="dbhtml_filename" xmlns="">
+ <refpurpose>Specifies a filename for a chunk</refpurpose>
+ <refdescription>
+ <para>When chunking output, use the <tag class="xmlpi">dbhtml filename</tag>
+ PI as a child of a chunk source to specify a filename for
+ the output file for that chunk.</para>
+ </refdescription>
+ <refsynopsisdiv>
+ <synopsis><tag class="xmlpi">dbhtml filename="<replaceable>filename</replaceable>"</tag></synopsis>
+ </refsynopsisdiv>
+ <refparameter>
+ <variablelist>
+ <varlistentry><term>filename="<replaceable>path</replaceable>"</term>
+ <listitem>
+ <para>Specifies the filename for the file</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+ <refsee role="params">
+ <para><parameter>use.id.as.filename</parameter></para>
+ </refsee>
+ <refsee role="tcg">
+ <para><link role="tcg"
+ xlink:href="Chunking.html#DbhtmlFilenames"
+ >dbhtml filenames</link></para>
+ </refsee>
+</doc:pi>
+<xsl:template name="pi.dbhtml_filename">
+ <xsl:param name="node" select="."/>
+ <xsl:call-template name="dbhtml-attribute">
+ <xsl:with-param name="pis" select="$node/processing-instruction('dbhtml')"/>
+ <xsl:with-param name="attribute" select="'filename'"/>
+ </xsl:call-template>
+</xsl:template>
+
+<doc:pi name="dbhtml_funcsynopsis-style" xmlns="">
+ <refpurpose>Specifies presentation style for a funcsynopsis</refpurpose>
+ <refdescription>
+ <para>Use the <tag class="xmlpi">dbhtml funcsynopsis-style</tag> PI as a child of
+ a <tag>funcsynopsis</tag> or anywhere within a funcsynopsis
+ to control the presentation style for output of all
+ <tag>funcprototype</tag> instances within that funcsynopsis.</para>
+ </refdescription>
+ <refsynopsisdiv>
+ <synopsis><tag class="xmlpi">dbhtml funcsynopsis-style="kr"|"ansi"</tag></synopsis>
+ </refsynopsisdiv>
+ <refparameter>
+ <variablelist>
+ <varlistentry><term>funcsynopsis-style="kr"</term>
+ <listitem>
+ <para>Displays <tag>funcprototype</tag> output in K&amp;R style</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry><term>funcsynopsis-style="ansi"</term>
+ <listitem>
+ <para>Displays <tag>funcprototype</tag> output in ANSI style</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+ <refsee role="params">
+ <para><parameter>funcsynopsis.style</parameter></para>
+ </refsee>
+</doc:pi>
+<xsl:template name="pi.dbhtml_funcsynopsis-style">
+ <xsl:param name="node" select="."/>
+ <xsl:call-template name="dbhtml-attribute">
+ <xsl:with-param name="pis" select="$node/processing-instruction('dbhtml')"/>
+ <xsl:with-param name="attribute" select="'funcsynopsis-style'"/>
+ </xsl:call-template>
+</xsl:template>
+
+<doc:pi name="dbhtml_img.src.path" xmlns="">
+ <refpurpose>Specifies a path to the location of an image file</refpurpose>
+ <refdescription>
+ <para>Use the <tag class="xmlpi">dbhtml img.src.path</tag> PI before or
+ after an image (<tag>graphic</tag>,
+ <tag>inlinegraphic</tag>, <tag>imagedata</tag>, or
+ <tag>videodata</tag> element) as a sibling to the element,
+ to specify a path to the location of the image; in HTML
+ output, the value specified for the
+ <code>img.src.path</code> attribute is prepended to the
+ filename.</para>
+ </refdescription>
+ <refsynopsisdiv>
+ <synopsis><tag class="xmlpi">dbhtml img.src.path="<replaceable>path</replaceable>"</tag></synopsis>
+ </refsynopsisdiv>
+ <refparameter>
+ <variablelist>
+ <varlistentry><term>img.src.path="<replaceable>path</replaceable>"</term>
+ <listitem>
+ <para>Specifies the pathname to prepend to the name of the image file</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+ <refsee role="params">
+ <para><parameter>img.src.path</parameter></para>
+ </refsee>
+ <refsee role="tcg">
+ <para><link role="tcg"
+ xlink:href="GraphicsLocations.html#UsingFileref"
+ >Using fileref</link></para>
+ </refsee>
+</doc:pi>
+<xsl:template name="pi.dbhtml_img.src.path">
+ <xsl:param name="node" select="."/>
+ <xsl:call-template name="dbhtml-attribute">
+ <xsl:with-param name="pis" select="$node/processing-instruction('dbhtml')"/>
+ <xsl:with-param name="attribute" select="'img.src.path'"/>
+ </xsl:call-template>
+</xsl:template>
+
+<doc:pi name="dbhtml_label-width" xmlns="">
+ <refpurpose>Specifies the label width for a qandaset</refpurpose>
+ <refdescription>
+ <para>Use the <tag class="xmlpi">dbhtml label-width</tag> PI as a child of a
+ <tag>qandaset</tag> to specify the width of labels.</para>
+ </refdescription>
+ <refsynopsisdiv>
+ <synopsis><tag class="xmlpi">dbhtml label-width="<replaceable>width</replaceable>"</tag></synopsis>
+ </refsynopsisdiv>
+ <refparameter>
+ <variablelist>
+ <varlistentry><term>label-width="<replaceable>width</replaceable>"</term>
+ <listitem>
+ <para>Specifies the label width (including units)</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+ <refsee role="tcg">
+ <para><link role="tcg"
+ xlink:href="QandAformat.html"
+ >Q and A formatting</link></para>
+ </refsee>
+</doc:pi>
+<xsl:template name="pi.dbhtml_label-width">
+ <xsl:param name="node" select="."/>
+ <xsl:call-template name="dbhtml-attribute">
+ <xsl:with-param name="pis" select="$node/processing-instruction('dbhtml')"/>
+ <xsl:with-param name="attribute" select="'label-width'"/>
+ </xsl:call-template>
+</xsl:template>
+
+<doc:pi name="dbhtml_linenumbering.everyNth" xmlns="">
+ <refpurpose>Specifies interval for line numbers in verbatims</refpurpose>
+ <refdescription>
+ <para>Use the <tag class="xmlpi">dbhtml linenumbering.everyNth</tag> PI as a child
+ of a “verbatim†element – <tag>programlisting</tag>,
+ <tag>screen</tag>, <tag>synopsis</tag> — to specify
+ the interval at which lines are numbered.</para>
+ </refdescription>
+ <refsynopsisdiv>
+ <synopsis><tag class="xmlpi">dbhtml linenumbering.everyNth="<replaceable>N</replaceable>"</tag></synopsis>
+ </refsynopsisdiv>
+ <refparameter>
+ <variablelist>
+ <varlistentry><term>linenumbering.everyNth="<replaceable>N</replaceable>"</term>
+ <listitem>
+ <para>Specifies numbering interval; a number is output
+ before every <replaceable>N</replaceable>th line</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+ <refsee role="params">
+ <para><parameter>linenumbering.everyNth</parameter></para>
+ </refsee>
+ <refsee role="tcg">
+ <para><link role="tcg"
+ xlink:href="AnnotateListing.html#LineNumbering"
+ >Line numbering</link></para>
+ </refsee>
+</doc:pi>
+<xsl:template name="pi.dbhtml_linenumbering.everyNth">
+ <xsl:param name="node" select="."/>
+ <xsl:call-template name="dbhtml-attribute">
+ <xsl:with-param name="pis" select="$node/processing-instruction('dbhtml')"/>
+ <xsl:with-param name="attribute" select="'linenumbering.everyNth'"/>
+ </xsl:call-template>
+</xsl:template>
+
+<doc:pi name="dbhtml_linenumbering.separator" xmlns="">
+ <refpurpose>Specifies separator text for line numbers in verbatims</refpurpose>
+ <refdescription>
+ <para>Use the <tag class="xmlpi">dbhtml linenumbering.separator</tag> PI as a child
+ of a “verbatim†element – <tag>programlisting</tag>,
+ <tag>screen</tag>, <tag>synopsis</tag> — to specify
+ the separator text output between the line numbers and content.</para>
+ </refdescription>
+ <refsynopsisdiv>
+ <synopsis><tag class="xmlpi">dbhtml linenumbering.separator="<replaceable>text</replaceable>"</tag></synopsis>
+ </refsynopsisdiv>
+ <refparameter>
+ <variablelist>
+ <varlistentry><term>linenumbering.separator="<replaceable>text</replaceable>"</term>
+ <listitem>
+ <para>Specifies the text (zero or more characters)</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+ <refsee role="params">
+ <para><parameter>linenumbering.separator</parameter></para>
+ </refsee>
+ <refsee role="tcg">
+ <para><link role="tcg"
+ xlink:href="AnnotateListing.html#LineNumbering"
+ >Line numbering</link></para>
+ </refsee>
+</doc:pi>
+<xsl:template name="pi.dbhtml_linenumbering.separator">
+ <xsl:param name="node" select="."/>
+ <xsl:call-template name="dbhtml-attribute">
+ <xsl:with-param name="pis" select="$node/processing-instruction('dbhtml')"/>
+ <xsl:with-param name="attribute" select="'linenumbering.separator'"/>
+ </xsl:call-template>
+</xsl:template>
+
+<doc:pi name="dbhtml_linenumbering.width" xmlns="">
+ <refpurpose>Specifies width for line numbers in verbatims</refpurpose>
+ <refdescription>
+ <para>Use the <tag class="xmlpi">dbhtml linenumbering.width</tag> PI as a child
+ of a “verbatim†element – <tag>programlisting</tag>,
+ <tag>screen</tag>, <tag>synopsis</tag> — to specify
+ the width set aside for line numbers.</para>
+ </refdescription>
+ <refsynopsisdiv>
+ <synopsis><tag class="xmlpi">dbhtml linenumbering.width="<replaceable>width</replaceable>"</tag></synopsis>
+ </refsynopsisdiv>
+ <refparameter>
+ <variablelist>
+ <varlistentry><term>linenumbering.width="<replaceable>width</replaceable>"</term>
+ <listitem>
+ <para>Specifies the width (inluding units)</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+ <refsee role="params">
+ <para><parameter>linenumbering.width</parameter></para>
+ </refsee>
+ <refsee role="tcg">
+ <para><link role="tcg"
+ xlink:href="AnnotateListing.html#LineNumbering"
+ >Line numbering</link></para>
+ </refsee>
+</doc:pi>
+<xsl:template name="pi.dbhtml_linenumbering.width">
+ <xsl:param name="node" select="."/>
+ <xsl:call-template name="dbhtml-attribute">
+ <xsl:with-param name="pis" select="$node/processing-instruction('dbhtml')"/>
+ <xsl:with-param name="attribute" select="'linenumbering.width'"/>
+ </xsl:call-template>
+</xsl:template>
+
+<doc:pi name="dbhtml_list-presentation" xmlns="">
+ <refpurpose>Specifies presentation style for a variablelist or
+ segmentedlist</refpurpose>
+ <refdescription>
+ <para>Use the <tag class="xmlpi">dbhtml list-presentation</tag> PI as a child of
+ a <tag>variablelist</tag> or <tag>segmentedlist</tag> to
+ control the presentation style for the list (to cause it, for
+ example, to be displayed as a table).</para>
+ </refdescription>
+ <refsynopsisdiv>
+ <synopsis><tag class="xmlpi">dbhtml list-presentation="list"|"table"</tag></synopsis>
+ </refsynopsisdiv>
+ <refparameter>
+ <variablelist>
+ <varlistentry><term>list-presentation="list"</term>
+ <listitem>
+ <para>Displays the list as a list</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry><term>list-presentation="table"</term>
+ <listitem>
+ <para>Displays the list as a table</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+ <refsee role="params">
+ <itemizedlist>
+ <listitem>
+ <para><parameter>variablelist.as.table</parameter></para>
+ </listitem>
+ <listitem>
+ <para><parameter>segmentedlist.as.table</parameter></para>
+ </listitem>
+ </itemizedlist>
+ </refsee>
+ <refsee role="tcg">
+ <para><link role="tcg"
+ xlink:href="Variablelists.html#VarListFormatting"
+ >Variable list formatting in HTML</link></para>
+ </refsee>
+</doc:pi>
+<xsl:template name="pi.dbhtml_list-presentation">
+ <xsl:param name="node" select="."/>
+ <xsl:call-template name="dbhtml-attribute">
+ <xsl:with-param name="pis" select="$node/processing-instruction('dbhtml')"/>
+ <xsl:with-param name="attribute" select="'list-presentation'"/>
+ </xsl:call-template>
+</xsl:template>
+
+<doc:pi name="dbhtml_list-width" xmlns="">
+ <refpurpose>Specifies the width of a variablelist or simplelist</refpurpose>
+ <refdescription>
+ <para>Use the <tag class="xmlpi">dbhtml list-width</tag> PI as a child of a
+ <tag>variablelist</tag> or a <tag>simplelist</tag> presented
+ as a table, to specify the output width.</para>
+ </refdescription>
+ <refsynopsisdiv>
+ <synopsis><tag class="xmlpi">dbhtml list-width="<replaceable>width</replaceable>"</tag></synopsis>
+ </refsynopsisdiv>
+ <refparameter>
+ <variablelist>
+ <varlistentry><term>list-width="<replaceable>width</replaceable>"</term>
+ <listitem>
+ <para>Specifies the output width (including units)</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+ <refsee role="tcg">
+ <para><link role="tcg"
+ xlink:href="Variablelists.html#VarListFormatting"
+ >Variable list formatting in HTML</link></para>
+ </refsee>
+</doc:pi>
+<xsl:template name="pi.dbhtml_list-width">
+ <xsl:param name="node" select="."/>
+ <xsl:call-template name="dbhtml-attribute">
+ <xsl:with-param name="pis" select="$node/processing-instruction('dbhtml')"/>
+ <xsl:with-param name="attribute" select="'list-width'"/>
+ </xsl:call-template>
+</xsl:template>
+
+<doc:pi name="dbhtml_row-height" xmlns="">
+ <refpurpose>Specifies the height for a CALS table row</refpurpose>
+ <refdescription>
+ <para>Use the <tag class="xmlpi">dbhtml row-height</tag> PI as a child of a
+ <tag>row</tag> to specify the height of the row.</para>
+ </refdescription>
+ <refsynopsisdiv>
+ <synopsis><tag class="xmlpi">dbhtml row-height="<replaceable>height</replaceable>"</tag></synopsis>
+ </refsynopsisdiv>
+ <refparameter>
+ <variablelist>
+ <varlistentry><term>row-height="<replaceable>height</replaceable>"</term>
+ <listitem>
+ <para>Specifies the row height (including units)</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+ <refsee role="tcg">
+ <para><link role="tcg"
+ xlink:href="RowHeight.html"
+ >Row height</link></para>
+ </refsee>
+</doc:pi>
+<xsl:template name="pi.dbhtml_row-height">
+ <xsl:param name="node" select="."/>
+ <xsl:call-template name="dbhtml-attribute">
+ <xsl:with-param name="pis" select="$node/processing-instruction('dbhtml')"/>
+ <xsl:with-param name="attribute" select="'row-height'"/>
+ </xsl:call-template>
+</xsl:template>
+
+<doc:pi name="dbhtml_start" xmlns="">
+ <refpurpose>(obsolete) Sets the starting number on an ordered list</refpurpose>
+ <refdescription>
+ <para><emphasis>This PI is obsolete</emphasis>. The intent of
+ this PI was to provide a means for setting a specific starting
+ number for an ordered list. Instead of this PI, set a value
+ for the <literal>override</literal> attribute on the first
+ <tag>listitem</tag> in the list; that will have the same
+ effect as what this PI was intended for.</para>
+ </refdescription>
+ <refsynopsisdiv>
+ <synopsis><tag class="xmlpi">dbhtml start="<replaceable>character</replaceable>"</tag></synopsis>
+ </refsynopsisdiv>
+ <refparameter>
+ <variablelist>
+ <varlistentry><term>start="<replaceable>character</replaceable>"</term>
+ <listitem>
+ <para>Specifies the character to use as the starting
+ number; use 0-9, a-z, A-Z, or lowercase or uppercase
+ Roman numerals</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+ <refsee role="tcg">
+ <para><link role="tcg"
+ xlink:href="Orderedlists.html#ListStartNum"
+ >List starting number</link></para>
+ </refsee>
+</doc:pi>
+<xsl:template name="pi.dbhtml_start">
+ <xsl:param name="node" select="."/>
+ <xsl:call-template name="pi-attribute">
+ <xsl:with-param name="pis" select="$node/processing-instruction('dbhtml')"/>
+ <xsl:with-param name="attribute" select="'start'"/>
+ </xsl:call-template>
+</xsl:template>
+
+ <doc:pi name="dbhtml_stop-chunking" xmlns="">
+ <refpurpose>Do not chunk any descendants of this element.</refpurpose>
+ <refdescription>
+ <para>When generating chunked HTML output, adding this PI as the child of an element that contains elements that would normally be generated on separate pages if generating chunked output causes chunking to stop at this point. No descendants of the current element will be split into new HTML pages:
+<programlisting><![CDATA[<section>
+<title>Configuring pencil</title>
+<?dbhtml stop-chunking?>
+
+...
+
+</section>]]></programlisting>
+</para>
+ </refdescription>
+ <refsynopsisdiv>
+ <synopsis><tag class="xmlpi">dbhtml stop-chunking</tag></synopsis>
+ </refsynopsisdiv>
+ <refsee role="tcg">
+ <para><link role="tcg"
+ xlink:href="Chunking.html"
+ >Chunking into multiple HTML files</link></para>
+ </refsee>
+ </doc:pi>
+ <!-- The code that handles the stop-chunking pi is in chunk-common.xsl -->
+
+<doc:pi name="dbhtml_table-summary" xmlns="">
+ <refpurpose>Specifies summary for CALS table, variablelist, segmentedlist, or qandaset output</refpurpose>
+ <refdescription>
+ <para>Use the <tag class="xmlpi">dbhtml table-summary</tag> PI as a child of
+ a CALS <tag>table</tag>, <tag>variablelist</tag>,
+ <tag>segmentedlist</tag>, or <tag>qandaset</tag> to specify
+ the text for the HTML <literal>summary</literal> attribute
+ in the output HTML table.</para>
+ </refdescription>
+ <refsynopsisdiv>
+ <synopsis><tag class="xmlpi">dbhtml table-summary="<replaceable>text</replaceable>"</tag></synopsis>
+ </refsynopsisdiv>
+ <refparameter>
+ <variablelist>
+ <varlistentry><term>table-summary="<replaceable>text</replaceable>"</term>
+ <listitem>
+ <para>Specifies the summary text (zero or more characters)</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+ <refsee role="tcg">
+ <para><link role="tcg"
+ xlink:href="Variablelists.html#VarListFormatting"
+ >Variable list formatting in HTML</link>,
+ <link role="tcg" xlink:href="TableSummary.html"
+ >Table summary text</link></para>
+ </refsee>
+</doc:pi>
+<xsl:template name="pi.dbhtml_table-summary">
+ <xsl:param name="node" select="."/>
+ <xsl:call-template name="dbhtml-attribute">
+ <xsl:with-param name="pis" select="$node/processing-instruction('dbhtml')"/>
+ <xsl:with-param name="attribute" select="'table-summary'"/>
+ </xsl:call-template>
+</xsl:template>
+
+<doc:pi name="dbhtml_table-width" xmlns="">
+ <refpurpose>Specifies the width for a CALS table</refpurpose>
+ <refdescription>
+ <para>Use the <tag class="xmlpi">dbhtml table-width</tag> PI as a child of a
+ CALS <tag>table</tag> to specify the width of the table in
+ output.</para>
+ </refdescription>
+ <refsynopsisdiv>
+ <synopsis><tag class="xmlpi">dbhtml table-width="<replaceable>width</replaceable>"</tag></synopsis>
+ </refsynopsisdiv>
+ <refparameter>
+ <variablelist>
+ <varlistentry><term>table-width="<replaceable>width</replaceable>"</term>
+ <listitem>
+ <para>Specifies the table width (including units or as a percentage)</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+ <refsee role="params">
+ <para><parameter>default.table.width</parameter></para>
+ </refsee>
+ <refsee role="tcg">
+ <para><link role="tcg"
+ xlink:href="Tables.html#TableWidth"
+ >Table width</link></para>
+ </refsee>
+</doc:pi>
+<xsl:template name="pi.dbhtml_table-width">
+ <xsl:param name="node" select="."/>
+ <xsl:call-template name="dbhtml-attribute">
+ <xsl:with-param name="pis" select="$node/processing-instruction('dbhtml')"/>
+ <xsl:with-param name="attribute" select="'table-width'"/>
+ </xsl:call-template>
+</xsl:template>
+
+<doc:pi name="dbhtml_term-presentation" xmlns="">
+ <refpurpose>Sets character formatting for terms in a variablelist</refpurpose>
+ <refdescription>
+ <para>Use the <tag class="xmlpi">dbhtml term-presentation</tag> PI as a child
+ of a <tag>variablelist</tag> to set character formatting for
+ the <tag>term</tag> output of the list.</para>
+ </refdescription>
+ <refsynopsisdiv>
+ <synopsis><tag class="xmlpi">dbhtml term-presentation="bold"|"italic"|"bold-italic"</tag></synopsis>
+ </refsynopsisdiv>
+ <refparameter>
+ <variablelist>
+ <varlistentry><term>term-presentation="<replaceable>bold</replaceable>"</term>
+ <listitem>
+ <para>Specifies that terms are displayed in bold</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry><term>term-presentation="<replaceable>italic</replaceable>"</term>
+ <listitem>
+ <para>Specifies that terms are displayed in italic</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry><term>term-presentation="<replaceable>bold-italic</replaceable>"</term>
+ <listitem>
+ <para>Specifies that terms are displayed in bold-italic</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+ <refsee role="tcg">
+ <para><link role="tcg"
+ xlink:href="Variablelists.html#VarListFormatting"
+ >Variable list formatting in HTML</link></para>
+ </refsee>
+</doc:pi>
+<xsl:template name="pi.dbhtml_term-presentation">
+ <xsl:param name="node" select="."/>
+ <xsl:call-template name="dbhtml-attribute">
+ <xsl:with-param name="pis" select="$node/processing-instruction('dbhtml')"/>
+ <xsl:with-param name="attribute" select="'term-presentation'"/>
+ </xsl:call-template>
+</xsl:template>
+
+<doc:pi name="dbhtml_term-separator" xmlns="">
+ <refpurpose>Specifies separator text among terms in a varlistentry</refpurpose>
+ <refdescription>
+ <para>Use the <tag class="xmlpi">dbhtml term-separator</tag> PI as a child
+ of a <tag>variablelist</tag> to specify the separator text
+ among <tag>term</tag> instances.</para>
+ </refdescription>
+ <refsynopsisdiv>
+ <synopsis><tag class="xmlpi">dbhtml term-separator="<replaceable>text</replaceable>"</tag></synopsis>
+ </refsynopsisdiv>
+ <refparameter>
+ <variablelist>
+ <varlistentry><term>term-separator="<replaceable>text</replaceable>"</term>
+ <listitem>
+ <para>Specifies the text (zero or more characters)</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+ <refsee role="params">
+ <para><parameter>variablelist.term.separator</parameter></para>
+ </refsee>
+ <refsee role="tcg">
+ <para><link role="tcg"
+ xlink:href="Variablelists.html#VarListFormatting"
+ >Variable list formatting in HTML</link></para>
+ </refsee>
+</doc:pi>
+<xsl:template name="pi.dbhtml_term-separator">
+ <xsl:param name="node" select="."/>
+ <xsl:call-template name="dbhtml-attribute">
+ <xsl:with-param name="pis" select="$node/processing-instruction('dbhtml')"/>
+ <xsl:with-param name="attribute" select="'term-separator'"/>
+ </xsl:call-template>
+</xsl:template>
+
+<doc:pi name="dbhtml_term-width" xmlns="">
+ <refpurpose>Specifies the term width for a variablelist</refpurpose>
+ <refdescription>
+ <para>Use the <tag class="xmlpi">dbhtml term-width</tag> PI as a child of a
+ <tag>variablelist</tag> to specify the width for
+ <tag>term</tag> output.</para>
+ </refdescription>
+ <refsynopsisdiv>
+ <synopsis><tag class="xmlpi">dbhtml term-width="<replaceable>width</replaceable>"</tag></synopsis>
+ </refsynopsisdiv>
+ <refparameter>
+ <variablelist>
+ <varlistentry><term>term-width="<replaceable>width</replaceable>"</term>
+ <listitem>
+ <para>Specifies the term width (including units)</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+ <refsee role="tcg">
+ <para><link role="tcg"
+ xlink:href="Variablelists.html#VarListFormatting"
+ >Variable list formatting in HTML</link></para>
+ </refsee>
+</doc:pi>
+<xsl:template name="pi.dbhtml_term-width">
+ <xsl:param name="node" select="."/>
+ <xsl:call-template name="dbhtml-attribute">
+ <xsl:with-param name="pis" select="$node/processing-instruction('dbhtml')"/>
+ <xsl:with-param name="attribute" select="'term-width'"/>
+ </xsl:call-template>
+</xsl:template>
+
+<doc:pi name="dbhtml_toc" xmlns="">
+ <refpurpose>Specifies whether a TOC should be generated for a qandaset</refpurpose>
+ <refdescription>
+ <para>Use the <tag class="xmlpi">dbhtml toc</tag> PI as a child of a
+ <tag>qandaset</tag> to specify whether a table of contents
+ (TOC) is generated for the <tag>qandaset</tag>.</para>
+ </refdescription>
+ <refsynopsisdiv>
+ <synopsis><tag class="xmlpi">dbhtml toc="0"|"1"</tag></synopsis>
+ </refsynopsisdiv>
+ <refparameter>
+ <variablelist>
+ <varlistentry><term>toc="0"</term>
+ <listitem>
+ <para>If zero, no TOC is generated</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry><term>toc="1"</term>
+ <listitem>
+ <para>If <code>1</code> (or any non-zero value),
+ a TOC is generated</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+ <refsee role="tcg">
+ <para><link role="tcg"
+ xlink:href="QandAtoc.html"
+ >Q and A list of questions</link>,
+ <link role="tcg"
+ xlink:href="QandAformat.html"
+ >Q and A formatting</link></para>
+ </refsee>
+</doc:pi>
+<xsl:template name="pi.dbhtml_toc">
+ <xsl:param name="node" select="."/>
+ <xsl:call-template name="dbhtml-attribute">
+ <xsl:with-param name="pis" select="$node/processing-instruction('dbhtml')"/>
+ <xsl:with-param name="attribute" select="'toc'"/>
+ </xsl:call-template>
+</xsl:template>
+
+<doc:pi name="dbcmdlist" xmlns="">
+ <refpurpose>Generates a hyperlinked list of commands</refpurpose>
+ <refdescription>
+ <para>Use the <tag class="xmlpi">dbcmdlist</tag> PI as the child of any
+ element (for example, <tag>refsynopsisdiv</tag>) containing multiple
+ <tag>cmdsynopsis</tag> instances; a hyperlinked navigational
+ “command list†will be generated at the top of output for that
+ element, enabling users to quickly jump
+ to each command synopsis.</para>
+ </refdescription>
+ <refsynopsisdiv>
+ <synopsis><tag class="xmlpi">dbcmdlist</tag></synopsis>
+ </refsynopsisdiv>
+ <refparameter>
+ <para>[No parameters]</para>
+ </refparameter>
+</doc:pi>
+<xsl:template name="pi.dbcmdlist">
+ <xsl:variable name="cmdsynopses" select="..//cmdsynopsis"/>
+ <xsl:if test="count($cmdsynopses)&lt;1">
+ <xsl:message><xsl:text>No cmdsynopsis elements matched dbcmdlist PI, perhaps it's nested too deep?</xsl:text>
+ </xsl:message>
+ </xsl:if>
+ <dl>
+ <xsl:call-template name="process.cmdsynopsis.list">
+ <xsl:with-param name="cmdsynopses" select="$cmdsynopses"/>
+ </xsl:call-template>
+ </dl>
+</xsl:template>
+
+<doc:pi name="dbfunclist" xmlns="">
+ <refpurpose>Generates a hyperlinked list of functions</refpurpose>
+ <refdescription>
+ <para>Use the <tag class="xmlpi">dbfunclist</tag> PI as the child of any
+ element (for example, <tag>refsynopsisdiv</tag>) containing multiple
+ <tag>funcsynopsis</tag> instances; a hyperlinked
+ navigational “function list†will be generated at the top of
+ output for that element, enabling users to quickly
+ jump to to each function synopsis.</para>
+ </refdescription>
+ <refsynopsisdiv>
+ <synopsis><tag class="xmlpi">dbfunclist</tag></synopsis>
+ </refsynopsisdiv>
+ <refparameter>
+ <para>[No parameters]</para>
+ </refparameter>
+</doc:pi>
+<xsl:template name="pi.dbfunclist">
+ <xsl:variable name="funcsynopses" select="..//funcsynopsis"/>
+ <xsl:if test="count($funcsynopses)&lt;1">
+ <xsl:message><xsl:text>No funcsynopsis elements matched dbfunclist PI, perhaps it's nested too deep?</xsl:text>
+ </xsl:message>
+ </xsl:if>
+ <dl>
+ <xsl:call-template name="process.funcsynopsis.list">
+ <xsl:with-param name="funcsynopses" select="$funcsynopses"/>
+ </xsl:call-template>
+ </dl>
+</xsl:template>
+
+<doc:pi name="dbhtml-include_href" xmlns="">
+ <refpurpose>Copies an external well-formed HTML/XML file into current doc</refpurpose>
+ <refdescription>
+ <para>Use the <tag class="xmlpi">dbhtml-include href</tag> PI anywhere in a
+ document to cause the contents of the file referenced by the
+ <code>href</code> pseudo-attribute to be copied/inserted “as
+ is†into your HTML output at the point in document order
+ where the PI occurs in the source.</para>
+ <note>
+ <para>The referenced file may contain plain text (as long as
+ it is “wrapped†in an <tag>html</tag> element — see the
+ note below) or markup in any arbitrary vocabulary,
+ including HTML — but it must conform to XML
+ well-formedness constraints (because the feature in XSLT
+ 1.0 for opening external files, the
+ <function>document()</function> function, can only handle
+ files that meet XML well-formedness constraints).</para>
+ <para>Among other things, XML well-formedness constraints
+ require a document to have <emphasis>a single root
+ element</emphasis>. So if the content you want to
+ include is plain text or is markup that does
+ <emphasis>not</emphasis> have a single root element,
+ <emphasis role="strong">wrap the content in an
+ <tag>html</tag> element</emphasis>. The stylesheets will
+ strip out that surrounding <tag>html</tag> “wrapper†when
+ they find it, leaving just the content you want to
+ insert.</para>
+ </note>
+ </refdescription>
+ <refsynopsisdiv>
+ <synopsis><tag class="xmlpi">dbhtml-include href="<replaceable>URI</replaceable>"</tag></synopsis>
+ </refsynopsisdiv>
+ <refparameter>
+ <variablelist>
+ <varlistentry><term>href="<replaceable>URI</replaceable>"</term>
+ <listitem>
+ <para>Specifies the URI for the file to include; the URI
+ can be, for example, a remote <literal>http:</literal>
+ URI, or a local filesystem <literal>file:</literal>
+ URI</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+ <refsee role="params">
+ <para><parameter>textinsert.extension</parameter></para>
+ </refsee>
+ <refsee role="tcg">
+ <para><link role="tcg"
+ xlink:href="InsertExtHtml.html"
+ >Inserting external HTML code</link>,
+ <link role="tcg"
+ xlink:href="ExternalCode.html"
+ >External code files</link></para>
+ </refsee>
+</doc:pi>
+<xsl:template name="pi.dbhtml-include">
+ <xsl:param name="href">
+ <xsl:call-template name="dbhtml-attribute">
+ <xsl:with-param name="pis" select="."/>
+ <xsl:with-param name="attribute">href</xsl:with-param>
+ </xsl:call-template>
+ </xsl:param>
+ <xsl:choose>
+ <xsl:when test="$href != ''">
+ <xsl:variable name="content" select="document($href,/)"/>
+ <xsl:choose>
+ <xsl:when test="$content/*">
+ <xsl:choose>
+ <xsl:when test="$content/*[1][self::html]">
+ <!-- include just the children of html wrapper -->
+ <xsl:copy-of select="$content/*[1]/node()"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:copy-of select="$content"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:message>
+ <xsl:text>ERROR: dbhtml-include processing instruction </xsl:text>
+ <xsl:text>href has no content.</xsl:text>
+ </xsl:message>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:message>
+ <xsl:text>ERROR: dbhtml-include processing instruction has </xsl:text>
+ <xsl:text>missing or empty href value.</xsl:text>
+ </xsl:message>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- There are two templates matching this PI in htmlhelp-common.xsl -->
+<doc:pi name="dbhh" xmlns="">
+ <refpurpose>Sets topic name and topic id for context-sensitive HTML Help</refpurpose>
+ <refdescription>
+ <para>Use the <tag class="xmlpi">dbhh</tag> PI as a child of components
+ that should be used as targets for context-sensitive help requests.</para>
+ </refdescription>
+ <refsynopsisdiv>
+ <synopsis><tag class="xmlpi">dbhh topicname="<replaceable>name</replaceable>" topicid="<replaceable>id</replaceable>"</tag></synopsis>
+ </refsynopsisdiv>
+ <refparameter>
+ <variablelist>
+ <varlistentry><term>topicname="<replaceable>name</replaceable>"</term>
+ <listitem>
+ <para>Specifies a unique string constant that identifies a help topic</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry><term>topicid="<replaceable>id</replaceable>"</term>
+ <listitem>
+ <para>Specifies a unique integer value for the <literal>topicname</literal> string</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+ <refsee role="tcg">
+ <para><link role="tcg"
+ xlink:href="HtmlHelp.html#HHContextHelp"
+ >Context-sensitive help</link></para>
+ </refsee>
+</doc:pi>
+
+<!-- ==================================================================== -->
+
+<xsl:template name="dbhtml-attribute">
+ <!-- * dbhtml-attribute is an interal utility template for retrieving -->
+ <!-- * pseudo-attributes/parameters from PIs -->
+ <xsl:param name="pis" select="processing-instruction('dbhtml')"/>
+ <xsl:param name="attribute">filename</xsl:param>
+ <xsl:call-template name="pi-attribute">
+ <xsl:with-param name="pis" select="$pis"/>
+ <xsl:with-param name="attribute" select="$attribute"/>
+ </xsl:call-template>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="processing-instruction()">
+</xsl:template>
+
+<xsl:template match="processing-instruction('dbhtml')">
+ <!-- nop -->
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="processing-instruction('dbcmdlist')">
+ <xsl:call-template name="pi.dbcmdlist"/>
+</xsl:template>
+<xsl:template name="process.cmdsynopsis.list">
+ <xsl:param name="cmdsynopses"/><!-- empty node list by default -->
+ <xsl:param name="count" select="1"/>
+
+ <xsl:choose>
+ <xsl:when test="$count>count($cmdsynopses)"></xsl:when>
+ <xsl:otherwise>
+ <xsl:variable name="cmdsyn" select="$cmdsynopses[$count]"/>
+
+ <dt>
+ <a>
+ <xsl:attribute name="href">
+ <xsl:text>#</xsl:text>
+ <xsl:call-template name="object.id">
+ <xsl:with-param name="object" select="$cmdsyn"/>
+ </xsl:call-template>
+ </xsl:attribute>
+
+ <xsl:choose>
+ <xsl:when test="$cmdsyn/@xreflabel">
+ <xsl:call-template name="xref.xreflabel">
+ <xsl:with-param name="target" select="$cmdsyn"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="$cmdsyn" mode="xref-to">
+ <xsl:with-param name="target" select="$cmdsyn"/>
+ </xsl:apply-templates>
+ </xsl:otherwise>
+ </xsl:choose>
+ </a>
+ </dt>
+
+ <xsl:call-template name="process.cmdsynopsis.list">
+ <xsl:with-param name="cmdsynopses" select="$cmdsynopses"/>
+ <xsl:with-param name="count" select="$count+1"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="processing-instruction('dbfunclist')">
+ <xsl:call-template name="pi.dbfunclist"/>
+</xsl:template>
+<xsl:template name="process.funcsynopsis.list">
+ <xsl:param name="funcsynopses"/><!-- empty node list by default -->
+ <xsl:param name="count" select="1"/>
+
+ <xsl:choose>
+ <xsl:when test="$count>count($funcsynopses)"></xsl:when>
+ <xsl:otherwise>
+ <xsl:variable name="cmdsyn" select="$funcsynopses[$count]"/>
+
+ <dt>
+ <a>
+ <xsl:attribute name="href">
+ <xsl:text>#</xsl:text>
+ <xsl:call-template name="object.id">
+ <xsl:with-param name="object" select="$cmdsyn"/>
+ </xsl:call-template>
+ </xsl:attribute>
+
+ <xsl:choose>
+ <xsl:when test="$cmdsyn/@xreflabel">
+ <xsl:call-template name="xref.xreflabel">
+ <xsl:with-param name="target" select="$cmdsyn"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="$cmdsyn" mode="xref-to">
+ <xsl:with-param name="target" select="$cmdsyn"/>
+ </xsl:apply-templates>
+ </xsl:otherwise>
+ </xsl:choose>
+ </a>
+ </dt>
+
+ <xsl:call-template name="process.funcsynopsis.list">
+ <xsl:with-param name="funcsynopses" select="$funcsynopses"/>
+ <xsl:with-param name="count" select="$count+1"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="processing-instruction('dbhtml-include')">
+ <xsl:call-template name="pi.dbhtml-include"/>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template name="dbhtml-dir">
+ <xsl:param name="context" select="."/>
+ <!-- directories are now inherited from previous levels -->
+ <xsl:variable name="ppath">
+ <xsl:if test="$context/parent::*">
+ <xsl:call-template name="dbhtml-dir">
+ <xsl:with-param name="context" select="$context/parent::*"/>
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:variable>
+ <xsl:variable name="path">
+ <xsl:call-template name="pi.dbhtml_dir">
+ <xsl:with-param name="node" select="$context"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:choose>
+ <xsl:when test="$path = ''">
+ <xsl:if test="$ppath != ''">
+ <xsl:value-of select="$ppath"/>
+ </xsl:if>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:if test="$ppath != ''">
+ <xsl:value-of select="$ppath"/>
+ <xsl:if test="substring($ppath, string-length($ppath), 1) != '/'">
+ <xsl:text>/</xsl:text>
+ </xsl:if>
+ </xsl:if>
+ <xsl:value-of select="$path"/>
+ <xsl:text>/</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/profile-chunk-code.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/profile-chunk-code.xsl
new file mode 100644
index 0000000..cabfd91
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/profile-chunk-code.xsl
@@ -0,0 +1,615 @@
+<?xml version="1.0" encoding="US-ASCII"?>
+<!--This file was created automatically by xsl2profile-->
+<!--from the DocBook XSL stylesheets.-->
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:exsl="http://exslt.org/common" xmlns:cf="http://docbook.sourceforge.net/xmlns/chunkfast/1.0" xmlns:ng="http://docbook.org/docbook-ng" xmlns:db="http://docbook.org/ns/docbook" xmlns:exslt="http://exslt.org/common" exslt:dummy="dummy" ng:dummy="dummy" db:dummy="dummy" extension-element-prefixes="exslt" exclude-result-prefixes="exsl cf ng db exslt" version="1.0">
+
+<!-- ********************************************************************
+ $Id: chunk-code.xsl 8596 2010-03-20 04:36:45Z bobstayton $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<!-- ==================================================================== -->
+
+
+<xsl:template match="*" mode="chunk-filename">
+ <!-- returns the filename of a chunk -->
+ <xsl:variable name="ischunk">
+ <xsl:call-template name="chunk"/>
+ </xsl:variable>
+
+ <xsl:variable name="fn">
+ <xsl:apply-templates select="." mode="recursive-chunk-filename"/>
+ </xsl:variable>
+
+ <!--
+ <xsl:message>
+ <xsl:value-of select="$ischunk"/>
+ <xsl:text> (</xsl:text>
+ <xsl:value-of select="local-name(.)"/>
+ <xsl:text>) </xsl:text>
+ <xsl:value-of select="$fn"/>
+ <xsl:text>, </xsl:text>
+ <xsl:call-template name="dbhtml-dir"/>
+ </xsl:message>
+ -->
+
+ <!-- 2003-11-25 by ndw:
+ The following test used to read test="$ischunk != 0 and $fn != ''"
+ I've removed the ischunk part of the test so that href.to.uri and
+ href.from.uri will be fully qualified even if the source or target
+ isn't a chunk. I *think* that if $fn != '' then it's appropriate
+ to put the directory on the front, even if the element isn't a
+ chunk. I could be wrong. -->
+
+ <xsl:if test="$fn != ''">
+ <xsl:call-template name="dbhtml-dir"/>
+ </xsl:if>
+
+ <xsl:value-of select="$fn"/>
+ <!-- You can't add the html.ext here because dbhtml filename= may already -->
+ <!-- have added it. It really does have to be handled in the recursive template -->
+</xsl:template>
+
+<xsl:template match="*" mode="recursive-chunk-filename">
+ <xsl:param name="recursive" select="false()"/>
+
+ <!-- returns the filename of a chunk -->
+ <xsl:variable name="ischunk">
+ <xsl:call-template name="chunk"/>
+ </xsl:variable>
+
+ <xsl:variable name="dbhtml-filename">
+ <xsl:call-template name="pi.dbhtml_filename"/>
+ </xsl:variable>
+
+ <xsl:variable name="filename">
+ <xsl:choose>
+ <xsl:when test="$dbhtml-filename != ''">
+ <xsl:value-of select="$dbhtml-filename"/>
+ </xsl:when>
+ <!-- if this is the root element, use the root.filename -->
+ <xsl:when test="not(parent::*) and $root.filename != ''">
+ <xsl:value-of select="$root.filename"/>
+ <xsl:value-of select="$html.ext"/>
+ </xsl:when>
+ <!-- Special case -->
+ <xsl:when test="self::legalnotice and not($generate.legalnotice.link = 0)">
+ <xsl:choose>
+ <xsl:when test="(@id or @xml:id) and not($use.id.as.filename = 0)">
+ <!-- * if this legalnotice has an ID, then go ahead and use -->
+ <!-- * just the value of that ID as the basename for the file -->
+ <!-- * (that is, without prepending an "ln-" too it) -->
+ <xsl:value-of select="(@id|@xml:id)[1]"/>
+ <xsl:value-of select="$html.ext"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <!-- * otherwise, if this legalnotice does not have an ID, -->
+ <!-- * then we generate an ID... -->
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+ <!-- * ...and then we take that generated ID, prepend an -->
+ <!-- * "ln-" to it, and use that as the basename for the file -->
+ <xsl:value-of select="concat('ln-',$id,$html.ext)"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <!-- if there's no dbhtml filename, and if we're to use IDs as -->
+ <!-- filenames, then use the ID to generate the filename. -->
+ <xsl:when test="(@id or @xml:id) and $use.id.as.filename != 0">
+ <xsl:value-of select="(@id|@xml:id)[1]"/>
+ <xsl:value-of select="$html.ext"/>
+ </xsl:when>
+ <xsl:otherwise/>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="$ischunk='0'">
+ <!-- if called on something that isn't a chunk, walk up... -->
+ <xsl:choose>
+ <xsl:when test="count(parent::*)&gt;0">
+ <xsl:apply-templates mode="recursive-chunk-filename" select="parent::*">
+ <xsl:with-param name="recursive" select="$recursive"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <!-- unless there is no up, in which case return "" -->
+ <xsl:otherwise/>
+ </xsl:choose>
+ </xsl:when>
+
+ <xsl:when test="not($recursive) and $filename != ''">
+ <!-- if this chunk has an explicit name, use it -->
+ <xsl:value-of select="$filename"/>
+ </xsl:when>
+
+ <xsl:when test="self::set">
+ <xsl:value-of select="$root.filename"/>
+ <xsl:if test="not($recursive)">
+ <xsl:value-of select="$html.ext"/>
+ </xsl:if>
+ </xsl:when>
+
+ <xsl:when test="self::book">
+ <xsl:text>bk</xsl:text>
+ <xsl:number level="any" format="01"/>
+ <xsl:if test="not($recursive)">
+ <xsl:value-of select="$html.ext"/>
+ </xsl:if>
+ </xsl:when>
+
+ <xsl:when test="self::article">
+ <xsl:if test="/set">
+ <!-- in a set, make sure we inherit the right book info... -->
+ <xsl:apply-templates mode="recursive-chunk-filename" select="parent::*">
+ <xsl:with-param name="recursive" select="true()"/>
+ </xsl:apply-templates>
+ </xsl:if>
+
+ <xsl:text>ar</xsl:text>
+ <xsl:number level="any" format="01" from="book"/>
+ <xsl:if test="not($recursive)">
+ <xsl:value-of select="$html.ext"/>
+ </xsl:if>
+ </xsl:when>
+
+ <xsl:when test="self::preface">
+ <xsl:if test="/set">
+ <!-- in a set, make sure we inherit the right book info... -->
+ <xsl:apply-templates mode="recursive-chunk-filename" select="parent::*">
+ <xsl:with-param name="recursive" select="true()"/>
+ </xsl:apply-templates>
+ </xsl:if>
+
+ <xsl:text>pr</xsl:text>
+ <xsl:number level="any" format="01" from="book"/>
+ <xsl:if test="not($recursive)">
+ <xsl:value-of select="$html.ext"/>
+ </xsl:if>
+ </xsl:when>
+
+ <xsl:when test="self::chapter">
+ <xsl:if test="/set">
+ <!-- in a set, make sure we inherit the right book info... -->
+ <xsl:apply-templates mode="recursive-chunk-filename" select="parent::*">
+ <xsl:with-param name="recursive" select="true()"/>
+ </xsl:apply-templates>
+ </xsl:if>
+
+ <xsl:text>ch</xsl:text>
+ <xsl:number level="any" format="01" from="book"/>
+ <xsl:if test="not($recursive)">
+ <xsl:value-of select="$html.ext"/>
+ </xsl:if>
+ </xsl:when>
+
+ <xsl:when test="self::appendix">
+ <xsl:if test="/set">
+ <!-- in a set, make sure we inherit the right book info... -->
+ <xsl:apply-templates mode="recursive-chunk-filename" select="parent::*">
+ <xsl:with-param name="recursive" select="true()"/>
+ </xsl:apply-templates>
+ </xsl:if>
+
+ <xsl:text>ap</xsl:text>
+ <xsl:number level="any" format="a" from="book"/>
+ <xsl:if test="not($recursive)">
+ <xsl:value-of select="$html.ext"/>
+ </xsl:if>
+ </xsl:when>
+
+ <xsl:when test="self::part">
+ <xsl:choose>
+ <xsl:when test="/set">
+ <!-- in a set, make sure we inherit the right book info... -->
+ <xsl:apply-templates mode="recursive-chunk-filename" select="parent::*">
+ <xsl:with-param name="recursive" select="true()"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:otherwise>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:text>pt</xsl:text>
+ <xsl:number level="any" format="01" from="book"/>
+ <xsl:if test="not($recursive)">
+ <xsl:value-of select="$html.ext"/>
+ </xsl:if>
+ </xsl:when>
+
+ <xsl:when test="self::reference">
+ <xsl:choose>
+ <xsl:when test="/set">
+ <!-- in a set, make sure we inherit the right book info... -->
+ <xsl:apply-templates mode="recursive-chunk-filename" select="parent::*">
+ <xsl:with-param name="recursive" select="true()"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:otherwise>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:text>rn</xsl:text>
+ <xsl:number level="any" format="01" from="book"/>
+ <xsl:if test="not($recursive)">
+ <xsl:value-of select="$html.ext"/>
+ </xsl:if>
+ </xsl:when>
+
+ <xsl:when test="self::refentry">
+ <xsl:choose>
+ <xsl:when test="parent::reference">
+ <xsl:apply-templates mode="recursive-chunk-filename" select="parent::*">
+ <xsl:with-param name="recursive" select="true()"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:if test="/set">
+ <!-- in a set, make sure we inherit the right book info... -->
+ <xsl:apply-templates mode="recursive-chunk-filename" select="parent::*">
+ <xsl:with-param name="recursive" select="true()"/>
+ </xsl:apply-templates>
+ </xsl:if>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:text>re</xsl:text>
+ <xsl:number level="any" format="01" from="book"/>
+ <xsl:if test="not($recursive)">
+ <xsl:value-of select="$html.ext"/>
+ </xsl:if>
+ </xsl:when>
+
+ <xsl:when test="self::colophon">
+ <xsl:choose>
+ <xsl:when test="/set">
+ <!-- in a set, make sure we inherit the right book info... -->
+ <xsl:apply-templates mode="recursive-chunk-filename" select="parent::*">
+ <xsl:with-param name="recursive" select="true()"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:otherwise>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:text>co</xsl:text>
+ <xsl:number level="any" format="01" from="book"/>
+ <xsl:if test="not($recursive)">
+ <xsl:value-of select="$html.ext"/>
+ </xsl:if>
+ </xsl:when>
+
+ <xsl:when test="self::sect1 or self::sect2 or self::sect3 or self::sect4 or self::sect5 or self::section">
+ <xsl:apply-templates mode="recursive-chunk-filename" select="parent::*">
+ <xsl:with-param name="recursive" select="true()"/>
+ </xsl:apply-templates>
+ <xsl:text>s</xsl:text>
+ <xsl:number format="01"/>
+ <xsl:if test="not($recursive)">
+ <xsl:value-of select="$html.ext"/>
+ </xsl:if>
+ </xsl:when>
+
+ <xsl:when test="self::bibliography">
+ <xsl:choose>
+ <xsl:when test="/set">
+ <!-- in a set, make sure we inherit the right book info... -->
+ <xsl:apply-templates mode="recursive-chunk-filename" select="parent::*">
+ <xsl:with-param name="recursive" select="true()"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:otherwise>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:text>bi</xsl:text>
+ <xsl:number level="any" format="01" from="book"/>
+ <xsl:if test="not($recursive)">
+ <xsl:value-of select="$html.ext"/>
+ </xsl:if>
+ </xsl:when>
+
+ <xsl:when test="self::glossary">
+ <xsl:choose>
+ <xsl:when test="/set">
+ <!-- in a set, make sure we inherit the right book info... -->
+ <xsl:apply-templates mode="recursive-chunk-filename" select="parent::*">
+ <xsl:with-param name="recursive" select="true()"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:otherwise>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:text>go</xsl:text>
+ <xsl:number level="any" format="01" from="book"/>
+ <xsl:if test="not($recursive)">
+ <xsl:value-of select="$html.ext"/>
+ </xsl:if>
+ </xsl:when>
+
+ <xsl:when test="self::index">
+ <xsl:choose>
+ <xsl:when test="/set">
+ <!-- in a set, make sure we inherit the right book info... -->
+ <xsl:apply-templates mode="recursive-chunk-filename" select="parent::*">
+ <xsl:with-param name="recursive" select="true()"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:otherwise>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:text>ix</xsl:text>
+ <xsl:number level="any" format="01" from="book"/>
+ <xsl:if test="not($recursive)">
+ <xsl:value-of select="$html.ext"/>
+ </xsl:if>
+ </xsl:when>
+
+ <xsl:when test="self::setindex">
+ <xsl:text>si</xsl:text>
+ <xsl:number level="any" format="01" from="set"/>
+ <xsl:if test="not($recursive)">
+ <xsl:value-of select="$html.ext"/>
+ </xsl:if>
+ </xsl:when>
+
+ <xsl:otherwise>
+ <xsl:text>chunk-filename-error-</xsl:text>
+ <xsl:value-of select="name(.)"/>
+ <xsl:number level="any" format="01" from="set"/>
+ <xsl:if test="not($recursive)">
+ <xsl:value-of select="$html.ext"/>
+ </xsl:if>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+
+
+<xsl:template match="processing-instruction('dbhtml')">
+ <!-- nop -->
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+
+<xsl:template match="*" mode="find.chunks">
+ <xsl:variable name="chunk">
+ <xsl:call-template name="chunk"/>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="$chunk != 0">
+ <cf:div id="{generate-id()}">
+ <xsl:apply-templates select="." mode="class.attribute"/>
+ <xsl:apply-templates select="*" mode="find.chunks"/>
+ </cf:div>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="*" mode="find.chunks"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xslo:include xmlns:xslo="http://www.w3.org/1999/XSL/Transform" href="../profiling/profile-mode.xsl"/><xslo:variable xmlns:xslo="http://www.w3.org/1999/XSL/Transform" name="profiled-content"><xslo:choose><xslo:when test="*/self::ng:* or */self::db:*"><xslo:message>Note: namesp. cut : stripped namespace before processing</xslo:message><xslo:variable name="stripped-content"><xslo:apply-templates select="/" mode="stripNS"/></xslo:variable><xslo:message>Note: namesp. cut : processing stripped document</xslo:message><xslo:apply-templates select="exslt:node-set($stripped-content)" mode="profile"/></xslo:when><xslo:otherwise><xslo:apply-templates select="/" mode="profile"/></xslo:otherwise></xslo:choose></xslo:variable><xslo:variable xmlns:xslo="http://www.w3.org/1999/XSL/Transform" name="profiled-nodes" select="exslt:node-set($profiled-content)"/><xsl:template match="/">
+ <!-- * Get a title for current doc so that we let the user -->
+ <!-- * know what document we are processing at this point. -->
+ <xsl:variable name="doc.title">
+ <xsl:call-template name="get.doc.title"/>
+ </xsl:variable>
+ <xsl:choose>
+ <!-- Hack! If someone hands us a DocBook V5.x or DocBook NG document,
+ toss the namespace and continue. Use the docbook5 namespaced
+ stylesheets for DocBook5 if you don't want to use this feature.-->
+ <xsl:when test="false()"/>
+ <!-- Can't process unless namespace removed -->
+ <xsl:when test="false()"/>
+ <xsl:otherwise>
+ <xsl:choose>
+ <xsl:when test="$rootid != ''">
+ <xsl:choose>
+ <xsl:when test="count($profiled-nodes//*[@id=$rootid]) = 0">
+ <xsl:message terminate="yes">
+ <xsl:text>ID '</xsl:text>
+ <xsl:value-of select="$rootid"/>
+ <xsl:text>' not found in document.</xsl:text>
+ </xsl:message>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:if test="$collect.xref.targets = 'yes' or $collect.xref.targets = 'only'">
+ <xsl:apply-templates select="key('id', $rootid)" mode="collect.targets"/>
+ </xsl:if>
+ <xsl:if test="$collect.xref.targets != 'only'">
+ <xsl:apply-templates select="$profiled-nodes//*[@id=$rootid]" mode="process.root"/>
+ <xsl:if test="$tex.math.in.alt != ''">
+ <xsl:apply-templates select="$profiled-nodes//*[@id=$rootid]" mode="collect.tex.math"/>
+ </xsl:if>
+ <xsl:if test="$generate.manifest != 0">
+ <xsl:call-template name="generate.manifest">
+ <xsl:with-param name="node" select="key('id',$rootid)"/>
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:if>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:if test="$collect.xref.targets = 'yes' or $collect.xref.targets = 'only'">
+ <xsl:apply-templates select="$profiled-nodes" mode="collect.targets"/>
+ </xsl:if>
+ <xsl:if test="$collect.xref.targets != 'only'">
+ <xsl:apply-templates select="$profiled-nodes" mode="process.root"/>
+ <xsl:if test="$tex.math.in.alt != ''">
+ <xsl:apply-templates select="$profiled-nodes" mode="collect.tex.math"/>
+ </xsl:if>
+ <xsl:if test="$generate.manifest != 0">
+ <xsl:call-template name="generate.manifest">
+ <xsl:with-param name="node" select="$profiled-nodes"/>
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:if>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="*" mode="process.root">
+ <xsl:apply-templates select="."/>
+ <xsl:call-template name="generate.css"/>
+</xsl:template>
+
+<!-- ====================================================================== -->
+
+<xsl:template match="set|book|part|preface|chapter|appendix |article |reference|refentry |book/glossary|article/glossary|part/glossary |book/bibliography|article/bibliography|part/bibliography |colophon">
+ <xsl:choose>
+ <xsl:when test="$onechunk != 0 and parent::*">
+ <xsl:apply-imports/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="process-chunk-element"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="sect1|sect2|sect3|sect4|sect5|section">
+ <xsl:variable name="ischunk">
+ <xsl:call-template name="chunk"/>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="not(parent::*)">
+ <xsl:call-template name="process-chunk-element"/>
+ </xsl:when>
+ <xsl:when test="$ischunk = 0">
+ <xsl:apply-imports/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="process-chunk-element"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="setindex |book/index |article/index |part/index">
+ <!-- some implementations use completely empty index tags to indicate -->
+ <!-- where an automatically generated index should be inserted. so -->
+ <!-- if the index is completely empty, skip it. -->
+ <xsl:if test="count(*)&gt;0 or $generate.index != '0'">
+ <xsl:call-template name="process-chunk-element"/>
+ </xsl:if>
+</xsl:template>
+
+<!-- Resolve xml:base attributes -->
+<xsl:template match="@fileref">
+ <!-- need a check for absolute urls -->
+ <xsl:choose>
+ <xsl:when test="contains(., ':')">
+ <!-- it has a uri scheme so it is an absolute uri -->
+ <xsl:value-of select="."/>
+ </xsl:when>
+ <xsl:when test="$keep.relative.image.uris != 0">
+ <!-- leave it alone -->
+ <xsl:value-of select="."/>
+ </xsl:when>
+ <xsl:otherwise>
+ <!-- its a relative uri -->
+ <xsl:call-template name="relative-uri">
+ <xsl:with-param name="destdir">
+ <xsl:call-template name="dbhtml-dir">
+ <xsl:with-param name="context" select=".."/>
+ </xsl:call-template>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ==================================================================== -->
+<xsl:template match="set|book|part|preface|chapter|appendix |article |reference|refentry |sect1|sect2|sect3|sect4|sect5 |section |book/glossary|article/glossary|part/glossary |book/bibliography|article/bibliography|part/bibliography |colophon" mode="enumerate-files">
+ <xsl:variable name="ischunk"><xsl:call-template name="chunk"/></xsl:variable>
+ <xsl:if test="$ischunk='1'">
+ <xsl:call-template name="make-relative-filename">
+ <xsl:with-param name="base.dir">
+ <xsl:if test="$manifest.in.base.dir = 0">
+ <xsl:value-of select="$base.dir"/>
+ </xsl:if>
+ </xsl:with-param>
+ <xsl:with-param name="base.name">
+ <xsl:apply-templates mode="chunk-filename" select="."/>
+ </xsl:with-param>
+ </xsl:call-template>
+ <xsl:text>
+</xsl:text>
+ </xsl:if>
+ <xsl:apply-templates select="*" mode="enumerate-files"/>
+</xsl:template>
+
+<xsl:template match="book/index|article/index|part/index" mode="enumerate-files">
+ <xsl:if test="$htmlhelp.output != 1">
+ <xsl:variable name="ischunk"><xsl:call-template name="chunk"/></xsl:variable>
+ <xsl:if test="$ischunk='1'">
+ <xsl:call-template name="make-relative-filename">
+ <xsl:with-param name="base.dir">
+ <xsl:if test="$manifest.in.base.dir = 0">
+ <xsl:value-of select="$base.dir"/>
+ </xsl:if>
+ </xsl:with-param>
+ <xsl:with-param name="base.name">
+ <xsl:apply-templates mode="chunk-filename" select="."/>
+ </xsl:with-param>
+ </xsl:call-template>
+ <xsl:text>
+</xsl:text>
+ </xsl:if>
+ <xsl:apply-templates select="*" mode="enumerate-files"/>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="legalnotice" mode="enumerate-files">
+ <xsl:variable name="id"><xsl:call-template name="object.id"/></xsl:variable>
+ <xsl:if test="$generate.legalnotice.link != 0">
+ <xsl:call-template name="make-relative-filename">
+ <xsl:with-param name="base.dir">
+ <xsl:if test="$manifest.in.base.dir = 0">
+ <xsl:value-of select="$base.dir"/>
+ </xsl:if>
+ </xsl:with-param>
+ <xsl:with-param name="base.name">
+ <xsl:apply-templates mode="chunk-filename" select="."/>
+ </xsl:with-param>
+ </xsl:call-template>
+ <xsl:text>
+</xsl:text>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="mediaobject[imageobject] | inlinemediaobject[imageobject]" mode="enumerate-files">
+ <xsl:variable name="longdesc.uri">
+ <xsl:call-template name="longdesc.uri">
+ <xsl:with-param name="mediaobject" select="."/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:variable name="mediaobject" select="."/>
+
+ <xsl:if test="$html.longdesc != 0 and $mediaobject/textobject[not(phrase)]">
+ <xsl:call-template name="longdesc.uri">
+ <xsl:with-param name="mediaobject" select="$mediaobject"/>
+ </xsl:call-template>
+ <xsl:text>
+</xsl:text>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="text()" mode="enumerate-files">
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/profile-chunk.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/profile-chunk.xsl
new file mode 100644
index 0000000..02920b1
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/profile-chunk.xsl
@@ -0,0 +1,52 @@
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:exsl="http://exslt.org/common"
+ version="1.0"
+ exclude-result-prefixes="exsl">
+
+<!-- ********************************************************************
+ $Id: profile-chunk.xsl 6910 2007-06-28 23:23:30Z xmldoc $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<!-- ==================================================================== -->
+
+<!-- First import the non-chunking templates that format elements
+ within each chunk file. In a customization, you should
+ create a separate non-chunking customization layer such
+ as mydocbook.xsl that imports the original docbook.xsl and
+ customizes any presentation templates. Then your chunking
+ customization should import mydocbook.xsl instead of
+ docbook.xsl. -->
+<xsl:import href="docbook.xsl"/>
+
+<!-- chunk-common.xsl contains all the named templates for chunking.
+ In a customization file, you import chunk-common.xsl, then
+ add any customized chunking templates of the same name.
+ They will have import precedence over the original
+ chunking templates in chunk-common.xsl. -->
+<xsl:import href="chunk-common.xsl"/>
+
+<!-- The manifest.xsl module is no longer imported because its
+ templates were moved into chunk-common and chunk-code -->
+
+<!-- chunk-code.xsl contains all the chunking templates that use
+ a match attribute. In a customization it should be referenced
+ using <xsl:include> instead of <xsl:import>, and then add
+ any customized chunking templates with match attributes. But be sure
+ to add a priority="1" to such customized templates to resolve
+ its conflict with the original, since they have the
+ same import precedence.
+
+ Using xsl:include prevents adding another layer
+ of import precedence, which would cause any
+ customizations that use xsl:apply-imports to wrongly
+ apply the chunking version instead of the original
+ non-chunking version to format an element. -->
+<xsl:include href="profile-chunk-code.xsl"/>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/profile-docbook.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/profile-docbook.xsl
new file mode 100644
index 0000000..45e55f2
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/profile-docbook.xsl
@@ -0,0 +1,413 @@
+<?xml version="1.0" encoding="US-ASCII"?>
+<!--This file was created automatically by xsl2profile-->
+<!--from the DocBook XSL stylesheets.-->
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ng="http://docbook.org/docbook-ng" xmlns:db="http://docbook.org/ns/docbook" xmlns:exsl="http://exslt.org/common" xmlns:exslt="http://exslt.org/common" exslt:dummy="dummy" ng:dummy="dummy" db:dummy="dummy" extension-element-prefixes="exslt" exclude-result-prefixes="db ng exsl exslt exslt" version="1.0">
+
+<xsl:output method="html" encoding="ISO-8859-1" indent="no"/>
+
+<!-- ********************************************************************
+ $Id: docbook.xsl 8783 2010-07-28 10:59:39Z mzjn $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<!-- ==================================================================== -->
+
+<xsl:include href="../VERSION"/>
+<xsl:include href="param.xsl"/>
+<xsl:include href="../lib/lib.xsl"/>
+<xsl:include href="../common/l10n.xsl"/>
+<xsl:include href="../common/common.xsl"/>
+<xsl:include href="../common/utility.xsl"/>
+<xsl:include href="../common/labels.xsl"/>
+<xsl:include href="../common/titles.xsl"/>
+<xsl:include href="../common/subtitles.xsl"/>
+<xsl:include href="../common/gentext.xsl"/>
+<xsl:include href="../common/targets.xsl"/>
+<xsl:include href="../common/olink.xsl"/>
+<xsl:include href="../common/pi.xsl"/>
+<xsl:include href="autotoc.xsl"/>
+<xsl:include href="autoidx.xsl"/>
+<xsl:include href="lists.xsl"/>
+<xsl:include href="callout.xsl"/>
+<xsl:include href="verbatim.xsl"/>
+<xsl:include href="graphics.xsl"/>
+<xsl:include href="xref.xsl"/>
+<xsl:include href="formal.xsl"/>
+<xsl:include href="table.xsl"/>
+<xsl:include href="htmltbl.xsl"/>
+<xsl:include href="sections.xsl"/>
+<xsl:include href="inline.xsl"/>
+<xsl:include href="footnote.xsl"/>
+<xsl:include href="html.xsl"/>
+<xsl:include href="info.xsl"/>
+<xsl:include href="keywords.xsl"/>
+<xsl:include href="division.xsl"/>
+<xsl:include href="toc.xsl"/>
+<xsl:include href="index.xsl"/>
+<xsl:include href="refentry.xsl"/>
+<xsl:include href="math.xsl"/>
+<xsl:include href="admon.xsl"/>
+<xsl:include href="component.xsl"/>
+<xsl:include href="biblio.xsl"/>
+<xsl:include href="biblio-iso690.xsl"/>
+<xsl:include href="glossary.xsl"/>
+<xsl:include href="block.xsl"/>
+<xsl:include href="task.xsl"/>
+<xsl:include href="qandaset.xsl"/>
+<xsl:include href="synop.xsl"/>
+<xsl:include href="titlepage.xsl"/>
+<xsl:include href="titlepage.templates.xsl"/>
+<xsl:include href="pi.xsl"/>
+<xsl:include href="ebnf.xsl"/>
+<xsl:include href="chunker.xsl"/>
+<xsl:include href="html-rtf.xsl"/>
+<xsl:include href="annotations.xsl"/>
+<xsl:include href="../common/stripns.xsl"/>
+
+<xsl:param name="stylesheet.result.type" select="'html'"/>
+<xsl:param name="htmlhelp.output" select="0"/>
+
+<!-- ==================================================================== -->
+
+<xsl:key name="id" match="*" use="@id|@xml:id"/>
+<xsl:key name="gid" match="*" use="generate-id()"/>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="*">
+ <xsl:message>
+ <xsl:text>Element </xsl:text>
+ <xsl:value-of select="local-name(.)"/>
+ <xsl:text> in namespace '</xsl:text>
+ <xsl:value-of select="namespace-uri(.)"/>
+ <xsl:text>' encountered</xsl:text>
+ <xsl:if test="parent::*">
+ <xsl:text> in </xsl:text>
+ <xsl:value-of select="name(parent::*)"/>
+ </xsl:if>
+ <xsl:text>, but no template matches.</xsl:text>
+ </xsl:message>
+
+ <span style="color: red">
+ <xsl:text>&lt;</xsl:text>
+ <xsl:value-of select="name(.)"/>
+ <xsl:text>&gt;</xsl:text>
+ <xsl:apply-templates/>
+ <xsl:text>&lt;/</xsl:text>
+ <xsl:value-of select="name(.)"/>
+ <xsl:text>&gt;</xsl:text>
+ </span>
+</xsl:template>
+
+<xsl:template match="text()">
+ <xsl:value-of select="."/>
+</xsl:template>
+
+<xsl:template name="body.attributes">
+ <xsl:attribute name="bgcolor">white</xsl:attribute>
+ <xsl:attribute name="text">black</xsl:attribute>
+ <xsl:attribute name="link">#0000FF</xsl:attribute>
+ <xsl:attribute name="vlink">#840084</xsl:attribute>
+ <xsl:attribute name="alink">#0000FF</xsl:attribute>
+ <xsl:if test="starts-with($writing.mode, 'rl')">
+ <xsl:attribute name="dir">rtl</xsl:attribute>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template name="head.content">
+ <xsl:param name="node" select="."/>
+ <xsl:param name="title">
+ <xsl:apply-templates select="$node" mode="object.title.markup.textonly"/>
+ </xsl:param>
+
+ <title>
+ <xsl:copy-of select="$title"/>
+ </title>
+
+ <xsl:if test="$html.base != ''">
+ <base href="{$html.base}"/>
+ </xsl:if>
+
+ <!-- Insert links to CSS files or insert literal style elements -->
+ <xsl:call-template name="generate.css"/>
+
+ <xsl:if test="$html.stylesheet != ''">
+ <xsl:call-template name="output.html.stylesheets">
+ <xsl:with-param name="stylesheets" select="normalize-space($html.stylesheet)"/>
+ </xsl:call-template>
+ </xsl:if>
+
+ <xsl:if test="$link.mailto.url != ''">
+ <link rev="made" href="{$link.mailto.url}"/>
+ </xsl:if>
+
+ <meta name="generator" content="DocBook {$DistroTitle} V{$VERSION}"/>
+
+ <xsl:if test="$generate.meta.abstract != 0">
+ <xsl:variable name="info" select="(articleinfo |bookinfo |prefaceinfo |chapterinfo |appendixinfo |sectioninfo |sect1info |sect2info |sect3info |sect4info |sect5info |referenceinfo |refentryinfo |partinfo |info |docinfo)[1]"/>
+ <xsl:if test="$info and $info/abstract">
+ <meta name="description">
+ <xsl:attribute name="content">
+ <xsl:for-each select="$info/abstract[1]/*">
+ <xsl:value-of select="normalize-space(.)"/>
+ <xsl:if test="position() &lt; last()">
+ <xsl:text> </xsl:text>
+ </xsl:if>
+ </xsl:for-each>
+ </xsl:attribute>
+ </meta>
+ </xsl:if>
+ </xsl:if>
+
+ <xsl:if test="($draft.mode = 'yes' or ($draft.mode = 'maybe' and ancestor-or-self::*[@status][1]/@status = 'draft')) and $draft.watermark.image != ''">
+ <style type="text/css"><xsl:text>
+body { background-image: url('</xsl:text>
+<xsl:value-of select="$draft.watermark.image"/><xsl:text>');
+ background-repeat: no-repeat;
+ background-position: top left;
+ /* The following properties make the watermark "fixed" on the page. */
+ /* I think that's just a bit too distracting for the reader... */
+ /* background-attachment: fixed; */
+ /* background-position: center center; */
+ }</xsl:text>
+ </style>
+ </xsl:if>
+ <xsl:apply-templates select="." mode="head.keywords.content"/>
+</xsl:template>
+
+<xsl:template name="output.html.stylesheets">
+ <xsl:param name="stylesheets" select="''"/>
+
+ <xsl:choose>
+ <xsl:when test="contains($stylesheets, ' ')">
+ <xsl:variable name="css.filename" select="substring-before($stylesheets, ' ')"/>
+
+ <xsl:call-template name="make.css.link">
+ <xsl:with-param name="css.filename" select="$css.filename"/>
+ </xsl:call-template>
+
+ <xsl:call-template name="output.html.stylesheets">
+ <xsl:with-param name="stylesheets" select="substring-after($stylesheets, ' ')"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="$stylesheets != ''">
+ <xsl:call-template name="make.css.link">
+ <xsl:with-param name="css.filename" select="$stylesheets"/>
+ </xsl:call-template>
+ </xsl:when>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ============================================================ -->
+
+<xsl:template match="*" mode="head.keywords.content">
+ <xsl:apply-templates select="chapterinfo/keywordset" mode="html.header"/>
+ <xsl:apply-templates select="appendixinfo/keywordset" mode="html.header"/>
+ <xsl:apply-templates select="prefaceinfo/keywordset" mode="html.header"/>
+ <xsl:apply-templates select="bookinfo/keywordset" mode="html.header"/>
+ <xsl:apply-templates select="setinfo/keywordset" mode="html.header"/>
+ <xsl:apply-templates select="articleinfo/keywordset" mode="html.header"/>
+ <xsl:apply-templates select="artheader/keywordset" mode="html.header"/>
+ <xsl:apply-templates select="sect1info/keywordset" mode="html.header"/>
+ <xsl:apply-templates select="sect2info/keywordset" mode="html.header"/>
+ <xsl:apply-templates select="sect3info/keywordset" mode="html.header"/>
+ <xsl:apply-templates select="sect4info/keywordset" mode="html.header"/>
+ <xsl:apply-templates select="sect5info/keywordset" mode="html.header"/>
+ <xsl:apply-templates select="sectioninfo/keywordset" mode="html.header"/>
+ <xsl:apply-templates select="refsect1info/keywordset" mode="html.header"/>
+ <xsl:apply-templates select="refsect2info/keywordset" mode="html.header"/>
+ <xsl:apply-templates select="refsect3info/keywordset" mode="html.header"/>
+ <xsl:apply-templates select="bibliographyinfo/keywordset" mode="html.header"/>
+ <xsl:apply-templates select="glossaryinfo/keywordset" mode="html.header"/>
+ <xsl:apply-templates select="indexinfo/keywordset" mode="html.header"/>
+ <xsl:apply-templates select="refentryinfo/keywordset" mode="html.header"/>
+ <xsl:apply-templates select="partinfo/keywordset" mode="html.header"/>
+ <xsl:apply-templates select="referenceinfo/keywordset" mode="html.header"/>
+ <xsl:apply-templates select="docinfo/keywordset" mode="html.header"/>
+ <xsl:apply-templates select="info/keywordset" mode="html.header"/>
+
+ <xsl:if test="$inherit.keywords != 0 and parent::*">
+ <xsl:apply-templates select="parent::*" mode="head.keywords.content"/>
+ </xsl:if>
+</xsl:template>
+
+<!-- ============================================================ -->
+
+<xsl:template name="system.head.content">
+ <xsl:param name="node" select="."/>
+
+ <!-- FIXME: When chunking, only the annotations actually used
+ in this chunk should be referenced. I don't think it
+ does any harm to reference them all, but it adds
+ unnecessary bloat to each chunk. -->
+ <xsl:if test="$annotation.support != 0 and //annotation">
+ <xsl:call-template name="add.annotation.links"/>
+ <script type="text/javascript">
+ <xsl:text>
+// Create PopupWindow objects</xsl:text>
+ <xsl:for-each select="//annotation">
+ <xsl:text>
+var popup_</xsl:text>
+ <xsl:value-of select="generate-id(.)"/>
+ <xsl:text> = new PopupWindow("popup-</xsl:text>
+ <xsl:value-of select="generate-id(.)"/>
+ <xsl:text>");
+</xsl:text>
+ <xsl:text>popup_</xsl:text>
+ <xsl:value-of select="generate-id(.)"/>
+ <xsl:text>.offsetY = 15;
+</xsl:text>
+ <xsl:text>popup_</xsl:text>
+ <xsl:value-of select="generate-id(.)"/>
+ <xsl:text>.autoHide();
+</xsl:text>
+ </xsl:for-each>
+ </script>
+
+ <style type="text/css">
+ <xsl:value-of select="$annotation.css"/>
+ </style>
+ </xsl:if>
+
+ <!-- system.head.content is like user.head.content, except that
+ it is called before head.content. This is important because it
+ means, for example, that <style> elements output by system.head.content
+ have a lower CSS precedence than the users stylesheet. -->
+</xsl:template>
+
+<!-- ============================================================ -->
+
+<xsl:template name="user.preroot">
+ <!-- Pre-root output, can be used to output comments and PIs. -->
+ <!-- This must not output any element content! -->
+</xsl:template>
+
+<xsl:template name="user.head.content">
+ <xsl:param name="node" select="."/>
+</xsl:template>
+
+<xsl:template name="user.header.navigation">
+ <xsl:param name="node" select="."/>
+</xsl:template>
+
+<xsl:template name="user.header.content">
+ <xsl:param name="node" select="."/>
+</xsl:template>
+
+<xsl:template name="user.footer.content">
+ <xsl:param name="node" select="."/>
+</xsl:template>
+
+<xsl:template name="user.footer.navigation">
+ <xsl:param name="node" select="."/>
+</xsl:template>
+
+<xslo:include xmlns:xslo="http://www.w3.org/1999/XSL/Transform" href="../profiling/profile-mode.xsl"/><xslo:variable xmlns:xslo="http://www.w3.org/1999/XSL/Transform" name="profiled-content"><xslo:choose><xslo:when test="*/self::ng:* or */self::db:*"><xslo:message>Note: namesp. cut : stripped namespace before processing</xslo:message><xslo:variable name="stripped-content"><xslo:apply-templates select="/" mode="stripNS"/></xslo:variable><xslo:message>Note: namesp. cut : processing stripped document</xslo:message><xslo:apply-templates select="exslt:node-set($stripped-content)" mode="profile"/></xslo:when><xslo:otherwise><xslo:apply-templates select="/" mode="profile"/></xslo:otherwise></xslo:choose></xslo:variable><xslo:variable xmlns:xslo="http://www.w3.org/1999/XSL/Transform" name="profiled-nodes" select="exslt:node-set($profiled-content)"/><xsl:template match="/">
+ <!-- * Get a title for current doc so that we let the user -->
+ <!-- * know what document we are processing at this point. -->
+ <xsl:variable name="doc.title">
+ <xsl:call-template name="get.doc.title"/>
+ </xsl:variable>
+ <xsl:choose>
+ <!-- Hack! If someone hands us a DocBook V5.x or DocBook NG document,
+ toss the namespace and continue. Use the docbook5 namespaced
+ stylesheets for DocBook5 if you don't want to use this feature.-->
+ <!-- include extra test for Xalan quirk -->
+ <xsl:when test="false()"/>
+ <!-- Can't process unless namespace removed -->
+ <xsl:when test="false()"/>
+ <xsl:otherwise>
+ <xsl:choose>
+ <xsl:when test="$rootid != ''">
+ <xsl:choose>
+ <xsl:when test="count($profiled-nodes//*[@id=$rootid]) = 0">
+ <xsl:message terminate="yes">
+ <xsl:text>ID '</xsl:text>
+ <xsl:value-of select="$rootid"/>
+ <xsl:text>' not found in document.</xsl:text>
+ </xsl:message>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:if test="$collect.xref.targets = 'yes' or $collect.xref.targets = 'only'">
+ <xsl:apply-templates select="key('id', $rootid)" mode="collect.targets"/>
+ </xsl:if>
+ <xsl:if test="$collect.xref.targets != 'only'">
+ <xsl:apply-templates select="$profiled-nodes//*[@id=$rootid]" mode="process.root"/>
+ <xsl:if test="$tex.math.in.alt != ''">
+ <xsl:apply-templates select="$profiled-nodes//*[@id=$rootid]" mode="collect.tex.math"/>
+ </xsl:if>
+ </xsl:if>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:if test="$collect.xref.targets = 'yes' or $collect.xref.targets = 'only'">
+ <xsl:apply-templates select="$profiled-nodes" mode="collect.targets"/>
+ </xsl:if>
+ <xsl:if test="$collect.xref.targets != 'only'">
+ <xsl:apply-templates select="$profiled-nodes" mode="process.root"/>
+ <xsl:if test="$tex.math.in.alt != ''">
+ <xsl:apply-templates select="$profiled-nodes" mode="collect.tex.math"/>
+ </xsl:if>
+ </xsl:if>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="*" mode="process.root">
+ <xsl:variable name="doc" select="self::*"/>
+
+ <xsl:call-template name="user.preroot"/>
+ <xsl:call-template name="root.messages"/>
+
+ <html>
+ <head>
+ <xsl:call-template name="system.head.content">
+ <xsl:with-param name="node" select="$doc"/>
+ </xsl:call-template>
+ <xsl:call-template name="head.content">
+ <xsl:with-param name="node" select="$doc"/>
+ </xsl:call-template>
+ <xsl:call-template name="user.head.content">
+ <xsl:with-param name="node" select="$doc"/>
+ </xsl:call-template>
+ </head>
+ <body>
+ <xsl:call-template name="body.attributes"/>
+ <xsl:call-template name="user.header.content">
+ <xsl:with-param name="node" select="$doc"/>
+ </xsl:call-template>
+ <xsl:apply-templates select="."/>
+ <xsl:call-template name="user.footer.content">
+ <xsl:with-param name="node" select="$doc"/>
+ </xsl:call-template>
+ </body>
+ </html>
+ <xsl:value-of select="$html.append"/>
+
+ <!-- Generate any css files only once, not once per chunk -->
+ <xsl:call-template name="generate.css.files"/>
+</xsl:template>
+
+<xsl:template name="root.messages">
+ <!-- redefine this any way you'd like to output messages -->
+ <!-- DO NOT OUTPUT ANYTHING FROM THIS TEMPLATE -->
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template name="chunk">
+ <xsl:param name="node" select="."/>
+
+ <!-- The default is that we are not chunking... -->
+ <xsl:text>0</xsl:text>
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/profile-onechunk.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/profile-onechunk.xsl
new file mode 100644
index 0000000..325b8b1
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/profile-onechunk.xsl
@@ -0,0 +1,37 @@
+<?xml version="1.0"?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:doc="http://nwalsh.com/xsl/documentation/1.0"
+ version="1.0"
+ exclude-result-prefixes="doc">
+
+<!-- ********************************************************************
+ $Id: profile-onechunk.xsl 6910 2007-06-28 23:23:30Z xmldoc $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<!-- ==================================================================== -->
+
+<xsl:import href="profile-chunk.xsl"/>
+
+<!-- Ok, using the onechunk parameter makes this all work again. -->
+<!-- It does have the disadvantage that it only works for documents that have -->
+<!-- a root element that is considered a chunk by the chunk.xsl stylesheet. -->
+<!-- Ideally, onechunk would let anything be a chunk. But not today. -->
+
+<xsl:param name="onechunk" select="1"/>
+<xsl:param name="suppress.navigation">1</xsl:param>
+
+<xsl:template name="href.target.uri">
+ <xsl:param name="object" select="."/>
+ <xsl:text>#</xsl:text>
+ <xsl:call-template name="object.id">
+ <xsl:with-param name="object" select="$object"/>
+ </xsl:call-template>
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/qandaset.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/qandaset.xsl
new file mode 100644
index 0000000..3bf35e8
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/qandaset.xsl
@@ -0,0 +1,437 @@
+<?xml version='1.0'?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:doc="http://nwalsh.com/xsl/documentation/1.0"
+ exclude-result-prefixes="doc"
+ version='1.0'>
+
+<!-- ********************************************************************
+ $Id: qandaset.xsl 8421 2009-05-04 07:49:49Z bobstayton $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<!-- ==================================================================== -->
+
+<xsl:template match="qandaset">
+ <xsl:variable name="title" select="(blockinfo/title|info/title|title)[1]"/>
+ <xsl:variable name="preamble" select="*[local-name(.) != 'title'
+ and local-name(.) != 'titleabbrev'
+ and local-name(.) != 'qandadiv'
+ and local-name(.) != 'qandaentry']"/>
+ <xsl:variable name="toc">
+ <xsl:call-template name="pi.dbhtml_toc"/>
+ </xsl:variable>
+
+ <xsl:variable name="toc.params">
+ <xsl:call-template name="find.path.params">
+ <xsl:with-param name="table" select="normalize-space($generate.toc)"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <div>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates select="$title"/>
+ <xsl:if test="not($title)">
+ <!-- id is output on title if there is one -->
+ <xsl:call-template name="anchor">
+ <xsl:with-param name="conditional" select="0"/>
+ </xsl:call-template>
+ </xsl:if>
+ <xsl:if test="((contains($toc.params, 'toc') and $toc != '0') or $toc = '1')
+ and not(ancestor::answer and not($qanda.nested.in.toc=0))">
+ <xsl:call-template name="process.qanda.toc"/>
+ </xsl:if>
+ <xsl:apply-templates select="$preamble"/>
+ <xsl:call-template name="process.qandaset"/>
+ </div>
+</xsl:template>
+
+<xsl:template match="qandaset/blockinfo/title|
+ qandaset/info/title|
+ qandaset/title">
+ <xsl:variable name="qalevel">
+ <xsl:call-template name="qanda.section.level"/>
+ </xsl:variable>
+ <xsl:element name="h{string(number($qalevel)+1)}">
+ <xsl:attribute name="class">
+ <xsl:value-of select="local-name(.)"/>
+ </xsl:attribute>
+ <xsl:call-template name="anchor">
+ <xsl:with-param name="node" select=".."/>
+ <xsl:with-param name="conditional" select="0"/>
+ </xsl:call-template>
+ <xsl:apply-templates/>
+ </xsl:element>
+</xsl:template>
+
+<xsl:template match="qandaset/blockinfo|qandaset/info">
+ <!-- what should this template really do? -->
+ <xsl:apply-templates select="legalnotice" mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="qandadiv">
+ <xsl:variable name="preamble" select="*[local-name(.) != 'title'
+ and local-name(.) != 'titleabbrev'
+ and local-name(.) != 'qandadiv'
+ and local-name(.) != 'qandaentry']"/>
+
+ <xsl:if test="blockinfo/title|info/title|title">
+ <tr class="qandadiv">
+ <td align="{$direction.align.start}" valign="top" colspan="2">
+ <xsl:apply-templates select="(blockinfo/title|info/title|title)[1]"/>
+ </td>
+ </tr>
+ </xsl:if>
+
+ <xsl:variable name="toc">
+ <xsl:call-template name="pi.dbhtml_toc"/>
+ </xsl:variable>
+
+ <xsl:variable name="toc.params">
+ <xsl:call-template name="find.path.params">
+ <xsl:with-param name="table" select="normalize-space($generate.toc)"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:if test="(contains($toc.params, 'toc') and $toc != '0') or $toc = '1'">
+ <tr class="toc">
+ <td align="{$direction.align.start}" valign="top" colspan="2">
+ <xsl:call-template name="process.qanda.toc"/>
+ </td>
+ </tr>
+ </xsl:if>
+ <xsl:if test="$preamble">
+ <tr class="toc">
+ <td align="{$direction.align.start}" valign="top" colspan="2">
+ <xsl:apply-templates select="$preamble"/>
+ </td>
+ </tr>
+ </xsl:if>
+ <xsl:apply-templates select="qandadiv|qandaentry"/>
+</xsl:template>
+
+<xsl:template match="qandadiv/blockinfo/title|
+ qandadiv/info/title|
+ qandadiv/title">
+ <xsl:variable name="qalevel">
+ <xsl:call-template name="qandadiv.section.level"/>
+ </xsl:variable>
+
+ <xsl:element name="h{string(number($qalevel)+1)}">
+ <xsl:attribute name="class">
+ <xsl:value-of select="local-name(.)"/>
+ </xsl:attribute>
+ <xsl:call-template name="anchor">
+ <xsl:with-param name="node" select=".."/>
+ <xsl:with-param name="conditional" select="0"/>
+ </xsl:call-template>
+ <xsl:apply-templates select="parent::qandadiv" mode="label.markup"/>
+ <xsl:if test="$qandadiv.autolabel != 0">
+ <xsl:apply-templates select="." mode="intralabel.punctuation"/>
+ <xsl:text> </xsl:text>
+ </xsl:if>
+ <xsl:apply-templates/>
+ </xsl:element>
+</xsl:template>
+
+<xsl:template match="qandaentry">
+ <xsl:apply-templates/>
+</xsl:template>
+
+<xsl:template match="question">
+ <xsl:variable name="deflabel">
+ <xsl:apply-templates select="." mode="qanda.defaultlabel"/>
+ </xsl:variable>
+
+ <tr>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <td align="{$direction.align.start}" valign="top">
+ <xsl:call-template name="anchor">
+ <xsl:with-param name="node" select=".."/>
+ <xsl:with-param name="conditional" select="0"/>
+ </xsl:call-template>
+ <xsl:call-template name="anchor">
+ <xsl:with-param name="conditional" select="0"/>
+ </xsl:call-template>
+
+ <xsl:variable name="label.content">
+ <xsl:apply-templates select="." mode="qanda.label"/>
+ </xsl:variable>
+
+ <xsl:if test="string-length($label.content) &gt; 0">
+ <p><b>
+ <xsl:copy-of select="$label.content"/>
+ </b></p>
+ </xsl:if>
+ </td>
+ <td align="{$direction.align.start}" valign="top">
+ <xsl:choose>
+ <xsl:when test="$deflabel = 'none' and not(label)">
+ <b><xsl:apply-templates select="*[local-name(.) != 'label']"/></b>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="*[local-name(.) != 'label']"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </td>
+ </tr>
+</xsl:template>
+
+<xsl:template match="*" mode="qanda.defaultlabel">
+ <xsl:choose>
+ <xsl:when test="ancestor-or-self::*[@defaultlabel]">
+ <xsl:value-of select="(ancestor-or-self::*[@defaultlabel])[last()]
+ /@defaultlabel"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$qanda.defaultlabel"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="question" mode="qanda.label">
+ <xsl:variable name="deflabel">
+ <xsl:apply-templates select="." mode="qanda.defaultlabel"/>
+ </xsl:variable>
+ <xsl:apply-templates select="." mode="label.markup"/>
+ <xsl:if test="contains($deflabel, 'number') and not(label)">
+ <xsl:apply-templates select="." mode="intralabel.punctuation"/>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="answer">
+ <xsl:variable name="deflabel">
+ <xsl:apply-templates select="." mode="qanda.defaultlabel"/>
+ </xsl:variable>
+
+ <tr class="{local-name(.)}">
+ <td align="{$direction.align.start}" valign="top">
+ <xsl:call-template name="anchor"/>
+ <xsl:variable name="answer.label">
+ <xsl:apply-templates select="." mode="label.markup"/>
+ </xsl:variable>
+ <xsl:if test="string-length($answer.label) &gt; 0">
+ <p><b>
+ <xsl:copy-of select="$answer.label"/>
+ </b></p>
+ </xsl:if>
+ </td>
+ <td align="{$direction.align.start}" valign="top">
+ <xsl:apply-templates select="*[local-name(.) != 'label'
+ and local-name(.) != 'qandaentry']"/>
+ <!-- * handle nested answer/qandaentry instances -->
+ <!-- * (bug 1509043 from Daniel Leidert) -->
+ <xsl:if test="descendant::question">
+ <xsl:call-template name="process.qandaset"/>
+ </xsl:if>
+ </td>
+ </tr>
+</xsl:template>
+
+<xsl:template match="answer" mode="qanda.label">
+ <xsl:apply-templates select="." mode="label.markup"/>
+</xsl:template>
+
+<xsl:template match="label">
+ <xsl:apply-templates/>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template name="process.qanda.toc">
+ <!-- * if user wants nested qandaset and qandaentry in main Qandaset TOC, -->
+ <!-- * then don't also include the nested stuff in the sub TOCs -->
+ <dl>
+ <xsl:apply-templates select="qandadiv" mode="qandatoc.mode"/>
+ <xsl:apply-templates select="qandaset|qandaentry" mode="qandatoc.mode"/>
+ </dl>
+</xsl:template>
+
+<xsl:template match="qandadiv" mode="qandatoc.mode">
+ <dt><xsl:apply-templates select="title" mode="qandatoc.mode"/></dt>
+ <dd><xsl:call-template name="process.qanda.toc"/></dd>
+</xsl:template>
+
+<xsl:template match="qandadiv/blockinfo/title|
+ qandadiv/info/title|
+ qandadiv/title" mode="qandatoc.mode">
+ <xsl:variable name="qalevel">
+ <xsl:call-template name="qandadiv.section.level"/>
+ </xsl:variable>
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id">
+ <xsl:with-param name="object" select="parent::*"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="div.label">
+ <xsl:apply-templates select="parent::qandadiv" mode="label.markup"/>
+ </xsl:variable>
+ <xsl:if test="string-length($div.label) != 0">
+ <xsl:copy-of select="$div.label"/>
+ <xsl:value-of select="$autotoc.label.separator"/>
+ </xsl:if>
+ <xsl:text> </xsl:text>
+ <a>
+ <xsl:attribute name="href">
+ <xsl:call-template name="href.target">
+ <xsl:with-param name="object" select="parent::*"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:apply-templates/>
+ </a>
+</xsl:template>
+
+<xsl:template match="qandaset" mode="qandatoc.mode">
+ <xsl:for-each select="qandaentry">
+ <xsl:apply-templates select="." mode="qandatoc.mode"/>
+ </xsl:for-each>
+</xsl:template>
+
+<xsl:template match="qandaentry" mode="qandatoc.mode">
+ <xsl:apply-templates select="question" mode="qandatoc.mode"/>
+</xsl:template>
+
+<xsl:template match="question" mode="qandatoc.mode">
+ <xsl:variable name="firstch">
+ <!-- Use a titleabbrev or title if available -->
+ <xsl:choose>
+ <xsl:when test="../blockinfo/titleabbrev">
+ <xsl:apply-templates select="../blockinfo/titleabbrev[1]/node()"/>
+ </xsl:when>
+ <xsl:when test="../blockinfo/title">
+ <xsl:apply-templates select="../blockinfo/title[1]/node()"/>
+ </xsl:when>
+ <xsl:when test="../info/titleabbrev">
+ <xsl:apply-templates select="../info/titleabbrev[1]/node()"/>
+ </xsl:when>
+ <xsl:when test="../titleabbrev">
+ <xsl:apply-templates select="../titleabbrev[1]/node()"/>
+ </xsl:when>
+ <xsl:when test="../info/title">
+ <xsl:apply-templates select="../info/title[1]/node()"/>
+ </xsl:when>
+ <xsl:when test="../title">
+ <xsl:apply-templates select="../title[1]/node()"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="(*[local-name(.)!='label'])[1]/node()"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:variable name="deflabel">
+ <xsl:choose>
+ <xsl:when test="ancestor-or-self::*[@defaultlabel]">
+ <xsl:value-of select="(ancestor-or-self::*[@defaultlabel])[last()]
+ /@defaultlabel"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$qanda.defaultlabel"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <dt>
+ <xsl:apply-templates select="." mode="label.markup"/>
+ <xsl:if test="contains($deflabel,'number') and not(label)">
+ <xsl:apply-templates select="." mode="intralabel.punctuation"/>
+ </xsl:if>
+ <xsl:text> </xsl:text>
+ <a>
+ <xsl:attribute name="href">
+ <xsl:call-template name="href.target">
+ <xsl:with-param name="object" select=".."/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:value-of select="$firstch"/>
+ </a>
+ </dt>
+ <!-- * include nested qandaset/qandaentry in TOC if user wants it -->
+ <xsl:if test="not($qanda.nested.in.toc = 0)">
+ <xsl:apply-templates select="following-sibling::answer" mode="qandatoc.mode"/>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="answer" mode="qandatoc.mode">
+ <xsl:if test="descendant::question">
+ <dd>
+ <xsl:call-template name="process.qanda.toc"/>
+ </dd>
+ </xsl:if>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template name="process.qandaset">
+
+ <xsl:variable name="deflabel">
+ <xsl:apply-templates select="." mode="qanda.defaultlabel"/>
+ </xsl:variable>
+
+ <xsl:variable name="label-width">
+ <xsl:call-template name="pi.dbhtml_label-width"/>
+ </xsl:variable>
+
+ <xsl:variable name="table-summary">
+ <xsl:call-template name="pi.dbhtml_table-summary"/>
+ </xsl:variable>
+
+ <xsl:variable name="cellpadding">
+ <xsl:call-template name="pi.dbhtml_cellpadding"/>
+ </xsl:variable>
+
+ <xsl:variable name="cellspacing">
+ <xsl:call-template name="pi.dbhtml_cellspacing"/>
+ </xsl:variable>
+
+ <table border="0" width="100%" summary="Q and A Set">
+ <xsl:if test="$table-summary != ''">
+ <xsl:attribute name="summary">
+ <xsl:value-of select="$table-summary"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:if test="$cellpadding != ''">
+ <xsl:attribute name="cellpadding">
+ <xsl:value-of select="$cellpadding"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:if test="$cellspacing != ''">
+ <xsl:attribute name="cellspacing">
+ <xsl:value-of select="$cellspacing"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <col align="{$direction.align.start}">
+ <xsl:attribute name="width">
+ <xsl:choose>
+ <xsl:when test="$label-width != ''">
+ <xsl:value-of select="$label-width"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text>1%</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:attribute>
+ </col>
+ <col/>
+ <tbody>
+ <xsl:apply-templates select="qandaentry|qandadiv"/>
+ </tbody>
+ </table>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="*" mode="no.wrapper.mode">
+ <xsl:apply-templates/>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/refentry.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/refentry.xsl
new file mode 100644
index 0000000..8eaf768
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/refentry.xsl
@@ -0,0 +1,299 @@
+<?xml version='1.0'?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version='1.0'>
+
+<!-- ********************************************************************
+ $Id: refentry.xsl 8421 2009-05-04 07:49:49Z bobstayton $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<!-- ==================================================================== -->
+
+<xsl:template match="reference">
+ <xsl:call-template name="id.warning"/>
+
+ <div>
+ <xsl:call-template name="common.html.attributes">
+ <xsl:with-param name="inherit" select="1"/>
+ </xsl:call-template>
+ <xsl:if test="$generate.id.attributes != 0">
+ <xsl:attribute name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:call-template name="reference.titlepage"/>
+
+ <xsl:variable name="toc.params">
+ <xsl:call-template name="find.path.params">
+ <xsl:with-param name="table" select="normalize-space($generate.toc)"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:if test="not(partintro) and contains($toc.params, 'toc')">
+ <xsl:call-template name="division.toc"/>
+ </xsl:if>
+ <xsl:apply-templates/>
+ </div>
+</xsl:template>
+
+<xsl:template match="reference" mode="division.number">
+ <xsl:number from="book" count="reference" format="I."/>
+</xsl:template>
+
+<xsl:template match="reference/docinfo"></xsl:template>
+<xsl:template match="reference/referenceinfo"></xsl:template>
+<xsl:template match="reference/title"></xsl:template>
+<xsl:template match="reference/subtitle"></xsl:template>
+<xsl:template match="reference/titleabbrev"></xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template name="refentry.title">
+ <xsl:param name="node" select="."/>
+ <xsl:variable name="refmeta" select="$node//refmeta"/>
+ <xsl:variable name="refentrytitle" select="$refmeta//refentrytitle"/>
+ <xsl:variable name="refnamediv" select="$node//refnamediv"/>
+ <xsl:variable name="refname" select="$refnamediv//refname"/>
+ <xsl:variable name="refdesc" select="$refnamediv//refdescriptor"/>
+ <xsl:variable name="title">
+ <xsl:choose>
+ <xsl:when test="$refentrytitle">
+ <xsl:apply-templates select="$refentrytitle[1]" mode="title"/>
+ </xsl:when>
+ <xsl:when test="$refdesc">
+ <xsl:apply-templates select="$refdesc[1]" mode="title"/>
+ </xsl:when>
+ <xsl:when test="$refname">
+ <xsl:apply-templates select="$refname[1]" mode="title"/>
+ </xsl:when>
+ <xsl:otherwise></xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <h1 class="title">
+ <xsl:copy-of select="$title"/>
+ </h1>
+</xsl:template>
+
+<xsl:template match="refentry">
+ <xsl:call-template name="id.warning"/>
+
+ <div>
+ <xsl:call-template name="common.html.attributes">
+ <xsl:with-param name="inherit" select="1"/>
+ </xsl:call-template>
+ <xsl:if test="$refentry.separator != 0 and preceding-sibling::refentry">
+ <div class="refentry.separator">
+ <hr/>
+ </div>
+ </xsl:if>
+ <xsl:call-template name="anchor">
+ <xsl:with-param name="conditional" select="0"/>
+ </xsl:call-template>
+ <xsl:call-template name="refentry.titlepage"/>
+ <xsl:apply-templates/>
+ <xsl:call-template name="process.footnotes"/>
+ </div>
+</xsl:template>
+
+<xsl:template match="refentry/docinfo|refentry/refentryinfo"></xsl:template>
+<xsl:template match="refentry/info"></xsl:template>
+
+<xsl:template match="refentrytitle|refname|refdescriptor" mode="title">
+ <xsl:apply-templates/>
+</xsl:template>
+
+<xsl:template match="refmeta">
+</xsl:template>
+
+<xsl:template match="manvolnum">
+ <xsl:if test="$refentry.xref.manvolnum != 0">
+ <xsl:text>(</xsl:text>
+ <xsl:apply-templates/>
+ <xsl:text>)</xsl:text>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="refmiscinfo">
+</xsl:template>
+
+<xsl:template match="refentrytitle">
+ <xsl:call-template name="inline.charseq"/>
+</xsl:template>
+
+<xsl:template match="refnamediv">
+ <div>
+ <xsl:call-template name="common.html.attributes">
+ <xsl:with-param name="inherit" select="1"/>
+ </xsl:call-template>
+ <xsl:call-template name="anchor"/>
+
+ <xsl:choose>
+ <xsl:when test="preceding-sibling::refnamediv">
+ <!-- no title on secondary refnamedivs! -->
+ </xsl:when>
+ <xsl:when test="$refentry.generate.name != 0">
+ <h2>
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'RefName'"/>
+ </xsl:call-template>
+ </h2>
+ </xsl:when>
+ <xsl:when test="$refentry.generate.title != 0">
+ <h2>
+ <xsl:choose>
+ <xsl:when test="../refmeta/refentrytitle">
+ <xsl:apply-templates select="../refmeta/refentrytitle"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="refname[1]"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </h2>
+ </xsl:when>
+ </xsl:choose>
+
+ <p>
+ <xsl:apply-templates/>
+ </p>
+ </div>
+</xsl:template>
+
+<xsl:template match="refname">
+ <xsl:if test="not(preceding-sibling::refdescriptor)">
+ <xsl:apply-templates/>
+ <xsl:if test="following-sibling::refname">
+ <xsl:text>, </xsl:text>
+ </xsl:if>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="refpurpose">
+ <xsl:if test="node()">
+ <xsl:text> </xsl:text>
+ <xsl:call-template name="dingbat">
+ <xsl:with-param name="dingbat">em-dash</xsl:with-param>
+ </xsl:call-template>
+ <xsl:text> </xsl:text>
+ <xsl:apply-templates/>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="refdescriptor">
+ <xsl:apply-templates/>
+</xsl:template>
+
+<xsl:template match="refclass">
+ <xsl:if test="$refclass.suppress = 0">
+ <b>
+ <xsl:if test="@role">
+ <xsl:value-of select="@role"/>
+ <xsl:text>: </xsl:text>
+ </xsl:if>
+ <xsl:apply-templates/>
+ </b>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="refsynopsisdiv">
+ <div>
+ <xsl:call-template name="common.html.attributes">
+ <xsl:with-param name="inherit" select="1"/>
+ </xsl:call-template>
+ <xsl:call-template name="anchor"/>
+ <h2>
+ <xsl:choose>
+ <xsl:when test="refsynopsisdiv/title|title">
+ <xsl:apply-templates select="(refsynopsisdiv/title|title)[1]"
+ mode="titlepage.mode"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'RefSynopsisDiv'"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </h2>
+ <xsl:apply-templates/>
+ </div>
+</xsl:template>
+
+<xsl:template match="refsynopsisdivinfo"></xsl:template>
+
+<xsl:template match="refsynopsisdiv/title">
+</xsl:template>
+
+<xsl:template match="refsynopsisdiv/title" mode="titlepage.mode">
+ <xsl:apply-templates/>
+</xsl:template>
+
+<xsl:template match="refsection|refsect1|refsect2|refsect3">
+ <div>
+ <xsl:call-template name="common.html.attributes">
+ <xsl:with-param name="inherit" select="1"/>
+ </xsl:call-template>
+ <xsl:call-template name="anchor">
+ <xsl:with-param name="conditional" select="0"/>
+ </xsl:call-template>
+ <!-- pick up info title -->
+ <xsl:apply-templates select="(title|info/title)[1]"/>
+ <xsl:apply-templates select="node()[not(self::title) and not(self::info)]"/>
+ </div>
+</xsl:template>
+
+<xsl:template match="refsection/title|refsection/info/title">
+ <!-- the ID is output in the block.object call for refsect1 -->
+ <xsl:variable name="level" select="count(ancestor-or-self::refsection)"/>
+ <xsl:variable name="refsynopsisdiv">
+ <xsl:text>0</xsl:text>
+ <xsl:if test="ancestor::refsynopsisdiv">1</xsl:if>
+ </xsl:variable>
+ <xsl:variable name="hlevel">
+ <xsl:choose>
+ <xsl:when test="$level+$refsynopsisdiv &gt; 5">6</xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$level+1+$refsynopsisdiv"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:element name="h{$hlevel}">
+ <xsl:apply-templates/>
+ </xsl:element>
+</xsl:template>
+
+<xsl:template match="refsect1/title|refsect1/info/title">
+ <!-- the ID is output in the block.object call for refsect1 -->
+ <h2>
+ <xsl:apply-templates/>
+ </h2>
+</xsl:template>
+
+<xsl:template match="refsect2/title|refsect2/info/title">
+ <!-- the ID is output in the block.object call for refsect2 -->
+ <h3>
+ <xsl:apply-templates/>
+ </h3>
+</xsl:template>
+
+<xsl:template match="refsect3/title|refsect3/info/title">
+ <!-- the ID is output in the block.object call for refsect3 -->
+ <h4>
+ <xsl:apply-templates/>
+ </h4>
+</xsl:template>
+
+<xsl:template match="refsectioninfo|refsection/info"></xsl:template>
+<xsl:template match="refsect1info|refsect1/info"></xsl:template>
+<xsl:template match="refsect2info|refsect2/info"></xsl:template>
+<xsl:template match="refsect3info|refsect3/info"></xsl:template>
+
+
+<!-- ==================================================================== -->
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/sections.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/sections.xsl
new file mode 100644
index 0000000..4278d2f
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/sections.xsl
@@ -0,0 +1,615 @@
+<?xml version='1.0'?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version='1.0'>
+
+<!-- ********************************************************************
+ $Id: sections.xsl 8421 2009-05-04 07:49:49Z bobstayton $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<!-- ==================================================================== -->
+
+<xsl:template match="section">
+ <xsl:variable name="depth" select="count(ancestor::section)+1"/>
+
+ <xsl:call-template name="id.warning"/>
+
+ <div>
+ <xsl:call-template name="common.html.attributes">
+ <xsl:with-param name="inherit" select="1"/>
+ </xsl:call-template>
+ <xsl:call-template name="section.titlepage"/>
+
+ <xsl:variable name="toc.params">
+ <xsl:call-template name="find.path.params">
+ <xsl:with-param name="table" select="normalize-space($generate.toc)"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:if test="contains($toc.params, 'toc')
+ and $depth &lt;= $generate.section.toc.level">
+ <xsl:call-template name="section.toc">
+ <xsl:with-param name="toc.title.p" select="contains($toc.params, 'title')"/>
+ </xsl:call-template>
+ <xsl:call-template name="section.toc.separator"/>
+ </xsl:if>
+ <xsl:apply-templates/>
+ <xsl:call-template name="process.chunk.footnotes"/>
+ </div>
+</xsl:template>
+
+<xsl:template name="section.title">
+ <!-- the context node should be the title of a section when called -->
+ <xsl:variable name="section" select="(ancestor::section
+ |ancestor::simplesect
+ |ancestor::sect1
+ |ancestor::sect2
+ |ancestor::sect3
+ |ancestor::sect4
+ |ancestor::sect5)[last()]"/>
+
+ <xsl:variable name="renderas">
+ <xsl:choose>
+ <xsl:when test="$section/@renderas = 'sect1'">1</xsl:when>
+ <xsl:when test="$section/@renderas = 'sect2'">2</xsl:when>
+ <xsl:when test="$section/@renderas = 'sect3'">3</xsl:when>
+ <xsl:when test="$section/@renderas = 'sect4'">4</xsl:when>
+ <xsl:when test="$section/@renderas = 'sect5'">5</xsl:when>
+ <xsl:otherwise><xsl:value-of select="''"/></xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="level">
+ <xsl:choose>
+ <xsl:when test="$renderas != ''">
+ <xsl:value-of select="$renderas"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="section.level">
+ <xsl:with-param name="node" select="$section"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:call-template name="section.heading">
+ <xsl:with-param name="section" select="$section"/>
+ <xsl:with-param name="level" select="$level"/>
+ <xsl:with-param name="title">
+ <xsl:apply-templates select="$section" mode="object.title.markup">
+ <xsl:with-param name="allow-anchors" select="1"/>
+ </xsl:apply-templates>
+ </xsl:with-param>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="section/title
+ |section/info/title
+ |sectioninfo/title"
+ mode="titlepage.mode" priority="2">
+ <xsl:call-template name="section.title"/>
+</xsl:template>
+
+<xsl:template match="sect1">
+ <xsl:call-template name="id.warning"/>
+
+ <div>
+ <xsl:call-template name="common.html.attributes">
+ <xsl:with-param name="inherit" select="1"/>
+ </xsl:call-template>
+
+ <xsl:choose>
+ <xsl:when test="@renderas = 'sect2'">
+ <xsl:call-template name="sect2.titlepage"/>
+ </xsl:when>
+ <xsl:when test="@renderas = 'sect3'">
+ <xsl:call-template name="sect3.titlepage"/>
+ </xsl:when>
+ <xsl:when test="@renderas = 'sect4'">
+ <xsl:call-template name="sect4.titlepage"/>
+ </xsl:when>
+ <xsl:when test="@renderas = 'sect5'">
+ <xsl:call-template name="sect5.titlepage"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="sect1.titlepage"/>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:variable name="toc.params">
+ <xsl:call-template name="find.path.params">
+ <xsl:with-param name="table" select="normalize-space($generate.toc)"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:if test="contains($toc.params, 'toc')
+ and $generate.section.toc.level &gt;= 1">
+ <xsl:call-template name="section.toc">
+ <xsl:with-param name="toc.title.p" select="contains($toc.params, 'title')"/>
+ </xsl:call-template>
+ <xsl:call-template name="section.toc.separator"/>
+ </xsl:if>
+ <xsl:apply-templates/>
+ <xsl:call-template name="process.chunk.footnotes"/>
+ </div>
+</xsl:template>
+
+<xsl:template match="sect1/title
+ |sect1/info/title
+ |sect1info/title"
+ mode="titlepage.mode" priority="2">
+ <xsl:call-template name="section.title"/>
+</xsl:template>
+
+<xsl:template match="sect2">
+ <xsl:call-template name="id.warning"/>
+
+ <div>
+ <xsl:call-template name="common.html.attributes">
+ <xsl:with-param name="inherit" select="1"/>
+ </xsl:call-template>
+
+ <xsl:choose>
+ <xsl:when test="@renderas = 'sect1'">
+ <xsl:call-template name="sect1.titlepage"/>
+ </xsl:when>
+ <xsl:when test="@renderas = 'sect3'">
+ <xsl:call-template name="sect3.titlepage"/>
+ </xsl:when>
+ <xsl:when test="@renderas = 'sect4'">
+ <xsl:call-template name="sect4.titlepage"/>
+ </xsl:when>
+ <xsl:when test="@renderas = 'sect5'">
+ <xsl:call-template name="sect5.titlepage"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="sect2.titlepage"/>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:variable name="toc.params">
+ <xsl:call-template name="find.path.params">
+ <xsl:with-param name="table" select="normalize-space($generate.toc)"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:if test="contains($toc.params, 'toc')
+ and $generate.section.toc.level &gt;= 2">
+ <xsl:call-template name="section.toc">
+ <xsl:with-param name="toc.title.p" select="contains($toc.params, 'title')"/>
+ </xsl:call-template>
+ <xsl:call-template name="section.toc.separator"/>
+ </xsl:if>
+ <xsl:apply-templates/>
+ <xsl:call-template name="process.chunk.footnotes"/>
+ </div>
+</xsl:template>
+
+<xsl:template match="sect2/title
+ |sect2/info/title
+ |sect2info/title"
+ mode="titlepage.mode" priority="2">
+ <xsl:call-template name="section.title"/>
+</xsl:template>
+
+<xsl:template match="sect3">
+ <xsl:call-template name="id.warning"/>
+
+ <div>
+ <xsl:call-template name="common.html.attributes">
+ <xsl:with-param name="inherit" select="1"/>
+ </xsl:call-template>
+
+ <xsl:choose>
+ <xsl:when test="@renderas = 'sect1'">
+ <xsl:call-template name="sect1.titlepage"/>
+ </xsl:when>
+ <xsl:when test="@renderas = 'sect2'">
+ <xsl:call-template name="sect2.titlepage"/>
+ </xsl:when>
+ <xsl:when test="@renderas = 'sect4'">
+ <xsl:call-template name="sect4.titlepage"/>
+ </xsl:when>
+ <xsl:when test="@renderas = 'sect5'">
+ <xsl:call-template name="sect5.titlepage"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="sect3.titlepage"/>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:variable name="toc.params">
+ <xsl:call-template name="find.path.params">
+ <xsl:with-param name="table" select="normalize-space($generate.toc)"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:if test="contains($toc.params, 'toc')
+ and $generate.section.toc.level &gt;= 3">
+ <xsl:call-template name="section.toc">
+ <xsl:with-param name="toc.title.p" select="contains($toc.params, 'title')"/>
+ </xsl:call-template>
+ <xsl:call-template name="section.toc.separator"/>
+ </xsl:if>
+ <xsl:apply-templates/>
+ <xsl:call-template name="process.chunk.footnotes"/>
+ </div>
+</xsl:template>
+
+<xsl:template match="sect3/title
+ |sect3/info/title
+ |sect3info/title"
+ mode="titlepage.mode" priority="2">
+ <xsl:call-template name="section.title"/>
+</xsl:template>
+
+<xsl:template match="sect4">
+ <xsl:call-template name="id.warning"/>
+
+ <div>
+ <xsl:call-template name="common.html.attributes">
+ <xsl:with-param name="inherit" select="1"/>
+ </xsl:call-template>
+
+ <xsl:choose>
+ <xsl:when test="@renderas = 'sect1'">
+ <xsl:call-template name="sect1.titlepage"/>
+ </xsl:when>
+ <xsl:when test="@renderas = 'sect2'">
+ <xsl:call-template name="sect2.titlepage"/>
+ </xsl:when>
+ <xsl:when test="@renderas = 'sect3'">
+ <xsl:call-template name="sect3.titlepage"/>
+ </xsl:when>
+ <xsl:when test="@renderas = 'sect5'">
+ <xsl:call-template name="sect5.titlepage"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="sect4.titlepage"/>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:variable name="toc.params">
+ <xsl:call-template name="find.path.params">
+ <xsl:with-param name="table" select="normalize-space($generate.toc)"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:if test="contains($toc.params, 'toc')
+ and $generate.section.toc.level &gt;= 4">
+ <xsl:call-template name="section.toc">
+ <xsl:with-param name="toc.title.p" select="contains($toc.params, 'title')"/>
+ </xsl:call-template>
+ <xsl:call-template name="section.toc.separator"/>
+ </xsl:if>
+ <xsl:apply-templates/>
+ <xsl:call-template name="process.chunk.footnotes"/>
+ </div>
+</xsl:template>
+
+<xsl:template match="sect4/title
+ |sect4/info/title
+ |sect4info/title"
+ mode="titlepage.mode" priority="2">
+ <xsl:call-template name="section.title"/>
+</xsl:template>
+
+<xsl:template match="sect5">
+ <xsl:call-template name="id.warning"/>
+
+ <div>
+ <xsl:call-template name="common.html.attributes">
+ <xsl:with-param name="inherit" select="1"/>
+ </xsl:call-template>
+
+ <xsl:choose>
+ <xsl:when test="@renderas = 'sect1'">
+ <xsl:call-template name="sect1.titlepage"/>
+ </xsl:when>
+ <xsl:when test="@renderas = 'sect2'">
+ <xsl:call-template name="sect2.titlepage"/>
+ </xsl:when>
+ <xsl:when test="@renderas = 'sect3'">
+ <xsl:call-template name="sect3.titlepage"/>
+ </xsl:when>
+ <xsl:when test="@renderas = 'sect4'">
+ <xsl:call-template name="sect4.titlepage"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="sect5.titlepage"/>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:variable name="toc.params">
+ <xsl:call-template name="find.path.params">
+ <xsl:with-param name="table" select="normalize-space($generate.toc)"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:if test="contains($toc.params, 'toc')
+ and $generate.section.toc.level &gt;= 5">
+ <xsl:call-template name="section.toc">
+ <xsl:with-param name="toc.title.p" select="contains($toc.params, 'title')"/>
+ </xsl:call-template>
+ <xsl:call-template name="section.toc.separator"/>
+ </xsl:if>
+ <xsl:apply-templates/>
+ <xsl:call-template name="process.chunk.footnotes"/>
+ </div>
+</xsl:template>
+
+<xsl:template match="sect5/title
+ |sect5/info/title
+ |sect5info/title"
+ mode="titlepage.mode" priority="2">
+ <xsl:call-template name="section.title"/>
+</xsl:template>
+
+<xsl:template match="simplesect">
+ <xsl:call-template name="id.warning"/>
+
+ <div>
+ <xsl:call-template name="common.html.attributes">
+ <xsl:with-param name="inherit" select="1"/>
+ </xsl:call-template>
+
+ <xsl:call-template name="simplesect.titlepage"/>
+ <xsl:apply-templates/>
+ </div>
+</xsl:template>
+
+<xsl:template match="simplesect/title|simplesect/info/title"
+ mode="titlepage.mode" priority="2">
+ <xsl:call-template name="section.title"/>
+</xsl:template>
+
+<xsl:template match="section/title"></xsl:template>
+<xsl:template match="section/titleabbrev"></xsl:template>
+<xsl:template match="section/subtitle"></xsl:template>
+<xsl:template match="sectioninfo"></xsl:template>
+<xsl:template match="section/info"></xsl:template>
+
+<xsl:template match="sect1/title"></xsl:template>
+<xsl:template match="sect1/titleabbrev"></xsl:template>
+<xsl:template match="sect1/subtitle"></xsl:template>
+<xsl:template match="sect1info"></xsl:template>
+<xsl:template match="sect1/info"></xsl:template>
+
+<xsl:template match="sect2/title"></xsl:template>
+<xsl:template match="sect2/subtitle"></xsl:template>
+<xsl:template match="sect2/titleabbrev"></xsl:template>
+<xsl:template match="sect2info"></xsl:template>
+<xsl:template match="sect2/info"></xsl:template>
+
+<xsl:template match="sect3/title"></xsl:template>
+<xsl:template match="sect3/subtitle"></xsl:template>
+<xsl:template match="sect3/titleabbrev"></xsl:template>
+<xsl:template match="sect3info"></xsl:template>
+<xsl:template match="sect3/info"></xsl:template>
+
+<xsl:template match="sect4/title"></xsl:template>
+<xsl:template match="sect4/subtitle"></xsl:template>
+<xsl:template match="sect4/titleabbrev"></xsl:template>
+<xsl:template match="sect4info"></xsl:template>
+<xsl:template match="sect4/info"></xsl:template>
+
+<xsl:template match="sect5/title"></xsl:template>
+<xsl:template match="sect5/subtitle"></xsl:template>
+<xsl:template match="sect5/titleabbrev"></xsl:template>
+<xsl:template match="sect5info"></xsl:template>
+<xsl:template match="sect5/info"></xsl:template>
+
+<xsl:template match="simplesect/title"></xsl:template>
+<xsl:template match="simplesect/subtitle"></xsl:template>
+<xsl:template match="simplesect/titleabbrev"></xsl:template>
+<xsl:template match="simplesect/info"></xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template name="section.heading">
+ <xsl:param name="section" select="."/>
+ <xsl:param name="level" select="1"/>
+ <xsl:param name="allow-anchors" select="1"/>
+ <xsl:param name="title"/>
+ <xsl:param name="class" select="'title'"/>
+
+ <xsl:variable name="id">
+ <xsl:choose>
+ <!-- Make sure the subtitle doesn't get the same id as the title -->
+ <xsl:when test="self::subtitle">
+ <xsl:call-template name="object.id">
+ <xsl:with-param name="object" select="."/>
+ </xsl:call-template>
+ </xsl:when>
+ <!-- if title is in an *info wrapper, get the grandparent -->
+ <xsl:when test="contains(local-name(..), 'info')">
+ <xsl:call-template name="object.id">
+ <xsl:with-param name="object" select="../.."/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="object.id">
+ <xsl:with-param name="object" select=".."/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <!-- HTML H level is one higher than section level -->
+ <xsl:variable name="hlevel">
+ <xsl:choose>
+ <!-- highest valid HTML H level is H6; so anything nested deeper
+ than 5 levels down just becomes H6 -->
+ <xsl:when test="$level &gt; 5">6</xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$level + 1"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:element name="h{$hlevel}">
+ <xsl:attribute name="class"><xsl:value-of select="$class"/></xsl:attribute>
+ <xsl:if test="$css.decoration != '0'">
+ <xsl:if test="$hlevel&lt;3">
+ <xsl:attribute name="style">clear: both</xsl:attribute>
+ </xsl:if>
+ </xsl:if>
+ <xsl:if test="$allow-anchors != 0 and $generate.id.attributes = 0">
+ <xsl:call-template name="anchor">
+ <xsl:with-param name="node" select="$section"/>
+ <xsl:with-param name="conditional" select="0"/>
+ </xsl:call-template>
+ </xsl:if>
+ <xsl:if test="$generate.id.attributes != 0 and not(local-name(.) = 'appendix')">
+ <xsl:attribute name="id"><xsl:value-of select="$id"/></xsl:attribute>
+ </xsl:if>
+ <xsl:copy-of select="$title"/>
+ </xsl:element>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="bridgehead">
+ <xsl:variable name="container"
+ select="(ancestor::appendix
+ |ancestor::article
+ |ancestor::bibliography
+ |ancestor::chapter
+ |ancestor::glossary
+ |ancestor::glossdiv
+ |ancestor::index
+ |ancestor::partintro
+ |ancestor::preface
+ |ancestor::refsect1
+ |ancestor::refsect2
+ |ancestor::refsect3
+ |ancestor::sect1
+ |ancestor::sect2
+ |ancestor::sect3
+ |ancestor::sect4
+ |ancestor::sect5
+ |ancestor::section
+ |ancestor::setindex
+ |ancestor::simplesect)[last()]"/>
+
+ <xsl:variable name="clevel">
+ <xsl:choose>
+ <xsl:when test="local-name($container) = 'appendix'
+ or local-name($container) = 'chapter'
+ or local-name($container) = 'article'
+ or local-name($container) = 'bibliography'
+ or local-name($container) = 'glossary'
+ or local-name($container) = 'index'
+ or local-name($container) = 'partintro'
+ or local-name($container) = 'preface'
+ or local-name($container) = 'setindex'">1</xsl:when>
+ <xsl:when test="local-name($container) = 'glossdiv'">
+ <xsl:value-of select="count(ancestor::glossdiv)+1"/>
+ </xsl:when>
+ <xsl:when test="local-name($container) = 'sect1'
+ or local-name($container) = 'sect2'
+ or local-name($container) = 'sect3'
+ or local-name($container) = 'sect4'
+ or local-name($container) = 'sect5'
+ or local-name($container) = 'refsect1'
+ or local-name($container) = 'refsect2'
+ or local-name($container) = 'refsect3'
+ or local-name($container) = 'section'
+ or local-name($container) = 'simplesect'">
+ <xsl:variable name="slevel">
+ <xsl:call-template name="section.level">
+ <xsl:with-param name="node" select="$container"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:value-of select="$slevel + 1"/>
+ </xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <!-- HTML H level is one higher than section level -->
+ <xsl:variable name="hlevel">
+ <xsl:choose>
+ <xsl:when test="@renderas = 'sect1'">2</xsl:when>
+ <xsl:when test="@renderas = 'sect2'">3</xsl:when>
+ <xsl:when test="@renderas = 'sect3'">4</xsl:when>
+ <xsl:when test="@renderas = 'sect4'">5</xsl:when>
+ <xsl:when test="@renderas = 'sect5'">6</xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$clevel + 1"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:element name="h{$hlevel}">
+ <xsl:call-template name="anchor">
+ <xsl:with-param name="conditional" select="0"/>
+ </xsl:call-template>
+ <xsl:apply-templates/>
+ </xsl:element>
+</xsl:template>
+
+<xsl:template match="section/subtitle" mode="titlepage.mode" priority="2">
+ <xsl:call-template name="section.subtitle"/>
+</xsl:template>
+
+<xsl:template match="simplesect/subtitle" mode="titlepage.mode" priority="2">
+ <xsl:call-template name="section.subtitle"/>
+</xsl:template>
+
+<xsl:template match="sect1/subtitle" mode="titlepage.mode" priority="2">
+ <xsl:call-template name="section.subtitle"/>
+</xsl:template>
+
+<xsl:template match="sect2/subtitle" mode="titlepage.mode" priority="2">
+ <xsl:call-template name="section.subtitle"/>
+</xsl:template>
+
+<xsl:template match="sect3/subtitle" mode="titlepage.mode" priority="2">
+ <xsl:call-template name="section.subtitle"/>
+</xsl:template>
+
+<xsl:template match="sect4/subtitle" mode="titlepage.mode" priority="2">
+ <xsl:call-template name="section.subtitle"/>
+</xsl:template>
+
+<xsl:template match="sect5/subtitle" mode="titlepage.mode" priority="2">
+ <xsl:call-template name="section.subtitle"/>
+</xsl:template>
+
+<xsl:template name="section.subtitle">
+ <!-- the context node should be the subtitle of a section when called -->
+ <xsl:variable name="section" select="(ancestor::section
+ |ancestor::simplesect
+ |ancestor::sect1
+ |ancestor::sect2
+ |ancestor::sect3
+ |ancestor::sect4
+ |ancestor::sect5)[last()]"/>
+
+ <xsl:variable name="level">
+ <xsl:call-template name="section.level">
+ <xsl:with-param name="node" select="$section"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:call-template name="section.heading">
+ <xsl:with-param name="section" select=".."/>
+ <xsl:with-param name="allow-anchors" select="0"/>
+ <!-- subtitle heading level one higher than section level -->
+ <xsl:with-param name="level" select="$level + 1"/>
+ <xsl:with-param name="class" select="'subtitle'"/>
+ <xsl:with-param name="title">
+ <xsl:apply-templates select="$section" mode="object.subtitle.markup">
+ <xsl:with-param name="allow-anchors" select="0"/>
+ </xsl:apply-templates>
+ </xsl:with-param>
+ </xsl:call-template>
+</xsl:template>
+
+</xsl:stylesheet>
+
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/synop.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/synop.xsl
new file mode 100644
index 0000000..be19756
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/synop.xsl
@@ -0,0 +1,1554 @@
+<?xml version='1.0'?>
+<!DOCTYPE xsl:stylesheet [
+<!ENTITY nbsp "&#160;">
+]>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version='1.0'>
+
+<!-- ********************************************************************
+ $Id: synop.xsl 8421 2009-05-04 07:49:49Z bobstayton $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<!-- ==================================================================== -->
+
+<!-- synopsis is in verbatim -->
+
+<!-- ==================================================================== -->
+
+<xsl:template match="cmdsynopsis">
+ <div>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <p>
+ <xsl:if test="..//processing-instruction('dbcmdlist')">
+ <!-- * Placing a dbcmdlist PI as a child of a particular element -->
+ <!-- * creates a hyperlinked list of all cmdsynopsis instances -->
+ <!-- * that are descendants of that element; so for any -->
+ <!-- * cmdsynopsis that is a descendant of an element containing -->
+ <!-- * a dbcmdlist PI, we need to output an a@id instance so that -->
+ <!-- * we will have something to link to -->
+ <xsl:call-template name="anchor">
+ <xsl:with-param name="conditional" select="0"/>
+ </xsl:call-template>
+ </xsl:if>
+ <xsl:apply-templates/>
+ </p>
+ </div>
+</xsl:template>
+
+<xsl:template match="cmdsynopsis/command">
+ <br/>
+ <xsl:call-template name="inline.monoseq"/>
+ <xsl:text> </xsl:text>
+</xsl:template>
+
+<xsl:template match="cmdsynopsis/command[1]" priority="2">
+ <xsl:call-template name="inline.monoseq"/>
+ <xsl:text> </xsl:text>
+</xsl:template>
+
+<xsl:template match="group|arg" name="group-or-arg">
+ <xsl:variable name="choice" select="@choice"/>
+ <xsl:variable name="rep" select="@rep"/>
+ <xsl:variable name="sepchar">
+ <xsl:choose>
+ <xsl:when test="ancestor-or-self::*/@sepchar">
+ <xsl:value-of select="ancestor-or-self::*/@sepchar"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text> </xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:if test="preceding-sibling::*">
+ <xsl:value-of select="$sepchar"/>
+ </xsl:if>
+ <xsl:choose>
+ <xsl:when test="$choice='plain'">
+ <xsl:value-of select="$arg.choice.plain.open.str"/>
+ </xsl:when>
+ <xsl:when test="$choice='req'">
+ <xsl:value-of select="$arg.choice.req.open.str"/>
+ </xsl:when>
+ <xsl:when test="$choice='opt'">
+ <xsl:value-of select="$arg.choice.opt.open.str"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$arg.choice.def.open.str"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:apply-templates/>
+ <xsl:choose>
+ <xsl:when test="$rep='repeat'">
+ <xsl:value-of select="$arg.rep.repeat.str"/>
+ </xsl:when>
+ <xsl:when test="$rep='norepeat'">
+ <xsl:value-of select="$arg.rep.norepeat.str"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$arg.rep.def.str"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:choose>
+ <xsl:when test="$choice='plain'">
+ <xsl:value-of select="$arg.choice.plain.close.str"/>
+ </xsl:when>
+ <xsl:when test="$choice='req'">
+ <xsl:value-of select="$arg.choice.req.close.str"/>
+ </xsl:when>
+ <xsl:when test="$choice='opt'">
+ <xsl:value-of select="$arg.choice.opt.close.str"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$arg.choice.def.close.str"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="group/arg">
+ <xsl:variable name="choice" select="@choice"/>
+ <xsl:variable name="rep" select="@rep"/>
+ <xsl:if test="preceding-sibling::*">
+ <xsl:value-of select="$arg.or.sep"/>
+ </xsl:if>
+ <xsl:call-template name="group-or-arg"/>
+</xsl:template>
+
+<xsl:template match="sbr">
+ <br/>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="synopfragmentref">
+ <xsl:variable name="target" select="key('id',@linkend)"/>
+ <xsl:variable name="snum">
+ <xsl:apply-templates select="$target" mode="synopfragment.number"/>
+ </xsl:variable>
+ <i>
+ <a href="#{@linkend}">
+ <xsl:text>(</xsl:text>
+ <xsl:value-of select="$snum"/>
+ <xsl:text>)</xsl:text>
+ </a>
+ <xsl:text>&#160;</xsl:text>
+ <xsl:apply-templates/>
+ </i>
+</xsl:template>
+
+<xsl:template match="synopfragment" mode="synopfragment.number">
+ <xsl:number format="1"/>
+</xsl:template>
+
+<xsl:template match="synopfragment">
+ <xsl:variable name="snum">
+ <xsl:apply-templates select="." mode="synopfragment.number"/>
+ </xsl:variable>
+ <!-- You can't introduce another <p> here, because you're
+ already in a <p> from cmdsynopsis-->
+ <span>
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+ <a name="{$id}">
+ <xsl:text>(</xsl:text>
+ <xsl:value-of select="$snum"/>
+ <xsl:text>)</xsl:text>
+ </a>
+ <xsl:text> </xsl:text>
+ <xsl:apply-templates/>
+ </span>
+</xsl:template>
+
+<xsl:template match="funcsynopsis">
+ <xsl:if test="..//processing-instruction('dbfunclist')">
+ <!-- * Placing a dbfunclist PI as a child of a particular element -->
+ <!-- * creates a hyperlinked list of all funcsynopsis instances that -->
+ <!-- * are descendants of that element; so for any funcsynopsis that is -->
+ <!-- * a descendant of an element containing a dbfunclist PI, we need -->
+ <!-- * to output an a@id instance so that we will have something to -->
+ <!-- * link to -->
+ <xsl:call-template name="anchor">
+ <xsl:with-param name="conditional" select="0"/>
+ </xsl:call-template>
+ </xsl:if>
+ <xsl:call-template name="informal.object"/>
+</xsl:template>
+
+<xsl:template match="funcsynopsisinfo">
+ <pre>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates/>
+ </pre>
+</xsl:template>
+
+<!-- ====================================================================== -->
+<!-- funcprototype -->
+<!--
+
+funcprototype ::= (funcdef,
+ (void|varargs|paramdef+))
+
+funcdef ::= (#PCDATA|type|replaceable|function)*
+
+paramdef ::= (#PCDATA|type|replaceable|parameter|funcparams)*
+-->
+
+<xsl:template match="funcprototype">
+ <xsl:variable name="html-style">
+ <xsl:call-template name="pi.dbhtml_funcsynopsis-style">
+ <xsl:with-param name="node" select="ancestor::funcsynopsis/descendant-or-self::*"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="style">
+ <xsl:choose>
+ <xsl:when test="$html-style != ''">
+ <xsl:value-of select="$html-style"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$funcsynopsis.style"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+<!-- * 2008-02-17. the code no longer relies on the funcsynopsis.tabular.threshold -->
+<!-- * param at all (the stuff below has been commented out since mid -->
+<!-- * 2006), so I completely removed the funcsynopsis.tabular.threshold param -->
+<!-- * .. MikeSmith -->
+<!--
+ <xsl:variable name="tabular-p"
+ select="$funcsynopsis.tabular.threshold &gt; 0
+ and string-length(.) &gt; $funcsynopsis.tabular.threshold"/>
+-->
+
+ <xsl:variable name="tabular-p" select="true()"/>
+
+ <xsl:choose>
+ <xsl:when test="$style = 'kr' and $tabular-p">
+ <xsl:apply-templates select="." mode="kr-tabular"/>
+ </xsl:when>
+ <xsl:when test="$style = 'kr'">
+ <xsl:apply-templates select="." mode="kr-nontabular"/>
+ </xsl:when>
+ <xsl:when test="$style = 'ansi' and $tabular-p">
+ <xsl:apply-templates select="." mode="ansi-tabular"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="." mode="ansi-nontabular"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ====================================================================== -->
+<!-- funcprototype: kr, non-tabular -->
+
+<xsl:template match="funcprototype" mode="kr-nontabular">
+ <p>
+ <xsl:apply-templates mode="kr-nontabular"/>
+ <xsl:if test="paramdef">
+ <br/>
+ <xsl:apply-templates select="paramdef" mode="kr-funcsynopsis-mode"/>
+ </xsl:if>
+ </p>
+</xsl:template>
+
+<xsl:template match="funcdef" mode="kr-nontabular">
+ <code>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="kr-nontabular"/>
+ <xsl:text>(</xsl:text>
+ </code>
+</xsl:template>
+
+<xsl:template match="funcdef/function" mode="kr-nontabular">
+ <xsl:choose>
+ <xsl:when test="$funcsynopsis.decoration != 0">
+ <b class="fsfunc"><xsl:apply-templates mode="kr-nontabular"/></b>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates mode="kr-nontabular"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="void" mode="kr-nontabular">
+ <code>)</code>
+ <xsl:text>;</xsl:text>
+</xsl:template>
+
+<xsl:template match="varargs" mode="kr-nontabular">
+ <xsl:text>...</xsl:text>
+ <code>)</code>
+ <xsl:text>;</xsl:text>
+</xsl:template>
+
+<xsl:template match="paramdef" mode="kr-nontabular">
+ <xsl:apply-templates select="parameter" mode="kr-nontabular"/>
+ <xsl:choose>
+ <xsl:when test="following-sibling::*">
+ <xsl:text>, </xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <code>)</code>
+ <xsl:text>;</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="paramdef/parameter" mode="kr-nontabular">
+ <xsl:choose>
+ <xsl:when test="$funcsynopsis.decoration != 0">
+ <var class="pdparam">
+ <xsl:apply-templates mode="kr-nontabular"/>
+ </var>
+ </xsl:when>
+ <xsl:otherwise>
+ <code>
+ <xsl:apply-templates mode="kr-nontabular"/>
+ </code>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="paramdef" mode="kr-funcsynopsis-mode">
+ <xsl:if test="preceding-sibling::paramdef"><br/></xsl:if>
+ <code>
+ <xsl:apply-templates mode="kr-funcsynopsis-mode"/>
+ </code>
+ <xsl:text>;</xsl:text>
+</xsl:template>
+
+<xsl:template match="paramdef/parameter" mode="kr-funcsynopsis-mode">
+ <xsl:choose>
+ <xsl:when test="$funcsynopsis.decoration != 0">
+ <var class="pdparam">
+ <xsl:apply-templates mode="kr-funcsynopsis-mode"/>
+ </var>
+ </xsl:when>
+ <xsl:otherwise>
+ <code>
+ <xsl:apply-templates mode="kr-funcsynopsis-mode"/>
+ </code>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="funcparams" mode="kr-funcsynopsis-mode">
+ <code>(</code>
+ <xsl:apply-templates mode="kr-funcsynopsis-mode"/>
+ <code>)</code>
+</xsl:template>
+
+<!-- ====================================================================== -->
+<!-- funcprototype: kr, tabular -->
+
+<xsl:template match="funcprototype" mode="kr-tabular">
+ <table border="0" summary="Function synopsis" cellspacing="0" cellpadding="0"
+ class="funcprototype-table"
+ >
+ <tr>
+ <td>
+ <xsl:apply-templates select="funcdef" mode="kr-tabular"/>
+ </td>
+ <xsl:apply-templates select="(void|varargs|paramdef)[1]" mode="kr-tabular"/>
+ </tr>
+ <xsl:for-each select="(void|varargs|paramdef)[preceding-sibling::*[not(self::funcdef)]]">
+ <tr>
+ <td>&#160;</td>
+ <xsl:apply-templates select="." mode="kr-tabular"/>
+ </tr>
+ </xsl:for-each>
+ </table>
+ <xsl:if test="paramdef">
+ <div class="paramdef-list">
+ <xsl:apply-templates select="paramdef" mode="kr-funcsynopsis-mode"/>
+ </div>
+ </xsl:if>
+ <div class="funcprototype-spacer">&#160;</div> <!-- hACk: blank div for vertical spacing -->
+</xsl:template>
+
+<xsl:template match="funcdef" mode="kr-tabular">
+ <code>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="kr-tabular"/>
+ <xsl:text>(</xsl:text>
+ </code>
+</xsl:template>
+
+<xsl:template match="funcdef/function" mode="kr-tabular">
+ <xsl:choose>
+ <xsl:when test="$funcsynopsis.decoration != 0">
+ <b class="fsfunc"><xsl:apply-templates mode="kr-nontabular"/></b>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates mode="kr-tabular"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="void" mode="kr-tabular">
+ <td>
+ <code>)</code>
+ <xsl:text>;</xsl:text>
+ </td>
+ <td>&#160;</td>
+</xsl:template>
+
+<xsl:template match="varargs" mode="kr-tabular">
+ <td>
+ <xsl:text>...</xsl:text>
+ <code>)</code>
+ <xsl:text>;</xsl:text>
+ </td>
+ <td>&#160;</td>
+</xsl:template>
+
+<xsl:template match="paramdef" mode="kr-tabular">
+ <td>
+ <xsl:apply-templates select="parameter" mode="kr-tabular"/>
+ <xsl:choose>
+ <xsl:when test="following-sibling::*">
+ <xsl:text>, </xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <code>)</code>
+ <xsl:text>;</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ </td>
+ <td>&#160;</td>
+</xsl:template>
+
+<xsl:template match="paramdef/parameter" mode="kr-tabular">
+ <xsl:choose>
+ <xsl:when test="$funcsynopsis.decoration != 0">
+ <var class="pdparam">
+ <xsl:apply-templates mode="kr-tabular"/>
+ </var>
+ </xsl:when>
+ <xsl:otherwise>
+ <code>
+ <xsl:apply-templates mode="kr-tabular"/>
+ </code>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="paramdef" mode="kr-tabular-funcsynopsis-mode">
+ <xsl:variable name="type">
+ <xsl:choose>
+ <xsl:when test="type">
+ <xsl:apply-templates select="type"
+ mode="kr-tabular-funcsynopsis-mode"/>
+ </xsl:when>
+ <xsl:when test="normalize-space(parameter/preceding-sibling::node()[not(self::parameter)]) != ''">
+ <xsl:copy-of select="parameter/preceding-sibling::node()[not(self::parameter)]"/>
+ </xsl:when>
+ </xsl:choose>
+ </xsl:variable>
+
+ <tr>
+ <xsl:choose>
+ <xsl:when test="$type != '' and funcparams">
+ <td>
+ <code>
+ <xsl:copy-of select="$type"/>
+ </code>
+ <xsl:text>&#160;</xsl:text>
+ </td>
+ <td>
+ <code>
+ <xsl:choose>
+ <xsl:when test="type">
+ <xsl:apply-templates select="type/following-sibling::*"
+ mode="kr-tabular-funcsynopsis-mode"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="*"
+ mode="kr-tabular-funcsynopsis-mode"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </code>
+ </td>
+ </xsl:when>
+
+ <xsl:when test="funcparams">
+ <td colspan="2">
+ <code>
+ <xsl:apply-templates mode="kr-tabular-funcsynopsis-mode"/>
+ </code>
+ </td>
+ </xsl:when>
+
+ <xsl:otherwise>
+ <td>
+ <code>
+ <xsl:apply-templates select="parameter/preceding-sibling::node()[not(self::parameter)]"
+ mode="kr-tabular-funcsynopsis-mode"/>
+ </code>
+ <xsl:text>&#160;</xsl:text>
+ </td>
+ <td>
+ <code>
+ <xsl:apply-templates select="parameter"
+ mode="kr-tabular"/>
+ <xsl:apply-templates select="parameter/following-sibling::*[not(self::parameter)]"
+ mode="kr-tabular-funcsynopsis-mode"/>
+ <xsl:text>;</xsl:text>
+ </code>
+ </td>
+ </xsl:otherwise>
+ </xsl:choose>
+ </tr>
+</xsl:template>
+
+<xsl:template match="paramdef/parameter" mode="kr-tabular-funcsynopsis-mode">
+ <xsl:choose>
+ <xsl:when test="$funcsynopsis.decoration != 0">
+ <var class="pdparam">
+ <xsl:apply-templates mode="kr-tabular-funcsynopsis-mode"/>
+ </var>
+ </xsl:when>
+ <xsl:otherwise>
+ <code>
+ <xsl:apply-templates mode="kr-tabular-funcsynopsis-mode"/>
+ </code>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="funcparams" mode="kr-tabular-funcsynopsis-mode">
+ <code>(</code>
+ <xsl:apply-templates mode="kr-tabular-funcsynopsis-mode"/>
+ <code>)</code>
+ <xsl:text>;</xsl:text>
+</xsl:template>
+
+<!-- ====================================================================== -->
+<!-- funcprototype: ansi, non-tabular -->
+
+<xsl:template match="funcprototype" mode="ansi-nontabular">
+ <p>
+ <xsl:apply-templates mode="ansi-nontabular"/>
+ </p>
+</xsl:template>
+
+<xsl:template match="funcdef" mode="ansi-nontabular">
+ <code>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="ansi-nontabular"/>
+ <xsl:text>(</xsl:text>
+ </code>
+</xsl:template>
+
+<xsl:template match="funcdef/function" mode="ansi-nontabular">
+ <xsl:choose>
+ <xsl:when test="$funcsynopsis.decoration != 0">
+ <b class="fsfunc"><xsl:apply-templates mode="ansi-nontabular"/></b>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates mode="ansi-nontabular"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="void" mode="ansi-nontabular">
+ <code>void)</code>
+ <xsl:text>;</xsl:text>
+</xsl:template>
+
+<xsl:template match="varargs" mode="ansi-nontabular">
+ <xsl:text>...</xsl:text>
+ <code>)</code>
+ <xsl:text>;</xsl:text>
+</xsl:template>
+
+<xsl:template match="paramdef" mode="ansi-nontabular">
+ <xsl:apply-templates mode="ansi-nontabular"/>
+ <xsl:choose>
+ <xsl:when test="following-sibling::*">
+ <xsl:text>, </xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <code>)</code>
+ <xsl:text>;</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="paramdef/parameter" mode="ansi-nontabular">
+ <xsl:choose>
+ <xsl:when test="$funcsynopsis.decoration != 0">
+ <var class="pdparam">
+ <xsl:apply-templates mode="ansi-nontabular"/>
+ </var>
+ </xsl:when>
+ <xsl:otherwise>
+ <code>
+ <xsl:apply-templates mode="ansi-nontabular"/>
+ </code>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="funcparams" mode="ansi-nontabular">
+ <code>(</code>
+ <xsl:apply-templates mode="ansi-nontabular"/>
+ <code>)</code>
+</xsl:template>
+
+<!-- ====================================================================== -->
+<!-- funcprototype: ansi, tabular -->
+
+<xsl:template match="funcprototype" mode="ansi-tabular">
+ <table border="0" summary="Function synopsis" cellspacing="0" cellpadding="0"
+ class="funcprototype-table"
+ >
+ <tr>
+ <td>
+ <xsl:apply-templates select="funcdef" mode="ansi-tabular"/>
+ </td>
+ <xsl:apply-templates select="(void|varargs|paramdef)[1]" mode="ansi-tabular"/>
+ </tr>
+ <xsl:for-each select="(void|varargs|paramdef)[preceding-sibling::*[not(self::funcdef)]]">
+ <tr>
+ <td>&#160;</td>
+ <xsl:apply-templates select="." mode="ansi-tabular"/>
+ </tr>
+ </xsl:for-each>
+ </table>
+ <div class="funcprototype-spacer">&#160;</div> <!-- hACk: blank div for vertical spacing -->
+</xsl:template>
+
+<xsl:template match="funcdef" mode="ansi-tabular">
+ <code>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="ansi-tabular"/>
+ <xsl:text>(</xsl:text>
+ </code>
+</xsl:template>
+
+<xsl:template match="funcdef/function" mode="ansi-tabular">
+ <xsl:choose>
+ <xsl:when test="$funcsynopsis.decoration != 0">
+ <b class="fsfunc"><xsl:apply-templates mode="ansi-nontabular"/></b>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates mode="kr-tabular"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="void" mode="ansi-tabular">
+ <td>
+ <code>void)</code>
+ <xsl:text>;</xsl:text>
+ </td>
+ <td>&#160;</td>
+</xsl:template>
+
+<xsl:template match="varargs" mode="ansi-tabular">
+ <td>
+ <xsl:text>...</xsl:text>
+ <code>)</code>
+ <xsl:text>;</xsl:text>
+ </td>
+ <td>&#160;</td>
+</xsl:template>
+
+<xsl:template match="paramdef" mode="ansi-tabular">
+ <td>
+ <xsl:apply-templates mode="ansi-tabular"/>
+ <xsl:choose>
+ <xsl:when test="following-sibling::*">
+ <xsl:text>, </xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <code>)</code>
+ <xsl:text>;</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ </td>
+</xsl:template>
+
+<xsl:template match="paramdef/parameter" mode="ansi-tabular">
+ <xsl:choose>
+ <xsl:when test="$funcsynopsis.decoration != 0">
+ <var class="pdparam">
+ <xsl:apply-templates mode="ansi-tabular"/>
+ </var>
+ </xsl:when>
+ <xsl:otherwise>
+ <code>
+ <xsl:apply-templates mode="ansi-tabular"/>
+ </code>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="funcparams" mode="ansi-tabular">
+ <code>(</code>
+ <xsl:apply-templates/>
+ <code>)</code>
+</xsl:template>
+
+<!-- ====================================================================== -->
+
+<xsl:variable name="default-classsynopsis-language">java</xsl:variable>
+
+<xsl:template match="classsynopsis
+ |fieldsynopsis
+ |methodsynopsis
+ |constructorsynopsis
+ |destructorsynopsis">
+ <xsl:param name="language">
+ <xsl:choose>
+ <xsl:when test="@language">
+ <xsl:value-of select="@language"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$default-classsynopsis-language"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:param>
+
+ <xsl:choose>
+ <xsl:when test="$language='java' or $language='Java'">
+ <xsl:apply-templates select="." mode="java"/>
+ </xsl:when>
+ <xsl:when test="$language='perl' or $language='Perl'">
+ <xsl:apply-templates select="." mode="perl"/>
+ </xsl:when>
+ <xsl:when test="$language='idl' or $language='IDL'">
+ <xsl:apply-templates select="." mode="idl"/>
+ </xsl:when>
+ <xsl:when test="$language='cpp' or $language='c++' or $language='C++'">
+ <xsl:apply-templates select="." mode="cpp"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:message>
+ <xsl:text>Unrecognized language on </xsl:text>
+ <xsl:value-of select="local-name(.)"/>
+ <xsl:text>: </xsl:text>
+ <xsl:value-of select="$language"/>
+ </xsl:message>
+ <xsl:apply-templates select=".">
+ <xsl:with-param name="language"
+ select="$default-classsynopsis-language"/>
+ </xsl:apply-templates>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="synop-break">
+ <xsl:if test="parent::classsynopsis
+ or (following-sibling::fieldsynopsis
+ |following-sibling::methodsynopsis
+ |following-sibling::constructorsynopsis
+ |following-sibling::destructorsynopsis)">
+ <br/>
+ </xsl:if>
+</xsl:template>
+
+
+<!-- ===== Java ======================================================== -->
+
+<xsl:template match="classsynopsis" mode="java">
+ <pre>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates select="ooclass[1]" mode="java"/>
+ <xsl:if test="ooclass[preceding-sibling::*]">
+ <xsl:text> extends</xsl:text>
+ <xsl:apply-templates select="ooclass[preceding-sibling::*]" mode="java"/>
+ <xsl:if test="oointerface|ooexception">
+ <br/>
+ <xsl:text>&nbsp;&nbsp;&nbsp;&nbsp;</xsl:text>
+ </xsl:if>
+ </xsl:if>
+ <xsl:if test="oointerface">
+ <xsl:text>implements</xsl:text>
+ <xsl:apply-templates select="oointerface" mode="java"/>
+ <xsl:if test="ooexception">
+ <br/>
+ <xsl:text>&nbsp;&nbsp;&nbsp;&nbsp;</xsl:text>
+ </xsl:if>
+ </xsl:if>
+ <xsl:if test="ooexception">
+ <xsl:text>throws</xsl:text>
+ <xsl:apply-templates select="ooexception" mode="java"/>
+ </xsl:if>
+ <xsl:text>&nbsp;{</xsl:text>
+ <br/>
+ <xsl:apply-templates select="constructorsynopsis
+ |destructorsynopsis
+ |fieldsynopsis
+ |methodsynopsis
+ |classsynopsisinfo" mode="java"/>
+ <xsl:text>}</xsl:text>
+ </pre>
+</xsl:template>
+
+<xsl:template match="classsynopsisinfo" mode="java">
+ <xsl:apply-templates mode="java"/>
+</xsl:template>
+
+<xsl:template match="ooclass|oointerface|ooexception" mode="java">
+ <xsl:choose>
+ <xsl:when test="preceding-sibling::*">
+ <xsl:text>, </xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text> </xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="java"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="modifier|package" mode="java">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="java"/>
+ <xsl:if test="following-sibling::*">
+ <xsl:text>&nbsp;</xsl:text>
+ </xsl:if>
+ </span>
+</xsl:template>
+
+<xsl:template match="classname" mode="java">
+ <xsl:if test="local-name(preceding-sibling::*[1]) = 'classname'">
+ <xsl:text>, </xsl:text>
+ </xsl:if>
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="java"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="interfacename" mode="java">
+ <xsl:if test="local-name(preceding-sibling::*[1]) = 'interfacename'">
+ <xsl:text>, </xsl:text>
+ </xsl:if>
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="java"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="exceptionname" mode="java">
+ <xsl:if test="local-name(preceding-sibling::*[1]) = 'exceptionname'">
+ <xsl:text>, </xsl:text>
+ </xsl:if>
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="java"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="fieldsynopsis" mode="java">
+ <code>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:if test="parent::classsynopsis">
+ <xsl:text>&nbsp;&nbsp;</xsl:text>
+ </xsl:if>
+ <xsl:apply-templates mode="java"/>
+ <xsl:text>;</xsl:text>
+ </code>
+ <xsl:call-template name="synop-break"/>
+</xsl:template>
+
+<xsl:template match="type" mode="java">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="java"/>
+ <xsl:text>&nbsp;</xsl:text>
+ </span>
+</xsl:template>
+
+<xsl:template match="varname" mode="java">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="java"/>
+ <xsl:text>&nbsp;</xsl:text>
+ </span>
+</xsl:template>
+
+<xsl:template match="initializer" mode="java">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:text>=&nbsp;</xsl:text>
+ <xsl:apply-templates mode="java"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="void" mode="java">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:text>void&nbsp;</xsl:text>
+ </span>
+</xsl:template>
+
+<xsl:template match="methodname" mode="java">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="java"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="methodparam" mode="java">
+ <xsl:param name="indent">0</xsl:param>
+ <xsl:if test="preceding-sibling::methodparam">
+ <xsl:text>,</xsl:text>
+ <br/>
+ <xsl:if test="$indent &gt; 0">
+ <xsl:call-template name="copy-string">
+ <xsl:with-param name="string">&nbsp;</xsl:with-param>
+ <xsl:with-param name="count" select="$indent + 1"/>
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:if>
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="java"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="parameter" mode="java">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="java"/>
+ </span>
+</xsl:template>
+
+<xsl:template mode="java"
+ match="constructorsynopsis|destructorsynopsis|methodsynopsis">
+ <xsl:variable name="start-modifiers" select="modifier[following-sibling::*[local-name(.) != 'modifier']]"/>
+ <xsl:variable name="notmod" select="*[local-name(.) != 'modifier']"/>
+ <xsl:variable name="end-modifiers" select="modifier[preceding-sibling::*[local-name(.) != 'modifier']]"/>
+ <xsl:variable name="decl">
+ <xsl:if test="parent::classsynopsis">
+ <xsl:text>&nbsp;&nbsp;</xsl:text>
+ </xsl:if>
+ <xsl:apply-templates select="$start-modifiers" mode="java"/>
+
+ <!-- type -->
+ <xsl:if test="local-name($notmod[1]) != 'methodname'">
+ <xsl:apply-templates select="$notmod[1]" mode="java"/>
+ </xsl:if>
+
+ <xsl:apply-templates select="methodname" mode="java"/>
+ </xsl:variable>
+
+ <code>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:copy-of select="$decl"/>
+ <xsl:text>(</xsl:text>
+ <xsl:apply-templates select="methodparam" mode="java">
+ <xsl:with-param name="indent" select="string-length($decl)"/>
+ </xsl:apply-templates>
+ <xsl:text>)</xsl:text>
+ <xsl:if test="exceptionname">
+ <br/>
+ <xsl:text>&nbsp;&nbsp;&nbsp;&nbsp;throws&nbsp;</xsl:text>
+ <xsl:apply-templates select="exceptionname" mode="java"/>
+ </xsl:if>
+ <xsl:if test="modifier[preceding-sibling::*[local-name(.) != 'modifier']]">
+ <xsl:text> </xsl:text>
+ <xsl:apply-templates select="$end-modifiers" mode="java"/>
+ </xsl:if>
+ <xsl:text>;</xsl:text>
+ </code>
+ <xsl:call-template name="synop-break"/>
+</xsl:template>
+
+<!-- ===== C++ ========================================================= -->
+
+<xsl:template match="classsynopsis" mode="cpp">
+ <pre>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates select="ooclass[1]" mode="cpp"/>
+ <xsl:if test="ooclass[preceding-sibling::*]">
+ <xsl:text>: </xsl:text>
+ <xsl:apply-templates select="ooclass[preceding-sibling::*]" mode="cpp"/>
+ <xsl:if test="oointerface|ooexception">
+ <br/>
+ <xsl:text>&nbsp;&nbsp;&nbsp;&nbsp;</xsl:text>
+ </xsl:if>
+ </xsl:if>
+ <xsl:if test="oointerface">
+ <xsl:text> implements</xsl:text>
+ <xsl:apply-templates select="oointerface" mode="cpp"/>
+ <xsl:if test="ooexception">
+ <br/>
+ <xsl:text>&nbsp;&nbsp;&nbsp;&nbsp;</xsl:text>
+ </xsl:if>
+ </xsl:if>
+ <xsl:if test="ooexception">
+ <xsl:text> throws</xsl:text>
+ <xsl:apply-templates select="ooexception" mode="cpp"/>
+ </xsl:if>
+ <xsl:text>&nbsp;{</xsl:text>
+ <br/>
+ <xsl:apply-templates select="constructorsynopsis
+ |destructorsynopsis
+ |fieldsynopsis
+ |methodsynopsis
+ |classsynopsisinfo" mode="cpp"/>
+ <xsl:text>}</xsl:text>
+ </pre>
+</xsl:template>
+
+<xsl:template match="classsynopsisinfo" mode="cpp">
+ <xsl:apply-templates mode="cpp"/>
+</xsl:template>
+
+<xsl:template match="ooclass|oointerface|ooexception" mode="cpp">
+ <xsl:if test="preceding-sibling::*">
+ <xsl:text>, </xsl:text>
+ </xsl:if>
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="cpp"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="modifier|package" mode="cpp">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="cpp"/>
+ <xsl:if test="following-sibling::*">
+ <xsl:text>&nbsp;</xsl:text>
+ </xsl:if>
+ </span>
+</xsl:template>
+
+<xsl:template match="classname" mode="cpp">
+ <xsl:if test="local-name(preceding-sibling::*[1]) = 'classname'">
+ <xsl:text>, </xsl:text>
+ </xsl:if>
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="cpp"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="interfacename" mode="cpp">
+ <xsl:if test="local-name(preceding-sibling::*[1]) = 'interfacename'">
+ <xsl:text>, </xsl:text>
+ </xsl:if>
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="cpp"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="exceptionname" mode="cpp">
+ <xsl:if test="local-name(preceding-sibling::*[1]) = 'exceptionname'">
+ <xsl:text>, </xsl:text>
+ </xsl:if>
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="cpp"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="fieldsynopsis" mode="cpp">
+ <code>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:if test="parent::classsynopsis">
+ <xsl:text>&nbsp;&nbsp;</xsl:text>
+ </xsl:if>
+ <xsl:apply-templates mode="cpp"/>
+ <xsl:text>;</xsl:text>
+ </code>
+ <xsl:call-template name="synop-break"/>
+</xsl:template>
+
+<xsl:template match="type" mode="cpp">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="cpp"/>
+ <xsl:text>&nbsp;</xsl:text>
+ </span>
+</xsl:template>
+
+<xsl:template match="varname" mode="cpp">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="cpp"/>
+ <xsl:text>&nbsp;</xsl:text>
+ </span>
+</xsl:template>
+
+<xsl:template match="initializer" mode="cpp">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:text>=&nbsp;</xsl:text>
+ <xsl:apply-templates mode="cpp"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="void" mode="cpp">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:text>void&nbsp;</xsl:text>
+ </span>
+</xsl:template>
+
+<xsl:template match="methodname" mode="cpp">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="cpp"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="methodparam" mode="cpp">
+ <xsl:if test="preceding-sibling::methodparam">
+ <xsl:text>, </xsl:text>
+ </xsl:if>
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="cpp"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="parameter" mode="cpp">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="cpp"/>
+ </span>
+</xsl:template>
+
+<xsl:template mode="cpp"
+ match="constructorsynopsis|destructorsynopsis|methodsynopsis">
+ <xsl:variable name="start-modifiers" select="modifier[following-sibling::*[local-name(.) != 'modifier']]"/>
+ <xsl:variable name="notmod" select="*[local-name(.) != 'modifier']"/>
+ <xsl:variable name="end-modifiers" select="modifier[preceding-sibling::*[local-name(.) != 'modifier']]"/>
+
+ <code>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:if test="parent::classsynopsis">
+ <xsl:text>&nbsp;&nbsp;</xsl:text>
+ </xsl:if>
+ <xsl:apply-templates select="$start-modifiers" mode="cpp"/>
+
+ <!-- type -->
+ <xsl:if test="local-name($notmod[1]) != 'methodname'">
+ <xsl:apply-templates select="$notmod[1]" mode="cpp"/>
+ </xsl:if>
+
+ <xsl:apply-templates select="methodname" mode="cpp"/>
+ <xsl:text>(</xsl:text>
+ <xsl:apply-templates select="methodparam" mode="cpp"/>
+ <xsl:text>)</xsl:text>
+ <xsl:if test="exceptionname">
+ <br/>
+ <xsl:text>&nbsp;&nbsp;&nbsp;&nbsp;throws&nbsp;</xsl:text>
+ <xsl:apply-templates select="exceptionname" mode="cpp"/>
+ </xsl:if>
+ <xsl:if test="modifier[preceding-sibling::*[local-name(.) != 'modifier']]">
+ <xsl:text> </xsl:text>
+ <xsl:apply-templates select="$end-modifiers" mode="cpp"/>
+ </xsl:if>
+ <xsl:text>;</xsl:text>
+ </code>
+ <xsl:call-template name="synop-break"/>
+</xsl:template>
+
+<!-- ===== IDL ========================================================= -->
+
+<xsl:template match="classsynopsis" mode="idl">
+ <pre>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:text>interface </xsl:text>
+ <xsl:apply-templates select="ooclass[1]" mode="idl"/>
+ <xsl:if test="ooclass[preceding-sibling::*]">
+ <xsl:text>: </xsl:text>
+ <xsl:apply-templates select="ooclass[preceding-sibling::*]" mode="idl"/>
+ <xsl:if test="oointerface|ooexception">
+ <br/>
+ <xsl:text>&nbsp;&nbsp;&nbsp;&nbsp;</xsl:text>
+ </xsl:if>
+ </xsl:if>
+ <xsl:if test="oointerface">
+ <xsl:text> implements</xsl:text>
+ <xsl:apply-templates select="oointerface" mode="idl"/>
+ <xsl:if test="ooexception">
+ <br/>
+ <xsl:text>&nbsp;&nbsp;&nbsp;&nbsp;</xsl:text>
+ </xsl:if>
+ </xsl:if>
+ <xsl:if test="ooexception">
+ <xsl:text> throws</xsl:text>
+ <xsl:apply-templates select="ooexception" mode="idl"/>
+ </xsl:if>
+ <xsl:text>&nbsp;{</xsl:text>
+ <br/>
+ <xsl:apply-templates select="constructorsynopsis
+ |destructorsynopsis
+ |fieldsynopsis
+ |methodsynopsis
+ |classsynopsisinfo" mode="idl"/>
+ <xsl:text>}</xsl:text>
+ </pre>
+</xsl:template>
+
+<xsl:template match="classsynopsisinfo" mode="idl">
+ <xsl:apply-templates mode="idl"/>
+</xsl:template>
+
+<xsl:template match="ooclass|oointerface|ooexception" mode="idl">
+ <xsl:if test="preceding-sibling::*">
+ <xsl:text>, </xsl:text>
+ </xsl:if>
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="idl"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="modifier|package" mode="idl">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="idl"/>
+ <xsl:if test="following-sibling::*">
+ <xsl:text>&nbsp;</xsl:text>
+ </xsl:if>
+ </span>
+</xsl:template>
+
+<xsl:template match="classname" mode="idl">
+ <xsl:if test="local-name(preceding-sibling::*[1]) = 'classname'">
+ <xsl:text>, </xsl:text>
+ </xsl:if>
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="idl"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="interfacename" mode="idl">
+ <xsl:if test="local-name(preceding-sibling::*[1]) = 'interfacename'">
+ <xsl:text>, </xsl:text>
+ </xsl:if>
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="idl"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="exceptionname" mode="idl">
+ <xsl:if test="local-name(preceding-sibling::*[1]) = 'exceptionname'">
+ <xsl:text>, </xsl:text>
+ </xsl:if>
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="idl"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="fieldsynopsis" mode="idl">
+ <code>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:if test="parent::classsynopsis">
+ <xsl:text>&nbsp;&nbsp;</xsl:text>
+ </xsl:if>
+ <xsl:apply-templates mode="idl"/>
+ <xsl:text>;</xsl:text>
+ </code>
+ <xsl:call-template name="synop-break"/>
+</xsl:template>
+
+<xsl:template match="type" mode="idl">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="idl"/>
+ <xsl:text>&nbsp;</xsl:text>
+ </span>
+</xsl:template>
+
+<xsl:template match="varname" mode="idl">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="idl"/>
+ <xsl:text>&nbsp;</xsl:text>
+ </span>
+</xsl:template>
+
+<xsl:template match="initializer" mode="idl">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:text>=&nbsp;</xsl:text>
+ <xsl:apply-templates mode="idl"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="void" mode="idl">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:text>void&nbsp;</xsl:text>
+ </span>
+</xsl:template>
+
+<xsl:template match="methodname" mode="idl">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="idl"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="methodparam" mode="idl">
+ <xsl:if test="preceding-sibling::methodparam">
+ <xsl:text>, </xsl:text>
+ </xsl:if>
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="idl"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="parameter" mode="idl">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="idl"/>
+ </span>
+</xsl:template>
+
+<xsl:template mode="idl"
+ match="constructorsynopsis|destructorsynopsis|methodsynopsis">
+ <xsl:variable name="start-modifiers" select="modifier[following-sibling::*[local-name(.) != 'modifier']]"/>
+ <xsl:variable name="notmod" select="*[local-name(.) != 'modifier']"/>
+ <xsl:variable name="end-modifiers" select="modifier[preceding-sibling::*[local-name(.) != 'modifier']]"/>
+ <code>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:if test="parent::classsynopsis">
+ <xsl:text>&nbsp;&nbsp;</xsl:text>
+ </xsl:if>
+ <xsl:apply-templates select="$start-modifiers" mode="idl"/>
+
+ <!-- type -->
+ <xsl:if test="local-name($notmod[1]) != 'methodname'">
+ <xsl:apply-templates select="$notmod[1]" mode="idl"/>
+ </xsl:if>
+
+ <xsl:apply-templates select="methodname" mode="idl"/>
+ <xsl:text>(</xsl:text>
+ <xsl:apply-templates select="methodparam" mode="idl"/>
+ <xsl:text>)</xsl:text>
+ <xsl:if test="exceptionname">
+ <br/>
+ <xsl:text>&nbsp;&nbsp;&nbsp;&nbsp;raises(</xsl:text>
+ <xsl:apply-templates select="exceptionname" mode="idl"/>
+ <xsl:text>)</xsl:text>
+ </xsl:if>
+ <xsl:if test="modifier[preceding-sibling::*[local-name(.) != 'modifier']]">
+ <xsl:text> </xsl:text>
+ <xsl:apply-templates select="$end-modifiers" mode="idl"/>
+ </xsl:if>
+ <xsl:text>;</xsl:text>
+ </code>
+ <xsl:call-template name="synop-break"/>
+</xsl:template>
+
+<!-- ===== Perl ======================================================== -->
+
+<xsl:template match="classsynopsis" mode="perl">
+ <pre>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:text>package </xsl:text>
+ <xsl:apply-templates select="ooclass[1]" mode="perl"/>
+ <xsl:text>;</xsl:text>
+ <br/>
+
+ <xsl:if test="ooclass[preceding-sibling::*]">
+ <xsl:text>@ISA = (</xsl:text>
+ <xsl:apply-templates select="ooclass[preceding-sibling::*]" mode="perl"/>
+ <xsl:text>);</xsl:text>
+ <br/>
+ </xsl:if>
+
+ <xsl:apply-templates select="constructorsynopsis
+ |destructorsynopsis
+ |fieldsynopsis
+ |methodsynopsis
+ |classsynopsisinfo" mode="perl"/>
+ </pre>
+</xsl:template>
+
+<xsl:template match="classsynopsisinfo" mode="perl">
+ <xsl:apply-templates mode="perl"/>
+</xsl:template>
+
+<xsl:template match="ooclass|oointerface|ooexception" mode="perl">
+ <xsl:if test="preceding-sibling::*">
+ <xsl:text>, </xsl:text>
+ </xsl:if>
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="perl"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="modifier|package" mode="perl">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="perl"/>
+ <xsl:if test="following-sibling::*">
+ <xsl:text>&nbsp;</xsl:text>
+ </xsl:if>
+ </span>
+</xsl:template>
+
+<xsl:template match="classname" mode="perl">
+ <xsl:if test="local-name(preceding-sibling::*[1]) = 'classname'">
+ <xsl:text>, </xsl:text>
+ </xsl:if>
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="perl"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="interfacename" mode="perl">
+ <xsl:if test="local-name(preceding-sibling::*[1]) = 'interfacename'">
+ <xsl:text>, </xsl:text>
+ </xsl:if>
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="perl"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="exceptionname" mode="perl">
+ <xsl:if test="local-name(preceding-sibling::*[1]) = 'exceptionname'">
+ <xsl:text>, </xsl:text>
+ </xsl:if>
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="perl"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="fieldsynopsis" mode="perl">
+ <code>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:if test="parent::classsynopsis">
+ <xsl:text>&nbsp;&nbsp;</xsl:text>
+ </xsl:if>
+ <xsl:apply-templates mode="perl"/>
+ <xsl:text>;</xsl:text>
+ </code>
+ <xsl:call-template name="synop-break"/>
+</xsl:template>
+
+<xsl:template match="type" mode="perl">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="perl"/>
+ <xsl:text>&nbsp;</xsl:text>
+ </span>
+</xsl:template>
+
+<xsl:template match="varname" mode="perl">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="perl"/>
+ <xsl:text>&nbsp;</xsl:text>
+ </span>
+</xsl:template>
+
+<xsl:template match="initializer" mode="perl">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:text>=&nbsp;</xsl:text>
+ <xsl:apply-templates mode="perl"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="void" mode="perl">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:text>void&nbsp;</xsl:text>
+ </span>
+</xsl:template>
+
+<xsl:template match="methodname" mode="perl">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="perl"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="methodparam" mode="perl">
+ <xsl:if test="preceding-sibling::methodparam">
+ <xsl:text>, </xsl:text>
+ </xsl:if>
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="perl"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="parameter" mode="perl">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="perl"/>
+ </span>
+</xsl:template>
+
+<xsl:template mode="perl"
+ match="constructorsynopsis|destructorsynopsis|methodsynopsis">
+ <xsl:variable name="start-modifiers" select="modifier[following-sibling::*[local-name(.) != 'modifier']]"/>
+ <xsl:variable name="notmod" select="*[local-name(.) != 'modifier']"/>
+ <xsl:variable name="end-modifiers" select="modifier[preceding-sibling::*[local-name(.) != 'modifier']]"/>
+
+ <code>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:text>sub </xsl:text>
+
+ <xsl:apply-templates select="methodname" mode="perl"/>
+ <xsl:text> { ... };</xsl:text>
+ </code>
+ <xsl:call-template name="synop-break"/>
+</xsl:template>
+
+<!-- Used when not occurring as a child of classsynopsis -->
+<xsl:template match="ooclass|oointerface|ooexception">
+ <xsl:apply-templates/>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<!-- * DocBook 5 allows linking elements (link, olink, and xref) -->
+<!-- * within the OO *synopsis elements (classsynopsis, fieldsynopsis, -->
+<!-- * methodsynopsis, constructorsynopsis, destructorsynopsis) and -->
+<!-- * their children. So we need to have mode="java|cpp|idl|perl" -->
+<!-- * per-mode matches for those linking elements in order for them -->
+<!-- * to be processed as expected. -->
+
+<xsl:template match="link|olink|xref" mode="java">
+ <xsl:apply-templates select="."/>
+</xsl:template>
+
+<xsl:template match="link|olink|xref" mode="cpp">
+ <xsl:apply-templates select="."/>
+</xsl:template>
+
+<xsl:template match="link|olink|xref" mode="idl">
+ <xsl:apply-templates select="."/>
+</xsl:template>
+
+<xsl:template match="link|olink|xref" mode="perl">
+ <xsl:apply-templates select="."/>
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/table.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/table.xsl
new file mode 100644
index 0000000..405be13
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/table.xsl
@@ -0,0 +1,1200 @@
+<?xml version='1.0'?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:doc="http://nwalsh.com/xsl/documentation/1.0"
+ xmlns:stbl="http://nwalsh.com/xslt/ext/com.nwalsh.saxon.Table"
+ xmlns:xtbl="xalan://com.nwalsh.xalan.Table"
+ xmlns:lxslt="http://xml.apache.org/xslt"
+ xmlns:ptbl="http://nwalsh.com/xslt/ext/xsltproc/python/Table"
+ exclude-result-prefixes="doc stbl xtbl lxslt ptbl"
+ version='1.0'>
+
+<xsl:include href="../common/table.xsl"/>
+
+<!-- ********************************************************************
+ $Id: table.xsl 8813 2010-08-09 21:18:23Z bobstayton $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<lxslt:component prefix="xtbl"
+ functions="adjustColumnWidths"/>
+
+<xsl:template name="empty.table.cell">
+ <xsl:param name="colnum" select="0"/>
+
+ <xsl:variable name="rowsep">
+ <xsl:choose>
+ <!-- If this is the last row, rowsep never applies. -->
+ <xsl:when test="not(ancestor-or-self::row[1]/following-sibling::row
+ or ancestor-or-self::thead/following-sibling::tbody
+ or ancestor-or-self::tbody/preceding-sibling::tfoot)">
+ <xsl:value-of select="0"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="inherited.table.attribute">
+ <xsl:with-param name="entry" select="NOT-AN-ELEMENT-NAME"/>
+ <xsl:with-param name="row" select="ancestor-or-self::row[1]"/>
+ <xsl:with-param name="colnum" select="$colnum"/>
+ <xsl:with-param name="attribute" select="'rowsep'"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="colsep">
+ <xsl:choose>
+ <!-- If this is the last column, colsep never applies. -->
+ <xsl:when test="number($colnum) &gt;= ancestor::tgroup/@cols">0</xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="inherited.table.attribute">
+ <xsl:with-param name="entry" select="NOT-AN-ELEMENT-NAME"/>
+ <xsl:with-param name="row" select="ancestor-or-self::row[1]"/>
+ <xsl:with-param name="colnum" select="$colnum"/>
+ <xsl:with-param name="attribute" select="'colsep'"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <td class="auto-generated">
+ <xsl:if test="$table.borders.with.css != 0">
+ <xsl:attribute name="style">
+ <xsl:if test="$colsep &gt; 0">
+ <xsl:call-template name="border">
+ <xsl:with-param name="side" select="'right'"/>
+ </xsl:call-template>
+ </xsl:if>
+ <xsl:if test="$rowsep &gt; 0">
+ <xsl:call-template name="border">
+ <xsl:with-param name="side" select="'bottom'"/>
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:text>&#160;</xsl:text>
+ </td>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template name="border">
+ <xsl:param name="side" select="'left'"/>
+ <xsl:param name="padding" select="0"/>
+ <xsl:param name="style" select="$table.cell.border.style"/>
+ <xsl:param name="color" select="$table.cell.border.color"/>
+ <xsl:param name="thickness" select="$table.cell.border.thickness"/>
+
+ <!-- Note: Some browsers (mozilla) require at least a width and style. -->
+
+ <xsl:choose>
+ <xsl:when test="($thickness != ''
+ and $style != ''
+ and $color != '')
+ or ($thickness != ''
+ and $style != '')
+ or ($thickness != '')">
+ <!-- use the compound property if we can: -->
+ <!-- it saves space and probably works more reliably -->
+ <xsl:text>border-</xsl:text>
+ <xsl:value-of select="$side"/>
+ <xsl:text>: </xsl:text>
+ <xsl:value-of select="$thickness"/>
+ <xsl:text> </xsl:text>
+ <xsl:value-of select="$style"/>
+ <xsl:text> </xsl:text>
+ <xsl:value-of select="$color"/>
+ <xsl:text>; </xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <!-- we need to specify the styles individually -->
+ <xsl:if test="$thickness != ''">
+ <xsl:text>border-</xsl:text>
+ <xsl:value-of select="$side"/>
+ <xsl:text>-width: </xsl:text>
+ <xsl:value-of select="$thickness"/>
+ <xsl:text>; </xsl:text>
+ </xsl:if>
+
+ <xsl:if test="$style != ''">
+ <xsl:text>border-</xsl:text>
+ <xsl:value-of select="$side"/>
+ <xsl:text>-style: </xsl:text>
+ <xsl:value-of select="$style"/>
+ <xsl:text>; </xsl:text>
+ </xsl:if>
+
+ <xsl:if test="$color != ''">
+ <xsl:text>border-</xsl:text>
+ <xsl:value-of select="$side"/>
+ <xsl:text>-color: </xsl:text>
+ <xsl:value-of select="$color"/>
+ <xsl:text>; </xsl:text>
+ </xsl:if>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="tgroup" name="tgroup">
+ <xsl:if test="not(@cols) or @cols = '' or string(number(@cols)) = 'NaN'">
+ <xsl:message terminate="yes">
+ <xsl:text>Error: CALS tables must specify the number of columns.</xsl:text>
+ </xsl:message>
+ </xsl:if>
+
+ <xsl:variable name="summary">
+ <xsl:call-template name="pi.dbhtml_table-summary"/>
+ </xsl:variable>
+
+ <xsl:variable name="cellspacing">
+ <xsl:call-template name="pi.dbhtml_cellspacing"/>
+ </xsl:variable>
+
+ <xsl:variable name="cellpadding">
+ <xsl:call-template name="pi.dbhtml_cellpadding"/>
+ </xsl:variable>
+
+ <table>
+ <xsl:choose>
+ <!-- If there's a textobject/phrase for the table summary, use it -->
+ <xsl:when test="../textobject/phrase">
+ <xsl:attribute name="summary">
+ <xsl:value-of select="../textobject/phrase"/>
+ </xsl:attribute>
+ </xsl:when>
+
+ <!-- If there's a <?dbhtml table-summary="foo"?> PI, use it for
+ the HTML table summary attribute -->
+ <xsl:when test="$summary != ''">
+ <xsl:attribute name="summary">
+ <xsl:value-of select="$summary"/>
+ </xsl:attribute>
+ </xsl:when>
+
+ <!-- Otherwise, if there's a title, use that -->
+ <xsl:when test="../title">
+ <xsl:attribute name="summary">
+ <!-- This screws up on inline markup and footnotes, oh well... -->
+ <xsl:value-of select="string(../title)"/>
+ </xsl:attribute>
+ </xsl:when>
+
+ <!-- Otherwise, forget the whole idea -->
+ <xsl:otherwise><!-- nevermind --></xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:if test="$cellspacing != '' or $html.cellspacing != ''">
+ <xsl:attribute name="cellspacing">
+ <xsl:choose>
+ <xsl:when test="$cellspacing != ''">
+ <xsl:value-of select="$cellspacing"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$html.cellspacing"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:if test="$cellpadding != '' or $html.cellpadding != ''">
+ <xsl:attribute name="cellpadding">
+ <xsl:choose>
+ <xsl:when test="$cellpadding != ''">
+ <xsl:value-of select="$cellpadding"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$html.cellpadding"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:if test="../@pgwide=1 or local-name(.) = 'entrytbl'">
+ <xsl:attribute name="width">100%</xsl:attribute>
+ </xsl:if>
+
+ <xsl:choose>
+ <xsl:when test="$table.borders.with.css != 0">
+ <xsl:choose>
+ <xsl:when test="../@frame='all' or (not(../@frame) and $default.table.frame='all')">
+ <xsl:attribute name="style">
+ <xsl:text>border-collapse: collapse;</xsl:text>
+ <xsl:call-template name="border">
+ <xsl:with-param name="side" select="'top'"/>
+ <xsl:with-param name="style" select="$table.frame.border.style"/>
+ <xsl:with-param name="color" select="$table.frame.border.color"/>
+ <xsl:with-param name="thickness" select="$table.frame.border.thickness"/>
+ </xsl:call-template>
+ <xsl:call-template name="border">
+ <xsl:with-param name="side" select="'bottom'"/>
+ <xsl:with-param name="style" select="$table.frame.border.style"/>
+ <xsl:with-param name="color" select="$table.frame.border.color"/>
+ <xsl:with-param name="thickness" select="$table.frame.border.thickness"/>
+ </xsl:call-template>
+ <xsl:call-template name="border">
+ <xsl:with-param name="side" select="'left'"/>
+ <xsl:with-param name="style" select="$table.frame.border.style"/>
+ <xsl:with-param name="color" select="$table.frame.border.color"/>
+ <xsl:with-param name="thickness" select="$table.frame.border.thickness"/>
+ </xsl:call-template>
+ <xsl:call-template name="border">
+ <xsl:with-param name="side" select="'right'"/>
+ <xsl:with-param name="style" select="$table.frame.border.style"/>
+ <xsl:with-param name="color" select="$table.frame.border.color"/>
+ <xsl:with-param name="thickness" select="$table.frame.border.thickness"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ </xsl:when>
+ <xsl:when test="../@frame='topbot' or (not(../@frame) and $default.table.frame='topbot')">
+ <xsl:attribute name="style">
+ <xsl:text>border-collapse: collapse;</xsl:text>
+ <xsl:call-template name="border">
+ <xsl:with-param name="side" select="'top'"/>
+ <xsl:with-param name="style" select="$table.frame.border.style"/>
+ <xsl:with-param name="color" select="$table.frame.border.color"/>
+ <xsl:with-param name="thickness" select="$table.frame.border.thickness"/>
+ </xsl:call-template>
+ <xsl:call-template name="border">
+ <xsl:with-param name="side" select="'bottom'"/>
+ <xsl:with-param name="style" select="$table.frame.border.style"/>
+ <xsl:with-param name="color" select="$table.frame.border.color"/>
+ <xsl:with-param name="thickness" select="$table.frame.border.thickness"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ </xsl:when>
+ <xsl:when test="../@frame='top' or (not(../@frame) and $default.table.frame='top')">
+ <xsl:attribute name="style">
+ <xsl:text>border-collapse: collapse;</xsl:text>
+ <xsl:call-template name="border">
+ <xsl:with-param name="side" select="'top'"/>
+ <xsl:with-param name="style" select="$table.frame.border.style"/>
+ <xsl:with-param name="color" select="$table.frame.border.color"/>
+ <xsl:with-param name="thickness" select="$table.frame.border.thickness"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ </xsl:when>
+ <xsl:when test="../@frame='bottom' or (not(../@frame) and $default.table.frame='bottom')">
+ <xsl:attribute name="style">
+ <xsl:text>border-collapse: collapse;</xsl:text>
+ <xsl:call-template name="border">
+ <xsl:with-param name="side" select="'bottom'"/>
+ <xsl:with-param name="style" select="$table.frame.border.style"/>
+ <xsl:with-param name="color" select="$table.frame.border.color"/>
+ <xsl:with-param name="thickness" select="$table.frame.border.thickness"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ </xsl:when>
+ <xsl:when test="../@frame='sides' or (not(../@frame) and $default.table.frame='sides')">
+ <xsl:attribute name="style">
+ <xsl:text>border-collapse: collapse;</xsl:text>
+ <xsl:call-template name="border">
+ <xsl:with-param name="side" select="'left'"/>
+ <xsl:with-param name="style" select="$table.frame.border.style"/>
+ <xsl:with-param name="color" select="$table.frame.border.color"/>
+ <xsl:with-param name="thickness" select="$table.frame.border.thickness"/>
+ </xsl:call-template>
+ <xsl:call-template name="border">
+ <xsl:with-param name="side" select="'right'"/>
+ <xsl:with-param name="style" select="$table.frame.border.style"/>
+ <xsl:with-param name="color" select="$table.frame.border.color"/>
+ <xsl:with-param name="thickness" select="$table.frame.border.thickness"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ </xsl:when>
+ <xsl:when test="../@frame='none'">
+ <xsl:attribute name="style">
+ <xsl:text>border: none;</xsl:text>
+ </xsl:attribute>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:attribute name="style">
+ <xsl:text>border-collapse: collapse;</xsl:text>
+ </xsl:attribute>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ </xsl:when>
+ <xsl:when test="../@frame='none' or (not(../@frame) and $default.table.frame='none') or local-name(.) = 'entrytbl'">
+ <xsl:attribute name="border">0</xsl:attribute>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:attribute name="border">1</xsl:attribute>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:variable name="colgroup">
+ <colgroup>
+ <xsl:call-template name="generate.colgroup">
+ <xsl:with-param name="cols" select="@cols"/>
+ </xsl:call-template>
+ </colgroup>
+ </xsl:variable>
+
+ <xsl:variable name="explicit.table.width">
+ <xsl:call-template name="pi.dbhtml_table-width">
+ <xsl:with-param name="node" select=".."/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="table.width">
+ <xsl:choose>
+ <xsl:when test="$explicit.table.width != ''">
+ <xsl:value-of select="$explicit.table.width"/>
+ </xsl:when>
+ <xsl:when test="$default.table.width = ''">
+ <xsl:text>100%</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$default.table.width"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:if test="$default.table.width != ''
+ or $explicit.table.width != ''">
+ <xsl:attribute name="width">
+ <xsl:choose>
+ <xsl:when test="contains($table.width, '%')">
+ <xsl:value-of select="$table.width"/>
+ </xsl:when>
+ <xsl:when test="$use.extensions != 0
+ and $tablecolumns.extension != 0">
+ <xsl:choose>
+ <xsl:when test="function-available('stbl:convertLength')">
+ <xsl:value-of select="stbl:convertLength($table.width)"/>
+ </xsl:when>
+ <xsl:when test="function-available('xtbl:convertLength')">
+ <xsl:value-of select="xtbl:convertLength($table.width)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:message terminate="yes">
+ <xsl:text>No convertLength function available.</xsl:text>
+ </xsl:message>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$table.width"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:choose>
+ <xsl:when test="$use.extensions != 0
+ and $tablecolumns.extension != 0">
+ <xsl:choose>
+ <xsl:when test="function-available('stbl:adjustColumnWidths')">
+ <xsl:copy-of select="stbl:adjustColumnWidths($colgroup)"/>
+ </xsl:when>
+ <xsl:when test="function-available('xtbl:adjustColumnWidths')">
+ <xsl:copy-of select="xtbl:adjustColumnWidths($colgroup)"/>
+ </xsl:when>
+ <xsl:when test="function-available('ptbl:adjustColumnWidths')">
+ <xsl:copy-of select="ptbl:adjustColumnWidths($colgroup)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:message terminate="yes">
+ <xsl:text>No adjustColumnWidths function available.</xsl:text>
+ </xsl:message>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:copy-of select="$colgroup"/>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:apply-templates select="thead"/>
+ <xsl:apply-templates select="tfoot"/>
+ <xsl:apply-templates select="tbody"/>
+
+ <xsl:if test=".//footnote|../title//footnote">
+ <tbody class="footnotes">
+ <tr>
+ <td colspan="{@cols}">
+ <xsl:apply-templates select=".//footnote|../title//footnote" mode="table.footnote.mode"/>
+ </td>
+ </tr>
+ </tbody>
+ </xsl:if>
+ </table>
+</xsl:template>
+
+<xsl:template match="tgroup/processing-instruction('dbhtml')">
+ <xsl:variable name="summary">
+ <xsl:call-template name="pi.dbhtml_table-summary"/>
+ </xsl:variable>
+
+ <!-- Suppress the table-summary PI -->
+ <xsl:if test="$summary = ''">
+ <xsl:processing-instruction name="dbhtml">
+ <xsl:value-of select="."/>
+ </xsl:processing-instruction>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="colspec"></xsl:template>
+
+<xsl:template match="spanspec"></xsl:template>
+
+<xsl:template match="thead|tfoot">
+ <xsl:element name="{local-name(.)}">
+ <xsl:if test="@align">
+ <xsl:attribute name="align">
+ <xsl:value-of select="@align"/>
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:if test="@char">
+ <xsl:attribute name="char">
+ <xsl:value-of select="@char"/>
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:if test="@charoff">
+ <xsl:attribute name="charoff">
+ <xsl:value-of select="@charoff"/>
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:if test="@valign">
+ <xsl:attribute name="valign">
+ <xsl:value-of select="@valign"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:choose>
+ <!-- recurse on rows only if @morerows is present -->
+ <xsl:when test="row/entry/@morerows|row/entrytbl/@morerows">
+ <xsl:apply-templates select="row[1]">
+ <xsl:with-param name="spans">
+ <xsl:call-template name="blank.spans">
+ <xsl:with-param name="cols" select="../@cols"/>
+ </xsl:call-template>
+ </xsl:with-param>
+ <xsl:with-param name="browserows" select="'recurse'"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="row">
+ <xsl:with-param name="spans">
+ <xsl:call-template name="blank.spans">
+ <xsl:with-param name="cols" select="../@cols"/>
+ </xsl:call-template>
+ </xsl:with-param>
+ <xsl:with-param name="browserows" select="'loop'" />
+ </xsl:apply-templates>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ </xsl:element>
+</xsl:template>
+
+<xsl:template match="tbody">
+ <tbody>
+ <xsl:if test="@align">
+ <xsl:attribute name="align">
+ <xsl:value-of select="@align"/>
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:if test="@char">
+ <xsl:attribute name="char">
+ <xsl:value-of select="@char"/>
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:if test="@charoff">
+ <xsl:attribute name="charoff">
+ <xsl:value-of select="@charoff"/>
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:if test="@valign">
+ <xsl:attribute name="valign">
+ <xsl:value-of select="@valign"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:choose>
+ <xsl:when test="row/entry/@morerows|row/entrytbl/@morerows">
+ <xsl:apply-templates select="row[1]">
+ <xsl:with-param name="spans">
+ <xsl:call-template name="blank.spans">
+ <xsl:with-param name="cols" select="../@cols"/>
+ </xsl:call-template>
+ </xsl:with-param>
+ <xsl:with-param name="browserows" select="'recurse'"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="row">
+ <xsl:with-param name="spans">
+ <xsl:call-template name="blank.spans">
+ <xsl:with-param name="cols" select="../@cols"/>
+ </xsl:call-template>
+ </xsl:with-param>
+ <xsl:with-param name="browserows" select="'loop'" />
+ </xsl:apply-templates>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ </tbody>
+</xsl:template>
+
+<xsl:template match="row">
+ <xsl:param name="spans"/>
+ <xsl:param name="browserows"/>
+
+ <xsl:choose>
+ <xsl:when test="contains($spans, '0')">
+ <xsl:call-template name="normal-row">
+ <xsl:with-param name="spans" select="$spans"/>
+ <xsl:with-param name="browserows" select="$browserows"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <!--
+ <xsl:message>
+ <xsl:text>Ignoring row: </xsl:text>
+ <xsl:value-of select="$spans"/>
+ <xsl:text> = </xsl:text>
+ <xsl:call-template name="consume-row">
+ <xsl:with-param name="spans" select="$spans"/>
+ </xsl:call-template>
+ </xsl:message>
+ -->
+
+ <xsl:if test="normalize-space(.//text()) != ''">
+ <xsl:message>Warning: overlapped row contains content!</xsl:message>
+ </xsl:if>
+
+ <tr><xsl:comment> This row intentionally left blank </xsl:comment></tr>
+
+ <xsl:if test="$browserows = 'recurse'">
+ <xsl:apply-templates select="following-sibling::row[1]">
+ <xsl:with-param name="spans">
+ <xsl:call-template name="consume-row">
+ <xsl:with-param name="spans" select="$spans"/>
+ </xsl:call-template>
+ </xsl:with-param>
+ <xsl:with-param name="browserows" select="$browserows"/>
+ </xsl:apply-templates>
+ </xsl:if>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="normal-row">
+ <xsl:param name="spans"/>
+ <xsl:param name="browserows"/>
+
+ <xsl:variable name="row-height">
+ <xsl:if test="processing-instruction('dbhtml')">
+ <xsl:call-template name="pi.dbhtml_row-height"/>
+ </xsl:if>
+ </xsl:variable>
+
+ <xsl:variable name="bgcolor">
+ <xsl:if test="processing-instruction('dbhtml')">
+ <xsl:call-template name="pi.dbhtml_bgcolor"/>
+ </xsl:if>
+ </xsl:variable>
+
+ <xsl:variable name="class">
+ <xsl:if test="processing-instruction('dbhtml')">
+ <xsl:call-template name="pi.dbhtml_class"/>
+ </xsl:if>
+ </xsl:variable>
+
+ <tr>
+ <xsl:call-template name="tr.attributes">
+ <xsl:with-param name="rownum">
+ <xsl:number from="tgroup" count="row"/>
+ </xsl:with-param>
+ </xsl:call-template>
+
+ <xsl:if test="$row-height != ''">
+ <xsl:attribute name="height">
+ <xsl:value-of select="$row-height"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:if test="$bgcolor != ''">
+ <xsl:attribute name="bgcolor">
+ <xsl:value-of select="$bgcolor"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:if test="$class != ''">
+ <xsl:attribute name="class">
+ <xsl:value-of select="$class"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:if test="$table.borders.with.css != 0">
+ <xsl:if test="@rowsep = 1 and following-sibling::row">
+ <xsl:attribute name="style">
+ <xsl:call-template name="border">
+ <xsl:with-param name="side" select="'bottom'"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ </xsl:if>
+ </xsl:if>
+
+ <xsl:if test="@align">
+ <xsl:attribute name="align">
+ <xsl:value-of select="@align"/>
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:if test="@char">
+ <xsl:attribute name="char">
+ <xsl:value-of select="@char"/>
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:if test="@charoff">
+ <xsl:attribute name="charoff">
+ <xsl:value-of select="@charoff"/>
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:if test="@valign">
+ <xsl:attribute name="valign">
+ <xsl:value-of select="@valign"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:apply-templates select="(entry|entrytbl)[1]">
+ <xsl:with-param name="spans" select="$spans"/>
+ </xsl:apply-templates>
+ </tr>
+
+ <xsl:if test="$browserows = 'recurse'">
+ <xsl:if test="following-sibling::row">
+ <xsl:variable name="nextspans">
+ <xsl:apply-templates select="(entry|entrytbl)[1]" mode="span">
+ <xsl:with-param name="spans" select="$spans"/>
+ </xsl:apply-templates>
+ </xsl:variable>
+
+ <xsl:apply-templates select="following-sibling::row[1]">
+ <xsl:with-param name="spans" select="$nextspans"/>
+ <xsl:with-param name="browserows" select="$browserows"/>
+ </xsl:apply-templates>
+ </xsl:if>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="entry|entrytbl" name="entry">
+ <xsl:param name="col">
+ <xsl:choose>
+ <xsl:when test="@revisionflag">
+ <xsl:number from="row"/>
+ </xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:param>
+
+ <xsl:param name="spans"/>
+
+ <xsl:variable name="cellgi">
+ <xsl:choose>
+ <xsl:when test="ancestor::thead">th</xsl:when>
+ <xsl:when test="ancestor::tfoot">th</xsl:when>
+ <xsl:when test="ancestor::tbody and
+ (ancestor::table[@rowheader = 'firstcol'] or
+ ancestor::informaltable[@rowheader = 'firstcol']) and
+ ancestor-or-self::entry[1][count(preceding-sibling::entry) = 0]">
+ <xsl:text>th</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>td</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="empty.cell" select="count(node()) = 0"/>
+
+ <xsl:variable name="named.colnum">
+ <xsl:call-template name="entry.colnum"/>
+ </xsl:variable>
+
+ <xsl:variable name="entry.colnum">
+ <xsl:choose>
+ <xsl:when test="$named.colnum &gt; 0">
+ <xsl:value-of select="$named.colnum"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$col"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="entry.colspan">
+ <xsl:choose>
+ <xsl:when test="@spanname or @namest">
+ <xsl:call-template name="calculate.colspan"/>
+ </xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="following.spans">
+ <xsl:call-template name="calculate.following.spans">
+ <xsl:with-param name="colspan" select="$entry.colspan"/>
+ <xsl:with-param name="spans" select="$spans"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="rowsep">
+ <xsl:choose>
+ <!-- If this is the last row, rowsep never applies. -->
+ <xsl:when test="ancestor::entrytbl
+ and not (ancestor-or-self::row[1]/following-sibling::row)
+ and not (ancestor::thead)">
+ <xsl:value-of select="0"/>
+ </xsl:when>
+ <xsl:when test="not(ancestor-or-self::row[1]/following-sibling::row
+ or ancestor-or-self::thead/following-sibling::tbody
+ or ancestor-or-self::tbody/preceding-sibling::tfoot)">
+ <xsl:value-of select="0"/>
+ </xsl:when>
+ <xsl:when test="@morerows and not(@morerows &lt;
+ count(ancestor-or-self::row[1]/following-sibling::row))">
+ <xsl:value-of select="0"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="inherited.table.attribute">
+ <xsl:with-param name="entry" select="."/>
+ <xsl:with-param name="colnum" select="$entry.colnum"/>
+ <xsl:with-param name="attribute" select="'rowsep'"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="colsep">
+ <xsl:choose>
+ <!-- If this is the last column, colsep never applies. -->
+ <xsl:when test="$following.spans = ''">0</xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="inherited.table.attribute">
+ <xsl:with-param name="entry" select="."/>
+ <xsl:with-param name="colnum" select="$entry.colnum"/>
+ <xsl:with-param name="attribute" select="'colsep'"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="valign">
+ <xsl:call-template name="inherited.table.attribute">
+ <xsl:with-param name="entry" select="."/>
+ <xsl:with-param name="colnum" select="$entry.colnum"/>
+ <xsl:with-param name="attribute" select="'valign'"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="align">
+ <xsl:call-template name="inherited.table.attribute">
+ <xsl:with-param name="entry" select="."/>
+ <xsl:with-param name="colnum" select="$entry.colnum"/>
+ <xsl:with-param name="attribute" select="'align'"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="char">
+ <xsl:call-template name="inherited.table.attribute">
+ <xsl:with-param name="entry" select="."/>
+ <xsl:with-param name="colnum" select="$entry.colnum"/>
+ <xsl:with-param name="attribute" select="'char'"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="charoff">
+ <xsl:call-template name="inherited.table.attribute">
+ <xsl:with-param name="entry" select="."/>
+ <xsl:with-param name="colnum" select="$entry.colnum"/>
+ <xsl:with-param name="attribute" select="'charoff'"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="$spans != '' and not(starts-with($spans,'0:'))">
+ <xsl:call-template name="entry">
+ <xsl:with-param name="col" select="$col+1"/>
+ <xsl:with-param name="spans" select="substring-after($spans,':')"/>
+ </xsl:call-template>
+ </xsl:when>
+
+ <xsl:when test="number($entry.colnum) &gt; $col">
+ <xsl:call-template name="empty.table.cell"/>
+ <xsl:call-template name="entry">
+ <xsl:with-param name="col" select="$col+1"/>
+ <xsl:with-param name="spans" select="substring-after($spans,':')"/>
+ </xsl:call-template>
+ </xsl:when>
+
+ <xsl:otherwise>
+ <xsl:variable name="bgcolor">
+ <xsl:if test="processing-instruction('dbhtml')">
+ <xsl:call-template name="pi.dbhtml_bgcolor"/>
+ </xsl:if>
+ </xsl:variable>
+
+ <xsl:element name="{$cellgi}">
+ <xsl:if test="$bgcolor != ''">
+ <xsl:attribute name="bgcolor">
+ <xsl:value-of select="$bgcolor"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:call-template name="locale.html.attributes"/>
+ <xsl:if test="$entry.propagates.style != 0 and @role">
+ <xsl:apply-templates select="." mode="class.attribute">
+ <xsl:with-param name="class" select="@role"/>
+ </xsl:apply-templates>
+ </xsl:if>
+
+ <xsl:if test="$show.revisionflag and @revisionflag">
+ <xsl:attribute name="class">
+ <xsl:value-of select="@revisionflag"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:if test="$table.borders.with.css != 0">
+ <xsl:attribute name="style">
+ <xsl:if test="$colsep &gt; 0">
+ <xsl:call-template name="border">
+ <xsl:with-param name="side" select="'right'"/>
+ </xsl:call-template>
+ </xsl:if>
+ <xsl:if test="$rowsep &gt; 0">
+ <xsl:call-template name="border">
+ <xsl:with-param name="side" select="'bottom'"/>
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:if test="@morerows &gt; 0">
+ <xsl:attribute name="rowspan">
+ <xsl:value-of select="1+@morerows"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:if test="$entry.colspan &gt; 1">
+ <xsl:attribute name="colspan">
+ <xsl:value-of select="$entry.colspan"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:if test="$align != ''">
+ <xsl:attribute name="align">
+ <xsl:value-of select="$align"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:if test="$valign != ''">
+ <xsl:attribute name="valign">
+ <xsl:value-of select="$valign"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:if test="$char != ''">
+ <xsl:attribute name="char">
+ <xsl:value-of select="$char"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:if test="$charoff != ''">
+ <xsl:attribute name="charoff">
+ <xsl:value-of select="$charoff"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:if test="not(preceding-sibling::*) and
+ (ancestor::row[1]/@id or ancestor::row[1]/@xml:id)">
+ <xsl:call-template name="anchor">
+ <xsl:with-param name="node" select="ancestor::row[1]"/>
+ </xsl:call-template>
+ </xsl:if>
+
+ <xsl:call-template name="anchor"/>
+
+ <xsl:choose>
+ <xsl:when test="$empty.cell">
+ <xsl:text>&#160;</xsl:text>
+ </xsl:when>
+ <xsl:when test="self::entrytbl">
+ <xsl:call-template name="tgroup"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:element>
+
+ <xsl:choose>
+ <xsl:when test="following-sibling::entry|following-sibling::entrytbl">
+ <xsl:apply-templates select="(following-sibling::entry
+ |following-sibling::entrytbl)[1]">
+ <xsl:with-param name="col" select="$col+$entry.colspan"/>
+ <xsl:with-param name="spans" select="$following.spans"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="finaltd">
+ <xsl:with-param name="spans" select="$following.spans"/>
+ <xsl:with-param name="col" select="$col+$entry.colspan"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="entry|entrytbl" name="sentry" mode="span">
+ <xsl:param name="col" select="1"/>
+ <xsl:param name="spans"/>
+
+ <xsl:variable name="entry.colnum">
+ <xsl:call-template name="entry.colnum"/>
+ </xsl:variable>
+
+ <xsl:variable name="entry.colspan">
+ <xsl:choose>
+ <xsl:when test="@spanname or @namest">
+ <xsl:call-template name="calculate.colspan"/>
+ </xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="following.spans">
+ <xsl:call-template name="calculate.following.spans">
+ <xsl:with-param name="colspan" select="$entry.colspan"/>
+ <xsl:with-param name="spans" select="$spans"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="$spans != '' and not(starts-with($spans,'0:'))">
+ <xsl:value-of select="substring-before($spans,':')-1"/>
+ <xsl:text>:</xsl:text>
+ <xsl:call-template name="sentry">
+ <xsl:with-param name="col" select="$col+1"/>
+ <xsl:with-param name="spans" select="substring-after($spans,':')"/>
+ </xsl:call-template>
+ </xsl:when>
+
+ <xsl:when test="number($entry.colnum) &gt; $col">
+ <xsl:text>0:</xsl:text>
+ <xsl:call-template name="sentry">
+ <xsl:with-param name="col" select="$col + 1"/>
+ <xsl:with-param name="spans" select="substring-after($spans,':')"/>
+ </xsl:call-template>
+ </xsl:when>
+
+ <xsl:otherwise>
+ <xsl:call-template name="copy-string">
+ <xsl:with-param name="count" select="$entry.colspan"/>
+ <xsl:with-param name="string">
+ <xsl:choose>
+ <xsl:when test="@morerows">
+ <xsl:value-of select="@morerows"/>
+ </xsl:when>
+ <xsl:otherwise>0</xsl:otherwise>
+ </xsl:choose>
+ <xsl:text>:</xsl:text>
+ </xsl:with-param>
+ </xsl:call-template>
+
+ <xsl:choose>
+ <xsl:when test="following-sibling::entry|following-sibling::entrytbl">
+ <xsl:apply-templates select="(following-sibling::entry
+ |following-sibling::entrytbl)[1]"
+ mode="span">
+ <xsl:with-param name="col" select="$col+$entry.colspan"/>
+ <xsl:with-param name="spans" select="$following.spans"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="sfinaltd">
+ <xsl:with-param name="spans" select="$following.spans"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="generate.colgroup">
+ <xsl:param name="cols" select="1"/>
+ <xsl:param name="count" select="1"/>
+ <xsl:choose>
+ <xsl:when test="$count &gt; $cols"></xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="generate.col">
+ <xsl:with-param name="countcol" select="$count"/>
+ </xsl:call-template>
+ <xsl:call-template name="generate.colgroup">
+ <xsl:with-param name="cols" select="$cols"/>
+ <xsl:with-param name="count" select="$count+1"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="generate.col">
+ <xsl:param name="countcol">1</xsl:param>
+ <xsl:param name="colspecs" select="./colspec"/>
+ <xsl:param name="count">1</xsl:param>
+ <xsl:param name="colnum">1</xsl:param>
+
+ <xsl:choose>
+ <xsl:when test="$count>count($colspecs)">
+ <col/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:variable name="colspec" select="$colspecs[$count=position()]"/>
+ <xsl:variable name="colspec.colnum">
+ <xsl:choose>
+ <xsl:when test="$colspec/@colnum">
+ <xsl:value-of select="$colspec/@colnum"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$colnum"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="$colspec.colnum=$countcol">
+ <col>
+ <xsl:choose>
+ <xsl:when test="$colspec/@colwidth
+ and $use.extensions != 0
+ and $tablecolumns.extension != 0">
+ <xsl:attribute name="width">
+ <xsl:choose>
+ <xsl:when test="normalize-space($colspec/@colwidth) = '*'">
+ <xsl:value-of select="'1*'"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$colspec/@colwidth"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:attribute>
+ </xsl:when>
+ <!-- pass through to HTML if no * in colspecs -->
+ <xsl:when test="$colspec/@colwidth and
+ not($colspec/parent::*/colspec/@colwidth[contains(.,'*')])">
+ <xsl:attribute name="width">
+ <xsl:choose>
+ <xsl:when test="normalize-space($colspec/@colwidth) = '*'">
+ <xsl:value-of select="'1*'"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$colspec/@colwidth"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:attribute>
+ </xsl:when>
+ </xsl:choose>
+
+ <xsl:choose>
+ <xsl:when test="$colspec/@align">
+ <xsl:attribute name="align">
+ <xsl:value-of select="$colspec/@align"/>
+ </xsl:attribute>
+ </xsl:when>
+ <!-- Suggested by Pavel ZAMPACH <zampach@nemcb.cz> -->
+ <xsl:when test="$colspecs/ancestor::tgroup/@align">
+ <xsl:attribute name="align">
+ <xsl:value-of select="$colspecs/ancestor::tgroup/@align"/>
+ </xsl:attribute>
+ </xsl:when>
+ </xsl:choose>
+
+ <xsl:if test="$colspec/@char">
+ <xsl:attribute name="char">
+ <xsl:value-of select="$colspec/@char"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:if test="$colspec/@charoff">
+ <xsl:attribute name="charoff">
+ <xsl:value-of select="$colspec/@charoff"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:if test="$colspec/@colname">
+ <xsl:attribute name="class">
+ <xsl:value-of select="$colspec/@colname"/>
+ </xsl:attribute>
+ </xsl:if>
+ </col>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="generate.col">
+ <xsl:with-param name="countcol" select="$countcol"/>
+ <xsl:with-param name="colspecs" select="$colspecs"/>
+ <xsl:with-param name="count" select="$count+1"/>
+ <xsl:with-param name="colnum">
+ <xsl:choose>
+ <xsl:when test="$colspec/@colnum">
+ <xsl:value-of select="$colspec/@colnum + 1"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$colnum + 1"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="colspec.colwidth">
+ <!-- when this macro is called, the current context must be an entry -->
+ <xsl:param name="colname"></xsl:param>
+ <!-- .. = row, ../.. = thead|tbody, ../../.. = tgroup -->
+ <xsl:param name="colspecs" select="../../../../tgroup/colspec"/>
+ <xsl:param name="count">1</xsl:param>
+ <xsl:choose>
+ <xsl:when test="$count>count($colspecs)"></xsl:when>
+ <xsl:otherwise>
+ <xsl:variable name="colspec" select="$colspecs[$count=position()]"/>
+ <xsl:choose>
+ <xsl:when test="$colspec/@colname=$colname">
+ <xsl:value-of select="$colspec/@colwidth"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="colspec.colwidth">
+ <xsl:with-param name="colname" select="$colname"/>
+ <xsl:with-param name="colspecs" select="$colspecs"/>
+ <xsl:with-param name="count" select="$count+1"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ====================================================================== -->
+
+<xsl:template name="tr.attributes">
+ <xsl:param name="row" select="."/>
+ <xsl:param name="rownum" select="0"/>
+
+ <!-- by default, do nothing. But you might want to say:
+
+ <xsl:if test="$rownum mod 2 = 0">
+ <xsl:attribute name="class">oddrow</xsl:attribute>
+ </xsl:if>
+
+ -->
+</xsl:template>
+
+</xsl:stylesheet>
+
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/task.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/task.xsl
new file mode 100644
index 0000000..01da940
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/task.xsl
@@ -0,0 +1,76 @@
+<?xml version="1.0"?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="1.0">
+
+<!-- ********************************************************************
+ $Id: task.xsl 8421 2009-05-04 07:49:49Z bobstayton $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<!-- ==================================================================== -->
+
+<xsl:template match="task">
+ <xsl:variable name="param.placement"
+ select="substring-after(normalize-space($formal.title.placement),
+ concat(local-name(.), ' '))"/>
+
+ <xsl:variable name="placement">
+ <xsl:choose>
+ <xsl:when test="contains($param.placement, ' ')">
+ <xsl:value-of select="substring-before($param.placement, ' ')"/>
+ </xsl:when>
+ <xsl:when test="$param.placement = ''">before</xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$param.placement"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="preamble"
+ select="*[not(self::title
+ or self::titleabbrev)]"/>
+
+ <div>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:call-template name="anchor"/>
+
+ <xsl:if test="title and $placement = 'before'">
+ <xsl:call-template name="formal.object.heading"/>
+ </xsl:if>
+
+ <xsl:apply-templates select="$preamble"/>
+
+ <xsl:if test="title and $placement != 'before'">
+ <xsl:call-template name="formal.object.heading"/>
+ </xsl:if>
+ </div>
+</xsl:template>
+
+<xsl:template match="task/title">
+ <!-- nop -->
+</xsl:template>
+
+<xsl:template match="tasksummary">
+ <xsl:call-template name="semiformal.object"/>
+</xsl:template>
+
+<xsl:template match="tasksummary/title"/>
+
+<xsl:template match="taskprerequisites">
+ <xsl:call-template name="semiformal.object"/>
+</xsl:template>
+
+<xsl:template match="taskprerequisites/title"/>
+
+<xsl:template match="taskrelated">
+ <xsl:call-template name="semiformal.object"/>
+</xsl:template>
+
+<xsl:template match="taskrelated/title"/>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/titlepage.templates.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/titlepage.templates.xml
new file mode 100644
index 0000000..cae5160
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/titlepage.templates.xml
@@ -0,0 +1,708 @@
+<t:templates xmlns:t="http://nwalsh.com/docbook/xsl/template/1.0"
+ xmlns:param="http://nwalsh.com/docbook/xsl/template/1.0/param"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+
+<!-- ==================================================================== -->
+
+<t:titlepage t:element="article" t:wrapper="div" class="titlepage">
+ <t:titlepage-content t:side="recto">
+ <title/>
+ <subtitle/>
+ <corpauthor/>
+ <authorgroup/>
+ <author/>
+ <othercredit/>
+ <releaseinfo/>
+ <copyright/>
+ <legalnotice/>
+ <pubdate/>
+ <revision/>
+ <revhistory/>
+ <abstract/>
+ </t:titlepage-content>
+
+ <t:titlepage-content t:side="verso">
+ </t:titlepage-content>
+
+ <t:titlepage-separator>
+ <hr/>
+ </t:titlepage-separator>
+
+ <t:titlepage-before t:side="recto">
+ </t:titlepage-before>
+
+ <t:titlepage-before t:side="verso">
+ </t:titlepage-before>
+</t:titlepage>
+
+<!-- ==================================================================== -->
+
+<t:titlepage t:element="set" t:wrapper="div" class="titlepage">
+ <t:titlepage-content t:side="recto">
+ <title/>
+ <subtitle/>
+ <corpauthor/>
+ <authorgroup/>
+ <author/>
+ <othercredit/>
+ <releaseinfo/>
+ <copyright/>
+ <legalnotice/>
+ <pubdate/>
+ <revision/>
+ <revhistory/>
+ <abstract/>
+ </t:titlepage-content>
+
+ <t:titlepage-content t:side="verso">
+ </t:titlepage-content>
+
+ <t:titlepage-separator>
+ <hr/>
+ </t:titlepage-separator>
+
+ <t:titlepage-before t:side="recto">
+ </t:titlepage-before>
+
+ <t:titlepage-before t:side="verso">
+ </t:titlepage-before>
+</t:titlepage>
+
+<!-- ==================================================================== -->
+
+<t:titlepage t:element="book" t:wrapper="div" class="titlepage">
+ <t:titlepage-content t:side="recto">
+ <title/>
+ <subtitle/>
+ <corpauthor/>
+ <authorgroup/>
+ <author/>
+ <othercredit/>
+ <releaseinfo/>
+ <copyright/>
+ <legalnotice/>
+ <pubdate/>
+ <revision/>
+ <revhistory/>
+ <abstract/>
+ </t:titlepage-content>
+
+ <t:titlepage-content t:side="verso">
+ </t:titlepage-content>
+
+ <t:titlepage-separator>
+ <hr/>
+ </t:titlepage-separator>
+
+ <t:titlepage-before t:side="recto">
+ </t:titlepage-before>
+
+ <t:titlepage-before t:side="verso">
+ </t:titlepage-before>
+</t:titlepage>
+
+<!-- ==================================================================== -->
+
+<t:titlepage t:element="part" t:wrapper="div" class="titlepage">
+ <t:titlepage-content t:side="recto">
+ <title
+ t:force="1"
+ t:named-template="division.title"
+ param:node="ancestor-or-self::part[1]"/>
+ <subtitle/>
+ <corpauthor/>
+ <authorgroup/>
+ <author/>
+ <othercredit/>
+ <releaseinfo/>
+ <copyright/>
+ <legalnotice/>
+ <pubdate/>
+ <revision/>
+ <revhistory/>
+ <abstract/>
+ </t:titlepage-content>
+
+ <t:titlepage-content t:side="verso">
+ </t:titlepage-content>
+
+ <t:titlepage-separator>
+ </t:titlepage-separator>
+
+ <t:titlepage-before t:side="recto">
+ </t:titlepage-before>
+
+ <t:titlepage-before t:side="verso">
+ </t:titlepage-before>
+</t:titlepage>
+
+<t:titlepage t:element="partintro" t:wrapper="div">
+ <t:titlepage-content t:side="recto">
+ <title/>
+ <subtitle/>
+ <corpauthor/>
+ <authorgroup/>
+ <author/>
+ <othercredit/>
+ <releaseinfo/>
+ <copyright/>
+ <legalnotice/>
+ <pubdate/>
+ <revision/>
+ <revhistory/>
+ <abstract/>
+ </t:titlepage-content>
+
+ <t:titlepage-content t:side="verso">
+ </t:titlepage-content>
+
+ <t:titlepage-separator>
+ </t:titlepage-separator>
+
+ <t:titlepage-before t:side="recto">
+ </t:titlepage-before>
+
+ <t:titlepage-before t:side="verso">
+ </t:titlepage-before>
+</t:titlepage>
+
+<!-- ==================================================================== -->
+
+<t:titlepage t:element="reference" t:wrapper="div" class="titlepage">
+ <t:titlepage-content t:side="recto">
+ <title/>
+ <subtitle/>
+ <corpauthor/>
+ <authorgroup/>
+ <author/>
+ <othercredit/>
+ <releaseinfo/>
+ <copyright/>
+ <legalnotice/>
+ <pubdate/>
+ <revision/>
+ <revhistory/>
+ <abstract/>
+ </t:titlepage-content>
+
+ <t:titlepage-content t:side="verso">
+ </t:titlepage-content>
+
+ <t:titlepage-separator>
+ <hr/>
+ </t:titlepage-separator>
+
+ <t:titlepage-before t:side="recto">
+ </t:titlepage-before>
+
+ <t:titlepage-before t:side="verso">
+ </t:titlepage-before>
+</t:titlepage>
+
+<!-- ==================================================================== -->
+
+<t:titlepage t:element="refentry" t:wrapper="div" class="titlepage">
+ <t:titlepage-content t:side="recto">
+<!-- uncomment this if you want refentry titlepages
+ <title t:force="1"
+ t:named-template="refentry.title"
+ param:node="ancestor-or-self::refentry[1]"/>
+-->
+ </t:titlepage-content>
+
+ <t:titlepage-content t:side="verso">
+ </t:titlepage-content>
+
+ <t:titlepage-separator/>
+
+ <t:titlepage-before t:side="recto">
+ </t:titlepage-before>
+
+ <t:titlepage-before t:side="verso">
+ </t:titlepage-before>
+</t:titlepage>
+
+<!-- ==================================================================== -->
+
+ <t:titlepage t:element="dedication" t:wrapper="div" class="titlepage">
+ <t:titlepage-content t:side="recto">
+ <title
+ t:force="1"
+ t:named-template="component.title"
+ param:node="ancestor-or-self::dedication[1]"/>
+ <subtitle/>
+ </t:titlepage-content>
+
+ <t:titlepage-content t:side="verso">
+ </t:titlepage-content>
+
+ <t:titlepage-separator>
+ </t:titlepage-separator>
+
+ <t:titlepage-before t:side="recto">
+ </t:titlepage-before>
+
+ <t:titlepage-before t:side="verso">
+ </t:titlepage-before>
+</t:titlepage>
+
+<!-- ==================================================================== -->
+
+<t:titlepage t:element="acknowledgements" t:wrapper="div" class="titlepage">
+ <t:titlepage-content t:side="recto">
+ <title
+ t:force="1"
+ t:named-template="component.title"
+ param:node="ancestor-or-self::acknowledgements[1]"/>
+ <subtitle/>
+ </t:titlepage-content>
+
+ <t:titlepage-content t:side="verso">
+ </t:titlepage-content>
+
+ <t:titlepage-separator>
+ </t:titlepage-separator>
+
+ <t:titlepage-before t:side="recto">
+ </t:titlepage-before>
+
+ <t:titlepage-before t:side="verso">
+ </t:titlepage-before>
+</t:titlepage>
+
+<!-- ==================================================================== -->
+
+<t:titlepage t:element="preface" t:wrapper="div" class="titlepage">
+ <t:titlepage-content t:side="recto">
+ <title/>
+ <subtitle/>
+ <corpauthor/>
+ <authorgroup/>
+ <author/>
+ <othercredit/>
+ <releaseinfo/>
+ <copyright/>
+ <legalnotice/>
+ <pubdate/>
+ <revision/>
+ <revhistory/>
+ <abstract/>
+ </t:titlepage-content>
+
+ <t:titlepage-content t:side="verso">
+ </t:titlepage-content>
+
+ <t:titlepage-separator>
+ </t:titlepage-separator>
+
+ <t:titlepage-before t:side="recto">
+ </t:titlepage-before>
+
+ <t:titlepage-before t:side="verso">
+ </t:titlepage-before>
+</t:titlepage>
+
+<!-- ==================================================================== -->
+
+<t:titlepage t:element="chapter" t:wrapper="div" class="titlepage">
+ <t:titlepage-content t:side="recto">
+ <title/>
+ <subtitle/>
+ <corpauthor/>
+ <authorgroup/>
+ <author/>
+ <othercredit/>
+ <releaseinfo/>
+ <copyright/>
+ <legalnotice/>
+ <pubdate/>
+ <revision/>
+ <revhistory/>
+ <abstract/>
+ </t:titlepage-content>
+
+ <t:titlepage-content t:side="verso">
+ </t:titlepage-content>
+
+ <t:titlepage-separator>
+ </t:titlepage-separator>
+
+ <t:titlepage-before t:side="recto">
+ </t:titlepage-before>
+
+ <t:titlepage-before t:side="verso">
+ </t:titlepage-before>
+</t:titlepage>
+
+<!-- ==================================================================== -->
+
+<t:titlepage t:element="appendix" t:wrapper="div" class="titlepage">
+ <t:titlepage-content t:side="recto">
+ <title/>
+ <subtitle/>
+ <corpauthor/>
+ <authorgroup/>
+ <author/>
+ <othercredit/>
+ <releaseinfo/>
+ <copyright/>
+ <legalnotice/>
+ <pubdate/>
+ <revision/>
+ <revhistory/>
+ <abstract/>
+ </t:titlepage-content>
+
+ <t:titlepage-content t:side="verso">
+ </t:titlepage-content>
+
+ <t:titlepage-separator>
+ </t:titlepage-separator>
+
+ <t:titlepage-before t:side="recto">
+ </t:titlepage-before>
+
+ <t:titlepage-before t:side="verso">
+ </t:titlepage-before>
+</t:titlepage>
+
+<!-- ==================================================================== -->
+
+<t:titlepage t:element="section" t:wrapper="div" class="titlepage">
+ <t:titlepage-content t:side="recto">
+ <title/>
+ <subtitle/>
+ <corpauthor/>
+ <authorgroup/>
+ <author/>
+ <othercredit/>
+ <releaseinfo/>
+ <copyright/>
+ <legalnotice/>
+ <pubdate/>
+ <revision/>
+ <revhistory/>
+ <abstract/>
+ </t:titlepage-content>
+
+ <t:titlepage-content t:side="verso">
+ </t:titlepage-content>
+
+ <t:titlepage-separator>
+ <xsl:if test="count(parent::*)='0'"><hr/></xsl:if>
+ </t:titlepage-separator>
+
+ <t:titlepage-before t:side="recto">
+ </t:titlepage-before>
+
+ <t:titlepage-before t:side="verso">
+ </t:titlepage-before>
+</t:titlepage>
+
+<t:titlepage t:element="sect1" t:wrapper="div" class="titlepage">
+ <t:titlepage-content t:side="recto">
+ <title/>
+ <subtitle/>
+ <corpauthor/>
+ <authorgroup/>
+ <author/>
+ <othercredit/>
+ <releaseinfo/>
+ <copyright/>
+ <legalnotice/>
+ <pubdate/>
+ <revision/>
+ <revhistory/>
+ <abstract/>
+ </t:titlepage-content>
+
+ <t:titlepage-content t:side="verso">
+ </t:titlepage-content>
+
+ <t:titlepage-separator>
+ <xsl:if test="count(parent::*)='0'"><hr/></xsl:if>
+ </t:titlepage-separator>
+
+ <t:titlepage-before t:side="recto">
+ </t:titlepage-before>
+
+ <t:titlepage-before t:side="verso">
+ </t:titlepage-before>
+</t:titlepage>
+
+<t:titlepage t:element="sect2" t:wrapper="div" class="titlepage">
+ <t:titlepage-content t:side="recto">
+ <title/>
+ <subtitle/>
+ <corpauthor/>
+ <authorgroup/>
+ <author/>
+ <othercredit/>
+ <releaseinfo/>
+ <copyright/>
+ <legalnotice/>
+ <pubdate/>
+ <revision/>
+ <revhistory/>
+ <abstract/>
+ </t:titlepage-content>
+
+ <t:titlepage-content t:side="verso">
+ </t:titlepage-content>
+
+ <t:titlepage-separator>
+ <xsl:if test="count(parent::*)='0'"><hr/></xsl:if>
+ </t:titlepage-separator>
+
+ <t:titlepage-before t:side="recto">
+ </t:titlepage-before>
+
+ <t:titlepage-before t:side="verso">
+ </t:titlepage-before>
+</t:titlepage>
+
+<t:titlepage t:element="sect3" t:wrapper="div" class="titlepage">
+ <t:titlepage-content t:side="recto">
+ <title/>
+ <subtitle/>
+ <corpauthor/>
+ <authorgroup/>
+ <author/>
+ <othercredit/>
+ <releaseinfo/>
+ <copyright/>
+ <legalnotice/>
+ <pubdate/>
+ <revision/>
+ <revhistory/>
+ <abstract/>
+ </t:titlepage-content>
+
+ <t:titlepage-content t:side="verso">
+ </t:titlepage-content>
+
+ <t:titlepage-separator>
+ <xsl:if test="count(parent::*)='0'"><hr/></xsl:if>
+ </t:titlepage-separator>
+
+ <t:titlepage-before t:side="recto">
+ </t:titlepage-before>
+
+ <t:titlepage-before t:side="verso">
+ </t:titlepage-before>
+</t:titlepage>
+
+<t:titlepage t:element="sect4" t:wrapper="div" class="titlepage">
+ <t:titlepage-content t:side="recto">
+ <title/>
+ <subtitle/>
+ <corpauthor/>
+ <authorgroup/>
+ <author/>
+ <othercredit/>
+ <releaseinfo/>
+ <copyright/>
+ <legalnotice/>
+ <pubdate/>
+ <revision/>
+ <revhistory/>
+ <abstract/>
+ </t:titlepage-content>
+
+ <t:titlepage-content t:side="verso">
+ </t:titlepage-content>
+
+ <t:titlepage-separator>
+ <xsl:if test="count(parent::*)='0'"><hr/></xsl:if>
+ </t:titlepage-separator>
+
+ <t:titlepage-before t:side="recto">
+ </t:titlepage-before>
+
+ <t:titlepage-before t:side="verso">
+ </t:titlepage-before>
+</t:titlepage>
+
+<t:titlepage t:element="sect5" t:wrapper="div" class="titlepage">
+ <t:titlepage-content t:side="recto">
+ <title/>
+ <subtitle/>
+ <corpauthor/>
+ <authorgroup/>
+ <author/>
+ <othercredit/>
+ <releaseinfo/>
+ <copyright/>
+ <legalnotice/>
+ <pubdate/>
+ <revision/>
+ <revhistory/>
+ <abstract/>
+ </t:titlepage-content>
+
+ <t:titlepage-content t:side="verso">
+ </t:titlepage-content>
+
+ <t:titlepage-separator>
+ <xsl:if test="count(parent::*)='0'"><hr/></xsl:if>
+ </t:titlepage-separator>
+
+ <t:titlepage-before t:side="recto">
+ </t:titlepage-before>
+
+ <t:titlepage-before t:side="verso">
+ </t:titlepage-before>
+</t:titlepage>
+
+<t:titlepage t:element="simplesect" t:wrapper="div" class="titlepage">
+ <t:titlepage-content t:side="recto">
+ <title/>
+ <subtitle/>
+ <corpauthor/>
+ <authorgroup/>
+ <author/>
+ <othercredit/>
+ <releaseinfo/>
+ <copyright/>
+ <legalnotice/>
+ <pubdate/>
+ <revision/>
+ <revhistory/>
+ <abstract/>
+ </t:titlepage-content>
+
+ <t:titlepage-content t:side="verso">
+ </t:titlepage-content>
+
+ <t:titlepage-separator>
+ <xsl:if test="count(parent::*)='0'"><hr/></xsl:if>
+ </t:titlepage-separator>
+
+ <t:titlepage-before t:side="recto">
+ </t:titlepage-before>
+
+ <t:titlepage-before t:side="verso">
+ </t:titlepage-before>
+</t:titlepage>
+
+<!-- ==================================================================== -->
+
+<t:titlepage t:element="bibliography" t:wrapper="div" class="titlepage">
+ <t:titlepage-content t:side="recto">
+ <title
+ t:force="1"
+ t:named-template="component.title"
+ param:node="ancestor-or-self::bibliography[1]"/>
+ <subtitle/>
+ </t:titlepage-content>
+
+ <t:titlepage-content t:side="verso">
+ </t:titlepage-content>
+
+ <t:titlepage-separator>
+ </t:titlepage-separator>
+
+ <t:titlepage-before t:side="recto">
+ </t:titlepage-before>
+
+ <t:titlepage-before t:side="verso">
+ </t:titlepage-before>
+</t:titlepage>
+
+<!-- ==================================================================== -->
+
+<t:titlepage t:element="glossary" t:wrapper="div" class="titlepage">
+ <t:titlepage-content t:side="recto">
+ <title
+ t:force="1"
+ t:named-template="component.title"
+ param:node="ancestor-or-self::glossary[1]"/>
+ <subtitle/>
+ </t:titlepage-content>
+
+ <t:titlepage-content t:side="verso">
+ </t:titlepage-content>
+
+ <t:titlepage-separator>
+ </t:titlepage-separator>
+
+ <t:titlepage-before t:side="recto">
+ </t:titlepage-before>
+
+ <t:titlepage-before t:side="verso">
+ </t:titlepage-before>
+</t:titlepage>
+
+<!-- ==================================================================== -->
+
+<t:titlepage t:element="index" t:wrapper="div" class="titlepage">
+ <t:titlepage-content t:side="recto">
+ <title
+ t:force="1"
+ t:named-template="component.title"
+ param:node="ancestor-or-self::index[1]"/>
+ <subtitle/>
+ </t:titlepage-content>
+
+ <t:titlepage-content t:side="verso">
+ </t:titlepage-content>
+
+ <t:titlepage-separator>
+ </t:titlepage-separator>
+
+ <t:titlepage-before t:side="recto">
+ </t:titlepage-before>
+
+ <t:titlepage-before t:side="verso">
+ </t:titlepage-before>
+</t:titlepage>
+
+<!-- ==================================================================== -->
+
+<t:titlepage t:element="setindex" t:wrapper="div" class="titlepage">
+ <t:titlepage-content t:side="recto">
+ <title
+ t:force="1"
+ t:named-template="component.title"
+ param:node="ancestor-or-self::setindex[1]"/>
+ <subtitle/>
+ </t:titlepage-content>
+
+ <t:titlepage-content t:side="verso">
+ </t:titlepage-content>
+
+ <t:titlepage-separator>
+ </t:titlepage-separator>
+
+ <t:titlepage-before t:side="recto">
+ </t:titlepage-before>
+
+ <t:titlepage-before t:side="verso">
+ </t:titlepage-before>
+</t:titlepage>
+
+<!-- ==================================================================== -->
+<t:titlepage t:element="sidebar" t:wrapper="div" class="titlepage">
+ <t:titlepage-content t:side="recto">
+ <title
+ t:named-template="formal.object.heading"
+ param:object="ancestor-or-self::sidebar[1]"/>
+ <subtitle/>
+ </t:titlepage-content>
+
+ <t:titlepage-content t:side="verso">
+ </t:titlepage-content>
+
+ <t:titlepage-separator>
+ </t:titlepage-separator>
+
+ <t:titlepage-before t:side="recto">
+ </t:titlepage-before>
+
+ <t:titlepage-before t:side="verso">
+ </t:titlepage-before>
+</t:titlepage>
+
+<!-- ==================================================================== -->
+
+</t:templates>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/titlepage.templates.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/titlepage.templates.xsl
new file mode 100644
index 0000000..a025c43
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/titlepage.templates.xsl
@@ -0,0 +1,3817 @@
+<?xml version="1.0"?>
+
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:exsl="http://exslt.org/common" version="1.0" exclude-result-prefixes="exsl">
+
+<!-- This stylesheet was created by template/titlepage.xsl-->
+
+<xsl:template name="article.titlepage.recto">
+ <xsl:choose>
+ <xsl:when test="articleinfo/title">
+ <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="articleinfo/title"/>
+ </xsl:when>
+ <xsl:when test="artheader/title">
+ <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="artheader/title"/>
+ </xsl:when>
+ <xsl:when test="info/title">
+ <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="info/title"/>
+ </xsl:when>
+ <xsl:when test="title">
+ <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="title"/>
+ </xsl:when>
+ </xsl:choose>
+
+ <xsl:choose>
+ <xsl:when test="articleinfo/subtitle">
+ <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="articleinfo/subtitle"/>
+ </xsl:when>
+ <xsl:when test="artheader/subtitle">
+ <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="artheader/subtitle"/>
+ </xsl:when>
+ <xsl:when test="info/subtitle">
+ <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="info/subtitle"/>
+ </xsl:when>
+ <xsl:when test="subtitle">
+ <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="subtitle"/>
+ </xsl:when>
+ </xsl:choose>
+
+ <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="articleinfo/corpauthor"/>
+ <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="artheader/corpauthor"/>
+ <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="info/corpauthor"/>
+ <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="articleinfo/authorgroup"/>
+ <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="artheader/authorgroup"/>
+ <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="info/authorgroup"/>
+ <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="articleinfo/author"/>
+ <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="artheader/author"/>
+ <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="info/author"/>
+ <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="articleinfo/othercredit"/>
+ <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="artheader/othercredit"/>
+ <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="info/othercredit"/>
+ <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="articleinfo/releaseinfo"/>
+ <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="artheader/releaseinfo"/>
+ <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="info/releaseinfo"/>
+ <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="articleinfo/copyright"/>
+ <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="artheader/copyright"/>
+ <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="info/copyright"/>
+ <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="articleinfo/legalnotice"/>
+ <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="artheader/legalnotice"/>
+ <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="info/legalnotice"/>
+ <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="articleinfo/pubdate"/>
+ <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="artheader/pubdate"/>
+ <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="info/pubdate"/>
+ <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="articleinfo/revision"/>
+ <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="artheader/revision"/>
+ <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="info/revision"/>
+ <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="articleinfo/revhistory"/>
+ <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="artheader/revhistory"/>
+ <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="info/revhistory"/>
+ <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="articleinfo/abstract"/>
+ <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="artheader/abstract"/>
+ <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="info/abstract"/>
+</xsl:template>
+
+<xsl:template name="article.titlepage.verso">
+</xsl:template>
+
+<xsl:template name="article.titlepage.separator"><hr/>
+</xsl:template>
+
+<xsl:template name="article.titlepage.before.recto">
+</xsl:template>
+
+<xsl:template name="article.titlepage.before.verso">
+</xsl:template>
+
+<xsl:template name="article.titlepage">
+ <div class="titlepage">
+ <xsl:variable name="recto.content">
+ <xsl:call-template name="article.titlepage.before.recto"/>
+ <xsl:call-template name="article.titlepage.recto"/>
+ </xsl:variable>
+ <xsl:variable name="recto.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($recto.content) != '') or ($recto.elements.count &gt; 0)">
+ <div><xsl:copy-of select="$recto.content"/></div>
+ </xsl:if>
+ <xsl:variable name="verso.content">
+ <xsl:call-template name="article.titlepage.before.verso"/>
+ <xsl:call-template name="article.titlepage.verso"/>
+ </xsl:variable>
+ <xsl:variable name="verso.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($verso.content) != '') or ($verso.elements.count &gt; 0)">
+ <div><xsl:copy-of select="$verso.content"/></div>
+ </xsl:if>
+ <xsl:call-template name="article.titlepage.separator"/>
+ </div>
+</xsl:template>
+
+<xsl:template match="*" mode="article.titlepage.recto.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="*" mode="article.titlepage.verso.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="title" mode="article.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="article.titlepage.recto.style">
+<xsl:apply-templates select="." mode="article.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="subtitle" mode="article.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="article.titlepage.recto.style">
+<xsl:apply-templates select="." mode="article.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="corpauthor" mode="article.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="article.titlepage.recto.style">
+<xsl:apply-templates select="." mode="article.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="authorgroup" mode="article.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="article.titlepage.recto.style">
+<xsl:apply-templates select="." mode="article.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="author" mode="article.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="article.titlepage.recto.style">
+<xsl:apply-templates select="." mode="article.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="othercredit" mode="article.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="article.titlepage.recto.style">
+<xsl:apply-templates select="." mode="article.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="releaseinfo" mode="article.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="article.titlepage.recto.style">
+<xsl:apply-templates select="." mode="article.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="copyright" mode="article.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="article.titlepage.recto.style">
+<xsl:apply-templates select="." mode="article.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="legalnotice" mode="article.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="article.titlepage.recto.style">
+<xsl:apply-templates select="." mode="article.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="pubdate" mode="article.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="article.titlepage.recto.style">
+<xsl:apply-templates select="." mode="article.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="revision" mode="article.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="article.titlepage.recto.style">
+<xsl:apply-templates select="." mode="article.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="revhistory" mode="article.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="article.titlepage.recto.style">
+<xsl:apply-templates select="." mode="article.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="abstract" mode="article.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="article.titlepage.recto.style">
+<xsl:apply-templates select="." mode="article.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template name="set.titlepage.recto">
+ <xsl:choose>
+ <xsl:when test="setinfo/title">
+ <xsl:apply-templates mode="set.titlepage.recto.auto.mode" select="setinfo/title"/>
+ </xsl:when>
+ <xsl:when test="info/title">
+ <xsl:apply-templates mode="set.titlepage.recto.auto.mode" select="info/title"/>
+ </xsl:when>
+ <xsl:when test="title">
+ <xsl:apply-templates mode="set.titlepage.recto.auto.mode" select="title"/>
+ </xsl:when>
+ </xsl:choose>
+
+ <xsl:choose>
+ <xsl:when test="setinfo/subtitle">
+ <xsl:apply-templates mode="set.titlepage.recto.auto.mode" select="setinfo/subtitle"/>
+ </xsl:when>
+ <xsl:when test="info/subtitle">
+ <xsl:apply-templates mode="set.titlepage.recto.auto.mode" select="info/subtitle"/>
+ </xsl:when>
+ <xsl:when test="subtitle">
+ <xsl:apply-templates mode="set.titlepage.recto.auto.mode" select="subtitle"/>
+ </xsl:when>
+ </xsl:choose>
+
+ <xsl:apply-templates mode="set.titlepage.recto.auto.mode" select="setinfo/corpauthor"/>
+ <xsl:apply-templates mode="set.titlepage.recto.auto.mode" select="info/corpauthor"/>
+ <xsl:apply-templates mode="set.titlepage.recto.auto.mode" select="setinfo/authorgroup"/>
+ <xsl:apply-templates mode="set.titlepage.recto.auto.mode" select="info/authorgroup"/>
+ <xsl:apply-templates mode="set.titlepage.recto.auto.mode" select="setinfo/author"/>
+ <xsl:apply-templates mode="set.titlepage.recto.auto.mode" select="info/author"/>
+ <xsl:apply-templates mode="set.titlepage.recto.auto.mode" select="setinfo/othercredit"/>
+ <xsl:apply-templates mode="set.titlepage.recto.auto.mode" select="info/othercredit"/>
+ <xsl:apply-templates mode="set.titlepage.recto.auto.mode" select="setinfo/releaseinfo"/>
+ <xsl:apply-templates mode="set.titlepage.recto.auto.mode" select="info/releaseinfo"/>
+ <xsl:apply-templates mode="set.titlepage.recto.auto.mode" select="setinfo/copyright"/>
+ <xsl:apply-templates mode="set.titlepage.recto.auto.mode" select="info/copyright"/>
+ <xsl:apply-templates mode="set.titlepage.recto.auto.mode" select="setinfo/legalnotice"/>
+ <xsl:apply-templates mode="set.titlepage.recto.auto.mode" select="info/legalnotice"/>
+ <xsl:apply-templates mode="set.titlepage.recto.auto.mode" select="setinfo/pubdate"/>
+ <xsl:apply-templates mode="set.titlepage.recto.auto.mode" select="info/pubdate"/>
+ <xsl:apply-templates mode="set.titlepage.recto.auto.mode" select="setinfo/revision"/>
+ <xsl:apply-templates mode="set.titlepage.recto.auto.mode" select="info/revision"/>
+ <xsl:apply-templates mode="set.titlepage.recto.auto.mode" select="setinfo/revhistory"/>
+ <xsl:apply-templates mode="set.titlepage.recto.auto.mode" select="info/revhistory"/>
+ <xsl:apply-templates mode="set.titlepage.recto.auto.mode" select="setinfo/abstract"/>
+ <xsl:apply-templates mode="set.titlepage.recto.auto.mode" select="info/abstract"/>
+</xsl:template>
+
+<xsl:template name="set.titlepage.verso">
+</xsl:template>
+
+<xsl:template name="set.titlepage.separator"><hr/>
+</xsl:template>
+
+<xsl:template name="set.titlepage.before.recto">
+</xsl:template>
+
+<xsl:template name="set.titlepage.before.verso">
+</xsl:template>
+
+<xsl:template name="set.titlepage">
+ <div class="titlepage">
+ <xsl:variable name="recto.content">
+ <xsl:call-template name="set.titlepage.before.recto"/>
+ <xsl:call-template name="set.titlepage.recto"/>
+ </xsl:variable>
+ <xsl:variable name="recto.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($recto.content) != '') or ($recto.elements.count &gt; 0)">
+ <div><xsl:copy-of select="$recto.content"/></div>
+ </xsl:if>
+ <xsl:variable name="verso.content">
+ <xsl:call-template name="set.titlepage.before.verso"/>
+ <xsl:call-template name="set.titlepage.verso"/>
+ </xsl:variable>
+ <xsl:variable name="verso.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($verso.content) != '') or ($verso.elements.count &gt; 0)">
+ <div><xsl:copy-of select="$verso.content"/></div>
+ </xsl:if>
+ <xsl:call-template name="set.titlepage.separator"/>
+ </div>
+</xsl:template>
+
+<xsl:template match="*" mode="set.titlepage.recto.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="*" mode="set.titlepage.verso.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="title" mode="set.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="set.titlepage.recto.style">
+<xsl:apply-templates select="." mode="set.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="subtitle" mode="set.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="set.titlepage.recto.style">
+<xsl:apply-templates select="." mode="set.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="corpauthor" mode="set.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="set.titlepage.recto.style">
+<xsl:apply-templates select="." mode="set.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="authorgroup" mode="set.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="set.titlepage.recto.style">
+<xsl:apply-templates select="." mode="set.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="author" mode="set.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="set.titlepage.recto.style">
+<xsl:apply-templates select="." mode="set.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="othercredit" mode="set.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="set.titlepage.recto.style">
+<xsl:apply-templates select="." mode="set.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="releaseinfo" mode="set.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="set.titlepage.recto.style">
+<xsl:apply-templates select="." mode="set.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="copyright" mode="set.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="set.titlepage.recto.style">
+<xsl:apply-templates select="." mode="set.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="legalnotice" mode="set.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="set.titlepage.recto.style">
+<xsl:apply-templates select="." mode="set.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="pubdate" mode="set.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="set.titlepage.recto.style">
+<xsl:apply-templates select="." mode="set.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="revision" mode="set.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="set.titlepage.recto.style">
+<xsl:apply-templates select="." mode="set.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="revhistory" mode="set.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="set.titlepage.recto.style">
+<xsl:apply-templates select="." mode="set.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="abstract" mode="set.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="set.titlepage.recto.style">
+<xsl:apply-templates select="." mode="set.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template name="book.titlepage.recto">
+ <xsl:choose>
+ <xsl:when test="bookinfo/title">
+ <xsl:apply-templates mode="book.titlepage.recto.auto.mode" select="bookinfo/title"/>
+ </xsl:when>
+ <xsl:when test="info/title">
+ <xsl:apply-templates mode="book.titlepage.recto.auto.mode" select="info/title"/>
+ </xsl:when>
+ <xsl:when test="title">
+ <xsl:apply-templates mode="book.titlepage.recto.auto.mode" select="title"/>
+ </xsl:when>
+ </xsl:choose>
+
+ <xsl:choose>
+ <xsl:when test="bookinfo/subtitle">
+ <xsl:apply-templates mode="book.titlepage.recto.auto.mode" select="bookinfo/subtitle"/>
+ </xsl:when>
+ <xsl:when test="info/subtitle">
+ <xsl:apply-templates mode="book.titlepage.recto.auto.mode" select="info/subtitle"/>
+ </xsl:when>
+ <xsl:when test="subtitle">
+ <xsl:apply-templates mode="book.titlepage.recto.auto.mode" select="subtitle"/>
+ </xsl:when>
+ </xsl:choose>
+
+ <xsl:apply-templates mode="book.titlepage.recto.auto.mode" select="bookinfo/corpauthor"/>
+ <xsl:apply-templates mode="book.titlepage.recto.auto.mode" select="info/corpauthor"/>
+ <xsl:apply-templates mode="book.titlepage.recto.auto.mode" select="bookinfo/authorgroup"/>
+ <xsl:apply-templates mode="book.titlepage.recto.auto.mode" select="info/authorgroup"/>
+ <xsl:apply-templates mode="book.titlepage.recto.auto.mode" select="bookinfo/author"/>
+ <xsl:apply-templates mode="book.titlepage.recto.auto.mode" select="info/author"/>
+ <xsl:apply-templates mode="book.titlepage.recto.auto.mode" select="bookinfo/othercredit"/>
+ <xsl:apply-templates mode="book.titlepage.recto.auto.mode" select="info/othercredit"/>
+ <xsl:apply-templates mode="book.titlepage.recto.auto.mode" select="bookinfo/releaseinfo"/>
+ <xsl:apply-templates mode="book.titlepage.recto.auto.mode" select="info/releaseinfo"/>
+ <xsl:apply-templates mode="book.titlepage.recto.auto.mode" select="bookinfo/copyright"/>
+ <xsl:apply-templates mode="book.titlepage.recto.auto.mode" select="info/copyright"/>
+ <xsl:apply-templates mode="book.titlepage.recto.auto.mode" select="bookinfo/legalnotice"/>
+ <xsl:apply-templates mode="book.titlepage.recto.auto.mode" select="info/legalnotice"/>
+ <xsl:apply-templates mode="book.titlepage.recto.auto.mode" select="bookinfo/pubdate"/>
+ <xsl:apply-templates mode="book.titlepage.recto.auto.mode" select="info/pubdate"/>
+ <xsl:apply-templates mode="book.titlepage.recto.auto.mode" select="bookinfo/revision"/>
+ <xsl:apply-templates mode="book.titlepage.recto.auto.mode" select="info/revision"/>
+ <xsl:apply-templates mode="book.titlepage.recto.auto.mode" select="bookinfo/revhistory"/>
+ <xsl:apply-templates mode="book.titlepage.recto.auto.mode" select="info/revhistory"/>
+ <xsl:apply-templates mode="book.titlepage.recto.auto.mode" select="bookinfo/abstract"/>
+ <xsl:apply-templates mode="book.titlepage.recto.auto.mode" select="info/abstract"/>
+</xsl:template>
+
+<xsl:template name="book.titlepage.verso">
+</xsl:template>
+
+<xsl:template name="book.titlepage.separator"><hr/>
+</xsl:template>
+
+<xsl:template name="book.titlepage.before.recto">
+</xsl:template>
+
+<xsl:template name="book.titlepage.before.verso">
+</xsl:template>
+
+<xsl:template name="book.titlepage">
+ <div class="titlepage">
+ <xsl:variable name="recto.content">
+ <xsl:call-template name="book.titlepage.before.recto"/>
+ <xsl:call-template name="book.titlepage.recto"/>
+ </xsl:variable>
+ <xsl:variable name="recto.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($recto.content) != '') or ($recto.elements.count &gt; 0)">
+ <div><xsl:copy-of select="$recto.content"/></div>
+ </xsl:if>
+ <xsl:variable name="verso.content">
+ <xsl:call-template name="book.titlepage.before.verso"/>
+ <xsl:call-template name="book.titlepage.verso"/>
+ </xsl:variable>
+ <xsl:variable name="verso.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($verso.content) != '') or ($verso.elements.count &gt; 0)">
+ <div><xsl:copy-of select="$verso.content"/></div>
+ </xsl:if>
+ <xsl:call-template name="book.titlepage.separator"/>
+ </div>
+</xsl:template>
+
+<xsl:template match="*" mode="book.titlepage.recto.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="*" mode="book.titlepage.verso.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="title" mode="book.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="book.titlepage.recto.style">
+<xsl:apply-templates select="." mode="book.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="subtitle" mode="book.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="book.titlepage.recto.style">
+<xsl:apply-templates select="." mode="book.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="corpauthor" mode="book.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="book.titlepage.recto.style">
+<xsl:apply-templates select="." mode="book.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="authorgroup" mode="book.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="book.titlepage.recto.style">
+<xsl:apply-templates select="." mode="book.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="author" mode="book.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="book.titlepage.recto.style">
+<xsl:apply-templates select="." mode="book.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="othercredit" mode="book.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="book.titlepage.recto.style">
+<xsl:apply-templates select="." mode="book.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="releaseinfo" mode="book.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="book.titlepage.recto.style">
+<xsl:apply-templates select="." mode="book.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="copyright" mode="book.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="book.titlepage.recto.style">
+<xsl:apply-templates select="." mode="book.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="legalnotice" mode="book.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="book.titlepage.recto.style">
+<xsl:apply-templates select="." mode="book.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="pubdate" mode="book.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="book.titlepage.recto.style">
+<xsl:apply-templates select="." mode="book.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="revision" mode="book.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="book.titlepage.recto.style">
+<xsl:apply-templates select="." mode="book.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="revhistory" mode="book.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="book.titlepage.recto.style">
+<xsl:apply-templates select="." mode="book.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="abstract" mode="book.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="book.titlepage.recto.style">
+<xsl:apply-templates select="." mode="book.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template name="part.titlepage.recto">
+ <div xsl:use-attribute-sets="part.titlepage.recto.style">
+<xsl:call-template name="division.title">
+<xsl:with-param name="node" select="ancestor-or-self::part[1]"/>
+</xsl:call-template></div>
+ <xsl:choose>
+ <xsl:when test="partinfo/subtitle">
+ <xsl:apply-templates mode="part.titlepage.recto.auto.mode" select="partinfo/subtitle"/>
+ </xsl:when>
+ <xsl:when test="docinfo/subtitle">
+ <xsl:apply-templates mode="part.titlepage.recto.auto.mode" select="docinfo/subtitle"/>
+ </xsl:when>
+ <xsl:when test="info/subtitle">
+ <xsl:apply-templates mode="part.titlepage.recto.auto.mode" select="info/subtitle"/>
+ </xsl:when>
+ <xsl:when test="subtitle">
+ <xsl:apply-templates mode="part.titlepage.recto.auto.mode" select="subtitle"/>
+ </xsl:when>
+ </xsl:choose>
+
+ <xsl:apply-templates mode="part.titlepage.recto.auto.mode" select="partinfo/corpauthor"/>
+ <xsl:apply-templates mode="part.titlepage.recto.auto.mode" select="docinfo/corpauthor"/>
+ <xsl:apply-templates mode="part.titlepage.recto.auto.mode" select="info/corpauthor"/>
+ <xsl:apply-templates mode="part.titlepage.recto.auto.mode" select="partinfo/authorgroup"/>
+ <xsl:apply-templates mode="part.titlepage.recto.auto.mode" select="docinfo/authorgroup"/>
+ <xsl:apply-templates mode="part.titlepage.recto.auto.mode" select="info/authorgroup"/>
+ <xsl:apply-templates mode="part.titlepage.recto.auto.mode" select="partinfo/author"/>
+ <xsl:apply-templates mode="part.titlepage.recto.auto.mode" select="docinfo/author"/>
+ <xsl:apply-templates mode="part.titlepage.recto.auto.mode" select="info/author"/>
+ <xsl:apply-templates mode="part.titlepage.recto.auto.mode" select="partinfo/othercredit"/>
+ <xsl:apply-templates mode="part.titlepage.recto.auto.mode" select="docinfo/othercredit"/>
+ <xsl:apply-templates mode="part.titlepage.recto.auto.mode" select="info/othercredit"/>
+ <xsl:apply-templates mode="part.titlepage.recto.auto.mode" select="partinfo/releaseinfo"/>
+ <xsl:apply-templates mode="part.titlepage.recto.auto.mode" select="docinfo/releaseinfo"/>
+ <xsl:apply-templates mode="part.titlepage.recto.auto.mode" select="info/releaseinfo"/>
+ <xsl:apply-templates mode="part.titlepage.recto.auto.mode" select="partinfo/copyright"/>
+ <xsl:apply-templates mode="part.titlepage.recto.auto.mode" select="docinfo/copyright"/>
+ <xsl:apply-templates mode="part.titlepage.recto.auto.mode" select="info/copyright"/>
+ <xsl:apply-templates mode="part.titlepage.recto.auto.mode" select="partinfo/legalnotice"/>
+ <xsl:apply-templates mode="part.titlepage.recto.auto.mode" select="docinfo/legalnotice"/>
+ <xsl:apply-templates mode="part.titlepage.recto.auto.mode" select="info/legalnotice"/>
+ <xsl:apply-templates mode="part.titlepage.recto.auto.mode" select="partinfo/pubdate"/>
+ <xsl:apply-templates mode="part.titlepage.recto.auto.mode" select="docinfo/pubdate"/>
+ <xsl:apply-templates mode="part.titlepage.recto.auto.mode" select="info/pubdate"/>
+ <xsl:apply-templates mode="part.titlepage.recto.auto.mode" select="partinfo/revision"/>
+ <xsl:apply-templates mode="part.titlepage.recto.auto.mode" select="docinfo/revision"/>
+ <xsl:apply-templates mode="part.titlepage.recto.auto.mode" select="info/revision"/>
+ <xsl:apply-templates mode="part.titlepage.recto.auto.mode" select="partinfo/revhistory"/>
+ <xsl:apply-templates mode="part.titlepage.recto.auto.mode" select="docinfo/revhistory"/>
+ <xsl:apply-templates mode="part.titlepage.recto.auto.mode" select="info/revhistory"/>
+ <xsl:apply-templates mode="part.titlepage.recto.auto.mode" select="partinfo/abstract"/>
+ <xsl:apply-templates mode="part.titlepage.recto.auto.mode" select="docinfo/abstract"/>
+ <xsl:apply-templates mode="part.titlepage.recto.auto.mode" select="info/abstract"/>
+</xsl:template>
+
+<xsl:template name="part.titlepage.verso">
+</xsl:template>
+
+<xsl:template name="part.titlepage.separator">
+</xsl:template>
+
+<xsl:template name="part.titlepage.before.recto">
+</xsl:template>
+
+<xsl:template name="part.titlepage.before.verso">
+</xsl:template>
+
+<xsl:template name="part.titlepage">
+ <div class="titlepage">
+ <xsl:variable name="recto.content">
+ <xsl:call-template name="part.titlepage.before.recto"/>
+ <xsl:call-template name="part.titlepage.recto"/>
+ </xsl:variable>
+ <xsl:variable name="recto.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($recto.content) != '') or ($recto.elements.count &gt; 0)">
+ <div><xsl:copy-of select="$recto.content"/></div>
+ </xsl:if>
+ <xsl:variable name="verso.content">
+ <xsl:call-template name="part.titlepage.before.verso"/>
+ <xsl:call-template name="part.titlepage.verso"/>
+ </xsl:variable>
+ <xsl:variable name="verso.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($verso.content) != '') or ($verso.elements.count &gt; 0)">
+ <div><xsl:copy-of select="$verso.content"/></div>
+ </xsl:if>
+ <xsl:call-template name="part.titlepage.separator"/>
+ </div>
+</xsl:template>
+
+<xsl:template match="*" mode="part.titlepage.recto.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="*" mode="part.titlepage.verso.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="subtitle" mode="part.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="part.titlepage.recto.style">
+<xsl:apply-templates select="." mode="part.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="corpauthor" mode="part.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="part.titlepage.recto.style">
+<xsl:apply-templates select="." mode="part.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="authorgroup" mode="part.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="part.titlepage.recto.style">
+<xsl:apply-templates select="." mode="part.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="author" mode="part.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="part.titlepage.recto.style">
+<xsl:apply-templates select="." mode="part.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="othercredit" mode="part.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="part.titlepage.recto.style">
+<xsl:apply-templates select="." mode="part.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="releaseinfo" mode="part.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="part.titlepage.recto.style">
+<xsl:apply-templates select="." mode="part.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="copyright" mode="part.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="part.titlepage.recto.style">
+<xsl:apply-templates select="." mode="part.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="legalnotice" mode="part.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="part.titlepage.recto.style">
+<xsl:apply-templates select="." mode="part.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="pubdate" mode="part.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="part.titlepage.recto.style">
+<xsl:apply-templates select="." mode="part.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="revision" mode="part.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="part.titlepage.recto.style">
+<xsl:apply-templates select="." mode="part.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="revhistory" mode="part.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="part.titlepage.recto.style">
+<xsl:apply-templates select="." mode="part.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="abstract" mode="part.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="part.titlepage.recto.style">
+<xsl:apply-templates select="." mode="part.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template name="partintro.titlepage.recto">
+ <xsl:choose>
+ <xsl:when test="partintroinfo/title">
+ <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="partintroinfo/title"/>
+ </xsl:when>
+ <xsl:when test="docinfo/title">
+ <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="docinfo/title"/>
+ </xsl:when>
+ <xsl:when test="info/title">
+ <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="info/title"/>
+ </xsl:when>
+ <xsl:when test="title">
+ <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="title"/>
+ </xsl:when>
+ </xsl:choose>
+
+ <xsl:choose>
+ <xsl:when test="partintroinfo/subtitle">
+ <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="partintroinfo/subtitle"/>
+ </xsl:when>
+ <xsl:when test="docinfo/subtitle">
+ <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="docinfo/subtitle"/>
+ </xsl:when>
+ <xsl:when test="info/subtitle">
+ <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="info/subtitle"/>
+ </xsl:when>
+ <xsl:when test="subtitle">
+ <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="subtitle"/>
+ </xsl:when>
+ </xsl:choose>
+
+ <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="partintroinfo/corpauthor"/>
+ <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="docinfo/corpauthor"/>
+ <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="info/corpauthor"/>
+ <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="partintroinfo/authorgroup"/>
+ <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="docinfo/authorgroup"/>
+ <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="info/authorgroup"/>
+ <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="partintroinfo/author"/>
+ <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="docinfo/author"/>
+ <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="info/author"/>
+ <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="partintroinfo/othercredit"/>
+ <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="docinfo/othercredit"/>
+ <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="info/othercredit"/>
+ <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="partintroinfo/releaseinfo"/>
+ <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="docinfo/releaseinfo"/>
+ <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="info/releaseinfo"/>
+ <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="partintroinfo/copyright"/>
+ <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="docinfo/copyright"/>
+ <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="info/copyright"/>
+ <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="partintroinfo/legalnotice"/>
+ <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="docinfo/legalnotice"/>
+ <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="info/legalnotice"/>
+ <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="partintroinfo/pubdate"/>
+ <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="docinfo/pubdate"/>
+ <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="info/pubdate"/>
+ <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="partintroinfo/revision"/>
+ <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="docinfo/revision"/>
+ <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="info/revision"/>
+ <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="partintroinfo/revhistory"/>
+ <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="docinfo/revhistory"/>
+ <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="info/revhistory"/>
+ <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="partintroinfo/abstract"/>
+ <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="docinfo/abstract"/>
+ <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="info/abstract"/>
+</xsl:template>
+
+<xsl:template name="partintro.titlepage.verso">
+</xsl:template>
+
+<xsl:template name="partintro.titlepage.separator">
+</xsl:template>
+
+<xsl:template name="partintro.titlepage.before.recto">
+</xsl:template>
+
+<xsl:template name="partintro.titlepage.before.verso">
+</xsl:template>
+
+<xsl:template name="partintro.titlepage">
+ <div>
+ <xsl:variable name="recto.content">
+ <xsl:call-template name="partintro.titlepage.before.recto"/>
+ <xsl:call-template name="partintro.titlepage.recto"/>
+ </xsl:variable>
+ <xsl:variable name="recto.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($recto.content) != '') or ($recto.elements.count &gt; 0)">
+ <div><xsl:copy-of select="$recto.content"/></div>
+ </xsl:if>
+ <xsl:variable name="verso.content">
+ <xsl:call-template name="partintro.titlepage.before.verso"/>
+ <xsl:call-template name="partintro.titlepage.verso"/>
+ </xsl:variable>
+ <xsl:variable name="verso.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($verso.content) != '') or ($verso.elements.count &gt; 0)">
+ <div><xsl:copy-of select="$verso.content"/></div>
+ </xsl:if>
+ <xsl:call-template name="partintro.titlepage.separator"/>
+ </div>
+</xsl:template>
+
+<xsl:template match="*" mode="partintro.titlepage.recto.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="*" mode="partintro.titlepage.verso.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="title" mode="partintro.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="partintro.titlepage.recto.style">
+<xsl:apply-templates select="." mode="partintro.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="subtitle" mode="partintro.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="partintro.titlepage.recto.style">
+<xsl:apply-templates select="." mode="partintro.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="corpauthor" mode="partintro.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="partintro.titlepage.recto.style">
+<xsl:apply-templates select="." mode="partintro.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="authorgroup" mode="partintro.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="partintro.titlepage.recto.style">
+<xsl:apply-templates select="." mode="partintro.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="author" mode="partintro.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="partintro.titlepage.recto.style">
+<xsl:apply-templates select="." mode="partintro.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="othercredit" mode="partintro.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="partintro.titlepage.recto.style">
+<xsl:apply-templates select="." mode="partintro.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="releaseinfo" mode="partintro.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="partintro.titlepage.recto.style">
+<xsl:apply-templates select="." mode="partintro.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="copyright" mode="partintro.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="partintro.titlepage.recto.style">
+<xsl:apply-templates select="." mode="partintro.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="legalnotice" mode="partintro.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="partintro.titlepage.recto.style">
+<xsl:apply-templates select="." mode="partintro.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="pubdate" mode="partintro.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="partintro.titlepage.recto.style">
+<xsl:apply-templates select="." mode="partintro.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="revision" mode="partintro.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="partintro.titlepage.recto.style">
+<xsl:apply-templates select="." mode="partintro.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="revhistory" mode="partintro.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="partintro.titlepage.recto.style">
+<xsl:apply-templates select="." mode="partintro.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="abstract" mode="partintro.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="partintro.titlepage.recto.style">
+<xsl:apply-templates select="." mode="partintro.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template name="reference.titlepage.recto">
+ <xsl:choose>
+ <xsl:when test="referenceinfo/title">
+ <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="referenceinfo/title"/>
+ </xsl:when>
+ <xsl:when test="docinfo/title">
+ <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="docinfo/title"/>
+ </xsl:when>
+ <xsl:when test="info/title">
+ <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="info/title"/>
+ </xsl:when>
+ <xsl:when test="title">
+ <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="title"/>
+ </xsl:when>
+ </xsl:choose>
+
+ <xsl:choose>
+ <xsl:when test="referenceinfo/subtitle">
+ <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="referenceinfo/subtitle"/>
+ </xsl:when>
+ <xsl:when test="docinfo/subtitle">
+ <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="docinfo/subtitle"/>
+ </xsl:when>
+ <xsl:when test="info/subtitle">
+ <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="info/subtitle"/>
+ </xsl:when>
+ <xsl:when test="subtitle">
+ <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="subtitle"/>
+ </xsl:when>
+ </xsl:choose>
+
+ <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="referenceinfo/corpauthor"/>
+ <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="docinfo/corpauthor"/>
+ <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="info/corpauthor"/>
+ <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="referenceinfo/authorgroup"/>
+ <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="docinfo/authorgroup"/>
+ <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="info/authorgroup"/>
+ <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="referenceinfo/author"/>
+ <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="docinfo/author"/>
+ <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="info/author"/>
+ <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="referenceinfo/othercredit"/>
+ <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="docinfo/othercredit"/>
+ <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="info/othercredit"/>
+ <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="referenceinfo/releaseinfo"/>
+ <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="docinfo/releaseinfo"/>
+ <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="info/releaseinfo"/>
+ <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="referenceinfo/copyright"/>
+ <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="docinfo/copyright"/>
+ <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="info/copyright"/>
+ <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="referenceinfo/legalnotice"/>
+ <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="docinfo/legalnotice"/>
+ <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="info/legalnotice"/>
+ <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="referenceinfo/pubdate"/>
+ <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="docinfo/pubdate"/>
+ <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="info/pubdate"/>
+ <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="referenceinfo/revision"/>
+ <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="docinfo/revision"/>
+ <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="info/revision"/>
+ <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="referenceinfo/revhistory"/>
+ <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="docinfo/revhistory"/>
+ <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="info/revhistory"/>
+ <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="referenceinfo/abstract"/>
+ <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="docinfo/abstract"/>
+ <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="info/abstract"/>
+</xsl:template>
+
+<xsl:template name="reference.titlepage.verso">
+</xsl:template>
+
+<xsl:template name="reference.titlepage.separator"><hr/>
+</xsl:template>
+
+<xsl:template name="reference.titlepage.before.recto">
+</xsl:template>
+
+<xsl:template name="reference.titlepage.before.verso">
+</xsl:template>
+
+<xsl:template name="reference.titlepage">
+ <div class="titlepage">
+ <xsl:variable name="recto.content">
+ <xsl:call-template name="reference.titlepage.before.recto"/>
+ <xsl:call-template name="reference.titlepage.recto"/>
+ </xsl:variable>
+ <xsl:variable name="recto.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($recto.content) != '') or ($recto.elements.count &gt; 0)">
+ <div><xsl:copy-of select="$recto.content"/></div>
+ </xsl:if>
+ <xsl:variable name="verso.content">
+ <xsl:call-template name="reference.titlepage.before.verso"/>
+ <xsl:call-template name="reference.titlepage.verso"/>
+ </xsl:variable>
+ <xsl:variable name="verso.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($verso.content) != '') or ($verso.elements.count &gt; 0)">
+ <div><xsl:copy-of select="$verso.content"/></div>
+ </xsl:if>
+ <xsl:call-template name="reference.titlepage.separator"/>
+ </div>
+</xsl:template>
+
+<xsl:template match="*" mode="reference.titlepage.recto.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="*" mode="reference.titlepage.verso.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="title" mode="reference.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="reference.titlepage.recto.style">
+<xsl:apply-templates select="." mode="reference.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="subtitle" mode="reference.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="reference.titlepage.recto.style">
+<xsl:apply-templates select="." mode="reference.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="corpauthor" mode="reference.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="reference.titlepage.recto.style">
+<xsl:apply-templates select="." mode="reference.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="authorgroup" mode="reference.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="reference.titlepage.recto.style">
+<xsl:apply-templates select="." mode="reference.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="author" mode="reference.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="reference.titlepage.recto.style">
+<xsl:apply-templates select="." mode="reference.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="othercredit" mode="reference.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="reference.titlepage.recto.style">
+<xsl:apply-templates select="." mode="reference.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="releaseinfo" mode="reference.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="reference.titlepage.recto.style">
+<xsl:apply-templates select="." mode="reference.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="copyright" mode="reference.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="reference.titlepage.recto.style">
+<xsl:apply-templates select="." mode="reference.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="legalnotice" mode="reference.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="reference.titlepage.recto.style">
+<xsl:apply-templates select="." mode="reference.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="pubdate" mode="reference.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="reference.titlepage.recto.style">
+<xsl:apply-templates select="." mode="reference.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="revision" mode="reference.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="reference.titlepage.recto.style">
+<xsl:apply-templates select="." mode="reference.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="revhistory" mode="reference.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="reference.titlepage.recto.style">
+<xsl:apply-templates select="." mode="reference.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="abstract" mode="reference.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="reference.titlepage.recto.style">
+<xsl:apply-templates select="." mode="reference.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template name="refentry.titlepage.recto">
+</xsl:template>
+
+<xsl:template name="refentry.titlepage.verso">
+</xsl:template>
+
+<xsl:template name="refentry.titlepage.separator">
+</xsl:template>
+
+<xsl:template name="refentry.titlepage.before.recto">
+</xsl:template>
+
+<xsl:template name="refentry.titlepage.before.verso">
+</xsl:template>
+
+<xsl:template name="refentry.titlepage">
+ <div class="titlepage">
+ <xsl:variable name="recto.content">
+ <xsl:call-template name="refentry.titlepage.before.recto"/>
+ <xsl:call-template name="refentry.titlepage.recto"/>
+ </xsl:variable>
+ <xsl:variable name="recto.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($recto.content) != '') or ($recto.elements.count &gt; 0)">
+ <div><xsl:copy-of select="$recto.content"/></div>
+ </xsl:if>
+ <xsl:variable name="verso.content">
+ <xsl:call-template name="refentry.titlepage.before.verso"/>
+ <xsl:call-template name="refentry.titlepage.verso"/>
+ </xsl:variable>
+ <xsl:variable name="verso.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($verso.content) != '') or ($verso.elements.count &gt; 0)">
+ <div><xsl:copy-of select="$verso.content"/></div>
+ </xsl:if>
+ <xsl:call-template name="refentry.titlepage.separator"/>
+ </div>
+</xsl:template>
+
+<xsl:template match="*" mode="refentry.titlepage.recto.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="*" mode="refentry.titlepage.verso.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template name="dedication.titlepage.recto">
+ <div xsl:use-attribute-sets="dedication.titlepage.recto.style">
+<xsl:call-template name="component.title">
+<xsl:with-param name="node" select="ancestor-or-self::dedication[1]"/>
+</xsl:call-template></div>
+ <xsl:choose>
+ <xsl:when test="dedicationinfo/subtitle">
+ <xsl:apply-templates mode="dedication.titlepage.recto.auto.mode" select="dedicationinfo/subtitle"/>
+ </xsl:when>
+ <xsl:when test="docinfo/subtitle">
+ <xsl:apply-templates mode="dedication.titlepage.recto.auto.mode" select="docinfo/subtitle"/>
+ </xsl:when>
+ <xsl:when test="info/subtitle">
+ <xsl:apply-templates mode="dedication.titlepage.recto.auto.mode" select="info/subtitle"/>
+ </xsl:when>
+ <xsl:when test="subtitle">
+ <xsl:apply-templates mode="dedication.titlepage.recto.auto.mode" select="subtitle"/>
+ </xsl:when>
+ </xsl:choose>
+
+</xsl:template>
+
+<xsl:template name="dedication.titlepage.verso">
+</xsl:template>
+
+<xsl:template name="dedication.titlepage.separator">
+</xsl:template>
+
+<xsl:template name="dedication.titlepage.before.recto">
+</xsl:template>
+
+<xsl:template name="dedication.titlepage.before.verso">
+</xsl:template>
+
+<xsl:template name="dedication.titlepage">
+ <div class="titlepage">
+ <xsl:variable name="recto.content">
+ <xsl:call-template name="dedication.titlepage.before.recto"/>
+ <xsl:call-template name="dedication.titlepage.recto"/>
+ </xsl:variable>
+ <xsl:variable name="recto.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($recto.content) != '') or ($recto.elements.count &gt; 0)">
+ <div><xsl:copy-of select="$recto.content"/></div>
+ </xsl:if>
+ <xsl:variable name="verso.content">
+ <xsl:call-template name="dedication.titlepage.before.verso"/>
+ <xsl:call-template name="dedication.titlepage.verso"/>
+ </xsl:variable>
+ <xsl:variable name="verso.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($verso.content) != '') or ($verso.elements.count &gt; 0)">
+ <div><xsl:copy-of select="$verso.content"/></div>
+ </xsl:if>
+ <xsl:call-template name="dedication.titlepage.separator"/>
+ </div>
+</xsl:template>
+
+<xsl:template match="*" mode="dedication.titlepage.recto.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="*" mode="dedication.titlepage.verso.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="subtitle" mode="dedication.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="dedication.titlepage.recto.style">
+<xsl:apply-templates select="." mode="dedication.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template name="acknowledgements.titlepage.recto">
+ <div xsl:use-attribute-sets="acknowledgements.titlepage.recto.style">
+<xsl:call-template name="component.title">
+<xsl:with-param name="node" select="ancestor-or-self::acknowledgements[1]"/>
+</xsl:call-template></div>
+ <xsl:choose>
+ <xsl:when test="acknowledgementsinfo/subtitle">
+ <xsl:apply-templates mode="acknowledgements.titlepage.recto.auto.mode" select="acknowledgementsinfo/subtitle"/>
+ </xsl:when>
+ <xsl:when test="docinfo/subtitle">
+ <xsl:apply-templates mode="acknowledgements.titlepage.recto.auto.mode" select="docinfo/subtitle"/>
+ </xsl:when>
+ <xsl:when test="info/subtitle">
+ <xsl:apply-templates mode="acknowledgements.titlepage.recto.auto.mode" select="info/subtitle"/>
+ </xsl:when>
+ <xsl:when test="subtitle">
+ <xsl:apply-templates mode="acknowledgements.titlepage.recto.auto.mode" select="subtitle"/>
+ </xsl:when>
+ </xsl:choose>
+
+</xsl:template>
+
+<xsl:template name="acknowledgements.titlepage.verso">
+</xsl:template>
+
+<xsl:template name="acknowledgements.titlepage.separator">
+</xsl:template>
+
+<xsl:template name="acknowledgements.titlepage.before.recto">
+</xsl:template>
+
+<xsl:template name="acknowledgements.titlepage.before.verso">
+</xsl:template>
+
+<xsl:template name="acknowledgements.titlepage">
+ <div class="titlepage">
+ <xsl:variable name="recto.content">
+ <xsl:call-template name="acknowledgements.titlepage.before.recto"/>
+ <xsl:call-template name="acknowledgements.titlepage.recto"/>
+ </xsl:variable>
+ <xsl:variable name="recto.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($recto.content) != '') or ($recto.elements.count &gt; 0)">
+ <div><xsl:copy-of select="$recto.content"/></div>
+ </xsl:if>
+ <xsl:variable name="verso.content">
+ <xsl:call-template name="acknowledgements.titlepage.before.verso"/>
+ <xsl:call-template name="acknowledgements.titlepage.verso"/>
+ </xsl:variable>
+ <xsl:variable name="verso.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($verso.content) != '') or ($verso.elements.count &gt; 0)">
+ <div><xsl:copy-of select="$verso.content"/></div>
+ </xsl:if>
+ <xsl:call-template name="acknowledgements.titlepage.separator"/>
+ </div>
+</xsl:template>
+
+<xsl:template match="*" mode="acknowledgements.titlepage.recto.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="*" mode="acknowledgements.titlepage.verso.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="subtitle" mode="acknowledgements.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="acknowledgements.titlepage.recto.style">
+<xsl:apply-templates select="." mode="acknowledgements.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template name="preface.titlepage.recto">
+ <xsl:choose>
+ <xsl:when test="prefaceinfo/title">
+ <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="prefaceinfo/title"/>
+ </xsl:when>
+ <xsl:when test="docinfo/title">
+ <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="docinfo/title"/>
+ </xsl:when>
+ <xsl:when test="info/title">
+ <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="info/title"/>
+ </xsl:when>
+ <xsl:when test="title">
+ <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="title"/>
+ </xsl:when>
+ </xsl:choose>
+
+ <xsl:choose>
+ <xsl:when test="prefaceinfo/subtitle">
+ <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="prefaceinfo/subtitle"/>
+ </xsl:when>
+ <xsl:when test="docinfo/subtitle">
+ <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="docinfo/subtitle"/>
+ </xsl:when>
+ <xsl:when test="info/subtitle">
+ <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="info/subtitle"/>
+ </xsl:when>
+ <xsl:when test="subtitle">
+ <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="subtitle"/>
+ </xsl:when>
+ </xsl:choose>
+
+ <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="prefaceinfo/corpauthor"/>
+ <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="docinfo/corpauthor"/>
+ <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="info/corpauthor"/>
+ <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="prefaceinfo/authorgroup"/>
+ <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="docinfo/authorgroup"/>
+ <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="info/authorgroup"/>
+ <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="prefaceinfo/author"/>
+ <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="docinfo/author"/>
+ <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="info/author"/>
+ <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="prefaceinfo/othercredit"/>
+ <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="docinfo/othercredit"/>
+ <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="info/othercredit"/>
+ <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="prefaceinfo/releaseinfo"/>
+ <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="docinfo/releaseinfo"/>
+ <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="info/releaseinfo"/>
+ <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="prefaceinfo/copyright"/>
+ <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="docinfo/copyright"/>
+ <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="info/copyright"/>
+ <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="prefaceinfo/legalnotice"/>
+ <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="docinfo/legalnotice"/>
+ <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="info/legalnotice"/>
+ <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="prefaceinfo/pubdate"/>
+ <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="docinfo/pubdate"/>
+ <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="info/pubdate"/>
+ <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="prefaceinfo/revision"/>
+ <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="docinfo/revision"/>
+ <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="info/revision"/>
+ <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="prefaceinfo/revhistory"/>
+ <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="docinfo/revhistory"/>
+ <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="info/revhistory"/>
+ <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="prefaceinfo/abstract"/>
+ <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="docinfo/abstract"/>
+ <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="info/abstract"/>
+</xsl:template>
+
+<xsl:template name="preface.titlepage.verso">
+</xsl:template>
+
+<xsl:template name="preface.titlepage.separator">
+</xsl:template>
+
+<xsl:template name="preface.titlepage.before.recto">
+</xsl:template>
+
+<xsl:template name="preface.titlepage.before.verso">
+</xsl:template>
+
+<xsl:template name="preface.titlepage">
+ <div class="titlepage">
+ <xsl:variable name="recto.content">
+ <xsl:call-template name="preface.titlepage.before.recto"/>
+ <xsl:call-template name="preface.titlepage.recto"/>
+ </xsl:variable>
+ <xsl:variable name="recto.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($recto.content) != '') or ($recto.elements.count &gt; 0)">
+ <div><xsl:copy-of select="$recto.content"/></div>
+ </xsl:if>
+ <xsl:variable name="verso.content">
+ <xsl:call-template name="preface.titlepage.before.verso"/>
+ <xsl:call-template name="preface.titlepage.verso"/>
+ </xsl:variable>
+ <xsl:variable name="verso.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($verso.content) != '') or ($verso.elements.count &gt; 0)">
+ <div><xsl:copy-of select="$verso.content"/></div>
+ </xsl:if>
+ <xsl:call-template name="preface.titlepage.separator"/>
+ </div>
+</xsl:template>
+
+<xsl:template match="*" mode="preface.titlepage.recto.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="*" mode="preface.titlepage.verso.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="title" mode="preface.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="preface.titlepage.recto.style">
+<xsl:apply-templates select="." mode="preface.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="subtitle" mode="preface.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="preface.titlepage.recto.style">
+<xsl:apply-templates select="." mode="preface.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="corpauthor" mode="preface.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="preface.titlepage.recto.style">
+<xsl:apply-templates select="." mode="preface.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="authorgroup" mode="preface.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="preface.titlepage.recto.style">
+<xsl:apply-templates select="." mode="preface.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="author" mode="preface.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="preface.titlepage.recto.style">
+<xsl:apply-templates select="." mode="preface.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="othercredit" mode="preface.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="preface.titlepage.recto.style">
+<xsl:apply-templates select="." mode="preface.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="releaseinfo" mode="preface.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="preface.titlepage.recto.style">
+<xsl:apply-templates select="." mode="preface.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="copyright" mode="preface.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="preface.titlepage.recto.style">
+<xsl:apply-templates select="." mode="preface.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="legalnotice" mode="preface.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="preface.titlepage.recto.style">
+<xsl:apply-templates select="." mode="preface.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="pubdate" mode="preface.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="preface.titlepage.recto.style">
+<xsl:apply-templates select="." mode="preface.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="revision" mode="preface.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="preface.titlepage.recto.style">
+<xsl:apply-templates select="." mode="preface.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="revhistory" mode="preface.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="preface.titlepage.recto.style">
+<xsl:apply-templates select="." mode="preface.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="abstract" mode="preface.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="preface.titlepage.recto.style">
+<xsl:apply-templates select="." mode="preface.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template name="chapter.titlepage.recto">
+ <xsl:choose>
+ <xsl:when test="chapterinfo/title">
+ <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="chapterinfo/title"/>
+ </xsl:when>
+ <xsl:when test="docinfo/title">
+ <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="docinfo/title"/>
+ </xsl:when>
+ <xsl:when test="info/title">
+ <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="info/title"/>
+ </xsl:when>
+ <xsl:when test="title">
+ <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="title"/>
+ </xsl:when>
+ </xsl:choose>
+
+ <xsl:choose>
+ <xsl:when test="chapterinfo/subtitle">
+ <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="chapterinfo/subtitle"/>
+ </xsl:when>
+ <xsl:when test="docinfo/subtitle">
+ <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="docinfo/subtitle"/>
+ </xsl:when>
+ <xsl:when test="info/subtitle">
+ <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="info/subtitle"/>
+ </xsl:when>
+ <xsl:when test="subtitle">
+ <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="subtitle"/>
+ </xsl:when>
+ </xsl:choose>
+
+ <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="chapterinfo/corpauthor"/>
+ <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="docinfo/corpauthor"/>
+ <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="info/corpauthor"/>
+ <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="chapterinfo/authorgroup"/>
+ <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="docinfo/authorgroup"/>
+ <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="info/authorgroup"/>
+ <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="chapterinfo/author"/>
+ <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="docinfo/author"/>
+ <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="info/author"/>
+ <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="chapterinfo/othercredit"/>
+ <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="docinfo/othercredit"/>
+ <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="info/othercredit"/>
+ <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="chapterinfo/releaseinfo"/>
+ <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="docinfo/releaseinfo"/>
+ <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="info/releaseinfo"/>
+ <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="chapterinfo/copyright"/>
+ <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="docinfo/copyright"/>
+ <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="info/copyright"/>
+ <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="chapterinfo/legalnotice"/>
+ <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="docinfo/legalnotice"/>
+ <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="info/legalnotice"/>
+ <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="chapterinfo/pubdate"/>
+ <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="docinfo/pubdate"/>
+ <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="info/pubdate"/>
+ <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="chapterinfo/revision"/>
+ <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="docinfo/revision"/>
+ <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="info/revision"/>
+ <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="chapterinfo/revhistory"/>
+ <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="docinfo/revhistory"/>
+ <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="info/revhistory"/>
+ <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="chapterinfo/abstract"/>
+ <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="docinfo/abstract"/>
+ <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="info/abstract"/>
+</xsl:template>
+
+<xsl:template name="chapter.titlepage.verso">
+</xsl:template>
+
+<xsl:template name="chapter.titlepage.separator">
+</xsl:template>
+
+<xsl:template name="chapter.titlepage.before.recto">
+</xsl:template>
+
+<xsl:template name="chapter.titlepage.before.verso">
+</xsl:template>
+
+<xsl:template name="chapter.titlepage">
+ <div class="titlepage">
+ <xsl:variable name="recto.content">
+ <xsl:call-template name="chapter.titlepage.before.recto"/>
+ <xsl:call-template name="chapter.titlepage.recto"/>
+ </xsl:variable>
+ <xsl:variable name="recto.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($recto.content) != '') or ($recto.elements.count &gt; 0)">
+ <div><xsl:copy-of select="$recto.content"/></div>
+ </xsl:if>
+ <xsl:variable name="verso.content">
+ <xsl:call-template name="chapter.titlepage.before.verso"/>
+ <xsl:call-template name="chapter.titlepage.verso"/>
+ </xsl:variable>
+ <xsl:variable name="verso.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($verso.content) != '') or ($verso.elements.count &gt; 0)">
+ <div><xsl:copy-of select="$verso.content"/></div>
+ </xsl:if>
+ <xsl:call-template name="chapter.titlepage.separator"/>
+ </div>
+</xsl:template>
+
+<xsl:template match="*" mode="chapter.titlepage.recto.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="*" mode="chapter.titlepage.verso.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="title" mode="chapter.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="chapter.titlepage.recto.style">
+<xsl:apply-templates select="." mode="chapter.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="subtitle" mode="chapter.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="chapter.titlepage.recto.style">
+<xsl:apply-templates select="." mode="chapter.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="corpauthor" mode="chapter.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="chapter.titlepage.recto.style">
+<xsl:apply-templates select="." mode="chapter.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="authorgroup" mode="chapter.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="chapter.titlepage.recto.style">
+<xsl:apply-templates select="." mode="chapter.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="author" mode="chapter.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="chapter.titlepage.recto.style">
+<xsl:apply-templates select="." mode="chapter.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="othercredit" mode="chapter.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="chapter.titlepage.recto.style">
+<xsl:apply-templates select="." mode="chapter.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="releaseinfo" mode="chapter.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="chapter.titlepage.recto.style">
+<xsl:apply-templates select="." mode="chapter.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="copyright" mode="chapter.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="chapter.titlepage.recto.style">
+<xsl:apply-templates select="." mode="chapter.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="legalnotice" mode="chapter.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="chapter.titlepage.recto.style">
+<xsl:apply-templates select="." mode="chapter.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="pubdate" mode="chapter.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="chapter.titlepage.recto.style">
+<xsl:apply-templates select="." mode="chapter.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="revision" mode="chapter.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="chapter.titlepage.recto.style">
+<xsl:apply-templates select="." mode="chapter.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="revhistory" mode="chapter.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="chapter.titlepage.recto.style">
+<xsl:apply-templates select="." mode="chapter.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="abstract" mode="chapter.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="chapter.titlepage.recto.style">
+<xsl:apply-templates select="." mode="chapter.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template name="appendix.titlepage.recto">
+ <xsl:choose>
+ <xsl:when test="appendixinfo/title">
+ <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="appendixinfo/title"/>
+ </xsl:when>
+ <xsl:when test="docinfo/title">
+ <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="docinfo/title"/>
+ </xsl:when>
+ <xsl:when test="info/title">
+ <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="info/title"/>
+ </xsl:when>
+ <xsl:when test="title">
+ <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="title"/>
+ </xsl:when>
+ </xsl:choose>
+
+ <xsl:choose>
+ <xsl:when test="appendixinfo/subtitle">
+ <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="appendixinfo/subtitle"/>
+ </xsl:when>
+ <xsl:when test="docinfo/subtitle">
+ <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="docinfo/subtitle"/>
+ </xsl:when>
+ <xsl:when test="info/subtitle">
+ <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="info/subtitle"/>
+ </xsl:when>
+ <xsl:when test="subtitle">
+ <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="subtitle"/>
+ </xsl:when>
+ </xsl:choose>
+
+ <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="appendixinfo/corpauthor"/>
+ <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="docinfo/corpauthor"/>
+ <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="info/corpauthor"/>
+ <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="appendixinfo/authorgroup"/>
+ <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="docinfo/authorgroup"/>
+ <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="info/authorgroup"/>
+ <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="appendixinfo/author"/>
+ <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="docinfo/author"/>
+ <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="info/author"/>
+ <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="appendixinfo/othercredit"/>
+ <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="docinfo/othercredit"/>
+ <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="info/othercredit"/>
+ <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="appendixinfo/releaseinfo"/>
+ <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="docinfo/releaseinfo"/>
+ <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="info/releaseinfo"/>
+ <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="appendixinfo/copyright"/>
+ <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="docinfo/copyright"/>
+ <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="info/copyright"/>
+ <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="appendixinfo/legalnotice"/>
+ <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="docinfo/legalnotice"/>
+ <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="info/legalnotice"/>
+ <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="appendixinfo/pubdate"/>
+ <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="docinfo/pubdate"/>
+ <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="info/pubdate"/>
+ <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="appendixinfo/revision"/>
+ <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="docinfo/revision"/>
+ <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="info/revision"/>
+ <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="appendixinfo/revhistory"/>
+ <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="docinfo/revhistory"/>
+ <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="info/revhistory"/>
+ <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="appendixinfo/abstract"/>
+ <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="docinfo/abstract"/>
+ <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="info/abstract"/>
+</xsl:template>
+
+<xsl:template name="appendix.titlepage.verso">
+</xsl:template>
+
+<xsl:template name="appendix.titlepage.separator">
+</xsl:template>
+
+<xsl:template name="appendix.titlepage.before.recto">
+</xsl:template>
+
+<xsl:template name="appendix.titlepage.before.verso">
+</xsl:template>
+
+<xsl:template name="appendix.titlepage">
+ <div class="titlepage">
+ <xsl:variable name="recto.content">
+ <xsl:call-template name="appendix.titlepage.before.recto"/>
+ <xsl:call-template name="appendix.titlepage.recto"/>
+ </xsl:variable>
+ <xsl:variable name="recto.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($recto.content) != '') or ($recto.elements.count &gt; 0)">
+ <div><xsl:copy-of select="$recto.content"/></div>
+ </xsl:if>
+ <xsl:variable name="verso.content">
+ <xsl:call-template name="appendix.titlepage.before.verso"/>
+ <xsl:call-template name="appendix.titlepage.verso"/>
+ </xsl:variable>
+ <xsl:variable name="verso.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($verso.content) != '') or ($verso.elements.count &gt; 0)">
+ <div><xsl:copy-of select="$verso.content"/></div>
+ </xsl:if>
+ <xsl:call-template name="appendix.titlepage.separator"/>
+ </div>
+</xsl:template>
+
+<xsl:template match="*" mode="appendix.titlepage.recto.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="*" mode="appendix.titlepage.verso.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="title" mode="appendix.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="appendix.titlepage.recto.style">
+<xsl:apply-templates select="." mode="appendix.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="subtitle" mode="appendix.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="appendix.titlepage.recto.style">
+<xsl:apply-templates select="." mode="appendix.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="corpauthor" mode="appendix.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="appendix.titlepage.recto.style">
+<xsl:apply-templates select="." mode="appendix.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="authorgroup" mode="appendix.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="appendix.titlepage.recto.style">
+<xsl:apply-templates select="." mode="appendix.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="author" mode="appendix.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="appendix.titlepage.recto.style">
+<xsl:apply-templates select="." mode="appendix.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="othercredit" mode="appendix.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="appendix.titlepage.recto.style">
+<xsl:apply-templates select="." mode="appendix.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="releaseinfo" mode="appendix.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="appendix.titlepage.recto.style">
+<xsl:apply-templates select="." mode="appendix.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="copyright" mode="appendix.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="appendix.titlepage.recto.style">
+<xsl:apply-templates select="." mode="appendix.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="legalnotice" mode="appendix.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="appendix.titlepage.recto.style">
+<xsl:apply-templates select="." mode="appendix.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="pubdate" mode="appendix.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="appendix.titlepage.recto.style">
+<xsl:apply-templates select="." mode="appendix.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="revision" mode="appendix.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="appendix.titlepage.recto.style">
+<xsl:apply-templates select="." mode="appendix.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="revhistory" mode="appendix.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="appendix.titlepage.recto.style">
+<xsl:apply-templates select="." mode="appendix.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="abstract" mode="appendix.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="appendix.titlepage.recto.style">
+<xsl:apply-templates select="." mode="appendix.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template name="section.titlepage.recto">
+ <xsl:choose>
+ <xsl:when test="sectioninfo/title">
+ <xsl:apply-templates mode="section.titlepage.recto.auto.mode" select="sectioninfo/title"/>
+ </xsl:when>
+ <xsl:when test="info/title">
+ <xsl:apply-templates mode="section.titlepage.recto.auto.mode" select="info/title"/>
+ </xsl:when>
+ <xsl:when test="title">
+ <xsl:apply-templates mode="section.titlepage.recto.auto.mode" select="title"/>
+ </xsl:when>
+ </xsl:choose>
+
+ <xsl:choose>
+ <xsl:when test="sectioninfo/subtitle">
+ <xsl:apply-templates mode="section.titlepage.recto.auto.mode" select="sectioninfo/subtitle"/>
+ </xsl:when>
+ <xsl:when test="info/subtitle">
+ <xsl:apply-templates mode="section.titlepage.recto.auto.mode" select="info/subtitle"/>
+ </xsl:when>
+ <xsl:when test="subtitle">
+ <xsl:apply-templates mode="section.titlepage.recto.auto.mode" select="subtitle"/>
+ </xsl:when>
+ </xsl:choose>
+
+ <xsl:apply-templates mode="section.titlepage.recto.auto.mode" select="sectioninfo/corpauthor"/>
+ <xsl:apply-templates mode="section.titlepage.recto.auto.mode" select="info/corpauthor"/>
+ <xsl:apply-templates mode="section.titlepage.recto.auto.mode" select="sectioninfo/authorgroup"/>
+ <xsl:apply-templates mode="section.titlepage.recto.auto.mode" select="info/authorgroup"/>
+ <xsl:apply-templates mode="section.titlepage.recto.auto.mode" select="sectioninfo/author"/>
+ <xsl:apply-templates mode="section.titlepage.recto.auto.mode" select="info/author"/>
+ <xsl:apply-templates mode="section.titlepage.recto.auto.mode" select="sectioninfo/othercredit"/>
+ <xsl:apply-templates mode="section.titlepage.recto.auto.mode" select="info/othercredit"/>
+ <xsl:apply-templates mode="section.titlepage.recto.auto.mode" select="sectioninfo/releaseinfo"/>
+ <xsl:apply-templates mode="section.titlepage.recto.auto.mode" select="info/releaseinfo"/>
+ <xsl:apply-templates mode="section.titlepage.recto.auto.mode" select="sectioninfo/copyright"/>
+ <xsl:apply-templates mode="section.titlepage.recto.auto.mode" select="info/copyright"/>
+ <xsl:apply-templates mode="section.titlepage.recto.auto.mode" select="sectioninfo/legalnotice"/>
+ <xsl:apply-templates mode="section.titlepage.recto.auto.mode" select="info/legalnotice"/>
+ <xsl:apply-templates mode="section.titlepage.recto.auto.mode" select="sectioninfo/pubdate"/>
+ <xsl:apply-templates mode="section.titlepage.recto.auto.mode" select="info/pubdate"/>
+ <xsl:apply-templates mode="section.titlepage.recto.auto.mode" select="sectioninfo/revision"/>
+ <xsl:apply-templates mode="section.titlepage.recto.auto.mode" select="info/revision"/>
+ <xsl:apply-templates mode="section.titlepage.recto.auto.mode" select="sectioninfo/revhistory"/>
+ <xsl:apply-templates mode="section.titlepage.recto.auto.mode" select="info/revhistory"/>
+ <xsl:apply-templates mode="section.titlepage.recto.auto.mode" select="sectioninfo/abstract"/>
+ <xsl:apply-templates mode="section.titlepage.recto.auto.mode" select="info/abstract"/>
+</xsl:template>
+
+<xsl:template name="section.titlepage.verso">
+</xsl:template>
+
+<xsl:template name="section.titlepage.separator"><xsl:if test="count(parent::*)='0'"><hr/></xsl:if>
+</xsl:template>
+
+<xsl:template name="section.titlepage.before.recto">
+</xsl:template>
+
+<xsl:template name="section.titlepage.before.verso">
+</xsl:template>
+
+<xsl:template name="section.titlepage">
+ <div class="titlepage">
+ <xsl:variable name="recto.content">
+ <xsl:call-template name="section.titlepage.before.recto"/>
+ <xsl:call-template name="section.titlepage.recto"/>
+ </xsl:variable>
+ <xsl:variable name="recto.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($recto.content) != '') or ($recto.elements.count &gt; 0)">
+ <div><xsl:copy-of select="$recto.content"/></div>
+ </xsl:if>
+ <xsl:variable name="verso.content">
+ <xsl:call-template name="section.titlepage.before.verso"/>
+ <xsl:call-template name="section.titlepage.verso"/>
+ </xsl:variable>
+ <xsl:variable name="verso.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($verso.content) != '') or ($verso.elements.count &gt; 0)">
+ <div><xsl:copy-of select="$verso.content"/></div>
+ </xsl:if>
+ <xsl:call-template name="section.titlepage.separator"/>
+ </div>
+</xsl:template>
+
+<xsl:template match="*" mode="section.titlepage.recto.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="*" mode="section.titlepage.verso.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="title" mode="section.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="section.titlepage.recto.style">
+<xsl:apply-templates select="." mode="section.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="subtitle" mode="section.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="section.titlepage.recto.style">
+<xsl:apply-templates select="." mode="section.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="corpauthor" mode="section.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="section.titlepage.recto.style">
+<xsl:apply-templates select="." mode="section.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="authorgroup" mode="section.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="section.titlepage.recto.style">
+<xsl:apply-templates select="." mode="section.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="author" mode="section.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="section.titlepage.recto.style">
+<xsl:apply-templates select="." mode="section.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="othercredit" mode="section.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="section.titlepage.recto.style">
+<xsl:apply-templates select="." mode="section.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="releaseinfo" mode="section.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="section.titlepage.recto.style">
+<xsl:apply-templates select="." mode="section.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="copyright" mode="section.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="section.titlepage.recto.style">
+<xsl:apply-templates select="." mode="section.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="legalnotice" mode="section.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="section.titlepage.recto.style">
+<xsl:apply-templates select="." mode="section.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="pubdate" mode="section.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="section.titlepage.recto.style">
+<xsl:apply-templates select="." mode="section.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="revision" mode="section.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="section.titlepage.recto.style">
+<xsl:apply-templates select="." mode="section.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="revhistory" mode="section.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="section.titlepage.recto.style">
+<xsl:apply-templates select="." mode="section.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="abstract" mode="section.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="section.titlepage.recto.style">
+<xsl:apply-templates select="." mode="section.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template name="sect1.titlepage.recto">
+ <xsl:choose>
+ <xsl:when test="sect1info/title">
+ <xsl:apply-templates mode="sect1.titlepage.recto.auto.mode" select="sect1info/title"/>
+ </xsl:when>
+ <xsl:when test="info/title">
+ <xsl:apply-templates mode="sect1.titlepage.recto.auto.mode" select="info/title"/>
+ </xsl:when>
+ <xsl:when test="title">
+ <xsl:apply-templates mode="sect1.titlepage.recto.auto.mode" select="title"/>
+ </xsl:when>
+ </xsl:choose>
+
+ <xsl:choose>
+ <xsl:when test="sect1info/subtitle">
+ <xsl:apply-templates mode="sect1.titlepage.recto.auto.mode" select="sect1info/subtitle"/>
+ </xsl:when>
+ <xsl:when test="info/subtitle">
+ <xsl:apply-templates mode="sect1.titlepage.recto.auto.mode" select="info/subtitle"/>
+ </xsl:when>
+ <xsl:when test="subtitle">
+ <xsl:apply-templates mode="sect1.titlepage.recto.auto.mode" select="subtitle"/>
+ </xsl:when>
+ </xsl:choose>
+
+ <xsl:apply-templates mode="sect1.titlepage.recto.auto.mode" select="sect1info/corpauthor"/>
+ <xsl:apply-templates mode="sect1.titlepage.recto.auto.mode" select="info/corpauthor"/>
+ <xsl:apply-templates mode="sect1.titlepage.recto.auto.mode" select="sect1info/authorgroup"/>
+ <xsl:apply-templates mode="sect1.titlepage.recto.auto.mode" select="info/authorgroup"/>
+ <xsl:apply-templates mode="sect1.titlepage.recto.auto.mode" select="sect1info/author"/>
+ <xsl:apply-templates mode="sect1.titlepage.recto.auto.mode" select="info/author"/>
+ <xsl:apply-templates mode="sect1.titlepage.recto.auto.mode" select="sect1info/othercredit"/>
+ <xsl:apply-templates mode="sect1.titlepage.recto.auto.mode" select="info/othercredit"/>
+ <xsl:apply-templates mode="sect1.titlepage.recto.auto.mode" select="sect1info/releaseinfo"/>
+ <xsl:apply-templates mode="sect1.titlepage.recto.auto.mode" select="info/releaseinfo"/>
+ <xsl:apply-templates mode="sect1.titlepage.recto.auto.mode" select="sect1info/copyright"/>
+ <xsl:apply-templates mode="sect1.titlepage.recto.auto.mode" select="info/copyright"/>
+ <xsl:apply-templates mode="sect1.titlepage.recto.auto.mode" select="sect1info/legalnotice"/>
+ <xsl:apply-templates mode="sect1.titlepage.recto.auto.mode" select="info/legalnotice"/>
+ <xsl:apply-templates mode="sect1.titlepage.recto.auto.mode" select="sect1info/pubdate"/>
+ <xsl:apply-templates mode="sect1.titlepage.recto.auto.mode" select="info/pubdate"/>
+ <xsl:apply-templates mode="sect1.titlepage.recto.auto.mode" select="sect1info/revision"/>
+ <xsl:apply-templates mode="sect1.titlepage.recto.auto.mode" select="info/revision"/>
+ <xsl:apply-templates mode="sect1.titlepage.recto.auto.mode" select="sect1info/revhistory"/>
+ <xsl:apply-templates mode="sect1.titlepage.recto.auto.mode" select="info/revhistory"/>
+ <xsl:apply-templates mode="sect1.titlepage.recto.auto.mode" select="sect1info/abstract"/>
+ <xsl:apply-templates mode="sect1.titlepage.recto.auto.mode" select="info/abstract"/>
+</xsl:template>
+
+<xsl:template name="sect1.titlepage.verso">
+</xsl:template>
+
+<xsl:template name="sect1.titlepage.separator"><xsl:if test="count(parent::*)='0'"><hr/></xsl:if>
+</xsl:template>
+
+<xsl:template name="sect1.titlepage.before.recto">
+</xsl:template>
+
+<xsl:template name="sect1.titlepage.before.verso">
+</xsl:template>
+
+<xsl:template name="sect1.titlepage">
+ <div class="titlepage">
+ <xsl:variable name="recto.content">
+ <xsl:call-template name="sect1.titlepage.before.recto"/>
+ <xsl:call-template name="sect1.titlepage.recto"/>
+ </xsl:variable>
+ <xsl:variable name="recto.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($recto.content) != '') or ($recto.elements.count &gt; 0)">
+ <div><xsl:copy-of select="$recto.content"/></div>
+ </xsl:if>
+ <xsl:variable name="verso.content">
+ <xsl:call-template name="sect1.titlepage.before.verso"/>
+ <xsl:call-template name="sect1.titlepage.verso"/>
+ </xsl:variable>
+ <xsl:variable name="verso.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($verso.content) != '') or ($verso.elements.count &gt; 0)">
+ <div><xsl:copy-of select="$verso.content"/></div>
+ </xsl:if>
+ <xsl:call-template name="sect1.titlepage.separator"/>
+ </div>
+</xsl:template>
+
+<xsl:template match="*" mode="sect1.titlepage.recto.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="*" mode="sect1.titlepage.verso.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="title" mode="sect1.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect1.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect1.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="subtitle" mode="sect1.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect1.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect1.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="corpauthor" mode="sect1.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect1.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect1.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="authorgroup" mode="sect1.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect1.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect1.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="author" mode="sect1.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect1.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect1.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="othercredit" mode="sect1.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect1.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect1.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="releaseinfo" mode="sect1.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect1.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect1.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="copyright" mode="sect1.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect1.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect1.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="legalnotice" mode="sect1.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect1.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect1.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="pubdate" mode="sect1.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect1.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect1.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="revision" mode="sect1.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect1.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect1.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="revhistory" mode="sect1.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect1.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect1.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="abstract" mode="sect1.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect1.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect1.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template name="sect2.titlepage.recto">
+ <xsl:choose>
+ <xsl:when test="sect2info/title">
+ <xsl:apply-templates mode="sect2.titlepage.recto.auto.mode" select="sect2info/title"/>
+ </xsl:when>
+ <xsl:when test="info/title">
+ <xsl:apply-templates mode="sect2.titlepage.recto.auto.mode" select="info/title"/>
+ </xsl:when>
+ <xsl:when test="title">
+ <xsl:apply-templates mode="sect2.titlepage.recto.auto.mode" select="title"/>
+ </xsl:when>
+ </xsl:choose>
+
+ <xsl:choose>
+ <xsl:when test="sect2info/subtitle">
+ <xsl:apply-templates mode="sect2.titlepage.recto.auto.mode" select="sect2info/subtitle"/>
+ </xsl:when>
+ <xsl:when test="info/subtitle">
+ <xsl:apply-templates mode="sect2.titlepage.recto.auto.mode" select="info/subtitle"/>
+ </xsl:when>
+ <xsl:when test="subtitle">
+ <xsl:apply-templates mode="sect2.titlepage.recto.auto.mode" select="subtitle"/>
+ </xsl:when>
+ </xsl:choose>
+
+ <xsl:apply-templates mode="sect2.titlepage.recto.auto.mode" select="sect2info/corpauthor"/>
+ <xsl:apply-templates mode="sect2.titlepage.recto.auto.mode" select="info/corpauthor"/>
+ <xsl:apply-templates mode="sect2.titlepage.recto.auto.mode" select="sect2info/authorgroup"/>
+ <xsl:apply-templates mode="sect2.titlepage.recto.auto.mode" select="info/authorgroup"/>
+ <xsl:apply-templates mode="sect2.titlepage.recto.auto.mode" select="sect2info/author"/>
+ <xsl:apply-templates mode="sect2.titlepage.recto.auto.mode" select="info/author"/>
+ <xsl:apply-templates mode="sect2.titlepage.recto.auto.mode" select="sect2info/othercredit"/>
+ <xsl:apply-templates mode="sect2.titlepage.recto.auto.mode" select="info/othercredit"/>
+ <xsl:apply-templates mode="sect2.titlepage.recto.auto.mode" select="sect2info/releaseinfo"/>
+ <xsl:apply-templates mode="sect2.titlepage.recto.auto.mode" select="info/releaseinfo"/>
+ <xsl:apply-templates mode="sect2.titlepage.recto.auto.mode" select="sect2info/copyright"/>
+ <xsl:apply-templates mode="sect2.titlepage.recto.auto.mode" select="info/copyright"/>
+ <xsl:apply-templates mode="sect2.titlepage.recto.auto.mode" select="sect2info/legalnotice"/>
+ <xsl:apply-templates mode="sect2.titlepage.recto.auto.mode" select="info/legalnotice"/>
+ <xsl:apply-templates mode="sect2.titlepage.recto.auto.mode" select="sect2info/pubdate"/>
+ <xsl:apply-templates mode="sect2.titlepage.recto.auto.mode" select="info/pubdate"/>
+ <xsl:apply-templates mode="sect2.titlepage.recto.auto.mode" select="sect2info/revision"/>
+ <xsl:apply-templates mode="sect2.titlepage.recto.auto.mode" select="info/revision"/>
+ <xsl:apply-templates mode="sect2.titlepage.recto.auto.mode" select="sect2info/revhistory"/>
+ <xsl:apply-templates mode="sect2.titlepage.recto.auto.mode" select="info/revhistory"/>
+ <xsl:apply-templates mode="sect2.titlepage.recto.auto.mode" select="sect2info/abstract"/>
+ <xsl:apply-templates mode="sect2.titlepage.recto.auto.mode" select="info/abstract"/>
+</xsl:template>
+
+<xsl:template name="sect2.titlepage.verso">
+</xsl:template>
+
+<xsl:template name="sect2.titlepage.separator"><xsl:if test="count(parent::*)='0'"><hr/></xsl:if>
+</xsl:template>
+
+<xsl:template name="sect2.titlepage.before.recto">
+</xsl:template>
+
+<xsl:template name="sect2.titlepage.before.verso">
+</xsl:template>
+
+<xsl:template name="sect2.titlepage">
+ <div class="titlepage">
+ <xsl:variable name="recto.content">
+ <xsl:call-template name="sect2.titlepage.before.recto"/>
+ <xsl:call-template name="sect2.titlepage.recto"/>
+ </xsl:variable>
+ <xsl:variable name="recto.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($recto.content) != '') or ($recto.elements.count &gt; 0)">
+ <div><xsl:copy-of select="$recto.content"/></div>
+ </xsl:if>
+ <xsl:variable name="verso.content">
+ <xsl:call-template name="sect2.titlepage.before.verso"/>
+ <xsl:call-template name="sect2.titlepage.verso"/>
+ </xsl:variable>
+ <xsl:variable name="verso.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($verso.content) != '') or ($verso.elements.count &gt; 0)">
+ <div><xsl:copy-of select="$verso.content"/></div>
+ </xsl:if>
+ <xsl:call-template name="sect2.titlepage.separator"/>
+ </div>
+</xsl:template>
+
+<xsl:template match="*" mode="sect2.titlepage.recto.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="*" mode="sect2.titlepage.verso.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="title" mode="sect2.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect2.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect2.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="subtitle" mode="sect2.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect2.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect2.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="corpauthor" mode="sect2.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect2.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect2.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="authorgroup" mode="sect2.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect2.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect2.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="author" mode="sect2.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect2.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect2.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="othercredit" mode="sect2.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect2.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect2.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="releaseinfo" mode="sect2.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect2.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect2.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="copyright" mode="sect2.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect2.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect2.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="legalnotice" mode="sect2.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect2.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect2.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="pubdate" mode="sect2.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect2.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect2.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="revision" mode="sect2.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect2.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect2.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="revhistory" mode="sect2.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect2.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect2.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="abstract" mode="sect2.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect2.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect2.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template name="sect3.titlepage.recto">
+ <xsl:choose>
+ <xsl:when test="sect3info/title">
+ <xsl:apply-templates mode="sect3.titlepage.recto.auto.mode" select="sect3info/title"/>
+ </xsl:when>
+ <xsl:when test="info/title">
+ <xsl:apply-templates mode="sect3.titlepage.recto.auto.mode" select="info/title"/>
+ </xsl:when>
+ <xsl:when test="title">
+ <xsl:apply-templates mode="sect3.titlepage.recto.auto.mode" select="title"/>
+ </xsl:when>
+ </xsl:choose>
+
+ <xsl:choose>
+ <xsl:when test="sect3info/subtitle">
+ <xsl:apply-templates mode="sect3.titlepage.recto.auto.mode" select="sect3info/subtitle"/>
+ </xsl:when>
+ <xsl:when test="info/subtitle">
+ <xsl:apply-templates mode="sect3.titlepage.recto.auto.mode" select="info/subtitle"/>
+ </xsl:when>
+ <xsl:when test="subtitle">
+ <xsl:apply-templates mode="sect3.titlepage.recto.auto.mode" select="subtitle"/>
+ </xsl:when>
+ </xsl:choose>
+
+ <xsl:apply-templates mode="sect3.titlepage.recto.auto.mode" select="sect3info/corpauthor"/>
+ <xsl:apply-templates mode="sect3.titlepage.recto.auto.mode" select="info/corpauthor"/>
+ <xsl:apply-templates mode="sect3.titlepage.recto.auto.mode" select="sect3info/authorgroup"/>
+ <xsl:apply-templates mode="sect3.titlepage.recto.auto.mode" select="info/authorgroup"/>
+ <xsl:apply-templates mode="sect3.titlepage.recto.auto.mode" select="sect3info/author"/>
+ <xsl:apply-templates mode="sect3.titlepage.recto.auto.mode" select="info/author"/>
+ <xsl:apply-templates mode="sect3.titlepage.recto.auto.mode" select="sect3info/othercredit"/>
+ <xsl:apply-templates mode="sect3.titlepage.recto.auto.mode" select="info/othercredit"/>
+ <xsl:apply-templates mode="sect3.titlepage.recto.auto.mode" select="sect3info/releaseinfo"/>
+ <xsl:apply-templates mode="sect3.titlepage.recto.auto.mode" select="info/releaseinfo"/>
+ <xsl:apply-templates mode="sect3.titlepage.recto.auto.mode" select="sect3info/copyright"/>
+ <xsl:apply-templates mode="sect3.titlepage.recto.auto.mode" select="info/copyright"/>
+ <xsl:apply-templates mode="sect3.titlepage.recto.auto.mode" select="sect3info/legalnotice"/>
+ <xsl:apply-templates mode="sect3.titlepage.recto.auto.mode" select="info/legalnotice"/>
+ <xsl:apply-templates mode="sect3.titlepage.recto.auto.mode" select="sect3info/pubdate"/>
+ <xsl:apply-templates mode="sect3.titlepage.recto.auto.mode" select="info/pubdate"/>
+ <xsl:apply-templates mode="sect3.titlepage.recto.auto.mode" select="sect3info/revision"/>
+ <xsl:apply-templates mode="sect3.titlepage.recto.auto.mode" select="info/revision"/>
+ <xsl:apply-templates mode="sect3.titlepage.recto.auto.mode" select="sect3info/revhistory"/>
+ <xsl:apply-templates mode="sect3.titlepage.recto.auto.mode" select="info/revhistory"/>
+ <xsl:apply-templates mode="sect3.titlepage.recto.auto.mode" select="sect3info/abstract"/>
+ <xsl:apply-templates mode="sect3.titlepage.recto.auto.mode" select="info/abstract"/>
+</xsl:template>
+
+<xsl:template name="sect3.titlepage.verso">
+</xsl:template>
+
+<xsl:template name="sect3.titlepage.separator"><xsl:if test="count(parent::*)='0'"><hr/></xsl:if>
+</xsl:template>
+
+<xsl:template name="sect3.titlepage.before.recto">
+</xsl:template>
+
+<xsl:template name="sect3.titlepage.before.verso">
+</xsl:template>
+
+<xsl:template name="sect3.titlepage">
+ <div class="titlepage">
+ <xsl:variable name="recto.content">
+ <xsl:call-template name="sect3.titlepage.before.recto"/>
+ <xsl:call-template name="sect3.titlepage.recto"/>
+ </xsl:variable>
+ <xsl:variable name="recto.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($recto.content) != '') or ($recto.elements.count &gt; 0)">
+ <div><xsl:copy-of select="$recto.content"/></div>
+ </xsl:if>
+ <xsl:variable name="verso.content">
+ <xsl:call-template name="sect3.titlepage.before.verso"/>
+ <xsl:call-template name="sect3.titlepage.verso"/>
+ </xsl:variable>
+ <xsl:variable name="verso.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($verso.content) != '') or ($verso.elements.count &gt; 0)">
+ <div><xsl:copy-of select="$verso.content"/></div>
+ </xsl:if>
+ <xsl:call-template name="sect3.titlepage.separator"/>
+ </div>
+</xsl:template>
+
+<xsl:template match="*" mode="sect3.titlepage.recto.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="*" mode="sect3.titlepage.verso.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="title" mode="sect3.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect3.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect3.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="subtitle" mode="sect3.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect3.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect3.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="corpauthor" mode="sect3.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect3.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect3.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="authorgroup" mode="sect3.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect3.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect3.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="author" mode="sect3.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect3.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect3.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="othercredit" mode="sect3.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect3.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect3.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="releaseinfo" mode="sect3.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect3.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect3.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="copyright" mode="sect3.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect3.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect3.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="legalnotice" mode="sect3.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect3.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect3.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="pubdate" mode="sect3.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect3.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect3.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="revision" mode="sect3.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect3.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect3.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="revhistory" mode="sect3.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect3.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect3.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="abstract" mode="sect3.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect3.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect3.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template name="sect4.titlepage.recto">
+ <xsl:choose>
+ <xsl:when test="sect4info/title">
+ <xsl:apply-templates mode="sect4.titlepage.recto.auto.mode" select="sect4info/title"/>
+ </xsl:when>
+ <xsl:when test="info/title">
+ <xsl:apply-templates mode="sect4.titlepage.recto.auto.mode" select="info/title"/>
+ </xsl:when>
+ <xsl:when test="title">
+ <xsl:apply-templates mode="sect4.titlepage.recto.auto.mode" select="title"/>
+ </xsl:when>
+ </xsl:choose>
+
+ <xsl:choose>
+ <xsl:when test="sect4info/subtitle">
+ <xsl:apply-templates mode="sect4.titlepage.recto.auto.mode" select="sect4info/subtitle"/>
+ </xsl:when>
+ <xsl:when test="info/subtitle">
+ <xsl:apply-templates mode="sect4.titlepage.recto.auto.mode" select="info/subtitle"/>
+ </xsl:when>
+ <xsl:when test="subtitle">
+ <xsl:apply-templates mode="sect4.titlepage.recto.auto.mode" select="subtitle"/>
+ </xsl:when>
+ </xsl:choose>
+
+ <xsl:apply-templates mode="sect4.titlepage.recto.auto.mode" select="sect4info/corpauthor"/>
+ <xsl:apply-templates mode="sect4.titlepage.recto.auto.mode" select="info/corpauthor"/>
+ <xsl:apply-templates mode="sect4.titlepage.recto.auto.mode" select="sect4info/authorgroup"/>
+ <xsl:apply-templates mode="sect4.titlepage.recto.auto.mode" select="info/authorgroup"/>
+ <xsl:apply-templates mode="sect4.titlepage.recto.auto.mode" select="sect4info/author"/>
+ <xsl:apply-templates mode="sect4.titlepage.recto.auto.mode" select="info/author"/>
+ <xsl:apply-templates mode="sect4.titlepage.recto.auto.mode" select="sect4info/othercredit"/>
+ <xsl:apply-templates mode="sect4.titlepage.recto.auto.mode" select="info/othercredit"/>
+ <xsl:apply-templates mode="sect4.titlepage.recto.auto.mode" select="sect4info/releaseinfo"/>
+ <xsl:apply-templates mode="sect4.titlepage.recto.auto.mode" select="info/releaseinfo"/>
+ <xsl:apply-templates mode="sect4.titlepage.recto.auto.mode" select="sect4info/copyright"/>
+ <xsl:apply-templates mode="sect4.titlepage.recto.auto.mode" select="info/copyright"/>
+ <xsl:apply-templates mode="sect4.titlepage.recto.auto.mode" select="sect4info/legalnotice"/>
+ <xsl:apply-templates mode="sect4.titlepage.recto.auto.mode" select="info/legalnotice"/>
+ <xsl:apply-templates mode="sect4.titlepage.recto.auto.mode" select="sect4info/pubdate"/>
+ <xsl:apply-templates mode="sect4.titlepage.recto.auto.mode" select="info/pubdate"/>
+ <xsl:apply-templates mode="sect4.titlepage.recto.auto.mode" select="sect4info/revision"/>
+ <xsl:apply-templates mode="sect4.titlepage.recto.auto.mode" select="info/revision"/>
+ <xsl:apply-templates mode="sect4.titlepage.recto.auto.mode" select="sect4info/revhistory"/>
+ <xsl:apply-templates mode="sect4.titlepage.recto.auto.mode" select="info/revhistory"/>
+ <xsl:apply-templates mode="sect4.titlepage.recto.auto.mode" select="sect4info/abstract"/>
+ <xsl:apply-templates mode="sect4.titlepage.recto.auto.mode" select="info/abstract"/>
+</xsl:template>
+
+<xsl:template name="sect4.titlepage.verso">
+</xsl:template>
+
+<xsl:template name="sect4.titlepage.separator"><xsl:if test="count(parent::*)='0'"><hr/></xsl:if>
+</xsl:template>
+
+<xsl:template name="sect4.titlepage.before.recto">
+</xsl:template>
+
+<xsl:template name="sect4.titlepage.before.verso">
+</xsl:template>
+
+<xsl:template name="sect4.titlepage">
+ <div class="titlepage">
+ <xsl:variable name="recto.content">
+ <xsl:call-template name="sect4.titlepage.before.recto"/>
+ <xsl:call-template name="sect4.titlepage.recto"/>
+ </xsl:variable>
+ <xsl:variable name="recto.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($recto.content) != '') or ($recto.elements.count &gt; 0)">
+ <div><xsl:copy-of select="$recto.content"/></div>
+ </xsl:if>
+ <xsl:variable name="verso.content">
+ <xsl:call-template name="sect4.titlepage.before.verso"/>
+ <xsl:call-template name="sect4.titlepage.verso"/>
+ </xsl:variable>
+ <xsl:variable name="verso.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($verso.content) != '') or ($verso.elements.count &gt; 0)">
+ <div><xsl:copy-of select="$verso.content"/></div>
+ </xsl:if>
+ <xsl:call-template name="sect4.titlepage.separator"/>
+ </div>
+</xsl:template>
+
+<xsl:template match="*" mode="sect4.titlepage.recto.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="*" mode="sect4.titlepage.verso.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="title" mode="sect4.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect4.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect4.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="subtitle" mode="sect4.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect4.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect4.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="corpauthor" mode="sect4.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect4.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect4.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="authorgroup" mode="sect4.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect4.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect4.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="author" mode="sect4.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect4.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect4.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="othercredit" mode="sect4.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect4.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect4.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="releaseinfo" mode="sect4.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect4.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect4.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="copyright" mode="sect4.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect4.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect4.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="legalnotice" mode="sect4.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect4.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect4.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="pubdate" mode="sect4.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect4.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect4.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="revision" mode="sect4.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect4.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect4.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="revhistory" mode="sect4.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect4.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect4.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="abstract" mode="sect4.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect4.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect4.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template name="sect5.titlepage.recto">
+ <xsl:choose>
+ <xsl:when test="sect5info/title">
+ <xsl:apply-templates mode="sect5.titlepage.recto.auto.mode" select="sect5info/title"/>
+ </xsl:when>
+ <xsl:when test="info/title">
+ <xsl:apply-templates mode="sect5.titlepage.recto.auto.mode" select="info/title"/>
+ </xsl:when>
+ <xsl:when test="title">
+ <xsl:apply-templates mode="sect5.titlepage.recto.auto.mode" select="title"/>
+ </xsl:when>
+ </xsl:choose>
+
+ <xsl:choose>
+ <xsl:when test="sect5info/subtitle">
+ <xsl:apply-templates mode="sect5.titlepage.recto.auto.mode" select="sect5info/subtitle"/>
+ </xsl:when>
+ <xsl:when test="info/subtitle">
+ <xsl:apply-templates mode="sect5.titlepage.recto.auto.mode" select="info/subtitle"/>
+ </xsl:when>
+ <xsl:when test="subtitle">
+ <xsl:apply-templates mode="sect5.titlepage.recto.auto.mode" select="subtitle"/>
+ </xsl:when>
+ </xsl:choose>
+
+ <xsl:apply-templates mode="sect5.titlepage.recto.auto.mode" select="sect5info/corpauthor"/>
+ <xsl:apply-templates mode="sect5.titlepage.recto.auto.mode" select="info/corpauthor"/>
+ <xsl:apply-templates mode="sect5.titlepage.recto.auto.mode" select="sect5info/authorgroup"/>
+ <xsl:apply-templates mode="sect5.titlepage.recto.auto.mode" select="info/authorgroup"/>
+ <xsl:apply-templates mode="sect5.titlepage.recto.auto.mode" select="sect5info/author"/>
+ <xsl:apply-templates mode="sect5.titlepage.recto.auto.mode" select="info/author"/>
+ <xsl:apply-templates mode="sect5.titlepage.recto.auto.mode" select="sect5info/othercredit"/>
+ <xsl:apply-templates mode="sect5.titlepage.recto.auto.mode" select="info/othercredit"/>
+ <xsl:apply-templates mode="sect5.titlepage.recto.auto.mode" select="sect5info/releaseinfo"/>
+ <xsl:apply-templates mode="sect5.titlepage.recto.auto.mode" select="info/releaseinfo"/>
+ <xsl:apply-templates mode="sect5.titlepage.recto.auto.mode" select="sect5info/copyright"/>
+ <xsl:apply-templates mode="sect5.titlepage.recto.auto.mode" select="info/copyright"/>
+ <xsl:apply-templates mode="sect5.titlepage.recto.auto.mode" select="sect5info/legalnotice"/>
+ <xsl:apply-templates mode="sect5.titlepage.recto.auto.mode" select="info/legalnotice"/>
+ <xsl:apply-templates mode="sect5.titlepage.recto.auto.mode" select="sect5info/pubdate"/>
+ <xsl:apply-templates mode="sect5.titlepage.recto.auto.mode" select="info/pubdate"/>
+ <xsl:apply-templates mode="sect5.titlepage.recto.auto.mode" select="sect5info/revision"/>
+ <xsl:apply-templates mode="sect5.titlepage.recto.auto.mode" select="info/revision"/>
+ <xsl:apply-templates mode="sect5.titlepage.recto.auto.mode" select="sect5info/revhistory"/>
+ <xsl:apply-templates mode="sect5.titlepage.recto.auto.mode" select="info/revhistory"/>
+ <xsl:apply-templates mode="sect5.titlepage.recto.auto.mode" select="sect5info/abstract"/>
+ <xsl:apply-templates mode="sect5.titlepage.recto.auto.mode" select="info/abstract"/>
+</xsl:template>
+
+<xsl:template name="sect5.titlepage.verso">
+</xsl:template>
+
+<xsl:template name="sect5.titlepage.separator"><xsl:if test="count(parent::*)='0'"><hr/></xsl:if>
+</xsl:template>
+
+<xsl:template name="sect5.titlepage.before.recto">
+</xsl:template>
+
+<xsl:template name="sect5.titlepage.before.verso">
+</xsl:template>
+
+<xsl:template name="sect5.titlepage">
+ <div class="titlepage">
+ <xsl:variable name="recto.content">
+ <xsl:call-template name="sect5.titlepage.before.recto"/>
+ <xsl:call-template name="sect5.titlepage.recto"/>
+ </xsl:variable>
+ <xsl:variable name="recto.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($recto.content) != '') or ($recto.elements.count &gt; 0)">
+ <div><xsl:copy-of select="$recto.content"/></div>
+ </xsl:if>
+ <xsl:variable name="verso.content">
+ <xsl:call-template name="sect5.titlepage.before.verso"/>
+ <xsl:call-template name="sect5.titlepage.verso"/>
+ </xsl:variable>
+ <xsl:variable name="verso.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($verso.content) != '') or ($verso.elements.count &gt; 0)">
+ <div><xsl:copy-of select="$verso.content"/></div>
+ </xsl:if>
+ <xsl:call-template name="sect5.titlepage.separator"/>
+ </div>
+</xsl:template>
+
+<xsl:template match="*" mode="sect5.titlepage.recto.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="*" mode="sect5.titlepage.verso.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="title" mode="sect5.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect5.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect5.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="subtitle" mode="sect5.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect5.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect5.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="corpauthor" mode="sect5.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect5.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect5.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="authorgroup" mode="sect5.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect5.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect5.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="author" mode="sect5.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect5.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect5.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="othercredit" mode="sect5.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect5.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect5.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="releaseinfo" mode="sect5.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect5.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect5.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="copyright" mode="sect5.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect5.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect5.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="legalnotice" mode="sect5.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect5.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect5.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="pubdate" mode="sect5.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect5.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect5.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="revision" mode="sect5.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect5.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect5.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="revhistory" mode="sect5.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect5.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect5.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="abstract" mode="sect5.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect5.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect5.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template name="simplesect.titlepage.recto">
+ <xsl:choose>
+ <xsl:when test="simplesectinfo/title">
+ <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="simplesectinfo/title"/>
+ </xsl:when>
+ <xsl:when test="docinfo/title">
+ <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="docinfo/title"/>
+ </xsl:when>
+ <xsl:when test="info/title">
+ <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="info/title"/>
+ </xsl:when>
+ <xsl:when test="title">
+ <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="title"/>
+ </xsl:when>
+ </xsl:choose>
+
+ <xsl:choose>
+ <xsl:when test="simplesectinfo/subtitle">
+ <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="simplesectinfo/subtitle"/>
+ </xsl:when>
+ <xsl:when test="docinfo/subtitle">
+ <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="docinfo/subtitle"/>
+ </xsl:when>
+ <xsl:when test="info/subtitle">
+ <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="info/subtitle"/>
+ </xsl:when>
+ <xsl:when test="subtitle">
+ <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="subtitle"/>
+ </xsl:when>
+ </xsl:choose>
+
+ <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="simplesectinfo/corpauthor"/>
+ <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="docinfo/corpauthor"/>
+ <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="info/corpauthor"/>
+ <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="simplesectinfo/authorgroup"/>
+ <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="docinfo/authorgroup"/>
+ <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="info/authorgroup"/>
+ <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="simplesectinfo/author"/>
+ <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="docinfo/author"/>
+ <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="info/author"/>
+ <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="simplesectinfo/othercredit"/>
+ <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="docinfo/othercredit"/>
+ <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="info/othercredit"/>
+ <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="simplesectinfo/releaseinfo"/>
+ <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="docinfo/releaseinfo"/>
+ <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="info/releaseinfo"/>
+ <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="simplesectinfo/copyright"/>
+ <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="docinfo/copyright"/>
+ <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="info/copyright"/>
+ <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="simplesectinfo/legalnotice"/>
+ <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="docinfo/legalnotice"/>
+ <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="info/legalnotice"/>
+ <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="simplesectinfo/pubdate"/>
+ <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="docinfo/pubdate"/>
+ <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="info/pubdate"/>
+ <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="simplesectinfo/revision"/>
+ <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="docinfo/revision"/>
+ <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="info/revision"/>
+ <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="simplesectinfo/revhistory"/>
+ <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="docinfo/revhistory"/>
+ <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="info/revhistory"/>
+ <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="simplesectinfo/abstract"/>
+ <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="docinfo/abstract"/>
+ <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="info/abstract"/>
+</xsl:template>
+
+<xsl:template name="simplesect.titlepage.verso">
+</xsl:template>
+
+<xsl:template name="simplesect.titlepage.separator"><xsl:if test="count(parent::*)='0'"><hr/></xsl:if>
+</xsl:template>
+
+<xsl:template name="simplesect.titlepage.before.recto">
+</xsl:template>
+
+<xsl:template name="simplesect.titlepage.before.verso">
+</xsl:template>
+
+<xsl:template name="simplesect.titlepage">
+ <div class="titlepage">
+ <xsl:variable name="recto.content">
+ <xsl:call-template name="simplesect.titlepage.before.recto"/>
+ <xsl:call-template name="simplesect.titlepage.recto"/>
+ </xsl:variable>
+ <xsl:variable name="recto.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($recto.content) != '') or ($recto.elements.count &gt; 0)">
+ <div><xsl:copy-of select="$recto.content"/></div>
+ </xsl:if>
+ <xsl:variable name="verso.content">
+ <xsl:call-template name="simplesect.titlepage.before.verso"/>
+ <xsl:call-template name="simplesect.titlepage.verso"/>
+ </xsl:variable>
+ <xsl:variable name="verso.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($verso.content) != '') or ($verso.elements.count &gt; 0)">
+ <div><xsl:copy-of select="$verso.content"/></div>
+ </xsl:if>
+ <xsl:call-template name="simplesect.titlepage.separator"/>
+ </div>
+</xsl:template>
+
+<xsl:template match="*" mode="simplesect.titlepage.recto.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="*" mode="simplesect.titlepage.verso.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="title" mode="simplesect.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="simplesect.titlepage.recto.style">
+<xsl:apply-templates select="." mode="simplesect.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="subtitle" mode="simplesect.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="simplesect.titlepage.recto.style">
+<xsl:apply-templates select="." mode="simplesect.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="corpauthor" mode="simplesect.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="simplesect.titlepage.recto.style">
+<xsl:apply-templates select="." mode="simplesect.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="authorgroup" mode="simplesect.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="simplesect.titlepage.recto.style">
+<xsl:apply-templates select="." mode="simplesect.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="author" mode="simplesect.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="simplesect.titlepage.recto.style">
+<xsl:apply-templates select="." mode="simplesect.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="othercredit" mode="simplesect.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="simplesect.titlepage.recto.style">
+<xsl:apply-templates select="." mode="simplesect.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="releaseinfo" mode="simplesect.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="simplesect.titlepage.recto.style">
+<xsl:apply-templates select="." mode="simplesect.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="copyright" mode="simplesect.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="simplesect.titlepage.recto.style">
+<xsl:apply-templates select="." mode="simplesect.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="legalnotice" mode="simplesect.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="simplesect.titlepage.recto.style">
+<xsl:apply-templates select="." mode="simplesect.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="pubdate" mode="simplesect.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="simplesect.titlepage.recto.style">
+<xsl:apply-templates select="." mode="simplesect.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="revision" mode="simplesect.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="simplesect.titlepage.recto.style">
+<xsl:apply-templates select="." mode="simplesect.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="revhistory" mode="simplesect.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="simplesect.titlepage.recto.style">
+<xsl:apply-templates select="." mode="simplesect.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="abstract" mode="simplesect.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="simplesect.titlepage.recto.style">
+<xsl:apply-templates select="." mode="simplesect.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template name="bibliography.titlepage.recto">
+ <div xsl:use-attribute-sets="bibliography.titlepage.recto.style">
+<xsl:call-template name="component.title">
+<xsl:with-param name="node" select="ancestor-or-self::bibliography[1]"/>
+</xsl:call-template></div>
+ <xsl:choose>
+ <xsl:when test="bibliographyinfo/subtitle">
+ <xsl:apply-templates mode="bibliography.titlepage.recto.auto.mode" select="bibliographyinfo/subtitle"/>
+ </xsl:when>
+ <xsl:when test="docinfo/subtitle">
+ <xsl:apply-templates mode="bibliography.titlepage.recto.auto.mode" select="docinfo/subtitle"/>
+ </xsl:when>
+ <xsl:when test="info/subtitle">
+ <xsl:apply-templates mode="bibliography.titlepage.recto.auto.mode" select="info/subtitle"/>
+ </xsl:when>
+ <xsl:when test="subtitle">
+ <xsl:apply-templates mode="bibliography.titlepage.recto.auto.mode" select="subtitle"/>
+ </xsl:when>
+ </xsl:choose>
+
+</xsl:template>
+
+<xsl:template name="bibliography.titlepage.verso">
+</xsl:template>
+
+<xsl:template name="bibliography.titlepage.separator">
+</xsl:template>
+
+<xsl:template name="bibliography.titlepage.before.recto">
+</xsl:template>
+
+<xsl:template name="bibliography.titlepage.before.verso">
+</xsl:template>
+
+<xsl:template name="bibliography.titlepage">
+ <div class="titlepage">
+ <xsl:variable name="recto.content">
+ <xsl:call-template name="bibliography.titlepage.before.recto"/>
+ <xsl:call-template name="bibliography.titlepage.recto"/>
+ </xsl:variable>
+ <xsl:variable name="recto.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($recto.content) != '') or ($recto.elements.count &gt; 0)">
+ <div><xsl:copy-of select="$recto.content"/></div>
+ </xsl:if>
+ <xsl:variable name="verso.content">
+ <xsl:call-template name="bibliography.titlepage.before.verso"/>
+ <xsl:call-template name="bibliography.titlepage.verso"/>
+ </xsl:variable>
+ <xsl:variable name="verso.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($verso.content) != '') or ($verso.elements.count &gt; 0)">
+ <div><xsl:copy-of select="$verso.content"/></div>
+ </xsl:if>
+ <xsl:call-template name="bibliography.titlepage.separator"/>
+ </div>
+</xsl:template>
+
+<xsl:template match="*" mode="bibliography.titlepage.recto.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="*" mode="bibliography.titlepage.verso.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="subtitle" mode="bibliography.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="bibliography.titlepage.recto.style">
+<xsl:apply-templates select="." mode="bibliography.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template name="glossary.titlepage.recto">
+ <div xsl:use-attribute-sets="glossary.titlepage.recto.style">
+<xsl:call-template name="component.title">
+<xsl:with-param name="node" select="ancestor-or-self::glossary[1]"/>
+</xsl:call-template></div>
+ <xsl:choose>
+ <xsl:when test="glossaryinfo/subtitle">
+ <xsl:apply-templates mode="glossary.titlepage.recto.auto.mode" select="glossaryinfo/subtitle"/>
+ </xsl:when>
+ <xsl:when test="docinfo/subtitle">
+ <xsl:apply-templates mode="glossary.titlepage.recto.auto.mode" select="docinfo/subtitle"/>
+ </xsl:when>
+ <xsl:when test="info/subtitle">
+ <xsl:apply-templates mode="glossary.titlepage.recto.auto.mode" select="info/subtitle"/>
+ </xsl:when>
+ <xsl:when test="subtitle">
+ <xsl:apply-templates mode="glossary.titlepage.recto.auto.mode" select="subtitle"/>
+ </xsl:when>
+ </xsl:choose>
+
+</xsl:template>
+
+<xsl:template name="glossary.titlepage.verso">
+</xsl:template>
+
+<xsl:template name="glossary.titlepage.separator">
+</xsl:template>
+
+<xsl:template name="glossary.titlepage.before.recto">
+</xsl:template>
+
+<xsl:template name="glossary.titlepage.before.verso">
+</xsl:template>
+
+<xsl:template name="glossary.titlepage">
+ <div class="titlepage">
+ <xsl:variable name="recto.content">
+ <xsl:call-template name="glossary.titlepage.before.recto"/>
+ <xsl:call-template name="glossary.titlepage.recto"/>
+ </xsl:variable>
+ <xsl:variable name="recto.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($recto.content) != '') or ($recto.elements.count &gt; 0)">
+ <div><xsl:copy-of select="$recto.content"/></div>
+ </xsl:if>
+ <xsl:variable name="verso.content">
+ <xsl:call-template name="glossary.titlepage.before.verso"/>
+ <xsl:call-template name="glossary.titlepage.verso"/>
+ </xsl:variable>
+ <xsl:variable name="verso.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($verso.content) != '') or ($verso.elements.count &gt; 0)">
+ <div><xsl:copy-of select="$verso.content"/></div>
+ </xsl:if>
+ <xsl:call-template name="glossary.titlepage.separator"/>
+ </div>
+</xsl:template>
+
+<xsl:template match="*" mode="glossary.titlepage.recto.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="*" mode="glossary.titlepage.verso.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="subtitle" mode="glossary.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="glossary.titlepage.recto.style">
+<xsl:apply-templates select="." mode="glossary.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template name="index.titlepage.recto">
+ <div xsl:use-attribute-sets="index.titlepage.recto.style">
+<xsl:call-template name="component.title">
+<xsl:with-param name="node" select="ancestor-or-self::index[1]"/>
+</xsl:call-template></div>
+ <xsl:choose>
+ <xsl:when test="indexinfo/subtitle">
+ <xsl:apply-templates mode="index.titlepage.recto.auto.mode" select="indexinfo/subtitle"/>
+ </xsl:when>
+ <xsl:when test="docinfo/subtitle">
+ <xsl:apply-templates mode="index.titlepage.recto.auto.mode" select="docinfo/subtitle"/>
+ </xsl:when>
+ <xsl:when test="info/subtitle">
+ <xsl:apply-templates mode="index.titlepage.recto.auto.mode" select="info/subtitle"/>
+ </xsl:when>
+ <xsl:when test="subtitle">
+ <xsl:apply-templates mode="index.titlepage.recto.auto.mode" select="subtitle"/>
+ </xsl:when>
+ </xsl:choose>
+
+</xsl:template>
+
+<xsl:template name="index.titlepage.verso">
+</xsl:template>
+
+<xsl:template name="index.titlepage.separator">
+</xsl:template>
+
+<xsl:template name="index.titlepage.before.recto">
+</xsl:template>
+
+<xsl:template name="index.titlepage.before.verso">
+</xsl:template>
+
+<xsl:template name="index.titlepage">
+ <div class="titlepage">
+ <xsl:variable name="recto.content">
+ <xsl:call-template name="index.titlepage.before.recto"/>
+ <xsl:call-template name="index.titlepage.recto"/>
+ </xsl:variable>
+ <xsl:variable name="recto.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($recto.content) != '') or ($recto.elements.count &gt; 0)">
+ <div><xsl:copy-of select="$recto.content"/></div>
+ </xsl:if>
+ <xsl:variable name="verso.content">
+ <xsl:call-template name="index.titlepage.before.verso"/>
+ <xsl:call-template name="index.titlepage.verso"/>
+ </xsl:variable>
+ <xsl:variable name="verso.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($verso.content) != '') or ($verso.elements.count &gt; 0)">
+ <div><xsl:copy-of select="$verso.content"/></div>
+ </xsl:if>
+ <xsl:call-template name="index.titlepage.separator"/>
+ </div>
+</xsl:template>
+
+<xsl:template match="*" mode="index.titlepage.recto.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="*" mode="index.titlepage.verso.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="subtitle" mode="index.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="index.titlepage.recto.style">
+<xsl:apply-templates select="." mode="index.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template name="setindex.titlepage.recto">
+ <div xsl:use-attribute-sets="setindex.titlepage.recto.style">
+<xsl:call-template name="component.title">
+<xsl:with-param name="node" select="ancestor-or-self::setindex[1]"/>
+</xsl:call-template></div>
+ <xsl:choose>
+ <xsl:when test="setindexinfo/subtitle">
+ <xsl:apply-templates mode="setindex.titlepage.recto.auto.mode" select="setindexinfo/subtitle"/>
+ </xsl:when>
+ <xsl:when test="docinfo/subtitle">
+ <xsl:apply-templates mode="setindex.titlepage.recto.auto.mode" select="docinfo/subtitle"/>
+ </xsl:when>
+ <xsl:when test="info/subtitle">
+ <xsl:apply-templates mode="setindex.titlepage.recto.auto.mode" select="info/subtitle"/>
+ </xsl:when>
+ <xsl:when test="subtitle">
+ <xsl:apply-templates mode="setindex.titlepage.recto.auto.mode" select="subtitle"/>
+ </xsl:when>
+ </xsl:choose>
+
+</xsl:template>
+
+<xsl:template name="setindex.titlepage.verso">
+</xsl:template>
+
+<xsl:template name="setindex.titlepage.separator">
+</xsl:template>
+
+<xsl:template name="setindex.titlepage.before.recto">
+</xsl:template>
+
+<xsl:template name="setindex.titlepage.before.verso">
+</xsl:template>
+
+<xsl:template name="setindex.titlepage">
+ <div class="titlepage">
+ <xsl:variable name="recto.content">
+ <xsl:call-template name="setindex.titlepage.before.recto"/>
+ <xsl:call-template name="setindex.titlepage.recto"/>
+ </xsl:variable>
+ <xsl:variable name="recto.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($recto.content) != '') or ($recto.elements.count &gt; 0)">
+ <div><xsl:copy-of select="$recto.content"/></div>
+ </xsl:if>
+ <xsl:variable name="verso.content">
+ <xsl:call-template name="setindex.titlepage.before.verso"/>
+ <xsl:call-template name="setindex.titlepage.verso"/>
+ </xsl:variable>
+ <xsl:variable name="verso.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($verso.content) != '') or ($verso.elements.count &gt; 0)">
+ <div><xsl:copy-of select="$verso.content"/></div>
+ </xsl:if>
+ <xsl:call-template name="setindex.titlepage.separator"/>
+ </div>
+</xsl:template>
+
+<xsl:template match="*" mode="setindex.titlepage.recto.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="*" mode="setindex.titlepage.verso.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="subtitle" mode="setindex.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="setindex.titlepage.recto.style">
+<xsl:apply-templates select="." mode="setindex.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template name="sidebar.titlepage.recto">
+ <xsl:choose>
+ <xsl:when test="sidebarinfo/title">
+ <xsl:apply-templates mode="sidebar.titlepage.recto.auto.mode" select="sidebarinfo/title"/>
+ </xsl:when>
+ <xsl:when test="docinfo/title">
+ <xsl:apply-templates mode="sidebar.titlepage.recto.auto.mode" select="docinfo/title"/>
+ </xsl:when>
+ <xsl:when test="info/title">
+ <xsl:apply-templates mode="sidebar.titlepage.recto.auto.mode" select="info/title"/>
+ </xsl:when>
+ <xsl:when test="title">
+ <xsl:apply-templates mode="sidebar.titlepage.recto.auto.mode" select="title"/>
+ </xsl:when>
+ </xsl:choose>
+
+ <xsl:choose>
+ <xsl:when test="sidebarinfo/subtitle">
+ <xsl:apply-templates mode="sidebar.titlepage.recto.auto.mode" select="sidebarinfo/subtitle"/>
+ </xsl:when>
+ <xsl:when test="docinfo/subtitle">
+ <xsl:apply-templates mode="sidebar.titlepage.recto.auto.mode" select="docinfo/subtitle"/>
+ </xsl:when>
+ <xsl:when test="info/subtitle">
+ <xsl:apply-templates mode="sidebar.titlepage.recto.auto.mode" select="info/subtitle"/>
+ </xsl:when>
+ <xsl:when test="subtitle">
+ <xsl:apply-templates mode="sidebar.titlepage.recto.auto.mode" select="subtitle"/>
+ </xsl:when>
+ </xsl:choose>
+
+</xsl:template>
+
+<xsl:template name="sidebar.titlepage.verso">
+</xsl:template>
+
+<xsl:template name="sidebar.titlepage.separator">
+</xsl:template>
+
+<xsl:template name="sidebar.titlepage.before.recto">
+</xsl:template>
+
+<xsl:template name="sidebar.titlepage.before.verso">
+</xsl:template>
+
+<xsl:template name="sidebar.titlepage">
+ <div class="titlepage">
+ <xsl:variable name="recto.content">
+ <xsl:call-template name="sidebar.titlepage.before.recto"/>
+ <xsl:call-template name="sidebar.titlepage.recto"/>
+ </xsl:variable>
+ <xsl:variable name="recto.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($recto.content) != '') or ($recto.elements.count &gt; 0)">
+ <div><xsl:copy-of select="$recto.content"/></div>
+ </xsl:if>
+ <xsl:variable name="verso.content">
+ <xsl:call-template name="sidebar.titlepage.before.verso"/>
+ <xsl:call-template name="sidebar.titlepage.verso"/>
+ </xsl:variable>
+ <xsl:variable name="verso.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($verso.content) != '') or ($verso.elements.count &gt; 0)">
+ <div><xsl:copy-of select="$verso.content"/></div>
+ </xsl:if>
+ <xsl:call-template name="sidebar.titlepage.separator"/>
+ </div>
+</xsl:template>
+
+<xsl:template match="*" mode="sidebar.titlepage.recto.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="*" mode="sidebar.titlepage.verso.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="title" mode="sidebar.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sidebar.titlepage.recto.style">
+<xsl:call-template name="formal.object.heading">
+<xsl:with-param name="object" select="ancestor-or-self::sidebar[1]"/>
+</xsl:call-template>
+</div>
+</xsl:template>
+
+<xsl:template match="subtitle" mode="sidebar.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sidebar.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sidebar.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+</xsl:stylesheet>
+
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/titlepage.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/titlepage.xsl
new file mode 100644
index 0000000..3c285f0
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/titlepage.xsl
@@ -0,0 +1,1047 @@
+<?xml version='1.0'?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version='1.0'>
+
+<!-- ********************************************************************
+ $Id: titlepage.xsl 8816 2010-08-10 11:56:35Z mzjn $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<!-- ==================================================================== -->
+
+<xsl:attribute-set name="book.titlepage.recto.style"/>
+<xsl:attribute-set name="book.titlepage.verso.style"/>
+
+<xsl:attribute-set name="article.titlepage.recto.style"/>
+<xsl:attribute-set name="article.titlepage.verso.style"/>
+
+<xsl:attribute-set name="set.titlepage.recto.style"/>
+<xsl:attribute-set name="set.titlepage.verso.style"/>
+
+<xsl:attribute-set name="part.titlepage.recto.style"/>
+<xsl:attribute-set name="part.titlepage.verso.style"/>
+
+<xsl:attribute-set name="partintro.titlepage.recto.style"/>
+<xsl:attribute-set name="partintro.titlepage.verso.style"/>
+
+<xsl:attribute-set name="reference.titlepage.recto.style"/>
+<xsl:attribute-set name="reference.titlepage.verso.style"/>
+
+<xsl:attribute-set name="refentry.titlepage.recto.style"/>
+<xsl:attribute-set name="refentry.titlepage.verso.style"/>
+
+<xsl:attribute-set name="dedication.titlepage.recto.style"/>
+<xsl:attribute-set name="dedication.titlepage.verso.style"/>
+
+<xsl:attribute-set name="acknowledgements.titlepage.recto.style"/>
+<xsl:attribute-set name="acknowledgements.titlepage.verso.style"/>
+
+<xsl:attribute-set name="preface.titlepage.recto.style"/>
+<xsl:attribute-set name="preface.titlepage.verso.style"/>
+
+<xsl:attribute-set name="chapter.titlepage.recto.style"/>
+<xsl:attribute-set name="chapter.titlepage.verso.style"/>
+
+<xsl:attribute-set name="appendix.titlepage.recto.style"/>
+<xsl:attribute-set name="appendix.titlepage.verso.style"/>
+
+<xsl:attribute-set name="bibliography.titlepage.recto.style"/>
+<xsl:attribute-set name="bibliography.titlepage.verso.style"/>
+
+<xsl:attribute-set name="glossary.titlepage.recto.style"/>
+<xsl:attribute-set name="glossary.titlepage.verso.style"/>
+
+<xsl:attribute-set name="index.titlepage.recto.style"/>
+<xsl:attribute-set name="index.titlepage.verso.style"/>
+
+<xsl:attribute-set name="setindex.titlepage.recto.style"/>
+<xsl:attribute-set name="setindex.titlepage.verso.style"/>
+
+<xsl:attribute-set name="sidebar.titlepage.recto.style"/>
+<xsl:attribute-set name="sidebar.titlepage.verso.style"/>
+
+<xsl:attribute-set name="section.titlepage.recto.style"/>
+<xsl:attribute-set name="section.titlepage.verso.style"/>
+
+<xsl:attribute-set name="sect1.titlepage.recto.style"
+ use-attribute-sets="section.titlepage.recto.style"/>
+<xsl:attribute-set name="sect1.titlepage.verso.style"
+ use-attribute-sets="section.titlepage.verso.style"/>
+
+<xsl:attribute-set name="sect2.titlepage.recto.style"
+ use-attribute-sets="section.titlepage.recto.style"/>
+<xsl:attribute-set name="sect2.titlepage.verso.style"
+ use-attribute-sets="section.titlepage.verso.style"/>
+
+<xsl:attribute-set name="sect3.titlepage.recto.style"
+ use-attribute-sets="section.titlepage.recto.style"/>
+<xsl:attribute-set name="sect3.titlepage.verso.style"
+ use-attribute-sets="section.titlepage.verso.style"/>
+
+<xsl:attribute-set name="sect4.titlepage.recto.style"
+ use-attribute-sets="section.titlepage.recto.style"/>
+<xsl:attribute-set name="sect4.titlepage.verso.style"
+ use-attribute-sets="section.titlepage.verso.style"/>
+
+<xsl:attribute-set name="sect5.titlepage.recto.style"
+ use-attribute-sets="section.titlepage.recto.style"/>
+<xsl:attribute-set name="sect5.titlepage.verso.style"
+ use-attribute-sets="section.titlepage.verso.style"/>
+
+<xsl:attribute-set name="simplesect.titlepage.recto.style"
+ use-attribute-sets="section.titlepage.recto.style"/>
+<xsl:attribute-set name="simplesect.titlepage.verso.style"
+ use-attribute-sets="section.titlepage.verso.style"/>
+
+<xsl:attribute-set name="table.of.contents.titlepage.recto.style"/>
+<xsl:attribute-set name="table.of.contents.titlepage.verso.style"/>
+
+<xsl:attribute-set name="list.of.tables.titlepage.recto.style"/>
+<xsl:attribute-set name="list.of.tables.contents.titlepage.verso.style"/>
+
+<xsl:attribute-set name="list.of.figures.titlepage.recto.style"/>
+<xsl:attribute-set name="list.of.figures.contents.titlepage.verso.style"/>
+
+<xsl:attribute-set name="list.of.equations.titlepage.recto.style"/>
+<xsl:attribute-set name="list.of.equations.contents.titlepage.verso.style"/>
+
+<xsl:attribute-set name="list.of.examples.titlepage.recto.style"/>
+<xsl:attribute-set name="list.of.examples.contents.titlepage.verso.style"/>
+
+<xsl:attribute-set name="list.of.unknowns.titlepage.recto.style"/>
+<xsl:attribute-set name="list.of.unknowns.contents.titlepage.verso.style"/>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="*" mode="titlepage.mode">
+ <!-- if an element isn't found in this mode, try the default mode -->
+ <xsl:apply-templates select="."/>
+</xsl:template>
+
+<xsl:template match="abbrev" mode="titlepage.mode">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="titlepage.mode"/>
+ <br/>
+ </span>
+</xsl:template>
+
+<xsl:template match="abstract" mode="titlepage.mode">
+ <div>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:call-template name="anchor"/>
+ <xsl:if test="$abstract.notitle.enabled = 0">
+ <xsl:call-template name="formal.object.heading">
+ <xsl:with-param name="title">
+ <xsl:apply-templates select="." mode="title.markup"/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:if>
+ <xsl:apply-templates mode="titlepage.mode"/>
+ <xsl:call-template name="process.footnotes"/>
+ </div>
+</xsl:template>
+
+<xsl:template match="abstract/title" mode="titlepage.mode">
+</xsl:template>
+
+<xsl:template match="address" mode="titlepage.mode">
+ <xsl:param name="suppress-numbers" select="'0'"/>
+
+ <xsl:variable name="rtf">
+ <xsl:apply-templates mode="titlepage.mode"/>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="$suppress-numbers = '0'
+ and @linenumbering = 'numbered'
+ and $use.extensions != '0'
+ and $linenumbering.extension != '0'">
+ <div>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:call-template name="paragraph">
+ <xsl:with-param name="content">
+ <xsl:call-template name="number.rtf.lines">
+ <xsl:with-param name="rtf" select="$rtf"/>
+ </xsl:call-template>
+ </xsl:with-param>
+ </xsl:call-template>
+ </div>
+ </xsl:when>
+
+ <xsl:otherwise>
+ <div>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:call-template name="paragraph">
+ <xsl:with-param name="content">
+ <xsl:call-template name="make-verbatim">
+ <xsl:with-param name="rtf" select="$rtf"/>
+ </xsl:call-template>
+ </xsl:with-param>
+ </xsl:call-template>
+ </div>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="affiliation" mode="titlepage.mode">
+ <div>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="titlepage.mode"/>
+ </div>
+</xsl:template>
+
+<xsl:template match="artpagenums" mode="titlepage.mode">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="titlepage.mode"/>
+ <br/>
+ </span>
+</xsl:template>
+
+<xsl:template match="author|editor" mode="titlepage.mode">
+ <xsl:call-template name="credits.div"/>
+</xsl:template>
+
+<xsl:template name="credits.div">
+ <div>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:if test="self::editor[position()=1] and not($editedby.enabled = 0)">
+ <h4 class="editedby"><xsl:call-template name="gentext.edited.by"/></h4>
+ </xsl:if>
+ <h3>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:choose>
+ <xsl:when test="orgname">
+ <xsl:apply-templates/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="person.name"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </h3>
+ <xsl:if test="not($contrib.inline.enabled = 0)">
+ <xsl:apply-templates mode="titlepage.mode" select="contrib"/>
+ </xsl:if>
+ <xsl:apply-templates mode="titlepage.mode" select="affiliation"/>
+ <xsl:apply-templates mode="titlepage.mode" select="email"/>
+ <xsl:if test="not($blurb.on.titlepage.enabled = 0)">
+ <xsl:choose>
+ <xsl:when test="$contrib.inline.enabled = 0">
+ <xsl:apply-templates mode="titlepage.mode"
+ select="contrib|authorblurb|personblurb"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates mode="titlepage.mode"
+ select="authorblurb|personblurb"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:if>
+ </div>
+</xsl:template>
+
+<xsl:template match="authorblurb|personblurb" mode="titlepage.mode">
+ <div>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="titlepage.mode"/>
+ </div>
+</xsl:template>
+
+<xsl:template match="authorgroup" mode="titlepage.mode">
+ <div>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:if test="parent::refentryinfo">
+ <h2>Authors</h2>
+ </xsl:if>
+
+ <xsl:call-template name="anchor"/>
+ <xsl:apply-templates mode="titlepage.mode"/>
+ </div>
+</xsl:template>
+
+<xsl:template match="authorinitials" mode="titlepage.mode">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="titlepage.mode"/>
+ <br/>
+ </span>
+</xsl:template>
+
+<xsl:template match="bibliomisc" mode="titlepage.mode">
+ <xsl:apply-templates mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="bibliomset" mode="titlepage.mode">
+ <xsl:apply-templates mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="collab" mode="titlepage.mode">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="titlepage.mode"/>
+ <br/>
+ </span>
+</xsl:template>
+
+<xsl:template match="collabname" mode="titlepage.mode">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="titlepage.mode"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="confgroup" mode="titlepage.mode">
+ <div>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="titlepage.mode"/>
+ </div>
+</xsl:template>
+
+<xsl:template match="confdates" mode="titlepage.mode">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="titlepage.mode"/>
+ <br/>
+ </span>
+</xsl:template>
+
+<xsl:template match="confsponsor" mode="titlepage.mode">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="titlepage.mode"/>
+ <br/>
+ </span>
+</xsl:template>
+
+<xsl:template match="conftitle" mode="titlepage.mode">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="titlepage.mode"/>
+ <br/>
+ </span>
+</xsl:template>
+
+<xsl:template match="confnum" mode="titlepage.mode">
+ <!-- suppress -->
+</xsl:template>
+
+<xsl:template match="contractnum" mode="titlepage.mode">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="titlepage.mode"/>
+ <br/>
+ </span>
+</xsl:template>
+
+<xsl:template match="contractsponsor" mode="titlepage.mode">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="titlepage.mode"/>
+ <br/>
+ </span>
+</xsl:template>
+
+<xsl:template match="contrib" mode="titlepage.mode">
+ <xsl:choose>
+ <xsl:when test="not($contrib.inline.enabled = 0)">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="titlepage.mode"/>
+ </span><xsl:text>&#160;</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <div>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <p><xsl:apply-templates mode="titlepage.mode"/></p>
+ </div>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="copyright" mode="titlepage.mode">
+
+ <xsl:if test="generate-id() = generate-id(//refentryinfo/copyright[1])
+ and ($stylesheet.result.type = 'html' or $stylesheet.result.type = 'xhtml')">
+ <h2>Copyright</h2>
+ </xsl:if>
+
+ <p>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'Copyright'"/>
+ </xsl:call-template>
+ <xsl:call-template name="gentext.space"/>
+ <xsl:call-template name="dingbat">
+ <xsl:with-param name="dingbat">copyright</xsl:with-param>
+ </xsl:call-template>
+ <xsl:call-template name="gentext.space"/>
+ <xsl:call-template name="copyright.years">
+ <xsl:with-param name="years" select="year"/>
+ <xsl:with-param name="print.ranges" select="$make.year.ranges"/>
+ <xsl:with-param name="single.year.ranges"
+ select="$make.single.year.ranges"/>
+ </xsl:call-template>
+ <xsl:call-template name="gentext.space"/>
+ <xsl:apply-templates select="holder" mode="titlepage.mode"/>
+ </p>
+</xsl:template>
+
+<xsl:template match="year" mode="titlepage.mode">
+ <xsl:choose>
+ <xsl:when test="$show.revisionflag != 0 and @revisionflag">
+ <span class="{@revisionflag}">
+ <xsl:apply-templates mode="titlepage.mode"/>
+ </span>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates mode="titlepage.mode"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="holder" mode="titlepage.mode">
+ <xsl:choose>
+ <xsl:when test="$show.revisionflag != 0 and @revisionflag">
+ <span class="{@revisionflag}">
+ <xsl:apply-templates mode="titlepage.mode"/>
+ </span>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates mode="titlepage.mode"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:if test="position() &lt; last()">
+ <xsl:text>, </xsl:text>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="corpauthor" mode="titlepage.mode">
+ <h3>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="titlepage.mode"/>
+ </h3>
+</xsl:template>
+
+<xsl:template match="corpcredit" mode="titlepage.mode">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="titlepage.mode"/>
+ <br/>
+ </span>
+</xsl:template>
+
+<xsl:template match="corpname" mode="titlepage.mode">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="titlepage.mode"/>
+ <br/>
+ </span>
+</xsl:template>
+
+<xsl:template match="date" mode="titlepage.mode">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="titlepage.mode"/>
+ <br/>
+ </span>
+</xsl:template>
+
+<xsl:template match="edition" mode="titlepage.mode">
+ <p>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="titlepage.mode"/>
+ <xsl:call-template name="gentext.space"/>
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'Edition'"/>
+ </xsl:call-template>
+ </p>
+</xsl:template>
+
+<xsl:template match="email" mode="titlepage.mode">
+ <!-- use the normal e-mail handling code -->
+ <xsl:apply-templates select="."/>
+</xsl:template>
+
+<xsl:template match="firstname" mode="titlepage.mode">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="titlepage.mode"/>
+ <br/>
+ </span>
+</xsl:template>
+
+<xsl:template match="graphic" mode="titlepage.mode">
+ <!-- use the normal graphic handling code -->
+ <xsl:apply-templates select="."/>
+</xsl:template>
+
+<xsl:template match="honorific" mode="titlepage.mode">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="titlepage.mode"/>
+ <br/>
+ </span>
+</xsl:template>
+
+<xsl:template match="isbn" mode="titlepage.mode">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="titlepage.mode"/>
+ <br/>
+ </span>
+</xsl:template>
+
+<xsl:template match="issn" mode="titlepage.mode">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="titlepage.mode"/>
+ <br/>
+ </span>
+</xsl:template>
+
+<xsl:template match="biblioid" mode="titlepage.mode">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="titlepage.mode"/>
+ <br/>
+ </span>
+</xsl:template>
+
+<xsl:template match="itermset" mode="titlepage.mode">
+</xsl:template>
+
+<xsl:template match="invpartnumber" mode="titlepage.mode">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="titlepage.mode"/>
+ <br/>
+ </span>
+</xsl:template>
+
+<xsl:template match="issuenum" mode="titlepage.mode">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="titlepage.mode"/>
+ <br/>
+ </span>
+</xsl:template>
+
+<xsl:template match="jobtitle" mode="titlepage.mode">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="titlepage.mode"/>
+ <br/>
+ </span>
+</xsl:template>
+
+<xsl:template match="keywordset" mode="titlepage.mode">
+</xsl:template>
+
+<xsl:template match="legalnotice" mode="titlepage.mode">
+ <xsl:variable name="id"><xsl:call-template name="object.id"/></xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="$generate.legalnotice.link != 0">
+
+ <!-- Compute name of legalnotice file -->
+ <xsl:variable name="file">
+ <xsl:call-template name="ln.or.rh.filename"/>
+ </xsl:variable>
+
+ <xsl:variable name="filename">
+ <xsl:call-template name="make-relative-filename">
+ <xsl:with-param name="base.dir" select="$base.dir"/>
+ <xsl:with-param name="base.name" select="$file"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="title">
+ <xsl:apply-templates select="." mode="title.markup"/>
+ </xsl:variable>
+
+ <a href="{$file}">
+ <xsl:copy-of select="$title"/>
+ </a>
+
+ <xsl:call-template name="write.chunk">
+ <xsl:with-param name="filename" select="$filename"/>
+ <xsl:with-param name="quiet" select="$chunk.quietly"/>
+ <xsl:with-param name="content">
+ <xsl:call-template name="user.preroot"/>
+ <html>
+ <head>
+ <xsl:call-template name="system.head.content"/>
+ <xsl:call-template name="head.content"/>
+ <xsl:call-template name="user.head.content"/>
+ </head>
+ <body>
+ <xsl:call-template name="body.attributes"/>
+ <div>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="titlepage.mode"/>
+ </div>
+ </body>
+ </html>
+ <xsl:value-of select="$chunk.append"/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <div>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <a name="{$id}"/>
+ <xsl:apply-templates mode="titlepage.mode"/>
+ </div>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="legalnotice/title" mode="titlepage.mode">
+ <p class="legalnotice-title"><b><xsl:apply-templates/></b></p>
+</xsl:template>
+
+<xsl:template match="lineage" mode="titlepage.mode">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="titlepage.mode"/>
+ <br/>
+ </span>
+</xsl:template>
+
+<xsl:template match="modespec" mode="titlepage.mode">
+</xsl:template>
+
+<xsl:template match="orgdiv" mode="titlepage.mode">
+ <xsl:if test="preceding-sibling::*[1][self::orgname]">
+ <xsl:text> </xsl:text>
+ </xsl:if>
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="titlepage.mode"/>
+ <br/>
+ </span>
+</xsl:template>
+
+<xsl:template match="orgname" mode="titlepage.mode">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="titlepage.mode"/>
+ <br/>
+ </span>
+</xsl:template>
+
+<xsl:template match="othercredit" mode="titlepage.mode">
+<xsl:choose>
+ <xsl:when test="not($othercredit.like.author.enabled = 0)">
+ <xsl:variable name="contrib" select="string(contrib)"/>
+ <xsl:choose>
+ <xsl:when test="contrib">
+ <xsl:if test="not(preceding-sibling::othercredit[string(contrib)=$contrib])">
+ <xsl:call-template name="paragraph">
+ <xsl:with-param name="class" select="local-name(.)"/>
+ <xsl:with-param name="content">
+ <xsl:apply-templates mode="titlepage.mode" select="contrib"/>
+ <xsl:text>: </xsl:text>
+ <xsl:call-template name="person.name"/>
+ <xsl:apply-templates mode="titlepage.mode" select="affiliation"/>
+ <xsl:apply-templates select="following-sibling::othercredit[string(contrib)=$contrib]" mode="titlepage.othercredits"/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="paragraph">
+ <xsl:with-param name="class" select="local-name(.)"/>
+ <xsl:with-param name="content">
+ <xsl:call-template name="person.name"/>
+ </xsl:with-param>
+ </xsl:call-template>
+ <xsl:apply-templates mode="titlepage.mode" select="affiliation"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="credits.div"/>
+ </xsl:otherwise>
+</xsl:choose>
+</xsl:template>
+
+<xsl:template match="othercredit" mode="titlepage.othercredits">
+ <xsl:text>, </xsl:text>
+ <xsl:call-template name="person.name"/>
+</xsl:template>
+
+<xsl:template match="othername" mode="titlepage.mode">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="titlepage.mode"/>
+ <br/>
+ </span>
+</xsl:template>
+
+<xsl:template match="pagenums" mode="titlepage.mode">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="titlepage.mode"/>
+ <br/>
+ </span>
+</xsl:template>
+
+<xsl:template match="printhistory" mode="titlepage.mode">
+ <div>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="titlepage.mode"/>
+ </div>
+</xsl:template>
+
+<xsl:template match="productname" mode="titlepage.mode">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="titlepage.mode"/>
+ <br/>
+ </span>
+</xsl:template>
+
+<xsl:template match="productnumber" mode="titlepage.mode">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="titlepage.mode"/>
+ <br/>
+ </span>
+</xsl:template>
+
+<xsl:template match="pubdate" mode="titlepage.mode">
+ <xsl:call-template name="paragraph">
+ <xsl:with-param name="class" select="local-name(.)"/>
+ <xsl:with-param name="content">
+ <xsl:apply-templates mode="titlepage.mode"/>
+ </xsl:with-param>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="publisher" mode="titlepage.mode">
+ <xsl:call-template name="paragraph">
+ <xsl:with-param name="class" select="local-name(.)"/>
+ <xsl:with-param name="content">
+ <xsl:apply-templates mode="titlepage.mode"/>
+ </xsl:with-param>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="publishername" mode="titlepage.mode">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="titlepage.mode"/>
+ <br/>
+ </span>
+</xsl:template>
+
+<xsl:template match="pubsnumber" mode="titlepage.mode">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="titlepage.mode"/>
+ <br/>
+ </span>
+</xsl:template>
+
+<xsl:template match="releaseinfo" mode="titlepage.mode">
+ <xsl:call-template name="paragraph">
+ <xsl:with-param name="class" select="local-name(.)"/>
+ <xsl:with-param name="content">
+ <xsl:apply-templates mode="titlepage.mode"/>
+ </xsl:with-param>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="revhistory" mode="titlepage.mode">
+ <xsl:variable name="numcols">
+ <xsl:choose>
+ <xsl:when test=".//authorinitials|.//author">3</xsl:when>
+ <xsl:otherwise>2</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="id"><xsl:call-template name="object.id"/></xsl:variable>
+
+ <xsl:variable name="title">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key">RevHistory</xsl:with-param>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="contents">
+ <div>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <table border="1" width="100%" summary="Revision history">
+ <tr>
+ <th align="{$direction.align.start}" valign="top" colspan="{$numcols}">
+ <b>
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'RevHistory'"/>
+ </xsl:call-template>
+ </b>
+ </th>
+ </tr>
+ <xsl:apply-templates mode="titlepage.mode">
+ <xsl:with-param name="numcols" select="$numcols"/>
+ </xsl:apply-templates>
+ </table>
+ </div>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="$generate.revhistory.link != 0">
+
+ <!-- Compute name of revhistory file -->
+ <xsl:variable name="file">
+ <xsl:call-template name="ln.or.rh.filename">
+ <xsl:with-param name="is.ln" select="false()"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="filename">
+ <xsl:call-template name="make-relative-filename">
+ <xsl:with-param name="base.dir" select="$base.dir"/>
+ <xsl:with-param name="base.name" select="$file"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <a href="{$file}">
+ <xsl:copy-of select="$title"/>
+ </a>
+
+ <xsl:call-template name="write.chunk">
+ <xsl:with-param name="filename" select="$filename"/>
+ <xsl:with-param name="quiet" select="$chunk.quietly"/>
+ <xsl:with-param name="content">
+ <xsl:call-template name="user.preroot"/>
+ <html>
+ <head>
+ <xsl:call-template name="system.head.content"/>
+ <xsl:call-template name="head.content">
+ <xsl:with-param name="title">
+ <xsl:value-of select="$title"/>
+ <xsl:if test="../../title">
+ <xsl:value-of select="concat(' (', ../../title, ')')"/>
+ </xsl:if>
+ </xsl:with-param>
+ </xsl:call-template>
+ <xsl:call-template name="user.head.content"/>
+ </head>
+ <body>
+ <xsl:call-template name="body.attributes"/>
+ <xsl:copy-of select="$contents"/>
+ </body>
+ </html>
+ <xsl:text>&#x0a;</xsl:text>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:copy-of select="$contents"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="revhistory/revision" mode="titlepage.mode">
+ <xsl:param name="numcols" select="'3'"/>
+ <xsl:variable name="revnumber" select="revnumber"/>
+ <xsl:variable name="revdate" select="date"/>
+ <xsl:variable name="revauthor" select="authorinitials|author"/>
+ <xsl:variable name="revremark" select="revremark|revdescription"/>
+ <tr>
+ <td align="{$direction.align.start}">
+ <xsl:if test="$revnumber">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'Revision'"/>
+ </xsl:call-template>
+ <xsl:call-template name="gentext.space"/>
+ <xsl:apply-templates select="$revnumber[1]" mode="titlepage.mode"/>
+ </xsl:if>
+ </td>
+ <td align="{$direction.align.start}">
+ <xsl:apply-templates select="$revdate[1]" mode="titlepage.mode"/>
+ </td>
+ <xsl:choose>
+ <xsl:when test="$revauthor">
+ <td align="{$direction.align.start}">
+ <xsl:for-each select="$revauthor">
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+ <xsl:if test="position() != last()">
+ <xsl:text>, </xsl:text>
+ </xsl:if>
+ </xsl:for-each>
+ </td>
+ </xsl:when>
+ <xsl:when test="$numcols &gt; 2">
+ <td>&#160;</td>
+ </xsl:when>
+ <xsl:otherwise></xsl:otherwise>
+ </xsl:choose>
+ </tr>
+ <xsl:if test="$revremark">
+ <tr>
+ <td align="{$direction.align.start}" colspan="{$numcols}">
+ <xsl:apply-templates select="$revremark[1]" mode="titlepage.mode"/>
+ </td>
+ </tr>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="revision/revnumber" mode="titlepage.mode">
+ <xsl:apply-templates mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="revision/date" mode="titlepage.mode">
+ <xsl:apply-templates mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="revision/authorinitials" mode="titlepage.mode">
+ <xsl:apply-templates mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="revision/author" mode="titlepage.mode">
+ <xsl:apply-templates mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="revision/revremark" mode="titlepage.mode">
+ <xsl:apply-templates mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="revision/revdescription" mode="titlepage.mode">
+ <xsl:apply-templates mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="seriesvolnums" mode="titlepage.mode">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="titlepage.mode"/>
+ <br/>
+ </span>
+</xsl:template>
+
+<xsl:template match="shortaffil" mode="titlepage.mode">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="titlepage.mode"/>
+ <br/>
+ </span>
+</xsl:template>
+
+<xsl:template match="subjectset" mode="titlepage.mode">
+</xsl:template>
+
+<xsl:template match="subtitle" mode="titlepage.mode">
+ <h2>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="titlepage.mode"/>
+ </h2>
+</xsl:template>
+
+<xsl:template match="surname" mode="titlepage.mode">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="titlepage.mode"/>
+ <br/>
+ </span>
+</xsl:template>
+
+<xsl:template match="title" mode="titlepage.mode">
+ <xsl:variable name="id">
+ <xsl:choose>
+ <!-- if title is in an *info wrapper, get the grandparent -->
+ <xsl:when test="contains(local-name(..), 'info')">
+ <xsl:call-template name="object.id">
+ <xsl:with-param name="object" select="../.."/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="object.id">
+ <xsl:with-param name="object" select=".."/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <h1>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:if test="$generate.id.attributes = 0">
+ <a name="{$id}"/>
+ </xsl:if>
+ <xsl:choose>
+ <xsl:when test="$show.revisionflag != 0 and @revisionflag">
+ <span class="{@revisionflag}">
+ <xsl:apply-templates mode="titlepage.mode"/>
+ </span>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates mode="titlepage.mode"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </h1>
+</xsl:template>
+
+<xsl:template match="titleabbrev" mode="titlepage.mode">
+ <!-- nop; title abbreviations don't belong on the title page! -->
+</xsl:template>
+
+<xsl:template match="volumenum" mode="titlepage.mode">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="titlepage.mode"/>
+ <br/>
+ </span>
+</xsl:template>
+
+<!-- This template computes the filename for legalnotice and revhistory chunks -->
+<xsl:template name="ln.or.rh.filename">
+ <xsl:param name="node" select="."/>
+ <xsl:param name="is.ln" select="true()"/>
+
+ <xsl:variable name="dbhtml-filename">
+ <xsl:call-template name="pi.dbhtml_filename">
+ <xsl:with-param name="node" select="$node"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:choose>
+ <!-- 1. If there is a dbhtml_filename PI, use that -->
+ <xsl:when test="$dbhtml-filename != ''">
+ <xsl:value-of select="$dbhtml-filename"/>
+ </xsl:when>
+ <xsl:when test="($node/@id or $node/@xml:id) and not($use.id.as.filename = 0)">
+ <!-- * 2. If this legalnotice/revhistory has an ID, then go ahead and use -->
+ <!-- * just the value of that ID as the basename for the file -->
+ <!-- * (that is, without prepending an "ln-" or "rh-" to it) -->
+ <xsl:value-of select="($node/@id|$node/@xml:id)[1]"/>
+ <xsl:value-of select="$html.ext"/>
+ </xsl:when>
+ <xsl:when test="not ($node/@id or $node/@xml:id) or $use.id.as.filename = 0">
+ <!-- * 3. Otherwise, if this legalnotice/revhistory does not have an ID, or -->
+ <!-- * if $use.id.as.filename = 0 -->
+ <!-- * then we generate an ID... -->
+ <xsl:variable name="id">
+ <xsl:value-of select="generate-id($node)"/>
+ </xsl:variable>
+ <!-- * ...and then we take that generated ID, prepend a -->
+ <!-- * prefix to it, and use that as the basename for the file -->
+ <xsl:choose>
+ <xsl:when test="$is.ln">
+ <xsl:value-of select="concat('ln-',$id,$html.ext)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="concat('rh-',$id,$html.ext)"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/toc.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/toc.xsl
new file mode 100644
index 0000000..d8c1be5
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/toc.xsl
@@ -0,0 +1,350 @@
+<?xml version='1.0'?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version='1.0'>
+
+<!-- ********************************************************************
+ $Id: toc.xsl 8421 2009-05-04 07:49:49Z bobstayton $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<!-- ==================================================================== -->
+
+<xsl:template match="set/toc | book/toc | part/toc">
+ <xsl:variable name="toc.params">
+ <xsl:call-template name="find.path.params">
+ <xsl:with-param name="node" select="parent::*"/>
+ <xsl:with-param name="table" select="normalize-space($generate.toc)"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <!-- Do not output the toc element if one is already generated
+ by the use of $generate.toc parameter, or if
+ generating a source toc is turned off -->
+ <xsl:if test="not(contains($toc.params, 'toc')) and
+ ($process.source.toc != 0 or $process.empty.source.toc != 0)">
+ <xsl:variable name="content">
+ <xsl:choose>
+ <xsl:when test="* and $process.source.toc != 0">
+ <xsl:apply-templates />
+ </xsl:when>
+ <xsl:when test="count(*) = 0 and $process.empty.source.toc != 0">
+ <!-- trick to switch context node to parent element -->
+ <xsl:for-each select="parent::*">
+ <xsl:choose>
+ <xsl:when test="self::set">
+ <xsl:call-template name="set.toc">
+ <xsl:with-param name="toc.title.p"
+ select="contains($toc.params, 'title')"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="self::book">
+ <xsl:call-template name="division.toc">
+ <xsl:with-param name="toc.title.p"
+ select="contains($toc.params, 'title')"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="self::part">
+ <xsl:call-template name="division.toc">
+ <xsl:with-param name="toc.title.p"
+ select="contains($toc.params, 'title')"/>
+ </xsl:call-template>
+ </xsl:when>
+ </xsl:choose>
+ </xsl:for-each>
+ </xsl:when>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:if test="string-length(normalize-space($content)) != 0">
+ <xsl:copy-of select="$content"/>
+ </xsl:if>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="chapter/toc | appendix/toc | preface/toc | article/toc">
+ <xsl:variable name="toc.params">
+ <xsl:call-template name="find.path.params">
+ <xsl:with-param name="node" select="parent::*"/>
+ <xsl:with-param name="table" select="normalize-space($generate.toc)"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <!-- Do not output the toc element if one is already generated
+ by the use of $generate.toc parameter, or if
+ generating a source toc is turned off -->
+ <xsl:if test="not(contains($toc.params, 'toc')) and
+ ($process.source.toc != 0 or $process.empty.source.toc != 0)">
+ <xsl:choose>
+ <xsl:when test="* and $process.source.toc != 0">
+ <div>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates select="title"/>
+ <dl>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates select="*[not(self::title)]"/>
+ </dl>
+ </div>
+ <xsl:call-template name="component.toc.separator"/>
+ </xsl:when>
+ <xsl:when test="count(*) = 0 and $process.empty.source.toc != 0">
+ <!-- trick to switch context node to section element -->
+ <xsl:for-each select="parent::*">
+ <xsl:call-template name="component.toc">
+ <xsl:with-param name="toc.title.p"
+ select="contains($toc.params, 'title')"/>
+ </xsl:call-template>
+ </xsl:for-each>
+ <xsl:call-template name="component.toc.separator"/>
+ </xsl:when>
+ </xsl:choose>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="section/toc
+ |sect1/toc
+ |sect2/toc
+ |sect3/toc
+ |sect4/toc
+ |sect5/toc">
+
+ <xsl:variable name="toc.params">
+ <xsl:call-template name="find.path.params">
+ <xsl:with-param name="node" select="parent::*"/>
+ <xsl:with-param name="table" select="normalize-space($generate.toc)"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <!-- Do not output the toc element if one is already generated
+ by the use of $generate.toc parameter, or if
+ generating a source toc is turned off -->
+ <xsl:if test="not(contains($toc.params, 'toc')) and
+ ($process.source.toc != 0 or $process.empty.source.toc != 0)">
+ <xsl:choose>
+ <xsl:when test="* and $process.source.toc != 0">
+ <div>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates select="title"/>
+ <dl>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates select="*[not(self::title)]"/>
+ </dl>
+ </div>
+ <xsl:call-template name="section.toc.separator"/>
+ </xsl:when>
+ <xsl:when test="count(*) = 0 and $process.empty.source.toc != 0">
+ <!-- trick to switch context node to section element -->
+ <xsl:for-each select="parent::*">
+ <xsl:call-template name="section.toc">
+ <xsl:with-param name="toc.title.p"
+ select="contains($toc.params, 'title')"/>
+ </xsl:call-template>
+ </xsl:for-each>
+ <xsl:call-template name="section.toc.separator"/>
+ </xsl:when>
+ </xsl:choose>
+ </xsl:if>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="tocpart|tocchap
+ |toclevel1|toclevel2|toclevel3|toclevel4|toclevel5">
+ <xsl:variable name="sub-toc">
+ <xsl:if test="tocchap|toclevel1|toclevel2|toclevel3|toclevel4|toclevel5">
+ <xsl:choose>
+ <xsl:when test="$toc.list.type = 'dl'">
+ <dd>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:element name="{$toc.list.type}">
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates select="tocchap|toclevel1|toclevel2|
+ toclevel3|toclevel4|toclevel5"/>
+ </xsl:element>
+ </dd>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:element name="{$toc.list.type}">
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates select="tocchap|toclevel1|toclevel2|
+ toclevel3|toclevel4|toclevel5"/>
+ </xsl:element>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:if>
+ </xsl:variable>
+
+ <xsl:apply-templates select="tocentry[position() != last()]"/>
+
+ <xsl:choose>
+ <xsl:when test="$toc.list.type = 'dl'">
+ <dt>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates select="tocentry[position() = last()]"/>
+ </dt>
+ <xsl:copy-of select="$sub-toc"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <li>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates select="tocentry[position() = last()]"/>
+ <xsl:copy-of select="$sub-toc"/>
+ </li>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="tocentry|tocdiv|lotentry|tocfront|tocback">
+ <xsl:choose>
+ <xsl:when test="$toc.list.type = 'dl'">
+ <dt>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:call-template name="tocentry-content"/>
+ </dt>
+ </xsl:when>
+ <xsl:otherwise>
+ <li>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:call-template name="tocentry-content"/>
+ </li>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="tocentry[position() = last()]" priority="2">
+ <xsl:call-template name="tocentry-content"/>
+</xsl:template>
+
+<xsl:template name="tocentry-content">
+ <xsl:variable name="targets" select="key('id',@linkend)"/>
+ <xsl:variable name="target" select="$targets[1]"/>
+
+ <xsl:choose>
+ <xsl:when test="@linkend">
+ <xsl:call-template name="check.id.unique">
+ <xsl:with-param name="linkend" select="@linkend"/>
+ </xsl:call-template>
+ <a>
+ <xsl:attribute name="href">
+ <xsl:call-template name="href.target">
+ <xsl:with-param name="object" select="$target"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:apply-templates/>
+ </a>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="toc/title">
+ <div>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates/>
+ </div>
+</xsl:template>
+
+<xsl:template match="toc/subtitle">
+ <div>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates/>
+ </div>
+</xsl:template>
+
+<xsl:template match="toc/titleabbrev">
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<!-- A lot element must have content, because there is no attribute
+ to select what kind of list should be generated -->
+<xsl:template match="book/lot | part/lot">
+ <!-- Don't generate a page sequence unless there is content -->
+ <xsl:variable name="content">
+ <xsl:choose>
+ <xsl:when test="* and $process.source.toc != 0">
+ <div>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates />
+ </div>
+ </xsl:when>
+ <xsl:when test="not(child::*) and $process.empty.source.toc != 0">
+ <xsl:call-template name="process.empty.lot"/>
+ </xsl:when>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:if test="string-length(normalize-space($content)) != 0">
+ <xsl:copy-of select="$content"/>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="chapter/lot | appendix/lot | preface/lot | article/lot">
+ <xsl:choose>
+ <xsl:when test="* and $process.source.toc != 0">
+ <div>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates />
+ </div>
+ <xsl:call-template name="component.toc.separator"/>
+ </xsl:when>
+ <xsl:when test="not(child::*) and $process.empty.source.toc != 0">
+ <xsl:call-template name="process.empty.lot"/>
+ </xsl:when>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="section/lot
+ |sect1/lot
+ |sect2/lot
+ |sect3/lot
+ |sect4/lot
+ |sect5/lot">
+ <xsl:choose>
+ <xsl:when test="* and $process.source.toc != 0">
+ <div>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates/>
+ </div>
+ <xsl:call-template name="section.toc.separator"/>
+ </xsl:when>
+ <xsl:when test="not(child::*) and $process.empty.source.toc != 0">
+ <xsl:call-template name="process.empty.lot"/>
+ </xsl:when>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="process.empty.lot">
+ <!-- An empty lot element does not provide any information to indicate
+ what should be included in it. You can customize this
+ template to generate a lot based on @role or something -->
+ <xsl:message>
+ <xsl:text>Warning: don't know what to generate for </xsl:text>
+ <xsl:text>lot that has no children.</xsl:text>
+ </xsl:message>
+</xsl:template>
+
+<xsl:template match="lot/title">
+ <div>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates/>
+ </div>
+</xsl:template>
+
+<xsl:template match="lot/subtitle">
+ <div>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates/>
+ </div>
+</xsl:template>
+
+<xsl:template match="lot/titleabbrev">
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/verbatim.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/verbatim.xsl
new file mode 100644
index 0000000..8c7b263
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/verbatim.xsl
@@ -0,0 +1,410 @@
+<?xml version='1.0'?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:sverb="http://nwalsh.com/xslt/ext/com.nwalsh.saxon.Verbatim"
+ xmlns:xverb="xalan://com.nwalsh.xalan.Verbatim"
+ xmlns:lxslt="http://xml.apache.org/xslt"
+ xmlns:exsl="http://exslt.org/common"
+ exclude-result-prefixes="sverb xverb lxslt exsl"
+ version='1.0'>
+
+<!-- ********************************************************************
+ $Id: verbatim.xsl 8807 2010-08-09 18:57:41Z bobstayton $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<!-- XSLTHL highlighting is turned off by default. See highlighting/README
+ for instructions on how to turn on XSLTHL -->
+<xsl:template name="apply-highlighting">
+ <xsl:apply-templates/>
+</xsl:template>
+
+<lxslt:component prefix="xverb"
+ functions="numberLines"/>
+
+<xsl:template match="programlisting|screen|synopsis">
+ <xsl:param name="suppress-numbers" select="'0'"/>
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+
+ <xsl:call-template name="anchor"/>
+
+ <xsl:variable name="div.element">
+ <xsl:choose>
+ <xsl:when test="$make.clean.html != 0">div</xsl:when>
+ <xsl:otherwise>pre</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:if test="$shade.verbatim != 0">
+ <xsl:message>
+ <xsl:text>The shade.verbatim parameter is deprecated. </xsl:text>
+ <xsl:text>Use CSS instead,</xsl:text>
+ </xsl:message>
+ <xsl:message>
+ <xsl:text>for example: pre.</xsl:text>
+ <xsl:value-of select="local-name(.)"/>
+ <xsl:text> { background-color: #E0E0E0; }</xsl:text>
+ </xsl:message>
+ </xsl:if>
+
+ <xsl:choose>
+ <xsl:when test="$suppress-numbers = '0'
+ and @linenumbering = 'numbered'
+ and $use.extensions != '0'
+ and $linenumbering.extension != '0'">
+ <xsl:variable name="rtf">
+ <xsl:choose>
+ <xsl:when test="$highlight.source != 0">
+ <xsl:call-template name="apply-highlighting"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:element name="{$div.element}">
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:if test="@width != ''">
+ <xsl:attribute name="width">
+ <xsl:value-of select="@width"/>
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:call-template name="number.rtf.lines">
+ <xsl:with-param name="rtf" select="$rtf"/>
+ </xsl:call-template>
+ </xsl:element>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:element name="{$div.element}">
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:if test="@width != ''">
+ <xsl:attribute name="width">
+ <xsl:value-of select="@width"/>
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:choose>
+ <xsl:when test="$highlight.source != 0">
+ <xsl:call-template name="apply-highlighting"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:element>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="literallayout">
+ <xsl:param name="suppress-numbers" select="'0'"/>
+
+ <xsl:variable name="rtf">
+ <xsl:apply-templates/>
+ </xsl:variable>
+
+ <xsl:if test="$shade.verbatim != 0 and @class='monospaced'">
+ <xsl:message>
+ <xsl:text>The shade.verbatim parameter is deprecated. </xsl:text>
+ <xsl:text>Use CSS instead,</xsl:text>
+ </xsl:message>
+ <xsl:message>
+ <xsl:text>for example: pre.</xsl:text>
+ <xsl:value-of select="local-name(.)"/>
+ <xsl:text> { background-color: #E0E0E0; }</xsl:text>
+ </xsl:message>
+ </xsl:if>
+
+ <xsl:choose>
+ <xsl:when test="$suppress-numbers = '0'
+ and @linenumbering = 'numbered'
+ and $use.extensions != '0'
+ and $linenumbering.extension != '0'">
+ <xsl:choose>
+ <xsl:when test="@class='monospaced'">
+ <pre>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:call-template name="number.rtf.lines">
+ <xsl:with-param name="rtf" select="$rtf"/>
+ </xsl:call-template>
+ </pre>
+ </xsl:when>
+ <xsl:otherwise>
+ <div>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <p>
+ <xsl:call-template name="number.rtf.lines">
+ <xsl:with-param name="rtf" select="$rtf"/>
+ </xsl:call-template>
+ </p>
+ </div>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:choose>
+ <xsl:when test="@class='monospaced'">
+ <pre>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:copy-of select="$rtf"/>
+ </pre>
+ </xsl:when>
+ <xsl:otherwise>
+ <div>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <p>
+ <xsl:call-template name="make-verbatim">
+ <xsl:with-param name="rtf" select="$rtf"/>
+ </xsl:call-template>
+ </p>
+ </div>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="address">
+ <xsl:param name="suppress-numbers" select="'0'"/>
+
+ <xsl:variable name="rtf">
+ <xsl:apply-templates/>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="$suppress-numbers = '0'
+ and @linenumbering = 'numbered'
+ and $use.extensions != '0'
+ and $linenumbering.extension != '0'">
+ <div>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <p>
+ <xsl:call-template name="number.rtf.lines">
+ <xsl:with-param name="rtf" select="$rtf"/>
+ </xsl:call-template>
+ </p>
+ </div>
+ </xsl:when>
+
+ <xsl:otherwise>
+ <div>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <p>
+ <xsl:call-template name="make-verbatim">
+ <xsl:with-param name="rtf" select="$rtf"/>
+ </xsl:call-template>
+ </p>
+ </div>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="number.rtf.lines">
+ <xsl:param name="rtf" select="''"/>
+ <xsl:param name="pi.context" select="."/>
+
+ <!-- Save the global values -->
+ <xsl:variable name="global.linenumbering.everyNth"
+ select="$linenumbering.everyNth"/>
+
+ <xsl:variable name="global.linenumbering.separator"
+ select="$linenumbering.separator"/>
+
+ <xsl:variable name="global.linenumbering.width"
+ select="$linenumbering.width"/>
+
+ <!-- Extract the <?dbhtml linenumbering.*?> PI values -->
+ <xsl:variable name="pi.linenumbering.everyNth">
+ <xsl:call-template name="pi.dbhtml_linenumbering.everyNth">
+ <xsl:with-param name="node" select="$pi.context"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="pi.linenumbering.separator">
+ <xsl:call-template name="pi.dbhtml_linenumbering.separator">
+ <xsl:with-param name="node" select="$pi.context"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="pi.linenumbering.width">
+ <xsl:call-template name="pi.dbhtml_linenumbering.width">
+ <xsl:with-param name="node" select="$pi.context"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <!-- Construct the 'in-context' values -->
+ <xsl:variable name="linenumbering.everyNth">
+ <xsl:choose>
+ <xsl:when test="$pi.linenumbering.everyNth != ''">
+ <xsl:value-of select="$pi.linenumbering.everyNth"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$global.linenumbering.everyNth"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="linenumbering.separator">
+ <xsl:choose>
+ <xsl:when test="$pi.linenumbering.separator != ''">
+ <xsl:value-of select="$pi.linenumbering.separator"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$global.linenumbering.separator"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="linenumbering.width">
+ <xsl:choose>
+ <xsl:when test="$pi.linenumbering.width != ''">
+ <xsl:value-of select="$pi.linenumbering.width"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$global.linenumbering.width"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="linenumbering.startinglinenumber">
+ <xsl:choose>
+ <xsl:when test="$pi.context/@startinglinenumber">
+ <xsl:value-of select="$pi.context/@startinglinenumber"/>
+ </xsl:when>
+ <xsl:when test="$pi.context/@continuation='continues'">
+ <xsl:variable name="lastLine">
+ <xsl:choose>
+ <xsl:when test="$pi.context/self::programlisting">
+ <xsl:call-template name="lastLineNumber">
+ <xsl:with-param name="listings"
+ select="preceding::programlisting[@linenumbering='numbered']"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="$pi.context/self::screen">
+ <xsl:call-template name="lastLineNumber">
+ <xsl:with-param name="listings"
+ select="preceding::screen[@linenumbering='numbered']"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="$pi.context/self::literallayout">
+ <xsl:call-template name="lastLineNumber">
+ <xsl:with-param name="listings"
+ select="preceding::literallayout[@linenumbering='numbered']"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="$pi.context/self::address">
+ <xsl:call-template name="lastLineNumber">
+ <xsl:with-param name="listings"
+ select="preceding::address[@linenumbering='numbered']"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="$pi.context/self::synopsis">
+ <xsl:call-template name="lastLineNumber">
+ <xsl:with-param name="listings"
+ select="preceding::synopsis[@linenumbering='numbered']"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:message>
+ <xsl:text>Unexpected verbatim environment: </xsl:text>
+ <xsl:value-of select="local-name($pi.context)"/>
+ </xsl:message>
+ <xsl:value-of select="0"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:value-of select="$lastLine + 1"/>
+ </xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="function-available('sverb:numberLines')">
+ <xsl:copy-of select="sverb:numberLines($rtf)"/>
+ </xsl:when>
+ <xsl:when test="function-available('xverb:numberLines')">
+ <xsl:copy-of select="xverb:numberLines($rtf)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:message terminate="yes">
+ <xsl:text>No numberLines function available.</xsl:text>
+ </xsl:message>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="make-verbatim">
+ <xsl:param name="rtf"/>
+
+ <!-- I want to make this RTF verbatim. There are two possibilities: either
+ I have access to the exsl:node-set extension function and I can "do it right"
+ or I have to rely on CSS. -->
+
+ <xsl:choose>
+ <xsl:when test="$exsl.node.set.available != 0">
+ <xsl:apply-templates select="exsl:node-set($rtf)" mode="make.verbatim.mode"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <span style="white-space: pre;">
+ <xsl:copy-of select="$rtf"/>
+ </span>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ======================================================================== -->
+
+<xsl:template name="lastLineNumber">
+ <xsl:param name="listings"/>
+ <xsl:param name="number" select="0"/>
+
+ <xsl:variable name="lines">
+ <xsl:call-template name="countLines">
+ <xsl:with-param name="listing" select="string($listings[1])"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="not($listings)">
+ <xsl:value-of select="$number"/>
+ </xsl:when>
+ <xsl:when test="$listings[1]/@startinglinenumber">
+ <xsl:value-of select="$number + $listings[1]/@startinglinenumber + $lines - 1"/>
+ </xsl:when>
+ <xsl:when test="$listings[1]/@continuation='continues'">
+ <xsl:call-template name="lastLineNumber">
+ <xsl:with-param name="listings" select="listings[position() &gt; 1]"/>
+ <xsl:with-param name="number" select="$number + $lines"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$lines"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="countLines">
+ <xsl:param name="listing"/>
+ <xsl:param name="count" select="1"/>
+
+ <xsl:choose>
+ <xsl:when test="contains($listing, '&#10;')">
+ <xsl:call-template name="countLines">
+ <xsl:with-param name="listing" select="substring-after($listing, '&#10;')"/>
+ <xsl:with-param name="count" select="$count + 1"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$count"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/xref.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/xref.xsl
new file mode 100644
index 0000000..771bca5
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/html/xref.xsl
@@ -0,0 +1,1377 @@
+<?xml version='1.0'?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:suwl="http://nwalsh.com/xslt/ext/com.nwalsh.saxon.UnwrapLinks"
+ xmlns:exsl="http://exslt.org/common"
+ xmlns:xlink='http://www.w3.org/1999/xlink'
+ exclude-result-prefixes="suwl exsl xlink"
+ version='1.0'>
+
+<!-- ********************************************************************
+ $Id: xref.xsl 8421 2009-05-04 07:49:49Z bobstayton $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<!-- Use internal variable for olink xlink role for consistency -->
+<xsl:variable
+ name="xolink.role">http://docbook.org/xlink/role/olink</xsl:variable>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="anchor">
+ <xsl:call-template name="anchor"/>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="xref" name="xref">
+ <xsl:param name="xhref" select="@xlink:href"/>
+ <!-- is the @xlink:href a local idref link? -->
+ <xsl:param name="xlink.idref">
+ <xsl:if test="starts-with($xhref,'#')
+ and (not(contains($xhref,'&#40;'))
+ or starts-with($xhref, '#xpointer&#40;id&#40;'))">
+ <xsl:call-template name="xpointer.idref">
+ <xsl:with-param name="xpointer" select="$xhref"/>
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:param>
+ <xsl:param name="xlink.targets" select="key('id',$xlink.idref)"/>
+ <xsl:param name="linkend.targets" select="key('id',@linkend)"/>
+ <xsl:param name="target" select="($xlink.targets | $linkend.targets)[1]"/>
+
+ <xsl:variable name="xrefstyle">
+ <xsl:choose>
+ <xsl:when test="@role and not(@xrefstyle)
+ and $use.role.as.xrefstyle != 0">
+ <xsl:value-of select="@role"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="@xrefstyle"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:call-template name="anchor"/>
+
+ <xsl:variable name="content">
+ <xsl:choose>
+
+ <xsl:when test="@endterm">
+ <xsl:variable name="etargets" select="key('id',@endterm)"/>
+ <xsl:variable name="etarget" select="$etargets[1]"/>
+ <xsl:choose>
+ <xsl:when test="count($etarget) = 0">
+ <xsl:message>
+ <xsl:value-of select="count($etargets)"/>
+ <xsl:text>Endterm points to nonexistent ID: </xsl:text>
+ <xsl:value-of select="@endterm"/>
+ </xsl:message>
+ <xsl:text>???</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="$etarget" mode="endterm"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+
+ <xsl:when test="$target/@xreflabel">
+ <xsl:call-template name="xref.xreflabel">
+ <xsl:with-param name="target" select="$target"/>
+ </xsl:call-template>
+ </xsl:when>
+
+ <xsl:when test="$target">
+ <xsl:if test="not(parent::citation)">
+ <xsl:apply-templates select="$target" mode="xref-to-prefix"/>
+ </xsl:if>
+
+ <xsl:apply-templates select="$target" mode="xref-to">
+ <xsl:with-param name="referrer" select="."/>
+ <xsl:with-param name="xrefstyle" select="$xrefstyle"/>
+ </xsl:apply-templates>
+
+ <xsl:if test="not(parent::citation)">
+ <xsl:apply-templates select="$target" mode="xref-to-suffix"/>
+ </xsl:if>
+ </xsl:when>
+
+ <xsl:otherwise>
+ <xsl:message>
+ <xsl:text>ERROR: xref linking to </xsl:text>
+ <xsl:value-of select="@linkend|@xlink:href"/>
+ <xsl:text> has no generated link text.</xsl:text>
+ </xsl:message>
+ <xsl:text>???</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:call-template name="simple.xlink">
+ <xsl:with-param name="content" select="$content"/>
+ </xsl:call-template>
+
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<!-- biblioref handled largely like an xref -->
+<!-- To be done: add support for begin, end, and units attributes -->
+<xsl:template match="biblioref">
+ <xsl:variable name="targets" select="key('id',@linkend)"/>
+ <xsl:variable name="target" select="$targets[1]"/>
+ <xsl:variable name="refelem" select="local-name($target)"/>
+
+ <xsl:call-template name="check.id.unique">
+ <xsl:with-param name="linkend" select="@linkend"/>
+ </xsl:call-template>
+
+ <xsl:call-template name="anchor"/>
+
+ <xsl:choose>
+ <xsl:when test="count($target) = 0">
+ <xsl:message>
+ <xsl:text>XRef to nonexistent id: </xsl:text>
+ <xsl:value-of select="@linkend"/>
+ </xsl:message>
+ <xsl:text>???</xsl:text>
+ </xsl:when>
+
+ <xsl:when test="@endterm">
+ <xsl:variable name="href">
+ <xsl:call-template name="href.target">
+ <xsl:with-param name="object" select="$target"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="etargets" select="key('id',@endterm)"/>
+ <xsl:variable name="etarget" select="$etargets[1]"/>
+ <xsl:choose>
+ <xsl:when test="count($etarget) = 0">
+ <xsl:message>
+ <xsl:value-of select="count($etargets)"/>
+ <xsl:text>Endterm points to nonexistent ID: </xsl:text>
+ <xsl:value-of select="@endterm"/>
+ </xsl:message>
+ <a href="{$href}">
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:text>???</xsl:text>
+ </a>
+ </xsl:when>
+ <xsl:otherwise>
+ <a href="{$href}">
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates select="$etarget" mode="endterm"/>
+ </a>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+
+ <xsl:when test="$target/@xreflabel">
+ <a>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:attribute name="href">
+ <xsl:call-template name="href.target">
+ <xsl:with-param name="object" select="$target"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:call-template name="xref.xreflabel">
+ <xsl:with-param name="target" select="$target"/>
+ </xsl:call-template>
+ </a>
+ </xsl:when>
+
+ <xsl:otherwise>
+ <xsl:variable name="href">
+ <xsl:call-template name="href.target">
+ <xsl:with-param name="object" select="$target"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:if test="not(parent::citation)">
+ <xsl:apply-templates select="$target" mode="xref-to-prefix"/>
+ </xsl:if>
+
+ <a href="{$href}">
+ <xsl:apply-templates select="." mode="class.attribute"/>
+ <xsl:if test="$target/title or $target/*/title">
+ <xsl:attribute name="title">
+ <xsl:apply-templates select="$target" mode="xref-title"/>
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:apply-templates select="$target" mode="xref-to">
+ <xsl:with-param name="referrer" select="."/>
+ <xsl:with-param name="xrefstyle">
+ <xsl:choose>
+ <xsl:when test="@role and not(@xrefstyle) and $use.role.as.xrefstyle != 0">
+ <xsl:value-of select="@role"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="@xrefstyle"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:with-param>
+ </xsl:apply-templates>
+ </a>
+
+ <xsl:if test="not(parent::citation)">
+ <xsl:apply-templates select="$target" mode="xref-to-suffix"/>
+ </xsl:if>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="*" mode="endterm">
+ <!-- Process the children of the endterm element -->
+ <xsl:variable name="endterm">
+ <xsl:apply-templates select="child::node()"/>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="$exsl.node.set.available != 0">
+ <xsl:apply-templates select="exsl:node-set($endterm)" mode="remove-ids"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:copy-of select="$endterm"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="*" mode="remove-ids">
+ <xsl:choose>
+ <!-- handle html or xhtml -->
+ <xsl:when test="local-name(.) = 'a'
+ and (namespace-uri(.) = ''
+ or namespace-uri(.) = 'http://www.w3.org/1999/xhtml')">
+ <xsl:choose>
+ <xsl:when test="(@name and count(@*) = 1)
+ or (@id and count(@*) = 1)
+ or (@xml:id and count(@*) = 1)
+ or (@xml:id and @name and count(@*) = 2)
+ or (@id and @name and count(@*) = 2)">
+ <xsl:message>suppress anchor</xsl:message>
+ <!-- suppress the whole thing -->
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:copy>
+ <xsl:for-each select="@*">
+ <xsl:choose>
+ <xsl:when test="local-name(.) != 'name' and local-name(.) != 'id'">
+ <xsl:copy/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:message>removing <xsl:value-of
+ select="local-name(.)"/></xsl:message>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:for-each>
+ </xsl:copy>
+ <xsl:apply-templates mode="remove-ids"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:copy>
+ <xsl:for-each select="@*">
+ <xsl:choose>
+ <xsl:when test="local-name(.) != 'id'">
+ <xsl:copy/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:message>removing <xsl:value-of
+ select="local-name(.)"/></xsl:message>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:for-each>
+ <xsl:apply-templates mode="remove-ids"/>
+ </xsl:copy>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="*" mode="xref-to-prefix"/>
+<xsl:template match="*" mode="xref-to-suffix"/>
+
+<xsl:template match="*" mode="xref-to">
+ <xsl:param name="referrer"/>
+ <xsl:param name="xrefstyle"/>
+ <xsl:param name="verbose" select="1"/>
+
+ <xsl:if test="$verbose">
+ <xsl:message>
+ <xsl:text>Don't know what gentext to create for xref to: "</xsl:text>
+ <xsl:value-of select="name(.)"/>
+ <xsl:text>", ("</xsl:text>
+ <xsl:value-of select="(@id|@xml:id)[1]"/>
+ <xsl:text>")</xsl:text>
+ </xsl:message>
+ </xsl:if>
+ <xsl:text>???</xsl:text>
+</xsl:template>
+
+<xsl:template match="title" mode="xref-to">
+ <xsl:param name="referrer"/>
+ <xsl:param name="xrefstyle"/>
+ <xsl:param name="verbose" select="1"/>
+
+ <!-- if you xref to a title, xref to the parent... -->
+ <xsl:choose>
+ <!-- FIXME: how reliable is this? -->
+ <xsl:when test="contains(local-name(parent::*), 'info')">
+ <xsl:apply-templates select="parent::*[2]" mode="xref-to">
+ <xsl:with-param name="referrer" select="$referrer"/>
+ <xsl:with-param name="xrefstyle" select="$xrefstyle"/>
+ <xsl:with-param name="verbose" select="$verbose"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="parent::*" mode="xref-to">
+ <xsl:with-param name="referrer" select="$referrer"/>
+ <xsl:with-param name="xrefstyle" select="$xrefstyle"/>
+ <xsl:with-param name="verbose" select="$verbose"/>
+ </xsl:apply-templates>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="abstract|authorblurb|personblurb|bibliodiv|bibliomset
+ |biblioset|blockquote|calloutlist|caution|colophon
+ |constraintdef|formalpara|glossdiv|important|indexdiv
+ |itemizedlist|legalnotice|lot|msg|msgexplan|msgmain
+ |msgrel|msgset|msgsub|note|orderedlist|partintro
+ |productionset|qandadiv|refsynopsisdiv|segmentedlist
+ |set|setindex|sidebar|tip|toc|variablelist|warning"
+ mode="xref-to">
+ <xsl:param name="referrer"/>
+ <xsl:param name="xrefstyle"/>
+ <xsl:param name="verbose" select="1"/>
+
+ <!-- catch-all for things with (possibly optional) titles -->
+ <xsl:apply-templates select="." mode="object.xref.markup">
+ <xsl:with-param name="purpose" select="'xref'"/>
+ <xsl:with-param name="xrefstyle" select="$xrefstyle"/>
+ <xsl:with-param name="referrer" select="$referrer"/>
+ <xsl:with-param name="verbose" select="$verbose"/>
+ </xsl:apply-templates>
+</xsl:template>
+
+<xsl:template match="author|editor|othercredit|personname" mode="xref-to">
+ <xsl:param name="referrer"/>
+ <xsl:param name="xrefstyle"/>
+
+ <xsl:call-template name="person.name"/>
+</xsl:template>
+
+<xsl:template match="authorgroup" mode="xref-to">
+ <xsl:param name="referrer"/>
+ <xsl:param name="xrefstyle"/>
+
+ <xsl:call-template name="person.name.list"/>
+</xsl:template>
+
+<xsl:template match="figure|example|table|equation" mode="xref-to">
+ <xsl:param name="referrer"/>
+ <xsl:param name="xrefstyle"/>
+ <xsl:param name="verbose" select="1"/>
+
+ <xsl:apply-templates select="." mode="object.xref.markup">
+ <xsl:with-param name="purpose" select="'xref'"/>
+ <xsl:with-param name="xrefstyle" select="$xrefstyle"/>
+ <xsl:with-param name="referrer" select="$referrer"/>
+ <xsl:with-param name="verbose" select="$verbose"/>
+ </xsl:apply-templates>
+</xsl:template>
+
+<xsl:template match="procedure" mode="xref-to">
+ <xsl:param name="referrer"/>
+ <xsl:param name="xrefstyle"/>
+ <xsl:param name="verbose"/>
+
+ <xsl:apply-templates select="." mode="object.xref.markup">
+ <xsl:with-param name="purpose" select="'xref'"/>
+ <xsl:with-param name="xrefstyle" select="$xrefstyle"/>
+ <xsl:with-param name="referrer" select="$referrer"/>
+ <xsl:with-param name="verbose" select="$verbose"/>
+ </xsl:apply-templates>
+</xsl:template>
+
+<xsl:template match="task" mode="xref-to">
+ <xsl:param name="referrer"/>
+ <xsl:param name="xrefstyle"/>
+ <xsl:param name="verbose"/>
+
+ <xsl:apply-templates select="." mode="object.xref.markup">
+ <xsl:with-param name="purpose" select="'xref'"/>
+ <xsl:with-param name="xrefstyle" select="$xrefstyle"/>
+ <xsl:with-param name="referrer" select="$referrer"/>
+ <xsl:with-param name="verbose" select="$verbose"/>
+ </xsl:apply-templates>
+</xsl:template>
+
+<xsl:template match="cmdsynopsis" mode="xref-to">
+ <xsl:apply-templates select="(.//command)[1]" mode="xref"/>
+</xsl:template>
+
+<xsl:template match="funcsynopsis" mode="xref-to">
+ <xsl:apply-templates select="(.//function)[1]" mode="xref"/>
+</xsl:template>
+
+<xsl:template match="dedication|acknowledgements|preface|chapter|appendix|article" mode="xref-to">
+ <xsl:param name="referrer"/>
+ <xsl:param name="xrefstyle"/>
+ <xsl:param name="verbose" select="1"/>
+
+ <xsl:apply-templates select="." mode="object.xref.markup">
+ <xsl:with-param name="purpose" select="'xref'"/>
+ <xsl:with-param name="xrefstyle" select="$xrefstyle"/>
+ <xsl:with-param name="referrer" select="$referrer"/>
+ <xsl:with-param name="verbose" select="$verbose"/>
+ </xsl:apply-templates>
+</xsl:template>
+
+<xsl:template match="bibliography" mode="xref-to">
+ <xsl:param name="referrer"/>
+ <xsl:param name="xrefstyle"/>
+ <xsl:param name="verbose" select="1"/>
+
+ <xsl:apply-templates select="." mode="object.xref.markup">
+ <xsl:with-param name="purpose" select="'xref'"/>
+ <xsl:with-param name="xrefstyle" select="$xrefstyle"/>
+ <xsl:with-param name="referrer" select="$referrer"/>
+ <xsl:with-param name="verbose" select="$verbose"/>
+ </xsl:apply-templates>
+</xsl:template>
+
+<xsl:template match="biblioentry|bibliomixed" mode="xref-to-prefix">
+ <xsl:text>[</xsl:text>
+</xsl:template>
+
+<xsl:template match="biblioentry|bibliomixed" mode="xref-to-suffix">
+ <xsl:text>]</xsl:text>
+</xsl:template>
+
+<xsl:template match="biblioentry|bibliomixed" mode="xref-to">
+ <xsl:param name="referrer"/>
+ <xsl:param name="xrefstyle"/>
+ <xsl:param name="verbose" select="1"/>
+
+ <!-- handles both biblioentry and bibliomixed -->
+ <xsl:choose>
+ <xsl:when test="string(.) = ''">
+ <xsl:variable name="bib" select="document($bibliography.collection,.)"/>
+ <xsl:variable name="id" select="(@id|@xml:id)[1]"/>
+ <xsl:variable name="entry" select="$bib/bibliography/
+ *[@id=$id or @xml:id=$id][1]"/>
+ <xsl:choose>
+ <xsl:when test="$entry">
+ <xsl:choose>
+ <xsl:when test="$bibliography.numbered != 0">
+ <xsl:number from="bibliography" count="biblioentry|bibliomixed"
+ level="any" format="1"/>
+ </xsl:when>
+ <xsl:when test="local-name($entry/*[1]) = 'abbrev'">
+ <xsl:apply-templates select="$entry/*[1]"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="(@id|@xml:id)[1]"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:message>
+ <xsl:text>No bibliography entry: </xsl:text>
+ <xsl:value-of select="$id"/>
+ <xsl:text> found in </xsl:text>
+ <xsl:value-of select="$bibliography.collection"/>
+ </xsl:message>
+ <xsl:value-of select="(@id|@xml:id)[1]"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:choose>
+ <xsl:when test="$bibliography.numbered != 0">
+ <xsl:number from="bibliography" count="biblioentry|bibliomixed"
+ level="any" format="1"/>
+ </xsl:when>
+ <xsl:when test="local-name(*[1]) = 'abbrev'">
+ <xsl:apply-templates select="*[1]"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="(@id|@xml:id)[1]"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="glossary" mode="xref-to">
+ <xsl:param name="referrer"/>
+ <xsl:param name="xrefstyle"/>
+ <xsl:param name="verbose" select="1"/>
+
+ <xsl:apply-templates select="." mode="object.xref.markup">
+ <xsl:with-param name="purpose" select="'xref'"/>
+ <xsl:with-param name="xrefstyle" select="$xrefstyle"/>
+ <xsl:with-param name="referrer" select="$referrer"/>
+ <xsl:with-param name="verbose" select="$verbose"/>
+ </xsl:apply-templates>
+</xsl:template>
+
+<xsl:template match="glossentry" mode="xref-to">
+ <xsl:param name="referrer"/>
+ <xsl:param name="xrefstyle"/>
+ <xsl:param name="verbose" select="1"/>
+ <xsl:choose>
+ <xsl:when test="$glossentry.show.acronym = 'primary'">
+ <xsl:choose>
+ <xsl:when test="acronym|abbrev">
+ <xsl:apply-templates select="(acronym|abbrev)[1]"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="glossterm[1]" mode="xref-to">
+ <xsl:with-param name="xrefstyle" select="$xrefstyle"/>
+ <xsl:with-param name="referrer" select="$referrer"/>
+ <xsl:with-param name="verbose" select="$verbose"/>
+ </xsl:apply-templates>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="glossterm[1]" mode="xref-to">
+ <xsl:with-param name="xrefstyle" select="$xrefstyle"/>
+ <xsl:with-param name="referrer" select="$referrer"/>
+ <xsl:with-param name="verbose" select="$verbose"/>
+ </xsl:apply-templates>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="glossterm|firstterm" mode="xref-to">
+ <xsl:apply-templates/>
+</xsl:template>
+
+<xsl:template match="index" mode="xref-to">
+ <xsl:param name="referrer"/>
+ <xsl:param name="xrefstyle"/>
+ <xsl:param name="verbose" select="1"/>
+
+ <xsl:apply-templates select="." mode="object.xref.markup">
+ <xsl:with-param name="purpose" select="'xref'"/>
+ <xsl:with-param name="xrefstyle" select="$xrefstyle"/>
+ <xsl:with-param name="referrer" select="$referrer"/>
+ <xsl:with-param name="verbose" select="$verbose"/>
+ </xsl:apply-templates>
+</xsl:template>
+
+<xsl:template match="listitem" mode="xref-to">
+ <xsl:param name="referrer"/>
+ <xsl:param name="xrefstyle"/>
+ <xsl:param name="verbose"/>
+
+ <xsl:apply-templates select="." mode="object.xref.markup">
+ <xsl:with-param name="purpose" select="'xref'"/>
+ <xsl:with-param name="xrefstyle" select="$xrefstyle"/>
+ <xsl:with-param name="referrer" select="$referrer"/>
+ <xsl:with-param name="verbose" select="$verbose"/>
+ </xsl:apply-templates>
+</xsl:template>
+
+<xsl:template match="section|simplesect
+ |sect1|sect2|sect3|sect4|sect5
+ |refsect1|refsect2|refsect3|refsection" mode="xref-to">
+ <xsl:param name="referrer"/>
+ <xsl:param name="xrefstyle"/>
+ <xsl:param name="verbose" select="1"/>
+
+ <xsl:apply-templates select="." mode="object.xref.markup">
+ <xsl:with-param name="purpose" select="'xref'"/>
+ <xsl:with-param name="xrefstyle" select="$xrefstyle"/>
+ <xsl:with-param name="referrer" select="$referrer"/>
+ <xsl:with-param name="verbose" select="$verbose"/>
+ </xsl:apply-templates>
+ <!-- FIXME: What about "in Chapter X"? -->
+</xsl:template>
+
+<xsl:template match="bridgehead" mode="xref-to">
+ <xsl:param name="referrer"/>
+ <xsl:param name="xrefstyle"/>
+ <xsl:param name="verbose" select="1"/>
+
+ <xsl:apply-templates select="." mode="object.xref.markup">
+ <xsl:with-param name="purpose" select="'xref'"/>
+ <xsl:with-param name="xrefstyle" select="$xrefstyle"/>
+ <xsl:with-param name="referrer" select="$referrer"/>
+ <xsl:with-param name="verbose" select="$verbose"/>
+ </xsl:apply-templates>
+ <!-- FIXME: What about "in Chapter X"? -->
+</xsl:template>
+
+<xsl:template match="qandaset" mode="xref-to">
+ <xsl:param name="referrer"/>
+ <xsl:param name="xrefstyle"/>
+ <xsl:param name="verbose" select="1"/>
+
+ <xsl:apply-templates select="." mode="object.xref.markup">
+ <xsl:with-param name="purpose" select="'xref'"/>
+ <xsl:with-param name="xrefstyle" select="$xrefstyle"/>
+ <xsl:with-param name="referrer" select="$referrer"/>
+ <xsl:with-param name="verbose" select="$verbose"/>
+ </xsl:apply-templates>
+</xsl:template>
+
+<xsl:template match="qandadiv" mode="xref-to">
+ <xsl:param name="referrer"/>
+ <xsl:param name="xrefstyle"/>
+ <xsl:param name="verbose" select="1"/>
+
+ <xsl:apply-templates select="." mode="object.xref.markup">
+ <xsl:with-param name="purpose" select="'xref'"/>
+ <xsl:with-param name="xrefstyle" select="$xrefstyle"/>
+ <xsl:with-param name="referrer" select="$referrer"/>
+ <xsl:with-param name="verbose" select="$verbose"/>
+ </xsl:apply-templates>
+</xsl:template>
+
+<xsl:template match="qandaentry" mode="xref-to">
+ <xsl:param name="referrer"/>
+ <xsl:param name="xrefstyle"/>
+ <xsl:param name="verbose" select="1"/>
+
+ <xsl:apply-templates select="question[1]" mode="xref-to">
+ <xsl:with-param name="xrefstyle" select="$xrefstyle"/>
+ <xsl:with-param name="referrer" select="$referrer"/>
+ <xsl:with-param name="verbose" select="$verbose"/>
+ </xsl:apply-templates>
+</xsl:template>
+
+<xsl:template match="question|answer" mode="xref-to">
+ <xsl:param name="referrer"/>
+ <xsl:param name="xrefstyle"/>
+ <xsl:param name="verbose" select="1"/>
+
+ <xsl:choose>
+ <xsl:when test="string-length(label) != 0">
+ <xsl:apply-templates select="." mode="label.markup"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="." mode="object.xref.markup">
+ <xsl:with-param name="purpose" select="'xref'"/>
+ <xsl:with-param name="xrefstyle" select="$xrefstyle"/>
+ <xsl:with-param name="referrer" select="$referrer"/>
+ <xsl:with-param name="verbose" select="$verbose"/>
+ </xsl:apply-templates>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="part|reference" mode="xref-to">
+ <xsl:param name="referrer"/>
+ <xsl:param name="xrefstyle"/>
+ <xsl:param name="verbose" select="1"/>
+
+ <xsl:apply-templates select="." mode="object.xref.markup">
+ <xsl:with-param name="purpose" select="'xref'"/>
+ <xsl:with-param name="xrefstyle" select="$xrefstyle"/>
+ <xsl:with-param name="referrer" select="$referrer"/>
+ <xsl:with-param name="verbose" select="$verbose"/>
+ </xsl:apply-templates>
+</xsl:template>
+
+<xsl:template match="refentry" mode="xref-to">
+ <xsl:param name="referrer"/>
+ <xsl:param name="xrefstyle"/>
+
+ <xsl:choose>
+ <xsl:when test="refmeta/refentrytitle">
+ <xsl:apply-templates select="refmeta/refentrytitle"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="refnamediv/refname[1]"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:apply-templates select="refmeta/manvolnum"/>
+</xsl:template>
+
+<xsl:template match="refnamediv" mode="xref-to">
+ <xsl:param name="referrer"/>
+ <xsl:param name="xrefstyle"/>
+ <xsl:param name="verbose" select="1"/>
+
+ <xsl:apply-templates select="refname[1]" mode="xref-to">
+ <xsl:with-param name="xrefstyle" select="$xrefstyle"/>
+ <xsl:with-param name="referrer" select="$referrer"/>
+ <xsl:with-param name="verbose" select="$verbose"/>
+ </xsl:apply-templates>
+</xsl:template>
+
+<xsl:template match="refname" mode="xref-to">
+ <xsl:param name="referrer"/>
+ <xsl:param name="xrefstyle"/>
+ <xsl:param name="verbose" select="1"/>
+
+ <xsl:apply-templates mode="xref-to"/>
+</xsl:template>
+
+<xsl:template match="step" mode="xref-to">
+ <xsl:param name="referrer"/>
+ <xsl:param name="xrefstyle"/>
+
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'Step'"/>
+ </xsl:call-template>
+ <xsl:text> </xsl:text>
+ <xsl:apply-templates select="." mode="number"/>
+</xsl:template>
+
+<xsl:template match="varlistentry" mode="xref-to">
+ <xsl:param name="referrer"/>
+ <xsl:param name="xrefstyle"/>
+ <xsl:param name="verbose" select="1"/>
+
+ <xsl:apply-templates select="term[1]" mode="xref-to">
+ <xsl:with-param name="xrefstyle" select="$xrefstyle"/>
+ <xsl:with-param name="referrer" select="$referrer"/>
+ <xsl:with-param name="verbose" select="$verbose"/>
+ </xsl:apply-templates>
+</xsl:template>
+
+<xsl:template match="primary|secondary|tertiary" mode="xref-to">
+ <xsl:value-of select="."/>
+</xsl:template>
+
+<xsl:template match="indexterm" mode="xref-to">
+ <xsl:value-of select="primary"/>
+</xsl:template>
+
+<xsl:template match="varlistentry/term" mode="xref-to">
+ <xsl:param name="referrer"/>
+ <xsl:param name="xrefstyle"/>
+
+ <!-- to avoid the comma that will be generated if there are several terms -->
+ <xsl:apply-templates/>
+</xsl:template>
+
+<xsl:template match="co" mode="xref-to">
+ <xsl:param name="referrer"/>
+ <xsl:param name="xrefstyle"/>
+
+ <xsl:apply-templates select="." mode="callout-bug"/>
+</xsl:template>
+
+<xsl:template match="area|areaset" mode="xref-to">
+ <xsl:param name="referrer"/>
+ <xsl:param name="xrefstyle"/>
+
+ <xsl:call-template name="callout-bug">
+ <xsl:with-param name="conum">
+ <xsl:apply-templates select="." mode="conumber"/>
+ </xsl:with-param>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="book" mode="xref-to">
+ <xsl:param name="referrer"/>
+ <xsl:param name="xrefstyle"/>
+ <xsl:param name="verbose" select="1"/>
+
+ <xsl:apply-templates select="." mode="object.xref.markup">
+ <xsl:with-param name="purpose" select="'xref'"/>
+ <xsl:with-param name="xrefstyle" select="$xrefstyle"/>
+ <xsl:with-param name="referrer" select="$referrer"/>
+ <xsl:with-param name="verbose" select="$verbose"/>
+ </xsl:apply-templates>
+</xsl:template>
+
+<!-- These are elements for which no link text exists, so an xref to one
+ uses the xrefstyle attribute if specified, or if not it falls back
+ to the container element's link text -->
+<xsl:template match="para|phrase|simpara|anchor|quote" mode="xref-to">
+ <xsl:param name="referrer"/>
+ <xsl:param name="xrefstyle"/>
+ <xsl:param name="verbose" select="1"/>
+
+ <xsl:variable name="context" select="(ancestor::simplesect
+ |ancestor::section
+ |ancestor::sect1
+ |ancestor::sect2
+ |ancestor::sect3
+ |ancestor::sect4
+ |ancestor::sect5
+ |ancestor::refsection
+ |ancestor::refsect1
+ |ancestor::refsect2
+ |ancestor::refsect3
+ |ancestor::chapter
+ |ancestor::appendix
+ |ancestor::preface
+ |ancestor::partintro
+ |ancestor::dedication
+ |ancestor::acknowledgements
+ |ancestor::colophon
+ |ancestor::bibliography
+ |ancestor::index
+ |ancestor::glossary
+ |ancestor::glossentry
+ |ancestor::listitem
+ |ancestor::varlistentry)[last()]"/>
+
+ <xsl:choose>
+ <xsl:when test="$xrefstyle != ''">
+ <xsl:apply-templates select="." mode="object.xref.markup">
+ <xsl:with-param name="xrefstyle" select="$xrefstyle"/>
+ <xsl:with-param name="referrer" select="$referrer"/>
+ <xsl:with-param name="verbose" select="$verbose"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="$context" mode="xref-to">
+ <xsl:with-param name="purpose" select="'xref'"/>
+ <xsl:with-param name="xrefstyle" select="$xrefstyle"/>
+ <xsl:with-param name="referrer" select="$referrer"/>
+ <xsl:with-param name="verbose" select="$verbose"/>
+ </xsl:apply-templates>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="*" mode="xref-title">
+ <xsl:variable name="title">
+ <xsl:apply-templates select="." mode="object.title.markup"/>
+ </xsl:variable>
+
+ <xsl:value-of select="$title"/>
+</xsl:template>
+
+<xsl:template match="author" mode="xref-title">
+ <xsl:variable name="title">
+ <xsl:call-template name="person.name"/>
+ </xsl:variable>
+
+ <xsl:value-of select="$title"/>
+</xsl:template>
+
+<xsl:template match="authorgroup" mode="xref-title">
+ <xsl:variable name="title">
+ <xsl:call-template name="person.name.list"/>
+ </xsl:variable>
+
+ <xsl:value-of select="$title"/>
+</xsl:template>
+
+<xsl:template match="cmdsynopsis" mode="xref-title">
+ <xsl:variable name="title">
+ <xsl:apply-templates select="(.//command)[1]" mode="xref"/>
+ </xsl:variable>
+
+ <xsl:value-of select="$title"/>
+</xsl:template>
+
+<xsl:template match="funcsynopsis" mode="xref-title">
+ <xsl:variable name="title">
+ <xsl:apply-templates select="(.//function)[1]" mode="xref"/>
+ </xsl:variable>
+
+ <xsl:value-of select="$title"/>
+</xsl:template>
+
+<xsl:template match="biblioentry|bibliomixed" mode="xref-title">
+ <!-- handles both biblioentry and bibliomixed -->
+ <xsl:variable name="title">
+ <xsl:text>[</xsl:text>
+ <xsl:choose>
+ <xsl:when test="local-name(*[1]) = 'abbrev'">
+ <xsl:apply-templates select="*[1]"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="(@id|@xml:id)[1]"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:text>]</xsl:text>
+ </xsl:variable>
+
+ <xsl:value-of select="$title"/>
+</xsl:template>
+
+<xsl:template match="step" mode="xref-title">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'Step'"/>
+ </xsl:call-template>
+ <xsl:text> </xsl:text>
+ <xsl:apply-templates select="." mode="number"/>
+</xsl:template>
+
+<xsl:template match="step[not(./title)]" mode="title.markup">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'Step'"/>
+ </xsl:call-template>
+ <xsl:text> </xsl:text>
+ <xsl:apply-templates select="." mode="number"/>
+</xsl:template>
+
+<xsl:template match="co" mode="xref-title">
+ <xsl:variable name="title">
+ <xsl:apply-templates select="." mode="callout-bug"/>
+ </xsl:variable>
+
+ <xsl:value-of select="$title"/>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="link" name="link">
+ <xsl:param name="linkend" select="@linkend"/>
+ <xsl:param name="a.target"/>
+ <xsl:param name="xhref" select="@xlink:href"/>
+
+ <xsl:variable name="content">
+ <xsl:call-template name="anchor"/>
+ <xsl:choose>
+ <xsl:when test="count(child::node()) &gt; 0">
+ <!-- If it has content, use it -->
+ <xsl:apply-templates/>
+ </xsl:when>
+ <!-- else look for an endterm -->
+ <xsl:when test="@endterm">
+ <xsl:variable name="etargets" select="key('id',@endterm)"/>
+ <xsl:variable name="etarget" select="$etargets[1]"/>
+ <xsl:choose>
+ <xsl:when test="count($etarget) = 0">
+ <xsl:message>
+ <xsl:value-of select="count($etargets)"/>
+ <xsl:text>Endterm points to nonexistent ID: </xsl:text>
+ <xsl:value-of select="@endterm"/>
+ </xsl:message>
+ <xsl:text>???</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="$etarget" mode="endterm"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <!-- Use the xlink:href if no other text -->
+ <xsl:when test="@xlink:href">
+ <xsl:value-of select="@xlink:href"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:message>
+ <xsl:text>Link element has no content and no Endterm. </xsl:text>
+ <xsl:text>Nothing to show in the link to </xsl:text>
+ <xsl:value-of select="(@xlink:href|@linkend)[1]"/>
+ </xsl:message>
+ <xsl:text>???</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:call-template name="simple.xlink">
+ <xsl:with-param name="node" select="."/>
+ <xsl:with-param name="linkend" select="$linkend"/>
+ <xsl:with-param name="content" select="$content"/>
+ <xsl:with-param name="a.target" select="$a.target"/>
+ <xsl:with-param name="xhref" select="$xhref"/>
+ </xsl:call-template>
+
+</xsl:template>
+
+<xsl:template match="ulink" name="ulink">
+ <xsl:param name="url" select="@url"/>
+ <xsl:variable name="link">
+ <a>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:if test="@id or @xml:id">
+ <xsl:attribute name="name">
+ <xsl:value-of select="(@id|@xml:id)[1]"/>
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:attribute name="href"><xsl:value-of select="$url"/></xsl:attribute>
+ <xsl:if test="$ulink.target != ''">
+ <xsl:attribute name="target">
+ <xsl:value-of select="$ulink.target"/>
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:choose>
+ <xsl:when test="count(child::node())=0">
+ <xsl:value-of select="$url"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </a>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="function-available('suwl:unwrapLinks')">
+ <xsl:copy-of select="suwl:unwrapLinks($link)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:copy-of select="$link"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="olink" name="olink">
+ <!-- olink content may be passed in from xlink olink -->
+ <xsl:param name="content" select="NOTANELEMENT"/>
+
+ <xsl:call-template name="anchor"/>
+
+ <xsl:variable name="localinfo" select="@localinfo"/>
+
+ <xsl:choose>
+ <!-- olinks resolved by stylesheet and target database -->
+ <xsl:when test="@targetdoc or @targetptr or
+ (@xlink:role=$xolink.role and
+ contains(@xlink:href, '#') )" >
+
+ <xsl:variable name="targetdoc.att">
+ <xsl:choose>
+ <xsl:when test="@targetdoc != ''">
+ <xsl:value-of select="@targetdoc"/>
+ </xsl:when>
+ <xsl:when test="@xlink:role=$xolink.role and
+ contains(@xlink:href, '#')" >
+ <xsl:value-of select="substring-before(@xlink:href, '#')"/>
+ </xsl:when>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="targetptr.att">
+ <xsl:choose>
+ <xsl:when test="@targetptr != ''">
+ <xsl:value-of select="@targetptr"/>
+ </xsl:when>
+ <xsl:when test="@xlink:role=$xolink.role and
+ contains(@xlink:href, '#')" >
+ <xsl:value-of select="substring-after(@xlink:href, '#')"/>
+ </xsl:when>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="olink.lang">
+ <xsl:call-template name="l10n.language">
+ <xsl:with-param name="xref-context" select="true()"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="target.database.filename">
+ <xsl:call-template name="select.target.database">
+ <xsl:with-param name="targetdoc.att" select="$targetdoc.att"/>
+ <xsl:with-param name="targetptr.att" select="$targetptr.att"/>
+ <xsl:with-param name="olink.lang" select="$olink.lang"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="target.database"
+ select="document($target.database.filename,/)"/>
+
+ <xsl:if test="$olink.debug != 0">
+ <xsl:message>
+ <xsl:text>Olink debug: root element of target.database '</xsl:text>
+ <xsl:value-of select="$target.database.filename"/>
+ <xsl:text>' is '</xsl:text>
+ <xsl:value-of select="local-name($target.database/*[1])"/>
+ <xsl:text>'.</xsl:text>
+ </xsl:message>
+ </xsl:if>
+
+ <xsl:variable name="olink.key">
+ <xsl:call-template name="select.olink.key">
+ <xsl:with-param name="targetdoc.att" select="$targetdoc.att"/>
+ <xsl:with-param name="targetptr.att" select="$targetptr.att"/>
+ <xsl:with-param name="olink.lang" select="$olink.lang"/>
+ <xsl:with-param name="target.database" select="$target.database"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:if test="string-length($olink.key) = 0">
+ <xsl:message>
+ <xsl:text>Error: unresolved olink: </xsl:text>
+ <xsl:text>targetdoc/targetptr = '</xsl:text>
+ <xsl:value-of select="$targetdoc.att"/>
+ <xsl:text>/</xsl:text>
+ <xsl:value-of select="$targetptr.att"/>
+ <xsl:text>'.</xsl:text>
+ </xsl:message>
+ </xsl:if>
+
+ <xsl:variable name="href">
+ <xsl:call-template name="make.olink.href">
+ <xsl:with-param name="olink.key" select="$olink.key"/>
+ <xsl:with-param name="target.database" select="$target.database"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="hottext">
+ <xsl:choose>
+ <xsl:when test="string-length($content) != 0">
+ <xsl:copy-of select="$content"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="olink.hottext">
+ <xsl:with-param name="olink.key" select="$olink.key"/>
+ <xsl:with-param name="olink.lang" select="$olink.lang"/>
+ <xsl:with-param name="target.database" select="$target.database"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="olink.docname.citation">
+ <xsl:call-template name="olink.document.citation">
+ <xsl:with-param name="olink.key" select="$olink.key"/>
+ <xsl:with-param name="target.database" select="$target.database"/>
+ <xsl:with-param name="olink.lang" select="$olink.lang"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="olink.page.citation">
+ <xsl:call-template name="olink.page.citation">
+ <xsl:with-param name="olink.key" select="$olink.key"/>
+ <xsl:with-param name="target.database" select="$target.database"/>
+ <xsl:with-param name="olink.lang" select="$olink.lang"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="$href != ''">
+ <a href="{$href}">
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:copy-of select="$hottext"/>
+ </a>
+ <xsl:copy-of select="$olink.page.citation"/>
+ <xsl:copy-of select="$olink.docname.citation"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <span class="olink"><xsl:copy-of select="$hottext"/></span>
+ <xsl:copy-of select="$olink.page.citation"/>
+ <xsl:copy-of select="$olink.docname.citation"/>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ </xsl:when>
+
+ <!-- Or use old olink mechanism -->
+ <xsl:otherwise>
+ <xsl:variable name="href">
+ <xsl:choose>
+ <xsl:when test="@linkmode">
+ <!-- use the linkmode to get the base URI, use localinfo as fragid -->
+ <xsl:variable name="modespec" select="key('id',@linkmode)"/>
+ <xsl:if test="count($modespec) != 1
+ or local-name($modespec) != 'modespec'">
+ <xsl:message>Warning: olink linkmode pointer is wrong.</xsl:message>
+ </xsl:if>
+ <xsl:value-of select="$modespec"/>
+ <xsl:if test="@localinfo">
+ <xsl:text>#</xsl:text>
+ <xsl:value-of select="@localinfo"/>
+ </xsl:if>
+ </xsl:when>
+ <xsl:when test="@type = 'href'">
+ <xsl:call-template name="olink.outline">
+ <xsl:with-param name="outline.base.uri"
+ select="unparsed-entity-uri(@targetdocent)"/>
+ <xsl:with-param name="localinfo" select="@localinfo"/>
+ <xsl:with-param name="return" select="'href'"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$olink.resolver"/>
+ <xsl:text>?</xsl:text>
+ <xsl:value-of select="$olink.sysid"/>
+ <xsl:value-of select="unparsed-entity-uri(@targetdocent)"/>
+ <!-- XSL gives no access to the public identifier (grumble...) -->
+ <xsl:if test="@localinfo">
+ <xsl:text>&amp;</xsl:text>
+ <xsl:value-of select="$olink.fragid"/>
+ <xsl:value-of select="@localinfo"/>
+ </xsl:if>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="$href != ''">
+ <a href="{$href}">
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:call-template name="olink.hottext"/>
+ </a>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="olink.hottext"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="*" mode="pagenumber.markup">
+ <!-- no-op in HTML -->
+</xsl:template>
+
+
+<xsl:template name="olink.outline">
+ <xsl:param name="outline.base.uri"/>
+ <xsl:param name="localinfo"/>
+ <xsl:param name="return" select="href"/>
+
+ <xsl:variable name="outline-file"
+ select="concat($outline.base.uri,
+ $olink.outline.ext)"/>
+
+ <xsl:variable name="outline" select="document($outline-file,.)/div"/>
+
+ <xsl:variable name="node-href">
+ <xsl:choose>
+ <xsl:when test="$localinfo != ''">
+ <xsl:variable name="node" select="$outline//
+ *[@id=$localinfo or @xml:id=$localinfo]"/>
+ <xsl:value-of select="$node/@href"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$outline/@href"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="node-xref">
+ <xsl:choose>
+ <xsl:when test="$localinfo != ''">
+ <xsl:variable name="node" select="$outline//
+ *[@id=$localinfo or @xml:id=$localinfo]"/>
+ <xsl:copy-of select="$node/xref"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$outline/xref"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="$return = 'href'">
+ <xsl:value-of select="$node-href"/>
+ </xsl:when>
+ <xsl:when test="$return = 'xref'">
+ <xsl:value-of select="$node-xref"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:copy-of select="$node-xref"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template name="xref.xreflabel">
+ <!-- called to process an xreflabel...you might use this to make -->
+ <!-- xreflabels come out in the right font for different targets, -->
+ <!-- for example. -->
+ <xsl:param name="target" select="."/>
+ <xsl:value-of select="$target/@xreflabel"/>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="title" mode="xref">
+ <xsl:apply-templates/>
+</xsl:template>
+
+<xsl:template match="command" mode="xref">
+ <xsl:call-template name="inline.boldseq"/>
+</xsl:template>
+
+<xsl:template match="function" mode="xref">
+ <xsl:call-template name="inline.monoseq"/>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="*" mode="insert.title.markup">
+ <xsl:param name="purpose"/>
+ <xsl:param name="xrefstyle"/>
+ <xsl:param name="title"/>
+
+ <xsl:choose>
+ <!-- FIXME: what about the case where titleabbrev is inside the info? -->
+ <xsl:when test="$purpose = 'xref' and titleabbrev">
+ <xsl:apply-templates select="." mode="titleabbrev.markup"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:copy-of select="$title"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="chapter|appendix" mode="insert.title.markup">
+ <xsl:param name="purpose"/>
+ <xsl:param name="xrefstyle"/>
+ <xsl:param name="title"/>
+
+ <xsl:choose>
+ <xsl:when test="$purpose = 'xref'">
+ <i>
+ <xsl:copy-of select="$title"/>
+ </i>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:copy-of select="$title"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="*" mode="insert.subtitle.markup">
+ <xsl:param name="purpose"/>
+ <xsl:param name="xrefstyle"/>
+ <xsl:param name="subtitle"/>
+
+ <xsl:copy-of select="$subtitle"/>
+</xsl:template>
+
+<xsl:template match="*" mode="insert.label.markup">
+ <xsl:param name="purpose"/>
+ <xsl:param name="xrefstyle"/>
+ <xsl:param name="label"/>
+
+ <xsl:copy-of select="$label"/>
+</xsl:template>
+
+<xsl:template match="*" mode="insert.pagenumber.markup">
+ <xsl:param name="purpose"/>
+ <xsl:param name="xrefstyle"/>
+ <xsl:param name="pagenumber"/>
+
+ <xsl:copy-of select="$pagenumber"/>
+</xsl:template>
+
+<xsl:template match="*" mode="insert.direction.markup">
+ <xsl:param name="purpose"/>
+ <xsl:param name="xrefstyle"/>
+ <xsl:param name="direction"/>
+
+ <xsl:copy-of select="$direction"/>
+</xsl:template>
+
+<xsl:template match="*" mode="insert.olink.docname.markup">
+ <xsl:param name="purpose"/>
+ <xsl:param name="xrefstyle"/>
+ <xsl:param name="docname"/>
+
+ <span class="olinkdocname">
+ <xsl:copy-of select="$docname"/>
+ </span>
+
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/htmlhelp/htmlhelp-common.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/htmlhelp/htmlhelp-common.xsl
new file mode 100644
index 0000000..303b81e
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/htmlhelp/htmlhelp-common.xsl
@@ -0,0 +1,1120 @@
+<?xml version="1.0"?>
+<!DOCTYPE xsl:stylesheet [
+<!ENTITY lf '<xsl:text xmlns:xsl="http://www.w3.org/1999/XSL/Transform">&#xA;</xsl:text>'>
+]>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:doc="http://nwalsh.com/xsl/documentation/1.0"
+ xmlns:exsl="http://exslt.org/common"
+ xmlns:set="http://exslt.org/sets"
+ xmlns:h="urn:x-hex"
+ xmlns:ng="http://docbook.org/docbook-ng"
+ xmlns:db="http://docbook.org/ns/docbook"
+ version="1.0"
+ exclude-result-prefixes="doc exsl set h db ng">
+
+<!-- ********************************************************************
+ $Id: htmlhelp-common.xsl 8400 2009-04-08 07:44:54Z bobstayton $
+ ******************************************************************** -->
+
+<!-- ==================================================================== -->
+<!-- Customizations of standard HTML stylesheet parameters -->
+
+<!-- no navigation on pages by default, HTML Help provides its own navigation controls -->
+<xsl:param name="suppress.navigation" select="1"/>
+
+<!-- no separate HTML page with index, index is built inside CHM index pane -->
+<xsl:param name="generate.index" select="0"/>
+
+<!-- ==================================================================== -->
+
+<xsl:param name="htmlhelp.generate.index" select="//indexterm[1]|//db:indexterm[1]|//ng:indexterm[1]"/>
+
+<!-- Set up HTML Help flag -->
+<xsl:variable name="htmlhelp.output" select="1"/>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="/">
+
+ <!-- * Get a title for current doc so that we let the user -->
+ <!-- * know what document we are processing at this point. -->
+ <xsl:variable name="doc.title">
+ <xsl:call-template name="get.doc.title"/>
+ </xsl:variable>
+ <xsl:choose>
+ <!-- Hack! If someone hands us a DocBook V5.x or DocBook NG document,
+ toss the namespace and continue. Use the docbook5 namespaced
+ stylesheets for DocBook5 if you don't want to use this feature.-->
+ <xsl:when test="$exsl.node.set.available != 0
+ and (*/self::ng:* or */self::db:*)">
+ <xsl:call-template name="log.message">
+ <xsl:with-param name="level">Note</xsl:with-param>
+ <xsl:with-param name="source" select="$doc.title"/>
+ <xsl:with-param name="context-desc">
+ <xsl:text>namesp. cut</xsl:text>
+ </xsl:with-param>
+ <xsl:with-param name="message">
+ <xsl:text>stripped namespace before processing</xsl:text>
+ </xsl:with-param>
+ </xsl:call-template>
+ <xsl:variable name="nons">
+ <xsl:apply-templates mode="stripNS"/>
+ </xsl:variable>
+ <xsl:call-template name="log.message">
+ <xsl:with-param name="level">Note</xsl:with-param>
+ <xsl:with-param name="source" select="$doc.title"/>
+ <xsl:with-param name="context-desc">
+ <xsl:text>namesp. cut</xsl:text>
+ </xsl:with-param>
+ <xsl:with-param name="message">
+ <xsl:text>processing stripped document</xsl:text>
+ </xsl:with-param>
+ </xsl:call-template>
+ <xsl:apply-templates select="exsl:node-set($nons)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:if test="$htmlhelp.only != 1">
+ <xsl:choose>
+ <xsl:when test="$rootid != ''">
+ <xsl:choose>
+ <xsl:when test="count(key('id',$rootid)) = 0">
+ <xsl:message terminate="yes">
+ <xsl:text>ID '</xsl:text>
+ <xsl:value-of select="$rootid"/>
+ <xsl:text>' not found in document.</xsl:text>
+ </xsl:message>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:message>Formatting from <xsl:value-of select="$rootid"/></xsl:message>
+ <xsl:apply-templates select="key('id',$rootid)" mode="process.root"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:if test="$collect.xref.targets = 'yes' or
+ $collect.xref.targets = 'only'">
+ <xsl:apply-templates select="/" mode="collect.targets"/>
+ </xsl:if>
+ <xsl:if test="$collect.xref.targets != 'only'">
+ <xsl:apply-templates select="/" mode="process.root"/>
+ </xsl:if>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:if>
+
+
+ <xsl:if test="$collect.xref.targets != 'only'">
+ <xsl:call-template name="hhp"/>
+ <xsl:call-template name="hhc"/>
+ <xsl:if test="($rootid = '' and //processing-instruction('dbhh')) or
+ ($rootid != '' and key('id',$rootid)//processing-instruction('dbhh'))">
+ <xsl:call-template name="hh-map"/>
+ <xsl:call-template name="hh-alias"/>
+ </xsl:if>
+ <xsl:if test="$htmlhelp.generate.index">
+ <xsl:call-template name="hhk"/>
+ </xsl:if>
+ </xsl:if>
+</xsl:otherwise>
+</xsl:choose>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template name="hhp">
+ <xsl:call-template name="write.text.chunk">
+ <xsl:with-param name="filename">
+ <xsl:if test="$manifest.in.base.dir != 0">
+ <xsl:value-of select="$base.dir"/>
+ </xsl:if>
+ <xsl:value-of select="$htmlhelp.hhp"/>
+ </xsl:with-param>
+ <xsl:with-param name="method" select="'text'"/>
+ <xsl:with-param name="content">
+ <xsl:call-template name="hhp-main"/>
+ </xsl:with-param>
+ <xsl:with-param name="encoding" select="$htmlhelp.encoding"/>
+ <xsl:with-param name="quiet" select="$chunk.quietly"/>
+ </xsl:call-template>
+</xsl:template>
+
+<!-- ==================================================================== -->
+<xsl:template name="hhp-main">
+
+ <xsl:variable name="raw.help.title">
+ <xsl:choose>
+ <xsl:when test="$htmlhelp.title = ''">
+ <xsl:choose>
+ <xsl:when test="$rootid != ''">
+ <xsl:apply-templates select="key('id',$rootid)" mode="title.markup"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="/*" mode="title.markup"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$htmlhelp.title"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="help.title" select="normalize-space($raw.help.title)"/>
+
+<xsl:variable name="default.topic">
+ <xsl:choose>
+ <xsl:when test="$htmlhelp.default.topic != ''">
+ <xsl:value-of select="$htmlhelp.default.topic"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="make-relative-filename">
+ <xsl:with-param name="base.dir">
+ <xsl:if test="$manifest.in.base.dir = 0">
+ <xsl:value-of select="$base.dir"/>
+ </xsl:if>
+ </xsl:with-param>
+ <xsl:with-param name="base.name">
+ <xsl:choose>
+ <xsl:when test="$rootid != ''">
+ <xsl:apply-templates select="key('id',$rootid)" mode="chunk-filename"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="/" mode="chunk-filename"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:variable>
+<xsl:variable name="xnavigation">
+ <xsl:text>0x</xsl:text>
+ <xsl:call-template name="toHex">
+ <xsl:with-param name="n" select="9504 + $htmlhelp.show.menu * 65536
+ + $htmlhelp.show.advanced.search * 131072
+ + $htmlhelp.show.favorities * 4096
+ + (1 - $htmlhelp.show.toolbar.text) * 64
+ + $htmlhelp.remember.window.position * 262144"/>
+ </xsl:call-template>
+</xsl:variable>
+<xsl:variable name="xbuttons">
+ <xsl:text>0x</xsl:text>
+ <xsl:call-template name="toHex">
+ <xsl:with-param name="n" select="0 + $htmlhelp.button.hideshow * 2
+ + $htmlhelp.button.back * 4
+ + $htmlhelp.button.forward * 8
+ + $htmlhelp.button.stop * 16
+ + $htmlhelp.button.refresh * 32
+ + $htmlhelp.button.home * 64
+ + $htmlhelp.button.options * 4096
+ + $htmlhelp.button.print * 8192
+ + $htmlhelp.button.locate * 2048
+ + $htmlhelp.button.jump1 * 262144
+ + $htmlhelp.button.jump2 * 524288
+ + $htmlhelp.button.next * 2097152
+ + $htmlhelp.button.prev * 4194304
+ + $htmlhelp.button.zoom * 1048576"/>
+ </xsl:call-template>
+</xsl:variable>
+<xsl:text>[OPTIONS]
+</xsl:text>
+<xsl:if test="$htmlhelp.generate.index">
+<xsl:text>Auto Index=Yes
+</xsl:text></xsl:if>
+<xsl:if test="$htmlhelp.hhc.binary != 0">
+<xsl:text>Binary TOC=Yes
+</xsl:text></xsl:if>
+<xsl:text>Compatibility=1.1 or later
+Compiled file=</xsl:text><xsl:value-of select="$htmlhelp.chm"/><xsl:text>
+Contents file=</xsl:text><xsl:value-of select="$htmlhelp.hhc"/><xsl:text>
+</xsl:text>
+<xsl:if test="$htmlhelp.hhp.window != ''">
+<xsl:text>Default Window=</xsl:text><xsl:value-of select="$htmlhelp.hhp.window"/><xsl:text>
+</xsl:text></xsl:if>
+<xsl:text>Default topic=</xsl:text><xsl:value-of select="$default.topic"/>
+<xsl:text>
+Display compile progress=</xsl:text>
+ <xsl:choose>
+ <xsl:when test="$htmlhelp.display.progress != 1">
+ <xsl:text>No</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text>Yes</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+<xsl:text>
+Full-text search=Yes
+</xsl:text>
+<xsl:if test="$htmlhelp.generate.index">
+<xsl:text>Index file=</xsl:text><xsl:value-of select="$htmlhelp.hhk"/><xsl:text>
+</xsl:text></xsl:if>
+<xsl:text>Language=</xsl:text>
+<xsl:for-each select="*"> <!-- Change context from / to root element -->
+ <xsl:call-template name="gentext.template">
+ <xsl:with-param name="context" select="'htmlhelp'"/>
+ <xsl:with-param name="name" select="'langcode'"/>
+ </xsl:call-template>
+</xsl:for-each>
+<xsl:text>
+Title=</xsl:text>
+ <xsl:value-of select="$help.title"/>
+<xsl:text>
+Enhanced decompilation=</xsl:text>
+ <xsl:choose>
+ <xsl:when test="$htmlhelp.enhanced.decompilation != 0">
+ <xsl:text>Yes</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text>No</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+
+<xsl:if test="$htmlhelp.hhp.window != ''">
+ <xsl:text>
+
+[WINDOWS]
+</xsl:text>
+<xsl:value-of select="$htmlhelp.hhp.window"/>
+<xsl:text>="</xsl:text>
+<xsl:value-of select="$help.title"/>
+<xsl:text>","</xsl:text><xsl:value-of select="$htmlhelp.hhc"/>
+<xsl:text>",</xsl:text>
+<xsl:if test="$htmlhelp.generate.index">
+ <xsl:text>"</xsl:text>
+ <xsl:value-of select="$htmlhelp.hhk"/>
+ <xsl:text>"</xsl:text>
+</xsl:if>
+<xsl:text>,"</xsl:text>
+<xsl:value-of select="$default.topic"/>
+<xsl:text>",</xsl:text>
+<xsl:text>"</xsl:text>
+<xsl:choose>
+ <xsl:when test="$htmlhelp.button.home != 0">
+ <xsl:value-of select="$htmlhelp.button.home.url"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$default.topic"/>
+ </xsl:otherwise>
+</xsl:choose>
+<xsl:text>"</xsl:text>
+<xsl:text>,</xsl:text>
+<xsl:if test="$htmlhelp.button.jump1 != 0">
+ <xsl:text>"</xsl:text>
+ <xsl:value-of select="$htmlhelp.button.jump1.url"/>
+ <xsl:text>"</xsl:text>
+</xsl:if>
+<xsl:text>,</xsl:text>
+<xsl:if test="$htmlhelp.button.jump1 != 0">
+ <xsl:text>"</xsl:text>
+ <xsl:value-of select="$htmlhelp.button.jump1.title"/>
+ <xsl:text>"</xsl:text>
+</xsl:if>
+<xsl:text>,</xsl:text>
+<xsl:if test="$htmlhelp.button.jump2 != 0">
+ <xsl:text>"</xsl:text>
+ <xsl:value-of select="$htmlhelp.button.jump2.url"/>
+ <xsl:text>"</xsl:text>
+</xsl:if>
+<xsl:text>,</xsl:text>
+<xsl:if test="$htmlhelp.button.jump2 != 0">
+ <xsl:text>"</xsl:text>
+ <xsl:value-of select="$htmlhelp.button.jump2.title"/>
+ <xsl:text>"</xsl:text>
+</xsl:if>
+<xsl:text>,</xsl:text>
+<xsl:value-of select="$xnavigation"/>
+<xsl:text>,</xsl:text><xsl:value-of select="$htmlhelp.hhc.width"/><xsl:text>,</xsl:text>
+<xsl:value-of select="$xbuttons"/>
+<xsl:text>,</xsl:text><xsl:value-of select="$htmlhelp.window.geometry"/><xsl:text>,,,,,,,0
+</xsl:text>
+</xsl:if>
+
+<!--
+ Needs more investigation to generate propetly all fields
+<xsl:text>search="</xsl:text>
+<xsl:value-of select="normalize-space(//title[1])"/>
+<xsl:text>","toc.hhc","index.hhk","</xsl:text>
+<xsl:value-of select="$root.filename"/>
+<xsl:text>.html","</xsl:text>
+<xsl:value-of select="$root.filename"/>
+<xsl:text>.html",,,,,</xsl:text>
+<xsl:value-of select="$xnavigation"/>
+<xsl:text>,</xsl:text>
+<xsl:value-of select="$htmlhelp.hhc.width"/>
+<xsl:text>,</xsl:text>
+<xsl:value-of select="$xbuttons"/>
+<xsl:text>,</xsl:text>
+<xsl:value-of select="$htmlhelp.window.geometry"/>
+<xsl:text>,,,,,2,,0
+</xsl:text>
+-->
+
+<xsl:if test="$htmlhelp.hhp.windows">
+ <xsl:value-of select="$htmlhelp.hhp.windows"/>
+</xsl:if>
+<xsl:text>
+
+[FILES]
+</xsl:text>
+
+<xsl:choose>
+ <xsl:when test="$rootid != ''">
+ <xsl:apply-templates select="key('id',$rootid)" mode="enumerate-files"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="/" mode="enumerate-files"/>
+ </xsl:otherwise>
+</xsl:choose>
+
+<xsl:if test="$htmlhelp.enumerate.images">
+ <xsl:variable name="imagelist">
+ <xsl:choose>
+ <xsl:when test="$rootid != ''">
+ <xsl:apply-templates select="key('id',$rootid)" mode="enumerate-images"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="/" mode="enumerate-images"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:choose>
+ <xsl:when test="$exsl.node.set.available != 0
+ and function-available('set:distinct')">
+ <xsl:for-each select="set:distinct(exsl:node-set($imagelist)/filename)">
+ <xsl:value-of select="."/>
+ <xsl:text>&#10;</xsl:text>
+ </xsl:for-each>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$imagelist"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:if>
+
+<xsl:if test="($htmlhelp.force.map.and.alias != 0) or
+ ($rootid = '' and //processing-instruction('dbhh')) or
+ ($rootid != '' and key('id',$rootid)//processing-instruction('dbhh'))">
+ <xsl:text>
+[ALIAS]
+#include </xsl:text><xsl:value-of select="$htmlhelp.alias.file"/><xsl:text>
+
+[MAP]
+#include </xsl:text><xsl:value-of select="$htmlhelp.map.file"/><xsl:text>
+</xsl:text>
+</xsl:if>
+
+<xsl:value-of select="$htmlhelp.hhp.tail"/>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="graphic|inlinegraphic[@format!='linespecific']" mode="enumerate-images">
+ <xsl:call-template name="write.filename.enumerate-images">
+ <xsl:with-param name="filename">
+ <xsl:call-template name="mediaobject.filename.enumerate-images">
+ <xsl:with-param name="object" select="."/>
+ </xsl:call-template>
+ </xsl:with-param>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="mediaobject|inlinemediaobject" mode="enumerate-images">
+ <xsl:call-template name="select.mediaobject.enumerate-images"/>
+</xsl:template>
+
+<xsl:template name="select.mediaobject.enumerate-images">
+ <xsl:param name="olist"
+ select="imageobject|imageobjectco
+ |videoobject|audioobject|textobject"/>
+ <xsl:param name="count">1</xsl:param>
+
+ <xsl:if test="$count &lt;= count($olist)">
+ <xsl:variable name="object" select="$olist[position()=$count]"/>
+
+ <xsl:variable name="useobject">
+ <xsl:choose>
+ <!-- The phrase is never used -->
+ <xsl:when test="name($object)='textobject' and $object/phrase">
+ <xsl:text>0</xsl:text>
+ </xsl:when>
+ <!-- The first textobject is a reasonable fallback (but not for image in HH) -->
+ <xsl:when test="name($object)='textobject'">
+ <xsl:text>0</xsl:text>
+ </xsl:when>
+ <!-- If there's only one object, use it -->
+ <xsl:when test="$count = 1 and count($olist) = 1">
+ <xsl:text>1</xsl:text>
+ </xsl:when>
+ <!-- Otherwise, see if this one is a useable graphic -->
+ <xsl:otherwise>
+ <xsl:choose>
+ <!-- peek inside imageobjectco to simplify the test -->
+ <xsl:when test="local-name($object) = 'imageobjectco'">
+ <xsl:call-template name="is.acceptable.mediaobject">
+ <xsl:with-param name="object" select="$object/imageobject"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="is.acceptable.mediaobject">
+ <xsl:with-param name="object" select="$object"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="$useobject='1' and $object[not(*/@format='linespecific')]">
+ <xsl:call-template name="write.filename.enumerate-images">
+ <xsl:with-param name="filename">
+ <xsl:call-template name="mediaobject.filename.enumerate-images">
+ <xsl:with-param name="object" select="$object"/>
+ </xsl:call-template>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="select.mediaobject.enumerate-images">
+ <xsl:with-param name="olist" select="$olist"/>
+ <xsl:with-param name="count" select="$count + 1"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template name="mediaobject.filename.enumerate-images">
+ <xsl:param name="object"/>
+
+ <xsl:variable name="urifilename">
+ <xsl:call-template name="mediaobject.filename">
+ <xsl:with-param name="object" select="$object"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="filename">
+ <xsl:choose>
+ <xsl:when test="starts-with($urifilename, 'file:/')">
+ <xsl:value-of select="substring-after($urifilename, 'file:/')"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$urifilename"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:value-of select="translate($filename, '/', '\')"/>
+
+</xsl:template>
+
+<xsl:template match="text()" mode="enumerate-images">
+</xsl:template>
+
+<xsl:template name="write.filename.enumerate-images">
+ <xsl:param name="filename"/>
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set') and function-available('set:distinct')">
+ <filename><xsl:value-of select="$filename"/></filename>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$filename"/>
+ <xsl:text>&#10;</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<!-- HHC and HHK files are processed by compiler line by line
+ and therefore are very sensitive to whitespaces (linefeeds for sure). -->
+
+<xsl:template name="hhc">
+ <xsl:call-template name="write.chunk">
+ <xsl:with-param name="filename">
+ <xsl:if test="$manifest.in.base.dir != 0">
+ <xsl:value-of select="$base.dir"/>
+ </xsl:if>
+ <xsl:value-of select="$htmlhelp.hhc"/>
+ </xsl:with-param>
+ <xsl:with-param name="indent" select="'no'"/>
+ <xsl:with-param name="content">
+ <xsl:call-template name="hhc-main"/>
+ </xsl:with-param>
+ <xsl:with-param name="encoding" select="$htmlhelp.encoding"/>
+ <xsl:with-param name="quiet" select="$chunk.quietly"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template name="hhc-main">
+<HTML>&lf;
+ <HEAD></HEAD>&lf;
+ <BODY>&lf;
+ <xsl:if test="$htmlhelp.hhc.folders.instead.books != 0">
+ <OBJECT type="text/site properties">&lf;
+ <param name="ImageType" value="Folder"/>&lf;
+ </OBJECT>&lf;
+ </xsl:if>
+ <xsl:variable name="content">
+ <xsl:choose>
+ <xsl:when test="$rootid != ''">
+ <xsl:apply-templates select="key('id',$rootid)" mode="hhc"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="/" mode="hhc"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="$htmlhelp.hhc.show.root != 0">
+ <UL>&lf;
+ <xsl:copy-of select="$content"/>
+ </UL>&lf;
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:copy-of select="$content"/>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ </BODY>
+</HTML>
+</xsl:template>
+
+<xsl:template name="hhc.entry">
+ <xsl:param name="title">
+ <xsl:if test="$htmlhelp.autolabel=1">
+ <xsl:variable name="label.markup">
+ <xsl:apply-templates select="." mode="label.markup"/>
+ </xsl:variable>
+ <xsl:if test="normalize-space($label.markup)">
+ <xsl:value-of select="concat($label.markup,$autotoc.label.separator)"/>
+ </xsl:if>
+ </xsl:if>
+ <xsl:apply-templates select="." mode="title.markup"/>
+ </xsl:param>
+
+ <LI><OBJECT type="text/sitemap">&lf;
+ <param name="Name">
+ <xsl:attribute name="value">
+ <xsl:value-of select="normalize-space($title)"/>
+ </xsl:attribute>
+ </param>&lf;
+ <param name="Local">
+ <xsl:attribute name="value">
+ <xsl:call-template name="href.target.with.base.dir"/>
+ </xsl:attribute>
+ </param>
+ </OBJECT></LI>&lf;
+</xsl:template>
+
+<xsl:template match="set" mode="hhc">
+ <xsl:if test="$htmlhelp.hhc.show.root != 0">
+ <xsl:call-template name="hhc.entry"/>
+ </xsl:if>
+ <xsl:if test="book">
+ <xsl:variable name="toc.params">
+ <xsl:call-template name="find.path.params">
+ <xsl:with-param name="table" select="normalize-space($generate.toc)"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <UL>
+ <xsl:if test="contains($toc.params, 'toc') and $htmlhelp.hhc.show.root = 0">
+ <LI><OBJECT type="text/sitemap">&lf;
+ <param name="Name">
+ <xsl:attribute name="value">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'TableofContents'"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ </param>&lf;
+ <param name="Local">
+ <xsl:attribute name="value">
+ <xsl:choose>
+ <xsl:when test="$chunk.tocs.and.lots != 0">
+ <xsl:apply-templates select="." mode="recursive-chunk-filename">
+ <xsl:with-param name="recursive" select="true()"/>
+ </xsl:apply-templates>
+ <xsl:text>-toc</xsl:text>
+ <xsl:value-of select="$html.ext"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="href.target.with.base.dir"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:attribute>
+ </param>
+ </OBJECT></LI>&lf;
+ </xsl:if>
+ <xsl:apply-templates select="book" mode="hhc"/>
+ </UL>&lf;
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="book" mode="hhc">
+ <xsl:if test="$htmlhelp.hhc.show.root != 0 or parent::*">
+ <xsl:call-template name="hhc.entry"/>
+ </xsl:if>
+ <xsl:if test="part|reference|preface|chapter|appendix|bibliography|article|colophon|glossary">
+ <xsl:variable name="toc.params">
+ <xsl:call-template name="find.path.params">
+ <xsl:with-param name="table" select="normalize-space($generate.toc)"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <UL>
+ <xsl:if test="contains($toc.params, 'toc') and $htmlhelp.hhc.show.root = 0 and not(parent::*)">
+ <LI><OBJECT type="text/sitemap">&lf;
+ <param name="Name">
+ <xsl:attribute name="value">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'TableofContents'"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ </param>&lf;
+ <param name="Local">
+ <xsl:attribute name="value">
+ <xsl:choose>
+ <xsl:when test="$chunk.tocs.and.lots != 0">
+ <xsl:apply-templates select="." mode="recursive-chunk-filename">
+ <xsl:with-param name="recursive" select="true()"/>
+ </xsl:apply-templates>
+ <xsl:text>-toc</xsl:text>
+ <xsl:value-of select="$html.ext"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="href.target.with.base.dir"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:attribute>
+ </param>
+ </OBJECT></LI>&lf;
+ </xsl:if>
+ <xsl:apply-templates select="part|reference|preface|chapter|bibliography|appendix|article|colophon|glossary"
+ mode="hhc"/>
+ </UL>&lf;
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="part|reference|preface|chapter|bibliography|appendix|article|glossary"
+ mode="hhc">
+ <xsl:if test="$htmlhelp.hhc.show.root != 0 or parent::*">
+ <xsl:call-template name="hhc.entry"/>
+ </xsl:if>
+ <xsl:if test="article|reference|preface|chapter|appendix|refentry|section|sect1|bibliodiv">
+ <UL>&lf;
+ <xsl:apply-templates
+ select="article|reference|preface|chapter|appendix|refentry|section|sect1|bibliodiv"
+ mode="hhc"/>
+ </UL>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="section" mode="hhc">
+ <xsl:if test="$htmlhelp.hhc.show.root != 0 or parent::*">
+ <xsl:call-template name="hhc.entry"/>
+ </xsl:if>
+ <xsl:if test="section[count(ancestor::section) &lt; $htmlhelp.hhc.section.depth]|refentry">
+ <UL>&lf;
+ <xsl:apply-templates select="section|refentry" mode="hhc"/>
+ </UL>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="sect1" mode="hhc">
+ <xsl:if test="$htmlhelp.hhc.show.root != 0 or parent::*">
+ <xsl:call-template name="hhc.entry"/>
+ </xsl:if>
+ <xsl:if test="sect2[$htmlhelp.hhc.section.depth > 1]|refentry">
+ <UL>&lf;
+ <xsl:apply-templates select="sect2|refentry"
+ mode="hhc"/>
+ </UL>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="sect2" mode="hhc">
+ <xsl:if test="$htmlhelp.hhc.show.root != 0 or parent::*">
+ <xsl:call-template name="hhc.entry"/>
+ </xsl:if>
+ <xsl:if test="sect3[$htmlhelp.hhc.section.depth > 2]|refentry">
+ <UL>&lf;
+ <xsl:apply-templates select="sect3|refentry"
+ mode="hhc"/>
+ </UL>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="sect3" mode="hhc">
+ <xsl:if test="$htmlhelp.hhc.show.root != 0 or parent::*">
+ <xsl:call-template name="hhc.entry"/>
+ </xsl:if>
+ <xsl:if test="sect4[$htmlhelp.hhc.section.depth > 3]|refentry">
+ <UL>&lf;
+ <xsl:apply-templates select="sect4|refentry"
+ mode="hhc"/>
+ </UL>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="sect4" mode="hhc">
+ <xsl:if test="$htmlhelp.hhc.show.root != 0 or parent::*">
+ <xsl:call-template name="hhc.entry"/>
+ </xsl:if>
+ <xsl:if test="sect5[$htmlhelp.hhc.section.depth > 4]|refentry">
+ <UL>&lf;
+ <xsl:apply-templates select="sect5|refentry"
+ mode="hhc"/>
+ </UL>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="sect5|refentry|colophon|bibliodiv" mode="hhc">
+ <xsl:if test="$htmlhelp.hhc.show.root != 0 or parent::*">
+ <xsl:call-template name="hhc.entry"/>
+ </xsl:if>
+ <xsl:if test="refentry">
+ <UL>&lf;
+ <xsl:apply-templates select="refentry"
+ mode="hhc"/>
+ </UL>
+ </xsl:if>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="indexterm">
+ <xsl:choose>
+ <xsl:when test="$htmlhelp.use.hhk = 0">
+
+ <xsl:variable name="primary" select="normalize-space(primary)"/>
+ <xsl:variable name="secondary" select="normalize-space(secondary)"/>
+ <xsl:variable name="tertiary" select="normalize-space(tertiary)"/>
+
+ <xsl:variable name="text">
+ <xsl:value-of select="$primary"/>
+ <xsl:if test="secondary">
+ <xsl:text>, </xsl:text>
+ <xsl:value-of select="$secondary"/>
+ </xsl:if>
+ <xsl:if test="tertiary">
+ <xsl:text>, </xsl:text>
+ <xsl:value-of select="$tertiary"/>
+ </xsl:if>
+ </xsl:variable>
+
+ <xsl:if test="secondary">
+ <xsl:if test="not(//indexterm[normalize-space(primary)=$primary and not(secondary)])">
+ <xsl:call-template name="write.indexterm">
+ <xsl:with-param name="text" select="$primary"/>
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:if>
+
+ <xsl:if test="tertiary">
+ <xsl:if test="not(//indexterm[normalize-space(primary)=$primary and
+ normalize-space(secondary)=$secondary and not(tertiary)])">
+ <xsl:call-template name="write.indexterm">
+ <xsl:with-param name="text" select="concat($primary, ', ', $secondary)"/>
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:if>
+
+ <xsl:call-template name="write.indexterm">
+ <xsl:with-param name="text" select="$text"/>
+ </xsl:call-template>
+
+ </xsl:when>
+ <xsl:otherwise>
+ <a>
+ <xsl:attribute name="name">
+ <xsl:call-template name="object.id"/>
+ </xsl:attribute>
+ </a>
+ </xsl:otherwise>
+
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="write.indexterm">
+ <xsl:param name="text"/>
+ <OBJECT type="application/x-oleobject"
+ classid="clsid:1e2a7bd0-dab9-11d0-b93a-00c04fc99f9e">
+ <param name="Keyword" value="{$text}"/>
+ </OBJECT>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template name="hhk">
+ <xsl:call-template name="write.chunk">
+ <xsl:with-param name="filename">
+ <xsl:if test="$manifest.in.base.dir != 0">
+ <xsl:value-of select="$base.dir"/>
+ </xsl:if>
+ <xsl:value-of select="$htmlhelp.hhk"/>
+ </xsl:with-param>
+ <xsl:with-param name="indent" select="'no'"/>
+ <xsl:with-param name="content"><xsl:text disable-output-escaping="yes"><![CDATA[<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<HTML>
+<HEAD>
+<meta name="GENERATOR" content="Microsoft&reg; HTML Help Workshop 4.1">
+<!-- Sitemap 1.0 -->
+</HEAD><BODY>
+<OBJECT type="text/site properties">
+</OBJECT>
+<UL>]]>
+</xsl:text>
+<xsl:if test="($htmlhelp.use.hhk != 0) and $htmlhelp.generate.index">
+ <xsl:choose>
+ <xsl:when test="$rootid != ''">
+ <xsl:apply-templates select="key('id',$rootid)" mode="hhk"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="/" mode="hhk"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:if>
+<xsl:text disable-output-escaping="yes"><![CDATA[</UL>
+</BODY></HTML>]]>
+</xsl:text></xsl:with-param>
+ <xsl:with-param name="encoding" select="$htmlhelp.encoding"/>
+ <xsl:with-param name="quiet" select="$chunk.quietly"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="indexterm[@class='endofrange']" mode="hhk"/>
+
+<xsl:template match="indexterm" mode="hhk">
+ <xsl:variable name="primary" select="normalize-space(primary)"/>
+ <xsl:variable name="secondary" select="normalize-space(secondary)"/>
+ <xsl:variable name="tertiary" select="normalize-space(tertiary)"/>
+
+ <xsl:call-template name="write.indexterm.hhk">
+ <xsl:with-param name="text" select="$primary"/>
+ <xsl:with-param name="seealso" select="seealso"/>
+ </xsl:call-template>
+
+ <xsl:if test="secondary">
+ <xsl:if test="not(//indexterm[normalize-space(primary)=$primary and not(secondary)])">
+ <xsl:call-template name="write.indexterm.hhk">
+ <!-- We must create fake entry when there is secondary without primary -->
+ <xsl:with-param name="text" select="$primary"/>
+ <xsl:with-param name="seealso" select="$primary"/>
+ </xsl:call-template>
+ </xsl:if>
+ <UL>
+ <xsl:call-template name="write.indexterm.hhk">
+ <xsl:with-param name="text" select="$secondary"/>
+ <xsl:with-param name="seealso" select="secondary/seealso"/>
+ </xsl:call-template>
+ <xsl:if test="tertiary">
+ <UL>&lf;
+ <xsl:call-template name="write.indexterm.hhk">
+ <xsl:with-param name="text" select="$tertiary"/>
+ <xsl:with-param name="seealso" select="tertiary/seealso"/>
+ </xsl:call-template>
+ </UL>
+ </xsl:if>
+ </UL>
+ </xsl:if>
+
+</xsl:template>
+
+<xsl:template name="write.indexterm.hhk">
+ <xsl:param name="text"/>
+ <xsl:param name="seealso"/>
+
+ <LI> <OBJECT type="text/sitemap">&lf;
+ <param name="Name">
+ <xsl:attribute name="value">
+ <xsl:value-of select="$text"/>
+ </xsl:attribute>
+ </param>&lf;
+
+ <xsl:if test="not(seealso)">
+ <xsl:variable name="href">
+ <xsl:call-template name="href.target.with.base.dir"/>
+ </xsl:variable>
+ <xsl:variable name="title">
+ <xsl:call-template name="nearest.title">
+ <xsl:with-param name="object" select=".."/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <param name="Name">
+ <xsl:attribute name="value">
+ <xsl:value-of select="$title"/>
+ </xsl:attribute>
+ </param>&lf;
+ <param name="Local">
+ <xsl:attribute name="value">
+ <xsl:value-of select="$href"/>
+ </xsl:attribute>
+ </param>&lf;
+ </xsl:if>
+
+ <xsl:if test="seealso">
+ <param name="See Also">
+ <xsl:attribute name="value">
+ <xsl:value-of select="$seealso"/>
+ </xsl:attribute>
+ </param>&lf;
+ </xsl:if>
+ </OBJECT></LI>
+</xsl:template>
+
+<xsl:template match="text()" mode="hhk"/>
+
+<xsl:template name="nearest.title">
+ <xsl:param name="object"/>
+ <xsl:apply-templates select="$object/ancestor-or-self::*[title][1]" mode="title.markup"/>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template name="hh-map">
+ <xsl:call-template name="write.text.chunk">
+ <xsl:with-param name="filename">
+ <xsl:if test="$manifest.in.base.dir != 0">
+ <xsl:value-of select="$base.dir"/>
+ </xsl:if>
+ <xsl:value-of select="$htmlhelp.map.file"/>
+ </xsl:with-param>
+ <xsl:with-param name="method" select="'text'"/>
+ <xsl:with-param name="content">
+ <xsl:choose>
+ <xsl:when test="$rootid != ''">
+ <xsl:apply-templates select="key('id',$rootid)" mode="hh-map"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="/" mode="hh-map"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:with-param>
+ <xsl:with-param name="encoding" select="$htmlhelp.encoding"/>
+ <xsl:with-param name="quiet" select="$chunk.quietly"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="processing-instruction('dbhh')" mode="hh-map">
+ <xsl:variable name="topicname">
+ <xsl:call-template name="pi-attribute">
+ <xsl:with-param name="pis"
+ select="."/>
+ <xsl:with-param name="attribute" select="'topicname'"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:variable name="topicid">
+ <xsl:call-template name="pi-attribute">
+ <xsl:with-param name="pis"
+ select="."/>
+ <xsl:with-param name="attribute" select="'topicid'"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:text>#define </xsl:text>
+ <xsl:value-of select="$topicname"/>
+ <xsl:text>&#9;</xsl:text>
+ <xsl:value-of select="$topicid"/>
+ <xsl:text>&#xA;</xsl:text>
+</xsl:template>
+
+<xsl:template match="text()" mode="hh-map"/>
+
+<!-- ==================================================================== -->
+
+<xsl:template name="hh-alias">
+ <xsl:call-template name="write.text.chunk">
+ <xsl:with-param name="filename">
+ <xsl:if test="$manifest.in.base.dir != 0">
+ <xsl:value-of select="$base.dir"/>
+ </xsl:if>
+ <xsl:value-of select="$htmlhelp.alias.file"/>
+ </xsl:with-param>
+ <xsl:with-param name="method" select="'text'"/>
+ <xsl:with-param name="content">
+ <xsl:choose>
+ <xsl:when test="$rootid != ''">
+ <xsl:apply-templates select="key('id',$rootid)" mode="hh-alias"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="/" mode="hh-alias"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:with-param>
+ <xsl:with-param name="encoding" select="$htmlhelp.encoding"/>
+ <xsl:with-param name="quiet" select="$chunk.quietly"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="processing-instruction('dbhh')" mode="hh-alias">
+ <xsl:variable name="topicname">
+ <xsl:call-template name="pi-attribute">
+ <xsl:with-param name="pis"
+ select="."/>
+ <xsl:with-param name="attribute" select="'topicname'"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:variable name="href">
+ <xsl:call-template name="href.target.with.base.dir">
+ <xsl:with-param name="object" select=".."/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:value-of select="$topicname"/>
+ <xsl:text>=</xsl:text>
+ <!-- Some versions of HH doesn't like fragment identifires, but some does. -->
+ <!-- <xsl:value-of select="substring-before(concat($href, '#'), '#')"/> -->
+ <xsl:value-of select="$href"/>
+ <xsl:text>&#xA;</xsl:text>
+</xsl:template>
+
+<xsl:template match="text()" mode="hh-alias"/>
+
+<!-- ==================================================================== -->
+<!-- This code can be used to convert any number to hexadecimal format -->
+
+ <h:hex>
+ <d>0</d>
+ <d>1</d>
+ <d>2</d>
+ <d>3</d>
+ <d>4</d>
+ <d>5</d>
+ <d>6</d>
+ <d>7</d>
+ <d>8</d>
+ <d>9</d>
+ <d>A</d>
+ <d>B</d>
+ <d>C</d>
+ <d>D</d>
+ <d>E</d>
+ <d>F</d>
+ </h:hex>
+
+ <xsl:template name="toHex">
+ <xsl:param name="n" select="0"/>
+ <xsl:param name="digit" select="$n mod 16"/>
+ <xsl:param name="rest" select="floor($n div 16)"/>
+ <xsl:if test="$rest > 0">
+ <xsl:call-template name="toHex">
+ <xsl:with-param name="n" select="$rest"/>
+ </xsl:call-template>
+ </xsl:if>
+ <xsl:value-of select="document('')//h:hex/d[$digit+1]"/>
+ </xsl:template>
+
+<!-- ==================================================================== -->
+<!-- Modification to standard HTML stylesheets -->
+
+<!-- There are links from ToC pane to bibliodivs, so there must be anchor -->
+<xsl:template match="bibliodiv/title">
+ <h3 class="{name(.)}">
+ <xsl:call-template name="anchor">
+ <xsl:with-param name="node" select=".."/>
+ <xsl:with-param name="conditional" select="0"/>
+ </xsl:call-template>
+ <xsl:apply-templates/>
+ </h3>
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/htmlhelp/htmlhelp.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/htmlhelp/htmlhelp.xsl
new file mode 100644
index 0000000..8e8ee95
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/htmlhelp/htmlhelp.xsl
@@ -0,0 +1,22 @@
+<?xml version="1.0"?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:doc="http://nwalsh.com/xsl/documentation/1.0"
+ xmlns:exsl="http://exslt.org/common"
+ xmlns:set="http://exslt.org/sets"
+ version="1.0"
+ exclude-result-prefixes="doc exsl set">
+
+<!-- ********************************************************************
+ $Id: htmlhelp.xsl 1676 2002-06-12 13:21:54Z kosek $
+ ********************************************************************
+
+ This file is used by htmlhelp.xsl if you want to generate source
+ files for HTML Help. It is based on the XSL DocBook Stylesheet
+ distribution (especially on JavaHelp code) from Norman Walsh.
+
+ ******************************************************************** -->
+
+<xsl:import href="../html/chunk.xsl"/>
+<xsl:include href="htmlhelp-common.xsl"/>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/htmlhelp/profile-htmlhelp-common.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/htmlhelp/profile-htmlhelp-common.xsl
new file mode 100644
index 0000000..d2ab70e
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/htmlhelp/profile-htmlhelp-common.xsl
@@ -0,0 +1,1083 @@
+<?xml version="1.0" encoding="US-ASCII"?>
+<!--This file was created automatically by xsl2profile-->
+<!--from the DocBook XSL stylesheets.-->
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:doc="http://nwalsh.com/xsl/documentation/1.0" xmlns:exsl="http://exslt.org/common" xmlns:set="http://exslt.org/sets" xmlns:h="urn:x-hex" xmlns:ng="http://docbook.org/docbook-ng" xmlns:db="http://docbook.org/ns/docbook" xmlns:exslt="http://exslt.org/common" exslt:dummy="dummy" ng:dummy="dummy" db:dummy="dummy" extension-element-prefixes="exslt" version="1.0" exclude-result-prefixes="doc exsl set h db ng exslt">
+
+<!-- ********************************************************************
+ $Id: htmlhelp-common.xsl 8400 2009-04-08 07:44:54Z bobstayton $
+ ******************************************************************** -->
+
+<!-- ==================================================================== -->
+<!-- Customizations of standard HTML stylesheet parameters -->
+
+<!-- no navigation on pages by default, HTML Help provides its own navigation controls -->
+<xsl:param name="suppress.navigation" select="1"/>
+
+<!-- no separate HTML page with index, index is built inside CHM index pane -->
+<xsl:param name="generate.index" select="0"/>
+
+<!-- ==================================================================== -->
+
+<xsl:param name="htmlhelp.generate.index" select="//indexterm[1]|//db:indexterm[1]|//ng:indexterm[1]"/>
+
+<!-- Set up HTML Help flag -->
+<xsl:variable name="htmlhelp.output" select="1"/>
+
+<!-- ==================================================================== -->
+
+<xslo:include xmlns:xslo="http://www.w3.org/1999/XSL/Transform" href="../profiling/profile-mode.xsl"/><xslo:variable xmlns:xslo="http://www.w3.org/1999/XSL/Transform" name="profiled-content"><xslo:choose><xslo:when test="*/self::ng:* or */self::db:*"><xslo:message>Note: namesp. cut : stripped namespace before processing</xslo:message><xslo:variable name="stripped-content"><xslo:apply-templates select="/" mode="stripNS"/></xslo:variable><xslo:message>Note: namesp. cut : processing stripped document</xslo:message><xslo:apply-templates select="exslt:node-set($stripped-content)" mode="profile"/></xslo:when><xslo:otherwise><xslo:apply-templates select="/" mode="profile"/></xslo:otherwise></xslo:choose></xslo:variable><xslo:variable xmlns:xslo="http://www.w3.org/1999/XSL/Transform" name="profiled-nodes" select="exslt:node-set($profiled-content)"/><xsl:template match="/">
+
+ <!-- * Get a title for current doc so that we let the user -->
+ <!-- * know what document we are processing at this point. -->
+ <xsl:variable name="doc.title">
+ <xsl:call-template name="get.doc.title"/>
+ </xsl:variable>
+ <xsl:choose>
+ <!-- Hack! If someone hands us a DocBook V5.x or DocBook NG document,
+ toss the namespace and continue. Use the docbook5 namespaced
+ stylesheets for DocBook5 if you don't want to use this feature.-->
+ <xsl:when test="false()"/>
+ <xsl:otherwise>
+ <xsl:if test="$htmlhelp.only != 1">
+ <xsl:choose>
+ <xsl:when test="$rootid != ''">
+ <xsl:choose>
+ <xsl:when test="count($profiled-nodes//*[@id=$rootid]) = 0">
+ <xsl:message terminate="yes">
+ <xsl:text>ID '</xsl:text>
+ <xsl:value-of select="$rootid"/>
+ <xsl:text>' not found in document.</xsl:text>
+ </xsl:message>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:message>Formatting from <xsl:value-of select="$rootid"/></xsl:message>
+ <xsl:apply-templates select="$profiled-nodes//*[@id=$rootid]" mode="process.root"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:if test="$collect.xref.targets = 'yes' or $collect.xref.targets = 'only'">
+ <xsl:apply-templates select="$profiled-nodes" mode="collect.targets"/>
+ </xsl:if>
+ <xsl:if test="$collect.xref.targets != 'only'">
+ <xsl:apply-templates select="$profiled-nodes" mode="process.root"/>
+ </xsl:if>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:if>
+
+
+ <xsl:if test="$collect.xref.targets != 'only'">
+ <xsl:call-template name="hhp"/>
+ <xsl:call-template name="hhc"/>
+ <xsl:if test="($rootid = '' and //processing-instruction('dbhh')) or ($rootid != '' and $profiled-nodes//*[@id=$rootid]//processing-instruction('dbhh'))">
+ <xsl:call-template name="hh-map"/>
+ <xsl:call-template name="hh-alias"/>
+ </xsl:if>
+ <xsl:if test="$htmlhelp.generate.index">
+ <xsl:call-template name="hhk"/>
+ </xsl:if>
+ </xsl:if>
+</xsl:otherwise>
+</xsl:choose>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template name="hhp">
+ <xsl:call-template name="write.text.chunk">
+ <xsl:with-param name="filename">
+ <xsl:if test="$manifest.in.base.dir != 0">
+ <xsl:value-of select="$base.dir"/>
+ </xsl:if>
+ <xsl:value-of select="$htmlhelp.hhp"/>
+ </xsl:with-param>
+ <xsl:with-param name="method" select="'text'"/>
+ <xsl:with-param name="content">
+ <xsl:call-template name="hhp-main"/>
+ </xsl:with-param>
+ <xsl:with-param name="encoding" select="$htmlhelp.encoding"/>
+ <xsl:with-param name="quiet" select="$chunk.quietly"/>
+ </xsl:call-template>
+</xsl:template>
+
+<!-- ==================================================================== -->
+<xsl:template name="hhp-main">
+
+ <xsl:variable name="raw.help.title">
+ <xsl:choose>
+ <xsl:when test="$htmlhelp.title = ''">
+ <xsl:choose>
+ <xsl:when test="$rootid != ''">
+ <xsl:apply-templates select="$profiled-nodes//*[@id=$rootid]" mode="title.markup"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="$profiled-nodes/*" mode="title.markup"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$htmlhelp.title"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="help.title" select="normalize-space($raw.help.title)"/>
+
+<xsl:variable name="default.topic">
+ <xsl:choose>
+ <xsl:when test="$htmlhelp.default.topic != ''">
+ <xsl:value-of select="$htmlhelp.default.topic"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="make-relative-filename">
+ <xsl:with-param name="base.dir">
+ <xsl:if test="$manifest.in.base.dir = 0">
+ <xsl:value-of select="$base.dir"/>
+ </xsl:if>
+ </xsl:with-param>
+ <xsl:with-param name="base.name">
+ <xsl:choose>
+ <xsl:when test="$rootid != ''">
+ <xsl:apply-templates select="$profiled-nodes//*[@id=$rootid]" mode="chunk-filename"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="$profiled-nodes" mode="chunk-filename"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:variable>
+<xsl:variable name="xnavigation">
+ <xsl:text>0x</xsl:text>
+ <xsl:call-template name="toHex">
+ <xsl:with-param name="n" select="9504 + $htmlhelp.show.menu * 65536 + $htmlhelp.show.advanced.search * 131072 + $htmlhelp.show.favorities * 4096 + (1 - $htmlhelp.show.toolbar.text) * 64 + $htmlhelp.remember.window.position * 262144"/>
+ </xsl:call-template>
+</xsl:variable>
+<xsl:variable name="xbuttons">
+ <xsl:text>0x</xsl:text>
+ <xsl:call-template name="toHex">
+ <xsl:with-param name="n" select="0 + $htmlhelp.button.hideshow * 2 + $htmlhelp.button.back * 4 + $htmlhelp.button.forward * 8 + $htmlhelp.button.stop * 16 + $htmlhelp.button.refresh * 32 + $htmlhelp.button.home * 64 + $htmlhelp.button.options * 4096 + $htmlhelp.button.print * 8192 + $htmlhelp.button.locate * 2048 + $htmlhelp.button.jump1 * 262144 + $htmlhelp.button.jump2 * 524288 + $htmlhelp.button.next * 2097152 + $htmlhelp.button.prev * 4194304 + $htmlhelp.button.zoom * 1048576"/>
+ </xsl:call-template>
+</xsl:variable>
+<xsl:text>[OPTIONS]
+</xsl:text>
+<xsl:if test="$htmlhelp.generate.index">
+<xsl:text>Auto Index=Yes
+</xsl:text></xsl:if>
+<xsl:if test="$htmlhelp.hhc.binary != 0">
+<xsl:text>Binary TOC=Yes
+</xsl:text></xsl:if>
+<xsl:text>Compatibility=1.1 or later
+Compiled file=</xsl:text><xsl:value-of select="$htmlhelp.chm"/><xsl:text>
+Contents file=</xsl:text><xsl:value-of select="$htmlhelp.hhc"/><xsl:text>
+</xsl:text>
+<xsl:if test="$htmlhelp.hhp.window != ''">
+<xsl:text>Default Window=</xsl:text><xsl:value-of select="$htmlhelp.hhp.window"/><xsl:text>
+</xsl:text></xsl:if>
+<xsl:text>Default topic=</xsl:text><xsl:value-of select="$default.topic"/>
+<xsl:text>
+Display compile progress=</xsl:text>
+ <xsl:choose>
+ <xsl:when test="$htmlhelp.display.progress != 1">
+ <xsl:text>No</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text>Yes</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+<xsl:text>
+Full-text search=Yes
+</xsl:text>
+<xsl:if test="$htmlhelp.generate.index">
+<xsl:text>Index file=</xsl:text><xsl:value-of select="$htmlhelp.hhk"/><xsl:text>
+</xsl:text></xsl:if>
+<xsl:text>Language=</xsl:text>
+<xsl:for-each select="*"> <!-- Change context from / to root element -->
+ <xsl:call-template name="gentext.template">
+ <xsl:with-param name="context" select="'htmlhelp'"/>
+ <xsl:with-param name="name" select="'langcode'"/>
+ </xsl:call-template>
+</xsl:for-each>
+<xsl:text>
+Title=</xsl:text>
+ <xsl:value-of select="$help.title"/>
+<xsl:text>
+Enhanced decompilation=</xsl:text>
+ <xsl:choose>
+ <xsl:when test="$htmlhelp.enhanced.decompilation != 0">
+ <xsl:text>Yes</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text>No</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+
+<xsl:if test="$htmlhelp.hhp.window != ''">
+ <xsl:text>
+
+[WINDOWS]
+</xsl:text>
+<xsl:value-of select="$htmlhelp.hhp.window"/>
+<xsl:text>="</xsl:text>
+<xsl:value-of select="$help.title"/>
+<xsl:text>","</xsl:text><xsl:value-of select="$htmlhelp.hhc"/>
+<xsl:text>",</xsl:text>
+<xsl:if test="$htmlhelp.generate.index">
+ <xsl:text>"</xsl:text>
+ <xsl:value-of select="$htmlhelp.hhk"/>
+ <xsl:text>"</xsl:text>
+</xsl:if>
+<xsl:text>,"</xsl:text>
+<xsl:value-of select="$default.topic"/>
+<xsl:text>",</xsl:text>
+<xsl:text>"</xsl:text>
+<xsl:choose>
+ <xsl:when test="$htmlhelp.button.home != 0">
+ <xsl:value-of select="$htmlhelp.button.home.url"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$default.topic"/>
+ </xsl:otherwise>
+</xsl:choose>
+<xsl:text>"</xsl:text>
+<xsl:text>,</xsl:text>
+<xsl:if test="$htmlhelp.button.jump1 != 0">
+ <xsl:text>"</xsl:text>
+ <xsl:value-of select="$htmlhelp.button.jump1.url"/>
+ <xsl:text>"</xsl:text>
+</xsl:if>
+<xsl:text>,</xsl:text>
+<xsl:if test="$htmlhelp.button.jump1 != 0">
+ <xsl:text>"</xsl:text>
+ <xsl:value-of select="$htmlhelp.button.jump1.title"/>
+ <xsl:text>"</xsl:text>
+</xsl:if>
+<xsl:text>,</xsl:text>
+<xsl:if test="$htmlhelp.button.jump2 != 0">
+ <xsl:text>"</xsl:text>
+ <xsl:value-of select="$htmlhelp.button.jump2.url"/>
+ <xsl:text>"</xsl:text>
+</xsl:if>
+<xsl:text>,</xsl:text>
+<xsl:if test="$htmlhelp.button.jump2 != 0">
+ <xsl:text>"</xsl:text>
+ <xsl:value-of select="$htmlhelp.button.jump2.title"/>
+ <xsl:text>"</xsl:text>
+</xsl:if>
+<xsl:text>,</xsl:text>
+<xsl:value-of select="$xnavigation"/>
+<xsl:text>,</xsl:text><xsl:value-of select="$htmlhelp.hhc.width"/><xsl:text>,</xsl:text>
+<xsl:value-of select="$xbuttons"/>
+<xsl:text>,</xsl:text><xsl:value-of select="$htmlhelp.window.geometry"/><xsl:text>,,,,,,,0
+</xsl:text>
+</xsl:if>
+
+<!--
+ Needs more investigation to generate propetly all fields
+<xsl:text>search="</xsl:text>
+<xsl:value-of select="normalize-space(//title[1])"/>
+<xsl:text>","toc.hhc","index.hhk","</xsl:text>
+<xsl:value-of select="$root.filename"/>
+<xsl:text>.html","</xsl:text>
+<xsl:value-of select="$root.filename"/>
+<xsl:text>.html",,,,,</xsl:text>
+<xsl:value-of select="$xnavigation"/>
+<xsl:text>,</xsl:text>
+<xsl:value-of select="$htmlhelp.hhc.width"/>
+<xsl:text>,</xsl:text>
+<xsl:value-of select="$xbuttons"/>
+<xsl:text>,</xsl:text>
+<xsl:value-of select="$htmlhelp.window.geometry"/>
+<xsl:text>,,,,,2,,0
+</xsl:text>
+-->
+
+<xsl:if test="$htmlhelp.hhp.windows">
+ <xsl:value-of select="$htmlhelp.hhp.windows"/>
+</xsl:if>
+<xsl:text>
+
+[FILES]
+</xsl:text>
+
+<xsl:choose>
+ <xsl:when test="$rootid != ''">
+ <xsl:apply-templates select="$profiled-nodes//*[@id=$rootid]" mode="enumerate-files"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="$profiled-nodes" mode="enumerate-files"/>
+ </xsl:otherwise>
+</xsl:choose>
+
+<xsl:if test="$htmlhelp.enumerate.images">
+ <xsl:variable name="imagelist">
+ <xsl:choose>
+ <xsl:when test="$rootid != ''">
+ <xsl:apply-templates select="$profiled-nodes//*[@id=$rootid]" mode="enumerate-images"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="$profiled-nodes" mode="enumerate-images"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:choose>
+ <xsl:when test="$exsl.node.set.available != 0 and function-available('set:distinct')">
+ <xsl:for-each select="set:distinct(exsl:node-set($imagelist)/filename)">
+ <xsl:value-of select="."/>
+ <xsl:text>
+</xsl:text>
+ </xsl:for-each>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$imagelist"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:if>
+
+<xsl:if test="($htmlhelp.force.map.and.alias != 0) or ($rootid = '' and //processing-instruction('dbhh')) or ($rootid != '' and $profiled-nodes//*[@id=$rootid]//processing-instruction('dbhh'))">
+ <xsl:text>
+[ALIAS]
+#include </xsl:text><xsl:value-of select="$htmlhelp.alias.file"/><xsl:text>
+
+[MAP]
+#include </xsl:text><xsl:value-of select="$htmlhelp.map.file"/><xsl:text>
+</xsl:text>
+</xsl:if>
+
+<xsl:value-of select="$htmlhelp.hhp.tail"/>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="graphic|inlinegraphic[@format!='linespecific']" mode="enumerate-images">
+ <xsl:call-template name="write.filename.enumerate-images">
+ <xsl:with-param name="filename">
+ <xsl:call-template name="mediaobject.filename.enumerate-images">
+ <xsl:with-param name="object" select="."/>
+ </xsl:call-template>
+ </xsl:with-param>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="mediaobject|inlinemediaobject" mode="enumerate-images">
+ <xsl:call-template name="select.mediaobject.enumerate-images"/>
+</xsl:template>
+
+<xsl:template name="select.mediaobject.enumerate-images">
+ <xsl:param name="olist" select="imageobject|imageobjectco |videoobject|audioobject|textobject"/>
+ <xsl:param name="count">1</xsl:param>
+
+ <xsl:if test="$count &lt;= count($olist)">
+ <xsl:variable name="object" select="$olist[position()=$count]"/>
+
+ <xsl:variable name="useobject">
+ <xsl:choose>
+ <!-- The phrase is never used -->
+ <xsl:when test="name($object)='textobject' and $object/phrase">
+ <xsl:text>0</xsl:text>
+ </xsl:when>
+ <!-- The first textobject is a reasonable fallback (but not for image in HH) -->
+ <xsl:when test="name($object)='textobject'">
+ <xsl:text>0</xsl:text>
+ </xsl:when>
+ <!-- If there's only one object, use it -->
+ <xsl:when test="$count = 1 and count($olist) = 1">
+ <xsl:text>1</xsl:text>
+ </xsl:when>
+ <!-- Otherwise, see if this one is a useable graphic -->
+ <xsl:otherwise>
+ <xsl:choose>
+ <!-- peek inside imageobjectco to simplify the test -->
+ <xsl:when test="local-name($object) = 'imageobjectco'">
+ <xsl:call-template name="is.acceptable.mediaobject">
+ <xsl:with-param name="object" select="$object/imageobject"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="is.acceptable.mediaobject">
+ <xsl:with-param name="object" select="$object"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="$useobject='1' and $object[not(*/@format='linespecific')]">
+ <xsl:call-template name="write.filename.enumerate-images">
+ <xsl:with-param name="filename">
+ <xsl:call-template name="mediaobject.filename.enumerate-images">
+ <xsl:with-param name="object" select="$object"/>
+ </xsl:call-template>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="select.mediaobject.enumerate-images">
+ <xsl:with-param name="olist" select="$olist"/>
+ <xsl:with-param name="count" select="$count + 1"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template name="mediaobject.filename.enumerate-images">
+ <xsl:param name="object"/>
+
+ <xsl:variable name="urifilename">
+ <xsl:call-template name="mediaobject.filename">
+ <xsl:with-param name="object" select="$object"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="filename">
+ <xsl:choose>
+ <xsl:when test="starts-with($urifilename, 'file:/')">
+ <xsl:value-of select="substring-after($urifilename, 'file:/')"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$urifilename"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:value-of select="translate($filename, '/', '\')"/>
+
+</xsl:template>
+
+<xsl:template match="text()" mode="enumerate-images">
+</xsl:template>
+
+<xsl:template name="write.filename.enumerate-images">
+ <xsl:param name="filename"/>
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set') and function-available('set:distinct')">
+ <filename><xsl:value-of select="$filename"/></filename>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$filename"/>
+ <xsl:text>
+</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<!-- HHC and HHK files are processed by compiler line by line
+ and therefore are very sensitive to whitespaces (linefeeds for sure). -->
+
+<xsl:template name="hhc">
+ <xsl:call-template name="write.chunk">
+ <xsl:with-param name="filename">
+ <xsl:if test="$manifest.in.base.dir != 0">
+ <xsl:value-of select="$base.dir"/>
+ </xsl:if>
+ <xsl:value-of select="$htmlhelp.hhc"/>
+ </xsl:with-param>
+ <xsl:with-param name="indent" select="'no'"/>
+ <xsl:with-param name="content">
+ <xsl:call-template name="hhc-main"/>
+ </xsl:with-param>
+ <xsl:with-param name="encoding" select="$htmlhelp.encoding"/>
+ <xsl:with-param name="quiet" select="$chunk.quietly"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template name="hhc-main">
+<HTML><xsl:text>
+</xsl:text>
+ <HEAD/><xsl:text>
+</xsl:text>
+ <BODY><xsl:text>
+</xsl:text>
+ <xsl:if test="$htmlhelp.hhc.folders.instead.books != 0">
+ <OBJECT type="text/site properties"><xsl:text>
+</xsl:text>
+ <param name="ImageType" value="Folder"/><xsl:text>
+</xsl:text>
+ </OBJECT><xsl:text>
+</xsl:text>
+ </xsl:if>
+ <xsl:variable name="content">
+ <xsl:choose>
+ <xsl:when test="$rootid != ''">
+ <xsl:apply-templates select="$profiled-nodes//*[@id=$rootid]" mode="hhc"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="$profiled-nodes" mode="hhc"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="$htmlhelp.hhc.show.root != 0">
+ <UL><xsl:text>
+</xsl:text>
+ <xsl:copy-of select="$content"/>
+ </UL><xsl:text>
+</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:copy-of select="$content"/>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ </BODY>
+</HTML>
+</xsl:template>
+
+<xsl:template name="hhc.entry">
+ <xsl:param name="title">
+ <xsl:if test="$htmlhelp.autolabel=1">
+ <xsl:variable name="label.markup">
+ <xsl:apply-templates select="." mode="label.markup"/>
+ </xsl:variable>
+ <xsl:if test="normalize-space($label.markup)">
+ <xsl:value-of select="concat($label.markup,$autotoc.label.separator)"/>
+ </xsl:if>
+ </xsl:if>
+ <xsl:apply-templates select="." mode="title.markup"/>
+ </xsl:param>
+
+ <LI><OBJECT type="text/sitemap"><xsl:text>
+</xsl:text>
+ <param name="Name">
+ <xsl:attribute name="value">
+ <xsl:value-of select="normalize-space($title)"/>
+ </xsl:attribute>
+ </param><xsl:text>
+</xsl:text>
+ <param name="Local">
+ <xsl:attribute name="value">
+ <xsl:call-template name="href.target.with.base.dir"/>
+ </xsl:attribute>
+ </param>
+ </OBJECT></LI><xsl:text>
+</xsl:text>
+</xsl:template>
+
+<xsl:template match="set" mode="hhc">
+ <xsl:if test="$htmlhelp.hhc.show.root != 0">
+ <xsl:call-template name="hhc.entry"/>
+ </xsl:if>
+ <xsl:if test="book">
+ <xsl:variable name="toc.params">
+ <xsl:call-template name="find.path.params">
+ <xsl:with-param name="table" select="normalize-space($generate.toc)"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <UL>
+ <xsl:if test="contains($toc.params, 'toc') and $htmlhelp.hhc.show.root = 0">
+ <LI><OBJECT type="text/sitemap"><xsl:text>
+</xsl:text>
+ <param name="Name">
+ <xsl:attribute name="value">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'TableofContents'"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ </param><xsl:text>
+</xsl:text>
+ <param name="Local">
+ <xsl:attribute name="value">
+ <xsl:choose>
+ <xsl:when test="$chunk.tocs.and.lots != 0">
+ <xsl:apply-templates select="." mode="recursive-chunk-filename">
+ <xsl:with-param name="recursive" select="true()"/>
+ </xsl:apply-templates>
+ <xsl:text>-toc</xsl:text>
+ <xsl:value-of select="$html.ext"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="href.target.with.base.dir"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:attribute>
+ </param>
+ </OBJECT></LI><xsl:text>
+</xsl:text>
+ </xsl:if>
+ <xsl:apply-templates select="book" mode="hhc"/>
+ </UL><xsl:text>
+</xsl:text>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="book" mode="hhc">
+ <xsl:if test="$htmlhelp.hhc.show.root != 0 or parent::*">
+ <xsl:call-template name="hhc.entry"/>
+ </xsl:if>
+ <xsl:if test="part|reference|preface|chapter|appendix|bibliography|article|colophon|glossary">
+ <xsl:variable name="toc.params">
+ <xsl:call-template name="find.path.params">
+ <xsl:with-param name="table" select="normalize-space($generate.toc)"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <UL>
+ <xsl:if test="contains($toc.params, 'toc') and $htmlhelp.hhc.show.root = 0 and not(parent::*)">
+ <LI><OBJECT type="text/sitemap"><xsl:text>
+</xsl:text>
+ <param name="Name">
+ <xsl:attribute name="value">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'TableofContents'"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ </param><xsl:text>
+</xsl:text>
+ <param name="Local">
+ <xsl:attribute name="value">
+ <xsl:choose>
+ <xsl:when test="$chunk.tocs.and.lots != 0">
+ <xsl:apply-templates select="." mode="recursive-chunk-filename">
+ <xsl:with-param name="recursive" select="true()"/>
+ </xsl:apply-templates>
+ <xsl:text>-toc</xsl:text>
+ <xsl:value-of select="$html.ext"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="href.target.with.base.dir"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:attribute>
+ </param>
+ </OBJECT></LI><xsl:text>
+</xsl:text>
+ </xsl:if>
+ <xsl:apply-templates select="part|reference|preface|chapter|bibliography|appendix|article|colophon|glossary" mode="hhc"/>
+ </UL><xsl:text>
+</xsl:text>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="part|reference|preface|chapter|bibliography|appendix|article|glossary" mode="hhc">
+ <xsl:if test="$htmlhelp.hhc.show.root != 0 or parent::*">
+ <xsl:call-template name="hhc.entry"/>
+ </xsl:if>
+ <xsl:if test="article|reference|preface|chapter|appendix|refentry|section|sect1|bibliodiv">
+ <UL><xsl:text>
+</xsl:text>
+ <xsl:apply-templates select="article|reference|preface|chapter|appendix|refentry|section|sect1|bibliodiv" mode="hhc"/>
+ </UL>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="section" mode="hhc">
+ <xsl:if test="$htmlhelp.hhc.show.root != 0 or parent::*">
+ <xsl:call-template name="hhc.entry"/>
+ </xsl:if>
+ <xsl:if test="section[count(ancestor::section) &lt; $htmlhelp.hhc.section.depth]|refentry">
+ <UL><xsl:text>
+</xsl:text>
+ <xsl:apply-templates select="section|refentry" mode="hhc"/>
+ </UL>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="sect1" mode="hhc">
+ <xsl:if test="$htmlhelp.hhc.show.root != 0 or parent::*">
+ <xsl:call-template name="hhc.entry"/>
+ </xsl:if>
+ <xsl:if test="sect2[$htmlhelp.hhc.section.depth &gt; 1]|refentry">
+ <UL><xsl:text>
+</xsl:text>
+ <xsl:apply-templates select="sect2|refentry" mode="hhc"/>
+ </UL>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="sect2" mode="hhc">
+ <xsl:if test="$htmlhelp.hhc.show.root != 0 or parent::*">
+ <xsl:call-template name="hhc.entry"/>
+ </xsl:if>
+ <xsl:if test="sect3[$htmlhelp.hhc.section.depth &gt; 2]|refentry">
+ <UL><xsl:text>
+</xsl:text>
+ <xsl:apply-templates select="sect3|refentry" mode="hhc"/>
+ </UL>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="sect3" mode="hhc">
+ <xsl:if test="$htmlhelp.hhc.show.root != 0 or parent::*">
+ <xsl:call-template name="hhc.entry"/>
+ </xsl:if>
+ <xsl:if test="sect4[$htmlhelp.hhc.section.depth &gt; 3]|refentry">
+ <UL><xsl:text>
+</xsl:text>
+ <xsl:apply-templates select="sect4|refentry" mode="hhc"/>
+ </UL>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="sect4" mode="hhc">
+ <xsl:if test="$htmlhelp.hhc.show.root != 0 or parent::*">
+ <xsl:call-template name="hhc.entry"/>
+ </xsl:if>
+ <xsl:if test="sect5[$htmlhelp.hhc.section.depth &gt; 4]|refentry">
+ <UL><xsl:text>
+</xsl:text>
+ <xsl:apply-templates select="sect5|refentry" mode="hhc"/>
+ </UL>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="sect5|refentry|colophon|bibliodiv" mode="hhc">
+ <xsl:if test="$htmlhelp.hhc.show.root != 0 or parent::*">
+ <xsl:call-template name="hhc.entry"/>
+ </xsl:if>
+ <xsl:if test="refentry">
+ <UL><xsl:text>
+</xsl:text>
+ <xsl:apply-templates select="refentry" mode="hhc"/>
+ </UL>
+ </xsl:if>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="indexterm">
+ <xsl:choose>
+ <xsl:when test="$htmlhelp.use.hhk = 0">
+
+ <xsl:variable name="primary" select="normalize-space(primary)"/>
+ <xsl:variable name="secondary" select="normalize-space(secondary)"/>
+ <xsl:variable name="tertiary" select="normalize-space(tertiary)"/>
+
+ <xsl:variable name="text">
+ <xsl:value-of select="$primary"/>
+ <xsl:if test="secondary">
+ <xsl:text>, </xsl:text>
+ <xsl:value-of select="$secondary"/>
+ </xsl:if>
+ <xsl:if test="tertiary">
+ <xsl:text>, </xsl:text>
+ <xsl:value-of select="$tertiary"/>
+ </xsl:if>
+ </xsl:variable>
+
+ <xsl:if test="secondary">
+ <xsl:if test="not(//indexterm[normalize-space(primary)=$primary and not(secondary)])">
+ <xsl:call-template name="write.indexterm">
+ <xsl:with-param name="text" select="$primary"/>
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:if>
+
+ <xsl:if test="tertiary">
+ <xsl:if test="not(//indexterm[normalize-space(primary)=$primary and normalize-space(secondary)=$secondary and not(tertiary)])">
+ <xsl:call-template name="write.indexterm">
+ <xsl:with-param name="text" select="concat($primary, ', ', $secondary)"/>
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:if>
+
+ <xsl:call-template name="write.indexterm">
+ <xsl:with-param name="text" select="$text"/>
+ </xsl:call-template>
+
+ </xsl:when>
+ <xsl:otherwise>
+ <a>
+ <xsl:attribute name="name">
+ <xsl:call-template name="object.id"/>
+ </xsl:attribute>
+ </a>
+ </xsl:otherwise>
+
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="write.indexterm">
+ <xsl:param name="text"/>
+ <OBJECT type="application/x-oleobject" classid="clsid:1e2a7bd0-dab9-11d0-b93a-00c04fc99f9e">
+ <param name="Keyword" value="{$text}"/>
+ </OBJECT>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template name="hhk">
+ <xsl:call-template name="write.chunk">
+ <xsl:with-param name="filename">
+ <xsl:if test="$manifest.in.base.dir != 0">
+ <xsl:value-of select="$base.dir"/>
+ </xsl:if>
+ <xsl:value-of select="$htmlhelp.hhk"/>
+ </xsl:with-param>
+ <xsl:with-param name="indent" select="'no'"/>
+ <xsl:with-param name="content"><xsl:text disable-output-escaping="yes">&lt;!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"&gt;
+&lt;HTML&gt;
+&lt;HEAD&gt;
+&lt;meta name="GENERATOR" content="Microsoft&amp;reg; HTML Help Workshop 4.1"&gt;
+&lt;!-- Sitemap 1.0 --&gt;
+&lt;/HEAD&gt;&lt;BODY&gt;
+&lt;OBJECT type="text/site properties"&gt;
+&lt;/OBJECT&gt;
+&lt;UL&gt;
+</xsl:text>
+<xsl:if test="($htmlhelp.use.hhk != 0) and $htmlhelp.generate.index">
+ <xsl:choose>
+ <xsl:when test="$rootid != ''">
+ <xsl:apply-templates select="$profiled-nodes//*[@id=$rootid]" mode="hhk"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="$profiled-nodes" mode="hhk"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:if>
+<xsl:text disable-output-escaping="yes">&lt;/UL&gt;
+&lt;/BODY&gt;&lt;/HTML&gt;
+</xsl:text></xsl:with-param>
+ <xsl:with-param name="encoding" select="$htmlhelp.encoding"/>
+ <xsl:with-param name="quiet" select="$chunk.quietly"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="indexterm[@class='endofrange']" mode="hhk"/>
+
+<xsl:template match="indexterm" mode="hhk">
+ <xsl:variable name="primary" select="normalize-space(primary)"/>
+ <xsl:variable name="secondary" select="normalize-space(secondary)"/>
+ <xsl:variable name="tertiary" select="normalize-space(tertiary)"/>
+
+ <xsl:call-template name="write.indexterm.hhk">
+ <xsl:with-param name="text" select="$primary"/>
+ <xsl:with-param name="seealso" select="seealso"/>
+ </xsl:call-template>
+
+ <xsl:if test="secondary">
+ <xsl:if test="not(//indexterm[normalize-space(primary)=$primary and not(secondary)])">
+ <xsl:call-template name="write.indexterm.hhk">
+ <!-- We must create fake entry when there is secondary without primary -->
+ <xsl:with-param name="text" select="$primary"/>
+ <xsl:with-param name="seealso" select="$primary"/>
+ </xsl:call-template>
+ </xsl:if>
+ <UL>
+ <xsl:call-template name="write.indexterm.hhk">
+ <xsl:with-param name="text" select="$secondary"/>
+ <xsl:with-param name="seealso" select="secondary/seealso"/>
+ </xsl:call-template>
+ <xsl:if test="tertiary">
+ <UL><xsl:text>
+</xsl:text>
+ <xsl:call-template name="write.indexterm.hhk">
+ <xsl:with-param name="text" select="$tertiary"/>
+ <xsl:with-param name="seealso" select="tertiary/seealso"/>
+ </xsl:call-template>
+ </UL>
+ </xsl:if>
+ </UL>
+ </xsl:if>
+
+</xsl:template>
+
+<xsl:template name="write.indexterm.hhk">
+ <xsl:param name="text"/>
+ <xsl:param name="seealso"/>
+
+ <LI> <OBJECT type="text/sitemap"><xsl:text>
+</xsl:text>
+ <param name="Name">
+ <xsl:attribute name="value">
+ <xsl:value-of select="$text"/>
+ </xsl:attribute>
+ </param><xsl:text>
+</xsl:text>
+
+ <xsl:if test="not(seealso)">
+ <xsl:variable name="href">
+ <xsl:call-template name="href.target.with.base.dir"/>
+ </xsl:variable>
+ <xsl:variable name="title">
+ <xsl:call-template name="nearest.title">
+ <xsl:with-param name="object" select=".."/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <param name="Name">
+ <xsl:attribute name="value">
+ <xsl:value-of select="$title"/>
+ </xsl:attribute>
+ </param><xsl:text>
+</xsl:text>
+ <param name="Local">
+ <xsl:attribute name="value">
+ <xsl:value-of select="$href"/>
+ </xsl:attribute>
+ </param><xsl:text>
+</xsl:text>
+ </xsl:if>
+
+ <xsl:if test="seealso">
+ <param name="See Also">
+ <xsl:attribute name="value">
+ <xsl:value-of select="$seealso"/>
+ </xsl:attribute>
+ </param><xsl:text>
+</xsl:text>
+ </xsl:if>
+ </OBJECT></LI>
+</xsl:template>
+
+<xsl:template match="text()" mode="hhk"/>
+
+<xsl:template name="nearest.title">
+ <xsl:param name="object"/>
+ <xsl:apply-templates select="$object/ancestor-or-self::*[title][1]" mode="title.markup"/>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template name="hh-map">
+ <xsl:call-template name="write.text.chunk">
+ <xsl:with-param name="filename">
+ <xsl:if test="$manifest.in.base.dir != 0">
+ <xsl:value-of select="$base.dir"/>
+ </xsl:if>
+ <xsl:value-of select="$htmlhelp.map.file"/>
+ </xsl:with-param>
+ <xsl:with-param name="method" select="'text'"/>
+ <xsl:with-param name="content">
+ <xsl:choose>
+ <xsl:when test="$rootid != ''">
+ <xsl:apply-templates select="$profiled-nodes//*[@id=$rootid]" mode="hh-map"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="$profiled-nodes" mode="hh-map"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:with-param>
+ <xsl:with-param name="encoding" select="$htmlhelp.encoding"/>
+ <xsl:with-param name="quiet" select="$chunk.quietly"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="processing-instruction('dbhh')" mode="hh-map">
+ <xsl:variable name="topicname">
+ <xsl:call-template name="pi-attribute">
+ <xsl:with-param name="pis" select="."/>
+ <xsl:with-param name="attribute" select="'topicname'"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:variable name="topicid">
+ <xsl:call-template name="pi-attribute">
+ <xsl:with-param name="pis" select="."/>
+ <xsl:with-param name="attribute" select="'topicid'"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:text>#define </xsl:text>
+ <xsl:value-of select="$topicname"/>
+ <xsl:text> </xsl:text>
+ <xsl:value-of select="$topicid"/>
+ <xsl:text>
+</xsl:text>
+</xsl:template>
+
+<xsl:template match="text()" mode="hh-map"/>
+
+<!-- ==================================================================== -->
+
+<xsl:template name="hh-alias">
+ <xsl:call-template name="write.text.chunk">
+ <xsl:with-param name="filename">
+ <xsl:if test="$manifest.in.base.dir != 0">
+ <xsl:value-of select="$base.dir"/>
+ </xsl:if>
+ <xsl:value-of select="$htmlhelp.alias.file"/>
+ </xsl:with-param>
+ <xsl:with-param name="method" select="'text'"/>
+ <xsl:with-param name="content">
+ <xsl:choose>
+ <xsl:when test="$rootid != ''">
+ <xsl:apply-templates select="$profiled-nodes//*[@id=$rootid]" mode="hh-alias"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="$profiled-nodes" mode="hh-alias"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:with-param>
+ <xsl:with-param name="encoding" select="$htmlhelp.encoding"/>
+ <xsl:with-param name="quiet" select="$chunk.quietly"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="processing-instruction('dbhh')" mode="hh-alias">
+ <xsl:variable name="topicname">
+ <xsl:call-template name="pi-attribute">
+ <xsl:with-param name="pis" select="."/>
+ <xsl:with-param name="attribute" select="'topicname'"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:variable name="href">
+ <xsl:call-template name="href.target.with.base.dir">
+ <xsl:with-param name="object" select=".."/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:value-of select="$topicname"/>
+ <xsl:text>=</xsl:text>
+ <!-- Some versions of HH doesn't like fragment identifires, but some does. -->
+ <!-- <xsl:value-of select="substring-before(concat($href, '#'), '#')"/> -->
+ <xsl:value-of select="$href"/>
+ <xsl:text>
+</xsl:text>
+</xsl:template>
+
+<xsl:template match="text()" mode="hh-alias"/>
+
+<!-- ==================================================================== -->
+<!-- This code can be used to convert any number to hexadecimal format -->
+
+ <h:hex>
+ <d>0</d>
+ <d>1</d>
+ <d>2</d>
+ <d>3</d>
+ <d>4</d>
+ <d>5</d>
+ <d>6</d>
+ <d>7</d>
+ <d>8</d>
+ <d>9</d>
+ <d>A</d>
+ <d>B</d>
+ <d>C</d>
+ <d>D</d>
+ <d>E</d>
+ <d>F</d>
+ </h:hex>
+
+ <xsl:template name="toHex">
+ <xsl:param name="n" select="0"/>
+ <xsl:param name="digit" select="$n mod 16"/>
+ <xsl:param name="rest" select="floor($n div 16)"/>
+ <xsl:if test="$rest &gt; 0">
+ <xsl:call-template name="toHex">
+ <xsl:with-param name="n" select="$rest"/>
+ </xsl:call-template>
+ </xsl:if>
+ <xsl:value-of select="document('')//h:hex/d[$digit+1]"/>
+ </xsl:template>
+
+<!-- ==================================================================== -->
+<!-- Modification to standard HTML stylesheets -->
+
+<!-- There are links from ToC pane to bibliodivs, so there must be anchor -->
+<xsl:template match="bibliodiv/title">
+ <h3 class="{name(.)}">
+ <xsl:call-template name="anchor">
+ <xsl:with-param name="node" select=".."/>
+ <xsl:with-param name="conditional" select="0"/>
+ </xsl:call-template>
+ <xsl:apply-templates/>
+ </h3>
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/htmlhelp/profile-htmlhelp.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/htmlhelp/profile-htmlhelp.xsl
new file mode 100644
index 0000000..eddde3b
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/htmlhelp/profile-htmlhelp.xsl
@@ -0,0 +1,22 @@
+<?xml version="1.0"?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:doc="http://nwalsh.com/xsl/documentation/1.0"
+ xmlns:exsl="http://exslt.org/common"
+ xmlns:set="http://exslt.org/sets"
+ version="1.0"
+ exclude-result-prefixes="doc exsl set">
+
+<!-- ********************************************************************
+ $Id: profile-htmlhelp.xsl 1676 2002-06-12 13:21:54Z kosek $
+ ********************************************************************
+
+ This file is used by htmlhelp.xsl if you want to generate source
+ files for HTML Help. It is based on the XSL DocBook Stylesheet
+ distribution (especially on JavaHelp code) from Norman Walsh.
+
+ ******************************************************************** -->
+
+<xsl:import href="../html/chunk.xsl"/>
+<xsl:include href="profile-htmlhelp-common.xsl"/>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/callouts/1.svg b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/callouts/1.svg
new file mode 100644
index 0000000..e2e87dc
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/callouts/1.svg
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 12.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 51448) -->
+<!DOCTYPE svg [
+ <!ENTITY ns_svg "http://www.w3.org/2000/svg">
+ <!ENTITY ns_xlink "http://www.w3.org/1999/xlink">
+]>
+<svg version="1.0" id="Layer_1" xmlns="&ns_svg;" xmlns:xlink="&ns_xlink;" width="33" height="33" viewBox="0 0 33 33"
+ style="overflow:visible;enable-background:new 0 0 33 33;" xml:space="preserve">
+<circle style="stroke:#000000;" cx="16.5" cy="16.5" r="16"/>
+<g>
+ <g style="enable-background:new ;">
+ <path style="fill:#FFFFFF;" d="M10.428,10.411h0.56c3.78,0,4.788-1.96,4.872-3.444h3.22v19.88h-3.92V13.154h-4.732V10.411z"/>
+ </g>
+</g>
+</svg>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/callouts/10.svg b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/callouts/10.svg
new file mode 100644
index 0000000..4740f58
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/callouts/10.svg
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 12.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 51448) -->
+<!DOCTYPE svg [
+ <!ENTITY ns_svg "http://www.w3.org/2000/svg">
+ <!ENTITY ns_xlink "http://www.w3.org/1999/xlink">
+]>
+<svg version="1.0" id="Layer_1" xmlns="&ns_svg;" xmlns:xlink="&ns_xlink;" width="33" height="33" viewBox="0 0 33 33"
+ style="overflow:visible;enable-background:new 0 0 33 33;" xml:space="preserve">
+<circle style="stroke:#000000;" cx="16.5" cy="16.5" r="16"/>
+<g>
+ <g style="enable-background:new ;">
+ <path style="fill:#FFFFFF;" d="M3.815,10.758h0.48c3.24,0,4.104-1.681,4.176-2.952h2.76v17.04h-3.36V13.11H3.815V10.758z"/>
+ <path style="fill:#FFFFFF;" d="M22.175,7.806c4.009,0,5.904,2.76,5.904,8.736c0,5.975-1.896,8.76-5.904,8.76
+ c-4.008,0-5.904-2.785-5.904-8.76C16.271,10.566,18.167,7.806,22.175,7.806z M22.175,22.613c1.921,0,2.448-1.68,2.448-6.071
+ c0-4.393-0.527-6.049-2.448-6.049c-1.92,0-2.448,1.656-2.448,6.049C19.727,20.934,20.255,22.613,22.175,22.613z"/>
+ </g>
+</g>
+</svg>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/callouts/11.svg b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/callouts/11.svg
new file mode 100644
index 0000000..09a0b2c
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/callouts/11.svg
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 12.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 51448) -->
+<!DOCTYPE svg [
+ <!ENTITY ns_svg "http://www.w3.org/2000/svg">
+ <!ENTITY ns_xlink "http://www.w3.org/1999/xlink">
+]>
+<svg version="1.0" id="Layer_1" xmlns="&ns_svg;" xmlns:xlink="&ns_xlink;" width="33" height="33" viewBox="0 0 33 33"
+ style="overflow:visible;enable-background:new 0 0 33 33;" xml:space="preserve">
+<circle style="stroke:#000000;" cx="16.5" cy="16.5" r="16"/>
+<g>
+ <g style="enable-background:new ;">
+ <path style="fill:#FFFFFF;" d="M5.209,10.412h0.48c3.24,0,4.104-1.681,4.176-2.952h2.76V24.5h-3.36V12.764H5.209V10.412z"/>
+ <path style="fill:#FFFFFF;" d="M18.553,10.412h0.48c3.24,0,4.104-1.681,4.176-2.952h2.76V24.5h-3.359V12.764h-4.056V10.412z"/>
+ </g>
+</g>
+</svg>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/callouts/12.svg b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/callouts/12.svg
new file mode 100644
index 0000000..9794044
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/callouts/12.svg
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 12.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 51448) -->
+<!DOCTYPE svg [
+ <!ENTITY ns_svg "http://www.w3.org/2000/svg">
+ <!ENTITY ns_xlink "http://www.w3.org/1999/xlink">
+]>
+<svg version="1.0" id="Layer_1" xmlns="&ns_svg;" xmlns:xlink="&ns_xlink;" width="33" height="33" viewBox="0 0 33 33"
+ style="overflow:visible;enable-background:new 0 0 33 33;" xml:space="preserve">
+<circle style="stroke:#000000;" cx="16.5" cy="16.5" r="16"/>
+<g>
+ <g style="enable-background:new ;">
+ <path style="fill:#FFFFFF;" d="M4.813,10.412h0.48c3.24,0,4.104-1.681,4.176-2.952h2.76V24.5h-3.36V12.764H4.813V10.412z"/>
+ <path style="fill:#FFFFFF;" d="M17.316,13.484c0-5.545,4.056-6.024,5.568-6.024c3.265,0,5.856,1.92,5.856,5.376
+ c0,2.928-1.896,4.416-3.553,5.544c-2.256,1.584-3.432,2.353-3.815,3.145h7.392V24.5h-11.64c0.12-1.992,0.264-4.08,3.96-6.768
+ c3.072-2.232,4.296-3.097,4.296-5.017c0-1.128-0.72-2.424-2.353-2.424c-2.352,0-2.423,1.944-2.447,3.192H17.316z"/>
+ </g>
+</g>
+</svg>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/callouts/13.svg b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/callouts/13.svg
new file mode 100644
index 0000000..64268bb
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/callouts/13.svg
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 12.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 51448) -->
+<!DOCTYPE svg [
+ <!ENTITY ns_svg "http://www.w3.org/2000/svg">
+ <!ENTITY ns_xlink "http://www.w3.org/1999/xlink">
+]>
+<svg version="1.0" id="Layer_1" xmlns="&ns_svg;" xmlns:xlink="&ns_xlink;" width="33" height="33" viewBox="0 0 33 33"
+ style="overflow:visible;enable-background:new 0 0 33 33;" xml:space="preserve">
+<circle style="stroke:#000000;" cx="16.5" cy="16.5" r="16"/>
+<g>
+ <g style="enable-background:new ;">
+ <path style="fill:#FFFFFF;" d="M3.813,10.412h0.48c3.24,0,4.104-1.681,4.176-2.952h2.76V24.5h-3.36V12.764H3.813V10.412z"/>
+ <path style="fill:#FFFFFF;" d="M20.611,14.636h0.529c1.008,0,2.855-0.096,2.855-2.304c0-0.624-0.288-2.185-2.137-2.185
+ c-2.303,0-2.303,2.185-2.303,2.784h-3.12c0-3.191,1.8-5.472,5.64-5.472c2.279,0,5.279,1.152,5.279,4.752
+ c0,1.728-1.08,2.808-2.039,3.24V15.5c0.6,0.168,2.568,1.056,2.568,3.96c0,3.216-2.377,5.496-5.809,5.496
+ c-1.607,0-5.928-0.36-5.928-5.688h3.288l-0.024,0.024c0,0.912,0.24,2.976,2.496,2.976c1.344,0,2.52-0.911,2.52-2.808
+ c0-2.328-2.256-2.424-3.816-2.424V14.636z"/>
+ </g>
+</g>
+</svg>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/callouts/14.svg b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/callouts/14.svg
new file mode 100644
index 0000000..469aa97
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/callouts/14.svg
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 12.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 51448) -->
+<!DOCTYPE svg [
+ <!ENTITY ns_svg "http://www.w3.org/2000/svg">
+ <!ENTITY ns_xlink "http://www.w3.org/1999/xlink">
+]>
+<svg version="1.0" id="Layer_1" xmlns="&ns_svg;" xmlns:xlink="&ns_xlink;" width="33" height="33" viewBox="0 0 33 33"
+ style="overflow:visible;enable-background:new 0 0 33 33;" xml:space="preserve">
+<circle style="stroke:#000000;" cx="16.5" cy="16.5" r="16"/>
+<g>
+ <g style="enable-background:new ;">
+ <path style="fill:#FFFFFF;" d="M4.146,10.412h0.48c3.24,0,4.104-1.681,4.176-2.952h2.76V24.5h-3.36V12.764H4.146V10.412z"/>
+ <path style="fill:#FFFFFF;" d="M28.457,20.732h-1.896V24.5h-3.36v-3.768h-6.72v-2.904L22.746,7.46h3.815v10.656h1.896V20.732z
+ M23.201,18.116c0-4.128,0.072-6.792,0.072-7.32h-0.048l-4.272,7.32H23.201z"/>
+ </g>
+</g>
+</svg>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/callouts/15.svg b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/callouts/15.svg
new file mode 100644
index 0000000..8202233
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/callouts/15.svg
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 12.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 51448) -->
+<!DOCTYPE svg [
+ <!ENTITY ns_svg "http://www.w3.org/2000/svg">
+ <!ENTITY ns_xlink "http://www.w3.org/1999/xlink">
+]>
+<svg version="1.0" id="Layer_1" xmlns="&ns_svg;" xmlns:xlink="&ns_xlink;" width="33" height="33" viewBox="0 0 33 33"
+ style="overflow:visible;enable-background:new 0 0 33 33;" xml:space="preserve">
+<circle style="stroke:#000000;" cx="16.5" cy="16.5" r="16"/>
+<g>
+ <g style="enable-background:new ;">
+ <path style="fill:#FFFFFF;" d="M3.479,11.079h0.48c3.24,0,4.104-1.681,4.176-2.952h2.76v17.04h-3.36V13.43H3.479V11.079z"/>
+ <path style="fill:#FFFFFF;" d="M19.342,14.943c0.625-0.433,1.392-0.937,3.048-0.937c2.279,0,5.16,1.584,5.16,5.496
+ c0,2.328-1.176,6.121-6.192,6.121c-2.664,0-5.376-1.584-5.544-5.016h3.36c0.144,1.391,0.888,2.326,2.376,2.326
+ c1.607,0,2.544-1.367,2.544-3.191c0-1.512-0.72-3.047-2.496-3.047c-0.456,0-1.608,0.023-2.256,1.223l-3-0.143l1.176-9.361h9.36
+ v2.832h-6.937L19.342,14.943z"/>
+ </g>
+</g>
+</svg>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/callouts/16.svg b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/callouts/16.svg
new file mode 100644
index 0000000..01d6bf8
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/callouts/16.svg
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 12.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 51448) -->
+<!DOCTYPE svg [
+ <!ENTITY ns_svg "http://www.w3.org/2000/svg">
+ <!ENTITY ns_xlink "http://www.w3.org/1999/xlink">
+]>
+<svg version="1.0" id="Layer_1" xmlns="&ns_svg;" xmlns:xlink="&ns_xlink;" width="33" height="33" viewBox="0 0 33 33"
+ style="overflow:visible;enable-background:new 0 0 33 33;" xml:space="preserve">
+<circle style="stroke:#000000;" cx="16.5" cy="16.5" r="16"/>
+<g>
+ <g style="enable-background:new ;">
+ <path style="fill:#FFFFFF;" d="M3.813,10.412h0.48c3.24,0,4.104-1.681,4.176-2.952h2.76V24.5h-3.36V12.764H3.813V10.412z"/>
+ <path style="fill:#FFFFFF;" d="M24.309,11.78c-0.097-0.96-0.721-1.633-1.969-1.633c-2.184,0-2.688,2.496-2.808,4.704L19.58,14.9
+ c0.456-0.624,1.296-1.416,3.191-1.416c3.529,0,5.209,2.712,5.209,5.256c0,3.72-2.28,6.216-5.568,6.216
+ c-5.16,0-6.168-4.32-6.168-8.568c0-3.24,0.432-8.928,6.336-8.928c0.695,0,2.641,0.264,3.48,1.104
+ c0.936,0.912,1.271,1.416,1.584,3.217H24.309z M22.172,16.172c-1.271,0-2.568,0.792-2.568,2.928c0,1.849,1.056,3.168,2.664,3.168
+ c1.225,0,2.353-0.936,2.353-3.239C24.62,16.868,23.229,16.172,22.172,16.172z"/>
+ </g>
+</g>
+</svg>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/callouts/17.svg b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/callouts/17.svg
new file mode 100644
index 0000000..0a04c55
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/callouts/17.svg
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 12.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 51448) -->
+<!DOCTYPE svg [
+ <!ENTITY ns_svg "http://www.w3.org/2000/svg">
+ <!ENTITY ns_xlink "http://www.w3.org/1999/xlink">
+]>
+<svg version="1.0" id="Layer_1" xmlns="&ns_svg;" xmlns:xlink="&ns_xlink;" width="33" height="33" viewBox="0 0 33 33"
+ style="overflow:visible;enable-background:new 0 0 33 33;" xml:space="preserve">
+<circle style="stroke:#000000;" cx="16.5" cy="16.5" r="16"/>
+<g>
+ <g style="enable-background:new ;">
+ <path style="fill:#FFFFFF;" d="M3.479,11.079h0.48c3.24,0,4.104-1.681,4.176-2.952h2.76v17.04h-3.36V13.43H3.479V11.079z"/>
+ <path style="fill:#FFFFFF;" d="M27.838,11.006c-1.631,1.776-5.807,6.816-6.215,14.16h-3.457c0.36-6.816,4.632-12.24,6.072-13.776
+ h-8.472l0.072-2.976h12V11.006z"/>
+ </g>
+</g>
+</svg>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/callouts/18.svg b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/callouts/18.svg
new file mode 100644
index 0000000..1cb891b
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/callouts/18.svg
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 12.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 51448) -->
+<!DOCTYPE svg [
+ <!ENTITY ns_svg "http://www.w3.org/2000/svg">
+ <!ENTITY ns_xlink "http://www.w3.org/1999/xlink">
+]>
+<svg version="1.0" id="Layer_1" xmlns="&ns_svg;" xmlns:xlink="&ns_xlink;" width="33" height="33" viewBox="0 0 33 33"
+ style="overflow:visible;enable-background:new 0 0 33 33;" xml:space="preserve">
+<circle style="stroke:#000000;" cx="16.5" cy="16.5" r="16"/>
+<g>
+ <g style="enable-background:new ;">
+ <path style="fill:#FFFFFF;" d="M4.813,10.412h0.48c3.24,0,4.104-1.681,4.176-2.952h2.76V24.5h-3.36V12.764H4.813V10.412z"/>
+ <path style="fill:#FFFFFF;" d="M23.172,24.956c-4.392,0-5.904-2.856-5.904-5.185c0-0.863,0-3.119,2.592-4.319
+ c-1.344-0.672-2.064-1.752-2.064-3.336c0-2.904,2.328-4.656,5.304-4.656c3.528,0,5.4,2.088,5.4,4.44
+ c0,1.464-0.6,2.712-1.968,3.432c1.632,0.815,2.544,1.896,2.544,4.104C29.076,21.596,27.684,24.956,23.172,24.956z M23.124,16.916
+ c-1.224,0-2.4,0.792-2.4,2.64c0,1.632,0.936,2.712,2.472,2.712c1.752,0,2.424-1.512,2.424-2.688
+ C25.62,18.38,24.996,16.916,23.124,16.916z M25.284,12.26c0-1.296-0.888-2.112-1.968-2.112c-1.512,0-2.305,0.864-2.305,2.112
+ c0,1.008,0.744,2.112,2.185,2.112C24.516,14.372,25.284,13.484,25.284,12.26z"/>
+ </g>
+</g>
+</svg>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/callouts/19.svg b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/callouts/19.svg
new file mode 100644
index 0000000..e6fbb17
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/callouts/19.svg
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 12.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 51448) -->
+<!DOCTYPE svg [
+ <!ENTITY ns_svg "http://www.w3.org/2000/svg">
+ <!ENTITY ns_xlink "http://www.w3.org/1999/xlink">
+]>
+<svg version="1.0" id="Layer_1" xmlns="&ns_svg;" xmlns:xlink="&ns_xlink;" width="33" height="33" viewBox="0 0 33 33"
+ style="overflow:visible;enable-background:new 0 0 33 33;" xml:space="preserve">
+<circle style="stroke:#000000;" cx="16.5" cy="16.5" r="16"/>
+<g>
+ <g style="enable-background:new ;">
+ <path style="fill:#FFFFFF;" d="M4.146,10.746h0.48c3.24,0,4.104-1.681,4.176-2.952h2.76v17.041h-3.36V13.097H4.146V10.746z"/>
+ <path style="fill:#FFFFFF;" d="M20.225,20.898v0.023c0.192,1.176,0.936,1.68,1.968,1.68c1.392,0,2.783-1.176,2.808-4.752
+ l-0.048-0.049c-0.768,1.152-2.088,1.441-3.24,1.441c-3.264,0-5.16-2.473-5.16-5.329c0-4.176,2.472-6.12,5.808-6.12
+ c5.904,0,6,6.36,6,8.76c0,6.601-3.12,8.736-6.192,8.736c-2.904,0-4.992-1.68-5.28-4.391H20.225z M22.434,16.553
+ c1.176,0,2.472-0.84,2.472-2.855c0-1.944-0.841-3.145-2.568-3.145c-0.864,0-2.424,0.433-2.424,2.88
+ C19.913,16.001,21.161,16.553,22.434,16.553z"/>
+ </g>
+</g>
+</svg>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/callouts/2.svg b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/callouts/2.svg
new file mode 100644
index 0000000..07d0339
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/callouts/2.svg
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 12.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 51448) -->
+<!DOCTYPE svg [
+ <!ENTITY ns_svg "http://www.w3.org/2000/svg">
+ <!ENTITY ns_xlink "http://www.w3.org/1999/xlink">
+]>
+<svg version="1.0" id="Layer_1" xmlns="&ns_svg;" xmlns:xlink="&ns_xlink;" width="33" height="33" viewBox="0 0 33 33"
+ style="overflow:visible;enable-background:new 0 0 33 33;" xml:space="preserve">
+<circle style="stroke:#000000;" cx="16.5" cy="16.5" r="16"/>
+<g>
+ <g style="enable-background:new ;">
+ <path style="fill:#FFFFFF;" d="M9.668,12.328c0-6.469,4.732-7.028,6.496-7.028c3.808,0,6.833,2.24,6.833,6.271
+ c0,3.416-2.213,5.152-4.145,6.469c-2.632,1.848-4.004,2.744-4.452,3.668h8.624v3.472H9.444c0.14-2.324,0.308-4.76,4.62-7.896
+ c3.584-2.604,5.012-3.612,5.012-5.853c0-1.315-0.84-2.828-2.744-2.828c-2.744,0-2.828,2.269-2.856,3.725H9.668z"/>
+ </g>
+</g>
+</svg>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/callouts/20.svg b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/callouts/20.svg
new file mode 100644
index 0000000..ccbfd40
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/callouts/20.svg
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 12.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 51448) -->
+<!DOCTYPE svg [
+ <!ENTITY ns_svg "http://www.w3.org/2000/svg">
+ <!ENTITY ns_xlink "http://www.w3.org/1999/xlink">
+]>
+<svg version="1.0" id="Layer_1" xmlns="&ns_svg;" xmlns:xlink="&ns_xlink;" width="33" height="33" viewBox="0 0 33 33"
+ style="overflow:visible;enable-background:new 0 0 33 33;" xml:space="preserve">
+<circle style="stroke:#000000;" cx="16.5" cy="16.5" r="16"/>
+<g>
+ <g style="enable-background:new ;">
+ <path style="fill:#FFFFFF;" d="M3.972,13.484c0-5.545,4.056-6.024,5.568-6.024c3.264,0,5.856,1.92,5.856,5.376
+ c0,2.928-1.896,4.416-3.552,5.544c-2.256,1.584-3.432,2.353-3.816,3.145h7.392V24.5H3.78c0.12-1.992,0.264-4.08,3.96-6.768
+ c3.072-2.232,4.296-3.097,4.296-5.017c0-1.128-0.72-2.424-2.352-2.424c-2.352,0-2.424,1.944-2.448,3.192H3.972z"/>
+ <path style="fill:#FFFFFF;" d="M23.172,7.46c4.008,0,5.904,2.76,5.904,8.736c0,5.976-1.896,8.76-5.904,8.76
+ s-5.904-2.784-5.904-8.76C17.268,10.22,19.164,7.46,23.172,7.46z M23.172,22.268c1.92,0,2.448-1.68,2.448-6.071
+ c0-4.393-0.528-6.049-2.448-6.049s-2.448,1.656-2.448,6.049C20.724,20.588,21.252,22.268,23.172,22.268z"/>
+ </g>
+</g>
+</svg>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/callouts/21.svg b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/callouts/21.svg
new file mode 100644
index 0000000..93ec53f
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/callouts/21.svg
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 12.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 51448) -->
+<!DOCTYPE svg [
+ <!ENTITY ns_svg "http://www.w3.org/2000/svg">
+ <!ENTITY ns_xlink "http://www.w3.org/1999/xlink">
+]>
+<svg version="1.0" id="Layer_1" xmlns="&ns_svg;" xmlns:xlink="&ns_xlink;" width="33" height="33" viewBox="0 0 33 33"
+ style="overflow:visible;enable-background:new 0 0 33 33;" xml:space="preserve">
+<circle style="stroke:#000000;" cx="16.5" cy="16.5" r="16"/>
+<g>
+ <g style="enable-background:new ;">
+ <path style="fill:#FFFFFF;" d="M5.306,13.151c0-5.545,4.056-6.024,5.568-6.024c3.264,0,5.856,1.92,5.856,5.376
+ c0,2.928-1.896,4.416-3.552,5.544c-2.256,1.584-3.432,2.353-3.816,3.145h7.392v2.976H5.114c0.12-1.992,0.264-4.08,3.96-6.768
+ c3.072-2.232,4.296-3.097,4.296-5.017c0-1.128-0.72-2.424-2.352-2.424c-2.352,0-2.424,1.944-2.448,3.192H5.306z"/>
+ <path style="fill:#FFFFFF;" d="M19.49,10.079h0.48c3.239,0,4.104-1.681,4.176-2.952h2.761v17.04h-3.361V12.431H19.49V10.079z"/>
+ </g>
+</g>
+</svg>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/callouts/22.svg b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/callouts/22.svg
new file mode 100644
index 0000000..f48c5f3
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/callouts/22.svg
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 12.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 51448) -->
+<!DOCTYPE svg [
+ <!ENTITY ns_svg "http://www.w3.org/2000/svg">
+ <!ENTITY ns_xlink "http://www.w3.org/1999/xlink">
+]>
+<svg version="1.0" id="Layer_1" xmlns="&ns_svg;" xmlns:xlink="&ns_xlink;" width="33" height="33" viewBox="0 0 33 33"
+ style="overflow:visible;enable-background:new 0 0 33 33;" xml:space="preserve">
+<circle style="stroke:#000000;" cx="16.5" cy="16.5" r="16"/>
+<g>
+ <g style="enable-background:new ;">
+ <path style="fill:#FFFFFF;" d="M3.972,13.484c0-5.545,4.056-6.024,5.568-6.024c3.264,0,5.856,1.92,5.856,5.376
+ c0,2.928-1.896,4.416-3.552,5.544c-2.256,1.584-3.432,2.353-3.816,3.145h7.392V24.5H3.78c0.12-1.992,0.264-4.08,3.96-6.768
+ c3.072-2.232,4.296-3.097,4.296-5.017c0-1.128-0.72-2.424-2.352-2.424c-2.352,0-2.424,1.944-2.448,3.192H3.972z"/>
+ <path style="fill:#FFFFFF;" d="M17.316,13.484c0-5.545,4.056-6.024,5.568-6.024c3.265,0,5.856,1.92,5.856,5.376
+ c0,2.928-1.896,4.416-3.553,5.544c-2.256,1.584-3.432,2.353-3.815,3.145h7.392V24.5h-11.64c0.12-1.992,0.264-4.08,3.96-6.768
+ c3.072-2.232,4.296-3.097,4.296-5.017c0-1.128-0.72-2.424-2.353-2.424c-2.352,0-2.423,1.944-2.447,3.192H17.316z"/>
+ </g>
+</g>
+</svg>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/callouts/23.svg b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/callouts/23.svg
new file mode 100644
index 0000000..6624212
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/callouts/23.svg
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 12.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 51448) -->
+<!DOCTYPE svg [
+ <!ENTITY ns_svg "http://www.w3.org/2000/svg">
+ <!ENTITY ns_xlink "http://www.w3.org/1999/xlink">
+]>
+<svg version="1.0" id="Layer_1" xmlns="&ns_svg;" xmlns:xlink="&ns_xlink;" width="33" height="33" viewBox="0 0 33 33"
+ style="overflow:visible;enable-background:new 0 0 33 33;" xml:space="preserve">
+<circle style="stroke:#000000;" cx="16.5" cy="16.5" r="16"/>
+<g>
+ <g style="enable-background:new ;">
+ <path style="fill:#FFFFFF;" d="M3.972,13.484c0-5.545,4.056-6.024,5.568-6.024c3.264,0,5.856,1.92,5.856,5.376
+ c0,2.928-1.896,4.416-3.552,5.544c-2.256,1.584-3.432,2.353-3.816,3.145h7.392V24.5H3.78c0.12-1.992,0.264-4.08,3.96-6.768
+ c3.072-2.232,4.296-3.097,4.296-5.017c0-1.128-0.72-2.424-2.352-2.424c-2.352,0-2.424,1.944-2.448,3.192H3.972z"/>
+ <path style="fill:#FFFFFF;" d="M21.612,14.636h0.528c1.008,0,2.855-0.096,2.855-2.304c0-0.624-0.287-2.185-2.136-2.185
+ c-2.304,0-2.304,2.185-2.304,2.784h-3.12c0-3.191,1.8-5.472,5.64-5.472c2.28,0,5.28,1.152,5.28,4.752
+ c0,1.728-1.08,2.808-2.04,3.24V15.5c0.6,0.168,2.568,1.056,2.568,3.96c0,3.216-2.377,5.496-5.809,5.496
+ c-1.607,0-5.928-0.36-5.928-5.688h3.288l-0.024,0.024c0,0.912,0.24,2.976,2.496,2.976c1.344,0,2.521-0.911,2.521-2.808
+ c0-2.328-2.257-2.424-3.816-2.424V14.636z"/>
+ </g>
+</g>
+</svg>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/callouts/24.svg b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/callouts/24.svg
new file mode 100644
index 0000000..a3d5525
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/callouts/24.svg
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 12.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 51448) -->
+<!DOCTYPE svg [
+ <!ENTITY ns_svg "http://www.w3.org/2000/svg">
+ <!ENTITY ns_xlink "http://www.w3.org/1999/xlink">
+]>
+<svg version="1.0" id="Layer_1" xmlns="&ns_svg;" xmlns:xlink="&ns_xlink;" width="33" height="33" viewBox="0 0 33 33"
+ style="overflow:visible;enable-background:new 0 0 33 33;" xml:space="preserve">
+<circle style="stroke:#000000;" cx="16.5" cy="16.5" r="16"/>
+<g>
+ <g style="enable-background:new ;">
+ <path style="fill:#FFFFFF;" d="M4.972,13.484c0-5.545,4.056-6.024,5.568-6.024c3.264,0,5.856,1.92,5.856,5.376
+ c0,2.928-1.896,4.416-3.552,5.544c-2.256,1.584-3.432,2.353-3.816,3.145h7.392V24.5H4.78c0.12-1.992,0.264-4.08,3.96-6.768
+ c3.072-2.232,4.296-3.097,4.296-5.017c0-1.128-0.72-2.424-2.352-2.424c-2.352,0-2.424,1.944-2.448,3.192H4.972z"/>
+ <path style="fill:#FFFFFF;" d="M30.124,20.732h-1.896V24.5h-3.36v-3.768h-6.72v-2.904L24.412,7.46h3.816v10.656h1.896V20.732z
+ M24.868,18.116c0-4.128,0.071-6.792,0.071-7.32h-0.047l-4.272,7.32H24.868z"/>
+ </g>
+</g>
+</svg>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/callouts/25.svg b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/callouts/25.svg
new file mode 100644
index 0000000..56614a9
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/callouts/25.svg
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 12.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 51448) -->
+<!DOCTYPE svg [
+ <!ENTITY ns_svg "http://www.w3.org/2000/svg">
+ <!ENTITY ns_xlink "http://www.w3.org/1999/xlink">
+]>
+<svg version="1.0" id="Layer_1" xmlns="&ns_svg;" xmlns:xlink="&ns_xlink;" width="33" height="33" viewBox="0 0 33 33"
+ style="overflow:visible;enable-background:new 0 0 33 33;" xml:space="preserve">
+<circle style="stroke:#000000;" cx="16.5" cy="16.5" r="16"/>
+<g>
+ <g style="enable-background:new ;">
+ <path style="fill:#FFFFFF;" d="M3.972,13.484c0-5.545,4.056-6.024,5.568-6.024c3.264,0,5.856,1.92,5.856,5.376
+ c0,2.928-1.896,4.416-3.552,5.544c-2.256,1.584-3.432,2.353-3.816,3.145h7.392V24.5H3.78c0.12-1.992,0.264-4.08,3.96-6.768
+ c3.072-2.232,4.296-3.097,4.296-5.017c0-1.128-0.72-2.424-2.352-2.424c-2.352,0-2.424,1.944-2.448,3.192H3.972z"/>
+ <path style="fill:#FFFFFF;" d="M20.676,14.276c0.624-0.433,1.393-0.937,3.049-0.937c2.279,0,5.16,1.584,5.16,5.496
+ c0,2.328-1.177,6.12-6.193,6.12c-2.664,0-5.375-1.584-5.543-5.016h3.36c0.144,1.392,0.889,2.327,2.376,2.327
+ c1.608,0,2.544-1.367,2.544-3.191c0-1.513-0.72-3.048-2.496-3.048c-0.455,0-1.607,0.023-2.256,1.224l-3-0.144l1.176-9.36h9.36
+ v2.832h-6.937L20.676,14.276z"/>
+ </g>
+</g>
+</svg>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/callouts/26.svg b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/callouts/26.svg
new file mode 100644
index 0000000..56faeac
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/callouts/26.svg
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 12.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 51448) -->
+<!DOCTYPE svg [
+ <!ENTITY ns_svg "http://www.w3.org/2000/svg">
+ <!ENTITY ns_xlink "http://www.w3.org/1999/xlink">
+]>
+<svg version="1.0" id="Layer_1" xmlns="&ns_svg;" xmlns:xlink="&ns_xlink;" width="33" height="33" viewBox="0 0 33 33"
+ style="overflow:visible;enable-background:new 0 0 33 33;" xml:space="preserve">
+<circle style="stroke:#000000;" cx="16.5" cy="16.5" r="16"/>
+<g>
+ <g style="enable-background:new ;">
+ <path style="fill:#FFFFFF;" d="M3.972,13.484c0-5.545,4.056-6.024,5.568-6.024c3.264,0,5.856,1.92,5.856,5.376
+ c0,2.928-1.896,4.416-3.552,5.544c-2.256,1.584-3.432,2.353-3.816,3.145h7.392V24.5H3.78c0.12-1.992,0.264-4.08,3.96-6.768
+ c3.072-2.232,4.296-3.097,4.296-5.017c0-1.128-0.72-2.424-2.352-2.424c-2.352,0-2.424,1.944-2.448,3.192H3.972z"/>
+ <path style="fill:#FFFFFF;" d="M25.309,11.78c-0.097-0.96-0.721-1.633-1.969-1.633c-2.184,0-2.688,2.496-2.808,4.704L20.58,14.9
+ c0.456-0.624,1.296-1.416,3.191-1.416c3.529,0,5.209,2.712,5.209,5.256c0,3.72-2.28,6.216-5.568,6.216
+ c-5.16,0-6.168-4.32-6.168-8.568c0-3.24,0.432-8.928,6.336-8.928c0.695,0,2.641,0.264,3.48,1.104
+ c0.936,0.912,1.271,1.416,1.584,3.217H25.309z M23.172,16.172c-1.271,0-2.568,0.792-2.568,2.928c0,1.849,1.056,3.168,2.664,3.168
+ c1.225,0,2.353-0.936,2.353-3.239C25.62,16.868,24.229,16.172,23.172,16.172z"/>
+ </g>
+</g>
+</svg>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/callouts/27.svg b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/callouts/27.svg
new file mode 100644
index 0000000..a75c812
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/callouts/27.svg
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 12.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 51448) -->
+<!DOCTYPE svg [
+ <!ENTITY ns_svg "http://www.w3.org/2000/svg">
+ <!ENTITY ns_xlink "http://www.w3.org/1999/xlink">
+]>
+<svg version="1.0" id="Layer_1" xmlns="&ns_svg;" xmlns:xlink="&ns_xlink;" width="33" height="33" viewBox="0 0 33 33"
+ style="overflow:visible;enable-background:new 0 0 33 33;" xml:space="preserve">
+<circle style="stroke:#000000;" cx="16.5" cy="16.5" r="16"/>
+<g>
+ <g style="enable-background:new ;">
+ <path style="fill:#FFFFFF;" d="M3.972,13.484c0-5.545,4.056-6.024,5.568-6.024c3.264,0,5.856,1.92,5.856,5.376
+ c0,2.928-1.896,4.416-3.552,5.544c-2.256,1.584-3.432,2.353-3.816,3.145h7.392V24.5H3.78c0.12-1.992,0.264-4.08,3.96-6.768
+ c3.072-2.232,4.296-3.097,4.296-5.017c0-1.128-0.72-2.424-2.352-2.424c-2.352,0-2.424,1.944-2.448,3.192H3.972z"/>
+ <path style="fill:#FFFFFF;" d="M29.172,10.34c-1.632,1.776-5.808,6.816-6.216,14.16H19.5c0.36-6.816,4.632-12.24,6.072-13.776
+ H17.1l0.072-2.976h12V10.34z"/>
+ </g>
+</g>
+</svg>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/callouts/28.svg b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/callouts/28.svg
new file mode 100644
index 0000000..7f8cf1a
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/callouts/28.svg
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 12.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 51448) -->
+<!DOCTYPE svg [
+ <!ENTITY ns_svg "http://www.w3.org/2000/svg">
+ <!ENTITY ns_xlink "http://www.w3.org/1999/xlink">
+]>
+<svg version="1.0" id="Layer_1" xmlns="&ns_svg;" xmlns:xlink="&ns_xlink;" width="33" height="33" viewBox="0 0 33 33"
+ style="overflow:visible;enable-background:new 0 0 33 33;" xml:space="preserve">
+<circle style="stroke:#000000;" cx="16.5" cy="16.5" r="16"/>
+<g>
+ <g style="enable-background:new ;">
+ <path style="fill:#FFFFFF;" d="M3.972,13.484c0-5.545,4.056-6.024,5.568-6.024c3.264,0,5.856,1.92,5.856,5.376
+ c0,2.928-1.896,4.416-3.552,5.544c-2.256,1.584-3.432,2.353-3.816,3.145h7.392V24.5H3.78c0.12-1.992,0.264-4.08,3.96-6.768
+ c3.072-2.232,4.296-3.097,4.296-5.017c0-1.128-0.72-2.424-2.352-2.424c-2.352,0-2.424,1.944-2.448,3.192H3.972z"/>
+ <path style="fill:#FFFFFF;" d="M23.172,24.956c-4.392,0-5.904-2.856-5.904-5.185c0-0.863,0-3.119,2.592-4.319
+ c-1.344-0.672-2.064-1.752-2.064-3.336c0-2.904,2.328-4.656,5.304-4.656c3.528,0,5.4,2.088,5.4,4.44
+ c0,1.464-0.6,2.712-1.968,3.432c1.632,0.815,2.544,1.896,2.544,4.104C29.076,21.596,27.684,24.956,23.172,24.956z M23.124,16.916
+ c-1.224,0-2.4,0.792-2.4,2.64c0,1.632,0.936,2.712,2.472,2.712c1.752,0,2.424-1.512,2.424-2.688
+ C25.62,18.38,24.996,16.916,23.124,16.916z M25.284,12.26c0-1.296-0.888-2.112-1.968-2.112c-1.512,0-2.305,0.864-2.305,2.112
+ c0,1.008,0.744,2.112,2.185,2.112C24.516,14.372,25.284,13.484,25.284,12.26z"/>
+ </g>
+</g>
+</svg>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/callouts/29.svg b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/callouts/29.svg
new file mode 100644
index 0000000..cb63adf
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/callouts/29.svg
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 12.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 51448) -->
+<!DOCTYPE svg [
+ <!ENTITY ns_svg "http://www.w3.org/2000/svg">
+ <!ENTITY ns_xlink "http://www.w3.org/1999/xlink">
+]>
+<svg version="1.0" id="Layer_1" xmlns="&ns_svg;" xmlns:xlink="&ns_xlink;" width="33" height="33" viewBox="0 0 33 33"
+ style="overflow:visible;enable-background:new 0 0 33 33;" xml:space="preserve">
+<circle style="stroke:#000000;" cx="16.5" cy="16.5" r="16"/>
+<g>
+ <g style="enable-background:new ;">
+ <path style="fill:#FFFFFF;" d="M3.972,13.484c0-5.545,4.056-6.024,5.568-6.024c3.264,0,5.856,1.92,5.856,5.376
+ c0,2.928-1.896,4.416-3.552,5.544c-2.256,1.584-3.432,2.353-3.816,3.145h7.392V24.5H3.78c0.12-1.992,0.264-4.08,3.96-6.768
+ c3.072-2.232,4.296-3.097,4.296-5.017c0-1.128-0.72-2.424-2.352-2.424c-2.352,0-2.424,1.944-2.448,3.192H3.972z"/>
+ <path style="fill:#FFFFFF;" d="M20.893,20.564v0.023c0.191,1.176,0.936,1.68,1.967,1.68c1.393,0,2.785-1.176,2.809-4.752
+ l-0.048-0.048c-0.769,1.152-2.088,1.44-3.24,1.44c-3.264,0-5.16-2.473-5.16-5.328c0-4.176,2.472-6.12,5.807-6.12
+ c5.904,0,6.001,6.36,6.001,8.76c0,6.601-3.12,8.736-6.192,8.736c-2.904,0-4.992-1.68-5.28-4.392H20.893z M23.1,16.22
+ c1.176,0,2.473-0.84,2.473-2.855c0-1.944-0.84-3.145-2.568-3.145c-0.863,0-2.424,0.433-2.424,2.88
+ C20.58,15.668,21.828,16.22,23.1,16.22z"/>
+ </g>
+</g>
+</svg>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/callouts/3.svg b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/callouts/3.svg
new file mode 100644
index 0000000..918be80
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/callouts/3.svg
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 12.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 51448) -->
+<!DOCTYPE svg [
+ <!ENTITY ns_svg "http://www.w3.org/2000/svg">
+ <!ENTITY ns_xlink "http://www.w3.org/1999/xlink">
+]>
+<svg version="1.0" id="Layer_1" xmlns="&ns_svg;" xmlns:xlink="&ns_xlink;" width="33" height="33" viewBox="0 0 33 33"
+ style="overflow:visible;enable-background:new 0 0 33 33;" xml:space="preserve">
+<circle style="stroke:#000000;" cx="16.5" cy="16.5" r="16"/>
+<g>
+ <g style="enable-background:new ;">
+ <path style="fill:#FFFFFF;" d="M15.127,14.005h0.616c1.176,0,3.332-0.112,3.332-2.688c0-0.728-0.336-2.548-2.492-2.548
+ c-2.688,0-2.688,2.548-2.688,3.248h-3.64c0-3.724,2.1-6.384,6.58-6.384c2.66,0,6.16,1.344,6.16,5.544
+ c0,2.016-1.261,3.276-2.38,3.78v0.056c0.699,0.196,2.996,1.232,2.996,4.62c0,3.752-2.772,6.412-6.776,6.412
+ c-1.876,0-6.916-0.42-6.916-6.636h3.836l-0.028,0.027c0,1.064,0.28,3.473,2.912,3.473c1.568,0,2.94-1.064,2.94-3.276
+ c0-2.716-2.632-2.828-4.452-2.828V14.005z"/>
+ </g>
+</g>
+</svg>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/callouts/30.svg b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/callouts/30.svg
new file mode 100644
index 0000000..dc43ba1
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/callouts/30.svg
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 12.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 51448) -->
+<!DOCTYPE svg [
+ <!ENTITY ns_svg "http://www.w3.org/2000/svg">
+ <!ENTITY ns_xlink "http://www.w3.org/1999/xlink">
+]>
+<svg version="1.0" id="Layer_1" xmlns="&ns_svg;" xmlns:xlink="&ns_xlink;" width="33" height="33" viewBox="0 0 33 33"
+ style="overflow:visible;enable-background:new 0 0 33 33;" xml:space="preserve">
+<circle style="stroke:#000000;" cx="16.5" cy="16.5" r="16"/>
+<g>
+ <g style="enable-background:new ;">
+ <path style="fill:#FFFFFF;" d="M8.268,14.636h0.528c1.008,0,2.856-0.096,2.856-2.304c0-0.624-0.288-2.185-2.136-2.185
+ c-2.304,0-2.304,2.185-2.304,2.784h-3.12c0-3.191,1.8-5.472,5.64-5.472c2.28,0,5.28,1.152,5.28,4.752
+ c0,1.728-1.08,2.808-2.04,3.24V15.5c0.6,0.168,2.568,1.056,2.568,3.96c0,3.216-2.376,5.496-5.808,5.496
+ c-1.608,0-5.928-0.36-5.928-5.688h3.288l-0.024,0.024c0,0.912,0.24,2.976,2.496,2.976c1.344,0,2.52-0.911,2.52-2.808
+ c0-2.328-2.256-2.424-3.816-2.424V14.636z"/>
+ <path style="fill:#FFFFFF;" d="M23.172,7.46c4.008,0,5.904,2.76,5.904,8.736c0,5.976-1.896,8.76-5.904,8.76
+ s-5.904-2.784-5.904-8.76C17.268,10.22,19.164,7.46,23.172,7.46z M23.172,22.268c1.92,0,2.448-1.68,2.448-6.071
+ c0-4.393-0.528-6.049-2.448-6.049s-2.448,1.656-2.448,6.049C20.724,20.588,21.252,22.268,23.172,22.268z"/>
+ </g>
+</g>
+</svg>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/callouts/4.svg b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/callouts/4.svg
new file mode 100644
index 0000000..8eb6a53
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/callouts/4.svg
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 12.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 51448) -->
+<!DOCTYPE svg [
+ <!ENTITY ns_svg "http://www.w3.org/2000/svg">
+ <!ENTITY ns_xlink "http://www.w3.org/1999/xlink">
+]>
+<svg version="1.0" id="Layer_1" xmlns="&ns_svg;" xmlns:xlink="&ns_xlink;" width="33" height="33" viewBox="0 0 33 33"
+ style="overflow:visible;enable-background:new 0 0 33 33;" xml:space="preserve">
+<circle style="stroke:#000000;" cx="16.5" cy="16.5" r="16"/>
+<g>
+ <g style="enable-background:new ;">
+ <path style="fill:#FFFFFF;" d="M21.891,20.784h-2.212v4.396h-3.92v-4.396h-7.84v-3.389L15.227,5.3h4.452v12.432h2.212V20.784z
+ M15.759,17.731c0-4.815,0.084-7.924,0.084-8.54h-0.056l-4.984,8.54H15.759z"/>
+ </g>
+</g>
+</svg>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/callouts/5.svg b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/callouts/5.svg
new file mode 100644
index 0000000..ca7a9f2
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/callouts/5.svg
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 12.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 51448) -->
+<!DOCTYPE svg [
+ <!ENTITY ns_svg "http://www.w3.org/2000/svg">
+ <!ENTITY ns_xlink "http://www.w3.org/1999/xlink">
+]>
+<svg version="1.0" id="Layer_1" xmlns="&ns_svg;" xmlns:xlink="&ns_xlink;" width="33" height="33" viewBox="0 0 33 33"
+ style="overflow:visible;enable-background:new 0 0 33 33;" xml:space="preserve">
+<circle style="stroke:#000000;" cx="16.5" cy="16.5" r="16"/>
+<g>
+ <g style="enable-background:new ;">
+ <path style="fill:#FFFFFF;" d="M14.035,14.252c0.728-0.504,1.624-1.092,3.556-1.092c2.66,0,6.02,1.848,6.02,6.411
+ c0,2.717-1.372,7.141-7.224,7.141c-3.108,0-6.272-1.849-6.468-5.853h3.92c0.168,1.624,1.036,2.717,2.772,2.717
+ c1.876,0,2.968-1.597,2.968-3.725c0-1.764-0.839-3.556-2.912-3.556c-0.532,0-1.876,0.028-2.632,1.428l-3.5-0.168l1.372-10.92
+ h10.919v3.304h-8.092L14.035,14.252z"/>
+ </g>
+</g>
+</svg>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/callouts/6.svg b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/callouts/6.svg
new file mode 100644
index 0000000..783a0b9
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/callouts/6.svg
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 12.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 51448) -->
+<!DOCTYPE svg [
+ <!ENTITY ns_svg "http://www.w3.org/2000/svg">
+ <!ENTITY ns_xlink "http://www.w3.org/1999/xlink">
+]>
+<svg version="1.0" id="Layer_1" xmlns="&ns_svg;" xmlns:xlink="&ns_xlink;" width="33" height="33" viewBox="0 0 33 33"
+ style="overflow:visible;enable-background:new 0 0 33 33;" xml:space="preserve">
+<circle style="stroke:#000000;" cx="16.5" cy="16.5" r="16"/>
+<g>
+ <g style="enable-background:new ;">
+ <path style="fill:#FFFFFF;" d="M19.106,10.673c-0.112-1.12-0.84-1.904-2.296-1.904c-2.548,0-3.136,2.912-3.276,5.488l0.056,0.056
+ c0.532-0.728,1.512-1.651,3.724-1.651c4.116,0,6.077,3.164,6.077,6.131c0,4.34-2.66,7.252-6.497,7.252
+ c-6.02,0-7.196-5.039-7.196-9.996c0-3.78,0.504-10.416,7.392-10.416c0.812,0,3.08,0.308,4.061,1.288
+ c1.092,1.063,1.483,1.652,1.848,3.752H19.106z M16.614,15.797c-1.484,0-2.996,0.924-2.996,3.416c0,2.156,1.232,3.697,3.108,3.697
+ c1.428,0,2.745-1.094,2.745-3.781C19.471,16.609,17.846,15.797,16.614,15.797z"/>
+ </g>
+</g>
+</svg>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/callouts/7.svg b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/callouts/7.svg
new file mode 100644
index 0000000..59b3714
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/callouts/7.svg
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 12.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 51448) -->
+<!DOCTYPE svg [
+ <!ENTITY ns_svg "http://www.w3.org/2000/svg">
+ <!ENTITY ns_xlink "http://www.w3.org/1999/xlink">
+]>
+<svg version="1.0" id="Layer_1" xmlns="&ns_svg;" xmlns:xlink="&ns_xlink;" width="33" height="33" viewBox="0 0 33 33"
+ style="overflow:visible;enable-background:new 0 0 33 33;" xml:space="preserve">
+<circle style="stroke:#000000;" cx="16.5" cy="16.5" r="16"/>
+<g>
+ <g style="enable-background:new ;">
+ <path style="fill:#FFFFFF;" d="M24.28,9.66c-1.904,2.071-6.776,7.951-7.252,16.52h-4.032c0.42-7.952,5.404-14.28,7.084-16.072
+ h-9.884l0.084-3.472h14V9.66z"/>
+ </g>
+</g>
+</svg>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/callouts/8.svg b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/callouts/8.svg
new file mode 100644
index 0000000..c1803a3
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/callouts/8.svg
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 12.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 51448) -->
+<!DOCTYPE svg [
+ <!ENTITY ns_svg "http://www.w3.org/2000/svg">
+ <!ENTITY ns_xlink "http://www.w3.org/1999/xlink">
+]>
+<svg version="1.0" id="Layer_1" xmlns="&ns_svg;" xmlns:xlink="&ns_xlink;" width="33" height="33" viewBox="0 0 33 33"
+ style="overflow:visible;enable-background:new 0 0 33 33;" xml:space="preserve">
+<circle style="stroke:#000000;" cx="16.5" cy="16.5" r="16"/>
+<g>
+ <g style="enable-background:new ;">
+ <path style="fill:#FFFFFF;" d="M16.28,26.712c-5.124,0-6.888-3.332-6.888-6.048c0-1.009,0-3.641,3.024-5.04
+ c-1.568-0.784-2.408-2.044-2.408-3.893c0-3.388,2.716-5.432,6.188-5.432c4.116,0,6.3,2.436,6.3,5.18
+ c0,1.708-0.7,3.164-2.296,4.004c1.903,0.952,2.968,2.212,2.968,4.788C23.168,22.792,21.544,26.712,16.28,26.712z M16.224,17.332
+ c-1.428,0-2.8,0.924-2.8,3.08c0,1.903,1.092,3.164,2.884,3.164c2.043,0,2.829-1.765,2.829-3.137
+ C19.137,19.04,18.408,17.332,16.224,17.332z M18.744,11.899c0-1.512-1.036-2.464-2.296-2.464c-1.764,0-2.688,1.008-2.688,2.464
+ c0,1.177,0.868,2.464,2.548,2.464C17.848,14.363,18.744,13.328,18.744,11.899z"/>
+ </g>
+</g>
+</svg>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/callouts/9.svg b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/callouts/9.svg
new file mode 100644
index 0000000..bc149d3
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/callouts/9.svg
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 12.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 51448) -->
+<!DOCTYPE svg [
+ <!ENTITY ns_svg "http://www.w3.org/2000/svg">
+ <!ENTITY ns_xlink "http://www.w3.org/1999/xlink">
+]>
+<svg version="1.0" id="Layer_1" xmlns="&ns_svg;" xmlns:xlink="&ns_xlink;" width="33" height="33" viewBox="0 0 33 33"
+ style="overflow:visible;enable-background:new 0 0 33 33;" xml:space="preserve">
+<circle style="stroke:#000000;" cx="16.5" cy="16.5" r="16"/>
+<g>
+ <g style="enable-background:new ;">
+ <path style="fill:#FFFFFF;" d="M13.953,21.921v0.027c0.224,1.372,1.092,1.961,2.296,1.961c1.624,0,3.248-1.372,3.276-5.545
+ l-0.057-0.056c-0.896,1.344-2.436,1.68-3.78,1.68c-3.808,0-6.02-2.884-6.02-6.216c0-4.872,2.884-7.14,6.776-7.14
+ c6.888,0,7,7.42,7,10.22c0,7.7-3.641,10.192-7.224,10.192c-3.388,0-5.824-1.96-6.16-5.124H13.953z M16.529,16.853
+ c1.372,0,2.884-0.979,2.884-3.332c0-2.268-0.98-3.668-2.996-3.668c-1.008,0-2.828,0.504-2.828,3.36
+ C13.589,16.209,15.045,16.853,16.529,16.853z"/>
+ </g>
+</g>
+</svg>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/caution.svg b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/caution.svg
new file mode 100644
index 0000000..dd84f3f
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/caution.svg
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+<!-- Generator: Adobe Illustrator 9.0, SVG Export Plug-In -->
+<!DOCTYPE svg [
+ <!ENTITY st0 "fill:#FFFFFF;stroke:none;">
+ <!ENTITY st1 "fill:#FFFFFF;stroke-width:6.6112;stroke-linecap:round;stroke-linejoin:round;">
+ <!ENTITY st2 "stroke:#FFFFFF;stroke-width:6.6112;">
+ <!ENTITY st3 "fill:none;stroke:none;">
+ <!ENTITY st4 "fill-rule:nonzero;clip-rule:nonzero;stroke:#000000;stroke-miterlimit:4;">
+ <!ENTITY st5 "stroke:none;">
+]>
+<svg width="48pt" height="48pt" viewBox="0 0 48 48" xml:space="preserve" xmlns="http://www.w3.org/2000/svg">
+ <g id="Layer_x0020_3" style="&st4;">
+ <g>
+ <path style="&st2;" d="M41.7,35.3L26.6,9.4c-0.6-1-1.7-1.7-2.9-1.6c-1.2,0-2.3,0.7-2.9,1.7L6.3,35.4c-0.6,1-0.6,2.3,0,3.3c0.6,1,1.7,1.6,2.9,1.6h29.6c1.2,0,2.3-0.6,2.9-1.7c0.6-1,0.6-2.3,0-3.3z"/>
+ <path style="&st1;" d="M23.7,11L9.2,37h29.6L23.7,11z"/>
+ <path style="&st0;" d="M23.7,11.9L10.3,36.1h27.5l-14-24.1z"/>
+ <g>
+ <path style="&st5;" d="M24.1,34c-1.1,0-1.8-0.8-1.8-1.8c0-1.1,0.7-1.8,1.8-1.8c1.1,0,1.8,0.7,1.8,1.8c0,1-0.7,1.8-1.8,1.8h0z M22.9,29.3l-0.4-9.1h3.2l-0.4,9.1h-2.3z"/>
+ </g>
+ </g>
+ </g>
+ <g id="crop_x0020_marks" style="&st4;">
+ <path style="&st3;" d="M48,48H0V0h48v48z"/>
+ </g>
+</svg>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/colorsvg/caution.svg b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/colorsvg/caution.svg
new file mode 100644
index 0000000..7a0db0b
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/colorsvg/caution.svg
@@ -0,0 +1,141 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 12.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 51448) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [
+ <!ENTITY ns_svg "http://www.w3.org/2000/svg">
+ <!ENTITY ns_xlink "http://www.w3.org/1999/xlink">
+]>
+<svg version="1.1" id="caution" xmlns="&ns_svg;" xmlns:xlink="&ns_xlink;" width="48" height="48" viewBox="0 0 48 48"
+ overflow="visible" enable-background="new 0 0 48 48" xml:space="preserve">
+<g>
+ <g>
+ <g>
+ <path stroke="#FFFFFF" stroke-width="6.6112" d="M41.629,36.303L26.527,10.403c-0.602-1-1.698-1.7-2.898-1.6
+ c-1.2,0-2.3,0.7-2.9,1.7l-14.5,25.899c-0.6,1-0.6,2.301,0,3.301s1.7,1.6,2.9,1.6h29.599c1.199,0,2.301-0.6,2.899-1.699
+ C42.229,38.604,42.229,37.303,41.629,36.303L41.629,36.303z"/>
+ <g>
+ <path fill="#FFFFFF" stroke="#FFCC00" stroke-width="6.6112" stroke-linecap="round" stroke-linejoin="round" d="M23.581,12.003
+ l-14.5,26H38.68L23.581,12.003z"/>
+ <polygon fill="#FFFFFF" stroke="#FFCD00" stroke-width="6.6112" stroke-linecap="round" stroke-linejoin="round" points="
+ 23.582,12.054 9.137,37.953 38.622,37.953 "/>
+ <polygon fill="#FFFFFF" stroke="#FFCE00" stroke-width="6.6112" stroke-linecap="round" stroke-linejoin="round" points="
+ 23.583,12.104 9.193,37.9 38.566,37.9 "/>
+ <polygon fill="#FFFFFF" stroke="#FFCF00" stroke-width="6.6112" stroke-linecap="round" stroke-linejoin="round" points="
+ 23.583,12.153 9.25,37.854 38.508,37.854 "/>
+ <polygon fill="#FFFFFF" stroke="#FFD000" stroke-width="6.6112" stroke-linecap="round" stroke-linejoin="round" points="
+ 23.584,12.205 9.309,37.805 38.451,37.805 "/>
+ <polygon fill="#FFFFFF" stroke="#FFD100" stroke-width="6.6112" stroke-linecap="round" stroke-linejoin="round" points="
+ 23.585,12.253 9.364,37.753 38.395,37.753 "/>
+ <polygon fill="#FFFFFF" stroke="#FFD200" stroke-width="6.6112" stroke-linecap="round" stroke-linejoin="round" points="
+ 23.586,12.304 9.421,37.703 38.337,37.703 "/>
+ <polygon fill="#FFFFFF" stroke="#FFD300" stroke-width="6.6112" stroke-linecap="round" stroke-linejoin="round" points="
+ 23.587,12.354 9.479,37.652 38.279,37.652 "/>
+ <polygon fill="#FFFFFF" stroke="#FFD400" stroke-width="6.6112" stroke-linecap="round" stroke-linejoin="round" points="
+ 23.588,12.403 9.537,37.604 38.223,37.604 "/>
+ <polygon fill="#FFFFFF" stroke="#FFD500" stroke-width="6.6112" stroke-linecap="round" stroke-linejoin="round" points="
+ 23.589,12.455 9.591,37.553 38.166,37.553 "/>
+ <polygon fill="#FFFFFF" stroke="#FFD600" stroke-width="6.6112" stroke-linecap="round" stroke-linejoin="round" points="
+ 23.591,12.503 9.649,37.503 38.109,37.503 "/>
+ <polygon fill="#FFFFFF" stroke="#FFD700" stroke-width="6.6112" stroke-linecap="round" stroke-linejoin="round" points="
+ 23.591,12.554 9.707,37.453 38.053,37.453 "/>
+ <polygon fill="#FFFFFF" stroke="#FFD800" stroke-width="6.6112" stroke-linecap="round" stroke-linejoin="round" points="
+ 23.593,12.604 9.764,37.402 37.996,37.402 "/>
+ <polygon fill="#FFFFFF" stroke="#FFD900" stroke-width="6.6112" stroke-linecap="round" stroke-linejoin="round" points="
+ 23.594,12.653 9.819,37.354 37.939,37.354 "/>
+ <polygon fill="#FFFFFF" stroke="#FFDA00" stroke-width="6.6112" stroke-linecap="round" stroke-linejoin="round" points="
+ 23.596,12.705 9.876,37.303 37.882,37.303 "/>
+ <polygon fill="#FFFFFF" stroke="#FFDB00" stroke-width="6.6112" stroke-linecap="round" stroke-linejoin="round" points="
+ 23.597,12.753 9.935,37.253 37.824,37.253 "/>
+ <polygon fill="#FFFFFF" stroke="#FFDC00" stroke-width="6.6112" stroke-linecap="round" stroke-linejoin="round" points="
+ 23.599,12.804 9.991,37.203 37.768,37.203 "/>
+ <polygon fill="#FFFFFF" stroke="#FFDD00" stroke-width="6.6112" stroke-linecap="round" stroke-linejoin="round" points="
+ 23.601,12.854 10.047,37.152 37.711,37.152 "/>
+ <polygon fill="#FFFFFF" stroke="#FFDE00" stroke-width="6.6112" stroke-linecap="round" stroke-linejoin="round" points="
+ 23.602,12.903 10.104,37.104 37.654,37.104 "/>
+ <polygon fill="#FFFFFF" stroke="#FFDF00" stroke-width="6.6112" stroke-linecap="round" stroke-linejoin="round" points="
+ 23.603,12.955 10.163,37.053 37.598,37.053 "/>
+ <polygon fill="#FFFFFF" stroke="#FFE000" stroke-width="6.6112" stroke-linecap="round" stroke-linejoin="round" points="
+ 23.604,13.003 10.218,37.003 37.54,37.003 "/>
+ <polygon fill="#FFFFFF" stroke="#FFE100" stroke-width="6.6112" stroke-linecap="round" stroke-linejoin="round" points="
+ 23.604,13.054 10.275,36.953 37.482,36.953 "/>
+ <polygon fill="#FFFFFF" stroke="#FFE200" stroke-width="6.6112" stroke-linecap="round" stroke-linejoin="round" points="
+ 23.605,13.104 10.333,36.902 37.427,36.902 "/>
+ <polygon fill="#FFFFFF" stroke="#FFE300" stroke-width="6.6112" stroke-linecap="round" stroke-linejoin="round" points="
+ 23.606,13.153 10.389,36.854 37.37,36.854 "/>
+ <polygon fill="#FFFFFF" stroke="#FFE400" stroke-width="6.6112" stroke-linecap="round" stroke-linejoin="round" points="
+ 23.607,13.205 10.445,36.805 37.312,36.805 "/>
+ <polygon fill="#FFFFFF" stroke="#FFE500" stroke-width="6.6112" stroke-linecap="round" stroke-linejoin="round" points="
+ 23.608,13.253 10.502,36.753 37.256,36.753 "/>
+ <polygon fill="#FFFFFF" stroke="#FFE600" stroke-width="6.6112" stroke-linecap="round" stroke-linejoin="round" points="
+ 23.609,13.304 10.561,36.703 37.197,36.703 "/>
+ <polygon fill="#FFFFFF" stroke="#FFE600" stroke-width="6.6112" stroke-linecap="round" stroke-linejoin="round" points="
+ 23.61,13.354 10.617,36.652 37.143,36.652 "/>
+ <polygon fill="#FFFFFF" stroke="#FFE700" stroke-width="6.6112" stroke-linecap="round" stroke-linejoin="round" points="
+ 23.611,13.403 10.673,36.604 37.085,36.604 "/>
+ <polygon fill="#FFFFFF" stroke="#FFE800" stroke-width="6.6112" stroke-linecap="round" stroke-linejoin="round" points="
+ 23.613,13.455 10.73,36.553 37.027,36.553 "/>
+ <polygon fill="#FFFFFF" stroke="#FFE900" stroke-width="6.6112" stroke-linecap="round" stroke-linejoin="round" points="
+ 23.614,13.503 10.789,36.503 36.971,36.503 "/>
+ <polygon fill="#FFFFFF" stroke="#FFEA00" stroke-width="6.6112" stroke-linecap="round" stroke-linejoin="round" points="
+ 23.616,13.554 10.844,36.453 36.914,36.453 "/>
+ <polygon fill="#FFFFFF" stroke="#FFEB00" stroke-width="6.6112" stroke-linecap="round" stroke-linejoin="round" points="
+ 23.617,13.604 10.901,36.402 36.857,36.402 "/>
+ <polygon fill="#FFFFFF" stroke="#FFEC00" stroke-width="6.6112" stroke-linecap="round" stroke-linejoin="round" points="
+ 23.618,13.653 10.958,36.354 36.8,36.354 "/>
+ <polygon fill="#FFFFFF" stroke="#FFED00" stroke-width="6.6112" stroke-linecap="round" stroke-linejoin="round" points="
+ 23.619,13.705 11.017,36.303 36.742,36.303 "/>
+ <polygon fill="#FFFFFF" stroke="#FFEE00" stroke-width="6.6112" stroke-linecap="round" stroke-linejoin="round" points="
+ 23.622,13.753 11.071,36.253 36.688,36.253 "/>
+ <polygon fill="#FFFFFF" stroke="#FFEF00" stroke-width="6.6112" stroke-linecap="round" stroke-linejoin="round" points="
+ 23.623,13.804 11.129,36.203 36.63,36.203 "/>
+ <polygon fill="#FFFFFF" stroke="#FFF000" stroke-width="6.6112" stroke-linecap="round" stroke-linejoin="round" points="
+ 23.624,13.854 11.188,36.152 36.572,36.152 "/>
+ <polygon fill="#FFFFFF" stroke="#FFF100" stroke-width="6.6112" stroke-linecap="round" stroke-linejoin="round" points="
+ 23.625,13.903 11.243,36.104 36.516,36.104 "/>
+ <polygon fill="#FFFFFF" stroke="#FFF200" stroke-width="6.6112" stroke-linecap="round" stroke-linejoin="round" points="
+ 23.625,13.955 11.299,36.053 36.459,36.053 "/>
+ <polygon fill="#FFFFFF" stroke="#FFF300" stroke-width="6.6112" stroke-linecap="round" stroke-linejoin="round" points="
+ 23.626,14.003 11.356,36.003 36.4,36.003 "/>
+ <polygon fill="#FFFFFF" stroke="#FFF400" stroke-width="6.6112" stroke-linecap="round" stroke-linejoin="round" points="
+ 23.627,14.054 11.415,35.953 36.346,35.953 "/>
+ <polygon fill="#FFFFFF" stroke="#FFF500" stroke-width="6.6112" stroke-linecap="round" stroke-linejoin="round" points="
+ 23.628,14.104 11.471,35.902 36.288,35.902 "/>
+ <polygon fill="#FFFFFF" stroke="#FFF600" stroke-width="6.6112" stroke-linecap="round" stroke-linejoin="round" points="
+ 23.629,14.153 11.527,35.854 36.232,35.854 "/>
+ <polygon fill="#FFFFFF" stroke="#FFF700" stroke-width="6.6112" stroke-linecap="round" stroke-linejoin="round" points="
+ 23.63,14.205 11.584,35.805 36.174,35.805 "/>
+ <polygon fill="#FFFFFF" stroke="#FFF800" stroke-width="6.6112" stroke-linecap="round" stroke-linejoin="round" points="
+ 23.631,14.253 11.643,35.753 36.117,35.753 "/>
+ <polygon fill="#FFFFFF" stroke="#FFF900" stroke-width="6.6112" stroke-linecap="round" stroke-linejoin="round" points="
+ 23.632,14.304 11.699,35.703 36.061,35.703 "/>
+ <polygon fill="#FFFFFF" stroke="#FFFA00" stroke-width="6.6112" stroke-linecap="round" stroke-linejoin="round" points="
+ 23.633,14.354 11.754,35.652 36.003,35.652 "/>
+ <polygon fill="#FFFFFF" stroke="#FFFB00" stroke-width="6.6112" stroke-linecap="round" stroke-linejoin="round" points="
+ 23.635,14.403 11.812,35.604 35.945,35.604 "/>
+ <polygon fill="#FFFFFF" stroke="#FFFC00" stroke-width="6.6112" stroke-linecap="round" stroke-linejoin="round" points="
+ 23.637,14.455 11.869,35.555 35.891,35.555 "/>
+ <polygon fill="#FFFFFF" stroke="#FFFD00" stroke-width="6.6112" stroke-linecap="round" stroke-linejoin="round" points="
+ 23.638,14.503 11.925,35.503 35.833,35.503 "/>
+ <polygon fill="#FFFFFF" stroke="#FFFE00" stroke-width="6.6112" stroke-linecap="round" stroke-linejoin="round" points="
+ 23.639,14.554 11.982,35.453 35.775,35.453 "/>
+ <path fill="#FFFFFF" stroke="#FFFF00" stroke-width="6.6112" stroke-linecap="round" stroke-linejoin="round" d="M23.64,14.604
+ l-11.6,20.8h23.678L23.64,14.604z"/>
+ </g>
+ </g>
+
+ <linearGradient id="XMLID_50_" gradientUnits="userSpaceOnUse" x1="395.8457" y1="758.1504" x2="395.8457" y2="785.7822" gradientTransform="matrix(1 0 0 1 -372 -747)">
+ <stop offset="0" style="stop-color:#FFFFFF"/>
+ <stop offset="1" style="stop-color:#FFFF00"/>
+ </linearGradient>
+ <path fill="url(#XMLID_50_)" d="M38.891,34.532L26.055,12.519c-0.511-0.85-1.443-1.445-2.462-1.36
+ c-1.02,0-1.955,0.595-2.465,1.445L8.8,34.617c-0.51,0.851-0.51,1.953,0,2.805c0.51,0.852,1.445,1.36,2.465,1.36h25.158
+ c1.021,0,1.956-0.511,2.467-1.445C39.4,36.484,39.4,35.382,38.891,34.532L38.891,34.532z"/>
+ </g>
+ <g>
+ <path d="M23.929,33.948c-1.1,0-1.8-0.8-1.8-1.8c0-1.102,0.7-1.801,1.8-1.801c1.101,0,1.8,0.699,1.8,1.801
+ C25.729,33.148,25.029,33.948,23.929,33.948L23.929,33.948z M22.729,29.248l-0.4-9.1h3.2l-0.399,9.1h-2.297H22.729z"/>
+ </g>
+</g>
+<g id="crop_x0020_marks">
+ <path fill="none" d="M47.93,49.049H-0.071v-48H47.93V49.049z"/>
+</g>
+</svg>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/colorsvg/home.svg b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/colorsvg/home.svg
new file mode 100644
index 0000000..d6dbc01
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/colorsvg/home.svg
@@ -0,0 +1,498 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 12.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 51448) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [
+ <!ENTITY ns_svg "http://www.w3.org/2000/svg">
+ <!ENTITY ns_xlink "http://www.w3.org/1999/xlink">
+]>
+<svg version="1.1" xmlns="&ns_svg;" xmlns:xlink="&ns_xlink;" width="48" height="48" viewBox="0 0 48 48"
+ overflow="visible" enable-background="new 0 0 48 48" xml:space="preserve">
+<g id="Home">
+ <g>
+ <g id="Chimney">
+ <g>
+ <path fill="#660000" d="M30.417,17.563c2.776,2.348,8.258,0.835,7.742,0.434c0-1.2,0-6.9,0-6.9c0-1.2-0.802-2-2-2h-4.802
+ c-1,0-1.698,0.6-1.899,1.5C28.648,9.916,28.359,15.822,30.417,17.563z"/>
+ <path fill="#670000" d="M30.422,17.556c2.771,2.343,8.244,0.833,7.729,0.433c0-1.199,0-6.889,0-6.889
+ c0-1.198-0.799-1.997-1.996-1.997h-4.793c-0.998,0-1.695,0.599-1.896,1.498C28.657,9.921,28.368,15.818,30.422,17.556z"/>
+ <path fill="#680000" d="M30.428,17.548c2.768,2.34,8.229,0.832,7.717,0.432c0-1.196,0-6.876,0-6.876
+ c0-1.196-0.799-1.993-1.994-1.993h-4.783c-0.997,0-1.693,0.598-1.895,1.495C28.665,9.927,28.377,15.813,30.428,17.548z"/>
+ <path fill="#690000" d="M30.434,17.541c2.762,2.336,8.215,0.831,7.703,0.432c0-1.194,0-6.865,0-6.865
+ c0-1.194-0.798-1.989-1.99-1.989H31.37c-0.994,0-1.69,0.596-1.892,1.492C28.674,9.932,28.387,15.809,30.434,17.541z"/>
+ <path fill="#6B0000" d="M30.438,17.533c2.758,2.332,8.203,0.829,7.69,0.431c0-1.192,0-6.853,0-6.853
+ c0-1.192-0.796-1.987-1.987-1.987h-4.768c-0.993,0-1.688,0.596-1.889,1.49C28.682,9.937,28.395,15.804,30.438,17.533z"/>
+ <path fill="#6C0000" d="M30.443,17.525c2.752,2.328,8.188,0.828,7.677,0.43c0-1.19,0-6.841,0-6.841
+ c0-1.19-0.795-1.983-1.983-1.983h-4.76c-0.99,0-1.686,0.595-1.885,1.487C28.689,9.943,28.402,15.799,30.443,17.525z"/>
+ <path fill="#6D0000" d="M30.448,17.518c2.747,2.323,8.174,0.826,7.663,0.429c0-1.188,0-6.829,0-6.829
+ c0-1.188-0.793-1.979-1.979-1.979h-4.751c-0.99,0-1.682,0.593-1.881,1.485C28.698,9.949,28.412,15.795,30.448,17.518z"/>
+ <path fill="#6E0000" d="M30.454,17.51c2.743,2.32,8.159,0.825,7.649,0.429c0-1.187,0-6.818,0-6.818
+ c0-1.186-0.791-1.976-1.977-1.976h-4.744c-0.986,0-1.679,0.592-1.877,1.482C28.707,9.954,28.421,15.791,30.454,17.51z"/>
+ <path fill="#6F0000" d="M30.46,17.503c2.738,2.315,8.146,0.824,7.636,0.427c0-1.184,0-6.806,0-6.806
+ c0-1.184-0.789-1.973-1.972-1.973h-4.735c-0.986,0-1.677,0.592-1.875,1.479C28.715,9.96,28.43,15.786,30.46,17.503z"/>
+ <path fill="#700000" d="M30.465,17.495c2.733,2.312,8.131,0.822,7.623,0.427c0-1.182,0-6.794,0-6.794
+ c0-1.182-0.789-1.969-1.969-1.969h-4.729c-0.983,0-1.673,0.59-1.871,1.477C28.725,9.965,28.438,15.781,30.465,17.495z"/>
+ <path fill="#720000" d="M30.471,17.487c2.729,2.308,8.116,0.821,7.609,0.426c0-1.18,0-6.782,0-6.782
+ c0-1.179-0.787-1.966-1.967-1.966h-4.719c-0.982,0-1.67,0.589-1.867,1.475C28.73,9.97,28.447,15.776,30.471,17.487z"/>
+ <path fill="#730000" d="M30.477,17.48c2.724,2.304,8.103,0.819,7.597,0.426c0-1.178,0-6.771,0-6.771
+ c0-1.177-0.786-1.962-1.962-1.962H31.4c-0.981,0-1.668,0.589-1.865,1.472C28.74,9.976,28.456,15.772,30.477,17.48z"/>
+ <path fill="#740000" d="M30.48,17.473c2.72,2.299,8.088,0.817,7.584,0.424c0-1.176,0-6.759,0-6.759
+ c0-1.175-0.785-1.959-1.959-1.959h-4.703c-0.979,0-1.664,0.587-1.861,1.469C28.748,9.981,28.465,15.767,30.48,17.473z"/>
+ <path fill="#750000" d="M30.484,17.465c2.717,2.295,8.076,0.816,7.572,0.424c0-1.174,0-6.747,0-6.747
+ c0-1.174-0.783-1.956-1.957-1.956h-4.693c-0.979,0-1.661,0.586-1.858,1.467C28.757,9.987,28.475,15.763,30.484,17.465z"/>
+ <path fill="#760000" d="M30.491,17.458c2.71,2.292,8.061,0.815,7.558,0.423c0-1.172,0-6.735,0-6.735
+ c0-1.171-0.781-1.953-1.953-1.953H31.41c-0.977,0-1.658,0.585-1.854,1.465C28.766,9.993,28.482,15.758,30.491,17.458z"/>
+ <path fill="#770000" d="M30.496,17.45c2.706,2.288,8.047,0.813,7.545,0.422c0-1.17,0-6.724,0-6.724
+ c0-1.169-0.781-1.949-1.949-1.949h-4.678c-0.975,0-1.656,0.584-1.854,1.461C28.773,9.998,28.491,15.754,30.496,17.45z"/>
+ <path fill="#790000" d="M30.502,17.442c2.701,2.284,8.032,0.812,7.531,0.422c0-1.167,0-6.712,0-6.712
+ c0-1.167-0.779-1.945-1.945-1.945h-4.671c-0.972,0-1.651,0.583-1.849,1.458C28.781,10.004,28.5,15.749,30.502,17.442z"/>
+ <path fill="#7A0000" d="M30.507,17.435c2.696,2.28,8.019,0.811,7.519,0.421c0-1.166,0-6.7,0-6.7
+ c0-1.166-0.777-1.942-1.942-1.942h-4.661c-0.971,0-1.648,0.583-1.845,1.457C28.79,10.009,28.509,15.745,30.507,17.435z"/>
+ <path fill="#7B0000" d="M30.514,17.427c2.689,2.276,8.004,0.81,7.504,0.42c0-1.164,0-6.688,0-6.688
+ c0-1.163-0.776-1.938-1.938-1.938h-4.653c-0.97,0-1.646,0.582-1.842,1.454C28.798,10.014,28.518,15.74,30.514,17.427z"/>
+ <path fill="#7C0000" d="M30.518,17.42c2.688,2.271,7.99,0.808,7.491,0.419c0-1.162,0-6.677,0-6.677
+ c0-1.161-0.774-1.935-1.935-1.935h-4.646c-0.968,0-1.645,0.58-1.839,1.451C28.807,10.02,28.525,15.736,30.518,17.42z"/>
+ <path fill="#7D0000" d="M30.521,17.412c2.683,2.268,7.978,0.806,7.479,0.418c0-1.159,0-6.665,0-6.665
+ c0-1.159-0.774-1.932-1.933-1.932h-4.637c-0.967,0-1.642,0.58-1.836,1.449C28.814,10.025,28.535,15.73,30.521,17.412z"/>
+ <path fill="#7E0000" d="M30.527,17.404c2.678,2.264,7.963,0.805,7.466,0.418c0-1.157,0-6.652,0-6.652
+ c0-1.158-0.772-1.929-1.929-1.929h-4.629c-0.965,0-1.639,0.578-1.832,1.446C28.823,10.031,28.544,15.726,30.527,17.404z"/>
+ <path fill="#800000" d="M30.533,17.397c2.673,2.26,7.947,0.804,7.451,0.417c0-1.155,0-6.641,0-6.641
+ c0-1.155-0.771-1.925-1.924-1.925h-4.621c-0.963,0-1.635,0.577-1.83,1.443C28.831,10.037,28.553,15.722,30.533,17.397z"/>
+ <path fill="#810000" d="M30.538,17.39c2.668,2.255,7.935,0.802,7.438,0.417c0-1.153,0-6.629,0-6.629
+ c0-1.153-0.77-1.922-1.922-1.922h-4.611c-0.961,0-1.633,0.576-1.826,1.442C28.84,10.042,28.562,15.717,30.538,17.39z"/>
+ <path fill="#820000" d="M30.544,17.382c2.663,2.252,7.92,0.801,7.427,0.416c0-1.151,0-6.618,0-6.618
+ c0-1.151-0.77-1.918-1.92-1.918h-4.604c-0.961,0-1.631,0.575-1.823,1.438C28.85,10.047,28.57,15.713,30.544,17.382z"/>
+ <path fill="#830000" d="M30.549,17.375c2.659,2.248,7.906,0.799,7.413,0.415c0-1.149,0-6.606,0-6.606
+ c0-1.149-0.769-1.915-1.915-1.915H31.45c-0.957,0-1.626,0.574-1.819,1.436C28.855,10.053,28.579,15.708,30.549,17.375z"/>
+ <path fill="#840000" d="M30.555,17.367c2.653,2.243,7.893,0.797,7.399,0.414c0-1.147,0-6.594,0-6.594
+ c0-1.147-0.767-1.911-1.912-1.911h-4.588c-0.955,0-1.623,0.573-1.815,1.434C28.865,10.059,28.588,15.704,30.555,17.367z"/>
+ <path fill="#850000" d="M30.561,17.359c2.648,2.24,7.877,0.797,7.387,0.414c0-1.145,0-6.583,0-6.583
+ c0-1.145-0.766-1.908-1.908-1.908h-4.58c-0.954,0-1.621,0.572-1.812,1.431C28.873,10.064,28.598,15.699,30.561,17.359z"/>
+ <path fill="#860000" d="M30.564,17.352c2.645,2.235,7.863,0.795,7.373,0.413c0-1.143,0-6.57,0-6.57
+ c0-1.143-0.764-1.905-1.904-1.905h-4.571c-0.953,0-1.618,0.571-1.81,1.428C28.882,10.069,28.605,15.694,30.564,17.352z"/>
+ <path fill="#880000" d="M30.57,17.344c2.64,2.232,7.85,0.794,7.359,0.412c0-1.141,0-6.559,0-6.559
+ c0-1.141-0.762-1.901-1.902-1.901h-4.562c-0.949,0-1.613,0.57-1.806,1.426C28.891,10.075,28.613,15.689,30.57,17.344z"/>
+ <path fill="#890000" d="M30.576,17.337c2.634,2.228,7.835,0.792,7.346,0.411c0-1.139,0-6.547,0-6.547
+ c0-1.139-0.76-1.898-1.896-1.898h-4.557c-0.947,0-1.611,0.569-1.803,1.423C28.898,10.08,28.623,15.685,30.576,17.337z"/>
+ <path fill="#8A0000" d="M30.581,17.33c2.63,2.223,7.821,0.79,7.333,0.41c0-1.137,0-6.535,0-6.535
+ c0-1.137-0.76-1.894-1.895-1.894h-4.547c-0.947,0-1.609,0.567-1.801,1.421C28.906,10.086,28.632,15.681,30.581,17.33z"/>
+ <path fill="#8B0000" d="M30.587,17.321c2.625,2.22,7.808,0.79,7.319,0.41c0-1.135,0-6.523,0-6.523
+ c0-1.135-0.758-1.891-1.891-1.891h-4.539c-0.945,0-1.606,0.567-1.797,1.418C28.915,10.091,28.641,15.676,30.587,17.321z"/>
+ <path fill="#8C0000" d="M30.592,17.314c2.62,2.216,7.793,0.788,7.307,0.409c0-1.132,0-6.512,0-6.512
+ c0-1.132-0.756-1.887-1.887-1.887H31.48c-0.943,0-1.604,0.566-1.793,1.416C28.923,10.097,28.648,15.671,30.592,17.314z"/>
+ <path fill="#8D0000" d="M30.598,17.307c2.614,2.211,7.778,0.787,7.293,0.409c0-1.131,0-6.5,0-6.5
+ c0-1.13-0.754-1.884-1.884-1.884h-4.522c-0.941,0-1.601,0.564-1.791,1.413C28.932,10.103,28.658,15.667,30.598,17.307z"/>
+ <path fill="#8F0000" d="M30.604,17.299c2.609,2.208,7.765,0.785,7.279,0.408c0-1.128,0-6.488,0-6.488
+ c0-1.128-0.753-1.881-1.881-1.881h-4.516c-0.939,0-1.598,0.564-1.786,1.411C28.939,10.107,28.668,15.662,30.604,17.299z"/>
+ <path fill="#900000" d="M30.607,17.292c2.605,2.204,7.75,0.784,7.268,0.407c0-1.127,0-6.477,0-6.477
+ c0-1.127-0.753-1.877-1.878-1.877h-4.506c-0.938,0-1.595,0.563-1.783,1.408C28.948,10.113,28.676,15.658,30.607,17.292z"/>
+ <path fill="#910000" d="M30.611,17.284c2.604,2.199,7.738,0.782,7.256,0.406c0-1.124,0-6.464,0-6.464
+ c0-1.125-0.751-1.874-1.874-1.874h-4.498c-0.938,0-1.593,0.562-1.781,1.405C28.956,10.119,28.686,15.653,30.611,17.284z"/>
+ <path fill="#920000" d="M30.618,17.276c2.597,2.196,7.723,0.781,7.241,0.406c0-1.123,0-6.453,0-6.453
+ c0-1.123-0.75-1.871-1.871-1.871h-4.49c-0.936,0-1.588,0.561-1.775,1.403C28.965,10.124,28.693,15.649,30.618,17.276z"/>
+ <path fill="#930000" d="M30.623,17.269c2.592,2.191,7.709,0.779,7.229,0.404c0-1.12,0-6.441,0-6.441
+ c0-1.121-0.748-1.867-1.867-1.867h-4.481c-0.935,0-1.586,0.56-1.772,1.4C28.973,10.13,28.703,15.644,30.623,17.269z"/>
+ <path fill="#940000" d="M30.629,17.261c2.587,2.188,7.694,0.778,7.214,0.404c0-1.119,0-6.43,0-6.43
+ c0-1.119-0.745-1.863-1.862-1.863h-4.475c-0.932,0-1.583,0.559-1.771,1.397C28.98,10.135,28.711,15.64,30.629,17.261z"/>
+ <path fill="#960000" d="M30.634,17.254c2.583,2.184,7.681,0.776,7.201,0.403c0-1.116,0-6.417,0-6.417
+ c0-1.116-0.745-1.86-1.86-1.86H31.51c-0.93,0-1.58,0.558-1.768,1.395C28.988,10.141,28.721,15.635,30.634,17.254z"/>
+ <path fill="#970000" d="M30.641,17.247c2.576,2.179,7.666,0.775,7.188,0.402c0-1.115,0-6.406,0-6.406
+ c0-1.114-0.744-1.856-1.855-1.856h-4.459c-0.928,0-1.576,0.557-1.764,1.393C28.998,10.146,28.729,15.63,30.641,17.247z"/>
+ <path fill="#980000" d="M30.645,17.239c2.573,2.176,7.652,0.774,7.176,0.401c0-1.112,0-6.394,0-6.394
+ c0-1.112-0.742-1.853-1.854-1.853h-4.448c-0.928,0-1.574,0.556-1.762,1.39C29.006,10.151,28.738,15.625,30.645,17.239z"/>
+ <path fill="#990000" d="M30.65,17.231c2.567,2.172,7.638,0.772,7.16,0.401c0-1.11,0-6.383,0-6.383c0-1.11-0.74-1.85-1.85-1.85
+ H31.52c-0.924,0-1.57,0.555-1.758,1.387C29.016,10.157,28.747,15.621,30.65,17.231z"/>
+ <path fill="#9A0000" d="M30.654,17.224c2.563,2.167,7.625,0.771,7.148,0.4c0-1.108,0-6.371,0-6.371
+ c0-1.108-0.74-1.846-1.847-1.846h-4.433c-0.924,0-1.568,0.554-1.756,1.385C29.021,10.163,28.755,15.616,30.654,17.224z"/>
+ <path fill="#9B0000" d="M30.66,17.216c2.561,2.164,7.609,0.769,7.136,0.399c0-1.106,0-6.359,0-6.359
+ c0-1.106-0.737-1.843-1.844-1.843h-4.425c-0.922,0-1.564,0.553-1.752,1.382C29.031,10.168,28.766,15.612,30.66,17.216z"/>
+ <path fill="#9C0000" d="M30.666,17.209c2.555,2.16,7.596,0.768,7.122,0.399c0-1.104,0-6.347,0-6.347
+ c0-1.104-0.737-1.84-1.84-1.84h-4.417c-0.92,0-1.562,0.552-1.748,1.38C29.039,10.174,28.771,15.607,30.666,17.209z"/>
+ <path fill="#9E0000" d="M30.671,17.201c2.55,2.155,7.582,0.767,7.108,0.398c0-1.102,0-6.335,0-6.335
+ c0-1.102-0.735-1.836-1.836-1.836h-4.408c-0.918,0-1.561,0.551-1.745,1.377C29.048,10.179,28.782,15.603,30.671,17.201z"/>
+ <path fill="#9F0000" d="M30.677,17.193c2.544,2.152,7.567,0.765,7.097,0.397c0-1.1,0-6.324,0-6.324
+ c0-1.1-0.735-1.833-1.834-1.833H31.54c-0.916,0-1.558,0.549-1.741,1.375C29.057,10.185,28.79,15.598,30.677,17.193z"/>
+ <path fill="#A00000" d="M30.682,17.186c2.541,2.147,7.555,0.764,7.082,0.396c0-1.098,0-6.312,0-6.312
+ c0-1.098-0.731-1.829-1.828-1.829h-4.393c-0.915,0-1.555,0.548-1.738,1.372C29.064,10.19,28.8,15.594,30.682,17.186z"/>
+ <path fill="#A10000" d="M30.688,17.178c2.535,2.144,7.539,0.763,7.068,0.396c0-1.096,0-6.3,0-6.3
+ c0-1.096-0.73-1.826-1.826-1.826h-4.384c-0.912,0-1.551,0.547-1.733,1.37C29.072,10.196,28.809,15.589,30.688,17.178z"/>
+ <path fill="#A20000" d="M30.691,17.171c2.531,2.14,7.525,0.761,7.057,0.395c0-1.094,0-6.289,0-6.289
+ c0-1.093-0.73-1.822-1.822-1.822H31.55c-0.911,0-1.548,0.546-1.731,1.367C29.081,10.201,28.816,15.584,30.691,17.171z"/>
+ <path fill="#A30000" d="M30.697,17.163c2.525,2.136,7.512,0.76,7.043,0.395c0-1.092,0-6.277,0-6.277
+ c0-1.091-0.729-1.819-1.819-1.819h-4.366c-0.91,0-1.546,0.545-1.729,1.365C29.089,10.207,28.825,15.58,30.697,17.163z"/>
+ <path fill="#A50000" d="M30.703,17.156c2.521,2.132,7.497,0.758,7.029,0.394c0-1.09,0-6.265,0-6.265
+ c0-1.09-0.729-1.816-1.815-1.816h-4.358c-0.908,0-1.543,0.544-1.727,1.362C29.098,10.212,28.835,15.575,30.703,17.156z"/>
+ <path fill="#A60000" d="M30.708,17.148c2.517,2.127,7.483,0.756,7.017,0.393c0-1.087,0-6.253,0-6.253
+ c0-1.088-0.727-1.812-1.812-1.812h-4.351c-0.906,0-1.541,0.543-1.724,1.359C29.105,10.218,28.844,15.571,30.708,17.148z"/>
+ <path fill="#A70000" d="M30.714,17.141c2.511,2.124,7.47,0.755,7.003,0.392c0-1.086,0-6.241,0-6.241
+ c0-1.085-0.725-1.809-1.81-1.809h-4.343c-0.904,0-1.537,0.542-1.719,1.357C29.113,10.223,28.854,15.566,30.714,17.141z"/>
+ <path fill="#A80000" d="M30.719,17.133c2.508,2.12,7.455,0.753,6.99,0.391c0-1.083,0-6.229,0-6.229
+ c0-1.083-0.725-1.806-1.807-1.806h-4.334c-0.902,0-1.533,0.542-1.717,1.354C29.122,10.229,28.861,15.562,30.719,17.133z"/>
+ <path fill="#A90000" d="M30.725,17.125c2.502,2.116,7.44,0.752,6.978,0.391c0-1.082,0-6.218,0-6.218
+ c0-1.081-0.724-1.802-1.804-1.802h-4.325c-0.901,0-1.53,0.54-1.714,1.352C29.131,10.234,28.87,15.557,30.725,17.125z"/>
+ <path fill="#AA0000" d="M30.729,17.118c2.498,2.111,7.428,0.75,6.965,0.39c0-1.08,0-6.206,0-6.206
+ c0-1.079-0.721-1.798-1.799-1.798h-4.318c-0.899,0-1.528,0.539-1.71,1.349C29.139,10.24,28.879,15.552,30.729,17.118z"/>
+ <path fill="#AC0000" d="M30.734,17.11c2.492,2.108,7.412,0.75,6.951,0.389c0-1.078,0-6.194,0-6.194
+ c0-1.077-0.721-1.795-1.797-1.795h-4.311c-0.896,0-1.523,0.538-1.705,1.346C29.146,10.245,28.889,15.548,30.734,17.11z"/>
+ <path fill="#AD0000" d="M30.74,17.103c2.486,2.104,7.398,0.748,6.937,0.389c0-1.076,0-6.183,0-6.183
+ c0-1.075-0.718-1.792-1.792-1.792h-4.302c-0.896,0-1.521,0.537-1.702,1.344C29.154,10.251,28.896,15.543,30.74,17.103z"/>
+ <path fill="#AE0000" d="M30.745,17.096c2.483,2.1,7.385,0.746,6.924,0.388c0-1.074,0-6.171,0-6.171
+ c0-1.073-0.717-1.789-1.788-1.789h-4.294c-0.896,0-1.519,0.537-1.698,1.341C29.164,10.256,28.904,15.539,30.745,17.096z"/>
+ <path fill="#AF0000" d="M30.751,17.088c2.478,2.096,7.37,0.745,6.91,0.387c0-1.072,0-6.159,0-6.159
+ c0-1.071-0.716-1.785-1.785-1.785h-4.285c-0.893,0-1.517,0.535-1.696,1.339C29.172,10.262,28.914,15.534,30.751,17.088z"/>
+ <path fill="#B00000" d="M30.756,17.08c2.475,2.092,7.355,0.744,6.896,0.387c0-1.07,0-6.147,0-6.147
+ c0-1.069-0.713-1.782-1.781-1.782h-4.277c-0.891,0-1.513,0.535-1.691,1.336C29.182,10.267,28.923,15.53,30.756,17.08z"/>
+ <path fill="#B10000" d="M30.762,17.073c2.469,2.088,7.342,0.743,6.885,0.386c0-1.067,0-6.136,0-6.136
+ c0-1.067-0.713-1.778-1.778-1.778h-4.271c-0.889,0-1.51,0.533-1.688,1.334C29.188,10.272,28.932,15.525,30.762,17.073z"/>
+ <path fill="#B30000" d="M30.768,17.065c2.463,2.083,7.328,0.741,6.871,0.385c0-1.065,0-6.124,0-6.124
+ c0-1.065-0.712-1.775-1.775-1.775h-4.262c-0.887,0-1.506,0.532-1.687,1.332C29.197,10.278,28.939,15.521,30.768,17.065z"/>
+ <path fill="#B40000" d="M30.771,17.058c2.459,2.08,7.313,0.74,6.857,0.384c0-1.063,0-6.112,0-6.112
+ c0-1.063-0.71-1.771-1.771-1.771h-4.252c-0.887,0-1.506,0.531-1.685,1.329C29.205,10.284,28.949,15.516,30.771,17.058z"/>
+ <path fill="#B50000" d="M30.777,17.05c2.453,2.076,7.3,0.738,6.845,0.383c0-1.062,0-6.101,0-6.101
+ c0-1.061-0.709-1.768-1.769-1.768h-4.244c-0.885,0-1.502,0.53-1.682,1.326C29.214,10.289,28.958,15.511,30.777,17.05z"/>
+ <path fill="#B60000" d="M30.782,17.043c2.45,2.071,7.286,0.736,6.831,0.382c0-1.059,0-6.088,0-6.088
+ c0-1.059-0.707-1.765-1.766-1.765h-4.236c-0.881,0-1.498,0.529-1.676,1.323C29.223,10.294,28.967,15.507,30.782,17.043z"/>
+ <path fill="#B70000" d="M30.787,17.035c2.445,2.067,7.271,0.735,6.818,0.382c0-1.057,0-6.077,0-6.077
+ c0-1.057-0.705-1.761-1.762-1.761h-4.229c-0.881,0-1.495,0.528-1.674,1.321C29.23,10.3,28.977,15.502,30.787,17.035z"/>
+ <path fill="#B80000" d="M30.793,17.028c2.439,2.063,7.258,0.733,6.807,0.381c0-1.055,0-6.065,0-6.065
+ c0-1.055-0.705-1.758-1.76-1.758h-4.22c-0.879,0-1.493,0.527-1.67,1.318C29.238,10.306,28.984,15.498,30.793,17.028z"/>
+ <path fill="#B90000" d="M30.798,17.02c2.437,2.06,7.244,0.732,6.792,0.38c0-1.053,0-6.053,0-6.053
+ c0-1.053-0.703-1.754-1.754-1.754h-4.212c-0.877,0-1.49,0.526-1.667,1.316C29.247,10.311,28.993,15.493,30.798,17.02z"/>
+ <path fill="#BB0000" d="M30.805,17.013c2.43,2.056,7.229,0.731,6.777,0.379c0-1.051,0-6.042,0-6.042
+ c0-1.051-0.701-1.751-1.751-1.751h-4.204c-0.875,0-1.486,0.525-1.663,1.313C29.255,10.316,29.002,15.488,30.805,17.013z"/>
+ <path fill="#BC0000" d="M30.809,17.005c2.428,2.052,7.217,0.729,6.767,0.379c0-1.049,0-6.03,0-6.03
+ c0-1.048-0.7-1.748-1.748-1.748h-4.195c-0.873,0-1.483,0.524-1.659,1.311C29.264,10.322,29.012,15.484,30.809,17.005z"/>
+ <path fill="#BD0000" d="M30.814,16.998c2.42,2.047,7.201,0.728,6.752,0.378c0-1.047,0-6.018,0-6.018
+ c0-1.046-0.699-1.744-1.744-1.744h-4.188c-0.872,0-1.481,0.523-1.657,1.309C29.271,10.328,29.02,15.48,30.814,16.998z"/>
+ <path fill="#BE0000" d="M30.818,16.99c2.418,2.044,7.188,0.727,6.74,0.377c0-1.045,0-6.006,0-6.006
+ c0-1.044-0.699-1.74-1.742-1.74h-4.178c-0.871,0-1.479,0.522-1.654,1.305C29.279,10.333,29.027,15.475,30.818,16.99z"/>
+ <path fill="#BF0000" d="M30.824,16.982c2.412,2.04,7.174,0.725,6.727,0.376c0-1.043,0-5.994,0-5.994
+ c0-1.043-0.695-1.737-1.736-1.737h-4.172c-0.869,0-1.476,0.521-1.65,1.303C29.288,10.338,29.037,15.47,30.824,16.982z"/>
+ <path fill="#C00000" d="M30.83,16.975c2.406,2.036,7.158,0.724,6.713,0.376c0-1.041,0-5.982,0-5.982
+ c0-1.041-0.695-1.734-1.734-1.734h-4.162c-0.867,0-1.473,0.52-1.647,1.3C29.297,10.344,29.046,15.466,30.83,16.975z"/>
+ <path fill="#C20000" d="M30.835,16.967c2.403,2.032,7.146,0.722,6.7,0.375c0-1.039,0-5.971,0-5.971
+ c0-1.039-0.694-1.73-1.73-1.73H31.65c-0.865,0-1.471,0.519-1.646,1.298C29.305,10.35,29.055,15.461,30.835,16.967z"/>
+ <path fill="#C30000" d="M30.841,16.96c2.397,2.027,7.132,0.721,6.687,0.375c0-1.037,0-5.959,0-5.959
+ c0-1.037-0.691-1.727-1.728-1.727h-4.146c-0.863,0-1.467,0.518-1.643,1.295C29.312,10.355,29.062,15.457,30.841,16.96z"/>
+ <path fill="#C40000" d="M30.846,16.952c2.395,2.023,7.117,0.72,6.674,0.374c0-1.035,0-5.948,0-5.948
+ c0-1.034-0.69-1.724-1.725-1.724h-4.138c-0.862,0-1.464,0.517-1.64,1.293C29.32,10.36,29.072,15.452,30.846,16.952z"/>
+ <path fill="#C50000" d="M30.852,16.945c2.39,2.02,7.104,0.718,6.66,0.373c0-1.033,0-5.936,0-5.936
+ c0-1.032-0.689-1.72-1.721-1.72H31.66c-0.859,0-1.46,0.516-1.635,1.291C29.33,10.366,29.081,15.447,30.852,16.945z"/>
+ <path fill="#C60000" d="M30.855,16.937c2.385,2.016,7.09,0.717,6.646,0.373c0-1.031,0-5.924,0-5.924
+ c0-1.03-0.688-1.717-1.717-1.717h-4.122c-0.858,0-1.458,0.515-1.631,1.288C29.338,10.372,29.09,15.443,30.855,16.937z"/>
+ <path fill="#C70000" d="M30.861,16.93c2.38,2.012,7.074,0.715,6.634,0.372c0-1.029,0-5.913,0-5.913
+ c0-1.028-0.687-1.713-1.714-1.713h-4.113c-0.855,0-1.455,0.514-1.628,1.285C29.348,10.377,29.1,15.438,30.861,16.93z"/>
+ <path fill="#C90000" d="M30.867,16.922c2.374,2.008,7.061,0.714,6.619,0.371c0-1.027,0-5.9,0-5.9c0-1.026-0.686-1.71-1.709-1.71
+ h-4.105c-0.855,0-1.451,0.513-1.625,1.282C29.354,10.382,29.107,15.434,30.867,16.922z"/>
+ <path fill="#CA0000" d="M30.872,16.915c2.37,2.003,7.047,0.712,6.606,0.37c0-1.024,0-5.889,0-5.889
+ c0-1.024-0.685-1.707-1.707-1.707h-4.098c-0.854,0-1.447,0.512-1.621,1.28C29.363,10.388,29.116,15.429,30.872,16.915z"/>
+ <path fill="#CB0000" d="M30.878,16.907c2.364,2,7.032,0.711,6.595,0.37c0-1.022,0-5.877,0-5.877
+ c0-1.022-0.684-1.703-1.703-1.703h-4.09c-0.853,0-1.447,0.511-1.619,1.277C29.371,10.394,29.125,15.424,30.878,16.907z"/>
+ <path fill="#CC0000" d="M30.883,16.899c2.36,1.996,7.02,0.709,6.581,0.369c0-1.021,0-5.865,0-5.865c0-1.02-0.682-1.7-1.7-1.7
+ h-4.08c-0.851,0-1.443,0.51-1.615,1.275C29.38,10.399,29.134,15.42,30.883,16.899z"/>
+ </g>
+
+ <linearGradient id="Chimney_Highlight_1_" gradientUnits="userSpaceOnUse" x1="219.5195" y1="-239.7031" x2="219.5195" y2="-247.9902" gradientTransform="matrix(1 0 0 -1 -186 -230)">
+ <stop offset="0" style="stop-color:#FFFFFF"/>
+ <stop offset="1" style="stop-color:#CC0000"/>
+ </linearGradient>
+ <path id="Chimney_Highlight" fill="url(#Chimney_Highlight_1_)" d="M30.883,16.899c2.36,1.996,7.02,0.709,6.581,0.369
+ c0-1.021,0-5.865,0-5.865c0-1.02-0.682-1.7-1.7-1.7h-4.08c-0.851,0-1.443,0.51-1.615,1.275
+ C29.38,10.399,29.134,15.42,30.883,16.899z"/>
+ </g>
+ <g id="House">
+ <g>
+ <path fill="#FFCC00" d="M8.5,24.788c0,2.4,0,14.2,0,14.2c0,1.101,0.8,1.9,1.8,1.9h27.4c1.1,0,1.899-0.9,1.899-2
+ c0,0,0-11.8,0-14.2C40.6,24.688,7.4,24.788,8.5,24.788z"/>
+ <path fill="#FFCD00" d="M8.545,24.812c0,2.395,0,14.159,0,14.159c0,1.097,0.798,1.895,1.794,1.895h27.322
+ c1.097,0,1.894-0.897,1.894-1.993c0,0,0-11.767,0-14.16C40.552,24.711,7.448,24.812,8.545,24.812z"/>
+ <path fill="#FFCE00" d="M8.589,24.835c0,2.387,0,14.119,0,14.119c0,1.094,0.795,1.889,1.79,1.889h27.242
+ c1.094,0,1.889-0.896,1.889-1.988c0,0,0-11.73,0-14.118C40.504,24.735,7.496,24.835,8.589,24.835z"/>
+ <path fill="#FFCF00" d="M8.634,24.857c0,2.38,0,14.077,0,14.077c0,1.091,0.793,1.884,1.785,1.884h27.163
+ c1.09,0,1.883-0.894,1.883-1.981c0,0,0-11.698,0-14.078C40.456,24.758,7.543,24.857,8.634,24.857z"/>
+ <path fill="#FFD000" d="M8.68,24.88c0,2.373,0,14.037,0,14.037c0,1.088,0.791,1.879,1.779,1.879h27.084
+ c1.087,0,1.877-0.892,1.877-1.979c0,0,0-11.663,0-14.036C40.409,24.782,7.592,24.88,8.68,24.88z"/>
+ <path fill="#FFD100" d="M8.725,24.903c0,2.366,0,13.995,0,13.995c0,1.085,0.788,1.874,1.773,1.874h27.006
+ c1.083,0,1.872-0.889,1.872-1.973c0,0,0-11.629,0-13.994C40.361,24.806,7.64,24.903,8.725,24.903z"/>
+ <path fill="#FFD200" d="M8.769,24.925c0,2.359,0,13.955,0,13.955c0,1.082,0.786,1.867,1.769,1.867h26.926
+ c1.081,0,1.866-0.884,1.866-1.965c0,0,0-11.596,0-13.953C40.312,24.829,7.688,24.925,8.769,24.925z"/>
+ <path fill="#FFD300" d="M8.814,24.949c0,2.354,0,13.914,0,13.914c0,1.078,0.784,1.861,1.763,1.861h26.848
+ c1.077,0,1.86-0.882,1.86-1.959c0,0,0-11.562,0-13.914C40.266,24.852,7.736,24.949,8.814,24.949z"/>
+ <path fill="#FFD400" d="M8.858,24.973c0,2.345,0,13.872,0,13.872c0,1.074,0.781,1.855,1.758,1.855h26.768
+ c1.074,0,1.854-0.88,1.854-1.953c0,0,0-11.526,0-13.873C40.217,24.876,7.784,24.973,8.858,24.973z"/>
+ <path fill="#FFD500" d="M8.903,24.997c0,2.338,0,13.83,0,13.83c0,1.072,0.779,1.853,1.753,1.853h26.689
+ c1.07,0,1.85-0.877,1.85-1.948c0,0,0-11.493,0-13.832C40.17,24.898,7.832,24.997,8.903,24.997z"/>
+ <path fill="#FFD600" d="M8.949,25.019c0,2.331,0,13.791,0,13.791c0,1.068,0.777,1.846,1.748,1.846h26.61
+ c1.067,0,1.846-0.875,1.846-1.941c0,0,0-11.459,0-13.791C40.122,24.921,7.88,25.019,8.949,25.019z"/>
+ <path fill="#FFD700" d="M8.993,25.042c0,2.324,0,13.75,0,13.75c0,1.064,0.774,1.84,1.743,1.84h26.532
+ c1.064,0,1.838-0.871,1.838-1.937c0,0,0-11.426,0-13.75C40.074,24.945,7.928,25.042,8.993,25.042z"/>
+ <path fill="#FFD800" d="M9.039,25.065c0,2.316,0,13.708,0,13.708c0,1.063,0.772,1.835,1.737,1.835h26.453
+ c1.062,0,1.834-0.869,1.834-1.931c0,0,0-11.392,0-13.71C40.027,24.968,7.977,25.065,9.039,25.065z"/>
+ <path fill="#FFD900" d="M9.083,25.087c0,2.312,0,13.668,0,13.668c0,1.061,0.77,1.83,1.732,1.83h26.373
+ c1.06,0,1.828-0.867,1.828-1.926c0,0,0-11.356,0-13.668C39.979,24.993,8.024,25.087,9.083,25.087z"/>
+ <path fill="#FFDA00" d="M9.128,25.111c0,2.304,0,13.626,0,13.626c0,1.057,0.767,1.824,1.727,1.824h26.293
+ c1.056,0,1.822-0.864,1.822-1.919c0,0,0-11.323,0-13.627C39.932,25.016,8.072,25.111,9.128,25.111z"/>
+ <path fill="#FFDB00" d="M9.172,25.134c0,2.297,0,13.586,0,13.586c0,1.053,0.766,1.818,1.722,1.818h26.215
+ c1.052,0,1.816-0.861,1.816-1.914c0,0,0-11.289,0-13.586C39.884,25.04,8.12,25.134,9.172,25.134z"/>
+ <path fill="#FFDC00" d="M9.217,25.157c0,2.29,0,13.545,0,13.545c0,1.051,0.763,1.812,1.717,1.812H37.07
+ c1.049,0,1.812-0.858,1.812-1.907c0,0,0-11.256,0-13.545C39.836,25.062,8.168,25.157,9.217,25.157z"/>
+ <path fill="#FFDD00" d="M9.263,25.18c0,2.282,0,13.505,0,13.505c0,1.046,0.76,1.807,1.711,1.807h26.055
+ c1.047,0,1.808-0.855,1.808-1.902c0,0,0-11.221,0-13.502C39.788,25.085,8.216,25.18,9.263,25.18z"/>
+ <path fill="#FFDE00" d="M9.307,25.204c0,2.275,0,13.463,0,13.463c0,1.043,0.758,1.801,1.707,1.801h25.978
+ c1.043,0,1.801-0.854,1.801-1.896c0,0,0-11.188,0-13.463C39.74,25.109,8.265,25.204,9.307,25.204z"/>
+ <path fill="#FFDF00" d="M9.352,25.226c0,2.27,0,13.423,0,13.423c0,1.04,0.756,1.796,1.701,1.796h25.899
+ c1.039,0,1.795-0.852,1.795-1.89c0,0,0-11.153,0-13.423C39.691,25.132,8.312,25.226,9.352,25.226z"/>
+ <path fill="#FFE000" d="M9.397,25.251c0,2.262,0,13.379,0,13.379c0,1.037,0.753,1.791,1.696,1.791h25.819
+ c1.036,0,1.79-0.849,1.79-1.883c0,0,0-11.119,0-13.383C39.645,25.155,8.36,25.251,9.397,25.251z"/>
+ <path fill="#FFE100" d="M9.442,25.272c0,2.255,0,13.34,0,13.34c0,1.034,0.751,1.785,1.691,1.785h25.74
+ c1.033,0,1.784-0.846,1.784-1.879c0,0,0-11.084,0-13.34C39.598,25.179,8.408,25.272,9.442,25.272z"/>
+ <path fill="#FFE200" d="M9.486,25.296c0,2.248,0,13.299,0,13.299c0,1.029,0.749,1.779,1.686,1.779h25.662
+ c1.029,0,1.777-0.844,1.777-1.873c0,0,0-11.051,0-13.299C39.549,25.202,8.457,25.296,9.486,25.296z"/>
+ <path fill="#FFE300" d="M9.532,25.318c0,2.241,0,13.259,0,13.259c0,1.027,0.747,1.773,1.68,1.773h25.583
+ c1.025,0,1.771-0.84,1.771-1.866c0,0,0-11.017,0-13.259C39.502,25.226,8.504,25.318,9.532,25.318z"/>
+ <path fill="#FFE400" d="M9.577,25.341c0,2.234,0,13.218,0,13.218c0,1.024,0.744,1.769,1.675,1.769h25.503
+ c1.022,0,1.769-0.838,1.769-1.859c0,0,0-10.983,0-13.219C39.454,25.249,8.553,25.341,9.577,25.341z"/>
+ <path fill="#FFE500" d="M9.621,25.364c0,2.229,0,13.178,0,13.178c0,1.021,0.742,1.763,1.67,1.763h25.424
+ c1.02,0,1.764-0.835,1.764-1.855c0,0,0-10.948,0-13.176C39.406,25.272,8.601,25.364,9.621,25.364z"/>
+ <path fill="#FFE600" d="M9.666,25.388c0,2.221,0,13.135,0,13.135c0,1.02,0.74,1.758,1.665,1.758h25.345
+ c1.018,0,1.758-0.832,1.758-1.85c0,0,0-10.914,0-13.135C39.357,25.296,8.648,25.388,9.666,25.388z"/>
+ <path fill="#FFE600" d="M9.711,25.411c0,2.215,0,13.094,0,13.094c0,1.016,0.737,1.754,1.66,1.754h25.266
+ c1.016,0,1.752-0.83,1.752-1.846c0,0,0-10.879,0-13.094C39.311,25.319,8.696,25.411,9.711,25.411z"/>
+ <path fill="#FFE700" d="M9.756,25.434c0,2.207,0,13.054,0,13.054c0,1.012,0.735,1.747,1.654,1.747h25.188
+ c1.012,0,1.746-0.827,1.746-1.839c0,0,0-10.846,0-13.053C39.264,25.343,8.745,25.434,9.756,25.434z"/>
+ <path fill="#FFE800" d="M9.801,25.458c0,2.199,0,13.013,0,13.013c0,1.008,0.732,1.741,1.649,1.741h25.108
+ c1.008,0,1.74-0.825,1.74-1.834c0,0,0-10.812,0-13.012C39.215,25.366,8.792,25.458,9.801,25.458z"/>
+ <path fill="#FFE900" d="M9.845,25.48c0,2.192,0,12.972,0,12.972c0,1.006,0.73,1.735,1.644,1.735h25.029
+ c1.006,0,1.735-0.822,1.735-1.827c0,0,0-10.777,0-12.971C39.167,25.39,8.84,25.48,9.845,25.48z"/>
+ <path fill="#FFEA00" d="M9.89,25.503c0,2.187,0,12.931,0,12.931c0,1.002,0.729,1.729,1.639,1.729h24.95
+ c1.002,0,1.729-0.818,1.729-1.82c0,0,0-10.744,0-12.93C39.12,25.413,8.889,25.503,9.89,25.503z"/>
+ <path fill="#FFEB00" d="M9.935,25.526c0,2.18,0,12.891,0,12.891c0,0.998,0.726,1.725,1.634,1.725h24.871
+ c1,0,1.726-0.817,1.726-1.814c0,0,0-10.711,0-12.89C39.072,25.437,8.937,25.526,9.935,25.526z"/>
+ <path fill="#FFEC00" d="M9.98,25.548c0,2.174,0,12.85,0,12.85c0,0.996,0.724,1.721,1.628,1.721H36.4
+ c0.994,0,1.719-0.814,1.719-1.811c0,0,0-10.676,0-12.85C39.023,25.46,8.985,25.548,9.98,25.548z"/>
+ <path fill="#FFED00" d="M10.025,25.572c0,2.165,0,12.808,0,12.808c0,0.992,0.721,1.715,1.623,1.715h24.713
+ c0.99,0,1.713-0.812,1.713-1.805c0,0,0-10.642,0-12.808C38.977,25.482,9.033,25.572,10.025,25.572z"/>
+ <path fill="#FFEE00" d="M10.07,25.595c0,2.158,0,12.768,0,12.768c0,0.989,0.719,1.708,1.618,1.708h24.635
+ c0.987,0,1.706-0.809,1.706-1.798c0,0,0-10.607,0-12.768C38.93,25.505,9.081,25.595,10.07,25.595z"/>
+ <path fill="#FFEF00" d="M10.114,25.618c0,2.151,0,12.727,0,12.727c0,0.986,0.717,1.703,1.613,1.703h24.555
+ c0.985,0,1.702-0.808,1.702-1.793c0,0,0-10.573,0-12.726C38.881,25.529,9.129,25.618,10.114,25.618z"/>
+ <path fill="#FFF000" d="M10.159,25.642c0,2.145,0,12.686,0,12.686c0,0.982,0.714,1.696,1.608,1.696h24.476
+ c0.981,0,1.696-0.804,1.696-1.786c0,0,0-10.54,0-12.685C38.833,25.553,9.177,25.642,10.159,25.642z"/>
+ <path fill="#FFF100" d="M10.204,25.665c0,2.138,0,12.644,0,12.644c0,0.979,0.712,1.692,1.603,1.692h24.397
+ c0.979,0,1.69-0.802,1.69-1.78c0,0,0-10.507,0-12.644C38.785,25.577,9.225,25.665,10.204,25.665z"/>
+ <path fill="#FFF200" d="M10.249,25.688c0,2.131,0,12.603,0,12.603c0,0.978,0.71,1.688,1.597,1.688h24.318
+ c0.977,0,1.686-0.799,1.686-1.773c0,0,0-10.473,0-12.604C38.736,25.6,9.273,25.688,10.249,25.688z"/>
+ <path fill="#FFF300" d="M10.294,25.71c0,2.125,0,12.562,0,12.562c0,0.975,0.708,1.682,1.592,1.682h24.239
+ c0.973,0,1.68-0.797,1.68-1.77c0,0,0-10.438,0-12.562C38.689,25.624,9.321,25.71,10.294,25.71z"/>
+ <path fill="#FFF400" d="M10.339,25.733c0,2.117,0,12.521,0,12.521c0,0.97,0.705,1.675,1.587,1.675h24.16
+ c0.969,0,1.674-0.793,1.674-1.763c0,0,0-10.403,0-12.521C38.643,25.646,9.369,25.733,10.339,25.733z"/>
+ <path fill="#FFF500" d="M10.384,25.757c0,2.109,0,12.479,0,12.479c0,0.969,0.703,1.67,1.582,1.67h24.081
+ c0.967,0,1.669-0.79,1.669-1.757c0,0,0-10.369,0-12.479C38.596,25.669,9.417,25.757,10.384,25.757z"/>
+ <path fill="#FFF600" d="M10.428,25.779c0,2.104,0,12.438,0,12.438c0,0.965,0.701,1.664,1.577,1.664h24.002
+ c0.964,0,1.663-0.787,1.663-1.75c0,0,0-10.336,0-12.438C38.547,25.693,9.465,25.779,10.428,25.779z"/>
+ <path fill="#FFF700" d="M10.473,25.803c0,2.097,0,12.397,0,12.397c0,0.961,0.698,1.659,1.571,1.659h23.923
+ c0.96,0,1.658-0.786,1.658-1.746c0,0,0-10.302,0-12.397C38.499,25.716,9.513,25.803,10.473,25.803z"/>
+ <path fill="#FFF800" d="M10.518,25.827c0,2.088,0,12.355,0,12.355c0,0.958,0.696,1.654,1.566,1.654h23.844
+ c0.957,0,1.653-0.783,1.653-1.74c0,0,0-10.268,0-12.356C38.451,25.74,9.561,25.827,10.518,25.827z"/>
+ <path fill="#FFF900" d="M10.563,25.849c0,2.083,0,12.316,0,12.316c0,0.953,0.693,1.647,1.561,1.647h23.765
+ c0.953,0,1.647-0.78,1.647-1.733c0,0,0-10.233,0-12.316C38.402,25.763,9.609,25.849,10.563,25.849z"/>
+ <path fill="#FFFA00" d="M10.608,25.872c0,2.075,0,12.275,0,12.275c0,0.951,0.691,1.643,1.556,1.643H35.85
+ c0.95,0,1.643-0.777,1.643-1.729c0,0,0-10.199,0-12.275C38.355,25.786,9.657,25.872,10.608,25.872z"/>
+ <path fill="#FFFB00" d="M10.653,25.896c0,2.068,0,12.232,0,12.232c0,0.949,0.689,1.639,1.55,1.639h23.607
+ c0.946,0,1.637-0.775,1.637-1.723c0,0,0-10.166,0-12.234C38.309,25.81,9.705,25.896,10.653,25.896z"/>
+ <path fill="#FFFC00" d="M10.697,25.917c0,2.062,0,12.193,0,12.193c0,0.945,0.687,1.633,1.545,1.633H35.77
+ c0.944,0,1.631-0.772,1.631-1.718c0,0,0-10.132,0-12.192C38.262,25.833,9.753,25.917,10.697,25.917z"/>
+ <path fill="#FFFD00" d="M10.742,25.941c0,2.056,0,12.151,0,12.151c0,0.941,0.685,1.627,1.541,1.627h23.449
+ c0.939,0,1.625-0.771,1.625-1.711c0,0,0-10.098,0-12.152C38.213,25.856,9.801,25.941,10.742,25.941z"/>
+ <path fill="#FFFE00" d="M10.787,25.964c0,2.048,0,12.11,0,12.11c0,0.939,0.682,1.621,1.535,1.621h23.37
+ c0.938,0,1.619-0.768,1.619-1.705c0,0,0-10.062,0-12.11C38.165,25.88,9.849,25.964,10.787,25.964z"/>
+ <path fill="#FFFF00" d="M10.832,25.987c0,2.041,0,12.07,0,12.07c0,0.936,0.68,1.615,1.53,1.615h23.291
+ c0.936,0,1.615-0.766,1.615-1.699c0,0,0-10.029,0-12.07C38.117,25.903,9.897,25.987,10.832,25.987z"/>
+ </g>
+
+ <linearGradient id="House_Highlight_1_" gradientUnits="userSpaceOnUse" x1="210.0469" y1="-255.9038" x2="210.0469" y2="-269.6733" gradientTransform="matrix(1 0 0 -1 -186 -230)">
+ <stop offset="0" style="stop-color:#FFFFFF"/>
+ <stop offset="1" style="stop-color:#FFFF00"/>
+ </linearGradient>
+ <path id="House_Highlight" fill="url(#House_Highlight_1_)" d="M10.832,25.987c0,2.041,0,12.07,0,12.07
+ c0,0.936,0.68,1.615,1.53,1.615h23.291c0.936,0,1.615-0.766,1.615-1.699c0,0,0-10.029,0-12.07
+ C38.117,25.903,9.897,25.987,10.832,25.987z"/>
+ </g>
+ <g id="Roof">
+ <g>
+ <path fill="#006600" d="M22.8,6.963l-17.7,15.1l0,0c-0.3,0.301-0.5,0.801-0.5,1.2c0,0.2,0,0.399,0.1,0.601c0.3,0.6,0.9,1,1.6,1
+ l35.3-0.1c0.801,0,1.4-0.5,1.7-1.201c0.101-0.199,0.101-0.4,0.101-0.6c0-0.5-0.199-1-0.699-1.4L25.4,6.963l0.1,0.1
+ C24.8,6.363,23.7,6.263,22.8,6.963L22.8,6.963z"/>
+ <path fill="#006700" d="M22.803,6.989L5.155,22.044l0,0c-0.299,0.3-0.499,0.799-0.499,1.197c0,0.2,0,0.398,0.1,0.599
+ c0.299,0.598,0.897,0.997,1.595,0.997l35.198-0.1c0.799,0,1.396-0.5,1.695-1.197c0.102-0.198,0.102-0.399,0.102-0.598
+ c0-0.498-0.199-0.997-0.699-1.396L25.396,6.989l0.1,0.099C24.798,6.391,23.701,6.291,22.803,6.989L22.803,6.989z"/>
+ <path fill="#006800" d="M22.807,7.014L5.209,22.026l0,0c-0.298,0.299-0.497,0.796-0.497,1.193c0,0.199,0,0.397,0.1,0.598
+ c0.298,0.596,0.895,0.994,1.591,0.994l35.096-0.1c0.796,0,1.394-0.498,1.69-1.194c0.1-0.198,0.1-0.397,0.1-0.596
+ c0-0.497-0.198-0.995-0.696-1.393l-17.2-14.514l0.099,0.099C24.795,6.417,23.702,6.317,22.807,7.014L22.807,7.014z"/>
+ <path fill="#006900" d="M22.81,7.039L5.264,22.008l0,0c-0.298,0.298-0.496,0.793-0.496,1.189c0,0.198,0,0.396,0.099,0.596
+ c0.297,0.594,0.893,0.99,1.586,0.99l34.995-0.099c0.794,0,1.388-0.497,1.686-1.19c0.101-0.198,0.101-0.397,0.101-0.594
+ c0-0.496-0.198-0.991-0.694-1.389L25.389,7.039l0.1,0.099C24.793,6.444,23.703,6.345,22.81,7.039L22.81,7.039z"/>
+ <path fill="#006A00" d="M22.814,7.064L5.318,21.989l0,0c-0.296,0.298-0.494,0.792-0.494,1.187c0,0.198,0,0.395,0.099,0.594
+ c0.295,0.593,0.89,0.987,1.582,0.987l34.892-0.098c0.793,0,1.386-0.494,1.682-1.187c0.1-0.197,0.1-0.396,0.1-0.593
+ c0-0.494-0.197-0.988-0.691-1.384l-17.1-14.431l0.098,0.099C24.791,6.471,23.704,6.372,22.814,7.064L22.814,7.064z"/>
+ <path fill="#006B00" d="M22.817,7.089L5.373,21.971l0,0C5.077,22.267,4.88,22.76,4.88,23.154c0,0.197,0,0.394,0.099,0.592
+ c0.295,0.591,0.887,0.984,1.577,0.984l34.792-0.099c0.789,0,1.381-0.493,1.676-1.183c0.1-0.196,0.1-0.395,0.1-0.591
+ c0-0.493-0.197-0.986-0.689-1.38L25.381,7.089l0.098,0.098C24.788,6.498,23.705,6.399,22.817,7.089L22.817,7.089z"/>
+ <path fill="#006C00" d="M22.821,7.114L5.427,21.953l0,0c-0.295,0.295-0.492,0.787-0.492,1.179c0,0.197,0,0.393,0.099,0.59
+ c0.294,0.589,0.884,0.981,1.572,0.981l34.688-0.098c0.787,0,1.376-0.492,1.671-1.181c0.1-0.196,0.1-0.393,0.1-0.589
+ c0-0.492-0.196-0.983-0.688-1.376l-17-14.347l0.099,0.098C24.786,6.524,23.706,6.426,22.821,7.114L22.821,7.114z"/>
+ <path fill="#006D00" d="M22.824,7.139L5.481,21.934l0,0c-0.294,0.295-0.49,0.785-0.49,1.176c0,0.196,0,0.391,0.098,0.589
+ c0.293,0.587,0.882,0.98,1.567,0.98l34.587-0.099c0.784,0,1.372-0.49,1.666-1.176c0.099-0.195,0.099-0.393,0.099-0.588
+ c0-0.49-0.195-0.979-0.688-1.372L25.372,7.139l0.099,0.098C24.783,6.551,23.706,6.453,22.824,7.139L22.824,7.139z"/>
+ <path fill="#006E00" d="M22.827,7.164L5.536,21.915l0,0c-0.293,0.294-0.488,0.783-0.488,1.173c0,0.195,0,0.39,0.098,0.587
+ c0.293,0.585,0.879,0.977,1.563,0.977l34.484-0.097c0.783,0,1.369-0.49,1.662-1.173c0.098-0.194,0.098-0.391,0.098-0.586
+ c0-0.489-0.195-0.977-0.684-1.368L25.367,7.164l0.098,0.098C24.781,6.578,23.707,6.48,22.827,7.164L22.827,7.164z"/>
+ <path fill="#006F00" d="M22.831,7.189L5.591,21.897l0,0c-0.292,0.292-0.487,0.78-0.487,1.168c0,0.195,0,0.39,0.097,0.585
+ c0.292,0.584,0.876,0.973,1.558,0.973l34.384-0.097c0.779,0,1.363-0.487,1.655-1.169c0.099-0.194,0.099-0.39,0.099-0.584
+ c0-0.487-0.194-0.974-0.683-1.364L25.363,7.189l0.099,0.098C24.779,6.605,23.708,6.507,22.831,7.189L22.831,7.189z"/>
+ <path fill="#007000" d="M22.834,7.215L5.646,21.879l0,0c-0.292,0.292-0.486,0.778-0.486,1.165c0,0.195,0,0.388,0.098,0.584
+ c0.291,0.582,0.874,0.971,1.554,0.971l34.281-0.098c0.778,0,1.36-0.485,1.651-1.166c0.098-0.193,0.098-0.389,0.098-0.583
+ c0-0.485-0.193-0.971-0.68-1.36L25.359,7.215l0.098,0.097C24.775,6.632,23.709,6.535,22.834,7.215L22.834,7.215z"/>
+ <path fill="#007100" d="M22.838,7.24L5.7,21.86l0,0c-0.291,0.292-0.484,0.775-0.484,1.162c0,0.194,0,0.387,0.097,0.582
+ c0.29,0.58,0.871,0.967,1.549,0.967l34.18-0.096c0.774,0,1.354-0.484,1.646-1.162c0.1-0.193,0.1-0.388,0.1-0.581
+ c0-0.484-0.194-0.968-0.68-1.356L25.355,7.24l0.097,0.097C24.773,6.659,23.709,6.562,22.838,7.24L22.838,7.24z"/>
+ <path fill="#007200" d="M22.842,7.265L5.755,21.842l0,0C5.465,22.133,5.272,22.615,5.272,23c0,0.194,0,0.386,0.097,0.581
+ c0.289,0.578,0.868,0.964,1.544,0.964l34.077-0.096c0.773,0,1.353-0.483,1.642-1.159c0.097-0.192,0.097-0.387,0.097-0.579
+ c0-0.483-0.191-0.965-0.676-1.352L25.352,7.265l0.098,0.096C24.771,6.686,23.711,6.589,22.842,7.265L22.842,7.265z"/>
+ <path fill="#007300" d="M22.845,7.29L5.809,21.824l0,0c-0.29,0.29-0.481,0.771-0.481,1.155c0,0.193,0,0.385,0.096,0.579
+ c0.289,0.577,0.867,0.961,1.54,0.961l33.976-0.097c0.771,0,1.35-0.481,1.638-1.155c0.097-0.192,0.097-0.386,0.097-0.577
+ c0-0.481-0.191-0.963-0.674-1.348L25.348,7.29l0.098,0.096C24.771,6.712,23.711,6.616,22.845,7.29L22.845,7.29z"/>
+ <path fill="#007400" d="M22.848,7.315L5.863,21.805l0,0c-0.288,0.289-0.48,0.769-0.48,1.152c0,0.192,0,0.383,0.096,0.576
+ c0.288,0.575,0.864,0.959,1.535,0.959l33.875-0.096c0.769,0,1.344-0.479,1.631-1.152c0.098-0.191,0.098-0.384,0.098-0.575
+ c0-0.479-0.192-0.959-0.672-1.344L25.344,7.315l0.096,0.096C24.768,6.739,23.712,6.643,22.848,7.315L22.848,7.315z"/>
+ <path fill="#007500" d="M22.852,7.34L5.918,21.787l0,0c-0.288,0.288-0.479,0.767-0.479,1.148c0,0.191,0,0.382,0.096,0.575
+ c0.287,0.574,0.861,0.956,1.53,0.956l33.772-0.096c0.767,0,1.34-0.478,1.627-1.148c0.097-0.19,0.097-0.383,0.097-0.574
+ c0-0.479-0.19-0.957-0.67-1.34L25.34,7.34l0.096,0.095C24.766,6.767,23.713,6.67,22.852,7.34L22.852,7.34z"/>
+ <path fill="#007600" d="M22.855,7.365L5.973,21.768l0,0c-0.287,0.287-0.477,0.764-0.477,1.145c0,0.191,0,0.381,0.095,0.573
+ c0.286,0.572,0.858,0.953,1.526,0.953l33.67-0.095c0.764,0,1.336-0.477,1.622-1.146c0.096-0.19,0.096-0.382,0.096-0.572
+ c0-0.477-0.19-0.954-0.668-1.336L25.336,7.365l0.096,0.095C24.764,6.793,23.714,6.697,22.855,7.365L22.855,7.365z"/>
+ <path fill="#007700" d="M22.858,7.391L6.027,21.75l0,0c-0.286,0.286-0.476,0.762-0.476,1.142c0,0.19,0,0.38,0.095,0.571
+ c0.285,0.57,0.856,0.95,1.521,0.95l33.567-0.095c0.763,0,1.332-0.476,1.617-1.141c0.097-0.189,0.097-0.381,0.097-0.57
+ c0-0.476-0.19-0.951-0.666-1.332L25.331,7.391l0.096,0.095C24.762,6.82,23.715,6.725,22.858,7.391L22.858,7.391z"/>
+ <path fill="#007800" d="M22.862,7.416L6.082,21.731l0,0c-0.285,0.285-0.475,0.759-0.475,1.138c0,0.19,0,0.379,0.095,0.57
+ c0.284,0.568,0.854,0.947,1.517,0.947l33.467-0.095c0.76,0,1.328-0.474,1.61-1.138c0.097-0.189,0.097-0.379,0.097-0.568
+ c0-0.474-0.189-0.948-0.664-1.328L25.327,7.416l0.095,0.095C24.758,6.847,23.716,6.751,22.862,7.416L22.862,7.416z"/>
+ <path fill="#007900" d="M22.865,7.441L6.136,21.713l0,0c-0.284,0.284-0.473,0.757-0.473,1.135c0,0.189,0,0.377,0.095,0.567
+ c0.283,0.567,0.851,0.944,1.512,0.944l33.365-0.094c0.758,0,1.324-0.473,1.607-1.135c0.095-0.188,0.095-0.378,0.095-0.566
+ c0-0.473-0.188-0.945-0.662-1.324L25.323,7.441l0.095,0.094C24.756,6.874,23.716,6.779,22.865,7.441L22.865,7.441z"/>
+ <path fill="#007A00" d="M22.869,7.466L6.19,21.694l0,0c-0.283,0.283-0.471,0.754-0.471,1.131c0,0.188,0,0.376,0.094,0.566
+ c0.283,0.564,0.848,0.941,1.507,0.941l33.263-0.094c0.755,0,1.319-0.471,1.603-1.131c0.096-0.188,0.096-0.377,0.096-0.565
+ c0-0.471-0.188-0.942-0.66-1.32L25.318,7.466l0.095,0.094C24.754,6.901,23.717,6.806,22.869,7.466L22.869,7.466z"/>
+ <path fill="#007B00" d="M22.872,7.491L6.245,21.676l0,0c-0.282,0.283-0.47,0.752-0.47,1.128c0,0.188,0,0.375,0.094,0.564
+ c0.282,0.563,0.846,0.939,1.503,0.939l33.161-0.094c0.753,0,1.316-0.469,1.598-1.127c0.096-0.187,0.096-0.376,0.096-0.563
+ c0-0.47-0.188-0.939-0.658-1.316L25.314,7.491l0.095,0.094C24.751,6.927,23.718,6.833,22.872,7.491L22.872,7.491z"/>
+ <path fill="#007C00" d="M22.876,7.516L6.299,21.658l0,0c-0.281,0.281-0.468,0.75-0.468,1.124c0,0.188,0,0.374,0.094,0.562
+ c0.281,0.562,0.843,0.936,1.499,0.936l33.059-0.093c0.75,0,1.312-0.468,1.594-1.124c0.094-0.187,0.094-0.375,0.094-0.562
+ c0-0.468-0.188-0.937-0.656-1.312L25.312,7.516l0.094,0.094C24.749,6.954,23.719,6.86,22.876,7.516L22.876,7.516z"/>
+ <path fill="#007D00" d="M22.879,7.542L6.354,21.639l0,0c-0.281,0.281-0.467,0.748-0.467,1.121c0,0.187,0,0.373,0.094,0.561
+ c0.28,0.56,0.84,0.933,1.494,0.933l32.958-0.093c0.748,0,1.308-0.467,1.586-1.121c0.096-0.186,0.096-0.374,0.096-0.56
+ c0-0.467-0.188-0.934-0.654-1.307L25.307,7.542L25.4,7.635C24.746,6.981,23.72,6.887,22.879,7.542L22.879,7.542z"/>
+ <path fill="#007E00" d="M22.883,7.566L6.408,21.621l0,0c-0.279,0.28-0.465,0.745-0.465,1.117c0,0.187,0,0.372,0.093,0.559
+ c0.279,0.558,0.838,0.93,1.489,0.93l32.856-0.093c0.746,0,1.305-0.465,1.583-1.117c0.095-0.186,0.095-0.373,0.095-0.559
+ c0-0.465-0.188-0.93-0.652-1.303L25.303,7.566l0.094,0.093C24.744,7.008,23.721,6.915,22.883,7.566L22.883,7.566z"/>
+ <path fill="#007F00" d="M22.886,7.592L6.463,21.603l0,0c-0.279,0.279-0.464,0.743-0.464,1.113c0,0.186,0,0.371,0.093,0.558
+ c0.278,0.556,0.835,0.927,1.484,0.927l32.754-0.092c0.743,0,1.3-0.464,1.577-1.114c0.094-0.185,0.094-0.372,0.094-0.557
+ c0-0.464-0.187-0.928-0.649-1.299L25.299,7.592l0.094,0.092C24.742,7.035,23.722,6.941,22.886,7.592L22.886,7.592z"/>
+ <path fill="#007F00" d="M22.89,7.617L6.518,21.584l0,0c-0.278,0.278-0.462,0.741-0.462,1.11c0,0.185,0,0.369,0.092,0.556
+ c0.276,0.555,0.833,0.924,1.48,0.924l32.651-0.092c0.742,0,1.297-0.462,1.572-1.11c0.094-0.185,0.094-0.371,0.094-0.555
+ c0-0.462-0.186-0.925-0.647-1.295L25.295,7.617l0.094,0.092C24.738,7.062,23.723,6.969,22.89,7.617L22.89,7.617z"/>
+ <path fill="#008000" d="M22.893,7.642L6.572,21.565l0,0c-0.277,0.277-0.461,0.739-0.461,1.107c0,0.185,0,0.368,0.092,0.554
+ c0.276,0.553,0.83,0.921,1.475,0.921l32.55-0.092c0.738,0,1.291-0.461,1.566-1.106c0.094-0.184,0.094-0.369,0.094-0.553
+ c0-0.461-0.185-0.922-0.646-1.292L25.291,7.642l0.093,0.092C24.736,7.088,23.724,6.996,22.893,7.642L22.893,7.642z"/>
+ <path fill="#008100" d="M22.896,7.667l-16.27,13.88l0,0c-0.276,0.277-0.459,0.736-0.459,1.104c0,0.184,0,0.367,0.092,0.552
+ c0.275,0.551,0.827,0.918,1.471,0.918l32.448-0.091c0.736,0,1.288-0.459,1.562-1.104c0.093-0.183,0.093-0.368,0.093-0.551
+ c0-0.459-0.185-0.919-0.644-1.287L25.287,7.667l0.092,0.092C24.734,7.116,23.725,7.023,22.896,7.667L22.896,7.667z"/>
+ <path fill="#008200" d="M22.9,7.692L6.681,21.529l0,0c-0.275,0.275-0.458,0.734-0.458,1.1c0,0.184,0,0.366,0.092,0.55
+ c0.275,0.549,0.825,0.916,1.466,0.916l32.347-0.091c0.733,0,1.284-0.458,1.558-1.1c0.094-0.183,0.094-0.367,0.094-0.55
+ c0-0.458-0.184-0.917-0.643-1.283L25.282,7.692l0.093,0.091C24.732,7.143,23.725,7.05,22.9,7.692L22.9,7.692z"/>
+ <path fill="#008300" d="M22.903,7.717L6.735,21.51l0,0c-0.274,0.275-0.457,0.731-0.457,1.096c0,0.183,0,0.365,0.091,0.549
+ c0.274,0.547,0.822,0.913,1.461,0.913l32.245-0.091c0.731,0,1.28-0.457,1.554-1.096c0.092-0.182,0.092-0.366,0.092-0.548
+ c0-0.457-0.183-0.914-0.64-1.279L25.277,7.717l0.093,0.091C24.73,7.169,23.726,7.078,22.903,7.717L22.903,7.717z"/>
+ <path fill="#008400" d="M22.907,7.742L6.79,21.492l0,0c-0.273,0.274-0.456,0.729-0.456,1.093c0,0.183,0,0.364,0.091,0.547
+ c0.273,0.546,0.82,0.909,1.457,0.909l32.144-0.09c0.729,0,1.274-0.455,1.548-1.093c0.092-0.181,0.092-0.364,0.092-0.546
+ c0-0.455-0.183-0.911-0.638-1.275L25.273,7.742l0.093,0.091C24.729,7.196,23.727,7.105,22.907,7.742L22.907,7.742z"/>
+ <path fill="#008500" d="M22.911,7.768L6.845,21.474l0,0c-0.272,0.273-0.454,0.727-0.454,1.089c0,0.182,0,0.363,0.091,0.546
+ c0.272,0.543,0.817,0.906,1.452,0.906l32.041-0.09c0.729,0,1.271-0.454,1.543-1.089c0.092-0.181,0.092-0.363,0.092-0.544
+ c0-0.454-0.182-0.908-0.635-1.271L25.271,7.768l0.09,0.09C24.727,7.223,23.728,7.132,22.911,7.768L22.911,7.768z"/>
+ <path fill="#008600" d="M22.914,7.792L6.899,21.455l0,0c-0.272,0.272-0.453,0.725-0.453,1.086c0,0.181,0,0.361,0.091,0.543
+ c0.271,0.542,0.814,0.904,1.447,0.904l31.939-0.09c0.726,0,1.269-0.452,1.538-1.086c0.092-0.18,0.092-0.362,0.092-0.542
+ c0-0.452-0.181-0.905-0.634-1.267L25.268,7.792l0.09,0.09C24.725,7.25,23.729,7.159,22.914,7.792L22.914,7.792z"/>
+ <path fill="#008700" d="M22.917,7.818L6.954,21.437l0,0c-0.271,0.271-0.451,0.722-0.451,1.083c0,0.181,0,0.36,0.09,0.542
+ c0.271,0.54,0.812,0.901,1.443,0.901l31.837-0.09c0.723,0,1.264-0.451,1.533-1.082c0.092-0.18,0.092-0.361,0.092-0.541
+ c0-0.451-0.182-0.902-0.633-1.263L25.264,7.818l0.09,0.09C24.723,7.277,23.729,7.186,22.917,7.818L22.917,7.818z"/>
+ <path fill="#008800" d="M22.921,7.843L7.008,21.418l0,0c-0.27,0.27-0.45,0.72-0.45,1.079c0,0.18,0,0.359,0.09,0.54
+ c0.27,0.539,0.809,0.898,1.438,0.898l31.734-0.09c0.722,0,1.261-0.449,1.529-1.079c0.09-0.179,0.09-0.36,0.09-0.539
+ c0-0.449-0.18-0.899-0.629-1.259L25.259,7.843l0.091,0.09C24.719,7.303,23.73,7.213,22.921,7.843L22.921,7.843z"/>
+ <path fill="#008900" d="M22.924,7.868L7.062,21.4l0,0c-0.269,0.269-0.448,0.717-0.448,1.075c0,0.18,0,0.358,0.09,0.539
+ c0.269,0.537,0.807,0.895,1.434,0.895l31.633-0.089c0.72,0,1.256-0.448,1.523-1.075c0.092-0.179,0.092-0.359,0.092-0.538
+ c0-0.448-0.181-0.896-0.629-1.255L25.255,7.868l0.091,0.089C24.717,7.331,23.731,7.241,22.924,7.868L22.924,7.868z"/>
+ <path fill="#008A00" d="M22.928,7.893L7.117,21.381l0,0C6.849,21.65,6.67,22.097,6.67,22.453c0,0.179,0,0.357,0.089,0.537
+ c0.268,0.536,0.804,0.893,1.429,0.893l31.533-0.089c0.715,0,1.252-0.446,1.518-1.072c0.092-0.178,0.092-0.358,0.092-0.536
+ c0-0.446-0.18-0.894-0.626-1.251L25.25,7.893l0.09,0.089C24.714,7.357,23.732,7.268,22.928,7.893L22.928,7.893z"/>
+ <path fill="#008B00" d="M22.931,7.918L7.172,21.363l0,0c-0.268,0.268-0.445,0.713-0.445,1.069c0,0.178,0,0.355,0.089,0.535
+ c0.267,0.534,0.801,0.89,1.424,0.89l31.43-0.089c0.714,0,1.248-0.445,1.514-1.068c0.09-0.178,0.09-0.357,0.09-0.534
+ c0-0.445-0.178-0.891-0.623-1.247L25.246,7.918l0.09,0.089C24.712,7.384,23.733,7.295,22.931,7.918L22.931,7.918z"/>
+ <path fill="#008C00" d="M22.935,7.943L7.227,21.345l0,0c-0.267,0.267-0.444,0.71-0.444,1.065c0,0.178,0,0.354,0.089,0.533
+ c0.266,0.532,0.799,0.887,1.42,0.887l31.328-0.089c0.711,0,1.243-0.443,1.509-1.065c0.09-0.177,0.09-0.355,0.09-0.532
+ c0-0.444-0.178-0.888-0.621-1.243L25.242,7.943l0.089,0.089C24.71,7.411,23.734,7.322,22.935,7.943L22.935,7.943z"/>
+ <path fill="#008D00" d="M22.938,7.968L7.281,21.326l0,0c-0.266,0.266-0.442,0.708-0.442,1.062c0,0.177,0,0.353,0.088,0.532
+ c0.264,0.53,0.796,0.883,1.415,0.883l31.227-0.088c0.709,0,1.24-0.442,1.505-1.062c0.09-0.176,0.09-0.354,0.09-0.53
+ c0-0.442-0.177-0.885-0.62-1.239L25.238,7.968l0.089,0.088C24.707,7.438,23.735,7.349,22.938,7.968L22.938,7.968z"/>
+ <path fill="#008E00" d="M22.941,7.994L7.335,21.308l0,0c-0.265,0.265-0.441,0.706-0.441,1.058c0,0.177,0,0.352,0.088,0.53
+ c0.264,0.528,0.793,0.881,1.411,0.881l31.125-0.088c0.707,0,1.235-0.441,1.5-1.058c0.088-0.176,0.088-0.353,0.088-0.529
+ c0-0.441-0.176-0.882-0.617-1.235L25.234,7.994l0.089,0.088C24.705,7.465,23.736,7.376,22.941,7.994L22.941,7.994z"/>
+ <path fill="#008F00" d="M22.945,8.019L7.39,21.289l0,0c-0.264,0.264-0.44,0.704-0.44,1.055c0,0.176,0,0.351,0.088,0.528
+ c0.263,0.527,0.791,0.878,1.406,0.878l31.022-0.088c0.704,0,1.231-0.439,1.494-1.055c0.089-0.175,0.089-0.352,0.089-0.527
+ c0-0.439-0.176-0.879-0.615-1.231L25.229,8.019l0.09,0.088C24.703,7.492,23.736,7.403,22.945,8.019L22.945,8.019z"/>
+ <path fill="#009000" d="M22.948,8.044L7.444,21.271l0,0c-0.263,0.263-0.438,0.701-0.438,1.051c0,0.175,0,0.35,0.087,0.526
+ c0.263,0.525,0.789,0.875,1.401,0.875l30.921-0.088c0.702,0,1.228-0.438,1.489-1.051c0.089-0.174,0.089-0.351,0.089-0.525
+ c0-0.438-0.177-0.876-0.614-1.227L25.227,8.044l0.088,0.087C24.7,7.519,23.737,7.431,22.948,8.044L22.948,8.044z"/>
+ <path fill="#009100" d="M22.952,8.069L7.499,21.252l0,0c-0.262,0.262-0.437,0.699-0.437,1.048c0,0.175,0,0.349,0.087,0.524
+ c0.262,0.523,0.786,0.872,1.397,0.872l30.819-0.087c0.699,0,1.224-0.436,1.484-1.047c0.088-0.174,0.088-0.35,0.088-0.524
+ c0-0.436-0.174-0.873-0.611-1.223L25.223,8.069l0.088,0.087C24.698,7.545,23.738,7.458,22.952,8.069L22.952,8.069z"/>
+ <path fill="#009200" d="M22.955,8.094L7.553,21.234l0,0c-0.261,0.262-0.435,0.697-0.435,1.044c0,0.174,0,0.347,0.087,0.523
+ c0.259,0.521,0.783,0.869,1.392,0.869l30.717-0.087c0.697,0,1.22-0.435,1.479-1.044c0.088-0.173,0.088-0.348,0.088-0.522
+ c0-0.435-0.174-0.87-0.609-1.218L25.218,8.094l0.089,0.087C24.695,7.572,23.739,7.485,22.955,8.094L22.955,8.094z"/>
+ <path fill="#009300" d="M22.959,8.119L7.608,21.215l0,0c-0.26,0.261-0.434,0.695-0.434,1.041c0,0.174,0,0.346,0.087,0.521
+ c0.26,0.52,0.781,0.867,1.388,0.867l30.615-0.087c0.695,0,1.217-0.434,1.475-1.041c0.089-0.173,0.089-0.348,0.089-0.521
+ c0-0.433-0.175-0.867-0.606-1.214L25.214,8.119l0.088,0.087C24.693,7.599,23.74,7.512,22.959,8.119L22.959,8.119z"/>
+ <path fill="#009400" d="M22.962,8.145l-15.3,13.053l0,0c-0.26,0.26-0.433,0.692-0.433,1.037c0,0.173,0,0.345,0.086,0.52
+ c0.259,0.518,0.778,0.863,1.383,0.863l30.514-0.086c0.692,0,1.212-0.432,1.47-1.038c0.088-0.172,0.088-0.346,0.088-0.519
+ c0-0.432-0.172-0.864-0.605-1.21L25.21,8.145l0.087,0.086C24.691,7.626,23.741,7.539,22.962,8.145L22.962,8.145z"/>
+ <path fill="#009500" d="M22.966,8.169L7.717,21.179l0,0c-0.259,0.259-0.431,0.69-0.431,1.034c0,0.173,0,0.344,0.086,0.518
+ c0.257,0.517,0.775,0.86,1.378,0.86l30.412-0.086c0.689,0,1.207-0.431,1.465-1.034c0.087-0.171,0.087-0.345,0.087-0.517
+ c0-0.431-0.172-0.861-0.604-1.207L25.206,8.169l0.087,0.086C24.688,7.653,23.742,7.566,22.966,8.169L22.966,8.169z"/>
+ <path fill="#009600" d="M22.969,8.195L7.771,21.16l0,0c-0.258,0.258-0.43,0.688-0.43,1.03c0,0.172,0,0.343,0.086,0.516
+ c0.257,0.515,0.773,0.858,1.374,0.858l30.311-0.086c0.688,0,1.203-0.429,1.459-1.03c0.088-0.171,0.088-0.344,0.088-0.515
+ c0-0.429-0.172-0.859-0.602-1.203L25.201,8.195l0.087,0.085C24.688,7.68,23.743,7.593,22.969,8.195L22.969,8.195z"/>
+ <path fill="#009700" d="M22.973,8.22L7.826,21.142l0,0c-0.257,0.257-0.428,0.686-0.428,1.027c0,0.171,0,0.341,0.085,0.514
+ c0.255,0.513,0.771,0.855,1.369,0.855l30.208-0.086c0.687,0,1.198-0.428,1.455-1.027c0.086-0.17,0.086-0.343,0.086-0.513
+ c0-0.428-0.172-0.856-0.6-1.198L25.197,8.22l0.087,0.085C24.686,7.707,23.743,7.621,22.973,8.22L22.973,8.22z"/>
+ <path fill="#009800" d="M22.976,8.245L7.88,21.124l0,0c-0.256,0.256-0.427,0.683-0.427,1.023c0,0.171,0,0.34,0.085,0.512
+ c0.256,0.511,0.768,0.852,1.364,0.852l30.106-0.085c0.684,0,1.195-0.426,1.45-1.023c0.086-0.17,0.086-0.342,0.086-0.512
+ c0-0.426-0.17-0.853-0.599-1.194L25.193,8.245l0.086,0.085C24.682,7.733,23.744,7.647,22.976,8.245L22.976,8.245z"/>
+ <path fill="#009900" d="M22.979,8.27L7.935,21.105l0,0C7.68,21.36,7.51,21.786,7.51,22.125c0,0.17,0,0.339,0.085,0.511
+ c0.255,0.509,0.765,0.849,1.36,0.849L38.959,23.4c0.682,0,1.191-0.425,1.445-1.02c0.086-0.169,0.086-0.34,0.086-0.51
+ c0-0.425-0.17-0.85-0.596-1.19L25.189,8.27l0.086,0.085C24.68,7.76,23.745,7.675,22.979,8.27L22.979,8.27z"/>
+ </g>
+
+ <linearGradient id="Roof_Highlight_1_" gradientUnits="userSpaceOnUse" x1="210" y1="-237.8638" x2="210" y2="-253.4849" gradientTransform="matrix(1 0 0 -1 -186 -230)">
+ <stop offset="0" style="stop-color:#FFFFFF"/>
+ <stop offset="1" style="stop-color:#009900"/>
+ </linearGradient>
+ <path id="Roof_Highlight" fill="url(#Roof_Highlight_1_)" d="M22.979,8.27L7.935,21.105l0,0C7.68,21.36,7.51,21.786,7.51,22.125
+ c0,0.17,0,0.339,0.085,0.51c0.255,0.51,0.765,0.85,1.36,0.85L38.959,23.4c0.682,0,1.191-0.425,1.445-1.021
+ c0.086-0.169,0.086-0.34,0.086-0.51c0-0.424-0.17-0.85-0.596-1.189L25.189,8.27l0.086,0.085C24.68,7.76,23.745,7.675,22.979,8.27
+ L22.979,8.27z"/>
+ </g>
+ </g>
+</g>
+<g id="Layer_2">
+ <g id="crop_x0020_marks">
+ <path fill="none" d="M48,47.687H0v-48h48V47.687z"/>
+ </g>
+</g>
+</svg>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/colorsvg/important.svg b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/colorsvg/important.svg
new file mode 100644
index 0000000..803ad8d
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/colorsvg/important.svg
@@ -0,0 +1,239 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 12.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 51448) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [
+ <!ENTITY ns_svg "http://www.w3.org/2000/svg">
+ <!ENTITY ns_xlink "http://www.w3.org/1999/xlink">
+]>
+<svg version="1.1" id="Caution" xmlns="&ns_svg;" xmlns:xlink="&ns_xlink;" width="48" height="48" viewBox="0 0 48 48"
+ overflow="visible" enable-background="new 0 0 48 48" xml:space="preserve">
+<g>
+ <path stroke="#FFFFFF" stroke-width="6.6112" d="M42.35,35.841L27.248,9.941c-0.602-1-1.699-1.7-2.899-1.6c-1.2,0-2.3,0.7-2.9,1.7
+ l-14.5,25.901c-0.6,1-0.6,2.299,0,3.299c0.6,1,1.7,1.6,2.9,1.6h29.601c1.199,0,2.301-0.6,2.898-1.697
+ C42.949,38.142,42.949,36.841,42.35,35.841L42.35,35.841z"/>
+ <g>
+ <path fill="#FFFFFF" stroke="#009900" stroke-width="6.6112" stroke-linecap="round" stroke-linejoin="round" d="M24.349,11.586
+ l-14.5,26h29.601L24.349,11.586z"/>
+ <polygon fill="#FFFFFF" stroke="#009A00" stroke-width="6.6112" stroke-linecap="round" stroke-linejoin="round" points="
+ 24.35,11.611 9.877,37.562 39.42,37.562 "/>
+ <polygon fill="#FFFFFF" stroke="#009B01" stroke-width="6.6112" stroke-linecap="round" stroke-linejoin="round" points="
+ 24.35,11.637 9.907,37.536 39.391,37.536 "/>
+ <polygon fill="#FFFFFF" stroke="#009C01" stroke-width="6.6112" stroke-linecap="round" stroke-linejoin="round" points="
+ 24.351,11.662 9.935,37.511 39.361,37.511 "/>
+ <polygon fill="#FFFFFF" stroke="#009D02" stroke-width="6.6112" stroke-linecap="round" stroke-linejoin="round" points="
+ 24.352,11.688 9.963,37.485 39.334,37.485 "/>
+ <polygon fill="#FFFFFF" stroke="#009E02" stroke-width="6.6112" stroke-linecap="round" stroke-linejoin="round" points="
+ 24.352,11.712 9.993,37.46 39.305,37.46 "/>
+ <polygon fill="#FFFFFF" stroke="#009F03" stroke-width="6.6112" stroke-linecap="round" stroke-linejoin="round" points="
+ 24.353,11.738 10.021,37.435 39.275,37.435 "/>
+ <polygon fill="#FFFFFF" stroke="#00A003" stroke-width="6.6112" stroke-linecap="round" stroke-linejoin="round" points="
+ 24.353,11.763 10.049,37.409 39.248,37.409 "/>
+ <polygon fill="#FFFFFF" stroke="#00A104" stroke-width="6.6112" stroke-linecap="round" stroke-linejoin="round" points="
+ 24.354,11.789 10.079,37.386 39.219,37.386 "/>
+ <polygon fill="#FFFFFF" stroke="#00A204" stroke-width="6.6112" stroke-linecap="round" stroke-linejoin="round" points="
+ 24.354,11.813 10.106,37.36 39.189,37.36 "/>
+ <polygon fill="#FFFFFF" stroke="#00A305" stroke-width="6.6112" stroke-linecap="round" stroke-linejoin="round" points="
+ 24.354,11.838 10.135,37.335 39.16,37.335 "/>
+ <polygon fill="#FFFFFF" stroke="#00A405" stroke-width="6.6112" stroke-linecap="round" stroke-linejoin="round" points="
+ 24.355,11.864 10.166,37.31 39.133,37.31 "/>
+ <polygon fill="#FFFFFF" stroke="#00A506" stroke-width="6.6112" stroke-linecap="round" stroke-linejoin="round" points="
+ 24.355,11.89 10.193,37.284 39.104,37.284 "/>
+ <polygon fill="#FFFFFF" stroke="#00A606" stroke-width="6.6112" stroke-linecap="round" stroke-linejoin="round" points="
+ 24.355,11.915 10.223,37.259 39.074,37.259 "/>
+ <polygon fill="#FFFFFF" stroke="#00A707" stroke-width="6.6112" stroke-linecap="round" stroke-linejoin="round" points="
+ 24.356,11.939 10.25,37.233 39.047,37.233 "/>
+ <polygon fill="#FFFFFF" stroke="#00A807" stroke-width="6.6112" stroke-linecap="round" stroke-linejoin="round" points="
+ 24.357,11.965 10.279,37.21 39.018,37.21 "/>
+ <polygon fill="#FFFFFF" stroke="#00A908" stroke-width="6.6112" stroke-linecap="round" stroke-linejoin="round" points="
+ 24.357,11.99 10.309,37.183 38.988,37.183 "/>
+ <polygon fill="#FFFFFF" stroke="#00AA08" stroke-width="6.6112" stroke-linecap="round" stroke-linejoin="round" points="
+ 24.357,12.016 10.336,37.157 38.959,37.157 "/>
+ <polygon fill="#FFFFFF" stroke="#00AB09" stroke-width="6.6112" stroke-linecap="round" stroke-linejoin="round" points="
+ 24.358,12.041 10.367,37.132 38.932,37.132 "/>
+ <polygon fill="#FFFFFF" stroke="#00AC09" stroke-width="6.6112" stroke-linecap="round" stroke-linejoin="round" points="
+ 24.359,12.066 10.396,37.106 38.902,37.106 "/>
+ <polygon fill="#FFFFFF" stroke="#00AD0A" stroke-width="6.6112" stroke-linecap="round" stroke-linejoin="round" points="
+ 24.359,12.091 10.423,37.083 38.873,37.083 "/>
+ <polygon fill="#FFFFFF" stroke="#00AE0A" stroke-width="6.6112" stroke-linecap="round" stroke-linejoin="round" points="
+ 24.36,12.116 10.453,37.056 38.846,37.056 "/>
+ <polygon fill="#FFFFFF" stroke="#00AF0B" stroke-width="6.6112" stroke-linecap="round" stroke-linejoin="round" points="
+ 24.361,12.142 10.48,37.032 38.816,37.032 "/>
+ <polygon fill="#FFFFFF" stroke="#00B00B" stroke-width="6.6112" stroke-linecap="round" stroke-linejoin="round" points="
+ 24.362,12.167 10.509,37.007 38.789,37.007 "/>
+ <polygon fill="#FFFFFF" stroke="#00B10C" stroke-width="6.6112" stroke-linecap="round" stroke-linejoin="round" points="
+ 24.362,12.191 10.539,36.981 38.76,36.981 "/>
+ <polygon fill="#FFFFFF" stroke="#00B20C" stroke-width="6.6112" stroke-linecap="round" stroke-linejoin="round" points="
+ 24.362,12.217 10.566,36.956 38.729,36.956 "/>
+ <polygon fill="#FFFFFF" stroke="#00B30D" stroke-width="6.6112" stroke-linecap="round" stroke-linejoin="round" points="
+ 24.363,12.242 10.596,36.931 38.701,36.931 "/>
+ <polygon fill="#FFFFFF" stroke="#00B40D" stroke-width="6.6112" stroke-linecap="round" stroke-linejoin="round" points="
+ 24.364,12.269 10.625,36.905 38.674,36.905 "/>
+ <polygon fill="#FFFFFF" stroke="#00B50E" stroke-width="6.6112" stroke-linecap="round" stroke-linejoin="round" points="
+ 24.364,12.293 10.653,36.88 38.645,36.88 "/>
+ <polygon fill="#FFFFFF" stroke="#00B60E" stroke-width="6.6112" stroke-linecap="round" stroke-linejoin="round" points="
+ 24.366,12.317 10.682,36.854 38.613,36.854 "/>
+ <polygon fill="#FFFFFF" stroke="#00B70F" stroke-width="6.6112" stroke-linecap="round" stroke-linejoin="round" points="
+ 24.367,12.343 10.71,36.829 38.586,36.829 "/>
+ <polygon fill="#FFFFFF" stroke="#00B80F" stroke-width="6.6112" stroke-linecap="round" stroke-linejoin="round" points="
+ 24.367,12.37 10.739,36.804 38.559,36.804 "/>
+ <polygon fill="#FFFFFF" stroke="#00B910" stroke-width="6.6112" stroke-linecap="round" stroke-linejoin="round" points="
+ 24.368,12.395 10.769,36.778 38.527,36.778 "/>
+ <polygon fill="#FFFFFF" stroke="#00BA10" stroke-width="6.6112" stroke-linecap="round" stroke-linejoin="round" points="
+ 24.368,12.419 10.796,36.755 38.5,36.755 "/>
+ <polygon fill="#FFFFFF" stroke="#00BB11" stroke-width="6.6112" stroke-linecap="round" stroke-linejoin="round" points="
+ 24.369,12.444 10.826,36.728 38.471,36.728 "/>
+ <polygon fill="#FFFFFF" stroke="#00BC11" stroke-width="6.6112" stroke-linecap="round" stroke-linejoin="round" points="
+ 24.37,12.469 10.854,36.704 38.441,36.704 "/>
+ <polygon fill="#FFFFFF" stroke="#00BD12" stroke-width="6.6112" stroke-linecap="round" stroke-linejoin="round" points="
+ 24.37,12.496 10.883,36.677 38.414,36.677 "/>
+ <polygon fill="#FFFFFF" stroke="#00BE12" stroke-width="6.6112" stroke-linecap="round" stroke-linejoin="round" points="
+ 24.371,12.521 10.912,36.651 38.385,36.651 "/>
+ <polygon fill="#FFFFFF" stroke="#00BF13" stroke-width="6.6112" stroke-linecap="round" stroke-linejoin="round" points="
+ 24.371,12.545 10.94,36.628 38.355,36.628 "/>
+ <polygon fill="#FFFFFF" stroke="#00C013" stroke-width="6.6112" stroke-linecap="round" stroke-linejoin="round" points="
+ 24.372,12.57 10.969,36.603 38.328,36.603 "/>
+ <polygon fill="#FFFFFF" stroke="#00C114" stroke-width="6.6112" stroke-linecap="round" stroke-linejoin="round" points="
+ 24.372,12.595 10.999,36.577 38.299,36.577 "/>
+ <polygon fill="#FFFFFF" stroke="#00C214" stroke-width="6.6112" stroke-linecap="round" stroke-linejoin="round" points="
+ 24.373,12.622 11.026,36.552 38.27,36.552 "/>
+ <polygon fill="#FFFFFF" stroke="#00C315" stroke-width="6.6112" stroke-linecap="round" stroke-linejoin="round" points="
+ 24.373,12.646 11.056,36.526 38.242,36.526 "/>
+ <polygon fill="#FFFFFF" stroke="#00C415" stroke-width="6.6112" stroke-linecap="round" stroke-linejoin="round" points="
+ 24.374,12.672 11.084,36.503 38.213,36.503 "/>
+ <polygon fill="#FFFFFF" stroke="#00C516" stroke-width="6.6112" stroke-linecap="round" stroke-linejoin="round" points="
+ 24.375,12.696 11.113,36.476 38.184,36.476 "/>
+ <polygon fill="#FFFFFF" stroke="#00C616" stroke-width="6.6112" stroke-linecap="round" stroke-linejoin="round" points="
+ 24.375,12.721 11.142,36.45 38.154,36.45 "/>
+ <polygon fill="#FFFFFF" stroke="#00C717" stroke-width="6.6112" stroke-linecap="round" stroke-linejoin="round" points="
+ 24.375,12.748 11.17,36.425 38.127,36.425 "/>
+ <polygon fill="#FFFFFF" stroke="#00C817" stroke-width="6.6112" stroke-linecap="round" stroke-linejoin="round" points="
+ 24.375,12.773 11.2,36.401 38.098,36.401 "/>
+ <polygon fill="#FFFFFF" stroke="#00C918" stroke-width="6.6112" stroke-linecap="round" stroke-linejoin="round" points="
+ 24.376,12.797 11.229,36.376 38.068,36.376 "/>
+ <polygon fill="#FFFFFF" stroke="#00CA18" stroke-width="6.6112" stroke-linecap="round" stroke-linejoin="round" points="
+ 24.376,12.822 11.256,36.349 38.041,36.349 "/>
+ <polygon fill="#FFFFFF" stroke="#00CB19" stroke-width="6.6112" stroke-linecap="round" stroke-linejoin="round" points="
+ 24.377,12.849 11.286,36.325 38.012,36.325 "/>
+ <polygon fill="#FFFFFF" stroke="#00CC19" stroke-width="6.6112" stroke-linecap="round" stroke-linejoin="round" points="
+ 24.378,12.875 11.314,36.3 37.982,36.3 "/>
+ <polygon fill="#FFFFFF" stroke="#00CC1A" stroke-width="6.6112" stroke-linecap="round" stroke-linejoin="round" points="
+ 24.378,12.899 11.342,36.274 37.955,36.274 "/>
+ <polygon fill="#FFFFFF" stroke="#00CD1A" stroke-width="6.6112" stroke-linecap="round" stroke-linejoin="round" points="
+ 24.379,12.923 11.372,36.249 37.926,36.249 "/>
+ <polygon fill="#FFFFFF" stroke="#00CE1B" stroke-width="6.6112" stroke-linecap="round" stroke-linejoin="round" points="
+ 24.379,12.949 11.4,36.224 37.896,36.224 "/>
+ <polygon fill="#FFFFFF" stroke="#00CF1B" stroke-width="6.6112" stroke-linecap="round" stroke-linejoin="round" points="
+ 24.38,12.975 11.43,36.198 37.867,36.198 "/>
+ <polygon fill="#FFFFFF" stroke="#00D01C" stroke-width="6.6112" stroke-linecap="round" stroke-linejoin="round" points="
+ 24.381,13 11.458,36.173 37.84,36.173 "/>
+ <polygon fill="#FFFFFF" stroke="#00D11C" stroke-width="6.6112" stroke-linecap="round" stroke-linejoin="round" points="
+ 24.381,13.024 11.486,36.147 37.811,36.147 "/>
+ <polygon fill="#FFFFFF" stroke="#00D21D" stroke-width="6.6112" stroke-linecap="round" stroke-linejoin="round" points="
+ 24.381,13.05 11.516,36.124 37.781,36.124 "/>
+ <polygon fill="#FFFFFF" stroke="#00D31D" stroke-width="6.6112" stroke-linecap="round" stroke-linejoin="round" points="
+ 24.382,13.075 11.543,36.097 37.754,36.097 "/>
+ <polygon fill="#FFFFFF" stroke="#00D41E" stroke-width="6.6112" stroke-linecap="round" stroke-linejoin="round" points="
+ 24.383,13.102 11.572,36.071 37.725,36.071 "/>
+ <polygon fill="#FFFFFF" stroke="#00D51E" stroke-width="6.6112" stroke-linecap="round" stroke-linejoin="round" points="
+ 24.383,13.126 11.602,36.046 37.695,36.046 "/>
+ <polygon fill="#FFFFFF" stroke="#00D61F" stroke-width="6.6112" stroke-linecap="round" stroke-linejoin="round" points="
+ 24.384,13.151 11.63,36.022 37.666,36.022 "/>
+ <polygon fill="#FFFFFF" stroke="#00D71F" stroke-width="6.6112" stroke-linecap="round" stroke-linejoin="round" points="
+ 24.385,13.176 11.66,35.997 37.639,35.997 "/>
+ <polygon fill="#FFFFFF" stroke="#00D820" stroke-width="6.6112" stroke-linecap="round" stroke-linejoin="round" points="
+ 24.385,13.201 11.688,35.972 37.609,35.972 "/>
+ <polygon fill="#FFFFFF" stroke="#00D920" stroke-width="6.6112" stroke-linecap="round" stroke-linejoin="round" points="
+ 24.387,13.228 11.716,35.946 37.58,35.946 "/>
+ <polygon fill="#FFFFFF" stroke="#00DA21" stroke-width="6.6112" stroke-linecap="round" stroke-linejoin="round" points="
+ 24.387,13.252 11.746,35.921 37.553,35.921 "/>
+ <polygon fill="#FFFFFF" stroke="#00DB21" stroke-width="6.6112" stroke-linecap="round" stroke-linejoin="round" points="
+ 24.388,13.277 11.773,35.896 37.521,35.896 "/>
+ <polygon fill="#FFFFFF" stroke="#00DC22" stroke-width="6.6112" stroke-linecap="round" stroke-linejoin="round" points="
+ 24.389,13.302 11.802,35.872 37.494,35.872 "/>
+ <polygon fill="#FFFFFF" stroke="#00DD22" stroke-width="6.6112" stroke-linecap="round" stroke-linejoin="round" points="
+ 24.389,13.327 11.832,35.845 37.465,35.845 "/>
+ <polygon fill="#FFFFFF" stroke="#00DE23" stroke-width="6.6112" stroke-linecap="round" stroke-linejoin="round" points="
+ 24.39,13.354 11.86,35.819 37.438,35.819 "/>
+ <polygon fill="#FFFFFF" stroke="#00DF23" stroke-width="6.6112" stroke-linecap="round" stroke-linejoin="round" points="
+ 24.39,13.378 11.89,35.796 37.408,35.796 "/>
+ <polygon fill="#FFFFFF" stroke="#00E024" stroke-width="6.6112" stroke-linecap="round" stroke-linejoin="round" points="
+ 24.391,13.403 11.917,35.769 37.379,35.769 "/>
+ <polygon fill="#FFFFFF" stroke="#00E124" stroke-width="6.6112" stroke-linecap="round" stroke-linejoin="round" points="
+ 24.391,13.429 11.946,35.743 37.352,35.743 "/>
+ <polygon fill="#FFFFFF" stroke="#00E225" stroke-width="6.6112" stroke-linecap="round" stroke-linejoin="round" points="
+ 24.392,13.455 11.976,35.718 37.32,35.718 "/>
+ <polygon fill="#FFFFFF" stroke="#00E325" stroke-width="6.6112" stroke-linecap="round" stroke-linejoin="round" points="
+ 24.393,13.479 12.003,35.694 37.293,35.694 "/>
+ <polygon fill="#FFFFFF" stroke="#00E426" stroke-width="6.6112" stroke-linecap="round" stroke-linejoin="round" points="
+ 24.393,13.504 12.033,35.669 37.264,35.669 "/>
+ <polygon fill="#FFFFFF" stroke="#00E526" stroke-width="6.6112" stroke-linecap="round" stroke-linejoin="round" points="
+ 24.394,13.529 12.062,35.644 37.234,35.644 "/>
+ <polygon fill="#FFFFFF" stroke="#00E627" stroke-width="6.6112" stroke-linecap="round" stroke-linejoin="round" points="
+ 24.394,13.556 12.09,35.618 37.207,35.618 "/>
+ <polygon fill="#FFFFFF" stroke="#00E727" stroke-width="6.6112" stroke-linecap="round" stroke-linejoin="round" points="
+ 24.395,13.581 12.12,35.593 37.178,35.593 "/>
+ <polygon fill="#FFFFFF" stroke="#00E828" stroke-width="6.6112" stroke-linecap="round" stroke-linejoin="round" points="
+ 24.396,13.605 12.147,35.567 37.148,35.567 "/>
+ <polygon fill="#FFFFFF" stroke="#00E928" stroke-width="6.6112" stroke-linecap="round" stroke-linejoin="round" points="
+ 24.396,13.63 12.176,35.544 37.121,35.544 "/>
+ <polygon fill="#FFFFFF" stroke="#00EA29" stroke-width="6.6112" stroke-linecap="round" stroke-linejoin="round" points="
+ 24.396,13.655 12.206,35.517 37.092,35.517 "/>
+ <polygon fill="#FFFFFF" stroke="#00EB29" stroke-width="6.6112" stroke-linecap="round" stroke-linejoin="round" points="
+ 24.396,13.682 12.233,35.491 37.062,35.491 "/>
+ <polygon fill="#FFFFFF" stroke="#00EC2A" stroke-width="6.6112" stroke-linecap="round" stroke-linejoin="round" points="
+ 24.397,13.707 12.263,35.466 37.035,35.466 "/>
+ <polygon fill="#FFFFFF" stroke="#00ED2A" stroke-width="6.6112" stroke-linecap="round" stroke-linejoin="round" points="
+ 24.397,13.732 12.292,35.44 37.006,35.44 "/>
+ <polygon fill="#FFFFFF" stroke="#00EE2B" stroke-width="6.6112" stroke-linecap="round" stroke-linejoin="round" points="
+ 24.398,13.756 12.319,35.417 36.977,35.417 "/>
+ <polygon fill="#FFFFFF" stroke="#00EF2B" stroke-width="6.6112" stroke-linecap="round" stroke-linejoin="round" points="
+ 24.398,13.782 12.349,35.392 36.949,35.392 "/>
+ <polygon fill="#FFFFFF" stroke="#00F02C" stroke-width="6.6112" stroke-linecap="round" stroke-linejoin="round" points="
+ 24.399,13.808 12.377,35.366 36.92,35.366 "/>
+ <polygon fill="#FFFFFF" stroke="#00F12C" stroke-width="6.6112" stroke-linecap="round" stroke-linejoin="round" points="
+ 24.399,13.833 12.407,35.341 36.891,35.341 "/>
+ <polygon fill="#FFFFFF" stroke="#00F22D" stroke-width="6.6112" stroke-linecap="round" stroke-linejoin="round" points="
+ 24.4,13.858 12.436,35.315 36.861,35.315 "/>
+ <polygon fill="#FFFFFF" stroke="#00F32D" stroke-width="6.6112" stroke-linecap="round" stroke-linejoin="round" points="
+ 24.401,13.883 12.463,35.29 36.834,35.29 "/>
+ <polygon fill="#FFFFFF" stroke="#00F42E" stroke-width="6.6112" stroke-linecap="round" stroke-linejoin="round" points="
+ 24.401,13.908 12.493,35.265 36.805,35.265 "/>
+ <polygon fill="#FFFFFF" stroke="#00F52E" stroke-width="6.6112" stroke-linecap="round" stroke-linejoin="round" points="
+ 24.402,13.934 12.521,35.239 36.775,35.239 "/>
+ <polygon fill="#FFFFFF" stroke="#00F62F" stroke-width="6.6112" stroke-linecap="round" stroke-linejoin="round" points="
+ 24.402,13.959 12.549,35.214 36.748,35.214 "/>
+ <polygon fill="#FFFFFF" stroke="#00F72F" stroke-width="6.6112" stroke-linecap="round" stroke-linejoin="round" points="
+ 24.403,13.983 12.579,35.188 36.719,35.188 "/>
+ <polygon fill="#FFFFFF" stroke="#00F830" stroke-width="6.6112" stroke-linecap="round" stroke-linejoin="round" points="
+ 24.404,14.009 12.607,35.165 36.689,35.165 "/>
+ <polygon fill="#FFFFFF" stroke="#00F930" stroke-width="6.6112" stroke-linecap="round" stroke-linejoin="round" points="
+ 24.404,14.034 12.637,35.138 36.662,35.138 "/>
+ <polygon fill="#FFFFFF" stroke="#00FA31" stroke-width="6.6112" stroke-linecap="round" stroke-linejoin="round" points="
+ 24.405,14.061 12.666,35.112 36.633,35.112 "/>
+ <polygon fill="#FFFFFF" stroke="#00FB31" stroke-width="6.6112" stroke-linecap="round" stroke-linejoin="round" points="
+ 24.405,14.085 12.693,35.089 36.604,35.089 "/>
+ <polygon fill="#FFFFFF" stroke="#00FC32" stroke-width="6.6112" stroke-linecap="round" stroke-linejoin="round" points="
+ 24.407,14.11 12.723,35.063 36.574,35.063 "/>
+ <polygon fill="#FFFFFF" stroke="#00FD32" stroke-width="6.6112" stroke-linecap="round" stroke-linejoin="round" points="
+ 24.408,14.135 12.75,35.038 36.547,35.038 "/>
+ <polygon fill="#FFFFFF" stroke="#00FE33" stroke-width="6.6112" stroke-linecap="round" stroke-linejoin="round" points="
+ 24.408,14.16 12.779,35.013 36.518,35.013 "/>
+ <path fill="#FFFFFF" stroke="#00FF33" stroke-width="6.6112" stroke-linecap="round" stroke-linejoin="round" d="M24.409,14.187
+ l-11.6,20.801h23.68L24.409,14.187z"/>
+ </g>
+
+ <linearGradient id="XMLID_4_" gradientUnits="userSpaceOnUse" x1="582.6475" y1="-987.77" x2="582.6475" y2="-1015.4038" gradientTransform="matrix(1 0 0 -1 -558 -977)">
+ <stop offset="0" style="stop-color:#FFFFFF"/>
+ <stop offset="1" style="stop-color:#00FF33"/>
+ </linearGradient>
+ <path fill="url(#XMLID_4_)" d="M39.693,34.153L26.857,12.138c-0.51-0.85-1.443-1.445-2.463-1.36c-1.021,0-1.955,0.595-2.465,1.445
+ L9.604,34.239c-0.511,0.85-0.511,1.953,0,2.805c0.51,0.852,1.444,1.359,2.465,1.359h25.16c1.021,0,1.955-0.51,2.465-1.445
+ C40.203,36.106,40.203,35.003,39.693,34.153L39.693,34.153z"/>
+ <g>
+ <path d="M24.648,33.487c-1.1,0-1.8-0.801-1.8-1.801c0-1.102,0.7-1.801,1.8-1.801c1.1,0,1.801,0.699,1.801,1.801
+ C26.449,32.687,25.748,33.487,24.648,33.487L24.648,33.487z M23.449,28.786l-0.4-9.1h3.2l-0.4,9.1H23.55H23.449z"/>
+ </g>
+</g>
+<g id="crop_x0020_marks">
+ <path fill="none" d="M48.648,48.586h-48v-48h48V48.586z"/>
+</g>
+</svg>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/colorsvg/next.svg b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/colorsvg/next.svg
new file mode 100644
index 0000000..52b73cf
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/colorsvg/next.svg
@@ -0,0 +1,338 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 12.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 51448) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [
+ <!ENTITY ns_svg "http://www.w3.org/2000/svg">
+ <!ENTITY ns_xlink "http://www.w3.org/1999/xlink">
+]>
+<svg version="1.1" id="Layer_1" xmlns="&ns_svg;" xmlns:xlink="&ns_xlink;" width="48" height="48" viewBox="0 0 48 48"
+ overflow="visible" enable-background="new 0 0 48 48" xml:space="preserve">
+<g>
+ <path fill="#FFFFFF" stroke="#FFFFFF" stroke-width="7.5901" stroke-linejoin="round" d="M22.34,41.101c0,0.301,0.3,0.301,0.5,0.2
+ l16.6-16.899c0.5-0.5,0.4-0.7,0-1l-16.6-16.7c-0.1-0.1-0.4-0.1-0.4,0.1v10H8.84c-0.3,0-0.5,0.2-0.5,0.4v13.299
+ c0,0.4,0.2,0.5,0.6,0.5h13.5L22.34,41.101z"/>
+ <g>
+ <path fill="#0033CC" d="M22.34,41.101c0,0.301,0.3,0.301,0.5,0.2l16.6-16.899c0.5-0.5,0.4-0.7,0-1l-16.6-16.7
+ c-0.1-0.1-0.4-0.1-0.4,0.1v10H8.84c-0.3,0-0.5,0.2-0.5,0.4v13.299c0,0.4,0.2,0.5,0.6,0.5h13.5L22.34,41.101z"/>
+ <path fill="#0134CC" d="M22.351,41.074c0,0.3,0.3,0.3,0.5,0.2L39.427,24.4c0.5-0.499,0.4-0.699,0-0.999L22.85,6.729
+ c-0.1-0.1-0.399-0.1-0.399,0.099v9.984H8.87c-0.299,0-0.5,0.2-0.5,0.4v13.279c0,0.398,0.2,0.499,0.6,0.499H22.45L22.351,41.074z"
+ />
+ <path fill="#0235CD" d="M22.359,41.047c0,0.3,0.299,0.3,0.499,0.2l16.553-16.848c0.5-0.498,0.399-0.697,0-0.997L22.858,6.755
+ c-0.1-0.1-0.399-0.1-0.399,0.1v9.969H8.897c-0.299,0-0.499,0.199-0.499,0.399v13.258c0,0.398,0.2,0.498,0.598,0.498h13.462
+ L22.359,41.047z"/>
+ <path fill="#0336CD" d="M22.369,41.021c0,0.301,0.299,0.301,0.498,0.199l16.53-16.82c0.498-0.498,0.397-0.696,0-0.995
+ L22.866,6.783c-0.1-0.1-0.398-0.1-0.398,0.099v9.953H8.926c-0.299,0-0.498,0.199-0.498,0.398v13.239
+ c0,0.397,0.199,0.496,0.598,0.496h13.442L22.369,41.021z"/>
+ <path fill="#0437CE" d="M22.378,40.994c0,0.299,0.298,0.299,0.497,0.198l16.506-16.794c0.496-0.497,0.397-0.695,0-0.994
+ L22.876,6.81c-0.1-0.1-0.398-0.1-0.398,0.099v9.937H8.956c-0.298,0-0.498,0.199-0.498,0.398v13.217c0,0.397,0.2,0.496,0.597,0.496
+ h13.423L22.378,40.994z"/>
+ <path fill="#0538CE" d="M22.389,40.968c0,0.299,0.298,0.299,0.496,0.198l16.483-16.769c0.496-0.496,0.397-0.694,0-0.992
+ L22.884,6.836c-0.099-0.099-0.397-0.099-0.397,0.099v9.922H8.983c-0.297,0-0.496,0.199-0.496,0.397V30.45
+ c0,0.396,0.199,0.496,0.596,0.496h13.404L22.389,40.968z"/>
+ <path fill="#0639CF" d="M22.398,40.94c0,0.299,0.298,0.299,0.496,0.199l16.46-16.742c0.495-0.496,0.396-0.694,0-0.991
+ L22.894,6.863c-0.099-0.099-0.396-0.099-0.396,0.099v9.906H9.012c-0.297,0-0.496,0.198-0.496,0.396V30.44
+ c0,0.396,0.199,0.494,0.595,0.494h13.386L22.398,40.94z"/>
+ <path fill="#073ACF" d="M22.407,40.914c0,0.298,0.298,0.298,0.495,0.198l16.437-16.716c0.494-0.495,0.396-0.692,0-0.989
+ L22.902,6.891c-0.099-0.099-0.396-0.099-0.396,0.099v9.891H9.041c-0.296,0-0.495,0.198-0.495,0.396v13.154
+ c0,0.396,0.198,0.493,0.594,0.493h13.367L22.407,40.914z"/>
+ <path fill="#083BD0" d="M22.417,40.888c0,0.297,0.297,0.297,0.495,0.198l16.413-16.689c0.494-0.494,0.396-0.691,0-0.987
+ L22.912,6.917c-0.099-0.099-0.396-0.099-0.396,0.099v9.875H9.069c-0.296,0-0.494,0.198-0.494,0.396v13.133
+ c0,0.395,0.198,0.493,0.594,0.493h13.347L22.417,40.888z"/>
+ <path fill="#093CD0" d="M22.426,40.86c0,0.297,0.296,0.297,0.493,0.197l16.39-16.662c0.492-0.494,0.395-0.69,0-0.986L22.919,6.943
+ c-0.099-0.099-0.395-0.099-0.395,0.098v9.86H9.099c-0.296,0-0.494,0.197-0.494,0.395V30.41c0,0.396,0.198,0.493,0.593,0.493
+ h13.328L22.426,40.86z"/>
+ <path fill="#0A3DD1" d="M22.437,40.834c0,0.297,0.296,0.297,0.493,0.196l16.367-16.636c0.492-0.493,0.395-0.689,0-0.984
+ L22.928,6.97c-0.099-0.099-0.394-0.099-0.394,0.098v9.844H9.127c-0.296,0-0.493,0.197-0.493,0.394v13.093
+ c0,0.395,0.197,0.492,0.592,0.492h13.309L22.437,40.834z"/>
+ <path fill="#0B3ED1" d="M22.445,40.808c0,0.297,0.296,0.297,0.492,0.197l16.343-16.61c0.492-0.492,0.395-0.688,0-0.982
+ L22.938,6.999C22.84,6.9,22.544,6.9,22.544,7.097v9.829H9.155c-0.295,0-0.493,0.196-0.493,0.394v13.072
+ c0,0.394,0.198,0.49,0.591,0.49h13.29L22.445,40.808z"/>
+ <path fill="#0C3FD2" d="M22.456,40.78c0,0.296,0.295,0.296,0.492,0.197l16.319-16.584c0.49-0.491,0.395-0.687,0-0.982
+ L22.946,7.024c-0.098-0.098-0.393-0.098-0.393,0.098v9.813H9.185c-0.294,0-0.492,0.196-0.492,0.393v13.05
+ c0,0.394,0.197,0.491,0.59,0.491h13.271L22.456,40.78z"/>
+ <path fill="#0D40D2" d="M22.464,40.754c0,0.295,0.294,0.295,0.491,0.196l16.295-16.558c0.489-0.49,0.393-0.686,0-0.98
+ L22.956,7.051c-0.099-0.098-0.393-0.098-0.393,0.097v9.797H9.212c-0.294,0-0.49,0.197-0.49,0.393v13.031
+ c0,0.393,0.196,0.489,0.588,0.489h13.252L22.464,40.754z"/>
+ <path fill="#0E41D3" d="M22.475,40.728c0,0.295,0.294,0.295,0.49,0.196l16.272-16.531c0.49-0.489,0.394-0.684,0-0.978L22.964,7.08
+ c-0.098-0.098-0.392-0.098-0.392,0.097v9.782H9.241c-0.294,0-0.49,0.196-0.49,0.392v13.01c0,0.392,0.196,0.488,0.588,0.488h13.233
+ L22.475,40.728z"/>
+ <path fill="#0F42D3" d="M22.483,40.701c0,0.294,0.294,0.294,0.49,0.194l16.248-16.504c0.488-0.488,0.393-0.683,0-0.977
+ L22.974,7.105c-0.098-0.098-0.391-0.098-0.391,0.097v9.767H9.271c-0.293,0-0.489,0.195-0.489,0.391v12.988
+ c0,0.392,0.196,0.487,0.587,0.487h13.214L22.483,40.701z"/>
+ <path fill="#1043D4" d="M22.494,40.675c0,0.293,0.294,0.293,0.489,0.194l16.226-16.478c0.487-0.488,0.392-0.683,0-0.975
+ L22.982,7.132c-0.098-0.098-0.391-0.098-0.391,0.097v9.751H9.298c-0.293,0-0.489,0.195-0.489,0.39v12.967
+ c0,0.392,0.196,0.487,0.586,0.487H22.59L22.494,40.675z"/>
+ <path fill="#1144D4" d="M22.502,40.647c0,0.293,0.293,0.293,0.488,0.194L39.191,24.39c0.487-0.487,0.392-0.682,0-0.974
+ L22.991,7.16c-0.098-0.098-0.391-0.098-0.391,0.097v9.735H9.328c-0.293,0-0.488,0.195-0.488,0.39v12.948
+ c0,0.39,0.195,0.486,0.585,0.486h13.176L22.502,40.647z"/>
+ <path fill="#1245D5" d="M22.514,40.621c0,0.292,0.292,0.292,0.487,0.194L39.177,24.39c0.488-0.486,0.392-0.68,0-0.972L23,7.188
+ c-0.098-0.098-0.39-0.098-0.39,0.096v9.72H9.356c-0.292,0-0.487,0.195-0.487,0.39v12.926c0,0.39,0.195,0.486,0.585,0.486H22.61
+ L22.514,40.621z"/>
+ <path fill="#1346D5" d="M22.522,40.595c0,0.292,0.292,0.292,0.487,0.194L39.165,24.39c0.485-0.485,0.389-0.679,0-0.97
+ L23.009,7.213c-0.098-0.097-0.389-0.097-0.389,0.097v9.704H9.384c-0.292,0-0.486,0.194-0.486,0.389V30.31
+ c0,0.389,0.195,0.484,0.584,0.484h13.138L22.522,40.595z"/>
+ <path fill="#1447D6" d="M22.531,40.567c0,0.291,0.292,0.291,0.486,0.193l16.132-16.372c0.484-0.484,0.389-0.678,0-0.969
+ L23.018,7.241c-0.097-0.097-0.389-0.097-0.389,0.097v9.688H9.414c-0.292,0-0.486,0.194-0.486,0.388v12.885
+ c0,0.388,0.195,0.483,0.583,0.483h13.118L22.531,40.567z"/>
+ <path fill="#1548D6" d="M22.542,40.541c0,0.291,0.292,0.291,0.485,0.192l16.107-16.346c0.484-0.484,0.389-0.677,0-0.968
+ L23.026,7.268c-0.097-0.097-0.388-0.097-0.388,0.097v9.672H9.441c-0.291,0-0.485,0.194-0.485,0.388v12.865
+ c0,0.388,0.194,0.483,0.582,0.483h13.099L22.542,40.541z"/>
+ <path fill="#1649D7" d="M22.551,40.515c0,0.291,0.291,0.291,0.484,0.193l16.083-16.321c0.485-0.483,0.389-0.676,0-0.966
+ L23.036,7.294c-0.097-0.097-0.388-0.097-0.388,0.096v9.657H9.47c-0.291,0-0.484,0.193-0.484,0.387v12.844
+ c0,0.387,0.194,0.481,0.582,0.481h13.08L22.551,40.515z"/>
+ <path fill="#174AD7" d="M22.561,40.487c0,0.291,0.291,0.291,0.484,0.193l16.061-16.294c0.483-0.482,0.388-0.674,0-0.964
+ L23.044,7.321c-0.097-0.096-0.387-0.096-0.387,0.097v9.641H9.5c-0.29,0-0.483,0.193-0.483,0.386v12.823
+ c0,0.387,0.193,0.481,0.58,0.481h13.062L22.561,40.487z"/>
+ <path fill="#184BD8" d="M22.57,40.462c0,0.289,0.29,0.289,0.483,0.191l16.038-16.267c0.481-0.481,0.387-0.673,0-0.962
+ L23.053,7.349c-0.097-0.096-0.387-0.096-0.387,0.096v9.626H9.527c-0.29,0-0.483,0.193-0.483,0.385v12.802
+ c0,0.386,0.193,0.481,0.58,0.481h13.042L22.57,40.462z"/>
+ <path fill="#194CD8" d="M22.58,40.435c0,0.289,0.29,0.289,0.482,0.192l16.014-16.242c0.481-0.481,0.387-0.672,0-0.961
+ L23.062,7.375c-0.097-0.096-0.386-0.096-0.386,0.096v9.611H9.557c-0.289,0-0.482,0.192-0.482,0.385v12.782
+ c0,0.384,0.193,0.479,0.579,0.479h13.023L22.58,40.435z"/>
+ <path fill="#1A4DD9" d="M22.589,40.408c0,0.288,0.289,0.288,0.482,0.192l15.99-16.216c0.48-0.48,0.386-0.672,0-0.959L23.071,7.402
+ c-0.097-0.096-0.385-0.096-0.385,0.095v9.595H9.585c-0.289,0-0.482,0.192-0.482,0.384v12.761c0,0.385,0.193,0.479,0.578,0.479
+ h13.004L22.589,40.408z"/>
+ <path fill="#1B4ED9" d="M22.6,40.382c0,0.288,0.289,0.288,0.481,0.192l15.967-16.19c0.48-0.479,0.385-0.67,0-0.958L23.081,7.43
+ c-0.096-0.096-0.384-0.096-0.384,0.095v9.58H9.614c-0.288,0-0.481,0.192-0.481,0.384v12.741c0,0.383,0.193,0.478,0.577,0.478
+ h12.985L22.6,40.382z"/>
+ <path fill="#1C4FDA" d="M22.608,40.354c0,0.289,0.289,0.289,0.48,0.192l15.943-16.164c0.479-0.478,0.386-0.669,0-0.957
+ L23.088,7.457c-0.096-0.096-0.384-0.096-0.384,0.095v9.564H9.643c-0.288,0-0.48,0.191-0.48,0.383v12.719
+ c0,0.383,0.192,0.479,0.577,0.479h12.966L22.608,40.354z"/>
+ <path fill="#1D50DA" d="M22.619,40.328c0,0.287,0.288,0.287,0.479,0.19l15.92-16.136c0.479-0.478,0.384-0.668,0-0.955
+ L23.098,7.482c-0.096-0.096-0.384-0.096-0.384,0.095v9.548H9.67c-0.288,0-0.479,0.191-0.479,0.382v12.699
+ c0,0.382,0.191,0.479,0.575,0.479h12.947L22.619,40.328z"/>
+ <path fill="#1E51DB" d="M22.628,40.302c0,0.287,0.288,0.287,0.479,0.191l15.896-16.111c0.479-0.477,0.385-0.667,0-0.954
+ L23.106,7.51c-0.096-0.096-0.383-0.096-0.383,0.094v9.533H9.699c-0.287,0-0.479,0.191-0.479,0.382v12.679
+ c0,0.382,0.191,0.477,0.575,0.477h12.928L22.628,40.302z"/>
+ <path fill="#1F52DB" d="M22.637,40.274c0,0.287,0.288,0.287,0.479,0.19L38.99,24.381c0.478-0.476,0.382-0.666,0-0.952
+ L23.115,7.538c-0.095-0.096-0.382-0.096-0.382,0.094v9.517H9.729c-0.287,0-0.478,0.191-0.478,0.381v12.657
+ c0,0.381,0.191,0.477,0.574,0.477h12.909L22.637,40.274z"/>
+ <path fill="#2053DC" d="M22.647,40.249c0,0.285,0.287,0.285,0.478,0.189l15.85-16.058c0.477-0.475,0.382-0.665,0-0.95
+ L23.125,7.563c-0.096-0.095-0.382-0.095-0.382,0.095v9.501H9.757c-0.286,0-0.478,0.19-0.478,0.381v12.636
+ c0,0.381,0.191,0.475,0.573,0.475h12.89L22.647,40.249z"/>
+ <path fill="#2154DC" d="M22.656,40.222c0,0.285,0.287,0.285,0.477,0.19L38.96,24.38c0.477-0.475,0.381-0.664,0-0.949L23.133,7.59
+ c-0.096-0.095-0.382-0.095-0.382,0.095v9.486H9.786c-0.286,0-0.477,0.19-0.477,0.38v12.617c0,0.379,0.191,0.474,0.572,0.474
+ h12.871L22.656,40.222z"/>
+ <path fill="#2255DD" d="M22.667,40.194c0,0.285,0.286,0.285,0.477,0.189l15.802-16.004c0.476-0.474,0.382-0.663,0-0.947
+ L23.143,7.618c-0.096-0.095-0.381-0.095-0.381,0.094v9.471H9.814c-0.285,0-0.476,0.189-0.476,0.379v12.596
+ c0,0.379,0.191,0.473,0.572,0.473h12.851L22.667,40.194z"/>
+ <path fill="#2356DD" d="M22.675,40.169c0,0.284,0.286,0.284,0.476,0.189l15.779-15.979c0.475-0.473,0.381-0.662,0-0.945
+ L23.151,7.645c-0.095-0.094-0.38-0.094-0.38,0.094v9.455H9.843c-0.285,0-0.475,0.189-0.475,0.378v12.574
+ c0,0.379,0.19,0.474,0.571,0.474h12.832L22.675,40.169z"/>
+ <path fill="#2457DE" d="M22.686,40.144c0,0.282,0.285,0.282,0.475,0.188l15.756-15.953c0.474-0.472,0.379-0.66,0-0.944
+ L23.159,7.671c-0.095-0.094-0.379-0.094-0.379,0.094v9.439H9.873c-0.285,0-0.475,0.189-0.475,0.378v12.554
+ c0,0.378,0.19,0.472,0.569,0.472H22.78L22.686,40.144z"/>
+ <path fill="#2558DE" d="M22.694,40.115c0,0.282,0.285,0.282,0.474,0.188l15.733-15.925c0.473-0.471,0.379-0.66,0-0.942
+ L23.168,7.698c-0.095-0.094-0.379-0.094-0.379,0.094v9.424H9.9c-0.284,0-0.474,0.189-0.474,0.377v12.535
+ c0,0.376,0.189,0.471,0.568,0.471h12.794L22.694,40.115z"/>
+ <path fill="#2659DF" d="M22.705,40.089c0,0.283,0.284,0.283,0.473,0.188l15.708-15.899c0.474-0.471,0.38-0.659,0-0.941
+ L23.177,7.726c-0.095-0.094-0.379-0.094-0.379,0.094v9.408H9.929c-0.284,0-0.473,0.188-0.473,0.377v12.514
+ c0,0.376,0.189,0.469,0.568,0.469h12.775L22.705,40.089z"/>
+ <path fill="#275ADF" d="M22.714,40.063c0,0.281,0.284,0.281,0.473,0.188l15.685-15.874c0.473-0.47,0.379-0.658,0-0.939
+ L23.188,7.752c-0.095-0.094-0.378-0.094-0.378,0.094v9.392H9.958c-0.283,0-0.472,0.188-0.472,0.376v12.492
+ c0,0.375,0.189,0.47,0.567,0.47H22.81L22.714,40.063z"/>
+ <path fill="#285BE0" d="M22.724,40.036c0,0.281,0.283,0.281,0.472,0.188l15.662-15.847c0.472-0.469,0.378-0.656,0-0.938
+ L23.195,7.779c-0.095-0.094-0.377-0.094-0.377,0.094v9.376H9.986c-0.283,0-0.472,0.188-0.472,0.375v12.472
+ c0,0.375,0.189,0.467,0.566,0.467h12.737L22.724,40.036z"/>
+ <path fill="#295CE0" d="M22.732,40.009c0,0.281,0.283,0.281,0.471,0.188l15.639-15.82c0.471-0.468,0.377-0.655,0-0.936
+ L23.205,7.807c-0.094-0.094-0.377-0.094-0.377,0.093v9.361H10.016c-0.283,0-0.471,0.188-0.471,0.375v12.451
+ c0,0.374,0.188,0.468,0.565,0.468h12.718L22.732,40.009z"/>
+ <path fill="#2A5DE1" d="M22.742,39.981c0,0.28,0.283,0.28,0.47,0.188l15.615-15.793c0.471-0.468,0.377-0.654,0-0.935L23.212,7.833
+ c-0.094-0.094-0.376-0.094-0.376,0.093v9.345H10.044c-0.282,0-0.471,0.188-0.471,0.375v12.431c0,0.374,0.188,0.467,0.565,0.467
+ h12.699L22.742,39.981z"/>
+ <path fill="#2B5EE1" d="M22.752,39.956c0,0.279,0.282,0.279,0.469,0.188l15.592-15.768c0.469-0.467,0.376-0.653,0-0.933
+ L23.223,7.86c-0.094-0.093-0.375-0.093-0.375,0.093v9.331H10.072c-0.282,0-0.47,0.187-0.47,0.373v12.41
+ c0,0.373,0.188,0.466,0.563,0.466h12.68L22.752,39.956z"/>
+ <path fill="#2C5FE2" d="M22.761,39.929c0,0.28,0.282,0.28,0.469,0.188l15.567-15.742c0.47-0.466,0.377-0.652,0-0.932L23.231,7.887
+ c-0.094-0.093-0.375-0.093-0.375,0.092v9.315H10.102c-0.281,0-0.469,0.187-0.469,0.373v12.388c0,0.372,0.188,0.465,0.563,0.465
+ h12.661L22.761,39.929z"/>
+ <path fill="#2D60E2" d="M22.771,39.901c0,0.279,0.281,0.279,0.469,0.187l15.544-15.714c0.469-0.465,0.375-0.65,0-0.93
+ L23.239,7.914c-0.094-0.093-0.375-0.093-0.375,0.093v9.299H10.129c-0.28,0-0.468,0.186-0.468,0.373v12.367
+ c0,0.372,0.188,0.465,0.562,0.465h12.642L22.771,39.901z"/>
+ <path fill="#2E61E3" d="M22.781,39.876c0,0.277,0.281,0.277,0.468,0.186l15.521-15.688c0.468-0.464,0.375-0.649,0-0.928
+ L23.25,7.94c-0.094-0.093-0.375-0.093-0.375,0.092v9.284H10.158c-0.28,0-0.467,0.186-0.467,0.372v12.347
+ c0,0.372,0.188,0.464,0.561,0.464h12.623L22.781,39.876z"/>
+ <path fill="#2F62E3" d="M22.792,39.851c0,0.277,0.28,0.277,0.467,0.186l15.499-15.663c0.466-0.464,0.373-0.649,0-0.927
+ l-15.5-15.479c-0.093-0.092-0.374-0.092-0.374,0.092v9.268H10.188c-0.28,0-0.467,0.186-0.467,0.372v12.325
+ c0,0.371,0.187,0.463,0.56,0.463h12.604L22.792,39.851z"/>
+ <path fill="#3063E4" d="M22.799,39.821c0,0.279,0.281,0.279,0.467,0.187l15.475-15.636c0.465-0.463,0.373-0.648,0-0.925
+ L23.267,7.995c-0.093-0.092-0.373-0.092-0.373,0.092v9.252H10.215c-0.279,0-0.466,0.185-0.466,0.371v12.305
+ c0,0.369,0.187,0.461,0.56,0.461h12.584L22.799,39.821z"/>
+ <path fill="#3164E4" d="M22.81,39.796c0,0.277,0.28,0.277,0.466,0.186l15.451-15.61c0.465-0.462,0.372-0.646,0-0.924L23.275,8.021
+ c-0.094-0.092-0.373-0.092-0.373,0.092v9.237H10.245c-0.279,0-0.465,0.185-0.465,0.37v12.285c0,0.369,0.187,0.461,0.559,0.461
+ h12.565L22.81,39.796z"/>
+ <path fill="#3265E5" d="M22.819,39.771c0,0.276,0.279,0.276,0.465,0.185l15.428-15.583c0.465-0.461,0.373-0.646,0-0.922
+ L23.284,8.048c-0.093-0.092-0.372-0.092-0.372,0.092v9.221H10.273c-0.279,0-0.464,0.185-0.464,0.37v12.265
+ c0,0.369,0.186,0.46,0.558,0.46h12.546L22.819,39.771z"/>
+ <path fill="#3366E5" d="M22.83,39.743c0,0.275,0.278,0.275,0.464,0.185l15.404-15.557c0.464-0.46,0.371-0.645,0-0.921
+ L23.293,8.076c-0.093-0.092-0.372-0.092-0.372,0.092v9.206h-12.62c-0.278,0-0.464,0.184-0.464,0.369v12.243
+ c0,0.369,0.186,0.461,0.557,0.461h12.527L22.83,39.743z"/>
+ <path fill="#3366E6" d="M22.838,39.716c0,0.276,0.278,0.276,0.464,0.186l15.38-15.532c0.463-0.459,0.371-0.643,0-0.918
+ L23.302,8.103c-0.093-0.092-0.371-0.092-0.371,0.091v9.19H10.331c-0.278,0-0.463,0.185-0.463,0.368v12.222
+ c0,0.368,0.186,0.459,0.556,0.459h12.508L22.838,39.716z"/>
+ <path fill="#3467E6" d="M22.849,39.688c0,0.275,0.278,0.275,0.463,0.185l15.357-15.504c0.461-0.458,0.369-0.642,0-0.917
+ L23.312,8.129C23.217,8.038,22.94,8.038,22.94,8.22v9.174H10.358c-0.277,0-0.462,0.184-0.462,0.368v12.203
+ c0,0.366,0.185,0.458,0.555,0.458H22.94L22.849,39.688z"/>
+ <path fill="#3568E7" d="M22.857,39.663c0,0.275,0.277,0.275,0.462,0.184l15.333-15.478c0.461-0.458,0.37-0.641,0-0.916
+ L23.319,8.156c-0.093-0.092-0.37-0.092-0.37,0.091v9.159H10.387c-0.277,0-0.461,0.184-0.461,0.367v12.182
+ c0,0.366,0.185,0.457,0.554,0.457h12.47L22.857,39.663z"/>
+ <path fill="#3669E7" d="M22.867,39.637c0,0.274,0.277,0.274,0.461,0.183l15.31-15.452c0.461-0.458,0.368-0.64,0-0.915
+ l-15.31-15.27c-0.092-0.091-0.369-0.091-0.369,0.091v9.143H10.417c-0.277,0-0.461,0.184-0.461,0.366v12.16
+ c0,0.365,0.184,0.457,0.553,0.457h12.451L22.867,39.637z"/>
+ <path fill="#376AE8" d="M22.877,39.608c0,0.274,0.276,0.274,0.46,0.184l15.287-15.425c0.461-0.457,0.369-0.639,0-0.913
+ L23.337,8.21c-0.092-0.091-0.368-0.091-0.368,0.091v9.127H10.445c-0.276,0-0.46,0.183-0.46,0.366v12.14
+ c0,0.365,0.184,0.455,0.552,0.455h12.432L22.877,39.608z"/>
+ <path fill="#386BE8" d="M22.886,39.583c0,0.273,0.276,0.273,0.46,0.184l15.263-15.4c0.459-0.456,0.368-0.638,0-0.911L23.347,8.237
+ c-0.092-0.091-0.368-0.091-0.368,0.091v9.112H10.474c-0.275,0-0.459,0.183-0.459,0.365v12.119c0,0.363,0.184,0.454,0.552,0.454
+ h12.413L22.886,39.583z"/>
+ <path fill="#396CE9" d="M22.896,39.558c0,0.272,0.276,0.272,0.459,0.182l15.239-15.374c0.459-0.455,0.367-0.637,0-0.91
+ L23.355,8.265c-0.092-0.091-0.368-0.091-0.368,0.09v9.097H10.502c-0.275,0-0.459,0.183-0.459,0.364v12.099
+ c0,0.364,0.184,0.454,0.551,0.454h12.394L22.896,39.558z"/>
+ <path fill="#3A6DE9" d="M22.905,39.528c0,0.273,0.276,0.273,0.459,0.184l15.217-15.348c0.457-0.454,0.366-0.635,0-0.908
+ L23.364,8.292c-0.092-0.091-0.367-0.091-0.367,0.09v9.081H10.531c-0.275,0-0.458,0.182-0.458,0.364v12.079
+ c0,0.361,0.184,0.453,0.55,0.453h12.374L22.905,39.528z"/>
+ <path fill="#3B6EEA" d="M22.916,39.503c0,0.271,0.275,0.271,0.458,0.182l15.193-15.32c0.456-0.453,0.366-0.634,0-0.906
+ L23.374,8.318c-0.092-0.091-0.366-0.091-0.366,0.09v9.065H10.56c-0.274,0-0.458,0.182-0.458,0.363v12.057
+ c0,0.362,0.183,0.453,0.549,0.453h12.355L22.916,39.503z"/>
+ <path fill="#3C6FEA" d="M22.924,39.478c0,0.271,0.274,0.271,0.457,0.181l15.17-15.294c0.455-0.453,0.365-0.633,0-0.905
+ L23.381,8.344c-0.092-0.09-0.366-0.09-0.366,0.09v9.05H10.588c-0.274,0-0.457,0.181-0.457,0.363v12.036
+ c0,0.361,0.183,0.451,0.548,0.451h12.336L22.924,39.478z"/>
+ <path fill="#3D70EB" d="M22.935,39.45c0,0.271,0.274,0.271,0.456,0.181l15.146-15.269c0.455-0.452,0.365-0.632,0-0.904
+ L23.391,8.373c-0.091-0.09-0.365-0.09-0.365,0.09v9.034H10.617c-0.274,0-0.456,0.181-0.456,0.362v12.017
+ c0,0.36,0.182,0.45,0.547,0.45h12.317L22.935,39.45z"/>
+ <path fill="#3E71EB" d="M22.943,39.424c0,0.271,0.274,0.271,0.456,0.181l15.123-15.243c0.455-0.451,0.363-0.631,0-0.902
+ L23.399,8.398c-0.091-0.09-0.365-0.09-0.365,0.09v9.019h-12.39c-0.273,0-0.455,0.181-0.455,0.361v11.994
+ c0,0.361,0.182,0.451,0.546,0.451h12.298L22.943,39.424z"/>
+ <path fill="#3F72EC" d="M22.954,39.397c0,0.271,0.273,0.271,0.455,0.181l15.099-15.217c0.455-0.45,0.365-0.63,0-0.9L23.408,8.425
+ c-0.091-0.09-0.364-0.09-0.364,0.089v9.003h-12.37c-0.272,0-0.455,0.18-0.455,0.361v11.974c0,0.359,0.182,0.449,0.546,0.449
+ h12.279L22.954,39.397z"/>
+ <path fill="#4073EC" d="M22.962,39.37c0,0.27,0.273,0.27,0.455,0.18l15.076-15.188c0.453-0.45,0.363-0.629,0-0.898L23.417,8.453
+ c-0.091-0.09-0.363-0.09-0.363,0.089v8.988H10.704c-0.272,0-0.454,0.18-0.454,0.36v11.954c0,0.358,0.182,0.448,0.545,0.448h12.26
+ L22.962,39.37z"/>
+ <path fill="#4174ED" d="M22.973,39.344c0,0.271,0.272,0.271,0.454,0.181L38.479,24.36c0.452-0.449,0.362-0.628,0-0.897
+ L23.426,8.48c-0.091-0.09-0.363-0.09-0.363,0.089v8.972H10.731c-0.272,0-0.453,0.18-0.453,0.359v11.933
+ c0,0.357,0.181,0.447,0.544,0.447h12.241L22.973,39.344z"/>
+ <path fill="#4275ED" d="M22.982,39.315c0,0.271,0.272,0.271,0.453,0.181l15.028-15.137c0.453-0.448,0.363-0.626,0-0.896
+ L23.436,8.506c-0.091-0.09-0.362-0.09-0.362,0.089v8.957H10.76c-0.271,0-0.453,0.18-0.453,0.358v11.913
+ c0,0.357,0.181,0.445,0.543,0.445h12.222L22.982,39.315z"/>
+ <path fill="#4376EE" d="M22.991,39.29c0,0.27,0.272,0.27,0.453,0.179l15.005-15.109c0.451-0.447,0.362-0.625,0-0.894L23.444,8.534
+ c-0.091-0.089-0.362-0.089-0.362,0.089v8.94H10.79c-0.271,0-0.452,0.18-0.452,0.358v11.893c0,0.355,0.181,0.444,0.542,0.444
+ h12.203L22.991,39.29z"/>
+ <path fill="#4477EE" d="M23.001,39.265c0,0.268,0.271,0.268,0.452,0.178l14.981-15.083c0.449-0.446,0.361-0.625,0-0.893
+ L23.454,8.561c-0.091-0.089-0.361-0.089-0.361,0.089v8.925H10.817c-0.271,0-0.451,0.179-0.451,0.357v11.87
+ c0,0.356,0.181,0.445,0.542,0.445h12.184L23.001,39.265z"/>
+ <path fill="#4578EF" d="M23.01,39.237c0,0.268,0.271,0.268,0.451,0.178l14.959-15.058c0.449-0.445,0.359-0.624,0-0.891
+ L23.461,8.587c-0.09-0.089-0.361-0.089-0.361,0.089v8.91H10.847c-0.27,0-0.45,0.179-0.45,0.356v11.851
+ c0,0.354,0.18,0.444,0.541,0.444h12.165L23.01,39.237z"/>
+ <path fill="#4679EF" d="M23.021,39.21c0,0.268,0.271,0.268,0.45,0.18l14.935-15.032c0.449-0.445,0.36-0.623,0-0.889L23.47,8.614
+ c-0.09-0.089-0.36-0.089-0.36,0.089v8.894H10.875c-0.27,0-0.45,0.179-0.45,0.356v11.83c0,0.354,0.18,0.444,0.54,0.444H23.11
+ L23.021,39.21z"/>
+ <path fill="#477AF0" d="M23.03,39.185c0,0.267,0.27,0.267,0.449,0.178l14.912-15.005c0.447-0.444,0.359-0.622,0-0.888
+ L23.479,8.642c-0.09-0.089-0.359-0.089-0.359,0.088v8.878H10.903c-0.27,0-0.449,0.178-0.449,0.356v11.809
+ c0,0.354,0.18,0.441,0.539,0.441h12.127L23.03,39.185z"/>
+ <path fill="#487BF0" d="M23.041,39.157c0,0.266,0.269,0.266,0.448,0.177l14.89-14.979c0.446-0.443,0.357-0.62,0-0.886
+ L23.488,8.668c-0.09-0.089-0.359-0.089-0.359,0.088v8.863H10.933c-0.269,0-0.448,0.177-0.448,0.354v11.788
+ c0,0.354,0.179,0.441,0.538,0.441h12.107L23.041,39.157z"/>
+ <path fill="#497CF1" d="M23.049,39.13c0,0.268,0.269,0.268,0.448,0.178l14.865-14.952c0.446-0.442,0.357-0.619,0-0.885
+ L23.498,8.695c-0.09-0.088-0.358-0.088-0.358,0.088v8.848H10.961c-0.269,0-0.448,0.177-0.448,0.354v11.767
+ c0,0.354,0.179,0.44,0.538,0.44H23.14L23.049,39.13z"/>
+ <path fill="#4A7DF1" d="M23.06,39.104c0,0.266,0.269,0.266,0.447,0.176l14.841-14.925c0.446-0.442,0.356-0.618,0-0.883
+ L23.506,8.723c-0.09-0.088-0.358-0.088-0.358,0.088v8.832H10.989c-0.268,0-0.447,0.177-0.447,0.354v11.747
+ c0,0.354,0.179,0.439,0.537,0.439h12.069L23.06,39.104z"/>
+ <path fill="#4B7EF2" d="M23.068,39.077c0,0.265,0.269,0.265,0.447,0.177l14.817-14.899c0.445-0.441,0.357-0.617,0-0.882
+ L23.516,8.75c-0.09-0.088-0.357-0.088-0.357,0.088v8.816h-12.14c-0.268,0-0.446,0.177-0.446,0.354v11.726
+ c0,0.353,0.179,0.439,0.536,0.439h12.05L23.068,39.077z"/>
+ <path fill="#4C7FF2" d="M23.079,39.051c0,0.265,0.268,0.265,0.446,0.177l14.794-14.874c0.444-0.44,0.356-0.616,0-0.88
+ L23.523,8.775c-0.089-0.088-0.357-0.088-0.357,0.088v8.8h-12.12c-0.268,0-0.446,0.176-0.446,0.353v11.705
+ c0,0.353,0.178,0.439,0.535,0.439h12.031L23.079,39.051z"/>
+ <path fill="#4D80F3" d="M23.087,39.024c0,0.264,0.268,0.264,0.445,0.176l14.771-14.848c0.443-0.439,0.355-0.615,0-0.878
+ L23.532,8.803c-0.089-0.088-0.356-0.088-0.356,0.087v8.785H11.075c-0.267,0-0.445,0.176-0.445,0.352v11.685
+ c0,0.352,0.178,0.438,0.534,0.438h12.012L23.087,39.024z"/>
+ <path fill="#4E81F3" d="M23.098,38.997c0,0.264,0.267,0.264,0.445,0.176l14.748-14.82c0.442-0.438,0.354-0.614,0-0.877
+ L23.542,8.831c-0.089-0.088-0.356-0.088-0.356,0.087v8.769H11.104c-0.266,0-0.444,0.176-0.444,0.352v11.665
+ c0,0.35,0.178,0.437,0.533,0.437h11.993L23.098,38.997z"/>
+ <path fill="#4F82F4" d="M23.107,38.972c0,0.262,0.267,0.262,0.444,0.174l14.723-14.794c0.441-0.438,0.355-0.613,0-0.875
+ L23.55,8.856c-0.089-0.087-0.355-0.087-0.355,0.087v8.754H11.132c-0.266,0-0.443,0.176-0.443,0.351V29.69
+ c0,0.351,0.177,0.438,0.532,0.438h11.974L23.107,38.972z"/>
+ <path fill="#5083F4" d="M23.116,38.944c0,0.262,0.266,0.262,0.443,0.175l14.699-14.769c0.443-0.437,0.354-0.611,0-0.874
+ L23.56,8.883c-0.089-0.087-0.354-0.087-0.354,0.087v8.738H11.162c-0.266,0-0.443,0.175-0.443,0.35v11.622
+ c0,0.35,0.177,0.437,0.531,0.437h11.955L23.116,38.944z"/>
+ <path fill="#5184F5" d="M23.126,38.918c0,0.263,0.266,0.263,0.442,0.174l14.677-14.741c0.441-0.436,0.354-0.61,0-0.872
+ L23.568,8.911c-0.089-0.087-0.354-0.087-0.354,0.087v8.723H11.19c-0.265,0-0.442,0.175-0.442,0.35v11.603
+ c0,0.348,0.177,0.436,0.531,0.436h11.936L23.126,38.918z"/>
+ <path fill="#5285F5" d="M23.135,38.892c0,0.262,0.266,0.262,0.442,0.174L38.23,24.35c0.44-0.436,0.354-0.609,0-0.871L23.578,8.938
+ c-0.088-0.087-0.354-0.087-0.354,0.087v8.707H11.218c-0.265,0-0.441,0.175-0.441,0.349v11.581c0,0.348,0.177,0.434,0.53,0.434
+ h11.917L23.135,38.892z"/>
+ <path fill="#5386F6" d="M23.146,38.864c0,0.261,0.265,0.261,0.441,0.174l14.629-14.689c0.44-0.435,0.354-0.608,0-0.869
+ L23.586,8.964c-0.088-0.087-0.353-0.087-0.353,0.086v8.691H11.248c-0.264,0-0.441,0.174-0.441,0.348v11.562
+ c0,0.347,0.177,0.433,0.529,0.433h11.898L23.146,38.864z"/>
+ <path fill="#5487F6" d="M23.154,38.838c0,0.261,0.264,0.261,0.44,0.174l14.608-14.663c0.438-0.434,0.352-0.607,0-0.867
+ L23.595,8.992c-0.088-0.087-0.353-0.087-0.353,0.086v8.676H11.276c-0.264,0-0.44,0.174-0.44,0.348v11.54
+ c0,0.346,0.176,0.433,0.528,0.433h11.878L23.154,38.838z"/>
+ <path fill="#5588F7" d="M23.165,38.812c0,0.26,0.264,0.26,0.44,0.174l14.583-14.637c0.438-0.433,0.353-0.606,0-0.866L23.604,9.019
+ c-0.088-0.086-0.352-0.086-0.352,0.086v8.661H11.304c-0.263,0-0.439,0.173-0.439,0.347v11.52c0,0.346,0.176,0.432,0.527,0.432
+ h11.859L23.165,38.812z"/>
+ <path fill="#5689F7" d="M23.173,38.784c0,0.26,0.264,0.26,0.439,0.173l14.561-14.609c0.438-0.433,0.351-0.605,0-0.865
+ L23.612,9.045c-0.088-0.086-0.351-0.086-0.351,0.086v8.645H11.333c-0.263,0-0.438,0.173-0.438,0.346v11.499
+ c0,0.345,0.175,0.431,0.526,0.431h11.84L23.173,38.784z"/>
+ <path fill="#578AF8" d="M23.184,38.758c0,0.259,0.263,0.259,0.438,0.173l14.537-14.584c0.437-0.432,0.351-0.604,0-0.863
+ L23.622,9.072c-0.088-0.086-0.351-0.086-0.351,0.086v8.629H11.362c-0.263,0-0.438,0.173-0.438,0.346V29.61
+ c0,0.346,0.175,0.432,0.525,0.432h11.821L23.184,38.758z"/>
+ <path fill="#588BF8" d="M23.192,38.731c0,0.258,0.263,0.258,0.438,0.172l14.513-14.558c0.436-0.431,0.35-0.603,0-0.861L23.63,9.1
+ c-0.087-0.086-0.35-0.086-0.35,0.086v8.614h-11.89c-0.262,0-0.437,0.173-0.437,0.345v11.456c0,0.344,0.175,0.43,0.524,0.43H23.28
+ L23.192,38.731z"/>
+ <path fill="#598CF9" d="M23.203,38.704c0,0.259,0.262,0.259,0.437,0.173l14.488-14.532c0.437-0.43,0.351-0.602,0-0.86L23.64,9.126
+ c-0.088-0.086-0.35-0.086-0.35,0.085v8.598h-11.87c-0.262,0-0.437,0.172-0.437,0.344v11.438c0,0.344,0.175,0.428,0.524,0.428
+ h11.784L23.203,38.704z"/>
+ <path fill="#5A8DF9" d="M23.212,38.678c0,0.259,0.262,0.259,0.436,0.173l14.466-14.506c0.436-0.429,0.35-0.6,0-0.858L23.648,9.153
+ c-0.088-0.086-0.349-0.086-0.349,0.085v8.583H11.448c-0.262,0-0.436,0.172-0.436,0.344v11.416c0,0.343,0.174,0.428,0.523,0.428
+ h11.764L23.212,38.678z"/>
+ <path fill="#5B8EFA" d="M23.222,38.651c0,0.257,0.262,0.257,0.436,0.17L38.1,24.343c0.434-0.428,0.349-0.599,0-0.856L23.657,9.181
+ c-0.087-0.085-0.349-0.085-0.349,0.085v8.567H11.477c-0.261,0-0.435,0.171-0.435,0.343v11.394c0,0.343,0.174,0.428,0.522,0.428
+ h11.745L23.222,38.651z"/>
+ <path fill="#5C8FFA" d="M23.231,38.625c0,0.256,0.261,0.256,0.435,0.171l14.418-14.453c0.435-0.428,0.349-0.598,0-0.855
+ L23.667,9.208c-0.087-0.085-0.348-0.085-0.348,0.085v8.551H11.505c-0.261,0-0.434,0.172-0.434,0.343v11.375
+ c0,0.34,0.173,0.426,0.521,0.426h11.726L23.231,38.625z"/>
+ <path fill="#5D90FB" d="M23.24,38.599c0,0.256,0.261,0.256,0.434,0.17L38.07,24.342c0.433-0.427,0.349-0.598,0-0.854L23.674,9.233
+ c-0.087-0.085-0.347-0.085-0.347,0.085v8.536H11.534c-0.26,0-0.434,0.171-0.434,0.342V29.55c0,0.342,0.173,0.426,0.52,0.426
+ h11.707L23.24,38.599z"/>
+ <path fill="#5E91FB" d="M23.25,38.571c0,0.256,0.26,0.256,0.434,0.171l14.371-14.401c0.432-0.426,0.347-0.596,0-0.852
+ L23.685,9.261c-0.087-0.085-0.347-0.085-0.347,0.084v8.521H11.562c-0.259,0-0.433,0.171-0.433,0.342V29.54
+ c0,0.34,0.173,0.424,0.52,0.424h11.688L23.25,38.571z"/>
+ <path fill="#5F92FC" d="M23.26,38.545c0,0.255,0.26,0.255,0.433,0.17l14.349-14.374c0.432-0.425,0.347-0.595,0-0.85L23.692,9.289
+ c-0.087-0.085-0.346-0.085-0.346,0.084v8.504H11.591c-0.259,0-0.432,0.171-0.432,0.341V29.53c0,0.339,0.173,0.423,0.519,0.423
+ h11.669L23.26,38.545z"/>
+ <path fill="#6093FC" d="M23.27,38.519c0,0.254,0.259,0.254,0.432,0.17l14.326-14.347c0.431-0.425,0.345-0.594,0-0.849
+ L23.702,9.314c-0.087-0.085-0.346-0.085-0.346,0.084v8.489H11.621c-0.259,0-0.432,0.17-0.432,0.34v11.291
+ c0,0.34,0.173,0.424,0.518,0.424h11.649L23.27,38.519z"/>
+ <path fill="#6194FD" d="M23.279,38.491c0,0.255,0.259,0.255,0.431,0.17l14.302-14.322c0.429-0.424,0.345-0.593,0-0.847
+ L23.71,9.341c-0.086-0.084-0.345-0.084-0.345,0.084v8.473H11.648c-0.259,0-0.431,0.17-0.431,0.34v11.271
+ c0,0.338,0.172,0.422,0.517,0.422h11.63L23.279,38.491z"/>
+ <path fill="#6295FD" d="M23.29,38.465c0,0.254,0.258,0.254,0.43,0.169l14.28-14.294c0.428-0.423,0.344-0.592,0-0.846L23.719,9.369
+ c-0.086-0.084-0.344-0.084-0.344,0.084v8.458H11.677c-0.258,0-0.43,0.17-0.43,0.339v11.25c0,0.338,0.172,0.422,0.516,0.422h11.612
+ L23.29,38.465z"/>
+ <path fill="#6396FE" d="M23.298,38.438c0,0.254,0.258,0.254,0.43,0.17l14.255-14.269c0.428-0.422,0.344-0.591,0-0.844
+ l-14.255-14.1c-0.086-0.084-0.344-0.084-0.344,0.084v8.442H11.707c-0.258,0-0.429,0.169-0.429,0.338v11.228
+ c0,0.338,0.171,0.422,0.515,0.422h11.592L23.298,38.438z"/>
+ <path fill="#6497FE" d="M23.309,38.412c0,0.253,0.257,0.253,0.429,0.168l14.23-14.242c0.428-0.422,0.344-0.59,0-0.843
+ L23.737,9.422c-0.086-0.084-0.344-0.084-0.344,0.083v8.427H11.734c-0.257,0-0.429,0.169-0.429,0.338v11.209
+ c0,0.336,0.171,0.418,0.514,0.418h11.573L23.309,38.412z"/>
+ <path fill="#6598FF" d="M23.317,38.385c0,0.253,0.257,0.253,0.429,0.169l14.208-14.216c0.428-0.42,0.344-0.588,0-0.841
+ L23.747,9.45c-0.086-0.084-0.343-0.084-0.343,0.083v8.411h-11.64c-0.257,0-0.428,0.169-0.428,0.337v11.188
+ c0,0.336,0.171,0.419,0.514,0.419h11.554L23.317,38.385z"/>
+ <path fill="#6699FF" d="M23.328,38.358c0,0.252,0.257,0.252,0.428,0.168l14.185-14.19c0.426-0.42,0.342-0.587,0-0.839
+ L23.754,9.477c-0.086-0.084-0.342-0.084-0.342,0.083v8.396h-11.62c-0.256,0-0.427,0.168-0.427,0.336v11.167
+ c0,0.335,0.171,0.418,0.513,0.418h11.535L23.328,38.358z"/>
+ </g>
+
+ <linearGradient id="XMLID_10_" gradientUnits="userSpaceOnUse" x1="210.7969" y1="-239.4214" x2="210.7969" y2="-268.5771" gradientTransform="matrix(1 0 0 -1 -186 -230)">
+ <stop offset="0" style="stop-color:#FFFFFF"/>
+ <stop offset="1" style="stop-color:#6699FF"/>
+ </linearGradient>
+ <path fill="url(#XMLID_10_)" d="M23.328,38.358c0,0.252,0.257,0.252,0.428,0.168l14.185-14.19c0.426-0.42,0.342-0.587,0-0.839
+ L23.754,9.477c-0.086-0.084-0.342-0.084-0.342,0.083v8.396h-11.62c-0.256,0-0.427,0.168-0.427,0.336v11.167
+ c0,0.335,0.171,0.418,0.513,0.418h11.535L23.328,38.358z"/>
+</g>
+<g id="crop_x0020_marks">
+ <path fill="none" d="M48.06,47.999h-48v-48h48V47.999z"/>
+</g>
+</svg>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/colorsvg/note.svg b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/colorsvg/note.svg
new file mode 100644
index 0000000..e94c610
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/colorsvg/note.svg
@@ -0,0 +1,200 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 12.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 51448) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [
+ <!ENTITY ns_svg "http://www.w3.org/2000/svg">
+ <!ENTITY ns_xlink "http://www.w3.org/1999/xlink">
+]>
+<svg version="1.1" id="Layer_1" xmlns="&ns_svg;" xmlns:xlink="&ns_xlink;" width="25.5" height="25.5" viewBox="0 0 25.5 25.5"
+ overflow="visible" enable-background="new 0 0 25.5 25.5" xml:space="preserve">
+<g id="Layer_x0020_1">
+ <g>
+ <path fill="#1F60A9" d="M25.5,12.7c0,7-5.7,12.7-12.7,12.7C5.7,25.5,0,19.8,0,12.7C0,5.6,5.7,0,12.7,0s12.7,5.7,12.7,12.7H25.5z"
+ />
+ <path fill="#2060AA" d="M25.473,12.7c0,6.983-5.688,12.671-12.672,12.671C5.718,25.471,0.03,19.783,0.03,12.7
+ S5.718,0.029,12.701,0.029c6.984,0,12.671,5.687,12.671,12.671H25.473z"/>
+ <path fill="#2160AB" d="M25.443,12.7c0,6.968-5.674,12.642-12.643,12.642C5.734,25.439,0.061,19.768,0.061,12.7
+ c0-7.068,5.674-12.642,12.642-12.642c6.968,0,12.641,5.674,12.641,12.642H25.443z"/>
+ <path fill="#2160AC" d="M25.415,12.7c0,6.95-5.661,12.612-12.612,12.612C5.752,25.412,0.091,19.751,0.091,12.7
+ c0-7.051,5.661-12.612,12.612-12.612S25.316,5.749,25.316,12.7H25.415z"/>
+ <path fill="#2260AD" d="M25.387,12.7c0,6.936-5.648,12.583-12.583,12.583C5.769,25.383,0.121,19.734,0.121,12.7
+ c0-7.035,5.648-12.583,12.583-12.583c6.937,0,12.583,5.648,12.583,12.583H25.387z"/>
+ <path fill="#2360AE" d="M25.357,12.701c0,6.919-5.635,12.554-12.553,12.554C5.787,25.354,0.152,19.719,0.152,12.701
+ c0-7.019,5.635-12.554,12.554-12.554S25.26,5.782,25.26,12.701H25.357z"/>
+ <path fill="#2460AF" d="M25.33,12.7c0,6.903-5.622,12.524-12.525,12.524C5.803,25.323,0.181,19.702,0.181,12.7
+ S5.803,0.175,12.706,0.175c6.903,0,12.524,5.621,12.524,12.525H25.33z"/>
+ <path fill="#2560B0" d="M25.302,12.701c0,6.887-5.608,12.496-12.496,12.496C5.82,25.294,0.212,19.686,0.212,12.701
+ c0-6.986,5.608-12.496,12.496-12.496c6.888,0,12.496,5.608,12.496,12.496H25.302z"/>
+ <path fill="#2661B1" d="M25.273,12.7c0,6.87-5.597,12.467-12.467,12.467C5.837,25.266,0.242,19.67,0.242,12.7
+ c0-6.969,5.595-12.467,12.467-12.467c6.871,0,12.467,5.596,12.467,12.467H25.273z"/>
+ <path fill="#2661B2" d="M25.245,12.7c0,6.854-5.583,12.438-12.438,12.438C5.854,25.234,0.272,19.652,0.272,12.7
+ S5.854,0.262,12.709,0.262c6.855,0,12.438,5.583,12.438,12.438H25.245z"/>
+ <path fill="#2761B3" d="M25.216,12.7c0,6.839-5.567,12.407-12.408,12.407C5.872,25.205,0.303,19.637,0.303,12.7
+ c0-6.937,5.569-12.408,12.408-12.408S25.12,5.861,25.12,12.7H25.216z"/>
+ <path fill="#2861B4" d="M25.188,12.7c0,6.823-5.557,12.38-12.378,12.38C5.889,25.177,0.333,19.62,0.333,12.7
+ c0-6.92,5.556-12.379,12.379-12.379c6.823,0,12.38,5.556,12.38,12.379H25.188z"/>
+ <path fill="#2961B5" d="M25.16,12.7c0,6.807-5.543,12.35-12.351,12.35C5.906,25.146,0.363,19.604,0.363,12.7
+ c0-6.904,5.543-12.35,12.35-12.35s12.35,5.543,12.35,12.35H25.16z"/>
+ <path fill="#2A61B6" d="M25.131,12.7c0,6.792-5.529,12.321-12.32,12.321C5.923,25.117,0.393,19.588,0.393,12.7
+ c0-6.888,5.53-12.32,12.321-12.32s12.32,5.53,12.32,12.32H25.131z"/>
+ <path fill="#2A61B7" d="M25.104,12.7c0,6.774-5.518,12.292-12.292,12.292C5.94,25.088,0.424,19.57,0.424,12.7
+ c0-6.872,5.517-12.292,12.291-12.292c6.773,0,12.292,5.517,12.292,12.292H25.104z"/>
+ <path fill="#2B61B8" d="M25.075,12.7c0,6.759-5.505,12.263-12.263,12.263C5.958,25.059,0.455,19.555,0.455,12.7
+ c0-6.855,5.503-12.262,12.262-12.262c6.76,0,12.262,5.504,12.262,12.262H25.075z"/>
+ <path fill="#2C61B9" d="M25.046,12.7c0,6.743-5.489,12.233-12.232,12.233C5.975,25.029,0.484,19.539,0.484,12.7
+ c0-6.839,5.491-12.233,12.233-12.233c6.743,0,12.233,5.491,12.233,12.233H25.046z"/>
+ <path fill="#2D61BA" d="M25.018,12.7c0,6.727-5.478,12.204-12.204,12.204C5.992,25,0.514,19.521,0.514,12.7
+ c0-6.822,5.478-12.204,12.204-12.204S24.922,5.973,24.922,12.7H25.018z"/>
+ <path fill="#2E61BB" d="M24.988,12.7c0,6.711-5.463,12.175-12.173,12.175C6.009,24.971,0.544,19.506,0.544,12.7
+ c0-6.807,5.464-12.175,12.175-12.175S24.895,5.99,24.895,12.7H24.988z"/>
+ <path fill="#2F61BC" d="M24.962,12.701c0,6.693-5.45,12.145-12.146,12.145C6.026,24.941,0.575,19.49,0.575,12.701
+ c0-6.79,5.451-12.146,12.146-12.146c6.695,0,12.146,5.452,12.146,12.146H24.962z"/>
+ <path fill="#2F61BD" d="M24.934,12.7c0,6.678-5.438,12.116-12.117,12.116C6.043,24.911,0.605,19.475,0.605,12.7
+ S6.043,0.584,12.722,0.584c6.678,0,12.116,5.438,12.116,12.116H24.934z"/>
+ <path fill="#3061BE" d="M24.904,12.7c0,6.661-5.426,12.087-12.087,12.087C6.06,24.882,0.635,19.457,0.635,12.7
+ c0-6.757,5.425-12.087,12.087-12.087c6.661,0,12.086,5.425,12.086,12.087H24.904z"/>
+ <path fill="#3162BF" d="M24.876,12.7c0,6.646-5.412,12.059-12.058,12.059C6.078,24.854,0.666,19.439,0.666,12.7
+ c0-6.741,5.412-12.058,12.058-12.058S24.783,6.054,24.783,12.7H24.876z"/>
+ <path fill="#3262C0" d="M24.85,12.701c0,6.63-5.399,12.027-12.03,12.027C6.095,24.823,0.696,19.425,0.696,12.701
+ c0-6.725,5.399-12.029,12.029-12.029c6.628,0,12.028,5.399,12.028,12.029H24.85z"/>
+ <path fill="#3362C1" d="M24.818,12.7c0,6.614-5.385,11.999-12,11.999C6.112,24.794,0.727,19.408,0.727,12.7s5.385-12,12-12
+ c6.614,0,12,5.386,12,12H24.818z"/>
+ <path fill="#3362C2" d="M24.791,12.7c0,6.598-5.373,11.97-11.971,11.97C6.129,24.764,0.756,19.393,0.756,12.7
+ S6.129,0.73,12.727,0.73c6.597,0,11.968,5.372,11.968,11.97H24.791z"/>
+ <path fill="#3462C3" d="M24.764,12.7c0,6.582-5.359,11.94-11.942,11.94C6.146,24.734,0.787,19.375,0.787,12.7
+ c0-6.676,5.359-11.941,11.941-11.941c6.583,0,11.941,5.36,11.941,11.941H24.764z"/>
+ <path fill="#3562C4" d="M24.734,12.7c0,6.565-5.348,11.911-11.913,11.911C6.164,24.705,0.817,19.359,0.817,12.7
+ S6.164,0.788,12.729,0.788c6.566,0,11.912,5.347,11.912,11.912H24.734z"/>
+ <path fill="#3662C5" d="M24.706,12.7c0,6.55-5.333,11.883-11.883,11.883C6.181,24.676,0.847,19.343,0.847,12.7
+ c0-6.643,5.333-11.883,11.883-11.883c6.549,0,11.881,5.333,11.881,11.883H24.706z"/>
+ <path fill="#3762C6" d="M24.678,12.7c0,6.534-5.32,11.854-11.854,11.854C6.198,24.646,0.877,19.326,0.877,12.7
+ S6.198,0.846,12.731,0.846c6.535,0,11.853,5.32,11.853,11.854H24.678z"/>
+ <path fill="#3762C7" d="M24.648,12.7c0,6.518-5.308,11.823-11.824,11.823C6.215,24.617,0.908,19.311,0.908,12.7
+ c0-6.611,5.307-11.824,11.824-11.824S24.557,6.183,24.557,12.7H24.648z"/>
+ <path fill="#3862C8" d="M24.621,12.7c0,6.502-5.294,11.795-11.795,11.795C6.232,24.588,0.938,19.294,0.938,12.7
+ c0-6.594,5.293-11.795,11.795-11.795c6.501,0,11.794,5.294,11.794,11.795H24.621z"/>
+ <path fill="#3962C9" d="M24.593,12.7c0,6.485-5.28,11.766-11.766,11.766C6.249,24.559,0.968,19.277,0.968,12.7
+ c0-6.578,5.281-11.766,11.766-11.766S24.5,6.215,24.5,12.7H24.593z"/>
+ <path fill="#3A62CA" d="M24.564,12.7c0,6.469-5.27,11.737-11.737,11.737C6.266,24.527,0.999,19.261,0.999,12.7
+ c0-6.561,5.267-11.737,11.736-11.737c6.469,0,11.738,5.268,11.738,11.736L24.564,12.7L24.564,12.7z"/>
+ <path fill="#3B62CB" d="M24.536,12.7c0,6.452-5.255,11.707-11.708,11.707C6.284,24.5,1.029,19.245,1.029,12.7
+ c0-6.545,5.255-11.707,11.707-11.707s11.708,5.255,11.708,11.708L24.536,12.7L24.536,12.7z"/>
+ <path fill="#3C62CC" d="M24.508,12.701c0,6.438-5.24,11.678-11.678,11.678c-6.529,0.092-11.77-5.15-11.77-11.678
+ c0-6.528,5.241-11.679,11.678-11.679S24.416,6.263,24.416,12.7L24.508,12.701L24.508,12.701z"/>
+ <path fill="#3C62CD" d="M24.479,12.7c0,6.421-5.229,11.649-11.648,11.649C6.318,24.439,1.09,19.212,1.09,12.7
+ c0-6.513,5.228-11.649,11.649-11.649c6.42,0,11.65,5.228,11.65,11.649H24.479z"/>
+ <path fill="#3D63CE" d="M24.45,12.7c0,6.403-5.216,11.618-11.62,11.618C6.335,24.41,1.12,19.195,1.12,12.7
+ c0-6.497,5.215-11.62,11.62-11.62c6.404,0,11.619,5.215,11.619,11.62H24.45z"/>
+ <path fill="#3E63CF" d="M24.423,12.7c0,6.389-5.202,11.591-11.591,11.591C6.353,24.382,1.15,19.18,1.15,12.7
+ c0-6.48,5.203-11.591,11.591-11.591c6.388,0,11.59,5.203,11.59,11.591H24.423z"/>
+ <path fill="#3F63D0" d="M24.395,12.701c0,6.373-5.188,11.561-11.562,11.561C6.37,24.354,1.18,19.164,1.18,12.701
+ c0-6.464,5.189-11.562,11.562-11.562c6.371,0,11.562,5.189,11.562,11.562H24.395z"/>
+ <path fill="#4063D1" d="M24.365,12.7c0,6.356-5.176,11.532-11.532,11.532C6.387,24.322,1.21,19.146,1.21,12.7
+ c0-6.447,5.177-11.533,11.533-11.533c6.354,0,11.532,5.176,11.532,11.533H24.365z"/>
+ <path fill="#4063D2" d="M24.337,12.7c0,6.341-5.163,11.503-11.503,11.503C6.403,24.293,1.24,19.13,1.24,12.7
+ c0-6.431,5.163-11.503,11.503-11.503c6.34,0,11.504,5.163,11.504,11.503H24.337z"/>
+ <path fill="#4163D3" d="M24.311,12.7c0,6.323-5.15,11.474-11.476,11.474C6.42,24.264,1.271,19.114,1.271,12.7
+ c0-6.415,5.149-11.474,11.474-11.474c6.323,0,11.474,5.15,11.474,11.474H24.311z"/>
+ <path fill="#4263D4" d="M24.281,12.701c0,6.308-5.137,11.445-11.445,11.445C6.438,24.234,1.301,19.1,1.301,12.701
+ c0-6.399,5.137-11.445,11.445-11.445c6.307,0,11.445,5.136,11.445,11.445H24.281z"/>
+ <path fill="#4363D4" d="M24.253,12.7c0,6.292-5.124,11.416-11.416,11.416C6.455,24.205,1.332,19.082,1.332,12.7
+ c0-6.382,5.123-11.415,11.415-11.415S24.163,6.408,24.163,12.7H24.253z"/>
+ <path fill="#4463D5" d="M24.225,12.7c0,6.276-5.111,11.387-11.387,11.387C6.472,24.176,1.362,19.064,1.362,12.7
+ c0-6.366,5.11-11.386,11.386-11.386c6.275,0,11.387,5.11,11.387,11.386H24.225z"/>
+ <path fill="#4563D6" d="M24.195,12.7c0,6.26-5.098,11.356-11.357,11.356C6.49,24.146,1.392,19.049,1.392,12.7
+ c0-6.35,5.098-11.357,11.357-11.357S24.105,6.441,24.105,12.7H24.195z"/>
+ <path fill="#4563D7" d="M24.167,12.7c0,6.243-5.084,11.327-11.328,11.327C6.506,24.116,1.422,19.033,1.422,12.7
+ S6.506,1.372,12.75,1.372S24.078,6.456,24.078,12.7H24.167z"/>
+ <path fill="#4663D8" d="M24.139,12.7c0,6.228-5.07,11.299-11.299,11.299C6.523,24.087,1.453,19.018,1.453,12.7
+ S6.523,1.401,12.751,1.401c6.228,0,11.298,5.071,11.298,11.299H24.139z"/>
+ <path fill="#4763D9" d="M24.109,12.7c0,6.212-5.058,11.271-11.27,11.271C6.541,24.059,1.483,19,1.483,12.7
+ c0-6.3,5.058-11.27,11.27-11.27S24.023,6.488,24.023,12.7H24.109z"/>
+ <path fill="#4863DA" d="M24.082,12.7c0,6.194-5.045,11.239-11.24,11.239C6.558,24.027,1.513,18.982,1.513,12.7
+ c0-6.284,5.045-11.24,11.24-11.24c6.195,0,11.241,5.045,11.241,11.24H24.082z"/>
+ <path fill="#4964DB" d="M24.055,12.7c0,6.18-5.033,11.211-11.212,11.211c-6.268,0.088-11.3-4.943-11.3-11.211
+ c0-6.268,5.032-11.211,11.211-11.211c6.18,0,11.212,5.032,11.212,11.211H24.055z"/>
+ <path fill="#4964DC" d="M24.025,12.7c0,6.164-5.02,11.182-11.183,11.182C6.592,23.971,1.574,18.951,1.574,12.7
+ S6.593,1.518,12.756,1.518S23.938,6.537,23.938,12.7H24.025z"/>
+ <path fill="#4A64DD" d="M23.997,12.7c0,6.147-5.006,11.153-11.153,11.153C6.609,23.939,1.604,18.936,1.604,12.7
+ S6.609,1.547,12.757,1.547c6.146,0,11.152,5.006,11.152,11.153H23.997z"/>
+ <path fill="#4B64DE" d="M23.969,12.7c0,6.131-4.992,11.124-11.124,11.124C6.626,23.91,1.634,18.918,1.634,12.7
+ c0-6.219,4.992-11.124,11.124-11.124c6.131,0,11.124,4.992,11.124,11.124H23.969z"/>
+ <path fill="#4C64DF" d="M23.939,12.7c0,6.114-4.979,11.095-11.094,11.095C6.644,23.882,1.665,18.902,1.665,12.7
+ c0-6.203,4.979-11.094,11.094-11.094c6.115,0,11.095,4.979,11.095,11.094H23.939z"/>
+ <path fill="#4D64E0" d="M23.912,12.7c0,6.1-4.967,11.065-11.065,11.065C6.661,23.852,1.695,18.886,1.695,12.7
+ c0-6.186,4.966-11.065,11.065-11.065c6.098,0,11.065,4.966,11.065,11.065H23.912z"/>
+ <path fill="#4E64E1" d="M23.884,12.7c0,6.083-4.952,11.036-11.036,11.036C6.678,23.822,1.725,18.869,1.725,12.7
+ c0-6.17,4.954-11.036,11.036-11.036c6.083,0,11.036,4.954,11.036,11.036H23.884z"/>
+ <path fill="#4E64E2" d="M23.855,12.7c0,6.067-4.94,11.007-11.007,11.007C6.695,23.793,1.755,18.854,1.755,12.7
+ c0-6.154,4.94-11.007,11.007-11.007c6.066,0,11.005,4.94,11.005,11.007H23.855z"/>
+ <path fill="#4F64E3" d="M23.827,12.7c0,6.051-4.929,10.978-10.978,10.978C6.712,23.764,1.786,18.837,1.786,12.7
+ c0-6.137,4.927-10.978,10.978-10.978c6.05,0,10.977,4.927,10.977,10.978H23.827z"/>
+ <path fill="#5064E4" d="M23.799,12.7c0,6.034-4.914,10.948-10.949,10.948C6.729,23.734,1.816,18.82,1.816,12.7
+ c0-6.121,4.914-10.948,10.948-10.948c6.034,0,10.949,4.914,10.949,10.948H23.799z"/>
+ <path fill="#5164E5" d="M23.771,12.7c0,6.019-4.901,10.919-10.919,10.919C6.747,23.705,1.846,18.805,1.846,12.7
+ c0-6.105,4.9-10.919,10.919-10.919c6.018,0,10.918,4.9,10.918,10.919H23.771z"/>
+ <path fill="#5264E6" d="M23.742,12.7c0,6.003-4.889,10.89-10.891,10.89C6.764,23.675,1.876,18.788,1.876,12.7
+ c0-6.088,4.888-10.89,10.89-10.89c6.001,0,10.89,4.888,10.89,10.89H23.742z"/>
+ <path fill="#5264E7" d="M23.714,12.7c0,5.985-4.875,10.86-10.861,10.86C6.781,23.646,1.906,18.771,1.906,12.7
+ c0-6.072,4.875-10.861,10.861-10.861c5.985,0,10.86,4.875,10.86,10.861H23.714z"/>
+ <path fill="#5364E8" d="M23.686,12.7c0,5.971-4.861,10.832-10.832,10.832C6.798,23.616,1.937,18.755,1.937,12.7
+ c0-6.056,4.862-10.832,10.832-10.832C18.738,1.869,23.6,6.73,23.6,12.7H23.686z"/>
+ <path fill="#5464E9" d="M23.657,12.7c0,5.954-4.849,10.803-10.803,10.803C6.815,23.587,1.967,18.739,1.967,12.7
+ c0-6.04,4.849-10.802,10.803-10.802c5.955,0,10.802,4.848,10.802,10.802H23.657z"/>
+ <path fill="#5565EA" d="M23.629,12.7c0,5.938-4.836,10.772-10.774,10.772C6.833,23.559,1.998,18.723,1.998,12.7
+ c0-6.023,4.835-10.773,10.773-10.773S23.544,6.762,23.544,12.7H23.629z"/>
+ <path fill="#5665EB" d="M23.602,12.7c0,5.922-4.824,10.743-10.746,10.743C6.85,23.527,2.027,18.706,2.027,12.7
+ c0-6.006,4.822-10.744,10.744-10.744c5.922,0,10.745,4.822,10.745,10.744H23.602z"/>
+ <path fill="#5665EC" d="M23.572,12.7c0,5.905-4.811,10.715-10.715,10.715C6.867,23.499,2.058,18.689,2.058,12.7
+ c0-5.99,4.809-10.715,10.714-10.715S23.486,6.794,23.486,12.7H23.572z"/>
+ <path fill="#5765ED" d="M23.544,12.7c0,5.89-4.797,10.686-10.687,10.686C6.884,23.471,2.088,18.674,2.088,12.7
+ c0-5.974,4.796-10.686,10.686-10.686c5.889,0,10.686,4.796,10.686,10.686H23.544z"/>
+ <path fill="#5865EE" d="M23.516,12.7c0,5.874-4.783,10.655-10.657,10.655C6.901,23.439,2.118,18.657,2.118,12.7
+ c0-5.958,4.783-10.657,10.657-10.657c5.874,0,10.657,4.784,10.657,10.657H23.516z"/>
+ <path fill="#5965EF" d="M23.486,12.7c0,5.858-4.771,10.627-10.627,10.627C6.918,23.41,2.148,18.641,2.148,12.7
+ c0-5.941,4.77-10.627,10.627-10.627S23.402,6.843,23.402,12.7H23.486z"/>
+ <path fill="#5A65F0" d="M23.459,12.7c0,5.842-4.758,10.598-10.599,10.598C6.936,23.381,2.179,18.625,2.179,12.7
+ c0-5.925,4.757-10.598,10.598-10.598c5.841,0,10.598,4.757,10.598,10.598H23.459z"/>
+ <path fill="#5B65F1" d="M23.432,12.7c0,5.825-4.744,10.569-10.571,10.569C6.953,23.352,2.209,18.607,2.209,12.7
+ c0-5.909,4.744-10.569,10.569-10.569c5.826,0,10.57,4.744,10.57,10.569H23.432z"/>
+ <path fill="#5B65F2" d="M23.4,12.7c0,5.81-4.729,10.54-10.54,10.54C6.97,23.322,2.239,18.592,2.239,12.7
+ c0-5.892,4.73-10.54,10.54-10.54c5.809,0,10.54,4.73,10.54,10.54H23.4z"/>
+ <path fill="#5C65F3" d="M23.373,12.7c0,5.794-4.719,10.511-10.511,10.511C6.987,23.293,2.27,18.576,2.27,12.7
+ S6.987,2.189,12.78,2.189c5.793,0,10.511,4.717,10.511,10.511H23.373z"/>
+ <path fill="#5D65F4" d="M23.346,12.7c0,5.776-4.705,10.481-10.482,10.481C7.004,23.264,2.3,18.561,2.3,12.7
+ S7.004,2.219,12.781,2.219c5.775,0,10.48,4.704,10.48,10.481H23.346z"/>
+ <path fill="#5E65F5" d="M23.316,12.7c0,5.762-4.691,10.452-10.453,10.452C7.021,23.232,2.33,18.543,2.33,12.7
+ c0-5.843,4.691-10.452,10.452-10.452c5.761,0,10.452,4.691,10.452,10.452H23.316z"/>
+ <path fill="#5F65F6" d="M23.288,12.7c0,5.745-4.679,10.423-10.423,10.423C7.039,23.204,2.36,18.525,2.36,12.7
+ c0-5.827,4.678-10.423,10.423-10.423c5.744,0,10.423,4.678,10.423,10.423H23.288z"/>
+ <path fill="#5F65F7" d="M23.26,12.7c0,5.729-4.664,10.394-10.394,10.394C7.056,23.175,2.391,18.511,2.391,12.7
+ c0-5.811,4.665-10.393,10.394-10.393c5.729,0,10.393,4.665,10.393,10.394L23.26,12.7L23.26,12.7z"/>
+ <path fill="#6066F8" d="M23.23,12.7c0,5.713-4.651,10.364-10.364,10.364C7.073,23.146,2.421,18.494,2.421,12.7
+ S7.073,2.335,12.786,2.335c5.712,0,10.364,4.652,10.364,10.365H23.23z"/>
+ <path fill="#6166F9" d="M23.203,12.7c0,5.696-4.639,10.335-10.335,10.335C7.09,23.116,2.451,18.479,2.451,12.7
+ S7.09,2.365,12.786,2.365S23.121,7.004,23.121,12.7H23.203z"/>
+ <path fill="#6266FA" d="M23.175,12.7c0,5.681-4.626,10.306-10.307,10.306C7.107,23.087,2.481,18.462,2.481,12.7
+ c0-5.762,4.626-10.306,10.307-10.306c5.68,0,10.306,4.625,10.306,10.306H23.175z"/>
+ <path fill="#6366FB" d="M23.146,12.7c0,5.665-4.613,10.276-10.277,10.276C7.124,23.059,2.512,18.445,2.512,12.7
+ c0-5.746,4.612-10.277,10.277-10.277S23.064,7.036,23.064,12.7H23.146z"/>
+ <path fill="#6466FC" d="M23.118,12.7c0,5.647-4.601,10.248-10.248,10.248C7.142,23.027,2.542,18.43,2.542,12.7
+ c0-5.729,4.6-10.248,10.248-10.248c5.647,0,10.247,4.6,10.247,10.248H23.118z"/>
+ <path fill="#6466FD" d="M23.09,12.7c0,5.633-4.587,10.219-10.219,10.219C7.159,22.998,2.572,18.412,2.572,12.7
+ c0-5.713,4.586-10.219,10.219-10.219c5.632,0,10.219,4.586,10.219,10.219H23.09z"/>
+ <path fill="#6566FE" d="M23.062,12.7c0,5.616-4.574,10.188-10.19,10.188C7.176,22.969,2.603,18.396,2.603,12.7
+ S7.176,2.511,12.792,2.511c5.615,0,10.188,4.573,10.188,10.189H23.062z"/>
+ <path fill="#6666FF" d="M23.033,12.7c0,5.601-4.561,10.159-10.161,10.159c-5.68,0.08-10.24-4.479-10.24-10.159
+ c0-5.68,4.56-10.16,10.16-10.16c5.601,0,10.16,4.56,10.16,10.16H23.033z"/>
+ </g>
+
+ <linearGradient id="XMLID_12_" gradientUnits="userSpaceOnUse" x1="198.625" y1="-253.916" x2="198.625" y2="-262.334" gradientTransform="matrix(1 0 0 -1 -186 -252.5)">
+ <stop offset="0" style="stop-color:#FFFFFF"/>
+ <stop offset="1" style="stop-color:#6666FF"/>
+ </linearGradient>
+ <ellipse fill="url(#XMLID_12_)" cx="12.625" cy="5.625" rx="7.542" ry="4.209"/>
+ <g>
+ <path fill="#FFFFFF" d="M14.1,19.2c0,0.2,0,0.3-0.3,0.3H12c-0.2,0-0.3-0.1-0.3-0.3v-7.1h-1.4c-0.2,0-0.3-0.1-0.3-0.3v-1.2
+ c0-0.2,0-0.3,0.3-0.3h3.5c0.2,0,0.3,0.1,0.3,0.3v8.5V19.2z M13,9.2c-0.8,0-1.5-0.7-1.5-1.5c0-0.8,0.7-1.5,1.5-1.5s1.5,0.7,1.5,1.5
+ C14.5,8.5,13.8,9.2,13,9.2z"/>
+ </g>
+</g>
+</svg>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/colorsvg/prev.svg b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/colorsvg/prev.svg
new file mode 100644
index 0000000..7ceddec
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/colorsvg/prev.svg
@@ -0,0 +1,338 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 12.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 51448) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [
+ <!ENTITY ns_svg "http://www.w3.org/2000/svg">
+ <!ENTITY ns_xlink "http://www.w3.org/1999/xlink">
+]>
+<svg version="1.1" id="Previous" xmlns="&ns_svg;" xmlns:xlink="&ns_xlink;" width="48" height="48" viewBox="0 0 48 48"
+ overflow="visible" enable-background="new 0 0 48 48" xml:space="preserve">
+<g>
+ <path fill="#FFFFFF" stroke="#FFFFFF" stroke-width="7.5901" stroke-linejoin="round" d="M25.659,6.898c0-0.301-0.3-0.301-0.5-0.2
+ l-16.6,16.9c-0.5,0.5-0.4,0.7,0,1l16.6,16.7c0.103,0.101,0.399,0.101,0.399-0.1v-10h13.601c0.301,0,0.5-0.2,0.5-0.4v-13.3
+ c0-0.4-0.199-0.5-0.601-0.5h-13.5L25.659,6.898z"/>
+ <g>
+ <path fill="#0033CC" d="M25.659,6.898c0-0.301-0.3-0.301-0.5-0.2l-16.6,16.9c-0.5,0.5-0.4,0.7,0,1l16.6,16.7
+ c0.103,0.101,0.399,0.101,0.399-0.1v-10h13.601c0.301,0,0.5-0.2,0.5-0.4v-13.3c0-0.4-0.199-0.5-0.601-0.5h-13.5L25.659,6.898z"/>
+ <path fill="#0134CC" d="M25.648,6.925c0-0.3-0.299-0.3-0.498-0.2L8.575,23.6c-0.499,0.499-0.4,0.698,0,1L25.15,41.271
+ c0.101,0.102,0.398,0.102,0.398-0.1v-9.984h13.58c0.303,0,0.5-0.197,0.5-0.397V17.508c0-0.4-0.197-0.499-0.6-0.499H25.55
+ L25.648,6.925z"/>
+ <path fill="#0235CD" d="M25.641,6.953c0-0.3-0.3-0.3-0.498-0.2L8.588,23.601c-0.499,0.498-0.399,0.697,0,0.997l16.553,16.647
+ c0.101,0.101,0.398,0.101,0.398-0.101v-9.971h13.562c0.299,0,0.498-0.197,0.498-0.398V17.519c0-0.399-0.199-0.499-0.6-0.499H25.54
+ L25.641,6.953z"/>
+ <path fill="#0336CD" d="M25.63,6.979c0-0.299-0.299-0.299-0.498-0.199L8.603,23.601c-0.498,0.498-0.399,0.696,0,0.997
+ l16.529,16.62c0.101,0.101,0.397,0.101,0.397-0.099v-9.954h13.544c0.299,0,0.495-0.199,0.495-0.397v-13.24
+ c0-0.399-0.196-0.498-0.598-0.498H25.532L25.63,6.979z"/>
+ <path fill="#0437CE" d="M25.622,7.005c0-0.299-0.299-0.299-0.498-0.199L8.619,23.602c-0.498,0.497-0.398,0.695,0,0.994
+ l16.505,16.598c0.101,0.1,0.396,0.1,0.396-0.102v-9.938h13.521c0.301,0,0.498-0.197,0.498-0.396V17.54
+ c0-0.397-0.197-0.497-0.598-0.497h-13.42L25.622,7.005z"/>
+ <path fill="#0538CE" d="M25.611,7.033c0-0.298-0.299-0.298-0.498-0.199L8.633,23.602c-0.497,0.496-0.398,0.694,0,0.994
+ l16.48,16.568c0.101,0.1,0.398,0.1,0.398-0.1v-9.924h13.502c0.299,0,0.498-0.197,0.498-0.396V17.548
+ c0-0.397-0.199-0.496-0.598-0.496h-13.4L25.611,7.033z"/>
+ <path fill="#0639CF" d="M25.602,7.06c0-0.298-0.297-0.298-0.496-0.199L8.646,23.603c-0.496,0.496-0.396,0.693,0,0.99
+ l16.458,16.546c0.101,0.101,0.396,0.101,0.396-0.1v-9.907h13.482c0.301,0,0.496-0.196,0.496-0.396V17.56
+ c0-0.396-0.195-0.495-0.595-0.495H25.503L25.602,7.06z"/>
+ <path fill="#073ACF" d="M25.592,7.085c0-0.298-0.298-0.298-0.494-0.199L8.662,23.603c-0.495,0.495-0.396,0.692,0,0.989
+ l16.436,16.518c0.1,0.102,0.396,0.102,0.396-0.098V31.12h13.465c0.297,0,0.494-0.197,0.494-0.396V17.569
+ c0-0.396-0.197-0.495-0.595-0.495H25.493L25.592,7.085z"/>
+ <path fill="#083BD0" d="M25.583,7.111c0-0.297-0.297-0.297-0.494-0.198L8.677,23.604c-0.494,0.494-0.396,0.691,0,0.987
+ l16.412,16.493c0.101,0.1,0.396,0.1,0.396-0.1v-9.877h13.447c0.297,0,0.493-0.195,0.493-0.396V17.58
+ c0-0.396-0.196-0.494-0.594-0.494H25.484L25.583,7.111z"/>
+ <path fill="#093CD0" d="M25.573,7.139c0-0.296-0.296-0.296-0.494-0.197L8.69,23.604c-0.493,0.494-0.395,0.69,0,0.985l16.389,16.47
+ c0.103,0.099,0.396,0.099,0.396-0.101V31.1h13.428c0.298,0,0.494-0.197,0.494-0.396V17.589c0-0.395-0.196-0.493-0.594-0.493
+ H25.475L25.573,7.139z"/>
+ <path fill="#0A3DD1" d="M25.562,7.165c0-0.296-0.295-0.296-0.492-0.197L8.706,23.604c-0.493,0.492-0.395,0.688,0,0.983
+ l16.366,16.44c0.1,0.098,0.396,0.098,0.396-0.101v-9.845h13.405c0.297,0,0.494-0.196,0.494-0.396V17.596
+ c0-0.395-0.197-0.492-0.592-0.492H25.464L25.562,7.165z"/>
+ <path fill="#0B3ED1" d="M25.555,7.191c0-0.295-0.296-0.295-0.492-0.197L8.72,23.605c-0.492,0.491-0.394,0.688,0,0.982
+ l16.342,16.414c0.1,0.099,0.395,0.099,0.395-0.099v-9.828h13.391c0.295,0,0.49-0.197,0.49-0.395V17.609
+ c0-0.393-0.195-0.491-0.59-0.491H25.456L25.555,7.191z"/>
+ <path fill="#0C3FD2" d="M25.544,7.219c0-0.295-0.295-0.295-0.491-0.196L8.734,23.606c-0.491,0.49-0.394,0.687,0,0.98
+ l16.318,16.389c0.099,0.101,0.394,0.101,0.394-0.098v-9.812h13.369c0.297,0,0.492-0.194,0.492-0.394V17.62
+ c0-0.393-0.195-0.49-0.591-0.49H25.445L25.544,7.219z"/>
+ <path fill="#0D40D2" d="M25.534,7.245c0-0.294-0.293-0.294-0.49-0.196L8.749,23.606c-0.491,0.489-0.394,0.685,0,0.979
+ l16.295,16.362c0.099,0.098,0.394,0.098,0.394-0.098v-9.798h13.35c0.295,0,0.49-0.196,0.49-0.395V17.628
+ c0-0.392-0.195-0.489-0.588-0.489H25.438L25.534,7.245z"/>
+ <path fill="#0E41D3" d="M25.525,7.271c0-0.294-0.295-0.294-0.489-0.196L8.764,23.607c-0.49,0.489-0.393,0.685,0,0.979
+ l16.271,16.335c0.102,0.101,0.395,0.101,0.395-0.097v-9.782h13.33c0.295,0,0.488-0.194,0.488-0.394V17.64
+ c0-0.392-0.193-0.489-0.588-0.489H25.428L25.525,7.271z"/>
+ <path fill="#0F42D3" d="M25.516,7.298c0-0.293-0.293-0.293-0.488-0.195L8.778,23.607c-0.489,0.489-0.392,0.684,0,0.978
+ l16.248,16.312c0.101,0.099,0.394,0.099,0.394-0.099v-9.767H38.73c0.293,0,0.49-0.195,0.49-0.393V17.65
+ c0-0.391-0.197-0.488-0.589-0.488H25.417L25.516,7.298z"/>
+ <path fill="#1043D4" d="M25.505,7.325c0-0.293-0.293-0.293-0.487-0.195L8.792,23.608c-0.488,0.488-0.391,0.683,0,0.976
+ l16.224,16.283c0.101,0.098,0.394,0.098,0.394-0.098v-9.752H38.7c0.295,0,0.489-0.192,0.489-0.39V17.661
+ c0-0.391-0.194-0.487-0.586-0.487H25.409L25.505,7.325z"/>
+ <path fill="#1144D4" d="M25.497,7.352c0-0.292-0.293-0.292-0.487-0.194L8.808,23.608c-0.488,0.487-0.391,0.682,0,0.974
+ L25.009,40.84c0.099,0.1,0.392,0.1,0.392-0.097v-9.734h13.272c0.293,0,0.488-0.194,0.488-0.39V17.67
+ c0-0.39-0.195-0.487-0.586-0.487H25.398L25.497,7.352z"/>
+ <path fill="#1245D5" d="M25.486,7.378c0-0.292-0.293-0.292-0.487-0.195L8.822,23.609c-0.487,0.486-0.39,0.68,0,0.973l16.177,16.23
+ c0.099,0.099,0.392,0.099,0.392-0.099v-9.72h13.254c0.293,0,0.485-0.194,0.485-0.391V17.681c0-0.389-0.192-0.486-0.584-0.486
+ H25.391L25.486,7.378z"/>
+ <path fill="#1346D5" d="M25.479,7.406c0-0.292-0.293-0.292-0.486-0.195L8.837,23.61c-0.487,0.485-0.39,0.679,0,0.971
+ l16.154,16.206c0.098,0.097,0.389,0.097,0.389-0.098v-9.705h13.236c0.291,0,0.485-0.192,0.485-0.389V17.69
+ c0-0.388-0.194-0.485-0.584-0.485H25.38L25.479,7.406z"/>
+ <path fill="#1447D6" d="M25.468,7.432c0-0.292-0.292-0.292-0.485-0.194L8.852,23.611c-0.485,0.484-0.389,0.678,0,0.969
+ l16.13,16.18c0.1,0.098,0.389,0.098,0.389-0.096v-9.688h13.217c0.291,0,0.486-0.192,0.486-0.39V17.702
+ c0-0.388-0.195-0.484-0.584-0.484H25.37L25.468,7.432z"/>
+ <path fill="#1548D6" d="M25.458,7.458c0-0.291-0.291-0.291-0.485-0.194L8.866,23.611c-0.484,0.483-0.388,0.677,0,0.968
+ L24.973,40.73c0.1,0.099,0.389,0.099,0.389-0.097v-9.673h13.197c0.291,0,0.483-0.193,0.483-0.388V17.71
+ c0-0.387-0.192-0.483-0.582-0.483H25.359L25.458,7.458z"/>
+ <path fill="#1649D7" d="M25.448,7.484c0-0.291-0.289-0.291-0.484-0.194L8.88,23.613c-0.484,0.482-0.388,0.675,0,0.965
+ l16.083,16.128c0.098,0.099,0.389,0.099,0.389-0.097v-9.657h13.178c0.291,0,0.484-0.192,0.484-0.388V17.722
+ c0-0.387-0.193-0.482-0.582-0.482h-13.08L25.448,7.484z"/>
+ <path fill="#174AD7" d="M25.439,7.512c0-0.29-0.291-0.29-0.483-0.193L8.895,23.614c-0.483,0.482-0.387,0.675,0,0.963l16.06,16.104
+ c0.1,0.096,0.391,0.096,0.391-0.098v-9.645H38.5c0.291,0,0.484-0.191,0.484-0.385V17.731c0-0.386-0.193-0.481-0.58-0.481H25.343
+ L25.439,7.512z"/>
+ <path fill="#184BD8" d="M25.43,7.539c0-0.29-0.289-0.29-0.482-0.193L8.91,23.614c-0.482,0.482-0.387,0.674,0,0.962L24.947,40.65
+ c0.098,0.098,0.387,0.098,0.387-0.096V30.93h13.141c0.291,0,0.48-0.193,0.48-0.388v-12.8c0-0.385-0.189-0.481-0.578-0.481H25.333
+ L25.43,7.539z"/>
+ <path fill="#194CD8" d="M25.419,7.564c0-0.289-0.289-0.289-0.481-0.192L8.923,23.614c-0.481,0.481-0.386,0.673,0,0.961
+ l16.015,16.05c0.097,0.098,0.386,0.098,0.386-0.098v-9.608h13.118c0.291,0,0.482-0.19,0.482-0.386V17.751
+ c0-0.385-0.191-0.48-0.578-0.48H25.323L25.419,7.564z"/>
+ <path fill="#1A4DD9" d="M25.411,7.59c0-0.288-0.289-0.288-0.479-0.192L8.938,23.615c-0.481,0.48-0.385,0.671,0,0.96L24.93,40.598
+ c0.096,0.096,0.385,0.096,0.385-0.096v-9.595h13.102c0.289,0,0.48-0.192,0.48-0.386V17.762c0-0.384-0.191-0.479-0.578-0.479
+ H25.314L25.411,7.59z"/>
+ <path fill="#1B4ED9" d="M25.4,7.618c0-0.288-0.289-0.288-0.479-0.191L8.954,23.616c-0.481,0.479-0.385,0.67,0,0.958L24.919,40.57
+ c0.099,0.097,0.386,0.097,0.386-0.096v-9.58h13.082c0.288,0,0.479-0.189,0.479-0.383V17.771c0-0.383-0.191-0.479-0.576-0.479
+ H25.305L25.4,7.618z"/>
+ <path fill="#1C4FDA" d="M25.393,7.645c0-0.287-0.289-0.287-0.48-0.191L8.968,23.617c-0.48,0.479-0.384,0.669,0,0.958
+ l15.941,15.971c0.099,0.097,0.385,0.097,0.385-0.095v-9.562h13.062c0.289,0,0.48-0.193,0.48-0.384V17.782
+ c0-0.383-0.191-0.478-0.577-0.478H25.294L25.393,7.645z"/>
+ <path fill="#1D50DA" d="M25.38,7.67c0-0.287-0.286-0.287-0.479-0.19L8.981,23.617c-0.479,0.478-0.384,0.667,0,0.955L24.9,40.518
+ c0.097,0.096,0.384,0.096,0.384-0.098v-9.548h13.043c0.289,0,0.479-0.188,0.479-0.383V17.792c0-0.382-0.19-0.477-0.576-0.477
+ H25.286L25.38,7.67z"/>
+ <path fill="#1E51DB" d="M25.372,7.698c0-0.287-0.287-0.287-0.479-0.191L8.997,23.618c-0.479,0.477-0.383,0.667,0,0.954
+ L24.893,40.49c0.098,0.095,0.385,0.095,0.385-0.096v-9.533H38.3c0.287,0,0.479-0.189,0.479-0.381V17.803
+ c0-0.382-0.191-0.476-0.574-0.476h-12.93L25.372,7.698z"/>
+ <path fill="#1F52DB" d="M25.361,7.725c0-0.286-0.284-0.286-0.479-0.19L9.012,23.619c-0.478,0.475-0.383,0.666,0,0.951
+ l15.872,15.895c0.097,0.096,0.384,0.096,0.384-0.095v-9.519h13.004c0.287,0,0.479-0.189,0.479-0.381V17.812
+ c0-0.381-0.19-0.476-0.574-0.476H25.268L25.361,7.725z"/>
+ <path fill="#2053DC" d="M25.354,7.75c0-0.286-0.287-0.286-0.479-0.19L9.025,23.619c-0.477,0.475-0.382,0.665,0,0.951
+ l15.849,15.867c0.099,0.095,0.385,0.095,0.385-0.098v-9.501h12.982c0.286,0,0.479-0.188,0.479-0.381V17.823
+ c0-0.38-0.188-0.475-0.574-0.475h-12.89L25.354,7.75z"/>
+ <path fill="#2154DC" d="M25.343,7.777c0-0.286-0.286-0.286-0.477-0.19L9.04,23.619c-0.476,0.475-0.381,0.664,0,0.949L24.867,40.41
+ c0.096,0.095,0.383,0.095,0.383-0.094V30.83h12.965c0.287,0,0.479-0.189,0.479-0.38V17.832c0-0.379-0.188-0.474-0.569-0.474
+ H25.249L25.343,7.777z"/>
+ <path fill="#2255DD" d="M25.333,7.805c0-0.285-0.285-0.285-0.478-0.19L9.056,23.62c-0.476,0.474-0.381,0.663,0,0.948
+ l15.801,15.812c0.098,0.096,0.383,0.096,0.383-0.095v-9.472h12.945c0.285,0,0.477-0.188,0.477-0.381V17.842
+ c0-0.378-0.188-0.473-0.569-0.473H25.238L25.333,7.805z"/>
+ <path fill="#2356DD" d="M25.325,7.832c0-0.284-0.285-0.284-0.478-0.189L9.069,23.621c-0.475,0.473-0.381,0.662,0,0.945
+ l15.779,15.791c0.096,0.094,0.381,0.094,0.381-0.098v-9.451h12.929c0.284,0,0.477-0.189,0.477-0.379V17.853
+ c0-0.378-0.188-0.472-0.569-0.472H25.229L25.325,7.832z"/>
+ <path fill="#2457DE" d="M25.314,7.857c0-0.284-0.285-0.284-0.477-0.189L9.084,23.622c-0.474,0.472-0.38,0.66,0,0.944L24.838,40.33
+ c0.098,0.094,0.381,0.094,0.381-0.094v-9.439h12.908c0.285,0,0.475-0.189,0.475-0.378V17.863c0-0.378-0.188-0.471-0.567-0.471
+ H25.221L25.314,7.857z"/>
+ <path fill="#2558DE" d="M25.305,7.883c0-0.283-0.283-0.283-0.474-0.188L9.099,23.622c-0.473,0.471-0.379,0.659,0,0.942
+ L24.831,40.3c0.095,0.097,0.379,0.097,0.379-0.094v-9.424H38.1c0.284,0,0.475-0.188,0.475-0.38V17.873
+ c0-0.377-0.188-0.47-0.568-0.47H25.21L25.305,7.883z"/>
+ <path fill="#2659DF" d="M25.294,7.911c0-0.283-0.282-0.283-0.474-0.188l-15.708,15.9c-0.473,0.47-0.378,0.658,0,0.941
+ L24.82,40.275c0.097,0.094,0.38,0.094,0.38-0.094v-9.408h12.868c0.285,0,0.476-0.188,0.476-0.377V17.882
+ c0-0.376-0.188-0.469-0.567-0.469H25.2L25.294,7.911z"/>
+ <path fill="#275ADF" d="M25.286,7.938c0-0.282-0.283-0.282-0.474-0.188L9.127,23.624c-0.472,0.469-0.378,0.657,0,0.938
+ L24.812,40.25c0.097,0.094,0.379,0.094,0.379-0.093v-9.394h12.851c0.283,0,0.476-0.188,0.476-0.379V17.894
+ c0-0.375-0.188-0.469-0.566-0.469h-12.76L25.286,7.938z"/>
+ <path fill="#285BE0" d="M25.275,7.963c0-0.282-0.282-0.282-0.473-0.188L9.143,23.624c-0.471,0.469-0.377,0.656,0,0.938
+ l15.662,15.658c0.096,0.094,0.379,0.094,0.379-0.094V30.75h12.83c0.282,0,0.473-0.188,0.473-0.376V17.902
+ c0-0.375-0.188-0.468-0.564-0.468h-12.74L25.275,7.963z"/>
+ <path fill="#295CE0" d="M25.268,7.991c0-0.281-0.283-0.281-0.474-0.188L9.158,23.624c-0.471,0.468-0.377,0.655,0,0.937
+ l15.638,15.633c0.095,0.096,0.377,0.096,0.377-0.092V30.74h12.812c0.283,0,0.473-0.188,0.473-0.375V17.914
+ c0-0.375-0.188-0.467-0.564-0.467H25.171L25.268,7.991z"/>
+ <path fill="#2A5DE1" d="M25.257,8.018c0-0.281-0.282-0.281-0.471-0.188L9.171,23.625c-0.47,0.467-0.377,0.654,0,0.936
+ l15.615,15.605c0.094,0.093,0.377,0.093,0.377-0.093v-9.347h12.793c0.28,0,0.471-0.188,0.471-0.375V17.923
+ c0-0.374-0.188-0.467-0.563-0.467h-12.7L25.257,8.018z"/>
+ <path fill="#2B5EE1" d="M25.247,8.043c0-0.28-0.28-0.28-0.472-0.187L9.187,23.625c-0.469,0.467-0.376,0.653,0,0.934l15.59,15.582
+ c0.096,0.092,0.377,0.092,0.377-0.094v-9.33h12.773c0.28,0,0.471-0.188,0.471-0.373v-12.41c0-0.373-0.188-0.466-0.562-0.466
+ H25.152L25.247,8.043z"/>
+ <path fill="#2C5FE2" d="M25.238,8.07c0-0.28-0.282-0.28-0.471-0.186L9.201,23.625c-0.468,0.466-0.375,0.652,0,0.932L24.77,40.114
+ c0.096,0.093,0.375,0.093,0.375-0.095v-9.312h12.754c0.281,0,0.471-0.188,0.471-0.373V17.943c0-0.373-0.188-0.465-0.562-0.465
+ H25.145L25.238,8.07z"/>
+ <path fill="#2D60E2" d="M25.229,8.097c0-0.28-0.279-0.28-0.469-0.187L9.214,23.626c-0.468,0.465-0.375,0.651,0,0.931L24.76,40.086
+ c0.094,0.094,0.374,0.094,0.374-0.093v-9.3H37.87c0.278,0,0.469-0.188,0.469-0.371V17.954c0-0.372-0.188-0.464-0.562-0.464H25.134
+ L25.229,8.097z"/>
+ <path fill="#2E61E3" d="M25.219,8.124c0-0.279-0.281-0.279-0.468-0.186L9.229,23.627c-0.467,0.464-0.375,0.649,0,0.928
+ l15.522,15.506c0.095,0.094,0.373,0.094,0.373-0.094v-9.281h12.718c0.28,0,0.467-0.188,0.467-0.373v-12.35
+ c0-0.371-0.187-0.463-0.562-0.463H25.124L25.219,8.124z"/>
+ <path fill="#2F62E3" d="M25.208,8.15c0-0.279-0.278-0.279-0.467-0.186L9.245,23.628c-0.466,0.463-0.374,0.648,0,0.927
+ l15.499,15.479c0.094,0.093,0.373,0.093,0.373-0.095v-9.268h12.695c0.28,0,0.469-0.186,0.469-0.371V17.975
+ c0-0.371-0.188-0.463-0.562-0.463H25.116L25.208,8.15z"/>
+ <path fill="#3063E4" d="M25.2,8.177c0-0.278-0.279-0.278-0.468-0.185L9.259,23.628c-0.465,0.462-0.373,0.647,0,0.925l15.476,15.45
+ c0.094,0.093,0.373,0.093,0.373-0.092V30.66h12.678c0.279,0,0.467-0.188,0.467-0.371V17.984c0-0.37-0.188-0.462-0.561-0.462
+ H25.105L25.2,8.177z"/>
+ <path fill="#3164E4" d="M25.189,8.204c0-0.277-0.278-0.277-0.465-0.185L9.273,23.629c-0.465,0.462-0.373,0.646,0,0.924
+ l15.452,15.426c0.092,0.092,0.371,0.092,0.371-0.092v-9.238h12.658c0.279,0,0.467-0.187,0.467-0.371V17.995
+ c0-0.37-0.188-0.461-0.561-0.461H25.098L25.189,8.204z"/>
+ <path fill="#3265E5" d="M25.182,8.229c0-0.277-0.279-0.277-0.466-0.185L9.289,23.629c-0.464,0.461-0.372,0.645,0,0.921
+ l15.428,15.4c0.094,0.093,0.372,0.093,0.372-0.093v-9.217h12.64c0.276,0,0.465-0.188,0.465-0.369V18.004
+ c0-0.369-0.188-0.46-0.559-0.46H25.087L25.182,8.229z"/>
+ <path fill="#3366E5" d="M25.171,8.256c0-0.276-0.278-0.276-0.465-0.184L9.304,23.63c-0.463,0.46-0.372,0.644,0,0.92l15.404,15.373
+ c0.093,0.093,0.371,0.093,0.371-0.092v-9.205h12.619c0.276,0,0.465-0.185,0.465-0.369V18.015c0-0.368-0.188-0.459-0.56-0.459
+ H25.079L25.171,8.256z"/>
+ <path fill="#3366E6" d="M25.161,8.284c0-0.276-0.276-0.276-0.463-0.184L9.317,23.631c-0.462,0.459-0.371,0.643,0,0.919
+ l15.381,15.347c0.094,0.095,0.37,0.095,0.37-0.09v-9.188h12.601c0.279,0,0.466-0.187,0.466-0.368V18.024
+ c0-0.367-0.187-0.458-0.558-0.458H25.068L25.161,8.284z"/>
+ <path fill="#3467E6" d="M25.15,8.311c0-0.276-0.276-0.276-0.463-0.184L9.332,23.631c-0.462,0.459-0.371,0.642,0,0.917
+ L24.688,39.87c0.096,0.091,0.371,0.091,0.371-0.093v-9.174h12.582c0.276,0,0.463-0.187,0.463-0.369V18.035
+ c0-0.367-0.187-0.458-0.558-0.458H25.059L25.15,8.311z"/>
+ <path fill="#3568E7" d="M25.143,8.336c0-0.275-0.277-0.275-0.463-0.183L9.347,23.632c-0.461,0.458-0.37,0.641,0,0.917
+ L24.68,39.846c0.094,0.092,0.37,0.092,0.37-0.093v-9.157h12.562c0.277,0,0.463-0.186,0.463-0.367V18.044
+ c0-0.366-0.186-0.457-0.555-0.457H25.05L25.143,8.336z"/>
+ <path fill="#3669E7" d="M25.133,8.364c0-0.275-0.277-0.275-0.462-0.183L9.361,23.632c-0.461,0.458-0.369,0.64,0,0.916
+ l15.31,15.271c0.095,0.093,0.369,0.093,0.369-0.09v-9.146h12.543c0.276,0,0.463-0.185,0.463-0.367V18.055
+ c0-0.365-0.187-0.456-0.555-0.456H25.04L25.133,8.364z"/>
+ <path fill="#376AE8" d="M25.122,8.39c0-0.274-0.274-0.274-0.461-0.183L9.375,23.633c-0.459,0.457-0.368,0.639,0,0.914
+ L24.663,39.79c0.092,0.091,0.366,0.091,0.366-0.091V30.57h12.525c0.275,0,0.461-0.184,0.461-0.364V18.064
+ c0-0.365-0.186-0.455-0.555-0.455H25.029L25.122,8.39z"/>
+ <path fill="#386BE8" d="M25.113,8.417c0-0.274-0.276-0.274-0.461-0.183L9.39,23.634c-0.459,0.456-0.368,0.638,0,0.912
+ l15.262,15.218c0.095,0.09,0.369,0.09,0.369-0.091v-9.112h12.504c0.275,0,0.461-0.184,0.461-0.365v-12.12
+ c0-0.364-0.186-0.455-0.553-0.455H25.021L25.113,8.417z"/>
+ <path fill="#396CE9" d="M25.104,8.442c0-0.273-0.273-0.273-0.459-0.182L9.405,23.636c-0.458,0.455-0.368,0.636,0,0.909
+ l15.24,15.189c0.092,0.093,0.367,0.093,0.367-0.09v-9.097h12.485c0.274,0,0.459-0.183,0.459-0.364v-12.1
+ c0-0.363-0.185-0.454-0.552-0.454H25.012L25.104,8.442z"/>
+ <path fill="#3A6DE9" d="M25.094,8.47c0-0.273-0.273-0.273-0.457-0.182L9.419,23.636c-0.458,0.455-0.367,0.636,0,0.908
+ l15.216,15.165c0.092,0.091,0.367,0.091,0.367-0.09v-9.081h12.466c0.274,0,0.459-0.185,0.459-0.364V18.096
+ c0-0.363-0.185-0.453-0.552-0.453H25.003L25.094,8.47z"/>
+ <path fill="#3B6EEA" d="M25.085,8.497c0-0.272-0.274-0.272-0.459-0.181L9.435,23.637c-0.457,0.453-0.366,0.634,0,0.906
+ l15.193,15.141c0.093,0.09,0.365,0.09,0.365-0.092v-9.064h12.446c0.271,0,0.457-0.182,0.457-0.361v-12.06
+ c0-0.362-0.186-0.452-0.549-0.452H24.993L25.085,8.497z"/>
+ <path fill="#3C6FEA" d="M25.075,8.522c0-0.272-0.272-0.272-0.457-0.181L9.449,23.637c-0.457,0.453-0.366,0.633,0,0.905
+ l15.169,15.112c0.092,0.091,0.362,0.091,0.362-0.09v-9.051h12.431c0.272,0,0.457-0.183,0.457-0.363V18.116
+ c0-0.362-0.185-0.452-0.55-0.452H24.982L25.075,8.522z"/>
+ <path fill="#3D70EB" d="M25.064,8.549c0-0.271-0.272-0.271-0.455-0.181L9.462,23.638c-0.455,0.452-0.365,0.632,0,0.903
+ l15.147,15.087c0.093,0.093,0.363,0.093,0.363-0.089v-9.035h12.409c0.272,0,0.456-0.181,0.456-0.359v-12.02
+ c0-0.361-0.184-0.451-0.549-0.451H24.975L25.064,8.549z"/>
+ <path fill="#3E71EB" d="M25.057,8.577c0-0.271-0.273-0.271-0.455-0.181L9.478,23.639c-0.455,0.451-0.364,0.631,0,0.901
+ l15.124,15.062c0.09,0.09,0.362,0.09,0.362-0.09v-9.021h12.392c0.272,0,0.455-0.183,0.455-0.361V18.136
+ c0-0.36-0.183-0.45-0.547-0.45h-12.3L25.057,8.577z"/>
+ <path fill="#3F72EC" d="M25.046,8.603c0-0.27-0.272-0.27-0.455-0.18L9.493,23.639c-0.454,0.45-0.364,0.63,0,0.9l15.099,15.035
+ c0.092,0.09,0.364,0.09,0.364-0.09V30.48h12.369c0.272,0,0.454-0.183,0.454-0.359V18.146c0-0.36-0.182-0.449-0.547-0.449H24.956
+ L25.046,8.603z"/>
+ <path fill="#4073EC" d="M25.038,8.629c0-0.27-0.272-0.27-0.455-0.18L9.506,23.64c-0.453,0.45-0.363,0.629,0,0.898l15.075,15.01
+ c0.092,0.091,0.362,0.091,0.362-0.09v-8.985h12.353c0.272,0,0.455-0.183,0.455-0.361V18.157c0-0.359-0.183-0.448-0.545-0.448
+ H24.945L25.038,8.629z"/>
+ <path fill="#4174ED" d="M25.027,8.656c0-0.269-0.272-0.269-0.454-0.179L9.521,23.641c-0.453,0.449-0.363,0.627,0,0.896
+ L24.573,39.52c0.092,0.09,0.362,0.09,0.362-0.09v-8.972h12.332c0.271,0,0.453-0.181,0.453-0.36V18.166
+ c0-0.358-0.182-0.447-0.544-0.447H24.938L25.027,8.656z"/>
+ <path fill="#4275ED" d="M25.018,8.683c0-0.269-0.271-0.269-0.453-0.179L9.537,23.641c-0.452,0.448-0.362,0.626,0,0.896
+ l15.027,14.957c0.092,0.09,0.362,0.09,0.362-0.09v-8.955h12.312c0.271,0,0.453-0.18,0.453-0.359V18.177
+ c0-0.358-0.182-0.447-0.543-0.447H24.927L25.018,8.683z"/>
+ <path fill="#4376EE" d="M25.008,8.709c0-0.269-0.271-0.269-0.451-0.179L9.551,23.642c-0.451,0.447-0.361,0.625,0,0.895
+ l15.006,14.932c0.09,0.09,0.36,0.09,0.36-0.089v-8.94H37.21c0.271,0,0.453-0.18,0.453-0.356V18.187
+ c0-0.357-0.183-0.446-0.543-0.446H24.917L25.008,8.709z"/>
+ <path fill="#4477EE" d="M24.997,8.735c0-0.268-0.271-0.268-0.45-0.179L9.564,23.642c-0.45,0.446-0.361,0.625,0,0.893
+ l14.982,14.904c0.091,0.09,0.36,0.09,0.36-0.088v-8.928H37.18c0.271,0,0.451-0.179,0.451-0.355V18.197
+ c0-0.356-0.181-0.445-0.542-0.445h-12.18L24.997,8.735z"/>
+ <path fill="#4578EF" d="M24.988,8.763c0-0.268-0.271-0.268-0.449-0.178L9.58,23.643c-0.449,0.445-0.36,0.623,0,0.891l14.958,14.88
+ c0.09,0.089,0.358,0.089,0.358-0.089v-8.909h12.256c0.271,0,0.451-0.18,0.451-0.357V18.207c0-0.356-0.182-0.444-0.541-0.444
+ H24.898L24.988,8.763z"/>
+ <path fill="#4679EF" d="M24.979,8.79c0-0.267-0.271-0.267-0.449-0.178L9.595,23.644c-0.449,0.445-0.36,0.622,0,0.891
+ l14.934,14.851c0.091,0.091,0.359,0.091,0.359-0.088v-8.896h12.234c0.271,0,0.451-0.18,0.451-0.355V18.216
+ c0-0.355-0.184-0.443-0.541-0.443H24.891L24.979,8.79z"/>
+ <path fill="#477AF0" d="M24.971,8.815c0-0.267-0.271-0.267-0.451-0.178L9.608,23.644c-0.448,0.444-0.359,0.621,0,0.889
+ L24.52,39.357c0.09,0.09,0.36,0.09,0.36-0.088v-8.879h12.218c0.27,0,0.448-0.18,0.448-0.354V18.228
+ c0-0.355-0.183-0.443-0.541-0.443H24.88L24.971,8.815z"/>
+ <path fill="#487BF0" d="M24.96,8.842c0-0.266-0.271-0.266-0.448-0.177L9.624,23.645c-0.448,0.443-0.359,0.62,0,0.888
+ l14.888,14.801c0.09,0.088,0.358,0.088,0.358-0.088v-8.863h12.196c0.271,0,0.449-0.178,0.449-0.355v-11.79
+ c0-0.354-0.182-0.442-0.539-0.442H24.87L24.96,8.842z"/>
+ <path fill="#497CF1" d="M24.95,8.87c0-0.266-0.269-0.266-0.447-0.177L9.638,23.645c-0.447,0.442-0.358,0.619,0,0.886
+ l14.865,14.773c0.09,0.09,0.356,0.09,0.356-0.09v-8.846H37.04c0.271,0,0.446-0.18,0.446-0.354V18.248
+ c0-0.353-0.18-0.441-0.536-0.441H24.859L24.95,8.87z"/>
+ <path fill="#4A7DF1" d="M24.939,8.896c0-0.265-0.268-0.265-0.446-0.177L9.652,23.646c-0.446,0.442-0.357,0.618,0,0.883
+ l14.841,14.75c0.089,0.088,0.358,0.088,0.358-0.088v-8.832H37.01c0.27,0,0.448-0.178,0.448-0.354V18.257
+ c0-0.353-0.183-0.44-0.537-0.44H24.852L24.939,8.896z"/>
+ <path fill="#4B7EF2" d="M24.932,8.922c0-0.265-0.269-0.265-0.447-0.177L9.667,23.646c-0.445,0.441-0.357,0.617,0,0.881
+ l14.818,14.724c0.089,0.088,0.357,0.088,0.357-0.088V30.35h12.141c0.268,0,0.447-0.18,0.447-0.354V18.268
+ c0-0.353-0.181-0.44-0.537-0.44H24.842L24.932,8.922z"/>
+ <path fill="#4C7FF2" d="M24.921,8.949c0-0.264-0.269-0.264-0.445-0.176L9.682,23.646c-0.444,0.44-0.356,0.616,0,0.879
+ l14.794,14.697c0.088,0.088,0.355,0.088,0.355-0.089v-8.801h12.121c0.269,0,0.444-0.177,0.444-0.354V18.277
+ c0-0.352-0.18-0.438-0.535-0.438h-12.03L24.921,8.949z"/>
+ <path fill="#4D80F3" d="M24.913,8.976c0-0.264-0.269-0.264-0.444-0.176L9.697,23.647c-0.444,0.439-0.356,0.615,0,0.878
+ l14.771,14.672c0.091,0.088,0.355,0.088,0.355-0.088v-8.784h12.102c0.269,0,0.445-0.179,0.445-0.354V18.288
+ c0-0.351-0.181-0.438-0.535-0.438H24.823L24.913,8.976z"/>
+ <path fill="#4E81F3" d="M24.902,9.002c0-0.264-0.268-0.264-0.444-0.176L9.71,23.647c-0.443,0.439-0.355,0.614,0,0.876
+ L24.458,39.17c0.089,0.088,0.354,0.088,0.354-0.087v-8.771h12.082c0.268,0,0.444-0.176,0.444-0.354V18.297
+ c0-0.35-0.178-0.437-0.532-0.437H24.812L24.902,9.002z"/>
+ <path fill="#4F82F4" d="M24.895,9.028c0-0.263-0.269-0.263-0.444-0.175L9.726,23.648c-0.442,0.438-0.354,0.612,0,0.875
+ L24.45,39.145c0.089,0.088,0.354,0.088,0.354-0.086v-8.754h12.062c0.267,0,0.442-0.178,0.442-0.354V18.308
+ c0-0.349-0.18-0.436-0.533-0.436H24.805L24.895,9.028z"/>
+ <path fill="#5083F4" d="M24.884,9.056c0-0.262-0.268-0.262-0.443-0.175L9.74,23.649c-0.441,0.437-0.354,0.611,0,0.875l14.7,14.595
+ c0.089,0.087,0.354,0.087,0.354-0.087v-8.737h12.045c0.267,0,0.44-0.176,0.44-0.353V18.317c0-0.349-0.178-0.436-0.53-0.436H24.794
+ L24.884,9.056z"/>
+ <path fill="#5184F5" d="M24.874,9.082c0-0.262-0.269-0.262-0.442-0.175L9.754,23.649c-0.441,0.437-0.354,0.61,0,0.873
+ l14.677,14.566c0.088,0.088,0.354,0.088,0.354-0.086v-8.723h12.025c0.266,0,0.44-0.176,0.44-0.35V18.329
+ c0-0.348-0.176-0.435-0.53-0.435H24.786L24.874,9.082z"/>
+ <path fill="#5285F5" d="M24.863,9.108c0-0.262-0.264-0.262-0.44-0.174L9.769,23.65c-0.44,0.436-0.353,0.609,0,0.872l14.654,14.541
+ c0.089,0.086,0.353,0.086,0.353-0.086V30.27h12.008c0.264,0,0.439-0.176,0.439-0.351V18.338c0-0.348-0.177-0.434-0.529-0.434
+ H24.775L24.863,9.108z"/>
+ <path fill="#5386F6" d="M24.854,9.136c0-0.261-0.266-0.261-0.44-0.174l-14.63,14.69c-0.439,0.435-0.353,0.608,0,0.87l14.63,14.517
+ c0.089,0.087,0.353,0.087,0.353-0.086V30.26H36.75c0.266,0,0.439-0.175,0.439-0.349V18.349c0-0.347-0.176-0.433-0.527-0.433
+ H24.768L24.854,9.136z"/>
+ <path fill="#5487F6" d="M24.846,9.163c0-0.261-0.265-0.261-0.441-0.174L9.798,23.651c-0.439,0.434-0.352,0.607,0,0.867
+ l14.606,14.49c0.088,0.086,0.352,0.086,0.352-0.086v-8.676h11.967c0.264,0,0.439-0.176,0.439-0.35V18.358
+ c0-0.346-0.178-0.432-0.527-0.432H24.757L24.846,9.163z"/>
+ <path fill="#5588F7" d="M24.835,9.188c0-0.26-0.265-0.26-0.439-0.173L9.812,23.652c-0.438,0.433-0.352,0.606,0,0.866L24.395,38.98
+ c0.088,0.088,0.352,0.088,0.352-0.086v-8.66h11.946c0.265,0,0.439-0.174,0.439-0.348V18.369c0-0.346-0.178-0.432-0.527-0.432
+ H24.747L24.835,9.188z"/>
+ <path fill="#5689F7" d="M24.827,9.215c0-0.26-0.265-0.26-0.438-0.173L9.828,23.653c-0.437,0.432-0.351,0.604,0,0.865l14.56,14.438
+ c0.088,0.086,0.352,0.086,0.352-0.086v-8.646h11.928c0.266,0,0.438-0.176,0.438-0.349v-11.5c0-0.345-0.176-0.431-0.525-0.431
+ H24.74L24.827,9.215z"/>
+ <path fill="#578AF8" d="M24.816,9.242c0-0.259-0.264-0.259-0.438-0.172L9.842,23.653c-0.437,0.432-0.35,0.604,0,0.863
+ l14.537,14.41c0.088,0.086,0.35,0.086,0.35-0.086v-8.629h11.91c0.262,0,0.438-0.173,0.438-0.346V18.389
+ c0-0.344-0.176-0.43-0.524-0.43H24.729L24.816,9.242z"/>
+ <path fill="#588BF8" d="M24.807,9.269c0-0.259-0.262-0.259-0.437-0.172L9.856,23.655c-0.436,0.431-0.35,0.603,0,0.863
+ L24.37,38.898c0.088,0.086,0.349,0.086,0.349-0.084v-8.612h11.891c0.264,0,0.438-0.175,0.438-0.347V18.398
+ c0-0.344-0.176-0.429-0.524-0.429H24.719L24.807,9.269z"/>
+ <path fill="#598CF9" d="M24.796,9.294c0-0.258-0.261-0.258-0.438-0.172L9.872,23.655c-0.435,0.43-0.349,0.602,0,0.861
+ L24.36,38.872c0.088,0.086,0.35,0.086,0.35-0.085v-8.602h11.871c0.263,0,0.438-0.172,0.438-0.344V18.41
+ c0-0.343-0.177-0.429-0.522-0.429H24.71L24.796,9.294z"/>
+ <path fill="#5A8DF9" d="M24.788,9.322c0-0.258-0.263-0.258-0.437-0.172L9.886,23.656c-0.435,0.429-0.349,0.6,0,0.857
+ l14.466,14.334c0.088,0.086,0.349,0.086,0.349-0.088v-8.58h11.854c0.262,0,0.438-0.174,0.438-0.346V18.418
+ c0-0.342-0.177-0.427-0.522-0.427H24.7L24.788,9.322z"/>
+ <path fill="#5B8EFA" d="M24.777,9.349c0-0.257-0.262-0.257-0.436-0.171L9.9,23.657c-0.434,0.428-0.348,0.6,0,0.856L24.342,38.82
+ c0.087,0.086,0.348,0.086,0.348-0.084v-8.567h11.834c0.261,0,0.437-0.172,0.437-0.344V18.43c0-0.342-0.176-0.427-0.522-0.427
+ H24.689L24.777,9.349z"/>
+ <path fill="#5C8FFA" d="M24.77,9.375c0-0.257-0.262-0.257-0.436-0.171L9.915,23.657c-0.433,0.428-0.348,0.599,0,0.854
+ l14.419,14.281c0.087,0.086,0.348,0.086,0.348-0.085v-8.551h11.812c0.262,0,0.438-0.174,0.438-0.346V18.439
+ c0-0.341-0.176-0.426-0.521-0.426H24.682L24.77,9.375z"/>
+ <path fill="#5D90FB" d="M24.759,9.401c0-0.256-0.26-0.256-0.434-0.17L9.93,23.658c-0.432,0.427-0.347,0.597,0,0.855l14.396,14.254
+ c0.087,0.086,0.347,0.086,0.347-0.084v-8.537h11.794c0.26,0,0.436-0.172,0.436-0.342V18.45c0-0.341-0.176-0.425-0.521-0.425
+ h-11.71L24.759,9.401z"/>
+ <path fill="#5E91FB" d="M24.749,9.429c0-0.256-0.26-0.256-0.435-0.17l-14.371,14.4c-0.432,0.426-0.346,0.596,0,0.852L24.315,38.74
+ c0.087,0.085,0.346,0.085,0.346-0.086v-8.521h11.774c0.26,0,0.435-0.172,0.435-0.342V18.459c0-0.34-0.175-0.424-0.521-0.424
+ H24.663L24.749,9.429z"/>
+ <path fill="#5F92FC" d="M24.741,9.455c0-0.255-0.261-0.255-0.434-0.17L9.958,23.659c-0.431,0.425-0.346,0.595,0,0.851
+ l14.349,14.202c0.087,0.085,0.345,0.085,0.345-0.084v-8.505h11.757c0.258,0,0.434-0.171,0.434-0.341V18.47
+ c0-0.339-0.176-0.423-0.521-0.423h-11.67L24.741,9.455z"/>
+ <path fill="#6093FC" d="M24.73,9.481c0-0.255-0.259-0.255-0.433-0.17L9.974,23.66c-0.43,0.425-0.345,0.594,0,0.849l14.325,14.179
+ c0.087,0.084,0.346,0.084,0.346-0.084v-8.489H36.38c0.259,0,0.433-0.171,0.433-0.341V18.479c0-0.339-0.174-0.423-0.521-0.423
+ H24.645L24.73,9.481z"/>
+ <path fill="#6194FD" d="M24.721,9.507c0-0.254-0.259-0.254-0.431-0.169L9.988,23.661c-0.43,0.424-0.345,0.593,0,0.847
+ l14.302,14.15c0.086,0.085,0.344,0.085,0.344-0.084V30.1h11.718c0.258,0,0.432-0.17,0.432-0.342v-11.27
+ c0-0.338-0.174-0.422-0.518-0.422H24.634L24.721,9.507z"/>
+ <path fill="#6295FD" d="M24.71,9.535c0-0.254-0.257-0.254-0.429-0.169L10.002,23.661c-0.429,0.423-0.344,0.592,0,0.846
+ L24.28,38.631c0.086,0.085,0.343,0.085,0.343-0.083V30.09H36.32c0.258,0,0.432-0.17,0.432-0.34V18.5
+ c0-0.337-0.174-0.421-0.52-0.421H24.623L24.71,9.535z"/>
+ <path fill="#6396FE" d="M24.702,9.561c0-0.253-0.259-0.253-0.43-0.169l-14.256,14.27c-0.428,0.422-0.343,0.591,0,0.844
+ l14.255,14.1c0.086,0.084,0.342,0.084,0.342-0.084V30.08h11.681c0.258,0,0.431-0.17,0.431-0.338v-11.23
+ c0-0.337-0.173-0.42-0.517-0.42H24.616L24.702,9.561z"/>
+ <path fill="#6497FE" d="M24.691,9.587c0-0.253-0.257-0.253-0.429-0.168l-14.23,14.243c-0.427,0.422-0.343,0.59,0,0.843
+ l14.231,14.072c0.086,0.084,0.342,0.084,0.342-0.083v-8.428h11.66c0.258,0,0.43-0.17,0.43-0.338V18.521
+ c0-0.336-0.172-0.42-0.516-0.42H24.605L24.691,9.587z"/>
+ <path fill="#6598FF" d="M24.684,9.615c0-0.252-0.258-0.252-0.43-0.168L10.045,23.663c-0.426,0.42-0.342,0.588,0,0.841
+ l14.208,14.047c0.086,0.084,0.343,0.084,0.343-0.084v-8.41h11.641c0.257,0,0.429-0.168,0.429-0.336V18.531
+ c0-0.335-0.172-0.418-0.515-0.418H24.598L24.684,9.615z"/>
+ <path fill="#6699FF" d="M24.673,9.642c0-0.252-0.257-0.252-0.428-0.168L10.06,23.664c-0.426,0.42-0.342,0.587,0,0.839
+ l14.185,14.021c0.086,0.084,0.342,0.084,0.342-0.084v-8.396h11.621c0.256,0,0.429-0.169,0.429-0.337V18.541
+ c0-0.335-0.173-0.418-0.515-0.418H24.587L24.673,9.642z"/>
+ </g>
+
+ <linearGradient id="XMLID_16_" gradientUnits="userSpaceOnUse" x1="-1112.2041" y1="1225.4229" x2="-1112.2041" y2="1254.5781" gradientTransform="matrix(-1 0 0 1 -1089 -1216)">
+ <stop offset="0" style="stop-color:#FFFFFF"/>
+ <stop offset="1" style="stop-color:#6699FF"/>
+ </linearGradient>
+ <path fill="url(#XMLID_16_)" d="M24.673,9.642c0-0.252-0.257-0.252-0.428-0.168L10.06,23.664c-0.426,0.42-0.342,0.587,0,0.839
+ l14.185,14.021c0.086,0.084,0.342,0.084,0.342-0.084v-8.396h11.621c0.256,0,0.429-0.169,0.429-0.337V18.541
+ c0-0.335-0.173-0.418-0.515-0.418H24.587L24.673,9.642z"/>
+</g>
+<g id="crop_x0020_marks">
+ <path fill="none" d="M-0.06,0.001h48v48h-48V0.001z"/>
+</g>
+</svg>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/colorsvg/tip.svg b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/colorsvg/tip.svg
new file mode 100644
index 0000000..7ec92e3
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/colorsvg/tip.svg
@@ -0,0 +1,367 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 12.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 51448) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [
+ <!ENTITY ns_svg "http://www.w3.org/2000/svg">
+ <!ENTITY ns_xlink "http://www.w3.org/1999/xlink">
+]>
+<svg version="1.1" id="Tip" xmlns="&ns_svg;" xmlns:xlink="&ns_xlink;" width="48" height="48" viewBox="0 0 48 48"
+ overflow="visible" enable-background="new 0 0 48 48" xml:space="preserve">
+<g>
+ <path stroke="#FFFFFF" stroke-width="5.6139" d="M9.525,18.6c0,8,6.5,14.4,14.4,14.4c8.001,0,14.399-6.5,14.399-14.4
+ c0-8-6.5-14.4-14.399-14.4C15.925,4.2,9.525,10.7,9.525,18.6z M12.825,18.6c0-6.2,5-11.2,11.2-11.2c6.2,0,11.2,5,11.2,11.2
+ c0,6.2-5,11.2-11.2,11.2C17.825,29.8,12.825,24.8,12.825,18.6z"/>
+ <path stroke="#FFFFFF" stroke-width="5.6139" d="M28.125,37.9l-7.6,0.8c-0.9,0.1-1.5,0.899-1.4,1.8s0.9,1.5,1.8,1.4l7.601-0.801
+ c0.9-0.102,1.5-0.899,1.4-1.802C29.824,38.4,29.025,37.8,28.125,37.9z"/>
+ <path stroke="#FFFFFF" stroke-width="5.6139" d="M28.125,34.8l-7.6,0.8c-0.9,0.101-1.5,0.9-1.4,1.801c0.1,0.897,0.9,1.5,1.8,1.397
+ l7.601-0.8c0.9-0.102,1.5-0.898,1.4-1.8C29.824,35.3,29.025,34.7,28.125,34.8z"/>
+ <path stroke="#FFFFFF" stroke-width="5.6139" d="M28.125,31.6l-7.6,0.801c-0.9,0.1-1.5,0.897-1.4,1.8c0.1,0.899,0.9,1.5,1.8,1.399
+ l7.601-0.802c0.9-0.1,1.5-0.897,1.4-1.8C29.824,32.1,29.025,31.5,28.125,31.6z"/>
+ <path stroke="#FFFFFF" stroke-width="5.6139" d="M23.125,41.3v0.9c0,0.899,0.7,1.6,1.6,1.6c0.9,0,1.6-0.7,1.6-1.6v-0.9h-3.299
+ H23.125z"/>
+ <path fill="#FFFFFF" d="M35.926,18.7c0,6.6-5.4,12-12.001,12c-6.6,0-12-5.4-12-12c0-6.6,5.4-12,12-12
+ C30.525,6.7,35.926,12.1,35.926,18.7z"/>
+ <g>
+ <path fill="#FFFF00" d="M9.625,18.6c0,8,6.5,14.4,14.4,14.4c8,0,14.401-6.5,14.401-14.4c0-8-6.5-14.4-14.401-14.4
+ C16.025,4.2,9.625,10.7,9.625,18.6z"/>
+ <path fill="#FFFF01" d="M9.647,18.6c0-7.889,6.391-14.379,14.379-14.379c7.89,0,14.378,6.391,14.378,14.379
+ c0,7.889-6.391,14.378-14.378,14.378C16.137,32.979,9.647,26.588,9.647,18.6z"/>
+ <path fill="#FFFF02" d="M9.668,18.6c0-7.878,6.382-14.358,14.358-14.358c7.878,0,14.359,6.382,14.359,14.358
+ c0,7.876-6.383,14.358-14.359,14.358C16.149,32.958,9.668,26.576,9.668,18.6z"/>
+ <path fill="#FFFF03" d="M9.69,18.6c0-7.867,6.373-14.337,14.337-14.337c7.868,0,14.338,6.373,14.338,14.337
+ c0,7.867-6.373,14.337-14.338,14.337C16.16,32.938,9.69,26.564,9.69,18.6z"/>
+ <path fill="#FFFF04" d="M9.712,18.6c0-7.855,6.363-14.316,14.316-14.316c7.855,0,14.316,6.363,14.316,14.316
+ c0,7.856-6.363,14.316-14.316,14.316C16.172,32.916,9.712,26.553,9.712,18.6z"/>
+ <path fill="#FFFF05" d="M9.733,18.6c0-7.844,6.354-14.295,14.295-14.295c7.847,0,14.296,6.354,14.296,14.295
+ c0,7.843-6.354,14.294-14.296,14.294C16.184,32.896,9.733,26.541,9.733,18.6z"/>
+ <path fill="#FFFF06" d="M9.754,18.6c0-7.833,6.345-14.274,14.274-14.274c7.833,0,14.275,6.345,14.275,14.274
+ c0,7.833-6.346,14.274-14.275,14.274C16.196,32.874,9.754,26.529,9.754,18.6z"/>
+ <path fill="#FFFF07" d="M9.776,18.6c0-7.822,6.336-14.253,14.254-14.253c7.822,0,14.253,6.335,14.253,14.253
+ c0,7.823-6.336,14.253-14.253,14.253C16.208,32.854,9.776,26.518,9.776,18.6z"/>
+ <path fill="#FFFF08" d="M9.798,18.6c0-7.811,6.326-14.232,14.232-14.232c7.812,0,14.234,6.326,14.234,14.232
+ c0,7.811-6.328,14.233-14.234,14.233C16.219,32.833,9.798,26.506,9.798,18.6z"/>
+ <path fill="#FFFF09" d="M9.819,18.6c0-7.8,6.317-14.211,14.211-14.211c7.8,0,14.212,6.317,14.212,14.211
+ c0,7.8-6.318,14.21-14.212,14.21C16.231,32.812,9.819,26.494,9.819,18.6z"/>
+ <path fill="#FFFF0A" d="M9.84,18.6c0-7.789,6.309-14.191,14.191-14.191c7.79,0,14.192,6.309,14.192,14.191
+ c0,7.789-6.309,14.191-14.192,14.191C16.243,32.791,9.84,26.482,9.84,18.6z"/>
+ <path fill="#FFFF0B" d="M9.862,18.6c0-7.778,6.299-14.17,14.17-14.17c7.779,0,14.169,6.299,14.169,14.17
+ c0,7.778-6.299,14.169-14.169,14.169C16.254,32.77,9.862,26.471,9.862,18.6z"/>
+ <path fill="#FFFF0C" d="M9.884,18.6c0-7.767,6.29-14.149,14.149-14.149c7.768,0,14.149,6.29,14.149,14.149
+ c0,7.767-6.291,14.149-14.149,14.149C16.266,32.749,9.884,26.459,9.884,18.6z"/>
+ <path fill="#FFFF0D" d="M9.905,18.6c0-7.756,6.281-14.128,14.128-14.128c7.756,0,14.129,6.281,14.129,14.128
+ c0,7.755-6.281,14.128-14.129,14.128C16.278,32.729,9.905,26.447,9.905,18.6z"/>
+ <path fill="#FFFF0E" d="M9.927,18.6c0-7.745,6.272-14.107,14.107-14.107c7.746,0,14.107,6.272,14.107,14.107
+ c0,7.746-6.27,14.107-14.107,14.107C16.29,32.707,9.927,26.436,9.927,18.6z"/>
+ <path fill="#FFFF0F" d="M9.949,18.6c0-7.733,6.263-14.086,14.086-14.086c7.733,0,14.088,6.262,14.088,14.086
+ c0,7.733-6.266,14.085-14.088,14.085C16.302,32.688,9.949,26.423,9.949,18.6z"/>
+ <path fill="#FFFF10" d="M9.97,18.6c0-7.722,6.253-14.065,14.065-14.065c7.723,0,14.067,6.253,14.067,14.065
+ c0,7.722-6.254,14.066-14.067,14.066C16.313,32.666,9.97,26.411,9.97,18.6z"/>
+ <path fill="#FFFF11" d="M9.992,18.6c0-7.711,6.244-14.044,14.044-14.044c7.712,0,14.044,6.245,14.044,14.044
+ c0,7.71-6.244,14.044-14.044,14.044C16.325,32.645,9.992,26.398,9.992,18.6z"/>
+ <path fill="#FFFF12" d="M10.013,18.6c0-7.7,6.235-14.023,14.023-14.023c7.7,0,14.024,6.235,14.024,14.023
+ c0,7.7-6.236,14.023-14.024,14.023C16.337,32.623,10.013,26.389,10.013,18.6z"/>
+ <path fill="#FFFF13" d="M10.035,18.6c0-7.688,6.226-14.002,14.002-14.002c7.689,0,14.004,6.226,14.004,14.002
+ c0,7.689-6.229,14.001-14.004,14.001C16.348,32.604,10.035,26.376,10.035,18.6z"/>
+ <path fill="#FFFF14" d="M10.057,18.6c0-7.678,6.217-13.981,13.981-13.981c7.679,0,13.981,6.217,13.981,13.981
+ c0,7.677-6.217,13.981-13.981,13.981C16.36,32.581,10.057,26.364,10.057,18.6z"/>
+ <path fill="#FFFF15" d="M10.078,18.6c0-7.667,6.208-13.961,13.961-13.961C31.707,4.639,38,10.847,38,18.6
+ c0,7.667-6.209,13.96-13.961,13.96C16.372,32.561,10.078,26.354,10.078,18.6z"/>
+ <path fill="#FFFF16" d="M10.1,18.6c0-7.655,6.198-13.94,13.939-13.94c7.656,0,13.941,6.199,13.941,13.94
+ c0,7.656-6.201,13.94-13.941,13.94C16.384,32.54,10.1,26.341,10.1,18.6z"/>
+ <path fill="#FFFF17" d="M10.121,18.6c0-7.644,6.189-13.919,13.919-13.919c7.646,0,13.919,6.189,13.919,13.919
+ c0,7.644-6.189,13.917-13.919,13.917C16.396,32.52,10.121,26.329,10.121,18.6z"/>
+ <path fill="#FFFF18" d="M10.143,18.6c0-7.633,6.181-13.898,13.898-13.898c7.633,0,13.898,6.18,13.898,13.898
+ c0,7.632-6.182,13.898-13.898,13.898C16.408,32.498,10.143,26.316,10.143,18.6z"/>
+ <path fill="#FFFF19" d="M10.164,18.6c0-7.622,6.171-13.877,13.877-13.877c7.623,0,13.877,6.171,13.877,13.877
+ c0,7.623-6.172,13.876-13.877,13.876C16.419,32.479,10.164,26.307,10.164,18.6z"/>
+ <path fill="#FFFF1A" d="M10.186,18.6c0-7.611,6.162-13.856,13.856-13.856c7.61,0,13.856,6.162,13.856,13.856
+ c0,7.611-6.162,13.856-13.856,13.856C16.431,32.456,10.186,26.294,10.186,18.6z"/>
+ <path fill="#FFFF1B" d="M10.208,18.6c0-7.6,6.153-13.835,13.835-13.835c7.602,0,13.836,6.153,13.836,13.835
+ c0,7.6-6.152,13.835-13.836,13.835C16.443,32.436,10.208,26.282,10.208,18.6z"/>
+ <path fill="#FFFF1C" d="M10.229,18.6c0-7.589,6.144-13.814,13.814-13.814c7.59,0,13.814,6.144,13.814,13.814
+ c0,7.587-6.145,13.814-13.814,13.814C16.454,32.414,10.229,26.271,10.229,18.6z"/>
+ <path fill="#FFFF1D" d="M10.251,18.6c0-7.578,6.135-13.793,13.793-13.793c7.579,0,13.794,6.135,13.794,13.793
+ c0,7.578-6.137,13.792-13.794,13.792C16.466,32.395,10.251,26.259,10.251,18.6z"/>
+ <path fill="#FFFF1E" d="M10.272,18.6c0-7.566,6.125-13.772,13.772-13.772c7.567,0,13.772,6.125,13.772,13.772
+ c0,7.567-6.125,13.773-13.772,13.773C16.478,32.373,10.272,26.247,10.272,18.6z"/>
+ <path fill="#FFFF1F" d="M10.294,18.6c0-7.556,6.116-13.752,13.751-13.752c7.557,0,13.752,6.117,13.752,13.752
+ c0,7.554-6.117,13.751-13.752,13.751C16.49,32.352,10.294,26.234,10.294,18.6z"/>
+ <path fill="#FFFF20" d="M10.315,18.6c0-7.544,6.107-13.731,13.731-13.731c7.544,0,13.731,6.107,13.731,13.731
+ c0,7.544-6.107,13.731-13.731,13.731C16.502,32.331,10.315,26.225,10.315,18.6z"/>
+ <path fill="#FFFF21" d="M10.337,18.6c0-7.533,6.098-13.71,13.709-13.71c7.534,0,13.71,6.098,13.71,13.71
+ c0,7.534-6.1,13.708-13.71,13.708C16.513,32.311,10.337,26.212,10.337,18.6z"/>
+ <path fill="#FFFF22" d="M10.358,18.6c0-7.522,6.088-13.688,13.689-13.688c7.521,0,13.689,6.088,13.689,13.688
+ c0,7.522-6.09,13.689-13.689,13.689C16.525,32.289,10.358,26.199,10.358,18.6z"/>
+ <path fill="#FFFF23" d="M10.38,18.6c0-7.511,6.08-13.668,13.668-13.668c7.511,0,13.669,6.08,13.669,13.668
+ c0,7.511-6.08,13.667-13.669,13.667C16.537,32.268,10.38,26.188,10.38,18.6z"/>
+ <path fill="#FFFF24" d="M10.401,18.6c0-7.5,6.071-13.647,13.647-13.647c7.501,0,13.647,6.07,13.647,13.647
+ c0,7.5-6.07,13.647-13.647,13.647C16.549,32.247,10.401,26.176,10.401,18.6z"/>
+ <path fill="#FFFF25" d="M10.423,18.6c0-7.489,6.062-13.626,13.626-13.626c7.49,0,13.627,6.061,13.627,13.626
+ c0,7.489-6.062,13.625-13.627,13.625C16.56,32.227,10.423,26.164,10.423,18.6z"/>
+ <path fill="#FFFF26" d="M10.445,18.6c0-7.478,6.052-13.605,13.605-13.605c7.478,0,13.606,6.052,13.606,13.605
+ c0,7.478-6.053,13.605-13.606,13.605C16.572,32.205,10.445,26.152,10.445,18.6z"/>
+ <path fill="#FFFF27" d="M10.466,18.6c0-7.467,6.043-13.584,13.584-13.584c7.468,0,13.585,6.043,13.585,13.584
+ c0,7.466-6.043,13.583-13.585,13.583C16.584,32.186,10.466,26.141,10.466,18.6z"/>
+ <path fill="#FFFF28" d="M10.488,18.6c0-7.456,6.034-13.563,13.563-13.563c7.457,0,13.562,6.034,13.562,13.563
+ c0,7.457-6.033,13.563-13.562,13.563C16.596,32.163,10.488,26.129,10.488,18.6z"/>
+ <path fill="#FFFF29" d="M10.509,18.6c0-7.445,6.025-13.542,13.542-13.542c7.445,0,13.543,6.024,13.543,13.542
+ c0,7.444-6.025,13.542-13.543,13.542C16.608,32.143,10.509,26.117,10.509,18.6z"/>
+ <path fill="#FFFF2A" d="M10.531,18.6c0-7.434,6.016-13.522,13.521-13.522c7.435,0,13.521,6.016,13.521,13.522
+ c0,7.433-6.016,13.521-13.521,13.521C16.619,32.121,10.531,26.105,10.531,18.6z"/>
+ <path fill="#FFFF2B" d="M10.552,18.6c0-7.422,6.006-13.501,13.501-13.501c7.422,0,13.502,6.007,13.502,13.501
+ c0,7.421-6.008,13.5-13.502,13.5C16.631,32.102,10.552,26.094,10.552,18.6z"/>
+ <path fill="#FFFF2C" d="M10.574,18.6c0-7.411,5.997-13.479,13.479-13.479c7.412,0,13.48,5.997,13.48,13.479
+ c0,7.411-5.998,13.48-13.48,13.48C16.643,32.08,10.574,26.082,10.574,18.6z"/>
+ <path fill="#FFFF2D" d="M10.596,18.6c0-7.4,5.988-13.458,13.458-13.458c7.401,0,13.46,5.988,13.46,13.458
+ c0,7.4-5.988,13.458-13.46,13.458C16.654,32.059,10.596,26.07,10.596,18.6z"/>
+ <path fill="#FFFF2E" d="M10.617,18.6c0-7.389,5.979-13.438,13.438-13.438c7.389,0,13.438,5.979,13.438,13.438
+ c0,7.389-5.979,13.438-13.438,13.438C16.666,32.038,10.617,26.059,10.617,18.6z"/>
+ <path fill="#FFFF2F" d="M10.639,18.6c0-7.377,5.97-13.417,13.417-13.417c7.377,0,13.417,5.97,13.417,13.417
+ c0,7.376-5.971,13.417-13.417,13.417C16.678,32.018,10.639,26.047,10.639,18.6z"/>
+ <path fill="#FFFF30" d="M10.66,18.6c0-7.366,5.96-13.396,13.396-13.396c7.368,0,13.395,5.961,13.395,13.396
+ c0,7.367-5.961,13.396-13.395,13.396C16.69,31.996,10.66,26.035,10.66,18.6z"/>
+ <path fill="#FFFF31" d="M10.682,18.6c0-7.355,5.951-13.375,13.375-13.375c7.355,0,13.375,5.952,13.375,13.375
+ c0,7.355-5.951,13.375-13.375,13.375C16.701,31.977,10.682,26.023,10.682,18.6z"/>
+ <path fill="#FFFF32" d="M10.703,18.6c0-7.344,5.943-13.354,13.354-13.354c7.343,0,13.355,5.943,13.355,13.354
+ c0,7.343-5.943,13.354-13.355,13.354C16.713,31.954,10.703,26.012,10.703,18.6z"/>
+ <path fill="#FFFF33" d="M10.725,18.6c0-7.333,5.933-13.333,13.333-13.333c7.334,0,13.334,5.934,13.334,13.333
+ c0,7.333-5.934,13.333-13.334,13.333C16.725,31.934,10.725,26,10.725,18.6z"/>
+ <path fill="#FFFF34" d="M10.747,18.6c0-7.322,5.924-13.312,13.312-13.312c7.322,0,13.312,5.924,13.312,13.312
+ c0,7.322-5.926,13.312-13.312,13.312C16.737,31.912,10.747,25.988,10.747,18.6z"/>
+ <path fill="#FFFF35" d="M10.768,18.6c0-7.311,5.915-13.292,13.292-13.292c7.311,0,13.292,5.915,13.292,13.292
+ c0,7.311-5.914,13.292-13.292,13.292C16.749,31.893,10.768,25.977,10.768,18.6z"/>
+ <path fill="#FFFF36" d="M10.79,18.6c0-7.3,5.906-13.271,13.271-13.271c7.3,0,13.271,5.906,13.271,13.271
+ c0,7.298-5.904,13.27-13.271,13.27C16.76,31.87,10.79,25.964,10.79,18.6z"/>
+ <path fill="#FFFF37" d="M10.811,18.6c0-7.289,5.897-13.25,13.25-13.25c7.289,0,13.25,5.896,13.25,13.25
+ c0,7.289-5.896,13.25-13.25,13.25C16.772,31.85,10.811,25.952,10.811,18.6z"/>
+ <path fill="#FFFF38" d="M10.833,18.6c0-7.278,5.888-13.229,13.229-13.229c7.278,0,13.229,5.887,13.229,13.229
+ c0,7.278-5.889,13.228-13.229,13.228C16.784,31.828,10.833,25.939,10.833,18.6z"/>
+ <path fill="#FFFF39" d="M10.854,18.6c0-7.267,5.878-13.208,13.208-13.208c7.268,0,13.208,5.878,13.208,13.208
+ c0,7.266-5.877,13.208-13.208,13.208C16.796,31.809,10.854,25.93,10.854,18.6z"/>
+ <path fill="#FFFF3A" d="M10.876,18.6c0-7.255,5.869-13.187,13.187-13.187c7.255,0,13.187,5.869,13.187,13.187
+ c0,7.255-5.869,13.187-13.187,13.187C16.807,31.787,10.876,25.917,10.876,18.6z"/>
+ <path fill="#FFFF3B" d="M10.898,18.6c0-7.245,5.86-13.166,13.166-13.166c7.245,0,13.167,5.86,13.167,13.166
+ c0,7.244-5.859,13.166-13.167,13.166C16.819,31.766,10.898,25.904,10.898,18.6z"/>
+ <path fill="#FFFF3C" d="M10.92,18.6c0-7.233,5.851-13.145,13.145-13.145c7.234,0,13.146,5.851,13.146,13.145
+ c0,7.233-5.854,13.145-13.146,13.145C16.831,31.745,10.92,25.895,10.92,18.6z"/>
+ <path fill="#FFFF3D" d="M10.941,18.6c0-7.222,5.842-13.125,13.124-13.125c7.222,0,13.125,5.842,13.125,13.125
+ c0,7.222-5.842,13.125-13.125,13.125C16.843,31.725,10.941,25.882,10.941,18.6z"/>
+ <path fill="#FFFF3E" d="M10.963,18.6c0-7.211,5.833-13.104,13.103-13.104c7.211,0,13.104,5.833,13.104,13.104
+ c0,7.21-5.832,13.103-13.104,13.103C16.855,31.703,10.963,25.87,10.963,18.6z"/>
+ <path fill="#FFFF3F" d="M10.984,18.6c0-7.2,5.823-13.082,13.083-13.082c7.201,0,13.083,5.823,13.083,13.082
+ c0,7.2-5.824,13.083-13.083,13.083C16.866,31.684,10.984,25.857,10.984,18.6z"/>
+ <path fill="#FFFF40" d="M11.005,18.6c0-7.189,5.815-13.062,13.062-13.062c7.189,0,13.062,5.814,13.062,13.062
+ c0,7.189-5.812,13.061-13.062,13.061C16.878,31.661,11.005,25.848,11.005,18.6z"/>
+ <path fill="#FFFF41" d="M11.027,18.6c0-7.178,5.805-13.041,13.041-13.041c7.178,0,13.042,5.805,13.042,13.041
+ c0,7.177-5.805,13.041-13.042,13.041C16.889,31.641,11.027,25.835,11.027,18.6z"/>
+ <path fill="#FFFF42" d="M11.048,18.6c0-7.167,5.796-13.02,13.02-13.02c7.167,0,13.02,5.796,13.02,13.02
+ c0,7.167-5.797,13.02-13.02,13.02C16.901,31.62,11.048,25.823,11.048,18.6z"/>
+ <path fill="#FFFF43" d="M11.07,18.6c0-7.156,5.787-12.999,12.998-12.999c7.157,0,13,5.787,13,12.999c0,7.155-5.787,13-13,13
+ C16.913,31.6,11.07,25.812,11.07,18.6z"/>
+ <path fill="#FFFF44" d="M11.091,18.6c0-7.145,5.778-12.978,12.978-12.978c7.146,0,12.978,5.778,12.978,12.978
+ c0,7.144-5.777,12.978-12.978,12.978C16.925,31.578,11.091,25.8,11.091,18.6z"/>
+ <path fill="#FFFF45" d="M11.113,18.6c0-7.133,5.769-12.957,12.957-12.957c7.133,0,12.958,5.769,12.958,12.957
+ c0,7.132-5.77,12.957-12.958,12.957C16.937,31.557,11.113,25.788,11.113,18.6z"/>
+ <path fill="#FFFF46" d="M11.135,18.6c0-7.123,5.759-12.936,12.936-12.936c7.123,0,12.937,5.759,12.937,12.936
+ c0,7.123-5.76,12.936-12.937,12.936C16.949,31.536,11.135,25.775,11.135,18.6z"/>
+ <path fill="#FFFF47" d="M11.157,18.6c0-7.111,5.75-12.915,12.915-12.915c7.112,0,12.915,5.75,12.915,12.915
+ c0,7.111-5.75,12.916-12.915,12.916C16.96,31.516,11.157,25.766,11.157,18.6z"/>
+ <path fill="#FFFF48" d="M11.178,18.6c0-7.1,5.741-12.894,12.895-12.894c7.101,0,12.894,5.741,12.894,12.894
+ c0,7.099-5.74,12.894-12.894,12.894C16.972,31.494,11.178,25.752,11.178,18.6z"/>
+ <path fill="#FFFF49" d="M11.199,18.6c0-7.089,5.732-12.873,12.874-12.873c7.089,0,12.873,5.731,12.873,12.873
+ c0,7.087-5.73,12.873-12.873,12.873C16.984,31.473,11.199,25.74,11.199,18.6z"/>
+ <path fill="#FFFF4A" d="M11.221,18.6c0-7.078,5.723-12.852,12.852-12.852c7.078,0,12.853,5.722,12.853,12.852
+ c0,7.078-5.725,12.852-12.854,12.852C16.995,31.452,11.221,25.729,11.221,18.6z"/>
+ <path fill="#FFFF4B" d="M11.242,18.6c0-7.067,5.714-12.832,12.832-12.832c7.067,0,12.833,5.713,12.833,12.832
+ c0,7.066-5.715,12.832-12.833,12.832C17.007,31.432,11.242,25.717,11.242,18.6z"/>
+ <path fill="#FFFF4C" d="M11.264,18.6c0-7.056,5.705-12.811,12.811-12.811c7.056,0,12.812,5.704,12.812,12.811
+ c0,7.054-5.705,12.81-12.812,12.81C17.019,31.41,11.264,25.705,11.264,18.6z"/>
+ <path fill="#FFFF4D" d="M11.286,18.6c0-7.044,5.695-12.79,12.79-12.79c7.045,0,12.79,5.695,12.79,12.79
+ c0,7.044-5.693,12.791-12.79,12.791C17.031,31.391,11.286,25.693,11.286,18.6z"/>
+ <path fill="#FFFF4E" d="M11.307,18.6c0-7.033,5.686-12.769,12.769-12.769c7.034,0,12.77,5.686,12.77,12.769
+ c0,7.034-5.688,12.768-12.77,12.768C17.043,31.368,11.307,25.684,11.307,18.6z"/>
+ <path fill="#FFFF4F" d="M11.329,18.6c0-7.022,5.677-12.748,12.748-12.748c7.023,0,12.748,5.677,12.748,12.748
+ c0,7.022-5.678,12.748-12.748,12.748C17.054,31.348,11.329,25.67,11.329,18.6z"/>
+ <path fill="#FFFF50" d="M11.351,18.6c0-7.011,5.667-12.727,12.727-12.727c7.012,0,12.727,5.668,12.727,12.727
+ c0,7.011-5.668,12.727-12.727,12.727C17.066,31.327,11.351,25.658,11.351,18.6z"/>
+ <path fill="#FFFF51" d="M11.372,18.6c0-7,5.659-12.706,12.706-12.706c7,0,12.705,5.659,12.705,12.706
+ c0,7-5.658,12.707-12.705,12.707C17.078,31.307,11.372,25.646,11.372,18.6z"/>
+ <path fill="#FFFF52" d="M11.394,18.6c0-6.989,5.65-12.685,12.685-12.685c6.987,0,12.685,5.65,12.685,12.685
+ c0,6.989-5.648,12.685-12.685,12.685C17.09,31.285,11.394,25.635,11.394,18.6z"/>
+ <path fill="#FFFF53" d="M11.415,18.6c0-6.978,5.641-12.664,12.664-12.664c6.978,0,12.665,5.641,12.665,12.664
+ c0,6.978-5.641,12.664-12.665,12.664C17.102,31.264,11.415,25.623,11.415,18.6z"/>
+ <path fill="#FFFF54" d="M11.437,18.6c0-6.967,5.631-12.643,12.643-12.643c6.967,0,12.645,5.631,12.645,12.643
+ c0,6.966-5.633,12.643-12.645,12.643C17.113,31.243,11.437,25.611,11.437,18.6z"/>
+ <path fill="#FFFF55" d="M11.459,18.6c0-6.956,5.622-12.623,12.622-12.623c6.956,0,12.622,5.623,12.622,12.623
+ c0,6.957-5.621,12.623-12.622,12.623C17.125,31.223,11.459,25.6,11.459,18.6z"/>
+ <path fill="#FFFF56" d="M11.48,18.6c0-6.944,5.613-12.602,12.602-12.602c6.945,0,12.602,5.613,12.602,12.602
+ c0,6.944-5.613,12.601-12.602,12.601C17.137,31.201,11.48,25.588,11.48,18.6z"/>
+ <path fill="#FFFF57" d="M11.502,18.6c0-6.934,5.604-12.581,12.581-12.581c6.933,0,12.581,5.604,12.581,12.581
+ c0,6.933-5.604,12.582-12.581,12.582C17.149,31.182,11.502,25.576,11.502,18.6z"/>
+ <path fill="#FFFF58" d="M11.523,18.6c0-6.922,5.595-12.56,12.56-12.56c6.923,0,12.56,5.595,12.56,12.56
+ c0,6.921-5.594,12.559-12.56,12.559C17.16,31.159,11.523,25.564,11.523,18.6z"/>
+ <path fill="#FFFF59" d="M11.545,18.6c0-6.911,5.585-12.539,12.539-12.539c6.912,0,12.539,5.585,12.539,12.539
+ c0,6.911-5.586,12.539-12.539,12.539C17.172,31.139,11.545,25.553,11.545,18.6z"/>
+ <path fill="#FFFF5A" d="M11.566,18.6c0-6.9,5.577-12.518,12.518-12.518c6.9,0,12.518,5.576,12.518,12.518
+ c0,6.9-5.576,12.517-12.518,12.517C17.184,31.117,11.566,25.541,11.566,18.6z"/>
+ <path fill="#FFFF5B" d="M11.588,18.6c0-6.889,5.567-12.497,12.497-12.497c6.89,0,12.497,5.567,12.497,12.497
+ c0,6.889-5.566,12.498-12.497,12.498C17.195,31.098,11.588,25.529,11.588,18.6z"/>
+ <path fill="#FFFF5C" d="M11.609,18.6c0-6.878,5.558-12.476,12.476-12.476c6.878,0,12.476,5.559,12.476,12.476
+ c0,6.876-5.559,12.476-12.476,12.476C17.208,31.076,11.609,25.518,11.609,18.6z"/>
+ <path fill="#FFFF5D" d="M11.631,18.6c0-6.867,5.549-12.455,12.455-12.455c6.867,0,12.455,5.549,12.455,12.455
+ c0,6.867-5.549,12.455-12.455,12.455C17.219,31.055,11.631,25.506,11.631,18.6z"/>
+ <path fill="#FFFF5E" d="M11.652,18.6c0-6.855,5.54-12.434,12.434-12.434c6.855,0,12.434,5.54,12.434,12.434
+ c0,6.855-5.539,12.434-12.434,12.434C17.231,31.034,11.652,25.494,11.652,18.6z"/>
+ <path fill="#FFFF5F" d="M11.674,18.6c0-6.844,5.531-12.413,12.413-12.413c6.845,0,12.415,5.531,12.415,12.413
+ c0,6.843-5.531,12.414-12.415,12.414C17.243,31.014,11.674,25.482,11.674,18.6z"/>
+ <path fill="#FFFF60" d="M11.695,18.6c0-6.833,5.521-12.392,12.393-12.392c6.834,0,12.393,5.521,12.393,12.392
+ c0,6.833-5.521,12.392-12.393,12.392C17.254,30.992,11.695,25.471,11.695,18.6z"/>
+ <path fill="#FFFF61" d="M11.717,18.6c0-6.822,5.513-12.371,12.372-12.371c6.823,0,12.372,5.512,12.372,12.371
+ c0,6.822-5.514,12.371-12.372,12.371C17.266,30.971,11.717,25.459,11.717,18.6z"/>
+ <path fill="#FFFF62" d="M11.739,18.6c0-6.811,5.503-12.351,12.35-12.351c6.812,0,12.351,5.503,12.351,12.351
+ c0,6.811-5.504,12.35-12.351,12.35C17.278,30.95,11.739,25.447,11.739,18.6z"/>
+ <path fill="#FFFF63" d="M11.76,18.6c0-6.8,5.494-12.33,12.33-12.33c6.799,0,12.33,5.494,12.33,12.33
+ c0,6.798-5.494,12.33-12.33,12.33C17.29,30.93,11.76,25.436,11.76,18.6z"/>
+ <path fill="#FFFF64" d="M11.782,18.6c0-6.789,5.485-12.309,12.309-12.309c6.79,0,12.31,5.485,12.31,12.309
+ c0,6.789-5.484,12.308-12.31,12.308C17.301,30.908,11.782,25.423,11.782,18.6z"/>
+ <path fill="#FFFF65" d="M11.803,18.6c0-6.778,5.476-12.288,12.288-12.288c6.778,0,12.288,5.476,12.288,12.288
+ c0,6.778-5.477,12.289-12.288,12.289C17.313,30.889,11.803,25.411,11.803,18.6z"/>
+ <path fill="#FFFF66" d="M11.825,18.6c0-6.767,5.467-12.267,12.267-12.267c6.768,0,12.268,5.466,12.268,12.267
+ c0,6.766-5.467,12.266-12.268,12.266C17.325,30.866,11.825,25.398,11.825,18.6z"/>
+ <path fill="#FFFF67" d="M11.847,18.6c0-6.756,5.457-12.246,12.246-12.246c6.757,0,12.247,5.458,12.247,12.246
+ c0,6.755-5.459,12.246-12.247,12.246C17.337,30.846,11.847,25.389,11.847,18.6z"/>
+ <path fill="#FFFF68" d="M11.868,18.6c0-6.745,5.449-12.225,12.225-12.225c6.745,0,12.226,5.448,12.226,12.225
+ c0,6.746-5.449,12.224-12.226,12.224C17.348,30.824,11.868,25.376,11.868,18.6z"/>
+ <path fill="#FFFF69" d="M11.89,18.6c0-6.733,5.439-12.204,12.204-12.204c6.732,0,12.205,5.439,12.205,12.204
+ c0,6.733-5.439,12.205-12.205,12.205C17.36,30.805,11.89,25.364,11.89,18.6z"/>
+ <path fill="#FFFF6A" d="M11.911,18.6c0-6.723,5.43-12.183,12.183-12.183c6.723,0,12.184,5.43,12.184,12.183
+ c0,6.722-5.43,12.183-12.184,12.183C17.372,30.783,11.911,25.354,11.911,18.6z"/>
+ <path fill="#FFFF6B" d="M11.933,18.6c0-6.711,5.421-12.162,12.162-12.162c6.712,0,12.163,5.421,12.163,12.162
+ c0,6.71-5.422,12.162-12.163,12.162C17.384,30.762,11.933,25.341,11.933,18.6z"/>
+ <path fill="#FFFF6C" d="M11.954,18.6c0-6.7,5.412-12.141,12.142-12.141c6.701,0,12.141,5.412,12.141,12.141
+ c0,6.7-5.412,12.141-12.141,12.141C17.396,30.741,11.954,25.329,11.954,18.6z"/>
+ <path fill="#FFFF6D" d="M11.976,18.6c0-6.689,5.402-12.121,12.12-12.121c6.688,0,12.121,5.403,12.121,12.121
+ c0,6.689-5.402,12.121-12.121,12.121C17.407,30.721,11.976,25.316,11.976,18.6z"/>
+ <path fill="#FFFF6E" d="M11.998,18.6c0-6.678,5.393-12.099,12.099-12.099c6.679,0,12.099,5.393,12.099,12.099
+ c0,6.677-5.393,12.099-12.099,12.099C17.419,30.699,11.998,25.307,11.998,18.6z"/>
+ <path fill="#FFFF6F" d="M12.019,18.6c0-6.667,5.384-12.079,12.079-12.079c6.667,0,12.078,5.384,12.078,12.079
+ c0,6.667-5.383,12.078-12.078,12.078C17.431,30.678,12.019,25.294,12.019,18.6z"/>
+ <path fill="#FFFF70" d="M12.041,18.6c0-6.656,5.375-12.058,12.058-12.058c6.655,0,12.057,5.375,12.057,12.058
+ c0,6.655-5.375,12.057-12.057,12.057C17.442,30.657,12.041,25.282,12.041,18.6z"/>
+ <path fill="#FFFF71" d="M12.062,18.6c0-6.645,5.366-12.037,12.037-12.037c6.645,0,12.036,5.366,12.036,12.037
+ c0,6.644-5.365,12.037-12.036,12.037C17.454,30.637,12.062,25.271,12.062,18.6z"/>
+ <path fill="#FFFF72" d="M12.084,18.6c0-6.633,5.357-12.016,12.016-12.016c6.632,0,12.015,5.357,12.015,12.016
+ c0,6.632-5.355,12.015-12.015,12.015C17.466,30.615,12.084,25.259,12.084,18.6z"/>
+ <path fill="#FFFF73" d="M12.105,18.6c0-6.622,5.348-11.995,11.995-11.995c6.623,0,11.996,5.348,11.996,11.995
+ c0,6.623-5.35,11.996-11.996,11.996C17.478,30.596,12.105,25.247,12.105,18.6z"/>
+ <path fill="#FFFF74" d="M12.127,18.6c0-6.611,5.338-11.974,11.974-11.974c6.612,0,11.973,5.339,11.973,11.974
+ c0,6.611-5.338,11.973-11.973,11.973C17.49,30.573,12.127,25.234,12.127,18.6z"/>
+ <path fill="#FFFF75" d="M12.149,18.6c0-6.6,5.329-11.953,11.953-11.953c6.599,0,11.953,5.33,11.953,11.953
+ c0,6.6-5.328,11.953-11.953,11.953C17.502,30.553,12.149,25.225,12.149,18.6z"/>
+ <path fill="#FFFF76" d="M12.17,18.6c0-6.589,5.32-11.932,11.932-11.932c6.589,0,11.931,5.32,11.931,11.932
+ c0,6.587-5.318,11.932-11.931,11.932C17.513,30.532,12.17,25.212,12.17,18.6z"/>
+ <path fill="#FFFF77" d="M12.192,18.6c0-6.578,5.311-11.911,11.911-11.911c6.579,0,11.913,5.311,11.913,11.911
+ c0,6.578-5.312,11.911-11.913,11.911C17.525,30.511,12.192,25.2,12.192,18.6z"/>
+ <path fill="#FFFF78" d="M12.213,18.6c0-6.567,5.302-11.89,11.891-11.89c6.568,0,11.89,5.302,11.89,11.89
+ c0,6.567-5.303,11.89-11.89,11.89C17.537,30.49,12.213,25.188,12.213,18.6z"/>
+ <path fill="#FFFF79" d="M12.235,18.6c0-6.556,5.292-11.87,11.869-11.87c6.556,0,11.869,5.293,11.869,11.87
+ c0,6.554-5.293,11.869-11.869,11.869C17.548,30.469,12.235,25.176,12.235,18.6z"/>
+ <path fill="#FFFF7A" d="M12.256,18.6c0-6.544,5.284-11.849,11.848-11.849c6.544,0,11.847,5.284,11.847,11.849
+ c0,6.544-5.281,11.848-11.847,11.848C17.56,30.448,12.256,25.164,12.256,18.6z"/>
+ <path fill="#FFFF7B" d="M12.278,18.6c0-6.533,5.274-11.828,11.828-11.828c6.533,0,11.828,5.274,11.828,11.828
+ c0,6.533-5.275,11.828-11.828,11.828C17.572,30.428,12.278,25.152,12.278,18.6z"/>
+ <path fill="#FFFF7C" d="M12.299,18.6c0-6.522,5.266-11.807,11.807-11.807c6.523,0,11.808,5.265,11.808,11.807
+ c0,6.522-5.268,11.806-11.808,11.806C17.584,30.406,12.299,25.141,12.299,18.6z"/>
+ <path fill="#FFFF7D" d="M12.321,18.6c0-6.511,5.256-11.786,11.786-11.786c6.51,0,11.786,5.256,11.786,11.786
+ c0,6.511-5.256,11.786-11.786,11.786C17.595,30.386,12.321,25.129,12.321,18.6z"/>
+ <path fill="#FFFF7E" d="M12.342,18.6c0-6.5,5.247-11.765,11.765-11.765c6.5,0,11.764,5.247,11.764,11.765
+ c0,6.5-5.246,11.764-11.764,11.764C17.608,30.364,12.342,25.117,12.342,18.6z"/>
+ <path fill="#FFFF7F" d="M12.364,18.6c0-6.489,5.238-11.744,11.744-11.744c6.49,0,11.744,5.238,11.744,11.744
+ c0,6.489-5.238,11.744-11.744,11.744C17.619,30.344,12.364,25.105,12.364,18.6z"/>
+ <path fill="#FFFF80" d="M12.386,18.6c0-6.478,5.229-11.723,11.723-11.723c6.479,0,11.723,5.229,11.723,11.723
+ c0,6.477-5.229,11.722-11.723,11.722C17.631,30.322,12.386,25.094,12.386,18.6z"/>
+ <path fill="#FFFF81" d="M12.407,18.6c0-6.467,5.22-11.702,11.702-11.702c6.465,0,11.702,5.22,11.702,11.702
+ c0,6.466-5.219,11.702-11.702,11.702C17.643,30.302,12.407,25.082,12.407,18.6z"/>
+ <path fill="#FFFF82" d="M12.429,18.6c0-6.456,5.21-11.681,11.681-11.681c6.455,0,11.681,5.21,11.681,11.681
+ c0,6.457-5.209,11.681-11.681,11.681C17.654,30.281,12.429,25.07,12.429,18.6z"/>
+ <path fill="#FFFF83" d="M12.45,18.6c0-6.444,5.202-11.66,11.661-11.66c6.444,0,11.661,5.201,11.661,11.66
+ c0,6.444-5.203,11.66-11.661,11.66C17.666,30.26,12.45,25.059,12.45,18.6z"/>
+ <path fill="#FFFF84" d="M12.472,18.6c0-6.434,5.192-11.639,11.639-11.639c6.434,0,11.639,5.192,11.639,11.639
+ c0,6.433-5.191,11.639-11.639,11.639C17.678,30.239,12.472,25.047,12.472,18.6z"/>
+ <path fill="#FFFF85" d="M12.493,18.6c0-6.422,5.183-11.619,11.619-11.619c6.421,0,11.619,5.183,11.619,11.619
+ c0,6.421-5.184,11.618-11.619,11.618C17.69,30.218,12.493,25.035,12.493,18.6z"/>
+ <path fill="#FFFF86" d="M12.515,18.6c0-6.411,5.174-11.598,11.598-11.598c6.411,0,11.598,5.174,11.598,11.598
+ c0,6.411-5.174,11.597-11.598,11.597C17.701,30.197,12.515,25.023,12.515,18.6z"/>
+ <path fill="#FFFF87" d="M12.537,18.6c0-6.4,5.165-11.577,11.577-11.577c6.4,0,11.578,5.165,11.578,11.577
+ c0,6.4-5.166,11.577-11.578,11.577C17.713,30.177,12.537,25.012,12.537,18.6z"/>
+ <path fill="#FFFF88" d="M12.558,18.6c0-6.389,5.156-11.556,11.556-11.556c6.39,0,11.556,5.155,11.556,11.556
+ c0,6.388-5.156,11.554-11.556,11.554C17.725,30.154,12.558,25,12.558,18.6z"/>
+ <path fill="#FFFF89" d="M12.58,18.6c0-6.378,5.146-11.535,11.535-11.535c6.377,0,11.534,5.146,11.534,11.535
+ c0,6.376-5.145,11.535-11.534,11.535C17.737,30.135,12.58,24.988,12.58,18.6z"/>
+ <path fill="#FFFF8A" d="M12.601,18.6c0-6.367,5.138-11.514,11.514-11.514c6.368,0,11.514,5.137,11.514,11.514
+ c0,6.367-5.139,11.513-11.514,11.513C17.749,30.113,12.601,24.977,12.601,18.6z"/>
+ <path fill="#FFFF8B" d="M12.623,18.6c0-6.356,5.128-11.493,11.493-11.493c6.355,0,11.494,5.128,11.494,11.493
+ c0,6.355-5.129,11.493-11.494,11.493C17.76,30.093,12.623,24.965,12.623,18.6z"/>
+ <path fill="#FFFF8C" d="M12.645,18.6c0-6.345,5.119-11.472,11.472-11.472c6.344,0,11.473,5.119,11.473,11.472
+ c0,6.343-5.119,11.47-11.473,11.47C17.772,30.07,12.645,24.953,12.645,18.6z"/>
+ <path fill="#FFFF8D" d="M12.666,18.6c0-6.333,5.11-11.451,11.451-11.451c6.333,0,11.452,5.11,11.452,11.451
+ c0,6.333-5.109,11.451-11.452,11.451C17.784,30.051,12.666,24.941,12.666,18.6z"/>
+ <path fill="#FFFF8E" d="M12.688,18.6c0-6.322,5.101-11.43,11.43-11.43c6.322,0,11.431,5.101,11.431,11.43
+ c0,6.322-5.102,11.429-11.431,11.429C17.796,30.029,12.688,24.93,12.688,18.6z"/>
+ <path fill="#FFFF8F" d="M12.709,18.6c0-6.312,5.092-11.409,11.41-11.409c6.311,0,11.409,5.091,11.409,11.409
+ c0,6.311-5.092,11.409-11.409,11.409C17.807,30.009,12.709,24.917,12.709,18.6z"/>
+ <path fill="#FFFF90" d="M12.731,18.6c0-6.3,5.083-11.388,11.389-11.388c6.3,0,11.388,5.082,11.388,11.388
+ c0,6.298-5.082,11.388-11.388,11.388C17.819,29.988,12.731,24.904,12.731,18.6z"/>
+ <path fill="#FFFF91" d="M12.753,18.6c0-6.289,5.073-11.368,11.367-11.368c6.288,0,11.366,5.073,11.366,11.368
+ c0,6.289-5.072,11.367-11.366,11.367C17.831,29.967,12.753,24.895,12.753,18.6z"/>
+ <path fill="#FFFF92" d="M12.774,18.6c0-6.278,5.064-11.347,11.347-11.347c6.277,0,11.346,5.064,11.346,11.347
+ c0,6.278-5.062,11.345-11.346,11.345C17.842,29.945,12.774,24.882,12.774,18.6z"/>
+ <path fill="#FFFF93" d="M12.796,18.6c0-6.267,5.055-11.326,11.326-11.326c6.267,0,11.325,5.055,11.325,11.326
+ c0,6.266-5.055,11.326-11.325,11.326C17.854,29.926,12.796,24.87,12.796,18.6z"/>
+ <path fill="#FFFF94" d="M12.817,18.6c0-6.256,5.046-11.305,11.305-11.305c6.257,0,11.306,5.046,11.306,11.305
+ c0,6.255-5.047,11.304-11.306,11.304C17.866,29.904,12.817,24.857,12.817,18.6z"/>
+ <path fill="#FFFF95" d="M12.838,18.6c0-6.245,5.037-11.284,11.284-11.284c6.243,0,11.282,5.037,11.282,11.284
+ c0,6.246-5.035,11.284-11.282,11.284C17.878,29.884,12.838,24.848,12.838,18.6z"/>
+ <path fill="#FFFF96" d="M12.86,18.6c0-6.233,5.028-11.263,11.263-11.263c6.232,0,11.262,5.028,11.262,11.263
+ c0,6.233-5.027,11.261-11.262,11.261C17.89,29.861,12.86,24.835,12.86,18.6z"/>
+ <path fill="#FFFF97" d="M12.882,18.6c0-6.223,5.018-11.242,11.242-11.242c6.222,0,11.241,5.019,11.241,11.242
+ c0,6.222-5.018,11.242-11.241,11.242C17.901,29.842,12.882,24.823,12.882,18.6z"/>
+ <path fill="#FFFF98" d="M12.903,18.6c0-6.211,5.009-11.221,11.221-11.221S35.346,12.388,35.346,18.6
+ c0,6.21-5.01,11.22-11.222,11.22C17.913,29.82,12.903,24.812,12.903,18.6z"/>
+ <path fill="#FFFF99" d="M12.925,18.6c0-6.2,5-11.2,11.2-11.2c6.199,0,11.199,5,11.199,11.2c0,6.2-5,11.2-11.199,11.2
+ C17.925,29.8,12.925,24.8,12.925,18.6z"/>
+ </g>
+
+ <linearGradient id="XMLID_67_" gradientUnits="userSpaceOnUse" x1="396.2324" y1="753.8262" x2="396.2324" y2="763.584" gradientTransform="matrix(1 0 0 1 -372 -747)">
+ <stop offset="0" style="stop-color:#FFFFFF"/>
+ <stop offset="1" style="stop-color:#FFFF99"/>
+ </linearGradient>
+ <path fill="url(#XMLID_67_)" d="M15.358,11.705c0-2.701,3.961-4.879,8.875-4.879c4.912,0,8.875,2.178,8.875,4.879
+ s-3.963,4.879-8.875,4.879C19.32,16.583,15.358,14.405,15.358,11.705z"/>
+ <path fill="#666666" d="M23.125,41.3v0.9c0,0.899,0.7,1.6,1.6,1.6c0.9,0,1.6-0.7,1.6-1.6v-0.9h-3.299H23.125z"/>
+
+ <linearGradient id="XMLID_68_" gradientUnits="userSpaceOnUse" x1="396.625" y1="784.8896" x2="396.625" y2="788.9111" gradientTransform="matrix(1 0 0 1 -372 -747)">
+ <stop offset="0" style="stop-color:#FFFFFF"/>
+ <stop offset="1" style="stop-color:#000000"/>
+ </linearGradient>
+ <path fill="url(#XMLID_68_)" d="M28.225,37.9l-7.6,0.8c-0.9,0.1-1.5,0.899-1.4,1.8c0.1,0.9,0.9,1.5,1.8,1.4l7.6-0.801
+ c0.9-0.102,1.5-0.899,1.4-1.802C29.926,38.4,29.125,37.8,28.225,37.9z"/>
+
+ <linearGradient id="XMLID_69_" gradientUnits="userSpaceOnUse" x1="396.625" y1="781.6895" x2="396.625" y2="785.7109" gradientTransform="matrix(1 0 0 1 -372 -747)">
+ <stop offset="0" style="stop-color:#FFFFFF"/>
+ <stop offset="1" style="stop-color:#000000"/>
+ </linearGradient>
+ <path fill="url(#XMLID_69_)" d="M28.225,34.7l-7.6,0.8c-0.9,0.1-1.5,0.9-1.4,1.8c0.1,0.9,0.9,1.5,1.8,1.4l7.6-0.8
+ c0.9-0.101,1.5-0.9,1.4-1.801C29.926,35.2,29.125,34.6,28.225,34.7z"/>
+
+ <linearGradient id="XMLID_70_" gradientUnits="userSpaceOnUse" x1="396.625" y1="778.5889" x2="396.625" y2="782.6104" gradientTransform="matrix(1 0 0 1 -372 -747)">
+ <stop offset="0" style="stop-color:#FFFFFF"/>
+ <stop offset="1" style="stop-color:#000000"/>
+ </linearGradient>
+ <path fill="url(#XMLID_70_)" d="M28.225,31.6l-7.6,0.801c-0.9,0.1-1.5,0.897-1.4,1.8c0.1,0.899,0.9,1.5,1.8,1.399l7.6-0.802
+ c0.9-0.1,1.5-0.897,1.4-1.8S29.125,31.5,28.225,31.6z"/>
+ <path fill="none" stroke="#000000" stroke-width="1.0944" d="M22.325,28.3l-3.5-10.7c0,0,6.601,3.9,10.5,0"/>
+</g>
+<g id="crop_x0020_marks">
+ <path fill="none" d="M47.975,48h-48V0h48V48z"/>
+</g>
+</svg>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/colorsvg/up.svg b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/colorsvg/up.svg
new file mode 100644
index 0000000..8eca45f
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/colorsvg/up.svg
@@ -0,0 +1,338 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 12.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 51448) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [
+ <!ENTITY ns_svg "http://www.w3.org/2000/svg">
+ <!ENTITY ns_xlink "http://www.w3.org/1999/xlink">
+]>
+<svg version="1.1" id="Up" xmlns="&ns_svg;" xmlns:xlink="&ns_xlink;" width="48" height="48" viewBox="0 0 48 48"
+ overflow="visible" enable-background="new 0 0 48 48" xml:space="preserve">
+<g>
+ <path fill="#FFFFFF" stroke="#FFFFFF" stroke-width="7.5901" stroke-linejoin="round" d="M41.104,25.661
+ c0.301,0,0.301-0.3,0.198-0.5l-16.899-16.6c-0.5-0.5-0.7-0.4-1,0l-16.7,16.6c-0.1,0.103-0.1,0.399,0.1,0.399h10v13.601
+ c0,0.301,0.2,0.5,0.4,0.5h13.299c0.398,0,0.5-0.199,0.5-0.601v-13.5L41.104,25.661z"/>
+ <g>
+ <path fill="#0033CC" d="M41.104,25.661c0.301,0,0.301-0.3,0.198-0.5l-16.899-16.6c-0.5-0.5-0.7-0.4-1,0l-16.7,16.6
+ c-0.1,0.103-0.1,0.399,0.1,0.399h10v13.601c0,0.301,0.2,0.5,0.4,0.5h13.299c0.398,0,0.5-0.199,0.5-0.601v-13.5L41.104,25.661z"/>
+ <path fill="#0134CC" d="M41.075,25.65c0.3,0,0.3-0.299,0.198-0.498L24.402,8.577c-0.499-0.499-0.699-0.4-0.998,0L6.73,25.152
+ c-0.1,0.101-0.1,0.397,0.099,0.397h9.984v13.581c0,0.303,0.2,0.499,0.4,0.499h13.279c0.398,0,0.499-0.196,0.499-0.601V25.55
+ L41.075,25.65z"/>
+ <path fill="#0235CD" d="M41.049,25.643c0.301,0,0.301-0.3,0.199-0.498L24.401,8.591c-0.498-0.498-0.697-0.399-0.996,0
+ L6.757,25.145c-0.1,0.101-0.1,0.397,0.099,0.397h9.969v13.562c0,0.301,0.199,0.5,0.399,0.5H30.48c0.397,0,0.498-0.199,0.498-0.601
+ V25.542L41.049,25.643z"/>
+ <path fill="#0336CD" d="M41.021,25.632c0.299,0,0.299-0.299,0.199-0.498L24.4,8.604c-0.498-0.498-0.696-0.399-0.995,0
+ L6.783,25.134c-0.099,0.101-0.099,0.398,0.099,0.398h9.953v13.543c0,0.299,0.199,0.495,0.398,0.495h13.24
+ c0.396,0,0.495-0.196,0.495-0.596v-13.44L41.021,25.632z"/>
+ <path fill="#0437CE" d="M40.995,25.622c0.299,0,0.299-0.299,0.198-0.496L24.4,8.62c-0.497-0.497-0.696-0.398-0.994,0L6.811,25.126
+ c-0.099,0.101-0.099,0.396,0.099,0.396h9.938v13.523c0,0.299,0.199,0.496,0.397,0.496h13.217c0.396,0,0.496-0.197,0.496-0.598
+ v-13.42L40.995,25.622z"/>
+ <path fill="#0538CE" d="M40.969,25.614c0.299,0,0.299-0.3,0.198-0.498L24.399,8.634c-0.496-0.496-0.694-0.397-0.992,0
+ L6.837,25.116c-0.099,0.102-0.099,0.397,0.099,0.397h9.922v13.504c0,0.299,0.199,0.496,0.398,0.496h13.195
+ c0.396,0,0.494-0.197,0.494-0.597V25.514L40.969,25.614z"/>
+ <path fill="#0639CF" d="M40.941,25.604c0.297,0,0.297-0.297,0.197-0.496L24.399,8.649c-0.496-0.496-0.693-0.397-0.99,0
+ L6.864,25.107c-0.099,0.101-0.099,0.396,0.099,0.396h9.906v13.483c0,0.3,0.199,0.496,0.397,0.496h13.173
+ c0.396,0,0.496-0.196,0.496-0.596V25.505L40.941,25.604z"/>
+ <path fill="#073ACF" d="M40.915,25.594c0.298,0,0.298-0.298,0.196-0.494L24.398,8.664c-0.495-0.495-0.692-0.397-0.989,0
+ L6.891,25.1c-0.099,0.101-0.099,0.396,0.098,0.396h9.892V38.96c0,0.298,0.198,0.494,0.396,0.494h13.155
+ c0.396,0,0.494-0.196,0.494-0.593V25.495L40.915,25.594z"/>
+ <path fill="#083BD0" d="M40.891,25.585c0.297,0,0.297-0.297,0.196-0.496l-16.69-16.41c-0.494-0.494-0.691-0.396-0.987,0
+ L6.918,25.089c-0.099,0.101-0.099,0.396,0.098,0.396h9.875V38.93c0,0.299,0.198,0.495,0.396,0.495h13.134
+ c0.396,0,0.494-0.196,0.494-0.595V25.486L40.891,25.585z"/>
+ <path fill="#093CD0" d="M40.859,25.575c0.3,0,0.3-0.296,0.199-0.494L24.397,8.692c-0.493-0.494-0.69-0.396-0.985,0L6.945,25.081
+ c-0.098,0.101-0.098,0.396,0.098,0.396h9.86v13.428c0,0.298,0.197,0.494,0.395,0.494h13.113c0.396,0,0.491-0.196,0.491-0.594
+ V25.477L40.859,25.575z"/>
+ <path fill="#0A3DD1" d="M40.835,25.564c0.296,0,0.296-0.295,0.197-0.491L24.396,8.707c-0.492-0.493-0.689-0.395-0.984,0
+ L6.972,25.073c-0.098,0.098-0.098,0.395,0.098,0.395h9.844v13.408c0,0.295,0.197,0.492,0.394,0.492h13.09
+ c0.396,0,0.492-0.197,0.492-0.593V25.465L40.835,25.564z"/>
+ <path fill="#0B3ED1" d="M40.811,25.557c0.295,0,0.295-0.296,0.195-0.492L24.396,8.723c-0.492-0.493-0.688-0.394-0.983,0
+ L6.999,25.062c-0.098,0.101-0.098,0.396,0.098,0.396h9.829v13.388c0,0.297,0.197,0.491,0.394,0.491h13.073
+ c0.395,0,0.489-0.194,0.489-0.59V25.458L40.811,25.557z"/>
+ <path fill="#0C3FD2" d="M40.782,25.546c0.295,0,0.295-0.295,0.194-0.491L24.395,8.736c-0.491-0.492-0.687-0.394-0.981,0
+ L7.026,25.055c-0.098,0.1-0.098,0.396,0.098,0.396h9.813v13.368c0,0.296,0.197,0.49,0.393,0.49h13.051
+ c0.395,0,0.49-0.194,0.49-0.588V25.448L40.782,25.546z"/>
+ <path fill="#0D40D2" d="M40.755,25.536c0.295,0,0.295-0.293,0.196-0.49L24.394,8.75c-0.489-0.491-0.685-0.393-0.979,0
+ L7.053,25.046c-0.098,0.099-0.098,0.394,0.098,0.394h9.797V38.79c0,0.297,0.196,0.492,0.392,0.492h13.03
+ c0.394,0,0.489-0.195,0.489-0.591V25.438L40.755,25.536z"/>
+ <path fill="#0E41D3" d="M40.729,25.527c0.293,0,0.293-0.295,0.195-0.489L24.394,8.766c-0.489-0.489-0.685-0.392-0.978,0
+ L7.08,25.038c-0.097,0.099-0.097,0.394,0.098,0.394h9.782V38.76c0,0.295,0.196,0.489,0.392,0.489h13.007
+ c0.394,0,0.488-0.194,0.488-0.588V25.43L40.729,25.527z"/>
+ <path fill="#0F42D3" d="M40.702,25.518c0.294,0,0.294-0.293,0.194-0.488L24.393,8.781c-0.488-0.489-0.683-0.392-0.976,0
+ L7.107,25.027c-0.097,0.101-0.097,0.394,0.098,0.394h9.766v13.312c0,0.295,0.195,0.49,0.391,0.49h12.99
+ c0.393,0,0.487-0.195,0.487-0.588V25.419L40.702,25.518z"/>
+ <path fill="#1043D4" d="M40.676,25.508c0.293,0,0.293-0.294,0.195-0.488L24.392,8.794c-0.487-0.488-0.682-0.392-0.975,0
+ L7.134,25.02c-0.097,0.101-0.097,0.394,0.097,0.394h9.75v13.293c0,0.293,0.196,0.485,0.391,0.485H30.34
+ c0.393,0,0.487-0.192,0.487-0.586V25.411L40.676,25.508z"/>
+ <path fill="#1144D4" d="M40.646,25.497c0.293,0,0.293-0.293,0.194-0.487l-16.45-16.2c-0.487-0.488-0.681-0.391-0.973,0L7.16,25.01
+ C7.063,25.107,7.063,25.4,7.257,25.4h9.735v13.271c0,0.294,0.195,0.487,0.39,0.487H30.33c0.389,0,0.484-0.193,0.484-0.586V25.4
+ L40.646,25.497z"/>
+ <path fill="#1245D5" d="M40.622,25.489c0.293,0,0.293-0.294,0.194-0.488L24.391,8.824c-0.486-0.487-0.68-0.39-0.972,0
+ L7.188,25.001c-0.097,0.099-0.097,0.392,0.096,0.392h9.72v13.254c0,0.293,0.195,0.486,0.389,0.486h12.925
+ c0.391,0,0.486-0.193,0.486-0.585V25.393L40.622,25.489z"/>
+ <path fill="#1346D5" d="M40.598,25.479c0.291,0,0.291-0.291,0.192-0.484L24.391,8.838c-0.485-0.486-0.679-0.39-0.97,0
+ L7.215,24.993c-0.097,0.099-0.097,0.39,0.096,0.39h9.704v13.235c0,0.291,0.195,0.485,0.389,0.485h12.907
+ c0.391,0,0.484-0.194,0.484-0.584V25.382L40.598,25.479z"/>
+ <path fill="#1447D6" d="M40.568,25.471c0.291,0,0.291-0.293,0.193-0.486L24.39,8.853c-0.484-0.485-0.678-0.389-0.968,0
+ L7.242,24.982c-0.097,0.1-0.097,0.391,0.096,0.391h9.688v13.215c0,0.293,0.194,0.486,0.388,0.486H30.3
+ c0.39,0,0.484-0.193,0.484-0.582v-13.12L40.568,25.471z"/>
+ <path fill="#1548D6" d="M40.542,25.46c0.291,0,0.291-0.291,0.192-0.485L24.389,8.868c-0.483-0.485-0.677-0.388-0.966,0
+ L7.269,24.975c-0.097,0.101-0.097,0.392,0.096,0.392h9.673v13.194c0,0.291,0.193,0.483,0.387,0.483h12.864
+ c0.387,0,0.482-0.192,0.482-0.582V25.361L40.542,25.46z"/>
+ <path fill="#1649D7" d="M40.518,25.45c0.291,0,0.291-0.291,0.191-0.483L24.389,8.881c-0.483-0.484-0.676-0.388-0.966,0
+ L7.295,24.966c-0.096,0.099-0.096,0.388,0.096,0.388h9.657v13.181c0,0.291,0.193,0.481,0.387,0.481h12.842
+ c0.388,0,0.48-0.19,0.48-0.582v-13.08L40.518,25.45z"/>
+ <path fill="#174AD7" d="M40.488,25.441c0.289,0,0.289-0.291,0.193-0.483L24.388,8.896c-0.482-0.483-0.675-0.388-0.964,0
+ L7.323,24.956c-0.096,0.099-0.096,0.39,0.096,0.39h9.642v13.155c0,0.291,0.193,0.483,0.386,0.483h12.825
+ c0.386,0,0.479-0.192,0.479-0.58V25.346L40.488,25.441z"/>
+ <path fill="#184BD8" d="M40.463,25.432c0.289,0,0.289-0.289,0.191-0.481L24.387,8.912c-0.481-0.482-0.673-0.387-0.962,0
+ L7.349,24.948c-0.096,0.098-0.096,0.387,0.096,0.387h9.626v13.14c0,0.291,0.193,0.483,0.386,0.483h12.802
+ c0.388,0,0.479-0.192,0.479-0.58V25.335L40.463,25.432z"/>
+ <path fill="#194CD8" d="M40.438,25.421c0.289,0,0.289-0.289,0.19-0.481L24.386,8.926c-0.48-0.481-0.672-0.386-0.96,0L7.376,24.938
+ c-0.096,0.1-0.096,0.389,0.096,0.389h9.61v13.117c0,0.291,0.192,0.482,0.385,0.482h12.782c0.385,0,0.479-0.191,0.479-0.578V25.325
+ L40.438,25.421z"/>
+ <path fill="#1A4DD9" d="M40.409,25.413c0.289,0,0.289-0.289,0.19-0.481L24.386,8.939c-0.48-0.481-0.671-0.385-0.959,0
+ L7.403,24.932c-0.096,0.096-0.096,0.385,0.096,0.385h9.595v13.103c0,0.289,0.192,0.479,0.384,0.479h12.76
+ c0.385,0,0.479-0.19,0.479-0.578V25.316L40.409,25.413z"/>
+ <path fill="#1B4ED9" d="M40.383,25.402c0.288,0,0.288-0.288,0.191-0.479L24.386,8.956c-0.479-0.481-0.67-0.385-0.958,0
+ L7.43,24.921c-0.095,0.099-0.095,0.386,0.096,0.386h9.579v13.082c0,0.288,0.192,0.479,0.384,0.479H30.23
+ c0.383,0,0.479-0.191,0.479-0.576V25.307L40.383,25.402z"/>
+ <path fill="#1C4FDA" d="M40.355,25.395c0.287,0,0.287-0.289,0.188-0.479L24.385,8.97c-0.479-0.48-0.669-0.384-0.956,0
+ L7.457,24.913c-0.096,0.097-0.096,0.385,0.095,0.385h9.563v13.062c0,0.289,0.192,0.479,0.383,0.479h12.72
+ c0.384,0,0.479-0.19,0.479-0.575V25.296L40.355,25.395z"/>
+ <path fill="#1D50DA" d="M40.329,25.383c0.287,0,0.287-0.287,0.19-0.479L24.384,8.983c-0.478-0.479-0.668-0.384-0.955,0
+ L7.484,24.902c-0.095,0.099-0.095,0.386,0.095,0.386h9.548v13.043c0,0.287,0.191,0.479,0.382,0.479h12.699
+ c0.383,0,0.478-0.191,0.478-0.576V25.288L40.329,25.383z"/>
+ <path fill="#1E51DB" d="M40.303,25.374c0.286,0,0.286-0.287,0.19-0.479L24.384,8.999c-0.477-0.479-0.667-0.383-0.953,0
+ L7.511,24.895c-0.095,0.099-0.095,0.385,0.094,0.385h9.533v13.022c0,0.287,0.191,0.479,0.382,0.479h12.678
+ c0.382,0,0.477-0.189,0.477-0.574v-12.93L40.303,25.374z"/>
+ <path fill="#1F52DB" d="M40.275,25.364c0.285,0,0.285-0.287,0.188-0.479L24.383,9.014c-0.476-0.478-0.666-0.383-0.951,0
+ L7.539,24.886c-0.095,0.097-0.095,0.384,0.094,0.384h9.517v13.004c0,0.287,0.191,0.479,0.381,0.479h12.658
+ c0.381,0,0.476-0.19,0.476-0.573V25.27L40.275,25.364z"/>
+ <path fill="#2053DC" d="M40.25,25.354c0.285,0,0.285-0.285,0.188-0.479L24.382,9.027c-0.475-0.477-0.665-0.382-0.95,0
+ L7.565,24.876c-0.095,0.097-0.095,0.383,0.094,0.383h9.501v12.984c0,0.286,0.19,0.479,0.381,0.479h12.637
+ c0.381,0,0.477-0.189,0.477-0.572V25.259L40.25,25.354z"/>
+ <path fill="#2154DC" d="M40.225,25.346c0.283,0,0.283-0.287,0.188-0.478L24.381,9.042c-0.474-0.476-0.664-0.381-0.948,0
+ L7.591,24.868c-0.094,0.096-0.094,0.383,0.095,0.383h9.486v12.965c0,0.287,0.19,0.478,0.38,0.478h12.616
+ c0.38,0,0.475-0.188,0.475-0.569V25.249L40.225,25.346z"/>
+ <path fill="#2255DD" d="M40.195,25.335c0.285,0,0.285-0.285,0.188-0.478L24.38,9.057c-0.474-0.475-0.663-0.381-0.947,0
+ L7.619,24.859c-0.094,0.097-0.094,0.382,0.094,0.382h9.471v12.946c0,0.285,0.189,0.476,0.379,0.476h12.596
+ c0.378,0,0.473-0.188,0.473-0.57V25.241L40.195,25.335z"/>
+ <path fill="#2356DD" d="M40.17,25.327c0.284,0,0.284-0.285,0.188-0.478L24.381,9.072c-0.473-0.475-0.662-0.38-0.945,0
+ l-15.79,15.78c-0.094,0.097-0.094,0.381,0.094,0.381h9.455V38.16c0,0.285,0.189,0.476,0.379,0.476h12.574
+ c0.377,0,0.473-0.188,0.473-0.569V25.23L40.17,25.327z"/>
+ <path fill="#2457DE" d="M40.145,25.316c0.282,0,0.282-0.284,0.188-0.478L24.38,9.085c-0.472-0.474-0.661-0.38-0.944,0
+ L7.673,24.841c-0.095,0.097-0.095,0.382,0.094,0.382h9.439V38.13c0,0.285,0.189,0.476,0.378,0.476h12.555
+ c0.379,0,0.473-0.188,0.473-0.569V25.223L40.145,25.316z"/>
+ <path fill="#2558DE" d="M40.116,25.307c0.282,0,0.282-0.285,0.188-0.476L24.379,9.101c-0.472-0.474-0.66-0.379-0.942,0
+ L7.699,24.831c-0.094,0.097-0.094,0.381,0.094,0.381h9.424v12.89c0,0.284,0.189,0.476,0.377,0.476h12.533
+ c0.378,0,0.473-0.188,0.473-0.568V25.212L40.116,25.307z"/>
+ <path fill="#2659DF" d="M40.09,25.298c0.283,0,0.283-0.284,0.188-0.475L24.379,9.116c-0.471-0.473-0.659-0.379-0.94,0
+ L7.727,24.823c-0.094,0.096-0.094,0.381,0.094,0.381h9.408v12.869c0,0.282,0.189,0.473,0.377,0.473h12.512
+ c0.376,0,0.47-0.188,0.47-0.567V25.204L40.09,25.298z"/>
+ <path fill="#275ADF" d="M40.062,25.288c0.28,0,0.28-0.283,0.188-0.474L24.378,9.13c-0.47-0.472-0.657-0.378-0.938,0L7.754,24.814
+ c-0.094,0.097-0.094,0.379,0.093,0.379h9.393v12.851c0,0.285,0.188,0.474,0.376,0.474h12.489c0.377,0,0.472-0.188,0.472-0.565
+ V25.193L40.062,25.288z"/>
+ <path fill="#285BE0" d="M40.037,25.277c0.279,0,0.279-0.282,0.188-0.471L24.377,9.145c-0.469-0.471-0.656-0.378-0.937,0
+ L7.781,24.807c-0.094,0.096-0.094,0.377,0.093,0.377h9.377v12.832c0,0.283,0.188,0.474,0.376,0.474H30.1
+ c0.375,0,0.467-0.188,0.467-0.566V25.184L40.037,25.277z"/>
+ <path fill="#295CE0" d="M40.01,25.27c0.281,0,0.281-0.283,0.188-0.474L24.376,9.159c-0.468-0.47-0.655-0.377-0.936,0L7.807,24.796
+ c-0.093,0.097-0.093,0.378,0.093,0.378h9.361v12.812c0,0.281,0.188,0.471,0.375,0.471h12.45c0.374,0,0.467-0.188,0.467-0.562
+ V25.174L40.01,25.27z"/>
+ <path fill="#2A5DE1" d="M39.982,25.259c0.281,0,0.281-0.282,0.188-0.471L24.376,9.174c-0.467-0.469-0.654-0.376-0.934,0
+ L7.834,24.788c-0.093,0.096-0.093,0.377,0.093,0.377h9.346v12.793c0,0.283,0.188,0.472,0.375,0.472h12.43
+ c0.373,0,0.467-0.188,0.467-0.563v-12.7L39.982,25.259z"/>
+ <path fill="#2B5EE1" d="M39.957,25.249c0.279,0,0.279-0.281,0.188-0.472L24.376,9.188c-0.466-0.469-0.652-0.376-0.933,0
+ L7.861,24.779c-0.093,0.095-0.093,0.375,0.093,0.375h9.33V37.93c0,0.282,0.188,0.471,0.374,0.471h12.408
+ c0.373,0,0.467-0.188,0.467-0.563v-12.68L39.957,25.249z"/>
+ <path fill="#2C5FE2" d="M39.932,25.239c0.278,0,0.278-0.281,0.188-0.47L24.375,9.203c-0.465-0.468-0.652-0.375-0.931,0
+ L7.888,24.771c-0.093,0.096-0.093,0.375,0.092,0.375h9.314V37.9c0,0.281,0.187,0.47,0.374,0.47h12.389
+ c0.373,0,0.465-0.188,0.465-0.562V25.146L39.932,25.239z"/>
+ <path fill="#2D60E2" d="M39.902,25.229c0.279,0,0.279-0.277,0.187-0.468L24.374,9.217c-0.465-0.467-0.651-0.375-0.929,0
+ L7.915,24.762c-0.093,0.094-0.093,0.374,0.092,0.374h9.299V37.87c0,0.28,0.187,0.469,0.373,0.469h12.368
+ c0.371,0,0.465-0.188,0.465-0.562V25.136L39.902,25.229z"/>
+ <path fill="#2E61E3" d="M39.877,25.221c0.277,0,0.277-0.279,0.188-0.468L24.374,9.231c-0.464-0.466-0.649-0.374-0.928,0
+ L7.942,24.753c-0.092,0.095-0.092,0.373,0.092,0.373h9.284v12.717c0,0.281,0.186,0.47,0.372,0.47h12.347
+ c0.372,0,0.464-0.188,0.464-0.562V25.126L39.877,25.221z"/>
+ <path fill="#2F62E3" d="M39.852,25.212c0.277,0,0.277-0.28,0.188-0.469L24.373,9.248c-0.463-0.466-0.648-0.374-0.926,0
+ L7.969,24.745c-0.092,0.094-0.092,0.373,0.092,0.373h9.268v12.696c0,0.278,0.186,0.468,0.371,0.468h12.325
+ c0.371,0,0.463-0.188,0.463-0.562V25.118L39.852,25.212z"/>
+ <path fill="#3063E4" d="M39.823,25.202c0.276,0,0.276-0.279,0.186-0.468L24.372,9.262c-0.462-0.465-0.647-0.373-0.925,0
+ L7.996,24.734c-0.092,0.095-0.092,0.373,0.092,0.373h9.252v12.679c0,0.278,0.186,0.467,0.371,0.467h12.307
+ c0.369,0,0.461-0.188,0.461-0.562V25.107L39.823,25.202z"/>
+ <path fill="#3164E4" d="M39.797,25.191c0.277,0,0.277-0.278,0.186-0.467L24.373,9.274c-0.462-0.465-0.646-0.373-0.923,0
+ L8.023,24.727C7.931,24.82,7.931,25.1,8.115,25.1h9.236v12.657c0,0.279,0.186,0.466,0.371,0.466h12.284
+ c0.369,0,0.461-0.187,0.461-0.56V25.1L39.797,25.191z"/>
+ <path fill="#3265E5" d="M39.771,25.184c0.275,0,0.275-0.279,0.186-0.467L24.371,9.29c-0.461-0.464-0.645-0.372-0.922,0
+ L8.05,24.717c-0.092,0.094-0.092,0.372,0.091,0.372h9.221v12.64c0,0.279,0.185,0.465,0.37,0.465h12.264
+ c0.367,0,0.46-0.186,0.46-0.558V25.089L39.771,25.184z"/>
+ <path fill="#3366E5" d="M39.744,25.173c0.275,0,0.275-0.278,0.186-0.465L24.371,9.306c-0.46-0.463-0.644-0.372-0.92,0
+ L8.077,24.708c-0.092,0.094-0.092,0.371,0.091,0.371h9.206V37.7c0,0.276,0.185,0.463,0.369,0.463h12.241
+ c0.369,0,0.461-0.187,0.461-0.558V25.081L39.744,25.173z"/>
+ <path fill="#3366E6" d="M39.717,25.163c0.276,0,0.276-0.277,0.186-0.463L24.37,9.319c-0.459-0.462-0.643-0.371-0.918,0L8.104,24.7
+ c-0.092,0.094-0.092,0.37,0.091,0.37h9.189v12.601c0,0.279,0.185,0.465,0.369,0.465h12.224c0.366,0,0.459-0.186,0.459-0.557V25.07
+ L39.717,25.163z"/>
+ <path fill="#3467E6" d="M39.689,25.152c0.273,0,0.273-0.276,0.185-0.463L24.369,9.333c-0.458-0.462-0.642-0.371-0.917,0
+ L8.131,24.689c-0.092,0.095-0.092,0.371,0.091,0.371h9.174v12.582c0,0.274,0.184,0.463,0.368,0.463h12.202
+ c0.366,0,0.458-0.188,0.458-0.558V25.061L39.689,25.152z"/>
+ <path fill="#3568E7" d="M39.664,25.145c0.273,0,0.273-0.276,0.186-0.463L24.369,9.349c-0.458-0.461-0.641-0.37-0.916,0
+ L8.158,24.682c-0.091,0.094-0.091,0.37,0.091,0.37h9.159v12.562c0,0.276,0.184,0.461,0.367,0.461h12.181
+ c0.367,0,0.458-0.185,0.458-0.556V25.05L39.664,25.145z"/>
+ <path fill="#3669E7" d="M39.639,25.135c0.273,0,0.273-0.277,0.185-0.462L24.368,9.364c-0.458-0.46-0.64-0.37-0.914,0l-15.27,15.31
+ c-0.091,0.094-0.091,0.368,0.091,0.368h9.144v12.543c0,0.276,0.183,0.463,0.366,0.463h12.158c0.365,0,0.457-0.187,0.457-0.555
+ V25.042L39.639,25.135z"/>
+ <path fill="#376AE8" d="M39.609,25.124c0.272,0,0.272-0.274,0.184-0.461L24.367,9.377c-0.457-0.459-0.639-0.369-0.912,0
+ L8.211,24.663c-0.091,0.094-0.091,0.369,0.091,0.369h9.127v12.522c0,0.274,0.184,0.461,0.366,0.461h12.141
+ c0.363,0,0.455-0.187,0.455-0.554v-12.43L39.609,25.124z"/>
+ <path fill="#386BE8" d="M39.584,25.116c0.271,0,0.271-0.277,0.184-0.462L24.368,9.393c-0.456-0.459-0.638-0.368-0.911,0
+ L8.239,24.654c-0.091,0.093-0.091,0.369,0.09,0.369h9.112v12.504c0,0.274,0.183,0.462,0.365,0.462h12.12
+ c0.363,0,0.454-0.188,0.454-0.554V25.023L39.584,25.116z"/>
+ <path fill="#396CE9" d="M39.559,25.105c0.272,0,0.272-0.274,0.183-0.459L24.366,9.407c-0.455-0.458-0.636-0.367-0.909,0
+ L8.266,24.646c-0.091,0.093-0.091,0.367,0.09,0.367h9.096v12.483c0,0.272,0.183,0.459,0.365,0.459h12.098
+ c0.362,0,0.454-0.187,0.454-0.552V25.014L39.559,25.105z"/>
+ <path fill="#3A6DE9" d="M39.529,25.096c0.271,0,0.271-0.275,0.184-0.457L24.365,9.421c-0.454-0.458-0.635-0.367-0.907,0
+ L8.293,24.639c-0.091,0.092-0.091,0.364,0.09,0.364h9.081v12.468c0,0.274,0.182,0.459,0.364,0.459h12.076
+ c0.363,0,0.453-0.185,0.453-0.552V25.003L39.529,25.096z"/>
+ <path fill="#3B6EEA" d="M39.504,25.087c0.271,0,0.271-0.274,0.184-0.459L24.365,9.436c-0.454-0.457-0.634-0.366-0.906,0
+ L8.319,24.628c-0.09,0.093-0.09,0.367,0.09,0.367h9.065v12.446c0,0.272,0.182,0.457,0.363,0.457h12.06
+ c0.359,0,0.451-0.185,0.451-0.549V24.995L39.504,25.087z"/>
+ <path fill="#3C6FEA" d="M39.479,25.077c0.271,0,0.271-0.272,0.183-0.457L24.364,9.451c-0.453-0.456-0.633-0.366-0.905,0
+ L8.346,24.62c-0.09,0.092-0.09,0.364,0.09,0.364h9.05v12.429c0,0.274,0.182,0.457,0.363,0.457h12.036
+ c0.361,0,0.451-0.183,0.451-0.55V24.984L39.479,25.077z"/>
+ <path fill="#3D70EB" d="M39.451,25.066c0.271,0,0.271-0.272,0.181-0.457L24.363,9.464c-0.452-0.455-0.632-0.365-0.903,0
+ L8.374,24.609c-0.09,0.093-0.09,0.367,0.089,0.367h9.034v12.406c0,0.271,0.181,0.456,0.362,0.456h12.016
+ c0.359,0,0.45-0.185,0.45-0.549V24.977L39.451,25.066z"/>
+ <path fill="#3E71EB" d="M39.424,25.059c0.271,0,0.271-0.272,0.182-0.457L24.363,9.479c-0.451-0.455-0.631-0.365-0.901,0
+ L8.4,24.602c-0.09,0.092-0.09,0.365,0.09,0.365h9.019v12.389c0,0.272,0.181,0.457,0.362,0.457h11.992
+ c0.361,0,0.451-0.185,0.451-0.547V24.967L39.424,25.059z"/>
+ <path fill="#3F72EC" d="M39.396,25.048c0.271,0,0.271-0.272,0.182-0.455L24.362,9.495c-0.45-0.454-0.63-0.364-0.9,0L8.427,24.593
+ c-0.09,0.093-0.09,0.363,0.089,0.363h9.003v12.371c0,0.272,0.181,0.455,0.361,0.455h11.976c0.357,0,0.447-0.183,0.447-0.548
+ V24.956L39.396,25.048z"/>
+ <path fill="#4073EC" d="M39.371,25.038c0.271,0,0.271-0.272,0.18-0.455L24.362,9.509c-0.45-0.453-0.629-0.363-0.898,0
+ L8.454,24.583c-0.09,0.093-0.09,0.362,0.089,0.362h8.987v12.354c0,0.271,0.181,0.454,0.36,0.454h11.954
+ c0.358,0,0.448-0.183,0.448-0.545v-12.26L39.371,25.038z"/>
+ <path fill="#4174ED" d="M39.346,25.029c0.271,0,0.271-0.271,0.18-0.454L24.361,9.523c-0.449-0.453-0.627-0.363-0.897,0
+ L8.481,24.575c-0.089,0.092-0.089,0.362,0.089,0.362h8.972V37.27c0,0.272,0.18,0.455,0.359,0.455h11.933
+ c0.357,0,0.445-0.183,0.445-0.545V24.938L39.346,25.029z"/>
+ <path fill="#4275ED" d="M39.316,25.02c0.271,0,0.271-0.271,0.181-0.453L24.36,9.539c-0.448-0.452-0.626-0.362-0.895,0
+ L8.508,24.566c-0.09,0.091-0.09,0.36,0.088,0.36h8.957V37.24c0,0.271,0.18,0.451,0.359,0.451h11.912
+ c0.355,0,0.445-0.183,0.445-0.543V24.93L39.316,25.02z"/>
+ <path fill="#4376EE" d="M39.291,25.01c0.27,0,0.27-0.271,0.18-0.453L24.36,9.553c-0.447-0.451-0.625-0.361-0.894,0L8.535,24.559
+ c-0.089,0.09-0.089,0.362,0.089,0.362h8.941v12.293c0,0.271,0.179,0.451,0.358,0.451h11.892c0.356,0,0.445-0.181,0.445-0.543
+ V24.919L39.291,25.01z"/>
+ <path fill="#4477EE" d="M39.266,24.999c0.27,0,0.27-0.271,0.18-0.451L24.359,9.566c-0.446-0.45-0.625-0.361-0.893,0L8.562,24.549
+ c-0.089,0.09-0.089,0.362,0.088,0.362h8.925v12.272c0,0.271,0.179,0.45,0.358,0.45h11.87c0.356,0,0.445-0.182,0.445-0.542V24.911
+ L39.266,24.999z"/>
+ <path fill="#4578EF" d="M39.236,24.991c0.27,0,0.27-0.271,0.18-0.451L24.359,9.582c-0.446-0.45-0.624-0.36-0.891,0L8.589,24.54
+ C8.5,24.63,8.5,24.9,8.677,24.9h8.91v12.254c0,0.271,0.179,0.451,0.357,0.451h11.85c0.354,0,0.442-0.182,0.442-0.541V24.9
+ L39.236,24.991z"/>
+ <path fill="#4679EF" d="M39.211,24.98c0.27,0,0.27-0.271,0.18-0.449L24.358,9.597c-0.445-0.449-0.622-0.36-0.889,0L8.616,24.531
+ c-0.089,0.089-0.089,0.359,0.088,0.359h8.894v12.233c0,0.271,0.179,0.451,0.356,0.451h11.83c0.354,0,0.442-0.183,0.442-0.541
+ V24.891L39.211,24.98z"/>
+ <path fill="#477AF0" d="M39.186,24.973c0.269,0,0.269-0.271,0.178-0.451L24.357,9.61c-0.444-0.448-0.621-0.359-0.888,0
+ L8.643,24.521c-0.088,0.09-0.088,0.358,0.088,0.358h8.878v12.218c0,0.271,0.179,0.448,0.356,0.448h11.809
+ c0.354,0,0.441-0.182,0.441-0.54V24.882L39.186,24.973z"/>
+ <path fill="#487BF0" d="M39.158,24.962c0.267,0,0.267-0.271,0.178-0.448L24.356,9.625c-0.443-0.447-0.62-0.359-0.886,0
+ L8.669,24.514c-0.088,0.09-0.088,0.358,0.088,0.358h8.863v12.196c0,0.271,0.178,0.449,0.355,0.449h11.789
+ c0.354,0,0.44-0.181,0.44-0.539V24.872L39.158,24.962z"/>
+ <path fill="#497CF1" d="M39.132,24.952c0.267,0,0.267-0.269,0.179-0.447L24.356,9.64c-0.442-0.446-0.619-0.358-0.884,0
+ L8.697,24.504c-0.088,0.09-0.088,0.357,0.087,0.357h8.847V37.04c0,0.271,0.178,0.449,0.355,0.449h11.768
+ c0.354,0,0.439-0.181,0.439-0.539V24.861L39.132,24.952z"/>
+ <path fill="#4A7DF1" d="M39.104,24.943c0.269,0,0.269-0.271,0.18-0.448L24.355,9.655c-0.442-0.446-0.618-0.358-0.883,0
+ L8.724,24.496c-0.088,0.089-0.088,0.357,0.087,0.357h8.832v12.16c0,0.268,0.177,0.445,0.354,0.445h11.747
+ c0.354,0,0.439-0.182,0.439-0.537V24.854L39.104,24.943z"/>
+ <path fill="#4B7EF2" d="M39.078,24.934c0.265,0,0.265-0.269,0.177-0.447L24.355,9.67c-0.441-0.445-0.617-0.357-0.881,0
+ L8.751,24.486c-0.088,0.091-0.088,0.357,0.087,0.357h8.816v12.14c0,0.27,0.177,0.447,0.354,0.447h11.727
+ c0.354,0,0.438-0.18,0.438-0.535V24.844L39.078,24.934z"/>
+ <path fill="#4C7FF2" d="M39.052,24.924c0.265,0,0.265-0.27,0.177-0.446L24.354,9.684c-0.44-0.444-0.616-0.356-0.879,0
+ L8.777,24.478c-0.088,0.09-0.088,0.355,0.087,0.355h8.8v12.121c0,0.269,0.177,0.444,0.353,0.444h11.706
+ c0.354,0,0.438-0.178,0.438-0.534V24.833L39.052,24.924z"/>
+ <path fill="#4D80F3" d="M39.023,24.913c0.266,0,0.266-0.269,0.178-0.444L24.354,9.699c-0.439-0.444-0.615-0.356-0.878,0
+ L8.804,24.469c-0.087,0.09-0.087,0.356,0.087,0.356h8.785v12.101c0,0.268,0.177,0.444,0.353,0.444h11.684
+ c0.352,0,0.438-0.179,0.438-0.533V24.825L39.023,24.913z"/>
+ <path fill="#4E81F3" d="M38.998,24.904c0.266,0,0.266-0.269,0.176-0.445L24.353,9.712c-0.439-0.443-0.614-0.355-0.877,0
+ L8.832,24.459c-0.088,0.089-0.088,0.355,0.086,0.355h8.77v12.082c0,0.269,0.176,0.443,0.352,0.443h11.664
+ c0.351,0,0.438-0.179,0.438-0.531V24.814L38.998,24.904z"/>
+ <path fill="#4F82F4" d="M38.973,24.896c0.264,0,0.264-0.27,0.176-0.445L24.353,9.728c-0.438-0.442-0.613-0.355-0.875,0
+ L8.858,24.451c-0.087,0.089-0.087,0.355,0.087,0.355h8.754V36.87c0,0.266,0.176,0.442,0.351,0.442h11.644
+ c0.352,0,0.438-0.18,0.438-0.533V24.807L38.973,24.896z"/>
+ <path fill="#5083F4" d="M38.943,24.886c0.264,0,0.264-0.268,0.177-0.444l-14.769-14.7c-0.437-0.441-0.611-0.354-0.874,0
+ l-14.593,14.7c-0.087,0.09-0.087,0.354,0.086,0.354h8.738v12.043c0,0.267,0.176,0.443,0.351,0.443h11.623
+ c0.351,0,0.438-0.179,0.438-0.531V24.796L38.943,24.886z"/>
+ <path fill="#5184F5" d="M38.919,24.876c0.263,0,0.263-0.267,0.174-0.443L24.351,9.756c-0.437-0.441-0.61-0.354-0.872,0
+ L8.912,24.434c-0.087,0.089-0.087,0.354,0.086,0.354h8.723v12.022c0,0.267,0.175,0.44,0.35,0.44h11.602
+ c0.349,0,0.437-0.178,0.437-0.528V24.788L38.919,24.876z"/>
+ <path fill="#5285F5" d="M38.893,24.866c0.262,0,0.262-0.267,0.176-0.441L24.351,9.771c-0.436-0.44-0.609-0.353-0.871,0
+ L8.939,24.425c-0.087,0.089-0.087,0.353,0.086,0.353h8.707v12.009c0,0.265,0.175,0.438,0.349,0.438h11.581
+ c0.348,0,0.436-0.177,0.436-0.529V24.777L38.893,24.866z"/>
+ <path fill="#5386F6" d="M38.863,24.855c0.263,0,0.263-0.266,0.176-0.44L24.35,9.786c-0.435-0.439-0.608-0.353-0.869,0
+ L8.966,24.415C8.88,24.504,8.88,24.77,9.052,24.77h8.691v11.983c0,0.267,0.175,0.44,0.349,0.44h11.561
+ c0.349,0,0.435-0.176,0.435-0.528V24.77L38.863,24.855z"/>
+ <path fill="#5487F6" d="M38.839,24.848c0.261,0,0.261-0.267,0.175-0.439L24.349,9.801c-0.434-0.439-0.607-0.352-0.867,0
+ L8.993,24.407c-0.087,0.089-0.087,0.353,0.086,0.353h8.676v11.967c0,0.267,0.174,0.44,0.348,0.44h11.54
+ c0.349,0,0.435-0.178,0.435-0.528v-11.88L38.839,24.848z"/>
+ <path fill="#5588F7" d="M38.812,24.837c0.262,0,0.262-0.264,0.174-0.439L24.349,9.814c-0.433-0.438-0.606-0.352-0.866,0
+ L9.02,24.397c-0.086,0.088-0.086,0.352,0.086,0.352h8.66v11.949c0,0.262,0.174,0.438,0.347,0.438h11.519
+ c0.347,0,0.433-0.177,0.433-0.528V24.749L38.812,24.837z"/>
+ <path fill="#5689F7" d="M38.785,24.829c0.26,0,0.26-0.265,0.173-0.439L24.348,9.83c-0.432-0.438-0.604-0.351-0.864,0L9.047,24.389
+ c-0.086,0.088-0.086,0.353,0.085,0.353h8.645V36.67c0,0.264,0.174,0.438,0.347,0.438h11.498c0.345,0,0.431-0.176,0.431-0.524
+ v-11.84L38.785,24.829z"/>
+ <path fill="#578AF8" d="M38.759,24.818c0.261,0,0.261-0.264,0.175-0.438L24.347,9.844c-0.432-0.437-0.604-0.35-0.863,0
+ L9.074,24.379c-0.086,0.088-0.086,0.352,0.085,0.352h8.629v11.91c0,0.262,0.173,0.438,0.346,0.438h11.476
+ c0.348,0,0.434-0.177,0.434-0.524V24.73L38.759,24.818z"/>
+ <path fill="#588BF8" d="M38.73,24.809c0.258,0,0.258-0.263,0.172-0.438L24.347,9.858c-0.431-0.436-0.603-0.35-0.861,0
+ L9.101,24.372c-0.086,0.088-0.086,0.351,0.085,0.351H17.8v11.892c0,0.262,0.173,0.438,0.345,0.438h11.458
+ c0.344,0,0.428-0.177,0.428-0.524V24.721L38.73,24.809z"/>
+ <path fill="#598CF9" d="M38.705,24.799c0.259,0,0.259-0.262,0.173-0.438L24.346,9.873c-0.43-0.435-0.602-0.349-0.86,0
+ L9.128,24.361c-0.086,0.088-0.086,0.351,0.085,0.351h8.598v11.869c0,0.263,0.173,0.438,0.345,0.438h11.436
+ c0.344,0,0.43-0.178,0.43-0.524V24.712L38.705,24.799z"/>
+ <path fill="#5A8DF9" d="M38.68,24.79c0.258,0,0.258-0.265,0.172-0.438L24.345,9.888c-0.429-0.435-0.6-0.349-0.858,0L9.155,24.353
+ c-0.086,0.088-0.086,0.35,0.085,0.35h8.583v11.852c0,0.262,0.172,0.438,0.344,0.438h11.414c0.343,0,0.428-0.177,0.428-0.524
+ V24.702L38.68,24.79z"/>
+ <path fill="#5B8EFA" d="M38.65,24.779c0.259,0,0.259-0.262,0.173-0.437L24.345,9.902c-0.428-0.434-0.599-0.348-0.856,0
+ L9.182,24.345c-0.085,0.087-0.085,0.348,0.085,0.348h8.567v11.832c0,0.262,0.172,0.438,0.343,0.438h11.396
+ c0.342,0,0.427-0.176,0.427-0.523V24.691L38.65,24.779z"/>
+ <path fill="#5C8FFA" d="M38.626,24.771c0.256,0,0.256-0.263,0.171-0.437L24.344,9.917c-0.428-0.433-0.599-0.348-0.855,0
+ L9.209,24.335c-0.085,0.087-0.085,0.349,0.084,0.349h8.552v11.812c0,0.262,0.172,0.438,0.343,0.438h11.375
+ c0.342,0,0.426-0.176,0.426-0.521V24.684L38.626,24.771z"/>
+ <path fill="#5D90FB" d="M38.6,24.761c0.258,0,0.258-0.261,0.172-0.434L24.344,9.932c-0.427-0.432-0.598-0.347-0.854,0
+ L9.235,24.327c-0.085,0.087-0.085,0.347,0.084,0.347h8.536v11.794c0,0.261,0.172,0.435,0.343,0.435h11.353
+ c0.342,0,0.428-0.174,0.428-0.521V24.674L38.6,24.761z"/>
+ <path fill="#5E91FB" d="M38.57,24.751c0.258,0,0.258-0.26,0.173-0.434l-14.4-14.372c-0.426-0.432-0.596-0.346-0.852,0
+ L9.263,24.317c-0.085,0.087-0.085,0.346,0.084,0.346h8.52v11.776c0,0.259,0.171,0.433,0.342,0.433h11.332
+ c0.34,0,0.424-0.174,0.424-0.521V24.663L38.57,24.751z"/>
+ <path fill="#5F92FC" d="M38.546,24.743c0.255,0,0.255-0.262,0.17-0.435L24.342,9.96c-0.425-0.431-0.595-0.346-0.85,0L9.29,24.309
+ c-0.085,0.087-0.085,0.347,0.084,0.347h8.504v11.756c0,0.258,0.171,0.434,0.341,0.434h11.311c0.342,0,0.426-0.176,0.426-0.521
+ V24.654L38.546,24.743z"/>
+ <path fill="#6093FC" d="M38.521,24.732c0.254,0,0.254-0.26,0.17-0.435L24.342,9.976c-0.425-0.43-0.594-0.345-0.849,0L9.316,24.3
+ c-0.085,0.087-0.085,0.347,0.084,0.347h8.489v11.735c0,0.259,0.171,0.433,0.341,0.433h11.292c0.34,0,0.424-0.174,0.424-0.521
+ V24.646L38.521,24.732z"/>
+ <path fill="#6194FD" d="M38.492,24.723c0.255,0,0.255-0.259,0.17-0.432L24.341,9.99c-0.424-0.43-0.593-0.345-0.847,0L9.343,24.291
+ c-0.084,0.086-0.084,0.345,0.084,0.345H17.9v11.718c0,0.258,0.17,0.433,0.34,0.433h11.27c0.34,0,0.424-0.175,0.424-0.519V24.636
+ L38.492,24.723z"/>
+ <path fill="#6295FD" d="M38.466,24.712c0.255,0,0.255-0.258,0.169-0.43L24.34,10.004c-0.423-0.429-0.592-0.344-0.846,0
+ L9.37,24.283c-0.084,0.086-0.084,0.345,0.084,0.345h8.458v11.697c0,0.258,0.17,0.43,0.339,0.43H29.5
+ c0.338,0,0.422-0.172,0.422-0.516V24.626L38.466,24.712z"/>
+ <path fill="#6396FE" d="M38.438,24.704c0.254,0,0.254-0.259,0.17-0.431L24.34,10.019c-0.422-0.428-0.591-0.343-0.844,0
+ L9.397,24.273c-0.084,0.086-0.084,0.345,0.083,0.345h8.442v11.678c0,0.259,0.17,0.431,0.339,0.431H29.49
+ c0.338,0,0.422-0.172,0.422-0.517V24.618L38.438,24.704z"/>
+ <path fill="#6497FE" d="M38.413,24.693c0.252,0,0.252-0.257,0.168-0.429l-14.242-14.23c-0.422-0.427-0.59-0.343-0.843,0
+ L9.424,24.265c-0.084,0.086-0.084,0.342,0.083,0.342h8.427v11.66c0,0.258,0.169,0.43,0.338,0.43H29.48
+ c0.336,0,0.42-0.172,0.42-0.516V24.607L38.413,24.693z"/>
+ <path fill="#6598FF" d="M38.387,24.686c0.254,0,0.254-0.259,0.17-0.43L24.338,10.047c-0.42-0.426-0.588-0.342-0.841,0
+ L9.451,24.255c-0.084,0.086-0.084,0.343,0.083,0.343h8.411V36.24c0,0.256,0.169,0.428,0.337,0.428h11.187
+ c0.338,0,0.42-0.172,0.42-0.516V24.6L38.387,24.686z"/>
+ <path fill="#6699FF" d="M38.357,24.675c0.252,0,0.252-0.257,0.168-0.428L24.338,10.062c-0.42-0.426-0.587-0.342-0.839,0
+ L9.478,24.247c-0.084,0.086-0.084,0.342,0.083,0.342h8.396V36.21c0,0.256,0.169,0.429,0.337,0.429h11.167
+ c0.335,0,0.418-0.173,0.418-0.515V24.589L38.357,24.675z"/>
+ </g>
+
+ <linearGradient id="XMLID_20_" gradientUnits="userSpaceOnUse" x1="-1371.771" y1="-727.9985" x2="-1398.6362" y2="-727.9985" gradientTransform="matrix(4.371139e-08 -1 -1 -4.371139e-08 -703.999 -1361.9985)">
+ <stop offset="0" style="stop-color:#FFFFFF"/>
+ <stop offset="1" style="stop-color:#6699FF"/>
+ </linearGradient>
+ <path fill="url(#XMLID_20_)" d="M38.357,24.675c0.252,0,0.252-0.257,0.168-0.428L24.338,10.062c-0.42-0.426-0.587-0.342-0.839,0
+ L9.478,24.247c-0.084,0.086-0.084,0.342,0.083,0.342h8.396V36.21c0,0.256,0.169,0.429,0.337,0.429h11.167
+ c0.335,0,0.418-0.173,0.418-0.515V24.589L38.357,24.675z"/>
+</g>
+<g id="crop_x0020_marks">
+ <path fill="none" d="M48-0.058v48H0v-48H48z"/>
+</g>
+</svg>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/colorsvg/warning.svg b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/colorsvg/warning.svg
new file mode 100644
index 0000000..ae0081d
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/colorsvg/warning.svg
@@ -0,0 +1,232 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 12.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 51448) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [
+ <!ENTITY ns_svg "http://www.w3.org/2000/svg">
+ <!ENTITY ns_xlink "http://www.w3.org/1999/xlink">
+]>
+<svg version="1.1" id="Layer_1" xmlns="&ns_svg;" xmlns:xlink="&ns_xlink;" width="48" height="48" viewBox="0 0 48 48"
+ overflow="visible" enable-background="new 0 0 48 48" xml:space="preserve">
+<g>
+ <path stroke="#FFFFFF" stroke-width="7.9139" stroke-linejoin="round" d="M16.4,42.3L5.7,31.6V16.4L16.4,5.7h15.2l10.7,10.7v15.2
+ L31.6,42.3H16.4z"/>
+ <g>
+ <path fill="#990000" d="M16.4,42.3L5.7,31.6V16.4L16.4,5.7h15.2l10.7,10.7v15.2L31.6,42.3H16.4z"/>
+ <polygon fill="#9A0000" points="16.415,42.266 5.736,31.586 5.736,16.416 16.415,5.737 31.585,5.737 42.266,16.416 42.266,31.586
+ 31.585,42.266 "/>
+ <polygon fill="#9B0000" points="16.429,42.23 5.771,31.572 5.771,16.432 16.429,5.774 31.57,5.774 42.229,16.432 42.229,31.572
+ 31.57,42.23 "/>
+ <polygon fill="#9C0000" points="16.444,42.195 5.806,31.559 5.806,16.447 16.444,5.81 31.557,5.81 42.191,16.447 42.191,31.559
+ 31.557,42.195 "/>
+ <polygon fill="#9D0000" points="16.459,42.162 5.842,31.545 5.842,16.464 16.459,5.847 31.54,5.847 42.157,16.464 42.157,31.545
+ 31.54,42.162 "/>
+ <polygon fill="#9E0000" points="16.473,42.128 5.877,31.531 5.877,16.479 16.473,5.884 31.525,5.884 42.122,16.479 42.122,31.531
+ 31.525,42.128 "/>
+ <polygon fill="#9F0000" points="16.488,42.094 5.914,31.52 5.914,16.496 16.488,5.921 31.512,5.921 42.087,16.496 42.087,31.52
+ 31.512,42.094 "/>
+ <polygon fill="#A00000" points="16.503,42.061 5.949,31.505 5.949,16.511 16.503,5.958 31.496,5.958 42.051,16.511 42.051,31.505
+ 31.496,42.061 "/>
+ <polygon fill="#A10000" points="16.518,42.025 5.984,31.491 5.984,16.528 16.518,5.994 31.48,5.994 42.016,16.528 42.016,31.491
+ 31.48,42.025 "/>
+ <polygon fill="#A20000" points="16.533,41.991 6.02,31.479 6.02,16.544 16.533,6.031 31.467,6.031 41.98,16.544 41.98,31.479
+ 31.467,41.991 "/>
+ <polygon fill="#A30000" points="16.547,41.956 6.055,31.464 6.055,16.56 16.547,6.067 31.452,6.067 41.943,16.56 41.943,31.464
+ 31.452,41.956 "/>
+ <polygon fill="#A40000" points="16.562,41.923 6.091,31.451 6.091,16.576 16.562,6.104 31.438,6.104 41.909,16.576 41.909,31.451
+ 31.438,41.923 "/>
+ <polygon fill="#A50000" points="16.577,41.889 6.126,31.438 6.126,16.592 16.577,6.141 31.423,6.141 41.873,16.592 41.873,31.438
+ 31.423,41.889 "/>
+ <polygon fill="#A60000" points="16.592,41.854 6.162,31.424 6.162,16.607 16.592,6.177 31.407,6.177 41.838,16.607 41.838,31.424
+ 31.407,41.854 "/>
+ <polygon fill="#A70000" points="16.606,41.818 6.197,31.41 6.197,16.624 16.606,6.214 31.395,6.214 41.803,16.624 41.803,31.41
+ 31.395,41.818 "/>
+ <polygon fill="#A80000" points="16.622,41.785 6.233,31.396 6.233,16.64 16.622,6.251 31.379,6.251 41.768,16.64 41.768,31.396
+ 31.379,41.785 "/>
+ <polygon fill="#A90000" points="16.636,41.751 6.269,31.383 6.269,16.655 16.636,6.288 31.363,6.288 41.73,16.655 41.73,31.383
+ 31.363,41.751 "/>
+ <polygon fill="#AA0000" points="16.65,41.716 6.304,31.369 6.304,16.671 16.65,6.325 31.35,6.325 41.695,16.671 41.695,31.369
+ 31.35,41.716 "/>
+ <polygon fill="#AB0000" points="16.666,41.682 6.339,31.355 6.339,16.688 16.666,6.361 31.334,6.361 41.66,16.688 41.66,31.355
+ 31.334,41.682 "/>
+ <polygon fill="#AC0000" points="16.681,41.648 6.375,31.343 6.375,16.704 16.681,6.398 31.318,6.398 41.625,16.704 41.625,31.343
+ 31.318,41.648 "/>
+ <polygon fill="#AD0000" points="16.695,41.613 6.411,31.329 6.411,16.719 16.695,6.435 31.305,6.435 41.589,16.719 41.589,31.329
+ 31.305,41.613 "/>
+ <polygon fill="#AE0000" points="16.709,41.579 6.446,31.314 6.446,16.735 16.709,6.472 31.29,6.472 41.555,16.735 41.555,31.314
+ 31.29,41.579 "/>
+ <polygon fill="#AF0000" points="16.725,41.545 6.482,31.302 6.482,16.751 16.725,6.509 31.273,6.509 41.52,16.751 41.52,31.302
+ 31.273,41.545 "/>
+ <polygon fill="#B00000" points="16.739,41.511 6.518,31.288 6.518,16.767 16.739,6.545 31.262,6.545 41.482,16.767 41.482,31.288
+ 31.262,41.511 "/>
+ <polygon fill="#B10000" points="16.754,41.477 6.553,31.273 6.553,16.783 16.754,6.582 31.245,6.582 41.447,16.783 41.447,31.273
+ 31.245,41.477 "/>
+ <polygon fill="#B20000" points="16.769,41.441 6.588,31.261 6.588,16.799 16.769,6.619 31.23,6.619 41.411,16.799 41.411,31.261
+ 31.23,41.441 "/>
+ <polygon fill="#B30000" points="16.783,41.407 6.624,31.248 6.624,16.815 16.783,6.656 31.216,6.656 41.376,16.815 41.376,31.248
+ 31.216,41.407 "/>
+ <polygon fill="#B40000" points="16.799,41.373 6.66,31.234 6.66,16.832 16.799,6.693 31.202,6.693 41.341,16.832 41.341,31.234
+ 31.202,41.373 "/>
+ <polygon fill="#B50000" points="16.813,41.339 6.695,31.221 6.695,16.847 16.813,6.729 31.188,6.729 41.305,16.847 41.305,31.221
+ 31.188,41.339 "/>
+ <polygon fill="#B60000" points="16.828,41.305 6.73,31.207 6.73,16.863 16.828,6.765 31.172,6.765 41.27,16.863 41.27,31.207
+ 31.172,41.305 "/>
+ <polygon fill="#B70000" points="16.843,41.27 6.766,31.193 6.766,16.879 16.843,6.802 31.157,6.802 41.232,16.879 41.232,31.193
+ 31.157,41.27 "/>
+ <polygon fill="#B80000" points="16.858,41.236 6.802,31.182 6.802,16.896 16.858,6.839 31.143,6.839 41.198,16.896 41.198,31.182
+ 31.143,41.236 "/>
+ <polygon fill="#B90000" points="16.872,41.202 6.837,31.166 6.837,16.911 16.872,6.876 31.128,6.876 41.163,16.911 41.163,31.166
+ 31.128,41.202 "/>
+ <polygon fill="#BA0000" points="16.887,41.167 6.873,31.152 6.873,16.927 16.887,6.913 31.111,6.913 41.127,16.927 41.127,31.152
+ 31.111,41.167 "/>
+ <polygon fill="#BB0000" points="16.902,41.133 6.908,31.139 6.908,16.943 16.902,6.949 31.098,6.949 41.092,16.943 41.092,31.139
+ 31.098,41.133 "/>
+ <polygon fill="#BC0000" points="16.917,41.1 6.944,31.126 6.944,16.959 16.917,6.986 31.083,6.986 41.057,16.959 41.057,31.126
+ 31.083,41.1 "/>
+ <polygon fill="#BD0000" points="16.931,41.064 6.979,31.111 6.979,16.975 16.931,7.023 31.068,7.023 41.021,16.975 41.021,31.111
+ 31.068,41.064 "/>
+ <polygon fill="#BE0000" points="16.946,41.029 7.015,31.1 7.015,16.991 16.946,7.06 31.055,7.06 40.984,16.991 40.984,31.1
+ 31.055,41.029 "/>
+ <polygon fill="#BF0000" points="16.96,40.995 7.051,31.085 7.051,17.007 16.96,7.097 31.039,7.097 40.949,17.007 40.949,31.085
+ 31.039,40.995 "/>
+ <polygon fill="#C00000" points="16.976,40.962 7.086,31.072 7.086,17.023 16.976,7.133 31.023,7.133 40.914,17.023 40.914,31.072
+ 31.023,40.962 "/>
+ <polygon fill="#C10000" points="16.99,40.927 7.121,31.059 7.121,17.039 16.99,7.17 31.01,7.17 40.878,17.039 40.878,31.059
+ 31.01,40.927 "/>
+ <polygon fill="#C20000" points="17.004,40.893 7.157,31.044 7.157,17.054 17.004,7.207 30.994,7.207 40.843,17.054 40.843,31.044
+ 30.994,40.893 "/>
+ <polygon fill="#C30000" points="17.02,40.857 7.192,31.031 7.192,17.07 17.02,7.244 30.979,7.244 40.809,17.07 40.809,31.031
+ 30.979,40.857 "/>
+ <polygon fill="#C40000" points="17.035,40.824 7.229,31.018 7.229,17.086 17.035,7.281 30.966,7.281 40.771,17.086 40.771,31.018
+ 30.966,40.824 "/>
+ <polygon fill="#C50000" points="17.049,40.789 7.263,31.004 7.263,17.103 17.049,7.317 30.95,7.317 40.736,17.103 40.736,31.004
+ 30.95,40.789 "/>
+ <polygon fill="#C60000" points="17.064,40.755 7.299,30.99 7.299,17.119 17.064,7.354 30.936,7.354 40.701,17.119 40.701,30.99
+ 30.936,40.755 "/>
+ <polygon fill="#C70000" points="17.079,40.721 7.334,30.977 7.334,17.135 17.079,7.391 30.921,7.391 40.665,17.135 40.665,30.977
+ 30.921,40.721 "/>
+ <polygon fill="#C80000" points="17.094,40.688 7.371,30.964 7.371,17.151 17.094,7.428 30.906,7.428 40.63,17.151 40.63,30.964
+ 30.906,40.688 "/>
+ <polygon fill="#C90000" points="17.108,40.652 7.406,30.949 7.406,17.167 17.108,7.464 30.893,7.464 40.594,17.167 40.594,30.949
+ 30.893,40.652 "/>
+ <polygon fill="#CA0000" points="17.123,40.618 7.441,30.936 7.441,17.182 17.123,7.5 30.877,7.5 40.559,17.182 40.559,30.936
+ 30.877,40.618 "/>
+ <polygon fill="#CB0000" points="17.138,40.584 7.477,30.923 7.477,17.199 17.138,7.537 30.861,7.537 40.523,17.199 40.523,30.923
+ 30.861,40.584 "/>
+ <polygon fill="#CC0000" points="17.153,40.55 7.513,30.909 7.513,17.215 17.153,7.574 30.848,7.574 40.486,17.215 40.486,30.909
+ 30.848,40.55 "/>
+ <polygon fill="#CC0000" points="17.167,40.516 7.548,30.896 7.548,17.23 17.167,7.611 30.832,7.611 40.452,17.23 40.452,30.896
+ 30.832,40.516 "/>
+ <polygon fill="#CD0000" points="17.182,40.48 7.583,30.882 7.583,17.246 17.182,7.647 30.816,7.647 40.416,17.246 40.416,30.882
+ 30.816,40.48 "/>
+ <polygon fill="#CE0000" points="17.197,40.445 7.619,30.868 7.619,17.262 17.197,7.685 30.803,7.685 40.381,17.262 40.381,30.868
+ 30.803,40.445 "/>
+ <polygon fill="#CF0000" points="17.211,40.412 7.654,30.855 7.654,17.278 17.211,7.721 30.788,7.721 40.346,17.278 40.346,30.855
+ 30.788,40.412 "/>
+ <polygon fill="#D00000" points="17.226,40.378 7.69,30.842 7.69,17.294 17.226,7.758 30.773,7.758 40.311,17.294 40.311,30.842
+ 30.773,40.378 "/>
+ <polygon fill="#D10000" points="17.241,40.344 7.726,30.828 7.726,17.311 17.241,7.794 30.759,7.794 40.273,17.311 40.273,30.828
+ 30.759,40.344 "/>
+ <polygon fill="#D20000" points="17.256,40.311 7.761,30.814 7.761,17.326 17.256,7.831 30.744,7.831 40.238,17.326 40.238,30.814
+ 30.744,40.311 "/>
+ <polygon fill="#D30000" points="17.271,40.273 7.796,30.801 7.796,17.342 17.271,7.868 30.729,7.868 40.203,17.342 40.203,30.801
+ 30.729,40.273 "/>
+ <polygon fill="#D40000" points="17.285,40.24 7.832,30.787 7.832,17.358 17.285,7.905 30.715,7.905 40.168,17.358 40.168,30.787
+ 30.715,40.24 "/>
+ <polygon fill="#D50000" points="17.3,40.206 7.868,30.773 7.868,17.374 17.3,7.941 30.7,7.941 40.132,17.374 40.132,30.773
+ 30.7,40.206 "/>
+ <polygon fill="#D60000" points="17.315,40.172 7.903,30.761 7.903,17.39 17.315,7.979 30.686,7.979 40.098,17.39 40.098,30.761
+ 30.686,40.172 "/>
+ <polygon fill="#D70000" points="17.33,40.139 7.938,30.747 7.938,17.406 17.33,8.015 30.67,8.015 40.062,17.406 40.062,30.747
+ 30.67,40.139 "/>
+ <polygon fill="#D80000" points="17.344,40.104 7.974,30.732 7.974,17.422 17.344,8.052 30.654,8.052 40.025,17.422 40.025,30.732
+ 30.654,40.104 "/>
+ <polygon fill="#D90000" points="17.359,40.068 8.01,30.721 8.01,17.438 17.359,8.089 30.641,8.089 39.99,17.438 39.99,30.721
+ 30.641,40.068 "/>
+ <polygon fill="#DA0000" points="17.374,40.034 8.045,30.706 8.045,17.454 17.374,8.125 30.626,8.125 39.954,17.454 39.954,30.706
+ 30.626,40.034 "/>
+ <polygon fill="#DB0000" points="17.389,40 8.081,30.691 8.081,17.47 17.389,8.162 30.611,8.162 39.919,17.47 39.919,30.691
+ 30.611,40 "/>
+ <polygon fill="#DC0000" points="17.403,39.966 8.116,30.68 8.116,17.486 17.403,8.199 30.598,8.199 39.884,17.486 39.884,30.68
+ 30.598,39.966 "/>
+ <polygon fill="#DD0000" points="17.418,39.932 8.152,30.665 8.152,17.502 17.418,8.235 30.582,8.235 39.848,17.502 39.848,30.665
+ 30.582,39.932 "/>
+ <polygon fill="#DE0000" points="17.433,39.896 8.188,30.652 8.188,17.518 17.433,8.272 30.566,8.272 39.812,17.518 39.812,30.652
+ 30.566,39.896 "/>
+ <polygon fill="#DF0000" points="17.448,39.863 8.223,30.639 8.223,17.534 17.448,8.309 30.553,8.309 39.775,17.534 39.775,30.639
+ 30.553,39.863 "/>
+ <polygon fill="#E00000" points="17.462,39.828 8.258,30.625 8.258,17.55 17.462,8.346 30.537,8.346 39.741,17.55 39.741,30.625
+ 30.537,39.828 "/>
+ <polygon fill="#E10000" points="17.477,39.794 8.294,30.611 8.294,17.565 17.477,8.383 30.521,8.383 39.706,17.565 39.706,30.611
+ 30.521,39.794 "/>
+ <polygon fill="#E20000" points="17.492,39.76 8.33,30.598 8.33,17.582 17.492,8.419 30.508,8.419 39.67,17.582 39.67,30.598
+ 30.508,39.76 "/>
+ <polygon fill="#E30000" points="17.507,39.727 8.365,30.584 8.365,17.598 17.507,8.456 30.493,8.456 39.635,17.598 39.635,30.584
+ 30.493,39.727 "/>
+ <polygon fill="#E40000" points="17.521,39.691 8.4,30.57 8.4,17.614 17.521,8.493 30.479,8.493 39.6,17.614 39.6,30.57
+ 30.479,39.691 "/>
+ <polygon fill="#E50000" points="17.536,39.657 8.436,30.559 8.436,17.63 17.536,8.529 30.464,8.529 39.562,17.63 39.562,30.559
+ 30.464,39.657 "/>
+ <polygon fill="#E60000" points="17.551,39.623 8.472,30.544 8.472,17.646 17.551,8.566 30.449,8.566 39.527,17.646 39.527,30.544
+ 30.449,39.623 "/>
+ <polygon fill="#E70000" points="17.566,39.589 8.507,30.529 8.507,17.662 17.566,8.603 30.436,8.603 39.492,17.662 39.492,30.529
+ 30.436,39.589 "/>
+ <polygon fill="#E80000" points="17.581,39.555 8.542,30.518 8.542,17.678 17.581,8.64 30.419,8.64 39.457,17.678 39.457,30.518
+ 30.419,39.555 "/>
+ <polygon fill="#E90000" points="17.595,39.52 8.578,30.503 8.578,17.693 17.595,8.676 30.404,8.676 39.422,17.693 39.422,30.503
+ 30.404,39.52 "/>
+ <polygon fill="#EA0000" points="17.61,39.484 8.614,30.489 8.614,17.709 17.61,8.713 30.391,8.713 39.387,17.709 39.387,30.489
+ 30.391,39.484 "/>
+ <polygon fill="#EB0000" points="17.625,39.451 8.649,30.477 8.649,17.726 17.625,8.75 30.375,8.75 39.352,17.726 39.352,30.477
+ 30.375,39.451 "/>
+ <polygon fill="#EC0000" points="17.64,39.417 8.685,30.462 8.685,17.742 17.64,8.787 30.359,8.787 39.314,17.742 39.314,30.462
+ 30.359,39.417 "/>
+ <polygon fill="#ED0000" points="17.654,39.383 8.72,30.449 8.72,17.757 17.654,8.823 30.346,8.823 39.279,17.757 39.279,30.449
+ 30.346,39.383 "/>
+ <polygon fill="#EE0000" points="17.669,39.35 8.756,30.436 8.756,17.773 17.669,8.86 30.331,8.86 39.244,17.773 39.244,30.436
+ 30.331,39.35 "/>
+ <polygon fill="#EF0000" points="17.684,39.312 8.792,30.422 8.792,17.79 17.684,8.897 30.316,8.897 39.208,17.79 39.208,30.422
+ 30.316,39.312 "/>
+ <polygon fill="#F00000" points="17.699,39.279 8.827,30.408 8.827,17.805 17.699,8.934 30.302,8.934 39.173,17.805 39.173,30.408
+ 30.302,39.279 "/>
+ <polygon fill="#F10000" points="17.713,39.245 8.862,30.395 8.862,17.821 17.713,8.971 30.286,8.971 39.137,17.821 39.137,30.395
+ 30.286,39.245 "/>
+ <polygon fill="#F20000" points="17.728,39.211 8.898,30.381 8.898,17.837 17.728,9.007 30.271,9.007 39.102,17.837 39.102,30.381
+ 30.271,39.211 "/>
+ <polygon fill="#F30000" points="17.743,39.177 8.934,30.367 8.934,17.853 17.743,9.044 30.257,9.044 39.066,17.853 39.066,30.367
+ 30.257,39.177 "/>
+ <polygon fill="#F40000" points="17.758,39.143 8.969,30.354 8.969,17.869 17.758,9.081 30.242,9.081 39.029,17.869 39.029,30.354
+ 30.242,39.143 "/>
+ <polygon fill="#F50000" points="17.772,39.107 9.004,30.341 9.004,17.885 17.772,9.117 30.229,9.117 38.995,17.885 38.995,30.341
+ 30.229,39.107 "/>
+ <polygon fill="#F60000" points="17.787,39.073 9.04,30.327 9.04,17.901 17.787,9.154 30.213,9.154 38.959,17.901 38.959,30.327
+ 30.213,39.073 "/>
+ <polygon fill="#F70000" points="17.802,39.039 9.076,30.312 9.076,17.917 17.802,9.191 30.198,9.191 38.924,17.917 38.924,30.312
+ 30.198,39.039 "/>
+ <polygon fill="#F80000" points="17.816,39.005 9.111,30.3 9.111,17.933 17.816,9.228 30.184,9.228 38.889,17.933 38.889,30.3
+ 30.184,39.005 "/>
+ <polygon fill="#F90000" points="17.832,38.971 9.146,30.286 9.146,17.949 17.832,9.265 30.169,9.265 38.854,17.949 38.854,30.286
+ 30.169,38.971 "/>
+ <polygon fill="#FA0000" points="17.846,38.938 9.182,30.271 9.182,17.965 17.846,9.301 30.154,9.301 38.816,17.965 38.816,30.271
+ 30.154,38.938 "/>
+ <polygon fill="#FB0000" points="17.861,38.902 9.218,30.259 9.218,17.981 17.861,9.338 30.139,9.338 38.782,17.981 38.782,30.259
+ 30.139,38.902 "/>
+ <polygon fill="#FC0000" points="17.875,38.867 9.253,30.246 9.253,17.997 17.875,9.375 30.124,9.375 38.746,17.997 38.746,30.246
+ 30.124,38.867 "/>
+ <polygon fill="#FD0000" points="17.891,38.833 9.289,30.232 9.289,18.013 17.891,9.411 30.109,9.411 38.711,18.013 38.711,30.232
+ 30.109,38.833 "/>
+ <polygon fill="#FE0000" points="17.905,38.799 9.324,30.219 9.324,18.029 17.905,9.448 30.096,9.448 38.675,18.029 38.675,30.219
+ 30.096,38.799 "/>
+ <path fill="#FF0000" d="M17.92,38.766l-8.56-8.561v-12.16l8.56-8.56h12.16l8.561,8.56v12.16l-8.561,8.561H17.92z"/>
+ </g>
+
+ <linearGradient id="XMLID_46_" gradientUnits="userSpaceOnUse" x1="582" y1="-986.6099" x2="582" y2="-1015.8911" gradientTransform="matrix(1 0 0 -1 -558 -977)">
+ <stop offset="0" style="stop-color:#FFFFFF"/>
+ <stop offset="1" style="stop-color:#FF0000"/>
+ </linearGradient>
+ <path fill="url(#XMLID_46_)" d="M17.92,38.891L9.36,30.33V18.17l8.56-8.56h12.16l8.561,8.56v12.16l-8.561,8.561H17.92z"/>
+ <path d="M11.7,17.7l18.7,18.7l5.896-5.9L17.6,11.7l-5.9,5.9V17.7z"/>
+ <path d="M11.7,30.5l5.9,5.9l18.7-18.7L30.4,11.8L11.7,30.5z"/>
+</g>
+<g id="crop_x0020_marks">
+ <path fill="none" d="M48,48H0V0h48V48z"/>
+</g>
+</svg>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/home.svg b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/home.svg
new file mode 100644
index 0000000..e803a31
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/home.svg
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+<!-- Generator: Adobe Illustrator 9.0, SVG Export Plug-In -->
+<!DOCTYPE svg [
+ <!ENTITY st0 "fill-rule:nonzero;clip-rule:nonzero;fill:#FFFFFF;stroke:#000000;stroke-miterlimit:4;">
+ <!ENTITY st1 "fill:none;stroke:none;">
+ <!ENTITY st2 "fill:#000000;">
+ <!ENTITY st3 "fill:none;stroke:#FFFFFF;stroke-width:6.3469;stroke-linejoin:round;">
+ <!ENTITY st4 "fill-rule:evenodd;clip-rule:evenodd;stroke:none;">
+ <!ENTITY st5 "fill-rule:nonzero;clip-rule:nonzero;stroke:#000000;stroke-miterlimit:4;">
+]>
+<svg width="48pt" height="48pt" viewBox="0 0 48 48" xml:space="preserve" xmlns="http://www.w3.org/2000/svg">
+ <g id="Layer_x0020_3" style="&st0;">
+ <g style="&st4;">
+ <path style="&st3;" d="M22.9,7.1L5.1,21.8l0,0c-0.3,0.3-0.5,0.8-0.5,1.2c0,0.2,0,0.4,0.1,0.6c0.3,0.6,0.9,1,1.6,1c0,0,1.1,0,2.2,0c0,2.4,0,14.2,0,14.2c0,1.1,0.8,1.9,1.8,1.9h27.4c1.1,0,1.9-0.9,1.9-2c0,0,0-11.8,0-14.2c1,0,2,0,2,0c0.8,0,1.4-0.5,1.7-1.2
+ c0.1-0.2,0.1-0.4,0.1-0.6c0-0.5-0.2-1-0.7-1.4c0,0-3.6-3-4.5-3.7c0-1.2,0-6.9,0-6.9c0-1.2-0.8-2-2-2h-4.8c-1,0-1.7,0.6-1.9,1.5c-1.9-1.6-4.1-3.5-4.1-3.5l0.1,0.1c-0.7-0.7-1.8-0.8-2.7-0.1z"/>
+ <path style="&st2;" d="M22.9,7.1L5.1,21.8l0,0c-0.3,0.3-0.5,0.8-0.5,1.2c0,0.2,0,0.4,0.1,0.6c0.3,0.6,0.9,1,1.6,1c0,0,1.1,0,2.2,0c0,2.4,0,14.2,0,14.2c0,1.1,0.8,1.9,1.8,1.9h27.4c1.1,0,1.9-0.9,1.9-2c0,0,0-11.8,0-14.2c1,0,2,0,2,0c0.8,0,1.4-0.5,1.7-1.2
+ c0.1-0.2,0.1-0.4,0.1-0.6c0-0.5-0.2-1-0.7-1.4c0,0-3.6-3-4.5-3.7c0-1.2,0-6.9,0-6.9c0-1.2-0.8-2-2-2h-4.8c-1,0-1.7,0.6-1.9,1.5c-1.9-1.6-4.1-3.5-4.1-3.5l0.1,0.1c-0.7-0.7-1.8-0.8-2.7-0.1z"/>
+ <path style="&st2;" d="M41.8,22.8l-5.1-4.2v-0.1L31,13.7v0l-6.5-5.5C24.2,8,24,8,23.8,8.2L6.2,22.9c-0.1,0.1-0.1,0.3,0.1,0.3h1.6H10h28.1h1.2h2.3c0.2,0,0.4-0.2,0.2-0.4z"/>
+ <path d="M35.8,16.8l0-5.1c0-0.2-0.1-0.4-0.3-0.4h-3.2c-0.2,0-0.3,0.1-0.3,0.3v2.2l3.9,2.9z"/>
+ <path d="M11.9,24.7V37c0,0.3,0.1,0.4,0.3,0.4h23.6c0.3,0,0.4-0.2,0.4-0.4V24.7H11.9z"/>
+ </g>
+ </g>
+ <g id="crop_x0020_marks" style="&st5;">
+ <path style="&st1;" d="M48,48H0V0h48v48z"/>
+ </g>
+</svg>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/important.svg b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/important.svg
new file mode 100644
index 0000000..dd84f3f
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/important.svg
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+<!-- Generator: Adobe Illustrator 9.0, SVG Export Plug-In -->
+<!DOCTYPE svg [
+ <!ENTITY st0 "fill:#FFFFFF;stroke:none;">
+ <!ENTITY st1 "fill:#FFFFFF;stroke-width:6.6112;stroke-linecap:round;stroke-linejoin:round;">
+ <!ENTITY st2 "stroke:#FFFFFF;stroke-width:6.6112;">
+ <!ENTITY st3 "fill:none;stroke:none;">
+ <!ENTITY st4 "fill-rule:nonzero;clip-rule:nonzero;stroke:#000000;stroke-miterlimit:4;">
+ <!ENTITY st5 "stroke:none;">
+]>
+<svg width="48pt" height="48pt" viewBox="0 0 48 48" xml:space="preserve" xmlns="http://www.w3.org/2000/svg">
+ <g id="Layer_x0020_3" style="&st4;">
+ <g>
+ <path style="&st2;" d="M41.7,35.3L26.6,9.4c-0.6-1-1.7-1.7-2.9-1.6c-1.2,0-2.3,0.7-2.9,1.7L6.3,35.4c-0.6,1-0.6,2.3,0,3.3c0.6,1,1.7,1.6,2.9,1.6h29.6c1.2,0,2.3-0.6,2.9-1.7c0.6-1,0.6-2.3,0-3.3z"/>
+ <path style="&st1;" d="M23.7,11L9.2,37h29.6L23.7,11z"/>
+ <path style="&st0;" d="M23.7,11.9L10.3,36.1h27.5l-14-24.1z"/>
+ <g>
+ <path style="&st5;" d="M24.1,34c-1.1,0-1.8-0.8-1.8-1.8c0-1.1,0.7-1.8,1.8-1.8c1.1,0,1.8,0.7,1.8,1.8c0,1-0.7,1.8-1.8,1.8h0z M22.9,29.3l-0.4-9.1h3.2l-0.4,9.1h-2.3z"/>
+ </g>
+ </g>
+ </g>
+ <g id="crop_x0020_marks" style="&st4;">
+ <path style="&st3;" d="M48,48H0V0h48v48z"/>
+ </g>
+</svg>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/next.svg b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/next.svg
new file mode 100644
index 0000000..75fa83e
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/next.svg
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+<!-- Generator: Adobe Illustrator 9.0, SVG Export Plug-In -->
+<!DOCTYPE svg [
+ <!ENTITY st0 "fill:none;stroke:none;">
+ <!ENTITY st1 "fill:#FFFFFF;stroke:#FFFFFF;stroke-width:7.5901;stroke-linejoin:round;">
+ <!ENTITY st2 "fill-rule:nonzero;clip-rule:nonzero;stroke:#000000;stroke-miterlimit:4;">
+ <!ENTITY st3 "stroke:none;">
+]>
+<svg width="48pt" height="48pt" viewBox="0 0 48 48" xml:space="preserve" xmlns="http://www.w3.org/2000/svg">
+ <g id="Layer_x0020_3" style="&st2;">
+ <g>
+ <path style="&st1;" d="M22.4,41.1c0,0.3,0.3,0.3,0.5,0.2l16.6-16.9c0.5-0.5,0.4-0.7,0-1L22.9,6.7c-0.1-0.1-0.4-0.1-0.4,0.1v10H8.9c-0.3,0-0.5,0.2-0.5,0.4l0,13.3C8.4,30.9,8.6,31,9,31h13.5l-0.1,10.1z"/>
+ <path style="&st3;" d="M22.4,41.1c0,0.3,0.3,0.3,0.5,0.2l16.6-16.9c0.5-0.5,0.4-0.7,0-1L22.9,6.7c-0.1-0.1-0.4-0.1-0.4,0.1v10H8.9c-0.3,0-0.5,0.2-0.5,0.4l0,13.3C8.4,30.9,8.6,31,9,31h13.5l-0.1,10.1z"/>
+ </g>
+ </g>
+ <g id="crop_x0020_marks" style="&st2;">
+ <path style="&st0;" d="M48,48H0V0h48v48z"/>
+ </g>
+</svg>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/note.svg b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/note.svg
new file mode 100644
index 0000000..648299d
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/note.svg
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+<!-- Generator: Adobe Illustrator 9.0, SVG Export Plug-In -->
+<!DOCTYPE svg [
+ <!ENTITY st0 "fill:none;stroke:#FFFFFF;stroke-width:12.1438;stroke-linejoin:round;">
+ <!ENTITY st1 "fill:none;stroke-width:1.2429;">
+ <!ENTITY st2 "fill:#FFFFFF;stroke:none;">
+ <!ENTITY st3 "fill:none;stroke:#FFFFFF;stroke-width:12.7649;stroke-linejoin:round;">
+ <!ENTITY st4 "fill:#FFFFFF;stroke-width:6.3824;stroke-linejoin:round;">
+ <!ENTITY st5 "fill:none;stroke:none;">
+ <!ENTITY st6 "fill-rule:nonzero;clip-rule:nonzero;stroke:#000000;stroke-miterlimit:4;">
+ <!ENTITY st7 "fill:#FFFFFF;stroke:#FFFFFF;stroke-width:12.7649;stroke-linejoin:round;">
+ <!ENTITY st8 "stroke:none;">
+ <!ENTITY st9 "fill:none;stroke-width:4.9715;stroke-linejoin:round;">
+]>
+<svg xmlns="http://www.w3.org/2000/svg" width="48pt" height="48pt" viewBox="0 0 48 48" xml:space="preserve">
+ <g id="Layer_x0020_1" style="&st6;">
+ <path style="&st0;" d="M35.7,19.8v18.9H11V8.8h13.9l10.8,11z"/>
+ <path style="&st3;" d="M38.7,30.4L25,16.7l-7.7-3l2.7,8.7l13.3,13.4l5.4-5.4z"/>
+ <path style="&st7;" d="M35.7,8.8H11v29.9h24.7V8.8z"/>
+ <path style="&st4;" d="M35.7,8.8H11v29.9h24.7V8.8z"/>
+ <path style="&st2;" d="M35.7,8.8H11v29.9h24.7V8.8z"/>
+ </g>
+ <g id="Layer_x0020_4" style="&st6;">
+ <path style="&st9;" d="M38.7,30.4L25,16.7l-7.7-3l2.7,8.7l13.3,13.4l5.4-5.4z"/>
+ <path style="&st8;" d="M38.7,30.4L25,16.7l-7.7-3l2.7,8.7l13.3,13.4l5.4-5.4z"/>
+ <path style="&st8;" d="M20.6,14.7l-2.5,2.5L17,13.4l3.6,1.3z"/>
+ <path style="&st1;" d="M19.6,22.2l3-0.3l2.4-2.4l0.4-2.8"/>
+ <path style="&st2;" d="M20.4,14.9L18.3,17l1.6,5.2l2.7-0.3l2.4-2.4l0.3-2.4l-5-2.2z"/>
+ </g>
+ <g id="crop" style="&st6;">
+ <path style="&st5;" d="M48,48H0V0h48v48z"/>
+ </g>
+</svg>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/prev.svg b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/prev.svg
new file mode 100644
index 0000000..6d88ffd
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/prev.svg
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+<!-- Generator: Adobe Illustrator 9.0, SVG Export Plug-In -->
+<!DOCTYPE svg [
+ <!ENTITY st0 "fill:none;stroke:none;">
+ <!ENTITY st1 "fill:#FFFFFF;stroke:#FFFFFF;stroke-width:7.5901;stroke-linejoin:round;">
+ <!ENTITY st2 "fill-rule:nonzero;clip-rule:nonzero;stroke:#000000;stroke-miterlimit:4;">
+ <!ENTITY st3 "stroke:none;">
+]>
+<svg width="48pt" height="48pt" viewBox="0 0 48 48" xml:space="preserve" xmlns="http://www.w3.org/2000/svg">
+ <g id="Layer_x0020_3" style="&st2;">
+ <g>
+ <path style="&st1;" d="M25.6,6.9c0-0.3-0.3-0.3-0.5-0.2L8.4,23.6c-0.5,0.5-0.4,0.7,0,1l16.6,16.6c0.1,0.1,0.4,0.1,0.4-0.1v-10h13.6c0.3,0,0.5-0.2,0.5-0.4l0-13.3c0-0.3-0.2-0.5-0.5-0.5H25.5l0.1-10.1z"/>
+ <path style="&st3;" d="M25.6,6.9c0-0.3-0.3-0.3-0.5-0.2L8.4,23.6c-0.5,0.5-0.4,0.7,0,1l16.6,16.6c0.1,0.1,0.4,0.1,0.4-0.1v-10h13.6c0.3,0,0.5-0.2,0.5-0.4l0-13.3c0-0.3-0.2-0.5-0.5-0.5H25.5l0.1-10.1z"/>
+ </g>
+ </g>
+ <g id="crop_x0020_marks" style="&st2;">
+ <path style="&st0;" d="M48,48H0V0h48v48z"/>
+ </g>
+</svg>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/tip.svg b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/tip.svg
new file mode 100644
index 0000000..4a64a15
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/tip.svg
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+<!-- Generator: Adobe Illustrator 9.0, SVG Export Plug-In -->
+<!DOCTYPE svg [
+ <!ENTITY st0 "fill:none;stroke:#000000;stroke-width:1.0944;">
+ <!ENTITY st1 "fill:#FFFFFF;stroke:none;">
+ <!ENTITY st2 "fill-rule:nonzero;clip-rule:nonzero;stroke:#FFFFFF;stroke-width:5.6139;stroke-miterlimit:4;">
+ <!ENTITY st3 "fill:none;stroke:none;">
+ <!ENTITY st4 "fill-rule:nonzero;clip-rule:nonzero;stroke:#000000;stroke-miterlimit:4;">
+ <!ENTITY st5 "stroke:none;">
+]>
+<svg width="48pt" height="48pt" viewBox="0 0 48 48" xml:space="preserve" xmlns="http://www.w3.org/2000/svg">
+ <g id="Layer_x0020_3" style="&st2;">
+ <g>
+ <path d="M9.5,18.6c0,8,6.5,14.4,14.4,14.4c8,0,14.4-6.5,14.4-14.4c0-8-6.5-14.4-14.4-14.4c-8,0-14.4,6.5-14.4,14.4z M12.8,18.6c0-6.2,5-11.2,11.2-11.2c6.2,0,11.2,5,11.2,11.2c0,6.2-5,11.2-11.2,11.2c-6.2,0-11.2-5-11.2-11.2z"/>
+ <path d="M28.1,37.9l-7.6,0.8c-0.9,0.1-1.5,0.9-1.4,1.8c0.1,0.9,0.9,1.5,1.8,1.4l7.6-0.8c0.9-0.1,1.5-0.9,1.4-1.8c-0.1-0.9-0.9-1.5-1.8-1.4z"/>
+ <path d="M28.1,34.8l-7.6,0.8c-0.9,0.1-1.5,0.9-1.4,1.8c0.1,0.9,0.9,1.5,1.8,1.4l7.6-0.8c0.9-0.1,1.5-0.9,1.4-1.8c-0.1-0.9-0.9-1.5-1.8-1.4z"/>
+ <path d="M28.1,31.6l-7.6,0.8c-0.9,0.1-1.5,0.9-1.4,1.8s0.9,1.5,1.8,1.4l7.6-0.8c0.9-0.1,1.5-0.9,1.4-1.8s-0.9-1.5-1.8-1.4z"/>
+ <path d="M23.1,41.3v0.9c0,0.9,0.7,1.6,1.6,1.6c0.9,0,1.6-0.7,1.6-1.6v-0.9h-3.3z"/>
+ <path style="&st1;" d="M35.9,18.7c0,6.6-5.4,12-12,12c-6.6,0-12-5.4-12-12s5.4-12,12-12c6.6,0,12,5.4,12,12z"/>
+ <path style="&st5;" d="M9.6,18.6c0,8,6.5,14.4,14.4,14.4c8,0,14.4-6.5,14.4-14.4c0-8-6.5-14.4-14.4-14.4c-8,0-14.4,6.5-14.4,14.4z M12.9,18.6c0-6.2,5-11.2,11.2-11.2c6.2,0,11.2,5,11.2,11.2c0,6.2-5,11.2-11.2,11.2c-6.2,0-11.2-5-11.2-11.2z"/>
+ <path style="&st5;" d="M28.2,37.9l-7.6,0.8c-0.9,0.1-1.5,0.9-1.4,1.8c0.1,0.9,0.9,1.5,1.8,1.4l7.6-0.8c0.9-0.1,1.5-0.9,1.4-1.8c-0.1-0.9-0.9-1.5-1.8-1.4z"/>
+ <path style="&st5;" d="M28.2,34.7l-7.6,0.8c-0.9,0.1-1.5,0.9-1.4,1.8c0.1,0.9,0.9,1.5,1.8,1.4l7.6-0.8c0.9-0.1,1.5-0.9,1.4-1.8c-0.1-0.9-0.9-1.5-1.8-1.4z"/>
+ <path style="&st5;" d="M28.2,31.6l-7.6,0.8c-0.9,0.1-1.5,0.9-1.4,1.8c0.1,0.9,0.9,1.5,1.8,1.4l7.6-0.8c0.9-0.1,1.5-0.9,1.4-1.8c-0.1-0.9-0.9-1.5-1.8-1.4z"/>
+ <path style="&st5;" d="M23.1,41.3v0.9c0,0.9,0.7,1.6,1.6,1.6s1.6-0.7,1.6-1.6v-0.9h-3.3z"/>
+ <path style="&st0;" d="M22.3,28.3l-3.5-10.7c0,0,6.6,3.9,10.5,0"/>
+ </g>
+ </g>
+ <g id="crop_x0020_marks" style="&st4;">
+ <path style="&st3;" d="M48,48H0V0h48v48z"/>
+ </g>
+</svg>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/up.svg b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/up.svg
new file mode 100644
index 0000000..d31aa9c
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/up.svg
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+<!-- Generator: Adobe Illustrator 9.0, SVG Export Plug-In -->
+<!DOCTYPE svg [
+ <!ENTITY st0 "fill:none;stroke:none;">
+ <!ENTITY st1 "fill:#FFFFFF;stroke:#FFFFFF;stroke-width:7.5901;stroke-linejoin:round;">
+ <!ENTITY st2 "fill-rule:nonzero;clip-rule:nonzero;stroke:#000000;stroke-miterlimit:4;">
+ <!ENTITY st3 "stroke:none;">
+]>
+<svg width="48pt" height="48pt" viewBox="0 0 48 48" xml:space="preserve" xmlns="http://www.w3.org/2000/svg">
+ <g id="Layer_x0020_3" style="&st2;">
+ <g>
+ <path style="&st1;" d="M41.1,25.6c0.3,0,0.3-0.3,0.2-0.5L24.4,8.4c-0.5-0.5-0.7-0.4-1,0L6.7,25.1c-0.1,0.1-0.1,0.4,0.1,0.4h10v13.6c0,0.3,0.2,0.5,0.4,0.5l13.3,0c0.3,0,0.5-0.2,0.5-0.5V25.5l10.1,0.1z"/>
+ <path style="&st3;" d="M41.1,25.6c0.3,0,0.3-0.3,0.2-0.5L24.4,8.4c-0.5-0.5-0.7-0.4-1,0L6.7,25.1c-0.1,0.1-0.1,0.4,0.1,0.4h10v13.6c0,0.3,0.2,0.5,0.4,0.5l13.3,0c0.3,0,0.5-0.2,0.5-0.5V25.5l10.1,0.1z"/>
+ </g>
+ </g>
+ <g id="crop_x0020_marks" style="&st2;">
+ <path style="&st0;" d="M48,48H0V0h48v48z"/>
+ </g>
+</svg>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/warning.svg b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/warning.svg
new file mode 100644
index 0000000..fc8d748
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/images/warning.svg
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+<!-- Generator: Adobe Illustrator 9.0, SVG Export Plug-In -->
+<!DOCTYPE svg [
+ <!ENTITY st0 "fill:#000000;stroke:#FFFFFF;stroke-width:7.9139;stroke-linejoin:round;">
+ <!ENTITY st1 "fill-rule:nonzero;clip-rule:nonzero;fill:#FFFFFF;stroke:#000000;stroke-miterlimit:4;">
+ <!ENTITY st2 "fill:none;stroke:none;">
+ <!ENTITY st3 "fill:#000000;">
+ <!ENTITY st4 "fill-rule:evenodd;clip-rule:evenodd;stroke:none;">
+ <!ENTITY st5 "fill-rule:nonzero;clip-rule:nonzero;stroke:#000000;stroke-miterlimit:4;">
+]>
+<svg width="48pt" height="48pt" viewBox="0 0 48 48" xml:space="preserve" xmlns="http://www.w3.org/2000/svg">
+ <g id="Layer_x0020_4" style="&st1;">
+ <g style="&st4;">
+ <path style="&st0;" d="M16.4,42.3L5.7,31.6V16.4L16.4,5.7h15.2l10.7,10.7v15.2L31.6,42.3H16.4z"/>
+ <path style="&st3;" d="M16.4,42.3L5.7,31.6V16.4L16.4,5.7h15.2l10.7,10.7v15.2L31.6,42.3H16.4z"/>
+ <path d="M11.7,17.7l18.7,18.7l5.9-5.9L17.6,11.7l-5.9,5.9z"/>
+ <path d="M11.7,30.5l5.9,5.9l18.7-18.7l-5.9-5.9L11.7,30.5z"/>
+ </g>
+ </g>
+ <g id="crop_x0020_marks" style="&st5;">
+ <path style="&st2;" d="M48,48H0V0h48v48z"/>
+ </g>
+</svg>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/install.sh b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/install.sh
new file mode 100644
index 0000000..4071619
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/install.sh
@@ -0,0 +1,977 @@
+#!/bin/bash
+# $Id: install.sh 7942 2008-03-26 06:08:08Z xmldoc $
+# $Source$ #
+
+# install.sh - Set up user environment for a XML/XSLT distribution
+
+# This is as an interactive installer for updating your
+# environment to use an XML/XSLT distribution such as the DocBook
+# XSL Stylesheets. Its main purpose is to configure your
+# environment with XML catalog data and schema "locating rules"
+# data provided in the XML/XSLT distribution.
+#
+# Although this installer was created for the DocBook project, it
+# is a general-purpose tool that can be used with any XML/XSLT
+# distribution that provides XML/SGML catalogs and locating rules.
+#
+# This script is mainly intended to make things easier for you if
+# you want to install a particular XML/XSLT distribution that has
+# not (yet) been packaged for your OS distro (Debian, Fedora,
+# whatever), or to use "snapshot" or development releases
+#
+# It works by updating your shell startup file (e.g., .bashrc and
+# .cshrc) and .emacs file and by finding or creating a writable
+# CatalogManager.properties file to update.
+#
+# It makes backup copies of any files it touches, and also
+# generates a uninstall.sh script for reverting its changes.
+#
+# In the same directory where it is located, it expects to find
+# the following four files:
+# - locatingrules.xml
+# - catalog.xml
+# - catalog
+# - .urilist
+# And if it's unable to locate a CatalogManager.properties file in
+# your environment, it expects to find an "example" one in the
+# same directory as itself, which it copies over to your
+# ~/.resolver directory.
+#
+# If the distribution contains any executables, change the value
+# of the thisBinDir to a colon-separated list of the pathnames of
+# the directories that contain those executables.
+
+# mydir is the "canonical" absolute pathname for install.sh
+mydir=$(cd -P $(dirname $0) && pwd -P) || exit 1
+
+thisLocatingRules=$mydir/locatingrules.xml
+thisXmlCatalog=$mydir/catalog.xml
+thisSgmlCatalog=$mydir/catalog
+
+# .urilist file contains a list of pairs of local pathnames and
+# URIs to test for catalog resolution
+thisUriList=$mydir/.urilist
+exampleCatalogManager=$mydir/.CatalogManager.properties.example
+thisCatalogManager=$HOME/.resolver/CatalogManager.properties
+
+# thisBinDir directory is a colon-separated list of the pathnames
+# to all directories that contain executables provided with the
+# distribution (for example, the DocBook XSL Stylesheets
+# distribution contains a "docbook-xsl-update" convenience script
+# for rsync'ing up to the latest docbook-xsl snapshot). The
+# install.sh script adds the value of thisBinDir to your PATH
+# environment variable
+thisBinDir=$mydir/tools/bin
+
+emit_message() {
+ echo "$1" 1>&2
+}
+
+if [ ! "${*#--batch}" = "$*" ]; then
+ batchmode="Yes";
+else
+ batchmode="No";
+ emit_message
+ if [ ! "$1" = "--test" ]; then
+ emit_message "NOTE: For non-interactive installs/uninstalls, use --batch"
+ if [ ! "$1" = "--uninstall" ]; then
+ emit_message
+ fi
+ fi
+fi
+
+osName="Unidentified"
+if uname -s | grep -qi "cygwin"; then
+ osName="Cygwin"
+fi
+
+classPathSeparator=":"
+if [ "$osName" = "Cygwin" ]; then
+ thisJavaXmlCatalog=$(cygpath -m $thisXmlCatalog)
+ classPathSeparator=";"
+else
+ thisJavaXmlCatalog=$thisXmlCatalog
+fi
+
+main() {
+ removeOldFiles
+ checkRoot
+ updateCatalogManager
+ checkForResolver
+ writeDotFiles
+ updateUserStartupFiles
+ updateUserDotEmacs
+ writeUninstallFile
+ writeTestFile
+ printExitMessage
+}
+
+removeOldFiles() {
+ rm -f $mydir/.profile.incl
+ rm -f $mydir/.cshrc.incl
+ rm -f $mydir/.emacs.el
+}
+
+checkRoot() {
+ if [ $(id -u) == "0" ]; then
+ cat 1>&2 <<EOF
+
+WARNING: This install script is meant to be run as a non-root
+ user, but you are running it as root.
+
+EOF
+ read -s -n1 -p "Are you sure you want to continue? [No] "
+ emit_message "$REPLY"
+ case $REPLY in
+ [yY])
+ emit_message
+ ;;
+ *) emit_message "OK, exiting without making changes."
+ exit
+ ;;
+ esac
+ fi
+ return 0
+}
+
+updateCatalogManager() {
+
+ # - finds or creates a writable CatalogManager.properties file
+ #
+ # - adds the catalog.xml file for this distribution to the
+ # CatalogManager.properties file found
+
+ if [ -z "$CLASSPATH" ]; then
+ cat 1>&2 <<EOF
+
+NOTE: There is no CLASSPATH variable set in your environment.
+ No attempt was made to find a CatalogManager.properties
+ file. Using $thisCatalogManager instead
+EOF
+ else
+ # split CLASSPATH in a list of pathnames by replacing all separator
+ # characters with spaces
+ if [ "$osName" = "Cygwin" ]; then
+ pathnames=$(echo $CLASSPATH | tr ";" " ")
+ else
+ pathnames=$(echo $CLASSPATH | tr ":" " ")
+ fi
+ for path in $pathnames; do
+ if [ "$osName" = "Cygwin" ]; then
+ path=$(cygpath -u $path)
+ fi
+ # strip out trailing slash from pathname
+ path=$(echo $path | sed 's/\/$//')
+ # find CatalogManager.properties file
+ if [ -f $path/CatalogManager.properties ];
+ then
+ existingCatalogManager=$path/CatalogManager.properties
+ break
+ fi
+ done
+ fi
+ # end of CLASSPATH check
+
+ if [ -w "$existingCatalogManager" ]; then
+ # existing CatalogManager.properties was found and it is
+ # writable, so use it
+ myCatalogManager=$existingCatalogManager
+ else
+ if [ -f "$existingCatalogManager" ]; then
+ # a non-writable CatalogManager.properties exists, so emit a
+ # note saying that it won't be used
+ cat 1>&2 <<EOF
+NOTE: $existingCatalogManager file found,
+ but you don't have permission to write to it.
+ Will instead use:
+ $thisCatalogManager
+EOF
+ else
+ # CLASSPATH is set, but no CatalogManager.properties found
+ if [ -n "$CLASSPATH" ]; then
+ cat 1>&2 <<EOF
+NOTE: No CatalogManager.properties found from CLASSPATH.
+ Will instead use:
+ $thisCatalogManager
+EOF
+ fi
+ fi
+ if [ "$batchmode" = "Yes" ]; then
+ emit_message
+ fi
+ # end of check for existing writable CatalogManager.properties
+
+ if [ -f $thisCatalogManager ]; then
+ myCatalogManager=$thisCatalogManager
+ else
+ REPLY=""
+ if [ ! "$batchmode" = "Yes" ]; then
+ emit_message
+ read -s -n1 -p "Create $thisCatalogManager file? [Yes] "
+ emit_message "$REPLY"
+ emit_message
+ fi
+ case $REPLY in
+ [nNqQ])
+ emitNoChangeMsg
+ ;;
+ *)
+ if [ ! -d "${thisCatalogManager%/*}" ]; then
+ mkdir -p ${thisCatalogManager%/*}
+ fi
+ cp $mydir/.CatalogManager.properties.example $thisCatalogManager || exit 1
+ emit_message "NOTE: Created the following file:"
+ emit_message " $thisCatalogManager"
+ myCatalogManager=$thisCatalogManager
+ ;;
+ esac
+ # end of creating "private" CatalogManager.properties
+ fi
+ # end of check for "private" CatalogManager.properties
+ fi
+ # end of check finding/creating writable CatalogManager.properties
+
+ if [ -n "$myCatalogManager" ]; then
+ etcXmlCatalog=
+ catalogsLine=$(grep "^catalogs=" $myCatalogManager)
+ if [ -f /etc/xml/catalog ] && [ "$osName" != "Cygwin" ] \
+ && [ "${catalogsLine#*/etc/xml/catalog*}" = "$catalogsLine" ]; then
+ cat 1>&2 <<EOF
+
+WARNING: /etc/xml/catalog exists but was not found in:
+ $myCatalogManager
+ If /etc/xml/catalog file has content, you probably
+ should reference it in:
+ $myCatalogManager
+ This installer can automatically add it for you,
+ but BE WARNED that once it has been added, the
+ uninstaller for this distribution CANNOT REMOVE IT
+ automatically during uninstall. If you no longer want
+ it included, you will need to remove it manually.
+
+EOF
+ REPLY=""
+ if [ ! "$batchmode" = "Yes" ]; then
+ read -s -n1 -p "Add /etc/xml/catalog to $myCatalogManager? [Yes] "
+ emit_message "$REPLY"
+ fi
+ case $REPLY in
+ [nNqQ])
+ emit_message
+ ;;
+ *)
+ etcXmlCatalog=/etc/xml/catalog
+ ;;
+ esac
+ fi
+
+ catalogBackup="$myCatalogManager.$$.bak"
+ if [ ! -w "${myCatalogManager%/*}" ]; then
+ emit_message
+ emit_message "WARNING: ${myCatalogManager%/*} directory is not writable."
+ emit_message
+ emitNoChangeMsg
+ else
+ REPLY=""
+ if [ ! "$batchmode" = "Yes" ]; then
+ emit_message
+ emit_message "Add $thisJavaXmlCatalog"
+ read -s -n1 -p "to $myCatalogManager file? [Yes] "
+ emit_message "$REPLY"
+ emit_message
+ fi
+ case $REPLY in
+ [nNqQ])
+ emitNoChangeMsg
+ ;;
+ *)
+ if [ "$catalogsLine" ] ; then
+ if [ "${catalogsLine#*$thisJavaXmlCatalog*}" != "$catalogsLine" ]; then
+ emit_message "NOTE: $thisJavaXmlCatalog"
+ emit_message " already in:"
+ emit_message " $myCatalogManager"
+ else
+ mv $myCatalogManager $catalogBackup || exit 1
+ sed "s#^catalogs=\(.*\)\$#catalogs=$thisJavaXmlCatalog;\1;$etcXmlCatalog#" $catalogBackup \
+ | sed 's/;\+/;/' | sed 's/;$//' > $myCatalogManager || exit 1
+ emit_message "NOTE: Successfully updated the following file:"
+ emit_message " $myCatalogManager"
+ emit_message " Backup written to:"
+ emit_message " $catalogBackup"
+ fi
+ else
+ mv $myCatalogManager $catalogBackup || exit 1
+ cp $catalogBackup $myCatalogManager
+ echo "catalogs=$thisJavaXmlCatalog;$etcXmlCatalog" \
+ | sed 's/;\+/;/' | sed 's/;$//' >> $myCatalogManager || exit 1
+ emit_message "NOTE: \"catalogs=\" line added to $myCatalogManager."
+ emit_message " Backup written to $catalogBackup"
+ fi
+ ;;
+ esac
+ # end of backing up and updating CatalogManager.properties
+ fi
+ fi
+ # end of CatalogManager.properties updates
+
+ if [ "$osName" = "Cygwin" ]; then
+ myCatalogManager=$(cygpath -m $myCatalogManager)
+ fi
+ return 0
+}
+
+writeDotFiles() {
+ while read; do
+ echo "$REPLY" >> $mydir/.profile.incl
+ done <<EOF
+# $thisBinDir is not in PATH, so add it
+if [ "\${PATH#*$thisBinDir*}" = "\$PATH" ]; then
+ PATH="$thisBinDir:\$PATH"
+ export PATH
+fi
+if [ -z "\$XML_CATALOG_FILES" ]; then
+ XML_CATALOG_FILES="$thisXmlCatalog"
+else
+ # $thisXmlCatalog is not in XML_CATALOG_FILES, so add it
+ if [ "\${XML_CATALOG_FILES#*$thisXmlCatalog*}" = "\$XML_CATALOG_FILES" ]; then
+ XML_CATALOG_FILES="$thisXmlCatalog \$XML_CATALOG_FILES"
+ fi
+fi
+# /etc/xml/catalog exists but is not in XML_CATALOG_FILES, so add it
+if [ -f /etc/xml/catalog ] && \
+ [ "\${XML_CATALOG_FILES#*/etc/xml/catalog*}" = "\$XML_CATALOG_FILES" ]; then
+ XML_CATALOG_FILES="\$XML_CATALOG_FILES /etc/xml/catalog"
+fi
+export XML_CATALOG_FILES
+
+if [ -z "\$SGML_CATALOG_FILES" ]; then
+ SGML_CATALOG_FILES="$thisSgmlCatalog"
+else
+ # $thisSgmlCatalog is not in SGML_CATALOG_FILES, so add it
+ if [ "\${SGML_CATALOG_FILES#*$thisSgmlCatalog}" = "\$SGML_CATALOG_FILES" ]; then
+ SGML_CATALOG_FILES="$thisSgmlCatalog:\$SGML_CATALOG_FILES"
+ fi
+fi
+# /etc/sgml/catalog exists but is not in SGML_CATALOG_FILES, so add it
+if [ -f /etc/sgml/catalog ] && \
+ [ "\${SGML_CATALOG_FILES#*/etc/sgml/catalog*}" = "\$SGML_CATALOG_FILES" ]; then
+ SGML_CATALOG_FILES="\$SGML_CATALOG_FILES:/etc/sgml/catalog"
+fi
+export SGML_CATALOG_FILES
+EOF
+
+while read; do
+ echo "$REPLY" >> $mydir/.cshrc.incl
+done <<EOF
+# $thisBinDir is not in PATH, so add it
+if ( "\\\`echo \$PATH | grep -v $thisBinDir\\\`" != "" ) then
+ setenv PATH "$thisBinDir:\$PATH"
+endif
+if ( ! $\?XML_CATALOG_FILES ) then
+ setenv XML_CATALOG_FILES "$thisXmlCatalog"
+# $thisXmlCatalog is not in XML_CATALOG_FILES, so add it
+else if ( "\\\`echo \$XML_CATALOG_FILES | grep -v $thisXmlCatalog\\\`" != "" ) then
+ setenv XML_CATALOG_FILES "$thisXmlCatalog \$XML_CATALOG_FILES"
+endif
+endif
+# /etc/xml/catalog exists but is not in XML_CATALOG_FILES, so add it
+if ( -f /etc/xml/catalog && "\\\`echo \$XML_CATALOG_FILES | grep -v /etc/xml/catalog\\\`" != "" ) then
+ setenv XML_CATALOG_FILES "\$XML_CATALOG_FILES /etc/xml/catalog"
+endif
+
+endif
+if ( ! $\?SGML_CATALOG_FILES ) then
+ setenv SGML_CATALOG_FILES "$thisSgmlCatalog"
+else if ( "\\\`echo \$SGML_CATALOG_FILES | grep -v $thisSgmlCatalog\\\`" != "" ) then
+ setenv SGML_CATALOG_FILES "$thisSgmlCatalog:\$SGML_CATALOG_FILES"
+endif
+endif
+# /etc/SGML/catalog exists but is not in SGML_CATALOG_FILES, so add it
+if ( -f /etc/sgml/catalog && "\\\`echo \$SGML_CATALOG_FILES | grep -v /etc/sgml/catalog\\\`" != "" ) then
+ setenv SGML_CATALOG_FILES {\$SGML_CATALOG_FILES}:/etc/sgml/catalog
+endif
+EOF
+
+if [ -n "$myCatalogManager" ]; then
+ myCatalogManagerDir=${myCatalogManager%/*}
+ while read; do
+ echo "$REPLY" >> $mydir/.profile.incl
+ done <<EOF
+
+
+if [ -z "\$CLASSPATH" ]; then
+ CLASSPATH="$myCatalogManagerDir"
+else
+ # $myCatalogManagerDir is not in CLASSPATH, so add it
+ if [ "\${CLASSPATH#*$myCatalogManagerDir*}" = "\$CLASSPATH" ]; then
+ CLASSPATH="$myCatalogManagerDir$classPathSeparator\$CLASSPATH"
+ fi
+fi
+export CLASSPATH
+EOF
+
+ while read; do
+ echo "$REPLY" >> $mydir/.cshrc.incl
+ done <<EOF
+
+
+if ( ! $\?CLASSPATH ) then
+ setenv CLASSPATH "$myCatalogManagerDir"
+# $myCatalogManagerDir is not in CLASSPATH, so add it
+else if ( "\\\`echo \$CLASSPATH | grep -v $myCatalogManagerDir\\\`" != "" ) then
+ setenv CLASSPATH "$myCatalogManagerDir$classPathSeparator\$CLASSPATH"
+endif
+endif
+EOF
+
+fi
+
+while read; do
+ echo "$REPLY" >> $mydir/.emacs.el
+done <<EOF
+(add-hook
+ 'nxml-mode-hook
+ (lambda ()
+ (setq rng-schema-locating-files-default
+ (append '("$thisLocatingRules")
+ rng-schema-locating-files-default ))))
+EOF
+
+return 0
+}
+
+updateUserStartupFiles() {
+ if [ ! "$batchmode" = "Yes" ]; then
+ cat 1>&2 <<EOF
+
+NOTE: To source your environment correctly for using the catalog
+ files in this distribution, you need to update one or more
+ of your shell startup files. This installer can
+ automatically make the necessary changes. Or, if you prefer,
+ you can make the changes manually.
+
+EOF
+ else
+ emit_message
+ fi
+
+ # if running csh or tcsh, target .cshrc and .tcshrc files for
+ # update; otherwise, target .bash_* and .profiles
+
+ parent=$(ps -p $PPID | grep "/")
+ if [ "${parent#*csh}" != "$parent" ] || [ "${parent#*tcsh}" != "$parent" ]; then
+ myStartupFiles=".cshrc .tcshrc"
+ appendLine="source $mydir/.cshrc.incl"
+ else
+ myStartupFiles=".bash_profile .bash_login .profile .bashrc"
+ appendLine=". $mydir/.profile.incl"
+ fi
+
+ for file in $myStartupFiles; do
+ if [ -f "$HOME/$file" ]; then
+ dotFileBackup=$HOME/$file.$$.bak
+ REPLY=""
+ if [ ! "$batchmode" = "Yes" ]; then
+ read -s -n1 -p "Update $HOME/$file? [Yes] "
+ emit_message "$REPLY"
+ fi
+ case $REPLY in
+ [nNqQ])
+ cat 1>&2 <<EOF
+
+NOTE: No change made to $HOME/$file. You either need
+ to add the following line to it, or manually source
+ the shell environment for this distribution each
+ time you want use it.
+
+$appendLine
+
+EOF
+ ;;
+ *)
+ lineExists="$(grep "$appendLine" $HOME/$file )"
+ if [ ! "$lineExists" ]; then
+ mv $HOME/$file $dotFileBackup || exit 1
+ cp $dotFileBackup $HOME/$file || exit 1
+ echo "$appendLine" >> $HOME/$file || exit 1
+ cat 1>&2 <<EOF
+NOTE: Successfully updated the following file:
+ $HOME/$file
+ Backup written to:
+ $dotFileBackup
+
+EOF
+ else
+ cat 1>&2 <<EOF
+NOTE: The following file already contains information for this
+ distribution, so I did not update it.
+ $HOME/$file
+
+EOF
+ fi
+ ;;
+ esac
+ fi
+ done
+ if [ -z "$dotFileBackup" ]; then
+ if [ ! "$batchmode" = "Yes" ]; then
+ emit_message
+ fi
+ cat 1>&2 <<EOF
+NOTE: No shell startup files updated. You can source the
+ environment for this distribution manually, each time you
+ want to use it, by typing the following.
+
+$appendLine
+
+EOF
+ fi
+}
+
+updateUserDotEmacs() {
+ if [ -f $thisLocatingRules ]; then
+ cat 1>&2 <<EOF
+
+NOTE: This distribution includes a "schema locating rules" file
+ for Emacs/nXML. To use it, you should update either your
+ .emacs or .emacs.el file. This installer can automatically
+ make the necessary changes. Or, if you prefer, you can make
+ the changes manually.
+
+EOF
+
+ emacsAppendLine="(load-file \"$mydir/.emacs.el\")"
+ myEmacsFile=
+ for file in .emacs .emacs.el; do
+ if [ -f "$HOME/$file" ]; then
+ myEmacsFile=$HOME/$file
+ break
+ fi
+ done
+ if [ ! -f "$myEmacsFile" ]; then
+ REPLY=""
+ if [ ! "$batchmode" = "Yes" ]; then
+ read -s -n1 -p "No .emacs or .emacs.el file. Create one? [No] "
+ emit_message "$REPLY"
+ emit_message
+ fi
+ case $REPLY in
+ [yY])
+ myEmacsFile=$HOME/.emacs
+ touch $myEmacsFile
+ ;;
+ *)
+ cat 1>&2 <<EOF
+NOTE: No Emacs changes made. To use this distribution with,
+ Emacs/nXML, you can create a .emacs file and manually add
+ the following line to it, or you can run it as a command
+ within Emacs.
+
+$emacsAppendLine
+
+EOF
+ ;;
+ esac
+ fi
+ if [ -n "$myEmacsFile" ]; then
+ REPLY=""
+ if [ ! "$batchmode" = "Yes" ]; then
+ read -s -n1 -p "Update $myEmacsFile? [Yes] "
+ emit_message "$REPLY"
+ emit_message
+ fi
+ case $REPLY in
+ [nNqQ])
+ cat 1>&2 <<EOF
+
+NOTE: No change made to $myEmacsFile. To use this distribution
+ with Emacs/nXML, you can manually add the following line
+ to your $myEmacsFile, or you can run it as a command
+ within Emacs.
+
+$emacsAppendLine
+
+EOF
+ ;;
+ *)
+ lineExists="$(grep "$emacsAppendLine" $myEmacsFile)"
+ if [ ! "$lineExists" ]; then
+ dotEmacsBackup=$myEmacsFile.$$.bak
+ mv $myEmacsFile $dotEmacsBackup || exit 1
+ cp $dotEmacsBackup $myEmacsFile || exit 1
+ echo "$emacsAppendLine" >> $myEmacsFile || exit 1
+ cat 1>&2 <<EOF
+NOTE: Successfully updated the following file:
+ $myEmacsFile
+ Backup written to:
+ $dotEmacsBackup
+EOF
+ else
+ cat 1>&2 <<EOF
+
+NOTE: The following file already contains information for this
+ distribution, so I did not update it.
+ $myEmacsFile
+
+EOF
+ fi
+ ;;
+ esac
+ fi
+fi
+}
+
+uninstall() {
+ if [ ! "$batchmode" = "Yes" ]; then
+ cat 1>&2 <<EOF
+
+NOTE: To "uninstall" this distribution, the changes made to your
+ CatalogManagers.properties, startup files, and/or .emacs
+ file need to be reverted. This uninstaller can automatically
+ revert them. Or, if you prefer, you can revert them manually.
+
+EOF
+ fi
+
+ if [ "$osName" = "Cygwin" ]; then
+ thisXmlCatalog=$thisJavaXmlCatalog
+ fi
+
+ # make "escaped" version of PWD to use with sed and grep
+ escapedPwd=$(echo $mydir | sed "s#/#\\\\\/#g")
+
+ # check to see if a non-empty value for catalogManager was fed
+ # to uninstaller.
+ if [ -n ${1#--catalogManager=} ]; then
+ myCatalogManager=${1#--catalogManager=}
+ catalogBackup="$myCatalogManager.$$.bak"
+ catalogsLine=$(grep "^catalogs=" $myCatalogManager)
+ if [ "$catalogsLine" ] ; then
+ if [ "${catalogsLine#*$thisXmlCatalog*}" != "$catalogsLine" ]; then
+ REPLY=""
+ if [ ! "$batchmode" = "Yes" ]; then
+ read -s -n1 -p "Revert $myCatalogManager? [Yes] "
+ emit_message "$REPLY"
+ fi
+ case $REPLY in
+ [nNqQ]*)
+ cat 1>&2 <<EOF
+
+NOTE: No change made to $myCatalogManager. You need to manually
+ remove the following path from the "catalog=" line.
+
+ $thisXmlCatalog
+
+EOF
+ ;;
+ *)
+ mv $myCatalogManager $catalogBackup || exit 1
+ sed "s#^catalogs=\(.*\)$thisXmlCatalog\(.*\)\$#catalogs=\1\2#" $catalogBackup \
+ | sed 's/;\+/;/' | sed 's/;$//' | sed 's/=;/=/' > $myCatalogManager || exit 1
+ cat 1>&2 <<EOF
+NOTE: Successfully updated the following file:
+ $myCatalogManager
+ Backup written to:
+ $catalogBackup
+
+EOF
+ ;;
+ esac
+ else
+ emit_message "NOTE: No data for this distribution found in:"
+ emit_message " $myCatalogManager"
+ emit_message
+ fi
+ else
+ cat 1>&2 <<EOF
+NOTE: No data for this distribution was found in the following
+ file, so I did not revert it.
+ $myCatalogManager
+EOF
+ fi
+ fi
+
+ if [ -n "$myEmacsFile" ]; then
+ # check to see if a non-empty value for --dotEmacs file was fed
+ # to uninstaller.
+ if [ -n ${2#--dotEmacs=} ]; then
+ myEmacsFile=${2#--dotEmacs=}
+ revertLine="(load-file \"$escapedPwd\/\.emacs\.el\")"
+ loadLine="$(grep "$revertLine" "$myEmacsFile")"
+ if [ -n "$loadLine" ]; then
+ emit_message
+ REPLY=""
+ if [ ! "$batchmode" = "Yes" ]; then
+ read -s -n1 -p "Revert $myEmacsFile? [Yes] "
+ emit_message "$REPLY"
+ fi
+ case $REPLY in
+ [nNqQ]*)
+ cat 1>&2 <<EOF
+
+NOTE: No change made to $myEmacsFile. You need to manually
+remove the following line.
+
+(load-file \"$mydir/.emacs.el\")
+
+EOF
+ ;;
+ *)
+ dotEmacsBackup=$myEmacsFile.$$.bak
+ sed -e "/$revertLine/d" -i".$$.bak" $myEmacsFile || exit 1
+ cat 1>&2 <<EOF
+NOTE: successfully reverted the following file:
+ $myEmacsFile
+ Backup written to:
+ $dotEmacsBackup
+
+EOF
+ ;;
+ esac
+ else
+ emit_message "NOTE: No data for this distribution found in:"
+ emit_message " $myEmacsFile"
+ fi
+ fi
+ fi
+
+ # check all startup files
+ myStartupFiles=".bash_profile .bash_login .profile .bashrc .cshrc .tcshrc"
+ for file in $myStartupFiles; do
+ if [ -e "$HOME/$file" ]; then
+ case $file in
+ .tcshrc|.cshrc)
+ revertLine="source $mydir/.cshrc.incl"
+ revertLineEsc="source $escapedPwd\/\.cshrc\.incl"
+ ;;
+ *)
+ revertLine=". $mydir/.profile.incl"
+ revertLineEsc="\. $escapedPwd\/\.profile\.incl"
+ ;;
+ esac
+ lineExists="$(grep "$revertLineEsc" $HOME/$file )"
+ if [ "$lineExists" ]; then
+ REPLY=""
+ if [ ! "$batchmode" = "Yes" ]; then
+ read -s -n1 -p "Update $HOME/$file? [Yes] "
+ emit_message "$REPLY"
+ fi
+ case $REPLY in
+ [nNqQ]*)
+ cat 1>&2 <<EOF
+
+NOTE: No change made to $HOME/$file. You need to manually remove
+ the following line from it.
+
+ $revertLine
+
+EOF
+ ;;
+ *)
+ dotFileBackup=$HOME/$file.$$.bak
+ sed -e "/$revertLineEsc/d" -i".$$.bak" $HOME/$file || exit 1
+ cat 1>&2 <<EOF
+NOTE: Successfully updated the following file:
+ $HOME/$file
+ Backup written to:
+ $dotFileBackup
+
+EOF
+ ;;
+ esac
+ else
+ emit_message "NOTE: No data for this distribution found in:"
+ emit_message " $HOME/$file"
+ emit_message
+ fi
+ fi
+ done
+ removeOldFiles
+ emit_message "Done. Deleted uninstall.sh file."
+ rm -f $mydir/test.sh || exit 1
+ rm -f $mydir/uninstall.sh || exit 1
+}
+
+writeUninstallFile() {
+ uninstallFile=$mydir/uninstall.sh
+ echo '#!/bin/bash' > $uninstallFile || exit 1
+ echo 'mydir=$(cd -P $(dirname $0) && pwd -P)' >> $uninstallFile || exit 1
+ echo "\$mydir/install.sh \\" >> $uninstallFile || exit 1
+ echo " --uninstall \\" >> $uninstallFile || exit 1
+ echo " --catalogManager=$myCatalogManager \\" >> $uninstallFile || exit 1
+ echo " --dotEmacs='$myEmacsFile' \\" >> $uninstallFile || exit 1
+ echo ' $@' >> $uninstallFile || exit 1
+ chmod 755 $uninstallFile || exit 1
+}
+
+writeTestFile() {
+ testFile=$mydir/test.sh
+ echo "#!/bin/bash" > $testFile || exit 1
+ echo 'mydir=$(cd -P $(dirname $0) && pwd -P)' >> $testFile || exit 1
+ echo '$mydir/install.sh --test' >> $testFile || exit 1
+ chmod 755 $testFile || exit 1
+}
+
+printExitMessage() {
+ cat 1>&2 <<EOF
+To source your shell environment for this distribution, type the
+following:
+
+$appendLine
+
+EOF
+}
+
+checkForResolver() {
+ resolverResponse="$(java org.apache.xml.resolver.apps.resolver uri -u foo 2>/dev/null)"
+ if [ -z "$resolverResponse" ]; then
+ cat 1>&2 <<EOF
+
+NOTE: Your environment does not seem to contain the Apache XML
+ Commons Resolver; without that, you can't use XML catalogs
+ with Java applications. For more information, see the "How
+ to use a catalog file" section in Bob Stayton's "DocBook
+ XSL: The Complete Guide"
+
+ http://sagehill.net/docbookxsl/UseCatalog.html
+
+EOF
+ fi
+}
+
+emitNoChangeMsg() {
+ cat 1>&2 <<EOF
+
+NOTE: No changes were made to CatalogManagers.properties. To
+ provide your Java tools with XML catalog information for
+ this distribution, you will need to make the appropriate
+ changes manually.
+
+EOF
+}
+
+testCatalogs() {
+ if [ ! -f "$thisXmlCatalog" ]; then
+ cat 1>&2 <<EOF
+
+FATAL: $thisXmlCatalog file needed but not found. Stopping.
+EOF
+ exit
+ fi
+
+ if [ -z "$XML_CATALOG_FILES" ]; then
+ emit_message
+ emit_message "WARNING: XML_CATALOG_FILES not set. Not testing with xmlcatalog."
+ else
+ xmlCatalogResponse="$(xmlcatalog 2>/dev/null)"
+ if [ -z "$xmlCatalogResponse" ]; then
+ cat 1>&2 <<EOF
+
+WARNING: Cannot locate the "xmlcatalog" command. Make sure that
+ you have libxml2 and its associated utilities installed.
+
+ http://xmlsoft.org/
+
+EOF
+ else
+ emit_message "Testing with xmlcatalog..."
+ # read in pathname-uri pairs from .urilist file
+ while read pair; do
+ if [ ! "${pair%* *}" = "." ]; then
+ path=$mydir/${pair%* *}
+ else
+ path=$mydir/
+ fi
+ uri=${pair#* *}
+ emit_message
+ emit_message " Tested: $uri"
+ for catalog in $XML_CATALOG_FILES; do
+ response="$(xmlcatalog $catalog $uri| grep -v "No entry")"
+ if [ -n "$response" ]; then
+ if [ "$response" = "$path" ]; then
+ emit_message " Result: $path"
+ break
+ else
+ emit_message " Result: FAILED"
+ fi
+ fi
+ done
+ done < $mydir/.urilist
+ fi
+ fi
+
+ if [ -z "$CLASSPATH" ]; then
+ emit_message
+ emit_message "NOTE: CLASSPATH not set. Not testing with Apache XML Commons Resolver."
+ else
+ if [ "$(checkForResolver)" ]; then
+ checkForResolver
+ else
+ emit_message
+ emit_message "Testing with Apache XML Commons Resolver..."
+ # read in pathname-uri pairs from .urilist file
+ while read pair; do
+ if [ ! "${pair%* *}" = "." ]; then
+ path=$mydir/${pair%* *}
+ else
+ path=$mydir/
+ fi
+ uri=${pair#* *}
+ emit_message
+ emit_message " Tested: $uri"
+ if [ ${uri%.dtd} != $uri ]; then
+ response="$(java org.apache.xml.resolver.apps.resolver system -s $uri | grep "Result")"
+ else
+ response="$(java org.apache.xml.resolver.apps.resolver uri -u $uri | grep "Result")"
+ fi
+ if [ "$response" ]; then
+ if [ "${response#*$path}" != "$response" ]; then
+ emit_message " Result: $path"
+ else
+ emit_message " Result: FAILED"
+ fi
+ echo
+ fi
+ done < $mydir/.urilist
+ fi
+ fi
+}
+
+# get opts and execute appropriate function
+case $1 in
+ *-uninstall)
+ uninstall $2 $3 $4
+ ;;
+ *-test)
+ testCatalogs
+ ;;
+ *)
+ main
+ ;;
+esac
+
+# Copyright
+# ---------
+# Copyright 2005-2007 Michael(tm) Smith <smith@sideshowbarker.net>
+#
+# Permission is hereby granted, free of charge, to any person
+# obtaining a copy of this software and associated documentation
+# files (the "Software"), to deal in the Software without
+# restriction, including without limitation the rights to use, copy,
+# modify, merge, publish, distribute, sublicense, and/or sell copies
+# of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be
+# included in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+# DEALINGS IN THE SOFTWARE.
+
+# vim: number
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/javahelp/javahelp.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/javahelp/javahelp.xsl
new file mode 100644
index 0000000..593e9b0
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/javahelp/javahelp.xsl
@@ -0,0 +1,625 @@
+<?xml version="1.0"?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:doc="http://nwalsh.com/xsl/documentation/1.0"
+ xmlns:ng="http://docbook.org/docbook-ng"
+ xmlns:db="http://docbook.org/ns/docbook"
+ xmlns:exsl="http://exslt.org/common"
+ version="1.0"
+ exclude-result-prefixes="doc ng db exsl">
+
+<xsl:import href="../html/chunk.xsl"/>
+
+<xsl:output method="html"/>
+
+<!-- ********************************************************************
+ $Id: javahelp.xsl 8400 2009-04-08 07:44:54Z bobstayton $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<!-- ==================================================================== -->
+
+<xsl:template match="/">
+ <!-- * Get a title for current doc so that we let the user -->
+ <!-- * know what document we are processing at this point. -->
+ <xsl:variable name="doc.title">
+ <xsl:call-template name="get.doc.title"/>
+ </xsl:variable>
+ <xsl:choose>
+ <!-- Hack! If someone hands us a DocBook V5.x or DocBook NG document,
+ toss the namespace and continue. Use the docbook5 namespaced
+ stylesheets for DocBook5 if you don't want to use this feature.-->
+ <xsl:when test="$exsl.node.set.available != 0
+ and (*/self::ng:* or */self::db:*)">
+ <xsl:call-template name="log.message">
+ <xsl:with-param name="level">Note</xsl:with-param>
+ <xsl:with-param name="source" select="$doc.title"/>
+ <xsl:with-param name="context-desc">
+ <xsl:text>namesp. cut</xsl:text>
+ </xsl:with-param>
+ <xsl:with-param name="message">
+ <xsl:text>stripped namespace before processing</xsl:text>
+ </xsl:with-param>
+ </xsl:call-template>
+ <xsl:variable name="nons">
+ <xsl:apply-templates mode="stripNS"/>
+ </xsl:variable>
+ <xsl:call-template name="log.message">
+ <xsl:with-param name="level">Note</xsl:with-param>
+ <xsl:with-param name="source" select="$doc.title"/>
+ <xsl:with-param name="context-desc">
+ <xsl:text>namesp. cut</xsl:text>
+ </xsl:with-param>
+ <xsl:with-param name="message">
+ <xsl:text>processing stripped document</xsl:text>
+ </xsl:with-param>
+ </xsl:call-template>
+ <xsl:apply-templates select="exsl:node-set($nons)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:choose>
+ <xsl:when test="$rootid != ''">
+ <xsl:choose>
+ <xsl:when test="count(key('id',$rootid)) = 0">
+ <xsl:message terminate="yes">
+ <xsl:text>ID '</xsl:text>
+ <xsl:value-of select="$rootid"/>
+ <xsl:text>' not found in document.</xsl:text>
+ </xsl:message>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:message>Formatting from <xsl:value-of select="$rootid"/></xsl:message>
+ <xsl:apply-templates select="key('id',$rootid)" mode="process.root"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="/" mode="process.root"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:for-each select="/"> <!-- This is just a hook for building profiling stylesheets -->
+ <xsl:call-template name="helpset"/>
+ <xsl:call-template name="helptoc"/>
+ <xsl:call-template name="helpmap"/>
+ <xsl:call-template name="helpidx"/>
+ </xsl:for-each>
+</xsl:otherwise>
+</xsl:choose>
+</xsl:template>
+
+<xsl:template name="header.navigation">
+</xsl:template>
+
+<xsl:template name="footer.navigation">
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template name="helpset">
+ <xsl:call-template name="write.chunk.with.doctype">
+ <xsl:with-param name="filename" select="concat($base.dir,'jhelpset.hs')"/>
+ <xsl:with-param name="method" select="'xml'"/>
+ <xsl:with-param name="indent" select="'yes'"/>
+ <xsl:with-param name="doctype-public" select="'-//Sun Microsystems Inc.//DTD JavaHelp HelpSet Version 1.0//EN'"/>
+ <xsl:with-param name="doctype-system" select="'http://java.sun.com/products/javahelp/helpset_1_0.dtd'"/>
+ <xsl:with-param name="content">
+ <xsl:call-template name="helpset.content"/>
+ </xsl:with-param>
+ <xsl:with-param name="quiet" select="$chunk.quietly"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template name="helpset.content">
+ <xsl:variable name="title">
+ <xsl:apply-templates select="." mode="title.markup"/>
+ </xsl:variable>
+
+ <helpset version="1.0">
+ <title>
+ <xsl:value-of select="normalize-space($title)"/>
+ </title>
+
+ <!-- maps -->
+ <maps>
+ <homeID>top</homeID>
+ <mapref location="jhelpmap.jhm"/>
+ </maps>
+
+ <!-- views -->
+ <view>
+ <name>TOC</name>
+ <label>Table Of Contents</label>
+ <type>javax.help.TOCView</type>
+ <data>jhelptoc.xml</data>
+ </view>
+
+ <view>
+ <name>Index</name>
+ <label>Index</label>
+ <type>javax.help.IndexView</type>
+ <data>jhelpidx.xml</data>
+ </view>
+
+ <view>
+ <name>Search</name>
+ <label>Search</label>
+ <type>javax.help.SearchView</type>
+ <data engine="com.sun.java.help.search.DefaultSearchEngine">JavaHelpSearch</data>
+ </view>
+ </helpset>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template name="helptoc">
+ <xsl:call-template name="write.chunk.with.doctype">
+ <xsl:with-param name="filename" select="concat($base.dir,'jhelptoc.xml')"/>
+ <xsl:with-param name="method" select="'xml'"/>
+ <xsl:with-param name="indent" select="'yes'"/>
+ <xsl:with-param name="doctype-public" select="'-//Sun Microsystems Inc.//DTD JavaHelp TOC Version 1.0//EN'"/>
+ <xsl:with-param name="doctype-system" select="'http://java.sun.com/products/javahelp/toc_1_0.dtd'"/>
+ <xsl:with-param name="encoding" select="$javahelp.encoding"/>
+ <xsl:with-param name="content">
+ <xsl:call-template name="helptoc.content"/>
+ </xsl:with-param>
+ <xsl:with-param name="quiet" select="$chunk.quietly"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template name="helptoc.content">
+ <toc version="1.0">
+ <xsl:choose>
+ <xsl:when test="$rootid != ''">
+ <xsl:apply-templates select="key('id',$rootid)" mode="jhtoc"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="." mode="jhtoc"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </toc>
+</xsl:template>
+
+<xsl:template match="set" mode="jhtoc">
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id">
+ <xsl:with-param name="object" select="."/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:variable name="title">
+ <xsl:apply-templates select="." mode="title.markup"/>
+ </xsl:variable>
+
+ <tocitem target="{$id}">
+ <xsl:attribute name="text">
+ <xsl:value-of select="normalize-space($title)"/>
+ </xsl:attribute>
+ <xsl:apply-templates select="book" mode="jhtoc"/>
+ </tocitem>
+</xsl:template>
+
+<xsl:template match="book" mode="jhtoc">
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+ <xsl:variable name="title">
+ <xsl:apply-templates select="." mode="title.markup"/>
+ </xsl:variable>
+
+ <tocitem target="{$id}">
+ <xsl:attribute name="text">
+ <xsl:value-of select="normalize-space($title)"/>
+ </xsl:attribute>
+ <xsl:apply-templates select="part|reference|preface|chapter|appendix|article|colophon|glossary|bibliography"
+ mode="jhtoc"/>
+ </tocitem>
+</xsl:template>
+
+<xsl:template match="part|reference|preface|chapter|appendix|article"
+ mode="jhtoc">
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+ <xsl:variable name="title">
+ <xsl:apply-templates select="." mode="title.markup"/>
+ </xsl:variable>
+
+ <tocitem target="{$id}">
+ <xsl:attribute name="text">
+ <xsl:value-of select="normalize-space($title)"/>
+ </xsl:attribute>
+ <xsl:apply-templates
+ select="article|preface|chapter|appendix|refentry|section|sect1|glossary|bibliography"
+ mode="jhtoc"/>
+ </tocitem>
+</xsl:template>
+
+<xsl:template match="section" mode="jhtoc">
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+ <xsl:variable name="title">
+ <xsl:apply-templates select="." mode="title.markup"/>
+ </xsl:variable>
+
+ <tocitem target="{$id}">
+ <xsl:attribute name="text">
+ <xsl:value-of select="normalize-space($title)"/>
+ </xsl:attribute>
+ <xsl:apply-templates select="section" mode="jhtoc"/>
+ </tocitem>
+</xsl:template>
+
+<xsl:template match="sect1" mode="jhtoc">
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+ <xsl:variable name="title">
+ <xsl:apply-templates select="." mode="title.markup"/>
+ </xsl:variable>
+
+ <tocitem target="{$id}">
+ <xsl:attribute name="text">
+ <xsl:value-of select="normalize-space($title)"/>
+ </xsl:attribute>
+ <xsl:apply-templates select="sect2" mode="jhtoc"/>
+ </tocitem>
+</xsl:template>
+
+<xsl:template match="sect2" mode="jhtoc">
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+ <xsl:variable name="title">
+ <xsl:apply-templates select="." mode="title.markup"/>
+ </xsl:variable>
+
+ <tocitem target="{$id}">
+ <xsl:attribute name="text">
+ <xsl:value-of select="normalize-space($title)"/>
+ </xsl:attribute>
+ <xsl:apply-templates select="sect3" mode="jhtoc"/>
+ </tocitem>
+</xsl:template>
+
+<xsl:template match="sect3" mode="jhtoc">
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+ <xsl:variable name="title">
+ <xsl:apply-templates select="." mode="title.markup"/>
+ </xsl:variable>
+
+ <tocitem target="{$id}">
+ <xsl:attribute name="text">
+ <xsl:value-of select="normalize-space($title)"/>
+ </xsl:attribute>
+ <xsl:apply-templates select="sect4" mode="jhtoc"/>
+ </tocitem>
+</xsl:template>
+
+<xsl:template match="sect4" mode="jhtoc">
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+ <xsl:variable name="title">
+ <xsl:apply-templates select="." mode="title.markup"/>
+ </xsl:variable>
+
+ <tocitem target="{$id}">
+ <xsl:attribute name="text">
+ <xsl:value-of select="normalize-space($title)"/>
+ </xsl:attribute>
+ <xsl:apply-templates select="sect5" mode="jhtoc"/>
+ </tocitem>
+</xsl:template>
+
+<xsl:template match="sect5|colophon|refentry" mode="jhtoc">
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+ <xsl:variable name="title">
+ <xsl:apply-templates select="." mode="title.markup"/>
+ </xsl:variable>
+
+ <tocitem target="{$id}">
+ <xsl:attribute name="text">
+ <xsl:value-of select="normalize-space($title)"/>
+ </xsl:attribute>
+ </tocitem>
+</xsl:template>
+
+
+<xsl:template match="glossary" mode="jhtoc">
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+
+ <xsl:variable name="title">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'Glossary'"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <tocitem target="{$id}">
+ <xsl:attribute name="text">
+ <xsl:value-of select="$title"/>
+ </xsl:attribute>
+ </tocitem>
+
+</xsl:template>
+
+<xsl:template match="bibliography" mode="jhtoc">
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+
+ <xsl:variable name="title">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'Bibliography'"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <tocitem target="{$id}">
+ <xsl:attribute name="text">
+ <xsl:value-of select="$title"/>
+ </xsl:attribute>
+
+ </tocitem>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template name="helpmap">
+ <xsl:call-template name="write.chunk.with.doctype">
+ <xsl:with-param name="filename" select="concat($base.dir, 'jhelpmap.jhm')"/>
+ <xsl:with-param name="method" select="'xml'"/>
+ <xsl:with-param name="indent" select="'yes'"/>
+ <xsl:with-param name="doctype-public" select="'-//Sun Microsystems Inc.//DTD JavaHelp Map Version 1.0//EN'"/>
+ <xsl:with-param name="doctype-system" select="'http://java.sun.com/products/javahelp/map_1_0.dtd'"/>
+ <xsl:with-param name="encoding" select="$javahelp.encoding"/>
+ <xsl:with-param name="content">
+ <xsl:call-template name="helpmap.content"/>
+ </xsl:with-param>
+ <xsl:with-param name="quiet" select="$chunk.quietly"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template name="helpmap.content">
+ <map version="1.0">
+ <xsl:choose>
+ <xsl:when test="$rootid != ''">
+ <xsl:apply-templates select="key('id',$rootid)//set
+ | key('id',$rootid)//book
+ | key('id',$rootid)//part
+ | key('id',$rootid)//reference
+ | key('id',$rootid)//preface
+ | key('id',$rootid)//chapter
+ | key('id',$rootid)//appendix
+ | key('id',$rootid)//article
+ | key('id',$rootid)//colophon
+ | key('id',$rootid)//refentry
+ | key('id',$rootid)//section
+ | key('id',$rootid)//sect1
+ | key('id',$rootid)//sect2
+ | key('id',$rootid)//sect3
+ | key('id',$rootid)//sect4
+ | key('id',$rootid)//sect5
+ | key('id',$rootid)//indexterm
+ | key('id',$rootid)//glossary
+ | key('id',$rootid)//bibliography
+ | key('id',$rootid)//*[@id]"
+ mode="map"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="//set
+ | //book
+ | //part
+ | //reference
+ | //preface
+ | //chapter
+ | //appendix
+ | //article
+ | //colophon
+ | //refentry
+ | //section
+ | //sect1
+ | //sect2
+ | //sect3
+ | //sect4
+ | //sect5
+ | //indexterm
+ | //glossary
+ | //bibliography
+ | //*[@id]"
+ mode="map"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </map>
+</xsl:template>
+
+<xsl:template match="set" mode="map">
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id">
+ <xsl:with-param name="object" select="."/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <mapID target="{$id}">
+ <xsl:attribute name="url">
+ <xsl:call-template name="href.target.uri"/>
+ </xsl:attribute>
+ </mapID>
+</xsl:template>
+
+<xsl:template match="book" mode="map">
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+
+ <mapID target="{$id}">
+ <xsl:attribute name="url">
+ <xsl:call-template name="href.target.uri"/>
+ </xsl:attribute>
+ </mapID>
+</xsl:template>
+
+<xsl:template match="part|reference|preface|chapter|appendix|refentry|article|glossary|bibliography"
+ mode="map">
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+
+ <mapID target="{$id}">
+ <xsl:attribute name="url">
+ <xsl:call-template name="href.target.uri"/>
+ </xsl:attribute>
+ </mapID>
+</xsl:template>
+
+<xsl:template match="section|sect1|sect2|sect3|sect4|sect5|colophon" mode="map">
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+
+ <mapID target="{$id}">
+ <xsl:attribute name="url">
+ <xsl:call-template name="href.target.uri"/>
+ </xsl:attribute>
+ </mapID>
+</xsl:template>
+
+<xsl:template match="indexterm[@class='endofrange']" mode="map"/>
+
+<xsl:template match="indexterm" mode="map">
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+
+ <mapID target="{$id}">
+ <xsl:attribute name="url">
+ <xsl:call-template name="href.target.uri"/>
+ </xsl:attribute>
+ </mapID>
+</xsl:template>
+
+<xsl:template match="*[@id]" mode="map">
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+
+ <mapID target="{$id}">
+ <xsl:attribute name="url">
+ <xsl:call-template name="href.target.uri"/>
+ </xsl:attribute>
+ </mapID>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template name="helpidx">
+ <xsl:call-template name="write.chunk.with.doctype">
+ <xsl:with-param name="filename" select="concat($base.dir, 'jhelpidx.xml')"/>
+ <xsl:with-param name="method" select="'xml'"/>
+ <xsl:with-param name="indent" select="'yes'"/>
+ <xsl:with-param name="doctype-public" select="'-//Sun Microsystems Inc.//DTD JavaHelp Index Version 1.0//EN'"/>
+ <xsl:with-param name="doctype-system" select="'http://java.sun.com/products/javahelp/index_1_0.dtd'"/>
+ <xsl:with-param name="encoding" select="$javahelp.encoding"/>
+ <xsl:with-param name="content">
+ <xsl:call-template name="helpidx.content"/>
+ </xsl:with-param>
+ <xsl:with-param name="quiet" select="$chunk.quietly"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template name="helpidx.content">
+ <index version="1.0">
+ <xsl:choose>
+ <xsl:when test="$rootid != ''">
+ <xsl:apply-templates select="key('id',$rootid)//indexterm" mode="idx">
+ <xsl:sort select="primary"/>
+ <xsl:sort select="secondary"/>
+ <xsl:sort select="tertiary"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="//indexterm" mode="idx">
+ <xsl:sort select="primary"/>
+ <xsl:sort select="secondary"/>
+ <xsl:sort select="tertiary"/>
+ </xsl:apply-templates>
+ </xsl:otherwise>
+ </xsl:choose>
+ </index>
+</xsl:template>
+
+<xsl:template match="indexterm[@class='endofrange']" mode="idx"/>
+
+<xsl:template match="indexterm" mode="idx">
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+
+ <xsl:variable name="text">
+ <xsl:value-of select="normalize-space(primary)"/>
+ <xsl:if test="secondary">
+ <xsl:text>, </xsl:text>
+ <xsl:value-of select="normalize-space(secondary)"/>
+ </xsl:if>
+ <xsl:if test="tertiary">
+ <xsl:text>, </xsl:text>
+ <xsl:value-of select="normalize-space(tertiary)"/>
+ </xsl:if>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="see">
+ <xsl:variable name="see"><xsl:value-of select="normalize-space(see)"/></xsl:variable>
+ <indexitem text="{$text} see '{$see}'"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <indexitem text="{$text}" target="{$id}"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ==================================================================== -->
+<!-- Kludge for Xalan outputting &trade; which fails in javahelp -->
+<xsl:template name="dingbat.characters">
+ <!-- now that I'm using the real serializer, all that dingbat malarky -->
+ <!-- isn't necessary anymore... -->
+ <xsl:param name="dingbat">bullet</xsl:param>
+
+ <xsl:choose>
+ <xsl:when test="$dingbat='bullet'">&#x2022;</xsl:when>
+ <xsl:when test="$dingbat='copyright'">&#x00A9;</xsl:when>
+ <xsl:when test="$dingbat='trademark' or $dingbat='trade'">
+ <xsl:choose>
+ <xsl:when test="contains(system-property('xsl:vendor'),
+ 'Apache Software Foundation')">
+ <sup>TM</sup>
+ </xsl:when>
+ <xsl:otherwise>&#x2122;</xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:when test="$dingbat='registered'">&#x00AE;</xsl:when>
+ <xsl:when test="$dingbat='service'">(SM)</xsl:when>
+ <xsl:when test="$dingbat='nbsp'">&#x00A0;</xsl:when>
+ <xsl:when test="$dingbat='ldquo'">&#x201C;</xsl:when>
+ <xsl:when test="$dingbat='rdquo'">&#x201D;</xsl:when>
+ <xsl:when test="$dingbat='lsquo'">&#x2018;</xsl:when>
+ <xsl:when test="$dingbat='rsquo'">&#x2019;</xsl:when>
+ <xsl:when test="$dingbat='em-dash'">&#x2014;</xsl:when>
+ <xsl:when test="$dingbat='mdash'">&#x2014;</xsl:when>
+ <xsl:when test="$dingbat='en-dash'">&#x2013;</xsl:when>
+ <xsl:when test="$dingbat='ndash'">&#x2013;</xsl:when>
+ <xsl:otherwise>
+ <xsl:text>&#x2022;</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/javahelp/profile-javahelp.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/javahelp/profile-javahelp.xsl
new file mode 100644
index 0000000..eabac3e
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/javahelp/profile-javahelp.xsl
@@ -0,0 +1,549 @@
+<?xml version="1.0" encoding="US-ASCII"?>
+<!--This file was created automatically by xsl2profile-->
+<!--from the DocBook XSL stylesheets.-->
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:doc="http://nwalsh.com/xsl/documentation/1.0" xmlns:ng="http://docbook.org/docbook-ng" xmlns:db="http://docbook.org/ns/docbook" xmlns:exsl="http://exslt.org/common" xmlns:exslt="http://exslt.org/common" exslt:dummy="dummy" ng:dummy="dummy" db:dummy="dummy" extension-element-prefixes="exslt" version="1.0" exclude-result-prefixes="doc ng db exsl exslt">
+
+<xsl:import href="../html/chunk.xsl"/>
+
+<xsl:output method="html"/>
+
+<!-- ********************************************************************
+ $Id: javahelp.xsl 8400 2009-04-08 07:44:54Z bobstayton $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<!-- ==================================================================== -->
+
+<xslo:include xmlns:xslo="http://www.w3.org/1999/XSL/Transform" href="../profiling/profile-mode.xsl"/><xslo:variable xmlns:xslo="http://www.w3.org/1999/XSL/Transform" name="profiled-content"><xslo:choose><xslo:when test="*/self::ng:* or */self::db:*"><xslo:message>Note: namesp. cut : stripped namespace before processing</xslo:message><xslo:variable name="stripped-content"><xslo:apply-templates select="/" mode="stripNS"/></xslo:variable><xslo:message>Note: namesp. cut : processing stripped document</xslo:message><xslo:apply-templates select="exslt:node-set($stripped-content)" mode="profile"/></xslo:when><xslo:otherwise><xslo:apply-templates select="/" mode="profile"/></xslo:otherwise></xslo:choose></xslo:variable><xslo:variable xmlns:xslo="http://www.w3.org/1999/XSL/Transform" name="profiled-nodes" select="exslt:node-set($profiled-content)"/><xsl:template match="/">
+ <!-- * Get a title for current doc so that we let the user -->
+ <!-- * know what document we are processing at this point. -->
+ <xsl:variable name="doc.title">
+ <xsl:call-template name="get.doc.title"/>
+ </xsl:variable>
+ <xsl:choose>
+ <!-- Hack! If someone hands us a DocBook V5.x or DocBook NG document,
+ toss the namespace and continue. Use the docbook5 namespaced
+ stylesheets for DocBook5 if you don't want to use this feature.-->
+ <xsl:when test="false()"/>
+ <xsl:otherwise>
+ <xsl:choose>
+ <xsl:when test="$rootid != ''">
+ <xsl:choose>
+ <xsl:when test="count($profiled-nodes//*[@id=$rootid]) = 0">
+ <xsl:message terminate="yes">
+ <xsl:text>ID '</xsl:text>
+ <xsl:value-of select="$rootid"/>
+ <xsl:text>' not found in document.</xsl:text>
+ </xsl:message>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:message>Formatting from <xsl:value-of select="$rootid"/></xsl:message>
+ <xsl:apply-templates select="$profiled-nodes//*[@id=$rootid]" mode="process.root"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="$profiled-nodes" mode="process.root"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:for-each select="$profiled-nodes"> <!-- This is just a hook for building profiling stylesheets -->
+ <xsl:call-template name="helpset"/>
+ <xsl:call-template name="helptoc"/>
+ <xsl:call-template name="helpmap"/>
+ <xsl:call-template name="helpidx"/>
+ </xsl:for-each>
+</xsl:otherwise>
+</xsl:choose>
+</xsl:template>
+
+<xsl:template name="header.navigation">
+</xsl:template>
+
+<xsl:template name="footer.navigation">
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template name="helpset">
+ <xsl:call-template name="write.chunk.with.doctype">
+ <xsl:with-param name="filename" select="concat($base.dir,'jhelpset.hs')"/>
+ <xsl:with-param name="method" select="'xml'"/>
+ <xsl:with-param name="indent" select="'yes'"/>
+ <xsl:with-param name="doctype-public" select="'-//Sun Microsystems Inc.//DTD JavaHelp HelpSet Version 1.0//EN'"/>
+ <xsl:with-param name="doctype-system" select="'http://java.sun.com/products/javahelp/helpset_1_0.dtd'"/>
+ <xsl:with-param name="content">
+ <xsl:call-template name="helpset.content"/>
+ </xsl:with-param>
+ <xsl:with-param name="quiet" select="$chunk.quietly"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template name="helpset.content">
+ <xsl:variable name="title">
+ <xsl:apply-templates select="." mode="title.markup"/>
+ </xsl:variable>
+
+ <helpset version="1.0">
+ <title>
+ <xsl:value-of select="normalize-space($title)"/>
+ </title>
+
+ <!-- maps -->
+ <maps>
+ <homeID>top</homeID>
+ <mapref location="jhelpmap.jhm"/>
+ </maps>
+
+ <!-- views -->
+ <view>
+ <name>TOC</name>
+ <label>Table Of Contents</label>
+ <type>javax.help.TOCView</type>
+ <data>jhelptoc.xml</data>
+ </view>
+
+ <view>
+ <name>Index</name>
+ <label>Index</label>
+ <type>javax.help.IndexView</type>
+ <data>jhelpidx.xml</data>
+ </view>
+
+ <view>
+ <name>Search</name>
+ <label>Search</label>
+ <type>javax.help.SearchView</type>
+ <data engine="com.sun.java.help.search.DefaultSearchEngine">JavaHelpSearch</data>
+ </view>
+ </helpset>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template name="helptoc">
+ <xsl:call-template name="write.chunk.with.doctype">
+ <xsl:with-param name="filename" select="concat($base.dir,'jhelptoc.xml')"/>
+ <xsl:with-param name="method" select="'xml'"/>
+ <xsl:with-param name="indent" select="'yes'"/>
+ <xsl:with-param name="doctype-public" select="'-//Sun Microsystems Inc.//DTD JavaHelp TOC Version 1.0//EN'"/>
+ <xsl:with-param name="doctype-system" select="'http://java.sun.com/products/javahelp/toc_1_0.dtd'"/>
+ <xsl:with-param name="encoding" select="$javahelp.encoding"/>
+ <xsl:with-param name="content">
+ <xsl:call-template name="helptoc.content"/>
+ </xsl:with-param>
+ <xsl:with-param name="quiet" select="$chunk.quietly"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template name="helptoc.content">
+ <toc version="1.0">
+ <xsl:choose>
+ <xsl:when test="$rootid != ''">
+ <xsl:apply-templates select="key('id',$rootid)" mode="jhtoc"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="." mode="jhtoc"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </toc>
+</xsl:template>
+
+<xsl:template match="set" mode="jhtoc">
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id">
+ <xsl:with-param name="object" select="."/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:variable name="title">
+ <xsl:apply-templates select="." mode="title.markup"/>
+ </xsl:variable>
+
+ <tocitem target="{$id}">
+ <xsl:attribute name="text">
+ <xsl:value-of select="normalize-space($title)"/>
+ </xsl:attribute>
+ <xsl:apply-templates select="book" mode="jhtoc"/>
+ </tocitem>
+</xsl:template>
+
+<xsl:template match="book" mode="jhtoc">
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+ <xsl:variable name="title">
+ <xsl:apply-templates select="." mode="title.markup"/>
+ </xsl:variable>
+
+ <tocitem target="{$id}">
+ <xsl:attribute name="text">
+ <xsl:value-of select="normalize-space($title)"/>
+ </xsl:attribute>
+ <xsl:apply-templates select="part|reference|preface|chapter|appendix|article|colophon|glossary|bibliography" mode="jhtoc"/>
+ </tocitem>
+</xsl:template>
+
+<xsl:template match="part|reference|preface|chapter|appendix|article" mode="jhtoc">
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+ <xsl:variable name="title">
+ <xsl:apply-templates select="." mode="title.markup"/>
+ </xsl:variable>
+
+ <tocitem target="{$id}">
+ <xsl:attribute name="text">
+ <xsl:value-of select="normalize-space($title)"/>
+ </xsl:attribute>
+ <xsl:apply-templates select="article|preface|chapter|appendix|refentry|section|sect1|glossary|bibliography" mode="jhtoc"/>
+ </tocitem>
+</xsl:template>
+
+<xsl:template match="section" mode="jhtoc">
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+ <xsl:variable name="title">
+ <xsl:apply-templates select="." mode="title.markup"/>
+ </xsl:variable>
+
+ <tocitem target="{$id}">
+ <xsl:attribute name="text">
+ <xsl:value-of select="normalize-space($title)"/>
+ </xsl:attribute>
+ <xsl:apply-templates select="section" mode="jhtoc"/>
+ </tocitem>
+</xsl:template>
+
+<xsl:template match="sect1" mode="jhtoc">
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+ <xsl:variable name="title">
+ <xsl:apply-templates select="." mode="title.markup"/>
+ </xsl:variable>
+
+ <tocitem target="{$id}">
+ <xsl:attribute name="text">
+ <xsl:value-of select="normalize-space($title)"/>
+ </xsl:attribute>
+ <xsl:apply-templates select="sect2" mode="jhtoc"/>
+ </tocitem>
+</xsl:template>
+
+<xsl:template match="sect2" mode="jhtoc">
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+ <xsl:variable name="title">
+ <xsl:apply-templates select="." mode="title.markup"/>
+ </xsl:variable>
+
+ <tocitem target="{$id}">
+ <xsl:attribute name="text">
+ <xsl:value-of select="normalize-space($title)"/>
+ </xsl:attribute>
+ <xsl:apply-templates select="sect3" mode="jhtoc"/>
+ </tocitem>
+</xsl:template>
+
+<xsl:template match="sect3" mode="jhtoc">
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+ <xsl:variable name="title">
+ <xsl:apply-templates select="." mode="title.markup"/>
+ </xsl:variable>
+
+ <tocitem target="{$id}">
+ <xsl:attribute name="text">
+ <xsl:value-of select="normalize-space($title)"/>
+ </xsl:attribute>
+ <xsl:apply-templates select="sect4" mode="jhtoc"/>
+ </tocitem>
+</xsl:template>
+
+<xsl:template match="sect4" mode="jhtoc">
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+ <xsl:variable name="title">
+ <xsl:apply-templates select="." mode="title.markup"/>
+ </xsl:variable>
+
+ <tocitem target="{$id}">
+ <xsl:attribute name="text">
+ <xsl:value-of select="normalize-space($title)"/>
+ </xsl:attribute>
+ <xsl:apply-templates select="sect5" mode="jhtoc"/>
+ </tocitem>
+</xsl:template>
+
+<xsl:template match="sect5|colophon|refentry" mode="jhtoc">
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+ <xsl:variable name="title">
+ <xsl:apply-templates select="." mode="title.markup"/>
+ </xsl:variable>
+
+ <tocitem target="{$id}">
+ <xsl:attribute name="text">
+ <xsl:value-of select="normalize-space($title)"/>
+ </xsl:attribute>
+ </tocitem>
+</xsl:template>
+
+
+<xsl:template match="glossary" mode="jhtoc">
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+
+ <xsl:variable name="title">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'Glossary'"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <tocitem target="{$id}">
+ <xsl:attribute name="text">
+ <xsl:value-of select="$title"/>
+ </xsl:attribute>
+ </tocitem>
+
+</xsl:template>
+
+<xsl:template match="bibliography" mode="jhtoc">
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+
+ <xsl:variable name="title">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'Bibliography'"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <tocitem target="{$id}">
+ <xsl:attribute name="text">
+ <xsl:value-of select="$title"/>
+ </xsl:attribute>
+
+ </tocitem>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template name="helpmap">
+ <xsl:call-template name="write.chunk.with.doctype">
+ <xsl:with-param name="filename" select="concat($base.dir, 'jhelpmap.jhm')"/>
+ <xsl:with-param name="method" select="'xml'"/>
+ <xsl:with-param name="indent" select="'yes'"/>
+ <xsl:with-param name="doctype-public" select="'-//Sun Microsystems Inc.//DTD JavaHelp Map Version 1.0//EN'"/>
+ <xsl:with-param name="doctype-system" select="'http://java.sun.com/products/javahelp/map_1_0.dtd'"/>
+ <xsl:with-param name="encoding" select="$javahelp.encoding"/>
+ <xsl:with-param name="content">
+ <xsl:call-template name="helpmap.content"/>
+ </xsl:with-param>
+ <xsl:with-param name="quiet" select="$chunk.quietly"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template name="helpmap.content">
+ <map version="1.0">
+ <xsl:choose>
+ <xsl:when test="$rootid != ''">
+ <xsl:apply-templates select="key('id',$rootid)//set | key('id',$rootid)//book | key('id',$rootid)//part | key('id',$rootid)//reference | key('id',$rootid)//preface | key('id',$rootid)//chapter | key('id',$rootid)//appendix | key('id',$rootid)//article | key('id',$rootid)//colophon | key('id',$rootid)//refentry | key('id',$rootid)//section | key('id',$rootid)//sect1 | key('id',$rootid)//sect2 | key('id',$rootid)//sect3 | key('id',$rootid)//sect4 | key('id',$rootid)//sect5 | key('id',$rootid)//indexterm | key('id',$rootid)//glossary | key('id',$rootid)//bibliography | key('id',$rootid)//*[@id]" mode="map"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="//set | //book | //part | //reference | //preface | //chapter | //appendix | //article | //colophon | //refentry | //section | //sect1 | //sect2 | //sect3 | //sect4 | //sect5 | //indexterm | //glossary | //bibliography | //*[@id]" mode="map"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </map>
+</xsl:template>
+
+<xsl:template match="set" mode="map">
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id">
+ <xsl:with-param name="object" select="."/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <mapID target="{$id}">
+ <xsl:attribute name="url">
+ <xsl:call-template name="href.target.uri"/>
+ </xsl:attribute>
+ </mapID>
+</xsl:template>
+
+<xsl:template match="book" mode="map">
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+
+ <mapID target="{$id}">
+ <xsl:attribute name="url">
+ <xsl:call-template name="href.target.uri"/>
+ </xsl:attribute>
+ </mapID>
+</xsl:template>
+
+<xsl:template match="part|reference|preface|chapter|appendix|refentry|article|glossary|bibliography" mode="map">
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+
+ <mapID target="{$id}">
+ <xsl:attribute name="url">
+ <xsl:call-template name="href.target.uri"/>
+ </xsl:attribute>
+ </mapID>
+</xsl:template>
+
+<xsl:template match="section|sect1|sect2|sect3|sect4|sect5|colophon" mode="map">
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+
+ <mapID target="{$id}">
+ <xsl:attribute name="url">
+ <xsl:call-template name="href.target.uri"/>
+ </xsl:attribute>
+ </mapID>
+</xsl:template>
+
+<xsl:template match="indexterm[@class='endofrange']" mode="map"/>
+
+<xsl:template match="indexterm" mode="map">
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+
+ <mapID target="{$id}">
+ <xsl:attribute name="url">
+ <xsl:call-template name="href.target.uri"/>
+ </xsl:attribute>
+ </mapID>
+</xsl:template>
+
+<xsl:template match="*[@id]" mode="map">
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+
+ <mapID target="{$id}">
+ <xsl:attribute name="url">
+ <xsl:call-template name="href.target.uri"/>
+ </xsl:attribute>
+ </mapID>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template name="helpidx">
+ <xsl:call-template name="write.chunk.with.doctype">
+ <xsl:with-param name="filename" select="concat($base.dir, 'jhelpidx.xml')"/>
+ <xsl:with-param name="method" select="'xml'"/>
+ <xsl:with-param name="indent" select="'yes'"/>
+ <xsl:with-param name="doctype-public" select="'-//Sun Microsystems Inc.//DTD JavaHelp Index Version 1.0//EN'"/>
+ <xsl:with-param name="doctype-system" select="'http://java.sun.com/products/javahelp/index_1_0.dtd'"/>
+ <xsl:with-param name="encoding" select="$javahelp.encoding"/>
+ <xsl:with-param name="content">
+ <xsl:call-template name="helpidx.content"/>
+ </xsl:with-param>
+ <xsl:with-param name="quiet" select="$chunk.quietly"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template name="helpidx.content">
+ <index version="1.0">
+ <xsl:choose>
+ <xsl:when test="$rootid != ''">
+ <xsl:apply-templates select="key('id',$rootid)//indexterm" mode="idx">
+ <xsl:sort select="primary"/>
+ <xsl:sort select="secondary"/>
+ <xsl:sort select="tertiary"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="//indexterm" mode="idx">
+ <xsl:sort select="primary"/>
+ <xsl:sort select="secondary"/>
+ <xsl:sort select="tertiary"/>
+ </xsl:apply-templates>
+ </xsl:otherwise>
+ </xsl:choose>
+ </index>
+</xsl:template>
+
+<xsl:template match="indexterm[@class='endofrange']" mode="idx"/>
+
+<xsl:template match="indexterm" mode="idx">
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+
+ <xsl:variable name="text">
+ <xsl:value-of select="normalize-space(primary)"/>
+ <xsl:if test="secondary">
+ <xsl:text>, </xsl:text>
+ <xsl:value-of select="normalize-space(secondary)"/>
+ </xsl:if>
+ <xsl:if test="tertiary">
+ <xsl:text>, </xsl:text>
+ <xsl:value-of select="normalize-space(tertiary)"/>
+ </xsl:if>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="see">
+ <xsl:variable name="see"><xsl:value-of select="normalize-space(see)"/></xsl:variable>
+ <indexitem text="{$text} see '{$see}'"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <indexitem text="{$text}" target="{$id}"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ==================================================================== -->
+<!-- Kludge for Xalan outputting &trade; which fails in javahelp -->
+<xsl:template name="dingbat.characters">
+ <!-- now that I'm using the real serializer, all that dingbat malarky -->
+ <!-- isn't necessary anymore... -->
+ <xsl:param name="dingbat">bullet</xsl:param>
+
+ <xsl:choose>
+ <xsl:when test="$dingbat='bullet'">&#8226;</xsl:when>
+ <xsl:when test="$dingbat='copyright'">&#169;</xsl:when>
+ <xsl:when test="$dingbat='trademark' or $dingbat='trade'">
+ <xsl:choose>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <sup>TM</sup>
+ </xsl:when>
+ <xsl:otherwise>&#8482;</xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:when test="$dingbat='registered'">&#174;</xsl:when>
+ <xsl:when test="$dingbat='service'">(SM)</xsl:when>
+ <xsl:when test="$dingbat='nbsp'">&#160;</xsl:when>
+ <xsl:when test="$dingbat='ldquo'">&#8220;</xsl:when>
+ <xsl:when test="$dingbat='rdquo'">&#8221;</xsl:when>
+ <xsl:when test="$dingbat='lsquo'">&#8216;</xsl:when>
+ <xsl:when test="$dingbat='rsquo'">&#8217;</xsl:when>
+ <xsl:when test="$dingbat='em-dash'">&#8212;</xsl:when>
+ <xsl:when test="$dingbat='mdash'">&#8212;</xsl:when>
+ <xsl:when test="$dingbat='en-dash'">&#8211;</xsl:when>
+ <xsl:when test="$dingbat='ndash'">&#8211;</xsl:when>
+ <xsl:otherwise>
+ <xsl:text>&#8226;</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/lib/lib.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/lib/lib.xsl
new file mode 100644
index 0000000..5eee486
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/lib/lib.xsl
@@ -0,0 +1,480 @@
+<?xml version="1.0" encoding="ASCII"?>
+<!-- ********************************************************************
+ $Id: lib.xweb 7102 2007-07-20 15:35:24Z xmldoc $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ This module implements DTD-independent functions
+
+ ******************************************************************** -->
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
+
+<xsl:template name="dot.count">
+ <!-- Returns the number of "." characters in a string -->
+ <xsl:param name="string"/>
+ <xsl:param name="count" select="0"/>
+ <xsl:choose>
+ <xsl:when test="contains($string, '.')">
+ <xsl:call-template name="dot.count">
+ <xsl:with-param name="string" select="substring-after($string, '.')"/>
+ <xsl:with-param name="count" select="$count+1"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$count"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+<xsl:template name="copy-string">
+ <!-- returns 'count' copies of 'string' -->
+ <xsl:param name="string"/>
+ <xsl:param name="count" select="0"/>
+ <xsl:param name="result"/>
+
+ <xsl:choose>
+ <xsl:when test="$count&gt;0">
+ <xsl:call-template name="copy-string">
+ <xsl:with-param name="string" select="$string"/>
+ <xsl:with-param name="count" select="$count - 1"/>
+ <xsl:with-param name="result">
+ <xsl:value-of select="$result"/>
+ <xsl:value-of select="$string"/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$result"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+<xsl:template name="string.subst">
+ <xsl:param name="string"/>
+ <xsl:param name="target"/>
+ <xsl:param name="replacement"/>
+
+ <xsl:choose>
+ <xsl:when test="contains($string, $target)">
+ <xsl:variable name="rest">
+ <xsl:call-template name="string.subst">
+ <xsl:with-param name="string" select="substring-after($string, $target)"/>
+ <xsl:with-param name="target" select="$target"/>
+ <xsl:with-param name="replacement" select="$replacement"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:value-of select="concat(substring-before($string, $target), $replacement, $rest)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$string"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+<xsl:template name="xpointer.idref">
+ <xsl:param name="xpointer">http://...</xsl:param>
+ <xsl:choose>
+ <xsl:when test="starts-with($xpointer, '#xpointer(id(')">
+ <xsl:variable name="rest" select="substring-after($xpointer, '#xpointer(id(')"/>
+ <xsl:variable name="quote" select="substring($rest, 1, 1)"/>
+ <xsl:value-of select="substring-before(substring-after($xpointer, $quote), $quote)"/>
+ </xsl:when>
+ <xsl:when test="starts-with($xpointer, '#')">
+ <xsl:value-of select="substring-after($xpointer, '#')"/>
+ </xsl:when>
+ <!-- otherwise it's a pointer to some other document -->
+ </xsl:choose>
+</xsl:template>
+<xsl:template name="length-magnitude">
+ <xsl:param name="length" select="'0pt'"/>
+
+ <xsl:choose>
+ <xsl:when test="string-length($length) = 0"/>
+ <xsl:when test="substring($length,1,1) = '0' or substring($length,1,1) = '1' or substring($length,1,1) = '2' or substring($length,1,1) = '3' or substring($length,1,1) = '4' or substring($length,1,1) = '5' or substring($length,1,1) = '6' or substring($length,1,1) = '7' or substring($length,1,1) = '8' or substring($length,1,1) = '9' or substring($length,1,1) = '.'">
+ <xsl:value-of select="substring($length,1,1)"/>
+ <xsl:call-template name="length-magnitude">
+ <xsl:with-param name="length" select="substring($length,2)"/>
+ </xsl:call-template>
+ </xsl:when>
+ </xsl:choose>
+</xsl:template>
+<xsl:template name="length-units">
+ <xsl:param name="length" select="'0pt'"/>
+ <xsl:param name="default.units" select="'px'"/>
+ <xsl:variable name="magnitude">
+ <xsl:call-template name="length-magnitude">
+ <xsl:with-param name="length" select="$length"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="units">
+ <xsl:value-of select="substring($length, string-length($magnitude)+1)"/>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="$units = ''">
+ <xsl:value-of select="$default.units"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$units"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+<xsl:template name="length-spec">
+ <xsl:param name="length" select="'0pt'"/>
+ <xsl:param name="default.units" select="'px'"/>
+
+ <xsl:variable name="magnitude">
+ <xsl:call-template name="length-magnitude">
+ <xsl:with-param name="length" select="$length"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="units">
+ <xsl:value-of select="substring($length, string-length($magnitude)+1)"/>
+ </xsl:variable>
+
+ <xsl:value-of select="$magnitude"/>
+ <xsl:choose>
+ <xsl:when test="$units='cm' or $units='mm' or $units='in' or $units='pt' or $units='pc' or $units='px' or $units='em'">
+ <xsl:value-of select="$units"/>
+ </xsl:when>
+ <xsl:when test="$units = ''">
+ <xsl:value-of select="$default.units"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:message>
+ <xsl:text>Unrecognized unit of measure: </xsl:text>
+ <xsl:value-of select="$units"/>
+ <xsl:text>.</xsl:text>
+ </xsl:message>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+<xsl:template name="length-in-points">
+ <xsl:param name="length" select="'0pt'"/>
+ <xsl:param name="em.size" select="10"/>
+ <xsl:param name="pixels.per.inch" select="90"/>
+
+ <xsl:variable name="magnitude">
+ <xsl:call-template name="length-magnitude">
+ <xsl:with-param name="length" select="$length"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="units">
+ <xsl:value-of select="substring($length, string-length($magnitude)+1)"/>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="$units = 'pt'">
+ <xsl:value-of select="$magnitude"/>
+ </xsl:when>
+ <xsl:when test="$units = 'cm'">
+ <xsl:value-of select="$magnitude div 2.54 * 72.0"/>
+ </xsl:when>
+ <xsl:when test="$units = 'mm'">
+ <xsl:value-of select="$magnitude div 25.4 * 72.0"/>
+ </xsl:when>
+ <xsl:when test="$units = 'in'">
+ <xsl:value-of select="$magnitude * 72.0"/>
+ </xsl:when>
+ <xsl:when test="$units = 'pc'">
+ <xsl:value-of select="$magnitude * 12.0"/>
+ </xsl:when>
+ <xsl:when test="$units = 'px'">
+ <xsl:value-of select="$magnitude div $pixels.per.inch * 72.0"/>
+ </xsl:when>
+ <xsl:when test="$units = 'em'">
+ <xsl:value-of select="$magnitude * $em.size"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:message>
+ <xsl:text>Unrecognized unit of measure: </xsl:text>
+ <xsl:value-of select="$units"/>
+ <xsl:text>.</xsl:text>
+ </xsl:message>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+<xsl:template name="pi-attribute">
+ <xsl:param name="pis" select="processing-instruction('BOGUS_PI')"/>
+ <xsl:param name="attribute">filename</xsl:param>
+ <xsl:param name="count">1</xsl:param>
+
+ <xsl:choose>
+ <xsl:when test="$count&gt;count($pis)">
+ <!-- not found -->
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:variable name="pi">
+ <xsl:value-of select="$pis[$count]"/>
+ </xsl:variable>
+ <xsl:variable name="pivalue">
+ <xsl:value-of select="concat(' ', normalize-space($pi))"/>
+ </xsl:variable>
+ <xsl:choose>
+ <xsl:when test="contains($pivalue,concat(' ', $attribute, '='))">
+ <xsl:variable name="rest" select="substring-after($pivalue,concat(' ', $attribute,'='))"/>
+ <xsl:variable name="quote" select="substring($rest,1,1)"/>
+ <xsl:value-of select="substring-before(substring($rest,2),$quote)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="pi-attribute">
+ <xsl:with-param name="pis" select="$pis"/>
+ <xsl:with-param name="attribute" select="$attribute"/>
+ <xsl:with-param name="count" select="$count + 1"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+<xsl:template name="lookup.key">
+ <xsl:param name="key" select="''"/>
+ <xsl:param name="table" select="''"/>
+
+ <xsl:if test="contains($table, ' ')">
+ <xsl:choose>
+ <xsl:when test="substring-before($table, ' ') = $key">
+ <xsl:variable name="rest" select="substring-after($table, ' ')"/>
+ <xsl:choose>
+ <xsl:when test="contains($rest, ' ')">
+ <xsl:value-of select="substring-before($rest, ' ')"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$rest"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="lookup.key">
+ <xsl:with-param name="key" select="$key"/>
+ <xsl:with-param name="table" select="substring-after(substring-after($table,' '), ' ')"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:if>
+</xsl:template>
+<xsl:template name="xpath.location">
+ <xsl:param name="node" select="."/>
+ <xsl:param name="path" select="''"/>
+
+ <xsl:variable name="next.path">
+ <xsl:value-of select="local-name($node)"/>
+ <xsl:if test="$path != ''">/</xsl:if>
+ <xsl:value-of select="$path"/>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="$node/parent::*">
+ <xsl:call-template name="xpath.location">
+ <xsl:with-param name="node" select="$node/parent::*"/>
+ <xsl:with-param name="path" select="$next.path"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text>/</xsl:text>
+ <xsl:value-of select="$next.path"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+<xsl:template name="comment-escape-string">
+ <xsl:param name="string" select="''"/>
+
+ <xsl:if test="starts-with($string, '-')">
+ <xsl:text> </xsl:text>
+ </xsl:if>
+
+ <xsl:call-template name="comment-escape-string.recursive">
+ <xsl:with-param name="string" select="$string"/>
+ </xsl:call-template>
+
+ <xsl:if test="substring($string, string-length($string), 1) = '-'">
+ <xsl:text> </xsl:text>
+ </xsl:if>
+</xsl:template>
+<xsl:template name="comment-escape-string.recursive">
+ <xsl:param name="string" select="''"/>
+ <xsl:choose>
+ <xsl:when test="contains($string, '--')">
+ <xsl:value-of select="substring-before($string, '--')"/>
+ <xsl:value-of select="'- -'"/>
+ <xsl:call-template name="comment-escape-string.recursive">
+ <xsl:with-param name="string" select="substring-after($string, '--')"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$string"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+ <xsl:template name="str.tokenize.keep.delimiters">
+ <xsl:param name="string" select="''"/>
+ <xsl:param name="delimiters" select="' '"/>
+ <xsl:choose>
+ <xsl:when test="not($string)"/>
+ <xsl:when test="not($delimiters)">
+ <xsl:call-template name="str.tokenize.keep.delimiters-characters">
+ <xsl:with-param name="string" select="$string"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="str.tokenize.keep.delimiters-delimiters">
+ <xsl:with-param name="string" select="$string"/>
+ <xsl:with-param name="delimiters" select="$delimiters"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+ <xsl:template name="str.tokenize.keep.delimiters-characters">
+ <xsl:param name="string"/>
+ <xsl:if test="$string">
+ <ssb:token xmlns:ssb="http://sideshowbarker.net/ns"><xsl:value-of select="substring($string, 1, 1)"/></ssb:token>
+ <xsl:call-template name="str.tokenize.keep.delimiters-characters">
+ <xsl:with-param name="string" select="substring($string, 2)"/>
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:template>
+ <xsl:template name="str.tokenize.keep.delimiters-delimiters">
+ <xsl:param name="string"/>
+ <xsl:param name="delimiters"/>
+ <xsl:variable name="delimiter" select="substring($delimiters, 1, 1)"/>
+ <xsl:choose>
+ <xsl:when test="not($delimiter)">
+ <ssb:token xmlns:ssb="http://sideshowbarker.net/ns"><xsl:value-of select="$string"/></ssb:token>
+ </xsl:when>
+ <xsl:when test="contains($string, $delimiter)">
+ <xsl:if test="not(starts-with($string, $delimiter))">
+ <xsl:call-template name="str.tokenize.keep.delimiters-delimiters">
+ <xsl:with-param name="string" select="substring-before($string, $delimiter)"/>
+ <xsl:with-param name="delimiters" select="substring($delimiters, 2)"/>
+ </xsl:call-template>
+ </xsl:if>
+ <!-- output each delimiter -->
+ <xsl:value-of select="$delimiter"/>
+ <xsl:call-template name="str.tokenize.keep.delimiters-delimiters">
+ <xsl:with-param name="string" select="substring-after($string, $delimiter)"/>
+ <xsl:with-param name="delimiters" select="$delimiters"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="str.tokenize.keep.delimiters-delimiters">
+ <xsl:with-param name="string" select="$string"/>
+ <xsl:with-param name="delimiters" select="substring($delimiters, 2)"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+ <xsl:template name="apply-string-subst-map">
+ <xsl:param name="content"/>
+ <xsl:param name="map.contents"/>
+ <xsl:variable name="replaced_text">
+ <xsl:call-template name="string.subst">
+ <xsl:with-param name="string" select="$content"/>
+ <xsl:with-param name="target" select="$map.contents[1]/@oldstring"/>
+ <xsl:with-param name="replacement" select="$map.contents[1]/@newstring"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:choose>
+ <xsl:when test="$map.contents[2]">
+ <xsl:call-template name="apply-string-subst-map">
+ <xsl:with-param name="content" select="$replaced_text"/>
+ <xsl:with-param name="map.contents" select="$map.contents[position() &gt; 1]"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$replaced_text"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+<xsl:template name="count.uri.path.depth">
+ <xsl:param name="filename" select="''"/>
+ <xsl:param name="count" select="0"/>
+
+ <xsl:choose>
+ <xsl:when test="contains($filename, '/')">
+ <xsl:call-template name="count.uri.path.depth">
+ <xsl:with-param name="filename" select="substring-after($filename, '/')"/>
+ <xsl:with-param name="count" select="$count + 1"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$count"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+<xsl:template name="trim.common.uri.paths">
+ <xsl:param name="uriA" select="''"/>
+ <xsl:param name="uriB" select="''"/>
+ <xsl:param name="return" select="'A'"/>
+
+ <xsl:choose>
+ <xsl:when test="contains($uriA, '/') and contains($uriB, '/') and substring-before($uriA, '/') = substring-before($uriB, '/')">
+ <xsl:call-template name="trim.common.uri.paths">
+ <xsl:with-param name="uriA" select="substring-after($uriA, '/')"/>
+ <xsl:with-param name="uriB" select="substring-after($uriB, '/')"/>
+ <xsl:with-param name="return" select="$return"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:choose>
+ <xsl:when test="$return = 'A'">
+ <xsl:value-of select="$uriA"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$uriB"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+ <xsl:template name="trim.text">
+ <xsl:param name="contents" select="."/>
+ <xsl:variable name="contents-left-trimmed">
+ <xsl:call-template name="trim-left">
+ <xsl:with-param name="contents" select="$contents"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:variable name="contents-trimmed">
+ <xsl:call-template name="trim-right">
+ <xsl:with-param name="contents" select="$contents-left-trimmed"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:value-of select="$contents-trimmed"/>
+ </xsl:template>
+
+ <xsl:template name="trim-left">
+ <xsl:param name="contents"/>
+ <xsl:choose>
+ <xsl:when test="starts-with($contents,'&#10;') or starts-with($contents,'&#13;') or starts-with($contents,' ') or starts-with($contents,'&#9;')">
+ <xsl:call-template name="trim-left">
+ <xsl:with-param name="contents" select="substring($contents, 2)"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$contents"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+ <xsl:template name="trim-right">
+ <xsl:param name="contents"/>
+ <xsl:variable name="last-char">
+ <xsl:value-of select="substring($contents, string-length($contents), 1)"/>
+ </xsl:variable>
+ <xsl:choose>
+ <xsl:when test="($last-char = '&#10;') or ($last-char = '&#13;') or ($last-char = ' ') or ($last-char = '&#9;')">
+ <xsl:call-template name="trim-right">
+ <xsl:with-param name="contents" select="substring($contents, 1, string-length($contents) - 1)"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$contents"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/manpages/ChangeLog.20020917 b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/manpages/ChangeLog.20020917
new file mode 100644
index 0000000..c170cc0
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/manpages/ChangeLog.20020917
@@ -0,0 +1,195 @@
+Note: This changelog is a record of descriptions of all changes
+made to the DocBook XSL manpages stylesheets during the time when
+they were maintained in their original home in the
+[cvs]/docbook/contrib/xsl/db2man area of the DocBook Project
+source-code repository at Sourceforge; that is, from October 2001
+(when they were contributed to the project by Martijn van Beers)
+until September 2002 (when they were moved to the
+[cvs]/docbook/xsl/manpages area and became a standard part of all
+subsequent DocBook XSL Stylesheets releases).
+
+2002-09-17 Norman Walsh <nwalsh@users.sourceforge.net>
+
+ * README, db2man.xsl, lists.xsl, sect23.xsl, synop.xsl, xref.xsl:
+ Moved to docbook/xsl/manpages
+
+ * db2man.xsl, synop.xsl: Patch from Joe Orton
+
+2002-06-16 <lotr@users.sourceforge.net>
+
+ * db2man.xsl: commit patch sent by Joe Orton:
+
+ This patch adds support for using the productname, date and title out of
+ a <referenceinfo> if one is present, rather than having to add each of
+ these individually for every refentry.
+
+ * db2man.xsl: Tim Waugh sent:
+
+ This patch normalizes space in each refname before displaying it in
+ the name section.
+
+2002-05-21 <lotr@users.sourceforge.net>
+
+ * xref.xsl: from Joe Orton:
+ this patch allows cross-referencing to a specific refname. I
+ need this since I'm documenting several different (but related)
+ functions per refentry, and want to cross-reference them individually,
+ rather than just by the title used for the refentry as a whole.
+
+2002-05-17 <lotr@users.sourceforge.net>
+
+ * lists.xsl: apply glosslist support patch from twaugh
+
+2002-05-15 <lotr@users.sourceforge.net>
+
+ * db2man.xsl: slightly sanitize the filenames we generate. again from twaugh
+
+ * db2man.xsl: Apply twaugh's fix for making the entity transform stuff work
+
+2002-05-14 <lotr@users.sourceforge.net>
+
+ * db2man.xsl: generalize the tip template for all admonitions
+ (caution,important,note,tip,warning)
+
+ * db2man.xsl: Apply Joe Orton's <tip> patch, modified to be indented. Also show "Tip"
+ in the title.
+
+ so if <tip><title>foo</title></tip>, you get
+ Tip: foo
+
+ * synop.xsl: rewrote funcprototype. It used to convert all its children to a single
+ string and the split it up again through recursion. Now has a nice
+ foreach loop for the paramdefs, which seems much cleaner than throwing
+ everything in a big string before processing it.
+
+2002-05-10 <lotr@users.sourceforge.net>
+
+ * db2man.xsl: add support for simpara
+
+ * db2man.xsl, lists.xsl: fix refsect2 titles
+
+ * synop.xsl: also from twaugh:
+
+ I found some input that goes wrong with the synop.xsl we have in CVS:
+
+ <group choice="opt">
+ <arg>-o <replaceable>FILE</replaceable></arg>
+ <arg>--output=<replaceable>FILE</replaceable></arg>
+ </group>
+
+ It gets rendered as (with *bold* and _italic_):
+
+ [*-o FILE* | *--output=FILE*]
+
+ The desired markup should look like:
+ The following macro does the trick:
+
+ [\fB-o \fIFILE\fR\fR | \fB--output=\fIFILE\fR\fR]
+
+ The trouble is that the named template 'bold' uses value-of, and so
+ strips <replaceable> of its significance.
+
+ Another thing I found is that the arg/replaceable template is
+ superfluous altogether: db2man.xsl has a 'replaceable' template which
+ does the same thing.
+
+ Here is a patch to make those two modifications.
+
+ NOTE TO SELF: must try to fix bold template so we can use it everywhere
+
+2002-05-09 <lotr@users.sourceforge.net>
+
+ * db2man.xsl: oops, removed too much
+
+ * db2man.xsl: remove stuff that's apparently left-over from sect23.xsl
+
+ * db2man.xsl, lists.xsl, synop.xsl: batch of patches from twaugh:
+ * This patch (based on one from Jirka Kosek) adds support for
+ block-level elements inside <para>s---<screen>s for example, or lists.
+ * This patch replaces entities (like '&#x8212;') with sensible
+ characters or groups of characters.
+ * This patch adds support for sbr.
+ * This patch normalizes spaces in varlistentry terms.
+ * This patch normalizes spaces in terminal varlistentry terms.
+ * This patch allows variable lists to be nested (once).
+ * This patch prevents variable list item paragraphs from merging into
+ one another.
+ * This patch improves the rendering of itemized lists, and adds support
+ for ordered lists and procedures.
+ * This patch makes some small adjustments to group/arg: don't put extra
+ spaces in where they aren't needed, and normalize the space of $arg.
+ * This patch makes adjustments to cmdsynopsis elements. In particular,
+ they can now be wrapped if no <sbr/> is provided.
+ * This patch adds funcsynopsis//* support. Again, wrapping is done
+ automatically.
+
+ * synop.xsl: make synopsises work for --arg=foo <arg>s too
+
+ * synop.xsl: remove unneccesary adding of whitespace for arg/replaceable
+
+2002-05-01 <lotr@users.sourceforge.net>
+
+ * db2man.xsl: This patch adds support for multiple refnames.
+
+ (another twaugh patch)
+
+ * db2man.xsl: modified ulink patch from twaugh. Be nice to content-less ulinks. But we
+ don't accomodate silly people who don't understand ulink and put the
+ url as the content too.
+
+ * db2man.xsl, synop.xsl: db2man.xsl:
+ * temporarily add some params that chunker.xsl needs
+ * fix bold/italic templates
+ * update calls to bold/italic templates for new syntax
+ synop.xsl:
+ * add support for synopfragment
+ * update calls to bold/italic templates for new syntax
+
+2002-04-30 <lotr@users.sourceforge.net>
+
+ * db2man.xsl: Add twaug's patch for xref support
+
+ * db2man.xsl: This patch adds support for:
+
+ - Multiple authors.
+ - A (single) man page editor.
+
+ (another patch from twaugh)
+
+ * db2man.xsl: more twaugh patches:
+ - Use refentrytitle, not refname[1], for title.
+ - Upper-case it.
+ - Use date, productname, and title.
+ - Pick up author from main document if not contained in refentry.
+ - Use refname[1] for man page filename, not refentrytitle.
+
+ * db2man.xsl: add varname support
+
+ * db2man.xsl: This patch makes userinput (an inline element) have inline formatting.
+
+ * db2man.xsl: This patch adds support for the top-level document being something
+ other than an article.
+
+ It also emits a helpful warning if no refentry elements are found.
+
+ * db2man.xsl: next twaugh patch:
+ Instead of writing to stdout, create a file for each
+ refentry. Plus, for bonus points, a file for each additional refname
+ within that entry (pointing to the main page).
+
+ * db2man.xsl: Add named templates for bold-ifying and italicizing stuff. Inspired
+ by yet another twaugh patch
+
+ * db2man.xsl, lists.xsl, sect23.xsl: consistently use &#10; instead of a newline
+
+ * db2man.xsl, synop.xsl: * add support for informalexample, screen, errorcode, constant, type,
+ quote, programlisting and citerefentry
+ * use the 'bold' and 'italic' named templates
+
+ * xref.xsl: New file.
+
+2001-12-01 Norman Walsh <nwalsh@users.sourceforge.net>
+
+ * README, db2man.xsl, lists.xsl, sect23.xsl, synop.xsl:
+ New file.
+
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/manpages/block.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/manpages/block.xsl
new file mode 100644
index 0000000..9278561
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/manpages/block.xsl
@@ -0,0 +1,411 @@
+<?xml version='1.0'?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:exsl="http://exslt.org/common"
+ exclude-result-prefixes="exsl"
+ version='1.0'>
+
+<!-- ********************************************************************
+ $Id: block.xsl 8703 2010-07-06 20:57:06Z nwalsh $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<!-- ==================================================================== -->
+
+<xsl:template match="caution|important|note|tip|warning">
+ <xsl:call-template name="roff-if-start">
+ <xsl:with-param name="condition">n</xsl:with-param>
+ </xsl:call-template>
+ <xsl:text>.sp&#10;</xsl:text>
+ <xsl:call-template name="roff-if-end"/>
+ <xsl:text>.RS 4&#10;</xsl:text>
+ <xsl:if test="not($man.output.better.ps.enabled = 0)">
+ <xsl:text>.BM yellow&#10;</xsl:text>
+ </xsl:if>
+ <xsl:call-template name="pinch.together"/>
+ <xsl:text>.ps +1&#10;</xsl:text>
+ <xsl:call-template name="make.bold.title"/>
+ <xsl:text>.ps -1&#10;</xsl:text>
+ <xsl:text>.br&#10;</xsl:text>
+ <xsl:apply-templates/>
+ <xsl:text>.sp .5v&#10;</xsl:text>
+ <xsl:if test="not($man.output.better.ps.enabled = 0)">
+ <xsl:text>.EM yellow&#10;</xsl:text>
+ </xsl:if>
+ <xsl:text>.RE&#10;</xsl:text>
+</xsl:template>
+
+<xsl:template match="formalpara">
+ <xsl:variable name="title.wrapper">
+ <xsl:value-of select="normalize-space(title[1])"/>
+ </xsl:variable>
+ <xsl:text>.PP&#10;</xsl:text>
+ <!-- * don't put linebreak after head; instead render it as a "run in" -->
+ <!-- * head, that is, inline, with a period and space following it -->
+ <xsl:call-template name="bold">
+ <xsl:with-param name="node" select="exsl:node-set($title.wrapper)"/>
+ <xsl:with-param name="context" select="."/>
+ </xsl:call-template>
+ <xsl:text>. </xsl:text>
+ <xsl:apply-templates/>
+</xsl:template>
+
+<xsl:template match="formalpara/para">
+ <xsl:call-template name="mixed-block"/>
+ <xsl:text>&#10;</xsl:text>
+</xsl:template>
+
+<xsl:template match="para">
+ <!-- * FIXME: Need to extract the ancestor::footnote, etc. checking and -->
+ <!-- * move to named template so that we can call it from templates for -->
+ <!-- * other block elements also -->
+ <xsl:choose>
+ <!-- * If a para is a descendant of a footnote, etc., then indent it -->
+ <!-- * (unless it is the first child, in which case don't generate -->
+ <!-- * anything at all to mark its start). -->
+ <!-- * FIXME: *blurb checking should not be munged in here the way -->
+ <!-- * it currently is; this probably breaks blurb indenting. -->
+ <xsl:when test="ancestor::footnote or
+ ancestor::annotation or
+ ancestor::authorblurb or
+ ancestor::personblurb or
+ ancestor::callout">
+ <xsl:if test="preceding-sibling::*[not(name() ='')]">
+ <xsl:text>.sp</xsl:text>
+ <xsl:text>&#10;</xsl:text>
+ <xsl:text>.RS 4n</xsl:text>
+ <xsl:text>&#10;</xsl:text>
+ </xsl:if>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text>.PP</xsl:text>
+ <xsl:text>&#10;</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:call-template name="mixed-block"/>
+ <xsl:if test="ancestor::footnote or
+ ancestor::annotation or
+ ancestor::authorblurb or
+ ancestor::personblurb">
+ <xsl:if test="preceding-sibling::*[not(name() ='')]">
+ <xsl:text>&#10;</xsl:text>
+ <xsl:text>.RE</xsl:text>
+ <xsl:text>&#10;</xsl:text>
+ </xsl:if>
+ </xsl:if>
+ <xsl:text>&#10;</xsl:text>
+</xsl:template>
+
+<xsl:template match="simpara">
+ <xsl:choose>
+ <xsl:when test="ancestor::footnote or
+ ancestor::annotation or
+ ancestor::authorblurb or
+ ancestor::personblurb or
+ ancestor::callout">
+ <xsl:if test="preceding-sibling::*[not(name() ='')]">
+ <xsl:text>.sp</xsl:text>
+ <xsl:text>&#10;</xsl:text>
+ <xsl:text>.RS 4n</xsl:text>
+ <xsl:text>&#10;</xsl:text>
+ </xsl:if>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text>.sp</xsl:text>
+ <xsl:text>&#10;</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:variable name="content">
+ <xsl:apply-templates/>
+ </xsl:variable>
+ <xsl:value-of select="normalize-space($content)"/>
+ <xsl:text>&#10;</xsl:text>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<!-- * Yes, address, synopsis, and funcsynopsisinfo are verbatim environments. -->
+<xsl:template match="literallayout|programlisting|screen|
+ address|synopsis|funcsynopsisinfo">
+ <xsl:param name="indent">
+ <!-- * Only indent this verbatim if $man.indent.verbatims is -->
+ <!-- * non-zero and it is not a child of a *synopsis element or a -->
+ <!-- * descendant of a refsynopsisdiv -->
+ <xsl:if test="not($man.indent.verbatims = 0)
+ and not(substring(local-name(..),
+ string-length(local-name(..))-7) = 'synopsis')
+ and not(ancestor::*[local-name() = 'refsynopsisdiv'])
+ ">
+ <xsl:text>Yes</xsl:text>
+ </xsl:if>
+ </xsl:param>
+
+ <!-- * if this verbatim environment starts with a newline/linebreak -->
+ <!-- * (that is, if there is a linebreak after the opening tag), that -->
+ <!-- * break would otherwise show up in output; that does not seem to -->
+ <!-- * be what most users would expect, so we check to see if it does -->
+ <!-- * indeed start with a leading newline. if so, later in this -->
+ <!-- * template, we adjust for the leading new line by doing some -->
+ <!-- * monkeyshines with "sp -1" vertical spacing -->
+ <xsl:variable name="adjust-for-leading-newline">
+ <xsl:if test="substring(., 1, 1) = '&#10;'">Yes</xsl:if>
+ </xsl:variable>
+
+ <xsl:choose>
+ <!-- * Check to see if this verbatim item is within a parent element that -->
+ <!-- * allows mixed content. -->
+ <!-- * -->
+ <!-- * If it is within a mixed-content parent, then a line space is -->
+ <!-- * already added before it by the mixed-block template, so we don't -->
+ <!-- * need to add one here. -->
+ <!-- * -->
+ <!-- * If it is not within a mixed-content parent, then we need to add a -->
+ <!-- * line space before it. -->
+ <xsl:when test="parent::caption|parent::entry|parent::para|
+ parent::td|parent::th" /> <!-- do nothing -->
+ <xsl:otherwise>
+ <xsl:text>&#10;</xsl:text>
+ <xsl:text>.sp&#10;</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:if test="$indent = 'Yes'">
+ <!-- * start indented section -->
+ <xsl:call-template name="roff-if-start"/>
+ <!-- * only indent in TTY output, not in non-TTY/PS -->
+ <xsl:text>.RS</xsl:text>
+ <xsl:if test="not($man.indent.width = '')">
+ <xsl:text> </xsl:text>
+ <xsl:value-of select="$man.indent.width"/>
+ </xsl:if>
+ <xsl:text>&#10;</xsl:text>
+ <xsl:call-template name="roff-if-end"/>
+ </xsl:if>
+ <xsl:choose>
+ <xsl:when test="self::funcsynopsisinfo">
+ <!-- * All Funcsynopsisinfo content is by default rendered in bold, -->
+ <!-- * because the man(7) man page says this: -->
+ <!-- * -->
+ <!-- * For functions, the arguments are always specified using -->
+ <!-- * italics, even in the SYNOPSIS section, where the rest of -->
+ <!-- * the function is specified in bold -->
+ <!-- * -->
+ <!-- * Look through the contents of the man/man2 and man3 directories -->
+ <!-- * on your system, and you'll see that most existing pages do follow -->
+ <!-- * this "bold everything in function synopsis" rule. -->
+ <!-- * -->
+ <!-- * Users who don't want the bold output can choose to adjust the -->
+ <!-- * man.font.funcsynopsisinfo parameter on their own. So even if you -->
+ <!-- * don't personally like the way it looks, please don't change the -->
+ <!-- * default to be non-bold - because it's a convention that's -->
+ <!-- * followed is the vast majority of existing man pages that document -->
+ <!-- * functions, and we need to follow it by default, like it or no. -->
+ <xsl:text>.ft </xsl:text>
+ <xsl:value-of select="$man.font.funcsynopsisinfo"/>
+ <xsl:text>&#10;</xsl:text>
+ <xsl:call-template name="verbatim-block-start"/>
+ <xsl:text>.nf&#10;</xsl:text>
+ <xsl:apply-templates/>
+ <xsl:text>&#10;</xsl:text>
+ <xsl:text>.fi&#10;</xsl:text>
+ <xsl:call-template name="verbatim-block-end"/>
+ <xsl:text>.ft&#10;</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <!-- * Other verbatims do not need to get bolded -->
+ <xsl:call-template name="verbatim-block-start"/>
+ <xsl:text>.nf&#10;</xsl:text>
+ <xsl:choose>
+ <xsl:when test="self::literallayout|self::programlisting|self::screen
+ and not(ancestor::*[local-name() = 'refsynopsisdiv'])
+ and not($man.output.better.ps.enabled = 0)
+ ">
+ <!-- * if this is a literallayout|programlisting|screen, -->
+ <!-- * and user has set man.output.better.ps.enabled to non-zero, -->
+ <!-- * then we put a background behind it in non-TTY output; except -->
+ <!-- * if it’s a descendant of a refsynopsisdiv (as can be -->
+ <!-- * found in the git docs) -->
+ <xsl:choose>
+ <!-- * if content has a leading newline, we need to back up -->
+ <!-- * one line vertically to get it boxed correctly -->
+ <xsl:when test="not($adjust-for-leading-newline = '')">
+ <xsl:call-template name="roff-if-start">
+ <xsl:with-param name="condition">t</xsl:with-param>
+ </xsl:call-template>
+ <xsl:text>.sp -1&#10;</xsl:text>
+ <xsl:call-template name="roff-if-end"/>
+ <xsl:text>.BB lightgray</xsl:text>
+ <xsl:text> </xsl:text>
+ <xsl:text>adjust-for-leading-newline&#10;</xsl:text>
+ <!-- * in non-TTY output, for the case where we have a -->
+ <!-- * leading newline, we need to also back up one line -->
+ <!-- * vertically inside the background box -->
+ <xsl:text>.sp -1&#10;</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text>.BB lightgray&#10;</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:apply-templates/>
+ <xsl:text>&#10;</xsl:text>
+ <xsl:choose>
+ <xsl:when test="not($adjust-for-leading-newline = '')">
+ <xsl:text>.EB lightgray</xsl:text>
+ <xsl:text> </xsl:text>
+ <xsl:text>adjust-for-leading-newline&#10;</xsl:text>
+ <xsl:call-template name="roff-if-start">
+ <xsl:with-param name="condition">t</xsl:with-param>
+ </xsl:call-template>
+ <!-- * in non-TTY output, for the case where we have a -->
+ <!-- * leading newline, we need to add back at the end of -->
+ <!-- * the content some of the vertical space we chopped -->
+ <!-- * off at the beginning -->
+ <xsl:text>.sp 1&#10;</xsl:text>
+ <xsl:call-template name="roff-if-end"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text>.EB lightgray&#10;</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <!-- * otherwise this is not a literallayout|programlisting|screen, -->
+ <!-- * so we don’t put a background behind -->
+ <xsl:apply-templates/>
+ <xsl:text>&#10;</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:text>.fi&#10;</xsl:text>
+ <xsl:call-template name="verbatim-block-end"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:if test="$indent = 'Yes'">
+ <!-- * end indented section -->
+ <xsl:call-template name="roff-if-start"/>
+ <xsl:text>.RE&#10;</xsl:text>
+ <xsl:call-template name="roff-if-end"/>
+ </xsl:if>
+ <!-- * if this verbatim environment has a following sibling node, -->
+ <!-- * output a line of space to separate the content -->
+ <xsl:if test="following-sibling::text()
+ |following-sibling::para
+ |following-sibling::simpara">
+ <xsl:text>.sp&#10;</xsl:text>
+ </xsl:if>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="table|informaltable">
+ <xsl:apply-templates select="." mode="to.tbl">
+ <!--* we call the to.tbl mode with the "source" param so that we can -->
+ <!--* preserve the context information and pass it down to the -->
+ <!--* named templates that do the actual table processing -->
+ <xsl:with-param name="source" select="ancestor::refentry/refnamediv[1]/refname[1]"/>
+ </xsl:apply-templates>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="informalexample">
+ <xsl:apply-templates/>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="figure|example">
+ <xsl:variable name="param.placement"
+ select="substring-after(normalize-space($formal.title.placement),
+ concat(local-name(.), ' '))"/>
+
+ <xsl:variable name="placement">
+ <xsl:choose>
+ <xsl:when test="contains($param.placement, ' ')">
+ <xsl:value-of select="substring-before($param.placement, ' ')"/>
+ </xsl:when>
+ <xsl:when test="$param.placement = ''">before</xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$param.placement"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:text>.PP&#10;</xsl:text>
+ <xsl:call-template name="formal.object">
+ <xsl:with-param name="placement" select="$placement"/>
+ </xsl:call-template>
+ <xsl:text>&#10;</xsl:text>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="mediaobject">
+ <xsl:text>.sp</xsl:text>
+ <xsl:text>&#10;</xsl:text>
+ <xsl:text>.RS</xsl:text>
+ <xsl:if test="not($list-indent = '')">
+ <xsl:text> </xsl:text>
+ <xsl:value-of select="$list-indent"/>
+ </xsl:if>
+ <xsl:text>&#10;</xsl:text>
+ <xsl:apply-templates/>
+ <xsl:text>&#10;</xsl:text>
+ <xsl:text>.RE&#10;</xsl:text>
+</xsl:template>
+
+<xsl:template match="imageobject">
+ <xsl:text>[IMAGE]</xsl:text>
+ <xsl:apply-templates/>
+ <xsl:text>&#10;</xsl:text>
+</xsl:template>
+
+<xsl:template match="textobject[parent::inlinemediaobject]">
+ <xsl:text>[</xsl:text>
+ <xsl:value-of select="."/>
+ <xsl:text>]</xsl:text>
+</xsl:template>
+
+<xsl:template match="textobject">
+ <xsl:apply-templates/>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template name="formal.object">
+ <xsl:param name="placement" select="'before'"/>
+ <xsl:param name="class" select="local-name(.)"/>
+
+ <xsl:choose>
+ <xsl:when test="$placement = 'before'">
+ <xsl:call-template name="formal.object.heading"/>
+ <xsl:apply-templates/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates/>
+ <xsl:call-template name="formal.object.heading"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="formal.object.heading">
+ <xsl:param name="object" select="."/>
+ <xsl:param name="title">
+ <xsl:apply-templates select="$object" mode="object.title.markup.textonly"/>
+ </xsl:param>
+ <xsl:call-template name="bold">
+ <xsl:with-param name="node" select="exsl:node-set($title)"/>
+ <xsl:with-param name="context" select="."/>
+ </xsl:call-template>
+
+ <xsl:text>&#10;</xsl:text>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<!-- * suppress abstract -->
+<xsl:template match="abstract"/>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/manpages/charmap.groff.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/manpages/charmap.groff.xsl
new file mode 100644
index 0000000..a9492fa
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/manpages/charmap.groff.xsl
@@ -0,0 +1,6013 @@
+<?xml version="1.0" encoding="US-ASCII"?>
+<xsl:stylesheet version="2.0"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:u="http://docbook.sf.net/xmlns/unichar/1.0"
+ exclude-result-prefixes="u">
+
+<!-- ********************************************************************
+ $Id: charmap.groff.xsl 7806 2008-03-04 03:27:47Z xmldoc $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<xsl:character-map name="groff">
+
+ <!-- * *************************************************************** -->
+ <!-- * Commentary -->
+ <!-- * *************************************************************** -->
+ <!-- * -->
+ <!-- * This file maps a selection of Unicode symbols and special -->
+ <!-- * characters (about 800) to corresponding groff escape sequences.-->
+ <!-- * -->
+ <!-- * Although the format of this file follows the "character map" -->
+ <!-- * format described in the XSLT 2.0 specification[1], the file can -->
+ <!-- * also be used with an appropriate XSLT 1.0 stylesheet and any -->
+ <!-- * XSLT 1.0 processor. -->
+ <!-- * -->
+ <!-- * [1] http://www.w3.org/TR/xslt20/#character-maps -->
+ <!-- * -->
+ <!-- * In order to make the character map more readable, and to make -->
+ <!-- * it possible to create subsets of it at run time, it uses the -->
+ <!-- * following "extension attributes" (in the "unichar" namespace): -->
+ <!-- * -->
+ <!-- * - u:name = ISO character name (e.g., "OHM SIGN") -->
+ <!-- * - u:entity = ISO entity name (e.g., "ohm") -->
+ <!-- * - u:block = Unicode block name (e.g., "Letterlike Symbols") -->
+ <!-- * - u:class = character class (e.g., "bullets") -->
+ <!-- * -->
+ <!-- * Use of such extension attributes is permitted by the XSLT 2.0 -->
+ <!-- * spec; see the "Extension Attributes" section[2]. -->
+ <!-- * -->
+ <!-- * [2] http://www.w3.org/TR/xslt20/#extension-attributes -->
+ <!-- * -->
+ <!-- * *************************************************************** -->
+ <!-- * Acknowledgements -->
+ <!-- * *************************************************************** -->
+ <!-- * The following references were consulted when selecting roff -->
+ <!-- * mappings and character information: -->
+ <!-- * -->
+ <!-- * - groff_char(7) man page[3] -->
+ <!-- * - groff info file[4]; in particular, the "Page Motions" node[5] -->
+ <!-- * - tables in "Character Sets" chapter of "XML In a Nutshell"[6] -->
+ <!-- * - Zvon Character Search[7] -->
+ <!-- * -->
+ <!-- * [3] http://www.linux.se/showMan.php?TITLE=groff_char&SECTION=7 -->
+ <!-- * [4] http://www.fifi.org/cgi-bin/info2www?(groff) -->
+ <!-- * [5] http://www.fifi.org/cgi-bin/info2www?(groff)Page+Motions -->
+ <!-- * [6] http://www.ibiblio.org/xml/books/xian2/ -->
+ <!-- * [7] http://zvon.org/other/charSearch/PHP/search.php -->
+ <!-- * -->
+ <!-- * The initial version of this file (before the "string" mappings -->
+ <!-- * were added) was generated by taking the "unichars.el" file from -->
+ <!-- * Norm Walsh's "xmlunicode.el"[8] elisp distro, and running a -->
+ <!-- * script on it to convert it to XML. -->
+ <!-- * -->
+ <!-- * [8] http://nwalsh.com/emacs/xmlchars/ -->
+ <!-- * -->
+ <!-- * The idea for implementing a character map in the DocBook Project -->
+ <!-- * manpages system was inspired by Steve Cheng's docbook2x[9]; -->
+ <!-- * in particular, its "utf8trans" utility and character-map system. -->
+ <!-- * -->
+ <!-- * [9] http://docbook2x.sourceforge.net/ -->
+ <!-- * -->
+ <!-- * ################################################################# -->
+
+ <!-- * ***************************************************************** -->
+ <!-- * Begin: Latin-1/ISO-8859-1 -->
+ <!-- * x00a0 to x00ff -->
+ <!-- * ***************************************************************** -->
+
+ <!-- * A no-break space can be written two ways in roff; the difference, -->
+ <!-- * according to the "Page Motions" node in the groff info page, is: -->
+ <!-- * -->
+ <!-- * "\ " = -->
+ <!-- * An unbreakable and unpaddable (i.e. not expanded during filling) -->
+ <!-- * space. -->
+ <!-- * -->
+ <!-- * "\~" = -->
+ <!-- * An unbreakable space that stretches like a normal -->
+ <!-- * inter-word space when a line is adjusted." -->
+ <!-- * -->
+ <!-- * Unfortunately, roff seems to do some weird things with long -->
+ <!-- * lines that only have words separated by "\~" spaces, so it's -->
+ <!-- * safer just to stick with the "\ " space -->
+ <xsl:output-character
+ character="&#x00a0;"
+ u:name="NO-BREAK SPACE"
+ u:entity="nbsp"
+ string="\ \&amp;"
+ u:block="C1 Controls And Latin-1 Supplement (Latin-1 Supplement)"
+ u:class="symbols"
+ />
+ <xsl:output-character
+ character="&#x00a1;"
+ u:name="INVERTED EXCLAMATION MARK"
+ u:entity="iexcl"
+ string="\(r!"
+ u:block="C1 Controls And Latin-1 Supplement (Latin-1 Supplement)"
+ u:class="symbols"
+ />
+ <xsl:output-character
+ character="&#x00a2;"
+ u:name="CENT SIGN"
+ u:entity="cent"
+ string="\(ct"
+ u:block="C1 Controls And Latin-1 Supplement (Latin-1 Supplement)"
+ u:class="symbols"
+ />
+ <xsl:output-character
+ character="&#x00a3;"
+ u:name="POUND SIGN"
+ u:entity="pound"
+ string="\(Po"
+ u:block="C1 Controls And Latin-1 Supplement (Latin-1 Supplement)"
+ u:class="symbols"
+ />
+ <xsl:output-character
+ character="&#x00a4;"
+ u:name="CURRENCY SIGN"
+ u:entity="curren"
+ string="\(Cs"
+ u:block="C1 Controls And Latin-1 Supplement (Latin-1 Supplement)"
+ u:class="symbols"
+ />
+ <xsl:output-character
+ character="&#x00a5;"
+ u:name="YEN SIGN"
+ u:entity="yen"
+ string="\(Ye"
+ u:block="C1 Controls And Latin-1 Supplement (Latin-1 Supplement)"
+ u:class="symbols"
+ />
+ <xsl:output-character
+ character="&#x00a6;"
+ u:name="BROKEN BAR"
+ u:entity="brvbar"
+ string="\(bb"
+ u:block="C1 Controls And Latin-1 Supplement (Latin-1 Supplement)"
+ u:class="symbols"
+ />
+ <xsl:output-character
+ character="&#x00a7;"
+ u:name="SECTION SIGN"
+ u:entity="sect"
+ string="\(sc"
+ u:block="C1 Controls And Latin-1 Supplement (Latin-1 Supplement)"
+ u:class="symbols"
+ />
+ <xsl:output-character
+ character="&#x00a8;"
+ u:name="DIAERESIS"
+ u:entity="Dot"
+ string="\(ad"
+ u:block="C1 Controls And Latin-1 Supplement (Latin-1 Supplement)"
+ u:class="symbols"
+ />
+ <xsl:output-character
+ character="&#x00a9;"
+ u:name="COPYRIGHT SIGN"
+ u:entity="copy"
+ string="\(co"
+ u:block="C1 Controls And Latin-1 Supplement (Latin-1 Supplement)"
+ u:class="symbols"
+ />
+ <xsl:output-character
+ character="&#x00aa;"
+ u:name="FEMININE ORDINAL INDICATOR"
+ u:entity="ordf"
+ string="\(Of"
+ u:block="C1 Controls And Latin-1 Supplement (Latin-1 Supplement)"
+ u:class="symbols"
+ />
+ <xsl:output-character
+ character="&#x00ab;"
+ u:name="LEFT-POINTING DOUBLE ANGLE QUOTATION MARK"
+ u:entity="laquo"
+ string="\(Fo"
+ u:block="C1 Controls And Latin-1 Supplement (Latin-1 Supplement)"
+ u:class="symbols"
+ />
+ <xsl:output-character
+ character="&#x00ac;"
+ u:name="NOT SIGN"
+ u:entity="not"
+ string="\(no"
+ u:block="C1 Controls And Latin-1 Supplement (Latin-1 Supplement)"
+ u:class="symbols"
+ />
+ <!-- * groff_char(7) man page sayxsl: "the soft hyphen control character -->
+ <!-- * (prints as itself). groff never use this character for output -->
+ <!-- * (thus it is omitted in the table below); the input character 173 -->
+ <!-- * is onto \%." -->
+ <xsl:output-character
+ character="&#x00ad;"
+ u:name="SOFT HYPHEN"
+ u:entity="shy"
+ string="\%"
+ u:block="C1 Controls And Latin-1 Supplement (Latin-1 Supplement)"
+ u:class="symbols"
+ />
+ <xsl:output-character
+ character="&#x00ae;"
+ u:name="REGISTERED SIGN"
+ u:entity="reg"
+ string="\(rg"
+ u:block="C1 Controls And Latin-1 Supplement (Latin-1 Supplement)"
+ u:class="symbols"
+ />
+ <xsl:output-character
+ character="&#x00af;"
+ u:name="MACRON"
+ u:entity="macr"
+ string="\(a-"
+ u:block="C1 Controls And Latin-1 Supplement (Latin-1 Supplement)"
+ u:class="symbols"
+ />
+ <xsl:output-character
+ character="&#x00b0;"
+ u:name="DEGREE SIGN"
+ u:entity="deg"
+ string="\(de"
+ u:block="C1 Controls And Latin-1 Supplement (Latin-1 Supplement)"
+ u:class="symbols"
+ />
+ <xsl:output-character
+ character="&#x00b1;"
+ u:name="PLUS-MINUS SIGN"
+ u:entity="plusmn"
+ string="\(+-"
+ u:block="C1 Controls And Latin-1 Supplement (Latin-1 Supplement)"
+ u:class="symbols"
+ />
+ <xsl:output-character
+ character="&#x00b2;"
+ u:name="SUPERSCRIPT TWO"
+ u:entity="sup2"
+ string="\(S2"
+ u:block="C1 Controls And Latin-1 Supplement (Latin-1 Supplement)"
+ u:class="symbols"
+ />
+ <xsl:output-character
+ character="&#x00b3;"
+ u:name="SUPERSCRIPT THREE"
+ u:entity="sup3"
+ string="\(S3"
+ u:block="C1 Controls And Latin-1 Supplement (Latin-1 Supplement)"
+ u:class="symbols"
+ />
+ <xsl:output-character
+ character="&#x00b4;"
+ u:name="ACUTE ACCENT"
+ u:entity="acute"
+ string="\(aa"
+ u:block="C1 Controls And Latin-1 Supplement (Latin-1 Supplement)"
+ u:class="symbols"
+ />
+ <xsl:output-character
+ character="&#x00b5;"
+ u:name="MICRO SIGN"
+ u:entity="micro"
+ string="\(mc"
+ u:block="C1 Controls And Latin-1 Supplement (Latin-1 Supplement)"
+ u:class="symbols"
+ />
+ <xsl:output-character
+ character="&#x00b6;"
+ u:name="PILCROW SIGN"
+ u:entity="para"
+ string="\(ps"
+ u:block="C1 Controls And Latin-1 Supplement (Latin-1 Supplement)"
+ u:class="symbols"
+ />
+ <!-- * according to groff_char(7), I think the escape string \(pc -->
+ <!-- * "periodcentered" could also be used for middot; not sure which -->
+ <!-- * is better, but "md" mnemonic is a better fit :-) -->
+ <xsl:output-character
+ character="&#x00b7;"
+ u:name="MIDDLE DOT"
+ u:entity="middot"
+ string="\(md"
+ u:block="C1 Controls And Latin-1 Supplement (Latin-1 Supplement)"
+ u:class="symbols"
+ />
+ <xsl:output-character
+ character="&#x00b8;"
+ u:name="CEDILLA"
+ u:entity="cedil"
+ string="\(ac"
+ u:block="C1 Controls And Latin-1 Supplement (Latin-1 Supplement)"
+ u:class="symbols"
+ />
+ <xsl:output-character
+ character="&#x00b9;"
+ u:name="SUPERSCRIPT ONE"
+ u:entity="sup1"
+ string="\(S1"
+ u:block="C1 Controls And Latin-1 Supplement (Latin-1 Supplement)"
+ u:class="symbols"
+ />
+ <xsl:output-character
+ character="&#x00ba;"
+ u:name="MASCULINE ORDINAL INDICATOR"
+ u:entity="ordm"
+ string="\(Om"
+ u:block="C1 Controls And Latin-1 Supplement (Latin-1 Supplement)"
+ u:class="symbols"
+ />
+ <xsl:output-character
+ character="&#x00bb;"
+ u:name="RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK"
+ u:entity="raquo"
+ string="\(Fc"
+ u:block="C1 Controls And Latin-1 Supplement (Latin-1 Supplement)"
+ u:class="symbols"
+ />
+ <xsl:output-character
+ character="&#x00bc;"
+ u:name="VULGAR FRACTION ONE QUARTER"
+ u:entity="frac14"
+ string="\(14"
+ u:block="C1 Controls And Latin-1 Supplement (Latin-1 Supplement)"
+ u:class="symbols"
+ />
+ <xsl:output-character
+ character="&#x00bd;"
+ u:name="VULGAR FRACTION ONE HALF"
+ u:entity="frac12"
+ string="\(12"
+ u:block="C1 Controls And Latin-1 Supplement (Latin-1 Supplement)"
+ u:class="symbols"
+ />
+ <xsl:output-character
+ character="&#x00be;"
+ u:name="VULGAR FRACTION THREE QUARTERS"
+ u:entity="frac34"
+ string="\(34"
+ u:block="C1 Controls And Latin-1 Supplement (Latin-1 Supplement)"
+ u:class="symbols"
+ />
+ <xsl:output-character
+ character="&#x00bf;"
+ u:name="INVERTED QUESTION MARK"
+ u:entity="iquest"
+ string="\(r?"
+ u:block="C1 Controls And Latin-1 Supplement (Latin-1 Supplement)"
+ u:class="symbols"
+ />
+ <xsl:output-character
+ character="&#x00c0;"
+ u:name="LATIN CAPITAL LETTER A WITH GRAVE"
+ u:entity="Agrave"
+ string="\(`A"
+ u:block="C1 Controls And Latin-1 Supplement (Latin-1 Supplement)"
+ u:class="letters"
+ />
+ <xsl:output-character
+ character="&#x00c1;"
+ u:name="LATIN CAPITAL LETTER A WITH ACUTE"
+ u:entity="Aacute"
+ string="\('A"
+ u:block="C1 Controls And Latin-1 Supplement (Latin-1 Supplement)"
+ u:class="letters"
+ />
+ <xsl:output-character
+ character="&#x00c2;"
+ u:name="LATIN CAPITAL LETTER A WITH CIRCUMFLEX"
+ u:entity="Acirc"
+ string="\(^A"
+ u:block="C1 Controls And Latin-1 Supplement (Latin-1 Supplement)"
+ u:class="letters"
+ />
+ <xsl:output-character
+ character="&#x00c3;"
+ u:name="LATIN CAPITAL LETTER A WITH TILDE"
+ u:entity="Atilde"
+ string="\(~A"
+ u:block="C1 Controls And Latin-1 Supplement (Latin-1 Supplement)"
+ u:class="letters"
+ />
+ <xsl:output-character
+ character="&#x00c4;"
+ u:name="LATIN CAPITAL LETTER A WITH DIAERESIS"
+ u:entity="Auml"
+ string="\(:A"
+ u:block="C1 Controls And Latin-1 Supplement (Latin-1 Supplement)"
+ u:class="letters"
+ />
+ <xsl:output-character
+ character="&#x00c5;"
+ u:name="LATIN CAPITAL LETTER A WITH RING ABOVE"
+ u:entity="Aring"
+ string="\(oA"
+ u:block="C1 Controls And Latin-1 Supplement (Latin-1 Supplement)"
+ u:class="letters"
+ />
+ <xsl:output-character
+ character="&#x00c6;"
+ u:name="LATIN CAPITAL LETTER AE"
+ u:entity="AElig"
+ string="\(AE"
+ u:block="C1 Controls And Latin-1 Supplement (Latin-1 Supplement)"
+ u:class="letters"
+ />
+ <xsl:output-character
+ character="&#x00c7;"
+ u:name="LATIN CAPITAL LETTER C WITH CEDILLA"
+ u:entity="Ccedil"
+ string="\(,C"
+ u:block="C1 Controls And Latin-1 Supplement (Latin-1 Supplement)"
+ u:class="letters"
+ />
+ <xsl:output-character
+ character="&#x00c8;"
+ u:name="LATIN CAPITAL LETTER E WITH GRAVE"
+ u:entity="Egrave"
+ string="\(`E"
+ u:block="C1 Controls And Latin-1 Supplement (Latin-1 Supplement)"
+ u:class="letters"
+ />
+ <xsl:output-character
+ character="&#x00c9;"
+ u:name="LATIN CAPITAL LETTER E WITH ACUTE"
+ u:entity="Eacute"
+ string="\('E"
+ u:block="C1 Controls And Latin-1 Supplement (Latin-1 Supplement)"
+ u:class="letters"
+ />
+ <xsl:output-character
+ character="&#x00ca;"
+ u:name="LATIN CAPITAL LETTER E WITH CIRCUMFLEX"
+ u:entity="Ecirc"
+ string="\(^E"
+ u:block="C1 Controls And Latin-1 Supplement (Latin-1 Supplement)"
+ u:class="letters"
+ />
+ <xsl:output-character
+ character="&#x00cb;"
+ u:name="LATIN CAPITAL LETTER E WITH DIAERESIS"
+ u:entity="Euml"
+ string="\(:E"
+ u:block="C1 Controls And Latin-1 Supplement (Latin-1 Supplement)"
+ u:class="letters"
+ />
+ <xsl:output-character
+ character="&#x00cc;"
+ u:name="LATIN CAPITAL LETTER I WITH GRAVE"
+ u:entity="Igrave"
+ string="\(`I"
+ u:block="C1 Controls And Latin-1 Supplement (Latin-1 Supplement)"
+ u:class="letters"
+ />
+ <xsl:output-character
+ character="&#x00cd;"
+ u:name="LATIN CAPITAL LETTER I WITH ACUTE"
+ u:entity="Iacute"
+ string="\('I"
+ u:block="C1 Controls And Latin-1 Supplement (Latin-1 Supplement)"
+ u:class="letters"
+ />
+ <xsl:output-character
+ character="&#x00ce;"
+ u:name="LATIN CAPITAL LETTER I WITH CIRCUMFLEX"
+ u:entity="Icirc"
+ string="\(^I"
+ u:block="C1 Controls And Latin-1 Supplement (Latin-1 Supplement)"
+ u:class="letters"
+ />
+ <xsl:output-character
+ character="&#x00cf;"
+ u:name="LATIN CAPITAL LETTER I WITH DIAERESIS"
+ u:entity="Iuml"
+ string="\(:I"
+ u:block="C1 Controls And Latin-1 Supplement (Latin-1 Supplement)"
+ u:class="letters"
+ />
+ <xsl:output-character
+ character="&#x00d0;"
+ u:name="LATIN CAPITAL LETTER ETH"
+ u:entity="ETH"
+ string="\(-D"
+ u:block="C1 Controls And Latin-1 Supplement (Latin-1 Supplement)"
+ u:class="letters"
+ />
+ <xsl:output-character
+ character="&#x00d1;"
+ u:name="LATIN CAPITAL LETTER N WITH TILDE"
+ u:entity="Ntilde"
+ string="\(~N"
+ u:block="C1 Controls And Latin-1 Supplement (Latin-1 Supplement)"
+ u:class="letters"
+ />
+ <xsl:output-character
+ character="&#x00d2;"
+ u:name="LATIN CAPITAL LETTER O WITH GRAVE"
+ u:entity="Ograve"
+ string="\(`O"
+ u:block="C1 Controls And Latin-1 Supplement (Latin-1 Supplement)"
+ u:class="letters"
+ />
+ <xsl:output-character
+ character="&#x00d3;"
+ u:name="LATIN CAPITAL LETTER O WITH ACUTE"
+ u:entity="Oacute"
+ string="\('O"
+ u:block="C1 Controls And Latin-1 Supplement (Latin-1 Supplement)"
+ u:class="letters"
+ />
+ <xsl:output-character
+ character="&#x00d4;"
+ u:name="LATIN CAPITAL LETTER O WITH CIRCUMFLEX"
+ u:entity="Ocirc"
+ string="\(^O"
+ u:block="C1 Controls And Latin-1 Supplement (Latin-1 Supplement)"
+ u:class="letters"
+ />
+ <xsl:output-character
+ character="&#x00d5;"
+ u:name="LATIN CAPITAL LETTER O WITH TILDE"
+ u:entity="Otilde"
+ string="\(~O"
+ u:block="C1 Controls And Latin-1 Supplement (Latin-1 Supplement)"
+ u:class="letters"
+ />
+ <xsl:output-character
+ character="&#x00d6;"
+ u:name="LATIN CAPITAL LETTER O WITH DIAERESIS"
+ u:entity="Ouml"
+ string="\(:O"
+ u:block="C1 Controls And Latin-1 Supplement (Latin-1 Supplement)"
+ u:class="letters"
+ />
+ <xsl:output-character
+ character="&#x00d7;"
+ u:name="MULTIPLICATION SIGN"
+ u:entity="times"
+ string="\(mu"
+ u:block="C1 Controls And Latin-1 Supplement (Latin-1 Supplement)"
+ u:class="symbols"
+ />
+ <xsl:output-character
+ character="&#x00d8;"
+ u:name="LATIN CAPITAL LETTER O WITH STROKE"
+ u:entity="Oslash"
+ string="\(/O"
+ u:block="C1 Controls And Latin-1 Supplement (Latin-1 Supplement)"
+ u:class="letters"
+ />
+ <xsl:output-character
+ character="&#x00d9;"
+ u:name="LATIN CAPITAL LETTER U WITH GRAVE"
+ u:entity="Ugrave"
+ string="\(`U"
+ u:block="C1 Controls And Latin-1 Supplement (Latin-1 Supplement)"
+ u:class="letters"
+ />
+ <xsl:output-character
+ character="&#x00da;"
+ u:name="LATIN CAPITAL LETTER U WITH ACUTE"
+ u:entity="Uacute"
+ string="\('U"
+ u:block="C1 Controls And Latin-1 Supplement (Latin-1 Supplement)"
+ u:class="letters"
+ />
+ <xsl:output-character
+ character="&#x00db;"
+ u:name="LATIN CAPITAL LETTER U WITH CIRCUMFLEX"
+ u:entity="Ucirc"
+ string="\(^U"
+ u:block="C1 Controls And Latin-1 Supplement (Latin-1 Supplement)"
+ u:class="letters"
+ />
+ <xsl:output-character
+ character="&#x00dc;"
+ u:name="LATIN CAPITAL LETTER U WITH DIAERESIS"
+ u:entity="Uuml"
+ string="\(:U"
+ u:block="C1 Controls And Latin-1 Supplement (Latin-1 Supplement)"
+ u:class="letters"
+ />
+ <xsl:output-character
+ character="&#x00dd;"
+ u:name="LATIN CAPITAL LETTER Y WITH ACUTE"
+ u:entity="Yacute"
+ string="\('Y"
+ u:block="C1 Controls And Latin-1 Supplement (Latin-1 Supplement)"
+ u:class="letters"
+ />
+ <xsl:output-character
+ character="&#x00de;"
+ u:name="LATIN CAPITAL LETTER THORN"
+ u:entity="THORN"
+ string="\(TP"
+ u:block="C1 Controls And Latin-1 Supplement (Latin-1 Supplement)"
+ u:class="letters"
+ />
+ <xsl:output-character
+ character="&#x00df;"
+ u:name="LATIN SMALL LETTER SHARP S"
+ u:entity="szlig"
+ string="\(ss"
+ u:block="C1 Controls And Latin-1 Supplement (Latin-1 Supplement)"
+ u:class="letters"
+ />
+ <xsl:output-character
+ character="&#x00e0;"
+ u:name="LATIN SMALL LETTER A WITH GRAVE"
+ u:entity="agrave"
+ string="\(`a"
+ u:block="C1 Controls And Latin-1 Supplement (Latin-1 Supplement)"
+ u:class="letters"
+ />
+ <xsl:output-character
+ character="&#x00e1;"
+ u:name="LATIN SMALL LETTER A WITH ACUTE"
+ u:entity="aacute"
+ string="\('a"
+ u:block="C1 Controls And Latin-1 Supplement (Latin-1 Supplement)"
+ u:class="letters"
+ />
+ <xsl:output-character
+ character="&#x00e2;"
+ u:name="LATIN SMALL LETTER A WITH CIRCUMFLEX"
+ u:entity="acirc"
+ string="\(^a"
+ u:block="C1 Controls And Latin-1 Supplement (Latin-1 Supplement)"
+ u:class="letters"
+ />
+ <xsl:output-character
+ character="&#x00e3;"
+ u:name="LATIN SMALL LETTER A WITH TILDE"
+ u:entity="atilde"
+ string="\(~a"
+ u:block="C1 Controls And Latin-1 Supplement (Latin-1 Supplement)"
+ u:class="letters"
+ />
+ <xsl:output-character
+ character="&#x00e4;"
+ u:name="LATIN SMALL LETTER A WITH DIAERESIS"
+ u:entity="auml"
+ string="\(:a"
+ u:block="C1 Controls And Latin-1 Supplement (Latin-1 Supplement)"
+ u:class="letters"
+ />
+ <xsl:output-character
+ character="&#x00e5;"
+ u:name="LATIN SMALL LETTER A WITH RING ABOVE"
+ u:entity="aring"
+ string="\(oa"
+ u:block="C1 Controls And Latin-1 Supplement (Latin-1 Supplement)"
+ u:class="letters"
+ />
+ <xsl:output-character
+ character="&#x00e6;"
+ u:name="LATIN SMALL LETTER AE"
+ u:entity="aelig"
+ string="\(ae"
+ u:block="C1 Controls And Latin-1 Supplement (Latin-1 Supplement)"
+ u:class="letters"
+ />
+ <xsl:output-character
+ character="&#x00e7;"
+ u:name="LATIN SMALL LETTER C WITH CEDILLA"
+ u:entity="ccedil"
+ string="\(,c"
+ u:block="C1 Controls And Latin-1 Supplement (Latin-1 Supplement)"
+ u:class="letters"
+ />
+ <xsl:output-character
+ character="&#x00e8;"
+ u:name="LATIN SMALL LETTER E WITH GRAVE"
+ u:entity="egrave"
+ string="\(`e"
+ u:block="C1 Controls And Latin-1 Supplement (Latin-1 Supplement)"
+ u:class="letters"
+ />
+ <xsl:output-character
+ character="&#x00e9;"
+ u:name="LATIN SMALL LETTER E WITH ACUTE"
+ u:entity="eacute"
+ string="\('e"
+ u:block="C1 Controls And Latin-1 Supplement (Latin-1 Supplement)"
+ u:class="letters"
+ />
+ <xsl:output-character
+ character="&#x00ea;"
+ u:name="LATIN SMALL LETTER E WITH CIRCUMFLEX"
+ u:entity="ecirc"
+ string="\(^e"
+ u:block="C1 Controls And Latin-1 Supplement (Latin-1 Supplement)"
+ u:class="letters"
+ />
+ <xsl:output-character
+ character="&#x00eb;"
+ u:name="LATIN SMALL LETTER E WITH DIAERESIS"
+ u:entity="euml"
+ string="\(:e"
+ u:block="C1 Controls And Latin-1 Supplement (Latin-1 Supplement)"
+ u:class="letters"
+ />
+ <xsl:output-character
+ character="&#x00ec;"
+ u:name="LATIN SMALL LETTER I WITH GRAVE"
+ u:entity="igrave"
+ string="\(`i"
+ u:block="C1 Controls And Latin-1 Supplement (Latin-1 Supplement)"
+ u:class="letters"
+ />
+ <xsl:output-character
+ character="&#x00ed;"
+ u:name="LATIN SMALL LETTER I WITH ACUTE"
+ u:entity="iacute"
+ string="\('i"
+ u:block="C1 Controls And Latin-1 Supplement (Latin-1 Supplement)"
+ u:class="letters"
+ />
+ <xsl:output-character
+ character="&#x00ee;"
+ u:name="LATIN SMALL LETTER I WITH CIRCUMFLEX"
+ u:entity="icirc"
+ string="\(^i"
+ u:block="C1 Controls And Latin-1 Supplement (Latin-1 Supplement)"
+ u:class="letters"
+ />
+ <xsl:output-character
+ character="&#x00ef;"
+ u:name="LATIN SMALL LETTER I WITH DIAERESIS"
+ u:entity="iuml"
+ string="\(:i"
+ u:block="C1 Controls And Latin-1 Supplement (Latin-1 Supplement)"
+ u:class="letters"
+ />
+ <xsl:output-character
+ character="&#x00f0;"
+ u:name="LATIN SMALL LETTER ETH"
+ u:entity="eth"
+ string="\(Sd"
+ u:block="C1 Controls And Latin-1 Supplement (Latin-1 Supplement)"
+ u:class="letters"
+ />
+ <xsl:output-character
+ character="&#x00f1;"
+ u:name="LATIN SMALL LETTER N WITH TILDE"
+ u:entity="ntilde"
+ string="\(~n"
+ u:block="C1 Controls And Latin-1 Supplement (Latin-1 Supplement)"
+ u:class="letters"
+ />
+ <xsl:output-character
+ character="&#x00f2;"
+ u:name="LATIN SMALL LETTER O WITH GRAVE"
+ u:entity="ograve"
+ string="\(`o"
+ u:block="C1 Controls And Latin-1 Supplement (Latin-1 Supplement)"
+ u:class="letters"
+ />
+ <xsl:output-character
+ character="&#x00f3;"
+ u:name="LATIN SMALL LETTER O WITH ACUTE"
+ u:entity="oacute"
+ string="\('o"
+ u:block="C1 Controls And Latin-1 Supplement (Latin-1 Supplement)"
+ u:class="letters"
+ />
+ <xsl:output-character
+ character="&#x00f4;"
+ u:name="LATIN SMALL LETTER O WITH CIRCUMFLEX"
+ u:entity="ocirc"
+ string="\(^o"
+ u:block="C1 Controls And Latin-1 Supplement (Latin-1 Supplement)"
+ u:class="letters"
+ />
+ <xsl:output-character
+ character="&#x00f5;"
+ u:name="LATIN SMALL LETTER O WITH TILDE"
+ u:entity="otilde"
+ string="\(~o"
+ u:block="C1 Controls And Latin-1 Supplement (Latin-1 Supplement)"
+ u:class="letters"
+ />
+ <xsl:output-character
+ character="&#x00f6;"
+ u:name="LATIN SMALL LETTER O WITH DIAERESIS"
+ u:entity="ouml"
+ string="\(:o"
+ u:block="C1 Controls And Latin-1 Supplement (Latin-1 Supplement)"
+ u:class="letters"
+ />
+ <xsl:output-character
+ character="&#x00f7;"
+ u:name="DIVISION SIGN"
+ u:entity="divide"
+ string="\(di"
+ u:block="C1 Controls And Latin-1 Supplement (Latin-1 Supplement)"
+ u:class="symbols"
+ />
+ <xsl:output-character
+ character="&#x00f8;"
+ u:name="LATIN SMALL LETTER O WITH STROKE"
+ u:entity="oslash"
+ string="\(/o"
+ u:block="C1 Controls And Latin-1 Supplement (Latin-1 Supplement)"
+ u:class="letters"
+ />
+ <xsl:output-character
+ character="&#x00f9;"
+ u:name="LATIN SMALL LETTER U WITH GRAVE"
+ u:entity="ugrave"
+ string="\(`u"
+ u:block="C1 Controls And Latin-1 Supplement (Latin-1 Supplement)"
+ u:class="letters"
+ />
+ <xsl:output-character
+ character="&#x00fa;"
+ u:name="LATIN SMALL LETTER U WITH ACUTE"
+ u:entity="uacute"
+ string="\('u"
+ u:block="C1 Controls And Latin-1 Supplement (Latin-1 Supplement)"
+ u:class="letters"
+ />
+ <xsl:output-character
+ character="&#x00fb;"
+ u:name="LATIN SMALL LETTER U WITH CIRCUMFLEX"
+ u:entity="ucirc"
+ string="\(^u"
+ u:block="C1 Controls And Latin-1 Supplement (Latin-1 Supplement)"
+ u:class="letters"
+ />
+ <xsl:output-character
+ character="&#x00fc;"
+ u:name="LATIN SMALL LETTER U WITH DIAERESIS"
+ u:entity="uuml"
+ string="\(:u"
+ u:block="C1 Controls And Latin-1 Supplement (Latin-1 Supplement)"
+ u:class="letters"
+ />
+ <xsl:output-character
+ character="&#x00fd;"
+ u:name="LATIN SMALL LETTER Y WITH ACUTE"
+ u:entity="yacute"
+ string="\('y"
+ u:block="C1 Controls And Latin-1 Supplement (Latin-1 Supplement)"
+ u:class="letters"
+ />
+ <xsl:output-character
+ character="&#x00fe;"
+ u:name="LATIN SMALL LETTER THORN"
+ u:entity="thorn"
+ string="\(Tp"
+ u:block="C1 Controls And Latin-1 Supplement (Latin-1 Supplement)"
+ u:class="letters"
+ />
+ <xsl:output-character
+ character="&#x00ff;"
+ u:name="LATIN SMALL LETTER Y WITH DIAERESIS"
+ u:entity="yuml"
+ string="\(:y"
+ u:block="C1 Controls And Latin-1 Supplement (Latin-1 Supplement)"
+ u:class="letters"
+ />
+ <!-- * **************************************************************** -->
+ <!-- * End: Latin-1/ISO-8859-1 -->
+ <!-- * **************************************************************** -->
+
+ <!-- * **************************************************************** -->
+ <!-- * Begin: -->
+ <!-- * -->
+ <!-- * - x0100 to x017f (Latin Extended-A) -->
+ <!-- * - x0180 to x023f (Latin Extended-B) -->
+ <!-- * - x0250 to x02ad (IPA Extensions) -->
+ <!-- * - x02b0 to x02ee (Spacing Modifier Letters) -->
+ <!-- * - x0300 to x036f (Combining Diacritical Marks) -->
+ <!-- * -->
+ <!-- * Other than the following exceptions, characters in these -->
+ <!-- * blocks don't have any roff equivalents -->
+ <!-- * **************************************************************** -->
+
+ <xsl:output-character
+ character="&#x0131;"
+ u:name="LATIN SMALL LETTER DOTLESS I"
+ u:entity="inodot"
+ string="\(.i"
+ u:block="Latin Extended-A"
+ />
+ <xsl:output-character
+ character="&#x0132;"
+ u:name="LATIN CAPITAL LIGATURE IJ"
+ u:entity="IJlig"
+ string="\(IJ"
+ u:block="Latin Extended-A"
+ />
+ <xsl:output-character
+ character="&#x0133;"
+ u:name="LATIN SMALL LIGATURE IJ"
+ u:entity="ijlig"
+ string="\(ij"
+ u:block="Latin Extended-A"
+ />
+ <xsl:output-character
+ character="&#x0141;"
+ u:name="LATIN CAPITAL LETTER L WITH STROKE"
+ u:entity="Lstrok"
+ string="\(/L"
+ u:block="Latin Extended-A"
+ />
+ <xsl:output-character
+ character="&#x0142;"
+ u:name="LATIN SMALL LETTER L WITH STROKE"
+ u:entity="lstrok"
+ string="\(/l"
+ u:block="Latin Extended-A"
+ />
+ <xsl:output-character
+ character="&#x0152;"
+ u:name="LATIN CAPITAL LIGATURE OE"
+ u:entity="OElig"
+ string="\(OE"
+ u:block="Latin Extended-A"
+ />
+ <xsl:output-character
+ character="&#x0153;"
+ u:name="LATIN SMALL LIGATURE OE"
+ u:entity="oelig"
+ string="\(oe"
+ u:block="Latin Extended-A"
+ />
+ <xsl:output-character
+ character="&#x160;"
+ u:name="LATIN CAPITAL LETTER S WITH CARON"
+ u:entity="Scaron"
+ string="\(vS"
+ u:block="Latin Extended-A"
+ />
+ <xsl:output-character
+ character="&#x161;"
+ u:name="LATIN SMALL LETTER S WITH CARON"
+ u:entity="scaron"
+ string="\(vs"
+ u:block="Latin Extended-A"
+ />
+ <xsl:output-character
+ character="&#x17D;"
+ u:name="LATIN CAPITAL LETTER Z WITH CARON"
+ u:entity="Zcaron"
+ string="\(vZ"
+ u:block="Latin Extended-A"
+ />
+ <xsl:output-character
+ character="&#x17E;"
+ u:name="LATIN SMALL LETTER Z WITH CARON"
+ u:entity="zcaron"
+ string="\(vz"
+ u:block="Latin Extended-A"
+ />
+ <xsl:output-character
+ character="&#x0192;"
+ u:name="LATIN SMALL LETTER F WITH HOOK"
+ u:entity="fnof"
+ string="\(Fn"
+ u:block="Latin Extended-B"
+ />
+ <xsl:output-character
+ character="&#x02c6;"
+ u:name="MODIFIER LETTER CIRCUMFLEX ACCENT"
+ u:entity="circ"
+ string="\(a^"
+ u:block="Spacing Modifier Letters"
+ />
+ <xsl:output-character
+ character="&#x02c7;"
+ u:name="CARON"
+ u:entity="caron"
+ string="\(ac"
+ u:block="Spacing Modifier Letters"
+ />
+ <xsl:output-character
+ character="&#x02c9;"
+ u:name="MODIFIER LETTER MACRON"
+ string="\(a-"
+ u:block="Spacing Modifier Letters"
+ />
+ <xsl:output-character
+ character="&#x02d8;"
+ u:name="BREVE"
+ u:entity="breve"
+ string="\(ab"
+ u:block="Spacing Modifier Letters"
+ />
+<!-- * there does not seem to by any roff equivalent for "dot above" -->
+<!-- * <xsl:output-character -->
+<!-- * character="&#x02d9;" -->
+<!-- * u:name="DOT ABOVE" -->
+<!-- * u:entity="dot" -->
+<!-- * /> -->
+ <xsl:output-character
+ character="&#x02da;"
+ u:name="RING ABOVE"
+ u:entity="ring"
+ string="\(ao"
+ u:block="Spacing Modifier Letters"
+ />
+ <xsl:output-character
+ character="&#x02db;"
+ u:name="OGONEK"
+ u:entity="ogon"
+ string="\(ho"
+ u:block="Spacing Modifier Letters"
+ />
+ <!-- groff_char(7) calls Unicode x02dd a "Hungarian umlaut" -->
+ <xsl:output-character
+ character="&#x02dd;"
+ u:name="DOUBLE ACUTE ACCENT"
+ u:entity="dblac"
+ string='\(a"'
+ u:block="Spacing Modifier Letters"
+ />
+
+ <!-- * **************************************************************** -->
+ <!-- * End: -->
+ <!-- * - Latin Extended-A -->
+ <!-- * - Latin Extended-B -->
+ <!-- * - IPA Extensions -->
+ <!-- * - Spacing Modifier Letters -->
+ <!-- * - Combining Diacritical Marks -->
+ <!-- * **************************************************************** -->
+
+ <!-- * **************************************************************** -->
+ <!-- * Begin: Greek and Coptic -->
+ <!-- * x0370 to x03ff -->
+ <!-- * **************************************************************** -->
+
+ <xsl:output-character
+ character="&#x0391;"
+ u:name="GREEK CAPITAL LETTER ALPHA"
+ u:entity="Agr"
+ string="\(*A)"
+ u:block="Greek and Coptic"
+ />
+ <xsl:output-character
+ character="&#x0392;"
+ u:name="GREEK CAPITAL LETTER BETA"
+ u:entity="Bgr"
+ string="\(*B"
+ u:block="Greek and Coptic"
+ />
+ <xsl:output-character
+ character="&#x0393;"
+ u:name="GREEK CAPITAL LETTER GAMMA"
+ u:entity="Gamma"
+ string="\(*G"
+ u:block="Greek and Coptic"
+ />
+ <xsl:output-character
+ character="&#x0394;"
+ u:name="GREEK CAPITAL LETTER DELTA"
+ u:entity="Delta"
+ string="\(*D"
+ u:block="Greek and Coptic"
+ />
+ <xsl:output-character
+ character="&#x0395;"
+ u:name="GREEK CAPITAL LETTER EPSILON"
+ u:entity="Egr"
+ string="\(*E"
+ u:block="Greek and Coptic"
+ />
+ <xsl:output-character
+ character="&#x0396;"
+ u:name="GREEK CAPITAL LETTER ZETA"
+ u:entity="Zgr"
+ string="\(*Z"
+ u:block="Greek and Coptic"
+ />
+ <xsl:output-character
+ character="&#x0397;"
+ u:name="GREEK CAPITAL LETTER ETA"
+ u:entity="EEgr"
+ string="\(*Y"
+ u:block="Greek and Coptic"
+ />
+ <xsl:output-character
+ character="&#x0398;"
+ u:name="GREEK CAPITAL LETTER THETA"
+ u:entity="THgr"
+ string="\(*H"
+ u:block="Greek and Coptic"
+ />
+ <xsl:output-character
+ character="&#x0399;"
+ u:name="GREEK CAPITAL LETTER IOTA"
+ u:entity="Igr"
+ string="\(*I"
+ u:block="Greek and Coptic"
+ />
+ <xsl:output-character
+ character="&#x039a;"
+ u:name="GREEK CAPITAL LETTER KAPPA"
+ u:entity="Kgr"
+ string="\(*K"
+ u:block="Greek and Coptic"
+ />
+ <xsl:output-character
+ character="&#x039b;"
+ u:name="GREEK CAPITAL LETTER LAMDA"
+ u:entity="Lambda"
+ string="\(*L"
+ u:block="Greek and Coptic"
+ />
+ <xsl:output-character
+ character="&#x039c;"
+ u:name="GREEK CAPITAL LETTER MU"
+ u:entity="Mgr"
+ string="\(*M"
+ u:block="Greek and Coptic"
+ />
+ <xsl:output-character
+ character="&#x039d;"
+ u:name="GREEK CAPITAL LETTER NU"
+ u:entity="Ngr"
+ string="\(*N"
+ u:block="Greek and Coptic"
+ />
+ <xsl:output-character
+ character="&#x039e;"
+ u:name="GREEK CAPITAL LETTER XI"
+ u:entity="Xgr"
+ string="\(*C"
+ u:block="Greek and Coptic"
+ />
+ <xsl:output-character
+ character="&#x039f;"
+ u:name="GREEK CAPITAL LETTER OMICRON"
+ u:entity="Ogr"
+ string="\(*O"
+ u:block="Greek and Coptic"
+ />
+ <xsl:output-character
+ character="&#x03a0;"
+ u:name="GREEK CAPITAL LETTER PI"
+ u:entity="Pgr"
+ string="\(*P"
+ u:block="Greek and Coptic"
+ />
+ <xsl:output-character
+ character="&#x03a1;"
+ u:name="GREEK CAPITAL LETTER RHO"
+ u:entity="Rgr"
+ string="\(*R"
+ u:block="Greek and Coptic"
+ />
+ <xsl:output-character
+ character="&#x03a3;"
+ u:name="GREEK CAPITAL LETTER SIGMA"
+ u:entity="Sgr"
+ string="\(*S"
+ u:block="Greek and Coptic"
+ />
+ <xsl:output-character
+ character="&#x03a4;"
+ u:name="GREEK CAPITAL LETTER TAU"
+ u:entity="Tgr"
+ string="\(*T"
+ u:block="Greek and Coptic"
+ />
+ <xsl:output-character
+ character="&#x03a5;"
+ u:name="GREEK CAPITAL LETTER UPSILON"
+ u:entity="Ugr"
+ string="\(*U"
+ u:block="Greek and Coptic"
+ />
+ <xsl:output-character
+ character="&#x03a6;"
+ u:name="GREEK CAPITAL LETTER PHI"
+ u:entity="PHgr"
+ string="\(*F"
+ u:block="Greek and Coptic"
+ />
+ <xsl:output-character
+ character="&#x03a7;"
+ u:name="GREEK CAPITAL LETTER CHI"
+ u:entity="KHgr"
+ string="\(*X"
+ u:block="Greek and Coptic"
+ />
+ <xsl:output-character
+ character="&#x03a8;"
+ u:name="GREEK CAPITAL LETTER PSI"
+ u:entity="PSgr"
+ string="\(*Q"
+ u:block="Greek and Coptic"
+ />
+ <xsl:output-character
+ character="&#x03a9;"
+ u:name="GREEK CAPITAL LETTER OMEGA"
+ u:entity="OHgr"
+ string="\(*W"
+ u:block="Greek and Coptic"
+ />
+ <xsl:output-character
+ character="&#x03aa;"
+ u:name="GREEK CAPITAL LETTER IOTA WITH DIALYTIKA"
+ u:entity="Idigr"
+ string="\(*I"
+ u:block="Greek and Coptic"
+ />
+ <xsl:output-character
+ character="&#x03ab;"
+ u:name="GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA"
+ u:entity="Udigr"
+ string="\(*U"
+ u:block="Greek and Coptic"
+ />
+ <xsl:output-character
+ character="&#x03ac;"
+ u:name="GREEK SMALL LETTER ALPHA WITH TONOS"
+ u:entity="aacgr"
+ string="\(*a"
+ u:block="Greek and Coptic"
+ />
+ <xsl:output-character
+ character="&#x03ad;"
+ u:name="GREEK SMALL LETTER EPSILON WITH TONOS"
+ u:entity="eacgr"
+ string="\(*e"
+ u:block="Greek and Coptic"
+ />
+ <xsl:output-character
+ character="&#x03ae;"
+ u:name="GREEK SMALL LETTER ETA WITH TONOS"
+ u:entity="eeacgr"
+ string="\(*y"
+ u:block="Greek and Coptic"
+ />
+ <xsl:output-character
+ character="&#x03af;"
+ u:name="GREEK SMALL LETTER IOTA WITH TONOS"
+ u:entity="iacgr"
+ string="\(*i"
+ u:block="Greek and Coptic"
+ />
+ <xsl:output-character
+ character="&#x03b0;"
+ u:name="GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS"
+ u:entity="udiagr"
+ string="\(*u"
+ u:block="Greek and Coptic"
+ />
+ <xsl:output-character
+ character="&#x03b1;"
+ u:name="GREEK SMALL LETTER ALPHA"
+ u:entity="agr"
+ string="\(*a"
+ u:block="Greek and Coptic"
+ />
+ <xsl:output-character
+ character="&#x03b2;"
+ u:name="GREEK SMALL LETTER BETA"
+ u:entity="beta"
+ string="\(*b"
+ u:block="Greek and Coptic"
+ />
+ <xsl:output-character
+ character="&#x03b3;"
+ u:name="GREEK SMALL LETTER GAMMA"
+ u:entity="gamma"
+ string="\(*g"
+ u:block="Greek and Coptic"
+ />
+ <xsl:output-character
+ character="&#x03b4;"
+ u:name="GREEK SMALL LETTER DELTA"
+ u:entity="delta"
+ string="\(*d"
+ u:block="Greek and Coptic"
+ />
+ <xsl:output-character
+ character="&#x03b5;"
+ u:name="GREEK SMALL LETTER EPSILON"
+ u:entity="epsi"
+ string="\(*e"
+ u:block="Greek and Coptic"
+ />
+ <xsl:output-character
+ character="&#x03b6;"
+ u:name="GREEK SMALL LETTER ZETA"
+ u:entity="zeta"
+ string="\(*z"
+ u:block="Greek and Coptic"
+ />
+ <xsl:output-character
+ character="&#x03b7;"
+ u:name="GREEK SMALL LETTER ETA"
+ u:entity="eegr"
+ string="\(*y"
+ u:block="Greek and Coptic"
+ />
+ <xsl:output-character
+ character="&#x03b8;"
+ u:name="GREEK SMALL LETTER THETA"
+ u:entity="thetas"
+ string="\(*h"
+ u:block="Greek and Coptic"
+ />
+ <xsl:output-character
+ character="&#x03b9;"
+ u:name="GREEK SMALL LETTER IOTA"
+ u:entity="igr"
+ string="\(*i"
+ u:block="Greek and Coptic"
+ />
+ <xsl:output-character
+ character="&#x03ba;"
+ u:name="GREEK SMALL LETTER KAPPA"
+ u:entity="kappa"
+ string="\(*k"
+ u:block="Greek and Coptic"
+ />
+ <xsl:output-character
+ character="&#x03bb;"
+ u:name="GREEK SMALL LETTER LAMDA"
+ u:entity="lambda"
+ string="\(*l"
+ u:block="Greek and Coptic"
+ />
+ <xsl:output-character
+ character="&#x03bc;"
+ u:name="GREEK SMALL LETTER MU"
+ u:entity="mgr"
+ string="\(*m"
+ u:block="Greek and Coptic"
+ />
+ <xsl:output-character
+ character="&#x03bd;"
+ u:name="GREEK SMALL LETTER NU"
+ u:entity="ngr"
+ string="\(*n"
+ u:block="Greek and Coptic"
+ />
+ <xsl:output-character
+ character="&#x03be;"
+ u:name="GREEK SMALL LETTER XI"
+ u:entity="xgr"
+ string="\(*c"
+ u:block="Greek and Coptic"
+ />
+ <xsl:output-character
+ character="&#x03bf;"
+ u:name="GREEK SMALL LETTER OMICRON"
+ u:entity="ogr"
+ string="\(*o"
+ u:block="Greek and Coptic"
+ />
+ <xsl:output-character
+ character="&#x03c0;"
+ u:name="GREEK SMALL LETTER PI"
+ u:entity="pgr"
+ string="\(*p"
+ u:block="Greek and Coptic"
+ />
+ <xsl:output-character
+ character="&#x03c1;"
+ u:name="GREEK SMALL LETTER RHO"
+ u:entity="rgr"
+ string="\(*r"
+ u:block="Greek and Coptic"
+ />
+ <xsl:output-character
+ character="&#x03c2;"
+ u:name="GREEK SMALL LETTER FINAL SIGMA"
+ u:entity="sfgr"
+ string="\(ts"
+ u:block="Greek and Coptic"
+ />
+ <xsl:output-character
+ character="&#x03c3;"
+ u:name="GREEK SMALL LETTER SIGMA"
+ u:entity="sgr"
+ string="\(*s"
+ u:block="Greek and Coptic"
+ />
+ <xsl:output-character
+ character="&#x03c4;"
+ u:name="GREEK SMALL LETTER TAU"
+ u:entity="tau"
+ string="\(*t"
+ u:block="Greek and Coptic"
+ />
+ <xsl:output-character
+ character="&#x03c5;"
+ u:name="GREEK SMALL LETTER UPSILON"
+ u:entity="ugr"
+ string="\(*u"
+ u:block="Greek and Coptic"
+ />
+ <xsl:output-character
+ character="&#x03c6;"
+ u:name="GREEK SMALL LETTER PHI"
+ u:entity="phgr"
+ string="\(*f"
+ u:block="Greek and Coptic"
+ />
+ <xsl:output-character
+ character="&#x03c7;"
+ u:name="GREEK SMALL LETTER CHI"
+ u:entity="chi"
+ string="\(*x"
+ u:block="Greek and Coptic"
+ />
+ <xsl:output-character
+ character="&#x03c8;"
+ u:name="GREEK SMALL LETTER PSI"
+ u:entity="psgr"
+ string="\(*q"
+ u:block="Greek and Coptic"
+ />
+ <xsl:output-character
+ character="&#x03c9;"
+ u:name="GREEK SMALL LETTER OMEGA"
+ u:entity="ohgr"
+ string="\(*w"
+ u:block="Greek and Coptic"
+ />
+ <xsl:output-character
+ character="&#x03ca;"
+ u:name="GREEK SMALL LETTER IOTA WITH DIALYTIKA"
+ u:entity="idigr"
+ string="\(*i"
+ u:block="Greek and Coptic"
+ />
+ <xsl:output-character
+ character="&#x03cb;"
+ u:name="GREEK SMALL LETTER UPSILON WITH DIALYTIKA"
+ u:entity="udigr"
+ string="\(*u"
+ u:block="Greek and Coptic"
+ />
+ <xsl:output-character
+ character="&#x03cc;"
+ u:name="GREEK SMALL LETTER OMICRON WITH TONOS"
+ u:entity="oacgr"
+ string="\(*o"
+ u:block="Greek and Coptic"
+ />
+ <xsl:output-character
+ character="&#x03cd;"
+ u:name="GREEK SMALL LETTER UPSILON WITH TONOS"
+ u:entity="uacgr"
+ string="\(*u"
+ u:block="Greek and Coptic"
+ />
+ <xsl:output-character
+ character="&#x03ce;"
+ u:name="GREEK SMALL LETTER OMEGA WITH TONOS"
+ u:entity="ohacgr"
+ string="\(*w"
+ u:block="Greek and Coptic"
+ />
+ <xsl:output-character
+ character="&#x03d0;"
+ u:name="GREEK BETA SYMBOL"
+ string="\(*B"
+ u:block="Greek and Coptic"
+ />
+ <xsl:output-character
+ character="&#x03d1;"
+ u:name="GREEK THETA SYMBOL"
+ u:entity="thetav"
+ string="\(+h"
+ u:block="Greek and Coptic"
+ />
+ <xsl:output-character
+ character="&#x03d2;"
+ u:name="GREEK UPSILON WITH HOOK SYMBOL"
+ u:entity="Upsi"
+ string="\(*U"
+ u:block="Greek and Coptic"
+ />
+ <xsl:output-character
+ character="&#x03d3;"
+ u:name="GREEK UPSILON WITH ACUTE AND HOOK SYMBOL"
+ string="\(*U"
+ u:block="Greek and Coptic"
+ />
+ <xsl:output-character
+ character="&#x03d4;"
+ u:name="GREEK UPSILON WITH DIAERESIS AND HOOK SYMBOL"
+ string="\(*U"
+ u:block="Greek and Coptic"
+ />
+ <xsl:output-character
+ character="&#x03d5;"
+ u:name="GREEK PHI SYMBOL"
+ u:entity="phis"
+ string="\(+f"
+ u:block="Greek and Coptic"
+ />
+ <xsl:output-character
+ character="&#x03d6;"
+ u:name="GREEK PI SYMBOL"
+ u:entity="piv"
+ string="\(+p"
+ u:block="Greek and Coptic"
+ />
+ <!-- no mappings for remaining chars x03d7 to x03ef -->
+ <xsl:output-character
+ character="&#x03f0;"
+ u:name="GREEK KAPPA SYMBOL"
+ u:entity="kappav"
+ string="(*k"
+ u:block="Greek and Coptic"
+ />
+ <xsl:output-character
+ character="&#x03f1;"
+ u:name="GREEK RHO SYMBOL"
+ u:entity="rhov"
+ string="\(*r"
+ u:block="Greek and Coptic"
+ />
+ <xsl:output-character
+ character="&#x03f2;"
+ u:name="GREEK LUNATE SIGMA SYMBOL"
+ string="\(*s"
+ u:block="Greek and Coptic"
+ />
+ <xsl:output-character
+ character="&#x03f4;"
+ u:name="GREEK CAPITAL THETA SYMBOL"
+ string="\(*H"
+ u:block="Greek and Coptic"
+ />
+ <xsl:output-character
+ character="&#x03f5;"
+ u:name="GREEK LUNATE EPSILON SYMBOL"
+ string="\(*e"
+ u:block="Greek and Coptic"
+ />
+ <xsl:output-character
+ character="&#x03f6;"
+ u:name="GREEK REVERSED LUNATE EPSILON SYMBOL"
+ u:entity="bepsi"
+ string="\(*e"
+ u:block="Greek and Coptic"
+ />
+
+ <!-- * ***************************************************************** -->
+ <!-- * End: Greek and Coptic -->
+ <!-- * ***************************************************************** -->
+
+ <!-- * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
+ <!-- * Cyrillic -->
+ <!-- * x0400 to x04ff -->
+ <!-- * - do nothing - -->
+ <!-- * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
+
+ <!-- * ***************************************************************** -->
+ <!-- * Begin: General Punctuation -->
+ <!-- * x2000 to x206f -->
+ <!-- * ***************************************************************** -->
+
+ <!-- * first, spaces of various widths -->
+
+ <!-- * Note: There does not seem to be either a real em space or en space -->
+ <!-- * in roff; to approximate them, this character map assumes that in -->
+ <!-- * most fonts, an en space is about the same as the width of a digit -->
+ <!-- * (in roff, "\0"), so an em space (which by definition is -->
+ <!-- * equal to the width of two en spaces) is about the same as the width -->
+ <!-- * of two digits (thus, in roff, "\0\0") -->
+
+ <xsl:output-character
+ character="&#x2000;"
+ u:name="EN QUAD"
+ string="\0"
+ u:block="General Punctuation"
+ u:class="spaces"
+ />
+ <xsl:output-character
+ character="&#x2001;"
+ u:name="EM QUAD"
+ string="\0\0"
+ u:block="General Punctuation"
+ u:class="spaces"
+ />
+ <xsl:output-character
+ character="&#x2002;"
+ u:name="EN SPACE"
+ u:entity="ensp"
+ string="\0"
+ u:block="General Punctuation"
+ u:class="spaces"
+ />
+ <xsl:output-character
+ character="&#x2003;"
+ u:name="EM SPACE"
+ u:entity="emsp"
+ string="\0\0"
+ u:block="General Punctuation"
+ u:class="spaces"
+ />
+ <!-- * roughly same width as a normal space -->
+ <xsl:output-character
+ character="&#x2004;"
+ u:name="THREE-PER-EM SPACE"
+ u:entity="emsp13"
+ string=" "
+ u:block="General Punctuation"
+ u:class="spaces"
+ />
+ <!-- * roughly same width as a normal space -->
+ <xsl:output-character
+ character="&#x2005;"
+ u:name="FOUR-PER-EM SPACE"
+ u:entity="emsp14"
+ string=" "
+ u:block="General Punctuation"
+ u:class="spaces"
+ />
+ <!-- * roughly same width as a normal space -->
+ <xsl:output-character
+ character="&#x2006;"
+ u:name="SIX-PER-EM SPACE"
+ string=" "
+ u:block="General Punctuation"
+ u:class="spaces"
+ />
+ <!-- * same as roff "digit" space -->
+ <xsl:output-character
+ character="&#x2007;"
+ u:name="FIGURE SPACE"
+ u:entity="numsp"
+ string="\0"
+ u:block="General Punctuation"
+ u:class="spaces"
+ />
+ <!-- * punctuation space in most fonts is actually closer to a normal -->
+ <!-- * space than it is to a thin space -->
+ <xsl:output-character
+ character="&#x2008;"
+ u:name="PUNCTUATION SPACE"
+ u:entity="puncsp"
+ string=" "
+ u:block="General Punctuation"
+ u:class="spaces"
+ />
+ <!-- * Note: Not sure how best to deal with thin space, because the roff -->
+ <!-- * thin space, "\^", prints as a zero-width space in TTY -->
+ <!-- * output. However, it seems that, unlike a hair space, a thin space, -->
+ <!-- * at 1/12 of an em, is still recognizable to most people as a space, -->
+ <!-- * so treating it as zero-width seems wrong. So, for the sake of making -->
+ <!-- * TTY output look OK, just substitute with a normal space; but real -->
+ <!-- * roff escape is "\(\^" -->
+ <xsl:output-character
+ character="&#x2009;"
+ u:name="THIN SPACE"
+ u:entity="thinsp"
+ string=" "
+ u:block="General Punctuation"
+ u:class="spaces"
+ />
+ <!-- * I don't think there's a standard definition of what a hair -->
+ <!-- * space is; some guides just say it's "less than 1/5 of an em" or -->
+ <!-- * that it's "narrower than a thin space"; seems like in practice, -->
+ <!-- * it's *a lot* narrower than a thin space, to the point where -->
+ <!-- * it's close to being a non-space, so here it's substituted with -->
+ <!-- * roff equivalent of a zero-width no-break space -->
+ <xsl:output-character
+ character="&#x200a;"
+ u:name="HAIR SPACE"
+ u:entity="hairsp"
+ string="\&amp;"
+ u:block="General Punctuation"
+ u:class="spaces"
+ />
+ <!-- * map to roff "zero-width break point" -->
+ <xsl:output-character
+ character="&#x200b;"
+ u:name="ZERO WIDTH SPACE"
+ string="\:"
+ u:block="General Punctuation"
+ u:class="spaces"
+ />
+
+ <!-- * x200c and x200d have special purposes in some Indic languages (I -->
+ <!-- * think); for the "correct" zero-width space, according to Unicode docs, -->
+ <!-- * use x2060, not x200c or x200d -->
+ <!-- * <xsl:output-character -->
+ <!-- * character="&#x200c;" -->
+ <!-- * u:name="ZERO WIDTH NON-JOINER" -->
+ <!-- * string="\:" -->
+ <!-- * /> -->
+ <!-- * <xsl:output-character -->
+ <!-- * character="&#x200d;" -->
+ <!-- * u:name="ZERO WIDTH JOINER" -->
+ <!-- * string="\&amp;" -->
+ <!-- * /> -->
+ <!-- * non-visible -->
+ <!-- * <xsl:output-character -->
+ <!-- * character="&#x200e;" -->
+ <!-- * u:name="LEFT-TO-RIGHT MARK" -->
+ <!-- * /> -->
+ <!-- * <xsl:output-character -->
+ <!-- * character="&#x200f;" -->
+ <!-- * u:name="RIGHT-TO-LEFT MARK" -->
+ <!-- * /> -->
+
+ <!-- * .................................................... -->
+ <!-- * next, hyphens and various dashes, bars, underscores -->
+ <xsl:output-character
+ character="&#x2010;"
+ u:name="HYPHEN"
+ u:entity="hyphen"
+ string="\(hy"
+ u:block="General Punctuation"
+ u:class="dashes"
+ />
+ <!-- * although the groff docs do not make it clear, testing -->
+ <!-- * indicates that the only reliable way to make a non-breaking -->
+ <!-- * hyphen is to put just a backslash in front of it. -->
+ <!-- * -->
+ <!-- * based on testing, it also appears that no character is needed -->
+ <!-- * after the hyphen in order to make it non-breaking -->
+ <xsl:output-character
+ character="&#x2011;"
+ u:name="NON-BREAKING HYPHEN"
+ string="\-"
+ u:block="General Punctuation"
+ u:class="dashes"
+ />
+ <!-- * roughly same width as en dash -->
+ <xsl:output-character
+ character="&#x2012;"
+ u:name="FIGURE DASH"
+ string="\(en"
+ u:block="General Punctuation"
+ u:class="dashes"
+ />
+ <xsl:output-character
+ character="&#x2013;"
+ u:name="EN DASH"
+ u:entity="ndash"
+ string="\(en"
+ u:block="General Punctuation"
+ u:class="dashes"
+ />
+ <xsl:output-character
+ character="&#x2014;"
+ u:name="EM DASH"
+ u:entity="mdash"
+ string="\(em"
+ u:block="General Punctuation"
+ u:class="dashes"
+ />
+ <!-- * seems roughly same width as em dash -->
+ <xsl:output-character
+ character="&#x2015;"
+ u:name="HORIZONTAL BAR"
+ u:entity="horbar"
+ string="\(em"
+ u:block="General Punctuation"
+ u:class="dashes"
+ />
+ <xsl:output-character
+ character="&#x2016;"
+ u:name="DOUBLE VERTICAL LINE"
+ u:entity="Verbar"
+ string="\(bv\(bv"
+ u:block="General Punctuation"
+ />
+ <!-- * no double-underscore in roff; so just make it a single -->
+ <!-- * underscore -->
+ <xsl:output-character
+ character="&#x2017;"
+ u:name="DOUBLE LOW LINE"
+ string="_"
+ u:block="General Punctuation"
+ />
+
+ <!-- * .................................................... -->
+ <!-- * various quotation marks -->
+ <xsl:output-character
+ character="&#x2018;"
+ u:name="LEFT SINGLE QUOTATION MARK"
+ u:entity="lsquo"
+ string="\(oq"
+ u:block="General Punctuation"
+ u:class="quotes"
+ />
+ <xsl:output-character
+ character="&#x2019;"
+ u:name="RIGHT SINGLE QUOTATION MARK"
+ u:entity="rsquo"
+ string="\(cq"
+ u:block="General Punctuation"
+ u:class="quotes"
+ />
+ <xsl:output-character
+ character="&#x201a;"
+ u:name="SINGLE LOW-9 QUOTATION MARK"
+ u:entity="lsquor"
+ string="\(bq"
+ u:block="General Punctuation"
+ u:class="quotes"
+ />
+ <!-- * no roff equiv; treat same as lsquo -->
+ <xsl:output-character
+ character="&#x201b;"
+ u:name="SINGLE HIGH-REVERSED-9 QUOTATION MARK"
+ string="\(oq"
+ u:block="General Punctuation"
+ u:class="quotes"
+ />
+ <xsl:output-character
+ character="&#x201c;"
+ u:name="LEFT DOUBLE QUOTATION MARK"
+ u:entity="ldquo"
+ string="\(lq"
+ u:block="General Punctuation"
+ u:class="quotes"
+ />
+ <xsl:output-character
+ character="&#x201d;"
+ u:name="RIGHT DOUBLE QUOTATION MARK"
+ u:entity="rdquo"
+ string="\(rq"
+ u:block="General Punctuation"
+ u:class="quotes"
+ />
+ <xsl:output-character
+ character="&#x201e;"
+ u:name="DOUBLE LOW-9 QUOTATION MARK"
+ u:entity="ldquor"
+ string="\(Bq"
+ u:block="General Punctuation"
+ u:class="quotes"
+ />
+ <!-- * no roff equiv; treat same as rdquo -->
+ <xsl:output-character
+ character="&#x201f;"
+ u:name="DOUBLE HIGH-REVERSED-9 QUOTATION MARK"
+ string="\(rq"
+ u:block="General Punctuation"
+ u:class="quotes"
+ />
+
+ <!-- * .................................................... -->
+ <!-- * various symbols -->
+ <xsl:output-character
+ character="&#x2020;"
+ u:name="DAGGER"
+ u:entity="dagger"
+ string="\(dg"
+ u:block="General Punctuation_daggers"
+ />
+ <xsl:output-character
+ character="&#x2021;"
+ u:name="DOUBLE DAGGER"
+ u:entity="Dagger"
+ string="\(dd"
+ u:block="General Punctuation_daggers"
+ />
+ <xsl:output-character
+ character="&#x2022;"
+ u:name="BULLET"
+ u:entity="bull"
+ string="\(bu"
+ u:block="General Punctuation"
+ u:class="bullets"
+ />
+ <!-- * no roff equiv -->
+ <xsl:output-character
+ character="&#x2023;"
+ u:name="TRIANGULAR BULLET"
+ string=">\&amp;"
+ u:block="General Punctuation"
+ u:class="bullets"
+ />
+ <!-- * no roff equiv -->
+ <xsl:output-character
+ character="&#x2024;"
+ u:name="ONE DOT LEADER"
+ string="\&amp;."
+ u:block="General Punctuation_leaders"
+ />
+ <!-- * no roff equiv -->
+ <xsl:output-character
+ character="&#x2025;"
+ u:name="TWO DOT LEADER"
+ u:entity="nldr"
+ string="\&amp;.."
+ u:block="General Punctuation_leaders"
+ />
+ <!-- * no roff equiv -->
+ <xsl:output-character
+ character="&#x2026;"
+ u:name="HORIZONTAL ELLIPSIS"
+ u:entity="hellip"
+ string="\&amp;..."
+ u:block="General Punctuation"
+ />
+ <!-- what is "hyphenation point" used for? looks like middot to me... -->
+ <xsl:output-character
+ character="&#x2027;"
+ u:name="HYPHENATION POINT"
+ string="\(md"
+ u:block="General Punctuation"
+ />
+ <!-- * Begin x2028 to x202e - no idea what to do with these -->
+ <!-- * <xsl:output-character -->
+ <!-- * character="&#x2028;" -->
+ <!-- * u:name="LINE SEPARATOR" -->
+ <!-- * /> -->
+ <!-- * <xsl:output-character -->
+ <!-- * character="&#x2029;" -->
+ <!-- * u:name="PARAGRAPH SEPARATOR" -->
+ <!-- * /> -->
+ <!-- * <xsl:output-character -->
+ <!-- * character="&#x202a;" -->
+ <!-- * u:name="LEFT-TO-RIGHT EMBEDDING" -->
+ <!-- * /> -->
+ <!-- * <xsl:output-character -->
+ <!-- * character="&#x202b;" -->
+ <!-- * u:name="RIGHT-TO-LEFT EMBEDDING" -->
+ <!-- * /> -->
+ <!-- * <xsl:output-character -->
+ <!-- * character="&#x202c;" -->
+ <!-- * u:name="POP DIRECTIONAL FORMATTING" -->
+ <!-- * /> -->
+ <!-- * <xsl:output-character -->
+ <!-- * character="&#x202d;" -->
+ <!-- * u:name="LEFT-TO-RIGHT OVERRIDE" -->
+ <!-- * /> -->
+ <!-- * <xsl:output-character -->
+ <!-- * character="&#x202e;" -->
+ <!-- * u:name="RIGHT-TO-LEFT OVERRIDE" -->
+ <!-- * /> -->
+ <!-- * End x2028 to x202e - no idea what to do with these -->
+
+ <!-- * seems like "narrow" nbsp is basically the same as a no-break -->
+ <!-- * space -->
+ <xsl:output-character
+ character="&#x202f;"
+ u:name="NARROW NO-BREAK SPACE"
+ string="\ "
+ u:block="General Punctuation"
+ u:class="spaces"
+ />
+ <xsl:output-character
+ character="&#x2030;"
+ u:name="PER MILLE SIGN"
+ u:entity="permil"
+ string="\(%0"
+ u:block="General Punctuation"
+ />
+ <!-- * no roff equiv; no idea what to do with it -->
+ <!-- * <xsl:output-character -->
+ <!-- * character="&#x2031;" -->
+ <!-- * u:name="PER TEN THOUSAND SIGN" -->
+ <!-- * /> -->
+ <xsl:output-character
+ character="&#x2032;"
+ u:name="PRIME"
+ u:entity="prime"
+ string="\(fm"
+ u:block="General Punctuation"
+ u:class="primes"
+ />
+ <xsl:output-character
+ character="&#x2033;"
+ u:name="DOUBLE PRIME"
+ u:entity="Prime"
+ string="\(sd"
+ u:block="General Punctuation"
+ u:class="primes"
+ />
+ <xsl:output-character
+ character="&#x2034;"
+ u:name="TRIPLE PRIME"
+ u:entity="tprime"
+ string="\(sd\(fm"
+ u:block="General Punctuation"
+ u:class="primes"
+ />
+ <!-- * no idea for these -->
+ <!-- * <xsl:output-character -->
+ <!-- * character="&#x2035;" -->
+ <!-- * u:name="REVERSED PRIME" -->
+ <!-- * u:entity="bprime" -->
+ <!-- * /> -->
+ <!-- * <xsl:output-character -->
+ <!-- * character="&#x2036;" -->
+ <!-- * u:name="REVERSED DOUBLE PRIME" -->
+ <!-- * /> -->
+ <!-- * <xsl:output-character -->
+ <!-- * character="&#x2037;" -->
+ <!-- * u:name="REVERSED TRIPLE PRIME" -->
+ <!-- * /> -->
+
+ <!-- * there is no low caret in roff -->
+ <xsl:output-character
+ character="&#x2038;"
+ u:name="CARET"
+ string="^"
+ u:block="General Punctuation"
+ />
+ <xsl:output-character
+ character="&#x2039;"
+ u:name="SINGLE LEFT-POINTING ANGLE QUOTATION MARK"
+ string="\(fo"
+ u:block="General Punctuation"
+ u:class="quotes"
+ />
+ <xsl:output-character
+ character="&#x203a;"
+ u:name="SINGLE RIGHT-POINTING ANGLE QUOTATION MARK"
+ string="\(fc"
+ u:block="General Punctuation"
+ u:class="quotes"
+ />
+ <!-- * not in roff -->
+ <xsl:output-character
+ character="&#x203b;"
+ u:name="REFERENCE MARK"
+ string="*"
+ u:block="General Punctuation"
+ />
+ <xsl:output-character
+ character="&#x203c;"
+ u:name="DOUBLE EXCLAMATION MARK"
+ string="!!"
+ u:block="General Punctuation"
+ />
+ <xsl:output-character
+ character="&#x203d;"
+ u:name="INTERROBANG"
+ string="?!"
+ u:block="General Punctuation"
+ />
+ <xsl:output-character
+ character="&#x203e;"
+ u:name="OVERLINE"
+ string="\(rn"
+ u:block="General Punctuation"
+ />
+ <xsl:output-character
+ character="&#x203f;"
+ u:name="UNDERTIE"
+ string="\(ul"
+ u:block="General Punctuation"
+ />
+ <!-- * not in roff -->
+ <xsl:output-character
+ character="&#x2040;"
+ u:name="CHARACTER TIE"
+ string="\(rn"
+ u:block="General Punctuation"
+ />
+ <!-- * not in roff -->
+ <xsl:output-character
+ character="&#x2041;"
+ u:name="CARET INSERTION POINT"
+ u:entity="caret"
+ string="^"
+ u:block="General Punctuation"
+ />
+ <!-- * not in roff -->
+ <xsl:output-character
+ character="&#x2042;"
+ u:name="ASTERISM"
+ string="*"
+ u:block="General Punctuation"
+ />
+ <!-- * not in roff; just make bold hyphen -->
+ <xsl:output-character
+ character="&#x2043;"
+ u:name="HYPHEN BULLET"
+ u:entity="hybull"
+ string="\fB-\fR"
+ u:block="General Punctuation"
+ u:class="bullets"
+ />
+ <xsl:output-character
+ character="&#x2044;"
+ u:name="FRACTION SLASH"
+ string="\(sl"
+ u:block="General Punctuation"
+ />
+ <!-- * not in roff -->
+ <xsl:output-character
+ character="&#x2045;"
+ u:name="LEFT SQUARE BRACKET WITH QUILL"
+ string="["
+ u:block="General Punctuation"
+ />
+ <!-- * not in roff -->
+ <xsl:output-character
+ character="&#x2046;"
+ u:name="RIGHT SQUARE BRACKET WITH QUILL"
+ string="]"
+ u:block="General Punctuation"
+ />
+ <xsl:output-character
+ character="&#x2047;"
+ u:name="DOUBLE QUESTION MARK"
+ string="??"
+ u:block="General Punctuation"
+ />
+ <xsl:output-character
+ character="&#x2048;"
+ u:name="QUESTION EXCLAMATION MARK"
+ string="?!"
+ u:block="General Punctuation"
+ />
+ <xsl:output-character
+ character="&#x2049;"
+ u:name="EXCLAMATION QUESTION MARK"
+ string="!?"
+ u:block="General Punctuation"
+ />
+ <!-- * not in roff -->
+ <xsl:output-character
+ character="&#x204a;"
+ u:name="TIRONIAN SIGN ET"
+ string="7"
+ u:block="General Punctuation"
+ />
+ <!-- * not in roff; just replace with un-reversed pilcrow -->
+ <xsl:output-character
+ character="&#x204b;"
+ u:name="REVERSED PILCROW SIGN"
+ string="\(ps"
+ u:block="General Punctuation"
+ />
+ <!-- * not in roff; just make regular bullet -->
+ <xsl:output-character
+ character="&#x204c;"
+ u:name="BLACK LEFTWARDS BULLET"
+ string="\(bu"
+ u:block="General Punctuation"
+ />
+ <!-- * not in roff; just make regular bullet -->
+ <xsl:output-character
+ character="&#x204d;"
+ u:name="BLACK RIGHTWARDS BULLET"
+ string="\(bu"
+ u:block="General Punctuation"
+ />
+ <xsl:output-character
+ character="&#x204e;"
+ u:name="LOW ASTERISK"
+ string="*"
+ u:block="General Punctuation"
+ />
+
+ <!-- * ............................................................... -->
+ <!-- * Remaining General Punctuation -->
+ <!-- * from x2050 to x206f -->
+ <!-- * only map a couple of these -->
+ <!-- * ............................................................... -->
+
+ <!-- * basically same as a normal space -->
+ <xsl:output-character
+ character="&#x205f;"
+ u:name="MEDIUM MATHEMATICAL SPACE"
+ string=" "
+ u:block="General Punctuation"
+ u:class="spaces"
+ />
+ <!-- * Regarding x2060 vs. xFEFF, the document "Unicode Standard Annex #14, -->
+ <!-- * Line Breaking Properties"[1] says: -->
+ <!-- * -->
+ <!-- * The word joiner character [x2060 a.k.a "WJ"] is the preferred -->
+ <!-- * choice for an invisible character to keep other characters -->
+ <!-- * together that would otherwise be split across the line at a direct -->
+ <!-- * break. The character FEFF has the same effect, but because it is -->
+ <!-- * also used in an unrelated way as a byte order mark, the use of the -->
+ <!-- * WJ as the preferred interword glue simplifies the handling of FEFF. -->
+ <!-- * -->
+ <!-- * [1] http://www.unicode.org/reports/tr14/ -->
+ <!-- * -->
+ <!-- * The groff docs seem ambiguous about whether \& is a joiner and -->
+ <!-- * prevents breaks, but, based on testing, seems like it does -->
+ <xsl:output-character
+ character="&#x2060;"
+ u:name="WORD JOINER"
+ string="\&amp;"
+ u:block="General Punctuation"
+ />
+
+ <!-- * ***************************************************************** -->
+ <!-- * End: General Punctuation -->
+ <!-- * ***************************************************************** -->
+
+ <!-- * ***************************************************************** -->
+ <!-- * Begin: Superscripts and Subscripts -->
+ <!-- * x2070 to x209f -->
+ <!-- * For superscripts, just do a^n thing -->
+ <!-- * For subscripts, just do a_n -->
+ <!-- * ***************************************************************** -->
+
+ <xsl:output-character
+ character="&#x2070;"
+ u:name="SUPERSCRIPT ZERO"
+ string="^0"
+ u:block="Superscripts and Subscripts"
+ />
+ <xsl:output-character
+ character="&#x2071;"
+ u:name="SUPERSCRIPT LATIN SMALL LETTER I"
+ string="^i"
+ u:block="Superscripts and Subscripts"
+ />
+ <xsl:output-character
+ character="&#x2074;"
+ u:name="SUPERSCRIPT FOUR"
+ string="^4"
+ u:block="Superscripts and Subscripts"
+ />
+ <xsl:output-character
+ character="&#x2075;"
+ u:name="SUPERSCRIPT FIVE"
+ string="^5"
+ u:block="Superscripts and Subscripts"
+ />
+ <xsl:output-character
+ character="&#x2076;"
+ u:name="SUPERSCRIPT SIX"
+ string="^6"
+ u:block="Superscripts and Subscripts"
+ />
+ <xsl:output-character
+ character="&#x2077;"
+ u:name="SUPERSCRIPT SEVEN"
+ string="^7"
+ u:block="Superscripts and Subscripts"
+ />
+ <xsl:output-character
+ character="&#x2078;"
+ u:name="SUPERSCRIPT EIGHT"
+ string="^8"
+ u:block="Superscripts and Subscripts"
+ />
+ <xsl:output-character
+ character="&#x2079;"
+ u:name="SUPERSCRIPT NINE"
+ string="^9"
+ u:block="Superscripts and Subscripts"
+ />
+ <xsl:output-character
+ character="&#x207a;"
+ u:name="SUPERSCRIPT PLUS SIGN"
+ string="^+"
+ u:block="Superscripts and Subscripts"
+ />
+ <xsl:output-character
+ character="&#x207b;"
+ u:name="SUPERSCRIPT MINUS"
+ string="^-"
+ u:block="Superscripts and Subscripts"
+ />
+ <xsl:output-character
+ character="&#x207c;"
+ u:name="SUPERSCRIPT EQUALS SIGN"
+ string="^="
+ u:block="Superscripts and Subscripts"
+ />
+ <xsl:output-character
+ character="&#x207d;"
+ u:name="SUPERSCRIPT LEFT PARENTHESIS"
+ string="^("
+ u:block="Superscripts and Subscripts"
+ />
+ <xsl:output-character
+ character="&#x207e;"
+ u:name="SUPERSCRIPT RIGHT PARENTHESIS"
+ string="^)"
+ u:block="Superscripts and Subscripts"
+ />
+ <xsl:output-character
+ character="&#x207f;"
+ u:name="SUPERSCRIPT LATIN SMALL LETTER N"
+ string="^n"
+ u:block="Superscripts and Subscripts"
+ />
+ <xsl:output-character
+ character="&#x2080;"
+ u:name="SUBSCRIPT ZERO"
+ string="_0"
+ u:block="Superscripts and Subscripts"
+ />
+ <xsl:output-character
+ character="&#x2081;"
+ u:name="SUBSCRIPT ONE"
+ string="_1"
+ u:block="Superscripts and Subscripts"
+ />
+ <xsl:output-character
+ character="&#x2082;"
+ u:name="SUBSCRIPT TWO"
+ string="_2"
+ u:block="Superscripts and Subscripts"
+ />
+ <xsl:output-character
+ character="&#x2083;"
+ u:name="SUBSCRIPT THREE"
+ string="_3"
+ u:block="Superscripts and Subscripts"
+ />
+ <xsl:output-character
+ character="&#x2084;"
+ u:name="SUBSCRIPT FOUR"
+ string="_4"
+ u:block="Superscripts and Subscripts"
+ />
+ <xsl:output-character
+ character="&#x2085;"
+ u:name="SUBSCRIPT FIVE"
+ string="_5"
+ u:block="Superscripts and Subscripts"
+ />
+ <xsl:output-character
+ character="&#x2086;"
+ u:name="SUBSCRIPT SIX"
+ string="_6"
+ u:block="Superscripts and Subscripts"
+ />
+ <xsl:output-character
+ character="&#x2087;"
+ u:name="SUBSCRIPT SEVEN"
+ string="_7"
+ u:block="Superscripts and Subscripts"
+ />
+ <xsl:output-character
+ character="&#x2088;"
+ u:name="SUBSCRIPT EIGHT"
+ string="_8"
+ u:block="Superscripts and Subscripts"
+ />
+ <xsl:output-character
+ character="&#x2089;"
+ u:name="SUBSCRIPT NINE"
+ string="_9"
+ u:block="Superscripts and Subscripts"
+ />
+ <xsl:output-character
+ character="&#x208a;"
+ u:name="SUBSCRIPT PLUS SIGN"
+ string="_+"
+ u:block="Superscripts and Subscripts"
+ />
+ <xsl:output-character
+ character="&#x208b;"
+ u:name="SUBSCRIPT MINUS"
+ string="_-"
+ u:block="Superscripts and Subscripts"
+ />
+ <xsl:output-character
+ character="&#x208c;"
+ u:name="SUBSCRIPT EQUALS SIGN"
+ string="_="
+ u:block="Superscripts and Subscripts"
+ />
+ <xsl:output-character
+ character="&#x208d;"
+ u:name="SUBSCRIPT LEFT PARENTHESIS"
+ string="_("
+ u:block="Superscripts and Subscripts"
+ />
+ <xsl:output-character
+ character="&#x208e;"
+ u:name="SUBSCRIPT RIGHT PARENTHESIS"
+ string="_)"
+ u:block="Superscripts and Subscripts"
+ />
+ <!-- * ***************************************************************** -->
+ <!-- * End: Superscripts and Subscripts -->
+ <!-- * x2070 to x209f -->
+ <!-- * ***************************************************************** -->
+
+ <!-- * ***************************************************************** -->
+ <!-- * Begin: Currency Symbols -->
+ <!-- * x20a0 to x20b1 -->
+ <!-- * No mappings for any of these; just spell out -->
+ <!-- * ***************************************************************** -->
+
+ <xsl:output-character
+ character="&#x20a0;"
+ u:name="EURO-CURRENCY SIGN"
+ string="EUR"
+ u:block="Currency Symbols"
+ />
+ <xsl:output-character
+ character="&#x20a1;"
+ u:name="COLON SIGN"
+ string="COLON"
+ u:block="Currency Symbols"
+ />
+ <xsl:output-character
+ character="&#x20a2;"
+ u:name="CRUZEIRO SIGN"
+ string="CRUZEIRO"
+ u:block="Currency Symbols"
+ />
+ <xsl:output-character
+ character="&#x20a3;"
+ u:name="FRENCH FRANC SIGN"
+ string="FRANC"
+ u:block="Currency Symbols"
+ />
+ <xsl:output-character
+ character="&#x20a4;"
+ u:name="LIRA SIGN"
+ string="LIRA"
+ u:block="Currency Symbols"
+ />
+ <xsl:output-character
+ character="&#x20a5;"
+ u:name="MILL SIGN"
+ string="MILL"
+ u:block="Currency Symbols"
+ />
+ <xsl:output-character
+ character="&#x20a6;"
+ u:name="NAIRA SIGN"
+ string="NAIRA"
+ u:block="Currency Symbols"
+ />
+ <xsl:output-character
+ character="&#x20a7;"
+ u:name="PESETA SIGN"
+ string="PESETA"
+ u:block="Currency Symbols"
+ />
+ <xsl:output-character
+ character="&#x20a8;"
+ u:name="RUPEE SIGN"
+ string="RUPEE"
+ u:block="Currency Symbols"
+ />
+ <xsl:output-character
+ character="&#x20a9;"
+ u:name="WON SIGN"
+ string="WON"
+ u:block="Currency Symbols"
+ />
+ <xsl:output-character
+ character="&#x20aa;"
+ u:name="NEW SHEQEL SIGN"
+ string="SHEQEL"
+ u:block="Currency Symbols"
+ />
+ <xsl:output-character
+ character="&#x20ab;"
+ u:name="DONG SIGN"
+ string="DONG"
+ u:block="Currency Symbols"
+ />
+ <xsl:output-character
+ character="&#x20ac;"
+ u:name="EURO SIGN"
+ string="EUR"
+ u:block="Currency Symbols"
+ />
+ <xsl:output-character
+ character="&#x20ad;"
+ u:name="KIP SIGN"
+ string="KIP"
+ u:block="Currency Symbols"
+ />
+ <xsl:output-character
+ character="&#x20ae;"
+ u:name="TUGRIK SIGN"
+ string="TUGRIK"
+ u:block="Currency Symbols"
+ />
+ <xsl:output-character
+ character="&#x20af;"
+ u:name="DRACHMA SIGN"
+ string="DRACHMA"
+ u:block="Currency Symbols"
+ />
+ <!-- <xsl:output-character -->
+ <!-- character="&#x20b0;" -->
+ <!-- u:name="GERMAN PENNY SIGN" -->
+ <!-- string="?" -->
+ <!-- u:block="Currency Symbols" -->
+ <!-- /> -->
+ <xsl:output-character
+ character="&#x20b1;"
+ u:name="PESO SIGN"
+ string="PESO"
+ u:block="Currency Symbols"
+ />
+
+ <!-- * ***************************************************************** -->
+ <!-- * End: Currency Symbols -->
+ <!-- * x20a0 to x20b1 -->
+ <!-- * ***************************************************************** -->
+
+ <!-- * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
+ <!-- * Combining Diacritical Marks for Symbols -->
+ <!-- * x20d0 to x20ff -->
+ <!-- * - do nothing - -->
+ <!-- * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
+
+ <!-- * ***************************************************************** -->
+ <!-- * Begin: Letterlike Symbols -->
+ <!-- * x2100 to x214b -->
+ <!-- * -->
+ <!-- * No mappings for any of these, and nothing appropriate for -->
+ <!-- * most of them; so, just spell out the ones that we can -->
+ <!-- * ***************************************************************** -->
+
+ <xsl:output-character
+ character="&#x2103;"
+ u:name="DEGREE CELSIUS"
+ string="\(deC"
+ u:block="Letterlike Symbols"
+ />
+ <xsl:output-character
+ character="&#x2105;"
+ u:name="CARE OF"
+ u:entity="incare"
+ string="c/o"
+ u:block="Letterlike Symbols"
+ />
+ <xsl:output-character
+ character="&#x2109;"
+ u:name="DEGREE FAHRENHEIT"
+ string="\(deF"
+ u:block="Letterlike Symbols"
+ />
+ <!-- roff Ifraktur -->
+ <xsl:output-character
+ character="&#x2111;"
+ u:name="BLACK-LETTER CAPITAL I"
+ string="\(Im"
+ u:block="Letterlike Symbols"
+ />
+ <xsl:output-character
+ character="&#x2113;"
+ u:name="SCRIPT SMALL L"
+ u:entity="ell"
+ string="l"
+ u:block="Letterlike Symbols"
+ />
+ <xsl:output-character
+ character="&#x2116;"
+ u:name="NUMERO SIGN"
+ u:entity="numero"
+ string="No."
+ u:block="Letterlike Symbols"
+ />
+ <xsl:output-character
+ character="&#x2118;"
+ u:name="SCRIPT CAPITAL P"
+ u:entity="weierp"
+ string="\(wp"
+ u:block="Letterlike Symbols"
+ />
+ <xsl:output-character
+ character="&#x211c;"
+ u:name="BLACK-LETTER CAPITAL R"
+ u:entity="real"
+ string="\(Re"
+ u:block="Letterlike Symbols"
+ />
+ <xsl:output-character
+ character="&#x211e;"
+ u:name="PRESCRIPTION TAKE"
+ u:entity="rx"
+ string="Rx"
+ u:block="Letterlike Symbols"
+ />
+ <xsl:output-character
+ character="&#x2120;"
+ u:name="SERVICE MARK"
+ string="(SM)"
+ u:block="Letterlike Symbols"
+ />
+ <!-- * We don't do "\(tm" for &#x2122; because for console output, groff -->
+ <!-- * just renders that as "tm", without any preceding space, parens, -->
+ <!-- * or anything. So it just gets run into the preceding word; i.e.: -->
+ <!-- * -->
+ <!-- * Product&#x2122; -> Producttm -->
+ <!-- * -->
+ <!-- * That it probably not what most people would want. So we just -->
+ <!-- * render it as (TM) instead, Thus: -->
+ <!-- * -->
+ <!-- * Product&#x2122; -> Product(TM) -->
+ <xsl:output-character
+ character="&#x2122;"
+ u:name="TRADE MARK SIGN"
+ u:entity="trade"
+ string="(TM)"
+ u:block="Letterlike Symbols"
+ />
+ <xsl:output-character
+ character="&#x2126;"
+ u:name="OHM SIGN"
+ u:entity="ohm"
+ string="\(*W"
+ u:block="Letterlike Symbols"
+ />
+ <xsl:output-character
+ character="&#x212a;"
+ u:name="KELVIN SIGN"
+ string="K"
+ u:block="Letterlike Symbols"
+ />
+ <xsl:output-character
+ character="&#x212b;"
+ u:name="ANGSTROM SIGN"
+ u:entity="angst"
+ string="\(oA"
+ u:block="Letterlike Symbols"
+ />
+ <xsl:output-character
+ character="&#x2135;"
+ u:name="ALEF SYMBOL"
+ u:entity="aleph"
+ string="\(Ah"
+ u:block="Letterlike Symbols"
+ />
+
+ <!-- * ***************************************************************** -->
+ <!-- * End: Letterlike Symbols -->
+ <!-- * x2100 to x214b -->
+ <!-- * ***************************************************************** -->
+
+ <!-- * ***************************************************************** -->
+ <!-- * Begin: Number Forms -->
+ <!-- * x2150 to x218f -->
+ <!-- * -->
+ <!-- * No mappings for any of these, and nothing appropriate for most -->
+ <!-- * of them; so, just spell out the ones that we can -->
+ <!-- * ***************************************************************** -->
+
+ <xsl:output-character
+ character="&#x2153;"
+ u:name="VULGAR FRACTION ONE THIRD"
+ u:entity="frac13"
+ string="1/3"
+ u:block="Number Forms"
+ />
+ <xsl:output-character
+ character="&#x2154;"
+ u:name="VULGAR FRACTION TWO THIRDS"
+ u:entity="frac23"
+ string="2/3"
+ u:block="Number Forms"
+ />
+ <xsl:output-character
+ character="&#x2155;"
+ u:name="VULGAR FRACTION ONE FIFTH"
+ u:entity="frac15"
+ string="1/5"
+ u:block="Number Forms"
+ />
+ <xsl:output-character
+ character="&#x2156;"
+ u:name="VULGAR FRACTION TWO FIFTHS"
+ u:entity="frac25"
+ string="2/5"
+ u:block="Number Forms"
+ />
+ <xsl:output-character
+ character="&#x2157;"
+ u:name="VULGAR FRACTION THREE FIFTHS"
+ u:entity="frac35"
+ string="3/5"
+ u:block="Number Forms"
+ />
+ <xsl:output-character
+ character="&#x2158;"
+ u:name="VULGAR FRACTION FOUR FIFTHS"
+ u:entity="frac45"
+ string="4/5"
+ u:block="Number Forms"
+ />
+ <xsl:output-character
+ character="&#x2159;"
+ u:name="VULGAR FRACTION ONE SIXTH"
+ u:entity="frac16"
+ string="1/6"
+ u:block="Number Forms"
+ />
+ <xsl:output-character
+ character="&#x215a;"
+ u:name="VULGAR FRACTION FIVE SIXTHS"
+ u:entity="frac56"
+ string="5/6"
+ u:block="Number Forms"
+ />
+ <xsl:output-character
+ character="&#x215b;"
+ u:name="VULGAR FRACTION ONE EIGHTH"
+ u:entity="frac18"
+ string="1/8"
+ u:block="Number Forms"
+ />
+ <xsl:output-character
+ character="&#x215c;"
+ u:name="VULGAR FRACTION THREE EIGHTHS"
+ u:entity="frac38"
+ string="3/8"
+ u:block="Number Forms"
+ />
+ <xsl:output-character
+ character="&#x215d;"
+ u:name="VULGAR FRACTION FIVE EIGHTHS"
+ u:entity="frac58"
+ string="5/8"
+ u:block="Number Forms"
+ />
+ <xsl:output-character
+ character="&#x215e;"
+ u:name="VULGAR FRACTION SEVEN EIGHTHS"
+ u:entity="frac78"
+ string="7/8"
+ u:block="Number Forms"
+ />
+ <xsl:output-character
+ character="&#x215f;"
+ u:name="FRACTION NUMERATOR ONE"
+ string="1/"
+ u:block="Number Forms"
+ />
+ <xsl:output-character
+ character="&#x2160;"
+ u:name="ROMAN NUMERAL ONE"
+ string="I"
+ u:block="Number Forms"
+ />
+ <xsl:output-character
+ character="&#x2161;"
+ u:name="ROMAN NUMERAL TWO"
+ string="II"
+ u:block="Number Forms"
+ />
+ <xsl:output-character
+ character="&#x2162;"
+ u:name="ROMAN NUMERAL THREE"
+ string="III"
+ u:block="Number Forms"
+ />
+ <xsl:output-character
+ character="&#x2163;"
+ u:name="ROMAN NUMERAL FOUR"
+ string="IV"
+ u:block="Number Forms"
+ />
+ <xsl:output-character
+ character="&#x2164;"
+ u:name="ROMAN NUMERAL FIVE"
+ string="V"
+ u:block="Number Forms"
+ />
+ <xsl:output-character
+ character="&#x2165;"
+ u:name="ROMAN NUMERAL SIX"
+ string="VI"
+ u:block="Number Forms"
+ />
+ <xsl:output-character
+ character="&#x2166;"
+ u:name="ROMAN NUMERAL SEVEN"
+ string="VII"
+ u:block="Number Forms"
+ />
+ <xsl:output-character
+ character="&#x2167;"
+ u:name="ROMAN NUMERAL EIGHT"
+ string="VIII"
+ u:block="Number Forms"
+ />
+ <xsl:output-character
+ character="&#x2168;"
+ u:name="ROMAN NUMERAL NINE"
+ string="IX"
+ u:block="Number Forms"
+ />
+ <xsl:output-character
+ character="&#x2169;"
+ u:name="ROMAN NUMERAL TEN"
+ string="X"
+ u:block="Number Forms"
+ />
+ <xsl:output-character
+ character="&#x216a;"
+ u:name="ROMAN NUMERAL ELEVEN"
+ string="XI"
+ u:block="Number Forms"
+ />
+ <xsl:output-character
+ character="&#x216b;"
+ u:name="ROMAN NUMERAL TWELVE"
+ string="XII"
+ u:block="Number Forms"
+ />
+ <xsl:output-character
+ character="&#x216c;"
+ u:name="ROMAN NUMERAL FIFTY"
+ string="L"
+ u:block="Number Forms"
+ />
+ <xsl:output-character
+ character="&#x216d;"
+ u:name="ROMAN NUMERAL ONE HUNDRED"
+ string="C"
+ u:block="Number Forms"
+ />
+ <xsl:output-character
+ character="&#x216e;"
+ u:name="ROMAN NUMERAL FIVE HUNDRED"
+ string="D"
+ u:block="Number Forms"
+ />
+ <xsl:output-character
+ character="&#x216f;"
+ u:name="ROMAN NUMERAL ONE THOUSAND"
+ string="M"
+ u:block="Number Forms"
+ />
+ <xsl:output-character
+ character="&#x2170;"
+ u:name="SMALL ROMAN NUMERAL ONE"
+ string="i"
+ u:block="Number Forms"
+ />
+ <xsl:output-character
+ character="&#x2171;"
+ u:name="SMALL ROMAN NUMERAL TWO"
+ string="ii"
+ u:block="Number Forms"
+ />
+ <xsl:output-character
+ character="&#x2172;"
+ u:name="SMALL ROMAN NUMERAL THREE"
+ string="iii"
+ u:block="Number Forms"
+ />
+ <xsl:output-character
+ character="&#x2173;"
+ u:name="SMALL ROMAN NUMERAL FOUR"
+ string="iv"
+ u:block="Number Forms"
+ />
+ <xsl:output-character
+ character="&#x2174;"
+ u:name="SMALL ROMAN NUMERAL FIVE"
+ string="v"
+ u:block="Number Forms"
+ />
+ <xsl:output-character
+ character="&#x2175;"
+ u:name="SMALL ROMAN NUMERAL SIX"
+ string="vi"
+ u:block="Number Forms"
+ />
+ <xsl:output-character
+ character="&#x2176;"
+ u:name="SMALL ROMAN NUMERAL SEVEN"
+ string="vii"
+ u:block="Number Forms"
+ />
+ <xsl:output-character
+ character="&#x2177;"
+ u:name="SMALL ROMAN NUMERAL EIGHT"
+ string="viii"
+ u:block="Number Forms"
+ />
+ <xsl:output-character
+ character="&#x2178;"
+ u:name="SMALL ROMAN NUMERAL NINE"
+ string="ix"
+ u:block="Number Forms"
+ />
+ <xsl:output-character
+ character="&#x2179;"
+ u:name="SMALL ROMAN NUMERAL TEN"
+ string="x"
+ u:block="Number Forms"
+ />
+ <xsl:output-character
+ character="&#x217a;"
+ u:name="SMALL ROMAN NUMERAL ELEVEN"
+ string="xi"
+ u:block="Number Forms"
+ />
+ <xsl:output-character
+ character="&#x217b;"
+ u:name="SMALL ROMAN NUMERAL TWELVE"
+ string="xii"
+ u:block="Number Forms"
+ />
+ <xsl:output-character
+ character="&#x217c;"
+ u:name="SMALL ROMAN NUMERAL FIFTY"
+ string="l"
+ u:block="Number Forms"
+ />
+ <xsl:output-character
+ character="&#x217d;"
+ u:name="SMALL ROMAN NUMERAL ONE HUNDRED"
+ string="c"
+ u:block="Number Forms"
+ />
+ <xsl:output-character
+ character="&#x217e;"
+ u:name="SMALL ROMAN NUMERAL FIVE HUNDRED"
+ string="d"
+ u:block="Number Forms"
+ />
+ <xsl:output-character
+ character="&#x217f;"
+ u:name="SMALL ROMAN NUMERAL ONE THOUSAND"
+ string="m"
+ u:block="Number Forms"
+ />
+ <xsl:output-character
+ character="&#x2180;"
+ u:name="ROMAN NUMERAL ONE THOUSAND C D"
+ string="CD"
+ u:block="Number Forms"
+ />
+
+ <!-- * ***************************************************************** -->
+ <!-- * End: Number Forms -->
+ <!-- * x2150 to x218f -->
+ <!-- * ***************************************************************** -->
+
+ <!-- * ***************************************************************** -->
+ <!-- * Begin: Arrows -->
+ <!-- * x2190 to x21ff -->
+ <!-- * ***************************************************************** -->
+
+ <xsl:output-character
+ character="&#x2190;"
+ u:name="LEFTWARDS ARROW"
+ u:entity="larr"
+ string="\(&lt;-"
+ u:block="Arrows"
+ />
+ <xsl:output-character
+ character="&#x2191;"
+ u:name="UPWARDS ARROW"
+ u:entity="uarr"
+ string="\(ua"
+ u:block="Arrows"
+ />
+ <xsl:output-character
+ character="&#x2192;"
+ u:name="RIGHTWARDS ARROW"
+ u:entity="rarr"
+ string="\(->"
+ u:block="Arrows"
+ />
+ <xsl:output-character
+ character="&#x2193;"
+ u:name="DOWNWARDS ARROW"
+ u:entity="darr"
+ string="\(da"
+ u:block="Arrows"
+ />
+ <xsl:output-character
+ character="&#x2194;"
+ u:name="LEFT RIGHT ARROW"
+ u:entity="harr"
+ string="\(&lt;>"
+ u:block="Arrows"
+ />
+ <xsl:output-character
+ character="&#x2195;"
+ u:name="UP DOWN ARROW"
+ u:entity="varr"
+ string="\(va"
+ u:block="Arrows"
+ />
+ <xsl:output-character
+ character="&#x21b5;"
+ u:name="DOWNWARDS ARROW WITH CORNER LEFTWARDS"
+ u:entity="crarr"
+ string="\(CR"
+ u:block="Arrows"
+ />
+ <xsl:output-character
+ character="&#x21d0;"
+ u:name="LEFTWARDS DOUBLE ARROW"
+ u:entity="lArr"
+ string="\(la"
+ u:block="Arrows"
+ />
+ <xsl:output-character
+ character="&#x21d1;"
+ u:name="UPWARDS DOUBLE ARROW"
+ u:entity="uArr"
+ string="\(uA"
+ u:block="Arrows"
+ />
+ <xsl:output-character
+ character="&#x21d2;"
+ u:name="RIGHTWARDS DOUBLE ARROW"
+ u:entity="rArr"
+ string="\(rA"
+ u:block="Arrows"
+ />
+ <xsl:output-character
+ character="&#x21d3;"
+ u:name="DOWNWARDS DOUBLE ARROW"
+ u:entity="dArr"
+ string="\(dA"
+ u:block="Arrows"
+ />
+ <xsl:output-character
+ character="&#x21d4;"
+ u:name="LEFT RIGHT DOUBLE ARROW"
+ u:entity="hArr"
+ string="\(hA"
+ u:block="Arrows"
+ />
+ <!-- no roff equiv; render same as single arrow -->
+ <xsl:output-character
+ character="&#x21d5;"
+ u:name="UP DOWN DOUBLE ARROW"
+ u:entity="vArr"
+ string="\(va"
+ u:block="Arrows"
+ />
+
+ <!-- * ***************************************************************** -->
+ <!-- * Begin: Mathematical Operators -->
+ <!-- * x2200 to x22ff -->
+ <!-- * ***************************************************************** -->
+
+ <xsl:output-character
+ character="&#x2200;"
+ u:name="FOR ALL"
+ u:entity="forall"
+ string="\(fa"
+ u:block="Mathematical Operators"
+ />
+ <xsl:output-character
+ character="&#x2201;"
+ u:name="COMPLEMENT"
+ u:entity="comp"
+ string="C"
+ u:block="Mathematical Operators"
+ />
+ <xsl:output-character
+ character="&#x2202;"
+ u:name="PARTIAL DIFFERENTIAL"
+ u:entity="part"
+ string="\(pd"
+ u:block="Mathematical Operators"
+ />
+ <xsl:output-character
+ character="&#x2203;"
+ u:name="THERE EXISTS"
+ u:entity="exist"
+ string="\(te"
+ u:block="Mathematical Operators"
+ />
+ <!-- * no roff equiv -->
+ <!-- * <xsl:output-character -->
+ <!-- * character="&#x2204;" -->
+ <!-- * u:name="THERE DOES NOT EXIST" -->
+ <!-- * u:entity="nexist" -->
+ <!-- * /> -->
+ <xsl:output-character
+ character="&#x2205;"
+ u:name="EMPTY SET"
+ u:entity="empty"
+ string="\(es"
+ u:block="Mathematical Operators"
+ />
+ <xsl:output-character
+ character="&#x2206;"
+ u:name="INCREMENT"
+ string="\(*D"
+ u:block="Mathematical Operators"
+ />
+ <xsl:output-character
+ character="&#x2207;"
+ u:name="NABLA"
+ u:entity="nabla"
+ string="\(gr"
+ u:block="Mathematical Operators"
+ />
+ <xsl:output-character
+ character="&#x2208;"
+ u:name="ELEMENT OF"
+ u:entity="isin"
+ string="\(mo"
+ u:block="Mathematical Operators"
+ />
+ <xsl:output-character
+ character="&#x2209;"
+ u:name="NOT AN ELEMENT OF"
+ u:entity="notin"
+ string="\(nm"
+ u:block="Mathematical Operators"
+ />
+ <xsl:output-character
+ character="&#x220a;"
+ u:name="SMALL ELEMENT OF"
+ string="\(mo"
+ u:block="Mathematical Operators"
+ />
+
+ <xsl:output-character
+ character="&#x220b;"
+ u:name="CONTAINS AS MEMBER"
+ u:entity="ni"
+ string="\(st"
+ u:block="Mathematical Operators"
+ />
+ <!-- * not in roff -->
+ <!-- * <xsl:output-character -->
+ <!-- * character="&#x220c;" -->
+ <!-- * u:name="DOES NOT CONTAIN AS MEMBER" -->
+ <!-- * /> -->
+ <xsl:output-character
+ character="&#x220d;"
+ u:name="SMALL CONTAINS AS MEMBER"
+ string="\(st"
+ u:block="Mathematical Operators"
+ />
+ <!-- * not in roff -->
+ <!-- * <xsl:output-character -->
+ <!-- * character="&#x220e;" -->
+ <!-- * u:name="END OF PROOF" -->
+ <!-- * /> -->
+ <xsl:output-character
+ character="&#x220f;"
+ u:name="N-ARY PRODUCT"
+ u:entity="prod"
+ string="\(product"
+ u:block="Mathematical Operators"
+ />
+ <!-- * not in roff -->
+ <!-- * <xsl:output-character -->
+ <!-- * character="&#x2210;" -->
+ <!-- * u:name="N-ARY COPRODUCT" -->
+ <!-- * u:entity="coprod" -->
+ <!-- * /> -->
+ <xsl:output-character
+ character="&#x2211;"
+ u:name="N-ARY SUMMATION"
+ u:entity="sum"
+ string="\(sum"
+ u:block="Mathematical Operators"
+ />
+ <xsl:output-character
+ character="&#x2212;"
+ u:name="MINUS SIGN"
+ u:entity="minus"
+ string="\-"
+ u:block="Mathematical Operators"
+ />
+ <xsl:output-character
+ character="&#x2213;"
+ u:name="MINUS-OR-PLUS SIGN"
+ u:entity="mnplus"
+ string="\(+-"
+ u:block="Mathematical Operators"
+ />
+ <!-- * not in roff -->
+ <!-- * <xsl:output-character -->
+ <!-- * character="&#x2214;" -->
+ <!-- * u:name="DOT PLUS" -->
+ <!-- * u:entity="plusdo" -->
+ <!-- * /> -->
+ <xsl:output-character
+ character="&#x2215;"
+ u:name="DIVISION SLASH"
+ string="\(f/"
+ u:block="Mathematical Operators"
+ />
+ <xsl:output-character
+ character="&#x2216;"
+ u:name="SET MINUS"
+ u:entity="setmn"
+ string="\e"
+ u:block="Mathematical Operators"
+ />
+ <xsl:output-character
+ character="&#x2217;"
+ u:name="ASTERISK OPERATOR"
+ u:entity="lowast"
+ string="\(**"
+ u:block="Mathematical Operators"
+ />
+ <!-- * not in roff -->
+ <!-- * <xsl:output-character -->
+ <!-- * character="&#x2218;" -->
+ <!-- * u:name="RING OPERATOR" -->
+ <!-- * u:entity="compfn" -->
+ <!-- * /> -->
+ <xsl:output-character
+ character="&#x2219;"
+ u:name="BULLET OPERATOR"
+ string="\(bu"
+ u:block="Mathematical Operators"
+ />
+ <xsl:output-character
+ character="&#x221a;"
+ u:name="SQUARE ROOT"
+ u:entity="radic"
+ string="\(sr"
+ u:block="Mathematical Operators"
+ />
+ <!-- * not in roff -->
+ <!-- * <xsl:output-character -->
+ <!-- * character="&#x221b;" -->
+ <!-- * u:name="CUBE ROOT" -->
+ <!-- * /> -->
+ <!-- * <xsl:output-character -->
+ <!-- * character="&#x221c;" -->
+ <!-- * u:name="FOURTH ROOT" -->
+ <!-- * /> -->
+ <xsl:output-character
+ character="&#x221d;"
+ u:name="PROPORTIONAL TO"
+ u:entity="prop"
+ string="\(pt"
+ u:block="Mathematical Operators"
+ />
+ <xsl:output-character
+ character="&#x221e;"
+ u:name="INFINITY"
+ u:entity="infin"
+ string="\(if"
+ u:block="Mathematical Operators"
+ />
+ <!-- * not in roff -->
+ <!-- * <xsl:output-character -->
+ <!-- * character="&#x221f;" -->
+ <!-- * u:name="RIGHT ANGLE" -->
+ <!-- * u:entity="ang90" -->
+ <!-- * /> -->
+ <xsl:output-character
+ character="&#x2220;"
+ u:name="ANGLE"
+ u:entity="ang"
+ string="\(/_"
+ u:block="Mathematical Operators"
+ />
+
+ <!-- * 0x2221 to 0x2226 not in roff; -->
+ <!-- * but fake a parallel sign with vert bars -->
+
+ <xsl:output-character
+ character="&#x2225;"
+ u:name="PARALLEL TO"
+ u:entity="par"
+ string="\(bv\(bv"
+ u:block="Mathematical Operators"
+ />
+
+ <xsl:output-character
+ character="&#x2227;"
+ u:name="LOGICAL AND"
+ u:entity="and"
+ string="\(AN"
+ u:block="Mathematical Operators"
+ />
+ <xsl:output-character
+ character="&#x2228;"
+ u:name="LOGICAL OR"
+ u:entity="or"
+ string="\(OR"
+ u:block="Mathematical Operators"
+ />
+ <xsl:output-character
+ character="&#x2229;"
+ u:name="INTERSECTION"
+ u:entity="cap"
+ string="\(ca"
+ u:block="Mathematical Operators"
+ />
+ <xsl:output-character
+ character="&#x222a;"
+ u:name="UNION"
+ u:entity="cup"
+ string="\(cu"
+ u:block="Mathematical Operators"
+ />
+ <xsl:output-character
+ character="&#x222b;"
+ u:name="INTEGRAL"
+ u:entity="int"
+ string="\(is"
+ u:block="Mathematical Operators"
+ />
+ <xsl:output-character
+ character="&#x222c;"
+ u:name="DOUBLE INTEGRAL"
+ string="\(is\(is"
+ u:block="Mathematical Operators"
+ />
+ <xsl:output-character
+ character="&#x222d;"
+ u:name="TRIPLE INTEGRAL"
+ string="\(is\(is\(is"
+ u:block="Mathematical Operators"
+ />
+
+ <!-- * 0x222e to 0x2233 not in roff -->
+
+ <xsl:output-character
+ character="&#x2234;"
+ u:name="THEREFORE"
+ u:entity="there4"
+ string="\(tf"
+ u:block="Mathematical Operators"
+ />
+
+ <!-- * not in roff -->
+ <!-- * <xsl:output-character -->
+ <!-- * character="&#x2235;" -->
+ <!-- * u:name="BECAUSE" -->
+ <!-- * u:entity="becaus" -->
+ <!-- * /> -->
+ <xsl:output-character
+ character="&#x2236;"
+ u:name="RATIO"
+ string=":"
+ u:block="Mathematical Operators"
+ />
+ <xsl:output-character
+ character="&#x2237;"
+ u:name="PROPORTION"
+ string="::"
+ u:block="Mathematical Operators"
+ />
+
+ <!-- * 0x2238 to 0x223b not in roff -->
+
+ <xsl:output-character
+ character="&#x223c;"
+ u:name="TILDE OPERATOR"
+ u:entity="sim"
+ string="\(ti"
+ u:block="Mathematical Operators"
+ />
+
+ <!-- * 0x223d to 0x224b not in roff -->
+
+ <xsl:output-character
+ character="&#x2245;"
+ u:name="APPROXIMATELY EQUAL TO"
+ u:entity="cong"
+ string="\(=~"
+ u:block="Mathematical Operators"
+ />
+
+ <!-- * not in roff -->
+ <!-- * <xsl:output-character -->
+ <!-- * character="&#x2246;" -->
+ <!-- * u:name="APPROXIMATELY BUT NOT ACTUALLY EQUAL TO" -->
+ <!-- * /> -->
+ <!-- * <xsl:output-character -->
+ <!-- * character="&#x2247;" -->
+ <!-- * u:name="NEITHER APPROXIMATELY NOR ACTUALLY EQUAL TO" -->
+ <!-- * u:entity="ncong" -->
+ <!-- * /> -->
+
+ <xsl:output-character
+ character="&#x2248;"
+ u:name="ALMOST EQUAL TO"
+ u:entity="asymp"
+ string="\(~~"
+ u:block="Mathematical Operators"
+ />
+
+ <!-- * x2249 to x2253 not in roff -->
+
+ <xsl:output-character
+ character="&#x2254;"
+ u:name="COLON EQUALS"
+ u:entity="colone"
+ string=":="
+ u:block="Mathematical Operators"
+ />
+ <xsl:output-character
+ character="&#x2255;"
+ u:name="EQUALS COLON"
+ u:entity="ecolon"
+ string="=:"
+ u:block="Mathematical Operators"
+ />
+
+ <!-- * x2256 to x2255 not in roff -->
+
+ <xsl:output-character
+ character="&#x225f;"
+ u:name="QUESTIONED EQUAL TO"
+ string="?="
+ u:block="Mathematical Operators"
+ />
+ <xsl:output-character
+ character="&#x2260;"
+ u:name="NOT EQUAL TO"
+ u:entity="ne"
+ string="\(!="
+ u:block="Mathematical Operators"
+ />
+ <xsl:output-character
+ character="&#x2261;"
+ u:name="IDENTICAL TO"
+ u:entity="equiv"
+ string="\(=="
+ u:block="Mathematical Operators"
+ />
+ <!-- * not in roff -->
+ <!-- * <xsl:output-character -->
+ <!-- * character="&#x2262;" -->
+ <!-- * u:name="NOT IDENTICAL TO" -->
+ <!-- * u:entity="nequiv" -->
+ <!-- * /> -->
+ <!-- * <xsl:output-character -->
+ <!-- * character="&#x2263;" -->
+ <!-- * u:name="STRICTLY EQUIVALENT TO" -->
+ <!-- * /> -->
+ <xsl:output-character
+ character="&#x2264;"
+ u:name="LESS-THAN OR EQUAL TO"
+ u:entity="le"
+ string="\(&lt;="
+ u:block="Mathematical Operators"
+ />
+ <xsl:output-character
+ character="&#x2265;"
+ u:name="GREATER-THAN OR EQUAL TO"
+ u:entity="ge"
+ string="\(>="
+ u:block="Mathematical Operators"
+ />
+ <!-- * x2266 to x2269 not in roff -->
+
+ <xsl:output-character
+ character="&#x226a;"
+ u:name="MUCH LESS-THAN"
+ u:entity="Lt"
+ string="&lt;&lt;"
+ u:block="Mathematical Operators"
+ />
+ <xsl:output-character
+ character="&#x226b;"
+ u:name="MUCH GREATER-THAN"
+ u:entity="Gt"
+ string=">>"
+ u:block="Mathematical Operators"
+ />
+ <!-- * x226c to x2281 not in roff -->
+
+ <xsl:output-character
+ character="&#x2282;"
+ u:name="SUBSET OF"
+ u:entity="sub"
+ string="\(sb"
+ u:block="Mathematical Operators"
+ />
+ <xsl:output-character
+ character="&#x2283;"
+ u:name="SUPERSET OF"
+ u:entity="sup"
+ string="\(sp"
+ u:block="Mathematical Operators"
+ />
+ <xsl:output-character
+ character="&#x2284;"
+ u:name="NOT A SUBSET OF"
+ u:entity="nsub"
+ string="\(nb"
+ u:block="Mathematical Operators"
+ />
+ <!-- * not in roff -->
+ <!-- * <xsl:output-character -->
+ <!-- * character="&#x2285;" -->
+ <!-- * u:name="NOT A SUPERSET OF" -->
+ <!-- * u:entity="nsup" -->
+ <!-- * /> -->
+ <xsl:output-character
+ character="&#x2286;"
+ u:name="SUBSET OF OR EQUAL TO"
+ u:entity="sube"
+ string="\(ib"
+ u:block="Mathematical Operators"
+ />
+ <xsl:output-character
+ character="&#x2287;"
+ u:name="SUPERSET OF OR EQUAL TO"
+ u:entity="supe"
+ string="\(ip"
+ u:block="Mathematical Operators"
+ />
+ <!-- * x2288 to x2294 not in roff -->
+
+ <xsl:output-character
+ character="&#x2295;"
+ u:name="CIRCLED PLUS"
+ u:entity="oplus"
+ string="\(c+"
+ u:block="Mathematical Operators"
+ />
+ <xsl:output-character
+ character="&#x2296;"
+ u:name="CIRCLED MINUS"
+ u:entity="ominus"
+ string="\(c*"
+ u:block="Mathematical Operators"
+ />
+ <xsl:output-character
+ character="&#x2297;"
+ u:name="CIRCLED TIMES"
+ u:entity="otimes"
+ string="\(c*"
+ u:block="Mathematical Operators"
+ />
+
+ <!-- * x2298 to x22a4 not in roff -->
+
+ <xsl:output-character
+ character="&#x22a5;"
+ u:name="UP TACK"
+ u:entity="bottom"
+ string="\(pp"
+ u:block="Mathematical Operators"
+ />
+
+ <!-- * x22a6 to x22bf not in roff -->
+
+ <xsl:output-character
+ character="&#x22c0;"
+ u:name="N-ARY LOGICAL AND"
+ string="\(AN"
+ u:block="Mathematical Operators"
+ />
+ <xsl:output-character
+ character="&#x22c1;"
+ u:name="N-ARY LOGICAL OR"
+ string="\(OR"
+ u:block="Mathematical Operators"
+ />
+ <xsl:output-character
+ character="&#x22c2;"
+ u:name="N-ARY INTERSECTION"
+ string="\(ca"
+ u:block="Mathematical Operators"
+ />
+ <xsl:output-character
+ character="&#x22c3;"
+ u:name="N-ARY UNION"
+ string="\(cu"
+ u:block="Mathematical Operators"
+ />
+
+ <!-- * not in roff -->
+ <!-- * <xsl:output-character -->
+ <!-- * character="&#x22c4;" -->
+ <!-- * u:name="DIAMOND OPERATOR" -->
+ <!-- * u:entity="diam" -->
+ <!-- * /> -->
+ <xsl:output-character
+ character="&#x22c5;"
+ u:name="DOT OPERATOR"
+ u:entity="sdot"
+ string="\(md"
+ u:block="Mathematical Operators"
+ />
+ <xsl:output-character
+ character="&#x22c6;"
+ u:name="STAR OPERATOR"
+ u:entity="sstarf"
+ string="\(**"
+ u:block="Mathematical Operators"
+ />
+ <!-- * x22c7 to x22cd not in roff -->
+
+ <xsl:output-character
+ character="&#x22ce;"
+ u:name="CURLY LOGICAL OR"
+ u:entity="cuvee"
+ string="\(OR"
+ u:block="Mathematical Operators"
+ />
+ <xsl:output-character
+ character="&#x22cf;"
+ u:name="CURLY LOGICAL AND"
+ u:entity="cuwed"
+ string="\(AN"
+ u:block="Mathematical Operators"
+ />
+
+ <!-- * x22d0 to x22d7 not in roff -->
+
+ <xsl:output-character
+ character="&#x22d8;"
+ u:name="VERY MUCH LESS-THAN"
+ u:entity="Ll"
+ string="&lt;&lt;&lt;"
+ u:block="Mathematical Operators"
+ />
+ <xsl:output-character
+ character="&#x22d9;"
+ u:name="VERY MUCH GREATER-THAN"
+ u:entity="Gg"
+ string=">>>"
+ u:block="Mathematical Operators"
+ />
+
+ <!-- * x22da to x22ee not in roff -->
+
+ <xsl:output-character
+ character="&#x22ef;"
+ u:name="MIDLINE HORIZONTAL ELLIPSIS"
+ string="\&amp;..."
+ u:block="Mathematical Operators"
+ />
+
+ <!-- * x22fo to x22ff not in roff -->
+
+ <!-- * ***************************************************************** -->
+ <!-- * End: Mathematical Operators -->
+ <!-- * ***************************************************************** -->
+
+ <!-- * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
+ <!-- * Miscellaneous Technical -->
+ <!-- * x2300 to x23ff -->
+ <!-- * - do nothing except for angle brackets - -->
+ <!-- * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
+
+ <xsl:output-character
+ character="&#x2329;"
+ u:name="LEFT-POINTING ANGLE BRACKET"
+ u:entity="lang"
+ string="\(la"
+ u:block="Miscellaneous Technical"
+ />
+ <xsl:output-character
+ character="&#x232a;"
+ u:name="RIGHT-POINTING ANGLE BRACKET"
+ u:entity="rang"
+ string="\(ra"
+ u:block="Miscellaneous Technical"
+ />
+
+ <!-- * ***************************************************************** -->
+ <!-- * Begin: Control Pictures -->
+ <!-- * x2400 to x243f -->
+ <!-- * ***************************************************************** -->
+
+ <xsl:output-character
+ character="&#x2400;"
+ u:name="SYMBOL FOR NULL"
+ string="NUL"
+ u:block="Control Pictures"
+ />
+ <xsl:output-character
+ character="&#x2401;"
+ u:name="SYMBOL FOR START OF HEADING"
+ string="SOH"
+ u:block="Control Pictures"
+ />
+ <xsl:output-character
+ character="&#x2402;"
+ u:name="SYMBOL FOR START OF TEXT"
+ string="STX"
+ u:block="Control Pictures"
+ />
+ <xsl:output-character
+ character="&#x2403;"
+ u:name="SYMBOL FOR END OF TEXT"
+ string="ETX"
+ u:block="Control Pictures"
+ />
+ <xsl:output-character
+ character="&#x2404;"
+ u:name="SYMBOL FOR END OF TRANSMISSION"
+ string="EOT"
+ u:block="Control Pictures"
+ />
+ <xsl:output-character
+ character="&#x2405;"
+ u:name="SYMBOL FOR ENQUIRY"
+ string="ENQ"
+ u:block="Control Pictures"
+ />
+ <xsl:output-character
+ character="&#x2406;"
+ u:name="SYMBOL FOR ACKNOWLEDGE"
+ string="ACK"
+ u:block="Control Pictures"
+ />
+ <xsl:output-character
+ character="&#x2407;"
+ u:name="SYMBOL FOR BELL"
+ string="BEL"
+ u:block="Control Pictures"
+ />
+ <xsl:output-character
+ character="&#x2408;"
+ u:name="SYMBOL FOR BACKSPACE"
+ string="BS"
+ u:block="Control Pictures"
+ />
+ <xsl:output-character
+ character="&#x2409;"
+ u:name="SYMBOL FOR HORIZONTAL TABULATION"
+ string="HT"
+ u:block="Control Pictures"
+ />
+ <xsl:output-character
+ character="&#x240a;"
+ u:name="SYMBOL FOR LINE FEED"
+ string="LF"
+ u:block="Control Pictures"
+ />
+ <xsl:output-character
+ character="&#x240b;"
+ u:name="SYMBOL FOR VERTICAL TABULATION"
+ string="VT"
+ u:block="Control Pictures"
+ />
+ <xsl:output-character
+ character="&#x240c;"
+ u:name="SYMBOL FOR FORM FEED"
+ string="FF"
+ u:block="Control Pictures"
+ />
+ <xsl:output-character
+ character="&#x240d;"
+ u:name="SYMBOL FOR CARRIAGE RETURN"
+ string="CR"
+ u:block="Control Pictures"
+ />
+ <xsl:output-character
+ character="&#x240e;"
+ u:name="SYMBOL FOR SHIFT OUT"
+ string="SO"
+ u:block="Control Pictures"
+ />
+ <xsl:output-character
+ character="&#x240f;"
+ u:name="SYMBOL FOR SHIFT IN"
+ string="SI"
+ u:block="Control Pictures"
+ />
+ <xsl:output-character
+ character="&#x2410;"
+ u:name="SYMBOL FOR DATA LINK ESCAPE"
+ string="DLE"
+ u:block="Control Pictures"
+ />
+ <xsl:output-character
+ character="&#x2411;"
+ u:name="SYMBOL FOR DEVICE CONTROL ONE"
+ string="DC1"
+ u:block="Control Pictures"
+ />
+ <xsl:output-character
+ character="&#x2412;"
+ u:name="SYMBOL FOR DEVICE CONTROL TWO"
+ string="DC2"
+ u:block="Control Pictures"
+ />
+ <xsl:output-character
+ character="&#x2413;"
+ u:name="SYMBOL FOR DEVICE CONTROL THREE"
+ string="DC3"
+ u:block="Control Pictures"
+ />
+ <xsl:output-character
+ character="&#x2414;"
+ u:name="SYMBOL FOR DEVICE CONTROL FOUR"
+ string="DC4"
+ u:block="Control Pictures"
+ />
+ <xsl:output-character
+ character="&#x2415;"
+ u:name="SYMBOL FOR NEGATIVE ACKNOWLEDGE"
+ string="NAK"
+ u:block="Control Pictures"
+ />
+ <xsl:output-character
+ character="&#x2416;"
+ u:name="SYMBOL FOR SYNCHRONOUS IDLE"
+ string="SYN"
+ u:block="Control Pictures"
+ />
+ <xsl:output-character
+ character="&#x2417;"
+ u:name="SYMBOL FOR END OF TRANSMISSION BLOCK"
+ string="ETB"
+ u:block="Control Pictures"
+ />
+ <xsl:output-character
+ character="&#x2418;"
+ u:name="SYMBOL FOR CANCEL"
+ string="CAN"
+ u:block="Control Pictures"
+ />
+ <xsl:output-character
+ character="&#x2419;"
+ u:name="SYMBOL FOR END OF MEDIUM"
+ string="EM"
+ u:block="Control Pictures"
+ />
+ <xsl:output-character
+ character="&#x241a;"
+ u:name="SYMBOL FOR SUBSTITUTE"
+ string="SUB"
+ u:block="Control Pictures"
+ />
+ <xsl:output-character
+ character="&#x241b;"
+ u:name="SYMBOL FOR ESCAPE"
+ string="ESC"
+ u:block="Control Pictures"
+ />
+ <xsl:output-character
+ character="&#x241c;"
+ u:name="SYMBOL FOR FILE SEPARATOR"
+ string="FS"
+ u:block="Control Pictures"
+ />
+ <xsl:output-character
+ character="&#x241d;"
+ u:name="SYMBOL FOR GROUP SEPARATOR"
+ string="GS"
+ u:block="Control Pictures"
+ />
+ <xsl:output-character
+ character="&#x241e;"
+ u:name="SYMBOL FOR RECORD SEPARATOR"
+ string="RS"
+ u:block="Control Pictures"
+ />
+ <xsl:output-character
+ character="&#x241f;"
+ u:name="SYMBOL FOR UNIT SEPARATOR"
+ string="US"
+ u:block="Control Pictures"
+ />
+ <xsl:output-character
+ character="&#x2420;"
+ u:name="SYMBOL FOR SPACE"
+ string="SP"
+ u:block="Control Pictures"
+ />
+ <xsl:output-character
+ character="&#x2421;"
+ u:name="SYMBOL FOR DELETE"
+ string="DEL"
+ u:block="Control Pictures"
+ />
+ <!-- * no roff equivs for x2422 and x2423 -->
+ <!-- * <xsl:output-character -->
+ <!-- * character="&#x2422;" -->
+ <!-- * u:name="BLANK SYMBOL" -->
+ <!-- * string="?" -->
+ <!-- * u:block="Control Pictures" -->
+ <!-- * /> -->
+ <!-- * I think there should be a roff equiv for &blank;, but as far as I -->
+ <!-- * know, there is not... -->
+ <!-- * <xsl:output-character -->
+ <!-- * character="&#x2423;" -->
+ <!-- * u:name="OPEN BOX" -->
+ <!-- * u:entity="blank" -->
+ <!-- * string="?" -->
+ <!-- * u:block="Control Pictures" -->
+ <!-- * /> -->
+ <xsl:output-character
+ character="&#x2424;"
+ u:name="SYMBOL FOR NEWLINE"
+ string="NL"
+ u:block="Control Pictures"
+ />
+
+ <!-- * ***************************************************************** -->
+ <!-- * End: Control Pictures -->
+ <!-- * ***************************************************************** -->
+
+ <!-- * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
+ <!-- * Optical Character Recognition -->
+ <!-- * x2440 to x24ff -->
+ <!-- * - do nothing - -->
+ <!-- * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
+
+ <!-- * ***************************************************************** -->
+ <!-- * Begin: Enclosed Alphanumerics -->
+ <!-- * x2460 to x24ff -->
+ <!-- * ***************************************************************** -->
+
+ <xsl:output-character
+ character="&#x2460;"
+ u:name="CIRCLED DIGIT ONE"
+ string="1"
+ u:block="Enclosed Alphanumerics"
+ />
+ <xsl:output-character
+ character="&#x2461;"
+ u:name="CIRCLED DIGIT TWO"
+ string="2"
+ u:block="Enclosed Alphanumerics"
+ />
+ <xsl:output-character
+ character="&#x2462;"
+ u:name="CIRCLED DIGIT THREE"
+ string="3"
+ u:block="Enclosed Alphanumerics"
+ />
+ <xsl:output-character
+ character="&#x2463;"
+ u:name="CIRCLED DIGIT FOUR"
+ string="4"
+ u:block="Enclosed Alphanumerics"
+ />
+ <xsl:output-character
+ character="&#x2464;"
+ u:name="CIRCLED DIGIT FIVE"
+ string="5"
+ u:block="Enclosed Alphanumerics"
+ />
+ <xsl:output-character
+ character="&#x2465;"
+ u:name="CIRCLED DIGIT SIX"
+ string="6"
+ u:block="Enclosed Alphanumerics"
+ />
+ <xsl:output-character
+ character="&#x2466;"
+ u:name="CIRCLED DIGIT SEVEN"
+ string="7"
+ u:block="Enclosed Alphanumerics"
+ />
+ <xsl:output-character
+ character="&#x2467;"
+ u:name="CIRCLED DIGIT EIGHT"
+ string="8"
+ u:block="Enclosed Alphanumerics"
+ />
+ <xsl:output-character
+ character="&#x2468;"
+ u:name="CIRCLED DIGIT NINE"
+ string="9"
+ u:block="Enclosed Alphanumerics"
+ />
+ <xsl:output-character
+ character="&#x2469;"
+ u:name="CIRCLED NUMBER TEN"
+ string="10"
+ u:block="Enclosed Alphanumerics"
+ />
+ <xsl:output-character
+ character="&#x246a;"
+ u:name="CIRCLED NUMBER ELEVEN"
+ string="11"
+ u:block="Enclosed Alphanumerics"
+ />
+ <xsl:output-character
+ character="&#x246b;"
+ u:name="CIRCLED NUMBER TWELVE"
+ string="12"
+ u:block="Enclosed Alphanumerics"
+ />
+ <xsl:output-character
+ character="&#x246c;"
+ u:name="CIRCLED NUMBER THIRTEEN"
+ string="13"
+ u:block="Enclosed Alphanumerics"
+ />
+ <xsl:output-character
+ character="&#x246d;"
+ u:name="CIRCLED NUMBER FOURTEEN"
+ string="14"
+ u:block="Enclosed Alphanumerics"
+ />
+ <xsl:output-character
+ character="&#x246e;"
+ u:name="CIRCLED NUMBER FIFTEEN"
+ string="15"
+ u:block="Enclosed Alphanumerics"
+ />
+ <xsl:output-character
+ character="&#x246f;"
+ u:name="CIRCLED NUMBER SIXTEEN"
+ string="16"
+ u:block="Enclosed Alphanumerics"
+ />
+ <xsl:output-character
+ character="&#x2470;"
+ u:name="CIRCLED NUMBER SEVENTEEN"
+ string="17"
+ u:block="Enclosed Alphanumerics"
+ />
+ <xsl:output-character
+ character="&#x2471;"
+ u:name="CIRCLED NUMBER EIGHTEEN"
+ string="18"
+ u:block="Enclosed Alphanumerics"
+ />
+ <xsl:output-character
+ character="&#x2472;"
+ u:name="CIRCLED NUMBER NINETEEN"
+ string="19"
+ u:block="Enclosed Alphanumerics"
+ />
+ <xsl:output-character
+ character="&#x2473;"
+ u:name="CIRCLED NUMBER TWENTY"
+ string="20"
+ u:block="Enclosed Alphanumerics"
+ />
+ <xsl:output-character
+ character="&#x2474;"
+ u:name="PARENTHESIZED DIGIT ONE"
+ string="(1)"
+ u:block="Enclosed Alphanumerics"
+ />
+ <xsl:output-character
+ character="&#x2475;"
+ u:name="PARENTHESIZED DIGIT TWO"
+ string="(2)"
+ u:block="Enclosed Alphanumerics"
+ />
+ <xsl:output-character
+ character="&#x2476;"
+ u:name="PARENTHESIZED DIGIT THREE"
+ string="(3)"
+ u:block="Enclosed Alphanumerics"
+ />
+ <xsl:output-character
+ character="&#x2477;"
+ u:name="PARENTHESIZED DIGIT FOUR"
+ string="(4)"
+ u:block="Enclosed Alphanumerics"
+ />
+ <xsl:output-character
+ character="&#x2478;"
+ u:name="PARENTHESIZED DIGIT FIVE"
+ string="(5)"
+ u:block="Enclosed Alphanumerics"
+ />
+ <xsl:output-character
+ character="&#x2479;"
+ u:name="PARENTHESIZED DIGIT SIX"
+ string="(6)"
+ u:block="Enclosed Alphanumerics"
+ />
+ <xsl:output-character
+ character="&#x247a;"
+ u:name="PARENTHESIZED DIGIT SEVEN"
+ string="(7)"
+ u:block="Enclosed Alphanumerics"
+ />
+ <xsl:output-character
+ character="&#x247b;"
+ u:name="PARENTHESIZED DIGIT EIGHT"
+ string="(8)"
+ u:block="Enclosed Alphanumerics"
+ />
+ <xsl:output-character
+ character="&#x247c;"
+ u:name="PARENTHESIZED DIGIT NINE"
+ string="(9)"
+ u:block="Enclosed Alphanumerics"
+ />
+ <xsl:output-character
+ character="&#x247d;"
+ u:name="PARENTHESIZED NUMBER TEN"
+ string="(10)"
+ u:block="Enclosed Alphanumerics"
+ />
+ <xsl:output-character
+ character="&#x247e;"
+ u:name="PARENTHESIZED NUMBER ELEVEN"
+ string="(11)"
+ u:block="Enclosed Alphanumerics"
+ />
+ <xsl:output-character
+ character="&#x247f;"
+ u:name="PARENTHESIZED NUMBER TWELVE"
+ string="(12)"
+ u:block="Enclosed Alphanumerics"
+ />
+ <xsl:output-character
+ character="&#x2480;"
+ u:name="PARENTHESIZED NUMBER THIRTEEN"
+ string="(13)"
+ u:block="Enclosed Alphanumerics"
+ />
+ <xsl:output-character
+ character="&#x2481;"
+ u:name="PARENTHESIZED NUMBER FOURTEEN"
+ string="(14)"
+ u:block="Enclosed Alphanumerics"
+ />
+ <xsl:output-character
+ character="&#x2482;"
+ u:name="PARENTHESIZED NUMBER FIFTEEN"
+ string="(15)"
+ u:block="Enclosed Alphanumerics"
+ />
+ <xsl:output-character
+ character="&#x2483;"
+ u:name="PARENTHESIZED NUMBER SIXTEEN"
+ string="(16)"
+ u:block="Enclosed Alphanumerics"
+ />
+ <xsl:output-character
+ character="&#x2484;"
+ u:name="PARENTHESIZED NUMBER SEVENTEEN"
+ string="(17)"
+ u:block="Enclosed Alphanumerics"
+ />
+ <xsl:output-character
+ character="&#x2485;"
+ u:name="PARENTHESIZED NUMBER EIGHTEEN"
+ string="(18)"
+ u:block="Enclosed Alphanumerics"
+ />
+ <xsl:output-character
+ character="&#x2486;"
+ u:name="PARENTHESIZED NUMBER NINETEEN"
+ string="(19)"
+ u:block="Enclosed Alphanumerics"
+ />
+ <xsl:output-character
+ character="&#x2487;"
+ u:name="PARENTHESIZED NUMBER TWENTY"
+ string="(20)"
+ u:block="Enclosed Alphanumerics"
+ />
+ <xsl:output-character
+ character="&#x2488;"
+ u:name="DIGIT ONE FULL STOP"
+ string="1."
+ u:block="Enclosed Alphanumerics"
+ />
+ <xsl:output-character
+ character="&#x2489;"
+ u:name="DIGIT TWO FULL STOP"
+ string="2."
+ u:block="Enclosed Alphanumerics"
+ />
+ <xsl:output-character
+ character="&#x248a;"
+ u:name="DIGIT THREE FULL STOP"
+ string="3."
+ u:block="Enclosed Alphanumerics"
+ />
+ <xsl:output-character
+ character="&#x248b;"
+ u:name="DIGIT FOUR FULL STOP"
+ string="4."
+ u:block="Enclosed Alphanumerics"
+ />
+ <xsl:output-character
+ character="&#x248c;"
+ u:name="DIGIT FIVE FULL STOP"
+ string="5."
+ u:block="Enclosed Alphanumerics"
+ />
+ <xsl:output-character
+ character="&#x248d;"
+ u:name="DIGIT SIX FULL STOP"
+ string="6."
+ u:block="Enclosed Alphanumerics"
+ />
+ <xsl:output-character
+ character="&#x248e;"
+ u:name="DIGIT SEVEN FULL STOP"
+ string="7."
+ u:block="Enclosed Alphanumerics"
+ />
+ <xsl:output-character
+ character="&#x248f;"
+ u:name="DIGIT EIGHT FULL STOP"
+ string="8."
+ u:block="Enclosed Alphanumerics"
+ />
+ <xsl:output-character
+ character="&#x2490;"
+ u:name="DIGIT NINE FULL STOP"
+ string="9."
+ u:block="Enclosed Alphanumerics"
+ />
+ <xsl:output-character
+ character="&#x2491;"
+ u:name="NUMBER TEN FULL STOP"
+ string="10."
+ u:block="Enclosed Alphanumerics"
+ />
+ <xsl:output-character
+ character="&#x2492;"
+ u:name="NUMBER ELEVEN FULL STOP"
+ string="11."
+ u:block="Enclosed Alphanumerics"
+ />
+ <xsl:output-character
+ character="&#x2493;"
+ u:name="NUMBER TWELVE FULL STOP"
+ string="12."
+ u:block="Enclosed Alphanumerics"
+ />
+ <xsl:output-character
+ character="&#x2494;"
+ u:name="NUMBER THIRTEEN FULL STOP"
+ string="13."
+ u:block="Enclosed Alphanumerics"
+ />
+ <xsl:output-character
+ character="&#x2495;"
+ u:name="NUMBER FOURTEEN FULL STOP"
+ string="14."
+ u:block="Enclosed Alphanumerics"
+ />
+ <xsl:output-character
+ character="&#x2496;"
+ u:name="NUMBER FIFTEEN FULL STOP"
+ string="15."
+ u:block="Enclosed Alphanumerics"
+ />
+ <xsl:output-character
+ character="&#x2497;"
+ u:name="NUMBER SIXTEEN FULL STOP"
+ string="16."
+ u:block="Enclosed Alphanumerics"
+ />
+ <xsl:output-character
+ character="&#x2498;"
+ u:name="NUMBER SEVENTEEN FULL STOP"
+ string="17."
+ u:block="Enclosed Alphanumerics"
+ />
+ <xsl:output-character
+ character="&#x2499;"
+ u:name="NUMBER EIGHTEEN FULL STOP"
+ string="18."
+ u:block="Enclosed Alphanumerics"
+ />
+ <xsl:output-character
+ character="&#x249a;"
+ u:name="NUMBER NINETEEN FULL STOP"
+ string="19."
+ u:block="Enclosed Alphanumerics"
+ />
+ <xsl:output-character
+ character="&#x249b;"
+ u:name="NUMBER TWENTY FULL STOP"
+ string="20."
+ u:block="Enclosed Alphanumerics"
+ />
+ <xsl:output-character
+ character="&#x249c;"
+ u:name="PARENTHESIZED LATIN SMALL LETTER A"
+ string="(a)"
+ u:block="Enclosed Alphanumerics"
+ />
+ <xsl:output-character
+ character="&#x249d;"
+ u:name="PARENTHESIZED LATIN SMALL LETTER B"
+ string="(b)"
+ u:block="Enclosed Alphanumerics"
+ />
+ <xsl:output-character
+ character="&#x249e;"
+ u:name="PARENTHESIZED LATIN SMALL LETTER C"
+ string="(c)"
+ u:block="Enclosed Alphanumerics"
+ />
+ <xsl:output-character
+ character="&#x249f;"
+ u:name="PARENTHESIZED LATIN SMALL LETTER D"
+ string="(d)"
+ u:block="Enclosed Alphanumerics"
+ />
+ <xsl:output-character
+ character="&#x24a0;"
+ u:name="PARENTHESIZED LATIN SMALL LETTER E"
+ string="(e)"
+ u:block="Enclosed Alphanumerics"
+ />
+ <xsl:output-character
+ character="&#x24a1;"
+ u:name="PARENTHESIZED LATIN SMALL LETTER F"
+ string="(f)"
+ u:block="Enclosed Alphanumerics"
+ />
+ <xsl:output-character
+ character="&#x24a2;"
+ u:name="PARENTHESIZED LATIN SMALL LETTER G"
+ string="(g)"
+ u:block="Enclosed Alphanumerics"
+ />
+ <xsl:output-character
+ character="&#x24a3;"
+ u:name="PARENTHESIZED LATIN SMALL LETTER H"
+ string="(h)"
+ u:block="Enclosed Alphanumerics"
+ />
+ <xsl:output-character
+ character="&#x24a4;"
+ u:name="PARENTHESIZED LATIN SMALL LETTER I"
+ string="(i)"
+ u:block="Enclosed Alphanumerics"
+ />
+ <xsl:output-character
+ character="&#x24a5;"
+ u:name="PARENTHESIZED LATIN SMALL LETTER J"
+ string="(j)"
+ u:block="Enclosed Alphanumerics"
+ />
+ <xsl:output-character
+ character="&#x24a6;"
+ u:name="PARENTHESIZED LATIN SMALL LETTER K"
+ string="(k)"
+ u:block="Enclosed Alphanumerics"
+ />
+ <xsl:output-character
+ character="&#x24a7;"
+ u:name="PARENTHESIZED LATIN SMALL LETTER L"
+ string="(l)"
+ u:block="Enclosed Alphanumerics"
+ />
+ <xsl:output-character
+ character="&#x24a8;"
+ u:name="PARENTHESIZED LATIN SMALL LETTER M"
+ string="(m)"
+ u:block="Enclosed Alphanumerics"
+ />
+ <xsl:output-character
+ character="&#x24a9;"
+ u:name="PARENTHESIZED LATIN SMALL LETTER N"
+ string="(n)"
+ u:block="Enclosed Alphanumerics"
+ />
+ <xsl:output-character
+ character="&#x24aa;"
+ u:name="PARENTHESIZED LATIN SMALL LETTER O"
+ string="(o)"
+ u:block="Enclosed Alphanumerics"
+ />
+ <xsl:output-character
+ character="&#x24ab;"
+ u:name="PARENTHESIZED LATIN SMALL LETTER P"
+ string="(p)"
+ u:block="Enclosed Alphanumerics"
+ />
+ <xsl:output-character
+ character="&#x24ac;"
+ u:name="PARENTHESIZED LATIN SMALL LETTER Q"
+ string="(q)"
+ u:block="Enclosed Alphanumerics"
+ />
+ <xsl:output-character
+ character="&#x24ad;"
+ u:name="PARENTHESIZED LATIN SMALL LETTER R"
+ string="(r)"
+ u:block="Enclosed Alphanumerics"
+ />
+ <xsl:output-character
+ character="&#x24ae;"
+ u:name="PARENTHESIZED LATIN SMALL LETTER S"
+ string="(s)"
+ u:block="Enclosed Alphanumerics"
+ />
+ <xsl:output-character
+ character="&#x24af;"
+ u:name="PARENTHESIZED LATIN SMALL LETTER T"
+ string="(t)"
+ u:block="Enclosed Alphanumerics"
+ />
+ <xsl:output-character
+ character="&#x24b0;"
+ u:name="PARENTHESIZED LATIN SMALL LETTER U"
+ string="(u)"
+ u:block="Enclosed Alphanumerics"
+ />
+ <xsl:output-character
+ character="&#x24b1;"
+ u:name="PARENTHESIZED LATIN SMALL LETTER V"
+ string="(v)"
+ u:block="Enclosed Alphanumerics"
+ />
+ <xsl:output-character
+ character="&#x24b2;"
+ u:name="PARENTHESIZED LATIN SMALL LETTER W"
+ string="(w)"
+ u:block="Enclosed Alphanumerics"
+ />
+ <xsl:output-character
+ character="&#x24b3;"
+ u:name="PARENTHESIZED LATIN SMALL LETTER X"
+ string="(x)"
+ u:block="Enclosed Alphanumerics"
+ />
+ <xsl:output-character
+ character="&#x24b4;"
+ u:name="PARENTHESIZED LATIN SMALL LETTER Y"
+ string="(y)"
+ u:block="Enclosed Alphanumerics"
+ />
+ <xsl:output-character
+ character="&#x24b5;"
+ u:name="PARENTHESIZED LATIN SMALL LETTER Z"
+ string="(z)"
+ u:block="Enclosed Alphanumerics"
+ />
+ <xsl:output-character
+ character="&#x24b6;"
+ u:name="CIRCLED LATIN CAPITAL LETTER A"
+ string="A"
+ u:block="Enclosed Alphanumerics"
+ />
+ <xsl:output-character
+ character="&#x24b7;"
+ u:name="CIRCLED LATIN CAPITAL LETTER B"
+ string="B"
+ u:block="Enclosed Alphanumerics"
+ />
+ <xsl:output-character
+ character="&#x24b8;"
+ u:name="CIRCLED LATIN CAPITAL LETTER C"
+ string="C"
+ u:block="Enclosed Alphanumerics"
+ />
+ <xsl:output-character
+ character="&#x24b9;"
+ u:name="CIRCLED LATIN CAPITAL LETTER D"
+ string="D"
+ u:block="Enclosed Alphanumerics"
+ />
+ <xsl:output-character
+ character="&#x24ba;"
+ u:name="CIRCLED LATIN CAPITAL LETTER E"
+ string="E"
+ u:block="Enclosed Alphanumerics"
+ />
+ <xsl:output-character
+ character="&#x24bb;"
+ u:name="CIRCLED LATIN CAPITAL LETTER F"
+ string="F"
+ u:block="Enclosed Alphanumerics"
+ />
+ <xsl:output-character
+ character="&#x24bc;"
+ u:name="CIRCLED LATIN CAPITAL LETTER G"
+ string="G"
+ u:block="Enclosed Alphanumerics"
+ />
+ <xsl:output-character
+ character="&#x24bd;"
+ u:name="CIRCLED LATIN CAPITAL LETTER H"
+ string="H"
+ u:block="Enclosed Alphanumerics"
+ />
+ <xsl:output-character
+ character="&#x24be;"
+ u:name="CIRCLED LATIN CAPITAL LETTER I"
+ string="I"
+ u:block="Enclosed Alphanumerics"
+ />
+ <xsl:output-character
+ character="&#x24bf;"
+ u:name="CIRCLED LATIN CAPITAL LETTER J"
+ string="J"
+ u:block="Enclosed Alphanumerics"
+ />
+ <xsl:output-character
+ character="&#x24c0;"
+ u:name="CIRCLED LATIN CAPITAL LETTER K"
+ string="K"
+ u:block="Enclosed Alphanumerics"
+ />
+ <xsl:output-character
+ character="&#x24c1;"
+ u:name="CIRCLED LATIN CAPITAL LETTER L"
+ string="L"
+ u:block="Enclosed Alphanumerics"
+ />
+ <xsl:output-character
+ character="&#x24c2;"
+ u:name="CIRCLED LATIN CAPITAL LETTER M"
+ string="M"
+ u:block="Enclosed Alphanumerics"
+ />
+ <xsl:output-character
+ character="&#x24c3;"
+ u:name="CIRCLED LATIN CAPITAL LETTER N"
+ string="N"
+ u:block="Enclosed Alphanumerics"
+ />
+ <xsl:output-character
+ character="&#x24c4;"
+ u:name="CIRCLED LATIN CAPITAL LETTER O"
+ string="O"
+ u:block="Enclosed Alphanumerics"
+ />
+ <xsl:output-character
+ character="&#x24c5;"
+ u:name="CIRCLED LATIN CAPITAL LETTER P"
+ string="P"
+ u:block="Enclosed Alphanumerics"
+ />
+ <xsl:output-character
+ character="&#x24c6;"
+ u:name="CIRCLED LATIN CAPITAL LETTER Q"
+ string="Q"
+ u:block="Enclosed Alphanumerics"
+ />
+ <xsl:output-character
+ character="&#x24c7;"
+ u:name="CIRCLED LATIN CAPITAL LETTER R"
+ string="R"
+ u:block="Enclosed Alphanumerics"
+ />
+ <xsl:output-character
+ character="&#x24c8;"
+ u:name="CIRCLED LATIN CAPITAL LETTER S"
+ u:entity="oS"
+ string="S"
+ u:block="Enclosed Alphanumerics"
+ />
+ <xsl:output-character
+ character="&#x24c9;"
+ u:name="CIRCLED LATIN CAPITAL LETTER T"
+ string="T"
+ u:block="Enclosed Alphanumerics"
+ />
+ <xsl:output-character
+ character="&#x24ca;"
+ u:name="CIRCLED LATIN CAPITAL LETTER U"
+ string="U"
+ u:block="Enclosed Alphanumerics"
+ />
+ <xsl:output-character
+ character="&#x24cb;"
+ u:name="CIRCLED LATIN CAPITAL LETTER V"
+ string="V"
+ u:block="Enclosed Alphanumerics"
+ />
+ <xsl:output-character
+ character="&#x24cc;"
+ u:name="CIRCLED LATIN CAPITAL LETTER W"
+ string="W"
+ u:block="Enclosed Alphanumerics"
+ />
+ <xsl:output-character
+ character="&#x24cd;"
+ u:name="CIRCLED LATIN CAPITAL LETTER X"
+ string="X"
+ u:block="Enclosed Alphanumerics"
+ />
+ <xsl:output-character
+ character="&#x24ce;"
+ u:name="CIRCLED LATIN CAPITAL LETTER Y"
+ string="Y"
+ u:block="Enclosed Alphanumerics"
+ />
+ <xsl:output-character
+ character="&#x24cf;"
+ u:name="CIRCLED LATIN CAPITAL LETTER Z"
+ string="Z"
+ u:block="Enclosed Alphanumerics"
+ />
+ <xsl:output-character
+ character="&#x24d0;"
+ u:name="CIRCLED LATIN SMALL LETTER A"
+ string="a"
+ u:block="Enclosed Alphanumerics"
+ />
+ <xsl:output-character
+ character="&#x24d1;"
+ u:name="CIRCLED LATIN SMALL LETTER B"
+ string="b"
+ u:block="Enclosed Alphanumerics"
+ />
+ <xsl:output-character
+ character="&#x24d2;"
+ u:name="CIRCLED LATIN SMALL LETTER C"
+ string="c"
+ u:block="Enclosed Alphanumerics"
+ />
+ <xsl:output-character
+ character="&#x24d3;"
+ u:name="CIRCLED LATIN SMALL LETTER D"
+ string="d"
+ u:block="Enclosed Alphanumerics"
+ />
+ <xsl:output-character
+ character="&#x24d4;"
+ u:name="CIRCLED LATIN SMALL LETTER E"
+ string="e"
+ u:block="Enclosed Alphanumerics"
+ />
+ <xsl:output-character
+ character="&#x24d5;"
+ u:name="CIRCLED LATIN SMALL LETTER F"
+ string="f"
+ u:block="Enclosed Alphanumerics"
+ />
+ <xsl:output-character
+ character="&#x24d6;"
+ u:name="CIRCLED LATIN SMALL LETTER G"
+ string="g"
+ u:block="Enclosed Alphanumerics"
+ />
+ <xsl:output-character
+ character="&#x24d7;"
+ u:name="CIRCLED LATIN SMALL LETTER H"
+ string="h"
+ u:block="Enclosed Alphanumerics"
+ />
+ <xsl:output-character
+ character="&#x24d8;"
+ u:name="CIRCLED LATIN SMALL LETTER I"
+ string="i"
+ u:block="Enclosed Alphanumerics"
+ />
+ <xsl:output-character
+ character="&#x24d9;"
+ u:name="CIRCLED LATIN SMALL LETTER J"
+ string="j"
+ u:block="Enclosed Alphanumerics"
+ />
+ <xsl:output-character
+ character="&#x24da;"
+ u:name="CIRCLED LATIN SMALL LETTER K"
+ string="k"
+ u:block="Enclosed Alphanumerics"
+ />
+ <xsl:output-character
+ character="&#x24db;"
+ u:name="CIRCLED LATIN SMALL LETTER L"
+ string="l"
+ u:block="Enclosed Alphanumerics"
+ />
+ <xsl:output-character
+ character="&#x24dc;"
+ u:name="CIRCLED LATIN SMALL LETTER M"
+ string="m"
+ u:block="Enclosed Alphanumerics"
+ />
+ <xsl:output-character
+ character="&#x24dd;"
+ u:name="CIRCLED LATIN SMALL LETTER N"
+ string="n"
+ u:block="Enclosed Alphanumerics"
+ />
+ <xsl:output-character
+ character="&#x24de;"
+ u:name="CIRCLED LATIN SMALL LETTER O"
+ string="o"
+ u:block="Enclosed Alphanumerics"
+ />
+ <xsl:output-character
+ character="&#x24df;"
+ u:name="CIRCLED LATIN SMALL LETTER P"
+ string="p"
+ u:block="Enclosed Alphanumerics"
+ />
+ <xsl:output-character
+ character="&#x24e0;"
+ u:name="CIRCLED LATIN SMALL LETTER Q"
+ string="q"
+ u:block="Enclosed Alphanumerics"
+ />
+ <xsl:output-character
+ character="&#x24e1;"
+ u:name="CIRCLED LATIN SMALL LETTER R"
+ string="r"
+ u:block="Enclosed Alphanumerics"
+ />
+ <xsl:output-character
+ character="&#x24e2;"
+ u:name="CIRCLED LATIN SMALL LETTER S"
+ string="s"
+ u:block="Enclosed Alphanumerics"
+ />
+ <xsl:output-character
+ character="&#x24e3;"
+ u:name="CIRCLED LATIN SMALL LETTER T"
+ string="t"
+ u:block="Enclosed Alphanumerics"
+ />
+ <xsl:output-character
+ character="&#x24e4;"
+ u:name="CIRCLED LATIN SMALL LETTER U"
+ string="u"
+ u:block="Enclosed Alphanumerics"
+ />
+ <xsl:output-character
+ character="&#x24e5;"
+ u:name="CIRCLED LATIN SMALL LETTER V"
+ string="b"
+ u:block="Enclosed Alphanumerics"
+ />
+ <xsl:output-character
+ character="&#x24e6;"
+ u:name="CIRCLED LATIN SMALL LETTER W"
+ string="w"
+ u:block="Enclosed Alphanumerics"
+ />
+ <xsl:output-character
+ character="&#x24e7;"
+ u:name="CIRCLED LATIN SMALL LETTER X"
+ string="x"
+ u:block="Enclosed Alphanumerics"
+ />
+ <xsl:output-character
+ character="&#x24e8;"
+ u:name="CIRCLED LATIN SMALL LETTER Y"
+ string="y"
+ u:block="Enclosed Alphanumerics"
+ />
+ <xsl:output-character
+ character="&#x24e9;"
+ u:name="CIRCLED LATIN SMALL LETTER Z"
+ string="z"
+ u:block="Enclosed Alphanumerics"
+ />
+ <xsl:output-character
+ character="&#x24ea;"
+ u:name="CIRCLED DIGIT ZERO"
+ string="0"
+ u:block="Enclosed Alphanumerics"
+ />
+ <xsl:output-character
+ character="&#x24eb;"
+ u:name="NEGATIVE CIRCLED NUMBER ELEVEN"
+ string="11"
+ u:block="Enclosed Alphanumerics"
+ />
+ <xsl:output-character
+ character="&#x24ec;"
+ u:name="NEGATIVE CIRCLED NUMBER TWELVE"
+ string="12"
+ u:block="Enclosed Alphanumerics"
+ />
+ <xsl:output-character
+ character="&#x24ed;"
+ u:name="NEGATIVE CIRCLED NUMBER THIRTEEN"
+ string="13"
+ u:block="Enclosed Alphanumerics"
+ />
+ <xsl:output-character
+ character="&#x24ee;"
+ u:name="NEGATIVE CIRCLED NUMBER FOURTEEN"
+ string="14"
+ u:block="Enclosed Alphanumerics"
+ />
+ <xsl:output-character
+ character="&#x24ef;"
+ u:name="NEGATIVE CIRCLED NUMBER FIFTEEN"
+ string="15"
+ u:block="Enclosed Alphanumerics"
+ />
+ <xsl:output-character
+ character="&#x24f0;"
+ u:name="NEGATIVE CIRCLED NUMBER SIXTEEN"
+ string="16"
+ u:block="Enclosed Alphanumerics"
+ />
+ <xsl:output-character
+ character="&#x24f1;"
+ u:name="NEGATIVE CIRCLED NUMBER SEVENTEEN"
+ string="17"
+ u:block="Enclosed Alphanumerics"
+ />
+ <xsl:output-character
+ character="&#x24f2;"
+ u:name="NEGATIVE CIRCLED NUMBER EIGHTEEN"
+ string="18"
+ u:block="Enclosed Alphanumerics"
+ />
+ <xsl:output-character
+ character="&#x24f3;"
+ u:name="NEGATIVE CIRCLED NUMBER NINETEEN"
+ string="19"
+ u:block="Enclosed Alphanumerics"
+ />
+ <xsl:output-character
+ character="&#x24f4;"
+ u:name="NEGATIVE CIRCLED NUMBER TWENTY"
+ string="20"
+ u:block="Enclosed Alphanumerics"
+ />
+ <xsl:output-character
+ character="&#x24f5;"
+ u:name="DOUBLE CIRCLED DIGIT ONE"
+ string="1"
+ u:block="Enclosed Alphanumerics"
+ />
+ <xsl:output-character
+ character="&#x24f6;"
+ u:name="DOUBLE CIRCLED DIGIT TWO"
+ string="2"
+ u:block="Enclosed Alphanumerics"
+ />
+ <xsl:output-character
+ character="&#x24f7;"
+ u:name="DOUBLE CIRCLED DIGIT THREE"
+ string="3"
+ u:block="Enclosed Alphanumerics"
+ />
+ <xsl:output-character
+ character="&#x24f8;"
+ u:name="DOUBLE CIRCLED DIGIT FOUR"
+ string="4"
+ u:block="Enclosed Alphanumerics"
+ />
+ <xsl:output-character
+ character="&#x24f9;"
+ u:name="DOUBLE CIRCLED DIGIT FIVE"
+ string="5"
+ u:block="Enclosed Alphanumerics"
+ />
+ <xsl:output-character
+ character="&#x24fa;"
+ u:name="DOUBLE CIRCLED DIGIT SIX"
+ string="6"
+ u:block="Enclosed Alphanumerics"
+ />
+ <xsl:output-character
+ character="&#x24fb;"
+ u:name="DOUBLE CIRCLED DIGIT SEVEN"
+ string="7"
+ u:block="Enclosed Alphanumerics"
+ />
+ <xsl:output-character
+ character="&#x24fc;"
+ u:name="DOUBLE CIRCLED DIGIT EIGHT"
+ string="8"
+ u:block="Enclosed Alphanumerics"
+ />
+ <xsl:output-character
+ character="&#x24fd;"
+ u:name="DOUBLE CIRCLED DIGIT NINE"
+ string="9"
+ u:block="Enclosed Alphanumerics"
+ />
+ <xsl:output-character
+ character="&#x24fe;"
+ u:name="DOUBLE CIRCLED NUMBER TEN"
+ string="10"
+ u:block="Enclosed Alphanumerics"
+ />
+
+ <!-- * ***************************************************************** -->
+ <!-- * End: Enclosed Alphanumerics -->
+ <!-- * ***************************************************************** -->
+
+ <!-- * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
+ <!-- * Box Drawing -->
+ <!-- * x2500 to x257f -->
+ <!-- * Block Elements -->
+ <!-- * x2580 to x259f -->
+ <!-- * - do nothing - -->
+ <!-- * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
+
+ <!-- * ***************************************************************** -->
+ <!-- * Begin: Geometric Shapes -->
+ <!-- * x25a0 to x25f7 -->
+ <!-- * ***************************************************************** -->
+
+ <xsl:output-character
+ character="&#x25a1;"
+ u:name="WHITE SQUARE"
+ u:entity="squ"
+ string="\(sq"
+ u:block="Geometric Shapes"
+ />
+ <xsl:output-character
+ character="&#x25a2;"
+ u:name="WHITE SQUARE WITH ROUNDED CORNERS"
+ string="\(sq"
+ u:block="Geometric Shapes"
+ />
+ <xsl:output-character
+ character="&#x25ab;"
+ u:name="WHITE SMALL SQUARE"
+ string="\(sq"
+ u:block="Geometric Shapes"
+ />
+ <xsl:output-character
+ character="&#x25ba;"
+ u:name="BLACK RIGHT-POINTING POINTER"
+ string="\fB>\fR"
+ u:block="Geometric Shapes"
+ />
+ <xsl:output-character
+ character="&#x25bb;"
+ u:name="WHITE RIGHT-POINTING POINTER"
+ string=">"
+ u:block="Geometric Shapes"
+ />
+ <xsl:output-character
+ character="&#x25bc;"
+ u:name="BLACK DOWN-POINTING TRIANGLE"
+ string="\fBv\fR"
+ u:block="Geometric Shapes"
+ />
+ <xsl:output-character
+ character="&#x25bd;"
+ u:name="WHITE DOWN-POINTING TRIANGLE"
+ u:entity="xdtri"
+ string="v"
+ u:block="Geometric Shapes"
+ />
+ <xsl:output-character
+ character="&#x25c4;"
+ u:name="BLACK LEFT-POINTING POINTER"
+ string="\fB&lt;\fR"
+ u:block="Geometric Shapes"
+ />
+ <xsl:output-character
+ character="&#x25c5;"
+ u:name="WHITE LEFT-POINTING POINTER"
+ string="&lt;"
+ u:block="Geometric Shapes"
+ />
+ <xsl:output-character
+ character="&#x25c6;"
+ u:name="BLACK DIAMOND"
+ string="\(DI"
+ u:block="Geometric Shapes"
+ />
+ <xsl:output-character
+ character="&#x25c7;"
+ u:name="WHITE DIAMOND"
+ string="\(lz"
+ u:block="Geometric Shapes"
+ />
+ <xsl:output-character
+ character="&#x25ca;"
+ u:name="LOZENGE"
+ u:entity="loz"
+ string="\(lz"
+ u:block="Geometric Shapes"
+ />
+ <xsl:output-character
+ character="&#x25cb;"
+ u:name="WHITE CIRCLE"
+ u:entity="cir"
+ string="\(ci"
+ u:block="Geometric Shapes"
+ />
+ <xsl:output-character
+ character="&#x25cf;"
+ u:name="BLACK CIRCLE"
+ string="\(bu"
+ u:block="Geometric Shapes"
+ />
+ <xsl:output-character
+ character="&#x25e6;"
+ u:name="WHITE BULLET"
+ string="\(ci"
+ u:block="Geometric Shapes"
+ />
+ <xsl:output-character
+ character="&#x25ef;"
+ u:name="LARGE CIRCLE"
+ u:entity="xcirc"
+ string="\(ci"
+ u:block="Geometric Shapes"
+ />
+ <!-- * ***************************************************************** -->
+ <!-- * End: Geometric Shapes -->
+ <!-- * x25a0 to x25f7 -->
+ <!-- * ***************************************************************** -->
+
+ <!-- * ***************************************************************** -->
+ <!-- * Begin: Miscellaneous Symbols -->
+ <!-- * x2600 to x26ff -->
+ <!-- * ***************************************************************** -->
+
+ <xsl:output-character
+ character="&#x261a;"
+ u:name="BLACK LEFT POINTING INDEX"
+ string="\(lh"
+ u:block="Miscellaneous Symbols"
+ />
+ <xsl:output-character
+ character="&#x261b;"
+ u:name="BLACK RIGHT POINTING INDEX"
+ string="\(rh)"
+ u:block="Miscellaneous Symbols"
+ />
+ <xsl:output-character
+ character="&#x261c;"
+ u:name="WHITE LEFT POINTING INDEX"
+ string="\(lh"
+ u:block="Miscellaneous Symbols"
+ />
+ <xsl:output-character
+ character="&#x261e;"
+ u:name="WHITE RIGHT POINTING INDEX"
+ string="\(rh)"
+ u:block="Miscellaneous Symbols"
+ />
+ <xsl:output-character
+ character="&#x2660;"
+ u:name="BLACK SPADE SUIT"
+ u:entity="spades"
+ string="\(SP"
+ u:block="Miscellaneous Symbols"
+ />
+ <xsl:output-character
+ character="&#x2661;"
+ u:name="WHITE HEART SUIT"
+ string="\(HE"
+ u:block="Miscellaneous Symbols"
+ />
+ <xsl:output-character
+ character="&#x2662;"
+ u:name="WHITE DIAMOND SUIT"
+ string="\(DI"
+ u:block="Miscellaneous Symbols"
+ />
+ <xsl:output-character
+ character="&#x2663;"
+ u:name="BLACK CLUB SUIT"
+ u:entity="clubs"
+ string="\(CL"
+ u:block="Miscellaneous Symbols"
+ />
+ <xsl:output-character
+ character="&#x2664;"
+ u:name="WHITE SPADE SUIT"
+ string="\(SP"
+ u:block="Miscellaneous Symbols"
+ />
+ <xsl:output-character
+ character="&#x2665;"
+ u:name="BLACK HEART SUIT"
+ u:entity="hearts"
+ string="\(HE"
+ u:block="Miscellaneous Symbols"
+ />
+ <xsl:output-character
+ character="&#x2666;"
+ u:name="BLACK DIAMOND SUIT"
+ u:entity="diams"
+ string="\(DI"
+ u:block="Miscellaneous Symbols"
+ />
+ <xsl:output-character
+ character="&#x2667;"
+ u:name="WHITE CLUB SUIT"
+ string="\(CL"
+ u:block="Miscellaneous Symbols"
+ />
+
+ <!-- * ***************************************************************** -->
+ <!-- * End: Miscellaneous Symbols -->
+ <!-- * ***************************************************************** -->
+
+ <!-- * ***************************************************************** -->
+ <!-- * Begin: Dingbats -->
+ <!-- * x2700 to x27be -->
+ <!-- * No roff equiv for most of these; just map to something close -->
+ <!-- * ***************************************************************** -->
+
+ <xsl:output-character
+ character="&#x2713;"
+ u:name="CHECK MARK"
+ u:entity="check"
+ string="\(OK"
+ u:block="Dingbats"
+ />
+ <xsl:output-character
+ character="&#x2714;"
+ u:name="HEAVY CHECK MARK"
+ string="\fB\(OK\fR"
+ u:block="Dingbats"
+ />
+ <xsl:output-character
+ character="&#x2715;"
+ u:name="MULTIPLICATION X"
+ string="\(mu"
+ u:block="Dingbats"
+ />
+ <xsl:output-character
+ character="&#x2716;"
+ u:name="HEAVY MULTIPLICATION X"
+ string="\fB\(mu\fR"
+ u:block="Dingbats"
+ />
+ <xsl:output-character
+ character="&#x2717;"
+ u:name="BALLOT X"
+ u:entity="cross"
+ string="\(mu"
+ u:block="Dingbats"
+ />
+ <xsl:output-character
+ character="&#x2718;"
+ u:name="HEAVY BALLOT X"
+ string="\fB\(mu\fR"
+ u:block="Dingbats"
+ />
+ <xsl:output-character
+ character="&#x2719;"
+ u:name="OUTLINED GREEK CROSS"
+ string="\fB+\fR"
+ u:block="Dingbats"
+ />
+ <xsl:output-character
+ character="&#x271a;"
+ u:name="HEAVY GREEK CROSS"
+ string="\fB+\fR"
+ u:block="Dingbats"
+ />
+ <xsl:output-character
+ character="&#x271b;"
+ u:name="OPEN CENTRE CROSS"
+ string="\fB+\fR"
+ u:block="Dingbats"
+ />
+ <xsl:output-character
+ character="&#x271c;"
+ u:name="HEAVY OPEN CENTRE CROSS"
+ string="\fB+\fR"
+ u:block="Dingbats"
+ />
+ <xsl:output-character
+ character="&#x271d;"
+ u:name="LATIN CROSS"
+ string="\fB+\fR"
+ u:block="Dingbats"
+ />
+ <xsl:output-character
+ character="&#x271e;"
+ u:name="SHADOWED WHITE LATIN CROSS"
+ string="\fB+\fR"
+ u:block="Dingbats"
+ />
+ <xsl:output-character
+ character="&#x271f;"
+ u:name="OUTLINED LATIN CROSS"
+ string="\fB+\fR"
+ u:block="Dingbats"
+ />
+ <xsl:output-character
+ character="&#x2720;"
+ u:name="MALTESE CROSS"
+ u:entity="malt"
+ string="\fB+\fR"
+ u:block="Dingbats"
+ />
+ <xsl:output-character
+ character="&#x2721;"
+ u:name="STAR OF DAVID"
+ string="*"
+ u:block="Dingbats"
+ />
+ <xsl:output-character
+ character="&#x2722;"
+ u:name="FOUR TEARDROP-SPOKED ASTERISK"
+ string="*"
+ u:block="Dingbats"
+ />
+ <xsl:output-character
+ character="&#x2723;"
+ u:name="FOUR BALLOON-SPOKED ASTERISK"
+ string="*"
+ u:block="Dingbats"
+ />
+ <xsl:output-character
+ character="&#x2724;"
+ u:name="HEAVY FOUR BALLOON-SPOKED ASTERISK"
+ string="*"
+ u:block="Dingbats"
+ />
+ <xsl:output-character
+ character="&#x2725;"
+ u:name="FOUR CLUB-SPOKED ASTERISK"
+ string="*"
+ u:block="Dingbats"
+ />
+ <xsl:output-character
+ character="&#x2726;"
+ u:name="BLACK FOUR POINTED STAR"
+ string="*"
+ u:block="Dingbats"
+ />
+ <xsl:output-character
+ character="&#x2727;"
+ u:name="WHITE FOUR POINTED STAR"
+ string="*"
+ u:block="Dingbats"
+ />
+ <xsl:output-character
+ character="&#x2729;"
+ u:name="STRESS OUTLINED WHITE STAR"
+ string="*"
+ u:block="Dingbats"
+ />
+ <xsl:output-character
+ character="&#x272a;"
+ u:name="CIRCLED WHITE STAR"
+ string="*"
+ u:block="Dingbats"
+ />
+ <xsl:output-character
+ character="&#x272b;"
+ u:name="OPEN CENTRE BLACK STAR"
+ string="*"
+ u:block="Dingbats"
+ />
+ <xsl:output-character
+ character="&#x272c;"
+ u:name="BLACK CENTRE WHITE STAR"
+ string="*"
+ u:block="Dingbats"
+ />
+ <xsl:output-character
+ character="&#x272d;"
+ u:name="OUTLINED BLACK STAR"
+ string="*"
+ u:block="Dingbats"
+ />
+ <xsl:output-character
+ character="&#x272e;"
+ u:name="HEAVY OUTLINED BLACK STAR"
+ string="*"
+ u:block="Dingbats"
+ />
+ <xsl:output-character
+ character="&#x272f;"
+ u:name="PINWHEEL STAR"
+ string="*"
+ u:block="Dingbats"
+ />
+ <xsl:output-character
+ character="&#x2730;"
+ u:name="SHADOWED WHITE STAR"
+ string="*"
+ u:block="Dingbats"
+ />
+ <xsl:output-character
+ character="&#x2731;"
+ u:name="HEAVY ASTERISK"
+ string="*"
+ u:block="Dingbats"
+ />
+ <xsl:output-character
+ character="&#x2732;"
+ u:name="OPEN CENTRE ASTERISK"
+ string="*"
+ u:block="Dingbats"
+ />
+ <xsl:output-character
+ character="&#x2733;"
+ u:name="EIGHT SPOKED ASTERISK"
+ string="*"
+ u:block="Dingbats"
+ />
+ <xsl:output-character
+ character="&#x2734;"
+ u:name="EIGHT POINTED BLACK STAR"
+ string="*"
+ u:block="Dingbats"
+ />
+ <xsl:output-character
+ character="&#x2735;"
+ u:name="EIGHT POINTED PINWHEEL STAR"
+ string="*"
+ u:block="Dingbats"
+ />
+ <xsl:output-character
+ character="&#x2736;"
+ u:name="SIX POINTED BLACK STAR"
+ u:entity="sext"
+ string="*"
+ u:block="Dingbats"
+ />
+ <xsl:output-character
+ character="&#x2737;"
+ u:name="EIGHT POINTED RECTILINEAR BLACK STAR"
+ string="*"
+ u:block="Dingbats"
+ />
+ <xsl:output-character
+ character="&#x2738;"
+ u:name="HEAVY EIGHT POINTED RECTILINEAR BLACK STAR"
+ string="*"
+ u:block="Dingbats"
+ />
+ <xsl:output-character
+ character="&#x2739;"
+ u:name="TWELVE POINTED BLACK STAR"
+ string="*"
+ u:block="Dingbats"
+ />
+ <xsl:output-character
+ character="&#x273a;"
+ u:name="SIXTEEN POINTED ASTERISK"
+ string="*"
+ u:block="Dingbats"
+ />
+ <xsl:output-character
+ character="&#x273b;"
+ u:name="TEARDROP-SPOKED ASTERISK"
+ string="*"
+ u:block="Dingbats"
+ />
+ <xsl:output-character
+ character="&#x273c;"
+ u:name="OPEN CENTRE TEARDROP-SPOKED ASTERISK"
+ string="*"
+ u:block="Dingbats"
+ />
+ <xsl:output-character
+ character="&#x273d;"
+ u:name="HEAVY TEARDROP-SPOKED ASTERISK"
+ string="*"
+ u:block="Dingbats"
+ />
+ <xsl:output-character
+ character="&#x273e;"
+ u:name="SIX PETALLED BLACK AND WHITE FLORETTE"
+ string="*"
+ u:block="Dingbats"
+ />
+ <xsl:output-character
+ character="&#x273f;"
+ u:name="BLACK FLORETTE"
+ string="*"
+ u:block="Dingbats"
+ />
+ <xsl:output-character
+ character="&#x2740;"
+ u:name="WHITE FLORETTE"
+ string="*"
+ u:block="Dingbats"
+ />
+ <xsl:output-character
+ character="&#x2741;"
+ u:name="EIGHT PETALLED OUTLINED BLACK FLORETTE"
+ string="*"
+ u:block="Dingbats"
+ />
+ <xsl:output-character
+ character="&#x2742;"
+ u:name="CIRCLED OPEN CENTRE EIGHT POINTED STAR"
+ string="*"
+ u:block="Dingbats"
+ />
+ <xsl:output-character
+ character="&#x2743;"
+ u:name="HEAVY TEARDROP-SPOKED PINWHEEL ASTERISK"
+ string="*"
+ u:block="Dingbats"
+ />
+ <xsl:output-character
+ character="&#x2744;"
+ u:name="SNOWFLAKE"
+ string="*"
+ u:block="Dingbats"
+ />
+ <xsl:output-character
+ character="&#x2745;"
+ u:name="TIGHT TRIFOLIATE SNOWFLAKE"
+ string="*"
+ u:block="Dingbats"
+ />
+ <xsl:output-character
+ character="&#x2746;"
+ u:name="HEAVY CHEVRON SNOWFLAKE"
+ string="*"
+ u:block="Dingbats"
+ />
+ <xsl:output-character
+ character="&#x2747;"
+ u:name="SPARKLE"
+ string="*"
+ u:block="Dingbats"
+ />
+ <xsl:output-character
+ character="&#x2748;"
+ u:name="HEAVY SPARKLE"
+ string="*"
+ u:block="Dingbats"
+ />
+ <xsl:output-character
+ character="&#x2749;"
+ u:name="BALLOON-SPOKED ASTERISK"
+ string="*"
+ u:block="Dingbats"
+ />
+ <xsl:output-character
+ character="&#x274a;"
+ u:name="EIGHT TEARDROP-SPOKED PROPELLER ASTERISK"
+ string="*"
+ u:block="Dingbats"
+ />
+ <xsl:output-character
+ character="&#x274b;"
+ u:name="HEAVY EIGHT TEARDROP-SPOKED PROPELLER ASTERISK"
+ string="*"
+ u:block="Dingbats"
+ />
+ <xsl:output-character
+ character="&#x274d;"
+ u:name="SHADOWED WHITE CIRCLE"
+ string="*"
+ u:block="Dingbats"
+ />
+ <xsl:output-character
+ character="&#x274f;"
+ u:name="LOWER RIGHT DROP-SHADOWED WHITE SQUARE"
+ string="\(sq"
+ u:block="Dingbats"
+ />
+ <xsl:output-character
+ character="&#x2750;"
+ u:name="UPPER RIGHT DROP-SHADOWED WHITE SQUARE"
+ string="\(sq"
+ u:block="Dingbats"
+ />
+ <xsl:output-character
+ character="&#x2751;"
+ u:name="LOWER RIGHT SHADOWED WHITE SQUARE"
+ string="\(sq"
+ u:block="Dingbats"
+ />
+ <xsl:output-character
+ character="&#x2752;"
+ u:name="UPPER RIGHT SHADOWED WHITE SQUARE"
+ string="\(sq"
+ u:block="Dingbats"
+ />
+ <xsl:output-character
+ character="&#x2756;"
+ u:name="BLACK DIAMOND MINUS WHITE X"
+ string="*"
+ u:block="Dingbats"
+ />
+ <xsl:output-character
+ character="&#x2758;"
+ u:name="LIGHT VERTICAL BAR"
+ string="\(bv"
+ u:block="Dingbats"
+ />
+ <xsl:output-character
+ character="&#x2759;"
+ u:name="MEDIUM VERTICAL BAR"
+ string="\fB\(bv\fR"
+ u:block="Dingbats"
+ />
+ <xsl:output-character
+ character="&#x275a;"
+ u:name="HEAVY VERTICAL BAR"
+ string="\fB\(bv\fR"
+ u:block="Dingbats"
+ />
+ <xsl:output-character
+ character="&#x275b;"
+ u:name="HEAVY SINGLE TURNED COMMA QUOTATION MARK ORNAMENT"
+ string="\fB\(oq\fR"
+ u:block="Dingbats"
+ />
+ <xsl:output-character
+ character="&#x275c;"
+ u:name="HEAVY SINGLE COMMA QUOTATION MARK ORNAMENT"
+ string="\fB\(cq\fR"
+ u:block="Dingbats"
+ />
+ <xsl:output-character
+ character="&#x275d;"
+ u:name="HEAVY DOUBLE TURNED COMMA QUOTATION MARK ORNAMENT"
+ string="\fB\(lq\fR"
+ u:block="Dingbats"
+ />
+ <xsl:output-character
+ character="&#x275e;"
+ u:name="HEAVY DOUBLE COMMA QUOTATION MARK ORNAMENT"
+ string="\fB\(rq\fR"
+ u:block="Dingbats"
+ />
+ <xsl:output-character
+ character="&#x2761;"
+ u:name="CURVED STEM PARAGRAPH SIGN ORNAMENT"
+ string="\(ps"
+ u:block="Dingbats"
+ />
+ <xsl:output-character
+ character="&#x2762;"
+ u:name="HEAVY EXCLAMATION MARK ORNAMENT"
+ string="\fB!\fR"
+ u:block="Dingbats"
+ />
+ <xsl:output-character
+ character="&#x2763;"
+ u:name="HEAVY HEART EXCLAMATION MARK ORNAMENT"
+ string="\fB!\fR"
+ u:block="Dingbats"
+ />
+ <xsl:output-character
+ character="&#x2764;"
+ u:name="HEAVY BLACK HEART"
+ string="\fB\(HE\fR"
+ u:block="Dingbats"
+ />
+ <xsl:output-character
+ character="&#x2765;"
+ u:name="ROTATED HEAVY BLACK HEART BULLET"
+ string="\fB\(HE\fR"
+ u:block="Dingbats"
+ />
+ <xsl:output-character
+ character="&#x2766;"
+ u:name="FLORAL HEART"
+ string="\fB\(HE\fR"
+ u:block="Dingbats"
+ />
+ <xsl:output-character
+ character="&#x2767;"
+ u:name="ROTATED FLORAL HEART BULLET"
+ string="\fB\(HE\fR"
+ u:block="Dingbats"
+ />
+ <xsl:output-character
+ character="&#x2776;"
+ u:name="DINGBAT NEGATIVE CIRCLED DIGIT ONE"
+ string="1"
+ u:block="Dingbats"
+ />
+ <xsl:output-character
+ character="&#x2777;"
+ u:name="DINGBAT NEGATIVE CIRCLED DIGIT TWO"
+ string="2"
+ u:block="Dingbats"
+ />
+ <xsl:output-character
+ character="&#x2778;"
+ u:name="DINGBAT NEGATIVE CIRCLED DIGIT THREE"
+ string="3"
+ u:block="Dingbats"
+ />
+ <xsl:output-character
+ character="&#x2779;"
+ u:name="DINGBAT NEGATIVE CIRCLED DIGIT FOUR"
+ string="4"
+ u:block="Dingbats"
+ />
+ <xsl:output-character
+ character="&#x277a;"
+ u:name="DINGBAT NEGATIVE CIRCLED DIGIT FIVE"
+ string="5"
+ u:block="Dingbats"
+ />
+ <xsl:output-character
+ character="&#x277b;"
+ u:name="DINGBAT NEGATIVE CIRCLED DIGIT SIX"
+ string="6"
+ u:block="Dingbats"
+ />
+ <xsl:output-character
+ character="&#x277c;"
+ u:name="DINGBAT NEGATIVE CIRCLED DIGIT SEVEN"
+ string="7"
+ u:block="Dingbats"
+ />
+ <xsl:output-character
+ character="&#x277d;"
+ u:name="DINGBAT NEGATIVE CIRCLED DIGIT EIGHT"
+ string="8"
+ u:block="Dingbats"
+ />
+ <xsl:output-character
+ character="&#x277e;"
+ u:name="DINGBAT NEGATIVE CIRCLED DIGIT NINE"
+ string="9"
+ u:block="Dingbats"
+ />
+ <xsl:output-character
+ character="&#x277f;"
+ u:name="DINGBAT NEGATIVE CIRCLED NUMBER TEN"
+ string="10"
+ u:block="Dingbats"
+ />
+ <xsl:output-character
+ character="&#x2780;"
+ u:name="DINGBAT CIRCLED SANS-SERIF DIGIT ONE"
+ string="1"
+ u:block="Dingbats"
+ />
+ <xsl:output-character
+ character="&#x2781;"
+ u:name="DINGBAT CIRCLED SANS-SERIF DIGIT TWO"
+ string="2"
+ u:block="Dingbats"
+ />
+ <xsl:output-character
+ character="&#x2782;"
+ u:name="DINGBAT CIRCLED SANS-SERIF DIGIT THREE"
+ string="3"
+ u:block="Dingbats"
+ />
+ <xsl:output-character
+ character="&#x2783;"
+ u:name="DINGBAT CIRCLED SANS-SERIF DIGIT FOUR"
+ string="4"
+ u:block="Dingbats"
+ />
+ <xsl:output-character
+ character="&#x2784;"
+ u:name="DINGBAT CIRCLED SANS-SERIF DIGIT FIVE"
+ string="5"
+ u:block="Dingbats"
+ />
+ <xsl:output-character
+ character="&#x2785;"
+ u:name="DINGBAT CIRCLED SANS-SERIF DIGIT SIX"
+ string="6"
+ u:block="Dingbats"
+ />
+ <xsl:output-character
+ character="&#x2786;"
+ u:name="DINGBAT CIRCLED SANS-SERIF DIGIT SEVEN"
+ string="7"
+ u:block="Dingbats"
+ />
+ <xsl:output-character
+ character="&#x2787;"
+ u:name="DINGBAT CIRCLED SANS-SERIF DIGIT EIGHT"
+ string="8"
+ u:block="Dingbats"
+ />
+ <xsl:output-character
+ character="&#x2788;"
+ u:name="DINGBAT CIRCLED SANS-SERIF DIGIT NINE"
+ string="9"
+ u:block="Dingbats"
+ />
+ <xsl:output-character
+ character="&#x2789;"
+ u:name="DINGBAT CIRCLED SANS-SERIF NUMBER TEN"
+ string="10"
+ u:block="Dingbats"
+ />
+ <xsl:output-character
+ character="&#x278a;"
+ u:name="DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT ONE"
+ string="1"
+ u:block="Dingbats"
+ />
+ <xsl:output-character
+ character="&#x278b;"
+ u:name="DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT TWO"
+ string="2"
+ u:block="Dingbats"
+ />
+ <xsl:output-character
+ character="&#x278c;"
+ u:name="DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT THREE"
+ string="3"
+ u:block="Dingbats"
+ />
+ <xsl:output-character
+ character="&#x278d;"
+ u:name="DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FOUR"
+ string="4"
+ u:block="Dingbats"
+ />
+ <xsl:output-character
+ character="&#x278e;"
+ u:name="DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FIVE"
+ string="5"
+ u:block="Dingbats"
+ />
+ <xsl:output-character
+ character="&#x278f;"
+ u:name="DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT SIX"
+ string="6"
+ u:block="Dingbats"
+ />
+ <xsl:output-character
+ character="&#x2790;"
+ u:name="DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT SEVEN"
+ string="7"
+ u:block="Dingbats"
+ />
+ <xsl:output-character
+ character="&#x2791;"
+ u:name="DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT EIGHT"
+ string="8"
+ u:block="Dingbats"
+ />
+ <xsl:output-character
+ character="&#x2792;"
+ u:name="DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT NINE"
+ string="9"
+ u:block="Dingbats"
+ />
+ <xsl:output-character
+ character="&#x2793;"
+ u:name="DINGBAT NEGATIVE CIRCLED SANS-SERIF NUMBER TEN"
+ string="10"
+ u:block="Dingbats"
+ />
+ <xsl:output-character
+ character="&#x2794;"
+ u:name="HEAVY WIDE-HEADED RIGHTWARDS ARROW"
+ string="\fR\(->\fB"
+ u:block="Dingbats"
+ />
+ <xsl:output-character
+ character="&#x2799;"
+ u:name="HEAVY RIGHTWARDS ARROW"
+ string="\fR\(->\fB"
+ u:block="Dingbats"
+ />
+ <xsl:output-character
+ character="&#x279b;"
+ u:name="DRAFTING POINT RIGHTWARDS ARROW"
+ string="\(->"
+ u:block="Dingbats"
+ />
+ <xsl:output-character
+ character="&#x279c;"
+ u:name="HEAVY ROUND-TIPPED RIGHTWARDS ARROW"
+ string="\fR\(->\fB"
+ u:block="Dingbats"
+ />
+ <xsl:output-character
+ character="&#x279d;"
+ u:name="TRIANGLE-HEADED RIGHTWARDS ARROW"
+ string="\(->"
+ u:block="Dingbats"
+ />
+ <xsl:output-character
+ character="&#x279e;"
+ u:name="HEAVY TRIANGLE-HEADED RIGHTWARDS ARROW"
+ string="\fR\(->\fB"
+ u:block="Dingbats"
+ />
+ <xsl:output-character
+ character="&#x279f;"
+ u:name="DASHED TRIANGLE-HEADED RIGHTWARDS ARROW"
+ string="\(->"
+ u:block="Dingbats"
+ />
+ <xsl:output-character
+ character="&#x27a0;"
+ u:name="HEAVY DASHED TRIANGLE-HEADED RIGHTWARDS ARROW"
+ string="\fR\(->\fB"
+ u:block="Dingbats"
+ />
+ <xsl:output-character
+ character="&#x27a1;"
+ u:name="BLACK RIGHTWARDS ARROW"
+ string="\fR\(->\fB"
+ u:block="Dingbats"
+ />
+ <xsl:output-character
+ character="&#x27a2;"
+ u:name="THREE-D TOP-LIGHTED RIGHTWARDS ARROWHEAD"
+ string="\(->"
+ u:block="Dingbats"
+ />
+ <xsl:output-character
+ character="&#x27a3;"
+ u:name="THREE-D BOTTOM-LIGHTED RIGHTWARDS ARROWHEAD"
+ string="\(->"
+ u:block="Dingbats"
+ />
+ <xsl:output-character
+ character="&#x27a4;"
+ u:name="BLACK RIGHTWARDS ARROWHEAD"
+ string="\(->"
+ u:block="Dingbats"
+ />
+ <xsl:output-character
+ character="&#x27a7;"
+ u:name="SQUAT BLACK RIGHTWARDS ARROW"
+ string="\fR\(->\fB"
+ u:block="Dingbats"
+ />
+ <xsl:output-character
+ character="&#x27a8;"
+ u:name="HEAVY CONCAVE-POINTED BLACK RIGHTWARDS ARROW"
+ string="\fR\(->\fB"
+ u:block="Dingbats"
+ />
+ <xsl:output-character
+ character="&#x27a9;"
+ u:name="RIGHT-SHADED WHITE RIGHTWARDS ARROW"
+ string="\(rA"
+ u:block="Dingbats"
+ />
+ <xsl:output-character
+ character="&#x27aa;"
+ u:name="LEFT-SHADED WHITE RIGHTWARDS ARROW"
+ string="\(rA"
+ u:block="Dingbats"
+ />
+ <xsl:output-character
+ character="&#x27ab;"
+ u:name="BACK-TILTED SHADOWED WHITE RIGHTWARDS ARROW"
+ string="\(rA"
+ u:block="Dingbats"
+ />
+ <xsl:output-character
+ character="&#x27ac;"
+ u:name="FRONT-TILTED SHADOWED WHITE RIGHTWARDS ARROW"
+ string="\(rA"
+ u:block="Dingbats"
+ />
+ <xsl:output-character
+ character="&#x27ad;"
+ u:name="HEAVY LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW"
+ string="\(rA"
+ u:block="Dingbats"
+ />
+ <xsl:output-character
+ character="&#x27ae;"
+ u:name="HEAVY UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW"
+ string="\(rA"
+ u:block="Dingbats"
+ />
+ <xsl:output-character
+ character="&#x27af;"
+ u:name="NOTCHED LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW"
+ string="\(rA"
+ u:block="Dingbats"
+ />
+ <xsl:output-character
+ character="&#x27b1;"
+ u:name="NOTCHED UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW"
+ string="\(rA"
+ u:block="Dingbats"
+ />
+ <xsl:output-character
+ character="&#x27b2;"
+ u:name="CIRCLED HEAVY WHITE RIGHTWARDS ARROW"
+ string="\(rA"
+ u:block="Dingbats"
+ />
+ <xsl:output-character
+ character="&#x27b3;"
+ u:name="WHITE-FEATHERED RIGHTWARDS ARROW"
+ string="\fR\(->\fB"
+ u:block="Dingbats"
+ />
+ <xsl:output-character
+ character="&#x27b4;"
+ u:name="BLACK-FEATHERED SOUTH EAST ARROW"
+ string="\fR\(->\fB"
+ u:block="Dingbats"
+ />
+ <xsl:output-character
+ character="&#x27b5;"
+ u:name="BLACK-FEATHERED RIGHTWARDS ARROW"
+ string="\fR\(->\fB"
+ u:block="Dingbats"
+ />
+ <xsl:output-character
+ character="&#x27b6;"
+ u:name="BLACK-FEATHERED NORTH EAST ARROW"
+ string="\fR\(->\fB"
+ u:block="Dingbats"
+ />
+ <xsl:output-character
+ character="&#x27b7;"
+ u:name="HEAVY BLACK-FEATHERED SOUTH EAST ARROW"
+ string="\fR\(->\fB"
+ u:block="Dingbats"
+ />
+ <xsl:output-character
+ character="&#x27b8;"
+ u:name="HEAVY BLACK-FEATHERED RIGHTWARDS ARROW"
+ string="\fR\(->\fB"
+ u:block="Dingbats"
+ />
+ <xsl:output-character
+ character="&#x27b9;"
+ u:name="HEAVY BLACK-FEATHERED NORTH EAST ARROW"
+ string="\fR\(->\fB"
+ u:block="Dingbats"
+ />
+ <xsl:output-character
+ character="&#x27ba;"
+ u:name="TEARDROP-BARBED RIGHTWARDS ARROW"
+ string="\fR\(->\fB"
+ u:block="Dingbats"
+ />
+ <xsl:output-character
+ character="&#x27bb;"
+ u:name="HEAVY TEARDROP-SHANKED RIGHTWARDS ARROW"
+ string="\fR\(->\fB"
+ u:block="Dingbats"
+ />
+ <xsl:output-character
+ character="&#x27bc;"
+ u:name="WEDGE-TAILED RIGHTWARDS ARROW"
+ string="\fR\(->\fB"
+ u:block="Dingbats"
+ />
+ <xsl:output-character
+ character="&#x27bd;"
+ u:name="HEAVY WEDGE-TAILED RIGHTWARDS ARROW"
+ string="\fR\(->\fB"
+ u:block="Dingbats"
+ />
+ <xsl:output-character
+ character="&#x27be;"
+ u:name="OPEN-OUTLINED RIGHTWARDS ARROW"
+ string="\fR\(rA\fB"
+ u:block="Dingbats"
+ />
+
+ <!-- * ***************************************************************** -->
+ <!-- * End: Dingbats -->
+ <!-- * ***************************************************************** -->
+
+ <!-- * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
+ <!-- * Miscellaneous Mathematical Symbols -->
+ <!-- * x27c0 to x27ef -->
+ <!-- * Supplemental Arrows -->
+ <!-- * x27f0 to x297f -->
+ <!-- * Miscellaneous Mathematical Symbols -->
+ <!-- * x2980 to x29ff -->
+ <!-- * Supplemental Mathematical Operators -->
+ <!-- * x2a00 to x2aff -->
+ <!-- * - no nothing - -->
+ <!-- * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
+
+ <!-- * ***************************************************************** -->
+ <!-- * Begin: Alphabetic Presentation Forms -->
+ <!-- * xfb00 to xfb04 -->
+ <!-- * ***************************************************************** -->
+
+ <xsl:output-character
+ character="&#xfb00;"
+ u:name="LATIN SMALL LIGATURE FF"
+ u:entity="fflig"
+ string="\(ff"
+ u:block="Alphabetic Presentation Forms"
+ />
+ <xsl:output-character
+ character="&#xfb01;"
+ u:name="LATIN SMALL LIGATURE FI"
+ u:entity="filig"
+ string="\(fi"
+ u:block="Alphabetic Presentation Forms"
+ />
+ <xsl:output-character
+ character="&#xfb02;"
+ u:name="LATIN SMALL LIGATURE FL"
+ u:entity="fllig"
+ string="\(fl"
+ u:block="Alphabetic Presentation Forms"
+ />
+ <xsl:output-character
+ character="&#xfb03;"
+ u:name="LATIN SMALL LIGATURE FFI"
+ u:entity="ffilig"
+ string="\(Fi"
+ u:block="Alphabetic Presentation Forms"
+ />
+ <xsl:output-character
+ character="&#xfb04;"
+ u:name="LATIN SMALL LIGATURE FFL"
+ u:entity="ffllig"
+ string="\(Fl"
+ u:block="Alphabetic Presentation Forms"
+ />
+
+ <!-- * ***************************************************************** -->
+ <!-- * End: Alphabetic Presentation Forms -->
+ <!-- * ***************************************************************** -->
+
+ <!-- * ================================================================= -->
+
+ <!-- * Regarding x2060 vs. xFEFF, the document "Unicode Standard Annex #14, -->
+ <!-- * Line Breaking Properties"[1] says: -->
+ <!-- * -->
+ <!-- * The word joiner character [x2060 a.k.a "WJ"] is the preferred -->
+ <!-- * choice for an invisible character to keep other characters -->
+ <!-- * together that would otherwise be split across the line at a direct -->
+ <!-- * break. The character FEFF has the same effect, but because it is -->
+ <!-- * also used in an unrelated way as a byte order mark, the use of the -->
+ <!-- * WJ as the preferred interword glue simplifies the handling of FEFF. -->
+ <!-- * -->
+ <!-- * [1] http://www.unicode.org/reports/tr14/ -->
+ <!-- * -->
+ <!-- * We include it here anyway & map to the roff zero-width no-break -->
+ <xsl:output-character
+ character="&#xfeff;"
+ u:name="ZERO WIDTH NO-BREAK SPACE"
+ string="\&amp;"
+ u:block="Arabic Presentation Forms-B"
+ />
+</xsl:character-map>
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/manpages/docbook.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/manpages/docbook.xsl
new file mode 100644
index 0000000..a0a4251
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/manpages/docbook.xsl
@@ -0,0 +1,311 @@
+<?xml version='1.0'?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:exsl="http://exslt.org/common"
+ xmlns:ng="http://docbook.org/docbook-ng"
+ xmlns:db="http://docbook.org/ns/docbook"
+ exclude-result-prefixes="exsl"
+ version='1.0'>
+
+ <xsl:import href="../html/docbook.xsl"/>
+ <xsl:import href="../html/manifest.xsl"/>
+ <!-- * html-synop.xsl file is generated by build -->
+ <xsl:import href="html-synop.xsl"/>
+ <xsl:output method="text"
+ encoding="UTF-8"
+ indent="no"/>
+ <!-- ********************************************************************
+ $Id: docbook.xsl 8841 2010-08-14 07:21:25Z mzjn $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+ <!-- ==================================================================== -->
+
+ <xsl:include href="../common/refentry.xsl"/>
+ <xsl:include href="../common/charmap.xsl"/>
+ <xsl:include href="param.xsl"/>
+ <xsl:include href="utility.xsl"/>
+ <xsl:include href="info.xsl"/>
+ <xsl:include href="other.xsl"/>
+ <xsl:include href="refentry.xsl"/>
+ <xsl:include href="block.xsl"/>
+ <xsl:include href="inline.xsl"/>
+ <xsl:include href="synop.xsl"/>
+ <xsl:include href="lists.xsl"/>
+ <xsl:include href="endnotes.xsl"/>
+ <xsl:include href="table.xsl"/>
+ <xsl:include href="pi.xsl"/>
+
+ <!-- * we rename the following just to avoid using params with "man" -->
+ <!-- * prefixes in the table.xsl stylesheet (because that stylesheet -->
+ <!-- * can potentially be reused for more than just man output) -->
+ <xsl:param name="tbl.font.headings" select="$man.font.table.headings"/>
+ <xsl:param name="tbl.font.title" select="$man.font.table.title"/>
+
+ <xsl:param name="stylesheet.result.type" select="'manpages'"/>
+
+ <!-- ==================================================================== -->
+
+ <xsl:template match="/">
+ <!-- * Get a title for current doc so that we let the user -->
+ <!-- * know what document we are processing at this point. -->
+ <xsl:variable name="doc.title">
+ <xsl:call-template name="get.doc.title"/>
+ </xsl:variable>
+ <xsl:choose>
+ <!-- * when we find a namespaced document, strip the -->
+ <!-- * namespace and then continue processing it. -->
+ <xsl:when test="//self::db:*">
+ <xsl:call-template name="log.message">
+ <xsl:with-param name="level">Note</xsl:with-param>
+ <xsl:with-param name="source" select="$doc.title"/>
+ <xsl:with-param name="context-desc">
+ <xsl:text>namesp. cut</xsl:text>
+ </xsl:with-param>
+ <xsl:with-param name="message">
+ <xsl:text>stripped namespace before processing</xsl:text>
+ </xsl:with-param>
+ </xsl:call-template>
+ <xsl:variable name="stripns">
+ <xsl:apply-templates mode="stripNS"/>
+ </xsl:variable>
+ <xsl:call-template name="log.message">
+ <xsl:with-param name="level">Note</xsl:with-param>
+ <xsl:with-param name="source" select="$doc.title"/>
+ <xsl:with-param name="context-desc">
+ <xsl:text>namesp. cut</xsl:text>
+ </xsl:with-param>
+ <xsl:with-param name="message">
+ <xsl:text>processing stripped document</xsl:text>
+ </xsl:with-param>
+ </xsl:call-template>
+ <xsl:apply-templates select="exsl:node-set($stripns)"/>
+ </xsl:when>
+ <xsl:when test="//*[local-name() = 'refentry']">
+ <!-- * Check to see if we have any refentry children in this -->
+ <!-- * document; if so, process them. The reason we use -->
+ <!-- * local-name()=refentry (instead of just //refentry) to to -->
+ <!-- * check for refentry children is because this stylsheet is -->
+ <!-- * also post-processed by the stylesheet build to create the -->
+ <!-- * manpages/profile-docbook.xsl, and the refentry child check -->
+ <!-- * in the profile-docbook.xsl stylesheet won't work if we do -->
+ <!-- * a simple //refentry check. -->
+ <xsl:apply-templates select="//refentry"/>
+ <!-- * if $man.output.manifest.enabled is non-zero, -->
+ <!-- * generate a manifest file -->
+ <xsl:if test="not($man.output.manifest.enabled = 0)">
+ <xsl:call-template name="generate.manifest">
+ <xsl:with-param name="filename">
+ <xsl:choose>
+ <xsl:when test="not($man.output.manifest.filename = '')">
+ <!-- * If a name for the manifest file is specified, -->
+ <!-- * use that name. -->
+ <xsl:value-of select="$man.output.manifest.filename"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <!-- * Otherwise, if user has unset -->
+ <!-- * $man.output.manifest.filename, default to -->
+ <!-- * using "MAN.MANIFEST" as the filename. Because -->
+ <!-- * $man.output.manifest.enabled is non-zero and -->
+ <!-- * so we must have a filename in order to -->
+ <!-- * generate the manifest. -->
+ <xsl:text>MAN.MANIFEST</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:when>
+ <xsl:otherwise>
+ <!-- * Otherwise, the document does not contain any -->
+ <!-- * refentry elements, so log/emit message and stop. -->
+ <xsl:call-template name="log.message">
+ <xsl:with-param name="level">Erro</xsl:with-param>
+ <xsl:with-param name="source" select="$doc.title"/>
+ <xsl:with-param name="context-desc">
+ <xsl:text> no refentry</xsl:text>
+ </xsl:with-param>
+ <xsl:with-param name="message">
+ <xsl:text>No refentry elements found</xsl:text>
+ <xsl:if test="$doc.title != ''">
+ <xsl:text> in "</xsl:text>
+ <xsl:choose>
+ <xsl:when test="string-length($doc.title) &gt; 30">
+ <xsl:value-of select="substring($doc.title,1,30)"/>
+ <xsl:text>...</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$doc.title"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:text>"</xsl:text>
+ </xsl:if>
+ <xsl:text>.</xsl:text>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+ <!-- ============================================================== -->
+
+ <xsl:template match="refentry">
+ <xsl:param name="lang">
+ <xsl:call-template name="l10n.language"/>
+ </xsl:param>
+ <!-- * Just use the first refname found as the "name" of the man -->
+ <!-- * page (which may different from the "title"...) -->
+ <xsl:variable name="first.refname" select="refnamediv[1]/refname[1]"/>
+
+ <xsl:call-template name="root.messages">
+ <xsl:with-param name="refname" select="$first.refname"/>
+ </xsl:call-template>
+
+ <!-- * Because there are several times when we need to check *info of -->
+ <!-- * each refentry and its ancestors, we get those and store the -->
+ <!-- * data from them as a node-set in memory. -->
+
+ <!-- * Make a node-set with contents of *info -->
+ <xsl:variable name="get.info"
+ select="ancestor-or-self::*/*[substring(local-name(),
+ string-length(local-name()) - 3) = 'info']"
+ />
+ <xsl:variable name="info" select="exsl:node-set($get.info)"/>
+
+ <!-- * The get.refentry.metadata template is in -->
+ <!-- * ../common/refentry.xsl. It looks for metadata in $info -->
+ <!-- * and in various other places and then puts it into a form -->
+ <!-- * that's easier for us to digest. -->
+ <xsl:variable name="get.refentry.metadata">
+ <xsl:call-template name="get.refentry.metadata">
+ <xsl:with-param name="refname" select="$first.refname"/>
+ <xsl:with-param name="info" select="$info"/>
+ <xsl:with-param name="prefs" select="$refentry.metadata.prefs"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:variable name="refentry.metadata" select="exsl:node-set($get.refentry.metadata)"/>
+
+ <!-- * Assemble the various parts into a complete page, then store into -->
+ <!-- * $manpage.contents so that we can manipluate them further. -->
+ <xsl:variable name="manpage.contents">
+ <!-- * preprocessor invocation (need for legacy AT&T troff use) -->
+ <!-- * this tells troff to pre-process the page through tbl(1) -->
+ <!-- * (groff can figure it out automatically, but AT&T troff can't) -->
+ <xsl:text>'\" t&#10;</xsl:text>
+ <!-- * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
+ <!-- * top.comment = commented-out section at top of roff source -->
+ <!-- * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
+ <xsl:call-template name="top.comment">
+ <xsl:with-param name="info" select="$info"/>
+ <xsl:with-param name="date" select="$refentry.metadata/date"/>
+ <xsl:with-param name="title" select="$refentry.metadata/title"/>
+ <xsl:with-param name="manual" select="$refentry.metadata/manual"/>
+ <xsl:with-param name="source" select="$refentry.metadata/source"/>
+ <xsl:with-param name="refname" select="$first.refname"/>
+ </xsl:call-template>
+ <!-- * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
+ <!-- * TH.title.line = title line in header/footer of man page -->
+ <!-- * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
+ <xsl:call-template name="TH.title.line">
+ <!-- * .TH TITLE section extra1 extra2 extra3 -->
+ <!-- * -->
+ <!-- * According to the man(7) man page: -->
+ <!-- * -->
+ <!-- * extra1 = date, "the date of the last revision" -->
+ <!-- * extra2 = source, "the source of the command" -->
+ <!-- * extra3 = manual, "the title of the manual -->
+ <!-- * (e.g., Linux Programmer's Manual)" -->
+ <!-- * -->
+ <!-- * So, we end up with: -->
+ <!-- * -->
+ <!-- * .TH TITLE section date source manual -->
+ <!-- * -->
+ <xsl:with-param name="title" select="$refentry.metadata/title"/>
+ <xsl:with-param name="section" select="$refentry.metadata/section"/>
+ <xsl:with-param name="extra1" select="$refentry.metadata/date"/>
+ <xsl:with-param name="extra2" select="$refentry.metadata/source"/>
+ <xsl:with-param name="extra3" select="$refentry.metadata/manual"/>
+ </xsl:call-template>
+ <!-- * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
+ <!-- * (re)define some macros -->
+ <!-- * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
+ <xsl:call-template name="define.portability.macros"/>
+ <xsl:if test="not($man.output.better.ps.enabled = 0)">
+ <xsl:call-template name="define.macros"/>
+ </xsl:if>
+ <!-- * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
+ <!-- * Set default hyphenation, justification, indentation, and -->
+ <!-- * line-breaking -->
+ <!-- * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
+ <xsl:call-template name="set.default.formatting"/>
+ <!-- * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
+ <!-- * Main body of man page -->
+ <!-- * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
+ <xsl:text>.\" -----------------------------------------------------------------&#10;</xsl:text>
+ <xsl:text>.\" * MAIN CONTENT STARTS HERE *&#10;</xsl:text>
+ <xsl:text>.\" -----------------------------------------------------------------&#10;</xsl:text>
+ <xsl:apply-templates/>
+ <!-- * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
+ <!-- * AUTHOR section -->
+ <!-- * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
+ <xsl:if test="not($man.authors.section.enabled = 0)">
+ <xsl:call-template name="author.section">
+ <xsl:with-param name="info" select="$info"/>
+ </xsl:call-template>
+ </xsl:if>
+ <!-- * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
+ <!-- * COPYRIGHT section -->
+ <!-- * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
+ <xsl:if test="not($man.copyright.section.enabled = 0)">
+ <xsl:call-template name="copyright.section">
+ <xsl:with-param name="info" select="$info"/>
+ </xsl:call-template>
+ </xsl:if>
+ <!-- * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
+ <!-- * NOTES list (only if user wants endnotes numbered and/or listed) -->
+ <!-- * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
+ <xsl:if test="$man.endnotes.list.enabled != 0 or
+ $man.endnotes.are.numbered != 0">
+ <xsl:call-template name="endnotes.list"/>
+ </xsl:if>
+ </xsl:variable> <!-- * end of manpage.contents -->
+
+ <!-- * Prepare the page contents for final output, then store in -->
+ <!-- * $manpage.contents.prepared so the we can pass it on to the -->
+ <!-- * write.text.chunk() function -->
+ <xsl:variable name="manpage.contents.prepared">
+ <!-- * "Preparing" the page contents involves, at a minimum, -->
+ <!-- * doubling any backslashes found (so they aren't interpreted -->
+ <!-- * as roff escapes). -->
+ <!-- * -->
+ <!-- * If $charmap.enabled is true, "preparing" the page contents also -->
+ <!-- * involves applying a character map to convert Unicode symbols and -->
+ <!-- * special characters into corresponding roff escape sequences. -->
+ <xsl:call-template name="prepare.manpage.contents">
+ <xsl:with-param name="content" select="$manpage.contents"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <!-- * Write the prepared page contents to disk to create -->
+ <!-- * the final man page. -->
+ <xsl:call-template name="write.man.file">
+ <xsl:with-param name="name" select="$first.refname"/>
+ <xsl:with-param name="section" select="$refentry.metadata/section"/>
+ <xsl:with-param name="lang" select="$lang"/>
+ <xsl:with-param name="content" select="$manpage.contents.prepared"/>
+ </xsl:call-template>
+
+ <!-- * Generate "stub" (alias) pages (if any needed) -->
+ <xsl:call-template name="write.stubs">
+ <xsl:with-param name="first.refname" select="$first.refname"/>
+ <xsl:with-param name="section" select="$refentry.metadata/section"/>
+ <xsl:with-param name="lang" select="$lang"/>
+ </xsl:call-template>
+
+ </xsl:template>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/manpages/endnotes.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/manpages/endnotes.xsl
new file mode 100644
index 0000000..8e52e01
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/manpages/endnotes.xsl
@@ -0,0 +1,586 @@
+<?xml version='1.0'?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:exsl="http://exslt.org/common"
+ xmlns:ng="http://docbook.org/docbook-ng"
+ xmlns:db="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ exclude-result-prefixes="db ng exsl xlink"
+ version='1.0'>
+
+<!-- ********************************************************************
+ $Id: endnotes.xsl 8703 2010-07-06 20:57:06Z nwalsh $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<!-- ==================================================================== -->
+<!-- * -->
+<!-- * The templates in this file handle elements whose contents can't -->
+<!-- * be displayed completely within the main text flow in output, but -->
+<!-- * instead need to be displayed "out of line". Those elements are: -->
+<!-- * -->
+<!-- * - elements providing annotative text (annotation|alt|footnote) -->
+<!-- * - elements pointing at external resources (ulink, link, and -->
+<!-- * any elements with xlink:href attributes; and imagedata, -->
+<!-- * audiodata, and videodata - which (using their fileref -->
+<!-- * attribute) reference external files -->
+<!-- * -->
+<!-- * Within this stylesheet, the above are collectively referred to as -->
+<!-- * a "notesources". This stylesheet handles those notesources in -->
+<!-- * this way: -->
+<!-- * -->
+<!-- * 1. Constructs a numbered in-memory index of all unique "earmarks“ -->
+<!-- * of all notesources in the document. For each link, the -->
+<!-- * earmark is the value of its url or xlink:href attribute; for -->
+<!-- * each imagedata|audiodata|videodata: the value of its fileref -->
+<!-- * attribute; for each annotative element: its content. -->
+<!-- * -->
+<!-- * Notesources with the same earmark are assigned the same -->
+<!-- * number. -->
+<!-- * -->
+<!-- * By design, that index excludes any element whose string value -->
+<!-- * is identical to the value of its url xlink:href attribute). -->
+<!-- * -->
+<!-- * 2. Puts a numbered marker inline to mark the place where the -->
+<!-- * notesource occurs in the main text flow. -->
+<!-- * -->
+<!-- * 3. Generates a numbered endnotes list (titled NOTES in English) -->
+<!-- * at the end of the man page, with the contents of each -->
+<!-- * notesource. -->
+<!-- * -->
+<!-- * Note that table footnotes are not listed in the endnotes list, -->
+<!-- * and are not handled by this stylesheet (they are instead handled -->
+<!-- * by the table.xsl stylesheet). -->
+<!-- * -->
+<!-- * Also, we don't get notesources in *info sections or Refmeta or -->
+<!-- * Refnamediv or Indexterm, because, in manpages output, contents of -->
+<!-- * those are either suppressed or are displayed out of document -->
+<!-- * order - for example, the Info/Author content gets moved to the -->
+<!-- * end of the page. So, if we were to number notesources in the -->
+<!-- * Author content, it would "throw off" the numbering at the -->
+<!-- * beginning of the main text flow. -->
+<!-- * -->
+<!-- * And for the record, one reason we don't use xsl:key to index the -->
+<!-- * earmarks is that we need to get and check the sets of -->
+<!-- * earmarks for uniqueness per-Refentry (not per-document). -->
+<!-- * -->
+<!-- * FIXME: -->
+<!-- * as with "repeat" URLS, alt instances that have the same string value -->
+<!-- * as preceding ones (likely to occur for repeat acroynyms and -->
+<!-- * abbreviations) should be listed only once in the endnotes list, -->
+<!-- * and numbered accordingly inline; split man.indent.width into -->
+<!-- * man.indent.width.value (default 4) and man.indent.width.units -->
+<!-- * (default n); also, if the first child of notesource is some block -->
+<!-- * content other than a (non-formal) paragraph, the current code -->
+<!-- * will probably end up generating a blank line after the -->
+<!-- * corresponding number in the endnotes list... we should probably -->
+<!-- * try to instead display the title of that block content there (if -->
+<!-- * there is one: e.g., the list title, admonition title, etc.) -->
+
+<!-- ==================================================================== -->
+
+<xsl:template name="get.all.earmark.indexes.in.current.document">
+ <!-- * Here we create a tree to hold indexes of all earmarks in -->
+ <!-- * the current document. If the current document contains -->
+ <!-- * multiple refentry instances, then this tree will contain -->
+ <!-- * multiple indexes. -->
+ <xsl:if test="$man.endnotes.are.numbered != 0">
+ <!-- * Only create earmark indexes if user wants numbered endnotes -->
+ <xsl:for-each select="//refentry">
+ <earmark.index>
+ <xsl:attribute name="idref">
+ <xsl:value-of select="generate-id()"/>
+ </xsl:attribute>
+ <xsl:for-each
+ select=".//*[self::*[@xlink:href]
+ or self::ulink
+ or self::imagedata
+ or self::audiodata
+ or self::videodata
+ or self::footnote[not(ancestor::table)]
+ or self::annotation
+ or self::alt]
+ [(node()
+ or self::imagedata
+ or self::audiodata
+ or self::videodata
+ )
+ and not(ancestor::refentryinfo)
+ and not(ancestor::info)
+ and not(ancestor::docinfo)
+ and not(ancestor::refmeta)
+ and not(ancestor::refnamediv)
+ and not(ancestor::indexterm)
+ and not(. = @url)
+ and not(. = @xlink:href)
+ and not(@url =
+ preceding::ulink[node()
+ and not(ancestor::refentryinfo)
+ and not(ancestor::info)
+ and not(ancestor::docinfo)
+ and not(ancestor::refmeta)
+ and not(ancestor::refnamediv)
+ and not(ancestor::indexterm)
+ and (generate-id(ancestor::refentry)
+ = generate-id(current()))]/@url)
+ and not(@xlink:href =
+ preceding::*[@xlink:href][node()
+ and not(ancestor::refentryinfo)
+ and not(ancestor::info)
+ and not(ancestor::docinfo)
+ and not(ancestor::refmeta)
+ and not(ancestor::refnamediv)
+ and not(ancestor::indexterm)
+ and (generate-id(ancestor::refentry)
+ = generate-id(current()))]/@xlink:href)
+ and not(@fileref =
+ preceding::*[@fileref][
+ not(ancestor::refentryinfo)
+ and not(ancestor::info)
+ and not(ancestor::docinfo)
+ and not(ancestor::refmeta)
+ and not(ancestor::refnamediv)
+ and not(ancestor::indexterm)
+ and (generate-id(ancestor::refentry)
+ = generate-id(current()))]/@fileref)]">
+ <earmark>
+ <xsl:attribute name="id">
+ <xsl:value-of select="generate-id()"/>
+ </xsl:attribute>
+ <xsl:attribute name="number">
+ <xsl:value-of select="position()"/>
+ </xsl:attribute>
+ <xsl:if test="@url|@xlink:href|@fileref">
+ <!-- * Only add a uri attribute if the notesource is -->
+ <!-- * a link or an element that references an external -->
+ <!-- * (an imagedata, audiodata, or videodata element) -->
+ <xsl:attribute name="uri">
+ <xsl:value-of select="@url|@xlink:href|@fileref"/>
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:copy>
+ <xsl:copy-of select="node()"/>
+ </xsl:copy>
+ </earmark>
+ </xsl:for-each>
+ </earmark.index>
+ </xsl:for-each>
+ </xsl:if>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="*[@xlink:href]|ulink
+ |imagedata|audiodata|videodata
+ |footnote[not(ancestor::table)]
+ |annotation|alt">
+ <xsl:variable name="refname" select="ancestor::refentry/refnamediv[1]/refname[1]"/>
+ <xsl:variable name="all.earmark.indexes.in.current.document.rtf">
+ <xsl:call-template name="get.all.earmark.indexes.in.current.document"/>
+ </xsl:variable>
+ <xsl:variable name="all.earmark.indexes.in.current.document"
+ select="exsl:node-set($all.earmark.indexes.in.current.document.rtf)"/>
+ <xsl:variable name="all.earmarks.in.current.refentry.rtf">
+ <!-- * get the set of all earmarks for the ancestor Refentry of -->
+ <!-- * this notesource -->
+ <xsl:copy-of
+ select="$all.earmark.indexes.in.current.document/earmark.index
+ [@idref =
+ generate-id(current()/ancestor::refentry)]/earmark"/>
+ </xsl:variable>
+ <xsl:variable name="all.earmarks.in.current.refentry"
+ select="exsl:node-set($all.earmarks.in.current.refentry.rtf)"/>
+
+ <!-- * identify the earmark for the current element -->
+ <xsl:variable name="earmark">
+ <xsl:choose>
+ <xsl:when test="@url|@xlink:href">
+ <xsl:value-of select="@url|@xlink:href"/>
+ </xsl:when>
+ <xsl:when test="@fileref">
+ <xsl:value-of select="@fileref"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="generate-id()"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="notesource.number">
+ <!-- * Get the number for this notesource -->
+ <!-- * -->
+ <!-- * If this is an imagedata, audiodata, or videodata element -->
+ <!-- * OR if it's a non-empty element AND its string value is not -->
+ <!-- * equal to the value of its url or xlink:href attribute (if -->
+ <!-- * it has one) AND user wants endnotes numbered, only then -->
+ <!-- * do we output a number for it -->
+ <xsl:if test="(self::imagedata or
+ self::audiodata or
+ self::videodata or
+ (node()
+ and not(. = @url)
+ and not(. = @xlink:href))
+ )
+ and $man.endnotes.are.numbered != 0">
+ <!-- * To select the number for this notesource, we -->
+ <!-- * check the index of all earmarks for the current refentry -->
+ <!-- * and find the number of the indexed earmark which matches -->
+ <!-- * this notesource's earmark. -->
+ <!-- * Note that multiple notesources may share the same -->
+ <!-- * numbered earmark; in that case, they get the same number. -->
+ <!-- * -->
+ <xsl:choose>
+ <xsl:when test="self::ulink or
+ self::*[@xlink:href] or
+ self::imagedata or
+ self::audiodata or
+ self::videodata">
+ <xsl:value-of select="$all.earmarks.in.current.refentry/earmark[@uri = $earmark]/@number"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$all.earmarks.in.current.refentry/earmark[@id = $earmark]/@number"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:if>
+ </xsl:variable>
+
+ <xsl:variable name="notesource.contents">
+ <xsl:choose>
+ <!-- * check to see if the element is empty or not -->
+ <xsl:when test="node()">
+ <!-- * this is a non-empty node, so process its contents -->
+ <xsl:apply-templates/>
+ <xsl:if test="../footnote or ../annotation">
+ <!-- * if this element is a footnote or annotation, we need to -->
+ <!-- * do some further checking on it, so we can emit warnings -->
+ <!-- * about potential problems -->
+ <xsl:for-each select="node()">
+ <xsl:if test="local-name() != 'para' and
+ local-name() != 'simpara' and
+ local-name() !=''">
+ <!-- * for each node we find as a child of a footnote or -->
+ <!-- * annotation, if it's not a para or a text node, emit a -->
+ <!-- * warning... because in manpages output, we can't render -->
+ <!-- * block-level child content of an endnote properly unless -->
+ <!-- * it's wrapped in a para that has some "prefatory" text -->
+ <xsl:variable name="parent-name" select="local-name(..)"/>
+ <xsl:variable name="endnote-number">
+ <xsl:call-template name="pad-string">
+ <!-- * endnote number may be 2 digits, so pad it with a space -->
+ <!-- * if we have only 1 digit -->
+ <xsl:with-param name="padVar" select="concat('#',$notesource.number)"/>
+ <xsl:with-param name="length" select="3"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:call-template name="log.message">
+ <xsl:with-param name="level">Warn</xsl:with-param>
+ <xsl:with-param name="source" select="$refname"/>
+ <xsl:with-param name="context-desc">
+ <xsl:text>endnote </xsl:text>
+ <xsl:value-of select="$endnote-number"/>
+ </xsl:with-param>
+ <xsl:with-param name="message">
+ <xsl:text>Bad: </xsl:text>
+ <xsl:value-of select="$parent-name"/>
+ <!-- * figure out which occurance of this element type this -->
+ <!-- * instance is and output a number in square brackets so -->
+ <!-- * that end-user can know which element to fix -->
+ <xsl:text>[</xsl:text>
+ <xsl:value-of select="count(preceding::*[local-name() = $parent-name]) + 1"/>
+ <xsl:text>]</xsl:text>
+ <xsl:text> in source</xsl:text>
+ </xsl:with-param>
+ </xsl:call-template>
+ <xsl:call-template name="log.message">
+ <xsl:with-param name="level">Note</xsl:with-param>
+ <xsl:with-param name="source" select="$refname"/>
+ <xsl:with-param name="context-desc">
+ <xsl:text>endnote </xsl:text>
+ <xsl:value-of select="$endnote-number"/>
+ </xsl:with-param>
+ <xsl:with-param name="message">
+ <xsl:text>Has: </xsl:text>
+ <xsl:value-of select="$parent-name"/>
+ <xsl:text>/</xsl:text>
+ <xsl:value-of select="local-name(.)"/>
+ </xsl:with-param>
+ </xsl:call-template>
+ <xsl:call-template name="log.message">
+ <xsl:with-param name="level">Note</xsl:with-param>
+ <xsl:with-param name="source" select="$refname"/>
+ <xsl:with-param name="context-desc">
+ <xsl:text>endnote </xsl:text>
+ <xsl:value-of select="$endnote-number"/>
+ </xsl:with-param>
+ <xsl:with-param name="message">
+ <xsl:text>Fix: </xsl:text>
+ <xsl:value-of select="$parent-name"/>
+ <xsl:text>/</xsl:text>
+ <xsl:text>para/</xsl:text>
+ <xsl:value-of select="local-name(.)"/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:for-each>
+ </xsl:if>
+ </xsl:when>
+ <xsl:otherwise>
+ <!-- * Otherwise this is an empty link or an empty imagedata, -->
+ <!-- * audiodata, or videodata element, so we just get the -->
+ <!-- * value of its url, xlink:href, or fileref attribute. -->
+ <xsl:if test="$man.hyphenate.urls = 0
+ and $man.break.after.slash = 0">
+ <!-- * Add hyphenation suppression in URL output only if -->
+ <!-- * break.after.slash is also non-zero -->
+ <xsl:call-template name="suppress.hyphenation"/>
+ <xsl:text>\%</xsl:text>
+ </xsl:if>
+ <xsl:value-of select="$earmark"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:if test="self::ulink or self::*[@xlink:href]">
+ <xsl:variable name="link.wrapper">
+ <xsl:value-of select="normalize-space($notesource.contents)"/>
+ </xsl:variable>
+ <xsl:text>\m[blue]</xsl:text>
+ <!-- * This is a hyperlink, so we need to determine if the user wants -->
+ <!-- * font formatting applied to it, and if so, what font -->
+ <xsl:choose>
+ <xsl:when test="$man.font.links = 'B'">
+ <xsl:call-template name="bold">
+ <xsl:with-param name="node" select="exsl:node-set($link.wrapper)"/>
+ <xsl:with-param name="context" select="."/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="$man.font.links = 'I'">
+ <xsl:call-template name="italic">
+ <xsl:with-param name="node" select="exsl:node-set($link.wrapper)"/>
+ <xsl:with-param name="context" select="."/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="$man.font.links = ''">
+ <!-- * if man.font.links is empty, user doesn't want links -->
+ <!-- * underlined, so just display content -->
+ <xsl:value-of select="$notesource.contents"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <!-- * otherwise the user has specified an unsupported value for -->
+ <!-- * man.font.links, so emit a warning and don't apply any font -->
+ <!-- * formatting -->
+ <xsl:message>
+ <xsl:call-template name="log.message">
+ <xsl:with-param name="level">Warn</xsl:with-param>
+ <xsl:with-param name="source" select="$refname"/>
+ <xsl:with-param name="context-desc">
+ <xsl:text>link font</xsl:text>
+ </xsl:with-param>
+ <xsl:with-param name="message">
+ <xsl:text>invalid $man.font.links value: </xsl:text>
+ <xsl:text>'</xsl:text>
+ <xsl:value-of select="$man.font.links"/>
+ <xsl:text>'</xsl:text>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:message>
+ <xsl:value-of select="$notesource.contents"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:text>\m[]</xsl:text>
+ </xsl:if>
+
+ <xsl:if test="$notesource.number != ''">
+ <!-- * Format the number by placing it in square brackets. -->
+ <!-- * Also, set the number in font-size -2, and superscripted (\u -->
+ <!-- * means to move up half a line vertically) -->
+ <xsl:text>\&amp;\s-2\u[</xsl:text>
+ <xsl:value-of select="$notesource.number"/>
+ <xsl:text>]\d\s+2</xsl:text>
+ <!-- * Revert superscripting (\d means to move down half a line), and -->
+ <!-- * move the font-size back to what it was before. -->
+ <!-- * Note that the reason for the \& before the opening bracket -->
+ <!-- * is to prevent any possible linebreak from being introduced -->
+ <!-- * between the opening bracket and the following text. -->
+ </xsl:if>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template name="endnotes.list">
+ <!-- We have stored earmark indexes for all refentry instances in the -->
+ <!-- current document, with the ID for each index being the same ID as -->
+ <!-- its corresponding refentry; so we now need to get the ID for the -->
+ <!-- current refentry so we can grab its corresponding earmark index -->
+ <xsl:variable name="current.refentry.id">
+ <xsl:value-of select="generate-id(.)"/>
+ </xsl:variable>
+
+ <xsl:variable name="endnotes.rtf">
+ <xsl:variable name="all.earmark.indexes.in.current.document.rtf">
+ <xsl:call-template name="get.all.earmark.indexes.in.current.document"/>
+ </xsl:variable>
+ <xsl:variable name="all.earmark.indexes.in.current.document"
+ select="exsl:node-set($all.earmark.indexes.in.current.document.rtf)"/>
+ <xsl:copy-of
+ select="$all.earmark.indexes.in.current.document/earmark.index
+ [@idref = $current.refentry.id]/earmark"/>
+ </xsl:variable>
+
+ <xsl:variable name="endnotes" select="exsl:node-set($endnotes.rtf)"/>
+
+ <!-- * check to see if we have actually found any content to use as -->
+ <!-- * endnotes; if we have, we generate the endnotes list, if not, -->
+ <!-- * we do nothing -->
+ <xsl:if test="$endnotes/node()">
+ <xsl:call-template name="format.endnotes.list">
+ <xsl:with-param name="endnotes" select="$endnotes"/>
+ </xsl:call-template>
+ </xsl:if>
+
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template name="format.endnotes.list">
+ <xsl:param name="endnotes"/>
+
+ <!-- * ======= make the endnotes-list section heading ============= -->
+ <xsl:call-template name="make.subheading">
+ <xsl:with-param name="title">
+ <xsl:choose>
+ <!-- * if user has specified a heading, use that -->
+ <xsl:when test="$man.endnotes.list.heading != ''">
+ <xsl:value-of select="$man.endnotes.list.heading"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <!-- * otherwise, get localized heading from gentext -->
+ <!-- * (in English, NOTES) -->
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'Notes'"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:with-param>
+ </xsl:call-template>
+
+ <!-- * ================ process each earmark ====================== -->
+ <xsl:for-each select="$endnotes/earmark">
+ <!-- * make paragraph with hanging indent, and starting with a -->
+ <!-- * number in the form " 1." (padded to $man.indent.width - 1) -->
+ <xsl:text>.IP</xsl:text>
+ <xsl:text> "</xsl:text>
+ <xsl:variable name="endnote.number">
+ <xsl:value-of select="@number"/>
+ <xsl:text>.</xsl:text>
+ </xsl:variable>
+ <xsl:call-template name="pad-string">
+ <xsl:with-param name="padVar" select="$endnote.number"/>
+ <!-- FIXME: the following assumes that $man.indent.width is in -->
+ <!-- en's; also, this should probably use $list.indent instead -->
+ <xsl:with-param name="length" select="$man.indent.width - 1"/>
+ </xsl:call-template>
+ <xsl:text>"</xsl:text>
+ <xsl:if test="not($list-indent = '')">
+ <xsl:text> </xsl:text>
+ <xsl:value-of select="$list-indent"/>
+ </xsl:if>
+ <xsl:text>&#10;</xsl:text>
+
+ <!-- * ========================================================= -->
+ <!-- * print the notesource/endnote contents -->
+ <!-- * ========================================================= -->
+ <xsl:choose>
+ <xsl:when test="*/node()">
+ <!-- * if the earmark has non-empty child content, then -->
+ <!-- * its corresponding notesource is either a link or -->
+ <!-- * an instance of annotative text, so we want to -->
+ <!-- * display that content -->
+ <xsl:choose>
+ <xsl:when test="*/node()[name(.)!='']">
+ <!-- * if node is not text only, then process it as-is -->
+ <xsl:apply-templates select="*/node()"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <!-- * otherwise node is text-only, so normalize it -->
+ <xsl:value-of select="normalize-space(*/node())"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <!-- * otherwise, this earmark has empty content, -->
+ <!-- * which means its corresponding notesource is an -->
+ <!-- * imagedata, audiodata, or videodata instance; in -->
+ <!-- * that case, we use the value of the notesource's -->
+ <!-- * @fileref attribute (which is stored in the -->
+ <!-- * earmark uri attribute) as the "contents" for -->
+ <!-- * this endnote/notesource -->
+ <xsl:call-template name="display.uri">
+ <xsl:with-param name="uri" select="@uri"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:text>&#10;</xsl:text>
+
+ <!-- * ========================================================= -->
+ <!-- * print the URL for links -->
+ <!-- * ========================================================= -->
+ <!-- * In addition to the notesource contents, if the -->
+ <!-- * notesource is a link, we display the URL for the link. -->
+ <!-- * But for notesources that are imagedata, audiodata, or -->
+ <!-- * videodata instances, we don't want to (re)display the -->
+ <!-- * URL for those here, because for those elements, the -->
+ <!-- * notesource contents are the URL (the value of the -->
+ <!-- * @fileref attribute), and we have already rendered them. -->
+ <!-- * -->
+ <!-- * We know an earmark is a link if it has non-empty child -->
+ <!-- * content and a uri attribute; so we check for that -->
+ <!-- * condition here. -->
+ <xsl:if test="*/node() and @uri">
+ <xsl:text>.RS</xsl:text>
+ <xsl:if test="not($list-indent = '')">
+ <xsl:text> </xsl:text>
+ <xsl:value-of select="$list-indent"/>
+ </xsl:if>
+ <xsl:text>&#10;</xsl:text>
+ <!-- * Add hyphenation suppression in URL output only if -->
+ <!-- * $break.after.slash is also non-zero -->
+ <xsl:if test="$man.hyphenate.urls = 0
+ and $man.break.after.slash = 0">
+ <xsl:call-template name="suppress.hyphenation"/>
+ <xsl:text>\%</xsl:text>
+ </xsl:if>
+ <xsl:call-template name="display.uri">
+ <xsl:with-param name="uri" select="@uri"/>
+ </xsl:call-template>
+ <xsl:text>&#10;</xsl:text>
+ <xsl:text>.RE</xsl:text>
+ <xsl:text>&#10;</xsl:text>
+ </xsl:if>
+
+ </xsl:for-each>
+</xsl:template>
+
+<xsl:template name="display.uri">
+ <xsl:param name="uri"/>
+ <xsl:choose>
+ <xsl:when test="contains($uri, ':')">
+ <!-- * if this URI contains a colon character, it’s probably -->
+ <!-- * an absolute URI with a scheme, so we output it as-is -->
+ <xsl:value-of select="$uri"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <!-- * otherwise this is probably not an absolute URI, so we -->
+ <!-- * need to prepend $man.base.url.for.relative.links to -->
+ <!-- * give the URI some "context" in man-page output -->
+ <xsl:value-of
+ select="concat($man.base.url.for.relative.links, $uri)"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/manpages/html-synop.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/manpages/html-synop.xsl
new file mode 100644
index 0000000..06c3eb2
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/manpages/html-synop.xsl
@@ -0,0 +1,1567 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
+
+<!-- ********************************************************************
+ $Id: synop.xsl 8421 2009-05-04 07:49:49Z bobstayton $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<!-- ==================================================================== -->
+
+<!-- synopsis is in verbatim -->
+
+<!-- ==================================================================== -->
+
+<xsl:template match="cmdsynopsis">
+ <div>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <p>
+ <xsl:if test="..//processing-instruction('dbcmdlist')">
+ <!-- * Placing a dbcmdlist PI as a child of a particular element -->
+ <!-- * creates a hyperlinked list of all cmdsynopsis instances -->
+ <!-- * that are descendants of that element; so for any -->
+ <!-- * cmdsynopsis that is a descendant of an element containing -->
+ <!-- * a dbcmdlist PI, we need to output an a@id instance so that -->
+ <!-- * we will have something to link to -->
+ <xsl:call-template name="anchor">
+ <xsl:with-param name="conditional" select="0"/>
+ </xsl:call-template>
+ </xsl:if>
+ <xsl:apply-templates/>
+ </p>
+ </div>
+</xsl:template>
+
+<xsl:template match="cmdsynopsis/command">
+ <xsl:text>
+.
+</xsl:text>
+ <xsl:call-template name="inline.monoseq"/>
+ <xsl:text> </xsl:text>
+</xsl:template>
+
+<xsl:template match="cmdsynopsis/command[1]" priority="2">
+ <xsl:call-template name="inline.monoseq"/>
+ <xsl:text> </xsl:text>
+</xsl:template>
+
+<xsl:template match="group|arg" name="group-or-arg">
+ <xsl:variable name="choice" select="@choice"/>
+ <xsl:variable name="rep" select="@rep"/>
+ <xsl:variable name="sepchar">
+ <xsl:choose>
+ <xsl:when test="ancestor-or-self::*/@sepchar">
+ <xsl:value-of select="ancestor-or-self::*/@sepchar"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text> </xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:if test="preceding-sibling::*">
+ <xsl:value-of select="$sepchar"/>
+ </xsl:if>
+ <xsl:choose>
+ <xsl:when test="$choice='plain'">
+ <xsl:value-of select="$arg.choice.plain.open.str"/>
+ </xsl:when>
+ <xsl:when test="$choice='req'">
+ <xsl:value-of select="$arg.choice.req.open.str"/>
+ </xsl:when>
+ <xsl:when test="$choice='opt'">
+ <xsl:value-of select="$arg.choice.opt.open.str"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$arg.choice.def.open.str"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:apply-templates/>
+ <xsl:choose>
+ <xsl:when test="$rep='repeat'">
+ <xsl:value-of select="$arg.rep.repeat.str"/>
+ </xsl:when>
+ <xsl:when test="$rep='norepeat'">
+ <xsl:value-of select="$arg.rep.norepeat.str"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$arg.rep.def.str"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:choose>
+ <xsl:when test="$choice='plain'">
+ <xsl:value-of select="$arg.choice.plain.close.str"/>
+ </xsl:when>
+ <xsl:when test="$choice='req'">
+ <xsl:value-of select="$arg.choice.req.close.str"/>
+ </xsl:when>
+ <xsl:when test="$choice='opt'">
+ <xsl:value-of select="$arg.choice.opt.close.str"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$arg.choice.def.close.str"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="group/arg">
+ <xsl:variable name="choice" select="@choice"/>
+ <xsl:variable name="rep" select="@rep"/>
+ <xsl:if test="preceding-sibling::*">
+ <xsl:value-of select="$arg.or.sep"/>
+ </xsl:if>
+ <xsl:call-template name="group-or-arg"/>
+</xsl:template>
+
+<xsl:template match="sbr">
+ <xsl:text>
+.
+</xsl:text>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="synopfragmentref">
+ <xsl:variable name="target" select="key('id',@linkend)"/>
+ <xsl:variable name="snum">
+ <xsl:apply-templates select="$target" mode="synopfragment.number"/>
+ </xsl:variable>
+ <i>
+ <a href="#{@linkend}">
+ <xsl:text>(</xsl:text>
+ <xsl:value-of select="$snum"/>
+ <xsl:text>)</xsl:text>
+ </a>
+ <xsl:text> </xsl:text>
+ <xsl:apply-templates/>
+ </i>
+</xsl:template>
+
+<xsl:template match="synopfragment" mode="synopfragment.number">
+ <xsl:number format="1"/>
+</xsl:template>
+
+<xsl:template match="synopfragment">
+ <xsl:variable name="snum">
+ <xsl:apply-templates select="." mode="synopfragment.number"/>
+ </xsl:variable>
+ <!-- You can't introduce another <p> here, because you're
+ already in a <p> from cmdsynopsis-->
+ <span>
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+ <a name="{$id}">
+ <xsl:text>(</xsl:text>
+ <xsl:value-of select="$snum"/>
+ <xsl:text>)</xsl:text>
+ </a>
+ <xsl:text> </xsl:text>
+ <xsl:apply-templates/>
+ </span>
+</xsl:template>
+
+<xsl:template match="funcsynopsis">
+ <xsl:if test="..//processing-instruction('dbfunclist')">
+ <!-- * Placing a dbfunclist PI as a child of a particular element -->
+ <!-- * creates a hyperlinked list of all funcsynopsis instances that -->
+ <!-- * are descendants of that element; so for any funcsynopsis that is -->
+ <!-- * a descendant of an element containing a dbfunclist PI, we need -->
+ <!-- * to output an a@id instance so that we will have something to -->
+ <!-- * link to -->
+ <xsl:call-template name="anchor">
+ <xsl:with-param name="conditional" select="0"/>
+ </xsl:call-template>
+ </xsl:if>
+ <xsl:call-template name="informal.object"/>
+</xsl:template>
+
+<xsl:template match="funcsynopsisinfo">
+ <xsl:text>.sp
+</xsl:text><xsl:text>.nf
+</xsl:text><pre>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates/>
+ </pre><xsl:text/><xsl:text>.fi
+</xsl:text>
+</xsl:template>
+
+<!-- ====================================================================== -->
+<!-- funcprototype -->
+<!--
+
+funcprototype ::= (funcdef,
+ (void|varargs|paramdef+))
+
+funcdef ::= (#PCDATA|type|replaceable|function)*
+
+paramdef ::= (#PCDATA|type|replaceable|parameter|funcparams)*
+-->
+
+<xsl:template match="funcprototype">
+ <xsl:variable name="html-style">
+ <xsl:call-template name="pi.dbhtml_funcsynopsis-style">
+ <xsl:with-param name="node" select="ancestor::funcsynopsis/descendant-or-self::*"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="style">
+ <xsl:choose>
+ <xsl:when test="$html-style != ''">
+ <xsl:value-of select="$html-style"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$funcsynopsis.style"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+<!-- * 2008-02-17. the code no longer relies on the funcsynopsis.tabular.threshold -->
+<!-- * param at all (the stuff below has been commented out since mid -->
+<!-- * 2006), so I completely removed the funcsynopsis.tabular.threshold param -->
+<!-- * .. MikeSmith -->
+<!--
+ <xsl:variable name="tabular-p"
+ select="$funcsynopsis.tabular.threshold &gt; 0
+ and string-length(.) &gt; $funcsynopsis.tabular.threshold"/>
+-->
+
+ <xsl:variable name="tabular-p" select="true()"/>
+
+ <xsl:choose>
+ <xsl:when test="$style = 'kr' and $tabular-p">
+ <xsl:apply-templates select="." mode="kr-tabular"/>
+ </xsl:when>
+ <xsl:when test="$style = 'kr'">
+ <xsl:apply-templates select="." mode="kr-nontabular"/>
+ </xsl:when>
+ <xsl:when test="$style = 'ansi' and $tabular-p">
+ <xsl:apply-templates select="." mode="ansi-tabular"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="." mode="ansi-nontabular"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ====================================================================== -->
+<!-- funcprototype: kr, non-tabular -->
+
+<xsl:template match="funcprototype" mode="kr-nontabular">
+ <p>
+ <xsl:apply-templates mode="kr-nontabular"/>
+ <xsl:if test="paramdef">
+ <xsl:text>
+.
+</xsl:text>
+ <xsl:apply-templates select="paramdef" mode="kr-funcsynopsis-mode"/>
+ </xsl:if>
+ </p>
+</xsl:template>
+
+<xsl:template match="funcdef" mode="kr-nontabular">
+ <code>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="kr-nontabular"/>
+ <xsl:text>(</xsl:text>
+ </code>
+</xsl:template>
+
+<xsl:template match="funcdef/function" mode="kr-nontabular">
+ <xsl:choose>
+ <xsl:when test="$funcsynopsis.decoration != 0">
+ <b class="fsfunc"><xsl:apply-templates mode="kr-nontabular"/></b>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates mode="kr-nontabular"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="void" mode="kr-nontabular">
+ <code>)</code>
+ <xsl:text>;</xsl:text>
+</xsl:template>
+
+<xsl:template match="varargs" mode="kr-nontabular">
+ <xsl:text>...</xsl:text>
+ <code>)</code>
+ <xsl:text>;</xsl:text>
+</xsl:template>
+
+<xsl:template match="paramdef" mode="kr-nontabular">
+ <xsl:apply-templates select="parameter" mode="kr-nontabular"/>
+ <xsl:choose>
+ <xsl:when test="following-sibling::*">
+ <xsl:text>, </xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <code>)</code>
+ <xsl:text>;</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="paramdef/parameter" mode="kr-nontabular">
+ <xsl:choose>
+ <xsl:when test="$funcsynopsis.decoration != 0">
+ <var class="pdparam">
+ <xsl:apply-templates mode="kr-nontabular"/>
+ </var>
+ </xsl:when>
+ <xsl:otherwise>
+ <code>
+ <xsl:apply-templates mode="kr-nontabular"/>
+ </code>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="paramdef" mode="kr-funcsynopsis-mode">
+ <xsl:if test="preceding-sibling::paramdef"><xsl:text>
+.
+</xsl:text></xsl:if>
+ <code>
+ <xsl:apply-templates mode="kr-funcsynopsis-mode"/>
+ </code>
+ <xsl:text>;</xsl:text>
+</xsl:template>
+
+<xsl:template match="paramdef/parameter" mode="kr-funcsynopsis-mode">
+ <xsl:choose>
+ <xsl:when test="$funcsynopsis.decoration != 0">
+ <var class="pdparam">
+ <xsl:apply-templates mode="kr-funcsynopsis-mode"/>
+ </var>
+ </xsl:when>
+ <xsl:otherwise>
+ <code>
+ <xsl:apply-templates mode="kr-funcsynopsis-mode"/>
+ </code>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="funcparams" mode="kr-funcsynopsis-mode">
+ <code>(</code>
+ <xsl:apply-templates mode="kr-funcsynopsis-mode"/>
+ <code>)</code>
+</xsl:template>
+
+<!-- ====================================================================== -->
+<!-- funcprototype: kr, tabular -->
+
+<xsl:template match="funcprototype" mode="kr-tabular">
+ <table border="0" summary="Function synopsis" cellspacing="0" cellpadding="0" class="funcprototype-table">
+ <tr>
+ <td>
+ <xsl:apply-templates select="funcdef" mode="kr-tabular"/>
+ </td>
+ <xsl:apply-templates select="(void|varargs|paramdef)[1]" mode="kr-tabular"/>
+ </tr>
+ <xsl:for-each select="(void|varargs|paramdef)[preceding-sibling::*[not(self::funcdef)]]">
+ <tr>
+ <td> </td>
+ <xsl:apply-templates select="." mode="kr-tabular"/>
+ </tr>
+ </xsl:for-each>
+ </table>
+ <xsl:if test="paramdef">
+ <div class="paramdef-list">
+ <xsl:apply-templates select="paramdef" mode="kr-funcsynopsis-mode"/>
+ </div>
+ </xsl:if>
+ <div class="funcprototype-spacer"> </div> <!-- hACk: blank div for vertical spacing -->
+</xsl:template>
+
+<xsl:template match="funcdef" mode="kr-tabular">
+ <code>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="kr-tabular"/>
+ <xsl:text>(</xsl:text>
+ </code>
+</xsl:template>
+
+<xsl:template match="funcdef/function" mode="kr-tabular">
+ <xsl:choose>
+ <xsl:when test="$funcsynopsis.decoration != 0">
+ <b class="fsfunc"><xsl:apply-templates mode="kr-nontabular"/></b>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates mode="kr-tabular"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="void" mode="kr-tabular">
+ <td>
+ <code>)</code>
+ <xsl:text>;</xsl:text>
+ </td>
+ <td> </td>
+</xsl:template>
+
+<xsl:template match="varargs" mode="kr-tabular">
+ <td>
+ <xsl:text>...</xsl:text>
+ <code>)</code>
+ <xsl:text>;</xsl:text>
+ </td>
+ <td> </td>
+</xsl:template>
+
+<xsl:template match="paramdef" mode="kr-tabular">
+ <td>
+ <xsl:apply-templates select="parameter" mode="kr-tabular"/>
+ <xsl:choose>
+ <xsl:when test="following-sibling::*">
+ <xsl:text>, </xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <code>)</code>
+ <xsl:text>;</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ </td>
+ <td> </td>
+</xsl:template>
+
+<xsl:template match="paramdef/parameter" mode="kr-tabular">
+ <xsl:choose>
+ <xsl:when test="$funcsynopsis.decoration != 0">
+ <var class="pdparam">
+ <xsl:apply-templates mode="kr-tabular"/>
+ </var>
+ </xsl:when>
+ <xsl:otherwise>
+ <code>
+ <xsl:apply-templates mode="kr-tabular"/>
+ </code>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="paramdef" mode="kr-tabular-funcsynopsis-mode">
+ <xsl:variable name="type">
+ <xsl:choose>
+ <xsl:when test="type">
+ <xsl:apply-templates select="type" mode="kr-tabular-funcsynopsis-mode"/>
+ </xsl:when>
+ <xsl:when test="normalize-space(parameter/preceding-sibling::node()[not(self::parameter)]) != ''">
+ <xsl:copy-of select="parameter/preceding-sibling::node()[not(self::parameter)]"/>
+ </xsl:when>
+ </xsl:choose>
+ </xsl:variable>
+
+ <tr>
+ <xsl:choose>
+ <xsl:when test="$type != '' and funcparams">
+ <td>
+ <code>
+ <xsl:copy-of select="$type"/>
+ </code>
+ <xsl:text> </xsl:text>
+ </td>
+ <td>
+ <code>
+ <xsl:choose>
+ <xsl:when test="type">
+ <xsl:apply-templates select="type/following-sibling::*" mode="kr-tabular-funcsynopsis-mode"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="*" mode="kr-tabular-funcsynopsis-mode"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </code>
+ </td>
+ </xsl:when>
+
+ <xsl:when test="funcparams">
+ <td colspan="2">
+ <code>
+ <xsl:apply-templates mode="kr-tabular-funcsynopsis-mode"/>
+ </code>
+ </td>
+ </xsl:when>
+
+ <xsl:otherwise>
+ <td>
+ <code>
+ <xsl:apply-templates select="parameter/preceding-sibling::node()[not(self::parameter)]" mode="kr-tabular-funcsynopsis-mode"/>
+ </code>
+ <xsl:text> </xsl:text>
+ </td>
+ <td>
+ <code>
+ <xsl:apply-templates select="parameter" mode="kr-tabular"/>
+ <xsl:apply-templates select="parameter/following-sibling::*[not(self::parameter)]" mode="kr-tabular-funcsynopsis-mode"/>
+ <xsl:text>;</xsl:text>
+ </code>
+ </td>
+ </xsl:otherwise>
+ </xsl:choose>
+ </tr>
+</xsl:template>
+
+<xsl:template match="paramdef/parameter" mode="kr-tabular-funcsynopsis-mode">
+ <xsl:choose>
+ <xsl:when test="$funcsynopsis.decoration != 0">
+ <var class="pdparam">
+ <xsl:apply-templates mode="kr-tabular-funcsynopsis-mode"/>
+ </var>
+ </xsl:when>
+ <xsl:otherwise>
+ <code>
+ <xsl:apply-templates mode="kr-tabular-funcsynopsis-mode"/>
+ </code>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="funcparams" mode="kr-tabular-funcsynopsis-mode">
+ <code>(</code>
+ <xsl:apply-templates mode="kr-tabular-funcsynopsis-mode"/>
+ <code>)</code>
+ <xsl:text>;</xsl:text>
+</xsl:template>
+
+<!-- ====================================================================== -->
+<!-- funcprototype: ansi, non-tabular -->
+
+<xsl:template match="funcprototype" mode="ansi-nontabular">
+ <p>
+ <xsl:apply-templates mode="ansi-nontabular"/>
+ </p>
+</xsl:template>
+
+<xsl:template match="funcdef" mode="ansi-nontabular">
+ <code>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="ansi-nontabular"/>
+ <xsl:text>(</xsl:text>
+ </code>
+</xsl:template>
+
+<xsl:template match="funcdef/function" mode="ansi-nontabular">
+ <xsl:choose>
+ <xsl:when test="$funcsynopsis.decoration != 0">
+ <b class="fsfunc"><xsl:apply-templates mode="ansi-nontabular"/></b>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates mode="ansi-nontabular"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="void" mode="ansi-nontabular">
+ <code>void)</code>
+ <xsl:text>;</xsl:text>
+</xsl:template>
+
+<xsl:template match="varargs" mode="ansi-nontabular">
+ <xsl:text>...</xsl:text>
+ <code>)</code>
+ <xsl:text>;</xsl:text>
+</xsl:template>
+
+<xsl:template match="paramdef" mode="ansi-nontabular">
+ <xsl:apply-templates mode="ansi-nontabular"/>
+ <xsl:choose>
+ <xsl:when test="following-sibling::*">
+ <xsl:text>, </xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <code>)</code>
+ <xsl:text>;</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="paramdef/parameter" mode="ansi-nontabular">
+ <xsl:choose>
+ <xsl:when test="$funcsynopsis.decoration != 0">
+ <var class="pdparam">
+ <xsl:apply-templates mode="ansi-nontabular"/>
+ </var>
+ </xsl:when>
+ <xsl:otherwise>
+ <code>
+ <xsl:apply-templates mode="ansi-nontabular"/>
+ </code>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="funcparams" mode="ansi-nontabular">
+ <code>(</code>
+ <xsl:apply-templates mode="ansi-nontabular"/>
+ <code>)</code>
+</xsl:template>
+
+<!-- ====================================================================== -->
+<!-- funcprototype: ansi, tabular -->
+
+<xsl:template match="funcprototype" mode="ansi-tabular">
+ <table border="0" summary="Function synopsis" cellspacing="0" cellpadding="0" class="funcprototype-table">
+ <tr>
+ <td>
+ <xsl:apply-templates select="funcdef" mode="ansi-tabular"/>
+ </td>
+ <xsl:apply-templates select="(void|varargs|paramdef)[1]" mode="ansi-tabular"/>
+ </tr>
+ <xsl:for-each select="(void|varargs|paramdef)[preceding-sibling::*[not(self::funcdef)]]">
+ <tr>
+ <td> </td>
+ <xsl:apply-templates select="." mode="ansi-tabular"/>
+ </tr>
+ </xsl:for-each>
+ </table>
+ <div class="funcprototype-spacer"> </div> <!-- hACk: blank div for vertical spacing -->
+</xsl:template>
+
+<xsl:template match="funcdef" mode="ansi-tabular">
+ <code>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="ansi-tabular"/>
+ <xsl:text>(</xsl:text>
+ </code>
+</xsl:template>
+
+<xsl:template match="funcdef/function" mode="ansi-tabular">
+ <xsl:choose>
+ <xsl:when test="$funcsynopsis.decoration != 0">
+ <b class="fsfunc"><xsl:apply-templates mode="ansi-nontabular"/></b>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates mode="kr-tabular"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="void" mode="ansi-tabular">
+ <td>
+ <code>void)</code>
+ <xsl:text>;</xsl:text>
+ </td>
+ <td> </td>
+</xsl:template>
+
+<xsl:template match="varargs" mode="ansi-tabular">
+ <td>
+ <xsl:text>...</xsl:text>
+ <code>)</code>
+ <xsl:text>;</xsl:text>
+ </td>
+ <td> </td>
+</xsl:template>
+
+<xsl:template match="paramdef" mode="ansi-tabular">
+ <td>
+ <xsl:apply-templates mode="ansi-tabular"/>
+ <xsl:choose>
+ <xsl:when test="following-sibling::*">
+ <xsl:text>, </xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <code>)</code>
+ <xsl:text>;</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ </td>
+</xsl:template>
+
+<xsl:template match="paramdef/parameter" mode="ansi-tabular">
+ <xsl:choose>
+ <xsl:when test="$funcsynopsis.decoration != 0">
+ <var class="pdparam">
+ <xsl:apply-templates mode="ansi-tabular"/>
+ </var>
+ </xsl:when>
+ <xsl:otherwise>
+ <code>
+ <xsl:apply-templates mode="ansi-tabular"/>
+ </code>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="funcparams" mode="ansi-tabular">
+ <code>(</code>
+ <xsl:apply-templates/>
+ <code>)</code>
+</xsl:template>
+
+<!-- ====================================================================== -->
+
+<xsl:variable name="default-classsynopsis-language">java</xsl:variable>
+
+<xsl:template match="classsynopsis |fieldsynopsis |methodsynopsis |constructorsynopsis |destructorsynopsis">
+ <xsl:param name="language">
+ <xsl:choose>
+ <xsl:when test="@language">
+ <xsl:value-of select="@language"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$default-classsynopsis-language"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:param>
+
+ <xsl:choose>
+ <xsl:when test="$language='java' or $language='Java'">
+ <xsl:apply-templates select="." mode="java"/>
+ </xsl:when>
+ <xsl:when test="$language='perl' or $language='Perl'">
+ <xsl:apply-templates select="." mode="perl"/>
+ </xsl:when>
+ <xsl:when test="$language='idl' or $language='IDL'">
+ <xsl:apply-templates select="." mode="idl"/>
+ </xsl:when>
+ <xsl:when test="$language='cpp' or $language='c++' or $language='C++'">
+ <xsl:apply-templates select="." mode="cpp"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:message>
+ <xsl:text>Unrecognized language on </xsl:text>
+ <xsl:value-of select="local-name(.)"/>
+ <xsl:text>: </xsl:text>
+ <xsl:value-of select="$language"/>
+ </xsl:message>
+ <xsl:apply-templates select=".">
+ <xsl:with-param name="language" select="$default-classsynopsis-language"/>
+ </xsl:apply-templates>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="synop-break">
+ <xsl:if test="parent::classsynopsis or (following-sibling::fieldsynopsis |following-sibling::methodsynopsis |following-sibling::constructorsynopsis |following-sibling::destructorsynopsis)">
+ <xsl:text>
+.
+</xsl:text>
+ </xsl:if>
+</xsl:template>
+
+
+<!-- ===== Java ======================================================== -->
+
+<xsl:template match="classsynopsis" mode="java">
+ <xsl:text>.sp
+</xsl:text><xsl:text>.nf
+</xsl:text><pre>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates select="ooclass[1]" mode="java"/>
+ <xsl:if test="ooclass[preceding-sibling::*]">
+ <xsl:text> extends</xsl:text>
+ <xsl:apply-templates select="ooclass[preceding-sibling::*]" mode="java"/>
+ <xsl:if test="oointerface|ooexception">
+ <xsl:text>
+.
+</xsl:text>
+ <xsl:text>    </xsl:text>
+ </xsl:if>
+ </xsl:if>
+ <xsl:if test="oointerface">
+ <xsl:text>implements</xsl:text>
+ <xsl:apply-templates select="oointerface" mode="java"/>
+ <xsl:if test="ooexception">
+ <xsl:text>
+.
+</xsl:text>
+ <xsl:text>    </xsl:text>
+ </xsl:if>
+ </xsl:if>
+ <xsl:if test="ooexception">
+ <xsl:text>throws</xsl:text>
+ <xsl:apply-templates select="ooexception" mode="java"/>
+ </xsl:if>
+ <xsl:text> {</xsl:text>
+ <xsl:text>
+.
+</xsl:text>
+ <xsl:apply-templates select="constructorsynopsis |destructorsynopsis |fieldsynopsis |methodsynopsis |classsynopsisinfo" mode="java"/>
+ <xsl:text>}</xsl:text>
+ </pre><xsl:text/><xsl:text>.fi
+</xsl:text>
+</xsl:template>
+
+<xsl:template match="classsynopsisinfo" mode="java">
+ <xsl:apply-templates mode="java"/>
+</xsl:template>
+
+<xsl:template match="ooclass|oointerface|ooexception" mode="java">
+ <xsl:choose>
+ <xsl:when test="preceding-sibling::*">
+ <xsl:text>, </xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text> </xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="java"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="modifier|package" mode="java">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="java"/>
+ <xsl:if test="following-sibling::*">
+ <xsl:text> </xsl:text>
+ </xsl:if>
+ </span>
+</xsl:template>
+
+<xsl:template match="classname" mode="java">
+ <xsl:if test="local-name(preceding-sibling::*[1]) = 'classname'">
+ <xsl:text>, </xsl:text>
+ </xsl:if>
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="java"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="interfacename" mode="java">
+ <xsl:if test="local-name(preceding-sibling::*[1]) = 'interfacename'">
+ <xsl:text>, </xsl:text>
+ </xsl:if>
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="java"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="exceptionname" mode="java">
+ <xsl:if test="local-name(preceding-sibling::*[1]) = 'exceptionname'">
+ <xsl:text>, </xsl:text>
+ </xsl:if>
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="java"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="fieldsynopsis" mode="java">
+ <code>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:if test="parent::classsynopsis">
+ <xsl:text>  </xsl:text>
+ </xsl:if>
+ <xsl:apply-templates mode="java"/>
+ <xsl:text>;</xsl:text>
+ </code>
+ <xsl:call-template name="synop-break"/>
+</xsl:template>
+
+<xsl:template match="type" mode="java">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="java"/>
+ <xsl:text> </xsl:text>
+ </span>
+</xsl:template>
+
+<xsl:template match="varname" mode="java">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="java"/>
+ <xsl:text> </xsl:text>
+ </span>
+</xsl:template>
+
+<xsl:template match="initializer" mode="java">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:text>= </xsl:text>
+ <xsl:apply-templates mode="java"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="void" mode="java">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:text>void </xsl:text>
+ </span>
+</xsl:template>
+
+<xsl:template match="methodname" mode="java">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="java"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="methodparam" mode="java">
+ <xsl:param name="indent">0</xsl:param>
+ <xsl:if test="preceding-sibling::methodparam">
+ <xsl:text>,</xsl:text>
+ <xsl:text>
+.
+</xsl:text>
+ <xsl:if test="$indent &gt; 0">
+ <xsl:call-template name="copy-string">
+ <xsl:with-param name="string"> </xsl:with-param>
+ <xsl:with-param name="count" select="$indent + 1"/>
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:if>
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="java"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="parameter" mode="java">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="java"/>
+ </span>
+</xsl:template>
+
+<xsl:template mode="java" match="constructorsynopsis|destructorsynopsis|methodsynopsis">
+ <xsl:variable name="start-modifiers" select="modifier[following-sibling::*[local-name(.) != 'modifier']]"/>
+ <xsl:variable name="notmod" select="*[local-name(.) != 'modifier']"/>
+ <xsl:variable name="end-modifiers" select="modifier[preceding-sibling::*[local-name(.) != 'modifier']]"/>
+ <xsl:variable name="decl">
+ <xsl:if test="parent::classsynopsis">
+ <xsl:text>  </xsl:text>
+ </xsl:if>
+ <xsl:apply-templates select="$start-modifiers" mode="java"/>
+
+ <!-- type -->
+ <xsl:if test="local-name($notmod[1]) != 'methodname'">
+ <xsl:apply-templates select="$notmod[1]" mode="java"/>
+ </xsl:if>
+
+ <xsl:apply-templates select="methodname" mode="java"/>
+ </xsl:variable>
+
+ <code>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:copy-of select="$decl"/>
+ <xsl:text>(</xsl:text>
+ <xsl:apply-templates select="methodparam" mode="java">
+ <xsl:with-param name="indent" select="string-length($decl)"/>
+ </xsl:apply-templates>
+ <xsl:text>)</xsl:text>
+ <xsl:if test="exceptionname">
+ <xsl:text>
+.
+</xsl:text>
+ <xsl:text>    throws </xsl:text>
+ <xsl:apply-templates select="exceptionname" mode="java"/>
+ </xsl:if>
+ <xsl:if test="modifier[preceding-sibling::*[local-name(.) != 'modifier']]">
+ <xsl:text> </xsl:text>
+ <xsl:apply-templates select="$end-modifiers" mode="java"/>
+ </xsl:if>
+ <xsl:text>;</xsl:text>
+ </code>
+ <xsl:call-template name="synop-break"/>
+</xsl:template>
+
+<!-- ===== C++ ========================================================= -->
+
+<xsl:template match="classsynopsis" mode="cpp">
+ <xsl:text>.sp
+</xsl:text><xsl:text>.nf
+</xsl:text><pre>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates select="ooclass[1]" mode="cpp"/>
+ <xsl:if test="ooclass[preceding-sibling::*]">
+ <xsl:text>: </xsl:text>
+ <xsl:apply-templates select="ooclass[preceding-sibling::*]" mode="cpp"/>
+ <xsl:if test="oointerface|ooexception">
+ <xsl:text>
+.
+</xsl:text>
+ <xsl:text>    </xsl:text>
+ </xsl:if>
+ </xsl:if>
+ <xsl:if test="oointerface">
+ <xsl:text> implements</xsl:text>
+ <xsl:apply-templates select="oointerface" mode="cpp"/>
+ <xsl:if test="ooexception">
+ <xsl:text>
+.
+</xsl:text>
+ <xsl:text>    </xsl:text>
+ </xsl:if>
+ </xsl:if>
+ <xsl:if test="ooexception">
+ <xsl:text> throws</xsl:text>
+ <xsl:apply-templates select="ooexception" mode="cpp"/>
+ </xsl:if>
+ <xsl:text> {</xsl:text>
+ <xsl:text>
+.
+</xsl:text>
+ <xsl:apply-templates select="constructorsynopsis |destructorsynopsis |fieldsynopsis |methodsynopsis |classsynopsisinfo" mode="cpp"/>
+ <xsl:text>}</xsl:text>
+ </pre><xsl:text/><xsl:text>.fi
+</xsl:text>
+</xsl:template>
+
+<xsl:template match="classsynopsisinfo" mode="cpp">
+ <xsl:apply-templates mode="cpp"/>
+</xsl:template>
+
+<xsl:template match="ooclass|oointerface|ooexception" mode="cpp">
+ <xsl:if test="preceding-sibling::*">
+ <xsl:text>, </xsl:text>
+ </xsl:if>
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="cpp"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="modifier|package" mode="cpp">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="cpp"/>
+ <xsl:if test="following-sibling::*">
+ <xsl:text> </xsl:text>
+ </xsl:if>
+ </span>
+</xsl:template>
+
+<xsl:template match="classname" mode="cpp">
+ <xsl:if test="local-name(preceding-sibling::*[1]) = 'classname'">
+ <xsl:text>, </xsl:text>
+ </xsl:if>
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="cpp"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="interfacename" mode="cpp">
+ <xsl:if test="local-name(preceding-sibling::*[1]) = 'interfacename'">
+ <xsl:text>, </xsl:text>
+ </xsl:if>
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="cpp"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="exceptionname" mode="cpp">
+ <xsl:if test="local-name(preceding-sibling::*[1]) = 'exceptionname'">
+ <xsl:text>, </xsl:text>
+ </xsl:if>
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="cpp"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="fieldsynopsis" mode="cpp">
+ <code>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:if test="parent::classsynopsis">
+ <xsl:text>  </xsl:text>
+ </xsl:if>
+ <xsl:apply-templates mode="cpp"/>
+ <xsl:text>;</xsl:text>
+ </code>
+ <xsl:call-template name="synop-break"/>
+</xsl:template>
+
+<xsl:template match="type" mode="cpp">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="cpp"/>
+ <xsl:text> </xsl:text>
+ </span>
+</xsl:template>
+
+<xsl:template match="varname" mode="cpp">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="cpp"/>
+ <xsl:text> </xsl:text>
+ </span>
+</xsl:template>
+
+<xsl:template match="initializer" mode="cpp">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:text>= </xsl:text>
+ <xsl:apply-templates mode="cpp"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="void" mode="cpp">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:text>void </xsl:text>
+ </span>
+</xsl:template>
+
+<xsl:template match="methodname" mode="cpp">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="cpp"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="methodparam" mode="cpp">
+ <xsl:if test="preceding-sibling::methodparam">
+ <xsl:text>, </xsl:text>
+ </xsl:if>
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="cpp"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="parameter" mode="cpp">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="cpp"/>
+ </span>
+</xsl:template>
+
+<xsl:template mode="cpp" match="constructorsynopsis|destructorsynopsis|methodsynopsis">
+ <xsl:variable name="start-modifiers" select="modifier[following-sibling::*[local-name(.) != 'modifier']]"/>
+ <xsl:variable name="notmod" select="*[local-name(.) != 'modifier']"/>
+ <xsl:variable name="end-modifiers" select="modifier[preceding-sibling::*[local-name(.) != 'modifier']]"/>
+
+ <code>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:if test="parent::classsynopsis">
+ <xsl:text>  </xsl:text>
+ </xsl:if>
+ <xsl:apply-templates select="$start-modifiers" mode="cpp"/>
+
+ <!-- type -->
+ <xsl:if test="local-name($notmod[1]) != 'methodname'">
+ <xsl:apply-templates select="$notmod[1]" mode="cpp"/>
+ </xsl:if>
+
+ <xsl:apply-templates select="methodname" mode="cpp"/>
+ <xsl:text>(</xsl:text>
+ <xsl:apply-templates select="methodparam" mode="cpp"/>
+ <xsl:text>)</xsl:text>
+ <xsl:if test="exceptionname">
+ <xsl:text>
+.
+</xsl:text>
+ <xsl:text>    throws </xsl:text>
+ <xsl:apply-templates select="exceptionname" mode="cpp"/>
+ </xsl:if>
+ <xsl:if test="modifier[preceding-sibling::*[local-name(.) != 'modifier']]">
+ <xsl:text> </xsl:text>
+ <xsl:apply-templates select="$end-modifiers" mode="cpp"/>
+ </xsl:if>
+ <xsl:text>;</xsl:text>
+ </code>
+ <xsl:call-template name="synop-break"/>
+</xsl:template>
+
+<!-- ===== IDL ========================================================= -->
+
+<xsl:template match="classsynopsis" mode="idl">
+ <xsl:text>.sp
+</xsl:text><xsl:text>.nf
+</xsl:text><pre>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:text>interface </xsl:text>
+ <xsl:apply-templates select="ooclass[1]" mode="idl"/>
+ <xsl:if test="ooclass[preceding-sibling::*]">
+ <xsl:text>: </xsl:text>
+ <xsl:apply-templates select="ooclass[preceding-sibling::*]" mode="idl"/>
+ <xsl:if test="oointerface|ooexception">
+ <xsl:text>
+.
+</xsl:text>
+ <xsl:text>    </xsl:text>
+ </xsl:if>
+ </xsl:if>
+ <xsl:if test="oointerface">
+ <xsl:text> implements</xsl:text>
+ <xsl:apply-templates select="oointerface" mode="idl"/>
+ <xsl:if test="ooexception">
+ <xsl:text>
+.
+</xsl:text>
+ <xsl:text>    </xsl:text>
+ </xsl:if>
+ </xsl:if>
+ <xsl:if test="ooexception">
+ <xsl:text> throws</xsl:text>
+ <xsl:apply-templates select="ooexception" mode="idl"/>
+ </xsl:if>
+ <xsl:text> {</xsl:text>
+ <xsl:text>
+.
+</xsl:text>
+ <xsl:apply-templates select="constructorsynopsis |destructorsynopsis |fieldsynopsis |methodsynopsis |classsynopsisinfo" mode="idl"/>
+ <xsl:text>}</xsl:text>
+ </pre><xsl:text/><xsl:text>.fi
+</xsl:text>
+</xsl:template>
+
+<xsl:template match="classsynopsisinfo" mode="idl">
+ <xsl:apply-templates mode="idl"/>
+</xsl:template>
+
+<xsl:template match="ooclass|oointerface|ooexception" mode="idl">
+ <xsl:if test="preceding-sibling::*">
+ <xsl:text>, </xsl:text>
+ </xsl:if>
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="idl"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="modifier|package" mode="idl">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="idl"/>
+ <xsl:if test="following-sibling::*">
+ <xsl:text> </xsl:text>
+ </xsl:if>
+ </span>
+</xsl:template>
+
+<xsl:template match="classname" mode="idl">
+ <xsl:if test="local-name(preceding-sibling::*[1]) = 'classname'">
+ <xsl:text>, </xsl:text>
+ </xsl:if>
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="idl"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="interfacename" mode="idl">
+ <xsl:if test="local-name(preceding-sibling::*[1]) = 'interfacename'">
+ <xsl:text>, </xsl:text>
+ </xsl:if>
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="idl"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="exceptionname" mode="idl">
+ <xsl:if test="local-name(preceding-sibling::*[1]) = 'exceptionname'">
+ <xsl:text>, </xsl:text>
+ </xsl:if>
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="idl"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="fieldsynopsis" mode="idl">
+ <code>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:if test="parent::classsynopsis">
+ <xsl:text>  </xsl:text>
+ </xsl:if>
+ <xsl:apply-templates mode="idl"/>
+ <xsl:text>;</xsl:text>
+ </code>
+ <xsl:call-template name="synop-break"/>
+</xsl:template>
+
+<xsl:template match="type" mode="idl">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="idl"/>
+ <xsl:text> </xsl:text>
+ </span>
+</xsl:template>
+
+<xsl:template match="varname" mode="idl">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="idl"/>
+ <xsl:text> </xsl:text>
+ </span>
+</xsl:template>
+
+<xsl:template match="initializer" mode="idl">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:text>= </xsl:text>
+ <xsl:apply-templates mode="idl"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="void" mode="idl">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:text>void </xsl:text>
+ </span>
+</xsl:template>
+
+<xsl:template match="methodname" mode="idl">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="idl"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="methodparam" mode="idl">
+ <xsl:if test="preceding-sibling::methodparam">
+ <xsl:text>, </xsl:text>
+ </xsl:if>
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="idl"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="parameter" mode="idl">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="idl"/>
+ </span>
+</xsl:template>
+
+<xsl:template mode="idl" match="constructorsynopsis|destructorsynopsis|methodsynopsis">
+ <xsl:variable name="start-modifiers" select="modifier[following-sibling::*[local-name(.) != 'modifier']]"/>
+ <xsl:variable name="notmod" select="*[local-name(.) != 'modifier']"/>
+ <xsl:variable name="end-modifiers" select="modifier[preceding-sibling::*[local-name(.) != 'modifier']]"/>
+ <code>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:if test="parent::classsynopsis">
+ <xsl:text>  </xsl:text>
+ </xsl:if>
+ <xsl:apply-templates select="$start-modifiers" mode="idl"/>
+
+ <!-- type -->
+ <xsl:if test="local-name($notmod[1]) != 'methodname'">
+ <xsl:apply-templates select="$notmod[1]" mode="idl"/>
+ </xsl:if>
+
+ <xsl:apply-templates select="methodname" mode="idl"/>
+ <xsl:text>(</xsl:text>
+ <xsl:apply-templates select="methodparam" mode="idl"/>
+ <xsl:text>)</xsl:text>
+ <xsl:if test="exceptionname">
+ <xsl:text>
+.
+</xsl:text>
+ <xsl:text>    raises(</xsl:text>
+ <xsl:apply-templates select="exceptionname" mode="idl"/>
+ <xsl:text>)</xsl:text>
+ </xsl:if>
+ <xsl:if test="modifier[preceding-sibling::*[local-name(.) != 'modifier']]">
+ <xsl:text> </xsl:text>
+ <xsl:apply-templates select="$end-modifiers" mode="idl"/>
+ </xsl:if>
+ <xsl:text>;</xsl:text>
+ </code>
+ <xsl:call-template name="synop-break"/>
+</xsl:template>
+
+<!-- ===== Perl ======================================================== -->
+
+<xsl:template match="classsynopsis" mode="perl">
+ <xsl:text>.sp
+</xsl:text><xsl:text>.nf
+</xsl:text><pre>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:text>package </xsl:text>
+ <xsl:apply-templates select="ooclass[1]" mode="perl"/>
+ <xsl:text>;</xsl:text>
+ <xsl:text>
+.
+</xsl:text>
+
+ <xsl:if test="ooclass[preceding-sibling::*]">
+ <xsl:text>@ISA = (</xsl:text>
+ <xsl:apply-templates select="ooclass[preceding-sibling::*]" mode="perl"/>
+ <xsl:text>);</xsl:text>
+ <xsl:text>
+.
+</xsl:text>
+ </xsl:if>
+
+ <xsl:apply-templates select="constructorsynopsis |destructorsynopsis |fieldsynopsis |methodsynopsis |classsynopsisinfo" mode="perl"/>
+ </pre><xsl:text/><xsl:text>.fi
+</xsl:text>
+</xsl:template>
+
+<xsl:template match="classsynopsisinfo" mode="perl">
+ <xsl:apply-templates mode="perl"/>
+</xsl:template>
+
+<xsl:template match="ooclass|oointerface|ooexception" mode="perl">
+ <xsl:if test="preceding-sibling::*">
+ <xsl:text>, </xsl:text>
+ </xsl:if>
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="perl"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="modifier|package" mode="perl">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="perl"/>
+ <xsl:if test="following-sibling::*">
+ <xsl:text> </xsl:text>
+ </xsl:if>
+ </span>
+</xsl:template>
+
+<xsl:template match="classname" mode="perl">
+ <xsl:if test="local-name(preceding-sibling::*[1]) = 'classname'">
+ <xsl:text>, </xsl:text>
+ </xsl:if>
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="perl"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="interfacename" mode="perl">
+ <xsl:if test="local-name(preceding-sibling::*[1]) = 'interfacename'">
+ <xsl:text>, </xsl:text>
+ </xsl:if>
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="perl"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="exceptionname" mode="perl">
+ <xsl:if test="local-name(preceding-sibling::*[1]) = 'exceptionname'">
+ <xsl:text>, </xsl:text>
+ </xsl:if>
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="perl"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="fieldsynopsis" mode="perl">
+ <code>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:if test="parent::classsynopsis">
+ <xsl:text>  </xsl:text>
+ </xsl:if>
+ <xsl:apply-templates mode="perl"/>
+ <xsl:text>;</xsl:text>
+ </code>
+ <xsl:call-template name="synop-break"/>
+</xsl:template>
+
+<xsl:template match="type" mode="perl">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="perl"/>
+ <xsl:text> </xsl:text>
+ </span>
+</xsl:template>
+
+<xsl:template match="varname" mode="perl">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="perl"/>
+ <xsl:text> </xsl:text>
+ </span>
+</xsl:template>
+
+<xsl:template match="initializer" mode="perl">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:text>= </xsl:text>
+ <xsl:apply-templates mode="perl"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="void" mode="perl">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:text>void </xsl:text>
+ </span>
+</xsl:template>
+
+<xsl:template match="methodname" mode="perl">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="perl"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="methodparam" mode="perl">
+ <xsl:if test="preceding-sibling::methodparam">
+ <xsl:text>, </xsl:text>
+ </xsl:if>
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="perl"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="parameter" mode="perl">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="perl"/>
+ </span>
+</xsl:template>
+
+<xsl:template mode="perl" match="constructorsynopsis|destructorsynopsis|methodsynopsis">
+ <xsl:variable name="start-modifiers" select="modifier[following-sibling::*[local-name(.) != 'modifier']]"/>
+ <xsl:variable name="notmod" select="*[local-name(.) != 'modifier']"/>
+ <xsl:variable name="end-modifiers" select="modifier[preceding-sibling::*[local-name(.) != 'modifier']]"/>
+
+ <code>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:text>sub </xsl:text>
+
+ <xsl:apply-templates select="methodname" mode="perl"/>
+ <xsl:text> { ... };</xsl:text>
+ </code>
+ <xsl:call-template name="synop-break"/>
+</xsl:template>
+
+<!-- Used when not occurring as a child of classsynopsis -->
+<xsl:template match="ooclass|oointerface|ooexception">
+ <xsl:apply-templates/>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<!-- * DocBook 5 allows linking elements (link, olink, and xref) -->
+<!-- * within the OO *synopsis elements (classsynopsis, fieldsynopsis, -->
+<!-- * methodsynopsis, constructorsynopsis, destructorsynopsis) and -->
+<!-- * their children. So we need to have mode="java|cpp|idl|perl" -->
+<!-- * per-mode matches for those linking elements in order for them -->
+<!-- * to be processed as expected. -->
+
+<xsl:template match="link|olink|xref" mode="java">
+ <xsl:apply-templates select="."/>
+</xsl:template>
+
+<xsl:template match="link|olink|xref" mode="cpp">
+ <xsl:apply-templates select="."/>
+</xsl:template>
+
+<xsl:template match="link|olink|xref" mode="idl">
+ <xsl:apply-templates select="."/>
+</xsl:template>
+
+<xsl:template match="link|olink|xref" mode="perl">
+ <xsl:apply-templates select="."/>
+</xsl:template>
+
+</xsl:stylesheet>
+
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/manpages/info.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/manpages/info.xsl
new file mode 100644
index 0000000..6698fb9
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/manpages/info.xsl
@@ -0,0 +1,800 @@
+<?xml version='1.0'?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:date="http://exslt.org/dates-and-times"
+ xmlns:exsl="http://exslt.org/common"
+ exclude-result-prefixes="date exsl"
+ version='1.0'>
+
+<!-- ********************************************************************
+ $Id: info.xsl 7883 2008-03-08 17:59:39Z xmldoc $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+ <xsl:variable name="blurb-indent">
+ <xsl:choose>
+ <xsl:when test="not($man.indent.blurbs = 0)">
+ <xsl:value-of select="$man.indent.width"/>
+ </xsl:when>
+ <xsl:when test="not($man.indent.refsect = 0)">
+ <!-- * "zq" is the name of a register we set for -->
+ <!-- * preserving the original default indent value -->
+ <!-- * when $man.indent.refsect is non-zero; -->
+ <!-- * "u" is a roff unit specifier -->
+ <xsl:text>\n(zqu</xsl:text>
+ </xsl:when>
+ <xsl:otherwise/> <!-- * otherwise, just leave it empty -->
+ </xsl:choose>
+ </xsl:variable>
+
+ <!-- ================================================================== -->
+ <!-- * About the $info param used in this stylesheet -->
+ <!-- * -->
+ <!-- * The $info param is a "master info" node set that contains -->
+ <!-- * the entire contents of the *info child of the current -->
+ <!-- * Refentry, plus the entire contents of the *info children of -->
+ <!-- * all ancestors of the current Refentry, in document order. -->
+ <!-- * -->
+ <!-- * We try to find a "best match" for selecting content from -->
+ <!-- * $infor; we look through it in reverse document order until we -->
+ <!-- * can find something usable. -->
+ <!-- * -->
+ <!-- * Specifically what the basic metadata-gathering XPath expression -->
+ <!-- * in this stylesheet does is: -->
+ <!-- * -->
+ <!-- * 1. Look through the entire "master info" node set.-->
+ <!-- * 2. Get the last node in the set that contains, for -->
+ <!-- * example, an Author element. That amounts to being the -->
+ <!-- * closest *info node to the Refentry - either its *info -->
+ <!-- * child, or the *info node of its closest ancestor that -->
+ <!-- * contains an Author. -->
+
+ <!-- ================================================================== -->
+ <!-- * Get user "refentry metadata" preferences -->
+ <!-- ================================================================== -->
+ <!-- * The DocBook XSL stylesheets include several user-configurable -->
+ <!-- * global stylesheet parameters for controlling refentry metadata -->
+ <!-- * gathering. Those parameters are not read directly by the other -->
+ <!-- * refentry metadata-gathering templates. Instead, they are read -->
+ <!-- * only by the get.refentry.metadata.prefs template, which -->
+ <!-- * assembles them into a structure that is then passed to the -->
+ <!-- * other refentry metadata-gathering template. -->
+
+ <xsl:variable name="get.refentry.metadata.prefs">
+ <!-- * get.refentry.metadata.prefs is in common/refentry.xsl -->
+ <xsl:call-template name="get.refentry.metadata.prefs"/>
+ </xsl:variable>
+
+ <xsl:variable name="refentry.metadata.prefs"
+ select="exsl:node-set($get.refentry.metadata.prefs)"/>
+
+ <!-- * ============================================================== -->
+ <!-- * Get content for Author metadata field. -->
+ <!-- * ============================================================== -->
+
+ <!-- * The make.roff.metatada.author template and metadata.author -->
+ <!-- * mode are used only for populating the Author field in the -->
+ <!-- * metadata "top comment" we embed in roff source of each page. -->
+ <xsl:template name="make.roff.metadata.author">
+ <xsl:param name="info"/>
+ <xsl:param name="refname"/>
+ <xsl:choose>
+ <xsl:when test="$info//author">
+ <xsl:apply-templates
+ select="(($info[//author])[last()]//author)[1]"
+ mode="metadata.author"/>
+ </xsl:when>
+ <xsl:when test="$info//corpauthor">
+ <xsl:apply-templates
+ select="(($info[//corpauthor])[last()]//corpauthor)[1]"
+ mode="metadata.author"/>
+ </xsl:when>
+ <xsl:when test="$info//editor">
+ <xsl:apply-templates
+ select="(($info[//editor])[last()]//editor)[1]"
+ mode="metadata.author"/>
+ </xsl:when>
+ <xsl:when test="$info//corpcredit">
+ <xsl:apply-templates
+ select="(($info[//corpcredit])[last()]//corpcredit)[1]"
+ mode="metadata.author"/>
+ </xsl:when>
+ <xsl:when test="$info//othercredit">
+ <xsl:apply-templates
+ select="(($info[//othercredit])[last()]//othercredit)[1]"
+ mode="metadata.author"/>
+ </xsl:when>
+ <xsl:when test="$info//collab">
+ <xsl:apply-templates
+ select="(($info[//collab])[last()]//collab)[1]"
+ mode="metadata.author"/>
+ </xsl:when>
+ <xsl:when test="$info//orgname">
+ <xsl:apply-templates
+ select="(($info[//orgname])[last()]//orgname)[1]"
+ mode="metadata.author"/>
+ </xsl:when>
+ <xsl:when test="$info//publishername">
+ <xsl:apply-templates
+ select="(($info[//publishername])[last()]//publishername)[1]"
+ mode="metadata.author"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <!-- * otherwise, we need to check to see if we have an "Author" -->
+ <!-- * or "Authors" section in the refentry -->
+ <xsl:variable name="gentext.author">
+ <xsl:text>"</xsl:text>
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'Author'"/>
+ </xsl:call-template>
+ <xsl:text>"</xsl:text>
+ </xsl:variable>
+ <xsl:variable name="gentext.AUTHOR">
+ <xsl:if test="not($gentext.author = '')">
+ <xsl:call-template name="string.upper">
+ <xsl:with-param name="string" select="$gentext.author"/>
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:variable>
+ <xsl:variable name="gentext.authors">
+ <xsl:text>"</xsl:text>
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'Authors'"/>
+ </xsl:call-template>
+ <xsl:text>"</xsl:text>
+ </xsl:variable>
+ <xsl:variable name="gentext.AUTHORS">
+ <xsl:if test="not($gentext.authors = '')">
+ <xsl:call-template name="string.upper">
+ <xsl:with-param name="string" select="$gentext.authors"/>
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:variable>
+ <!-- * get all refentry/refsect1/title & refentry/refsection/title -->
+ <!-- * instances, delimit each with double quotes, and put them -->
+ <!-- * into a single refsect1.titles string -->
+ <xsl:variable name="refsect1.titles">
+ <xsl:for-each select="refsect1/title">
+ <xsl:text>"</xsl:text>
+ <xsl:value-of select="normalize-space(.)"/>
+ <xsl:text>"</xsl:text>
+ <xsl:text> </xsl:text>
+ </xsl:for-each>
+ <xsl:for-each select="refsection/title">
+ <xsl:text>"</xsl:text>
+ <xsl:value-of select="normalize-space(.)"/>
+ <xsl:text>"</xsl:text>
+ <xsl:text> </xsl:text>
+ </xsl:for-each>
+ </xsl:variable>
+ <xsl:variable name="author.section.title">
+ <xsl:choose>
+ <xsl:when test="not($gentext.authors = '') and
+ contains($refsect1.titles,$gentext.authors)">
+ <xsl:value-of select="$gentext.authors"/>
+ </xsl:when>
+ <xsl:when test="not($gentext.AUTHORS = '') and
+ contains($refsect1.titles,$gentext.AUTHORS)">
+ <xsl:value-of select="$gentext.AUTHORS"/>
+ </xsl:when>
+ <xsl:when test="not($gentext.author = '') and
+ contains($refsect1.titles,$gentext.author)">
+ <xsl:value-of select="$gentext.author"/>
+ </xsl:when>
+ <xsl:when test="not($gentext.AUTHOR = '') and
+ contains($refsect1.titles,$gentext.AUTHOR)">
+ <xsl:value-of select="$gentext.AUTHOR"/>
+ </xsl:when>
+ <!-- * git docs (for one) use "DOCUMENTATION" for their authors section -->
+ <xsl:when test="contains($refsect1.titles,'Documentation')">
+ <xsl:text>Documentation</xsl:text>
+ </xsl:when>
+ <xsl:when test="contains($refsect1.titles,'DOCUMENTATION')">
+ <xsl:text>DOCUMENTATION</xsl:text>
+ </xsl:when>
+ <xsl:otherwise/> <!-- * otherwise, leave empty -->
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:choose>
+ <xsl:when test="not($author.section.title = '')">
+ <!-- * if we have a non-empty $author.section.title value, -->
+ <!-- * then reference that title (instead of putting a -->
+ <!-- * specific author name) -->
+ <xsl:text>[see the </xsl:text>
+ <xsl:value-of select="$author.section.title"/>
+ <xsl:text> section]</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <!-- * otherwise we have no info/author content and no Author -->
+ <!-- * or Authors section, so we insert a fixme and report -->
+ <!-- * the problem to the user -->
+ <xsl:text>[FIXME: author] [see http://docbook.sf.net/el/author]</xsl:text>
+ <xsl:if test="$refentry.meta.get.quietly = 0">
+ <xsl:call-template name="log.message">
+ <xsl:with-param name="level">Warn</xsl:with-param>
+ <xsl:with-param name="source" select="$refname"/>
+ <xsl:with-param name="context-desc">meta author</xsl:with-param>
+ <xsl:with-param name="message">
+ <xsl:text>no refentry/info/author</xsl:text>
+ </xsl:with-param>
+ </xsl:call-template>
+ <xsl:call-template name="log.message">
+ <xsl:with-param name="level">Note</xsl:with-param>
+ <xsl:with-param name="source" select="$refname"/>
+ <xsl:with-param name="context-desc">meta author</xsl:with-param>
+ <xsl:with-param name="message">
+ <xsl:text>see http://docbook.sf.net/el/author</xsl:text>
+ </xsl:with-param>
+ </xsl:call-template>
+ <xsl:call-template name="log.message">
+ <xsl:with-param name="level">Warn</xsl:with-param>
+ <xsl:with-param name="source" select="$refname"/>
+ <xsl:with-param name="context-desc">meta author</xsl:with-param>
+ <xsl:with-param name="message">
+ <xsl:text>no author data, so inserted a fixme</xsl:text>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+ <xsl:template match="author|editor|othercredit|collab" mode="metadata.author">
+ <xsl:choose>
+ <xsl:when test="collabname">
+ <!-- * If this node is a Collab, then it should have a -->
+ <!-- * Collabname child, so get that. -->
+ <xsl:variable name="contents">
+ <xsl:apply-templates select="collabname"/>
+ </xsl:variable>
+ <xsl:value-of select="normalize-space($contents)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <!-- * Otherwise, this node is not a Collab, but instead -->
+ <!-- * an author|editor|othercredit, which must have a name -->
+ <!-- * of some kind; so get that name -->
+ <xsl:call-template name="person.name.normalized"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:if test=".//email|address/otheraddr/ulink">
+ <xsl:text> </xsl:text>
+ <!-- * For each attribution found, use only the first e-mail -->
+ <!-- * address or ulink value found -->
+ <xsl:apply-templates select="(.//email|address/otheraddr/ulink)[1]"
+ mode="metadata.author"/>
+ </xsl:if>
+ </xsl:template>
+
+ <xsl:template match="email|address/otheraddr/ulink" mode="metadata.author">
+ <xsl:text>&lt;</xsl:text>
+ <xsl:choose>
+ <xsl:when test="self::email">
+ <xsl:variable name="contents">
+ <xsl:apply-templates/>
+ </xsl:variable>
+ <xsl:value-of select="normalize-space($contents)"/>
+ </xsl:when>
+ <xsl:when test="self::ulink">
+ <xsl:variable name="contents">
+ <xsl:apply-templates select="."/>
+ </xsl:variable>
+ <xsl:value-of select="normalize-space($contents)"/>
+ </xsl:when>
+ </xsl:choose>
+ <xsl:text>&gt;</xsl:text>
+ </xsl:template>
+
+ <xsl:template match="corpauthor|corpcredit|orgname|publishername" mode="metadata.author">
+ <xsl:variable name="contents">
+ <xsl:apply-templates/>
+ </xsl:variable>
+ <xsl:value-of select="normalize-space($contents)"/>
+ </xsl:template>
+
+ <!-- * ============================================================== -->
+ <!-- * Assemble the AUTHOR/AUTHORS section -->
+ <!-- * ============================================================== -->
+
+ <xsl:template name="author.section">
+ <xsl:param name="info"/>
+ <!-- * The $info param is a "master info" node set that contains -->
+ <!-- * the entires contents of the *info child of the current -->
+ <!-- * Refentry, plus the entire contents of the *info children of -->
+ <!-- * all ancestors of the current Refentry, in document order. -->
+ <xsl:choose>
+ <xsl:when test="$info//author|$info//editor|$info//collab|
+ $info//corpauthor|$info//corpcredit|
+ $info//othercredit|$info/orgname|
+ $info/publishername|$info/publisher">
+ <xsl:variable name="authorcount">
+ <xsl:value-of
+ select="count(
+ $info//author|$info//editor|$info//collab|
+ $info//corpauthor|$info//corpcredit|
+ $info//othercredit)">
+ </xsl:value-of>
+ </xsl:variable>
+ <xsl:call-template name="make.subheading">
+ <xsl:with-param name="title">
+ <xsl:call-template name="make.authorsecttitle">
+ <xsl:with-param name="authorcount" select="$authorcount"/>
+ </xsl:call-template>
+ </xsl:with-param>
+ </xsl:call-template>
+ <!-- * Now output all the actual author, editor, etc. content -->
+ <xsl:for-each
+ select="$info//author|$info//editor|$info//collab|
+ $info//corpauthor|$info//corpcredit|
+ $info//othercredit|$info/orgname|
+ $info/publishername|$info/publisher">
+ <xsl:apply-templates select="." mode="authorsect"/>
+ </xsl:for-each>
+ </xsl:when>
+ <xsl:otherwise/> <!-- * do nothing, no author info found -->
+ </xsl:choose>
+ </xsl:template>
+
+ <xsl:template name="make.authorsecttitle">
+ <!-- * If we have exactly one attributable person/entity, then output -->
+ <!-- * localized gentext for 'Author'; otherwise, output 'Authors'. -->
+ <xsl:param name="authorcount"/>
+ <xsl:param name="authorsecttitle">
+ <xsl:choose>
+ <xsl:when test="$authorcount = 1">
+ <xsl:text>Author</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text>Authors</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:param>
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="$authorsecttitle"/>
+ </xsl:call-template>
+ </xsl:template>
+
+ <xsl:template match="author|editor|othercredit" mode="authorsect">
+ <xsl:variable name="person-name">
+ <xsl:call-template name="person.name.normalized"/>
+ </xsl:variable>
+ <!-- * If we have a person-name or email or ulink content, then -->
+ <!-- * output name and email or ulink content on the same line -->
+ <xsl:choose>
+ <xsl:when test="not($person-name = '') or .//email or address/otheraddr/ulink">
+ <xsl:text>.PP&#10;</xsl:text>
+ <!-- * Display person name in bold -->
+ <xsl:call-template name="bold">
+ <xsl:with-param name="node" select="exsl:node-set($person-name)"/>
+ <xsl:with-param name="context" select="."/>
+ </xsl:call-template>
+ <!-- * Display e-mail address(es) and ulink(s) on same line as name -->
+ <xsl:apply-templates select=".//email|address/otheraddr/ulink" mode="authorsect"/>
+ <xsl:text>&#10;</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text>.br&#10;</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ <!-- * Display affiliation(s) on separate lines -->
+ <xsl:apply-templates select="affiliation" mode="authorsect"/>
+ <!-- * Display direct-child addresses on separate lines -->
+ <xsl:apply-templates select="address" mode="authorsect"/>
+ <!-- * Call template for handling various attribution possibilities -->
+ <xsl:call-template name="attribution">
+ <xsl:with-param name="person-name" select="$person-name"/>
+ </xsl:call-template>
+ </xsl:template>
+
+ <xsl:template match="collab" mode="authorsect">
+ <xsl:text>.PP&#10;</xsl:text>
+ <xsl:call-template name="bold">
+ <xsl:with-param name="node" select="collabname"/>
+ <xsl:with-param name="context" select="."/>
+ </xsl:call-template>
+ <!-- * Display e-mail address(es) and ulink(s) on same line as name -->
+ <xsl:apply-templates select=".//email|address/otheraddr/ulink" mode="authorsect"/>
+ <xsl:text>&#10;</xsl:text>
+ <!-- * Display affilition(s) on separate lines -->
+ <xsl:apply-templates select="affiliation" mode="authorsect"/>
+ </xsl:template>
+
+ <xsl:template match="corpauthor|corpcredit|orgname|publishername" mode="authorsect">
+ <xsl:text>.PP&#10;</xsl:text>
+ <xsl:call-template name="bold">
+ <xsl:with-param name="node" select="."/>
+ <xsl:with-param name="context" select="."/>
+ </xsl:call-template>
+ <xsl:text>&#10;</xsl:text>
+ <xsl:if test="self::publishername">
+ <!-- * Display localized "Publisher" gentext -->
+ <xsl:call-template name="publisher.attribution"/>
+ </xsl:if>
+ </xsl:template>
+
+ <xsl:template match="publisher" mode="authorsect">
+ <xsl:text>.PP&#10;</xsl:text>
+ <xsl:call-template name="bold">
+ <xsl:with-param name="node" select="publishername"/>
+ <xsl:with-param name="context" select="."/>
+ </xsl:call-template>
+ <!-- * Display e-mail address(es) and ulink(s) on same line as name -->
+ <xsl:apply-templates select=".//email|address/otheraddr/ulink" mode="authorsect"/>
+ <!-- * Display addresses on separate lines -->
+ <xsl:apply-templates select="address" mode="authorsect"/>
+ <!-- * Display localized "Publisher" literal -->
+ <xsl:call-template name="publisher.attribution"/>
+ </xsl:template>
+
+ <xsl:template name="publisher.attribution">
+ <xsl:text>&#10;</xsl:text>
+ <xsl:text>.RS</xsl:text>
+ <xsl:if test="not($blurb-indent = '')">
+ <xsl:text> </xsl:text>
+ <xsl:value-of select="$blurb-indent"/>
+ </xsl:if>
+ <xsl:text>&#10;</xsl:text>
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'Publisher'"/>
+ </xsl:call-template>
+ <xsl:text>.&#10;</xsl:text>
+ <xsl:text>.RE&#10;</xsl:text>
+ </xsl:template>
+
+ <xsl:template match="email|address/otheraddr/ulink" mode="authorsect">
+ <xsl:choose>
+ <xsl:when test="preceding-sibling::*[descendant-or-self::email]
+ or preceding-sibling::address/otheraddr/ulink
+ or ancestor::address[preceding-sibling::*[descendant-or-self::email]]
+ or ancestor::address[preceding-sibling::address/otheraddr/ulink]">
+ <!-- * This is not the first instance, so do nothing. -->
+ </xsl:when>
+ <xsl:otherwise>
+ <!-- * This is first instances of an e-mail address or ulink, -->
+ <!-- * so put a space before it. -->
+ <xsl:text> </xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ <!-- * Note that the reason for the \& character after the opening -->
+ <!-- * angle bracket and before the closing angle bracket is to -->
+ <!-- * prevent groff from inserting a linebreak at those points and -->
+ <!-- * outputting a hyphen character where the break occurs -->
+ <xsl:text>&lt;\&amp;</xsl:text>
+ <xsl:choose>
+ <xsl:when test="self::email">
+ <xsl:variable name="contents">
+ <xsl:apply-templates/>
+ </xsl:variable>
+ <xsl:value-of select="normalize-space($contents)"/>
+ </xsl:when>
+ <xsl:when test="self::ulink">
+ <xsl:variable name="contents">
+ <xsl:apply-templates select="."/>
+ </xsl:variable>
+ <xsl:value-of select="normalize-space($contents)"/>
+ </xsl:when>
+ </xsl:choose>
+ <xsl:text>\&amp;&gt;</xsl:text>
+ <xsl:choose>
+ <xsl:when test="not(following-sibling::*[descendant-or-self::email]
+ or following-sibling::address/otheraddr/ulink
+ or ancestor::address[following-sibling::*[descendant-or-self::email]]
+ or ancestor::address[following-sibling::address/otheraddr/ulink])">
+ <!-- * This is the final instance, so do nothing. -->
+ </xsl:when>
+ <xsl:otherwise>
+ <!-- * Separate multiple e-mail addresses or ulinks with a comma -->
+ <xsl:text>, </xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+ <xsl:template match="affiliation" mode="authorsect">
+ <!-- * Get the string value of the contents of this Affiliation. If the -->
+ <!-- * affiliation only contains an Address child whose only content is -->
+ <!-- * an email address or ulink, then these contents will end up empty. -->
+ <xsl:variable name="contents">
+ <xsl:apply-templates mode="authorsect"/>
+ </xsl:variable>
+ <!-- * If contents are actually empty except for an email address -->
+ <!-- * or ulink, then output nothing. -->
+ <xsl:if test="$contents != ''">
+ <xsl:text>.br&#10;</xsl:text>
+ <xsl:for-each select="shortaffil|jobtitle|orgname|orgdiv|address">
+ <!-- * only display output of nodes other than email or ulink -->
+ <xsl:apply-templates select="node()[not(self::email) and not(self::otheraddr/ulink)]"/>
+ <xsl:choose>
+ <xsl:when test="position() = last()"/> <!-- do nothing -->
+ <xsl:otherwise>
+ <!-- * only add comma if the node has a child node other than -->
+ <!-- * an email address or ulink -->
+ <xsl:if test="child::node()[not(self::email) and not(self::otheraddr/ulink)]">
+ <xsl:text>, </xsl:text>
+ </xsl:if>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:for-each>
+ <xsl:text>&#10;</xsl:text>
+ <xsl:choose>
+ <xsl:when test="position() = last()"/> <!-- do nothing -->
+ <xsl:otherwise>
+ <!-- * put a line break after every Affiliation instance except -->
+ <!-- * the last one in the set -->
+ <xsl:text>.br&#10;</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:if>
+ </xsl:template>
+
+ <xsl:template match="address" mode="authorsect">
+ <xsl:variable name="contents"
+ select="normalize-space(node()[not(self::email)
+ and not(self::otheraddr/ulink)])"/>
+ <!-- * If this contents of this Address do not contain anything except -->
+ <!-- * an email address or ulink, then output nothing. -->
+ <xsl:if test="$contents != ''">
+ <xsl:text>&#10;</xsl:text>
+ <xsl:text>.br&#10;</xsl:text>
+ <!--* Skip email and ulink descendants of Address (rendered elsewhere) -->
+ <xsl:apply-templates select="node()[not(self::email) and not(self::otheraddr/ulink)]"/>
+ </xsl:if>
+ </xsl:template>
+
+ <xsl:template name="attribution">
+ <xsl:param name="person-name"/>
+ <xsl:param name="refname" select="ancestor::refentry/refnamediv[1]/refname[1]"/>
+ <!-- * Determine appropriate attribution for a particular person's role. -->
+ <xsl:choose>
+ <!-- * if we have a *blurb or contrib, just use that -->
+ <xsl:when test="contrib|personblurb|authorblurb">
+ <xsl:apply-templates select="contrib|personblurb|authorblurb" mode="authorsect"/>
+ <xsl:text>&#10;</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <!-- * otherwise we have no attribution information to use... -->
+ <xsl:if test="not($person-name = '')">
+ <!-- * if we have a person name or organization name -->
+ <!-- * ($person-name can actually be an orgname, not just a -->
+ <!-- * person name), then report to the user that we are -->
+ <!-- * lacking attribution information for that person -->
+ <xsl:if test="$refentry.meta.get.quietly = 0">
+ <xsl:call-template name="log.message">
+ <xsl:with-param name="level">Warn</xsl:with-param>
+ <xsl:with-param name="source" select="$refname"/>
+ <xsl:with-param name="context-desc">AUTHOR sect.</xsl:with-param>
+ <xsl:with-param name="message">
+ <xsl:text>no personblurb|contrib for </xsl:text>
+ <xsl:value-of select="$person-name"/>
+ </xsl:with-param>
+ </xsl:call-template>
+ <xsl:call-template name="log.message">
+ <xsl:with-param name="level">Note</xsl:with-param>
+ <xsl:with-param name="source" select="$refname"/>
+ <xsl:with-param name="context-desc">AUTHOR sect.</xsl:with-param>
+ <xsl:with-param name="message">
+ <xsl:text>see see http://docbook.sf.net/el/contrib</xsl:text>
+ </xsl:with-param>
+ </xsl:call-template>
+ <xsl:call-template name="log.message">
+ <xsl:with-param name="level">Note</xsl:with-param>
+ <xsl:with-param name="source" select="$refname"/>
+ <xsl:with-param name="context-desc">AUTHOR sect.</xsl:with-param>
+ <xsl:with-param name="message">
+ <xsl:text>see see http://docbook.sf.net/el/personblurb</xsl:text>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:if>
+ <xsl:choose>
+ <!-- * If we have no *blurb or contrib, but this is an Author or -->
+ <!-- * Editor, then render the corresponding localized gentext -->
+ <xsl:when test="self::author">
+ <xsl:text>&#10;</xsl:text>
+ <xsl:text>.RS</xsl:text>
+ <xsl:if test="not($blurb-indent = '')">
+ <xsl:text> </xsl:text>
+ <xsl:value-of select="$blurb-indent"/>
+ </xsl:if>
+ <xsl:text>&#10;</xsl:text>
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'Author'"/>
+ </xsl:call-template>
+ <xsl:text>.&#10;</xsl:text>
+ <xsl:text>.RE&#10;</xsl:text>
+ </xsl:when>
+ <xsl:when test="self::editor">
+ <xsl:text>&#10;</xsl:text>
+ <xsl:text>.RS</xsl:text>
+ <xsl:if test="not($blurb-indent = '')">
+ <xsl:text> </xsl:text>
+ <xsl:value-of select="$blurb-indent"/>
+ </xsl:if>
+ <xsl:text>&#10;</xsl:text>
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'Editor'"/>
+ </xsl:call-template>
+ <xsl:text>.&#10;</xsl:text>
+ <xsl:text>.RE&#10;</xsl:text>
+ </xsl:when>
+ <!-- * If we have no *blurb or contrib, but this is an Othercredit, -->
+ <!-- * check value of Class attribute and use corresponding gentext. -->
+ <xsl:when test="self::othercredit">
+ <xsl:choose>
+ <xsl:when test="@class and @class != 'other'">
+ <xsl:text>&#10;</xsl:text>
+ <xsl:text>.RS</xsl:text>
+ <xsl:if test="not($blurb-indent = '')">
+ <xsl:text> </xsl:text>
+ <xsl:value-of select="$blurb-indent"/>
+ </xsl:if>
+ <xsl:text>&#10;</xsl:text>
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="@class"/>
+ </xsl:call-template>
+ <xsl:text>.&#10;</xsl:text>
+ <xsl:text>.RE&#10;</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <!-- * We have an Othercredit, but no usable value for the Class -->
+ <!-- * attribute, so nothing to show, do nothing -->
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <!-- * We have no *blurb or contrib or anything else we can use to -->
+ <!-- * display appropriate attribution for this person, so do nothing -->
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+ <xsl:template match="personblurb|authorblurb" mode="authorsect">
+ <xsl:call-template name="mark.up.blurb.or.contrib"/>
+ <!-- * yeah, it's possible for a *blurb to have a "title" -->
+ <xsl:apply-templates select="title"/>
+ <xsl:apply-templates select="*[not(self::title)]"/>
+ <!-- * If this *blurb has a sibling "name" element of some kind, then -->
+ <!-- * the mark.up.blurb.or.contrib template will generated an "RS" -->
+ <!-- * call that will cause it to be indented; so we need to call -->
+ <!-- * "RE" to restore the previous indent level -->
+ <xsl:if test="../personname|../surname|../firstname
+ |../othername|../lineage|../honorific
+ |../affiliation|../email|../address">
+ <xsl:text>.RE&#10;</xsl:text>
+ </xsl:if>
+ </xsl:template>
+
+ <xsl:template match="personblurb/title|authorblurb/title">
+ <!-- * always render period after title -->
+ <xsl:variable name="contents">
+ <xsl:apply-templates/>
+ </xsl:variable>
+ <xsl:value-of select="normalize-space($contents)"/>
+ <xsl:text>.</xsl:text>
+ <!-- * render space after Title+period if the title is followed -->
+ <!-- * by something element content -->
+ <xsl:if test="following-sibling::*[name() != '']">
+ <xsl:text> </xsl:text>
+ </xsl:if>
+ </xsl:template>
+
+ <xsl:template match="contrib" mode="authorsect">
+ <xsl:call-template name="mark.up.blurb.or.contrib"/>
+ <xsl:variable name="contents">
+ <xsl:apply-templates/>
+ </xsl:variable>
+ <xsl:value-of select="normalize-space($contents)"/>
+ <xsl:text>&#10;</xsl:text>
+ <xsl:if test="../personname|../surname|../firstname
+ |../othername|../lineage|../honorific
+ |../affiliation|../email|../address">
+ <xsl:text>.RE&#10;</xsl:text>
+ </xsl:if>
+ </xsl:template>
+
+ <xsl:template name="mark.up.blurb.or.contrib">
+ <xsl:choose>
+ <!-- * If this *blurb has a sibling "name" element of some kind, then -->
+ <!-- * we are already outputting the name content, and we need to -->
+ <!-- * indent the *blurb content after that. -->
+ <xsl:when
+ test="../personname|../surname|../firstname
+ |../othername|../lineage|../honorific
+ |../affiliation|../email|../address">
+ <xsl:text>&#10;</xsl:text>
+ <xsl:text>.RS</xsl:text>
+ <xsl:if test="not($blurb-indent = '')">
+ <xsl:text> </xsl:text>
+ <xsl:value-of select="$blurb-indent"/>
+ </xsl:if>
+ </xsl:when>
+ <xsl:otherwise>
+ <!-- * otherwise, we have no "name" content, so don't indent; -->
+ <!-- * instead, decide if we need a .PP or just a .br -->
+ <xsl:choose>
+ <xsl:when test="not(preceding-sibling::*)">
+ <!-- * if this *blurb or contrib has no preceding -->
+ <!-- * siblings, then we need to start a new paragraph -->
+ <xsl:text>.PP</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <!-- * otherwise, this has no preceding siblings, so -->
+ <!-- * just put a linebreak -->
+ <xsl:text>.br</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:text>&#10;</xsl:text>
+ </xsl:template>
+
+ <!-- * ============================================================== -->
+ <!-- * Assemble the COPYRIGHT section -->
+ <!-- * ============================================================== -->
+ <!-- * The COPYRIGHT section is output only if a copyright or -->
+ <!-- * legalnotice is found. It contains the copyright contents -->
+ <!-- * followed by the legalnotice contents. -->
+ <xsl:template name="copyright.section">
+ <xsl:param name="info"/>
+ <xsl:choose>
+ <xsl:when test="$info//copyright|$info//legalnotice">
+ <xsl:call-template name="make.subheading">
+ <xsl:with-param name="title">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key">Copyright</xsl:with-param>
+ </xsl:call-template>
+ </xsl:with-param>
+ </xsl:call-template>
+ <xsl:text>.br&#10;</xsl:text>
+ <!-- * the copyright mode="titlepage.mode" template is -->
+ <!-- * imported from the HTML stylesheets -->
+ <xsl:for-each select="
+ (($info[//copyright])[last()]//copyright)
+ | (($info[//legalnotice])[last()]//legalnotice)">
+ <xsl:choose>
+ <xsl:when test="local-name(.) = 'copyright'">
+ <xsl:variable name="contents">
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+ </xsl:variable>
+ <xsl:value-of select="normalize-space($contents)"/>
+ <xsl:text>&#10;</xsl:text>
+ <xsl:text>.br&#10;</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+ <xsl:text>&#10;</xsl:text>
+ <xsl:text>.sp&#10;</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:for-each>
+ </xsl:when>
+ <xsl:otherwise/> <!-- * do nothing, no copyright or legalnotice found -->
+ </xsl:choose>
+ </xsl:template>
+
+ <xsl:template match="legalnotice">
+ <xsl:apply-templates/>
+ </xsl:template>
+
+ <!-- * ============================================================== -->
+
+ <!-- * suppress refmeta and all *info (we grab what we need from them -->
+ <!-- * elsewhere) -->
+
+ <xsl:template match="refmeta"/>
+
+ <xsl:template match="info|refentryinfo|referenceinfo|refsynopsisdivinfo
+ |refsectioninfo|refsect1info|refsect2info|refsect3info
+ |setinfo|bookinfo|articleinfo|chapterinfo|sectioninfo
+ |sect1info|sect2info|sect3info|sect4info|sect5info
+ |partinfo|prefaceinfo|appendixinfo|docinfo"/>
+
+ <!-- ============================================================== -->
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/manpages/inline.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/manpages/inline.xsl
new file mode 100644
index 0000000..56ca4c5
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/manpages/inline.xsl
@@ -0,0 +1,219 @@
+<?xml version='1.0'?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:exsl="http://exslt.org/common"
+ version='1.0'>
+
+<!-- ********************************************************************
+ $Id: inline.xsl 7897 2008-03-10 15:46:03Z xmldoc $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<!-- ==================================================================== -->
+
+<xsl:template match="replaceable|varname|structfield">
+ <xsl:if test="$man.hyphenate.computer.inlines = 0">
+ <xsl:call-template name="suppress.hyphenation"/>
+ </xsl:if>
+ <xsl:call-template name="italic">
+ <xsl:with-param name="node" select="."/>
+ <xsl:with-param name="context" select="."/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="option|userinput|envar|errorcode|constant|markup">
+ <xsl:if test="$man.hyphenate.computer.inlines = 0">
+ <xsl:call-template name="suppress.hyphenation"/>
+ </xsl:if>
+ <xsl:call-template name="bold">
+ <xsl:with-param name="node" select="."/>
+ <xsl:with-param name="context" select="."/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="classname">
+ <xsl:if test="$man.hyphenate.computer.inlines = 0">
+ <xsl:call-template name="suppress.hyphenation"/>
+ </xsl:if>
+ <xsl:apply-templates/>
+</xsl:template>
+
+<xsl:template match="command">
+ <xsl:if test="$man.hyphenate.computer.inlines = 0">
+ <xsl:call-template name="suppress.hyphenation"/>
+ </xsl:if>
+ <xsl:call-template name="bold">
+ <xsl:with-param name="node" select="."/>
+ <xsl:with-param name="context" select="."/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="type[not(ancestor::cmdsynopsis) and
+ not(ancestor::funcsynopsis)]">
+ <xsl:if test="$man.hyphenate.computer.inlines = 0">
+ <xsl:call-template name="suppress.hyphenation"/>
+ </xsl:if>
+ <xsl:call-template name="bold">
+ <xsl:with-param name="node" select="."/>
+ <xsl:with-param name="context" select="."/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="function[not(ancestor::cmdsynopsis) and
+ not(ancestor::funcsynopsis)]">
+ <xsl:if test="$man.hyphenate.computer.inlines = 0">
+ <xsl:call-template name="suppress.hyphenation"/>
+ </xsl:if>
+ <xsl:call-template name="bold">
+ <xsl:with-param name="node" select="."/>
+ <xsl:with-param name="context" select="."/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="parameter[not(ancestor::cmdsynopsis) and
+ not(ancestor::funcsynopsis)]">
+ <xsl:if test="$man.hyphenate.computer.inlines = 0">
+ <xsl:call-template name="suppress.hyphenation"/>
+ </xsl:if>
+ <xsl:call-template name="italic">
+ <xsl:with-param name="node" select="."/>
+ <xsl:with-param name="context" select="."/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="filename">
+ <!-- * add hyphenation suppression in Filename output only if -->
+ <!-- * break.after.slash is also non-zero -->
+ <xsl:if test="$man.hyphenate.filenames = 0 and
+ $man.break.after.slash = 0">
+ <xsl:call-template name="suppress.hyphenation"/>
+ </xsl:if>
+ <!-- * part of the old man(7) man page, now man-pages(7), says, -->
+ <!-- * "Filenames (whether pathnames, or references to files in the -->
+ <!-- * /usr/include directory) are always in italics". But that's dumb, -->
+ <!-- * and looks like crap in PS/printed/PDF output, and there's no -->
+ <!-- * sound rationale for it, so we don't do it. -->
+ <xsl:call-template name="inline.monoseq"/>
+</xsl:template>
+
+<xsl:template match="emphasis">
+ <xsl:choose>
+ <xsl:when test="
+ @role = 'bold' or
+ @role = 'strong' or
+ @remap = 'B'">
+ <xsl:call-template name="bold">
+ <xsl:with-param name="node" select="."/>
+ <xsl:with-param name="context" select="."/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="italic">
+ <xsl:with-param name="node" select="."/>
+ <xsl:with-param name="context" select="."/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="optional">
+ <xsl:value-of select="$arg.choice.opt.open.str"/>
+ <xsl:apply-templates/>
+ <xsl:value-of select="$arg.choice.opt.close.str"/>
+</xsl:template>
+
+<xsl:template name="do-citerefentry">
+ <xsl:param name="refentrytitle" select="''"/>
+ <xsl:param name="manvolnum" select="''"/>
+ <xsl:variable name="title">
+ <xsl:value-of select="$refentrytitle"/>
+ </xsl:variable>
+ <xsl:call-template name="bold">
+ <xsl:with-param name="node" select="exsl:node-set($title)"/>
+ <xsl:with-param name="context" select="."/>
+ </xsl:call-template>
+ <xsl:text>(</xsl:text>
+ <xsl:value-of select="$manvolnum"/>
+ <xsl:text>)</xsl:text>
+</xsl:template>
+
+<xsl:template match="citerefentry">
+ <xsl:call-template name="do-citerefentry">
+ <xsl:with-param name="refentrytitle" select="refentrytitle"/>
+ <xsl:with-param name="manvolnum" select="manvolnum"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="trademark|productname">
+ <xsl:apply-templates/>
+ <xsl:choose>
+ <!-- * Just use true Unicode chars for copyright, trademark, etc., -->
+ <!-- * symbols (by default, we later automatically translate them -->
+ <!-- * with the apply-string-subst-map template, or with the -->
+ <!-- * default character map, if man.charmap.enabled is true). -->
+ <xsl:when test="@class = 'copyright'">
+ <xsl:text>&#x00a9;</xsl:text>
+ </xsl:when>
+ <xsl:when test="@class = 'registered'">
+ <xsl:text>&#x00ae;</xsl:text>
+ </xsl:when>
+ <xsl:when test="@class = 'service'">
+ <xsl:text>&#x2120;</xsl:text>
+ </xsl:when>
+ <xsl:when test="@class = 'trade'">
+ <xsl:text>&#x2122;</xsl:text>
+ </xsl:when>
+ <!-- * for Trademark element, render a trademark symbol by default -->
+ <!-- * even if no "class" value is specified -->
+ <xsl:when test="self::trademark" >
+ <xsl:text>&#x2122;</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <!-- * otherwise we have a Productname with no value for the -->
+ <!-- * "class" attribute, so don't render any symbol by default -->
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- * span seems to sneak through into output sometimes, possibly due -->
+<!-- * to failed Olink processing; so we need to catch it -->
+<xsl:template match="span">
+ <xsl:apply-templates/>
+</xsl:template>
+
+<xsl:template match="inlinemediaobject">
+ <xsl:apply-templates/>
+</xsl:template>
+
+<!-- * indexterm instances produce groff comments like this: -->
+<!-- * .\" primary: secondary: tertiary -->
+<xsl:template match="indexterm">
+ <xsl:text>.\" </xsl:text>
+ <xsl:apply-templates/>
+ <xsl:text>&#10;</xsl:text>
+</xsl:template>
+
+<xsl:template match="primary">
+ <xsl:value-of select="normalize-space(.)"/>
+</xsl:template>
+
+<xsl:template match="secondary|tertiary">
+ <xsl:text>: </xsl:text>
+ <xsl:value-of select="normalize-space(.)"/>
+</xsl:template>
+
+<!-- * non-empty remark instances produce groff comments -->
+<xsl:template match="remark">
+ <xsl:variable name="content" select="normalize-space(.)"/>
+ <xsl:if test="not($content = '')">
+ <xsl:text>.\" </xsl:text>
+ <xsl:value-of select="$content"/>
+ <xsl:text>&#10;</xsl:text>
+ </xsl:if>
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/manpages/lists.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/manpages/lists.xsl
new file mode 100644
index 0000000..dd90174
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/manpages/lists.xsl
@@ -0,0 +1,604 @@
+<?xml version='1.0'?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version='1.0'>
+
+<!-- ********************************************************************
+ $Id: lists.xsl 8530 2009-11-02 02:38:47Z dleidert $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<xsl:variable name="list-indent">
+ <xsl:choose>
+ <xsl:when test="not($man.indent.lists = 0)">
+ <xsl:value-of select="$man.indent.width"/>
+ </xsl:when>
+ <xsl:when test="not($man.indent.refsect = 0)">
+ <!-- * "zq" is the name of a register we set for -->
+ <!-- * preserving the original default indent value -->
+ <!-- * when $man.indent.refsect is non-zero; -->
+ <!-- * "u" is a roff unit specifier -->
+ <xsl:text>\n(zqu</xsl:text>
+ </xsl:when>
+ <xsl:otherwise/> <!-- * otherwise, just leave it empty -->
+ </xsl:choose>
+</xsl:variable>
+
+<!-- ================================================================== -->
+
+<xsl:template match="para[ancestor::listitem or ancestor::step or ancestor::glossdef]|
+ simpara[ancestor::listitem or ancestor::step or ancestor::glossdef]|
+ remark[ancestor::listitem or ancestor::step or ancestor::glossdef]">
+ <xsl:call-template name="mixed-block"/>
+ <xsl:text>&#10;</xsl:text>
+ <xsl:if test="following-sibling::*[1][
+ self::para or
+ self::simpara or
+ self::remark
+ ]">
+ <!-- * Make sure multiple paragraphs within a list item don't -->
+ <!-- * merge together. -->
+ <xsl:text>.sp&#10;</xsl:text>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="bibliolist">
+ <xsl:apply-templates/>
+ <xsl:text>&#10;</xsl:text>
+</xsl:template>
+
+<xsl:template match="variablelist|glosslist">
+ <xsl:if test="title">
+ <xsl:text>.PP&#10;</xsl:text>
+ <xsl:call-template name="bold">
+ <xsl:with-param name="node" select="title"/>
+ <xsl:with-param name="context" select="."/>
+ </xsl:call-template>
+ <xsl:text>&#10;</xsl:text>
+ </xsl:if>
+ <xsl:apply-templates/>
+</xsl:template>
+
+<xsl:template match="varlistentry|glossentry">
+ <xsl:text>.PP&#10;</xsl:text>
+ <xsl:for-each select="term|glossterm">
+ <xsl:variable name="content">
+ <xsl:apply-templates/>
+ </xsl:variable>
+ <xsl:value-of select="normalize-space($content)"/>
+ <xsl:choose>
+ <xsl:when test="position() = last()"/> <!-- do nothing -->
+ <xsl:otherwise>
+ <!-- * if we have multiple terms in the same varlistentry, generate -->
+ <!-- * a separator (", " by default) and/or an additional line -->
+ <!-- * break after each one except the last -->
+ <!-- * -->
+ <!-- * note that it is not valid to have multiple glossterms -->
+ <!-- * within a glossentry, so this logic never gets exercised -->
+ <!-- * for glossterms (every glossterm is always the last in -->
+ <!-- * its parent glossentry) -->
+ <xsl:value-of select="$variablelist.term.separator"/>
+ <xsl:if test="not($variablelist.term.break.after = '0')">
+ <xsl:text>&#10;</xsl:text>
+ <xsl:text>.br&#10;</xsl:text>
+ </xsl:if>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:for-each>
+ <xsl:text>&#10;</xsl:text>
+ <xsl:text>.RS</xsl:text>
+ <xsl:if test="not($list-indent = '')">
+ <xsl:text> </xsl:text>
+ <xsl:value-of select="$list-indent"/>
+ </xsl:if>
+ <xsl:text>&#10;</xsl:text>
+ <xsl:apply-templates/>
+ <xsl:text>.RE&#10;</xsl:text>
+</xsl:template>
+
+<xsl:template match="varlistentry/term"/>
+<xsl:template match="glossentry/glossterm"/>
+
+<xsl:template match="variablelist[ancestor::listitem or ancestor::step or ancestor::glossdef]|
+ glosslist[ancestor::listitem or ancestor::step or ancestor::glossdef]">
+ <xsl:apply-templates/>
+ <xsl:if test="following-sibling::node() or
+ parent::para[following-sibling::node()] or
+ parent::simpara[following-sibling::node()] or
+ parent::remark[following-sibling::node()]">
+ <xsl:text>.sp</xsl:text>
+ <xsl:text>&#10;</xsl:text>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="varlistentry/listitem|glossentry/glossdef">
+ <xsl:apply-templates/>
+</xsl:template>
+
+<xsl:template match="itemizedlist/listitem">
+ <!-- * We output a real bullet here (rather than, "\(bu", -->
+ <!-- * the roff bullet) because, when we do character-map -->
+ <!-- * processing before final output, the character-map will -->
+ <!-- * handle conversion of the &#x2022; to "\(bu" for us -->
+ <xsl:text>&#10;</xsl:text>
+ <xsl:text>.sp</xsl:text>
+ <xsl:text>&#10;</xsl:text>
+ <xsl:text>.RS</xsl:text>
+ <xsl:if test="not($list-indent = '')">
+ <xsl:text> </xsl:text>
+ <xsl:value-of select="$list-indent"/>
+ </xsl:if>
+ <xsl:text>&#10;</xsl:text>
+ <!-- * if "n" then we are using "nroff", which means the output is for -->
+ <!-- * TTY; so we do some fixed-width-font hackery with \h to make a -->
+ <!-- * hanging indent (instead of using .IP, which has some -->
+ <!-- * undesirable side effects under certain circumstances) -->
+ <xsl:call-template name="roff-if-else-start"/>
+ <xsl:text>\h'-</xsl:text>
+ <xsl:choose>
+ <xsl:when test="not($list-indent = '')">
+ <xsl:text>0</xsl:text>
+ <xsl:value-of select="$list-indent"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text>\n(INu</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:text>'</xsl:text>
+ <xsl:text>&#x2022;</xsl:text>
+ <xsl:text>\h'+</xsl:text>
+ <xsl:choose>
+ <xsl:when test="not($list-indent = '')">
+ <xsl:text>0</xsl:text>
+ <xsl:value-of select="$list-indent - 1"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text>\n(INu-1</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:text>'\c&#10;</xsl:text>
+ <!-- * else, we are not using for "nroff", but instead "troff" - which -->
+ <!-- * means not for TTY, but for PS or whatever; so we’re not using a -->
+ <!-- * fixed-width font, so use a real .IP instead -->
+ <xsl:call-template name="roff-else"/>
+ <!-- * .IP generates a blank like of space, so let’s go backwards one -->
+ <!-- * line up to compensate for that -->
+ <xsl:text>.sp -1&#10;</xsl:text>
+ <xsl:text>.IP \(bu 2.3&#10;</xsl:text>
+ <!-- * The value 2.3 is the amount of indentation; we use 2.3 instead -->
+ <!-- * of 2 because when the font family is New Century Schoolbook it -->
+ <!-- * seems to require the extra space. -->
+ <xsl:call-template name="roff-if-end"/>
+ <xsl:apply-templates/>
+ <xsl:text>.RE&#10;</xsl:text>
+</xsl:template>
+
+<xsl:template match="orderedlist/listitem|procedure/step">
+ <xsl:text>&#10;</xsl:text>
+ <xsl:text>.sp</xsl:text>
+ <xsl:text>&#10;</xsl:text>
+ <xsl:text>.RS</xsl:text>
+ <xsl:if test="not($list-indent = '')">
+ <xsl:text> </xsl:text>
+ <xsl:value-of select="$list-indent"/>
+ </xsl:if>
+ <xsl:text>&#10;</xsl:text>
+ <!-- * if "n" then we are using "nroff", which means the output is for -->
+ <!-- * TTY; so we do some fixed-width-font hackery with \h to make a -->
+ <!-- * hanging indents (instead of using .IP, which has some -->
+ <!-- * undesirable side effects under certain circumstances) -->
+ <xsl:call-template name="roff-if-else-start"/>
+ <xsl:text>\h'-</xsl:text>
+ <xsl:choose>
+ <xsl:when test="not($list-indent = '')">
+ <xsl:text>0</xsl:text>
+ <xsl:value-of select="$list-indent"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text>\n(INu+3n</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:text>'</xsl:text>
+ <xsl:if test="count(preceding-sibling::listitem) &lt; 9">
+ <xsl:text> </xsl:text>
+ </xsl:if>
+ <xsl:number format="1."/>
+ <xsl:text>\h'+</xsl:text>
+ <xsl:choose>
+ <xsl:when test="not($list-indent = '')">
+ <xsl:text>0</xsl:text>
+ <xsl:value-of select="$list-indent - 3"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text>1n</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:text>'\c&#10;</xsl:text>
+ <!-- * else, we are not using for "nroff", but instead "troff" - which -->
+ <!-- * means not for TTY, but for PS or whatever; so we’re not using a -->
+ <!-- * fixed-width font, so use a real .IP instead -->
+ <xsl:call-template name="roff-else"/>
+ <!-- * .IP generates a blank line of space, so let’s go backwards one -->
+ <!-- * line up to compensate for that -->
+ <xsl:text>.sp -1&#10;</xsl:text>
+ <xsl:text>.IP "</xsl:text>
+ <xsl:if test="count(preceding-sibling::listitem) &lt; 9">
+ <xsl:text> </xsl:text>
+ </xsl:if>
+ <xsl:number format="1."/>
+ <xsl:text>" 4.2&#10;</xsl:text>
+ <!-- * The value 4.2 is the amount of indentation; we use 4.2 instead -->
+ <!-- * of 4 because when the font family is Bookman it seems to require -->
+ <!-- * the extra space. -->
+ <xsl:call-template name="roff-if-end"/>
+ <xsl:apply-templates/>
+ <xsl:text>.RE&#10;</xsl:text>
+ <xsl:text>&#10;</xsl:text>
+</xsl:template>
+
+<xsl:template match="itemizedlist|orderedlist|procedure">
+ <xsl:if test="title">
+ <xsl:text>.PP&#10;</xsl:text>
+ <xsl:call-template name="bold">
+ <xsl:with-param name="node" select="title"/>
+ <xsl:with-param name="context" select="."/>
+ </xsl:call-template>
+ <xsl:text>&#10;</xsl:text>
+ </xsl:if>
+ <!-- * DocBook allows just about any block content to appear in -->
+ <!-- * lists before the actual list items, so we need to get that -->
+ <!-- * content (if any) before getting the list items -->
+ <xsl:apply-templates
+ select="*[not(self::listitem) and not(self::title)]"/>
+ <xsl:apply-templates select="listitem"/>
+ <!-- * If this list is a child of para and has content following -->
+ <!-- * it, within the same para, then add a blank line and move -->
+ <!-- * the left margin back to where it was -->
+ <xsl:if test="parent::para and following-sibling::node()">
+ <xsl:text>.sp</xsl:text>
+ <xsl:text>&#10;</xsl:text>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="itemizedlist[ancestor::listitem or ancestor::step or ancestor::glossdef]|
+ orderedlist[ancestor::listitem or ancestor::step or ancestor::glossdef]|
+ procedure[ancestor::listitem or ancestor::step or ancestor::glossdef]">
+ <xsl:if test="title">
+ <xsl:text>.PP&#10;</xsl:text>
+ <xsl:call-template name="bold">
+ <xsl:with-param name="node" select="title"/>
+ <xsl:with-param name="context" select="."/>
+ </xsl:call-template>
+ <xsl:text>&#10;</xsl:text>
+ </xsl:if>
+ <xsl:apply-templates/>
+ <xsl:if test="following-sibling::node() or
+ parent::para[following-sibling::node()] or
+ parent::simpara[following-sibling::node()] or
+ parent::remark[following-sibling::node()]">
+ <xsl:text>.sp</xsl:text>
+ <xsl:text>&#10;</xsl:text>
+ </xsl:if>
+</xsl:template>
+
+<!-- ================================================================== -->
+
+<!-- * for simplelist type="inline", render it as a comma-separated list -->
+<xsl:template match="simplelist[@type='inline']">
+ <!-- * if dbchoice PI exists, use that to determine the choice separator -->
+ <!-- * (that is, equivalent of "and" or "or" in current locale), or literal -->
+ <!-- * value of "choice" otherwise -->
+ <xsl:variable name="localized-choice-separator">
+ <xsl:choose>
+ <xsl:when test="processing-instruction('dbchoice')">
+ <xsl:call-template name="select.choice.separator"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <!-- * empty -->
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:for-each select="member">
+ <xsl:apply-templates/>
+ <xsl:choose>
+ <xsl:when test="position() = last()"/> <!-- do nothing -->
+ <xsl:otherwise>
+ <xsl:text>, </xsl:text>
+ <xsl:if test="position() = last() - 1">
+ <xsl:if test="$localized-choice-separator != ''">
+ <xsl:value-of select="$localized-choice-separator"/>
+ <xsl:text> </xsl:text>
+ </xsl:if>
+ </xsl:if>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:for-each>
+ <xsl:text>&#10;</xsl:text>
+</xsl:template>
+
+<!-- * if simplelist type is not inline, render it as a one-column vertical -->
+<!-- * list (ignoring the values of the type and columns attributes) -->
+<xsl:template match="simplelist">
+ <xsl:for-each select="member">
+ <xsl:text>.RS</xsl:text>
+ <xsl:if test="not($list-indent = '')">
+ <xsl:text> </xsl:text>
+ <xsl:value-of select="$list-indent"/>
+ </xsl:if>
+ <xsl:text>&#10;</xsl:text>
+ <xsl:apply-templates/>
+ <xsl:text>&#10;</xsl:text>
+ <xsl:text>.RE&#10;</xsl:text>
+ </xsl:for-each>
+</xsl:template>
+
+<!-- ================================================================== -->
+
+<!-- * We output Segmentedlist as a table, using tbl(1) markup. There -->
+<!-- * is no option for outputting it in manpages in "list" form. -->
+<xsl:template match="segmentedlist">
+ <xsl:if test="title">
+ <xsl:text>.PP&#10;</xsl:text>
+ <xsl:call-template name="bold">
+ <xsl:with-param name="node" select="title"/>
+ <xsl:with-param name="context" select="."/>
+ </xsl:call-template>
+ <xsl:text>&#10;</xsl:text>
+ </xsl:if>
+ <xsl:text>.\" line length increase to cope w/ tbl weirdness&#10;</xsl:text>
+ <xsl:text>.ll +(\n(LLu * 62u / 100u)&#10;</xsl:text>
+ <!-- * .TS = "Table Start" -->
+ <xsl:text>.TS&#10;</xsl:text>
+ <!-- * first output the table "format" spec, which tells tbl(1) how -->
+ <!-- * how to format each row and column. -->
+ <xsl:for-each select=".//segtitle">
+ <!-- * l = "left", which hard-codes left-alignment for tabular -->
+ <!-- * output of all segmentedlist content -->
+ <xsl:text>l</xsl:text>
+ </xsl:for-each>
+ <!-- * last line of table format section must end with a dot -->
+ <xsl:text>.&#10;</xsl:text>
+ <!-- * optionally suppress output of segtitle -->
+ <xsl:choose>
+ <xsl:when test="$man.segtitle.suppress != 0">
+ <!-- * non-zero = "suppress", so do nothing -->
+ </xsl:when>
+ <xsl:otherwise>
+ <!-- * "0" = "do not suppress", so output the segtitle(s) -->
+ <xsl:apply-templates select=".//segtitle" mode="table-title"/>
+ <xsl:text>&#10;</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:apply-templates/>
+ <!-- * .TE = "Table End" -->
+ <xsl:text>.TE&#10;</xsl:text>
+ <xsl:text>.\" line length decrease back to previous value&#10;</xsl:text>
+ <xsl:text>.ll -(\n(LLu * 62u / 100u)&#10;</xsl:text>
+ <!-- * put a blank line of space below the table -->
+ <xsl:text>.sp&#10;</xsl:text>
+</xsl:template>
+
+<xsl:template match="segmentedlist/segtitle" mode="table-title">
+ <xsl:call-template name="italic">
+ <xsl:with-param name="node" select="."/>
+ <xsl:with-param name="context" select="."/>
+ </xsl:call-template>
+ <xsl:choose>
+ <xsl:when test="position() = last()"/> <!-- do nothing -->
+ <xsl:otherwise>
+ <!-- * tbl(1) treats tab characters as delimiters between -->
+ <!-- * cells; so we need to output a tab after each -->
+ <!-- * segtitle except the last one -->
+ <xsl:text>&#09;</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="segmentedlist/seglistitem">
+ <xsl:apply-templates/>
+ <xsl:text>&#10;</xsl:text>
+</xsl:template>
+
+<xsl:template match="segmentedlist/seglistitem/seg">
+ <!-- * the T{ and T} stuff are delimiters to tell tbl(1) that -->
+ <!-- * the delimited contents are "text blocks" that groff(1) -->
+ <!-- * needs to process -->
+ <xsl:text>T{&#10;</xsl:text>
+ <xsl:variable name="contents">
+ <xsl:apply-templates/>
+ </xsl:variable>
+ <xsl:value-of select="normalize-space($contents)"/>
+ <xsl:text>&#10;T}</xsl:text>
+ <xsl:choose>
+ <xsl:when test="position() = last()"/> <!-- do nothing -->
+ <xsl:otherwise>
+ <!-- * tbl(1) treats tab characters as delimiters between -->
+ <!-- * cells; so we need to output a tab after each -->
+ <!-- * segtitle except the last one -->
+ <xsl:text>&#09;</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="calloutlist">
+ <xsl:if test="title|info/title">
+ <xsl:call-template name="formal.object.heading"/>
+ </xsl:if>
+ <!-- * This template was originally copied over from the HTML -->
+ <!-- * calloutlist template, which precedes the following -->
+ <!-- * apply-templates with the comment "Preserve order of PIs and -->
+ <!-- * comments"; I'm not certain that it will actually have that -->
+ <!-- * effect for all cases, and it seems like there is probably a -->
+ <!-- * better way to do it, but anyway, I’m preserving it here for -->
+ <!-- * consistency. -->
+ <xsl:apply-templates
+ select="*[not(self::callout or self::title or self::titleabbrev)]
+ |comment()[not(preceding-sibling::callout)]
+ |processing-instruction()[not(preceding-sibling::callout)]"/>
+ <!-- * put callout list into a table -->
+ <xsl:text>.TS&#10;</xsl:text>
+ <xsl:text>tab(:);&#10;</xsl:text>
+ <!-- * the following defines the row layout for the table: two columns, -->
+ <!-- * with the first cell in each row right-aligned, and the second -->
+ <!-- * cell left aligned with a width of 75% of the line length -->
+ <xsl:text>r lw(\n(.lu*75u/100u).&#10;</xsl:text>
+ <xsl:apply-templates select="callout
+ |comment()[preceding-sibling::callout]
+ |processing-instruction()[preceding-sibling::callout]"/>
+ <xsl:text>.TE&#10;</xsl:text>
+</xsl:template>
+
+<xsl:template match="calloutlist/title"/>
+
+<xsl:template match="callout">
+ <!-- * first cell of each row is the set of callout numbers for this -->
+ <!-- * particular callout -->
+ <xsl:call-template name="callout.arearefs">
+ <xsl:with-param name="arearefs" select="@arearefs"/>
+ </xsl:call-template>
+ <!-- * end of the first cell in the row; the \h hackery is to correct -->
+ <!-- * for the excessive horizontal whitespace that tbl(1) adds between -->
+ <!-- * cells in the same row -->
+ <xsl:text>\h'-2n':</xsl:text>
+ <!-- * start the next cell in the row, which has the prose contents -->
+ <!-- * (description/explanation) for the callout -->
+ <xsl:text>T{&#10;</xsl:text>
+ <xsl:apply-templates/>
+ <xsl:text>T}&#10;</xsl:text>
+ <!-- * end of the last cell and end of the row -->
+</xsl:template>
+
+<xsl:template name="callout.arearefs">
+ <xsl:param name="arearefs"></xsl:param>
+ <!-- * callout can have multiple values in its arearefs attribute, so -->
+ <!-- * we use the position param to track the postion of each value -->
+ <xsl:param name="position">1</xsl:param>
+ <xsl:if test="$arearefs!=''">
+ <xsl:choose>
+ <xsl:when test="substring-before($arearefs,' ')=''">
+ <xsl:call-template name="callout.arearef">
+ <xsl:with-param name="arearef" select="$arearefs"/>
+ <xsl:with-param name="position" select="$position"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="callout.arearef">
+ <xsl:with-param name="arearef"
+ select="substring-before($arearefs,' ')"/>
+ <xsl:with-param name="position" select="$position"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:call-template name="callout.arearefs">
+ <xsl:with-param name="arearefs"
+ select="substring-after($arearefs,' ')"/>
+ <xsl:with-param name="position" select="$position + 1"/>
+ </xsl:call-template>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template name="callout.arearef">
+ <xsl:param name="arearef"></xsl:param>
+ <!-- * callout can have multiple values in its arearefs attribute, so -->
+ <!-- * we use the position param to track the postion of each value -->
+ <xsl:param name="position"></xsl:param>
+ <xsl:variable name="targets" select="key('id',$arearef)"/>
+ <xsl:variable name="target" select="$targets[1]"/>
+
+ <xsl:call-template name="check.id.unique">
+ <xsl:with-param name="linkend" select="$arearef"/>
+ </xsl:call-template>
+
+ <xsl:choose>
+ <xsl:when test="count($target)=0">
+ <xsl:text>???</xsl:text>
+ </xsl:when>
+ <xsl:when test="local-name($target)='co'">
+ <!-- * if this is not the first value in the set of values in the -->
+ <!-- * arearef attribute for this callout, then we prepend a groff -->
+ <!-- * non-breaking space to it, to prevent groff from injecting -->
+ <!-- * linebreaks into the output. For callout instances with -->
+ <!-- * multiple values in their arearefs attributes, that results -->
+ <!-- * in all of callout numbers beings listed on the same line. -->
+ <xsl:if test="not($position = 1)">
+ <xsl:text>\ </xsl:text>
+ </xsl:if>
+ <xsl:apply-templates select="$target"
+ mode="calloutlist-callout-number"/>
+ </xsl:when>
+ <!-- * the manpages stylesheet does not really support areaset and -->
+ <!-- * area (because we can't/don't actually render the callout bugs -->
+ <!-- * at the specified coordinates); however, the following (for -->
+ <!-- * what it's worth) might cause the callout numbers in the -->
+ <!-- * calloutlist to be render at least (then again, maybe it won't; -->
+ <!-- * it's not actually been tested... -->
+ <xsl:when test="local-name($target)='areaset'">
+ <xsl:call-template name="callout-bug">
+ <xsl:with-param name="conum">
+ <xsl:apply-templates select="$target" mode="conumber"/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="local-name($target)='area'">
+ <xsl:choose>
+ <xsl:when test="$target/parent::areaset">
+ <xsl:call-template name="callout-bug">
+ <xsl:with-param name="conum">
+ <xsl:apply-templates
+ select="$target/parent::areaset" mode="conumber"/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="callout-bug">
+ <xsl:with-param name="conum">
+ <xsl:apply-templates select="$target"
+ mode="conumber"/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text>???</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- * we bold the actual callout bugs and put -->
+<!-- * parenthesis around them -->
+<xsl:template name="callout-bug">
+ <xsl:param name="conum" select='1'/>
+ <xsl:text>\fB(</xsl:text>
+ <xsl:value-of select="$conum"/>
+ <xsl:text>)\fR</xsl:text>
+</xsl:template>
+
+<!-- * we bold the callout numbers and follow each -->
+<!-- * with a period -->
+<xsl:template name="calloutlist-callout-number">
+ <xsl:param name="conum" select='1'/>
+ <xsl:text>\fB</xsl:text>
+ <xsl:value-of select="$conum"/>
+ <xsl:text>.\fR</xsl:text>
+</xsl:template>
+
+<xsl:template match="co" mode="calloutlist-callout-number">
+ <xsl:call-template name="calloutlist-callout-number">
+ <xsl:with-param name="conum">
+ <xsl:number count="co"
+ level="any"
+ from="programlisting|screen|literallayout|synopsis"
+ format="1"/>
+ </xsl:with-param>
+ </xsl:call-template>
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/manpages/other.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/manpages/other.xsl
new file mode 100644
index 0000000..5431925
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/manpages/other.xsl
@@ -0,0 +1,888 @@
+<?xml version='1.0'?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:exsl="http://exslt.org/common"
+ xmlns:ng="http://docbook.org/docbook-ng"
+ xmlns:db="http://docbook.org/ns/docbook"
+ xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0"
+ exclude-result-prefixes="exsl"
+ version='1.0'>
+
+<!-- ********************************************************************
+ $Id: other.xsl 8865 2010-08-20 18:22:06Z mzjn $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<!-- * This file contains named templates related to things other than -->
+<!-- * just assembling the actual text of the main text flow of each man -->
+<!-- * page. This "other" stuff currently amounts to these steps: -->
+<!-- * -->
+<!-- * - get contents of the "map" used to convert special characters -->
+<!-- * - output boilerplate messages -->
+<!-- * - escape backslash, dot, dash, and apostrophe characters -->
+<!-- * - convert non-breaking spaces -->
+<!-- * - add a comment to top part of roff source of each page -->
+<!-- * - make a .TH title line (for controlling page header/footer) -->
+<!-- * - set hyphenation, alignment, indent & line-breaking defaults -->
+<!-- * - "prepare" the complete man page contents for final output -->
+<!-- * - write the actual man file to the filesystem -->
+<!-- * - write any "stub" pages to the filesystem -->
+<!-- * -->
+<!-- * The templates in this file are actually called only once per -->
+<!-- * each Refentry; they are just in a separate file for the purpose -->
+<!-- * of keeping things modular. -->
+
+<!-- ==================================================================== -->
+
+<xsl:preserve-space elements="*"/>
+
+<xsl:strip-space elements="
+abstract affiliation anchor answer appendix area areaset areaspec
+artheader article audiodata audioobject author authorblurb authorgroup
+beginpage bibliodiv biblioentry bibliography biblioset blockquote book
+bookbiblio bookinfo callout calloutlist caption caution chapter
+citerefentry cmdsynopsis co collab colophon colspec confgroup
+copyright dedication docinfo editor entrytbl epigraph equation
+example figure footnote footnoteref formalpara funcprototype
+funcsynopsis glossary glossdef glossdiv glossentry glosslist graphicco
+group highlights imagedata imageobject imageobjectco important index
+indexdiv indexentry indexterm informalequation informalexample
+informalfigure informaltable inlineequation inlinemediaobject
+itemizedlist itermset keycombo keywordset legalnotice listitem lot
+mediaobject mediaobjectco menuchoice msg msgentry msgexplan msginfo
+msgmain msgrel msgset msgsub msgtext note objectinfo
+orderedlist othercredit part partintro preface printhistory procedure
+programlistingco publisher qandadiv qandaentry qandaset question
+refentry reference refmeta refnamediv refsection refsect1 refsect1info refsect2
+refsect2info refsect3 refsect3info refsynopsisdiv refsynopsisdivinfo
+revhistory revision row sbr screenco screenshot sect1 sect1info sect2
+sect2info sect3 sect3info sect4 sect4info sect5 sect5info section
+sectioninfo seglistitem segmentedlist seriesinfo set setindex setinfo
+shortcut sidebar simplelist simplesect spanspec step subject
+subjectset substeps synopfragment table tbody textobject tfoot tgroup
+thead tip toc tocchap toclevel1 toclevel2 toclevel3 toclevel4
+toclevel5 tocpart varargs variablelist varlistentry videodata
+videoobject void warning subjectset
+
+classsynopsis
+constructorsynopsis
+destructorsynopsis
+fieldsynopsis
+methodparam
+methodsynopsis
+ooclass
+ooexception
+oointerface
+simplemsgentry
+manvolnum
+"/>
+
+<!-- ==================================================================== -->
+<!-- * Get character map contents -->
+<!-- ==================================================================== -->
+
+ <xsl:variable name="man.charmap.contents">
+ <xsl:if test="$man.charmap.enabled != 0">
+ <xsl:variable name="lang">
+ <xsl:call-template name="l10n.language">
+ <xsl:with-param name="target" select="//refentry[1]"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:call-template name="read-character-map">
+ <xsl:with-param name="use.subset" select="$man.charmap.use.subset"/>
+ <xsl:with-param name="subset.profile">
+ <xsl:choose>
+ <xsl:when test="$lang = 'en'">
+ <xsl:value-of select="$man.charmap.subset.profile.english"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$man.charmap.subset.profile"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:with-param>
+ <xsl:with-param name="uri">
+ <xsl:choose>
+ <xsl:when test="$man.charmap.uri != ''">
+ <xsl:value-of select="$man.charmap.uri"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="'../manpages/charmap.groff.xsl'"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:variable>
+
+<!-- ==================================================================== -->
+
+<xsl:template name="root.messages">
+ <xsl:param name="refname"/>
+ <!-- redefine this any way you'd like to output messages -->
+ <!-- DO NOT OUTPUT ANYTHING FROM THIS TEMPLATE -->
+ <!-- Example:
+ <xsl:if test="//foo">
+ <xsl:call-template name="log.message">
+ <xsl:with-param name="level">Warn</xsl:with-param>
+ <xsl:with-param name="source" select="$refname"/>
+ <xsl:with-param name="context-desc">
+ <xsl:text>limitation</xsl:text>
+ </xsl:with-param>
+ <xsl:with-param name="message">
+ <xsl:text>Output for foo element is not yet supported.</xsl:text>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:if>
+ -->
+</xsl:template>
+
+<!-- ==================================================================== -->
+<!-- * Escape roff special chars -->
+<!-- ==================================================================== -->
+
+<!-- ******************************************************************** -->
+<!-- * -->
+<!-- * The backslash, dot, dash, and apostrophe (\, ., -, ') characters -->
+<!-- * have special meaning for roff, so before we do any other -->
+<!-- * processing, we must escape those characters where they appear in -->
+<!-- * the source content. -->
+<!-- * -->
+<!-- * Here we also deal with replacing U+00a0 (non-breaking space) with -->
+<!-- * its roff equivalent -->
+<!-- * -->
+<!-- ******************************************************************** -->
+
+<xsl:template match="//refentry//text()">
+ <xsl:call-template name="escape.roff.specials">
+ <xsl:with-param name="content">
+ <xsl:value-of select="."/>
+ </xsl:with-param>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template name="escape.roff.specials">
+ <xsl:param name="content"/>
+ <xsl:call-template name="convert.nobreak-space">
+ <xsl:with-param name="content">
+ <xsl:call-template name="escape.apostrophe">
+ <xsl:with-param name="content">
+ <xsl:call-template name="escape.dash">
+ <xsl:with-param name="content">
+ <xsl:call-template name="escape.dot">
+ <xsl:with-param name="content">
+ <xsl:call-template name="escape.backslash">
+ <xsl:with-param name="content" select="$content"/>
+ </xsl:call-template>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:with-param>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template name="escape.backslash">
+ <xsl:param name="content"/>
+ <xsl:call-template name="string.subst">
+ <xsl:with-param name="string" select="$content"/>
+ <xsl:with-param name="target">\</xsl:with-param>
+ <!-- * we use "\e" instead of "\\" because the groff docs say -->
+ <!-- * that's the correct thing to do; also because testing -->
+ <!-- * shows that "\\" doesn't always work as expected; for -->
+ <!-- * example, "\\" within a table seems to mess things up -->
+ <xsl:with-param name="replacement">\e</xsl:with-param>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template name="escape.dot">
+ <xsl:param name="content"/>
+ <xsl:call-template name="string.subst">
+ <xsl:with-param name="string" select="$content"/>
+ <xsl:with-param name="target">.</xsl:with-param>
+ <xsl:with-param name="replacement">\&amp;.</xsl:with-param>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template name="escape.dash">
+ <xsl:param name="content"/>
+ <xsl:call-template name="string.subst">
+ <xsl:with-param name="string" select="$content"/>
+ <xsl:with-param name="target">-</xsl:with-param>
+ <xsl:with-param name="replacement">\-</xsl:with-param>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template name="escape.apostrophe">
+ <xsl:param name="content"/>
+ <xsl:call-template name="string.subst">
+ <xsl:with-param name="string" select="$content"/>
+ <xsl:with-param name="target">'</xsl:with-param>
+ <xsl:with-param name="replacement">\*(Aq</xsl:with-param>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template name="convert.nobreak-space">
+ <xsl:param name="content"/>
+ <xsl:call-template name="string.subst">
+ <xsl:with-param name="string" select="$content"/>
+ <xsl:with-param name="target">&#x00a0;</xsl:with-param>
+ <!-- * A no-break space can be written two ways in roff; the -->
+ <!-- * difference, according to the "Page Motions" node in the -->
+ <!-- * groff info page, is: -->
+ <!-- * -->
+ <!-- * "\ " = -->
+ <!-- * An unbreakable and unpaddable (i.e. not expanded -->
+ <!-- * during filling) space. -->
+ <!-- * -->
+ <!-- * "\~" = -->
+ <!-- * An unbreakable space that stretches like a normal -->
+ <!-- * inter-word space when a line is adjusted." -->
+ <!-- * -->
+ <!-- * Unfortunately, roff seems to do some weird things with -->
+ <!-- * long lines that only have words separated by "\~" -->
+ <!-- * spaces, so it's safer just to stick with the "\ " space -->
+ <!-- * -->
+ <!-- * We append a "\&" to handle the case of a no-break space that -->
+ <!-- * appears at the end of a line - because later processing will -->
+ <!-- * cause that space to get eaten otherwise. -->
+ <xsl:with-param name="replacement">\ \&amp;</xsl:with-param>
+ </xsl:call-template>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<!-- * top.comment generates a comment containing metadata for the man -->
+<!-- * page; for example, Author, Generator, and Date information -->
+
+ <xsl:template name="top.comment">
+ <xsl:param name="info"/>
+ <xsl:param name="date"/>
+ <xsl:param name="title"/>
+ <xsl:param name="manual"/>
+ <xsl:param name="source"/>
+ <xsl:param name="refname"/>
+ <xsl:text>.\" Title: </xsl:text>
+ <xsl:call-template name="replace.dots.and.dashes">
+ <xsl:with-param name="content" select="$title"/>
+ </xsl:call-template>
+ <xsl:text>&#10;</xsl:text>
+ <xsl:text>.\" Author: </xsl:text>
+ <xsl:call-template name="replace.dots.and.dashes">
+ <xsl:with-param name="content">
+ <xsl:call-template name="make.roff.metadata.author">
+ <xsl:with-param name="info" select="$info"/>
+ <xsl:with-param name="refname" select="$refname"/>
+ </xsl:call-template>
+ </xsl:with-param>
+ </xsl:call-template>
+ <xsl:text>&#10;</xsl:text>
+ <xsl:text>.\" Generator: DocBook </xsl:text>
+ <xsl:value-of select="$DistroTitle"/>
+ <xsl:text> v</xsl:text>
+ <xsl:call-template name="replace.dots.and.dashes">
+ <xsl:with-param name="content" select="$VERSION"/>
+ </xsl:call-template>
+ <xsl:text> &lt;http://docbook.sf.net/></xsl:text>
+ <xsl:text>&#10;</xsl:text>
+ <xsl:text>.\" Date: </xsl:text>
+ <xsl:call-template name="replace.dots.and.dashes">
+ <xsl:with-param name="content" select="$date"/>
+ </xsl:call-template>
+ <xsl:text>&#10;</xsl:text>
+ <xsl:text>.\" Manual: </xsl:text>
+ <xsl:call-template name="replace.dots.and.dashes">
+ <xsl:with-param name="content" select="$manual"/>
+ </xsl:call-template>
+ <xsl:text>&#10;</xsl:text>
+ <xsl:text>.\" Source: </xsl:text>
+ <xsl:call-template name="replace.dots.and.dashes">
+ <xsl:with-param name="content" select="$source"/>
+ </xsl:call-template>
+ <xsl:text>&#10;</xsl:text>
+ <xsl:text>.\" Language: </xsl:text>
+ <xsl:call-template name="l10n.language.name"/>
+ <xsl:text>&#10;</xsl:text>
+ <xsl:text>.\"</xsl:text>
+ <xsl:text>&#10;</xsl:text>
+ </xsl:template>
+
+<!-- ==================================================================== -->
+
+ <xsl:template name="TH.title.line">
+
+ <!-- * The exact way that .TH contents are displayed is system- -->
+ <!-- * dependent; it varies somewhat between OSes and roff -->
+ <!-- * versions. Below is a description of how Linux systems with -->
+ <!-- * a modern groff seem to render .TH contents. -->
+ <!-- * -->
+ <!-- * title(section) extra3 title(section) <- page header -->
+ <!-- * extra2 extra1 title(section) <- page footer-->
+ <!-- * -->
+ <!-- * Or, using the names with which the man(7) man page refers -->
+ <!-- * to the various fields: -->
+ <!-- * -->
+ <!-- * title(section) manual title(section) <- page header -->
+ <!-- * source date title(section) <- page footer-->
+ <!-- * -->
+ <!-- * Note that while extra1, extra2, and extra3 are all (nominally) -->
+ <!-- * optional, in practice almost all pages include an "extra1" -->
+ <!-- * field, which is, universally, a date (in some form), and it is -->
+ <!-- * always rendered in the same place (the middle footer position) -->
+ <!-- * -->
+ <!-- * Here are a couple of examples of real-world man pages that -->
+ <!-- * have somewhat useful page headers/footers: -->
+ <!-- * -->
+ <!-- * gtk-options(7) GTK+ User's Manual gtk-options(7) -->
+ <!-- * GTK+ 1.2 2003-10-20 gtk-options(7) -->
+ <!-- * -->
+ <!-- * svgalib(7) Svgalib User Manual svgalib(7) -->
+ <!-- * Svgalib 1.4.1 16 December 1999 svgalib(7) -->
+ <!-- * -->
+ <xsl:param name="title"/>
+ <xsl:param name="section"/>
+ <xsl:param name="extra1"/>
+ <xsl:param name="extra2"/>
+ <xsl:param name="extra3"/>
+
+ <xsl:call-template name="mark.subheading"/>
+ <!-- * Note that we generate quotes around _every_ field in the -->
+ <!-- * .TH title line, including the "title" and "section" -->
+ <!-- * fields. That is because we use the contents of those "as -->
+ <!-- * is", unchanged from the DocBook source; and DTD-based -->
+ <!-- * validation does not provide a way to constrain them to be -->
+ <!-- * "space free" -->
+ <xsl:text>.TH "</xsl:text>
+ <xsl:call-template name="string.upper">
+ <xsl:with-param name="string">
+ <xsl:choose>
+ <xsl:when test="$man.th.title.max.length != ''">
+ <xsl:value-of
+ select="normalize-space(substring($title, 1, $man.th.title.max.length))"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="normalize-space($title)"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:with-param>
+ </xsl:call-template>
+ <xsl:text>" "</xsl:text>
+ <xsl:value-of select="normalize-space($section)"/>
+ <xsl:text>" "</xsl:text>
+ <xsl:if test="$man.th.extra1.suppress = 0">
+ <!-- * there is no max.length for the extra1 field; the reason -->
+ <!-- * is, it is almost always a date, and it is not possible -->
+ <!-- * to truncate dates without changing their meaning -->
+ <xsl:value-of select="normalize-space($extra1)"/>
+ </xsl:if>
+ <xsl:text>" "</xsl:text>
+ <xsl:if test="$man.th.extra2.suppress = 0">
+ <xsl:choose>
+ <!-- * if max.length is non-empty, use value to truncate field -->
+ <xsl:when test="$man.th.extra2.max.length != ''">
+ <xsl:value-of
+ select="normalize-space(substring($extra2, 1, $man.th.extra2.max.length))"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="normalize-space($extra2)"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:if>
+ <xsl:text>" "</xsl:text>
+ <xsl:if test="$man.th.extra3.suppress = 0">
+ <xsl:choose>
+ <!-- * if max.length is non-empty, use value to truncate field -->
+ <xsl:when test="$man.th.extra3.max.length != ''">
+ <xsl:value-of
+ select="normalize-space(substring($extra3, 1, $man.th.extra3.max.length))"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="normalize-space($extra3)"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:if>
+ <xsl:text>"&#10;</xsl:text>
+ <xsl:call-template name="mark.subheading"/>
+ </xsl:template>
+
+ <!-- ============================================================== -->
+
+ <xsl:template name="set.default.formatting">
+ <!-- * Set default hyphenation, justification, indentation and -->
+ <!-- * line-breaking -->
+ <!-- * -->
+ <!-- * If the value of man.hypenate is zero (the default), then -->
+ <!-- * disable hyphenation (".nh" = "no hyphenation") -->
+ <xsl:text>.\" -----------------------------------------------------------------&#10;</xsl:text>
+ <xsl:text>.\" * set default formatting&#10;</xsl:text>
+ <xsl:text>.\" -----------------------------------------------------------------&#10;</xsl:text>
+ <xsl:if test="$man.hyphenate = 0">
+ <xsl:text>.\" disable hyphenation&#10;</xsl:text>
+ <xsl:text>.nh&#10;</xsl:text>
+ </xsl:if>
+ <!-- * If the value of man.justify is zero (the default), then -->
+ <!-- * disable justification (".ad l" means "adjust to left only") -->
+ <xsl:if test="$man.justify = 0">
+ <xsl:text>.\" disable justification</xsl:text>
+ <xsl:text> (adjust text to left margin only)&#10;</xsl:text>
+ <xsl:text>.ad l&#10;</xsl:text>
+ </xsl:if>
+ <xsl:if test="not($man.indent.refsect = 0)">
+ <xsl:text>.\" store initial "default indentation value"&#10;</xsl:text>
+ <xsl:text>.nr zq \n(IN&#10;</xsl:text>
+ <xsl:text>.\" adjust default indentation&#10;</xsl:text>
+ <xsl:text>.nr IN </xsl:text>
+ <xsl:value-of select="$man.indent.width"/>
+ <xsl:text>&#10;</xsl:text>
+ <xsl:text>.\" adjust indentation of SS headings&#10;</xsl:text>
+ <xsl:text>.nr SN \n(IN&#10;</xsl:text>
+ </xsl:if>
+ <!-- * Unless the value of man.break.after.slash is zero (the -->
+ <!-- * default), tell groff that it is OK to break a line -->
+ <!-- * after a slash when needed. -->
+ <xsl:if test="$man.break.after.slash != 0">
+ <xsl:text>.\" enable line breaks after slashes&#10;</xsl:text>
+ <xsl:text>.cflags 4 /&#10;</xsl:text>
+ </xsl:if>
+ </xsl:template>
+
+ <!-- ================================================================== -->
+
+ <!-- * The prepare.manpage.contents template is called after all -->
+ <!-- * other processing has been done, before serializing the -->
+ <!-- * result of all the other processing. It basically works on -->
+ <!-- * the result as one big string. -->
+ <xsl:template name="prepare.manpage.contents">
+ <xsl:param name="content" select="''"/>
+
+ <!-- * If user has provided a "local" string-substitution map to -->
+ <!-- * be applied /before/ the standard string-substitution map, -->
+ <!-- * apply it. -->
+ <xsl:variable name="pre.adjusted.content">
+ <xsl:choose>
+ <xsl:when test="$man.string.subst.map.local.pre">
+ <!-- * normalized value of man.string.subst.map.local.pre -->
+ <!-- * is non-empty, so get contents of map and apply them -->
+ <xsl:call-template name="apply-string-subst-map">
+ <xsl:with-param name="content" select="$content"/>
+ <xsl:with-param name="map.contents"
+ select="exsl:node-set($man.string.subst.map.local.pre)/*"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <!-- * value of man.string.subst.map.local.pre is empty, -->
+ <!-- * so just copy original contents -->
+ <xsl:value-of select="$content"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <!-- * Apply standard string-substitution map. The main purpose -->
+ <!-- * of this map is to escape certain characters that have -->
+ <!-- * special meaning in roff, and to replace certain characters -->
+ <!-- * used within the stylesheet internally to represent roff -->
+ <!-- * markup characters. -->
+ <xsl:variable name="adjusted.content">
+ <xsl:call-template name="apply-string-subst-map">
+ <xsl:with-param name="content" select="$pre.adjusted.content"/>
+ <xsl:with-param name="map.contents"
+ select="exsl:node-set($man.string.subst.map)/*"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <!-- * If user has provided a "local" string-substitution map to -->
+ <!-- * be applied /after/ the standard string-substitution map, -->
+ <!-- * apply it. -->
+ <xsl:variable name="post.adjusted.content">
+ <xsl:choose>
+ <xsl:when test="$man.string.subst.map.local.post">
+ <!-- * normalized value of man.string.subst.map.local.post -->
+ <!-- * is non-empty, so get contents of map and apply them -->
+ <xsl:call-template name="apply-string-subst-map">
+ <xsl:with-param name="content" select="$adjusted.content"/>
+ <xsl:with-param name="map.contents"
+ select="exsl:node-set($man.string.subst.map.local.post)/*"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <!-- * value of man.string.subst.map.local.post is empty, -->
+ <!-- * so just copy original contents -->
+ <xsl:value-of select="$adjusted.content"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <!-- * Optionally, apply a character map to replace Unicode -->
+ <!-- * symbols and special characters. -->
+ <xsl:choose>
+ <xsl:when test="$man.charmap.enabled != 0">
+ <xsl:call-template name="apply-character-map">
+ <xsl:with-param name="content" select="$post.adjusted.content"/>
+ <xsl:with-param name="map.contents"
+ select="exsl:node-set($man.charmap.contents)/*"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <!-- * if we reach here, value of $man.charmap.enabled is zero, -->
+ <!-- * so we just pass the adjusted contents through "as is" -->
+ <xsl:value-of select="$adjusted.content"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+ <!-- ================================================================== -->
+
+ <xsl:template name="write.man.file">
+ <xsl:param name="name"/>
+ <xsl:param name="section"/>
+ <xsl:param name="lang"/>
+ <xsl:param name="content"/>
+ <xsl:param name="filename">
+ <xsl:call-template name="make.adjusted.man.filename">
+ <xsl:with-param name="name" select="$name"/>
+ <xsl:with-param name="section" select="$section"/>
+ <xsl:with-param name="lang" select="$lang"/>
+ </xsl:call-template>
+ </xsl:param>
+ <xsl:call-template name="write.text.chunk">
+ <xsl:with-param name="filename" select="$filename"/>
+ <xsl:with-param name="suppress-context-node-name" select="1"/>
+ <xsl:with-param name="quiet" select="$man.output.quietly"/>
+ <xsl:with-param
+ name="message-prolog"
+ >Note: </xsl:with-param>
+ <xsl:with-param name="encoding" select="$man.output.encoding"/>
+ <xsl:with-param name="content" select="$content"/>
+ </xsl:call-template>
+ </xsl:template>
+
+ <!-- ============================================================== -->
+
+ <!-- * A "stub" is sort of alias for another file, intended to be read -->
+ <!-- * and expanded by soelim(1); it's simply a file whose complete -->
+ <!-- * contents are just a single line of the following form: -->
+ <!-- * -->
+ <!-- * .so manX/realname.X -->
+ <!-- * -->
+ <!-- * "realname" is a name of another man-page file. That .so line is -->
+ <!-- * basically a roff "include" statement. When the man command finds -->
+ <!-- * it, it calls soelim(1) and includes and displays the contents of -->
+ <!-- * the manX/realqname.X file. -->
+ <!-- * -->
+ <!-- * If a refentry has multiple refnames, we generate a "stub" page for -->
+ <!-- * each refname found, except for the first one. -->
+ <xsl:template name="write.stubs">
+ <xsl:param name="first.refname"/>
+ <xsl:param name="section"/>
+ <xsl:param name="lang"/>
+ <xsl:for-each select="refnamediv/refname">
+ <xsl:if test=". != $first.refname">
+ <xsl:call-template name="write.text.chunk">
+ <xsl:with-param name="filename">
+ <xsl:call-template name="make.adjusted.man.filename">
+ <xsl:with-param name="name" select="."/>
+ <xsl:with-param name="section" select="$section"/>
+ <xsl:with-param name="lang" select="$lang"/>
+ </xsl:call-template>
+ </xsl:with-param>
+ <xsl:with-param name="quiet" select="$man.output.quietly"/>
+ <xsl:with-param name="suppress-context-node-name" select="1"/>
+ <xsl:with-param name="message-prolog">Note: </xsl:with-param>
+ <xsl:with-param name="message-epilog"> (soelim stub)</xsl:with-param>
+ <xsl:with-param name="content">
+ <xsl:value-of select="'.so '"/>
+ <xsl:call-template name="make.adjusted.man.filename">
+ <xsl:with-param name="name" select="$first.refname"/>
+ <xsl:with-param name="section" select="$section"/>
+ <xsl:with-param name="lang" select="$lang"/>
+ </xsl:call-template>
+ <xsl:text>&#10;</xsl:text>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:for-each>
+ </xsl:template>
+
+ <!-- ============================================================== -->
+
+ <!-- * A manifest file is useful for doing "make clean" during -->
+ <!-- * builds and for other purposes. When we make the manifest -->
+ <!-- * file, we need to include in it a filename for each man-page -->
+ <!-- * generated, including any "stub" pages. -->
+ <xsl:template name="generate.manifest">
+ <xsl:variable name="filelist">
+ <xsl:for-each select="//refentry">
+ <!-- * all refname instances in a Refentry inherit their section -->
+ <!-- * numbers from the parent Refentry; so we only need to get -->
+ <!-- * the section once per Refentry, not once per Refname -->
+ <xsl:variable name="section">
+ <xsl:call-template name="get.refentry.section">
+ <xsl:with-param name="quiet" select="1"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:variable name="lang">
+ <xsl:call-template name="l10n.language"/>
+ </xsl:variable>
+ <xsl:for-each select="refnamediv/refname">
+ <xsl:call-template name="make.adjusted.man.filename">
+ <xsl:with-param name="name" select="."/>
+ <xsl:with-param name="section" select="$section"/>
+ <xsl:with-param name="lang" select="$lang"/>
+ </xsl:call-template>
+ <xsl:text>&#10;</xsl:text>
+ </xsl:for-each>
+ </xsl:for-each>
+ </xsl:variable>
+
+ <!-- * we write the manifest file once per document, not once per -->
+ <!-- * Refentry -->
+ <xsl:call-template name="write.text.chunk">
+ <xsl:with-param name="filename">
+ <xsl:value-of select="$man.output.manifest.filename"/>
+ </xsl:with-param>
+ <xsl:with-param name="quiet" select="1"/>
+ <xsl:with-param name="message-prolog">Note: </xsl:with-param>
+ <xsl:with-param name="message-epilog"> (manifest file)</xsl:with-param>
+ <xsl:with-param name="content">
+ <xsl:value-of select="$filelist"/>
+ </xsl:with-param>
+ </xsl:call-template>
+ <xsl:if test="$man.output.quietly = 0">
+ <xsl:message><xsl:text>&#10;</xsl:text></xsl:message>
+ </xsl:if>
+ </xsl:template>
+
+ <!-- ============================================================== -->
+
+ <!-- There is some stuff, that is not portable between groff/troff. -->
+ <xsl:template name="define.portability.macros">
+ <xsl:text>.\" -----------------------------------------------------------------&#10;</xsl:text>
+ <xsl:text>.\" * Define some portability stuff&#10;</xsl:text>
+ <xsl:text>.\" -----------------------------------------------------------------&#10;</xsl:text>
+ <xsl:text>.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~&#10;</xsl:text>
+ <xsl:text>.\" http://bugs.debian.org/507673&#10;</xsl:text>
+ <xsl:text>.\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html&#10;</xsl:text>
+ <xsl:text>.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~&#10;</xsl:text>
+ <xsl:text>&#10;</xsl:text>
+ <xsl:text>.ie \n(.g .ds Aq \(aq</xsl:text>
+ <xsl:text>&#10;</xsl:text>
+ <xsl:text>.el .ds Aq '</xsl:text>
+ <xsl:text>&#10;</xsl:text>
+ </xsl:template>
+
+ <!-- ============================================================== -->
+
+ <xsl:template name="define.macros">
+ <xsl:text>.\" -----------------------------------------------------------------&#10;</xsl:text>
+ <xsl:text>.\" * (re)Define some macros&#10;</xsl:text>
+ <xsl:text>.\" -----------------------------------------------------------------&#10;</xsl:text>
+ <xsl:text>.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~&#10;</xsl:text>
+ <xsl:text>.\" toupper - uppercase a string (locale-aware)&#10;</xsl:text>
+ <xsl:text>.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~&#10;</xsl:text>
+ <xsl:text>.de toupper&#10;</xsl:text>
+ <xsl:text>.tr</xsl:text>
+ <xsl:text> </xsl:text>
+ <xsl:call-template name="make.tr.uppercase.arg"/>
+ <xsl:text>\\$*&#10;</xsl:text>
+ <xsl:text>.tr</xsl:text>
+ <xsl:text> </xsl:text>
+ <xsl:call-template name="make.tr.normalcase.arg"/>
+ <xsl:text>..&#10;</xsl:text>
+ <xsl:text>.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~&#10;</xsl:text>
+ <xsl:text>.\" SH-xref - format a cross-reference to an SH section&#10;</xsl:text>
+ <xsl:text>.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~&#10;</xsl:text>
+ <xsl:text>.de SH-xref
+.ie n \{\
+.\}
+.toupper \\$*
+.el \{\
+\\$*
+.\}
+..&#10;</xsl:text>
+ <xsl:text>.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~&#10;</xsl:text>
+ <xsl:text>.\" SH - level-one heading that works better for non-TTY output&#10;</xsl:text>
+ <xsl:text>.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~&#10;</xsl:text>
+ <xsl:text>.de1 SH&#10;</xsl:text>
+ <xsl:text>.\" put an extra blank line of space above the head in non-TTY output&#10;</xsl:text>
+ <xsl:call-template name="roff-if-start">
+ <xsl:with-param name="condition">t</xsl:with-param>
+ </xsl:call-template>
+ <xsl:text>.sp 1&#10;</xsl:text>
+ <xsl:call-template name="roff-if-end"/>
+ <xsl:text>.sp \\n[PD]u
+.nr an-level 1
+.set-an-margin
+.nr an-prevailing-indent \\n[IN]
+.fi
+.in \\n[an-margin]u
+.ti 0
+.HTML-TAG ".NH \\n[an-level]"
+.it 1 an-trap
+.nr an-no-space-flag 1
+.nr an-break-flag 1
+\." make the size of the head bigger
+.ps +3
+.ft B
+.ne (2v + 1u)
+.ie n \{\
+.\" if n (TTY output), use uppercase
+.toupper \\$*
+.\}
+.el \{\
+.nr an-break-flag 0
+.\" if not n (not TTY), use normal case (not uppercase)
+\\$1
+.in \\n[an-margin]u
+.ti 0
+.\" if not n (not TTY), put a border/line under subheading
+.sp -.6
+\l'\n(.lu'
+.\}
+..&#10;</xsl:text>
+ <xsl:text>.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~&#10;</xsl:text>
+ <xsl:text>.\" SS - level-two heading that works better for non-TTY output&#10;</xsl:text>
+ <xsl:text>.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~&#10;</xsl:text>
+ <xsl:text>.de1 SS
+.sp \\n[PD]u
+.nr an-level 1
+.set-an-margin
+.nr an-prevailing-indent \\n[IN]
+.fi
+.in \\n[IN]u
+.ti \\n[SN]u
+.it 1 an-trap
+.nr an-no-space-flag 1
+.nr an-break-flag 1
+.ps \\n[PS-SS]u
+\." make the size of the head bigger
+.ps +2
+.ft B
+.ne (2v + 1u)
+.if \\n[.$] \&amp;\\$*
+..&#10;</xsl:text>
+ <xsl:text>.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~&#10;</xsl:text>
+ <xsl:text>.\" BB/EB - put background/screen (filled box) around block of text&#10;</xsl:text>
+ <xsl:text>.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~&#10;</xsl:text>
+ <xsl:text>.de BB
+.if t \{\
+.sp -.5
+.br
+.in +2n
+.ll -2n
+.gcolor red
+.di BX
+.\}
+..
+.de EB
+.if t \{\
+.if "\\$2"adjust-for-leading-newline" \{\
+.sp -1
+.\}
+.br
+.di
+.in
+.ll
+.gcolor
+.nr BW \\n(.lu-\\n(.i
+.nr BH \\n(dn+.5v
+.ne \\n(BHu+.5v
+.ie "\\$2"adjust-for-leading-newline" \{\
+\M[\\$1]\h'1n'\v'+.5v'\D'P \\n(BWu 0 0 \\n(BHu -\\n(BWu 0 0 -\\n(BHu'\M[]
+.\}
+.el \{\
+\M[\\$1]\h'1n'\v'-.5v'\D'P \\n(BWu 0 0 \\n(BHu -\\n(BWu 0 0 -\\n(BHu'\M[]
+.\}
+.in 0
+.sp -.5v
+.nf
+.BX
+.in
+.sp .5v
+.fi
+.\}
+..&#10;</xsl:text>
+ <xsl:text>.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~&#10;</xsl:text>
+ <xsl:text>.\" BM/EM - put colored marker in margin next to block of text&#10;</xsl:text>
+ <xsl:text>.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~&#10;</xsl:text>
+ <xsl:text>.de BM
+.if t \{\
+.br
+.ll -2n
+.gcolor red
+.di BX
+.\}
+..
+.de EM
+.if t \{\
+.br
+.di
+.ll
+.gcolor
+.nr BH \\n(dn
+.ne \\n(BHu
+\M[\\$1]\D'P -.75n 0 0 \\n(BHu -(\\n[.i]u - \\n(INu - .75n) 0 0 -\\n(BHu'\M[]
+.in 0
+.nf
+.BX
+.in
+.fi
+.\}
+..&#10;</xsl:text>
+</xsl:template>
+
+<xsl:template name="make.tr.uppercase.arg">
+ <xsl:call-template name="string.shuffle">
+ <xsl:with-param name="string1">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'lowercase.alpha'"/>
+ </xsl:call-template>
+ </xsl:with-param>
+ <xsl:with-param name="string2">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'uppercase.alpha'"/>
+ </xsl:call-template>
+ </xsl:with-param>
+ </xsl:call-template>
+ <xsl:text>&#10;</xsl:text>
+</xsl:template>
+
+<xsl:template name="make.tr.normalcase.arg">
+ <xsl:call-template name="string.shuffle">
+ <xsl:with-param name="string1">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'lowercase.alpha'"/>
+ </xsl:call-template>
+ </xsl:with-param>
+ <xsl:with-param name="string2">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'lowercase.alpha'"/>
+ </xsl:call-template>
+ </xsl:with-param>
+ </xsl:call-template>
+ <xsl:text>&#10;</xsl:text>
+</xsl:template>
+
+<xsl:template name="string.shuffle">
+ <!-- * given two strings, "shuffle" them together into one -->
+ <xsl:param name="string1"/>
+ <xsl:param name="string2"/>
+ <xsl:value-of select="substring($string1, 1, 1)"/>
+ <xsl:value-of select="substring($string2, 1, 1)"/>
+ <xsl:if test="string-length($string1) > 1">
+ <xsl:call-template name="string.shuffle">
+ <xsl:with-param name="string1">
+ <xsl:value-of select="substring($string1, 2)"/>
+ </xsl:with-param>
+ <xsl:with-param name="string2">
+ <xsl:value-of select="substring($string2, 2)"/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:if>
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/manpages/param.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/manpages/param.xml
new file mode 100644
index 0000000..706c99d
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/manpages/param.xml
@@ -0,0 +1,3220 @@
+<?xml version="1.0" encoding="ASCII"?>
+<book version="5.0">
+ <info>
+ <title>Manpages Parameter Reference</title>
+ <releaseinfo role="meta">
+ $Id: param.xweb 8235 2009-02-09 16:22:14Z xmldoc $
+ </releaseinfo>
+ <author>
+ <orgname>The DocBook Project</orgname>
+ </author>
+ <copyright>
+ <year>2005-2007</year>
+ <holder>The DocBook Project</holder>
+ </copyright>
+ <abstract>
+ <para>This is reference documentation for all user-configurable
+ parameters in the DocBook XSL "manpages" stylesheet (for
+ generating groff/nroff output). Note that the manpages
+ stylesheet is a customization layer of the DocBook XSL HTML
+ stylesheet. Therefore, you can also use a number of <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="../html/">HTML stylesheet parameters</link>
+ to control manpages output (in addition to the
+ manpages-specific parameters listed in this section).</para>
+ </abstract>
+ </info>
+ <reference xml:id="general">
+ <title>Hyphenation, justification, and breaking</title>
+<refentry version="5.0" xml:id="man.hyphenate">
+<refmeta>
+<refentrytitle>man.hyphenate</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>man.hyphenate</refname>
+<refpurpose>Enable hyphenation?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="man.hyphenate.frag">
+&lt;xsl:param name="man.hyphenate"&gt;0&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, hyphenation is enabled.</para>
+
+<note>
+<para>The default value for this parameter is zero because groff is
+not particularly smart about how it does hyphenation; it can end up
+hyphenating a lot of things that you don't want hyphenated. To
+mitigate that, the default behavior of the stylesheets is to suppress
+hyphenation of computer inlines, filenames, and URLs. (You can
+override the default behavior by setting non-zero values for the
+<parameter>man.hyphenate.urls</parameter>,
+<parameter>man.hyphenate.filenames</parameter>, and
+<parameter>man.hyphenate.computer.inlines</parameter> parameters.) But
+the best way is still to just globally disable hyphenation, as the
+stylesheets do by default.</para>
+
+<para>The only good reason to enabled hyphenation is if you have also
+enabled justification (which is disabled by default). The reason is
+that justified text can look very bad unless you also hyphenate it; to
+quote the <quote>Hypenation</quote> node from the groff info page:
+
+<blockquote>
+ <para><emphasis>Since the odds are not great for finding a set of
+ words, for every output line, which fit nicely on a line without
+ inserting excessive amounts of space between words, 'gtroff'
+ hyphenates words so that it can justify lines without inserting too
+ much space between words.</emphasis></para>
+</blockquote>
+
+So, if you set a non-zero value for the
+<parameter>man.justify</parameter> parameter (to enable
+justification), then you should probably also set a non-zero value for
+<parameter>man.hyphenate</parameter> (to enable hyphenation).</para>
+</note>
+
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="man.hyphenate.urls">
+<refmeta>
+<refentrytitle>man.hyphenate.urls</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>man.hyphenate.urls</refname>
+<refpurpose>Hyphenate URLs?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="man.hyphenate.urls.frag">
+&lt;xsl:param name="man.hyphenate.urls"&gt;0&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If zero (the default), hyphenation is suppressed for output of
+the <tag>ulink</tag> <tag class="attribute">url</tag> attribute.</para>
+
+<note>
+ <para>If hyphenation is already turned off globally (that is, if
+ <parameter>man.hyphenate</parameter> is zero, setting
+ <parameter>man.hyphenate.urls</parameter> is not necessary.</para>
+</note>
+
+<para>If <parameter>man.hyphenate.urls</parameter> is non-zero, URLs
+will not be treated specially and are subject to hyphenation just like
+other words.</para>
+
+<note>
+ <para>If you are thinking about setting a non-zero value for
+ <parameter>man.hyphenate.urls</parameter> in order to make long
+ URLs break across lines, you'd probably be better off
+ experimenting with setting the
+ <parameter>man.break.after.slash</parameter> parameter first. That
+ will cause long URLs to be broken after slashes.</para>
+</note>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="man.hyphenate.filenames">
+<refmeta>
+<refentrytitle>man.hyphenate.filenames</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>man.hyphenate.filenames</refname>
+<refpurpose>Hyphenate filenames?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="man.hyphenate.filenames.frag">
+&lt;xsl:param name="man.hyphenate.filenames"&gt;0&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If zero (the default), hyphenation is suppressed for
+<tag>filename</tag> output.</para>
+
+<note>
+ <para>If hyphenation is already turned off globally (that is, if
+ <parameter>man.hyphenate</parameter> is zero, setting
+ <parameter>man.hyphenate.filenames</parameter> is not
+ necessary.</para>
+</note>
+
+<para>If <parameter>man.hyphenate.filenames</parameter> is non-zero,
+filenames will not be treated specially and are subject to hyphenation
+just like other words.</para>
+
+<note>
+ <para>If you are thinking about setting a non-zero value for
+ <parameter>man.hyphenate.filenames</parameter> in order to make long
+ filenames/pathnames break across lines, you'd probably be better off
+ experimenting with setting the
+ <parameter>man.break.after.slash</parameter> parameter first. That
+ will cause long pathnames to be broken after slashes.</para>
+</note>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="man.hyphenate.computer.inlines">
+<refmeta>
+<refentrytitle>man.hyphenate.computer.inlines</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>man.hyphenate.computer.inlines</refname>
+<refpurpose>Hyphenate computer inlines?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="man.hyphenate.computer.inlines.frag">
+&lt;xsl:param name="man.hyphenate.computer.inlines"&gt;0&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If zero (the default), hyphenation is suppressed for
+<quote>computer inlines</quote> such as environment variables,
+constants, etc. This parameter current affects output of the following
+elements:
+<simplelist type="inline">
+
+ <member><tag>classname</tag></member>
+ <member><tag>constant</tag></member>
+ <member><tag>envar</tag></member>
+ <member><tag>errorcode</tag></member>
+ <member><tag>option</tag></member>
+ <member><tag>replaceable</tag></member>
+ <member><tag>userinput</tag></member>
+ <member><tag>type</tag></member>
+ <member><tag>varname</tag></member>
+</simplelist>
+</para>
+
+<note>
+ <para>If hyphenation is already turned off globally (that is, if
+ <parameter>man.hyphenate</parameter> is zero, setting the
+ <parameter>man.hyphenate.computer.inlines</parameter> is not
+ necessary.</para>
+</note>
+
+<para>If <parameter>man.hyphenate.computer.inlines</parameter> is
+non-zero, computer inlines will not be treated specially and will be
+hyphenated like other words when needed.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="man.justify">
+<refmeta>
+<refentrytitle>man.justify</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>man.justify</refname>
+<refpurpose>Justify text to both right and left margins?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="man.justify.frag">
+&lt;xsl:param name="man.justify"&gt;0&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, text is justified to both the right and left
+margins (or, in roff terminology, "adjusted and filled" to both the
+right and left margins). If zero (the default), text is adjusted to
+the left margin only -- producing what is traditionally called
+"ragged-right" text.</para>
+
+<note>
+<para>The default value for this parameter is zero because justified
+text looks good only when it is also hyphenated. Without hyphenation,
+excessive amounts of space often end up getting between words, in
+order to "pad" lines out to align on the right margin.</para>
+
+<para>The problem is that groff is not particularly smart about how it
+does hyphenation; it can end up hyphenating a lot of things that you
+don't want hyphenated. So, disabling both justification and
+hyphenation ensures that hyphens won't get inserted where you don't
+want to them, and you don't end up with lines containing excessive
+amounts of space between words.</para>
+
+<para>However, if do you decide to set a non-zero value for the
+<parameter>man.justify</parameter> parameter (to enable
+justification), then you should probably also set a non-zero value for
+<parameter>man.hyphenate</parameter> (to enable hyphenation).</para>
+
+<para>Yes, these default settings run counter to how most existing man
+pages are formatted. But there are some notable exceptions, such as
+the <literal>perl</literal> man pages.</para>
+</note>
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="man.break.after.slash">
+<refmeta>
+<refentrytitle>man.break.after.slash</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>man.break.after.slash</refname>
+<refpurpose>Enable line-breaking after slashes?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="man.break.after.slash.frag">
+&lt;xsl:param name="man.break.after.slash"&gt;0&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, line-breaking after slashes is enabled. This is
+mainly useful for causing long URLs or pathnames/filenames to be
+broken up or "wrapped" across lines (though it also has the side
+effect of sometimes causing relatively short URLs and pathnames to be
+broken up across lines too).</para>
+
+<para>If zero (the default), line-breaking after slashes is
+disabled. In that case, strings containing slashes (for example, URLs
+or filenames) are not broken across lines, even if they exceed the
+maximum column widith.</para>
+
+<warning>
+ <para>If you set a non-zero value for this parameter, check your
+ man-page output carefuly afterwards, in order to make sure that the
+ setting has not introduced an excessive amount of breaking-up of URLs
+ or pathnames. If your content contains mostly short URLs or
+ pathnames, setting a non-zero value for
+ <parameter>man.break.after.slash</parameter> will probably result in
+ in a significant number of relatively short URLs and pathnames being
+ broken across lines, which is probably not what you want.</para>
+</warning>
+
+</refsection>
+</refentry>
+
+ </reference>
+ <reference xml:id="indent">
+ <title>Indentation</title>
+<refentry version="5.0" xml:id="man.indent.width">
+<refmeta>
+<refentrytitle>man.indent.width</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">length</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>man.indent.width</refname>
+<refpurpose>Specifies width used for adjusted indents</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="man.indent.width.frag">
+&lt;xsl:param name="man.indent.width"&gt;4&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+<para>The <parameter>man.indent.width</parameter> parameter specifies
+the width used for adjusted indents. The value of
+<parameter>man.indent.width</parameter> is used for indenting of
+lists, verbatims, headings, and elsewhere, depending on whether the
+values of certain <literal>man.indent.*</literal> boolean parameters
+are non-zero.</para>
+
+<para>The value of <parameter>man.indent.width</parameter> should
+include a valid roff measurement unit (for example,
+<literal>n</literal> or <literal>u</literal>). The default value of
+<literal>4n</literal> specifies a 4-en width; when viewed on a
+console, that amounts to the width of four characters. For details
+about roff measurment units, see the <literal>Measurements</literal>
+node in the groff info page.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="man.indent.refsect">
+<refmeta>
+<refentrytitle>man.indent.refsect</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>man.indent.refsect</refname>
+<refpurpose>Adjust indentation of refsect* and refsection?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="man.indent.refsect.frag">
+&lt;xsl:param name="man.indent.refsect" select="0"&gt;&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If the value of <parameter>man.indent.refsect</parameter> is
+non-zero, the width of the left margin for
+<tag>refsect1</tag>, <tag>refsect2</tag> and
+<tag>refsect3</tag> contents and titles (and first-level,
+second-level, and third-level nested
+<tag>refsection</tag>instances) is adjusted by the value of
+the <parameter>man.indent.width</parameter> parameter. With
+<parameter>man.indent.width</parameter> set to its default value of
+<literal>3n</literal>, the main results are that:
+
+<itemizedlist>
+ <listitem>
+ <para>contents of <tag>refsect1</tag> are output with a
+ left margin of three characters instead the roff default of seven
+ or eight characters</para>
+ </listitem>
+ <listitem>
+ <para>contents of <tag>refsect2</tag> are displayed in
+ console output with a left margin of six characters instead the of
+ the roff default of seven characters</para>
+ </listitem>
+ <listitem>
+ <para> the contents of <tag>refsect3</tag> and nested
+ <tag>refsection</tag> instances are adjusted
+ accordingly.</para>
+ </listitem>
+</itemizedlist>
+
+If instead the value of <parameter>man.indent.refsect</parameter> is
+zero, no margin adjustment is done for <literal>refsect*</literal>
+output.</para>
+
+<tip>
+ <para>If your content is primarly comprised of
+ <tag>refsect1</tag> and <tag>refsect2</tag> content
+ (or the <tag>refsection</tag> equivalent)&#160;&#8211; with few or
+ no <tag>refsect3</tag> or lower nested sections , you may be
+ able to &#8220;conserve&#8221; space in your output by setting
+ <parameter>man.indent.refsect</parameter> to a non-zero value. Doing
+ so will &#8220;squeeze&#8221; the left margin in such as way as to provide an
+ additional four characters of &#8220;room&#8221; per line in
+ <tag>refsect1</tag> output. That extra room may be useful
+ if, for example, you have many verbatim sections with long lines in
+ them.</para>
+</tip>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="man.indent.blurbs">
+<refmeta>
+<refentrytitle>man.indent.blurbs</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>man.indent.blurbs</refname>
+<refpurpose>Adjust indentation of blurbs?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="man.indent.blurbs.frag">
+&lt;xsl:param name="man.indent.blurbs" select="1"&gt;&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If the value of <parameter>man.indent.blurbs</parameter> is
+non-zero, the width of the left margin for
+<tag>authorblurb</tag>, <tag>personblurb</tag>, and
+<tag>contrib</tag> output is set to the value of the
+<parameter>man.indent.width</parameter> parameter
+(<literal>3n</literal> by default). If instead the value of
+<parameter>man.indent.blurbs</parameter> is zero, the built-in roff
+default width (<literal>7.2n</literal>) is used.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="man.indent.lists">
+<refmeta>
+<refentrytitle>man.indent.lists</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>man.indent.lists</refname>
+<refpurpose>Adjust indentation of lists?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="man.indent.lists.frag">
+&lt;xsl:param name="man.indent.lists" select="1"&gt;&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If the value of <parameter>man.indent.lists</parameter> is
+non-zero, the width of the left margin for list items in
+<tag>itemizedlist</tag>,
+<tag>orderedlist</tag>,
+<tag>variablelist</tag> output (and output of some other
+lists) is set to the value of the
+<parameter>man.indent.width</parameter> parameter
+(<literal>4n</literal> by default). If instead the value of
+<parameter>man.indent.lists</parameter> is zero, the built-in roff
+default width (<literal>7.2n</literal>) is used.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="man.indent.verbatims">
+<refmeta>
+<refentrytitle>man.indent.verbatims</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>man.indent.verbatims</refname>
+<refpurpose>Adjust indentation of verbatims?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="man.indent.verbatims.frag">
+&lt;xsl:param name="man.indent.verbatims" select="1"&gt;&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If the value of <parameter>man.indent.verbatims</parameter> is
+non-zero, the width of the left margin for output of verbatim
+environments (<tag>programlisting</tag>,
+<tag>screen</tag>, and so on) is set to the value of the
+<parameter>man.indent.width</parameter> parameter
+(<literal>3n</literal> by default). If instead the value of
+<parameter>man.indent.verbatims</parameter> is zero, the built-in roff
+default width (<literal>7.2n</literal>) is used.</para>
+
+</refsection>
+</refentry>
+
+ </reference>
+ <reference xml:id="fonts">
+ <title>Fonts</title>
+<refentry version="5.0" xml:id="man.font.funcprototype">
+<refmeta>
+<refentrytitle>man.font.funcprototype</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>man.font.funcprototype</refname>
+<refpurpose>Specifies font for funcprototype output</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="man.font.funcprototype.frag">
+ &lt;xsl:param name="man.font.funcprototype"&gt;BI&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The <parameter>man.font.funcprototype</parameter> parameter
+specifies the font for <tag>funcprototype</tag> output. It
+should be a valid roff font name, such as <literal>BI</literal> or
+<literal>B</literal>.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="man.font.funcsynopsisinfo">
+<refmeta>
+<refentrytitle>man.font.funcsynopsisinfo</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>man.font.funcsynopsisinfo</refname>
+<refpurpose>Specifies font for funcsynopsisinfo output</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="man.font.funcsynopsisinfo.frag">
+ &lt;xsl:param name="man.font.funcsynopsisinfo"&gt;B&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The <parameter>man.font.funcsynopsisinfo</parameter> parameter
+specifies the font for <tag>funcsynopsisinfo</tag> output. It
+should be a valid roff font name, such as <literal>B</literal> or
+<literal>I</literal>.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="man.font.links">
+<refmeta>
+<refentrytitle>man.font.links</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>man.font.links</refname>
+<refpurpose>Specifies font for links</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="man.font.links.frag">
+&lt;xsl:param name="man.font.links"&gt;B&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The <parameter>man.font.links</parameter> parameter
+specifies the font for output of links (<tag>ulink</tag> instances
+and any instances of any element with an <tag class="attribute">xlink:href</tag> attribute).</para>
+
+<para>The value of <parameter>man.font.links</parameter> must be
+ either <literal>B</literal> or <literal>I</literal>, or empty. If
+the value is empty, no font formatting is applied to links.</para>
+
+<para>If you set <parameter>man.endnotes.are.numbered</parameter> and/or
+<parameter>man.endnotes.list.enabled</parameter> to zero (disabled), then
+you should probably also set an empty value for
+<parameter>man.font.links</parameter>. But if
+<parameter>man.endnotes.are.numbered</parameter> is non-zero (enabled),
+you should probably keep
+<parameter>man.font.links</parameter> set to
+<literal>B</literal> or <literal>I</literal><footnote><para>The
+ main purpose of applying a font format to links in most output
+formats it to indicate that the formatted text is
+&#8220;clickable&#8221;; given that links rendered in man pages are
+not &#8220;real&#8221; hyperlinks that users can click on, it might
+seem like there is never a good reason to have font formatting for
+link contents in man output.</para>
+<para>In fact, if you suppress the
+display of inline link references (by setting
+<parameter>man.endnotes.are.numbered</parameter> to zero), there is no
+good reason to apply font formatting to links. However, if
+<parameter>man.endnotes.are.numbered</parameter> is non-zero, having
+font formatting for links (arguably) serves a purpose: It provides
+&#8220;context&#8221; information about exactly what part of the text
+is being &#8220;annotated&#8221; by the link. Depending on how you
+mark up your content, that context information may or may not
+have value.</para></footnote>.</para>
+</refsection>
+
+<refsection><info><title>Related Parameters</title></info>
+ <para><parameter>man.endnotes.list.enabled</parameter>,
+ <parameter>man.endnotes.are.numbered</parameter></para>
+</refsection>
+
+</refentry>
+
+<refentry version="5.0" xml:id="man.font.table.headings">
+<refmeta>
+<refentrytitle>man.font.table.headings</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>man.font.table.headings</refname>
+<refpurpose>Specifies font for table headings</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="man.font.table.headings.frag">
+ &lt;xsl:param name="man.font.table.headings"&gt;B&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The <parameter>man.font.table.headings</parameter> parameter
+specifies the font for <tag>table</tag> headings. It should be
+a valid roff font, such as <literal>B</literal> or
+<literal>I</literal>.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="man.font.table.title">
+<refmeta>
+<refentrytitle>man.font.table.title</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>man.font.table.title</refname>
+<refpurpose>Specifies font for table headings</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="man.font.table.title.frag">
+ &lt;xsl:param name="man.font.table.title"&gt;B&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The <parameter>man.font.table.title</parameter> parameter
+specifies the font for <tag>table</tag> titles. It should be
+a valid roff font, such as <literal>B</literal> or
+<literal>I</literal>.</para>
+
+</refsection>
+</refentry>
+
+ </reference>
+ <reference xml:id="synopsis">
+ <title>SYNOPSIS section</title>
+<refentry version="5.0" xml:id="man.funcsynopsis.style">
+<refmeta>
+<refentrytitle>man.funcsynopsis.style</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">list</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">ansi</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">kr</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>man.funcsynopsis.style</refname>
+<refpurpose>What style of <tag>funcsynopsis</tag> should be generated?</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+<programlisting xml:id="man.funcsynopsis.style.frag">&lt;xsl:param name="man.funcsynopsis.style"&gt;ansi&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+<para>If <parameter>man.funcsynopsis.style</parameter> is
+<literal>ansi</literal>, ANSI-style function synopses are
+generated for a <tag>funcsynopsis</tag>, otherwise K&amp;R-style
+function synopses are generated.</para>
+</refsection>
+</refentry>
+
+ </reference>
+ <reference xml:id="authors">
+ <title>AUTHORS and COPYRIGHT sections</title>
+ <refentry version="5.0" xml:id="man.authors.section.enabled">
+<refmeta>
+<refentrytitle>man.authors.section.enabled</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>man.authors.section.enabled</refname>
+<refpurpose>Display auto-generated AUTHORS section?</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+<programlisting xml:id="man.authors.section.enabled.frag">
+&lt;xsl:param name="man.authors.section.enabled"&gt;1&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+
+<para>If the value of
+<parameter>man.authors.section.enabled</parameter> is non-zero
+(the default), then an <literal>AUTHORS</literal> section is
+generated near the end of each man page. The output of the
+<literal>AUTHORS</literal> section is assembled from any
+<tag>author</tag>, <tag>editor</tag>, and <tag>othercredit</tag>
+metadata found in the contents of the child <tag>info</tag> or
+<tag>refentryinfo</tag> (if any) of the <tag>refentry</tag>
+itself, or from any <tag>author</tag>, <tag>editor</tag>, and
+<tag>othercredit</tag> metadata that may appear in <tag>info</tag>
+contents of any ancestors of the <tag>refentry</tag>.</para>
+
+<para>If the value of
+<parameter>man.authors.section.enabled</parameter> is zero, the
+the auto-generated <literal>AUTHORS</literal> section is
+suppressed.</para>
+
+<para>Set the value of
+ <parameter>man.authors.section.enabled</parameter> to zero if
+ you want to have a manually created <literal>AUTHORS</literal>
+ section in your source, and you want it to appear in output
+ instead of the auto-generated <literal>AUTHORS</literal>
+ section.</para>
+</refsection>
+</refentry>
+
+ <refentry version="5.0" xml:id="man.copyright.section.enabled">
+<refmeta>
+<refentrytitle>man.copyright.section.enabled</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>man.copyright.section.enabled</refname>
+<refpurpose>Display auto-generated COPYRIGHT section?</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+<programlisting xml:id="man.copyright.section.enabled.frag">
+&lt;xsl:param name="man.copyright.section.enabled"&gt;1&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+
+<para>If the value of
+<parameter>man.copyright.section.enabled</parameter> is non-zero
+(the default), then a <literal>COPYRIGHT</literal> section is
+generated near the end of each man page. The output of the
+<literal>COPYRIGHT</literal> section is assembled from any
+<tag>copyright</tag> and <tag>legalnotice</tag> metadata found in
+the contents of the child <tag>info</tag> or
+<tag>refentryinfo</tag> (if any) of the <tag>refentry</tag>
+itself, or from any <tag>copyright</tag> and
+<tag>legalnotice</tag> metadata that may appear in <tag>info</tag>
+contents of any ancestors of the <tag>refentry</tag>.</para>
+
+<para>If the value of
+<parameter>man.copyright.section.enabled</parameter> is zero, the
+the auto-generated <literal>COPYRIGHT</literal> section is
+suppressed.</para>
+
+<para>Set the value of
+ <parameter>man.copyright.section.enabled</parameter> to zero if
+ you want to have a manually created <literal>COPYRIGHT</literal>
+ section in your source, and you want it to appear in output
+ instead of the auto-generated <literal>COPYRIGHT</literal>
+ section.</para>
+</refsection>
+</refentry>
+
+ </reference>
+ <reference xml:id="endnotes">
+ <title>Endnotes and link handling</title>
+<refentry version="5.0" xml:id="man.endnotes.list.enabled">
+<refmeta>
+<refentrytitle>man.endnotes.list.enabled</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>man.endnotes.list.enabled</refname>
+<refpurpose>Display endnotes list at end of man page?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="man.endnotes.list.enabled.frag">
+&lt;xsl:param name="man.endnotes.list.enabled"&gt;1&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If the value of <parameter>man.endnotes.list.enabled</parameter> is
+non-zero (the default), then an endnotes list is added to the end of
+the output man page.</para>
+
+<para>If the value of <parameter>man.endnotes.list.enabled</parameter> is
+zero, the list is suppressed &#8212; unless link numbering is enabled (that
+is, if <parameter>man.endnotes.are.numbered</parameter> is non-zero), in
+which case, that setting overrides the
+<parameter>man.endnotes.list.enabled</parameter> setting, and the
+endnotes list is still displayed. The reason is that inline
+numbering of notesources associated with endnotes only makes sense
+if a (numbered) list of endnotes is also generated.</para>
+
+<note>
+ <para>Leaving
+ <parameter>man.endnotes.list.enabled</parameter> at its default
+ (non-zero) value ensures that no &#8220;out of line&#8221; information (such
+ as the URLs for hyperlinks and images) gets lost in your
+ man-page output. It just gets &#8220;rearranged&#8221;.</para>
+ <para>So if you&#8217;re thinking about disabling endnotes listing by
+ setting the value of
+ <parameter>man.endnotes.list.enabled</parameter> to zero:
+ Before you do so, first take some time to carefully consider
+ the information needs and experiences of your users. The &#8220;out
+ of line&#8221; information has value even if the presentation of it
+ in text output is not as interactive as it may be in other
+ output formats.</para>
+ <para>As far as the specific case of URLs: Even though the URLs
+ displayed in text output may not be &#8220;real&#8221; (clickable)
+ hyperlinks, many X terminals have convenience features for
+ recognizing URLs and can, for example, present users with
+ an options to open a URL in a browser with the user clicks on
+ the URL is a terminal window. And short of those, users with X
+ terminals can always manually cut and paste the URLs into a web
+ browser.</para>
+ <para>Also, note that various &#8220;man to html&#8221; tools, such as the
+ widely used <command><link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://users.actrix.gen.nz/michael/vhman2html.html">man2html</link></command> (<literal>VH-Man2html</literal>)
+ application, automatically mark up URLs with <literal>a@href</literal> markup
+ during conversion &#8212; resulting in &#8220;real&#8221; hyperlinks in HTML
+ output from those tools.</para>
+</note>
+
+<para>To &#8220;turn off&#8221; numbering of endnotes in the
+endnotes list, set <parameter>man.endnotes.are.numbered</parameter>
+to zero. The endnotes list will
+still be displayed; it will just be displayed without the
+numbers<footnote><para>It can still make sense to have
+the list of endnotes displayed even if you have endnotes numbering turned
+off. In that case, your endnotes list basically becomes a &#8220;list
+of references&#8221; without any association with specific text in
+your document. This is probably the best option if you find the inline
+endnotes numbering obtrusive. Your users will still have access to all the &#8220;out of line&#8221;
+such as URLs for hyperlinks.</para></footnote>
+</para>
+
+<para>The default heading for the endnotes list is
+<literal>NOTES</literal>. To change that, set a non-empty
+value for the <parameter>man.endnotes.list.heading</parameter>
+parameter.</para>
+
+<para>In the case of notesources that are links: Along with the
+URL for each link, the endnotes list includes the contents of the
+link. The list thus includes only non-empty<footnote>
+
+<para>A &#8220;non-empty&#8221; link is one that looks like
+this:<literallayout class="monospaced"> &lt;ulink url="http://docbook.sf.net/snapshot/xsl/doc/manpages/"&gt;manpages&lt;/ulink&gt;</literallayout>
+an &#8220;empty link&#8221; is on that looks like this:<literallayout class="monospaced"> &lt;ulink url="http://docbook.sf.net/snapshot/xsl/doc/manpages/"/&gt;</literallayout>
+</para></footnote> links.
+
+Empty links are never included, and never numbered. They are simply
+displayed inline, without any numbering.</para>
+
+<para>In addition, if there are multiple instances of links in a
+<tag>refentry</tag> that have the same URL, the URL is listed only
+once. The contents listed for that link in the endnotes list are
+the contents of the first link which has that URL.</para>
+
+<para>If you disable endnotes listing, you should probably also set
+<parameter>man.links.are.underlined</parameter> to zero (to disable
+link underlining).</para>
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="man.endnotes.list.heading">
+<refmeta>
+<refentrytitle>man.endnotes.list.heading</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>man.endnotes.list.heading</refname>
+<refpurpose>Specifies an alternate name for endnotes list</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="man.endnotes.list.heading.frag">
+&lt;xsl:param name="man.endnotes.list.heading"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If the value of the
+<parameter>man.endnotes.are.numbered</parameter> parameter
+and/or the <parameter>man.endnotes.list.enabled</parameter>
+parameter is non-zero (the defaults for both are non-zero), a
+numbered list of endnotes is generated near the end of each man
+page. The default heading for the list of endnotes is the
+equivalent of the English word <literal>NOTES</literal> in
+the current locale. To cause an alternate heading to be displayed,
+set a non-empty value for the
+<parameter>man.endnotes.list.heading</parameter> parameter &#8212;
+for example, <literal>REFERENCES</literal>.</para>
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="man.endnotes.are.numbered">
+<refmeta>
+<refentrytitle>man.endnotes.are.numbered</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>man.endnotes.are.numbered</refname>
+<refpurpose>Number endnotes?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="man.endnotes.are.numbered.frag">
+&lt;xsl:param name="man.endnotes.are.numbered"&gt;1&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If the value of <parameter>man.endnotes.are.numbered</parameter> is
+non-zero (the default), then for each non-empty<footnote>
+<para>A &#8220;non-empty&#8221; notesource is one that looks like
+this:<literallayout class="monospaced"> &lt;ulink url="http://docbook.sf.net/snapshot/xsl/doc/manpages/"&gt;manpages&lt;/ulink&gt;</literallayout>
+an &#8220;empty&#8221; notesource is on that looks like this:<literallayout class="monospaced"> &lt;ulink url="http://docbook.sf.net/snapshot/xsl/doc/manpages/"/&gt;</literallayout>
+</para></footnote> &#8220;notesource&#8221;:
+
+<itemizedlist>
+ <listitem>
+ <para>a number (in square brackets) is displayed inline after the
+ rendered inline contents (if any) of the notesource</para>
+ </listitem>
+ <listitem>
+ <para>the contents of the notesource are included in a
+ numbered list of endnotes that is generated at the end of
+ each man page; the number for each endnote corresponds to
+ the inline number for the notesource with which it is
+ associated</para>
+ </listitem>
+</itemizedlist>
+The default heading for the list of endnotes is
+<literal>NOTES</literal>. To output a different heading, set a value
+for the <parameter>man.endnotes.section.heading</parameter>
+parameter.</para>
+
+<note>
+ <para>The endnotes list is also displayed (but without
+ numbers) if the value of
+ <parameter>man.endnotes.list.enabled</parameter> is
+ non-zero.</para>
+</note>
+
+
+<para>If the value of <parameter>man.endnotes.are.numbered</parameter> is
+zero, numbering of endnotess is suppressed; only inline
+contents (if any) of the notesource are displayed inline.
+<important>
+ <para>If you are thinking about disabling endnote numbering by setting
+ the value of <parameter>man.endnotes.are.numbered</parameter> to zero,
+ before you do so, first take some time to carefully
+ consider the information needs and experiences of your users. The
+ square-bracketed numbers displayed inline after notesources may seem
+ obstrusive and aesthetically unpleasing<footnote><para>As far as notesources that are links, ytou might
+ think it would be better to just display URLs for non-empty
+ links inline, after their content, rather than displaying
+ square-bracketed numbers all over the place. But it's not better. In
+ fact, it's not even practical, because many (most) URLs for links
+ are too long to be displayed inline. They end up overflowing the
+ right margin. You can set a non-zero value for
+ <parameter>man.break.after.slash</parameter> parameter to deal with
+ that, but it could be argued that what you end up with is at least
+ as ugly, and definitely more obstrusive, then having short
+ square-bracketed numbers displayed inline.</para></footnote>,
+
+ but in a text-only output format, the
+ numbered-notesources/endnotes-listing mechanism is the only
+ practical way to handle this kind of content.</para>
+
+ <para>Also, users of &#8220;text based&#8221; browsers such as
+ <command>lynx</command> will already be accustomed to seeing inline
+ numbers for links. And various "man to html" applications, such as
+ the widely used <command><link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://users.actrix.gen.nz/michael/vhman2html.html">man2html</link></command> (<literal>VH-Man2html</literal>)
+ application, can automatically turn URLs into "real" HTML hyperlinks
+ in output. So leaving <parameter>man.endnotes.are.numbered</parameter>
+ at its default (non-zero) value ensures that no information is
+ lost in your man-page output. It just gets
+ &#8220;rearranged&#8221;.</para>
+</important>
+</para>
+<para>The handling of empty links is not affected by this
+parameter. Empty links are handled simply by displaying their URLs
+inline. Empty links are never auto-numbered.</para>
+
+<para>If you disable endnotes numbering, you should probably also set
+<parameter>man.font.links</parameter> to an empty value (to
+disable font formatting for links.</para>
+</refsection>
+
+<refsection><info><title>Related Parameters</title></info>
+ <para><parameter>man.endnotes.list.enabled</parameter>,
+ <parameter>man.font.links</parameter></para>
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="man.base.url.for.relative.links">
+ <refmeta>
+ <refentrytitle>man.base.url.for.relative.links</refentrytitle>
+ <refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+ </refmeta>
+ <refnamediv>
+ <refname>man.base.url.for.relative.links</refname>
+ <refpurpose>Specifies a base URL for relative links</refpurpose>
+ </refnamediv>
+
+ <refsynopsisdiv>
+ <programlisting xml:id="man.base.url.for.relative.links.frag">&lt;xsl:param name="man.base.url.for.relative.links"&gt;[set $man.base.url.for.relative.links]/&lt;/xsl:param&gt;</programlisting>
+ </refsynopsisdiv>
+
+ <refsection><info><title>Description</title></info>
+
+ <para>For any &#8220;notesource&#8221; listed in the auto-generated
+ &#8220;NOTES&#8221; section of output man pages (which is generated when
+ the value of the
+ <parameter>man.endnotes.list.enabled</parameter> parameter
+ is non-zero), if the notesource is a link source with a
+ relative URI, the URI is displayed in output with the value
+ of the
+ <parameter>man.base.url.for.relative.links</parameter>
+ parameter prepended to the value of the link URI.</para>
+
+ <note>
+ <para>A link source is an notesource that references an
+ external resource:
+ <itemizedlist>
+ <listitem>
+ <para>a <tag>ulink</tag> element with a <tag class="attribute">url</tag> attribute</para>
+ </listitem>
+ <listitem>
+ <para>any element with an <tag class="attribute">xlink:href</tag> attribute</para>
+ </listitem>
+ <listitem>
+ <para>an <tag>imagedata</tag>, <tag>audiodata</tag>, or
+ <tag>videodata</tag> element</para>
+ </listitem>
+ </itemizedlist>
+ </para>
+ </note>
+
+ <para>If you use relative URIs in link sources in your DocBook
+ <tag>refentry</tag> source, and you leave
+ <parameter>man.base.url.for.relative.links</parameter>
+ unset, the relative links will appear &#8220;as is&#8221; in the &#8220;Notes&#8221;
+ section of any man-page output generated from your source.
+ That&#8217;s probably not what you want, because such relative
+ links are only usable in the context of HTML output. So, to
+ make the links meaningful and usable in the context of
+ man-page output, set a value for
+ <parameter>man.base.url.for.relative.links</parameter> that
+ points to the online version of HTML output generated from
+ your DocBook <tag>refentry</tag> source. For
+ example:
+ <programlisting>&lt;xsl:param name="man.base.url.for.relative.links"
+ &gt;http://www.kernel.org/pub/software/scm/git/docs/&lt;/xsl:param&gt;</programlisting>
+ </para>
+
+ </refsection>
+
+ <refsection><info><title>Related Parameters</title></info>
+ <para><parameter>man.endnotes.list.enabled</parameter></para>
+ </refsection>
+
+</refentry>
+
+ </reference>
+ <reference xml:id="lists">
+ <title>Lists</title>
+<refentry version="5.0" xml:id="man.segtitle.suppress">
+<refmeta>
+<refentrytitle>man.segtitle.suppress</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>man.segtitle.suppress</refname>
+<refpurpose>Suppress display of segtitle contents?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="man.segtitle.suppress.frag">
+&lt;xsl:param name="man.segtitle.suppress" select="0"&gt;&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If the value of <parameter>man.segtitle.suppress</parameter> is
+non-zero, then display of <tag>segtitle</tag> contents is
+suppressed in output.</para>
+
+</refsection>
+</refentry>
+
+ </reference>
+ <reference xml:id="charmap">
+ <title>Character/string substitution</title>
+<refentry version="5.0" xml:id="man.charmap.enabled">
+<refmeta>
+<refentrytitle>man.charmap.enabled</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>man.charmap.enabled</refname>
+<refpurpose>Apply character map before final output?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="man.charmap.enabled.frag">
+&lt;xsl:param name="man.charmap.enabled" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If the value of the <parameter>man.charmap.enabled</parameter>
+parameter is non-zero, a "character map" is used to substitute certain
+Unicode symbols and special characters with appropriate roff/groff
+equivalents, just before writing each man-page file to the
+filesystem. If instead the value of
+<parameter>man.charmap.enabled</parameter> is zero, Unicode characters
+are passed through "as is".</para>
+
+<refsection><info><title>Details</title></info>
+
+<para>For converting certain Unicode symbols and special characters in
+UTF-8 or UTF-16 encoded XML source to appropriate groff/roff
+equivalents in man-page output, the DocBook XSL Stylesheets
+distribution includes a <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://docbook.sourceforge.net/snapshot/xsl/manpages/charmap.groff.xsl">roff character map</link> that is compliant with the <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.w3.org/TR/xslt20/#character-maps">XSLT character
+map</link> format as detailed in the XSLT 2.0 specification. The map
+contains more than 800 character mappings and can be considered the
+standard roff character map for the distribution.</para>
+
+<para>You can use the <parameter>man.charmap.uri</parameter>
+parameter to specify a URI for the location for an alternate roff
+character map to use in place of the standard roff character map
+provided in the distribution.</para>
+
+<para>You can also use a subset of a character map. For details,
+see the <parameter>man.charmap.use.subset</parameter>,
+<parameter>man.charmap.subset.profile</parameter>, and
+<parameter>man.charmap.subset.profile.english</parameter>
+parameters.</para>
+
+</refsection>
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="man.charmap.uri">
+<refmeta>
+<refentrytitle>man.charmap.uri</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">uri</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>man.charmap.uri</refname>
+<refpurpose>URI for custom roff character map</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="man.charmap.uri.frag">
+&lt;xsl:param name="man.charmap.uri"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>For converting certain Unicode symbols and special characters in
+UTF-8 or UTF-16 encoded XML source to appropriate groff/roff
+equivalents in man-page output, the DocBook XSL Stylesheets
+distribution includes an <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.w3.org/TR/xslt20/#character-maps">XSLT character
+map</link>. That character map can be considered the standard roff
+character map for the distribution.</para>
+
+<para>If the value of the <parameter>man.charmap.uri</parameter>
+parameter is non-empty, that value is used as the URI for the location
+for an alternate roff character map to use in place of the standard
+roff character map provided in the distribution.</para>
+
+<warning>
+<para>Do not set a value for <parameter>man.charmap.uri</parameter>
+unless you have a custom roff character map that differs from the
+standard one provided in the distribution.</para>
+</warning>
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="man.charmap.use.subset">
+<refmeta>
+<refentrytitle>man.charmap.use.subset</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>man.charmap.use.subset</refname>
+<refpurpose>Use subset of character map instead of full map?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="man.charmap.use.subset.frag">
+&lt;xsl:param name="man.charmap.use.subset" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If the value of the
+<parameter>man.charmap.use.subset</parameter> parameter is non-zero,
+a subset of the roff character map is used instead of the full roff
+character map. The profile of the subset used is determined either
+by the value of the
+<parameter>man.charmap.subset.profile</parameter>
+parameter (if the source is not in English) or the
+<parameter>man.charmap.subset.profile.english</parameter>
+parameter (if the source is in English).</para>
+
+<note>
+ <para>You may want to experiment with setting a non-zero value of
+ <parameter>man.charmap.use.subset</parameter>, so that the full
+ character map is used. Depending on which XSLT engine you run,
+ setting a non-zero value for
+ <parameter>man.charmap.use.subset</parameter> may significantly
+ increase the time needed to process your documents. Or it may
+ not. For example, if you set it and run it with xsltproc, it seems
+ to dramatically increase processing time; on the other hand, if you
+ set it and run it with Saxon, it does not seem to increase
+ processing time nearly as much.</para>
+
+ <para>If processing time is not a important concern and/or you can
+ tolerate the increase in processing time imposed by using the full
+ character map, set <parameter>man.charmap.use.subset</parameter> to
+ zero.</para>
+</note>
+
+<refsection><info><title>Details</title></info>
+
+<para>For converting certain Unicode symbols and special characters in
+UTF-8 or UTF-16 encoded XML source to appropriate groff/roff
+equivalents in man-page output, the DocBook XSL Stylesheets
+distribution includes a <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://docbook.sourceforge.net/snapshot/xsl/manpages/charmap.groff.xsl">roff character map</link> that is compliant with the <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.w3.org/TR/xslt20/#character-maps">XSLT character
+map</link> format as detailed in the XSLT 2.0 specification. The map
+contains more than 800 character mappings and can be considered the
+standard roff character map for the distribution.</para>
+
+<note>
+<para>You can use the <parameter>man.charmap.uri</parameter>
+parameter to specify a URI for the location for an alternate roff
+character map to use in place of the standard roff character map
+provided in the distribution.</para>
+</note>
+
+<para>Because it is not terrifically efficient to use the standard
+800-character character map in full -- and for most (or all) users,
+never necessary to use it in full -- the DocBook XSL Stylesheets
+support a mechanism for using, within any given character map, a
+subset of character mappings instead of the full set. You can use the
+<parameter>man.charmap.subset.profile</parameter> or
+<parameter>man.charmap.subset.profile.english</parameter>
+parameter to tune the profile of that subset to use.</para>
+
+</refsection>
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="man.charmap.subset.profile">
+<refmeta>
+<refentrytitle>man.charmap.subset.profile</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>man.charmap.subset.profile</refname>
+<refpurpose>Profile of character map subset</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="man.charmap.subset.profile.frag">
+&lt;xsl:param name="man.charmap.subset.profile"&gt;
+@*[local-name() = 'block'] = 'Miscellaneous Technical' or
+(@*[local-name() = 'block'] = 'C1 Controls And Latin-1 Supplement (Latin-1 Supplement)' and
+ (@*[local-name() = 'class'] = 'symbols' or
+ @*[local-name() = 'class'] = 'letters')
+) or
+@*[local-name() = 'block'] = 'Latin Extended-A'
+or
+(@*[local-name() = 'block'] = 'General Punctuation' and
+ (@*[local-name() = 'class'] = 'spaces' or
+ @*[local-name() = 'class'] = 'dashes' or
+ @*[local-name() = 'class'] = 'quotes' or
+ @*[local-name() = 'class'] = 'bullets'
+ )
+) or
+@*[local-name() = 'name'] = 'HORIZONTAL ELLIPSIS' or
+@*[local-name() = 'name'] = 'WORD JOINER' or
+@*[local-name() = 'name'] = 'SERVICE MARK' or
+@*[local-name() = 'name'] = 'TRADE MARK SIGN' or
+@*[local-name() = 'name'] = 'ZERO WIDTH NO-BREAK SPACE'
+&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If the value of the
+<parameter>man.charmap.use.subset</parameter> parameter is non-zero,
+and your DocBook source is not written in English (that
+ is, if the <tag class="attribute">lang</tag> or <tag class="attribute">xml:lang</tag> attribute on the root element
+ in your DocBook source or on the first <tag>refentry</tag>
+ element in your source has a value other than
+ <literal>en</literal>), then the character-map subset specified
+ by the <parameter>man.charmap.subset.profile</parameter>
+ parameter is used instead of the full roff character map.</para>
+
+<para>Otherwise, if the <tag class="attribute">lang</tag> or <tag class="attribute">xml:lang</tag> attribute on the root
+ element in your DocBook
+ source or on the first <tag>refentry</tag> element in your source
+ has the value <literal>en</literal> or if it has no <tag class="attribute">lang</tag> or <tag class="attribute">xml:lang</tag> attribute, then the character-map
+ subset specified by the
+ <parameter>man.charmap.subset.profile.english</parameter>
+ parameter is used instead of
+ <parameter>man.charmap.subset.profile</parameter>.</para>
+
+<para>The difference between the two subsets is that
+ <parameter>man.charmap.subset.profile</parameter> provides
+ mappings for characters in Western European languages that are
+ not part of the Roman (English) alphabet (ASCII character set).</para>
+
+<para>The value of <parameter>man.charmap.subset.profile</parameter>
+is a string representing an XPath expression that matches attribute
+names and values for <tag namespace="http://docbook.sf.net/xmlns/unichar/1.0">output-character</tag>
+elements in the character map.</para>
+
+<para>The attributes supported in the <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://docbook.sourceforge.net/snapshot/xsl/manpages/charmap.groff.xsl">standard roff character map included in the distribution</link> are:
+<variablelist>
+ <varlistentry>
+ <term>character</term>
+ <listitem>
+ <simpara>a raw Unicode character or numeric Unicode
+ character-entity value (either in decimal or hex); all
+ characters have this attribute</simpara>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>name</term>
+ <listitem>
+ <simpara>a standard full/long ISO/Unicode character name (e.g.,
+ "OHM SIGN"); all characters have this attribute</simpara>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>block</term>
+ <listitem>
+ <simpara>a standard Unicode "block" name (e.g., "General
+ Punctuation"); all characters have this attribute. For the full
+ list of Unicode block names supported in the standard roff
+ character map, see <xref linkend="BlocksAndClasses"/>.</simpara>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>class</term>
+ <listitem>
+ <simpara>a class of characters (e.g., "spaces"). Not all
+ characters have this attribute; currently, it is used only with
+ certain characters within the "C1 Controls And Latin-1
+ Supplement" and "General Punctuation" blocks. For details, see
+ <xref linkend="BlocksAndClasses"/>.</simpara>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>entity</term>
+ <listitem>
+ <simpara>an ISO entity name (e.g., "ohm"); not all characters
+ have this attribute, because not all characters have ISO entity
+ names; for example, of the 800 or so characters in the standard
+ roff character map included in the distribution, only around 300
+ have ISO entity names.
+ </simpara>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>string</term>
+ <listitem>
+ <simpara>a string representing an roff/groff escape-code (with
+ "@esc@" used in place of the backslash), or a simple ASCII
+ string; all characters in the roff character map have this
+ attribute</simpara>
+ </listitem>
+ </varlistentry>
+</variablelist>
+</para>
+<para>The value of <parameter>man.charmap.subset.profile</parameter>
+is evaluated as an XPath expression at run-time to select a portion of
+the roff character map to use. You can tune the subset used by adding
+or removing parts. For example, if you need to use a wide range of
+mathematical operators in a document, and you want to have them
+converted into roff markup properly, you might add the following:
+
+<literallayout class="monospaced"> @*[local-name() = 'block'] ='MathematicalOperators' </literallayout>
+
+That will cause a additional set of around 67 additional "math"
+characters to be converted into roff markup. </para>
+
+<note>
+<para>Depending on which XSLT engine you use, either the EXSLT
+<function>dyn:evaluate</function> extension function (for xsltproc or
+Xalan) or <function>saxon:evaluate</function> extension function (for
+Saxon) are used to dynamically evaluate the value of
+<parameter>man.charmap.subset.profile</parameter> at run-time. If you
+don't use xsltproc, Saxon, Xalan -- or some other XSLT engine that
+supports <function>dyn:evaluate</function> -- you must either set the
+value of the <parameter>man.charmap.use.subset</parameter> parameter
+to zero and process your documents using the full character map
+instead, or set the value of the
+<parameter>man.charmap.enabled</parameter> parameter to zero instead
+(so that character-map processing is disabled completely.</para>
+</note>
+
+<para>An alternative to using
+<parameter>man.charmap.subset.profile</parameter> is to create your
+own custom character map, and set the value of
+<parameter>man.charmap.uri</parameter> to the URI/filename for
+that. If you use a custom character map, you will probably want to
+include in it just the characters you want to use, and so you will
+most likely also want to set the value of
+<parameter>man.charmap.use.subset</parameter> to zero.</para>
+<para>You can create a
+custom character map by making a copy of the <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://docbook.sourceforge.net/snapshot/xsl/manpages/charmap.groff.xsl">standard roff character map</link> provided in the distribution, and
+then adding to, changing, and/or deleting from that.</para>
+
+<caution>
+<para>If you author your DocBook XML source in UTF-8 or UTF-16
+encoding and aren't sure what OSes or environments your man-page
+output might end up being viewed on, and not sure what version of
+nroff/groff those environments might have, you should be careful about
+what Unicode symbols and special characters you use in your source and
+what parts you add to the value of
+<parameter>man.charmap.subset.profile</parameter>.</para>
+<para>Many of the escape codes used are specific to groff and using
+them may not provide the expected output on an OS or environment that
+uses nroff instead of groff.</para>
+<para>On the other hand, if you intend for your man-page output to be
+viewed only on modern systems (for example, GNU/Linux systems, FreeBSD
+systems, or Cygwin environments) that have a good, up-to-date groff,
+then you can safely include a wide range of Unicode symbols and
+special characters in your UTF-8 or UTF-16 encoded DocBook XML source
+and add any of the supported Unicode block names to the value of
+<parameter>man.charmap.subset.profile</parameter>.</para>
+</caution>
+
+
+<para>For other details, see the documentation for the
+<parameter>man.charmap.use.subset</parameter> parameter.</para>
+
+<refsection xml:id="BlocksAndClasses"><info><title>Supported Unicode block names and "class" values</title></info>
+
+
+ <para>Below is the full list of Unicode block names and "class"
+ values supported in the standard roff stylesheet provided in the
+ distribution, along with a description of which codepoints from the
+ Unicode range corresponding to that block name or block/class
+ combination are supported.</para>
+
+ <itemizedlist>
+ <listitem>
+ <para><link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://zvon.org/other/charSearch/PHP/search.php?searchType=103&amp;id=C1%20Controls%20and%20Latin-1%20Supplement%20(Latin-1%20Supplement)">C1 Controls And Latin-1 Supplement (Latin-1 Supplement)</link> (x00a0 to x00ff)
+ <itemizedlist><info><title>class values</title></info>
+
+ <listitem>
+ <para>symbols</para>
+ </listitem>
+ <listitem>
+ <para>letters</para>
+ </listitem>
+ </itemizedlist></para>
+ </listitem>
+ <listitem>
+ <para><link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://zvon.org/other/charSearch/PHP/search.php?searchType=103&amp;id=Latin%20Extended-A">Latin Extended-A</link> (x0100 to x017f, partial)</para>
+ </listitem>
+ <listitem>
+ <para><link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://zvon.org/other/charSearch/PHP/search.php?searchType=103&amp;id=Spacing%20Modifier%20Letters">Spacing Modifier Letters</link> (x02b0 to x02ee, partial)</para>
+ </listitem>
+ <listitem>
+ <para><link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://zvon.org/other/charSearch/PHP/search.php?searchType=103&amp;id=Greek%20and%20Coptic">Greek and Coptic</link> (x0370 to x03ff, partial)</para>
+ </listitem>
+ <listitem>
+ <para><link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://zvon.org/other/charSearch/PHP/search.php?searchType=103&amp;id=General%20Punctuation">General Punctuation</link> (x2000 to x206f, partial)
+ <itemizedlist><info><title>class values</title></info>
+
+ <listitem>
+ <para><link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://zvon.org/other/charSearch/PHP/search.php?searchType=103&amp;start=8192&amp;end=8203">spaces</link></para>
+ </listitem>
+ <listitem>
+ <para><link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://zvon.org/other/charSearch/PHP/search.php?searchType=103&amp;start=8208&amp;end=8213">dashes</link></para>
+ </listitem>
+ <listitem>
+ <para>quotes</para>
+ </listitem>
+ <listitem>
+ <para>daggers</para>
+ </listitem>
+ <listitem>
+ <para>bullets</para>
+ </listitem>
+ <listitem>
+ <para>leaders</para>
+ </listitem>
+ <listitem>
+ <para>primes</para>
+ </listitem>
+ </itemizedlist>
+ </para>
+ </listitem>
+ <listitem>
+ <para><link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://zvon.org/other/charSearch/PHP/search.php?searchType=103&amp;id=Superscripts%20and%20Subscripts">Superscripts and Subscripts</link> (x2070 to x209f)</para>
+ </listitem>
+ <listitem>
+ <para><link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://zvon.org/other/charSearch/PHP/search.php?searchType=103&amp;id=Currency%20Symbols">Currency Symbols</link> (x20a0 to x20b1)</para>
+ </listitem>
+ <listitem>
+ <para><link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://zvon.org/other/charSearch/PHP/search.php?searchType=103&amp;id=Letterlike%20Symbols">Letterlike Symbols</link> (x2100 to x214b)</para>
+ </listitem>
+ <listitem>
+ <para><link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://zvon.org/other/charSearch/PHP/search.php?searchType=103&amp;id=Number%20Forms">Number Forms</link> (x2150 to x218f)</para>
+ </listitem>
+ <listitem>
+ <para><link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://zvon.org/other/charSearch/PHP/search.php?searchType=103&amp;id=Arrows">Arrows</link> (x2190 to x21ff, partial)</para>
+ </listitem>
+ <listitem>
+ <para><link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://zvon.org/other/charSearch/PHP/search.php?searchType=103&amp;id=Mathematical%20Operators">Mathematical Operators</link> (x2200 to x22ff, partial)</para>
+ </listitem>
+ <listitem>
+ <para><link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://zvon.org/other/charSearch/PHP/search.php?searchType=103&amp;id=Control%20Pictures">Control Pictures</link> (x2400 to x243f)</para>
+ </listitem>
+ <listitem>
+ <para><link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://zvon.org/other/charSearch/PHP/search.php?searchType=103&amp;id=Enclosed%20Alphanumerics">Enclosed Alphanumerics</link> (x2460 to x24ff)</para>
+ </listitem>
+ <listitem>
+ <para><link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://zvon.org/other/charSearch/PHP/search.php?searchType=103&amp;id=Geometric%20Shapes">Geometric Shapes</link> (x25a0 to x25f7, partial)</para>
+ </listitem>
+ <listitem>
+ <para><link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://zvon.org/other/charSearch/PHP/search.php?searchType=103&amp;id=Miscellaneous%20Symbols">Miscellaneous Symbols</link> (x2600 to x26ff, partial)</para>
+ </listitem>
+ <listitem>
+ <para><link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://zvon.org/other/charSearch/PHP/search.php?searchType=103&amp;id=Dingbats">Dingbats</link> (x2700 to x27be, partial)</para>
+ </listitem>
+ <listitem>
+ <para><link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://zvon.org/other/charSearch/PHP/search.php?searchType=103&amp;id=Alphabetic%20Presentation%20Forms">Alphabetic Presentation Forms</link> (xfb00 to xfb04 only)</para>
+ </listitem>
+ </itemizedlist>
+</refsection>
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="man.charmap.subset.profile.english">
+<refmeta>
+<refentrytitle>man.charmap.subset.profile.english</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>man.charmap.subset.profile.english</refname>
+<refpurpose>Profile of character map subset</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="man.charmap.subset.profile.english.frag">
+&lt;xsl:param name="man.charmap.subset.profile.english"&gt;
+@*[local-name() = 'block'] = 'Miscellaneous Technical' or
+(@*[local-name() = 'block'] = 'C1 Controls And Latin-1 Supplement (Latin-1 Supplement)' and
+ @*[local-name() = 'class'] = 'symbols')
+or
+(@*[local-name() = 'block'] = 'General Punctuation' and
+ (@*[local-name() = 'class'] = 'spaces' or
+ @*[local-name() = 'class'] = 'dashes' or
+ @*[local-name() = 'class'] = 'quotes' or
+ @*[local-name() = 'class'] = 'bullets'
+ )
+) or
+@*[local-name() = 'name'] = 'HORIZONTAL ELLIPSIS' or
+@*[local-name() = 'name'] = 'WORD JOINER' or
+@*[local-name() = 'name'] = 'SERVICE MARK' or
+@*[local-name() = 'name'] = 'TRADE MARK SIGN' or
+@*[local-name() = 'name'] = 'ZERO WIDTH NO-BREAK SPACE'
+&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If the value of the
+ <parameter>man.charmap.use.subset</parameter> parameter is
+ non-zero, and your DocBook source is written in English (that
+ is, if its <tag class="attribute">lang</tag> or <tag class="attribute">xml:lang</tag> attribute on the root element
+ in your DocBook source or on the first <tag>refentry</tag>
+ element in your source has the value <literal>en</literal> or if
+ it has no <tag class="attribute">lang</tag> or <tag class="attribute">xml:lang</tag> attribute), then the
+ character-map subset specified by the
+ <parameter>man.charmap.subset.profile.english</parameter>
+ parameter is used instead of the full roff character map.</para>
+
+<para>Otherwise, if the <tag class="attribute">lang</tag> or <tag class="attribute">xml:lang</tag> attribute
+ on the root element in your DocBook source or on the first
+ <tag>refentry</tag> element in your source has a value other
+ than <literal>en</literal>, then the character-map subset
+ specified by the
+ <parameter>man.charmap.subset.profile</parameter> parameter is
+ used instead of
+ <parameter>man.charmap.subset.profile.english</parameter>.</para>
+
+<para>The difference between the two subsets is that
+ <parameter>man.charmap.subset.profile</parameter> provides
+ mappings for characters in Western European languages that are
+ not part of the Roman (English) alphabet (ASCII character set).</para>
+
+<para>The value of <parameter>man.charmap.subset.profile.english</parameter>
+is a string representing an XPath expression that matches attribute
+names and values for <tag namespace="http://docbook.sf.net/xmlns/unichar/1.0">output-character</tag> elements in the character map.</para>
+
+<para>For other details, see the documentation for the
+<parameter>man.charmap.subset.profile.english</parameter> and
+<parameter>man.charmap.use.subset</parameter> parameters.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="man.string.subst.map.local.pre">
+<refmeta>
+<refentrytitle>man.string.subst.map.local.pre</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>man.string.subst.map.local.pre</refname>
+<refpurpose>Specifies &#8220;local&#8221; string substitutions</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="man.string.subst.map.local.pre.frag">
+ &lt;xsl:param name="man.string.subst.map.local.pre"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Use the <parameter>man.string.subst.map.local.pre</parameter>
+parameter to specify any &#8220;local&#8221; string substitutions to perform over
+the entire roff source for each man page <emphasis>before</emphasis>
+performing the string substitutions specified by the <parameter>man.string.subst.map</parameter> parameter.</para>
+
+<para>For details about the format of this parameter, see the
+documentation for the <parameter>man.string.subst.map</parameter>
+parameter.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="man.string.subst.map">
+<refmeta>
+<refentrytitle>man.string.subst.map</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">rtf</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>man.string.subst.map</refname>
+<refpurpose>Specifies a set of string substitutions</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="man.string.subst.map.frag">
+&lt;xsl:param name="man.string.subst.map"&gt;
+
+ &lt;!-- * remove no-break marker at beginning of line (stylesheet artifact) --&gt;
+ &lt;ss:substitution oldstring="&#9618;&#9600;" newstring="&#9618;"&gt;&lt;/ss:substitution&gt;
+ &lt;!-- * replace U+2580 no-break marker (stylesheet-added) w/ no-break space --&gt;
+ &lt;ss:substitution oldstring="&#9600;" newstring="\ "&gt;&lt;/ss:substitution&gt;
+
+ &lt;!-- ==================================================================== --&gt;
+
+ &lt;!-- * squeeze multiple newlines before a roff request --&gt;
+ &lt;ss:substitution oldstring="
+
+." newstring="
+."&gt;&lt;/ss:substitution&gt;
+ &lt;!-- * remove any .sp instances that directly precede a .PP --&gt;
+ &lt;ss:substitution oldstring=".sp
+.PP" newstring=".PP"&gt;&lt;/ss:substitution&gt;
+ &lt;!-- * remove any .sp instances that directly follow a .PP --&gt;
+ &lt;ss:substitution oldstring=".sp
+.sp" newstring=".sp"&gt;&lt;/ss:substitution&gt;
+ &lt;!-- * squeeze multiple .sp instances into a single .sp--&gt;
+ &lt;ss:substitution oldstring=".PP
+.sp" newstring=".PP"&gt;&lt;/ss:substitution&gt;
+ &lt;!-- * squeeze multiple newlines after start of no-fill (verbatim) env. --&gt;
+ &lt;ss:substitution oldstring=".nf
+
+" newstring=".nf
+"&gt;&lt;/ss:substitution&gt;
+ &lt;!-- * squeeze multiple newlines after REstoring margin --&gt;
+ &lt;ss:substitution oldstring=".RE
+
+" newstring=".RE
+"&gt;&lt;/ss:substitution&gt;
+ &lt;!-- * U+2591 is a marker we add before and after every Parameter in --&gt;
+ &lt;!-- * Funcprototype output --&gt;
+ &lt;ss:substitution oldstring="&#9617;" newstring=" "&gt;&lt;/ss:substitution&gt;
+ &lt;!-- * U+2592 is a marker we add for the newline before output of &lt;sbr&gt;; --&gt;
+ &lt;ss:substitution oldstring="&#9618;" newstring="
+"&gt;&lt;/ss:substitution&gt;
+ &lt;!-- * --&gt;
+ &lt;!-- * Now deal with some other characters that are added by the --&gt;
+ &lt;!-- * stylesheets during processing. --&gt;
+ &lt;!-- * --&gt;
+ &lt;!-- * bullet --&gt;
+ &lt;ss:substitution oldstring="&#8226;" newstring="\(bu"&gt;&lt;/ss:substitution&gt;
+ &lt;!-- * left double quote --&gt;
+ &lt;ss:substitution oldstring="&#8220;" newstring="\(lq"&gt;&lt;/ss:substitution&gt;
+ &lt;!-- * right double quote --&gt;
+ &lt;ss:substitution oldstring="&#8221;" newstring="\(rq"&gt;&lt;/ss:substitution&gt;
+ &lt;!-- * left single quote --&gt;
+ &lt;ss:substitution oldstring="&#8216;" newstring="\(oq"&gt;&lt;/ss:substitution&gt;
+ &lt;!-- * right single quote --&gt;
+ &lt;ss:substitution oldstring="&#8217;" newstring="\(cq"&gt;&lt;/ss:substitution&gt;
+ &lt;!-- * copyright sign --&gt;
+ &lt;ss:substitution oldstring="&#169;" newstring="\(co"&gt;&lt;/ss:substitution&gt;
+ &lt;!-- * registered sign --&gt;
+ &lt;ss:substitution oldstring="&#174;" newstring="\(rg"&gt;&lt;/ss:substitution&gt;
+ &lt;!-- * ...servicemark... --&gt;
+ &lt;!-- * There is no groff equivalent for it. --&gt;
+ &lt;ss:substitution oldstring="&#8480;" newstring="(SM)"&gt;&lt;/ss:substitution&gt;
+ &lt;!-- * ...trademark... --&gt;
+ &lt;!-- * We don't do "\(tm" because for console output, --&gt;
+ &lt;!-- * groff just renders that as "tm"; that is: --&gt;
+ &lt;!-- * --&gt;
+ &lt;!-- * Product&amp;#x2122; -&gt; Producttm --&gt;
+ &lt;!-- * --&gt;
+ &lt;!-- * So we just make it to "(TM)" instead; thus: --&gt;
+ &lt;!-- * --&gt;
+ &lt;!-- * Product&amp;#x2122; -&gt; Product(TM) --&gt;
+ &lt;ss:substitution oldstring="&#8482;" newstring="(TM)"&gt;&lt;/ss:substitution&gt;
+
+&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The <parameter>man.string.subst.map</parameter> parameter
+contains <link linkend="map">a map</link> that specifies a set of
+string substitutions to perform over the entire roff source for each
+man page, either just before generating final man-page output (that
+is, before writing man-page files to disk) or, if the value of the
+<parameter>man.charmap.enabled</parameter> parameter is non-zero,
+before applying the roff character map.</para>
+
+<para>You can use <parameter>man.string.subst.map</parameter> as a
+&#8220;lightweight&#8221; character map to perform &#8220;essential&#8221; substitutions --
+that is, substitutions that are <emphasis>always</emphasis> performed,
+even if the value of the <parameter>man.charmap.enabled</parameter>
+parameter is zero. For example, you can use it to replace quotation
+marks or other special characters that are generated by the DocBook
+XSL stylesheets for a particular locale setting (as opposed to those
+characters that are actually in source XML documents), or to replace
+any special characters that may be automatically generated by a
+particular customization of the DocBook XSL stylesheets.</para>
+
+<warning>
+ <para>Do you not change value of the
+ <parameter>man.string.subst.map</parameter> parameter unless you are
+ sure what you are doing. First consider adding your
+ string-substitution mappings to either or both of the following
+ parameters:
+ <variablelist>
+ <varlistentry>
+ <term><parameter>man.string.subst.map.local.pre</parameter></term>
+ <listitem><para>applied before
+ <parameter>man.string.subst.map</parameter></para></listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><parameter>man.string.subst.map.local.post</parameter></term>
+ <listitem><para>applied after
+ <parameter>man.string.subst.map</parameter></para></listitem>
+ </varlistentry>
+ </variablelist>
+ By default, both of those parameters contain no
+ string substitutions. They are intended as a means for you to
+ specify your own local string-substitution mappings.</para>
+
+ <para>If you remove any of default mappings from the value of the
+ <parameter>man.string.subst.map</parameter> parameter, you are
+ likely to end up with broken output. And be very careful about adding
+ anything to it; it&#8217;s used for doing string substitution over the
+ entire roff source of each man page &#8211; it causes target strings to be
+ replaced in roff requests and escapes, not just in the visible
+ contents of the page.</para>
+
+</warning>
+
+<refsection xml:id="map">
+ <info>
+ <title>Contents of the substitution map</title>
+ </info>
+ <para>The string-substitution map contains one or more
+ <tag>ss:substitution</tag> elements, each of which has two
+ attributes:
+ <variablelist>
+ <varlistentry>
+ <term>oldstring</term>
+ <listitem>
+ <simpara>string to replace</simpara>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>newstring</term>
+ <listitem>
+ <simpara>string with which to replace <tag class="attribute">oldstring</tag></simpara>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ It may also include XML comments (that is, delimited with
+ "<literal>&lt;!--</literal>" and "<literal>--&gt;</literal>").
+ </para>
+</refsection>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="man.string.subst.map.local.post">
+<refmeta>
+<refentrytitle>man.string.subst.map.local.post</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>man.string.subst.map.local.post</refname>
+<refpurpose>Specifies &#8220;local&#8221; string substitutions</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="man.string.subst.map.local.post.frag">
+&lt;xsl:param name="man.string.subst.map.local.post"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Use the <parameter>man.string.subst.map.local.post</parameter>
+parameter to specify any &#8220;local&#8221; string substitutions to perform over
+the entire roff source for each man page <emphasis>after</emphasis>
+performing the string substitutions specified by the <parameter>man.string.subst.map</parameter> parameter.</para>
+
+<para>For details about the format of this parameter, see the
+documentation for the <parameter>man.string.subst.map</parameter>
+parameter.</para>
+
+</refsection>
+</refentry>
+
+ </reference>
+ <reference xml:id="refmeta">
+ <title>Refentry metadata gathering</title>
+<refentry version="5.0" xml:id="refentry.meta.get.quietly">
+<refmeta>
+<refentrytitle>refentry.meta.get.quietly</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>refentry.meta.get.quietly</refname>
+<refpurpose>Suppress notes and warnings when gathering refentry metadata?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="refentry.meta.get.quietly.frag">
+&lt;xsl:param name="refentry.meta.get.quietly" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If zero (the default), notes and warnings about &#8220;missing&#8221; markup
+are generated during gathering of refentry metadata. If non-zero, the
+metadata is gathered &#8220;quietly&#8221; -- that is, the notes and warnings are
+suppressed.</para>
+
+<tip>
+ <para>If you are processing a large amount of <tag>refentry</tag>
+ content, you may be able to speed up processing significantly by
+ setting a non-zero value for
+ <parameter>refentry.meta.get.quietly</parameter>.</para>
+</tip>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="refentry.date.profile">
+<refmeta>
+<refentrytitle>refentry.date.profile</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>refentry.date.profile</refname>
+<refpurpose>Specifies profile for refentry "date" data</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="refentry.date.profile.frag">
+&lt;xsl:param name="refentry.date.profile"&gt;
+ (($info[//date])[last()]/date)[1]|
+ (($info[//pubdate])[last()]/pubdate)[1]
+&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The value of <parameter>refentry.date.profile</parameter> is a
+string representing an XPath expression. It is evaluated at run-time
+and used only if <parameter>refentry.date.profile.enabled</parameter>
+is non-zero. Otherwise, the <tag>refentry</tag> metadata-gathering
+logic "hard coded" into the stylesheets is used.</para>
+
+<para> The <literal>man(7)</literal> man page describes this content
+as "the date of the last revision". In man pages, it is the content
+that is usually displayed in the center footer.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="refentry.date.profile.enabled">
+<refmeta>
+<refentrytitle>refentry.date.profile.enabled</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>refentry.date.profile.enabled</refname>
+<refpurpose>Enable refentry "date" profiling?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="refentry.date.profile.enabled.frag">
+&lt;xsl:param name="refentry.date.profile.enabled"&gt;0&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If the value of
+<parameter>refentry.date.profile.enabled</parameter> is non-zero, then
+during <tag>refentry</tag> metadata gathering, the info profile
+specified by the customizable
+<parameter>refentry.date.profile</parameter> parameter is used.</para>
+
+<para>If instead the value of
+<parameter>refentry.date.profile.enabled</parameter> is zero (the
+default), then "hard coded" logic within the DocBook XSL stylesheets
+is used for gathering <tag>refentry</tag> "date" data.</para>
+
+<para>If you find that the default <tag>refentry</tag>
+metadata-gathering behavior is causing incorrect "date" data to show
+up in your output, then consider setting a non-zero value for
+<parameter>refentry.date.profile.enabled</parameter> and adjusting the
+value of <parameter>refentry.date.profile</parameter> to cause correct
+data to be gathered. </para>
+
+<para>Note that the terms "source" and "date" have special meanings in
+this context. For details, see the documentation for the
+<parameter>refentry.date.profile</parameter> parameter.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="refentry.manual.profile">
+<refmeta>
+<refentrytitle>refentry.manual.profile</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>refentry.manual.profile</refname>
+<refpurpose>Specifies profile for refentry "manual" data</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="refentry.manual.profile.frag">
+&lt;xsl:param name="refentry.manual.profile"&gt;
+ (($info[//title])[last()]/title)[1]|
+ ../title/node()
+&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The value of <parameter>refentry.manual.profile</parameter> is
+a string representing an XPath expression. It is evaluated at
+run-time and used only if
+<parameter>refentry.manual.profile.enabled</parameter> is
+non-zero. Otherwise, the <tag>refentry</tag> metadata-gathering logic
+"hard coded" into the stylesheets is used.</para>
+
+<para>In man pages, this content is usually displayed in the middle of
+the header of the page. The <literal>man(7)</literal> man page
+describes this as "the title of the manual (e.g., <citetitle>Linux
+Programmer's Manual</citetitle>)". Here are some examples from
+existing man pages:
+<itemizedlist>
+ <listitem>
+ <para><citetitle>dpkg utilities</citetitle>
+ (<command>dpkg-name</command>)</para>
+ </listitem>
+ <listitem>
+ <para><citetitle>User Contributed Perl Documentation</citetitle>
+ (<command>GET</command>)</para>
+ </listitem>
+ <listitem>
+ <para><citetitle>GNU Development Tools</citetitle>
+ (<command>ld</command>)</para>
+ </listitem>
+ <listitem>
+ <para><citetitle>Emperor Norton Utilities</citetitle>
+ (<command>ddate</command>)</para>
+ </listitem>
+ <listitem>
+ <para><citetitle>Debian GNU/Linux manual</citetitle>
+ (<command>faked</command>)</para>
+ </listitem>
+ <listitem>
+ <para><citetitle>GIMP Manual Pages</citetitle>
+ (<command>gimp</command>)</para>
+ </listitem>
+ <listitem>
+ <para><citetitle>KDOC Documentation System</citetitle>
+ (<command>qt2kdoc</command>)</para>
+ </listitem>
+</itemizedlist>
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="refentry.manual.profile.enabled">
+<refmeta>
+<refentrytitle>refentry.manual.profile.enabled</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>refentry.manual.profile.enabled</refname>
+<refpurpose>Enable refentry "manual" profiling?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="refentry.manual.profile.enabled.frag">
+&lt;xsl:param name="refentry.manual.profile.enabled"&gt;0&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If the value of
+<parameter>refentry.manual.profile.enabled</parameter> is
+non-zero, then during <tag>refentry</tag> metadata gathering, the info
+profile specified by the customizable
+<parameter>refentry.manual.profile</parameter> parameter is
+used.</para>
+
+<para>If instead the value of
+<parameter>refentry.manual.profile.enabled</parameter> is zero (the
+default), then "hard coded" logic within the DocBook XSL stylesheets
+is used for gathering <tag>refentry</tag> "manual" data.</para>
+
+<para>If you find that the default <tag>refentry</tag>
+metadata-gathering behavior is causing incorrect "manual" data to show
+up in your output, then consider setting a non-zero value for
+<parameter>refentry.manual.profile.enabled</parameter> and adjusting
+the value of <parameter>refentry.manual.profile</parameter> to cause
+correct data to be gathered. </para>
+
+<para>Note that the term "manual" has a special meanings in this
+context. For details, see the documentation for the
+<parameter>refentry.manual.profile</parameter> parameter.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="refentry.source.name.suppress">
+<refmeta>
+<refentrytitle>refentry.source.name.suppress</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>refentry.source.name.suppress</refname>
+<refpurpose>Suppress "name" part of refentry "source" contents?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="refentry.source.name.suppress.frag">
+&lt;xsl:param name="refentry.source.name.suppress"&gt;0&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If the value of
+<parameter>refentry.source.name.suppress</parameter> is non-zero, then
+during <tag>refentry</tag> metadata gathering, no "source name" data
+is added to the <tag>refentry</tag> "source" contents. Instead (unless
+<parameter>refentry.version.suppress</parameter> is also non-zero),
+only "version" data is added to the "source" contents.</para>
+
+<para>If you find that the <tag>refentry</tag> metadata gathering
+mechanism is causing unwanted "source name" data to show up in your
+output -- for example, in the footer (or possibly header) of a man
+page -- then you might consider setting a non-zero value for
+<parameter>refentry.source.name.suppress</parameter>.</para>
+
+<para>Note that the terms "source", "source name", and "version" have
+special meanings in this context. For details, see the documentation
+for the <parameter>refentry.source.name.profile</parameter>
+parameter.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="refentry.source.name.profile">
+<refmeta>
+<refentrytitle>refentry.source.name.profile</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>refentry.source.name.profile</refname>
+<refpurpose>Specifies profile for refentry "source name" data</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="refentry.source.name.profile.frag">
+&lt;xsl:param name="refentry.source.name.profile"&gt;
+ (($info[//productname])[last()]/productname)[1]|
+ (($info[//corpname])[last()]/corpname)[1]|
+ (($info[//corpcredit])[last()]/corpcredit)[1]|
+ (($info[//corpauthor])[last()]/corpauthor)[1]|
+ (($info[//orgname])[last()]/orgname)[1]|
+ (($info[//publishername])[last()]/publishername)[1]
+&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The value of <parameter>refentry.source.name.profile</parameter>
+is a string representing an XPath expression. It is evaluated at
+run-time and used only if
+<parameter>refentry.source.name.profile.enabled</parameter> is
+non-zero. Otherwise, the <tag>refentry</tag> metadata-gathering logic
+"hard coded" into the stylesheets is used.</para>
+
+<para>A "source name" is one part of a (potentially) two-part
+<replaceable>Name</replaceable>&#160;<replaceable>Version</replaceable>
+"source" field. In man pages, it is usually displayed in the left
+footer of the page. It typically indicates the software system or
+product that the item documented in the man page belongs to. The
+<literal>man(7)</literal> man page describes it as "the source of
+the command", and provides the following examples:
+<itemizedlist>
+ <listitem>
+ <para>For binaries, use something like: GNU, NET-2, SLS
+ Distribution, MCC Distribution.</para>
+ </listitem>
+ <listitem>
+ <para>For system calls, use the version of the kernel that you
+ are currently looking at: Linux 0.99.11.</para>
+ </listitem>
+ <listitem>
+ <para>For library calls, use the source of the function: GNU, BSD
+ 4.3, Linux DLL 4.4.1.</para>
+ </listitem>
+</itemizedlist>
+</para>
+
+<para>In practice, there are many pages that simply have a Version
+number in the "source" field. So, it looks like what we have is a
+two-part field,
+<replaceable>Name</replaceable>&#160;<replaceable>Version</replaceable>,
+where:
+<variablelist>
+ <varlistentry>
+ <term>Name</term>
+ <listitem>
+ <para>product name (e.g., BSD) or org. name (e.g., GNU)</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>Version</term>
+ <listitem>
+ <para>version number</para>
+ </listitem>
+ </varlistentry>
+</variablelist>
+Each part is optional. If the <replaceable>Name</replaceable> is a
+product name, then the <replaceable>Version</replaceable> is probably
+the version of the product. Or there may be no
+<replaceable>Name</replaceable>, in which case, if there is a
+<replaceable>Version</replaceable>, it is probably the version
+of the item itself, not the product it is part of. Or, if the
+<replaceable>Name</replaceable> is an organization name, then there
+probably will be no <replaceable>Version</replaceable>.</para>
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="refentry.source.name.profile.enabled">
+<refmeta>
+<refentrytitle>refentry.source.name.profile.enabled</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>refentry.source.name.profile.enabled</refname>
+<refpurpose>Enable refentry "source name" profiling?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="refentry.source.name.profile.enabled.frag">
+&lt;xsl:param name="refentry.source.name.profile.enabled"&gt;0&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If the value of
+<parameter>refentry.source.name.profile.enabled</parameter> is
+non-zero, then during <tag>refentry</tag> metadata gathering, the info
+profile specified by the customizable
+<parameter>refentry.source.name.profile</parameter> parameter is
+used.</para>
+
+<para>If instead the value of
+<parameter>refentry.source.name.profile.enabled</parameter> is zero (the
+default), then "hard coded" logic within the DocBook XSL stylesheets
+is used for gathering <tag>refentry</tag> "source name" data.</para>
+
+<para>If you find that the default <tag>refentry</tag>
+metadata-gathering behavior is causing incorrect "source name" data to
+show up in your output, then consider setting a non-zero value for
+<parameter>refentry.source.name.profile.enabled</parameter> and
+adjusting the value of
+<parameter>refentry.source.name.profile</parameter> to cause correct
+data to be gathered. </para>
+
+<para>Note that the terms "source" and "source name" have special
+meanings in this context. For details, see the documentation for the
+<parameter>refentry.source.name.profile</parameter> parameter.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="refentry.version.suppress">
+<refmeta>
+<refentrytitle>refentry.version.suppress</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>refentry.version.suppress</refname>
+<refpurpose>Suppress "version" part of refentry "source" contents?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="refentry.version.suppress.frag">
+&lt;xsl:param name="refentry.version.suppress"&gt;0&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If the value of <parameter>refentry.version.suppress</parameter>
+is non-zero, then during <tag>refentry</tag> metadata gathering, no
+"version" data is added to the <tag>refentry</tag> "source"
+contents. Instead (unless
+<parameter>refentry.source.name.suppress</parameter> is also
+non-zero), only "source name" data is added to the "source"
+contents.</para>
+
+<para>If you find that the <tag>refentry</tag> metadata gathering
+mechanism is causing unwanted "version" data to show up in your output
+-- for example, in the footer (or possibly header) of a man page --
+then you might consider setting a non-zero value for
+<parameter>refentry.version.suppress</parameter>.</para>
+
+<para>Note that the terms "source", "source name", and "version" have
+special meanings in this context. For details, see the documentation
+for the <parameter>refentry.source.name.profile</parameter>
+parameter.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="refentry.version.profile">
+<refmeta>
+<refentrytitle>refentry.version.profile</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>refentry.version.profile</refname>
+<refpurpose>Specifies profile for refentry "version" data</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="refentry.version.profile.frag">
+&lt;xsl:param name="refentry.version.profile"&gt;
+ (($info[//productnumber])[last()]/productnumber)[1]|
+ (($info[//edition])[last()]/edition)[1]|
+ (($info[//releaseinfo])[last()]/releaseinfo)[1]
+&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The value of <parameter>refentry.version.profile</parameter> is
+a string representing an XPath expression. It is evaluated at
+run-time and used only if
+<parameter>refentry.version.profile.enabled</parameter> is
+non-zero. Otherwise, the <tag>refentry</tag> metadata-gathering logic
+"hard coded" into the stylesheets is used.</para>
+
+<para>A "source.name" is one part of a (potentially) two-part
+<replaceable>Name</replaceable>&#160;<replaceable>Version</replaceable>
+"source" field. For more details, see the documentation for the
+<parameter>refentry.source.name.profile</parameter> parameter.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="refentry.version.profile.enabled">
+<refmeta>
+<refentrytitle>refentry.version.profile.enabled</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>refentry.version.profile.enabled</refname>
+<refpurpose>Enable refentry "version" profiling?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="refentry.version.profile.enabled.frag">
+&lt;xsl:param name="refentry.version.profile.enabled"&gt;0&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If the value of
+<parameter>refentry.version.profile.enabled</parameter> is
+non-zero, then during <tag>refentry</tag> metadata gathering, the info
+profile specified by the customizable
+<parameter>refentry.version.profile</parameter> parameter is
+used.</para>
+
+<para>If instead the value of
+<parameter>refentry.version.profile.enabled</parameter> is zero (the
+default), then "hard coded" logic within the DocBook XSL stylesheets
+is used for gathering <tag>refentry</tag> "version" data.</para>
+
+<para>If you find that the default <tag>refentry</tag>
+metadata-gathering behavior is causing incorrect "version" data to show
+up in your output, then consider setting a non-zero value for
+<parameter>refentry.version.profile.enabled</parameter> and adjusting
+the value of <parameter>refentry.version.profile</parameter> to cause
+correct data to be gathered. </para>
+
+<para>Note that the terms "source" and "version" have special
+meanings in this context. For details, see the documentation for the
+<parameter>refentry.version.profile</parameter> parameter.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="refentry.manual.fallback.profile">
+<refmeta>
+<refentrytitle>refentry.manual.fallback.profile</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>refentry.manual.fallback.profile</refname>
+<refpurpose>Specifies profile of "fallback" for refentry "manual" data</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="refentry.manual.fallback.profile.frag">
+&lt;xsl:param name="refentry.manual.fallback.profile"&gt;
+refmeta/refmiscinfo[not(@class = 'date')][1]/node()&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The value of
+<parameter>refentry.manual.fallback.profile</parameter> is a string
+representing an XPath expression. It is evaluated at run-time and
+used only if no "manual" data can be found by other means (that is,
+either using the <tag>refentry</tag> metadata-gathering logic "hard
+coded" in the stylesheets, or the value of
+<parameter>refentry.manual.profile</parameter>, if it is
+enabled).</para>
+
+<important>
+<para>Depending on which XSLT engine you run, either the EXSLT
+<function>dyn:evaluate</function> extension function (for xsltproc or
+Xalan) or <function>saxon:evaluate</function> extension function (for
+Saxon) are used to dynamically evaluate the value of
+<parameter>refentry.manual.fallback.profile</parameter> at
+run-time. If you don't use xsltproc, Saxon, Xalan -- or some other
+XSLT engine that supports <function>dyn:evaluate</function> -- you
+must manually disable fallback processing by setting an empty value
+for the <parameter>refentry.manual.fallback.profile</parameter>
+parameter.</para>
+</important>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="refentry.source.fallback.profile">
+<refmeta>
+<refentrytitle>refentry.source.fallback.profile</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>refentry.source.fallback.profile</refname>
+<refpurpose>Specifies profile of "fallback" for refentry "source" data</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="refentry.source.fallback.profile.frag">
+&lt;xsl:param name="refentry.source.fallback.profile"&gt;
+refmeta/refmiscinfo[not(@class = 'date')][1]/node()&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The value of
+<parameter>refentry.source.fallback.profile</parameter> is a string
+representing an XPath expression. It is evaluated at run-time and used
+only if no "source" data can be found by other means (that is, either
+using the <tag>refentry</tag> metadata-gathering logic "hard coded" in
+the stylesheets, or the value of the
+<parameter>refentry.source.name.profile</parameter> and
+<parameter>refentry.version.profile</parameter> parameters, if those
+are enabled).</para>
+
+<important>
+<para>Depending on which XSLT engine you run, either the EXSLT
+<function>dyn:evaluate</function> extension function (for xsltproc or
+Xalan) or <function>saxon:evaluate</function> extension function (for
+Saxon) are used to dynamically evaluate the value of
+<parameter>refentry.source.fallback.profile</parameter> at
+run-time. If you don't use xsltproc, Saxon, Xalan -- or some other
+XSLT engine that supports <function>dyn:evaluate</function> -- you
+must manually disable fallback processing by setting an empty value
+for the <parameter>refentry.source.fallback.profile</parameter>
+parameter.</para>
+</important>
+
+</refsection>
+</refentry>
+
+ </reference>
+ <reference xml:id="th">
+ <title>Page header/footer</title>
+<refentry version="5.0" xml:id="man.th.extra1.suppress">
+<refmeta>
+<refentrytitle>man.th.extra1.suppress</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>man.th.extra1.suppress</refname>
+<refpurpose>Suppress extra1 part of header/footer?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="man.th.extra1.suppress.frag">
+&lt;xsl:param name="man.th.extra1.suppress"&gt;0&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If the value of <parameter>man.th.extra1.suppress</parameter> is
+non-zero, then the <literal>extra1</literal> part of the
+<literal>.TH</literal> title line header/footer is suppressed.</para>
+
+<para>The content of the <literal>extra1</literal> field is almost
+always displayed in the center footer of the page and is, universally,
+a date.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="man.th.extra2.suppress">
+<refmeta>
+<refentrytitle>man.th.extra2.suppress</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>man.th.extra2.suppress</refname>
+<refpurpose>Suppress extra2 part of header/footer?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="man.th.extra2.suppress.frag">
+&lt;xsl:param name="man.th.extra2.suppress"&gt;0&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If the value of <parameter>man.th.extra2.suppress</parameter> is
+non-zero, then the <literal>extra2</literal> part of the
+<literal>.TH</literal> title line header/footer is suppressed.</para>
+
+<para>The content of the <literal>extra2</literal> field is usually
+displayed in the left footer of the page and is typically "source"
+data, often in the form
+<replaceable>Name</replaceable>&#160;<replaceable>Version</replaceable>;
+for example, "GTK+ 1.2" (from the <literal>gtk-options(7)</literal>
+man page).</para>
+
+<note>
+ <para>You can use the
+ <parameter>refentry.source.name.suppress</parameter> and
+ <parameter>refentry.version.suppress</parameter> parameters to
+ independently suppress the <replaceable>Name</replaceable> and
+ <replaceable>Version</replaceable> parts of the
+ <literal>extra2</literal> field.</para>
+</note>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="man.th.extra3.suppress">
+<refmeta>
+<refentrytitle>man.th.extra3.suppress</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>man.th.extra3.suppress</refname>
+<refpurpose>Suppress extra3 part of header/footer?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="man.th.extra3.suppress.frag">
+&lt;xsl:param name="man.th.extra3.suppress"&gt;0&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If the value of <parameter>man.th.extra3.suppress</parameter> is
+non-zero, then the <literal>extra3</literal> part of the
+<literal>.TH</literal> title line header/footer is
+suppressed.</para>
+
+<para>The content of the <literal>extra3</literal> field is usually
+displayed in the middle header of the page and is typically a "manual
+name"; for example, "GTK+ User's Manual" (from the
+<literal>gtk-options(7)</literal> man page).</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="man.th.title.max.length">
+<refmeta>
+<refentrytitle>man.th.title.max.length</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">integer</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>man.th.title.max.length</refname>
+<refpurpose>Maximum length of title in header/footer</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="man.th.title.max.length.frag">
+&lt;xsl:param name="man.th.title.max.length"&gt;20&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies the maximum permitted length of the title part of the
+man-page <literal>.TH</literal> title line header/footer. If the title
+exceeds the maxiumum specified, it is truncated down to the maximum
+permitted length.</para>
+
+<refsection><info><title>Details</title></info>
+
+
+<para>Every man page generated using the DocBook stylesheets has a
+title line, specified using the <literal>TH</literal> roff
+macro. Within that title line, there is always, at a minimum, a title,
+followed by a section value (representing a man "section" -- usually
+just a number).</para>
+
+<para>The title and section are displayed, together, in the visible
+header of each page. Where in the header they are displayed depends on
+OS the man page is viewed on, and on what version of nroff/groff/man
+is used for viewing the page. But, at a minimum and across all
+systems, the title and section are displayed on the right-hand column
+of the header. On many systems -- those with a modern groff, including
+Linux systems -- they are displayed twice: both in the left and right
+columns of the header.</para>
+
+<para>So if the length of the title exceeds a certain percentage of
+the column width in which the page is viewed, the left and right
+titles can end up overlapping, making them unreadable, or breaking to
+another line, which doesn't look particularly good.</para>
+
+<para>So the stylesheets provide the
+<parameter>man.th.title.max.length</parameter> parameter as a means
+for truncating titles that exceed the maximum length that can be
+viewing properly in a page header.</para>
+
+<para>The default value is reasonable but somewhat arbitrary. If you
+have pages with long titles, you may want to experiment with changing
+the value in order to achieve the correct aesthetic results.</para>
+</refsection>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="man.th.extra2.max.length">
+<refmeta>
+<refentrytitle>man.th.extra2.max.length</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">integer</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>man.th.extra2.max.length</refname>
+<refpurpose>Maximum length of extra2 in header/footer</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="man.th.extra2.max.length.frag">
+&lt;xsl:param name="man.th.extra2.max.length"&gt;30&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies the maximum permitted length of the
+<literal>extra2</literal> part of the man-page part of the
+<literal>.TH</literal> title line header/footer. If the
+<literal>extra2</literal> content exceeds the maxiumum specified, it
+is truncated down to the maximum permitted length.</para>
+
+<para>The content of the <literal>extra2</literal> field is usually
+displayed in the left footer of the page and is typically "source"
+data indicating the software system or product that the item
+documented in the man page belongs to, often in the form
+<replaceable>Name</replaceable>&#160;<replaceable>Version</replaceable>;
+for example, "GTK+ 1.2" (from the <literal>gtk-options(7)</literal>
+man page).</para>
+
+<para>The default value for this parameter is reasonable but somewhat
+arbitrary. If you are processing pages with long "source" information,
+you may want to experiment with changing the value in order to achieve
+the correct aesthetic results.</para>
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="man.th.extra3.max.length">
+<refmeta>
+<refentrytitle>man.th.extra3.max.length</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">integer</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>man.th.extra3.max.length</refname>
+<refpurpose>Maximum length of extra3 in header/footer</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="man.th.extra3.max.length.frag">
+&lt;xsl:param name="man.th.extra3.max.length"&gt;30&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies the maximum permitted length of the
+<literal>extra3</literal> part of the man-page <literal>.TH</literal>
+title line header/footer. If the <literal>extra3</literal> content
+exceeds the maxiumum specified, it is truncated down to the maximum
+permitted length.</para>
+
+<para>The content of the <literal>extra3</literal> field is usually
+displayed in the middle header of the page and is typically a "manual
+name"; for example, "GTK+ User's Manual" (from the
+<literal>gtk-options(7)</literal> man page).</para>
+
+<para>The default value for this parameter is reasonable but somewhat
+arbitrary. If you are processing pages with long "manual names" -- or
+especially if you are processing pages that have both long "title"
+parts (command/function, etc. names) <emphasis>and</emphasis> long
+manual names -- you may want to experiment with changing the value in
+order to achieve the correct aesthetic results.</para>
+</refsection>
+</refentry>
+
+ </reference>
+ <reference xml:id="output">
+ <title>Output</title>
+<refentry version="5.0" xml:id="man.output.manifest.enabled">
+ <refmeta>
+ <refentrytitle>man.output.manifest.enabled</refentrytitle>
+ <refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+ </refmeta>
+ <refnamediv>
+ <refname>man.output.manifest.enabled</refname>
+ <refpurpose>Generate a manifest file?</refpurpose>
+ </refnamediv>
+
+ <refsynopsisdiv>
+ <programlisting xml:id="man.output.manifest.enabled.frag">&lt;xsl:param name="man.output.manifest.enabled" select="0"&gt;&lt;/xsl:param&gt;</programlisting>
+ </refsynopsisdiv>
+
+ <refsection><info><title>Description</title></info>
+
+ <para>If non-zero, a list of filenames for man pages generated by
+ the stylesheet transformation is written to the file named by the
+ <parameter>man.output.manifest.filename</parameter> parameter.</para>
+
+ </refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="man.output.manifest.filename">
+ <refmeta>
+ <refentrytitle>man.output.manifest.filename</refentrytitle>
+ <refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+ </refmeta>
+ <refnamediv>
+ <refname>man.output.manifest.filename</refname>
+ <refpurpose>Name of manifest file</refpurpose>
+ </refnamediv>
+
+ <refsynopsisdiv>
+ <programlisting xml:id="man.output.manifest.filename.frag">&lt;xsl:param name="man.output.manifest.filename"&gt;MAN.MANIFEST&lt;/xsl:param&gt;</programlisting>
+ </refsynopsisdiv>
+
+ <refsection><info><title>Description</title></info>
+
+ <para>The <parameter>man.output.manifest.filename</parameter> parameter
+ specifies the name of the file to which the manpages manifest file
+ is written (if the value of the
+ <parameter>man.output.manifest.enabled</parameter> parameter is
+ non-zero).</para>
+
+ </refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="man.output.in.separate.dir">
+<refmeta>
+<refentrytitle>man.output.in.separate.dir</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>man.output.in.separate.dir</refname>
+<refpurpose>Output man-page files in separate output directory?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="man.output.in.separate.dir.frag">
+&lt;xsl:param name="man.output.in.separate.dir" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If the value of <literal>man.output.in.separate.dir</literal>
+parameter is non-zero, man-page files are output in a separate
+directory, specified by the <parameter>man.output.base.dir</parameter>
+parameter; otherwise, if the value of
+<literal>man.output.in.separate.dir</literal> is zero, man-page files
+are not output in a separate directory.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="man.output.lang.in.name.enabled">
+<refmeta>
+<refentrytitle>man.output.lang.in.name.enabled</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>man.output.lang.in.name.enabled</refname>
+<refpurpose>Include $LANG value in man-page filename/pathname?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="man.output.lang.in.name.enabled.frag">
+&lt;xsl:param name="man.output.lang.in.name.enabled" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+ <para>The <parameter>man.output.lang.in.name.enabled</parameter>
+ parameter specifies whether a <literal>$lang</literal> value is
+ included in man-page filenames and pathnames.</para>
+
+ <para>If the value of
+ <parameter>man.output.lang.in.name.enabled</parameter> is non-zero,
+ man-page files are output with the <literal>$lang</literal> value
+ included in their filenames or pathnames as follows;
+
+ <itemizedlist>
+ <listitem>
+ <para>if <parameter>man.output.subdirs.enabled</parameter> is
+ non-zero, each file is output to, e.g., a
+ <filename>man/<replaceable>$lang</replaceable>/man8/foo.8</filename>
+ pathname</para>
+ </listitem>
+ <listitem>
+ <para>if <parameter>man.output.subdirs.enabled</parameter> is
+ zero, each file is output with a
+ <literal>foo.<replaceable>$lang</replaceable>.8</literal>
+ filename</para>
+ </listitem>
+ </itemizedlist>
+ </para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="man.output.base.dir">
+<refmeta>
+<refentrytitle>man.output.base.dir</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">uri</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>man.output.base.dir</refname>
+<refpurpose>Specifies separate output directory</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="man.output.base.dir.frag">&lt;xsl:param name="man.output.base.dir"&gt;man/&lt;/xsl:param&gt;</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The <parameter>man.output.base.dir</parameter> parameter
+specifies the base directory into which man-page files are output. The
+<parameter>man.output.subdirs.enabled</parameter> parameter controls
+whether the files are output in subdirectories within the base
+directory.</para>
+
+<note>
+ <para>The values of the <parameter>man.output.base.dir</parameter>
+ and <parameter>man.output.subdirs.enabled</parameter> parameters are
+ used only if the value of
+ <parameter>man.output.in.separate.dir</parameter> parameter is
+ non-zero. If the value of the
+ <parameter>man.output.in.separate.dir</parameter> is zero, man-page
+ files are not output in a separate directory.</para>
+</note>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="man.output.subdirs.enabled">
+<refmeta>
+<refentrytitle>man.output.subdirs.enabled</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>man.output.subdirs.enabled</refname>
+<refpurpose>Output man-page files in subdirectories within base output directory?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="man.output.subdirs.enabled.frag">
+&lt;xsl:param name="man.output.subdirs.enabled" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The <parameter>man.output.subdirs.enabled</parameter> parameter
+controls whether man-pages files are output in subdirectories within
+the base directory specified by the directory specified by the
+<parameter>man.output.base.dir</parameter> parameter.</para>
+
+<note>
+ <para>The values of the <parameter>man.output.base.dir</parameter>
+ and <parameter>man.output.subdirs.enabled</parameter> parameters are
+ used only if the value of
+ <parameter>man.output.in.separate.dir</parameter> parameter is
+ non-zero. If the value of the
+ <parameter>man.output.in.separate.dir</parameter> is zero, man-page
+ files are not output in a separate directory.</para>
+</note>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="man.output.quietly">
+<refmeta>
+<refentrytitle>man.output.quietly</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>man.output.quietly</refname>
+<refpurpose>Suppress filename messages emitted when generating output?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="man.output.quietly.frag">
+&lt;xsl:param name="man.output.quietly" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If zero (the default), for each man-page file created, a message
+with the name of the file is emitted. If non-zero, the files are
+output "quietly" -- that is, the filename messages are
+suppressed.</para>
+
+<tip>
+ <para>If you are processing a large amount of <tag>refentry</tag>
+ content, you may be able to speed up processing significantly by
+ setting a non-zero value for
+ <parameter>man.output.quietly</parameter>.</para>
+</tip>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="man.output.encoding">
+<refmeta>
+<refentrytitle>man.output.encoding</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>man.output.encoding</refname>
+<refpurpose>Encoding used for man-page output</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="man.output.encoding.frag">
+&lt;xsl:param name="man.output.encoding"&gt;UTF-8&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>This parameter specifies the encoding to use for files generated
+by the manpages stylesheet. Not all processors support specification
+of this parameter.</para>
+
+<important>
+ <para>If the value of the <parameter>man.charmap.enabled</parameter>
+ parameter is non-zero (the default), keeping the
+ <parameter>man.output.encoding</parameter> parameter at its default
+ value (<literal>UTF-8</literal>) or setting it to
+ <literal>UTF-16</literal> <emphasis role="bold">does not cause your
+ man pages to be output in raw UTF-8 or UTF-16</emphasis> -- because
+ any Unicode characters for which matches are found in the enabled
+ character map will be replaced with roff escape sequences before the
+ final man-page files are generated.</para>
+
+ <para>So if you want to generate "real" UTF-8 man pages, without any
+ character substitution being performed on your content, you need to
+ set <parameter>man.charmap.enabled</parameter> to zero (which will
+ completely disable character-map processing). </para>
+
+ <para>You may also need to set
+ <parameter>man.charmap.enabled</parameter> to zero if you want to
+ output man pages in an encoding other than <literal>UTF-8</literal>
+ or <literal>UTF-16</literal>. Character-map processing is based on
+ Unicode character values and may not work with other output
+ encodings.</para>
+</important>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="man.output.better.ps.enabled">
+<refmeta>
+<refentrytitle>man.output.better.ps.enabled</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>man.output.better.ps.enabled</refname>
+<refpurpose>Enable enhanced print/PostScript output?</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+<programlisting xml:id="man.output.better.ps.enabled.frag">
+&lt;xsl:param name="man.output.better.ps.enabled"&gt;0&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+
+<para>If the value of the
+<parameter>man.output.better.ps.enabled</parameter> parameter is
+non-zero, certain markup is embedded in each generated man page
+such that PostScript output from the <command>man -Tps</command>
+command for that page will include a number of enhancements
+designed to improve the quality of that output.</para>
+
+<para>If <parameter>man.output.better.ps.enabled</parameter> is
+zero (the default), no such markup is embedded in generated man
+pages, and no enhancements are included in the PostScript
+output generated from those man pages by the <command>man
+ -Tps</command> command.</para>
+
+<warning>
+ <para>The enhancements provided by this parameter rely on
+ features that are specific to groff (GNU troff) and that are
+ not part of &#8220;classic&#8221; AT&amp;T troff or any of its
+ derivatives. Therefore, any man pages you generate with this
+ parameter enabled will be readable only on systems on which
+ the groff (GNU troff) program is installed, such as GNU/Linux
+ systems. The pages <emphasis role="bold">will not not be
+ readable on systems on with the classic troff (AT&amp;T
+ troff) command is installed</emphasis>.</para>
+</warning>
+
+<para>The value of this parameter only affects PostScript output
+ generated from the <command>man</command> command. It has no
+ effect on output generated using the FO backend.</para>
+
+<tip>
+ <para>You can generate PostScript output for any man page by
+ running the following command:</para>
+ <programlisting> man <replaceable>FOO</replaceable> -Tps &gt; <replaceable>FOO</replaceable>.ps</programlisting>
+ <para>You can then generate PDF output by running the following
+ command:</para>
+ <programlisting> ps2pdf <replaceable>FOO</replaceable>.ps</programlisting>
+</tip>
+
+</refsection>
+</refentry>
+
+ </reference>
+ <reference xml:id="other">
+ <title>Other</title>
+<refentry version="5.0" xml:id="man.table.footnotes.divider">
+<refmeta>
+<refentrytitle>man.table.footnotes.divider</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>man.table.footnotes.divider</refname>
+<refpurpose>Specifies divider string that appears before table footnotes</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="man.table.footnotes.divider.frag">
+&lt;xsl:param name="man.table.footnotes.divider"&gt;----&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>In each table that contains footenotes, the string specified by
+the <parameter>man.table.footnotes.divider</parameter> parameter is
+output before the list of footnotes for the table.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="man.subheading.divider.enabled">
+<refmeta>
+<refentrytitle>man.subheading.divider.enabled</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>man.subheading.divider.enabled</refname>
+<refpurpose>Add divider comment to roff source before/after subheadings?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="man.subheading.divider.enabled.frag">
+&lt;xsl:param name="man.subheading.divider.enabled"&gt;0&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If the value of the
+<parameter>man.subheading.divider.enabled</parameter> parameter is
+non-zero, the contents of the
+<parameter>man.subheading.divider</parameter> parameter are used to
+add a "divider" before and after subheadings in the roff
+output. <emphasis role="bold">The divider is not visisble in the
+rendered man page</emphasis>; it is added as a comment, in the source,
+simply for the purpose of increasing reability of the source.</para>
+
+<para>If <parameter>man.subheading.divider.enabled</parameter> is zero
+(the default), the subheading divider is suppressed.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="man.subheading.divider">
+<refmeta>
+<refentrytitle>man.subheading.divider</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>man.subheading.divider</refname>
+<refpurpose>Specifies string to use as divider comment before/after subheadings</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="man.subheading.divider.frag">
+&lt;xsl:param name="man.subheading.divider"&gt;========================================================================&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If the value of the
+<parameter>man.subheading.divider.enabled</parameter> parameter is
+non-zero, the contents of the
+<parameter>man.subheading.divider</parameter> parameter are used to
+add a "divider" before and after subheadings in the roff
+output. <emphasis role="bold">The divider is not visisble in the
+rendered man page</emphasis>; it is added as a comment, in the source,
+simply for the purpose of increasing reability of the source.</para>
+
+<para>If <parameter>man.subheading.divider.enabled</parameter> is zero
+(the default), the subheading divider is suppressed.</para>
+
+</refsection>
+</refentry>
+
+ </reference>
+ <appendix xml:id="stylesheet">
+ <title>The Stylesheet</title>
+
+ <para>The <filename>param.xsl</filename> stylesheet is just a
+ wrapper around all of these parameters.</para>
+
+ <programlisting xml:id="top">
+&lt;xsl:stylesheet exclude-result-prefixes="src" version="1.0"&gt;
+
+&lt;!-- This file is generated from param.xweb --&gt;
+
+&lt;!-- ********************************************************************
+ $Id: param.xweb 8235 2009-02-09 16:22:14Z xmldoc $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** --&gt;
+
+&lt;src:fragref linkend="man.authors.section.enabled.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="man.break.after.slash.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="man.base.url.for.relative.links.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="man.charmap.enabled.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="man.charmap.subset.profile.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="man.charmap.subset.profile.english.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="man.charmap.uri.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="man.charmap.use.subset.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="man.copyright.section.enabled.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="man.endnotes.are.numbered.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="man.endnotes.list.enabled.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="man.endnotes.list.heading.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="man.font.funcprototype.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="man.font.funcsynopsisinfo.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="man.font.links.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="man.font.table.headings.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="man.font.table.title.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="man.funcsynopsis.style.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="man.hyphenate.computer.inlines.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="man.hyphenate.filenames.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="man.hyphenate.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="man.hyphenate.urls.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="man.indent.blurbs.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="man.indent.lists.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="man.indent.refsect.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="man.indent.verbatims.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="man.indent.width.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="man.justify.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="man.output.base.dir.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="man.output.encoding.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="man.output.in.separate.dir.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="man.output.lang.in.name.enabled.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="man.output.manifest.enabled.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="man.output.manifest.filename.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="man.output.better.ps.enabled.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="man.output.quietly.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="man.output.subdirs.enabled.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="man.segtitle.suppress.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="man.string.subst.map.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="man.string.subst.map.local.post.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="man.string.subst.map.local.pre.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="man.subheading.divider.enabled.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="man.subheading.divider.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="man.table.footnotes.divider.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="man.th.extra1.suppress.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="man.th.extra2.max.length.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="man.th.extra2.suppress.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="man.th.extra3.max.length.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="man.th.extra3.suppress.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="man.th.title.max.length.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="refentry.date.profile.enabled.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="refentry.date.profile.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="refentry.manual.fallback.profile.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="refentry.manual.profile.enabled.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="refentry.manual.profile.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="refentry.meta.get.quietly.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="refentry.source.fallback.profile.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="refentry.source.name.profile.enabled.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="refentry.source.name.profile.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="refentry.source.name.suppress.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="refentry.version.profile.enabled.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="refentry.version.profile.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="refentry.version.suppress.frag"&gt;&lt;/src:fragref&gt;
+&lt;/xsl:stylesheet&gt;
+ </programlisting>
+
+ </appendix>
+</book>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/manpages/param.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/manpages/param.xsl
new file mode 100644
index 0000000..39d2059
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/manpages/param.xsl
@@ -0,0 +1,193 @@
+<?xml version="1.0" encoding="ASCII"?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
+
+<!-- This file is generated from param.xweb -->
+
+<!-- ********************************************************************
+ $Id: param.xweb 8235 2009-02-09 16:22:14Z xmldoc $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<xsl:param name="man.authors.section.enabled">1</xsl:param>
+<xsl:param name="man.break.after.slash">0</xsl:param>
+<xsl:param name="man.base.url.for.relative.links">[set $man.base.url.for.relative.links]/</xsl:param>
+<xsl:param name="man.charmap.enabled" select="1"/>
+<xsl:param name="man.charmap.subset.profile">
+@*[local-name() = 'block'] = 'Miscellaneous Technical' or
+(@*[local-name() = 'block'] = 'C1 Controls And Latin-1 Supplement (Latin-1 Supplement)' and
+ (@*[local-name() = 'class'] = 'symbols' or
+ @*[local-name() = 'class'] = 'letters')
+) or
+@*[local-name() = 'block'] = 'Latin Extended-A'
+or
+(@*[local-name() = 'block'] = 'General Punctuation' and
+ (@*[local-name() = 'class'] = 'spaces' or
+ @*[local-name() = 'class'] = 'dashes' or
+ @*[local-name() = 'class'] = 'quotes' or
+ @*[local-name() = 'class'] = 'bullets'
+ )
+) or
+@*[local-name() = 'name'] = 'HORIZONTAL ELLIPSIS' or
+@*[local-name() = 'name'] = 'WORD JOINER' or
+@*[local-name() = 'name'] = 'SERVICE MARK' or
+@*[local-name() = 'name'] = 'TRADE MARK SIGN' or
+@*[local-name() = 'name'] = 'ZERO WIDTH NO-BREAK SPACE'
+</xsl:param>
+<xsl:param name="man.charmap.subset.profile.english">
+@*[local-name() = 'block'] = 'Miscellaneous Technical' or
+(@*[local-name() = 'block'] = 'C1 Controls And Latin-1 Supplement (Latin-1 Supplement)' and
+ @*[local-name() = 'class'] = 'symbols')
+or
+(@*[local-name() = 'block'] = 'General Punctuation' and
+ (@*[local-name() = 'class'] = 'spaces' or
+ @*[local-name() = 'class'] = 'dashes' or
+ @*[local-name() = 'class'] = 'quotes' or
+ @*[local-name() = 'class'] = 'bullets'
+ )
+) or
+@*[local-name() = 'name'] = 'HORIZONTAL ELLIPSIS' or
+@*[local-name() = 'name'] = 'WORD JOINER' or
+@*[local-name() = 'name'] = 'SERVICE MARK' or
+@*[local-name() = 'name'] = 'TRADE MARK SIGN' or
+@*[local-name() = 'name'] = 'ZERO WIDTH NO-BREAK SPACE'
+</xsl:param>
+<xsl:param name="man.charmap.uri"/>
+<xsl:param name="man.charmap.use.subset" select="1"/>
+<xsl:param name="man.copyright.section.enabled">1</xsl:param>
+<xsl:param name="man.endnotes.are.numbered">1</xsl:param>
+<xsl:param name="man.endnotes.list.enabled">1</xsl:param>
+<xsl:param name="man.endnotes.list.heading"/>
+ <xsl:param name="man.font.funcprototype">BI</xsl:param>
+ <xsl:param name="man.font.funcsynopsisinfo">B</xsl:param>
+<xsl:param name="man.font.links">B</xsl:param>
+ <xsl:param name="man.font.table.headings">B</xsl:param>
+ <xsl:param name="man.font.table.title">B</xsl:param>
+<xsl:param name="man.funcsynopsis.style">ansi</xsl:param>
+<xsl:param name="man.hyphenate.computer.inlines">0</xsl:param>
+<xsl:param name="man.hyphenate.filenames">0</xsl:param>
+<xsl:param name="man.hyphenate">0</xsl:param>
+<xsl:param name="man.hyphenate.urls">0</xsl:param>
+<xsl:param name="man.indent.blurbs" select="1"/>
+<xsl:param name="man.indent.lists" select="1"/>
+<xsl:param name="man.indent.refsect" select="0"/>
+<xsl:param name="man.indent.verbatims" select="1"/>
+<xsl:param name="man.indent.width">4</xsl:param>
+<xsl:param name="man.justify">0</xsl:param>
+<xsl:param name="man.output.base.dir">man/</xsl:param>
+<xsl:param name="man.output.encoding">UTF-8</xsl:param>
+<xsl:param name="man.output.in.separate.dir" select="0"/>
+<xsl:param name="man.output.lang.in.name.enabled" select="0"/>
+<xsl:param name="man.output.manifest.enabled" select="0"/>
+<xsl:param name="man.output.manifest.filename">MAN.MANIFEST</xsl:param>
+<xsl:param name="man.output.better.ps.enabled">0</xsl:param>
+<xsl:param name="man.output.quietly" select="0"/>
+<xsl:param name="man.output.subdirs.enabled" select="1"/>
+<xsl:param name="man.segtitle.suppress" select="0"/>
+<xsl:param name="man.string.subst.map">
+
+ <!-- * remove no-break marker at beginning of line (stylesheet artifact) -->
+ <substitution oldstring="&#9618;&#9600;" newstring="&#9618;"/>
+ <!-- * replace U+2580 no-break marker (stylesheet-added) w/ no-break space -->
+ <substitution oldstring="&#9600;" newstring="\ "/>
+
+ <!-- ==================================================================== -->
+
+ <!-- * squeeze multiple newlines before a roff request -->
+ <substitution oldstring="&#10;&#10;." newstring="&#10;."/>
+ <!-- * remove any .sp instances that directly precede a .PP -->
+ <substitution oldstring=".sp&#10;.PP" newstring=".PP"/>
+ <!-- * remove any .sp instances that directly follow a .PP -->
+ <substitution oldstring=".sp&#10;.sp" newstring=".sp"/>
+ <!-- * squeeze multiple .sp instances into a single .sp-->
+ <substitution oldstring=".PP&#10;.sp" newstring=".PP"/>
+ <!-- * squeeze multiple newlines after start of no-fill (verbatim) env. -->
+ <substitution oldstring=".nf&#10;&#10;" newstring=".nf&#10;"/>
+ <!-- * squeeze multiple newlines after REstoring margin -->
+ <substitution oldstring=".RE&#10;&#10;" newstring=".RE&#10;"/>
+ <!-- * U+2591 is a marker we add before and after every Parameter in -->
+ <!-- * Funcprototype output -->
+ <substitution oldstring="&#9617;" newstring=" "/>
+ <!-- * U+2592 is a marker we add for the newline before output of <sbr>; -->
+ <substitution oldstring="&#9618;" newstring="&#10;"/>
+ <!-- * -->
+ <!-- * Now deal with some other characters that are added by the -->
+ <!-- * stylesheets during processing. -->
+ <!-- * -->
+ <!-- * bullet -->
+ <substitution oldstring="&#8226;" newstring="\(bu"/>
+ <!-- * left double quote -->
+ <substitution oldstring="&#8220;" newstring="\(lq"/>
+ <!-- * right double quote -->
+ <substitution oldstring="&#8221;" newstring="\(rq"/>
+ <!-- * left single quote -->
+ <substitution oldstring="&#8216;" newstring="\(oq"/>
+ <!-- * right single quote -->
+ <substitution oldstring="&#8217;" newstring="\(cq"/>
+ <!-- * copyright sign -->
+ <substitution oldstring="&#169;" newstring="\(co"/>
+ <!-- * registered sign -->
+ <substitution oldstring="&#174;" newstring="\(rg"/>
+ <!-- * ...servicemark... -->
+ <!-- * There is no groff equivalent for it. -->
+ <substitution oldstring="&#8480;" newstring="(SM)"/>
+ <!-- * ...trademark... -->
+ <!-- * We don't do "\(tm" because for console output, -->
+ <!-- * groff just renders that as "tm"; that is: -->
+ <!-- * -->
+ <!-- * Product&#x2122; -> Producttm -->
+ <!-- * -->
+ <!-- * So we just make it to "(TM)" instead; thus: -->
+ <!-- * -->
+ <!-- * Product&#x2122; -> Product(TM) -->
+ <substitution oldstring="&#8482;" newstring="(TM)"/>
+
+</xsl:param>
+<xsl:param name="man.string.subst.map.local.post"/>
+ <xsl:param name="man.string.subst.map.local.pre"/>
+<xsl:param name="man.subheading.divider.enabled">0</xsl:param>
+<xsl:param name="man.subheading.divider">========================================================================</xsl:param>
+<xsl:param name="man.table.footnotes.divider">----</xsl:param>
+<xsl:param name="man.th.extra1.suppress">0</xsl:param>
+<xsl:param name="man.th.extra2.max.length">30</xsl:param>
+<xsl:param name="man.th.extra2.suppress">0</xsl:param>
+<xsl:param name="man.th.extra3.max.length">30</xsl:param>
+<xsl:param name="man.th.extra3.suppress">0</xsl:param>
+<xsl:param name="man.th.title.max.length">20</xsl:param>
+<xsl:param name="refentry.date.profile.enabled">0</xsl:param>
+<xsl:param name="refentry.date.profile">
+ (($info[//date])[last()]/date)[1]|
+ (($info[//pubdate])[last()]/pubdate)[1]
+</xsl:param>
+<xsl:param name="refentry.manual.fallback.profile">
+refmeta/refmiscinfo[not(@class = 'date')][1]/node()</xsl:param>
+<xsl:param name="refentry.manual.profile.enabled">0</xsl:param>
+<xsl:param name="refentry.manual.profile">
+ (($info[//title])[last()]/title)[1]|
+ ../title/node()
+</xsl:param>
+<xsl:param name="refentry.meta.get.quietly" select="0"/>
+<xsl:param name="refentry.source.fallback.profile">
+refmeta/refmiscinfo[not(@class = 'date')][1]/node()</xsl:param>
+<xsl:param name="refentry.source.name.profile.enabled">0</xsl:param>
+<xsl:param name="refentry.source.name.profile">
+ (($info[//productname])[last()]/productname)[1]|
+ (($info[//corpname])[last()]/corpname)[1]|
+ (($info[//corpcredit])[last()]/corpcredit)[1]|
+ (($info[//corpauthor])[last()]/corpauthor)[1]|
+ (($info[//orgname])[last()]/orgname)[1]|
+ (($info[//publishername])[last()]/publishername)[1]
+</xsl:param>
+<xsl:param name="refentry.source.name.suppress">0</xsl:param>
+<xsl:param name="refentry.version.profile.enabled">0</xsl:param>
+<xsl:param name="refentry.version.profile">
+ (($info[//productnumber])[last()]/productnumber)[1]|
+ (($info[//edition])[last()]/edition)[1]|
+ (($info[//releaseinfo])[last()]/releaseinfo)[1]
+</xsl:param>
+<xsl:param name="refentry.version.suppress">0</xsl:param>
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/manpages/pi.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/manpages/pi.xml
new file mode 100644
index 0000000..8db98d3
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/manpages/pi.xml
@@ -0,0 +1,70 @@
+<?xml version="1.0"?>
+
+<reference><info><title>manpages Processing Instruction Reference</title>
+ <releaseinfo role="meta">
+ $Id: pi.xsl 7644 2008-01-16 11:04:07Z xmldoc $
+ </releaseinfo>
+ </info>
+ <partintro xml:id="partintro">
+ <title>Introduction</title>
+
+<para>This is generated reference documentation for all
+ user-specifiable processing instructions (PIs) in the DocBook
+ XSL stylesheets for manpages output.
+ <note>
+
+<para>You add these PIs at particular points in a document to
+ cause specific “exceptions†to formatting/output behavior. To
+ make global changes in formatting/output behavior across an
+ entire document, it’s better to do it by setting an
+ appropriate stylesheet parameter (if there is one).</para>
+
+ </note>
+ </para>
+
+ </partintro>
+
+<refentry xmlns:xlink="http://www.w3.org/1999/xlink" xml:id="dbman_funcsynopsis-style">
+<refnamediv>
+<refname>dbman_funcsynopsis-style</refname>
+<refpurpose>Specifies presentation style for a funcsynopsis.</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+
+ <synopsis><tag class="xmlpi">dbman funcsynopsis-style="kr"|"ansi"</tag></synopsis>
+
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>Use the <tag class="xmlpi">dbman
+ funcsynopsis-style</tag> PI as a child of a
+ <tag>funcsynopsis</tag> or anywhere within a funcsynopsis
+ to control the presentation style for output of all
+ <tag>funcprototype</tag> instances within that funcsynopsis.</para>
+
+ </refsect1><refsect1><title>Parameters</title>
+
+<variablelist>
+ <varlistentry><term>funcsynopsis-style="kr"</term>
+ <listitem>
+
+<para>Displays the <tag>funcprototype</tag> in K&amp;R style</para>
+
+ </listitem>
+ </varlistentry>
+ <varlistentry><term>funcsynopsis-style="ansi"</term>
+ <listitem>
+
+<para>Displays the <tag>funcprototype</tag> in ANSI style</para>
+
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ </refsect1><refsect1 role="params"><title>Related Global Parameters</title>
+
+<para><parameter>man.funcsynopsis.style</parameter></para>
+
+ </refsect1></refentry>
+</reference>
+
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/manpages/pi.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/manpages/pi.xsl
new file mode 100644
index 0000000..7b0975b
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/manpages/pi.xsl
@@ -0,0 +1,79 @@
+<?xml version='1.0'?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:doc="http://nwalsh.com/xsl/documentation/1.0"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ exclude-result-prefixes="doc"
+ version='1.0'>
+
+<!-- ********************************************************************
+ $Id: pi.xsl 7644 2008-01-16 11:04:07Z xmldoc $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<doc:reference xmlns=""><info><title>manpages Processing Instruction Reference</title>
+ <releaseinfo role="meta">
+ $Id: pi.xsl 7644 2008-01-16 11:04:07Z xmldoc $
+ </releaseinfo>
+ </info>
+ <partintro xml:id="partintro">
+ <title>Introduction</title>
+ <para>This is generated reference documentation for all
+ user-specifiable processing instructions (PIs) in the DocBook
+ XSL stylesheets for manpages output.
+ <note>
+ <para>You add these PIs at particular points in a document to
+ cause specific “exceptions†to formatting/output behavior. To
+ make global changes in formatting/output behavior across an
+ entire document, it’s better to do it by setting an
+ appropriate stylesheet parameter (if there is one).</para>
+ </note>
+ </para>
+ </partintro>
+</doc:reference>
+
+<!-- ==================================================================== -->
+
+<doc:pi name="dbman_funcsynopsis-style" xmlns="">
+ <refpurpose>Specifies presentation style for a funcsynopsis.</refpurpose>
+ <refdescription>
+ <para>Use the <tag class="xmlpi">dbman
+ funcsynopsis-style</tag> PI as a child of a
+ <tag>funcsynopsis</tag> or anywhere within a funcsynopsis
+ to control the presentation style for output of all
+ <tag>funcprototype</tag> instances within that funcsynopsis.</para>
+ </refdescription>
+ <refsynopsisdiv>
+ <synopsis><tag class="xmlpi">dbman funcsynopsis-style="kr"|"ansi"</tag></synopsis>
+ </refsynopsisdiv>
+ <refparameter>
+ <variablelist>
+ <varlistentry><term>funcsynopsis-style="kr"</term>
+ <listitem>
+ <para>Displays the <tag>funcprototype</tag> in K&amp;R style</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry><term>funcsynopsis-style="ansi"</term>
+ <listitem>
+ <para>Displays the <tag>funcprototype</tag> in ANSI style</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+ <refsee role="params">
+ <para><parameter>man.funcsynopsis.style</parameter></para>
+ </refsee>
+</doc:pi>
+<xsl:template name="pi.dbman_funcsynopsis-style">
+ <xsl:param name="node" select="."/>
+ <xsl:call-template name="pi-attribute">
+ <xsl:with-param name="pis" select="$node/processing-instruction('dbman')"/>
+ <xsl:with-param name="attribute" select="'funcsynopsis-style'"/>
+ </xsl:call-template>
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/manpages/profile-docbook.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/manpages/profile-docbook.xsl
new file mode 100644
index 0000000..41b14c7
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/manpages/profile-docbook.xsl
@@ -0,0 +1,281 @@
+<?xml version="1.0" encoding="US-ASCII"?>
+<!--This file was created automatically by xsl2profile-->
+<!--from the DocBook XSL stylesheets.-->
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:exsl="http://exslt.org/common" xmlns:ng="http://docbook.org/docbook-ng" xmlns:db="http://docbook.org/ns/docbook" xmlns:exslt="http://exslt.org/common" exslt:dummy="dummy" ng:dummy="dummy" db:dummy="dummy" extension-element-prefixes="exslt" exclude-result-prefixes="exsl exslt" version="1.0">
+
+ <xsl:import href="../html/docbook.xsl"/>
+ <xsl:import href="../html/manifest.xsl"/>
+ <!-- * html-synop.xsl file is generated by build -->
+ <xsl:import href="html-synop.xsl"/>
+ <xsl:output method="text" encoding="UTF-8" indent="no"/>
+ <!-- ********************************************************************
+ $Id: docbook.xsl 8841 2010-08-14 07:21:25Z mzjn $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+ <!-- ==================================================================== -->
+
+ <xsl:include href="../common/refentry.xsl"/>
+ <xsl:include href="../common/charmap.xsl"/>
+ <xsl:include href="param.xsl"/>
+ <xsl:include href="utility.xsl"/>
+ <xsl:include href="info.xsl"/>
+ <xsl:include href="other.xsl"/>
+ <xsl:include href="refentry.xsl"/>
+ <xsl:include href="block.xsl"/>
+ <xsl:include href="inline.xsl"/>
+ <xsl:include href="synop.xsl"/>
+ <xsl:include href="lists.xsl"/>
+ <xsl:include href="endnotes.xsl"/>
+ <xsl:include href="table.xsl"/>
+ <xsl:include href="pi.xsl"/>
+
+ <!-- * we rename the following just to avoid using params with "man" -->
+ <!-- * prefixes in the table.xsl stylesheet (because that stylesheet -->
+ <!-- * can potentially be reused for more than just man output) -->
+ <xsl:param name="tbl.font.headings" select="$man.font.table.headings"/>
+ <xsl:param name="tbl.font.title" select="$man.font.table.title"/>
+
+ <xsl:param name="stylesheet.result.type" select="'manpages'"/>
+
+ <!-- ==================================================================== -->
+
+ <xslo:include xmlns:xslo="http://www.w3.org/1999/XSL/Transform" href="../profiling/profile-mode.xsl"/><xslo:variable xmlns:xslo="http://www.w3.org/1999/XSL/Transform" name="profiled-content"><xslo:choose><xslo:when test="*/self::ng:* or */self::db:*"><xslo:message>Note: namesp. cut : stripped namespace before processing</xslo:message><xslo:variable name="stripped-content"><xslo:apply-templates select="/" mode="stripNS"/></xslo:variable><xslo:message>Note: namesp. cut : processing stripped document</xslo:message><xslo:apply-templates select="exslt:node-set($stripped-content)" mode="profile"/></xslo:when><xslo:otherwise><xslo:apply-templates select="/" mode="profile"/></xslo:otherwise></xslo:choose></xslo:variable><xslo:variable xmlns:xslo="http://www.w3.org/1999/XSL/Transform" name="profiled-nodes" select="exslt:node-set($profiled-content)"/><xsl:template match="/">
+ <!-- * Get a title for current doc so that we let the user -->
+ <!-- * know what document we are processing at this point. -->
+ <xsl:variable name="doc.title">
+ <xsl:call-template name="get.doc.title"/>
+ </xsl:variable>
+ <xsl:choose>
+ <!-- * when we find a namespaced document, strip the -->
+ <!-- * namespace and then continue processing it. -->
+ <xsl:when test="false()"/>
+ <xsl:when test="//*[local-name() = 'refentry']">
+ <!-- * Check to see if we have any refentry children in this -->
+ <!-- * document; if so, process them. The reason we use -->
+ <!-- * local-name()=refentry (instead of just //refentry) to to -->
+ <!-- * check for refentry children is because this stylsheet is -->
+ <!-- * also post-processed by the stylesheet build to create the -->
+ <!-- * manpages/profile-docbook.xsl, and the refentry child check -->
+ <!-- * in the profile-docbook.xsl stylesheet won't work if we do -->
+ <!-- * a simple //refentry check. -->
+ <xsl:apply-templates select="$profiled-nodes//refentry"/>
+ <!-- * if $man.output.manifest.enabled is non-zero, -->
+ <!-- * generate a manifest file -->
+ <xsl:if test="not($man.output.manifest.enabled = 0)">
+ <xsl:call-template name="generate.manifest">
+ <xsl:with-param name="filename">
+ <xsl:choose>
+ <xsl:when test="not($man.output.manifest.filename = '')">
+ <!-- * If a name for the manifest file is specified, -->
+ <!-- * use that name. -->
+ <xsl:value-of select="$man.output.manifest.filename"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <!-- * Otherwise, if user has unset -->
+ <!-- * $man.output.manifest.filename, default to -->
+ <!-- * using "MAN.MANIFEST" as the filename. Because -->
+ <!-- * $man.output.manifest.enabled is non-zero and -->
+ <!-- * so we must have a filename in order to -->
+ <!-- * generate the manifest. -->
+ <xsl:text>MAN.MANIFEST</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:when>
+ <xsl:otherwise>
+ <!-- * Otherwise, the document does not contain any -->
+ <!-- * refentry elements, so log/emit message and stop. -->
+ <xsl:call-template name="log.message">
+ <xsl:with-param name="level">Erro</xsl:with-param>
+ <xsl:with-param name="source" select="$doc.title"/>
+ <xsl:with-param name="context-desc">
+ <xsl:text> no refentry</xsl:text>
+ </xsl:with-param>
+ <xsl:with-param name="message">
+ <xsl:text>No refentry elements found</xsl:text>
+ <xsl:if test="$doc.title != ''">
+ <xsl:text> in "</xsl:text>
+ <xsl:choose>
+ <xsl:when test="string-length($doc.title) &gt; 30">
+ <xsl:value-of select="substring($doc.title,1,30)"/>
+ <xsl:text>...</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$doc.title"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:text>"</xsl:text>
+ </xsl:if>
+ <xsl:text>.</xsl:text>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+ <!-- ============================================================== -->
+
+ <xsl:template match="refentry">
+ <xsl:param name="lang">
+ <xsl:call-template name="l10n.language"/>
+ </xsl:param>
+ <!-- * Just use the first refname found as the "name" of the man -->
+ <!-- * page (which may different from the "title"...) -->
+ <xsl:variable name="first.refname" select="refnamediv[1]/refname[1]"/>
+
+ <xsl:call-template name="root.messages">
+ <xsl:with-param name="refname" select="$first.refname"/>
+ </xsl:call-template>
+
+ <!-- * Because there are several times when we need to check *info of -->
+ <!-- * each refentry and its ancestors, we get those and store the -->
+ <!-- * data from them as a node-set in memory. -->
+
+ <!-- * Make a node-set with contents of *info -->
+ <xsl:variable name="get.info" select="ancestor-or-self::*/*[substring(local-name(), string-length(local-name()) - 3) = 'info']"/>
+ <xsl:variable name="info" select="exsl:node-set($get.info)"/>
+
+ <!-- * The get.refentry.metadata template is in -->
+ <!-- * ../common/refentry.xsl. It looks for metadata in $info -->
+ <!-- * and in various other places and then puts it into a form -->
+ <!-- * that's easier for us to digest. -->
+ <xsl:variable name="get.refentry.metadata">
+ <xsl:call-template name="get.refentry.metadata">
+ <xsl:with-param name="refname" select="$first.refname"/>
+ <xsl:with-param name="info" select="$info"/>
+ <xsl:with-param name="prefs" select="$refentry.metadata.prefs"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:variable name="refentry.metadata" select="exsl:node-set($get.refentry.metadata)"/>
+
+ <!-- * Assemble the various parts into a complete page, then store into -->
+ <!-- * $manpage.contents so that we can manipluate them further. -->
+ <xsl:variable name="manpage.contents">
+ <!-- * preprocessor invocation (need for legacy AT&T troff use) -->
+ <!-- * this tells troff to pre-process the page through tbl(1) -->
+ <!-- * (groff can figure it out automatically, but AT&T troff can't) -->
+ <xsl:text>'\" t
+</xsl:text>
+ <!-- * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
+ <!-- * top.comment = commented-out section at top of roff source -->
+ <!-- * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
+ <xsl:call-template name="top.comment">
+ <xsl:with-param name="info" select="$info"/>
+ <xsl:with-param name="date" select="$refentry.metadata/date"/>
+ <xsl:with-param name="title" select="$refentry.metadata/title"/>
+ <xsl:with-param name="manual" select="$refentry.metadata/manual"/>
+ <xsl:with-param name="source" select="$refentry.metadata/source"/>
+ <xsl:with-param name="refname" select="$first.refname"/>
+ </xsl:call-template>
+ <!-- * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
+ <!-- * TH.title.line = title line in header/footer of man page -->
+ <!-- * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
+ <xsl:call-template name="TH.title.line">
+ <!-- * .TH TITLE section extra1 extra2 extra3 -->
+ <!-- * -->
+ <!-- * According to the man(7) man page: -->
+ <!-- * -->
+ <!-- * extra1 = date, "the date of the last revision" -->
+ <!-- * extra2 = source, "the source of the command" -->
+ <!-- * extra3 = manual, "the title of the manual -->
+ <!-- * (e.g., Linux Programmer's Manual)" -->
+ <!-- * -->
+ <!-- * So, we end up with: -->
+ <!-- * -->
+ <!-- * .TH TITLE section date source manual -->
+ <!-- * -->
+ <xsl:with-param name="title" select="$refentry.metadata/title"/>
+ <xsl:with-param name="section" select="$refentry.metadata/section"/>
+ <xsl:with-param name="extra1" select="$refentry.metadata/date"/>
+ <xsl:with-param name="extra2" select="$refentry.metadata/source"/>
+ <xsl:with-param name="extra3" select="$refentry.metadata/manual"/>
+ </xsl:call-template>
+ <!-- * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
+ <!-- * (re)define some macros -->
+ <!-- * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
+ <xsl:call-template name="define.portability.macros"/>
+ <xsl:if test="not($man.output.better.ps.enabled = 0)">
+ <xsl:call-template name="define.macros"/>
+ </xsl:if>
+ <!-- * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
+ <!-- * Set default hyphenation, justification, indentation, and -->
+ <!-- * line-breaking -->
+ <!-- * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
+ <xsl:call-template name="set.default.formatting"/>
+ <!-- * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
+ <!-- * Main body of man page -->
+ <!-- * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
+ <xsl:text>.\" -----------------------------------------------------------------
+</xsl:text>
+ <xsl:text>.\" * MAIN CONTENT STARTS HERE *
+</xsl:text>
+ <xsl:text>.\" -----------------------------------------------------------------
+</xsl:text>
+ <xsl:apply-templates/>
+ <!-- * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
+ <!-- * AUTHOR section -->
+ <!-- * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
+ <xsl:if test="not($man.authors.section.enabled = 0)">
+ <xsl:call-template name="author.section">
+ <xsl:with-param name="info" select="$info"/>
+ </xsl:call-template>
+ </xsl:if>
+ <!-- * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
+ <!-- * COPYRIGHT section -->
+ <!-- * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
+ <xsl:if test="not($man.copyright.section.enabled = 0)">
+ <xsl:call-template name="copyright.section">
+ <xsl:with-param name="info" select="$info"/>
+ </xsl:call-template>
+ </xsl:if>
+ <!-- * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
+ <!-- * NOTES list (only if user wants endnotes numbered and/or listed) -->
+ <!-- * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
+ <xsl:if test="$man.endnotes.list.enabled != 0 or $man.endnotes.are.numbered != 0">
+ <xsl:call-template name="endnotes.list"/>
+ </xsl:if>
+ </xsl:variable> <!-- * end of manpage.contents -->
+
+ <!-- * Prepare the page contents for final output, then store in -->
+ <!-- * $manpage.contents.prepared so the we can pass it on to the -->
+ <!-- * write.text.chunk() function -->
+ <xsl:variable name="manpage.contents.prepared">
+ <!-- * "Preparing" the page contents involves, at a minimum, -->
+ <!-- * doubling any backslashes found (so they aren't interpreted -->
+ <!-- * as roff escapes). -->
+ <!-- * -->
+ <!-- * If $charmap.enabled is true, "preparing" the page contents also -->
+ <!-- * involves applying a character map to convert Unicode symbols and -->
+ <!-- * special characters into corresponding roff escape sequences. -->
+ <xsl:call-template name="prepare.manpage.contents">
+ <xsl:with-param name="content" select="$manpage.contents"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <!-- * Write the prepared page contents to disk to create -->
+ <!-- * the final man page. -->
+ <xsl:call-template name="write.man.file">
+ <xsl:with-param name="name" select="$first.refname"/>
+ <xsl:with-param name="section" select="$refentry.metadata/section"/>
+ <xsl:with-param name="lang" select="$lang"/>
+ <xsl:with-param name="content" select="$manpage.contents.prepared"/>
+ </xsl:call-template>
+
+ <!-- * Generate "stub" (alias) pages (if any needed) -->
+ <xsl:call-template name="write.stubs">
+ <xsl:with-param name="first.refname" select="$first.refname"/>
+ <xsl:with-param name="section" select="$refentry.metadata/section"/>
+ <xsl:with-param name="lang" select="$lang"/>
+ </xsl:call-template>
+
+ </xsl:template>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/manpages/refentry.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/manpages/refentry.xsl
new file mode 100644
index 0000000..4f6b5af
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/manpages/refentry.xsl
@@ -0,0 +1,319 @@
+<?xml version='1.0'?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version='1.0'>
+
+<!-- ********************************************************************
+ $Id: refentry.xsl 8235 2009-02-09 16:22:14Z xmldoc $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<!-- ==================================================================== -->
+
+ <xsl:template match="refnamediv">
+ <xsl:choose>
+ <xsl:when test="preceding-sibling::refnamediv">
+ <!-- * No title on secondary refnamedivs! -->
+ <!-- * Just put a single line break instead -->
+ <xsl:text>.br&#10;</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="make.subheading">
+ <xsl:with-param name="title">
+ <xsl:apply-templates select="." mode="subheading.markup"/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:call-template name="mark.subheading"/>
+ <!-- * if we have multiple Refname instances, separate the names -->
+ <!-- * with commas -->
+ <xsl:for-each select="refname">
+ <xsl:if test="position()>1">
+ <xsl:text>, </xsl:text>
+ </xsl:if>
+ <xsl:call-template name="string.subst">
+ <!-- * To create the name(s) for this man page, replace any -->
+ <!-- * spaces in the refname(s) with underscores. This ensures -->
+ <!-- * that tools like lexgrog(1) will be able to parse the name -->
+ <!-- * (lexgrog won’t parse names that contain spaces). -->
+ <xsl:with-param name="string" select="."/>
+ <xsl:with-param name="target" select="' '"/>
+ <xsl:with-param name="replacement" select="'_'"/>
+ </xsl:call-template>
+ </xsl:for-each>
+ <!-- * The man(7) man pages says: -->
+ <!-- * -->
+ <!-- * The only required heading is NAME, which should be the -->
+ <!-- * first section and be followed on the next line by a one -->
+ <!-- * line description of the program: -->
+ <!-- * -->
+ <!-- * .SH NAME chess \- the game of chess -->
+ <!-- * -->
+ <!-- * It is extremely important that this format is followed, -->
+ <!-- * and that there is a backslash before the single dash -->
+ <!-- * which follows the command name. This syntax is used by -->
+ <!-- * the makewhatis(8) program to create a database of short -->
+ <!-- * command descriptions for the whatis(1) and apropos(1) -->
+ <!-- * commands. -->
+ <!-- * -->
+ <xsl:if test="refpurpose/node()">
+ <xsl:text> \- </xsl:text>
+ <xsl:variable name="refpurpose">
+ <xsl:apply-templates select="refpurpose/node()"/>
+ </xsl:variable>
+ <xsl:value-of select="normalize-space($refpurpose)"/>
+ </xsl:if>
+ <xsl:text>&#10;</xsl:text>
+ </xsl:template>
+
+ <xsl:template match="refsynopsisdiv">
+ <xsl:call-template name="make.subheading">
+ <xsl:with-param name="title">
+ <xsl:apply-templates select="." mode="subheading.markup"/>
+ </xsl:with-param>
+ </xsl:call-template>
+ <xsl:apply-templates/>
+ </xsl:template>
+
+ <xsl:template match="refsect1|refentry/refsection">
+ <xsl:variable name="title">
+ <xsl:apply-templates select="." mode="subheading.markup"/>
+ </xsl:variable>
+ <xsl:call-template name="make.subheading">
+ <xsl:with-param name="title">
+ <xsl:value-of select="normalize-space($title)"/>
+ </xsl:with-param>
+ </xsl:call-template>
+ <xsl:apply-templates/>
+ </xsl:template>
+
+ <xsl:template match="refsect2|refentry/refsection/refsection">
+ <xsl:call-template name="mark.subheading"/>
+ <xsl:variable name="title">
+ <xsl:apply-templates
+ select="(info/title
+ |refsectioninfo/title
+ |refsect1info/title
+ |title)[1]/node()"/>
+ </xsl:variable>
+ <xsl:text>.SS "</xsl:text>
+ <xsl:value-of select="normalize-space($title)"/>
+ <xsl:text>"&#10;</xsl:text>
+ <xsl:call-template name="mark.subheading"/>
+ <xsl:choose>
+ <!-- * If default-indentation adjustment is on, then indent the -->
+ <!-- * child content of this Refsect2 -->
+ <xsl:when test="not($man.indent.refsect = 0)">
+ <xsl:text>.RS&#10;</xsl:text>
+ <xsl:apply-templates/>
+ <xsl:text>.RE&#10;</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <!-- * If default-indentation adjustment is on, then do not -->
+ <!-- * indent the child content of this Refsect2, because -->
+ <!-- * the title is already "sticking out to the left" -->
+ <!-- * (as the groff_man(7) man page describes it), which -->
+ <!-- * actually means the title is indented by the value of -->
+ <!-- * the SN register, which appears by default to be -->
+ <!-- * about half of the default indentation value -->
+ <xsl:apply-templates/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+ <xsl:template match="refsect3|refentry/refsection/refsection/refsection">
+ <xsl:variable name="title">
+ <xsl:value-of select="(info/title
+ |refsectioninfo/title
+ |refsect1info/title
+ |title)[1]"/>
+ </xsl:variable>
+ <xsl:choose>
+ <!-- * If default-indentation adjustment is on, then indent the -->
+ <!-- * child content of this Refsect3 or Refsection. -->
+ <xsl:when test="not($man.indent.refsect != 0)">
+ <xsl:call-template name="nested-section-title"/>
+ <xsl:text>.RS</xsl:text>
+ <xsl:if test="not($man.indent.width = '')">
+ <xsl:text> </xsl:text>
+ <xsl:value-of select="$man.indent.width"/>
+ </xsl:if>
+ <xsl:text>&#10;</xsl:text>
+ <xsl:apply-templates/>
+ <xsl:text>.RE&#10;</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <!-- * If default-indentation adjustment is on, then do not -->
+ <!-- * indent the child content of this Refsect2, because -->
+ <!-- * the title is already "sticking out to the left" -->
+ <!-- * (as the groff_man(7) man page describes it), which -->
+ <!-- * actually means the title is indented by the value of -->
+ <!-- * the SN register, which appears by default to be -->
+ <!-- * about half of the default indentation value -->
+ <xsl:text>.ti (\n(SNu * 5u / 3u)&#10;</xsl:text>
+ <xsl:call-template name="nested-section-title"/>
+ <xsl:apply-templates/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+ <xsl:template match="refsection">
+ <!-- * This template is used for a nested Refsection that is -->
+ <!-- * is a child of a Refsect3-level section (The numberd -->
+ <!-- * Refsect hierarchy in DocBook ends with Refsect3, so -->
+ <!-- * there is not actually a Refsect4 element.) -->
+ <xsl:variable name="title">
+ <xsl:value-of select="(info/title
+ |refsectioninfo/title
+ |refsect1info/title
+ |title)[1]"/>
+ </xsl:variable>
+ <xsl:variable name="indent-width">
+ <xsl:if test="not($man.indent.refsect = 0)">
+ <!-- * If default-indentation adjustment is on, then indent the -->
+ <!-- * child content of this Refsect3 or Refsection. -->
+ <xsl:text>(\n(SNu)&#10;</xsl:text>
+ </xsl:if>
+ </xsl:variable>
+ <xsl:call-template name="nested-section-title"/>
+ <xsl:text>.RS (\n(SNu)&#10;</xsl:text>
+ <xsl:apply-templates/>
+ <xsl:text>.RE&#10;</xsl:text>
+ </xsl:template>
+
+ <!-- ==================================================================== -->
+
+ <xsl:template match="refsect1|refentry/refsection"
+ mode="subheading.markup">
+ <xsl:variable name="title" select="(info/title
+ |refsectioninfo/title
+ |refsect1info/title
+ |title)[1]"/>
+ <xsl:apply-templates select="$title" mode="title.markup"/>
+ </xsl:template>
+
+ <xsl:template match="refsect1|refentry/refsection"
+ mode="title.markup">
+ <!-- * Note: This template is used just for generating the text for -->
+ <!-- * cross-references to Refsect1 or top-level Refsection instances. -->
+ <xsl:variable name="title" select="(info/title
+ |refsectioninfo/title
+ |refsect1info/title
+ |title)[1]"/>
+ <xsl:call-template name="process.SH.xref">
+ <xsl:with-param name="title">
+ <xsl:apply-templates select="$title" mode="title.markup"/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:template>
+
+ <!-- * Output of Titles from Xref with Endterm needs to be handled -->
+ <!-- * separately from output for Endterm-less Xref -->
+ <xsl:template match="refsect1/title
+ |refentry/refsection/title
+ |refsynopsisdiv/title"
+ mode="endterm">
+ <xsl:call-template name="process.SH.xref">
+ <xsl:with-param name="title">
+ <xsl:apply-templates/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:template>
+
+ <xsl:template match="refsynopsisdiv" mode="subheading.markup">
+ <xsl:param name="allow-anchors" select="0"/>
+ <xsl:variable name="title">
+ <xsl:call-template name="get.refsynopsisdiv.title">
+ <xsl:with-param name="allow-anchors" select="$allow-anchors"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:value-of select="$title"/>
+ </xsl:template>
+
+ <xsl:template match="refsynopsisdiv" mode="title.markup">
+ <!-- * Note: This template is used just for generating the text for -->
+ <!-- * cross-references to Refsynopsisdiv instances. -->
+ <xsl:param name="allow-anchors" select="0"/>
+ <xsl:variable name="title">
+ <xsl:call-template name="get.refsynopsisdiv.title">
+ <xsl:with-param name="allow-anchors" select="$allow-anchors"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:call-template name="process.SH.xref">
+ <xsl:with-param name="title" select="$title"/>
+ </xsl:call-template>
+ </xsl:template>
+
+ <xsl:template name="get.refsynopsisdiv.title">
+ <xsl:param name="allow-anchors"/>
+ <xsl:choose>
+ <xsl:when test="info/title
+ |refsynopsisdivinfo/title
+ |title">
+ <xsl:apply-templates
+ select="(info/title
+ |refsynopsisdivinfo/title
+ |title)[1]" mode="title.markup">
+ <xsl:with-param name="allow-anchors" select="$allow-anchors"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'RefSynopsisDiv'"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+ <xsl:template match="refnamediv" mode="subheading.markup">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'RefName'"/>
+ </xsl:call-template>
+ </xsl:template>
+
+ <xsl:template match="refnamediv" mode="title.markup">
+ <xsl:call-template name="process.SH.xref">
+ <xsl:with-param name="title">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'RefName'"/>
+ </xsl:call-template>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:template>
+
+ <xsl:template match="refnamediv" mode="xref-to">
+ <xsl:apply-templates select="." mode="title.markup"/>
+ </xsl:template>
+
+ <!-- * suppress any title we don't otherwise process elsewhere -->
+ <xsl:template match="title"/>
+
+ <!-- ==================================================================== -->
+
+ <xsl:template name="process.SH.xref">
+ <xsl:param name="title"/>
+ <xsl:choose>
+ <xsl:when test="not($man.output.better.ps.enabled = 0)">
+ <xsl:text>\c</xsl:text>
+ <xsl:text>&#x2592;</xsl:text>
+ <xsl:text>.SH-xref </xsl:text>
+ <xsl:text>"</xsl:text>
+ <xsl:value-of select="$title"/>
+ <xsl:text>\c"</xsl:text>
+ <xsl:text>&#x2592;</xsl:text>
+ <xsl:text>\&amp;</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="string.upper">
+ <xsl:with-param name="string" select="$title"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/manpages/synop.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/manpages/synop.xsl
new file mode 100644
index 0000000..2e0b14e
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/manpages/synop.xsl
@@ -0,0 +1,432 @@
+<?xml version='1.0'?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:exsl="http://exslt.org/common"
+ exclude-result-prefixes="exsl"
+ version='1.0'>
+
+<!-- ********************************************************************
+ $Id: synop.xsl 7956 2008-03-27 12:07:43Z xmldoc $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<xsl:variable name="arg.or.sep"> |</xsl:variable>
+
+<!-- * Note: If you're looking for the *Synopsis* element, you won't -->
+<!-- * find any code here for handling it. It's a "verbatim" -->
+<!-- * environment; see the block.xsl file instead. -->
+
+<xsl:template match="synopfragmentref">
+ <xsl:variable name="target" select="key('id',@linkend)"/>
+ <xsl:variable name="snum">
+ <xsl:apply-templates select="$target" mode="synopfragment.number"/>
+ </xsl:variable>
+ <xsl:text>(</xsl:text>
+ <xsl:value-of select="$snum"/>
+ <xsl:text>)</xsl:text>
+ <xsl:text>&#x2580;</xsl:text>
+ <xsl:call-template name="italic">
+ <xsl:with-param name="node" select="."/>
+ <xsl:with-param name="context" select="."/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="synopfragment" mode="synopfragment.number">
+ <xsl:number format="1"/>
+</xsl:template>
+
+<xsl:template match="synopfragment">
+ <xsl:variable name="snum">
+ <xsl:apply-templates select="." mode="synopfragment.number"/>
+ </xsl:variable>
+ <xsl:text>&#10;</xsl:text>
+ <!-- * If we have a group of Synopfragments, we only want to output a -->
+ <!-- * line of space before the first; so when we find a Synopfragment -->
+ <!-- * which has another Synopfragment as a following sibling, we use-->
+ <!-- * the pinch-together template to close up the line of space -->
+ <!-- * that would otherwise be generated by the .HP macro -->
+ <xsl:if test="following-sibling::*[self::synopfragment]">
+ <xsl:call-template name="pinch.together"/>
+ </xsl:if>
+ <xsl:text>.HP </xsl:text>
+ <xsl:text>\w'</xsl:text>
+ <xsl:text>(</xsl:text>
+ <xsl:value-of select="$snum"/>
+ <xsl:text>)</xsl:text>
+ <xsl:text>\ 'u</xsl:text>
+ <xsl:text>&#10;</xsl:text>
+ <xsl:text>(</xsl:text>
+ <xsl:value-of select="$snum"/>
+ <xsl:text>)</xsl:text>
+ <xsl:text>\ </xsl:text>
+ <xsl:apply-templates/>
+</xsl:template>
+
+<xsl:template match="group|arg" name="group-or-arg">
+ <xsl:variable name="choice" select="@choice"/>
+ <xsl:variable name="rep" select="@rep"/>
+ <xsl:variable name="sepchar">
+ <xsl:choose>
+ <xsl:when test="ancestor-or-self::*/@sepchar">
+ <xsl:value-of select="ancestor-or-self::*/@sepchar"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text> </xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="position()>1 and
+ not(preceding-sibling::*[1][self::sbr])"
+ ><xsl:value-of select="$sepchar"/></xsl:if>
+ <xsl:choose>
+ <xsl:when test="$choice='plain'">
+ <!-- * do nothing -->
+ </xsl:when>
+ <xsl:when test="$choice='req'">
+ <xsl:value-of select="$arg.choice.req.open.str"/>
+ </xsl:when>
+ <xsl:when test="$choice='opt'">
+ <xsl:value-of select="$arg.choice.opt.open.str"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$arg.choice.def.open.str"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:variable name="arg">
+ <xsl:apply-templates/>
+ </xsl:variable>
+ <xsl:choose>
+ <xsl:when test="local-name(.) = 'arg' and not(ancestor::arg)">
+ <!-- * Prevent arg contents from getting wrapped and broken up -->
+ <xsl:variable name="arg.wrapper">
+ <Arg><xsl:value-of select="normalize-space($arg)"/></Arg>
+ </xsl:variable>
+ <xsl:apply-templates mode="prevent.line.breaking"
+ select="exsl:node-set($arg.wrapper)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$arg"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:choose>
+ <xsl:when test="$rep='repeat'">
+ <xsl:value-of select="$arg.rep.repeat.str"/>
+ </xsl:when>
+ <xsl:when test="$rep='norepeat'">
+ <xsl:value-of select="$arg.rep.norepeat.str"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$arg.rep.def.str"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:choose>
+ <xsl:when test="$choice='plain'">
+ <xsl:if test='arg'>
+ <xsl:value-of select="$arg.choice.plain.close.str"/>
+ </xsl:if>
+ </xsl:when>
+ <xsl:when test="$choice='req'">
+ <xsl:value-of select="$arg.choice.req.close.str"/>
+ </xsl:when>
+ <xsl:when test="$choice='opt'">
+ <xsl:value-of select="$arg.choice.opt.close.str"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$arg.choice.def.close.str"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="group/arg">
+ <xsl:variable name="choice" select="@choice"/>
+ <xsl:variable name="rep" select="@rep"/>
+ <xsl:if test="position()>1"><xsl:value-of select="$arg.or.sep"/></xsl:if>
+ <xsl:call-template name="group-or-arg"/>
+</xsl:template>
+
+<xsl:template match="sbr">
+ <xsl:text>&#x2592;</xsl:text>
+ <xsl:text>.br&#x2592;</xsl:text>
+</xsl:template>
+
+<xsl:template match="cmdsynopsis">
+ <!-- * if justification is enabled by default, turn it off temporarily -->
+ <xsl:if test="$man.justify != 0">
+ <xsl:text>.ad l&#10;</xsl:text>
+ </xsl:if>
+ <!-- * if hyphenation is enabled by default, turn it off temporarily -->
+ <xsl:if test="$man.hyphenate != 0">
+ <xsl:text>.hy 0&#10;</xsl:text>
+ </xsl:if>
+ <xsl:call-template name="synopsis-block-start"/>
+ <xsl:text>.HP </xsl:text>
+ <xsl:text>\w'</xsl:text>
+ <xsl:variable name="command">
+ <xsl:apply-templates select="command"/>
+ </xsl:variable>
+ <xsl:call-template name="string.subst">
+ <xsl:with-param name="string" select="normalize-space($command)"/>
+ <xsl:with-param name="target" select="' '"/>
+ <xsl:with-param name="replacement" select="'\ '"/>
+ </xsl:call-template>
+ <xsl:text>\ 'u</xsl:text>
+ <xsl:text>&#10;</xsl:text>
+ <xsl:apply-templates/>
+ <xsl:text>&#10;</xsl:text>
+ <xsl:call-template name="synopsis-block-end"/>
+ <!-- * if justification is enabled by default, turn it back on -->
+ <xsl:if test="$man.justify != 0">
+ <xsl:text>.ad&#10;</xsl:text>
+ </xsl:if>
+ <!-- * if hyphenation is enabled by default, turn it back on -->
+ <xsl:if test="$man.hyphenate != 0">
+ <xsl:text>.hy&#10;</xsl:text>
+ </xsl:if>
+</xsl:template>
+
+<!-- ==================================================================== -->
+<!-- * Funcsynopis hierarchy starts here -->
+<!-- ==================================================================== -->
+
+<!-- * Note: If you're looking for the *Funcsynopsisinfo* element, -->
+<!-- * you won't find any code here for handling it. It's a "verbatim" -->
+<!-- * environment; see the block.xsl file instead. -->
+
+<!-- * Within funcsynopis output, disable hyphenation, and use -->
+<!-- * left-aligned filling for the duration of the synopsis, so that -->
+<!-- * line breaks only occur between separate paramdefs. -->
+<xsl:template match="funcsynopsis">
+ <!-- * if justification is enabled by default, turn it off temporarily -->
+ <xsl:if test="$man.justify != 0">
+ <xsl:text>.ad l&#10;</xsl:text>
+ </xsl:if>
+ <!-- * if hyphenation is enabled by default, turn it off temporarily -->
+ <xsl:if test="$man.hyphenate != 0">
+ <xsl:text>.hy 0&#10;</xsl:text>
+ </xsl:if>
+ <xsl:apply-templates/>
+ <!-- * if justification is enabled by default, turn it back on -->
+ <xsl:if test="$man.justify != 0">
+ <xsl:text>.ad&#10;</xsl:text>
+ </xsl:if>
+ <!-- * if hyphenation is enabled by default, turn it back on -->
+ <xsl:if test="$man.hyphenate != 0">
+ <xsl:text>.hy&#10;</xsl:text>
+ </xsl:if>
+</xsl:template>
+
+<!-- * In HTML output, placing a dbfunclist PI as a child of a particular -->
+<!-- * element creates a hyperlinked list of all funcsynopsis instances -->
+<!-- * that are descendants of that element. But we can’t really do this -->
+<!-- * kind of hyperlinked list in manpages output, so we just need to -->
+<!-- * suppress it instead. -->
+<xsl:template match="processing-instruction('dbfunclist')"/>
+
+<!-- * ***************************************************************** -->
+<!-- * Note about boldface in funcprototype output -->
+<!-- * ***************************************************************** -->
+<!-- * All funcprototype content is by default rendered in bold, -->
+<!-- * because the old man(7) man page, now man-pages(7) says this: -->
+<!-- * -->
+<!-- * For functions, the arguments are always specified using -->
+<!-- * italics, even in the SYNOPSIS section, where the rest of -->
+<!-- * the function is specified in bold -->
+<!-- * -->
+<!-- * Look through the contents of the man/man2 and man3 directories -->
+<!-- * on your system, and you'll see that most existing pages do follow -->
+<!-- * this "bold everything in function synopsis" rule. -->
+<!-- * -->
+<!-- * Users who don't want the bold output can choose to adjust the -->
+<!-- * man.font.funcprototype parameter on their own. So even if you -->
+<!-- * don't personally like the way it looks, please don't change the -->
+<!-- * default to be non-bold - because it's a convention that's -->
+<!-- * followed is the vast majority of existing man pages that document -->
+<!-- * functions, and we need to follow it by default, like it or no. -->
+<!-- * ***************************************************************** -->
+
+<xsl:template match="funcprototype">
+ <xsl:variable name="man-funcprototype-style">
+ <xsl:call-template name="pi.dbman_funcsynopsis-style">
+ <xsl:with-param name="node" select="ancestor::funcsynopsis/descendant-or-self::*"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:variable name="style">
+ <xsl:choose>
+ <xsl:when test="not($man-funcprototype-style = '')">
+ <xsl:value-of select="$man-funcprototype-style"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$man.funcsynopsis.style"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:variable name="funcprototype.string.value">
+ <xsl:value-of select="funcdef"/>
+ </xsl:variable>
+ <xsl:variable name="funcprototype">
+ <xsl:apply-templates select="funcdef"/>
+ </xsl:variable>
+ <xsl:call-template name="synopsis-block-start"/>
+ <xsl:text>.HP </xsl:text>
+ <xsl:text>\w'</xsl:text>
+ <xsl:variable name="funcdef">
+ <xsl:apply-templates select="funcdef"/>
+ </xsl:variable>
+ <xsl:call-template name="string.subst">
+ <xsl:with-param name="string" select="normalize-space($funcdef)"/>
+ <xsl:with-param name="target" select="' '"/>
+ <xsl:with-param name="replacement" select="'\ '"/>
+ </xsl:call-template>
+ <xsl:text>('u</xsl:text>
+ <xsl:text>&#10;</xsl:text>
+ <xsl:text>.</xsl:text>
+ <xsl:value-of select="$man.font.funcprototype"/>
+ <xsl:text> </xsl:text>
+ <!-- * The following quotation mark (and the one further below) are -->
+ <!-- * needed to properly delimit the parts of the Funcprototype that -->
+ <!-- * should be rendered in the prevailing font (either Bold or Roman) -->
+ <!-- * from Parameter output that needs to be alternately rendered in -->
+ <!-- * italic. -->
+ <xsl:text>"</xsl:text>
+ <xsl:value-of select="normalize-space($funcprototype)"/>
+ <xsl:text>(</xsl:text>
+ <xsl:choose>
+ <xsl:when test="not($style = 'ansi')">
+ <xsl:apply-templates select="*[local-name() != 'funcdef']" mode="kr"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="*[local-name() != 'funcdef']" mode="ansi"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:text>"</xsl:text>
+ <xsl:text>&#10;</xsl:text>
+ <xsl:if test="paramdef and not($style = 'ansi')">
+ <!-- * if we have any paramdef instances in this funcprototype and -->
+ <!-- * the user has chosen K&R style output (by specifying some style -->
+ <!-- * value other than the default 'ansi'), then we need to generate -->
+ <!-- * the separate list of param definitions for this funcprototype -->
+ <!-- * -->
+ <!-- * we put a blank line after the prototype and before the list, -->
+ <!-- * and we indent the list by whatever width $list-indent is set -->
+ <!-- * to (4 spaces by default) -->
+ <xsl:text>.sp&#10;</xsl:text>
+ <xsl:text>.RS</xsl:text>
+ <xsl:if test="not($list-indent = '')">
+ <xsl:text> </xsl:text>
+ <xsl:value-of select="$list-indent"/>
+ </xsl:if>
+ <xsl:text>&#10;</xsl:text>
+ <xsl:apply-templates select="paramdef" mode="kr-paramdef-list"/>
+ <xsl:text>.RE&#10;</xsl:text>
+ </xsl:if>
+ <xsl:call-template name="synopsis-block-end"/>
+</xsl:template>
+
+<xsl:template match="funcdef">
+ <xsl:apply-templates mode="prevent.line.breaking"/>
+</xsl:template>
+
+<xsl:template match="funcdef/function">
+ <xsl:apply-templates/>
+</xsl:template>
+
+<xsl:template match="void" mode="kr">
+ <xsl:text>);</xsl:text>
+</xsl:template>
+
+<xsl:template match="varargs" mode="kr">
+ <xsl:text>...);</xsl:text>
+</xsl:template>
+
+<xsl:template match="void" mode="ansi">
+ <xsl:text>void);</xsl:text>
+</xsl:template>
+
+<xsl:template match="varargs" mode="ansi">
+ <xsl:text>...);</xsl:text>
+</xsl:template>
+
+<xsl:template match="paramdef" mode="kr">
+ <!-- * in K&R-style output, the prototype just contains the parameter -->
+ <!-- * names - because the parameter definitions for each parameter -->
+ <!-- * (including the type information) are displayed in a separate -->
+ <!-- * list following the prototype; so in this mode (which is for the -->
+ <!-- * prototype, not the separate list), we first just want to grab -->
+ <!-- * the parameter for each paramdef -->
+ <xsl:variable name="contents">
+ <xsl:apply-templates select="parameter"/>
+ </xsl:variable>
+ <xsl:apply-templates mode="prevent.line.breaking" select="exsl:node-set($contents)"/>
+ <xsl:choose>
+ <xsl:when test="following-sibling::*">
+ <xsl:text>, </xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text>);</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="paramdef" mode="ansi">
+ <!-- * in ANSI-style output, the prototype contains the complete -->
+ <!-- * parameter definitions for each parameter (there is no separate -->
+ <!-- * list of parameter definitions like the one for K&R style -->
+ <xsl:apply-templates mode="prevent.line.breaking" select="."/>
+ <xsl:choose>
+ <xsl:when test="following-sibling::*">
+ <xsl:text>, </xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text>);</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="paramdef" mode="kr-paramdef-list">
+ <!-- * this mode is for generating the separate list of parameter -->
+ <!-- * definitions in K&R-style output -->
+ <xsl:text>.br&#10;</xsl:text>
+ <xsl:text>.</xsl:text>
+ <xsl:value-of select="$man.font.funcprototype"/>
+ <xsl:text> </xsl:text>
+ <!-- * The following quotation mark (and the one further below) are -->
+ <!-- * needed to properly delimit the parts of the Funcprototype that -->
+ <!-- * should be rendered in the prevailing font (either Bold or Roman) -->
+ <!-- * from Parameter output that needs to be alternately rendered in -->
+ <!-- * italic. -->
+ <xsl:text>"</xsl:text>
+ <xsl:variable name="contents">
+ <xsl:apply-templates/>
+ </xsl:variable>
+ <xsl:value-of select="normalize-space($contents)"/>
+ <xsl:text>;</xsl:text>
+ <xsl:text>"</xsl:text>
+ <xsl:text>&#10;</xsl:text>
+</xsl:template>
+
+<xsl:template match="paramdef/parameter">
+ <!-- * We use U+2591 here in place of a normal space, because if we -->
+ <!-- * were to just use a normal space, it would get replaced with a -->
+ <!-- * non-breaking space when we run the whole Paramdef through the -->
+ <!-- * prevent.line.breaking template. And as far as why we're -->
+ <!-- * inserting the space and quotation marks around each Parameter -->
+ <!-- * to begin with, the reason is that we need to because we are -->
+ <!-- * outputting Funcsynopsis in either the "BI" or "RI" font, and -->
+ <!-- * the space and quotation marks delimit the text as the -->
+ <!-- * "alternate" or "I" text that needs to be rendered in italic. -->
+ <xsl:text>"&#x2591;"</xsl:text>
+ <xsl:apply-templates/>
+ <xsl:text>"&#x2591;"</xsl:text>
+</xsl:template>
+
+<xsl:template match="funcparams">
+ <xsl:text>(</xsl:text>
+ <xsl:apply-templates/>
+ <xsl:text>)</xsl:text>
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/manpages/table.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/manpages/table.xsl
new file mode 100644
index 0000000..3d95051
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/manpages/table.xsl
@@ -0,0 +1,633 @@
+<?xml version="1.0"?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:exsl="http://exslt.org/common"
+ exclude-result-prefixes="exsl"
+ version='1.0'>
+
+ <!-- ********************************************************************
+ $Id: table.xsl 8400 2009-04-08 07:44:54Z bobstayton $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+ <!--
+ <xsl:import href="http://docbook.sourceforge.net/release/xsl/current/html/docbook.xsl"/>
+ <xsl:param name="tbl.font.title">B</xsl:param>
+ <xsl:param name="tbl.font.headings">B</xsl:param>
+ -->
+ <xsl:param name="tbl.running.header.from.thead" select="0"/>
+ <xsl:param name="tbl.column.separator.char">:</xsl:param>
+
+ <!-- ==================================================================== -->
+
+ <!-- * This stylesheet transforms DocBook and HTML table source into -->
+ <!-- * tbl(1) markup. -->
+ <!-- * -->
+ <!-- * For details on tbl(1) and its markup syntaxt, see M. E. Lesk,-->
+ <!-- * "Tbl - A Program to Format Tables": -->
+ <!-- * -->
+ <!-- * http://cm.bell-labs.com/7thEdMan/vol2/tbl -->
+ <!-- * http://cm.bell-labs.com/cm/cs/doc/76/tbl.ps.gz -->
+ <!-- * http://www.snake.net/software/troffcvt/tbl.html -->
+
+ <xsl:template match="table|informaltable" mode="to.tbl">
+ <!--* the "source" param is an optional param; it can be any -->
+ <!--* string you want to use that gives some indication of the -->
+ <!--* source context for a table; it gets passed down to the named -->
+ <!--* templates that do the actual table processing; this -->
+ <!--* stylesheet currently uses the "source" information for -->
+ <!--* logging purposes -->
+ <xsl:param name="source"/>
+ <xsl:param name="title">
+ <xsl:if test="local-name(.) = 'table'">
+ <xsl:apply-templates select="." mode="object.title.markup.textonly"/>
+ </xsl:if>
+ </xsl:param>
+ <!-- * ============================================================== -->
+ <!-- * Set global table parameters -->
+ <!-- * ============================================================== -->
+ <!-- * First, set a few parameters based on attributes specified in -->
+ <!-- * the table source. -->
+ <xsl:param name="allbox">
+ <xsl:if test="not(@frame = 'none') and not(@border = '0')">
+ <!-- * By default, put a box around table and between all cells, -->
+ <!-- * unless frame="none" or border="0" -->
+ <xsl:text>allbox </xsl:text>
+ </xsl:if>
+ </xsl:param>
+ <xsl:param name="center">
+ <!-- * If align="center", center the table. Otherwise, tbl(1) -->
+ <!-- * left-aligns it by default; note that there is no support -->
+ <!-- * in tbl(1) for specifying right alignment. -->
+ <xsl:if test="@align = 'center' or tgroup/@align = 'center'">
+ <xsl:text>center </xsl:text>
+ </xsl:if>
+ </xsl:param>
+ <xsl:param name="expand">
+ <!-- * If pgwide="1" or width="100%", then "expand" the table by -->
+ <!-- * making it "as wide as the current line length" (to quote -->
+ <!-- * the tbl(1) guide). -->
+ <xsl:if test="@pgwide = '1' or @width = '100%'">
+ <xsl:text>expand </xsl:text>
+ </xsl:if>
+ </xsl:param>
+
+ <!-- * ============================================================== -->
+ <!-- * Convert table to HTML -->
+ <!-- * ============================================================== -->
+ <!-- * Process the table by applying the HTML templates from the -->
+ <!-- * DocBook XSL stylesheets to the whole thing; because we don't -->
+ <!-- * override any of the <row>, <entry>, <tr>, <td>, etc. templates, -->
+ <!-- * the templates in the HTML stylesheets (which we import) are -->
+ <!-- * used to process those. -->
+ <xsl:param name="html-table-output">
+ <xsl:choose>
+ <xsl:when test=".//tr">
+ <!-- * If this table has a TR child, it means that it's an -->
+ <!-- * HTML table in the DocBook source, instead of a CALS -->
+ <!-- * table. So we just copy it as-is, while wrapping it -->
+ <!-- * in an element with same name as its original parent. -->
+ <xsl:for-each select="descendant-or-self::table|descendant-or-self::informaltable">
+ <xsl:element name="{local-name(..)}">
+ <table>
+ <xsl:copy-of select="*"/>
+ </table>
+ </xsl:element>
+ </xsl:for-each>
+ </xsl:when>
+ <xsl:otherwise>
+ <!-- * Otherwise, this is a CALS table in the DocBook source, -->
+ <!-- * so we need to apply the templates in the HTML -->
+ <!-- * stylesheets to transform it into HTML before we do -->
+ <!-- * any further processing of it. -->
+ <xsl:apply-templates/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:param>
+ <xsl:param name="contents" select="exsl:node-set($html-table-output)"/>
+
+ <!-- ==================================================================== -->
+ <!-- * Output the table -->
+ <!-- ==================================================================== -->
+ <!-- * -->
+ <!-- * This is the "driver" part of the code; it calls a series of named
+ * templates (further below) to generate the actual tbl(1) markup, -->
+ <!-- * including the optional "options line", required "format section", -->
+ <!-- * and then the actual contents of the table. -->
+ <!-- * -->
+ <!-- ==================================================================== -->
+
+ <xsl:for-each select="$contents//table">
+ <!-- * ============================================================== -->
+ <!-- * Output table title -->
+ <!-- * ============================================================== -->
+ <xsl:if test="$title != '' or parent::td">
+ <xsl:text>.sp&#10;</xsl:text>
+ <xsl:call-template name="pinch.together"/>
+ <xsl:text>.</xsl:text>
+ <xsl:value-of select="$tbl.font.title"/>
+ <xsl:text> </xsl:text>
+ <xsl:if test="parent::td">
+ <xsl:text>*[nested&#x2580;table]</xsl:text>
+ </xsl:if>
+ <xsl:value-of select="normalize-space($title)"/>
+ <xsl:text>&#10;</xsl:text>
+ </xsl:if>
+
+ <!-- * mark the start of the table -->
+ <!-- * "TS" = "table start" -->
+ <xsl:text>.TS</xsl:text>
+ <xsl:if test="thead and $tbl.running.header.from.thead">
+ <!-- * H = "has header" -->
+ <xsl:text> H</xsl:text>
+ </xsl:if>
+ <xsl:text>&#10;</xsl:text>
+
+ <!-- * ============================================================== -->
+ <!-- * Output "options line" -->
+ <!-- * ============================================================== -->
+ <xsl:variable name="options-line">
+ <xsl:value-of select="$allbox"/>
+ <xsl:value-of select="$center"/>
+ <xsl:value-of select="$expand"/>
+ <xsl:text>tab(</xsl:text>
+ <xsl:value-of select="$tbl.column.separator.char"/>
+ <xsl:text>)</xsl:text>
+ </xsl:variable>
+ <xsl:if test="normalize-space($options-line) != ''">
+ <xsl:value-of select="normalize-space($options-line)"/>
+ <xsl:text>;&#10;</xsl:text>
+ </xsl:if>
+
+ <!-- * ============================================================== -->
+ <!-- * Output table header rows -->
+ <!-- * ============================================================== -->
+ <xsl:if test="thead">
+ <xsl:call-template name="output.rows">
+ <xsl:with-param name="rows" select="thead/tr"/>
+ </xsl:call-template>
+ <xsl:text>&#10;</xsl:text>
+
+ <!-- * mark the end of table-header rows -->
+ <xsl:choose>
+ <xsl:when test="$tbl.running.header.from.thead">
+ <!-- * "TH" = "table header end" -->
+ <xsl:text>.TH&#10;</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <!-- * "T&" = "table continuation" and is meant just as a kind -->
+ <!-- * of convenience macro and is sorta equivalent to a "TE" -->
+ <!-- * (table end) followed immediately by a "TS" (table start); -->
+ <!-- * in this case, it marks the end of a table "subsection" -->
+ <!-- * with header rows, and the start of a subsection with body -->
+ <!-- * rows. It's necessary to output it here because the "TH" -->
+ <!-- * macro is not being output, so there's otherwise no way -->
+ <!-- * for tbl(1) to know we have the table "sectioned". -->
+ <xsl:text>.T&amp;&#10;</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:if>
+
+ <!-- * ============================================================== -->
+ <!-- * Output table body rows -->
+ <!-- * ============================================================== -->
+ <!-- * First create node set with all non-thead rows (tbody+tfoot), -->
+ <!-- * but reordered with the tfoot rows at the end of the node set -->
+ <xsl:variable name="rows-set">
+ <xsl:copy-of select="tbody/tr|tr"/>
+ <xsl:copy-of select="tfoot/tr"/>
+ </xsl:variable>
+ <xsl:call-template name="output.rows">
+ <xsl:with-param name="source" select="$source"/>
+ <xsl:with-param name="rows" select="exsl:node-set($rows-set)"/>
+ </xsl:call-template>
+
+ <!-- * mark the end of the table -->
+ <xsl:text>&#10;</xsl:text>
+ <!-- * .TE = "Table End" -->
+ <xsl:text>.TE&#10;</xsl:text>
+ <!-- * put a blank line of space below the table -->
+ <xsl:text>.sp 1&#10;</xsl:text>
+ </xsl:for-each>
+ </xsl:template>
+
+ <!-- ==================================================================== -->
+ <!-- * named templates -->
+ <!-- ==================================================================== -->
+ <!-- * -->
+ <!-- * All of the following are named templates that get called directly -->
+ <!-- * or indirectly by the main "driver" part of the code (above) -->
+ <!-- * -->
+ <!-- ==================================================================== -->
+
+ <xsl:template name="output.rows">
+ <xsl:param name="source"/>
+ <xsl:param name="rows"/>
+ <!-- * ============================================================== -->
+ <!-- * Flatten row set into simple list of cells -->
+ <!-- * ============================================================== -->
+ <!-- * Now we flatten the structure further into just a set of -->
+ <!-- * cells without the row parents. This basically creates a -->
+ <!-- * copy of the entire contents of the original table, but -->
+ <!-- * restructured in such a way that we can more easily generate -->
+ <!-- * the corresponding tbl(1) markup we need to output. -->
+ <xsl:variable name="cells-list">
+ <xsl:call-template name="build.cell.list">
+ <xsl:with-param name="source" select="$source"/>
+ <xsl:with-param name="rows" select="$rows"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:variable name="cells" select="exsl:node-set($cells-list)"/>
+
+ <!-- * Output the table "format section", which tells tbl(1) how to -->
+ <!-- * format each row and column -->
+ <xsl:call-template name="create.table.format">
+ <xsl:with-param name="cells" select="$cells"/>
+ </xsl:call-template>
+
+ <!--* Output the formatted contents of each cell. -->
+ <xsl:for-each select="$cells/cell">
+ <xsl:call-template name="output.cell"/>
+ </xsl:for-each>
+ </xsl:template>
+
+ <!-- * ============================================================== -->
+ <!-- * Output the tbl(1)-formatted contents of each cell. -->
+ <!-- * ============================================================== -->
+ <xsl:template name="output.cell">
+ <xsl:choose>
+ <xsl:when test="preceding-sibling::cell[1]/@row != @row or
+ not(preceding-sibling::cell)">
+ <!-- * If the value of the "row" attribute on this cell is -->
+ <!-- * different from the value of that on the previous cell, it -->
+ <!-- * means we have a new row. So output a line break (as long -->
+ <!-- * as this isn't the first cell in the table) -->
+ <xsl:text>&#10;</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <!-- * Otherwise we are not at the start of a new row, so we -->
+ <!-- * output a tab character to delimit the contents of this -->
+ <!-- * cell from the contents of the next one. -->
+ <xsl:value-of select="$tbl.column.separator.char"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:choose>
+ <xsl:when test="@type = '^'">
+ <!-- * If this is a dummy cell resulting from the presence of -->
+ <!-- * rowpan attribute in the source, it has no contents, so -->
+ <!-- * we need to handle it differently. -->
+ <xsl:if test="@colspan and @colspan > 1">
+ <!-- * If there is a colspan attribute on this dummy row, then -->
+ <!-- * we need to output a tab character for each column that -->
+ <!-- * it spans. -->
+ <xsl:call-template name="copy-string">
+ <xsl:with-param name="string" select="$tbl.column.separator.char"/>
+ <xsl:with-param name="count">
+ <xsl:value-of select="@colspan - 1"/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:when>
+ <xsl:otherwise>
+ <!-- * Otherwise, we have a "real" cell (not a dummy one) with -->
+ <!-- * contents that we need to output, -->
+ <!-- * -->
+ <!-- * The "T{" and "T}" stuff are delimiters to tell tbl(1) that -->
+ <!-- * the delimited contents are "text blocks" that roff -->
+ <!-- * needs to process -->
+ <xsl:text>T{&#10;</xsl:text>
+ <xsl:copy-of select="."/>
+ <xsl:text>&#10;T}</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+ <!-- * ============================================================== -->
+ <!-- * Build a restructured "cell list" copy of the entire table -->
+ <!-- * ============================================================== -->
+ <xsl:template name="build.cell.list">
+ <xsl:param name="source"/>
+ <xsl:param name="rows"/>
+ <xsl:param name="cell-data-unsorted">
+ <!-- * This param collects all the "real" cells from the table, -->
+ <!-- * along with "dummy" rows that we generate for keeping -->
+ <!-- * track of Rowspan instances. -->
+ <xsl:apply-templates select="$rows" mode="cell.list">
+ <xsl:with-param name="source" select="$source"/>
+ </xsl:apply-templates>
+ </xsl:param>
+ <xsl:param name="cell-data-sorted">
+ <!-- * Sort the cells so that the dummy cells get put where we -->
+ <!-- * need them in the structure. Note that we need to specify -->
+ <!-- * data-type="number" here because the default sorting method -->
+ <!-- * for xsl:sort is "text" (alphabetical). -->
+ <xsl:for-each select="exsl:node-set($cell-data-unsorted)/cell">
+ <xsl:sort select="@row" data-type="number"/>
+ <xsl:sort select="@slot" data-type="number"/>
+ <xsl:copy-of select="."/>
+ </xsl:for-each>
+ </xsl:param>
+ <!-- * Return the sorted cell list -->
+ <xsl:copy-of select="$cell-data-sorted"/>
+ </xsl:template>
+
+ <xsl:template match="tr" mode="cell.list">
+ <xsl:param name="source"/>
+ <xsl:variable name="row">
+ <xsl:value-of select="count(preceding-sibling::tr) + 1"/>
+ </xsl:variable>
+ <xsl:for-each select="td|th">
+ <xsl:call-template name="cell">
+ <xsl:with-param name="source" select="$source"/>
+ <xsl:with-param name="row" select="$row"/>
+ <!-- * pass on the element name so we can select the appropriate -->
+ <!-- * roff font for styling the cell contents -->
+ <xsl:with-param name="class" select="name(.)"/>
+ </xsl:call-template>
+ </xsl:for-each>
+ </xsl:template>
+
+ <xsl:template name="cell">
+ <xsl:param name="source"/>
+ <xsl:param name="row"/>
+ <xsl:param name="class"/>
+ <xsl:param name="slot">
+ <!-- * The "slot" is the horizontal position of this cell (usually -->
+ <!-- * just the same as its column, but not so when it is preceded -->
+ <!-- * by cells that have colspans or cells in preceding rows that -->
+ <!-- * that have rowspans). -->
+ <xsl:value-of select="position()"/>
+ </xsl:param>
+ <!-- * For each real TD cell, create a Cell instance; contents will -->
+ <!-- * be the roff-formatted contents of its original table cell. -->
+ <cell type=""
+ row="{$row}"
+ slot="{$slot}"
+ class="{$class}"
+ colspan="{@colspan}"
+ align="{@align}"
+ valign="{@valign}"
+ >
+ <xsl:choose>
+ <xsl:when test=".//tr">
+ <xsl:call-template name="log.message">
+ <xsl:with-param name="level">Warn</xsl:with-param>
+ <xsl:with-param name="source" select="$source"/>
+ <xsl:with-param name="context-desc">tbl convert</xsl:with-param>
+ <xsl:with-param name="message">
+ <xsl:text>Extracted a nested table</xsl:text>
+ </xsl:with-param>
+ </xsl:call-template>
+ <xsl:text>[\fInested&#x2580;table\fR]*&#10;</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <!-- * Apply templates to the child contents of this cell, to -->
+ <!-- * transform them into marked-up roff. -->
+ <xsl:variable name="contents">
+ <xsl:apply-templates/>
+ </xsl:variable>
+ <!-- * We now have the contents in roff (plain-text) form, -->
+ <!-- * but we may also still have unnecessary whitespace at -->
+ <!-- * the beginning and/or end of it, so trim it off. -->
+ <xsl:call-template name="trim.text">
+ <xsl:with-param name="contents" select="$contents"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </cell>
+
+ <!-- * For each instance of a rowspan attribute found, we create N -->
+ <!-- * dummy cells, where N is equal to the value of the rowspan. -->
+ <xsl:if test="@rowspan and @rowspan > 0">
+ <!-- * If this cell is preceded in the same row by cells that -->
+ <!-- * have colspan attributes, then we need to calculate the -->
+ <!-- * "offset" caused by those colspan instances; the formula -->
+ <!-- * is to (1) check for all the preceding cells that have -->
+ <!-- * colspan attributes that are not empty and which have a -->
+ <!-- * value greater than 1, then (2) take the sum of the values -->
+ <!-- * of all those colspan attributes, and subtract from that -->
+ <!-- * the number of such colspan instances found. -->
+ <xsl:variable name="colspan-offset">
+ <xsl:value-of
+ select="sum(preceding-sibling::td[@colspan != ''
+ and @colspan > 1]/@colspan) -
+ count(preceding-sibling::td[@colspan != ''
+ and @colspan > 1]/@colspan)"/>
+ </xsl:variable>
+ <xsl:call-template name="create.dummy.cells">
+ <xsl:with-param name="row" select="$row + 1"/>
+ <!-- * The slot value on each dummy cell must be offset by the -->
+ <!-- * value of $colspan-offset to adjust for preceding colpans -->
+ <xsl:with-param name="slot" select="$slot + $colspan-offset"/>
+ <xsl:with-param name="colspan" select="@colspan"/>
+ <xsl:with-param name="rowspan" select="@rowspan"/>
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:template>
+
+ <xsl:template name="create.dummy.cells">
+ <xsl:param name="row"/>
+ <xsl:param name="slot"/>
+ <xsl:param name="colspan"/>
+ <xsl:param name="rowspan"/>
+ <xsl:choose>
+ <xsl:when test="$rowspan > 1">
+ <!-- * Tail recurse until we have no more rowspans, creating -->
+ <!-- * an empty dummy cell each time. The type value, '^' -->
+ <!-- * is the marker that tbl(1) uses to indicate a -->
+ <!-- * "vertically spanned heading". -->
+ <cell row="{$row}" slot="{$slot}" type="^" colspan="{@colspan}"/>
+ <xsl:call-template name="create.dummy.cells">
+ <xsl:with-param name="row" select="$row + 1"/>
+ <xsl:with-param name="slot" select="$slot"/>
+ <xsl:with-param name="colspan" select="$colspan"/>
+ <xsl:with-param name="rowspan" select="$rowspan - 1"/>
+ </xsl:call-template>
+ </xsl:when>
+ </xsl:choose>
+ </xsl:template>
+
+ <!-- * ============================================================== -->
+ <!-- * Build the "format section" for the table -->
+ <!-- * ============================================================== -->
+ <!-- * Description from the tbl(1) guide: -->
+ <!-- * -->
+ <!-- * "The format section of the table specifies the layout of the -->
+ <!-- * columns. Each line in this section corresponds to one line of -->
+ <!-- * the table... and each line contains a key-letter for each -->
+ <!-- * column of the table." -->
+ <xsl:template name="create.table.format">
+ <xsl:param name="cells"/>
+ <xsl:apply-templates mode="table.format" select="$cells"/>
+ <!-- * last line of table format section must end with a dot -->
+ <xsl:text>.</xsl:text>
+ </xsl:template>
+
+ <xsl:template match="cell" mode="table.format">
+ <xsl:choose>
+ <xsl:when test="preceding-sibling::cell[1]/@row != @row">
+ <!-- * If the value of the row attribute on this cell is -->
+ <!-- * different from the value of that on the previous cell, it -->
+ <!-- * means we have a new row. So output a line break. -->
+ <xsl:text>&#xa;</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <!-- * If this isn't the first cell, output a space before it to -->
+ <!-- * separate it from the preceding key letter. -->
+ <xsl:if test="position() != 1">
+ <xsl:text> </xsl:text>
+ </xsl:if>
+ </xsl:otherwise>
+ </xsl:choose>
+ <!-- * Select an appropriate "alignment" key letter based on this -->
+ <!-- * cell's attributes. -->
+ <xsl:choose>
+ <xsl:when test="@type = '^'">
+ <xsl:text>^</xsl:text>
+ </xsl:when>
+ <xsl:when test="@align = 'center'">
+ <xsl:text>c</xsl:text>
+ </xsl:when>
+ <xsl:when test="@align = 'right'">
+ <xsl:text>r</xsl:text>
+ </xsl:when>
+ <xsl:when test="@align = 'char'">
+ <xsl:text>n</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <!-- * Default to left alignment. -->
+ <xsl:text>l</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ <!-- * By default, tbl(1) vertically centers cell contents within -->
+ <!-- * their cells; the "t" key latter tells it to top-align the -->
+ <!-- * contents instead. Note that tbl(1) has no options for -->
+ <!-- * bottom or baseline alignment. -->
+ <xsl:if test="@valign = 'top'">
+ <xsl:text>t</xsl:text>
+ </xsl:if>
+ <xsl:if test="@class = 'th'">
+ <!-- * If this is a heading row, generate a font indicator (B or I), -->
+ <!-- * or if the value of $tbl.font.headings is empty, nothing. -->
+ <xsl:value-of select="$tbl.font.headings"/>
+ </xsl:if>
+ <!-- * We only need to deal with colspans whose value is greater -->
+ <!-- * than one (a colspan="1" is the same as having no colspan -->
+ <!-- * attribute at all). -->
+ <xsl:if test="@colspan > 1">
+ <xsl:call-template name="process.colspan">
+ <xsl:with-param name="colspan" select="@colspan - 1"/>
+ <xsl:with-param name="type" select="@type"/>
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:template>
+
+ <xsl:template name="process.colspan">
+ <xsl:param name="colspan"/>
+ <xsl:param name="type"/>
+ <!-- * Output a space to separate this key letter from preceding one. -->
+ <xsl:text> </xsl:text>
+ <xsl:choose>
+ <xsl:when test="$type = '^'">
+ <!-- * A '^' ("vertically spanned heading" marker) indicates -->
+ <!-- * that the "parent" of this spanned cell is a dummy cell; -->
+ <!-- * in this case, we need to generate a '^' instead of the -->
+ <!-- * normal 's'. -->
+ <xsl:text>^</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <!-- * s = 'spanned heading' -->
+ <xsl:text>s</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:if test="$colspan > 1">
+ <!-- * Tail recurse until we have no more colspans, outputting -->
+ <!-- * another marker each time. -->
+ <xsl:call-template name="process.colspan">
+ <xsl:with-param name="colspan" select="$colspan - 1"/>
+ <xsl:with-param name="type" select="$type"/>
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:template>
+
+ <!-- * ============================================================== -->
+ <!-- * colgroup and col -->
+ <!-- * ============================================================== -->
+ <!-- * We currently don't do anything with colgroup. Not sure if it -->
+ <!-- * is widely used enough to bother adding support for it -->
+ <xsl:template match="colgroup"/>
+ <xsl:template match="col"/>
+
+ <!-- * ============================================================== -->
+ <!-- * table footnotes -->
+ <!-- * ============================================================== -->
+ <xsl:template match="footnote" mode="table.footnote.mode">
+ <xsl:variable name="footnotes" select=".//footnote"/>
+ <xsl:variable name="table.footnotes"
+ select=".//tgroup//footnote"/>
+ <xsl:value-of select="$man.table.footnotes.divider"/>
+ <xsl:text>&#10;</xsl:text>
+ <xsl:text>.br&#10;</xsl:text>
+ <xsl:apply-templates select="*[1]" mode="footnote.body.number"/>
+ <xsl:apply-templates select="*[position() &gt; 1]"/>
+ </xsl:template>
+
+ <!-- * The following template for footnote.body.number mode was just -->
+ <!-- * lifted from the HTML stylesheets with some minor adjustments -->
+ <xsl:template match="*" mode="footnote.body.number">
+ <xsl:variable name="name">
+ <xsl:text>ftn.</xsl:text>
+ <xsl:call-template name="object.id">
+ <xsl:with-param name="object" select="ancestor::footnote"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:variable name="href">
+ <xsl:text>#</xsl:text>
+ <xsl:call-template name="object.id">
+ <xsl:with-param name="object" select="ancestor::footnote"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:variable name="footnote.mark">
+ <xsl:text>[</xsl:text>
+ <xsl:apply-templates select="ancestor::footnote"
+ mode="footnote.number"/>
+ <xsl:text>]&#10;</xsl:text>
+ </xsl:variable>
+ <xsl:variable name="html">
+ <xsl:apply-templates select="."/>
+ </xsl:variable>
+ <xsl:choose>
+ <xsl:when test="$exsl.node.set.available != 0">
+ <xsl:variable name="html-nodes" select="exsl:node-set($html)"/>
+ <xsl:choose>
+ <xsl:when test="$html-nodes//p">
+ <xsl:apply-templates select="$html-nodes" mode="insert.html.p">
+ <xsl:with-param name="mark" select="$footnote.mark"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="$html-nodes" mode="insert.html.text">
+ <xsl:with-param name="mark" select="$footnote.mark"/>
+ </xsl:apply-templates>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:copy-of select="$html"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+ <!-- * The HTML stylesheets output <sup><a>...</a></sup> around -->
+ <!-- * footnote markers in tables -->
+ <xsl:template match="th/sup">
+ <xsl:apply-templates/>
+ </xsl:template>
+ <xsl:template match="a">
+ <xsl:apply-templates/>
+ </xsl:template>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/manpages/utility.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/manpages/utility.xsl
new file mode 100644
index 0000000..26a7513
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/manpages/utility.xsl
@@ -0,0 +1,555 @@
+<?xml version='1.0'?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:exsl="http://exslt.org/common"
+ xmlns:dyn="http://exslt.org/dynamic"
+ xmlns:saxon="http://icl.com/saxon"
+ exclude-result-prefixes="exsl dyn saxon"
+ version='1.0'>
+
+<!-- ********************************************************************
+ $Id: utility.xsl 8236 2009-02-09 17:44:52Z xmldoc $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<!-- ==================================================================== -->
+
+<!-- * This file contains "utility" templates that are called multiple -->
+<!-- * times per each Refentry. -->
+
+<!-- ==================================================================== -->
+
+ <!-- * NOTE TO DEVELOPERS: For ease of maintenance, the current -->
+ <!-- * manpages stylesheets use the "bold" and "italic" named -->
+ <!-- * templates for anything and everything that needs to get -->
+ <!-- * boldfaced or italicized. -->
+ <!-- * -->
+ <!-- * So if you add anything that needs bold or italic character -->
+ <!-- * formatting, try to apply these templates to it rather than -->
+ <!-- * writing separate code to format it. This can be a little odd if -->
+ <!-- * the content you want to format is not element content; in those -->
+ <!-- * cases, you need to turn it into element content before applying -->
+ <!-- * the template; see examples of this in the existing code. -->
+
+ <xsl:template name="bold">
+ <xsl:param name="node"/>
+ <xsl:param name="context"/>
+ <xsl:choose>
+ <xsl:when test="not($context[ancestor::title])">
+ <xsl:for-each select="$node/node()">
+ <xsl:text>\fB</xsl:text>
+ <xsl:apply-templates select="."/>
+ <xsl:text>\fR</xsl:text>
+ </xsl:for-each>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="$node/node()"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+ <xsl:template name="italic">
+ <xsl:param name="node"/>
+ <xsl:param name="context"/>
+ <xsl:for-each select="$node/node()">
+ <xsl:text>\fI</xsl:text>
+ <xsl:apply-templates select="."/>
+ <xsl:text>\fR</xsl:text>
+ </xsl:for-each>
+ </xsl:template>
+
+ <xsl:template name="inline.monoseq">
+ <xsl:call-template name="code-inline-start"/>
+ <xsl:apply-templates/>
+ <xsl:call-template name="code-inline-end"/>
+ </xsl:template>
+
+ <xsl:template name="code-inline-start">
+ <xsl:if test="not($man.output.better.ps.enabled = 0)">
+ <xsl:text>\FC</xsl:text>
+ </xsl:if>
+ </xsl:template>
+
+ <xsl:template name="code-inline-end">
+ <xsl:if test="not($man.output.better.ps.enabled = 0)">
+ <xsl:text>\F[]</xsl:text>
+ </xsl:if>
+ </xsl:template>
+
+ <!-- ================================================================== -->
+
+ <xsl:template name="verbatim-block-start">
+ <xsl:if test="not($man.output.better.ps.enabled = 0)">
+ <xsl:text>.fam C&#10;</xsl:text>
+ <xsl:text>.ps -1&#10;</xsl:text>
+ </xsl:if>
+ </xsl:template>
+
+ <xsl:template name="verbatim-block-end">
+ <xsl:if test="not($man.output.better.ps.enabled = 0)">
+ <xsl:text>.fam&#10;</xsl:text>
+ <xsl:text>.ps +1&#10;</xsl:text>
+ </xsl:if>
+ </xsl:template>
+
+ <xsl:template name="synopsis-block-start">
+ <xsl:if test="not($man.output.better.ps.enabled = 0)">
+ <xsl:text>.fam C&#10;</xsl:text>
+ </xsl:if>
+ </xsl:template>
+
+ <xsl:template name="synopsis-block-end">
+ <xsl:if test="not($man.output.better.ps.enabled = 0)">
+ <xsl:text>.fam&#10;</xsl:text>
+ </xsl:if>
+ </xsl:template>
+
+ <!-- ================================================================== -->
+
+ <!-- * NOTE TO DEVELOPERS: For ease of maintenance, the current -->
+ <!-- * manpages stylesheets use the mode="prevent.line.breaking" -->
+ <!-- * templates for anything and everything that needs to have -->
+ <!-- * embedded spaces turned into no-break spaces in output - in -->
+ <!-- * order to prevent that output from getting broken across lines -->
+ <!-- * -->
+ <!-- * So if you add anything that whose output, try to apply this -->
+ <!-- * template to it rather than writing separate code to format -->
+ <!-- * it. This can be a little odd if the content you want to -->
+ <!-- * format is not element content; in those cases, you need to -->
+ <!-- * turn it into element content before applying the template; -->
+ <!-- * see examples of this in the existing code. -->
+ <!-- * -->
+ <!-- * This template is currently called by the funcdef and paramdef -->
+ <!-- * and group/arg templates. -->
+ <xsl:template mode="prevent.line.breaking" match="*">
+ <xsl:variable name="rcontent">
+ <xsl:apply-templates/>
+ </xsl:variable>
+ <xsl:variable name="content">
+ <xsl:value-of select="normalize-space($rcontent)"/>
+ </xsl:variable>
+ <xsl:call-template name="string.subst">
+ <xsl:with-param name="string" select="$content"/>
+ <xsl:with-param name="target" select="' '"/>
+ <!-- * U+2580 is a "UPPER HALF BLOCK"; we use it here because -->
+ <!-- * if we were to just use a normal space, it would get -->
+ <!-- * replaced when normalization is done. We replace it -->
+ <!-- * later with the groff markup for non-breaking space. -->
+ <xsl:with-param name="replacement" select="'&#x2580;'"/>
+ </xsl:call-template>
+ </xsl:template>
+
+ <!-- ================================================================== -->
+
+ <xsl:template name="suppress.hyphenation">
+ <!-- * we need to suppress hyphenation inline only if hyphenation is -->
+ <!-- * actually on, and even then only outside of Cmdsynopsis and -->
+ <!-- * Funcsynopsis, where it is already always turned off -->
+ <xsl:if test="$man.hyphenate != 0 and
+ not(ancestor::cmdsynopsis) and
+ not(ancestor::funcsynopsis)">
+ <xsl:text>\%</xsl:text>
+ </xsl:if>
+ </xsl:template>
+
+ <!-- ================================================================== -->
+
+ <!-- * The replace.dots.and.dashes template is used to cause real -->
+ <!-- * dots and dashes to be output in the top comment (instead of -->
+ <!-- * escaped ones as in the source for the text displayed in the -->
+ <!-- * body of the page) -->
+ <xsl:template name="replace.dots.and.dashes">
+ <xsl:param name="content">
+ <xsl:apply-templates/>
+ </xsl:param>
+ <xsl:variable name="dot-content">
+ <xsl:call-template name="string.subst">
+ <xsl:with-param name="string" select="$content"/>
+ <xsl:with-param name="target" select="'\&amp;.'"/>
+ <xsl:with-param name="replacement" select="'.'"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:call-template name="string.subst">
+ <xsl:with-param name="string" select="$dot-content"/>
+ <xsl:with-param name="target" select="'\-'"/>
+ <xsl:with-param name="replacement" select="'-'"/>
+ </xsl:call-template>
+ </xsl:template>
+
+ <!-- ================================================================== -->
+
+ <!-- * The nested-section-title template is called for refsect3, and any -->
+ <!-- * refsection nested more than 2 levels deep. -->
+ <xsl:template name="nested-section-title">
+ <xsl:text>.sp&#10;</xsl:text>
+ <xsl:call-template name="pinch.together"/>
+ <xsl:text>.ps +1&#10;</xsl:text>
+ <xsl:call-template name="make.bold.title"/>
+ </xsl:template>
+
+ <xsl:template name="pinch.together">
+ <!-- * arcane roff code to suppress line spacing after headings -->
+ <xsl:text>.it 1 an-trap&#10;</xsl:text>
+ <xsl:text>.nr an-no-space-flag 1&#10;</xsl:text>
+ <xsl:text>.nr an-break-flag 1&#10;</xsl:text>
+ <xsl:text>.br&#10;</xsl:text>
+ </xsl:template>
+
+ <xsl:template name="make.bold.title">
+ <!-- * make title wrapper so that we can use "bold" template to apply -->
+ <!-- * character formatting to it -->
+ <xsl:variable name="title.wrapper">
+ <xsl:choose>
+ <xsl:when test="title">
+ <xsl:value-of select="normalize-space(title[1])"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="." mode="object.title.markup.textonly"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:call-template name="mark.subheading"/>
+ <xsl:call-template name="bold">
+ <xsl:with-param name="node" select="exsl:node-set($title.wrapper)"/>
+ <xsl:with-param name="context" select="."/>
+ </xsl:call-template>
+ <xsl:text>&#10;</xsl:text>
+ <xsl:call-template name="mark.subheading"/>
+ </xsl:template>
+
+ <!-- ================================================================== -->
+
+ <!-- * The mixed-block template jumps through a few hoops to deal with -->
+ <!-- * mixed-content blocks, so that we don't end up munging verbatim -->
+ <!-- * environments or lists and so that we don't gobble up whitespace -->
+ <!-- * when we shouldn't -->
+ <xsl:template name="mixed-block">
+ <xsl:for-each select="node()">
+ <xsl:choose>
+ <!-- * Check to see if this node is a verbatim environment. -->
+ <!-- * If so, put a line of space before it. -->
+ <!-- * -->
+ <!-- * Yes, address and synopsis are vertabim environments. -->
+ <!-- * -->
+ <!-- * The code here previously also treated informaltable as a -->
+ <!-- * verbatim, presumably to support some kludge; I removed it -->
+ <xsl:when test="self::address|self::literallayout|self::programlisting|
+ self::screen|self::synopsis">
+ <xsl:text>&#10;</xsl:text>
+ <xsl:text>.sp&#10;</xsl:text>
+ <xsl:call-template name="mark.up.block.start"/>
+ <xsl:apply-templates select="."/>
+ </xsl:when>
+ <!-- * Check to see if this node is a list; if it is, we don't -->
+ <!-- * want to normalize-space(), so we just apply-templates. -->
+ <!-- * Do same for all admonitions -->
+ <xsl:when test="(self::itemizedlist|self::orderedlist|
+ self::variablelist|self::glosslist|
+ self::simplelist[@type !='inline']|
+ self::segmentedlist|
+ self::caution|self::important|
+ self::note|self::tip|self::warning|
+ self::table|self::informaltable)">
+ <xsl:call-template name="mark.up.block.start"/>
+ <xsl:apply-templates select="."/>
+ </xsl:when>
+ <xsl:when test="self::text()">
+ <!-- * Check to see if this is a text node. -->
+ <!-- * -->
+ <!-- * If so, replace all whitespace at the beginning or end of it -->
+ <!-- * with a single linebreak. -->
+ <!-- * -->
+ <xsl:variable name="content">
+ <xsl:apply-templates select="."/>
+ </xsl:variable>
+ <xsl:if
+ test="starts-with(translate(.,'&#9;&#10;&#13; ',' '), ' ')
+ and preceding-sibling::node()[1][name(.)!='']
+ and normalize-space($content) != ''
+ and not(
+ preceding-sibling::*[1][
+ self::caution or
+ self::important or
+ self::note or
+ self::tip or
+ self::warning or
+ self::variablelist or
+ self::glosslist or
+ self::itemizedlist or
+ self::orderedlist or
+ self::segmentedlist or
+ self::procedure or
+ self::address or
+ self::literallayout or
+ self::programlisting or
+ self::screen or
+ self::table or
+ self::informaltable
+ ]
+ )
+ ">
+ <xsl:text>&#10;</xsl:text>
+ </xsl:if>
+ <xsl:value-of select="normalize-space($content)"/>
+ <xsl:if
+ test="(translate(substring(., string-length(.), 1),'&#9;&#10;&#13; ',' ') = ' '
+ and following-sibling::node()[1][name(.)!=''])
+ or following-sibling::node()[1][self::comment()]
+ or following-sibling::node()[1][self::processing-instruction()]
+ ">
+ <xsl:if test="normalize-space($content) != ''
+ or concat(normalize-space($content), ' ') = ' '">
+ <xsl:text>&#10;</xsl:text>
+ </xsl:if>
+ </xsl:if>
+ </xsl:when>
+ <xsl:otherwise>
+ <!-- * At this point, we know that this node is not a verbatim -->
+ <!-- * environment, list, admonition, or text node; so we can -->
+ <!-- * safely normalize-space() it. -->
+ <xsl:variable name="content">
+ <xsl:apply-templates select="."/>
+ </xsl:variable>
+ <xsl:value-of select="normalize-space($content)"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:for-each>
+ <xsl:call-template name="mark.up.block.end"/>
+ </xsl:template>
+
+ <!-- ================================================================== -->
+
+ <!-- * Footnote and annotation contents are displayed using a hanging -->
+ <!-- * indent out to $man.indent.width If a paragraph-level block -->
+ <!-- * element (verbatim, list, or admonition) is the first block -->
+ <!-- * element nested at its same level within the same footnote or -->
+ <!-- * annotation, then we push it over by the same indent width. -->
+ <!-- * -->
+ <!-- * We don't reset the indent for each following sibling, but -->
+ <!-- * instead do it after for-eaching over all block siblings at -->
+ <!-- * the same level. So the effect is that if there are any -->
+ <!-- * following-sibling blocks after the block that starts this -->
+ <!-- * indent, then they just retain the indent that was already set -->
+
+ <xsl:template name="mark.up.block.start">
+ <xsl:choose>
+ <xsl:when test="(ancestor::footnote
+ or ancestor::annotation)">
+ <xsl:if test="not(preceding-sibling::address|
+ preceding-sibling::literallayout|
+ preceding-sibling::programlisting|
+ preceding-sibling::screen|
+ preceding-sibling::synopsis|
+ preceding-sibling::itemizedlist|
+ preceding-sibling::orderedlist|
+ preceding-sibling::variablelist|
+ preceding-sibling::glosslist|
+ preceding-sibling::simplelist[@type !='inline']|
+ preceding-sibling::segmentedlist|
+ preceding-sibling::caution|
+ preceding-sibling::important|
+ preceding-sibling::note|
+ preceding-sibling::tip|
+ preceding-sibling::warning|
+ preceding-sibling::table|
+ preceding-sibling::informaltable
+ )">
+ <xsl:text>.RS</xsl:text>
+ <xsl:if test="not($list-indent = '')">
+ <xsl:text> </xsl:text>
+ <xsl:value-of select="$list-indent"/>
+ </xsl:if>
+ <xsl:text>&#10;</xsl:text>
+ </xsl:if>
+ </xsl:when>
+ </xsl:choose>
+ </xsl:template>
+
+ <!-- * Check to see if we were called from a block within a footnote or -->
+ <!-- * annotation; if so, and the block contains any nested block -->
+ <!-- * content, then we know the mark.up.block.end template was already -->
+ <!-- * called to generate a .RS macro to indent that nested block -->
+ <!-- * content; so we need to generate a .RE to set the margin back to -->
+ <!-- * where it was prior to the .RS call. -->
+ <xsl:template name="mark.up.block.end">
+ <xsl:if test="(ancestor::footnote
+ or ancestor::annotation)">
+ <xsl:if test="address|
+ literallayout|
+ programlisting|
+ screen|
+ synopsis|
+ itemizedlist|
+ orderedlist|
+ variablelist|
+ glosslist|
+ simplelist[@type !='inline']|
+ segmentedlist|
+ caution|
+ important|
+ note|
+ tip|
+ warning|
+ table|
+ informaltable">
+ <xsl:text>&#10;</xsl:text>
+ <xsl:text>.RE</xsl:text>
+ <xsl:text>&#10;</xsl:text>
+ </xsl:if>
+ </xsl:if>
+ </xsl:template>
+
+ <!-- ================================================================== -->
+
+ <!-- * The person.name template in the HTML stylesheets outputs extra -->
+ <!-- * spaces that we need to strip out for manpages output. This -->
+ <!-- * template calls person.name, then tries to do some smart -->
+ <!-- * normalization of the result tree fragment from that. -->
+ <xsl:template name="person.name.normalized">
+ <xsl:variable name="contents">
+ <xsl:call-template name="person.name"/>
+ </xsl:variable>
+ <!-- * We put the output of person.name into a node-set and then we -->
+ <!-- * check it node-by-node and strip out space only where needed. -->
+ <xsl:variable name="contents.tree" select="exsl:node-set($contents)"/>
+ <xsl:for-each select="$contents.tree/node()">
+ <xsl:choose>
+ <!-- * We don't want to monkey with single spaces or commas/periods -->
+ <!-- * followed by spaces, because those are bits of text that are -->
+ <!-- * actually generated by the person.name template itself (that -->
+ <!-- * is, they're not in the source). So, we preserve them. -->
+ <xsl:when test=". = ' ' or . = ', ' or . = '. '">
+ <xsl:value-of select="."/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="normalize-space(.)"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:for-each>
+ </xsl:template>
+
+ <!-- ================================================================== -->
+
+ <xsl:template name="make.adjusted.man.filename">
+ <xsl:param name="name"/>
+ <xsl:param name="lang"/>
+ <xsl:param name="name.with.lang">
+ <xsl:choose>
+ <xsl:when test="$lang != 'en'
+ and not($man.output.lang.in.name.enabled = 0)
+ and ($man.output.subdirs.enabled = 0 or
+ $man.output.in.separate.dir = 0)">
+ <!-- * $lang is not en (English) -->
+ <!-- * AND user has specified man.output.lang.in.name.enabled -->
+ <!-- * AND doesn't want output going into separate dirs, -->
+ <!-- * SO... we include the $lang value in the filename; e.g., -->
+ <!-- * foo.ja.1 -->
+ <xsl:value-of select="concat($name, '.', $lang)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <!-- * user either has man.output.lang.in.name.enabled unset -->
+ <!-- * or has set it but also has man.output.subdirs.enabled -->
+ <!-- * set (in which case the $lang value is used to add a -->
+ <!-- * $lang subdir in the pathname); in either case, we don't -->
+ <!-- * want to include the $lang in the filename -->
+ <xsl:value-of select="$name"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:param>
+ <xsl:param name="section"/>
+ <xsl:param name="dirname">
+ <xsl:if test="not($man.output.in.separate.dir = 0)">
+ <xsl:choose>
+ <xsl:when test="not($man.output.subdirs.enabled = 0)">
+ <xsl:variable name="lang.subdir">
+ <xsl:if test="not($man.output.lang.in.name.enabled = 0)">
+ <!-- * user has man.output.lang.in.name.enabled set, so -->
+ <!-- * we need to add a $lang subdir -->
+ <xsl:value-of select="concat($lang, '/')"/>
+ </xsl:if>
+ </xsl:variable>
+ <xsl:value-of
+ select="concat($man.output.base.dir, $lang.subdir,
+ 'man', normalize-space($section), '/')"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$man.output.base.dir"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:if>
+ </xsl:param>
+ <xsl:call-template name="string.subst">
+ <!-- * To create the man filename, replace any spaces in filename with -->
+ <!-- * underscores and then append a dot plus a section number. -->
+ <xsl:with-param name="string"
+ select="concat($dirname,
+ normalize-space($name.with.lang),
+ '.', normalize-space($section))"/>
+ <xsl:with-param name="target" select="' '"/>
+ <xsl:with-param name="replacement" select="'_'"/>
+ </xsl:call-template>
+ </xsl:template>
+
+ <!-- ================================================================== -->
+
+ <xsl:template name="make.subheading">
+ <xsl:param name="title"/>
+ <xsl:call-template name="mark.subheading"/>
+ <xsl:text>.SH</xsl:text>
+ <xsl:text> </xsl:text>
+ <xsl:text>"</xsl:text>
+ <xsl:choose>
+ <xsl:when test="not($man.output.better.ps.enabled = 0)">
+ <xsl:value-of select="$title"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="string.upper">
+ <xsl:with-param name="string" select="$title"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:text>"</xsl:text>
+ <xsl:text>&#10;</xsl:text>
+ <xsl:call-template name="mark.subheading"/>
+ </xsl:template>
+
+ <!-- * Put a horizontal rule or other divider around section titles -->
+ <!-- * in roff source (just to make things easier to read). -->
+ <xsl:template name="mark.subheading">
+ <xsl:if test="$man.subheading.divider.enabled != 0">
+ <xsl:text>.\" </xsl:text>
+ <xsl:value-of select="$man.subheading.divider"/>
+ <xsl:text>&#10;</xsl:text>
+ </xsl:if>
+ </xsl:template>
+
+ <!-- ================================================================== -->
+
+ <xsl:template name="roff-if-else-start">
+ <xsl:param name="condition">n</xsl:param>
+ <xsl:text>.ie </xsl:text>
+ <xsl:value-of select="$condition"/>
+ <xsl:text> \{\&#10;</xsl:text>
+ </xsl:template>
+
+ <xsl:template name="roff-if-start">
+ <xsl:param name="condition">n</xsl:param>
+ <xsl:text>.if </xsl:text>
+ <xsl:value-of select="$condition"/>
+ <xsl:text> \{\&#10;</xsl:text>
+ </xsl:template>
+
+ <xsl:template name="roff-else">
+ <xsl:text>.\}&#10;</xsl:text>
+ <xsl:text>.el \{\&#10;</xsl:text>
+ </xsl:template>
+
+ <xsl:template name="roff-if-end">
+ <xsl:text>.\}&#10;</xsl:text>
+ </xsl:template>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/abstract.notitle.enabled.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/abstract.notitle.enabled.xml
new file mode 100644
index 0000000..1771f72
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/abstract.notitle.enabled.xml
@@ -0,0 +1,22 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="abstract.notitle.enabled">
+<refmeta>
+<refentrytitle>abstract.notitle.enabled</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>abstract.notitle.enabled</refname>
+<refpurpose>Suppress display of abstract titles?</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+ <src:fragment xml:id="abstract.notitle.enabled.frag"><xsl:param name="abstract.notitle.enabled" select="0"/></src:fragment>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+<para>If non-zero, in output of the <tag>abstract</tag> element on titlepages,
+display of the abstract title is suppressed.</para>
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/abstract.properties.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/abstract.properties.xml
new file mode 100644
index 0000000..e802312
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/abstract.properties.xml
@@ -0,0 +1,32 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="abstract.properties">
+<refmeta>
+<refentrytitle>abstract.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>abstract.properties</refname>
+<refpurpose>Properties associated with the block surrounding an abstract</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="abstract.properties.frag">
+<xsl:attribute-set name="abstract.properties">
+ <xsl:attribute name="start-indent">0.0in</xsl:attribute>
+ <xsl:attribute name="end-indent">0.0in</xsl:attribute>
+</xsl:attribute-set>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Block styling properties for abstract.</para>
+
+<para>See also <parameter>abstract.title.properties</parameter>.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/abstract.title.properties.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/abstract.title.properties.xml
new file mode 100644
index 0000000..d01f70c
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/abstract.title.properties.xml
@@ -0,0 +1,39 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="abstract.title.properties">
+<refmeta>
+<refentrytitle>abstract.title.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>abstract.title.properties</refname>
+<refpurpose>Properties for abstract titles</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="abstract.title.properties.frag">
+<xsl:attribute-set name="abstract.title.properties">
+ <xsl:attribute name="font-family"><xsl:value-of select="$title.fontset"/></xsl:attribute>
+ <xsl:attribute name="font-weight">bold</xsl:attribute>
+ <xsl:attribute name="keep-with-next.within-column">always</xsl:attribute>
+ <xsl:attribute name="keep-with-next.within-column">always</xsl:attribute>
+ <xsl:attribute name="space-before.optimum"><xsl:value-of select="concat($body.font.master, 'pt')"/></xsl:attribute>
+ <xsl:attribute name="space-before.minimum"><xsl:value-of select="concat($body.font.master, 'pt * 0.8')"/></xsl:attribute>
+ <xsl:attribute name="space-before.maximum"><xsl:value-of select="concat($body.font.master, 'pt * 1.2')"/></xsl:attribute>
+ <xsl:attribute name="hyphenate">false</xsl:attribute>
+ <xsl:attribute name="text-align">center</xsl:attribute>
+</xsl:attribute-set>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The properties for abstract titles.</para>
+
+<para>See also <parameter>abstract.properties</parameter>.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/active.toc.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/active.toc.xml
new file mode 100644
index 0000000..f56aee1
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/active.toc.xml
@@ -0,0 +1,29 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="active.toc">
+<refmeta>
+<refentrytitle>active.toc</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>active.toc</refname>
+<refpurpose>Active ToCs?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="active.toc.frag">
+<xsl:param name="active.toc" select="0"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, JavaScript is used to keep the ToC and the current slide
+<quote>in sync</quote>. That is, each time the slide changes, the corresponding
+ToC entry will be underlined.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/ade.extensions.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/ade.extensions.xml
new file mode 100644
index 0000000..479591b
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/ade.extensions.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0"?>
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0"
+ xml:id="ade.extensions">
+ <refmeta>
+ <refentrytitle>ade.extensions</refentrytitle>
+ <refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+ </refmeta>
+ <refnamediv>
+ <refname>ade.extensions</refname>
+ <refpurpose>Enable Adobe Digitial Editions extensions for ePub rendering?</refpurpose>
+ </refnamediv>
+ <refsynopsisdiv>
+ <src:fragment xml:id="ade.extensions.frag">
+ <xsl:param name="ade.extensions" select="0"/>
+ </src:fragment>
+ </refsynopsisdiv>
+ <refsection>
+ <info>
+ <title>Description</title>
+ </info>
+ <para>If non-zero,
+<link xlink:href="http://www.adobe.com/products/digitaleditions/">Adobe Digital Editions</link>
+extensions will be used when rendering to ePub output. Adobe Digital Editions extensions consists
+rendering and layout extensions.</para>
+ <para>This parameter can also affect which graphics file formats are supported.</para>
+ </refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/admon.graphics.extension.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/admon.graphics.extension.xml
new file mode 100644
index 0000000..a7b47dd
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/admon.graphics.extension.xml
@@ -0,0 +1,27 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="admon.graphics.extension">
+<refmeta>
+<refentrytitle>admon.graphics.extension</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>admon.graphics.extension</refname>
+<refpurpose>Filename extension for admonition graphics</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="admon.graphics.extension.frag">
+<xsl:param name="admon.graphics.extension">.png</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Sets the filename extension to use on admonition graphics.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/admon.graphics.path.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/admon.graphics.path.xml
new file mode 100644
index 0000000..32b12b1
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/admon.graphics.path.xml
@@ -0,0 +1,27 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="admon.graphics.path">
+<refmeta>
+<refentrytitle>admon.graphics.path</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>admon.graphics.path</refname>
+<refpurpose>Path to admonition graphics</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="admon.graphics.path.frag"><xsl:param name="admon.graphics.path">images/</xsl:param></src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Sets the path to the directory containing the admonition graphics
+(caution.png, important.png etc). This location is normally relative
+to the output html directory. See <parameter>base.dir</parameter></para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/admon.graphics.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/admon.graphics.xml
new file mode 100644
index 0000000..f5e5ae4
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/admon.graphics.xml
@@ -0,0 +1,29 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="admon.graphics">
+<refmeta>
+<refentrytitle>admon.graphics</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>admon.graphics</refname>
+<refpurpose>Use graphics in admonitions?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="admon.graphics.frag">
+<xsl:param name="admon.graphics" select="0"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If true (non-zero), admonitions are presented in an alternate style that uses
+a graphic. Default graphics are provided in the distribution.
+</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/admon.style.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/admon.style.xml
new file mode 100644
index 0000000..5abe022
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/admon.style.xml
@@ -0,0 +1,31 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="admon.style">
+<refmeta>
+<refentrytitle>admon.style</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>admon.style</refname>
+<refpurpose>Specifies the CSS style attribute that should be added to
+admonitions.</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="admon.style.frag"><xsl:param name="admon.style">
+ <xsl:value-of select="concat('margin-', $direction.align.start,
+ ': 0.5in; margin-', $direction.align.end, ': 0.5in;')"/>
+</xsl:param></src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies the value of the CSS <tag class="attribute">style</tag>
+attribute that should be added to admonitions.
+</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/admon.textlabel.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/admon.textlabel.xml
new file mode 100644
index 0000000..ea1a53f
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/admon.textlabel.xml
@@ -0,0 +1,32 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="admon.textlabel">
+<refmeta>
+<refentrytitle>admon.textlabel</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>admon.textlabel</refname>
+<refpurpose>Use text label in admonitions?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="admon.textlabel.frag">
+<xsl:param name="admon.textlabel" select="1"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If true (non-zero), admonitions are presented with a generated
+text label such as Note or Warning in the appropriate language.
+If zero, such labels are turned off, but any title child
+of the admonition element are still output.
+The default value is 1.
+</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/admonition.properties.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/admonition.properties.xml
new file mode 100644
index 0000000..4dddd26
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/admonition.properties.xml
@@ -0,0 +1,25 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="admonition.properties">
+<refmeta>
+ <refentrytitle>admonition.properties</refentrytitle>
+ <refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>admonition.properties</refname>
+<refpurpose>To set the style for admonitions.</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="admonition.properties.frag"><xsl:attribute-set name="admonition.properties"/>
+</src:fragment>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+<para>How do you want admonitions styled? </para>
+<para>Set the font-size, weight, etc. to the style required</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/admonition.title.properties.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/admonition.title.properties.xml
new file mode 100644
index 0000000..7af23e6
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/admonition.title.properties.xml
@@ -0,0 +1,32 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="admonition.title.properties">
+
+<refmeta>
+ <refentrytitle>admonition.title.properties</refentrytitle>
+ <refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>admonition.title.properties</refname>
+<refpurpose>To set the style for admonitions titles.</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="admonition.title.properties.frag">
+<xsl:attribute-set name="admonition.title.properties">
+ <xsl:attribute name="font-size">14pt</xsl:attribute>
+ <xsl:attribute name="font-weight">bold</xsl:attribute>
+ <xsl:attribute name="hyphenate">false</xsl:attribute>
+ <xsl:attribute name="keep-with-next.within-column">always</xsl:attribute>
+</xsl:attribute-set>
+</src:fragment>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+<para>How do you want admonitions titles styled? </para>
+<para>Set the font-size, weight etc to the style required.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/alignment.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/alignment.xml
new file mode 100644
index 0000000..9c0a3de
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/alignment.xml
@@ -0,0 +1,41 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="alignment">
+<refmeta>
+<refentrytitle>alignment</refentrytitle>
+ <refmiscinfo class="other" otherclass="datatype">list</refmiscinfo>
+ <refmiscinfo class="other" otherclass="list-type">open</refmiscinfo>
+ <refmiscinfo class="other" otherclass="value">left</refmiscinfo>
+ <refmiscinfo class="other" otherclass="value">start</refmiscinfo>
+ <refmiscinfo class="other" otherclass="value">right</refmiscinfo>
+ <refmiscinfo class="other" otherclass="value">end</refmiscinfo>
+ <refmiscinfo class="other" otherclass="value">center</refmiscinfo>
+ <refmiscinfo class="other" otherclass="value">justify</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>alignment</refname>
+<refpurpose>Specify the default text alignment</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="alignment.frag"><xsl:param name="alignment">justify</xsl:param></src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The default text alignment is used for most body text.
+Allowed values are
+<literal>left</literal>,
+<literal>right</literal>,
+<literal>start</literal>,
+<literal>end</literal>,
+<literal>center</literal>,
+<literal>justify</literal>.
+The default value is <literal>justify</literal>.
+</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/annotate.toc.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/annotate.toc.xml
new file mode 100644
index 0000000..667fa32
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/annotate.toc.xml
@@ -0,0 +1,28 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="annotate.toc">
+<refmeta>
+<refentrytitle>annotate.toc</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>annotate.toc</refname>
+<refpurpose>Annotate the Table of Contents?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="annotate.toc.frag"><xsl:param name="annotate.toc" select="1"/></src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If true, TOCs will be annotated. At present, this just means
+that the <tag>refpurpose</tag> of <tag>refentry</tag>
+TOC entries will be displayed.
+</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/annotation.css.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/annotation.css.xml
new file mode 100644
index 0000000..560c56a
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/annotation.css.xml
@@ -0,0 +1,71 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="annotation.css">
+<refmeta>
+<refentrytitle>annotation.css</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>annotation.css</refname>
+<refpurpose>CSS rules for annotations</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="annotation.css.frag">
+<xsl:param name="annotation.css">
+/* ======================================================================
+ Annotations
+*/
+
+div.annotation-list { visibility: hidden;
+ }
+
+div.annotation-nocss { position: absolute;
+ visibility: hidden;
+ }
+
+div.annotation-popup { position: absolute;
+ z-index: 4;
+ visibility: hidden;
+ padding: 0px;
+ margin: 2px;
+ border-style: solid;
+ border-width: 1px;
+ width: 200px;
+ background-color: white;
+ }
+
+div.annotation-title { padding: 1px;
+ font-weight: bold;
+ border-bottom-style: solid;
+ border-bottom-width: 1px;
+ color: white;
+ background-color: black;
+ }
+
+div.annotation-body { padding: 2px;
+ }
+
+div.annotation-body p { margin-top: 0px;
+ padding-top: 0px;
+ }
+
+div.annotation-close { position: absolute;
+ top: 2px;
+ right: 2px;
+ }
+</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If <parameter>annotation.support</parameter> is enabled and the
+document contains <tag>annotation</tag>s, then the CSS in this
+parameter will be included in the document.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/annotation.graphic.close.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/annotation.graphic.close.xml
new file mode 100644
index 0000000..002ebb4
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/annotation.graphic.close.xml
@@ -0,0 +1,31 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="annotation.graphic.close">
+<refmeta>
+<refentrytitle>annotation.graphic.close</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">uri</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>annotation.graphic.close</refname>
+<refpurpose>Image for identifying a link that closes an annotation popup</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="annotation.graphic.close.frag">
+<xsl:param name="annotation.graphic.close">
+http://docbook.sourceforge.net/release/images/annot-close.png</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>This image is used on popup annotations as the “x†that the
+user can click to dismiss the popup.</para>
+<para>This image is used on popup annotations as the “x†that the user can
+click to dismiss the popup. It may be replaced by a user provided graphic. The size should be approximately 10x10 pixels.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/annotation.graphic.open.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/annotation.graphic.open.xml
new file mode 100644
index 0000000..c7d1c32
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/annotation.graphic.open.xml
@@ -0,0 +1,28 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="annotation.graphic.open">
+<refmeta>
+<refentrytitle>annotation.graphic.open</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">uri</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>annotation.graphic.open</refname>
+<refpurpose>Image for identifying a link that opens an annotation popup</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="annotation.graphic.open.frag">
+<xsl:param name="annotation.graphic.open">http://docbook.sourceforge.net/release/images/annot-open.png</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>This image is used inline to identify the location of
+annotations. It may be replaced by a user provided graphic. The size should be approximately 10x10 pixels.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/annotation.js.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/annotation.js.xml
new file mode 100644
index 0000000..6c7e97e
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/annotation.js.xml
@@ -0,0 +1,33 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="annotation.js">
+<refmeta>
+<refentrytitle>annotation.js</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>annotation.js</refname>
+<refpurpose>URIs identifying JavaScript files with support for annotation popups</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="annotation.js.frag">
+
+<xsl:param name="annotation.js">
+<xsl:text>http://docbook.sourceforge.net/release/script/AnchorPosition.js http://docbook.sourceforge.net/release/script/PopupWindow.js</xsl:text></xsl:param>
+
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If <property>annotation.support</property> is enabled and the
+document contains <tag>annotation</tag>s, then the URIs listed
+in this parameter will be included. These JavaScript files are required
+for popup annotation support.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/annotation.support.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/annotation.support.xml
new file mode 100644
index 0000000..29e7633
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/annotation.support.xml
@@ -0,0 +1,29 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="annotation.support">
+<refmeta>
+<refentrytitle>annotation.support</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>annotation.support</refname>
+<refpurpose>Enable annotations?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="annotation.support.frag">
+<xsl:param name="annotation.support" select="0"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, the stylesheets will attempt to support annotation
+elements in HTML by including some JavaScript (see
+<parameter>annotation.js</parameter>).</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/appendix.autolabel.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/appendix.autolabel.xml
new file mode 100644
index 0000000..bae38fa
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/appendix.autolabel.xml
@@ -0,0 +1,73 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="appendix.autolabel">
+<refmeta>
+<refentrytitle>appendix.autolabel</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">list</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">0<alt>none</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">1<alt>1,2,3...</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">A<alt>A,B,C...</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">a<alt>a,b,c...</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">i<alt>i,ii,iii...</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">I<alt>I,II,III...</alt></refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>appendix.autolabel</refname>
+<refpurpose>Specifies the labeling format for Appendix titles</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="appendix.autolabel.frag">
+<xsl:param name="appendix.autolabel">A</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, then appendices will be numbered using the
+parameter value as the number format if the value matches one of the
+following:
+</para>
+
+<variablelist>
+ <varlistentry>
+ <term>1 or arabic</term>
+ <listitem>
+ <para>Arabic numeration (1, 2, 3 ...).</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>A or upperalpha</term>
+ <listitem>
+ <para>Uppercase letter numeration (A, B, C ...).</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>a or loweralpha</term>
+ <listitem>
+ <para>Lowercase letter numeration (a, b, c ...).</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>I or upperroman</term>
+ <listitem>
+ <para>Uppercase roman numeration (I, II, III ...).</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>i or lowerroman</term>
+ <listitem>
+ <para>Lowercase roman letter numeration (i, ii, iii ...).</para>
+ </listitem>
+ </varlistentry>
+</variablelist>
+
+<para>Any nonzero value other than the above will generate
+the default number format (upperalpha).
+</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/arbortext.extensions.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/arbortext.extensions.xml
new file mode 100644
index 0000000..2e571dd
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/arbortext.extensions.xml
@@ -0,0 +1,30 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="arbortext.extensions">
+<refmeta>
+<refentrytitle>arbortext.extensions</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>arbortext.extensions</refname>
+<refpurpose>Enable Arbortext extensions?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="arbortext.extensions.frag"><xsl:param name="arbortext.extensions" select="0"/></src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero,
+<link xlink:href="http://www.arbortext.com/">Arbortext</link>
+extensions will be used.
+</para>
+<para>This parameter can also affect which graphics file formats
+are supported</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/article.appendix.title.properties.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/article.appendix.title.properties.xml
new file mode 100644
index 0000000..61337a1
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/article.appendix.title.properties.xml
@@ -0,0 +1,33 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="article.appendix.title.properties">
+<refmeta>
+<refentrytitle>article.appendix.title.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>article.appendix.title.properties</refname>
+<refpurpose>Properties for appendix titles that appear in an article</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="article.appendix.title.properties.frag">
+<xsl:attribute-set name="article.appendix.title.properties" use-attribute-sets="section.title.properties section.title.level1.properties">
+ <xsl:attribute name="margin-{$direction.align.start}">
+ <xsl:value-of select="$title.margin.left"/>
+ </xsl:attribute>
+</xsl:attribute-set>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The properties for the title of an appendix that
+appears inside an article. The default is to use
+the properties of sect1 titles.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/author.othername.in.middle.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/author.othername.in.middle.xml
new file mode 100644
index 0000000..4ad21dd
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/author.othername.in.middle.xml
@@ -0,0 +1,31 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="author.othername.in.middle">
+<refmeta>
+<refentrytitle>author.othername.in.middle</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>author.othername.in.middle</refname>
+<refpurpose>Is <tag>othername</tag> in <tag>author</tag> a
+middle name?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="author.othername.in.middle.frag">
+<xsl:param name="author.othername.in.middle" select="1"/></src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, the <tag>othername</tag> of an <tag>author</tag>
+appears between the <tag>firstname</tag> and
+<tag>surname</tag>. Otherwise, <tag>othername</tag>
+is suppressed.
+</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/autolayout-file.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/autolayout-file.xml
new file mode 100644
index 0000000..150f123
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/autolayout-file.xml
@@ -0,0 +1,29 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="autolayout-file">
+<refmeta>
+<refentrytitle>autolayout-file</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">filename</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>autolayout-file</refname>
+<refpurpose>Identifies the autolayout.xml file</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="autolayout-file.frag">
+<xsl:param name="autolayout-file">autolayout.xml</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+<para>When the source pages are spread over several directories, this
+parameter can be set (for example, from the command line of a batch-mode
+XSLT processor) to indicate the location of the autolayout.xml file.</para>
+<para>FIXME: for browser-based use, there needs to be a PI for this...
+</para>
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/autotoc.label.in.hyperlink.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/autotoc.label.in.hyperlink.xml
new file mode 100644
index 0000000..dced0bd
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/autotoc.label.in.hyperlink.xml
@@ -0,0 +1,29 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="autotoc.label.in.hyperlink">
+<refmeta>
+<refentrytitle>autotoc.label.in.hyperlink</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>autotoc.label.in.hyperlink</refname>
+<refpurpose>Include label in hyperlinked titles in TOC?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="autotoc.label.in.hyperlink.frag"><xsl:param name="autotoc.label.in.hyperlink" select="1"/></src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If the value of
+<parameter>autotoc.label.in.hyperlink</parameter> is non-zero, labels
+are included in hyperlinked titles in the TOC. If it is instead zero,
+labels are still displayed prior to the hyperlinked titles, but
+are not hyperlinked along with the titles.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/autotoc.label.separator.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/autotoc.label.separator.xml
new file mode 100644
index 0000000..b9cd53a
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/autotoc.label.separator.xml
@@ -0,0 +1,27 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="autotoc.label.separator">
+<refmeta>
+<refentrytitle>autotoc.label.separator</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>autotoc.label.separator</refname>
+<refpurpose>Separator between labels and titles in the ToC</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="autotoc.label.separator.frag">
+<xsl:param name="autotoc.label.separator">. </xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>String used to separate labels and titles in a table of contents.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/axf.extensions.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/axf.extensions.xml
new file mode 100644
index 0000000..940a187
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/axf.extensions.xml
@@ -0,0 +1,33 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="axf.extensions">
+<refmeta>
+<refentrytitle>axf.extensions</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>axf.extensions</refname>
+<refpurpose>Enable XSL Formatter extensions?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="axf.extensions.frag">
+<xsl:param name="axf.extensions" select="0"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero,
+<link xlink:href="http://www.antennahouse.com/">XSL Formatter</link>
+extensions will be used. XSL Formatter extensions consists of PDF bookmarks,
+document information and better index processing.</para>
+
+<para>This parameter can also affect which graphics file formats
+are supported</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/banner.before.navigation.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/banner.before.navigation.xml
new file mode 100644
index 0000000..0883378
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/banner.before.navigation.xml
@@ -0,0 +1,25 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="banner.before.navigation">
+<refmeta>
+<refentrytitle>banner.before.navigation</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>banner.before.navigation</refname>
+<refpurpose>Put banner before navigation?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="banner.before.navigation.frag">
+<xsl:param name="banner.before.navigation" select="1"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+<para>FIXME</para>
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/base.dir.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/base.dir.xml
new file mode 100644
index 0000000..e22ca14
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/base.dir.xml
@@ -0,0 +1,29 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="base.dir">
+<refmeta>
+<refentrytitle>base.dir</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">uri</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>base.dir</refname>
+<refpurpose>The base directory of chunks</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="base.dir.frag">
+<xsl:param name="base.dir"></xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If specified, the <parameter>base.dir</parameter> identifies
+the output directory for chunks. (If not specified, the output directory
+is system dependent.)</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/biblioentry.item.separator.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/biblioentry.item.separator.xml
new file mode 100644
index 0000000..4a56ad6
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/biblioentry.item.separator.xml
@@ -0,0 +1,26 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="biblioentry.item.separator">
+<refmeta>
+<refentrytitle>biblioentry.item.separator</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>biblioentry.item.separator</refname>
+<refpurpose>Text to separate bibliography entries</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="biblioentry.item.separator.frag"><xsl:param name="biblioentry.item.separator">. </xsl:param></src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Text to separate bibliography entries
+</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/biblioentry.properties.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/biblioentry.properties.xml
new file mode 100644
index 0000000..9e88ddb
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/biblioentry.properties.xml
@@ -0,0 +1,28 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="biblioentry.properties">
+<refmeta>
+ <refentrytitle>biblioentry.properties</refentrytitle>
+ <refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>biblioentry.properties</refname>
+<refpurpose>To set the style for biblioentry.</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="biblioentry.properties.frag"><xsl:attribute-set name="biblioentry.properties" use-attribute-sets="normal.para.spacing">
+ <xsl:attribute name="start-indent">0.5in</xsl:attribute>
+ <xsl:attribute name="text-indent">-0.5in</xsl:attribute>
+</xsl:attribute-set>
+</src:fragment>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+<para>How do you want biblioentry styled? </para>
+<para>Set the font-size, weight, space-above and space-below, indents, etc. to the style required</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/bibliography.collection.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/bibliography.collection.xml
new file mode 100644
index 0000000..ee49dde
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/bibliography.collection.xml
@@ -0,0 +1,104 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="bibliography.collection">
+<refmeta>
+<refentrytitle>bibliography.collection</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>bibliography.collection</refname>
+<refpurpose>Name of the bibliography collection file</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="bibliography.collection.frag">
+<xsl:param name="bibliography.collection">http://docbook.sourceforge.net/release/bibliography/bibliography.xml</xsl:param>
+
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Maintaining bibliography entries across a set of documents is tedious, time
+consuming, and error prone. It makes much more sense, usually, to store all of
+the bibliography entries in a single place and simply <quote>extract</quote>
+the ones you need in each document.</para>
+
+<para>That's the purpose of the
+<parameter>bibliography.collection</parameter> parameter. To setup a global
+bibliography <quote>database</quote>, follow these steps:</para>
+
+<para>First, create a stand-alone bibliography document that contains all of
+the documents that you wish to reference. Make sure that each bibliography
+entry (whether you use <tag>biblioentry</tag> or <tag>bibliomixed</tag>)
+has an ID.</para>
+
+<para>My global bibliography, <filename>~/bibliography.xml</filename> begins
+like this:</para>
+
+<informalexample>
+<programlisting>&lt;!DOCTYPE bibliography
+ PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN"
+ "http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd"&gt;
+&lt;bibliography&gt;&lt;title&gt;References&lt;/title&gt;
+
+&lt;bibliomixed id="xml-rec"&gt;&lt;abbrev&gt;XML 1.0&lt;/abbrev&gt;Tim Bray,
+Jean Paoli, C. M. Sperberg-McQueen, and Eve Maler, editors.
+&lt;citetitle&gt;&lt;ulink url="http://www.w3.org/TR/REC-xml"&gt;Extensible Markup
+Language (XML) 1.0 Second Edition&lt;/ulink&gt;&lt;/citetitle&gt;.
+World Wide Web Consortium, 2000.
+&lt;/bibliomixed&gt;
+
+&lt;bibliomixed id="xml-names"&gt;&lt;abbrev&gt;Namespaces&lt;/abbrev&gt;Tim Bray,
+Dave Hollander,
+and Andrew Layman, editors.
+&lt;citetitle&gt;&lt;ulink url="http://www.w3.org/TR/REC-xml-names/"&gt;Namespaces in
+XML&lt;/ulink&gt;&lt;/citetitle&gt;.
+World Wide Web Consortium, 1999.
+&lt;/bibliomixed&gt;
+
+&lt;!-- ... --&gt;
+&lt;/bibliography&gt;
+</programlisting>
+</informalexample>
+
+<para>When you create a bibliography in your document, simply
+provide <emphasis>empty</emphasis> <tag>bibliomixed</tag>
+entries for each document that you wish to cite. Make sure that these
+elements have the same ID as the corresponding <quote>real</quote>
+entry in your global bibliography.</para>
+
+<para>For example:</para>
+
+<informalexample>
+<programlisting>&lt;bibliography&gt;&lt;title&gt;Bibliography&lt;/title&gt;
+
+&lt;bibliomixed id="xml-rec"/&gt;
+&lt;bibliomixed id="xml-names"/&gt;
+&lt;bibliomixed id="DKnuth86"&gt;Donald E. Knuth. &lt;citetitle&gt;Computers and
+Typesetting: Volume B, TeX: The Program&lt;/citetitle&gt;. Addison-Wesley,
+1986. ISBN 0-201-13437-3.
+&lt;/bibliomixed&gt;
+&lt;bibliomixed id="relaxng"/&gt;
+
+&lt;/bibliography&gt;</programlisting>
+</informalexample>
+
+<para>Note that it's perfectly acceptable to mix entries from your
+global bibliography with <quote>normal</quote> entries. You can use
+<tag>xref</tag> or other elements to cross-reference your
+bibliography entries in exactly the same way you do now.</para>
+
+<para>Finally, when you are ready to format your document, simply set the
+<parameter>bibliography.collection</parameter> parameter (in either a
+customization layer or directly through your processor's interface) to
+point to your global bibliography.</para>
+
+<para>The stylesheets will format the bibliography in your document as if
+all of the entries referenced appeared there literally.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/bibliography.numbered.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/bibliography.numbered.xml
new file mode 100644
index 0000000..593a1fa
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/bibliography.numbered.xml
@@ -0,0 +1,27 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="bibliography.numbered">
+<refmeta>
+<refentrytitle>bibliography.numbered</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>bibliography.numbered</refname>
+<refpurpose>Should bibliography entries be numbered?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="bibliography.numbered.frag">
+<xsl:param name="bibliography.numbered" select="0"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero bibliography entries will be numbered</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/bibliography.style.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/bibliography.style.xml
new file mode 100644
index 0000000..fa44582
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/bibliography.style.xml
@@ -0,0 +1,35 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="bibliography.style">
+<refmeta>
+<refentrytitle>bibliography.style</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">list</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">normal</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">iso690</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>bibliography.style</refname>
+<refpurpose>Style used for formatting of biblioentries.</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id='bibliography.style.frag'>
+<xsl:param name="bibliography.style">normal</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Currently only <literal>normal</literal> and
+<literal>iso690</literal> styles are supported.</para>
+
+<para>In order to use ISO690 style to the full extent you might need
+to use additional markup described on <link
+xlink:href="http://wiki.docbook.org/topic/ISO690Bibliography">the
+following WiKi page</link>.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/blockquote.properties.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/blockquote.properties.xml
new file mode 100644
index 0000000..76d7f1c
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/blockquote.properties.xml
@@ -0,0 +1,34 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="blockquote.properties">
+<refmeta>
+ <refentrytitle>blockquote.properties</refentrytitle>
+ <refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>blockquote.properties</refname>
+<refpurpose>To set the style for block quotations.</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="blockquote.properties.frag">
+<xsl:attribute-set name="blockquote.properties">
+<xsl:attribute name="margin-{$direction.align.start}">0.5in</xsl:attribute>
+<xsl:attribute name="margin-{$direction.align.end}">0.5in</xsl:attribute>
+<xsl:attribute name="space-after.minimum">0.5em</xsl:attribute>
+<xsl:attribute name="space-after.optimum">1em</xsl:attribute>
+<xsl:attribute name="space-after.maximum">2em</xsl:attribute>
+</xsl:attribute-set>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The <parameter>blockquote.properties</parameter> attribute set specifies
+the formating properties of block quotations.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/blurb.on.titlepage.enabled.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/blurb.on.titlepage.enabled.xml
new file mode 100644
index 0000000..27e89d7
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/blurb.on.titlepage.enabled.xml
@@ -0,0 +1,31 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="blurb.on.titlepage.enabled">
+<refmeta>
+<refentrytitle>blurb.on.titlepage.enabled</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>blurb.on.titlepage.enabled</refname>
+<refpurpose>Display personblurb and authorblurb on title pages?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="blurb.on.titlepage.enabled.frag">
+<xsl:param name="blurb.on.titlepage.enabled" select="0"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, output from <tag>authorblurb</tag> and
+<tag>personblurb</tag> elements is displayed on title pages. If zero
+(the default), output from those elements is suppressed on title pages
+(unless you are using a <literal>titlepage</literal> customization
+that causes them to be included).</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/body.attributes.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/body.attributes.xml
new file mode 100644
index 0000000..8ee1ad9
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/body.attributes.xml
@@ -0,0 +1,31 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="body.attributes">
+<refmeta>
+<refentrytitle>body.attributes</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>body.attributes</refname>
+<refpurpose>DEPRECATED</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="body.attributes.frag">
+<xsl:attribute-set name="body.attributes">
+ <xsl:attribute name="bgcolor">white</xsl:attribute>
+ <xsl:attribute name="text">black</xsl:attribute>
+ <xsl:attribute name="link">#0000FF</xsl:attribute>
+ <xsl:attribute name="vlink">#840084</xsl:attribute>
+ <xsl:attribute name="alink">#0000FF</xsl:attribute>
+</xsl:attribute-set>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+<para>DEPRECATED</para>
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/body.bg.color.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/body.bg.color.xml
new file mode 100644
index 0000000..8315b85
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/body.bg.color.xml
@@ -0,0 +1,28 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="body.bg.color">
+<refmeta>
+<refentrytitle>body.bg.color</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">color</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>body.bg.color</refname>
+<refpurpose>Background color for body frame</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="body.bg.color.frag">
+<xsl:param name="body.bg.color">#FFFFFF</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies the background color used in the body column of
+tabular slides.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/body.end.indent.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/body.end.indent.xml
new file mode 100644
index 0000000..a5e098c
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/body.end.indent.xml
@@ -0,0 +1,37 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="body.end.indent">
+<refmeta>
+<refentrytitle>body.end.indent</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">length</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>body.end.indent</refname>
+<refpurpose>The end-indent for the body text</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="body.end.indent.frag">
+<xsl:param name="body.end.indent">0pt</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>This end-indent property is added to the fo:flow
+for certain page sequences. Which page-sequences it is
+applied to is determined by the template named
+<literal>set.flow.properties</literal>.
+By default, that template adds it to the flow
+for page-sequences using the <quote>body</quote>
+master-reference, as well as appendixes and prefaces.
+</para>
+
+<para>See also <parameter>body.start.indent</parameter>.
+</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/body.font.family.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/body.font.family.xml
new file mode 100644
index 0000000..06c3b47
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/body.font.family.xml
@@ -0,0 +1,32 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="body.font.family">
+<refmeta>
+<refentrytitle>body.font.family</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">list</refmiscinfo>
+<refmiscinfo class="other" otherclass="list-type">open</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">serif</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">sans-serif</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">monospace</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>body.font.family</refname>
+<refpurpose>The default font family for body text</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="body.font.family.frag">
+<xsl:param name="body.font.family">serif</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The body font family is the default font used for text in the page body.
+</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/body.font.master.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/body.font.master.xml
new file mode 100644
index 0000000..323a6a0
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/body.font.master.xml
@@ -0,0 +1,30 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="body.font.master">
+<refmeta>
+<refentrytitle>body.font.master</refentrytitle>
+ <refmiscinfo class="other" otherclass="datatype">number</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>body.font.master</refname>
+<refpurpose>Specifies the default point size for body text</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="body.font.master.frag">
+<xsl:param name="body.font.master">10</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The body font size is specified in two parameters
+(<parameter>body.font.master</parameter> and <parameter>body.font.size</parameter>)
+so that math can be performed on the font size by XSLT.
+</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/body.font.size.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/body.font.size.xml
new file mode 100644
index 0000000..fc35ade
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/body.font.size.xml
@@ -0,0 +1,31 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="body.font.size">
+<refmeta>
+<refentrytitle>body.font.size</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">length</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>body.font.size</refname>
+<refpurpose>Specifies the default font size for body text</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="body.font.size.frag">
+<xsl:param name="body.font.size">
+ <xsl:value-of select="$body.font.master"/><xsl:text>pt</xsl:text>
+</xsl:param></src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The body font size is specified in two parameters
+(<parameter>body.font.master</parameter> and <parameter>body.font.size</parameter>)
+so that math can be performed on the font size by XSLT.
+</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/body.margin.bottom.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/body.margin.bottom.xml
new file mode 100644
index 0000000..2302f64
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/body.margin.bottom.xml
@@ -0,0 +1,29 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="body.margin.bottom">
+<refmeta>
+<refentrytitle>body.margin.bottom</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">length</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>body.margin.bottom</refname>
+<refpurpose>The bottom margin of the body text</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="body.margin.bottom.frag">
+<xsl:param name="body.margin.bottom">0.5in</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The body bottom margin is the distance from the last line of text
+in the page body to the bottom of the region-after.
+</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/body.margin.top.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/body.margin.top.xml
new file mode 100644
index 0000000..182bd9f
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/body.margin.top.xml
@@ -0,0 +1,28 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="body.margin.top">
+<refmeta>
+<refentrytitle>body.margin.top</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">length</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>body.margin.top</refname>
+<refpurpose>To specify the size of the top margin of a page</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="body.margin.top.frag">
+<xsl:param name="body.margin.top">0.5in</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The body top margin is the distance from the top of the
+region-before to the first line of text in the page body.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/body.start.indent.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/body.start.indent.xml
new file mode 100644
index 0000000..4e348f1
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/body.start.indent.xml
@@ -0,0 +1,64 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="body.start.indent">
+<refmeta>
+<refentrytitle>body.start.indent</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">length</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>body.start.indent</refname>
+<refpurpose>The start-indent for the body text</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="body.start.indent.frag">
+<xsl:param name="body.start.indent">
+ <xsl:choose>
+ <xsl:when test="$fop.extensions != 0">0pt</xsl:when>
+ <xsl:when test="$passivetex.extensions != 0">0pt</xsl:when>
+ <xsl:otherwise>4pc</xsl:otherwise>
+ </xsl:choose>
+</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>This parameter provides
+the means of indenting the body text relative to
+section titles.
+For left-to-right text direction, it indents the left side.
+For right-to-left text direction, it indents the right side.
+It is used in place of the
+<parameter>title.margin.left</parameter> for
+all XSL-FO processors except FOP 0.25.
+It enables support for side floats to appear
+in the indented margin area.
+</para>
+<para>This start-indent property is added to the fo:flow
+for certain page sequences. Which page-sequences it is
+applied to is determined by the template named
+<literal>set.flow.properties</literal>.
+By default, that template adds it to the flow
+for page-sequences using the <quote>body</quote>
+master-reference, as well as appendixes and prefaces.
+</para>
+<para>If this parameter is used, section titles should have
+a start-indent value of 0pt if they are to be
+outdented relative to the body text.
+</para>
+
+<para>If you are using FOP, then set this parameter to a zero
+width value and set the <parameter>title.margin.left</parameter>
+parameter to the negative value of the desired indent.
+</para>
+
+<para>See also <parameter>body.end.indent</parameter> and
+<parameter>title.margin.left</parameter>.
+</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/bookmarks.collapse.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/bookmarks.collapse.xml
new file mode 100644
index 0000000..3320056
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/bookmarks.collapse.xml
@@ -0,0 +1,31 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="bookmarks.collapse">
+<refmeta>
+<refentrytitle>bookmarks.collapse</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>bookmarks.collapse</refname>
+<refpurpose>Specifies the initial state of bookmarks</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="bookmarks.collapse.frag">
+<xsl:param name="bookmarks.collapse" select="1"></xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, the bookmark tree is collapsed so that only the
+top-level bookmarks are displayed initially. Otherwise, the whole tree
+of bookmarks is displayed.</para>
+
+<para>This parameter currently works with FOP 0.93 or later.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/bridgehead.in.toc.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/bridgehead.in.toc.xml
new file mode 100644
index 0000000..490d556
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/bridgehead.in.toc.xml
@@ -0,0 +1,28 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="bridgehead.in.toc">
+<refmeta>
+<refentrytitle>bridgehead.in.toc</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>bridgehead.in.toc</refname>
+<refpurpose>Should bridgehead elements appear in the TOC?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="bridgehead.in.toc.frag"><xsl:param name="bridgehead.in.toc" select="0"/></src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, <tag>bridgehead</tag>s appear in the TOC. Note that
+this option is not fully supported and may be removed in a future
+version of the stylesheets.
+</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/bullet.image.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/bullet.image.xml
new file mode 100644
index 0000000..acf2af5
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/bullet.image.xml
@@ -0,0 +1,28 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="bullet.image">
+<refmeta>
+<refentrytitle>bullet.image</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">filename</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>bullet.image</refname>
+<refpurpose>Bullet image</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="bullet.image.frag">
+<xsl:param name="bullet.image">toc/bullet.png</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies the filename of the bullet image used for foils in the
+framed ToC.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/callout.defaultcolumn.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/callout.defaultcolumn.xml
new file mode 100644
index 0000000..6cae381
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/callout.defaultcolumn.xml
@@ -0,0 +1,30 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="callout.defaultcolumn">
+<refmeta>
+<refentrytitle>callout.defaultcolumn</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">integer</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>callout.defaultcolumn</refname>
+<refpurpose>Indicates what column callouts appear in by default</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="callout.defaultcolumn.frag">
+<xsl:param name="callout.defaultcolumn">60</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If a callout does not identify a column (for example, if it uses
+the <literal>linerange</literal> <tag class="attribute">unit</tag>),
+it will appear in the default column.
+</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/callout.graphics.extension.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/callout.graphics.extension.xml
new file mode 100644
index 0000000..febc690
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/callout.graphics.extension.xml
@@ -0,0 +1,33 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="callout.graphics.extension">
+<refmeta>
+<refentrytitle>callout.graphics.extension</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>callout.graphics.extension</refname>
+<refpurpose>Filename extension for callout graphics</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="callout.graphics.extension.frag">
+<xsl:param condition="html" name="callout.graphics.extension">.png</xsl:param>
+<xsl:param condition="fo" name="callout.graphics.extension">.svg</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+<para>Sets the filename extension to use on callout graphics. </para>
+
+<itemizedlist>
+<para>The Docbook XSL distribution provides callout graphics in the following formats:</para>
+<listitem><para>SVG (extension: <filename class="extension">.svg</filename>)</para></listitem>
+<listitem><para>PNG (extension: <filename class="extension">.png</filename>)</para></listitem>
+<listitem><para>GIF (extension: <filename class="extension">.gif</filename>)</para></listitem>
+</itemizedlist>
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/callout.graphics.number.limit.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/callout.graphics.number.limit.xml
new file mode 100644
index 0000000..cde5267
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/callout.graphics.number.limit.xml
@@ -0,0 +1,34 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="callout.graphics.number.limit">
+<refmeta>
+<refentrytitle>callout.graphics.number.limit</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">integer</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>callout.graphics.number.limit</refname>
+<refpurpose>Number of the largest callout graphic</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="callout.graphics.number.limit.frag">
+<xsl:param condition="html" name="callout.graphics.number.limit">15</xsl:param>
+<xsl:param condition="fo" name="callout.graphics.number.limit">30</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If <parameter>callout.graphics</parameter> is non-zero, graphics
+are used to represent callout numbers instead of plain text. The value
+of <parameter>callout.graphics.number.limit</parameter> is the largest
+number for which a graphic exists. If the callout number exceeds this
+limit, the default presentation "(plain text instead of a graphic)"
+will be used.
+</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/callout.graphics.path.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/callout.graphics.path.xml
new file mode 100644
index 0000000..00e54c1
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/callout.graphics.path.xml
@@ -0,0 +1,31 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="callout.graphics.path">
+<refmeta>
+<refentrytitle>callout.graphics.path</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>callout.graphics.path</refname>
+<refpurpose>Path to callout graphics</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="callout.graphics.path.frag">
+<xsl:param name="callout.graphics.path">images/callouts/</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Sets the path to the directory holding the callout graphics. his
+location is normally relative to the output html directory. see
+base.dir. Always terminate the directory with / since the graphic file
+is appended to this string, hence needs the separator.
+</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/callout.graphics.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/callout.graphics.xml
new file mode 100644
index 0000000..a97ac0d
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/callout.graphics.xml
@@ -0,0 +1,30 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="callout.graphics">
+<refmeta>
+<refentrytitle>callout.graphics</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>callout.graphics</refname>
+<refpurpose>Use graphics for callouts?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="callout.graphics.frag">
+<xsl:param name="callout.graphics" select="1"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, callouts are presented with graphics (e.g., reverse-video
+circled numbers instead of "(1)", "(2)", etc.).
+Default graphics are provided in the distribution.
+</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/callout.icon.size.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/callout.icon.size.xml
new file mode 100644
index 0000000..d3acae8
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/callout.icon.size.xml
@@ -0,0 +1,28 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="callout.icon.size">
+<refmeta>
+<refentrytitle>callout.icon.size</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">length</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>callout.icon.size</refname>
+<refpurpose>Specifies the size of callout marker icons</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="callout.icon.size.frag">
+<xsl:param name="callout.icon.size">7pt</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies the size of the callout marker icons.
+The default size is 7 points.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/callout.list.table.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/callout.list.table.xml
new file mode 100644
index 0000000..6fece03
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/callout.list.table.xml
@@ -0,0 +1,32 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="callout.list.table">
+<refmeta>
+<refentrytitle>callout.list.table</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>callout.list.table</refname>
+<refpurpose>Present callout lists using a table?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="callout.list.table.frag">
+<xsl:param name="callout.list.table" select="1"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The default presentation of <tag>calloutlist</tag>s uses
+an HTML <tag>DL</tag> element. Some browsers don't align DLs very well
+if <parameter>callout.graphics</parameter> is used. With this option
+turned on, <tag>calloutlist</tag>s are presented in an HTML
+<tag>TABLE</tag>, which usually results in better alignment
+of the callout number with the callout description.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/callout.unicode.font.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/callout.unicode.font.xml
new file mode 100644
index 0000000..e63bffb
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/callout.unicode.font.xml
@@ -0,0 +1,29 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="callout.unicode.font">
+<refmeta>
+<refentrytitle>callout.unicode.font</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>callout.unicode.font</refname>
+<refpurpose>Specify a font for Unicode glyphs</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="callout.unicode.font.frag">
+<xsl:param name="callout.unicode.font">ZapfDingbats</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The name of the font to specify around Unicode callout glyphs.
+If set to the empty string, no font change will occur.
+</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/callout.unicode.number.limit.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/callout.unicode.number.limit.xml
new file mode 100644
index 0000000..a9f1f3d
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/callout.unicode.number.limit.xml
@@ -0,0 +1,35 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="callout.unicode.number.limit">
+<refmeta>
+<refentrytitle>callout.unicode.number.limit</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">integer</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>callout.unicode.number.limit</refname>
+<refpurpose>Number of the largest unicode callout character</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="callout.unicode.number.limit.frag">
+<xsl:param name="callout.unicode.number.limit">10</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If <parameter>callout.unicode</parameter>
+is non-zero, unicode characters are used to represent
+callout numbers. The value of
+<parameter>callout.unicode.number.limit</parameter>
+is
+the largest number for which a unicode character exists. If the callout number
+exceeds this limit, the default presentation "(nnn)" will always
+be used.
+</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/callout.unicode.start.character.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/callout.unicode.start.character.xml
new file mode 100644
index 0000000..90a1acd
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/callout.unicode.start.character.xml
@@ -0,0 +1,33 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="callout.unicode.start.character">
+<refmeta>
+<refentrytitle>callout.unicode.start.character</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">integer</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>callout.unicode.start.character</refname>
+<refpurpose>First Unicode character to use, decimal value.</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="callout.unicode.start.character.frag">
+<xsl:param name="callout.unicode.start.character">10102</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If <parameter>callout.graphics</parameter> is zero and <parameter>callout.unicode</parameter>
+is non-zero, unicode characters are used to represent
+callout numbers. The value of
+<parameter>callout.unicode.start.character</parameter>
+is the decimal unicode value used for callout number one. Currently,
+only 10102 is supported in the stylesheets for this parameter.
+</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/callout.unicode.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/callout.unicode.xml
new file mode 100644
index 0000000..4ec6a5f
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/callout.unicode.xml
@@ -0,0 +1,26 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="callout.unicode">
+<refmeta>
+<refentrytitle>callout.unicode</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>callout.unicode</refname>
+<refpurpose>Use Unicode characters rather than images for callouts.</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="callout.unicode.frag"><xsl:param name="callout.unicode" select="0"/></src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The stylesheets can use either an image of the numbers one to ten, or the single Unicode character which represents the numeral, in white on a black background. Use this to select the Unicode character option.
+</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/callouts.extension.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/callouts.extension.xml
new file mode 100644
index 0000000..80b5845
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/callouts.extension.xml
@@ -0,0 +1,30 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="callouts.extension">
+<refmeta>
+<refentrytitle>callouts.extension</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>callouts.extension</refname>
+<refpurpose>Enable the callout extension</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="callouts.extension.frag">
+<xsl:param name="callouts.extension" select="1"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+<!-- DP. Note this is not used in the same manner as callout.graphics.extension -->
+<para>The callouts extension processes <tag>areaset</tag>
+elements in <tag>programlistingco</tag> and other text-based
+callout elements.
+</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/chapter.autolabel.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/chapter.autolabel.xml
new file mode 100644
index 0000000..32414bc
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/chapter.autolabel.xml
@@ -0,0 +1,71 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="chapter.autolabel">
+<refmeta>
+<refentrytitle>chapter.autolabel</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">list</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">0<alt>none</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">1<alt>1,2,3...</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">A<alt>A,B,C...</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">a<alt>a,b,c...</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">i<alt>i,ii,iii...</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">I<alt>I,II,III...</alt></refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>chapter.autolabel</refname>
+<refpurpose>Specifies the labeling format for Chapter titles</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="chapter.autolabel.frag">
+<xsl:param name="chapter.autolabel" select="1"/></src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, then chapters will be numbered using the parameter
+value as the number format if the value matches one of the following:
+</para>
+
+<variablelist>
+ <varlistentry>
+ <term>1 or arabic</term>
+ <listitem>
+ <para>Arabic numeration (1, 2, 3 ...).</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>A or upperalpha</term>
+ <listitem>
+ <para>Uppercase letter numeration (A, B, C ...).</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>a or loweralpha</term>
+ <listitem>
+ <para>Lowercase letter numeration (a, b, c ...).</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>I or upperroman</term>
+ <listitem>
+ <para>Uppercase roman numeration (I, II, III ...).</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>i or lowerroman</term>
+ <listitem>
+ <para>Lowercase roman letter numeration (i, ii, iii ...).</para>
+ </listitem>
+ </varlistentry>
+</variablelist>
+
+<para>Any nonzero value other than the above will generate
+the default number format (arabic).
+</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/chunk.append.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/chunk.append.xml
new file mode 100644
index 0000000..1f65aad
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/chunk.append.xml
@@ -0,0 +1,30 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="chunk.append">
+<refmeta>
+<refentrytitle>chunk.append</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>chunk.append</refname>
+<refpurpose>Specifies content to append to chunked HTML output</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="chunk.append.frag"><xsl:param name="chunk.append"/></src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies content to append to the end of HTML files output by
+the <filename>html/chunk.xsl</filename> stylesheet, after the closing
+<code>&lt;html&gt;</code> tag. You probably don’t want to set any value
+for this parameter; but if you do, the only value it should ever be
+set to is a newline character: <code>&amp;#x0a;</code> or
+<code>&amp;#10;</code></para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/chunk.first.sections.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/chunk.first.sections.xml
new file mode 100644
index 0000000..f0c1b82
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/chunk.first.sections.xml
@@ -0,0 +1,31 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="chunk.first.sections">
+<refmeta>
+<refentrytitle>chunk.first.sections</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>chunk.first.sections</refname>
+<refpurpose>Chunk the first top-level section?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="chunk.first.sections.frag">
+<xsl:param name="chunk.first.sections" select="0"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, a chunk will be created for the first top-level
+<tag>sect1</tag> or <tag>section</tag> elements in
+each component. Otherwise, that section will be part of the chunk for
+its parent.
+</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/chunk.quietly.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/chunk.quietly.xml
new file mode 100644
index 0000000..8700b29
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/chunk.quietly.xml
@@ -0,0 +1,30 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="chunk.quietly">
+<refmeta>
+<refentrytitle>chunk.quietly</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>chunk.quietly</refname>
+<refpurpose>Omit the chunked filename messages.</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="chunk.quietly.frag">
+<xsl:param name="chunk.quietly" select="0"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If zero (the default), the XSL processor emits a message naming
+each separate chunk filename as it is being output.
+If nonzero, then the messages are suppressed.
+</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/chunk.section.depth.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/chunk.section.depth.xml
new file mode 100644
index 0000000..d46193c
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/chunk.section.depth.xml
@@ -0,0 +1,27 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="chunk.section.depth">
+<refmeta>
+<refentrytitle>chunk.section.depth</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">integer</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>chunk.section.depth</refname>
+<refpurpose>Depth to which sections should be chunked</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="chunk.section.depth.frag">
+<xsl:param name="chunk.section.depth" select="1"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>This parameter sets the depth of section chunking.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/chunk.sections.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/chunk.sections.xml
new file mode 100644
index 0000000..2ffb1a3
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/chunk.sections.xml
@@ -0,0 +1,30 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="chunk.sections">
+<refmeta>
+<refentrytitle>chunk.sections</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>chunk.sections</refname>
+<refpurpose>Should top-level sections be chunks in their own right?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="chunk.sections.frag">
+<xsl:param name="chunk.sections" select="1"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, chunks will be created for top-level
+<tag>sect1</tag> and <tag>section</tag> elements in
+each component.
+</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/chunk.separate.lots.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/chunk.separate.lots.xml
new file mode 100644
index 0000000..aa54eab
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/chunk.separate.lots.xml
@@ -0,0 +1,36 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="chunk.separate.lots">
+<refmeta>
+<refentrytitle>chunk.separate.lots</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>chunk.separate.lots</refname>
+<refpurpose>Should each LoT be in its own separate chunk?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="chunk.separate.lots.frag">
+<xsl:param name="chunk.separate.lots" select="0"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, each of the ToC and LoTs
+(List of Examples, List of Figures, etc.)
+will be put in its own separate chunk.
+The title page includes generated links to each of the separate files.
+</para>
+<para>
+This feature depends on the
+<parameter>chunk.tocs.and.lots</parameter>
+parameter also being non-zero.
+</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/chunk.toc.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/chunk.toc.xml
new file mode 100644
index 0000000..12cdb2c
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/chunk.toc.xml
@@ -0,0 +1,30 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="chunk.toc">
+<refmeta>
+<refentrytitle>chunk.toc</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>chunk.toc</refname>
+<refpurpose>An explicit TOC to be used for chunking</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="chunk.toc.frag">
+<xsl:param name="chunk.toc"></xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The <parameter>chunk.toc</parameter> identifies an explicit TOC that
+will be used for chunking. This parameter is only used by the
+<filename>chunktoc.xsl</filename> stylesheet (and customization layers built
+from it).</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/chunk.tocs.and.lots.has.title.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/chunk.tocs.and.lots.has.title.xml
new file mode 100644
index 0000000..0bdd31b
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/chunk.tocs.and.lots.has.title.xml
@@ -0,0 +1,28 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="chunk.tocs.and.lots.has.title">
+<refmeta>
+<refentrytitle>chunk.tocs.and.lots.has.title</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>chunk.tocs.and.lots.has.title</refname>
+<refpurpose>Should ToC and LoTs in a separate chunks have title?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="chunk.tocs.and.lots.has.title.frag">
+<xsl:param name="chunk.tocs.and.lots.has.title" select="1"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero title of document is shown before ToC/LoT in
+separate chunk.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/chunk.tocs.and.lots.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/chunk.tocs.and.lots.xml
new file mode 100644
index 0000000..2a01fff
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/chunk.tocs.and.lots.xml
@@ -0,0 +1,32 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="chunk.tocs.and.lots">
+<refmeta>
+<refentrytitle>chunk.tocs.and.lots</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>chunk.tocs.and.lots</refname>
+<refpurpose>Should ToC and LoTs be in separate chunks?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="chunk.tocs.and.lots.frag">
+<xsl:param name="chunk.tocs.and.lots" select="0"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, ToC and LoT (List of Examples, List of Figures, etc.)
+will be put in a separate chunk. At the moment, this chunk is not in the
+normal forward/backward navigation list. Instead, a new link is added to the
+navigation footer.</para>
+
+<para>This feature is still somewhat experimental. Feedback welcome.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/chunker.output.cdata-section-elements.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/chunker.output.cdata-section-elements.xml
new file mode 100644
index 0000000..3e9be4d
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/chunker.output.cdata-section-elements.xml
@@ -0,0 +1,30 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="chunker.output.cdata-section-elements">
+<refmeta>
+<refentrytitle>chunker.output.cdata-section-elements</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>chunker.output.cdata-section-elements</refname>
+<refpurpose>List of elements to escape with CDATA sections</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+<src:fragment xml:id="chunker.output.cdata-section-elements.frag">
+<xsl:param name="chunker.output.cdata-section-elements"></xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+<para>This parameter specifies the list of elements that should be escaped
+as CDATA sections by the chunking stylesheet. Not all processors support
+specification of this parameter.
+</para>
+<note>
+<para>This parameter is documented here, but the declaration is actually
+in the <filename>chunker.xsl</filename> stylesheet module.</para>
+</note>
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/chunker.output.doctype-public.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/chunker.output.doctype-public.xml
new file mode 100644
index 0000000..6aa6e30
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/chunker.output.doctype-public.xml
@@ -0,0 +1,31 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="chunker.output.doctype-public">
+<refmeta>
+<refentrytitle>chunker.output.doctype-public</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>chunker.output.doctype-public</refname>
+<refpurpose>Public identifer to use in the document type of generated pages</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+<src:fragment xml:id="chunker.output.doctype-public.frag">
+<xsl:param name="chunker.output.doctype-public"></xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+<para>This parameter specifies the public identifier that should be used by
+the chunking stylesheet in the document type declaration of chunked pages.
+Not all processors support specification of
+this parameter.
+</para>
+<note>
+<para>This parameter is documented here, but the declaration is actually
+in the <filename>chunker.xsl</filename> stylesheet module.</para>
+</note>
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/chunker.output.doctype-system.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/chunker.output.doctype-system.xml
new file mode 100644
index 0000000..2d67906
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/chunker.output.doctype-system.xml
@@ -0,0 +1,31 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="chunker.output.doctype-system">
+<refmeta>
+<refentrytitle>chunker.output.doctype-system</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">uri</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>chunker.output.doctype-system</refname>
+<refpurpose>System identifier to use for the document type in generated pages</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+<src:fragment xml:id="chunker.output.doctype-system.frag">
+<xsl:param name="chunker.output.doctype-system"></xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+<para>This parameter specifies the system identifier that should be used by
+the chunking stylesheet in the document type declaration of chunked pages.
+Not all processors support specification of
+this parameter.
+</para>
+<note>
+<para>This parameter is documented here, but the declaration is actually
+in the <filename>chunker.xsl</filename> stylesheet module.</para>
+</note>
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/chunker.output.encoding.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/chunker.output.encoding.xml
new file mode 100644
index 0000000..f8993e9
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/chunker.output.encoding.xml
@@ -0,0 +1,31 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="chunker.output.encoding">
+<refmeta>
+<refentrytitle>chunker.output.encoding</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>chunker.output.encoding</refname>
+<refpurpose>Encoding used in generated pages</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+<src:fragment xml:id="chunker.output.encoding.frag">
+<xsl:param name="chunker.output.encoding">ISO-8859-1</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+<para>This parameter specifies the encoding to be used in files
+generated by the chunking stylesheet. Not all processors support
+specification of this parameter.
+</para>
+<para>This parameter used to be named <literal>default.encoding</literal>.</para>
+<note>
+<para>This parameter is documented here, but the declaration is actually
+in the <filename>chunker.xsl</filename> stylesheet module.</para>
+</note>
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/chunker.output.indent.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/chunker.output.indent.xml
new file mode 100644
index 0000000..3da9ad4
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/chunker.output.indent.xml
@@ -0,0 +1,30 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="chunker.output.indent">
+<refmeta>
+<refentrytitle>chunker.output.indent</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>chunker.output.indent</refname>
+<refpurpose>Specification of indentation on generated pages</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+<src:fragment xml:id="chunker.output.indent.frag">
+<xsl:param name="chunker.output.indent">no</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+<para>This parameter specifies the value of the indent
+specification for generated pages. Not all processors support
+specification of this parameter.
+</para>
+<note>
+<para>This parameter is documented here, but the declaration is actually
+in the <filename>chunker.xsl</filename> stylesheet module.</para>
+</note>
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/chunker.output.media-type.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/chunker.output.media-type.xml
new file mode 100644
index 0000000..6186971
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/chunker.output.media-type.xml
@@ -0,0 +1,35 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="chunker.output.media-type">
+<refmeta>
+<refentrytitle>chunker.output.media-type</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>chunker.output.media-type</refname>
+<refpurpose>Media type to use in generated pages</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+<src:fragment xml:id="chunker.output.media-type.frag">
+<xsl:param name="chunker.output.media-type"></xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+<para>This parameter specifies the media type that should be used by
+the chunking stylesheet. Not all processors support specification of
+this parameter.
+</para>
+<para>This parameter specifies the media type that should be used by the
+chunking stylesheet. This should be one from those defined in
+<link xlink:href="http://www.ietf.org/rfc/rfc2045.txt">[RFC2045]</link> and
+ <link xlink:href="http://www.ietf.org/rfc/rfc2046.txt">[RFC2046]</link> </para>
+<note>
+<para>This parameter is documented here, but the declaration is actually
+in the <filename>chunker.xsl</filename> stylesheet module.</para>
+<para>It must be one from html, xml or text</para>
+</note>
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/chunker.output.method.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/chunker.output.method.xml
new file mode 100644
index 0000000..dc9359b
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/chunker.output.method.xml
@@ -0,0 +1,32 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="chunker.output.method">
+<refmeta>
+<refentrytitle>chunker.output.method</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">list</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">html</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">xml</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>chunker.output.method</refname>
+<refpurpose>Method used in generated pages</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+<src:fragment xml:id="chunker.output.method.frag">
+<xsl:param name="chunker.output.method">html</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+<para>This parameter specifies the output method to be used in files
+generated by the chunking stylesheet.
+</para>
+<para>This parameter used to be named <literal>output.method</literal>.</para>
+<note>
+<para>This parameter is documented here, but the declaration is actually
+in the <filename>chunker.xsl</filename> stylesheet module.</para>
+</note>
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/chunker.output.omit-xml-declaration.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/chunker.output.omit-xml-declaration.xml
new file mode 100644
index 0000000..4b8262f
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/chunker.output.omit-xml-declaration.xml
@@ -0,0 +1,30 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="chunker.output.omit-xml-declaration">
+<refmeta>
+<refentrytitle>chunker.output.omit-xml-declaration</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>chunker.output.omit-xml-declaration</refname>
+<refpurpose>Omit-xml-declaration for generated pages</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+<src:fragment xml:id="chunker.output.omit-xml-declaration.frag">
+<xsl:param name="chunker.output.omit-xml-declaration">no</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+<para>This parameter specifies the value of the omit-xml-declaration
+specification for generated pages. Not all processors support
+specification of this parameter.
+</para>
+<note>
+<para>This parameter is documented here, but the declaration is actually
+in the <filename>chunker.xsl</filename> stylesheet module.</para>
+</note>
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/chunker.output.standalone.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/chunker.output.standalone.xml
new file mode 100644
index 0000000..8972c47
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/chunker.output.standalone.xml
@@ -0,0 +1,31 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="chunker.output.standalone">
+<refmeta>
+<refentrytitle>chunker.output.standalone</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>chunker.output.standalone</refname>
+<refpurpose>Standalone declaration for generated pages</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+<src:fragment xml:id="chunker.output.standalone.frag">
+<xsl:param name="chunker.output.standalone">no</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+<para>This parameter specifies the value of the standalone
+ specification for generated pages. It must be either
+ <literal>yes</literal> or <literal>no</literal>. Not all
+ processors support specification of this parameter.
+</para>
+<note>
+<para>This parameter is documented here, but the declaration is actually
+in the <filename>chunker.xsl</filename> stylesheet module.</para>
+</note>
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/citerefentry.link.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/citerefentry.link.xml
new file mode 100644
index 0000000..623511b
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/citerefentry.link.xml
@@ -0,0 +1,29 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="citerefentry.link">
+<refmeta>
+<refentrytitle>citerefentry.link</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>citerefentry.link</refname>
+<refpurpose>Generate URL links when cross-referencing RefEntrys?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="citerefentry.link.frag">
+<xsl:param name="citerefentry.link" select="0"/></src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, a web link will be generated, presumably
+to an online man-&gt;HTML gateway. The text of the link is
+generated by the <literal>generate.citerefentry.link</literal> template.
+</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/collect.xref.targets.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/collect.xref.targets.xml
new file mode 100644
index 0000000..378c969
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/collect.xref.targets.xml
@@ -0,0 +1,33 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="collect.xref.targets">
+<refmeta>
+<refentrytitle>collect.xref.targets</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">list</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">no</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">yes</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">only</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>collect.xref.targets</refname>
+<refpurpose>Controls whether cross reference data is
+collected</refpurpose>
+</refnamediv>
+<refsynopsisdiv> <src:fragment xml:id="collect.xref.targets.frag">
+<xsl:param name="collect.xref.targets">no</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+
+<para>
+In order to resolve olinks efficiently, the stylesheets can
+generate an external data file containing information about
+all potential cross reference endpoints in a document.
+This parameter determines whether the collection process is run when the document is processed by the stylesheet. The default value is <literal>no</literal>, which means the data file is not generated during processing. The other choices are <literal>yes</literal>, which means the data file is created and the document is processed for output, and <literal>only</literal>, which means the data file is created but the document is not processed for output.
+See also <parameter>targets.filename</parameter>.
+</para>
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/column.count.back.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/column.count.back.xml
new file mode 100644
index 0000000..95ee76d
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/column.count.back.xml
@@ -0,0 +1,27 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="column.count.back">
+<refmeta>
+<refentrytitle>column.count.back</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">integer</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>column.count.back</refname>
+<refpurpose>Number of columns on back matter pages</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="column.count.back.frag">
+<xsl:param name="column.count.back" select="1"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Number of columns on back matter (appendix, glossary, etc.) pages.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/column.count.body.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/column.count.body.xml
new file mode 100644
index 0000000..a5d65b3
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/column.count.body.xml
@@ -0,0 +1,27 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="column.count.body">
+<refmeta>
+<refentrytitle>column.count.body</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">integer</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>column.count.body</refname>
+<refpurpose>Number of columns on body pages</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="column.count.body.frag">
+<xsl:param name="column.count.body" select="1"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Number of columns on body pages.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/column.count.front.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/column.count.front.xml
new file mode 100644
index 0000000..64ff3ac
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/column.count.front.xml
@@ -0,0 +1,27 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="column.count.front">
+<refmeta>
+<refentrytitle>column.count.front</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">integer</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>column.count.front</refname>
+<refpurpose>Number of columns on front matter pages</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="column.count.front.frag">
+<xsl:param name="column.count.front" select="1"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Number of columns on front matter (dedication, preface, etc.) pages.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/column.count.index.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/column.count.index.xml
new file mode 100644
index 0000000..e485448
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/column.count.index.xml
@@ -0,0 +1,27 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="column.count.index">
+<refmeta>
+<refentrytitle>column.count.index</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">integer</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>column.count.index</refname>
+<refpurpose>Number of columns on index pages</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="column.count.index.frag">
+<xsl:param name="column.count.index">2</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Number of columns on index pages.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/column.count.lot.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/column.count.lot.xml
new file mode 100644
index 0000000..770988d
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/column.count.lot.xml
@@ -0,0 +1,28 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="column.count.lot">
+<refmeta>
+<refentrytitle>column.count.lot</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">integer</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>column.count.lot</refname>
+<refpurpose>Number of columns on a 'List-of-Titles' page</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="column.count.lot.frag">
+<xsl:param name="column.count.lot" select="1"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Number of columns on a page sequence containing the Table of Contents,
+List of Figures, etc.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/column.count.titlepage.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/column.count.titlepage.xml
new file mode 100644
index 0000000..3deba6f
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/column.count.titlepage.xml
@@ -0,0 +1,27 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="column.count.titlepage">
+<refmeta>
+<refentrytitle>column.count.titlepage</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">integer</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>column.count.titlepage</refname>
+<refpurpose>Number of columns on a title page</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="column.count.titlepage.frag">
+<xsl:param name="column.count.titlepage" select="1"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Number of columns on a title page</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/column.gap.back.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/column.gap.back.xml
new file mode 100644
index 0000000..3aaa1d3
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/column.gap.back.xml
@@ -0,0 +1,28 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="column.gap.back">
+<refmeta>
+<refentrytitle>column.gap.back</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">length</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>column.gap.back</refname>
+<refpurpose>Gap between columns in back matter</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="column.gap.back.frag">
+<xsl:param name="column.gap.back">12pt</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies the gap between columns in back matter (if
+<parameter>column.count.back</parameter> is greater than one).</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/column.gap.body.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/column.gap.body.xml
new file mode 100644
index 0000000..57b0168
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/column.gap.body.xml
@@ -0,0 +1,28 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="column.gap.body">
+<refmeta>
+<refentrytitle>column.gap.body</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">length</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>column.gap.body</refname>
+<refpurpose>Gap between columns in the body</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="column.gap.body.frag">
+<xsl:param name="column.gap.body">12pt</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies the gap between columns in body matter (if
+<parameter>column.count.body</parameter> is greater than one).</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/column.gap.front.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/column.gap.front.xml
new file mode 100644
index 0000000..a6f7263
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/column.gap.front.xml
@@ -0,0 +1,28 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="column.gap.front">
+<refmeta>
+<refentrytitle>column.gap.front</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">length</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>column.gap.front</refname>
+<refpurpose>Gap between columns in the front matter</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="column.gap.front.frag">
+<xsl:param name="column.gap.front">12pt</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies the gap between columns in front matter (if
+<parameter>column.count.front</parameter> is greater than one).</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/column.gap.index.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/column.gap.index.xml
new file mode 100644
index 0000000..2279f77
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/column.gap.index.xml
@@ -0,0 +1,28 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="column.gap.index">
+<refmeta>
+<refentrytitle>column.gap.index</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">length</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>column.gap.index</refname>
+<refpurpose>Gap between columns in the index</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="column.gap.index.frag">
+<xsl:param name="column.gap.index">12pt</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies the gap between columns in indexes (if
+<parameter>column.count.index</parameter> is greater than one).</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/column.gap.lot.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/column.gap.lot.xml
new file mode 100644
index 0000000..da0fa00
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/column.gap.lot.xml
@@ -0,0 +1,28 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="column.gap.lot">
+<refmeta>
+<refentrytitle>column.gap.lot</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">length</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>column.gap.lot</refname>
+<refpurpose>Gap between columns on a 'List-of-Titles' page</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="column.gap.lot.frag">
+<xsl:param name="column.gap.lot">12pt</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies the gap between columns on 'List-of-Titles' pages (if
+<parameter>column.count.lot</parameter> is greater than one).</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/column.gap.titlepage.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/column.gap.titlepage.xml
new file mode 100644
index 0000000..7c13dbd
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/column.gap.titlepage.xml
@@ -0,0 +1,29 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="column.gap.titlepage">
+<refmeta>
+<refentrytitle>column.gap.titlepage</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">length</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>column.gap.titlepage</refname>
+<refpurpose>Gap between columns on title pages</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="column.gap.titlepage.frag">
+<xsl:param name="column.gap.titlepage">12pt</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies the gap between columns on title pages (if
+<parameter>column.count.titlepage</parameter> is greater than one).</para>
+
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/compact.list.item.spacing.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/compact.list.item.spacing.xml
new file mode 100644
index 0000000..f48f4a6
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/compact.list.item.spacing.xml
@@ -0,0 +1,28 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="compact.list.item.spacing">
+<refmeta>
+<refentrytitle>compact.list.item.spacing</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>compact.list.item.spacing</refname>
+<refpurpose>What space do you want between list items (when spacing="compact")?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="compact.list.item.spacing.frag"><xsl:attribute-set name="compact.list.item.spacing">
+ <xsl:attribute name="space-before.optimum">0em</xsl:attribute>
+ <xsl:attribute name="space-before.minimum">0em</xsl:attribute>
+ <xsl:attribute name="space-before.maximum">0.2em</xsl:attribute>
+</xsl:attribute-set></src:fragment>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+<para>Specify what spacing you want between each list item when
+<tag class="attribute">spacing</tag> is
+<quote><literal>compact</literal></quote>.</para>
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/component.label.includes.part.label.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/component.label.includes.part.label.xml
new file mode 100644
index 0000000..6dd7a68
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/component.label.includes.part.label.xml
@@ -0,0 +1,39 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="component.label.includes.part.label">
+<refmeta>
+<refentrytitle>component.label.includes.part.label</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>component.label.includes.part.label</refname>
+<refpurpose>Do component labels include the part label?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="component.label.includes.part.label.frag"><xsl:param name="component.label.includes.part.label" select="0"/></src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, number labels for <tag>chapter</tag>,
+<tag>appendix</tag>, and other component elements are prefixed with
+the label of the part element that contains them. So you might see
+Chapter II.3 instead of Chapter 3. Also, the labels for formal
+elements such as <tag>table</tag> and <tag>figure</tag> will include
+the part label. If there is no part element container, then no prefix
+is generated.
+</para>
+<para>
+This feature is most useful when the
+<parameter>label.from.part</parameter> parameter is turned on.
+In that case, there would be more than one <tag>chapter</tag>
+<quote>1</quote>, and the extra part label prefix will identify
+each chapter unambiguously.
+</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/component.title.properties.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/component.title.properties.xml
new file mode 100644
index 0000000..58cd4b4
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/component.title.properties.xml
@@ -0,0 +1,40 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="component.title.properties">
+<refmeta>
+<refentrytitle>component.title.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>component.title.properties</refname>
+<refpurpose>Properties for component titles</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="component.title.properties.frag">
+<xsl:attribute-set name="component.title.properties">
+ <xsl:attribute name="keep-with-next.within-column">always</xsl:attribute>
+ <xsl:attribute name="space-before.optimum"><xsl:value-of select="concat($body.font.master, 'pt')"/></xsl:attribute>
+ <xsl:attribute name="space-before.minimum"><xsl:value-of select="concat($body.font.master, 'pt * 0.8')"/></xsl:attribute>
+ <xsl:attribute name="space-before.maximum"><xsl:value-of select="concat($body.font.master, 'pt * 1.2')"/></xsl:attribute>
+ <xsl:attribute name="hyphenate">false</xsl:attribute>
+ <xsl:attribute name="text-align">
+ <xsl:choose>
+ <xsl:when test="((parent::article | parent::articleinfo | parent::info/parent::article) and not(ancestor::book) and not(self::bibliography)) or (parent::slides | parent::slidesinfo)">center</xsl:when>
+ <xsl:otherwise>start</xsl:otherwise>
+ </xsl:choose>
+ </xsl:attribute>
+ <xsl:attribute name="start-indent"><xsl:value-of select="$title.margin.left"/></xsl:attribute>
+</xsl:attribute-set>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The properties common to all component titles.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/component.titlepage.properties.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/component.titlepage.properties.xml
new file mode 100644
index 0000000..47179f4
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/component.titlepage.properties.xml
@@ -0,0 +1,33 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="component.titlepage.properties">
+<refmeta>
+<refentrytitle>component.titlepage.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>component.titlepage.properties</refname>
+<refpurpose>Properties for component titlepages</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="component.titlepage.properties.frag">
+<xsl:attribute-set name="component.titlepage.properties">
+</xsl:attribute-set>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The properties that are applied to the outer block containing
+all the component title page information.
+Its main use is to set a <literal>span="all"</literal>
+property on the block that is a direct child of the flow.</para>
+
+<para>This attribute-set also applies to index titlepages. It is empty by default.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/contrib.inline.enabled.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/contrib.inline.enabled.xml
new file mode 100644
index 0000000..5d5fa99
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/contrib.inline.enabled.xml
@@ -0,0 +1,26 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="contrib.inline.enabled">
+<refmeta>
+<refentrytitle>contrib.inline.enabled</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>contrib.inline.enabled</refname>
+<refpurpose>Display contrib output inline?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="contrib.inline.enabled.frag"><xsl:param name="contrib.inline.enabled">1</xsl:param></src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero (the default), output of the <tag>contrib</tag> element is
+displayed as inline content rather than as block content.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/crop.mark.bleed.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/crop.mark.bleed.xml
new file mode 100644
index 0000000..af3420e
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/crop.mark.bleed.xml
@@ -0,0 +1,28 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="crop.mark.bleed">
+<refmeta>
+<refentrytitle>crop.mark.bleed</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">length</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>crop.mark.bleed</refname>
+<refpurpose>Length of invisible part of crop marks.</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="crop.mark.bleed.frag">
+<xsl:param name="crop.mark.bleed">6pt</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Length of invisible part of crop marks. Crop marks are controlled by
+<parameter>crop.marks</parameter> parameter.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/crop.mark.offset.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/crop.mark.offset.xml
new file mode 100644
index 0000000..cfd9bd3
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/crop.mark.offset.xml
@@ -0,0 +1,28 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="crop.mark.offset">
+<refmeta>
+<refentrytitle>crop.mark.offset</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">length</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>crop.mark.offset</refname>
+<refpurpose>Length of crop marks.</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="crop.mark.offset.frag">
+<xsl:param name="crop.mark.offset">24pt</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Length of crop marks. Crop marks are controlled by
+<parameter>crop.marks</parameter> parameter.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/crop.mark.width.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/crop.mark.width.xml
new file mode 100644
index 0000000..86c28b5
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/crop.mark.width.xml
@@ -0,0 +1,28 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="crop.mark.width">
+<refmeta>
+<refentrytitle>crop.mark.width</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">length</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>crop.mark.width</refname>
+<refpurpose>Width of crop marks.</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="crop.mark.width.frag">
+<xsl:param name="crop.mark.width">0.5pt</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Width of crop marks. Crop marks are controlled by
+<parameter>crop.marks</parameter> parameter.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/crop.marks.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/crop.marks.xml
new file mode 100644
index 0000000..c68d5a0
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/crop.marks.xml
@@ -0,0 +1,28 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="crop.marks">
+<refmeta>
+<refentrytitle>crop.marks</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>crop.marks</refname>
+<refpurpose>Output crop marks?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="crop.marks.frag">
+<xsl:param name="crop.marks" select="0"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, crop marks will be added to each page. Currently this
+works only with XEP if you have <parameter>xep.extensions</parameter> set.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/css.decoration.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/css.decoration.xml
new file mode 100644
index 0000000..02e3026
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/css.decoration.xml
@@ -0,0 +1,33 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="css.decoration">
+<refmeta>
+<refentrytitle>css.decoration</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>css.decoration</refname>
+<refpurpose>Enable CSS decoration of elements</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="css.decoration.frag">
+<xsl:param name="css.decoration" select="1"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>
+If non-zero, then html elements produced by the stylesheet may be
+decorated with <literal>style</literal> attributes. For example, the
+<literal>li</literal> tags produced for list items may include a
+fragment of CSS in the <literal>style</literal> attribute which sets
+the CSS property "list-style-type".
+</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/css.stylesheet.dir.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/css.stylesheet.dir.xml
new file mode 100644
index 0000000..e32b178
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/css.stylesheet.dir.xml
@@ -0,0 +1,33 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="css.stylesheet.dir">
+<refmeta>
+<refentrytitle>css.stylesheet.dir</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">uri</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>css.stylesheet.dir</refname>
+<refpurpose>Default directory for CSS stylesheets</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="css.stylesheet.dir.frag">
+<xsl:param name="css.stylesheet.dir"></xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Identifies the default directory for the CSS stylesheet
+generated on all the slides. This parameter can be set in the source
+document with the &lt;?dbhtml?&gt; pseudo-attribute
+<literal>css-stylesheet-dir</literal>.</para>
+
+<para>If non-empty, this value is prepended to each of the stylesheets.
+</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/css.stylesheet.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/css.stylesheet.xml
new file mode 100644
index 0000000..2acc66c
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/css.stylesheet.xml
@@ -0,0 +1,29 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="css.stylesheet">
+<refmeta>
+<refentrytitle>css.stylesheet</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">uri</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>css.stylesheet</refname>
+<refpurpose>CSS stylesheet for slides</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="css.stylesheet.frag">
+<xsl:param name="css.stylesheet">slides.css</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Identifies the CSS stylesheet used by all the slides. This parameter
+can be set in the source document with the &lt;?dbhtml?&gt; pseudo-attribute
+<literal>css-stylesheet</literal>.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/current.docid.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/current.docid.xml
new file mode 100644
index 0000000..93616f2
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/current.docid.xml
@@ -0,0 +1,27 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="current.docid">
+<refmeta>
+<refentrytitle>current.docid</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>current.docid</refname>
+<refpurpose>targetdoc identifier for the document being
+processed</refpurpose>
+</refnamediv>
+<refsynopsisdiv> <src:fragment xml:id="current.docid.frag">
+<xsl:param name="current.docid"/>
+</src:fragment>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+
+<para>When olinks between documents are resolved for HTML output, the stylesheet can compute the relative path between the current document and the target document. The stylesheet needs to know the <literal>targetdoc</literal> identifiers for both documents, as they appear in the <parameter>target.database.document</parameter> database file. This parameter passes to the stylesheet
+the targetdoc identifier of the current document, since that
+identifier does not appear in the document itself. </para>
+<para>This parameter can also be used for print output. If an olink's <literal>targetdoc</literal> id differs from the <literal>current.docid</literal>, then the stylesheet can append the target document's title to the generated olink text. That identifies to the reader that the link is to a different document, not the current document. See also <parameter>olink.doctitle</parameter> to enable that feature.</para>
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/currentpage.marker.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/currentpage.marker.xml
new file mode 100644
index 0000000..2bccf30
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/currentpage.marker.xml
@@ -0,0 +1,25 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="currentpage.marker">
+<refmeta>
+<refentrytitle>currentpage.marker</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>currentpage.marker</refname>
+<refpurpose>The text symbol used to mark the current page</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="currentpage.marker.frag">
+<xsl:param name="currentpage.marker">@</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+<para>Character to use as identifying the current page in </para>
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/custom.css.source.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/custom.css.source.xml
new file mode 100644
index 0000000..24278ad
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/custom.css.source.xml
@@ -0,0 +1,119 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="custom.css.source">
+ <refmeta>
+ <refentrytitle>custom.css.source</refentrytitle>
+ <refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+ </refmeta>
+ <refnamediv>
+ <refname>custom.css.source</refname>
+ <refpurpose>Name of a custom CSS input file</refpurpose>
+ </refnamediv>
+
+ <refsynopsisdiv>
+ <src:fragment xml:id="custom.css.source.frag"><xsl:param name="custom.css.source"></xsl:param></src:fragment>
+ </refsynopsisdiv>
+
+ <refsection><info><title>Description</title></info>
+
+<para>The <parameter>custom.css.source</parameter>
+parameter enables you to add CSS styles to DocBook's
+HTML output.</para>
+
+<para>The parameter
+specifies the name of a file containing custom
+CSS styles. The file must be a well-formed XML file that
+consists of a single <tag>style</tag> root
+element that contains CSS styles as its text content.
+For example:</para>
+<programlisting><![CDATA[<?xml version="1.0"?>
+<style>
+h2 {
+ font-weight: bold;
+ color: blue;
+}
+...
+</style>
+]]></programlisting>
+
+<para>The filename specified by the parameter
+should have a <literal>.xml</literal>
+filename suffix, although that is not required.
+The default value of this parameter is blank.</para>
+
+<para>If <parameter>custom.css.source</parameter> is not blank, then
+the stylesheet takes the following actions.
+These actions take place regardless of the value of
+the <parameter>make.clean.html</parameter> parameter.</para>
+
+<orderedlist>
+ <listitem>
+ <para>The stylesheet uses the XSLT <literal>document()</literal>
+ function to open the file specified by the parameter and
+ load it into a variable.</para>
+ </listitem>
+ <listitem>
+ <para>The stylesheet forms an output pathname consisting of the
+ value of the <parameter>base.dir</parameter> parameter (if it is set)
+ and the value of <parameter>custom.css.source</parameter>,
+ with the <literal>.xml</literal> suffix stripped off.
+ </para>
+ </listitem>
+ <listitem>
+ <para>The stylesheet removes the <tag>style</tag>
+ wrapper element and writes just the CSS text content to the output file.</para>
+ </listitem>
+ <listitem>
+ <para>The stylesheet adds a <tag>link</tag> element to the
+ HTML <tag>HEAD</tag> element to reference this external CSS stylesheet.
+ For example:
+ <programlisting>&lt;link rel="stylesheet" href="custom.css" type="text/css"&gt;
+ </programlisting>
+ </para>
+ </listitem>
+</orderedlist>
+
+
+
+<para>If the <parameter>make.clean.html</parameter> parameter is nonzero
+(the default is zero),
+and if the <parameter>docbook.css.source</parameter> parameter
+is not blank (the default is not blank),
+then the stylesheet will also generate a default CSS file
+and add a <tag>link</tag> tag to reference it.
+The <tag>link</tag> to the custom CSS comes after the
+<tag>link</tag> to the default, so it should cascade properly
+in most browsers.
+If you do not want two <tag>link</tag> tags, and
+instead want your custom CSS to import the default generated
+CSS file, then do the following:
+</para>
+
+<orderedlist>
+ <listitem>
+ <para>Add a line like the following to your custom CSS source file:</para>
+ <programlisting>@import url("docbook.css")
+ </programlisting>
+ </listitem>
+ <listitem>
+ <para>Set the <parameter>docbook.css.link</parameter> parameter
+ to zero. This will omit the <tag>link</tag> tag
+ that references the default CSS file.</para>
+ </listitem>
+</orderedlist>
+
+<para>If you set <parameter>make.clean.html</parameter> to nonzero but
+you do not want the default CSS generated, then also set
+the <parameter>docbook.css.source</parameter> parameter to blank.
+Then no default CSS will be generated, and so
+all CSS styles must come from your custom CSS file.</para>
+
+<para>You can use the <parameter>generate.css.header</parameter>
+parameter to instead write the CSS to each HTML <tag>HEAD</tag>
+element in a <tag>style</tag> tag instead of an external CSS file.</para>
+
+ </refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/default.float.class.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/default.float.class.xml
new file mode 100644
index 0000000..1078b60
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/default.float.class.xml
@@ -0,0 +1,34 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="default.float.class">
+<refmeta>
+<refentrytitle>default.float.class</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>default.float.class</refname>
+<refpurpose>Specifies the default float class</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="default.float.class.frag">
+<xsl:param name="default.float.class">
+ <xsl:choose>
+ <xsl:when test="contains($stylesheet.result.type,'html')">left</xsl:when>
+ <xsl:otherwise>before</xsl:otherwise>
+ </xsl:choose>
+</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Selects the direction in which a float should be placed. for
+xsl-fo this is before, for html it is left. For Western texts, the
+before direction is the top of the page.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/default.image.width.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/default.image.width.xml
new file mode 100644
index 0000000..0e84a72
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/default.image.width.xml
@@ -0,0 +1,30 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="default.image.width">
+<refmeta>
+<refentrytitle>default.image.width</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">length</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>default.image.width</refname>
+<refpurpose>The default width of images</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="default.image.width.frag">
+<xsl:param name="default.image.width"></xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If specified, this value will be used for the
+<tag class="attribute">width</tag> attribute on images that do not specify any
+<emphasis xlink:title="DocBook 5: The Definitive Guide"
+ xlink:href="http://docbook.org/tdg5/en/html/imagedata.html#viewport.area">viewport dimensions</emphasis>.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/default.table.frame.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/default.table.frame.xml
new file mode 100644
index 0000000..38c8667
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/default.table.frame.xml
@@ -0,0 +1,28 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="default.table.frame">
+<refmeta>
+<refentrytitle>default.table.frame</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>default.table.frame</refname>
+<refpurpose>The default framing of tables</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="default.table.frame.frag">
+<xsl:param name="default.table.frame">all</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>This value will be used when there is no frame attribute on the
+table. </para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/default.table.rules.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/default.table.rules.xml
new file mode 100644
index 0000000..ed698ec
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/default.table.rules.xml
@@ -0,0 +1,76 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="default.table.rules">
+<refmeta>
+<refentrytitle>default.table.rules</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>default.table.rules</refname>
+<refpurpose>The default column and row rules for tables using HTML markup</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="default.table.rules.frag">
+<xsl:param name="default.table.rules">none</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Tables using HTML markup elements can use an attribute
+named <tag class="attribute">rules</tag> on the <tag>table</tag> or
+<tag>informaltable</tag> element
+to specify whether column and row border rules should be
+displayed. This parameter lets you specify a global default
+style for all HTML tables that don't otherwise have
+that attribute.</para>
+<para>These are the supported values:</para>
+
+<variablelist>
+<varlistentry><term>all</term>
+<listitem>
+<para>Rules will appear between all rows and columns.</para>
+</listitem>
+</varlistentry>
+
+<varlistentry><term>rows</term>
+<listitem>
+<para>Rules will appear between rows only.</para>
+</listitem>
+</varlistentry>
+
+<varlistentry><term>cols</term>
+<listitem>
+<para>Rules will appear between columns only.</para>
+</listitem>
+</varlistentry>
+
+<varlistentry><term>groups</term>
+<listitem>
+<para>Rules will appear between row groups (thead, tfoot, tbody).
+No support for rules between column groups yet.
+</para>
+</listitem>
+</varlistentry>
+
+<varlistentry><term>none</term>
+<listitem>
+<para>No rules. This is the default value.
+</para>
+</listitem>
+</varlistentry>
+
+</variablelist>
+
+<para>The border after the last row and the border after
+the last column are not affected by
+this setting. Those borders are controlled by
+the <tag class="attribute">frame</tag> attribute on the table element.
+</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/default.table.width.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/default.table.width.xml
new file mode 100644
index 0000000..184ce52
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/default.table.width.xml
@@ -0,0 +1,26 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="default.table.width">
+<refmeta>
+<refentrytitle>default.table.width</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">length</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>default.table.width</refname>
+<refpurpose>The default width of tables</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+<src:fragment xml:id="default.table.width.frag">
+<xsl:param name="default.table.width"></xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+<para>If non-zero, this value will be used for the
+<literal>width</literal> attribute on <tag>table</tag>s that do not specify an
+alternate width (with the <tag class="xmlpi">dbhtml table-width</tag> or
+<tag class="xmlpi">dbfo table-width</tag> processing instruction).</para>
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/default.units.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/default.units.xml
new file mode 100644
index 0000000..f83c822
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/default.units.xml
@@ -0,0 +1,37 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="default.units">
+<refmeta>
+<refentrytitle>default.units</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">list</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">cm</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">mm</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">in</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">pt</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">pc</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">px</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">em</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>default.units</refname>
+<refpurpose>Default units for an unqualified dimension</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="default.units.frag">
+<xsl:param name="default.units">pt</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If an unqualified dimension is encountered (for example, in a
+graphic width), the <parameter>default.units</parameter> will be used for the
+units. Unqualified dimensions are not allowed in XSL Formatting Objects.
+</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/dingbat.font.family.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/dingbat.font.family.xml
new file mode 100644
index 0000000..f9719cf
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/dingbat.font.family.xml
@@ -0,0 +1,33 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="dingbat.font.family">
+<refmeta>
+<refentrytitle>dingbat.font.family</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">list</refmiscinfo>
+<refmiscinfo class="other" otherclass="list-type">open</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">serif</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">sans-serif</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">monospace</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>dingbat.font.family</refname>
+<refpurpose>The font family for copyright, quotes, and other symbols</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="dingbat.font.family.frag">
+<xsl:param name="dingbat.font.family">serif</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The dingbat font family is used for dingbats. If it is defined
+as the empty string, no font change is effected around dingbats.
+</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/docbook.css.link.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/docbook.css.link.xml
new file mode 100644
index 0000000..6d9e6e6
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/docbook.css.link.xml
@@ -0,0 +1,42 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="docbook.css.link">
+<refmeta>
+<refentrytitle>docbook.css.link</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>docbook.css.link</refname>
+<refpurpose>Insert a link referencing the default CSS stylesheet</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="docbook.css.link.frag">
+<xsl:param name="docbook.css.link" select="1"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The stylesheets are capable of generating a default
+CSS stylesheet file. The parameters
+<parameter>make.clean.html</parameter> and
+<parameter>docbook.css.source</parameter> control that feature.</para>
+
+<para>Normally if a default CSS file is generated, then
+the stylesheet inserts a <tag>link</tag> tag in the HTML
+<tag>HEAD</tag> element to reference it.
+However, you can omit that <tag>link</tag> reference if
+you set the <parameter>docbook.css.link</parameter> to zero
+(1 is the default).</para>
+
+<para>This parameter is useful when you want to import the
+default CSS into a custom CSS file generated using the
+<parameter>custom.css.source</parameter> parameter.
+</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/docbook.css.source.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/docbook.css.source.xml
new file mode 100644
index 0000000..8ba7eb7
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/docbook.css.source.xml
@@ -0,0 +1,83 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="docbook.css.source">
+ <refmeta>
+ <refentrytitle>docbook.css.source</refentrytitle>
+ <refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+ </refmeta>
+ <refnamediv>
+ <refname>docbook.css.source</refname>
+ <refpurpose>Name of the default CSS input file</refpurpose>
+ </refnamediv>
+
+ <refsynopsisdiv>
+ <src:fragment xml:id="docbook.css.source.frag"><xsl:param name="docbook.css.source">docbook.css.xml</xsl:param></src:fragment>
+ </refsynopsisdiv>
+
+ <refsection><info><title>Description</title></info>
+
+<para>The <parameter>docbook.css.source</parameter> parameter
+specifies the name of the file containing the default DocBook
+CSS styles. Those styles are necessary when the
+<parameter>make.clean.html</parameter> parameter is nonzero.</para>
+
+<para>The file is a well-formed XML file that
+must consist of a single <tag>style</tag> root
+element that contains CSS styles as its text content.
+The default value of the parameter (and filename)
+is <literal>docbook.css.xml</literal>.
+The stylesheets ship with the default file. You can substitute
+your own and specify its path in this parameter.</para>
+
+<para>If <parameter>docbook.css.source</parameter> is not blank,
+and <parameter>make.clean.html</parameter> is nonzero, then
+the stylesheet takes the following actions:</para>
+
+<orderedlist>
+ <listitem>
+ <para>The stylesheet uses the XSLT <literal>document()</literal>
+ function to open the file specified by the parameter and
+ load it into a variable.</para>
+ </listitem>
+ <listitem>
+ <para>The stylesheet forms an output pathname consisting of the
+ value of the <parameter>base.dir</parameter> parameter (if it is set)
+ and the value of <parameter>docbook.css.source</parameter>,
+ with the <literal>.xml</literal> suffix stripped off.
+ </para>
+ </listitem>
+ <listitem>
+ <para>The stylesheet removes the <tag>style</tag>
+ wrapper element and writes just the CSS text content to the output file.</para>
+ </listitem>
+ <listitem>
+ <para>The stylesheet adds a <tag>link</tag> element to the
+ HTML <tag>HEAD</tag> element to reference the external CSS stylesheet.
+ For example:</para>
+ <programlisting>&lt;link rel="stylesheet" href="docbook.css" type="text/css"&gt;
+ </programlisting>
+ <para>However, if the <parameter>docbook.css.link</parameter>
+ parameter is set to zero, then no <tag>link</tag> is written
+ for the default CSS file. That is useful if a custom
+ CSS file will import the default CSS stylesheet to ensure
+ proper cascading of styles.</para>
+ </listitem>
+</orderedlist>
+
+<para>If the <parameter>docbook.css.source</parameter> parameter
+is changed from its default <literal>docbook.css.xml</literal> to blank,
+then no default CSS is generated. Likewise if the
+<parameter>make.clean.html</parameter> parameter is set to zero,
+then no default CSS is generated. The
+<parameter>custom.css.source</parameter> parameter can be used
+instead to generate a complete custom CSS file.</para>
+
+<para>You can use the <parameter>generate.css.header</parameter>
+parameter to instead write the CSS to each HTML <tag>HEAD</tag>
+element in a <tag>style</tag> tag instead of an external CSS file.</para>
+
+ </refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/double.sided.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/double.sided.xml
new file mode 100644
index 0000000..3758f1f
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/double.sided.xml
@@ -0,0 +1,31 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="double.sided">
+<refmeta>
+<refentrytitle>double.sided</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>double.sided</refname>
+<refpurpose>Is the document to be printed double sided?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="double.sided.frag">
+<xsl:param name="double.sided" select="0"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Double-sided documents are printed with a slightly wider margin
+on the binding edge of the page.
+</para>
+<para>FIXME: The current set of parameters does not take writing direction
+into account.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/draft.mode.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/draft.mode.xml
new file mode 100644
index 0000000..2f62d06
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/draft.mode.xml
@@ -0,0 +1,36 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="draft.mode">
+<refmeta>
+<refentrytitle>draft.mode</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">list</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">no</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">yes</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">maybe</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>draft.mode</refname>
+<refpurpose>Select draft mode</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="draft.mode.frag">
+<xsl:param name="draft.mode">no</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Selects draft mode. If <parameter>draft.mode</parameter> is
+<quote><literal>yes</literal></quote>, the entire document will be treated
+as a draft. If it is <quote><literal>no</literal></quote>, the entire document
+will be treated as a final copy. If it is <quote><literal>maybe</literal></quote>,
+individual sections will be treated as draft or final independently, depending
+on how their <literal>status</literal> attribute is set.
+</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/draft.watermark.image.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/draft.watermark.image.xml
new file mode 100644
index 0000000..ef053a0
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/draft.watermark.image.xml
@@ -0,0 +1,27 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="draft.watermark.image">
+<refmeta>
+<refentrytitle>draft.watermark.image</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">uri</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>draft.watermark.image</refname>
+<refpurpose>The URI of the image to be used for draft watermarks</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="draft.watermark.image.frag">
+<xsl:param name="draft.watermark.image">images/draft.png</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The image to be used for draft watermarks.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/dry-run.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/dry-run.xml
new file mode 100644
index 0000000..dd481c3
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/dry-run.xml
@@ -0,0 +1,27 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="dry-run">
+<refmeta>
+<refentrytitle>dry-run</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>dry-run</refname>
+<refpurpose>Indicates that no files should be produced</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+ <src:fragment xml:id="dry-run.frag">
+ <xsl:param name="dry-run" select="0"/>
+ </src:fragment>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+<para>When using the XSLT processor to manage dependencies and construct
+the website, this parameter can be used to suppress the generation of
+new and updated files. Effectively, this allows you to see what the
+stylesheet would do, without actually making any changes.</para>
+<para>Only applies when XSLT-based chunking is being used.</para>
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/dynamic.toc.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/dynamic.toc.xml
new file mode 100644
index 0000000..232f19e
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/dynamic.toc.xml
@@ -0,0 +1,29 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="dynamic.toc">
+<refmeta>
+<refentrytitle>dynamic.toc</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>dynamic.toc</refname>
+<refpurpose>Dynamic ToCs?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="dynamic.toc.frag">
+<xsl:param name="dynamic.toc" select="0"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, JavaScript is used to make the ToC panel <quote>dynamic</quote>.
+In a dynamic ToC, each section in the ToC can be expanded and collapsed by
+clicking on the appropriate image.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/ebnf.assignment.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/ebnf.assignment.xml
new file mode 100644
index 0000000..5c89748
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/ebnf.assignment.xml
@@ -0,0 +1,39 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="ebnf.assignment">
+<refmeta>
+<refentrytitle>ebnf.assignment</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">rtf</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>ebnf.assignment</refname>
+<refpurpose>The EBNF production assignment operator</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="ebnf.assignment.frag">
+<xsl:param condition="html" name="ebnf.assignment">
+<code xmlns="">::=</code>
+</xsl:param>
+<xsl:param xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" condition="fo" name="ebnf.assignment">
+ <fo:inline font-family="{$monospace.font.family}">
+ <xsl:text>::=</xsl:text>
+ </fo:inline>
+</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The <parameter>ebnf.assignment</parameter> parameter determines what
+text is used to show <quote>assignment</quote> in <tag>production</tag>s
+in <tag>productionset</tag>s.</para>
+
+<para>While <quote><literal>::=</literal></quote> is common, so are several
+other operators.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/ebnf.statement.terminator.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/ebnf.statement.terminator.xml
new file mode 100644
index 0000000..4e8bd12
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/ebnf.statement.terminator.xml
@@ -0,0 +1,32 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="ebnf.statement.terminator">
+<refmeta>
+<refentrytitle>ebnf.statement.terminator</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">rtf</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>ebnf.statement.terminator</refname>
+<refpurpose>Punctuation that ends an EBNF statement.</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="ebnf.statement.terminator.frag">
+<xsl:param condition="html" name="ebnf.statement.terminator"/>
+<xsl:param condition="fo" name="ebnf.statement.terminator"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The <parameter>ebnf.statement.terminator</parameter> parameter determines what
+text is used to terminate each <tag>production</tag>
+in <tag>productionset</tag>.</para>
+
+<para>Some notations end each statement with a period.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/ebnf.table.bgcolor.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/ebnf.table.bgcolor.xml
new file mode 100644
index 0000000..747f140
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/ebnf.table.bgcolor.xml
@@ -0,0 +1,30 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="ebnf.table.bgcolor">
+<refmeta>
+<refentrytitle>ebnf.table.bgcolor</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">color</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>ebnf.table.bgcolor</refname>
+<refpurpose>Background color for EBNF tables</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="ebnf.table.bgcolor.frag">
+<xsl:param name="ebnf.table.bgcolor" >#F5DCB3</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Sets the background color for EBNF tables (a pale brown). No
+<tag>bgcolor</tag> attribute is output if
+<parameter>ebnf.table.bgcolor</parameter> is set to the null string. </para>
+
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/ebnf.table.border.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/ebnf.table.border.xml
new file mode 100644
index 0000000..e4e50ae
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/ebnf.table.border.xml
@@ -0,0 +1,26 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="ebnf.table.border">
+<refmeta>
+<refentrytitle>ebnf.table.border</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>ebnf.table.border</refname>
+<refpurpose>Selects border on EBNF tables</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="ebnf.table.border.frag"><xsl:param name="ebnf.table.border" select="1"/></src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Selects the border on EBNF tables. If non-zero, the tables have
+borders, otherwise they don't.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/eclipse.autolabel.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/eclipse.autolabel.xml
new file mode 100644
index 0000000..622196e
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/eclipse.autolabel.xml
@@ -0,0 +1,28 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="eclipse.autolabel">
+<refmeta>
+<refentrytitle>eclipse.autolabel</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>eclipse.autolabel</refname>
+<refpurpose>Should tree-like ToC use autonumbering feature?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="eclipse.autolabel.frag">
+<xsl:param name="eclipse.autolabel" select="0"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If you want to include chapter and section numbers into ToC in
+the left panel, set this parameter to 1.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/eclipse.plugin.id.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/eclipse.plugin.id.xml
new file mode 100644
index 0000000..75557e5
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/eclipse.plugin.id.xml
@@ -0,0 +1,28 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="eclipse.plugin.id">
+<refmeta>
+<refentrytitle>eclipse.plugin.id</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>eclipse.plugin.id</refname>
+<refpurpose>Eclipse Help plugin id</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="eclipse.plugin.id.frag">
+<xsl:param name="eclipse.plugin.id">com.example.help</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Eclipse Help plugin id. You should change this id to something
+unique for each help.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/eclipse.plugin.name.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/eclipse.plugin.name.xml
new file mode 100644
index 0000000..0df83ec
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/eclipse.plugin.name.xml
@@ -0,0 +1,27 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="eclipse.plugin.name">
+<refmeta>
+<refentrytitle>eclipse.plugin.name</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>eclipse.plugin.name</refname>
+<refpurpose>Eclipse Help plugin name</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="eclipse.plugin.name.frag">
+<xsl:param name="eclipse.plugin.name">DocBook Online Help Sample</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Eclipse Help plugin name.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/eclipse.plugin.provider.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/eclipse.plugin.provider.xml
new file mode 100644
index 0000000..03261fe
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/eclipse.plugin.provider.xml
@@ -0,0 +1,27 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="eclipse.plugin.provider">
+<refmeta>
+<refentrytitle>eclipse.plugin.provider</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>eclipse.plugin.provider</refname>
+<refpurpose>Eclipse Help plugin provider name</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="eclipse.plugin.provider.frag">
+<xsl:param name="eclipse.plugin.provider">Example provider</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Eclipse Help plugin provider name.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/editedby.enabled.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/editedby.enabled.xml
new file mode 100644
index 0000000..78089f9
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/editedby.enabled.xml
@@ -0,0 +1,27 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="editedby.enabled">
+<refmeta>
+<refentrytitle>editedby.enabled</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>editedby.enabled</refname>
+<refpurpose>Display “Edited by†heading above editor name?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="editedby.enabled.frag"><xsl:param name="editedby.enabled">1</xsl:param></src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, a localized <emphasis role="bold">Edited
+by</emphasis> heading is displayed above editor names in output of the
+<tag>editor</tag> element.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/email.delimiters.enabled.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/email.delimiters.enabled.xml
new file mode 100644
index 0000000..b07cd6d
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/email.delimiters.enabled.xml
@@ -0,0 +1,34 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="email.delimiters.enabled">
+<refmeta>
+<refentrytitle>email.delimiters.enabled</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>email.delimiters.enabled</refname>
+<refpurpose>Generate delimiters around email addresses?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="email.delimiters.enabled.frag">
+<xsl:param name="email.delimiters.enabled" select="1"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, delimiters
+
+<footnote><para>For delimiters, the
+stylesheets are currently hard-coded to output angle
+brackets.</para></footnote>
+
+are generated around e-mail addresses
+(the output of the <tag>email</tag> element).</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/email.mailto.enabled.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/email.mailto.enabled.xml
new file mode 100644
index 0000000..e4eb8d1
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/email.mailto.enabled.xml
@@ -0,0 +1,29 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="email.mailto.enabled">
+<refmeta>
+<refentrytitle>email.mailto.enabled</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>email.mailto.enabled</refname>
+<refpurpose>Generate mailto: links for email addresses?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="email.mailto.enabled.frag">
+<xsl:param name="email.mailto.enabled" select="0"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero the generated output for the <tag>email</tag> element
+will be a clickable mailto: link that brings up the default mail client
+on the system.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/emphasis.propagates.style.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/emphasis.propagates.style.xml
new file mode 100644
index 0000000..9ff55f5
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/emphasis.propagates.style.xml
@@ -0,0 +1,26 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="emphasis.propagates.style">
+<refmeta>
+<refentrytitle>emphasis.propagates.style</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>emphasis.propagates.style</refname>
+<refpurpose>Pass emphasis role attribute through to HTML?</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+<src:fragment xml:id="emphasis.propagates.style.frag">
+<xsl:param name="emphasis.propagates.style" select="1"/>
+</src:fragment>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+<para>If non-zero, the <literal>role</literal> attribute of
+<tag>emphasis</tag> elements will be passed through to the HTML as a
+class attribute on a <literal>span</literal> that surrounds the
+emphasis.</para>
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/entry.propagates.style.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/entry.propagates.style.xml
new file mode 100644
index 0000000..7f43c66
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/entry.propagates.style.xml
@@ -0,0 +1,30 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="entry.propagates.style">
+<refmeta>
+<refentrytitle>entry.propagates.style</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>entry.propagates.style</refname>
+<refpurpose>Pass entry role attribute through to HTML?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="entry.propagates.style.frag">
+<xsl:param name="entry.propagates.style" select="1"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If true, the role attribute of <tag>entry</tag> elements
+will be passed through to the HTML as a class attribute on the
+<tag>td</tag> or <tag>th</tag> generated for the table
+cell.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/epub.autolabel.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/epub.autolabel.xml
new file mode 100644
index 0000000..8a64555
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/epub.autolabel.xml
@@ -0,0 +1,28 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="epub.autolabel">
+<refmeta>
+<refentrytitle>epub.autolabel</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>epub.autolabel</refname>
+<refpurpose>Should tree-like ToC use autonumbering feature?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="epub.autolabel.frag">
+<xsl:param name="epub.autolabel" select="1"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If you want to include chapter and section numbers into ToC in,
+set this parameter to 1.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/equation.number.properties.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/equation.number.properties.xml
new file mode 100644
index 0000000..6e05d39
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/equation.number.properties.xml
@@ -0,0 +1,28 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="equation.number.properties">
+<refmeta>
+<refentrytitle>equation.number.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>equation.number.properties</refname>
+<refpurpose>Properties that apply to the <tag>fo:table-cell</tag> containing the number
+of an <tag>equation</tag> that does not have a title.</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="equation.number.properties.frag"><xsl:attribute-set name="equation.number.properties">
+ <xsl:attribute name="text-align">end</xsl:attribute>
+ <xsl:attribute name="display-align">center</xsl:attribute>
+</xsl:attribute-set></src:fragment>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+<para>Properties that apply to the fo:table-cell containing the number
+of an equation when it has no title. The number in an equation with a
+title is formatted along with the title, and this attribute-set does not apply.</para>
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/equation.properties.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/equation.properties.xml
new file mode 100644
index 0000000..a88f683
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/equation.properties.xml
@@ -0,0 +1,27 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="equation.properties">
+<refmeta>
+<refentrytitle>equation.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>equation.properties</refname>
+<refpurpose>Properties associated with a equation</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="equation.properties.frag">
+<xsl:attribute-set name="equation.properties" use-attribute-sets="formal.object.properties"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The styling for equations.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/example.properties.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/example.properties.xml
new file mode 100644
index 0000000..53e695b
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/example.properties.xml
@@ -0,0 +1,27 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="example.properties">
+<refmeta>
+<refentrytitle>example.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>example.properties</refname>
+<refpurpose>Properties associated with a example</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="example.properties.frag">
+<xsl:attribute-set name="example.properties" use-attribute-sets="formal.object.properties"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The styling for examples.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/exsl.node.set.available.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/exsl.node.set.available.xml
new file mode 100644
index 0000000..c5d009e
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/exsl.node.set.available.xml
@@ -0,0 +1,44 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:exsl="http://exslt.org/common"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="exsl.node.set.available">
+<refmeta>
+<refentrytitle>exsl.node.set.available</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>exsl.node.set.available</refname>
+<refpurpose>Is the test function-available('exsl:node-set') true?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="exsl.node.set.available.frag"><xsl:param name="exsl.node.set.available">
+ <xsl:choose>
+ <xsl:when exsl:foo="" xmlns:exsl="http://exslt.org/common"
+ test="function-available('exsl:node-set') or
+ contains(system-property('xsl:vendor'),
+ 'Apache Software Foundation')">1</xsl:when>
+ <xsl:otherwise>0</xsl:otherwise>
+ </xsl:choose>
+</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero,
+then the exsl:node-set() function is available to be used in
+the stylesheet.
+If zero, then the function is not available.
+This param automatically detects the presence of
+the function and does not normally need to be set manually.</para>
+
+<para>This param was created to handle a long-standing
+bug in the Xalan processor that fails to detect the
+function even though it is available.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/feedback.href.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/feedback.href.xml
new file mode 100644
index 0000000..bc37daf
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/feedback.href.xml
@@ -0,0 +1,28 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="feedback.href">
+<refmeta>
+<refentrytitle>feedback.href</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">uri</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>feedback.href</refname>
+<refpurpose>HREF (URI) for feedback link</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="feedback.href.frag">
+<xsl:param name="feedback.href"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+<para>The <varname>feedback.href</varname> value is used as the value
+for the <tag class="attribute">href</tag> attribute on the feedback
+link. If <varname>feedback.href</varname>
+is empty, no feedback link is generated.</para>
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/feedback.link.text.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/feedback.link.text.xml
new file mode 100644
index 0000000..c80feef
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/feedback.link.text.xml
@@ -0,0 +1,28 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="feedback.link.text">
+<refmeta>
+<refentrytitle>feedback.link.text</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>feedback.link.text</refname>
+<refpurpose>The text of the feedback link</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="feedback.link.text.frag">
+<xsl:param name="feedback.link.text">Feedback</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+<para>The contents of this variable is used as the text of the feedback
+link if <varname>feedback.href</varname> is not empty. If
+<varname>feedback.href</varname> is empty, no feedback link is
+generated.</para>
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/feedback.with.ids.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/feedback.with.ids.xml
new file mode 100644
index 0000000..3edfa26
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/feedback.with.ids.xml
@@ -0,0 +1,27 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="feedback.with.ids">
+<refmeta>
+<refentrytitle>feedback.with.ids</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>feedback.with.ids</refname>
+<refpurpose>Toggle use of IDs in feedback</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="feedback.with.ids.frag">
+<xsl:param name="feedback.with.ids" select="0"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+<para>If <varname>feedback.with.ids</varname> is non-zero, the ID of the
+current page will be added to the feedback link. This can be used, for
+example, if the <varname>feedback.href</varname> is a CGI script.</para>
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/figure.properties.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/figure.properties.xml
new file mode 100644
index 0000000..e9f6748
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/figure.properties.xml
@@ -0,0 +1,27 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="figure.properties">
+<refmeta>
+<refentrytitle>figure.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>figure.properties</refname>
+<refpurpose>Properties associated with a figure</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="figure.properties.frag">
+<xsl:attribute-set name="figure.properties" use-attribute-sets="formal.object.properties"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The styling for figures.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/filename-prefix.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/filename-prefix.xml
new file mode 100644
index 0000000..54c043d
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/filename-prefix.xml
@@ -0,0 +1,28 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="filename-prefix">
+<refmeta>
+<refentrytitle>filename-prefix</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>filename-prefix</refname>
+<refpurpose>Prefix added to all filenames</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="filename-prefix.frag">
+<xsl:param name="filename-prefix"></xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+<para>To produce the <quote>text-only</quote> (that is, non-tabular) layout
+of a website simultaneously with the tabular layout, the filenames have to
+be distinguished. That's accomplished by adding the
+<varname>filename-prefix</varname> to the front of each filename.</para>
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/firstterm.only.link.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/firstterm.only.link.xml
new file mode 100644
index 0000000..32ea305
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/firstterm.only.link.xml
@@ -0,0 +1,29 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="firstterm.only.link">
+<refmeta>
+<refentrytitle>firstterm.only.link</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>firstterm.only.link</refname>
+<refpurpose>Does automatic glossterm linking only apply to firstterms?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="firstterm.only.link.frag">
+<xsl:param name="firstterm.only.link" select="0"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, only <tag>firstterm</tag>s will be automatically linked
+to the glossary. If glossary linking is not enabled, this parameter
+has no effect.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/foil.properties.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/foil.properties.xml
new file mode 100644
index 0000000..11ad146
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/foil.properties.xml
@@ -0,0 +1,37 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="foil.properties">
+<refmeta>
+<refentrytitle>foil.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>foil.properties</refname>
+<refpurpose>Specifies properties for all foils</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+ <src:fragment xml:id="foil.properties.frag">
+ <xsl:attribute-set name="foil.properties">
+ <xsl:attribute name="font-family">
+ <xsl:value-of select="$slide.font.family"/>
+ </xsl:attribute>
+ <xsl:attribute name="margin-{$direction.align.start}">1in</xsl:attribute>
+ <xsl:attribute name="margin-{$direction.align.end}">1in</xsl:attribute>
+ <xsl:attribute name="font-size">
+ <xsl:value-of select="$body.font.size"/>
+ </xsl:attribute>
+ <xsl:attribute name="font-weight">bold</xsl:attribute>
+ </xsl:attribute-set>
+ </src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>This parameter specifies properties that are applied to all foils.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/foil.subtitle.properties.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/foil.subtitle.properties.xml
new file mode 100644
index 0000000..4832fbe
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/foil.subtitle.properties.xml
@@ -0,0 +1,36 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="foil.subtitle.properties">
+<refmeta>
+<refentrytitle>foil.subtitle.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>foil.subtitle.properties</refname>
+<refpurpose>Specifies properties for all foil subtitles</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+ <src:fragment xml:id="foil.subtitle.properties.frag">
+ <xsl:attribute-set name="foil.subtitle.properties">
+ <xsl:attribute name="font-family">
+ <xsl:value-of select="$slide.title.font.family"/>
+ </xsl:attribute>
+ <xsl:attribute name="text-align">center</xsl:attribute>
+ <xsl:attribute name="font-size">
+ <xsl:value-of select="$foil.title.master * 0.8"/><xsl:text>pt</xsl:text>
+ </xsl:attribute>
+ <xsl:attribute name="space-after">12pt</xsl:attribute>
+ </xsl:attribute-set>
+ </src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>This parameter specifies properties that are applied to all foil subtitles.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/foil.title.master.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/foil.title.master.xml
new file mode 100644
index 0000000..f5ba07f
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/foil.title.master.xml
@@ -0,0 +1,29 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="foil.title.master">
+<refmeta>
+<refentrytitle>foil.title.master</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">number</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>foil.title.master</refname>
+<refpurpose>Specifies unitless font size to use for foil titles</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="foil.title.master.frag">
+<xsl:param name="foil.title.master">36</xsl:param>
+<!-- Inconsistant use of point size? -->
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies a unitless font size to use for foil titles; used in
+combination with the <parameter>foil.title.size</parameter>
+parameter.</para>
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/foil.title.size.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/foil.title.size.xml
new file mode 100644
index 0000000..3163600
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/foil.title.size.xml
@@ -0,0 +1,32 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="foil.title.size">
+<refmeta>
+<refentrytitle>foil.title.size</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">length</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>foil.title.size</refname>
+<refpurpose>Specifies font size to use for foil titles, including units</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+ <src:fragment xml:id="foil.title.size.frag">
+ <xsl:param name="foil.title.size">
+ <xsl:value-of select="$foil.title.master"/><xsl:text>pt</xsl:text>
+ </xsl:param>
+ </src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>This parameter combines the value of the
+<parameter>foil.title.master</parameter> parameter with a unit
+specification. The default unit is <literal>pt</literal>
+(points).</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/foilgroup.properties.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/foilgroup.properties.xml
new file mode 100644
index 0000000..cd9805a
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/foilgroup.properties.xml
@@ -0,0 +1,31 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="foilgroup.properties">
+<refmeta>
+<refentrytitle>foilgroup.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>foilgroup.properties</refname>
+<refpurpose>Specifies properties for all foilgroups</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+ <src:fragment xml:id="foilgroup.properties.frag">
+ <xsl:attribute-set name="foilgroup.properties">
+ <xsl:attribute name="font-family">
+ <xsl:value-of select="$slide.font.family"/>
+ </xsl:attribute>
+ </xsl:attribute-set>
+ </src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>This parameter specifies properties that are applied to all foilgroups.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/foilgroup.toc.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/foilgroup.toc.xml
new file mode 100644
index 0000000..31d7cb3
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/foilgroup.toc.xml
@@ -0,0 +1,29 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="foilgroup.toc">
+<refmeta>
+<refentrytitle>foilgroup.toc</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>foilgroup.toc</refname>
+<refpurpose>Put ToC on foilgroup pages?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="foilgroup.toc.frag">
+<xsl:param name="foilgroup.toc" select="1"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, a ToC will be placed on foilgroup pages (after any
+other content).
+</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/footer.column.widths.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/footer.column.widths.xml
new file mode 100644
index 0000000..eca2270
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/footer.column.widths.xml
@@ -0,0 +1,80 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="footer.column.widths">
+<refmeta>
+<refentrytitle>footer.column.widths</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>footer.column.widths</refname>
+<refpurpose>Specify relative widths of footer areas</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv><src:fragment xml:id="footer.column.widths.frag">
+<xsl:param name="footer.column.widths">1 1 1</xsl:param>
+</src:fragment></refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Page footers in print output use a three column table
+to position text at the left, center, and right side of
+the footer on the page.
+This parameter lets you specify the relative sizes of the
+three columns. The default value is
+"1 1 1".</para>
+
+<para>The parameter value must be three numbers, separated
+by white space. The first number represents the relative
+width of the inside footer for
+double-sided output. The second number is the relative
+width of the center footer. The third number is the
+relative width of the outside footer for
+double-sided output.
+</para>
+<para>For single-sided output, the first number is the
+relative width of left footer for left-to-right
+text direction, or the right footer for right-to-left
+text direction.
+The third number is the
+relative width of right footer for left-to-right
+text direction, or the left footer for right-to-left
+text direction.</para>
+
+<para>The numbers are used to specify the column widths
+for the table that makes up the footer area.
+In the FO output, this looks like:
+</para>
+
+<programlisting>
+&lt;fo:table-column column-number="1"
+ column-width="proportional-column-width(1)"/&gt;
+</programlisting>
+
+<para>
+The <literal>proportional-column-width()</literal>
+function computes a column width by dividing its
+argument by the total of the arguments for all the columns, and
+then multiplying the result by the width of the whole table
+(assuming all the column specs use the function).
+Its argument can be any positive integer or floating point number.
+Zero is an acceptable value, although some FO processors
+may warn about it, in which case using a very small number might
+be more satisfactory.
+</para>
+
+<para>For example, the value "1 2 1" means the center
+footer should have twice the width of the other areas.
+A value of "0 0 1" means the entire footer area
+is reserved for the right (or outside) footer text.
+Note that to keep the center area centered on
+the page, the left and right values must be
+the same. A specification like "1 2 3" means the
+center area is no longer centered on the page
+since the right area is three times the width of the left area.
+</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/footer.content.properties.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/footer.content.properties.xml
new file mode 100644
index 0000000..1212cbd
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/footer.content.properties.xml
@@ -0,0 +1,34 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="footer.content.properties">
+<refmeta>
+<refentrytitle>footer.content.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>footer.content.properties</refname>
+<refpurpose>Properties of page footer content</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="footer.content.properties.frag">
+<xsl:attribute-set name="footer.content.properties">
+ <xsl:attribute name="font-family">
+ <xsl:value-of select="$body.fontset"/>
+ </xsl:attribute>
+ <xsl:attribute name="margin-left">
+ <xsl:value-of select="$title.margin.left"/>
+ </xsl:attribute>
+</xsl:attribute-set>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Properties of page footer content.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/footer.hr.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/footer.hr.xml
new file mode 100644
index 0000000..d1a5bf8
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/footer.hr.xml
@@ -0,0 +1,26 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="footer.hr">
+<refmeta>
+<refentrytitle>footer.hr</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>footer.hr</refname>
+<refpurpose>Toggle &lt;HR&gt; before footer</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="footer.hr.frag">
+<xsl:param name="footer.hr" select="1"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+<para>If non-zero, an &lt;HR&gt; is generated at the bottom of each web page,
+before the footer.</para>
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/footer.rule.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/footer.rule.xml
new file mode 100644
index 0000000..6b00ade
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/footer.rule.xml
@@ -0,0 +1,27 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="footer.rule">
+<refmeta>
+<refentrytitle>footer.rule</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>footer.rule</refname>
+<refpurpose>Rule over footers?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="footer.rule.frag">
+<xsl:param name="footer.rule" select="1"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, a rule will be drawn above the page footers.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/footer.table.height.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/footer.table.height.xml
new file mode 100644
index 0000000..2f6c45e
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/footer.table.height.xml
@@ -0,0 +1,32 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="footer.table.height">
+<refmeta>
+<refentrytitle>footer.table.height</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">length</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>footer.table.height</refname>
+<refpurpose>Specify the minimum height of the table containing the running page footers</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv><src:fragment xml:id="footer.table.height.frag">
+<xsl:param name="footer.table.height" >14pt</xsl:param>
+</src:fragment></refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Page footers in print output use a three column table
+to position text at the left, center, and right side of
+the footer on the page.
+This parameter lets you specify the minimum height
+of the single row in the table.
+Since this specifies only the minimum height,
+the table should automatically grow to fit taller content.
+The default value is "14pt".</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/footer.table.properties.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/footer.table.properties.xml
new file mode 100644
index 0000000..12e67d3
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/footer.table.properties.xml
@@ -0,0 +1,30 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="footer.table.properties">
+<refmeta>
+<refentrytitle>footer.table.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>footer.table.properties</refname>
+<refpurpose>Apply properties to the footer layout table</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id='footer.table.properties.frag'>
+<xsl:attribute-set name="footer.table.properties">
+ <xsl:attribute name="table-layout">fixed</xsl:attribute>
+ <xsl:attribute name="width">100%</xsl:attribute>
+</xsl:attribute-set>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Properties applied to the table that lays out the page footer.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/footers.on.blank.pages.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/footers.on.blank.pages.xml
new file mode 100644
index 0000000..2964f78
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/footers.on.blank.pages.xml
@@ -0,0 +1,27 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="footers.on.blank.pages">
+<refmeta>
+<refentrytitle>footers.on.blank.pages</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>footers.on.blank.pages</refname>
+<refpurpose>Put footers on blank pages?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="footers.on.blank.pages.frag">
+<xsl:param name="footers.on.blank.pages" select="1"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, footers will be placed on blank pages.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/footnote.font.size.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/footnote.font.size.xml
new file mode 100644
index 0000000..88d0c0b
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/footnote.font.size.xml
@@ -0,0 +1,28 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="footnote.font.size">
+<refmeta>
+<refentrytitle>footnote.font.size</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">length</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>footnote.font.size</refname>
+<refpurpose>The font size for footnotes</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="footnote.font.size.frag"><xsl:param name="footnote.font.size">
+ <xsl:value-of select="$body.font.master * 0.8"/><xsl:text>pt</xsl:text>
+</xsl:param></src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The footnote font size is used for...footnotes!
+</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/footnote.mark.properties.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/footnote.mark.properties.xml
new file mode 100644
index 0000000..2dbc9c1
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/footnote.mark.properties.xml
@@ -0,0 +1,41 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="footnote.mark.properties">
+<refmeta>
+<refentrytitle>footnote.mark.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>footnote.mark.properties</refname>
+<refpurpose>Properties applied to each footnote mark
+</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="footnote.mark.properties.frag">
+<xsl:attribute-set name="footnote.mark.properties">
+ <xsl:attribute name="font-family"><xsl:value-of select="$body.fontset"/></xsl:attribute>
+ <xsl:attribute name="font-size">75%</xsl:attribute>
+ <xsl:attribute name="font-weight">normal</xsl:attribute>
+ <xsl:attribute name="font-style">normal</xsl:attribute>
+</xsl:attribute-set>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>This attribute set is applied to the footnote mark used
+for each footnote.
+It should contain only inline properties.
+</para>
+
+<para>The property to make the mark a superscript is contained in the
+footnote template itself, because the current version of FOP reports
+an error if baseline-shift is used.
+</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/footnote.number.format.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/footnote.number.format.xml
new file mode 100644
index 0000000..c323720
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/footnote.number.format.xml
@@ -0,0 +1,33 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="footnote.number.format">
+<refmeta>
+<refentrytitle>footnote.number.format</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">list</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">1<alt>1,2,3...</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">A<alt>A,B,C...</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">a<alt>a,b,c...</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">i<alt>i,ii,iii...</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">I<alt>I,II,III...</alt></refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>footnote.number.format</refname>
+<refpurpose>Identifies the format used for footnote numbers</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="footnote.number.format.frag">
+<xsl:param name="footnote.number.format" >1</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The <parameter>footnote.number.format</parameter> specifies the format
+to use for footnote numeration (1, i, I, a, or A).</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/footnote.number.symbols.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/footnote.number.symbols.xml
new file mode 100644
index 0000000..10ca7d3
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/footnote.number.symbols.xml
@@ -0,0 +1,39 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="footnote.number.symbols">
+<refmeta>
+<refentrytitle>footnote.number.symbols</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype"/>
+</refmeta>
+<refnamediv>
+<refname>footnote.number.symbols</refname>
+<refpurpose>Special characters to use as footnote markers</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="footnote.number.symbols.frag">
+<xsl:param name="footnote.number.symbols"></xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If <parameter>footnote.number.symbols</parameter> is not the empty string,
+footnotes will use the characters it contains as footnote symbols. For example,
+<quote>*&amp;#x2020;&amp;#x2021;&amp;#x25CA;&amp;#x2720;</quote> will identify
+footnotes with <quote>*</quote>, <quote>†</quote>, <quote>‡</quote>,
+<quote>◊</quote>, and <quote>✠</quote>. If there are more footnotes
+than symbols, the stylesheets will fall back to numbered footnotes using
+<parameter>footnote.number.format</parameter>.</para>
+
+<para>The use of symbols for footnotes depends on the ability of your
+processor (or browser) to render the symbols you select. Not all systems are
+capable of displaying the full range of Unicode characters. If the quoted characters
+in the preceding paragraph are not displayed properly, that's a good indicator
+that you may have trouble using those symbols for footnotes.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/footnote.properties.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/footnote.properties.xml
new file mode 100644
index 0000000..f62adee
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/footnote.properties.xml
@@ -0,0 +1,43 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="footnote.properties">
+<refmeta>
+<refentrytitle>footnote.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>footnote.properties</refname>
+<refpurpose>Properties applied to each footnote body
+</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="footnote.properties.frag">
+<xsl:attribute-set name="footnote.properties">
+ <xsl:attribute name="font-family"><xsl:value-of select="$body.fontset"/></xsl:attribute>
+ <xsl:attribute name="font-size"><xsl:value-of select="$footnote.font.size"/></xsl:attribute>
+ <xsl:attribute name="font-weight">normal</xsl:attribute>
+ <xsl:attribute name="font-style">normal</xsl:attribute>
+ <xsl:attribute name="text-align"><xsl:value-of select="$alignment"/></xsl:attribute>
+ <xsl:attribute name="start-indent">0pt</xsl:attribute>
+ <xsl:attribute name="text-indent">0pt</xsl:attribute>
+ <xsl:attribute name="hyphenate"><xsl:value-of select="$hyphenate"/></xsl:attribute>
+ <xsl:attribute name="wrap-option">wrap</xsl:attribute>
+ <xsl:attribute name="linefeed-treatment">treat-as-space</xsl:attribute>
+</xsl:attribute-set>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>This attribute set is applied to the footnote-block
+for each footnote.
+It can be used to set the
+font-size, font-family, and other inheritable properties that will be
+applied to all footnotes.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/footnote.sep.leader.properties.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/footnote.sep.leader.properties.xml
new file mode 100644
index 0000000..27f9489
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/footnote.sep.leader.properties.xml
@@ -0,0 +1,39 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="footnote.sep.leader.properties">
+<refmeta>
+<refentrytitle>footnote.sep.leader.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>footnote.sep.leader.properties</refname>
+<refpurpose>Properties associated with footnote separators</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="footnote.sep.leader.properties.frag">
+<xsl:attribute-set name="footnote.sep.leader.properties">
+ <xsl:attribute name="color">black</xsl:attribute>
+ <xsl:attribute name="leader-pattern">rule</xsl:attribute>
+ <xsl:attribute name="leader-length">1in</xsl:attribute>
+</xsl:attribute-set>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The styling for the rule line that separates the
+footnotes from the body text.
+These are properties applied to the fo:leader used as
+the separator.
+</para>
+<para>If you want to do more than just set properties on
+the leader element, then you can customize the template
+named <literal>footnote.separator</literal> in
+<filename>fo/pagesetup.xsl</filename>.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/fop.extensions.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/fop.extensions.xml
new file mode 100644
index 0000000..e122368
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/fop.extensions.xml
@@ -0,0 +1,36 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="fop.extensions">
+<refmeta>
+<refentrytitle>fop.extensions</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>fop.extensions</refname>
+<refpurpose>Enable extensions for FOP version 0.20.5 and earlier</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="fop.extensions.frag"><xsl:param name="fop.extensions" select="0"/></src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, extensions intended for
+<link xlink:href="http://xml.apache.org/fop/">FOP</link>
+version 0.20.5 and earlier will be used.
+At present, this consists of PDF bookmarks.
+</para>
+
+<para>This parameter can also affect which graphics file formats
+are supported.</para>
+
+<para>If you are using a version of FOP beyond
+version 0.20.5, then use the <parameter>fop1.extensions</parameter> parameter
+instead.
+</para>
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/fop1.extensions.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/fop1.extensions.xml
new file mode 100644
index 0000000..dcbcf5b
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/fop1.extensions.xml
@@ -0,0 +1,34 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="fop1.extensions">
+<refmeta>
+<refentrytitle>fop1.extensions</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>fop1.extensions</refname>
+<refpurpose>Enable extensions for FOP version 0.90 and later</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="fop1.extensions.frag"><xsl:param name="fop1.extensions" select="0"/></src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, extensions for
+<link xlink:href="http://xml.apache.org/fop/">FOP</link>
+version 0.90 and later will be used.
+</para>
+
+<para>This parameter can also affect which graphics file formats
+are supported.</para>
+
+<para>The original <parameter>fop.extensions</parameter> parameter
+should still be used for FOP version 0.20.5 and earlier.
+</para>
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/formal.object.properties.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/formal.object.properties.xml
new file mode 100644
index 0000000..f36aeaf
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/formal.object.properties.xml
@@ -0,0 +1,36 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="formal.object.properties">
+<refmeta>
+<refentrytitle>formal.object.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>formal.object.properties</refname>
+<refpurpose>Properties associated with a formal object such as a figure, or other component that has a title</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="formal.object.properties.frag">
+<xsl:attribute-set name="formal.object.properties">
+ <xsl:attribute name="space-before.minimum">0.5em</xsl:attribute>
+ <xsl:attribute name="space-before.optimum">1em</xsl:attribute>
+ <xsl:attribute name="space-before.maximum">2em</xsl:attribute>
+ <xsl:attribute name="space-after.minimum">0.5em</xsl:attribute>
+ <xsl:attribute name="space-after.optimum">1em</xsl:attribute>
+ <xsl:attribute name="space-after.maximum">2em</xsl:attribute>
+ <xsl:attribute name="keep-together.within-column">always</xsl:attribute>
+</xsl:attribute-set>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The styling for formal objects in docbook. Specify the spacing
+before and after the object.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/formal.procedures.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/formal.procedures.xml
new file mode 100644
index 0000000..4f10885
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/formal.procedures.xml
@@ -0,0 +1,28 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="formal.procedures">
+<refmeta>
+<refentrytitle>formal.procedures</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>formal.procedures</refname>
+<refpurpose>Selects formal or informal procedures</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="formal.procedures.frag">
+<xsl:param name="formal.procedures" select="1"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Formal procedures are numbered and always have a title.
+</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/formal.title.placement.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/formal.title.placement.xml
new file mode 100644
index 0000000..e56f200
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/formal.title.placement.xml
@@ -0,0 +1,41 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="formal.title.placement">
+<refmeta>
+<refentrytitle>formal.title.placement</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">table</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>formal.title.placement</refname>
+<refpurpose>Specifies where formal object titles should occur</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="formal.title.placement.frag">
+<xsl:param name="formal.title.placement">
+figure before
+example before
+equation before
+table before
+procedure before
+task before
+</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies where formal object titles should occur. For each formal object
+type (<tag>figure</tag>,
+<tag>example</tag>,
+<tag>equation</tag>,
+<tag>table</tag>, and <tag>procedure</tag>)
+you can specify either the keyword
+<quote><literal>before</literal></quote> or
+<quote><literal>after</literal></quote>.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/formal.title.properties.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/formal.title.properties.xml
new file mode 100644
index 0000000..898d572
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/formal.title.properties.xml
@@ -0,0 +1,34 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="formal.title.properties">
+<refmeta>
+<refentrytitle>formal.title.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>formal.title.properties</refname>
+<refpurpose>Style the title element of formal object such as a figure.</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="formal.title.properties.frag">
+<xsl:attribute-set name="formal.title.properties" use-attribute-sets="normal.para.spacing">
+ <xsl:attribute name="font-weight">bold</xsl:attribute>
+ <xsl:attribute name="font-size">
+ <xsl:value-of select="$body.font.master * 1.2"/>
+ <xsl:text>pt</xsl:text>
+ </xsl:attribute>
+ <xsl:attribute name="hyphenate">false</xsl:attribute>
+ <xsl:attribute name="space-after.minimum">0.4em</xsl:attribute>
+ <xsl:attribute name="space-after.optimum">0.6em</xsl:attribute>
+ <xsl:attribute name="space-after.maximum">0.8em</xsl:attribute>
+</xsl:attribute-set>
+</src:fragment>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+<para>Specify how the title should be styled. Specify the font size and weight of the title of the formal object.</para>
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/funcsynopsis.decoration.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/funcsynopsis.decoration.xml
new file mode 100644
index 0000000..44037c3
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/funcsynopsis.decoration.xml
@@ -0,0 +1,30 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="funcsynopsis.decoration">
+<refmeta>
+<refentrytitle>funcsynopsis.decoration</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>funcsynopsis.decoration</refname>
+<refpurpose>Decorate elements of a <tag>funcsynopsis</tag>?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="funcsynopsis.decoration.frag">
+<xsl:param name="funcsynopsis.decoration" select="1"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, elements of the <tag>funcsynopsis</tag> will be
+decorated (e.g. rendered as bold or italic text). The decoration is controlled by
+templates that can be redefined in a customization layer.
+</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/funcsynopsis.style.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/funcsynopsis.style.xml
new file mode 100644
index 0000000..fc3ad85
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/funcsynopsis.style.xml
@@ -0,0 +1,31 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="funcsynopsis.style">
+<refmeta>
+<refentrytitle>funcsynopsis.style</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">list</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">ansi</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">kr</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>funcsynopsis.style</refname>
+<refpurpose>What style of <tag>funcsynopsis</tag> should be generated?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="funcsynopsis.style.frag"><xsl:param name="funcsynopsis.style">kr</xsl:param></src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If <parameter>funcsynopsis.style</parameter> is <literal>ansi</literal>,
+ANSI-style function synopses are generated for a
+<tag>funcsynopsis</tag>, otherwise K&amp;R-style
+function synopses are generated.
+</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/function.parens.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/function.parens.xml
new file mode 100644
index 0000000..15d6df0
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/function.parens.xml
@@ -0,0 +1,29 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="function.parens">
+<refmeta>
+<refentrytitle>function.parens</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>function.parens</refname>
+<refpurpose>Generate parens after a function?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="function.parens.frag">
+<xsl:param name="function.parens" select="0"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, the formatting of a <tag>function</tag> element
+will include generated parentheses.
+</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/generate.css.header.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/generate.css.header.xml
new file mode 100644
index 0000000..05965c1
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/generate.css.header.xml
@@ -0,0 +1,40 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="generate.css.header">
+<refmeta>
+<refentrytitle>generate.css.header</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>generate.css.header</refname>
+<refpurpose>Insert generated CSS styles in HEAD element</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="generate.css.header.frag">
+<xsl:param name="generate.css.header" select="0"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The stylesheets are capable of generating both default
+and custom CSS stylesheet files. The parameters
+<parameter>make.clean.html</parameter>,
+<parameter>docbook.css.source</parameter>, and
+<parameter>custom.css.source</parameter> control that feature.</para>
+
+<para>If you require that CSS styles reside in the HTML
+<tag>HEAD</tag> element instead of external CSS files,
+then set the <parameter>generate.css.header</parameter>
+parameter to nonzero (it is zero by default).
+Then instead of generating the CSS in external files,
+they are wrapped in <tag>style</tag> elements in
+the <tag>HEAD</tag> element of each HTML output file.
+</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/generate.id.attributes.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/generate.id.attributes.xml
new file mode 100644
index 0000000..6326841
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/generate.id.attributes.xml
@@ -0,0 +1,59 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="generate.id.attributes">
+<refmeta>
+<refentrytitle>generate.id.attributes</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>generate.id.attributes</refname>
+<refpurpose>Generate ID attributes on container elements?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="generate.id.attributes.frag">
+<xsl:param name="generate.id.attributes" select="0"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, the HTML stylesheet will generate ID attributes on
+containers. For example, the markup:</para>
+
+<screen>&lt;section id="foo"&gt;&lt;title&gt;Some Title&lt;/title&gt;
+&lt;para&gt;Some para.&lt;/para&gt;
+&lt;/section&gt;</screen>
+
+<para>might produce:</para>
+
+<screen>&lt;div class="section" id="foo"&gt;
+&lt;h2&gt;Some Title&lt;/h2&gt;
+&lt;p&gt;Some para.&lt;/p&gt;
+&lt;/div&gt;</screen>
+
+<para>The alternative is to generate anchors:</para>
+
+<screen>&lt;div class="section"&gt;
+&lt;h2&gt;&lt;a name="foo"&gt;&lt;/a&gt;Some Title&lt;/h2&gt;
+&lt;p&gt;Some para.&lt;/p&gt;
+&lt;/div&gt;</screen>
+
+<para>Because the <tag class="attribute">name</tag> attribute of
+the <tag>a</tag> element and the <tag class="attribute">id</tag>
+attribute of other tags are both of type <quote>ID</quote>, producing both
+generates invalid documents.</para>
+
+<para>As of version 1.50, you can use this switch to control which type of
+identifier is generated. For backwards-compatibility, generating
+<tag>a</tag> anchors is preferred.</para>
+
+<para>Note: at present, this switch is incompletely implemented.
+Disabling ID attributes will suppress them, but enabling ID attributes
+will not suppress the anchors.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/generate.index.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/generate.index.xml
new file mode 100644
index 0000000..8cab350
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/generate.index.xml
@@ -0,0 +1,25 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="generate.index">
+<refmeta>
+<refentrytitle>generate.index</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>generate.index</refname>
+<refpurpose>Do you want an index?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="generate.index.frag"><xsl:param name="generate.index" select="1"/></src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specify if an index should be generated. </para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/generate.legalnotice.link.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/generate.legalnotice.link.xml
new file mode 100644
index 0000000..534e050
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/generate.legalnotice.link.xml
@@ -0,0 +1,72 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="generate.legalnotice.link">
+<refmeta>
+<refentrytitle>generate.legalnotice.link</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>generate.legalnotice.link</refname>
+<refpurpose>Write legalnotice to separate chunk and generate link?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="generate.legalnotice.link.frag"><xsl:param name="generate.legalnotice.link" select="0"/></src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If the value of <parameter>generate.legalnotice.link</parameter>
+is non-zero, the stylesheet:
+
+<itemizedlist>
+ <listitem>
+ <para>writes the contents of <tag>legalnotice</tag> to a separate
+ HTML file</para>
+ </listitem>
+ <listitem>
+ <para>inserts a hyperlink to the <tag>legalnotice</tag> file</para>
+ </listitem>
+ <listitem>
+ <para>adds (in the HTML <literal>head</literal>) either a single
+ <literal>link</literal> or element or multiple
+ <literal>link</literal> elements (depending on the value of the
+ <parameter>html.head.legalnotice.link.multiple</parameter>
+ parameter), with the value or values derived from the
+ <parameter>html.head.legalnotice.link.types</parameter>
+ parameter</para>
+ </listitem>
+ </itemizedlist>
+
+ Otherwise, if <parameter>generate.legalnotice.link</parameter> is
+ zero, <tag>legalnotice</tag> contents are rendered on the title
+ page.</para>
+
+<para>The name of the separate HTML file is computed as follows:
+
+<orderedlist>
+<listitem>
+ <para>If a filename is given by the <tag class="xmlpi">dbhtml filename</tag>
+processing instruction, that filename is used.</para>
+</listitem>
+<listitem>
+ <para>If the legalnotice has an <tag class="attribute">id</tag>/<tag class="attribute">xml:id</tag>
+attribute, and if <parameter>use.id.as.filename</parameter> != 0, the filename
+is the concatenation of the id value and the value of the <parameter>html.ext</parameter>
+parameter.</para>
+</listitem>
+<listitem>
+ <para>If the legalnotice does not have an <tag class="attribute">id</tag>/<tag class="attribute">xml:id</tag>
+ attribute, or if <parameter>use.id.as.filename</parameter> = 0, the filename is the concatenation of "ln-",
+auto-generated id value, and <parameter>html.ext</parameter> value.
+ </para>
+</listitem>
+</orderedlist>
+
+</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/generate.manifest.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/generate.manifest.xml
new file mode 100644
index 0000000..b561c36
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/generate.manifest.xml
@@ -0,0 +1,27 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="generate.manifest">
+ <refmeta>
+ <refentrytitle>generate.manifest</refentrytitle>
+ <refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+ </refmeta>
+ <refnamediv>
+ <refname>generate.manifest</refname>
+ <refpurpose>Generate a manifest file?</refpurpose>
+ </refnamediv>
+
+ <refsynopsisdiv>
+ <src:fragment xml:id="generate.manifest.frag"><xsl:param name="generate.manifest" select="0"/></src:fragment>
+ </refsynopsisdiv>
+
+ <refsection><info><title>Description</title></info>
+
+ <para>If non-zero, a list of HTML files generated by the
+ stylesheet transformation is written to the file named by
+ the <parameter>manifest</parameter> parameter.</para>
+
+ </refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/generate.meta.abstract.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/generate.meta.abstract.xml
new file mode 100644
index 0000000..d3ca138
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/generate.meta.abstract.xml
@@ -0,0 +1,29 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="generate.meta.abstract">
+<refmeta>
+<refentrytitle>generate.meta.abstract</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>generate.meta.abstract</refname>
+<refpurpose>Generate HTML <tag>META</tag> element from <tag>abstract</tag>?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="generate.meta.abstract.frag">
+<xsl:param name="generate.meta.abstract" select="1"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, document abstracts will be reproduced in the HTML
+<literal>head</literal>, with <literal>>meta name="description" content="..."</literal></para>
+
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/generate.revhistory.link.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/generate.revhistory.link.xml
new file mode 100644
index 0000000..bd70cd9
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/generate.revhistory.link.xml
@@ -0,0 +1,50 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="generate.revhistory.link">
+<refmeta>
+<refentrytitle>generate.revhistory.link</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>generate.revhistory.link</refname>
+<refpurpose>Write revhistory to separate chunk and generate link?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="generate.revhistory.link.frag"><xsl:param name="generate.revhistory.link" select="0"/></src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, the contents of <tag>revhistory</tag> are written
+to a separate HTML file and a link to the file is
+generated. Otherwise, <tag>revhistory</tag> contents are rendered on
+the title page.</para>
+
+<para>The name of the separate HTML file is computed as follows:
+
+<orderedlist>
+<listitem>
+ <para>If a filename is given by the <tag class="xmlpi">dbhtml filename</tag> processing instruction,
+that filename is used.</para>
+</listitem>
+<listitem>
+ <para>If the revhistory has an <tag class="attribute">id</tag>/<tag class="attribute">xml:id</tag>
+attribute, and if <parameter>use.id.as.filename</parameter> != 0, the filename is the concatenation of
+the id value and the value of the <parameter>html.ext</parameter> parameter.</para>
+</listitem>
+<listitem>
+ <para>If the revhistory does not have an <tag class="attribute">id</tag>/<tag class="attribute">xml:id</tag>
+attribute, or if <parameter>use.id.as.filename</parameter> = 0, the filename is the concatenation of "rh-",
+auto-generated id value, and <parameter>html.ext</parameter> value.
+ </para>
+</listitem>
+</orderedlist>
+
+</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/generate.section.toc.level.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/generate.section.toc.level.xml
new file mode 100644
index 0000000..227735a
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/generate.section.toc.level.xml
@@ -0,0 +1,35 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="generate.section.toc.level">
+<refmeta>
+<refentrytitle>generate.section.toc.level</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">integer</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>generate.section.toc.level</refname>
+<refpurpose>Control depth of TOC generation in sections</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="generate.section.toc.level.frag">
+<xsl:param name="generate.section.toc.level" select="0"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The <parameter>generate.section.toc.level</parameter> parameter
+controls the depth of <tag>section</tag> in which TOCs will be generated. Note
+that this is related to, but not the same as
+<parameter>toc.section.depth</parameter>, which controls the depth to
+which TOC entries will be generated in a given TOC.</para>
+<para>If, for example, <parameter>generate.section.toc.level</parameter>
+is <literal>3</literal>, TOCs will be generated in first, second, and third
+level sections, but not in fourth level sections.
+</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/generate.toc.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/generate.toc.xml
new file mode 100644
index 0000000..d23c45e
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/generate.toc.xml
@@ -0,0 +1,108 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="generate.toc">
+<refmeta>
+<refentrytitle>generate.toc</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">table</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>generate.toc</refname>
+<refpurpose>Control generation of ToCs and LoTs</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="generate.toc.frag">
+<xsl:param condition="html" name="generate.toc">
+appendix toc,title
+article/appendix nop
+article toc,title
+book toc,title,figure,table,example,equation
+chapter toc,title
+part toc,title
+preface toc,title
+qandadiv toc
+qandaset toc
+reference toc,title
+sect1 toc
+sect2 toc
+sect3 toc
+sect4 toc
+sect5 toc
+section toc
+set toc,title
+</xsl:param>
+<xsl:param condition="fo" name="generate.toc">
+/appendix toc,title
+article/appendix nop
+/article toc,title
+book toc,title,figure,table,example,equation
+/chapter toc,title
+part toc,title
+/preface toc,title
+reference toc,title
+/sect1 toc
+/sect2 toc
+/sect3 toc
+/sect4 toc
+/sect5 toc
+/section toc
+set toc,title
+</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>This parameter has a structured value. It is a table of space-delimited
+path/value pairs. Each path identifies some element in the source document
+using a restricted subset of XPath (only the implicit child axis, no wildcards,
+no predicates). Paths can be either relative or absolute.</para>
+
+<para>When processing a particular element, the stylesheets consult this table to
+determine if a ToC (or LoT(s)) should be generated.</para>
+
+<para>For example, consider the entry:</para>
+
+<screen>book toc,figure</screen>
+
+<para>This indicates that whenever a <tag>book</tag> is formatted, a
+Table Of Contents and a List of Figures should be generated. Similarly,</para>
+
+<screen>/chapter toc</screen>
+
+<para>indicates that whenever a document <emphasis>that has a root
+of</emphasis> <tag>chapter</tag> is formatted, a Table of
+Contents should be generated. The entry <literal>chapter</literal> would match
+all chapters, but <literal>/chapter</literal> matches only <tag>chapter</tag>
+document elements.</para>
+
+<para>Generally, the longest match wins. So, for example, if you want to distinguish
+articles in books from articles in parts, you could use these two entries:</para>
+
+<screen>book/article toc,figure
+part/article toc</screen>
+
+<para>Note that an article in a part can never match a <literal>book/article</literal>,
+so if you want nothing to be generated for articles in parts, you can simply leave
+that rule out.</para>
+
+<para>If you want to leave the rule in, to make it explicit that you're turning
+something off, use the value <quote>nop</quote>. For example, the following
+entry disables ToCs and LoTs for articles:</para>
+
+<screen>article nop</screen>
+
+<para>Do not simply leave the word <quote>article</quote> in the file
+without a matching value. That'd be just begging the silly little
+path/value parser to get confused.</para>
+
+<para>Section ToCs are further controlled by the
+<parameter>generate.section.toc.level</parameter> parameter.
+For a given section level to have a ToC, it must have both an entry in
+<parameter>generate.toc</parameter> and be within the range enabled by
+<parameter>generate.section.toc.level</parameter>.</para>
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/glossary.as.blocks.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/glossary.as.blocks.xml
new file mode 100644
index 0000000..e18ed19
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/glossary.as.blocks.xml
@@ -0,0 +1,38 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="glossary.as.blocks">
+<refmeta>
+<refentrytitle>glossary.as.blocks</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>glossary.as.blocks</refname>
+<refpurpose>Present glossarys using blocks instead of lists?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="glossary.as.blocks.frag">
+<xsl:param name="glossary.as.blocks" select="0"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, <tag>glossary</tag>s will be formatted as
+blocks.</para>
+
+<para>If you have long <tag>glossterm</tag>s, proper list
+markup in the FO case may produce unattractive lists. By setting this
+parameter, you can force the stylesheets to produce block markup
+instead of proper lists.</para>
+
+<para>You can override this setting with a processing instruction as the
+child of <tag>glossary</tag>: <tag class="xmlpi">dbfo
+glossary-presentation="blocks"</tag> or <tag class="xmlpi">dbfo
+glossary-presentation="list"</tag></para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/glossary.collection.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/glossary.collection.xml
new file mode 100644
index 0000000..6f9828b
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/glossary.collection.xml
@@ -0,0 +1,252 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="glossary.collection">
+<refmeta>
+<refentrytitle>glossary.collection</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>glossary.collection</refname>
+<refpurpose>Name of the glossary collection file</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="glossary.collection.frag">
+<xsl:param name="glossary.collection"></xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Glossaries maintained independently across a set of documents
+are likely to become inconsistent unless considerable effort is
+expended to keep them in sync. It makes much more sense, usually, to
+store all of the glossary entries in a single place and simply
+<quote>extract</quote> the ones you need in each document.</para>
+
+<para>That's the purpose of the
+<parameter>glossary.collection</parameter> parameter. To setup a global
+glossary <quote>database</quote>, follow these steps:</para>
+
+<refsection><info><title>Setting Up the Glossary Database</title></info>
+
+<para>First, create a stand-alone glossary document that contains all of
+the entries that you wish to reference. Make sure that each glossary
+entry has an ID.</para>
+
+<para>Here's an example glossary:</para>
+
+<informalexample>
+<programlisting>
+&lt;?xml version="1.0" encoding="utf-8"?&gt;
+&lt;!DOCTYPE glossary
+ PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN"
+ "http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd"&gt;
+&lt;glossary&gt;
+&lt;glossaryinfo&gt;
+&lt;editor&gt;&lt;firstname&gt;Eric&lt;/firstname&gt;&lt;surname&gt;Raymond&lt;/surname&gt;&lt;/editor&gt;
+&lt;title&gt;Jargon File 4.2.3 (abridged)&lt;/title&gt;
+&lt;releaseinfo&gt;Just some test data&lt;/releaseinfo&gt;
+&lt;/glossaryinfo&gt;
+
+&lt;glossdiv&gt;&lt;title&gt;0&lt;/title&gt;
+
+&lt;glossentry&gt;
+&lt;glossterm&gt;0&lt;/glossterm&gt;
+&lt;glossdef&gt;
+&lt;para&gt;Numeric zero, as opposed to the letter `O' (the 15th letter of
+the English alphabet). In their unmodified forms they look a lot
+alike, and various kluges invented to make them visually distinct have
+compounded the confusion. If your zero is center-dotted and letter-O
+is not, or if letter-O looks almost rectangular but zero looks more
+like an American football stood on end (or the reverse), you're
+probably looking at a modern character display (though the dotted zero
+seems to have originated as an option on IBM 3270 controllers). If
+your zero is slashed but letter-O is not, you're probably looking at
+an old-style ASCII graphic set descended from the default typewheel on
+the venerable ASR-33 Teletype (Scandinavians, for whom /O is a letter,
+curse this arrangement). (Interestingly, the slashed zero long
+predates computers; Florian Cajori's monumental "A History of
+Mathematical Notations" notes that it was used in the twelfth and
+thirteenth centuries.) If letter-O has a slash across it and the zero
+does not, your display is tuned for a very old convention used at IBM
+and a few other early mainframe makers (Scandinavians curse &lt;emphasis&gt;this&lt;/emphasis&gt;
+arrangement even more, because it means two of their letters collide).
+Some Burroughs/Unisys equipment displays a zero with a &lt;emphasis&gt;reversed&lt;/emphasis&gt;
+slash. Old CDC computers rendered letter O as an unbroken oval and 0
+as an oval broken at upper right and lower left. And yet another
+convention common on early line printers left zero unornamented but
+added a tail or hook to the letter-O so that it resembled an inverted
+Q or cursive capital letter-O (this was endorsed by a draft ANSI
+standard for how to draw ASCII characters, but the final standard
+changed the distinguisher to a tick-mark in the upper-left corner).
+Are we sufficiently confused yet?&lt;/para&gt;
+&lt;/glossdef&gt;
+&lt;/glossentry&gt;
+
+&lt;glossentry&gt;
+&lt;glossterm&gt;1TBS&lt;/glossterm&gt;
+&lt;glossdef&gt;
+&lt;para role="accidence"&gt;
+&lt;phrase role="pronounce"&gt;&lt;/phrase&gt;
+&lt;phrase role="partsofspeach"&gt;n&lt;/phrase&gt;
+&lt;/para&gt;
+&lt;para&gt;The "One True Brace Style"&lt;/para&gt;
+&lt;glossseealso&gt;indent style&lt;/glossseealso&gt;
+&lt;/glossdef&gt;
+&lt;/glossentry&gt;
+
+&lt;!-- ... --&gt;
+
+&lt;/glossdiv&gt;
+
+&lt;!-- ... --&gt;
+
+&lt;/glossary&gt;</programlisting>
+</informalexample>
+
+</refsection>
+
+<refsection><info><title>Marking Up Glossary Terms</title></info>
+
+<para>That takes care of the glossary database, now you have to get the entries
+into your document. Unlike bibliography entries, which can be empty, creating
+<quote>placeholder</quote> glossary entries would be very tedious. So instead,
+support for <parameter>glossary.collection</parameter> relies on implicit linking.</para>
+
+<para>In your source document, simply use <tag>firstterm</tag> and
+<tag>glossterm</tag> to identify the terms you wish to have included
+in the glossary. The stylesheets assume that you will either set the
+<tag class="attribute">baseform</tag> attribute correctly, or that the
+content of the element exactly matches a term in your glossary.</para>
+
+<para>If you're using a <parameter>glossary.collection</parameter>, don't
+make explicit links on the terms in your document.</para>
+
+<para>So, in your document, you might write things like this:</para>
+
+<informalexample>
+<programlisting>&lt;para&gt;This is dummy text, without any real meaning.
+The point is simply to reference glossary terms like &lt;glossterm&gt;0&lt;/glossterm&gt;
+and the &lt;firstterm baseform="1TBS"&gt;One True Brace Style (1TBS)&lt;/firstterm&gt;.
+The &lt;glossterm&gt;1TBS&lt;/glossterm&gt;, as you can probably imagine, is a nearly
+religious issue.&lt;/para&gt;</programlisting>
+</informalexample>
+
+<para>If you set the <parameter>firstterm.only.link</parameter> parameter,
+only the terms marked with <tag>firstterm</tag> will be links.
+Otherwise, all the terms will be linked.</para>
+
+</refsection>
+
+<refsection><info><title>Marking Up the Glossary</title></info>
+
+<para>The glossary itself has to be identified for the stylesheets. For lack
+of a better choice, the <tag class="attribute">role</tag> is used.
+To identify the glossary as the target for automatic processing, set
+the role to <quote><literal>auto</literal></quote>. The title of this
+glossary (and any other information from the <tag>glossaryinfo</tag>
+that's rendered by your stylesheet) will be displayed, but the entries will
+come from the database.
+</para>
+
+<para>Unfortunately, the glossary can't be empty, so you must put in
+at least one <tag>glossentry</tag>. The content of this entry
+is irrelevant, it will not be rendered:</para>
+
+<informalexample>
+<programlisting>&lt;glossary role="auto"&gt;
+&lt;glossentry&gt;
+&lt;glossterm&gt;Irrelevant&lt;/glossterm&gt;
+&lt;glossdef&gt;
+&lt;para&gt;If you can see this, the document was processed incorrectly. Use
+the &lt;parameter&gt;glossary.collection&lt;/parameter&gt; parameter.&lt;/para&gt;
+&lt;/glossdef&gt;
+&lt;/glossentry&gt;
+&lt;/glossary&gt;</programlisting>
+</informalexample>
+
+<para>What about glossary divisions? If your glossary database has glossary
+divisions <emphasis>and</emphasis> your automatic glossary contains at least
+one <tag>glossdiv</tag>, the automic glossary will have divisions.
+If the <tag>glossdiv</tag> is missing from either location, no divisions
+will be rendered.</para>
+
+<para>Glossary entries (and divisions, if appropriate) in the glossary will
+occur in precisely the order they occur in your database.</para>
+
+</refsection>
+
+<refsection><info><title>Formatting the Document</title></info>
+
+<para>Finally, when you are ready to format your document, simply set the
+<parameter>glossary.collection</parameter> parameter (in either a
+customization layer or directly through your processor's interface) to
+point to your global glossary.</para>
+
+<para>The stylesheets will format the glossary in your document as if
+all of the entries implicilty referenced appeared there literally.</para>
+</refsection>
+
+<refsection><info><title>Limitations</title></info>
+
+<para>Glossary cross-references <emphasis>within the glossary</emphasis> are
+not supported. For example, this <emphasis>will not</emphasis> work:</para>
+
+<informalexample>
+<programlisting>&lt;glossentry&gt;
+&lt;glossterm&gt;gloss-1&lt;/glossterm&gt;
+&lt;glossdef&gt;&lt;para&gt;A description that references &lt;glossterm&gt;gloss-2&lt;/glossterm&gt;.&lt;/para&gt;
+&lt;glossseealso&gt;gloss-2&lt;/glossseealso&gt;
+&lt;/glossdef&gt;
+&lt;/glossentry&gt;</programlisting>
+</informalexample>
+
+<para>If you put glossary cross-references in your glossary that way,
+you'll get the cryptic error: <computeroutput>Warning:
+glossary.collection specified, but there are 0 automatic
+glossaries</computeroutput>.</para>
+
+<para>Instead, you must do two things:</para>
+
+<orderedlist>
+<listitem>
+<para>Markup your glossary using <tag>glossseealso</tag>:</para>
+
+<informalexample>
+<programlisting>&lt;glossentry&gt;
+&lt;glossterm&gt;gloss-1&lt;/glossterm&gt;
+&lt;glossdef&gt;&lt;para&gt;A description that references &lt;glossterm&gt;gloss-2&lt;/glossterm&gt;.&lt;/para&gt;
+&lt;glossseealso&gt;gloss-2&lt;/glossseealso&gt;
+&lt;/glossdef&gt;
+&lt;/glossentry&gt;</programlisting>
+</informalexample>
+</listitem>
+
+<listitem>
+<para>Make sure there is at least one <tag>glossterm</tag> reference to
+<glossterm>gloss-2</glossterm> <emphasis>in your document</emphasis>. The
+easiest way to do that is probably within a <tag>remark</tag> in your
+automatic glossary:</para>
+
+<informalexample>
+<programlisting>&lt;glossary role="auto"&gt;
+&lt;remark&gt;Make sure there's a reference to &lt;glossterm&gt;gloss-2&lt;/glossterm&gt;.&lt;/remark&gt;
+&lt;glossentry&gt;
+&lt;glossterm&gt;Irrelevant&lt;/glossterm&gt;
+&lt;glossdef&gt;
+&lt;para&gt;If you can see this, the document was processed incorrectly. Use
+the &lt;parameter&gt;glossary.collection&lt;/parameter&gt; parameter.&lt;/para&gt;
+&lt;/glossdef&gt;
+&lt;/glossentry&gt;
+&lt;/glossary&gt;</programlisting>
+</informalexample>
+</listitem>
+</orderedlist>
+</refsection>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/glossary.sort.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/glossary.sort.xml
new file mode 100644
index 0000000..216130a
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/glossary.sort.xml
@@ -0,0 +1,32 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="glossary.sort">
+<refmeta>
+<refentrytitle>glossary.sort</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>glossary.sort</refname>
+<refpurpose>Sort glossentry elements?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="glossary.sort.frag">
+<xsl:param name="glossary.sort" select="0"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, then the glossentry elements within a
+glossary, glossdiv, or glosslist are sorted on the glossterm, using
+the current lang setting. If zero (the default), then
+glossentry elements are not sorted and are presented
+in document order.
+</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/glossdef.block.properties.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/glossdef.block.properties.xml
new file mode 100644
index 0000000..4fb481f
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/glossdef.block.properties.xml
@@ -0,0 +1,32 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="glossdef.block.properties">
+<refmeta>
+<refentrytitle>glossdef.block.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>glossdef.block.properties</refname>
+<refpurpose>To add properties to the block of a glossary definition.</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="glossdef.block.properties.frag"><xsl:attribute-set name="glossdef.block.properties">
+ <xsl:attribute name="margin-{$direction.align.start}">.25in</xsl:attribute>
+</xsl:attribute-set>
+</src:fragment>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+<para>These properties are added to the block containing a
+glossary definition in a glossary when
+the <parameter>glossary.as.blocks</parameter> parameter
+is non-zero.
+Use this attribute-set to set the space above and below,
+any font properties,
+and any indent for the glossary definition.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/glossdef.list.properties.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/glossdef.list.properties.xml
new file mode 100644
index 0000000..ba71578
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/glossdef.list.properties.xml
@@ -0,0 +1,30 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="glossdef.list.properties">
+<refmeta>
+<refentrytitle>glossdef.list.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>glossdef.list.properties</refname>
+<refpurpose>To add properties to the glossary definition in a list.</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="glossdef.list.properties.frag">
+<xsl:attribute-set name="glossdef.list.properties">
+</xsl:attribute-set>
+</src:fragment>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+<para>These properties are added to the block containing a
+glossary definition in a glossary when
+the <parameter>glossary.as.blocks</parameter> parameter
+is zero.
+Use this attribute-set to set font properties, for example.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/glossentry.list.item.properties.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/glossentry.list.item.properties.xml
new file mode 100644
index 0000000..6830f17
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/glossentry.list.item.properties.xml
@@ -0,0 +1,32 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="glossentry.list.item.properties">
+<refmeta>
+<refentrytitle>glossentry.list.item.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>glossentry.list.item.properties</refname>
+<refpurpose>To add properties to each glossentry in a list.</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="glossentry.list.item.properties.frag"><xsl:attribute-set name="glossentry.list.item.properties">
+ <xsl:attribute name="space-before.optimum">1em</xsl:attribute>
+ <xsl:attribute name="space-before.minimum">0.8em</xsl:attribute>
+ <xsl:attribute name="space-before.maximum">1.2em</xsl:attribute>
+</xsl:attribute-set>
+</src:fragment>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+<para>These properties are added to the fo:list-item containing a
+glossentry in a glossary when the <parameter>glossary.as.blocks</parameter> parameter
+is zero.
+Use this attribute-set to set
+spacing between entries, for example.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/glossentry.show.acronym.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/glossentry.show.acronym.xml
new file mode 100644
index 0000000..9736438
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/glossentry.show.acronym.xml
@@ -0,0 +1,37 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="glossentry.show.acronym">
+<refmeta>
+<refentrytitle>glossentry.show.acronym</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">list</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">no</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">yes</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">primary</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>glossentry.show.acronym</refname>
+<refpurpose>Display <tag>glossentry</tag> acronyms?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="glossentry.show.acronym.frag">
+<xsl:param name="glossentry.show.acronym">no</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>A setting of <quote>yes</quote> means they should be displayed;
+<quote>no</quote> means they shouldn't. If <quote>primary</quote> is used,
+then they are shown as the primary text for the entry.</para>
+
+<note>
+<para>This setting controls both <tag>acronym</tag> and
+<tag>abbrev</tag> elements in the <tag>glossentry</tag>.</para>
+</note>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/glosslist.as.blocks.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/glosslist.as.blocks.xml
new file mode 100644
index 0000000..d720837
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/glosslist.as.blocks.xml
@@ -0,0 +1,27 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="glosslist.as.blocks">
+<refmeta>
+<refentrytitle>glosslist.as.blocks</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>glosslist.as.blocks</refname>
+<refpurpose>Use blocks for glosslists?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="glosslist.as.blocks.frag">
+<xsl:param name="glosslist.as.blocks" select="0"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>See <parameter>glossary.as.blocks</parameter>.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/glossterm.auto.link.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/glossterm.auto.link.xml
new file mode 100644
index 0000000..03d9a30
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/glossterm.auto.link.xml
@@ -0,0 +1,33 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="glossterm.auto.link">
+<refmeta>
+<refentrytitle>glossterm.auto.link</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>glossterm.auto.link</refname>
+<refpurpose>Generate links from glossterm to glossentry automatically?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="glossterm.auto.link.frag">
+<xsl:param name="glossterm.auto.link" select="0"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, links from inline <tag>glossterm</tag>s to the corresponding
+<tag>glossentry</tag> elements in a <tag>glossary</tag> or <tag>glosslist</tag>
+will be automatically generated. This is useful when your glossterms are consistent
+and you don't want to add links manually.</para>
+
+<para>The automatic link generation feature is not used on <tag>glossterm</tag> elements
+that have a <tag class="attribute">linkend</tag> attribute.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/glossterm.block.properties.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/glossterm.block.properties.xml
new file mode 100644
index 0000000..84e6a6c
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/glossterm.block.properties.xml
@@ -0,0 +1,35 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="glossterm.block.properties">
+<refmeta>
+<refentrytitle>glossterm.block.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>glossterm.block.properties</refname>
+<refpurpose>To add properties to the block of a glossentry's glossterm.</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="glossterm.block.properties.frag"><xsl:attribute-set name="glossterm.block.properties">
+ <xsl:attribute name="space-before.optimum">1em</xsl:attribute>
+ <xsl:attribute name="space-before.minimum">0.8em</xsl:attribute>
+ <xsl:attribute name="space-before.maximum">1.2em</xsl:attribute>
+ <xsl:attribute name="keep-with-next.within-column">always</xsl:attribute>
+ <xsl:attribute name="keep-together.within-column">always</xsl:attribute>
+</xsl:attribute-set>
+</src:fragment>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+<para>These properties are added to the block containing a
+glossary term in a glossary when the <parameter>glossary.as.blocks</parameter> parameter
+is non-zero.
+Use this attribute-set to set the space above and below,
+font properties,
+and any indent for the glossary term.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/glossterm.list.properties.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/glossterm.list.properties.xml
new file mode 100644
index 0000000..abe0d31
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/glossterm.list.properties.xml
@@ -0,0 +1,30 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="glossterm.list.properties">
+<refmeta>
+<refentrytitle>glossterm.list.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>glossterm.list.properties</refname>
+<refpurpose>To add properties to the glossterm in a list.</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="glossterm.list.properties.frag">
+<xsl:attribute-set name="glossterm.list.properties">
+</xsl:attribute-set>
+</src:fragment>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+<para>These properties are added to the block containing a
+glossary term in a glossary when the <parameter>glossary.as.blocks</parameter> parameter
+is zero.
+Use this attribute-set to set
+font properties, for example.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/glossterm.separation.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/glossterm.separation.xml
new file mode 100644
index 0000000..d0d2b8d
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/glossterm.separation.xml
@@ -0,0 +1,31 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="glossterm.separation">
+<refmeta>
+<refentrytitle>glossterm.separation</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">length</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>glossterm.separation</refname>
+<refpurpose>Separation between glossary terms and descriptions in list mode</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="glossterm.separation.frag">
+<xsl:param name="glossterm.separation" >0.25in</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies the miminum horizontal
+separation between glossary terms and descriptions when
+they are presented side-by-side using lists
+when the <parameter>glossary.as.blocks</parameter>
+is zero.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/glossterm.width.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/glossterm.width.xml
new file mode 100644
index 0000000..0cd3b82
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/glossterm.width.xml
@@ -0,0 +1,28 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="glossterm.width">
+<refmeta>
+<refentrytitle>glossterm.width</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">length</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>glossterm.width</refname>
+<refpurpose>Width of glossterm in list presentation mode</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="glossterm.width.frag">
+<xsl:param name="glossterm.width" >2in</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>This parameter specifies the width reserved for glossary terms when
+a list presentation is used.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/graphic.default.extension.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/graphic.default.extension.xml
new file mode 100644
index 0000000..93f2983
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/graphic.default.extension.xml
@@ -0,0 +1,29 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="graphic.default.extension">
+<refmeta>
+<refentrytitle>graphic.default.extension</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>graphic.default.extension</refname>
+<refpurpose>Default extension for graphic filenames</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="graphic.default.extension.frag"><xsl:param name="graphic.default.extension"/></src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If a <tag>graphic</tag> or <tag>mediaobject</tag>
+includes a reference to a filename that does not include an extension,
+and the <tag class="attribute">format</tag> attribute is
+<emphasis>unspecified</emphasis>, the default extension will be used.
+</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/graphical.admonition.properties.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/graphical.admonition.properties.xml
new file mode 100644
index 0000000..ca257d7
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/graphical.admonition.properties.xml
@@ -0,0 +1,42 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="graphical.admonition.properties">
+<refmeta>
+<refentrytitle>graphical.admonition.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>graphical.admonition.properties</refname>
+<refpurpose>To add properties to the outer block of a graphical admonition.</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="graphical.admonition.properties.frag"><xsl:attribute-set name="graphical.admonition.properties">
+ <xsl:attribute name="space-before.optimum">1em</xsl:attribute>
+ <xsl:attribute name="space-before.minimum">0.8em</xsl:attribute>
+ <xsl:attribute name="space-before.maximum">1.2em</xsl:attribute>
+ <xsl:attribute name="space-after.optimum">1em</xsl:attribute>
+ <xsl:attribute name="space-after.minimum">0.8em</xsl:attribute>
+ <xsl:attribute name="space-after.maximum">1.2em</xsl:attribute>
+</xsl:attribute-set>
+</src:fragment>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+<para>These properties are added to the outer block containing the
+entire graphical admonition, including its title.
+It is used when the parameter
+<parameter>admon.graphics</parameter> is set to nonzero.
+Use this attribute-set to set the space above and below,
+and any indent for the whole admonition.</para>
+
+<para>In addition to these properties, a graphical admonition
+also applies the <parameter>admonition.title.properties</parameter>
+attribute-set to the title, and applies the
+<parameter>admonition.properties</parameter> attribute-set
+to the rest of the content.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/graphics.dir.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/graphics.dir.xml
new file mode 100644
index 0000000..e8d83ae
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/graphics.dir.xml
@@ -0,0 +1,33 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="graphics.dir">
+<refmeta>
+<refentrytitle>graphics.dir</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">uri</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>graphics.dir</refname>
+<refpurpose>Graphics directory</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="graphics.dir.frag">
+<xsl:param name="graphics.dir"></xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Identifies the graphics directory for the navigation components
+generated on all the slides. This parameter can be set in the source
+document with the &lt;?dbhtml?&gt; pseudo-attribute
+<literal>graphics-dir</literal>.</para>
+
+<para>If non-empty, this value is prepended to each of the graphic
+image paths.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/graphicsize.extension.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/graphicsize.extension.xml
new file mode 100644
index 0000000..c4da7e1
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/graphicsize.extension.xml
@@ -0,0 +1,30 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="graphicsize.extension">
+<refmeta>
+<refentrytitle>graphicsize.extension</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>graphicsize.extension</refname>
+<refpurpose>Enable the getWidth()/getDepth() extension functions</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="graphicsize.extension.frag">
+<xsl:param name="graphicsize.extension" select="1"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero (and if <parameter>use.extensions</parameter> is non-zero
+and if you're using a processor that supports extension functions), the
+<function>getWidth</function> and <function>getDepth</function> functions
+will be used to extract image sizes from graphics.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/graphicsize.use.img.src.path.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/graphicsize.use.img.src.path.xml
new file mode 100644
index 0000000..aff5b30
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/graphicsize.use.img.src.path.xml
@@ -0,0 +1,30 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="graphicsize.use.img.src.path">
+<refmeta>
+<refentrytitle>graphicsize.use.img.src.path</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>graphicsize.use.img.src.path</refname>
+<refpurpose>Prepend <parameter>img.src.path</parameter> before
+filenames passed to extension functions</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="graphicsize.use.img.src.path.frag">
+<xsl:param name="graphicsize.use.img.src.path" select="0"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero <parameter>img.src.path</parameter> parameter will
+be appended before filenames passed to extension functions for
+measuring image dimensions.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/header.column.widths.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/header.column.widths.xml
new file mode 100644
index 0000000..7d85b96
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/header.column.widths.xml
@@ -0,0 +1,80 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="header.column.widths">
+<refmeta>
+<refentrytitle>header.column.widths</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>header.column.widths</refname>
+<refpurpose>Specify relative widths of header areas</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv><src:fragment xml:id="header.column.widths.frag">
+<xsl:param name="header.column.widths">1 1 1</xsl:param>
+</src:fragment></refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Page headers in print output use a three column table
+to position text at the left, center, and right side of
+the header on the page.
+This parameter lets you specify the relative sizes of the
+three columns. The default value is
+"1 1 1".</para>
+
+<para>The parameter value must be three numbers, separated
+by white space. The first number represents the relative
+width of the inside header for
+double-sided output. The second number is the relative
+width of the center header. The third number is the
+relative width of the outside header for
+double-sided output.
+</para>
+<para>For single-sided output, the first number is the
+relative width of left header for left-to-right
+text direction, or the right header for right-to-left
+text direction.
+The third number is the
+relative width of right header for left-to-right
+text direction, or the left header for right-to-left
+text direction.</para>
+
+<para>The numbers are used to specify the column widths
+for the table that makes up the header area.
+In the FO output, this looks like:
+</para>
+
+<programlisting>
+&lt;fo:table-column column-number="1"
+ column-width="proportional-column-width(1)"/&gt;
+</programlisting>
+
+<para>
+The <literal>proportional-column-width()</literal>
+function computes a column width by dividing its
+argument by the total of the arguments for all the columns, and
+then multiplying the result by the width of the whole table
+(assuming all the column specs use the function).
+Its argument can be any positive integer or floating point number.
+Zero is an acceptable value, although some FO processors
+may warn about it, in which case using a very small number might
+be more satisfactory.
+</para>
+
+<para>For example, the value "1 2 1" means the center
+header should have twice the width of the other areas.
+A value of "0 0 1" means the entire header area
+is reserved for the right (or outside) header text.
+Note that to keep the center area centered on
+the page, the left and right values must be
+the same. A specification like "1 2 3" means the
+center area is no longer centered on the page
+since the right area is three times the width of the left area.
+</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/header.content.properties.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/header.content.properties.xml
new file mode 100644
index 0000000..2d0291c
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/header.content.properties.xml
@@ -0,0 +1,34 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="header.content.properties">
+<refmeta>
+<refentrytitle>header.content.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>header.content.properties</refname>
+<refpurpose>Properties of page header content</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="header.content.properties.frag">
+<xsl:attribute-set name="header.content.properties">
+ <xsl:attribute name="font-family">
+ <xsl:value-of select="$body.fontset"/>
+ </xsl:attribute>
+ <xsl:attribute name="margin-left">
+ <xsl:value-of select="$title.margin.left"/>
+ </xsl:attribute>
+</xsl:attribute-set>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Properties of page header content.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/header.hr.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/header.hr.xml
new file mode 100644
index 0000000..08d846a
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/header.hr.xml
@@ -0,0 +1,26 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="header.hr">
+<refmeta>
+<refentrytitle>header.hr</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>header.hr</refname>
+<refpurpose>Toggle &lt;HR&gt; after header</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="header.hr.frag">
+<xsl:param name="header.hr" select="1"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+<para>If non-zero, an &lt;HR&gt; is generated at the bottom of each web page,
+before the footer.</para>
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/header.rule.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/header.rule.xml
new file mode 100644
index 0000000..b4c031e
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/header.rule.xml
@@ -0,0 +1,27 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="header.rule">
+<refmeta>
+<refentrytitle>header.rule</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>header.rule</refname>
+<refpurpose>Rule under headers?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="header.rule.frag">
+<xsl:param name="header.rule" select="1"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, a rule will be drawn below the page headers.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/header.table.height.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/header.table.height.xml
new file mode 100644
index 0000000..69b6f08
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/header.table.height.xml
@@ -0,0 +1,32 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="header.table.height">
+<refmeta>
+<refentrytitle>header.table.height</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">length</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>header.table.height</refname>
+<refpurpose>Specify the minimum height of the table containing the running page headers</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv><src:fragment xml:id="header.table.height.frag">
+<xsl:param name="header.table.height">14pt</xsl:param>
+</src:fragment></refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Page headers in print output use a three column table
+to position text at the left, center, and right side of
+the header on the page.
+This parameter lets you specify the minimum height
+of the single row in the table.
+Since this specifies only the minimum height,
+the table should automatically grow to fit taller content.
+The default value is "14pt".</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/header.table.properties.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/header.table.properties.xml
new file mode 100644
index 0000000..b5f6052
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/header.table.properties.xml
@@ -0,0 +1,30 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.or/g2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="header.table.properties">
+<refmeta>
+<refentrytitle>header.table.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>header.table.properties</refname>
+<refpurpose>Apply properties to the header layout table</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id='header.table.properties.frag'>
+<xsl:attribute-set name="header.table.properties">
+ <xsl:attribute name="table-layout">fixed</xsl:attribute>
+ <xsl:attribute name="width">100%</xsl:attribute>
+</xsl:attribute-set>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Properties applied to the table that lays out the page header.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/headers.on.blank.pages.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/headers.on.blank.pages.xml
new file mode 100644
index 0000000..1fad48e
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/headers.on.blank.pages.xml
@@ -0,0 +1,27 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="headers.on.blank.pages">
+<refmeta>
+<refentrytitle>headers.on.blank.pages</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>headers.on.blank.pages</refname>
+<refpurpose>Put headers on blank pages?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="headers.on.blank.pages.frag">
+<xsl:param name="headers.on.blank.pages" select="1"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, headers will be placed on blank pages.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/hidetoc.image.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/hidetoc.image.xml
new file mode 100644
index 0000000..705b61f
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/hidetoc.image.xml
@@ -0,0 +1,29 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="hidetoc.image">
+<refmeta>
+<refentrytitle>hidetoc.image</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">filename</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>hidetoc.image</refname>
+<refpurpose>Hide ToC image</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="hidetoc.image.frag">
+<xsl:param name="hidetoc.image">hidetoc.gif</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies the filename of the <quote>hide ToC</quote> image. This is used
+when the <link linkend="toc.hide.show">ToC hide/show</link> parameter is
+enabled.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/highlight.default.language.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/highlight.default.language.xml
new file mode 100644
index 0000000..0f00103
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/highlight.default.language.xml
@@ -0,0 +1,27 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="highlight.default.language">
+<refmeta>
+<refentrytitle>highlight.default.language</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>highlight.default.language</refname>
+<refpurpose>Default language of programlisting</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="highlight.default.language.frag">
+<xsl:param name="highlight.default.language"></xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>This language is used when there is no language attribute on programlisting.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/highlight.source.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/highlight.source.xml
new file mode 100644
index 0000000..41d7b2f8
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/highlight.source.xml
@@ -0,0 +1,82 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="highlight.source">
+<refmeta>
+<refentrytitle>highlight.source</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>highlight.source</refname>
+<refpurpose>Should the content of <tag>programlisting</tag>
+be syntactically highlighted?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="highlight.source.frag">
+<xsl:param name="highlight.source" select="0"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>When this parameter is non-zero, the stylesheets will try to do syntax highlighting of the
+content of <tag>programlisting</tag> elements. You specify the language for each programlisting
+by using the <tag class="attribute">language</tag> attribute. The <parameter>highlight.default.language</parameter>
+parameter can be used to specify the language for programlistings without a <tag class="attribute">language</tag>
+attribute. Syntax highlighting also works for <tag>screen</tag> and <tag>synopsis</tag> elements.</para>
+
+<para>The actual highlighting work is done by the XSLTHL extension module. This is an external Java library that has to be
+downloaded separately (see below).</para>
+
+<itemizedlist>
+<para>In order to use this extension, you must</para>
+
+<listitem><para>add <filename>xslthl-2.x.x.jar</filename> to your Java classpath. The latest version is available
+from <link xlink:href="http://sourceforge.net/projects/xslthl">the XSLT syntax highlighting project</link>
+at SourceForge.</para>
+</listitem>
+<listitem>
+<para>use a customization layer in which you import one of the following stylesheet modules:
+<itemizedlist>
+ <listitem>
+ <para><filename>html/highlight.xsl</filename>
+ </para>
+ </listitem>
+<listitem>
+ <para><filename>xhtml/highlight.xsl</filename>
+ </para>
+ </listitem>
+<listitem>
+ <para><filename>xhtml-1_1/highlight.xsl</filename>
+ </para>
+ </listitem>
+<listitem>
+ <para><filename>fo/highlight.xsl</filename>
+ </para>
+</listitem>
+</itemizedlist>
+</para>
+</listitem>
+<listitem><para>let either the <literal>xslthl.config</literal> Java system property or the
+<parameter>highlight.xslthl.config</parameter> parameter point to the configuration file for syntax
+highlighting (using URL syntax). DocBook XSL comes with a ready-to-use configuration file,
+<filename>highlighting/xslthl-config.xml</filename>.</para>
+</listitem>
+</itemizedlist>
+
+<para>The extension works with Saxon 6.5.x and Xalan-J. (Saxon 8.5 or later is also supported, but since it is
+an XSLT 2.0 processor it is not guaranteed to work with DocBook XSL in all circumstances.)</para>
+
+<para>The following is an example of a Saxon 6 command adapted for syntax highlighting, to be used on Windows:</para>
+
+<informalexample>
+<para><command>java -cp c:/Java/saxon.jar;c:/Java/xslthl-2.0.1.jar
+-Dxslthl.config=file:///c:/docbook-xsl/highlighting/xslthl-config.xml com.icl.saxon.StyleSheet
+-o test.html test.xml myhtml.xsl</command></para>
+</informalexample>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/highlight.xslthl.config.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/highlight.xslthl.config.xml
new file mode 100644
index 0000000..451937c
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/highlight.xslthl.config.xml
@@ -0,0 +1,33 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="highlight.xslthl.config">
+<refmeta>
+<refentrytitle>highlight.xslthl.config</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">uri</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>highlight.xslthl.config</refname>
+<refpurpose>Location of XSLTHL configuration file</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="highlight.xslthl.config.frag">
+<xsl:param name="highlight.xslthl.config"></xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>This location has precedence over the corresponding Java property.</para>
+
+<para>Please note that usually you have to specify location as URL not
+just as a simple path on the local
+filesystem. E.g. <filename>file:///home/user/xslthl/my-xslthl-config.xml</filename>.</para>
+
+
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/home.image.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/home.image.xml
new file mode 100644
index 0000000..22e5455
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/home.image.xml
@@ -0,0 +1,27 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="home.image">
+<refmeta>
+<refentrytitle>home.image</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">filename</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>home.image</refname>
+<refpurpose>Home image</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="home.image.frag">
+<xsl:param name="home.image">active/nav-home.png</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies the filename of the home navigation icon.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/html.append.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/html.append.xml
new file mode 100644
index 0000000..461e61b
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/html.append.xml
@@ -0,0 +1,30 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="html.append">
+<refmeta>
+<refentrytitle>html.append</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>html.append</refname>
+<refpurpose>Specifies content to append to HTML output</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="html.append.frag"><xsl:param name="html.append"/></src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies content to append to the end of HTML files output by
+the <filename>html/docbook.xsl</filename> stylesheet, after the
+closing <code>&lt;html&gt;</code> tag. You probably don’t want to set any
+value for this parameter; but if you do, the only value it should ever
+be set to is a newline character: <code>&amp;#x0a;</code> or
+<code>&amp;#10;</code></para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/html.base.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/html.base.xml
new file mode 100644
index 0000000..74e7fd9
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/html.base.xml
@@ -0,0 +1,30 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="html.base">
+<refmeta>
+<refentrytitle>html.base</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">uri</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>html.base</refname>
+<refpurpose>An HTML base URI</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="html.base.frag">
+<xsl:param name="html.base"/></src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If html.base is set, it is used for the <tag>base</tag> element
+in the <tag>head</tag> of the html documents. The parameter specifies
+the base URL for all relative URLs in the document. This is useful
+for dynamically served html where the base URI needs to be
+shifted.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/html.cellpadding.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/html.cellpadding.xml
new file mode 100644
index 0000000..7240f0f
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/html.cellpadding.xml
@@ -0,0 +1,29 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="html.cellpadding">
+<refmeta>
+<refentrytitle>html.cellpadding</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">integer</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>html.cellpadding</refname>
+<refpurpose>Default value for cellpadding in HTML tables</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="html.cellpadding.frag">
+<xsl:param name="html.cellpadding"></xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, this value will be used as the default cellpadding value
+in HTML tables. nn for pixels or nn% for percentage length. E.g. 5 or
+5%</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/html.cellspacing.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/html.cellspacing.xml
new file mode 100644
index 0000000..5ddfdac
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/html.cellspacing.xml
@@ -0,0 +1,29 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="html.cellspacing">
+<refmeta>
+<refentrytitle>html.cellspacing</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">integer</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>html.cellspacing</refname>
+<refpurpose>Default value for cellspacing in HTML tables</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="html.cellspacing.frag">
+<xsl:param name="html.cellspacing"></xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, this value will be used as the default cellspacing
+value in HTML tables. nn for pixels or nn% for percentage
+length. E.g. 5 or 5%</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/html.cleanup.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/html.cleanup.xml
new file mode 100644
index 0000000..e4fc0c8
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/html.cleanup.xml
@@ -0,0 +1,34 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="html.cleanup">
+<refmeta>
+<refentrytitle>html.cleanup</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>html.cleanup</refname>
+<refpurpose>Attempt to clean up the resulting HTML?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="html.cleanup.frag">
+<xsl:param name="html.cleanup" select="1"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, and if the <link xlink:href="http://www.exslt.org/">EXSLT</link>
+extensions are supported by your processor, the resulting HTML will be
+<quote>cleaned up</quote>. This improves the chances that the
+resulting HTML will be valid. It may also improve the formatting of
+some elements.</para>
+
+<para>This parameter is different from <parameter>make.valid.html</parameter>
+because it uses extension functions to manipulate result-tree-fragments.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/html.ext.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/html.ext.xml
new file mode 100644
index 0000000..8d6fd95
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/html.ext.xml
@@ -0,0 +1,29 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="html.ext">
+<refmeta>
+<refentrytitle>html.ext</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>html.ext</refname>
+<refpurpose>Identifies the extension of generated HTML files</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="html.ext.frag">
+<xsl:param name="html.ext">.html</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The extension identified by <parameter>html.ext</parameter> will
+be used as the filename extension for chunks created by this
+stylesheet. </para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/html.extra.head.links.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/html.extra.head.links.xml
new file mode 100644
index 0000000..ddc666f
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/html.extra.head.links.xml
@@ -0,0 +1,31 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="html.extra.head.links">
+<refmeta>
+<refentrytitle>html.extra.head.links</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>html.extra.head.links</refname>
+<refpurpose>Toggle extra HTML head link information</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="html.extra.head.links.frag">
+<xsl:param name="html.extra.head.links" select="0"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, extra <tag>link</tag> elements will be
+generated in the <tag>head</tag> of chunked HTML files. These
+extra links point to chapters, appendixes, sections, etc. as supported
+by the <quote>Site Navigation Bar</quote> in Mozilla 1.0 (as of CR1, at least).
+</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/html.head.legalnotice.link.multiple.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/html.head.legalnotice.link.multiple.xml
new file mode 100644
index 0000000..7c0cba1
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/html.head.legalnotice.link.multiple.xml
@@ -0,0 +1,44 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="html.head.legalnotice.link.multiple">
+<refmeta>
+<refentrytitle>html.head.legalnotice.link.multiple</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>html.head.legalnotice.link.multiple</refname>
+<refpurpose>Generate multiple link instances in html head for legalnotice?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="html.head.legalnotice.link.multiple.frag">
+<xsl:param name="html.head.legalnotice.link.multiple" select="1"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If <parameter>html.head.legalnotice.link.multiple</parameter> is
+non-zero and the value of
+<parameter>html.head.legalnotice.link.types</parameter> contains
+multiple link types, then the stylesheet generates (in the
+<literal>head</literal> section of the HTML source) one
+<literal>link</literal> element for each link type specified. For
+example, if the value of
+<parameter>html.head.legalnotice.link.types</parameter> is
+“<literal>copyright license</literal>â€:
+
+<screen> &lt;link rel="copyright" href="ln-id2524073.html" title="Legal Notice"&gt;
+ &lt;link rel="license" href="ln-id2524073.html" title="Legal Notice"&gt;</screen>
+
+ Otherwise, the stylesheet generates generates a single
+ <literal>link</literal> instance; for example:
+
+<screen> &lt;link rel="copyright license" href="ln-id2524073.html" title="Legal Notice"&gt;</screen>
+
+</para>
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/html.head.legalnotice.link.types.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/html.head.legalnotice.link.types.xml
new file mode 100644
index 0000000..4ca02ff
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/html.head.legalnotice.link.types.xml
@@ -0,0 +1,75 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="html.head.legalnotice.link.types">
+<refmeta>
+<refentrytitle>html.head.legalnotice.link.types</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>html.head.legalnotice.link.types</refname>
+<refpurpose>Specifies link types for legalnotice link in html head</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="html.head.legalnotice.link.types.frag">
+<xsl:param name="html.head.legalnotice.link.types">copyright</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The value of
+<parameter>html.head.legalnotice.link.types</parameter> is a
+space-separated list of link types, as described in <link xlink:href="http://www.w3.org/TR/html401/types.html#type-links">Section 6.12
+of the HTML 4.01 specification</link>. If the value of the
+<parameter>generate.legalnotice.link</parameter> parameter is
+non-zero, then the stylesheet generates (in the
+<literal>head</literal> section of the HTML source) either a single
+HTML <literal>link</literal> element or, if the value of the
+<parameter>html.head.legalnotice.link.multiple</parameter> is
+non-zero, one <literal>link</literal> element for each link type
+specified. Each <literal>link</literal> has the following attributes:
+
+<itemizedlist>
+ <listitem>
+ <para>a <tag class="attribute">rel</tag> attribute whose
+ value is derived from the value of
+ <parameter>html.head.legalnotice.link.types</parameter></para>
+ </listitem>
+ <listitem>
+ <para>an <tag class="attribute">href</tag> attribute whose
+ value is set to the URL of the file containing the
+ <tag>legalnotice</tag></para>
+ </listitem>
+ <listitem>
+ <para>a <tag class="attribute">title</tag> attribute whose
+ value is set to the title of the corresponding
+ <tag>legalnotice</tag> (or a title programatically
+ determined by the stylesheet)</para>
+ </listitem>
+</itemizedlist>
+
+For example:
+
+<screen> &lt;link rel="license" href="ln-id2524073.html" title="Legal Notice"&gt;</screen>
+</para>
+
+<refsection><info><title>About the default value</title></info>
+
+ <para>In an ideal world, the default value of
+ <parameter>html.head.legalnotice.link.types</parameter> would
+ probably be “<literal>license</literal>â€, since the content of the
+ DocBook <tag>legalnotice</tag> is typically license
+ information, not copyright information. However, the default value
+ is “<literal>copyright</literal>†for pragmatic reasons: because
+ that’s among the set of “recognized link types†listed in <link xlink:href="http://www.w3.org/TR/html401/types.html#type-links">Section
+ 6.12 of the HTML 4.01 specification</link>, and because certain
+ browsers and browser extensions are preconfigured to recognize that
+ value.</para>
+</refsection>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/html.longdesc.link.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/html.longdesc.link.xml
new file mode 100644
index 0000000..2497563
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/html.longdesc.link.xml
@@ -0,0 +1,39 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="html.longdesc.link">
+<refmeta>
+<refentrytitle>html.longdesc.link</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>html.longdesc.link</refname>
+<refpurpose>Should a link to the longdesc be included in the HTML?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="html.longdesc.link.frag">
+<xsl:param name="html.longdesc.link" select="$html.longdesc"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, links will be created to the
+HTML files created for the
+<literal>longdesc</literal> attribute. It makes no
+sense to enable this option without also enabling the
+<parameter>html.longdesc</parameter> parameter.</para>
+
+<!--
+<para>The <literal>longdesc.link</literal> named template is called
+to construct the link.</para>
+Assumption. That this documentation is for the user, do they need to know
+how it's done?
+
+-->
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/html.longdesc.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/html.longdesc.xml
new file mode 100644
index 0000000..10f341a
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/html.longdesc.xml
@@ -0,0 +1,28 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="html.longdesc">
+<refmeta>
+<refentrytitle>html.longdesc</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>html.longdesc</refname>
+<refpurpose>Should longdesc URIs be created?</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+<src:fragment xml:id="html.longdesc.frag">
+<xsl:param name="html.longdesc" select="1"/>
+</src:fragment>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+<para>If non-zero, HTML files will be created for the
+<literal>longdesc</literal> attribute. These files
+are created from the <tag>textobject</tag>s in
+<tag>mediaobject</tag>s and
+<tag>inlinemediaobject</tag>.
+</para>
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/html.stylesheet.type.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/html.stylesheet.type.xml
new file mode 100644
index 0000000..f20b706
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/html.stylesheet.type.xml
@@ -0,0 +1,26 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="html.stylesheet.type">
+<refmeta>
+<refentrytitle>html.stylesheet.type</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>html.stylesheet.type</refname>
+<refpurpose>The type of the stylesheet used in the generated HTML</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="html.stylesheet.type.frag"><xsl:param name="html.stylesheet.type">text/css</xsl:param></src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The type of the stylesheet to place in the HTML <tag>link</tag> tag.
+</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/html.stylesheet.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/html.stylesheet.xml
new file mode 100644
index 0000000..3407094
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/html.stylesheet.xml
@@ -0,0 +1,36 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="html.stylesheet">
+<refmeta>
+<refentrytitle>html.stylesheet</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>html.stylesheet</refname>
+<refpurpose>Name of the stylesheet(s) to use in the generated HTML</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="html.stylesheet.frag">
+<xsl:param name="html.stylesheet" ></xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The <parameter>html.stylesheet</parameter> parameter is either
+empty, indicating that no stylesheet <tag>link</tag> tag should be
+generated in the html output, or it is a list of one or more
+stylesheet files.</para>
+
+<para>Multiple stylesheets are space-delimited. If you need to
+reference a stylesheet URI that includes a space, encode it with
+<literal>%20</literal>. A separate html <literal>link</literal> element will
+be generated for each stylesheet in the order they are listed in the
+parameter.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.alias.file.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.alias.file.xml
new file mode 100644
index 0000000..be11b28
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.alias.file.xml
@@ -0,0 +1,27 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="htmlhelp.alias.file">
+<refmeta>
+<refentrytitle>htmlhelp.alias.file</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>htmlhelp.alias.file</refname>
+<refpurpose>Filename of alias file.</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="htmlhelp.alias.file.frag">
+<xsl:param name="htmlhelp.alias.file">alias.h</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies the filename of the alias file (used for context-sensitive help).</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.autolabel.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.autolabel.xml
new file mode 100644
index 0000000..1426d00
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.autolabel.xml
@@ -0,0 +1,28 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="htmlhelp.autolabel">
+<refmeta>
+<refentrytitle>htmlhelp.autolabel</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>htmlhelp.autolabel</refname>
+<refpurpose>Should tree-like ToC use autonumbering feature?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="htmlhelp.autolabel.frag">
+<xsl:param name="htmlhelp.autolabel" select="0"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Set this to non-zero to include chapter and section numbers into ToC
+in the left panel.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.button.back.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.button.back.xml
new file mode 100644
index 0000000..1fc12bb
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.button.back.xml
@@ -0,0 +1,27 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="htmlhelp.button.back">
+<refmeta>
+<refentrytitle>htmlhelp.button.back</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>htmlhelp.button.back</refname>
+<refpurpose>Should the Back button be shown?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="htmlhelp.button.back.frag">
+<xsl:param name="htmlhelp.button.back" select="1"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Set to non-zero to include the Hide/Show button shown on toolbar</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.button.forward.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.button.forward.xml
new file mode 100644
index 0000000..f6411bb
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.button.forward.xml
@@ -0,0 +1,27 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="htmlhelp.button.forward">
+<refmeta>
+<refentrytitle>htmlhelp.button.forward</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>htmlhelp.button.forward</refname>
+<refpurpose>Should the Forward button be shown?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="htmlhelp.button.forward.frag">
+<xsl:param name="htmlhelp.button.forward" select="0"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Set to non-zero to include the Forward button on the toolbar.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.button.hideshow.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.button.hideshow.xml
new file mode 100644
index 0000000..04f1ff0
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.button.hideshow.xml
@@ -0,0 +1,27 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="htmlhelp.button.hideshow">
+<refmeta>
+<refentrytitle>htmlhelp.button.hideshow</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>htmlhelp.button.hideshow</refname>
+<refpurpose>Should the Hide/Show button be shown?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="htmlhelp.button.hideshow.frag">
+<xsl:param name="htmlhelp.button.hideshow" select="1"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Set to non-zero to include the Hide/Show button shown on toolbar</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.button.home.url.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.button.home.url.xml
new file mode 100644
index 0000000..3027507
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.button.home.url.xml
@@ -0,0 +1,27 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="htmlhelp.button.home.url">
+<refmeta>
+<refentrytitle>htmlhelp.button.home.url</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>htmlhelp.button.home.url</refname>
+<refpurpose>URL address of page accessible by Home button</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="htmlhelp.button.home.url.frag">
+<xsl:param name="htmlhelp.button.home.url"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>URL address of page accessible by Home button.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.button.home.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.button.home.xml
new file mode 100644
index 0000000..e4e97fe
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.button.home.xml
@@ -0,0 +1,27 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="htmlhelp.button.home">
+<refmeta>
+<refentrytitle>htmlhelp.button.home</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>htmlhelp.button.home</refname>
+<refpurpose>Should the Home button be shown?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="htmlhelp.button.home.frag">
+<xsl:param name="htmlhelp.button.home" select="0"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Set to non-zero to include the Home button on the toolbar.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.button.jump1.title.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.button.jump1.title.xml
new file mode 100644
index 0000000..aa9da59
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.button.jump1.title.xml
@@ -0,0 +1,27 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="htmlhelp.button.jump1.title">
+<refmeta>
+<refentrytitle>htmlhelp.button.jump1.title</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>htmlhelp.button.jump1.title</refname>
+<refpurpose>Title of Jump1 button</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="htmlhelp.button.jump1.title.frag">
+<xsl:param name="htmlhelp.button.jump1.title">User1</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Title of Jump1 button.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.button.jump1.url.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.button.jump1.url.xml
new file mode 100644
index 0000000..22248c4
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.button.jump1.url.xml
@@ -0,0 +1,27 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="htmlhelp.button.jump1.url">
+<refmeta>
+<refentrytitle>htmlhelp.button.jump1.url</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>htmlhelp.button.jump1.url</refname>
+<refpurpose>URL address of page accessible by Jump1 button</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="htmlhelp.button.jump1.url.frag">
+<xsl:param name="htmlhelp.button.jump1.url"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>URL address of page accessible by Jump1 button.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.button.jump1.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.button.jump1.xml
new file mode 100644
index 0000000..f6f8d9c
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.button.jump1.xml
@@ -0,0 +1,23 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="htmlhelp.button.jump1">
+<refmeta>
+<refentrytitle>htmlhelp.button.jump1</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>htmlhelp.button.jump1</refname>
+<refpurpose>Should the Jump1 button be shown?</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+<src:fragment xml:id="htmlhelp.button.jump1.frag">
+<xsl:param name="htmlhelp.button.jump1" select="0"/>
+</src:fragment>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+ <para>Set to non-zero to include the <literal>Jump1</literal> button on the toolbar.</para>
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.button.jump2.title.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.button.jump2.title.xml
new file mode 100644
index 0000000..3b5f124
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.button.jump2.title.xml
@@ -0,0 +1,27 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="htmlhelp.button.jump2.title">
+<refmeta>
+<refentrytitle>htmlhelp.button.jump2.title</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>htmlhelp.button.jump2.title</refname>
+<refpurpose>Title of Jump2 button</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="htmlhelp.button.jump2.title.frag">
+<xsl:param name="htmlhelp.button.jump2.title">User2</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Title of Jump2 button.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.button.jump2.url.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.button.jump2.url.xml
new file mode 100644
index 0000000..dcd2434
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.button.jump2.url.xml
@@ -0,0 +1,27 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="htmlhelp.button.jump2.url">
+<refmeta>
+<refentrytitle>htmlhelp.button.jump2.url</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>htmlhelp.button.jump2.url</refname>
+<refpurpose>URL address of page accessible by Jump2 button</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="htmlhelp.button.jump2.url.frag">
+<xsl:param name="htmlhelp.button.jump2.url"></xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>URL address of page accessible by Jump2 button.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.button.jump2.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.button.jump2.xml
new file mode 100644
index 0000000..916b1ee
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.button.jump2.xml
@@ -0,0 +1,27 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="htmlhelp.button.jump2">
+<refmeta>
+<refentrytitle>htmlhelp.button.jump2</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>htmlhelp.button.jump2</refname>
+<refpurpose>Should the Jump2 button be shown?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="htmlhelp.button.jump2.frag">
+<xsl:param name="htmlhelp.button.jump2" select="0"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Set to non-zero to include the Jump2 button on the toolbar.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.button.locate.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.button.locate.xml
new file mode 100644
index 0000000..5b55552
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.button.locate.xml
@@ -0,0 +1,28 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="htmlhelp.button.locate">
+<refmeta>
+<refentrytitle>htmlhelp.button.locate</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>htmlhelp.button.locate</refname>
+<refpurpose>Should the Locate button be shown?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="htmlhelp.button.locate.frag">
+<xsl:param name="htmlhelp.button.locate" select="0"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If you want Locate button shown on toolbar, turn this
+parameter to 1.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.button.next.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.button.next.xml
new file mode 100644
index 0000000..b5352b2
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.button.next.xml
@@ -0,0 +1,27 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="htmlhelp.button.next">
+<refmeta>
+<refentrytitle>htmlhelp.button.next</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>htmlhelp.button.next</refname>
+<refpurpose>Should the Next button be shown?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="htmlhelp.button.next.frag">
+<xsl:param name="htmlhelp.button.next" select="1"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Set to non-zero to include the Next button on the toolbar.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.button.options.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.button.options.xml
new file mode 100644
index 0000000..21bed81
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.button.options.xml
@@ -0,0 +1,28 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="htmlhelp.button.options">
+<refmeta>
+<refentrytitle>htmlhelp.button.options</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>htmlhelp.button.options</refname>
+<refpurpose>Should the Options button be shown?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="htmlhelp.button.options.frag">
+<xsl:param name="htmlhelp.button.options" select="1"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If you want Options button shown on toolbar, turn this
+parameter to 1.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.button.prev.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.button.prev.xml
new file mode 100644
index 0000000..a6d989b
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.button.prev.xml
@@ -0,0 +1,28 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="htmlhelp.button.prev">
+<refmeta>
+<refentrytitle>htmlhelp.button.prev</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>htmlhelp.button.prev</refname>
+<refpurpose>Should the Prev button be shown?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="htmlhelp.button.prev.frag">
+<xsl:param name="htmlhelp.button.prev" select="1"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Set to non-zero to include the Prev button on the toolbar.
+</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.button.print.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.button.print.xml
new file mode 100644
index 0000000..1c0e816
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.button.print.xml
@@ -0,0 +1,28 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="htmlhelp.button.print">
+<refmeta>
+<refentrytitle>htmlhelp.button.print</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>htmlhelp.button.print</refname>
+<refpurpose>Should the Print button be shown?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="htmlhelp.button.print.frag">
+<xsl:param name="htmlhelp.button.print" select="1"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Set to non-zero to include the Print button on the toolbar.
+</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.button.refresh.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.button.refresh.xml
new file mode 100644
index 0000000..294fcbe
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.button.refresh.xml
@@ -0,0 +1,27 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="htmlhelp.button.refresh">
+<refmeta>
+<refentrytitle>htmlhelp.button.refresh</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>htmlhelp.button.refresh</refname>
+<refpurpose>Should the Refresh button be shown?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="htmlhelp.button.refresh.frag">
+<xsl:param name="htmlhelp.button.refresh" select="0"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Set to non-zero to include the Stop button on the toolbar.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.button.stop.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.button.stop.xml
new file mode 100644
index 0000000..fdbe549
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.button.stop.xml
@@ -0,0 +1,28 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="htmlhelp.button.stop">
+<refmeta>
+<refentrytitle>htmlhelp.button.stop</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>htmlhelp.button.stop</refname>
+<refpurpose>Should the Stop button be shown?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="htmlhelp.button.stop.frag">
+<xsl:param name="htmlhelp.button.stop" select="0"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If you want Stop button shown on toolbar, turn this
+parameter to 1.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.button.zoom.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.button.zoom.xml
new file mode 100644
index 0000000..a25dc40
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.button.zoom.xml
@@ -0,0 +1,28 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="htmlhelp.button.zoom">
+<refmeta>
+<refentrytitle>htmlhelp.button.zoom</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>htmlhelp.button.zoom</refname>
+<refpurpose>Should the Zoom button be shown?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="htmlhelp.button.zoom.frag">
+<xsl:param name="htmlhelp.button.zoom" select="0"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Set to non-zero to include the Zoom button on the toolbar.
+</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.chm.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.chm.xml
new file mode 100644
index 0000000..51cba30
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.chm.xml
@@ -0,0 +1,27 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="htmlhelp.chm">
+<refmeta>
+<refentrytitle>htmlhelp.chm</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>htmlhelp.chm</refname>
+<refpurpose>Filename of output HTML Help file.</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="htmlhelp.chm.frag">
+<xsl:param name="htmlhelp.chm">htmlhelp.chm</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Set the name of resulting CHM file</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.default.topic.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.default.topic.xml
new file mode 100644
index 0000000..577f440
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.default.topic.xml
@@ -0,0 +1,37 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="htmlhelp.default.topic">
+<refmeta>
+<refentrytitle>htmlhelp.default.topic</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>htmlhelp.default.topic</refname>
+<refpurpose>Name of file with default topic</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="htmlhelp.default.topic.frag">
+<xsl:param name="htmlhelp.default.topic"></xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Normally first chunk of document is displayed when you open HTML
+Help file. If you want to display another topic, simply set its
+filename by this parameter.</para>
+
+<para>This is useful especially if you don't generate ToC in front of
+your document and you also hide root element in ToC. E.g.:</para>
+
+<programlisting>&lt;xsl:param name="generate.book.toc" select="0"/&gt;
+&lt;xsl:param name="htmlhelp.hhc.show.root" select="0"/&gt;
+&lt;xsl:param name="htmlhelp.default.topic">pr01.html&lt;/xsl:param>
+</programlisting>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.display.progress.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.display.progress.xml
new file mode 100644
index 0000000..eab1c96
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.display.progress.xml
@@ -0,0 +1,28 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="htmlhelp.display.progress">
+<refmeta>
+<refentrytitle>htmlhelp.display.progress</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>htmlhelp.display.progress</refname>
+<refpurpose>Display compile progress?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="htmlhelp.display.progress.frag">
+<xsl:param name="htmlhelp.display.progress" select="1"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Set to non-zero to to display compile progress
+</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.encoding.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.encoding.xml
new file mode 100644
index 0000000..579cf7f
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.encoding.xml
@@ -0,0 +1,28 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="htmlhelp.encoding">
+<refmeta>
+<refentrytitle>htmlhelp.encoding</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>htmlhelp.encoding</refname>
+<refpurpose>Character encoding to use in files for HTML Help compiler.</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="htmlhelp.encoding.frag">
+<xsl:param name="htmlhelp.encoding">iso-8859-1</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>HTML Help Compiler is not UTF-8 aware, so you should always use an
+appropriate single-byte encoding here. Use one from <link xlink:href="ftp://ftp.isi.edu/in-notes/iana/assignments/character-sets">iana</link>, the registered charset values.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.enhanced.decompilation.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.enhanced.decompilation.xml
new file mode 100644
index 0000000..558e89b
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.enhanced.decompilation.xml
@@ -0,0 +1,27 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="htmlhelp.enhanced.decompilation">
+<refmeta>
+<refentrytitle>htmlhelp.enhanced.decompilation</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>htmlhelp.enhanced.decompilation</refname>
+<refpurpose>Allow enhanced decompilation of CHM?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="htmlhelp.enhanced.decompilation.frag">
+<xsl:param name="htmlhelp.enhanced.decompilation" select="0"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>When non-zero this parameter enables enhanced decompilation of CHM.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.enumerate.images.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.enumerate.images.xml
new file mode 100644
index 0000000..a2aaac8
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.enumerate.images.xml
@@ -0,0 +1,28 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="htmlhelp.enumerate.images">
+<refmeta>
+<refentrytitle>htmlhelp.enumerate.images</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>htmlhelp.enumerate.images</refname>
+<refpurpose>Should the paths to all used images be added to the project file?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="htmlhelp.enumerate.images.frag">
+<xsl:param name="htmlhelp.enumerate.images" select="0"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Set to non-zero if you insert images into your documents as
+external binary entities or if you are using absolute image paths.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.force.map.and.alias.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.force.map.and.alias.xml
new file mode 100644
index 0000000..7dca30b
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.force.map.and.alias.xml
@@ -0,0 +1,26 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="htmlhelp.force.map.and.alias">
+<refmeta>
+<refentrytitle>htmlhelp.force.map.and.alias</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>htmlhelp.force.map.and.alias</refname>
+<refpurpose>Should [MAP] and [ALIAS] sections be added to the project file unconditionally?</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+<src:fragment xml:id="htmlhelp.force.map.and.alias.frag">
+<xsl:param name="htmlhelp.force.map.and.alias" select="0"/>
+</src:fragment>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+ <para>Set to non-zero if you have your own
+ <literal>alias.h</literal> and <literal>context.h</literal>
+ files and you want to include references to them in the project
+ file.</para>
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.hhc.binary.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.hhc.binary.xml
new file mode 100644
index 0000000..ea978f7
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.hhc.binary.xml
@@ -0,0 +1,29 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="htmlhelp.hhc.binary">
+<refmeta>
+<refentrytitle>htmlhelp.hhc.binary</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>htmlhelp.hhc.binary</refname>
+<refpurpose>Generate binary ToC?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="htmlhelp.hhc.binary.frag">
+<xsl:param name="htmlhelp.hhc.binary" select="1"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Set to non-zero to generate a binary TOC. You must create a binary TOC
+if you want to add Prev/Next buttons to toolbar (which is default
+behaviour). Files with binary TOC can't be merged.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.hhc.folders.instead.books.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.hhc.folders.instead.books.xml
new file mode 100644
index 0000000..ca36e5a
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.hhc.folders.instead.books.xml
@@ -0,0 +1,31 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="htmlhelp.hhc.folders.instead.books">
+<refmeta>
+<refentrytitle>htmlhelp.hhc.folders.instead.books</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>htmlhelp.hhc.folders.instead.books</refname>
+<refpurpose>Use folder icons in ToC (instead of book icons)?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="htmlhelp.hhc.folders.instead.books.frag">
+<xsl:param name="htmlhelp.hhc.folders.instead.books" select="1"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Set to non-zero for folder-like icons or zero for book-like icons in the ToC.
+If you want to use folder-like icons, you must switch off the binary ToC using
+<parameter>htmlhelp.hhc.binary</parameter>.
+
+</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.hhc.section.depth.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.hhc.section.depth.xml
new file mode 100644
index 0000000..35c492a
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.hhc.section.depth.xml
@@ -0,0 +1,27 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="htmlhelp.hhc.section.depth">
+<refmeta>
+<refentrytitle>htmlhelp.hhc.section.depth</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">integer</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>htmlhelp.hhc.section.depth</refname>
+<refpurpose>Depth of TOC for sections in a left pane.</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="htmlhelp.hhc.section.depth.frag">
+<xsl:param name="htmlhelp.hhc.section.depth">5</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Set the section depth in the left pane of HTML Help viewer. </para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.hhc.show.root.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.hhc.show.root.xml
new file mode 100644
index 0000000..0de26b9
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.hhc.show.root.xml
@@ -0,0 +1,29 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="htmlhelp.hhc.show.root">
+<refmeta>
+<refentrytitle>htmlhelp.hhc.show.root</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>htmlhelp.hhc.show.root</refname>
+<refpurpose>Should there be an entry for the root element in the ToC?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="htmlhelp.hhc.show.root.frag">
+<xsl:param name="htmlhelp.hhc.show.root" select="1"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If set to zero, there will be no entry for the root element in the
+ToC. This is useful when you want to provide the user with an expanded
+ToC as a default.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.hhc.width.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.hhc.width.xml
new file mode 100644
index 0000000..4011399
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.hhc.width.xml
@@ -0,0 +1,28 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="htmlhelp.hhc.width">
+<refmeta>
+<refentrytitle>htmlhelp.hhc.width</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">integer</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>htmlhelp.hhc.width</refname>
+<refpurpose>Width of navigation pane</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="htmlhelp.hhc.width.frag">
+<xsl:param name="htmlhelp.hhc.width"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>This parameter specifies the width of the navigation pane (containing TOC and
+other navigation tabs) in pixels.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.hhc.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.hhc.xml
new file mode 100644
index 0000000..475ef20
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.hhc.xml
@@ -0,0 +1,27 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="htmlhelp.hhc">
+<refmeta>
+<refentrytitle>htmlhelp.hhc</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>htmlhelp.hhc</refname>
+<refpurpose>Filename of TOC file.</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="htmlhelp.hhc.frag">
+<xsl:param name="htmlhelp.hhc">toc.hhc</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Set the name of the TOC file. The default is <filename>toc.hhc</filename>.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.hhk.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.hhk.xml
new file mode 100644
index 0000000..aee473e
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.hhk.xml
@@ -0,0 +1,27 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="htmlhelp.hhk">
+<refmeta>
+<refentrytitle>htmlhelp.hhk</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>htmlhelp.hhk</refname>
+<refpurpose>Filename of index file.</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="htmlhelp.hhk.frag">
+<xsl:param name="htmlhelp.hhk">index.hhk</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>set the name of the index file. The default is <filename>index.hhk</filename>.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.hhp.tail.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.hhp.tail.xml
new file mode 100644
index 0000000..c239b9a
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.hhp.tail.xml
@@ -0,0 +1,28 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="htmlhelp.hhp.tail">
+<refmeta>
+<refentrytitle>htmlhelp.hhp.tail</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>htmlhelp.hhp.tail</refname>
+<refpurpose>Additional content for project file.</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="htmlhelp.hhp.tail.frag">
+<xsl:param name="htmlhelp.hhp.tail"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If you want to include some additional parameters into project file,
+store appropriate part of project file into this parameter.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.hhp.window.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.hhp.window.xml
new file mode 100644
index 0000000..6c29eed
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.hhp.window.xml
@@ -0,0 +1,28 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="htmlhelp.hhp.window">
+<refmeta>
+<refentrytitle>htmlhelp.hhp.window</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>htmlhelp.hhp.window</refname>
+<refpurpose>Name of default window.</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="htmlhelp.hhp.window.frag">
+<xsl:param name="htmlhelp.hhp.window">Main</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Name of default window. If empty no [WINDOWS] section will be
+added to project file.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.hhp.windows.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.hhp.windows.xml
new file mode 100644
index 0000000..afd435f
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.hhp.windows.xml
@@ -0,0 +1,29 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="htmlhelp.hhp.windows">
+<refmeta>
+<refentrytitle>htmlhelp.hhp.windows</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>htmlhelp.hhp.windows</refname>
+<refpurpose>Definition of additional windows</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="htmlhelp.hhp.windows.frag">
+<xsl:param name="htmlhelp.hhp.windows"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Content of this parameter is placed at the end of [WINDOWS]
+section of project file. You can use it for defining your own
+addtional windows.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.hhp.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.hhp.xml
new file mode 100644
index 0000000..74954d7
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.hhp.xml
@@ -0,0 +1,28 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="htmlhelp.hhp">
+<refmeta>
+<refentrytitle>htmlhelp.hhp</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>htmlhelp.hhp</refname>
+<refpurpose>Filename of project file.</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="htmlhelp.hhp.frag">
+<xsl:param name="htmlhelp.hhp">htmlhelp.hhp</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Change this parameter if you want different name of project
+file than htmlhelp.hhp.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.map.file.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.map.file.xml
new file mode 100644
index 0000000..b47c565
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.map.file.xml
@@ -0,0 +1,25 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="htmlhelp.map.file">
+<refmeta>
+<refentrytitle>htmlhelp.map.file</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>htmlhelp.map.file</refname>
+<refpurpose>Filename of map file.</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+<src:fragment xml:id="htmlhelp.map.file.frag">
+<xsl:param name="htmlhelp.map.file">context.h</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+<para>Set the name of map file. The default is
+ <filename>context.h</filename>. (used for context-sensitive
+ help).</para>
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.only.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.only.xml
new file mode 100644
index 0000000..f10dbf5
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.only.xml
@@ -0,0 +1,32 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="htmlhelp.only">
+<refmeta>
+<refentrytitle>htmlhelp.only</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>htmlhelp.only</refname>
+<refpurpose>Should only project files be generated?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="htmlhelp.only.frag">
+<xsl:param name="htmlhelp.only" select="0"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+
+<para>Set to non-zero if you want to play with various HTML Help parameters
+and you don't need to regenerate all HTML files. This setting will not
+process whole document, only project files (hhp, hhc, hhk,...) will be
+generated.</para>
+
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.remember.window.position.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.remember.window.position.xml
new file mode 100644
index 0000000..3aaea1f
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.remember.window.position.xml
@@ -0,0 +1,27 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="htmlhelp.remember.window.position">
+<refmeta>
+<refentrytitle>htmlhelp.remember.window.position</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>htmlhelp.remember.window.position</refname>
+<refpurpose>Remember help window position?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="htmlhelp.remember.window.position.frag">
+<xsl:param name="htmlhelp.remember.window.position" select="0"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Set to non-zero to remember help window position between starts.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.show.advanced.search.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.show.advanced.search.xml
new file mode 100644
index 0000000..3aa09a6
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.show.advanced.search.xml
@@ -0,0 +1,28 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="htmlhelp.show.advanced.search">
+<refmeta>
+<refentrytitle>htmlhelp.show.advanced.search</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>htmlhelp.show.advanced.search</refname>
+<refpurpose>Should advanced search features be available?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="htmlhelp.show.advanced.search.frag">
+<xsl:param name="htmlhelp.show.advanced.search" select="0"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If you want advanced search features in your help, turn this
+parameter to 1.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.show.favorities.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.show.favorities.xml
new file mode 100644
index 0000000..925bbb1
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.show.favorities.xml
@@ -0,0 +1,28 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="htmlhelp.show.favorities">
+<refmeta>
+<refentrytitle>htmlhelp.show.favorities</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>htmlhelp.show.favorities</refname>
+<refpurpose>Should the Favorites tab be shown?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="htmlhelp.show.favorities.frag">
+<xsl:param name="htmlhelp.show.favorities" select="0"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Set to non-zero to include a Favorites tab in the navigation pane
+of the help window.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.show.menu.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.show.menu.xml
new file mode 100644
index 0000000..b3d6285
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.show.menu.xml
@@ -0,0 +1,28 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="htmlhelp.show.menu">
+<refmeta>
+<refentrytitle>htmlhelp.show.menu</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>htmlhelp.show.menu</refname>
+<refpurpose>Should the menu bar be shown?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="htmlhelp.show.menu.frag">
+<xsl:param name="htmlhelp.show.menu" select="0"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Set to non-zero to have an application menu bar in your HTML Help window.
+</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.show.toolbar.text.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.show.toolbar.text.xml
new file mode 100644
index 0000000..fc87d9c
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.show.toolbar.text.xml
@@ -0,0 +1,28 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="htmlhelp.show.toolbar.text">
+<refmeta>
+<refentrytitle>htmlhelp.show.toolbar.text</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>htmlhelp.show.toolbar.text</refname>
+<refpurpose>Show text under toolbar buttons?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="htmlhelp.show.toolbar.text.frag">
+<xsl:param name="htmlhelp.show.toolbar.text" select="1"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Set to non-zero to display texts under toolbar buttons, zero to switch
+off displays.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.title.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.title.xml
new file mode 100644
index 0000000..f4397ca
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.title.xml
@@ -0,0 +1,28 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="htmlhelp.title">
+<refmeta>
+<refentrytitle>htmlhelp.title</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>htmlhelp.title</refname>
+<refpurpose>Title of HTML Help</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="htmlhelp.title.frag">
+<xsl:param name="htmlhelp.title"></xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Content of this parameter will be used as a title for generated
+HTML Help. If empty, title will be automatically taken from document.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.use.hhk.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.use.hhk.xml
new file mode 100644
index 0000000..720c1e2
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.use.hhk.xml
@@ -0,0 +1,28 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="htmlhelp.use.hhk">
+<refmeta>
+<refentrytitle>htmlhelp.use.hhk</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>htmlhelp.use.hhk</refname>
+<refpurpose>Should the index be built using the HHK file?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="htmlhelp.use.hhk.frag">
+<xsl:param name="htmlhelp.use.hhk" select="0"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, the index is created using the HHK file (instead of using <tag role="html">object</tag>
+elements in the HTML files). For more information, see <link
+role="tcg" xlink:href="HtmlHelp.html#HHGenIndex">Generating an index</link>.</para>
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.window.geometry.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.window.geometry.xml
new file mode 100644
index 0000000..0ec75f7
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/htmlhelp.window.geometry.xml
@@ -0,0 +1,30 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="htmlhelp.window.geometry">
+<refmeta>
+<refentrytitle>htmlhelp.window.geometry</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>htmlhelp.window.geometry</refname>
+<refpurpose>Set initial geometry of help window</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="htmlhelp.window.geometry.frag">
+<xsl:param name="htmlhelp.window.geometry"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>This parameter specifies initial position of help
+window. E.g.</para>
+
+<programlisting>&lt;xsl:param name="htmlhelp.window.geometry"&gt;[160,64,992,704]&lt;/xsl:param&gt;</programlisting>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/hyphenate.verbatim.characters.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/hyphenate.verbatim.characters.xml
new file mode 100644
index 0000000..e6cae20
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/hyphenate.verbatim.characters.xml
@@ -0,0 +1,30 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="hyphenate.verbatim.characters">
+<refmeta>
+<refentrytitle>hyphenate.verbatim.characters</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>hyphenate.verbatim.characters</refname>
+<refpurpose>List of characters after which a line break can occur in listings</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="hyphenate.verbatim.characters.frag">
+<xsl:param name="hyphenate.verbatim.characters"></xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If you enable <parameter>hyphenate.verbatim</parameter> line
+breaks are allowed only on space characters. If this is not enough for
+your document, you can specify list of additional characters after
+which line break is allowed in this parameter.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/hyphenate.verbatim.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/hyphenate.verbatim.xml
new file mode 100644
index 0000000..c66e700
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/hyphenate.verbatim.xml
@@ -0,0 +1,45 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="hyphenate.verbatim">
+<refmeta>
+<refentrytitle>hyphenate.verbatim</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>hyphenate.verbatim</refname>
+<refpurpose>Should verbatim environments be hyphenated on space characters?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="hyphenate.verbatim.frag"><xsl:param name="hyphenate.verbatim" select="0"/></src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If the lines of program listing are too long to fit into one
+line it is quite common to split them at space and indicite by hook
+arrow that code continues on the next line. You can turn on this
+behaviour for <tag>programlisting</tag>,
+<tag>screen</tag> and <tag>synopsis</tag> elements by
+using this parameter.</para>
+
+<para>Note that you must also enable line wrapping for verbatim environments and
+select appropriate hyphenation character (e.g. hook arrow). This can
+be done using <parameter>monospace.verbatim.properties</parameter>
+attribute set:</para>
+
+<programlisting>&lt;xsl:attribute-set name="monospace.verbatim.properties"
+ use-attribute-sets="verbatim.properties monospace.properties"&gt;
+ &lt;xsl:attribute name="wrap-option"&gt;wrap&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="hyphenation-character"&gt;&amp;#x25BA;&lt;/xsl:attribute&gt;
+&lt;/xsl:attribute-set&gt;</programlisting>
+
+<para>For a list of arrows available in Unicode see <uri xlink:href="http://www.unicode.org/charts/PDF/U2190.pdf">http://www.unicode.org/charts/PDF/U2190.pdf</uri> and <uri xlink:href="http://www.unicode.org/charts/PDF/U2900.pdf">http://www.unicode.org/charts/PDF/U2900.pdf</uri> and make sure that
+selected character is available in the font you are using for verbatim
+environments.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/hyphenate.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/hyphenate.xml
new file mode 100644
index 0000000..46a2d61
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/hyphenate.xml
@@ -0,0 +1,29 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="hyphenate">
+<refmeta>
+<refentrytitle>hyphenate</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">list</refmiscinfo>
+<refmiscinfo class="other" otherclass="list-type">closed</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">true</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">false</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>hyphenate</refname>
+<refpurpose>Specify hyphenation behavior</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="hyphenate.frag"><xsl:param name="hyphenate">true</xsl:param></src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If true, words may be hyphenated. Otherwise, they may not.
+</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/id.warnings.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/id.warnings.xml
new file mode 100644
index 0000000..7b2716f
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/id.warnings.xml
@@ -0,0 +1,25 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="id.warnings">
+<refmeta>
+<refentrytitle>id.warnings</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>id.warnings</refname>
+<refpurpose>Should warnings be generated for titled elements without IDs?</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+<src:fragment xml:id="id.warnings.frag">
+<xsl:param name="id.warnings" select="0"/>
+</src:fragment>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+<para>If non-zero, the stylesheet will issue a warning for any element
+(other than the root element) which has a <tag>title</tag> but does not have an
+ID.</para>
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/ignore.image.scaling.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/ignore.image.scaling.xml
new file mode 100644
index 0000000..c35d178
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/ignore.image.scaling.xml
@@ -0,0 +1,28 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="ignore.image.scaling">
+<refmeta>
+<refentrytitle>ignore.image.scaling</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>ignore.image.scaling</refname>
+<refpurpose>Tell the stylesheets to ignore the author's image scaling attributes</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="ignore.image.scaling.frag">
+<xsl:param name="ignore.image.scaling" select="0"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, the scaling attributes on graphics and media objects are
+ignored.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/img.src.path.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/img.src.path.xml
new file mode 100644
index 0000000..d295019
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/img.src.path.xml
@@ -0,0 +1,40 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="img.src.path">
+<refmeta>
+<refentrytitle>img.src.path</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>img.src.path</refname>
+<refpurpose>Path to HTML/FO image files</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="img.src.path.frag"><xsl:param name="img.src.path"/></src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Add a path prefix to the value of the <tag class="attribute">fileref</tag>
+attribute of <tag>graphic</tag>, <tag>inlinegraphic</tag>, and <tag>imagedata</tag> elements. The resulting
+compound path is used in the output as the value of the <tag class="attribute">src</tag>
+attribute of <tag class="element">img</tag> (HTML) or <tag class="element">external-graphic</tag> (FO).
+</para>
+
+<para>
+The path given by <literal>img.src.path</literal> could be relative to the directory where the HTML/FO
+files are created, or it could be an absolute URI.
+The default value is empty.
+Be sure to include a trailing slash if needed.
+</para>
+
+<para>This prefix is not applied to any filerefs that start
+with "/" or contain "//:".
+</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/index.div.title.properties.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/index.div.title.properties.xml
new file mode 100644
index 0000000..edbec2f
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/index.div.title.properties.xml
@@ -0,0 +1,39 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="index.div.title.properties">
+<refmeta>
+<refentrytitle>index.div.title.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>index.div.title.properties</refname>
+<refpurpose>Properties associated with the letter headings in an
+index</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="index.div.title.properties.frag">
+<xsl:attribute-set name="index.div.title.properties">
+ <xsl:attribute name="margin-{$direction.align.start}">0pt</xsl:attribute>
+ <xsl:attribute name="font-size">14.4pt</xsl:attribute>
+ <xsl:attribute name="font-family"><xsl:value-of select="$title.fontset"/></xsl:attribute>
+ <xsl:attribute name="font-weight">bold</xsl:attribute>
+ <xsl:attribute name="keep-with-next.within-column">always</xsl:attribute>
+ <xsl:attribute name="space-before.optimum"><xsl:value-of select="concat($body.font.master,'pt')"/></xsl:attribute>
+ <xsl:attribute name="space-before.minimum"><xsl:value-of select="concat($body.font.master,'pt * 0.8')"/></xsl:attribute>
+ <xsl:attribute name="space-before.maximum"><xsl:value-of select="concat($body.font.master,'pt * 1.2')"/></xsl:attribute>
+ <xsl:attribute name="start-indent">0pt</xsl:attribute>
+</xsl:attribute-set>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>This attribute set is used on the letter headings that separate
+the divisions in an index.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/index.entry.properties.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/index.entry.properties.xml
new file mode 100644
index 0000000..3232358
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/index.entry.properties.xml
@@ -0,0 +1,33 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="index.entry.properties">
+<refmeta>
+<refentrytitle>index.entry.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>index.entry.properties</refname>
+<refpurpose>Properties applied to the formatted entries
+in an index</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="index.entry.properties.frag">
+<xsl:attribute-set name="index.entry.properties">
+ <xsl:attribute name="start-indent">0pt</xsl:attribute>
+</xsl:attribute-set>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>This attribute set is applied to the block containing
+the entries in a letter division in an index. It can be used to set the
+font-size, font-family, and other inheritable properties that will be
+applied to all index entries.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/index.links.to.section.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/index.links.to.section.xml
new file mode 100644
index 0000000..47c0da5
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/index.links.to.section.xml
@@ -0,0 +1,76 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="index.links.to.section">
+<refmeta>
+<refentrytitle>index.links.to.section</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>index.links.to.section</refname>
+<refpurpose>HTML index entries link to container section title</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="index.links.to.section.frag">
+<xsl:param name="index.links.to.section" select="1"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If zero, then an index entry in an index links
+directly to the location of the
+generated <tag>anchor</tag> that is output
+for the indexterm. If two identical indexterm elements
+exist in the same section, then both entries appear
+in the index with the same title but link to different
+locations.</para>
+
+<para>If non-zero, then an index entry in an index links to the
+section title containing the <tag>indexterm</tag>, rather than
+directly to the <tag>anchor</tag> output for the indexterm.
+Duplicate indexterm entries in the same section are dropped.
+</para>
+
+<para>The default value is 1, so index entries link to
+section titles by default.</para>
+
+<para>In both cases, the link text in an index entry is the
+title of the section containing the indexterm.
+That is because HTML does not have numbered pages.
+It also provides the reader with context information
+for each link.</para>
+
+<para>This parameter lets you choose which style of
+index linking you want. </para>
+
+<itemizedlist>
+<listitem>
+<para>When set to 0, an index entry takes you
+to the precise location of its corresponding indexterm.
+However, if you have a lot of duplicate
+entries in sections, then you have a lot of duplicate
+titles in the index, which makes it more cluttered.
+The reader may not recognize why duplicate titles
+appear until they follow the links. Also, the links
+may land the reader in the middle of a section where the
+section title is not visible, which may also be
+confusing to the reader.</para>
+</listitem>
+<listitem>
+<para>When set to 1, an index entry link is
+less precise, but duplicate titles in the
+index entries are eliminated.
+Landing on the section title location may confirm the reader's
+expectation that a link that
+shows a section title will take them to that section title,
+not a location within the section.
+</para>
+</listitem>
+</itemizedlist>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/index.method.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/index.method.xml
new file mode 100644
index 0000000..2127956
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/index.method.xml
@@ -0,0 +1,162 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="index.method">
+<refmeta>
+<refentrytitle>index.method</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">list</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">basic</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">kosek</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">kimber</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>index.method</refname>
+<refpurpose>Select method used to group index entries in an index</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="index.method.frag">
+<xsl:param name="index.method">basic</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>This parameter lets you select which method to use for sorting and grouping
+ index entries in an index.
+Indexes in Latin-based languages that have accented characters typically
+sort together accented words and unaccented words.
+Thus <quote>Ã</quote> (U+00C1 LATIN CAPITAL LETTER A WITH ACUTE) would sort together
+with <quote>A</quote> (U+0041 LATIN CAPITAL LETTER A), so both would appear in the <quote>A</quote>
+section of the index.
+Languages using other alphabets (such as Russian, which is written in the Cyrillic alphabet)
+and languages using ideographic chararacters (such as Japanese)
+require grouping specific to the languages and alphabets.
+</para>
+
+<para>The default indexing method is limited.
+It can group accented characters in Latin-based languages only.
+It cannot handle non-Latin alphabets or ideographic languages.
+The other indexing methods require extensions of one type or
+another, and do not work with
+all XSLT processors, which is why they are not used by default.</para>
+
+<para>The three choices for indexing method are:</para>
+<variablelist>
+<varlistentry>
+<term><literal>basic</literal></term>
+<listitem>
+<para>
+(default) Sort and groups words based only on the Latin alphabet.
+Words with accented Latin letters will group and sort with
+their respective primary letter, but
+words in non-Latin alphabets will be
+put in the <quote>Symbols</quote> section of the index.
+</para>
+</listitem>
+</varlistentry>
+<varlistentry>
+<term><literal>kosek</literal></term>
+<listitem>
+<para>
+This method sorts and groups words based on letter groups configured in
+the DocBook locale file for the given language.
+See, for example, the French locale file <filename>common/fr.xml</filename>.
+This method requires that the XSLT processor
+supports the EXSLT extensions (most do).
+It also requires support for using
+user-defined functions in xsl:key (xsltproc does not).
+</para>
+<para>This method is suitable for any language for which you can
+list all the individual characters that should appear
+in each letter group in an index.
+It is probably not practical to use it for ideographic languages
+such as Chinese that have hundreds or thousands of characters.
+</para>
+
+<para>To use the kosek method, you must:</para>
+
+<orderedlist>
+<listitem>
+<para>Use a processor that supports its extensions, such as
+Saxon 6 or Xalan (xsltproc and Saxon 8 do not).
+</para>
+</listitem>
+<listitem>
+<para>Set the index.method parameter's value to <quote>kosek</quote>.
+</para>
+</listitem>
+<listitem>
+<para>Import the appropriate index extensions stylesheet module
+<filename>fo/autoidx-kosek.xsl</filename> or
+<filename>html/autoidx-kosek.xsl</filename> into your
+customization.
+</para>
+</listitem>
+</orderedlist>
+
+</listitem>
+</varlistentry>
+<varlistentry>
+<term><literal>kimber</literal></term>
+<listitem>
+<para>
+This method uses extensions to the Saxon processor to implement
+sophisticated indexing processes. It uses its own
+configuration file, which can include information for any number of
+languages. Each language's configuration can group
+words using one of two processes. In the
+enumerated process similar to that used in the kosek method,
+you indicate the groupings character-by-character.
+In the between-key process, you specify the
+break-points in the sort order that should start a new group.
+The latter configuration is useful for ideographic languages
+such as Chinese, Japanese, and Korean.
+You can also define your own collation algorithms and how you
+want mixed Latin-alphabet words sorted.</para>
+<itemizedlist>
+<listitem>
+<para>For a whitepaper describing the extensions, see:
+<link xlink:href="http://www.innodata-isogen.com/knowledge_center/white_papers/back_of_book_for_xsl_fo.pdf">http://www.innodata-isogen.com/knowledge_center/white_papers/back_of_book_for_xsl_fo.pdf</link>.
+</para>
+</listitem>
+<listitem>
+<para>To download the extension library, see
+<link xlink:href="http://www.innodata-isogen.com/knowledge_center/tools_downloads/i18nsupport">http://www.innodata-isogen.com/knowledge_center/tools_downloads/i18nsupport</link>.
+</para>
+</listitem>
+</itemizedlist>
+
+<para>To use the kimber method, you must:</para>
+
+<orderedlist>
+<listitem>
+<para>Use Saxon (version 6 or 8) as your XSLT processor.
+</para>
+</listitem>
+<listitem>
+<para>Install and configure the Innodata Isogen library, using
+the documentation that comes with it.
+</para>
+</listitem>
+<listitem>
+<para>Set the index.method parameter's value to <quote>kimber</quote>.
+</para>
+</listitem>
+<listitem>
+<para>Import the appropriate index extensions stylesheet module
+<filename>fo/autoidx-kimber.xsl</filename> or
+<filename>html/autoidx-kimber.xsl</filename> into your
+customization.
+</para>
+</listitem>
+</orderedlist>
+
+</listitem>
+</varlistentry>
+</variablelist>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/index.number.separator.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/index.number.separator.xml
new file mode 100644
index 0000000..8f51512
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/index.number.separator.xml
@@ -0,0 +1,54 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="index.number.separator">
+<refmeta>
+<refentrytitle>index.number.separator</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>index.number.separator</refname>
+<refpurpose>Override for punctuation separating page numbers in index</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="index.number.separator.frag">
+<xsl:param name="index.number.separator"></xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>This parameter permits you to override the text to insert between
+page references in a formatted index entry. Typically
+that would be a comma and a space.
+</para>
+
+<para>Because this text may be locale dependent,
+this parameter's value is normally taken from a gentext
+template named 'number-separator' in the
+context 'index' in the stylesheet
+locale file for the language
+of the current document.
+This parameter can be used to override the gentext string,
+and would typically be used on the command line.
+This parameter would apply to all languages.
+</para>
+
+<para>So this text string can be customized in two ways.
+You can reset the default gentext string using
+the <parameter>local.l10n.xml</parameter> parameter, or you can
+override the gentext with the content of this parameter.
+The content can be a simple string, or it can be
+something more complex such as a call-template.
+</para>
+
+<para>In HTML index output, section title references are used instead of
+page number references. This punctuation appears between
+such section titles in an HTML index.
+</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/index.on.role.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/index.on.role.xml
new file mode 100644
index 0000000..81d65dd
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/index.on.role.xml
@@ -0,0 +1,48 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="index.on.role">
+<refmeta>
+<refentrytitle>index.on.role</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>index.on.role</refname>
+<refpurpose>Select indexterms based on <tag class="attribute">role</tag> value</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="index.on.role.frag">
+<xsl:param name="index.on.role" select="0"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>
+If non-zero,
+then an <tag>index</tag> element that has a
+<tag class="attribute">role</tag> attribute
+value will contain only those <tag>indexterm</tag>
+elements with a matching role value.
+If an <tag>index</tag> has no <tag class="attribute">role</tag>
+attribute or it is blank, then the index will contain
+all <tag>indexterm</tag>s in the current scope.
+</para>
+<para>
+If <literal>index.on.role</literal> is zero, then the
+<tag class="attribute">role</tag> attribute has no effect
+on selecting indexterms for an index.
+</para>
+
+<para>If you are using DocBook version 4.3 or later, you should
+use the <tag class="attribute">type</tag> attribute instead of <tag class="attribute">role</tag>
+on <tag>indexterm</tag> and <tag>index</tag>,
+and set the <parameter>index.on.type</parameter> to a nonzero
+value.
+</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/index.on.type.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/index.on.type.xml
new file mode 100644
index 0000000..a5189c7
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/index.on.type.xml
@@ -0,0 +1,52 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="index.on.type">
+<refmeta>
+<refentrytitle>index.on.type</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>index.on.type</refname>
+<refpurpose>Select indexterms based on <tag class="attribute">type</tag>
+attribute value</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="index.on.type.frag">
+<xsl:param name="index.on.type" select="0"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>
+If non-zero,
+then an <tag>index</tag> element that has a
+<tag class="attribute">type</tag> attribute
+value will contain only those <tag>indexterm</tag>
+elements with a matching <tag class="attribute">type</tag> attribute value.
+If an <tag>index</tag> has no <tag class="attribute">type</tag>
+attribute or it is blank, then the index will contain
+all <tag>indexterm</tag>s in the current scope.
+</para>
+
+<para>
+If <literal>index.on.type</literal> is zero, then the
+<tag class="attribute">type</tag> attribute has no effect
+on selecting indexterms for an index.
+</para>
+
+<para>For those using DocBook version 4.2 or earlier,
+the <tag class="attribute">type</tag> attribute is not available
+for index terms. However, you can achieve the same
+effect by using the <tag class="attribute">role</tag> attribute
+in the same manner on <tag>indexterm</tag>
+and <tag>index</tag>, and setting the stylesheet parameter
+<parameter>index.on.role</parameter> to a nonzero value.
+</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/index.page.number.properties.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/index.page.number.properties.xml
new file mode 100644
index 0000000..74d105a
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/index.page.number.properties.xml
@@ -0,0 +1,31 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="index.page.number.properties">
+<refmeta>
+<refentrytitle>index.page.number.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>index.page.number.properties</refname>
+<refpurpose>Properties associated with index page numbers</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="index.page.number.properties.frag">
+<xsl:attribute-set name="index.page.number.properties">
+</xsl:attribute-set>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Properties associated with page numbers in indexes.
+Changing color to indicate the page number is a link is
+one possibility.
+</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/index.prefer.titleabbrev.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/index.prefer.titleabbrev.xml
new file mode 100644
index 0000000..3f010ae
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/index.prefer.titleabbrev.xml
@@ -0,0 +1,29 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="index.prefer.titleabbrev">
+<refmeta>
+<refentrytitle>index.prefer.titleabbrev</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>index.prefer.titleabbrev</refname>
+<refpurpose>Should abbreviated titles be used as back references?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="index.prefer.titleabbrev.frag">
+<xsl:param name="index.prefer.titleabbrev" select="0"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, and if a <tag>titleabbrev</tag> is defined, the abbreviated title
+is used as the link text of a back reference in the index.
+</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/index.preferred.page.properties.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/index.preferred.page.properties.xml
new file mode 100644
index 0000000..1b7a26f
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/index.preferred.page.properties.xml
@@ -0,0 +1,32 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="index.preferred.page.properties">
+<refmeta>
+<refentrytitle>index.preferred.page.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>index.preferred.page.properties</refname>
+<refpurpose>Properties used to emphasize page number references for
+significant index terms</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="index.preferred.page.properties.frag">
+<xsl:attribute-set name="index.preferred.page.properties">
+ <xsl:attribute name="font-weight">bold</xsl:attribute>
+</xsl:attribute-set>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Properties used to emphasize page number references for
+significant index terms (<tag class="attribute">significance</tag>=<tag class="attvalue">preferred</tag>). Currently works only with
+XEP.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/index.range.separator.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/index.range.separator.xml
new file mode 100644
index 0000000..aff09a9
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/index.range.separator.xml
@@ -0,0 +1,57 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="index.range.separator">
+<refmeta>
+<refentrytitle>index.range.separator</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>index.range.separator</refname>
+<refpurpose>Override for punctuation separating the two numbers
+in a page range in index</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="index.range.separator.frag">
+<xsl:param name="index.range.separator"></xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>This parameter permits you
+to override the text to insert between
+the two numbers of a page range in an index.
+This parameter is only used by those XSL-FO processors
+that support an extension for generating such page ranges
+(such as XEP).</para>
+
+<para>Because this text may be locale dependent,
+this parameter's value is normally taken from a gentext
+template named 'range-separator' in the
+context 'index' in the stylesheet
+locale file for the language
+of the current document.
+This parameter can be used to override the gentext string,
+and would typically be used on the command line.
+This parameter would apply to all languages.
+</para>
+
+<para>So this text string can be customized in two ways.
+You can reset the default gentext string using
+the <parameter>local.l10n.xml</parameter> parameter, or you can
+override the gentext with the content of this parameter.
+The content can be a simple string, or it can be
+something more complex such as a call-template.
+</para>
+
+<para>In HTML index output, section title references are used instead of
+page number references. So there are no page ranges
+and this parameter has no effect.
+</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/index.term.separator.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/index.term.separator.xml
new file mode 100644
index 0000000..ab2f672
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/index.term.separator.xml
@@ -0,0 +1,54 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="index.term.separator">
+<refmeta>
+<refentrytitle>index.term.separator</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>index.term.separator</refname>
+<refpurpose>Override for punctuation separating an index term
+from its list of page references in an index</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="index.term.separator.frag">
+<xsl:param name="index.term.separator"></xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>This parameter permits you to override
+the text to insert between
+the end of an index term and its list of page references.
+Typically that might be a comma and a space.
+</para>
+
+<para>Because this text may be locale dependent,
+this parameter's value is normally taken from a gentext
+template named 'term-separator' in the
+context 'index' in the stylesheet
+locale file for the language
+of the current document.
+This parameter can be used to override the gentext string,
+and would typically be used on the command line.
+This parameter would apply to all languages.
+</para>
+
+<para>So this text string can be customized in two ways.
+You can reset the default gentext string using
+the <parameter>local.l10n.xml</parameter> parameter, or you can
+fill in the content for this normally empty
+override parameter.
+The content can be a simple string, or it can be
+something more complex such as a call-template.
+For fo output, it could be an <tag>fo:leader</tag>
+element to provide space of a specific length, or a dot leader.
+</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/informal.object.properties.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/informal.object.properties.xml
new file mode 100644
index 0000000..e89cc11
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/informal.object.properties.xml
@@ -0,0 +1,29 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="informal.object.properties">
+<refmeta>
+<refentrytitle>informal.object.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>informal.object.properties</refname>
+<refpurpose>Properties associated with an informal (untitled) object, such as an informalfigure</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="informal.object.properties.frag"><xsl:attribute-set name="informal.object.properties">
+ <xsl:attribute name="space-before.minimum">0.5em</xsl:attribute>
+ <xsl:attribute name="space-before.optimum">1em</xsl:attribute>
+ <xsl:attribute name="space-before.maximum">2em</xsl:attribute>
+ <xsl:attribute name="space-after.minimum">0.5em</xsl:attribute>
+ <xsl:attribute name="space-after.optimum">1em</xsl:attribute>
+ <xsl:attribute name="space-after.maximum">2em</xsl:attribute>
+</xsl:attribute-set></src:fragment>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+<para>The styling for informal objects in docbook. Specify the spacing before and after the object.</para>
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/informalequation.properties.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/informalequation.properties.xml
new file mode 100644
index 0000000..88a57be
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/informalequation.properties.xml
@@ -0,0 +1,27 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="informalequation.properties">
+<refmeta>
+<refentrytitle>informalequation.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>informalequation.properties</refname>
+<refpurpose>Properties associated with an informalequation</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="informalequation.properties.frag">
+<xsl:attribute-set name="informalequation.properties" use-attribute-sets="informal.object.properties"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The styling for informalequations.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/informalexample.properties.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/informalexample.properties.xml
new file mode 100644
index 0000000..90ffb2c
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/informalexample.properties.xml
@@ -0,0 +1,27 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="informalexample.properties">
+<refmeta>
+<refentrytitle>informalexample.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>informalexample.properties</refname>
+<refpurpose>Properties associated with an informalexample</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="informalexample.properties.frag">
+<xsl:attribute-set name="informalexample.properties" use-attribute-sets="informal.object.properties"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The styling for informalexamples.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/informalfigure.properties.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/informalfigure.properties.xml
new file mode 100644
index 0000000..c766248
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/informalfigure.properties.xml
@@ -0,0 +1,27 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="informalfigure.properties">
+<refmeta>
+<refentrytitle>informalfigure.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>informalfigure.properties</refname>
+<refpurpose>Properties associated with an informalfigure</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="informalfigure.properties.frag">
+<xsl:attribute-set name="informalfigure.properties" use-attribute-sets="informal.object.properties"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The styling for informalfigures.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/informaltable.properties.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/informaltable.properties.xml
new file mode 100644
index 0000000..c968883
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/informaltable.properties.xml
@@ -0,0 +1,32 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="informaltable.properties">
+<refmeta>
+<refentrytitle>informaltable.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>informaltable.properties</refname>
+<refpurpose>Properties associated with the block surrounding an informaltable</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="informaltable.properties.frag">
+<xsl:attribute-set name="informaltable.properties" use-attribute-sets="informal.object.properties"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Block styling properties for informaltables. This parameter should really
+have been called <literal>informaltable.block.properties</literal> or something
+like that, but we’re leaving it to avoid backwards-compatibility
+problems.</para>
+
+<para>See also <parameter>table.table.properties</parameter>.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/inherit.keywords.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/inherit.keywords.xml
new file mode 100644
index 0000000..7939a6a
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/inherit.keywords.xml
@@ -0,0 +1,31 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="inherit.keywords">
+<refmeta>
+<refentrytitle>inherit.keywords</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>inherit.keywords</refname>
+<refpurpose>Inherit keywords from ancestor elements?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="inherit.keywords.frag">
+<xsl:param name="inherit.keywords" select="1"/></src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If <parameter>inherit.keywords</parameter>
+is non-zero, the keyword <literal>meta</literal> for each HTML
+<literal>head</literal> element will include all of the keywords from
+ancestor elements. Otherwise, only the keywords from the current section
+will be used.
+</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/insert.link.page.number.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/insert.link.page.number.xml
new file mode 100644
index 0000000..b26c0f6
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/insert.link.page.number.xml
@@ -0,0 +1,69 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="insert.link.page.number">
+<refmeta>
+<refentrytitle>insert.link.page.number</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">list</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">no</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">yes</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">maybe</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>insert.link.page.number</refname>
+<refpurpose>Turns page numbers in link elements on and off</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="insert.link.page.number.frag">
+<xsl:param name="insert.link.page.number">no</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The value of this parameter determines if
+cross references using the <tag>link</tag> element in
+printed output will
+include standard page number citations.
+It has three possible values.
+</para>
+<variablelist>
+<varlistentry>
+<term>no</term>
+<listitem><para>No page number references will be generated.
+</para></listitem>
+</varlistentry>
+<varlistentry>
+<term>yes</term>
+<listitem><para>Page number references will be generated
+for all <tag>link</tag> elements.
+The style of page reference may be changed
+if an <tag class="attribute">xrefstyle</tag>
+attribute is used.
+</para></listitem>
+</varlistentry>
+<varlistentry>
+<term>maybe</term>
+<listitem><para>Page number references will not be generated
+for a <tag>link</tag> element unless
+it has an
+<tag class="attribute">xrefstyle</tag>
+attribute whose value specifies a page reference.
+</para></listitem>
+</varlistentry>
+</variablelist>
+
+<para>Although the <tag>xrefstyle</tag> attribute
+can be used to turn the page reference on or off, it cannot be
+used to control the formatting of the page number as it
+can in <tag>xref</tag>.
+In <tag>link</tag> it will always format with
+the style established by the
+gentext template with <literal>name="page.citation"</literal>
+in the <literal>l:context name="xref"</literal>.
+</para>
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/insert.olink.page.number.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/insert.olink.page.number.xml
new file mode 100644
index 0000000..dc6da3d
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/insert.olink.page.number.xml
@@ -0,0 +1,83 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="insert.olink.page.number">
+<refmeta>
+<refentrytitle>insert.olink.page.number</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">list</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">no</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">yes</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">maybe</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>insert.olink.page.number</refname>
+<refpurpose>Turns page numbers in olinks on and off</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="insert.olink.page.number.frag">
+<xsl:param name="insert.olink.page.number">no</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The value of this parameter determines if
+cross references made between documents with
+<tag>olink</tag> will
+include page number citations.
+In most cases this is only applicable to references in printed output.
+</para>
+<para>The parameter has three possible values.
+</para>
+<variablelist>
+<varlistentry>
+<term>no</term>
+<listitem><para>No page number references will be generated for olinks.
+</para></listitem>
+</varlistentry>
+<varlistentry>
+<term>yes</term>
+<listitem><para>Page number references will be generated
+for all <tag>olink</tag> references.
+The style of page reference may be changed
+if an <tag class="attribute">xrefstyle</tag>
+attribute is used.
+</para></listitem>
+</varlistentry>
+<varlistentry>
+<term>maybe</term>
+<listitem><para>Page number references will not be generated
+for an <tag>olink</tag> element unless
+it has an
+<tag class="attribute">xrefstyle</tag>
+attribute whose value specifies a page reference.
+</para></listitem>
+</varlistentry>
+</variablelist>
+<para>Olinks that point to targets within the same document
+are treated as <tag>xref</tag>s, and controlled by
+the <parameter>insert.xref.page.number</parameter> parameter.
+</para>
+
+<para>Page number references for olinks to
+external documents can only be inserted if the
+information exists in the olink database.
+This means each olink target element
+(<tag>div</tag> or <tag>obj</tag>)
+must have a <tag class="attribute">page</tag> attribute
+whose value is its page number in the target document.
+The XSL stylesheets are not able to extract that information
+during processing because pages have not yet been created in
+XSLT transformation. Only the XSL-FO processor knows what
+page each element is placed on.
+Therefore some postprocessing must take place to populate
+page numbers in the olink database.
+</para>
+
+
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/insert.olink.pdf.frag.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/insert.olink.pdf.frag.xml
new file mode 100644
index 0000000..e937060
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/insert.olink.pdf.frag.xml
@@ -0,0 +1,68 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="insert.olink.pdf.frag">
+<refmeta>
+<refentrytitle>insert.olink.pdf.frag</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>insert.olink.pdf.frag</refname>
+<refpurpose>Add fragment identifiers for links into PDF files</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="insert.olink.pdf.frag.frag">
+<xsl:param name="insert.olink.pdf.frag" select="0"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The value of this parameter determines whether
+the cross reference URIs to PDF documents made with
+<tag>olink</tag> will
+include fragment identifiers.
+</para>
+
+<para>When forming a URI to link to a PDF document,
+a fragment identifier (typically a '#' followed by an
+id value) appended to the PDF filename can be used by
+the PDF viewer to open
+the PDF file to a location within the document instead of
+the first page.
+However, not all PDF files have id
+values embedded in them, and not all PDF viewers can
+handle fragment identifiers.
+</para>
+
+<para>If <parameter>insert.olink.pdf.frag</parameter> is set
+to a non-zero value, then any olink targeting a
+PDF file will have the fragment identifier appended to the URI.
+The URI is formed by concatenating the value of the
+<parameter>olink.base.uri</parameter> parameter, the
+value of the <tag class="attribute">baseuri</tag>
+attribute from the <tag class="element">document</tag>
+element in the olink database with the matching
+<tag class="attribute">targetdoc</tag> value,
+and the value of the <tag class="attribute">href</tag>
+attribute for the targeted element in the olink database.
+The <tag class="attribute">href</tag> attribute
+contains the fragment identifier.
+</para>
+
+<para>If <parameter>insert.olink.pdf.frag</parameter> is set
+to zero (the default value), then
+the <tag class="attribute">href</tag> attribute
+from the olink database
+is not appended to PDF olinks, so the fragment identifier is left off.
+A PDF olink is any olink for which the
+<tag class="attribute">baseuri</tag> attribute
+from the matching <tag class="element">document</tag>
+element in the olink database ends with '.pdf'.
+Any other olinks will still have the fragment identifier added.
+</para>
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/insert.xref.page.number.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/insert.xref.page.number.xml
new file mode 100644
index 0000000..8c3aa07
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/insert.xref.page.number.xml
@@ -0,0 +1,60 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="insert.xref.page.number">
+<refmeta>
+<refentrytitle>insert.xref.page.number</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">list</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">no</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">yes</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">maybe</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>insert.xref.page.number</refname>
+<refpurpose>Turns page numbers in xrefs on and off</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="insert.xref.page.number.frag">
+<xsl:param name="insert.xref.page.number">no</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The value of this parameter determines if
+cross references (<tag>xref</tag>s) in
+printed output will
+include page number citations.
+It has three possible values.
+</para>
+<variablelist>
+<varlistentry>
+<term>no</term>
+<listitem><para>No page number references will be generated.
+</para></listitem>
+</varlistentry>
+<varlistentry>
+<term>yes</term>
+<listitem><para>Page number references will be generated
+for all <tag>xref</tag> elements.
+The style of page reference may be changed
+if an <tag class="attribute">xrefstyle</tag>
+attribute is used.
+</para></listitem>
+</varlistentry>
+<varlistentry>
+<term>maybe</term>
+<listitem><para>Page number references will not be generated
+for an <tag>xref</tag> element unless
+it has an
+<tag class="attribute">xrefstyle</tag>
+attribute whose value specifies a page reference.
+</para></listitem>
+</varlistentry>
+</variablelist>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/itemizedlist.label.properties.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/itemizedlist.label.properties.xml
new file mode 100644
index 0000000..49f8ee6
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/itemizedlist.label.properties.xml
@@ -0,0 +1,26 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="itemizedlist.label.properties">
+<refmeta>
+<refentrytitle>itemizedlist.label.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>itemizedlist.label.properties</refname>
+<refpurpose>Properties that apply to each label inside itemized list.</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="itemizedlist.label.properties.frag"><xsl:attribute-set name="itemizedlist.label.properties">
+</xsl:attribute-set></src:fragment>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+<para>Properties that apply to each label inside itemized list. E.g.:</para>
+<programlisting>&lt;xsl:attribute-set name="itemizedlist.label.properties"&gt;
+ &lt;xsl:attribute name="text-align"&gt;right&lt;/xsl:attribute&gt;
+&lt;/xsl:attribute-set&gt;</programlisting>
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/itemizedlist.label.width.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/itemizedlist.label.width.xml
new file mode 100644
index 0000000..1d2c88c
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/itemizedlist.label.width.xml
@@ -0,0 +1,28 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="itemizedlist.label.width">
+<refmeta>
+<refentrytitle>itemizedlist.label.width</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">length</refmiscinfo>
+</refmeta>
+<refnamediv>
+ <refname>itemizedlist.label.width</refname>
+<refpurpose>The default width of the label (bullet) in an itemized list.</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+ <src:fragment xml:id="itemizedlist.label.width.frag">
+ <xsl:param name="itemizedlist.label.width">1.0em</xsl:param>
+ </src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+<para>Specifies the default width of the label (usually a bullet or other
+symbol) in an itemized list. You can override the default value on any
+particular list with the “dbfo†processing instruction using the
+“label-width†pseudoattribute.</para>
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/itemizedlist.properties.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/itemizedlist.properties.xml
new file mode 100644
index 0000000..d7c7c1d
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/itemizedlist.properties.xml
@@ -0,0 +1,23 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="itemizedlist.properties">
+<refmeta>
+<refentrytitle>itemizedlist.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>itemizedlist.properties</refname>
+<refpurpose>Properties that apply to each list-block generated by itemizedlist.</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="itemizedlist.properties.frag"><xsl:attribute-set name="itemizedlist.properties" use-attribute-sets="list.block.properties">
+</xsl:attribute-set></src:fragment>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+<para>Properties that apply to each fo:list-block generated by itemizedlist.</para>
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/javahelp.encoding.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/javahelp.encoding.xml
new file mode 100644
index 0000000..ba729c8
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/javahelp.encoding.xml
@@ -0,0 +1,31 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="javahelp.encoding">
+<refmeta>
+<refentrytitle>javahelp.encoding</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>javahelp.encoding</refname>
+<refpurpose>Character encoding to use in control files for JavaHelp.</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="javahelp.encoding.frag">
+<xsl:param name="javahelp.encoding">iso-8859-1</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>JavaHelp crashes on some characters when written as character
+references. In that case you can use this parameter to select an appropriate encoding.</para>
+
+</refsection>
+</refentry>
+
+
+
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/keep.relative.image.uris.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/keep.relative.image.uris.xml
new file mode 100644
index 0000000..3a5a098
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/keep.relative.image.uris.xml
@@ -0,0 +1,34 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="keep.relative.image.uris">
+<refmeta>
+<refentrytitle>keep.relative.image.uris</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>keep.relative.image.uris</refname>
+<refpurpose>Should image URIs be resolved against xml:base?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="keep.relative.image.uris.frag">
+<xsl:param condition="html" name="keep.relative.image.uris" select="1"/>
+<xsl:param condition="fo" name="keep.relative.image.uris" select="0"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, relative URIs (in, for example
+<literal>fileref</literal> attributes) will be used in the generated
+output. Otherwise, the URIs will be made absolute with respect to the
+base URI.</para>
+
+<para>Note that the stylesheets calculate (and use) the absolute form
+for some purposes, this only applies to the resulting output.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/keyboard.nav.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/keyboard.nav.xml
new file mode 100644
index 0000000..49b0c0b
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/keyboard.nav.xml
@@ -0,0 +1,29 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="keyboard.nav">
+<refmeta>
+<refentrytitle>keyboard.nav</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>keyboard.nav</refname>
+<refpurpose>Enable keyboard navigation?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="keyboard.nav.frag">
+<xsl:param name="keyboard.nav" select="1"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, JavaScript is added to the slides to enable keyboard
+navigation. Pressing 'n', space, or return moves forward; pressing 'p' moves
+backward.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/l10n.gentext.default.language.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/l10n.gentext.default.language.xml
new file mode 100644
index 0000000..ed89e06
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/l10n.gentext.default.language.xml
@@ -0,0 +1,30 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0"
+ xml:id="l10n.gentext.default.language">
+ <refmeta>
+ <refentrytitle>l10n.gentext.default.language</refentrytitle>
+ <refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+ </refmeta>
+ <refnamediv>
+ <refname>l10n.gentext.default.language</refname>
+ <refpurpose>Sets the default language for generated text</refpurpose>
+ </refnamediv>
+
+ <refsynopsisdiv>
+<src:fragment xml:id="l10n.gentext.default.language.frag">
+<xsl:param name="l10n.gentext.default.language">en</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The value of the <parameter>l10n.gentext.default.language</parameter>
+parameter is used as the language for generated text if no setting is provided
+in the source document.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/l10n.gentext.language.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/l10n.gentext.language.xml
new file mode 100644
index 0000000..ff941c7
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/l10n.gentext.language.xml
@@ -0,0 +1,33 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="l10n.gentext.language">
+<refmeta>
+<refentrytitle>l10n.gentext.language</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>l10n.gentext.language</refname>
+<refpurpose>Sets the gentext language</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="l10n.gentext.language.frag">
+<xsl:param name="l10n.gentext.language"></xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If this parameter is set to any value other than the empty string, its
+value will be used as the value for the language when generating text. Setting
+<parameter>l10n.gentext.language</parameter> overrides any settings within the
+document being formatted.</para>
+
+<para>It's much more likely that you might want to set the
+<parameter>l10n.gentext.default.language</parameter> parameter.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/l10n.gentext.use.xref.language.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/l10n.gentext.use.xref.language.xml
new file mode 100644
index 0000000..d70017a
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/l10n.gentext.use.xref.language.xml
@@ -0,0 +1,53 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="l10n.gentext.use.xref.language">
+<refmeta>
+<refentrytitle>l10n.gentext.use.xref.language</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>l10n.gentext.use.xref.language</refname>
+<refpurpose>Use the language of target when generating cross-reference text?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="l10n.gentext.use.xref.language.frag">
+<xsl:param name="l10n.gentext.use.xref.language" select="0"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, the language of the target will be used when
+generating cross reference text. Usually, the <quote>current</quote>
+language is used when generating text (that is, the language of the
+element that contains the cross-reference element). But setting this parameter
+allows the language of the element <emphasis>pointed to</emphasis> to control
+the generated text.</para>
+
+<para>Consider the following example:</para>
+
+<informalexample>
+<programlisting>&lt;para lang="en"&gt;See also &lt;xref linkend="chap3"/&gt;.&lt;/para&gt;
+</programlisting>
+</informalexample>
+
+<para>Suppose that Chapter 3 happens to be written in German.
+If <parameter>l10n.gentext.use.xref.language</parameter> is non-zero, the
+resulting text will be something like this:</para>
+
+<blockquote>
+<para>See also Kapital 3.</para>
+</blockquote>
+
+<para>Where the more traditional rendering would be:</para>
+
+<blockquote>
+<para>See also Chapter 3.</para>
+</blockquote>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/l10n.lang.value.rfc.compliant.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/l10n.lang.value.rfc.compliant.xml
new file mode 100644
index 0000000..e0dbd79
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/l10n.lang.value.rfc.compliant.xml
@@ -0,0 +1,57 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="l10n.lang.value.rfc.compliant">
+<refmeta>
+<refentrytitle>l10n.lang.value.rfc.compliant</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>l10n.lang.value.rfc.compliant</refname>
+<refpurpose>Make value of lang attribute RFC compliant?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="l10n.lang.value.rfc.compliant.frag">
+<xsl:param name="l10n.lang.value.rfc.compliant" select="1"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, ensure that the values for all <tag class="attribute">lang</tag> attributes in HTML output are RFC
+compliant<footnote><para>Section 8.1.1, <link xlink:href="http://www.w3.org/TR/REC-html40/struct/dirlang.html#h-8.1.1">Language Codes</link>, in the HTML 4.0 Recommendation states that:
+
+<blockquote><para>[RFC1766] defines and explains the language codes
+that must be used in HTML documents.</para>
+<para>Briefly, language codes consist of a primary code and a possibly
+empty series of subcodes:
+
+<literallayout class="monospaced">language-code = primary-code ( "-" subcode )*</literallayout>
+</para>
+<para>And in RFC 1766, <link xlink:href="http://www.ietf.org/rfc/rfc1766.txt">Tags for the Identification
+of Languages</link>, the EBNF for "language tag" is given as:
+
+<literallayout class="monospaced">Language-Tag = Primary-tag *( "-" Subtag )
+Primary-tag = 1*8ALPHA
+Subtag = 1*8ALPHA</literallayout>
+</para>
+</blockquote>
+</para></footnote>.
+
+by taking any underscore characters in any <tag class="attribute">lang</tag> values found in source documents, and
+replacing them with hyphen characters in output HTML files. For
+example, <literal>zh_CN</literal> in a source document becomes
+<literal>zh-CN</literal> in the HTML output form that source.
+
+<note>
+<para>This parameter does not cause any case change in <tag class="attribute">lang</tag> values, because RFC 1766
+explicitly states that all "language tags" (as it calls them) "are
+to be treated as case insensitive".</para>
+</note>
+</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/label.from.part.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/label.from.part.xml
new file mode 100644
index 0000000..5deb960
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/label.from.part.xml
@@ -0,0 +1,38 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="label.from.part">
+<refmeta>
+<refentrytitle>label.from.part</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>label.from.part</refname>
+<refpurpose>Renumber components in each part?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="label.from.part.frag">
+<xsl:param name="label.from.part" select="0"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If <parameter>label.from.part</parameter> is non-zero, then
+ numbering of components — <tag>preface</tag>,
+ <tag>chapter</tag>, <tag>appendix</tag>, and
+ <tag>reference</tag> (when <tag>reference</tag> occurs at the
+ component level) — is re-started within each
+ <tag>part</tag>.</para>
+<para>If <parameter>label.from.part</parameter> is zero (the
+ default), numbering of components is <emphasis>not</emphasis>
+ re-started within each <tag>part</tag>; instead, components are
+ numbered sequentially throughout each <tag>book</tag>,
+ regardless of whether or not they occur within <tag>part</tag>
+ instances.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/line-height.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/line-height.xml
new file mode 100644
index 0000000..f0f4b32
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/line-height.xml
@@ -0,0 +1,27 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="line-height">
+<refmeta>
+<refentrytitle>line-height</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>line-height</refname>
+<refpurpose>Specify the line-height property</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="line-height.frag">
+<xsl:param name="line-height">normal</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Sets the line-height property.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/linenumbering.everyNth.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/linenumbering.everyNth.xml
new file mode 100644
index 0000000..5e7bcac
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/linenumbering.everyNth.xml
@@ -0,0 +1,29 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="linenumbering.everyNth">
+<refmeta>
+<refentrytitle>linenumbering.everyNth</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">integer</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>linenumbering.everyNth</refname>
+<refpurpose>Indicate which lines should be numbered</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="linenumbering.everyNth.frag">
+<xsl:param name="linenumbering.everyNth">5</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If line numbering is enabled, everyNth line will be
+numbered. Note that numbering is one based, not zero based.
+</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/linenumbering.extension.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/linenumbering.extension.xml
new file mode 100644
index 0000000..726781a
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/linenumbering.extension.xml
@@ -0,0 +1,30 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="linenumbering.extension">
+<refmeta>
+<refentrytitle>linenumbering.extension</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>linenumbering.extension</refname>
+<refpurpose>Enable the line numbering extension</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="linenumbering.extension.frag">
+<xsl:param name="linenumbering.extension" select="1"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, verbatim environments (<tag>address</tag>, <tag>literallayout</tag>,
+<tag>programlisting</tag>, <tag>screen</tag>, <tag>synopsis</tag>) that specify line numbering will
+have line numbers.
+</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/linenumbering.separator.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/linenumbering.separator.xml
new file mode 100644
index 0000000..8bf7d22
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/linenumbering.separator.xml
@@ -0,0 +1,30 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="linenumbering.separator">
+<refmeta>
+<refentrytitle>linenumbering.separator</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>linenumbering.separator</refname>
+<refpurpose>Specify a separator between line numbers and lines</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="linenumbering.separator.frag">
+<xsl:param name="linenumbering.separator"><xsl:text> </xsl:text></xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The separator is inserted between line numbers and lines in the
+verbatim environment. The default value is a single white space.
+ Note the interaction with <parameter>linenumbering.width</parameter>
+</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/linenumbering.width.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/linenumbering.width.xml
new file mode 100644
index 0000000..78515c3
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/linenumbering.width.xml
@@ -0,0 +1,29 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="linenumbering.width">
+<refmeta>
+<refentrytitle>linenumbering.width</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">integer</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>linenumbering.width</refname>
+<refpurpose>Indicates the width of line numbers</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="linenumbering.width.frag">
+<xsl:param name="linenumbering.width">3</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If line numbering is enabled, line numbers will appear right
+justified in a field "width" characters wide.
+</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/link.mailto.url.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/link.mailto.url.xml
new file mode 100644
index 0000000..0715b32
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/link.mailto.url.xml
@@ -0,0 +1,29 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="link.mailto.url">
+<refmeta>
+<refentrytitle>link.mailto.url</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>link.mailto.url</refname>
+<refpurpose>Mailto URL for the LINK REL=made HTML HEAD element</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="link.mailto.url.frag">
+<xsl:param name="link.mailto.url"></xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If not the empty string, this address will be used for the
+rel=made <literal>link</literal> element in the html <literal>head</literal>
+</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/list.block.properties.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/list.block.properties.xml
new file mode 100644
index 0000000..dbf9dfc
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/list.block.properties.xml
@@ -0,0 +1,25 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="list.block.properties">
+<refmeta>
+<refentrytitle>list.block.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>list.block.properties</refname>
+<refpurpose>Properties that apply to each list-block generated by list.</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="list.block.properties.frag"><xsl:attribute-set name="list.block.properties">
+ <xsl:attribute name="provisional-label-separation">0.2em</xsl:attribute>
+ <xsl:attribute name="provisional-distance-between-starts">1.5em</xsl:attribute>
+</xsl:attribute-set></src:fragment>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+<para>Properties that apply to each fo:list-block generated by itemizedlist/orderedlist.</para>
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/list.block.spacing.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/list.block.spacing.xml
new file mode 100644
index 0000000..377e6f8
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/list.block.spacing.xml
@@ -0,0 +1,29 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="list.block.spacing">
+<refmeta>
+<refentrytitle>list.block.spacing</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>list.block.spacing</refname>
+<refpurpose>What spacing do you want before and after lists?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="list.block.spacing.frag"><xsl:attribute-set name="list.block.spacing">
+ <xsl:attribute name="space-before.optimum">1em</xsl:attribute>
+ <xsl:attribute name="space-before.minimum">0.8em</xsl:attribute>
+ <xsl:attribute name="space-before.maximum">1.2em</xsl:attribute>
+ <xsl:attribute name="space-after.optimum">1em</xsl:attribute>
+ <xsl:attribute name="space-after.minimum">0.8em</xsl:attribute>
+ <xsl:attribute name="space-after.maximum">1.2em</xsl:attribute>
+</xsl:attribute-set></src:fragment>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+<para>Specify the spacing required before and after a list. It is necessary to specify the space after a list block because lists can come inside of paras. </para>
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/list.item.spacing.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/list.item.spacing.xml
new file mode 100644
index 0000000..2191652
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/list.item.spacing.xml
@@ -0,0 +1,26 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="list.item.spacing">
+<refmeta>
+<refentrytitle>list.item.spacing</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>list.item.spacing</refname>
+<refpurpose>What space do you want between list items?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="list.item.spacing.frag"><xsl:attribute-set name="list.item.spacing">
+ <xsl:attribute name="space-before.optimum">1em</xsl:attribute>
+ <xsl:attribute name="space-before.minimum">0.8em</xsl:attribute>
+ <xsl:attribute name="space-before.maximum">1.2em</xsl:attribute>
+</xsl:attribute-set></src:fragment>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+<para>Specify what spacing you want between each list item.</para>
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/make.clean.html.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/make.clean.html.xml
new file mode 100644
index 0000000..fbf80d0
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/make.clean.html.xml
@@ -0,0 +1,51 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="make.clean.html">
+<refmeta>
+<refentrytitle>make.clean.html</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>make.clean.html</refname>
+<refpurpose>Make HTML conform to modern coding standards</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="make.clean.html.frag">
+<xsl:param name="make.clean.html" select="0"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If <parameter>make.clean.html</parameter> is true, the stylesheets take
+extra effort to ensure that the resulting HTML is conforms to
+modern HTML coding standards. In addition to eliminating
+excessive and noncompliant coding, it moves presentation
+HTML coding to a CSS stylesheet.</para>
+
+<para>The resulting HTML is dependent on
+CSS for formatting, and so the stylesheet is capable of
+generating a supporting CSS file. The <parameter>docbook.css.source</parameter>
+and <parameter>custom.css.source</parameter> parameters control
+how a CSS file is generated.</para>
+
+<para>If you require your CSS to reside in the HTML
+<tag>head</tag> element, then the <parameter>generate.css.header</parameter>
+can be used to do that.</para>
+
+<para>The <parameter>make.clean.html</parameter> parameter is
+different from <parameter>html.cleanup</parameter>
+because the former changes the resulting markup; it does not use extension functions
+like the latter to manipulate result-tree-fragments,
+and is therefore applicable to any XSLT processor.</para>
+
+<para>If <parameter>make.clean.html</parameter> is set to zero (the default),
+then the stylesheet retains its original
+<quote>old style</quote>
+HTML formatting features.</para>
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/make.graphic.viewport.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/make.graphic.viewport.xml
new file mode 100644
index 0000000..0bad336
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/make.graphic.viewport.xml
@@ -0,0 +1,35 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="make.graphic.viewport">
+<refmeta>
+<refentrytitle>make.graphic.viewport</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>make.graphic.viewport</refname>
+<refpurpose>Use tables in HTML to make viewports for graphics</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="make.graphic.viewport.frag">
+<xsl:param name="make.graphic.viewport" select="1"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The HTML <tag>img</tag> element only supports the notion
+of content-area scaling; it doesn't support the distinction between a
+content-area and a viewport-area, so we have to make some compromises.</para>
+
+<para>If <parameter>make.graphic.viewport</parameter> is non-zero, a table
+will be used to frame the image. This creates an effective viewport-area.
+</para>
+
+<para>Tables and alignment don't work together, so this parameter is ignored
+if alignment is specified on an image.</para>
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/make.index.markup.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/make.index.markup.xml
new file mode 100644
index 0000000..7942b5a
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/make.index.markup.xml
@@ -0,0 +1,73 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="make.index.markup">
+<refmeta>
+<refentrytitle>make.index.markup</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>make.index.markup</refname>
+<refpurpose>Generate XML index markup in the index?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="make.index.markup.frag">
+<xsl:param name="make.index.markup" select="0"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>This parameter enables a very neat trick for getting properly
+merged, collated back-of-the-book indexes. G. Ken Holman suggested
+this trick at Extreme Markup Languages 2002 and I'm indebted to him
+for it.</para>
+
+<para>Jeni Tennison's excellent code in
+<filename>autoidx.xsl</filename> does a great job of merging and
+sorting <tag>indexterm</tag>s in the document and building a
+back-of-the-book index. However, there's one thing that it cannot
+reasonably be expected to do: merge page numbers into ranges. (I would
+not have thought that it could collate and suppress duplicate page
+numbers, but in fact it appears to manage that task somehow.)</para>
+
+<para>Ken's trick is to produce a document in which the index at the
+back of the book is <quote>displayed</quote> in XML. Because the index
+is generated by the FO processor, all of the page numbers have been resolved.
+It's a bit hard to explain, but what it boils down to is that instead of having
+an index at the back of the book that looks like this:</para>
+
+<blockquote>
+<formalpara><info><title>A</title></info>
+<para>ap1, 1, 2, 3</para>
+</formalpara>
+</blockquote>
+
+<para>you get one that looks like this:</para>
+
+<blockquote>
+<programlisting>&lt;indexdiv&gt;A&lt;/indexdiv&gt;
+&lt;indexentry&gt;
+&lt;primaryie&gt;ap1&lt;/primaryie&gt;,
+&lt;phrase role="pageno"&gt;1&lt;/phrase&gt;,
+&lt;phrase role="pageno"&gt;2&lt;/phrase&gt;,
+&lt;phrase role="pageno"&gt;3&lt;/phrase&gt;
+&lt;/indexentry&gt;</programlisting>
+</blockquote>
+
+<para>After building a PDF file with this sort of odd-looking index, you can
+extract the text from the PDF file and the result is a proper index expressed in
+XML.</para>
+
+<para>Now you have data that's amenable to processing and a simple Perl script
+(such as <filename>fo/pdf2index</filename>) can
+merge page ranges and generate a proper index.</para>
+
+<para>Finally, reformat your original document using this literal index instead of
+an automatically generated one and <quote>bingo</quote>!</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/make.single.year.ranges.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/make.single.year.ranges.xml
new file mode 100644
index 0000000..c49ab97
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/make.single.year.ranges.xml
@@ -0,0 +1,28 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="make.single.year.ranges">
+<refmeta>
+<refentrytitle>make.single.year.ranges</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>make.single.year.ranges</refname>
+<refpurpose>Print single-year ranges (e.g., 1998-1999)</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="make.single.year.ranges.frag">
+<xsl:param name="make.single.year.ranges" select="0"/></src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, year ranges that span a single year will be printed
+in range notation (1998-1999) instead of discrete notation
+(1998, 1999).</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/make.valid.html.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/make.valid.html.xml
new file mode 100644
index 0000000..8618d39
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/make.valid.html.xml
@@ -0,0 +1,35 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="make.valid.html">
+<refmeta>
+<refentrytitle>make.valid.html</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>make.valid.html</refname>
+<refpurpose>Attempt to make sure the HTML output is valid HTML</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="make.valid.html.frag">
+<xsl:param name="make.valid.html" select="0"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If <parameter>make.valid.html</parameter> is true, the stylesheets take
+extra effort to ensure that the resulting HTML is valid. This may mean that some
+<tag>para</tag> tags are translated into HTML <tag>div</tag>s or
+that other substitutions occur.</para>
+
+<para>This parameter is different from <parameter>html.cleanup</parameter>
+because it changes the resulting markup; it does not use extension functions
+to manipulate result-tree-fragments and is therefore applicable to any
+XSLT processor.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/make.year.ranges.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/make.year.ranges.xml
new file mode 100644
index 0000000..b1a2382
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/make.year.ranges.xml
@@ -0,0 +1,32 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="make.year.ranges">
+<refmeta>
+<refentrytitle>make.year.ranges</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>make.year.ranges</refname>
+<refpurpose>Collate copyright years into ranges?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="make.year.ranges.frag"><xsl:param name="make.year.ranges" select="0"/></src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, multiple copyright <tag>year</tag> elements will be
+collated into ranges.
+This works only if each year number is put into a separate
+year element. The copyright element permits multiple
+year elements. If a year element contains a dash or
+a comma, then that year element will not be merged into
+any range.
+</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.authors.section.enabled.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.authors.section.enabled.xml
new file mode 100644
index 0000000..73cb637
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.authors.section.enabled.xml
@@ -0,0 +1,46 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="man.authors.section.enabled">
+<refmeta>
+<refentrytitle>man.authors.section.enabled</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>man.authors.section.enabled</refname>
+<refpurpose>Display auto-generated AUTHORS section?</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+<src:fragment xml:id="man.authors.section.enabled.frag">
+<xsl:param name="man.authors.section.enabled">1</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+
+<para>If the value of
+<parameter>man.authors.section.enabled</parameter> is non-zero
+(the default), then an <literal>AUTHORS</literal> section is
+generated near the end of each man page. The output of the
+<literal>AUTHORS</literal> section is assembled from any
+<tag>author</tag>, <tag>editor</tag>, and <tag>othercredit</tag>
+metadata found in the contents of the child <tag>info</tag> or
+<tag>refentryinfo</tag> (if any) of the <tag>refentry</tag>
+itself, or from any <tag>author</tag>, <tag>editor</tag>, and
+<tag>othercredit</tag> metadata that may appear in <tag>info</tag>
+contents of any ancestors of the <tag>refentry</tag>.</para>
+
+<para>If the value of
+<parameter>man.authors.section.enabled</parameter> is zero, the
+the auto-generated <literal>AUTHORS</literal> section is
+suppressed.</para>
+
+<para>Set the value of
+ <parameter>man.authors.section.enabled</parameter> to zero if
+ you want to have a manually created <literal>AUTHORS</literal>
+ section in your source, and you want it to appear in output
+ instead of the auto-generated <literal>AUTHORS</literal>
+ section.</para>
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.base.url.for.relative.links.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.base.url.for.relative.links.xml
new file mode 100644
index 0000000..a802ec8
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.base.url.for.relative.links.xml
@@ -0,0 +1,76 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="man.base.url.for.relative.links">
+ <refmeta>
+ <refentrytitle>man.base.url.for.relative.links</refentrytitle>
+ <refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+ </refmeta>
+ <refnamediv>
+ <refname>man.base.url.for.relative.links</refname>
+ <refpurpose>Specifies a base URL for relative links</refpurpose>
+ </refnamediv>
+
+ <refsynopsisdiv>
+ <src:fragment xml:id="man.base.url.for.relative.links.frag"><xsl:param name="man.base.url.for.relative.links">[set $man.base.url.for.relative.links]/</xsl:param></src:fragment>
+ </refsynopsisdiv>
+
+ <refsection><info><title>Description</title></info>
+
+ <para>For any “notesource†listed in the auto-generated
+ “NOTES†section of output man pages (which is generated when
+ the value of the
+ <parameter>man.endnotes.list.enabled</parameter> parameter
+ is non-zero), if the notesource is a link source with a
+ relative URI, the URI is displayed in output with the value
+ of the
+ <parameter>man.base.url.for.relative.links</parameter>
+ parameter prepended to the value of the link URI.</para>
+
+ <note>
+ <para>A link source is an notesource that references an
+ external resource:
+ <itemizedlist>
+ <listitem>
+ <para>a <tag>ulink</tag> element with a <tag
+ class="attribute">url</tag> attribute</para>
+ </listitem>
+ <listitem>
+ <para>any element with an <tag
+ class="attribute">xlink:href</tag> attribute</para>
+ </listitem>
+ <listitem>
+ <para>an <tag>imagedata</tag>, <tag>audiodata</tag>, or
+ <tag>videodata</tag> element</para>
+ </listitem>
+ </itemizedlist>
+ </para>
+ </note>
+
+ <para>If you use relative URIs in link sources in your DocBook
+ <tag>refentry</tag> source, and you leave
+ <parameter>man.base.url.for.relative.links</parameter>
+ unset, the relative links will appear “as is†in the “Notesâ€
+ section of any man-page output generated from your source.
+ That’s probably not what you want, because such relative
+ links are only usable in the context of HTML output. So, to
+ make the links meaningful and usable in the context of
+ man-page output, set a value for
+ <parameter>man.base.url.for.relative.links</parameter> that
+ points to the online version of HTML output generated from
+ your DocBook <tag>refentry</tag> source. For
+ example:
+ <programlisting
+ >&lt;xsl:param name="man.base.url.for.relative.links"
+ >http://www.kernel.org/pub/software/scm/git/docs/&lt;/xsl:param></programlisting>
+ </para>
+
+ </refsection>
+
+ <refsection><info><title>Related Parameters</title></info>
+ <para><parameter>man.endnotes.list.enabled</parameter></para>
+ </refsection>
+
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.break.after.slash.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.break.after.slash.xml
new file mode 100644
index 0000000..859edb7
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.break.after.slash.xml
@@ -0,0 +1,46 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="man.break.after.slash">
+<refmeta>
+<refentrytitle>man.break.after.slash</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>man.break.after.slash</refname>
+<refpurpose>Enable line-breaking after slashes?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="man.break.after.slash.frag">
+<xsl:param name="man.break.after.slash">0</xsl:param></src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, line-breaking after slashes is enabled. This is
+mainly useful for causing long URLs or pathnames/filenames to be
+broken up or "wrapped" across lines (though it also has the side
+effect of sometimes causing relatively short URLs and pathnames to be
+broken up across lines too).</para>
+
+<para>If zero (the default), line-breaking after slashes is
+disabled. In that case, strings containing slashes (for example, URLs
+or filenames) are not broken across lines, even if they exceed the
+maximum column widith.</para>
+
+<warning>
+ <para>If you set a non-zero value for this parameter, check your
+ man-page output carefuly afterwards, in order to make sure that the
+ setting has not introduced an excessive amount of breaking-up of URLs
+ or pathnames. If your content contains mostly short URLs or
+ pathnames, setting a non-zero value for
+ <parameter>man.break.after.slash</parameter> will probably result in
+ in a significant number of relatively short URLs and pathnames being
+ broken across lines, which is probably not what you want.</para>
+</warning>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.charmap.enabled.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.charmap.enabled.xml
new file mode 100644
index 0000000..5522339
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.charmap.enabled.xml
@@ -0,0 +1,55 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="man.charmap.enabled">
+<refmeta>
+<refentrytitle>man.charmap.enabled</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>man.charmap.enabled</refname>
+<refpurpose>Apply character map before final output?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="man.charmap.enabled.frag">
+<xsl:param name="man.charmap.enabled" select="1"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If the value of the <parameter>man.charmap.enabled</parameter>
+parameter is non-zero, a "character map" is used to substitute certain
+Unicode symbols and special characters with appropriate roff/groff
+equivalents, just before writing each man-page file to the
+filesystem. If instead the value of
+<parameter>man.charmap.enabled</parameter> is zero, Unicode characters
+are passed through "as is".</para>
+
+<refsection><info><title>Details</title></info>
+
+<para>For converting certain Unicode symbols and special characters in
+UTF-8 or UTF-16 encoded XML source to appropriate groff/roff
+equivalents in man-page output, the DocBook XSL Stylesheets
+distribution includes a <link xlink:href="http://docbook.sourceforge.net/snapshot/xsl/manpages/charmap.groff.xsl">roff character map</link> that is compliant with the <link xlink:href="http://www.w3.org/TR/xslt20/#character-maps">XSLT character
+map</link> format as detailed in the XSLT 2.0 specification. The map
+contains more than 800 character mappings and can be considered the
+standard roff character map for the distribution.</para>
+
+<para>You can use the <parameter>man.charmap.uri</parameter>
+parameter to specify a URI for the location for an alternate roff
+character map to use in place of the standard roff character map
+provided in the distribution.</para>
+
+<para>You can also use a subset of a character map. For details,
+see the <parameter>man.charmap.use.subset</parameter>,
+<parameter>man.charmap.subset.profile</parameter>, and
+<parameter>man.charmap.subset.profile.english</parameter>
+parameters.</para>
+
+</refsection>
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.charmap.subset.profile.english.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.charmap.subset.profile.english.xml
new file mode 100644
index 0000000..cbc9fb0
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.charmap.subset.profile.english.xml
@@ -0,0 +1,80 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="man.charmap.subset.profile.english">
+<refmeta>
+<refentrytitle>man.charmap.subset.profile.english</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>man.charmap.subset.profile.english</refname>
+<refpurpose>Profile of character map subset</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="man.charmap.subset.profile.english.frag">
+<xsl:param name="man.charmap.subset.profile.english">
+@*[local-name() = 'block'] = 'Miscellaneous Technical' or
+(@*[local-name() = 'block'] = 'C1 Controls And Latin-1 Supplement (Latin-1 Supplement)' and
+ @*[local-name() = 'class'] = 'symbols')
+or
+(@*[local-name() = 'block'] = 'General Punctuation' and
+ (@*[local-name() = 'class'] = 'spaces' or
+ @*[local-name() = 'class'] = 'dashes' or
+ @*[local-name() = 'class'] = 'quotes' or
+ @*[local-name() = 'class'] = 'bullets'
+ )
+) or
+@*[local-name() = 'name'] = 'HORIZONTAL ELLIPSIS' or
+@*[local-name() = 'name'] = 'WORD JOINER' or
+@*[local-name() = 'name'] = 'SERVICE MARK' or
+@*[local-name() = 'name'] = 'TRADE MARK SIGN' or
+@*[local-name() = 'name'] = 'ZERO WIDTH NO-BREAK SPACE'
+</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If the value of the
+ <parameter>man.charmap.use.subset</parameter> parameter is
+ non-zero, and your DocBook source is written in English (that
+ is, if its <tag class="attribute">lang</tag> or <tag
+ class="attribute">xml:lang</tag> attribute on the root element
+ in your DocBook source or on the first <tag>refentry</tag>
+ element in your source has the value <literal>en</literal> or if
+ it has no <tag class="attribute">lang</tag> or <tag
+ class="attribute">xml:lang</tag> attribute), then the
+ character-map subset specified by the
+ <parameter>man.charmap.subset.profile.english</parameter>
+ parameter is used instead of the full roff character map.</para>
+
+<para>Otherwise, if the <tag class="attribute">lang</tag> or <tag
+ class="attribute">xml:lang</tag> attribute
+ on the root element in your DocBook source or on the first
+ <tag>refentry</tag> element in your source has a value other
+ than <literal>en</literal>, then the character-map subset
+ specified by the
+ <parameter>man.charmap.subset.profile</parameter> parameter is
+ used instead of
+ <parameter>man.charmap.subset.profile.english</parameter>.</para>
+
+<para>The difference between the two subsets is that
+ <parameter>man.charmap.subset.profile</parameter> provides
+ mappings for characters in Western European languages that are
+ not part of the Roman (English) alphabet (ASCII character set).</para>
+
+<para>The value of <parameter>man.charmap.subset.profile.english</parameter>
+is a string representing an XPath expression that matches attribute
+names and values for <tag
+ namespace="http://docbook.sf.net/xmlns/unichar/1.0"
+ >output-character</tag> elements in the character map.</para>
+
+<para>For other details, see the documentation for the
+<parameter>man.charmap.subset.profile.english</parameter> and
+<parameter>man.charmap.use.subset</parameter> parameters.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.charmap.subset.profile.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.charmap.subset.profile.xml
new file mode 100644
index 0000000..913a4e3
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.charmap.subset.profile.xml
@@ -0,0 +1,297 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="man.charmap.subset.profile">
+<refmeta>
+<refentrytitle>man.charmap.subset.profile</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>man.charmap.subset.profile</refname>
+<refpurpose>Profile of character map subset</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="man.charmap.subset.profile.frag">
+<xsl:param name="man.charmap.subset.profile">
+@*[local-name() = 'block'] = 'Miscellaneous Technical' or
+(@*[local-name() = 'block'] = 'C1 Controls And Latin-1 Supplement (Latin-1 Supplement)' and
+ (@*[local-name() = 'class'] = 'symbols' or
+ @*[local-name() = 'class'] = 'letters')
+) or
+@*[local-name() = 'block'] = 'Latin Extended-A'
+or
+(@*[local-name() = 'block'] = 'General Punctuation' and
+ (@*[local-name() = 'class'] = 'spaces' or
+ @*[local-name() = 'class'] = 'dashes' or
+ @*[local-name() = 'class'] = 'quotes' or
+ @*[local-name() = 'class'] = 'bullets'
+ )
+) or
+@*[local-name() = 'name'] = 'HORIZONTAL ELLIPSIS' or
+@*[local-name() = 'name'] = 'WORD JOINER' or
+@*[local-name() = 'name'] = 'SERVICE MARK' or
+@*[local-name() = 'name'] = 'TRADE MARK SIGN' or
+@*[local-name() = 'name'] = 'ZERO WIDTH NO-BREAK SPACE'
+</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If the value of the
+<parameter>man.charmap.use.subset</parameter> parameter is non-zero,
+and your DocBook source is not written in English (that
+ is, if the <tag class="attribute">lang</tag> or <tag
+ class="attribute">xml:lang</tag> attribute on the root element
+ in your DocBook source or on the first <tag>refentry</tag>
+ element in your source has a value other than
+ <literal>en</literal>), then the character-map subset specified
+ by the <parameter>man.charmap.subset.profile</parameter>
+ parameter is used instead of the full roff character map.</para>
+
+<para>Otherwise, if the <tag class="attribute">lang</tag> or <tag
+ class="attribute">xml:lang</tag> attribute on the root
+ element in your DocBook
+ source or on the first <tag>refentry</tag> element in your source
+ has the value <literal>en</literal> or if it has no <tag
+ class="attribute">lang</tag> or <tag
+ class="attribute">xml:lang</tag> attribute, then the character-map
+ subset specified by the
+ <parameter>man.charmap.subset.profile.english</parameter>
+ parameter is used instead of
+ <parameter>man.charmap.subset.profile</parameter>.</para>
+
+<para>The difference between the two subsets is that
+ <parameter>man.charmap.subset.profile</parameter> provides
+ mappings for characters in Western European languages that are
+ not part of the Roman (English) alphabet (ASCII character set).</para>
+
+<para>The value of <parameter>man.charmap.subset.profile</parameter>
+is a string representing an XPath expression that matches attribute
+names and values for <tag
+ namespace="http://docbook.sf.net/xmlns/unichar/1.0">output-character</tag>
+elements in the character map.</para>
+
+<para>The attributes supported in the <link xlink:href="http://docbook.sourceforge.net/snapshot/xsl/manpages/charmap.groff.xsl">standard roff character map included in the distribution</link> are:
+<variablelist>
+ <varlistentry>
+ <term>character</term>
+ <listitem>
+ <simpara>a raw Unicode character or numeric Unicode
+ character-entity value (either in decimal or hex); all
+ characters have this attribute</simpara>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>name</term>
+ <listitem>
+ <simpara>a standard full/long ISO/Unicode character name (e.g.,
+ "OHM SIGN"); all characters have this attribute</simpara>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>block</term>
+ <listitem>
+ <simpara>a standard Unicode "block" name (e.g., "General
+ Punctuation"); all characters have this attribute. For the full
+ list of Unicode block names supported in the standard roff
+ character map, see <xref linkend="BlocksAndClasses"/>.</simpara>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>class</term>
+ <listitem>
+ <simpara>a class of characters (e.g., "spaces"). Not all
+ characters have this attribute; currently, it is used only with
+ certain characters within the "C1 Controls And Latin-1
+ Supplement" and "General Punctuation" blocks. For details, see
+ <xref linkend="BlocksAndClasses"/>.</simpara>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>entity</term>
+ <listitem>
+ <simpara>an ISO entity name (e.g., "ohm"); not all characters
+ have this attribute, because not all characters have ISO entity
+ names; for example, of the 800 or so characters in the standard
+ roff character map included in the distribution, only around 300
+ have ISO entity names.
+ </simpara>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>string</term>
+ <listitem>
+ <simpara>a string representing an roff/groff escape-code (with
+ "@esc@" used in place of the backslash), or a simple ASCII
+ string; all characters in the roff character map have this
+ attribute</simpara>
+ </listitem>
+ </varlistentry>
+</variablelist>
+</para>
+<para>The value of <parameter>man.charmap.subset.profile</parameter>
+is evaluated as an XPath expression at run-time to select a portion of
+the roff character map to use. You can tune the subset used by adding
+or removing parts. For example, if you need to use a wide range of
+mathematical operators in a document, and you want to have them
+converted into roff markup properly, you might add the following:
+
+<literallayout class="monospaced"> @*[local-name() = 'block'] ='MathematicalOperators' </literallayout>
+
+That will cause a additional set of around 67 additional "math"
+characters to be converted into roff markup. </para>
+
+<note>
+<para>Depending on which XSLT engine you use, either the EXSLT
+<function>dyn:evaluate</function> extension function (for xsltproc or
+Xalan) or <function>saxon:evaluate</function> extension function (for
+Saxon) are used to dynamically evaluate the value of
+<parameter>man.charmap.subset.profile</parameter> at run-time. If you
+don't use xsltproc, Saxon, Xalan -- or some other XSLT engine that
+supports <function>dyn:evaluate</function> -- you must either set the
+value of the <parameter>man.charmap.use.subset</parameter> parameter
+to zero and process your documents using the full character map
+instead, or set the value of the
+<parameter>man.charmap.enabled</parameter> parameter to zero instead
+(so that character-map processing is disabled completely.</para>
+</note>
+
+<para>An alternative to using
+<parameter>man.charmap.subset.profile</parameter> is to create your
+own custom character map, and set the value of
+<parameter>man.charmap.uri</parameter> to the URI/filename for
+that. If you use a custom character map, you will probably want to
+include in it just the characters you want to use, and so you will
+most likely also want to set the value of
+<parameter>man.charmap.use.subset</parameter> to zero.</para>
+<para>You can create a
+custom character map by making a copy of the <link xlink:href="http://docbook.sourceforge.net/snapshot/xsl/manpages/charmap.groff.xsl">standard roff character map</link> provided in the distribution, and
+then adding to, changing, and/or deleting from that.</para>
+
+<caution>
+<para>If you author your DocBook XML source in UTF-8 or UTF-16
+encoding and aren't sure what OSes or environments your man-page
+output might end up being viewed on, and not sure what version of
+nroff/groff those environments might have, you should be careful about
+what Unicode symbols and special characters you use in your source and
+what parts you add to the value of
+<parameter>man.charmap.subset.profile</parameter>.</para>
+<para>Many of the escape codes used are specific to groff and using
+them may not provide the expected output on an OS or environment that
+uses nroff instead of groff.</para>
+<para>On the other hand, if you intend for your man-page output to be
+viewed only on modern systems (for example, GNU/Linux systems, FreeBSD
+systems, or Cygwin environments) that have a good, up-to-date groff,
+then you can safely include a wide range of Unicode symbols and
+special characters in your UTF-8 or UTF-16 encoded DocBook XML source
+and add any of the supported Unicode block names to the value of
+<parameter>man.charmap.subset.profile</parameter>.</para>
+</caution>
+
+
+<para>For other details, see the documentation for the
+<parameter>man.charmap.use.subset</parameter> parameter.</para>
+
+<refsection xml:id="BlocksAndClasses"><info><title>Supported Unicode block names and "class" values</title></info>
+
+
+ <para>Below is the full list of Unicode block names and "class"
+ values supported in the standard roff stylesheet provided in the
+ distribution, along with a description of which codepoints from the
+ Unicode range corresponding to that block name or block/class
+ combination are supported.</para>
+
+ <itemizedlist>
+ <listitem>
+ <para><link xlink:href="http://zvon.org/other/charSearch/PHP/search.php?searchType=103&amp;id=C1%20Controls%20and%20Latin-1%20Supplement%20(Latin-1%20Supplement)">C1 Controls And Latin-1 Supplement (Latin-1 Supplement)</link> (x00a0 to x00ff)
+ <itemizedlist><info><title>class values</title></info>
+
+ <listitem>
+ <para>symbols</para>
+ </listitem>
+ <listitem>
+ <para>letters</para>
+ </listitem>
+ </itemizedlist></para>
+ </listitem>
+ <listitem>
+ <para><link xlink:href="http://zvon.org/other/charSearch/PHP/search.php?searchType=103&amp;id=Latin%20Extended-A">Latin Extended-A</link> (x0100 to x017f, partial)</para>
+ </listitem>
+ <listitem>
+ <para><link xlink:href="http://zvon.org/other/charSearch/PHP/search.php?searchType=103&amp;id=Spacing%20Modifier%20Letters">Spacing Modifier Letters</link> (x02b0 to x02ee, partial)</para>
+ </listitem>
+ <listitem>
+ <para><link xlink:href="http://zvon.org/other/charSearch/PHP/search.php?searchType=103&amp;id=Greek%20and%20Coptic">Greek and Coptic</link> (x0370 to x03ff, partial)</para>
+ </listitem>
+ <listitem>
+ <para><link xlink:href="http://zvon.org/other/charSearch/PHP/search.php?searchType=103&amp;id=General%20Punctuation">General Punctuation</link> (x2000 to x206f, partial)
+ <itemizedlist><info><title>class values</title></info>
+
+ <listitem>
+ <para><link xlink:href="http://zvon.org/other/charSearch/PHP/search.php?searchType=103&amp;start=8192&amp;end=8203">spaces</link></para>
+ </listitem>
+ <listitem>
+ <para><link xlink:href="http://zvon.org/other/charSearch/PHP/search.php?searchType=103&amp;start=8208&amp;end=8213">dashes</link></para>
+ </listitem>
+ <listitem>
+ <para>quotes</para>
+ </listitem>
+ <listitem>
+ <para>daggers</para>
+ </listitem>
+ <listitem>
+ <para>bullets</para>
+ </listitem>
+ <listitem>
+ <para>leaders</para>
+ </listitem>
+ <listitem>
+ <para>primes</para>
+ </listitem>
+ </itemizedlist>
+ </para>
+ </listitem>
+ <listitem>
+ <para><link xlink:href="http://zvon.org/other/charSearch/PHP/search.php?searchType=103&amp;id=Superscripts%20and%20Subscripts">Superscripts and Subscripts</link> (x2070 to x209f)</para>
+ </listitem>
+ <listitem>
+ <para><link xlink:href="http://zvon.org/other/charSearch/PHP/search.php?searchType=103&amp;id=Currency%20Symbols">Currency Symbols</link> (x20a0 to x20b1)</para>
+ </listitem>
+ <listitem>
+ <para><link xlink:href="http://zvon.org/other/charSearch/PHP/search.php?searchType=103&amp;id=Letterlike%20Symbols">Letterlike Symbols</link> (x2100 to x214b)</para>
+ </listitem>
+ <listitem>
+ <para><link xlink:href="http://zvon.org/other/charSearch/PHP/search.php?searchType=103&amp;id=Number%20Forms">Number Forms</link> (x2150 to x218f)</para>
+ </listitem>
+ <listitem>
+ <para><link xlink:href="http://zvon.org/other/charSearch/PHP/search.php?searchType=103&amp;id=Arrows">Arrows</link> (x2190 to x21ff, partial)</para>
+ </listitem>
+ <listitem>
+ <para><link xlink:href="http://zvon.org/other/charSearch/PHP/search.php?searchType=103&amp;id=Mathematical%20Operators">Mathematical Operators</link> (x2200 to x22ff, partial)</para>
+ </listitem>
+ <listitem>
+ <para><link xlink:href="http://zvon.org/other/charSearch/PHP/search.php?searchType=103&amp;id=Control%20Pictures">Control Pictures</link> (x2400 to x243f)</para>
+ </listitem>
+ <listitem>
+ <para><link xlink:href="http://zvon.org/other/charSearch/PHP/search.php?searchType=103&amp;id=Enclosed%20Alphanumerics">Enclosed Alphanumerics</link> (x2460 to x24ff)</para>
+ </listitem>
+ <listitem>
+ <para><link xlink:href="http://zvon.org/other/charSearch/PHP/search.php?searchType=103&amp;id=Geometric%20Shapes">Geometric Shapes</link> (x25a0 to x25f7, partial)</para>
+ </listitem>
+ <listitem>
+ <para><link xlink:href="http://zvon.org/other/charSearch/PHP/search.php?searchType=103&amp;id=Miscellaneous%20Symbols">Miscellaneous Symbols</link> (x2600 to x26ff, partial)</para>
+ </listitem>
+ <listitem>
+ <para><link xlink:href="http://zvon.org/other/charSearch/PHP/search.php?searchType=103&amp;id=Dingbats">Dingbats</link> (x2700 to x27be, partial)</para>
+ </listitem>
+ <listitem>
+ <para><link xlink:href="http://zvon.org/other/charSearch/PHP/search.php?searchType=103&amp;id=Alphabetic%20Presentation%20Forms">Alphabetic Presentation Forms</link> (xfb00 to xfb04 only)</para>
+ </listitem>
+ </itemizedlist>
+</refsection>
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.charmap.uri.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.charmap.uri.xml
new file mode 100644
index 0000000..0c8f574
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.charmap.uri.xml
@@ -0,0 +1,42 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="man.charmap.uri">
+<refmeta>
+<refentrytitle>man.charmap.uri</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">uri</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>man.charmap.uri</refname>
+<refpurpose>URI for custom roff character map</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="man.charmap.uri.frag">
+<xsl:param name="man.charmap.uri"></xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>For converting certain Unicode symbols and special characters in
+UTF-8 or UTF-16 encoded XML source to appropriate groff/roff
+equivalents in man-page output, the DocBook XSL Stylesheets
+distribution includes an <link xlink:href="http://www.w3.org/TR/xslt20/#character-maps">XSLT character
+map</link>. That character map can be considered the standard roff
+character map for the distribution.</para>
+
+<para>If the value of the <parameter>man.charmap.uri</parameter>
+parameter is non-empty, that value is used as the URI for the location
+for an alternate roff character map to use in place of the standard
+roff character map provided in the distribution.</para>
+
+<warning>
+<para>Do not set a value for <parameter>man.charmap.uri</parameter>
+unless you have a custom roff character map that differs from the
+standard one provided in the distribution.</para>
+</warning>
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.charmap.use.subset.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.charmap.use.subset.xml
new file mode 100644
index 0000000..4403704
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.charmap.use.subset.xml
@@ -0,0 +1,80 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="man.charmap.use.subset">
+<refmeta>
+<refentrytitle>man.charmap.use.subset</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>man.charmap.use.subset</refname>
+<refpurpose>Use subset of character map instead of full map?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="man.charmap.use.subset.frag">
+<xsl:param name="man.charmap.use.subset" select="1"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If the value of the
+<parameter>man.charmap.use.subset</parameter> parameter is non-zero,
+a subset of the roff character map is used instead of the full roff
+character map. The profile of the subset used is determined either
+by the value of the
+<parameter>man.charmap.subset.profile</parameter>
+parameter (if the source is not in English) or the
+<parameter>man.charmap.subset.profile.english</parameter>
+parameter (if the source is in English).</para>
+
+<note>
+ <para>You may want to experiment with setting a non-zero value of
+ <parameter>man.charmap.use.subset</parameter>, so that the full
+ character map is used. Depending on which XSLT engine you run,
+ setting a non-zero value for
+ <parameter>man.charmap.use.subset</parameter> may significantly
+ increase the time needed to process your documents. Or it may
+ not. For example, if you set it and run it with xsltproc, it seems
+ to dramatically increase processing time; on the other hand, if you
+ set it and run it with Saxon, it does not seem to increase
+ processing time nearly as much.</para>
+
+ <para>If processing time is not a important concern and/or you can
+ tolerate the increase in processing time imposed by using the full
+ character map, set <parameter>man.charmap.use.subset</parameter> to
+ zero.</para>
+</note>
+
+<refsection><info><title>Details</title></info>
+
+<para>For converting certain Unicode symbols and special characters in
+UTF-8 or UTF-16 encoded XML source to appropriate groff/roff
+equivalents in man-page output, the DocBook XSL Stylesheets
+distribution includes a <link xlink:href="http://docbook.sourceforge.net/snapshot/xsl/manpages/charmap.groff.xsl">roff character map</link> that is compliant with the <link xlink:href="http://www.w3.org/TR/xslt20/#character-maps">XSLT character
+map</link> format as detailed in the XSLT 2.0 specification. The map
+contains more than 800 character mappings and can be considered the
+standard roff character map for the distribution.</para>
+
+<note>
+<para>You can use the <parameter>man.charmap.uri</parameter>
+parameter to specify a URI for the location for an alternate roff
+character map to use in place of the standard roff character map
+provided in the distribution.</para>
+</note>
+
+<para>Because it is not terrifically efficient to use the standard
+800-character character map in full -- and for most (or all) users,
+never necessary to use it in full -- the DocBook XSL Stylesheets
+support a mechanism for using, within any given character map, a
+subset of character mappings instead of the full set. You can use the
+<parameter>man.charmap.subset.profile</parameter> or
+<parameter>man.charmap.subset.profile.english</parameter>
+parameter to tune the profile of that subset to use.</para>
+
+</refsection>
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.copyright.section.enabled.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.copyright.section.enabled.xml
new file mode 100644
index 0000000..9e83587
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.copyright.section.enabled.xml
@@ -0,0 +1,46 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="man.copyright.section.enabled">
+<refmeta>
+<refentrytitle>man.copyright.section.enabled</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>man.copyright.section.enabled</refname>
+<refpurpose>Display auto-generated COPYRIGHT section?</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+<src:fragment xml:id="man.copyright.section.enabled.frag">
+<xsl:param name="man.copyright.section.enabled">1</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+
+<para>If the value of
+<parameter>man.copyright.section.enabled</parameter> is non-zero
+(the default), then a <literal>COPYRIGHT</literal> section is
+generated near the end of each man page. The output of the
+<literal>COPYRIGHT</literal> section is assembled from any
+<tag>copyright</tag> and <tag>legalnotice</tag> metadata found in
+the contents of the child <tag>info</tag> or
+<tag>refentryinfo</tag> (if any) of the <tag>refentry</tag>
+itself, or from any <tag>copyright</tag> and
+<tag>legalnotice</tag> metadata that may appear in <tag>info</tag>
+contents of any ancestors of the <tag>refentry</tag>.</para>
+
+<para>If the value of
+<parameter>man.copyright.section.enabled</parameter> is zero, the
+the auto-generated <literal>COPYRIGHT</literal> section is
+suppressed.</para>
+
+<para>Set the value of
+ <parameter>man.copyright.section.enabled</parameter> to zero if
+ you want to have a manually created <literal>COPYRIGHT</literal>
+ section in your source, and you want it to appear in output
+ instead of the auto-generated <literal>COPYRIGHT</literal>
+ section.</para>
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.endnotes.are.numbered.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.endnotes.are.numbered.xml
new file mode 100644
index 0000000..b069ec3
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.endnotes.are.numbered.xml
@@ -0,0 +1,106 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="man.endnotes.are.numbered">
+<refmeta>
+<refentrytitle>man.endnotes.are.numbered</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>man.endnotes.are.numbered</refname>
+<refpurpose>Number endnotes?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="man.endnotes.are.numbered.frag">
+<xsl:param name="man.endnotes.are.numbered">1</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If the value of <parameter>man.endnotes.are.numbered</parameter> is
+non-zero (the default), then for each non-empty<footnote>
+<para>A “non-empty†notesource is one that looks like
+this:<literallayout class="monospaced"> &lt;ulink url="http://docbook.sf.net/snapshot/xsl/doc/manpages/"&gt;manpages&lt;/ulink&gt;</literallayout>
+an “empty†notesource is on that looks like this:<literallayout class="monospaced"> &lt;ulink url="http://docbook.sf.net/snapshot/xsl/doc/manpages/"/&gt;</literallayout>
+</para></footnote> “notesourceâ€:
+
+<itemizedlist>
+ <listitem>
+ <para>a number (in square brackets) is displayed inline after the
+ rendered inline contents (if any) of the notesource</para>
+ </listitem>
+ <listitem>
+ <para>the contents of the notesource are included in a
+ numbered list of endnotes that is generated at the end of
+ each man page; the number for each endnote corresponds to
+ the inline number for the notesource with which it is
+ associated</para>
+ </listitem>
+</itemizedlist>
+The default heading for the list of endnotes is
+<literal>NOTES</literal>. To output a different heading, set a value
+for the <parameter>man.endnotes.section.heading</parameter>
+parameter.</para>
+
+<note>
+ <para>The endnotes list is also displayed (but without
+ numbers) if the value of
+ <parameter>man.endnotes.list.enabled</parameter> is
+ non-zero.</para>
+</note>
+
+
+<para>If the value of <parameter>man.endnotes.are.numbered</parameter> is
+zero, numbering of endnotess is suppressed; only inline
+contents (if any) of the notesource are displayed inline.
+<important>
+ <para>If you are thinking about disabling endnote numbering by setting
+ the value of <parameter>man.endnotes.are.numbered</parameter> to zero,
+ before you do so, first take some time to carefully
+ consider the information needs and experiences of your users. The
+ square-bracketed numbers displayed inline after notesources may seem
+ obstrusive and aesthetically unpleasing<footnote><para>As far as notesources that are links, ytou might
+ think it would be better to just display URLs for non-empty
+ links inline, after their content, rather than displaying
+ square-bracketed numbers all over the place. But it's not better. In
+ fact, it's not even practical, because many (most) URLs for links
+ are too long to be displayed inline. They end up overflowing the
+ right margin. You can set a non-zero value for
+ <parameter>man.break.after.slash</parameter> parameter to deal with
+ that, but it could be argued that what you end up with is at least
+ as ugly, and definitely more obstrusive, then having short
+ square-bracketed numbers displayed inline.</para></footnote>,
+
+ but in a text-only output format, the
+ numbered-notesources/endnotes-listing mechanism is the only
+ practical way to handle this kind of content.</para>
+
+ <para>Also, users of “text based†browsers such as
+ <command>lynx</command> will already be accustomed to seeing inline
+ numbers for links. And various "man to html" applications, such as
+ the widely used <command><link xlink:href="http://users.actrix.gen.nz/michael/vhman2html.html">man2html</link></command> (<literal>VH-Man2html</literal>)
+ application, can automatically turn URLs into "real" HTML hyperlinks
+ in output. So leaving <parameter>man.endnotes.are.numbered</parameter>
+ at its default (non-zero) value ensures that no information is
+ lost in your man-page output. It just gets
+ “rearrangedâ€.</para>
+</important>
+</para>
+<para>The handling of empty links is not affected by this
+parameter. Empty links are handled simply by displaying their URLs
+inline. Empty links are never auto-numbered.</para>
+
+<para>If you disable endnotes numbering, you should probably also set
+<parameter>man.font.links</parameter> to an empty value (to
+disable font formatting for links.</para>
+</refsection>
+
+<refsection><info><title>Related Parameters</title></info>
+ <para><parameter>man.endnotes.list.enabled</parameter>,
+ <parameter>man.font.links</parameter></para>
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.endnotes.list.enabled.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.endnotes.list.enabled.xml
new file mode 100644
index 0000000..89d8188
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.endnotes.list.enabled.xml
@@ -0,0 +1,105 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="man.endnotes.list.enabled">
+<refmeta>
+<refentrytitle>man.endnotes.list.enabled</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>man.endnotes.list.enabled</refname>
+<refpurpose>Display endnotes list at end of man page?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="man.endnotes.list.enabled.frag">
+<xsl:param name="man.endnotes.list.enabled">1</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If the value of <parameter>man.endnotes.list.enabled</parameter> is
+non-zero (the default), then an endnotes list is added to the end of
+the output man page.</para>
+
+<para>If the value of <parameter>man.endnotes.list.enabled</parameter> is
+zero, the list is suppressed — unless link numbering is enabled (that
+is, if <parameter>man.endnotes.are.numbered</parameter> is non-zero), in
+which case, that setting overrides the
+<parameter>man.endnotes.list.enabled</parameter> setting, and the
+endnotes list is still displayed. The reason is that inline
+numbering of notesources associated with endnotes only makes sense
+if a (numbered) list of endnotes is also generated.</para>
+
+<note>
+ <para>Leaving
+ <parameter>man.endnotes.list.enabled</parameter> at its default
+ (non-zero) value ensures that no “out of line†information (such
+ as the URLs for hyperlinks and images) gets lost in your
+ man-page output. It just gets “rearrangedâ€.</para>
+ <para>So if you’re thinking about disabling endnotes listing by
+ setting the value of
+ <parameter>man.endnotes.list.enabled</parameter> to zero:
+ Before you do so, first take some time to carefully consider
+ the information needs and experiences of your users. The “out
+ of line†information has value even if the presentation of it
+ in text output is not as interactive as it may be in other
+ output formats.</para>
+ <para>As far as the specific case of URLs: Even though the URLs
+ displayed in text output may not be “real†(clickable)
+ hyperlinks, many X terminals have convenience features for
+ recognizing URLs and can, for example, present users with
+ an options to open a URL in a browser with the user clicks on
+ the URL is a terminal window. And short of those, users with X
+ terminals can always manually cut and paste the URLs into a web
+ browser.</para>
+ <para>Also, note that various “man to html†tools, such as the
+ widely used <command><link xlink:href="http://users.actrix.gen.nz/michael/vhman2html.html">man2html</link></command> (<literal>VH-Man2html</literal>)
+ application, automatically mark up URLs with <literal>a@href</literal> markup
+ during conversion — resulting in “real†hyperlinks in HTML
+ output from those tools.</para>
+</note>
+
+<para>To “turn off†numbering of endnotes in the
+endnotes list, set <parameter>man.endnotes.are.numbered</parameter>
+to zero. The endnotes list will
+still be displayed; it will just be displayed without the
+numbers<footnote><para>It can still make sense to have
+the list of endnotes displayed even if you have endnotes numbering turned
+off. In that case, your endnotes list basically becomes a “list
+of references†without any association with specific text in
+your document. This is probably the best option if you find the inline
+endnotes numbering obtrusive. Your users will still have access to all the “out of lineâ€
+such as URLs for hyperlinks.</para></footnote>
+</para>
+
+<para>The default heading for the endnotes list is
+<literal>NOTES</literal>. To change that, set a non-empty
+value for the <parameter>man.endnotes.list.heading</parameter>
+parameter.</para>
+
+<para>In the case of notesources that are links: Along with the
+URL for each link, the endnotes list includes the contents of the
+link. The list thus includes only non-empty<footnote>
+
+<para>A “non-empty†link is one that looks like
+this:<literallayout class="monospaced"> &lt;ulink url="http://docbook.sf.net/snapshot/xsl/doc/manpages/"&gt;manpages&lt;/ulink&gt;</literallayout>
+an “empty link†is on that looks like this:<literallayout class="monospaced"> &lt;ulink url="http://docbook.sf.net/snapshot/xsl/doc/manpages/"/&gt;</literallayout>
+</para></footnote> links.
+
+Empty links are never included, and never numbered. They are simply
+displayed inline, without any numbering.</para>
+
+<para>In addition, if there are multiple instances of links in a
+<tag>refentry</tag> that have the same URL, the URL is listed only
+once. The contents listed for that link in the endnotes list are
+the contents of the first link which has that URL.</para>
+
+<para>If you disable endnotes listing, you should probably also set
+<parameter>man.links.are.underlined</parameter> to zero (to disable
+link underlining).</para>
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.endnotes.list.heading.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.endnotes.list.heading.xml
new file mode 100644
index 0000000..fe6545c
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.endnotes.list.heading.xml
@@ -0,0 +1,36 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="man.endnotes.list.heading">
+<refmeta>
+<refentrytitle>man.endnotes.list.heading</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>man.endnotes.list.heading</refname>
+<refpurpose>Specifies an alternate name for endnotes list</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="man.endnotes.list.heading.frag">
+<xsl:param name="man.endnotes.list.heading"></xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If the value of the
+<parameter>man.endnotes.are.numbered</parameter> parameter
+and/or the <parameter>man.endnotes.list.enabled</parameter>
+parameter is non-zero (the defaults for both are non-zero), a
+numbered list of endnotes is generated near the end of each man
+page. The default heading for the list of endnotes is the
+equivalent of the English word <literal>NOTES</literal> in
+the current locale. To cause an alternate heading to be displayed,
+set a non-empty value for the
+<parameter>man.endnotes.list.heading</parameter> parameter —
+for example, <literal>REFERENCES</literal>.</para>
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.font.funcprototype.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.font.funcprototype.xml
new file mode 100644
index 0000000..67b698b
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.font.funcprototype.xml
@@ -0,0 +1,30 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="man.font.funcprototype">
+<refmeta>
+<refentrytitle>man.font.funcprototype</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>man.font.funcprototype</refname>
+<refpurpose>Specifies font for funcprototype output</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="man.font.funcprototype.frag">
+ <xsl:param name="man.font.funcprototype">BI</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The <parameter>man.font.funcprototype</parameter> parameter
+specifies the font for <tag>funcprototype</tag> output. It
+should be a valid roff font name, such as <literal>BI</literal> or
+<literal>B</literal>.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.font.funcsynopsisinfo.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.font.funcsynopsisinfo.xml
new file mode 100644
index 0000000..bd7a36f
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.font.funcsynopsisinfo.xml
@@ -0,0 +1,30 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="man.font.funcsynopsisinfo">
+<refmeta>
+<refentrytitle>man.font.funcsynopsisinfo</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>man.font.funcsynopsisinfo</refname>
+<refpurpose>Specifies font for funcsynopsisinfo output</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="man.font.funcsynopsisinfo.frag">
+ <xsl:param name="man.font.funcsynopsisinfo">B</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The <parameter>man.font.funcsynopsisinfo</parameter> parameter
+specifies the font for <tag>funcsynopsisinfo</tag> output. It
+should be a valid roff font name, such as <literal>B</literal> or
+<literal>I</literal>.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.font.links.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.font.links.xml
new file mode 100644
index 0000000..0f8a1e0
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.font.links.xml
@@ -0,0 +1,64 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="man.font.links">
+<refmeta>
+<refentrytitle>man.font.links</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>man.font.links</refname>
+<refpurpose>Specifies font for links</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="man.font.links.frag">
+<xsl:param name="man.font.links">B</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The <parameter>man.font.links</parameter> parameter
+specifies the font for output of links (<tag>ulink</tag> instances
+and any instances of any element with an <tag
+ class="attribute">xlink:href</tag> attribute).</para>
+
+<para>The value of <parameter>man.font.links</parameter> must be
+ either <literal>B</literal> or <literal>I</literal>, or empty. If
+the value is empty, no font formatting is applied to links.</para>
+
+<para>If you set <parameter>man.endnotes.are.numbered</parameter> and/or
+<parameter>man.endnotes.list.enabled</parameter> to zero (disabled), then
+you should probably also set an empty value for
+<parameter>man.font.links</parameter>. But if
+<parameter>man.endnotes.are.numbered</parameter> is non-zero (enabled),
+you should probably keep
+<parameter>man.font.links</parameter> set to
+<literal>B</literal> or <literal>I</literal><footnote><para>The
+ main purpose of applying a font format to links in most output
+formats it to indicate that the formatted text is
+“clickableâ€; given that links rendered in man pages are
+not “real†hyperlinks that users can click on, it might
+seem like there is never a good reason to have font formatting for
+link contents in man output.</para>
+<para>In fact, if you suppress the
+display of inline link references (by setting
+<parameter>man.endnotes.are.numbered</parameter> to zero), there is no
+good reason to apply font formatting to links. However, if
+<parameter>man.endnotes.are.numbered</parameter> is non-zero, having
+font formatting for links (arguably) serves a purpose: It provides
+“context†information about exactly what part of the text
+is being “annotated†by the link. Depending on how you
+mark up your content, that context information may or may not
+have value.</para></footnote>.</para>
+</refsection>
+
+<refsection><info><title>Related Parameters</title></info>
+ <para><parameter>man.endnotes.list.enabled</parameter>,
+ <parameter>man.endnotes.are.numbered</parameter></para>
+</refsection>
+
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.font.table.headings.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.font.table.headings.xml
new file mode 100644
index 0000000..5056f2b
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.font.table.headings.xml
@@ -0,0 +1,30 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="man.font.table.headings">
+<refmeta>
+<refentrytitle>man.font.table.headings</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>man.font.table.headings</refname>
+<refpurpose>Specifies font for table headings</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="man.font.table.headings.frag">
+ <xsl:param name="man.font.table.headings">B</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The <parameter>man.font.table.headings</parameter> parameter
+specifies the font for <tag>table</tag> headings. It should be
+a valid roff font, such as <literal>B</literal> or
+<literal>I</literal>.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.font.table.title.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.font.table.title.xml
new file mode 100644
index 0000000..a7f2ae9
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.font.table.title.xml
@@ -0,0 +1,30 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="man.font.table.title">
+<refmeta>
+<refentrytitle>man.font.table.title</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>man.font.table.title</refname>
+<refpurpose>Specifies font for table headings</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="man.font.table.title.frag">
+ <xsl:param name="man.font.table.title">B</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The <parameter>man.font.table.title</parameter> parameter
+specifies the font for <tag>table</tag> titles. It should be
+a valid roff font, such as <literal>B</literal> or
+<literal>I</literal>.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.funcsynopsis.style.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.funcsynopsis.style.xml
new file mode 100644
index 0000000..0597087
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.funcsynopsis.style.xml
@@ -0,0 +1,26 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="man.funcsynopsis.style">
+<refmeta>
+<refentrytitle>man.funcsynopsis.style</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">list</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">ansi</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">kr</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>man.funcsynopsis.style</refname>
+<refpurpose>What style of <tag>funcsynopsis</tag> should be generated?</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+<src:fragment xml:id="man.funcsynopsis.style.frag"><xsl:param name="man.funcsynopsis.style">ansi</xsl:param></src:fragment>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+<para>If <parameter>man.funcsynopsis.style</parameter> is
+<literal>ansi</literal>, ANSI-style function synopses are
+generated for a <tag>funcsynopsis</tag>, otherwise K&amp;R-style
+function synopses are generated.</para>
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.hyphenate.computer.inlines.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.hyphenate.computer.inlines.xml
new file mode 100644
index 0000000..3e23ade
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.hyphenate.computer.inlines.xml
@@ -0,0 +1,53 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="man.hyphenate.computer.inlines">
+<refmeta>
+<refentrytitle>man.hyphenate.computer.inlines</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>man.hyphenate.computer.inlines</refname>
+<refpurpose>Hyphenate computer inlines?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="man.hyphenate.computer.inlines.frag">
+<xsl:param name="man.hyphenate.computer.inlines">0</xsl:param></src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If zero (the default), hyphenation is suppressed for
+<quote>computer inlines</quote> such as environment variables,
+constants, etc. This parameter current affects output of the following
+elements:
+<simplelist type="inline">
+ <?dbchoice choice="and" ?>
+ <member><tag>classname</tag></member>
+ <member><tag>constant</tag></member>
+ <member><tag>envar</tag></member>
+ <member><tag>errorcode</tag></member>
+ <member><tag>option</tag></member>
+ <member><tag>replaceable</tag></member>
+ <member><tag>userinput</tag></member>
+ <member><tag>type</tag></member>
+ <member><tag>varname</tag></member>
+</simplelist>
+</para>
+
+<note>
+ <para>If hyphenation is already turned off globally (that is, if
+ <parameter>man.hyphenate</parameter> is zero, setting the
+ <parameter>man.hyphenate.computer.inlines</parameter> is not
+ necessary.</para>
+</note>
+
+<para>If <parameter>man.hyphenate.computer.inlines</parameter> is
+non-zero, computer inlines will not be treated specially and will be
+hyphenated like other words when needed.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.hyphenate.filenames.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.hyphenate.filenames.xml
new file mode 100644
index 0000000..891d6da
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.hyphenate.filenames.xml
@@ -0,0 +1,47 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="man.hyphenate.filenames">
+<refmeta>
+<refentrytitle>man.hyphenate.filenames</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>man.hyphenate.filenames</refname>
+<refpurpose>Hyphenate filenames?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="man.hyphenate.filenames.frag">
+<xsl:param name="man.hyphenate.filenames">0</xsl:param></src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If zero (the default), hyphenation is suppressed for
+<tag>filename</tag> output.</para>
+
+<note>
+ <para>If hyphenation is already turned off globally (that is, if
+ <parameter>man.hyphenate</parameter> is zero, setting
+ <parameter>man.hyphenate.filenames</parameter> is not
+ necessary.</para>
+</note>
+
+<para>If <parameter>man.hyphenate.filenames</parameter> is non-zero,
+filenames will not be treated specially and are subject to hyphenation
+just like other words.</para>
+
+<note>
+ <para>If you are thinking about setting a non-zero value for
+ <parameter>man.hyphenate.filenames</parameter> in order to make long
+ filenames/pathnames break across lines, you'd probably be better off
+ experimenting with setting the
+ <parameter>man.break.after.slash</parameter> parameter first. That
+ will cause long pathnames to be broken after slashes.</para>
+</note>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.hyphenate.urls.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.hyphenate.urls.xml
new file mode 100644
index 0000000..a64dfa7
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.hyphenate.urls.xml
@@ -0,0 +1,46 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="man.hyphenate.urls">
+<refmeta>
+<refentrytitle>man.hyphenate.urls</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>man.hyphenate.urls</refname>
+<refpurpose>Hyphenate URLs?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="man.hyphenate.urls.frag">
+<xsl:param name="man.hyphenate.urls">0</xsl:param></src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If zero (the default), hyphenation is suppressed for output of
+the <tag>ulink</tag> <tag class="attribute">url</tag> attribute.</para>
+
+<note>
+ <para>If hyphenation is already turned off globally (that is, if
+ <parameter>man.hyphenate</parameter> is zero, setting
+ <parameter>man.hyphenate.urls</parameter> is not necessary.</para>
+</note>
+
+<para>If <parameter>man.hyphenate.urls</parameter> is non-zero, URLs
+will not be treated specially and are subject to hyphenation just like
+other words.</para>
+
+<note>
+ <para>If you are thinking about setting a non-zero value for
+ <parameter>man.hyphenate.urls</parameter> in order to make long
+ URLs break across lines, you'd probably be better off
+ experimenting with setting the
+ <parameter>man.break.after.slash</parameter> parameter first. That
+ will cause long URLs to be broken after slashes.</para>
+</note>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.hyphenate.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.hyphenate.xml
new file mode 100644
index 0000000..9198bbb
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.hyphenate.xml
@@ -0,0 +1,59 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="man.hyphenate">
+<refmeta>
+<refentrytitle>man.hyphenate</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>man.hyphenate</refname>
+<refpurpose>Enable hyphenation?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="man.hyphenate.frag">
+<xsl:param name="man.hyphenate">0</xsl:param></src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, hyphenation is enabled.</para>
+
+<note>
+<para>The default value for this parameter is zero because groff is
+not particularly smart about how it does hyphenation; it can end up
+hyphenating a lot of things that you don't want hyphenated. To
+mitigate that, the default behavior of the stylesheets is to suppress
+hyphenation of computer inlines, filenames, and URLs. (You can
+override the default behavior by setting non-zero values for the
+<parameter>man.hyphenate.urls</parameter>,
+<parameter>man.hyphenate.filenames</parameter>, and
+<parameter>man.hyphenate.computer.inlines</parameter> parameters.) But
+the best way is still to just globally disable hyphenation, as the
+stylesheets do by default.</para>
+
+<para>The only good reason to enabled hyphenation is if you have also
+enabled justification (which is disabled by default). The reason is
+that justified text can look very bad unless you also hyphenate it; to
+quote the <quote>Hypenation</quote> node from the groff info page:
+
+<blockquote>
+ <para><emphasis>Since the odds are not great for finding a set of
+ words, for every output line, which fit nicely on a line without
+ inserting excessive amounts of space between words, 'gtroff'
+ hyphenates words so that it can justify lines without inserting too
+ much space between words.</emphasis></para>
+</blockquote>
+
+So, if you set a non-zero value for the
+<parameter>man.justify</parameter> parameter (to enable
+justification), then you should probably also set a non-zero value for
+<parameter>man.hyphenate</parameter> (to enable hyphenation).</para>
+</note>
+
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.indent.blurbs.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.indent.blurbs.xml
new file mode 100644
index 0000000..bf9bb91
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.indent.blurbs.xml
@@ -0,0 +1,33 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="man.indent.blurbs">
+<refmeta>
+<refentrytitle>man.indent.blurbs</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>man.indent.blurbs</refname>
+<refpurpose>Adjust indentation of blurbs?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="man.indent.blurbs.frag">
+<xsl:param name="man.indent.blurbs" select="1"/></src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If the value of <parameter>man.indent.blurbs</parameter> is
+non-zero, the width of the left margin for
+<tag>authorblurb</tag>, <tag>personblurb</tag>, and
+<tag>contrib</tag> output is set to the value of the
+<parameter>man.indent.width</parameter> parameter
+(<literal>3n</literal> by default). If instead the value of
+<parameter>man.indent.blurbs</parameter> is zero, the built-in roff
+default width (<literal>7.2n</literal>) is used.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.indent.lists.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.indent.lists.xml
new file mode 100644
index 0000000..a2654d0
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.indent.lists.xml
@@ -0,0 +1,35 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="man.indent.lists">
+<refmeta>
+<refentrytitle>man.indent.lists</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>man.indent.lists</refname>
+<refpurpose>Adjust indentation of lists?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="man.indent.lists.frag">
+<xsl:param name="man.indent.lists" select="1"/></src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If the value of <parameter>man.indent.lists</parameter> is
+non-zero, the width of the left margin for list items in
+<tag>itemizedlist</tag>,
+<tag>orderedlist</tag>,
+<tag>variablelist</tag> output (and output of some other
+lists) is set to the value of the
+<parameter>man.indent.width</parameter> parameter
+(<literal>4n</literal> by default). If instead the value of
+<parameter>man.indent.lists</parameter> is zero, the built-in roff
+default width (<literal>7.2n</literal>) is used.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.indent.refsect.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.indent.refsect.xml
new file mode 100644
index 0000000..2865f8c
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.indent.refsect.xml
@@ -0,0 +1,70 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="man.indent.refsect">
+<refmeta>
+<refentrytitle>man.indent.refsect</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>man.indent.refsect</refname>
+<refpurpose>Adjust indentation of refsect* and refsection?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="man.indent.refsect.frag">
+<xsl:param name="man.indent.refsect" select="0"/></src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If the value of <parameter>man.indent.refsect</parameter> is
+non-zero, the width of the left margin for
+<tag>refsect1</tag>, <tag>refsect2</tag> and
+<tag>refsect3</tag> contents and titles (and first-level,
+second-level, and third-level nested
+<tag>refsection</tag>instances) is adjusted by the value of
+the <parameter>man.indent.width</parameter> parameter. With
+<parameter>man.indent.width</parameter> set to its default value of
+<literal>3n</literal>, the main results are that:
+
+<itemizedlist>
+ <listitem>
+ <para>contents of <tag>refsect1</tag> are output with a
+ left margin of three characters instead the roff default of seven
+ or eight characters</para>
+ </listitem>
+ <listitem>
+ <para>contents of <tag>refsect2</tag> are displayed in
+ console output with a left margin of six characters instead the of
+ the roff default of seven characters</para>
+ </listitem>
+ <listitem>
+ <para> the contents of <tag>refsect3</tag> and nested
+ <tag>refsection</tag> instances are adjusted
+ accordingly.</para>
+ </listitem>
+</itemizedlist>
+
+If instead the value of <parameter>man.indent.refsect</parameter> is
+zero, no margin adjustment is done for <literal>refsect*</literal>
+output.</para>
+
+<tip>
+ <para>If your content is primarly comprised of
+ <tag>refsect1</tag> and <tag>refsect2</tag> content
+ (or the <tag>refsection</tag> equivalent) – with few or
+ no <tag>refsect3</tag> or lower nested sections , you may be
+ able to “conserve†space in your output by setting
+ <parameter>man.indent.refsect</parameter> to a non-zero value. Doing
+ so will “squeeze†the left margin in such as way as to provide an
+ additional four characters of “room†per line in
+ <tag>refsect1</tag> output. That extra room may be useful
+ if, for example, you have many verbatim sections with long lines in
+ them.</para>
+</tip>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.indent.verbatims.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.indent.verbatims.xml
new file mode 100644
index 0000000..0436c9e
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.indent.verbatims.xml
@@ -0,0 +1,33 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="man.indent.verbatims">
+<refmeta>
+<refentrytitle>man.indent.verbatims</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>man.indent.verbatims</refname>
+<refpurpose>Adjust indentation of verbatims?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="man.indent.verbatims.frag">
+<xsl:param name="man.indent.verbatims" select="1"/></src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If the value of <parameter>man.indent.verbatims</parameter> is
+non-zero, the width of the left margin for output of verbatim
+environments (<tag>programlisting</tag>,
+<tag>screen</tag>, and so on) is set to the value of the
+<parameter>man.indent.width</parameter> parameter
+(<literal>3n</literal> by default). If instead the value of
+<parameter>man.indent.verbatims</parameter> is zero, the built-in roff
+default width (<literal>7.2n</literal>) is used.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.indent.width.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.indent.width.xml
new file mode 100644
index 0000000..2d4496d
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.indent.width.xml
@@ -0,0 +1,39 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="man.indent.width">
+<refmeta>
+<refentrytitle>man.indent.width</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">length</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>man.indent.width</refname>
+<refpurpose>Specifies width used for adjusted indents</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="man.indent.width.frag">
+<xsl:param name="man.indent.width">4</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+<para>The <parameter>man.indent.width</parameter> parameter specifies
+the width used for adjusted indents. The value of
+<parameter>man.indent.width</parameter> is used for indenting of
+lists, verbatims, headings, and elsewhere, depending on whether the
+values of certain <literal>man.indent.*</literal> boolean parameters
+are non-zero.</para>
+
+<para>The value of <parameter>man.indent.width</parameter> should
+include a valid roff measurement unit (for example,
+<literal>n</literal> or <literal>u</literal>). The default value of
+<literal>4n</literal> specifies a 4-en width; when viewed on a
+console, that amounts to the width of four characters. For details
+about roff measurment units, see the <literal>Measurements</literal>
+node in the groff info page.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.justify.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.justify.xml
new file mode 100644
index 0000000..5495d05
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.justify.xml
@@ -0,0 +1,52 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="man.justify">
+<refmeta>
+<refentrytitle>man.justify</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>man.justify</refname>
+<refpurpose>Justify text to both right and left margins?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="man.justify.frag">
+<xsl:param name="man.justify">0</xsl:param></src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, text is justified to both the right and left
+margins (or, in roff terminology, "adjusted and filled" to both the
+right and left margins). If zero (the default), text is adjusted to
+the left margin only -- producing what is traditionally called
+"ragged-right" text.</para>
+
+<note>
+<para>The default value for this parameter is zero because justified
+text looks good only when it is also hyphenated. Without hyphenation,
+excessive amounts of space often end up getting between words, in
+order to "pad" lines out to align on the right margin.</para>
+
+<para>The problem is that groff is not particularly smart about how it
+does hyphenation; it can end up hyphenating a lot of things that you
+don't want hyphenated. So, disabling both justification and
+hyphenation ensures that hyphens won't get inserted where you don't
+want to them, and you don't end up with lines containing excessive
+amounts of space between words.</para>
+
+<para>However, if do you decide to set a non-zero value for the
+<parameter>man.justify</parameter> parameter (to enable
+justification), then you should probably also set a non-zero value for
+<parameter>man.hyphenate</parameter> (to enable hyphenation).</para>
+
+<para>Yes, these default settings run counter to how most existing man
+pages are formatted. But there are some notable exceptions, such as
+the <literal>perl</literal> man pages.</para>
+</note>
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.output.base.dir.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.output.base.dir.xml
new file mode 100644
index 0000000..25113d0
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.output.base.dir.xml
@@ -0,0 +1,39 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="man.output.base.dir">
+<refmeta>
+<refentrytitle>man.output.base.dir</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">uri</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>man.output.base.dir</refname>
+<refpurpose>Specifies separate output directory</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="man.output.base.dir.frag"><xsl:param name="man.output.base.dir">man/</xsl:param></src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The <parameter>man.output.base.dir</parameter> parameter
+specifies the base directory into which man-page files are output. The
+<parameter>man.output.subdirs.enabled</parameter> parameter controls
+whether the files are output in subdirectories within the base
+directory.</para>
+
+<note>
+ <para>The values of the <parameter>man.output.base.dir</parameter>
+ and <parameter>man.output.subdirs.enabled</parameter> parameters are
+ used only if the value of
+ <parameter>man.output.in.separate.dir</parameter> parameter is
+ non-zero. If the value of the
+ <parameter>man.output.in.separate.dir</parameter> is zero, man-page
+ files are not output in a separate directory.</para>
+</note>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.output.better.ps.enabled.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.output.better.ps.enabled.xml
new file mode 100644
index 0000000..82d15dd
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.output.better.ps.enabled.xml
@@ -0,0 +1,61 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="man.output.better.ps.enabled">
+<refmeta>
+<refentrytitle>man.output.better.ps.enabled</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>man.output.better.ps.enabled</refname>
+<refpurpose>Enable enhanced print/PostScript output?</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+<src:fragment xml:id="man.output.better.ps.enabled.frag">
+<xsl:param name="man.output.better.ps.enabled">0</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+
+<para>If the value of the
+<parameter>man.output.better.ps.enabled</parameter> parameter is
+non-zero, certain markup is embedded in each generated man page
+such that PostScript output from the <command>man -Tps</command>
+command for that page will include a number of enhancements
+designed to improve the quality of that output.</para>
+
+<para>If <parameter>man.output.better.ps.enabled</parameter> is
+zero (the default), no such markup is embedded in generated man
+pages, and no enhancements are included in the PostScript
+output generated from those man pages by the <command>man
+ -Tps</command> command.</para>
+
+<warning>
+ <para>The enhancements provided by this parameter rely on
+ features that are specific to groff (GNU troff) and that are
+ not part of “classic†AT&amp;T troff or any of its
+ derivatives. Therefore, any man pages you generate with this
+ parameter enabled will be readable only on systems on which
+ the groff (GNU troff) program is installed, such as GNU/Linux
+ systems. The pages <emphasis role="bold">will not not be
+ readable on systems on with the classic troff (AT&amp;T
+ troff) command is installed</emphasis>.</para>
+</warning>
+
+<para>The value of this parameter only affects PostScript output
+ generated from the <command>man</command> command. It has no
+ effect on output generated using the FO backend.</para>
+
+<tip>
+ <para>You can generate PostScript output for any man page by
+ running the following command:</para>
+ <programlisting> man <replaceable>FOO</replaceable> -Tps > <replaceable>FOO</replaceable>.ps</programlisting>
+ <para>You can then generate PDF output by running the following
+ command:</para>
+ <programlisting> ps2pdf <replaceable>FOO</replaceable>.ps</programlisting>
+</tip>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.output.encoding.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.output.encoding.xml
new file mode 100644
index 0000000..7154bc8
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.output.encoding.xml
@@ -0,0 +1,53 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="man.output.encoding">
+<refmeta>
+<refentrytitle>man.output.encoding</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>man.output.encoding</refname>
+<refpurpose>Encoding used for man-page output</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="man.output.encoding.frag">
+<xsl:param name="man.output.encoding">UTF-8</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>This parameter specifies the encoding to use for files generated
+by the manpages stylesheet. Not all processors support specification
+of this parameter.</para>
+
+<important>
+ <para>If the value of the <parameter>man.charmap.enabled</parameter>
+ parameter is non-zero (the default), keeping the
+ <parameter>man.output.encoding</parameter> parameter at its default
+ value (<literal>UTF-8</literal>) or setting it to
+ <literal>UTF-16</literal> <emphasis role="bold">does not cause your
+ man pages to be output in raw UTF-8 or UTF-16</emphasis> -- because
+ any Unicode characters for which matches are found in the enabled
+ character map will be replaced with roff escape sequences before the
+ final man-page files are generated.</para>
+
+ <para>So if you want to generate "real" UTF-8 man pages, without any
+ character substitution being performed on your content, you need to
+ set <parameter>man.charmap.enabled</parameter> to zero (which will
+ completely disable character-map processing). </para>
+
+ <para>You may also need to set
+ <parameter>man.charmap.enabled</parameter> to zero if you want to
+ output man pages in an encoding other than <literal>UTF-8</literal>
+ or <literal>UTF-16</literal>. Character-map processing is based on
+ Unicode character values and may not work with other output
+ encodings.</para>
+</important>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.output.in.separate.dir.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.output.in.separate.dir.xml
new file mode 100644
index 0000000..1492720
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.output.in.separate.dir.xml
@@ -0,0 +1,32 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="man.output.in.separate.dir">
+<refmeta>
+<refentrytitle>man.output.in.separate.dir</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>man.output.in.separate.dir</refname>
+<refpurpose>Output man-page files in separate output directory?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="man.output.in.separate.dir.frag">
+<xsl:param name="man.output.in.separate.dir" select="0"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If the value of <literal>man.output.in.separate.dir</literal>
+parameter is non-zero, man-page files are output in a separate
+directory, specified by the <parameter>man.output.base.dir</parameter>
+parameter; otherwise, if the value of
+<literal>man.output.in.separate.dir</literal> is zero, man-page files
+are not output in a separate directory.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.output.lang.in.name.enabled.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.output.lang.in.name.enabled.xml
new file mode 100644
index 0000000..1fed3c0
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.output.lang.in.name.enabled.xml
@@ -0,0 +1,50 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="man.output.lang.in.name.enabled">
+<refmeta>
+<refentrytitle>man.output.lang.in.name.enabled</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>man.output.lang.in.name.enabled</refname>
+<refpurpose>Include $LANG value in man-page filename/pathname?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="man.output.lang.in.name.enabled.frag">
+<xsl:param name="man.output.lang.in.name.enabled" select="0"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+ <para>The <parameter>man.output.lang.in.name.enabled</parameter>
+ parameter specifies whether a <literal>$lang</literal> value is
+ included in man-page filenames and pathnames.</para>
+
+ <para>If the value of
+ <parameter>man.output.lang.in.name.enabled</parameter> is non-zero,
+ man-page files are output with the <literal>$lang</literal> value
+ included in their filenames or pathnames as follows;
+
+ <itemizedlist>
+ <listitem>
+ <para>if <parameter>man.output.subdirs.enabled</parameter> is
+ non-zero, each file is output to, e.g., a
+ <filename>man/<replaceable>$lang</replaceable>/man8/foo.8</filename>
+ pathname</para>
+ </listitem>
+ <listitem>
+ <para>if <parameter>man.output.subdirs.enabled</parameter> is
+ zero, each file is output with a
+ <literal>foo.<replaceable>$lang</replaceable>.8</literal>
+ filename</para>
+ </listitem>
+ </itemizedlist>
+ </para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.output.manifest.enabled.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.output.manifest.enabled.xml
new file mode 100644
index 0000000..5da041c
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.output.manifest.enabled.xml
@@ -0,0 +1,27 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="man.output.manifest.enabled">
+ <refmeta>
+ <refentrytitle>man.output.manifest.enabled</refentrytitle>
+ <refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+ </refmeta>
+ <refnamediv>
+ <refname>man.output.manifest.enabled</refname>
+ <refpurpose>Generate a manifest file?</refpurpose>
+ </refnamediv>
+
+ <refsynopsisdiv>
+ <src:fragment xml:id="man.output.manifest.enabled.frag"><xsl:param name="man.output.manifest.enabled" select="0"/></src:fragment>
+ </refsynopsisdiv>
+
+ <refsection><info><title>Description</title></info>
+
+ <para>If non-zero, a list of filenames for man pages generated by
+ the stylesheet transformation is written to the file named by the
+ <parameter>man.output.manifest.filename</parameter> parameter.</para>
+
+ </refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.output.manifest.filename.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.output.manifest.filename.xml
new file mode 100644
index 0000000..f514ede
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.output.manifest.filename.xml
@@ -0,0 +1,29 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="man.output.manifest.filename">
+ <refmeta>
+ <refentrytitle>man.output.manifest.filename</refentrytitle>
+ <refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+ </refmeta>
+ <refnamediv>
+ <refname>man.output.manifest.filename</refname>
+ <refpurpose>Name of manifest file</refpurpose>
+ </refnamediv>
+
+ <refsynopsisdiv>
+ <src:fragment xml:id="man.output.manifest.filename.frag"><xsl:param name="man.output.manifest.filename">MAN.MANIFEST</xsl:param></src:fragment>
+ </refsynopsisdiv>
+
+ <refsection><info><title>Description</title></info>
+
+ <para>The <parameter>man.output.manifest.filename</parameter> parameter
+ specifies the name of the file to which the manpages manifest file
+ is written (if the value of the
+ <parameter>man.output.manifest.enabled</parameter> parameter is
+ non-zero).</para>
+
+ </refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.output.quietly.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.output.quietly.xml
new file mode 100644
index 0000000..acde7f4
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.output.quietly.xml
@@ -0,0 +1,37 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="man.output.quietly">
+<refmeta>
+<refentrytitle>man.output.quietly</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>man.output.quietly</refname>
+<refpurpose>Suppress filename messages emitted when generating output?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="man.output.quietly.frag">
+<xsl:param name="man.output.quietly" select="0"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If zero (the default), for each man-page file created, a message
+with the name of the file is emitted. If non-zero, the files are
+output "quietly" -- that is, the filename messages are
+suppressed.</para>
+
+<tip>
+ <para>If you are processing a large amount of <tag>refentry</tag>
+ content, you may be able to speed up processing significantly by
+ setting a non-zero value for
+ <parameter>man.output.quietly</parameter>.</para>
+</tip>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.output.subdirs.enabled.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.output.subdirs.enabled.xml
new file mode 100644
index 0000000..876b94e
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.output.subdirs.enabled.xml
@@ -0,0 +1,40 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="man.output.subdirs.enabled">
+<refmeta>
+<refentrytitle>man.output.subdirs.enabled</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>man.output.subdirs.enabled</refname>
+<refpurpose>Output man-page files in subdirectories within base output directory?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="man.output.subdirs.enabled.frag">
+<xsl:param name="man.output.subdirs.enabled" select="1"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The <parameter>man.output.subdirs.enabled</parameter> parameter
+controls whether man-pages files are output in subdirectories within
+the base directory specified by the directory specified by the
+<parameter>man.output.base.dir</parameter> parameter.</para>
+
+<note>
+ <para>The values of the <parameter>man.output.base.dir</parameter>
+ and <parameter>man.output.subdirs.enabled</parameter> parameters are
+ used only if the value of
+ <parameter>man.output.in.separate.dir</parameter> parameter is
+ non-zero. If the value of the
+ <parameter>man.output.in.separate.dir</parameter> is zero, man-page
+ files are not output in a separate directory.</para>
+</note>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.segtitle.suppress.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.segtitle.suppress.xml
new file mode 100644
index 0000000..e54336d
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.segtitle.suppress.xml
@@ -0,0 +1,28 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="man.segtitle.suppress">
+<refmeta>
+<refentrytitle>man.segtitle.suppress</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>man.segtitle.suppress</refname>
+<refpurpose>Suppress display of segtitle contents?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="man.segtitle.suppress.frag">
+<xsl:param name="man.segtitle.suppress" select="0"/></src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If the value of <parameter>man.segtitle.suppress</parameter> is
+non-zero, then display of <tag>segtitle</tag> contents is
+suppressed in output.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.string.subst.map.local.post.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.string.subst.map.local.post.xml
new file mode 100644
index 0000000..b12448d
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.string.subst.map.local.post.xml
@@ -0,0 +1,34 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="man.string.subst.map.local.post">
+<refmeta>
+<refentrytitle>man.string.subst.map.local.post</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>man.string.subst.map.local.post</refname>
+<refpurpose>Specifies “local†string substitutions</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="man.string.subst.map.local.post.frag">
+<xsl:param name="man.string.subst.map.local.post"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Use the <parameter>man.string.subst.map.local.post</parameter>
+parameter to specify any “local†string substitutions to perform over
+the entire roff source for each man page <emphasis>after</emphasis>
+performing the string substitutions specified by the <parameter>man.string.subst.map</parameter> parameter.</para>
+
+<para>For details about the format of this parameter, see the
+documentation for the <parameter>man.string.subst.map</parameter>
+parameter.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.string.subst.map.local.pre.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.string.subst.map.local.pre.xml
new file mode 100644
index 0000000..6483752
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.string.subst.map.local.pre.xml
@@ -0,0 +1,34 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="man.string.subst.map.local.pre">
+<refmeta>
+<refentrytitle>man.string.subst.map.local.pre</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>man.string.subst.map.local.pre</refname>
+<refpurpose>Specifies “local†string substitutions</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="man.string.subst.map.local.pre.frag">
+ <xsl:param name="man.string.subst.map.local.pre"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Use the <parameter>man.string.subst.map.local.pre</parameter>
+parameter to specify any “local†string substitutions to perform over
+the entire roff source for each man page <emphasis>before</emphasis>
+performing the string substitutions specified by the <parameter>man.string.subst.map</parameter> parameter.</para>
+
+<para>For details about the format of this parameter, see the
+documentation for the <parameter>man.string.subst.map</parameter>
+parameter.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.string.subst.map.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.string.subst.map.xml
new file mode 100644
index 0000000..0feed4a
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.string.subst.map.xml
@@ -0,0 +1,162 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:ss="http://docbook.sf.net/xmlns/string.subst/1.0"
+ version="5.0" xml:id="man.string.subst.map">
+<refmeta>
+<refentrytitle>man.string.subst.map</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">rtf</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>man.string.subst.map</refname>
+<refpurpose>Specifies a set of string substitutions</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="man.string.subst.map.frag">
+<xsl:param name="man.string.subst.map">
+
+ <!-- * remove no-break marker at beginning of line (stylesheet artifact) -->
+ <ss:substitution oldstring="&#x2592;&#x2580;" newstring="&#x2592;"/>
+ <!-- * replace U+2580 no-break marker (stylesheet-added) w/ no-break space -->
+ <ss:substitution oldstring="&#x2580;" newstring="\ "/>
+
+ <!-- ==================================================================== -->
+
+ <!-- * squeeze multiple newlines before a roff request -->
+ <ss:substitution oldstring="&#10;&#10;." newstring="&#10;."/>
+ <!-- * remove any .sp instances that directly precede a .PP -->
+ <ss:substitution oldstring=".sp&#10;.PP" newstring=".PP"/>
+ <!-- * remove any .sp instances that directly follow a .PP -->
+ <ss:substitution oldstring=".sp&#10;.sp" newstring=".sp"/>
+ <!-- * squeeze multiple .sp instances into a single .sp-->
+ <ss:substitution oldstring=".PP&#10;.sp" newstring=".PP"/>
+ <!-- * squeeze multiple newlines after start of no-fill (verbatim) env. -->
+ <ss:substitution oldstring=".nf&#10;&#10;" newstring=".nf&#10;"/>
+ <!-- * squeeze multiple newlines after REstoring margin -->
+ <ss:substitution oldstring=".RE&#10;&#10;" newstring=".RE&#10;"/>
+ <!-- * U+2591 is a marker we add before and after every Parameter in -->
+ <!-- * Funcprototype output -->
+ <ss:substitution oldstring="&#x2591;" newstring=" "/>
+ <!-- * U+2592 is a marker we add for the newline before output of <sbr>; -->
+ <ss:substitution oldstring="&#x2592;" newstring="&#10;"/>
+ <!-- * -->
+ <!-- * Now deal with some other characters that are added by the -->
+ <!-- * stylesheets during processing. -->
+ <!-- * -->
+ <!-- * bullet -->
+ <ss:substitution oldstring="•" newstring="\(bu"/>
+ <!-- * left double quote -->
+ <ss:substitution oldstring="“" newstring="\(lq"/>
+ <!-- * right double quote -->
+ <ss:substitution oldstring="â€" newstring="\(rq"/>
+ <!-- * left single quote -->
+ <ss:substitution oldstring="‘" newstring="\(oq"/>
+ <!-- * right single quote -->
+ <ss:substitution oldstring="’" newstring="\(cq"/>
+ <!-- * copyright sign -->
+ <ss:substitution oldstring="©" newstring="\(co"/>
+ <!-- * registered sign -->
+ <ss:substitution oldstring="®" newstring="\(rg"/>
+ <!-- * ...servicemark... -->
+ <!-- * There is no groff equivalent for it. -->
+ <ss:substitution oldstring="&#x2120;" newstring="(SM)"/>
+ <!-- * ...trademark... -->
+ <!-- * We don't do "\(tm" because for console output, -->
+ <!-- * groff just renders that as "tm"; that is: -->
+ <!-- * -->
+ <!-- * Product&#x2122; -> Producttm -->
+ <!-- * -->
+ <!-- * So we just make it to "(TM)" instead; thus: -->
+ <!-- * -->
+ <!-- * Product&#x2122; -> Product(TM) -->
+ <ss:substitution oldstring="â„¢" newstring="(TM)"/>
+
+</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The <parameter>man.string.subst.map</parameter> parameter
+contains <link linkend="map">a map</link> that specifies a set of
+string substitutions to perform over the entire roff source for each
+man page, either just before generating final man-page output (that
+is, before writing man-page files to disk) or, if the value of the
+<parameter>man.charmap.enabled</parameter> parameter is non-zero,
+before applying the roff character map.</para>
+
+<para>You can use <parameter>man.string.subst.map</parameter> as a
+“lightweight†character map to perform “essential†substitutions --
+that is, substitutions that are <emphasis>always</emphasis> performed,
+even if the value of the <parameter>man.charmap.enabled</parameter>
+parameter is zero. For example, you can use it to replace quotation
+marks or other special characters that are generated by the DocBook
+XSL stylesheets for a particular locale setting (as opposed to those
+characters that are actually in source XML documents), or to replace
+any special characters that may be automatically generated by a
+particular customization of the DocBook XSL stylesheets.</para>
+
+<warning>
+ <para>Do you not change value of the
+ <parameter>man.string.subst.map</parameter> parameter unless you are
+ sure what you are doing. First consider adding your
+ string-substitution mappings to either or both of the following
+ parameters:
+ <variablelist>
+ <varlistentry>
+ <term><parameter>man.string.subst.map.local.pre</parameter></term>
+ <listitem><para>applied before
+ <parameter>man.string.subst.map</parameter></para></listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><parameter>man.string.subst.map.local.post</parameter></term>
+ <listitem><para>applied after
+ <parameter>man.string.subst.map</parameter></para></listitem>
+ </varlistentry>
+ </variablelist>
+ By default, both of those parameters contain no
+ string substitutions. They are intended as a means for you to
+ specify your own local string-substitution mappings.</para>
+
+ <para>If you remove any of default mappings from the value of the
+ <parameter>man.string.subst.map</parameter> parameter, you are
+ likely to end up with broken output. And be very careful about adding
+ anything to it; it’s used for doing string substitution over the
+ entire roff source of each man page – it causes target strings to be
+ replaced in roff requests and escapes, not just in the visible
+ contents of the page.</para>
+
+</warning>
+
+<refsection xml:id="map">
+ <info>
+ <title>Contents of the substitution map</title>
+ </info>
+ <para>The string-substitution map contains one or more
+ <tag>ss:substitution</tag> elements, each of which has two
+ attributes:
+ <variablelist>
+ <varlistentry>
+ <term>oldstring</term>
+ <listitem>
+ <simpara>string to replace</simpara>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>newstring</term>
+ <listitem>
+ <simpara>string with which to replace <tag
+ class="attribute">oldstring</tag></simpara>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ It may also include XML comments (that is, delimited with
+ "<literal>&lt;!--</literal>" and "<literal>--&gt;</literal>").
+ </para>
+</refsection>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.subheading.divider.enabled.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.subheading.divider.enabled.xml
new file mode 100644
index 0000000..1156c5f
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.subheading.divider.enabled.xml
@@ -0,0 +1,37 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="man.subheading.divider.enabled">
+<refmeta>
+<refentrytitle>man.subheading.divider.enabled</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>man.subheading.divider.enabled</refname>
+<refpurpose>Add divider comment to roff source before/after subheadings?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="man.subheading.divider.enabled.frag">
+<xsl:param name="man.subheading.divider.enabled">0</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If the value of the
+<parameter>man.subheading.divider.enabled</parameter> parameter is
+non-zero, the contents of the
+<parameter>man.subheading.divider</parameter> parameter are used to
+add a "divider" before and after subheadings in the roff
+output. <emphasis role="bold">The divider is not visisble in the
+rendered man page</emphasis>; it is added as a comment, in the source,
+simply for the purpose of increasing reability of the source.</para>
+
+<para>If <parameter>man.subheading.divider.enabled</parameter> is zero
+(the default), the subheading divider is suppressed.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.subheading.divider.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.subheading.divider.xml
new file mode 100644
index 0000000..dbd2669
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.subheading.divider.xml
@@ -0,0 +1,37 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="man.subheading.divider">
+<refmeta>
+<refentrytitle>man.subheading.divider</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>man.subheading.divider</refname>
+<refpurpose>Specifies string to use as divider comment before/after subheadings</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="man.subheading.divider.frag">
+<xsl:param name="man.subheading.divider">========================================================================</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If the value of the
+<parameter>man.subheading.divider.enabled</parameter> parameter is
+non-zero, the contents of the
+<parameter>man.subheading.divider</parameter> parameter are used to
+add a "divider" before and after subheadings in the roff
+output. <emphasis role="bold">The divider is not visisble in the
+rendered man page</emphasis>; it is added as a comment, in the source,
+simply for the purpose of increasing reability of the source.</para>
+
+<para>If <parameter>man.subheading.divider.enabled</parameter> is zero
+(the default), the subheading divider is suppressed.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.table.footnotes.divider.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.table.footnotes.divider.xml
new file mode 100644
index 0000000..2ad4608
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.table.footnotes.divider.xml
@@ -0,0 +1,29 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="man.table.footnotes.divider">
+<refmeta>
+<refentrytitle>man.table.footnotes.divider</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>man.table.footnotes.divider</refname>
+<refpurpose>Specifies divider string that appears before table footnotes</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="man.table.footnotes.divider.frag">
+<xsl:param name="man.table.footnotes.divider">----</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>In each table that contains footenotes, the string specified by
+the <parameter>man.table.footnotes.divider</parameter> parameter is
+output before the list of footnotes for the table.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.th.extra1.suppress.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.th.extra1.suppress.xml
new file mode 100644
index 0000000..c0241d2
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.th.extra1.suppress.xml
@@ -0,0 +1,32 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="man.th.extra1.suppress">
+<refmeta>
+<refentrytitle>man.th.extra1.suppress</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>man.th.extra1.suppress</refname>
+<refpurpose>Suppress extra1 part of header/footer?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="man.th.extra1.suppress.frag">
+<xsl:param name="man.th.extra1.suppress">0</xsl:param></src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If the value of <parameter>man.th.extra1.suppress</parameter> is
+non-zero, then the <literal>extra1</literal> part of the
+<literal>.TH</literal> title line header/footer is suppressed.</para>
+
+<para>The content of the <literal>extra1</literal> field is almost
+always displayed in the center footer of the page and is, universally,
+a date.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.th.extra2.max.length.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.th.extra2.max.length.xml
new file mode 100644
index 0000000..d3513ec
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.th.extra2.max.length.xml
@@ -0,0 +1,43 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="man.th.extra2.max.length">
+<refmeta>
+<refentrytitle>man.th.extra2.max.length</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">integer</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>man.th.extra2.max.length</refname>
+<refpurpose>Maximum length of extra2 in header/footer</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="man.th.extra2.max.length.frag">
+<xsl:param name="man.th.extra2.max.length">30</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies the maximum permitted length of the
+<literal>extra2</literal> part of the man-page part of the
+<literal>.TH</literal> title line header/footer. If the
+<literal>extra2</literal> content exceeds the maxiumum specified, it
+is truncated down to the maximum permitted length.</para>
+
+<para>The content of the <literal>extra2</literal> field is usually
+displayed in the left footer of the page and is typically "source"
+data indicating the software system or product that the item
+documented in the man page belongs to, often in the form
+<replaceable>Name</replaceable> <replaceable>Version</replaceable>;
+for example, "GTK+ 1.2" (from the <literal>gtk-options(7)</literal>
+man page).</para>
+
+<para>The default value for this parameter is reasonable but somewhat
+arbitrary. If you are processing pages with long "source" information,
+you may want to experiment with changing the value in order to achieve
+the correct aesthetic results.</para>
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.th.extra2.suppress.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.th.extra2.suppress.xml
new file mode 100644
index 0000000..0fcd3ed
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.th.extra2.suppress.xml
@@ -0,0 +1,44 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="man.th.extra2.suppress">
+<refmeta>
+<refentrytitle>man.th.extra2.suppress</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>man.th.extra2.suppress</refname>
+<refpurpose>Suppress extra2 part of header/footer?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="man.th.extra2.suppress.frag">
+<xsl:param name="man.th.extra2.suppress">0</xsl:param></src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If the value of <parameter>man.th.extra2.suppress</parameter> is
+non-zero, then the <literal>extra2</literal> part of the
+<literal>.TH</literal> title line header/footer is suppressed.</para>
+
+<para>The content of the <literal>extra2</literal> field is usually
+displayed in the left footer of the page and is typically "source"
+data, often in the form
+<replaceable>Name</replaceable> <replaceable>Version</replaceable>;
+for example, "GTK+ 1.2" (from the <literal>gtk-options(7)</literal>
+man page).</para>
+
+<note>
+ <para>You can use the
+ <parameter>refentry.source.name.suppress</parameter> and
+ <parameter>refentry.version.suppress</parameter> parameters to
+ independently suppress the <replaceable>Name</replaceable> and
+ <replaceable>Version</replaceable> parts of the
+ <literal>extra2</literal> field.</para>
+</note>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.th.extra3.max.length.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.th.extra3.max.length.xml
new file mode 100644
index 0000000..77e55e4
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.th.extra3.max.length.xml
@@ -0,0 +1,42 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="man.th.extra3.max.length">
+<refmeta>
+<refentrytitle>man.th.extra3.max.length</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">integer</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>man.th.extra3.max.length</refname>
+<refpurpose>Maximum length of extra3 in header/footer</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="man.th.extra3.max.length.frag">
+<xsl:param name="man.th.extra3.max.length">30</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies the maximum permitted length of the
+<literal>extra3</literal> part of the man-page <literal>.TH</literal>
+title line header/footer. If the <literal>extra3</literal> content
+exceeds the maxiumum specified, it is truncated down to the maximum
+permitted length.</para>
+
+<para>The content of the <literal>extra3</literal> field is usually
+displayed in the middle header of the page and is typically a "manual
+name"; for example, "GTK+ User's Manual" (from the
+<literal>gtk-options(7)</literal> man page).</para>
+
+<para>The default value for this parameter is reasonable but somewhat
+arbitrary. If you are processing pages with long "manual names" -- or
+especially if you are processing pages that have both long "title"
+parts (command/function, etc. names) <emphasis>and</emphasis> long
+manual names -- you may want to experiment with changing the value in
+order to achieve the correct aesthetic results.</para>
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.th.extra3.suppress.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.th.extra3.suppress.xml
new file mode 100644
index 0000000..81d6c0d
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.th.extra3.suppress.xml
@@ -0,0 +1,34 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="man.th.extra3.suppress">
+<refmeta>
+<refentrytitle>man.th.extra3.suppress</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>man.th.extra3.suppress</refname>
+<refpurpose>Suppress extra3 part of header/footer?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="man.th.extra3.suppress.frag">
+<xsl:param name="man.th.extra3.suppress">0</xsl:param></src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If the value of <parameter>man.th.extra3.suppress</parameter> is
+non-zero, then the <literal>extra3</literal> part of the
+<literal>.TH</literal> title line header/footer is
+suppressed.</para>
+
+<para>The content of the <literal>extra3</literal> field is usually
+displayed in the middle header of the page and is typically a "manual
+name"; for example, "GTK+ User's Manual" (from the
+<literal>gtk-options(7)</literal> man page).</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.th.title.max.length.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.th.title.max.length.xml
new file mode 100644
index 0000000..7fdf0bf
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/man.th.title.max.length.xml
@@ -0,0 +1,63 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="man.th.title.max.length">
+<refmeta>
+<refentrytitle>man.th.title.max.length</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">integer</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>man.th.title.max.length</refname>
+<refpurpose>Maximum length of title in header/footer</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="man.th.title.max.length.frag">
+<xsl:param name="man.th.title.max.length">20</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies the maximum permitted length of the title part of the
+man-page <literal>.TH</literal> title line header/footer. If the title
+exceeds the maxiumum specified, it is truncated down to the maximum
+permitted length.</para>
+
+<refsection><info><title>Details</title></info>
+
+
+<para>Every man page generated using the DocBook stylesheets has a
+title line, specified using the <literal>TH</literal> roff
+macro. Within that title line, there is always, at a minimum, a title,
+followed by a section value (representing a man "section" -- usually
+just a number).</para>
+
+<para>The title and section are displayed, together, in the visible
+header of each page. Where in the header they are displayed depends on
+OS the man page is viewed on, and on what version of nroff/groff/man
+is used for viewing the page. But, at a minimum and across all
+systems, the title and section are displayed on the right-hand column
+of the header. On many systems -- those with a modern groff, including
+Linux systems -- they are displayed twice: both in the left and right
+columns of the header.</para>
+
+<para>So if the length of the title exceeds a certain percentage of
+the column width in which the page is viewed, the left and right
+titles can end up overlapping, making them unreadable, or breaking to
+another line, which doesn't look particularly good.</para>
+
+<para>So the stylesheets provide the
+<parameter>man.th.title.max.length</parameter> parameter as a means
+for truncating titles that exceed the maximum length that can be
+viewing properly in a page header.</para>
+
+<para>The default value is reasonable but somewhat arbitrary. If you
+have pages with long titles, you may want to experiment with changing
+the value in order to achieve the correct aesthetic results.</para>
+</refsection>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/manifest.in.base.dir.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/manifest.in.base.dir.xml
new file mode 100644
index 0000000..d002767
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/manifest.in.base.dir.xml
@@ -0,0 +1,29 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="manifest.in.base.dir">
+<refmeta>
+<refentrytitle>manifest.in.base.dir</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>manifest.in.base.dir</refname>
+<refpurpose>Should the manifest file be written into <parameter>base.dir</parameter>?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="manifest.in.base.dir.frag">
+<xsl:param name="manifest.in.base.dir" select="0"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, the manifest file as well as project files for HTML Help and
+Eclipse Help are written into <parameter>base.dir</parameter> instead
+of the current directory.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/manifest.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/manifest.xml
new file mode 100644
index 0000000..96d092a
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/manifest.xml
@@ -0,0 +1,29 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="manifest">
+ <refmeta>
+ <refentrytitle>manifest</refentrytitle>
+ <refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+ </refmeta>
+ <refnamediv>
+ <refname>manifest</refname>
+ <refpurpose>Name of manifest file</refpurpose>
+ </refnamediv>
+
+ <refsynopsisdiv>
+ <src:fragment xml:id="manifest.frag">
+ <xsl:param name="manifest" >HTML.manifest</xsl:param>
+ </src:fragment>
+ </refsynopsisdiv>
+
+ <refsection><info><title>Description</title></info>
+
+ <para>The name of the file to which a manifest is written (if the
+ value of the <parameter>generate.manifest</parameter> parameter
+ is non-zero).</para>
+
+ </refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/manual.toc.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/manual.toc.xml
new file mode 100644
index 0000000..7a640c7
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/manual.toc.xml
@@ -0,0 +1,29 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="manual.toc">
+<refmeta>
+<refentrytitle>manual.toc</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>manual.toc</refname>
+<refpurpose>An explicit TOC to be used for the TOC</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="manual.toc.frag">
+<xsl:param name="manual.toc"></xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The <parameter>manual.toc</parameter> identifies an explicit TOC that
+will be used for building the printed TOC.
+</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/margin.note.float.type.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/margin.note.float.type.xml
new file mode 100644
index 0000000..0b34230
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/margin.note.float.type.xml
@@ -0,0 +1,77 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="margin.note.float.type">
+<refmeta>
+<refentrytitle>margin.note.float.type</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">list</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">none</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">before</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">left</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">start</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">right</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">end</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">inside</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">outside</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>margin.note.float.type</refname>
+<refpurpose>Select type of float for margin note customizations</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="margin.note.float.type.frag">
+<xsl:param name="margin.note.float.type">none</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Selects the type of float for margin notes.
+DocBook does not define a margin note element, so this
+feature must be implemented as a customization of the stylesheet.
+See <parameter>margin.note.properties</parameter> for
+an example.
+</para>
+<itemizedlist>
+<listitem>
+<para>If <parameter>margin.note.float.type</parameter> is
+<quote><literal>none</literal></quote>, then
+no float is used.
+</para>
+</listitem>
+<listitem>
+<para>If <parameter>margin.note.float.type</parameter> is
+<quote><literal>before</literal></quote>, then
+the float appears at the top of the page. On some processors,
+that may be the next page rather than the current page.
+</para>
+</listitem>
+<listitem>
+<para>If <parameter>margin.note.float.type</parameter> is
+<quote><literal>left</literal></quote> or
+<quote><literal>start</literal></quote>, then
+a left side float is used.
+</para>
+</listitem>
+<listitem>
+<para>If <parameter>margin.note.float.type</parameter> is
+<quote><literal>right</literal></quote> or
+<quote><literal>end</literal></quote>, then
+a right side float is used.
+</para>
+</listitem>
+<listitem>
+<para>If your XSL-FO processor supports floats positioned on the
+<quote><literal>inside</literal></quote> or
+<quote><literal>outside</literal></quote>
+of double-sided pages, then you have those two
+options for side floats as well.
+</para>
+</listitem>
+</itemizedlist>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/margin.note.properties.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/margin.note.properties.xml
new file mode 100644
index 0000000..02dc20e
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/margin.note.properties.xml
@@ -0,0 +1,54 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="margin.note.properties">
+<refmeta>
+<refentrytitle>margin.note.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>margin.note.properties</refname>
+<refpurpose>Attribute set for margin.note properties</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="margin.note.properties.frag">
+<xsl:attribute-set name="margin.note.properties">
+ <xsl:attribute name="font-size">90%</xsl:attribute>
+ <xsl:attribute name="text-align">start</xsl:attribute>
+</xsl:attribute-set>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The styling for margin notes.
+By default, margin notes are not implemented for any
+element. A stylesheet customization is needed to make
+use of this attribute-set.</para>
+
+<para>You can use a template named <quote>floater</quote>
+to create the customization.
+That template can create side floats by specifying the
+content and characteristics as template parameters.
+</para>
+
+<para>For example:</para>
+<programlisting>&lt;xsl:template match="para[@role='marginnote']"&gt;
+ &lt;xsl:call-template name="floater"&gt;
+ &lt;xsl:with-param name="position"&gt;
+ &lt;xsl:value-of select="$margin.note.float.type"/&gt;
+ &lt;/xsl:with-param&gt;
+ &lt;xsl:with-param name="width"&gt;
+ &lt;xsl:value-of select="$margin.note.width"/&gt;
+ &lt;/xsl:with-param&gt;
+ &lt;xsl:with-param name="content"&gt;
+ &lt;xsl:apply-imports/&gt;
+ &lt;/xsl:with-param&gt;
+ &lt;/xsl:call-template&gt;
+&lt;/xsl:template&gt;</programlisting>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/margin.note.title.properties.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/margin.note.title.properties.xml
new file mode 100644
index 0000000..84399bb
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/margin.note.title.properties.xml
@@ -0,0 +1,32 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="margin.note.title.properties">
+<refmeta>
+<refentrytitle>margin.note.title.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>margin.note.title.properties</refname>
+<refpurpose>Attribute set for margin note titles</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="margin.note.title.properties.frag">
+<xsl:attribute-set name="margin.note.title.properties">
+ <xsl:attribute name="font-weight">bold</xsl:attribute>
+ <xsl:attribute name="hyphenate">false</xsl:attribute>
+ <xsl:attribute name="text-align">start</xsl:attribute>
+ <xsl:attribute name="keep-with-next.within-column">always</xsl:attribute>
+</xsl:attribute-set>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The styling for margin note titles.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/margin.note.width.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/margin.note.width.xml
new file mode 100644
index 0000000..3ee0aa4
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/margin.note.width.xml
@@ -0,0 +1,35 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="margin.note.width">
+<refmeta>
+<refentrytitle>margin.note.width</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">length</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>margin.note.width</refname>
+<refpurpose>Set the default width for margin notes</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="margin.note.width.frag">
+<xsl:param name="margin.note.width" >1in</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Sets the default width for margin notes when used as a side
+float. The width determines the degree to which the margin note block
+intrudes into the text area.
+</para>
+<para>If <parameter>margin.note.float.type</parameter> is
+<quote><literal>before</literal></quote> or
+<quote><literal>none</literal></quote>, then
+this parameter is ignored.
+</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/marker.section.level.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/marker.section.level.xml
new file mode 100644
index 0000000..70bd4fd
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/marker.section.level.xml
@@ -0,0 +1,50 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="marker.section.level">
+<refmeta>
+<refentrytitle>marker.section.level</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">integer</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>marker.section.level</refname>
+<refpurpose>Control depth of sections shown in running headers or footers</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="marker.section.level.frag">
+<xsl:param name="marker.section.level" >2</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The <parameter>marker.section.level</parameter> parameter
+controls the depth of section levels that may be displayed
+in running headers and footers. For example, if the value
+is 2 (the default), then titles from <tag>sect1</tag> and
+<tag>sect2</tag> or equivalent <tag>section</tag>
+elements are candidates for use in running headers and
+footers.
+</para>
+<para>Each candidate title is marked in the FO output with a
+<tag>&lt;fo:marker marker-class-name="section.head.marker"&gt;</tag>
+element.
+</para>
+<para>In order for such titles to appear in headers
+or footers, the <literal>header.content</literal>
+or <literal>footer.content</literal> template
+must be customized to retrieve the marker using
+an output element such as:
+</para>
+<programlisting>
+&lt;fo:retrieve-marker retrieve-class-name="section.head.marker"
+ retrieve-position="first-including-carryover"
+ retrieve-boundary="page-sequence"/&gt;
+</programlisting>
+
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/menuchoice.menu.separator.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/menuchoice.menu.separator.xml
new file mode 100644
index 0000000..cf142e2
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/menuchoice.menu.separator.xml
@@ -0,0 +1,42 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="menuchoice.menu.separator">
+<refmeta>
+<refentrytitle>menuchoice.menu.separator</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>menuchoice.menu.separator</refname>
+<refpurpose>Separator between items of a <tag>menuchoice</tag>
+with <tag>guimenuitem</tag> or
+<tag>guisubmenu</tag></refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="menuchoice.menu.separator.frag">
+<xsl:param name="menuchoice.menu.separator"> → </xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Separator used to connect items of a <tag>menuchoice</tag> with
+<tag>guimenuitem</tag> or <tag>guisubmenu</tag>. Other elements
+are linked with <parameter>menuchoice.separator</parameter>.
+</para>
+<para>The default value is &amp;#x2192;, which is the
+&amp;rarr; (right arrow) character entity.
+The current FOP (0.20.5) requires setting the font-family
+explicitly.
+</para>
+<para>The default value also includes spaces around the arrow,
+which will allow a line to break. Replace the spaces with
+&amp;#xA0; (nonbreaking space) if you don't want those
+spaces to break.
+</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/menuchoice.separator.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/menuchoice.separator.xml
new file mode 100644
index 0000000..3034f25
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/menuchoice.separator.xml
@@ -0,0 +1,32 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="menuchoice.separator">
+<refmeta>
+<refentrytitle>menuchoice.separator</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>menuchoice.separator</refname>
+<refpurpose>Separator between items of a <tag>menuchoice</tag>
+other than <tag>guimenuitem</tag> and
+<tag>guisubmenu</tag></refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="menuchoice.separator.frag">
+<xsl:param name="menuchoice.separator">+</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Separator used to connect items of a <tag>menuchoice</tag> other
+than <tag>guimenuitem</tag> and <tag>guisubmenu</tag>. The latter
+elements are linked with <parameter>menuchoice.menu.separator</parameter>.
+</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/minus.image.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/minus.image.xml
new file mode 100644
index 0000000..ea86e23
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/minus.image.xml
@@ -0,0 +1,29 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="minus.image">
+<refmeta>
+<refentrytitle>minus.image</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">filename</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>minus.image</refname>
+<refpurpose>Minus image</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="minus.image.frag">
+<xsl:param name="minus.image">toc/open.png</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies the filename of the <quote>minus</quote> image; the image used in a
+<link linkend="dynamic.toc">dynamic ToC</link> to indicate that a section
+can be collapsed.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/monospace.font.family.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/monospace.font.family.xml
new file mode 100644
index 0000000..e91548b
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/monospace.font.family.xml
@@ -0,0 +1,29 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="monospace.font.family">
+<refmeta>
+<refentrytitle>monospace.font.family</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>monospace.font.family</refname>
+<refpurpose>The default font family for monospace environments</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="monospace.font.family.frag">
+<xsl:param name="monospace.font.family">monospace</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The monospace font family is used for verbatim environments
+(program listings, screens, etc.).
+</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/monospace.properties.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/monospace.properties.xml
new file mode 100644
index 0000000..0a8425b
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/monospace.properties.xml
@@ -0,0 +1,38 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="monospace.properties">
+<refmeta>
+<refentrytitle>monospace.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>monospace.properties</refname>
+<refpurpose>Properties of monospaced content</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="monospace.properties.frag">
+<xsl:attribute-set name="monospace.properties">
+ <xsl:attribute name="font-family">
+ <xsl:value-of select="$monospace.font.family"/>
+ </xsl:attribute>
+</xsl:attribute-set>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies the font name for monospaced output. This property set
+used to set the font-size as well, but that doesn't work very well
+when different fonts are used (as they are in titles and paragraphs,
+for example).</para>
+
+<para>If you want to set the font-size in a customization layer, it's
+probably going to be more appropriate to set font-size-adjust, if your
+formatter supports it.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/monospace.verbatim.font.width.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/monospace.verbatim.font.width.xml
new file mode 100644
index 0000000..88b88dc
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/monospace.verbatim.font.width.xml
@@ -0,0 +1,40 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="monospace.verbatim.font.width">
+<refmeta>
+<refentrytitle>monospace.verbatim.font.width</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">length</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>monospace.verbatim.font.width</refname>
+<refpurpose>Width of a single monospace font character</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="monospace.verbatim.font.width.frag">
+<xsl:param name="monospace.verbatim.font.width">0.60em</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies with em units the width of a single character
+of the monospace font. The default value is <literal>0.6em</literal>.</para>
+
+<para>This parameter is only used when a <tag>screen</tag>
+or <tag>programlisting</tag> element has a
+<tag class="attribute">width</tag> attribute, which is
+expressed as a plain integer to indicate the maximum character count
+of each line.
+To convert this character count to an actual maximum width
+measurement, the width of the font characters must be provided.
+Different monospace fonts have different character width,
+so this parameter should be adjusted to fit the
+monospace font being used.
+</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/monospace.verbatim.properties.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/monospace.verbatim.properties.xml
new file mode 100644
index 0000000..3d7ca3d
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/monospace.verbatim.properties.xml
@@ -0,0 +1,27 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="monospace.verbatim.properties">
+<refmeta>
+<refentrytitle>monospace.verbatim.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>monospace.verbatim.properties</refname>
+<refpurpose>What font and size do you want for monospaced content?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="monospace.verbatim.properties.frag">
+<xsl:attribute-set name="monospace.verbatim.properties" use-attribute-sets="verbatim.properties monospace.properties">
+ <xsl:attribute name="text-align">start</xsl:attribute>
+ <xsl:attribute name="wrap-option">no-wrap</xsl:attribute>
+</xsl:attribute-set>
+</src:fragment>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+<para>Specify the font name and size you want for monospaced output</para>
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/multiframe.bottom.bgcolor.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/multiframe.bottom.bgcolor.xml
new file mode 100644
index 0000000..f0667d7
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/multiframe.bottom.bgcolor.xml
@@ -0,0 +1,28 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="multiframe.bottom.bgcolor">
+<refmeta>
+<refentrytitle>multiframe.bottom.bgcolor</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">color</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>multiframe.bottom.bgcolor</refname>
+<refpurpose>Background color for bottom navigation frame</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="multiframe.bottom.bgcolor.frag">
+<xsl:param name="multiframe.bottom.bgcolor">white</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies the background color of the bottom navigation frame when
+<link linkend="multiframe">multiframe</link> is enabled.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/multiframe.navigation.height.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/multiframe.navigation.height.xml
new file mode 100644
index 0000000..06dbc1c
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/multiframe.navigation.height.xml
@@ -0,0 +1,28 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="multiframe.navigation.height">
+<refmeta>
+<refentrytitle>multiframe.navigation.height</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">length</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>multiframe.navigation.height</refname>
+<refpurpose>Height of navigation frames</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="multiframe.navigation.height.frag">
+<xsl:param name="multiframe.navigation.height">40</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies the height of the navigation frames in pixels when
+<link linkend="multiframe">multiframe</link> is enabled.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/multiframe.top.bgcolor.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/multiframe.top.bgcolor.xml
new file mode 100644
index 0000000..4814fc8
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/multiframe.top.bgcolor.xml
@@ -0,0 +1,28 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="multiframe.top.bgcolor">
+<refmeta>
+<refentrytitle>multiframe.top.bgcolor</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">color</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>multiframe.top.bgcolor</refname>
+<refpurpose>Background color for top navigation frame</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="multiframe.top.bgcolor.frag">
+<xsl:param name="multiframe.top.bgcolor" >white</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies the background color of the top navigation frame when
+<link linkend="multiframe">multiframe</link> is enabled.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/multiframe.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/multiframe.xml
new file mode 100644
index 0000000..b4fbf37
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/multiframe.xml
@@ -0,0 +1,31 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="multiframe">
+<refmeta>
+<refentrytitle>multiframe</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>multiframe</refname>
+<refpurpose>Use multiple frames for slide bodies?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="multiframe.frag">
+<xsl:param name="multiframe" select="0"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, multiple frames are used for the body of each
+slide. This is one way of forcing the slide navigation elements to
+appear in constant locations. The other way is with <link linkend="overlay">overlays</link>. The <link linkend="overlay"><parameter>overlay</parameter></link> and
+<parameter>multiframe</parameter> parameters are mutually
+exclusive.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/nav.separator.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/nav.separator.xml
new file mode 100644
index 0000000..e3695f9
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/nav.separator.xml
@@ -0,0 +1,28 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="nav.separator">
+<refmeta>
+<refentrytitle>nav.separator</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>nav.separator</refname>
+<refpurpose>Output separator between navigation and body?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="nav.separator.frag">
+<xsl:param name="nav.separator" select="1"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, a separator (<literal>&lt;HR&gt;</literal>) is
+added between the navigation links and the content of each slide.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/nav.table.summary.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/nav.table.summary.xml
new file mode 100644
index 0000000..1c1559b
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/nav.table.summary.xml
@@ -0,0 +1,27 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="nav.table.summary">
+<refmeta>
+<refentrytitle>nav.table.summary</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>nav.table.summary</refname>
+<refpurpose>HTML Table summary attribute value for navigation tables</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="nav.table.summary.frag">
+<xsl:param name="nav.table.summary">Navigation</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+<para>The value of this parameter is used as the value of the table
+summary attribute for the navigation table.</para>
+<para>Only applies with the tabular presentation is being used.</para>
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/navbgcolor.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/navbgcolor.xml
new file mode 100644
index 0000000..c6fcece
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/navbgcolor.xml
@@ -0,0 +1,26 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="navbgcolor">
+<refmeta>
+<refentrytitle>navbgcolor</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">color</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>navbgcolor</refname>
+<refpurpose>The background color of the navigation TOC</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="navbgcolor.frag">
+<xsl:param name="navbgcolor">#4080FF</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+<para>The background color of the navigation TOC.</para>
+<para>Only applies with the tabular presentation is being used.</para>
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/navbodywidth.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/navbodywidth.xml
new file mode 100644
index 0000000..b93cf82
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/navbodywidth.xml
@@ -0,0 +1,26 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="navbodywidth">
+<refmeta>
+<refentrytitle>navbodywidth</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">length</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>navbodywidth</refname>
+<refpurpose>Specifies the width of the navigation table body</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="navbodywidth.frag">
+<xsl:param name="navbodywidth"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+<para>The width of the body column.</para>
+<para>Only applies with the tabular presentation is being used.</para>
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/navig.graphics.extension.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/navig.graphics.extension.xml
new file mode 100644
index 0000000..416e0c4
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/navig.graphics.extension.xml
@@ -0,0 +1,28 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="navig.graphics.extension">
+<refmeta>
+<refentrytitle>navig.graphics.extension</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>navig.graphics.extension</refname>
+<refpurpose>Extension for navigational graphics</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="navig.graphics.extension.frag">
+<xsl:param name="navig.graphics.extension">.gif</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Sets the filename extension to use on navigational graphics used
+in the headers and footers of chunked HTML.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/navig.graphics.path.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/navig.graphics.path.xml
new file mode 100644
index 0000000..373208e
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/navig.graphics.path.xml
@@ -0,0 +1,30 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="navig.graphics.path">
+<refmeta>
+<refentrytitle>navig.graphics.path</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>navig.graphics.path</refname>
+<refpurpose>Path to navigational graphics</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="navig.graphics.path.frag">
+<xsl:param name="navig.graphics.path">images/</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Sets the path, probably relative to the directory where the HTML
+files are created, to the navigational graphics used in the
+headers and footers of chunked HTML.
+</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/navig.graphics.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/navig.graphics.xml
new file mode 100644
index 0000000..03e28b6
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/navig.graphics.xml
@@ -0,0 +1,31 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="navig.graphics">
+<refmeta>
+<refentrytitle>navig.graphics</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>navig.graphics</refname>
+<refpurpose>Use graphics in navigational headers and footers?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="navig.graphics.frag">
+<xsl:param name="navig.graphics" select="0"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, the navigational headers and footers in chunked
+HTML are presented in an alternate style that uses graphical icons for
+Next, Previous, Up, and Home. Default graphics are provided in the
+distribution. If zero, text is used instead of graphics.
+</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/navig.showtitles.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/navig.showtitles.xml
new file mode 100644
index 0000000..a4eb3ff
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/navig.showtitles.xml
@@ -0,0 +1,32 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="navig.showtitles">
+<refmeta>
+<refentrytitle>navig.showtitles</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>navig.showtitles</refname>
+<refpurpose>Display titles in HTML headers and footers?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="navig.showtitles.frag"><xsl:param name="navig.showtitles">1</xsl:param></src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero,
+the headers and footers of chunked HTML
+display the titles of the next and previous chunks,
+along with the words 'Next' and 'Previous' (or the
+equivalent graphical icons if navig.graphics is true).
+If false (zero), then only the words 'Next' and 'Previous'
+(or the icons) are displayed.
+</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/navtocwidth.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/navtocwidth.xml
new file mode 100644
index 0000000..0d21ae0
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/navtocwidth.xml
@@ -0,0 +1,26 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="navtocwidth">
+<refmeta>
+<refentrytitle>navtocwidth</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">length</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>navtocwidth</refname>
+<refpurpose>Specifies the width of the navigation table TOC</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="navtocwidth.frag">
+<xsl:param name="navtocwidth">220</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+<para>The width, in pixels, of the navigation column.</para>
+<para>Only applies with the tabular presentation is being used.</para>
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/next.image.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/next.image.xml
new file mode 100644
index 0000000..4dbd60a
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/next.image.xml
@@ -0,0 +1,27 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="next.image">
+<refmeta>
+<refentrytitle>next.image</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">filename</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>next.image</refname>
+<refpurpose>Right-arrow image</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="next.image.frag">
+<xsl:param name="next.image" >active/nav-next.png</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies the filename of the right-pointing navigation arrow.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/no.home.image.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/no.home.image.xml
new file mode 100644
index 0000000..2f4ecd8
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/no.home.image.xml
@@ -0,0 +1,27 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="no.home.image">
+<refmeta>
+<refentrytitle>no.home.image</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">filename</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>no.home.image</refname>
+<refpurpose>Inactive home image</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="no.home.image.frag">
+<xsl:param name="no.home.image">inactive/nav-home.png</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies the filename of the inactive home navigation icon.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/no.next.image.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/no.next.image.xml
new file mode 100644
index 0000000..966fe26
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/no.next.image.xml
@@ -0,0 +1,27 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="no.next.image">
+<refmeta>
+<refentrytitle>no.next.image</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">filename</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>no.next.image</refname>
+<refpurpose>Inactive right-arrow image</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="no.next.image.frag">
+<xsl:param name="no.next.image">inactive/nav-next.png</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies the filename of the inactive right-pointing navigation arrow.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/no.prev.image.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/no.prev.image.xml
new file mode 100644
index 0000000..7632231
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/no.prev.image.xml
@@ -0,0 +1,27 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="no.prev.image">
+<refmeta>
+<refentrytitle>no.prev.image</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">filename</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>no.prev.image</refname>
+<refpurpose>Inactive left-arrow image</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="no.prev.image.frag">
+<xsl:param name="no.prev.image" >inactive/nav-prev.png</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies the filename of the inactive left-pointing navigation arrow.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/no.toc.image.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/no.toc.image.xml
new file mode 100644
index 0000000..43e9eea
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/no.toc.image.xml
@@ -0,0 +1,27 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="no.toc.image">
+<refmeta>
+<refentrytitle>no.toc.image</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">filename</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>no.toc.image</refname>
+<refpurpose>Inactive ToC image</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="no.toc.image.frag">
+<xsl:param name="no.toc.image">inactive/nav-toc.png</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies the filename of the inactive ToC navigation icon.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/no.up.image.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/no.up.image.xml
new file mode 100644
index 0000000..a19a34d
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/no.up.image.xml
@@ -0,0 +1,27 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="no.up.image">
+<refmeta>
+<refentrytitle>no.up.image</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">filename</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>no.up.image</refname>
+<refpurpose>Inactive up-arrow image</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="no.up.image.frag">
+<xsl:param name="no.up.image" >inactive/nav-up.png</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies the filename of the inactive upward-pointing navigation arrow.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/nominal.image.depth.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/nominal.image.depth.xml
new file mode 100644
index 0000000..a4e615f
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/nominal.image.depth.xml
@@ -0,0 +1,27 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="nominal.image.depth">
+<refmeta>
+<refentrytitle>nominal.image.depth</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">length</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>nominal.image.depth</refname>
+<refpurpose>Nominal image depth</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="nominal.image.depth.frag">
+<xsl:param name="nominal.image.depth" select="4 * $pixels.per.inch"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>See <parameter>nominal.image.width</parameter>.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/nominal.image.width.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/nominal.image.width.xml
new file mode 100644
index 0000000..bfa989a
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/nominal.image.width.xml
@@ -0,0 +1,43 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="nominal.image.width">
+<refmeta>
+<refentrytitle>nominal.image.width</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">length</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>nominal.image.width</refname>
+<refpurpose>The nominal image width</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="nominal.image.width.frag">
+<xsl:param name="nominal.image.width" select="6 * $pixels.per.inch"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Graphic widths expressed as a percentage are problematic. In the
+following discussion, we speak of width and contentwidth, but
+the same issues apply to depth and contentdepth.</para>
+
+<para>A width of 50% means "half of the available space for the image."
+That's fine. But note that in HTML, this is a dynamic property and
+the image size will vary if the browser window is resized.</para>
+
+<para>A contentwidth of 50% means "half of the actual image width".
+But what does that mean if the stylesheets cannot assess the image's
+actual size? Treating this as a width of 50% is one possibility, but
+it produces behavior (dynamic scaling) that seems entirely out of
+character with the meaning.</para>
+
+<para>Instead, the stylesheets define a
+<parameter>nominal.image.width</parameter> and convert percentages to
+actual values based on that nominal size.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/nominal.table.width.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/nominal.table.width.xml
new file mode 100644
index 0000000..f5dcfb9
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/nominal.table.width.xml
@@ -0,0 +1,30 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="nominal.table.width">
+<refmeta>
+<refentrytitle>nominal.table.width</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">length</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>nominal.table.width</refname>
+<refpurpose>The (absolute) nominal width of tables</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="nominal.table.width.frag">
+<xsl:param name="nominal.table.width">6in</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>In order to convert CALS column widths into HTML column widths, it
+is sometimes necessary to have an absolute table width to use for conversion
+of mixed absolute and relative widths. This value must be an absolute
+length (not a percentage).</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/nongraphical.admonition.properties.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/nongraphical.admonition.properties.xml
new file mode 100644
index 0000000..ba8a06a
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/nongraphical.admonition.properties.xml
@@ -0,0 +1,41 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="nongraphical.admonition.properties">
+<refmeta>
+<refentrytitle>nongraphical.admonition.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>nongraphical.admonition.properties</refname>
+<refpurpose>To add properties to the outer block of a nongraphical admonition.</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="nongraphical.admonition.properties.frag"><xsl:attribute-set name="nongraphical.admonition.properties">
+ <xsl:attribute name="space-before.minimum">0.8em</xsl:attribute>
+ <xsl:attribute name="space-before.optimum">1em</xsl:attribute>
+ <xsl:attribute name="space-before.maximum">1.2em</xsl:attribute>
+ <xsl:attribute name="margin-{$direction.align.start}">0.25in</xsl:attribute>
+ <xsl:attribute name="margin-{$direction.align.end}">0.25in</xsl:attribute>
+</xsl:attribute-set>
+</src:fragment>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+<para>These properties are added to the outer block containing the
+entire nongraphical admonition, including its title.
+It is used when the parameter
+<parameter>admon.graphics</parameter> is set to zero.
+Use this attribute-set to set the space above and below,
+and any indent for the whole admonition.</para>
+
+<para>In addition to these properties, a nongraphical admonition
+also applies the <parameter>admonition.title.properties</parameter>
+attribute-set to the title, and the
+<parameter>admonition.properties</parameter> attribute-set
+to the rest of the content.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/normal.para.spacing.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/normal.para.spacing.xml
new file mode 100644
index 0000000..bb2a6c0
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/normal.para.spacing.xml
@@ -0,0 +1,26 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="normal.para.spacing">
+<refmeta>
+<refentrytitle>normal.para.spacing</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>normal.para.spacing</refname>
+<refpurpose>What space do you want between normal paragraphs</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="normal.para.spacing.frag"><xsl:attribute-set name="normal.para.spacing">
+ <xsl:attribute name="space-before.optimum">1em</xsl:attribute>
+ <xsl:attribute name="space-before.minimum">0.8em</xsl:attribute>
+ <xsl:attribute name="space-before.maximum">1.2em</xsl:attribute>
+</xsl:attribute-set></src:fragment>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+<para>Specify the spacing required between normal paragraphs</para>
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/olink.base.uri.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/olink.base.uri.xml
new file mode 100644
index 0000000..d88dd62
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/olink.base.uri.xml
@@ -0,0 +1,35 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="olink.base.uri">
+<refmeta>
+<refentrytitle>olink.base.uri</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">uri</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>olink.base.uri</refname>
+<refpurpose>Base URI used in olink hrefs</refpurpose>
+</refnamediv>
+<refsynopsisdiv> <src:fragment xml:id="olink.base.uri.frag">
+<xsl:param name="olink.base.uri"></xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+
+<para>When cross reference data is collected for resolving olinks, it
+may be necessary to prepend a base URI to each target's href. This
+parameter lets you set that base URI when cross reference data is
+collected. This feature is needed when you want to link to a document
+that is processed without chunking. The output filename for such a
+document is not known to the XSL stylesheet; the only target
+information consists of fragment identifiers such as
+<literal>#idref</literal>. To enable the resolution of olinks between
+documents, you should pass the name of the HTML output file as the
+value of this parameter. Then the hrefs recorded in the cross
+reference data collection look like
+<literal>outfile.html#idref</literal>, which can be reached as links
+from other documents.</para>
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/olink.debug.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/olink.debug.xml
new file mode 100644
index 0000000..e49a176
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/olink.debug.xml
@@ -0,0 +1,36 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="olink.debug">
+<refmeta>
+<refentrytitle>olink.debug</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>olink.debug</refname>
+<refpurpose>Turn on debugging messages for olinks</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="olink.debug.frag">
+<xsl:param name="olink.debug" select="0"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, then each olink will generate several
+messages about how it is being resolved during processing.
+This is useful when an olink does not resolve properly
+and the standard error messages are not sufficient to
+find the problem.
+</para>
+
+<para>You may need to read through the olink XSL templates
+to understand the context for some of the debug messages.
+</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/olink.doctitle.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/olink.doctitle.xml
new file mode 100644
index 0000000..356347d
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/olink.doctitle.xml
@@ -0,0 +1,146 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="olink.doctitle">
+<refmeta>
+<refentrytitle>olink.doctitle</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">list</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">no</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">yes</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">maybe</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>olink.doctitle</refname>
+<refpurpose>show the document title for external olinks?</refpurpose>
+
+</refnamediv>
+<refsynopsisdiv> <src:fragment xml:id="olink.doctitle.frag">
+<xsl:param name="olink.doctitle">no</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+
+<para>When olinks between documents are resolved, the generated text
+may not make it clear that the reference is to another document.
+It is possible for the stylesheets to append the other document's
+title to external olinks. For this to happen, two parameters must
+be set.</para>
+<itemizedlist>
+<listitem>
+<para>This <parameter>olink.doctitle</parameter> parameter
+should be set to either <literal>yes</literal> or <literal>maybe</literal>
+to enable this feature.
+</para>
+</listitem>
+<listitem>
+<para>And you should also set the <parameter>current.docid</parameter>
+parameter to the document id for the document currently
+being processed for output.
+</para>
+</listitem>
+</itemizedlist>
+
+<para>
+Then if an olink's <literal>targetdoc</literal> id differs from
+the <literal>current.docid</literal> value, the stylesheet knows
+that it is a reference to another document and can
+append the target document's
+title to the generated olink text. </para>
+
+<para>The text for the target document's title is copied from the
+olink database from the <tag>ttl</tag> element
+of the top-level <tag>div</tag> for that document.
+If that <tag>ttl</tag> element is missing or empty,
+no title is output.
+</para>
+
+<para>The supported values for <parameter>olink.doctitle</parameter> are:
+</para>
+<variablelist>
+<varlistentry>
+<term><literal>yes</literal></term>
+<listitem>
+<para>
+Always insert the title to the target document if it is not
+the current document.
+</para>
+</listitem>
+</varlistentry>
+<varlistentry>
+<term><literal>no</literal></term>
+<listitem>
+<para>
+Never insert the title to the target document, even if requested
+in an <tag class="attribute">xrefstyle</tag> attribute.
+</para>
+</listitem>
+</varlistentry>
+<varlistentry>
+<term><literal>maybe</literal></term>
+<listitem>
+<para>
+Only insert the title to the target document, if requested
+in an <tag class="attribute">xrefstyle</tag> attribute.
+</para>
+</listitem>
+</varlistentry>
+</variablelist>
+<para>An <tag class="attribute">xrefstyle</tag> attribute
+may override the global setting for individual olinks.
+The following values are supported in an
+<tag class="attribute">xrefstyle</tag>
+attribute using the <literal>select:</literal> syntax:
+</para>
+
+<variablelist>
+<varlistentry>
+<term><literal>docname</literal></term>
+<listitem>
+<para>
+Insert the target document name for this olink using the
+<literal>docname</literal> gentext template, but only
+if the value of <parameter>olink.doctitle</parameter>
+is not <literal>no</literal>.
+</para>
+</listitem>
+</varlistentry>
+<varlistentry>
+<term><literal>docnamelong</literal></term>
+<listitem>
+<para>
+Insert the target document name for this olink using the
+<literal>docnamelong</literal> gentext template, but only
+if the value of <parameter>olink.doctitle</parameter>
+is not <literal>no</literal>.
+</para>
+</listitem>
+</varlistentry>
+<varlistentry>
+<term><literal>nodocname</literal></term>
+<listitem>
+<para>
+Omit the target document name even if
+the value of <parameter>olink.doctitle</parameter>
+is <literal>yes</literal>.
+</para>
+</listitem>
+</varlistentry>
+</variablelist>
+<para>Another way of inserting the target document name
+for a single olink is to employ an
+<tag class="attribute">xrefstyle</tag>
+attribute using the <literal>template:</literal> syntax.
+The <literal>%o</literal> placeholder (the letter o, not zero)
+in such a template
+will be filled in with the target document's title when it is processed.
+This will occur regardless of
+the value of <parameter>olink.doctitle</parameter>.
+</para>
+<para>Note that prior to version 1.66 of the XSL stylesheets,
+the allowed values for this parameter were 0 and 1. Those
+values are still supported and mapped to 'no' and 'yes', respectively.
+</para>
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/olink.fragid.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/olink.fragid.xml
new file mode 100644
index 0000000..3258038
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/olink.fragid.xml
@@ -0,0 +1,23 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="olink.fragid">
+<refmeta>
+<refentrytitle>olink.fragid</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>olink.fragid</refname>
+<refpurpose>Names the fragment identifier portion of an OLink resolver query</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+<src:fragment xml:id="olink.fragid.frag">
+<xsl:param name="olink.fragid">fragid=</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+<para>The fragment identifier portion of an <tag>olink</tag> target.</para>
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/olink.lang.fallback.sequence.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/olink.lang.fallback.sequence.xml
new file mode 100644
index 0000000..7d3d811
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/olink.lang.fallback.sequence.xml
@@ -0,0 +1,83 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="olink.lang.fallback.sequence">
+<refmeta>
+<refentrytitle>olink.lang.fallback.sequence</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>olink.lang.fallback.sequence</refname>
+<refpurpose>look up translated documents if olink not found?</refpurpose>
+
+</refnamediv>
+<refsynopsisdiv> <src:fragment xml:id="olink.lang.fallback.sequence.frag">
+<xsl:param name="olink.lang.fallback.sequence"></xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+
+
+<para>This parameter defines a list of lang values
+to search among to resolve olinks.
+</para>
+
+<para>Normally an olink tries to resolve to a document in the same
+language as the olink itself. The language of an olink
+is determined by its nearest ancestor element with a
+<tag class="attribute">lang</tag> attribute, otherwise the
+value of the <parameter>l10n.gentext.default.lang</parameter>
+parameter.
+</para>
+
+<para>An olink database can contain target data for the same
+document in multiple languages. Each set of data has the
+same value for the <tag>targetdoc</tag> attribute in
+the <tag>document</tag> element in the database, but with a
+different <tag>lang</tag> attribute value.
+</para>
+
+<para>When an olink is being resolved, the target is first
+sought in the document with the same language as the olink.
+If no match is found there, then this parameter is consulted
+for additional languages to try.</para>
+
+<para>The <parameter>olink.lang.fallback.sequence</parameter>
+must be a whitespace separated list of lang values to
+try. The first one with a match in the olink database is used.
+The default value is empty.</para>
+
+<para>For example, a document might be written in German
+and contain an olink with
+<literal>targetdoc="adminguide"</literal>.
+When the document is processed, the processor
+first looks for a target dataset in the
+olink database starting with:</para>
+
+<literallayout><literal>&lt;document targetdoc="adminguide" lang="de"&gt;</literal>.
+</literallayout>
+
+<para>If there is no such element, then the
+<parameter>olink.lang.fallback.sequence</parameter>
+parameter is consulted.
+If its value is, for example, <quote>fr en</quote>, then the processor next
+looks for <literal>targetdoc="adminguide" lang="fr"</literal>, and
+then for <literal>targetdoc="adminguide" lang="en"</literal>.
+If there is still no match, it looks for
+<literal>targetdoc="adminguide"</literal> with no
+lang attribute.
+</para>
+
+<para>This parameter is useful when a set of documents is only
+partially translated, or is in the process of being translated.
+If a target of an olink has not yet been translated, then this
+parameter permits the processor to look for the document in
+other languages. This assumes the reader would rather have
+a link to a document in a different language than to have
+a broken link.
+</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/olink.outline.ext.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/olink.outline.ext.xml
new file mode 100644
index 0000000..2de2fe2
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/olink.outline.ext.xml
@@ -0,0 +1,28 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="olink.outline.ext">
+<refmeta>
+<refentrytitle>olink.outline.ext</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>olink.outline.ext</refname>
+<refpurpose>The extension of OLink outline files</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="olink.outline.ext.frag">
+<xsl:param name="olink.outline.ext">.olink</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The extension to be expected for OLink outline files</para>
+<para>Bob has this parameter as dead. Please don't use</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/olink.properties.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/olink.properties.xml
new file mode 100644
index 0000000..b76657e
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/olink.properties.xml
@@ -0,0 +1,33 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="olink.properties">
+<refmeta>
+<refentrytitle>olink.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>olink.properties</refname>
+<refpurpose>Properties associated with the cross-reference
+text of an olink.</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="olink.properties.frag">
+<xsl:attribute-set name="olink.properties">
+ <xsl:attribute name="show-destination">replace</xsl:attribute>
+</xsl:attribute-set>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>This <literal>attribute set</literal> is applied to the
+<literal>fo:basic-link</literal> element of an olink. It is not applied to the
+optional page number or optional title of the external
+document.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/olink.pubid.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/olink.pubid.xml
new file mode 100644
index 0000000..4f0b50c
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/olink.pubid.xml
@@ -0,0 +1,27 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="olink.pubid">
+<refmeta>
+<refentrytitle>olink.pubid</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>olink.pubid</refname>
+<refpurpose>Names the public identifier portion of an OLink resolver query</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="olink.pubid.frag">
+<xsl:param name="olink.pubid">pubid</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para></para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/olink.resolver.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/olink.resolver.xml
new file mode 100644
index 0000000..fa7d471
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/olink.resolver.xml
@@ -0,0 +1,23 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="olink.resolver">
+<refmeta>
+<refentrytitle>olink.resolver</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>olink.resolver</refname>
+<refpurpose>The root name of the OLink resolver (usually a script)</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+<src:fragment xml:id="olink.resolver.frag">
+ <xsl:param name="olink.resolver" >/cgi-bin/olink</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+<para>FIXME:</para>
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/olink.sysid.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/olink.sysid.xml
new file mode 100644
index 0000000..6d4542f
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/olink.sysid.xml
@@ -0,0 +1,27 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="olink.sysid">
+<refmeta>
+<refentrytitle>olink.sysid</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>olink.sysid</refname>
+<refpurpose>Names the system identifier portion of an OLink resolver query</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="olink.sysid.frag">
+<xsl:param name="olink.sysid">sysid</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>FIXME</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/orderedlist.label.properties.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/orderedlist.label.properties.xml
new file mode 100644
index 0000000..39b0432
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/orderedlist.label.properties.xml
@@ -0,0 +1,26 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="orderedlist.label.properties">
+<refmeta>
+<refentrytitle>orderedlist.label.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>orderedlist.label.properties</refname>
+<refpurpose>Properties that apply to each label inside ordered list.</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="orderedlist.label.properties.frag"><xsl:attribute-set name="orderedlist.label.properties">
+</xsl:attribute-set></src:fragment>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+<para>Properties that apply to each label inside ordered list. E.g.:</para>
+<programlisting>&lt;xsl:attribute-set name="orderedlist.label.properties"&gt;
+ &lt;xsl:attribute name="text-align"&gt;right&lt;/xsl:attribute&gt;
+&lt;/xsl:attribute-set&gt;</programlisting>
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/orderedlist.label.width.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/orderedlist.label.width.xml
new file mode 100644
index 0000000..18c8fa8
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/orderedlist.label.width.xml
@@ -0,0 +1,28 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="orderedlist.label.width">
+<refmeta>
+<refentrytitle>orderedlist.label.width</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">length</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>orderedlist.label.width</refname>
+<refpurpose>The default width of the label (number) in an ordered list.</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="orderedlist.label.width.frag">
+<xsl:param name="orderedlist.label.width">1.2em</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+<para>Specifies the default width of the label (usually a number or
+sequence of numbers) in an ordered list. You can override the default
+value on any particular list with the “dbfo†processing instruction
+using the “label-width†pseudoattribute.</para>
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/orderedlist.properties.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/orderedlist.properties.xml
new file mode 100644
index 0000000..59061cb
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/orderedlist.properties.xml
@@ -0,0 +1,24 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="orderedlist.properties">
+<refmeta>
+<refentrytitle>orderedlist.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>orderedlist.properties</refname>
+<refpurpose>Properties that apply to each list-block generated by orderedlist.</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="orderedlist.properties.frag"><xsl:attribute-set name="orderedlist.properties" use-attribute-sets="list.block.properties">
+ <xsl:attribute name="provisional-distance-between-starts">2em</xsl:attribute>
+</xsl:attribute-set></src:fragment>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+<para>Properties that apply to each fo:list-block generated by orderedlist.</para>
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/othercredit.like.author.enabled.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/othercredit.like.author.enabled.xml
new file mode 100644
index 0000000..2e789dd
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/othercredit.like.author.enabled.xml
@@ -0,0 +1,31 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="othercredit.like.author.enabled">
+<refmeta>
+<refentrytitle>othercredit.like.author.enabled</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>othercredit.like.author.enabled</refname>
+<refpurpose>Display othercredit in same style as author?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="othercredit.like.author.enabled.frag"><xsl:param name="othercredit.like.author.enabled">0</xsl:param></src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, output of the
+<tag>othercredit</tag> element on titlepages is displayed in
+the same style as <tag>author</tag> and
+<tag>editor</tag> output. If zero then
+<tag>othercredit</tag> output is displayed using a style
+different than that of <tag>author</tag> and
+<tag>editor</tag>.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/output-root.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/output-root.xml
new file mode 100644
index 0000000..d37b054
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/output-root.xml
@@ -0,0 +1,28 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="output-root">
+<refmeta>
+<refentrytitle>output-root</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">filename</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>output-root</refname>
+<refpurpose>Specifies the root directory of the website</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="output-root.frag">
+<xsl:param name="output-root">.</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+<para>When using the XSLT processor to manage dependencies and construct
+the website, this parameter can be used to indicate the root directory
+where the resulting pages are placed.</para>
+<para>Only applies when XSLT-based chunking is being used.</para>
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/output.indent.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/output.indent.xml
new file mode 100644
index 0000000..40406d7
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/output.indent.xml
@@ -0,0 +1,32 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="output.indent">
+<refmeta>
+<refentrytitle>output.indent</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">list</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">no</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">yes</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>output.indent</refname>
+<refpurpose>Indent output?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="output.indent.frag">
+<xsl:param name="output.indent" >no</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies the setting of the <parameter>indent</parameter>
+parameter on the HTML slides. For more information, see the discussion
+of the <tag>xsl:output</tag> element in the XSLT specification.</para>
+<para>Select from <literal>yes</literal> or <literal>no</literal>.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/overlay.js.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/overlay.js.xml
new file mode 100644
index 0000000..162f87a
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/overlay.js.xml
@@ -0,0 +1,28 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="overlay.js">
+<refmeta>
+<refentrytitle>overlay.js</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">filename</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>overlay.js</refname>
+<refpurpose>Overlay JavaScript file</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="overlay.js.frag">
+<xsl:param name="overlay.js">overlay.js</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies the filename of the overlay JavaScript file. It's unlikely
+that you will ever need to change this parameter.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/overlay.logo.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/overlay.logo.xml
new file mode 100644
index 0000000..e740771
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/overlay.logo.xml
@@ -0,0 +1,28 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="overlay.logo">
+<refmeta>
+<refentrytitle>overlay.logo</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">uri</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>overlay.logo</refname>
+<refpurpose>Logo to overlay on ToC frame</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="overlay.logo.frag">
+<xsl:param name="overlay.logo">http://docbook.sourceforge.net/release/buttons/slides-1.png</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If this URI is non-empty, JavaScript is used to overlay the
+specified image on the ToC frame.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/overlay.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/overlay.xml
new file mode 100644
index 0000000..f955b23
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/overlay.xml
@@ -0,0 +1,32 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="overlay">
+<refmeta>
+<refentrytitle>overlay</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>overlay</refname>
+<refpurpose>Overlay footer navigation?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="overlay.frag">
+<xsl:param name="overlay" select="0"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, JavaScript is added to the slides to make the
+bottom navigation appear at the bottom of each page. This option and
+<link linkend="multiframe">multiframe</link> are mutually exclusive.</para>
+
+<para>If this parameter is zero, the bottom navigation simply appears
+below the content of each slide.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/page.height.portrait.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/page.height.portrait.xml
new file mode 100644
index 0000000..0dee73e
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/page.height.portrait.xml
@@ -0,0 +1,69 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="page.height.portrait">
+<refmeta>
+<refentrytitle>page.height.portrait</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">length</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>page.height.portrait</refname>
+<refpurpose>Specify the physical size of the long edge of the page</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="page.height.portrait.frag"><xsl:param name="page.height.portrait">
+ <xsl:choose>
+ <xsl:when test="$paper.type = 'A4landscape'">210mm</xsl:when>
+ <xsl:when test="$paper.type = 'USletter'">11in</xsl:when>
+ <xsl:when test="$paper.type = 'USlandscape'">8.5in</xsl:when>
+ <xsl:when test="$paper.type = '4A0'">2378mm</xsl:when>
+ <xsl:when test="$paper.type = '2A0'">1682mm</xsl:when>
+ <xsl:when test="$paper.type = 'A0'">1189mm</xsl:when>
+ <xsl:when test="$paper.type = 'A1'">841mm</xsl:when>
+ <xsl:when test="$paper.type = 'A2'">594mm</xsl:when>
+ <xsl:when test="$paper.type = 'A3'">420mm</xsl:when>
+ <xsl:when test="$paper.type = 'A4'">297mm</xsl:when>
+ <xsl:when test="$paper.type = 'A5'">210mm</xsl:when>
+ <xsl:when test="$paper.type = 'A6'">148mm</xsl:when>
+ <xsl:when test="$paper.type = 'A7'">105mm</xsl:when>
+ <xsl:when test="$paper.type = 'A8'">74mm</xsl:when>
+ <xsl:when test="$paper.type = 'A9'">52mm</xsl:when>
+ <xsl:when test="$paper.type = 'A10'">37mm</xsl:when>
+ <xsl:when test="$paper.type = 'B0'">1414mm</xsl:when>
+ <xsl:when test="$paper.type = 'B1'">1000mm</xsl:when>
+ <xsl:when test="$paper.type = 'B2'">707mm</xsl:when>
+ <xsl:when test="$paper.type = 'B3'">500mm</xsl:when>
+ <xsl:when test="$paper.type = 'B4'">353mm</xsl:when>
+ <xsl:when test="$paper.type = 'B5'">250mm</xsl:when>
+ <xsl:when test="$paper.type = 'B6'">176mm</xsl:when>
+ <xsl:when test="$paper.type = 'B7'">125mm</xsl:when>
+ <xsl:when test="$paper.type = 'B8'">88mm</xsl:when>
+ <xsl:when test="$paper.type = 'B9'">62mm</xsl:when>
+ <xsl:when test="$paper.type = 'B10'">44mm</xsl:when>
+ <xsl:when test="$paper.type = 'C0'">1297mm</xsl:when>
+ <xsl:when test="$paper.type = 'C1'">917mm</xsl:when>
+ <xsl:when test="$paper.type = 'C2'">648mm</xsl:when>
+ <xsl:when test="$paper.type = 'C3'">458mm</xsl:when>
+ <xsl:when test="$paper.type = 'C4'">324mm</xsl:when>
+ <xsl:when test="$paper.type = 'C5'">229mm</xsl:when>
+ <xsl:when test="$paper.type = 'C6'">162mm</xsl:when>
+ <xsl:when test="$paper.type = 'C7'">114mm</xsl:when>
+ <xsl:when test="$paper.type = 'C8'">81mm</xsl:when>
+ <xsl:when test="$paper.type = 'C9'">57mm</xsl:when>
+ <xsl:when test="$paper.type = 'C10'">40mm</xsl:when>
+ <xsl:otherwise>11in</xsl:otherwise>
+ </xsl:choose>
+</xsl:param></src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The portrait page height is the length of the long
+edge of the physical page.
+</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/page.height.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/page.height.xml
new file mode 100644
index 0000000..96e32c0
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/page.height.xml
@@ -0,0 +1,37 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="page.height">
+<refmeta>
+<refentrytitle>page.height</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">length</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>page.height</refname>
+<refpurpose>The height of the physical page</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="page.height.frag"><xsl:param name="page.height">
+ <xsl:choose>
+ <xsl:when test="$page.orientation = 'portrait'">
+ <xsl:value-of select="$page.height.portrait"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$page.width.portrait"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:param></src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The page height is generally calculated from the
+<parameter>paper.type</parameter> and
+<parameter>page.orientation</parameter> parameters.
+</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/page.margin.bottom.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/page.margin.bottom.xml
new file mode 100644
index 0000000..e1877f3
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/page.margin.bottom.xml
@@ -0,0 +1,29 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="page.margin.bottom">
+<refmeta>
+<refentrytitle>page.margin.bottom</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">length</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>page.margin.bottom</refname>
+<refpurpose>The bottom margin of the page</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="page.margin.bottom.frag">
+<xsl:param name="page.margin.bottom">0.5in</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The bottom page margin is the distance from the bottom of the region-after
+to the physical bottom of the page.
+</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/page.margin.inner.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/page.margin.inner.xml
new file mode 100644
index 0000000..97782ba
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/page.margin.inner.xml
@@ -0,0 +1,56 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="page.margin.inner">
+<refmeta>
+<refentrytitle>page.margin.inner</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">length</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>page.margin.inner</refname>
+<refpurpose>The inner page margin</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="page.margin.inner.frag"><xsl:param name="page.margin.inner">
+ <xsl:choose>
+ <xsl:when test="$double.sided != 0">1.25in</xsl:when>
+ <xsl:otherwise>1in</xsl:otherwise>
+ </xsl:choose>
+</xsl:param></src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The inner page margin is the distance from bound edge of the
+page to the first column of text. </para>
+
+<para>The inner page margin is the distance from bound edge of the
+page to the outer edge of the first column of text.</para>
+
+<para>In left-to-right text direction,
+this is the left margin of recto (front side) pages.
+For single-sided output, it is the left margin
+of all pages.</para>
+
+<para>In right-to-left text direction,
+this is the right margin of recto pages.
+For single-sided output, this is the
+right margin of all pages.</para>
+
+<note>
+<para>Current versions (at least as of version 4.13)
+of the XEP XSL-FO processor do not
+correctly handle these margin settings for documents
+with right-to-left text direction.
+The workaround in that situation is to reverse
+the values for <parameter>page.margin.inner</parameter>
+and <parameter>page.margin.outer</parameter>, until
+this bug is fixed by RenderX. It does not affect documents
+with left-to-right text direction.</para>
+</note>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/page.margin.outer.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/page.margin.outer.xml
new file mode 100644
index 0000000..61dfeb8
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/page.margin.outer.xml
@@ -0,0 +1,53 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="page.margin.outer">
+<refmeta>
+<refentrytitle>page.margin.outer</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">length</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>page.margin.outer</refname>
+<refpurpose>The outer page margin</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="page.margin.outer.frag"><xsl:param name="page.margin.outer">
+ <xsl:choose>
+ <xsl:when test="$double.sided != 0">0.75in</xsl:when>
+ <xsl:otherwise>1in</xsl:otherwise>
+ </xsl:choose>
+</xsl:param></src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The outer page margin is the distance from non-bound edge of the
+page to the outer edge of the last column of text.</para>
+
+<para>In left-to-right text direction,
+this is the right margin of recto (front side) pages.
+For single-sided output, it is the right margin
+of all pages.</para>
+
+<para>In right-to-left text direction,
+this is the left margin of recto pages.
+For single-sided output, this is the
+left margin of all pages.</para>
+
+<note>
+<para>Current versions (at least as of version 4.13)
+of the XEP XSL-FO processor do not
+correctly handle these margin settings for documents
+with right-to-left text direction.
+The workaround in that situation is to reverse
+the values for <parameter>page.margin.inner</parameter>
+and <parameter>page.margin.outer</parameter>, until
+this bug is fixed by RenderX. It does not affect documents
+with left-to-right text direction.</para>
+</note>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/page.margin.top.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/page.margin.top.xml
new file mode 100644
index 0000000..a7e53e8
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/page.margin.top.xml
@@ -0,0 +1,28 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="page.margin.top">
+<refmeta>
+<refentrytitle>page.margin.top</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">length</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>page.margin.top</refname>
+<refpurpose>The top margin of the page</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="page.margin.top.frag">
+<xsl:param name="page.margin.top">0.5in</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The top page margin is the distance from the physical top of the
+page to the top of the region-before.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/page.orientation.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/page.orientation.xml
new file mode 100644
index 0000000..37971c0
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/page.orientation.xml
@@ -0,0 +1,32 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="page.orientation">
+<refmeta>
+<refentrytitle>page.orientation</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">list</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">portrait</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">landscape</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>page.orientation</refname>
+<refpurpose>Select the page orientation</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="page.orientation.frag">
+<xsl:param name="page.orientation">portrait</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para> Select one from portrait or landscape.
+In portrait orientation, the short edge is horizontal; in
+landscape orientation, it is vertical.
+</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/page.width.portrait.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/page.width.portrait.xml
new file mode 100644
index 0000000..8216fc3
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/page.width.portrait.xml
@@ -0,0 +1,67 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="page.width.portrait">
+<refmeta>
+<refentrytitle>page.width.portrait</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">length</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>page.width.portrait</refname>
+<refpurpose>Specify the physical size of the short edge of the page</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="page.width.portrait.frag"><xsl:param name="page.width.portrait">
+ <xsl:choose>
+ <xsl:when test="$paper.type = 'USletter'">8.5in</xsl:when>
+ <xsl:when test="$paper.type = '4A0'">1682mm</xsl:when>
+ <xsl:when test="$paper.type = '2A0'">1189mm</xsl:when>
+ <xsl:when test="$paper.type = 'A0'">841mm</xsl:when>
+ <xsl:when test="$paper.type = 'A1'">594mm</xsl:when>
+ <xsl:when test="$paper.type = 'A2'">420mm</xsl:when>
+ <xsl:when test="$paper.type = 'A3'">297mm</xsl:when>
+ <xsl:when test="$paper.type = 'A4'">210mm</xsl:when>
+ <xsl:when test="$paper.type = 'A5'">148mm</xsl:when>
+ <xsl:when test="$paper.type = 'A6'">105mm</xsl:when>
+ <xsl:when test="$paper.type = 'A7'">74mm</xsl:when>
+ <xsl:when test="$paper.type = 'A8'">52mm</xsl:when>
+ <xsl:when test="$paper.type = 'A9'">37mm</xsl:when>
+ <xsl:when test="$paper.type = 'A10'">26mm</xsl:when>
+ <xsl:when test="$paper.type = 'B0'">1000mm</xsl:when>
+ <xsl:when test="$paper.type = 'B1'">707mm</xsl:when>
+ <xsl:when test="$paper.type = 'B2'">500mm</xsl:when>
+ <xsl:when test="$paper.type = 'B3'">353mm</xsl:when>
+ <xsl:when test="$paper.type = 'B4'">250mm</xsl:when>
+ <xsl:when test="$paper.type = 'B5'">176mm</xsl:when>
+ <xsl:when test="$paper.type = 'B6'">125mm</xsl:when>
+ <xsl:when test="$paper.type = 'B7'">88mm</xsl:when>
+ <xsl:when test="$paper.type = 'B8'">62mm</xsl:when>
+ <xsl:when test="$paper.type = 'B9'">44mm</xsl:when>
+ <xsl:when test="$paper.type = 'B10'">31mm</xsl:when>
+ <xsl:when test="$paper.type = 'C0'">917mm</xsl:when>
+ <xsl:when test="$paper.type = 'C1'">648mm</xsl:when>
+ <xsl:when test="$paper.type = 'C2'">458mm</xsl:when>
+ <xsl:when test="$paper.type = 'C3'">324mm</xsl:when>
+ <xsl:when test="$paper.type = 'C4'">229mm</xsl:when>
+ <xsl:when test="$paper.type = 'C5'">162mm</xsl:when>
+ <xsl:when test="$paper.type = 'C6'">114mm</xsl:when>
+ <xsl:when test="$paper.type = 'C7'">81mm</xsl:when>
+ <xsl:when test="$paper.type = 'C8'">57mm</xsl:when>
+ <xsl:when test="$paper.type = 'C9'">40mm</xsl:when>
+ <xsl:when test="$paper.type = 'C10'">28mm</xsl:when>
+ <xsl:otherwise>8.5in</xsl:otherwise>
+ </xsl:choose>
+</xsl:param></src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The portrait page width is the length of the short
+edge of the physical page.
+</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/page.width.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/page.width.xml
new file mode 100644
index 0000000..ff16060
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/page.width.xml
@@ -0,0 +1,36 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="page.width">
+<refmeta>
+<refentrytitle>page.width</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">length</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>page.width</refname>
+<refpurpose>The width of the physical page</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="page.width.frag"><xsl:param name="page.width">
+ <xsl:choose>
+ <xsl:when test="$page.orientation = 'portrait'">
+ <xsl:value-of select="$page.width.portrait"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$page.height.portrait"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:param></src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The page width is generally calculated from the
+<parameter>paper.type</parameter> and
+<parameter>page.orientation</parameter> parameters.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/pages.template.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/pages.template.xml
new file mode 100644
index 0000000..fff546c
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/pages.template.xml
@@ -0,0 +1,29 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="pages.template">
+<refmeta>
+<refentrytitle>pages.template</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">uri</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>pages.template</refname>
+<refpurpose>Specify the template Pages document</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="pages.template.frag">
+<xsl:param name="pages.template"></xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The <parameter>pages.template</parameter> parameter specifies a Pages (the Apple word processing application) document to use as a template for the generated document. The template document is used to define the (extensive) headers for the generated document, in particular the paragraph and character styles that are used to format the various elements. Any content in the template document is ignored.</para>
+
+<para>A template document is used in order to allow maintenance of the paragraph and character styles to be done using Pages itself, rather than these XSL stylesheets.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/paper.type.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/paper.type.xml
new file mode 100644
index 0000000..2656c9c
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/paper.type.xml
@@ -0,0 +1,73 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="paper.type">
+<refmeta>
+<refentrytitle>paper.type</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">list</refmiscinfo>
+<refmiscinfo class="other" otherclass="list-type">open</refmiscinfo>
+<refmiscinfo class="other" otherclass="list-type">open</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">USletter<alt>8.5x11in</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">USlandscape<alt>11x8.5in</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">USlegal<alt>8.5inx14in</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">USlegallandscape<alt>14inx8.5in</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">4A0<alt>2378x1682mm</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">2A0<alt>1682x1189mm</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">A0<alt>1189x841mm</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">A1<alt>841x594mm</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">A2<alt>594x420mm</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">A3<alt>420x297mm</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">A4<alt>297x210mm</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">A5<alt>210x148mm</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">A6<alt>148x105mm</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">A7<alt>105x74mm</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">A8<alt>74x52mm</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">A9<alt>52x37mm</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">A10<alt>37x26mm</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">B0<alt>1414x1000mm</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">B1<alt>1000x707mm</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">B2<alt>707x500mm</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">B3<alt>500x353mm</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">B4<alt>353x250mm</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">B5<alt>250x176mm</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">B6<alt>176x125mm</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">B7<alt>125x88mm</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">B8<alt>88x62mm</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">B9<alt>62x44mm</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">B10<alt>44x31mm</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">C0<alt>1297x917mm</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">C1<alt>917x648mm</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">C2<alt>648x458mm</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">C3<alt>458x324mm</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">C4<alt>324x229mm</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">C5<alt>229x162mm</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">C6<alt>162x114mm</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">C7<alt>114x81mm</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">C8<alt>81x57mm</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">C9<alt>57x40mm</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">C10<alt>40x28mm</alt></refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>paper.type</refname>
+<refpurpose>Select the paper type</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="paper.type.frag">
+<xsl:param name="paper.type">USletter</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The paper type is a convenient way to specify the paper size.
+The list of known paper sizes includes USletter and most of the A,
+B, and C sizes. See <parameter>page.width.portrait</parameter>, for example.
+
+
+</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/para.propagates.style.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/para.propagates.style.xml
new file mode 100644
index 0000000..0415adf
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/para.propagates.style.xml
@@ -0,0 +1,29 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="para.propagates.style">
+<refmeta>
+<refentrytitle>para.propagates.style</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>para.propagates.style</refname>
+<refpurpose>Pass para role attribute through to HTML?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="para.propagates.style.frag">
+<xsl:param name="para.propagates.style" select="1"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If true, the role attribute of <tag>para</tag> elements
+will be passed through to the HTML as a class attribute on the
+<tag>p</tag> generated for the paragraph.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/part.autolabel.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/part.autolabel.xml
new file mode 100644
index 0000000..4f1a42c
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/part.autolabel.xml
@@ -0,0 +1,73 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="part.autolabel">
+<refmeta>
+<refentrytitle>part.autolabel</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">list</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">0<alt>none</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">1<alt>1,2,3...</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">A<alt>A,B,C...</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">a<alt>a,b,c...</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">i<alt>i,ii,iii...</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">I<alt>I,II,III...</alt></refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>part.autolabel</refname>
+<refpurpose>Specifies the labeling format for Part titles</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="part.autolabel.frag">
+<xsl:param name="part.autolabel">I</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, then parts will be numbered using the parameter
+value as the number format if the value matches one of the following:
+</para>
+
+<variablelist>
+ <varlistentry>
+ <term>1 or arabic</term>
+ <listitem>
+ <para>Arabic numeration (1, 2, 3 ...).</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>A or upperalpha</term>
+ <listitem>
+ <para>Uppercase letter numeration (A, B, C ...).</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>a or loweralpha</term>
+ <listitem>
+ <para>Lowercase letter numeration (a, b, c ...).</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>I or upperroman</term>
+ <listitem>
+ <para>Uppercase roman numeration (I, II, III ...).</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>i or lowerroman</term>
+ <listitem>
+ <para>Lowercase roman letter numeration (i, ii, iii ...).</para>
+ </listitem>
+ </varlistentry>
+</variablelist>
+
+<para>Any nonzero value other than the above will generate
+the default number format (upperroman).
+</para>
+
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/passivetex.extensions.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/passivetex.extensions.xml
new file mode 100644
index 0000000..2b1cb77
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/passivetex.extensions.xml
@@ -0,0 +1,37 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="passivetex.extensions">
+<refmeta>
+<refentrytitle>passivetex.extensions</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>passivetex.extensions</refname>
+<refpurpose>Enable PassiveTeX extensions?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="passivetex.extensions.frag"><xsl:param name="passivetex.extensions" select="0"/></src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero,
+<link xlink:href="http://www.tei-c.org.uk/Software/passivetex/">PassiveTeX</link>
+extensions will be used. At present, this consists of PDF bookmarks
+and sorted index terms.
+</para>
+
+<para>This parameter can also affect which graphics file formats
+are supported</para>
+
+<note>
+ <para>PassiveTeX is incomplete and development has ceased. In most cases,
+another XSL-FO engine is probably a better choice.</para>
+</note>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/pgwide.properties.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/pgwide.properties.xml
new file mode 100644
index 0000000..c63b461
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/pgwide.properties.xml
@@ -0,0 +1,52 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="pgwide.properties">
+<refmeta>
+<refentrytitle>pgwide.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>pgwide.properties</refname>
+<refpurpose>Properties to make a figure or table page wide.
+</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="pgwide.properties.frag">
+<xsl:attribute-set name="pgwide.properties">
+ <xsl:attribute name="start-indent">0pt</xsl:attribute>
+</xsl:attribute-set>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>This attribute set is used to set the properties
+that make a figure or table "page wide" in fo output.
+It comes into effect when an attribute <literal>pgwide="1"</literal>
+is used.
+</para>
+
+<para>
+By default, it sets <parameter>start-indent</parameter>
+to <literal>0pt</literal>.
+In a stylesheet that sets the parameter
+<parameter>body.start.indent</parameter>
+to a non-zero value in order to indent body text,
+this attribute set can be used to outdent pgwide
+figures to the start margin.
+</para>
+
+<para>If a document uses a multi-column page layout,
+then this attribute set could try setting <parameter>span</parameter>
+to a value of <literal>all</literal>. However, this may
+not work with some processors because a span property must be on an
+fo:block that is a direct child of fo:flow. It may work in
+some processors anyway.
+</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/phrase.propagates.style.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/phrase.propagates.style.xml
new file mode 100644
index 0000000..8c25892
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/phrase.propagates.style.xml
@@ -0,0 +1,29 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="phrase.propagates.style">
+<refmeta>
+<refentrytitle>phrase.propagates.style</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>phrase.propagates.style</refname>
+<refpurpose>Pass phrase role attribute through to HTML?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="phrase.propagates.style.frag">
+<xsl:param name="phrase.propagates.style" select="1"/></src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, the role attribute of <tag>phrase</tag> elements
+will be passed through to the HTML as a <literal>class</literal>
+attribute on a <literal>span</literal> that surrounds the
+phrase.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/pixels.per.inch.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/pixels.per.inch.xml
new file mode 100644
index 0000000..86faff5
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/pixels.per.inch.xml
@@ -0,0 +1,31 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="pixels.per.inch">
+<refmeta>
+<refentrytitle>pixels.per.inch</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">integer</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>pixels.per.inch</refname>
+<refpurpose>How many pixels are there per inch?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="pixels.per.inch.frag">
+<xsl:param name="pixels.per.inch">90</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>When lengths are converted to pixels, this value is used to
+determine the size of a pixel. The default value is taken from the
+<link xlink:href="http://www.w3.org/TR/2004/WD-xsl11-20041216/">XSL
+Recommendation</link>.
+</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/plus.image.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/plus.image.xml
new file mode 100644
index 0000000..17b3d3c
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/plus.image.xml
@@ -0,0 +1,29 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="plus.image">
+<refmeta>
+<refentrytitle>plus.image</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">filename</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>plus.image</refname>
+<refpurpose>Plus image</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="plus.image.frag">
+<xsl:param name="plus.image">toc/closed.png</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies the filename of the <quote>plus</quote> image; the image used in a
+<link linkend="dynamic.toc">dynamic ToC</link> to indicate that a section
+can be expanded.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/points.per.em.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/points.per.em.xml
new file mode 100644
index 0000000..76bd22e
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/points.per.em.xml
@@ -0,0 +1,29 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="points.per.em">
+<refmeta>
+<refentrytitle>points.per.em</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">number</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>points.per.em</refname>
+<refpurpose>Specify the nominal size of an em-space in points</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="points.per.em.frag">
+<xsl:param name="points.per.em">10</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The fixed value used for calculations based upon the size of a
+character. The assumption made is that ten point font is in use. This
+assumption may not be valid.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/preface.autolabel.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/preface.autolabel.xml
new file mode 100644
index 0000000..f59115a
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/preface.autolabel.xml
@@ -0,0 +1,71 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="preface.autolabel">
+<refmeta>
+<refentrytitle>preface.autolabel</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">list</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">0<alt>none</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">1<alt>1,2,3...</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">A<alt>A,B,C...</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">a<alt>a,b,c...</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">i<alt>i,ii,iii...</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">I<alt>I,II,III...</alt></refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>preface.autolabel</refname>
+<refpurpose>Specifices the labeling format for Preface titles</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="preface.autolabel.frag"><xsl:param name="preface.autolabel" select="0"/></src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero then prefaces will be numbered using the parameter
+value as the number format if the value matches one of the following:
+</para>
+
+<variablelist>
+ <varlistentry>
+ <term>1 or arabic</term>
+ <listitem>
+ <para>Arabic numeration (1, 2, 3 ...).</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>A or upperalpha</term>
+ <listitem>
+ <para>Uppercase letter numeration (A, B, C ...).</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>a or loweralpha</term>
+ <listitem>
+ <para>Lowercase letter numeration (a, b, c ...).</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>I or upperroman</term>
+ <listitem>
+ <para>Uppercase roman numeration (I, II, III ...).</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>i or lowerroman</term>
+ <listitem>
+ <para>Lowercase roman letter numeration (i, ii, iii ...).</para>
+ </listitem>
+ </varlistentry>
+</variablelist>
+
+<para>Any nonzero value other than the above will generate
+the default number format (arabic).
+</para>
+
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/prefer.internal.olink.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/prefer.internal.olink.xml
new file mode 100644
index 0000000..2599d76
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/prefer.internal.olink.xml
@@ -0,0 +1,78 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="prefer.internal.olink">
+<refmeta>
+<refentrytitle>prefer.internal.olink</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>prefer.internal.olink</refname>
+<refpurpose>Prefer a local olink reference to an external reference</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="prefer.internal.olink.frag">
+<xsl:param name="prefer.internal.olink" select="0"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If you are re-using XML content modules in multiple documents,
+you may want to redirect some of your olinks. This parameter
+permits you to redirect an olink to the current document.
+</para>
+
+<para>For example: you are writing documentation for a product,
+which includes 3 manuals: a little installation
+booklet (booklet.xml), a user
+guide (user.xml), and a reference manual (reference.xml).
+All 3 documents begin with the same introduction section (intro.xml) that
+contains a reference to the customization section (custom.xml) which is
+included in both user.xml and reference.xml documents.
+</para>
+
+<para>How do you write the link to custom.xml in intro.xml
+so that it is interpreted correctly in all 3 documents?</para>
+<itemizedlist>
+<listitem><para>If you use xref, it will fail in user.xml.</para>
+</listitem>
+<listitem><para>If you use olink (pointing to reference.xml),
+the reference in user.xml
+will point to the customization section of the reference manual, while it is
+actually available in user.xml.</para>
+</listitem>
+</itemizedlist>
+
+<para>If you set the <parameter>prefer.internal.olink</parameter>
+parameter to a non-zero value, then the processor will
+first look in the olink database
+for the olink's <tag>targetptr</tag> attribute value
+in document matching the <parameter>current.docid</parameter>
+parameter value. If it isn't found there, then
+it tries the document in the database
+with the <tag>targetdoc</tag>
+value that matches the olink's <tag>targetdoc</tag>
+attribute.
+</para>
+
+<para>This feature permits an olink reference to resolve to
+the current document if there is an element
+with an id matching the olink's <tag>targetptr</tag>
+value. The current document's olink data must be
+included in the target database for this to work.</para>
+
+<caution>
+<para>There is a potential for incorrect links if
+the same <tag>id</tag> attribute value is used for different
+content in different documents.
+Some of your olinks may be redirected to the current document
+when they shouldn't be. It is not possible to control
+individual olink instances.</para>
+</caution>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/preferred.mediaobject.role.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/preferred.mediaobject.role.xml
new file mode 100644
index 0000000..57b0989
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/preferred.mediaobject.role.xml
@@ -0,0 +1,40 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="preferred.mediaobject.role">
+<refmeta>
+<refentrytitle>preferred.mediaobject.role</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>preferred.mediaobject.role</refname>
+<refpurpose>Select which mediaobject to use based on
+this value of an object's <tag class="attribute">role</tag> attribute.
+</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="preferred.mediaobject.role.frag">
+<xsl:param name="preferred.mediaobject.role"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>A mediaobject may contain several objects such as imageobjects.
+If the parameter <parameter>use.role.for.mediaobject</parameter> is
+non-zero, then the <literal>role</literal> attribute on
+<tag>imageobject</tag>s and other objects within a
+<tag>mediaobject</tag> container will be used to select which object
+will be used. If one of the objects has a role value that matches the
+<parameter>preferred.mediaobject.role</parameter> parameter, then it
+has first priority for selection. If more than one has such a role
+value, the first one is used.
+</para>
+<para>
+See the <parameter>use.role.for.mediaobject</parameter> parameter
+for the sequence of selection.</para>
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/prev.image.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/prev.image.xml
new file mode 100644
index 0000000..b017115
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/prev.image.xml
@@ -0,0 +1,27 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="prev.image">
+<refmeta>
+<refentrytitle>prev.image</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">filename</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>prev.image</refname>
+<refpurpose>Left-arrow image</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="prev.image.frag">
+<xsl:param name="prev.image">active/nav-prev.png</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies the filename of the left-pointing navigation arrow.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/procedure.properties.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/procedure.properties.xml
new file mode 100644
index 0000000..f6cadb0
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/procedure.properties.xml
@@ -0,0 +1,29 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="procedure.properties">
+<refmeta>
+<refentrytitle>procedure.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>procedure.properties</refname>
+<refpurpose>Properties associated with a procedure</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="procedure.properties.frag">
+<xsl:attribute-set name="procedure.properties" use-attribute-sets="formal.object.properties">
+ <xsl:attribute name="keep-together.within-column">auto</xsl:attribute>
+</xsl:attribute-set>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The styling for procedures.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/process.empty.source.toc.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/process.empty.source.toc.xml
new file mode 100644
index 0000000..772b456
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/process.empty.source.toc.xml
@@ -0,0 +1,39 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="process.empty.source.toc">
+<refmeta>
+<refentrytitle>process.empty.source.toc</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>process.empty.source.toc</refname>
+<refpurpose>Generate automated TOC if <tag>toc</tag> element occurs in a source document?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="process.empty.source.toc.frag"><xsl:param name="process.empty.source.toc" select="0"/></src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies that if an empty <tag>toc</tag> element is found in a
+source document, an automated TOC is generated at this point in the
+document.
+<note>
+ <para>Depending on what the value of the
+ <parameter>generate.toc</parameter> parameter is, setting this
+ parameter to <literal>1</literal> could result in generation of
+ duplicate automated TOCs. So the
+ <parameter>process.empty.source.toc</parameter> is primarily useful
+ as an "override": by placing an empty <tag>toc</tag> in your
+ document and setting this parameter to <literal>1</literal>, you can
+ force a TOC to be generated even if <tag>generate.toc</tag>
+ says not to.</para>
+</note>
+</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/process.source.toc.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/process.source.toc.xml
new file mode 100644
index 0000000..b91657a
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/process.source.toc.xml
@@ -0,0 +1,39 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="process.source.toc">
+<refmeta>
+<refentrytitle>process.source.toc</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>process.source.toc</refname>
+<refpurpose>Process a non-empty <tag>toc</tag> element if it occurs in a source document?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="process.source.toc.frag"><xsl:param name="process.source.toc" select="0"/></src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies that the contents of a non-empty "hard-coded"
+<tag>toc</tag> element in a source document are processed to
+generate a TOC in output.
+<note>
+ <para>This parameter has no effect on automated generation of
+ TOCs. An automated TOC may still be generated along with the
+ "hard-coded" TOC. To suppress automated TOC generation, adjust the
+ value of the <parameter>generate.toc</parameter> paramameter.</para>
+
+ <para>The <tag>process.source.toc</tag> parameter also has
+ no effect if the <tag>toc</tag> element is empty; handling
+ for empty <tag>toc</tag> is controlled by the
+ <parameter>process.empty.source.toc</parameter> parameter.</para>
+</note>
+</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/profile.arch.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/profile.arch.xml
new file mode 100644
index 0000000..afcd34c
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/profile.arch.xml
@@ -0,0 +1,39 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="profile.arch">
+<refmeta>
+<refentrytitle>profile.arch</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>profile.arch</refname>
+<refpurpose>Target profile for <tag class="attribute">arch</tag>
+attribute</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="profile.arch.frag">
+<xsl:param name="profile.arch"></xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+
+<refsection><info><title>Description</title></info>
+
+<para>The value of this parameter specifies profiles which should be
+included in the output. You can specify multiple profiles by
+separating them by semicolon. You can change separator character by
+<parameter>profile.separator</parameter>
+parameter.</para>
+
+<para>This parameter has effect only when you are using profiling
+stylesheets (<filename>profile-docbook.xsl</filename>,
+<filename>profile-chunk.xsl</filename>, …) instead of normal
+ones (<filename>docbook.xsl</filename>,
+<filename>chunk.xsl</filename>, …).</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/profile.attribute.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/profile.attribute.xml
new file mode 100644
index 0000000..e7dc5d0
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/profile.attribute.xml
@@ -0,0 +1,34 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="profile.attribute">
+<refmeta>
+<refentrytitle>profile.attribute</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>profile.attribute</refname>
+<refpurpose>Name of user-specified profiling attribute</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="profile.attribute.frag">
+<xsl:param name="profile.attribute"></xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>This parameter is used in conjuction with
+<parameter>profile.value</parameter>.</para>
+
+<para>This parameter has effect only when you are using profiling
+stylesheets (<filename>profile-docbook.xsl</filename>,
+<filename>profile-chunk.xsl</filename>, …) instead of normal
+ones (<filename>docbook.xsl</filename>,
+<filename>chunk.xsl</filename>, …).</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/profile.audience.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/profile.audience.xml
new file mode 100644
index 0000000..1c5b1a3
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/profile.audience.xml
@@ -0,0 +1,38 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="profile.audience">
+<refmeta>
+<refentrytitle>profile.audience</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>profile.audience</refname>
+<refpurpose>Target profile for <tag class="attribute">audience</tag>
+attribute</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="profile.audience.frag">
+<xsl:param name="profile.audience"></xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Value of this parameter specifies profiles which should be
+included in the output. You can specify multiple profiles by
+separating them by semicolon. You can change separator character by
+<parameter>profile.separator</parameter>
+parameter.</para>
+
+<para>This parameter has effect only when you are using profiling
+stylesheets (<filename>profile-docbook.xsl</filename>,
+<filename>profile-chunk.xsl</filename>, …) instead of normal
+ones (<filename>docbook.xsl</filename>,
+<filename>chunk.xsl</filename>, …).</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/profile.condition.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/profile.condition.xml
new file mode 100644
index 0000000..8bb01a3
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/profile.condition.xml
@@ -0,0 +1,38 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="profile.condition">
+<refmeta>
+<refentrytitle>profile.condition</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>profile.condition</refname>
+<refpurpose>Target profile for <tag class="attribute">condition</tag>
+attribute</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="profile.condition.frag">
+<xsl:param name="profile.condition"></xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The value of this parameter specifies profiles which should be
+included in the output. You can specify multiple profiles by
+separating them by semicolon. You can change separator character by
+<parameter>profile.separator</parameter>
+parameter.</para>
+
+<para>This parameter has effect only when you are using profiling
+stylesheets (<filename>profile-docbook.xsl</filename>,
+<filename>profile-chunk.xsl</filename>, …) instead of normal
+ones (<filename>docbook.xsl</filename>,
+<filename>chunk.xsl</filename>, …).</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/profile.conformance.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/profile.conformance.xml
new file mode 100644
index 0000000..606af4c
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/profile.conformance.xml
@@ -0,0 +1,38 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="profile.conformance">
+<refmeta>
+<refentrytitle>profile.conformance</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>profile.conformance</refname>
+<refpurpose>Target profile for <tag class="attribute">conformance</tag>
+attribute</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="profile.conformance.frag">
+<xsl:param name="profile.conformance"></xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The value of this parameter specifies profiles which should be
+included in the output. You can specify multiple profiles by
+separating them by semicolon. You can change separator character by
+<parameter>profile.separator</parameter>
+parameter.</para>
+
+<para>This parameter has effect only when you are using profiling
+stylesheets (<filename>profile-docbook.xsl</filename>,
+<filename>profile-chunk.xsl</filename>, …) instead of normal
+ones (<filename>docbook.xsl</filename>,
+<filename>chunk.xsl</filename>, …).</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/profile.lang.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/profile.lang.xml
new file mode 100644
index 0000000..43b9439
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/profile.lang.xml
@@ -0,0 +1,38 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="profile.lang">
+<refmeta>
+<refentrytitle>profile.lang</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>profile.lang</refname>
+<refpurpose>Target profile for <tag class="attribute">lang</tag>
+attribute</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="profile.lang.frag">
+<xsl:param name="profile.lang"></xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The value of this parameter specifies profiles which should be
+included in the output. You can specify multiple profiles by
+separating them by semicolon. You can change separator character by
+<parameter>profile.separator</parameter>
+parameter.</para>
+
+<para>This parameter has effect only when you are using profiling
+stylesheets (<filename>profile-docbook.xsl</filename>,
+<filename>profile-chunk.xsl</filename>, …) instead of normal
+ones (<filename>docbook.xsl</filename>,
+<filename>chunk.xsl</filename>, …).</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/profile.os.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/profile.os.xml
new file mode 100644
index 0000000..ba6f430
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/profile.os.xml
@@ -0,0 +1,38 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="profile.os">
+<refmeta>
+<refentrytitle>profile.os</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>profile.os</refname>
+<refpurpose>Target profile for <tag class="attribute">os</tag>
+attribute</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="profile.os.frag">
+<xsl:param name="profile.os"></xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The value of this parameter specifies profiles which should be
+included in the output. You can specify multiple profiles by
+separating them by semicolon. You can change separator character by
+<parameter>profile.separator</parameter>
+parameter.</para>
+
+<para>This parameter has effect only when you are using profiling
+stylesheets (<filename>profile-docbook.xsl</filename>,
+<filename>profile-chunk.xsl</filename>, …) instead of normal
+ones (<filename>docbook.xsl</filename>,
+<filename>chunk.xsl</filename>, …).</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/profile.revision.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/profile.revision.xml
new file mode 100644
index 0000000..28f668d
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/profile.revision.xml
@@ -0,0 +1,38 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="profile.revision">
+<refmeta>
+<refentrytitle>profile.revision</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>profile.revision</refname>
+<refpurpose>Target profile for <tag class="attribute">revision</tag>
+attribute</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="profile.revision.frag">
+<xsl:param name="profile.revision" ></xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The value of this parameter specifies profiles which should be
+included in the output. You can specify multiple profiles by
+separating them by semicolon. You can change separator character by
+<parameter>profile.separator</parameter>
+parameter.</para>
+
+<para>This parameter has effect only when you are using profiling
+stylesheets (<filename>profile-docbook.xsl</filename>,
+<filename>profile-chunk.xsl</filename>, …) instead of normal
+ones (<filename>docbook.xsl</filename>,
+<filename>chunk.xsl</filename>, …).</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/profile.revisionflag.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/profile.revisionflag.xml
new file mode 100644
index 0000000..3ab8919
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/profile.revisionflag.xml
@@ -0,0 +1,38 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="profile.revisionflag">
+<refmeta>
+<refentrytitle>profile.revisionflag</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>profile.revisionflag</refname>
+<refpurpose>Target profile for <tag class="attribute">revisionflag</tag>
+attribute</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="profile.revisionflag.frag">
+<xsl:param name="profile.revisionflag"></xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The value of this parameter specifies profiles which should be
+included in the output. You can specify multiple profiles by
+separating them by semicolon. You can change separator character by
+<parameter>profile.separator</parameter>
+parameter.</para>
+
+<para>This parameter has effect only when you are using profiling
+stylesheets (<filename>profile-docbook.xsl</filename>,
+<filename>profile-chunk.xsl</filename>, …) instead of normal
+ones (<filename>docbook.xsl</filename>,
+<filename>chunk.xsl</filename>, …).</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/profile.role.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/profile.role.xml
new file mode 100644
index 0000000..5758e4a
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/profile.role.xml
@@ -0,0 +1,54 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="profile.role">
+<refmeta>
+<refentrytitle>profile.role</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>profile.role</refname>
+<refpurpose>Target profile for <tag class="attribute">role</tag>
+attribute</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="profile.role.frag">
+<xsl:param name="profile.role"></xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The value of this parameter specifies profiles which should be
+included in the output. You can specify multiple profiles by
+separating them by semicolon. You can change separator character by
+<parameter>profile.separator</parameter>
+parameter.</para>
+
+<para>This parameter has effect only when you are using profiling
+stylesheets (<filename>profile-docbook.xsl</filename>,
+<filename>profile-chunk.xsl</filename>, …) instead of normal
+ones (<filename>docbook.xsl</filename>,
+<filename>chunk.xsl</filename>, …).</para>
+
+<warning>
+<para>Note that <tag class="attribute">role</tag> is often
+used for other purposes than profiling. For example it is commonly
+used to get emphasize in bold font:</para>
+
+<programlisting>&lt;emphasis role="bold"&gt;very important&lt;/emphasis&gt;</programlisting>
+
+<para>If you are using <tag class="attribute">role</tag> for
+these purposes do not forget to add values like <literal>bold</literal> to
+value of this parameter. If you forgot you will get document with
+small pieces missing which are very hard to track.</para>
+
+<para>For this reason it is not recommended to use <tag class="attribute">role</tag> attribute for profiling. You should
+rather use profiling specific attributes like <tag class="attribute">userlevel</tag>, <tag class="attribute">os</tag>, <tag class="attribute">arch</tag>, <tag class="attribute">condition</tag>, etc.</para>
+</warning>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/profile.security.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/profile.security.xml
new file mode 100644
index 0000000..8ffca0f
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/profile.security.xml
@@ -0,0 +1,38 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="profile.security">
+<refmeta>
+<refentrytitle>profile.security</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>profile.security</refname>
+<refpurpose>Target profile for <tag class="attribute">security</tag>
+attribute</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="profile.security.frag">
+<xsl:param name="profile.security"></xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The value of this parameter specifies profiles which should be
+included in the output. You can specify multiple profiles by
+separating them by semicolon. You can change separator character by
+<parameter>profile.separator</parameter>
+parameter.</para>
+
+<para>This parameter has effect only when you are using profiling
+stylesheets (<filename>profile-docbook.xsl</filename>,
+<filename>profile-chunk.xsl</filename>, …) instead of normal
+ones (<filename>docbook.xsl</filename>,
+<filename>chunk.xsl</filename>, …).</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/profile.separator.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/profile.separator.xml
new file mode 100644
index 0000000..a4317f5
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/profile.separator.xml
@@ -0,0 +1,27 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="profile.separator">
+<refmeta>
+<refentrytitle>profile.separator</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>profile.separator</refname>
+<refpurpose>Separator character for compound profile values</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="profile.separator.frag">
+<xsl:param name="profile.separator">;</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Separator character used for compound profile values. See <parameter>profile.arch</parameter></para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/profile.status.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/profile.status.xml
new file mode 100644
index 0000000..c9fc469
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/profile.status.xml
@@ -0,0 +1,38 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="profile.status">
+<refmeta>
+<refentrytitle>profile.status</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>profile.status</refname>
+<refpurpose>Target profile for <tag class="attribute">status</tag>
+attribute</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="profile.status.frag">
+<xsl:param name="profile.status"></xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The value of this parameter specifies profiles which should be
+included in the output. You can specify multiple profiles by
+separating them by semicolon. You can change separator character by
+<parameter>profile.separator</parameter>
+parameter.</para>
+
+<para>This parameter has effect only when you are using profiling
+stylesheets (<filename>profile-docbook.xsl</filename>,
+<filename>profile-chunk.xsl</filename>, …) instead of normal
+ones (<filename>docbook.xsl</filename>,
+<filename>chunk.xsl</filename>, …).</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/profile.userlevel.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/profile.userlevel.xml
new file mode 100644
index 0000000..39e263b
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/profile.userlevel.xml
@@ -0,0 +1,38 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="profile.userlevel">
+<refmeta>
+<refentrytitle>profile.userlevel</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>profile.userlevel</refname>
+<refpurpose>Target profile for <tag class="attribute">userlevel</tag>
+attribute</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="profile.userlevel.frag">
+<xsl:param name="profile.userlevel"></xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The value of this parameter specifies profiles which should be
+included in the output. You can specify multiple profiles by
+separating them by semicolon. You can change separator character by
+<parameter>profile.separator</parameter>
+parameter.</para>
+
+<para>This parameter has effect only when you are using profiling
+stylesheets (<filename>profile-docbook.xsl</filename>,
+<filename>profile-chunk.xsl</filename>, …) instead of normal
+ones (<filename>docbook.xsl</filename>,
+<filename>chunk.xsl</filename>, …).</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/profile.value.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/profile.value.xml
new file mode 100644
index 0000000..85f7190
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/profile.value.xml
@@ -0,0 +1,41 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="profile.value">
+<refmeta>
+<refentrytitle>profile.value</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>profile.value</refname>
+<refpurpose>Target profile for user-specified attribute</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="profile.value.frag">
+<xsl:param name="profile.value"></xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>When you are using this parameter you must also specify name of
+profiling attribute with parameter
+<parameter>profile.attribute</parameter>.</para>
+
+<para>The value of this parameter specifies profiles which should be
+included in the output. You can specify multiple profiles by
+separating them by semicolon. You can change separator character by
+<parameter>profile.separator</parameter>
+parameter.</para>
+
+<para>This parameter has effect only when you are using profiling
+stylesheets (<filename>profile-docbook.xsl</filename>,
+<filename>profile-chunk.xsl</filename>, …) instead of normal
+ones (<filename>docbook.xsl</filename>,
+<filename>chunk.xsl</filename>, …).</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/profile.vendor.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/profile.vendor.xml
new file mode 100644
index 0000000..c0187f0
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/profile.vendor.xml
@@ -0,0 +1,38 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="profile.vendor">
+<refmeta>
+<refentrytitle>profile.vendor</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>profile.vendor</refname>
+<refpurpose>Target profile for <tag class="attribute">vendor</tag>
+attribute</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="profile.vendor.frag">
+<xsl:param name="profile.vendor"></xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The value of this parameter specifies profiles which should be
+included in the output. You can specify multiple profiles by
+separating them by semicolon. You can change separator character by
+<parameter>profile.separator</parameter>
+parameter.</para>
+
+<para>This parameter has effect only when you are using profiling
+stylesheets (<filename>profile-docbook.xsl</filename>,
+<filename>profile-chunk.xsl</filename>, …) instead of normal
+ones (<filename>docbook.xsl</filename>,
+<filename>chunk.xsl</filename>, …).</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/profile.wordsize.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/profile.wordsize.xml
new file mode 100644
index 0000000..e30ffc7
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/profile.wordsize.xml
@@ -0,0 +1,38 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="profile.wordsize">
+<refmeta>
+<refentrytitle>profile.wordsize</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>profile.wordsize</refname>
+<refpurpose>Target profile for <tag class="attribute">wordsize</tag>
+attribute</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="profile.wordsize.frag">
+<xsl:param name="profile.wordsize"></xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The value of this parameter specifies profiles which should be
+included in the output. You can specify multiple profiles by
+separating them by semicolon. You can change separator character by
+<parameter>profile.separator</parameter>
+parameter.</para>
+
+<para>This parameter has effect only when you are using profiling
+stylesheets (<filename>profile-docbook.xsl</filename>,
+<filename>profile-chunk.xsl</filename>, …) instead of normal
+ones (<filename>docbook.xsl</filename>,
+<filename>chunk.xsl</filename>, …).</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/punct.honorific.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/punct.honorific.xml
new file mode 100644
index 0000000..7c8a38e
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/punct.honorific.xml
@@ -0,0 +1,28 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="punct.honorific">
+<refmeta>
+<refentrytitle>punct.honorific</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>punct.honorific</refname>
+<refpurpose>Punctuation after an honorific in a personal name.</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="punct.honorific.frag">
+<xsl:param name="punct.honorific">.</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>This parameter specifies the punctuation that should be added after an
+honorific in a personal name.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/qanda.defaultlabel.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/qanda.defaultlabel.xml
new file mode 100644
index 0000000..0b43f0d
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/qanda.defaultlabel.xml
@@ -0,0 +1,86 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="qanda.defaultlabel">
+<refmeta>
+<refentrytitle>qanda.defaultlabel</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">list</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">number</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">qanda</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">none</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>qanda.defaultlabel</refname>
+<refpurpose>Sets the default for defaultlabel on QandASet.</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="qanda.defaultlabel.frag">
+<xsl:param name="qanda.defaultlabel">number</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If no <literal>defaultlabel</literal> attribute is specified on
+a <tag>qandaset</tag>, this value is used. It is generally one of the legal
+values for the defaultlabel attribute (<literal>none</literal>,
+<literal>number</literal> or
+<literal>qanda</literal>), or one of the additional stylesheet-specific values
+(<literal>qnumber</literal> or <literal>qnumberanda</literal>).
+The default value is 'number'.
+</para>
+<para>The values are rendered as follows:</para>
+<variablelist>
+<varlistentry><term><literal>qanda</literal></term>
+<listitem>
+<para><tag>question</tag>s are labeled "Q:" and
+<tag>answer</tag>s are labeled "A:". </para>
+</listitem>
+</varlistentry>
+
+<varlistentry><term><literal>number</literal></term>
+<listitem>
+<para>The questions are enumerated and the answers
+are not labeled. </para>
+</listitem>
+</varlistentry>
+
+<varlistentry><term><literal>qnumber</literal></term>
+<listitem>
+<para>The questions are labeled "Q:" followed by a number, and answers are not
+labeled.
+When sections are numbered, adding a label
+to the number distinguishes the question numbers
+from the section numbers.
+This value is not allowed in the
+<tag class="attribute">defaultlabel</tag> attribute
+of a <tag>qandaset</tag> element.</para>
+</listitem>
+</varlistentry>
+
+<varlistentry><term><literal>qnumberanda</literal></term>
+<listitem>
+<para>The questions are labeled "Q:" followed by a number, and
+the answers are labeled "A:".
+When sections are numbered, adding a label
+to the number distinguishes the question numbers
+from the section numbers.
+This value is not allowed in the
+<tag class="attribute">defaultlabel</tag> attribute
+of a <tag>qandaset</tag> element.</para>
+</listitem>
+</varlistentry>
+
+<varlistentry><term><literal>none</literal></term>
+<listitem>
+<para>No distinguishing label precedes Questions or Answers.
+</para>
+</listitem>
+</varlistentry>
+</variablelist>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/qanda.in.toc.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/qanda.in.toc.xml
new file mode 100644
index 0000000..9597b71
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/qanda.in.toc.xml
@@ -0,0 +1,34 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="qanda.in.toc">
+<refmeta>
+<refentrytitle>qanda.in.toc</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>qanda.in.toc</refname>
+<refpurpose>Should qandaentry questions appear in
+the document table of contents?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="qanda.in.toc.frag"><xsl:param name="qanda.in.toc" select="0"/></src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If true (non-zero), then the generated table of contents
+for a document will include <tag>qandaset</tag> titles,
+<tag>qandadiv</tag> titles,
+and <tag>question</tag> elements. The default value (zero) excludes
+them from the TOC.
+</para>
+<para>This parameter does not affect any tables of contents
+that may be generated inside a qandaset or qandadiv.
+</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/qanda.inherit.numeration.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/qanda.inherit.numeration.xml
new file mode 100644
index 0000000..744c0e8
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/qanda.inherit.numeration.xml
@@ -0,0 +1,30 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="qanda.inherit.numeration">
+<refmeta>
+<refentrytitle>qanda.inherit.numeration</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>qanda.inherit.numeration</refname>
+<refpurpose>Does enumeration of QandASet components inherit the numeration of parent elements?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="qanda.inherit.numeration.frag">
+<xsl:param name="qanda.inherit.numeration" select="1"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, numbered <tag>qandadiv</tag> elements and
+<tag>question</tag> and <tag>answer</tag> inherit the enumeration of
+the ancestors of the <tag>qandaset</tag>.
+</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/qanda.nested.in.toc.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/qanda.nested.in.toc.xml
new file mode 100644
index 0000000..01bdf5a
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/qanda.nested.in.toc.xml
@@ -0,0 +1,29 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="qanda.nested.in.toc">
+<refmeta>
+<refentrytitle>qanda.nested.in.toc</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>qanda.nested.in.toc</refname>
+<refpurpose>Should nested answer/qandaentry instances appear in TOC?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="qanda.nested.in.toc.frag">
+<xsl:param name="qanda.nested.in.toc" select="0"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, instances of <tag>qandaentry</tag>
+that are children of <tag>answer</tag> elements are shown in
+the TOC.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/qanda.title.level1.properties.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/qanda.title.level1.properties.xml
new file mode 100644
index 0000000..edaecc9
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/qanda.title.level1.properties.xml
@@ -0,0 +1,32 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="qanda.title.level1.properties">
+<refmeta>
+<refentrytitle>qanda.title.level1.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>qanda.title.level1.properties</refname>
+<refpurpose>Properties for level-1 qanda set titles</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="qanda.title.level1.properties.frag">
+<xsl:attribute-set name="qanda.title.level1.properties">
+ <xsl:attribute name="font-size">
+ <xsl:value-of select="$body.font.master * 2.0736"/>
+ <xsl:text>pt</xsl:text>
+ </xsl:attribute>
+</xsl:attribute-set>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The properties of level-1 qanda set titles.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/qanda.title.level2.properties.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/qanda.title.level2.properties.xml
new file mode 100644
index 0000000..ca48ca1
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/qanda.title.level2.properties.xml
@@ -0,0 +1,32 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="qanda.title.level2.properties">
+<refmeta>
+<refentrytitle>qanda.title.level2.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>qanda.title.level2.properties</refname>
+<refpurpose>Properties for level-2 qanda set titles</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="qanda.title.level2.properties.frag">
+<xsl:attribute-set name="qanda.title.level2.properties">
+ <xsl:attribute name="font-size">
+ <xsl:value-of select="$body.font.master * 1.728"/>
+ <xsl:text>pt</xsl:text>
+ </xsl:attribute>
+</xsl:attribute-set>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The properties of level-2 qanda set titles.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/qanda.title.level3.properties.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/qanda.title.level3.properties.xml
new file mode 100644
index 0000000..c9c098e
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/qanda.title.level3.properties.xml
@@ -0,0 +1,32 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="qanda.title.level3.properties">
+<refmeta>
+<refentrytitle>qanda.title.level3.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>qanda.title.level3.properties</refname>
+<refpurpose>Properties for level-3 qanda set titles</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="qanda.title.level3.properties.frag">
+<xsl:attribute-set name="qanda.title.level3.properties">
+ <xsl:attribute name="font-size">
+ <xsl:value-of select="$body.font.master * 1.44"/>
+ <xsl:text>pt</xsl:text>
+ </xsl:attribute>
+</xsl:attribute-set>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The properties of level-3 qanda set titles.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/qanda.title.level4.properties.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/qanda.title.level4.properties.xml
new file mode 100644
index 0000000..4344e76
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/qanda.title.level4.properties.xml
@@ -0,0 +1,32 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="qanda.title.level4.properties">
+<refmeta>
+<refentrytitle>qanda.title.level4.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>qanda.title.level4.properties</refname>
+<refpurpose>Properties for level-4 qanda set titles</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="qanda.title.level4.properties.frag">
+<xsl:attribute-set name="qanda.title.level4.properties">
+ <xsl:attribute name="font-size">
+ <xsl:value-of select="$body.font.master * 1.2"/>
+ <xsl:text>pt</xsl:text>
+ </xsl:attribute>
+</xsl:attribute-set>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The properties of level-4 qanda set titles.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/qanda.title.level5.properties.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/qanda.title.level5.properties.xml
new file mode 100644
index 0000000..31b0d20
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/qanda.title.level5.properties.xml
@@ -0,0 +1,32 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="qanda.title.level5.properties">
+<refmeta>
+<refentrytitle>qanda.title.level5.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>qanda.title.level5.properties</refname>
+<refpurpose>Properties for level-5 qanda set titles</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="qanda.title.level5.properties.frag">
+<xsl:attribute-set name="qanda.title.level5.properties">
+ <xsl:attribute name="font-size">
+ <xsl:value-of select="$body.font.master"/>
+ <xsl:text>pt</xsl:text>
+ </xsl:attribute>
+</xsl:attribute-set>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The properties of level-5 qanda set titles.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/qanda.title.level6.properties.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/qanda.title.level6.properties.xml
new file mode 100644
index 0000000..920c7e9
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/qanda.title.level6.properties.xml
@@ -0,0 +1,34 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="qanda.title.level6.properties">
+<refmeta>
+<refentrytitle>qanda.title.level6.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>qanda.title.level6.properties</refname>
+<refpurpose>Properties for level-6 qanda set titles</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="qanda.title.level6.properties.frag">
+<xsl:attribute-set name="qanda.title.level6.properties">
+ <xsl:attribute name="font-size">
+ <xsl:value-of select="$body.font.master"/>
+ <xsl:text>pt</xsl:text>
+ </xsl:attribute>
+</xsl:attribute-set>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The properties of level-6 qanda set titles.
+This property set is actually
+used for all titles below level 5.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/qanda.title.properties.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/qanda.title.properties.xml
new file mode 100644
index 0000000..7c3c2a1
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/qanda.title.properties.xml
@@ -0,0 +1,37 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="qanda.title.properties">
+<refmeta>
+<refentrytitle>qanda.title.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>qanda.title.properties</refname>
+<refpurpose>Properties for qanda set titles</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="qanda.title.properties.frag">
+<xsl:attribute-set name="qanda.title.properties">
+ <xsl:attribute name="font-family">
+ <xsl:value-of select="$title.font.family"/>
+ </xsl:attribute>
+ <xsl:attribute name="font-weight">bold</xsl:attribute>
+ <!-- font size is calculated dynamically by qanda.heading template -->
+ <xsl:attribute name="keep-with-next.within-column">always</xsl:attribute>
+ <xsl:attribute name="space-before.minimum">0.8em</xsl:attribute>
+ <xsl:attribute name="space-before.optimum">1.0em</xsl:attribute>
+ <xsl:attribute name="space-before.maximum">1.2em</xsl:attribute>
+</xsl:attribute-set>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The properties common to all qanda set titles.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/qandadiv.autolabel.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/qandadiv.autolabel.xml
new file mode 100644
index 0000000..596350a
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/qandadiv.autolabel.xml
@@ -0,0 +1,26 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="qandadiv.autolabel">
+<refmeta>
+<refentrytitle>qandadiv.autolabel</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>qandadiv.autolabel</refname>
+<refpurpose>Are divisions in QAndASets enumerated?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="qandadiv.autolabel.frag"><xsl:param name="qandadiv.autolabel" select="1"/></src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, unlabeled qandadivs will be enumerated.
+</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/refclass.suppress.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/refclass.suppress.xml
new file mode 100644
index 0000000..8f9b52a
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/refclass.suppress.xml
@@ -0,0 +1,28 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="refclass.suppress">
+<refmeta>
+<refentrytitle>refclass.suppress</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>refclass.suppress</refname>
+<refpurpose>Suppress display of refclass contents?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="refclass.suppress.frag">
+<xsl:param name="refclass.suppress" select="0"/></src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If the value of <parameter>refclass.suppress</parameter> is
+non-zero, then display of <tag>refclass</tag> contents is
+suppressed in output.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/refentry.date.profile.enabled.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/refentry.date.profile.enabled.xml
new file mode 100644
index 0000000..11de660
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/refentry.date.profile.enabled.xml
@@ -0,0 +1,46 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="refentry.date.profile.enabled">
+<refmeta>
+<refentrytitle>refentry.date.profile.enabled</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>refentry.date.profile.enabled</refname>
+<refpurpose>Enable refentry "date" profiling?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="refentry.date.profile.enabled.frag">
+<xsl:param name="refentry.date.profile.enabled">0</xsl:param></src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If the value of
+<parameter>refentry.date.profile.enabled</parameter> is non-zero, then
+during <tag>refentry</tag> metadata gathering, the info profile
+specified by the customizable
+<parameter>refentry.date.profile</parameter> parameter is used.</para>
+
+<para>If instead the value of
+<parameter>refentry.date.profile.enabled</parameter> is zero (the
+default), then "hard coded" logic within the DocBook XSL stylesheets
+is used for gathering <tag>refentry</tag> "date" data.</para>
+
+<para>If you find that the default <tag>refentry</tag>
+metadata-gathering behavior is causing incorrect "date" data to show
+up in your output, then consider setting a non-zero value for
+<parameter>refentry.date.profile.enabled</parameter> and adjusting the
+value of <parameter>refentry.date.profile</parameter> to cause correct
+data to be gathered. </para>
+
+<para>Note that the terms "source" and "date" have special meanings in
+this context. For details, see the documentation for the
+<parameter>refentry.date.profile</parameter> parameter.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/refentry.date.profile.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/refentry.date.profile.xml
new file mode 100644
index 0000000..1220ed0
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/refentry.date.profile.xml
@@ -0,0 +1,38 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="refentry.date.profile">
+<refmeta>
+<refentrytitle>refentry.date.profile</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>refentry.date.profile</refname>
+<refpurpose>Specifies profile for refentry "date" data</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="refentry.date.profile.frag">
+<xsl:param name="refentry.date.profile">
+ (($info[//date])[last()]/date)[1]|
+ (($info[//pubdate])[last()]/pubdate)[1]
+</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The value of <parameter>refentry.date.profile</parameter> is a
+string representing an XPath expression. It is evaluated at run-time
+and used only if <parameter>refentry.date.profile.enabled</parameter>
+is non-zero. Otherwise, the <tag>refentry</tag> metadata-gathering
+logic "hard coded" into the stylesheets is used.</para>
+
+<para> The <literal>man(7)</literal> man page describes this content
+as "the date of the last revision". In man pages, it is the content
+that is usually displayed in the center footer.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/refentry.generate.name.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/refentry.generate.name.xml
new file mode 100644
index 0000000..f59e6d5
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/refentry.generate.name.xml
@@ -0,0 +1,33 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="refentry.generate.name">
+<refmeta>
+<refentrytitle>refentry.generate.name</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>refentry.generate.name</refname>
+<refpurpose>Output NAME header before <tag>refname</tag>s?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="refentry.generate.name.frag">
+<xsl:param name="refentry.generate.name" select="1"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, a "NAME" section title is output before the list
+of <tag>refname</tag>s. This parameter and
+<parameter>refentry.generate.title</parameter> are mutually
+exclusive. This means that if you change this parameter to zero, you
+should set <parameter>refentry.generate.title</parameter> to non-zero unless
+you want get quite strange output.
+</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/refentry.generate.title.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/refentry.generate.title.xml
new file mode 100644
index 0000000..8029b20
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/refentry.generate.title.xml
@@ -0,0 +1,33 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="refentry.generate.title">
+<refmeta>
+<refentrytitle>refentry.generate.title</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>refentry.generate.title</refname>
+<refpurpose>Output title before <tag>refname</tag>s?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="refentry.generate.title.frag">
+<xsl:param name="refentry.generate.title" select="0"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, the reference page title or first name is
+output before the list of <tag>refname</tag>s. This parameter and
+<parameter>refentry.generate.name</parameter> are mutually exclusive.
+This means that if you change this parameter to non-zero, you
+should set <parameter>refentry.generate.name</parameter> to zero unless
+you want get quite strange output.</para>
+
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/refentry.manual.fallback.profile.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/refentry.manual.fallback.profile.xml
new file mode 100644
index 0000000..6362785
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/refentry.manual.fallback.profile.xml
@@ -0,0 +1,48 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="refentry.manual.fallback.profile">
+<refmeta>
+<refentrytitle>refentry.manual.fallback.profile</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>refentry.manual.fallback.profile</refname>
+<refpurpose>Specifies profile of "fallback" for refentry "manual" data</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="refentry.manual.fallback.profile.frag">
+<xsl:param name="refentry.manual.fallback.profile">
+refmeta/refmiscinfo[not(@class = 'date')][1]/node()</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The value of
+<parameter>refentry.manual.fallback.profile</parameter> is a string
+representing an XPath expression. It is evaluated at run-time and
+used only if no "manual" data can be found by other means (that is,
+either using the <tag>refentry</tag> metadata-gathering logic "hard
+coded" in the stylesheets, or the value of
+<parameter>refentry.manual.profile</parameter>, if it is
+enabled).</para>
+
+<important>
+<para>Depending on which XSLT engine you run, either the EXSLT
+<function>dyn:evaluate</function> extension function (for xsltproc or
+Xalan) or <function>saxon:evaluate</function> extension function (for
+Saxon) are used to dynamically evaluate the value of
+<parameter>refentry.manual.fallback.profile</parameter> at
+run-time. If you don't use xsltproc, Saxon, Xalan -- or some other
+XSLT engine that supports <function>dyn:evaluate</function> -- you
+must manually disable fallback processing by setting an empty value
+for the <parameter>refentry.manual.fallback.profile</parameter>
+parameter.</para>
+</important>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/refentry.manual.profile.enabled.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/refentry.manual.profile.enabled.xml
new file mode 100644
index 0000000..a3b7b54
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/refentry.manual.profile.enabled.xml
@@ -0,0 +1,47 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="refentry.manual.profile.enabled">
+<refmeta>
+<refentrytitle>refentry.manual.profile.enabled</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>refentry.manual.profile.enabled</refname>
+<refpurpose>Enable refentry "manual" profiling?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="refentry.manual.profile.enabled.frag">
+<xsl:param name="refentry.manual.profile.enabled">0</xsl:param></src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If the value of
+<parameter>refentry.manual.profile.enabled</parameter> is
+non-zero, then during <tag>refentry</tag> metadata gathering, the info
+profile specified by the customizable
+<parameter>refentry.manual.profile</parameter> parameter is
+used.</para>
+
+<para>If instead the value of
+<parameter>refentry.manual.profile.enabled</parameter> is zero (the
+default), then "hard coded" logic within the DocBook XSL stylesheets
+is used for gathering <tag>refentry</tag> "manual" data.</para>
+
+<para>If you find that the default <tag>refentry</tag>
+metadata-gathering behavior is causing incorrect "manual" data to show
+up in your output, then consider setting a non-zero value for
+<parameter>refentry.manual.profile.enabled</parameter> and adjusting
+the value of <parameter>refentry.manual.profile</parameter> to cause
+correct data to be gathered. </para>
+
+<para>Note that the term "manual" has a special meanings in this
+context. For details, see the documentation for the
+<parameter>refentry.manual.profile</parameter> parameter.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/refentry.manual.profile.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/refentry.manual.profile.xml
new file mode 100644
index 0000000..214b170
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/refentry.manual.profile.xml
@@ -0,0 +1,72 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="refentry.manual.profile">
+<refmeta>
+<refentrytitle>refentry.manual.profile</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>refentry.manual.profile</refname>
+<refpurpose>Specifies profile for refentry "manual" data</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="refentry.manual.profile.frag">
+<xsl:param name="refentry.manual.profile">
+ (($info[//title])[last()]/title)[1]|
+ ../title/node()
+</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The value of <parameter>refentry.manual.profile</parameter> is
+a string representing an XPath expression. It is evaluated at
+run-time and used only if
+<parameter>refentry.manual.profile.enabled</parameter> is
+non-zero. Otherwise, the <tag>refentry</tag> metadata-gathering logic
+"hard coded" into the stylesheets is used.</para>
+
+<para>In man pages, this content is usually displayed in the middle of
+the header of the page. The <literal>man(7)</literal> man page
+describes this as "the title of the manual (e.g., <citetitle>Linux
+Programmer's Manual</citetitle>)". Here are some examples from
+existing man pages:
+<itemizedlist>
+ <listitem>
+ <para><citetitle>dpkg utilities</citetitle>
+ (<command>dpkg-name</command>)</para>
+ </listitem>
+ <listitem>
+ <para><citetitle>User Contributed Perl Documentation</citetitle>
+ (<command>GET</command>)</para>
+ </listitem>
+ <listitem>
+ <para><citetitle>GNU Development Tools</citetitle>
+ (<command>ld</command>)</para>
+ </listitem>
+ <listitem>
+ <para><citetitle>Emperor Norton Utilities</citetitle>
+ (<command>ddate</command>)</para>
+ </listitem>
+ <listitem>
+ <para><citetitle>Debian GNU/Linux manual</citetitle>
+ (<command>faked</command>)</para>
+ </listitem>
+ <listitem>
+ <para><citetitle>GIMP Manual Pages</citetitle>
+ (<command>gimp</command>)</para>
+ </listitem>
+ <listitem>
+ <para><citetitle>KDOC Documentation System</citetitle>
+ (<command>qt2kdoc</command>)</para>
+ </listitem>
+</itemizedlist>
+</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/refentry.meta.get.quietly.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/refentry.meta.get.quietly.xml
new file mode 100644
index 0000000..0ed29f6
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/refentry.meta.get.quietly.xml
@@ -0,0 +1,37 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="refentry.meta.get.quietly">
+<refmeta>
+<refentrytitle>refentry.meta.get.quietly</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>refentry.meta.get.quietly</refname>
+<refpurpose>Suppress notes and warnings when gathering refentry metadata?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="refentry.meta.get.quietly.frag">
+<xsl:param name="refentry.meta.get.quietly" select="0"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If zero (the default), notes and warnings about “missing†markup
+are generated during gathering of refentry metadata. If non-zero, the
+metadata is gathered “quietly†-- that is, the notes and warnings are
+suppressed.</para>
+
+<tip>
+ <para>If you are processing a large amount of <tag>refentry</tag>
+ content, you may be able to speed up processing significantly by
+ setting a non-zero value for
+ <parameter>refentry.meta.get.quietly</parameter>.</para>
+</tip>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/refentry.pagebreak.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/refentry.pagebreak.xml
new file mode 100644
index 0000000..42b8466
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/refentry.pagebreak.xml
@@ -0,0 +1,33 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="refentry.pagebreak">
+<refmeta>
+<refentrytitle>refentry.pagebreak</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>refentry.pagebreak</refname>
+<refpurpose>Start each refentry on a new page</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="refentry.pagebreak.frag"><xsl:param name="refentry.pagebreak" select="1"/></src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero (the default), each <tag>refentry</tag>
+element will start on a new page. If zero, a page
+break will not be generated between <tag>refentry</tag> elements.
+The exception is when the <tag>refentry</tag> elements are children of
+a <tag>part</tag> element, in which case the page breaks are always
+retained. That is because a <tag>part</tag> element does not generate
+a page-sequence for its children, so each <tag>refentry</tag> must
+start its own page-sequence.
+</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/refentry.separator.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/refentry.separator.xml
new file mode 100644
index 0000000..a7eeb84
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/refentry.separator.xml
@@ -0,0 +1,29 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="refentry.separator">
+<refmeta>
+<refentrytitle>refentry.separator</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>refentry.separator</refname>
+<refpurpose>Generate a separator between consecutive RefEntry elements?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="refentry.separator.frag">
+<xsl:param name="refentry.separator" select="1"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If true, a separator will be generated between consecutive
+reference pages.
+</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/refentry.source.fallback.profile.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/refentry.source.fallback.profile.xml
new file mode 100644
index 0000000..1761378
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/refentry.source.fallback.profile.xml
@@ -0,0 +1,49 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="refentry.source.fallback.profile">
+<refmeta>
+<refentrytitle>refentry.source.fallback.profile</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>refentry.source.fallback.profile</refname>
+<refpurpose>Specifies profile of "fallback" for refentry "source" data</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="refentry.source.fallback.profile.frag">
+<xsl:param name="refentry.source.fallback.profile">
+refmeta/refmiscinfo[not(@class = 'date')][1]/node()</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The value of
+<parameter>refentry.source.fallback.profile</parameter> is a string
+representing an XPath expression. It is evaluated at run-time and used
+only if no "source" data can be found by other means (that is, either
+using the <tag>refentry</tag> metadata-gathering logic "hard coded" in
+the stylesheets, or the value of the
+<parameter>refentry.source.name.profile</parameter> and
+<parameter>refentry.version.profile</parameter> parameters, if those
+are enabled).</para>
+
+<important>
+<para>Depending on which XSLT engine you run, either the EXSLT
+<function>dyn:evaluate</function> extension function (for xsltproc or
+Xalan) or <function>saxon:evaluate</function> extension function (for
+Saxon) are used to dynamically evaluate the value of
+<parameter>refentry.source.fallback.profile</parameter> at
+run-time. If you don't use xsltproc, Saxon, Xalan -- or some other
+XSLT engine that supports <function>dyn:evaluate</function> -- you
+must manually disable fallback processing by setting an empty value
+for the <parameter>refentry.source.fallback.profile</parameter>
+parameter.</para>
+</important>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/refentry.source.name.profile.enabled.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/refentry.source.name.profile.enabled.xml
new file mode 100644
index 0000000..f87ec0f
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/refentry.source.name.profile.enabled.xml
@@ -0,0 +1,48 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="refentry.source.name.profile.enabled">
+<refmeta>
+<refentrytitle>refentry.source.name.profile.enabled</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>refentry.source.name.profile.enabled</refname>
+<refpurpose>Enable refentry "source name" profiling?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="refentry.source.name.profile.enabled.frag">
+<xsl:param name="refentry.source.name.profile.enabled">0</xsl:param></src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If the value of
+<parameter>refentry.source.name.profile.enabled</parameter> is
+non-zero, then during <tag>refentry</tag> metadata gathering, the info
+profile specified by the customizable
+<parameter>refentry.source.name.profile</parameter> parameter is
+used.</para>
+
+<para>If instead the value of
+<parameter>refentry.source.name.profile.enabled</parameter> is zero (the
+default), then "hard coded" logic within the DocBook XSL stylesheets
+is used for gathering <tag>refentry</tag> "source name" data.</para>
+
+<para>If you find that the default <tag>refentry</tag>
+metadata-gathering behavior is causing incorrect "source name" data to
+show up in your output, then consider setting a non-zero value for
+<parameter>refentry.source.name.profile.enabled</parameter> and
+adjusting the value of
+<parameter>refentry.source.name.profile</parameter> to cause correct
+data to be gathered. </para>
+
+<para>Note that the terms "source" and "source name" have special
+meanings in this context. For details, see the documentation for the
+<parameter>refentry.source.name.profile</parameter> parameter.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/refentry.source.name.profile.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/refentry.source.name.profile.xml
new file mode 100644
index 0000000..c9a1012
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/refentry.source.name.profile.xml
@@ -0,0 +1,89 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="refentry.source.name.profile">
+<refmeta>
+<refentrytitle>refentry.source.name.profile</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>refentry.source.name.profile</refname>
+<refpurpose>Specifies profile for refentry "source name" data</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="refentry.source.name.profile.frag">
+<xsl:param name="refentry.source.name.profile">
+ (($info[//productname])[last()]/productname)[1]|
+ (($info[//corpname])[last()]/corpname)[1]|
+ (($info[//corpcredit])[last()]/corpcredit)[1]|
+ (($info[//corpauthor])[last()]/corpauthor)[1]|
+ (($info[//orgname])[last()]/orgname)[1]|
+ (($info[//publishername])[last()]/publishername)[1]
+</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The value of <parameter>refentry.source.name.profile</parameter>
+is a string representing an XPath expression. It is evaluated at
+run-time and used only if
+<parameter>refentry.source.name.profile.enabled</parameter> is
+non-zero. Otherwise, the <tag>refentry</tag> metadata-gathering logic
+"hard coded" into the stylesheets is used.</para>
+
+<para>A "source name" is one part of a (potentially) two-part
+<replaceable>Name</replaceable> <replaceable>Version</replaceable>
+"source" field. In man pages, it is usually displayed in the left
+footer of the page. It typically indicates the software system or
+product that the item documented in the man page belongs to. The
+<literal>man(7)</literal> man page describes it as "the source of
+the command", and provides the following examples:
+<itemizedlist>
+ <listitem>
+ <para>For binaries, use something like: GNU, NET-2, SLS
+ Distribution, MCC Distribution.</para>
+ </listitem>
+ <listitem>
+ <para>For system calls, use the version of the kernel that you
+ are currently looking at: Linux 0.99.11.</para>
+ </listitem>
+ <listitem>
+ <para>For library calls, use the source of the function: GNU, BSD
+ 4.3, Linux DLL 4.4.1.</para>
+ </listitem>
+</itemizedlist>
+</para>
+
+<para>In practice, there are many pages that simply have a Version
+number in the "source" field. So, it looks like what we have is a
+two-part field,
+<replaceable>Name</replaceable> <replaceable>Version</replaceable>,
+where:
+<variablelist>
+ <varlistentry>
+ <term>Name</term>
+ <listitem>
+ <para>product name (e.g., BSD) or org. name (e.g., GNU)</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>Version</term>
+ <listitem>
+ <para>version number</para>
+ </listitem>
+ </varlistentry>
+</variablelist>
+Each part is optional. If the <replaceable>Name</replaceable> is a
+product name, then the <replaceable>Version</replaceable> is probably
+the version of the product. Or there may be no
+<replaceable>Name</replaceable>, in which case, if there is a
+<replaceable>Version</replaceable>, it is probably the version
+of the item itself, not the product it is part of. Or, if the
+<replaceable>Name</replaceable> is an organization name, then there
+probably will be no <replaceable>Version</replaceable>.</para>
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/refentry.source.name.suppress.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/refentry.source.name.suppress.xml
new file mode 100644
index 0000000..b29127e
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/refentry.source.name.suppress.xml
@@ -0,0 +1,42 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="refentry.source.name.suppress">
+<refmeta>
+<refentrytitle>refentry.source.name.suppress</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>refentry.source.name.suppress</refname>
+<refpurpose>Suppress "name" part of refentry "source" contents?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="refentry.source.name.suppress.frag">
+<xsl:param name="refentry.source.name.suppress">0</xsl:param></src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If the value of
+<parameter>refentry.source.name.suppress</parameter> is non-zero, then
+during <tag>refentry</tag> metadata gathering, no "source name" data
+is added to the <tag>refentry</tag> "source" contents. Instead (unless
+<parameter>refentry.version.suppress</parameter> is also non-zero),
+only "version" data is added to the "source" contents.</para>
+
+<para>If you find that the <tag>refentry</tag> metadata gathering
+mechanism is causing unwanted "source name" data to show up in your
+output -- for example, in the footer (or possibly header) of a man
+page -- then you might consider setting a non-zero value for
+<parameter>refentry.source.name.suppress</parameter>.</para>
+
+<para>Note that the terms "source", "source name", and "version" have
+special meanings in this context. For details, see the documentation
+for the <parameter>refentry.source.name.profile</parameter>
+parameter.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/refentry.title.properties.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/refentry.title.properties.xml
new file mode 100644
index 0000000..5bb1f25
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/refentry.title.properties.xml
@@ -0,0 +1,59 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="refentry.title.properties">
+<refmeta>
+<refentrytitle>refentry.title.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>refentry.title.properties</refname>
+<refpurpose>Title properties for a refentry title</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="refentry.title.properties.frag">
+<xsl:attribute-set name="refentry.title.properties">
+ <xsl:attribute name="font-family">
+ <xsl:value-of select="$title.font.family"/>
+ </xsl:attribute>
+ <xsl:attribute name="font-size">18pt</xsl:attribute>
+ <xsl:attribute name="font-weight">bold</xsl:attribute>
+ <xsl:attribute name="space-after">1em</xsl:attribute>
+ <xsl:attribute name="hyphenate">false</xsl:attribute>
+ <xsl:attribute name="keep-with-next.within-column">always</xsl:attribute>
+ <xsl:attribute name="space-before.minimum">0.8em</xsl:attribute>
+ <xsl:attribute name="space-before.optimum">1.0em</xsl:attribute>
+ <xsl:attribute name="space-before.maximum">1.2em</xsl:attribute>
+ <xsl:attribute name="space-after.optimum">0.5em</xsl:attribute>
+ <xsl:attribute name="space-after.minimum">0.4em</xsl:attribute>
+ <xsl:attribute name="space-after.maximum">0.6em</xsl:attribute>
+ <xsl:attribute name="start-indent"><xsl:value-of select="$title.margin.left"/></xsl:attribute>
+</xsl:attribute-set>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Formatting properties applied to the title generated for the
+<tag>refnamediv</tag> part of output for
+<tag>refentry</tag> when the value of the
+<parameter>refentry.generate.title</parameter> parameter is
+non-zero. The font size is supplied by the appropriate <parameter>section.level<replaceable>X</replaceable>.title.properties</parameter>
+attribute-set, computed from the location of the
+<tag>refentry</tag> in the section hierarchy.</para>
+
+<note>
+ <para>This parameter has no effect on the the title generated for
+ the <tag>refnamediv</tag> part of output for
+ <tag>refentry</tag> when the value of the
+ <parameter>refentry.generate.name</parameter> parameter is
+ non-zero. By default, that title is formatted with the same
+ properties as the titles for all other first-level children of
+ <tag>refentry</tag>.</para>
+</note>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/refentry.version.profile.enabled.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/refentry.version.profile.enabled.xml
new file mode 100644
index 0000000..3b95bbe
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/refentry.version.profile.enabled.xml
@@ -0,0 +1,47 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="refentry.version.profile.enabled">
+<refmeta>
+<refentrytitle>refentry.version.profile.enabled</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>refentry.version.profile.enabled</refname>
+<refpurpose>Enable refentry "version" profiling?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="refentry.version.profile.enabled.frag">
+<xsl:param name="refentry.version.profile.enabled">0</xsl:param></src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If the value of
+<parameter>refentry.version.profile.enabled</parameter> is
+non-zero, then during <tag>refentry</tag> metadata gathering, the info
+profile specified by the customizable
+<parameter>refentry.version.profile</parameter> parameter is
+used.</para>
+
+<para>If instead the value of
+<parameter>refentry.version.profile.enabled</parameter> is zero (the
+default), then "hard coded" logic within the DocBook XSL stylesheets
+is used for gathering <tag>refentry</tag> "version" data.</para>
+
+<para>If you find that the default <tag>refentry</tag>
+metadata-gathering behavior is causing incorrect "version" data to show
+up in your output, then consider setting a non-zero value for
+<parameter>refentry.version.profile.enabled</parameter> and adjusting
+the value of <parameter>refentry.version.profile</parameter> to cause
+correct data to be gathered. </para>
+
+<para>Note that the terms "source" and "version" have special
+meanings in this context. For details, see the documentation for the
+<parameter>refentry.version.profile</parameter> parameter.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/refentry.version.profile.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/refentry.version.profile.xml
new file mode 100644
index 0000000..ff85825
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/refentry.version.profile.xml
@@ -0,0 +1,41 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="refentry.version.profile">
+<refmeta>
+<refentrytitle>refentry.version.profile</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>refentry.version.profile</refname>
+<refpurpose>Specifies profile for refentry "version" data</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="refentry.version.profile.frag">
+<xsl:param name="refentry.version.profile">
+ (($info[//productnumber])[last()]/productnumber)[1]|
+ (($info[//edition])[last()]/edition)[1]|
+ (($info[//releaseinfo])[last()]/releaseinfo)[1]
+</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The value of <parameter>refentry.version.profile</parameter> is
+a string representing an XPath expression. It is evaluated at
+run-time and used only if
+<parameter>refentry.version.profile.enabled</parameter> is
+non-zero. Otherwise, the <tag>refentry</tag> metadata-gathering logic
+"hard coded" into the stylesheets is used.</para>
+
+<para>A "source.name" is one part of a (potentially) two-part
+<replaceable>Name</replaceable> <replaceable>Version</replaceable>
+"source" field. For more details, see the documentation for the
+<parameter>refentry.source.name.profile</parameter> parameter.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/refentry.version.suppress.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/refentry.version.suppress.xml
new file mode 100644
index 0000000..b701ad8
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/refentry.version.suppress.xml
@@ -0,0 +1,43 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="refentry.version.suppress">
+<refmeta>
+<refentrytitle>refentry.version.suppress</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>refentry.version.suppress</refname>
+<refpurpose>Suppress "version" part of refentry "source" contents?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="refentry.version.suppress.frag">
+<xsl:param name="refentry.version.suppress">0</xsl:param></src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If the value of <parameter>refentry.version.suppress</parameter>
+is non-zero, then during <tag>refentry</tag> metadata gathering, no
+"version" data is added to the <tag>refentry</tag> "source"
+contents. Instead (unless
+<parameter>refentry.source.name.suppress</parameter> is also
+non-zero), only "source name" data is added to the "source"
+contents.</para>
+
+<para>If you find that the <tag>refentry</tag> metadata gathering
+mechanism is causing unwanted "version" data to show up in your output
+-- for example, in the footer (or possibly header) of a man page --
+then you might consider setting a non-zero value for
+<parameter>refentry.version.suppress</parameter>.</para>
+
+<para>Note that the terms "source", "source name", and "version" have
+special meanings in this context. For details, see the documentation
+for the <parameter>refentry.source.name.profile</parameter>
+parameter.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/refentry.xref.manvolnum.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/refentry.xref.manvolnum.xml
new file mode 100644
index 0000000..56b93b7
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/refentry.xref.manvolnum.xml
@@ -0,0 +1,31 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="refentry.xref.manvolnum">
+<refmeta>
+<refentrytitle>refentry.xref.manvolnum</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>refentry.xref.manvolnum</refname>
+<refpurpose>Output <tag>manvolnum</tag> as part of
+<tag>refentry</tag> cross-reference?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="refentry.xref.manvolnum.frag">
+<xsl:param name="refentry.xref.manvolnum" select="1"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>if non-zero, the <tag>manvolnum</tag> is used when cross-referencing
+<tag>refentry</tag>s, either with <tag>xref</tag>
+or <tag>citerefentry</tag>.
+</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/reference.autolabel.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/reference.autolabel.xml
new file mode 100644
index 0000000..1a9dc5b
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/reference.autolabel.xml
@@ -0,0 +1,67 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="reference.autolabel">
+<refmeta>
+<refentrytitle>reference.autolabel</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">list</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">0<alt>none</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">1<alt>1,2,3...</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">A<alt>A,B,C...</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">a<alt>a,b,c...</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">i<alt>i,ii,iii...</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">I<alt>I,II,III...</alt></refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>reference.autolabel</refname>
+<refpurpose>Specifies the labeling format for Reference titles</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+<src:fragment xml:id="reference.autolabel.frag">
+ <xsl:param name="reference.autolabel">I</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+<para>If non-zero, references will be numbered using the parameter
+ value as the number format if the value matches one of the
+ following:
+</para>
+<variablelist>
+ <varlistentry>
+ <term>1 or arabic</term>
+ <listitem>
+ <para>Arabic numeration (1, 2, 3 ...).</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>A or upperalpha</term>
+ <listitem>
+ <para>Uppercase letter numeration (A, B, C ...).</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>a or loweralpha</term>
+ <listitem>
+ <para>Lowercase letter numeration (a, b, c ...).</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>I or upperroman</term>
+ <listitem>
+ <para>Uppercase roman numeration (I, II, III ...).</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>i or lowerroman</term>
+ <listitem>
+ <para>Lowercase roman letter numeration (i, ii, iii ...).</para>
+ </listitem>
+ </varlistentry>
+</variablelist>
+<para>Any non-zero value other than the above will generate
+the default number format (upperroman).
+</para>
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/region.after.extent.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/region.after.extent.xml
new file mode 100644
index 0000000..b29abba
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/region.after.extent.xml
@@ -0,0 +1,29 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="region.after.extent">
+<refmeta>
+<refentrytitle>region.after.extent</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">length</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>region.after.extent</refname>
+<refpurpose>Specifies the height of the footer.</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="region.after.extent.frag">
+<xsl:param name="region.after.extent">0.4in</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The region after extent is the height of the area where footers
+are printed.
+</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/region.before.extent.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/region.before.extent.xml
new file mode 100644
index 0000000..c62cc40
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/region.before.extent.xml
@@ -0,0 +1,29 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="region.before.extent">
+<refmeta>
+<refentrytitle>region.before.extent</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">length</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>region.before.extent</refname>
+<refpurpose>Specifies the height of the header</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="region.before.extent.frag">
+<xsl:param name="region.before.extent">0.4in</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The region before extent is the height of the area where headers
+are printed.
+</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/revhistory.table.cell.properties.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/revhistory.table.cell.properties.xml
new file mode 100644
index 0000000..49c4037
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/revhistory.table.cell.properties.xml
@@ -0,0 +1,28 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="revhistory.table.cell.properties">
+<refmeta>
+<refentrytitle>revhistory.table.cell.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>revhistory.table.cell.properties</refname>
+<refpurpose>The properties of table cells used for formatting revhistory</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="revhistory.table.cell.properties.frag">
+<xsl:attribute-set name="revhistory.table.cell.properties">
+</xsl:attribute-set>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>This property set defines appearance of individual cells in revhistory table.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/revhistory.table.properties.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/revhistory.table.properties.xml
new file mode 100644
index 0000000..43116d0
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/revhistory.table.properties.xml
@@ -0,0 +1,28 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="revhistory.table.properties">
+<refmeta>
+<refentrytitle>revhistory.table.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>revhistory.table.properties</refname>
+<refpurpose>The properties of table used for formatting revhistory</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="revhistory.table.properties.frag">
+<xsl:attribute-set name="revhistory.table.properties">
+</xsl:attribute-set>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>This property set defines appearance of revhistory table.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/revhistory.title.properties.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/revhistory.title.properties.xml
new file mode 100644
index 0000000..f97d646
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/revhistory.title.properties.xml
@@ -0,0 +1,28 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="revhistory.title.properties">
+<refmeta>
+<refentrytitle>revhistory.title.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>revhistory.title.properties</refname>
+<refpurpose>The properties of revhistory title</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="revhistory.title.properties.frag">
+<xsl:attribute-set name="revhistory.title.properties">
+</xsl:attribute-set>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>This property set defines appearance of revhistory title.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/root.filename.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/root.filename.xml
new file mode 100644
index 0000000..ae5ca5b
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/root.filename.xml
@@ -0,0 +1,29 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="root.filename">
+<refmeta>
+<refentrytitle>root.filename</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">uri</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>root.filename</refname>
+<refpurpose>Identifies the name of the root HTML file when chunking</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="root.filename.frag">
+<xsl:param name="root.filename">index</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The <parameter>root.filename</parameter> is the base filename for
+the chunk created for the root of each document processed.
+</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/root.properties.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/root.properties.xml
new file mode 100644
index 0000000..26c9951
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/root.properties.xml
@@ -0,0 +1,46 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="root.properties">
+<refmeta>
+<refentrytitle>root.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>root.properties</refname>
+<refpurpose>The properties of the fo:root element</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="root.properties.frag">
+<xsl:attribute-set name="root.properties">
+ <xsl:attribute name="font-family">
+ <xsl:value-of select="$body.fontset"/>
+ </xsl:attribute>
+ <xsl:attribute name="font-size">
+ <xsl:value-of select="$body.font.size"/>
+ </xsl:attribute>
+ <xsl:attribute name="text-align">
+ <xsl:value-of select="$alignment"/>
+ </xsl:attribute>
+ <xsl:attribute name="line-height">
+ <xsl:value-of select="$line-height"/>
+ </xsl:attribute>
+ <xsl:attribute name="font-selection-strategy">character-by-character</xsl:attribute>
+ <xsl:attribute name="line-height-shift-adjustment">disregard-shifts</xsl:attribute>
+ <xsl:attribute name="writing-mode">
+ <xsl:value-of select="$direction.mode"/>
+ </xsl:attribute>
+</xsl:attribute-set>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>This property set is used on the <tag>fo:root</tag> element of
+an FO file. It defines a set of default, global parameters.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/rootid.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/rootid.xml
new file mode 100644
index 0000000..a0715af
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/rootid.xml
@@ -0,0 +1,33 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="rootid">
+<refmeta>
+<refentrytitle>rootid</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>rootid</refname>
+<refpurpose>Specify the root element to format</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="rootid.frag">
+<xsl:param name="rootid" ></xsl:param></src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If <parameter>rootid</parameter> is not empty, it must be the
+value of an ID that occurs in the document being formatted. The entire
+document will be loaded and parsed, but formatting will begin at the
+element identified, rather than at the root. For example, this allows
+you to process only <tag>chapter</tag> 4 of a <tag>book</tag>.</para>
+<para>Because the entire document is available to the processor, automatic
+numbering, cross references, and other dependencies are correctly
+resolved.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/runinhead.default.title.end.punct.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/runinhead.default.title.end.punct.xml
new file mode 100644
index 0000000..d151e8b
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/runinhead.default.title.end.punct.xml
@@ -0,0 +1,27 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="runinhead.default.title.end.punct">
+<refmeta>
+<refentrytitle>runinhead.default.title.end.punct</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>runinhead.default.title.end.punct</refname>
+<refpurpose>Default punctuation character on a run-in-head</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="runinhead.default.title.end.punct.frag"><xsl:param name="runinhead.default.title.end.punct">.</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, For a <tag>formalpara</tag>, use the specified
+string as the separator between the title and following text. The period is the default value.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/runinhead.title.end.punct.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/runinhead.title.end.punct.xml
new file mode 100644
index 0000000..025aeed
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/runinhead.title.end.punct.xml
@@ -0,0 +1,32 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="runinhead.title.end.punct">
+<refmeta>
+<refentrytitle>runinhead.title.end.punct</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>runinhead.title.end.punct</refname>
+<refpurpose>Characters that count as punctuation on a run-in-head</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="runinhead.title.end.punct.frag">
+<xsl:param name="runinhead.title.end.punct">.!?:</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specify which characters are to be counted as punctuation. These
+characters are checked for a match with the last character of the
+title. If no match is found, the
+<parameter>runinhead.default.title.end.punct</parameter> contents are
+inserted. This is to avoid duplicated punctuation in the output.
+</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/running.foot.properties.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/running.foot.properties.xml
new file mode 100644
index 0000000..ee98592
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/running.foot.properties.xml
@@ -0,0 +1,34 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="running.foot.properties">
+<refmeta>
+<refentrytitle>running.foot.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>running.foot.properties</refname>
+<refpurpose>Specifies properties for running foot on each slide</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+ <src:fragment xml:id="running.foot.properties.frag">
+ <xsl:attribute-set name="running.foot.properties">
+ <xsl:attribute name="font-family">
+ <xsl:value-of select="$slide.font.family"/>
+ </xsl:attribute>
+ <xsl:attribute name="font-size">14pt</xsl:attribute>
+ <xsl:attribute name="color">#9F9F9F</xsl:attribute>
+ </xsl:attribute-set>
+ </src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>This parameter specifies properties that are applied to the
+running foot area of each slide.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/sans.font.family.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/sans.font.family.xml
new file mode 100644
index 0000000..d569b12
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/sans.font.family.xml
@@ -0,0 +1,29 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="sans.font.family">
+<refmeta>
+<refentrytitle>sans.font.family</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>sans.font.family</refname>
+<refpurpose>The default sans-serif font family</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="sans.font.family.frag">
+<xsl:param name="sans.font.family" >sans-serif</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The default sans-serif font family. At the present, this isn't
+actually used by the stylesheets.
+</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/saxon.callouts.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/saxon.callouts.xml
new file mode 100644
index 0000000..e08fcdb
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/saxon.callouts.xml
@@ -0,0 +1,30 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="saxon.callouts">
+<refmeta>
+<refentrytitle>saxon.callouts</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>saxon.callouts</refname>
+<refpurpose>Enable the callout extension</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="saxon.callouts.frag">
+<xsl:param name="saxon.callouts" select="1"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The callouts extension processes <tag>areaset</tag>
+elements in <tag>ProgramListingCO</tag> and other text-based
+callout elements.
+</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/saxon.character.representation.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/saxon.character.representation.xml
new file mode 100644
index 0000000..bd8bcac
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/saxon.character.representation.xml
@@ -0,0 +1,38 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="saxon.character.representation">
+<refmeta>
+<refentrytitle>saxon.character.representation</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>saxon.character.representation</refname>
+<refpurpose>Saxon character representation used in generated HTML pages</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+ <src:fragment xml:id="saxon.character.representation.frag"><xsl:param name="saxon.character.representation" select="'entity;decimal'"/></src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>This parameter has effect only when Saxon 6 is used (version 6.4.2 or later).
+It sets the character representation in files generated by the chunking stylesheets.
+If you want to suppress entity references for characters with direct representations in
+<parameter>chunker.output.encoding</parameter>, set the parameter value to <literal>native</literal>.
+</para>
+
+<para> For more information, see <link
+role="tcg" xlink:href="OutputEncoding.html#SaxonCharacter">Saxon output character representation</link>.</para>
+
+<note>
+<para>This parameter is documented here, but the declaration is actually
+in the <filename>chunker.xsl</filename> stylesheet module.</para>
+</note>
+
+</refsection>
+
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/saxon.linenumbering.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/saxon.linenumbering.xml
new file mode 100644
index 0000000..451028b
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/saxon.linenumbering.xml
@@ -0,0 +1,32 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="saxon.linenumbering">
+<refmeta>
+<refentrytitle>saxon.linenumbering</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>saxon.linenumbering</refname>
+<refpurpose>Enable the line numbering extension</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="saxon.linenumbering.frag">
+<xsl:param name="saxon.linenumbering" select="1"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, verbatim environments (elements that have the
+format='linespecific' notation attribute: <tag>address</tag>,
+<tag>literallayout</tag>, <tag>programlisting</tag>,
+<tag>screen</tag>, <tag>synopsis</tag>) that specify line numbering
+will have line numbers.
+</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/saxon.tablecolumns.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/saxon.tablecolumns.xml
new file mode 100644
index 0000000..e9d9674
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/saxon.tablecolumns.xml
@@ -0,0 +1,30 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="saxon.tablecolumns">
+<refmeta>
+<refentrytitle>saxon.tablecolumns</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>saxon.tablecolumns</refname>
+<refpurpose>Enable the table columns extension function</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="saxon.tablecolumns.frag">
+<xsl:param name="saxon.tablecolumns" select="1"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The table columns extension function adjusts the widths of table
+columns in the HTML result to more accurately reflect the specifications
+in the CALS table.
+</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/script.dir.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/script.dir.xml
new file mode 100644
index 0000000..9cb92af
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/script.dir.xml
@@ -0,0 +1,33 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="script.dir">
+<refmeta>
+<refentrytitle>script.dir</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">uri</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>script.dir</refname>
+<refpurpose>Script directory</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="script.dir.frag">
+<xsl:param name="script.dir"></xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Identifies the JavaScript source directory for the slides.
+This parameter can be set in the source
+document with the &lt;?dbhtml?&gt; pseudo-attribute
+<literal>script-dir</literal>.</para>
+
+<para>If non-empty, this value is prepended to each of the JavaScript files.
+</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/section.autolabel.max.depth.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/section.autolabel.max.depth.xml
new file mode 100644
index 0000000..e588e00
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/section.autolabel.max.depth.xml
@@ -0,0 +1,32 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="section.autolabel.max.depth">
+<refmeta>
+<refentrytitle>section.autolabel.max.depth</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">integer</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>section.autolabel.max.depth</refname>
+<refpurpose>The deepest level of sections that are numbered.</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="section.autolabel.max.depth.frag">
+<xsl:param name="section.autolabel.max.depth">8</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>When section numbering is turned on by the
+<parameter>section.autolabel</parameter> parameter, then this
+parameter controls the depth of <tag>section</tag> nesting that is
+numbered. Sections nested to a level deeper than this value will not
+be numbered.
+</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/section.autolabel.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/section.autolabel.xml
new file mode 100644
index 0000000..85eede6
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/section.autolabel.xml
@@ -0,0 +1,26 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="section.autolabel">
+<refmeta>
+<refentrytitle>section.autolabel</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>section.autolabel</refname>
+<refpurpose>Are sections enumerated?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="section.autolabel.frag"><xsl:param name="section.autolabel" select="0"/></src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If true (non-zero), unlabeled sections will be enumerated.
+</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/section.container.element.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/section.container.element.xml
new file mode 100644
index 0000000..a6c4059
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/section.container.element.xml
@@ -0,0 +1,62 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="section.container.element">
+<refmeta>
+<refentrytitle>section.container.element</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">list</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">block</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">wrapper</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>section.container.element</refname>
+<refpurpose>Select XSL-FO element name to contain sections</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="section.container.element.frag">
+<xsl:param name="section.container.element">block</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Selects the element name for outer container of
+each section. The choices are <literal>block</literal> (default)
+or <literal>wrapper</literal>.
+The <literal>fo:</literal> namespace prefix is added
+by the stylesheet to form the full element name.
+</para>
+
+<para>This element receives the section <literal>id</literal>
+attribute and the appropriate section level attribute-set.
+</para>
+
+<para>Changing this parameter to <literal>wrapper</literal>
+is only necessary when producing multi-column output
+that contains page-wide spans. Using <literal>fo:wrapper</literal>
+avoids the nesting of <literal>fo:block</literal>
+elements that prevents spans from working (the standard says
+a span must be on a block that is a direct child of
+<literal>fo:flow</literal>).
+</para>
+
+<para>If set to <literal>wrapper</literal>, the
+section attribute-sets only support properties
+that are inheritable. That's because there is no
+block to apply them to. Properties such as
+font-family are inheritable, but properties such as
+border are not.
+</para>
+
+<para>Only some XSL-FO processors need to use this parameter.
+The Antenna House processor, for example, will handle
+spans in nested blocks without changing the element name.
+The RenderX XEP product and FOP follow the XSL-FO standard
+and need to use <literal>wrapper</literal>.
+</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/section.label.includes.component.label.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/section.label.includes.component.label.xml
new file mode 100644
index 0000000..505d472
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/section.label.includes.component.label.xml
@@ -0,0 +1,27 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="section.label.includes.component.label">
+<refmeta>
+<refentrytitle>section.label.includes.component.label</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>section.label.includes.component.label</refname>
+<refpurpose>Do section labels include the component label?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="section.label.includes.component.label.frag"><xsl:param name="section.label.includes.component.label" select="0"/></src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, section labels are prefixed with the label of the
+component that contains them.
+</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/section.level1.properties.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/section.level1.properties.xml
new file mode 100644
index 0000000..4aa70b0
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/section.level1.properties.xml
@@ -0,0 +1,43 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="section.level1.properties">
+<refmeta>
+<refentrytitle>section.level1.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>section.level1.properties</refname>
+<refpurpose>Properties for level-1 sections</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="section.level1.properties.frag">
+<xsl:attribute-set name="section.level1.properties" use-attribute-sets="section.properties">
+</xsl:attribute-set>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The properties that apply to the containing
+block of a level-1 section, and therefore apply to
+the whole section. This includes <tag>sect1</tag>
+elements and <tag>section</tag> elements at level 1.
+</para>
+
+<para>For example, you could start each level-1 section on
+a new page by using:</para>
+<programlisting>&lt;xsl:attribute-set name="section.level1.properties"&gt;
+ &lt;xsl:attribute name="break-before"&gt;page&lt;/xsl:attribute&gt;
+&lt;/xsl:attribute-set&gt;
+</programlisting>
+
+<para>This attribute set inherits attributes from the
+general <tag>section.properties</tag> attribute set.
+</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/section.level2.properties.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/section.level2.properties.xml
new file mode 100644
index 0000000..5dd76e9
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/section.level2.properties.xml
@@ -0,0 +1,43 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="section.level2.properties">
+<refmeta>
+<refentrytitle>section.level2.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>section.level2.properties</refname>
+<refpurpose>Properties for level-2 sections</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="section.level2.properties.frag">
+<xsl:attribute-set name="section.level2.properties" use-attribute-sets="section.properties">
+</xsl:attribute-set>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The properties that apply to the containing
+block of a level-2 section, and therefore apply to
+the whole section. This includes <tag>sect2</tag>
+elements and <tag>section</tag> elements at level 2.
+</para>
+
+<para>For example, you could start each level-2 section on
+a new page by using:</para>
+<programlisting>&lt;xsl:attribute-set name="section.level2.properties"&gt;
+ &lt;xsl:attribute name="break-before"&gt;page&lt;/xsl:attribute&gt;
+&lt;/xsl:attribute-set&gt;
+</programlisting>
+
+<para>This attribute set inherits attributes from the
+general <tag>section.properties</tag> attribute set.
+</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/section.level3.properties.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/section.level3.properties.xml
new file mode 100644
index 0000000..0bcd696
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/section.level3.properties.xml
@@ -0,0 +1,43 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="section.level3.properties">
+<refmeta>
+<refentrytitle>section.level3.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>section.level3.properties</refname>
+<refpurpose>Properties for level-3 sections</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="section.level3.properties.frag">
+<xsl:attribute-set name="section.level3.properties" use-attribute-sets="section.properties">
+</xsl:attribute-set>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The properties that apply to the containing
+block of a level-3 section, and therefore apply to
+the whole section. This includes <tag>sect3</tag>
+elements and <tag>section</tag> elements at level 3.
+</para>
+
+<para>For example, you could start each level-3 section on
+a new page by using:</para>
+<programlisting>&lt;xsl:attribute-set name="section.level3.properties"&gt;
+ &lt;xsl:attribute name="break-before"&gt;page&lt;/xsl:attribute&gt;
+&lt;/xsl:attribute-set&gt;
+</programlisting>
+
+<para>This attribute set inherits attributes from the
+general <tag>section.properties</tag> attribute set.
+</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/section.level4.properties.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/section.level4.properties.xml
new file mode 100644
index 0000000..1408851
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/section.level4.properties.xml
@@ -0,0 +1,43 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="section.level4.properties">
+<refmeta>
+<refentrytitle>section.level4.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>section.level4.properties</refname>
+<refpurpose>Properties for level-4 sections</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="section.level4.properties.frag">
+<xsl:attribute-set name="section.level4.properties" use-attribute-sets="section.properties">
+</xsl:attribute-set>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The properties that apply to the containing
+block of a level-4 section, and therefore apply to
+the whole section. This includes <tag>sect4</tag>
+elements and <tag>section</tag> elements at level 4.
+</para>
+
+<para>For example, you could start each level-4 section on
+a new page by using:</para>
+<programlisting>&lt;xsl:attribute-set name="section.level4.properties"&gt;
+ &lt;xsl:attribute name="break-before"&gt;page&lt;/xsl:attribute&gt;
+&lt;/xsl:attribute-set&gt;
+</programlisting>
+
+<para>This attribute set inherits attributes from the
+general <tag>section.properties</tag> attribute set.
+</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/section.level5.properties.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/section.level5.properties.xml
new file mode 100644
index 0000000..9093b94
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/section.level5.properties.xml
@@ -0,0 +1,43 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="section.level5.properties">
+<refmeta>
+<refentrytitle>section.level5.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>section.level5.properties</refname>
+<refpurpose>Properties for level-5 sections</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="section.level5.properties.frag">
+<xsl:attribute-set name="section.level5.properties" use-attribute-sets="section.properties">
+</xsl:attribute-set>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The properties that apply to the containing
+block of a level-5 section, and therefore apply to
+the whole section. This includes <tag>sect5</tag>
+elements and <tag>section</tag> elements at level 5.
+</para>
+
+<para>For example, you could start each level-5 section on
+a new page by using:</para>
+<programlisting>&lt;xsl:attribute-set name="section.level5.properties"&gt;
+ &lt;xsl:attribute name="break-before"&gt;page&lt;/xsl:attribute&gt;
+&lt;/xsl:attribute-set&gt;
+</programlisting>
+
+<para>This attribute set inherits attributes from the
+general <tag>section.properties</tag> attribute set.
+</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/section.level6.properties.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/section.level6.properties.xml
new file mode 100644
index 0000000..dda7937
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/section.level6.properties.xml
@@ -0,0 +1,43 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="section.level6.properties">
+<refmeta>
+<refentrytitle>section.level6.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>section.level6.properties</refname>
+<refpurpose>Properties for level-6 sections</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="section.level6.properties.frag">
+<xsl:attribute-set name="section.level6.properties" use-attribute-sets="section.properties">
+</xsl:attribute-set>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The properties that apply to the containing
+block of a level 6 or lower section, and therefore apply to
+the whole section. This includes
+<tag>section</tag> elements at level 6 and lower.
+</para>
+
+<para>For example, you could start each level-6 section on
+a new page by using:</para>
+<programlisting>&lt;xsl:attribute-set name="section.level6.properties"&gt;
+ &lt;xsl:attribute name="break-before"&gt;page&lt;/xsl:attribute&gt;
+&lt;/xsl:attribute-set&gt;
+</programlisting>
+
+<para>This attribute set inherits attributes from the
+general <tag>section.properties</tag> attribute set.
+</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/section.properties.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/section.properties.xml
new file mode 100644
index 0000000..06acc31
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/section.properties.xml
@@ -0,0 +1,35 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="section.properties">
+<refmeta>
+<refentrytitle>section.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>section.properties</refname>
+<refpurpose>Properties for all section levels</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="section.properties.frag">
+<xsl:attribute-set name="section.properties">
+</xsl:attribute-set>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The properties that apply to the containing
+block of all section levels, and therefore apply to
+the whole section.
+This attribute set is inherited by the
+more specific attribute sets such as
+<tag>section.level1.properties</tag>.
+The default is empty.
+</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/section.title.level1.properties.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/section.title.level1.properties.xml
new file mode 100644
index 0000000..91c63ed
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/section.title.level1.properties.xml
@@ -0,0 +1,32 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="section.title.level1.properties">
+<refmeta>
+<refentrytitle>section.title.level1.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>section.title.level1.properties</refname>
+<refpurpose>Properties for level-1 section titles</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="section.title.level1.properties.frag">
+<xsl:attribute-set name="section.title.level1.properties">
+ <xsl:attribute name="font-size">
+ <xsl:value-of select="$body.font.master * 2.0736"/>
+ <xsl:text>pt</xsl:text>
+ </xsl:attribute>
+</xsl:attribute-set>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The properties of level-1 section titles.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/section.title.level2.properties.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/section.title.level2.properties.xml
new file mode 100644
index 0000000..a25648a
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/section.title.level2.properties.xml
@@ -0,0 +1,33 @@
+
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="section.title.level2.properties">
+<refmeta>
+<refentrytitle>section.title.level2.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>section.title.level2.properties</refname>
+<refpurpose>Properties for level-2 section titles</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="section.title.level2.properties.frag">
+<xsl:attribute-set name="section.title.level2.properties">
+ <xsl:attribute name="font-size">
+ <xsl:value-of select="$body.font.master * 1.728"/>
+ <xsl:text>pt</xsl:text>
+ </xsl:attribute>
+</xsl:attribute-set>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The properties of level-2 section titles.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/section.title.level3.properties.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/section.title.level3.properties.xml
new file mode 100644
index 0000000..a009a6e
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/section.title.level3.properties.xml
@@ -0,0 +1,32 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="section.title.level3.properties">
+<refmeta>
+<refentrytitle>section.title.level3.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>section.title.level3.properties</refname>
+<refpurpose>Properties for level-3 section titles</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="section.title.level3.properties.frag">
+<xsl:attribute-set name="section.title.level3.properties">
+ <xsl:attribute name="font-size">
+ <xsl:value-of select="$body.font.master * 1.44"/>
+ <xsl:text>pt</xsl:text>
+ </xsl:attribute>
+</xsl:attribute-set>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The properties of level-3 section titles.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/section.title.level4.properties.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/section.title.level4.properties.xml
new file mode 100644
index 0000000..00d4398
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/section.title.level4.properties.xml
@@ -0,0 +1,32 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="section.title.level4.properties">
+<refmeta>
+<refentrytitle>section.title.level4.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>section.title.level4.properties</refname>
+<refpurpose>Properties for level-4 section titles</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="section.title.level4.properties.frag">
+<xsl:attribute-set name="section.title.level4.properties">
+ <xsl:attribute name="font-size">
+ <xsl:value-of select="$body.font.master * 1.2"/>
+ <xsl:text>pt</xsl:text>
+ </xsl:attribute>
+</xsl:attribute-set>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The properties of level-4 section titles.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/section.title.level5.properties.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/section.title.level5.properties.xml
new file mode 100644
index 0000000..c25b5ef
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/section.title.level5.properties.xml
@@ -0,0 +1,32 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="section.title.level5.properties">
+<refmeta>
+<refentrytitle>section.title.level5.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>section.title.level5.properties</refname>
+<refpurpose>Properties for level-5 section titles</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="section.title.level5.properties.frag">
+<xsl:attribute-set name="section.title.level5.properties">
+ <xsl:attribute name="font-size">
+ <xsl:value-of select="$body.font.master"/>
+ <xsl:text>pt</xsl:text>
+ </xsl:attribute>
+</xsl:attribute-set>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The properties of level-5 section titles.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/section.title.level6.properties.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/section.title.level6.properties.xml
new file mode 100644
index 0000000..a2a0feb
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/section.title.level6.properties.xml
@@ -0,0 +1,33 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="section.title.level6.properties">
+<refmeta>
+<refentrytitle>section.title.level6.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>section.title.level6.properties</refname>
+<refpurpose>Properties for level-6 section titles</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="section.title.level6.properties.frag">
+<xsl:attribute-set name="section.title.level6.properties">
+ <xsl:attribute name="font-size">
+ <xsl:value-of select="$body.font.master"/>
+ <xsl:text>pt</xsl:text>
+ </xsl:attribute>
+</xsl:attribute-set>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The properties of level-6 section titles. This property set is actually
+used for all titles below level 5.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/section.title.properties.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/section.title.properties.xml
new file mode 100644
index 0000000..ab849af
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/section.title.properties.xml
@@ -0,0 +1,39 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="section.title.properties">
+<refmeta>
+<refentrytitle>section.title.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>section.title.properties</refname>
+<refpurpose>Properties for section titles</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="section.title.properties.frag">
+<xsl:attribute-set name="section.title.properties">
+ <xsl:attribute name="font-family">
+ <xsl:value-of select="$title.font.family"/>
+ </xsl:attribute>
+ <xsl:attribute name="font-weight">bold</xsl:attribute>
+ <!-- font size is calculated dynamically by section.heading template -->
+ <xsl:attribute name="keep-with-next.within-column">always</xsl:attribute>
+ <xsl:attribute name="space-before.minimum">0.8em</xsl:attribute>
+ <xsl:attribute name="space-before.optimum">1.0em</xsl:attribute>
+ <xsl:attribute name="space-before.maximum">1.2em</xsl:attribute>
+ <xsl:attribute name="text-align">start</xsl:attribute>
+ <xsl:attribute name="start-indent"><xsl:value-of select="$title.margin.left"/></xsl:attribute>
+</xsl:attribute-set>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The properties common to all section titles.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/segmentedlist.as.table.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/segmentedlist.as.table.xml
new file mode 100644
index 0000000..fb2c236
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/segmentedlist.as.table.xml
@@ -0,0 +1,28 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="segmentedlist.as.table">
+<refmeta>
+<refentrytitle>segmentedlist.as.table</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>segmentedlist.as.table</refname>
+<refpurpose>Format segmented lists as tables?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="segmentedlist.as.table.frag">
+<xsl:param name="segmentedlist.as.table" select="0"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, <tag>segmentedlist</tag>s will be formatted as
+tables.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/sequential.links.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/sequential.links.xml
new file mode 100644
index 0000000..293827d
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/sequential.links.xml
@@ -0,0 +1,25 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="sequential.links">
+<refmeta>
+<refentrytitle>sequential.links</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>sequential.links</refname>
+<refpurpose>Make sequentional links?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="sequential.links.frag">
+<xsl:param name="sequential.links" select="0"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+<para>FIXME</para>
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/shade.verbatim.style.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/shade.verbatim.style.xml
new file mode 100644
index 0000000..0907806
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/shade.verbatim.style.xml
@@ -0,0 +1,36 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="shade.verbatim.style">
+<refmeta>
+<refentrytitle>shade.verbatim.style</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>shade.verbatim.style</refname>
+<refpurpose>Properties that specify the style of shaded verbatim listings</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="shade.verbatim.style.frag">
+<xsl:attribute-set condition="html" name="shade.verbatim.style">
+ <xsl:attribute name="border">0</xsl:attribute>
+ <xsl:attribute name="bgcolor">#E0E0E0</xsl:attribute>
+</xsl:attribute-set>
+<xsl:attribute-set condition="fo" name="shade.verbatim.style">
+ <xsl:attribute name="background-color">#E0E0E0</xsl:attribute>
+</xsl:attribute-set>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Properties that specify the style of shaded verbatim listings. The
+parameters specified (the border and background color) are added to
+the styling of the xsl-fo output. A border might be specified as "thin
+black solid" for example. See <link xlink:href="http://www.w3.org/TR/2004/WD-xsl11-20041216/#border">xsl-fo</link></para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/shade.verbatim.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/shade.verbatim.xml
new file mode 100644
index 0000000..82a7216
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/shade.verbatim.xml
@@ -0,0 +1,30 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="shade.verbatim">
+<refmeta>
+<refentrytitle>shade.verbatim</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>shade.verbatim</refname>
+<refpurpose>Should verbatim environments be shaded?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="shade.verbatim.frag"><xsl:param name="shade.verbatim" select="0"/></src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>In the FO stylesheet, if this parameter is non-zero then the
+<property>shade.verbatim.style</property> properties will be applied
+to verbatim environments.</para>
+
+<para>In the HTML stylesheet, this parameter is now deprecated. Use
+CSS instead.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/show.comments.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/show.comments.xml
new file mode 100644
index 0000000..ac7bc24
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/show.comments.xml
@@ -0,0 +1,32 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="show.comments">
+<refmeta>
+<refentrytitle>show.comments</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>show.comments</refname>
+<refpurpose>Display <tag>remark</tag> elements?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="show.comments.frag">
+<xsl:param name="show.comments" select="1"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, comments will be displayed, otherwise they
+are suppressed. Comments here refers to the <tag>remark</tag> element
+(which was called <literal>comment</literal> prior to DocBook
+4.0), not XML comments (&lt;-- like this --&gt;) which are
+unavailable.
+</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/show.foil.number.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/show.foil.number.xml
new file mode 100644
index 0000000..627c6a7
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/show.foil.number.xml
@@ -0,0 +1,28 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="show.foil.number">
+<refmeta>
+<refentrytitle>show.foil.number</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>show.foil.number</refname>
+<refpurpose>Show foil number on each foil?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="show.foil.number.frag">
+<xsl:param name="show.foil.number" select="0"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, on each slide there will be its number. Currently
+not supported in all output formats.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/show.revisionflag.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/show.revisionflag.xml
new file mode 100644
index 0000000..c589b01
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/show.revisionflag.xml
@@ -0,0 +1,42 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="show.revisionflag">
+<refmeta>
+<refentrytitle>show.revisionflag</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>show.revisionflag</refname>
+<refpurpose>Enable decoration of elements that have a revisionflag</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="show.revisionflag.frag">
+<xsl:param name="show.revisionflag" select="0"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>
+If <parameter>show.revisionflag</parameter> is turned on, then the stylesheets
+may produce additional markup designed to allow a CSS stylesheet to
+highlight elements that have specific revisionflag settings.</para>
+
+<para>The markup inserted will be usually be either a &lt;span&gt; or
+&lt;div&gt; with an appropriate <literal>class</literal>
+attribute. (The value of the class attribute will be the same as the
+value of the revisionflag attribute). In some contexts, for example
+tables, where extra markup would be structurally illegal, the class
+attribute will be added to the appropriate container element.</para>
+
+<para>In general, the stylesheets only test for revisionflag in contexts
+where an importing stylesheet would have to redefine whole templates.
+Most of the revisionflag processing is expected to be done by another
+stylesheet, for example <filename>changebars.xsl</filename>.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/showtoc.image.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/showtoc.image.xml
new file mode 100644
index 0000000..7b1fca3
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/showtoc.image.xml
@@ -0,0 +1,29 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="showtoc.image">
+<refmeta>
+<refentrytitle>showtoc.image</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">filename</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>showtoc.image</refname>
+<refpurpose>Show ToC image</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="showtoc.image.frag">
+<xsl:param name="showtoc.image">showtoc.gif</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies the filename of the <quote>show ToC</quote> image. This is used
+when the <link linkend="toc.hide.show">ToC hide/show</link> parameter is
+enabled.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/side.float.properties.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/side.float.properties.xml
new file mode 100644
index 0000000..0a6d904
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/side.float.properties.xml
@@ -0,0 +1,50 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="side.float.properties">
+<refmeta>
+<refentrytitle>side.float.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>side.float.properties</refname>
+<refpurpose>Attribute set for side float container properties</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="side.float.properties.frag">
+<xsl:attribute-set name="side.float.properties">
+ <xsl:attribute name="width">2in</xsl:attribute>
+ <xsl:attribute name="padding-start">4pt</xsl:attribute>
+ <xsl:attribute name="padding-end">4pt</xsl:attribute>
+ <xsl:attribute name="padding-top">2pt</xsl:attribute>
+ <xsl:attribute name="padding-bottom">2pt</xsl:attribute>
+ <xsl:attribute name="margin-{$direction.align.start}">0pt</xsl:attribute>
+ <xsl:attribute name="margin-{$direction.align.end}">0pt</xsl:attribute>
+ <xsl:attribute name="text-align">start</xsl:attribute>
+</xsl:attribute-set>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Properties that are applied to the
+<tag class="element">fo:block-container</tag> inside of
+a side float that is generated by the template named
+<literal>floater</literal>.
+That template generates a side float
+when the <parameter>side.float.type</parameter> is set to one
+of the values for a side float.</para>
+
+<para>If you do only <literal>left</literal> or
+<literal>start</literal> side floats, you may want to set the
+<literal>padding-start</literal> attribute to zero.
+If you do only <literal>right</literal> or
+<literal>end</literal> side floats, you may want to set the
+<literal>padding-end</literal> attribute to zero.
+</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/sidebar.float.type.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/sidebar.float.type.xml
new file mode 100644
index 0000000..8c6a286
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/sidebar.float.type.xml
@@ -0,0 +1,90 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="sidebar.float.type">
+<refmeta>
+<refentrytitle>sidebar.float.type</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">list</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">none</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">before</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">left</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">start</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">right</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">end</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">inside</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">outside</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>sidebar.float.type</refname>
+<refpurpose>Select type of float for sidebar elements</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="sidebar.float.type.frag">
+<xsl:param name="sidebar.float.type">none</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Selects the type of float for sidebar elements.
+</para>
+<itemizedlist>
+<listitem>
+<para>If <parameter>sidebar.float.type</parameter> is
+<quote><literal>none</literal></quote>, then
+no float is used.
+</para>
+</listitem>
+<listitem>
+<para>If <parameter>sidebar.float.type</parameter> is
+<quote><literal>before</literal></quote>, then
+the float appears at the top of the page. On some processors,
+that may be the next page rather than the current page.
+</para>
+</listitem>
+
+<listitem>
+<para>If <parameter>sidebar.float.type</parameter> is
+<quote><literal>left</literal></quote>,
+then a left side float is used.
+</para>
+</listitem>
+
+<listitem>
+<para>If <parameter>sidebar.float.type</parameter> is
+<quote><literal>start</literal></quote>,
+then when the text direction is left-to-right a left side float is used.
+When the text direction is right-to-left, a right side float is used.
+</para>
+</listitem>
+
+<listitem>
+<para>If <parameter>sidebar.float.type</parameter> is
+<quote><literal>right</literal></quote>,
+then a right side float is used.
+</para>
+</listitem>
+
+<listitem>
+<para>If <parameter>sidebar.float.type</parameter> is
+<quote><literal>end</literal></quote>,
+then when the text direction is left-to-right a right side float is used.
+When the text direction is right-to-left, a left side float is used.
+</para>
+</listitem>
+
+<listitem>
+<para>If your XSL-FO processor supports floats positioned on the
+<quote><literal>inside</literal></quote> or
+<quote><literal>outside</literal></quote>
+of double-sided pages, then you have those two
+options for side floats as well.
+</para>
+</listitem>
+</itemizedlist>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/sidebar.float.width.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/sidebar.float.width.xml
new file mode 100644
index 0000000..cb989e4
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/sidebar.float.width.xml
@@ -0,0 +1,35 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="sidebar.float.width">
+<refmeta>
+<refentrytitle>sidebar.float.width</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">length</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>sidebar.float.width</refname>
+<refpurpose>Set the default width for sidebars</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="sidebar.float.width.frag">
+<xsl:param name="sidebar.float.width">1in</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Sets the default width for sidebars when used as a side float.
+The width determines the degree to which the sidebar block intrudes into
+the text area.
+</para>
+<para>If <parameter>sidebar.float.type</parameter> is
+<quote><literal>before</literal></quote> or
+<quote><literal>none</literal></quote>, then
+this parameter is ignored.
+</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/sidebar.properties.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/sidebar.properties.xml
new file mode 100644
index 0000000..fc98ac0
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/sidebar.properties.xml
@@ -0,0 +1,42 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="sidebar.properties">
+<refmeta>
+<refentrytitle>sidebar.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>sidebar.properties</refname>
+<refpurpose>Attribute set for sidebar properties</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="sidebar.properties.frag">
+<xsl:attribute-set name="sidebar.properties" use-attribute-sets="formal.object.properties">
+ <xsl:attribute name="border-style">solid</xsl:attribute>
+ <xsl:attribute name="border-width">1pt</xsl:attribute>
+ <xsl:attribute name="border-color">black</xsl:attribute>
+ <xsl:attribute name="background-color">#DDDDDD</xsl:attribute>
+ <xsl:attribute name="padding-start">12pt</xsl:attribute>
+ <xsl:attribute name="padding-end">12pt</xsl:attribute>
+ <xsl:attribute name="padding-top">6pt</xsl:attribute>
+ <xsl:attribute name="padding-bottom">6pt</xsl:attribute>
+ <xsl:attribute name="margin-{$direction.align.start}">0pt</xsl:attribute>
+ <xsl:attribute name="margin-{$direction.align.end}">0pt</xsl:attribute>
+<!--
+ <xsl:attribute name="margin-top">6pt</xsl:attribute>
+ <xsl:attribute name="margin-bottom">6pt</xsl:attribute>
+-->
+</xsl:attribute-set>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The styling for sidebars.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/sidebar.title.properties.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/sidebar.title.properties.xml
new file mode 100644
index 0000000..f1b1d51
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/sidebar.title.properties.xml
@@ -0,0 +1,32 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="sidebar.title.properties">
+<refmeta>
+<refentrytitle>sidebar.title.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>sidebar.title.properties</refname>
+<refpurpose>Attribute set for sidebar titles</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="sidebar.title.properties.frag">
+<xsl:attribute-set name="sidebar.title.properties">
+ <xsl:attribute name="font-weight">bold</xsl:attribute>
+ <xsl:attribute name="hyphenate">false</xsl:attribute>
+ <xsl:attribute name="text-align">start</xsl:attribute>
+ <xsl:attribute name="keep-with-next.within-column">always</xsl:attribute>
+</xsl:attribute-set>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The styling for sidebars titles.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/simplesect.in.toc.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/simplesect.in.toc.xml
new file mode 100644
index 0000000..9bc3ab5
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/simplesect.in.toc.xml
@@ -0,0 +1,26 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="simplesect.in.toc">
+<refmeta>
+<refentrytitle>simplesect.in.toc</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>simplesect.in.toc</refname>
+<refpurpose>Should <tag>simplesect</tag> elements appear in the TOC?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="simplesect.in.toc.frag"><xsl:param name="simplesect.in.toc" select="0"/></src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, <tag>simplesect</tag>s will be included in the TOC.
+</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/slide.font.family.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/slide.font.family.xml
new file mode 100644
index 0000000..e1c7541
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/slide.font.family.xml
@@ -0,0 +1,31 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="slide.font.family">
+<refmeta>
+<refentrytitle>slide.font.family</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">list</refmiscinfo>
+<refmiscinfo class="other" otherclass="list-type">open</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">serif</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">sans-serif</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">monospace</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>slide.font.family</refname>
+<refpurpose>Specifies font family to use for slide bodies</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="slide.font.family.frag">
+<xsl:param name="slide.font.family" >Helvetica</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies the font family to use for slides bodies.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/slide.title.font.family.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/slide.title.font.family.xml
new file mode 100644
index 0000000..a5a3a88
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/slide.title.font.family.xml
@@ -0,0 +1,31 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="slide.title.font.family">
+<refmeta>
+<refentrytitle>slide.title.font.family</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">list</refmiscinfo>
+<refmiscinfo class="other" otherclass="list-type">open</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">serif</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">sans-serif</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">monospace</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>slide.title.font.family</refname>
+<refpurpose>Specifies font family to use for slide titles</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="slide.title.font.family.frag">
+<xsl:param name="slide.title.font.family">Helvetica</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies the font family to use for slides titles.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/slides.js.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/slides.js.xml
new file mode 100644
index 0000000..90fffae
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/slides.js.xml
@@ -0,0 +1,28 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="slides.js">
+<refmeta>
+<refentrytitle>slides.js</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">filename</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>slides.js</refname>
+<refpurpose>Slides overlay file</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="slides.js.frag">
+<xsl:param name="slides.js" >slides.js</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies the filename of the slides JavaScript file. It's unlikely
+that you will ever need to change this parameter.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/slides.properties.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/slides.properties.xml
new file mode 100644
index 0000000..daca82c
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/slides.properties.xml
@@ -0,0 +1,31 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="slides.properties">
+<refmeta>
+<refentrytitle>slides.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>slides.properties</refname>
+<refpurpose>Specifies properties for all slides</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+ <src:fragment xml:id="slides.properties.frag">
+ <xsl:attribute-set name="slides.properties">
+ <xsl:attribute name="font-family">
+ <xsl:value-of select="$slide.font.family"/>
+ </xsl:attribute>
+ </xsl:attribute-set>
+ </src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>This parameter specifies properties that are applied to all slides.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/spacing.paras.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/spacing.paras.xml
new file mode 100644
index 0000000..2f2323a
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/spacing.paras.xml
@@ -0,0 +1,30 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="spacing.paras">
+<refmeta>
+<refentrytitle>spacing.paras</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>spacing.paras</refname>
+<refpurpose>Insert additional &lt;p&gt; elements for spacing?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="spacing.paras.frag">
+<xsl:param name="spacing.paras" select="0"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>When non-zero, additional, empty paragraphs are inserted in
+several contexts (for example, around informal figures), to create a
+more pleasing visual appearance in many browsers.
+</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/speakernote.properties.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/speakernote.properties.xml
new file mode 100644
index 0000000..089115a
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/speakernote.properties.xml
@@ -0,0 +1,32 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="speakernote.properties">
+<refmeta>
+<refentrytitle>speakernote.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>speakernote.properties</refname>
+<refpurpose>Specifies properties for all speakernotes</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+ <src:fragment xml:id="speakernote.properties.frag">
+ <xsl:attribute-set name="speakernote.properties">
+ <xsl:attribute name="font-family">Times Roman</xsl:attribute>
+ <xsl:attribute name="font-style">italic</xsl:attribute>
+ <xsl:attribute name="font-size">12pt</xsl:attribute>
+ <xsl:attribute name="font-weight">normal</xsl:attribute>
+ </xsl:attribute-set>
+ </src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>This parameter specifies properties that are applied to all speakernotes.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/subscript.properties.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/subscript.properties.xml
new file mode 100644
index 0000000..d2c7711
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/subscript.properties.xml
@@ -0,0 +1,29 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="subscript.properties">
+<refmeta>
+<refentrytitle>subscript.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>subscript.properties</refname>
+<refpurpose>Properties associated with subscripts</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="subscript.properties.frag">
+<xsl:attribute-set name="subscript.properties">
+ <xsl:attribute name="font-size">75%</xsl:attribute>
+</xsl:attribute-set>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies styling properties for subscripts.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/superscript.properties.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/superscript.properties.xml
new file mode 100644
index 0000000..ecf6af1
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/superscript.properties.xml
@@ -0,0 +1,29 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="superscript.properties">
+<refmeta>
+<refentrytitle>superscript.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>superscript.properties</refname>
+<refpurpose>Properties associated with superscripts</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="superscript.properties.frag">
+<xsl:attribute-set name="superscript.properties">
+ <xsl:attribute name="font-size">75%</xsl:attribute>
+</xsl:attribute-set>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies styling properties for superscripts.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/suppress.footer.navigation.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/suppress.footer.navigation.xml
new file mode 100644
index 0000000..430ed97
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/suppress.footer.navigation.xml
@@ -0,0 +1,26 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="suppress.footer.navigation">
+<refmeta>
+<refentrytitle>suppress.footer.navigation</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>suppress.footer.navigation</refname>
+<refpurpose>Disable footer navigation</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="suppress.footer.navigation.frag"><xsl:param name="suppress.footer.navigation">0</xsl:param></src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>
+If non-zero, footer navigation will be suppressed.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/suppress.header.navigation.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/suppress.header.navigation.xml
new file mode 100644
index 0000000..8fff081
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/suppress.header.navigation.xml
@@ -0,0 +1,27 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="suppress.header.navigation">
+<refmeta>
+<refentrytitle>suppress.header.navigation</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>suppress.header.navigation</refname>
+<refpurpose>Disable header navigation</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="suppress.header.navigation.frag">
+<xsl:param name="suppress.header.navigation" select="0"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, header navigation will be suppressed.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/suppress.homepage.title.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/suppress.homepage.title.xml
new file mode 100644
index 0000000..38a3306
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/suppress.homepage.title.xml
@@ -0,0 +1,25 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="suppress.homepage.title">
+<refmeta>
+<refentrytitle>suppress.homepage.title</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>suppress.homepage.title</refname>
+<refpurpose>Suppress title on homepage?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="suppress.homepage.title.frag">
+<xsl:param name="suppress.homepage.title" select="1"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+<para>FIXME:If non-zero, the title on the homepage is suppressed?</para>
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/suppress.navigation.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/suppress.navigation.xml
new file mode 100644
index 0000000..351fc4d
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/suppress.navigation.xml
@@ -0,0 +1,28 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="suppress.navigation">
+<refmeta>
+<refentrytitle>suppress.navigation</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>suppress.navigation</refname>
+<refpurpose>Disable header and footer navigation</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="suppress.navigation.frag">
+<xsl:param name="suppress.navigation" select="0"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>
+If non-zero, header and footer navigation will be suppressed.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/symbol.font.family.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/symbol.font.family.xml
new file mode 100644
index 0000000..8acc791
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/symbol.font.family.xml
@@ -0,0 +1,45 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="symbol.font.family">
+<refmeta>
+<refentrytitle>symbol.font.family</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">list</refmiscinfo>
+<refmiscinfo class="other" otherclass="list-type">open</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">serif</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">sans-serif</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">monospace</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>symbol.font.family</refname>
+<refpurpose>The font families to be searched for symbols outside
+ of the body font</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="symbol.font.family.frag">
+<xsl:param name="symbol.font.family">Symbol,ZapfDingbats</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>A typical body or title font does not contain all
+the character glyphs that DocBook supports. This parameter
+specifies additional fonts that should be searched for
+special characters not in the normal font.
+These symbol font names are automatically appended
+to the body or title font family name when fonts
+are specified in a
+<tag class="attribute">font-family</tag>
+property in the FO output.
+</para>
+<para>The symbol font names should be entered as a
+comma-separated list. The default value is
+<literal>Symbol,ZapfDingbats</literal>.
+</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/table.borders.with.css.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/table.borders.with.css.xml
new file mode 100644
index 0000000..2640fb9
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/table.borders.with.css.xml
@@ -0,0 +1,28 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="table.borders.with.css">
+<refmeta>
+<refentrytitle>table.borders.with.css</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>table.borders.with.css</refname>
+<refpurpose>Use CSS to specify table, row, and cell borders?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="table.borders.with.css.frag">
+<xsl:param name="table.borders.with.css" select="0"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, CSS will be used to draw table borders.
+</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/table.cell.border.color.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/table.cell.border.color.xml
new file mode 100644
index 0000000..326e148
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/table.cell.border.color.xml
@@ -0,0 +1,39 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="table.cell.border.color">
+<refmeta>
+<refentrytitle>table.cell.border.color</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">color</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>table.cell.border.color</refname>
+<refpurpose>Specifies the border color of table cells</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="table.cell.border.color.frag">
+<xsl:param condition="html" name="table.cell.border.color"></xsl:param>
+<xsl:param condition="fo" name="table.cell.border.color">black</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Set the color of table cell borders. If non-zero, the value is used
+for the border coloration. See <link
+xlink:href="http://www.w3.org/TR/CSS21/syndata.html#value-def-color">CSS</link>. A
+<literal>color</literal> is either a keyword or a numerical RGB specification.
+Keywords are aqua, black, blue, fuchsia, gray, green, lime, maroon,
+navy, olive, orange, purple, red, silver, teal, white, and
+yellow.</para>
+
+<note>
+ <para>To control properties of cell borders in HTML output, you must also turn on the
+ <parameter>table.borders.with.css</parameter> parameter.</para>
+</note>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/table.cell.border.style.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/table.cell.border.style.xml
new file mode 100644
index 0000000..221a29c
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/table.cell.border.style.xml
@@ -0,0 +1,42 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="table.cell.border.style">
+<refmeta>
+<refentrytitle>table.cell.border.style</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">list</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">none</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">solid</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">dotted</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">dashed</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">double</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">groove</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">ridge</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">inset</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">outset</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">solid</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>table.cell.border.style</refname>
+<refpurpose>Specifies the border style of table cells</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="table.cell.border.style.frag">
+<xsl:param name="table.cell.border.style">solid</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies the border style of table cells.</para>
+
+<note>
+ <para>To control properties of cell borders in HTML output, you must also turn on the
+ <parameter>table.borders.with.css</parameter> parameter.</para>
+</note>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/table.cell.border.thickness.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/table.cell.border.thickness.xml
new file mode 100644
index 0000000..093e38e
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/table.cell.border.thickness.xml
@@ -0,0 +1,35 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="table.cell.border.thickness">
+<refmeta>
+<refentrytitle>table.cell.border.thickness</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">length</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>table.cell.border.thickness</refname>
+<refpurpose>Specifies the thickness of table cell borders</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="table.cell.border.thickness.frag">
+<xsl:param name="table.cell.border.thickness">0.5pt</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, specifies the thickness of borders on table
+cells. The units are points. See <link
+xlink:href="http://www.w3.org/TR/CSS21/box.html#border-width-properties">
+CSS</link></para>
+
+<note>
+ <para>To control properties of cell borders in HTML output, you must also turn on the
+ <parameter>table.borders.with.css</parameter> parameter.</para>
+</note>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/table.cell.padding.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/table.cell.padding.xml
new file mode 100644
index 0000000..25fd653
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/table.cell.padding.xml
@@ -0,0 +1,32 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="table.cell.padding">
+<refmeta>
+<refentrytitle>table.cell.padding</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>table.cell.padding</refname>
+<refpurpose>Specifies the padding of table cells</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="table.cell.padding.frag">
+<xsl:attribute-set name="table.cell.padding">
+ <xsl:attribute name="padding-start">2pt</xsl:attribute>
+ <xsl:attribute name="padding-end">2pt</xsl:attribute>
+ <xsl:attribute name="padding-top">2pt</xsl:attribute>
+ <xsl:attribute name="padding-bottom">2pt</xsl:attribute>
+</xsl:attribute-set>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies the padding of table cells.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/table.entry.padding.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/table.entry.padding.xml
new file mode 100644
index 0000000..cfd6aa3
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/table.entry.padding.xml
@@ -0,0 +1,27 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="table.entry.padding">
+<refmeta>
+<refentrytitle>table.entry.padding</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">length</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>table.entry.padding</refname>
+<refpurpose/>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="table.entry.padding.frag">
+<xsl:param name="table.entry.padding">2pt</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>FIXME:</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/table.footnote.number.format.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/table.footnote.number.format.xml
new file mode 100644
index 0000000..ebbd2ea
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/table.footnote.number.format.xml
@@ -0,0 +1,33 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="table.footnote.number.format">
+<refmeta>
+<refentrytitle>table.footnote.number.format</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">list</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">1<alt>1,2,3...</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">A<alt>A,B,C...</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">a<alt>a,b,c...</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">i<alt>i,ii,iii...</alt></refmiscinfo>
+<refmiscinfo class="other" otherclass="value">I<alt>I,II,III...</alt></refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>table.footnote.number.format</refname>
+<refpurpose>Identifies the format used for footnote numbers in tables</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="table.footnote.number.format.frag">
+<xsl:param name="table.footnote.number.format">a</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The <parameter>table.footnote.number.format</parameter> specifies the format
+to use for footnote numeration (1, i, I, a, or A) in tables.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/table.footnote.number.symbols.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/table.footnote.number.symbols.xml
new file mode 100644
index 0000000..a8d8c23
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/table.footnote.number.symbols.xml
@@ -0,0 +1,39 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="table.footnote.number.symbols">
+<refmeta>
+<refentrytitle>table.footnote.number.symbols</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>table.footnote.number.symbols</refname>
+<refpurpose>Special characters to use a footnote markers in tables</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="table.footnote.number.symbols.frag">
+<xsl:param name="table.footnote.number.symbols"></xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If <parameter>table.footnote.number.symbols</parameter> is not the empty string,
+table footnotes will use the characters it contains as footnote symbols. For example,
+<quote>*&amp;#x2020;&amp;#x2021;&amp;#x25CA;&amp;#x2720;</quote> will identify
+footnotes with <quote>*</quote>, <quote>†</quote>, <quote>‡</quote>,
+<quote>◊</quote>, and <quote>✠</quote>. If there are more footnotes
+than symbols, the stylesheets will fall back to numbered footnotes using
+<parameter>table.footnote.number.format</parameter>.</para>
+
+<para>The use of symbols for footnotes depends on the ability of your
+processor (or browser) to render the symbols you select. Not all systems are
+capable of displaying the full range of Unicode characters. If the quoted characters
+in the preceding paragraph are not displayed properly, that's a good indicator
+that you may have trouble using those symbols for footnotes.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/table.footnote.properties.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/table.footnote.properties.xml
new file mode 100644
index 0000000..94bed80
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/table.footnote.properties.xml
@@ -0,0 +1,39 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="table.footnote.properties">
+<refmeta>
+<refentrytitle>table.footnote.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>table.footnote.properties</refname>
+<refpurpose>Properties applied to each table footnote body
+</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="table.footnote.properties.frag">
+<xsl:attribute-set name="table.footnote.properties">
+ <xsl:attribute name="font-family"><xsl:value-of select="$body.fontset"/></xsl:attribute>
+ <xsl:attribute name="font-size"><xsl:value-of select="$footnote.font.size"/></xsl:attribute>
+ <xsl:attribute name="font-weight">normal</xsl:attribute>
+ <xsl:attribute name="font-style">normal</xsl:attribute>
+ <xsl:attribute name="space-before">2pt</xsl:attribute>
+ <xsl:attribute name="text-align"><xsl:value-of select="$alignment"/></xsl:attribute>
+</xsl:attribute-set>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>This attribute set is applied to the footnote-block
+for each table footnote.
+It can be used to set the
+font-size, font-family, and other inheritable properties that will be
+applied to all table footnotes.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/table.frame.border.color.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/table.frame.border.color.xml
new file mode 100644
index 0000000..070cb6a
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/table.frame.border.color.xml
@@ -0,0 +1,28 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="table.frame.border.color">
+<refmeta>
+<refentrytitle>table.frame.border.color</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">color</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>table.frame.border.color</refname>
+<refpurpose>Specifies the border color of table frames</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="table.frame.border.color.frag">
+<xsl:param condition="html" name="table.frame.border.color"></xsl:param>
+<xsl:param condition="fo" name="table.frame.border.color">black</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies the border color of table frames.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/table.frame.border.style.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/table.frame.border.style.xml
new file mode 100644
index 0000000..881840c
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/table.frame.border.style.xml
@@ -0,0 +1,37 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="table.frame.border.style">
+<refmeta>
+<refentrytitle>table.frame.border.style</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">list</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">none</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">solid</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">dotted</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">dashed</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">double</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">groove</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">ridge</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">inset</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">outset</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">solid</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>table.frame.border.style</refname>
+<refpurpose>Specifies the border style of table frames</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="table.frame.border.style.frag">
+<xsl:param name="table.frame.border.style">solid</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies the border style of table frames.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/table.frame.border.thickness.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/table.frame.border.thickness.xml
new file mode 100644
index 0000000..1eaa04a
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/table.frame.border.thickness.xml
@@ -0,0 +1,27 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="table.frame.border.thickness">
+<refmeta>
+<refentrytitle>table.frame.border.thickness</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">length</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>table.frame.border.thickness</refname>
+<refpurpose>Specifies the thickness of the frame border</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="table.frame.border.thickness.frag">
+<xsl:param name="table.frame.border.thickness">0.5pt</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies the thickness of the border on the table's frame.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/table.properties.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/table.properties.xml
new file mode 100644
index 0000000..76340c8
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/table.properties.xml
@@ -0,0 +1,34 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="table.properties">
+<refmeta>
+<refentrytitle>table.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>table.properties</refname>
+<refpurpose>Properties associated with the block surrounding a table</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="table.properties.frag">
+<xsl:attribute-set name="table.properties" use-attribute-sets="formal.object.properties">
+ <xsl:attribute name="keep-together.within-column">auto</xsl:attribute>
+</xsl:attribute-set>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Block styling properties for tables. This parameter should really
+have been called <literal>table.block.properties</literal> or something
+like that, but we’re leaving it to avoid backwards-compatibility
+problems.</para>
+
+<para>See also <parameter>table.table.properties</parameter>.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/table.spacer.image.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/table.spacer.image.xml
new file mode 100644
index 0000000..12e6d5a
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/table.spacer.image.xml
@@ -0,0 +1,26 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="table.spacer.image">
+<refmeta>
+<refentrytitle>table.spacer.image</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">filename</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>table.spacer.image</refname>
+<refpurpose>Invisible pixel for tabular accessibility</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="table.spacer.image.frag">
+<xsl:param name="table.spacer.image">graphics/spacer.gif</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+<para>This is the 1x1 pixel, transparent pixel used for <link xlink:href="http://diveintoaccessibility.org/day_10_presenting_your_main_content_first.html">the table trick</link> to increase the accessibility of the tabular
+website presentation.</para>
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/table.table.properties.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/table.table.properties.xml
new file mode 100644
index 0000000..4ee3422
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/table.table.properties.xml
@@ -0,0 +1,36 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="table.table.properties">
+<refmeta>
+<refentrytitle>table.table.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>table.table.properties</refname>
+<refpurpose>Properties associated with a table</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="table.table.properties.frag">
+<xsl:attribute-set name="table.table.properties">
+ <xsl:attribute name="border-before-width.conditionality">retain</xsl:attribute>
+ <xsl:attribute name="border-collapse">collapse</xsl:attribute>
+</xsl:attribute-set>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The styling for tables. This parameter should really
+have been called <literal>table.properties</literal>, but that parameter
+name was inadvertently established for the block-level properties
+of the table as a whole.
+</para>
+
+<para>See also <parameter>table.properties</parameter>.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/tablecolumns.extension.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/tablecolumns.extension.xml
new file mode 100644
index 0000000..2ec817a
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/tablecolumns.extension.xml
@@ -0,0 +1,30 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="tablecolumns.extension">
+<refmeta>
+<refentrytitle>tablecolumns.extension</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>tablecolumns.extension</refname>
+<refpurpose>Enable the table columns extension function</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="tablecolumns.extension.frag">
+<xsl:param name="tablecolumns.extension" select="1"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The table columns extension function adjusts the widths of table
+columns in the HTML result to more accurately reflect the specifications
+in the CALS table.
+</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/target.database.document.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/target.database.document.xml
new file mode 100644
index 0000000..042f017
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/target.database.document.xml
@@ -0,0 +1,37 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="target.database.document">
+<refmeta>
+<refentrytitle>target.database.document</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">uri</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>target.database.document</refname>
+<refpurpose>Name of master database file for resolving
+olinks</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+<src:fragment xml:id="target.database.document.frag">
+ <xsl:param name="target.database.document">olinkdb.xml</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+
+<para>
+To resolve olinks between documents, the stylesheets use a master
+database document that identifies the target datafiles for all the
+documents within the scope of the olinks. This parameter value is the
+URI of the master document to be read during processing to resolve
+olinks. The default value is <filename>olinkdb.xml</filename>.</para>
+
+<para>The data structure of the file is defined in the
+<filename>targetdatabase.dtd</filename> DTD. The database file
+provides the high level elements to record the identifiers, locations,
+and relationships of documents. The cross reference data for
+individual documents is generally pulled into the database using
+system entity references or XIncludes. See also
+<parameter>targets.filename</parameter>. </para> </refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/targets.filename.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/targets.filename.xml
new file mode 100644
index 0000000..de6e29c
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/targets.filename.xml
@@ -0,0 +1,32 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="targets.filename">
+<refmeta>
+<refentrytitle>targets.filename</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>targets.filename</refname>
+<refpurpose>Name of cross reference targets data file</refpurpose>
+</refnamediv>
+<refsynopsisdiv> <src:fragment xml:id="targets.filename.frag">
+<xsl:param name="targets.filename">target.db</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+
+<para>
+In order to resolve olinks efficiently, the stylesheets can
+generate an external data file containing information about
+all potential cross reference endpoints in a document.
+This parameter lets you change the name of the generated
+file from the default name <filename>target.db</filename>.
+The name must agree with that used in the target database
+used to resolve olinks during processing.
+See also <parameter>target.database.document</parameter>.
+</para>
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/template.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/template.xml
new file mode 100644
index 0000000..9d35f83
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/template.xml
@@ -0,0 +1,27 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="[[NAME]]">
+<refmeta>
+<refentrytitle>[[NAME]]</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype"/>
+</refmeta>
+<refnamediv>
+<refname>[[NAME]]</refname>
+<refpurpose/>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="[[NAME]].frag">
+<xsl:param name="[[NAME]]" select=""/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>FIXME:</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/tex.math.delims.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/tex.math.delims.xml
new file mode 100644
index 0000000..3a302f7
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/tex.math.delims.xml
@@ -0,0 +1,47 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="tex.math.delims">
+<refmeta>
+<refentrytitle>tex.math.delims</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>tex.math.delims</refname>
+<refpurpose>Should equations output for processing by TeX be
+surrounded by math mode delimiters?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="tex.math.delims.frag">
+<xsl:param name="tex.math.delims" select="1"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>For compatibility with DSSSL based DBTeXMath from Allin Cottrell
+you should set this parameter to 0.</para>
+
+<warning>
+ <para>This feature is useful for print/PDF output only if you
+ use the obsolete and now unsupported PassiveTeX XSL-FO
+ engine.</para>
+</warning>
+
+</refsection>
+<refsection><info><title>Related Parameters</title></info>
+ <para><parameter>tex.math.in.alt</parameter>,
+ <parameter>passivetex.extensions</parameter></para>
+</refsection>
+
+<refsection><info><title>See Also</title></info>
+ <para>You can also use the <tag
+ class="xmlpi">dbtex delims</tag> processing
+ instruction to control whether delimiters are output.</para>
+</refsection>
+
+
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/tex.math.file.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/tex.math.file.xml
new file mode 100644
index 0000000..fbc6eaa
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/tex.math.file.xml
@@ -0,0 +1,42 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="tex.math.file">
+<refmeta>
+<refentrytitle>tex.math.file</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>tex.math.file</refname>
+<refpurpose>Name of temporary file for generating images from equations</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="tex.math.file.frag">
+<xsl:param name="tex.math.file">tex-math-equations.tex</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Name of auxiliary file for TeX equations. This file can be
+processed by dvi2bitmap to get bitmap versions of equations for HTML
+output.</para>
+
+</refsection>
+<refsection><info><title>Related Parameters</title></info>
+ <para><parameter>tex.math.in.alt</parameter>,
+ <parameter>tex.math.delims</parameter>,
+ </para>
+</refsection>
+<refsection><info><title>More information</title></info>
+ <para>For how-to documentation on embedding TeX equations and
+ generating output from them, see
+ <link
+ role="tcg"
+ xlink:href="TexMath.html"
+ >DBTeXMath</link>.</para>
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/tex.math.in.alt.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/tex.math.in.alt.xml
new file mode 100644
index 0000000..ed1abb9
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/tex.math.in.alt.xml
@@ -0,0 +1,76 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="tex.math.in.alt">
+<refmeta>
+<refentrytitle>tex.math.in.alt</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">list</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">plain</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">latex</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>tex.math.in.alt</refname>
+<refpurpose>TeX notation used for equations</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="tex.math.in.alt.frag">
+<xsl:param name="tex.math.in.alt"></xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If you want type math directly in TeX notation in equations,
+this parameter specifies notation used. Currently are supported two
+values -- <literal>plain</literal> and <literal>latex</literal>. Empty
+value means that you are not using TeX math at all.</para>
+
+<para>Preferred way for including TeX alternative of math is inside of
+<tag>textobject</tag> element. Eg.:</para>
+
+<programlisting>&lt;inlineequation&gt;
+&lt;inlinemediaobject&gt;
+&lt;imageobject&gt;
+&lt;imagedata fileref="eq1.gif"/&gt;
+&lt;/imageobject&gt;
+&lt;textobject&gt;&lt;phrase&gt;E=mc squared&lt;/phrase&gt;&lt;/textobject&gt;
+&lt;textobject role="tex"&gt;&lt;phrase&gt;E=mc^2&lt;/phrase&gt;&lt;/textobject&gt;
+&lt;/inlinemediaobject&gt;
+&lt;/inlineequation&gt;</programlisting>
+
+<para>If you are using <tag>graphic</tag> element, you can
+store TeX inside <tag>alt</tag> element:</para>
+
+<programlisting>&lt;inlineequation&gt;
+&lt;alt role="tex"&gt;a^2+b^2=c^2&lt;/alt&gt;
+&lt;graphic fileref="a2b2c2.gif"/&gt;
+&lt;/inlineequation&gt;</programlisting>
+
+<para>If you want use this feature, you should process your FO with
+PassiveTeX, which only supports TeX math notation. When calling
+stylsheet, don't forget to specify also
+passivetex.extensions=1.</para>
+
+<para>If you want equations in HTML, just process generated file
+<filename>tex-math-equations.tex</filename> by TeX or LaTeX. Then run
+dvi2bitmap program on result DVI file. You will get images for
+equations in your document.</para>
+
+<warning>
+ <para>This feature is useful for print/PDF output only if you
+ use the obsolete and now unsupported PassiveTeX XSL-FO
+ engine.</para>
+</warning>
+
+</refsection>
+
+<refsection><info><title>Related Parameters</title></info>
+ <para><parameter>tex.math.delims</parameter>,
+ <parameter>passivetex.extensions</parameter>,
+ <parameter>tex.math.file</parameter></para>
+</refsection>
+
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/text.home.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/text.home.xml
new file mode 100644
index 0000000..0bc81dd
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/text.home.xml
@@ -0,0 +1,27 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="text.home">
+<refmeta>
+<refentrytitle>text.home</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>text.home</refname>
+<refpurpose>Home</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="text.home.frag">
+<xsl:param name="text.home">Home</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>FIXME:</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/text.next.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/text.next.xml
new file mode 100644
index 0000000..d89b8e8
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/text.next.xml
@@ -0,0 +1,27 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="text.next">
+<refmeta>
+<refentrytitle>text.next</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>text.next</refname>
+<refpurpose>FIXME:</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="text.next.frag">
+<xsl:param name="text.next">Next</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>FIXME:</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/text.prev.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/text.prev.xml
new file mode 100644
index 0000000..62d28e3
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/text.prev.xml
@@ -0,0 +1,27 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="text.prev">
+<refmeta>
+<refentrytitle>text.prev</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>text.prev</refname>
+<refpurpose>FIXME:</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="text.prev.frag">
+<xsl:param name="text.prev">Prev</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>FIXME:</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/text.toc.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/text.toc.xml
new file mode 100644
index 0000000..083b8e3
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/text.toc.xml
@@ -0,0 +1,27 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="text.toc">
+<refmeta>
+<refentrytitle>text.toc</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>text.toc</refname>
+<refpurpose>FIXME:</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="text.toc.frag">
+<xsl:param name="text.toc">ToC</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>FIXME:</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/text.up.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/text.up.xml
new file mode 100644
index 0000000..f6dca22
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/text.up.xml
@@ -0,0 +1,27 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="text.up">
+<refmeta>
+<refentrytitle>text.up</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>text.up</refname>
+<refpurpose>FIXME:</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="text.up.frag">
+<xsl:param name="text.up" >Up</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>FIXME:</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/textbgcolor.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/textbgcolor.xml
new file mode 100644
index 0000000..b9aefe6
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/textbgcolor.xml
@@ -0,0 +1,26 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="textbgcolor">
+<refmeta>
+<refentrytitle>textbgcolor</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">color</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>textbgcolor</refname>
+<refpurpose>The background color of the table body</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="textbgcolor.frag">
+<xsl:param name="textbgcolor">white</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+<para>The background color of the table body.</para>
+<para>Only applies with the tabular presentation is being used.</para>
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/textdata.default.encoding.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/textdata.default.encoding.xml
new file mode 100644
index 0000000..b6f30a8
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/textdata.default.encoding.xml
@@ -0,0 +1,32 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="textdata.default.encoding">
+<refmeta>
+<refentrytitle>textdata.default.encoding</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>textdata.default.encoding</refname>
+<refpurpose>Default encoding of external text files which are included
+using textdata element</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="textdata.default.encoding.frag">
+<xsl:param name="textdata.default.encoding"></xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies the encoding of any external text files included using
+<tag>textdata</tag> element. This value is used only when you do
+not specify encoding by the appropriate attribute <!-- Which is what? -->
+directly on textdata. An empty string is interpreted as the system
+default encoding.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/textinsert.extension.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/textinsert.extension.xml
new file mode 100644
index 0000000..a6f1ea4
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/textinsert.extension.xml
@@ -0,0 +1,62 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="textinsert.extension">
+ <refmeta>
+ <refentrytitle>textinsert.extension</refentrytitle>
+ <refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+ </refmeta>
+ <refnamediv>
+ <refname>textinsert.extension</refname>
+ <refpurpose>Enables the textinsert extension element</refpurpose>
+ </refnamediv>
+ <refsynopsisdiv>
+ <src:fragment xml:id="textinsert.extension.frag">
+ <xsl:param name="textinsert.extension" select="1"/>
+</src:fragment>
+ </refsynopsisdiv>
+ <refsection><info><title>Description</title></info>
+ <para>The textinsert extension element inserts the contents of
+ a file into the result tree (as text).</para>
+ <note>
+ <para>To use the textinsert extension element, you must use
+ either Saxon or Xalan as your XSLT processor (it doesn’t
+ work with xsltproc), along with either the DocBook Saxon
+ extensions or DocBook Xalan extensions (for more
+ information about those extensions, see <link
+ role="tcg" xlink:href="InstallingAProcessor.html#SaxonExtensions"
+ >DocBook Saxon Extensions</link> and <link
+ role="tcg" xlink:href="InstallingAProcessor.html#XalanExtensions"
+ >DocBook Xalan Extensions</link>), and you must set both
+ the <parameter>use.extensions</parameter> and
+ <parameter>textinsert.extension</parameter> parameters to
+ <literal>1</literal>.</para>
+ <para>As an alternative to using the textinsert element,
+ consider using an Xinclude element with the
+ <literal>parse="text"</literal> attribute and value
+ specified, as detailed in <link
+ role="tcg" xlink:href="ExternalCode.html#XIncludeCode"
+ >Using XInclude for text inclusions</link>.</para>
+ </note>
+ </refsection>
+ <refsection><info><title>See Also</title></info>
+ <para>You can also use the <tag
+ class="xmlpi">dbhtml-include href</tag> processing
+ instruction to insert external files — both files containing
+ plain text and files with markup content (including HTML
+ content).</para>
+ </refsection>
+ <refsection><info><title>More information</title></info>
+ <para>For how-to documentation on inserting contents of
+ external code files and other text files into output, see
+ <link
+ role="tcg" xlink:href="ExternalCode.html"
+ >External code files</link>.</para>
+ <para>For guidelines on inserting contents of
+ HTML files into output, see <link
+ role="tcg" xlink:href="InsertExtHtml.html"
+ >Inserting external HTML code</link>.</para>
+ </refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/title.font.family.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/title.font.family.xml
new file mode 100644
index 0000000..369021f
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/title.font.family.xml
@@ -0,0 +1,33 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="title.font.family">
+<refmeta>
+<refentrytitle>title.font.family</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">list</refmiscinfo>
+<refmiscinfo class="other" otherclass="list-type">open</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">serif</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">sans-serif</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">monospace</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>title.font.family</refname>
+<refpurpose>The default font family for titles</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="title.font.family.frag">
+<xsl:param name="title.font.family">sans-serif</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The title font family is used for titles (chapter, section, figure,
+etc.)
+</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/title.margin.left.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/title.margin.left.xml
new file mode 100644
index 0000000..dc50dd1
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/title.margin.left.xml
@@ -0,0 +1,65 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="title.margin.left">
+<refmeta>
+<refentrytitle>title.margin.left</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">length</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>title.margin.left</refname>
+<refpurpose>Adjust the left margin for titles</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="title.margin.left.frag">
+<xsl:param name="title.margin.left">
+ <xsl:choose>
+ <xsl:when test="$fop.extensions != 0">-4pc</xsl:when>
+ <xsl:when test="$passivetex.extensions != 0">0pt</xsl:when>
+ <xsl:otherwise>0pt</xsl:otherwise>
+ </xsl:choose>
+</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>This parameter provides
+the means of adjusting the left margin for titles
+when the XSL-FO processor being used is
+an old version of FOP (0.25 and earlier).
+It is only useful when the <parameter>fop.extensions</parameter>
+is nonzero.</para>
+
+<para>The left margin of the body region
+is calculated to include this space,
+and titles are outdented to the left outside
+the body region by this amount,
+effectively leaving titles at the intended left margin
+and the body text indented.
+Currently this method is only used for old FOP because
+it cannot properly use the <parameter>body.start.indent</parameter>
+parameter.
+</para>
+<para>
+The default value when the <parameter>fop.extensions</parameter>
+parameter is nonzero is -4pc, which means the
+body text is indented 4 picas relative to
+the titles.
+The default value when the <parameter>fop.extensions</parameter>
+parameter equals zero is 0pt, and
+the body indent should instead be specified
+using the <parameter>body.start.indent</parameter>
+parameter.
+</para>
+<para>
+If you set the value to zero, be sure to still include
+a unit indicator such as <literal>0pt</literal>, or
+the FO processor will report errors.
+</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/titlefoil.html.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/titlefoil.html.xml
new file mode 100644
index 0000000..5fa2acd
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/titlefoil.html.xml
@@ -0,0 +1,27 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="titlefoil.html">
+<refmeta>
+<refentrytitle>titlefoil.html</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">filename</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>titlefoil.html</refname>
+<refpurpose>Name of title foil HTML file</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="titlefoil.html.frag">
+<xsl:param name="titlefoil.html" select="concat('index', $html.ext)"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Sets the filename used for the slides titlepage.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/toc.bg.color.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/toc.bg.color.xml
new file mode 100644
index 0000000..1389c62
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/toc.bg.color.xml
@@ -0,0 +1,27 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="toc.bg.color">
+<refmeta>
+<refentrytitle>toc.bg.color</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">color</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>toc.bg.color</refname>
+<refpurpose>Background color for ToC frame</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="toc.bg.color.frag">
+<xsl:param name="toc.bg.color">#FFFFFF</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies the background color used in the ToC frame.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/toc.blank.graphic.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/toc.blank.graphic.xml
new file mode 100644
index 0000000..bb24888
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/toc.blank.graphic.xml
@@ -0,0 +1,28 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="toc.blank.graphic">
+<refmeta>
+<refentrytitle>toc.blank.graphic</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>toc.blank.graphic</refname>
+<refpurpose>Use graphic for "blanks" in TOC?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="toc.blank.graphic.frag">
+<xsl:param name="toc.blank.graphic" select="1"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+<para>If non-zero, "blanks" in the the TOC will be accomplished
+with the graphic identified by <varname>toc.spacer.image</varname>.
+</para>
+<para>Only applies with the tabular presentation is being used.</para>
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/toc.blank.image.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/toc.blank.image.xml
new file mode 100644
index 0000000..82caa2f
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/toc.blank.image.xml
@@ -0,0 +1,27 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="toc.blank.image">
+<refmeta>
+<refentrytitle>toc.blank.image</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">filename</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>toc.blank.image</refname>
+<refpurpose>The image for "blanks" in the TOC</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="toc.blank.image.frag">
+<xsl:param name="toc.blank.image">graphics/blank.gif</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+<para>If <varname>toc.blank.graphic</varname> is non-zero, this image
+will be used to for "blanks" in the TOC.</para>
+<para>Only applies with the tabular presentation is being used.</para>
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/toc.blank.text.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/toc.blank.text.xml
new file mode 100644
index 0000000..d39aec4
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/toc.blank.text.xml
@@ -0,0 +1,27 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="toc.blank.text">
+<refmeta>
+<refentrytitle>toc.blank.text</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>toc.blank.text</refname>
+<refpurpose>The text for "blanks" in the TOC</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="toc.blank.text.frag">
+<xsl:param name="toc.blank.text">&#160;&#160;&#160;</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+<para>If <varname>toc.blank.graphic</varname> is zero, this text string
+will be used for "blanks" in the TOC.</para>
+<para>Only applies with the tabular presentation is being used.</para>
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/toc.hide.show.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/toc.hide.show.xml
new file mode 100644
index 0000000..1570ec4
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/toc.hide.show.xml
@@ -0,0 +1,33 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="toc.hide.show">
+<refmeta>
+<refentrytitle>toc.hide.show</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>toc.hide.show</refname>
+<refpurpose>Enable hide/show button for ToC frame</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="toc.hide.show.frag">
+<xsl:param name="toc.hide.show" select="0"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, JavaScript (and an additional icon, see
+<link linkend="hidetoc.image">hidetoc.image</link> and
+<link linkend="hidetoc.image">showtoc.image</link>) is added to each slide
+to allow the ToC panel to be <quote>toggled</quote> on each panel.</para>
+
+<note><para>There is a bug in Mozilla 1.0 (at least as of CR3) that causes
+the browser to reload the titlepage when this feature is used.</para></note>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/toc.html.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/toc.html.xml
new file mode 100644
index 0000000..62c060c
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/toc.html.xml
@@ -0,0 +1,27 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="toc.html">
+<refmeta>
+<refentrytitle>toc.html</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">filename</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>toc.html</refname>
+<refpurpose>Name of ToC HTML file</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="toc.html.frag">
+<xsl:param name="toc.html" select="concat('toc', $html.ext)"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Sets the filename used for the table of contents page.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/toc.image.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/toc.image.xml
new file mode 100644
index 0000000..147155c
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/toc.image.xml
@@ -0,0 +1,27 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="toc.image">
+<refmeta>
+<refentrytitle>toc.image</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">filename</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>toc.image</refname>
+<refpurpose>ToC image</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="toc.image.frag">
+<xsl:param name="toc.image">active/nav-toc.png</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies the filename of the ToC navigation icon.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/toc.indent.width.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/toc.indent.width.xml
new file mode 100644
index 0000000..449e74c
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/toc.indent.width.xml
@@ -0,0 +1,34 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="toc.indent.width">
+<refmeta>
+<refentrytitle>toc.indent.width</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">float</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>toc.indent.width</refname>
+<refpurpose>Amount of indentation for TOC entries</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="toc.indent.width.frag">
+<xsl:param name="toc.indent.width">24</xsl:param>
+<!-- inconsistant point specification? -->
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies, in points, the distance by which each level of the
+TOC is indented from its parent.</para>
+
+<para>This value is expressed in points, without
+a unit (in other words, it is a bare number). Using a bare number allows the stylesheet
+to perform calculations that would otherwise have to be performed by the FO processor
+because not all processors support expressions.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/toc.line.properties.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/toc.line.properties.xml
new file mode 100644
index 0000000..0886fa4
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/toc.line.properties.xml
@@ -0,0 +1,44 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="toc.line.properties">
+<refmeta>
+<refentrytitle>toc.line.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>toc.line.properties</refname>
+<refpurpose>Properties for lines in ToCs and LoTs</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="toc.line.properties.frag">
+<xsl:attribute-set name="toc.line.properties">
+ <xsl:attribute name="text-align-last">justify</xsl:attribute>
+ <xsl:attribute name="text-align">start</xsl:attribute>
+ <xsl:attribute name="end-indent"><xsl:value-of select="concat($toc.indent.width, 'pt')"/></xsl:attribute>
+ <xsl:attribute name="last-line-end-indent"><xsl:value-of select="concat('-', $toc.indent.width, 'pt')"/></xsl:attribute>
+</xsl:attribute-set>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Properties which are applied to every line in ToC (or LoT). You can
+modify them in order to change appearance of all, or some lines. For
+example, in order to make lines for chapters bold, specify the
+following in your customization layer:</para>
+
+<programlisting>&lt;xsl:attribute-set name="toc.line.properties"&gt;
+ &lt;xsl:attribute name="font-weight"&gt;
+ &lt;xsl:choose>
+ &lt;xsl:when test="self::chapter">bold&lt;/xsl:when&gt;
+ &lt;xsl:otherwise&gt;normal&lt;/xsl:otherwise&gt;
+ &lt;/xsl:choose>
+ &lt;/xsl:attribute&gt;
+&lt;/xsl:attribute-set&gt;</programlisting>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/toc.list.type.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/toc.list.type.xml
new file mode 100644
index 0000000..31dc465
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/toc.list.type.xml
@@ -0,0 +1,30 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="toc.list.type">
+<refmeta>
+<refentrytitle>toc.list.type</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">list</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">dl</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">ul</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">ol</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>toc.list.type</refname>
+<refpurpose>Type of HTML list element to use for Tables of Contents</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="toc.list.type.frag"><xsl:param name="toc.list.type">dl</xsl:param></src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>When an automatically generated Table of Contents (or List of Titles)
+is produced, this HTML element will be used to make the list.
+</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/toc.margin.properties.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/toc.margin.properties.xml
new file mode 100644
index 0000000..25963df
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/toc.margin.properties.xml
@@ -0,0 +1,33 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="toc.margin.properties">
+<refmeta>
+<refentrytitle>toc.margin.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>toc.margin.properties</refname>
+<refpurpose>Margin properties used on Tables of Contents</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="toc.margin.properties.frag">
+<xsl:attribute-set name="toc.margin.properties">
+ <xsl:attribute name="space-before.minimum">0.5em</xsl:attribute>
+ <xsl:attribute name="space-before.optimum">1em</xsl:attribute>
+ <xsl:attribute name="space-before.maximum">2em</xsl:attribute>
+ <xsl:attribute name="space-after.minimum">0.5em</xsl:attribute>
+ <xsl:attribute name="space-after.optimum">1em</xsl:attribute>
+ <xsl:attribute name="space-after.maximum">2em</xsl:attribute>
+</xsl:attribute-set>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+<para>This attribute set is used on Tables of Contents. These attributes are set
+on the wrapper that surrounds the ToC block, not on each individual lines.</para>
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/toc.max.depth.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/toc.max.depth.xml
new file mode 100644
index 0000000..75902b3
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/toc.max.depth.xml
@@ -0,0 +1,25 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="toc.max.depth">
+<refmeta>
+<refentrytitle>toc.max.depth</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">integer</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>toc.max.depth</refname>
+<refpurpose>How many levels should be created for each TOC?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="toc.max.depth.frag"><xsl:param name="toc.max.depth">8</xsl:param></src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies the maximal depth of TOC on all levels.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/toc.pointer.graphic.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/toc.pointer.graphic.xml
new file mode 100644
index 0000000..4b2cb74
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/toc.pointer.graphic.xml
@@ -0,0 +1,28 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="toc.pointer.graphic">
+<refmeta>
+<refentrytitle>toc.pointer.graphic</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>toc.pointer.graphic</refname>
+<refpurpose>Use graphic for TOC pointer?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="toc.pointer.graphic.frag">
+<xsl:param name="toc.pointer.graphic" select="1"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+<para>If non-zero, the "pointer" in the TOC will be displayed
+with the graphic identified by <varname>toc.pointer.image</varname>.
+</para>
+<para>Only applies with the tabular presentation is being used.</para>
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/toc.pointer.image.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/toc.pointer.image.xml
new file mode 100644
index 0000000..bf06901
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/toc.pointer.image.xml
@@ -0,0 +1,27 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="toc.pointer.image">
+<refmeta>
+<refentrytitle>toc.pointer.image</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">filename</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>toc.pointer.image</refname>
+<refpurpose>The image for the "pointer" in the TOC</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="toc.pointer.image.frag">
+<xsl:param name="toc.pointer.image">graphics/arrow.gif</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+<para>If <varname>toc.pointer.graphic</varname> is non-zero, this image
+will be used for the "pointer" in the TOC.</para>
+<para>Only applies with the tabular presentation is being used.</para>
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/toc.pointer.text.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/toc.pointer.text.xml
new file mode 100644
index 0000000..b094765
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/toc.pointer.text.xml
@@ -0,0 +1,27 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="toc.pointer.text">
+<refmeta>
+<refentrytitle>toc.pointer.text</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>toc.pointer.text</refname>
+<refpurpose>The text for the "pointer" in the TOC</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="toc.pointer.text.frag">
+<xsl:param name="toc.pointer.text">&#160;&gt;&#160;</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+<para>If <varname>toc.pointer.graphic</varname> is zero, this text string
+will be used to display the "pointer" in the TOC.</para>
+<para>Only applies with the tabular presentation is being used.</para>
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/toc.row.height.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/toc.row.height.xml
new file mode 100644
index 0000000..89bac83
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/toc.row.height.xml
@@ -0,0 +1,33 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="toc.row.height">
+<refmeta>
+<refentrytitle>toc.row.height</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">length</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>toc.row.height</refname>
+<refpurpose>Height of ToC rows in dynamic ToCs</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="toc.row.height.frag">
+<xsl:param name="toc.row.height">22</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>This parameter specifies the height of each row in the table of
+contents. This is only applicable if a <link
+linkend="dynamic.toc">dynamic ToC</link> is used. You may want to
+adjust this parameter for optimal appearance with the font and image
+sizes selected by your <link linkend="css.stylesheet">CSS
+stylesheet</link>.
+</para>
+<!-- This uses link for cross param linking, unlike most others -->
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/toc.section.depth.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/toc.section.depth.xml
new file mode 100644
index 0000000..db99f9c
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/toc.section.depth.xml
@@ -0,0 +1,28 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="toc.section.depth">
+<refmeta>
+<refentrytitle>toc.section.depth</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">integer</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>toc.section.depth</refname>
+<refpurpose>How deep should recursive <tag>section</tag>s appear
+in the TOC?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="toc.section.depth.frag"><xsl:param name="toc.section.depth">2</xsl:param></src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies the depth to which recursive sections should appear in the
+TOC.
+</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/toc.spacer.graphic.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/toc.spacer.graphic.xml
new file mode 100644
index 0000000..0a5729c
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/toc.spacer.graphic.xml
@@ -0,0 +1,28 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="toc.spacer.graphic">
+<refmeta>
+<refentrytitle>toc.spacer.graphic</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>toc.spacer.graphic</refname>
+<refpurpose>Use graphic for TOC spacer?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="toc.spacer.graphic.frag">
+<xsl:param name="toc.spacer.graphic" select="1"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+<para>If non-zero, the indentation in the TOC will be accomplished
+with the graphic identified by <varname>toc.spacer.image</varname>.
+</para>
+<para>Only applies with the tabular presentation is being used.</para>
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/toc.spacer.image.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/toc.spacer.image.xml
new file mode 100644
index 0000000..0d55016
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/toc.spacer.image.xml
@@ -0,0 +1,27 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="toc.spacer.image">
+<refmeta>
+<refentrytitle>toc.spacer.image</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">filename</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>toc.spacer.image</refname>
+<refpurpose>The image for spacing the TOC</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="toc.spacer.image.frag">
+<xsl:param name="toc.spacer.image">graphics/blank.gif</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+<para>If <varname>toc.spacer.graphic</varname> is non-zero, this image
+will be used to indent the TOC.</para>
+<para>Only applies with the tabular presentation is being used.</para>
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/toc.spacer.text.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/toc.spacer.text.xml
new file mode 100644
index 0000000..bfb605f
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/toc.spacer.text.xml
@@ -0,0 +1,27 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="toc.spacer.text">
+<refmeta>
+<refentrytitle>toc.spacer.text</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>toc.spacer.text</refname>
+<refpurpose>The text for spacing the TOC</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="toc.spacer.text.frag">
+<xsl:param name="toc.spacer.text">&#160;&#160;&#160;</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+<para>If <varname>toc.spacer.graphic</varname> is zero, this text string
+will be used to indent the TOC.</para>
+<para>Only applies with the tabular presentation is being used.</para>
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/toc.width.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/toc.width.xml
new file mode 100644
index 0000000..71a3c03
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/toc.width.xml
@@ -0,0 +1,28 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="toc.width">
+<refmeta>
+<refentrytitle>toc.width</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">length</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>toc.width</refname>
+<refpurpose>Width of ToC frame</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="toc.width.frag">
+<xsl:param name="toc.width" >250</xsl:param>
+<!-- Presumably in pixels? -->
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies the width of the ToC frame in pixels.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/ua.js.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/ua.js.xml
new file mode 100644
index 0000000..8242a71
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/ua.js.xml
@@ -0,0 +1,28 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="ua.js">
+<refmeta>
+<refentrytitle>ua.js</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">filename</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>ua.js</refname>
+<refpurpose>UA JavaScript file</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="ua.js.frag">
+<xsl:param name="ua.js">ua.js</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies the filename of the UA JavaScript file. It's unlikely
+that you will ever need to change this parameter.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/ulink.footnotes.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/ulink.footnotes.xml
new file mode 100644
index 0000000..f17c884
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/ulink.footnotes.xml
@@ -0,0 +1,34 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="ulink.footnotes">
+<refmeta>
+<refentrytitle>ulink.footnotes</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>ulink.footnotes</refname>
+<refpurpose>Generate footnotes for <tag>ulink</tag>s?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="ulink.footnotes.frag">
+<xsl:param name="ulink.footnotes" select="0"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, and if <parameter>ulink.show</parameter> also is non-zero,
+the URL of each <tag>ulink</tag> will appear as a footnote.</para>
+
+<note><para>DocBook 5 does not have an <tag>ulink</tag> element. When processing
+DocBoook 5 documents, <parameter>ulink.footnotes</parameter> applies to all inline
+elements that are marked up with <tag class="attribute">xlink:href</tag> attributes
+that point to external resources.</para>
+</note>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/ulink.hyphenate.chars.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/ulink.hyphenate.chars.xml
new file mode 100644
index 0000000..7fdd771
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/ulink.hyphenate.chars.xml
@@ -0,0 +1,37 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="ulink.hyphenate.chars">
+<refmeta>
+<refentrytitle>ulink.hyphenate.chars</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>ulink.hyphenate.chars</refname>
+<refpurpose>List of characters to allow ulink URLs to be automatically hyphenated on</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="ulink.hyphenate.chars.frag">
+<xsl:param name="ulink.hyphenate.chars">/</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If the <parameter>ulink.hyphenate</parameter> is not empty, then
+hyphenation of ulinks is turned on, and any
+character contained in this parameter is treated as an allowable
+hyphenation point.</para>
+
+<para>The default value is <quote>/</quote>, but the parameter
+could be customized
+to contain other URL characters, as for example:</para>
+<programlisting>
+&lt;xsl:param name="ulink.hyphenate.chars"&gt;:/@&amp;?.#&lt;/xsl:param&gt;
+</programlisting>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/ulink.hyphenate.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/ulink.hyphenate.xml
new file mode 100644
index 0000000..719e937
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/ulink.hyphenate.xml
@@ -0,0 +1,35 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="ulink.hyphenate">
+<refmeta>
+<refentrytitle>ulink.hyphenate</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>ulink.hyphenate</refname>
+<refpurpose>Allow URLs to be automatically hyphenated</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="ulink.hyphenate.frag">
+<xsl:param name="ulink.hyphenate"></xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If not empty, the specified character (or more generally, content) is
+added to URLs after every character included in the string
+in the <parameter>ulink.hyphenate.chars</parameter> parameter (default
+is <quote>/</quote>). If the character in this parameter is a
+Unicode soft hyphen (0x00AD) or Unicode zero-width space (0x200B), some FO
+processors will be able to reasonably hyphenate long URLs.</para>
+
+<para>As of 28 Jan 2002, discretionary hyphens are more widely and correctly
+supported than zero-width spaces for this purpose.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/ulink.show.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/ulink.show.xml
new file mode 100644
index 0000000..6f90d58
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/ulink.show.xml
@@ -0,0 +1,37 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="ulink.show">
+<refmeta>
+<refentrytitle>ulink.show</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>ulink.show</refname>
+<refpurpose>Display URLs after <tag>ulink</tag>s?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="ulink.show.frag">
+<xsl:param name="ulink.show" select="1"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, the URL of each <tag>ulink</tag> will
+appear after the text of the link. If the text of the link and the URL
+are identical, the URL is suppressed. </para>
+
+<para>See also <parameter>ulink.footnotes</parameter>.</para>
+
+<note><para>DocBook 5 does not have an <tag>ulink</tag> element. When processing
+DocBoook 5 documents, <parameter>ulink.show</parameter> applies to all inline
+elements that are marked up with <tag class="attribute">xlink:href</tag> attributes
+that point to external resources.</para>
+</note>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/ulink.target.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/ulink.target.xml
new file mode 100644
index 0000000..cf1d42b
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/ulink.target.xml
@@ -0,0 +1,29 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="ulink.target">
+<refmeta>
+<refentrytitle>ulink.target</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>ulink.target</refname>
+<refpurpose>The HTML anchor target for ULinks</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="ulink.target.frag">
+<xsl:param name="ulink.target">_top</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If <parameter>ulink.target</parameter> is non-zero, its value will
+be used for the <literal>target</literal> attribute
+on anchors generated for <tag>ulink</tag>s.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/up.image.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/up.image.xml
new file mode 100644
index 0000000..1c3bfa2
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/up.image.xml
@@ -0,0 +1,27 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="up.image">
+<refmeta>
+<refentrytitle>up.image</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">filename</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>up.image</refname>
+<refpurpose>Up-arrow image</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="up.image.frag">
+<xsl:param name="up.image">active/nav-up.png</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies the filename of the upward-pointing navigation arrow.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/use.embed.for.svg.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/use.embed.for.svg.xml
new file mode 100644
index 0000000..f7c52cc
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/use.embed.for.svg.xml
@@ -0,0 +1,33 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="use.embed.for.svg">
+<refmeta>
+<refentrytitle>use.embed.for.svg</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>use.embed.for.svg</refname>
+<refpurpose>Use HTML <tag>embed</tag> for SVG?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="use.embed.for.svg.frag">
+<xsl:param name="use.embed.for.svg" select="0"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, an <tag>embed</tag> element will be created for
+SVG figures. An <tag>object</tag> is <emphasis>always</emphasis> created,
+this parameter merely controls whether or not an additional <tag>embed</tag>
+is generated inside the <tag>object</tag>.</para>
+
+<para>On the plus side, this may be more portable among browsers and plug-ins.
+On the minus side, it isn't valid HTML.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/use.extensions.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/use.extensions.xml
new file mode 100644
index 0000000..4dce71b
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/use.extensions.xml
@@ -0,0 +1,31 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="use.extensions">
+<refmeta>
+<refentrytitle>use.extensions</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>use.extensions</refname>
+<refpurpose>Enable extensions</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="use.extensions.frag">
+<xsl:param name="use.extensions" select="0"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, extensions may be used. Each extension is
+further controlled by its own parameter. But if
+<parameter>use.extensions</parameter> is zero, no extensions will
+be used.
+</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/use.id.as.filename.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/use.id.as.filename.xml
new file mode 100644
index 0000000..e5133e9
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/use.id.as.filename.xml
@@ -0,0 +1,30 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="use.id.as.filename">
+<refmeta>
+<refentrytitle>use.id.as.filename</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>use.id.as.filename</refname>
+<refpurpose>Use ID value of chunk elements as the filename?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="use.id.as.filename.frag">
+<xsl:param name="use.id.as.filename" select="0"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If <parameter>use.id.as.filename</parameter>
+is non-zero, the filename of chunk elements that have IDs will be
+derived from the ID value.
+</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/use.id.function.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/use.id.function.xml
new file mode 100644
index 0000000..5f4e6f7
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/use.id.function.xml
@@ -0,0 +1,32 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="use.id.function">
+<refmeta>
+<refentrytitle>use.id.function</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>use.id.function</refname>
+<refpurpose>Use the XPath id() function to find link targets?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="use.id.function.frag">
+<xsl:param name="use.id.function" select="1"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If 1, the stylesheets use the <function>id()</function> function
+to find the targets of cross reference elements. This is more
+efficient, but only works if your XSLT processor implements the
+<function>id()</function> function, naturally.</para>
+<para>THIS PARAMETER IS NOT SUPPORTED. IT IS ALWAYS ASSUMED TO BE 1.
+SEE xref.xsl IF YOU NEED TO TURN IT OFF.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/use.local.olink.style.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/use.local.olink.style.xml
new file mode 100644
index 0000000..eb4f57a
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/use.local.olink.style.xml
@@ -0,0 +1,28 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="use.local.olink.style">
+<refmeta>
+<refentrytitle>use.local.olink.style</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>use.local.olink.style</refname>
+<refpurpose>Process olinks using xref style of current
+document</refpurpose>
+</refnamediv>
+<refsynopsisdiv> <src:fragment xml:id="use.local.olink.style.frag">
+<xsl:param name="use.local.olink.style" select="0"/> </src:fragment>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+
+<para>When cross reference data is collected for use by olinks, the data for each potential target includes one field containing a completely assembled cross reference string, as if it were an xref generated in that document. Other fields record the separate title, number, and element name of each target. When an olink is formed to a target from another document, the olink resolves to that preassembled string by default. If the <parameter>use.local.olink.style</parameter> parameter is set to non-zero, then instead the cross
+reference string is formed again from the target title, number, and
+element name, using the stylesheet processing the targeting document.
+Then olinks will match the xref style in the targeting document
+rather than in the target document. If both documents are processed
+with the same stylesheet, then the results will be the same.</para>
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/use.role.as.xrefstyle.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/use.role.as.xrefstyle.xml
new file mode 100644
index 0000000..56c4470
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/use.role.as.xrefstyle.xml
@@ -0,0 +1,93 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="use.role.as.xrefstyle">
+<refmeta>
+<refentrytitle>use.role.as.xrefstyle</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>use.role.as.xrefstyle</refname>
+<refpurpose>Use <tag class="attribute">role</tag> attribute for
+<tag class="attribute">xrefstyle</tag> on <tag>xref</tag>?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="use.role.as.xrefstyle.frag">
+<xsl:param name="use.role.as.xrefstyle" select="1"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>In DocBook documents that conform to a schema older than V4.3, this parameter allows
+<tag class="attribute">role</tag> to serve the purpose of specifying the cross reference style.</para>
+
+<para>If non-zero, the <tag class="attribute">role</tag> attribute on
+<tag>xref</tag> will be used to select the cross reference style.
+In DocBook V4.3, the <tag class="attribute">xrefstyle</tag> attribute was added for this purpose.
+If the <tag class="attribute">xrefstyle</tag> attribute is present,
+<tag class="attribute">role</tag> will be ignored, regardless of the setting
+of this parameter.</para>
+
+</refsection>
+
+<refsection><info><title>Example</title></info>
+
+<para>The following small stylesheet shows how to configure the
+stylesheets to make use of the cross reference style:</para>
+
+<programlisting>&lt;?xml version="1.0"?&gt;
+&lt;xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="1.0"&gt;
+
+&lt;xsl:import href="../xsl/html/docbook.xsl"/&gt;
+
+&lt;xsl:output method="html"/&gt;
+
+&lt;xsl:param name="local.l10n.xml" select="document('')"/&gt;
+&lt;l:i18n xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0"&gt;
+ &lt;l:l10n xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0" language="en"&gt;
+ &lt;l:context name="xref"&gt;
+ &lt;l:template name="chapter" style="title" text="Chapter %n, %t"/&gt;
+ &lt;l:template name="chapter" text="Chapter %n"/&gt;
+ &lt;/l:context&gt;
+ &lt;/l:l10n&gt;
+&lt;/l:i18n&gt;
+
+&lt;/xsl:stylesheet&gt;</programlisting>
+
+<para>With this stylesheet, the cross references in the following document:</para>
+
+<programlisting>&lt;?xml version="1.0" encoding="utf-8"?&gt;
+&lt;!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
+ "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd"&gt;
+&lt;book id="book"&gt;&lt;title&gt;Book&lt;/title&gt;
+
+&lt;preface&gt;
+&lt;title&gt;Preface&lt;/title&gt;
+
+&lt;para&gt;Normal: &lt;xref linkend="ch1"/&gt;.&lt;/para&gt;
+&lt;para&gt;Title: &lt;xref xrefstyle="title" linkend="ch1"/&gt;.&lt;/para&gt;
+
+&lt;/preface&gt;
+
+&lt;chapter id="ch1"&gt;
+&lt;title&gt;First Chapter&lt;/title&gt;
+
+&lt;para&gt;Irrelevant.&lt;/para&gt;
+
+&lt;/chapter&gt;
+&lt;/book&gt;</programlisting>
+
+<para>will appear as:</para>
+
+<informalexample>
+<para>Normal: Chapter 1.</para>
+<para>Title: Chapter 1, <emphasis>First Chapter</emphasis>.</para>
+</informalexample>
+</refsection>
+
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/use.role.for.mediaobject.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/use.role.for.mediaobject.xml
new file mode 100644
index 0000000..9241ace
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/use.role.for.mediaobject.xml
@@ -0,0 +1,56 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="use.role.for.mediaobject">
+<refmeta>
+<refentrytitle>use.role.for.mediaobject</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>use.role.for.mediaobject</refname>
+<refpurpose>Use <tag class="attribute">role</tag> attribute
+value for selecting which of several objects within a mediaobject to use.
+</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="use.role.for.mediaobject.frag">
+<xsl:param name="use.role.for.mediaobject" select="1"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, the <tag class="attribute">role</tag> attribute on
+<tag>imageobject</tag>s or other objects within a <tag>mediaobject</tag> container will be used to select which object will be
+used.
+</para>
+<para>
+The order of selection when then parameter is non-zero is:
+</para>
+<orderedlist>
+<listitem>
+ <para>If the stylesheet parameter <parameter>preferred.mediaobject.role</parameter> has a value, then the object whose role equals that value is selected.</para>
+</listitem>
+<listitem>
+<para>Else if an object's role attribute has a value of
+<literal>html</literal> for HTML processing or
+<literal>fo</literal> for FO output, then the first
+of such objects is selected.
+</para>
+</listitem>
+<listitem>
+<para>Else the first suitable object is selected.</para>
+</listitem>
+</orderedlist>
+<para>
+If the value of
+<parameter>use.role.for.mediaobject</parameter>
+is zero, then role attributes are not considered
+and the first suitable object
+with or without a role value is used.
+</para>
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/use.svg.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/use.svg.xml
new file mode 100644
index 0000000..8f13be0
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/use.svg.xml
@@ -0,0 +1,30 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="use.svg">
+<refmeta>
+<refentrytitle>use.svg</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>use.svg</refname>
+<refpurpose>Allow SVG in the result tree?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="use.svg.frag">
+<xsl:param name="use.svg" select="1"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, SVG will be considered an acceptable image format. SVG
+is passed through to the result tree, so correct rendering of the resulting
+diagram depends on the formatter (FO processor or web browser) that is used
+to process the output from the stylesheet.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/variablelist.as.blocks.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/variablelist.as.blocks.xml
new file mode 100644
index 0000000..71e1c98
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/variablelist.as.blocks.xml
@@ -0,0 +1,62 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="variablelist.as.blocks">
+<refmeta>
+<refentrytitle>variablelist.as.blocks</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>variablelist.as.blocks</refname>
+<refpurpose>Format <tag>variablelist</tag>s lists as blocks?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="variablelist.as.blocks.frag">
+<xsl:param name="variablelist.as.blocks" select="0"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, <tag>variablelist</tag>s will be formatted as
+blocks.</para>
+
+<para>If you have long terms, proper list markup in the FO case may produce
+unattractive lists. By setting this parameter, you can force the stylesheets
+to produce block markup instead of proper lists.</para>
+
+<para>You can override this setting with a processing instruction as the
+child of <tag>variablelist</tag>: <tag class="xmlpi">dbfo
+list-presentation="blocks"</tag> or <tag class="xmlpi">dbfo
+list-presentation="list"</tag>.</para>
+
+<para>When using <literal>list-presentation="list"</literal>,
+you can also control the amount of space used for the <tag>term</tag>s with
+the <tag class="xmlpi">dbfo term-width=".25in"</tag> processing instruction,
+the <tag class="attribute">termlength</tag> attribute on <tag>variablelist</tag>,
+or allow the stylesheets to attempt to calculate the amount of space to leave based on the
+number of letters in the longest term.
+</para>
+
+<programlisting> &lt;variablelist&gt;
+ &lt;?dbfo list-presentation="list"?&gt;
+ &lt;?dbfo term-width="1.5in"?&gt;
+ &lt;?dbhtml list-presentation="table"?&gt;
+ &lt;?dbhtml term-width="1.5in"?&gt;
+ &lt;varlistentry&gt;
+ &lt;term&gt;list&lt;/term&gt;
+ &lt;listitem&gt;
+ &lt;para&gt;
+ Formatted as a list even if variablelist.as.blocks is set to 1.
+ &lt;/para&gt;
+ &lt;/listitem&gt;
+ &lt;/varlistentry&gt;
+ &lt;/variablelist&gt;</programlisting>
+
+
+</refsection>
+
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/variablelist.as.table.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/variablelist.as.table.xml
new file mode 100644
index 0000000..113d2f5
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/variablelist.as.table.xml
@@ -0,0 +1,54 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="variablelist.as.table">
+<refmeta>
+<refentrytitle>variablelist.as.table</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>variablelist.as.table</refname>
+<refpurpose>Format <tag>variablelist</tag>s as tables?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="variablelist.as.table.frag">
+<xsl:param name="variablelist.as.table" select="0"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, <tag>variablelist</tag>s will be formatted as
+tables. A processing instruction exists to specify a particular width for the
+column containing the <tag>term</tag>s:
+<tag class="xmlpi">dbhtml term-width=".25in"</tag></para>
+
+<para>You can override this setting with a processing instruction as the
+child of <tag>variablelist</tag>: <tag class="xmlpi">dbhtml
+list-presentation="table"</tag> or <tag class="xmlpi">dbhtml
+list-presentation="list"</tag>.</para>
+
+<para>This parameter only applies to the HTML transformations. In the
+FO case, proper list markup is robust enough to handle the formatting.
+But see also <parameter>variablelist.as.blocks</parameter>.</para>
+
+<programlisting> &lt;variablelist&gt;
+ &lt;?dbhtml list-presentation="table"?&gt;
+ &lt;?dbhtml term-width="1.5in"?&gt;
+ &lt;?dbfo list-presentation="list"?&gt;
+ &lt;?dbfo term-width="1in"?&gt;
+ &lt;varlistentry&gt;
+ &lt;term&gt;list&lt;/term&gt;
+ &lt;listitem&gt;
+ &lt;para&gt;
+ Formatted as a table even if variablelist.as.table is set to 0.
+ &lt;/para&gt;
+ &lt;/listitem&gt;
+ &lt;/varlistentry&gt;
+ &lt;/variablelist&gt;</programlisting>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/variablelist.max.termlength.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/variablelist.max.termlength.xml
new file mode 100644
index 0000000..ff56a87
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/variablelist.max.termlength.xml
@@ -0,0 +1,46 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="variablelist.max.termlength">
+<refmeta>
+<refentrytitle>variablelist.max.termlength</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">number</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>variablelist.max.termlength</refname>
+<refpurpose>Specifies the longest term in variablelists</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="variablelist.max.termlength.frag">
+<xsl:param name="variablelist.max.termlength">24</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>In variablelists, the <tag>listitem</tag>
+is indented to leave room for the
+<tag>term</tag> elements. That indent may be computed
+if it is not specified with a <tag class="attribute">termlength</tag>
+attribute on the <tag>variablelist</tag> element.
+</para>
+<para>
+The computation counts characters in the
+<tag>term</tag> elements in the list
+to find the longest term. However, some terms are very long
+and would produce extreme indents. This parameter lets you
+set a maximum character count. Any terms longer than the maximum
+would line wrap. The default value is 24.
+</para>
+<para>
+The character counts are converted to physical widths
+by multiplying by 0.50em. There will be some variability
+in how many actual characters fit in the space
+since some characters are wider than others.
+</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/variablelist.term.break.after.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/variablelist.term.break.after.xml
new file mode 100644
index 0000000..8472f5e
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/variablelist.term.break.after.xml
@@ -0,0 +1,39 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="variablelist.term.break.after">
+<refmeta>
+<refentrytitle>variablelist.term.break.after</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>variablelist.term.break.after</refname>
+<refpurpose>Generate line break after each <tag>term</tag> within a
+multi-term <tag>varlistentry</tag>?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="variablelist.term.break.after.frag">
+<xsl:param name="variablelist.term.break.after">0</xsl:param></src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Set a non-zero value for the
+<parameter>variablelist.term.break.after</parameter> parameter to
+generate a line break between <tag>term</tag>s in a
+multi-term <tag>varlistentry</tag>.</para>
+
+<note>
+<para>If you set a non-zero value for
+<parameter>variablelist.term.break.after</parameter>, you may also
+want to set the value of the
+<parameter>variablelist.term.separator</parameter> parameter to an
+empty string (to suppress rendering of the default comma and space
+after each <tag>term</tag>).</para>
+</note>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/variablelist.term.properties.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/variablelist.term.properties.xml
new file mode 100644
index 0000000..4a4835d
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/variablelist.term.properties.xml
@@ -0,0 +1,29 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="variablelist.term.properties">
+<refmeta>
+<refentrytitle>variablelist.term.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>variablelist.term.properties</refname>
+<refpurpose>To add properties to the term elements in a variablelist.</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="variablelist.term.properties.frag">
+<xsl:attribute-set name="variablelist.term.properties">
+</xsl:attribute-set>
+</src:fragment>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+<para>These properties are added to the block containing a
+term in a variablelist.
+Use this attribute-set to set
+font properties or alignment, for example.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/variablelist.term.separator.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/variablelist.term.separator.xml
new file mode 100644
index 0000000..f3df883
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/variablelist.term.separator.xml
@@ -0,0 +1,40 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="variablelist.term.separator">
+<refmeta>
+<refentrytitle>variablelist.term.separator</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>variablelist.term.separator</refname>
+<refpurpose>Text to separate <tag>term</tag>s within a multi-term
+<tag>varlistentry</tag></refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="variablelist.term.separator.frag">
+<xsl:param name="variablelist.term.separator">, </xsl:param></src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>When a <tag>varlistentry</tag> contains multiple <tag>term</tag>
+elements, the string specified in the value of the
+<parameter>variablelist.term.separator</parameter> parameter is placed
+after each <tag>term</tag> except the last.</para>
+
+<note>
+ <para>To generate a line break between multiple <tag>term</tag>s in
+ a <tag>varlistentry</tag>, set a non-zero value for the
+ <parameter>variablelist.term.break.after</parameter> parameter. If
+ you do so, you may also want to set the value of the
+ <parameter>variablelist.term.separator</parameter> parameter to an
+ empty string (to suppress rendering of the default comma and space
+ after each <tag>term</tag>).</para>
+</note>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/verbatim.properties.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/verbatim.properties.xml
new file mode 100644
index 0000000..28a368a
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/verbatim.properties.xml
@@ -0,0 +1,38 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="verbatim.properties">
+<refmeta>
+<refentrytitle>verbatim.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>verbatim.properties</refname>
+<refpurpose>Properties associated with verbatim text</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="verbatim.properties.frag">
+<xsl:attribute-set name="verbatim.properties">
+ <xsl:attribute name="space-before.minimum">0.8em</xsl:attribute>
+ <xsl:attribute name="space-before.optimum">1em</xsl:attribute>
+ <xsl:attribute name="space-before.maximum">1.2em</xsl:attribute>
+ <xsl:attribute name="space-after.minimum">0.8em</xsl:attribute>
+ <xsl:attribute name="space-after.optimum">1em</xsl:attribute>
+ <xsl:attribute name="space-after.maximum">1.2em</xsl:attribute>
+ <xsl:attribute name="hyphenate">false</xsl:attribute>
+ <xsl:attribute name="wrap-option">no-wrap</xsl:attribute>
+ <xsl:attribute name="white-space-collapse">false</xsl:attribute>
+ <xsl:attribute name="white-space-treatment">preserve</xsl:attribute>
+ <xsl:attribute name="linefeed-treatment">preserve</xsl:attribute>
+ <xsl:attribute name="text-align">start</xsl:attribute>
+</xsl:attribute-set></src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+<para>This attribute set is used on all verbatim environments.</para>
+</refsection>
+
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/wordml.template.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/wordml.template.xml
new file mode 100644
index 0000000..4dae8a8
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/wordml.template.xml
@@ -0,0 +1,29 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="wordml.template">
+<refmeta>
+<refentrytitle>wordml.template</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">uri</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>wordml.template</refname>
+<refpurpose>Specify the template WordML document</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="wordml.template.frag">
+<xsl:param name="wordml.template"></xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The <parameter>wordml.template</parameter> parameter specifies a WordML document to use as a template for the generated document. The template document is used to define the (extensive) headers for the generated document, in particular the paragraph and character styles that are used to format the various elements. Any content in the template document is ignored.</para>
+
+<para>A template document is used in order to allow maintenance of the paragraph and character styles to be done using Word itself, rather than these XSL stylesheets.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/writing.mode.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/writing.mode.xml
new file mode 100644
index 0000000..c695933
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/writing.mode.xml
@@ -0,0 +1,83 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="writing.mode">
+<refmeta>
+<refentrytitle>writing.mode</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>writing.mode</refname>
+<refpurpose>Direction of text flow based on locale</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="writing.mode.frag">
+<xsl:param name="writing.mode">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key">writing-mode</xsl:with-param>
+ <xsl:with-param name="lang">
+ <xsl:call-template name="l10n.language">
+ <xsl:with-param name="target" select="/*[1]"/>
+ </xsl:call-template>
+ </xsl:with-param>
+ </xsl:call-template>
+</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Sets direction of text flow and text alignment based on locale.
+The value is normally taken from the gentext file for the
+lang attribute of the document's root element, using the
+key name 'writing-mode' to look it up in the gentext file.
+But the param can also be
+set on the command line to override that gentext value.
+</para>
+<para>Accepted values are:
+<variablelist>
+ <varlistentry>
+ <term>lr-tb</term>
+ <listitem>
+ <para>Left-to-right text flow in each line, lines stack top to bottom.</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>rl-tb</term>
+ <listitem>
+ <para>Right-to-left text flow in each line, lines stack top to bottom.</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>tb-rl</term>
+ <listitem>
+ <para>Top-to-bottom text flow in each vertical line, lines stack right to left.
+ Supported by only a few XSL-FO processors. Not supported in HTML output.</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>lr</term>
+ <listitem>
+ <para>Shorthand for lr-tb.</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>rl</term>
+ <listitem>
+ <para>Shorthand for rl-tb.</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>tb</term>
+ <listitem>
+ <para>Shorthand for tb-rl.</para>
+ </listitem>
+ </varlistentry>
+</variablelist>
+</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/xbCollapsibleLists.js.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/xbCollapsibleLists.js.xml
new file mode 100644
index 0000000..b30391f
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/xbCollapsibleLists.js.xml
@@ -0,0 +1,28 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="xbCollapsibleLists.js">
+<refmeta>
+<refentrytitle>xbCollapsibleLists.js</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">filename</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>xbCollapsibleLists.js</refname>
+<refpurpose>xbCollapsibleLists JavaScript file</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="xbCollapsibleLists.js.frag">
+<xsl:param name="xbCollapsibleLists.js">xbCollapsibleLists.js</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies the filename of the xbCollapsibleLists JavaScript file. It's unlikely
+that you will ever need to change this parameter.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/xbDOM.js.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/xbDOM.js.xml
new file mode 100644
index 0000000..a699e9c
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/xbDOM.js.xml
@@ -0,0 +1,28 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="xbDOM.js">
+<refmeta>
+<refentrytitle>xbDOM.js</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">filename</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>xbDOM.js</refname>
+<refpurpose>xbDOM JavaScript file</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="xbDOM.js.frag">
+<xsl:param name="xbDOM.js">xbDOM.js</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies the filename of the xbDOM JavaScript file. It's unlikely
+that you will ever need to change this parameter.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/xbLibrary.js.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/xbLibrary.js.xml
new file mode 100644
index 0000000..fe2d8fe
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/xbLibrary.js.xml
@@ -0,0 +1,28 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="xbLibrary.js">
+<refmeta>
+<refentrytitle>xbLibrary.js</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">filename</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>xbLibrary.js</refname>
+<refpurpose>xbLibrary JavaScript file</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="xbLibrary.js.frag">
+<xsl:param name="xbLibrary.js">xbLibrary.js</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies the filename of the xbLibrary JavaScript file. It's unlikely
+that you will ever need to change this parameter.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/xbStyle.js.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/xbStyle.js.xml
new file mode 100644
index 0000000..b587573
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/xbStyle.js.xml
@@ -0,0 +1,28 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="xbStyle.js">
+<refmeta>
+<refentrytitle>xbStyle.js</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">filename</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>xbStyle.js</refname>
+<refpurpose>xbStyle JavaScript file</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="xbStyle.js.frag">
+<xsl:param name="xbStyle.js">xbStyle.js</xsl:param>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies the filename of the xbStyle JavaScript file. It's unlikely
+that you will ever need to change this parameter.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/xep.extensions.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/xep.extensions.xml
new file mode 100644
index 0000000..8ac2520
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/xep.extensions.xml
@@ -0,0 +1,31 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="xep.extensions">
+<refmeta>
+<refentrytitle>xep.extensions</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>xep.extensions</refname>
+<refpurpose>Enable XEP extensions?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="xep.extensions.frag"><xsl:param name="xep.extensions" select="0"/></src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero,
+<link xlink:href="http://www.renderx.com/">XEP</link>
+extensions will be used. XEP extensions consists of PDF bookmarks,
+document information and better index processing.
+</para>
+
+<para>This parameter can also affect which graphics file formats
+are supported</para>
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/xep.index.item.properties.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/xep.index.item.properties.xml
new file mode 100644
index 0000000..b1db129
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/xep.index.item.properties.xml
@@ -0,0 +1,36 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="xep.index.item.properties">
+<refmeta>
+<refentrytitle>xep.index.item.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>xep.index.item.properties</refname>
+<refpurpose>Properties associated with XEP index-items</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="xep.index.item.properties.frag">
+<xsl:attribute-set name="xep.index.item.properties" use-attribute-sets="index.page.number.properties">
+ <xsl:attribute name="merge-subsequent-page-numbers">true</xsl:attribute>
+ <xsl:attribute name="link-back">true</xsl:attribute>
+</xsl:attribute-set>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Properties associated with XEP index-items, which generate
+page numbers in an index processed by XEP. For more info see
+the XEP documentation section "Indexes" in
+<uri xlink:href="http://www.renderx.com/reference.html#Indexes">http://www.renderx.com/reference.html#Indexes</uri>.</para>
+
+<para>This attribute-set also adds by default any properties from the
+<tag class="attribute">index.page.number.properties</tag>
+attribute-set.</para>
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/xref.label-page.separator.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/xref.label-page.separator.xml
new file mode 100644
index 0000000..355fc4a
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/xref.label-page.separator.xml
@@ -0,0 +1,38 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="xref.label-page.separator">
+<refmeta>
+<refentrytitle>xref.label-page.separator</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>xref.label-page.separator</refname>
+<refpurpose>Punctuation or space separating label from page number in xref</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="xref.label-page.separator.frag"><xsl:param name="xref.label-page.separator"><xsl:text> </xsl:text></xsl:param></src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>
+This parameter allows you to control the punctuation of certain
+types of generated cross reference text.
+When cross reference text is generated for an
+<tag class="element">xref</tag> or
+<tag class="element">olink</tag> element
+using an <tag class="attribute">xrefstyle</tag> attribute
+that makes use of the <literal>select:</literal> feature,
+and the selected components include both label and page
+but no title,
+then the value of this parameter is inserted between
+label and page number in the output.
+If a title is included, then other separators are used.
+</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/xref.label-title.separator.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/xref.label-title.separator.xml
new file mode 100644
index 0000000..3d6e222
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/xref.label-title.separator.xml
@@ -0,0 +1,36 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="xref.label-title.separator">
+<refmeta>
+<refentrytitle>xref.label-title.separator</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>xref.label-title.separator</refname>
+<refpurpose>Punctuation or space separating label from title in xref</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="xref.label-title.separator.frag"><xsl:param name="xref.label-title.separator">: </xsl:param></src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>
+This parameter allows you to control the punctuation of certain
+types of generated cross reference text.
+When cross reference text is generated for an
+<tag class="element">xref</tag> or
+<tag class="element">olink</tag> element
+using an <tag class="attribute">xrefstyle</tag> attribute
+that makes use of the <literal>select:</literal> feature,
+and the selected components include both label and title,
+then the value of this parameter is inserted between
+label and title in the output.
+</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/xref.properties.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/xref.properties.xml
new file mode 100644
index 0000000..6438f6c
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/xref.properties.xml
@@ -0,0 +1,29 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="xref.properties">
+<refmeta>
+<refentrytitle>xref.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>xref.properties</refname>
+<refpurpose>Properties associated with cross-reference text</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="xref.properties.frag">
+<xsl:attribute-set name="xref.properties">
+</xsl:attribute-set>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>This attribute set is used to set properties
+on cross reference text.</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/xref.title-page.separator.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/xref.title-page.separator.xml
new file mode 100644
index 0000000..32ef9f1
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/xref.title-page.separator.xml
@@ -0,0 +1,36 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="xref.title-page.separator">
+<refmeta>
+<refentrytitle>xref.title-page.separator</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>xref.title-page.separator</refname>
+<refpurpose>Punctuation or space separating title from page number in xref</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="xref.title-page.separator.frag"><xsl:param name="xref.title-page.separator"><xsl:text> </xsl:text></xsl:param></src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>
+This parameter allows you to control the punctuation of certain
+types of generated cross reference text.
+When cross reference text is generated for an
+<tag class="element">xref</tag> or
+<tag class="element">olink</tag> element
+using an <tag class="attribute">xrefstyle</tag> attribute
+that makes use of the <literal>select:</literal> feature,
+and the selected components include both title and page number,
+then the value of this parameter is inserted between
+title and page number in the output.
+</para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/xref.with.number.and.title.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/xref.with.number.and.title.xml
new file mode 100644
index 0000000..06fcc7e
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/params/xref.with.number.and.title.xml
@@ -0,0 +1,30 @@
+<refentry xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:src="http://nwalsh.com/xmlns/litprog/fragment"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="5.0" xml:id="xref.with.number.and.title">
+<refmeta>
+<refentrytitle>xref.with.number.and.title</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>xref.with.number.and.title</refname>
+<refpurpose>Use number and title in cross references</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<src:fragment xml:id="xref.with.number.and.title.frag">
+<xsl:param name="xref.with.number.and.title" select="1"/>
+</src:fragment>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>A cross reference may include the number (for example, the number of
+an example or figure) and the <tag>title</tag> which is a required child of some
+targets. This parameter inserts both the relevant number as well as
+the title into the link. </para>
+
+</refsection>
+</refentry>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/profiling/profile-mode.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/profiling/profile-mode.xsl
new file mode 100644
index 0000000..c02132a
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/profiling/profile-mode.xsl
@@ -0,0 +1,239 @@
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:saxon="http://icl.com/saxon"
+ exclude-result-prefixes="saxon"
+ version="1.0">
+
+<!-- Should be base URI for imagedata and so on fixed? -->
+<xsl:param name="profile.baseuri.fixup" select="true()"/>
+
+<!-- Copy all non-element nodes -->
+<xsl:template match="@*|text()|comment()|processing-instruction()" mode="profile">
+ <xsl:copy/>
+</xsl:template>
+
+<!-- Profile elements based on input parameters -->
+<xsl:template match="*" mode="profile">
+
+ <xsl:variable name="arch.content">
+ <xsl:if test="@arch">
+ <xsl:call-template name="cross.compare">
+ <xsl:with-param name="a" select="$profile.arch"/>
+ <xsl:with-param name="b" select="@arch"/>
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:variable>
+ <xsl:variable name="arch.ok" select="not(@arch) or not($profile.arch) or
+ $arch.content != '' or @arch = ''"/>
+
+ <xsl:variable name="audience.content">
+ <xsl:if test="@audience">
+ <xsl:call-template name="cross.compare">
+ <xsl:with-param name="a" select="$profile.audience"/>
+ <xsl:with-param name="b" select="@audience"/>
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:variable>
+ <xsl:variable name="audience.ok"
+ select="not(@audience) or not($profile.audience) or
+ $audience.content != '' or @audience = ''"/>
+
+ <xsl:variable name="condition.content">
+ <xsl:if test="@condition">
+ <xsl:call-template name="cross.compare">
+ <xsl:with-param name="a" select="$profile.condition"/>
+ <xsl:with-param name="b" select="@condition"/>
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:variable>
+ <xsl:variable name="condition.ok" select="not(@condition) or not($profile.condition) or
+ $condition.content != '' or @condition = ''"/>
+
+ <xsl:variable name="conformance.content">
+ <xsl:if test="@conformance">
+ <xsl:call-template name="cross.compare">
+ <xsl:with-param name="a" select="$profile.conformance"/>
+ <xsl:with-param name="b" select="@conformance"/>
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:variable>
+ <xsl:variable name="conformance.ok" select="not(@conformance) or not($profile.conformance) or
+ $conformance.content != '' or @conformance = ''"/>
+
+ <xsl:variable name="lang.content">
+ <xsl:if test="@lang | @xml:lang">
+ <xsl:call-template name="cross.compare">
+ <xsl:with-param name="a" select="$profile.lang"/>
+ <xsl:with-param name="b" select="(@lang | @xml:lang)[1]"/>
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:variable>
+ <xsl:variable name="lang.ok" select="not(@lang | @xml:lang) or not($profile.lang) or
+ $lang.content != '' or @lang = '' or @xml:lang = ''"/>
+
+ <xsl:variable name="os.content">
+ <xsl:if test="@os">
+ <xsl:call-template name="cross.compare">
+ <xsl:with-param name="a" select="$profile.os"/>
+ <xsl:with-param name="b" select="@os"/>
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:variable>
+ <xsl:variable name="os.ok" select="not(@os) or not($profile.os) or
+ $os.content != '' or @os = ''"/>
+
+ <xsl:variable name="revision.content">
+ <xsl:if test="@revision">
+ <xsl:call-template name="cross.compare">
+ <xsl:with-param name="a" select="$profile.revision"/>
+ <xsl:with-param name="b" select="@revision"/>
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:variable>
+ <xsl:variable name="revision.ok" select="not(@revision) or not($profile.revision) or
+ $revision.content != '' or @revision = ''"/>
+
+ <xsl:variable name="revisionflag.content">
+ <xsl:if test="@revisionflag">
+ <xsl:call-template name="cross.compare">
+ <xsl:with-param name="a" select="$profile.revisionflag"/>
+ <xsl:with-param name="b" select="@revisionflag"/>
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:variable>
+ <xsl:variable name="revisionflag.ok" select="not(@revisionflag) or not($profile.revisionflag) or
+ $revisionflag.content != '' or @revisionflag = ''"/>
+
+ <xsl:variable name="role.content">
+ <xsl:if test="@role">
+ <xsl:call-template name="cross.compare">
+ <xsl:with-param name="a" select="$profile.role"/>
+ <xsl:with-param name="b" select="@role"/>
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:variable>
+ <xsl:variable name="role.ok" select="not(@role) or not($profile.role) or
+ $role.content != '' or @role = ''"/>
+
+ <xsl:variable name="security.content">
+ <xsl:if test="@security">
+ <xsl:call-template name="cross.compare">
+ <xsl:with-param name="a" select="$profile.security"/>
+ <xsl:with-param name="b" select="@security"/>
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:variable>
+ <xsl:variable name="security.ok" select="not(@security) or not($profile.security) or
+ $security.content != '' or @security = ''"/>
+
+ <xsl:variable name="status.content">
+ <xsl:if test="@status">
+ <xsl:call-template name="cross.compare">
+ <xsl:with-param name="a" select="$profile.status"/>
+ <xsl:with-param name="b" select="@status"/>
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:variable>
+ <xsl:variable name="status.ok" select="not(@status) or not($profile.status) or
+ $status.content != '' or @status = ''"/>
+
+ <xsl:variable name="userlevel.content">
+ <xsl:if test="@userlevel">
+ <xsl:call-template name="cross.compare">
+ <xsl:with-param name="a" select="$profile.userlevel"/>
+ <xsl:with-param name="b" select="@userlevel"/>
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:variable>
+ <xsl:variable name="userlevel.ok" select="not(@userlevel) or not($profile.userlevel) or
+ $userlevel.content != '' or @userlevel = ''"/>
+
+ <xsl:variable name="vendor.content">
+ <xsl:if test="@vendor">
+ <xsl:call-template name="cross.compare">
+ <xsl:with-param name="a" select="$profile.vendor"/>
+ <xsl:with-param name="b" select="@vendor"/>
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:variable>
+ <xsl:variable name="vendor.ok" select="not(@vendor) or not($profile.vendor) or
+ $vendor.content != '' or @vendor = ''"/>
+
+ <xsl:variable name="wordsize.content">
+ <xsl:if test="@wordsize">
+ <xsl:call-template name="cross.compare">
+ <xsl:with-param name="a" select="$profile.wordsize"/>
+ <xsl:with-param name="b" select="@wordsize"/>
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:variable>
+ <xsl:variable name="wordsize.ok"
+ select="not(@wordsize) or not($profile.wordsize) or
+ $wordsize.content != '' or @wordsize = ''"/>
+
+ <xsl:variable name="attribute.content">
+ <xsl:if test="@*[local-name()=$profile.attribute]">
+ <xsl:call-template name="cross.compare">
+ <xsl:with-param name="a" select="$profile.value"/>
+ <xsl:with-param name="b" select="@*[local-name()=$profile.attribute]"/>
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:variable>
+ <xsl:variable name="attribute.ok"
+ select="not(@*[local-name()=$profile.attribute]) or
+ not($profile.value) or $attribute.content != '' or
+ @*[local-name()=$profile.attribute] = '' or
+ not($profile.attribute)"/>
+
+ <xsl:if test="$arch.ok and
+ $audience.ok and
+ $condition.ok and
+ $conformance.ok and
+ $lang.ok and
+ $os.ok and
+ $revision.ok and
+ $revisionflag.ok and
+ $role.ok and
+ $security.ok and
+ $status.ok and
+ $userlevel.ok and
+ $vendor.ok and
+ $wordsize.ok and
+ $attribute.ok">
+ <xsl:copy>
+ <xsl:apply-templates mode="profile" select="@*"/>
+
+ <!-- Entity references must be replaced with filereferences for temporary tree -->
+ <xsl:if test="@entityref and $profile.baseuri.fixup">
+ <xsl:attribute name="fileref">
+ <xsl:value-of select="unparsed-entity-uri(@entityref)"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <!-- xml:base is eventually added to the root element -->
+ <xsl:if test="not(../..) and $profile.baseuri.fixup">
+ <xsl:call-template name="add-xml-base"/>
+ </xsl:if>
+
+ <xsl:apply-templates select="node()" mode="profile"/>
+ </xsl:copy>
+ </xsl:if>
+</xsl:template>
+
+<!-- Returns non-empty string if list in $b contains one ore more values from list $a -->
+<xsl:template name="cross.compare">
+ <xsl:param name="a"/>
+ <xsl:param name="b"/>
+ <xsl:param name="sep" select="$profile.separator"/>
+ <xsl:variable name="head" select="substring-before(concat($a, $sep), $sep)"/>
+ <xsl:variable name="tail" select="substring-after($a, $sep)"/>
+ <xsl:if test="contains(concat($sep, $b, $sep), concat($sep, $head, $sep))">1</xsl:if>
+ <xsl:if test="$tail">
+ <xsl:call-template name="cross.compare">
+ <xsl:with-param name="a" select="$tail"/>
+ <xsl:with-param name="b" select="$b"/>
+ </xsl:call-template>
+ </xsl:if>
+</xsl:template>
+
+</xsl:stylesheet>
+
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/profiling/profile.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/profiling/profile.xsl
new file mode 100644
index 0000000..b188fbb
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/profiling/profile.xsl
@@ -0,0 +1,56 @@
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="1.0">
+
+<!-- Include common profiling stylesheet -->
+<xsl:import href="profile-mode.xsl"/>
+
+<!-- This file must be included, because profile-mode is using templates from it -->
+<xsl:import href="../common/stripns.xsl"/>
+
+<!-- In the two pass processing there is no need for base URI fixup -->
+<xsl:param name="profile.baseuri.fixup" select="false()"/>
+
+<!-- If you need to validate profiled content against DTD,
+ create customization that will import this stylesheet and
+ will use xsl:output (see example bellow) to output reference
+ to the desired DTD version. -->
+<!-- Generate DocBook instance with correct DOCTYPE -->
+<!--
+<xsl:output method="xml"
+ doctype-public="-//OASIS//DTD DocBook XML V4.5//EN"
+ doctype-system="http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd"/>
+-->
+
+<!-- Profiling parameters -->
+<xsl:param name="profile.arch" select="''"/>
+<xsl:param name="profile.audience" select="''"/>
+<xsl:param name="profile.condition" select="''"/>
+<xsl:param name="profile.conformance" select="''"/>
+<xsl:param name="profile.lang" select="''"/>
+<xsl:param name="profile.os" select="''"/>
+<xsl:param name="profile.revision" select="''"/>
+<xsl:param name="profile.revisionflag" select="''"/>
+<xsl:param name="profile.role" select="''"/>
+<xsl:param name="profile.security" select="''"/>
+<xsl:param name="profile.status" select="''"/>
+<xsl:param name="profile.userlevel" select="''"/>
+<xsl:param name="profile.vendor" select="''"/>
+<xsl:param name="profile.wordsize" select="''"/>
+<xsl:param name="profile.attribute" select="''"/>
+<xsl:param name="profile.value" select="''"/>
+<xsl:param name="profile.separator" select="';'"/>
+
+<xsl:param name="exsl.node.set.available">
+ <xsl:choose>
+ <xsl:when xmlns:exsl="http://exslt.org/common" exsl:foo="" test="function-available('exsl:node-set') or contains(system-property('xsl:vendor'), 'Apache Software Foundation')">1</xsl:when>
+ <xsl:otherwise>0</xsl:otherwise>
+ </xsl:choose>
+</xsl:param>
+
+<!-- Call common profiling mode -->
+<xsl:template match="/">
+ <xsl:apply-templates select="." mode="profile"/>
+</xsl:template>
+
+</xsl:stylesheet>
+
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/profiling/strip-attributes.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/profiling/strip-attributes.xsl
new file mode 100644
index 0000000..d6f55fb
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/profiling/strip-attributes.xsl
@@ -0,0 +1,27 @@
+<?xml version="1.0"?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="1.0">
+
+<xsl:output method="xml"/>
+
+<xsl:param name="attributes" select="''"/>
+
+<xsl:variable name="strip-attributes"
+ select="concat(' ', normalize-space($attributes), ' ')"/>
+
+<xsl:template match="@*|text()|comment()|processing-instruction()">
+ <xsl:copy/>
+</xsl:template>
+
+<xsl:template match="*">
+ <xsl:copy>
+ <xsl:for-each select="@*">
+ <xsl:if test="not(contains($strip-attributes, concat(' ',name(.),' ')))">
+ <xsl:copy-of select="."/>
+ </xsl:if>
+ </xsl:for-each>
+ <xsl:apply-templates select="node()"/>
+ </xsl:copy>
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/profiling/xsl2profile.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/profiling/xsl2profile.xsl
new file mode 100644
index 0000000..b6648aa
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/profiling/xsl2profile.xsl
@@ -0,0 +1,159 @@
+<?xml version="1.0"?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:xslo="http://www.w3.org/1999/XSL/TransformAlias"
+ xmlns:fo="http://www.w3.org/1999/XSL/Format"
+ exclude-result-prefixes="fo"
+ version="1.0">
+
+<xsl:include href="../lib/lib.xsl"/>
+
+<xsl:output method="xml" encoding="US-ASCII"/>
+
+<xsl:namespace-alias stylesheet-prefix="xslo" result-prefix="xsl"/>
+
+<xsl:preserve-space elements="*"/>
+
+<xsl:template match="/">
+ <xsl:comment>This file was created automatically by xsl2profile</xsl:comment>
+ <xsl:comment>from the DocBook XSL stylesheets.</xsl:comment>
+ <xsl:apply-templates/>
+</xsl:template>
+
+<!-- Make sure we override some templates and parameters appropriately for XHTML -->
+<xsl:template match="xsl:stylesheet">
+ <xsl:copy>
+ <xsl:attribute name="exslt:dummy" xmlns:exslt="http://exslt.org/common">dummy</xsl:attribute>
+ <xsl:attribute name="ng:dummy" xmlns:ng="http://docbook.org/docbook-ng">dummy</xsl:attribute>
+ <xsl:attribute name="db:dummy" xmlns:db="http://docbook.org/ns/docbook">dummy</xsl:attribute>
+ <xsl:if test="not(@extension-element-prefixes)">
+ <xsl:attribute name="extension-element-prefixes">exslt</xsl:attribute>
+ </xsl:if>
+ <xsl:if test="not(@exclude-result-prefixes)">
+ <xsl:attribute name="exclude-result-prefixes">exslt</xsl:attribute>
+ </xsl:if>
+ <xsl:for-each select="@*">
+ <xsl:choose>
+ <xsl:when test="local-name(.) = 'extension-element-prefixes' or
+ local-name(.) = 'exclude-result-prefixes'">
+ <xsl:attribute name="{local-name(.)}"><xsl:value-of select="concat(., ' exslt')"/></xsl:attribute>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:attribute name="{local-name(.)}"><xsl:value-of select="."/></xsl:attribute>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:for-each>
+ <xsl:apply-templates/>
+ </xsl:copy>
+</xsl:template>
+
+<xsl:template match="*">
+ <xsl:copy>
+ <xsl:copy-of select="@*"/>
+ <xsl:apply-templates/>
+ </xsl:copy>
+</xsl:template>
+
+<xsl:template match="comment()|processing-instruction()|text()">
+ <xsl:copy/>
+</xsl:template>
+
+<xsl:template match="xsl:template[@match='/']">
+ <xslo:include href="../profiling/profile-mode.xsl"/>
+ <xslo:variable name="profiled-content">
+ <xslo:choose>
+ <xslo:when test="*/self::ng:* or */self::db:*">
+ <xslo:message>Note: namesp. cut : stripped namespace before processing</xslo:message>
+ <xslo:variable name="stripped-content">
+ <xslo:apply-templates select="/" mode="stripNS"/>
+ </xslo:variable>
+ <xslo:message>Note: namesp. cut : processing stripped document</xslo:message>
+ <xslo:apply-templates select="exslt:node-set($stripped-content)" mode="profile"/>
+ </xslo:when>
+ <xslo:otherwise>
+ <xslo:apply-templates select="/" mode="profile"/>
+ </xslo:otherwise>
+ </xslo:choose>
+ </xslo:variable>
+ <xslo:variable name="profiled-nodes" select="exslt:node-set($profiled-content)"/>
+ <xsl:copy>
+ <xsl:copy-of select="@*"/>
+ <xsl:apply-templates mode="correct"/>
+ </xsl:copy>
+</xsl:template>
+
+<xsl:template match="xsl:template[@name='hhc-main' or @name='hhp-main' or @name='hhk' or @name='hh-map' or @name='hh-alias' or @name='etoc'] | xsl:variable[@name='raw.help.title']">
+ <xsl:copy>
+ <xsl:copy-of select="@*"/>
+ <xsl:apply-templates mode="correct"/>
+ </xsl:copy>
+</xsl:template>
+
+<xsl:template match="*[starts-with(@select, '/')]" mode="correct">
+ <xsl:copy>
+ <xsl:for-each select="@*">
+ <xsl:choose>
+ <xsl:when test="local-name(.) = 'select' and string(.) = '/'">
+ <xsl:attribute name="{local-name(.)}">$profiled-nodes</xsl:attribute>
+ </xsl:when>
+ <xsl:when test="local-name(.) = 'select' and starts-with(., '/')">
+ <xsl:attribute name="{local-name(.)}">$profiled-nodes<xsl:value-of select="."/></xsl:attribute>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:attribute name="{local-name(.)}"><xsl:value-of select="."/></xsl:attribute>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:for-each>
+ <xsl:apply-templates mode="correct"/>
+ </xsl:copy>
+</xsl:template>
+
+<xsl:template match='*[contains(@*, "key(&apos;id&apos;,$rootid)")]' mode="correct" priority="2">
+ <xsl:copy>
+ <xsl:for-each select="@*">
+ <xsl:choose>
+ <xsl:when test='contains(., "key(&apos;id&apos;,$rootid)")'>
+ <xsl:attribute name="{local-name(.)}">
+ <xsl:call-template name="string.subst">
+ <xsl:with-param name="string" select="."/>
+ <xsl:with-param name="target">key('id',$rootid)</xsl:with-param>
+ <xsl:with-param name="replacement">$profiled-nodes//*[@id=$rootid]</xsl:with-param>
+ </xsl:call-template>
+ </xsl:attribute>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:attribute name="{local-name(.)}"><xsl:value-of select="."/></xsl:attribute>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:for-each>
+ <xsl:apply-templates mode="correct"/>
+ </xsl:copy>
+</xsl:template>
+
+<!-- FO stylesheet has apply-templates without select, we must detect it by context -->
+<xsl:template match="fo:root//xsl:apply-templates" mode="correct">
+ <xsl:copy>
+ <xsl:copy-of select="@*"/>
+ <xsl:attribute name="select">$profiled-nodes/node()</xsl:attribute>
+ <xsl:apply-templates mode="correct"/>
+ </xsl:copy>
+</xsl:template>
+
+<!-- DB5 namespace stripping is already done -->
+<xsl:template match="xsl:when[contains(@test, 'self::db')]" mode="correct">
+ <xsl:copy>
+ <xsl:attribute name="test">false()</xsl:attribute>
+ </xsl:copy>
+</xsl:template>
+
+<xsl:template match="*" mode="correct">
+ <xsl:copy>
+ <xsl:copy-of select="@*"/>
+ <xsl:apply-templates mode="correct"/>
+ </xsl:copy>
+</xsl:template>
+
+<xsl:template match="comment()|processing-instruction()|text()" mode="correct">
+ <xsl:copy/>
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/roundtrip/blocks-spec.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/roundtrip/blocks-spec.xml
new file mode 100644
index 0000000..d8ab005
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/roundtrip/blocks-spec.xml
@@ -0,0 +1,11 @@
+<group:root xmlns:group='http://www.explain.com.au/grouping'>
+ <bibliography styles='bibliography bibliography-title'>
+ <bibliodiv styles='bibliodiv bibliodiv-title'/>
+ </bibliography>
+ <glossary styles='glossary glossary-title'>
+ <glossdiv styles='glossdiv glossdiv-title'/>
+ </glossary>
+ <qandaset styles='qandaset qandaset-title'>
+ <qandadiv styles='qandadiv qandadiv-title'/>
+ </qandaset>
+</group:root>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/roundtrip/blocks2dbk.dtd b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/roundtrip/blocks2dbk.dtd
new file mode 100644
index 0000000..4d1ea04
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/roundtrip/blocks2dbk.dtd
@@ -0,0 +1,76 @@
+ <!ENTITY components-extra ""> <!-- for customisation -->
+ <!ENTITY components "dbk:appendix |
+ dbk:article |
+ dbk:book |
+ dbk:chapter |
+ dbk:part |
+ dbk:preface |
+ dbk:section |
+ dbk:sect1 |
+ dbk:sect2 |
+ dbk:sect3 |
+ dbk:sect4 |
+ dbk:sect5
+ &components-extra;">
+
+ <!ENTITY blocks-extra ""> <!-- for customisation -->
+ <!ENTITY blocks "dbk:bibliography |
+ dbk:bibliodiv |
+ dbk:glossary |
+ dbk:glossdiv |
+ dbk:qandaset |
+ dbk:qandadiv
+ &blocks-extra;">
+
+ <!ENTITY metadata-extra ""> <!-- for customisation -->
+ <!ENTITY metadata-content 'contains(@rnd:style, "-title") or
+ contains(@rnd:style, "-subtitle") or
+ @rnd:style = "abstract" or
+ @rnd:style = "address" or
+ @rnd:style = "affiliation" or
+ @rnd:style = "author" or
+ @rnd:style = "biblioid" or
+ @rnd:style = "bibliomisc" or
+ @rnd:style = "bibliosource" or
+ @rnd:style = "contrib" or
+ @rnd:style = "date" or
+ @rnd:style = "edition" or
+ @rnd:style = "editor" or
+ @rnd:style = "email" or
+ @rnd:style = "issuenum" or
+ @rnd:style = "keyword" or
+ @rnd:style = "legalnotice" or
+ @rnd:style = "othercredit" or
+ @rnd:style = "pagenums" or
+ @rnd:style = "personblurb" or
+ @rnd:style = "pubdate" or
+ @rnd:style = "publisher" or
+ @rnd:style = "publisher-address" or
+ @rnd:style = "releaseinfo" or
+ @rnd:style = "revhistory" or
+ @rnd:style = "revision" or
+ @rnd:style = "volumenum"
+ &metadata-extra;'>
+
+ <!ENTITY author-extra ""> <!-- for customisation -->
+ <!ENTITY author-content '@rnd:style = "personblurb" or
+ @rnd:style = "address" or
+ @rnd:style = "affiliation" or
+ @rnd:style = "contrib" or
+ @rnd:style = "email"
+ &author-extra;'>
+
+ <!ENTITY admonition-extra ""> <!-- for customisation -->
+ <!ENTITY admonition '@rnd:style = "caution" or
+ @rnd:style = "important" or
+ @rnd:style = "note" or
+ @rnd:style = "tip" or
+ @rnd:style = "warning"
+ &admonition-extra;'>
+ <!ENTITY admonition-title-extra ""> <!-- for customisation -->
+ <!ENTITY admonition-title '@rnd:style = "caution-title" or
+ @rnd:style = "important-title" or
+ @rnd:style = "note-title" or
+ @rnd:style = "tip-title" or
+ @rnd:style = "warning-title"
+ &admonition-title-extra;'>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/roundtrip/blocks2dbk.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/roundtrip/blocks2dbk.xsl
new file mode 100644
index 0000000..e14999f
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/roundtrip/blocks2dbk.xsl
@@ -0,0 +1,1732 @@
+<!DOCTYPE xsl:stylesheet [
+<!-- External DTD defines entities:
+ components :- QNames of component-level elements
+ blocks :- QNames of block-level elements
+ metadata-content :- XPath expression matching metadata styles
+ author-content :- XPath expression matching author styles
+ admonition :- XPath expression matching admonition styles
+ admonition-title :- XPath expression matching admonition title styles
+-->
+<!ENTITY % ext SYSTEM "blocks2dbk.dtd">
+%ext;
+]>
+<xsl:stylesheet version="1.0"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:dbk='http://docbook.org/ns/docbook'
+ xmlns:rnd='http://docbook.org/ns/docbook/roundtrip'
+ xmlns:xlink='http://www.w3.org/1999/xlink'>
+
+ <!-- $Id: blocks2dbk.xsl 8137 2008-10-09 03:37:56Z balls $ -->
+ <!-- Stylesheet to convert word processing docs to DocBook -->
+ <!-- This stylesheet processes the output of sections2blocks.xsl -->
+
+ <xsl:output indent="yes" method="xml"
+ cdata-section-elements='dbk:programlisting dbk:literallayout'/>
+
+ <!-- ================================================== -->
+ <!-- Parameters -->
+ <!-- ================================================== -->
+
+ <xsl:param name='docbook5'>0</xsl:param>
+ <xsl:param name="nest.sections">1</xsl:param>
+
+ <xsl:strip-space elements='*'/>
+ <xsl:preserve-space elements='dbk:para dbk:emphasis'/>
+
+ <xsl:template match="&components; |
+ &blocks;">
+ <xsl:choose>
+ <xsl:when test='self::dbk:article and
+ count(dbk:book) = 1 and
+ count(dbk:info|dbk:book) &lt;= 2'>
+ <xsl:apply-templates select='dbk:book'/>
+ </xsl:when>
+ <xsl:when test='self::dbk:article and
+ *[1][self::dbk:para] and
+ *[1]/@rnd:style != "article-title" and
+ contains(*[1]/@rnd:style, "-title")'>
+ <xsl:variable name='element-name'
+ select='substring-before(*[1]/@rnd:style, "-title")'/>
+ <xsl:element name='{$element-name}'
+ namespace='http://docbook.org/ns/docbook'>
+ <dbk:info>
+ <xsl:apply-templates select='*[1]'
+ mode='rnd:metadata'/>
+ </dbk:info>
+ <xsl:apply-templates/>
+ </xsl:element>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:copy>
+ <xsl:call-template name='rnd:attributes'/>
+
+ <xsl:variable name='metadata'>
+ <xsl:apply-templates select='*[1]'
+ mode='rnd:metadata'/>
+ </xsl:variable>
+ <xsl:if test='$metadata'>
+ <dbk:info>
+ <xsl:copy-of select='$metadata'/>
+ </dbk:info>
+ </xsl:if>
+
+ <xsl:apply-templates/>
+ </xsl:copy>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+ <xsl:template match='dbk:book-component'>
+ <xsl:variable name='element-name'
+ select='substring-before(*[1]/@rnd:style, "-title")'/>
+
+ <xsl:element name='{$element-name}'
+ namespace='http://docbook.org/ns/docbook'>
+ <dbk:info>
+ <xsl:apply-templates select='*[1]'
+ mode='rnd:metadata'/>
+ </dbk:info>
+ <xsl:apply-templates/>
+ </xsl:element>
+ </xsl:template>
+
+ <xsl:template match="dbk:para" name='rnd:para'>
+ <!-- Some elements are normally suppressed,
+ since they are processed in a different context.
+ If this parameter is false then the element will be processed normally.
+ -->
+ <xsl:param name='suppress' select='true()'/>
+
+ <!-- This paragraph may be in a sidebar -->
+ <xsl:variable name='sidebar'
+ select='preceding-sibling::*[self::dbk:para and @rnd:style = "sidebar-title"][1]'/>
+
+ <!-- This paragraph may be in the textobject of a table or figure -->
+ <xsl:variable name='table'
+ select='preceding-sibling::dbk:informaltable[1]'/>
+ <xsl:variable name='figure'
+ select='preceding-sibling::dbk:para[@rnd:style = "informalfigure-imagedata" or (dbk:inlinemediaobject and count(*) = 1 and normalize-space(.) = "")][1]'/>
+ <xsl:variable name='caption'
+ select='following-sibling::dbk:para[@rnd:style = "caption" or @rnd:style = "Caption"]'/>
+
+ <xsl:choose>
+ <!-- continue style paragraphs are handled in context -->
+ <xsl:when test='$suppress and
+ @rnd:style = "para-continue"'/>
+
+ <!-- Certain elements gather the following paragraph -->
+ <xsl:when test='$suppress and
+ preceding-sibling::*[1][self::dbk:para and
+ @rnd:style = "example-title"]'/>
+
+ <xsl:when test='$suppress and
+ $sidebar and
+ not(preceding-sibling::dbk:para[(not(@rnd:style) or @rnd:style = "") and
+ preceding-sibling::*[preceding-sibling::*[generate-id() = generate-id($sidebar)]]])'/>
+
+ <!-- Separate processing is performed for table/figure titles and captions -->
+ <xsl:when test='$suppress and
+ @rnd:style = "table-title" and
+ following-sibling::*[1][self::dbk:informaltable|self::dbk:para[@rnd:style = "informalfigure-imagedata"]|self::dbk:para[dbk:inlinemediaobject and count(*) = 1 and normalize-space() = ""]]'/>
+ <xsl:when test='$suppress and
+ @rnd:style = "figure-title" and
+ following-sibling::*[1][self::dbk:para][@rnd:style = "informalfigure-imagedata" or (dbk:inlinemediaobject and count(*) = 1 and normalize-space(.) = "")]'/>
+ <xsl:when test='$suppress and
+ (@rnd:style = "caption" or @rnd:style = "Caption") and
+ (preceding-sibling::*[self::dbk:informaltable] or
+ preceding-sibling::*[self::dbk:para][@rnd:style = "informalfigure-imagedata" or (dbk:inlinemediaobject and count(*) = 1 and normalize-space(.) = "")])'/>
+
+ <xsl:when test='$suppress and
+ $table and
+ $caption and
+ generate-id($caption/preceding-sibling::dbk:informaltable[1]) = generate-id($table)'/>
+ <xsl:when test='$suppress and
+ $figure and
+ $caption and
+ generate-id($caption/preceding-sibling::dbk:para[@rnd:style = "informalfigure-imagedata" or (dbk:inlinemediaobject and count(*) = 1 and normalize-space(.) = "")][1]) = generate-id($figure)'/>
+
+ <xsl:when test='@rnd:style = "imagedata-metadata" or
+ @rnd:style = "table-metadata"'/>
+
+ <!-- Ignore empty paragraphs -->
+ <xsl:when test='(not(@rnd:style) or
+ @rnd:style = "") and
+ normalize-space(.) = "" and
+ not(*)'/>
+
+ <!-- Image inline or block? -->
+ <xsl:when test='(not(@rnd:style) or
+ @rnd:style = "") and
+ normalize-space(.) = "" and
+ count(*) = 1 and
+ dbk:inlinemediaobject'>
+ <xsl:apply-templates/>
+ </xsl:when>
+ <xsl:when test='not(@rnd:style) or
+ @rnd:style = "" or
+ @rnd:style = "para-continue"'>
+ <dbk:para>
+ <xsl:call-template name='rnd:attributes'/>
+ <xsl:apply-templates/>
+ </dbk:para>
+ </xsl:when>
+
+ <xsl:when test='@rnd:style = "xinclude"'
+ xmlns:xi='http://www.w3.org/2001/XInclude'>
+ <xi:include>
+ <xsl:attribute name='href'>
+ <xsl:apply-templates mode='rnd:xinclude'/>
+ </xsl:attribute>
+ </xi:include>
+ </xsl:when>
+
+ <xsl:when test='$suppress and
+ preceding-sibling::*[1]/self::dbk:para[&admonition-title;]'/>
+ <xsl:when test='&admonition-title;'>
+ <xsl:element name='{substring-before(@rnd:style, "-title")}'
+ namespace='http://docbook.org/ns/docbook'>
+ <xsl:call-template name='rnd:attributes'/>
+ <dbk:title>
+ <xsl:apply-templates/>
+ </dbk:title>
+ <xsl:apply-templates select='following-sibling::*[1]'>
+ <xsl:with-param name='suppress' select='false()'/>
+ </xsl:apply-templates>
+ <xsl:apply-templates select='following-sibling::*[2]'
+ mode='rnd:continue'/>
+ </xsl:element>
+ </xsl:when>
+
+ <xsl:when test='starts-with(@rnd:style, "itemizedlist") or
+ starts-with(@rnd:style, "orderedlist")'>
+
+ <xsl:variable name='stop.node'
+ select='following-sibling::dbk:para[not(@rnd:style) or
+ (not(starts-with(@rnd:style, "itemizedlist") or starts-with(@rnd:style, "orderedlist")) and @rnd:style != "para-continue")][1]'/>
+
+ <xsl:choose>
+ <xsl:when test='translate(substring-after(@rnd:style, "list"), "0123456789", "") != "" or
+ substring-after(@rnd:style, "list") = ""'>
+ <xsl:call-template name='rnd:error'>
+ <xsl:with-param name='code' select='"list-bad-level"'/>
+ <xsl:with-param name='message'>style "<xsl:value-of select='@rnd:style'/>" is not a valid list style</xsl:with-param>
+ </xsl:call-template>
+ </xsl:when>
+
+ <!-- TODO: the previous para-continue may not be associated with a list -->
+
+ <!-- NB. Look back at the previous paragraph. There may be intervening tables or images. -->
+ <xsl:when test='preceding-sibling::dbk:para[1][starts-with(@rnd:style, "itemizedlist") or starts-with(@rnd:style, "orderedlist") or @rnd:style = "para-continue"]'/>
+ <xsl:when test='substring-after(@rnd:style, "list") != 1'>
+ <xsl:call-template name='rnd:error'>
+ <xsl:with-param name='code'>list-wrong-level</xsl:with-param>
+ <xsl:with-param name='message'>list started at the wrong level</xsl:with-param>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test='$stop.node'>
+ <xsl:element name='{substring-before(@rnd:style, "1")}'
+ namespace='http://docbook.org/ns/docbook'>
+ <xsl:apply-templates select='.|following-sibling::dbk:para[@rnd:style = current()/@rnd:style][following-sibling::*[generate-id() = generate-id($stop.node)]]'
+ mode='rnd:listitem'/>
+ </xsl:element>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:element name='{substring-before(@rnd:style, "1")}'
+ namespace='http://docbook.org/ns/docbook'>
+ <xsl:apply-templates select='.|following-sibling::dbk:para[@rnd:style = current()/@rnd:style]'
+ mode='rnd:listitem'/>
+ </xsl:element>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+
+ <xsl:when test='@rnd:style = "programlisting" and
+ preceding-sibling::*[1][self::dbk:para and @rnd:style = "programlisting"]'/>
+ <xsl:when test='@rnd:style = "literallayout" and
+ preceding-sibling::*[1][self::dbk:para and @rnd:style = "literallayout"]'/>
+ <xsl:when test='@rnd:style = "programlisting" or
+ @rnd:style = "literallayout"'>
+
+ <xsl:variable name='stop.node'
+ select='following-sibling::dbk:para[@rnd:style != current()/@rnd:style][1]'/>
+
+ <xsl:element name='{@rnd:style}'
+ namespace='http://docbook.org/ns/docbook'>
+ <xsl:apply-templates/>
+
+ <xsl:choose>
+ <xsl:when test='$stop.node'>
+ <xsl:apply-templates select='following-sibling::dbk:para[following-sibling::*[generate-id() = generate-id($stop.node)]]'
+ mode='rnd:programlisting'/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select='following-sibling::dbk:para'
+ mode='rnd:programlisting'/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:element>
+ </xsl:when>
+
+ <xsl:when test='@rnd:style = "example-title"'>
+ <xsl:element name='{substring-before(@rnd:style, "-title")}'
+ namespace='http://docbook.org/ns/docbook'>
+ <xsl:call-template name='rnd:attributes'/>
+ <dbk:title>
+ <xsl:apply-templates/>
+ </dbk:title>
+
+ <xsl:apply-templates select='following-sibling::*[1]'>
+ <xsl:with-param name='suppress' select='false()'/>
+ </xsl:apply-templates>
+ </xsl:element>
+ </xsl:when>
+
+ <xsl:when test='@rnd:style = "sidebar-title"'>
+ <!-- TODO: next sidebar should stop this sidebar -->
+ <xsl:variable name='stop.node'
+ select='following-sibling::dbk:para[(not(@rnd:style) or @rnd:style = "") and
+ normalize-space(.) = ""][1]'/>
+
+ <dbk:sidebar>
+ <xsl:call-template name='rnd:attributes'/>
+ <dbk:info>
+ <dbk:title>
+ <xsl:apply-templates/>
+ </dbk:title>
+ </dbk:info>
+
+ <xsl:choose>
+ <xsl:when test='$stop.node'>
+ <xsl:apply-templates select='following-sibling::*[following-sibling::*[generate-id() = generate-id($stop.node)]]'
+ mode='rnd:sidebar'/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select='following-sibling::*'
+ mode='rnd:sidebar'/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </dbk:sidebar>
+ </xsl:when>
+
+ <xsl:when test='&admonition;'>
+ <xsl:element name='{@rnd:style}'
+ namespace='http://docbook.org/ns/docbook'>
+ <xsl:call-template name='rnd:attributes'/>
+ <dbk:para>
+ <xsl:apply-templates/>
+ </dbk:para>
+ <xsl:apply-templates select='following-sibling::*[1]'
+ mode='rnd:continue'/>
+ </xsl:element>
+ </xsl:when>
+
+ <!-- TODO: make sure this is in a bibliography.
+ If not, create a bibliolist.
+ -->
+ <xsl:when test='@rnd:style = "bibliomixed"'>
+ <dbk:bibliomixed>
+ <xsl:call-template name='rnd:attributes'/>
+ <xsl:apply-templates/>
+ </dbk:bibliomixed>
+ </xsl:when>
+ <xsl:when test='@rnd:style = "biblioentry-title"'>
+ <dbk:biblioentry>
+ <xsl:call-template name='rnd:attributes'/>
+ <dbk:title>
+ <xsl:apply-templates/>
+ </dbk:title>
+ <xsl:if test='following-sibling::*[1][&metadata-content;]'>
+ <xsl:apply-templates select='following-sibling::*[1]'
+ mode='rnd:metadata'/>
+ </xsl:if>
+ </dbk:biblioentry>
+ </xsl:when>
+
+ <xsl:when test='@rnd:style = "blockquote-attribution" and
+ preceding-sibling::*[1][self::dbk:para][@rnd:style = "blockquote-title" or @rnd:style = "blockquote"]'/>
+ <xsl:when test='@rnd:style = "blockquote-attribution"'>
+ <xsl:call-template name='rnd:error'>
+ <xsl:with-param name='code'>improper-blockquote-attribution</xsl:with-param>
+ <xsl:with-param name='message'>blockquote attribution must follow a blockquote title</xsl:with-param>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test='@rnd:style = "blockquote" or
+ @rnd:style = "blockquote-title"'>
+ <xsl:choose>
+ <xsl:when test='@rnd:style = "blockquote" and
+ preceding-sibling::*[1][self::dbk:para][starts-with(@rnd:style, "blockquote")]'/>
+ <xsl:otherwise>
+
+ <xsl:variable name='stop.node'
+ select='following-sibling::*[not(@rnd:style = "blockquote" or
+ @rnd:style = "blockquote-attribution")][1]'/>
+
+ <dbk:blockquote>
+ <xsl:call-template name='rnd:attributes'/>
+ <xsl:if test='@rnd:style = "blockquote-title"'>
+ <dbk:info>
+ <dbk:title>
+ <xsl:apply-templates/>
+ </dbk:title>
+ </dbk:info>
+ </xsl:if>
+ <xsl:choose>
+ <xsl:when test='$stop.node'>
+ <xsl:apply-templates select='following-sibling::*[following-sibling::*[generate-id() = generate-id($stop.node)]][@rnd:style = "blockquote-attribution"]' mode='rnd:blockquote-attribution'/>
+ <xsl:apply-templates select='self::*[@rnd:style = "blockquote"] |
+ following-sibling::*[following-sibling::*[generate-id() = generate-id($stop.node)]]'
+ mode='rnd:blockquote'/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select='following-sibling::*[@rnd:style = "blockquote-attribution"]' mode='rnd:blockquote-attribution'/>
+ <xsl:apply-templates select='self::*[@rnd:style = "blockquote"] |
+ following-sibling::*'
+ mode='rnd:blockquote'/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </dbk:blockquote>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+
+ <xsl:when test='@rnd:style = "bridgehead"'>
+ <xsl:element name='{@rnd:style}'
+ namespace='http://docbook.org/ns/docbook'>
+ <xsl:call-template name='rnd:attributes'/>
+ <xsl:apply-templates/>
+ </xsl:element>
+ </xsl:when>
+
+ <xsl:when test='@rnd:style = "formalpara-title"'>
+ <dbk:formalpara>
+ <dbk:title>
+ <xsl:call-template name='rnd:attributes'/>
+ <xsl:apply-templates/>
+ </dbk:title>
+ <xsl:choose>
+ <xsl:when test='following-sibling::*[1][self::dbk:para][@rnd:style = "formalpara"]'>
+ <dbk:para>
+ <xsl:call-template name='rnd:attributes'>
+ <xsl:with-param name='node'
+ select='following-sibling::*[1]'/>
+ </xsl:call-template>
+ <xsl:apply-templates select='following-sibling::*[1]/node()'/>
+ </dbk:para>
+ </xsl:when>
+ </xsl:choose>
+ </dbk:formalpara>
+ </xsl:when>
+ <xsl:when test='@rnd:style = "formalpara" and
+ preceding-sibling::*[1][self::dbk:para][@rnd:style = "formalpara-title"]'/>
+ <xsl:when test='@rnd:style = "formalpara"'>
+ <xsl:call-template name='rnd:error'>
+ <xsl:with-param name='code'>formalpara-notitle</xsl:with-param>
+ <xsl:with-param name='message'>formalpara used without a title</xsl:with-param>
+ </xsl:call-template>
+ </xsl:when>
+
+ <xsl:when test='@rnd:style = "informalfigure-imagedata"'>
+ <xsl:variable name='caption.next'
+ select='following-sibling::dbk:para[@rnd:style = "caption" or @rnd:style = "Caption"][1]'/>
+
+ <xsl:variable name='metadata'
+ select='preceding-sibling::*[1][self::dbk:para][@rnd:style = "imagedata-metadata"]'/>
+
+ <xsl:choose>
+ <xsl:when test='preceding-sibling::*[1][self::dbk:para][@rnd:style = "figure-title"] or
+ ($metadata and preceding-sibling::*[2][self::dbk:para][@rnd:style = "figure-title"])'>
+ <dbk:figure>
+ <xsl:call-template name='rnd:attributes'/>
+ <dbk:info>
+ <dbk:title>
+ <xsl:choose>
+ <xsl:when test='$metadata'>
+ <xsl:apply-templates
+ select='preceding-sibling::*[2]/node()'/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates
+ select='preceding-sibling::*[1]/node()'/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </dbk:title>
+ </dbk:info>
+ <dbk:mediaobject>
+ <dbk:imageobject>
+ <dbk:imagedata>
+ <xsl:attribute name='fileref'>
+ <xsl:choose>
+ <xsl:when test='dbk:inlinemediaobject/dbk:imageobject/dbk:imagedata/@fileref != ""'>
+ <xsl:value-of select='dbk:inlinemediaobject/dbk:imageobject/dbk:imagedata/@fileref'/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select='.'/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:attribute>
+ <xsl:call-template name='rnd:imagedata-attributes'>
+ <xsl:with-param name='metadata' select='$metadata'/>
+ </xsl:call-template>
+ </dbk:imagedata>
+ </dbk:imageobject>
+ </dbk:mediaobject>
+ <xsl:call-template name='rnd:figure-text-caption'>
+ <xsl:with-param name='caption' select='$caption.next'/>
+ </xsl:call-template>
+ </dbk:figure>
+ </xsl:when>
+ <xsl:when test='preceding-sibling::*[1][self::dbk:para][@rnd:style = "table-title"] or
+ ($metadata and preceding-sibling::*[2][self::dbk:para][@rnd:style = "table-title"])'>
+ <dbk:table>
+ <xsl:call-template name='rnd:attributes'/>
+ <dbk:info>
+ <dbk:title>
+ <xsl:choose>
+ <xsl:when test='$metadata'>
+ <xsl:apply-templates
+ select='preceding-sibling::*[2]/node()'/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates
+ select='preceding-sibling::*[1]/node()'/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </dbk:title>
+ </dbk:info>
+
+ <dbk:mediaobject>
+ <dbk:imageobject>
+ <dbk:imagedata>
+ <xsl:attribute name='fileref'>
+ <xsl:choose>
+ <xsl:when test='dbk:inlinemediaobject/dbk:imageobject/dbk:imagedata/@fileref != ""'>
+ <xsl:value-of select='dbk:inlinemediaobject/dbk:imageobject/dbk:imagedata/@fileref'/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select='.'/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:attribute>
+ <xsl:call-template name='rnd:imagedata-attributes'>
+ <xsl:with-param name='metadata' select='$metadata'/>
+ </xsl:call-template>
+ </dbk:imagedata>
+ </dbk:imageobject>
+ </dbk:mediaobject>
+ <xsl:call-template name='rnd:figure-text-caption'>
+ <xsl:with-param name='caption' select='$caption.next'/>
+ </xsl:call-template>
+ </dbk:table>
+ </xsl:when>
+ <xsl:otherwise>
+ <dbk:informalfigure>
+ <xsl:call-template name='rnd:attributes'/>
+ <dbk:mediaobject>
+ <dbk:imageobject>
+ <dbk:imagedata>
+ <xsl:attribute name='fileref'>
+ <xsl:choose>
+ <xsl:when test='dbk:inlinemediaobject/dbk:imageobject/dbk:imagedata/@fileref != ""'>
+ <xsl:value-of select='dbk:inlinemediaobject/dbk:imageobject/dbk:imagedata/@fileref'/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select='.'/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:attribute>
+ <xsl:call-template name='rnd:imagedata-attributes'>
+ <xsl:with-param name='metadata' select='$metadata'/>
+ </xsl:call-template>
+ </dbk:imagedata>
+ </dbk:imageobject>
+ </dbk:mediaobject>
+ <xsl:call-template name='rnd:figure-text-caption'>
+ <xsl:with-param name='caption' select='$caption.next'/>
+ </xsl:call-template>
+ </dbk:informalfigure>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+
+ <xsl:when test='(@rnd:style = "caption" or @rnd:style = "Caption") and
+ preceding-sibling::*[(self::dbk:para and contains(@rnd:style, "imagedata")) or self::dbk:informaltable]'/>
+ <xsl:when test='@rnd:style = "caption" or @rnd:style = "Caption"'>
+ <xsl:call-template name='rnd:error'>
+ <xsl:with-param name='code'>bad-caption</xsl:with-param>
+ <xsl:with-param name='message'>caption does not follow table or figure</xsl:with-param>
+ </xsl:call-template>
+ </xsl:when>
+
+ <xsl:when test='(contains(@rnd:style, "-title") or
+ contains(@rnd:style, "-titleabbrev") or
+ contains(@rnd:style, "-subtitle")) and
+ not(starts-with(@rnd:style, "blockquote") or starts-with(@rnd:style, "formal"))'>
+ <!-- TODO: check that no non-metadata elements occur before this paragraph -->
+ </xsl:when>
+
+ <!-- Metadata elements are handled in rnd:metadata mode -->
+ <!-- TODO: check that no non-metadata elements occur before this paragraph -->
+ <xsl:when test='&metadata-content;'/>
+
+ <xsl:otherwise>
+ <xsl:call-template name='rnd:error'>
+ <xsl:with-param name='code'>unknown-style</xsl:with-param>
+ <xsl:with-param name='message'>unknown paragraph style "<xsl:value-of select='@rnd:style'/>" encountered</xsl:with-param>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+ <!-- Determine if the caption belongs to the current figure.
+ If so, then process the textobject content and the caption.
+ -->
+ <xsl:template name='rnd:figure-text-caption'>
+ <xsl:param name='caption' select='/..'/>
+
+ <xsl:variable name='textobjs'
+ select='following-sibling::*[following-sibling::*[generate-id() = generate-id($caption)]]'/>
+
+ <xsl:choose>
+ <xsl:when test='not($caption)'/> <!-- nothing to do -->
+ <xsl:when test='$textobjs[self::dbk:informaltable |
+ self::dbk:inlinemediaobject |
+ self::dbk:para[@rnd:style = "informalfigure-imagedata" or
+ @rnd:style = "mediaobject-imagedata"]]'/> <!-- caption belongs to something else -->
+ <xsl:otherwise>
+ <xsl:apply-templates select='$textobjs' mode='rnd:textobject'/>
+
+ <xsl:apply-templates select='$caption' mode='rnd:caption'/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+ <xsl:template match='dbk:para' mode='rnd:caption'>
+ <dbk:caption>
+ <xsl:call-template name='rnd:attributes'/>
+ <xsl:apply-templates/>
+ </dbk:caption>
+ </xsl:template>
+
+ <xsl:template name='rnd:imagedata-attributes'>
+ <xsl:param name='metadata' select='""'/>
+
+ <xsl:choose>
+ <xsl:when test='not($metadata)'/>
+ <xsl:when test='contains($metadata, " ")'>
+ <xsl:call-template name='rnd:imagedata-attributes'>
+ <xsl:with-param name='metadata'
+ select='substring-before($metadata, " ")'/>
+ </xsl:call-template>
+ <xsl:call-template name='rnd:imagedata-attributes'>
+ <xsl:with-param name='metadata'
+ select='substring-after($metadata, " ")'/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test='not(contains($metadata, "="))'>
+ <xsl:call-template name='rnd:warning'>
+ <xsl:with-param name='code' select='"imagedata-missing-value"'/>
+ <xsl:with-param name='message'>
+ <xsl:text>imagedata-metadata missing value for attribute "</xsl:text>
+ <xsl:value-of select='$metadata'/>
+ <xsl:text>"</xsl:text>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:variable name='name'
+ select='translate(normalize-space(substring-before($metadata, "=")), "ABCDEFGHIJKLMNOPQRSTUVWXYZ", "abcdefghijklmnopqrstuvwxyz")'/>
+ <xsl:variable name='value'
+ select='translate(normalize-space(substring-after($metadata, "=")), "ABCDEFGHIJKLMNOPQRSTUVWXYZ", "abcdefghijklmnopqrstuvwxyz")'/>
+
+ <xsl:choose>
+ <xsl:when test='$name = "scalefit"'>
+ <xsl:attribute name='scalefit'>
+ <xsl:choose>
+ <xsl:when test='$value = "1" or
+ $value = "yes" or
+ $value = "true"'>1</xsl:when>
+ <xsl:otherwise>0</xsl:otherwise>
+ </xsl:choose>
+ </xsl:attribute>
+ </xsl:when>
+ <xsl:when test='$name = "align" or
+ $name = "contentdepth" or
+ $name = "contentwidth" or
+ $name = "depth" or
+ $name = "scale" or
+ $name = "valign" or
+ $name = "width"'>
+ <!-- TODO: check enumerate values-->
+ <xsl:attribute name='{$name}'>
+ <xsl:value-of select='$value'/>
+ </xsl:attribute>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name='rnd:error'>
+ <xsl:with-param name='code' select='"imagedata-unknown-attribute"'/>
+ <xsl:with-param name='message'>
+ <xsl:text>imagedata-metadata unknown attribute "</xsl:text>
+ <xsl:value-of select='$name'/>
+ <xsl:text>"</xsl:text>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+ <xsl:template match='dbk:emphasis'>
+ <xsl:choose>
+ <xsl:when test='not(@rnd:style) and @role = "italic"'>
+ <xsl:copy>
+ <xsl:apply-templates mode='rnd:copy'/>
+ </xsl:copy>
+ </xsl:when>
+ <xsl:when test='not(@rnd:style) or @role'>
+ <xsl:copy>
+ <xsl:call-template name='rnd:attributes'/>
+ <xsl:apply-templates mode='rnd:copy'/>
+ </xsl:copy>
+ </xsl:when>
+
+ <xsl:when test='@rnd:style = preceding-sibling::node()[1][self::dbk:emphasis]/@rnd:style'/>
+
+ <xsl:when test='@rnd:style = "emphasis"'>
+ <xsl:copy>
+ <xsl:call-template name='rnd:attributes'/>
+ <xsl:apply-templates mode='rnd:copy'/>
+ <xsl:apply-templates select='following-sibling::node()[1]'
+ mode='rnd:emphasis'/>
+ </xsl:copy>
+ </xsl:when>
+ <xsl:when test='@rnd:style = "emphasis-bold" or
+ @rnd:style = "emphasis-strong"'>
+ <xsl:copy>
+ <xsl:attribute name='role'>bold</xsl:attribute>
+ <xsl:call-template name='rnd:attributes'/>
+ <xsl:apply-templates mode='rnd:copy'/>
+ <xsl:apply-templates select='following-sibling::node()[1]'
+ mode='rnd:emphasis'/>
+ </xsl:copy>
+ </xsl:when>
+ <xsl:when test='@rnd:style = "emphasis-underline"'>
+ <xsl:copy>
+ <xsl:attribute name='role'>underline</xsl:attribute>
+ <xsl:call-template name='rnd:attributes'/>
+ <xsl:apply-templates mode='rnd:copy'/>
+ <xsl:apply-templates select='following-sibling::node()[1]'
+ mode='rnd:emphasis'/>
+ </xsl:copy>
+ </xsl:when>
+
+ <xsl:when test='@rnd:style = "citetitle" or
+ @rnd:style = "literal" or
+ @rnd:style = "sgmltag"'>
+ <xsl:element name='{@rnd:style}'
+ namespace='http://docbook.org/ns/docbook'>
+ <xsl:call-template name='rnd:attributes'/>
+ <xsl:apply-templates/>
+ <xsl:apply-templates select='following-sibling::node()[1]'
+ mode='rnd:emphasis'/>
+ </xsl:element>
+ </xsl:when>
+
+ <xsl:when test='@rnd:style = "Hyperlink" and
+ parent::dbk:link'>
+ <!-- This occurs in a hyperlink; parent should be dbk:link -->
+ <xsl:apply-templates/>
+ </xsl:when>
+ <xsl:when test='@rnd:style = "Hyperlink"'>
+ <!-- dbk:link is missing -->
+ <dbk:link xlink:href='{.}'>
+ <xsl:apply-templates/>
+ </dbk:link>
+ </xsl:when>
+
+ <!-- In rare circumstances, Word inserts an empty element that appears to be something like a space in the editor -->
+ <xsl:when test='(@rnd:style = "EndnoteReference" or
+ @rnd:style = "FootnoteReference") and
+ . = ""'>
+ <xsl:text> </xsl:text>
+ </xsl:when>
+
+ <xsl:otherwise>
+ <xsl:call-template name='rnd:error'>
+ <xsl:with-param name='code'>unknown-style</xsl:with-param>
+ <xsl:with-param name='message'>unknown character span style "<xsl:value-of select='@rnd:style'/>" encountered</xsl:with-param>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+ <!-- Coalesce emphasis elements into a single element -->
+ <xsl:template match='dbk:emphasis' mode='rnd:emphasis'>
+ <xsl:choose>
+ <xsl:when test='@rnd:style = preceding-sibling::node()[self::dbk:emphasis]/@rnd:style'>
+ <xsl:apply-templates/>
+ <xsl:apply-templates select='following-sibling::node()[1]'
+ mode='rnd:emphasis'/>
+ </xsl:when>
+ </xsl:choose>
+ </xsl:template>
+ <xsl:template match='*|text()' mode='rnd:emphasis'/>
+
+ <xsl:template match='dbk:emphasis' mode='rnd:personname-emphasis'>
+ <xsl:param name='style'/>
+
+ <xsl:choose>
+ <xsl:when test='@rnd:style = $style'>
+ <xsl:apply-templates/>
+ <xsl:apply-templates select='following-sibling::dbk:emphasis[1]'
+ mode='rnd:personname-emphasis'>
+ <xsl:with-param name='style' select='$style'/>
+ </xsl:apply-templates>
+ </xsl:when>
+ </xsl:choose>
+ </xsl:template>
+ <xsl:template match='*|text()' mode='rnd:emphasis'/>
+
+ <xsl:template match='dbk:subscript|dbk:superscript'>
+ <xsl:copy>
+ <xsl:apply-templates select='@*' mode='rnd:copy'/>
+ <xsl:apply-templates/>
+ </xsl:copy>
+ </xsl:template>
+
+ <!-- Images -->
+
+ <xsl:template match='dbk:inlinemediaobject'>
+ <xsl:choose>
+ <xsl:when test='not(preceding-sibling::*|following-sibling::*) and
+ normalize-space(..) = ""'>
+
+ <xsl:variable name='next.captioned'
+ select='ancestor::dbk:para/following-sibling::*[self::dbk:informaltable or self::dbk:para[dbk:inlinemediaobject and count(*) = 1 and normalize-space() = ""]][1]'/>
+
+ <xsl:variable name='caption'
+ select='ancestor::dbk:para/following-sibling::dbk:para[@rnd:style = "caption" or @rnd:style = "Caption"]'/>
+
+ <xsl:variable name='metadata'>
+ <xsl:apply-templates select='ancestor::dbk:para/following-sibling::*[1]'
+ mode='rnd:metadata'/>
+ </xsl:variable>
+
+ <dbk:figure>
+ <xsl:if test='ancestor::dbk:para/preceding-sibling::*[1][self::dbk:para][@rnd:style = "figure-title"] or
+ $metadata'>
+ <dbk:info>
+ <xsl:if test='ancestor::dbk:para/preceding-sibling::*[1][self::dbk:para][@rnd:style = "figure-title"]'>
+ <dbk:title>
+ <xsl:apply-templates select='ancestor::dbk:para/preceding-sibling::*[1]/node()'/>
+ </dbk:title>
+ </xsl:if>
+ <xsl:copy-of select='$metadata'/>
+ </dbk:info>
+ </xsl:if>
+
+ <dbk:mediaobject>
+ <xsl:apply-templates mode='rnd:copy'/>
+ </dbk:mediaobject>
+
+ <xsl:choose>
+ <xsl:when test='not($caption)'/>
+ <xsl:when test='not($next.captioned)'>
+ <xsl:apply-templates select='ancestor::dbk:para/following-sibling::*[following-sibling::*[generate-id() = generate-id($caption)]][not(&metadata-content;)]'
+ mode='rnd:figure'/>
+ <xsl:apply-templates select='$caption'
+ mode='rnd:caption'/>
+ </xsl:when>
+ <!-- Does caption belong to this image or next.captioned?
+ - Only if it belongs to this image do we process it here.
+ -->
+ <xsl:when test='$next.captioned[preceding-sibling::*[generate-id() = generate-id($caption)]]'>
+ <xsl:apply-templates select='ancestor::dbk:para/following-sibling::*[following-sibling::*[generate-id() = generate-id($caption)]][not(&metadata-content;)]'
+ mode='rnd:figure'/>
+ <xsl:apply-templates select='$caption'
+ mode='rnd:caption'/>
+ </xsl:when>
+ <!-- otherwise caption does not belong to this figure -->
+ </xsl:choose>
+ </dbk:figure>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name='rnd:copy'/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+ <xsl:template match='dbk:para[@rnd:style = "caption" or @rnd:style = "Caption"]'
+ mode='rnd:caption'>
+ <dbk:caption>
+ <dbk:para>
+ <xsl:apply-templates/>
+ </dbk:para>
+ </dbk:caption>
+ </xsl:template>
+ <xsl:template match='*' mode='rnd:caption'/>
+
+ <xsl:template match='*' mode='rnd:figure'>
+ <xsl:call-template name='rnd:para'>
+ <xsl:with-param name='suppress' select='false()'/>
+ </xsl:call-template>
+ </xsl:template>
+
+ <!-- Sidebars -->
+
+ <xsl:template match='*' mode='rnd:sidebar'>
+ <xsl:call-template name='rnd:para'>
+ <xsl:with-param name='suppress' select='false()'/>
+ </xsl:call-template>
+ </xsl:template>
+
+ <!-- Lists -->
+
+ <xsl:template match='dbk:para' mode='rnd:listitem'>
+ <dbk:listitem>
+ <dbk:para>
+ <xsl:call-template name='rnd:attributes'/>
+ <xsl:apply-templates/>
+ </dbk:para>
+ <xsl:apply-templates select='following-sibling::*[1]'
+ mode='rnd:continue'/>
+
+ <!-- Handle nested lists -->
+ <xsl:variable name='list-type'
+ select='concat(substring-before(@rnd:style, "list"), "list")'/>
+ <xsl:variable name='list-level'
+ select='substring-after(@rnd:style, $list-type)'/>
+
+ <!-- Assuming only five levels of list nesting.
+ - This is probably better done in a previous stage using grouping.
+ -->
+ <xsl:variable name='stop.node'
+ select='following-sibling::dbk:para[@rnd:style != concat("itemizedlist", $list-level + 1) and
+ @rnd:style != concat("orderedlist", $list-level + 1) and
+ @rnd:style != concat("itemizedlist", $list-level + 2) and
+ @rnd:style != concat("orderedlist", $list-level + 2) and
+ @rnd:style != concat("itemizedlist", $list-level + 3) and
+ @rnd:style != concat("orderedlist", $list-level + 3) and
+ @rnd:style != "para-continue"][1]'/>
+
+ <xsl:variable name='nested'
+ select='following-sibling::dbk:para[@rnd:style = concat("itemizedlist", $list-level + 1) or @rnd:style = concat("orderedlist", $list-level + 1)][1]'/>
+
+ <xsl:choose>
+ <!-- Is there a nested list at all? -->
+ <xsl:when test='following-sibling::*[self::dbk:para and @rnd:style != "para-continue"][1][@rnd:style != concat("itemizedlist", $list-level + 1) and @rnd:style != concat("orderedlist", $list-level + 1)]'/>
+
+ <xsl:when test='following-sibling::dbk:para[@rnd:style = concat("itemizedlist", $list-level + 1) or @rnd:style = concat("orderedlist", $list-level + 1)] and
+ $stop.node'>
+ <xsl:element name='{concat(substring-before($nested/@rnd:style, "list"), "list")}'
+ namespace='http://docbook.org/ns/docbook'>
+ <xsl:apply-templates select='following-sibling::dbk:para[@rnd:style = concat("itemizedlist", $list-level + 1) or @rnd:style = concat("orderedlist", $list-level + 1)][following-sibling::*[generate-id() = generate-id($stop.node)]]'
+ mode='rnd:listitem'/>
+ </xsl:element>
+ </xsl:when>
+ <xsl:when test='following-sibling::dbk:para[@rnd:style = concat("itemizedlist", $list-level + 1) or @rnd:style = concat("orderedlist", $list-level + 1)]'>
+
+ <xsl:element name='{concat(substring-before($nested/@rnd:style, "list"), "list")}'
+ namespace='http://docbook.org/ns/docbook'>
+ <xsl:apply-templates select='following-sibling::dbk:para[@rnd:style = concat("itemizedlist", $list-level + 1) or @rnd:style = concat("orderedlist", $list-level + 1)]'
+ mode='rnd:listitem'/>
+ </xsl:element>
+ </xsl:when>
+ </xsl:choose>
+ </dbk:listitem>
+ </xsl:template>
+
+ <!-- Blockquotes -->
+
+ <xsl:template match='dbk:para' mode='rnd:blockquote'>
+ <xsl:choose>
+ <xsl:when test='@rnd:style ="blockquote-attribution"'/>
+ <xsl:when test='@rnd:style ="blockquote-title"'/>
+ <xsl:otherwise>
+ <dbk:para>
+ <xsl:apply-templates/>
+ </dbk:para>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+ <xsl:template match='dbk:para' mode='rnd:blockquote-attribution'>
+ <xsl:if test='@rnd:style ="blockquote-attribution"'>
+ <dbk:attribution>
+ <xsl:apply-templates/>
+ </dbk:attribution>
+ </xsl:if>
+ </xsl:template>
+
+ <!-- Metadata -->
+
+ <xsl:template match='dbk:para' mode='rnd:metadata'>
+ <xsl:choose>
+ <xsl:when test='@rnd:style = "biblioentry-title" and
+ parent::dbk:bibliography|parent::dbk:bibliodiv'/>
+ <xsl:when test='@rnd:style = "biblioentry-title"'>
+ <xsl:call-template name='rnd:error'>
+ <xsl:with-param name='code'>bad-metadata</xsl:with-param>
+ <xsl:with-param name='message'>style "<xsl:value-of select='@rnd:style'/>" must not be metadata for parent "<xsl:value-of select='local-name(..)'/>"</xsl:with-param>
+ </xsl:call-template>
+ </xsl:when>
+
+ <xsl:when test='@rnd:style = "abstract-title" or
+ @rnd:style = "abstract"'>
+ <xsl:variable name='stop.node'
+ select='following-sibling::dbk:para[@rnd:style != "abstract"][1]'/>
+ <xsl:choose>
+ <xsl:when test='$stop.node'>
+ <dbk:abstract>
+ <xsl:apply-templates select='.|following-sibling::dbk:para[@rnd:style = "abstract"][following-sibling::*[generate-id() = generate-id($stop.node)]]'
+ mode='rnd:abstract'/>
+ </dbk:abstract>
+ <xsl:apply-templates select='$stop.node'
+ mode='rnd:metadata'/>
+ </xsl:when>
+ <xsl:otherwise>
+ <dbk:abstract>
+ <xsl:apply-templates select='.|following-sibling::dbk:para[@rnd:style = "abstract"]' mode='rnd:abstract'/>
+ </dbk:abstract>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+
+ <xsl:when test='@rnd:style = "legalnotice"'>
+ <xsl:variable name='stop.node'
+ select='following-sibling::dbk:para[@rnd:style != "legalnotice"][1]'/>
+
+ <xsl:choose>
+ <xsl:when test='$stop.node'>
+ <dbk:legalnotice>
+ <xsl:apply-templates select='.|following-sibling::dbk:para[@rnd:style = "legalnotice"][following-sibling::*[generate-id() = generate-id($stop.node)]]'
+ mode='rnd:legalnotice'/>
+ </dbk:legalnotice>
+ <xsl:apply-templates select='$stop.node'
+ mode='rnd:metadata'/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select='.|following-sibling::dbk:para[@rnd:style = "legalnotice"]'
+ mode='rnd:legalnotice'/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+
+ <xsl:when test='@rnd:style = "keyword"'>
+ <xsl:variable name='stop.node'
+ select='following-sibling::*[not(self::dbk:para) or
+ (self::dbk:para and @rnd:style != "keyword")][1]'/>
+
+ <xsl:choose>
+ <xsl:when test='$stop.node'>
+ <dbk:keywordset>
+ <xsl:call-template name='rnd:keyword'>
+ <xsl:with-param name='nodes'
+ select='.|following-sibling::dbk:para[@rnd:style = "keyword"][following-sibling::*[generate-id() = generate-id($stop.node)]]'/>
+ </xsl:call-template>
+ </dbk:keywordset>
+ <xsl:apply-templates select='$stop.node'
+ mode='rnd:metadata'/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name='rnd:keyword'>
+ <xsl:with-param name='nodes'
+ select='.|following-sibling::dbk:para[@rnd:style = "keyword"]'/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+
+ <xsl:when test='@rnd:style = "author"'>
+ <dbk:author>
+ <xsl:choose>
+ <xsl:when test='dbk:emphasis[@rnd:style = "orgname"]'>
+ <dbk:orgname>
+ <xsl:apply-templates
+ select='dbk:emphasis[@rnd:style = "orgname"]'
+ mode='rnd:orgname'/>
+ </dbk:orgname>
+ <xsl:if test='*[not(@rnd:style = "orgname")]'>
+ <xsl:call-template name='rnd:error'>
+ <xsl:with-param name='code'>bad-author-orgname-combo</xsl:with-param>
+ <xsl:with-param name='message'>character span "<xsl:value-of select='dbk:emphasis[@rnd:style != "orgname"][1]/@rnd:style'/>" not allowed in an author paragraph combined with orgname</xsl:with-param>
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:when>
+ <xsl:otherwise>
+ <dbk:personname>
+ <!-- TODO: check style of author; mixed content or structured -->
+ <xsl:apply-templates mode='rnd:personname'/>
+ </dbk:personname>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:apply-templates mode='rnd:author-personblurb'/>
+ <xsl:apply-templates select='following-sibling::*[1]'
+ mode='rnd:author'/>
+ </dbk:author>
+ <xsl:call-template name='rnd:resume-metadata'>
+ <xsl:with-param name='node' select='following-sibling::*[1]'/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test='@rnd:style = "personblurb" or
+ @rnd:style = "address" or
+ @rnd:style = "affiliation" or
+ @rnd:style = "contrib" or
+ @rnd:style = "email"'/>
+
+ <xsl:when test='@rnd:style = "releaseinfo" or
+ @rnd:style = "date" or
+ @rnd:style = "pubdate" or
+ @rnd:style = "pagenums" or
+ @rnd:style = "issuenum" or
+ @rnd:style = "volumenum" or
+ @rnd:style = "edition" or
+ @rnd:style = "editor" or
+ @rnd:style = "othercredit" or
+ @rnd:style = "biblioid" or
+ @rnd:style = "bibliosource" or
+ @rnd:style = "bibliomisc" or
+ @rnd:style = "revhistory" or
+ @rnd:style = "revision"'>
+ <xsl:element name='{@rnd:style}'
+ namespace='http://docbook.org/ns/docbook'>
+ <xsl:apply-templates mode='rnd:metadata'/>
+ </xsl:element>
+ <xsl:apply-templates select='following-sibling::*[1]'
+ mode='rnd:metadata'/>
+ </xsl:when>
+ <xsl:when test='contains(@rnd:style, "-titleabbrev")'>
+ <xsl:variable name='parent'
+ select='substring-before(@rnd:style, "-titleabbrev")'/>
+
+ <xsl:choose>
+ <xsl:when test='$parent = local-name(..)'>
+ <dbk:titleabbrev>
+ <xsl:apply-templates mode='rnd:metadata'/>
+ </dbk:titleabbrev>
+ </xsl:when>
+ <xsl:when test='(parent::dbk:article or parent::dbk:book-component) and
+ preceding-sibling::dbk:para[@rnd:style = concat($parent, "-title")]'>
+ <dbk:titleabbrev>
+ <xsl:apply-templates mode='rnd:metadata'/>
+ </dbk:titleabbrev>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name='rnd:error'>
+ <xsl:with-param name='code'>bad-titleabbrev</xsl:with-param>
+ <xsl:with-param name='message'>titleabbrev style "<xsl:value-of select='@rnd:style'/>" mismatches parent "<xsl:value-of select='local-name(..)'/>"</xsl:with-param>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:apply-templates select='following-sibling::*[1]'
+ mode='rnd:metadata'/>
+ </xsl:when>
+ <xsl:when test='contains(@rnd:style, "-title")'>
+ <xsl:variable name='parent'
+ select='substring-before(@rnd:style, "-title")'/>
+
+ <xsl:choose>
+ <xsl:when test='$parent = "table" or
+ $parent = "figure"'>
+ <dbk:title>
+ <xsl:apply-templates mode='rnd:metadata'/>
+ </dbk:title>
+ </xsl:when>
+ <xsl:when test='$parent = local-name(..)'>
+ <dbk:title>
+ <xsl:apply-templates mode='rnd:metadata'/>
+ </dbk:title>
+ </xsl:when>
+ <xsl:when test='parent::dbk:book-component'>
+ <dbk:title>
+ <xsl:apply-templates mode='rnd:metadata'/>
+ </dbk:title>
+ </xsl:when>
+ <xsl:when test='parent::dbk:article and
+ not(../../..)'>
+ <dbk:title>
+ <xsl:apply-templates mode='rnd:metadata'/>
+ </dbk:title>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name='rnd:error'>
+ <xsl:with-param name='code'>bad-title</xsl:with-param>
+ <xsl:with-param name='message'>title style "<xsl:value-of select='@rnd:style'/>" mismatches parent "<xsl:value-of select='local-name(..)'/>"</xsl:with-param>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:apply-templates select='following-sibling::*[1]'
+ mode='rnd:metadata'/>
+ </xsl:when>
+
+ <!-- Exception to normal subtitle handling is biblioentry-subtitle -->
+ <xsl:when test='@rnd:style = "biblioentry-subtitle"'>
+ <!-- TODO: check that this is in a biblioentry -->
+ <dbk:subtitle>
+ <xsl:apply-templates mode='rnd:metadata'/>
+ </dbk:subtitle>
+
+ <xsl:apply-templates select='following-sibling::*[1]'
+ mode='rnd:metadata'/>
+ </xsl:when>
+ <xsl:when test='contains(@rnd:style, "-subtitle")'>
+ <xsl:variable name='parent'
+ select='substring-before(@rnd:style, "-subtitle")'/>
+
+ <xsl:choose>
+ <xsl:when test='$parent = local-name(..)'>
+ <dbk:subtitle>
+ <xsl:apply-templates mode='rnd:metadata'/>
+ </dbk:subtitle>
+ </xsl:when>
+ <xsl:when test='(parent::dbk:article or parent::dbk:book-component) and
+ preceding-sibling::dbk:para[@rnd:style = concat($parent, "-title")]'>
+ <dbk:subtitle>
+ <xsl:apply-templates mode='rnd:metadata'/>
+ </dbk:subtitle>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name='rnd:error'>
+ <xsl:with-param name='code'>bad-subtitle</xsl:with-param>
+ <xsl:with-param name='message'>subtitle style "<xsl:value-of select='@rnd:style'/>" mismatches parent "<xsl:value-of select='local-name(..)'/>"</xsl:with-param>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:apply-templates select='following-sibling::*[1]'
+ mode='rnd:metadata'/>
+ </xsl:when>
+
+ <xsl:when test='@rnd:style = "publisher-address" and
+ preceding-sibling::*[1][not(self::dbk:para) or not(@rnd:style = "publisher")]'>
+ <xsl:call-template name='rnd:error'>
+ <xsl:with-param name='code'>bad-publisher-address</xsl:with-param>
+ <xsl:with-param name='message'>publisher-address must follow publisher</xsl:with-param>
+ </xsl:call-template>
+ <xsl:apply-templates select='following-sibling::*[1]'
+ mode='rnd:metadata'/>
+ </xsl:when>
+ <xsl:when test='@rnd:style = "publisher-address"'>
+ <xsl:apply-templates select='following-sibling::*[1]'
+ mode='rnd:metadata'/>
+ </xsl:when>
+ <xsl:when test='@rnd:style = "publisher"'>
+ <dbk:publisher>
+ <dbk:publishername>
+ <xsl:apply-templates/>
+ </dbk:publishername>
+ <xsl:if test='following-sibling::*[1][@rnd:style = "publisher-address"]'>
+ <xsl:apply-templates select='following-sibling::*[1]'
+ mode='rnd:publisher'/>
+ </xsl:if>
+ </dbk:publisher>
+
+ <xsl:apply-templates select='following-sibling::*[1]'
+ mode='rnd:metadata'/>
+ </xsl:when>
+ </xsl:choose>
+ </xsl:template>
+
+ <xsl:template name='rnd:keyword'>
+ <xsl:param name='nodes' select='/..'/>
+
+ <xsl:choose>
+ <xsl:when test='not($nodes)'/>
+ <xsl:otherwise>
+ <xsl:call-template name='rnd:keyword-phrases'>
+ <xsl:with-param name='text' select='$nodes[1]'/>
+ </xsl:call-template>
+ <xsl:call-template name='rnd:keyword'>
+ <xsl:with-param name='nodes' select='$nodes[position() != 1]'/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+ <xsl:template name='rnd:keyword-phrases'>
+ <xsl:param name='text'/>
+
+ <xsl:choose>
+ <xsl:when test='not($text)'/>
+ <xsl:when test='contains($text, ",")'>
+ <dbk:keyword>
+ <xsl:value-of select='normalize-space(substring-before($text, ","))'/>
+ </dbk:keyword>
+ <xsl:call-template name='rnd:keyword-phrases'>
+ <xsl:with-param name='text' select='substring-after($text, ",")'/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <dbk:keyword>
+ <xsl:value-of select='normalize-space($text)'/>
+ </dbk:keyword>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+ <xsl:template match='dbk:emphasis' mode='rnd:metadata'>
+ <xsl:choose>
+ <xsl:when test='not(@rnd:style)'>
+ <xsl:copy>
+ <xsl:apply-templates mode='rnd:metadata'/>
+ </xsl:copy>
+ </xsl:when>
+ <xsl:when test='@rnd:style = "Hyperlink" and
+ parent::dbk:link'>
+ <xsl:apply-templates mode='rnd:metadata'/>
+ </xsl:when>
+ <xsl:when test='@rnd:style = "Hyperlink"'>
+ <dbk:link xlink:href='{.}'>
+ <xsl:apply-templates mode='rnd:metadata'/>
+ </dbk:link>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:element name='{@rnd:style}'
+ namespace='http://docbook.org/ns/docbook'>
+ <xsl:apply-templates mode='rnd:metadata'/>
+ </xsl:element>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+ <xsl:template match='dbk:link' mode='rnd:metadata'>
+ <xsl:copy>
+ <xsl:apply-templates select='@*' mode='rnd:copy'/>
+ <xsl:apply-templates mode='rnd:metadata'/>
+ </xsl:copy>
+ </xsl:template>
+ <xsl:template match='dbk:inlinemediaobject' mode='rnd:metadata'>
+ <xsl:call-template name='rnd:copy'/>
+ </xsl:template>
+ <xsl:template match='*' mode='rnd:metadata'/>
+
+ <xsl:template name='rnd:resume-metadata'>
+ <xsl:param name='node' select='/..'/>
+
+ <xsl:choose>
+ <xsl:when test='$node[self::dbk:para][&author-content;]'>
+ <xsl:call-template name='rnd:resume-metadata'>
+ <xsl:with-param name='node' select='$node/following-sibling::*[1]'/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test='$node[self::dbk:para][&metadata-content;]'>
+ <xsl:apply-templates select='$node' mode='rnd:metadata'/>
+ </xsl:when>
+ </xsl:choose>
+ </xsl:template>
+
+ <xsl:template match='dbk:para' mode='rnd:abstract'>
+ <xsl:choose>
+ <xsl:when test='@rnd:style = "abstract-title"'>
+ <dbk:title>
+ <xsl:call-template name='rnd:attributes'/>
+ <xsl:apply-templates/>
+ </dbk:title>
+ </xsl:when>
+ <xsl:otherwise>
+ <dbk:para>
+ <xsl:call-template name='rnd:attributes'/>
+ <xsl:apply-templates/>
+ </dbk:para>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+ <xsl:template match='dbk:para' mode='rnd:legalnotice'>
+ <dbk:para>
+ <xsl:call-template name='rnd:attributes'/>
+ <xsl:apply-templates/>
+ </dbk:para>
+ </xsl:template>
+
+ <xsl:template match='dbk:footnote' mode='rnd:personname'/>
+ <xsl:template match='dbk:emphasis' mode='rnd:personname'>
+ <!-- Need to check preceding emphasis for same style,
+ but blocks pretty-prints and all text nodes
+ are preserved in paragraph content.
+ -->
+ <xsl:variable name='previous'
+ select='preceding-sibling::node()[not(self::text()) or (self::text() and normalize-space() != "")]'/>
+ <!--
+ <xsl:comment> this style is <xsl:value-of select='@rnd:style'/>, previous style is <xsl:value-of select='$previous[last()]/@rnd:style'/> # previous <xsl:value-of select='count($previous)'/></xsl:comment>
+-->
+ <xsl:choose>
+ <!-- inlines are coalesced -->
+ <xsl:when test='@rnd:style = $previous[last()][self::dbk:emphasis]/@rnd:style'/>
+ <xsl:when test='@rnd:style = "honorific" or
+ @rnd:style = "firstname" or
+ @rnd:style = "lineage" or
+ @rnd:style = "othername" or
+ @rnd:style = "surname"'>
+ <xsl:element name='{@rnd:style}'
+ namespace='http://docbook.org/ns/docbook'>
+ <xsl:apply-templates/>
+ <xsl:apply-templates select='following-sibling::dbk:emphasis[1]'
+ mode='rnd:personname-emphasis'>
+ <xsl:with-param name='style' select='@rnd:style'/>
+ </xsl:apply-templates>
+ </xsl:element>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name='rnd:error'>
+ <xsl:with-param name='code'>bad-author-inline</xsl:with-param>
+ <xsl:with-param name='message'>character span "<xsl:value-of select='@rnd:style'/>" not allowed in an author paragraph</xsl:with-param>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+ <xsl:template match='text()' mode='rnd:author-personblurb'/>
+ <xsl:template match='dbk:emphasis' mode='rnd:author-personblurb'/>
+ <xsl:template match='dbk:footnote' mode='rnd:author-personblurb'>
+ <dbk:personblurb>
+ <dbk:para>
+ <xsl:copy>
+ <xsl:apply-templates select='@*' mode='rnd:copy'/>
+ <xsl:apply-templates/>
+ </xsl:copy>
+ </dbk:para>
+ </dbk:personblurb>
+ </xsl:template>
+
+ <xsl:template match='dbk:para' mode='rnd:author'>
+ <xsl:choose>
+ <xsl:when test='@rnd:style = "personblurb" and
+ preceding-sibling::*[1][self::dbk:para and @rnd:style != "personblurb"]'>
+ <dbk:personblurb>
+ <xsl:apply-templates select='.'
+ mode='rnd:personblurb'/>
+ </dbk:personblurb>
+ </xsl:when>
+ <xsl:when test='@rnd:style = "personblurb"'>
+ <xsl:apply-templates select='following-sibling::*[1]'
+ mode='rnd:author'/>
+ </xsl:when>
+
+ <!-- Web and mail addresses may appear in a simplified form -->
+ <xsl:when test='@rnd:style = "address"'>
+ <xsl:choose>
+ <xsl:when test='dbk:link and
+ count(dbk:link) = count(*)'>
+ <!-- simplified form -->
+ <dbk:otheraddr>
+ <xsl:apply-templates select='dbk:link'
+ mode='rnd:otheraddr'/>
+ </dbk:otheraddr>
+ </xsl:when>
+ <xsl:otherwise>
+ <dbk:address>
+ <xsl:apply-templates mode='rnd:author'/>
+ </dbk:address>
+ <xsl:apply-templates select='following-sibling::*[1]'
+ mode='rnd:author'/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+
+ <xsl:when test='@rnd:style = "affiliation"'>
+ <dbk:affiliation>
+ <xsl:choose>
+ <xsl:when test='not(*)'>
+ <dbk:jobtitle>
+ <xsl:apply-templates mode='rnd:author'/>
+ </dbk:jobtitle>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates mode='rnd:author'/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </dbk:affiliation>
+ <xsl:apply-templates select='following-sibling::*[1]'
+ mode='rnd:author'/>
+ </xsl:when>
+ <xsl:when test='@rnd:style = "contrib" or
+ @rnd:style = "email"'>
+ <xsl:element name='{@rnd:style}'
+ namespace='http://docbook.org/ns/docbook'>
+ <xsl:apply-templates mode='rnd:author'/>
+ </xsl:element>
+ <xsl:apply-templates select='following-sibling::*[1]'
+ mode='rnd:author'/>
+ </xsl:when>
+ </xsl:choose>
+ </xsl:template>
+
+ <xsl:template match='dbk:link' mode='rnd:otheraddr'>
+ <xsl:copy>
+ <xsl:apply-templates select='@*' mode='rnd:copy'/>
+ <xsl:apply-templates mode='rnd:otheraddr'/>
+ </xsl:copy>
+ </xsl:template>
+
+ <!-- TODO: not all of these inlines are allowed in all elements that are children of author.
+ Need to further refine validation of inlines.
+ -->
+ <xsl:template match='dbk:emphasis' mode='rnd:author'>
+ <xsl:choose>
+ <xsl:when test='@rnd:style = "city" or
+ @rnd:style = "country" or
+ @rnd:style = "email" or
+ @rnd:style = "fax" or
+ @rnd:style = "jobtitle" or
+ @rnd:style = "orgdiv" or
+ @rnd:style = "orgname" or
+ @rnd:style = "otheraddr" or
+ @rnd:style = "phone" or
+ @rnd:style = "pob" or
+ @rnd:style = "postcode" or
+ @rnd:style = "shortaffil" or
+ @rnd:style = "state" or
+ @rnd:style = "street"'>
+ <xsl:element name='{@rnd:style}'
+ namespace='http://docbook.org/ns/docbook'>
+ <xsl:apply-templates/>
+ </xsl:element>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name='rnd:error'>
+ <xsl:with-param name='code'>metadata-bad-inline</xsl:with-param>
+ <xsl:with-param name='message'>character span "<xsl:value-of select='@rnd:style'/>" not allowed in author metadata</xsl:with-param>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+ <xsl:template match='dbk:para' mode='rnd:personblurb'>
+ <xsl:if test='@rnd:style = "personblurb"'>
+ <dbk:para>
+ <xsl:apply-templates/>
+ </dbk:para>
+ <xsl:apply-templates select='following-sibling::*[1]'
+ mode='rnd:personblurb'/>
+ </xsl:if>
+ </xsl:template>
+
+ <xsl:template match='dbk:para' mode='rnd:publisher'>
+ <xsl:if test='@rnd:style = "publisher-address"'>
+ <dbk:address>
+ <xsl:apply-templates/>
+ </dbk:address>
+ </xsl:if>
+ </xsl:template>
+
+ <xsl:template match='dbk:para' mode='rnd:programlisting'>
+ <xsl:text>&#xa;</xsl:text>
+ <xsl:apply-templates/>
+ </xsl:template>
+
+ <!-- Continuing paragraphs -->
+
+ <xsl:template match='*' mode='rnd:continue'/>
+ <xsl:template match='dbk:para' mode='rnd:continue'>
+ <xsl:if test='@rnd:style = "para-continue"'>
+ <dbk:para>
+ <xsl:call-template name='rnd:attributes'/>
+ <xsl:apply-templates/>
+ </dbk:para>
+ <xsl:apply-templates select='following-sibling::*[1]'
+ mode='rnd:continue'/>
+ </xsl:if>
+ </xsl:template>
+ <xsl:template match='dbk:informaltable' mode='rnd:continue'>
+ <xsl:apply-templates select='.'>
+ <xsl:with-param name='in-list' select='true()'/>
+ </xsl:apply-templates>
+ <xsl:apply-templates select='following-sibling::*[1]'
+ mode='rnd:continue'/>
+ </xsl:template>
+
+ <!-- Tables -->
+
+ <xsl:template match='dbk:informaltable'>
+ <xsl:param name='in-list' select='false()'/>
+
+ <xsl:choose>
+ <xsl:when test='not($in-list) and
+ preceding-sibling::dbk:para[1][starts-with(@rnd:style, "itemizedlist") or starts-with(@rnd:style, "orderedlist") or @rnd:style = "para-continue"]'/>
+ <xsl:when test='preceding-sibling::*[1][self::dbk:para][@rnd:style ="table-title"]'>
+ <dbk:table>
+ <xsl:apply-templates select='@*' mode='rnd:copy'/>
+
+ <dbk:info>
+ <xsl:apply-templates select='preceding-sibling::dbk:para[1]'
+ mode='rnd:table-title'/>
+ </dbk:info>
+
+ <xsl:call-template name='rnd:table-textobject'/>
+
+ <xsl:apply-templates/>
+
+ <xsl:call-template name='rnd:table-caption'/>
+ </dbk:table>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:copy>
+ <xsl:apply-templates select='@*' mode='rnd:copy'/>
+
+ <xsl:call-template name='rnd:table-textobject'/>
+
+ <xsl:apply-templates/>
+
+ <xsl:call-template name='rnd:table-caption'/>
+ </xsl:copy>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+ <xsl:template match='dbk:tgroup'>
+ <xsl:copy>
+ <xsl:apply-templates select='@*' mode='rnd:copy'/>
+ <xsl:if test='not(@cols)'>
+ <xsl:attribute name='cols'>
+ <xsl:call-template name='dbk:max-columns'>
+ <xsl:with-param name='rows' select='*/dbk:row'/>
+ </xsl:call-template>
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:apply-templates/>
+ </xsl:copy>
+ </xsl:template>
+ <xsl:template name='dbk:max-columns'>
+ <xsl:param name='rows' select='/..'/>
+ <xsl:param name='max' select='0'/>
+
+ <!-- This is a tail-recursive algorithm.
+ Could improve this with other algorithm(s),
+ eg. divide-and-conquer.
+ -->
+
+ <xsl:choose>
+ <xsl:when test='not($rows)'>
+ <xsl:value-of select='$max'/>
+ </xsl:when>
+ <xsl:when test='count($rows[1]/dbk:entry) > $max'>
+ <xsl:call-template name='dbk:max-columns'>
+ <xsl:with-param name='rows' select='$rows[position() != 1]'/>
+ <xsl:with-param name='max' select='count($rows[1]/dbk:entry)'/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name='dbk:max-columns'>
+ <xsl:with-param name='rows' select='$rows[position() != 1]'/>
+ <xsl:with-param name='max' select='$max'/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+ <xsl:template match='dbk:tbody|dbk:thead|dbk:tfoot|dbk:row|dbk:colspec'>
+ <xsl:copy>
+ <xsl:apply-templates select='@*' mode='rnd:copy'/>
+ <xsl:apply-templates/>
+ </xsl:copy>
+ </xsl:template>
+ <xsl:template match='dbk:entry'>
+ <dbk:entry>
+ <xsl:apply-templates select='@*' mode='rnd:copy'/>
+ <xsl:apply-templates/>
+ </dbk:entry>
+ </xsl:template>
+
+ <xsl:template match='dbk:para' mode='rnd:table-title'>
+ <dbk:title>
+ <xsl:apply-templates/>
+ </dbk:title>
+ </xsl:template>
+
+ <!-- Find the caption associated with this table -->
+ <xsl:template name='rnd:table-caption'>
+ <xsl:variable name='candidate'
+ select='following-sibling::dbk:para[@rnd:style = "caption" or @rnd:style = "Caption"][1]'/>
+
+ <xsl:if test='$candidate != "" and
+ generate-id($candidate/preceding-sibling::dbk:informaltable[1]) = generate-id(.)'>
+ <dbk:caption>
+ <dbk:para>
+ <xsl:apply-templates select='$candidate/node()'/>
+ </dbk:para>
+ </dbk:caption>
+ </xsl:if>
+ </xsl:template>
+
+ <!-- Find table associated text -->
+ <xsl:template name='rnd:table-textobject'>
+ <xsl:variable name='caption'
+ select='following-sibling::dbk:para[@rnd:style = "caption" or @rnd:style = "Caption"][1]'/>
+
+ <xsl:if test='generate-id($caption/preceding-sibling::dbk:informaltable[1]) = generate-id(.)'>
+ <xsl:variable name='content'
+ select='following-sibling::*[following-sibling::*[generate-id($caption) = generate-id()]]'/>
+ <xsl:if test='$content'>
+ <dbk:textobject>
+ <xsl:apply-templates select='$content' mode='rnd:textobject'/>
+ </dbk:textobject>
+ </xsl:if>
+ </xsl:if>
+ </xsl:template>
+ <xsl:template match='dbk:para' mode='rnd:textobject'>
+ <xsl:call-template name='rnd:para'>
+ <xsl:with-param name='suppress' select='false()'/>
+ </xsl:call-template>
+ </xsl:template>
+
+ <!-- Footnotes -->
+ <xsl:template match='dbk:footnote'>
+ <xsl:copy>
+ <xsl:apply-templates select='@*' mode='rnd:copy'/>
+ <xsl:apply-templates/>
+ </xsl:copy>
+ </xsl:template>
+
+ <!-- utilities -->
+
+ <!-- rnd:attributes reconstitutes an element's attributes -->
+ <xsl:template name='rnd:attributes'>
+ <xsl:param name='node' select='.'/>
+
+ <xsl:apply-templates select='$node/@*[namespace-uri() != "http://docbook.org/ns/docbook/roundtrip"]' mode='rnd:copy'/>
+ </xsl:template>
+
+ <xsl:template match='*' name='rnd:copy' mode='rnd:copy'>
+ <xsl:copy>
+ <xsl:apply-templates select='@*' mode='rnd:copy'/>
+ <xsl:apply-templates mode='rnd:copy'/>
+ </xsl:copy>
+ </xsl:template>
+ <xsl:template match='@*' mode='rnd:copy'>
+ <xsl:copy/>
+ </xsl:template>
+
+ <!-- These templates are invoked whenever an error condition is detected in the conversion of a document.
+ -->
+ <xsl:template name='rnd:error'>
+ <xsl:param name='node' select='.'/>
+ <xsl:param name='code'/>
+ <xsl:param name='message'/>
+
+ <xsl:comment><xsl:value-of select='$message'/></xsl:comment>
+ <xsl:message>ERROR "<xsl:value-of select='$code'/>": <xsl:value-of select='$message'/></xsl:message>
+ <rnd:error>
+ <rnd:code>
+ <xsl:value-of select='$code'/>
+ </rnd:code>
+ <rnd:message>
+ <xsl:value-of select='$message'/>
+ </rnd:message>
+ </rnd:error>
+ </xsl:template>
+ <xsl:template name='rnd:warning'>
+ <xsl:param name='node' select='.'/>
+ <xsl:param name='code'/>
+ <xsl:param name='message'/>
+
+ <xsl:comment><xsl:value-of select='$message'/></xsl:comment>
+ <xsl:message>WARNING "<xsl:value-of select='$code'/>": <xsl:value-of select='$message'/></xsl:message>
+ <rnd:warning>
+ <rnd:code>
+ <xsl:value-of select='$code'/>
+ </rnd:code>
+ <rnd:message>
+ <xsl:value-of select='$message'/>
+ </rnd:message>
+ </rnd:warning>
+ </xsl:template>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/roundtrip/dbk2ooo.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/roundtrip/dbk2ooo.xsl
new file mode 100644
index 0000000..dc7303f
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/roundtrip/dbk2ooo.xsl
@@ -0,0 +1,178 @@
+<xsl:stylesheet version="1.0"
+ xmlns:xsl='http://www.w3.org/1999/XSL/Transform'
+ xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0"
+ xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0"
+ xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0"
+ xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0"
+ xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0"
+ xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0"
+ xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0"
+ xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0"
+ xmlns:chart="urn:oasis:names:tc:opendocument:xmlns:chart:1.0"
+ xmlns:dr3d="urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0"
+ xmlns:math="http://www.w3.org/1998/Math/MathML"
+ xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0"
+ xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0"
+ xmlns:ooo="http://openoffice.org/2004/office"
+ xmlns:ooow="http://openoffice.org/2004/writer"
+ xmlns:oooc="http://openoffice.org/2004/calc"
+ xmlns:dom="http://www.w3.org/2001/xml-events"
+ xmlns:xforms="http://www.w3.org/2002/xforms"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:doc='http://docbook.org/ns/docbook'
+ exclude-result-prefixes='doc'>
+
+ <xsl:import href='dbk2wp.xsl'/>
+
+ <xsl:output method="xml" indent='yes'/>
+
+ <!-- ********************************************************************
+ $Id: dbk2ooo.xsl 7701 2008-02-22 06:07:31Z balls $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+ <xsl:include href='../VERSION'/>
+
+ <xsl:template match="/" name='ooo.top'>
+ <xsl:param name='doc' select='/'/>
+
+ <office:document-content
+ office:version='1.0'>
+
+ <office:script/>
+ <office:font-face-decls>
+ <style:font-face style:name="Nimbus Roman No9 L"
+ svg:font-family="'Nimbus Roman No9 L'"
+ style:font-family-generic="roman"
+ style:font-pitch="variable"/>
+ <style:font-face style:name="Nimbus Sans L"
+ svg:font-family="'Nimbus Sans L'"
+ style:font-family-generic="swiss"
+ style:font-pitch="variable"/>
+ <style:font-face style:name="DejaVu LGC Sans"
+ svg:font-family="'DejaVu LGC Sans'"
+ style:font-family-generic="system"
+ style:font-pitch="variable"/>
+ </office:font-face-decls>
+ <office:automatic-styles/>
+
+ <xsl:apply-templates select='$doc/*'
+ mode='doc:toplevel'/>
+ </office:document-content>
+ </xsl:template>
+
+ <xsl:template name='doc:make-body'>
+ <xsl:param name='content'>
+ <xsl:apply-templates mode='doc:body'/>
+ </xsl:param>
+
+ <office:body>
+ <office:text>
+ <office-forms form:automatic-focus='false'
+ form:apply-design-mode='false'/>
+ <text:sequence-decls>
+ <text:sequence-decl text:display-outline-level="0" text:name="Illustration"/>
+ <text:sequence-decl text:display-outline-level="0" text:name="Table"/>
+ <text:sequence-decl text:display-outline-level="0" text:name="Text"/>
+ <text:sequence-decl text:display-outline-level="0" text:name="Drawing"/>
+ </text:sequence-decls>
+
+ <xsl:copy-of select='$content'/>
+ </office:text>
+ </office:body>
+ </xsl:template>
+
+ <xsl:template name='doc:make-subsection'>
+ <xsl:param name='content'>
+ <xsl:apply-templates mode='doc:body'/>
+ </xsl:param>
+
+ <xsl:copy-of select='$content'/>
+ </xsl:template>
+
+ <xsl:template name='doc:make-paragraph'>
+ <xsl:param name='style' select='"unknown"'/>
+ <xsl:param name='content'>
+ <xsl:apply-templates mode='doc:body'/>
+ </xsl:param>
+ <xsl:param name='outline.level' select='0'/>
+ <xsl:param name='attributes.node' select='.'/>
+
+ <text:p text:style-name='{$style}'>
+
+ <xsl:call-template name='attributes'>
+ <xsl:with-param name='node' select='$attributes.node'/>
+ </xsl:call-template>
+
+ <xsl:copy-of select='$content'/>
+ </text:p>
+ </xsl:template>
+
+ <xsl:template name='doc:make-phrase'>
+ <xsl:param name='style' select='"unknown"'/>
+ <xsl:param name='content'>
+ <xsl:apply-templates mode='doc:body'/>
+ </xsl:param>
+
+ <text:span text:style-name='{$style}'>
+ <xsl:copy-of select='$content'/>
+ </text:span>
+ </xsl:template>
+
+ <xsl:template name='doc:make-hyperlink'/>
+ <xsl:template name='doc:make-hyperlink-not-implemented'>
+ <xsl:param name='target'/>
+ <xsl:param name='content'>
+ <xsl:apply-templates mode='doc:body'/>
+ </xsl:param>
+
+ <text:link href='{$target}'>
+ </text:link>
+ </xsl:template>
+
+ <xsl:template name='doc:make-table'/>
+ <xsl:template name='doc:make-table-not-yet-implemented'>
+ <xsl:param name='columns'/>
+ <xsl:param name='content'>
+ <xsl:apply-templates mode='doc:body'/>
+ </xsl:param>
+
+ </xsl:template>
+
+ <xsl:template name='doc:make-table-row'>
+ <xsl:param name='content'>
+ <xsl:apply-templates mode='doc:body'/>
+ </xsl:param>
+ <xsl:param name='is-header' select='false()'/>
+
+ </xsl:template>
+
+ <xsl:template name='doc:make-table-cell'>
+ <xsl:param name='width' select='0'/>
+ <xsl:param name='hidden' select='false()'/>
+ <xsl:param name='rowspan' select='1'/>
+ <xsl:param name='colspan' select='1'/>
+ <xsl:param name='content'>
+ <xsl:apply-templates mode='doc:body'/>
+ </xsl:param>
+
+ </xsl:template>
+
+ <xsl:template name='doc:make-soft-break'>
+ <text:br/>
+ </xsl:template>
+
+ <xsl:template name='attributes'>
+ <xsl:param name='node' select='.'/>
+
+ </xsl:template>
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/roundtrip/dbk2pages.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/roundtrip/dbk2pages.xsl
new file mode 100644
index 0000000..f473555
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/roundtrip/dbk2pages.xsl
@@ -0,0 +1,441 @@
+<xsl:stylesheet version="1.0"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:sfa="http://developer.apple.com/namespaces/sfa"
+ xmlns:sf="http://developer.apple.com/namespaces/sf"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:sl="http://developer.apple.com/namespaces/sl"
+ xmlns:xi="http://www.w3.org/2001/XInclude"
+ xmlns:doc='http://docbook.org/ns/docbook'
+ xmlns:rnd='http://docbook.org/ns/docbook/roundtrip'
+ exclude-result-prefixes='doc rnd xi'>
+
+ <xsl:import href='dbk2wp.xsl'/>
+
+ <xsl:output method="xml" indent='yes' encoding='ascii'/>
+
+ <!-- ********************************************************************
+ $Id: dbk2pages.xsl 7701 2008-02-22 06:07:31Z balls $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+ <xsl:include href='../VERSION'/>
+ <xsl:include href='param.xsl'/>
+
+ <xsl:variable name='templatedoc' select='document($pages.template)'/>
+
+ <!-- Find all tables in the document once,
+ as we will be iterating over them in more than one place.
+ -->
+ <xsl:variable name='rnd:pages-tables'
+ select='//doc:table|//doc:informaltable'/>
+
+ <!-- Lookup style identifiers from their user-visible name -->
+ <xsl:variable name='paragraph-styles'
+ select='$templatedoc//sf:paragraphstyle'/>
+ <xsl:variable name='character-styles'
+ select='$templatedoc//sf:characterstyle'/>
+
+ <xsl:template match="/" name='pages.top'>
+ <xsl:param name='doc' select='/'/>
+
+ <xsl:if test='not($pages.template)'>
+ <xsl:message terminate='yes'>Please specify the template document with the "pages.template" parameter</xsl:message>
+ </xsl:if>
+ <xsl:if test='not($templatedoc)'>
+ <xsl:message terminate='yes'>Unable to open template document "<xsl:value-of select='$pages.template'/>"</xsl:message>
+ </xsl:if>
+
+ <sl:document
+ sfa:ID="SLPublicationModel-0"
+ sl:version="72007061400"
+ sl:generator="slingshot"
+ sl:app_build_date="Sep 26 2007, 14:46:11">
+
+ <xsl:apply-templates select='$templatedoc/sl:document/*[not(self::sf:text-storage)]'
+ mode='doc:copy'/>
+
+ <xsl:apply-templates select='$doc/*'
+ mode='doc:toplevel'/>
+
+ <xsl:apply-templates select='$templatedoc/sl:document/sf:text-storage/following-sibling::*'
+ mode='doc:copy'/>
+ </sl:document>
+ </xsl:template>
+
+ <xsl:template match='sf:calc-engine' mode='doc:copy'>
+ <xsl:copy>
+ <xsl:apply-templates select='@*' mode='doc:copy'/>
+
+ <xsl:choose>
+ <xsl:when test='not(sf:calc-engine-entities)'>
+ <xsl:call-template name='rnd:pages-make-calc-engine-entities'/>
+ <xsl:apply-templates mode='doc:copy'/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates mode='doc:copy'/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:copy>
+ </xsl:template>
+ <xsl:template name='rnd:pages-make-calc-engine-entities'
+ match='sf:calc-engine-entities' mode='doc:copy'>
+ <sf:calc-engine-entities>
+ <xsl:choose>
+ <xsl:when test='self::calc-engine-entities'>
+ <xsl:apply-templates select='@*' mode='doc:copy'/>
+ <xsl:apply-templates mode='doc:copy'/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:attribute name='sfa:ID'>
+ <xsl:text>DocBookRoundtrip-1</xsl:text>
+ </xsl:attribute>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:for-each select='$rnd:pages-tables'>
+ <xsl:variable name='num' select='position()'/>
+
+ <xsl:variable name='num-cells'
+ select='count(doc:tgroup/*/doc:row/doc:entry)'/>
+ <xsl:variable name='num-rows' select='count(doc:tgroup/*/doc:row)'/>
+ <xsl:variable name='num-cols' select='$num-cells div $num-rows'/>
+
+ <sf:tabular-model sfa:ID='SFTTableModel-{$num}' sf:name='Unnamed Table'
+ sfa:id=''
+ sf:num-header-rows='{count(doc:tgroup/doc:thead/doc:row)}' sf:num-footer-rows='{count(doc:tgroup/doc:tfoot/doc:row)}'
+ sf:num-header-columns='0' sf:name-is-visible='false' sf:grouping-enabled='false'>
+ <sf:grid sfa:ID='SFTTableGrid-{$num}'
+ sf:ocnt='{$num-cells}'
+ sf:numcols='{$num-cols}'
+ sf:numrows='{$num-rows}'
+ sf:hiddennumcols='0' sf:hiddennumrows='0'>
+ <sf:columns sf:count='{$num-cols}'>
+ <xsl:apply-templates select='doc:tgroup/doc:colspec'
+ mode='rnd:pages-table-colspec'/>
+ </sf:columns>
+ <sf:vertical-gridline-styles sf:array-size='0'/> <!-- TODO: borders -->
+ <sf:rows sf:count='{$num-rows}'>
+ <xsl:call-template name='rnd:pages-make-table-rowspecs'>
+ <xsl:with-param name='number' select='$num-rows'/>
+ </xsl:call-template>
+ </sf:rows>
+ <sf:horizontal-gridline-styles sf:array-size='0'/> <!-- TODO: borders -->
+ <sf:datasource sfa:ID='SFTConcreteTableDataSource-{$num}'>
+ <xsl:apply-templates select='doc:tgroup/doc:thead/doc:row'
+ mode='rnd:pages-table-data'>
+ <xsl:with-param name='start-row' select='0'/>
+ </xsl:apply-templates>
+ <xsl:apply-templates select='doc:tgroup/doc:tbody/doc:row'
+ mode='rnd:pages-table-data'>
+ <xsl:with-param name='start-row' select='count(doc:tgroup/doc:thead/doc:row)'/>
+ </xsl:apply-templates>
+ <xsl:apply-templates select='doc:tgroup/doc:tfoot/doc:row'
+ mode='rnd:pages-table-data'>
+ <xsl:with-param name='start-row' select='count(doc:tgroup/doc:thead/doc:row) + count(doc:tgroup/doc:tbody/doc:row)'/>
+ </xsl:apply-templates>
+ </sf:datasource>
+ <sf:sort sfa:ID='DocBookPagesTableNSArray-{$num}'>
+ <sf:sort-spec sfa:ID='SFTTableSortSpec-{$num}'
+ sf:sort-col='0' sf:sort-order='true'/>
+ </sf:sort>
+ <sf:filterset sfa:ID='SFTTableFilterSet-{$num}'
+ sf:type='0' sf:enabled='false' sf:spec-count='1'>
+ <sf:filterspec sfa:ID='SFTTableFilterSpec-{$num}'
+ sf:filtercol='0' sf:predicate='1' sf:keyscale='0' sf:key1=''/>
+ </sf:filterset>
+ <sf:cell-comment-mapping sfa:ID='DocBookPagesTableCellCommentNSMutableDictionary-{$num}'/>
+ <sf:error_warning_mapping sfa:ID='DocBookPagesTableErrorWarningNSMutableDictionary-{$num}'/>
+ </sf:grid>
+ </sf:tabular-model>
+ </xsl:for-each>
+ </sf:calc-engine-entities>
+ </xsl:template>
+
+ <xsl:template match='doc:row' mode='rnd:pages-table-data'>
+ <xsl:param name='start-row' select='0'/>
+ <xsl:apply-templates mode='rnd:pages-table-data'>
+ <xsl:with-param name='row'
+ select='$start-row + count(preceding-sibling::doc:row)'/>
+ </xsl:apply-templates>
+ </xsl:template>
+ <xsl:template match='doc:entry' mode='rnd:pages-table-data'>
+ <xsl:param name='row' select='0'/>
+ <sf:text-cell sf:flags='4' sf:col='{count(preceding-sibling::doc:entry)}' sf:row='{$row}'>
+ <sf:cell-style-ref sfa:IDREF='SFTCellStyle-3'/>
+ <sf:content-size sfa:w='60' sfa:h='25'/>
+ <sf:cell-text>
+ <xsl:choose>
+ <xsl:when test='count(.//*) > 2'>
+ <sf:cell-storage>
+ <sf:stylesheet-ref sfa:IDREF="SFSStylesheet-1"/>
+ <sf:text-body>
+ <xsl:apply-templates/>
+ </sf:text-body>
+ </sf:cell-storage>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:attribute name='sfa:string'>
+ <xsl:apply-templates mode='rnd:pages-table-text'/>
+ </xsl:attribute>
+ </xsl:otherwise>
+ </xsl:choose>
+ </sf:cell-text>
+ </sf:text-cell>
+ </xsl:template>
+
+ <xsl:template name='rnd:pages-make-table-rowspecs'>
+ <xsl:param name='number' select='0'/>
+
+ <xsl:choose>
+ <xsl:when test='$number &lt;= 0'/>
+ <xsl:otherwise>
+ <sf:grid-row sf:height='25' sf:fitting-height='25'/>
+ <xsl:call-template name='rnd:pages-make-table-rowspecs'>
+ <xsl:with-param name='number' select='$number - 1'/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+ <xsl:template match='doc:colspec' mode='rnd:pages-table-colspec'>
+ <sf:grid-column sf:width='{@colwidth}' sf:preferred-width='{@colwidth}'
+ sf:fitting-width='{@colwidth}'/>
+ </xsl:template>
+
+ <xsl:template name='doc:make-body'>
+ <xsl:param name='content'>
+ <xsl:apply-templates mode='doc:body'/>
+ </xsl:param>
+
+ <sf:text-storage sf:kind='body' sfa:ID='SFWPStorage-7'>
+ <sf:stylesheet-ref sfa:IDREF='SFSStylesheet-1'/>
+
+ <xsl:if test='$rnd:pages-tables'>
+ <sf:attachments>
+ <xsl:for-each select='$rnd:pages-tables'>
+ <xsl:variable name='num' select='position()'/>
+
+ <sf:attachment sfa:ID='SFTTableAttachment-{$num}'
+ sfa:sfclass='' sf:kind='tabular-attachment'>
+ <sf:tabular-info sfa:ID='SFTTableInfo-{$num}'>
+ <sf:geometry sfa:ID='DocBookAffineGeometry-{$num}'
+ sf:sizesLocked='true'>
+ <sf:naturalSize sfa:w='480' sfa:h='126'/>
+ <sf:size sfa:w='480' sfa:h='126'/>
+ <sf:position sfa:x='0' sfa:y='0'/>
+ </sf:geometry>
+ <sf:style>
+ <sf:tabular-style-ref sfa:IDREF='SFTTableStyle-0'/>
+ </sf:style>
+ <sf:tabular-model-ref sfa:IDREF='SFTTableModel-{$num}'/>
+ </sf:tabular-info>
+ <sf:position sfa:x='0' sfa:y='0'/>
+ </sf:attachment>
+
+ </xsl:for-each>
+ </sf:attachments>
+ </xsl:if>
+
+ <sf:text-body>
+ <sf:page-start sf:page-index='0'/>
+ <sf:container-hint sf:page-index="0" sf:cindex="0" sf:sindex="0" sf:lindex="0" sf:frame-x="56.692913055419922" sf:frame-y="56.692913055419922" sf:frame-w="481.61416625976562" sf:frame-h="714" sf:anchor-loc="0"/>
+
+ <sf:section sf:name="Chapter 1" sf:style="section-style-0">
+ <sf:layout sf:style="layout-style-20">
+ <xsl:copy-of select='$content'/>
+ </sf:layout>
+ </sf:section>
+ </sf:text-body>
+ </sf:text-storage>
+ </xsl:template>
+
+ <xsl:template name='doc:make-subsection'>
+ <xsl:param name='content'>
+ <xsl:apply-templates mode='doc:body'/>
+ </xsl:param>
+
+ <xsl:copy-of select='$content'/>
+ </xsl:template>
+
+ <xsl:template name='doc:make-paragraph'>
+ <xsl:param name='style' select='"unknown"'/>
+ <xsl:param name='content'>
+ <xsl:apply-templates mode='doc:body'/>
+ </xsl:param>
+ <xsl:param name='outline.level' select='0'/>
+ <xsl:param name='attributes.node' select='.'/>
+
+ <sf:p>
+ <xsl:if test='$style != ""'>
+ <xsl:attribute name='sf:style'>
+ <xsl:call-template name='doc:lookup-paragraph-style'>
+ <xsl:with-param name='style' select='$style'/>
+ </xsl:call-template>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:call-template name='attributes'>
+ <xsl:with-param name='node' select='$attributes.node'/>
+ </xsl:call-template>
+
+ <xsl:copy-of select='$content'/>
+ <sf:br/>
+ </sf:p>
+ </xsl:template>
+
+ <xsl:template name='doc:make-phrase'>
+ <xsl:param name='style' select='""'/>
+ <xsl:param name='italic' select='0'/>
+ <xsl:param name='bold' select='0'/>
+ <xsl:param name='content'>
+ <xsl:apply-templates mode='doc:phrase'/>
+ </xsl:param>
+
+ <!-- TODO: handle italic and bold parameters -->
+
+ <xsl:choose>
+ <xsl:when test='$style != ""'>
+ <sf:span>
+ <xsl:attribute name='sf:style'>
+ <xsl:call-template name='doc:lookup-character-style'>
+ <xsl:with-param name='style' select='$style'/>
+ </xsl:call-template>
+ </xsl:attribute>
+
+ <xsl:copy-of select='$content'/>
+ </sf:span>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:copy-of select='$content'/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+ <xsl:template name='doc:make-hyperlink'>
+ <xsl:param name='target'/>
+ <xsl:param name='content'>
+ <xsl:apply-templates mode='doc:body'/>
+ </xsl:param>
+
+ <sf:link href='{$target}'>
+ <sf:span>
+ <xsl:attribute name='sf:style'>
+ <xsl:call-template name='doc:lookup-character-style'>
+ <xsl:with-param name='style'>email</xsl:with-param>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:copy-of select='$content'/>
+ </sf:span>
+ </sf:link>
+ </xsl:template>
+
+ <xsl:template name='doc:make-table'>
+ <xsl:param name='columns'/>
+ <xsl:param name='content'>
+ <xsl:apply-templates mode='doc:body'/>
+ </xsl:param>
+
+ <xsl:variable name='this' select='.'/>
+
+ <sf:p>
+ <xsl:attribute name='sf:style'>
+ <xsl:call-template name='doc:lookup-paragraph-style'>
+ <xsl:with-param name='style' select='"para"'/>
+ </xsl:call-template>
+ </xsl:attribute>
+
+ <sf:attachment-ref sf:kind='tabular-attachment'>
+ <xsl:attribute name='sfa:IDREF'>
+ <xsl:text>SFTTableAttachment-</xsl:text>
+ <xsl:for-each select='$rnd:pages-tables'>
+ <xsl:if test='generate-id() = generate-id($this)'>
+ <xsl:value-of select='position()'/>
+ </xsl:if>
+ </xsl:for-each>
+ </xsl:attribute>
+ </sf:attachment-ref>
+ <sf:br/>
+ </sf:p>
+ </xsl:template>
+
+ <xsl:template name='doc:make-column'>
+ <xsl:param name='width' select='0'/>
+ </xsl:template>
+
+ <xsl:template name='doc:make-table-row'>
+ <xsl:param name='content'>
+ <xsl:apply-templates mode='doc:body'/>
+ </xsl:param>
+ <xsl:param name='is-header' select='false()'/>
+ </xsl:template>
+
+ <xsl:template name='doc:make-table-cell'>
+ <xsl:param name='width' select='0'/>
+ <xsl:param name='hidden' select='false()'/>
+ <xsl:param name='rowspan' select='1'/>
+ <xsl:param name='colspan' select='1'/>
+ <xsl:param name='content'>
+ <xsl:apply-templates mode='doc:body'/>
+ </xsl:param>
+ </xsl:template>
+
+ <xsl:template name='doc:make-soft-break'>
+ <sf:br/>
+ </xsl:template>
+
+ <xsl:template name='attributes'>
+ <xsl:param name='node' select='.'/>
+
+ <xsl:for-each select='$node/@*'>
+ <sf:span>
+ <xsl:attribute name='sf:style'>
+ <xsl:call-template name='doc:lookup-character-style'>
+ <xsl:with-param name='style'>attribute-name</xsl:with-param>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:value-of select='name()'/>
+ </sf:span>
+ <sf:span>
+ <xsl:attribute name='sf:style'>
+ <xsl:call-template name='doc:lookup-character-style'>
+ <xsl:with-param name='style'>attribute-value</xsl:with-param>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:value-of select='.'/>
+ </sf:span>
+ </xsl:for-each>
+ </xsl:template>
+
+ <xsl:template name='doc:lookup-paragraph-style'>
+ <xsl:param name='style'/>
+
+ <xsl:variable name='style.cooked'>
+ <xsl:choose>
+ <xsl:when test='$style = "Normal"'>para</xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select='$style'/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:if test='not($paragraph-styles[@sf:name = $style.cooked])'>
+ <xsl:message>unable to find paragraph style "<xsl:value-of select='$style.cooked'/>"</xsl:message>
+ </xsl:if>
+
+ <xsl:value-of select='$paragraph-styles[@sf:name = $style.cooked]/@sf:ident'/>
+ </xsl:template>
+ <xsl:template name='doc:lookup-character-style'>
+ <xsl:param name='style'/>
+
+ <xsl:if test='not($character-styles[@sf:name = $style])'>
+ <xsl:message>unable to find character style "<xsl:value-of select='$style'/>"</xsl:message>
+ </xsl:if>
+
+ <xsl:value-of select='$character-styles[@sf:name = $style]/@sf:ident'/>
+ </xsl:template>
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/roundtrip/dbk2wordml.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/roundtrip/dbk2wordml.xsl
new file mode 100644
index 0000000..07bd08d
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/roundtrip/dbk2wordml.xsl
@@ -0,0 +1,401 @@
+<xsl:stylesheet version="1.0"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:w='http://schemas.microsoft.com/office/word/2003/wordml'
+ xmlns:v='urn:schemas-microsoft-com:vml'
+ xmlns:w10="urn:schemas-microsoft-com:office:word"
+ xmlns:aml="http://schemas.microsoft.com/aml/2001/core"
+ xmlns:wx='http://schemas.microsoft.com/office/word/2003/auxHint'
+ xmlns:o="urn:schemas-microsoft-com:office:office"
+ xmlns:dt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882"
+ xmlns:sl='http://schemas.microsoft.com/schemaLibrary/2003/core'
+ xmlns:doc='http://docbook.org/ns/docbook'
+ exclude-result-prefixes='doc'>
+
+ <xsl:import href='dbk2wp.xsl'/>
+
+ <xsl:output method="xml" indent='yes' standalone='yes' encoding='UTF-8'/>
+
+ <!-- ********************************************************************
+ $Id: dbk2wordml.xsl 7701 2008-02-22 06:07:31Z balls $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+ <xsl:include href='../VERSION'/>
+ <xsl:include href='param.xsl'/>
+
+ <xsl:strip-space elements='*'/>
+ <xsl:preserve-space elements='literallayout doc:literallayout
+ programlisting doc:programlisting'/>
+
+ <xsl:variable name='templatedoc' select='document($wordml.template)'/>
+
+ <xsl:template match="/" name='wordml.top'>
+ <xsl:param name='doc' select='/'/>
+
+ <xsl:if test='not($wordml.template)'>
+ <xsl:message terminate='yes'>Please specify the template document with the "wordml.template" parameter</xsl:message>
+ </xsl:if>
+ <xsl:if test='not($templatedoc)'>
+ <xsl:message terminate='yes'>Unable to open template document "<xsl:value-of select='$wordml.template'/>"</xsl:message>
+ </xsl:if>
+
+ <xsl:processing-instruction name='mso-application'>
+ <xsl:text>progid="Word.Document"</xsl:text>
+ </xsl:processing-instruction>
+ <xsl:text>&#xa;</xsl:text>
+
+ <xsl:variable name='info'
+ select='$doc/book/bookinfo|$doc/article/articleinfo'/>
+ <xsl:variable name='authors' select='$info/author|$info/authorinitials|$info/authorgroup/author|$info/authorgroup/editor'/>
+
+ <w:wordDocument
+ w:macrosPresent="no" w:embeddedObjPresent="no" w:ocxPresent="no">
+ <xsl:attribute name='xml:space'>preserve</xsl:attribute>
+
+ <o:DocumentProperties>
+ <o:Author>
+ <xsl:choose>
+ <xsl:when test='$authors'>
+ <xsl:apply-templates select='$authors[1]' mode='doc:docprop.author'/>
+ </xsl:when>
+ <xsl:otherwise>Unknown</xsl:otherwise>
+ </xsl:choose>
+ </o:Author>
+ <o:LastAuthor>
+ <xsl:choose>
+ <xsl:when test='$info/revhistory/revision[1]/*[self::author|self::authorinitials]'>
+ <xsl:apply-templates select='$info/revhistory/revision[1]/*[self::author|self::authorinitials]' mode='doc:docprop.author'/>
+ </xsl:when>
+ <xsl:when test='$authors'>
+ <xsl:apply-templates select='$authors[1]' mode='doc:docprop.author'/>
+ </xsl:when>
+ <xsl:otherwise>Unknown</xsl:otherwise>
+ </xsl:choose>
+ </o:LastAuthor>
+ <o:Revision>1</o:Revision>
+ <o:TotalTime></o:TotalTime>
+
+ <!-- dummy values -->
+ <o:Created>2004-01-01T07:07:00Z</o:Created>
+ <o:LastSaved>2004-01-01T08:08:00Z</o:LastSaved>
+
+ <o:Pages>1</o:Pages>
+ <o:Words>1</o:Words>
+ <o:Characters>1</o:Characters>
+
+ <!-- could derive this from author -->
+ <o:Company>DocBook</o:Company>
+
+ <o:Lines>1</o:Lines>
+ <o:Paragraphs>1</o:Paragraphs>
+ <o:CharactersWithSpaces>1</o:CharactersWithSpaces>
+ <o:Version>11.6113</o:Version>
+ </o:DocumentProperties>
+
+ <xsl:apply-templates select='$templatedoc/w:wordDocument/o:CustomDocumentProperties|$templatedoc/w:wordDocument/w:fonts|$templatedoc/w:wordDocument/w:lists|$templatedoc/w:wordDocument/w:styles' mode='doc:copy'/>
+
+ <w:docPr>
+ <w:view w:val="print"/>
+ <w:zoom w:percent="100"/>
+ <w:doNotEmbedSystemFonts/>
+ <w:attachedTemplate w:val=""/>
+ <w:documentProtection w:formatting='on' w:enforcement='on'
+ w:unprotectPassword='CAA7FF77'/>
+ <w:defaultTabStop w:val="720"/>
+ <w:autoHyphenation/>
+ <w:hyphenationZone w:val="357"/>
+ <w:doNotHyphenateCaps/>
+ <w:evenAndOddHeaders/>
+ <w:characterSpacingControl w:val="DontCompress"/>
+ <w:optimizeForBrowser/>
+ <w:validateAgainstSchema/>
+ <w:saveInvalidXML w:val="off"/>
+ <w:ignoreMixedContent w:val="off"/>
+ <w:alwaysShowPlaceholderText w:val="off"/>
+ <w:footnotePr>
+ <w:footnote w:type="separator">
+ <w:p>
+ <w:r>
+ <w:separator/>
+ </w:r>
+ </w:p>
+ </w:footnote>
+ <w:footnote w:type="continuation-separator">
+ <w:p>
+ <w:r>
+ <w:continuationSeparator/>
+ </w:r>
+ </w:p>
+ </w:footnote>
+ </w:footnotePr>
+ <w:endnotePr>
+ <w:endnote w:type="separator">
+ <w:p>
+ <w:r>
+ <w:separator/>
+ </w:r>
+ </w:p>
+ </w:endnote>
+ <w:endnote w:type="continuation-separator">
+ <w:p>
+ <w:r>
+ <w:continuationSeparator/>
+ </w:r>
+ </w:p>
+ </w:endnote>
+ </w:endnotePr>
+ <w:compat>
+ <w:breakWrappedTables/>
+ <w:snapToGridInCell/>
+ <w:wrapTextWithPunct/>
+ <w:useAsianBreakRules/>
+ <w:useWord2002TableStyleRules/>
+ </w:compat>
+ <w:docVars>
+ </w:docVars>
+ </w:docPr>
+
+ <xsl:apply-templates select='$doc/*' mode='doc:toplevel'/>
+
+ </w:wordDocument>
+ </xsl:template>
+
+ <xsl:template name='doc:make-body'>
+ <xsl:param name='content'>
+ <xsl:apply-templates mode='doc:body'/>
+ </xsl:param>
+
+ <w:body>
+ <wx:sect>
+ <wx:sub-section>
+ <xsl:copy-of select='$content'/>
+ </wx:sub-section>
+ </wx:sect>
+ </w:body>
+ </xsl:template>
+
+ <xsl:template name='doc:make-subsection'>
+ <xsl:param name='content'>
+ <xsl:apply-templates mode='doc:body'/>
+ </xsl:param>
+
+ <wx:sub-section>
+ <xsl:copy-of select='$content'/>
+ </wx:sub-section>
+ </xsl:template>
+
+ <xsl:template name='doc:make-paragraph'>
+ <xsl:param name='style' select='"unknown"'/>
+ <xsl:param name='content'>
+ <xsl:apply-templates mode='doc:body'/>
+ </xsl:param>
+ <xsl:param name='outline.level' select='0'/>
+ <xsl:param name='attributes.node' select='.'/>
+
+ <w:p>
+ <xsl:if test='$style != "" or
+ $outline.level != 0'>
+ <w:pPr>
+ <xsl:if test='$style != ""'>
+ <w:pStyle w:val='{$style}'/>
+ </xsl:if>
+
+ <xsl:if test='$outline.level != 0'>
+ <w:outlineLvl w:val='{$outline.level}'/>
+ </xsl:if>
+ </w:pPr>
+ </xsl:if>
+
+ <xsl:call-template name='attributes'>
+ <xsl:with-param name='node' select='$attributes.node'/>
+ </xsl:call-template>
+
+ <xsl:copy-of select='$content'/>
+ </w:p>
+ </xsl:template>
+
+ <xsl:template name='doc:make-phrase'>
+ <xsl:param name='style' select='""'/>
+ <xsl:param name='italic' select='0'/>
+ <xsl:param name='bold' select='0'/>
+ <xsl:param name='content'>
+ <xsl:apply-templates mode='doc:phrase'/>
+ </xsl:param>
+
+ <w:r>
+ <xsl:if test='$style != "" or
+ $bold = 1 or
+ $italic = 1'>
+ <w:rPr>
+ <xsl:if test='$style != ""'>
+ <w:rStyle w:val='{$style}'/>
+ </xsl:if>
+ <xsl:if test='$italic = 1'>
+ <w:i/>
+ </xsl:if>
+ <xsl:if test='$bold = 1'>
+ <w:b/>
+ </xsl:if>
+ </w:rPr>
+ </xsl:if>
+
+ <w:t>
+ <xsl:copy-of select='$content'/>
+ </w:t>
+ </w:r>
+ </xsl:template>
+
+ <xsl:template name='doc:make-hyperlink'>
+ <xsl:param name='target'/>
+ <xsl:param name='content'>
+ <xsl:apply-templates mode='doc:body'/>
+ </xsl:param>
+
+ <w:hlink w:dest='{$target}'>
+ <xsl:copy-of select='$content'/>
+ </w:hlink>
+ </xsl:template>
+
+ <xsl:template name='doc:make-table'>
+ <xsl:param name='columns'/>
+ <xsl:param name='content'>
+ <xsl:apply-templates select='*[not(self::caption|self::doc:caption|self::textobject|self::doc:textobject)]'
+ mode='doc:body'/>
+ </xsl:param>
+
+ <w:tbl>
+ <w:tblPr>
+ <w:tblW w:w="0" w:type="auto"/>
+ <w:tblInd w:w="108" w:type="dxa"/>
+ <w:tblLayout w:type="Fixed"/>
+ </w:tblPr>
+ <w:tblGrid>
+ <xsl:copy-of select='$columns'/>
+ </w:tblGrid>
+ <xsl:copy-of select='$content'/>
+ </w:tbl>
+ </xsl:template>
+
+ <xsl:template name='doc:make-column'>
+ <xsl:param name='width' select='0'/>
+
+ <w:gridcol w:w='{$width}'/>
+ </xsl:template>
+
+ <xsl:template name='doc:make-table-row'>
+ <xsl:param name='content'>
+ <xsl:apply-templates mode='doc:body'/>
+ </xsl:param>
+ <xsl:param name='is-header' select='false()'/>
+
+ <w:tr>
+ <w:trPr>
+ <xsl:if test='$is-header'>
+ <w:tblHeader/>
+ </xsl:if>
+ </w:trPr>
+ <xsl:copy-of select='$content'/>
+ </w:tr>
+ </xsl:template>
+
+ <xsl:template name='doc:make-table-cell'>
+ <xsl:param name='width' select='0'/>
+ <xsl:param name='hidden' select='false()'/>
+ <xsl:param name='rowspan' select='1'/>
+ <xsl:param name='colspan' select='1'/>
+ <xsl:param name='content'>
+ <xsl:apply-templates mode='doc:body'/>
+ </xsl:param>
+
+ <w:tc>
+ <xsl:if test='$colspan != 1 or
+ $width != 0'>
+ <w:tcPr>
+ <xsl:if test='$colspan != 1 or
+ $width != 0'>
+ <w:tcW w:w='{$width}' w:type='dxa'/>
+ </xsl:if>
+ <xsl:if test='$hidden'>
+ <w:vmerge w:val='{$hidden}'/>
+ </xsl:if>
+ <xsl:if test='$rowspan != 1'>
+ <w:vmerge w:val='restart'/>
+ </xsl:if>
+ <xsl:if test='$colspan != 1'>
+ <w:gridspan w:val='{$colspan}'/>
+ </xsl:if>
+ </w:tcPr>
+ </xsl:if>
+
+ <xsl:copy-of select='$content'/>
+ </w:tc>
+ </xsl:template>
+
+ <xsl:template name='doc:make-soft-break'>
+ <w:br/>
+ </xsl:template>
+
+ <xsl:template name='attributes'>
+ <xsl:param name='node' select='.'/>
+
+ <xsl:if test='$node/@*'>
+ <aml:annotation aml:id='{count(preceding::*) + 1}' w:type='Word.Comment.Start'/>
+ <w:r>
+ <w:rPr>
+ <w:rStyle w:val='attributes'/>
+ </w:rPr>
+ <w:t>
+ <xsl:text> </xsl:text>
+ </w:t>
+ </w:r>
+ <aml:annotation aml:id='{count(preceding::*) + 1}' w:type='Word.Comment.End'/>
+ <w:r>
+ <w:rPr>
+ <w:rStyle w:val='CommentReference'/>
+ </w:rPr>
+ <aml:annotation aml:id='{count(preceding::*) + 1}' aml:author="DocBook" aml:createdate='2004-12-23T00:01:00' w:type='Word.Comment' w:initials='DBK'>
+ <aml:content>
+ <w:p>
+ <w:pPr>
+ <w:pStyle w:val='CommentText'/>
+ </w:pPr>
+ <w:r>
+ <w:rPr>
+ <w:rStyle w:val='CommentReference'/>
+ </w:rPr>
+ <w:annotationRef/>
+ </w:r>
+ <xsl:for-each select='$node/@*'>
+ <w:r>
+ <w:rPr>
+ <w:rStyle w:val='attribute-name'/>
+ </w:rPr>
+ <w:t>
+ <xsl:value-of select='name()'/>
+ </w:t>
+ </w:r>
+ <w:r>
+ <w:t>=</w:t>
+ </w:r>
+ <w:r>
+ <w:rPr>
+ <w:rStyle w:val='attribute-value'/>
+ </w:rPr>
+ <w:t>
+ <xsl:value-of select='.'/>
+ </w:t>
+ </w:r>
+ </xsl:for-each>
+ </w:p>
+ </aml:content>
+ </aml:annotation>
+ </w:r>
+ </xsl:if>
+ </xsl:template>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/roundtrip/dbk2wp.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/roundtrip/dbk2wp.xsl
new file mode 100644
index 0000000..671c58f
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/roundtrip/dbk2wp.xsl
@@ -0,0 +1,1375 @@
+<xsl:stylesheet version="1.0"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:doc='http://docbook.org/ns/docbook'
+ exclude-result-prefixes='doc'>
+
+ <!-- ********************************************************************
+ $Id: dbk2wp.xsl 8047 2008-06-10 12:46:53Z balls $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+ <!-- DO NOT USE THIS STYLESHEET!
+
+ This stylesheet is imported by the other dbk2* stylesheets.
+ Use one of those instead.
+
+ -->
+
+ <xsl:include href='../VERSION'/>
+
+ <!-- doc:docprop.author mode is for creating document metadata -->
+
+ <xsl:template match='author|doc:author|editor|doc:editor' mode='doc:docprop.author'>
+ <xsl:apply-templates select='firstname|doc:firstname |
+ personname/firstname|doc:personname/doc:firstname'
+ mode='doc:docprop.author'/>
+ <xsl:text> </xsl:text>
+ <xsl:apply-templates select='surname|doc:surname |
+ personname/surname|doc:personname/doc:surname'
+ mode='doc:docprop.author'/>
+ </xsl:template>
+
+ <xsl:template match='firstname|doc:firstname |
+ surname|doc:surname'
+ mode='doc:docprop.author'>
+ <xsl:apply-templates select='.' mode='doc:body'/>
+ </xsl:template>
+
+ <!-- doc:toplevel mode is for processing whole documents -->
+
+ <xsl:template match='*' mode='doc:toplevel'>
+ <xsl:call-template name='doc:make-body'/>
+ </xsl:template>
+
+ <!-- doc:body mode is for processing components of a document -->
+
+ <xsl:template match='book|article|chapter|section|sect1|sect2|sect3|sect4|sect5|simplesect |
+ doc:book|doc:article|doc:chapter|doc:section|doc:sect1|doc:sect2|doc:sect3|doc:sect4|doc:sect5|doc:simplesect'
+ mode='doc:body'>
+ <xsl:call-template name='doc:make-subsection'/>
+ </xsl:template>
+
+ <xsl:template match='articleinfo |
+ chapterinfo |
+ bookinfo |
+ doc:info |
+ doc:articleinfo |
+ doc:chapterinfo |
+ doc:bookinfo'
+ mode='doc:body'>
+ <xsl:apply-templates select='title|subtitle|titleabbrev |
+ doc:title|doc:subtitle|doc:titleabbrev'
+ mode='doc:body'/>
+ <xsl:apply-templates select='author|releaseinfo|abstract |
+ doc:author|doc:releaseinfo|doc:abstract'
+ mode='doc:body'/>
+ <!-- current implementation ignores all other metadata -->
+ <xsl:for-each select='*[not(self::title|self::subtitle|self::titleabbrev|self::author|self::releaseinfo|self::abstract |
+ self::doc:title|self::doc:subtitle|self::doc:titleabbrev|self::doc:author|self::doc:releaseinfo|self::doc:abstract)]'>
+ <xsl:call-template name='doc:nomatch'/>
+ </xsl:for-each>
+ </xsl:template>
+
+ <xsl:template match='title|subtitle|titleabbrev |
+ doc:title|doc:subtitle|doc:titleabbrev'
+ mode='doc:body'>
+ <xsl:call-template name='doc:make-paragraph'>
+ <xsl:with-param name='style'>
+ <xsl:choose>
+ <xsl:when test='(parent::section|parent::doc:section or
+ parent::sectioninfo/parent::section|parent::doc:sectioninfo/parent::doc:section) and
+ count(ancestor::section|ancestor::doc:section) > 5'>
+ <xsl:call-template name='doc:warning'>
+ <xsl:with-param name='message'>section nested deeper than 5 levels</xsl:with-param>
+ </xsl:call-template>
+ <xsl:text>sect5-</xsl:text>
+ <xsl:value-of select='local-name()'/>
+ </xsl:when>
+ <xsl:when test='parent::section|parent::doc:section or
+ parent::sectioninfo/parent::section|parent::doc:sectioninfo/parent::doc:section'>
+ <xsl:text>sect</xsl:text>
+ <xsl:value-of select='count(ancestor::section|ancestor::doc:section)'/>
+ <xsl:text>-</xsl:text>
+ <xsl:value-of select='local-name()'/>
+ </xsl:when>
+ <xsl:when test='contains(local-name(..), "info")'>
+ <xsl:value-of select='local-name(../..)'/>
+ <xsl:text>-</xsl:text>
+ <xsl:value-of select='local-name()'/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select='local-name(..)'/>
+ <xsl:text>-</xsl:text>
+ <xsl:value-of select='local-name()'/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:with-param>
+ <xsl:with-param name='outline.level'
+ select='count(ancestor::*) - count(parent::*[contains(local-name(), "info")]) - 1'/>
+ <xsl:with-param name='attributes.node'
+ select='../parent::*[contains(local-name(current()), "info")] |
+ parent::*[not(contains(local-name(current()), "info"))]'/>
+ <xsl:with-param name='content'>
+ <xsl:apply-templates mode='doc:body'/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:template>
+
+ <doc:template name='metadata' xmlns=''>
+ <title>Metadata</title>
+
+ <para>TODO: Handle all metadata elements, apart from titles.</para>
+ </doc:template>
+ <xsl:template match='*[contains(local-name(), "info")]/*[not(self::title|self::subtitle|self::titleabbrev|self::doc:title|self::doc:subtitle|self::doc:titleabbrev)]'
+ priority='0'
+ mode='doc:body'/>
+
+ <xsl:template match='author|editor|othercredit |
+ doc:author|doc:editor|doc:othercredit'
+ mode='doc:body'>
+ <xsl:call-template name='doc:make-paragraph'>
+ <xsl:with-param name='style'
+ select='local-name()'/>
+ <xsl:with-param name='content'>
+ <xsl:apply-templates select='personname|surname|firstname|honorific|lineage|othername|contrib |
+ doc:personname|doc:surname|doc:firstname|doc:honorific|doc:lineage|doc:othername|doc:contrib'
+ mode='doc:body'/>
+ </xsl:with-param>
+ </xsl:call-template>
+
+ <xsl:apply-templates select='affiliation|address |
+ doc:affiliation|doc:address'
+ mode='doc:body'/>
+ <xsl:apply-templates select='authorblurb|personblurb |
+ doc:authorblurb|doc:personblurb'
+ mode='doc:body'/>
+ </xsl:template>
+ <xsl:template match='affiliation|doc:affiliation'
+ mode='doc:body'>
+ <xsl:call-template name='doc:make-paragraph'>
+ <xsl:with-param name='style' select='"affiliation"'/>
+ <xsl:with-param name='content'>
+ <xsl:apply-templates mode='doc:body'/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:template>
+ <xsl:template match='address[parent::author|parent::editor|parent::othercredit] |
+ doc:address[parent::doc:author|parent::doc:editor|parent::doc:othercredit]'
+ mode='doc:body'>
+ <xsl:call-template name='doc:make-paragraph'>
+ <xsl:with-param name='style' select='"address"'/>
+ <xsl:with-param name='content'>
+ <xsl:apply-templates mode='doc:body'/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:template>
+ <!-- do not attempt to handle recursive structures -->
+ <xsl:template match='address[not(parent::author|parent::editor|parent::othercredit)] |
+ doc:address[not(parent::doc:author|parent::doc:editor|parent::doc:othercredit)]'
+ mode='doc:body'>
+ <xsl:apply-templates select='node()[not(self::affiliation|self::authorblurb|self::doc:affiliation|self::doc:authorblurb)]'/>
+ </xsl:template>
+ <xsl:template match='abstract|doc:abstract'
+ mode='doc:body'>
+ <xsl:if test='title|doc:title'>
+ <xsl:call-template name='doc:make-paragraph'>
+ <xsl:with-param name='style' select='"abstract-title"'/>
+ <xsl:with-param name='content'>
+ <xsl:apply-templates select='title/node()|doc:title/node()'
+ mode='doc:body'/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:if>
+
+ <xsl:apply-templates select='*[not(self::title|self::doc:title)]'
+ mode='doc:body'>
+ <xsl:with-param name='class'>abstract</xsl:with-param>
+ </xsl:apply-templates>
+ </xsl:template>
+ <!-- TODO -->
+ <xsl:template match='authorblurb|personblurb |
+ doc:authorblurb|doc:personblurb'
+ mode='doc:body'/>
+
+ <!-- TODO: handle inline markup (eg. emphasis) -->
+ <xsl:template match='surname|firstname|honorific|lineage|othername|contrib|email|shortaffil|jobtitle|orgname|orgdiv|street|pob|postcode|city|state|country|phone|fax|citetitle |
+ doc:surname|doc:firstname|doc:honorific|doc:lineage|doc:othername|doc:contrib|doc:email|doc:shortaffil|doc:jobtitle|doc:orgname|doc:orgdiv|doc:street|doc:pob|doc:postcode|doc:city|doc:state|doc:country|doc:phone|doc:fax|doc:citetitle'
+ mode='doc:body'>
+ <xsl:if test='preceding-sibling::*'>
+ <xsl:call-template name='doc:make-phrase'>
+ <xsl:with-param name='content'>
+ <xsl:text> </xsl:text>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:if>
+ <xsl:call-template name='doc:handle-linebreaks'>
+ <xsl:with-param name='style' select='local-name()'/>
+ <xsl:with-param name='content' select='node()'/>
+ </xsl:call-template>
+ </xsl:template>
+ <xsl:template match='email|doc:email'
+ mode='doc:body'>
+ <xsl:variable name='address'>
+ <xsl:choose>
+ <xsl:when test='starts-with(., "mailto:")'>
+ <xsl:value-of select='.'/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text>mailto:</xsl:text>
+ <xsl:value-of select='.'/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:call-template name='doc:make-hyperlink'>
+ <xsl:with-param name='target' select='$address'/>
+ <xsl:with-param name='content'>
+ <xsl:call-template name='doc:handle-linebreaks'>
+ <xsl:with-param name='style'>Hyperlink</xsl:with-param>
+ </xsl:call-template>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:template>
+ <!-- otheraddr often contains ulink -->
+ <xsl:template match='otheraddr|doc:otheraddr'
+ mode='doc:body'>
+ <xsl:choose>
+ <xsl:when test='ulink|doc:ulink'>
+ <xsl:for-each select='ulink|doc:ulink'>
+ <xsl:variable name='prev'
+ select='preceding-sibling::ulink[1] |
+ preceding-sibling::doc:ulink[1]'/>
+ <xsl:choose>
+ <xsl:when test='$prev'>
+ <xsl:for-each
+ select='preceding-sibling::node()[generate-id(following-sibling::*[self::ulink|self::doc:ulink][1]) = generate-id(current())]'>
+ <xsl:call-template name='doc:handle-linebreaks'>
+ <xsl:with-param name='style'>otheraddr</xsl:with-param>
+ </xsl:call-template>
+ </xsl:for-each>
+ </xsl:when>
+ <xsl:when test='preceding-sibling::node()'>
+ <xsl:call-template name='doc:handle-linebreaks'>
+ <xsl:with-param name='style'>otheraddr</xsl:with-param>
+ </xsl:call-template>
+ </xsl:when>
+ </xsl:choose>
+ <xsl:apply-templates select='.'/>
+ </xsl:for-each>
+ <xsl:if test='*[self::ulink|self::doc:ulink][last()]/following-sibling::node()'>
+ <xsl:call-template name='doc:handle-linebreaks'>
+ <xsl:with-param name='content'
+ select='*[self::ulink|self::doc:ulink][last()]/following-sibling::node()'/>
+ <xsl:with-param name='style'>otheraddr</xsl:with-param>
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name='doc:handle-linebreaks'>
+ <xsl:with-param name='style'>otheraddr</xsl:with-param>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+ <xsl:template match='ulink|doc:ulink'
+ mode='doc:body'>
+ <xsl:call-template name='doc:make-hyperlink'>
+ <xsl:with-param name='target' select='@url'/>
+ <xsl:with-param name='content'>
+ <xsl:call-template name='doc:handle-linebreaks'>
+ <xsl:with-param name='style'>Hyperlink</xsl:with-param>
+ </xsl:call-template>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:template>
+
+ <!-- Cannot round-trip this element -->
+ <xsl:template match='personname|doc:personname'
+ mode='doc:body'>
+ <xsl:apply-templates mode='doc:body'/>
+ </xsl:template>
+
+ <xsl:template match='releaseinfo|doc:releaseinfo'
+ mode='doc:body'>
+ <xsl:call-template name='doc:make-paragraph'>
+ <xsl:with-param name='style'
+ select='"releaseinfo"'/>
+ </xsl:call-template>
+ </xsl:template>
+
+ <xsl:template match='para|doc:para'
+ mode='doc:body'>
+ <xsl:param name='class'/>
+
+ <xsl:variable name='block'
+ select='blockquote|calloutlist|classsynopsis|funcsynopsis|figure|glosslist|graphic|informalfigure|informaltable|itemizedlist|literallayout|mediaobject|mediaobjectco|note|caution|warning|important|tip|orderedlist|programlisting|revhistory|segmentedlist|simplelist|table|variablelist |
+ doc:blockquote|doc:calloutlist|doc:classsynopsis|doc:funcsynopsis|doc:figure|doc:glosslist|doc:graphic|doc:informalfigure|doc:informaltable|doc:itemizedlist|doc:literallayout|doc:mediaobject|doc:mediaobjectco|doc:note|doc:caution|doc:warning|doc:important|doc:tip|doc:orderedlist|doc:programlisting|doc:revhistory|doc:segmentedlist|doc:simplelist|doc:table|doc:variablelist'/>
+
+ <xsl:choose>
+ <xsl:when test='$block'>
+ <xsl:call-template name='doc:make-paragraph'>
+ <xsl:with-param name='style'>
+ <xsl:choose>
+ <xsl:when test='$class != ""'>
+ <xsl:value-of select='$class'/>
+ </xsl:when>
+ <xsl:otherwise>para</xsl:otherwise>
+ </xsl:choose>
+ </xsl:with-param>
+ <xsl:with-param name='content'
+ select='$block[1]/preceding-sibling::node()'/>
+ </xsl:call-template>
+
+ <xsl:for-each select='$block'>
+ <xsl:apply-templates select='.'/>
+
+ <xsl:call-template name='doc:make-paragraph'>
+ <xsl:with-param name='style'>
+ <xsl:choose>
+ <xsl:when test='$class != ""'>
+ <xsl:value-of select='$class'/>
+ </xsl:when>
+ <xsl:otherwise>Normal</xsl:otherwise>
+ </xsl:choose>
+ </xsl:with-param>
+ <xsl:with-param name='content'
+ select='following-sibling::node()[generate-id(preceding-sibling::*[self::blockquote|self::calloutlist|self::figure|self::glosslist|self::graphic|self::informalfigure|self::informaltable|self::itemizedlist|self::literallayout|self::mediaobject|self::mediaobjectco|self::note|self::caution|self::warning|self::important|self::tip|self::orderedlist|self::programlisting|self::revhistory|self::segmentedlist|self::simplelist|self::table|self::variablelist | self::doc:blockquote|self::doc:calloutlist|self::doc:figure|self::doc:glosslist|self::doc:graphic|self::doc:informalfigure|self::doc:informaltable|self::doc:itemizedlist|self::doc:literallayout|self::doc:mediaobject|self::doc:mediaobjectco|self::doc:note|self::doc:caution|self::doc:warning|self::doc:important|self::doc:tip|self::doc:orderedlist|self::doc:programlisting|self::doc:revhistory|self::doc:segmentedlist|self::doc:simplelist|self::doc:table|self::doc:variablelist][1]) = generate-id(current())]'/>
+ </xsl:call-template>
+ </xsl:for-each>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name='doc:make-paragraph'>
+ <xsl:with-param name='style'>
+ <xsl:choose>
+ <xsl:when test='$class != ""'>
+ <xsl:value-of select='$class'/>
+ </xsl:when>
+ <xsl:otherwise>Normal</xsl:otherwise>
+ </xsl:choose>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+ <xsl:template match='simpara|doc:simpara'
+ mode='doc:body'>
+ <xsl:param name='class'/>
+
+ <xsl:call-template name='doc:make-paragraph'>
+ <xsl:with-param name='style'>
+ <xsl:choose>
+ <xsl:when test='$class != ""'>
+ <xsl:value-of select='concat("sim-", $class)'/>
+ </xsl:when>
+ <xsl:otherwise>simpara</xsl:otherwise>
+ </xsl:choose>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:template>
+
+ <xsl:template match='emphasis|doc:emphasis'
+ mode='doc:body'>
+ <xsl:call-template name='doc:make-phrase'>
+ <xsl:with-param name='italic'>
+ <xsl:choose>
+ <xsl:when test='not(@role)'>1</xsl:when>
+ <xsl:otherwise>0</xsl:otherwise>
+ </xsl:choose>
+ </xsl:with-param>
+ <xsl:with-param name='bold'>
+ <xsl:choose>
+ <xsl:when test='@role = "bold" or @role = "strong"'>1</xsl:when>
+ <xsl:otherwise>0</xsl:otherwise>
+ </xsl:choose>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:template>
+
+ <xsl:template match='informalfigure|doc:informalfigure'
+ mode='doc:body'>
+ <xsl:if test='mediaobject/imageobject/imagedata |
+ doc:mediaobject/doc:imageobject/doc:imagedata'>
+ <xsl:call-template name='doc:make-paragraph'>
+ <xsl:with-param name='style' select='"informalfigure-imagedata"'/>
+ <xsl:with-param name='content'>
+ <xsl:call-template name='doc:make-phrase'>
+ <xsl:with-param name='style'/>
+ <xsl:with-param name='content'>
+ <xsl:apply-templates select='mediaobject/imageobject/imagedata/@fileref |
+ doc:mediaobject/doc:imageobject/doc:imagedata/@fileref'
+ mode='textonly'/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:if>
+ <xsl:apply-templates select='caption|doc:caption'
+ mode='doc:body'/>
+ <xsl:for-each select='*[not(self::mediaobject|self::doc:mediaobject|self::caption|self::doc:caption)]'>
+ <xsl:call-template name='doc:nomatch'/>
+ </xsl:for-each>
+ </xsl:template>
+
+ <xsl:template match='mediaobject|mediaobjectco |
+ doc:mediaobject|doc:mediaobjectco'
+ mode='doc:body'>
+ <xsl:apply-templates select='objectinfo/title|doc:objectinfo/doc:title'/>
+ <xsl:apply-templates select='objectinfo/subtitle|objectinfo/subtitle |
+ doc:objectinfo/doc:subtitle|doc:objectinfo/doc:subtitle'/>
+ <!-- TODO: indicate error for other children of objectinfo -->
+
+ <xsl:apply-templates select='*[not(self::objectinfo|self::doc:objectinfo)]'/>
+ </xsl:template>
+ <xsl:template match='imageobject|imageobjectco|audioobject|videoobject |
+ doc:imageobject|doc:imageobjectco|doc:audioobject|doc:videoobject'
+ mode='doc:body'>
+ <xsl:apply-templates select='objectinfo/title|doc:objectinfo/doc:title'/>
+ <xsl:apply-templates select='objectinfo/subtitle|doc:objectinfo/doc:subtitle'/>
+ <!-- TODO: indicate error for other children of objectinfo -->
+
+ <xsl:apply-templates select='areaspec|doc:areaspec'/>
+
+ <xsl:choose>
+ <xsl:when test='imagedata|audiodata|videodata |
+ doc:imagedata|doc:audiodata|doc:videodata'>
+ <xsl:call-template name='doc:make-paragraph'>
+ <xsl:with-param name='style'
+ select='concat(local-name(), "-", local-name(imagedata|audiodata|videodata|doc:imagedata|doc:audiodata|doc:videodata))'/>
+ <xsl:with-param name='content'>
+ <xsl:call-template name='doc:make-phrase'>
+ <xsl:with-param name='content'>
+ <xsl:apply-templates select='*/@fileref'
+ mode='textonly'/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test='self::imageobjectco/imageobject/imagedata |
+ self::doc:imageobjectco/doc:imageobject/doc:imagedata'>
+ <xsl:call-template name='doc:make-paragraph'>
+ <xsl:with-param name='style'
+ select='concat(local-name(), "-imagedata")'/>
+ <xsl:with-param name='content'>
+ <xsl:call-template name='doc:make-phrase'>
+ <xsl:with-param name='content'>
+ <xsl:apply-templates select='*/@fileref'
+ mode='textonly'/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:when>
+ </xsl:choose>
+ <xsl:apply-templates select='calloutlist|doc:calloutlist'/>
+
+ <xsl:for-each select='*[not(self::imageobject |
+ self::imagedata |
+ self::audiodata |
+ self::videodata |
+ self::areaspec |
+ self::calloutlist |
+ self::doc:imageobject |
+ self::doc:imagedata |
+ self::doc:audiodata |
+ self::doc:videodata |
+ self::doc:areaspec |
+ self::doc:calloutlist)]'>
+ <xsl:call-template name='doc:nomatch'/>
+ </xsl:for-each>
+ </xsl:template>
+ <xsl:template match='textobject|doc:textobject'
+ mode='doc:body'>
+ <xsl:choose>
+ <xsl:when test='objectinfo/title|objectinfo|subtitle |
+ doc:objectinfo/doc:title|doc:objectinfo|doc:subtitle'>
+ <xsl:apply-templates select='objectinfo/title|doc:objectinfo/doc:title'
+ mode='doc:body'/>
+ <xsl:apply-templates select='objectinfo/subtitle|doc:objectinfo/doc:subtitle'
+ mode='doc:body'/>
+ <!-- TODO: indicate error for other children of objectinfo -->
+ </xsl:when>
+
+ <!-- In a table, the table itself and the caption delimit the textobject -->
+ <xsl:when test='ancestor::table |
+ ancestor::doc:table |
+ ancestor::informaltable |
+ ancestor::doc:informaltable'/>
+
+ <xsl:otherwise>
+ <!-- synthesize a title so that the parent textobject
+ can be recreated.
+ -->
+ <xsl:call-template name='doc:make-paragraph'>
+ <xsl:with-param name='style' select='"textobject-title"'/>
+ <xsl:with-param name='content'>
+ <xsl:call-template name='doc:make-phrase'>
+ <xsl:with-param name='content'>
+ <xsl:text>Text Object </xsl:text>
+ <xsl:number level='any'/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:apply-templates select='*[not(self::objectinfo|self::doc:objectinfo)]'
+ mode='doc:body'/>
+ </xsl:template>
+
+ <xsl:template match='caption|doc:caption'
+ mode='doc:body'>
+ <xsl:choose>
+ <xsl:when test='not(*)'>
+ <xsl:call-template name='doc:make-paragraph'>
+ <xsl:with-param name='style' select='"Caption"'/>
+ <xsl:with-param name='content'>
+ <xsl:apply-templates/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test='not(text()) and
+ count(*) = count(para|doc:para) and
+ count(*) = 1'>
+ <xsl:call-template name='doc:make-paragraph'>
+ <xsl:with-param name='style' select='"caption"'/>
+ <xsl:with-param name='content'>
+ <xsl:apply-templates select='*/node()' mode='doc:body'/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test='text()'>
+ <!-- Not valid DocBook -->
+ <xsl:call-template name='doc:nomatch'/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name='doc:make-paragraph'>
+ <xsl:with-param name='style' select='"Caption"'/>
+ <xsl:with-param name='content'>
+ <xsl:apply-templates select='*[self::para|self::doc:para][1]/node()'
+ mode='doc:body'/>
+ </xsl:with-param>
+ </xsl:call-template>
+ <xsl:for-each select='text()|*[not(self::para|self::doc:para)]|*[self::para|self::doc:para][position() != 1]'>
+ <xsl:call-template name='doc:nomatch'/>
+ </xsl:for-each>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+ <xsl:template match='area|areaspec|doc:area|doc:areaspec'
+ mode='doc:body'>
+ <xsl:call-template name='doc:make-paragraph'>
+ <xsl:with-param name='style' select='local-name()'/>
+ <xsl:with-param name='content'/>
+ </xsl:call-template>
+ </xsl:template>
+
+ <xsl:template match='calloutlist|doc:calloutlist'
+ mode='doc:body'>
+ <xsl:apply-templates select='callout|doc:callout'/>
+ </xsl:template>
+
+ <xsl:template match='callout|doc:callout'
+ mode='doc:body'>
+ <xsl:call-template name='doc:make-paragraph'>
+ <xsl:with-param name='style' select='"callout"'/>
+ <xsl:with-param name='content'>
+ <!-- Normally a para would be the first child of a callout -->
+ <xsl:apply-templates select='*[1][self::para|self::doc:para]/node()'
+ mode='list'/>
+ </xsl:with-param>
+ </xsl:call-template>
+
+ <!-- This is to catch the case where a listitem's first child is not a paragraph.
+ - We may not be able to represent this properly.
+ -->
+ <xsl:apply-templates select='*[1][not(self::para|self::doc:para)]'
+ mode='list'/>
+
+ <xsl:apply-templates select='*[position() != 1]'
+ mode='list'/>
+ </xsl:template>
+
+ <xsl:template match='table|informaltable |
+ doc:table|doc:informaltable'
+ mode='doc:body'>
+ <xsl:call-template name='doc:make-table'>
+ <xsl:with-param name='columns'>
+ <xsl:apply-templates select='tgroup/colspec|doc:tgroup/doc:colspec'
+ mode='doc:column'/>
+ </xsl:with-param>
+ </xsl:call-template>
+ <xsl:apply-templates select='textobject|doc:textobject'
+ mode='doc:body'/>
+ <xsl:choose>
+ <xsl:when test='caption|doc:caption'>
+ <xsl:apply-templates select='caption|doc:caption'
+ mode='doc:body'/>
+ </xsl:when>
+ <xsl:when test='textobject|doc:textobject'>
+ <!-- Synthesize a caption to delimit the textobject -->
+ <xsl:call-template name='doc:make-paragraph'>
+ <xsl:with-param name='style'>Caption</xsl:with-param>
+ <xsl:with-param name='content'/>
+ <xsl:with-param name='attributes.node' select='/..'/>
+ </xsl:call-template>
+ </xsl:when>
+ </xsl:choose>
+ </xsl:template>
+
+ <xsl:template match='colspec|doc:colspec' mode='doc:column'>
+ <xsl:variable name='width'>
+ <xsl:choose>
+ <xsl:when test='contains(@colwidth, "*")'>
+ <!-- May need to resolve proportional width with other columns -->
+ <xsl:value-of select='substring-before(@colwidth, "*")'/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select='@colwidth'/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:call-template name='doc:make-column'>
+ <xsl:with-param name='width' select='$width'/>
+ </xsl:call-template>
+ </xsl:template>
+
+ <xsl:template match='colspec|doc:colspec' mode='doc:body'/>
+
+ <xsl:template name='doc:repeat'>
+ <xsl:param name='repeats' select='0'/>
+ <xsl:param name='content'/>
+
+ <xsl:if test='$repeats > 0'>
+ <xsl:copy-of select='$content'/>
+ <xsl:call-template name='doc:repeat'>
+ <xsl:with-param name='repeats' select='$repeats - 1'/>
+ <xsl:with-param name='content' select='$content'/>
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:template>
+ <xsl:template match='tgroup|tbody|thead |
+ doc:tgroup|doc:tbody|doc:thead'
+ mode='doc:body'>
+ <xsl:apply-templates mode='doc:body'/>
+ </xsl:template>
+ <xsl:template match='row|doc:row' mode='doc:body'>
+ <xsl:call-template name='doc:make-table-row'>
+ <xsl:with-param name='is-header' select='boolean(parent::thead|parent::doc:thead)'/>
+ </xsl:call-template>
+ </xsl:template>
+
+ <xsl:template match='entry|doc:entry' mode='doc:body'>
+
+ <!--
+ Position = Sum(i,preceding-sibling[@colspan = ""]) + entry[i].@colspan)
+ -->
+
+ <xsl:variable name='position'>
+ <xsl:call-template name='doc:sum-sibling'>
+ <xsl:with-param name='sum' select='"1"'/>
+ <xsl:with-param name='node' select='.'/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name='limit' select='$position + @colspan'/>
+
+ <xsl:variable name='width.raw'>
+ <xsl:choose>
+ <xsl:when test='@colspan != ""'>
+
+ <!-- Select all the colspec nodes which correspond to the
+ column. That is all the nodes between the current
+ column number and the column number plus the span.
+ -->
+
+ <xsl:variable name='combinedWidth'>
+ <xsl:call-template name='doc:sum'>
+ <xsl:with-param name='nodes' select='ancestor::*[self::table|self::doc:table|self::informaltable|self::doc:informaltable][1]/*[self::tgroup|self::doc:tgroup]/*[self::colspec|self::doc:colspec][not(position() &lt; $position) and position() &lt; $limit]'/>
+ <xsl:with-param name='sum' select='"0"'/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:value-of select='$combinedWidth'/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select='ancestor::*[self::table|self::doc:table|self::informaltable|self::doc:informaltable][1]/*[self::tgroup|self::doc:tgroup]/*[self::colspec|self::doc:colspec][position() = $position]/@colwidth'/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:call-template name='doc:make-table-cell'>
+ <xsl:with-param name='width'>
+ <xsl:choose>
+ <xsl:when test='contains($width.raw, "*")'>
+
+ <!-- Select all the colspec nodes which correspond to the
+ column. That is all the nodes between the current
+ column number and the column number plus the span.
+ -->
+
+ <xsl:value-of select='substring-before($width.raw, "*")'/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select='$width.raw'/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:with-param>
+
+ <xsl:with-param name='hidden' select='@hidden'/>
+ <xsl:with-param name='rowspan' select='@rowspan'/>
+ <xsl:with-param name='colspan' select='@colspan'/>
+
+ <xsl:with-param name='content'>
+ <xsl:choose>
+ <xsl:when test='not(para|doc:para)'>
+ <!-- TODO: check for any block elements -->
+ <xsl:call-template name='doc:make-paragraph'>
+ <xsl:with-param name='style'/>
+ <xsl:with-param name='attributes.node' select='/..'/>
+ <xsl:with-param name='content'/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates mode='doc:body'/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:template>
+
+ <!-- Calculates the position by adding the
+ count of the preceding siblings where they aren't colspans
+ and adding the colspans of those entries which do.
+ -->
+
+ <xsl:template name='doc:sum-sibling'>
+ <xsl:param name='sum'/>
+ <xsl:param name='node'/>
+
+ <xsl:variable name='add'>
+ <xsl:choose>
+ <xsl:when test='$node/preceding-sibling::*[self::entry|self::doc:entry]/@colspan != ""'>
+ <xsl:value-of select='$node/preceding-sibling::*[self::entry|self::doc:entry]/@colspan'/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select='"1"'/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test='count($node/preceding-sibling::*[self::entry|self::doc:entry]) &gt; 0'>
+ <xsl:call-template name='doc:sum-sibling'>
+ <xsl:with-param name='sum' select='$sum + $add'/>
+ <xsl:with-param name='node'
+ select='$node/preceding-sibling::*[self::entry|self::doc:entry][1]'/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select='$sum'/>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ </xsl:template>
+
+ <xsl:template name='doc:sum'>
+ <xsl:param name='sum' select='"0"'/>
+ <xsl:param name='nodes'/>
+
+ <xsl:variable name='tmpSum' select='$sum + $nodes[1]/@colwidth'/>
+
+ <xsl:choose>
+ <xsl:when test='count($nodes) &gt; 1'>
+ <xsl:call-template name='doc:sum'>
+ <xsl:with-param name='nodes' select='$nodes[position() != 1]'/>
+ <xsl:with-param name='sum' select='$tmpSum'/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select='$tmpSum'/>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ </xsl:template>
+
+ <xsl:template match='*[self::para|self::simpara|self::doc:para|self::doc:simpara]/text()[string-length(normalize-space(.)) != 0]'
+ mode='doc:body'>
+ <xsl:call-template name='doc:handle-linebreaks'/>
+ </xsl:template>
+
+ <xsl:template match='text()[not(parent::para|parent::simpara|parent::literallayout|parent::programlisting | parent::doc:para|parent::doc:simpara|parent::doc:literallayout|parent::doc:programlisting)][string-length(normalize-space(.)) != 0]'
+ mode='doc:body'>
+ <xsl:call-template name='doc:handle-linebreaks'/>
+ </xsl:template>
+ <xsl:template match='text()[string-length(normalize-space(.)) = 0]'
+ mode='doc:body'/>
+ <xsl:template match='literallayout/text()|programlisting/text() |
+ doc:literallayout/text()|doc:programlisting/text()'
+ mode='doc:body'>
+ <xsl:call-template name='doc:handle-linebreaks'/>
+ </xsl:template>
+ <xsl:template name='doc:handle-linebreaks'>
+ <xsl:param name='content' select='.'/>
+ <xsl:param name='style'/>
+
+ <xsl:choose>
+ <xsl:when test='not($content)'/>
+ <xsl:when test='contains($content, "&#xa;")'>
+ <xsl:call-template name='doc:make-phrase'>
+ <xsl:with-param name='style' select='$style'/>
+ <xsl:with-param name='content'
+ select='substring-before($content, "&#xa;")'/>
+ </xsl:call-template>
+
+ <xsl:call-template name='doc:handle-linebreaks-aux'>
+ <xsl:with-param name='content'
+ select='substring-after($content, "&#xa;")'/>
+ <xsl:with-param name='style' select='$style'/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name='doc:make-phrase'>
+ <xsl:with-param name='style' select='$style'/>
+ <xsl:with-param name='content' select='$content'/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+ <!-- pre-condition: leading linefeed has been stripped -->
+ <xsl:template name='doc:handle-linebreaks-aux'>
+ <xsl:param name='content'/>
+ <xsl:param name='style'/>
+
+ <xsl:choose>
+ <xsl:when test='contains($content, "&#xa;")'>
+ <xsl:call-template name='doc:make-phrase'>
+ <xsl:with-param name='style' select='$style'/>
+ <xsl:with-param name='content'>
+ <xsl:call-template name='doc:make-soft-break'/>
+ <xsl:value-of select='substring-before($content, "&#xa;")'/>
+ </xsl:with-param>
+ </xsl:call-template>
+ <xsl:call-template name='doc:handle-linebreaks-aux'>
+ <xsl:with-param name='content'
+ select='substring-after($content, "&#xa;")'/>
+ <xsl:with-param name='style' select='$style'/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name='doc:make-phrase'>
+ <xsl:with-param name='style' select='$style'/>
+ <xsl:with-param name='content'>
+ <xsl:call-template name='doc:make-soft-break'/>
+ <xsl:value-of select='$content'/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+ <xsl:template match='authorblurb|formalpara|legalnotice|note|caution|warning|important|tip |
+ doc:authorblurb|doc:formalpara|doc:legalnotice|doc:note|doc:caution|doc:warning|doc:important|doc:tip'
+ mode='doc:body'>
+ <xsl:apply-templates select='*'>
+ <xsl:with-param name='class'>
+ <xsl:value-of select='local-name()'/>
+ </xsl:with-param>
+ </xsl:apply-templates>
+ </xsl:template>
+
+ <xsl:template match='blockquote|doc:blockquote'
+ mode='doc:body'>
+ <xsl:apply-templates select='blockinfo|title|doc:info|doc:title'
+ mode='doc:body'>
+ <xsl:with-param name='class'>
+ <xsl:value-of select='local-name()'/>
+ </xsl:with-param>
+ </xsl:apply-templates>
+ <xsl:apply-templates select='*[not(self::blockinfo|self::title|self::attribution|self::doc:info|self::doc:title|self::doc:attribution)]'
+ mode='doc:body'>
+ <xsl:with-param name='class' select='"blockquote"'/>
+ </xsl:apply-templates>
+ <xsl:if test='attribution|doc:attribution'>
+ <xsl:call-template name='doc:make-paragraph'>
+ <xsl:with-param name='style' select='"blockquote-attribution"'/>
+ <xsl:with-param name='content'>
+ <xsl:call-template name='doc:make-phrase'>
+ <xsl:with-param name='content'>
+ <xsl:apply-templates select='attribution/node()|doc:attribution/node()'/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:template>
+
+ <xsl:template match='literallayout|programlisting|doc:literallayout|doc:programlisting'
+ mode='doc:body'>
+ <xsl:param name='class'/>
+
+ <xsl:call-template name='doc:make-paragraph'>
+ <xsl:with-param name='style' select='local-name()'/>
+ </xsl:call-template>
+ </xsl:template>
+
+ <xsl:template match='bridgehead|doc:bridgehead'
+ mode='doc:body'>
+ <xsl:call-template name='doc:make-paragraph'>
+ <xsl:with-param name='style' select='"bridgehead"'/>
+ </xsl:call-template>
+ </xsl:template>
+
+ <xsl:template match='itemizedlist|orderedlist |
+ doc:itemizedlist|doc:orderedlist'
+ mode='doc:body'>
+ <xsl:apply-templates select='listitem|doc:listitem'
+ mode='doc:body'/>
+ </xsl:template>
+
+ <xsl:template match='listitem|doc:listitem'
+ mode='doc:body'>
+ <xsl:call-template name='doc:make-paragraph'>
+ <xsl:with-param name='style'
+ select='concat(local-name(..),
+ count(ancestor::itemizedlist|ancestor::orderedlist|ancestor::doc:itemizedlist|ancestor::doc:orderedlist))'/>
+ <xsl:with-param name='is-listitem' select='true()'/>
+
+ <xsl:with-param name='content'>
+ <!-- Normally a para would be the first child of a listitem -->
+ <xsl:apply-templates select='*[1][self::para|self::doc:para]/node()'
+ mode='doc:body'/>
+ </xsl:with-param>
+ </xsl:call-template>
+
+ <!-- This is to catch the case where a listitem's first child is not a paragraph.
+ - We may not be able to represent this properly.
+ -->
+ <xsl:apply-templates select='*[1][not(self::para|self::doc:para)]'
+ mode='doc:list-continue'/>
+
+ <xsl:apply-templates select='*[position() != 1]'
+ mode='doc:list-continue'/>
+ </xsl:template>
+
+ <xsl:template match='para|doc:para' mode='doc:list-continue'>
+ <xsl:apply-templates select='.'
+ mode='doc:body'>
+ <xsl:with-param name='class' select='"para-continue"'/>
+ </xsl:apply-templates>
+ </xsl:template>
+ <!-- non-paragraph elements in a listitem are rolled back into
+ the list item upon conversion.
+ -->
+ <xsl:template match='*' mode='doc:list-continue'>
+ <xsl:apply-templates select='.' mode='doc:body'/>
+ </xsl:template>
+
+ <xsl:template match='variablelist|doc:variablelist'
+ mode='doc:body'>
+ <xsl:apply-templates select='*[not(self::varlistentry|self::doc:varlistentry)]'/>
+
+ <xsl:call-template name='doc:make-table'>
+ <xsl:with-param name='columns'>
+ <xsl:call-template name='doc:make-column'>
+ <xsl:with-param name='width' select='"1"'/>
+ </xsl:call-template>
+ <xsl:call-template name='doc:make-column'>
+ <xsl:with-param name='width' select='"3"'/>
+ </xsl:call-template>
+ </xsl:with-param>
+ <xsl:with-param name='rows'>
+ <xsl:apply-templates select='varlistentry|doc:varlistentry'/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:template>
+ <xsl:template match='varlistentry|doc:varlistentry'
+ mode='doc:body'>
+ <xsl:call-template name='doc:make-table-row'>
+ <xsl:with-param name='content'>
+ <xsl:call-template name='doc:make-table-cell'>
+ <xsl:with-param name='content'>
+ <xsl:call-template name='doc:make-paragraph'>
+ <xsl:with-param name='style' select='"variablelist-term"'/>
+ <xsl:with-param name='content'>
+ <xsl:apply-templates select='*[self::term|self::doc:term][1]/node()'
+ mode='doc:body'/>
+ <xsl:for-each select='*[self::term|self::doc:term][position() != 1]'>
+ <xsl:call-template name='doc:make-phrase'>
+ <xsl:with-param name='content'>
+ <xsl:call-template name='doc:make-soft-break'/>
+ </xsl:with-param>
+ </xsl:call-template>
+ <xsl:apply-templates/>
+ </xsl:for-each>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:with-param>
+ </xsl:call-template>
+ <xsl:call-template name='doc:make-table-cell'>
+ <xsl:with-param name='content'>
+ <xsl:apply-templates select='listitem/node()|doc:listitem/node()'
+ mode='doc:body'/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:template>
+
+ <!-- These elements are not displayed.
+ - However, they may need to be added (perhaps as hidden text)
+ - for round-tripping.
+ -->
+ <xsl:template match='anchor|areaset|audiodata|audioobject|
+ beginpage|
+ constraint|
+ indexterm|itermset|
+ keywordset|
+ msg |
+ doc:anchor|doc:areaset|doc:audiodata|doc:audioobject|
+ doc:beginpage|
+ doc:constraint|
+ doc:indexterm|doc:itermset|
+ doc:keywordset|
+ doc:msg'
+ mode='doc:body'/>
+
+ <xsl:template match='*' name='doc:nomatch'>
+ <xsl:param name='node' select='.'/>
+
+ <xsl:message>
+ <xsl:value-of select='local-name($node)'/>
+ <xsl:if test='namespace-uri($node) != ""'>
+ <xsl:text> [</xsl:text>
+ <xsl:value-of select='namespace-uri($node)'/>
+ <xsl:text>]</xsl:text>
+ </xsl:if>
+ <xsl:text> encountered</xsl:text>
+ <xsl:if test='$node/parent::*'>
+ <xsl:text> in </xsl:text>
+ <xsl:value-of select='local-name($node/parent::*)'/>
+ </xsl:if>
+ <xsl:text>, but no template matches.</xsl:text>
+ </xsl:message>
+
+ <xsl:for-each select='$node'>
+ <xsl:choose>
+ <xsl:when test='self::abstract |
+ self::ackno |
+ self::address |
+ self::answer |
+ self::appendix |
+ self::artheader |
+ self::authorgroup |
+ self::bibliodiv |
+ self::biblioentry |
+ self::bibliography |
+ self::bibliomixed |
+ self::bibliomset |
+ self::biblioset |
+ self::bridgehead |
+ self::calloutlist |
+ self::caption |
+ self::classsynopsis |
+ self::colophon |
+ self::constraintdef |
+ self::copyright |
+ self::dedication |
+ self::epigraph |
+ self::equation |
+ self::example |
+ self::figure |
+ self::funcsynopsis |
+ self::glossary |
+ self::glossdef |
+ self::glossdiv |
+ self::glossentry |
+ self::glosslist |
+ self::graphic |
+ self::highlights |
+ self::imageobject |
+ self::imageobjectco |
+ self::index |
+ self::indexdiv |
+ self::indexentry |
+ self::informalequation |
+ self::informalexample |
+ self::informalfigure |
+ self::lot |
+ self::lotentry |
+ self::mediaobject |
+ self::mediaobjectco |
+ self::member |
+ self::msgentry |
+ self::msgset |
+ self::part |
+ self::partintro |
+ self::personblurb |
+ self::preface |
+ self::printhistory |
+ self::procedure |
+ self::programlisting |
+ self::programlistingco |
+ self::publisher |
+ self::qandadiv |
+ self::qandaentry |
+ self::qandaset |
+ self::question |
+ self::refdescriptor |
+ self::refentry |
+ self::refentrytitle |
+ self::reference |
+ self::refmeta |
+ self::refname |
+ self::refnamediv |
+ self::refpurpose |
+ self::refsect1 |
+ self::refsect2 |
+ self::refsect3 |
+ self::refsection |
+ self::refsynopsisdiv |
+ self::screen |
+ self::screenco |
+ self::screenshot |
+ self::seg |
+ self::seglistitem |
+ self::segmentedlist |
+ self::segtitle |
+ self::set |
+ self::setindex |
+ self::sidebar |
+ self::simplelist |
+ self::simplemsgentry |
+ self::step |
+ self::stepalternatives |
+ self::subjectset |
+ self::substeps |
+ self::task |
+ self::textobject |
+ self::toc |
+ self::videodata |
+ self::videoobject |
+
+ self::doc:abstract |
+ self::doc:ackno |
+ self::doc:address |
+ self::doc:answer |
+ self::doc:appendix |
+ self::doc:artheader |
+ self::doc:authorgroup |
+ self::doc:bibliodiv |
+ self::doc:biblioentry |
+ self::doc:bibliography |
+ self::doc:bibliomixed |
+ self::doc:bibliomset |
+ self::doc:biblioset |
+ self::doc:bridgehead |
+ self::doc:calloutlist |
+ self::doc:caption |
+ self::doc:classsynopsis |
+ self::doc:colophon |
+ self::doc:constraintdef |
+ self::doc:copyright |
+ self::doc:dedication |
+ self::doc:epigraph |
+ self::doc:equation |
+ self::doc:example |
+ self::doc:figure |
+ self::doc:funcsynopsis |
+ self::doc:glossary |
+ self::doc:glossdef |
+ self::doc:glossdiv |
+ self::doc:glossentry |
+ self::doc:glosslist |
+ self::doc:graphic |
+ self::doc:highlights |
+ self::doc:imageobject |
+ self::doc:imageobjectco |
+ self::doc:index |
+ self::doc:indexdiv |
+ self::doc:indexentry |
+ self::doc:informalequation |
+ self::doc:informalexample |
+ self::doc:informalfigure |
+ self::doc:lot |
+ self::doc:lotentry |
+ self::doc:mediaobject |
+ self::doc:mediaobjectco |
+ self::doc:member |
+ self::doc:msgentry |
+ self::doc:msgset |
+ self::doc:part |
+ self::doc:partintro |
+ self::doc:personblurb |
+ self::doc:preface |
+ self::doc:printhistory |
+ self::doc:procedure |
+ self::doc:programlisting |
+ self::doc:programlistingco |
+ self::doc:publisher |
+ self::doc:qandadiv |
+ self::doc:qandaentry |
+ self::doc:qandaset |
+ self::doc:question |
+ self::doc:refdescriptor |
+ self::doc:refentry |
+ self::doc:refentrytitle |
+ self::doc:reference |
+ self::doc:refmeta |
+ self::doc:refname |
+ self::doc:refnamediv |
+ self::doc:refpurpose |
+ self::doc:refsect1 |
+ self::doc:refsect2 |
+ self::doc:refsect3 |
+ self::doc:refsection |
+ self::doc:refsynopsisdiv |
+ self::doc:screen |
+ self::doc:screenco |
+ self::doc:screenshot |
+ self::doc:seg |
+ self::doc:seglistitem |
+ self::doc:segmentedlist |
+ self::doc:segtitle |
+ self::doc:set |
+ self::doc:setindex |
+ self::doc:sidebar |
+ self::doc:simplelist |
+ self::doc:simplemsgentry |
+ self::doc:step |
+ self::doc:stepalternatives |
+ self::doc:subjectset |
+ self::doc:substeps |
+ self::doc:task |
+ self::doc:textobject |
+ self::doc:toc |
+ self::doc:videodata |
+ self::doc:videoobject |
+
+ self::*[not(starts-with(local-name(), "informal")) and contains(local-name(), "info")]'>
+ <xsl:call-template name='doc:make-paragraph'>
+ <xsl:with-param name='style' select='"blockerror"'/>
+ <xsl:with-param name='content'>
+ <xsl:call-template name='doc:make-phrase'>
+ <xsl:with-param name='content'>
+ <xsl:value-of select='local-name()'/>
+ <xsl:if test='namespace-uri() != ""'>
+ <xsl:text> [</xsl:text>
+ <xsl:value-of select='namespace-uri()'/>
+ <xsl:text>]</xsl:text>
+ </xsl:if>
+ <xsl:text> encountered</xsl:text>
+ <xsl:if test='parent::*'>
+ <xsl:text> in </xsl:text>
+ <xsl:value-of select='local-name(parent::*)'/>
+ </xsl:if>
+ <xsl:text>, but no template matches.</xsl:text>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:when>
+ <!-- Some elements are sometimes blocks, sometimes inline
+ <xsl:when test='self::affiliation |
+ self::alt |
+ self::attribution |
+ self::collab |
+ self::collabname |
+ self::confdates |
+ self::confgroup |
+ self::confnum |
+ self::confsponsor |
+ self::conftitle |
+ self::contractnum |
+ self::contractsponsor |
+ self::contrib |
+ self::corpauthor |
+ self::corpcredit |
+ self::corpname |
+ self::edition |
+ self::editor |
+ self::jobtitle |
+ self::personname |
+ self::publishername |
+ self::remark |
+
+ self::doc:affiliation |
+ self::doc:alt |
+ self::doc:attribution |
+ self::doc:collab |
+ self::doc:collabname |
+ self::doc:confdates |
+ self::doc:confgroup |
+ self::doc:confnum |
+ self::doc:confsponsor |
+ self::doc:conftitle |
+ self::doc:contractnum |
+ self::doc:contractsponsor |
+ self::doc:contrib |
+ self::doc:corpauthor |
+ self::doc:corpcredit |
+ self::doc:corpname |
+ self::doc:edition |
+ self::doc:editor |
+ self::doc:jobtitle |
+ self::doc:personname |
+ self::doc:publishername |
+ self::doc:remark'>
+
+ </xsl:when>
+ -->
+ <xsl:otherwise>
+ <xsl:call-template name='doc:make-phrase'>
+ <xsl:with-param name='style' select='"inlineerror"'/>
+ <xsl:with-param name='content'>
+ <xsl:value-of select='local-name()'/>
+ <xsl:text> encountered</xsl:text>
+ <xsl:if test='parent::*'>
+ <xsl:text> in </xsl:text>
+ <xsl:value-of select='local-name(parent::*)'/>
+ </xsl:if>
+ <xsl:text>, but no template matches.</xsl:text>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:for-each>
+ </xsl:template>
+
+ <xsl:template match='*' mode='doc:copy'>
+ <xsl:copy>
+ <xsl:apply-templates select='@*' mode='doc:copy'/>
+ <xsl:apply-templates mode='doc:copy'/>
+ </xsl:copy>
+ </xsl:template>
+ <xsl:template match='@*' mode='doc:copy'>
+ <xsl:copy/>
+ </xsl:template>
+
+ <!-- Stubs: the importing stylesheet must override these -->
+
+ <!-- stub template for creating a paragraph -->
+ <xsl:template name='doc:make-paragraph'>
+ </xsl:template>
+ <!-- stub template for creating a phrase -->
+ <xsl:template name='doc:make-phrase'>
+ </xsl:template>
+
+ <!-- stub template for inserting attributes -->
+ <xsl:template name='doc:attributes'/>
+
+ <!-- emit a message -->
+ <xsl:template name='doc:warning'>
+ <xsl:param name='message'/>
+
+ <xsl:message>WARNING: <xsl:value-of select='$message'/></xsl:message>
+ </xsl:template>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/roundtrip/normalise-common.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/roundtrip/normalise-common.xsl
new file mode 100644
index 0000000..83a16b3
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/roundtrip/normalise-common.xsl
@@ -0,0 +1,39 @@
+<xsl:stylesheet version='1.0'
+ xmlns:xsl='http://www.w3.org/1999/XSL/Transform'
+ xmlns:rnd='http://docbook.org/ns/docbook/roundtrip'
+ xmlns:db='http://docbook.org/ns/docbook'
+ exclude-result-prefixes='db'>
+
+ <!-- ********************************************************************
+ $Id$
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://nwalsh.com/docbook/xsl/ for copyright
+ and other information.
+
+ ******************************************************************** -->
+
+ <!-- rnd:map-paragraph-style and rd:map-character-style
+ allows the application to customise
+ the style names used by overriding this template.
+ The idea is to map custom names back to standard names. -->
+ <xsl:template name='rnd:map-paragraph-style'>
+ <xsl:param name='style'/>
+ <xsl:choose>
+ <xsl:when test='starts-with($style, "Normal")'/>
+
+ <!-- Probably should fold all style names to lower-case -->
+ <xsl:when test='$style = "Caption"'>caption</xsl:when>
+
+ <xsl:otherwise>
+ <xsl:value-of select='$style'/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+ <xsl:template name='rnd:map-character-style'>
+ <xsl:param name='style'/>
+ <xsl:value-of select='$style'/>
+ </xsl:template>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/roundtrip/normalise2sections.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/roundtrip/normalise2sections.xsl
new file mode 100644
index 0000000..51bd9f5
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/roundtrip/normalise2sections.xsl
@@ -0,0 +1,1270 @@
+<?xml version="1.0"?>
+<axsl:stylesheet xmlns:axsl="http://www.w3.org/1999/XSL/Transform" xmlns:dbk="http://docbook.org/ns/docbook" xmlns:rnd="http://docbook.org/ns/docbook/roundtrip" version="1.0">
+<!--====================================-->
+<!--= =-->
+<!--= DO NOT EDIT THIS STYLESHEET =-->
+<!--= =-->
+<!--= This stylesheet is generated =-->
+<!--= by makeSections.xsl and a =-->
+<!--= mapping specification. =-->
+<!--= =-->
+<!--= Revision history: =-->
+<!--= =-->
+<!--= $Id: normalise2sections.xsl 8107 2008-08-17 22:39:58Z balls $ =-->
+<!--= =-->
+<!--====================================-->
+ <axsl:output indent="yes"/>
+ <axsl:strip-space elements="*"/>
+ <axsl:preserve-space elements="dbk:para dbk:emphasis"/>
+ <axsl:template match="dbk:article">
+ <axsl:copy>
+ <axsl:for-each select="@*">
+ <axsl:copy/>
+ </axsl:for-each>
+ <axsl:variable name="books" select="dbk:para[@rnd:style = &quot;book&quot; or @rnd:style = &quot;book-title&quot;]"/>
+ <axsl:variable name="toplevel-components" select="dbk:para[@rnd:style = &quot;article&quot; or @rnd:style = &quot;article-title&quot; or @rnd:style = &quot;appendix&quot; or @rnd:style = &quot;appendix-title&quot; or @rnd:style = &quot;chapter&quot; or @rnd:style = &quot;chapter-title&quot; or @rnd:style = &quot;preface&quot; or @rnd:style = &quot;preface-title&quot;]"/>
+ <axsl:choose>
+ <axsl:when test="$books">
+ <axsl:apply-templates select="$books[1]/preceding-sibling::*"/>
+ <axsl:apply-templates select="$books[1]" mode="book">
+ <axsl:with-param name="books" select="$books[position() != 1]"/>
+ </axsl:apply-templates>
+ </axsl:when>
+ <axsl:when test="$toplevel-components">
+ <axsl:apply-templates select="$toplevel-components[1]/preceding-sibling::*"/>
+ <axsl:apply-templates select="$toplevel-components[1]" mode="toplevel-component">
+ <axsl:with-param name="toplevel-components" select="$toplevel-components[position() != 1]"/>
+ </axsl:apply-templates>
+ </axsl:when>
+ <axsl:otherwise>
+ <axsl:apply-templates/>
+ </axsl:otherwise>
+ </axsl:choose>
+ </axsl:copy>
+ </axsl:template>
+ <axsl:template match="dbk:para" mode="book">
+ <axsl:param name="books" select="/.."/>
+ <axsl:choose>
+ <axsl:when test="$books and (@rnd:style = &quot;book&quot; or @rnd:style = &quot;book-title&quot;)">
+ <axsl:call-template name="make-book">
+ <axsl:with-param name="books" select="$books"/>
+ <axsl:with-param name="book-components" select="$books[1]/preceding-sibling::dbk:para[@rnd:style = &quot;part&quot; or @rnd:style = &quot;part-title&quot; or @rnd:style = &quot;article&quot; or @rnd:style = &quot;article-title&quot; or @rnd:style = &quot;appendix&quot; or @rnd:style = &quot;appendix-title&quot; or @rnd:style = &quot;chapter&quot; or @rnd:style = &quot;chapter-title&quot; or @rnd:style = &quot;preface&quot; or @rnd:style = &quot;preface-title&quot;]"/>
+ </axsl:call-template>
+ </axsl:when>
+ <axsl:otherwise>
+ <axsl:call-template name="make-book">
+ <axsl:with-param name="books" select="$books"/>
+ <axsl:with-param name="book-components" select="following-sibling::dbk:para[@rnd:style = &quot;part&quot; or @rnd:style = &quot;part-title&quot; or @rnd:style = &quot;article&quot; or @rnd:style = &quot;article-title&quot; or @rnd:style = &quot;appendix&quot; or @rnd:style = &quot;appendix-title&quot; or @rnd:style = &quot;chapter&quot; or @rnd:style = &quot;chapter-title&quot; or @rnd:style = &quot;preface&quot; or @rnd:style = &quot;preface-title&quot;]"/>
+ </axsl:call-template>
+ </axsl:otherwise>
+ </axsl:choose>
+ </axsl:template>
+ <axsl:template name="make-book">
+ <axsl:param name="books" select="/.."/>
+ <axsl:param name="book-components" select="/.."/>
+<!-- mode toplevel-templates -->
+ <book xmlns="http://docbook.org/ns/docbook">
+ <axsl:call-template name="copy"/>
+ <axsl:apply-templates select="following-sibling::*[1]" mode="book-component">
+ <axsl:with-param name="nextbook" select="$books[1]"/>
+ <axsl:with-param name="book-components" select="$book-components"/>
+ </axsl:apply-templates>
+ </book>
+ <axsl:apply-templates select="$books[1]" mode="book">
+ <axsl:with-param name="books" select="$books[position() != 1]"/>
+ </axsl:apply-templates>
+ </axsl:template>
+ <axsl:template match="dbk:para" mode="toplevel-component">
+ <axsl:param name="toplevel-components" select="/.."/>
+ <axsl:choose>
+ <axsl:when test="$toplevel-components and (@rnd:style = &quot;article&quot; or @rnd:style = &quot;article-title&quot; or @rnd:style = &quot;appendix&quot; or @rnd:style = &quot;appendix-title&quot; or @rnd:style = &quot;chapter&quot; or @rnd:style = &quot;chapter-title&quot; or @rnd:style = &quot;preface&quot; or @rnd:style = &quot;preface-title&quot;)">
+ <axsl:call-template name="make-toplevel-component">
+ <axsl:with-param name="toplevel-components" select="$toplevel-components"/>
+ <axsl:with-param name="sect1s" select="$toplevel-components[1]/preceding-sibling::dbk:para[@rnd:style = &quot;sect1&quot; or @rnd:style = &quot;sect1-title&quot;]"/>
+ </axsl:call-template>
+ </axsl:when>
+ <axsl:otherwise>
+ <axsl:call-template name="make-toplevel-component">
+ <axsl:with-param name="toplevel-components" select="$toplevel-components"/>
+ <axsl:with-param name="sect1s" select="following-sibling::dbk:para[@rnd:style = &quot;sect1&quot; or @rnd:style = &quot;sect1-title&quot;]"/>
+ </axsl:call-template>
+ </axsl:otherwise>
+ </axsl:choose>
+ </axsl:template>
+ <axsl:template name="make-toplevel-component">
+ <axsl:param name="toplevel-components" select="/.."/>
+ <axsl:param name="sect1s" select="/.."/>
+<!-- mode toplevel-templates: group:level - do not create element -->
+ <axsl:call-template name="copy"/>
+ <axsl:apply-templates select="following-sibling::*[1]" mode="toplevel-sect1">
+ <axsl:with-param name="nexttoplevel-component" select="$toplevel-components[1]"/>
+ <axsl:with-param name="sect1s" select="$sect1s"/>
+ </axsl:apply-templates>
+ <axsl:apply-templates select="$toplevel-components[1]" mode="toplevel-component">
+ <axsl:with-param name="toplevel-components" select="$toplevel-components[position() != 1]"/>
+ </axsl:apply-templates>
+ </axsl:template>
+ <axsl:template match="dbk:para" mode="book-component">
+ <axsl:param name="nextbook" select="/.."/>
+ <axsl:param select="/.." name="book-components"/>
+ <axsl:choose>
+ <axsl:when test="generate-id() = generate-id($nextbook)"/>
+ <axsl:when test="@rnd:style = &quot;part&quot; or @rnd:style = &quot;part-title&quot; or @rnd:style = &quot;article&quot; or @rnd:style = &quot;article-title&quot; or @rnd:style = &quot;appendix&quot; or @rnd:style = &quot;appendix-title&quot; or @rnd:style = &quot;chapter&quot; or @rnd:style = &quot;chapter-title&quot; or @rnd:style = &quot;preface&quot; or @rnd:style = &quot;preface-title&quot;">
+ <axsl:variable name="nextbook-component" select="following-sibling::dbk:para[@rnd:style = &quot;part&quot; or @rnd:style = &quot;part-title&quot; or @rnd:style = &quot;article&quot; or @rnd:style = &quot;article-title&quot; or @rnd:style = &quot;appendix&quot; or @rnd:style = &quot;appendix-title&quot; or @rnd:style = &quot;chapter&quot; or @rnd:style = &quot;chapter-title&quot; or @rnd:style = &quot;preface&quot; or @rnd:style = &quot;preface-title&quot;][1]"/>
+ <axsl:choose>
+ <axsl:when test="$nextbook-component">
+ <axsl:variable name="sect1s" select="$nextbook-component/preceding-sibling::dbk:para[@rnd:style = &quot;sect1&quot; or @rnd:style = &quot;sect1-title&quot;]"/>
+<!-- mode sections 1 -->
+ <book-component xmlns="http://docbook.org/ns/docbook">
+ <axsl:call-template name="copy"/>
+ <axsl:apply-templates select="following-sibling::*[1]" mode="book-sect1">
+ <axsl:with-param name="nextbook-component" select="$nextbook-component"/>
+ <axsl:with-param name="nextbook" select="$nextbook"/>
+ <axsl:with-param name="sect1s" select="$sect1s"/>
+ <axsl:with-param name="book-components" select="$book-components"/>
+ </axsl:apply-templates>
+ </book-component>
+ <axsl:if test="count($book-components|$nextbook-component) = count($book-components)">
+ <axsl:apply-templates select="$nextbook-component" mode="book-component">
+ <axsl:with-param name="nextbook" select="$nextbook"/>
+ <axsl:with-param name="book-components" select="$book-components"/>
+ </axsl:apply-templates>
+ </axsl:if>
+ </axsl:when>
+ <axsl:otherwise>
+ <axsl:variable name="sect1s" select="following-sibling::dbk:para[@rnd:style = &quot;sect1&quot; or @rnd:style = &quot;sect1-title&quot;]"/>
+<!-- mode sections 2 -->
+ <book-component xmlns="http://docbook.org/ns/docbook">
+ <axsl:call-template name="copy"/>
+ <axsl:apply-templates select="following-sibling::*[1]" mode="book-sect1">
+ <axsl:with-param name="nextbook-component" select="$nextbook-component"/>
+ <axsl:with-param name="nextbook" select="$nextbook"/>
+ <axsl:with-param name="sect1s" select="$sect1s"/>
+ <axsl:with-param name="book-components" select="$book-components"/>
+ </axsl:apply-templates>
+ </book-component>
+ <axsl:if test="count($book-components|$nextbook-component) = count($book-components)">
+ <axsl:apply-templates select="$nextbook-component" mode="book-component">
+ <axsl:with-param name="nextbook" select="$nextbook"/>
+ <axsl:with-param name="book-components" select="$book-components"/>
+ </axsl:apply-templates>
+ </axsl:if>
+ </axsl:otherwise>
+ </axsl:choose>
+ </axsl:when>
+ <axsl:otherwise>
+ <axsl:call-template name="copy"/>
+ <axsl:apply-templates select="following-sibling::*[1]" mode="book-component">
+ <axsl:with-param name="nextbook" select="$nextbook"/>
+ <axsl:with-param name="book-components" select="$book-components"/>
+ </axsl:apply-templates>
+ </axsl:otherwise>
+ </axsl:choose>
+ </axsl:template>
+ <axsl:template match="dbk:para" mode="book-sect1">
+ <axsl:param name="nextbook-component" select="/.."/>
+ <axsl:param name="nextbook" select="/.."/>
+ <axsl:param select="/.." name="sect1s"/>
+ <axsl:param select="/.." name="book-components"/>
+ <axsl:choose>
+ <axsl:when test="generate-id() = generate-id($nextbook-component)"/>
+ <axsl:when test="generate-id() = generate-id($nextbook)"/>
+ <axsl:when test="@rnd:style = &quot;sect1&quot; or @rnd:style = &quot;sect1-title&quot;">
+ <axsl:variable name="nextsect1" select="following-sibling::dbk:para[@rnd:style = &quot;sect1&quot; or @rnd:style = &quot;sect1-title&quot;][1]"/>
+ <axsl:choose>
+ <axsl:when test="$nextsect1">
+ <axsl:variable name="sect2s" select="$nextsect1/preceding-sibling::dbk:para[@rnd:style = &quot;sect2&quot; or @rnd:style = &quot;sect2-title&quot;]"/>
+<!-- mode sections 1 -->
+ <sect1 xmlns="http://docbook.org/ns/docbook">
+ <axsl:call-template name="copy"/>
+ <axsl:apply-templates select="following-sibling::*[1]" mode="book-sect2">
+ <axsl:with-param name="nextsect1" select="$nextsect1"/>
+ <axsl:with-param name="nextbook-component" select="$nextbook-component"/>
+ <axsl:with-param name="nextbook" select="$nextbook"/>
+ <axsl:with-param name="sect2s" select="$sect2s"/>
+ <axsl:with-param name="sect1s" select="$sect1s"/>
+ <axsl:with-param name="book-components" select="$book-components"/>
+ </axsl:apply-templates>
+ </sect1>
+ <axsl:if test="$nextsect1 and (not($book-components) or count($sect1s|$nextsect1) = count($sect1s))">
+ <axsl:apply-templates select="$nextsect1" mode="book-sect1">
+ <axsl:with-param name="nextbook-component" select="$nextbook-component"/>
+ <axsl:with-param name="nextbook" select="$nextbook"/>
+ <axsl:with-param name="sect1s" select="$sect1s"/>
+ <axsl:with-param name="book-components" select="$book-components"/>
+ </axsl:apply-templates>
+ </axsl:if>
+ </axsl:when>
+ <axsl:otherwise>
+ <axsl:variable name="sect2s" select="following-sibling::dbk:para[@rnd:style = &quot;sect2&quot; or @rnd:style = &quot;sect2-title&quot;]"/>
+<!-- mode sections 2 -->
+ <sect1 xmlns="http://docbook.org/ns/docbook">
+ <axsl:call-template name="copy"/>
+ <axsl:apply-templates select="following-sibling::*[1]" mode="book-sect2">
+ <axsl:with-param name="nextsect1" select="$nextsect1"/>
+ <axsl:with-param name="nextbook-component" select="$nextbook-component"/>
+ <axsl:with-param name="nextbook" select="$nextbook"/>
+ <axsl:with-param name="sect2s" select="$sect2s"/>
+ <axsl:with-param name="sect1s" select="$sect1s"/>
+ <axsl:with-param name="book-components" select="$book-components"/>
+ </axsl:apply-templates>
+ </sect1>
+ <axsl:if test="$nextsect1 and (not($book-components) or count($sect1s|$nextsect1) = count($sect1s))">
+ <axsl:apply-templates select="$nextsect1" mode="book-sect1">
+ <axsl:with-param name="nextbook-component" select="$nextbook-component"/>
+ <axsl:with-param name="nextbook" select="$nextbook"/>
+ <axsl:with-param name="sect1s" select="$sect1s"/>
+ <axsl:with-param name="book-components" select="$book-components"/>
+ </axsl:apply-templates>
+ </axsl:if>
+ </axsl:otherwise>
+ </axsl:choose>
+ </axsl:when>
+ <axsl:otherwise>
+ <axsl:call-template name="copy"/>
+ <axsl:apply-templates select="following-sibling::*[1]" mode="book-sect1">
+ <axsl:with-param name="nextbook-component" select="$nextbook-component"/>
+ <axsl:with-param name="nextbook" select="$nextbook"/>
+ <axsl:with-param name="sect1s" select="$sect1s"/>
+ <axsl:with-param name="book-components" select="$book-components"/>
+ </axsl:apply-templates>
+ </axsl:otherwise>
+ </axsl:choose>
+ </axsl:template>
+ <axsl:template match="dbk:para" mode="book-sect2">
+ <axsl:param name="nextsect1" select="/.."/>
+ <axsl:param name="nextbook-component" select="/.."/>
+ <axsl:param name="nextbook" select="/.."/>
+ <axsl:param select="/.." name="sect2s"/>
+ <axsl:param select="/.." name="sect1s"/>
+ <axsl:param select="/.." name="book-components"/>
+ <axsl:choose>
+ <axsl:when test="generate-id() = generate-id($nextsect1)"/>
+ <axsl:when test="generate-id() = generate-id($nextbook-component)"/>
+ <axsl:when test="generate-id() = generate-id($nextbook)"/>
+ <axsl:when test="@rnd:style = &quot;sect2&quot; or @rnd:style = &quot;sect2-title&quot;">
+ <axsl:variable name="nextsect2" select="following-sibling::dbk:para[@rnd:style = &quot;sect2&quot; or @rnd:style = &quot;sect2-title&quot;][1]"/>
+ <axsl:choose>
+ <axsl:when test="$nextsect2">
+ <axsl:variable name="sect3s" select="$nextsect2/preceding-sibling::dbk:para[@rnd:style = &quot;sect3&quot; or @rnd:style = &quot;sect3-title&quot;]"/>
+<!-- mode sections 1 -->
+ <sect2 xmlns="http://docbook.org/ns/docbook">
+ <axsl:call-template name="copy"/>
+ <axsl:apply-templates select="following-sibling::*[1]" mode="book-sect3">
+ <axsl:with-param name="nextsect2" select="$nextsect2"/>
+ <axsl:with-param name="nextsect1" select="$nextsect1"/>
+ <axsl:with-param name="nextbook-component" select="$nextbook-component"/>
+ <axsl:with-param name="nextbook" select="$nextbook"/>
+ <axsl:with-param name="sect3s" select="$sect3s"/>
+ <axsl:with-param name="sect2s" select="$sect2s"/>
+ <axsl:with-param name="sect1s" select="$sect1s"/>
+ <axsl:with-param name="book-components" select="$book-components"/>
+ </axsl:apply-templates>
+ </sect2>
+ <axsl:if test="$nextsect2 and (not($sect1s) or count($sect2s|$nextsect2) = count($sect2s))">
+ <axsl:apply-templates select="$nextsect2" mode="book-sect2">
+ <axsl:with-param name="nextsect1" select="$nextsect1"/>
+ <axsl:with-param name="nextbook-component" select="$nextbook-component"/>
+ <axsl:with-param name="nextbook" select="$nextbook"/>
+ <axsl:with-param name="sect2s" select="$sect2s"/>
+ <axsl:with-param name="sect1s" select="$sect1s"/>
+ <axsl:with-param name="book-components" select="$book-components"/>
+ </axsl:apply-templates>
+ </axsl:if>
+ </axsl:when>
+ <axsl:otherwise>
+ <axsl:variable name="sect3s" select="following-sibling::dbk:para[@rnd:style = &quot;sect3&quot; or @rnd:style = &quot;sect3-title&quot;]"/>
+<!-- mode sections 2 -->
+ <sect2 xmlns="http://docbook.org/ns/docbook">
+ <axsl:call-template name="copy"/>
+ <axsl:apply-templates select="following-sibling::*[1]" mode="book-sect3">
+ <axsl:with-param name="nextsect2" select="$nextsect2"/>
+ <axsl:with-param name="nextsect1" select="$nextsect1"/>
+ <axsl:with-param name="nextbook-component" select="$nextbook-component"/>
+ <axsl:with-param name="nextbook" select="$nextbook"/>
+ <axsl:with-param name="sect3s" select="$sect3s"/>
+ <axsl:with-param name="sect2s" select="$sect2s"/>
+ <axsl:with-param name="sect1s" select="$sect1s"/>
+ <axsl:with-param name="book-components" select="$book-components"/>
+ </axsl:apply-templates>
+ </sect2>
+ <axsl:if test="$nextsect2 and (not($sect1s) or count($sect2s|$nextsect2) = count($sect2s))">
+ <axsl:apply-templates select="$nextsect2" mode="book-sect2">
+ <axsl:with-param name="nextsect1" select="$nextsect1"/>
+ <axsl:with-param name="nextbook-component" select="$nextbook-component"/>
+ <axsl:with-param name="nextbook" select="$nextbook"/>
+ <axsl:with-param name="sect2s" select="$sect2s"/>
+ <axsl:with-param name="sect1s" select="$sect1s"/>
+ <axsl:with-param name="book-components" select="$book-components"/>
+ </axsl:apply-templates>
+ </axsl:if>
+ </axsl:otherwise>
+ </axsl:choose>
+ </axsl:when>
+ <axsl:otherwise>
+ <axsl:call-template name="copy"/>
+ <axsl:apply-templates select="following-sibling::*[1]" mode="book-sect2">
+ <axsl:with-param name="nextsect1" select="$nextsect1"/>
+ <axsl:with-param name="nextbook-component" select="$nextbook-component"/>
+ <axsl:with-param name="nextbook" select="$nextbook"/>
+ <axsl:with-param name="sect2s" select="$sect2s"/>
+ <axsl:with-param name="sect1s" select="$sect1s"/>
+ <axsl:with-param name="book-components" select="$book-components"/>
+ </axsl:apply-templates>
+ </axsl:otherwise>
+ </axsl:choose>
+ </axsl:template>
+ <axsl:template match="dbk:para" mode="book-sect3">
+ <axsl:param name="nextsect2" select="/.."/>
+ <axsl:param name="nextsect1" select="/.."/>
+ <axsl:param name="nextbook-component" select="/.."/>
+ <axsl:param name="nextbook" select="/.."/>
+ <axsl:param select="/.." name="sect3s"/>
+ <axsl:param select="/.." name="sect2s"/>
+ <axsl:param select="/.." name="sect1s"/>
+ <axsl:param select="/.." name="book-components"/>
+ <axsl:choose>
+ <axsl:when test="generate-id() = generate-id($nextsect2)"/>
+ <axsl:when test="generate-id() = generate-id($nextsect1)"/>
+ <axsl:when test="generate-id() = generate-id($nextbook-component)"/>
+ <axsl:when test="generate-id() = generate-id($nextbook)"/>
+ <axsl:when test="@rnd:style = &quot;sect3&quot; or @rnd:style = &quot;sect3-title&quot;">
+ <axsl:variable name="nextsect3" select="following-sibling::dbk:para[@rnd:style = &quot;sect3&quot; or @rnd:style = &quot;sect3-title&quot;][1]"/>
+ <axsl:choose>
+ <axsl:when test="$nextsect3">
+ <axsl:variable name="sect4s" select="$nextsect3/preceding-sibling::dbk:para[@rnd:style = &quot;sect4&quot; or @rnd:style = &quot;sect4-title&quot;]"/>
+<!-- mode sections 1 -->
+ <sect3 xmlns="http://docbook.org/ns/docbook">
+ <axsl:call-template name="copy"/>
+ <axsl:apply-templates select="following-sibling::*[1]" mode="book-sect4">
+ <axsl:with-param name="nextsect3" select="$nextsect3"/>
+ <axsl:with-param name="nextsect2" select="$nextsect2"/>
+ <axsl:with-param name="nextsect1" select="$nextsect1"/>
+ <axsl:with-param name="nextbook-component" select="$nextbook-component"/>
+ <axsl:with-param name="nextbook" select="$nextbook"/>
+ <axsl:with-param name="sect4s" select="$sect4s"/>
+ <axsl:with-param name="sect3s" select="$sect3s"/>
+ <axsl:with-param name="sect2s" select="$sect2s"/>
+ <axsl:with-param name="sect1s" select="$sect1s"/>
+ <axsl:with-param name="book-components" select="$book-components"/>
+ </axsl:apply-templates>
+ </sect3>
+ <axsl:if test="$nextsect3 and (not($sect2s) or count($sect3s|$nextsect3) = count($sect3s))">
+ <axsl:apply-templates select="$nextsect3" mode="book-sect3">
+ <axsl:with-param name="nextsect2" select="$nextsect2"/>
+ <axsl:with-param name="nextsect1" select="$nextsect1"/>
+ <axsl:with-param name="nextbook-component" select="$nextbook-component"/>
+ <axsl:with-param name="nextbook" select="$nextbook"/>
+ <axsl:with-param name="sect3s" select="$sect3s"/>
+ <axsl:with-param name="sect2s" select="$sect2s"/>
+ <axsl:with-param name="sect1s" select="$sect1s"/>
+ <axsl:with-param name="book-components" select="$book-components"/>
+ </axsl:apply-templates>
+ </axsl:if>
+ </axsl:when>
+ <axsl:otherwise>
+ <axsl:variable name="sect4s" select="following-sibling::dbk:para[@rnd:style = &quot;sect4&quot; or @rnd:style = &quot;sect4-title&quot;]"/>
+<!-- mode sections 2 -->
+ <sect3 xmlns="http://docbook.org/ns/docbook">
+ <axsl:call-template name="copy"/>
+ <axsl:apply-templates select="following-sibling::*[1]" mode="book-sect4">
+ <axsl:with-param name="nextsect3" select="$nextsect3"/>
+ <axsl:with-param name="nextsect2" select="$nextsect2"/>
+ <axsl:with-param name="nextsect1" select="$nextsect1"/>
+ <axsl:with-param name="nextbook-component" select="$nextbook-component"/>
+ <axsl:with-param name="nextbook" select="$nextbook"/>
+ <axsl:with-param name="sect4s" select="$sect4s"/>
+ <axsl:with-param name="sect3s" select="$sect3s"/>
+ <axsl:with-param name="sect2s" select="$sect2s"/>
+ <axsl:with-param name="sect1s" select="$sect1s"/>
+ <axsl:with-param name="book-components" select="$book-components"/>
+ </axsl:apply-templates>
+ </sect3>
+ <axsl:if test="$nextsect3 and (not($sect2s) or count($sect3s|$nextsect3) = count($sect3s))">
+ <axsl:apply-templates select="$nextsect3" mode="book-sect3">
+ <axsl:with-param name="nextsect2" select="$nextsect2"/>
+ <axsl:with-param name="nextsect1" select="$nextsect1"/>
+ <axsl:with-param name="nextbook-component" select="$nextbook-component"/>
+ <axsl:with-param name="nextbook" select="$nextbook"/>
+ <axsl:with-param name="sect3s" select="$sect3s"/>
+ <axsl:with-param name="sect2s" select="$sect2s"/>
+ <axsl:with-param name="sect1s" select="$sect1s"/>
+ <axsl:with-param name="book-components" select="$book-components"/>
+ </axsl:apply-templates>
+ </axsl:if>
+ </axsl:otherwise>
+ </axsl:choose>
+ </axsl:when>
+ <axsl:otherwise>
+ <axsl:call-template name="copy"/>
+ <axsl:apply-templates select="following-sibling::*[1]" mode="book-sect3">
+ <axsl:with-param name="nextsect2" select="$nextsect2"/>
+ <axsl:with-param name="nextsect1" select="$nextsect1"/>
+ <axsl:with-param name="nextbook-component" select="$nextbook-component"/>
+ <axsl:with-param name="nextbook" select="$nextbook"/>
+ <axsl:with-param name="sect3s" select="$sect3s"/>
+ <axsl:with-param name="sect2s" select="$sect2s"/>
+ <axsl:with-param name="sect1s" select="$sect1s"/>
+ <axsl:with-param name="book-components" select="$book-components"/>
+ </axsl:apply-templates>
+ </axsl:otherwise>
+ </axsl:choose>
+ </axsl:template>
+ <axsl:template match="dbk:para" mode="book-sect4">
+ <axsl:param name="nextsect3" select="/.."/>
+ <axsl:param name="nextsect2" select="/.."/>
+ <axsl:param name="nextsect1" select="/.."/>
+ <axsl:param name="nextbook-component" select="/.."/>
+ <axsl:param name="nextbook" select="/.."/>
+ <axsl:param select="/.." name="sect4s"/>
+ <axsl:param select="/.." name="sect3s"/>
+ <axsl:param select="/.." name="sect2s"/>
+ <axsl:param select="/.." name="sect1s"/>
+ <axsl:param select="/.." name="book-components"/>
+ <axsl:choose>
+ <axsl:when test="generate-id() = generate-id($nextsect3)"/>
+ <axsl:when test="generate-id() = generate-id($nextsect2)"/>
+ <axsl:when test="generate-id() = generate-id($nextsect1)"/>
+ <axsl:when test="generate-id() = generate-id($nextbook-component)"/>
+ <axsl:when test="generate-id() = generate-id($nextbook)"/>
+ <axsl:when test="@rnd:style = &quot;sect4&quot; or @rnd:style = &quot;sect4-title&quot;">
+ <axsl:variable name="nextsect4" select="following-sibling::dbk:para[@rnd:style = &quot;sect4&quot; or @rnd:style = &quot;sect4-title&quot;][1]"/>
+ <axsl:choose>
+ <axsl:when test="$nextsect4">
+ <axsl:variable name="sect5s" select="$nextsect4/preceding-sibling::dbk:para[@rnd:style = &quot;sect5&quot; or @rnd:style = &quot;sect5-title&quot;]"/>
+<!-- mode sections 1 -->
+ <sect4 xmlns="http://docbook.org/ns/docbook">
+ <axsl:call-template name="copy"/>
+ <axsl:apply-templates select="following-sibling::*[1]" mode="book-sect5">
+ <axsl:with-param name="nextsect4" select="$nextsect4"/>
+ <axsl:with-param name="nextsect3" select="$nextsect3"/>
+ <axsl:with-param name="nextsect2" select="$nextsect2"/>
+ <axsl:with-param name="nextsect1" select="$nextsect1"/>
+ <axsl:with-param name="nextbook-component" select="$nextbook-component"/>
+ <axsl:with-param name="nextbook" select="$nextbook"/>
+ <axsl:with-param name="sect5s" select="$sect5s"/>
+ <axsl:with-param name="sect4s" select="$sect4s"/>
+ <axsl:with-param name="sect3s" select="$sect3s"/>
+ <axsl:with-param name="sect2s" select="$sect2s"/>
+ <axsl:with-param name="sect1s" select="$sect1s"/>
+ <axsl:with-param name="book-components" select="$book-components"/>
+ </axsl:apply-templates>
+ </sect4>
+ <axsl:if test="$nextsect4 and (not($sect3s) or count($sect4s|$nextsect4) = count($sect4s))">
+ <axsl:apply-templates select="$nextsect4" mode="book-sect4">
+ <axsl:with-param name="nextsect3" select="$nextsect3"/>
+ <axsl:with-param name="nextsect2" select="$nextsect2"/>
+ <axsl:with-param name="nextsect1" select="$nextsect1"/>
+ <axsl:with-param name="nextbook-component" select="$nextbook-component"/>
+ <axsl:with-param name="nextbook" select="$nextbook"/>
+ <axsl:with-param name="sect4s" select="$sect4s"/>
+ <axsl:with-param name="sect3s" select="$sect3s"/>
+ <axsl:with-param name="sect2s" select="$sect2s"/>
+ <axsl:with-param name="sect1s" select="$sect1s"/>
+ <axsl:with-param name="book-components" select="$book-components"/>
+ </axsl:apply-templates>
+ </axsl:if>
+ </axsl:when>
+ <axsl:otherwise>
+ <axsl:variable name="sect5s" select="following-sibling::dbk:para[@rnd:style = &quot;sect5&quot; or @rnd:style = &quot;sect5-title&quot;]"/>
+<!-- mode sections 2 -->
+ <sect4 xmlns="http://docbook.org/ns/docbook">
+ <axsl:call-template name="copy"/>
+ <axsl:apply-templates select="following-sibling::*[1]" mode="book-sect5">
+ <axsl:with-param name="nextsect4" select="$nextsect4"/>
+ <axsl:with-param name="nextsect3" select="$nextsect3"/>
+ <axsl:with-param name="nextsect2" select="$nextsect2"/>
+ <axsl:with-param name="nextsect1" select="$nextsect1"/>
+ <axsl:with-param name="nextbook-component" select="$nextbook-component"/>
+ <axsl:with-param name="nextbook" select="$nextbook"/>
+ <axsl:with-param name="sect5s" select="$sect5s"/>
+ <axsl:with-param name="sect4s" select="$sect4s"/>
+ <axsl:with-param name="sect3s" select="$sect3s"/>
+ <axsl:with-param name="sect2s" select="$sect2s"/>
+ <axsl:with-param name="sect1s" select="$sect1s"/>
+ <axsl:with-param name="book-components" select="$book-components"/>
+ </axsl:apply-templates>
+ </sect4>
+ <axsl:if test="$nextsect4 and (not($sect3s) or count($sect4s|$nextsect4) = count($sect4s))">
+ <axsl:apply-templates select="$nextsect4" mode="book-sect4">
+ <axsl:with-param name="nextsect3" select="$nextsect3"/>
+ <axsl:with-param name="nextsect2" select="$nextsect2"/>
+ <axsl:with-param name="nextsect1" select="$nextsect1"/>
+ <axsl:with-param name="nextbook-component" select="$nextbook-component"/>
+ <axsl:with-param name="nextbook" select="$nextbook"/>
+ <axsl:with-param name="sect4s" select="$sect4s"/>
+ <axsl:with-param name="sect3s" select="$sect3s"/>
+ <axsl:with-param name="sect2s" select="$sect2s"/>
+ <axsl:with-param name="sect1s" select="$sect1s"/>
+ <axsl:with-param name="book-components" select="$book-components"/>
+ </axsl:apply-templates>
+ </axsl:if>
+ </axsl:otherwise>
+ </axsl:choose>
+ </axsl:when>
+ <axsl:otherwise>
+ <axsl:call-template name="copy"/>
+ <axsl:apply-templates select="following-sibling::*[1]" mode="book-sect4">
+ <axsl:with-param name="nextsect3" select="$nextsect3"/>
+ <axsl:with-param name="nextsect2" select="$nextsect2"/>
+ <axsl:with-param name="nextsect1" select="$nextsect1"/>
+ <axsl:with-param name="nextbook-component" select="$nextbook-component"/>
+ <axsl:with-param name="nextbook" select="$nextbook"/>
+ <axsl:with-param name="sect4s" select="$sect4s"/>
+ <axsl:with-param name="sect3s" select="$sect3s"/>
+ <axsl:with-param name="sect2s" select="$sect2s"/>
+ <axsl:with-param name="sect1s" select="$sect1s"/>
+ <axsl:with-param name="book-components" select="$book-components"/>
+ </axsl:apply-templates>
+ </axsl:otherwise>
+ </axsl:choose>
+ </axsl:template>
+ <axsl:template match="dbk:para" mode="book-sect5">
+ <axsl:param name="nextsect4" select="/.."/>
+ <axsl:param name="nextsect3" select="/.."/>
+ <axsl:param name="nextsect2" select="/.."/>
+ <axsl:param name="nextsect1" select="/.."/>
+ <axsl:param name="nextbook-component" select="/.."/>
+ <axsl:param name="nextbook" select="/.."/>
+ <axsl:param select="/.." name="sect5s"/>
+ <axsl:param select="/.." name="sect4s"/>
+ <axsl:param select="/.." name="sect3s"/>
+ <axsl:param select="/.." name="sect2s"/>
+ <axsl:param select="/.." name="sect1s"/>
+ <axsl:param select="/.." name="book-components"/>
+ <axsl:choose>
+ <axsl:when test="generate-id() = generate-id($nextsect4)"/>
+ <axsl:when test="generate-id() = generate-id($nextsect3)"/>
+ <axsl:when test="generate-id() = generate-id($nextsect2)"/>
+ <axsl:when test="generate-id() = generate-id($nextsect1)"/>
+ <axsl:when test="generate-id() = generate-id($nextbook-component)"/>
+ <axsl:when test="generate-id() = generate-id($nextbook)"/>
+ <axsl:when test="@rnd:style = &quot;sect5&quot; or @rnd:style = &quot;sect5-title&quot;">
+ <axsl:variable name="nextsect5" select="following-sibling::dbk:para[@rnd:style = &quot;sect5&quot; or @rnd:style = &quot;sect5-title&quot;][1]"/>
+<!-- mode sections 3 -->
+ <sect5 xmlns="http://docbook.org/ns/docbook">
+ <axsl:call-template name="copy"/>
+ <axsl:apply-templates select="following-sibling::*[1]" mode="book-terminal">
+ <axsl:with-param name="nextsect5" select="$nextsect5"/>
+ <axsl:with-param name="nextsect4" select="$nextsect4"/>
+ <axsl:with-param name="nextsect3" select="$nextsect3"/>
+ <axsl:with-param name="nextsect2" select="$nextsect2"/>
+ <axsl:with-param name="nextsect1" select="$nextsect1"/>
+ <axsl:with-param name="nextbook-component" select="$nextbook-component"/>
+ <axsl:with-param name="nextbook" select="$nextbook"/>
+ <axsl:with-param name="sect5s" select="$sect5s"/>
+ <axsl:with-param name="sect4s" select="$sect4s"/>
+ <axsl:with-param name="sect3s" select="$sect3s"/>
+ <axsl:with-param name="sect2s" select="$sect2s"/>
+ <axsl:with-param name="sect1s" select="$sect1s"/>
+ <axsl:with-param name="book-components" select="$book-components"/>
+ </axsl:apply-templates>
+ </sect5>
+ <axsl:if test="$nextsect5 and (not($sect4s) or count($sect5s|$nextsect5) = count($sect5s))">
+ <axsl:apply-templates select="$nextsect5" mode="book-sect5">
+ <axsl:with-param name="nextsect4" select="$nextsect4"/>
+ <axsl:with-param name="nextsect3" select="$nextsect3"/>
+ <axsl:with-param name="nextsect2" select="$nextsect2"/>
+ <axsl:with-param name="nextsect1" select="$nextsect1"/>
+ <axsl:with-param name="nextbook-component" select="$nextbook-component"/>
+ <axsl:with-param name="nextbook" select="$nextbook"/>
+ <axsl:with-param name="sect5s" select="$sect5s"/>
+ <axsl:with-param name="sect4s" select="$sect4s"/>
+ <axsl:with-param name="sect3s" select="$sect3s"/>
+ <axsl:with-param name="sect2s" select="$sect2s"/>
+ <axsl:with-param name="sect1s" select="$sect1s"/>
+ <axsl:with-param name="book-components" select="$book-components"/>
+ </axsl:apply-templates>
+ </axsl:if>
+ </axsl:when>
+ <axsl:otherwise>
+ <axsl:call-template name="copy"/>
+ <axsl:apply-templates select="following-sibling::*[1]" mode="book-sect5">
+ <axsl:with-param name="nextsect4" select="$nextsect4"/>
+ <axsl:with-param name="nextsect3" select="$nextsect3"/>
+ <axsl:with-param name="nextsect2" select="$nextsect2"/>
+ <axsl:with-param name="nextsect1" select="$nextsect1"/>
+ <axsl:with-param name="nextbook-component" select="$nextbook-component"/>
+ <axsl:with-param name="nextbook" select="$nextbook"/>
+ <axsl:with-param name="sect5s" select="$sect5s"/>
+ <axsl:with-param name="sect4s" select="$sect4s"/>
+ <axsl:with-param name="sect3s" select="$sect3s"/>
+ <axsl:with-param name="sect2s" select="$sect2s"/>
+ <axsl:with-param name="sect1s" select="$sect1s"/>
+ <axsl:with-param name="book-components" select="$book-components"/>
+ </axsl:apply-templates>
+ </axsl:otherwise>
+ </axsl:choose>
+ </axsl:template>
+ <axsl:template match="dbk:para" mode="toplevel-sect1">
+ <axsl:param name="nexttoplevel-component" select="/.."/>
+ <axsl:param select="/.." name="sect1s"/>
+ <axsl:choose>
+ <axsl:when test="generate-id() = generate-id($nexttoplevel-component)"/>
+ <axsl:when test="@rnd:style = &quot;sect1&quot; or @rnd:style = &quot;sect1-title&quot;">
+ <axsl:variable name="nextsect1" select="following-sibling::dbk:para[@rnd:style = &quot;sect1&quot; or @rnd:style = &quot;sect1-title&quot;][1]"/>
+ <axsl:choose>
+ <axsl:when test="$nextsect1">
+ <axsl:variable name="sect2s" select="$nextsect1/preceding-sibling::dbk:para[@rnd:style = &quot;sect2&quot; or @rnd:style = &quot;sect2-title&quot;]"/>
+<!-- mode sections 1 -->
+ <sect1 xmlns="http://docbook.org/ns/docbook">
+ <axsl:call-template name="copy"/>
+ <axsl:apply-templates select="following-sibling::*[1]" mode="toplevel-sect2">
+ <axsl:with-param name="nextsect1" select="$nextsect1"/>
+ <axsl:with-param name="nexttoplevel-component" select="$nexttoplevel-component"/>
+ <axsl:with-param name="sect2s" select="$sect2s"/>
+ <axsl:with-param name="sect1s" select="$sect1s"/>
+ </axsl:apply-templates>
+ </sect1>
+ <axsl:if test="count($sect1s|$nextsect1) = count($sect1s)">
+ <axsl:apply-templates select="$nextsect1" mode="toplevel-sect1">
+ <axsl:with-param name="nexttoplevel-component" select="$nexttoplevel-component"/>
+ <axsl:with-param name="sect1s" select="$sect1s"/>
+ </axsl:apply-templates>
+ </axsl:if>
+ </axsl:when>
+ <axsl:otherwise>
+ <axsl:variable name="sect2s" select="following-sibling::dbk:para[@rnd:style = &quot;sect2&quot; or @rnd:style = &quot;sect2-title&quot;]"/>
+<!-- mode sections 2 -->
+ <sect1 xmlns="http://docbook.org/ns/docbook">
+ <axsl:call-template name="copy"/>
+ <axsl:apply-templates select="following-sibling::*[1]" mode="toplevel-sect2">
+ <axsl:with-param name="nextsect1" select="$nextsect1"/>
+ <axsl:with-param name="nexttoplevel-component" select="$nexttoplevel-component"/>
+ <axsl:with-param name="sect2s" select="$sect2s"/>
+ <axsl:with-param name="sect1s" select="$sect1s"/>
+ </axsl:apply-templates>
+ </sect1>
+ <axsl:if test="count($sect1s|$nextsect1) = count($sect1s)">
+ <axsl:apply-templates select="$nextsect1" mode="toplevel-sect1">
+ <axsl:with-param name="nexttoplevel-component" select="$nexttoplevel-component"/>
+ <axsl:with-param name="sect1s" select="$sect1s"/>
+ </axsl:apply-templates>
+ </axsl:if>
+ </axsl:otherwise>
+ </axsl:choose>
+ </axsl:when>
+ <axsl:otherwise>
+ <axsl:call-template name="copy"/>
+ <axsl:apply-templates select="following-sibling::*[1]" mode="toplevel-sect1">
+ <axsl:with-param name="nexttoplevel-component" select="$nexttoplevel-component"/>
+ <axsl:with-param name="sect1s" select="$sect1s"/>
+ </axsl:apply-templates>
+ </axsl:otherwise>
+ </axsl:choose>
+ </axsl:template>
+ <axsl:template match="dbk:para" mode="toplevel-sect2">
+ <axsl:param name="nextsect1" select="/.."/>
+ <axsl:param name="nexttoplevel-component" select="/.."/>
+ <axsl:param select="/.." name="sect2s"/>
+ <axsl:param select="/.." name="sect1s"/>
+ <axsl:choose>
+ <axsl:when test="generate-id() = generate-id($nextsect1)"/>
+ <axsl:when test="generate-id() = generate-id($nexttoplevel-component)"/>
+ <axsl:when test="@rnd:style = &quot;sect2&quot; or @rnd:style = &quot;sect2-title&quot;">
+ <axsl:variable name="nextsect2" select="following-sibling::dbk:para[@rnd:style = &quot;sect2&quot; or @rnd:style = &quot;sect2-title&quot;][1]"/>
+ <axsl:choose>
+ <axsl:when test="$nextsect2">
+ <axsl:variable name="sect3s" select="$nextsect2/preceding-sibling::dbk:para[@rnd:style = &quot;sect3&quot; or @rnd:style = &quot;sect3-title&quot;]"/>
+<!-- mode sections 1 -->
+ <sect2 xmlns="http://docbook.org/ns/docbook">
+ <axsl:call-template name="copy"/>
+ <axsl:apply-templates select="following-sibling::*[1]" mode="toplevel-sect3">
+ <axsl:with-param name="nextsect2" select="$nextsect2"/>
+ <axsl:with-param name="nextsect1" select="$nextsect1"/>
+ <axsl:with-param name="nexttoplevel-component" select="$nexttoplevel-component"/>
+ <axsl:with-param name="sect3s" select="$sect3s"/>
+ <axsl:with-param name="sect2s" select="$sect2s"/>
+ <axsl:with-param name="sect1s" select="$sect1s"/>
+ </axsl:apply-templates>
+ </sect2>
+ <axsl:if test="$nextsect2 and (not($sect1s) or count($sect2s|$nextsect2) = count($sect2s))">
+ <axsl:apply-templates select="$nextsect2" mode="toplevel-sect2">
+ <axsl:with-param name="nextsect1" select="$nextsect1"/>
+ <axsl:with-param name="nexttoplevel-component" select="$nexttoplevel-component"/>
+ <axsl:with-param name="sect2s" select="$sect2s"/>
+ <axsl:with-param name="sect1s" select="$sect1s"/>
+ </axsl:apply-templates>
+ </axsl:if>
+ </axsl:when>
+ <axsl:otherwise>
+ <axsl:variable name="sect3s" select="following-sibling::dbk:para[@rnd:style = &quot;sect3&quot; or @rnd:style = &quot;sect3-title&quot;]"/>
+<!-- mode sections 2 -->
+ <sect2 xmlns="http://docbook.org/ns/docbook">
+ <axsl:call-template name="copy"/>
+ <axsl:apply-templates select="following-sibling::*[1]" mode="toplevel-sect3">
+ <axsl:with-param name="nextsect2" select="$nextsect2"/>
+ <axsl:with-param name="nextsect1" select="$nextsect1"/>
+ <axsl:with-param name="nexttoplevel-component" select="$nexttoplevel-component"/>
+ <axsl:with-param name="sect3s" select="$sect3s"/>
+ <axsl:with-param name="sect2s" select="$sect2s"/>
+ <axsl:with-param name="sect1s" select="$sect1s"/>
+ </axsl:apply-templates>
+ </sect2>
+ <axsl:if test="$nextsect2 and (not($sect1s) or count($sect2s|$nextsect2) = count($sect2s))">
+ <axsl:apply-templates select="$nextsect2" mode="toplevel-sect2">
+ <axsl:with-param name="nextsect1" select="$nextsect1"/>
+ <axsl:with-param name="nexttoplevel-component" select="$nexttoplevel-component"/>
+ <axsl:with-param name="sect2s" select="$sect2s"/>
+ <axsl:with-param name="sect1s" select="$sect1s"/>
+ </axsl:apply-templates>
+ </axsl:if>
+ </axsl:otherwise>
+ </axsl:choose>
+ </axsl:when>
+ <axsl:otherwise>
+ <axsl:call-template name="copy"/>
+ <axsl:apply-templates select="following-sibling::*[1]" mode="toplevel-sect2">
+ <axsl:with-param name="nextsect1" select="$nextsect1"/>
+ <axsl:with-param name="nexttoplevel-component" select="$nexttoplevel-component"/>
+ <axsl:with-param name="sect2s" select="$sect2s"/>
+ <axsl:with-param name="sect1s" select="$sect1s"/>
+ </axsl:apply-templates>
+ </axsl:otherwise>
+ </axsl:choose>
+ </axsl:template>
+ <axsl:template match="dbk:para" mode="toplevel-sect3">
+ <axsl:param name="nextsect2" select="/.."/>
+ <axsl:param name="nextsect1" select="/.."/>
+ <axsl:param name="nexttoplevel-component" select="/.."/>
+ <axsl:param select="/.." name="sect3s"/>
+ <axsl:param select="/.." name="sect2s"/>
+ <axsl:param select="/.." name="sect1s"/>
+ <axsl:choose>
+ <axsl:when test="generate-id() = generate-id($nextsect2)"/>
+ <axsl:when test="generate-id() = generate-id($nextsect1)"/>
+ <axsl:when test="generate-id() = generate-id($nexttoplevel-component)"/>
+ <axsl:when test="@rnd:style = &quot;sect3&quot; or @rnd:style = &quot;sect3-title&quot;">
+ <axsl:variable name="nextsect3" select="following-sibling::dbk:para[@rnd:style = &quot;sect3&quot; or @rnd:style = &quot;sect3-title&quot;][1]"/>
+ <axsl:choose>
+ <axsl:when test="$nextsect3">
+ <axsl:variable name="sect4s" select="$nextsect3/preceding-sibling::dbk:para[@rnd:style = &quot;sect4&quot; or @rnd:style = &quot;sect4-title&quot;]"/>
+<!-- mode sections 1 -->
+ <sect3 xmlns="http://docbook.org/ns/docbook">
+ <axsl:call-template name="copy"/>
+ <axsl:apply-templates select="following-sibling::*[1]" mode="toplevel-sect4">
+ <axsl:with-param name="nextsect3" select="$nextsect3"/>
+ <axsl:with-param name="nextsect2" select="$nextsect2"/>
+ <axsl:with-param name="nextsect1" select="$nextsect1"/>
+ <axsl:with-param name="nexttoplevel-component" select="$nexttoplevel-component"/>
+ <axsl:with-param name="sect4s" select="$sect4s"/>
+ <axsl:with-param name="sect3s" select="$sect3s"/>
+ <axsl:with-param name="sect2s" select="$sect2s"/>
+ <axsl:with-param name="sect1s" select="$sect1s"/>
+ </axsl:apply-templates>
+ </sect3>
+ <axsl:if test="$nextsect3 and (not($sect2s) or count($sect3s|$nextsect3) = count($sect3s))">
+ <axsl:apply-templates select="$nextsect3" mode="toplevel-sect3">
+ <axsl:with-param name="nextsect2" select="$nextsect2"/>
+ <axsl:with-param name="nextsect1" select="$nextsect1"/>
+ <axsl:with-param name="nexttoplevel-component" select="$nexttoplevel-component"/>
+ <axsl:with-param name="sect3s" select="$sect3s"/>
+ <axsl:with-param name="sect2s" select="$sect2s"/>
+ <axsl:with-param name="sect1s" select="$sect1s"/>
+ </axsl:apply-templates>
+ </axsl:if>
+ </axsl:when>
+ <axsl:otherwise>
+ <axsl:variable name="sect4s" select="following-sibling::dbk:para[@rnd:style = &quot;sect4&quot; or @rnd:style = &quot;sect4-title&quot;]"/>
+<!-- mode sections 2 -->
+ <sect3 xmlns="http://docbook.org/ns/docbook">
+ <axsl:call-template name="copy"/>
+ <axsl:apply-templates select="following-sibling::*[1]" mode="toplevel-sect4">
+ <axsl:with-param name="nextsect3" select="$nextsect3"/>
+ <axsl:with-param name="nextsect2" select="$nextsect2"/>
+ <axsl:with-param name="nextsect1" select="$nextsect1"/>
+ <axsl:with-param name="nexttoplevel-component" select="$nexttoplevel-component"/>
+ <axsl:with-param name="sect4s" select="$sect4s"/>
+ <axsl:with-param name="sect3s" select="$sect3s"/>
+ <axsl:with-param name="sect2s" select="$sect2s"/>
+ <axsl:with-param name="sect1s" select="$sect1s"/>
+ </axsl:apply-templates>
+ </sect3>
+ <axsl:if test="$nextsect3 and (not($sect2s) or count($sect3s|$nextsect3) = count($sect3s))">
+ <axsl:apply-templates select="$nextsect3" mode="toplevel-sect3">
+ <axsl:with-param name="nextsect2" select="$nextsect2"/>
+ <axsl:with-param name="nextsect1" select="$nextsect1"/>
+ <axsl:with-param name="nexttoplevel-component" select="$nexttoplevel-component"/>
+ <axsl:with-param name="sect3s" select="$sect3s"/>
+ <axsl:with-param name="sect2s" select="$sect2s"/>
+ <axsl:with-param name="sect1s" select="$sect1s"/>
+ </axsl:apply-templates>
+ </axsl:if>
+ </axsl:otherwise>
+ </axsl:choose>
+ </axsl:when>
+ <axsl:otherwise>
+ <axsl:call-template name="copy"/>
+ <axsl:apply-templates select="following-sibling::*[1]" mode="toplevel-sect3">
+ <axsl:with-param name="nextsect2" select="$nextsect2"/>
+ <axsl:with-param name="nextsect1" select="$nextsect1"/>
+ <axsl:with-param name="nexttoplevel-component" select="$nexttoplevel-component"/>
+ <axsl:with-param name="sect3s" select="$sect3s"/>
+ <axsl:with-param name="sect2s" select="$sect2s"/>
+ <axsl:with-param name="sect1s" select="$sect1s"/>
+ </axsl:apply-templates>
+ </axsl:otherwise>
+ </axsl:choose>
+ </axsl:template>
+ <axsl:template match="dbk:para" mode="toplevel-sect4">
+ <axsl:param name="nextsect3" select="/.."/>
+ <axsl:param name="nextsect2" select="/.."/>
+ <axsl:param name="nextsect1" select="/.."/>
+ <axsl:param name="nexttoplevel-component" select="/.."/>
+ <axsl:param select="/.." name="sect4s"/>
+ <axsl:param select="/.." name="sect3s"/>
+ <axsl:param select="/.." name="sect2s"/>
+ <axsl:param select="/.." name="sect1s"/>
+ <axsl:choose>
+ <axsl:when test="generate-id() = generate-id($nextsect3)"/>
+ <axsl:when test="generate-id() = generate-id($nextsect2)"/>
+ <axsl:when test="generate-id() = generate-id($nextsect1)"/>
+ <axsl:when test="generate-id() = generate-id($nexttoplevel-component)"/>
+ <axsl:when test="@rnd:style = &quot;sect4&quot; or @rnd:style = &quot;sect4-title&quot;">
+ <axsl:variable name="nextsect4" select="following-sibling::dbk:para[@rnd:style = &quot;sect4&quot; or @rnd:style = &quot;sect4-title&quot;][1]"/>
+ <axsl:choose>
+ <axsl:when test="$nextsect4">
+ <axsl:variable name="sect5s" select="$nextsect4/preceding-sibling::dbk:para[@rnd:style = &quot;sect5&quot; or @rnd:style = &quot;sect5-title&quot;]"/>
+<!-- mode sections 1 -->
+ <sect4 xmlns="http://docbook.org/ns/docbook">
+ <axsl:call-template name="copy"/>
+ <axsl:apply-templates select="following-sibling::*[1]" mode="toplevel-sect5">
+ <axsl:with-param name="nextsect4" select="$nextsect4"/>
+ <axsl:with-param name="nextsect3" select="$nextsect3"/>
+ <axsl:with-param name="nextsect2" select="$nextsect2"/>
+ <axsl:with-param name="nextsect1" select="$nextsect1"/>
+ <axsl:with-param name="nexttoplevel-component" select="$nexttoplevel-component"/>
+ <axsl:with-param name="sect5s" select="$sect5s"/>
+ <axsl:with-param name="sect4s" select="$sect4s"/>
+ <axsl:with-param name="sect3s" select="$sect3s"/>
+ <axsl:with-param name="sect2s" select="$sect2s"/>
+ <axsl:with-param name="sect1s" select="$sect1s"/>
+ </axsl:apply-templates>
+ </sect4>
+ <axsl:if test="$nextsect4 and (not($sect3s) or count($sect4s|$nextsect4) = count($sect4s))">
+ <axsl:apply-templates select="$nextsect4" mode="toplevel-sect4">
+ <axsl:with-param name="nextsect3" select="$nextsect3"/>
+ <axsl:with-param name="nextsect2" select="$nextsect2"/>
+ <axsl:with-param name="nextsect1" select="$nextsect1"/>
+ <axsl:with-param name="nexttoplevel-component" select="$nexttoplevel-component"/>
+ <axsl:with-param name="sect4s" select="$sect4s"/>
+ <axsl:with-param name="sect3s" select="$sect3s"/>
+ <axsl:with-param name="sect2s" select="$sect2s"/>
+ <axsl:with-param name="sect1s" select="$sect1s"/>
+ </axsl:apply-templates>
+ </axsl:if>
+ </axsl:when>
+ <axsl:otherwise>
+ <axsl:variable name="sect5s" select="following-sibling::dbk:para[@rnd:style = &quot;sect5&quot; or @rnd:style = &quot;sect5-title&quot;]"/>
+<!-- mode sections 2 -->
+ <sect4 xmlns="http://docbook.org/ns/docbook">
+ <axsl:call-template name="copy"/>
+ <axsl:apply-templates select="following-sibling::*[1]" mode="toplevel-sect5">
+ <axsl:with-param name="nextsect4" select="$nextsect4"/>
+ <axsl:with-param name="nextsect3" select="$nextsect3"/>
+ <axsl:with-param name="nextsect2" select="$nextsect2"/>
+ <axsl:with-param name="nextsect1" select="$nextsect1"/>
+ <axsl:with-param name="nexttoplevel-component" select="$nexttoplevel-component"/>
+ <axsl:with-param name="sect5s" select="$sect5s"/>
+ <axsl:with-param name="sect4s" select="$sect4s"/>
+ <axsl:with-param name="sect3s" select="$sect3s"/>
+ <axsl:with-param name="sect2s" select="$sect2s"/>
+ <axsl:with-param name="sect1s" select="$sect1s"/>
+ </axsl:apply-templates>
+ </sect4>
+ <axsl:if test="$nextsect4 and (not($sect3s) or count($sect4s|$nextsect4) = count($sect4s))">
+ <axsl:apply-templates select="$nextsect4" mode="toplevel-sect4">
+ <axsl:with-param name="nextsect3" select="$nextsect3"/>
+ <axsl:with-param name="nextsect2" select="$nextsect2"/>
+ <axsl:with-param name="nextsect1" select="$nextsect1"/>
+ <axsl:with-param name="nexttoplevel-component" select="$nexttoplevel-component"/>
+ <axsl:with-param name="sect4s" select="$sect4s"/>
+ <axsl:with-param name="sect3s" select="$sect3s"/>
+ <axsl:with-param name="sect2s" select="$sect2s"/>
+ <axsl:with-param name="sect1s" select="$sect1s"/>
+ </axsl:apply-templates>
+ </axsl:if>
+ </axsl:otherwise>
+ </axsl:choose>
+ </axsl:when>
+ <axsl:otherwise>
+ <axsl:call-template name="copy"/>
+ <axsl:apply-templates select="following-sibling::*[1]" mode="toplevel-sect4">
+ <axsl:with-param name="nextsect3" select="$nextsect3"/>
+ <axsl:with-param name="nextsect2" select="$nextsect2"/>
+ <axsl:with-param name="nextsect1" select="$nextsect1"/>
+ <axsl:with-param name="nexttoplevel-component" select="$nexttoplevel-component"/>
+ <axsl:with-param name="sect4s" select="$sect4s"/>
+ <axsl:with-param name="sect3s" select="$sect3s"/>
+ <axsl:with-param name="sect2s" select="$sect2s"/>
+ <axsl:with-param name="sect1s" select="$sect1s"/>
+ </axsl:apply-templates>
+ </axsl:otherwise>
+ </axsl:choose>
+ </axsl:template>
+ <axsl:template match="dbk:para" mode="toplevel-sect5">
+ <axsl:param name="nextsect4" select="/.."/>
+ <axsl:param name="nextsect3" select="/.."/>
+ <axsl:param name="nextsect2" select="/.."/>
+ <axsl:param name="nextsect1" select="/.."/>
+ <axsl:param name="nexttoplevel-component" select="/.."/>
+ <axsl:param select="/.." name="sect5s"/>
+ <axsl:param select="/.." name="sect4s"/>
+ <axsl:param select="/.." name="sect3s"/>
+ <axsl:param select="/.." name="sect2s"/>
+ <axsl:param select="/.." name="sect1s"/>
+ <axsl:choose>
+ <axsl:when test="generate-id() = generate-id($nextsect4)"/>
+ <axsl:when test="generate-id() = generate-id($nextsect3)"/>
+ <axsl:when test="generate-id() = generate-id($nextsect2)"/>
+ <axsl:when test="generate-id() = generate-id($nextsect1)"/>
+ <axsl:when test="generate-id() = generate-id($nexttoplevel-component)"/>
+ <axsl:when test="@rnd:style = &quot;sect5&quot; or @rnd:style = &quot;sect5-title&quot;">
+ <axsl:variable name="nextsect5" select="following-sibling::dbk:para[@rnd:style = &quot;sect5&quot; or @rnd:style = &quot;sect5-title&quot;][1]"/>
+<!-- mode sections 3 -->
+ <sect5 xmlns="http://docbook.org/ns/docbook">
+ <axsl:call-template name="copy"/>
+ <axsl:apply-templates select="following-sibling::*[1]" mode="toplevel-terminal">
+ <axsl:with-param name="nextsect5" select="$nextsect5"/>
+ <axsl:with-param name="nextsect4" select="$nextsect4"/>
+ <axsl:with-param name="nextsect3" select="$nextsect3"/>
+ <axsl:with-param name="nextsect2" select="$nextsect2"/>
+ <axsl:with-param name="nextsect1" select="$nextsect1"/>
+ <axsl:with-param name="nexttoplevel-component" select="$nexttoplevel-component"/>
+ <axsl:with-param name="sect5s" select="$sect5s"/>
+ <axsl:with-param name="sect4s" select="$sect4s"/>
+ <axsl:with-param name="sect3s" select="$sect3s"/>
+ <axsl:with-param name="sect2s" select="$sect2s"/>
+ <axsl:with-param name="sect1s" select="$sect1s"/>
+ </axsl:apply-templates>
+ </sect5>
+ <axsl:if test="$nextsect5 and (not($sect4s) or count($sect5s|$nextsect5) = count($sect5s))">
+ <axsl:apply-templates select="$nextsect5" mode="toplevel-sect5">
+ <axsl:with-param name="nextsect4" select="$nextsect4"/>
+ <axsl:with-param name="nextsect3" select="$nextsect3"/>
+ <axsl:with-param name="nextsect2" select="$nextsect2"/>
+ <axsl:with-param name="nextsect1" select="$nextsect1"/>
+ <axsl:with-param name="nexttoplevel-component" select="$nexttoplevel-component"/>
+ <axsl:with-param name="sect5s" select="$sect5s"/>
+ <axsl:with-param name="sect4s" select="$sect4s"/>
+ <axsl:with-param name="sect3s" select="$sect3s"/>
+ <axsl:with-param name="sect2s" select="$sect2s"/>
+ <axsl:with-param name="sect1s" select="$sect1s"/>
+ </axsl:apply-templates>
+ </axsl:if>
+ </axsl:when>
+ <axsl:otherwise>
+ <axsl:call-template name="copy"/>
+ <axsl:apply-templates select="following-sibling::*[1]" mode="toplevel-sect5">
+ <axsl:with-param name="nextsect4" select="$nextsect4"/>
+ <axsl:with-param name="nextsect3" select="$nextsect3"/>
+ <axsl:with-param name="nextsect2" select="$nextsect2"/>
+ <axsl:with-param name="nextsect1" select="$nextsect1"/>
+ <axsl:with-param name="nexttoplevel-component" select="$nexttoplevel-component"/>
+ <axsl:with-param name="sect5s" select="$sect5s"/>
+ <axsl:with-param name="sect4s" select="$sect4s"/>
+ <axsl:with-param name="sect3s" select="$sect3s"/>
+ <axsl:with-param name="sect2s" select="$sect2s"/>
+ <axsl:with-param name="sect1s" select="$sect1s"/>
+ </axsl:apply-templates>
+ </axsl:otherwise>
+ </axsl:choose>
+ </axsl:template>
+ <axsl:template match="dbk:para" mode="book-terminal">
+ <axsl:param name="nextsect5" select="/.."/>
+ <axsl:param name="nextsect4" select="/.."/>
+ <axsl:param name="nextsect3" select="/.."/>
+ <axsl:param name="nextsect2" select="/.."/>
+ <axsl:param name="nextsect1" select="/.."/>
+ <axsl:param name="nextbook-component" select="/.."/>
+ <axsl:param name="nextbook" select="/.."/>
+ <axsl:param select="/.." name="sect5s"/>
+ <axsl:param select="/.." name="sect4s"/>
+ <axsl:param select="/.." name="sect3s"/>
+ <axsl:param select="/.." name="sect2s"/>
+ <axsl:param select="/.." name="sect1s"/>
+ <axsl:param select="/.." name="book-components"/>
+ <axsl:choose>
+ <axsl:when test="generate-id() = generate-id($nextsect5)"/>
+ <axsl:when test="generate-id() = generate-id($nextsect4)"/>
+ <axsl:when test="generate-id() = generate-id($nextsect3)"/>
+ <axsl:when test="generate-id() = generate-id($nextsect2)"/>
+ <axsl:when test="generate-id() = generate-id($nextsect1)"/>
+ <axsl:when test="generate-id() = generate-id($nextbook-component)"/>
+ <axsl:when test="generate-id() = generate-id($nextbook)"/>
+ <axsl:otherwise>
+ <axsl:call-template name="copy"/>
+ <axsl:apply-templates select="following-sibling::*[1]" mode="book-terminal">
+ <axsl:with-param name="nextsect5" select="$nextsect5"/>
+ <axsl:with-param name="nextsect4" select="$nextsect4"/>
+ <axsl:with-param name="nextsect3" select="$nextsect3"/>
+ <axsl:with-param name="nextsect2" select="$nextsect2"/>
+ <axsl:with-param name="nextsect1" select="$nextsect1"/>
+ <axsl:with-param name="nextbook-component" select="$nextbook-component"/>
+ <axsl:with-param name="nextbook" select="$nextbook"/>
+ <axsl:with-param name="sect5s" select="$sect5s"/>
+ <axsl:with-param name="sect4s" select="$sect4s"/>
+ <axsl:with-param name="sect3s" select="$sect3s"/>
+ <axsl:with-param name="sect2s" select="$sect2s"/>
+ <axsl:with-param name="sect1s" select="$sect1s"/>
+ <axsl:with-param name="book-components" select="$book-components"/>
+ </axsl:apply-templates>
+ </axsl:otherwise>
+ </axsl:choose>
+ </axsl:template>
+ <axsl:template match="dbk:para" mode="toplevel-terminal">
+ <axsl:param name="nextsect5" select="/.."/>
+ <axsl:param name="nextsect4" select="/.."/>
+ <axsl:param name="nextsect3" select="/.."/>
+ <axsl:param name="nextsect2" select="/.."/>
+ <axsl:param name="nextsect1" select="/.."/>
+ <axsl:param name="nexttoplevel-component" select="/.."/>
+ <axsl:param select="/.." name="sect5s"/>
+ <axsl:param select="/.." name="sect4s"/>
+ <axsl:param select="/.." name="sect3s"/>
+ <axsl:param select="/.." name="sect2s"/>
+ <axsl:param select="/.." name="sect1s"/>
+ <axsl:choose>
+ <axsl:when test="generate-id() = generate-id($nextsect5)"/>
+ <axsl:when test="generate-id() = generate-id($nextsect4)"/>
+ <axsl:when test="generate-id() = generate-id($nextsect3)"/>
+ <axsl:when test="generate-id() = generate-id($nextsect2)"/>
+ <axsl:when test="generate-id() = generate-id($nextsect1)"/>
+ <axsl:when test="generate-id() = generate-id($nexttoplevel-component)"/>
+ <axsl:otherwise>
+ <axsl:call-template name="copy"/>
+ <axsl:apply-templates select="following-sibling::*[1]" mode="toplevel-terminal">
+ <axsl:with-param name="nextsect5" select="$nextsect5"/>
+ <axsl:with-param name="nextsect4" select="$nextsect4"/>
+ <axsl:with-param name="nextsect3" select="$nextsect3"/>
+ <axsl:with-param name="nextsect2" select="$nextsect2"/>
+ <axsl:with-param name="nextsect1" select="$nextsect1"/>
+ <axsl:with-param name="nexttoplevel-component" select="$nexttoplevel-component"/>
+ <axsl:with-param name="sect5s" select="$sect5s"/>
+ <axsl:with-param name="sect4s" select="$sect4s"/>
+ <axsl:with-param name="sect3s" select="$sect3s"/>
+ <axsl:with-param name="sect2s" select="$sect2s"/>
+ <axsl:with-param name="sect1s" select="$sect1s"/>
+ </axsl:apply-templates>
+ </axsl:otherwise>
+ </axsl:choose>
+ </axsl:template>
+ <axsl:template match="*">
+ <axsl:call-template name="copy"/>
+ </axsl:template>
+ <axsl:template match="*" mode="book">
+ <axsl:call-template name="copy"/>
+ <axsl:apply-templates select="following-sibling::*[1]" mode="book"/>
+ </axsl:template>
+ <axsl:template match="*" mode="book-component">
+ <axsl:param name="nextbook" select="/.."/>
+ <axsl:param select="/.." name="book-components"/>
+ <axsl:call-template name="copy"/>
+ <axsl:apply-templates select="following-sibling::*[1]" mode="book-component">
+ <axsl:with-param name="nextbook" select="$nextbook"/>
+ <axsl:with-param name="book-components" select="$book-components"/>
+ </axsl:apply-templates>
+ </axsl:template>
+ <axsl:template match="*" mode="book-sect1">
+ <axsl:param name="nextbook-component" select="/.."/>
+ <axsl:param name="nextbook" select="/.."/>
+ <axsl:param select="/.." name="sect1s"/>
+ <axsl:param select="/.." name="book-components"/>
+ <axsl:call-template name="copy"/>
+ <axsl:apply-templates select="following-sibling::*[1]" mode="book-sect1">
+ <axsl:with-param name="nextbook-component" select="$nextbook-component"/>
+ <axsl:with-param name="nextbook" select="$nextbook"/>
+ <axsl:with-param name="sect1s" select="$sect1s"/>
+ <axsl:with-param name="book-components" select="$book-components"/>
+ </axsl:apply-templates>
+ </axsl:template>
+ <axsl:template match="*" mode="book-sect2">
+ <axsl:param name="nextsect1" select="/.."/>
+ <axsl:param name="nextbook-component" select="/.."/>
+ <axsl:param name="nextbook" select="/.."/>
+ <axsl:param select="/.." name="sect2s"/>
+ <axsl:param select="/.." name="sect1s"/>
+ <axsl:param select="/.." name="book-components"/>
+ <axsl:call-template name="copy"/>
+ <axsl:apply-templates select="following-sibling::*[1]" mode="book-sect2">
+ <axsl:with-param name="nextsect1" select="$nextsect1"/>
+ <axsl:with-param name="nextbook-component" select="$nextbook-component"/>
+ <axsl:with-param name="nextbook" select="$nextbook"/>
+ <axsl:with-param name="sect2s" select="$sect2s"/>
+ <axsl:with-param name="sect1s" select="$sect1s"/>
+ <axsl:with-param name="book-components" select="$book-components"/>
+ </axsl:apply-templates>
+ </axsl:template>
+ <axsl:template match="*" mode="book-sect3">
+ <axsl:param name="nextsect2" select="/.."/>
+ <axsl:param name="nextsect1" select="/.."/>
+ <axsl:param name="nextbook-component" select="/.."/>
+ <axsl:param name="nextbook" select="/.."/>
+ <axsl:param select="/.." name="sect3s"/>
+ <axsl:param select="/.." name="sect2s"/>
+ <axsl:param select="/.." name="sect1s"/>
+ <axsl:param select="/.." name="book-components"/>
+ <axsl:call-template name="copy"/>
+ <axsl:apply-templates select="following-sibling::*[1]" mode="book-sect3">
+ <axsl:with-param name="nextsect2" select="$nextsect2"/>
+ <axsl:with-param name="nextsect1" select="$nextsect1"/>
+ <axsl:with-param name="nextbook-component" select="$nextbook-component"/>
+ <axsl:with-param name="nextbook" select="$nextbook"/>
+ <axsl:with-param name="sect3s" select="$sect3s"/>
+ <axsl:with-param name="sect2s" select="$sect2s"/>
+ <axsl:with-param name="sect1s" select="$sect1s"/>
+ <axsl:with-param name="book-components" select="$book-components"/>
+ </axsl:apply-templates>
+ </axsl:template>
+ <axsl:template match="*" mode="book-sect4">
+ <axsl:param name="nextsect3" select="/.."/>
+ <axsl:param name="nextsect2" select="/.."/>
+ <axsl:param name="nextsect1" select="/.."/>
+ <axsl:param name="nextbook-component" select="/.."/>
+ <axsl:param name="nextbook" select="/.."/>
+ <axsl:param select="/.." name="sect4s"/>
+ <axsl:param select="/.." name="sect3s"/>
+ <axsl:param select="/.." name="sect2s"/>
+ <axsl:param select="/.." name="sect1s"/>
+ <axsl:param select="/.." name="book-components"/>
+ <axsl:call-template name="copy"/>
+ <axsl:apply-templates select="following-sibling::*[1]" mode="book-sect4">
+ <axsl:with-param name="nextsect3" select="$nextsect3"/>
+ <axsl:with-param name="nextsect2" select="$nextsect2"/>
+ <axsl:with-param name="nextsect1" select="$nextsect1"/>
+ <axsl:with-param name="nextbook-component" select="$nextbook-component"/>
+ <axsl:with-param name="nextbook" select="$nextbook"/>
+ <axsl:with-param name="sect4s" select="$sect4s"/>
+ <axsl:with-param name="sect3s" select="$sect3s"/>
+ <axsl:with-param name="sect2s" select="$sect2s"/>
+ <axsl:with-param name="sect1s" select="$sect1s"/>
+ <axsl:with-param name="book-components" select="$book-components"/>
+ </axsl:apply-templates>
+ </axsl:template>
+ <axsl:template match="*" mode="book-sect5">
+ <axsl:param name="nextsect4" select="/.."/>
+ <axsl:param name="nextsect3" select="/.."/>
+ <axsl:param name="nextsect2" select="/.."/>
+ <axsl:param name="nextsect1" select="/.."/>
+ <axsl:param name="nextbook-component" select="/.."/>
+ <axsl:param name="nextbook" select="/.."/>
+ <axsl:param select="/.." name="sect5s"/>
+ <axsl:param select="/.." name="sect4s"/>
+ <axsl:param select="/.." name="sect3s"/>
+ <axsl:param select="/.." name="sect2s"/>
+ <axsl:param select="/.." name="sect1s"/>
+ <axsl:param select="/.." name="book-components"/>
+ <axsl:call-template name="copy"/>
+ <axsl:apply-templates select="following-sibling::*[1]" mode="book-sect5">
+ <axsl:with-param name="nextsect4" select="$nextsect4"/>
+ <axsl:with-param name="nextsect3" select="$nextsect3"/>
+ <axsl:with-param name="nextsect2" select="$nextsect2"/>
+ <axsl:with-param name="nextsect1" select="$nextsect1"/>
+ <axsl:with-param name="nextbook-component" select="$nextbook-component"/>
+ <axsl:with-param name="nextbook" select="$nextbook"/>
+ <axsl:with-param name="sect5s" select="$sect5s"/>
+ <axsl:with-param name="sect4s" select="$sect4s"/>
+ <axsl:with-param name="sect3s" select="$sect3s"/>
+ <axsl:with-param name="sect2s" select="$sect2s"/>
+ <axsl:with-param name="sect1s" select="$sect1s"/>
+ <axsl:with-param name="book-components" select="$book-components"/>
+ </axsl:apply-templates>
+ </axsl:template>
+ <axsl:template match="*" mode="toplevel-component">
+ <axsl:call-template name="copy"/>
+ <axsl:apply-templates select="following-sibling::*[1]" mode="toplevel-component"/>
+ </axsl:template>
+ <axsl:template match="*" mode="toplevel-sect1">
+ <axsl:param name="nexttoplevel-component" select="/.."/>
+ <axsl:param select="/.." name="sect1s"/>
+ <axsl:call-template name="copy"/>
+ <axsl:apply-templates select="following-sibling::*[1]" mode="toplevel-sect1">
+ <axsl:with-param name="nexttoplevel-component" select="$nexttoplevel-component"/>
+ <axsl:with-param name="sect1s" select="$sect1s"/>
+ </axsl:apply-templates>
+ </axsl:template>
+ <axsl:template match="*" mode="toplevel-sect2">
+ <axsl:param name="nextsect1" select="/.."/>
+ <axsl:param name="nexttoplevel-component" select="/.."/>
+ <axsl:param select="/.." name="sect2s"/>
+ <axsl:param select="/.." name="sect1s"/>
+ <axsl:call-template name="copy"/>
+ <axsl:apply-templates select="following-sibling::*[1]" mode="toplevel-sect2">
+ <axsl:with-param name="nextsect1" select="$nextsect1"/>
+ <axsl:with-param name="nexttoplevel-component" select="$nexttoplevel-component"/>
+ <axsl:with-param name="sect2s" select="$sect2s"/>
+ <axsl:with-param name="sect1s" select="$sect1s"/>
+ </axsl:apply-templates>
+ </axsl:template>
+ <axsl:template match="*" mode="toplevel-sect3">
+ <axsl:param name="nextsect2" select="/.."/>
+ <axsl:param name="nextsect1" select="/.."/>
+ <axsl:param name="nexttoplevel-component" select="/.."/>
+ <axsl:param select="/.." name="sect3s"/>
+ <axsl:param select="/.." name="sect2s"/>
+ <axsl:param select="/.." name="sect1s"/>
+ <axsl:call-template name="copy"/>
+ <axsl:apply-templates select="following-sibling::*[1]" mode="toplevel-sect3">
+ <axsl:with-param name="nextsect2" select="$nextsect2"/>
+ <axsl:with-param name="nextsect1" select="$nextsect1"/>
+ <axsl:with-param name="nexttoplevel-component" select="$nexttoplevel-component"/>
+ <axsl:with-param name="sect3s" select="$sect3s"/>
+ <axsl:with-param name="sect2s" select="$sect2s"/>
+ <axsl:with-param name="sect1s" select="$sect1s"/>
+ </axsl:apply-templates>
+ </axsl:template>
+ <axsl:template match="*" mode="toplevel-sect4">
+ <axsl:param name="nextsect3" select="/.."/>
+ <axsl:param name="nextsect2" select="/.."/>
+ <axsl:param name="nextsect1" select="/.."/>
+ <axsl:param name="nexttoplevel-component" select="/.."/>
+ <axsl:param select="/.." name="sect4s"/>
+ <axsl:param select="/.." name="sect3s"/>
+ <axsl:param select="/.." name="sect2s"/>
+ <axsl:param select="/.." name="sect1s"/>
+ <axsl:call-template name="copy"/>
+ <axsl:apply-templates select="following-sibling::*[1]" mode="toplevel-sect4">
+ <axsl:with-param name="nextsect3" select="$nextsect3"/>
+ <axsl:with-param name="nextsect2" select="$nextsect2"/>
+ <axsl:with-param name="nextsect1" select="$nextsect1"/>
+ <axsl:with-param name="nexttoplevel-component" select="$nexttoplevel-component"/>
+ <axsl:with-param name="sect4s" select="$sect4s"/>
+ <axsl:with-param name="sect3s" select="$sect3s"/>
+ <axsl:with-param name="sect2s" select="$sect2s"/>
+ <axsl:with-param name="sect1s" select="$sect1s"/>
+ </axsl:apply-templates>
+ </axsl:template>
+ <axsl:template match="*" mode="toplevel-sect5">
+ <axsl:param name="nextsect4" select="/.."/>
+ <axsl:param name="nextsect3" select="/.."/>
+ <axsl:param name="nextsect2" select="/.."/>
+ <axsl:param name="nextsect1" select="/.."/>
+ <axsl:param name="nexttoplevel-component" select="/.."/>
+ <axsl:param select="/.." name="sect5s"/>
+ <axsl:param select="/.." name="sect4s"/>
+ <axsl:param select="/.." name="sect3s"/>
+ <axsl:param select="/.." name="sect2s"/>
+ <axsl:param select="/.." name="sect1s"/>
+ <axsl:call-template name="copy"/>
+ <axsl:apply-templates select="following-sibling::*[1]" mode="toplevel-sect5">
+ <axsl:with-param name="nextsect4" select="$nextsect4"/>
+ <axsl:with-param name="nextsect3" select="$nextsect3"/>
+ <axsl:with-param name="nextsect2" select="$nextsect2"/>
+ <axsl:with-param name="nextsect1" select="$nextsect1"/>
+ <axsl:with-param name="nexttoplevel-component" select="$nexttoplevel-component"/>
+ <axsl:with-param name="sect5s" select="$sect5s"/>
+ <axsl:with-param name="sect4s" select="$sect4s"/>
+ <axsl:with-param name="sect3s" select="$sect3s"/>
+ <axsl:with-param name="sect2s" select="$sect2s"/>
+ <axsl:with-param name="sect1s" select="$sect1s"/>
+ </axsl:apply-templates>
+ </axsl:template>
+ <axsl:template name="copy">
+ <axsl:copy>
+ <axsl:for-each select="@*">
+ <axsl:copy/>
+ </axsl:for-each>
+ <axsl:apply-templates/>
+ </axsl:copy>
+ </axsl:template>
+</axsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/roundtrip/pages2normalise.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/roundtrip/pages2normalise.xsl
new file mode 100644
index 0000000..35250a0
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/roundtrip/pages2normalise.xsl
@@ -0,0 +1,351 @@
+<xsl:stylesheet version="1.0"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+
+ xmlns:sfa="http://developer.apple.com/namespaces/sfa"
+ xmlns:sf="http://developer.apple.com/namespaces/sf"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:appsl="http://developer.apple.com/namespaces/sl"
+
+ xmlns:dbk='http://docbook.org/ns/docbook'
+ xmlns:rnd='http://docbook.org/ns/docbook/roundtrip'
+ exclude-result-prefixes='sfa sf xsi appsl'>
+
+ <xsl:output method="xml" indent='yes'/>
+
+ <!-- ********************************************************************
+ $Id: pages2normalise.xsl 7637 2008-01-09 20:48:30Z balls $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://nwalsh.com/docbook/xsl/ for copyright
+ and other information.
+
+ ******************************************************************** -->
+
+ <xsl:strip-space elements='*'/>
+ <xsl:preserve-space elements='sf:span'/>
+
+ <xsl:key name='styles'
+ match='sf:paragraphstyle[not(ancestor::appsl:section-prototypes)] |
+ sf:characterstyle[not(ancestor::appsl:section-prototypes)] |
+ sf:table-style'
+ use='@sf:ident|@sfa:ID'/>
+
+ <xsl:key name='ids'
+ match='*'
+ use='@sfa:ID'/>
+
+ <xsl:template match='appsl:document'>
+ <dbk:article>
+ <!-- TODO: headers and footers -->
+ <xsl:apply-templates select='sf:text-storage'/>
+ </dbk:article>
+ </xsl:template>
+
+ <xsl:template match='sf:p'>
+ <xsl:choose>
+ <xsl:when test='sf:attachment-ref and
+ count(*) = count(sf:attachment-ref|sf:br|sf:selection-start|sf:selection-end)'>
+ <xsl:apply-templates/>
+ </xsl:when>
+ <xsl:otherwise>
+ <dbk:para>
+ <xsl:variable name='style-name'>
+ <xsl:call-template name='rnd:find-style'/>
+ </xsl:variable>
+ <xsl:if test='$style-name != "" and
+ $style-name != "para"'>
+ <xsl:attribute name='rnd:style'>
+ <xsl:value-of select='$style-name'/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:apply-templates/>
+ </dbk:para>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+ <xsl:template match='sf:span'>
+ <xsl:variable name='style-name'
+ select='key("styles", @sf:style)/self::sf:characterstyle/@sf:name'/>
+
+ <xsl:variable name='char-style'>
+ <xsl:call-template name='rnd:find-style'>
+ <xsl:with-param name='char-style-name' select='$style-name'/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test='$style-name = "attribute-name"'>
+ <xsl:if test='not(preceding-sibling::node()[not(self::text()) or (self::text() and normalize-space() != "")])'>
+ <xsl:attribute name='{.}'>
+ <xsl:apply-templates select='following-sibling::*[1][self::sf:span]'
+ mode='attribute'/>
+ </xsl:attribute>
+ </xsl:if>
+ </xsl:when>
+ <xsl:when test='$style-name = "attribute-value"'/>
+ <xsl:when test='$style-name = ""'>
+ <xsl:apply-templates/>
+ </xsl:when>
+ <xsl:when test='$char-style = "superscript" or
+ $char-style = "subscript"'>
+ <xsl:element name='{$char-style}'
+ namespace='http://docbook.org/ns/docbook'>
+ <xsl:apply-templates/>
+ </xsl:element>
+ </xsl:when>
+ <xsl:otherwise>
+ <dbk:emphasis>
+ <xsl:choose>
+ <xsl:when test='$char-style = "emphasis-bold" or
+ $char-style = "emphasis-strong"'>
+ <xsl:attribute name='role'>bold</xsl:attribute>
+ </xsl:when>
+ <xsl:when test='$char-style != "" and
+ $char-style != "emphasis"'>
+ <xsl:attribute name='rnd:style'>
+ <xsl:value-of select='$char-style'/>
+ </xsl:attribute>
+ </xsl:when>
+ </xsl:choose>
+
+ <xsl:apply-templates/>
+ </dbk:emphasis>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+ <xsl:template match='*' mode='attribute'>
+ <xsl:variable name='style-name'
+ select='key("styles", @sf:style)/self::sf:characterstyle/@sf:name'/>
+
+ <xsl:if test='$style-name = "attribute-value"'>
+ <xsl:apply-templates/>
+ </xsl:if>
+ </xsl:template>
+
+ <xsl:template match='sf:br'/>
+ <xsl:template match='sf:lnbr|sf:crbr'>
+ <xsl:text>&#xa;</xsl:text>
+ </xsl:template>
+ <xsl:template match='sf:tab'>
+ <xsl:text> </xsl:text>
+ </xsl:template>
+ <xsl:template match='sf:link'>
+ <dbk:ulink url='{@href}'>
+ <xsl:apply-templates/>
+ </dbk:ulink>
+ </xsl:template>
+
+ <xsl:template match='sf:attachment-ref'>
+ <xsl:if test='@sf:kind = "tabular-attachment"'>
+ <xsl:apply-templates select='key("ids", @sfa:IDREF)'/>
+ </xsl:if>
+ </xsl:template>
+
+ <xsl:template match='sf:attachment[@sf:kind = "tabular-attachment"]'>
+ <xsl:variable name='model'
+ select='key("ids", sf:tabular-info/sf:tabular-model-ref/@sfa:IDREF)'/>
+
+ <xsl:variable name='num-cols' select='$model/sf:grid/@sf:numcols'/>
+ <xsl:variable name='num-rows' select='$model/sf:grid/@sf:numrows'/>
+
+ <xsl:variable name='border.top'
+ select='count($model/sf:grid/sf:horizontal-gridline-styles/*) = 0 or
+ not($model/sf:grid/sf:horizontal-gridline-styles/sf:style-run[@sf:gridline-index = "0"])'/>
+ <xsl:variable name='border.bottom'
+ select='count($model/sf:grid/sf:horizontal-gridline-styles/*) = 0 or
+ not($model/sf:grid/sf:horizontal-gridline-styles/sf:style-run[@sf:gridline-index = $num-rows - 1])'/>
+ <xsl:variable name='border.left'
+ select='count($model/sf:grid/sf:vertical-gridline-styles/*) = 0 or
+ not($model/sf:grid/sf:vertical-gridline-styles/sf:style-run[@sf:gridline-index = "0"])'/>
+ <xsl:variable name='border.right'
+ select='count($model/sf:grid/sf:vertical-gridline-styles/*) = 0 or
+ not($model/sf:grid/sf:vertical-gridline-styles/sf:style-run[@sf:gridline-index = $num-cols])'/>
+
+ <xsl:choose>
+ <xsl:when test='not($num-rows) or $num-rows = ""'>
+ <xsl:message> cannot determine number of rows in table</xsl:message>
+ <xsl:comment> cannot determine number of rows in table </xsl:comment>
+ </xsl:when>
+ <xsl:when test='not($num-cols) or $num-cols = ""'>
+ <xsl:message> cannot determine number of columns in table</xsl:message>
+ <xsl:comment> cannot determine number of columns in table </xsl:comment>
+ </xsl:when>
+
+ <xsl:otherwise>
+ <dbk:informaltable>
+ <xsl:choose>
+ <xsl:when test='$border.top and $border.bottom and
+ $border.left and $border.right'>
+ <xsl:attribute name='frame'>all</xsl:attribute>
+ </xsl:when>
+ <xsl:when test='$border.top and $border.bottom'>
+ <xsl:attribute name='frame'>topbot</xsl:attribute>
+ </xsl:when>
+ <xsl:when test='$border.left and $border.right'>
+ <xsl:attribute name='frame'>sides</xsl:attribute>
+ </xsl:when>
+ <xsl:when test='$border.top'>
+ <xsl:attribute name='frame'>top</xsl:attribute>
+ </xsl:when>
+ <xsl:when test='$border.bottom'>
+ <xsl:attribute name='frame'>bottom</xsl:attribute>
+ </xsl:when>
+ </xsl:choose>
+ <dbk:tgroup cols='{$num-cols}'>
+ <xsl:apply-templates select='$model/sf:grid/sf:columns/sf:grid-column'
+ mode='rnd:colspec'/>
+ <xsl:if test='$model/@sf:num-header-rows != 0'>
+ <dbk:thead>
+ <xsl:call-template name='rnd:make-table-rows'>
+ <xsl:with-param name='nodes'
+ select='$model/sf:grid/sf:datasource/sf:text-cell[@sf:row &lt; $model/@sf:num-header-rows]'/>
+ <xsl:with-param name='num-rows'
+ select='$model/@sf:num-header-rows'/>
+ </xsl:call-template>
+ </dbk:thead>
+ </xsl:if>
+ <dbk:tbody>
+ <xsl:call-template name='rnd:make-table-rows'>
+ <xsl:with-param name='nodes'
+ select='$model/sf:grid/sf:datasource/sf:text-cell[@sf:row >= $model/@sf:num-header-rows and
+ @sf:row &lt; $num-rows - $model/@sf:num-footer-rows]'/>
+ <xsl:with-param name='num-rows' select='$num-rows - $model/@sf:num-header-rows - $model/@sf:num-footer-rows'/>
+ <xsl:with-param name='row' select='$model/@sf:num-header-rows'/>
+ </xsl:call-template>
+ </dbk:tbody>
+ <xsl:if test='$model/@sf:num-footer-rows != 0'>
+ <dbk:tfoot>
+ <xsl:call-template name='rnd:make-table-rows'>
+ <xsl:with-param name='nodes'
+ select='$model/sf:grid/sf:datasource/sf:text-cell[@sf:row &gt;= $num-rows - $model/@sf:num-footer-rows]'/>
+ <xsl:with-param name='num-rows'
+ select='$model/@sf:num-footer-rows'/>
+ <xsl:with-param name='row'
+ select='$num-rows - $model/@sf:num-footer-rows'/>
+ </xsl:call-template>
+ </dbk:tfoot>
+ </xsl:if>
+ </dbk:tgroup>
+ </dbk:informaltable>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+ <xsl:template match='sf:grid-column' mode='rnd:colspec'>
+ <dbk:colspec colwidth='{@sf:width}'
+ colname='column-{count(preceding-sibling::sf:grid-column) + 1}'/>
+ </xsl:template>
+ <xsl:template name='rnd:make-table-rows'>
+ <xsl:param name='num-rows' select='0'/>
+ <xsl:param name='nodes' select='/..'/>
+ <xsl:param name='row' select='0'/>
+
+ <xsl:choose>
+ <xsl:when test='not($nodes) and $num-rows != 0'>
+ <xsl:message>WARNING: insufficient table cells</xsl:message>
+ <xsl:comment> WARNING: insufficient table cells (num-rows <xsl:value-of select='$num-rows'/>, row <xsl:value-of select='$row'/>) </xsl:comment>
+ </xsl:when>
+ <xsl:when test='$nodes and $num-rows = 0'>
+ <xsl:message>WARNING: excess table cells</xsl:message>
+ <xsl:comment> WARNING: excess table cells (num-rows <xsl:value-of select='$num-rows'/>, row <xsl:value-of select='$row'/>) </xsl:comment>
+ </xsl:when>
+ <xsl:when test='not($nodes)'/>
+ <xsl:when test='$num-rows = 0'/>
+
+ <xsl:otherwise>
+ <dbk:row>
+ <xsl:apply-templates select='$nodes[@sf:row = $row]'/>
+ </dbk:row>
+ <xsl:call-template name='rnd:make-table-rows'>
+ <xsl:with-param name='num-rows'
+ select='$num-rows - 1'/>
+ <xsl:with-param name='row'
+ select='$row + 1'/>
+ <xsl:with-param name='nodes'
+ select='$nodes[@sf:row != $row]'/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+ <xsl:template match='sf:text-cell'>
+ <dbk:entry>
+ <!-- Does this cell have no bottom border? -->
+ <xsl:variable name='horiz'
+ select='ancestor::sf:grid/sf:horizontal-gridline-styles'/>
+ <xsl:if test='not($horiz/*) or
+ not($horiz/sf:style-run[@sf:gridline-index = current()/@sf:row + 1]/sf:vector-style-ref[@sf:start-index &lt;= current()/@sf:col and @sf:stop-index >= current()/@sf:col])'>
+ <xsl:attribute name='rowsep'>1</xsl:attribute>
+ </xsl:if>
+ <!-- Does this cell have no right border? -->
+ <xsl:variable name='vert'
+ select='ancestor::sf:grid/sf:vertical-gridline-styles'/>
+ <xsl:if test='not($vert/*) or
+ not($vert/sf:style-run[@sf:gridline-index = current()/@sf:col + 1]/sf:vector-style-ref[@sf:start-index &lt;= current()/@sf:row and @sf:stop-index >= current()/@sf:row])'>
+ <xsl:attribute name='colsep'>1</xsl:attribute>
+ </xsl:if>
+
+ <xsl:choose>
+ <xsl:when test='sf:cell-text/@sfa:string'>
+ <dbk:para>
+ <xsl:apply-templates select='sf:cell-text/@sfa:string'/>
+ </dbk:para>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select='sf:cell-text/sf:cell-storage/sf:text-body/*'/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </dbk:entry>
+ </xsl:template>
+ <xsl:template match='sf:tableAttachmentTable |
+ sf:tableModelCells'>
+ <xsl:apply-templates/>
+ </xsl:template>
+ <xsl:template match='sf:tableModelPartitionSource |
+ sf:tableModelStyle-ref |
+ sf:tableModelVectors |
+ sf:tableCellArrayCellsByColumn |
+ sf:tableModelTableID'/>
+
+ <xsl:template match='sf:text-storage |
+ sf:text-body |
+ sf:section |
+ sf:layout'>
+ <xsl:apply-templates/>
+ </xsl:template>
+
+ <xsl:template match='sf:stylesheet|sf:stylesheet-ref |
+ sf:container-hint |
+ sf:page-start|sf:br |
+ sf:selection-start|sf:selection-end |
+ sf:insertion-point |
+ sf:ghost-text |
+ sf:attachments'/>
+
+ <xsl:template match='*'>
+ <xsl:message>element "<xsl:value-of select='name()'/>" not handled</xsl:message>
+ </xsl:template>
+
+ <xsl:template name='rnd:find-style'>
+ <xsl:param name='ident' select='@sf:style'/>
+ <xsl:param name='para-style-name'
+ select='key("styles", $ident)/self::sf:paragraphstyle/@sf:name'/>
+ <xsl:param name='char-style-name'
+ select='key("styles", $ident)/self::sf:characterstyle/@sf:name'/>
+
+ <xsl:choose>
+ <xsl:when test='$ident = "paragraph-style-default"'/>
+ <xsl:when test='$para-style-name != ""'>
+ <xsl:value-of select='$para-style-name'/>
+ </xsl:when>
+ <xsl:when test='key("styles", $ident)/self::sf:characterstyle/sf:property-map/sf:superscript/sf:number/@sfa:number = "1"'>superscript</xsl:when>
+ <xsl:when test='key("styles", $ident)/self::sf:characterstyle/sf:property-map/sf:subscript/sf:number/@sfa:number = "1"'>subscript</xsl:when>
+ <xsl:when test='$char-style-name != "" or
+ key("styles", $ident)/self::sf:characterstyle/sf:property-map/*'>
+ <xsl:value-of select='$char-style-name'/>
+ </xsl:when>
+ </xsl:choose>
+ </xsl:template>
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/roundtrip/param.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/roundtrip/param.xml
new file mode 100644
index 0000000..ae14800
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/roundtrip/param.xml
@@ -0,0 +1,105 @@
+<?xml version="1.0" encoding="ASCII"?>
+<book version="5.0">
+ <info>
+ <title>Roundtrip Parameter Reference</title>
+ <releaseinfo role="meta">
+ $Id: param.xweb 7042 2007-07-17 04:28:48Z xmldoc $
+ </releaseinfo>
+ <author>
+ <personname>
+ <surname>Ball</surname>
+ <firstname>Steve</firstname>
+ </personname>
+ </author>
+ <copyright>
+ <year>2007</year>
+ <year>2006</year>
+ <year>2005</year>
+ <year>2004</year>
+ <holder>Steve Ball</holder>
+ </copyright>
+ <abstract>
+ <para>This is reference documentation for all user-configurable
+ parameters in the DocBook &#8220;Roundtrip&#8221; Stylesheets (for
+ transforming DocBook to WordML, OpenDocument, and Apple Pages,
+ and for converting from those formats back to DocBook).</para>
+ </abstract>
+ </info>
+ <reference xml:id="params">
+ <title>Parameters</title>
+<refentry version="5.0" xml:id="wordml.template">
+<refmeta>
+<refentrytitle>wordml.template</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">uri</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>wordml.template</refname>
+<refpurpose>Specify the template WordML document</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="wordml.template.frag">
+&lt;xsl:param name="wordml.template"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The <parameter>wordml.template</parameter> parameter specifies a WordML document to use as a template for the generated document. The template document is used to define the (extensive) headers for the generated document, in particular the paragraph and character styles that are used to format the various elements. Any content in the template document is ignored.</para>
+
+<para>A template document is used in order to allow maintenance of the paragraph and character styles to be done using Word itself, rather than these XSL stylesheets.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="pages.template">
+<refmeta>
+<refentrytitle>pages.template</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">uri</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>pages.template</refname>
+<refpurpose>Specify the template Pages document</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="pages.template.frag">
+&lt;xsl:param name="pages.template"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>The <parameter>pages.template</parameter> parameter specifies a Pages (the Apple word processing application) document to use as a template for the generated document. The template document is used to define the (extensive) headers for the generated document, in particular the paragraph and character styles that are used to format the various elements. Any content in the template document is ignored.</para>
+
+<para>A template document is used in order to allow maintenance of the paragraph and character styles to be done using Pages itself, rather than these XSL stylesheets.</para>
+
+</refsection>
+</refentry>
+
+ </reference>
+ <appendix xml:id="stylesheet">
+ <title>The Stylesheet</title>
+ <para>The <filename>param.xsl</filename> stylesheet is just a
+ wrapper around all of these parameters.</para>
+ <programlisting xml:id="top">
+&lt;xsl:stylesheet exclude-result-prefixes="src" version="1.0"&gt;
+
+&lt;!-- This file is generated from param.xweb --&gt;
+
+&lt;!-- ********************************************************************
+ $Id: param.xweb 7042 2007-07-17 04:28:48Z xmldoc $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** --&gt;
+
+&lt;src:fragref linkend="wordml.template.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="pages.template.frag"&gt;&lt;/src:fragref&gt;
+&lt;/xsl:stylesheet&gt;
+ </programlisting>
+ </appendix>
+</book>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/roundtrip/param.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/roundtrip/param.xsl
new file mode 100644
index 0000000..6cd1b03
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/roundtrip/param.xsl
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="ASCII"?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
+
+<!-- This file is generated from param.xweb -->
+
+<!-- ********************************************************************
+ $Id: param.xweb 7042 2007-07-17 04:28:48Z xmldoc $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<xsl:param name="wordml.template"/>
+<xsl:param name="pages.template"/>
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/roundtrip/sections-spec.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/roundtrip/sections-spec.xml
new file mode 100644
index 0000000..6c86d52
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/roundtrip/sections-spec.xml
@@ -0,0 +1,38 @@
+<group:root xmlns:group='http://www.explain.com.au/grouping'>
+ <book styles='book book-title'>
+ <group:level>
+ <group:element name='part' styles='part part-title'/>
+ <group:element name='article' styles='article article-title'/>
+ <group:element name='bibliography' styles='bibliography bibliography-title'/>
+ <group:element name='appendix' styles='appendix appendix-title'/>
+ <group:element name='chapter' styles='chapter chapter-title'/>
+ <group:element name='preface' styles='preface preface-title'/>
+
+ <sect1 styles='sect1 sect1-title'>
+ <sect2 styles='sect2 sect2-title'>
+ <sect3 styles='sect3 sect3-title'>
+ <sect4 styles='sect4 sect4-title'>
+ <sect5 styles='sect5 sect5-title'/>
+ </sect4>
+ </sect3>
+ </sect2>
+ </sect1>
+ </group:level>
+ </book>
+ <group:level>
+ <group:element name='article' styles='article article-title'/>
+ <group:element name='appendix' styles='appendix appendix-title'/>
+ <group:element name='chapter' styles='chapter chapter-title'/>
+ <group:element name='preface' styles='preface preface-title'/>
+
+ <sect1 styles='sect1 sect1-title'>
+ <sect2 styles='sect2 sect2-title'>
+ <sect3 styles='sect3 sect3-title'>
+ <sect4 styles='sect4 sect4-title'>
+ <sect5 styles='sect5 sect5-title'/>
+ </sect4>
+ </sect3>
+ </sect2>
+ </sect1>
+ </group:level>
+</group:root>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/roundtrip/sections2blocks.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/roundtrip/sections2blocks.xsl
new file mode 100644
index 0000000..d0fe069
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/roundtrip/sections2blocks.xsl
@@ -0,0 +1,263 @@
+<?xml version="1.0"?>
+<axsl:stylesheet xmlns:axsl="http://www.w3.org/1999/XSL/Transform" xmlns:dbk="http://docbook.org/ns/docbook" xmlns:rnd="http://docbook.org/ns/docbook/roundtrip" version="1.0">
+<!--====================================-->
+<!--= =-->
+<!--= DO NOT EDIT THIS STYLESHEET =-->
+<!--= =-->
+<!--= This stylesheet is generated =-->
+<!--= by makeSubsections.xsl and a =-->
+<!--= mapping specification. =-->
+<!--= =-->
+<!--= Revision history: =-->
+<!--= 1.1 2007-01-10 SRB =-->
+<!--= Output DocBook 5.0. =-->
+<!--= 1.0 2005-11-08 SRB =-->
+<!--= Initial version. =-->
+<!--= =-->
+<!--= $Id: sections2blocks.xsl 8107 2008-08-17 22:39:58Z balls $ =-->
+<!--= =-->
+<!--====================================-->
+ <axsl:output indent="yes"/>
+ <axsl:strip-space elements="*"/>
+ <axsl:preserve-space elements="dbk:para dbk:emphasis"/>
+ <axsl:template match="dbk:appendix |&#10; dbk:article |&#10; dbk:book |&#10; dbk:chapter |&#10; dbk:part |&#10; dbk:preface |&#10; dbk:section |&#10; dbk:sect1 |&#10; dbk:sect2 |&#10; dbk:sect3 |&#10; dbk:sect4 |&#10; dbk:sect5">
+ <axsl:variable name="subsections" select="dbk:para[@rnd:style = &quot;bibliography&quot; or @rnd:style = &quot;bibliography-title&quot; or @rnd:style = &quot;glossary&quot; or @rnd:style = &quot;glossary-title&quot; or @rnd:style = &quot;qandaset&quot; or @rnd:style = &quot;qandaset-title&quot;]"/>
+ <axsl:copy>
+ <axsl:apply-templates select="@*"/>
+ <axsl:choose>
+ <axsl:when test="$subsections">
+ <axsl:apply-templates select="$subsections[1]/preceding-sibling::node()"/>
+ <axsl:apply-templates select="$subsections[1]" mode="subsections">
+ <axsl:with-param name="subsections" select="$subsections[position() != 1]"/>
+ </axsl:apply-templates>
+ </axsl:when>
+ <axsl:when test="dbk:appendix |&#10; dbk:article |&#10; dbk:book |&#10; dbk:chapter |&#10; dbk:part |&#10; dbk:preface |&#10; dbk:section |&#10; dbk:sect1 |&#10; dbk:sect2 |&#10; dbk:sect3 |&#10; dbk:sect4 |&#10; dbk:sect5">
+ <axsl:apply-templates select="*[self::dbk:appendix |&#10; self::dbk:article |&#10; self::dbk:book |&#10; self::dbk:chapter |&#10; self::dbk:part |&#10; self::dbk:preface |&#10; self::dbk:section |&#10; self::dbk:sect1 |&#10; self::dbk:sect2 |&#10; self::dbk:sect3 |&#10; self::dbk:sect4 |&#10; self::dbk:sect5][1]/preceding-sibling::node()"/>
+ <axsl:apply-templates select="dbk:appendix |&#10; dbk:article |&#10; dbk:book |&#10; dbk:chapter |&#10; dbk:part |&#10; dbk:preface |&#10; dbk:section |&#10; dbk:sect1 |&#10; dbk:sect2 |&#10; dbk:sect3 |&#10; dbk:sect4 |&#10; dbk:sect5"/>
+ </axsl:when>
+ <axsl:otherwise>
+ <axsl:apply-templates/>
+ </axsl:otherwise>
+ </axsl:choose>
+ </axsl:copy>
+ <axsl:choose>
+ <axsl:when test="following-sibling::*[self::dbk:appendix |&#10; self::dbk:article |&#10; self::dbk:book |&#10; self::dbk:chapter |&#10; self::dbk:part |&#10; self::dbk:preface |&#10; self::dbk:section |&#10; self::dbk:sect1 |&#10; self::dbk:sect2 |&#10; self::dbk:sect3 |&#10; self::dbk:sect4 |&#10; self::dbk:sect5] | following-sibling::dbk:para[@rnd:style = &quot;bibliography&quot; or @rnd:style = &quot;bibliography-title&quot; or @rnd:style = &quot;glossary&quot; or @rnd:style = &quot;glossary-title&quot; or @rnd:style = &quot;qandaset&quot; or @rnd:style = &quot;qandaset-title&quot;]">
+ <axsl:variable name="nextComponent" select="following-sibling::*[self::dbk:appendix |&#10; self::dbk:article |&#10; self::dbk:book |&#10; self::dbk:chapter |&#10; self::dbk:part |&#10; self::dbk:preface |&#10; self::dbk:section |&#10; self::dbk:sect1 |&#10; self::dbk:sect2 |&#10; self::dbk:sect3 |&#10; self::dbk:sect4 |&#10; self::dbk:sect5|self::dbk:para[@rnd:style = &quot;bibliography&quot; or @rnd:style = &quot;bibliography-title&quot; or @rnd:style = &quot;glossary&quot; or @rnd:style = &quot;glossary-title&quot; or @rnd:style = &quot;qandaset&quot; or @rnd:style = &quot;qandaset-title&quot;]][1]"/>
+ <axsl:apply-templates select="following-sibling::*[generate-id(following-sibling::*[self::dbk:appendix |&#10; self::dbk:article |&#10; self::dbk:book |&#10; self::dbk:chapter |&#10; self::dbk:part |&#10; self::dbk:preface |&#10; self::dbk:section |&#10; self::dbk:sect1 |&#10; self::dbk:sect2 |&#10; self::dbk:sect3 |&#10; self::dbk:sect4 |&#10; self::dbk:sect5|self::dbk:para[@rnd:style = &quot;bibliography&quot; or @rnd:style = &quot;bibliography-title&quot; or @rnd:style = &quot;glossary&quot; or @rnd:style = &quot;glossary-title&quot; or @rnd:style = &quot;qandaset&quot; or @rnd:style = &quot;qandaset-title&quot;]][1]) = generate-id($nextComponent)]"/>
+ </axsl:when>
+ <axsl:otherwise>
+ <axsl:apply-templates select="following-sibling::*"/>
+ </axsl:otherwise>
+ </axsl:choose>
+ </axsl:template>
+ <axsl:template match="dbk:para" mode="subsections">
+ <axsl:param name="subsections" select="/.."/>
+ <axsl:choose>
+ <axsl:when test="@rnd:style = &quot;bibliography&quot; or @rnd:style = &quot;bibliography-title&quot;">
+ <bibliography xmlns="http://docbook.org/ns/docbook">
+ <axsl:call-template name="copy"/>
+ <axsl:variable name="bibliodivs" select="following-sibling::dbk:para[@rnd:style = &quot;bibliodiv&quot; or @rnd:style = &quot;bibliodiv-title&quot;]"/>
+ <axsl:choose>
+ <axsl:when test="$bibliodivs">
+ <axsl:apply-templates select="following-sibling::*[1]" mode="bibliodivs">
+ <axsl:with-param name="nextSubsection" select="$subsections[1]"/>
+ <axsl:with-param name="bibliodivs" select="$bibliodivs[position() != 1]"/>
+ </axsl:apply-templates>
+ </axsl:when>
+ <axsl:otherwise>
+ <axsl:apply-templates select="following-sibling::*[1]" mode="terminal">
+ <axsl:with-param name="nextSubsection" select="$subsections[1]"/>
+ </axsl:apply-templates>
+ </axsl:otherwise>
+ </axsl:choose>
+ </bibliography>
+ </axsl:when>
+ <axsl:when test="@rnd:style = &quot;glossary&quot; or @rnd:style = &quot;glossary-title&quot;">
+ <glossary xmlns="http://docbook.org/ns/docbook">
+ <axsl:call-template name="copy"/>
+ <axsl:variable name="glossdivs" select="following-sibling::dbk:para[@rnd:style = &quot;glossdiv&quot; or @rnd:style = &quot;glossdiv-title&quot;]"/>
+ <axsl:choose>
+ <axsl:when test="$glossdivs">
+ <axsl:apply-templates select="following-sibling::*[1]" mode="glossdivs">
+ <axsl:with-param name="nextSubsection" select="$subsections[1]"/>
+ <axsl:with-param name="glossdivs" select="$glossdivs[position() != 1]"/>
+ </axsl:apply-templates>
+ </axsl:when>
+ <axsl:otherwise>
+ <axsl:apply-templates select="following-sibling::*[1]" mode="terminal">
+ <axsl:with-param name="nextSubsection" select="$subsections[1]"/>
+ </axsl:apply-templates>
+ </axsl:otherwise>
+ </axsl:choose>
+ </glossary>
+ </axsl:when>
+ <axsl:when test="@rnd:style = &quot;qandaset&quot; or @rnd:style = &quot;qandaset-title&quot;">
+ <qandaset xmlns="http://docbook.org/ns/docbook">
+ <axsl:call-template name="copy"/>
+ <axsl:variable name="qandadivs" select="following-sibling::dbk:para[@rnd:style = &quot;qandadiv&quot; or @rnd:style = &quot;qandadiv-title&quot;]"/>
+ <axsl:choose>
+ <axsl:when test="$qandadivs">
+ <axsl:apply-templates select="following-sibling::*[1]" mode="qandadivs">
+ <axsl:with-param name="nextSubsection" select="$subsections[1]"/>
+ <axsl:with-param name="qandadivs" select="$qandadivs[position() != 1]"/>
+ </axsl:apply-templates>
+ </axsl:when>
+ <axsl:otherwise>
+ <axsl:apply-templates select="following-sibling::*[1]" mode="terminal">
+ <axsl:with-param name="nextSubsection" select="$subsections[1]"/>
+ </axsl:apply-templates>
+ </axsl:otherwise>
+ </axsl:choose>
+ </qandaset>
+ </axsl:when>
+ </axsl:choose>
+ </axsl:template>
+ <axsl:template match="*" mode="subsections">
+ <axsl:param name="subsections" select="/.."/>
+ <axsl:copy>
+ <axsl:apply-templates select="@*"/>
+ <axsl:apply-templates mode="subsections"/>
+ </axsl:copy>
+ </axsl:template>
+ <axsl:template match="dbk:para" mode="bibliodivs">
+ <axsl:param name="nextSubsection" select="/.."/>
+ <axsl:param name="bibliodivs" select="/.."/>
+ <axsl:choose>
+ <axsl:when test="generate-id() = generate-id($nextSubsection)"/>
+ <axsl:when test="@rnd:style = &quot;bibliodiv&quot; or @rnd:style = &quot;bibliodiv-title&quot;">
+ <bibliodiv xmlns="http://docbook.org/ns/docbook">
+ <axsl:call-template name="copy"/>
+ <axsl:apply-templates select="following-sibling::*[1]" mode="terminal">
+ <axsl:with-param name="nextSubsection" select="$nextSubsection"/>
+ <axsl:with-param name="nextbibliodiv" select="$bibliodivs[1]"/>
+ </axsl:apply-templates>
+ </bibliodiv>
+ <axsl:choose>
+ <axsl:when test="$nextSubsection and $bibliodivs and count($nextSubsection/preceding-sibling::* | $bibliodivs[1]) = count($nextSubsection/preceding-sibling::*)">
+ <axsl:apply-templates select="$bibliodivs[1]" mode="bibliodivs">
+ <axsl:with-param name="nextSubsection" select="$nextSubsection"/>
+ <axsl:with-param name="bibliodivs" select="$bibliodivs[position() != 1]"/>
+ </axsl:apply-templates>
+ </axsl:when>
+ <axsl:when test="$bibliodivs">
+ <axsl:apply-templates select="$bibliodivs[1]" mode="bibliodivs">
+ <axsl:with-param name="bibliodivs" select="$bibliodivs[position() != 1]"/>
+ </axsl:apply-templates>
+ </axsl:when>
+ </axsl:choose>
+ </axsl:when>
+ <axsl:otherwise>
+ <axsl:call-template name="copy"/>
+ <axsl:apply-templates select="following-sibling::*[1]" mode="bibliodivs">
+ <axsl:with-param name="nextSubsection" select="$nextSubsection"/>
+ </axsl:apply-templates>
+ </axsl:otherwise>
+ </axsl:choose>
+ </axsl:template>
+ <axsl:template match="dbk:para" mode="glossdivs">
+ <axsl:param name="nextSubsection" select="/.."/>
+ <axsl:param name="glossdivs" select="/.."/>
+ <axsl:choose>
+ <axsl:when test="generate-id() = generate-id($nextSubsection)"/>
+ <axsl:when test="@rnd:style = &quot;glossdiv&quot; or @rnd:style = &quot;glossdiv-title&quot;">
+ <glossdiv xmlns="http://docbook.org/ns/docbook">
+ <axsl:call-template name="copy"/>
+ <axsl:apply-templates select="following-sibling::*[1]" mode="terminal">
+ <axsl:with-param name="nextSubsection" select="$nextSubsection"/>
+ <axsl:with-param name="nextglossdiv" select="$glossdivs[1]"/>
+ </axsl:apply-templates>
+ </glossdiv>
+ <axsl:choose>
+ <axsl:when test="$nextSubsection and $glossdivs and count($nextSubsection/preceding-sibling::* | $glossdivs[1]) = count($nextSubsection/preceding-sibling::*)">
+ <axsl:apply-templates select="$glossdivs[1]" mode="glossdivs">
+ <axsl:with-param name="nextSubsection" select="$nextSubsection"/>
+ <axsl:with-param name="glossdivs" select="$glossdivs[position() != 1]"/>
+ </axsl:apply-templates>
+ </axsl:when>
+ <axsl:when test="$glossdivs">
+ <axsl:apply-templates select="$glossdivs[1]" mode="glossdivs">
+ <axsl:with-param name="glossdivs" select="$glossdivs[position() != 1]"/>
+ </axsl:apply-templates>
+ </axsl:when>
+ </axsl:choose>
+ </axsl:when>
+ <axsl:otherwise>
+ <axsl:call-template name="copy"/>
+ <axsl:apply-templates select="following-sibling::*[1]" mode="glossdivs">
+ <axsl:with-param name="nextSubsection" select="$nextSubsection"/>
+ </axsl:apply-templates>
+ </axsl:otherwise>
+ </axsl:choose>
+ </axsl:template>
+ <axsl:template match="dbk:para" mode="qandadivs">
+ <axsl:param name="nextSubsection" select="/.."/>
+ <axsl:param name="qandadivs" select="/.."/>
+ <axsl:choose>
+ <axsl:when test="generate-id() = generate-id($nextSubsection)"/>
+ <axsl:when test="@rnd:style = &quot;qandadiv&quot; or @rnd:style = &quot;qandadiv-title&quot;">
+ <qandadiv xmlns="http://docbook.org/ns/docbook">
+ <axsl:call-template name="copy"/>
+ <axsl:apply-templates select="following-sibling::*[1]" mode="terminal">
+ <axsl:with-param name="nextSubsection" select="$nextSubsection"/>
+ <axsl:with-param name="nextqandadiv" select="$qandadivs[1]"/>
+ </axsl:apply-templates>
+ </qandadiv>
+ <axsl:choose>
+ <axsl:when test="$nextSubsection and $qandadivs and count($nextSubsection/preceding-sibling::* | $qandadivs[1]) = count($nextSubsection/preceding-sibling::*)">
+ <axsl:apply-templates select="$qandadivs[1]" mode="qandadivs">
+ <axsl:with-param name="nextSubsection" select="$nextSubsection"/>
+ <axsl:with-param name="qandadivs" select="$qandadivs[position() != 1]"/>
+ </axsl:apply-templates>
+ </axsl:when>
+ <axsl:when test="$qandadivs">
+ <axsl:apply-templates select="$qandadivs[1]" mode="qandadivs">
+ <axsl:with-param name="qandadivs" select="$qandadivs[position() != 1]"/>
+ </axsl:apply-templates>
+ </axsl:when>
+ </axsl:choose>
+ </axsl:when>
+ <axsl:otherwise>
+ <axsl:call-template name="copy"/>
+ <axsl:apply-templates select="following-sibling::*[1]" mode="qandadivs">
+ <axsl:with-param name="nextSubsection" select="$nextSubsection"/>
+ </axsl:apply-templates>
+ </axsl:otherwise>
+ </axsl:choose>
+ </axsl:template>
+ <axsl:template match="*" mode="terminal">
+ <axsl:param name="nextSubsection" select="/.."/>
+ <axsl:param name="nextbibliodiv" select="/.."/>
+ <axsl:param name="nextglossdiv" select="/.."/>
+ <axsl:param name="nextqandadiv" select="/.."/>
+ <axsl:choose>
+ <axsl:when test="generate-id() = generate-id($nextSubsection)"/>
+ <axsl:when test="generate-id() = generate-id($nextbibliodiv)"/>
+ <axsl:when test="generate-id() = generate-id($nextglossdiv)"/>
+ <axsl:when test="generate-id() = generate-id($nextqandadiv)"/>
+ <axsl:otherwise>
+ <axsl:call-template name="copy"/>
+ <axsl:apply-templates select="following-sibling::*[1]" mode="terminal">
+ <axsl:with-param name="nextSubsection" select="$nextSubsection"/>
+ <axsl:with-param name="nextbibliodiv" select="$nextbibliodiv"/>
+ <axsl:with-param name="nextglossdiv" select="$nextglossdiv"/>
+ <axsl:with-param name="nextqandadiv" select="$nextqandadiv"/>
+ </axsl:apply-templates>
+ </axsl:otherwise>
+ </axsl:choose>
+ </axsl:template>
+ <axsl:template match="*">
+ <axsl:copy>
+ <axsl:apply-templates select="@*"/>
+ <axsl:apply-templates/>
+ </axsl:copy>
+ </axsl:template>
+ <axsl:template name="copy">
+ <axsl:copy>
+ <axsl:apply-templates select="@*"/>
+ <axsl:apply-templates/>
+ </axsl:copy>
+ </axsl:template>
+ <axsl:template match="@*">
+ <axsl:copy/>
+ </axsl:template>
+</axsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/roundtrip/specifications.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/roundtrip/specifications.xml
new file mode 100644
index 0000000..85db866
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/roundtrip/specifications.xml
@@ -0,0 +1,1420 @@
+<?xml version="1.0"?>
+<article xmlns="http://docbook.org/ns/docbook">
+ <info>
+ <title>Round-Tripping Specifications</title>
+ <author>
+ <firstname>Bob</firstname>
+ <surname>Stayton</surname>
+ <affiliation>
+ <orgname>Sagehill Enterprises</orgname>
+ </affiliation>
+ </author>
+ <author>
+ <firstname>Steve</firstname>
+ <surname>Ball</surname>
+ <affiliation>
+ <orgname>Explain</orgname>
+ </affiliation>
+ </author>
+ <revhistory>
+ <revision>
+ <revnumber>1.8</revnumber>
+ <date>2008-05-22</date>
+ <authorinitials>SRB</authorinitials>
+ <revremark>Updated for current implementation.</revremark>
+ </revision>
+ <revision>
+ <revnumber>1.7</revnumber>
+ <date>2008-02-22</date>
+ <authorinitials>SRB</authorinitials>
+ <revremark>Added edition.</revremark>
+ </revision>
+ <revision>
+ <revnumber>1.6</revnumber>
+ <date>2007-10-19</date>
+ <authorinitials>SRB</authorinitials>
+ <revremark>Added keyword.</revremark>
+ </revision>
+ <revision>
+ <revnumber>1.5</revnumber>
+ <date>2007-01-05</date>
+ <authorinitials>SRB</authorinitials>
+ <revremark>Reduce emphasis on WordML, add support for OpenOffice.</revremark>
+ </revision>
+ <revision>
+ <revnumber>1.4</revnumber>
+ <date>2005-11-11</date>
+ <authorinitials>SRB</authorinitials>
+ <revremark>Added bibliography.</revremark>
+ </revision>
+ <revision>
+ <revnumber>1.3</revnumber>
+ <date>2005-10-31</date>
+ <authorinitials>SRB</authorinitials>
+ <revremark>Added mediaobjectco, imageobjectco, programlistingco, areaspec, area, calloutlist.</revremark>
+ </revision>
+ <revision>
+ <revnumber>1.2</revnumber>
+ <date>2005-10-13</date>
+ <authorinitials>SRB</authorinitials>
+ <revremark>Version prior to using revhistory.</revremark>
+ </revision>
+ </revhistory>
+ </info>
+ <abstract>
+ <para>This document specifies how DocBook elements are mapped to paragraph and character styles in a word processor. The specifications are used to write conversions between DocBook XML and word processor XML formats, such as Microsoft's WordProcessingML (WordML), OpenOffice's OpenDocument and Apple's Pages.</para>
+ </abstract>
+ <section>
+ <title>Introduction</title>
+ <para>Microsoft Word 2003 introduced WordProcessingML (WordML), an XML vocabulary for Word documents. Since then, other popular word processors have become available that use XML as their data representation, namely Apple's Pages and OpenOffice. By converting Word (or OpenOffice or Pages) to XML, it becomes possible to convert a word processing document to DocBook and vice versa using XSL transformations. Such conversions then enable the following.</para>
+ <itemizedlist>
+ <listitem>
+ <para>DocBook content creators write in their familiar wordprocessing application, rather than learning a new XML editing application.</para>
+ </listitem>
+ <listitem>
+ <para>DocBook XML documents can be styled for output using the typesetting features of the word processor.</para>
+ </listitem>
+ </itemizedlist>
+ <para>Word processors have a simple, flat data model; documents consist of paragraphs (and tables) and paragraphs contain text and character spans. All word processors allow styles to be associated with paragraphs and spans.</para>
+ <para>This specification describes how DocBook elements map to a set of paragraph and character styles. It defines a specific set of style names for which a Word style template can be created. The style names are also used in XSLT template match patterns for conversion. Although originally targetted to MS Word, the system has subsequently been extended to use other word processors, notably Apple's Pages and Open Office.</para>
+ </section>
+ <section>
+ <title>Project goals</title>
+ <para>The goal of this project is to enable a word processor, such as, but not limited to, Microsoft Word, to be used with DocBook files. The specific goals include:</para>
+ <itemizedlist>
+ <listitem>
+ <para>Enable authoring of basic DocBook documents in the word processor.</para>
+ </listitem>
+ <listitem>
+ <para>Enable importing of basic DocBook XML documents into the word processor.</para>
+ </listitem>
+ </itemizedlist>
+ <para>To meet these goals, the project provides a toolkit that can be immediately put to use. The kit includes:</para>
+ <itemizedlist>
+ <listitem>
+ <para>Templates for Microsoft Word, Apple Pages and Open Office with formatting styles attached to the style names.</para>
+ </listitem>
+ <listitem>
+ <para>XSLT stylesheets that convert a word processing document that is authored with the corresponding template into a DocBook XML file.</para>
+ </listitem>
+ <listitem>
+ <para>XSLT stylesheets that convert a DocBook document into a word processing document that can be opened in a word processor.</para>
+ </listitem>
+ </itemizedlist>
+ <section>
+ <title>Why basic DocBook?</title>
+ <para>This project will never be able to support all DocBook elements and structure. Take, for example, the <tag>address</tag> element. This element can be used both as a block element for metadata. It can also be used as a phrase level element in a block parent, such as the <tag>affiliation</tag> element. To make matters worse, it can itself contain phrase level markup, such as <tag>personname</tag>. No word processor allows character styles to be nested.</para>
+ <para>The project will initially focus on a basic set of commonly used DocBook elements in order to create a useful editing environment that utilises a word processor with DocBook. </para>
+ <para>One problem facing this conversion project is the sheer number of DocBook elements, over 400 in DocBook 5.0. To support DocBook structural models, several of the elements require more than one paragraph or character style. This would lead to very long and unwieldy list of styles in the word processor interface. That would make authoring less efficient and discourage users.</para>
+ <para>Accordingly, this project assumes that authors who need the full set of DocBook elements and structures will use an XML authoring tool that better supports them. This project is focused on authors who wish to write basic DocBook documents using a word processor. Because Microsoft Word is so widespread, it is hoped that this project will help a lot of new DocBook users get started with familiar tools. They can then graduate to more advanced tools as their needs develop.</para>
+ </section>
+ </section>
+ <section>
+ <title>Project Non-Goals</title>
+ <para>The following goals <emphasis>are not</emphasis> in the scope of this project:</para>
+ <itemizedlist>
+ <listitem>
+ <para>Support of versions of Word that do not feature reading/writing WordML (XML). That is, all versions prior to Word 11 (Office 2003).</para>
+ </listitem>
+ <listitem>
+ <para>Support of arbitrarily defined styles. This system may expect certain styles to be defined in a particular fashion (in particular, those defining the title of components and divisions).</para>
+ </listitem>
+ </itemizedlist>
+ </section>
+ <section>
+ <title>Mapping elements to styles</title>
+ <para>Although WordML, OpenDocument and DocBook are all XML, there several challenges when trying to convert between them.</para>
+ <para>The basic problem in mapping paragraph/character styles to DocBook elements is that word processor documents support far less structure than DocBook. DocBook permits nesting of elements within other elements, providing multiple levels of context for each element.</para>
+ <para>Word's only structural feature is the outlining mode. In Word outlining, certain paragraph styles are assigned outline levels. When a user applies those styles, they effectively create logical structure in the Word document. Unfortunately, Word itself attempts to automatically determine which paragraphs are headings, rendering this method is unreliable.</para>
+ <para>Instead of relying on Word's built-in outlining mode, this system uses only the names of paragraph styles to determine document structure. Certain heuristics are applied to build the DocBook element structure from the (relatively flat) word processing structure. Titles and other features are used to mark the beginning of a structure and all paragraphs following that are included in that structure until the beginning of the next structure is found. That is, the beginning of one structure marks the end of the previous structure.</para>
+ <para>Problems may arise when a structure should end, but there is no word processor feature that marks the endpoint. To mark the end of a feature an empty paragraph is used.</para>
+ <para>Nesting of block elements is another commonly used feature of DocBook. It is not possible to use Word's outline mode for blocks if it is being used for components and sections. So in this specification, nesting of block elements is indicated by adding a number suffix to a style. So a paragraph with style <literal>orderedlist2</literal> is considered to be contained within a preceding paragraph with style <literal>orderedlist1</literal> or <literal>itemizedlist1</literal>. Where appropriate in the word processor, paragraph indent levels are used to visually indicate nesting of blocks.</para>
+ <para>Nesting of inline DocBook elements is particularly difficult to support because word processors do not nest character styles. That means a nested inline would require a separate character style to indicate the parent-child relationship. Given the large number of combinations possible, a prohibitively large number of character styles would have to be created. In this project, nesting of character styles is not supported. Nested inlines being imported from DocBook will be converted to a sequence of single-name character styles, where possible, or rejected.</para>
+ <para>In many cases, DocBook structure can be derived from the flat sequence of paragraphs based on sibling relationships. For example, when a paragraph styled as <literal>para</literal> is followed by a paragraph styled as <literal>itemizedlist1</literal>, the conversion to DocBook will output a <tag>para</tag> element and then start an <tag>itemizedlist</tag> element, with the second paragraph as its first <tag>listitem</tag>. All <literal>itemizedlist1</literal> paragraphs that follow without interruption are inserted into the same <tag>itemizedlist</tag> element.</para>
+ <para>Some combinations of elements cannot be supported (at least not with the techniques as described in this document). An example is <tag>informalexample</tag> and its permitted content; there is no title to mark the beginning of the element and no marker for the end of the element, also there are too many parent-child combinations to reasonably define style names.</para>
+ <para>The design principles used in this project for selecting paragraph/character style names are as follows:</para>
+ <itemizedlist>
+ <listitem>
+ <para>Where Word (or OpenOffice or Pages), by default, has a style or feature that corresponds directly to a DocBook element then that style or feature will be used (and documented in this document). For example, the <literal>Normal</literal> paragraph style maps to a DocBook <tag>para</tag> element, and a Word table (<tag>w:tbl</tag>) maps to a DocBook <tag>table</tag><footnote><para>In some cases Word may posess a feature, but it doesn't function in an acceptable manner. For example, lists. In these cases the feature is to be avoided, and a workaround provided.</para></footnote>.</para>
+ </listitem>
+ <listitem>
+ <para>Paragraph and character style names will match DocBook element names as much as possible. This will enable authors to learn DocBook element names and help debug problems with conversion.</para>
+ </listitem>
+ <listitem>
+ <para>A style may indicate a parent-child relationship, but the paragraph for such an element may only occur after a paragraph that denotes the beginning of the parent structure. In this case the element name is used as the style name. For example, a <tag>personblurb</tag> paragraph may only occur after an <tag>author</tag>, <tag>editor</tag> or <tag>othercontrib</tag> paragraph. If a paragraph occurs without the appropriate preceding paragraph, then an error is signalled.</para>
+ </listitem>
+ <listitem>
+ <para>Some styles may also indicate a parent-child relationship, but either the parent structure is ambiguous or the paragraph starts the parent structure. For example, <literal>chapter-title</literal> indicates that the paragraph is a <tag>title</tag> element whose DocBook parent is a <tag>chapter</tag> element.</para>
+ </listitem>
+ <listitem>
+ <para>Some style names are simplified to make them easier to use in the word processor. For example, a paragraph in an orderedlist requires three elements in DocBook: <tag>orderedlist</tag>, <tag>listitem</tag>, and <tag>para</tag>. The paragraph style name in Word is shortened from <literal>orderedlist-listitem-para</literal> to just <literal>orderedlist1</literal> (for a first level list). In the case of lists (see below), the list level is appended, which is why this example becomes <literal>orderedlist1</literal>.</para>
+ </listitem>
+ <listitem>
+ <para>Style names with a number suffix indicate a nesting level, as described above.</para>
+ </listitem>
+ <listitem>
+ <para>Style names with <literal>continue</literal> indicate that the paragraph is part of the preceding element. For example, a <literal>para</literal> paragraph is used for a single paragraph <tag>para</tag> element. This causes any preceding list to be closed. If a list item in the preceding list is to contain more than one paragraph, then the subsequent paragraphs in the word processor documentmust use the <literal>para-continue</literal> style.</para>
+ </listitem>
+ <listitem>
+ <para>Character styles map to elements that are children of the element for the paragraph, hence there is no need to encode parent-child relationships. For example, a <literal>surname</literal> character style in an <literal>author</literal> paragraph becomes a <tag>surname</tag> child element of the <tag>author</tag> element.</para>
+ </listitem>
+ <listitem>
+ <para>Empty paragraph and character styles are ignored. This can be useful to end structures.</para>
+ </listitem>
+ <listitem>
+ <para>The first paragraph style in the word processor document is used to define the root element of the DocBook document. For example, if the document starts with <literal>book-title</literal>, then the DocBook document will have <tag>book</tag> element as its root element. All the rest of the document content will be contained in that root element.</para>
+ </listitem>
+ </itemizedlist>
+ <para>Sequential structures are coalesced into a single parent element. For example, a sequence of <literal>itemizedlist1</literal> paragraphs becomes a single <tag>itemizedlist</tag> element with several <tag>listitem</tag> element children.</para>
+ <table>
+ <title>DocBook to Paragraph/Character Styles</title>
+ <tgroup cols="3">
+ <colspec colnum="1" colname="col1" colwidth="2*"/>
+ <colspec colnum="2" colname="col2" colwidth="2*"/>
+ <colspec colnum="3" colname="col3" colwidth="2*"/>
+ <thead>
+ <row>
+ <entry>
+ <para colname="col1">DocBook element</para>
+ </entry>
+ <entry>
+ <para colname="col2">Style(s)</para>
+ </entry>
+ <entry>
+ <para colname="col3">Comments</para>
+ </entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry namest="col1" nameend="col3">
+ <para>
+ <emphasis role="bold">Components and sections</emphasis>
+ </para>
+ </entry>
+ </row>
+ <row>
+ <entry>
+ <para colname="col1">book/info/title</para>
+ </entry>
+ <entry colname="col2">
+ <para>book-title</para>
+ </entry>
+ <entry colname="col3">
+ <para/>
+ </entry>
+ </row>
+ <row>
+ <entry colname="col1">
+ <para>book/info/subtitle</para>
+ </entry>
+ <entry colname="col2">
+ <para>book-subtitle</para>
+ </entry>
+ <entry colname="col3">
+ <para/>
+ </entry>
+ </row>
+ <row>
+ <entry colname="col1">
+ <para>book/info/titleabbrev</para>
+ </entry>
+ <entry colname="col2">
+ <para>book-titleabbrev</para>
+ </entry>
+ <entry colname="col3">
+ <para/>
+ </entry>
+ </row>
+ <row>
+ <entry colname="col1">
+ <para>chapter/info/title</para>
+ </entry>
+ <entry colname="col2">
+ <para>chapter-title</para>
+ </entry>
+ <entry colname="col3">
+ <para>Assigned Word outline level 1.</para>
+ </entry>
+ </row>
+ <row>
+ <entry colname="col1">
+ <para>chapter/info/subtitle</para>
+ </entry>
+ <entry colname="col2">
+ <para>chapter-subtitle</para>
+ </entry>
+ <entry colname="col3">
+ <para/>
+ </entry>
+ </row>
+ <row>
+ <entry colname="col1">
+ <para>chapter/info/titleabbrev</para>
+ </entry>
+ <entry colname="col2">
+ <para>chapter-titleabbrev</para>
+ </entry>
+ <entry>
+ <db:para xmlns:db="http://docbook.org/ns/docbook"/>
+ </entry>
+ </row>
+ <row>
+ <entry colname="col1">
+ <para>appendix/info/title</para>
+ </entry>
+ <entry colname="col2">
+ <para>appendix-title</para>
+ </entry>
+ <entry colname="col3">
+ <para>Assigned Word outline level 1.</para>
+ </entry>
+ </row>
+ <row>
+ <entry colname="col1">
+ <para>preface/info/title</para>
+ </entry>
+ <entry colname="col2">
+ <para>preface-title</para>
+ </entry>
+ <entry colname="col3">
+ <para>Assigned Word outline level 1.</para>
+ </entry>
+ </row>
+ <row>
+ <entry colname="col1">
+ <para>article/info/title</para>
+ </entry>
+ <entry colname="col2">
+ <para>article-title</para>
+ </entry>
+ <entry colname="col3">
+ <para>Assigned Word outline level 1.</para>
+ </entry>
+ </row>
+ <row>
+ <entry colname="col1">
+ <para>article/info/subtitle</para>
+ </entry>
+ <entry colname="col2">
+ <para>article-subtitle</para>
+ </entry>
+ <entry colname="col3">
+ <para/>
+ </entry>
+ </row>
+ <row>
+ <entry colname="col1">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">article/info/titleabbrev</db:para>
+ </entry>
+ <entry colname="col2">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">article-titleabbrev</db:para>
+ </entry>
+ <entry colname="col3">
+ <para/>
+ </entry>
+ </row>
+ <row>
+ <entry colname="col1">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">bibliography/info/title</db:para>
+ </entry>
+ <entry colname="col2">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">bibliography-title</db:para>
+ </entry>
+ <entry colname="col3">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">Assigned Word outline level 1.</db:para>
+ </entry>
+ </row>
+ <row>
+ <entry colname="col1">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">bibliography/bibliodiv/info/title</db:para>
+ </entry>
+ <entry colname="col2">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">bibliodiv-title</db:para>
+ </entry>
+ <entry>
+ <db:para xmlns:db="http://docbook.org/ns/docbook"/>
+ </entry>
+ </row>
+ <row>
+ <entry colname="col1">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">biblioentry/title</db:para>
+ </entry>
+ <entry colname="col2">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">biblioentry-title</db:para>
+ </entry>
+ <entry colname="col3">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">Metadata elements after the biblioentry-title paragraph become part of the <sgmltag>biblioentry</sgmltag>.</db:para>
+ </entry>
+ </row>
+ <row>
+ <entry colname="col1">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">glossary/info/title</db:para>
+ </entry>
+ <entry colname="col2">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">glossary-title</db:para>
+ </entry>
+ <entry colname="col3">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">Assigned Word outline level 1.</db:para>
+ </entry>
+ </row>
+ <row>
+ <entry colname="col1">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">index/info/title</db:para>
+ </entry>
+ <entry colname="col2">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">index-title</db:para>
+ </entry>
+ <entry colname="col3">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">Assigned Word outline level 1.</db:para>
+ </entry>
+ </row>
+ <row>
+ <entry colname="col1">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">part/info/title</db:para>
+ </entry>
+ <entry colname="col2">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">part-title</db:para>
+ </entry>
+ <entry>
+ <db:para xmlns:db="http://docbook.org/ns/docbook"/>
+ </entry>
+ </row>
+ <row>
+ <entry colname="col1">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">section</db:para>
+ </entry>
+ <entry colname="col2">
+ <db:para xmlns:db="http://docbook.org/ns/docbook"/>
+ </entry>
+ <entry colname="col3">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">Unnumbered <tag>section</tag> elements are translated into their equivalent numbered paragraph style. Sections 6 levels and deeper are reported as an error.</db:para>
+ </entry>
+ </row>
+ <row>
+ <entry colname="col1">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">sect1/info/title</db:para>
+ </entry>
+ <entry colname="col2">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">sect1-title</db:para>
+ </entry>
+ <entry colname="col3">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">Assigned Word outline level 2.</db:para>
+ </entry>
+ </row>
+ <row>
+ <entry colname="col1">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">sect1/info/subtitle</db:para>
+ </entry>
+ <entry colname="col2">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">sect1-subtitle</db:para>
+ </entry>
+ <entry>
+ <db:para xmlns:db="http://docbook.org/ns/docbook"/>
+ </entry>
+ </row>
+ <row>
+ <entry colname="col1">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">sect2/info/title</db:para>
+ </entry>
+ <entry colname="col2">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">sect2-title</db:para>
+ </entry>
+ <entry colname="col3">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">Assigned Word outline level 3.</db:para>
+ </entry>
+ </row>
+ <row>
+ <entry colname="col1">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">sect2/info/subtitle</db:para>
+ </entry>
+ <entry colname="col2">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">sect2-subtitle</db:para>
+ </entry>
+ <entry>
+ <db:para xmlns:db="http://docbook.org/ns/docbook"/>
+ </entry>
+ </row>
+ <row>
+ <entry colname="col1">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">sect3/info/title</db:para>
+ </entry>
+ <entry colname="col2">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">sect3-title</db:para>
+ </entry>
+ <entry colname="col3">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">Assigned Word outline level 4.</db:para>
+ </entry>
+ </row>
+ <row>
+ <entry colname="col1">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">sect3/info/subtitle</db:para>
+ </entry>
+ <entry colname="col2">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">sect3-subtitle</db:para>
+ </entry>
+ <entry>
+ <db:para xmlns:db="http://docbook.org/ns/docbook"/>
+ </entry>
+ </row>
+ <row>
+ <entry colname="col1">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">sect4/info/title</db:para>
+ </entry>
+ <entry colname="col2">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">sect4-title</db:para>
+ </entry>
+ <entry colname="col3">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">Assigned Word outline level 5.</db:para>
+ </entry>
+ </row>
+ <row>
+ <entry colname="col1">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">sect4/info/subtitle</db:para>
+ </entry>
+ <entry colname="col2">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">sect4-subtitle</db:para>
+ </entry>
+ <entry>
+ <db:para xmlns:db="http://docbook.org/ns/docbook"/>
+ </entry>
+ </row>
+ <row>
+ <entry colname="col1">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">sect5/info/title</db:para>
+ </entry>
+ <entry colname="col2">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">sect5-title</db:para>
+ </entry>
+ <entry colname="col3">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">Assigned Word outline level 6.</db:para>
+ </entry>
+ </row>
+ <row>
+ <entry colname="col1">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">sect5/info/subtitle</db:para>
+ </entry>
+ <entry colname="col2">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">sect5-subtitle</db:para>
+ </entry>
+ <entry>
+ <db:para xmlns:db="http://docbook.org/ns/docbook"/>
+ </entry>
+ </row>
+ <row>
+ <entry colname="col1">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">simplesect/info/title</db:para>
+ </entry>
+ <entry colname="col2">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">simplesect-title</db:para>
+ </entry>
+ <entry>
+ <db:para xmlns:db="http://docbook.org/ns/docbook"/>
+ </entry>
+ </row>
+ <row>
+ <entry colname="col1">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">simplesect/info/subtitle</db:para>
+ </entry>
+ <entry colname="col2">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">simplesect-subtitle</db:para>
+ </entry>
+ <entry>
+ <db:para xmlns:db="http://docbook.org/ns/docbook"/>
+ </entry>
+ </row>
+ <row>
+ <entry colname="col1">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">bridgehead</db:para>
+ </entry>
+ <entry colname="col2">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">bridgehead</db:para>
+ </entry>
+ <entry>
+ <db:para xmlns:db="http://docbook.org/ns/docbook"/>
+ </entry>
+ </row>
+ <row>
+ <entry namest="col1" nameend="col3">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">
+ <emphasis role="bold">Metadata elements</emphasis>
+ </db:para>
+ </entry>
+ </row>
+ <row>
+ <entry colname="col1">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">abstract/title</db:para>
+ </entry>
+ <entry colname="col2">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">abstract-title</db:para>
+ </entry>
+ <entry colname="col3"><para/>.</entry>
+ </row>
+ <row>
+ <entry colname="col1">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">abstract/para</db:para>
+ </entry>
+ <entry colname="col2">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">abstract</db:para>
+ </entry>
+ <entry colname="col3">
+ <db:para xmlns:db="http://docbook.org/ns/docbook"/>
+ </entry>
+ </row>
+ <row>
+ <entry colname="col1">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">affiliation</db:para>
+ </entry>
+ <entry colname="col2">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">affiliation</db:para>
+ </entry>
+ <entry>
+ <db:para xmlns:db="http://docbook.org/ns/docbook"/>
+ </entry>
+ </row>
+ <row>
+ <entry colname="col1">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">address</db:para>
+ </entry>
+ <entry colname="col2">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">address</db:para>
+ </entry>
+ <entry>
+ <db:para xmlns:db="http://docbook.org/ns/docbook"/>
+ </entry>
+ </row>
+ <row>
+ <entry colname="col1">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">author</db:para>
+ </entry>
+ <entry colname="col2">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">author</db:para>
+ </entry>
+ <entry>
+ <db:para xmlns:db="http://docbook.org/ns/docbook"/>
+ </entry>
+ </row>
+ <row>
+ <entry colname="col1">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">date</db:para>
+ </entry>
+ <entry colname="col2">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">date</db:para>
+ </entry>
+ <entry>
+ <db:para xmlns:db="http://docbook.org/ns/docbook"/>
+ </entry>
+ </row>
+ <row>
+ <entry colname="col1">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">edition</db:para>
+ </entry>
+ <entry colname="col2">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">edition</db:para>
+ </entry>
+ <entry>
+ <db:para xmlns:db="http://docbook.org/ns/docbook"/>
+ </entry>
+ </row>
+ <row>
+ <entry colname="col1">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">legalnotice</db:para>
+ </entry>
+ <entry colname="col2">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">legalnotice</db:para>
+ </entry>
+ <entry>
+ <db:para xmlns:db="http://docbook.org/ns/docbook"/>
+ </entry>
+ </row>
+ <row>
+ <entry colname="col1">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">pubdate</db:para>
+ </entry>
+ <entry colname="col2">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">pubdate</db:para>
+ </entry>
+ <entry>
+ <db:para xmlns:db="http://docbook.org/ns/docbook"/>
+ </entry>
+ </row>
+ <row>
+ <entry colname="col1">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">publisher/pubishername</db:para>
+ </entry>
+ <entry colname="col2">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">publisher</db:para>
+ </entry>
+ <entry>
+ <db:para xmlns:db="http://docbook.org/ns/docbook"/>
+ </entry>
+ </row>
+ <row>
+ <entry colname="col1">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">publisher/address</db:para>
+ </entry>
+ <entry colname="col2">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">publisher-address</db:para>
+ </entry>
+ <entry>
+ <db:para xmlns:db="http://docbook.org/ns/docbook"/>
+ </entry>
+ </row>
+ <row>
+ <entry colname="col1">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">revhistory/revision</db:para>
+ </entry>
+ <entry colname="col2">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">revision</db:para>
+ </entry>
+ <entry>
+ <db:para xmlns:db="http://docbook.org/ns/docbook"/>
+ </entry>
+ </row>
+ <row>
+ <entry namest="col1" nameend="col3">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">
+ <emphasis role="bold">Block-level elements</emphasis>
+ </db:para>
+ </entry>
+ </row>
+ <row>
+ <entry colname="col1">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">para</db:para>
+ </entry>
+ <entry colname="col2">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">para, Normal</db:para>
+ </entry>
+ <entry colname="col3">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">Any Word paragraph with style <literal>Normal</literal> will also be converted to a <tag>para</tag> element.</db:para>
+ </entry>
+ </row>
+ <row>
+ <entry colname="col1">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">formalpara/title</db:para>
+ </entry>
+ <entry colname="col2">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">formalpara-title</db:para>
+ </entry>
+ <entry>
+ <db:para xmlns:db="http://docbook.org/ns/docbook"/>
+ </entry>
+ </row>
+ <row>
+ <entry colname="col1">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">formalpara/para</db:para>
+ </entry>
+ <entry colname="col2">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">formalpara</db:para>
+ </entry>
+ <entry>
+ <db:para xmlns:db="http://docbook.org/ns/docbook"/>
+ </entry>
+ </row>
+ <row>
+ <entry colname="col1">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">simpara</db:para>
+ </entry>
+ <entry colname="col2">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">simpara</db:para>
+ </entry>
+ <entry>
+ <db:para xmlns:db="http://docbook.org/ns/docbook"/>
+ </entry>
+ </row>
+ <row>
+ <entry colname="col1">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">note/title</db:para>
+ </entry>
+ <entry colname="col2">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">note-title</db:para>
+ </entry>
+ <entry>
+ <db:para xmlns:db="http://docbook.org/ns/docbook"/>
+ </entry>
+ </row>
+ <row>
+ <entry colname="col1">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">note/para</db:para>
+ </entry>
+ <entry colname="col2">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">note</db:para>
+ </entry>
+ <entry colname="col3">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">Consecutive paragraphs with style <literal>note</literal> after the first note are to be treated as part of the same <tag>note</tag> element. That is, consecutive notes are coalesced. The note may or may not have a title.</db:para>
+ </entry>
+ </row>
+ <row>
+ <entry colname="col1">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">caution/title</db:para>
+ </entry>
+ <entry colname="col2">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">caution-title</db:para>
+ </entry>
+ <entry>
+ <db:para xmlns:db="http://docbook.org/ns/docbook"/>
+ </entry>
+ </row>
+ <row>
+ <entry colname="col1">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">caution/para</db:para>
+ </entry>
+ <entry colname="col2">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">caution</db:para>
+ </entry>
+ <entry colname="col3">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">Consecutive cautions are coalesced.</db:para>
+ </entry>
+ </row>
+ <row>
+ <entry colname="col1">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">warning/title</db:para>
+ </entry>
+ <entry colname="col2">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">warning-title</db:para>
+ </entry>
+ <entry>
+ <db:para xmlns:db="http://docbook.org/ns/docbook"/>
+ </entry>
+ </row>
+ <row>
+ <entry colname="col1">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">warning/para</db:para>
+ </entry>
+ <entry colname="col2">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">warning</db:para>
+ </entry>
+ <entry colname="col3">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">Consecutive warnings are coalesced.</db:para>
+ </entry>
+ </row>
+ <row>
+ <entry colname="col1">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">important/title</db:para>
+ </entry>
+ <entry colname="col2">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">important-title</db:para>
+ </entry>
+ <entry>
+ <db:para xmlns:db="http://docbook.org/ns/docbook"/>
+ </entry>
+ </row>
+ <row>
+ <entry colname="col1">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">important/para</db:para>
+ </entry>
+ <entry colname="col2">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">important</db:para>
+ </entry>
+ <entry colname="col3">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">Consecutive importants are coalesced.</db:para>
+ </entry>
+ </row>
+ <row>
+ <entry colname="col1">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">tip/title</db:para>
+ </entry>
+ <entry colname="col2">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">tip-title</db:para>
+ </entry>
+ <entry>
+ <db:para xmlns:db="http://docbook.org/ns/docbook"/>
+ </entry>
+ </row>
+ <row>
+ <entry colname="col1">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">tip/para</db:para>
+ </entry>
+ <entry colname="col2">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">tip</db:para>
+ </entry>
+ <entry colname="col3">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">Consecutive tips are coalesced.</db:para>
+ </entry>
+ </row>
+ <row>
+ <entry colname="col1">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">itemizedlist/listitem/para</db:para>
+ </entry>
+ <entry colname="col2">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">
+ <literallayout class="monospaced">itemizedlist1
+itemizedlist2
+itemizedlist3
+itemizedlist4</literallayout>
+ </db:para>
+ </entry>
+ <entry colname="col3">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">A number suffix indicates a nesting level within other lists.</db:para>
+ </entry>
+ </row>
+ <row>
+ <entry colname="col1">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">orderedlist/listitem/para</db:para>
+ </entry>
+ <entry colname="col2">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">
+ <literallayout class="monospaced">orderedlist1
+orderedlist2
+orderedlist3
+orderedlist4</literallayout>
+ </db:para>
+ </entry>
+ <entry>
+ <db:para xmlns:db="http://docbook.org/ns/docbook"/>
+ </entry>
+ </row>
+ <row>
+ <entry colname="col1">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">listitem/para[position() != 1]</db:para>
+ </entry>
+ <entry colname="col2">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">para-continue</db:para>
+ </entry>
+ <entry colname="col3">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">This paragraph is included in the immediately preceding listitem.</db:para>
+ </entry>
+ </row>
+ <row>
+ <entry colname="col1">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">example/title</db:para>
+ </entry>
+ <entry colname="col2">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">example-title</db:para>
+ </entry>
+ <entry colname="col3">
+ <para>All content following the title is included in the <tag>example</tag> element. The end of the example content is marked by a <literal>caption</literal> paragraph or an empty paragraph if there is no caption.</para>
+ </entry>
+ </row>
+ <row>
+ <entry colname="col1">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">figure/title</db:para>
+ </entry>
+ <entry colname="col2">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">figure-title</db:para>
+ </entry>
+ <entry colname="col3">
+ <para>All content following the title is included in the <tag>figure</tag> element. Metadata must immediately follow the title. The end of the figure content is marked by a <literal>caption</literal> paragraph or an empty paragraph if there is no caption.</para>
+ </entry>
+ </row>
+ <row>
+ <entry colname="col1">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">informalfigure/mediaobject/imageobject/imagedata/@fileref</db:para>
+ </entry>
+ <entry colname="col2">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">informalfigure-imagedata, caption</db:para>
+ </entry>
+ <entry colname="col3">
+ <para>The content of the <literal>imageobject-imagedata</literal> paragraph is taken as the URI for the image. Metadata may immediately follow the paragraph.</para>
+ </entry>
+ </row>
+ <row>
+ <entry colname="col1">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">mediaobject/imageobject/imagedata/@fileref</db:para>
+ </entry>
+ <entry colname="col2">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">imageobject-imagedata, caption</db:para>
+ </entry>
+ <entry colname="col3">
+ <para>The content of the <literal>imageobject-imagedata</literal> paragraph is taken as the URI for the image. May be followed by a <literal>caption</literal> style paragraph. Metadata may immediately follow the paragraph, before the caption, if any.</para>
+ </entry>
+ </row>
+ <row>
+ <entry colname="col1">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">table</db:para>
+ </entry>
+ <entry colname="col2">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">Word table, caption</db:para>
+ </entry>
+ <entry>
+ <db:para xmlns:db="http://docbook.org/ns/docbook"/>
+ </entry>
+ </row>
+ <row>
+ <entry colname="col1">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">table/title</db:para>
+ </entry>
+ <entry colname="col2">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">table-title, caption</db:para>
+ </entry>
+ <entry colname="col3">
+ <para>Metadata may immediately follow the paragraph.</para>
+ </entry>
+ </row>
+ <row>
+ <entry colname="col1">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">informaltable</db:para>
+ </entry>
+ <entry colname="col2">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">Word table</db:para>
+ </entry>
+ <entry colname="col3">
+ <para>A table with no title imediately preceding it.</para>
+ </entry>
+ </row>
+ <row>
+ <entry colname="col1">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">caption</db:para>
+ </entry>
+ <entry colname="col2">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">caption</db:para>
+ </entry>
+ <entry>
+ <db:para xmlns:db="http://docbook.org/ns/docbook"/>
+ </entry>
+ </row>
+ <row>
+ <entry colname="col1">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">literallayout</db:para>
+ </entry>
+ <entry colname="col2">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">literallayout</db:para>
+ </entry>
+ <entry colname="col3">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">Inside a <literal>literallayout</literal> paragraph in Word, lines should be separated by line break (Shift-Enter) rather than paragraph break (Enter).</db:para>
+ </entry>
+ </row>
+ <row>
+ <entry colname="col1">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">programlisting</db:para>
+ </entry>
+ <entry colname="col2">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">programlisting</db:para>
+ </entry>
+ <entry colname="col3">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">Inside a <literal>programlisting</literal> paragraph in Word, lines should be separated by line break (Shift-Enter) rather than paragraph break (Enter). Tabs are not supported.</db:para>
+ </entry>
+ </row>
+ <row>
+ <entry colname="col1">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">blockquote/title</db:para>
+ </entry>
+ <entry colname="col2">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">blockquote-title</db:para>
+ </entry>
+ <entry colname="col3">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">Must immediately precede a <literal>blockquote</literal> paragraph in Word.</db:para>
+ </entry>
+ </row>
+ <row>
+ <entry colname="col1">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">blockquote/para</db:para>
+ </entry>
+ <entry colname="col2">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">blockquote</db:para>
+ </entry>
+ <entry>
+ <db:para xmlns:db="http://docbook.org/ns/docbook"/>
+ </entry>
+ </row>
+ <row>
+ <entry colname="col1">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">blockquote/attribution</db:para>
+ </entry>
+ <entry colname="col2">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">blockquote-attribution</db:para>
+ </entry>
+ <entry colname="col3">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">Must immediately follow a <literal>blockquote</literal> paragraph in Word.</db:para>
+ </entry>
+ </row>
+ <row>
+ <entry colname="col1">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">bibliomisc</db:para>
+ </entry>
+ <entry colname="col2">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">bibliomisc</db:para>
+ </entry>
+ <entry>
+ <db:para xmlns:db="http://docbook.org/ns/docbook"/>
+ </entry>
+ </row>
+ <row>
+ <entry namest="col1" nameend="col3">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">
+ <emphasis role="bold">Non-DocBook elements</emphasis>
+ </db:para>
+ </entry>
+ </row>
+ <row>
+ <entry colname="col1">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">xi:include</db:para>
+ </entry>
+ <entry colname="col2">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">xinclude</db:para>
+ </entry>
+ <entry colname="col3">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">The content of the paragraph becomes the value of the <tag>href</tag> attribute.</db:para>
+ </entry>
+ </row>
+ <row>
+ <entry namest="col1" nameend="col3">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">
+ <emphasis role="bold">Inline elements</emphasis>
+ </db:para>
+ </entry>
+ </row>
+ <row>
+ <entry colname="col1">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">emphasis</db:para>
+ </entry>
+ <entry colname="col2">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">emphasis</db:para>
+ </entry>
+ <entry>
+ <db:para xmlns:db="http://docbook.org/ns/docbook"/>
+ </entry>
+ </row>
+ <row>
+ <entry colname="col1">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">emphasis/@role="bold"</db:para>
+ </entry>
+ <entry colname="col2">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">emphasis-bold</db:para>
+ </entry>
+ <entry>
+ <db:para xmlns:db="http://docbook.org/ns/docbook"/>
+ </entry>
+ </row>
+ <row>
+ <entry colname="col1">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">emphasis/@role="underline"</db:para>
+ </entry>
+ <entry colname="col2">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">emphasis-underline</db:para>
+ </entry>
+ <entry>
+ <db:para xmlns:db="http://docbook.org/ns/docbook"/>
+ </entry>
+ </row>
+ <row>
+ <entry colname="col1">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">footnote</db:para>
+ </entry>
+ <entry colname="col2">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">Word footnote</db:para>
+ </entry>
+ <entry>
+ <db:para xmlns:db="http://docbook.org/ns/docbook"/>
+ </entry>
+ </row>
+ <row>
+ <entry colname="col1">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">link</db:para>
+ </entry>
+ <entry colname="col2">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">link</db:para>
+ </entry>
+ <entry colname="col3">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">In Word, hyperlink properties identify the DocBook linkend.</db:para>
+ </entry>
+ </row>
+ <row>
+ <entry colname="col1">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">releaseinfo</db:para>
+ </entry>
+ <entry colname="col2">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">releaseinfo</db:para>
+ </entry>
+ <entry>
+ <db:para xmlns:db="http://docbook.org/ns/docbook"/>
+ </entry>
+ </row>
+ <row>
+ <entry colname="col1">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">surname</db:para>
+ </entry>
+ <entry colname="col2">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">surname</db:para>
+ </entry>
+ <entry colname="col3">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">Character style. Must occur in an appropriate parent paragraph, such as <tag>author</tag> or <tag>editor</tag>.</db:para>
+ </entry>
+ </row>
+ <row>
+ <entry colname="col1">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">firstname</db:para>
+ </entry>
+ <entry colname="col2">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">firstname</db:para>
+ </entry>
+ <entry colname="col3">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">Character style. Must occur in an appropriate parent paragraph, such as <tag>author</tag> or <tag>editor</tag>.</db:para>
+ </entry>
+ </row>
+ <row>
+ <entry colname="col1">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">orgname</db:para>
+ </entry>
+ <entry colname="col2">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">orgname</db:para>
+ </entry>
+ <entry>
+ <db:para xmlns:db="http://docbook.org/ns/docbook"/>
+ </entry>
+ </row>
+ <row>
+ <entry colname="col1">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">keyword</db:para>
+ </entry>
+ <entry colname="col2">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">keywordset/keyword</db:para>
+ </entry>
+ <entry colname="col3">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">Paragraph style. Consecutive <tag>keyword</tag> elements are merged into a single <tag>keywordset</tag> parent element. Words (phrases) within a paragraph separated by commas become individual <tag>keyword</tag> elements.</db:para>
+ </entry>
+ </row>
+ <row>
+ <entry colname="col1">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">citetitle</db:para>
+ </entry>
+ <entry colname="col2">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">citetitle</db:para>
+ </entry>
+ <entry>
+ <db:para xmlns:db="http://docbook.org/ns/docbook"/>
+ </entry>
+ </row>
+ <row>
+ <entry colname="col1">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">city</db:para>
+ </entry>
+ <entry colname="col2">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">city</db:para>
+ </entry>
+ <entry>
+ <db:para xmlns:db="http://docbook.org/ns/docbook"/>
+ </entry>
+ </row>
+ <row>
+ <entry colname="col1">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">contrib</db:para>
+ </entry>
+ <entry colname="col2">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">contrib</db:para>
+ </entry>
+ <entry>
+ <db:para xmlns:db="http://docbook.org/ns/docbook"/>
+ </entry>
+ </row>
+ <row>
+ <entry colname="col1">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">country</db:para>
+ </entry>
+ <entry colname="col2">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">country</db:para>
+ </entry>
+ <entry>
+ <db:para xmlns:db="http://docbook.org/ns/docbook"/>
+ </entry>
+ </row>
+ <row>
+ <entry colname="col1">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">email</db:para>
+ </entry>
+ <entry colname="col2">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">email</db:para>
+ </entry>
+ <entry>
+ <db:para xmlns:db="http://docbook.org/ns/docbook"/>
+ </entry>
+ </row>
+ <row>
+ <entry colname="col1">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">fax</db:para>
+ </entry>
+ <entry colname="col2">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">fax</db:para>
+ </entry>
+ <entry>
+ <db:para xmlns:db="http://docbook.org/ns/docbook"/>
+ </entry>
+ </row>
+ <row>
+ <entry colname="col1">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">honorific</db:para>
+ </entry>
+ <entry colname="col2">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">honorific</db:para>
+ </entry>
+ <entry>
+ <db:para xmlns:db="http://docbook.org/ns/docbook"/>
+ </entry>
+ </row>
+ <row>
+ <entry colname="col1">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">jobtitle</db:para>
+ </entry>
+ <entry colname="col2">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">jobtitle</db:para>
+ </entry>
+ <entry>
+ <db:para xmlns:db="http://docbook.org/ns/docbook"/>
+ </entry>
+ </row>
+ <row>
+ <entry colname="col1">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">lineage</db:para>
+ </entry>
+ <entry colname="col2">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">lineage</db:para>
+ </entry>
+ <entry>
+ <db:para xmlns:db="http://docbook.org/ns/docbook"/>
+ </entry>
+ </row>
+ <row>
+ <entry colname="col1">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">orgdiv</db:para>
+ </entry>
+ <entry colname="col2">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">orgdiv</db:para>
+ </entry>
+ <entry>
+ <db:para xmlns:db="http://docbook.org/ns/docbook"/>
+ </entry>
+ </row>
+ <row>
+ <entry colname="col1">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">otheraddr</db:para>
+ </entry>
+ <entry colname="col2">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">otheraddr</db:para>
+ </entry>
+ <entry>
+ <db:para xmlns:db="http://docbook.org/ns/docbook"/>
+ </entry>
+ </row>
+ <row>
+ <entry colname="col1">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">othername</db:para>
+ </entry>
+ <entry colname="col2">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">othername</db:para>
+ </entry>
+ <entry>
+ <db:para xmlns:db="http://docbook.org/ns/docbook"/>
+ </entry>
+ </row>
+ <row>
+ <entry colname="col1">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">phone</db:para>
+ </entry>
+ <entry colname="col2">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">phone</db:para>
+ </entry>
+ <entry>
+ <db:para xmlns:db="http://docbook.org/ns/docbook"/>
+ </entry>
+ </row>
+ <row>
+ <entry colname="col1">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">pob</db:para>
+ </entry>
+ <entry colname="col2">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">pob</db:para>
+ </entry>
+ <entry>
+ <db:para xmlns:db="http://docbook.org/ns/docbook"/>
+ </entry>
+ </row>
+ <row>
+ <entry colname="col1">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">postcode</db:para>
+ </entry>
+ <entry colname="col2">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">postcode</db:para>
+ </entry>
+ <entry>
+ <db:para xmlns:db="http://docbook.org/ns/docbook"/>
+ </entry>
+ </row>
+ <row>
+ <entry colname="col1">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">shortaffil</db:para>
+ </entry>
+ <entry colname="col2">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">shortaffil</db:para>
+ </entry>
+ <entry>
+ <db:para xmlns:db="http://docbook.org/ns/docbook"/>
+ </entry>
+ </row>
+ <row>
+ <entry colname="col1">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">state</db:para>
+ </entry>
+ <entry colname="col2">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">state</db:para>
+ </entry>
+ <entry>
+ <db:para xmlns:db="http://docbook.org/ns/docbook"/>
+ </entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </table>
+ <table>
+ <title>Proposed Additions - not yet implemented</title>
+ <tgroup cols="3">
+ <colspec colnum="1" colname="col1" colwidth="2*"/>
+ <colspec colnum="2" colname="col2" colwidth="2*"/>
+ <colspec colnum="3" colname="col3" colwidth="2*"/>
+ <thead>
+ <row>
+ <entry colname="col1">
+ <para>DocBook element</para>
+ </entry>
+ <entry colname="col2">
+ <para>Style(s)</para>
+ </entry>
+ <entry colname="col3">
+ <para>Comments</para>
+ </entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry colname="col1">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">variablelist/varlistentry/term</db:para>
+ </entry>
+ <entry colname="col2">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">
+ <literallayout class="monospaced">variablelist1-term
+variablelist2-term
+variablelist3-term
+variablelist4-term</literallayout>
+ </db:para>
+ </entry>
+ <entry colname="col3">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">A <sgmltag class="element">variablelist</sgmltag> in Word should be a sequence of alternating paragraphs styled as <literal>variablelistN-term</literal> and <literal>variablelistN</literal>.</db:para>
+ </entry>
+ </row>
+ <row>
+ <entry colname="col1">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">variablelist/varlistentry/listitem/para</db:para>
+ </entry>
+ <entry colname="col2">
+ <db:para xmlns:db="http://docbook.org/ns/docbook">
+ <literallayout class="monospaced">variablelist1
+variablelist2
+variablelist3
+variablelist4</literallayout>
+ </db:para>
+ </entry>
+ <entry colname="col3">
+ <para>Consecutive paragraphs are coalesced.</para>
+ </entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </table>
+ <section>
+ <title>Attributes</title>
+ <para>Attributes are a feature of DocBook XML that have no direct counterpart in Word.</para>
+ <para>XML attributes are encoded in Word comments (annotations). Some dummy text (just a space, using a character style that includes the hidden property) anchors the comment. Within the comment text, character types are used to indicate attribute names and values (these must be paired). This approach keeps the attributes separate to the main body and allows multiple attributes to be encoded.</para>
+ <para>A disadvantage to this approach is that a paragraph may be related to more than one element, but the attributes are associated with only one element (by default the parent). For example, a section may have an attribute as well as the title child element, but only a single paragraph (with paragraph style <literal>sect1-title</literal>) represents both elements. Any attribute defined in a comment would be associated with the <tag>sect1</tag> element.</para>
+ <para>Pages does not have annotations, so the character styles <literal>attribute-name</literal> and <literal>attribute-value</literal> are used.</para>
+ </section>
+ </section>
+</article>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/roundtrip/template-pages.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/roundtrip/template-pages.xml
new file mode 100644
index 0000000..cc6fc03
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/roundtrip/template-pages.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0"?>
+<sl:document xmlns:sfa="http://developer.apple.com/namespaces/sfa" xmlns:sf="http://developer.apple.com/namespaces/sf" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:sl="http://developer.apple.com/namespaces/sl" sl:version="72007061400" sfa:ID="SLPublicationModel-0" sl:generator="slingshot" sl:app_build_date="Sep 26 2007, 14:46:11"><sl:version-history><sl:number sfa:number="2004042200" sfa:type="i"/><sl:number sfa:number="2004060800" sfa:type="i"/><sl:number sfa:number="2004061600" sfa:type="i"/><sl:number sfa:number="2004062200" sfa:type="i"/><sl:number sfa:number="2004062900" sfa:type="i"/><sl:number sfa:number="2004072200" sfa:type="i"/><sl:number sfa:number="2004091600" sfa:type="i"/><sl:number sfa:number="2004093000" sfa:type="i"/><sl:number sfa:number="2005140600" sfa:type="i"/><sl:number sfa:number="72007061400" sfa:type="q"/></sl:version-history><sl:publication-info><sl:SFWPCTShowDeletedTextProperty><sl:number sfa:number="1" sfa:type="c"/></sl:SFWPCTShowDeletedTextProperty><sl:SLCreationLocaleProperty><sl:string sfa:string="en_AU"/></sl:SLCreationLocaleProperty><sl:decimalTab><sl:string sfa:string="."/></sl:decimalTab><sl:kSFWPHyperlinksEnabledProperty><sl:number sfa:number="1" sfa:type="c"/></sl:kSFWPHyperlinksEnabledProperty><sl:kSFWPFootnoteNumberingProperty><sl:number sfa:number="0" sfa:type="i"/></sl:kSFWPFootnoteNumberingProperty><sl:SFWPShowInvisiblesProperty><sl:number sfa:number="0" sfa:type="c"/></sl:SFWPShowInvisiblesProperty><sl:kSFWPGhostTextAuthoringEnabledProperty><sl:number sfa:number="0" sfa:type="c"/></sl:kSFWPGhostTextAuthoringEnabledProperty><sl:kSFWPFootnoteKindProperty><sl:number sfa:number="0" sfa:type="i"/></sl:kSFWPFootnoteKindProperty><sl:kSFWPAutoHyphenationProperty><sl:number sfa:number="1" sfa:type="c"/></sl:kSFWPAutoHyphenationProperty><sl:SLCreationDateProperty><sl:date sfa:ID="NSCalendarDate-0" sf:val="2005-04-08T17:18:47+1000"/></sl:SLCreationDateProperty><sl:kSFWPFootnoteGapProperty><sl:number sfa:number="10" sfa:type="i"/></sl:kSFWPFootnoteGapProperty><sl:DefaultHyphenationLanguage><sl:string sfa:string="en"/></sl:DefaultHyphenationLanguage><sl:ShowPageGuides><sl:number sfa:number="0" sfa:type="c"/></sl:ShowPageGuides><sl:kSFWPHasHeadersProperty><sl:number sfa:number="1" sfa:type="c"/></sl:kSFWPHasHeadersProperty><sl:SLSectionAuthoringProperty><sl:number sfa:number="0" sfa:type="c"/></sl:SLSectionAuthoringProperty><sl:SLSaveQuickLookPreviewProperty><sl:number sfa:number="0" sfa:type="c"/></sl:SLSaveQuickLookPreviewProperty><sl:kSFWPFootnoteFormatProperty><sl:number sfa:number="0" sfa:type="i"/></sl:kSFWPFootnoteFormatProperty><sl:kSFWPHyphenationZoneProperty><sl:number sfa:number="18" sfa:type="i"/></sl:kSFWPHyphenationZoneProperty><sl:SLLastModifiedLocaleProperty><sl:string sfa:string="en_AU"/></sl:SLLastModifiedLocaleProperty><sl:SLVisibleLinkedTextBoxConnections><sl:number sfa:number="1" sfa:type="c"/></sl:SLVisibleLinkedTextBoxConnections><sl:SLCopyTemplateAssetsProperty><sl:number sfa:number="0" sfa:type="c"/></sl:SLCopyTemplateAssetsProperty><sl:SFWPCTMarkupVisibleProperty><sl:number sfa:number="1" sfa:type="c"/></sl:SFWPCTMarkupVisibleProperty><sl:SLCopyMoviesProperty><sl:number sfa:number="1" sfa:type="c"/></sl:SLCopyMoviesProperty><sl:SLNumberOfTimesSavedProperty><sl:number sfa:number="47" sfa:type="i"/></sl:SLNumberOfTimesSavedProperty><sl:SLLastModifiedDateProperty><sl:date sfa:ID="NSDate-0" sf:val="2007-12-12T19:45:06+1100"/></sl:SLLastModifiedDateProperty><sl:kSFWPHasFootersProperty><sl:number sfa:number="1" sfa:type="c"/></sl:kSFWPHasFootersProperty><sl:kSFWPHasBodyProperty><sl:number sfa:number="1" sfa:type="c"/></sl:kSFWPHasBodyProperty><sl:kSFWPUseLigaturesProperty><sl:number sfa:number="1" sfa:type="c"/></sl:kSFWPUseLigaturesProperty><sl:SFWPChangeBarsVisibleProperty><sl:number sfa:number="1" sfa:type="c"/></sl:SFWPChangeBarsVisibleProperty><sl:SFWPAnnotationsVisibleProperty><sl:number sfa:number="0" sfa:type="c"/></sl:SFWPAnnotationsVisibleProperty><sl:language><sl:string sfa:string="en"/></sl:language></sl:publication-info><sf:metadata><sf:projects><sf:array sfa:ID="NSArray-0"><sf:string sfa:string=""/></sf:array></sf:projects><sf:authors><sf:array sfa:ID="NSArray-1"><sf:string sfa:string=""/></sf:array></sf:authors><sf:title><sf:string sfa:string=""/></sf:title><sf:copyright><sf:string sfa:string="(c)"/></sf:copyright><sf:keywords><sf:array sfa:ID="NSArray-2"><sf:string sfa:string=""/></sf:array></sf:keywords><sf:comment><sf:string sfa:string=""/></sf:comment></sf:metadata><sl:slprint-info sfa:ID="SLPrintInfo-0" sl:page-width="595" sl:page-height="842" sl:page-scale="1"><sf:page-margins sfa:ID="SFWPMargins-0" sf:top="56.692913055419922" sf:left="56.692913055419922" sf:bottom="70.866142272949219" sf:right="56.692913055419922" sf:header="35.433071136474609" sf:footer="42.519683837890625"/><sl:print-info><sl:NSVerticalPagination><sl:number sfa:number="0" sfa:type="i"/></sl:NSVerticalPagination><sl:NSPrintProtected><sl:number sfa:number="0" sfa:type="c"/></sl:NSPrintProtected><sl:NSHorizontallyCentered><sl:number sfa:number="1" sfa:type="c"/></sl:NSHorizontallyCentered><sl:NSCopies><sl:number sfa:number="1" sfa:type="i"/></sl:NSCopies><sl:NSVerticallyCentered><sl:number sfa:number="1" sfa:type="c"/></sl:NSVerticallyCentered><sl:NSFirstPage><sl:number sfa:number="1" sfa:type="i"/></sl:NSFirstPage><sl:NSScalingFactor><sl:number sfa:number="1" sfa:type="f"/></sl:NSScalingFactor><sl:NSTopMargin><sl:number sfa:number="90" sfa:type="f"/></sl:NSTopMargin><sl:NSJobDisposition><sl:string sfa:string="NSPrintSpoolJob"/></sl:NSJobDisposition><sl:NSMustCollate><sl:number sfa:number="1" sfa:type="c"/></sl:NSMustCollate><sl:NSPrintAllPages><sl:number sfa:number="1" sfa:type="c"/></sl:NSPrintAllPages><sl:NSBottomMargin><sl:number sfa:number="90" sfa:type="f"/></sl:NSBottomMargin><sl:NSLastPage><sl:number sfa:number="2147483647" sfa:type="i"/></sl:NSLastPage><sl:NSOrientation><sl:number sfa:number="0" sfa:type="i"/></sl:NSOrientation><sl:NSPrinter><sl:printer sfa:ID="NSPrinter-0" sl:type="Canon MP530"/></sl:NSPrinter><sl:NSRightMargin><sl:number sfa:number="72" sfa:type="f"/></sl:NSRightMargin><sl:NSPaperName><sl:string sfa:string="A4"/></sl:NSPaperName><sl:NSHorizonalPagination><sl:number sfa:number="2" sfa:type="i"/></sl:NSHorizonalPagination><sl:NSLeftMargin><sl:number sfa:number="72" sfa:type="f"/></sl:NSLeftMargin><sl:NSPaperSize><sl:value><sfa:size sfa:w="595" sfa:h="842"/></sl:value></sl:NSPaperSize></sl:print-info></sl:slprint-info><sl:section-prototypes><sl:prototype sl:name="Text Page"><sf:stylesheet sfa:ID="SFSStylesheet-0"><sf:styles><sf:paragraphstyle sfa:ID="SFWPParagraphStyle-0" sf:name="Sub-heading" sf:ident="paragraph-style-33"><sf:property-map><sf:fontSize/><sf:word_strikethrough/><sf:spaceAfter/><sf:alignment/><sf:keepLinesTogether/><sf:listStyle><sf:liststyle sfa:ID="SFWPListStyle-0" sf:name="None" sf:ident="list-style-default"><sf:property-map><sf:listTextIndents><sf:array sfa:ID="NSArray-3"><sf:number sfa:number="0" sfa:type="f"/><sf:number sfa:number="36" sfa:type="f"/><sf:number sfa:number="72" sfa:type="f"/><sf:number sfa:number="108" sfa:type="f"/><sf:number sfa:number="144" sfa:type="f"/><sf:number sfa:number="180" sfa:type="f"/><sf:number sfa:number="216" sfa:type="f"/><sf:number sfa:number="252" sfa:type="f"/><sf:number sfa:number="288" sfa:type="f"/></sf:array></sf:listTextIndents><sf:listLabelGeometries><sf:array sfa:ID="NSArray-4"><sf:list-label-geometry sfa:ID="SFWPListLabelGeometry-0" sf:align="left" sf:scale="1" sf:offset="0" sf:scale-with-text="true"/><sf:list-label-geometry sfa:ID="SFWPListLabelGeometry-1" sf:align="left" sf:scale="1" sf:offset="0" sf:scale-with-text="true"/><sf:list-label-geometry sfa:ID="SFWPListLabelGeometry-2" sf:align="left" sf:scale="1" sf:offset="0" sf:scale-with-text="true"/><sf:list-label-geometry sfa:ID="SFWPListLabelGeometry-3" sf:align="left" sf:scale="1" sf:offset="0" sf:scale-with-text="true"/><sf:list-label-geometry sfa:ID="SFWPListLabelGeometry-4" sf:align="left" sf:scale="1" sf:offset="0" sf:scale-with-text="true"/><sf:list-label-geometry sfa:ID="SFWPListLabelGeometry-5" sf:align="left" sf:scale="1" sf:offset="0" sf:scale-with-text="true"/><sf:list-label-geometry sfa:ID="SFWPListLabelGeometry-6" sf:align="left" sf:scale="1" sf:offset="0" sf:scale-with-text="true"/><sf:list-label-geometry sfa:ID="SFWPListLabelGeometry-7" sf:align="left" sf:scale="1" sf:offset="0" sf:scale-with-text="true"/><sf:list-label-geometry sfa:ID="SFWPListLabelGeometry-8" sf:align="left" sf:scale="1" sf:offset="0" sf:scale-with-text="true"/></sf:array></sf:listLabelGeometries><sf:listLabelIndents><sf:array sfa:ID="NSArray-5"><sf:number sfa:number="0" sfa:type="f"/><sf:number sfa:number="0" sfa:type="f"/><sf:number sfa:number="0" sfa:type="f"/><sf:number sfa:number="0" sfa:type="f"/><sf:number sfa:number="0" sfa:type="f"/><sf:number sfa:number="0" sfa:type="f"/><sf:number sfa:number="0" sfa:type="f"/><sf:number sfa:number="0" sfa:type="f"/><sf:number sfa:number="0" sfa:type="f"/></sf:array></sf:listLabelIndents><sf:listLabelTypes><sf:array sfa:ID="NSArray-6"><sf:list-label-typeinfo sfa:ID="SFWPListLabelTypeInfo-0" sf:type="none"/><sf:list-label-typeinfo sfa:ID="SFWPListLabelTypeInfo-1" sf:type="none"/><sf:list-label-typeinfo sfa:ID="SFWPListLabelTypeInfo-2" sf:type="none"/><sf:list-label-typeinfo sfa:ID="SFWPListLabelTypeInfo-3" sf:type="none"/><sf:list-label-typeinfo sfa:ID="SFWPListLabelTypeInfo-4" sf:type="none"/><sf:list-label-typeinfo sfa:ID="SFWPListLabelTypeInfo-5" sf:type="none"/><sf:list-label-typeinfo sfa:ID="SFWPListLabelTypeInfo-6" sf:type="none"/><sf:list-label-typeinfo sfa:ID="SFWPListLabelTypeInfo-7" sf:type="none"/><sf:list-label-typeinfo sfa:ID="SFWPListLabelTypeInfo-8" sf:type="none"/></sf:array></sf:listLabelTypes></sf:property-map></sf:liststyle></sf:listStyle><sf:outlineLevel/><sf:underline/><sf:underlineWidth/><sf:defaultTabStops><sf:number sfa:number="28.34646" sfa:type="f"/></sf:defaultTabStops><sf:tocStyle><sf:tocstyle sfa:ID="SLTOCParagraphStyle-0" sfa:sfclass="paragraphstyle" sf:name="TOC Heading 3" sf:ident="toc-paragraph-style-3"><sf:property-map><sf:fontSize/><sf:word_strikethrough/><sf:spaceAfter/><sf:SLTOCPageNumberStyle><sf:null/></sf:SLTOCPageNumberStyle><sf:alignment/><sf:keepLinesTogether/><sf:listStyle><sf:null/></sf:listStyle><sf:outlineLevel/><sf:firstTopicNumber/><sf:underline/><sf:defaultTabStops><sf:number sfa:number="28.34646" sfa:type="f"/></sf:defaultTabStops><sf:dropCap/><sf:underlineWidth/><sf:fontName/><sf:strikethru/><sf:baselineShift/><sf:lineSpacing/><sf:textShadow/><sf:underlineColor><sf:null/></sf:underlineColor><sf:kerning/><sf:strikethruWidth/><sf:fontColor><sf:color xsi:type="sfa:calibrated-rgb-color-type" sfa:r="0" sfa:g="0" sfa:b="0" sfa:a="1"/></sf:fontColor><sf:textBackground><sf:null/></sf:textBackground><sf:paragraphRuleWidth/><sf:paragraphStroke><sf:null/></sf:paragraphStroke><sf:bold><sf:number sfa:number="1" sfa:type="c"/></sf:bold><sf:tracking/><sf:ligatures/><sf:language><sf:null/></sf:language><sf:followingParagraphStyle><sf:null/></sf:followingParagraphStyle><sf:outline/><sf:strikethruColor><sf:null/></sf:strikethruColor><sf:italic><sf:number sfa:number="1" sfa:type="c"/></sf:italic><sf:SLTOCEntryStyle><sf:null/></sf:SLTOCEntryStyle><sf:word_underline/><sf:widowControl/><sf:rightIndent/><sf:atsuFontFeatures/><sf:tabs><sf:tabs sfa:ID="SFWPTabs-0"><sf:tabstop sf:pos="481.61416625976562" sf:align="right"/></sf:tabs></sf:tabs><sf:superscript/><sf:paragraphBorderType/><sf:hyphenate/><sf:hidden/><sf:pageBreakBefore/><sf:SLTOCEnabledStyles><sf:null/></sf:SLTOCEnabledStyles><sf:SLTOCDisabledStyles><sf:null/></sf:SLTOCDisabledStyles><sf:paragraphFill><sf:null/></sf:paragraphFill><sf:SLTOCShowPageNumber/><sf:keepWithNext/><sf:spaceBefore><sf:number sfa:number="12" sfa:type="f"/></sf:spaceBefore><sf:outlineColor><sf:null/></sf:outlineColor><sf:paragraphRuleOffset/><sf:capitalization/><sf:leftIndent><sf:number sfa:number="28.34646" sfa:type="f"/></sf:leftIndent><sf:firstLineIndent><sf:number sfa:number="28.34646" sfa:type="f"/></sf:firstLineIndent></sf:property-map></sf:tocstyle></sf:tocStyle><sf:dropCap/><sf:firstTopicNumber/><sf:fontName><sf:string sfa:string="Helvetica-Bold"/></sf:fontName><sf:strikethru/><sf:baselineShift/><sf:lineSpacing/><sf:textShadow/><sf:underlineColor><sf:null/></sf:underlineColor><sf:showInTOC><sf:number sfa:number="1" sfa:type="c"/></sf:showInTOC><sf:kerning/><sf:strikethruWidth/><sf:fontColor/><sf:textBackground><sf:null/></sf:textBackground><sf:paragraphRuleWidth/><sf:paragraphStroke><sf:null/></sf:paragraphStroke><sf:bold><sf:number sfa:number="1" sfa:type="c"/></sf:bold><sf:tracking/><sf:ligatures/><sf:language><sf:null/></sf:language><sf:followingParagraphStyle><sf:paragraphstyle sfa:ID="SFWPParagraphStyle-1" sf:name="Body" sf:ident="paragraph-style-32"><sf:property-map><sf:fontSize/><sf:word_strikethrough/><sf:spaceAfter><sf:number sfa:number="12" sfa:type="f"/></sf:spaceAfter><sf:alignment/><sf:keepLinesTogether/><sf:listStyle><sf:liststyle-ref sfa:IDREF="SFWPListStyle-0"/></sf:listStyle><sf:outlineLevel/><sf:underline/><sf:underlineWidth/><sf:defaultTabStops><sf:number sfa:number="28.34646" sfa:type="f"/></sf:defaultTabStops><sf:firstTopicNumber/><sf:dropCap/><sf:fontName/><sf:strikethru/><sf:baselineShift/><sf:lineSpacing/><sf:textShadow/><sf:underlineColor><sf:null/></sf:underlineColor><sf:kerning/><sf:strikethruWidth/><sf:fontColor/><sf:textBackground><sf:null/></sf:textBackground><sf:paragraphRuleWidth/><sf:paragraphStroke><sf:null/></sf:paragraphStroke><sf:bold/><sf:tracking/><sf:ligatures/><sf:language><sf:null/></sf:language><sf:followingParagraphStyle><sf:null/></sf:followingParagraphStyle><sf:outline/><sf:strikethruColor><sf:null/></sf:strikethruColor><sf:italic/><sf:word_underline/><sf:widowControl/><sf:rightIndent/><sf:atsuFontFeatures/><sf:tabs/><sf:superscript/><sf:paragraphBorderType/><sf:hyphenate/><sf:hidden/><sf:pageBreakBefore/><sf:paragraphFill><sf:null/></sf:paragraphFill><sf:spaceBefore/><sf:keepWithNext/><sf:outlineColor><sf:null/></sf:outlineColor><sf:paragraphRuleOffset/><sf:capitalization/><sf:leftIndent/><sf:firstLineIndent/></sf:property-map></sf:paragraphstyle></sf:followingParagraphStyle><sf:outline/><sf:strikethruColor><sf:null/></sf:strikethruColor><sf:italic/><sf:word_underline/><sf:widowControl/><sf:rightIndent/><sf:atsuFontFeatures/><sf:tabs/><sf:superscript/><sf:paragraphBorderType/><sf:hyphenate/><sf:hidden/><sf:pageBreakBefore/><sf:paragraphFill><sf:null/></sf:paragraphFill><sf:spaceBefore><sf:number sfa:number="6" sfa:type="f"/></sf:spaceBefore><sf:keepWithNext><sf:number sfa:number="1" sfa:type="c"/></sf:keepWithNext><sf:outlineColor><sf:null/></sf:outlineColor><sf:paragraphRuleOffset/><sf:capitalization/><sf:leftIndent/><sf:firstLineIndent/></sf:property-map></sf:paragraphstyle><sf:graphic-style sfa:ID="SFDGraphicStyle-0" sf:name="graphic-line-style-default" sf:ident="graphic-line-style-default"><sf:property-map><sf:opacity><sf:number sfa:number="1" sfa:type="f"/></sf:opacity><sf:reflection><sf:null/></sf:reflection><sf:externalTextWrap><sf:external-text-wrap sfa:ID="SFWPExternalTextWrap-0" sf:wrap-style="tight" sf:floating-wrap-enabled="true" sf:direction="both" sf:attachment-wrap-type="aligned" sf:floating-wrap-type="directional" sf:margin="12" sf:alpha-threshold="0.5"/></sf:externalTextWrap><sf:stroke><sf:stroke sfa:ID="SFRStroke-0" sf:miter-limit="4" sf:width="2" sf:cap="butt" sf:join="miter"><sf:color xsi:type="sfa:calibrated-white-color-type" sfa:w="0" sfa:a="1"/><sf:pattern sfa:ID="SFRStrokePattern-0" sf:phase="0" sf:type="solid"><sf:pattern/></sf:pattern></sf:stroke></sf:stroke><sf:layoutStyle><sf:null/></sf:layoutStyle><sf:fill><sf:null/></sf:fill><sf:shadow><sf:shadow sfa:ID="SFRShadow-0" sf:is-null="true"/></sf:shadow></sf:property-map></sf:graphic-style><sf:sectionstyle sfa:ID="SFWPSectionStyle-0" sf:name="[Null]" sf:ident="section-style-null"><sf:property-map/></sf:sectionstyle><sf:paragraphstyle sfa:ID="SFWPParagraphStyle-2" sf:name="Heading" sf:ident="paragraph-style-35"><sf:property-map><sf:fontSize><sf:number sfa:number="18" sfa:type="f"/></sf:fontSize><sf:word_strikethrough/><sf:spaceAfter/><sf:alignment/><sf:keepLinesTogether/><sf:listStyle><sf:liststyle-ref sfa:IDREF="SFWPListStyle-0"/></sf:listStyle><sf:outlineLevel/><sf:underline/><sf:underlineWidth/><sf:defaultTabStops><sf:number sfa:number="28.34646" sfa:type="f"/></sf:defaultTabStops><sf:tocStyle><sf:tocstyle sfa:ID="SLTOCParagraphStyle-1" sfa:sfclass="paragraphstyle" sf:name="TOC Heading 2" sf:ident="toc-paragraph-style-2"><sf:property-map><sf:fontSize><sf:number sfa:number="14" sfa:type="f"/></sf:fontSize><sf:word_strikethrough/><sf:spaceAfter><sf:number sfa:number="3" sfa:type="f"/></sf:spaceAfter><sf:SLTOCPageNumberStyle><sf:null/></sf:SLTOCPageNumberStyle><sf:alignment/><sf:keepLinesTogether/><sf:listStyle><sf:null/></sf:listStyle><sf:outlineLevel/><sf:firstTopicNumber/><sf:underline/><sf:defaultTabStops><sf:number sfa:number="28.34646" sfa:type="f"/></sf:defaultTabStops><sf:dropCap/><sf:underlineWidth/><sf:fontName/><sf:strikethru/><sf:baselineShift/><sf:lineSpacing/><sf:textShadow/><sf:underlineColor><sf:null/></sf:underlineColor><sf:kerning/><sf:strikethruWidth/><sf:fontColor><sf:color xsi:type="sfa:calibrated-rgb-color-type" sfa:r="0" sfa:g="0" sfa:b="0" sfa:a="1"/></sf:fontColor><sf:textBackground><sf:null/></sf:textBackground><sf:paragraphRuleWidth/><sf:paragraphStroke><sf:null/></sf:paragraphStroke><sf:bold><sf:number sfa:number="1" sfa:type="c"/></sf:bold><sf:tracking/><sf:ligatures/><sf:language><sf:null/></sf:language><sf:followingParagraphStyle><sf:null/></sf:followingParagraphStyle><sf:outline/><sf:strikethruColor><sf:null/></sf:strikethruColor><sf:italic/><sf:SLTOCEntryStyle><sf:null/></sf:SLTOCEntryStyle><sf:word_underline/><sf:widowControl/><sf:rightIndent/><sf:atsuFontFeatures/><sf:tabs><sf:tabs sfa:ID="SFWPTabs-1"><sf:tabstop sf:pos="481.61416625976562" sf:align="right"/></sf:tabs></sf:tabs><sf:superscript/><sf:paragraphBorderType/><sf:hyphenate/><sf:hidden/><sf:pageBreakBefore/><sf:SLTOCEnabledStyles><sf:null/></sf:SLTOCEnabledStyles><sf:SLTOCDisabledStyles><sf:null/></sf:SLTOCDisabledStyles><sf:paragraphFill><sf:null/></sf:paragraphFill><sf:SLTOCShowPageNumber/><sf:keepWithNext/><sf:spaceBefore><sf:number sfa:number="12" sfa:type="f"/></sf:spaceBefore><sf:outlineColor><sf:null/></sf:outlineColor><sf:paragraphRuleOffset/><sf:capitalization/><sf:leftIndent><sf:number sfa:number="14.17323" sfa:type="f"/></sf:leftIndent><sf:firstLineIndent><sf:number sfa:number="14.17323" sfa:type="f"/></sf:firstLineIndent></sf:property-map></sf:tocstyle></sf:tocStyle><sf:dropCap/><sf:firstTopicNumber/><sf:fontName><sf:string sfa:string="Helvetica-Bold"/></sf:fontName><sf:strikethru/><sf:baselineShift/><sf:lineSpacing/><sf:textShadow/><sf:underlineColor><sf:null/></sf:underlineColor><sf:showInTOC><sf:number sfa:number="1" sfa:type="c"/></sf:showInTOC><sf:kerning/><sf:strikethruWidth/><sf:fontColor/><sf:textBackground><sf:null/></sf:textBackground><sf:paragraphRuleWidth/><sf:paragraphStroke><sf:null/></sf:paragraphStroke><sf:bold><sf:number sfa:number="1" sfa:type="c"/></sf:bold><sf:tracking/><sf:ligatures/><sf:language><sf:null/></sf:language><sf:followingParagraphStyle><sf:paragraphstyle-ref sfa:IDREF="SFWPParagraphStyle-1"/></sf:followingParagraphStyle><sf:outline/><sf:strikethruColor><sf:null/></sf:strikethruColor><sf:italic/><sf:word_underline/><sf:widowControl/><sf:rightIndent/><sf:atsuFontFeatures/><sf:tabs/><sf:superscript/><sf:paragraphBorderType/><sf:hyphenate/><sf:hidden/><sf:pageBreakBefore/><sf:paragraphFill><sf:null/></sf:paragraphFill><sf:spaceBefore><sf:number sfa:number="12" sfa:type="f"/></sf:spaceBefore><sf:keepWithNext><sf:number sfa:number="1" sfa:type="c"/></sf:keepWithNext><sf:outlineColor><sf:null/></sf:outlineColor><sf:paragraphRuleOffset/><sf:capitalization/><sf:leftIndent/><sf:firstLineIndent/></sf:property-map></sf:paragraphstyle><sf:sectionstyle sfa:ID="SFWPSectionStyle-1" sf:name="Normal" sf:ident="section-style-default"><sf:property-map><sf:sectionLayoutStyle><sf:null/></sf:sectionLayoutStyle><sf:inheritPreviousHF><sf:number sfa:number="1" sfa:type="c"/></sf:inheritPreviousHF><sf:sectionPageNumberStart><sf:number sfa:number="1" sfa:type="i"/></sf:sectionPageNumberStart><sf:pageMasterFirstPageDifferent><sf:number sfa:number="0" sfa:type="c"/></sf:pageMasterFirstPageDifferent><sf:firstPageMaster><sf:pagemaster sfa:ID="SFWPPageMaster-0" sl:header="SFWPDefaultFirstHeaderIdentifier" sl:footer="SFWPDefaultFirstFooterIdentifier"/></sf:firstPageMaster><sf:evenPageMaster><sf:pagemaster sfa:ID="SFWPPageMaster-1" sl:header="SFWPDefaultEvenHeaderIdentifier" sl:footer="SFWPDefaultEvenFooterIdentifier"/></sf:evenPageMaster><sf:startKind><sf:number sfa:number="0" sfa:type="i"/></sf:startKind><sf:pageMasterLeftRightPagesDifferent><sf:number sfa:number="0" sfa:type="c"/></sf:pageMasterLeftRightPagesDifferent><sf:sectionPageNumberKind><sf:number sfa:number="0" sfa:type="i"/></sf:sectionPageNumberKind><sf:oddPageMaster><sf:pagemaster sfa:ID="SFWPPageMaster-2" sl:header="SFWPDefaultOddHeaderIdentifier" sl:footer="SFWPDefaultOddFooterIdentifier"/></sf:oddPageMaster></sf:property-map></sf:sectionstyle><sf:tocstyle sfa:ID="SLTOCParagraphStyle-2" sfa:sfclass="paragraphstyle" sf:name="TOC" sf:ident="toc-paragraph-style-default"><sf:property-map><sf:fontSize><sf:number sfa:number="18" sfa:type="f"/></sf:fontSize><sf:word_strikethrough/><sf:spaceAfter/><sf:SLTOCPageNumberStyle><sf:null/></sf:SLTOCPageNumberStyle><sf:alignment/><sf:keepLinesTogether/><sf:listStyle><sf:null/></sf:listStyle><sf:outlineLevel/><sf:firstTopicNumber/><sf:underline/><sf:defaultTabStops><sf:number sfa:number="28.34646" sfa:type="f"/></sf:defaultTabStops><sf:dropCap/><sf:underlineWidth/><sf:fontName><sf:string sfa:string="Helvetica-Bold"/></sf:fontName><sf:strikethru/><sf:baselineShift/><sf:lineSpacing/><sf:textShadow/><sf:underlineColor><sf:null/></sf:underlineColor><sf:kerning/><sf:strikethruWidth/><sf:fontColor/><sf:textBackground><sf:null/></sf:textBackground><sf:paragraphRuleWidth/><sf:paragraphStroke><sf:null/></sf:paragraphStroke><sf:bold><sf:number sfa:number="1" sfa:type="c"/></sf:bold><sf:tracking/><sf:ligatures/><sf:language><sf:null/></sf:language><sf:followingParagraphStyle><sf:null/></sf:followingParagraphStyle><sf:outline/><sf:strikethruColor><sf:null/></sf:strikethruColor><sf:italic/><sf:SLTOCEntryStyle><sf:null/></sf:SLTOCEntryStyle><sf:word_underline/><sf:widowControl/><sf:rightIndent/><sf:atsuFontFeatures/><sf:tabs><sf:tabs sfa:ID="SFWPTabs-2"><sf:tabstop sf:pos="481.61416625976562" sf:align="right"/></sf:tabs></sf:tabs><sf:superscript/><sf:paragraphBorderType/><sf:hyphenate/><sf:hidden/><sf:pageBreakBefore/><sf:SLTOCEnabledStyles><sf:null/></sf:SLTOCEnabledStyles><sf:SLTOCDisabledStyles><sf:null/></sf:SLTOCDisabledStyles><sf:paragraphFill><sf:null/></sf:paragraphFill><sf:SLTOCShowPageNumber/><sf:keepWithNext/><sf:spaceBefore/><sf:outlineColor><sf:null/></sf:outlineColor><sf:paragraphRuleOffset/><sf:capitalization/><sf:leftIndent/><sf:firstLineIndent/></sf:property-map></sf:tocstyle><sf:paragraphstyle sfa:ID="SFWPParagraphStyle-3" sf:name="Free Form" sf:ident="paragraph-style-default"><sf:property-map><sf:fontSize/><sf:word_strikethrough/><sf:spaceAfter/><sf:alignment/><sf:keepLinesTogether/><sf:listStyle><sf:null/></sf:listStyle><sf:outlineLevel/><sf:underline/><sf:underlineWidth/><sf:defaultTabStops/><sf:tocStyle><sf:null/></sf:tocStyle><sf:dropCap/><sf:firstTopicNumber/><sf:fontName/><sf:strikethru/><sf:baselineShift/><sf:lineSpacing/><sf:textShadow/><sf:underlineColor><sf:null/></sf:underlineColor><sf:showInTOC/><sf:kerning/><sf:strikethruWidth/><sf:fontColor/><sf:textBackground><sf:null/></sf:textBackground><sf:paragraphRuleWidth/><sf:paragraphStroke><sf:null/></sf:paragraphStroke><sf:bold/><sf:tracking/><sf:ligatures/><sf:language><sf:null/></sf:language><sf:followingParagraphStyle><sf:null/></sf:followingParagraphStyle><sf:outline/><sf:strikethruColor><sf:null/></sf:strikethruColor><sf:italic/><sf:word_underline/><sf:decimalTab/><sf:widowControl/><sf:rightIndent/><sf:atsuFontFeatures/><sf:tabs/><sf:superscript/><sf:paragraphBorderType/><sf:hyphenate/><sf:hidden/><sf:pageBreakBefore/><sf:paragraphFill><sf:null/></sf:paragraphFill><sf:spaceBefore/><sf:keepWithNext/><sf:outlineColor><sf:null/></sf:outlineColor><sf:paragraphRuleOffset/><sf:capitalization/><sf:leftIndent/><sf:firstLineIndent/></sf:property-map></sf:paragraphstyle><sf:graphic-style sfa:ID="SFDGraphicStyle-1" sf:name="graphic-textbox-style-default" sf:ident="graphic-textbox-style-default"><sf:property-map><sf:opacity><sf:number sfa:number="1" sfa:type="f"/></sf:opacity><sf:reflection><sf:null/></sf:reflection><sf:externalTextWrap><sf:external-text-wrap sfa:ID="SFWPExternalTextWrap-1" sf:wrap-style="tight" sf:floating-wrap-enabled="true" sf:direction="both" sf:attachment-wrap-type="aligned" sf:floating-wrap-type="directional" sf:margin="12" sf:alpha-threshold="0.5"/></sf:externalTextWrap><sf:stroke><sf:stroke sfa:ID="SFRStroke-1" sf:miter-limit="4" sf:width="1" sf:cap="butt" sf:join="miter"><sf:color xsi:type="sfa:calibrated-white-color-type" sfa:w="0" sfa:a="1"/><sf:pattern sfa:ID="SFRStrokePattern-1" sf:phase="0" sf:type="empty"><sf:pattern/></sf:pattern></sf:stroke></sf:stroke><sf:layoutStyle><sf:null/></sf:layoutStyle><sf:fill><sf:null/></sf:fill><sf:shadow><sf:shadow-ref sfa:IDREF="SFRShadow-0"/></sf:shadow></sf:property-map></sf:graphic-style><sf:liststyle-ref sfa:IDREF="SFWPListStyle-0"/><sf:paragraphstyle-ref sfa:IDREF="SFWPParagraphStyle-1"/><sf:tocstyle-ref sfa:IDREF="SLTOCParagraphStyle-1"/><sf:paragraphstyle sfa:ID="SFWPParagraphStyle-4" sf:name="Title" sf:ident="paragraph-style-38"><sf:property-map><sf:fontSize><sf:number sfa:number="28" sfa:type="f"/></sf:fontSize><sf:word_strikethrough/><sf:spaceAfter/><sf:alignment/><sf:keepLinesTogether/><sf:listStyle><sf:liststyle-ref sfa:IDREF="SFWPListStyle-0"/></sf:listStyle><sf:outlineLevel/><sf:underline/><sf:underlineWidth/><sf:defaultTabStops><sf:number sfa:number="28.34646" sfa:type="f"/></sf:defaultTabStops><sf:tocStyle><sf:tocstyle-ref sfa:IDREF="SLTOCParagraphStyle-2"/></sf:tocStyle><sf:dropCap/><sf:firstTopicNumber/><sf:fontName><sf:string sfa:string="Helvetica-Bold"/></sf:fontName><sf:strikethru/><sf:baselineShift/><sf:lineSpacing/><sf:textShadow/><sf:underlineColor><sf:null/></sf:underlineColor><sf:showInTOC><sf:number sfa:number="1" sfa:type="c"/></sf:showInTOC><sf:kerning/><sf:strikethruWidth/><sf:fontColor/><sf:textBackground><sf:null/></sf:textBackground><sf:paragraphRuleWidth/><sf:paragraphStroke><sf:null/></sf:paragraphStroke><sf:bold><sf:number sfa:number="1" sfa:type="c"/></sf:bold><sf:tracking/><sf:ligatures/><sf:language><sf:null/></sf:language><sf:followingParagraphStyle><sf:paragraphstyle-ref sfa:IDREF="SFWPParagraphStyle-1"/></sf:followingParagraphStyle><sf:outline/><sf:strikethruColor><sf:null/></sf:strikethruColor><sf:italic/><sf:word_underline/><sf:widowControl/><sf:rightIndent/><sf:atsuFontFeatures/><sf:tabs/><sf:superscript/><sf:paragraphBorderType/><sf:hyphenate/><sf:hidden/><sf:pageBreakBefore/><sf:paragraphFill><sf:null/></sf:paragraphFill><sf:spaceBefore><sf:number sfa:number="24" sfa:type="f"/></sf:spaceBefore><sf:keepWithNext><sf:number sfa:number="1" sfa:type="c"/></sf:keepWithNext><sf:outlineColor><sf:null/></sf:outlineColor><sf:paragraphRuleOffset/><sf:capitalization/><sf:leftIndent/><sf:firstLineIndent/></sf:property-map></sf:paragraphstyle><sf:paragraphstyle sfa:ID="SFWPParagraphStyle-5" sf:ident="kSFTErrorWarningParagraphStyleID" sf:parent-ident="paragraph-style-default"><sf:property-map><sf:fontColor/><sf:alignment/><sf:listStyle><sf:liststyle sfa:ID="SFWPListStyle-1" sf:ident="kSFTErrorWarningListStyleID" sf:parent-ident="list-style-default"><sf:property-map/></sf:liststyle></sf:listStyle><sf:keepLinesTogether><sf:number sfa:number="1" sfa:type="c"/></sf:keepLinesTogether><sf:fontName><sf:string sfa:string="LucidaGrande"/></sf:fontName><sf:fontSize><sf:number sfa:number="11" sfa:type="f"/></sf:fontSize></sf:property-map></sf:paragraphstyle><sf:liststyle-ref sfa:IDREF="SFWPListStyle-1"/><sf:sectionstyle sfa:ID="SFWPSectionStyle-2" sf:name="Normal 4" sf:ident="section-style-8"><sf:property-map><sf:sectionLayoutStyle><sf:null/></sf:sectionLayoutStyle><sf:inheritPreviousHF><sf:number sfa:number="1" sfa:type="c"/></sf:inheritPreviousHF><sf:sectionPageNumberStart><sf:number sfa:number="1" sfa:type="i"/></sf:sectionPageNumberStart><sf:pageMasterFirstPageDifferent><sf:number sfa:number="0" sfa:type="c"/></sf:pageMasterFirstPageDifferent><sf:firstPageMaster><sf:pagemaster sfa:ID="SFWPPageMaster-3" sl:header="" sl:footer=""/></sf:firstPageMaster><sf:evenPageMaster><sf:pagemaster sfa:ID="SFWPPageMaster-4" sl:header="" sl:footer=""/></sf:evenPageMaster><sf:startKind><sf:number sfa:number="0" sfa:type="i"/></sf:startKind><sf:pageMasterLeftRightPagesDifferent><sf:number sfa:number="0" sfa:type="c"/></sf:pageMasterLeftRightPagesDifferent><sf:sectionPageNumberKind><sf:number sfa:number="0" sfa:type="i"/></sf:sectionPageNumberKind><sf:oddPageMaster><sf:pagemaster sfa:ID="SFWPPageMaster-5" sl:header="" sl:footer=""/></sf:oddPageMaster></sf:property-map></sf:sectionstyle><sf:graphic-style sfa:ID="SFDGraphicStyle-2" sf:name="graphic-shape-style-default" sf:ident="graphic-shape-style-default"><sf:property-map><sf:opacity><sf:number sfa:number="1" sfa:type="f"/></sf:opacity><sf:reflection><sf:null/></sf:reflection><sf:externalTextWrap><sf:external-text-wrap sfa:ID="SFWPExternalTextWrap-2" sf:wrap-style="tight" sf:floating-wrap-enabled="true" sf:direction="both" sf:attachment-wrap-type="aligned" sf:floating-wrap-type="directional" sf:margin="12" sf:alpha-threshold="0.5"/></sf:externalTextWrap><sf:stroke><sf:stroke sfa:ID="SFRStroke-2" sf:miter-limit="4" sf:width="1" sf:cap="butt" sf:join="miter"><sf:color xsi:type="sfa:calibrated-white-color-type" sfa:w="0" sfa:a="1"/><sf:pattern sfa:ID="SFRStrokePattern-2" sf:phase="0" sf:type="solid"><sf:pattern/></sf:pattern></sf:stroke></sf:stroke><sf:layoutStyle><sf:null/></sf:layoutStyle><sf:fill><sf:color xsi:type="sfa:calibrated-rgb-color-type" sfa:r="0.41568627953529358" sfa:g="0.66274511814117432" sfa:b="0.39215686917304993" sfa:a="1"/></sf:fill><sf:shadow><sf:shadow-ref sfa:IDREF="SFRShadow-0"/></sf:shadow></sf:property-map></sf:graphic-style><sf:layoutstyle sfa:ID="SFWPLayoutStyle-0" sf:name="Normal" sf:ident="layout-style-default"><sf:property-map><sf:verticalAlignment/><sf:layoutParagraphStyle><sf:null/></sf:layoutParagraphStyle><sf:columns/><sf:padding/><sf:layoutMargins/><sf:followingLayoutStyle><sf:null/></sf:followingLayoutStyle><sf:layoutContinuous/></sf:property-map></sf:layoutstyle><sf:layoutstyle sfa:ID="SFWPLayoutStyle-1" sf:ident="kSFTErrorWarningLayoutStyleID" sf:parent-ident="layout-style-default"><sf:property-map><sf:verticalAlignment><sf:null/></sf:verticalAlignment><sf:padding/><sf:layoutParagraphStyle><sf:paragraphstyle-ref sfa:IDREF="SFWPParagraphStyle-5"/></sf:layoutParagraphStyle></sf:property-map></sf:layoutstyle><sf:layoutstyle sfa:ID="SFWPLayoutStyle-2" sf:ident="graphic-shape-layout-style-default"><sf:property-map><sf:verticalAlignment/><sf:layoutParagraphStyle><sf:null/></sf:layoutParagraphStyle><sf:columns/><sf:padding><sf:padding sfa:ID="SFWPPadding-0" sf:top="4" sf:left="4" sf:bottom="4" sf:right="4"/></sf:padding><sf:layoutMargins/><sf:followingLayoutStyle><sf:null/></sf:followingLayoutStyle><sf:layoutContinuous/></sf:property-map></sf:layoutstyle><sf:layoutstyle sfa:ID="SFWPLayoutStyle-3" sf:ident="graphic-textbox-layout-style-default"><sf:property-map><sf:verticalAlignment/><sf:layoutParagraphStyle><sf:null/></sf:layoutParagraphStyle><sf:columns/><sf:padding><sf:padding sfa:ID="SFWPPadding-1" sf:top="4" sf:left="4" sf:bottom="4" sf:right="4"/></sf:padding><sf:layoutMargins/><sf:followingLayoutStyle><sf:null/></sf:followingLayoutStyle><sf:layoutContinuous/></sf:property-map></sf:layoutstyle><sf:graphic-style sfa:ID="SFDGraphicStyle-3" sf:name="graphic-image-style-default" sf:ident="graphic-image-style-default"><sf:property-map><sf:opacity><sf:number sfa:number="1" sfa:type="f"/></sf:opacity><sf:reflection><sf:null/></sf:reflection><sf:externalTextWrap><sf:external-text-wrap sfa:ID="SFWPExternalTextWrap-3" sf:wrap-style="tight" sf:floating-wrap-enabled="true" sf:direction="both" sf:attachment-wrap-type="aligned" sf:floating-wrap-type="directional" sf:margin="12" sf:alpha-threshold="0.5"/></sf:externalTextWrap><sf:stroke><sf:stroke sfa:ID="SFRStroke-3" sf:miter-limit="4" sf:width="1" sf:cap="butt" sf:join="miter"><sf:color xsi:type="sfa:calibrated-white-color-type" sfa:w="0" sfa:a="1"/><sf:pattern sfa:ID="SFRStrokePattern-3" sf:phase="0" sf:type="empty"><sf:pattern/></sf:pattern></sf:stroke></sf:stroke><sf:layoutStyle><sf:null/></sf:layoutStyle><sf:fill><sf:null/></sf:fill><sf:shadow><sf:shadow-ref sfa:IDREF="SFRShadow-0"/></sf:shadow></sf:property-map></sf:graphic-style><sf:characterstyle sfa:ID="SFWPCharacterStyle-0" sf:name="None" sf:ident="character-style-null"><sf:property-map/></sf:characterstyle><sf:graphic-style sfa:ID="SFDGraphicStyle-4" sf:ident="kSFTErrorWarningBubbleStyleID"><sf:property-map><sf:stroke><sf:stroke sfa:ID="SFRStroke-4" sf:miter-limit="4" sf:width="1" sf:cap="butt" sf:join="miter"><sf:color xsi:type="sfa:calibrated-rgb-color-type" sfa:r="0.75290000438690186" sfa:g="0.75290000438690186" sfa:b="0.75290000438690186" sfa:a="1"/><sf:pattern sfa:ID="SFRStrokePattern-4" sf:phase="0" sf:type="solid"><sf:pattern/></sf:pattern></sf:stroke></sf:stroke><sf:opacity><sf:number sfa:number="1" sfa:type="f"/></sf:opacity><sf:layoutStyle><sf:layoutstyle-ref sfa:IDREF="SFWPLayoutStyle-1"/></sf:layoutStyle><sf:fill><sf:angle-gradient sfa:ID="SFRAngleGradient-0" sf:opacity="1" sf:type="linear" sf:angle="-1.5707963705062866"><sf:stops sfa:ID="NSMutableArray-0"><sf:gradient-stop sfa:ID="SFRGradientStop-0" sf:fraction="0"><sf:color xsi:type="sfa:calibrated-rgb-color-type" sfa:r="0.96859997510910034" sfa:g="0.96859997510910034" sfa:b="0.96859997510910034" sfa:a="0.95999997854232788"/></sf:gradient-stop><sf:gradient-stop sfa:ID="SFRGradientStop-1" sf:fraction="1"><sf:color xsi:type="sfa:calibrated-rgb-color-type" sfa:r="0.81959998607635498" sfa:g="0.81959998607635498" sfa:b="0.81959998607635498" sfa:a="0.95999997854232788"/></sf:gradient-stop></sf:stops></sf:angle-gradient></sf:fill><sf:reflection><sf:null/></sf:reflection><sf:shadow><sf:shadow sfa:ID="SFRShadow-1" sf:angle="90" sf:offset="2" sf:radius="2" sf:opacity="0.30000001192092896"><sf:color xsi:type="sfa:calibrated-white-color-type" sfa:w="0" sfa:a="1"/></sf:shadow></sf:shadow></sf:property-map></sf:graphic-style><sf:layoutstyle sfa:ID="SFWPLayoutStyle-4" sf:name="Normal 22" sf:ident="layout-style-20"><sf:property-map><sf:verticalAlignment/><sf:layoutParagraphStyle><sf:null/></sf:layoutParagraphStyle><sf:columns/><sf:padding/><sf:layoutMargins/><sf:followingLayoutStyle><sf:null/></sf:followingLayoutStyle><sf:layoutContinuous/></sf:property-map></sf:layoutstyle><sf:graphic-style sfa:ID="SFDGraphicStyle-5" sf:name="graphic-movie-style-default" sf:ident="graphic-movie-style-default"><sf:property-map><sf:opacity><sf:number sfa:number="1" sfa:type="f"/></sf:opacity><sf:reflection><sf:null/></sf:reflection><sf:externalTextWrap><sf:external-text-wrap sfa:ID="SFWPExternalTextWrap-4" sf:wrap-style="tight" sf:floating-wrap-enabled="true" sf:direction="both" sf:attachment-wrap-type="aligned" sf:floating-wrap-type="directional" sf:margin="12" sf:alpha-threshold="0.5"/></sf:externalTextWrap><sf:stroke><sf:stroke sfa:ID="SFRStroke-5" sf:miter-limit="4" sf:width="1" sf:cap="butt" sf:join="miter"><sf:color xsi:type="sfa:calibrated-white-color-type" sfa:w="0" sfa:a="1"/><sf:pattern sfa:ID="SFRStrokePattern-5" sf:phase="0" sf:type="empty"><sf:pattern/></sf:pattern></sf:stroke></sf:stroke><sf:layoutStyle><sf:null/></sf:layoutStyle><sf:fill><sf:null/></sf:fill><sf:shadow><sf:shadow-ref sfa:IDREF="SFRShadow-0"/></sf:shadow></sf:property-map></sf:graphic-style><sf:tocstyle-ref sfa:IDREF="SLTOCParagraphStyle-0"/></sf:styles><sf:anon-styles/></sf:stylesheet><sf:headers/><sf:footers/><sf:text-storage sf:kind="body" sfa:ID="SFWPStorage-0"><sf:stylesheet-ref sfa:IDREF="SFSStylesheet-0"/><sf:text-body><sf:section sf:name="Chapter 3" sf:style="section-style-8"><sf:layout sf:style="layout-style-20"><sf:p sf:style="paragraph-style-38"><sf:ghost-text>Lorem ipsum dolor sit amet</sf:ghost-text><sf:br/></sf:p><sf:p sf:style="paragraph-style-35"><sf:ghost-text>Consectetur adipiscing elit</sf:ghost-text><sf:br/></sf:p><sf:p sf:style="paragraph-style-32"><sf:ghost-text>Eset eiusmod tempor incidunt et labore et dolore magna aliquam. Ut enim ad minim veniam, quis nostrud exerc. Irure dolor in reprehend incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse molestaie cillum. Tia non ob ea soluad incommod quae egen ium improb fugiend. Officia deserunt mollit anim id est laborum Et harumd dereud facilis est er expedit distinct. Nam liber te conscient to factor tum poen legum odioque civiuda et tam. Neque pecun modut est neque nonor et imper ned libidig met, consectetur adipiscing elit, sed ut labore et dolore magna aliquam is nostrud exercitation ullam mmodo consequet.</sf:ghost-text><sf:br/></sf:p><sf:p sf:style="paragraph-style-33"><sf:ghost-text>Duis aute in voluptate velit esse</sf:ghost-text><sf:br/></sf:p><sf:p sf:style="paragraph-style-32"><sf:ghost-text>Cillum dolore eu fugiat nulla pariatur. At vver eos et accusam dignissum qui blandit est praesent. Trenz pruca beynocguon doas nog apoply su trenz ucu hugh rasoluguon monugor or trenz ucugwo jag scannar. Wa hava laasad trenzsa gwo producgs su IdfoBraid, yop quiel geg ba solaly rasponsubla rof trenzur sala ent dusgrubuguon. Offoctivo immoriatoly, hawrgasi pwicos asi sirucor. Thas sirutciun applios tyu thuso itoms ghuso pwicos gosi sirucor in mixent gosi sirucor ic mixent ples cak ontisi sowios uf Zerm hawr rwivos. Unte af phen neige pheings atoot Prexs eis phat eit sakem eit vory gast te Plok peish ba useing phen roxas. Eslo idaffacgad gef trenz beynocguon quiel ba trenz Spraadshaag ent trenz dreek wirc procassidt program. Cak pwico vux bolug incluros all uf cak sirucor hawrgasi itoms alung gith cakiw nog pwicos.</sf:ghost-text><sf:br/></sf:p><sf:p sf:style="paragraph-style-33"><sf:ghost-text>Plloaso mako nuto uf cakso dodtos</sf:ghost-text><sf:br/></sf:p><sf:p sf:style="paragraph-style-32"><sf:ghost-text>Koop a cupy uf cak vux noaw yerw phuno. Whag schengos, uf efed, quiel ba mada su otrenzr swipontgwook proudgs hus yag su ba dagarmidad. Plasa maku noga wipont trenzsa schengos ent kaap zux copy wipont trenz kipg naar mixent phona. Cak pwico siructiun ruos nust apoply tyu cak UCU sisulutiun munityuw uw cak UCU-TGU jot scannow. Trens roxas eis ti Plokeing quert loppe eis yop prexs. Piy opher hawers, eit yaggles orn ti sumbloat alohe plok. Su havo loasor cakso tgu pwuructs tyu InfuBwain, ghu gill nug bo suloly sispunsiblo fuw cakiw salo anr ristwibutiun. Hei muk neme eis loppe. Treas em wankeing ont sime ploked peish rof phen sumbloat syug si phat phey gavet peish ta paat ein pheeir sumbloats. Aslu unaffoctor gef cak siructiun gill bo cak spiarshoot anet cak GurGanglo gur pwucossing pwutwam. Ghat dodtos, ig pany, gill bo maro tyu ucakw suftgasi pwuructs hod yot tyubo rotowminor. Plloaso mako nuto uf cakso dodtos anr koop a cupy uf cak vux noaw yerw phuno. Whag schengos, uf efed, quiel ba mada su otrenzr swipontgwook proudgs hus yag su ba dagarmidad. Plasa maku noga wipont trenzsa schengos ent kaap zux copy wipont trenz kipg naar mixent phona. Cak pwico siructiun ruos nust apoply tyu cak UCU sisulutiun munityuw uw cak UCU-TGU jot scannow. Trens roxas eis ti Plokeing quert loppe eis yop prexs. Piy opher hawers, eit yaggles orn ti sumbloat alohe plok. Su havo loasor cakso tgu pwuructs tyu.</sf:ghost-text></sf:p></sf:layout></sf:section></sf:text-body></sf:text-storage><sl:thumbnails sfa:ID="SFRImageBinary-0"><sf:size sfa:w="45" sfa:h="56"/><sf:data sfa:ID="SFEData-0" sf:path="Templates/Blank/Blank.template/thumbs/PageCapThumbV2-1.tiff" sf:displayname="thumbs/PageCapThumbV2-1.tiff" sf:size="10222" sf:sharable="false" sf:resource-type="1" sf:hfs-type="1414088262" sf:checksum="11d714c8" sfa:version="1"/></sl:thumbnails></sl:prototype></sl:section-prototypes><sl:stylesheet sfa:ID="SFSStylesheet-1"><sf:styles><sf:vector-style sfa:ID="SFTVectorStyle-0" sf:ident="tabular-default-header-separator-vector-style-id"><sf:property-map><sf:opacity><sf:number sfa:number="1" sfa:type="f"/></sf:opacity><sf:SFTStrokeProperty><sf:stroke sfa:ID="SFRStroke-6" sf:miter-limit="4" sf:width="1" sf:cap="butt" sf:join="miter"><sf:color xsi:type="sfa:calibrated-white-color-type" sfa:w="0" sfa:a="1"/><sf:pattern sfa:ID="SFRStrokePattern-6" sf:phase="0" sf:type="solid"><sf:pattern/></sf:pattern></sf:stroke></sf:SFTStrokeProperty><sf:SFTBackgroundProperty><sf:number sfa:number="0" sfa:type="c"/></sf:SFTBackgroundProperty></sf:property-map></sf:vector-style><sf:vector-style sfa:ID="SFTVectorStyle-1" sf:ident="tabular-default-footer-body-vector-style-id"><sf:property-map><sf:opacity><sf:number sfa:number="1" sfa:type="f"/></sf:opacity><sf:SFTStrokeProperty><sf:stroke sfa:ID="SFRStroke-7" sf:miter-limit="4" sf:width="1" sf:cap="butt" sf:join="miter"><sf:color xsi:type="sfa:calibrated-white-color-type" sfa:w="0" sfa:a="1"/><sf:pattern sfa:ID="SFRStrokePattern-7" sf:phase="0" sf:type="solid"><sf:pattern/></sf:pattern></sf:stroke></sf:SFTStrokeProperty><sf:SFTBackgroundProperty><sf:number sfa:number="0" sfa:type="c"/></sf:SFTBackgroundProperty></sf:property-map></sf:vector-style><sf:vector-style sfa:ID="SFTVectorStyle-2" sf:ident="tabular-default-body-vector-style-id"><sf:property-map><sf:opacity><sf:number sfa:number="1" sfa:type="f"/></sf:opacity><sf:SFTStrokeProperty><sf:stroke sfa:ID="SFRStroke-8" sf:miter-limit="4" sf:width="1" sf:cap="butt" sf:join="miter"><sf:color xsi:type="sfa:calibrated-white-color-type" sfa:w="0" sfa:a="1"/><sf:pattern sfa:ID="SFRStrokePattern-8" sf:phase="0" sf:type="solid"><sf:pattern/></sf:pattern></sf:stroke></sf:SFTStrokeProperty><sf:SFTBackgroundProperty><sf:number sfa:number="0" sfa:type="c"/></sf:SFTBackgroundProperty></sf:property-map></sf:vector-style><sf:vector-style sfa:ID="SFTVectorStyle-3" sf:ident="tabular-default-header-border-vector-style-id"><sf:property-map><sf:opacity><sf:number sfa:number="1" sfa:type="f"/></sf:opacity><sf:SFTStrokeProperty><sf:stroke sfa:ID="SFRStroke-9" sf:miter-limit="4" sf:width="1" sf:cap="butt" sf:join="miter"><sf:color xsi:type="sfa:calibrated-white-color-type" sfa:w="0" sfa:a="1"/><sf:pattern sfa:ID="SFRStrokePattern-9" sf:phase="0" sf:type="solid"><sf:pattern/></sf:pattern></sf:stroke></sf:SFTStrokeProperty><sf:SFTBackgroundProperty><sf:number sfa:number="0" sfa:type="c"/></sf:SFTBackgroundProperty></sf:property-map></sf:vector-style><sf:vector-style sfa:ID="SFTVectorStyle-4" sf:ident="tabular-default-footer-border-vector-style-id"><sf:property-map><sf:opacity><sf:number sfa:number="1" sfa:type="f"/></sf:opacity><sf:SFTStrokeProperty><sf:stroke-ref sfa:IDREF="SFRStroke-9"/></sf:SFTStrokeProperty><sf:SFTBackgroundProperty><sf:number sfa:number="0" sfa:type="c"/></sf:SFTBackgroundProperty></sf:property-map></sf:vector-style><sf:vector-style sfa:ID="SFTVectorStyle-5" sf:ident="tabular-default-header-body-vector-style-id"><sf:property-map><sf:opacity><sf:number sfa:number="1" sfa:type="f"/></sf:opacity><sf:SFTStrokeProperty><sf:stroke-ref sfa:IDREF="SFRStroke-7"/></sf:SFTStrokeProperty><sf:SFTBackgroundProperty><sf:number sfa:number="0" sfa:type="c"/></sf:SFTBackgroundProperty></sf:property-map></sf:vector-style><sf:vector-style sfa:ID="SFTVectorStyle-6" sf:ident="tabular-default-footer-separator-vector-style-id"><sf:property-map><sf:opacity><sf:number sfa:number="1" sfa:type="f"/></sf:opacity><sf:SFTStrokeProperty><sf:stroke-ref sfa:IDREF="SFRStroke-6"/></sf:SFTStrokeProperty><sf:SFTBackgroundProperty><sf:number sfa:number="0" sfa:type="c"/></sf:SFTBackgroundProperty></sf:property-map></sf:vector-style><sf:vector-style sfa:ID="SFTVectorStyle-7" sf:ident="tabular-default-border-vector-style-id"><sf:property-map><sf:opacity><sf:number sfa:number="1" sfa:type="f"/></sf:opacity><sf:SFTStrokeProperty><sf:stroke-ref sfa:IDREF="SFRStroke-8"/></sf:SFTStrokeProperty><sf:SFTBackgroundProperty><sf:number sfa:number="0" sfa:type="c"/></sf:SFTBackgroundProperty></sf:property-map></sf:vector-style><sf:paragraphstyle sfa:ID="SFWPParagraphStyle-6" sf:name="sect2-subtitle" sf:ident="paragraph-style-45"><sf:property-map><sf:fontSize><sf:number sfa:number="15" sfa:type="f"/></sf:fontSize><sf:word_strikethrough/><sf:spaceAfter/><sf:alignment/><sf:keepLinesTogether/><sf:listStyle><sf:liststyle sfa:ID="SFWPListStyle-2" sf:name="None" sf:ident="list-style-default"><sf:property-map><sf:listTextIndents><sf:array sfa:ID="NSArray-7"><sf:number sfa:number="0" sfa:type="f"/><sf:number sfa:number="36" sfa:type="f"/><sf:number sfa:number="72" sfa:type="f"/><sf:number sfa:number="108" sfa:type="f"/><sf:number sfa:number="144" sfa:type="f"/><sf:number sfa:number="180" sfa:type="f"/><sf:number sfa:number="216" sfa:type="f"/><sf:number sfa:number="252" sfa:type="f"/><sf:number sfa:number="288" sfa:type="f"/></sf:array></sf:listTextIndents><sf:listLabelGeometries><sf:array sfa:ID="NSArray-8"><sf:list-label-geometry sfa:ID="SFWPListLabelGeometry-9" sf:align="left" sf:scale="1" sf:offset="0" sf:scale-with-text="true"/><sf:list-label-geometry sfa:ID="SFWPListLabelGeometry-10" sf:align="left" sf:scale="1" sf:offset="0" sf:scale-with-text="true"/><sf:list-label-geometry sfa:ID="SFWPListLabelGeometry-11" sf:align="left" sf:scale="1" sf:offset="0" sf:scale-with-text="true"/><sf:list-label-geometry sfa:ID="SFWPListLabelGeometry-12" sf:align="left" sf:scale="1" sf:offset="0" sf:scale-with-text="true"/><sf:list-label-geometry sfa:ID="SFWPListLabelGeometry-13" sf:align="left" sf:scale="1" sf:offset="0" sf:scale-with-text="true"/><sf:list-label-geometry sfa:ID="SFWPListLabelGeometry-14" sf:align="left" sf:scale="1" sf:offset="0" sf:scale-with-text="true"/><sf:list-label-geometry sfa:ID="SFWPListLabelGeometry-15" sf:align="left" sf:scale="1" sf:offset="0" sf:scale-with-text="true"/><sf:list-label-geometry sfa:ID="SFWPListLabelGeometry-16" sf:align="left" sf:scale="1" sf:offset="0" sf:scale-with-text="true"/><sf:list-label-geometry sfa:ID="SFWPListLabelGeometry-17" sf:align="left" sf:scale="1" sf:offset="0" sf:scale-with-text="true"/></sf:array></sf:listLabelGeometries><sf:listLabelIndents><sf:array sfa:ID="NSArray-9"><sf:number sfa:number="0" sfa:type="f"/><sf:number sfa:number="0" sfa:type="f"/><sf:number sfa:number="0" sfa:type="f"/><sf:number sfa:number="0" sfa:type="f"/><sf:number sfa:number="0" sfa:type="f"/><sf:number sfa:number="0" sfa:type="f"/><sf:number sfa:number="0" sfa:type="f"/><sf:number sfa:number="0" sfa:type="f"/><sf:number sfa:number="0" sfa:type="f"/></sf:array></sf:listLabelIndents><sf:listLabelTypes><sf:array sfa:ID="NSArray-10"><sf:list-label-typeinfo sfa:ID="SFWPListLabelTypeInfo-9" sf:type="none"/><sf:list-label-typeinfo sfa:ID="SFWPListLabelTypeInfo-10" sf:type="none"/><sf:list-label-typeinfo sfa:ID="SFWPListLabelTypeInfo-11" sf:type="none"/><sf:list-label-typeinfo sfa:ID="SFWPListLabelTypeInfo-12" sf:type="none"/><sf:list-label-typeinfo sfa:ID="SFWPListLabelTypeInfo-13" sf:type="none"/><sf:list-label-typeinfo sfa:ID="SFWPListLabelTypeInfo-14" sf:type="none"/><sf:list-label-typeinfo sfa:ID="SFWPListLabelTypeInfo-15" sf:type="none"/><sf:list-label-typeinfo sfa:ID="SFWPListLabelTypeInfo-16" sf:type="none"/><sf:list-label-typeinfo sfa:ID="SFWPListLabelTypeInfo-17" sf:type="none"/></sf:array></sf:listLabelTypes></sf:property-map></sf:liststyle></sf:listStyle><sf:outlineLevel/><sf:firstTopicNumber/><sf:underline/><sf:defaultTabStops><sf:number sfa:number="28.34646" sfa:type="f"/></sf:defaultTabStops><sf:tocStyle><sf:tocstyle sfa:ID="SLTOCParagraphStyle-3" sfa:sfclass="paragraphstyle" sf:name="TOC Heading 2" sf:ident="toc-paragraph-style-2"><sf:property-map><sf:fontSize><sf:number sfa:number="14" sfa:type="f"/></sf:fontSize><sf:word_strikethrough/><sf:spaceAfter><sf:number sfa:number="3" sfa:type="f"/></sf:spaceAfter><sf:alignment/><sf:SLTOCPageNumberStyle><sf:null/></sf:SLTOCPageNumberStyle><sf:keepLinesTogether/><sf:listStyle><sf:null/></sf:listStyle><sf:outlineLevel/><sf:underline/><sf:underlineWidth/><sf:defaultTabStops><sf:number sfa:number="28.34646" sfa:type="f"/></sf:defaultTabStops><sf:dropCap/><sf:firstTopicNumber/><sf:fontName/><sf:strikethru/><sf:baselineShift/><sf:lineSpacing/><sf:textShadow/><sf:underlineColor><sf:null/></sf:underlineColor><sf:kerning/><sf:strikethruWidth/><sf:fontColor><sf:color xsi:type="sfa:calibrated-rgb-color-type" sfa:r="0" sfa:g="0" sfa:b="0" sfa:a="1"/></sf:fontColor><sf:textBackground><sf:null/></sf:textBackground><sf:paragraphRuleWidth/><sf:paragraphStroke><sf:null/></sf:paragraphStroke><sf:bold><sf:number sfa:number="1" sfa:type="c"/></sf:bold><sf:tracking/><sf:ligatures/><sf:language><sf:null/></sf:language><sf:followingParagraphStyle><sf:null/></sf:followingParagraphStyle><sf:outline/><sf:strikethruColor><sf:null/></sf:strikethruColor><sf:italic/><sf:SLTOCEntryStyle><sf:null/></sf:SLTOCEntryStyle><sf:word_underline/><sf:widowControl/><sf:rightIndent/><sf:atsuFontFeatures/><sf:tabs><sf:tabs sfa:ID="SFWPTabs-3"><sf:tabstop sf:pos="481.61416625976562" sf:align="right"/></sf:tabs></sf:tabs><sf:superscript/><sf:paragraphBorderType/><sf:hyphenate/><sf:hidden/><sf:pageBreakBefore/><sf:SLTOCEnabledStyles><sf:null/></sf:SLTOCEnabledStyles><sf:SLTOCDisabledStyles><sf:null/></sf:SLTOCDisabledStyles><sf:paragraphFill><sf:null/></sf:paragraphFill><sf:SLTOCShowPageNumber/><sf:keepWithNext/><sf:spaceBefore><sf:number sfa:number="12" sfa:type="f"/></sf:spaceBefore><sf:outlineColor><sf:null/></sf:outlineColor><sf:paragraphRuleOffset/><sf:capitalization/><sf:leftIndent><sf:number sfa:number="14.17323" sfa:type="f"/></sf:leftIndent><sf:firstLineIndent><sf:number sfa:number="14.17323" sfa:type="f"/></sf:firstLineIndent></sf:property-map></sf:tocstyle></sf:tocStyle><sf:dropCap/><sf:underlineWidth/><sf:fontName><sf:string sfa:string="Helvetica-Bold"/></sf:fontName><sf:strikethru/><sf:baselineShift/><sf:lineSpacing/><sf:textShadow/><sf:underlineColor><sf:null/></sf:underlineColor><sf:showInTOC><sf:number sfa:number="1" sfa:type="c"/></sf:showInTOC><sf:kerning/><sf:strikethruWidth/><sf:fontColor/><sf:textBackground><sf:null/></sf:textBackground><sf:paragraphRuleWidth/><sf:paragraphStroke><sf:null/></sf:paragraphStroke><sf:bold><sf:number sfa:number="1" sfa:type="c"/></sf:bold><sf:tracking/><sf:ligatures/><sf:language><sf:null/></sf:language><sf:followingParagraphStyle><sf:paragraphstyle sfa:ID="SFWPParagraphStyle-7" sf:name="para" sf:ident="paragraph-style-32"><sf:property-map><sf:fontSize/><sf:word_strikethrough/><sf:spaceAfter><sf:number sfa:number="12" sfa:type="f"/></sf:spaceAfter><sf:alignment/><sf:keepLinesTogether/><sf:listStyle><sf:liststyle-ref sfa:IDREF="SFWPListStyle-2"/></sf:listStyle><sf:outlineLevel/><sf:firstTopicNumber/><sf:underline/><sf:defaultTabStops><sf:number sfa:number="28.34646" sfa:type="f"/></sf:defaultTabStops><sf:underlineWidth/><sf:dropCap/><sf:fontName/><sf:strikethru/><sf:baselineShift/><sf:lineSpacing/><sf:textShadow/><sf:underlineColor><sf:null/></sf:underlineColor><sf:kerning/><sf:strikethruWidth/><sf:fontColor/><sf:textBackground><sf:null/></sf:textBackground><sf:paragraphRuleWidth/><sf:paragraphStroke><sf:null/></sf:paragraphStroke><sf:bold/><sf:tracking/><sf:ligatures/><sf:language><sf:null/></sf:language><sf:followingParagraphStyle><sf:null/></sf:followingParagraphStyle><sf:outline/><sf:strikethruColor><sf:null/></sf:strikethruColor><sf:italic/><sf:word_underline/><sf:widowControl/><sf:rightIndent/><sf:atsuFontFeatures/><sf:tabs/><sf:superscript/><sf:paragraphBorderType/><sf:hyphenate/><sf:hidden/><sf:pageBreakBefore/><sf:paragraphFill><sf:null/></sf:paragraphFill><sf:spaceBefore/><sf:keepWithNext/><sf:outlineColor><sf:null/></sf:outlineColor><sf:paragraphRuleOffset/><sf:capitalization/><sf:leftIndent/><sf:firstLineIndent/></sf:property-map></sf:paragraphstyle></sf:followingParagraphStyle><sf:outline/><sf:strikethruColor><sf:null/></sf:strikethruColor><sf:italic/><sf:word_underline/><sf:widowControl/><sf:rightIndent/><sf:atsuFontFeatures/><sf:tabs/><sf:superscript/><sf:paragraphBorderType/><sf:hyphenate/><sf:hidden/><sf:pageBreakBefore/><sf:paragraphFill><sf:null/></sf:paragraphFill><sf:spaceBefore><sf:number sfa:number="12" sfa:type="f"/></sf:spaceBefore><sf:keepWithNext><sf:number sfa:number="1" sfa:type="c"/></sf:keepWithNext><sf:outlineColor><sf:null/></sf:outlineColor><sf:paragraphRuleOffset/><sf:capitalization/><sf:leftIndent/><sf:firstLineIndent/></sf:property-map></sf:paragraphstyle><sf:paragraphstyle sfa:ID="SFWPParagraphStyle-8" sf:name="formalpara-title" sf:ident="paragraph-style-23"><sf:property-map><sf:fontSize/><sf:word_strikethrough/><sf:spaceAfter><sf:number sfa:number="12" sfa:type="f"/></sf:spaceAfter><sf:alignment/><sf:keepLinesTogether/><sf:listStyle><sf:liststyle-ref sfa:IDREF="SFWPListStyle-2"/></sf:listStyle><sf:outlineLevel/><sf:firstTopicNumber/><sf:underline/><sf:defaultTabStops><sf:number sfa:number="28.34646" sfa:type="f"/></sf:defaultTabStops><sf:underlineWidth/><sf:dropCap/><sf:fontName/><sf:strikethru/><sf:baselineShift/><sf:lineSpacing/><sf:textShadow/><sf:underlineColor><sf:null/></sf:underlineColor><sf:kerning/><sf:strikethruWidth/><sf:fontColor/><sf:textBackground><sf:null/></sf:textBackground><sf:paragraphRuleWidth/><sf:paragraphStroke><sf:null/></sf:paragraphStroke><sf:bold/><sf:tracking/><sf:ligatures/><sf:language><sf:null/></sf:language><sf:followingParagraphStyle><sf:null/></sf:followingParagraphStyle><sf:outline/><sf:strikethruColor><sf:null/></sf:strikethruColor><sf:italic/><sf:word_underline/><sf:widowControl/><sf:rightIndent/><sf:atsuFontFeatures/><sf:tabs/><sf:superscript/><sf:paragraphBorderType/><sf:hyphenate/><sf:hidden/><sf:pageBreakBefore/><sf:paragraphFill><sf:null/></sf:paragraphFill><sf:spaceBefore/><sf:keepWithNext/><sf:outlineColor><sf:null/></sf:outlineColor><sf:paragraphRuleOffset/><sf:capitalization/><sf:leftIndent><sf:number sfa:number="28.35709" sfa:type="f"/></sf:leftIndent><sf:firstLineIndent><sf:number sfa:number="28.36418" sfa:type="f"/></sf:firstLineIndent></sf:property-map></sf:paragraphstyle><sf:tocstyle sfa:ID="SLTOCParagraphStyle-4" sfa:sfclass="paragraphstyle" sf:name="TOC" sf:ident="toc-paragraph-style-default"><sf:property-map><sf:fontSize><sf:number sfa:number="18" sfa:type="f"/></sf:fontSize><sf:word_strikethrough/><sf:spaceAfter/><sf:alignment/><sf:SLTOCPageNumberStyle><sf:null/></sf:SLTOCPageNumberStyle><sf:keepLinesTogether/><sf:listStyle><sf:null/></sf:listStyle><sf:outlineLevel/><sf:underline/><sf:underlineWidth/><sf:defaultTabStops><sf:number sfa:number="28.34646" sfa:type="f"/></sf:defaultTabStops><sf:dropCap/><sf:firstTopicNumber/><sf:fontName><sf:string sfa:string="Helvetica-Bold"/></sf:fontName><sf:strikethru/><sf:baselineShift/><sf:lineSpacing/><sf:textShadow/><sf:underlineColor><sf:null/></sf:underlineColor><sf:kerning/><sf:strikethruWidth/><sf:fontColor/><sf:textBackground><sf:null/></sf:textBackground><sf:paragraphRuleWidth/><sf:paragraphStroke><sf:null/></sf:paragraphStroke><sf:bold><sf:number sfa:number="1" sfa:type="c"/></sf:bold><sf:tracking/><sf:ligatures/><sf:language><sf:null/></sf:language><sf:followingParagraphStyle><sf:null/></sf:followingParagraphStyle><sf:outline/><sf:strikethruColor><sf:null/></sf:strikethruColor><sf:italic/><sf:SLTOCEntryStyle><sf:null/></sf:SLTOCEntryStyle><sf:word_underline/><sf:widowControl/><sf:rightIndent/><sf:atsuFontFeatures/><sf:tabs><sf:tabs sfa:ID="SFWPTabs-4"><sf:tabstop sf:pos="481.61416625976562" sf:align="right"/></sf:tabs></sf:tabs><sf:superscript/><sf:paragraphBorderType/><sf:hyphenate/><sf:hidden/><sf:pageBreakBefore/><sf:SLTOCEnabledStyles><sf:null/></sf:SLTOCEnabledStyles><sf:SLTOCDisabledStyles><sf:null/></sf:SLTOCDisabledStyles><sf:paragraphFill><sf:null/></sf:paragraphFill><sf:SLTOCShowPageNumber/><sf:keepWithNext/><sf:spaceBefore/><sf:outlineColor><sf:null/></sf:outlineColor><sf:paragraphRuleOffset/><sf:capitalization/><sf:leftIndent/><sf:firstLineIndent/></sf:property-map></sf:tocstyle><sf:paragraphstyle sfa:ID="SFWPParagraphStyle-9" sf:name="sect3-subtitle" sf:ident="paragraph-style-47"><sf:property-map><sf:fontSize><sf:number sfa:number="14" sfa:type="f"/></sf:fontSize><sf:word_strikethrough/><sf:spaceAfter/><sf:alignment/><sf:keepLinesTogether/><sf:listStyle><sf:liststyle-ref sfa:IDREF="SFWPListStyle-2"/></sf:listStyle><sf:outlineLevel/><sf:firstTopicNumber/><sf:underline/><sf:defaultTabStops><sf:number sfa:number="28.34646" sfa:type="f"/></sf:defaultTabStops><sf:tocStyle><sf:tocstyle-ref sfa:IDREF="SLTOCParagraphStyle-3"/></sf:tocStyle><sf:dropCap/><sf:underlineWidth/><sf:fontName><sf:string sfa:string="Helvetica-Bold"/></sf:fontName><sf:strikethru/><sf:baselineShift/><sf:lineSpacing/><sf:textShadow/><sf:underlineColor><sf:null/></sf:underlineColor><sf:showInTOC><sf:number sfa:number="1" sfa:type="c"/></sf:showInTOC><sf:kerning/><sf:strikethruWidth/><sf:fontColor/><sf:textBackground><sf:null/></sf:textBackground><sf:paragraphRuleWidth/><sf:paragraphStroke><sf:null/></sf:paragraphStroke><sf:bold><sf:number sfa:number="1" sfa:type="c"/></sf:bold><sf:tracking/><sf:ligatures/><sf:language><sf:null/></sf:language><sf:followingParagraphStyle><sf:paragraphstyle-ref sfa:IDREF="SFWPParagraphStyle-7"/></sf:followingParagraphStyle><sf:outline/><sf:strikethruColor><sf:null/></sf:strikethruColor><sf:italic/><sf:word_underline/><sf:widowControl/><sf:rightIndent/><sf:atsuFontFeatures/><sf:tabs/><sf:superscript/><sf:paragraphBorderType/><sf:hyphenate/><sf:hidden/><sf:pageBreakBefore/><sf:paragraphFill><sf:null/></sf:paragraphFill><sf:spaceBefore><sf:number sfa:number="12" sfa:type="f"/></sf:spaceBefore><sf:keepWithNext><sf:number sfa:number="1" sfa:type="c"/></sf:keepWithNext><sf:outlineColor><sf:null/></sf:outlineColor><sf:paragraphRuleOffset/><sf:capitalization/><sf:leftIndent/><sf:firstLineIndent/></sf:property-map></sf:paragraphstyle><sf:characterstyle sfa:ID="SFWPCharacterStyle-1" sf:name="orgdiv" sf:ident="character-style-19"><sf:property-map><sf:underlineColor><sf:null/></sf:underlineColor><sf:fontColor/><sf:fontSize/><sf:textBackground><sf:null/></sf:textBackground><sf:atsuFontFeatures/><sf:superscript/><sf:underline/><sf:bold/><sf:fontName/><sf:ligatures/><sf:strikethru/><sf:baselineShift/><sf:tracking/><sf:capitalization/><sf:textShadow/><sf:language><sf:string sfa:string="en"/></sf:language><sf:italic><sf:number sfa:number="1" sfa:type="i"/></sf:italic><sf:strikethruColor><sf:null/></sf:strikethruColor></sf:property-map></sf:characterstyle><sf:paragraphstyle sfa:ID="SFWPParagraphStyle-10" sf:name="itemizedlist2" sf:ident="paragraph-style-95"><sf:property-map><sf:fontSize/><sf:word_strikethrough/><sf:spaceAfter/><sf:alignment/><sf:keepLinesTogether/><sf:listStyle><sf:liststyle sfa:ID="SFWPListStyle-3" sf:parent-ident="list-style-2"><sf:property-map><sf:listTextIndents><sf:array sfa:ID="NSArray-11"><sf:number sfa:number="9.000001" sfa:type="f"/><sf:number sfa:number="9" sfa:type="f"/><sf:number sfa:number="9" sfa:type="f"/><sf:number sfa:number="9" sfa:type="f"/><sf:number sfa:number="9" sfa:type="f"/><sf:number sfa:number="9" sfa:type="f"/><sf:number sfa:number="9" sfa:type="f"/><sf:number sfa:number="9" sfa:type="f"/><sf:number sfa:number="9" sfa:type="f"/></sf:array></sf:listTextIndents><sf:listLabelGeometries><sf:array sfa:ID="NSArray-12"><sf:list-label-geometry sfa:ID="SFWPListLabelGeometry-18" sf:align="left" sf:scale="1" sf:offset="-1" sf:scale-with-text="true"/><sf:list-label-geometry sfa:ID="SFWPListLabelGeometry-19" sf:align="left" sf:scale="1" sf:offset="-1" sf:scale-with-text="true"/><sf:list-label-geometry sfa:ID="SFWPListLabelGeometry-20" sf:align="left" sf:scale="1" sf:offset="-1" sf:scale-with-text="true"/><sf:list-label-geometry sfa:ID="SFWPListLabelGeometry-21" sf:align="left" sf:scale="1" sf:offset="-1" sf:scale-with-text="true"/><sf:list-label-geometry sfa:ID="SFWPListLabelGeometry-22" sf:align="left" sf:scale="1" sf:offset="-1" sf:scale-with-text="true"/><sf:list-label-geometry sfa:ID="SFWPListLabelGeometry-23" sf:align="left" sf:scale="1" sf:offset="-1" sf:scale-with-text="true"/><sf:list-label-geometry sfa:ID="SFWPListLabelGeometry-24" sf:align="left" sf:scale="1" sf:offset="-1" sf:scale-with-text="true"/><sf:list-label-geometry sfa:ID="SFWPListLabelGeometry-25" sf:align="left" sf:scale="1" sf:offset="-1" sf:scale-with-text="true"/><sf:list-label-geometry sfa:ID="SFWPListLabelGeometry-26" sf:align="left" sf:scale="1" sf:offset="-1" sf:scale-with-text="true"/></sf:array></sf:listLabelGeometries><sf:listLabelIndents><sf:array sfa:ID="NSArray-13"><sf:number sfa:number="14.17323" sfa:type="f"/><sf:number sfa:number="18" sfa:type="f"/><sf:number sfa:number="36" sfa:type="f"/><sf:number sfa:number="54" sfa:type="f"/><sf:number sfa:number="72" sfa:type="f"/><sf:number sfa:number="90" sfa:type="f"/><sf:number sfa:number="108" sfa:type="f"/><sf:number sfa:number="126" sfa:type="f"/><sf:number sfa:number="144" sfa:type="f"/></sf:array></sf:listLabelIndents><sf:listLabelTypes><sf:array sfa:ID="NSArray-14"><sf:list-label-typeinfo sfa:ID="SFWPListLabelTypeInfo-18" sf:type="text"><sf:text-label sfa:ID="SFWPTextLabelFormat-0" sf:type="bullet" sf:format="&#x2022;" sf:first="0"/></sf:list-label-typeinfo><sf:list-label-typeinfo sfa:ID="SFWPListLabelTypeInfo-19" sf:type="text"><sf:text-label sfa:ID="SFWPTextLabelFormat-1" sf:type="bullet" sf:format="&#x2022;" sf:first="0"/></sf:list-label-typeinfo><sf:list-label-typeinfo sfa:ID="SFWPListLabelTypeInfo-20" sf:type="text"><sf:text-label sfa:ID="SFWPTextLabelFormat-2" sf:type="bullet" sf:format="&#x2022;" sf:first="0"/></sf:list-label-typeinfo><sf:list-label-typeinfo sfa:ID="SFWPListLabelTypeInfo-21" sf:type="text"><sf:text-label sfa:ID="SFWPTextLabelFormat-3" sf:type="bullet" sf:format="&#x2022;" sf:first="0"/></sf:list-label-typeinfo><sf:list-label-typeinfo sfa:ID="SFWPListLabelTypeInfo-22" sf:type="text"><sf:text-label sfa:ID="SFWPTextLabelFormat-4" sf:type="bullet" sf:format="&#x2022;" sf:first="0"/></sf:list-label-typeinfo><sf:list-label-typeinfo sfa:ID="SFWPListLabelTypeInfo-23" sf:type="text"><sf:text-label sfa:ID="SFWPTextLabelFormat-5" sf:type="bullet" sf:format="&#x2022;" sf:first="0"/></sf:list-label-typeinfo><sf:list-label-typeinfo sfa:ID="SFWPListLabelTypeInfo-24" sf:type="text"><sf:text-label sfa:ID="SFWPTextLabelFormat-6" sf:type="bullet" sf:format="&#x2022;" sf:first="0"/></sf:list-label-typeinfo><sf:list-label-typeinfo sfa:ID="SFWPListLabelTypeInfo-25" sf:type="text"><sf:text-label sfa:ID="SFWPTextLabelFormat-7" sf:type="bullet" sf:format="&#x2022;" sf:first="0"/></sf:list-label-typeinfo><sf:list-label-typeinfo sfa:ID="SFWPListLabelTypeInfo-26" sf:type="text"><sf:text-label sfa:ID="SFWPTextLabelFormat-8" sf:type="bullet" sf:format="&#x2022;" sf:first="0"/></sf:list-label-typeinfo></sf:array></sf:listLabelTypes></sf:property-map></sf:liststyle></sf:listStyle><sf:outlineLevel/><sf:firstTopicNumber/><sf:underline/><sf:defaultTabStops><sf:number sfa:number="28.34646" sfa:type="f"/></sf:defaultTabStops><sf:underlineWidth/><sf:dropCap/><sf:fontName/><sf:strikethru/><sf:baselineShift/><sf:lineSpacing/><sf:textShadow/><sf:underlineColor><sf:null/></sf:underlineColor><sf:kerning/><sf:strikethruWidth/><sf:fontColor/><sf:textBackground><sf:null/></sf:textBackground><sf:paragraphRuleWidth/><sf:paragraphStroke><sf:null/></sf:paragraphStroke><sf:bold/><sf:tracking/><sf:ligatures/><sf:language><sf:null/></sf:language><sf:followingParagraphStyle><sf:null/></sf:followingParagraphStyle><sf:outline/><sf:strikethruColor><sf:null/></sf:strikethruColor><sf:italic/><sf:word_underline/><sf:widowControl/><sf:rightIndent/><sf:atsuFontFeatures/><sf:tabs/><sf:superscript/><sf:paragraphBorderType/><sf:hyphenate/><sf:hidden/><sf:pageBreakBefore/><sf:paragraphFill><sf:null/></sf:paragraphFill><sf:spaceBefore/><sf:keepWithNext/><sf:outlineColor><sf:null/></sf:outlineColor><sf:paragraphRuleOffset/><sf:capitalization/><sf:leftIndent/><sf:firstLineIndent/></sf:property-map></sf:paragraphstyle><sf:paragraphstyle sfa:ID="SFWPParagraphStyle-11" sf:name="publisher" sf:ident="paragraph-style-106"><sf:property-map><sf:fontSize><sf:number sfa:number="10" sfa:type="f"/></sf:fontSize><sf:word_strikethrough/><sf:spaceAfter><sf:number sfa:number="12" sfa:type="f"/></sf:spaceAfter><sf:alignment/><sf:keepLinesTogether/><sf:listStyle><sf:liststyle-ref sfa:IDREF="SFWPListStyle-2"/></sf:listStyle><sf:outlineLevel/><sf:firstTopicNumber/><sf:underline/><sf:defaultTabStops><sf:number sfa:number="28.34646" sfa:type="f"/></sf:defaultTabStops><sf:underlineWidth/><sf:dropCap/><sf:fontName><sf:string sfa:string="TimesNewRomanPSMT"/></sf:fontName><sf:strikethru/><sf:baselineShift/><sf:lineSpacing/><sf:textShadow/><sf:underlineColor><sf:null/></sf:underlineColor><sf:kerning/><sf:strikethruWidth/><sf:fontColor/><sf:textBackground><sf:null/></sf:textBackground><sf:paragraphRuleWidth/><sf:paragraphStroke><sf:null/></sf:paragraphStroke><sf:bold/><sf:tracking/><sf:ligatures/><sf:language><sf:null/></sf:language><sf:followingParagraphStyle><sf:null/></sf:followingParagraphStyle><sf:outline/><sf:strikethruColor><sf:null/></sf:strikethruColor><sf:italic/><sf:word_underline/><sf:widowControl/><sf:rightIndent/><sf:atsuFontFeatures/><sf:tabs/><sf:superscript/><sf:paragraphBorderType/><sf:hyphenate/><sf:hidden/><sf:pageBreakBefore/><sf:paragraphFill><sf:null/></sf:paragraphFill><sf:spaceBefore/><sf:keepWithNext/><sf:outlineColor><sf:null/></sf:outlineColor><sf:paragraphRuleOffset/><sf:capitalization/><sf:leftIndent/><sf:firstLineIndent/></sf:property-map></sf:paragraphstyle><sf:paragraphstyle sfa:ID="SFWPParagraphStyle-12" sf:name="blockerror" sf:ident="paragraph-style-10"><sf:property-map><sf:fontSize/><sf:word_strikethrough/><sf:spaceAfter><sf:number sfa:number="12" sfa:type="f"/></sf:spaceAfter><sf:alignment/><sf:keepLinesTogether/><sf:listStyle><sf:liststyle-ref sfa:IDREF="SFWPListStyle-2"/></sf:listStyle><sf:outlineLevel/><sf:firstTopicNumber/><sf:underline/><sf:defaultTabStops><sf:number sfa:number="28.34646" sfa:type="f"/></sf:defaultTabStops><sf:underlineWidth/><sf:dropCap/><sf:fontName/><sf:strikethru/><sf:baselineShift/><sf:lineSpacing/><sf:textShadow/><sf:underlineColor><sf:null/></sf:underlineColor><sf:kerning/><sf:strikethruWidth/><sf:fontColor><sf:color xsi:type="sfa:calibrated-rgb-color-type" sfa:r="1" sfa:g="0" sfa:b="0" sfa:a="1"/></sf:fontColor><sf:textBackground><sf:null/></sf:textBackground><sf:paragraphRuleWidth/><sf:paragraphStroke><sf:null/></sf:paragraphStroke><sf:bold/><sf:tracking/><sf:ligatures/><sf:language><sf:null/></sf:language><sf:followingParagraphStyle><sf:null/></sf:followingParagraphStyle><sf:outline/><sf:strikethruColor><sf:null/></sf:strikethruColor><sf:italic/><sf:word_underline/><sf:widowControl/><sf:rightIndent/><sf:atsuFontFeatures/><sf:tabs/><sf:superscript/><sf:paragraphBorderType/><sf:hyphenate/><sf:hidden/><sf:pageBreakBefore/><sf:paragraphFill><sf:color xsi:type="sfa:calibrated-rgb-color-type" sfa:r="1" sfa:g="0.40000000596046448" sfa:b="0.40000000596046448" sfa:a="0.20000000298023224"/></sf:paragraphFill><sf:spaceBefore/><sf:keepWithNext/><sf:outlineColor><sf:null/></sf:outlineColor><sf:paragraphRuleOffset/><sf:capitalization/><sf:leftIndent><sf:number sfa:number="14.18209" sfa:type="f"/></sf:leftIndent><sf:firstLineIndent><sf:number sfa:number="14.18209" sfa:type="f"/></sf:firstLineIndent></sf:property-map></sf:paragraphstyle><sf:cell-style sfa:ID="SFTCellStyle-0" sf:ident="tabular-default-footer-row-cell-style-id"><sf:property-map><sf:opacity><sf:number sfa:number="1" sfa:type="f"/></sf:opacity><sf:SFTCellStylePropertyDateTimeFormat><sf:string sfa:string="d/MM/yy h:mm a"/></sf:SFTCellStylePropertyDateTimeFormat><sf:SFTCellStylePropertyParagraphStyle><sf:paragraphstyle sfa:ID="SFWPParagraphStyle-13" sf:parent-ident="paragraph-style-32"><sf:property-map><sf:alignment><sf:number sfa:number="2" sfa:type="i"/></sf:alignment><sf:followingParagraphStyle><sf:null/></sf:followingParagraphStyle></sf:property-map></sf:paragraphstyle></sf:SFTCellStylePropertyParagraphStyle><sf:SFTCellStylePropertyFormatType><sf:number sfa:number="255" sfa:type="i"/></sf:SFTCellStylePropertyFormatType><sf:SFTCellTextWrapProperty><sf:number sfa:number="1" sfa:type="c"/></sf:SFTCellTextWrapProperty><sf:SFTCellStylePropertyImplicitFormatType><sf:number sfa:number="255" sfa:type="i"/></sf:SFTCellStylePropertyImplicitFormatType><sf:SFTCellStylePropertyLayoutStyle><sf:layoutstyle sfa:ID="SFWPLayoutStyle-5" sf:parent-ident="layout-style-default"><sf:property-map><sf:followingLayoutStyle><sf:null/></sf:followingLayoutStyle><sf:padding><sf:padding sfa:ID="SFWPPadding-2" sf:top="5" sf:left="5" sf:bottom="5" sf:right="5"/></sf:padding><sf:layoutParagraphStyle><sf:paragraphstyle-ref sfa:IDREF="SFWPParagraphStyle-13"/></sf:layoutParagraphStyle></sf:property-map></sf:layoutstyle></sf:SFTCellStylePropertyLayoutStyle><sf:SFTCellStylePropertyNumberFormat><sf:number-format sfa:ID="SFTNumberFormat-0" sf:format-type="0" sf:format-string="#,##0.###;-#,##0.###" sf:format-decimal-places="2" sf:format-currency-code="AUD" sf:format-negative-style="0" sf:format-show-thousands-separator="true" sf:format-fraction-accuracy="-1" sf:format-use-accounting-style="false"/></sf:SFTCellStylePropertyNumberFormat><sf:fill><sf:color xsi:type="sfa:calibrated-rgb-color-type" sfa:r="0.69019609689712524" sfa:g="0.70196080207824707" sfa:b="0.69803923368453979" sfa:a="1"/></sf:fill></sf:property-map></sf:cell-style><sf:characterstyle sfa:ID="SFWPCharacterStyle-2" sf:name="emphasis" sf:ident="character-style-0"><sf:property-map><sf:bold><sf:number sfa:number="1" sfa:type="c"/></sf:bold><sf:italic><sf:number sfa:number="1" sfa:type="i"/></sf:italic></sf:property-map></sf:characterstyle><sf:characterstyle sfa:ID="SFWPCharacterStyle-3" sf:name="emphasis-underline" sf:ident="character-style-16"><sf:property-map><sf:italic/><sf:fontColor/><sf:fontSize/><sf:atsuFontFeatures/><sf:superscript/><sf:underline><sf:number sfa:number="1" sfa:type="i"/></sf:underline><sf:bold/><sf:tracking/><sf:ligatures/><sf:fontName/><sf:baselineShift/><sf:strikethru/><sf:capitalization/><sf:textShadow/><sf:language><sf:string sfa:string="en"/></sf:language><sf:underlineColor><sf:null/></sf:underlineColor><sf:strikethruColor><sf:null/></sf:strikethruColor></sf:property-map></sf:characterstyle><sf:paragraphstyle sfa:ID="SFWPParagraphStyle-14" sf:name="sect5-title" sf:ident="paragraph-style-50"><sf:property-map><sf:fontSize><sf:number sfa:number="14" sfa:type="f"/></sf:fontSize><sf:word_strikethrough/><sf:spaceAfter/><sf:alignment/><sf:keepLinesTogether/><sf:listStyle><sf:liststyle-ref sfa:IDREF="SFWPListStyle-2"/></sf:listStyle><sf:outlineLevel/><sf:firstTopicNumber/><sf:underline/><sf:defaultTabStops><sf:number sfa:number="28.34646" sfa:type="f"/></sf:defaultTabStops><sf:tocStyle><sf:tocstyle-ref sfa:IDREF="SLTOCParagraphStyle-3"/></sf:tocStyle><sf:dropCap/><sf:underlineWidth/><sf:fontName><sf:string sfa:string="Helvetica-Bold"/></sf:fontName><sf:strikethru/><sf:baselineShift/><sf:lineSpacing/><sf:textShadow/><sf:underlineColor><sf:null/></sf:underlineColor><sf:showInTOC><sf:number sfa:number="1" sfa:type="c"/></sf:showInTOC><sf:kerning/><sf:strikethruWidth/><sf:fontColor/><sf:textBackground><sf:null/></sf:textBackground><sf:paragraphRuleWidth/><sf:paragraphStroke><sf:null/></sf:paragraphStroke><sf:bold><sf:number sfa:number="1" sfa:type="i"/></sf:bold><sf:tracking/><sf:ligatures/><sf:language><sf:null/></sf:language><sf:followingParagraphStyle><sf:paragraphstyle-ref sfa:IDREF="SFWPParagraphStyle-7"/></sf:followingParagraphStyle><sf:outline/><sf:strikethruColor><sf:null/></sf:strikethruColor><sf:italic/><sf:word_underline/><sf:widowControl/><sf:rightIndent/><sf:atsuFontFeatures/><sf:tabs/><sf:superscript/><sf:paragraphBorderType/><sf:hyphenate/><sf:hidden/><sf:pageBreakBefore/><sf:paragraphFill><sf:null/></sf:paragraphFill><sf:spaceBefore><sf:number sfa:number="12" sfa:type="f"/></sf:spaceBefore><sf:keepWithNext><sf:number sfa:number="1" sfa:type="c"/></sf:keepWithNext><sf:outlineColor><sf:null/></sf:outlineColor><sf:paragraphRuleOffset/><sf:capitalization/><sf:leftIndent/><sf:firstLineIndent/></sf:property-map></sf:paragraphstyle><sf:paragraphstyle sfa:ID="SFWPParagraphStyle-15" sf:name="address" sf:ident="paragraph-style-108"><sf:property-map><sf:fontSize><sf:number sfa:number="11" sfa:type="f"/></sf:fontSize><sf:word_strikethrough/><sf:spaceAfter><sf:number sfa:number="12" sfa:type="f"/></sf:spaceAfter><sf:alignment/><sf:keepLinesTogether/><sf:listStyle><sf:liststyle-ref sfa:IDREF="SFWPListStyle-2"/></sf:listStyle><sf:outlineLevel/><sf:firstTopicNumber/><sf:underline/><sf:defaultTabStops><sf:number sfa:number="28.34646" sfa:type="f"/></sf:defaultTabStops><sf:underlineWidth/><sf:dropCap/><sf:fontName><sf:string sfa:string="CourierNewPSMT"/></sf:fontName><sf:strikethru/><sf:baselineShift/><sf:lineSpacing/><sf:textShadow/><sf:underlineColor><sf:null/></sf:underlineColor><sf:kerning/><sf:strikethruWidth/><sf:fontColor/><sf:textBackground><sf:null/></sf:textBackground><sf:paragraphRuleWidth/><sf:paragraphStroke><sf:null/></sf:paragraphStroke><sf:bold/><sf:tracking/><sf:ligatures/><sf:language><sf:null/></sf:language><sf:followingParagraphStyle><sf:null/></sf:followingParagraphStyle><sf:outline/><sf:strikethruColor><sf:null/></sf:strikethruColor><sf:italic/><sf:word_underline/><sf:widowControl/><sf:rightIndent/><sf:atsuFontFeatures/><sf:tabs/><sf:superscript/><sf:paragraphBorderType/><sf:hyphenate/><sf:hidden/><sf:pageBreakBefore/><sf:paragraphFill><sf:null/></sf:paragraphFill><sf:spaceBefore/><sf:keepWithNext/><sf:outlineColor><sf:null/></sf:outlineColor><sf:paragraphRuleOffset/><sf:capitalization/><sf:leftIndent/><sf:firstLineIndent/></sf:property-map></sf:paragraphstyle><sf:paragraphstyle sfa:ID="SFWPParagraphStyle-16" sf:name="caption" sf:ident="paragraph-style-36"><sf:property-map><sf:fontSize><sf:number sfa:number="11" sfa:type="f"/></sf:fontSize><sf:word_strikethrough/><sf:spaceAfter><sf:number sfa:number="12" sfa:type="f"/></sf:spaceAfter><sf:alignment/><sf:keepLinesTogether/><sf:listStyle><sf:liststyle-ref sfa:IDREF="SFWPListStyle-2"/></sf:listStyle><sf:outlineLevel/><sf:firstTopicNumber/><sf:underline/><sf:defaultTabStops><sf:number sfa:number="28.34646" sfa:type="f"/></sf:defaultTabStops><sf:underlineWidth/><sf:dropCap/><sf:fontName><sf:string sfa:string="Helvetica-Oblique"/></sf:fontName><sf:strikethru/><sf:baselineShift/><sf:lineSpacing/><sf:textShadow/><sf:underlineColor><sf:null/></sf:underlineColor><sf:kerning/><sf:strikethruWidth/><sf:fontColor/><sf:textBackground><sf:null/></sf:textBackground><sf:paragraphRuleWidth/><sf:paragraphStroke><sf:null/></sf:paragraphStroke><sf:bold/><sf:tracking/><sf:ligatures/><sf:language><sf:null/></sf:language><sf:followingParagraphStyle><sf:paragraphstyle-ref sfa:IDREF="SFWPParagraphStyle-7"/></sf:followingParagraphStyle><sf:outline/><sf:strikethruColor><sf:null/></sf:strikethruColor><sf:italic><sf:number sfa:number="1" sfa:type="c"/></sf:italic><sf:word_underline/><sf:widowControl/><sf:rightIndent/><sf:atsuFontFeatures/><sf:tabs/><sf:superscript/><sf:paragraphBorderType/><sf:hyphenate/><sf:hidden/><sf:pageBreakBefore/><sf:paragraphFill><sf:null/></sf:paragraphFill><sf:spaceBefore/><sf:keepWithNext/><sf:outlineColor><sf:null/></sf:outlineColor><sf:paragraphRuleOffset/><sf:capitalization/><sf:leftIndent/><sf:firstLineIndent/></sf:property-map></sf:paragraphstyle><sf:paragraphstyle sfa:ID="SFWPParagraphStyle-17" sf:name="itemizedlist1" sf:ident="paragraph-style-29"><sf:property-map><sf:fontSize/><sf:word_strikethrough/><sf:spaceAfter/><sf:alignment/><sf:keepLinesTogether/><sf:listStyle><sf:liststyle sfa:ID="SFWPListStyle-4" sf:name="Bullet" sf:ident="list-style-2"><sf:property-map><sf:listTextIndents><sf:array sfa:ID="NSArray-15"><sf:number sfa:number="9" sfa:type="f"/><sf:number sfa:number="9" sfa:type="f"/><sf:number sfa:number="9" sfa:type="f"/><sf:number sfa:number="9" sfa:type="f"/><sf:number sfa:number="9" sfa:type="f"/><sf:number sfa:number="9" sfa:type="f"/><sf:number sfa:number="9" sfa:type="f"/><sf:number sfa:number="9" sfa:type="f"/><sf:number sfa:number="9" sfa:type="f"/></sf:array></sf:listTextIndents><sf:listLabelGeometries><sf:array sfa:ID="NSArray-16"><sf:list-label-geometry sfa:ID="SFWPListLabelGeometry-27" sf:align="left" sf:scale="1" sf:offset="-1" sf:scale-with-text="true"/><sf:list-label-geometry sfa:ID="SFWPListLabelGeometry-28" sf:align="left" sf:scale="1" sf:offset="-1" sf:scale-with-text="true"/><sf:list-label-geometry sfa:ID="SFWPListLabelGeometry-29" sf:align="left" sf:scale="1" sf:offset="-1" sf:scale-with-text="true"/><sf:list-label-geometry sfa:ID="SFWPListLabelGeometry-30" sf:align="left" sf:scale="1" sf:offset="-1" sf:scale-with-text="true"/><sf:list-label-geometry sfa:ID="SFWPListLabelGeometry-31" sf:align="left" sf:scale="1" sf:offset="-1" sf:scale-with-text="true"/><sf:list-label-geometry sfa:ID="SFWPListLabelGeometry-32" sf:align="left" sf:scale="1" sf:offset="-1" sf:scale-with-text="true"/><sf:list-label-geometry sfa:ID="SFWPListLabelGeometry-33" sf:align="left" sf:scale="1" sf:offset="-1" sf:scale-with-text="true"/><sf:list-label-geometry sfa:ID="SFWPListLabelGeometry-34" sf:align="left" sf:scale="1" sf:offset="-1" sf:scale-with-text="true"/><sf:list-label-geometry sfa:ID="SFWPListLabelGeometry-35" sf:align="left" sf:scale="1" sf:offset="-1" sf:scale-with-text="true"/></sf:array></sf:listLabelGeometries><sf:listLabelIndents><sf:array sfa:ID="NSArray-17"><sf:number sfa:number="0" sfa:type="f"/><sf:number sfa:number="18" sfa:type="f"/><sf:number sfa:number="36" sfa:type="f"/><sf:number sfa:number="54" sfa:type="f"/><sf:number sfa:number="72" sfa:type="f"/><sf:number sfa:number="90" sfa:type="f"/><sf:number sfa:number="108" sfa:type="f"/><sf:number sfa:number="126" sfa:type="f"/><sf:number sfa:number="144" sfa:type="f"/></sf:array></sf:listLabelIndents><sf:listLabelTypes><sf:array sfa:ID="NSArray-18"><sf:list-label-typeinfo sfa:ID="SFWPListLabelTypeInfo-27" sf:type="text"><sf:text-label sfa:ID="SFWPTextLabelFormat-9" sf:type="bullet" sf:format="&#x2022;" sf:first="0"/></sf:list-label-typeinfo><sf:list-label-typeinfo sfa:ID="SFWPListLabelTypeInfo-28" sf:type="text"><sf:text-label sfa:ID="SFWPTextLabelFormat-10" sf:type="bullet" sf:format="&#x2022;" sf:first="0"/></sf:list-label-typeinfo><sf:list-label-typeinfo sfa:ID="SFWPListLabelTypeInfo-29" sf:type="text"><sf:text-label sfa:ID="SFWPTextLabelFormat-11" sf:type="bullet" sf:format="&#x2022;" sf:first="0"/></sf:list-label-typeinfo><sf:list-label-typeinfo sfa:ID="SFWPListLabelTypeInfo-30" sf:type="text"><sf:text-label sfa:ID="SFWPTextLabelFormat-12" sf:type="bullet" sf:format="&#x2022;" sf:first="0"/></sf:list-label-typeinfo><sf:list-label-typeinfo sfa:ID="SFWPListLabelTypeInfo-31" sf:type="text"><sf:text-label sfa:ID="SFWPTextLabelFormat-13" sf:type="bullet" sf:format="&#x2022;" sf:first="0"/></sf:list-label-typeinfo><sf:list-label-typeinfo sfa:ID="SFWPListLabelTypeInfo-32" sf:type="text"><sf:text-label sfa:ID="SFWPTextLabelFormat-14" sf:type="bullet" sf:format="&#x2022;" sf:first="0"/></sf:list-label-typeinfo><sf:list-label-typeinfo sfa:ID="SFWPListLabelTypeInfo-33" sf:type="text"><sf:text-label sfa:ID="SFWPTextLabelFormat-15" sf:type="bullet" sf:format="&#x2022;" sf:first="0"/></sf:list-label-typeinfo><sf:list-label-typeinfo sfa:ID="SFWPListLabelTypeInfo-34" sf:type="text"><sf:text-label sfa:ID="SFWPTextLabelFormat-16" sf:type="bullet" sf:format="&#x2022;" sf:first="0"/></sf:list-label-typeinfo><sf:list-label-typeinfo sfa:ID="SFWPListLabelTypeInfo-35" sf:type="text"><sf:text-label sfa:ID="SFWPTextLabelFormat-17" sf:type="bullet" sf:format="&#x2022;" sf:first="0"/></sf:list-label-typeinfo></sf:array></sf:listLabelTypes></sf:property-map></sf:liststyle></sf:listStyle><sf:outlineLevel/><sf:firstTopicNumber/><sf:underline/><sf:defaultTabStops><sf:number sfa:number="28.34646" sfa:type="f"/></sf:defaultTabStops><sf:underlineWidth/><sf:dropCap/><sf:fontName/><sf:strikethru/><sf:baselineShift/><sf:lineSpacing/><sf:textShadow/><sf:underlineColor><sf:null/></sf:underlineColor><sf:kerning/><sf:strikethruWidth/><sf:fontColor/><sf:textBackground><sf:null/></sf:textBackground><sf:paragraphRuleWidth/><sf:paragraphStroke><sf:null/></sf:paragraphStroke><sf:bold/><sf:tracking/><sf:ligatures/><sf:language><sf:null/></sf:language><sf:followingParagraphStyle><sf:null/></sf:followingParagraphStyle><sf:outline/><sf:strikethruColor><sf:null/></sf:strikethruColor><sf:italic/><sf:word_underline/><sf:widowControl/><sf:rightIndent/><sf:atsuFontFeatures/><sf:tabs/><sf:superscript/><sf:paragraphBorderType/><sf:hyphenate/><sf:hidden/><sf:pageBreakBefore/><sf:paragraphFill><sf:null/></sf:paragraphFill><sf:spaceBefore/><sf:keepWithNext/><sf:outlineColor><sf:null/></sf:outlineColor><sf:paragraphRuleOffset/><sf:capitalization/><sf:leftIndent/><sf:firstLineIndent/></sf:property-map></sf:paragraphstyle><sf:paragraphstyle sfa:ID="SFWPParagraphStyle-18" sf:name="important" sf:ident="paragraph-style-25"><sf:property-map><sf:fontSize/><sf:word_strikethrough/><sf:spaceAfter><sf:number sfa:number="12" sfa:type="f"/></sf:spaceAfter><sf:alignment/><sf:keepLinesTogether/><sf:listStyle><sf:liststyle sfa:ID="SFWPListStyle-5" sf:parent-ident="list-style-default"><sf:property-map><sf:listTextIndents><sf:array sfa:ID="NSArray-19"><sf:number sfa:number="28.34646" sfa:type="f"/><sf:number sfa:number="36" sfa:type="f"/><sf:number sfa:number="72" sfa:type="f"/><sf:number sfa:number="108" sfa:type="f"/><sf:number sfa:number="144" sfa:type="f"/><sf:number sfa:number="180" sfa:type="f"/><sf:number sfa:number="216" sfa:type="f"/><sf:number sfa:number="252" sfa:type="f"/><sf:number sfa:number="288" sfa:type="f"/></sf:array></sf:listTextIndents><sf:labelCharacterStyle1><sf:characterstyle sfa:ID="SFWPCharacterStyle-4" sf:parent-ident="character-style-null"><sf:property-map><sf:fontName/></sf:property-map></sf:characterstyle></sf:labelCharacterStyle1><sf:listLabelGeometries><sf:array sfa:ID="NSArray-20"><sf:list-label-geometry sfa:ID="SFWPListLabelGeometry-36" sf:align="left" sf:scale="1" sf:offset="0" sf:scale-with-text="true"/><sf:list-label-geometry sfa:ID="SFWPListLabelGeometry-37" sf:align="left" sf:scale="1" sf:offset="0" sf:scale-with-text="true"/><sf:list-label-geometry sfa:ID="SFWPListLabelGeometry-38" sf:align="left" sf:scale="1" sf:offset="0" sf:scale-with-text="true"/><sf:list-label-geometry sfa:ID="SFWPListLabelGeometry-39" sf:align="left" sf:scale="1" sf:offset="0" sf:scale-with-text="true"/><sf:list-label-geometry sfa:ID="SFWPListLabelGeometry-40" sf:align="left" sf:scale="1" sf:offset="0" sf:scale-with-text="true"/><sf:list-label-geometry sfa:ID="SFWPListLabelGeometry-41" sf:align="left" sf:scale="1" sf:offset="0" sf:scale-with-text="true"/><sf:list-label-geometry sfa:ID="SFWPListLabelGeometry-42" sf:align="left" sf:scale="1" sf:offset="0" sf:scale-with-text="true"/><sf:list-label-geometry sfa:ID="SFWPListLabelGeometry-43" sf:align="left" sf:scale="1" sf:offset="0" sf:scale-with-text="true"/><sf:list-label-geometry sfa:ID="SFWPListLabelGeometry-44" sf:align="left" sf:scale="1" sf:offset="0" sf:scale-with-text="true"/></sf:array></sf:listLabelGeometries><sf:listLabelIndents><sf:array sfa:ID="NSArray-21"><sf:number sfa:number="0" sfa:type="f"/><sf:number sfa:number="0" sfa:type="f"/><sf:number sfa:number="0" sfa:type="f"/><sf:number sfa:number="0" sfa:type="f"/><sf:number sfa:number="0" sfa:type="f"/><sf:number sfa:number="0" sfa:type="f"/><sf:number sfa:number="0" sfa:type="f"/><sf:number sfa:number="0" sfa:type="f"/><sf:number sfa:number="0" sfa:type="f"/></sf:array></sf:listLabelIndents><sf:listLabelTypes><sf:array sfa:ID="NSArray-22"><sf:list-label-typeinfo sfa:ID="SFWPListLabelTypeInfo-36" sf:type="text"><sf:text-label sfa:ID="SFWPTextLabelFormat-18" sf:type="bullet" sf:format="!" sf:first="0"/></sf:list-label-typeinfo><sf:list-label-typeinfo sfa:ID="SFWPListLabelTypeInfo-37" sf:type="none"/><sf:list-label-typeinfo sfa:ID="SFWPListLabelTypeInfo-38" sf:type="none"/><sf:list-label-typeinfo sfa:ID="SFWPListLabelTypeInfo-39" sf:type="none"/><sf:list-label-typeinfo sfa:ID="SFWPListLabelTypeInfo-40" sf:type="none"/><sf:list-label-typeinfo sfa:ID="SFWPListLabelTypeInfo-41" sf:type="none"/><sf:list-label-typeinfo sfa:ID="SFWPListLabelTypeInfo-42" sf:type="none"/><sf:list-label-typeinfo sfa:ID="SFWPListLabelTypeInfo-43" sf:type="none"/><sf:list-label-typeinfo sfa:ID="SFWPListLabelTypeInfo-44" sf:type="none"/></sf:array></sf:listLabelTypes></sf:property-map></sf:liststyle></sf:listStyle><sf:outlineLevel/><sf:firstTopicNumber/><sf:underline/><sf:defaultTabStops><sf:number sfa:number="28.34646" sfa:type="f"/></sf:defaultTabStops><sf:underlineWidth/><sf:dropCap/><sf:fontName/><sf:strikethru/><sf:baselineShift/><sf:lineSpacing/><sf:textShadow/><sf:underlineColor><sf:null/></sf:underlineColor><sf:kerning/><sf:strikethruWidth/><sf:fontColor><sf:color xsi:type="sfa:calibrated-rgb-color-type" sfa:r="0" sfa:g="0" sfa:b="1" sfa:a="1"/></sf:fontColor><sf:textBackground><sf:null/></sf:textBackground><sf:paragraphRuleWidth/><sf:paragraphStroke><sf:null/></sf:paragraphStroke><sf:bold/><sf:tracking/><sf:ligatures/><sf:language><sf:null/></sf:language><sf:followingParagraphStyle><sf:null/></sf:followingParagraphStyle><sf:outline/><sf:strikethruColor><sf:null/></sf:strikethruColor><sf:italic/><sf:word_underline/><sf:widowControl/><sf:rightIndent/><sf:atsuFontFeatures/><sf:tabs/><sf:superscript/><sf:paragraphBorderType/><sf:hyphenate/><sf:hidden/><sf:pageBreakBefore/><sf:paragraphFill><sf:null/></sf:paragraphFill><sf:spaceBefore/><sf:keepWithNext/><sf:outlineColor><sf:null/></sf:outlineColor><sf:paragraphRuleOffset/><sf:capitalization/><sf:leftIndent/><sf:firstLineIndent/></sf:property-map></sf:paragraphstyle><sf:characterstyle sfa:ID="SFWPCharacterStyle-5" sf:name="attributes" sf:ident="character-style-3"><sf:property-map><sf:italic/><sf:fontColor/><sf:fontSize/><sf:atsuFontFeatures/><sf:superscript/><sf:underline/><sf:bold/><sf:tracking/><sf:ligatures/><sf:fontName><sf:string sfa:string="Courier"/></sf:fontName><sf:strikethru/><sf:capitalization/><sf:textShadow/><sf:baselineShift/><sf:language><sf:string sfa:string="en"/></sf:language><sf:underlineColor><sf:null/></sf:underlineColor><sf:strikethruColor><sf:null/></sf:strikethruColor></sf:property-map></sf:characterstyle><sf:characterstyle sfa:ID="SFWPCharacterStyle-6" sf:name="contrib" sf:ident="character-style-6"><sf:property-map><sf:italic><sf:number sfa:number="1" sfa:type="i"/></sf:italic><sf:fontColor/><sf:fontSize/><sf:atsuFontFeatures/><sf:superscript/><sf:underline/><sf:bold/><sf:tracking/><sf:ligatures/><sf:fontName/><sf:strikethru/><sf:capitalization/><sf:textShadow/><sf:baselineShift/><sf:language><sf:string sfa:string="en"/></sf:language><sf:underlineColor><sf:null/></sf:underlineColor><sf:strikethruColor><sf:null/></sf:strikethruColor></sf:property-map></sf:characterstyle><sf:paragraphstyle sfa:ID="SFWPParagraphStyle-19" sf:name="formalpara" sf:ident="paragraph-style-22"><sf:property-map><sf:fontSize/><sf:word_strikethrough/><sf:spaceAfter><sf:number sfa:number="12" sfa:type="f"/></sf:spaceAfter><sf:alignment/><sf:keepLinesTogether/><sf:listStyle><sf:liststyle-ref sfa:IDREF="SFWPListStyle-2"/></sf:listStyle><sf:outlineLevel/><sf:firstTopicNumber/><sf:underline/><sf:defaultTabStops><sf:number sfa:number="28.34646" sfa:type="f"/></sf:defaultTabStops><sf:underlineWidth/><sf:dropCap/><sf:fontName/><sf:strikethru/><sf:baselineShift/><sf:lineSpacing/><sf:textShadow/><sf:underlineColor><sf:null/></sf:underlineColor><sf:kerning/><sf:strikethruWidth/><sf:fontColor/><sf:textBackground><sf:null/></sf:textBackground><sf:paragraphRuleWidth/><sf:paragraphStroke><sf:null/></sf:paragraphStroke><sf:bold/><sf:tracking/><sf:ligatures/><sf:language><sf:null/></sf:language><sf:followingParagraphStyle><sf:null/></sf:followingParagraphStyle><sf:outline/><sf:strikethruColor><sf:null/></sf:strikethruColor><sf:italic/><sf:word_underline/><sf:widowControl/><sf:rightIndent/><sf:atsuFontFeatures/><sf:tabs/><sf:superscript/><sf:paragraphBorderType/><sf:hyphenate/><sf:hidden/><sf:pageBreakBefore/><sf:paragraphFill><sf:null/></sf:paragraphFill><sf:spaceBefore/><sf:keepWithNext/><sf:outlineColor><sf:null/></sf:outlineColor><sf:paragraphRuleOffset/><sf:capitalization/><sf:leftIndent/><sf:firstLineIndent/></sf:property-map></sf:paragraphstyle><sf:graphic-style sfa:ID="SFDGraphicStyle-6" sf:ident="kSFTErrorWarningBubbleStyleID"><sf:property-map><sf:stroke><sf:stroke sfa:ID="SFRStroke-10" sf:miter-limit="4" sf:width="1" sf:cap="butt" sf:join="miter"><sf:color xsi:type="sfa:calibrated-rgb-color-type" sfa:r="0.75290000438690186" sfa:g="0.75290000438690186" sfa:b="0.75290000438690186" sfa:a="1"/><sf:pattern sfa:ID="SFRStrokePattern-10" sf:phase="0" sf:type="solid"><sf:pattern/></sf:pattern></sf:stroke></sf:stroke><sf:opacity><sf:number sfa:number="1" sfa:type="f"/></sf:opacity><sf:layoutStyle><sf:layoutstyle sfa:ID="SFWPLayoutStyle-6" sf:ident="kSFTErrorWarningLayoutStyleID" sf:parent-ident="layout-style-default"><sf:property-map><sf:verticalAlignment><sf:null/></sf:verticalAlignment><sf:padding/><sf:layoutParagraphStyle><sf:paragraphstyle sfa:ID="SFWPParagraphStyle-20" sf:ident="kSFTErrorWarningParagraphStyleID" sf:parent-ident="paragraph-style-default"><sf:property-map><sf:fontColor/><sf:alignment/><sf:listStyle><sf:liststyle sfa:ID="SFWPListStyle-6" sf:ident="kSFTErrorWarningListStyleID" sf:parent-ident="list-style-default"><sf:property-map/></sf:liststyle></sf:listStyle><sf:keepLinesTogether><sf:number sfa:number="1" sfa:type="c"/></sf:keepLinesTogether><sf:fontName><sf:string sfa:string="LucidaGrande"/></sf:fontName><sf:fontSize><sf:number sfa:number="11" sfa:type="f"/></sf:fontSize></sf:property-map></sf:paragraphstyle></sf:layoutParagraphStyle></sf:property-map></sf:layoutstyle></sf:layoutStyle><sf:fill><sf:angle-gradient sfa:ID="SFRAngleGradient-1" sf:opacity="1" sf:type="linear" sf:angle="-1.5707963705062866"><sf:stops sfa:ID="NSMutableArray-1"><sf:gradient-stop sfa:ID="SFRGradientStop-2" sf:fraction="0"><sf:color xsi:type="sfa:calibrated-rgb-color-type" sfa:r="0.96859997510910034" sfa:g="0.96859997510910034" sfa:b="0.96859997510910034" sfa:a="0.95999997854232788"/></sf:gradient-stop><sf:gradient-stop sfa:ID="SFRGradientStop-3" sf:fraction="1"><sf:color xsi:type="sfa:calibrated-rgb-color-type" sfa:r="0.81959998607635498" sfa:g="0.81959998607635498" sfa:b="0.81959998607635498" sfa:a="0.95999997854232788"/></sf:gradient-stop></sf:stops></sf:angle-gradient></sf:fill><sf:reflection><sf:null/></sf:reflection><sf:shadow><sf:shadow sfa:ID="SFRShadow-2" sf:angle="90" sf:offset="2" sf:radius="2" sf:opacity="0.30000001192092896"><sf:color xsi:type="sfa:calibrated-white-color-type" sfa:w="0" sfa:a="1"/></sf:shadow></sf:shadow></sf:property-map></sf:graphic-style><sf:paragraphstyle sfa:ID="SFWPParagraphStyle-21" sf:name="blockquote-title" sf:ident="paragraph-style-13"><sf:property-map><sf:fontSize/><sf:word_strikethrough/><sf:spaceAfter><sf:number sfa:number="12" sfa:type="f"/></sf:spaceAfter><sf:alignment/><sf:keepLinesTogether/><sf:listStyle><sf:liststyle-ref sfa:IDREF="SFWPListStyle-2"/></sf:listStyle><sf:outlineLevel/><sf:firstTopicNumber/><sf:underline/><sf:defaultTabStops><sf:number sfa:number="28.34646" sfa:type="f"/></sf:defaultTabStops><sf:underlineWidth/><sf:dropCap/><sf:fontName/><sf:strikethru/><sf:baselineShift/><sf:lineSpacing/><sf:textShadow/><sf:underlineColor><sf:null/></sf:underlineColor><sf:kerning/><sf:strikethruWidth/><sf:fontColor/><sf:textBackground><sf:null/></sf:textBackground><sf:paragraphRuleWidth/><sf:paragraphStroke><sf:null/></sf:paragraphStroke><sf:bold><sf:number sfa:number="1" sfa:type="i"/></sf:bold><sf:tracking/><sf:ligatures/><sf:language><sf:null/></sf:language><sf:followingParagraphStyle><sf:null/></sf:followingParagraphStyle><sf:outline/><sf:strikethruColor><sf:null/></sf:strikethruColor><sf:italic/><sf:word_underline/><sf:widowControl/><sf:rightIndent/><sf:atsuFontFeatures/><sf:tabs/><sf:superscript/><sf:paragraphBorderType/><sf:hyphenate/><sf:hidden/><sf:pageBreakBefore/><sf:paragraphFill><sf:null/></sf:paragraphFill><sf:spaceBefore/><sf:keepWithNext/><sf:outlineColor><sf:null/></sf:outlineColor><sf:paragraphRuleOffset/><sf:capitalization/><sf:leftIndent/><sf:firstLineIndent/></sf:property-map></sf:paragraphstyle><sf:chart-series-style sfa:ID="SFCSeriesStyle-0" sf:name="Series_0" sf:ident="Series_0" sf:seriesIndex="0"><sf:property-map><sf:SFC2DPieFillProperty><sf:color xsi:type="sfa:calibrated-rgb-color-type" sfa:r="0.17647059261798859" sfa:g="0" sfa:b="0.22352941334247589" sfa:a="1"/></sf:SFC2DPieFillProperty><sf:SFCBarValueLabelPositionProperty><sf:number sfa:number="0" sfa:type="i"/></sf:SFCBarValueLabelPositionProperty><sf:SFC3DColumnFillProperty><sf:color xsi:type="sfa:calibrated-rgb-color-type" sfa:r="0.17647059261798859" sfa:g="0" sfa:b="0.22352941334247589" sfa:a="1"/></sf:SFC3DColumnFillProperty><sf:SFC2DAreaUseSeriesFillForDataPointFillProperty><sf:number sfa:number="1" sfa:type="c"/></sf:SFC2DAreaUseSeriesFillForDataPointFillProperty><sf:SFC2DLineUseSeriesFillForDataPointFillProperty><sf:number sfa:number="0" sfa:type="c"/></sf:SFC2DLineUseSeriesFillForDataPointFillProperty><sf:SFC3DAreaFillProperty><sf:color xsi:type="sfa:calibrated-rgb-color-type" sfa:r="0.17647059261798859" sfa:g="0" sfa:b="0.22352941334247589" sfa:a="1"/></sf:SFC3DAreaFillProperty><sf:SFCAreaShowValueLabelProperty><sf:number sfa:number="0" sfa:type="c"/></sf:SFCAreaShowValueLabelProperty><sf:SFCLabelShadowProperty><sf:shadow sfa:ID="SFRShadow-3" sf:angle="45" sf:offset="2" sf:radius="2" sf:opacity="0.75"><sf:color xsi:type="sfa:calibrated-white-color-type" sfa:w="0" sfa:a="1"/></sf:shadow></sf:SFCLabelShadowProperty><sf:SFC2DLineDataPointSymbolProperty><sf:number sfa:number="1" sfa:type="i"/></sf:SFC2DLineDataPointSymbolProperty><sf:SFC2DPieStrokeProperty><sf:stroke sfa:ID="SFRStroke-11" sf:miter-limit="4" sf:width="1" sf:cap="butt" sf:join="miter"><sf:color xsi:type="sfa:calibrated-white-color-type" sfa:w="1" sfa:a="1"/><sf:pattern sfa:ID="SFRStrokePattern-11" sf:phase="0" sf:type="empty"><sf:pattern/></sf:pattern></sf:stroke></sf:SFC2DPieStrokeProperty><sf:SFC2DScatterShadowProperty><sf:shadow-ref sfa:IDREF="SFRShadow-0"/></sf:SFC2DScatterShadowProperty><sf:SFC2DAreaFillProperty><sf:color xsi:type="sfa:calibrated-rgb-color-type" sfa:r="0.17647059261798859" sfa:g="0" sfa:b="0.22352941334247589" sfa:a="1"/></sf:SFC2DAreaFillProperty><sf:SFC2DLineDataPointFillProperty><sf:color xsi:type="sfa:calibrated-white-color-type" sfa:w="1" sfa:a="1"/></sf:SFC2DLineDataPointFillProperty><sf:SFC3DPieFillProperty><sf:color xsi:type="sfa:calibrated-rgb-color-type" sfa:r="0.17647059261798859" sfa:g="0" sfa:b="0.22352941334247589" sfa:a="1"/></sf:SFC3DPieFillProperty><sf:SFC2DLineStrokeProperty><sf:stroke sfa:ID="SFRStroke-12" sf:miter-limit="4" sf:width="4" sf:cap="butt" sf:join="miter"><sf:color xsi:type="sfa:calibrated-rgb-color-type" sfa:r="0.17647059261798859" sfa:g="0" sfa:b="0.22352941334247589" sfa:a="1"/><sf:pattern sfa:ID="SFRStrokePattern-12" sf:phase="0" sf:type="solid"><sf:pattern/></sf:pattern></sf:stroke></sf:SFC2DLineStrokeProperty><sf:SFC2DScatterStrokeProperty><sf:stroke sfa:ID="SFRStroke-13" sf:miter-limit="4" sf:width="4" sf:cap="butt" sf:join="miter"><sf:color xsi:type="sfa:calibrated-rgb-color-type" sfa:r="0.17647059261798859" sfa:g="0" sfa:b="0.22352941334247589" sfa:a="1"/><sf:pattern sfa:ID="SFRStrokePattern-13" sf:phase="0" sf:type="empty"><sf:pattern/></sf:pattern></sf:stroke></sf:SFC2DScatterStrokeProperty><sf:SFC3DSeriesShininessProperty><sf:number sfa:number="0.5" sfa:type="f"/></sf:SFC3DSeriesShininessProperty><sf:SFC2DAreaDataPointSymbolProperty><sf:number sfa:number="0" sfa:type="i"/></sf:SFC2DAreaDataPointSymbolProperty><sf:SFC2DAreaUseStrokeColorForDataPointFillProperty><sf:number sfa:number="0" sfa:type="c"/></sf:SFC2DAreaUseStrokeColorForDataPointFillProperty><sf:SFC3DSeriesEmissiveColorProperty><sf:color xsi:type="sfa:calibrated-rgb-color-type" sfa:r="0" sfa:g="0" sfa:b="0" sfa:a="1"/></sf:SFC3DSeriesEmissiveColorProperty><sf:SFC3DTextureTilingProperty><sf:number sfa:number="1" sfa:type="f"/></sf:SFC3DTextureTilingProperty><sf:SFC2DLineShadowProperty><sf:shadow-ref sfa:IDREF="SFRShadow-0"/></sf:SFC2DLineShadowProperty><sf:SFCPieSeriesValueParagraphStyleProperty><sf:paragraphstyle sfa:ID="SFWPParagraphStyle-22" sf:ident="Series_0_SFCPieSeriesValueParagraphStyleProperty" sf:parent-ident="chart-paragraph-style-default"><sf:property-map><sf:outline/><sf:italic/><sf:strikethruColor><sf:null/></sf:strikethruColor><sf:word_underline/><sf:decimalTab/><sf:word_strikethrough/><sf:keepLinesTogether/><sf:spaceAfter/><sf:alignment><sf:number sfa:number="2" sfa:type="i"/></sf:alignment><sf:fontSize><sf:number sfa:number="16" sfa:type="f"/></sf:fontSize><sf:widowControl/><sf:rightIndent/><sf:atsuFontFeatures/><sf:tabs/><sf:dropCap/><sf:underline/><sf:underlineWidth/><sf:defaultTabStops/><sf:tocStyle><sf:null/></sf:tocStyle><sf:firstTopicNumber/><sf:outlineLevel/><sf:fontName/><sf:strikethru/><sf:baselineShift/><sf:lineSpacing/><sf:textShadow/><sf:superscript/><sf:hyphenate/><sf:underlineColor><sf:null/></sf:underlineColor><sf:hidden/><sf:showInTOC/><sf:kerning/><sf:pageBreakBefore/><sf:strikethruWidth/><sf:fontColor><sf:color xsi:type="sfa:calibrated-white-color-type" sfa:w="1" sfa:a="1"/></sf:fontColor><sf:paragraphFill><sf:null/></sf:paragraphFill><sf:spaceBefore/><sf:keepWithNext/><sf:outlineColor><sf:null/></sf:outlineColor><sf:paragraphStroke><sf:null/></sf:paragraphStroke><sf:bold/><sf:tracking/><sf:ligatures/><sf:capitalization/><sf:language><sf:null/></sf:language><sf:followingParagraphStyle><sf:null/></sf:followingParagraphStyle><sf:leftIndent/><sf:firstLineIndent/></sf:property-map></sf:paragraphstyle></sf:SFCPieSeriesValueParagraphStyleProperty><sf:SFCStackedBarValueLabelPositionProperty><sf:number sfa:number="0" sfa:type="i"/></sf:SFCStackedBarValueLabelPositionProperty><sf:SFC2DColumnFillProperty><sf:color xsi:type="sfa:calibrated-rgb-color-type" sfa:r="0.17647059261798859" sfa:g="0" sfa:b="0.22352941334247589" sfa:a="1"/></sf:SFC2DColumnFillProperty><sf:SFC3DBarFillProperty><sf:color xsi:type="sfa:calibrated-rgb-color-type" sfa:r="0.17647059261798859" sfa:g="0" sfa:b="0.22352941334247589" sfa:a="1"/></sf:SFC3DBarFillProperty><sf:SFC2DBarStrokeProperty><sf:stroke sfa:ID="SFRStroke-14" sf:miter-limit="4" sf:width="1" sf:cap="butt" sf:join="miter"><sf:color xsi:type="sfa:calibrated-white-color-type" sfa:w="1" sfa:a="1"/><sf:pattern sfa:ID="SFRStrokePattern-14" sf:phase="0" sf:type="empty"><sf:pattern/></sf:pattern></sf:stroke></sf:SFC2DBarStrokeProperty><sf:SFCLabelOpacityProperty><sf:number sfa:number="1" sfa:type="f"/></sf:SFCLabelOpacityProperty><sf:SFC2DPieShadowProperty><sf:shadow-ref sfa:IDREF="SFRShadow-0"/></sf:SFC2DPieShadowProperty><sf:SFCPieShowValueLabelProperty><sf:number sfa:number="1" sfa:type="c"/></sf:SFCPieShowValueLabelProperty><sf:SFCPieShowSeriesNameLabelProperty><sf:number sfa:number="0" sfa:type="c"/></sf:SFCPieShowSeriesNameLabelProperty><sf:SFCLineSeriesValueParagraphStyleProperty><sf:paragraphstyle sfa:ID="SFWPParagraphStyle-23" sf:ident="Series_0_SFCLineSeriesValueParagraphStyleProperty" sf:parent-ident="chart-paragraph-style-default"><sf:property-map><sf:outline/><sf:italic/><sf:strikethruColor><sf:null/></sf:strikethruColor><sf:word_underline/><sf:decimalTab/><sf:word_strikethrough/><sf:keepLinesTogether/><sf:spaceAfter/><sf:alignment/><sf:fontSize><sf:number sfa:number="14" sfa:type="f"/></sf:fontSize><sf:widowControl/><sf:rightIndent/><sf:atsuFontFeatures/><sf:tabs/><sf:dropCap/><sf:underline/><sf:underlineWidth/><sf:defaultTabStops/><sf:tocStyle><sf:null/></sf:tocStyle><sf:firstTopicNumber/><sf:outlineLevel/><sf:fontName/><sf:strikethru/><sf:baselineShift/><sf:lineSpacing/><sf:textShadow/><sf:superscript/><sf:hyphenate/><sf:underlineColor><sf:null/></sf:underlineColor><sf:hidden/><sf:showInTOC/><sf:kerning/><sf:pageBreakBefore/><sf:strikethruWidth/><sf:fontColor/><sf:paragraphFill><sf:null/></sf:paragraphFill><sf:spaceBefore/><sf:keepWithNext/><sf:outlineColor><sf:null/></sf:outlineColor><sf:paragraphStroke><sf:null/></sf:paragraphStroke><sf:bold/><sf:tracking/><sf:ligatures/><sf:capitalization/><sf:language><sf:null/></sf:language><sf:followingParagraphStyle><sf:null/></sf:followingParagraphStyle><sf:leftIndent/><sf:firstLineIndent/></sf:property-map></sf:paragraphstyle></sf:SFCLineSeriesValueParagraphStyleProperty><sf:SFC2DOpacityProperty><sf:number sfa:number="1" sfa:type="f"/></sf:SFC2DOpacityProperty><sf:SFCLineValueLabelPositionProperty><sf:number sfa:number="4" sfa:type="i"/></sf:SFCLineValueLabelPositionProperty><sf:SFCPieValueLabelPositionProperty><sf:number sfa:number="13" sfa:type="i"/></sf:SFCPieValueLabelPositionProperty><sf:SFCLineShowValueLabelProperty><sf:number sfa:number="0" sfa:type="c"/></sf:SFCLineShowValueLabelProperty><sf:SFC2DAreaDataPointFillProperty><sf:color xsi:type="sfa:calibrated-white-color-type" sfa:w="1" sfa:a="1"/></sf:SFC2DAreaDataPointFillProperty><sf:SFCStackedAreaValueLabelPositionProperty><sf:number sfa:number="10" sfa:type="i"/></sf:SFCStackedAreaValueLabelPositionProperty><sf:SFC2DAreaShadowProperty><sf:shadow-ref sfa:IDREF="SFRShadow-0"/></sf:SFC2DAreaShadowProperty><sf:SFC3DSeriesSpecularColorProperty><sf:color xsi:type="sfa:calibrated-rgb-color-type" sfa:r="0.89999997615814209" sfa:g="0.89999997615814209" sfa:b="0.89999997615814209" sfa:a="1"/></sf:SFC3DSeriesSpecularColorProperty><sf:SFC2DScatterDataPointSymbolProperty><sf:number sfa:number="1" sfa:type="i"/></sf:SFC2DScatterDataPointSymbolProperty><sf:SFC2DBarShadowProperty><sf:shadow-ref sfa:IDREF="SFRShadow-0"/></sf:SFC2DBarShadowProperty><sf:SFCBarSeriesValueParagraphStyleProperty><sf:paragraphstyle sfa:ID="SFWPParagraphStyle-24" sf:ident="Series_0_SFCBarSeriesValueParagraphStyleProperty" sf:parent-ident="chart-paragraph-style-default"><sf:property-map><sf:outline/><sf:italic/><sf:strikethruColor><sf:null/></sf:strikethruColor><sf:word_underline/><sf:decimalTab/><sf:word_strikethrough/><sf:keepLinesTogether/><sf:spaceAfter/><sf:alignment/><sf:fontSize><sf:number sfa:number="14" sfa:type="i"/></sf:fontSize><sf:widowControl/><sf:rightIndent/><sf:atsuFontFeatures/><sf:tabs/><sf:dropCap/><sf:underline/><sf:underlineWidth/><sf:defaultTabStops/><sf:tocStyle><sf:null/></sf:tocStyle><sf:firstTopicNumber/><sf:outlineLevel/><sf:fontName/><sf:strikethru/><sf:baselineShift/><sf:lineSpacing/><sf:textShadow/><sf:superscript/><sf:hyphenate/><sf:underlineColor><sf:null/></sf:underlineColor><sf:hidden/><sf:showInTOC/><sf:kerning/><sf:pageBreakBefore/><sf:strikethruWidth/><sf:fontColor><sf:color xsi:type="sfa:calibrated-white-color-type" sfa:w="1" sfa:a="1"/></sf:fontColor><sf:paragraphFill><sf:null/></sf:paragraphFill><sf:spaceBefore/><sf:keepWithNext/><sf:outlineColor><sf:null/></sf:outlineColor><sf:paragraphStroke><sf:null/></sf:paragraphStroke><sf:bold/><sf:tracking/><sf:ligatures/><sf:capitalization/><sf:language><sf:null/></sf:language><sf:followingParagraphStyle><sf:null/></sf:followingParagraphStyle><sf:leftIndent/><sf:firstLineIndent/></sf:property-map></sf:paragraphstyle></sf:SFCBarSeriesValueParagraphStyleProperty><sf:SFC2DScatterDataPointFillProperty><sf:color xsi:type="sfa:calibrated-rgb-color-type" sfa:r="0.17647059261798859" sfa:g="0" sfa:b="0.22352941334247589" sfa:a="1"/></sf:SFC2DScatterDataPointFillProperty><sf:SFC2DBarFillProperty><sf:color xsi:type="sfa:calibrated-rgb-color-type" sfa:r="0.17647059261798859" sfa:g="0" sfa:b="0.22352941334247589" sfa:a="1"/></sf:SFC2DBarFillProperty><sf:SFCBarShowValueLabelProperty><sf:number sfa:number="0" sfa:type="c"/></sf:SFCBarShowValueLabelProperty><sf:SFC2DAreaStrokeProperty><sf:stroke sfa:ID="SFRStroke-15" sf:miter-limit="4" sf:width="2" sf:cap="butt" sf:join="miter"><sf:color xsi:type="sfa:calibrated-white-color-type" sfa:w="1" sfa:a="1"/><sf:pattern sfa:ID="SFRStrokePattern-15" sf:phase="0" sf:type="empty"><sf:pattern/></sf:pattern></sf:stroke></sf:SFC2DAreaStrokeProperty><sf:SFCAreaValueLabelPositionProperty><sf:number sfa:number="10" sfa:type="i"/></sf:SFCAreaValueLabelPositionProperty><sf:SFC3DPieShadowProperty><sf:shadow sfa:ID="SFRShadow-4" sf:angle="45" sf:offset="1" sf:radius="6" sf:opacity="0.80000001192092896"><sf:color xsi:type="sfa:calibrated-white-color-type" sfa:w="0" sfa:a="1"/></sf:shadow></sf:SFC3DPieShadowProperty><sf:SFC3DTextureProperty><sf:string sfa:string=""/></sf:SFC3DTextureProperty><sf:SFCAreaSeriesValueParagraphStyleProperty><sf:paragraphstyle sfa:ID="SFWPParagraphStyle-25" sf:ident="Series_0_SFCAreaSeriesValueParagraphStyleProperty" sf:parent-ident="chart-paragraph-style-default"><sf:property-map><sf:outline/><sf:italic/><sf:strikethruColor><sf:null/></sf:strikethruColor><sf:word_underline/><sf:decimalTab/><sf:word_strikethrough/><sf:keepLinesTogether/><sf:spaceAfter/><sf:alignment/><sf:fontSize><sf:number sfa:number="14" sfa:type="i"/></sf:fontSize><sf:widowControl/><sf:rightIndent/><sf:atsuFontFeatures/><sf:tabs/><sf:dropCap/><sf:underline/><sf:underlineWidth/><sf:defaultTabStops/><sf:tocStyle><sf:null/></sf:tocStyle><sf:firstTopicNumber/><sf:outlineLevel/><sf:fontName/><sf:strikethru/><sf:baselineShift/><sf:lineSpacing/><sf:textShadow/><sf:superscript/><sf:hyphenate/><sf:underlineColor><sf:null/></sf:underlineColor><sf:hidden/><sf:showInTOC/><sf:kerning/><sf:pageBreakBefore/><sf:strikethruWidth/><sf:fontColor><sf:color xsi:type="sfa:calibrated-white-color-type" sfa:w="1" sfa:a="1"/></sf:fontColor><sf:paragraphFill><sf:null/></sf:paragraphFill><sf:spaceBefore/><sf:keepWithNext/><sf:outlineColor><sf:null/></sf:outlineColor><sf:paragraphStroke><sf:null/></sf:paragraphStroke><sf:bold/><sf:tracking/><sf:ligatures/><sf:capitalization/><sf:language><sf:null/></sf:language><sf:followingParagraphStyle><sf:null/></sf:followingParagraphStyle><sf:leftIndent/><sf:firstLineIndent/></sf:property-map></sf:paragraphstyle></sf:SFCAreaSeriesValueParagraphStyleProperty><sf:SFC2DLineUseStrokeColorForDataPointFillProperty><sf:number sfa:number="0" sfa:type="c"/></sf:SFC2DLineUseStrokeColorForDataPointFillProperty><sf:SFC3DLineFillProperty><sf:color xsi:type="sfa:calibrated-rgb-color-type" sfa:r="0.17647059261798859" sfa:g="0" sfa:b="0.22352941334247589" sfa:a="1"/></sf:SFC3DLineFillProperty><sf:SFCPieWedgeExplosionProperty><sf:number sfa:number="0" sfa:type="f"/></sf:SFCPieWedgeExplosionProperty></sf:property-map></sf:chart-series-style><sf:paragraphstyle sfa:ID="SFWPParagraphStyle-26" sf:name="biblioentry-title" sf:ident="paragraph-style-104"><sf:property-map><sf:fontSize/><sf:word_strikethrough/><sf:spaceAfter/><sf:alignment/><sf:keepLinesTogether/><sf:listStyle><sf:liststyle-ref sfa:IDREF="SFWPListStyle-2"/></sf:listStyle><sf:outlineLevel/><sf:firstTopicNumber/><sf:underline/><sf:defaultTabStops><sf:number sfa:number="28.34646" sfa:type="f"/></sf:defaultTabStops><sf:tocStyle><sf:tocstyle-ref sfa:IDREF="SLTOCParagraphStyle-3"/></sf:tocStyle><sf:dropCap/><sf:underlineWidth/><sf:fontName><sf:string sfa:string="Helvetica-Bold"/></sf:fontName><sf:strikethru/><sf:baselineShift/><sf:lineSpacing/><sf:textShadow/><sf:underlineColor><sf:null/></sf:underlineColor><sf:showInTOC><sf:number sfa:number="1" sfa:type="c"/></sf:showInTOC><sf:kerning/><sf:strikethruWidth/><sf:fontColor/><sf:textBackground><sf:null/></sf:textBackground><sf:paragraphRuleWidth/><sf:paragraphStroke><sf:null/></sf:paragraphStroke><sf:bold><sf:number sfa:number="1" sfa:type="c"/></sf:bold><sf:tracking/><sf:ligatures/><sf:language><sf:null/></sf:language><sf:followingParagraphStyle><sf:paragraphstyle-ref sfa:IDREF="SFWPParagraphStyle-7"/></sf:followingParagraphStyle><sf:outline/><sf:strikethruColor><sf:null/></sf:strikethruColor><sf:italic><sf:number sfa:number="1" sfa:type="i"/></sf:italic><sf:word_underline/><sf:widowControl/><sf:rightIndent/><sf:atsuFontFeatures/><sf:tabs/><sf:superscript/><sf:paragraphBorderType/><sf:hyphenate/><sf:hidden/><sf:pageBreakBefore/><sf:paragraphFill><sf:null/></sf:paragraphFill><sf:spaceBefore><sf:number sfa:number="12" sfa:type="f"/></sf:spaceBefore><sf:keepWithNext><sf:number sfa:number="1" sfa:type="c"/></sf:keepWithNext><sf:outlineColor><sf:null/></sf:outlineColor><sf:paragraphRuleOffset/><sf:capitalization/><sf:leftIndent><sf:number sfa:number="14.17323" sfa:type="f"/></sf:leftIndent><sf:firstLineIndent><sf:number sfa:number="28.34646" sfa:type="f"/></sf:firstLineIndent></sf:property-map></sf:paragraphstyle><sf:paragraphstyle sfa:ID="SFWPParagraphStyle-27" sf:name="orderedlist3" sf:ident="paragraph-style-101"><sf:property-map><sf:fontSize/><sf:word_strikethrough/><sf:spaceAfter/><sf:alignment/><sf:keepLinesTogether/><sf:listStyle><sf:liststyle sfa:ID="SFWPListStyle-7" sf:parent-ident="list-style-2"><sf:property-map><sf:listTextIndents><sf:array sfa:ID="NSArray-23"><sf:number sfa:number="14.17323" sfa:type="f"/><sf:number sfa:number="9" sfa:type="f"/><sf:number sfa:number="9" sfa:type="f"/><sf:number sfa:number="9" sfa:type="f"/><sf:number sfa:number="9" sfa:type="f"/><sf:number sfa:number="9" sfa:type="f"/><sf:number sfa:number="9" sfa:type="f"/><sf:number sfa:number="9" sfa:type="f"/><sf:number sfa:number="9" sfa:type="f"/></sf:array></sf:listTextIndents><sf:listLabelGeometries><sf:array sfa:ID="NSArray-24"><sf:list-label-geometry sfa:ID="SFWPListLabelGeometry-45" sf:align="left" sf:scale="1" sf:offset="-1" sf:scale-with-text="true"/><sf:list-label-geometry sfa:ID="SFWPListLabelGeometry-46" sf:align="left" sf:scale="1" sf:offset="-1" sf:scale-with-text="true"/><sf:list-label-geometry sfa:ID="SFWPListLabelGeometry-47" sf:align="left" sf:scale="1" sf:offset="-1" sf:scale-with-text="true"/><sf:list-label-geometry sfa:ID="SFWPListLabelGeometry-48" sf:align="left" sf:scale="1" sf:offset="-1" sf:scale-with-text="true"/><sf:list-label-geometry sfa:ID="SFWPListLabelGeometry-49" sf:align="left" sf:scale="1" sf:offset="-1" sf:scale-with-text="true"/><sf:list-label-geometry sfa:ID="SFWPListLabelGeometry-50" sf:align="left" sf:scale="1" sf:offset="-1" sf:scale-with-text="true"/><sf:list-label-geometry sfa:ID="SFWPListLabelGeometry-51" sf:align="left" sf:scale="1" sf:offset="-1" sf:scale-with-text="true"/><sf:list-label-geometry sfa:ID="SFWPListLabelGeometry-52" sf:align="left" sf:scale="1" sf:offset="-1" sf:scale-with-text="true"/><sf:list-label-geometry sfa:ID="SFWPListLabelGeometry-53" sf:align="left" sf:scale="1" sf:offset="-1" sf:scale-with-text="true"/></sf:array></sf:listLabelGeometries><sf:listLabelIndents><sf:array sfa:ID="NSArray-25"><sf:number sfa:number="28.34646" sfa:type="f"/><sf:number sfa:number="18" sfa:type="f"/><sf:number sfa:number="36" sfa:type="f"/><sf:number sfa:number="54" sfa:type="f"/><sf:number sfa:number="72" sfa:type="f"/><sf:number sfa:number="90" sfa:type="f"/><sf:number sfa:number="108" sfa:type="f"/><sf:number sfa:number="126" sfa:type="f"/><sf:number sfa:number="144" sfa:type="f"/></sf:array></sf:listLabelIndents><sf:listLabelTypes><sf:array sfa:ID="NSArray-26"><sf:list-label-typeinfo sfa:ID="SFWPListLabelTypeInfo-45" sf:type="text"><sf:text-label sfa:ID="SFWPTextLabelFormat-19" sf:type="upper-roman" sf:format="%L." sf:first="1"/></sf:list-label-typeinfo><sf:list-label-typeinfo sfa:ID="SFWPListLabelTypeInfo-46" sf:type="text"><sf:text-label sfa:ID="SFWPTextLabelFormat-20" sf:type="bullet" sf:format="&#x2022;" sf:first="0"/></sf:list-label-typeinfo><sf:list-label-typeinfo sfa:ID="SFWPListLabelTypeInfo-47" sf:type="text"><sf:text-label sfa:ID="SFWPTextLabelFormat-21" sf:type="bullet" sf:format="&#x2022;" sf:first="0"/></sf:list-label-typeinfo><sf:list-label-typeinfo sfa:ID="SFWPListLabelTypeInfo-48" sf:type="text"><sf:text-label sfa:ID="SFWPTextLabelFormat-22" sf:type="bullet" sf:format="&#x2022;" sf:first="0"/></sf:list-label-typeinfo><sf:list-label-typeinfo sfa:ID="SFWPListLabelTypeInfo-49" sf:type="text"><sf:text-label sfa:ID="SFWPTextLabelFormat-23" sf:type="bullet" sf:format="&#x2022;" sf:first="0"/></sf:list-label-typeinfo><sf:list-label-typeinfo sfa:ID="SFWPListLabelTypeInfo-50" sf:type="text"><sf:text-label sfa:ID="SFWPTextLabelFormat-24" sf:type="bullet" sf:format="&#x2022;" sf:first="0"/></sf:list-label-typeinfo><sf:list-label-typeinfo sfa:ID="SFWPListLabelTypeInfo-51" sf:type="text"><sf:text-label sfa:ID="SFWPTextLabelFormat-25" sf:type="bullet" sf:format="&#x2022;" sf:first="0"/></sf:list-label-typeinfo><sf:list-label-typeinfo sfa:ID="SFWPListLabelTypeInfo-52" sf:type="text"><sf:text-label sfa:ID="SFWPTextLabelFormat-26" sf:type="bullet" sf:format="&#x2022;" sf:first="0"/></sf:list-label-typeinfo><sf:list-label-typeinfo sfa:ID="SFWPListLabelTypeInfo-53" sf:type="text"><sf:text-label sfa:ID="SFWPTextLabelFormat-27" sf:type="bullet" sf:format="&#x2022;" sf:first="0"/></sf:list-label-typeinfo></sf:array></sf:listLabelTypes></sf:property-map></sf:liststyle></sf:listStyle><sf:outlineLevel/><sf:firstTopicNumber/><sf:underline/><sf:defaultTabStops><sf:number sfa:number="28.34646" sfa:type="f"/></sf:defaultTabStops><sf:underlineWidth/><sf:dropCap/><sf:fontName/><sf:strikethru/><sf:baselineShift/><sf:lineSpacing/><sf:textShadow/><sf:underlineColor><sf:null/></sf:underlineColor><sf:kerning/><sf:strikethruWidth/><sf:fontColor/><sf:textBackground><sf:null/></sf:textBackground><sf:paragraphRuleWidth/><sf:paragraphStroke><sf:null/></sf:paragraphStroke><sf:bold/><sf:tracking/><sf:ligatures/><sf:language><sf:null/></sf:language><sf:followingParagraphStyle><sf:null/></sf:followingParagraphStyle><sf:outline/><sf:strikethruColor><sf:null/></sf:strikethruColor><sf:italic/><sf:word_underline/><sf:widowControl/><sf:rightIndent/><sf:atsuFontFeatures/><sf:tabs/><sf:superscript/><sf:paragraphBorderType/><sf:hyphenate/><sf:hidden/><sf:pageBreakBefore/><sf:paragraphFill><sf:null/></sf:paragraphFill><sf:spaceBefore/><sf:keepWithNext/><sf:outlineColor><sf:null/></sf:outlineColor><sf:paragraphRuleOffset/><sf:capitalization/><sf:leftIndent/><sf:firstLineIndent/></sf:property-map></sf:paragraphstyle><sf:paragraphstyle sfa:ID="SFWPParagraphStyle-28" sf:name="sect1-subtitle" sf:ident="paragraph-style-43"><sf:property-map><sf:fontSize><sf:number sfa:number="16" sfa:type="f"/></sf:fontSize><sf:word_strikethrough/><sf:spaceAfter/><sf:alignment/><sf:keepLinesTogether/><sf:listStyle><sf:liststyle-ref sfa:IDREF="SFWPListStyle-2"/></sf:listStyle><sf:outlineLevel/><sf:firstTopicNumber/><sf:underline/><sf:defaultTabStops><sf:number sfa:number="28.34646" sfa:type="f"/></sf:defaultTabStops><sf:tocStyle><sf:tocstyle-ref sfa:IDREF="SLTOCParagraphStyle-3"/></sf:tocStyle><sf:dropCap/><sf:underlineWidth/><sf:fontName><sf:string sfa:string="Helvetica-Bold"/></sf:fontName><sf:strikethru/><sf:baselineShift/><sf:lineSpacing/><sf:textShadow/><sf:underlineColor><sf:null/></sf:underlineColor><sf:showInTOC><sf:number sfa:number="1" sfa:type="c"/></sf:showInTOC><sf:kerning/><sf:strikethruWidth/><sf:fontColor/><sf:textBackground><sf:null/></sf:textBackground><sf:paragraphRuleWidth/><sf:paragraphStroke><sf:null/></sf:paragraphStroke><sf:bold><sf:number sfa:number="1" sfa:type="c"/></sf:bold><sf:tracking/><sf:ligatures/><sf:language><sf:null/></sf:language><sf:followingParagraphStyle><sf:paragraphstyle-ref sfa:IDREF="SFWPParagraphStyle-7"/></sf:followingParagraphStyle><sf:outline/><sf:strikethruColor><sf:null/></sf:strikethruColor><sf:italic/><sf:word_underline/><sf:widowControl/><sf:rightIndent/><sf:atsuFontFeatures/><sf:tabs/><sf:superscript/><sf:paragraphBorderType/><sf:hyphenate/><sf:hidden/><sf:pageBreakBefore/><sf:paragraphFill><sf:null/></sf:paragraphFill><sf:spaceBefore><sf:number sfa:number="12" sfa:type="f"/></sf:spaceBefore><sf:keepWithNext><sf:number sfa:number="1" sfa:type="c"/></sf:keepWithNext><sf:outlineColor><sf:null/></sf:outlineColor><sf:paragraphRuleOffset/><sf:capitalization/><sf:leftIndent/><sf:firstLineIndent/></sf:property-map></sf:paragraphstyle><sf:paragraphstyle sfa:ID="SFWPParagraphStyle-29" sf:name="literallayout" sf:ident="paragraph-style-74"><sf:property-map><sf:fontSize/><sf:word_strikethrough/><sf:spaceAfter><sf:number sfa:number="12" sfa:type="f"/></sf:spaceAfter><sf:alignment/><sf:keepLinesTogether/><sf:listStyle><sf:liststyle-ref sfa:IDREF="SFWPListStyle-2"/></sf:listStyle><sf:outlineLevel/><sf:firstTopicNumber/><sf:underline/><sf:defaultTabStops><sf:number sfa:number="28.34646" sfa:type="f"/></sf:defaultTabStops><sf:underlineWidth/><sf:dropCap/><sf:fontName><sf:string sfa:string="Courier"/></sf:fontName><sf:strikethru/><sf:baselineShift/><sf:lineSpacing/><sf:textShadow/><sf:underlineColor><sf:null/></sf:underlineColor><sf:kerning/><sf:strikethruWidth/><sf:fontColor/><sf:textBackground><sf:null/></sf:textBackground><sf:paragraphRuleWidth/><sf:paragraphStroke><sf:null/></sf:paragraphStroke><sf:bold/><sf:tracking/><sf:ligatures/><sf:language><sf:null/></sf:language><sf:followingParagraphStyle><sf:null/></sf:followingParagraphStyle><sf:outline/><sf:strikethruColor><sf:null/></sf:strikethruColor><sf:italic/><sf:word_underline/><sf:widowControl/><sf:rightIndent/><sf:atsuFontFeatures/><sf:tabs/><sf:superscript/><sf:paragraphBorderType/><sf:hyphenate/><sf:hidden/><sf:pageBreakBefore/><sf:paragraphFill><sf:null/></sf:paragraphFill><sf:spaceBefore/><sf:keepWithNext/><sf:outlineColor><sf:null/></sf:outlineColor><sf:paragraphRuleOffset/><sf:capitalization/><sf:leftIndent/><sf:firstLineIndent/></sf:property-map></sf:paragraphstyle><sf:characterstyle sfa:ID="SFWPCharacterStyle-7" sf:name="attribute-value" sf:ident="character-style-4"><sf:property-map><sf:italic/><sf:fontColor/><sf:fontSize/><sf:atsuFontFeatures/><sf:superscript/><sf:underline><sf:number sfa:number="1" sfa:type="i"/></sf:underline><sf:bold/><sf:tracking/><sf:ligatures/><sf:fontName><sf:string sfa:string="Courier"/></sf:fontName><sf:strikethru/><sf:capitalization/><sf:textShadow/><sf:baselineShift/><sf:language><sf:string sfa:string="en"/></sf:language><sf:underlineColor><sf:null/></sf:underlineColor><sf:strikethruColor><sf:null/></sf:strikethruColor></sf:property-map></sf:characterstyle><sf:tabular-style sfa:ID="SFTTableStyle-0" sf:ident="tabular-default-style-id"><sf:property-map><sf:SFTDefaultColumnCountProperty><sf:number sfa:number="3" sfa:type="i"/></sf:SFTDefaultColumnCountProperty><sf:externalTextWrap><sf:external-text-wrap sfa:ID="SFWPExternalTextWrap-5" sf:wrap-style="regular" sf:floating-wrap-enabled="true" sf:direction="both" sf:attachment-wrap-type="aligned" sf:floating-wrap-type="directional" sf:margin="12" sf:alpha-threshold="0.5"/></sf:externalTextWrap><sf:SFTDefaultHeaderColumnCellStyleProperty><sf:cell-style sfa:ID="SFTCellStyle-1" sf:ident="tabular-default-header-column-cell-style-id"><sf:property-map><sf:opacity><sf:number sfa:number="1" sfa:type="f"/></sf:opacity><sf:SFTCellStylePropertyDateTimeFormat><sf:string sfa:string="d/MM/yy h:mm a"/></sf:SFTCellStylePropertyDateTimeFormat><sf:SFTCellStylePropertyParagraphStyle><sf:paragraphstyle-ref sfa:IDREF="SFWPParagraphStyle-13"/></sf:SFTCellStylePropertyParagraphStyle><sf:SFTCellStylePropertyFormatType><sf:number sfa:number="255" sfa:type="i"/></sf:SFTCellStylePropertyFormatType><sf:SFTCellTextWrapProperty><sf:number sfa:number="1" sfa:type="c"/></sf:SFTCellTextWrapProperty><sf:SFTCellStylePropertyImplicitFormatType><sf:number sfa:number="255" sfa:type="i"/></sf:SFTCellStylePropertyImplicitFormatType><sf:SFTCellStylePropertyLayoutStyle><sf:layoutstyle sfa:ID="SFWPLayoutStyle-7" sf:parent-ident="layout-style-default"><sf:property-map><sf:followingLayoutStyle><sf:null/></sf:followingLayoutStyle><sf:padding><sf:padding-ref sfa:IDREF="SFWPPadding-2"/></sf:padding><sf:layoutParagraphStyle><sf:paragraphstyle-ref sfa:IDREF="SFWPParagraphStyle-13"/></sf:layoutParagraphStyle></sf:property-map></sf:layoutstyle></sf:SFTCellStylePropertyLayoutStyle><sf:SFTCellStylePropertyNumberFormat><sf:number-format sfa:ID="SFTNumberFormat-1" sf:format-type="0" sf:format-string="#,##0.###;-#,##0.###" sf:format-decimal-places="2" sf:format-currency-code="AUD" sf:format-negative-style="0" sf:format-show-thousands-separator="true" sf:format-fraction-accuracy="-1" sf:format-use-accounting-style="false"/></sf:SFTCellStylePropertyNumberFormat><sf:fill><sf:color xsi:type="sfa:calibrated-rgb-color-type" sfa:r="0.86274510622024536" sfa:g="0.87058824300765991" sfa:b="0.86666667461395264" sfa:a="1"/></sf:fill></sf:property-map></sf:cell-style></sf:SFTDefaultHeaderColumnCellStyleProperty><sf:SFTDefaultFooterRowCellStyleProperty><sf:cell-style-ref sfa:IDREF="SFTCellStyle-0"/></sf:SFTDefaultFooterRowCellStyleProperty><sf:SFTDefaultHeaderBorderVectorStyleProperty><sf:vector-style-ref sfa:IDREF="SFTVectorStyle-3"/></sf:SFTDefaultHeaderBorderVectorStyleProperty><sf:SFTDefaultBodyVectorStyleProperty><sf:vector-style-ref sfa:IDREF="SFTVectorStyle-2"/></sf:SFTDefaultBodyVectorStyleProperty><sf:SFTDefaultRowCountProperty><sf:number sfa:number="4" sfa:type="i"/></sf:SFTDefaultRowCountProperty><sf:SFTDefaultBorderVectorStyleProperty><sf:vector-style-ref sfa:IDREF="SFTVectorStyle-7"/></sf:SFTDefaultBorderVectorStyleProperty><sf:SFTDefaultFooterSeparatorVectorStyleProperty><sf:vector-style-ref sfa:IDREF="SFTVectorStyle-6"/></sf:SFTDefaultFooterSeparatorVectorStyleProperty><sf:SFTTableBandedRowsProperty><sf:number sfa:number="0" sfa:type="c"/></sf:SFTTableBandedRowsProperty><sf:SFTDefaultHeaderBodyVectorStyleProperty><sf:vector-style-ref sfa:IDREF="SFTVectorStyle-5"/></sf:SFTDefaultHeaderBodyVectorStyleProperty><sf:SFTDefaultHeaderSeparatorVectorStyleProperty><sf:vector-style-ref sfa:IDREF="SFTVectorStyle-0"/></sf:SFTDefaultHeaderSeparatorVectorStyleProperty><sf:SFTHeaderRowRepeatsProperty><sf:number sfa:number="1" sfa:type="c"/></sf:SFTHeaderRowRepeatsProperty><sf:opacity><sf:number sfa:number="1" sfa:type="f"/></sf:opacity><sf:SFTAutoResizeProperty><sf:number sfa:number="1" sfa:type="c"/></sf:SFTAutoResizeProperty><sf:SFTDefaultHeaderRowCellStyleProperty><sf:cell-style sfa:ID="SFTCellStyle-2" sf:ident="tabular-default-header-row-cell-style-id"><sf:property-map><sf:opacity><sf:number sfa:number="1" sfa:type="f"/></sf:opacity><sf:SFTCellStylePropertyDateTimeFormat><sf:string sfa:string="d/MM/yy h:mm a"/></sf:SFTCellStylePropertyDateTimeFormat><sf:SFTCellStylePropertyParagraphStyle><sf:paragraphstyle-ref sfa:IDREF="SFWPParagraphStyle-13"/></sf:SFTCellStylePropertyParagraphStyle><sf:SFTCellStylePropertyFormatType><sf:number sfa:number="255" sfa:type="i"/></sf:SFTCellStylePropertyFormatType><sf:SFTCellTextWrapProperty><sf:number sfa:number="1" sfa:type="c"/></sf:SFTCellTextWrapProperty><sf:SFTCellStylePropertyImplicitFormatType><sf:number sfa:number="255" sfa:type="i"/></sf:SFTCellStylePropertyImplicitFormatType><sf:SFTCellStylePropertyLayoutStyle><sf:layoutstyle sfa:ID="SFWPLayoutStyle-8" sf:parent-ident="layout-style-default"><sf:property-map><sf:followingLayoutStyle><sf:null/></sf:followingLayoutStyle><sf:padding><sf:padding-ref sfa:IDREF="SFWPPadding-2"/></sf:padding><sf:layoutParagraphStyle><sf:paragraphstyle-ref sfa:IDREF="SFWPParagraphStyle-13"/></sf:layoutParagraphStyle></sf:property-map></sf:layoutstyle></sf:SFTCellStylePropertyLayoutStyle><sf:SFTCellStylePropertyNumberFormat><sf:number-format-ref sfa:IDREF="SFTNumberFormat-0"/></sf:SFTCellStylePropertyNumberFormat><sf:fill><sf:color xsi:type="sfa:calibrated-rgb-color-type" sfa:r="0.69019609689712524" sfa:g="0.70196080207824707" sfa:b="0.69803923368453979" sfa:a="1"/></sf:fill></sf:property-map></sf:cell-style></sf:SFTDefaultHeaderRowCellStyleProperty><sf:fill><sf:null/></sf:fill><sf:SFTDefaultInlineGeometryProperty><sf:geometry sfa:ID="SFDAffineGeometry-0" sf:sizesLocked="true"><sf:naturalSize sfa:w="467" sfa:h="75"/><sf:size sfa:w="467" sfa:h="75"/><sf:position sfa:x="0" sfa:y="0"/></sf:geometry></sf:SFTDefaultInlineGeometryProperty><sf:SFTHeaderColumnRepeatsProperty><sf:number sfa:number="1" sfa:type="c"/></sf:SFTHeaderColumnRepeatsProperty><sf:shadow><sf:shadow-ref sfa:IDREF="SFRShadow-0"/></sf:shadow><sf:SFTDefaultBodyCellStyleProperty><sf:cell-style sfa:ID="SFTCellStyle-3" sf:ident="tabular-default-body-cell-style-id"><sf:property-map><sf:opacity><sf:number sfa:number="1" sfa:type="f"/></sf:opacity><sf:SFTCellStylePropertyDateTimeFormat><sf:string sfa:string="d/MM/yy h:mm a"/></sf:SFTCellStylePropertyDateTimeFormat><sf:SFTCellStylePropertyParagraphStyle><sf:paragraphstyle-ref sfa:IDREF="SFWPParagraphStyle-7"/></sf:SFTCellStylePropertyParagraphStyle><sf:SFTCellStylePropertyFormatType><sf:number sfa:number="255" sfa:type="i"/></sf:SFTCellStylePropertyFormatType><sf:SFTCellTextWrapProperty><sf:number sfa:number="1" sfa:type="c"/></sf:SFTCellTextWrapProperty><sf:SFTCellStylePropertyImplicitFormatType><sf:number sfa:number="255" sfa:type="i"/></sf:SFTCellStylePropertyImplicitFormatType><sf:SFTCellStylePropertyLayoutStyle><sf:layoutstyle sfa:ID="SFWPLayoutStyle-9" sf:parent-ident="layout-style-default"><sf:property-map><sf:followingLayoutStyle><sf:null/></sf:followingLayoutStyle><sf:padding><sf:padding sfa:ID="SFWPPadding-3" sf:top="5" sf:left="5" sf:bottom="5" sf:right="5"/></sf:padding><sf:layoutParagraphStyle><sf:paragraphstyle-ref sfa:IDREF="SFWPParagraphStyle-7"/></sf:layoutParagraphStyle></sf:property-map></sf:layoutstyle></sf:SFTCellStylePropertyLayoutStyle><sf:SFTCellStylePropertyNumberFormat><sf:number-format sfa:ID="SFTNumberFormat-2" sf:format-type="0" sf:format-string="#,##0.###;-#,##0.###" sf:format-decimal-places="2" sf:format-currency-code="AUD" sf:format-negative-style="0" sf:format-show-thousands-separator="true" sf:format-fraction-accuracy="-1" sf:format-use-accounting-style="false"/></sf:SFTCellStylePropertyNumberFormat><sf:fill><sf:null/></sf:fill></sf:property-map></sf:cell-style></sf:SFTDefaultBodyCellStyleProperty><sf:SFTTableBandedCellFillProperty><sf:color xsi:type="sfa:calibrated-rgb-color-type" sfa:r="0.92156863212585449" sfa:g="0.93333333730697632" sfa:b="0.94117647409439087" sfa:a="1"/></sf:SFTTableBandedCellFillProperty><sf:SFTGroupingRowFillProperty><sf:null/></sf:SFTGroupingRowFillProperty><sf:SFTDefaultFooterBodyVectorStyleProperty><sf:vector-style-ref sfa:IDREF="SFTVectorStyle-1"/></sf:SFTDefaultFooterBodyVectorStyleProperty><sf:SFTDefaultFooterBorderVectorStyleProperty><sf:vector-style-ref sfa:IDREF="SFTVectorStyle-4"/></sf:SFTDefaultFooterBorderVectorStyleProperty><sf:SFTTableBehaviorProperty><sf:number sfa:number="1" sfa:type="i"/></sf:SFTTableBehaviorProperty><sf:SFTDefaultHeaderColumnCountProperty><sf:number sfa:number="0" sfa:type="c"/></sf:SFTDefaultHeaderColumnCountProperty><sf:SFTDefaultGeometryProperty><sf:geometry sfa:ID="SFDAffineGeometry-1" sf:sizesLocked="true"><sf:naturalSize sfa:w="350" sfa:h="100"/><sf:size sfa:w="350" sfa:h="100"/><sf:position sfa:x="79" sfa:y="171"/></sf:geometry></sf:SFTDefaultGeometryProperty><sf:SFTDefaultHeaderRowCountProperty><sf:number sfa:number="1" sfa:type="c"/></sf:SFTDefaultHeaderRowCountProperty></sf:property-map></sf:tabular-style><sf:paragraphstyle sfa:ID="SFWPParagraphStyle-30" sf:name="bibliomisc" sf:ident="paragraph-style-105"><sf:property-map><sf:fontSize/><sf:word_strikethrough/><sf:spaceAfter><sf:number sfa:number="12" sfa:type="f"/></sf:spaceAfter><sf:alignment/><sf:keepLinesTogether/><sf:listStyle><sf:liststyle-ref sfa:IDREF="SFWPListStyle-2"/></sf:listStyle><sf:outlineLevel/><sf:firstTopicNumber/><sf:underline/><sf:defaultTabStops><sf:number sfa:number="28.34646" sfa:type="f"/></sf:defaultTabStops><sf:underlineWidth/><sf:dropCap/><sf:fontName/><sf:strikethru/><sf:baselineShift/><sf:lineSpacing/><sf:textShadow/><sf:underlineColor><sf:null/></sf:underlineColor><sf:kerning/><sf:strikethruWidth/><sf:fontColor/><sf:textBackground><sf:null/></sf:textBackground><sf:paragraphRuleWidth/><sf:paragraphStroke><sf:null/></sf:paragraphStroke><sf:bold/><sf:tracking/><sf:ligatures/><sf:language><sf:null/></sf:language><sf:followingParagraphStyle><sf:null/></sf:followingParagraphStyle><sf:outline/><sf:strikethruColor><sf:null/></sf:strikethruColor><sf:italic/><sf:word_underline/><sf:widowControl/><sf:rightIndent/><sf:atsuFontFeatures/><sf:tabs/><sf:superscript/><sf:paragraphBorderType/><sf:hyphenate/><sf:hidden/><sf:pageBreakBefore/><sf:paragraphFill><sf:color xsi:type="sfa:calibrated-rgb-color-type" sfa:r="0.80000001192092896" sfa:g="1" sfa:b="1" sfa:a="1"/></sf:paragraphFill><sf:spaceBefore/><sf:keepWithNext/><sf:outlineColor><sf:null/></sf:outlineColor><sf:paragraphRuleOffset/><sf:capitalization/><sf:leftIndent/><sf:firstLineIndent/></sf:property-map></sf:paragraphstyle><sf:paragraphstyle sfa:ID="SFWPParagraphStyle-31" sf:name="sect1-title" sf:ident="paragraph-style-42"><sf:property-map><sf:fontSize><sf:number sfa:number="18" sfa:type="f"/></sf:fontSize><sf:word_strikethrough/><sf:spaceAfter/><sf:alignment/><sf:keepLinesTogether/><sf:listStyle><sf:liststyle-ref sfa:IDREF="SFWPListStyle-2"/></sf:listStyle><sf:outlineLevel/><sf:firstTopicNumber/><sf:underline/><sf:defaultTabStops><sf:number sfa:number="28.34646" sfa:type="f"/></sf:defaultTabStops><sf:tocStyle><sf:tocstyle-ref sfa:IDREF="SLTOCParagraphStyle-3"/></sf:tocStyle><sf:dropCap/><sf:underlineWidth/><sf:fontName><sf:string sfa:string="Helvetica-Bold"/></sf:fontName><sf:strikethru/><sf:baselineShift/><sf:lineSpacing/><sf:textShadow/><sf:underlineColor><sf:null/></sf:underlineColor><sf:showInTOC><sf:number sfa:number="1" sfa:type="c"/></sf:showInTOC><sf:kerning/><sf:strikethruWidth/><sf:fontColor/><sf:textBackground><sf:null/></sf:textBackground><sf:paragraphRuleWidth/><sf:paragraphStroke><sf:null/></sf:paragraphStroke><sf:bold><sf:number sfa:number="1" sfa:type="c"/></sf:bold><sf:tracking/><sf:ligatures/><sf:language><sf:null/></sf:language><sf:followingParagraphStyle><sf:paragraphstyle-ref sfa:IDREF="SFWPParagraphStyle-7"/></sf:followingParagraphStyle><sf:outline/><sf:strikethruColor><sf:null/></sf:strikethruColor><sf:italic/><sf:word_underline/><sf:widowControl/><sf:rightIndent/><sf:atsuFontFeatures/><sf:tabs/><sf:superscript/><sf:paragraphBorderType/><sf:hyphenate/><sf:hidden/><sf:pageBreakBefore/><sf:paragraphFill><sf:null/></sf:paragraphFill><sf:spaceBefore><sf:number sfa:number="12" sfa:type="f"/></sf:spaceBefore><sf:keepWithNext><sf:number sfa:number="1" sfa:type="c"/></sf:keepWithNext><sf:outlineColor><sf:null/></sf:outlineColor><sf:paragraphRuleOffset/><sf:capitalization/><sf:leftIndent/><sf:firstLineIndent/></sf:property-map></sf:paragraphstyle><sf:paragraphstyle sfa:ID="SFWPParagraphStyle-32" sf:name="Free Form" sf:ident="paragraph-style-default"><sf:property-map><sf:fontSize/><sf:word_strikethrough/><sf:spaceAfter/><sf:alignment/><sf:keepLinesTogether/><sf:listStyle><sf:liststyle-ref sfa:IDREF="SFWPListStyle-2"/></sf:listStyle><sf:outlineLevel/><sf:firstTopicNumber/><sf:underline/><sf:defaultTabStops><sf:number sfa:number="28.34646" sfa:type="f"/></sf:defaultTabStops><sf:underlineWidth/><sf:dropCap/><sf:fontName/><sf:strikethru/><sf:baselineShift/><sf:lineSpacing/><sf:textShadow/><sf:underlineColor><sf:null/></sf:underlineColor><sf:showInTOC/><sf:kerning/><sf:strikethruWidth/><sf:fontColor><sf:color xsi:type="sfa:calibrated-rgb-color-type" sfa:r="0" sfa:g="0" sfa:b="0" sfa:a="1"/></sf:fontColor><sf:textBackground><sf:null/></sf:textBackground><sf:paragraphRuleWidth/><sf:paragraphStroke><sf:null/></sf:paragraphStroke><sf:bold/><sf:tracking/><sf:ligatures/><sf:language><sf:null/></sf:language><sf:followingParagraphStyle><sf:null/></sf:followingParagraphStyle><sf:outline/><sf:strikethruColor><sf:null/></sf:strikethruColor><sf:italic/><sf:word_underline/><sf:widowControl/><sf:rightIndent/><sf:atsuFontFeatures/><sf:tabs/><sf:superscript/><sf:paragraphBorderType/><sf:hyphenate/><sf:hidden/><sf:pageBreakBefore/><sf:paragraphFill><sf:null/></sf:paragraphFill><sf:spaceBefore/><sf:keepWithNext/><sf:outlineColor><sf:null/></sf:outlineColor><sf:paragraphRuleOffset/><sf:capitalization/><sf:leftIndent/><sf:firstLineIndent/></sf:property-map></sf:paragraphstyle><sf:paragraphstyle sfa:ID="SFWPParagraphStyle-33" sf:name="revision" sf:ident="paragraph-style-75"><sf:property-map><sf:fontSize/><sf:word_strikethrough/><sf:spaceAfter><sf:number sfa:number="12" sfa:type="f"/></sf:spaceAfter><sf:alignment/><sf:keepLinesTogether/><sf:listStyle><sf:liststyle-ref sfa:IDREF="SFWPListStyle-2"/></sf:listStyle><sf:outlineLevel/><sf:firstTopicNumber/><sf:underline/><sf:defaultTabStops><sf:number sfa:number="28.34646" sfa:type="f"/></sf:defaultTabStops><sf:underlineWidth/><sf:dropCap/><sf:fontName/><sf:strikethru/><sf:baselineShift/><sf:lineSpacing/><sf:textShadow/><sf:underlineColor><sf:null/></sf:underlineColor><sf:kerning/><sf:strikethruWidth/><sf:fontColor/><sf:textBackground><sf:null/></sf:textBackground><sf:paragraphRuleWidth/><sf:paragraphStroke><sf:null/></sf:paragraphStroke><sf:bold><sf:number sfa:number="1" sfa:type="i"/></sf:bold><sf:tracking/><sf:ligatures/><sf:language><sf:null/></sf:language><sf:followingParagraphStyle><sf:null/></sf:followingParagraphStyle><sf:outline/><sf:strikethruColor><sf:null/></sf:strikethruColor><sf:italic/><sf:word_underline/><sf:widowControl/><sf:rightIndent/><sf:atsuFontFeatures/><sf:tabs/><sf:superscript/><sf:paragraphBorderType/><sf:hyphenate/><sf:hidden/><sf:pageBreakBefore/><sf:paragraphFill><sf:color xsi:type="sfa:calibrated-rgb-color-type" sfa:r="1" sfa:g="1" sfa:b="0.80000001192092896" sfa:a="1"/></sf:paragraphFill><sf:spaceBefore/><sf:keepWithNext/><sf:outlineColor><sf:null/></sf:outlineColor><sf:paragraphRuleOffset/><sf:capitalization/><sf:leftIndent/><sf:firstLineIndent/></sf:property-map></sf:paragraphstyle><sf:paragraphstyle sfa:ID="SFWPParagraphStyle-34" sf:name="orderedlist2" sf:ident="paragraph-style-100"><sf:property-map><sf:fontSize/><sf:word_strikethrough/><sf:spaceAfter/><sf:alignment/><sf:keepLinesTogether/><sf:listStyle><sf:liststyle sfa:ID="SFWPListStyle-8" sf:parent-ident="list-style-2"><sf:property-map><sf:listTextIndents><sf:array sfa:ID="NSArray-27"><sf:number sfa:number="14.17323" sfa:type="f"/><sf:number sfa:number="9" sfa:type="f"/><sf:number sfa:number="9" sfa:type="f"/><sf:number sfa:number="9" sfa:type="f"/><sf:number sfa:number="9" sfa:type="f"/><sf:number sfa:number="9" sfa:type="f"/><sf:number sfa:number="9" sfa:type="f"/><sf:number sfa:number="9" sfa:type="f"/><sf:number sfa:number="9" sfa:type="f"/></sf:array></sf:listTextIndents><sf:listLabelGeometries><sf:array sfa:ID="NSArray-28"><sf:list-label-geometry sfa:ID="SFWPListLabelGeometry-54" sf:align="left" sf:scale="1" sf:offset="-1" sf:scale-with-text="true"/><sf:list-label-geometry sfa:ID="SFWPListLabelGeometry-55" sf:align="left" sf:scale="1" sf:offset="-1" sf:scale-with-text="true"/><sf:list-label-geometry sfa:ID="SFWPListLabelGeometry-56" sf:align="left" sf:scale="1" sf:offset="-1" sf:scale-with-text="true"/><sf:list-label-geometry sfa:ID="SFWPListLabelGeometry-57" sf:align="left" sf:scale="1" sf:offset="-1" sf:scale-with-text="true"/><sf:list-label-geometry sfa:ID="SFWPListLabelGeometry-58" sf:align="left" sf:scale="1" sf:offset="-1" sf:scale-with-text="true"/><sf:list-label-geometry sfa:ID="SFWPListLabelGeometry-59" sf:align="left" sf:scale="1" sf:offset="-1" sf:scale-with-text="true"/><sf:list-label-geometry sfa:ID="SFWPListLabelGeometry-60" sf:align="left" sf:scale="1" sf:offset="-1" sf:scale-with-text="true"/><sf:list-label-geometry sfa:ID="SFWPListLabelGeometry-61" sf:align="left" sf:scale="1" sf:offset="-1" sf:scale-with-text="true"/><sf:list-label-geometry sfa:ID="SFWPListLabelGeometry-62" sf:align="left" sf:scale="1" sf:offset="-1" sf:scale-with-text="true"/></sf:array></sf:listLabelGeometries><sf:listLabelIndents><sf:array sfa:ID="NSArray-29"><sf:number sfa:number="14.17323" sfa:type="f"/><sf:number sfa:number="18" sfa:type="f"/><sf:number sfa:number="36" sfa:type="f"/><sf:number sfa:number="54" sfa:type="f"/><sf:number sfa:number="72" sfa:type="f"/><sf:number sfa:number="90" sfa:type="f"/><sf:number sfa:number="108" sfa:type="f"/><sf:number sfa:number="126" sfa:type="f"/><sf:number sfa:number="144" sfa:type="f"/></sf:array></sf:listLabelIndents><sf:listLabelTypes><sf:array sfa:ID="NSArray-30"><sf:list-label-typeinfo sfa:ID="SFWPListLabelTypeInfo-54" sf:type="text"><sf:text-label sfa:ID="SFWPTextLabelFormat-28" sf:type="lower-alpha" sf:format="%L." sf:first="1"/></sf:list-label-typeinfo><sf:list-label-typeinfo sfa:ID="SFWPListLabelTypeInfo-55" sf:type="text"><sf:text-label sfa:ID="SFWPTextLabelFormat-29" sf:type="bullet" sf:format="&#x2022;" sf:first="0"/></sf:list-label-typeinfo><sf:list-label-typeinfo sfa:ID="SFWPListLabelTypeInfo-56" sf:type="text"><sf:text-label sfa:ID="SFWPTextLabelFormat-30" sf:type="bullet" sf:format="&#x2022;" sf:first="0"/></sf:list-label-typeinfo><sf:list-label-typeinfo sfa:ID="SFWPListLabelTypeInfo-57" sf:type="text"><sf:text-label sfa:ID="SFWPTextLabelFormat-31" sf:type="bullet" sf:format="&#x2022;" sf:first="0"/></sf:list-label-typeinfo><sf:list-label-typeinfo sfa:ID="SFWPListLabelTypeInfo-58" sf:type="text"><sf:text-label sfa:ID="SFWPTextLabelFormat-32" sf:type="bullet" sf:format="&#x2022;" sf:first="0"/></sf:list-label-typeinfo><sf:list-label-typeinfo sfa:ID="SFWPListLabelTypeInfo-59" sf:type="text"><sf:text-label sfa:ID="SFWPTextLabelFormat-33" sf:type="bullet" sf:format="&#x2022;" sf:first="0"/></sf:list-label-typeinfo><sf:list-label-typeinfo sfa:ID="SFWPListLabelTypeInfo-60" sf:type="text"><sf:text-label sfa:ID="SFWPTextLabelFormat-34" sf:type="bullet" sf:format="&#x2022;" sf:first="0"/></sf:list-label-typeinfo><sf:list-label-typeinfo sfa:ID="SFWPListLabelTypeInfo-61" sf:type="text"><sf:text-label sfa:ID="SFWPTextLabelFormat-35" sf:type="bullet" sf:format="&#x2022;" sf:first="0"/></sf:list-label-typeinfo><sf:list-label-typeinfo sfa:ID="SFWPListLabelTypeInfo-62" sf:type="text"><sf:text-label sfa:ID="SFWPTextLabelFormat-36" sf:type="bullet" sf:format="&#x2022;" sf:first="0"/></sf:list-label-typeinfo></sf:array></sf:listLabelTypes></sf:property-map></sf:liststyle></sf:listStyle><sf:outlineLevel/><sf:firstTopicNumber/><sf:underline/><sf:defaultTabStops><sf:number sfa:number="28.34646" sfa:type="f"/></sf:defaultTabStops><sf:underlineWidth/><sf:dropCap/><sf:fontName/><sf:strikethru/><sf:baselineShift/><sf:lineSpacing/><sf:textShadow/><sf:underlineColor><sf:null/></sf:underlineColor><sf:kerning/><sf:strikethruWidth/><sf:fontColor/><sf:textBackground><sf:null/></sf:textBackground><sf:paragraphRuleWidth/><sf:paragraphStroke><sf:null/></sf:paragraphStroke><sf:bold/><sf:tracking/><sf:ligatures/><sf:language><sf:null/></sf:language><sf:followingParagraphStyle><sf:null/></sf:followingParagraphStyle><sf:outline/><sf:strikethruColor><sf:null/></sf:strikethruColor><sf:italic/><sf:word_underline/><sf:widowControl/><sf:rightIndent/><sf:atsuFontFeatures/><sf:tabs/><sf:superscript/><sf:paragraphBorderType/><sf:hyphenate/><sf:hidden/><sf:pageBreakBefore/><sf:paragraphFill><sf:null/></sf:paragraphFill><sf:spaceBefore/><sf:keepWithNext/><sf:outlineColor><sf:null/></sf:outlineColor><sf:paragraphRuleOffset/><sf:capitalization/><sf:leftIndent/><sf:firstLineIndent/></sf:property-map></sf:paragraphstyle><sf:paragraphstyle sfa:ID="SFWPParagraphStyle-35" sf:name="Header &amp; Footer" sf:ident="paragraph-style-37"><sf:property-map><sf:fontSize><sf:number sfa:number="10" sfa:type="f"/></sf:fontSize><sf:word_strikethrough/><sf:spaceAfter/><sf:alignment/><sf:keepLinesTogether/><sf:listStyle><sf:liststyle-ref sfa:IDREF="SFWPListStyle-2"/></sf:listStyle><sf:outlineLevel/><sf:firstTopicNumber/><sf:underline/><sf:defaultTabStops><sf:number sfa:number="28.34646" sfa:type="f"/></sf:defaultTabStops><sf:underlineWidth/><sf:dropCap/><sf:fontName/><sf:strikethru/><sf:baselineShift/><sf:lineSpacing/><sf:textShadow/><sf:underlineColor><sf:null/></sf:underlineColor><sf:kerning/><sf:strikethruWidth/><sf:fontColor><sf:color xsi:type="sfa:calibrated-rgb-color-type" sfa:r="0" sfa:g="0" sfa:b="0" sfa:a="1"/></sf:fontColor><sf:textBackground><sf:null/></sf:textBackground><sf:paragraphRuleWidth/><sf:paragraphStroke><sf:null/></sf:paragraphStroke><sf:bold/><sf:tracking/><sf:ligatures/><sf:language><sf:null/></sf:language><sf:followingParagraphStyle><sf:null/></sf:followingParagraphStyle><sf:outline/><sf:strikethruColor><sf:null/></sf:strikethruColor><sf:italic/><sf:word_underline/><sf:widowControl/><sf:rightIndent/><sf:atsuFontFeatures/><sf:tabs><sf:tabs sfa:ID="SFWPTabs-5"><sf:tabstop sf:pos="468" sf:align="right"/></sf:tabs></sf:tabs><sf:superscript/><sf:paragraphBorderType/><sf:hyphenate/><sf:hidden/><sf:pageBreakBefore/><sf:paragraphFill><sf:null/></sf:paragraphFill><sf:spaceBefore/><sf:keepWithNext/><sf:outlineColor><sf:null/></sf:outlineColor><sf:paragraphRuleOffset/><sf:capitalization/><sf:leftIndent/><sf:firstLineIndent/></sf:property-map></sf:paragraphstyle><sf:characterstyle sfa:ID="SFWPCharacterStyle-8" sf:name="shortaffil" sf:ident="character-style-31"><sf:property-map><sf:underlineColor><sf:null/></sf:underlineColor><sf:fontColor/><sf:fontSize/><sf:textBackground><sf:null/></sf:textBackground><sf:atsuFontFeatures/><sf:superscript/><sf:underline><sf:number sfa:number="1" sfa:type="i"/></sf:underline><sf:bold/><sf:fontName/><sf:ligatures/><sf:strikethru/><sf:baselineShift/><sf:tracking/><sf:capitalization/><sf:textShadow/><sf:language><sf:string sfa:string="en"/></sf:language><sf:italic/><sf:strikethruColor><sf:null/></sf:strikethruColor></sf:property-map></sf:characterstyle><sf:characterstyle sfa:ID="SFWPCharacterStyle-9" sf:name="revnumber" sf:ident="character-style-18"><sf:property-map><sf:italic/><sf:fontSize/><sf:fontColor/><sf:atsuFontFeatures/><sf:superscript/><sf:underline><sf:number sfa:number="1" sfa:type="i"/></sf:underline><sf:bold><sf:number sfa:number="1" sfa:type="i"/></sf:bold><sf:tracking/><sf:fontName/><sf:baselineShift/><sf:ligatures/><sf:strikethru/><sf:capitalization/><sf:textShadow/><sf:language><sf:string sfa:string="en"/></sf:language><sf:underlineColor><sf:null/></sf:underlineColor><sf:strikethruColor><sf:null/></sf:strikethruColor></sf:property-map></sf:characterstyle><sf:paragraphstyle sfa:ID="SFWPParagraphStyle-36" sf:name="textobject-title" sf:ident="paragraph-style-78"><sf:property-map><sf:fontSize><sf:number sfa:number="13" sfa:type="f"/></sf:fontSize><sf:word_strikethrough/><sf:spaceAfter><sf:number sfa:number="12" sfa:type="f"/></sf:spaceAfter><sf:alignment/><sf:keepLinesTogether/><sf:listStyle><sf:liststyle-ref sfa:IDREF="SFWPListStyle-2"/></sf:listStyle><sf:outlineLevel/><sf:firstTopicNumber/><sf:underline/><sf:defaultTabStops><sf:number sfa:number="28.34646" sfa:type="f"/></sf:defaultTabStops><sf:underlineWidth/><sf:dropCap/><sf:fontName/><sf:strikethru/><sf:baselineShift/><sf:lineSpacing/><sf:textShadow/><sf:underlineColor><sf:null/></sf:underlineColor><sf:kerning/><sf:strikethruWidth/><sf:fontColor/><sf:textBackground><sf:null/></sf:textBackground><sf:paragraphRuleWidth/><sf:paragraphStroke><sf:null/></sf:paragraphStroke><sf:bold><sf:number sfa:number="1" sfa:type="i"/></sf:bold><sf:tracking/><sf:ligatures/><sf:language><sf:null/></sf:language><sf:followingParagraphStyle><sf:null/></sf:followingParagraphStyle><sf:outline/><sf:strikethruColor><sf:null/></sf:strikethruColor><sf:italic/><sf:word_underline/><sf:widowControl/><sf:rightIndent/><sf:atsuFontFeatures/><sf:tabs/><sf:superscript/><sf:paragraphBorderType/><sf:hyphenate/><sf:hidden/><sf:pageBreakBefore/><sf:paragraphFill><sf:null/></sf:paragraphFill><sf:spaceBefore/><sf:keepWithNext/><sf:outlineColor><sf:null/></sf:outlineColor><sf:paragraphRuleOffset/><sf:capitalization/><sf:leftIndent><sf:number sfa:number="28.35709" sfa:type="f"/></sf:leftIndent><sf:firstLineIndent><sf:number sfa:number="28.35709" sfa:type="f"/></sf:firstLineIndent></sf:property-map></sf:paragraphstyle><sf:paragraphstyle sfa:ID="SFWPParagraphStyle-37" sf:name="caution" sf:ident="paragraph-style-16"><sf:property-map><sf:fontSize/><sf:word_strikethrough/><sf:spaceAfter><sf:number sfa:number="12" sfa:type="f"/></sf:spaceAfter><sf:alignment/><sf:keepLinesTogether/><sf:listStyle><sf:liststyle-ref sfa:IDREF="SFWPListStyle-5"/></sf:listStyle><sf:outlineLevel/><sf:firstTopicNumber/><sf:underline/><sf:defaultTabStops><sf:number sfa:number="28.34646" sfa:type="f"/></sf:defaultTabStops><sf:underlineWidth/><sf:dropCap/><sf:fontName/><sf:strikethru/><sf:baselineShift/><sf:lineSpacing/><sf:textShadow/><sf:underlineColor><sf:null/></sf:underlineColor><sf:kerning/><sf:strikethruWidth/><sf:fontColor><sf:color xsi:type="sfa:calibrated-rgb-color-type" sfa:r="1" sfa:g="0" sfa:b="0" sfa:a="1"/></sf:fontColor><sf:textBackground><sf:null/></sf:textBackground><sf:paragraphRuleWidth/><sf:paragraphStroke><sf:null/></sf:paragraphStroke><sf:bold/><sf:tracking/><sf:ligatures/><sf:language><sf:null/></sf:language><sf:followingParagraphStyle><sf:null/></sf:followingParagraphStyle><sf:outline/><sf:strikethruColor><sf:null/></sf:strikethruColor><sf:italic/><sf:word_underline/><sf:widowControl/><sf:rightIndent/><sf:atsuFontFeatures/><sf:tabs/><sf:superscript/><sf:paragraphBorderType/><sf:hyphenate/><sf:hidden/><sf:pageBreakBefore/><sf:paragraphFill><sf:null/></sf:paragraphFill><sf:spaceBefore/><sf:keepWithNext/><sf:outlineColor><sf:null/></sf:outlineColor><sf:paragraphRuleOffset/><sf:capitalization/><sf:leftIndent/><sf:firstLineIndent/></sf:property-map></sf:paragraphstyle><sf:paragraphstyle sfa:ID="SFWPParagraphStyle-38" sf:name="informalfigure-imagedata" sf:ident="paragraph-style-28"><sf:property-map><sf:fontSize/><sf:word_strikethrough/><sf:spaceAfter><sf:number sfa:number="12" sfa:type="f"/></sf:spaceAfter><sf:alignment/><sf:keepLinesTogether/><sf:listStyle><sf:liststyle-ref sfa:IDREF="SFWPListStyle-2"/></sf:listStyle><sf:outlineLevel/><sf:firstTopicNumber/><sf:underline><sf:number sfa:number="1" sfa:type="i"/></sf:underline><sf:defaultTabStops><sf:number sfa:number="28.34646" sfa:type="f"/></sf:defaultTabStops><sf:underlineWidth/><sf:dropCap/><sf:fontName><sf:string sfa:string="Courier-Bold"/></sf:fontName><sf:strikethru/><sf:baselineShift/><sf:lineSpacing/><sf:textShadow/><sf:underlineColor><sf:null/></sf:underlineColor><sf:kerning/><sf:strikethruWidth/><sf:fontColor><sf:color xsi:type="sfa:calibrated-rgb-color-type" sfa:r="0" sfa:g="0.20000000298023224" sfa:b="0.60000002384185791" sfa:a="1"/></sf:fontColor><sf:textBackground><sf:null/></sf:textBackground><sf:paragraphRuleWidth/><sf:paragraphStroke><sf:null/></sf:paragraphStroke><sf:bold/><sf:tracking/><sf:ligatures/><sf:language><sf:null/></sf:language><sf:followingParagraphStyle><sf:null/></sf:followingParagraphStyle><sf:outline/><sf:strikethruColor><sf:null/></sf:strikethruColor><sf:italic/><sf:word_underline/><sf:widowControl/><sf:rightIndent/><sf:atsuFontFeatures/><sf:tabs/><sf:superscript/><sf:paragraphBorderType/><sf:hyphenate/><sf:hidden/><sf:pageBreakBefore/><sf:paragraphFill><sf:null/></sf:paragraphFill><sf:spaceBefore/><sf:keepWithNext/><sf:outlineColor><sf:null/></sf:outlineColor><sf:paragraphRuleOffset/><sf:capitalization/><sf:leftIndent><sf:number sfa:number="28.35709" sfa:type="f"/></sf:leftIndent><sf:firstLineIndent><sf:number sfa:number="28.35709" sfa:type="f"/></sf:firstLineIndent></sf:property-map></sf:paragraphstyle><sf:characterstyle sfa:ID="SFWPCharacterStyle-10" sf:name="attribute-name" sf:ident="character-style-2"><sf:property-map><sf:italic/><sf:fontSize/><sf:fontColor><sf:color xsi:type="sfa:calibrated-rgb-color-type" sfa:r="0" sfa:g="0" sfa:b="0" sfa:a="1"/></sf:fontColor><sf:atsuFontFeatures/><sf:superscript/><sf:underline/><sf:bold><sf:number sfa:number="1" sfa:type="c"/></sf:bold><sf:tracking/><sf:ligatures/><sf:fontName><sf:string sfa:string="Courier-Bold"/></sf:fontName><sf:baselineShift/><sf:capitalization/><sf:textShadow/><sf:strikethru/><sf:language><sf:string sfa:string="en"/></sf:language><sf:underlineColor><sf:null/></sf:underlineColor><sf:strikethruColor><sf:null/></sf:strikethruColor></sf:property-map></sf:characterstyle><sf:paragraphstyle sfa:ID="SFWPParagraphStyle-39" sf:name="index-title" sf:ident="paragraph-style-27"><sf:property-map><sf:fontSize><sf:number sfa:number="18" sfa:type="f"/></sf:fontSize><sf:word_strikethrough/><sf:spaceAfter/><sf:alignment/><sf:keepLinesTogether/><sf:listStyle><sf:liststyle-ref sfa:IDREF="SFWPListStyle-2"/></sf:listStyle><sf:outlineLevel/><sf:firstTopicNumber/><sf:underline/><sf:defaultTabStops><sf:number sfa:number="28.34646" sfa:type="f"/></sf:defaultTabStops><sf:tocStyle><sf:tocstyle-ref sfa:IDREF="SLTOCParagraphStyle-3"/></sf:tocStyle><sf:dropCap/><sf:underlineWidth/><sf:fontName><sf:string sfa:string="Helvetica-Bold"/></sf:fontName><sf:strikethru/><sf:baselineShift/><sf:lineSpacing/><sf:textShadow/><sf:underlineColor><sf:null/></sf:underlineColor><sf:showInTOC><sf:number sfa:number="1" sfa:type="c"/></sf:showInTOC><sf:kerning/><sf:strikethruWidth/><sf:fontColor/><sf:textBackground><sf:null/></sf:textBackground><sf:paragraphRuleWidth/><sf:paragraphStroke><sf:null/></sf:paragraphStroke><sf:bold><sf:number sfa:number="1" sfa:type="c"/></sf:bold><sf:tracking/><sf:ligatures/><sf:language><sf:null/></sf:language><sf:followingParagraphStyle><sf:paragraphstyle-ref sfa:IDREF="SFWPParagraphStyle-7"/></sf:followingParagraphStyle><sf:outline/><sf:strikethruColor><sf:null/></sf:strikethruColor><sf:italic/><sf:word_underline/><sf:widowControl/><sf:rightIndent/><sf:atsuFontFeatures/><sf:tabs/><sf:superscript/><sf:paragraphBorderType/><sf:hyphenate/><sf:hidden/><sf:pageBreakBefore/><sf:paragraphFill><sf:null/></sf:paragraphFill><sf:spaceBefore><sf:number sfa:number="12" sfa:type="f"/></sf:spaceBefore><sf:keepWithNext><sf:number sfa:number="1" sfa:type="c"/></sf:keepWithNext><sf:outlineColor><sf:null/></sf:outlineColor><sf:paragraphRuleOffset/><sf:capitalization/><sf:leftIndent/><sf:firstLineIndent/></sf:property-map></sf:paragraphstyle><sf:characterstyle sfa:ID="SFWPCharacterStyle-11" sf:name="pob" sf:ident="character-style-23"><sf:property-map><sf:underlineColor><sf:null/></sf:underlineColor><sf:fontColor/><sf:fontSize/><sf:textBackground><sf:null/></sf:textBackground><sf:atsuFontFeatures/><sf:superscript/><sf:underline/><sf:bold><sf:number sfa:number="1" sfa:type="i"/></sf:bold><sf:fontName/><sf:ligatures/><sf:strikethru/><sf:baselineShift/><sf:tracking/><sf:capitalization/><sf:textShadow/><sf:language><sf:string sfa:string="en"/></sf:language><sf:italic/><sf:strikethruColor><sf:null/></sf:strikethruColor></sf:property-map></sf:characterstyle><sf:characterstyle sfa:ID="SFWPCharacterStyle-12" sf:name="email" sf:ident="character-style-9"><sf:property-map><sf:italic/><sf:fontColor><sf:color xsi:type="sfa:calibrated-rgb-color-type" sfa:r="0" sfa:g="0" sfa:b="1" sfa:a="1"/></sf:fontColor><sf:fontSize/><sf:atsuFontFeatures/><sf:superscript/><sf:underline><sf:number sfa:number="1" sfa:type="i"/></sf:underline><sf:bold/><sf:tracking/><sf:ligatures/><sf:fontName/><sf:strikethru/><sf:capitalization/><sf:textShadow/><sf:baselineShift/><sf:language><sf:string sfa:string="en"/></sf:language><sf:underlineColor><sf:null/></sf:underlineColor><sf:strikethruColor><sf:null/></sf:strikethruColor></sf:property-map></sf:characterstyle><sf:characterstyle sfa:ID="SFWPCharacterStyle-13" sf:name="inlinegraphic" sf:ident="character-style-25"><sf:property-map><sf:italic/><sf:fontSize/><sf:fontColor><sf:color xsi:type="sfa:calibrated-rgb-color-type" sfa:r="0" sfa:g="0.20000000298023224" sfa:b="0.60000002384185791" sfa:a="1"/></sf:fontColor><sf:atsuFontFeatures/><sf:superscript/><sf:underline><sf:number sfa:number="1" sfa:type="i"/></sf:underline><sf:bold/><sf:tracking/><sf:ligatures/><sf:fontName><sf:string sfa:string="Monaco"/></sf:fontName><sf:baselineShift/><sf:capitalization/><sf:textShadow/><sf:strikethru/><sf:language><sf:string sfa:string="en"/></sf:language><sf:underlineColor><sf:null/></sf:underlineColor><sf:strikethruColor><sf:null/></sf:strikethruColor></sf:property-map></sf:characterstyle><sf:chart-series-style sfa:ID="SFCSeriesStyle-1" sf:name="Series_3" sf:ident="Series_3" sf:seriesIndex="3"><sf:property-map><sf:SFC2DPieFillProperty><sf:color xsi:type="sfa:calibrated-rgb-color-type" sfa:r="0.75686275959014893" sfa:g="0.047058824449777603" sfa:b="0.12941177189350128" sfa:a="1"/></sf:SFC2DPieFillProperty><sf:SFCBarValueLabelPositionProperty><sf:number sfa:number="0" sfa:type="i"/></sf:SFCBarValueLabelPositionProperty><sf:SFC3DColumnFillProperty><sf:color xsi:type="sfa:calibrated-rgb-color-type" sfa:r="0.75686275959014893" sfa:g="0.047058824449777603" sfa:b="0.12941177189350128" sfa:a="1"/></sf:SFC3DColumnFillProperty><sf:SFC2DAreaUseSeriesFillForDataPointFillProperty><sf:number sfa:number="1" sfa:type="c"/></sf:SFC2DAreaUseSeriesFillForDataPointFillProperty><sf:SFC2DLineUseSeriesFillForDataPointFillProperty><sf:number sfa:number="0" sfa:type="c"/></sf:SFC2DLineUseSeriesFillForDataPointFillProperty><sf:SFC3DAreaFillProperty><sf:color xsi:type="sfa:calibrated-rgb-color-type" sfa:r="0.75686275959014893" sfa:g="0.047058824449777603" sfa:b="0.12941177189350128" sfa:a="1"/></sf:SFC3DAreaFillProperty><sf:SFCAreaShowValueLabelProperty><sf:number sfa:number="0" sfa:type="c"/></sf:SFCAreaShowValueLabelProperty><sf:SFCLabelShadowProperty><sf:shadow-ref sfa:IDREF="SFRShadow-3"/></sf:SFCLabelShadowProperty><sf:SFC2DLineDataPointSymbolProperty><sf:number sfa:number="1" sfa:type="i"/></sf:SFC2DLineDataPointSymbolProperty><sf:SFC2DPieStrokeProperty><sf:stroke sfa:ID="SFRStroke-16" sf:miter-limit="4" sf:width="1" sf:cap="butt" sf:join="miter"><sf:color xsi:type="sfa:calibrated-white-color-type" sfa:w="1" sfa:a="1"/><sf:pattern sfa:ID="SFRStrokePattern-16" sf:phase="0" sf:type="empty"><sf:pattern/></sf:pattern></sf:stroke></sf:SFC2DPieStrokeProperty><sf:SFC2DScatterShadowProperty><sf:shadow-ref sfa:IDREF="SFRShadow-0"/></sf:SFC2DScatterShadowProperty><sf:SFC2DAreaFillProperty><sf:color xsi:type="sfa:calibrated-rgb-color-type" sfa:r="0.75686275959014893" sfa:g="0.047058824449777603" sfa:b="0.12941177189350128" sfa:a="1"/></sf:SFC2DAreaFillProperty><sf:SFC2DLineDataPointFillProperty><sf:color xsi:type="sfa:calibrated-white-color-type" sfa:w="1" sfa:a="1"/></sf:SFC2DLineDataPointFillProperty><sf:SFC3DPieFillProperty><sf:color xsi:type="sfa:calibrated-rgb-color-type" sfa:r="0.75686275959014893" sfa:g="0.047058824449777603" sfa:b="0.12941177189350128" sfa:a="1"/></sf:SFC3DPieFillProperty><sf:SFC2DLineStrokeProperty><sf:stroke sfa:ID="SFRStroke-17" sf:miter-limit="4" sf:width="4" sf:cap="butt" sf:join="miter"><sf:color xsi:type="sfa:calibrated-rgb-color-type" sfa:r="0.75686275959014893" sfa:g="0.047058824449777603" sfa:b="0.12941177189350128" sfa:a="1"/><sf:pattern sfa:ID="SFRStrokePattern-17" sf:phase="0" sf:type="solid"><sf:pattern/></sf:pattern></sf:stroke></sf:SFC2DLineStrokeProperty><sf:SFC2DScatterStrokeProperty><sf:stroke sfa:ID="SFRStroke-18" sf:miter-limit="4" sf:width="4" sf:cap="butt" sf:join="miter"><sf:color xsi:type="sfa:calibrated-rgb-color-type" sfa:r="0.75686275959014893" sfa:g="0.047058824449777603" sfa:b="0.12941177189350128" sfa:a="1"/><sf:pattern sfa:ID="SFRStrokePattern-18" sf:phase="0" sf:type="empty"><sf:pattern/></sf:pattern></sf:stroke></sf:SFC2DScatterStrokeProperty><sf:SFC3DSeriesShininessProperty><sf:number sfa:number="0.5" sfa:type="f"/></sf:SFC3DSeriesShininessProperty><sf:SFC2DAreaDataPointSymbolProperty><sf:number sfa:number="0" sfa:type="i"/></sf:SFC2DAreaDataPointSymbolProperty><sf:SFC2DAreaUseStrokeColorForDataPointFillProperty><sf:number sfa:number="0" sfa:type="c"/></sf:SFC2DAreaUseStrokeColorForDataPointFillProperty><sf:SFC3DSeriesEmissiveColorProperty><sf:color xsi:type="sfa:calibrated-rgb-color-type" sfa:r="0" sfa:g="0" sfa:b="0" sfa:a="1"/></sf:SFC3DSeriesEmissiveColorProperty><sf:SFC3DTextureTilingProperty><sf:number sfa:number="1" sfa:type="f"/></sf:SFC3DTextureTilingProperty><sf:SFC2DLineShadowProperty><sf:shadow-ref sfa:IDREF="SFRShadow-0"/></sf:SFC2DLineShadowProperty><sf:SFCPieSeriesValueParagraphStyleProperty><sf:paragraphstyle sfa:ID="SFWPParagraphStyle-40" sf:ident="Series_3_SFCPieSeriesValueParagraphStyleProperty" sf:parent-ident="chart-paragraph-style-default"><sf:property-map><sf:outline/><sf:italic/><sf:strikethruColor><sf:null/></sf:strikethruColor><sf:word_underline/><sf:decimalTab/><sf:word_strikethrough/><sf:keepLinesTogether/><sf:spaceAfter/><sf:alignment><sf:number sfa:number="2" sfa:type="i"/></sf:alignment><sf:fontSize><sf:number sfa:number="16" sfa:type="f"/></sf:fontSize><sf:widowControl/><sf:rightIndent/><sf:atsuFontFeatures/><sf:tabs/><sf:dropCap/><sf:underline/><sf:underlineWidth/><sf:defaultTabStops/><sf:tocStyle><sf:null/></sf:tocStyle><sf:firstTopicNumber/><sf:outlineLevel/><sf:fontName/><sf:strikethru/><sf:baselineShift/><sf:lineSpacing/><sf:textShadow/><sf:superscript/><sf:hyphenate/><sf:underlineColor><sf:null/></sf:underlineColor><sf:hidden/><sf:showInTOC/><sf:kerning/><sf:pageBreakBefore/><sf:strikethruWidth/><sf:fontColor><sf:color xsi:type="sfa:calibrated-white-color-type" sfa:w="1" sfa:a="1"/></sf:fontColor><sf:paragraphFill><sf:null/></sf:paragraphFill><sf:spaceBefore/><sf:keepWithNext/><sf:outlineColor><sf:null/></sf:outlineColor><sf:paragraphStroke><sf:null/></sf:paragraphStroke><sf:bold/><sf:tracking/><sf:ligatures/><sf:capitalization/><sf:language><sf:null/></sf:language><sf:followingParagraphStyle><sf:null/></sf:followingParagraphStyle><sf:leftIndent/><sf:firstLineIndent/></sf:property-map></sf:paragraphstyle></sf:SFCPieSeriesValueParagraphStyleProperty><sf:SFCStackedBarValueLabelPositionProperty><sf:number sfa:number="0" sfa:type="i"/></sf:SFCStackedBarValueLabelPositionProperty><sf:SFC2DColumnFillProperty><sf:color xsi:type="sfa:calibrated-rgb-color-type" sfa:r="0.75686275959014893" sfa:g="0.047058824449777603" sfa:b="0.12941177189350128" sfa:a="1"/></sf:SFC2DColumnFillProperty><sf:SFC3DBarFillProperty><sf:color xsi:type="sfa:calibrated-rgb-color-type" sfa:r="0.75686275959014893" sfa:g="0.047058824449777603" sfa:b="0.12941177189350128" sfa:a="1"/></sf:SFC3DBarFillProperty><sf:SFC2DBarStrokeProperty><sf:stroke sfa:ID="SFRStroke-19" sf:miter-limit="4" sf:width="1" sf:cap="butt" sf:join="miter"><sf:color xsi:type="sfa:calibrated-white-color-type" sfa:w="1" sfa:a="1"/><sf:pattern sfa:ID="SFRStrokePattern-19" sf:phase="0" sf:type="empty"><sf:pattern/></sf:pattern></sf:stroke></sf:SFC2DBarStrokeProperty><sf:SFCLabelOpacityProperty><sf:number sfa:number="1" sfa:type="f"/></sf:SFCLabelOpacityProperty><sf:SFC2DPieShadowProperty><sf:shadow-ref sfa:IDREF="SFRShadow-0"/></sf:SFC2DPieShadowProperty><sf:SFCPieShowValueLabelProperty><sf:number sfa:number="1" sfa:type="c"/></sf:SFCPieShowValueLabelProperty><sf:SFCPieShowSeriesNameLabelProperty><sf:number sfa:number="0" sfa:type="c"/></sf:SFCPieShowSeriesNameLabelProperty><sf:SFCLineSeriesValueParagraphStyleProperty><sf:paragraphstyle sfa:ID="SFWPParagraphStyle-41" sf:ident="Series_3_SFCLineSeriesValueParagraphStyleProperty" sf:parent-ident="chart-paragraph-style-default"><sf:property-map><sf:outline/><sf:italic/><sf:strikethruColor><sf:null/></sf:strikethruColor><sf:word_underline/><sf:decimalTab/><sf:word_strikethrough/><sf:keepLinesTogether/><sf:spaceAfter/><sf:alignment/><sf:fontSize><sf:number sfa:number="14" sfa:type="f"/></sf:fontSize><sf:widowControl/><sf:rightIndent/><sf:atsuFontFeatures/><sf:tabs/><sf:dropCap/><sf:underline/><sf:underlineWidth/><sf:defaultTabStops/><sf:tocStyle><sf:null/></sf:tocStyle><sf:firstTopicNumber/><sf:outlineLevel/><sf:fontName/><sf:strikethru/><sf:baselineShift/><sf:lineSpacing/><sf:textShadow/><sf:superscript/><sf:hyphenate/><sf:underlineColor><sf:null/></sf:underlineColor><sf:hidden/><sf:showInTOC/><sf:kerning/><sf:pageBreakBefore/><sf:strikethruWidth/><sf:fontColor/><sf:paragraphFill><sf:null/></sf:paragraphFill><sf:spaceBefore/><sf:keepWithNext/><sf:outlineColor><sf:null/></sf:outlineColor><sf:paragraphStroke><sf:null/></sf:paragraphStroke><sf:bold/><sf:tracking/><sf:ligatures/><sf:capitalization/><sf:language><sf:null/></sf:language><sf:followingParagraphStyle><sf:null/></sf:followingParagraphStyle><sf:leftIndent/><sf:firstLineIndent/></sf:property-map></sf:paragraphstyle></sf:SFCLineSeriesValueParagraphStyleProperty><sf:SFC2DOpacityProperty><sf:number sfa:number="1" sfa:type="f"/></sf:SFC2DOpacityProperty><sf:SFCLineValueLabelPositionProperty><sf:number sfa:number="4" sfa:type="i"/></sf:SFCLineValueLabelPositionProperty><sf:SFCPieValueLabelPositionProperty><sf:number sfa:number="13" sfa:type="i"/></sf:SFCPieValueLabelPositionProperty><sf:SFCLineShowValueLabelProperty><sf:number sfa:number="0" sfa:type="c"/></sf:SFCLineShowValueLabelProperty><sf:SFC2DAreaDataPointFillProperty><sf:color xsi:type="sfa:calibrated-white-color-type" sfa:w="1" sfa:a="1"/></sf:SFC2DAreaDataPointFillProperty><sf:SFCStackedAreaValueLabelPositionProperty><sf:number sfa:number="10" sfa:type="i"/></sf:SFCStackedAreaValueLabelPositionProperty><sf:SFC2DAreaShadowProperty><sf:shadow-ref sfa:IDREF="SFRShadow-0"/></sf:SFC2DAreaShadowProperty><sf:SFC3DSeriesSpecularColorProperty><sf:color xsi:type="sfa:calibrated-rgb-color-type" sfa:r="0.89999997615814209" sfa:g="0.89999997615814209" sfa:b="0.89999997615814209" sfa:a="1"/></sf:SFC3DSeriesSpecularColorProperty><sf:SFC2DScatterDataPointSymbolProperty><sf:number sfa:number="1" sfa:type="i"/></sf:SFC2DScatterDataPointSymbolProperty><sf:SFC2DBarShadowProperty><sf:shadow-ref sfa:IDREF="SFRShadow-0"/></sf:SFC2DBarShadowProperty><sf:SFCBarSeriesValueParagraphStyleProperty><sf:paragraphstyle sfa:ID="SFWPParagraphStyle-42" sf:ident="Series_3_SFCBarSeriesValueParagraphStyleProperty" sf:parent-ident="chart-paragraph-style-default"><sf:property-map><sf:outline/><sf:italic/><sf:strikethruColor><sf:null/></sf:strikethruColor><sf:word_underline/><sf:decimalTab/><sf:word_strikethrough/><sf:keepLinesTogether/><sf:spaceAfter/><sf:alignment/><sf:fontSize><sf:number sfa:number="14" sfa:type="i"/></sf:fontSize><sf:widowControl/><sf:rightIndent/><sf:atsuFontFeatures/><sf:tabs/><sf:dropCap/><sf:underline/><sf:underlineWidth/><sf:defaultTabStops/><sf:tocStyle><sf:null/></sf:tocStyle><sf:firstTopicNumber/><sf:outlineLevel/><sf:fontName/><sf:strikethru/><sf:baselineShift/><sf:lineSpacing/><sf:textShadow/><sf:superscript/><sf:hyphenate/><sf:underlineColor><sf:null/></sf:underlineColor><sf:hidden/><sf:showInTOC/><sf:kerning/><sf:pageBreakBefore/><sf:strikethruWidth/><sf:fontColor><sf:color xsi:type="sfa:calibrated-white-color-type" sfa:w="1" sfa:a="1"/></sf:fontColor><sf:paragraphFill><sf:null/></sf:paragraphFill><sf:spaceBefore/><sf:keepWithNext/><sf:outlineColor><sf:null/></sf:outlineColor><sf:paragraphStroke><sf:null/></sf:paragraphStroke><sf:bold/><sf:tracking/><sf:ligatures/><sf:capitalization/><sf:language><sf:null/></sf:language><sf:followingParagraphStyle><sf:null/></sf:followingParagraphStyle><sf:leftIndent/><sf:firstLineIndent/></sf:property-map></sf:paragraphstyle></sf:SFCBarSeriesValueParagraphStyleProperty><sf:SFC2DScatterDataPointFillProperty><sf:color xsi:type="sfa:calibrated-rgb-color-type" sfa:r="0.75686275959014893" sfa:g="0.047058824449777603" sfa:b="0.12941177189350128" sfa:a="1"/></sf:SFC2DScatterDataPointFillProperty><sf:SFC2DBarFillProperty><sf:color xsi:type="sfa:calibrated-rgb-color-type" sfa:r="0.75686275959014893" sfa:g="0.047058824449777603" sfa:b="0.12941177189350128" sfa:a="1"/></sf:SFC2DBarFillProperty><sf:SFCBarShowValueLabelProperty><sf:number sfa:number="0" sfa:type="c"/></sf:SFCBarShowValueLabelProperty><sf:SFC2DAreaStrokeProperty><sf:stroke sfa:ID="SFRStroke-20" sf:miter-limit="4" sf:width="2" sf:cap="butt" sf:join="miter"><sf:color xsi:type="sfa:calibrated-white-color-type" sfa:w="1" sfa:a="1"/><sf:pattern-ref sfa:IDREF="SFRStrokePattern-15"/></sf:stroke></sf:SFC2DAreaStrokeProperty><sf:SFCAreaValueLabelPositionProperty><sf:number sfa:number="10" sfa:type="i"/></sf:SFCAreaValueLabelPositionProperty><sf:SFC3DPieShadowProperty><sf:shadow-ref sfa:IDREF="SFRShadow-4"/></sf:SFC3DPieShadowProperty><sf:SFC3DTextureProperty><sf:string sfa:string=""/></sf:SFC3DTextureProperty><sf:SFCAreaSeriesValueParagraphStyleProperty><sf:paragraphstyle sfa:ID="SFWPParagraphStyle-43" sf:ident="Series_3_SFCAreaSeriesValueParagraphStyleProperty" sf:parent-ident="chart-paragraph-style-default"><sf:property-map><sf:outline/><sf:italic/><sf:strikethruColor><sf:null/></sf:strikethruColor><sf:word_underline/><sf:decimalTab/><sf:word_strikethrough/><sf:keepLinesTogether/><sf:spaceAfter/><sf:alignment/><sf:fontSize><sf:number sfa:number="14" sfa:type="i"/></sf:fontSize><sf:widowControl/><sf:rightIndent/><sf:atsuFontFeatures/><sf:tabs/><sf:dropCap/><sf:underline/><sf:underlineWidth/><sf:defaultTabStops/><sf:tocStyle><sf:null/></sf:tocStyle><sf:firstTopicNumber/><sf:outlineLevel/><sf:fontName/><sf:strikethru/><sf:baselineShift/><sf:lineSpacing/><sf:textShadow/><sf:superscript/><sf:hyphenate/><sf:underlineColor><sf:null/></sf:underlineColor><sf:hidden/><sf:showInTOC/><sf:kerning/><sf:pageBreakBefore/><sf:strikethruWidth/><sf:fontColor><sf:color xsi:type="sfa:calibrated-white-color-type" sfa:w="1" sfa:a="1"/></sf:fontColor><sf:paragraphFill><sf:null/></sf:paragraphFill><sf:spaceBefore/><sf:keepWithNext/><sf:outlineColor><sf:null/></sf:outlineColor><sf:paragraphStroke><sf:null/></sf:paragraphStroke><sf:bold/><sf:tracking/><sf:ligatures/><sf:capitalization/><sf:language><sf:null/></sf:language><sf:followingParagraphStyle><sf:null/></sf:followingParagraphStyle><sf:leftIndent/><sf:firstLineIndent/></sf:property-map></sf:paragraphstyle></sf:SFCAreaSeriesValueParagraphStyleProperty><sf:SFC2DLineUseStrokeColorForDataPointFillProperty><sf:number sfa:number="0" sfa:type="c"/></sf:SFC2DLineUseStrokeColorForDataPointFillProperty><sf:SFC3DLineFillProperty><sf:color xsi:type="sfa:calibrated-rgb-color-type" sfa:r="0.75686275959014893" sfa:g="0.047058824449777603" sfa:b="0.12941177189350128" sfa:a="1"/></sf:SFC3DLineFillProperty><sf:SFCPieWedgeExplosionProperty><sf:number sfa:number="0" sfa:type="f"/></sf:SFCPieWedgeExplosionProperty></sf:property-map></sf:chart-series-style><sf:characterstyle sfa:ID="SFWPCharacterStyle-14" sf:name="citetitle" sf:ident="character-style-28"><sf:property-map><sf:italic><sf:number sfa:number="1" sfa:type="i"/></sf:italic><sf:fontSize/><sf:fontColor/><sf:atsuFontFeatures/><sf:superscript/><sf:underline/><sf:bold/><sf:tracking/><sf:fontName/><sf:baselineShift/><sf:strikethru/><sf:capitalization/><sf:textShadow/><sf:ligatures/><sf:language><sf:string sfa:string="en"/></sf:language><sf:underlineColor><sf:null/></sf:underlineColor><sf:strikethruColor><sf:null/></sf:strikethruColor></sf:property-map></sf:characterstyle><sf:chart-series-style sfa:ID="SFCSeriesStyle-2" sf:name="Series_5" sf:ident="Series_5" sf:seriesIndex="5"><sf:property-map><sf:SFC2DPieFillProperty><sf:color xsi:type="sfa:calibrated-rgb-color-type" sfa:r="0.92941176891326904" sfa:g="0.78823530673980713" sfa:b="0.14901961386203766" sfa:a="1"/></sf:SFC2DPieFillProperty><sf:SFCBarValueLabelPositionProperty><sf:number sfa:number="0" sfa:type="i"/></sf:SFCBarValueLabelPositionProperty><sf:SFC3DColumnFillProperty><sf:color xsi:type="sfa:calibrated-rgb-color-type" sfa:r="0.92941176891326904" sfa:g="0.78823530673980713" sfa:b="0.14901961386203766" sfa:a="1"/></sf:SFC3DColumnFillProperty><sf:SFC2DAreaUseSeriesFillForDataPointFillProperty><sf:number sfa:number="1" sfa:type="c"/></sf:SFC2DAreaUseSeriesFillForDataPointFillProperty><sf:SFC2DLineUseSeriesFillForDataPointFillProperty><sf:number sfa:number="0" sfa:type="c"/></sf:SFC2DLineUseSeriesFillForDataPointFillProperty><sf:SFC3DAreaFillProperty><sf:color xsi:type="sfa:calibrated-rgb-color-type" sfa:r="0.92941176891326904" sfa:g="0.78823530673980713" sfa:b="0.14901961386203766" sfa:a="1"/></sf:SFC3DAreaFillProperty><sf:SFCAreaShowValueLabelProperty><sf:number sfa:number="0" sfa:type="c"/></sf:SFCAreaShowValueLabelProperty><sf:SFCLabelShadowProperty><sf:shadow-ref sfa:IDREF="SFRShadow-3"/></sf:SFCLabelShadowProperty><sf:SFC2DLineDataPointSymbolProperty><sf:number sfa:number="1" sfa:type="i"/></sf:SFC2DLineDataPointSymbolProperty><sf:SFC2DPieStrokeProperty><sf:stroke sfa:ID="SFRStroke-21" sf:miter-limit="4" sf:width="1" sf:cap="butt" sf:join="miter"><sf:color xsi:type="sfa:calibrated-white-color-type" sfa:w="1" sfa:a="1"/><sf:pattern sfa:ID="SFRStrokePattern-20" sf:phase="0" sf:type="empty"><sf:pattern/></sf:pattern></sf:stroke></sf:SFC2DPieStrokeProperty><sf:SFC2DScatterShadowProperty><sf:shadow-ref sfa:IDREF="SFRShadow-0"/></sf:SFC2DScatterShadowProperty><sf:SFC2DAreaFillProperty><sf:color xsi:type="sfa:calibrated-rgb-color-type" sfa:r="0.92941176891326904" sfa:g="0.78823530673980713" sfa:b="0.14901961386203766" sfa:a="1"/></sf:SFC2DAreaFillProperty><sf:SFC2DLineDataPointFillProperty><sf:color xsi:type="sfa:calibrated-white-color-type" sfa:w="1" sfa:a="1"/></sf:SFC2DLineDataPointFillProperty><sf:SFC3DPieFillProperty><sf:color xsi:type="sfa:calibrated-rgb-color-type" sfa:r="0.92941176891326904" sfa:g="0.78823530673980713" sfa:b="0.14901961386203766" sfa:a="1"/></sf:SFC3DPieFillProperty><sf:SFC2DLineStrokeProperty><sf:stroke sfa:ID="SFRStroke-22" sf:miter-limit="4" sf:width="4" sf:cap="butt" sf:join="miter"><sf:color xsi:type="sfa:calibrated-rgb-color-type" sfa:r="0.92941176891326904" sfa:g="0.78823530673980713" sfa:b="0.14901961386203766" sfa:a="1"/><sf:pattern sfa:ID="SFRStrokePattern-21" sf:phase="0" sf:type="solid"><sf:pattern/></sf:pattern></sf:stroke></sf:SFC2DLineStrokeProperty><sf:SFC2DScatterStrokeProperty><sf:stroke sfa:ID="SFRStroke-23" sf:miter-limit="4" sf:width="4" sf:cap="butt" sf:join="miter"><sf:color xsi:type="sfa:calibrated-rgb-color-type" sfa:r="0.92941176891326904" sfa:g="0.78823530673980713" sfa:b="0.14901961386203766" sfa:a="1"/><sf:pattern sfa:ID="SFRStrokePattern-22" sf:phase="0" sf:type="empty"><sf:pattern/></sf:pattern></sf:stroke></sf:SFC2DScatterStrokeProperty><sf:SFC3DSeriesShininessProperty><sf:number sfa:number="0.5" sfa:type="f"/></sf:SFC3DSeriesShininessProperty><sf:SFC2DAreaDataPointSymbolProperty><sf:number sfa:number="0" sfa:type="i"/></sf:SFC2DAreaDataPointSymbolProperty><sf:SFC2DAreaUseStrokeColorForDataPointFillProperty><sf:number sfa:number="0" sfa:type="c"/></sf:SFC2DAreaUseStrokeColorForDataPointFillProperty><sf:SFC3DSeriesEmissiveColorProperty><sf:color xsi:type="sfa:calibrated-rgb-color-type" sfa:r="0" sfa:g="0" sfa:b="0" sfa:a="1"/></sf:SFC3DSeriesEmissiveColorProperty><sf:SFC3DTextureTilingProperty><sf:number sfa:number="1" sfa:type="f"/></sf:SFC3DTextureTilingProperty><sf:SFC2DLineShadowProperty><sf:shadow-ref sfa:IDREF="SFRShadow-0"/></sf:SFC2DLineShadowProperty><sf:SFCPieSeriesValueParagraphStyleProperty><sf:paragraphstyle sfa:ID="SFWPParagraphStyle-44" sf:ident="Series_5_SFCPieSeriesValueParagraphStyleProperty" sf:parent-ident="chart-paragraph-style-default"><sf:property-map><sf:outline/><sf:italic/><sf:strikethruColor><sf:null/></sf:strikethruColor><sf:word_underline/><sf:decimalTab/><sf:word_strikethrough/><sf:keepLinesTogether/><sf:spaceAfter/><sf:alignment><sf:number sfa:number="2" sfa:type="i"/></sf:alignment><sf:fontSize><sf:number sfa:number="16" sfa:type="f"/></sf:fontSize><sf:widowControl/><sf:rightIndent/><sf:atsuFontFeatures/><sf:tabs/><sf:dropCap/><sf:underline/><sf:underlineWidth/><sf:defaultTabStops/><sf:tocStyle><sf:null/></sf:tocStyle><sf:firstTopicNumber/><sf:outlineLevel/><sf:fontName/><sf:strikethru/><sf:baselineShift/><sf:lineSpacing/><sf:textShadow/><sf:superscript/><sf:hyphenate/><sf:underlineColor><sf:null/></sf:underlineColor><sf:hidden/><sf:showInTOC/><sf:kerning/><sf:pageBreakBefore/><sf:strikethruWidth/><sf:fontColor><sf:color xsi:type="sfa:calibrated-white-color-type" sfa:w="1" sfa:a="1"/></sf:fontColor><sf:paragraphFill><sf:null/></sf:paragraphFill><sf:spaceBefore/><sf:keepWithNext/><sf:outlineColor><sf:null/></sf:outlineColor><sf:paragraphStroke><sf:null/></sf:paragraphStroke><sf:bold/><sf:tracking/><sf:ligatures/><sf:capitalization/><sf:language><sf:null/></sf:language><sf:followingParagraphStyle><sf:null/></sf:followingParagraphStyle><sf:leftIndent/><sf:firstLineIndent/></sf:property-map></sf:paragraphstyle></sf:SFCPieSeriesValueParagraphStyleProperty><sf:SFCStackedBarValueLabelPositionProperty><sf:number sfa:number="0" sfa:type="i"/></sf:SFCStackedBarValueLabelPositionProperty><sf:SFC2DColumnFillProperty><sf:color xsi:type="sfa:calibrated-rgb-color-type" sfa:r="0.92941176891326904" sfa:g="0.78823530673980713" sfa:b="0.14901961386203766" sfa:a="1"/></sf:SFC2DColumnFillProperty><sf:SFC3DBarFillProperty><sf:color xsi:type="sfa:calibrated-rgb-color-type" sfa:r="0.92941176891326904" sfa:g="0.78823530673980713" sfa:b="0.14901961386203766" sfa:a="1"/></sf:SFC3DBarFillProperty><sf:SFC2DBarStrokeProperty><sf:stroke sfa:ID="SFRStroke-24" sf:miter-limit="4" sf:width="1" sf:cap="butt" sf:join="miter"><sf:color xsi:type="sfa:calibrated-white-color-type" sfa:w="1" sfa:a="1"/><sf:pattern sfa:ID="SFRStrokePattern-23" sf:phase="0" sf:type="empty"><sf:pattern/></sf:pattern></sf:stroke></sf:SFC2DBarStrokeProperty><sf:SFCLabelOpacityProperty><sf:number sfa:number="1" sfa:type="f"/></sf:SFCLabelOpacityProperty><sf:SFC2DPieShadowProperty><sf:shadow-ref sfa:IDREF="SFRShadow-0"/></sf:SFC2DPieShadowProperty><sf:SFCPieShowValueLabelProperty><sf:number sfa:number="1" sfa:type="c"/></sf:SFCPieShowValueLabelProperty><sf:SFCPieShowSeriesNameLabelProperty><sf:number sfa:number="0" sfa:type="c"/></sf:SFCPieShowSeriesNameLabelProperty><sf:SFCLineSeriesValueParagraphStyleProperty><sf:paragraphstyle sfa:ID="SFWPParagraphStyle-45" sf:ident="Series_5_SFCLineSeriesValueParagraphStyleProperty" sf:parent-ident="chart-paragraph-style-default"><sf:property-map><sf:outline/><sf:italic/><sf:strikethruColor><sf:null/></sf:strikethruColor><sf:word_underline/><sf:decimalTab/><sf:word_strikethrough/><sf:keepLinesTogether/><sf:spaceAfter/><sf:alignment/><sf:fontSize><sf:number sfa:number="14" sfa:type="f"/></sf:fontSize><sf:widowControl/><sf:rightIndent/><sf:atsuFontFeatures/><sf:tabs/><sf:dropCap/><sf:underline/><sf:underlineWidth/><sf:defaultTabStops/><sf:tocStyle><sf:null/></sf:tocStyle><sf:firstTopicNumber/><sf:outlineLevel/><sf:fontName/><sf:strikethru/><sf:baselineShift/><sf:lineSpacing/><sf:textShadow/><sf:superscript/><sf:hyphenate/><sf:underlineColor><sf:null/></sf:underlineColor><sf:hidden/><sf:showInTOC/><sf:kerning/><sf:pageBreakBefore/><sf:strikethruWidth/><sf:fontColor/><sf:paragraphFill><sf:null/></sf:paragraphFill><sf:spaceBefore/><sf:keepWithNext/><sf:outlineColor><sf:null/></sf:outlineColor><sf:paragraphStroke><sf:null/></sf:paragraphStroke><sf:bold/><sf:tracking/><sf:ligatures/><sf:capitalization/><sf:language><sf:null/></sf:language><sf:followingParagraphStyle><sf:null/></sf:followingParagraphStyle><sf:leftIndent/><sf:firstLineIndent/></sf:property-map></sf:paragraphstyle></sf:SFCLineSeriesValueParagraphStyleProperty><sf:SFC2DOpacityProperty><sf:number sfa:number="1" sfa:type="f"/></sf:SFC2DOpacityProperty><sf:SFCLineValueLabelPositionProperty><sf:number sfa:number="4" sfa:type="i"/></sf:SFCLineValueLabelPositionProperty><sf:SFCPieValueLabelPositionProperty><sf:number sfa:number="13" sfa:type="i"/></sf:SFCPieValueLabelPositionProperty><sf:SFCLineShowValueLabelProperty><sf:number sfa:number="0" sfa:type="c"/></sf:SFCLineShowValueLabelProperty><sf:SFC2DAreaDataPointFillProperty><sf:color xsi:type="sfa:calibrated-white-color-type" sfa:w="1" sfa:a="1"/></sf:SFC2DAreaDataPointFillProperty><sf:SFCStackedAreaValueLabelPositionProperty><sf:number sfa:number="10" sfa:type="i"/></sf:SFCStackedAreaValueLabelPositionProperty><sf:SFC2DAreaShadowProperty><sf:shadow-ref sfa:IDREF="SFRShadow-0"/></sf:SFC2DAreaShadowProperty><sf:SFC3DSeriesSpecularColorProperty><sf:color xsi:type="sfa:calibrated-rgb-color-type" sfa:r="0.89999997615814209" sfa:g="0.89999997615814209" sfa:b="0.89999997615814209" sfa:a="1"/></sf:SFC3DSeriesSpecularColorProperty><sf:SFC2DScatterDataPointSymbolProperty><sf:number sfa:number="1" sfa:type="i"/></sf:SFC2DScatterDataPointSymbolProperty><sf:SFC2DBarShadowProperty><sf:shadow-ref sfa:IDREF="SFRShadow-0"/></sf:SFC2DBarShadowProperty><sf:SFCBarSeriesValueParagraphStyleProperty><sf:paragraphstyle sfa:ID="SFWPParagraphStyle-46" sf:ident="Series_5_SFCBarSeriesValueParagraphStyleProperty" sf:parent-ident="chart-paragraph-style-default"><sf:property-map><sf:outline/><sf:italic/><sf:strikethruColor><sf:null/></sf:strikethruColor><sf:word_underline/><sf:decimalTab/><sf:word_strikethrough/><sf:keepLinesTogether/><sf:spaceAfter/><sf:alignment/><sf:fontSize><sf:number sfa:number="14" sfa:type="i"/></sf:fontSize><sf:widowControl/><sf:rightIndent/><sf:atsuFontFeatures/><sf:tabs/><sf:dropCap/><sf:underline/><sf:underlineWidth/><sf:defaultTabStops/><sf:tocStyle><sf:null/></sf:tocStyle><sf:firstTopicNumber/><sf:outlineLevel/><sf:fontName/><sf:strikethru/><sf:baselineShift/><sf:lineSpacing/><sf:textShadow/><sf:superscript/><sf:hyphenate/><sf:underlineColor><sf:null/></sf:underlineColor><sf:hidden/><sf:showInTOC/><sf:kerning/><sf:pageBreakBefore/><sf:strikethruWidth/><sf:fontColor><sf:color xsi:type="sfa:calibrated-white-color-type" sfa:w="1" sfa:a="1"/></sf:fontColor><sf:paragraphFill><sf:null/></sf:paragraphFill><sf:spaceBefore/><sf:keepWithNext/><sf:outlineColor><sf:null/></sf:outlineColor><sf:paragraphStroke><sf:null/></sf:paragraphStroke><sf:bold/><sf:tracking/><sf:ligatures/><sf:capitalization/><sf:language><sf:null/></sf:language><sf:followingParagraphStyle><sf:null/></sf:followingParagraphStyle><sf:leftIndent/><sf:firstLineIndent/></sf:property-map></sf:paragraphstyle></sf:SFCBarSeriesValueParagraphStyleProperty><sf:SFC2DScatterDataPointFillProperty><sf:color xsi:type="sfa:calibrated-rgb-color-type" sfa:r="0.92941176891326904" sfa:g="0.78823530673980713" sfa:b="0.14901961386203766" sfa:a="1"/></sf:SFC2DScatterDataPointFillProperty><sf:SFC2DBarFillProperty><sf:color xsi:type="sfa:calibrated-rgb-color-type" sfa:r="0.92941176891326904" sfa:g="0.78823530673980713" sfa:b="0.14901961386203766" sfa:a="1"/></sf:SFC2DBarFillProperty><sf:SFCBarShowValueLabelProperty><sf:number sfa:number="0" sfa:type="c"/></sf:SFCBarShowValueLabelProperty><sf:SFC2DAreaStrokeProperty><sf:stroke sfa:ID="SFRStroke-25" sf:miter-limit="4" sf:width="2" sf:cap="butt" sf:join="miter"><sf:color xsi:type="sfa:calibrated-white-color-type" sfa:w="1" sfa:a="1"/><sf:pattern-ref sfa:IDREF="SFRStrokePattern-15"/></sf:stroke></sf:SFC2DAreaStrokeProperty><sf:SFCAreaValueLabelPositionProperty><sf:number sfa:number="10" sfa:type="i"/></sf:SFCAreaValueLabelPositionProperty><sf:SFC3DPieShadowProperty><sf:shadow-ref sfa:IDREF="SFRShadow-4"/></sf:SFC3DPieShadowProperty><sf:SFC3DTextureProperty><sf:string sfa:string=""/></sf:SFC3DTextureProperty><sf:SFCAreaSeriesValueParagraphStyleProperty><sf:paragraphstyle sfa:ID="SFWPParagraphStyle-47" sf:ident="Series_5_SFCAreaSeriesValueParagraphStyleProperty" sf:parent-ident="chart-paragraph-style-default"><sf:property-map><sf:outline/><sf:italic/><sf:strikethruColor><sf:null/></sf:strikethruColor><sf:word_underline/><sf:decimalTab/><sf:word_strikethrough/><sf:keepLinesTogether/><sf:spaceAfter/><sf:alignment/><sf:fontSize><sf:number sfa:number="14" sfa:type="i"/></sf:fontSize><sf:widowControl/><sf:rightIndent/><sf:atsuFontFeatures/><sf:tabs/><sf:dropCap/><sf:underline/><sf:underlineWidth/><sf:defaultTabStops/><sf:tocStyle><sf:null/></sf:tocStyle><sf:firstTopicNumber/><sf:outlineLevel/><sf:fontName/><sf:strikethru/><sf:baselineShift/><sf:lineSpacing/><sf:textShadow/><sf:superscript/><sf:hyphenate/><sf:underlineColor><sf:null/></sf:underlineColor><sf:hidden/><sf:showInTOC/><sf:kerning/><sf:pageBreakBefore/><sf:strikethruWidth/><sf:fontColor><sf:color xsi:type="sfa:calibrated-white-color-type" sfa:w="1" sfa:a="1"/></sf:fontColor><sf:paragraphFill><sf:null/></sf:paragraphFill><sf:spaceBefore/><sf:keepWithNext/><sf:outlineColor><sf:null/></sf:outlineColor><sf:paragraphStroke><sf:null/></sf:paragraphStroke><sf:bold/><sf:tracking/><sf:ligatures/><sf:capitalization/><sf:language><sf:null/></sf:language><sf:followingParagraphStyle><sf:null/></sf:followingParagraphStyle><sf:leftIndent/><sf:firstLineIndent/></sf:property-map></sf:paragraphstyle></sf:SFCAreaSeriesValueParagraphStyleProperty><sf:SFC2DLineUseStrokeColorForDataPointFillProperty><sf:number sfa:number="0" sfa:type="c"/></sf:SFC2DLineUseStrokeColorForDataPointFillProperty><sf:SFC3DLineFillProperty><sf:color xsi:type="sfa:calibrated-rgb-color-type" sfa:r="0.92941176891326904" sfa:g="0.78823530673980713" sfa:b="0.14901961386203766" sfa:a="1"/></sf:SFC3DLineFillProperty><sf:SFCPieWedgeExplosionProperty><sf:number sfa:number="0" sfa:type="f"/></sf:SFCPieWedgeExplosionProperty></sf:property-map></sf:chart-series-style><sf:paragraphstyle sfa:ID="SFWPParagraphStyle-48" sf:name="legalnotice" sf:ident="paragraph-style-30"><sf:property-map><sf:fontSize/><sf:word_strikethrough/><sf:spaceAfter><sf:number sfa:number="12" sfa:type="f"/></sf:spaceAfter><sf:alignment/><sf:keepLinesTogether/><sf:listStyle><sf:liststyle-ref sfa:IDREF="SFWPListStyle-2"/></sf:listStyle><sf:outlineLevel/><sf:firstTopicNumber/><sf:underline><sf:number sfa:number="1" sfa:type="i"/></sf:underline><sf:defaultTabStops><sf:number sfa:number="28.34646" sfa:type="f"/></sf:defaultTabStops><sf:underlineWidth/><sf:dropCap/><sf:fontName/><sf:strikethru/><sf:baselineShift/><sf:lineSpacing/><sf:textShadow/><sf:underlineColor><sf:null/></sf:underlineColor><sf:kerning/><sf:strikethruWidth/><sf:fontColor/><sf:textBackground><sf:null/></sf:textBackground><sf:paragraphRuleWidth/><sf:paragraphStroke><sf:null/></sf:paragraphStroke><sf:bold/><sf:tracking/><sf:ligatures/><sf:language><sf:null/></sf:language><sf:followingParagraphStyle><sf:null/></sf:followingParagraphStyle><sf:outline/><sf:strikethruColor><sf:null/></sf:strikethruColor><sf:italic/><sf:word_underline/><sf:widowControl/><sf:rightIndent/><sf:atsuFontFeatures/><sf:tabs/><sf:superscript/><sf:paragraphBorderType/><sf:hyphenate/><sf:hidden/><sf:pageBreakBefore/><sf:paragraphFill><sf:color xsi:type="sfa:calibrated-rgb-color-type" sfa:r="0.60000002384185791" sfa:g="0.40000000596046448" sfa:b="0.20000000298023224" sfa:a="0.5"/></sf:paragraphFill><sf:spaceBefore/><sf:keepWithNext/><sf:outlineColor><sf:null/></sf:outlineColor><sf:paragraphRuleOffset/><sf:capitalization/><sf:leftIndent/><sf:firstLineIndent/></sf:property-map></sf:paragraphstyle><sf:paragraphstyle sfa:ID="SFWPParagraphStyle-49" sf:name="programlisting" sf:ident="paragraph-style-73"><sf:property-map><sf:fontSize><sf:number sfa:number="10" sfa:type="f"/></sf:fontSize><sf:word_strikethrough/><sf:spaceAfter><sf:number sfa:number="12" sfa:type="f"/></sf:spaceAfter><sf:alignment/><sf:keepLinesTogether/><sf:listStyle><sf:liststyle-ref sfa:IDREF="SFWPListStyle-2"/></sf:listStyle><sf:outlineLevel/><sf:firstTopicNumber/><sf:underline/><sf:defaultTabStops><sf:number sfa:number="28.34646" sfa:type="f"/></sf:defaultTabStops><sf:underlineWidth/><sf:dropCap/><sf:fontName><sf:string sfa:string="CourierNewPSMT"/></sf:fontName><sf:strikethru/><sf:baselineShift/><sf:lineSpacing/><sf:textShadow/><sf:underlineColor><sf:null/></sf:underlineColor><sf:kerning/><sf:strikethruWidth/><sf:fontColor/><sf:textBackground><sf:null/></sf:textBackground><sf:paragraphRuleWidth/><sf:paragraphStroke><sf:null/></sf:paragraphStroke><sf:bold/><sf:tracking/><sf:ligatures/><sf:language><sf:null/></sf:language><sf:followingParagraphStyle><sf:null/></sf:followingParagraphStyle><sf:outline/><sf:strikethruColor><sf:null/></sf:strikethruColor><sf:italic/><sf:word_underline/><sf:widowControl/><sf:rightIndent/><sf:atsuFontFeatures/><sf:tabs/><sf:superscript/><sf:paragraphBorderType/><sf:hyphenate/><sf:hidden/><sf:pageBreakBefore/><sf:paragraphFill><sf:null/></sf:paragraphFill><sf:spaceBefore/><sf:keepWithNext/><sf:outlineColor><sf:null/></sf:outlineColor><sf:paragraphRuleOffset/><sf:capitalization/><sf:leftIndent/><sf:firstLineIndent/></sf:property-map></sf:paragraphstyle><sf:paragraphstyle-ref sfa:IDREF="SFWPParagraphStyle-20"/><sf:paragraphstyle sfa:ID="SFWPParagraphStyle-50" sf:name="caution-title" sf:ident="paragraph-style-17"><sf:property-map><sf:fontSize><sf:number sfa:number="14" sfa:type="f"/></sf:fontSize><sf:word_strikethrough/><sf:spaceAfter><sf:number sfa:number="12" sfa:type="f"/></sf:spaceAfter><sf:alignment/><sf:keepLinesTogether/><sf:listStyle><sf:liststyle sfa:ID="SFWPListStyle-9" sf:parent-ident="list-style-default"><sf:property-map><sf:listTextIndents><sf:array sfa:ID="NSArray-31"><sf:number sfa:number="56.69291" sfa:type="f"/><sf:number sfa:number="36" sfa:type="f"/><sf:number sfa:number="72" sfa:type="f"/><sf:number sfa:number="108" sfa:type="f"/><sf:number sfa:number="144" sfa:type="f"/><sf:number sfa:number="180" sfa:type="f"/><sf:number sfa:number="216" sfa:type="f"/><sf:number sfa:number="252" sfa:type="f"/><sf:number sfa:number="288" sfa:type="f"/></sf:array></sf:listTextIndents><sf:labelCharacterStyle1><sf:characterstyle-ref sfa:IDREF="SFWPCharacterStyle-4"/></sf:labelCharacterStyle1><sf:listLabelGeometries><sf:array sfa:ID="NSArray-32"><sf:list-label-geometry sfa:ID="SFWPListLabelGeometry-63" sf:align="left" sf:scale="1" sf:offset="0" sf:scale-with-text="true"/><sf:list-label-geometry sfa:ID="SFWPListLabelGeometry-64" sf:align="left" sf:scale="1" sf:offset="0" sf:scale-with-text="true"/><sf:list-label-geometry sfa:ID="SFWPListLabelGeometry-65" sf:align="left" sf:scale="1" sf:offset="0" sf:scale-with-text="true"/><sf:list-label-geometry sfa:ID="SFWPListLabelGeometry-66" sf:align="left" sf:scale="1" sf:offset="0" sf:scale-with-text="true"/><sf:list-label-geometry sfa:ID="SFWPListLabelGeometry-67" sf:align="left" sf:scale="1" sf:offset="0" sf:scale-with-text="true"/><sf:list-label-geometry sfa:ID="SFWPListLabelGeometry-68" sf:align="left" sf:scale="1" sf:offset="0" sf:scale-with-text="true"/><sf:list-label-geometry sfa:ID="SFWPListLabelGeometry-69" sf:align="left" sf:scale="1" sf:offset="0" sf:scale-with-text="true"/><sf:list-label-geometry sfa:ID="SFWPListLabelGeometry-70" sf:align="left" sf:scale="1" sf:offset="0" sf:scale-with-text="true"/><sf:list-label-geometry sfa:ID="SFWPListLabelGeometry-71" sf:align="left" sf:scale="1" sf:offset="0" sf:scale-with-text="true"/></sf:array></sf:listLabelGeometries><sf:listLabelIndents><sf:array sfa:ID="NSArray-33"><sf:number sfa:number="0" sfa:type="f"/><sf:number sfa:number="0" sfa:type="f"/><sf:number sfa:number="0" sfa:type="f"/><sf:number sfa:number="0" sfa:type="f"/><sf:number sfa:number="0" sfa:type="f"/><sf:number sfa:number="0" sfa:type="f"/><sf:number sfa:number="0" sfa:type="f"/><sf:number sfa:number="0" sfa:type="f"/><sf:number sfa:number="0" sfa:type="f"/></sf:array></sf:listLabelIndents><sf:listLabelTypes><sf:array sfa:ID="NSArray-34"><sf:list-label-typeinfo sfa:ID="SFWPListLabelTypeInfo-63" sf:type="text"><sf:text-label sfa:ID="SFWPTextLabelFormat-37" sf:type="bullet" sf:format="!" sf:first="0"/></sf:list-label-typeinfo><sf:list-label-typeinfo sfa:ID="SFWPListLabelTypeInfo-64" sf:type="none"/><sf:list-label-typeinfo sfa:ID="SFWPListLabelTypeInfo-65" sf:type="none"/><sf:list-label-typeinfo sfa:ID="SFWPListLabelTypeInfo-66" sf:type="none"/><sf:list-label-typeinfo sfa:ID="SFWPListLabelTypeInfo-67" sf:type="none"/><sf:list-label-typeinfo sfa:ID="SFWPListLabelTypeInfo-68" sf:type="none"/><sf:list-label-typeinfo sfa:ID="SFWPListLabelTypeInfo-69" sf:type="none"/><sf:list-label-typeinfo sfa:ID="SFWPListLabelTypeInfo-70" sf:type="none"/><sf:list-label-typeinfo sfa:ID="SFWPListLabelTypeInfo-71" sf:type="none"/></sf:array></sf:listLabelTypes></sf:property-map></sf:liststyle></sf:listStyle><sf:outlineLevel/><sf:firstTopicNumber/><sf:underline/><sf:defaultTabStops><sf:number sfa:number="28.34646" sfa:type="f"/></sf:defaultTabStops><sf:underlineWidth/><sf:dropCap/><sf:fontName/><sf:strikethru/><sf:baselineShift/><sf:lineSpacing/><sf:textShadow/><sf:underlineColor><sf:null/></sf:underlineColor><sf:kerning/><sf:strikethruWidth/><sf:fontColor><sf:color xsi:type="sfa:calibrated-rgb-color-type" sfa:r="1" sfa:g="0" sfa:b="0" sfa:a="1"/></sf:fontColor><sf:textBackground><sf:null/></sf:textBackground><sf:paragraphRuleWidth/><sf:paragraphStroke><sf:null/></sf:paragraphStroke><sf:bold><sf:number sfa:number="1" sfa:type="i"/></sf:bold><sf:tracking/><sf:ligatures/><sf:language><sf:null/></sf:language><sf:followingParagraphStyle><sf:null/></sf:followingParagraphStyle><sf:outline/><sf:strikethruColor><sf:null/></sf:strikethruColor><sf:italic/><sf:word_underline/><sf:widowControl/><sf:rightIndent/><sf:atsuFontFeatures/><sf:tabs/><sf:superscript/><sf:paragraphBorderType/><sf:hyphenate/><sf:hidden/><sf:pageBreakBefore/><sf:paragraphFill><sf:null/></sf:paragraphFill><sf:spaceBefore/><sf:keepWithNext/><sf:outlineColor><sf:null/></sf:outlineColor><sf:paragraphRuleOffset/><sf:capitalization/><sf:leftIndent/><sf:firstLineIndent/></sf:property-map></sf:paragraphstyle><sf:paragraphstyle sfa:ID="SFWPParagraphStyle-51" sf:name="author" sf:ident="paragraph-style-8"><sf:property-map><sf:fontSize/><sf:word_strikethrough/><sf:spaceAfter><sf:number sfa:number="12" sfa:type="f"/></sf:spaceAfter><sf:alignment/><sf:keepLinesTogether/><sf:listStyle><sf:liststyle-ref sfa:IDREF="SFWPListStyle-2"/></sf:listStyle><sf:outlineLevel/><sf:firstTopicNumber/><sf:underline/><sf:defaultTabStops><sf:number sfa:number="28.34646" sfa:type="f"/></sf:defaultTabStops><sf:underlineWidth/><sf:dropCap/><sf:fontName/><sf:strikethru/><sf:baselineShift/><sf:lineSpacing/><sf:textShadow/><sf:underlineColor><sf:null/></sf:underlineColor><sf:kerning/><sf:strikethruWidth/><sf:fontColor/><sf:textBackground><sf:null/></sf:textBackground><sf:paragraphRuleWidth/><sf:paragraphStroke><sf:null/></sf:paragraphStroke><sf:bold/><sf:tracking/><sf:ligatures/><sf:language><sf:null/></sf:language><sf:followingParagraphStyle><sf:null/></sf:followingParagraphStyle><sf:outline/><sf:strikethruColor><sf:null/></sf:strikethruColor><sf:italic/><sf:word_underline/><sf:widowControl/><sf:rightIndent/><sf:atsuFontFeatures/><sf:tabs/><sf:superscript/><sf:paragraphBorderType/><sf:hyphenate/><sf:hidden/><sf:pageBreakBefore/><sf:paragraphFill><sf:null/></sf:paragraphFill><sf:spaceBefore/><sf:keepWithNext/><sf:outlineColor><sf:null/></sf:outlineColor><sf:paragraphRuleOffset/><sf:capitalization/><sf:leftIndent/><sf:firstLineIndent/></sf:property-map></sf:paragraphstyle><sf:characterstyle sfa:ID="SFWPCharacterStyle-15" sf:name="None" sf:ident="character-style-null"><sf:property-map/></sf:characterstyle><sf:characterstyle sfa:ID="SFWPCharacterStyle-16" sf:ident="kSLImportStylesHeadingStyleIdentifier" sf:parent-ident="character-style-null"><sf:property-map><sf:fontName><sf:string sfa:string="LucidaGrande"/></sf:fontName><sf:fontSize><sf:number sfa:number="13" sfa:type="f"/></sf:fontSize><sf:fontColor><sf:color xsi:type="sfa:calibrated-white-color-type" sfa:w="0.5" sfa:a="1"/></sf:fontColor></sf:property-map></sf:characterstyle><sf:layoutstyle sfa:ID="SFWPLayoutStyle-10" sf:name="Normal 22" sf:ident="layout-style-20"><sf:property-map><sf:verticalAlignment/><sf:layoutParagraphStyle><sf:null/></sf:layoutParagraphStyle><sf:columns/><sf:padding/><sf:layoutMargins/><sf:followingLayoutStyle><sf:null/></sf:followingLayoutStyle><sf:layoutContinuous/></sf:property-map></sf:layoutstyle><sf:cell-style-ref sfa:IDREF="SFTCellStyle-1"/><sf:paragraphstyle sfa:ID="SFWPParagraphStyle-52" sf:name="itemizedlist3" sf:ident="paragraph-style-96"><sf:property-map><sf:fontSize/><sf:word_strikethrough/><sf:spaceAfter/><sf:alignment/><sf:keepLinesTogether/><sf:listStyle><sf:liststyle sfa:ID="SFWPListStyle-10" sf:parent-ident="list-style-2"><sf:property-map><sf:listTextIndents><sf:array sfa:ID="NSArray-35"><sf:number sfa:number="9.000002" sfa:type="f"/><sf:number sfa:number="9" sfa:type="f"/><sf:number sfa:number="9" sfa:type="f"/><sf:number sfa:number="9" sfa:type="f"/><sf:number sfa:number="9" sfa:type="f"/><sf:number sfa:number="9" sfa:type="f"/><sf:number sfa:number="9" sfa:type="f"/><sf:number sfa:number="9" sfa:type="f"/><sf:number sfa:number="9" sfa:type="f"/></sf:array></sf:listTextIndents><sf:listLabelGeometries><sf:array sfa:ID="NSArray-36"><sf:list-label-geometry sfa:ID="SFWPListLabelGeometry-72" sf:align="left" sf:scale="1" sf:offset="-1" sf:scale-with-text="true"/><sf:list-label-geometry sfa:ID="SFWPListLabelGeometry-73" sf:align="left" sf:scale="1" sf:offset="-1" sf:scale-with-text="true"/><sf:list-label-geometry sfa:ID="SFWPListLabelGeometry-74" sf:align="left" sf:scale="1" sf:offset="-1" sf:scale-with-text="true"/><sf:list-label-geometry sfa:ID="SFWPListLabelGeometry-75" sf:align="left" sf:scale="1" sf:offset="-1" sf:scale-with-text="true"/><sf:list-label-geometry sfa:ID="SFWPListLabelGeometry-76" sf:align="left" sf:scale="1" sf:offset="-1" sf:scale-with-text="true"/><sf:list-label-geometry sfa:ID="SFWPListLabelGeometry-77" sf:align="left" sf:scale="1" sf:offset="-1" sf:scale-with-text="true"/><sf:list-label-geometry sfa:ID="SFWPListLabelGeometry-78" sf:align="left" sf:scale="1" sf:offset="-1" sf:scale-with-text="true"/><sf:list-label-geometry sfa:ID="SFWPListLabelGeometry-79" sf:align="left" sf:scale="1" sf:offset="-1" sf:scale-with-text="true"/><sf:list-label-geometry sfa:ID="SFWPListLabelGeometry-80" sf:align="left" sf:scale="1" sf:offset="-1" sf:scale-with-text="true"/></sf:array></sf:listLabelGeometries><sf:listLabelIndents><sf:array sfa:ID="NSArray-37"><sf:number sfa:number="28.34646" sfa:type="f"/><sf:number sfa:number="18" sfa:type="f"/><sf:number sfa:number="36" sfa:type="f"/><sf:number sfa:number="54" sfa:type="f"/><sf:number sfa:number="72" sfa:type="f"/><sf:number sfa:number="90" sfa:type="f"/><sf:number sfa:number="108" sfa:type="f"/><sf:number sfa:number="126" sfa:type="f"/><sf:number sfa:number="144" sfa:type="f"/></sf:array></sf:listLabelIndents><sf:listLabelTypes><sf:array sfa:ID="NSArray-38"><sf:list-label-typeinfo sfa:ID="SFWPListLabelTypeInfo-72" sf:type="text"><sf:text-label sfa:ID="SFWPTextLabelFormat-38" sf:type="bullet" sf:format="&#x2022;" sf:first="0"/></sf:list-label-typeinfo><sf:list-label-typeinfo sfa:ID="SFWPListLabelTypeInfo-73" sf:type="text"><sf:text-label sfa:ID="SFWPTextLabelFormat-39" sf:type="bullet" sf:format="&#x2022;" sf:first="0"/></sf:list-label-typeinfo><sf:list-label-typeinfo sfa:ID="SFWPListLabelTypeInfo-74" sf:type="text"><sf:text-label sfa:ID="SFWPTextLabelFormat-40" sf:type="bullet" sf:format="&#x2022;" sf:first="0"/></sf:list-label-typeinfo><sf:list-label-typeinfo sfa:ID="SFWPListLabelTypeInfo-75" sf:type="text"><sf:text-label sfa:ID="SFWPTextLabelFormat-41" sf:type="bullet" sf:format="&#x2022;" sf:first="0"/></sf:list-label-typeinfo><sf:list-label-typeinfo sfa:ID="SFWPListLabelTypeInfo-76" sf:type="text"><sf:text-label sfa:ID="SFWPTextLabelFormat-42" sf:type="bullet" sf:format="&#x2022;" sf:first="0"/></sf:list-label-typeinfo><sf:list-label-typeinfo sfa:ID="SFWPListLabelTypeInfo-77" sf:type="text"><sf:text-label sfa:ID="SFWPTextLabelFormat-43" sf:type="bullet" sf:format="&#x2022;" sf:first="0"/></sf:list-label-typeinfo><sf:list-label-typeinfo sfa:ID="SFWPListLabelTypeInfo-78" sf:type="text"><sf:text-label sfa:ID="SFWPTextLabelFormat-44" sf:type="bullet" sf:format="&#x2022;" sf:first="0"/></sf:list-label-typeinfo><sf:list-label-typeinfo sfa:ID="SFWPListLabelTypeInfo-79" sf:type="text"><sf:text-label sfa:ID="SFWPTextLabelFormat-45" sf:type="bullet" sf:format="&#x2022;" sf:first="0"/></sf:list-label-typeinfo><sf:list-label-typeinfo sfa:ID="SFWPListLabelTypeInfo-80" sf:type="text"><sf:text-label sfa:ID="SFWPTextLabelFormat-46" sf:type="bullet" sf:format="&#x2022;" sf:first="0"/></sf:list-label-typeinfo></sf:array></sf:listLabelTypes></sf:property-map></sf:liststyle></sf:listStyle><sf:outlineLevel/><sf:firstTopicNumber/><sf:underline/><sf:defaultTabStops><sf:number sfa:number="28.34646" sfa:type="f"/></sf:defaultTabStops><sf:underlineWidth/><sf:dropCap/><sf:fontName/><sf:strikethru/><sf:baselineShift/><sf:lineSpacing/><sf:textShadow/><sf:underlineColor><sf:null/></sf:underlineColor><sf:kerning/><sf:strikethruWidth/><sf:fontColor/><sf:textBackground><sf:null/></sf:textBackground><sf:paragraphRuleWidth/><sf:paragraphStroke><sf:null/></sf:paragraphStroke><sf:bold/><sf:tracking/><sf:ligatures/><sf:language><sf:null/></sf:language><sf:followingParagraphStyle><sf:null/></sf:followingParagraphStyle><sf:outline/><sf:strikethruColor><sf:null/></sf:strikethruColor><sf:italic/><sf:word_underline/><sf:widowControl/><sf:rightIndent/><sf:atsuFontFeatures/><sf:tabs/><sf:superscript/><sf:paragraphBorderType/><sf:hyphenate/><sf:hidden/><sf:pageBreakBefore/><sf:paragraphFill><sf:null/></sf:paragraphFill><sf:spaceBefore/><sf:keepWithNext/><sf:outlineColor><sf:null/></sf:outlineColor><sf:paragraphRuleOffset/><sf:capitalization/><sf:leftIndent/><sf:firstLineIndent/></sf:property-map></sf:paragraphstyle><sf:graphic-style sfa:ID="SFDGraphicStyle-7" sf:name="graphic-line-style-default" sf:ident="graphic-line-style-default"><sf:property-map><sf:opacity><sf:number sfa:number="1" sfa:type="f"/></sf:opacity><sf:reflection><sf:null/></sf:reflection><sf:headLineEnd><sf:null/></sf:headLineEnd><sf:externalTextWrap><sf:external-text-wrap sfa:ID="SFWPExternalTextWrap-6" sf:wrap-style="tight" sf:floating-wrap-enabled="true" sf:direction="both" sf:attachment-wrap-type="aligned" sf:floating-wrap-type="directional" sf:margin="12" sf:alpha-threshold="0.5"/></sf:externalTextWrap><sf:layoutStyle><sf:null/></sf:layoutStyle><sf:stroke><sf:stroke sfa:ID="SFRStroke-26" sf:miter-limit="4" sf:width="2" sf:cap="butt" sf:join="miter"><sf:color xsi:type="sfa:calibrated-white-color-type" sfa:w="0" sfa:a="1"/><sf:pattern sfa:ID="SFRStrokePattern-24" sf:phase="0" sf:type="solid"><sf:pattern/></sf:pattern></sf:stroke></sf:stroke><sf:fill><sf:null/></sf:fill><sf:shadow><sf:shadow-ref sfa:IDREF="SFRShadow-0"/></sf:shadow><sf:tailLineEnd><sf:null/></sf:tailLineEnd></sf:property-map></sf:graphic-style><sf:graphic-style sfa:ID="SFDGraphicStyle-8" sf:name="graphic-line-style-default 3" sf:ident="graphic-line-style-default-2" sf:parent-ident="graphic-line-style-default"><sf:property-map><sf:shadow><sf:shadow-ref sfa:IDREF="SFRShadow-0"/></sf:shadow></sf:property-map></sf:graphic-style><sf:paragraphstyle sfa:ID="SFWPParagraphStyle-53" sf:name="warning" sf:ident="paragraph-style-60"><sf:property-map><sf:fontSize><sf:number sfa:number="14" sfa:type="f"/></sf:fontSize><sf:word_strikethrough/><sf:spaceAfter><sf:number sfa:number="12" sfa:type="f"/></sf:spaceAfter><sf:alignment/><sf:keepLinesTogether/><sf:listStyle><sf:liststyle-ref sfa:IDREF="SFWPListStyle-5"/></sf:listStyle><sf:outlineLevel/><sf:firstTopicNumber/><sf:underline/><sf:defaultTabStops><sf:number sfa:number="28.34646" sfa:type="f"/></sf:defaultTabStops><sf:underlineWidth/><sf:dropCap/><sf:fontName/><sf:strikethru/><sf:baselineShift/><sf:lineSpacing/><sf:textShadow/><sf:underlineColor><sf:null/></sf:underlineColor><sf:kerning/><sf:strikethruWidth/><sf:fontColor><sf:color xsi:type="sfa:calibrated-rgb-color-type" sfa:r="1" sfa:g="1" sfa:b="0" sfa:a="1"/></sf:fontColor><sf:textBackground><sf:null/></sf:textBackground><sf:paragraphRuleWidth/><sf:paragraphStroke><sf:null/></sf:paragraphStroke><sf:bold/><sf:tracking/><sf:ligatures/><sf:language><sf:null/></sf:language><sf:followingParagraphStyle><sf:null/></sf:followingParagraphStyle><sf:outline/><sf:strikethruColor><sf:null/></sf:strikethruColor><sf:italic/><sf:word_underline/><sf:widowControl/><sf:rightIndent/><sf:atsuFontFeatures/><sf:tabs/><sf:superscript/><sf:paragraphBorderType/><sf:hyphenate/><sf:hidden/><sf:pageBreakBefore/><sf:paragraphFill><sf:null/></sf:paragraphFill><sf:spaceBefore/><sf:keepWithNext/><sf:outlineColor><sf:null/></sf:outlineColor><sf:paragraphRuleOffset/><sf:capitalization/><sf:leftIndent/><sf:firstLineIndent/></sf:property-map></sf:paragraphstyle><sf:paragraphstyle sfa:ID="SFWPParagraphStyle-54" sf:name="tip" sf:ident="paragraph-style-58"><sf:property-map><sf:fontSize/><sf:word_strikethrough/><sf:spaceAfter><sf:number sfa:number="12" sfa:type="f"/></sf:spaceAfter><sf:alignment/><sf:keepLinesTogether/><sf:listStyle><sf:liststyle-ref sfa:IDREF="SFWPListStyle-5"/></sf:listStyle><sf:outlineLevel/><sf:firstTopicNumber/><sf:underline/><sf:defaultTabStops><sf:number sfa:number="28.34646" sfa:type="f"/></sf:defaultTabStops><sf:underlineWidth/><sf:dropCap/><sf:fontName/><sf:strikethru/><sf:baselineShift/><sf:lineSpacing/><sf:textShadow/><sf:underlineColor><sf:null/></sf:underlineColor><sf:kerning/><sf:strikethruWidth/><sf:fontColor><sf:color xsi:type="sfa:calibrated-rgb-color-type" sfa:r="0" sfa:g="0" sfa:b="0" sfa:a="1"/></sf:fontColor><sf:textBackground><sf:null/></sf:textBackground><sf:paragraphRuleWidth/><sf:paragraphStroke><sf:null/></sf:paragraphStroke><sf:bold/><sf:tracking/><sf:ligatures/><sf:language><sf:null/></sf:language><sf:followingParagraphStyle><sf:null/></sf:followingParagraphStyle><sf:outline/><sf:strikethruColor><sf:null/></sf:strikethruColor><sf:italic/><sf:word_underline/><sf:widowControl/><sf:rightIndent/><sf:atsuFontFeatures/><sf:tabs/><sf:superscript/><sf:paragraphBorderType/><sf:hyphenate/><sf:hidden/><sf:pageBreakBefore/><sf:paragraphFill><sf:null/></sf:paragraphFill><sf:spaceBefore/><sf:keepWithNext/><sf:outlineColor><sf:null/></sf:outlineColor><sf:paragraphRuleOffset/><sf:capitalization/><sf:leftIndent/><sf:firstLineIndent/></sf:property-map></sf:paragraphstyle><sf:characterstyle sfa:ID="SFWPCharacterStyle-17" sf:name="jobtitle" sf:ident="character-style-13"><sf:property-map><sf:italic/><sf:fontColor/><sf:fontSize/><sf:atsuFontFeatures/><sf:superscript/><sf:underline/><sf:bold><sf:number sfa:number="1" sfa:type="i"/></sf:bold><sf:tracking/><sf:ligatures/><sf:fontName/><sf:strikethru/><sf:capitalization/><sf:textShadow/><sf:baselineShift/><sf:language><sf:string sfa:string="en"/></sf:language><sf:underlineColor><sf:null/></sf:underlineColor><sf:strikethruColor><sf:null/></sf:strikethruColor></sf:property-map></sf:characterstyle><sf:paragraphstyle sfa:ID="SFWPParagraphStyle-55" sf:name="variablelist-titleabbrev" sf:ident="paragraph-style-64"><sf:property-map><sf:fontSize><sf:number sfa:number="14" sfa:type="f"/></sf:fontSize><sf:word_strikethrough/><sf:spaceAfter><sf:number sfa:number="12" sfa:type="f"/></sf:spaceAfter><sf:alignment/><sf:keepLinesTogether/><sf:listStyle><sf:liststyle-ref sfa:IDREF="SFWPListStyle-2"/></sf:listStyle><sf:outlineLevel/><sf:firstTopicNumber/><sf:underline/><sf:defaultTabStops><sf:number sfa:number="28.34646" sfa:type="f"/></sf:defaultTabStops><sf:underlineWidth/><sf:dropCap/><sf:fontName/><sf:strikethru/><sf:baselineShift/><sf:lineSpacing/><sf:textShadow/><sf:underlineColor><sf:null/></sf:underlineColor><sf:kerning/><sf:strikethruWidth/><sf:fontColor/><sf:textBackground><sf:null/></sf:textBackground><sf:paragraphRuleWidth/><sf:paragraphStroke><sf:null/></sf:paragraphStroke><sf:bold/><sf:tracking/><sf:ligatures/><sf:language><sf:null/></sf:language><sf:followingParagraphStyle><sf:null/></sf:followingParagraphStyle><sf:outline/><sf:strikethruColor><sf:null/></sf:strikethruColor><sf:italic><sf:number sfa:number="1" sfa:type="i"/></sf:italic><sf:word_underline/><sf:widowControl/><sf:rightIndent/><sf:atsuFontFeatures/><sf:tabs/><sf:superscript/><sf:paragraphBorderType/><sf:hyphenate/><sf:hidden/><sf:pageBreakBefore/><sf:paragraphFill><sf:null/></sf:paragraphFill><sf:spaceBefore/><sf:keepWithNext/><sf:outlineColor><sf:null/></sf:outlineColor><sf:paragraphRuleOffset/><sf:capitalization/><sf:leftIndent/><sf:firstLineIndent><sf:number sfa:number="14.18209" sfa:type="f"/></sf:firstLineIndent></sf:property-map></sf:paragraphstyle><sf:chart-series-style sfa:ID="SFCSeriesStyle-3" sf:name="Series_4" sf:ident="Series_4" sf:seriesIndex="4"><sf:property-map><sf:SFC2DPieFillProperty><sf:color xsi:type="sfa:calibrated-rgb-color-type" sfa:r="0.90196079015731812" sfa:g="0.55686277151107788" sfa:b="0.14117647707462311" sfa:a="1"/></sf:SFC2DPieFillProperty><sf:SFCBarValueLabelPositionProperty><sf:number sfa:number="0" sfa:type="i"/></sf:SFCBarValueLabelPositionProperty><sf:SFC3DColumnFillProperty><sf:color xsi:type="sfa:calibrated-rgb-color-type" sfa:r="0.90196079015731812" sfa:g="0.55686277151107788" sfa:b="0.14117647707462311" sfa:a="1"/></sf:SFC3DColumnFillProperty><sf:SFC2DAreaUseSeriesFillForDataPointFillProperty><sf:number sfa:number="1" sfa:type="c"/></sf:SFC2DAreaUseSeriesFillForDataPointFillProperty><sf:SFC2DLineUseSeriesFillForDataPointFillProperty><sf:number sfa:number="0" sfa:type="c"/></sf:SFC2DLineUseSeriesFillForDataPointFillProperty><sf:SFC3DAreaFillProperty><sf:color xsi:type="sfa:calibrated-rgb-color-type" sfa:r="0.90196079015731812" sfa:g="0.55686277151107788" sfa:b="0.14117647707462311" sfa:a="1"/></sf:SFC3DAreaFillProperty><sf:SFCAreaShowValueLabelProperty><sf:number sfa:number="0" sfa:type="c"/></sf:SFCAreaShowValueLabelProperty><sf:SFCLabelShadowProperty><sf:shadow-ref sfa:IDREF="SFRShadow-3"/></sf:SFCLabelShadowProperty><sf:SFC2DLineDataPointSymbolProperty><sf:number sfa:number="1" sfa:type="i"/></sf:SFC2DLineDataPointSymbolProperty><sf:SFC2DPieStrokeProperty><sf:stroke sfa:ID="SFRStroke-27" sf:miter-limit="4" sf:width="1" sf:cap="butt" sf:join="miter"><sf:color xsi:type="sfa:calibrated-white-color-type" sfa:w="1" sfa:a="1"/><sf:pattern sfa:ID="SFRStrokePattern-25" sf:phase="0" sf:type="empty"><sf:pattern/></sf:pattern></sf:stroke></sf:SFC2DPieStrokeProperty><sf:SFC2DScatterShadowProperty><sf:shadow-ref sfa:IDREF="SFRShadow-0"/></sf:SFC2DScatterShadowProperty><sf:SFC2DAreaFillProperty><sf:color xsi:type="sfa:calibrated-rgb-color-type" sfa:r="0.90196079015731812" sfa:g="0.55686277151107788" sfa:b="0.14117647707462311" sfa:a="1"/></sf:SFC2DAreaFillProperty><sf:SFC2DLineDataPointFillProperty><sf:color xsi:type="sfa:calibrated-white-color-type" sfa:w="1" sfa:a="1"/></sf:SFC2DLineDataPointFillProperty><sf:SFC3DPieFillProperty><sf:color xsi:type="sfa:calibrated-rgb-color-type" sfa:r="0.90196079015731812" sfa:g="0.55686277151107788" sfa:b="0.14117647707462311" sfa:a="1"/></sf:SFC3DPieFillProperty><sf:SFC2DLineStrokeProperty><sf:stroke sfa:ID="SFRStroke-28" sf:miter-limit="4" sf:width="4" sf:cap="butt" sf:join="miter"><sf:color xsi:type="sfa:calibrated-rgb-color-type" sfa:r="0.90196079015731812" sfa:g="0.55686277151107788" sfa:b="0.14117647707462311" sfa:a="1"/><sf:pattern sfa:ID="SFRStrokePattern-26" sf:phase="0" sf:type="solid"><sf:pattern/></sf:pattern></sf:stroke></sf:SFC2DLineStrokeProperty><sf:SFC2DScatterStrokeProperty><sf:stroke sfa:ID="SFRStroke-29" sf:miter-limit="4" sf:width="4" sf:cap="butt" sf:join="miter"><sf:color xsi:type="sfa:calibrated-rgb-color-type" sfa:r="0.90196079015731812" sfa:g="0.55686277151107788" sfa:b="0.14117647707462311" sfa:a="1"/><sf:pattern sfa:ID="SFRStrokePattern-27" sf:phase="0" sf:type="empty"><sf:pattern/></sf:pattern></sf:stroke></sf:SFC2DScatterStrokeProperty><sf:SFC3DSeriesShininessProperty><sf:number sfa:number="0.5" sfa:type="f"/></sf:SFC3DSeriesShininessProperty><sf:SFC2DAreaDataPointSymbolProperty><sf:number sfa:number="0" sfa:type="i"/></sf:SFC2DAreaDataPointSymbolProperty><sf:SFC2DAreaUseStrokeColorForDataPointFillProperty><sf:number sfa:number="0" sfa:type="c"/></sf:SFC2DAreaUseStrokeColorForDataPointFillProperty><sf:SFC3DSeriesEmissiveColorProperty><sf:color xsi:type="sfa:calibrated-rgb-color-type" sfa:r="0" sfa:g="0" sfa:b="0" sfa:a="1"/></sf:SFC3DSeriesEmissiveColorProperty><sf:SFC3DTextureTilingProperty><sf:number sfa:number="1" sfa:type="f"/></sf:SFC3DTextureTilingProperty><sf:SFC2DLineShadowProperty><sf:shadow-ref sfa:IDREF="SFRShadow-0"/></sf:SFC2DLineShadowProperty><sf:SFCPieSeriesValueParagraphStyleProperty><sf:paragraphstyle sfa:ID="SFWPParagraphStyle-56" sf:ident="Series_4_SFCPieSeriesValueParagraphStyleProperty" sf:parent-ident="chart-paragraph-style-default"><sf:property-map><sf:outline/><sf:italic/><sf:strikethruColor><sf:null/></sf:strikethruColor><sf:word_underline/><sf:decimalTab/><sf:word_strikethrough/><sf:keepLinesTogether/><sf:spaceAfter/><sf:alignment><sf:number sfa:number="2" sfa:type="i"/></sf:alignment><sf:fontSize><sf:number sfa:number="16" sfa:type="f"/></sf:fontSize><sf:widowControl/><sf:rightIndent/><sf:atsuFontFeatures/><sf:tabs/><sf:dropCap/><sf:underline/><sf:underlineWidth/><sf:defaultTabStops/><sf:tocStyle><sf:null/></sf:tocStyle><sf:firstTopicNumber/><sf:outlineLevel/><sf:fontName/><sf:strikethru/><sf:baselineShift/><sf:lineSpacing/><sf:textShadow/><sf:superscript/><sf:hyphenate/><sf:underlineColor><sf:null/></sf:underlineColor><sf:hidden/><sf:showInTOC/><sf:kerning/><sf:pageBreakBefore/><sf:strikethruWidth/><sf:fontColor><sf:color xsi:type="sfa:calibrated-white-color-type" sfa:w="1" sfa:a="1"/></sf:fontColor><sf:paragraphFill><sf:null/></sf:paragraphFill><sf:spaceBefore/><sf:keepWithNext/><sf:outlineColor><sf:null/></sf:outlineColor><sf:paragraphStroke><sf:null/></sf:paragraphStroke><sf:bold/><sf:tracking/><sf:ligatures/><sf:capitalization/><sf:language><sf:null/></sf:language><sf:followingParagraphStyle><sf:null/></sf:followingParagraphStyle><sf:leftIndent/><sf:firstLineIndent/></sf:property-map></sf:paragraphstyle></sf:SFCPieSeriesValueParagraphStyleProperty><sf:SFCStackedBarValueLabelPositionProperty><sf:number sfa:number="0" sfa:type="i"/></sf:SFCStackedBarValueLabelPositionProperty><sf:SFC2DColumnFillProperty><sf:color xsi:type="sfa:calibrated-rgb-color-type" sfa:r="0.90196079015731812" sfa:g="0.55686277151107788" sfa:b="0.14117647707462311" sfa:a="1"/></sf:SFC2DColumnFillProperty><sf:SFC3DBarFillProperty><sf:color xsi:type="sfa:calibrated-rgb-color-type" sfa:r="0.90196079015731812" sfa:g="0.55686277151107788" sfa:b="0.14117647707462311" sfa:a="1"/></sf:SFC3DBarFillProperty><sf:SFC2DBarStrokeProperty><sf:stroke sfa:ID="SFRStroke-30" sf:miter-limit="4" sf:width="1" sf:cap="butt" sf:join="miter"><sf:color xsi:type="sfa:calibrated-white-color-type" sfa:w="1" sfa:a="1"/><sf:pattern sfa:ID="SFRStrokePattern-28" sf:phase="0" sf:type="empty"><sf:pattern/></sf:pattern></sf:stroke></sf:SFC2DBarStrokeProperty><sf:SFCLabelOpacityProperty><sf:number sfa:number="1" sfa:type="f"/></sf:SFCLabelOpacityProperty><sf:SFC2DPieShadowProperty><sf:shadow-ref sfa:IDREF="SFRShadow-0"/></sf:SFC2DPieShadowProperty><sf:SFCPieShowValueLabelProperty><sf:number sfa:number="1" sfa:type="c"/></sf:SFCPieShowValueLabelProperty><sf:SFCPieShowSeriesNameLabelProperty><sf:number sfa:number="0" sfa:type="c"/></sf:SFCPieShowSeriesNameLabelProperty><sf:SFCLineSeriesValueParagraphStyleProperty><sf:paragraphstyle sfa:ID="SFWPParagraphStyle-57" sf:ident="Series_4_SFCLineSeriesValueParagraphStyleProperty" sf:parent-ident="chart-paragraph-style-default"><sf:property-map><sf:outline/><sf:italic/><sf:strikethruColor><sf:null/></sf:strikethruColor><sf:word_underline/><sf:decimalTab/><sf:word_strikethrough/><sf:keepLinesTogether/><sf:spaceAfter/><sf:alignment/><sf:fontSize><sf:number sfa:number="14" sfa:type="f"/></sf:fontSize><sf:widowControl/><sf:rightIndent/><sf:atsuFontFeatures/><sf:tabs/><sf:dropCap/><sf:underline/><sf:underlineWidth/><sf:defaultTabStops/><sf:tocStyle><sf:null/></sf:tocStyle><sf:firstTopicNumber/><sf:outlineLevel/><sf:fontName/><sf:strikethru/><sf:baselineShift/><sf:lineSpacing/><sf:textShadow/><sf:superscript/><sf:hyphenate/><sf:underlineColor><sf:null/></sf:underlineColor><sf:hidden/><sf:showInTOC/><sf:kerning/><sf:pageBreakBefore/><sf:strikethruWidth/><sf:fontColor/><sf:paragraphFill><sf:null/></sf:paragraphFill><sf:spaceBefore/><sf:keepWithNext/><sf:outlineColor><sf:null/></sf:outlineColor><sf:paragraphStroke><sf:null/></sf:paragraphStroke><sf:bold/><sf:tracking/><sf:ligatures/><sf:capitalization/><sf:language><sf:null/></sf:language><sf:followingParagraphStyle><sf:null/></sf:followingParagraphStyle><sf:leftIndent/><sf:firstLineIndent/></sf:property-map></sf:paragraphstyle></sf:SFCLineSeriesValueParagraphStyleProperty><sf:SFC2DOpacityProperty><sf:number sfa:number="1" sfa:type="f"/></sf:SFC2DOpacityProperty><sf:SFCLineValueLabelPositionProperty><sf:number sfa:number="4" sfa:type="i"/></sf:SFCLineValueLabelPositionProperty><sf:SFCPieValueLabelPositionProperty><sf:number sfa:number="13" sfa:type="i"/></sf:SFCPieValueLabelPositionProperty><sf:SFCLineShowValueLabelProperty><sf:number sfa:number="0" sfa:type="c"/></sf:SFCLineShowValueLabelProperty><sf:SFC2DAreaDataPointFillProperty><sf:color xsi:type="sfa:calibrated-white-color-type" sfa:w="1" sfa:a="1"/></sf:SFC2DAreaDataPointFillProperty><sf:SFCStackedAreaValueLabelPositionProperty><sf:number sfa:number="10" sfa:type="i"/></sf:SFCStackedAreaValueLabelPositionProperty><sf:SFC2DAreaShadowProperty><sf:shadow-ref sfa:IDREF="SFRShadow-0"/></sf:SFC2DAreaShadowProperty><sf:SFC3DSeriesSpecularColorProperty><sf:color xsi:type="sfa:calibrated-rgb-color-type" sfa:r="0.89999997615814209" sfa:g="0.89999997615814209" sfa:b="0.89999997615814209" sfa:a="1"/></sf:SFC3DSeriesSpecularColorProperty><sf:SFC2DScatterDataPointSymbolProperty><sf:number sfa:number="1" sfa:type="i"/></sf:SFC2DScatterDataPointSymbolProperty><sf:SFC2DBarShadowProperty><sf:shadow-ref sfa:IDREF="SFRShadow-0"/></sf:SFC2DBarShadowProperty><sf:SFCBarSeriesValueParagraphStyleProperty><sf:paragraphstyle sfa:ID="SFWPParagraphStyle-58" sf:ident="Series_4_SFCBarSeriesValueParagraphStyleProperty" sf:parent-ident="chart-paragraph-style-default"><sf:property-map><sf:outline/><sf:italic/><sf:strikethruColor><sf:null/></sf:strikethruColor><sf:word_underline/><sf:decimalTab/><sf:word_strikethrough/><sf:keepLinesTogether/><sf:spaceAfter/><sf:alignment/><sf:fontSize><sf:number sfa:number="14" sfa:type="i"/></sf:fontSize><sf:widowControl/><sf:rightIndent/><sf:atsuFontFeatures/><sf:tabs/><sf:dropCap/><sf:underline/><sf:underlineWidth/><sf:defaultTabStops/><sf:tocStyle><sf:null/></sf:tocStyle><sf:firstTopicNumber/><sf:outlineLevel/><sf:fontName/><sf:strikethru/><sf:baselineShift/><sf:lineSpacing/><sf:textShadow/><sf:superscript/><sf:hyphenate/><sf:underlineColor><sf:null/></sf:underlineColor><sf:hidden/><sf:showInTOC/><sf:kerning/><sf:pageBreakBefore/><sf:strikethruWidth/><sf:fontColor><sf:color xsi:type="sfa:calibrated-white-color-type" sfa:w="1" sfa:a="1"/></sf:fontColor><sf:paragraphFill><sf:null/></sf:paragraphFill><sf:spaceBefore/><sf:keepWithNext/><sf:outlineColor><sf:null/></sf:outlineColor><sf:paragraphStroke><sf:null/></sf:paragraphStroke><sf:bold/><sf:tracking/><sf:ligatures/><sf:capitalization/><sf:language><sf:null/></sf:language><sf:followingParagraphStyle><sf:null/></sf:followingParagraphStyle><sf:leftIndent/><sf:firstLineIndent/></sf:property-map></sf:paragraphstyle></sf:SFCBarSeriesValueParagraphStyleProperty><sf:SFC2DScatterDataPointFillProperty><sf:color xsi:type="sfa:calibrated-rgb-color-type" sfa:r="0.90196079015731812" sfa:g="0.55686277151107788" sfa:b="0.14117647707462311" sfa:a="1"/></sf:SFC2DScatterDataPointFillProperty><sf:SFC2DBarFillProperty><sf:color xsi:type="sfa:calibrated-rgb-color-type" sfa:r="0.90196079015731812" sfa:g="0.55686277151107788" sfa:b="0.14117647707462311" sfa:a="1"/></sf:SFC2DBarFillProperty><sf:SFCBarShowValueLabelProperty><sf:number sfa:number="0" sfa:type="c"/></sf:SFCBarShowValueLabelProperty><sf:SFC2DAreaStrokeProperty><sf:stroke sfa:ID="SFRStroke-31" sf:miter-limit="4" sf:width="2" sf:cap="butt" sf:join="miter"><sf:color xsi:type="sfa:calibrated-white-color-type" sfa:w="1" sfa:a="1"/><sf:pattern-ref sfa:IDREF="SFRStrokePattern-15"/></sf:stroke></sf:SFC2DAreaStrokeProperty><sf:SFCAreaValueLabelPositionProperty><sf:number sfa:number="10" sfa:type="i"/></sf:SFCAreaValueLabelPositionProperty><sf:SFC3DPieShadowProperty><sf:shadow-ref sfa:IDREF="SFRShadow-4"/></sf:SFC3DPieShadowProperty><sf:SFC3DTextureProperty><sf:string sfa:string=""/></sf:SFC3DTextureProperty><sf:SFCAreaSeriesValueParagraphStyleProperty><sf:paragraphstyle sfa:ID="SFWPParagraphStyle-59" sf:ident="Series_4_SFCAreaSeriesValueParagraphStyleProperty" sf:parent-ident="chart-paragraph-style-default"><sf:property-map><sf:outline/><sf:italic/><sf:strikethruColor><sf:null/></sf:strikethruColor><sf:word_underline/><sf:decimalTab/><sf:word_strikethrough/><sf:keepLinesTogether/><sf:spaceAfter/><sf:alignment/><sf:fontSize><sf:number sfa:number="14" sfa:type="i"/></sf:fontSize><sf:widowControl/><sf:rightIndent/><sf:atsuFontFeatures/><sf:tabs/><sf:dropCap/><sf:underline/><sf:underlineWidth/><sf:defaultTabStops/><sf:tocStyle><sf:null/></sf:tocStyle><sf:firstTopicNumber/><sf:outlineLevel/><sf:fontName/><sf:strikethru/><sf:baselineShift/><sf:lineSpacing/><sf:textShadow/><sf:superscript/><sf:hyphenate/><sf:underlineColor><sf:null/></sf:underlineColor><sf:hidden/><sf:showInTOC/><sf:kerning/><sf:pageBreakBefore/><sf:strikethruWidth/><sf:fontColor><sf:color xsi:type="sfa:calibrated-white-color-type" sfa:w="1" sfa:a="1"/></sf:fontColor><sf:paragraphFill><sf:null/></sf:paragraphFill><sf:spaceBefore/><sf:keepWithNext/><sf:outlineColor><sf:null/></sf:outlineColor><sf:paragraphStroke><sf:null/></sf:paragraphStroke><sf:bold/><sf:tracking/><sf:ligatures/><sf:capitalization/><sf:language><sf:null/></sf:language><sf:followingParagraphStyle><sf:null/></sf:followingParagraphStyle><sf:leftIndent/><sf:firstLineIndent/></sf:property-map></sf:paragraphstyle></sf:SFCAreaSeriesValueParagraphStyleProperty><sf:SFC2DLineUseStrokeColorForDataPointFillProperty><sf:number sfa:number="0" sfa:type="c"/></sf:SFC2DLineUseStrokeColorForDataPointFillProperty><sf:SFC3DLineFillProperty><sf:color xsi:type="sfa:calibrated-rgb-color-type" sfa:r="0.90196079015731812" sfa:g="0.55686277151107788" sfa:b="0.14117647707462311" sfa:a="1"/></sf:SFC3DLineFillProperty><sf:SFCPieWedgeExplosionProperty><sf:number sfa:number="0" sfa:type="f"/></sf:SFCPieWedgeExplosionProperty></sf:property-map></sf:chart-series-style><sf:paragraphstyle sfa:ID="SFWPParagraphStyle-60" sf:name="sect5-subtitle" sf:ident="paragraph-style-51"><sf:property-map><sf:fontSize><sf:number sfa:number="14" sfa:type="f"/></sf:fontSize><sf:word_strikethrough/><sf:spaceAfter/><sf:alignment/><sf:keepLinesTogether/><sf:listStyle><sf:liststyle-ref sfa:IDREF="SFWPListStyle-2"/></sf:listStyle><sf:outlineLevel/><sf:firstTopicNumber/><sf:underline/><sf:defaultTabStops><sf:number sfa:number="28.34646" sfa:type="f"/></sf:defaultTabStops><sf:tocStyle><sf:tocstyle-ref sfa:IDREF="SLTOCParagraphStyle-3"/></sf:tocStyle><sf:dropCap/><sf:underlineWidth/><sf:fontName><sf:string sfa:string="Helvetica-Bold"/></sf:fontName><sf:strikethru/><sf:baselineShift/><sf:lineSpacing/><sf:textShadow/><sf:underlineColor><sf:null/></sf:underlineColor><sf:showInTOC><sf:number sfa:number="1" sfa:type="c"/></sf:showInTOC><sf:kerning/><sf:strikethruWidth/><sf:fontColor/><sf:textBackground><sf:null/></sf:textBackground><sf:paragraphRuleWidth/><sf:paragraphStroke><sf:null/></sf:paragraphStroke><sf:bold/><sf:tracking/><sf:ligatures/><sf:language><sf:null/></sf:language><sf:followingParagraphStyle><sf:paragraphstyle-ref sfa:IDREF="SFWPParagraphStyle-7"/></sf:followingParagraphStyle><sf:outline/><sf:strikethruColor><sf:null/></sf:strikethruColor><sf:italic/><sf:word_underline/><sf:widowControl/><sf:rightIndent/><sf:atsuFontFeatures/><sf:tabs/><sf:superscript/><sf:paragraphBorderType/><sf:hyphenate/><sf:hidden/><sf:pageBreakBefore/><sf:paragraphFill><sf:null/></sf:paragraphFill><sf:spaceBefore><sf:number sfa:number="12" sfa:type="f"/></sf:spaceBefore><sf:keepWithNext><sf:number sfa:number="1" sfa:type="c"/></sf:keepWithNext><sf:outlineColor><sf:null/></sf:outlineColor><sf:paragraphRuleOffset/><sf:capitalization/><sf:leftIndent/><sf:firstLineIndent/></sf:property-map></sf:paragraphstyle><sf:characterstyle sfa:ID="SFWPCharacterStyle-18" sf:name="otheraddr" sf:ident="character-style-30"><sf:property-map><sf:italic/><sf:fontSize/><sf:fontColor/><sf:atsuFontFeatures/><sf:superscript/><sf:underline/><sf:bold><sf:number sfa:number="1" sfa:type="c"/></sf:bold><sf:tracking/><sf:fontName><sf:string sfa:string="CourierNewPS-BoldMT"/></sf:fontName><sf:baselineShift/><sf:ligatures/><sf:strikethru/><sf:capitalization/><sf:textShadow/><sf:language><sf:string sfa:string="en"/></sf:language><sf:underlineColor><sf:null/></sf:underlineColor><sf:strikethruColor><sf:null/></sf:strikethruColor></sf:property-map></sf:characterstyle><sf:paragraphstyle sfa:ID="SFWPParagraphStyle-61" sf:name="tip-title" sf:ident="paragraph-style-59"><sf:property-map><sf:fontSize><sf:number sfa:number="14" sfa:type="f"/></sf:fontSize><sf:word_strikethrough/><sf:spaceAfter><sf:number sfa:number="12" sfa:type="f"/></sf:spaceAfter><sf:alignment/><sf:keepLinesTogether/><sf:listStyle><sf:liststyle-ref sfa:IDREF="SFWPListStyle-5"/></sf:listStyle><sf:outlineLevel/><sf:firstTopicNumber/><sf:underline/><sf:defaultTabStops><sf:number sfa:number="28.34646" sfa:type="f"/></sf:defaultTabStops><sf:underlineWidth/><sf:dropCap/><sf:fontName/><sf:strikethru/><sf:baselineShift/><sf:lineSpacing/><sf:textShadow/><sf:underlineColor><sf:null/></sf:underlineColor><sf:kerning/><sf:strikethruWidth/><sf:fontColor><sf:color xsi:type="sfa:calibrated-rgb-color-type" sfa:r="0" sfa:g="0" sfa:b="0" sfa:a="1"/></sf:fontColor><sf:textBackground><sf:null/></sf:textBackground><sf:paragraphRuleWidth/><sf:paragraphStroke><sf:null/></sf:paragraphStroke><sf:bold><sf:number sfa:number="1" sfa:type="i"/></sf:bold><sf:tracking/><sf:ligatures/><sf:language><sf:null/></sf:language><sf:followingParagraphStyle><sf:null/></sf:followingParagraphStyle><sf:outline/><sf:strikethruColor><sf:null/></sf:strikethruColor><sf:italic/><sf:word_underline/><sf:widowControl/><sf:rightIndent/><sf:atsuFontFeatures/><sf:tabs/><sf:superscript/><sf:paragraphBorderType/><sf:hyphenate/><sf:hidden/><sf:pageBreakBefore/><sf:paragraphFill><sf:null/></sf:paragraphFill><sf:spaceBefore/><sf:keepWithNext/><sf:outlineColor><sf:null/></sf:outlineColor><sf:paragraphRuleOffset/><sf:capitalization/><sf:leftIndent/><sf:firstLineIndent/></sf:property-map></sf:paragraphstyle><sf:cell-style-ref sfa:IDREF="SFTCellStyle-3"/><sf:graphic-style sfa:ID="SFDGraphicStyle-9" sf:name="graphic-shape-style-default" sf:ident="graphic-shape-style-default"><sf:property-map><sf:opacity><sf:number sfa:number="1" sfa:type="f"/></sf:opacity><sf:reflection><sf:null/></sf:reflection><sf:externalTextWrap><sf:external-text-wrap sfa:ID="SFWPExternalTextWrap-7" sf:wrap-style="tight" sf:floating-wrap-enabled="true" sf:direction="both" sf:attachment-wrap-type="aligned" sf:floating-wrap-type="directional" sf:margin="12" sf:alpha-threshold="0.5"/></sf:externalTextWrap><sf:stroke><sf:stroke sfa:ID="SFRStroke-32" sf:miter-limit="4" sf:width="1" sf:cap="butt" sf:join="miter"><sf:color xsi:type="sfa:calibrated-white-color-type" sfa:w="0" sfa:a="1"/><sf:pattern sfa:ID="SFRStrokePattern-29" sf:phase="0" sf:type="solid"><sf:pattern/></sf:pattern></sf:stroke></sf:stroke><sf:layoutStyle><sf:null/></sf:layoutStyle><sf:fill><sf:color xsi:type="sfa:calibrated-rgb-color-type" sfa:r="0.40784314274787903" sfa:g="0.63529413938522339" sfa:b="0.18431372940540314" sfa:a="1"/></sf:fill><sf:shadow><sf:shadow-ref sfa:IDREF="SFRShadow-0"/></sf:shadow></sf:property-map></sf:graphic-style><sf:graphic-style sfa:ID="SFDGraphicStyle-10" sf:name="graphic-shape-style-default 8" sf:ident="graphic-shape-style-default-7" sf:parent-ident="graphic-shape-style-default"><sf:property-map><sf:layoutStyle><sf:null/></sf:layoutStyle><sf:fill><sf:color xsi:type="sfa:calibrated-rgb-color-type" sfa:r="0.41568627953529358" sfa:g="0.66274511814117432" sfa:b="0.39215686917304993" sfa:a="1"/></sf:fill></sf:property-map></sf:graphic-style><sf:graphic-style sfa:ID="SFDGraphicStyle-11" sf:name="graphic-shape-style-default 3" sf:ident="graphic-shape-style-default-2" sf:parent-ident="graphic-shape-style-default"><sf:property-map><sf:layoutStyle><sf:null/></sf:layoutStyle><sf:fill><sf:color xsi:type="sfa:calibrated-rgb-color-type" sfa:r="0.41568627953529358" sfa:g="0.66274511814117432" sfa:b="0.39215686917304993" sfa:a="1"/></sf:fill></sf:property-map></sf:graphic-style><sf:graphic-style sfa:ID="SFDGraphicStyle-12" sf:name="graphic-shape-style-default 2" sf:ident="graphic-shape-style-default-1" sf:parent-ident="graphic-shape-style-default"><sf:property-map><sf:layoutStyle><sf:null/></sf:layoutStyle><sf:fill><sf:color xsi:type="sfa:device-cmyk-color-type" sfa:c="0" sfa:m="0" sfa:y="0" sfa:k="0.34999999403953552" sfa:a="1"/></sf:fill></sf:property-map></sf:graphic-style><sf:graphic-style sfa:ID="SFDGraphicStyle-13" sf:name="graphic-shape-style-default 7" sf:ident="graphic-shape-style-default-6" sf:parent-ident="graphic-shape-style-default"><sf:property-map><sf:layoutStyle><sf:null/></sf:layoutStyle><sf:fill><sf:color xsi:type="sfa:calibrated-rgb-color-type" sfa:r="0.41568627953529358" sfa:g="0.66274511814117432" sfa:b="0.39215686917304993" sfa:a="1"/></sf:fill></sf:property-map></sf:graphic-style><sf:graphic-style sfa:ID="SFDGraphicStyle-14" sf:name="graphic-shape-style-default 4" sf:ident="graphic-shape-style-default-3" sf:parent-ident="graphic-shape-style-default"><sf:property-map><sf:layoutStyle><sf:null/></sf:layoutStyle><sf:fill><sf:color xsi:type="sfa:calibrated-rgb-color-type" sfa:r="0.41568627953529358" sfa:g="0.66274511814117432" sfa:b="0.39215686917304993" sfa:a="1"/></sf:fill></sf:property-map></sf:graphic-style><sf:characterstyle sfa:ID="SFWPCharacterStyle-19" sf:name="lineage" sf:ident="character-style-14"><sf:property-map><sf:italic/><sf:fontSize/><sf:fontColor/><sf:atsuFontFeatures/><sf:superscript/><sf:underline><sf:number sfa:number="1" sfa:type="i"/></sf:underline><sf:bold/><sf:tracking/><sf:ligatures/><sf:fontName/><sf:baselineShift/><sf:capitalization/><sf:textShadow/><sf:strikethru/><sf:language><sf:string sfa:string="en"/></sf:language><sf:underlineColor><sf:null/></sf:underlineColor><sf:strikethruColor><sf:null/></sf:strikethruColor></sf:property-map></sf:characterstyle><sf:paragraphstyle sfa:ID="SFWPParagraphStyle-62" sf:ident="chart-paragraph-style-default"><sf:property-map><sf:fontSize/><sf:word_strikethrough/><sf:spaceAfter/><sf:alignment/><sf:keepLinesTogether/><sf:dropCap/><sf:underline/><sf:underlineWidth/><sf:defaultTabStops/><sf:tocStyle><sf:null/></sf:tocStyle><sf:fontName/><sf:strikethru/><sf:baselineShift/><sf:lineSpacing/><sf:textShadow/><sf:underlineColor><sf:null/></sf:underlineColor><sf:showInTOC/><sf:kerning/><sf:strikethruWidth/><sf:fontColor/><sf:textBackground><sf:null/></sf:textBackground><sf:paragraphRuleWidth/><sf:paragraphStroke><sf:null/></sf:paragraphStroke><sf:bold/><sf:tracking/><sf:ligatures/><sf:language><sf:null/></sf:language><sf:italic/><sf:outline/><sf:strikethruColor><sf:null/></sf:strikethruColor><sf:followingParagraphStyle><sf:null/></sf:followingParagraphStyle><sf:word_underline/><sf:decimalTab/><sf:widowControl/><sf:rightIndent/><sf:atsuFontFeatures/><sf:tabs/><sf:superscript/><sf:paragraphBorderType/><sf:hyphenate/><sf:hidden/><sf:pageBreakBefore/><sf:paragraphFill><sf:null/></sf:paragraphFill><sf:spaceBefore/><sf:keepWithNext/><sf:outlineColor><sf:null/></sf:outlineColor><sf:paragraphRuleOffset/><sf:capitalization/><sf:leftIndent/><sf:firstLineIndent/></sf:property-map></sf:paragraphstyle><sf:paragraphstyle-ref sfa:IDREF="SFWPParagraphStyle-41"/><sf:paragraphstyle sfa:ID="SFWPParagraphStyle-63" sf:ident="Series_1_SFCBarSeriesValueParagraphStyleProperty" sf:parent-ident="chart-paragraph-style-default"><sf:property-map><sf:outline/><sf:italic/><sf:strikethruColor><sf:null/></sf:strikethruColor><sf:word_underline/><sf:decimalTab/><sf:word_strikethrough/><sf:keepLinesTogether/><sf:spaceAfter/><sf:alignment/><sf:fontSize><sf:number sfa:number="14" sfa:type="i"/></sf:fontSize><sf:widowControl/><sf:rightIndent/><sf:atsuFontFeatures/><sf:tabs/><sf:dropCap/><sf:underline/><sf:underlineWidth/><sf:defaultTabStops/><sf:tocStyle><sf:null/></sf:tocStyle><sf:firstTopicNumber/><sf:outlineLevel/><sf:fontName/><sf:strikethru/><sf:baselineShift/><sf:lineSpacing/><sf:textShadow/><sf:superscript/><sf:hyphenate/><sf:underlineColor><sf:null/></sf:underlineColor><sf:hidden/><sf:showInTOC/><sf:kerning/><sf:pageBreakBefore/><sf:strikethruWidth/><sf:fontColor><sf:color xsi:type="sfa:calibrated-white-color-type" sfa:w="1" sfa:a="1"/></sf:fontColor><sf:paragraphFill><sf:null/></sf:paragraphFill><sf:spaceBefore/><sf:keepWithNext/><sf:outlineColor><sf:null/></sf:outlineColor><sf:paragraphStroke><sf:null/></sf:paragraphStroke><sf:bold/><sf:tracking/><sf:ligatures/><sf:capitalization/><sf:language><sf:null/></sf:language><sf:followingParagraphStyle><sf:null/></sf:followingParagraphStyle><sf:leftIndent/><sf:firstLineIndent/></sf:property-map></sf:paragraphstyle><sf:paragraphstyle-ref sfa:IDREF="SFWPParagraphStyle-57"/><sf:paragraphstyle-ref sfa:IDREF="SFWPParagraphStyle-56"/><sf:paragraphstyle sfa:ID="SFWPParagraphStyle-64" sf:ident="Series_2_SFCLineSeriesValueParagraphStyleProperty" sf:parent-ident="chart-paragraph-style-default"><sf:property-map><sf:outline/><sf:italic/><sf:strikethruColor><sf:null/></sf:strikethruColor><sf:word_underline/><sf:decimalTab/><sf:word_strikethrough/><sf:keepLinesTogether/><sf:spaceAfter/><sf:alignment/><sf:fontSize><sf:number sfa:number="14" sfa:type="f"/></sf:fontSize><sf:widowControl/><sf:rightIndent/><sf:atsuFontFeatures/><sf:tabs/><sf:dropCap/><sf:underline/><sf:underlineWidth/><sf:defaultTabStops/><sf:tocStyle><sf:null/></sf:tocStyle><sf:firstTopicNumber/><sf:outlineLevel/><sf:fontName/><sf:strikethru/><sf:baselineShift/><sf:lineSpacing/><sf:textShadow/><sf:superscript/><sf:hyphenate/><sf:underlineColor><sf:null/></sf:underlineColor><sf:hidden/><sf:showInTOC/><sf:kerning/><sf:pageBreakBefore/><sf:strikethruWidth/><sf:fontColor/><sf:paragraphFill><sf:null/></sf:paragraphFill><sf:spaceBefore/><sf:keepWithNext/><sf:outlineColor><sf:null/></sf:outlineColor><sf:paragraphStroke><sf:null/></sf:paragraphStroke><sf:bold/><sf:tracking/><sf:ligatures/><sf:capitalization/><sf:language><sf:null/></sf:language><sf:followingParagraphStyle><sf:null/></sf:followingParagraphStyle><sf:leftIndent/><sf:firstLineIndent/></sf:property-map></sf:paragraphstyle><sf:paragraphstyle sfa:ID="SFWPParagraphStyle-65" sf:ident="SFCValueAxisParagraphStyleProperty" sf:parent-ident="chart-paragraph-style-default"><sf:property-map><sf:outline/><sf:italic/><sf:strikethruColor><sf:null/></sf:strikethruColor><sf:word_underline/><sf:decimalTab/><sf:word_strikethrough/><sf:keepLinesTogether/><sf:spaceAfter/><sf:alignment/><sf:fontSize/><sf:widowControl/><sf:rightIndent/><sf:atsuFontFeatures/><sf:tabs/><sf:dropCap/><sf:underline/><sf:underlineWidth/><sf:defaultTabStops/><sf:tocStyle><sf:null/></sf:tocStyle><sf:firstTopicNumber/><sf:outlineLevel/><sf:fontName/><sf:strikethru/><sf:baselineShift/><sf:lineSpacing/><sf:textShadow/><sf:superscript/><sf:hyphenate/><sf:underlineColor><sf:null/></sf:underlineColor><sf:hidden/><sf:showInTOC/><sf:kerning/><sf:pageBreakBefore/><sf:strikethruWidth/><sf:fontColor/><sf:paragraphFill><sf:null/></sf:paragraphFill><sf:spaceBefore/><sf:keepWithNext/><sf:outlineColor><sf:null/></sf:outlineColor><sf:paragraphStroke><sf:null/></sf:paragraphStroke><sf:bold/><sf:tracking/><sf:ligatures/><sf:capitalization/><sf:language><sf:null/></sf:language><sf:followingParagraphStyle><sf:null/></sf:followingParagraphStyle><sf:leftIndent/><sf:firstLineIndent/></sf:property-map></sf:paragraphstyle><sf:paragraphstyle-ref sfa:IDREF="SFWPParagraphStyle-59"/><sf:paragraphstyle-ref sfa:IDREF="SFWPParagraphStyle-47"/><sf:paragraphstyle sfa:ID="SFWPParagraphStyle-66" sf:ident="Series_2_SFCBarSeriesValueParagraphStyleProperty" sf:parent-ident="chart-paragraph-style-default"><sf:property-map><sf:outline/><sf:italic/><sf:strikethruColor><sf:null/></sf:strikethruColor><sf:word_underline/><sf:decimalTab/><sf:word_strikethrough/><sf:keepLinesTogether/><sf:spaceAfter/><sf:alignment/><sf:fontSize><sf:number sfa:number="14" sfa:type="i"/></sf:fontSize><sf:widowControl/><sf:rightIndent/><sf:atsuFontFeatures/><sf:tabs/><sf:dropCap/><sf:underline/><sf:underlineWidth/><sf:defaultTabStops/><sf:tocStyle><sf:null/></sf:tocStyle><sf:firstTopicNumber/><sf:outlineLevel/><sf:fontName/><sf:strikethru/><sf:baselineShift/><sf:lineSpacing/><sf:textShadow/><sf:superscript/><sf:hyphenate/><sf:underlineColor><sf:null/></sf:underlineColor><sf:hidden/><sf:showInTOC/><sf:kerning/><sf:pageBreakBefore/><sf:strikethruWidth/><sf:fontColor><sf:color xsi:type="sfa:calibrated-white-color-type" sfa:w="1" sfa:a="1"/></sf:fontColor><sf:paragraphFill><sf:null/></sf:paragraphFill><sf:spaceBefore/><sf:keepWithNext/><sf:outlineColor><sf:null/></sf:outlineColor><sf:paragraphStroke><sf:null/></sf:paragraphStroke><sf:bold/><sf:tracking/><sf:ligatures/><sf:capitalization/><sf:language><sf:null/></sf:language><sf:followingParagraphStyle><sf:null/></sf:followingParagraphStyle><sf:leftIndent/><sf:firstLineIndent/></sf:property-map></sf:paragraphstyle><sf:paragraphstyle-ref sfa:IDREF="SFWPParagraphStyle-45"/><sf:paragraphstyle-ref sfa:IDREF="SFWPParagraphStyle-24"/><sf:paragraphstyle sfa:ID="SFWPParagraphStyle-67" sf:ident="Series_1_SFCPieSeriesValueParagraphStyleProperty" sf:parent-ident="chart-paragraph-style-default"><sf:property-map><sf:outline/><sf:italic/><sf:strikethruColor><sf:null/></sf:strikethruColor><sf:word_underline/><sf:decimalTab/><sf:word_strikethrough/><sf:keepLinesTogether/><sf:spaceAfter/><sf:alignment><sf:number sfa:number="2" sfa:type="i"/></sf:alignment><sf:fontSize><sf:number sfa:number="16" sfa:type="f"/></sf:fontSize><sf:widowControl/><sf:rightIndent/><sf:atsuFontFeatures/><sf:tabs/><sf:dropCap/><sf:underline/><sf:underlineWidth/><sf:defaultTabStops/><sf:tocStyle><sf:null/></sf:tocStyle><sf:firstTopicNumber/><sf:outlineLevel/><sf:fontName/><sf:strikethru/><sf:baselineShift/><sf:lineSpacing/><sf:textShadow/><sf:superscript/><sf:hyphenate/><sf:underlineColor><sf:null/></sf:underlineColor><sf:hidden/><sf:showInTOC/><sf:kerning/><sf:pageBreakBefore/><sf:strikethruWidth/><sf:fontColor><sf:color xsi:type="sfa:calibrated-white-color-type" sfa:w="1" sfa:a="1"/></sf:fontColor><sf:paragraphFill><sf:null/></sf:paragraphFill><sf:spaceBefore/><sf:keepWithNext/><sf:outlineColor><sf:null/></sf:outlineColor><sf:paragraphStroke><sf:null/></sf:paragraphStroke><sf:bold/><sf:tracking/><sf:ligatures/><sf:capitalization/><sf:language><sf:null/></sf:language><sf:followingParagraphStyle><sf:null/></sf:followingParagraphStyle><sf:leftIndent/><sf:firstLineIndent/></sf:property-map></sf:paragraphstyle><sf:paragraphstyle sfa:ID="SFWPParagraphStyle-68" sf:ident="SFCValueAxisTitleParagraphStyleProperty" sf:parent-ident="chart-paragraph-style-default"><sf:property-map><sf:fontSize/><sf:word_strikethrough/><sf:spaceAfter/><sf:alignment/><sf:keepLinesTogether/><sf:outlineLevel/><sf:underline/><sf:underlineWidth/><sf:defaultTabStops/><sf:tocStyle><sf:null/></sf:tocStyle><sf:firstTopicNumber/><sf:dropCap/><sf:fontName/><sf:strikethru/><sf:baselineShift/><sf:lineSpacing/><sf:textShadow/><sf:underlineColor><sf:null/></sf:underlineColor><sf:showInTOC/><sf:kerning/><sf:strikethruWidth/><sf:fontColor/><sf:textBackground><sf:null/></sf:textBackground><sf:paragraphRuleWidth/><sf:paragraphStroke><sf:null/></sf:paragraphStroke><sf:bold/><sf:tracking/><sf:ligatures/><sf:language><sf:null/></sf:language><sf:italic/><sf:followingParagraphStyle><sf:null/></sf:followingParagraphStyle><sf:outline/><sf:strikethruColor><sf:null/></sf:strikethruColor><sf:word_underline/><sf:decimalTab/><sf:widowControl/><sf:rightIndent/><sf:atsuFontFeatures/><sf:tabs/><sf:superscript/><sf:paragraphBorderType/><sf:hyphenate/><sf:hidden/><sf:pageBreakBefore/><sf:paragraphFill><sf:null/></sf:paragraphFill><sf:spaceBefore/><sf:keepWithNext/><sf:outlineColor><sf:null/></sf:outlineColor><sf:paragraphRuleOffset/><sf:capitalization/><sf:leftIndent/><sf:firstLineIndent/></sf:property-map></sf:paragraphstyle><sf:paragraphstyle sfa:ID="SFWPParagraphStyle-69" sf:ident="SFCLegendParagraphStyleProperty" sf:parent-ident="chart-paragraph-style-default"><sf:property-map><sf:outline/><sf:italic/><sf:strikethruColor><sf:null/></sf:strikethruColor><sf:word_underline/><sf:decimalTab/><sf:word_strikethrough/><sf:keepLinesTogether/><sf:spaceAfter/><sf:alignment/><sf:fontSize/><sf:widowControl/><sf:rightIndent/><sf:atsuFontFeatures/><sf:tabs/><sf:dropCap/><sf:underline/><sf:underlineWidth/><sf:defaultTabStops/><sf:tocStyle><sf:null/></sf:tocStyle><sf:firstTopicNumber/><sf:outlineLevel/><sf:fontName/><sf:strikethru/><sf:baselineShift/><sf:lineSpacing/><sf:textShadow/><sf:superscript/><sf:hyphenate/><sf:underlineColor><sf:null/></sf:underlineColor><sf:hidden/><sf:showInTOC/><sf:kerning/><sf:pageBreakBefore/><sf:strikethruWidth/><sf:fontColor/><sf:paragraphFill><sf:null/></sf:paragraphFill><sf:spaceBefore/><sf:keepWithNext/><sf:outlineColor><sf:null/></sf:outlineColor><sf:paragraphStroke><sf:null/></sf:paragraphStroke><sf:bold/><sf:tracking/><sf:ligatures/><sf:capitalization/><sf:language><sf:null/></sf:language><sf:followingParagraphStyle><sf:null/></sf:followingParagraphStyle><sf:leftIndent/><sf:firstLineIndent/></sf:property-map></sf:paragraphstyle><sf:paragraphstyle-ref sfa:IDREF="SFWPParagraphStyle-58"/><sf:paragraphstyle sfa:ID="SFWPParagraphStyle-70" sf:ident="Series_1_SFCLineSeriesValueParagraphStyleProperty" sf:parent-ident="chart-paragraph-style-default"><sf:property-map><sf:outline/><sf:italic/><sf:strikethruColor><sf:null/></sf:strikethruColor><sf:word_underline/><sf:decimalTab/><sf:word_strikethrough/><sf:keepLinesTogether/><sf:spaceAfter/><sf:alignment/><sf:fontSize><sf:number sfa:number="14" sfa:type="f"/></sf:fontSize><sf:widowControl/><sf:rightIndent/><sf:atsuFontFeatures/><sf:tabs/><sf:dropCap/><sf:underline/><sf:underlineWidth/><sf:defaultTabStops/><sf:tocStyle><sf:null/></sf:tocStyle><sf:firstTopicNumber/><sf:outlineLevel/><sf:fontName/><sf:strikethru/><sf:baselineShift/><sf:lineSpacing/><sf:textShadow/><sf:superscript/><sf:hyphenate/><sf:underlineColor><sf:null/></sf:underlineColor><sf:hidden/><sf:showInTOC/><sf:kerning/><sf:pageBreakBefore/><sf:strikethruWidth/><sf:fontColor/><sf:paragraphFill><sf:null/></sf:paragraphFill><sf:spaceBefore/><sf:keepWithNext/><sf:outlineColor><sf:null/></sf:outlineColor><sf:paragraphStroke><sf:null/></sf:paragraphStroke><sf:bold/><sf:tracking/><sf:ligatures/><sf:capitalization/><sf:language><sf:null/></sf:language><sf:followingParagraphStyle><sf:null/></sf:followingParagraphStyle><sf:leftIndent/><sf:firstLineIndent/></sf:property-map></sf:paragraphstyle><sf:paragraphstyle sfa:ID="SFWPParagraphStyle-71" sf:ident="SFCCategoryAxisTitleParagraphStyleProperty" sf:parent-ident="chart-paragraph-style-default"><sf:property-map><sf:fontSize/><sf:word_strikethrough/><sf:spaceAfter/><sf:alignment/><sf:keepLinesTogether/><sf:outlineLevel/><sf:underline/><sf:underlineWidth/><sf:defaultTabStops/><sf:tocStyle><sf:null/></sf:tocStyle><sf:firstTopicNumber/><sf:dropCap/><sf:fontName/><sf:strikethru/><sf:baselineShift/><sf:lineSpacing/><sf:textShadow/><sf:underlineColor><sf:null/></sf:underlineColor><sf:showInTOC/><sf:kerning/><sf:strikethruWidth/><sf:fontColor/><sf:textBackground><sf:null/></sf:textBackground><sf:paragraphRuleWidth/><sf:paragraphStroke><sf:null/></sf:paragraphStroke><sf:bold/><sf:tracking/><sf:ligatures/><sf:language><sf:null/></sf:language><sf:italic/><sf:followingParagraphStyle><sf:null/></sf:followingParagraphStyle><sf:outline/><sf:strikethruColor><sf:null/></sf:strikethruColor><sf:word_underline/><sf:decimalTab/><sf:widowControl/><sf:rightIndent/><sf:atsuFontFeatures/><sf:tabs/><sf:superscript/><sf:paragraphBorderType/><sf:hyphenate/><sf:hidden/><sf:pageBreakBefore/><sf:paragraphFill><sf:null/></sf:paragraphFill><sf:spaceBefore/><sf:keepWithNext/><sf:outlineColor><sf:null/></sf:outlineColor><sf:paragraphRuleOffset/><sf:capitalization/><sf:leftIndent/><sf:firstLineIndent/></sf:property-map></sf:paragraphstyle><sf:paragraphstyle-ref sfa:IDREF="SFWPParagraphStyle-42"/><sf:paragraphstyle-ref sfa:IDREF="SFWPParagraphStyle-44"/><sf:paragraphstyle sfa:ID="SFWPParagraphStyle-72" sf:name="orderedlist1" sf:ident="paragraph-style-99"><sf:property-map><sf:fontSize/><sf:word_strikethrough/><sf:spaceAfter/><sf:alignment/><sf:keepLinesTogether/><sf:listStyle><sf:liststyle sfa:ID="SFWPListStyle-11" sf:parent-ident="list-style-2"><sf:property-map><sf:listTextIndents><sf:array sfa:ID="NSArray-39"><sf:number sfa:number="14.17323" sfa:type="f"/><sf:number sfa:number="9" sfa:type="f"/><sf:number sfa:number="9" sfa:type="f"/><sf:number sfa:number="9" sfa:type="f"/><sf:number sfa:number="9" sfa:type="f"/><sf:number sfa:number="9" sfa:type="f"/><sf:number sfa:number="9" sfa:type="f"/><sf:number sfa:number="9" sfa:type="f"/><sf:number sfa:number="9" sfa:type="f"/></sf:array></sf:listTextIndents><sf:listLabelGeometries><sf:array sfa:ID="NSArray-40"><sf:list-label-geometry sfa:ID="SFWPListLabelGeometry-81" sf:align="left" sf:scale="1" sf:offset="-1" sf:scale-with-text="true"/><sf:list-label-geometry sfa:ID="SFWPListLabelGeometry-82" sf:align="left" sf:scale="1" sf:offset="-1" sf:scale-with-text="true"/><sf:list-label-geometry sfa:ID="SFWPListLabelGeometry-83" sf:align="left" sf:scale="1" sf:offset="-1" sf:scale-with-text="true"/><sf:list-label-geometry sfa:ID="SFWPListLabelGeometry-84" sf:align="left" sf:scale="1" sf:offset="-1" sf:scale-with-text="true"/><sf:list-label-geometry sfa:ID="SFWPListLabelGeometry-85" sf:align="left" sf:scale="1" sf:offset="-1" sf:scale-with-text="true"/><sf:list-label-geometry sfa:ID="SFWPListLabelGeometry-86" sf:align="left" sf:scale="1" sf:offset="-1" sf:scale-with-text="true"/><sf:list-label-geometry sfa:ID="SFWPListLabelGeometry-87" sf:align="left" sf:scale="1" sf:offset="-1" sf:scale-with-text="true"/><sf:list-label-geometry sfa:ID="SFWPListLabelGeometry-88" sf:align="left" sf:scale="1" sf:offset="-1" sf:scale-with-text="true"/><sf:list-label-geometry sfa:ID="SFWPListLabelGeometry-89" sf:align="left" sf:scale="1" sf:offset="-1" sf:scale-with-text="true"/></sf:array></sf:listLabelGeometries><sf:listLabelIndents><sf:array sfa:ID="NSArray-41"><sf:number sfa:number="0" sfa:type="f"/><sf:number sfa:number="18" sfa:type="f"/><sf:number sfa:number="36" sfa:type="f"/><sf:number sfa:number="54" sfa:type="f"/><sf:number sfa:number="72" sfa:type="f"/><sf:number sfa:number="90" sfa:type="f"/><sf:number sfa:number="108" sfa:type="f"/><sf:number sfa:number="126" sfa:type="f"/><sf:number sfa:number="144" sfa:type="f"/></sf:array></sf:listLabelIndents><sf:listLabelTypes><sf:array sfa:ID="NSArray-42"><sf:list-label-typeinfo sfa:ID="SFWPListLabelTypeInfo-81" sf:type="text"><sf:text-label sfa:ID="SFWPTextLabelFormat-47" sf:type="decimal" sf:format="%L." sf:first="1"/></sf:list-label-typeinfo><sf:list-label-typeinfo sfa:ID="SFWPListLabelTypeInfo-82" sf:type="text"><sf:text-label sfa:ID="SFWPTextLabelFormat-48" sf:type="bullet" sf:format="&#x2022;" sf:first="0"/></sf:list-label-typeinfo><sf:list-label-typeinfo sfa:ID="SFWPListLabelTypeInfo-83" sf:type="text"><sf:text-label sfa:ID="SFWPTextLabelFormat-49" sf:type="bullet" sf:format="&#x2022;" sf:first="0"/></sf:list-label-typeinfo><sf:list-label-typeinfo sfa:ID="SFWPListLabelTypeInfo-84" sf:type="text"><sf:text-label sfa:ID="SFWPTextLabelFormat-50" sf:type="bullet" sf:format="&#x2022;" sf:first="0"/></sf:list-label-typeinfo><sf:list-label-typeinfo sfa:ID="SFWPListLabelTypeInfo-85" sf:type="text"><sf:text-label sfa:ID="SFWPTextLabelFormat-51" sf:type="bullet" sf:format="&#x2022;" sf:first="0"/></sf:list-label-typeinfo><sf:list-label-typeinfo sfa:ID="SFWPListLabelTypeInfo-86" sf:type="text"><sf:text-label sfa:ID="SFWPTextLabelFormat-52" sf:type="bullet" sf:format="&#x2022;" sf:first="0"/></sf:list-label-typeinfo><sf:list-label-typeinfo sfa:ID="SFWPListLabelTypeInfo-87" sf:type="text"><sf:text-label sfa:ID="SFWPTextLabelFormat-53" sf:type="bullet" sf:format="&#x2022;" sf:first="0"/></sf:list-label-typeinfo><sf:list-label-typeinfo sfa:ID="SFWPListLabelTypeInfo-88" sf:type="text"><sf:text-label sfa:ID="SFWPTextLabelFormat-54" sf:type="bullet" sf:format="&#x2022;" sf:first="0"/></sf:list-label-typeinfo><sf:list-label-typeinfo sfa:ID="SFWPListLabelTypeInfo-89" sf:type="text"><sf:text-label sfa:ID="SFWPTextLabelFormat-55" sf:type="bullet" sf:format="&#x2022;" sf:first="0"/></sf:list-label-typeinfo></sf:array></sf:listLabelTypes></sf:property-map></sf:liststyle></sf:listStyle><sf:outlineLevel/><sf:firstTopicNumber/><sf:underline/><sf:defaultTabStops><sf:number sfa:number="28.34646" sfa:type="f"/></sf:defaultTabStops><sf:underlineWidth/><sf:dropCap/><sf:fontName/><sf:strikethru/><sf:baselineShift/><sf:lineSpacing/><sf:textShadow/><sf:underlineColor><sf:null/></sf:underlineColor><sf:kerning/><sf:strikethruWidth/><sf:fontColor/><sf:textBackground><sf:null/></sf:textBackground><sf:paragraphRuleWidth/><sf:paragraphStroke><sf:null/></sf:paragraphStroke><sf:bold/><sf:tracking/><sf:ligatures/><sf:language><sf:null/></sf:language><sf:followingParagraphStyle><sf:null/></sf:followingParagraphStyle><sf:outline/><sf:strikethruColor><sf:null/></sf:strikethruColor><sf:italic/><sf:word_underline/><sf:widowControl/><sf:rightIndent/><sf:atsuFontFeatures/><sf:tabs/><sf:superscript/><sf:paragraphBorderType/><sf:hyphenate/><sf:hidden/><sf:pageBreakBefore/><sf:paragraphFill><sf:null/></sf:paragraphFill><sf:spaceBefore/><sf:keepWithNext/><sf:outlineColor><sf:null/></sf:outlineColor><sf:paragraphRuleOffset/><sf:capitalization/><sf:leftIndent/><sf:firstLineIndent/></sf:property-map></sf:paragraphstyle><sf:paragraphstyle-ref sfa:IDREF="SFWPParagraphStyle-23"/><sf:paragraphstyle sfa:ID="SFWPParagraphStyle-73" sf:name="variablelist-term" sf:ident="paragraph-style-62"><sf:property-map><sf:fontSize/><sf:word_strikethrough/><sf:spaceAfter><sf:number sfa:number="12" sfa:type="f"/></sf:spaceAfter><sf:alignment/><sf:keepLinesTogether/><sf:listStyle><sf:liststyle-ref sfa:IDREF="SFWPListStyle-2"/></sf:listStyle><sf:outlineLevel/><sf:firstTopicNumber/><sf:underline/><sf:defaultTabStops><sf:number sfa:number="28.34646" sfa:type="f"/></sf:defaultTabStops><sf:underlineWidth/><sf:dropCap/><sf:fontName><sf:string sfa:string="Courier"/></sf:fontName><sf:strikethru/><sf:baselineShift/><sf:lineSpacing/><sf:textShadow/><sf:underlineColor><sf:null/></sf:underlineColor><sf:kerning/><sf:strikethruWidth/><sf:fontColor/><sf:textBackground><sf:null/></sf:textBackground><sf:paragraphRuleWidth/><sf:paragraphStroke><sf:null/></sf:paragraphStroke><sf:bold/><sf:tracking/><sf:ligatures/><sf:language><sf:null/></sf:language><sf:followingParagraphStyle><sf:null/></sf:followingParagraphStyle><sf:outline/><sf:strikethruColor><sf:null/></sf:strikethruColor><sf:italic/><sf:word_underline/><sf:widowControl/><sf:rightIndent/><sf:atsuFontFeatures/><sf:tabs/><sf:superscript/><sf:paragraphBorderType/><sf:hyphenate/><sf:hidden/><sf:pageBreakBefore/><sf:paragraphFill><sf:null/></sf:paragraphFill><sf:spaceBefore/><sf:keepWithNext/><sf:outlineColor><sf:null/></sf:outlineColor><sf:paragraphRuleOffset/><sf:capitalization/><sf:leftIndent/><sf:firstLineIndent/></sf:property-map></sf:paragraphstyle><sf:tocstyle sfa:ID="SLTOCParagraphStyle-5" sfa:sfclass="paragraphstyle" sf:name="TOC Heading 3" sf:ident="toc-paragraph-style-3"><sf:property-map><sf:fontSize/><sf:word_strikethrough/><sf:spaceAfter/><sf:alignment/><sf:SLTOCPageNumberStyle><sf:null/></sf:SLTOCPageNumberStyle><sf:keepLinesTogether/><sf:listStyle><sf:null/></sf:listStyle><sf:outlineLevel/><sf:underline/><sf:underlineWidth/><sf:defaultTabStops><sf:number sfa:number="28.34646" sfa:type="f"/></sf:defaultTabStops><sf:dropCap/><sf:firstTopicNumber/><sf:fontName/><sf:strikethru/><sf:baselineShift/><sf:lineSpacing/><sf:textShadow/><sf:underlineColor><sf:null/></sf:underlineColor><sf:kerning/><sf:strikethruWidth/><sf:fontColor><sf:color xsi:type="sfa:calibrated-rgb-color-type" sfa:r="0" sfa:g="0" sfa:b="0" sfa:a="1"/></sf:fontColor><sf:textBackground><sf:null/></sf:textBackground><sf:paragraphRuleWidth/><sf:paragraphStroke><sf:null/></sf:paragraphStroke><sf:bold><sf:number sfa:number="1" sfa:type="c"/></sf:bold><sf:tracking/><sf:ligatures/><sf:language><sf:null/></sf:language><sf:followingParagraphStyle><sf:null/></sf:followingParagraphStyle><sf:outline/><sf:strikethruColor><sf:null/></sf:strikethruColor><sf:italic><sf:number sfa:number="1" sfa:type="c"/></sf:italic><sf:SLTOCEntryStyle><sf:null/></sf:SLTOCEntryStyle><sf:word_underline/><sf:widowControl/><sf:rightIndent/><sf:atsuFontFeatures/><sf:tabs><sf:tabs sfa:ID="SFWPTabs-6"><sf:tabstop sf:pos="481.61416625976562" sf:align="right"/></sf:tabs></sf:tabs><sf:superscript/><sf:paragraphBorderType/><sf:hyphenate/><sf:hidden/><sf:pageBreakBefore/><sf:SLTOCEnabledStyles><sf:null/></sf:SLTOCEnabledStyles><sf:SLTOCDisabledStyles><sf:null/></sf:SLTOCDisabledStyles><sf:paragraphFill><sf:null/></sf:paragraphFill><sf:SLTOCShowPageNumber/><sf:keepWithNext/><sf:spaceBefore><sf:number sfa:number="12" sfa:type="f"/></sf:spaceBefore><sf:outlineColor><sf:null/></sf:outlineColor><sf:paragraphRuleOffset/><sf:capitalization/><sf:leftIndent><sf:number sfa:number="28.34646" sfa:type="f"/></sf:leftIndent><sf:firstLineIndent><sf:number sfa:number="28.34646" sfa:type="f"/></sf:firstLineIndent></sf:property-map></sf:tocstyle><sf:characterstyle sfa:ID="SFWPCharacterStyle-20" sf:name="literal" sf:ident="character-style-24"><sf:property-map><sf:italic/><sf:fontColor/><sf:fontSize/><sf:atsuFontFeatures/><sf:superscript/><sf:underline/><sf:bold/><sf:tracking/><sf:ligatures/><sf:fontName><sf:string sfa:string="Courier"/></sf:fontName><sf:strikethru/><sf:capitalization/><sf:textShadow/><sf:baselineShift/><sf:language><sf:string sfa:string="en"/></sf:language><sf:underlineColor><sf:null/></sf:underlineColor><sf:strikethruColor><sf:null/></sf:strikethruColor></sf:property-map></sf:characterstyle><sf:characterstyle sfa:ID="SFWPCharacterStyle-21" sf:name="country" sf:ident="character-style-7"><sf:property-map><sf:italic/><sf:fontColor/><sf:fontSize/><sf:atsuFontFeatures/><sf:superscript/><sf:underline/><sf:bold><sf:number sfa:number="1" sfa:type="i"/></sf:bold><sf:tracking/><sf:ligatures/><sf:fontName/><sf:strikethru/><sf:capitalization/><sf:textShadow/><sf:baselineShift/><sf:language><sf:string sfa:string="en"/></sf:language><sf:underlineColor><sf:null/></sf:underlineColor><sf:strikethruColor><sf:null/></sf:strikethruColor></sf:property-map></sf:characterstyle><sf:chart-series-style sfa:ID="SFCSeriesStyle-4" sf:name="Series_1" sf:ident="Series_1" sf:seriesIndex="1"><sf:property-map><sf:SFC2DPieFillProperty><sf:color xsi:type="sfa:calibrated-rgb-color-type" sfa:r="0.16862745583057404" sfa:g="0.4117647111415863" sfa:b="0.56862747669219971" sfa:a="1"/></sf:SFC2DPieFillProperty><sf:SFCBarValueLabelPositionProperty><sf:number sfa:number="0" sfa:type="i"/></sf:SFCBarValueLabelPositionProperty><sf:SFC3DColumnFillProperty><sf:color xsi:type="sfa:calibrated-rgb-color-type" sfa:r="0.16862745583057404" sfa:g="0.4117647111415863" sfa:b="0.56862747669219971" sfa:a="1"/></sf:SFC3DColumnFillProperty><sf:SFC2DAreaUseSeriesFillForDataPointFillProperty><sf:number sfa:number="1" sfa:type="c"/></sf:SFC2DAreaUseSeriesFillForDataPointFillProperty><sf:SFC2DLineUseSeriesFillForDataPointFillProperty><sf:number sfa:number="0" sfa:type="c"/></sf:SFC2DLineUseSeriesFillForDataPointFillProperty><sf:SFC3DAreaFillProperty><sf:color xsi:type="sfa:calibrated-rgb-color-type" sfa:r="0.16862745583057404" sfa:g="0.4117647111415863" sfa:b="0.56862747669219971" sfa:a="1"/></sf:SFC3DAreaFillProperty><sf:SFCAreaShowValueLabelProperty><sf:number sfa:number="0" sfa:type="c"/></sf:SFCAreaShowValueLabelProperty><sf:SFCLabelShadowProperty><sf:shadow-ref sfa:IDREF="SFRShadow-3"/></sf:SFCLabelShadowProperty><sf:SFC2DLineDataPointSymbolProperty><sf:number sfa:number="1" sfa:type="i"/></sf:SFC2DLineDataPointSymbolProperty><sf:SFC2DPieStrokeProperty><sf:stroke sfa:ID="SFRStroke-33" sf:miter-limit="4" sf:width="1" sf:cap="butt" sf:join="miter"><sf:color xsi:type="sfa:calibrated-white-color-type" sfa:w="1" sfa:a="1"/><sf:pattern sfa:ID="SFRStrokePattern-30" sf:phase="0" sf:type="empty"><sf:pattern/></sf:pattern></sf:stroke></sf:SFC2DPieStrokeProperty><sf:SFC2DScatterShadowProperty><sf:shadow-ref sfa:IDREF="SFRShadow-0"/></sf:SFC2DScatterShadowProperty><sf:SFC2DAreaFillProperty><sf:color xsi:type="sfa:calibrated-rgb-color-type" sfa:r="0.16862745583057404" sfa:g="0.4117647111415863" sfa:b="0.56862747669219971" sfa:a="1"/></sf:SFC2DAreaFillProperty><sf:SFC2DLineDataPointFillProperty><sf:color xsi:type="sfa:calibrated-white-color-type" sfa:w="1" sfa:a="1"/></sf:SFC2DLineDataPointFillProperty><sf:SFC3DPieFillProperty><sf:color xsi:type="sfa:calibrated-rgb-color-type" sfa:r="0.16862745583057404" sfa:g="0.4117647111415863" sfa:b="0.56862747669219971" sfa:a="1"/></sf:SFC3DPieFillProperty><sf:SFC2DLineStrokeProperty><sf:stroke sfa:ID="SFRStroke-34" sf:miter-limit="4" sf:width="4" sf:cap="butt" sf:join="miter"><sf:color xsi:type="sfa:calibrated-rgb-color-type" sfa:r="0.16862745583057404" sfa:g="0.4117647111415863" sfa:b="0.56862747669219971" sfa:a="1"/><sf:pattern sfa:ID="SFRStrokePattern-31" sf:phase="0" sf:type="solid"><sf:pattern/></sf:pattern></sf:stroke></sf:SFC2DLineStrokeProperty><sf:SFC2DScatterStrokeProperty><sf:stroke sfa:ID="SFRStroke-35" sf:miter-limit="4" sf:width="4" sf:cap="butt" sf:join="miter"><sf:color xsi:type="sfa:calibrated-rgb-color-type" sfa:r="0.16862745583057404" sfa:g="0.4117647111415863" sfa:b="0.56862747669219971" sfa:a="1"/><sf:pattern sfa:ID="SFRStrokePattern-32" sf:phase="0" sf:type="empty"><sf:pattern/></sf:pattern></sf:stroke></sf:SFC2DScatterStrokeProperty><sf:SFC3DSeriesShininessProperty><sf:number sfa:number="0.5" sfa:type="f"/></sf:SFC3DSeriesShininessProperty><sf:SFC2DAreaDataPointSymbolProperty><sf:number sfa:number="0" sfa:type="i"/></sf:SFC2DAreaDataPointSymbolProperty><sf:SFC2DAreaUseStrokeColorForDataPointFillProperty><sf:number sfa:number="0" sfa:type="c"/></sf:SFC2DAreaUseStrokeColorForDataPointFillProperty><sf:SFC3DSeriesEmissiveColorProperty><sf:color xsi:type="sfa:calibrated-rgb-color-type" sfa:r="0" sfa:g="0" sfa:b="0" sfa:a="1"/></sf:SFC3DSeriesEmissiveColorProperty><sf:SFC3DTextureTilingProperty><sf:number sfa:number="1" sfa:type="f"/></sf:SFC3DTextureTilingProperty><sf:SFC2DLineShadowProperty><sf:shadow-ref sfa:IDREF="SFRShadow-0"/></sf:SFC2DLineShadowProperty><sf:SFCPieSeriesValueParagraphStyleProperty><sf:paragraphstyle-ref sfa:IDREF="SFWPParagraphStyle-67"/></sf:SFCPieSeriesValueParagraphStyleProperty><sf:SFCStackedBarValueLabelPositionProperty><sf:number sfa:number="0" sfa:type="i"/></sf:SFCStackedBarValueLabelPositionProperty><sf:SFC2DColumnFillProperty><sf:color xsi:type="sfa:calibrated-rgb-color-type" sfa:r="0.16862745583057404" sfa:g="0.4117647111415863" sfa:b="0.56862747669219971" sfa:a="1"/></sf:SFC2DColumnFillProperty><sf:SFC3DBarFillProperty><sf:color xsi:type="sfa:calibrated-rgb-color-type" sfa:r="0.16862745583057404" sfa:g="0.4117647111415863" sfa:b="0.56862747669219971" sfa:a="1"/></sf:SFC3DBarFillProperty><sf:SFC2DBarStrokeProperty><sf:stroke sfa:ID="SFRStroke-36" sf:miter-limit="4" sf:width="1" sf:cap="butt" sf:join="miter"><sf:color xsi:type="sfa:calibrated-white-color-type" sfa:w="1" sfa:a="1"/><sf:pattern sfa:ID="SFRStrokePattern-33" sf:phase="0" sf:type="empty"><sf:pattern/></sf:pattern></sf:stroke></sf:SFC2DBarStrokeProperty><sf:SFCLabelOpacityProperty><sf:number sfa:number="1" sfa:type="f"/></sf:SFCLabelOpacityProperty><sf:SFC2DPieShadowProperty><sf:shadow-ref sfa:IDREF="SFRShadow-0"/></sf:SFC2DPieShadowProperty><sf:SFCPieShowValueLabelProperty><sf:number sfa:number="1" sfa:type="c"/></sf:SFCPieShowValueLabelProperty><sf:SFCPieShowSeriesNameLabelProperty><sf:number sfa:number="0" sfa:type="c"/></sf:SFCPieShowSeriesNameLabelProperty><sf:SFCLineSeriesValueParagraphStyleProperty><sf:paragraphstyle-ref sfa:IDREF="SFWPParagraphStyle-70"/></sf:SFCLineSeriesValueParagraphStyleProperty><sf:SFC2DOpacityProperty><sf:number sfa:number="1" sfa:type="f"/></sf:SFC2DOpacityProperty><sf:SFCLineValueLabelPositionProperty><sf:number sfa:number="4" sfa:type="i"/></sf:SFCLineValueLabelPositionProperty><sf:SFCPieValueLabelPositionProperty><sf:number sfa:number="13" sfa:type="i"/></sf:SFCPieValueLabelPositionProperty><sf:SFCLineShowValueLabelProperty><sf:number sfa:number="0" sfa:type="c"/></sf:SFCLineShowValueLabelProperty><sf:SFC2DAreaDataPointFillProperty><sf:color xsi:type="sfa:calibrated-white-color-type" sfa:w="1" sfa:a="1"/></sf:SFC2DAreaDataPointFillProperty><sf:SFCStackedAreaValueLabelPositionProperty><sf:number sfa:number="10" sfa:type="i"/></sf:SFCStackedAreaValueLabelPositionProperty><sf:SFC2DAreaShadowProperty><sf:shadow-ref sfa:IDREF="SFRShadow-0"/></sf:SFC2DAreaShadowProperty><sf:SFC3DSeriesSpecularColorProperty><sf:color xsi:type="sfa:calibrated-rgb-color-type" sfa:r="0.89999997615814209" sfa:g="0.89999997615814209" sfa:b="0.89999997615814209" sfa:a="1"/></sf:SFC3DSeriesSpecularColorProperty><sf:SFC2DScatterDataPointSymbolProperty><sf:number sfa:number="1" sfa:type="i"/></sf:SFC2DScatterDataPointSymbolProperty><sf:SFC2DBarShadowProperty><sf:shadow-ref sfa:IDREF="SFRShadow-0"/></sf:SFC2DBarShadowProperty><sf:SFCBarSeriesValueParagraphStyleProperty><sf:paragraphstyle-ref sfa:IDREF="SFWPParagraphStyle-63"/></sf:SFCBarSeriesValueParagraphStyleProperty><sf:SFC2DScatterDataPointFillProperty><sf:color xsi:type="sfa:calibrated-rgb-color-type" sfa:r="0.16862745583057404" sfa:g="0.4117647111415863" sfa:b="0.56862747669219971" sfa:a="1"/></sf:SFC2DScatterDataPointFillProperty><sf:SFC2DBarFillProperty><sf:color xsi:type="sfa:calibrated-rgb-color-type" sfa:r="0.16862745583057404" sfa:g="0.4117647111415863" sfa:b="0.56862747669219971" sfa:a="1"/></sf:SFC2DBarFillProperty><sf:SFCBarShowValueLabelProperty><sf:number sfa:number="0" sfa:type="c"/></sf:SFCBarShowValueLabelProperty><sf:SFC2DAreaStrokeProperty><sf:stroke sfa:ID="SFRStroke-37" sf:miter-limit="4" sf:width="2" sf:cap="butt" sf:join="miter"><sf:color xsi:type="sfa:calibrated-white-color-type" sfa:w="1" sfa:a="1"/><sf:pattern-ref sfa:IDREF="SFRStrokePattern-15"/></sf:stroke></sf:SFC2DAreaStrokeProperty><sf:SFCAreaValueLabelPositionProperty><sf:number sfa:number="10" sfa:type="i"/></sf:SFCAreaValueLabelPositionProperty><sf:SFC3DPieShadowProperty><sf:shadow-ref sfa:IDREF="SFRShadow-4"/></sf:SFC3DPieShadowProperty><sf:SFC3DTextureProperty><sf:string sfa:string=""/></sf:SFC3DTextureProperty><sf:SFCAreaSeriesValueParagraphStyleProperty><sf:paragraphstyle sfa:ID="SFWPParagraphStyle-74" sf:ident="Series_1_SFCAreaSeriesValueParagraphStyleProperty" sf:parent-ident="chart-paragraph-style-default"><sf:property-map><sf:outline/><sf:italic/><sf:strikethruColor><sf:null/></sf:strikethruColor><sf:word_underline/><sf:decimalTab/><sf:word_strikethrough/><sf:keepLinesTogether/><sf:spaceAfter/><sf:alignment/><sf:fontSize><sf:number sfa:number="14" sfa:type="i"/></sf:fontSize><sf:widowControl/><sf:rightIndent/><sf:atsuFontFeatures/><sf:tabs/><sf:dropCap/><sf:underline/><sf:underlineWidth/><sf:defaultTabStops/><sf:tocStyle><sf:null/></sf:tocStyle><sf:firstTopicNumber/><sf:outlineLevel/><sf:fontName/><sf:strikethru/><sf:baselineShift/><sf:lineSpacing/><sf:textShadow/><sf:superscript/><sf:hyphenate/><sf:underlineColor><sf:null/></sf:underlineColor><sf:hidden/><sf:showInTOC/><sf:kerning/><sf:pageBreakBefore/><sf:strikethruWidth/><sf:fontColor><sf:color xsi:type="sfa:calibrated-white-color-type" sfa:w="1" sfa:a="1"/></sf:fontColor><sf:paragraphFill><sf:null/></sf:paragraphFill><sf:spaceBefore/><sf:keepWithNext/><sf:outlineColor><sf:null/></sf:outlineColor><sf:paragraphStroke><sf:null/></sf:paragraphStroke><sf:bold/><sf:tracking/><sf:ligatures/><sf:capitalization/><sf:language><sf:null/></sf:language><sf:followingParagraphStyle><sf:null/></sf:followingParagraphStyle><sf:leftIndent/><sf:firstLineIndent/></sf:property-map></sf:paragraphstyle></sf:SFCAreaSeriesValueParagraphStyleProperty><sf:SFC2DLineUseStrokeColorForDataPointFillProperty><sf:number sfa:number="0" sfa:type="c"/></sf:SFC2DLineUseStrokeColorForDataPointFillProperty><sf:SFC3DLineFillProperty><sf:color xsi:type="sfa:calibrated-rgb-color-type" sfa:r="0.16862745583057404" sfa:g="0.4117647111415863" sfa:b="0.56862747669219971" sfa:a="1"/></sf:SFC3DLineFillProperty><sf:SFCPieWedgeExplosionProperty><sf:number sfa:number="0" sfa:type="f"/></sf:SFCPieWedgeExplosionProperty></sf:property-map></sf:chart-series-style><sf:characterstyle sfa:ID="SFWPCharacterStyle-22" sf:name="ulink" sf:ident="character-style-17"><sf:property-map><sf:italic/><sf:fontSize/><sf:fontColor><sf:color xsi:type="sfa:calibrated-rgb-color-type" sfa:r="0" sfa:g="0" sfa:b="1" sfa:a="1"/></sf:fontColor><sf:atsuFontFeatures/><sf:superscript/><sf:underline><sf:number sfa:number="1" sfa:type="i"/></sf:underline><sf:bold/><sf:tracking/><sf:fontName/><sf:baselineShift/><sf:strikethru/><sf:capitalization/><sf:textShadow/><sf:ligatures/><sf:language><sf:string sfa:string="en"/></sf:language><sf:underlineColor><sf:null/></sf:underlineColor><sf:strikethruColor><sf:null/></sf:strikethruColor></sf:property-map></sf:characterstyle><sf:paragraphstyle sfa:ID="SFWPParagraphStyle-75" sf:name="figure-title" sf:ident="paragraph-style-67"><sf:property-map><sf:fontSize><sf:number sfa:number="13" sfa:type="f"/></sf:fontSize><sf:word_strikethrough/><sf:spaceAfter><sf:number sfa:number="12" sfa:type="f"/></sf:spaceAfter><sf:alignment/><sf:keepLinesTogether/><sf:listStyle><sf:liststyle-ref sfa:IDREF="SFWPListStyle-2"/></sf:listStyle><sf:outlineLevel/><sf:firstTopicNumber/><sf:underline/><sf:defaultTabStops><sf:number sfa:number="28.34646" sfa:type="f"/></sf:defaultTabStops><sf:underlineWidth/><sf:dropCap/><sf:fontName/><sf:strikethru/><sf:baselineShift/><sf:lineSpacing/><sf:textShadow/><sf:underlineColor><sf:null/></sf:underlineColor><sf:kerning/><sf:strikethruWidth/><sf:fontColor/><sf:textBackground><sf:null/></sf:textBackground><sf:paragraphRuleWidth/><sf:paragraphStroke><sf:null/></sf:paragraphStroke><sf:bold><sf:number sfa:number="1" sfa:type="i"/></sf:bold><sf:tracking/><sf:ligatures/><sf:language><sf:null/></sf:language><sf:followingParagraphStyle><sf:null/></sf:followingParagraphStyle><sf:outline/><sf:strikethruColor><sf:null/></sf:strikethruColor><sf:italic/><sf:word_underline/><sf:widowControl/><sf:rightIndent><sf:number sfa:number="28.34646" sfa:type="f"/></sf:rightIndent><sf:atsuFontFeatures/><sf:tabs/><sf:superscript/><sf:paragraphBorderType/><sf:hyphenate/><sf:hidden/><sf:pageBreakBefore/><sf:paragraphFill><sf:null/></sf:paragraphFill><sf:spaceBefore/><sf:keepWithNext/><sf:outlineColor><sf:null/></sf:outlineColor><sf:paragraphRuleOffset/><sf:capitalization/><sf:leftIndent><sf:number sfa:number="28.35709" sfa:type="f"/></sf:leftIndent><sf:firstLineIndent><sf:number sfa:number="28.35709" sfa:type="f"/></sf:firstLineIndent></sf:property-map></sf:paragraphstyle><sf:paragraphstyle sfa:ID="SFWPParagraphStyle-76" sf:name="itemizedlist4" sf:ident="paragraph-style-97"><sf:property-map><sf:fontSize/><sf:word_strikethrough/><sf:spaceAfter/><sf:alignment/><sf:keepLinesTogether/><sf:listStyle><sf:liststyle sfa:ID="SFWPListStyle-12" sf:parent-ident="list-style-2"><sf:property-map><sf:listTextIndents><sf:array sfa:ID="NSArray-43"><sf:number sfa:number="9" sfa:type="f"/><sf:number sfa:number="9" sfa:type="f"/><sf:number sfa:number="9" sfa:type="f"/><sf:number sfa:number="9" sfa:type="f"/><sf:number sfa:number="9" sfa:type="f"/><sf:number sfa:number="9" sfa:type="f"/><sf:number sfa:number="9" sfa:type="f"/><sf:number sfa:number="9" sfa:type="f"/><sf:number sfa:number="9" sfa:type="f"/></sf:array></sf:listTextIndents><sf:listLabelGeometries><sf:array sfa:ID="NSArray-44"><sf:list-label-geometry sfa:ID="SFWPListLabelGeometry-90" sf:align="left" sf:scale="1" sf:offset="-1" sf:scale-with-text="true"/><sf:list-label-geometry sfa:ID="SFWPListLabelGeometry-91" sf:align="left" sf:scale="1" sf:offset="-1" sf:scale-with-text="true"/><sf:list-label-geometry sfa:ID="SFWPListLabelGeometry-92" sf:align="left" sf:scale="1" sf:offset="-1" sf:scale-with-text="true"/><sf:list-label-geometry sfa:ID="SFWPListLabelGeometry-93" sf:align="left" sf:scale="1" sf:offset="-1" sf:scale-with-text="true"/><sf:list-label-geometry sfa:ID="SFWPListLabelGeometry-94" sf:align="left" sf:scale="1" sf:offset="-1" sf:scale-with-text="true"/><sf:list-label-geometry sfa:ID="SFWPListLabelGeometry-95" sf:align="left" sf:scale="1" sf:offset="-1" sf:scale-with-text="true"/><sf:list-label-geometry sfa:ID="SFWPListLabelGeometry-96" sf:align="left" sf:scale="1" sf:offset="-1" sf:scale-with-text="true"/><sf:list-label-geometry sfa:ID="SFWPListLabelGeometry-97" sf:align="left" sf:scale="1" sf:offset="-1" sf:scale-with-text="true"/><sf:list-label-geometry sfa:ID="SFWPListLabelGeometry-98" sf:align="left" sf:scale="1" sf:offset="-1" sf:scale-with-text="true"/></sf:array></sf:listLabelGeometries><sf:listLabelIndents><sf:array sfa:ID="NSArray-45"><sf:number sfa:number="42.51968" sfa:type="f"/><sf:number sfa:number="18" sfa:type="f"/><sf:number sfa:number="36" sfa:type="f"/><sf:number sfa:number="54" sfa:type="f"/><sf:number sfa:number="72" sfa:type="f"/><sf:number sfa:number="90" sfa:type="f"/><sf:number sfa:number="108" sfa:type="f"/><sf:number sfa:number="126" sfa:type="f"/><sf:number sfa:number="144" sfa:type="f"/></sf:array></sf:listLabelIndents><sf:listLabelTypes><sf:array sfa:ID="NSArray-46"><sf:list-label-typeinfo sfa:ID="SFWPListLabelTypeInfo-90" sf:type="text"><sf:text-label sfa:ID="SFWPTextLabelFormat-56" sf:type="bullet" sf:format="&#x2022;" sf:first="0"/></sf:list-label-typeinfo><sf:list-label-typeinfo sfa:ID="SFWPListLabelTypeInfo-91" sf:type="text"><sf:text-label sfa:ID="SFWPTextLabelFormat-57" sf:type="bullet" sf:format="&#x2022;" sf:first="0"/></sf:list-label-typeinfo><sf:list-label-typeinfo sfa:ID="SFWPListLabelTypeInfo-92" sf:type="text"><sf:text-label sfa:ID="SFWPTextLabelFormat-58" sf:type="bullet" sf:format="&#x2022;" sf:first="0"/></sf:list-label-typeinfo><sf:list-label-typeinfo sfa:ID="SFWPListLabelTypeInfo-93" sf:type="text"><sf:text-label sfa:ID="SFWPTextLabelFormat-59" sf:type="bullet" sf:format="&#x2022;" sf:first="0"/></sf:list-label-typeinfo><sf:list-label-typeinfo sfa:ID="SFWPListLabelTypeInfo-94" sf:type="text"><sf:text-label sfa:ID="SFWPTextLabelFormat-60" sf:type="bullet" sf:format="&#x2022;" sf:first="0"/></sf:list-label-typeinfo><sf:list-label-typeinfo sfa:ID="SFWPListLabelTypeInfo-95" sf:type="text"><sf:text-label sfa:ID="SFWPTextLabelFormat-61" sf:type="bullet" sf:format="&#x2022;" sf:first="0"/></sf:list-label-typeinfo><sf:list-label-typeinfo sfa:ID="SFWPListLabelTypeInfo-96" sf:type="text"><sf:text-label sfa:ID="SFWPTextLabelFormat-62" sf:type="bullet" sf:format="&#x2022;" sf:first="0"/></sf:list-label-typeinfo><sf:list-label-typeinfo sfa:ID="SFWPListLabelTypeInfo-97" sf:type="text"><sf:text-label sfa:ID="SFWPTextLabelFormat-63" sf:type="bullet" sf:format="&#x2022;" sf:first="0"/></sf:list-label-typeinfo><sf:list-label-typeinfo sfa:ID="SFWPListLabelTypeInfo-98" sf:type="text"><sf:text-label sfa:ID="SFWPTextLabelFormat-64" sf:type="bullet" sf:format="&#x2022;" sf:first="0"/></sf:list-label-typeinfo></sf:array></sf:listLabelTypes></sf:property-map></sf:liststyle></sf:listStyle><sf:outlineLevel/><sf:firstTopicNumber/><sf:underline/><sf:defaultTabStops><sf:number sfa:number="28.34646" sfa:type="f"/></sf:defaultTabStops><sf:underlineWidth/><sf:dropCap/><sf:fontName/><sf:strikethru/><sf:baselineShift/><sf:lineSpacing/><sf:textShadow/><sf:underlineColor><sf:null/></sf:underlineColor><sf:kerning/><sf:strikethruWidth/><sf:fontColor/><sf:textBackground><sf:null/></sf:textBackground><sf:paragraphRuleWidth/><sf:paragraphStroke><sf:null/></sf:paragraphStroke><sf:bold/><sf:tracking/><sf:ligatures/><sf:language><sf:null/></sf:language><sf:followingParagraphStyle><sf:null/></sf:followingParagraphStyle><sf:outline/><sf:strikethruColor><sf:null/></sf:strikethruColor><sf:italic/><sf:word_underline/><sf:widowControl/><sf:rightIndent/><sf:atsuFontFeatures/><sf:tabs/><sf:superscript/><sf:paragraphBorderType/><sf:hyphenate/><sf:hidden/><sf:pageBreakBefore/><sf:paragraphFill><sf:null/></sf:paragraphFill><sf:spaceBefore/><sf:keepWithNext/><sf:outlineColor><sf:null/></sf:outlineColor><sf:paragraphRuleOffset/><sf:capitalization/><sf:leftIndent/><sf:firstLineIndent/></sf:property-map></sf:paragraphstyle><sf:paragraphstyle sfa:ID="SFWPParagraphStyle-77" sf:name="keyword" sf:ident="paragraph-style-20"><sf:property-map><sf:fontSize/><sf:word_strikethrough/><sf:spaceAfter><sf:number sfa:number="12" sfa:type="f"/></sf:spaceAfter><sf:alignment/><sf:keepLinesTogether/><sf:listStyle><sf:liststyle-ref sfa:IDREF="SFWPListStyle-2"/></sf:listStyle><sf:outlineLevel/><sf:firstTopicNumber/><sf:underline/><sf:defaultTabStops><sf:number sfa:number="28.34646" sfa:type="f"/></sf:defaultTabStops><sf:underlineWidth/><sf:dropCap/><sf:fontName/><sf:strikethru/><sf:baselineShift/><sf:lineSpacing/><sf:textShadow/><sf:underlineColor><sf:null/></sf:underlineColor><sf:kerning/><sf:strikethruWidth/><sf:fontColor/><sf:textBackground><sf:null/></sf:textBackground><sf:paragraphRuleWidth/><sf:paragraphStroke><sf:null/></sf:paragraphStroke><sf:bold/><sf:tracking/><sf:ligatures/><sf:language><sf:null/></sf:language><sf:followingParagraphStyle><sf:null/></sf:followingParagraphStyle><sf:outline/><sf:strikethruColor><sf:null/></sf:strikethruColor><sf:italic/><sf:word_underline/><sf:widowControl/><sf:rightIndent/><sf:atsuFontFeatures/><sf:tabs/><sf:superscript/><sf:paragraphBorderType/><sf:hyphenate/><sf:hidden/><sf:pageBreakBefore/><sf:paragraphFill><sf:color xsi:type="sfa:calibrated-rgb-color-type" sfa:r="1" sfa:g="0.80000001192092896" sfa:b="0.40000000596046448" sfa:a="1"/></sf:paragraphFill><sf:spaceBefore/><sf:keepWithNext/><sf:outlineColor><sf:null/></sf:outlineColor><sf:paragraphRuleOffset/><sf:capitalization/><sf:leftIndent/><sf:firstLineIndent/></sf:property-map></sf:paragraphstyle><sf:characterstyle sfa:ID="SFWPCharacterStyle-23" sf:name="inlineerror" sf:ident="character-style-12"><sf:property-map><sf:italic/><sf:fontColor><sf:color xsi:type="sfa:calibrated-rgb-color-type" sfa:r="1" sfa:g="0" sfa:b="0" sfa:a="1"/></sf:fontColor><sf:fontSize/><sf:atsuFontFeatures/><sf:superscript/><sf:underline/><sf:bold/><sf:tracking/><sf:ligatures/><sf:fontName/><sf:strikethru/><sf:capitalization/><sf:textShadow/><sf:baselineShift/><sf:language><sf:string sfa:string="en"/></sf:language><sf:underlineColor><sf:null/></sf:underlineColor><sf:strikethruColor><sf:null/></sf:strikethruColor></sf:property-map></sf:characterstyle><sf:paragraphstyle sfa:ID="SFWPParagraphStyle-78" sf:name="affiliation" sf:ident="paragraph-style-5"><sf:property-map><sf:fontSize/><sf:word_strikethrough/><sf:spaceAfter><sf:number sfa:number="12" sfa:type="f"/></sf:spaceAfter><sf:alignment/><sf:keepLinesTogether/><sf:listStyle><sf:liststyle-ref sfa:IDREF="SFWPListStyle-2"/></sf:listStyle><sf:outlineLevel/><sf:firstTopicNumber/><sf:underline/><sf:defaultTabStops><sf:number sfa:number="28.34646" sfa:type="f"/></sf:defaultTabStops><sf:underlineWidth/><sf:dropCap/><sf:fontName/><sf:strikethru/><sf:baselineShift/><sf:lineSpacing/><sf:textShadow/><sf:underlineColor><sf:null/></sf:underlineColor><sf:kerning/><sf:strikethruWidth/><sf:fontColor/><sf:textBackground><sf:null/></sf:textBackground><sf:paragraphRuleWidth/><sf:paragraphStroke><sf:null/></sf:paragraphStroke><sf:bold/><sf:tracking/><sf:ligatures/><sf:language><sf:null/></sf:language><sf:followingParagraphStyle><sf:null/></sf:followingParagraphStyle><sf:outline/><sf:strikethruColor><sf:null/></sf:strikethruColor><sf:italic/><sf:word_underline/><sf:widowControl/><sf:rightIndent/><sf:atsuFontFeatures/><sf:tabs/><sf:superscript/><sf:paragraphBorderType/><sf:hyphenate/><sf:hidden/><sf:pageBreakBefore/><sf:paragraphFill><sf:null/></sf:paragraphFill><sf:spaceBefore/><sf:keepWithNext/><sf:outlineColor><sf:null/></sf:outlineColor><sf:paragraphRuleOffset/><sf:capitalization/><sf:leftIndent/><sf:firstLineIndent/></sf:property-map></sf:paragraphstyle><sf:paragraphstyle sfa:ID="SFWPParagraphStyle-79" sf:name="warning-title" sf:ident="paragraph-style-61"><sf:property-map><sf:fontSize><sf:number sfa:number="14" sfa:type="f"/></sf:fontSize><sf:word_strikethrough/><sf:spaceAfter><sf:number sfa:number="12" sfa:type="f"/></sf:spaceAfter><sf:alignment/><sf:keepLinesTogether/><sf:listStyle><sf:liststyle-ref sfa:IDREF="SFWPListStyle-5"/></sf:listStyle><sf:outlineLevel/><sf:firstTopicNumber/><sf:underline/><sf:defaultTabStops><sf:number sfa:number="28.34646" sfa:type="f"/></sf:defaultTabStops><sf:underlineWidth/><sf:dropCap/><sf:fontName/><sf:strikethru/><sf:baselineShift/><sf:lineSpacing/><sf:textShadow/><sf:underlineColor><sf:null/></sf:underlineColor><sf:kerning/><sf:strikethruWidth/><sf:fontColor><sf:color xsi:type="sfa:calibrated-rgb-color-type" sfa:r="1" sfa:g="1" sfa:b="0" sfa:a="1"/></sf:fontColor><sf:textBackground><sf:null/></sf:textBackground><sf:paragraphRuleWidth/><sf:paragraphStroke><sf:null/></sf:paragraphStroke><sf:bold><sf:number sfa:number="1" sfa:type="i"/></sf:bold><sf:tracking/><sf:ligatures/><sf:language><sf:null/></sf:language><sf:followingParagraphStyle><sf:null/></sf:followingParagraphStyle><sf:outline/><sf:strikethruColor><sf:null/></sf:strikethruColor><sf:italic/><sf:word_underline/><sf:widowControl/><sf:rightIndent/><sf:atsuFontFeatures/><sf:tabs/><sf:superscript/><sf:paragraphBorderType/><sf:hyphenate/><sf:hidden/><sf:pageBreakBefore/><sf:paragraphFill><sf:null/></sf:paragraphFill><sf:spaceBefore/><sf:keepWithNext/><sf:outlineColor><sf:null/></sf:outlineColor><sf:paragraphRuleOffset/><sf:capitalization/><sf:leftIndent/><sf:firstLineIndent/></sf:property-map></sf:paragraphstyle><sf:characterstyle sfa:ID="SFWPCharacterStyle-24" sf:name="surname" sf:ident="character-style-29"><sf:property-map><sf:italic/><sf:fontSize/><sf:fontColor/><sf:atsuFontFeatures/><sf:superscript/><sf:underline/><sf:bold><sf:number sfa:number="1" sfa:type="i"/></sf:bold><sf:tracking/><sf:fontName/><sf:baselineShift/><sf:ligatures/><sf:strikethru/><sf:capitalization/><sf:textShadow/><sf:language><sf:string sfa:string="en"/></sf:language><sf:underlineColor><sf:null/></sf:underlineColor><sf:strikethruColor><sf:null/></sf:strikethruColor></sf:property-map></sf:characterstyle><sf:paragraphstyle sfa:ID="SFWPParagraphStyle-80" sf:name="bibliodiv-title" sf:ident="paragraph-style-93"><sf:property-map><sf:fontSize><sf:number sfa:number="14" sfa:type="f"/></sf:fontSize><sf:word_strikethrough/><sf:spaceAfter/><sf:alignment/><sf:keepLinesTogether/><sf:listStyle><sf:liststyle-ref sfa:IDREF="SFWPListStyle-2"/></sf:listStyle><sf:outlineLevel/><sf:firstTopicNumber/><sf:underline/><sf:defaultTabStops><sf:number sfa:number="28.34646" sfa:type="f"/></sf:defaultTabStops><sf:tocStyle><sf:tocstyle-ref sfa:IDREF="SLTOCParagraphStyle-3"/></sf:tocStyle><sf:dropCap/><sf:underlineWidth/><sf:fontName><sf:string sfa:string="Helvetica-Bold"/></sf:fontName><sf:strikethru/><sf:baselineShift/><sf:lineSpacing/><sf:textShadow/><sf:underlineColor><sf:null/></sf:underlineColor><sf:showInTOC><sf:number sfa:number="1" sfa:type="c"/></sf:showInTOC><sf:kerning/><sf:strikethruWidth/><sf:fontColor/><sf:textBackground><sf:null/></sf:textBackground><sf:paragraphRuleWidth/><sf:paragraphStroke><sf:null/></sf:paragraphStroke><sf:bold><sf:number sfa:number="1" sfa:type="c"/></sf:bold><sf:tracking/><sf:ligatures/><sf:language><sf:null/></sf:language><sf:followingParagraphStyle><sf:paragraphstyle-ref sfa:IDREF="SFWPParagraphStyle-7"/></sf:followingParagraphStyle><sf:outline/><sf:strikethruColor><sf:null/></sf:strikethruColor><sf:italic/><sf:word_underline/><sf:widowControl/><sf:rightIndent/><sf:atsuFontFeatures/><sf:tabs/><sf:superscript/><sf:paragraphBorderType/><sf:hyphenate/><sf:hidden/><sf:pageBreakBefore/><sf:paragraphFill><sf:null/></sf:paragraphFill><sf:spaceBefore><sf:number sfa:number="12" sfa:type="f"/></sf:spaceBefore><sf:keepWithNext><sf:number sfa:number="1" sfa:type="c"/></sf:keepWithNext><sf:outlineColor><sf:null/></sf:outlineColor><sf:paragraphRuleOffset/><sf:capitalization/><sf:leftIndent><sf:number sfa:number="14.17323" sfa:type="f"/></sf:leftIndent><sf:firstLineIndent><sf:number sfa:number="14.17323" sfa:type="f"/></sf:firstLineIndent></sf:property-map></sf:paragraphstyle><sf:characterstyle sfa:ID="SFWPCharacterStyle-25" sf:name="sgmltag" sf:ident="character-style-22"><sf:property-map><sf:italic/><sf:fontSize/><sf:fontColor/><sf:atsuFontFeatures/><sf:superscript/><sf:underline/><sf:bold><sf:number sfa:number="1" sfa:type="c"/></sf:bold><sf:tracking/><sf:fontName><sf:string sfa:string="Courier-Bold"/></sf:fontName><sf:baselineShift/><sf:strikethru/><sf:capitalization/><sf:textShadow/><sf:ligatures/><sf:language><sf:string sfa:string="en"/></sf:language><sf:underlineColor><sf:null/></sf:underlineColor><sf:strikethruColor><sf:null/></sf:strikethruColor></sf:property-map></sf:characterstyle><sf:characterstyle sfa:ID="SFWPCharacterStyle-26" sf:name="honorific" sf:ident="character-style-11"><sf:property-map><sf:italic/><sf:fontColor/><sf:fontSize/><sf:atsuFontFeatures/><sf:superscript/><sf:underline/><sf:bold><sf:number sfa:number="1" sfa:type="i"/></sf:bold><sf:tracking/><sf:ligatures/><sf:fontName/><sf:strikethru/><sf:capitalization/><sf:textShadow/><sf:baselineShift/><sf:language><sf:string sfa:string="en"/></sf:language><sf:underlineColor><sf:null/></sf:underlineColor><sf:strikethruColor><sf:null/></sf:strikethruColor></sf:property-map></sf:characterstyle><sf:paragraphstyle-ref sfa:IDREF="SFWPParagraphStyle-40"/><sf:paragraphstyle sfa:ID="SFWPParagraphStyle-81" sf:name="Footnote Text" sf:ident="kSFWPFootnoteTextStyleIdentifier"><sf:property-map><sf:fontSize><sf:number sfa:number="10" sfa:type="f"/></sf:fontSize><sf:word_strikethrough/><sf:spaceAfter><sf:number sfa:number="10" sfa:type="f"/></sf:spaceAfter><sf:alignment/><sf:keepLinesTogether/><sf:listStyle><sf:liststyle-ref sfa:IDREF="SFWPListStyle-2"/></sf:listStyle><sf:outlineLevel/><sf:firstTopicNumber/><sf:underline/><sf:defaultTabStops><sf:number sfa:number="28.34646" sfa:type="f"/></sf:defaultTabStops><sf:underlineWidth/><sf:dropCap/><sf:fontName/><sf:strikethru/><sf:baselineShift/><sf:lineSpacing/><sf:textShadow/><sf:underlineColor><sf:null/></sf:underlineColor><sf:kerning/><sf:strikethruWidth/><sf:fontColor><sf:color xsi:type="sfa:calibrated-rgb-color-type" sfa:r="0" sfa:g="0" sfa:b="0" sfa:a="1"/></sf:fontColor><sf:textBackground><sf:null/></sf:textBackground><sf:paragraphRuleWidth/><sf:paragraphStroke><sf:null/></sf:paragraphStroke><sf:bold/><sf:tracking/><sf:ligatures/><sf:language><sf:null/></sf:language><sf:followingParagraphStyle><sf:null/></sf:followingParagraphStyle><sf:outline/><sf:strikethruColor><sf:null/></sf:strikethruColor><sf:italic/><sf:word_underline/><sf:widowControl/><sf:rightIndent/><sf:atsuFontFeatures/><sf:tabs/><sf:superscript/><sf:paragraphBorderType/><sf:hyphenate/><sf:hidden/><sf:pageBreakBefore/><sf:paragraphFill><sf:null/></sf:paragraphFill><sf:spaceBefore/><sf:keepWithNext/><sf:outlineColor><sf:null/></sf:outlineColor><sf:paragraphRuleOffset/><sf:capitalization/><sf:leftIndent/><sf:firstLineIndent/></sf:property-map></sf:paragraphstyle><sf:paragraphstyle sfa:ID="SFWPParagraphStyle-82" sf:name="preface-title" sf:ident="paragraph-style-40"><sf:property-map><sf:fontSize><sf:number sfa:number="18" sfa:type="f"/></sf:fontSize><sf:word_strikethrough/><sf:spaceAfter/><sf:alignment/><sf:keepLinesTogether/><sf:listStyle><sf:liststyle-ref sfa:IDREF="SFWPListStyle-2"/></sf:listStyle><sf:outlineLevel/><sf:firstTopicNumber/><sf:underline/><sf:defaultTabStops><sf:number sfa:number="28.34646" sfa:type="f"/></sf:defaultTabStops><sf:tocStyle><sf:tocstyle-ref sfa:IDREF="SLTOCParagraphStyle-3"/></sf:tocStyle><sf:dropCap/><sf:underlineWidth/><sf:fontName><sf:string sfa:string="Helvetica-Bold"/></sf:fontName><sf:strikethru/><sf:baselineShift/><sf:lineSpacing/><sf:textShadow/><sf:underlineColor><sf:null/></sf:underlineColor><sf:showInTOC><sf:number sfa:number="1" sfa:type="c"/></sf:showInTOC><sf:kerning/><sf:strikethruWidth/><sf:fontColor/><sf:textBackground><sf:null/></sf:textBackground><sf:paragraphRuleWidth/><sf:paragraphStroke><sf:null/></sf:paragraphStroke><sf:bold><sf:number sfa:number="1" sfa:type="c"/></sf:bold><sf:tracking/><sf:ligatures/><sf:language><sf:null/></sf:language><sf:followingParagraphStyle><sf:paragraphstyle-ref sfa:IDREF="SFWPParagraphStyle-7"/></sf:followingParagraphStyle><sf:outline/><sf:strikethruColor><sf:null/></sf:strikethruColor><sf:italic/><sf:word_underline/><sf:widowControl/><sf:rightIndent/><sf:atsuFontFeatures/><sf:tabs/><sf:superscript/><sf:paragraphBorderType/><sf:hyphenate/><sf:hidden/><sf:pageBreakBefore/><sf:paragraphFill><sf:null/></sf:paragraphFill><sf:spaceBefore><sf:number sfa:number="12" sfa:type="f"/></sf:spaceBefore><sf:keepWithNext><sf:number sfa:number="1" sfa:type="c"/></sf:keepWithNext><sf:outlineColor><sf:null/></sf:outlineColor><sf:paragraphRuleOffset/><sf:capitalization/><sf:leftIndent/><sf:firstLineIndent/></sf:property-map></sf:paragraphstyle><sf:paragraphstyle sfa:ID="SFWPParagraphStyle-83" sf:ident="SFCCategoryAxisParagraphStyleProperty" sf:parent-ident="chart-paragraph-style-default"><sf:property-map><sf:outline/><sf:italic/><sf:strikethruColor><sf:null/></sf:strikethruColor><sf:word_underline/><sf:decimalTab/><sf:word_strikethrough/><sf:keepLinesTogether/><sf:spaceAfter/><sf:alignment/><sf:fontSize/><sf:widowControl/><sf:rightIndent/><sf:atsuFontFeatures/><sf:tabs/><sf:dropCap/><sf:underline/><sf:underlineWidth/><sf:defaultTabStops/><sf:tocStyle><sf:null/></sf:tocStyle><sf:firstTopicNumber/><sf:outlineLevel/><sf:fontName/><sf:strikethru/><sf:baselineShift/><sf:lineSpacing/><sf:textShadow/><sf:superscript/><sf:hyphenate/><sf:underlineColor><sf:null/></sf:underlineColor><sf:hidden/><sf:showInTOC/><sf:kerning/><sf:pageBreakBefore/><sf:strikethruWidth/><sf:fontColor/><sf:paragraphFill><sf:null/></sf:paragraphFill><sf:spaceBefore/><sf:keepWithNext/><sf:outlineColor><sf:null/></sf:outlineColor><sf:paragraphStroke><sf:null/></sf:paragraphStroke><sf:bold/><sf:tracking/><sf:ligatures/><sf:capitalization/><sf:language><sf:null/></sf:language><sf:followingParagraphStyle><sf:null/></sf:followingParagraphStyle><sf:leftIndent/><sf:firstLineIndent/></sf:property-map></sf:paragraphstyle><sf:paragraphstyle sfa:ID="SFWPParagraphStyle-84" sf:ident="Series_2_SFCPieSeriesValueParagraphStyleProperty" sf:parent-ident="chart-paragraph-style-default"><sf:property-map><sf:outline/><sf:italic/><sf:strikethruColor><sf:null/></sf:strikethruColor><sf:word_underline/><sf:decimalTab/><sf:word_strikethrough/><sf:keepLinesTogether/><sf:spaceAfter/><sf:alignment><sf:number sfa:number="2" sfa:type="i"/></sf:alignment><sf:fontSize><sf:number sfa:number="16" sfa:type="f"/></sf:fontSize><sf:widowControl/><sf:rightIndent/><sf:atsuFontFeatures/><sf:tabs/><sf:dropCap/><sf:underline/><sf:underlineWidth/><sf:defaultTabStops/><sf:tocStyle><sf:null/></sf:tocStyle><sf:firstTopicNumber/><sf:outlineLevel/><sf:fontName/><sf:strikethru/><sf:baselineShift/><sf:lineSpacing/><sf:textShadow/><sf:superscript/><sf:hyphenate/><sf:underlineColor><sf:null/></sf:underlineColor><sf:hidden/><sf:showInTOC/><sf:kerning/><sf:pageBreakBefore/><sf:strikethruWidth/><sf:fontColor><sf:color xsi:type="sfa:calibrated-white-color-type" sfa:w="1" sfa:a="1"/></sf:fontColor><sf:paragraphFill><sf:null/></sf:paragraphFill><sf:spaceBefore/><sf:keepWithNext/><sf:outlineColor><sf:null/></sf:outlineColor><sf:paragraphStroke><sf:null/></sf:paragraphStroke><sf:bold/><sf:tracking/><sf:ligatures/><sf:capitalization/><sf:language><sf:null/></sf:language><sf:followingParagraphStyle><sf:null/></sf:followingParagraphStyle><sf:leftIndent/><sf:firstLineIndent/></sf:property-map></sf:paragraphstyle><sf:characterstyle sfa:ID="SFWPCharacterStyle-27" sf:name="fax" sf:ident="character-style-8"><sf:property-map><sf:italic/><sf:fontColor/><sf:fontSize/><sf:atsuFontFeatures/><sf:superscript/><sf:underline/><sf:bold/><sf:tracking/><sf:ligatures/><sf:fontName><sf:string sfa:string="Courier"/></sf:fontName><sf:strikethru/><sf:capitalization/><sf:textShadow/><sf:baselineShift/><sf:language><sf:string sfa:string="en"/></sf:language><sf:underlineColor><sf:null/></sf:underlineColor><sf:strikethruColor><sf:null/></sf:strikethruColor></sf:property-map></sf:characterstyle><sf:graphic-style sfa:ID="SFDGraphicStyle-15" sf:name="graphic-image-style-default" sf:ident="graphic-image-style-default"><sf:property-map><sf:opacity><sf:number sfa:number="1" sfa:type="f"/></sf:opacity><sf:reflection><sf:null/></sf:reflection><sf:externalTextWrap><sf:external-text-wrap sfa:ID="SFWPExternalTextWrap-8" sf:wrap-style="tight" sf:floating-wrap-enabled="true" sf:direction="both" sf:attachment-wrap-type="aligned" sf:floating-wrap-type="directional" sf:margin="12" sf:alpha-threshold="0.5"/></sf:externalTextWrap><sf:stroke><sf:stroke sfa:ID="SFRStroke-38" sf:miter-limit="4" sf:width="1" sf:cap="butt" sf:join="miter"><sf:color xsi:type="sfa:calibrated-white-color-type" sfa:w="0" sfa:a="1"/><sf:pattern sfa:ID="SFRStrokePattern-34" sf:phase="0" sf:type="empty"><sf:pattern/></sf:pattern></sf:stroke></sf:stroke><sf:layoutStyle><sf:null/></sf:layoutStyle><sf:fill><sf:null/></sf:fill><sf:shadow><sf:shadow-ref sfa:IDREF="SFRShadow-0"/></sf:shadow></sf:property-map></sf:graphic-style><sf:graphic-style sfa:ID="SFDGraphicStyle-16" sf:name="graphic-image-style-default 3" sf:ident="graphic-image-style-default-2" sf:parent-ident="graphic-image-style-default"><sf:property-map><sf:shadow><sf:shadow-ref sfa:IDREF="SFRShadow-0"/></sf:shadow></sf:property-map></sf:graphic-style><sf:paragraphstyle sfa:ID="SFWPParagraphStyle-85" sf:name="xinclude" sf:ident="paragraph-style-85"><sf:property-map><sf:fontSize/><sf:word_strikethrough/><sf:spaceAfter><sf:number sfa:number="12" sfa:type="f"/></sf:spaceAfter><sf:alignment/><sf:keepLinesTogether/><sf:listStyle><sf:liststyle-ref sfa:IDREF="SFWPListStyle-2"/></sf:listStyle><sf:outlineLevel/><sf:firstTopicNumber/><sf:underline/><sf:defaultTabStops><sf:number sfa:number="28.34646" sfa:type="f"/></sf:defaultTabStops><sf:underlineWidth/><sf:dropCap/><sf:fontName/><sf:strikethru/><sf:baselineShift/><sf:lineSpacing/><sf:textShadow/><sf:underlineColor><sf:null/></sf:underlineColor><sf:kerning/><sf:strikethruWidth/><sf:fontColor><sf:color xsi:type="sfa:calibrated-rgb-color-type" sfa:r="0.80000001192092896" sfa:g="0.20000000298023224" sfa:b="0.20000000298023224" sfa:a="1"/></sf:fontColor><sf:textBackground><sf:null/></sf:textBackground><sf:paragraphRuleWidth/><sf:paragraphStroke><sf:null/></sf:paragraphStroke><sf:bold/><sf:tracking/><sf:ligatures/><sf:language><sf:null/></sf:language><sf:followingParagraphStyle><sf:null/></sf:followingParagraphStyle><sf:outline/><sf:strikethruColor><sf:null/></sf:strikethruColor><sf:italic/><sf:word_underline/><sf:widowControl/><sf:rightIndent/><sf:atsuFontFeatures/><sf:tabs/><sf:superscript/><sf:paragraphBorderType/><sf:hyphenate/><sf:hidden/><sf:pageBreakBefore/><sf:paragraphFill><sf:color xsi:type="sfa:calibrated-rgb-color-type" sfa:r="0.20000000298023224" sfa:g="0.20000000298023224" sfa:b="0.20000000298023224" sfa:a="1"/></sf:paragraphFill><sf:spaceBefore/><sf:keepWithNext/><sf:outlineColor><sf:null/></sf:outlineColor><sf:paragraphRuleOffset/><sf:capitalization/><sf:leftIndent/><sf:firstLineIndent/></sf:property-map></sf:paragraphstyle><sf:paragraphstyle sfa:ID="SFWPParagraphStyle-86" sf:name="bibliography-title" sf:ident="paragraph-style-9"><sf:property-map><sf:fontSize><sf:number sfa:number="18" sfa:type="f"/></sf:fontSize><sf:word_strikethrough/><sf:spaceAfter/><sf:alignment/><sf:keepLinesTogether/><sf:listStyle><sf:liststyle-ref sfa:IDREF="SFWPListStyle-2"/></sf:listStyle><sf:outlineLevel/><sf:firstTopicNumber/><sf:underline/><sf:defaultTabStops><sf:number sfa:number="28.34646" sfa:type="f"/></sf:defaultTabStops><sf:tocStyle><sf:tocstyle-ref sfa:IDREF="SLTOCParagraphStyle-3"/></sf:tocStyle><sf:dropCap/><sf:underlineWidth/><sf:fontName><sf:string sfa:string="Helvetica-Bold"/></sf:fontName><sf:strikethru/><sf:baselineShift/><sf:lineSpacing/><sf:textShadow/><sf:underlineColor><sf:null/></sf:underlineColor><sf:showInTOC><sf:number sfa:number="1" sfa:type="c"/></sf:showInTOC><sf:kerning/><sf:strikethruWidth/><sf:fontColor/><sf:textBackground><sf:null/></sf:textBackground><sf:paragraphRuleWidth/><sf:paragraphStroke><sf:null/></sf:paragraphStroke><sf:bold><sf:number sfa:number="1" sfa:type="c"/></sf:bold><sf:tracking/><sf:ligatures/><sf:language><sf:null/></sf:language><sf:followingParagraphStyle><sf:paragraphstyle-ref sfa:IDREF="SFWPParagraphStyle-7"/></sf:followingParagraphStyle><sf:outline/><sf:strikethruColor><sf:null/></sf:strikethruColor><sf:italic/><sf:word_underline/><sf:widowControl/><sf:rightIndent/><sf:atsuFontFeatures/><sf:tabs/><sf:superscript/><sf:paragraphBorderType/><sf:hyphenate/><sf:hidden/><sf:pageBreakBefore/><sf:paragraphFill><sf:null/></sf:paragraphFill><sf:spaceBefore><sf:number sfa:number="12" sfa:type="f"/></sf:spaceBefore><sf:keepWithNext><sf:number sfa:number="1" sfa:type="c"/></sf:keepWithNext><sf:outlineColor><sf:null/></sf:outlineColor><sf:paragraphRuleOffset/><sf:capitalization/><sf:leftIndent/><sf:firstLineIndent/></sf:property-map></sf:paragraphstyle><sf:paragraphstyle sfa:ID="SFWPParagraphStyle-87" sf:name="simpara" sf:ident="paragraph-style-55"><sf:property-map><sf:fontSize/><sf:word_strikethrough/><sf:spaceAfter><sf:number sfa:number="12" sfa:type="f"/></sf:spaceAfter><sf:alignment/><sf:keepLinesTogether/><sf:listStyle><sf:liststyle-ref sfa:IDREF="SFWPListStyle-2"/></sf:listStyle><sf:outlineLevel/><sf:firstTopicNumber/><sf:underline/><sf:defaultTabStops><sf:number sfa:number="28.34646" sfa:type="f"/></sf:defaultTabStops><sf:underlineWidth/><sf:dropCap/><sf:fontName/><sf:strikethru/><sf:baselineShift/><sf:lineSpacing/><sf:textShadow/><sf:underlineColor><sf:null/></sf:underlineColor><sf:kerning/><sf:strikethruWidth/><sf:fontColor/><sf:textBackground><sf:null/></sf:textBackground><sf:paragraphRuleWidth/><sf:paragraphStroke><sf:null/></sf:paragraphStroke><sf:bold/><sf:tracking/><sf:ligatures/><sf:language><sf:null/></sf:language><sf:followingParagraphStyle><sf:null/></sf:followingParagraphStyle><sf:outline/><sf:strikethruColor><sf:null/></sf:strikethruColor><sf:italic/><sf:word_underline/><sf:widowControl/><sf:rightIndent/><sf:atsuFontFeatures/><sf:tabs/><sf:superscript/><sf:paragraphBorderType/><sf:hyphenate/><sf:hidden/><sf:pageBreakBefore/><sf:paragraphFill><sf:null/></sf:paragraphFill><sf:spaceBefore/><sf:keepWithNext/><sf:outlineColor><sf:null/></sf:outlineColor><sf:paragraphRuleOffset/><sf:capitalization/><sf:leftIndent/><sf:firstLineIndent/></sf:property-map></sf:paragraphstyle><sf:paragraphstyle sfa:ID="SFWPParagraphStyle-88" sf:name="book-title" sf:ident="paragraph-style-3"><sf:property-map><sf:fontSize><sf:number sfa:number="28" sfa:type="f"/></sf:fontSize><sf:word_strikethrough/><sf:spaceAfter/><sf:alignment/><sf:keepLinesTogether/><sf:listStyle><sf:liststyle-ref sfa:IDREF="SFWPListStyle-2"/></sf:listStyle><sf:outlineLevel/><sf:firstTopicNumber/><sf:underline/><sf:defaultTabStops><sf:number sfa:number="28.34646" sfa:type="f"/></sf:defaultTabStops><sf:tocStyle><sf:tocstyle-ref sfa:IDREF="SLTOCParagraphStyle-4"/></sf:tocStyle><sf:dropCap/><sf:underlineWidth/><sf:fontName><sf:string sfa:string="Helvetica-Bold"/></sf:fontName><sf:strikethru/><sf:baselineShift/><sf:lineSpacing/><sf:textShadow/><sf:underlineColor><sf:null/></sf:underlineColor><sf:showInTOC><sf:number sfa:number="1" sfa:type="c"/></sf:showInTOC><sf:kerning/><sf:strikethruWidth/><sf:fontColor/><sf:textBackground><sf:null/></sf:textBackground><sf:paragraphRuleWidth/><sf:paragraphStroke><sf:null/></sf:paragraphStroke><sf:bold><sf:number sfa:number="1" sfa:type="c"/></sf:bold><sf:tracking/><sf:ligatures/><sf:language><sf:null/></sf:language><sf:followingParagraphStyle><sf:paragraphstyle-ref sfa:IDREF="SFWPParagraphStyle-7"/></sf:followingParagraphStyle><sf:outline/><sf:strikethruColor><sf:null/></sf:strikethruColor><sf:italic/><sf:word_underline/><sf:widowControl/><sf:rightIndent/><sf:atsuFontFeatures/><sf:tabs/><sf:superscript/><sf:paragraphBorderType/><sf:hyphenate/><sf:hidden/><sf:pageBreakBefore/><sf:paragraphFill><sf:null/></sf:paragraphFill><sf:spaceBefore><sf:number sfa:number="24" sfa:type="f"/></sf:spaceBefore><sf:keepWithNext><sf:number sfa:number="1" sfa:type="c"/></sf:keepWithNext><sf:outlineColor><sf:null/></sf:outlineColor><sf:paragraphRuleOffset/><sf:capitalization/><sf:leftIndent/><sf:firstLineIndent/></sf:property-map></sf:paragraphstyle><sf:graphic-style sfa:ID="SFDGraphicStyle-17" sf:name="graphic-movie-style-default" sf:ident="graphic-movie-style-default"><sf:property-map><sf:opacity><sf:number sfa:number="1" sfa:type="f"/></sf:opacity><sf:reflection><sf:null/></sf:reflection><sf:externalTextWrap><sf:external-text-wrap sfa:ID="SFWPExternalTextWrap-9" sf:wrap-style="tight" sf:floating-wrap-enabled="true" sf:direction="both" sf:attachment-wrap-type="aligned" sf:floating-wrap-type="directional" sf:margin="12" sf:alpha-threshold="0.5"/></sf:externalTextWrap><sf:stroke><sf:stroke sfa:ID="SFRStroke-39" sf:miter-limit="4" sf:width="1" sf:cap="butt" sf:join="miter"><sf:color xsi:type="sfa:calibrated-white-color-type" sfa:w="0" sfa:a="1"/><sf:pattern sfa:ID="SFRStrokePattern-35" sf:phase="0" sf:type="empty"><sf:pattern/></sf:pattern></sf:stroke></sf:stroke><sf:layoutStyle><sf:null/></sf:layoutStyle><sf:fill><sf:null/></sf:fill><sf:shadow><sf:shadow-ref sfa:IDREF="SFRShadow-0"/></sf:shadow></sf:property-map></sf:graphic-style><sf:graphic-style sfa:ID="SFDGraphicStyle-18" sf:name="graphic-movie-style-default 2" sf:ident="graphic-movie-style-default-1" sf:parent-ident="graphic-movie-style-default"><sf:property-map><sf:shadow><sf:shadow-ref sfa:IDREF="SFRShadow-0"/></sf:shadow></sf:property-map></sf:graphic-style><sf:paragraphstyle-ref sfa:IDREF="SFWPParagraphStyle-43"/><sf:paragraphstyle sfa:ID="SFWPParagraphStyle-89" sf:name="abstract-title" sf:ident="paragraph-style-88"><sf:property-map><sf:fontSize><sf:number sfa:number="15" sfa:type="f"/></sf:fontSize><sf:word_strikethrough/><sf:spaceAfter/><sf:alignment/><sf:keepLinesTogether/><sf:listStyle><sf:liststyle-ref sfa:IDREF="SFWPListStyle-2"/></sf:listStyle><sf:outlineLevel/><sf:firstTopicNumber/><sf:underline/><sf:defaultTabStops><sf:number sfa:number="28.34646" sfa:type="f"/></sf:defaultTabStops><sf:tocStyle><sf:tocstyle-ref sfa:IDREF="SLTOCParagraphStyle-3"/></sf:tocStyle><sf:dropCap/><sf:underlineWidth/><sf:fontName><sf:string sfa:string="Helvetica-Bold"/></sf:fontName><sf:strikethru/><sf:baselineShift/><sf:lineSpacing/><sf:textShadow/><sf:underlineColor><sf:null/></sf:underlineColor><sf:showInTOC><sf:number sfa:number="1" sfa:type="c"/></sf:showInTOC><sf:kerning/><sf:strikethruWidth/><sf:fontColor/><sf:textBackground><sf:null/></sf:textBackground><sf:paragraphRuleWidth/><sf:paragraphStroke><sf:null/></sf:paragraphStroke><sf:bold><sf:number sfa:number="1" sfa:type="c"/></sf:bold><sf:tracking/><sf:ligatures/><sf:language><sf:null/></sf:language><sf:followingParagraphStyle><sf:paragraphstyle-ref sfa:IDREF="SFWPParagraphStyle-7"/></sf:followingParagraphStyle><sf:outline/><sf:strikethruColor><sf:null/></sf:strikethruColor><sf:italic/><sf:word_underline/><sf:widowControl/><sf:rightIndent/><sf:atsuFontFeatures/><sf:tabs/><sf:superscript/><sf:paragraphBorderType/><sf:hyphenate/><sf:hidden/><sf:pageBreakBefore/><sf:paragraphFill><sf:null/></sf:paragraphFill><sf:spaceBefore><sf:number sfa:number="12" sfa:type="f"/></sf:spaceBefore><sf:keepWithNext><sf:number sfa:number="1" sfa:type="c"/></sf:keepWithNext><sf:outlineColor><sf:null/></sf:outlineColor><sf:paragraphRuleOffset/><sf:capitalization/><sf:leftIndent/><sf:firstLineIndent/></sf:property-map></sf:paragraphstyle><sf:characterstyle sfa:ID="SFWPCharacterStyle-28" sf:name="firstname" sf:ident="character-style-10"><sf:property-map><sf:italic><sf:number sfa:number="1" sfa:type="i"/></sf:italic><sf:fontColor/><sf:fontSize/><sf:atsuFontFeatures/><sf:superscript/><sf:underline/><sf:bold/><sf:tracking/><sf:ligatures/><sf:fontName/><sf:strikethru/><sf:capitalization/><sf:textShadow/><sf:baselineShift/><sf:language><sf:string sfa:string="en"/></sf:language><sf:underlineColor><sf:null/></sf:underlineColor><sf:strikethruColor><sf:null/></sf:strikethruColor></sf:property-map></sf:characterstyle><sf:paragraphstyle sfa:ID="SFWPParagraphStyle-90" sf:name="note" sf:ident="paragraph-style-31"><sf:property-map><sf:fontSize/><sf:word_strikethrough/><sf:spaceAfter><sf:number sfa:number="12" sfa:type="f"/></sf:spaceAfter><sf:alignment/><sf:keepLinesTogether/><sf:listStyle><sf:liststyle-ref sfa:IDREF="SFWPListStyle-5"/></sf:listStyle><sf:outlineLevel/><sf:firstTopicNumber/><sf:underline/><sf:defaultTabStops><sf:number sfa:number="28.34646" sfa:type="f"/></sf:defaultTabStops><sf:underlineWidth/><sf:dropCap/><sf:fontName/><sf:strikethru/><sf:baselineShift/><sf:lineSpacing/><sf:textShadow/><sf:underlineColor><sf:null/></sf:underlineColor><sf:kerning/><sf:strikethruWidth/><sf:fontColor><sf:color xsi:type="sfa:calibrated-rgb-color-type" sfa:r="0" sfa:g="0" sfa:b="0" sfa:a="1"/></sf:fontColor><sf:textBackground><sf:null/></sf:textBackground><sf:paragraphRuleWidth/><sf:paragraphStroke><sf:null/></sf:paragraphStroke><sf:bold/><sf:tracking/><sf:ligatures/><sf:language><sf:null/></sf:language><sf:followingParagraphStyle><sf:null/></sf:followingParagraphStyle><sf:outline/><sf:strikethruColor><sf:null/></sf:strikethruColor><sf:italic/><sf:word_underline/><sf:widowControl/><sf:rightIndent/><sf:atsuFontFeatures/><sf:tabs/><sf:superscript/><sf:paragraphBorderType/><sf:hyphenate/><sf:hidden/><sf:pageBreakBefore/><sf:paragraphFill><sf:null/></sf:paragraphFill><sf:spaceBefore/><sf:keepWithNext/><sf:outlineColor><sf:null/></sf:outlineColor><sf:paragraphRuleOffset/><sf:capitalization/><sf:leftIndent/><sf:firstLineIndent/></sf:property-map></sf:paragraphstyle><sf:sectionstyle sfa:ID="SFWPSectionStyle-3" sf:name="Normal" sf:ident="section-style-default"><sf:property-map><sf:sectionLayoutStyle><sf:null/></sf:sectionLayoutStyle><sf:inheritPreviousHF><sf:number sfa:number="1" sfa:type="c"/></sf:inheritPreviousHF><sf:sectionPageNumberStart><sf:number sfa:number="1" sfa:type="i"/></sf:sectionPageNumberStart><sf:pageMasterFirstPageDifferent><sf:number sfa:number="0" sfa:type="c"/></sf:pageMasterFirstPageDifferent><sf:firstPageMaster><sf:pagemaster sfa:ID="SFWPPageMaster-6" sl:header="SFWPDefaultFirstHeaderIdentifier" sl:footer="SFWPDefaultFirstFooterIdentifier"/></sf:firstPageMaster><sf:evenPageMaster><sf:pagemaster sfa:ID="SFWPPageMaster-7" sl:header="SFWPDefaultEvenHeaderIdentifier" sl:footer="SFWPDefaultEvenFooterIdentifier"/></sf:evenPageMaster><sf:startKind><sf:number sfa:number="0" sfa:type="i"/></sf:startKind><sf:pageMasterLeftRightPagesDifferent><sf:number sfa:number="0" sfa:type="c"/></sf:pageMasterLeftRightPagesDifferent><sf:sectionPageNumberKind><sf:number sfa:number="0" sfa:type="i"/></sf:sectionPageNumberKind><sf:oddPageMaster><sf:pagemaster sfa:ID="SFWPPageMaster-8" sl:header="SFWPDefaultOddHeaderIdentifier" sl:footer="SFWPDefaultOddFooterIdentifier"/></sf:oddPageMaster></sf:property-map></sf:sectionstyle><sf:characterstyle sfa:ID="SFWPCharacterStyle-29" sf:name="postcode" sf:ident="character-style-27"><sf:property-map><sf:underlineColor><sf:null/></sf:underlineColor><sf:fontColor/><sf:fontSize/><sf:textBackground><sf:null/></sf:textBackground><sf:atsuFontFeatures/><sf:superscript/><sf:underline><sf:number sfa:number="1" sfa:type="i"/></sf:underline><sf:bold/><sf:fontName/><sf:ligatures/><sf:strikethru/><sf:baselineShift/><sf:tracking/><sf:capitalization/><sf:textShadow/><sf:language><sf:string sfa:string="en"/></sf:language><sf:italic/><sf:strikethruColor><sf:null/></sf:strikethruColor></sf:property-map></sf:characterstyle><sf:paragraphstyle sfa:ID="SFWPParagraphStyle-91" sf:name="important-title" sf:ident="paragraph-style-26"><sf:property-map><sf:fontSize><sf:number sfa:number="14" sfa:type="f"/></sf:fontSize><sf:word_strikethrough/><sf:spaceAfter><sf:number sfa:number="12" sfa:type="f"/></sf:spaceAfter><sf:alignment/><sf:keepLinesTogether/><sf:listStyle><sf:liststyle-ref sfa:IDREF="SFWPListStyle-9"/></sf:listStyle><sf:outlineLevel/><sf:firstTopicNumber/><sf:underline/><sf:defaultTabStops><sf:number sfa:number="28.34646" sfa:type="f"/></sf:defaultTabStops><sf:underlineWidth/><sf:dropCap/><sf:fontName/><sf:strikethru/><sf:baselineShift/><sf:lineSpacing/><sf:textShadow/><sf:underlineColor><sf:null/></sf:underlineColor><sf:kerning/><sf:strikethruWidth/><sf:fontColor><sf:color xsi:type="sfa:calibrated-rgb-color-type" sfa:r="0" sfa:g="0" sfa:b="1" sfa:a="1"/></sf:fontColor><sf:textBackground><sf:null/></sf:textBackground><sf:paragraphRuleWidth/><sf:paragraphStroke><sf:null/></sf:paragraphStroke><sf:bold><sf:number sfa:number="1" sfa:type="i"/></sf:bold><sf:tracking/><sf:ligatures/><sf:language><sf:null/></sf:language><sf:followingParagraphStyle><sf:null/></sf:followingParagraphStyle><sf:outline/><sf:strikethruColor><sf:null/></sf:strikethruColor><sf:italic/><sf:word_underline/><sf:widowControl/><sf:rightIndent/><sf:atsuFontFeatures/><sf:tabs/><sf:superscript/><sf:paragraphBorderType/><sf:hyphenate/><sf:hidden/><sf:pageBreakBefore/><sf:paragraphFill><sf:null/></sf:paragraphFill><sf:spaceBefore/><sf:keepWithNext/><sf:outlineColor><sf:null/></sf:outlineColor><sf:paragraphRuleOffset/><sf:capitalization/><sf:leftIndent/><sf:firstLineIndent/></sf:property-map></sf:paragraphstyle><sf:paragraphstyle sfa:ID="SFWPParagraphStyle-92" sf:name="sect4-title" sf:ident="paragraph-style-48"><sf:property-map><sf:fontSize><sf:number sfa:number="14" sfa:type="f"/></sf:fontSize><sf:word_strikethrough/><sf:spaceAfter/><sf:alignment/><sf:keepLinesTogether/><sf:listStyle><sf:liststyle-ref sfa:IDREF="SFWPListStyle-2"/></sf:listStyle><sf:outlineLevel/><sf:firstTopicNumber/><sf:underline/><sf:defaultTabStops><sf:number sfa:number="28.34646" sfa:type="f"/></sf:defaultTabStops><sf:tocStyle><sf:tocstyle-ref sfa:IDREF="SLTOCParagraphStyle-3"/></sf:tocStyle><sf:dropCap/><sf:underlineWidth/><sf:fontName><sf:string sfa:string="Helvetica-Bold"/></sf:fontName><sf:strikethru/><sf:baselineShift/><sf:lineSpacing/><sf:textShadow/><sf:underlineColor><sf:null/></sf:underlineColor><sf:showInTOC><sf:number sfa:number="1" sfa:type="c"/></sf:showInTOC><sf:kerning/><sf:strikethruWidth/><sf:fontColor/><sf:textBackground><sf:null/></sf:textBackground><sf:paragraphRuleWidth/><sf:paragraphStroke><sf:null/></sf:paragraphStroke><sf:bold><sf:number sfa:number="1" sfa:type="c"/></sf:bold><sf:tracking/><sf:ligatures/><sf:language><sf:null/></sf:language><sf:followingParagraphStyle><sf:paragraphstyle-ref sfa:IDREF="SFWPParagraphStyle-7"/></sf:followingParagraphStyle><sf:outline/><sf:strikethruColor><sf:null/></sf:strikethruColor><sf:italic/><sf:word_underline/><sf:widowControl/><sf:rightIndent/><sf:atsuFontFeatures/><sf:tabs/><sf:superscript/><sf:paragraphBorderType/><sf:hyphenate/><sf:hidden/><sf:pageBreakBefore/><sf:paragraphFill><sf:null/></sf:paragraphFill><sf:spaceBefore><sf:number sfa:number="12" sfa:type="f"/></sf:spaceBefore><sf:keepWithNext><sf:number sfa:number="1" sfa:type="c"/></sf:keepWithNext><sf:outlineColor><sf:null/></sf:outlineColor><sf:paragraphRuleOffset/><sf:capitalization/><sf:leftIndent/><sf:firstLineIndent/></sf:property-map></sf:paragraphstyle><sf:paragraphstyle sfa:ID="SFWPParagraphStyle-93" sf:ident="SFCChartTitleParagraphStyleProperty" sf:parent-ident="chart-paragraph-style-default"><sf:property-map><sf:fontSize/><sf:word_strikethrough/><sf:spaceAfter/><sf:alignment/><sf:keepLinesTogether/><sf:outlineLevel/><sf:underline/><sf:underlineWidth/><sf:defaultTabStops/><sf:tocStyle><sf:null/></sf:tocStyle><sf:firstTopicNumber/><sf:dropCap/><sf:fontName/><sf:strikethru/><sf:baselineShift/><sf:lineSpacing/><sf:textShadow/><sf:underlineColor><sf:null/></sf:underlineColor><sf:showInTOC/><sf:kerning/><sf:strikethruWidth/><sf:fontColor/><sf:textBackground><sf:null/></sf:textBackground><sf:paragraphRuleWidth/><sf:paragraphStroke><sf:null/></sf:paragraphStroke><sf:bold/><sf:tracking/><sf:ligatures/><sf:language><sf:null/></sf:language><sf:italic/><sf:followingParagraphStyle><sf:null/></sf:followingParagraphStyle><sf:outline/><sf:strikethruColor><sf:null/></sf:strikethruColor><sf:word_underline/><sf:decimalTab/><sf:widowControl/><sf:rightIndent/><sf:atsuFontFeatures/><sf:tabs/><sf:superscript/><sf:paragraphBorderType/><sf:hyphenate/><sf:hidden/><sf:pageBreakBefore/><sf:paragraphFill><sf:null/></sf:paragraphFill><sf:spaceBefore/><sf:keepWithNext/><sf:outlineColor><sf:null/></sf:outlineColor><sf:paragraphRuleOffset/><sf:capitalization/><sf:leftIndent/><sf:firstLineIndent/></sf:property-map></sf:paragraphstyle><sf:paragraphstyle sfa:ID="SFWPParagraphStyle-94" sf:name="example-title" sf:ident="paragraph-style-66"><sf:property-map><sf:fontSize><sf:number sfa:number="13" sfa:type="f"/></sf:fontSize><sf:word_strikethrough/><sf:spaceAfter><sf:number sfa:number="12" sfa:type="f"/></sf:spaceAfter><sf:alignment/><sf:keepLinesTogether/><sf:listStyle><sf:liststyle-ref sfa:IDREF="SFWPListStyle-2"/></sf:listStyle><sf:outlineLevel/><sf:firstTopicNumber/><sf:underline/><sf:defaultTabStops><sf:number sfa:number="28.34646" sfa:type="f"/></sf:defaultTabStops><sf:underlineWidth/><sf:dropCap/><sf:fontName/><sf:strikethru/><sf:baselineShift/><sf:lineSpacing/><sf:textShadow/><sf:underlineColor><sf:null/></sf:underlineColor><sf:kerning/><sf:strikethruWidth/><sf:fontColor/><sf:textBackground><sf:null/></sf:textBackground><sf:paragraphRuleWidth/><sf:paragraphStroke><sf:null/></sf:paragraphStroke><sf:bold><sf:number sfa:number="1" sfa:type="i"/></sf:bold><sf:tracking/><sf:ligatures/><sf:language><sf:null/></sf:language><sf:followingParagraphStyle><sf:null/></sf:followingParagraphStyle><sf:outline/><sf:strikethruColor><sf:null/></sf:strikethruColor><sf:italic/><sf:word_underline/><sf:widowControl/><sf:rightIndent><sf:number sfa:number="28.34646" sfa:type="f"/></sf:rightIndent><sf:atsuFontFeatures/><sf:tabs/><sf:superscript/><sf:paragraphBorderType/><sf:hyphenate/><sf:hidden/><sf:pageBreakBefore/><sf:paragraphFill><sf:null/></sf:paragraphFill><sf:spaceBefore/><sf:keepWithNext/><sf:outlineColor><sf:null/></sf:outlineColor><sf:paragraphRuleOffset/><sf:capitalization/><sf:leftIndent><sf:number sfa:number="28.35709" sfa:type="f"/></sf:leftIndent><sf:firstLineIndent><sf:number sfa:number="28.35709" sfa:type="f"/></sf:firstLineIndent></sf:property-map></sf:paragraphstyle><sf:liststyle sfa:ID="SFWPListStyle-13" sf:name="Legal" sf:ident="list-style-4"><sf:property-map><sf:listTextIndents><sf:array sfa:ID="NSArray-47"><sf:number sfa:number="18" sfa:type="f"/><sf:number sfa:number="32.4" sfa:type="f"/><sf:number sfa:number="43.2" sfa:type="f"/><sf:number sfa:number="52.56" sfa:type="f"/><sf:number sfa:number="62.64" sfa:type="f"/><sf:number sfa:number="72" sfa:type="f"/><sf:number sfa:number="82.79999" sfa:type="f"/><sf:number sfa:number="92.16" sfa:type="f"/><sf:number sfa:number="102.96" sfa:type="f"/></sf:array></sf:listTextIndents><sf:listLabelGeometries><sf:array sfa:ID="NSArray-48"><sf:list-label-geometry sfa:ID="SFWPListLabelGeometry-99" sf:align="left" sf:scale="1" sf:offset="0" sf:scale-with-text="true"/><sf:list-label-geometry sfa:ID="SFWPListLabelGeometry-100" sf:align="left" sf:scale="1" sf:offset="0" sf:scale-with-text="true"/><sf:list-label-geometry sfa:ID="SFWPListLabelGeometry-101" sf:align="left" sf:scale="1" sf:offset="0" sf:scale-with-text="true"/><sf:list-label-geometry sfa:ID="SFWPListLabelGeometry-102" sf:align="left" sf:scale="1" sf:offset="0" sf:scale-with-text="true"/><sf:list-label-geometry sfa:ID="SFWPListLabelGeometry-103" sf:align="left" sf:scale="1" sf:offset="0" sf:scale-with-text="true"/><sf:list-label-geometry sfa:ID="SFWPListLabelGeometry-104" sf:align="left" sf:scale="1" sf:offset="0" sf:scale-with-text="true"/><sf:list-label-geometry sfa:ID="SFWPListLabelGeometry-105" sf:align="left" sf:scale="1" sf:offset="0" sf:scale-with-text="true"/><sf:list-label-geometry sfa:ID="SFWPListLabelGeometry-106" sf:align="left" sf:scale="1" sf:offset="0" sf:scale-with-text="true"/><sf:list-label-geometry sfa:ID="SFWPListLabelGeometry-107" sf:align="left" sf:scale="1" sf:offset="0" sf:scale-with-text="true"/></sf:array></sf:listLabelGeometries><sf:listLabelIndents><sf:array sfa:ID="NSArray-49"><sf:number sfa:number="0" sfa:type="f"/><sf:number sfa:number="18" sfa:type="f"/><sf:number sfa:number="36" sfa:type="f"/><sf:number sfa:number="54" sfa:type="f"/><sf:number sfa:number="72" sfa:type="f"/><sf:number sfa:number="90" sfa:type="f"/><sf:number sfa:number="108" sfa:type="f"/><sf:number sfa:number="126" sfa:type="f"/><sf:number sfa:number="144" sfa:type="f"/></sf:array></sf:listLabelIndents><sf:listLabelTypes><sf:array sfa:ID="NSArray-50"><sf:list-label-typeinfo sfa:ID="SFWPListLabelTypeInfo-99" sf:type="text"><sf:text-label sfa:ID="SFWPTextLabelFormat-65" sf:type="decimal" sf:format="%P%L." sf:first="1"/></sf:list-label-typeinfo><sf:list-label-typeinfo sfa:ID="SFWPListLabelTypeInfo-100" sf:type="text"><sf:text-label sfa:ID="SFWPTextLabelFormat-66" sf:type="decimal" sf:format="%P%L." sf:first="1"/></sf:list-label-typeinfo><sf:list-label-typeinfo sfa:ID="SFWPListLabelTypeInfo-101" sf:type="text"><sf:text-label sfa:ID="SFWPTextLabelFormat-67" sf:type="decimal" sf:format="%P%L." sf:first="1"/></sf:list-label-typeinfo><sf:list-label-typeinfo sfa:ID="SFWPListLabelTypeInfo-102" sf:type="text"><sf:text-label sfa:ID="SFWPTextLabelFormat-68" sf:type="decimal" sf:format="%P%L." sf:first="1"/></sf:list-label-typeinfo><sf:list-label-typeinfo sfa:ID="SFWPListLabelTypeInfo-103" sf:type="text"><sf:text-label sfa:ID="SFWPTextLabelFormat-69" sf:type="decimal" sf:format="%P%L." sf:first="1"/></sf:list-label-typeinfo><sf:list-label-typeinfo sfa:ID="SFWPListLabelTypeInfo-104" sf:type="text"><sf:text-label sfa:ID="SFWPTextLabelFormat-70" sf:type="decimal" sf:format="%P%L." sf:first="1"/></sf:list-label-typeinfo><sf:list-label-typeinfo sfa:ID="SFWPListLabelTypeInfo-105" sf:type="text"><sf:text-label sfa:ID="SFWPTextLabelFormat-71" sf:type="decimal" sf:format="%P%L." sf:first="1"/></sf:list-label-typeinfo><sf:list-label-typeinfo sfa:ID="SFWPListLabelTypeInfo-106" sf:type="text"><sf:text-label sfa:ID="SFWPTextLabelFormat-72" sf:type="decimal" sf:format="%P%L." sf:first="1"/></sf:list-label-typeinfo><sf:list-label-typeinfo sfa:ID="SFWPListLabelTypeInfo-107" sf:type="text"><sf:text-label sfa:ID="SFWPTextLabelFormat-73" sf:type="decimal" sf:format="%P%L." sf:first="1"/></sf:list-label-typeinfo></sf:array></sf:listLabelTypes></sf:property-map></sf:liststyle><sf:graphic-style sfa:ID="SFDGraphicStyle-19" sf:name="graphic-textbox-style-default" sf:ident="graphic-textbox-style-default"><sf:property-map><sf:opacity><sf:number sfa:number="1" sfa:type="f"/></sf:opacity><sf:reflection><sf:null/></sf:reflection><sf:externalTextWrap><sf:external-text-wrap sfa:ID="SFWPExternalTextWrap-10" sf:wrap-style="regular" sf:floating-wrap-enabled="true" sf:direction="both" sf:attachment-wrap-type="aligned" sf:floating-wrap-type="directional" sf:margin="12" sf:alpha-threshold="0.5"/></sf:externalTextWrap><sf:stroke><sf:stroke sfa:ID="SFRStroke-40" sf:miter-limit="4" sf:width="1" sf:cap="butt" sf:join="miter"><sf:color xsi:type="sfa:calibrated-white-color-type" sfa:w="0" sfa:a="1"/><sf:pattern sfa:ID="SFRStrokePattern-36" sf:phase="0" sf:type="empty"><sf:pattern/></sf:pattern></sf:stroke></sf:stroke><sf:layoutStyle><sf:null/></sf:layoutStyle><sf:fill><sf:null/></sf:fill><sf:shadow><sf:shadow-ref sfa:IDREF="SFRShadow-0"/></sf:shadow></sf:property-map></sf:graphic-style><sf:graphic-style sfa:ID="SFDGraphicStyle-20" sf:name="graphic-textbox-style-default 4" sf:ident="graphic-textbox-style-default-3" sf:parent-ident="graphic-textbox-style-default"><sf:property-map><sf:layoutStyle><sf:null/></sf:layoutStyle><sf:stroke><sf:stroke sfa:ID="SFRStroke-41" sf:miter-limit="4" sf:width="1" sf:cap="butt" sf:join="miter"><sf:color xsi:type="sfa:calibrated-white-color-type" sfa:w="0" sfa:a="1"/><sf:pattern sfa:ID="SFRStrokePattern-37" sf:phase="0" sf:type="empty"><sf:pattern/></sf:pattern></sf:stroke></sf:stroke><sf:fill><sf:null/></sf:fill></sf:property-map></sf:graphic-style><sf:graphic-style sfa:ID="SFDGraphicStyle-21" sf:name="graphic-textbox-style-default 3" sf:ident="graphic-textbox-style-default-2" sf:parent-ident="graphic-textbox-style-default"><sf:property-map><sf:layoutStyle><sf:null/></sf:layoutStyle><sf:stroke><sf:stroke sfa:ID="SFRStroke-42" sf:miter-limit="4" sf:width="1" sf:cap="butt" sf:join="miter"><sf:color xsi:type="sfa:calibrated-white-color-type" sfa:w="0" sfa:a="1"/><sf:pattern sfa:ID="SFRStrokePattern-38" sf:phase="0" sf:type="empty"><sf:pattern/></sf:pattern></sf:stroke></sf:stroke><sf:fill><sf:null/></sf:fill></sf:property-map></sf:graphic-style><sf:graphic-style sfa:ID="SFDGraphicStyle-22" sf:name="graphic-textbox-style-default 9" sf:ident="graphic-textbox-style-default-8" sf:parent-ident="graphic-textbox-style-default"><sf:property-map><sf:layoutStyle><sf:null/></sf:layoutStyle><sf:shadow><sf:shadow-ref sfa:IDREF="SFRShadow-0"/></sf:shadow></sf:property-map></sf:graphic-style><sf:graphic-style sfa:ID="SFDGraphicStyle-23" sf:name="graphic-textbox-style-default 6" sf:ident="graphic-textbox-style-default-5" sf:parent-ident="graphic-textbox-style-default"><sf:property-map><sf:layoutStyle><sf:null/></sf:layoutStyle><sf:stroke><sf:stroke sfa:ID="SFRStroke-43" sf:miter-limit="4" sf:width="1" sf:cap="butt" sf:join="miter"><sf:color xsi:type="sfa:calibrated-white-color-type" sfa:w="0" sfa:a="1"/><sf:pattern sfa:ID="SFRStrokePattern-39" sf:phase="0" sf:type="empty"><sf:pattern/></sf:pattern></sf:stroke></sf:stroke><sf:fill><sf:null/></sf:fill></sf:property-map></sf:graphic-style><sf:graphic-style sfa:ID="SFDGraphicStyle-24" sf:name="graphic-textbox-style-default 5" sf:ident="graphic-textbox-style-default-4" sf:parent-ident="graphic-textbox-style-default"><sf:property-map><sf:layoutStyle><sf:null/></sf:layoutStyle><sf:stroke><sf:stroke sfa:ID="SFRStroke-44" sf:miter-limit="4" sf:width="1" sf:cap="butt" sf:join="miter"><sf:color xsi:type="sfa:calibrated-white-color-type" sfa:w="0" sfa:a="1"/><sf:pattern sfa:ID="SFRStrokePattern-40" sf:phase="0" sf:type="empty"><sf:pattern/></sf:pattern></sf:stroke></sf:stroke><sf:fill><sf:null/></sf:fill></sf:property-map></sf:graphic-style><sf:graphic-style sfa:ID="SFDGraphicStyle-25" sf:name="graphic-textbox-style-default 8" sf:ident="graphic-textbox-style-default-7" sf:parent-ident="graphic-textbox-style-default"><sf:property-map><sf:layoutStyle><sf:null/></sf:layoutStyle><sf:shadow><sf:shadow-ref sfa:IDREF="SFRShadow-0"/></sf:shadow></sf:property-map></sf:graphic-style><sf:liststyle-ref sfa:IDREF="SFWPListStyle-2"/><sf:liststyle-ref sfa:IDREF="SFWPListStyle-6"/><sf:paragraphstyle sfa:ID="SFWPParagraphStyle-95" sf:ident="Series_2_SFCAreaSeriesValueParagraphStyleProperty" sf:parent-ident="chart-paragraph-style-default"><sf:property-map><sf:outline/><sf:italic/><sf:strikethruColor><sf:null/></sf:strikethruColor><sf:word_underline/><sf:decimalTab/><sf:word_strikethrough/><sf:keepLinesTogether/><sf:spaceAfter/><sf:alignment/><sf:fontSize><sf:number sfa:number="14" sfa:type="i"/></sf:fontSize><sf:widowControl/><sf:rightIndent/><sf:atsuFontFeatures/><sf:tabs/><sf:dropCap/><sf:underline/><sf:underlineWidth/><sf:defaultTabStops/><sf:tocStyle><sf:null/></sf:tocStyle><sf:firstTopicNumber/><sf:outlineLevel/><sf:fontName/><sf:strikethru/><sf:baselineShift/><sf:lineSpacing/><sf:textShadow/><sf:superscript/><sf:hyphenate/><sf:underlineColor><sf:null/></sf:underlineColor><sf:hidden/><sf:showInTOC/><sf:kerning/><sf:pageBreakBefore/><sf:strikethruWidth/><sf:fontColor><sf:color xsi:type="sfa:calibrated-white-color-type" sfa:w="1" sfa:a="1"/></sf:fontColor><sf:paragraphFill><sf:null/></sf:paragraphFill><sf:spaceBefore/><sf:keepWithNext/><sf:outlineColor><sf:null/></sf:outlineColor><sf:paragraphStroke><sf:null/></sf:paragraphStroke><sf:bold/><sf:tracking/><sf:ligatures/><sf:capitalization/><sf:language><sf:null/></sf:language><sf:followingParagraphStyle><sf:null/></sf:followingParagraphStyle><sf:leftIndent/><sf:firstLineIndent/></sf:property-map></sf:paragraphstyle><sf:graphic-style sfa:ID="SFDGraphicStyle-26" sf:name="graphic-line-style-default 2" sf:ident="graphic-line-style-default-1" sf:parent-ident="graphic-line-style-default"><sf:property-map><sf:shadow><sf:shadow-ref sfa:IDREF="SFRShadow-0"/></sf:shadow></sf:property-map></sf:graphic-style><sf:characterstyle sfa:ID="SFWPCharacterStyle-30" sf:name="phone" sf:ident="character-style-21"><sf:property-map><sf:underlineColor><sf:null/></sf:underlineColor><sf:fontColor/><sf:fontSize/><sf:textBackground><sf:null/></sf:textBackground><sf:atsuFontFeatures/><sf:superscript/><sf:underline/><sf:bold/><sf:fontName><sf:string sfa:string="CourierNewPSMT"/></sf:fontName><sf:ligatures/><sf:strikethru/><sf:baselineShift/><sf:tracking/><sf:capitalization/><sf:textShadow/><sf:language><sf:string sfa:string="en"/></sf:language><sf:italic/><sf:strikethruColor><sf:null/></sf:strikethruColor></sf:property-map></sf:characterstyle><sf:paragraphstyle sfa:ID="SFWPParagraphStyle-96" sf:name="glossary-title" sf:ident="paragraph-style-24"><sf:property-map><sf:fontSize><sf:number sfa:number="18" sfa:type="f"/></sf:fontSize><sf:word_strikethrough/><sf:spaceAfter/><sf:alignment/><sf:keepLinesTogether/><sf:listStyle><sf:liststyle-ref sfa:IDREF="SFWPListStyle-2"/></sf:listStyle><sf:outlineLevel/><sf:firstTopicNumber/><sf:underline/><sf:defaultTabStops><sf:number sfa:number="28.34646" sfa:type="f"/></sf:defaultTabStops><sf:tocStyle><sf:tocstyle-ref sfa:IDREF="SLTOCParagraphStyle-3"/></sf:tocStyle><sf:dropCap/><sf:underlineWidth/><sf:fontName><sf:string sfa:string="Helvetica-Bold"/></sf:fontName><sf:strikethru/><sf:baselineShift/><sf:lineSpacing/><sf:textShadow/><sf:underlineColor><sf:null/></sf:underlineColor><sf:showInTOC><sf:number sfa:number="1" sfa:type="c"/></sf:showInTOC><sf:kerning/><sf:strikethruWidth/><sf:fontColor/><sf:textBackground><sf:null/></sf:textBackground><sf:paragraphRuleWidth/><sf:paragraphStroke><sf:null/></sf:paragraphStroke><sf:bold><sf:number sfa:number="1" sfa:type="c"/></sf:bold><sf:tracking/><sf:ligatures/><sf:language><sf:null/></sf:language><sf:followingParagraphStyle><sf:paragraphstyle-ref sfa:IDREF="SFWPParagraphStyle-7"/></sf:followingParagraphStyle><sf:outline/><sf:strikethruColor><sf:null/></sf:strikethruColor><sf:italic/><sf:word_underline/><sf:widowControl/><sf:rightIndent/><sf:atsuFontFeatures/><sf:tabs/><sf:superscript/><sf:paragraphBorderType/><sf:hyphenate/><sf:hidden/><sf:pageBreakBefore/><sf:paragraphFill><sf:null/></sf:paragraphFill><sf:spaceBefore><sf:number sfa:number="12" sfa:type="f"/></sf:spaceBefore><sf:keepWithNext><sf:number sfa:number="1" sfa:type="c"/></sf:keepWithNext><sf:outlineColor><sf:null/></sf:outlineColor><sf:paragraphRuleOffset/><sf:capitalization/><sf:leftIndent/><sf:firstLineIndent/></sf:property-map></sf:paragraphstyle><sf:graphic-style sfa:ID="SFDGraphicStyle-27" sf:name="graphic-image-style-default 2" sf:ident="graphic-image-style-default-1" sf:parent-ident="graphic-image-style-default"><sf:property-map><sf:shadow><sf:shadow-ref sfa:IDREF="SFRShadow-0"/></sf:shadow></sf:property-map></sf:graphic-style><sf:liststyle sfa:ID="SFWPListStyle-14" sf:name="Numbered List" sf:ident="list-style-1"><sf:property-map><sf:listTextIndents><sf:array sfa:ID="NSArray-51"><sf:number sfa:number="18" sfa:type="f"/><sf:number sfa:number="18" sfa:type="f"/><sf:number sfa:number="18" sfa:type="f"/><sf:number sfa:number="18" sfa:type="f"/><sf:number sfa:number="18" sfa:type="f"/><sf:number sfa:number="18" sfa:type="f"/><sf:number sfa:number="18" sfa:type="f"/><sf:number sfa:number="18" sfa:type="f"/><sf:number sfa:number="18" sfa:type="f"/></sf:array></sf:listTextIndents><sf:listLabelGeometries><sf:array sfa:ID="NSArray-52"><sf:list-label-geometry sfa:ID="SFWPListLabelGeometry-108" sf:align="left" sf:scale="1" sf:offset="0" sf:scale-with-text="true"/><sf:list-label-geometry sfa:ID="SFWPListLabelGeometry-109" sf:align="left" sf:scale="1" sf:offset="0" sf:scale-with-text="true"/><sf:list-label-geometry sfa:ID="SFWPListLabelGeometry-110" sf:align="left" sf:scale="1" sf:offset="0" sf:scale-with-text="true"/><sf:list-label-geometry sfa:ID="SFWPListLabelGeometry-111" sf:align="left" sf:scale="1" sf:offset="0" sf:scale-with-text="true"/><sf:list-label-geometry sfa:ID="SFWPListLabelGeometry-112" sf:align="left" sf:scale="1" sf:offset="0" sf:scale-with-text="true"/><sf:list-label-geometry sfa:ID="SFWPListLabelGeometry-113" sf:align="left" sf:scale="1" sf:offset="0" sf:scale-with-text="true"/><sf:list-label-geometry sfa:ID="SFWPListLabelGeometry-114" sf:align="left" sf:scale="1" sf:offset="0" sf:scale-with-text="true"/><sf:list-label-geometry sfa:ID="SFWPListLabelGeometry-115" sf:align="left" sf:scale="1" sf:offset="0" sf:scale-with-text="true"/><sf:list-label-geometry sfa:ID="SFWPListLabelGeometry-116" sf:align="left" sf:scale="1" sf:offset="0" sf:scale-with-text="true"/></sf:array></sf:listLabelGeometries><sf:listLabelIndents><sf:array sfa:ID="NSArray-53"><sf:number sfa:number="0" sfa:type="f"/><sf:number sfa:number="18" sfa:type="f"/><sf:number sfa:number="36" sfa:type="f"/><sf:number sfa:number="54" sfa:type="f"/><sf:number sfa:number="72" sfa:type="f"/><sf:number sfa:number="90" sfa:type="f"/><sf:number sfa:number="108" sfa:type="f"/><sf:number sfa:number="126" sfa:type="f"/><sf:number sfa:number="144" sfa:type="f"/></sf:array></sf:listLabelIndents><sf:listLabelTypes><sf:array sfa:ID="NSArray-54"><sf:list-label-typeinfo sfa:ID="SFWPListLabelTypeInfo-108" sf:type="text"><sf:text-label sfa:ID="SFWPTextLabelFormat-74" sf:type="decimal" sf:format="%L." sf:first="1"/></sf:list-label-typeinfo><sf:list-label-typeinfo sfa:ID="SFWPListLabelTypeInfo-109" sf:type="text"><sf:text-label sfa:ID="SFWPTextLabelFormat-75" sf:type="decimal" sf:format="%L." sf:first="1"/></sf:list-label-typeinfo><sf:list-label-typeinfo sfa:ID="SFWPListLabelTypeInfo-110" sf:type="text"><sf:text-label sfa:ID="SFWPTextLabelFormat-76" sf:type="decimal" sf:format="%L." sf:first="1"/></sf:list-label-typeinfo><sf:list-label-typeinfo sfa:ID="SFWPListLabelTypeInfo-111" sf:type="text"><sf:text-label sfa:ID="SFWPTextLabelFormat-77" sf:type="decimal" sf:format="%L." sf:first="1"/></sf:list-label-typeinfo><sf:list-label-typeinfo sfa:ID="SFWPListLabelTypeInfo-112" sf:type="text"><sf:text-label sfa:ID="SFWPTextLabelFormat-78" sf:type="decimal" sf:format="%L." sf:first="1"/></sf:list-label-typeinfo><sf:list-label-typeinfo sfa:ID="SFWPListLabelTypeInfo-113" sf:type="text"><sf:text-label sfa:ID="SFWPTextLabelFormat-79" sf:type="decimal" sf:format="%L." sf:first="1"/></sf:list-label-typeinfo><sf:list-label-typeinfo sfa:ID="SFWPListLabelTypeInfo-114" sf:type="text"><sf:text-label sfa:ID="SFWPTextLabelFormat-80" sf:type="decimal" sf:format="%L." sf:first="1"/></sf:list-label-typeinfo><sf:list-label-typeinfo sfa:ID="SFWPListLabelTypeInfo-115" sf:type="text"><sf:text-label sfa:ID="SFWPTextLabelFormat-81" sf:type="decimal" sf:format="%L." sf:first="1"/></sf:list-label-typeinfo><sf:list-label-typeinfo sfa:ID="SFWPListLabelTypeInfo-116" sf:type="text"><sf:text-label sfa:ID="SFWPTextLabelFormat-82" sf:type="decimal" sf:format="%L." sf:first="1"/></sf:list-label-typeinfo></sf:array></sf:listLabelTypes></sf:property-map></sf:liststyle><sf:paragraphstyle-ref sfa:IDREF="SFWPParagraphStyle-46"/><sf:characterstyle sfa:ID="SFWPCharacterStyle-31" sf:name="orgname" sf:ident="character-style-26"><sf:property-map><sf:italic/><sf:fontColor/><sf:fontSize/><sf:atsuFontFeatures/><sf:superscript/><sf:underline/><sf:bold><sf:number sfa:number="1" sfa:type="i"/></sf:bold><sf:tracking/><sf:ligatures/><sf:fontName/><sf:strikethru/><sf:capitalization/><sf:textShadow/><sf:baselineShift/><sf:language><sf:string sfa:string="en"/></sf:language><sf:underlineColor><sf:null/></sf:underlineColor><sf:strikethruColor><sf:null/></sf:strikethruColor></sf:property-map></sf:characterstyle><sf:paragraphstyle sfa:ID="SFWPParagraphStyle-97" sf:name="sect4-subtitle" sf:ident="paragraph-style-49"><sf:property-map><sf:fontSize><sf:number sfa:number="14" sfa:type="f"/></sf:fontSize><sf:word_strikethrough/><sf:spaceAfter/><sf:alignment/><sf:keepLinesTogether/><sf:listStyle><sf:liststyle-ref sfa:IDREF="SFWPListStyle-2"/></sf:listStyle><sf:outlineLevel/><sf:firstTopicNumber/><sf:underline/><sf:defaultTabStops><sf:number sfa:number="28.34646" sfa:type="f"/></sf:defaultTabStops><sf:tocStyle><sf:tocstyle-ref sfa:IDREF="SLTOCParagraphStyle-3"/></sf:tocStyle><sf:dropCap/><sf:underlineWidth/><sf:fontName><sf:string sfa:string="Helvetica-Bold"/></sf:fontName><sf:strikethru/><sf:baselineShift/><sf:lineSpacing/><sf:textShadow/><sf:underlineColor><sf:null/></sf:underlineColor><sf:showInTOC><sf:number sfa:number="1" sfa:type="c"/></sf:showInTOC><sf:kerning/><sf:strikethruWidth/><sf:fontColor/><sf:textBackground><sf:null/></sf:textBackground><sf:paragraphRuleWidth/><sf:paragraphStroke><sf:null/></sf:paragraphStroke><sf:bold/><sf:tracking/><sf:ligatures/><sf:language><sf:null/></sf:language><sf:followingParagraphStyle><sf:paragraphstyle-ref sfa:IDREF="SFWPParagraphStyle-7"/></sf:followingParagraphStyle><sf:outline/><sf:strikethruColor><sf:null/></sf:strikethruColor><sf:italic/><sf:word_underline/><sf:widowControl/><sf:rightIndent/><sf:atsuFontFeatures/><sf:tabs/><sf:superscript/><sf:paragraphBorderType/><sf:hyphenate/><sf:hidden/><sf:pageBreakBefore/><sf:paragraphFill><sf:null/></sf:paragraphFill><sf:spaceBefore><sf:number sfa:number="12" sfa:type="f"/></sf:spaceBefore><sf:keepWithNext><sf:number sfa:number="1" sfa:type="c"/></sf:keepWithNext><sf:outlineColor><sf:null/></sf:outlineColor><sf:paragraphRuleOffset/><sf:capitalization/><sf:leftIndent/><sf:firstLineIndent/></sf:property-map></sf:paragraphstyle><sf:paragraphstyle sfa:ID="SFWPParagraphStyle-98" sf:name="part-title" sf:ident="paragraph-style-86"><sf:property-map><sf:fontSize><sf:number sfa:number="28" sfa:type="f"/></sf:fontSize><sf:word_strikethrough/><sf:spaceAfter/><sf:alignment/><sf:keepLinesTogether/><sf:listStyle><sf:liststyle-ref sfa:IDREF="SFWPListStyle-2"/></sf:listStyle><sf:outlineLevel/><sf:firstTopicNumber/><sf:underline/><sf:defaultTabStops><sf:number sfa:number="28.34646" sfa:type="f"/></sf:defaultTabStops><sf:tocStyle><sf:tocstyle-ref sfa:IDREF="SLTOCParagraphStyle-4"/></sf:tocStyle><sf:dropCap/><sf:underlineWidth/><sf:fontName><sf:string sfa:string="Helvetica-Bold"/></sf:fontName><sf:strikethru/><sf:baselineShift/><sf:lineSpacing/><sf:textShadow/><sf:underlineColor><sf:null/></sf:underlineColor><sf:showInTOC><sf:number sfa:number="1" sfa:type="c"/></sf:showInTOC><sf:kerning/><sf:strikethruWidth/><sf:fontColor/><sf:textBackground><sf:null/></sf:textBackground><sf:paragraphRuleWidth/><sf:paragraphStroke><sf:null/></sf:paragraphStroke><sf:bold><sf:number sfa:number="1" sfa:type="c"/></sf:bold><sf:tracking/><sf:ligatures/><sf:language><sf:null/></sf:language><sf:followingParagraphStyle><sf:paragraphstyle-ref sfa:IDREF="SFWPParagraphStyle-7"/></sf:followingParagraphStyle><sf:outline/><sf:strikethruColor><sf:null/></sf:strikethruColor><sf:italic/><sf:word_underline/><sf:widowControl/><sf:rightIndent/><sf:atsuFontFeatures/><sf:tabs/><sf:superscript/><sf:paragraphBorderType/><sf:hyphenate/><sf:hidden/><sf:pageBreakBefore/><sf:paragraphFill><sf:null/></sf:paragraphFill><sf:spaceBefore><sf:number sfa:number="24" sfa:type="f"/></sf:spaceBefore><sf:keepWithNext><sf:number sfa:number="1" sfa:type="c"/></sf:keepWithNext><sf:outlineColor><sf:null/></sf:outlineColor><sf:paragraphRuleOffset/><sf:capitalization/><sf:leftIndent/><sf:firstLineIndent/></sf:property-map></sf:paragraphstyle><sf:characterstyle sfa:ID="SFWPCharacterStyle-32" sf:name="othername" sf:ident="character-style-20"><sf:property-map><sf:underlineColor><sf:null/></sf:underlineColor><sf:fontColor/><sf:fontSize/><sf:textBackground><sf:null/></sf:textBackground><sf:atsuFontFeatures/><sf:superscript/><sf:underline/><sf:bold/><sf:fontName/><sf:ligatures/><sf:strikethru/><sf:baselineShift/><sf:tracking/><sf:capitalization/><sf:textShadow/><sf:language><sf:string sfa:string="en"/></sf:language><sf:italic><sf:number sfa:number="1" sfa:type="i"/></sf:italic><sf:strikethruColor><sf:null/></sf:strikethruColor></sf:property-map></sf:characterstyle><sf:graphic-style sfa:ID="SFDGraphicStyle-28" sf:name="graphic-shape-style-default 6" sf:ident="graphic-shape-style-default-5" sf:parent-ident="graphic-shape-style-default"><sf:property-map><sf:layoutStyle><sf:null/></sf:layoutStyle><sf:fill><sf:color xsi:type="sfa:calibrated-rgb-color-type" sfa:r="0.41568627953529358" sfa:g="0.66274511814117432" sfa:b="0.39215686917304993" sfa:a="1"/></sf:fill></sf:property-map></sf:graphic-style><sf:sectionstyle sfa:ID="SFWPSectionStyle-4" sf:name="Normal 2" sf:ident="section-style-0"><sf:property-map><sf:sectionLayoutStyle><sf:null/></sf:sectionLayoutStyle><sf:inheritPreviousHF><sf:number sfa:number="1" sfa:type="c"/></sf:inheritPreviousHF><sf:sectionPageNumberStart><sf:number sfa:number="1" sfa:type="i"/></sf:sectionPageNumberStart><sf:pageMasterFirstPageDifferent><sf:number sfa:number="0" sfa:type="c"/></sf:pageMasterFirstPageDifferent><sf:firstPageMaster><sf:pagemaster sfa:ID="SFWPPageMaster-9" sl:header="" sl:footer=""/></sf:firstPageMaster><sf:evenPageMaster><sf:pagemaster sfa:ID="SFWPPageMaster-10" sl:header="" sl:footer=""/></sf:evenPageMaster><sf:startKind><sf:number sfa:number="0" sfa:type="i"/></sf:startKind><sf:pageMasterLeftRightPagesDifferent><sf:number sfa:number="0" sfa:type="c"/></sf:pageMasterLeftRightPagesDifferent><sf:sectionPageNumberKind><sf:number sfa:number="0" sfa:type="i"/></sf:sectionPageNumberKind><sf:oddPageMaster><sf:pagemaster sfa:ID="SFWPPageMaster-11" sl:header="" sl:footer=""/></sf:oddPageMaster></sf:property-map></sf:sectionstyle><sf:paragraphstyle sfa:ID="SFWPParagraphStyle-99" sf:name="publisher-address" sf:ident="paragraph-style-21"><sf:property-map><sf:fontSize><sf:number sfa:number="11" sfa:type="f"/></sf:fontSize><sf:word_strikethrough/><sf:spaceAfter><sf:number sfa:number="12" sfa:type="f"/></sf:spaceAfter><sf:alignment/><sf:keepLinesTogether/><sf:listStyle><sf:liststyle-ref sfa:IDREF="SFWPListStyle-2"/></sf:listStyle><sf:outlineLevel/><sf:firstTopicNumber/><sf:underline/><sf:defaultTabStops><sf:number sfa:number="28.34646" sfa:type="f"/></sf:defaultTabStops><sf:underlineWidth/><sf:dropCap/><sf:fontName><sf:string sfa:string="Palatino-Roman"/></sf:fontName><sf:strikethru/><sf:baselineShift/><sf:lineSpacing/><sf:textShadow/><sf:underlineColor><sf:null/></sf:underlineColor><sf:kerning/><sf:strikethruWidth/><sf:fontColor/><sf:textBackground><sf:null/></sf:textBackground><sf:paragraphRuleWidth/><sf:paragraphStroke><sf:null/></sf:paragraphStroke><sf:bold/><sf:tracking/><sf:ligatures/><sf:language><sf:null/></sf:language><sf:followingParagraphStyle><sf:null/></sf:followingParagraphStyle><sf:outline/><sf:strikethruColor><sf:null/></sf:strikethruColor><sf:italic/><sf:word_underline/><sf:widowControl/><sf:rightIndent/><sf:atsuFontFeatures/><sf:tabs/><sf:superscript/><sf:paragraphBorderType/><sf:hyphenate/><sf:hidden/><sf:pageBreakBefore/><sf:paragraphFill><sf:null/></sf:paragraphFill><sf:spaceBefore/><sf:keepWithNext/><sf:outlineColor><sf:null/></sf:outlineColor><sf:paragraphRuleOffset/><sf:capitalization/><sf:leftIndent><sf:number sfa:number="28.35709" sfa:type="f"/></sf:leftIndent><sf:firstLineIndent><sf:number sfa:number="28.35709" sfa:type="f"/></sf:firstLineIndent></sf:property-map></sf:paragraphstyle><sf:paragraphstyle sfa:ID="SFWPParagraphStyle-100" sf:name="table-title" sf:ident="paragraph-style-52"><sf:property-map><sf:fontSize/><sf:word_strikethrough/><sf:spaceAfter><sf:number sfa:number="12" sfa:type="f"/></sf:spaceAfter><sf:alignment/><sf:keepLinesTogether/><sf:listStyle><sf:liststyle-ref sfa:IDREF="SFWPListStyle-2"/></sf:listStyle><sf:outlineLevel/><sf:firstTopicNumber/><sf:underline/><sf:defaultTabStops><sf:number sfa:number="28.34646" sfa:type="f"/></sf:defaultTabStops><sf:underlineWidth/><sf:dropCap/><sf:fontName/><sf:strikethru/><sf:baselineShift/><sf:lineSpacing/><sf:textShadow/><sf:underlineColor><sf:null/></sf:underlineColor><sf:kerning/><sf:strikethruWidth/><sf:fontColor/><sf:textBackground><sf:null/></sf:textBackground><sf:paragraphRuleWidth/><sf:paragraphStroke><sf:null/></sf:paragraphStroke><sf:bold><sf:number sfa:number="1" sfa:type="i"/></sf:bold><sf:tracking/><sf:ligatures/><sf:language><sf:null/></sf:language><sf:followingParagraphStyle><sf:null/></sf:followingParagraphStyle><sf:outline/><sf:strikethruColor><sf:null/></sf:strikethruColor><sf:italic/><sf:word_underline/><sf:widowControl/><sf:rightIndent/><sf:atsuFontFeatures/><sf:tabs/><sf:superscript/><sf:paragraphBorderType/><sf:hyphenate/><sf:hidden/><sf:pageBreakBefore/><sf:paragraphFill><sf:null/></sf:paragraphFill><sf:spaceBefore/><sf:keepWithNext/><sf:outlineColor><sf:null/></sf:outlineColor><sf:paragraphRuleOffset/><sf:capitalization/><sf:leftIndent/><sf:firstLineIndent/></sf:property-map></sf:paragraphstyle><sf:characterstyle sfa:ID="SFWPCharacterStyle-33" sf:name="city" sf:ident="character-style-5"><sf:property-map><sf:italic/><sf:fontColor/><sf:fontSize/><sf:atsuFontFeatures/><sf:superscript/><sf:underline/><sf:bold><sf:number sfa:number="1" sfa:type="i"/></sf:bold><sf:tracking/><sf:ligatures/><sf:fontName/><sf:strikethru/><sf:capitalization/><sf:textShadow/><sf:baselineShift/><sf:language><sf:string sfa:string="en"/></sf:language><sf:underlineColor><sf:null/></sf:underlineColor><sf:strikethruColor><sf:null/></sf:strikethruColor></sf:property-map></sf:characterstyle><sf:paragraphstyle sfa:ID="SFWPParagraphStyle-101" sf:name="releaseinfo" sf:ident="paragraph-style-41"><sf:property-map><sf:fontSize/><sf:word_strikethrough/><sf:spaceAfter><sf:number sfa:number="12" sfa:type="f"/></sf:spaceAfter><sf:alignment/><sf:keepLinesTogether/><sf:listStyle><sf:liststyle-ref sfa:IDREF="SFWPListStyle-2"/></sf:listStyle><sf:outlineLevel/><sf:firstTopicNumber/><sf:underline/><sf:defaultTabStops><sf:number sfa:number="28.34646" sfa:type="f"/></sf:defaultTabStops><sf:underlineWidth/><sf:dropCap/><sf:fontName/><sf:strikethru/><sf:baselineShift/><sf:lineSpacing/><sf:textShadow/><sf:underlineColor><sf:null/></sf:underlineColor><sf:kerning/><sf:strikethruWidth/><sf:fontColor/><sf:textBackground><sf:null/></sf:textBackground><sf:paragraphRuleWidth/><sf:paragraphStroke><sf:null/></sf:paragraphStroke><sf:bold/><sf:tracking/><sf:ligatures/><sf:language><sf:null/></sf:language><sf:followingParagraphStyle><sf:null/></sf:followingParagraphStyle><sf:outline/><sf:strikethruColor><sf:null/></sf:strikethruColor><sf:italic/><sf:word_underline/><sf:widowControl/><sf:rightIndent/><sf:atsuFontFeatures/><sf:tabs/><sf:superscript/><sf:paragraphBorderType/><sf:hyphenate/><sf:hidden/><sf:pageBreakBefore/><sf:paragraphFill><sf:color xsi:type="sfa:calibrated-rgb-color-type" sfa:r="1" sfa:g="0.5" sfa:b="0" sfa:a="0.25"/></sf:paragraphFill><sf:spaceBefore/><sf:keepWithNext/><sf:outlineColor><sf:null/></sf:outlineColor><sf:paragraphRuleOffset/><sf:capitalization/><sf:leftIndent/><sf:firstLineIndent/></sf:property-map></sf:paragraphstyle><sf:paragraphstyle sfa:ID="SFWPParagraphStyle-102" sf:name="simplesect-subtitle" sf:ident="paragraph-style-57"><sf:property-map><sf:fontSize><sf:number sfa:number="15" sfa:type="f"/></sf:fontSize><sf:word_strikethrough/><sf:spaceAfter/><sf:alignment/><sf:keepLinesTogether/><sf:listStyle><sf:liststyle-ref sfa:IDREF="SFWPListStyle-2"/></sf:listStyle><sf:outlineLevel/><sf:firstTopicNumber/><sf:underline/><sf:defaultTabStops><sf:number sfa:number="28.34646" sfa:type="f"/></sf:defaultTabStops><sf:tocStyle><sf:tocstyle-ref sfa:IDREF="SLTOCParagraphStyle-3"/></sf:tocStyle><sf:dropCap/><sf:underlineWidth/><sf:fontName><sf:string sfa:string="Helvetica-Bold"/></sf:fontName><sf:strikethru/><sf:baselineShift/><sf:lineSpacing/><sf:textShadow/><sf:underlineColor><sf:null/></sf:underlineColor><sf:showInTOC><sf:number sfa:number="1" sfa:type="c"/></sf:showInTOC><sf:kerning/><sf:strikethruWidth/><sf:fontColor/><sf:textBackground><sf:null/></sf:textBackground><sf:paragraphRuleWidth/><sf:paragraphStroke><sf:null/></sf:paragraphStroke><sf:bold><sf:number sfa:number="1" sfa:type="c"/></sf:bold><sf:tracking/><sf:ligatures/><sf:language><sf:null/></sf:language><sf:followingParagraphStyle><sf:paragraphstyle-ref sfa:IDREF="SFWPParagraphStyle-7"/></sf:followingParagraphStyle><sf:outline/><sf:strikethruColor><sf:null/></sf:strikethruColor><sf:italic/><sf:word_underline/><sf:widowControl/><sf:rightIndent/><sf:atsuFontFeatures/><sf:tabs/><sf:superscript/><sf:paragraphBorderType/><sf:hyphenate/><sf:hidden/><sf:pageBreakBefore/><sf:paragraphFill><sf:null/></sf:paragraphFill><sf:spaceBefore><sf:number sfa:number="12" sfa:type="f"/></sf:spaceBefore><sf:keepWithNext><sf:number sfa:number="1" sfa:type="c"/></sf:keepWithNext><sf:outlineColor><sf:null/></sf:outlineColor><sf:paragraphRuleOffset/><sf:capitalization/><sf:leftIndent/><sf:firstLineIndent/></sf:property-map></sf:paragraphstyle><sf:paragraphstyle sfa:ID="SFWPParagraphStyle-103" sf:name="blockquote" sf:ident="paragraph-style-11"><sf:property-map><sf:fontSize><sf:number sfa:number="11" sfa:type="f"/></sf:fontSize><sf:word_strikethrough/><sf:spaceAfter><sf:number sfa:number="12" sfa:type="f"/></sf:spaceAfter><sf:alignment/><sf:keepLinesTogether/><sf:listStyle><sf:liststyle-ref sfa:IDREF="SFWPListStyle-2"/></sf:listStyle><sf:outlineLevel/><sf:firstTopicNumber/><sf:underline/><sf:defaultTabStops><sf:number sfa:number="28.34646" sfa:type="f"/></sf:defaultTabStops><sf:underlineWidth/><sf:dropCap/><sf:fontName><sf:string sfa:string="Helvetica-Oblique"/></sf:fontName><sf:strikethru/><sf:baselineShift/><sf:lineSpacing/><sf:textShadow/><sf:underlineColor><sf:null/></sf:underlineColor><sf:kerning/><sf:strikethruWidth/><sf:fontColor/><sf:textBackground><sf:null/></sf:textBackground><sf:paragraphRuleWidth/><sf:paragraphStroke><sf:null/></sf:paragraphStroke><sf:bold/><sf:tracking/><sf:ligatures/><sf:language><sf:null/></sf:language><sf:followingParagraphStyle><sf:paragraphstyle-ref sfa:IDREF="SFWPParagraphStyle-7"/></sf:followingParagraphStyle><sf:outline/><sf:strikethruColor><sf:null/></sf:strikethruColor><sf:italic><sf:number sfa:number="1" sfa:type="c"/></sf:italic><sf:word_underline/><sf:widowControl/><sf:rightIndent/><sf:atsuFontFeatures/><sf:tabs/><sf:superscript/><sf:paragraphBorderType/><sf:hyphenate/><sf:hidden/><sf:pageBreakBefore/><sf:paragraphFill><sf:null/></sf:paragraphFill><sf:spaceBefore/><sf:keepWithNext/><sf:outlineColor><sf:null/></sf:outlineColor><sf:paragraphRuleOffset/><sf:capitalization/><sf:leftIndent/><sf:firstLineIndent/></sf:property-map></sf:paragraphstyle><sf:cell-style-ref sfa:IDREF="SFTCellStyle-2"/><sf:tocstyle-ref sfa:IDREF="SLTOCParagraphStyle-3"/><sf:paragraphstyle sfa:ID="SFWPParagraphStyle-104" sf:name="article-title" sf:ident="paragraph-style-38"><sf:property-map><sf:fontSize><sf:number sfa:number="28" sfa:type="f"/></sf:fontSize><sf:word_strikethrough/><sf:spaceAfter/><sf:alignment/><sf:keepLinesTogether/><sf:listStyle><sf:liststyle-ref sfa:IDREF="SFWPListStyle-2"/></sf:listStyle><sf:outlineLevel/><sf:firstTopicNumber/><sf:underline/><sf:defaultTabStops><sf:number sfa:number="28.34646" sfa:type="f"/></sf:defaultTabStops><sf:tocStyle><sf:tocstyle-ref sfa:IDREF="SLTOCParagraphStyle-4"/></sf:tocStyle><sf:dropCap/><sf:underlineWidth/><sf:fontName><sf:string sfa:string="Helvetica-Bold"/></sf:fontName><sf:strikethru/><sf:baselineShift/><sf:lineSpacing/><sf:textShadow/><sf:underlineColor><sf:null/></sf:underlineColor><sf:showInTOC><sf:number sfa:number="1" sfa:type="c"/></sf:showInTOC><sf:kerning/><sf:strikethruWidth/><sf:fontColor/><sf:textBackground><sf:null/></sf:textBackground><sf:paragraphRuleWidth/><sf:paragraphStroke><sf:null/></sf:paragraphStroke><sf:bold><sf:number sfa:number="1" sfa:type="c"/></sf:bold><sf:tracking/><sf:ligatures/><sf:language><sf:null/></sf:language><sf:followingParagraphStyle><sf:paragraphstyle-ref sfa:IDREF="SFWPParagraphStyle-7"/></sf:followingParagraphStyle><sf:outline/><sf:strikethruColor><sf:null/></sf:strikethruColor><sf:italic/><sf:word_underline/><sf:widowControl/><sf:rightIndent/><sf:atsuFontFeatures/><sf:tabs/><sf:superscript/><sf:paragraphBorderType/><sf:hyphenate/><sf:hidden/><sf:pageBreakBefore/><sf:paragraphFill><sf:null/></sf:paragraphFill><sf:spaceBefore><sf:number sfa:number="24" sfa:type="f"/></sf:spaceBefore><sf:keepWithNext><sf:number sfa:number="1" sfa:type="c"/></sf:keepWithNext><sf:outlineColor><sf:null/></sf:outlineColor><sf:paragraphRuleOffset/><sf:capitalization/><sf:leftIndent/><sf:firstLineIndent/></sf:property-map></sf:paragraphstyle><sf:paragraphstyle sfa:ID="SFWPParagraphStyle-105" sf:name="note-title" sf:ident="paragraph-style-34"><sf:property-map><sf:fontSize><sf:number sfa:number="14" sfa:type="f"/></sf:fontSize><sf:word_strikethrough/><sf:spaceAfter><sf:number sfa:number="12" sfa:type="f"/></sf:spaceAfter><sf:alignment/><sf:keepLinesTogether/><sf:listStyle><sf:liststyle-ref sfa:IDREF="SFWPListStyle-5"/></sf:listStyle><sf:outlineLevel/><sf:firstTopicNumber/><sf:underline/><sf:defaultTabStops><sf:number sfa:number="28.34646" sfa:type="f"/></sf:defaultTabStops><sf:underlineWidth/><sf:dropCap/><sf:fontName/><sf:strikethru/><sf:baselineShift/><sf:lineSpacing/><sf:textShadow/><sf:underlineColor><sf:null/></sf:underlineColor><sf:kerning/><sf:strikethruWidth/><sf:fontColor><sf:color xsi:type="sfa:calibrated-rgb-color-type" sfa:r="0" sfa:g="0" sfa:b="0" sfa:a="1"/></sf:fontColor><sf:textBackground><sf:null/></sf:textBackground><sf:paragraphRuleWidth/><sf:paragraphStroke><sf:null/></sf:paragraphStroke><sf:bold><sf:number sfa:number="1" sfa:type="i"/></sf:bold><sf:tracking/><sf:ligatures/><sf:language><sf:null/></sf:language><sf:followingParagraphStyle><sf:null/></sf:followingParagraphStyle><sf:outline/><sf:strikethruColor><sf:null/></sf:strikethruColor><sf:italic/><sf:word_underline/><sf:widowControl/><sf:rightIndent/><sf:atsuFontFeatures/><sf:tabs/><sf:superscript/><sf:paragraphBorderType/><sf:hyphenate/><sf:hidden/><sf:pageBreakBefore/><sf:paragraphFill><sf:null/></sf:paragraphFill><sf:spaceBefore/><sf:keepWithNext/><sf:outlineColor><sf:null/></sf:outlineColor><sf:paragraphRuleOffset/><sf:capitalization/><sf:leftIndent/><sf:firstLineIndent/></sf:property-map></sf:paragraphstyle><sf:tocstyle sfa:ID="SLTOCParagraphStyle-6" sfa:sfclass="paragraphstyle" sf:name="TOC Heading 4" sf:ident="toc-paragraph-style-4"><sf:property-map><sf:fontSize/><sf:word_strikethrough/><sf:spaceAfter/><sf:alignment/><sf:SLTOCPageNumberStyle><sf:null/></sf:SLTOCPageNumberStyle><sf:keepLinesTogether/><sf:listStyle><sf:null/></sf:listStyle><sf:outlineLevel/><sf:underline/><sf:underlineWidth/><sf:defaultTabStops><sf:number sfa:number="28.34646" sfa:type="f"/></sf:defaultTabStops><sf:dropCap/><sf:firstTopicNumber/><sf:fontName/><sf:strikethru/><sf:baselineShift/><sf:lineSpacing/><sf:textShadow/><sf:underlineColor><sf:null/></sf:underlineColor><sf:kerning/><sf:strikethruWidth/><sf:fontColor><sf:color xsi:type="sfa:calibrated-rgb-color-type" sfa:r="0" sfa:g="0" sfa:b="0" sfa:a="1"/></sf:fontColor><sf:textBackground><sf:null/></sf:textBackground><sf:paragraphRuleWidth/><sf:paragraphStroke><sf:null/></sf:paragraphStroke><sf:bold/><sf:tracking/><sf:ligatures/><sf:language><sf:null/></sf:language><sf:followingParagraphStyle><sf:null/></sf:followingParagraphStyle><sf:outline/><sf:strikethruColor><sf:null/></sf:strikethruColor><sf:italic/><sf:SLTOCEntryStyle><sf:null/></sf:SLTOCEntryStyle><sf:word_underline/><sf:widowControl/><sf:rightIndent/><sf:atsuFontFeatures/><sf:tabs><sf:tabs sfa:ID="SFWPTabs-7"><sf:tabstop sf:pos="481.61416625976562" sf:align="right"/></sf:tabs></sf:tabs><sf:superscript/><sf:paragraphBorderType/><sf:hyphenate/><sf:hidden/><sf:pageBreakBefore/><sf:SLTOCEnabledStyles><sf:null/></sf:SLTOCEnabledStyles><sf:SLTOCDisabledStyles><sf:null/></sf:SLTOCDisabledStyles><sf:paragraphFill><sf:null/></sf:paragraphFill><sf:SLTOCShowPageNumber/><sf:keepWithNext/><sf:spaceBefore><sf:number sfa:number="12" sfa:type="f"/></sf:spaceBefore><sf:outlineColor><sf:null/></sf:outlineColor><sf:paragraphRuleOffset/><sf:capitalization/><sf:leftIndent><sf:number sfa:number="42.51968" sfa:type="f"/></sf:leftIndent><sf:firstLineIndent><sf:number sfa:number="42.51968" sfa:type="f"/></sf:firstLineIndent></sf:property-map></sf:tocstyle><sf:characterstyle sfa:ID="SFWPCharacterStyle-34" sf:name="state" sf:ident="character-style-32"><sf:property-map><sf:underlineColor><sf:null/></sf:underlineColor><sf:fontColor/><sf:fontSize/><sf:textBackground><sf:null/></sf:textBackground><sf:atsuFontFeatures/><sf:superscript/><sf:underline/><sf:bold><sf:number sfa:number="1" sfa:type="i"/></sf:bold><sf:fontName/><sf:ligatures/><sf:strikethru/><sf:baselineShift/><sf:tracking/><sf:capitalization/><sf:textShadow/><sf:language><sf:string sfa:string="en"/></sf:language><sf:italic/><sf:strikethruColor><sf:null/></sf:strikethruColor></sf:property-map></sf:characterstyle><sf:graphic-style sfa:ID="SFDGraphicStyle-29" sf:name="graphic-shape-style-default 5" sf:ident="graphic-shape-style-default-4" sf:parent-ident="graphic-shape-style-default"><sf:property-map><sf:layoutStyle><sf:null/></sf:layoutStyle><sf:fill><sf:color xsi:type="sfa:calibrated-rgb-color-type" sfa:r="0.41568627953529358" sfa:g="0.66274511814117432" sfa:b="0.39215686917304993" sfa:a="1"/></sf:fill></sf:property-map></sf:graphic-style><sf:layoutstyle sfa:ID="SFWPLayoutStyle-11" sf:name="Normal" sf:ident="layout-style-default"><sf:property-map><sf:verticalAlignment/><sf:layoutParagraphStyle><sf:null/></sf:layoutParagraphStyle><sf:columns/><sf:padding/><sf:layoutMargins/><sf:followingLayoutStyle><sf:null/></sf:followingLayoutStyle><sf:layoutContinuous/></sf:property-map></sf:layoutstyle><sf:layoutstyle sfa:ID="SFWPLayoutStyle-12" sf:ident="graphic-textbox-layout-style-default" sf:parent-ident="layout-style-default"><sf:property-map><sf:verticalAlignment/><sf:layoutParagraphStyle><sf:paragraphstyle-ref sfa:IDREF="SFWPParagraphStyle-32"/></sf:layoutParagraphStyle><sf:columns/><sf:padding/><sf:layoutMargins/><sf:followingLayoutStyle><sf:null/></sf:followingLayoutStyle><sf:layoutContinuous/></sf:property-map></sf:layoutstyle><sf:layoutstyle-ref sfa:IDREF="SFWPLayoutStyle-6"/><sf:layoutstyle sfa:ID="SFWPLayoutStyle-13" sf:ident="graphic-shape-layout-style-default" sf:parent-ident="layout-style-default"><sf:property-map><sf:verticalAlignment/><sf:layoutParagraphStyle><sf:paragraphstyle-ref sfa:IDREF="SFWPParagraphStyle-32"/></sf:layoutParagraphStyle><sf:columns/><sf:padding><sf:padding sfa:ID="SFWPPadding-4" sf:top="8" sf:left="8" sf:bottom="8" sf:right="8"/></sf:padding><sf:layoutMargins/><sf:followingLayoutStyle><sf:null/></sf:followingLayoutStyle><sf:layoutContinuous/></sf:property-map></sf:layoutstyle><sf:characterstyle sfa:ID="SFWPCharacterStyle-35" sf:name="street" sf:ident="character-style-33"><sf:property-map><sf:underlineColor><sf:null/></sf:underlineColor><sf:fontColor/><sf:fontSize/><sf:textBackground><sf:null/></sf:textBackground><sf:atsuFontFeatures/><sf:superscript/><sf:underline/><sf:bold/><sf:fontName/><sf:ligatures/><sf:strikethru/><sf:baselineShift/><sf:tracking/><sf:capitalization/><sf:textShadow/><sf:language><sf:string sfa:string="en"/></sf:language><sf:italic><sf:number sfa:number="1" sfa:type="i"/></sf:italic><sf:strikethruColor><sf:null/></sf:strikethruColor></sf:property-map></sf:characterstyle><sf:paragraphstyle sfa:ID="SFWPParagraphStyle-106" sf:name="bridgehead" sf:ident="paragraph-style-110"><sf:property-map><sf:fontSize><sf:number sfa:number="16" sfa:type="f"/></sf:fontSize><sf:word_strikethrough/><sf:spaceAfter/><sf:alignment/><sf:keepLinesTogether/><sf:listStyle><sf:liststyle-ref sfa:IDREF="SFWPListStyle-2"/></sf:listStyle><sf:outlineLevel/><sf:firstTopicNumber/><sf:underline/><sf:defaultTabStops><sf:number sfa:number="28.34646" sfa:type="f"/></sf:defaultTabStops><sf:tocStyle><sf:tocstyle-ref sfa:IDREF="SLTOCParagraphStyle-3"/></sf:tocStyle><sf:dropCap/><sf:underlineWidth/><sf:fontName><sf:string sfa:string="Helvetica-Bold"/></sf:fontName><sf:strikethru/><sf:baselineShift/><sf:lineSpacing/><sf:textShadow/><sf:underlineColor><sf:null/></sf:underlineColor><sf:showInTOC><sf:number sfa:number="1" sfa:type="c"/></sf:showInTOC><sf:kerning/><sf:strikethruWidth/><sf:fontColor/><sf:textBackground><sf:null/></sf:textBackground><sf:paragraphRuleWidth/><sf:paragraphStroke><sf:null/></sf:paragraphStroke><sf:bold><sf:number sfa:number="1" sfa:type="c"/></sf:bold><sf:tracking/><sf:ligatures/><sf:language><sf:null/></sf:language><sf:followingParagraphStyle><sf:paragraphstyle-ref sfa:IDREF="SFWPParagraphStyle-7"/></sf:followingParagraphStyle><sf:outline/><sf:strikethruColor><sf:null/></sf:strikethruColor><sf:italic/><sf:word_underline/><sf:widowControl/><sf:rightIndent/><sf:atsuFontFeatures/><sf:tabs/><sf:superscript/><sf:paragraphBorderType/><sf:hyphenate/><sf:hidden/><sf:pageBreakBefore/><sf:paragraphFill><sf:null/></sf:paragraphFill><sf:spaceBefore><sf:number sfa:number="12" sfa:type="f"/></sf:spaceBefore><sf:keepWithNext><sf:number sfa:number="1" sfa:type="c"/></sf:keepWithNext><sf:outlineColor><sf:null/></sf:outlineColor><sf:paragraphRuleOffset/><sf:capitalization/><sf:leftIndent><sf:number sfa:number="28.35709" sfa:type="f"/></sf:leftIndent><sf:firstLineIndent><sf:number sfa:number="28.35709" sfa:type="f"/></sf:firstLineIndent></sf:property-map></sf:paragraphstyle><sf:paragraphstyle sfa:ID="SFWPParagraphStyle-107" sf:name="abstract" sf:ident="paragraph-style-87"><sf:property-map><sf:fontSize/><sf:word_strikethrough/><sf:spaceAfter><sf:number sfa:number="12" sfa:type="f"/></sf:spaceAfter><sf:alignment/><sf:keepLinesTogether/><sf:listStyle><sf:liststyle-ref sfa:IDREF="SFWPListStyle-2"/></sf:listStyle><sf:outlineLevel/><sf:firstTopicNumber/><sf:underline/><sf:defaultTabStops><sf:number sfa:number="28.34646" sfa:type="f"/></sf:defaultTabStops><sf:underlineWidth/><sf:dropCap/><sf:fontName/><sf:strikethru/><sf:baselineShift/><sf:lineSpacing/><sf:textShadow/><sf:underlineColor><sf:null/></sf:underlineColor><sf:kerning/><sf:strikethruWidth/><sf:fontColor/><sf:textBackground><sf:null/></sf:textBackground><sf:paragraphRuleWidth/><sf:paragraphStroke><sf:null/></sf:paragraphStroke><sf:bold/><sf:tracking/><sf:ligatures/><sf:language><sf:null/></sf:language><sf:followingParagraphStyle><sf:null/></sf:followingParagraphStyle><sf:outline/><sf:strikethruColor><sf:null/></sf:strikethruColor><sf:italic><sf:number sfa:number="1" sfa:type="i"/></sf:italic><sf:word_underline/><sf:widowControl/><sf:rightIndent/><sf:atsuFontFeatures/><sf:tabs/><sf:superscript/><sf:paragraphBorderType/><sf:hyphenate/><sf:hidden/><sf:pageBreakBefore/><sf:paragraphFill><sf:null/></sf:paragraphFill><sf:spaceBefore/><sf:keepWithNext/><sf:outlineColor><sf:null/></sf:outlineColor><sf:paragraphRuleOffset/><sf:capitalization/><sf:leftIndent/><sf:firstLineIndent/></sf:property-map></sf:paragraphstyle><sf:characterstyle sfa:ID="SFWPCharacterStyle-36" sf:name="emphasis-bold" sf:ident="character-style-15"><sf:property-map><sf:italic/><sf:fontColor/><sf:fontSize/><sf:atsuFontFeatures/><sf:superscript/><sf:underline/><sf:bold><sf:number sfa:number="1" sfa:type="i"/></sf:bold><sf:tracking/><sf:ligatures/><sf:fontName/><sf:baselineShift/><sf:strikethru/><sf:capitalization/><sf:textShadow/><sf:language><sf:string sfa:string="en"/></sf:language><sf:underlineColor><sf:null/></sf:underlineColor><sf:strikethruColor><sf:null/></sf:strikethruColor></sf:property-map></sf:characterstyle><sf:liststyle sfa:ID="SFWPListStyle-15" sf:name="Harvard" sf:ident="list-style-7"><sf:property-map><sf:listTextIndents><sf:array sfa:ID="NSArray-55"><sf:number sfa:number="23.4" sfa:type="f"/><sf:number sfa:number="18" sfa:type="f"/><sf:number sfa:number="18" sfa:type="f"/><sf:number sfa:number="18" sfa:type="f"/><sf:number sfa:number="23.4" sfa:type="f"/><sf:number sfa:number="23.4" sfa:type="f"/><sf:number sfa:number="17.99999" sfa:type="f"/><sf:number sfa:number="23.39999" sfa:type="f"/><sf:number sfa:number="23.39999" sfa:type="f"/></sf:array></sf:listTextIndents><sf:listLabelGeometries><sf:array sfa:ID="NSArray-56"><sf:list-label-geometry sfa:ID="SFWPListLabelGeometry-117" sf:align="left" sf:scale="1" sf:offset="0" sf:scale-with-text="true"/><sf:list-label-geometry sfa:ID="SFWPListLabelGeometry-118" sf:align="left" sf:scale="1" sf:offset="0" sf:scale-with-text="true"/><sf:list-label-geometry sfa:ID="SFWPListLabelGeometry-119" sf:align="left" sf:scale="1" sf:offset="0" sf:scale-with-text="true"/><sf:list-label-geometry sfa:ID="SFWPListLabelGeometry-120" sf:align="left" sf:scale="1" sf:offset="0" sf:scale-with-text="true"/><sf:list-label-geometry sfa:ID="SFWPListLabelGeometry-121" sf:align="left" sf:scale="1" sf:offset="0" sf:scale-with-text="true"/><sf:list-label-geometry sfa:ID="SFWPListLabelGeometry-122" sf:align="left" sf:scale="1" sf:offset="0" sf:scale-with-text="true"/><sf:list-label-geometry sfa:ID="SFWPListLabelGeometry-123" sf:align="left" sf:scale="1" sf:offset="0" sf:scale-with-text="true"/><sf:list-label-geometry sfa:ID="SFWPListLabelGeometry-124" sf:align="left" sf:scale="1" sf:offset="0" sf:scale-with-text="true"/><sf:list-label-geometry sfa:ID="SFWPListLabelGeometry-125" sf:align="left" sf:scale="1" sf:offset="0" sf:scale-with-text="true"/></sf:array></sf:listLabelGeometries><sf:listLabelIndents><sf:array sfa:ID="NSArray-57"><sf:number sfa:number="0" sfa:type="f"/><sf:number sfa:number="18" sfa:type="f"/><sf:number sfa:number="36" sfa:type="f"/><sf:number sfa:number="54" sfa:type="f"/><sf:number sfa:number="72" sfa:type="f"/><sf:number sfa:number="95.4" sfa:type="f"/><sf:number sfa:number="118.8" sfa:type="f"/><sf:number sfa:number="136.8" sfa:type="f"/><sf:number sfa:number="160.2" sfa:type="f"/></sf:array></sf:listLabelIndents><sf:listLabelTypes><sf:array sfa:ID="NSArray-58"><sf:list-label-typeinfo sfa:ID="SFWPListLabelTypeInfo-117" sf:type="text"><sf:text-label sfa:ID="SFWPTextLabelFormat-83" sf:type="upper-roman" sf:format="%L." sf:first="1"/></sf:list-label-typeinfo><sf:list-label-typeinfo sfa:ID="SFWPListLabelTypeInfo-118" sf:type="text"><sf:text-label sfa:ID="SFWPTextLabelFormat-84" sf:type="upper-alpha" sf:format="%L." sf:first="1"/></sf:list-label-typeinfo><sf:list-label-typeinfo sfa:ID="SFWPListLabelTypeInfo-119" sf:type="text"><sf:text-label sfa:ID="SFWPTextLabelFormat-85" sf:type="decimal" sf:format="%L." sf:first="1"/></sf:list-label-typeinfo><sf:list-label-typeinfo sfa:ID="SFWPListLabelTypeInfo-120" sf:type="text"><sf:text-label sfa:ID="SFWPTextLabelFormat-86" sf:type="lower-alpha" sf:format="%L)" sf:first="1"/></sf:list-label-typeinfo><sf:list-label-typeinfo sfa:ID="SFWPListLabelTypeInfo-121" sf:type="text"><sf:text-label sfa:ID="SFWPTextLabelFormat-87" sf:type="decimal" sf:format="(%L)" sf:first="1"/></sf:list-label-typeinfo><sf:list-label-typeinfo sfa:ID="SFWPListLabelTypeInfo-122" sf:type="text"><sf:text-label sfa:ID="SFWPTextLabelFormat-88" sf:type="lower-alpha" sf:format="(%L)" sf:first="1"/></sf:list-label-typeinfo><sf:list-label-typeinfo sfa:ID="SFWPListLabelTypeInfo-123" sf:type="text"><sf:text-label sfa:ID="SFWPTextLabelFormat-89" sf:type="lower-roman" sf:format="%L)" sf:first="1"/></sf:list-label-typeinfo><sf:list-label-typeinfo sfa:ID="SFWPListLabelTypeInfo-124" sf:type="text"><sf:text-label sfa:ID="SFWPTextLabelFormat-90" sf:type="decimal" sf:format="(%L)" sf:first="1"/></sf:list-label-typeinfo><sf:list-label-typeinfo sfa:ID="SFWPListLabelTypeInfo-125" sf:type="text"><sf:text-label sfa:ID="SFWPTextLabelFormat-91" sf:type="lower-alpha" sf:format="(%L)" sf:first="1"/></sf:list-label-typeinfo></sf:array></sf:listLabelTypes></sf:property-map></sf:liststyle><sf:graphic-style sfa:ID="SFDGraphicStyle-30" sf:name="graphic-shape-style-default 9" sf:ident="graphic-shape-style-default-8" sf:parent-ident="graphic-shape-style-default"><sf:property-map><sf:layoutStyle><sf:null/></sf:layoutStyle><sf:fill><sf:color xsi:type="sfa:calibrated-rgb-color-type" sfa:r="0.41568627953529358" sfa:g="0.66274511814117432" sfa:b="0.39215686917304993" sfa:a="1"/></sf:fill></sf:property-map></sf:graphic-style><sf:chart-series-style sfa:ID="SFCSeriesStyle-5" sf:name="Series_2" sf:ident="Series_2" sf:seriesIndex="2"><sf:property-map><sf:SFC2DPieFillProperty><sf:color xsi:type="sfa:calibrated-rgb-color-type" sfa:r="0.40784314274787903" sfa:g="0.63529413938522339" sfa:b="0.18431372940540314" sfa:a="1"/></sf:SFC2DPieFillProperty><sf:SFCBarValueLabelPositionProperty><sf:number sfa:number="0" sfa:type="i"/></sf:SFCBarValueLabelPositionProperty><sf:SFC3DColumnFillProperty><sf:color xsi:type="sfa:calibrated-rgb-color-type" sfa:r="0.40784314274787903" sfa:g="0.63529413938522339" sfa:b="0.18431372940540314" sfa:a="1"/></sf:SFC3DColumnFillProperty><sf:SFC2DAreaUseSeriesFillForDataPointFillProperty><sf:number sfa:number="1" sfa:type="c"/></sf:SFC2DAreaUseSeriesFillForDataPointFillProperty><sf:SFC2DLineUseSeriesFillForDataPointFillProperty><sf:number sfa:number="0" sfa:type="c"/></sf:SFC2DLineUseSeriesFillForDataPointFillProperty><sf:SFC3DAreaFillProperty><sf:color xsi:type="sfa:calibrated-rgb-color-type" sfa:r="0.40784314274787903" sfa:g="0.63529413938522339" sfa:b="0.18431372940540314" sfa:a="1"/></sf:SFC3DAreaFillProperty><sf:SFCAreaShowValueLabelProperty><sf:number sfa:number="0" sfa:type="c"/></sf:SFCAreaShowValueLabelProperty><sf:SFCLabelShadowProperty><sf:shadow-ref sfa:IDREF="SFRShadow-3"/></sf:SFCLabelShadowProperty><sf:SFC2DLineDataPointSymbolProperty><sf:number sfa:number="1" sfa:type="i"/></sf:SFC2DLineDataPointSymbolProperty><sf:SFC2DPieStrokeProperty><sf:stroke sfa:ID="SFRStroke-45" sf:miter-limit="4" sf:width="1" sf:cap="butt" sf:join="miter"><sf:color xsi:type="sfa:calibrated-white-color-type" sfa:w="1" sfa:a="1"/><sf:pattern sfa:ID="SFRStrokePattern-41" sf:phase="0" sf:type="empty"><sf:pattern/></sf:pattern></sf:stroke></sf:SFC2DPieStrokeProperty><sf:SFC2DScatterShadowProperty><sf:shadow-ref sfa:IDREF="SFRShadow-0"/></sf:SFC2DScatterShadowProperty><sf:SFC2DAreaFillProperty><sf:color xsi:type="sfa:calibrated-rgb-color-type" sfa:r="0.40784314274787903" sfa:g="0.63529413938522339" sfa:b="0.18431372940540314" sfa:a="1"/></sf:SFC2DAreaFillProperty><sf:SFC2DLineDataPointFillProperty><sf:color xsi:type="sfa:calibrated-white-color-type" sfa:w="1" sfa:a="1"/></sf:SFC2DLineDataPointFillProperty><sf:SFC3DPieFillProperty><sf:color xsi:type="sfa:calibrated-rgb-color-type" sfa:r="0.40784314274787903" sfa:g="0.63529413938522339" sfa:b="0.18431372940540314" sfa:a="1"/></sf:SFC3DPieFillProperty><sf:SFC2DLineStrokeProperty><sf:stroke sfa:ID="SFRStroke-46" sf:miter-limit="4" sf:width="4" sf:cap="butt" sf:join="miter"><sf:color xsi:type="sfa:calibrated-rgb-color-type" sfa:r="0.40784314274787903" sfa:g="0.63529413938522339" sfa:b="0.18431372940540314" sfa:a="1"/><sf:pattern sfa:ID="SFRStrokePattern-42" sf:phase="0" sf:type="solid"><sf:pattern/></sf:pattern></sf:stroke></sf:SFC2DLineStrokeProperty><sf:SFC2DScatterStrokeProperty><sf:stroke sfa:ID="SFRStroke-47" sf:miter-limit="4" sf:width="4" sf:cap="butt" sf:join="miter"><sf:color xsi:type="sfa:calibrated-rgb-color-type" sfa:r="0.40784314274787903" sfa:g="0.63529413938522339" sfa:b="0.18431372940540314" sfa:a="1"/><sf:pattern sfa:ID="SFRStrokePattern-43" sf:phase="0" sf:type="empty"><sf:pattern/></sf:pattern></sf:stroke></sf:SFC2DScatterStrokeProperty><sf:SFC3DSeriesShininessProperty><sf:number sfa:number="0.5" sfa:type="f"/></sf:SFC3DSeriesShininessProperty><sf:SFC2DAreaDataPointSymbolProperty><sf:number sfa:number="0" sfa:type="i"/></sf:SFC2DAreaDataPointSymbolProperty><sf:SFC2DAreaUseStrokeColorForDataPointFillProperty><sf:number sfa:number="0" sfa:type="c"/></sf:SFC2DAreaUseStrokeColorForDataPointFillProperty><sf:SFC3DSeriesEmissiveColorProperty><sf:color xsi:type="sfa:calibrated-rgb-color-type" sfa:r="0" sfa:g="0" sfa:b="0" sfa:a="1"/></sf:SFC3DSeriesEmissiveColorProperty><sf:SFC3DTextureTilingProperty><sf:number sfa:number="1" sfa:type="f"/></sf:SFC3DTextureTilingProperty><sf:SFC2DLineShadowProperty><sf:shadow-ref sfa:IDREF="SFRShadow-0"/></sf:SFC2DLineShadowProperty><sf:SFCPieSeriesValueParagraphStyleProperty><sf:paragraphstyle-ref sfa:IDREF="SFWPParagraphStyle-84"/></sf:SFCPieSeriesValueParagraphStyleProperty><sf:SFCStackedBarValueLabelPositionProperty><sf:number sfa:number="0" sfa:type="i"/></sf:SFCStackedBarValueLabelPositionProperty><sf:SFC2DColumnFillProperty><sf:color xsi:type="sfa:calibrated-rgb-color-type" sfa:r="0.40784314274787903" sfa:g="0.63529413938522339" sfa:b="0.18431372940540314" sfa:a="1"/></sf:SFC2DColumnFillProperty><sf:SFC3DBarFillProperty><sf:color xsi:type="sfa:calibrated-rgb-color-type" sfa:r="0.40784314274787903" sfa:g="0.63529413938522339" sfa:b="0.18431372940540314" sfa:a="1"/></sf:SFC3DBarFillProperty><sf:SFC2DBarStrokeProperty><sf:stroke sfa:ID="SFRStroke-48" sf:miter-limit="4" sf:width="1" sf:cap="butt" sf:join="miter"><sf:color xsi:type="sfa:calibrated-white-color-type" sfa:w="1" sfa:a="1"/><sf:pattern sfa:ID="SFRStrokePattern-44" sf:phase="0" sf:type="empty"><sf:pattern/></sf:pattern></sf:stroke></sf:SFC2DBarStrokeProperty><sf:SFCLabelOpacityProperty><sf:number sfa:number="1" sfa:type="f"/></sf:SFCLabelOpacityProperty><sf:SFC2DPieShadowProperty><sf:shadow-ref sfa:IDREF="SFRShadow-0"/></sf:SFC2DPieShadowProperty><sf:SFCPieShowValueLabelProperty><sf:number sfa:number="1" sfa:type="c"/></sf:SFCPieShowValueLabelProperty><sf:SFCPieShowSeriesNameLabelProperty><sf:number sfa:number="0" sfa:type="c"/></sf:SFCPieShowSeriesNameLabelProperty><sf:SFCLineSeriesValueParagraphStyleProperty><sf:paragraphstyle-ref sfa:IDREF="SFWPParagraphStyle-64"/></sf:SFCLineSeriesValueParagraphStyleProperty><sf:SFC2DOpacityProperty><sf:number sfa:number="1" sfa:type="f"/></sf:SFC2DOpacityProperty><sf:SFCLineValueLabelPositionProperty><sf:number sfa:number="4" sfa:type="i"/></sf:SFCLineValueLabelPositionProperty><sf:SFCPieValueLabelPositionProperty><sf:number sfa:number="13" sfa:type="i"/></sf:SFCPieValueLabelPositionProperty><sf:SFCLineShowValueLabelProperty><sf:number sfa:number="0" sfa:type="c"/></sf:SFCLineShowValueLabelProperty><sf:SFC2DAreaDataPointFillProperty><sf:color xsi:type="sfa:calibrated-white-color-type" sfa:w="1" sfa:a="1"/></sf:SFC2DAreaDataPointFillProperty><sf:SFCStackedAreaValueLabelPositionProperty><sf:number sfa:number="10" sfa:type="i"/></sf:SFCStackedAreaValueLabelPositionProperty><sf:SFC2DAreaShadowProperty><sf:shadow-ref sfa:IDREF="SFRShadow-0"/></sf:SFC2DAreaShadowProperty><sf:SFC3DSeriesSpecularColorProperty><sf:color xsi:type="sfa:calibrated-rgb-color-type" sfa:r="0.89999997615814209" sfa:g="0.89999997615814209" sfa:b="0.89999997615814209" sfa:a="1"/></sf:SFC3DSeriesSpecularColorProperty><sf:SFC2DScatterDataPointSymbolProperty><sf:number sfa:number="1" sfa:type="i"/></sf:SFC2DScatterDataPointSymbolProperty><sf:SFC2DBarShadowProperty><sf:shadow-ref sfa:IDREF="SFRShadow-0"/></sf:SFC2DBarShadowProperty><sf:SFCBarSeriesValueParagraphStyleProperty><sf:paragraphstyle-ref sfa:IDREF="SFWPParagraphStyle-66"/></sf:SFCBarSeriesValueParagraphStyleProperty><sf:SFC2DScatterDataPointFillProperty><sf:color xsi:type="sfa:calibrated-rgb-color-type" sfa:r="0.40784314274787903" sfa:g="0.63529413938522339" sfa:b="0.18431372940540314" sfa:a="1"/></sf:SFC2DScatterDataPointFillProperty><sf:SFC2DBarFillProperty><sf:color xsi:type="sfa:calibrated-rgb-color-type" sfa:r="0.40784314274787903" sfa:g="0.63529413938522339" sfa:b="0.18431372940540314" sfa:a="1"/></sf:SFC2DBarFillProperty><sf:SFCBarShowValueLabelProperty><sf:number sfa:number="0" sfa:type="c"/></sf:SFCBarShowValueLabelProperty><sf:SFC2DAreaStrokeProperty><sf:stroke sfa:ID="SFRStroke-49" sf:miter-limit="4" sf:width="2" sf:cap="butt" sf:join="miter"><sf:color xsi:type="sfa:calibrated-white-color-type" sfa:w="1" sfa:a="1"/><sf:pattern-ref sfa:IDREF="SFRStrokePattern-15"/></sf:stroke></sf:SFC2DAreaStrokeProperty><sf:SFCAreaValueLabelPositionProperty><sf:number sfa:number="10" sfa:type="i"/></sf:SFCAreaValueLabelPositionProperty><sf:SFC3DPieShadowProperty><sf:shadow-ref sfa:IDREF="SFRShadow-4"/></sf:SFC3DPieShadowProperty><sf:SFC3DTextureProperty><sf:string sfa:string=""/></sf:SFC3DTextureProperty><sf:SFCAreaSeriesValueParagraphStyleProperty><sf:paragraphstyle-ref sfa:IDREF="SFWPParagraphStyle-95"/></sf:SFCAreaSeriesValueParagraphStyleProperty><sf:SFC2DLineUseStrokeColorForDataPointFillProperty><sf:number sfa:number="0" sfa:type="c"/></sf:SFC2DLineUseStrokeColorForDataPointFillProperty><sf:SFC3DLineFillProperty><sf:color xsi:type="sfa:calibrated-rgb-color-type" sfa:r="0.40784314274787903" sfa:g="0.63529413938522339" sfa:b="0.18431372940540314" sfa:a="1"/></sf:SFC3DLineFillProperty><sf:SFCPieWedgeExplosionProperty><sf:number sfa:number="0" sfa:type="f"/></sf:SFCPieWedgeExplosionProperty></sf:property-map></sf:chart-series-style><sf:liststyle-ref sfa:IDREF="SFWPListStyle-4"/><sf:paragraphstyle sfa:ID="SFWPParagraphStyle-108" sf:name="variablelist-title" sf:ident="paragraph-style-63"><sf:property-map><sf:fontSize><sf:number sfa:number="14" sfa:type="f"/></sf:fontSize><sf:word_strikethrough/><sf:spaceAfter><sf:number sfa:number="12" sfa:type="f"/></sf:spaceAfter><sf:alignment/><sf:keepLinesTogether/><sf:listStyle><sf:liststyle-ref sfa:IDREF="SFWPListStyle-2"/></sf:listStyle><sf:outlineLevel/><sf:firstTopicNumber/><sf:underline/><sf:defaultTabStops><sf:number sfa:number="28.34646" sfa:type="f"/></sf:defaultTabStops><sf:underlineWidth/><sf:dropCap/><sf:fontName/><sf:strikethru/><sf:baselineShift/><sf:lineSpacing/><sf:textShadow/><sf:underlineColor><sf:null/></sf:underlineColor><sf:kerning/><sf:strikethruWidth/><sf:fontColor/><sf:textBackground><sf:null/></sf:textBackground><sf:paragraphRuleWidth/><sf:paragraphStroke><sf:null/></sf:paragraphStroke><sf:bold><sf:number sfa:number="1" sfa:type="i"/></sf:bold><sf:tracking/><sf:ligatures/><sf:language><sf:null/></sf:language><sf:followingParagraphStyle><sf:null/></sf:followingParagraphStyle><sf:outline/><sf:strikethruColor><sf:null/></sf:strikethruColor><sf:italic/><sf:word_underline/><sf:widowControl/><sf:rightIndent/><sf:atsuFontFeatures/><sf:tabs/><sf:superscript/><sf:paragraphBorderType/><sf:hyphenate/><sf:hidden/><sf:pageBreakBefore/><sf:paragraphFill><sf:null/></sf:paragraphFill><sf:spaceBefore/><sf:keepWithNext/><sf:outlineColor><sf:null/></sf:outlineColor><sf:paragraphRuleOffset/><sf:capitalization/><sf:leftIndent/><sf:firstLineIndent><sf:number sfa:number="14.18209" sfa:type="f"/></sf:firstLineIndent></sf:property-map></sf:paragraphstyle><sf:paragraphstyle sfa:ID="SFWPParagraphStyle-109" sf:name="blockquote-attribution" sf:ident="paragraph-style-12"><sf:property-map><sf:fontSize><sf:number sfa:number="10" sfa:type="f"/></sf:fontSize><sf:word_strikethrough/><sf:spaceAfter><sf:number sfa:number="12" sfa:type="f"/></sf:spaceAfter><sf:alignment/><sf:keepLinesTogether/><sf:listStyle><sf:liststyle-ref sfa:IDREF="SFWPListStyle-2"/></sf:listStyle><sf:outlineLevel/><sf:firstTopicNumber/><sf:underline><sf:number sfa:number="1" sfa:type="i"/></sf:underline><sf:defaultTabStops><sf:number sfa:number="28.34646" sfa:type="f"/></sf:defaultTabStops><sf:underlineWidth/><sf:dropCap/><sf:fontName/><sf:strikethru/><sf:baselineShift/><sf:lineSpacing/><sf:textShadow/><sf:underlineColor><sf:null/></sf:underlineColor><sf:kerning/><sf:strikethruWidth/><sf:fontColor/><sf:textBackground><sf:null/></sf:textBackground><sf:paragraphRuleWidth/><sf:paragraphStroke><sf:null/></sf:paragraphStroke><sf:bold/><sf:tracking/><sf:ligatures/><sf:language><sf:null/></sf:language><sf:followingParagraphStyle><sf:null/></sf:followingParagraphStyle><sf:outline/><sf:strikethruColor><sf:null/></sf:strikethruColor><sf:italic/><sf:word_underline/><sf:widowControl/><sf:rightIndent/><sf:atsuFontFeatures/><sf:tabs/><sf:superscript/><sf:paragraphBorderType/><sf:hyphenate/><sf:hidden/><sf:pageBreakBefore/><sf:paragraphFill><sf:null/></sf:paragraphFill><sf:spaceBefore/><sf:keepWithNext/><sf:outlineColor><sf:null/></sf:outlineColor><sf:paragraphRuleOffset/><sf:capitalization/><sf:leftIndent><sf:number sfa:number="28.35709" sfa:type="f"/></sf:leftIndent><sf:firstLineIndent><sf:number sfa:number="28.35709" sfa:type="f"/></sf:firstLineIndent></sf:property-map></sf:paragraphstyle><sf:paragraphstyle sfa:ID="SFWPParagraphStyle-110" sf:name="sect2-title" sf:ident="paragraph-style-44"><sf:property-map><sf:fontSize><sf:number sfa:number="16" sfa:type="f"/></sf:fontSize><sf:word_strikethrough/><sf:spaceAfter/><sf:alignment/><sf:keepLinesTogether/><sf:listStyle><sf:liststyle-ref sfa:IDREF="SFWPListStyle-2"/></sf:listStyle><sf:outlineLevel/><sf:firstTopicNumber/><sf:underline/><sf:defaultTabStops><sf:number sfa:number="28.34646" sfa:type="f"/></sf:defaultTabStops><sf:tocStyle><sf:tocstyle-ref sfa:IDREF="SLTOCParagraphStyle-3"/></sf:tocStyle><sf:dropCap/><sf:underlineWidth/><sf:fontName><sf:string sfa:string="Helvetica-Bold"/></sf:fontName><sf:strikethru/><sf:baselineShift/><sf:lineSpacing/><sf:textShadow/><sf:underlineColor><sf:null/></sf:underlineColor><sf:showInTOC><sf:number sfa:number="1" sfa:type="c"/></sf:showInTOC><sf:kerning/><sf:strikethruWidth/><sf:fontColor/><sf:textBackground><sf:null/></sf:textBackground><sf:paragraphRuleWidth/><sf:paragraphStroke><sf:null/></sf:paragraphStroke><sf:bold><sf:number sfa:number="1" sfa:type="c"/></sf:bold><sf:tracking/><sf:ligatures/><sf:language><sf:null/></sf:language><sf:followingParagraphStyle><sf:paragraphstyle-ref sfa:IDREF="SFWPParagraphStyle-7"/></sf:followingParagraphStyle><sf:outline/><sf:strikethruColor><sf:null/></sf:strikethruColor><sf:italic/><sf:word_underline/><sf:widowControl/><sf:rightIndent/><sf:atsuFontFeatures/><sf:tabs/><sf:superscript/><sf:paragraphBorderType/><sf:hyphenate/><sf:hidden/><sf:pageBreakBefore/><sf:paragraphFill><sf:null/></sf:paragraphFill><sf:spaceBefore><sf:number sfa:number="12" sfa:type="f"/></sf:spaceBefore><sf:keepWithNext><sf:number sfa:number="1" sfa:type="c"/></sf:keepWithNext><sf:outlineColor><sf:null/></sf:outlineColor><sf:paragraphRuleOffset/><sf:capitalization/><sf:leftIndent/><sf:firstLineIndent/></sf:property-map></sf:paragraphstyle><sf:paragraphstyle sfa:ID="SFWPParagraphStyle-111" sf:name="chapter-title" sf:ident="paragraph-style-35"><sf:property-map><sf:fontSize><sf:number sfa:number="18" sfa:type="f"/></sf:fontSize><sf:word_strikethrough/><sf:spaceAfter/><sf:alignment/><sf:keepLinesTogether/><sf:listStyle><sf:liststyle-ref sfa:IDREF="SFWPListStyle-2"/></sf:listStyle><sf:outlineLevel/><sf:firstTopicNumber/><sf:underline/><sf:defaultTabStops><sf:number sfa:number="28.34646" sfa:type="f"/></sf:defaultTabStops><sf:tocStyle><sf:tocstyle-ref sfa:IDREF="SLTOCParagraphStyle-3"/></sf:tocStyle><sf:dropCap/><sf:underlineWidth/><sf:fontName><sf:string sfa:string="Helvetica-Bold"/></sf:fontName><sf:strikethru/><sf:baselineShift/><sf:lineSpacing/><sf:textShadow/><sf:underlineColor><sf:null/></sf:underlineColor><sf:showInTOC><sf:number sfa:number="1" sfa:type="c"/></sf:showInTOC><sf:kerning/><sf:strikethruWidth/><sf:fontColor/><sf:textBackground><sf:null/></sf:textBackground><sf:paragraphRuleWidth/><sf:paragraphStroke><sf:null/></sf:paragraphStroke><sf:bold><sf:number sfa:number="1" sfa:type="c"/></sf:bold><sf:tracking/><sf:ligatures/><sf:language><sf:null/></sf:language><sf:followingParagraphStyle><sf:paragraphstyle-ref sfa:IDREF="SFWPParagraphStyle-7"/></sf:followingParagraphStyle><sf:outline/><sf:strikethruColor><sf:null/></sf:strikethruColor><sf:italic/><sf:word_underline/><sf:widowControl/><sf:rightIndent/><sf:atsuFontFeatures/><sf:tabs/><sf:superscript/><sf:paragraphBorderType/><sf:hyphenate/><sf:hidden/><sf:pageBreakBefore/><sf:paragraphFill><sf:null/></sf:paragraphFill><sf:spaceBefore><sf:number sfa:number="12" sfa:type="f"/></sf:spaceBefore><sf:keepWithNext><sf:number sfa:number="1" sfa:type="c"/></sf:keepWithNext><sf:outlineColor><sf:null/></sf:outlineColor><sf:paragraphRuleOffset/><sf:capitalization/><sf:leftIndent/><sf:firstLineIndent/></sf:property-map></sf:paragraphstyle><sf:paragraphstyle-ref sfa:IDREF="SFWPParagraphStyle-22"/><sf:sectionstyle sfa:ID="SFWPSectionStyle-5" sf:name="[Null]" sf:ident="section-style-null"><sf:property-map/></sf:sectionstyle><sf:paragraphstyle sfa:ID="SFWPParagraphStyle-112" sf:name="appendix-title" sf:ident="paragraph-style-4"><sf:property-map><sf:fontSize><sf:number sfa:number="18" sfa:type="f"/></sf:fontSize><sf:word_strikethrough/><sf:spaceAfter/><sf:alignment/><sf:keepLinesTogether/><sf:listStyle><sf:liststyle-ref sfa:IDREF="SFWPListStyle-2"/></sf:listStyle><sf:outlineLevel/><sf:firstTopicNumber/><sf:underline/><sf:defaultTabStops><sf:number sfa:number="28.34646" sfa:type="f"/></sf:defaultTabStops><sf:tocStyle><sf:tocstyle-ref sfa:IDREF="SLTOCParagraphStyle-3"/></sf:tocStyle><sf:dropCap/><sf:underlineWidth/><sf:fontName><sf:string sfa:string="Helvetica-Bold"/></sf:fontName><sf:strikethru/><sf:baselineShift/><sf:lineSpacing/><sf:textShadow/><sf:underlineColor><sf:null/></sf:underlineColor><sf:showInTOC><sf:number sfa:number="1" sfa:type="c"/></sf:showInTOC><sf:kerning/><sf:strikethruWidth/><sf:fontColor/><sf:textBackground><sf:null/></sf:textBackground><sf:paragraphRuleWidth/><sf:paragraphStroke><sf:null/></sf:paragraphStroke><sf:bold><sf:number sfa:number="1" sfa:type="c"/></sf:bold><sf:tracking/><sf:ligatures/><sf:language><sf:null/></sf:language><sf:followingParagraphStyle><sf:paragraphstyle-ref sfa:IDREF="SFWPParagraphStyle-7"/></sf:followingParagraphStyle><sf:outline/><sf:strikethruColor><sf:null/></sf:strikethruColor><sf:italic/><sf:word_underline/><sf:widowControl/><sf:rightIndent/><sf:atsuFontFeatures/><sf:tabs/><sf:superscript/><sf:paragraphBorderType/><sf:hyphenate/><sf:hidden/><sf:pageBreakBefore/><sf:paragraphFill><sf:null/></sf:paragraphFill><sf:spaceBefore><sf:number sfa:number="12" sfa:type="f"/></sf:spaceBefore><sf:keepWithNext><sf:number sfa:number="1" sfa:type="c"/></sf:keepWithNext><sf:outlineColor><sf:null/></sf:outlineColor><sf:paragraphRuleOffset/><sf:capitalization/><sf:leftIndent/><sf:firstLineIndent/></sf:property-map></sf:paragraphstyle><sf:chart-style sfa:ID="SFCChartStyle-0" sf:ident="chart-style-default"><sf:property-map><sf:SFCValueNumberFormatSeparatorProperty><sf:number sfa:number="1" sfa:type="c"/></sf:SFCValueNumberFormatSeparatorProperty><sf:SFCValueAxisPercentageProperty><sf:number sfa:number="0" sfa:type="c"/></sf:SFCValueAxisPercentageProperty><sf:SFC3DShowReflectionsProperty><sf:number sfa:number="0" sfa:type="c"/></sf:SFC3DShowReflectionsProperty><sf:SFC2DTopBorderOpacityProperty><sf:number sfa:number="1" sfa:type="f"/></sf:SFC2DTopBorderOpacityProperty><sf:SFCCategoryAxisLabelsDepthProperty><sf:number sfa:number="1" sfa:type="f"/></sf:SFCCategoryAxisLabelsDepthProperty><sf:SFCNumberOfDefinedSeriesStylesProperty><sf:number sfa:number="6" sfa:type="i"/></sf:SFCNumberOfDefinedSeriesStylesProperty><sf:Series_1><sf:chart-series-style-ref sfa:IDREF="SFCSeriesStyle-4"/></sf:Series_1><sf:SFC2DValueDirectionGridLineStrokeProperty><sf:stroke sfa:ID="SFRStroke-50" sf:miter-limit="4" sf:width="1" sf:cap="butt" sf:join="miter"><sf:color xsi:type="sfa:calibrated-white-color-type" sfa:w="0.66666668653488159" sfa:a="1"/><sf:pattern sfa:ID="SFRStrokePattern-45" sf:phase="0" sf:type="solid"><sf:pattern/></sf:pattern></sf:stroke></sf:SFC2DValueDirectionGridLineStrokeProperty><sf:SFC3DSceneTextureTilingProperty><sf:number sfa:number="1" sfa:type="f"/></sf:SFC3DSceneTextureTilingProperty><sf:SFC3DLightingPackageProperty><sf:string sfa:string="Default"/></sf:SFC3DLightingPackageProperty><sf:SFC3DWallEmissiveColorProperty><sf:color xsi:type="sfa:calibrated-rgb-color-type" sfa:r="0" sfa:g="0" sfa:b="0" sfa:a="1"/></sf:SFC3DWallEmissiveColorProperty><sf:SFCAxisLabelsOrientationProperty><sf:number sfa:number="0" sfa:type="i"/></sf:SFCAxisLabelsOrientationProperty><sf:SFCPieSeriesStartAngleProperty><sf:number sfa:number="0" sfa:type="f"/></sf:SFCPieSeriesStartAngleProperty><sf:SFC3DFloorEmissiveColorProperty><sf:color xsi:type="sfa:calibrated-rgb-color-type" sfa:r="0" sfa:g="0" sfa:b="0" sfa:a="1"/></sf:SFC3DFloorEmissiveColorProperty><sf:SFC3DSceneShowTextureProperty><sf:number sfa:number="0" sfa:type="c"/></sf:SFC3DSceneShowTextureProperty><sf:SFCInitialNumberOfSeriesProperty><sf:number sfa:number="3" sfa:type="i"/></sf:SFCInitialNumberOfSeriesProperty><sf:SFCValueNumberFormatDecimalPlacesProperty><sf:number sfa:number="0" sfa:type="i"/></sf:SFCValueNumberFormatDecimalPlacesProperty><sf:SFC2DBottomBorderShadowProperty><sf:shadow-ref sfa:IDREF="SFRShadow-0"/></sf:SFC2DBottomBorderShadowProperty><sf:SFC3DLineChartScaleProperty><sf:vector3d sfa:ID="SFC3DVector-0" sf:x="1.3999999761581421" sf:y="1.3451770544052124" sf:z="1"/></sf:SFC3DLineChartScaleProperty><sf:SFCCategoryAxisShowMinorTickMarksProperty><sf:number sfa:number="0" sfa:type="c"/></sf:SFCCategoryAxisShowMinorTickMarksProperty><sf:SFC2DChartBackgroundFillProperty><sf:null/></sf:SFC2DChartBackgroundFillProperty><sf:SFC3DLabelThicknessProperty><sf:number sfa:number="0.125" sfa:type="f"/></sf:SFC3DLabelThicknessProperty><sf:SFC2DChartBackgroundOpacityProperty><sf:number sfa:number="1" sfa:type="f"/></sf:SFC2DChartBackgroundOpacityProperty><sf:SFCCategoryAxisMinorTickStrokeProperty><sf:stroke sfa:ID="SFRStroke-51" sf:miter-limit="4" sf:width="1" sf:cap="butt" sf:join="miter"><sf:color xsi:type="sfa:calibrated-rgb-color-type" sfa:r="0" sfa:g="0" sfa:b="0" sfa:a="1"/><sf:pattern sfa:ID="SFRStrokePattern-46" sf:phase="0" sf:type="solid"><sf:pattern/></sf:pattern></sf:stroke></sf:SFCCategoryAxisMinorTickStrokeProperty><sf:SFCCategoryAxisParagraphStyleProperty><sf:paragraphstyle-ref sfa:IDREF="SFWPParagraphStyle-83"/></sf:SFCCategoryAxisParagraphStyleProperty><sf:shadow><sf:shadow sfa:ID="SFRShadow-5" sf:angle="45" sf:offset="2" sf:radius="4" sf:opacity="0.5"><sf:color xsi:type="sfa:calibrated-white-color-type" sfa:w="0" sfa:a="1"/></sf:shadow></sf:shadow><sf:SFC3DBarLightingPackageProperty><sf:string sfa:string="Default"/></sf:SFC3DBarLightingPackageProperty><sf:SFCShowCategoryAxisLabelsProperty><sf:number sfa:number="1" sfa:type="c"/></sf:SFCShowCategoryAxisLabelsProperty><sf:SFC3DInterSetDepthGapProperty><sf:number sfa:number="1" sfa:type="f"/></sf:SFC3DInterSetDepthGapProperty><sf:SFC2DAntialiasingModeProperty><sf:number sfa:number="1" sfa:type="c"/></sf:SFC2DAntialiasingModeProperty><sf:SFC2DBottomBorderOpacityProperty><sf:number sfa:number="1" sfa:type="f"/></sf:SFC2DBottomBorderOpacityProperty><sf:SFC2DShowRightTicksProperty><sf:number sfa:number="0" sfa:type="c"/></sf:SFC2DShowRightTicksProperty><sf:SFC3DShadowCameraYProperty><sf:number sfa:number="0.151952" sfa:type="f"/></sf:SFC3DShadowCameraYProperty><sf:SFC2DShowValueDirectionGridLinesProperty><sf:number sfa:number="1" sfa:type="c"/></sf:SFC2DShowValueDirectionGridLinesProperty><sf:SFCValueAxisMinimumValueProperty><sf:null/></sf:SFCValueAxisMinimumValueProperty><sf:SFCLegendStrokeProperty><sf:stroke sfa:ID="SFRStroke-52" sf:miter-limit="4" sf:width="1" sf:cap="butt" sf:join="miter"><sf:color xsi:type="sfa:calibrated-white-color-type" sfa:w="0" sfa:a="1"/><sf:pattern sfa:ID="SFRStrokePattern-47" sf:phase="0" sf:type="empty"><sf:pattern/></sf:pattern></sf:stroke></sf:SFCLegendStrokeProperty><sf:Series_0><sf:chart-series-style-ref sfa:IDREF="SFCSeriesStyle-0"/></sf:Series_0><sf:SFC2DShowCategoryDirectionGridLinesProperty><sf:number sfa:number="0" sfa:type="c"/></sf:SFC2DShowCategoryDirectionGridLinesProperty><sf:SFCShowPieLabelAsPercentageProperty><sf:number sfa:number="1" sfa:type="c"/></sf:SFCShowPieLabelAsPercentageProperty><sf:SFCSpecularColorProperty><sf:color xsi:type="sfa:calibrated-white-color-type" sfa:w="0.66666668653488159" sfa:a="1"/></sf:SFCSpecularColorProperty><sf:SFC2DRightBorderStrokeProperty><sf:stroke sfa:ID="SFRStroke-53" sf:miter-limit="4" sf:width="1" sf:cap="butt" sf:join="miter"><sf:color xsi:type="sfa:calibrated-rgb-color-type" sfa:r="0" sfa:g="0" sfa:b="0" sfa:a="1"/><sf:pattern sfa:ID="SFRStrokePattern-48" sf:phase="0" sf:type="solid"><sf:pattern/></sf:pattern></sf:stroke></sf:SFC2DRightBorderStrokeProperty><sf:SFCDefaultLegendBoundsProperty><sf:value><sfa:rect sfa:x="72" sfa:y="84" sfa:w="468" sfa:h="15"/></sf:value></sf:SFCDefaultLegendBoundsProperty><sf:SFCShowCategoryAxisTitleProperty><sf:number sfa:number="0" sfa:type="c"/></sf:SFCShowCategoryAxisTitleProperty><sf:SFC2DRightBorderShadowProperty><sf:shadow-ref sfa:IDREF="SFRShadow-0"/></sf:SFC2DRightBorderShadowProperty><sf:SFC3DReflectionsLevelProperty><sf:number sfa:number="0.1" sfa:type="f"/></sf:SFC3DReflectionsLevelProperty><sf:SFCChartTitleParagraphStyleProperty><sf:paragraphstyle-ref sfa:IDREF="SFWPParagraphStyle-93"/></sf:SFCChartTitleParagraphStyleProperty><sf:SFCShowChartTitleProperty><sf:number sfa:number="0" sfa:type="c"/></sf:SFCShowChartTitleProperty><sf:SFC3DBarShadowProperty><sf:shadow sfa:ID="SFRShadow-6" sf:angle="122" sf:offset="0" sf:radius="10" sf:opacity="0.55000001192092896"><sf:color xsi:type="sfa:calibrated-white-color-type" sfa:w="0" sfa:a="1"/></sf:shadow></sf:SFC3DBarShadowProperty><sf:SFC3DPieChartScaleProperty><sf:vector3d sfa:ID="SFC3DVector-1" sf:x="1.3999999761581421" sf:y="1.3451770544052124" sf:z="1"/></sf:SFC3DPieChartScaleProperty><sf:SFC3DChartRotationProperty><sf:vector3d sfa:ID="SFC3DVector-2" sf:x="18.5" sf:y="-18.125" sf:z="0"/></sf:SFC3DChartRotationProperty><sf:SFCValueAxisParagraphStyleProperty><sf:paragraphstyle-ref sfa:IDREF="SFWPParagraphStyle-65"/></sf:SFCValueAxisParagraphStyleProperty><sf:SFCCategoryAxisLabelsOpacityProperty><sf:number sfa:number="1" sfa:type="f"/></sf:SFCCategoryAxisLabelsOpacityProperty><sf:SFCDefaultChartBoundsProperty><sf:value><sfa:rect sfa:x="72" sfa:y="99" sfa:w="467" sfa:h="255"/></sf:value></sf:SFCDefaultChartBoundsProperty><sf:SFC3DLineShadowProperty><sf:shadow sfa:ID="SFRShadow-7" sf:angle="268" sf:offset="3" sf:radius="4" sf:opacity="0.5"><sf:color xsi:type="sfa:calibrated-white-color-type" sfa:w="0" sfa:a="1"/></sf:shadow></sf:SFC3DLineShadowProperty><sf:SFCDefaultChartTypeProperty><sf:number sfa:number="2" sfa:type="i"/></sf:SFCDefaultChartTypeProperty><sf:SFC3DBarChartScaleProperty><sf:vector3d sfa:ID="SFC3DVector-3" sf:x="1.3999999761581421" sf:y="1.3451770544052124" sf:z="1"/></sf:SFC3DBarChartScaleProperty><sf:SFC3DAreaChartScaleProperty><sf:vector3d sfa:ID="SFC3DVector-4" sf:x="1.3999999761581421" sf:y="1.3451770544052124" sf:z="1"/></sf:SFC3DAreaChartScaleProperty><sf:SFCShininessProperty><sf:number sfa:number="0.5" sfa:type="f"/></sf:SFCShininessProperty><sf:SFCValueNumberFormatPrefixProperty><sf:string sfa:string="None"/></sf:SFCValueNumberFormatPrefixProperty><sf:SFC3DValueDirectionGridLineOpacityProperty><sf:number sfa:number="1" sfa:type="i"/></sf:SFC3DValueDirectionGridLineOpacityProperty><sf:SFC2DLeftBorderStrokeProperty><sf:stroke sfa:ID="SFRStroke-54" sf:miter-limit="4" sf:width="1" sf:cap="butt" sf:join="miter"><sf:color xsi:type="sfa:calibrated-rgb-color-type" sfa:r="0" sfa:g="0" sfa:b="0" sfa:a="1"/><sf:pattern sfa:ID="SFRStrokePattern-49" sf:phase="0" sf:type="solid"><sf:pattern/></sf:pattern></sf:stroke></sf:SFC2DLeftBorderStrokeProperty><sf:SFCValueAxisMinorTickLengthProperty><sf:number sfa:number="4" sfa:type="i"/></sf:SFCValueAxisMinorTickLengthProperty><sf:SFC3DColumnLightingPackageProperty><sf:string sfa:string="Default"/></sf:SFC3DColumnLightingPackageProperty><sf:SFC3DShadowCameraXProperty><sf:number sfa:number="0.48481" sfa:type="f"/></sf:SFC3DShadowCameraXProperty><sf:SFCValueAxisLabelsOpacityProperty><sf:number sfa:number="1" sfa:type="f"/></sf:SFCValueAxisLabelsOpacityProperty><sf:SFCInterSetGapProperty><sf:number sfa:number="100" sfa:type="i"/></sf:SFCInterSetGapProperty><sf:SFC2DShowBottomTicksProperty><sf:number sfa:number="1" sfa:type="c"/></sf:SFC2DShowBottomTicksProperty><sf:SFC3DWallFillProperty><sf:color xsi:type="sfa:calibrated-rgb-color-type" sfa:r="0.16219078004360199" sfa:g="0.21128451824188232" sfa:b="0.34699451923370361" sfa:a="1"/></sf:SFC3DWallFillProperty><sf:SFCValueAxisTickMarkLocationProperty><sf:number sfa:number="1" sfa:type="i"/></sf:SFCValueAxisTickMarkLocationProperty><sf:SFCValueAxisLabelsPositionProperty><sf:number sfa:number="3" sfa:type="i"/></sf:SFCValueAxisLabelsPositionProperty><sf:SFCValueAxisShowMinorTickMarksProperty><sf:number sfa:number="0" sfa:type="c"/></sf:SFCValueAxisShowMinorTickMarksProperty><sf:SFC3DShadowProperty><sf:shadow-ref sfa:IDREF="SFRShadow-0"/></sf:SFC3DShadowProperty><sf:SFC3DAreaLightingPackageProperty><sf:string sfa:string="Default"/></sf:SFC3DAreaLightingPackageProperty><sf:SFC2DCategoryDirectionGridLineStrokeProperty><sf:stroke sfa:ID="SFRStroke-55" sf:miter-limit="4" sf:width="1" sf:cap="butt" sf:join="miter"><sf:color xsi:type="sfa:calibrated-white-color-type" sfa:w="0.66666668653488159" sfa:a="1"/><sf:pattern sfa:ID="SFRStrokePattern-50" sf:phase="0" sf:type="solid"><sf:pattern/></sf:pattern></sf:stroke></sf:SFC2DCategoryDirectionGridLineStrokeProperty><sf:SFC2DBottomBorderStrokeProperty><sf:stroke sfa:ID="SFRStroke-56" sf:miter-limit="4" sf:width="1" sf:cap="butt" sf:join="miter"><sf:color xsi:type="sfa:calibrated-rgb-color-type" sfa:r="0" sfa:g="0" sfa:b="0" sfa:a="1"/><sf:pattern sfa:ID="SFRStrokePattern-51" sf:phase="0" sf:type="solid"><sf:pattern/></sf:pattern></sf:stroke></sf:SFC2DBottomBorderStrokeProperty><sf:SFCValueAxisMajorTickLengthProperty><sf:number sfa:number="6" sfa:type="i"/></sf:SFCValueAxisMajorTickLengthProperty><sf:SFC2DShowTopBorderProperty><sf:number sfa:number="0" sfa:type="c"/></sf:SFC2DShowTopBorderProperty><sf:SFCCategoryAxisMinorTickLengthProperty><sf:number sfa:number="4" sfa:type="i"/></sf:SFCCategoryAxisMinorTickLengthProperty><sf:SFCHorizontalAxisNumberFormatSeparatorProperty><sf:number sfa:number="1" sfa:type="c"/></sf:SFCHorizontalAxisNumberFormatSeparatorProperty><sf:SFCEmissiveColorProperty><sf:color xsi:type="sfa:calibrated-white-color-type" sfa:w="0.66666668653488159" sfa:a="1"/></sf:SFCEmissiveColorProperty><sf:SFCCategoryAxisMajorTickLengthProperty><sf:number sfa:number="6" sfa:type="i"/></sf:SFCCategoryAxisMajorTickLengthProperty><sf:SFCCategoryAxisLabelsPositionProperty><sf:number sfa:number="1" sfa:type="i"/></sf:SFCCategoryAxisLabelsPositionProperty><sf:SFC2DCategoryDirectionGridLineOpacityProperty><sf:number sfa:number="1" sfa:type="f"/></sf:SFC2DCategoryDirectionGridLineOpacityProperty><sf:SFC3DFloorDepthProperty><sf:number sfa:number="2" sfa:type="f"/></sf:SFC3DFloorDepthProperty><sf:SFC3DColumnChartScaleProperty><sf:vector3d sfa:ID="SFC3DVector-5" sf:x="1.3999999761581421" sf:y="1.3451770544052124" sf:z="1"/></sf:SFC3DColumnChartScaleProperty><sf:SFC2DTopBorderStrokeProperty><sf:stroke sfa:ID="SFRStroke-57" sf:miter-limit="4" sf:width="1" sf:cap="butt" sf:join="miter"><sf:color xsi:type="sfa:calibrated-rgb-color-type" sfa:r="0" sfa:g="0" sfa:b="0" sfa:a="1"/><sf:pattern sfa:ID="SFRStrokePattern-52" sf:phase="0" sf:type="solid"><sf:pattern/></sf:pattern></sf:stroke></sf:SFC2DTopBorderStrokeProperty><sf:SFC3DPieLightingPackageProperty><sf:string sfa:string="Default"/></sf:SFC3DPieLightingPackageProperty><sf:Series_3><sf:chart-series-style-ref sfa:IDREF="SFCSeriesStyle-1"/></sf:Series_3><sf:SFCHorizontalAxisShowMinimumValueProperty><sf:number sfa:number="1" sfa:type="c"/></sf:SFCHorizontalAxisShowMinimumValueProperty><sf:SFC2DLeftBorderOpacityProperty><sf:number sfa:number="1" sfa:type="f"/></sf:SFC2DLeftBorderOpacityProperty><sf:SFCValueAxisMaximumValueProperty><sf:null/></sf:SFCValueAxisMaximumValueProperty><sf:Series_5><sf:chart-series-style-ref sfa:IDREF="SFCSeriesStyle-2"/></sf:Series_5><sf:SFC3DCategoryDirectionGridLineStrokeProperty><sf:stroke sfa:ID="SFRStroke-58" sf:miter-limit="4" sf:width="1" sf:cap="butt" sf:join="miter"><sf:color xsi:type="sfa:calibrated-white-color-type" sfa:w="0.66666668653488159" sfa:a="1"/><sf:pattern sfa:ID="SFRStrokePattern-53" sf:phase="0" sf:type="solid"><sf:pattern/></sf:pattern></sf:stroke></sf:SFC3DCategoryDirectionGridLineStrokeProperty><sf:SFCValueAxisTitleParagraphStyleProperty><sf:paragraphstyle-ref sfa:IDREF="SFWPParagraphStyle-68"/></sf:SFCValueAxisTitleParagraphStyleProperty><sf:SFC3DSeriesShininessProperty><sf:number sfa:number="0.5" sfa:type="f"/></sf:SFC3DSeriesShininessProperty><sf:SFCValueNumberFormatSuffixProperty><sf:string sfa:string="None"/></sf:SFCValueNumberFormatSuffixProperty><sf:SFCShowValueAxisTitleProperty><sf:number sfa:number="0" sfa:type="c"/></sf:SFCShowValueAxisTitleProperty><sf:SFCCategoryAxisShowMajorTickMarksProperty><sf:number sfa:number="0" sfa:type="c"/></sf:SFCCategoryAxisShowMajorTickMarksProperty><sf:SFC2DTopBorderShadowProperty><sf:shadow-ref sfa:IDREF="SFRShadow-0"/></sf:SFC2DTopBorderShadowProperty><sf:SFC3DCategoryDirectionGridLineOpacityProperty><sf:number sfa:number="1" sfa:type="i"/></sf:SFC3DCategoryDirectionGridLineOpacityProperty><sf:Series_2><sf:chart-series-style-ref sfa:IDREF="SFCSeriesStyle-5"/></sf:Series_2><sf:SFCShowCategoryAxisSeriesLabelsProperty><sf:number sfa:number="0" sfa:type="c"/></sf:SFCShowCategoryAxisSeriesLabelsProperty><sf:SFCCategoryAxisTickMarkLocationProperty><sf:number sfa:number="1" sfa:type="i"/></sf:SFCCategoryAxisTickMarkLocationProperty><sf:SFC3DWallSpecularColorProperty><sf:color xsi:type="sfa:calibrated-rgb-color-type" sfa:r="0.40000000596046448" sfa:g="0.40000000596046448" sfa:b="0.40000000596046448" sfa:a="1"/></sf:SFC3DWallSpecularColorProperty><sf:SFC2DValueDirectionGridLineOpacityProperty><sf:number sfa:number="1" sfa:type="f"/></sf:SFC2DValueDirectionGridLineOpacityProperty><sf:SFC2DShowBottomBorderProperty><sf:number sfa:number="1" sfa:type="c"/></sf:SFC2DShowBottomBorderProperty><sf:SFCLegendParagraphStyleProperty><sf:paragraphstyle-ref sfa:IDREF="SFWPParagraphStyle-69"/></sf:SFCLegendParagraphStyleProperty><sf:SFC3DLineLightingPackageProperty><sf:string sfa:string="Default"/></sf:SFC3DLineLightingPackageProperty><sf:SFC3DBarShapeProperty><sf:number sfa:number="0" sfa:type="i"/></sf:SFC3DBarShapeProperty><sf:SFCValueAxisLabelsDepthProperty><sf:number sfa:number="1" sfa:type="f"/></sf:SFCValueAxisLabelsDepthProperty><sf:SFC3DFloorSpecularColorProperty><sf:color xsi:type="sfa:calibrated-rgb-color-type" sfa:r="0.40000000596046448" sfa:g="0.40000000596046448" sfa:b="0.40000000596046448" sfa:a="1"/></sf:SFC3DFloorSpecularColorProperty><sf:externalTextWrap><sf:external-text-wrap sfa:ID="SFWPExternalTextWrap-11" sf:wrap-style="tight" sf:floating-wrap-enabled="true" sf:inline-wrap-enabled="true" sf:direction="both" sf:attachment-wrap-type="unaligned" sf:floating-wrap-type="directional" sf:margin="12" sf:alpha-threshold="0.5"/></sf:externalTextWrap><sf:SFCCategoryAxisMajorTickStrokeProperty><sf:stroke sfa:ID="SFRStroke-59" sf:miter-limit="4" sf:width="1" sf:cap="butt" sf:join="miter"><sf:color xsi:type="sfa:calibrated-rgb-color-type" sfa:r="0" sfa:g="0" sfa:b="0" sfa:a="1"/><sf:pattern sfa:ID="SFRStrokePattern-54" sf:phase="0" sf:type="solid"><sf:pattern/></sf:pattern></sf:stroke></sf:SFCCategoryAxisMajorTickStrokeProperty><sf:SFC3DValueDirectionGridLineStrokeProperty><sf:stroke-ref sfa:IDREF="SFRStroke-50"/></sf:SFC3DValueDirectionGridLineStrokeProperty><sf:SFC3DAreaShadowProperty><sf:shadow sfa:ID="SFRShadow-8" sf:angle="90" sf:offset="1" sf:radius="4" sf:opacity="0.5"><sf:color xsi:type="sfa:calibrated-white-color-type" sfa:w="0" sfa:a="1"/></sf:shadow></sf:SFC3DAreaShadowProperty><sf:SFC2DShowRightBorderProperty><sf:number sfa:number="0" sfa:type="c"/></sf:SFC2DShowRightBorderProperty><sf:SFCValueAxisShowMajorTickMarksProperty><sf:number sfa:number="0" sfa:type="c"/></sf:SFCValueAxisShowMajorTickMarksProperty><sf:SFC2DLeftBorderShadowProperty><sf:shadow-ref sfa:IDREF="SFRShadow-0"/></sf:SFC2DLeftBorderShadowProperty><sf:SFCDepthProperty><sf:number sfa:number="1.381429" sfa:type="f"/></sf:SFCDepthProperty><sf:SFC2DValueDirectionGridLineShadowProperty><sf:shadow-ref sfa:IDREF="SFRShadow-0"/></sf:SFC2DValueDirectionGridLineShadowProperty><sf:SFCValueAxisLogarithmicProperty><sf:number sfa:number="0" sfa:type="c"/></sf:SFCValueAxisLogarithmicProperty><sf:SFCInterBarGapProperty><sf:number sfa:number="0" sfa:type="i"/></sf:SFCInterBarGapProperty><sf:SFC3DWallsShininessProperty><sf:number sfa:number="0.8" sfa:type="f"/></sf:SFC3DWallsShininessProperty><sf:Series_4><sf:chart-series-style-ref sfa:IDREF="SFCSeriesStyle-3"/></sf:Series_4><sf:SFCValueAxisNumberOfStepsProperty><sf:number sfa:number="4" sfa:type="i"/></sf:SFCValueAxisNumberOfStepsProperty><sf:SFC2DShowTopTicksProperty><sf:number sfa:number="0" sfa:type="c"/></sf:SFC2DShowTopTicksProperty><sf:SFC3DChartScaleProperty><sf:vector3d sfa:ID="SFC3DVector-6" sf:x="1.3999999761581421" sf:y="1.3451770544052124" sf:z="1"/></sf:SFC3DChartScaleProperty><sf:SFCCategoryAxisTitleParagraphStyleProperty><sf:paragraphstyle-ref sfa:IDREF="SFWPParagraphStyle-71"/></sf:SFCCategoryAxisTitleParagraphStyleProperty><sf:opacity><sf:number sfa:number="1" sfa:type="f"/></sf:opacity><sf:SFC2DCategoryDirectionGridLineShadowProperty><sf:shadow-ref sfa:IDREF="SFRShadow-0"/></sf:SFC2DCategoryDirectionGridLineShadowProperty><sf:SFCValueAxisMajorTickStrokeProperty><sf:stroke sfa:ID="SFRStroke-60" sf:miter-limit="4" sf:width="1" sf:cap="butt" sf:join="miter"><sf:color xsi:type="sfa:calibrated-rgb-color-type" sfa:r="0" sfa:g="0" sfa:b="0" sfa:a="1"/><sf:pattern sfa:ID="SFRStrokePattern-55" sf:phase="0" sf:type="solid"><sf:pattern/></sf:pattern></sf:stroke></sf:SFCValueAxisMajorTickStrokeProperty><sf:SFCValueAxisMinorTickStrokeProperty><sf:stroke sfa:ID="SFRStroke-61" sf:miter-limit="4" sf:width="1" sf:cap="butt" sf:join="miter"><sf:color xsi:type="sfa:calibrated-rgb-color-type" sfa:r="0" sfa:g="0" sfa:b="0" sfa:a="1"/><sf:pattern sfa:ID="SFRStrokePattern-56" sf:phase="0" sf:type="solid"><sf:pattern/></sf:pattern></sf:stroke></sf:SFCValueAxisMinorTickStrokeProperty><sf:SFCLegendPositionProperty><sf:number sfa:number="1" sfa:type="i"/></sf:SFCLegendPositionProperty><sf:SFC3DSceneBackgroundColorProperty><sf:color xsi:type="sfa:calibrated-rgb-color-type" sfa:r="0.80000001192092896" sfa:g="0.80000001192092896" sfa:b="0.80000001192092896" sfa:a="1"/></sf:SFC3DSceneBackgroundColorProperty><sf:SFCLegendOpacityProperty><sf:number sfa:number="1" sfa:type="i"/></sf:SFCLegendOpacityProperty><sf:SFC3DPieShadowProperty><sf:shadow sfa:ID="SFRShadow-9" sf:angle="122" sf:offset="0" sf:radius="10" sf:opacity="0.55000001192092896"><sf:color xsi:type="sfa:calibrated-white-color-type" sfa:w="0" sfa:a="1"/></sf:shadow></sf:SFC3DPieShadowProperty><sf:SFC2DRightBorderOpacityProperty><sf:number sfa:number="1" sfa:type="f"/></sf:SFC2DRightBorderOpacityProperty><sf:SFC2DCombineLayersProperty><sf:number sfa:number="0" sfa:type="c"/></sf:SFC2DCombineLayersProperty><sf:SFCValueAxisShowMinimumValueProperty><sf:number sfa:number="1" sfa:type="c"/></sf:SFCValueAxisShowMinimumValueProperty><sf:SFC3DMaterialPackageProperty><sf:string sfa:string="Default"/></sf:SFC3DMaterialPackageProperty><sf:SFCLegendFillProperty><sf:null/></sf:SFCLegendFillProperty><sf:SFC2DShowLeftTicksProperty><sf:number sfa:number="1" sfa:type="c"/></sf:SFC2DShowLeftTicksProperty><sf:SFC2DShowLeftBorderProperty><sf:number sfa:number="0" sfa:type="c"/></sf:SFC2DShowLeftBorderProperty><sf:SFC3DFloorFillProperty><sf:color xsi:type="sfa:calibrated-rgb-color-type" sfa:r="0.29464888572692871" sfa:g="0.36108782887458801" sfa:b="0.54371583461761475" sfa:a="1"/></sf:SFC3DFloorFillProperty></sf:property-map></sf:chart-style><sf:paragraphstyle sfa:ID="SFWPParagraphStyle-113" sf:name="article-subtitle" sf:ident="paragraph-style-6"><sf:property-map><sf:fontSize><sf:number sfa:number="18" sfa:type="f"/></sf:fontSize><sf:word_strikethrough/><sf:spaceAfter/><sf:alignment/><sf:keepLinesTogether/><sf:listStyle><sf:liststyle-ref sfa:IDREF="SFWPListStyle-2"/></sf:listStyle><sf:outlineLevel/><sf:firstTopicNumber/><sf:underline/><sf:defaultTabStops><sf:number sfa:number="28.34646" sfa:type="f"/></sf:defaultTabStops><sf:tocStyle><sf:tocstyle-ref sfa:IDREF="SLTOCParagraphStyle-3"/></sf:tocStyle><sf:dropCap/><sf:underlineWidth/><sf:fontName><sf:string sfa:string="Helvetica-Bold"/></sf:fontName><sf:strikethru/><sf:baselineShift/><sf:lineSpacing/><sf:textShadow/><sf:underlineColor><sf:null/></sf:underlineColor><sf:showInTOC><sf:number sfa:number="1" sfa:type="c"/></sf:showInTOC><sf:kerning/><sf:strikethruWidth/><sf:fontColor/><sf:textBackground><sf:null/></sf:textBackground><sf:paragraphRuleWidth/><sf:paragraphStroke><sf:null/></sf:paragraphStroke><sf:bold><sf:number sfa:number="1" sfa:type="c"/></sf:bold><sf:tracking/><sf:ligatures/><sf:language><sf:null/></sf:language><sf:followingParagraphStyle><sf:paragraphstyle-ref sfa:IDREF="SFWPParagraphStyle-7"/></sf:followingParagraphStyle><sf:outline/><sf:strikethruColor><sf:null/></sf:strikethruColor><sf:italic/><sf:word_underline/><sf:widowControl/><sf:rightIndent/><sf:atsuFontFeatures/><sf:tabs/><sf:superscript/><sf:paragraphBorderType/><sf:hyphenate/><sf:hidden/><sf:pageBreakBefore/><sf:paragraphFill><sf:null/></sf:paragraphFill><sf:spaceBefore><sf:number sfa:number="12" sfa:type="f"/></sf:spaceBefore><sf:keepWithNext><sf:number sfa:number="1" sfa:type="c"/></sf:keepWithNext><sf:outlineColor><sf:null/></sf:outlineColor><sf:paragraphRuleOffset/><sf:capitalization/><sf:leftIndent/><sf:firstLineIndent/></sf:property-map></sf:paragraphstyle><sf:graphic-style sfa:ID="SFDGraphicStyle-31" sf:name="graphic-movie-style-default 3" sf:ident="graphic-movie-style-default-2" sf:parent-ident="graphic-movie-style-default"><sf:property-map><sf:shadow><sf:shadow-ref sfa:IDREF="SFRShadow-0"/></sf:shadow></sf:property-map></sf:graphic-style><sf:paragraphstyle sfa:ID="SFWPParagraphStyle-114" sf:name="para-continue" sf:ident="paragraph-style-39"><sf:property-map><sf:fontSize/><sf:word_strikethrough/><sf:spaceAfter><sf:number sfa:number="12" sfa:type="f"/></sf:spaceAfter><sf:alignment/><sf:keepLinesTogether/><sf:listStyle><sf:liststyle-ref sfa:IDREF="SFWPListStyle-2"/></sf:listStyle><sf:outlineLevel/><sf:firstTopicNumber/><sf:underline/><sf:defaultTabStops><sf:number sfa:number="28.34646" sfa:type="f"/></sf:defaultTabStops><sf:underlineWidth/><sf:dropCap/><sf:fontName/><sf:strikethru/><sf:baselineShift/><sf:lineSpacing/><sf:textShadow/><sf:underlineColor><sf:null/></sf:underlineColor><sf:kerning/><sf:strikethruWidth/><sf:fontColor/><sf:textBackground><sf:null/></sf:textBackground><sf:paragraphRuleWidth/><sf:paragraphStroke><sf:null/></sf:paragraphStroke><sf:bold/><sf:tracking/><sf:ligatures/><sf:language><sf:null/></sf:language><sf:followingParagraphStyle><sf:null/></sf:followingParagraphStyle><sf:outline/><sf:strikethruColor><sf:null/></sf:strikethruColor><sf:italic/><sf:word_underline/><sf:widowControl/><sf:rightIndent/><sf:atsuFontFeatures/><sf:tabs/><sf:superscript/><sf:paragraphBorderType/><sf:hyphenate/><sf:hidden/><sf:pageBreakBefore/><sf:paragraphFill><sf:null/></sf:paragraphFill><sf:spaceBefore/><sf:keepWithNext/><sf:outlineColor><sf:null/></sf:outlineColor><sf:paragraphRuleOffset/><sf:capitalization/><sf:leftIndent/><sf:firstLineIndent/></sf:property-map></sf:paragraphstyle><sf:paragraphstyle-ref sfa:IDREF="SFWPParagraphStyle-25"/><sf:paragraphstyle-ref sfa:IDREF="SFWPParagraphStyle-7"/><sf:paragraphstyle sfa:ID="SFWPParagraphStyle-115" sf:name="chapter-titleabbrev" sf:ident="paragraph-style-19"><sf:property-map><sf:fontSize><sf:number sfa:number="16" sfa:type="f"/></sf:fontSize><sf:word_strikethrough/><sf:spaceAfter/><sf:alignment/><sf:keepLinesTogether/><sf:listStyle><sf:liststyle-ref sfa:IDREF="SFWPListStyle-2"/></sf:listStyle><sf:outlineLevel/><sf:firstTopicNumber/><sf:underline/><sf:defaultTabStops><sf:number sfa:number="28.34646" sfa:type="f"/></sf:defaultTabStops><sf:tocStyle><sf:tocstyle-ref sfa:IDREF="SLTOCParagraphStyle-3"/></sf:tocStyle><sf:dropCap/><sf:underlineWidth/><sf:fontName><sf:string sfa:string="Helvetica-Bold"/></sf:fontName><sf:strikethru/><sf:baselineShift/><sf:lineSpacing/><sf:textShadow/><sf:underlineColor><sf:null/></sf:underlineColor><sf:showInTOC><sf:number sfa:number="1" sfa:type="c"/></sf:showInTOC><sf:kerning/><sf:strikethruWidth/><sf:fontColor/><sf:textBackground><sf:null/></sf:textBackground><sf:paragraphRuleWidth/><sf:paragraphStroke><sf:null/></sf:paragraphStroke><sf:bold><sf:number sfa:number="1" sfa:type="c"/></sf:bold><sf:tracking/><sf:ligatures/><sf:language><sf:null/></sf:language><sf:followingParagraphStyle><sf:paragraphstyle-ref sfa:IDREF="SFWPParagraphStyle-7"/></sf:followingParagraphStyle><sf:outline/><sf:strikethruColor><sf:null/></sf:strikethruColor><sf:italic/><sf:word_underline/><sf:widowControl/><sf:rightIndent/><sf:atsuFontFeatures/><sf:tabs/><sf:superscript/><sf:paragraphBorderType/><sf:hyphenate/><sf:hidden/><sf:pageBreakBefore/><sf:paragraphFill><sf:null/></sf:paragraphFill><sf:spaceBefore><sf:number sfa:number="12" sfa:type="f"/></sf:spaceBefore><sf:keepWithNext><sf:number sfa:number="1" sfa:type="c"/></sf:keepWithNext><sf:outlineColor><sf:null/></sf:outlineColor><sf:paragraphRuleOffset/><sf:capitalization/><sf:leftIndent/><sf:firstLineIndent/></sf:property-map></sf:paragraphstyle><sf:paragraphstyle sfa:ID="SFWPParagraphStyle-116" sf:name="sect3-title" sf:ident="paragraph-style-46"><sf:property-map><sf:fontSize><sf:number sfa:number="15" sfa:type="f"/></sf:fontSize><sf:word_strikethrough/><sf:spaceAfter/><sf:alignment/><sf:keepLinesTogether/><sf:listStyle><sf:liststyle-ref sfa:IDREF="SFWPListStyle-2"/></sf:listStyle><sf:outlineLevel/><sf:firstTopicNumber/><sf:underline/><sf:defaultTabStops><sf:number sfa:number="28.34646" sfa:type="f"/></sf:defaultTabStops><sf:tocStyle><sf:tocstyle-ref sfa:IDREF="SLTOCParagraphStyle-3"/></sf:tocStyle><sf:dropCap/><sf:underlineWidth/><sf:fontName><sf:string sfa:string="Helvetica-Bold"/></sf:fontName><sf:strikethru/><sf:baselineShift/><sf:lineSpacing/><sf:textShadow/><sf:underlineColor><sf:null/></sf:underlineColor><sf:showInTOC><sf:number sfa:number="1" sfa:type="c"/></sf:showInTOC><sf:kerning/><sf:strikethruWidth/><sf:fontColor/><sf:textBackground><sf:null/></sf:textBackground><sf:paragraphRuleWidth/><sf:paragraphStroke><sf:null/></sf:paragraphStroke><sf:bold><sf:number sfa:number="1" sfa:type="c"/></sf:bold><sf:tracking/><sf:ligatures/><sf:language><sf:null/></sf:language><sf:followingParagraphStyle><sf:paragraphstyle-ref sfa:IDREF="SFWPParagraphStyle-7"/></sf:followingParagraphStyle><sf:outline/><sf:strikethruColor><sf:null/></sf:strikethruColor><sf:italic/><sf:word_underline/><sf:widowControl/><sf:rightIndent/><sf:atsuFontFeatures/><sf:tabs/><sf:superscript/><sf:paragraphBorderType/><sf:hyphenate/><sf:hidden/><sf:pageBreakBefore/><sf:paragraphFill><sf:null/></sf:paragraphFill><sf:spaceBefore><sf:number sfa:number="12" sfa:type="f"/></sf:spaceBefore><sf:keepWithNext><sf:number sfa:number="1" sfa:type="c"/></sf:keepWithNext><sf:outlineColor><sf:null/></sf:outlineColor><sf:paragraphRuleOffset/><sf:capitalization/><sf:leftIndent/><sf:firstLineIndent/></sf:property-map></sf:paragraphstyle><sf:paragraphstyle sfa:ID="SFWPParagraphStyle-117" sf:name="book-subtitle" sf:ident="paragraph-style-14"><sf:property-map><sf:fontSize><sf:number sfa:number="18" sfa:type="f"/></sf:fontSize><sf:word_strikethrough/><sf:spaceAfter/><sf:alignment/><sf:keepLinesTogether/><sf:listStyle><sf:liststyle-ref sfa:IDREF="SFWPListStyle-2"/></sf:listStyle><sf:outlineLevel/><sf:firstTopicNumber/><sf:underline/><sf:defaultTabStops><sf:number sfa:number="28.34646" sfa:type="f"/></sf:defaultTabStops><sf:tocStyle><sf:tocstyle-ref sfa:IDREF="SLTOCParagraphStyle-3"/></sf:tocStyle><sf:dropCap/><sf:underlineWidth/><sf:fontName><sf:string sfa:string="Helvetica-Bold"/></sf:fontName><sf:strikethru/><sf:baselineShift/><sf:lineSpacing/><sf:textShadow/><sf:underlineColor><sf:null/></sf:underlineColor><sf:showInTOC><sf:number sfa:number="1" sfa:type="c"/></sf:showInTOC><sf:kerning/><sf:strikethruWidth/><sf:fontColor/><sf:textBackground><sf:null/></sf:textBackground><sf:paragraphRuleWidth/><sf:paragraphStroke><sf:null/></sf:paragraphStroke><sf:bold><sf:number sfa:number="1" sfa:type="c"/></sf:bold><sf:tracking/><sf:ligatures/><sf:language><sf:null/></sf:language><sf:followingParagraphStyle><sf:paragraphstyle-ref sfa:IDREF="SFWPParagraphStyle-7"/></sf:followingParagraphStyle><sf:outline/><sf:strikethruColor><sf:null/></sf:strikethruColor><sf:italic/><sf:word_underline/><sf:widowControl/><sf:rightIndent/><sf:atsuFontFeatures/><sf:tabs/><sf:superscript/><sf:paragraphBorderType/><sf:hyphenate/><sf:hidden/><sf:pageBreakBefore/><sf:paragraphFill><sf:null/></sf:paragraphFill><sf:spaceBefore><sf:number sfa:number="12" sfa:type="f"/></sf:spaceBefore><sf:keepWithNext><sf:number sfa:number="1" sfa:type="c"/></sf:keepWithNext><sf:outlineColor><sf:null/></sf:outlineColor><sf:paragraphRuleOffset/><sf:capitalization/><sf:leftIndent/><sf:firstLineIndent/></sf:property-map></sf:paragraphstyle><sf:paragraphstyle sfa:ID="SFWPParagraphStyle-118" sf:name="chapter-subtitle" sf:ident="paragraph-style-18"><sf:property-map><sf:fontSize><sf:number sfa:number="18" sfa:type="f"/></sf:fontSize><sf:word_strikethrough/><sf:spaceAfter/><sf:alignment/><sf:keepLinesTogether/><sf:listStyle><sf:liststyle-ref sfa:IDREF="SFWPListStyle-2"/></sf:listStyle><sf:outlineLevel/><sf:firstTopicNumber/><sf:underline/><sf:defaultTabStops><sf:number sfa:number="28.34646" sfa:type="f"/></sf:defaultTabStops><sf:tocStyle><sf:tocstyle-ref sfa:IDREF="SLTOCParagraphStyle-3"/></sf:tocStyle><sf:dropCap/><sf:underlineWidth/><sf:fontName><sf:string sfa:string="Helvetica-Bold"/></sf:fontName><sf:strikethru/><sf:baselineShift/><sf:lineSpacing/><sf:textShadow/><sf:underlineColor><sf:null/></sf:underlineColor><sf:showInTOC><sf:number sfa:number="1" sfa:type="c"/></sf:showInTOC><sf:kerning/><sf:strikethruWidth/><sf:fontColor/><sf:textBackground><sf:null/></sf:textBackground><sf:paragraphRuleWidth/><sf:paragraphStroke><sf:null/></sf:paragraphStroke><sf:bold><sf:number sfa:number="1" sfa:type="c"/></sf:bold><sf:tracking/><sf:ligatures/><sf:language><sf:null/></sf:language><sf:followingParagraphStyle><sf:paragraphstyle-ref sfa:IDREF="SFWPParagraphStyle-7"/></sf:followingParagraphStyle><sf:outline/><sf:strikethruColor><sf:null/></sf:strikethruColor><sf:italic/><sf:word_underline/><sf:widowControl/><sf:rightIndent/><sf:atsuFontFeatures/><sf:tabs/><sf:superscript/><sf:paragraphBorderType/><sf:hyphenate/><sf:hidden/><sf:pageBreakBefore/><sf:paragraphFill><sf:null/></sf:paragraphFill><sf:spaceBefore><sf:number sfa:number="12" sfa:type="f"/></sf:spaceBefore><sf:keepWithNext><sf:number sfa:number="1" sfa:type="c"/></sf:keepWithNext><sf:outlineColor><sf:null/></sf:outlineColor><sf:paragraphRuleOffset/><sf:capitalization/><sf:leftIndent/><sf:firstLineIndent/></sf:property-map></sf:paragraphstyle><sf:paragraphstyle sfa:ID="SFWPParagraphStyle-119" sf:name="date" sf:ident="paragraph-style-2"><sf:property-map><sf:fontSize/><sf:word_strikethrough/><sf:spaceAfter><sf:number sfa:number="12" sfa:type="f"/></sf:spaceAfter><sf:alignment/><sf:keepLinesTogether/><sf:listStyle><sf:liststyle-ref sfa:IDREF="SFWPListStyle-2"/></sf:listStyle><sf:outlineLevel/><sf:firstTopicNumber/><sf:underline/><sf:defaultTabStops><sf:number sfa:number="28.34646" sfa:type="f"/></sf:defaultTabStops><sf:underlineWidth/><sf:dropCap/><sf:fontName/><sf:strikethru/><sf:baselineShift/><sf:lineSpacing/><sf:textShadow/><sf:underlineColor><sf:null/></sf:underlineColor><sf:kerning/><sf:strikethruWidth/><sf:fontColor/><sf:textBackground><sf:null/></sf:textBackground><sf:paragraphRuleWidth/><sf:paragraphStroke><sf:null/></sf:paragraphStroke><sf:bold/><sf:tracking/><sf:ligatures/><sf:language><sf:null/></sf:language><sf:followingParagraphStyle><sf:null/></sf:followingParagraphStyle><sf:outline/><sf:strikethruColor><sf:null/></sf:strikethruColor><sf:italic/><sf:word_underline/><sf:widowControl/><sf:rightIndent/><sf:atsuFontFeatures/><sf:tabs/><sf:superscript/><sf:paragraphBorderType/><sf:hyphenate/><sf:hidden/><sf:pageBreakBefore/><sf:paragraphFill><sf:color xsi:type="sfa:calibrated-rgb-color-type" sfa:r="0.40000000596046448" sfa:g="0.80000001192092896" sfa:b="1" sfa:a="1"/></sf:paragraphFill><sf:spaceBefore/><sf:keepWithNext/><sf:outlineColor><sf:null/></sf:outlineColor><sf:paragraphRuleOffset/><sf:capitalization/><sf:leftIndent/><sf:firstLineIndent/></sf:property-map></sf:paragraphstyle><sf:graphic-style sfa:ID="SFDGraphicStyle-32" sf:name="graphic-textbox-style-default 2" sf:ident="graphic-textbox-style-default-1" sf:parent-ident="graphic-textbox-style-default"><sf:property-map><sf:layoutStyle><sf:null/></sf:layoutStyle><sf:stroke><sf:stroke sfa:ID="SFRStroke-62" sf:miter-limit="4" sf:width="1" sf:cap="butt" sf:join="miter"><sf:color xsi:type="sfa:calibrated-white-color-type" sfa:w="0" sfa:a="1"/><sf:pattern sfa:ID="SFRStrokePattern-57" sf:phase="0" sf:type="empty"><sf:pattern/></sf:pattern></sf:stroke></sf:stroke><sf:fill><sf:null/></sf:fill></sf:property-map></sf:graphic-style><sf:paragraphstyle-ref sfa:IDREF="SFWPParagraphStyle-74"/><sf:paragraphstyle sfa:ID="SFWPParagraphStyle-120" sf:name="book-titleabbrev" sf:ident="paragraph-style-15"><sf:property-map><sf:fontSize><sf:number sfa:number="16" sfa:type="f"/></sf:fontSize><sf:word_strikethrough/><sf:spaceAfter/><sf:alignment/><sf:keepLinesTogether/><sf:listStyle><sf:liststyle-ref sfa:IDREF="SFWPListStyle-2"/></sf:listStyle><sf:outlineLevel/><sf:firstTopicNumber/><sf:underline/><sf:defaultTabStops><sf:number sfa:number="28.34646" sfa:type="f"/></sf:defaultTabStops><sf:tocStyle><sf:tocstyle-ref sfa:IDREF="SLTOCParagraphStyle-3"/></sf:tocStyle><sf:dropCap/><sf:underlineWidth/><sf:fontName><sf:string sfa:string="Helvetica-Bold"/></sf:fontName><sf:strikethru/><sf:baselineShift/><sf:lineSpacing/><sf:textShadow/><sf:underlineColor><sf:null/></sf:underlineColor><sf:showInTOC><sf:number sfa:number="1" sfa:type="c"/></sf:showInTOC><sf:kerning/><sf:strikethruWidth/><sf:fontColor/><sf:textBackground><sf:null/></sf:textBackground><sf:paragraphRuleWidth/><sf:paragraphStroke><sf:null/></sf:paragraphStroke><sf:bold><sf:number sfa:number="1" sfa:type="c"/></sf:bold><sf:tracking/><sf:ligatures/><sf:language><sf:null/></sf:language><sf:followingParagraphStyle><sf:paragraphstyle-ref sfa:IDREF="SFWPParagraphStyle-7"/></sf:followingParagraphStyle><sf:outline/><sf:strikethruColor><sf:null/></sf:strikethruColor><sf:italic/><sf:word_underline/><sf:widowControl/><sf:rightIndent/><sf:atsuFontFeatures/><sf:tabs/><sf:superscript/><sf:paragraphBorderType/><sf:hyphenate/><sf:hidden/><sf:pageBreakBefore/><sf:paragraphFill><sf:null/></sf:paragraphFill><sf:spaceBefore><sf:number sfa:number="12" sfa:type="f"/></sf:spaceBefore><sf:keepWithNext><sf:number sfa:number="1" sfa:type="c"/></sf:keepWithNext><sf:outlineColor><sf:null/></sf:outlineColor><sf:paragraphRuleOffset/><sf:capitalization/><sf:leftIndent/><sf:firstLineIndent/></sf:property-map></sf:paragraphstyle><sf:tocstyle sfa:ID="SLTOCParagraphStyle-7" sfa:sfclass="paragraphstyle" sf:name="TOC Heading 1" sf:ident="toc-paragraph-style-1"><sf:property-map><sf:fontSize><sf:number sfa:number="18" sfa:type="f"/></sf:fontSize><sf:word_strikethrough/><sf:spaceAfter><sf:number sfa:number="3" sfa:type="f"/></sf:spaceAfter><sf:alignment/><sf:SLTOCPageNumberStyle><sf:null/></sf:SLTOCPageNumberStyle><sf:keepLinesTogether/><sf:listStyle><sf:null/></sf:listStyle><sf:outlineLevel/><sf:underline/><sf:underlineWidth/><sf:defaultTabStops><sf:number sfa:number="28.34646" sfa:type="f"/></sf:defaultTabStops><sf:dropCap/><sf:firstTopicNumber/><sf:fontName/><sf:strikethru/><sf:baselineShift/><sf:lineSpacing/><sf:textShadow/><sf:underlineColor><sf:null/></sf:underlineColor><sf:kerning/><sf:strikethruWidth/><sf:fontColor><sf:color xsi:type="sfa:calibrated-rgb-color-type" sfa:r="0" sfa:g="0" sfa:b="0" sfa:a="1"/></sf:fontColor><sf:textBackground><sf:null/></sf:textBackground><sf:paragraphRuleWidth/><sf:paragraphStroke><sf:null/></sf:paragraphStroke><sf:bold><sf:number sfa:number="1" sfa:type="c"/></sf:bold><sf:tracking/><sf:ligatures/><sf:language><sf:null/></sf:language><sf:followingParagraphStyle><sf:null/></sf:followingParagraphStyle><sf:outline/><sf:strikethruColor><sf:null/></sf:strikethruColor><sf:italic/><sf:SLTOCEntryStyle><sf:null/></sf:SLTOCEntryStyle><sf:word_underline/><sf:widowControl/><sf:rightIndent/><sf:atsuFontFeatures/><sf:tabs><sf:tabs sfa:ID="SFWPTabs-8"><sf:tabstop sf:pos="481.61416625976562" sf:align="right"/></sf:tabs></sf:tabs><sf:superscript/><sf:paragraphBorderType/><sf:hyphenate/><sf:hidden/><sf:pageBreakBefore/><sf:SLTOCEnabledStyles><sf:null/></sf:SLTOCEnabledStyles><sf:SLTOCDisabledStyles><sf:null/></sf:SLTOCDisabledStyles><sf:paragraphFill><sf:null/></sf:paragraphFill><sf:SLTOCShowPageNumber/><sf:keepWithNext/><sf:spaceBefore><sf:number sfa:number="12" sfa:type="f"/></sf:spaceBefore><sf:outlineColor><sf:null/></sf:outlineColor><sf:paragraphRuleOffset/><sf:capitalization/><sf:leftIndent/><sf:firstLineIndent/></sf:property-map></sf:tocstyle><sf:paragraphstyle sfa:ID="SFWPParagraphStyle-121" sf:name="article-titleabbrev" sf:ident="paragraph-style-7"><sf:property-map><sf:fontSize><sf:number sfa:number="16" sfa:type="f"/></sf:fontSize><sf:word_strikethrough/><sf:spaceAfter/><sf:alignment/><sf:keepLinesTogether/><sf:listStyle><sf:liststyle-ref sfa:IDREF="SFWPListStyle-2"/></sf:listStyle><sf:outlineLevel/><sf:firstTopicNumber/><sf:underline/><sf:defaultTabStops><sf:number sfa:number="28.34646" sfa:type="f"/></sf:defaultTabStops><sf:tocStyle><sf:tocstyle-ref sfa:IDREF="SLTOCParagraphStyle-3"/></sf:tocStyle><sf:dropCap/><sf:underlineWidth/><sf:fontName><sf:string sfa:string="Helvetica-Bold"/></sf:fontName><sf:strikethru/><sf:baselineShift/><sf:lineSpacing/><sf:textShadow/><sf:underlineColor><sf:null/></sf:underlineColor><sf:showInTOC><sf:number sfa:number="1" sfa:type="c"/></sf:showInTOC><sf:kerning/><sf:strikethruWidth/><sf:fontColor/><sf:textBackground><sf:null/></sf:textBackground><sf:paragraphRuleWidth/><sf:paragraphStroke><sf:null/></sf:paragraphStroke><sf:bold><sf:number sfa:number="1" sfa:type="c"/></sf:bold><sf:tracking/><sf:ligatures/><sf:language><sf:null/></sf:language><sf:followingParagraphStyle><sf:paragraphstyle-ref sfa:IDREF="SFWPParagraphStyle-7"/></sf:followingParagraphStyle><sf:outline/><sf:strikethruColor><sf:null/></sf:strikethruColor><sf:italic/><sf:word_underline/><sf:widowControl/><sf:rightIndent/><sf:atsuFontFeatures/><sf:tabs/><sf:superscript/><sf:paragraphBorderType/><sf:hyphenate/><sf:hidden/><sf:pageBreakBefore/><sf:paragraphFill><sf:null/></sf:paragraphFill><sf:spaceBefore><sf:number sfa:number="12" sfa:type="f"/></sf:spaceBefore><sf:keepWithNext><sf:number sfa:number="1" sfa:type="c"/></sf:keepWithNext><sf:outlineColor><sf:null/></sf:outlineColor><sf:paragraphRuleOffset/><sf:capitalization/><sf:leftIndent/><sf:firstLineIndent/></sf:property-map></sf:paragraphstyle><sf:paragraphstyle sfa:ID="SFWPParagraphStyle-122" sf:name="orderedlist4" sf:ident="paragraph-style-102"><sf:property-map><sf:fontSize/><sf:word_strikethrough/><sf:spaceAfter/><sf:alignment/><sf:keepLinesTogether/><sf:listStyle><sf:liststyle sfa:ID="SFWPListStyle-16" sf:parent-ident="list-style-2"><sf:property-map><sf:listTextIndents><sf:array sfa:ID="NSArray-59"><sf:number sfa:number="14.17323" sfa:type="f"/><sf:number sfa:number="9" sfa:type="f"/><sf:number sfa:number="9" sfa:type="f"/><sf:number sfa:number="9" sfa:type="f"/><sf:number sfa:number="9" sfa:type="f"/><sf:number sfa:number="9" sfa:type="f"/><sf:number sfa:number="9" sfa:type="f"/><sf:number sfa:number="9" sfa:type="f"/><sf:number sfa:number="9" sfa:type="f"/></sf:array></sf:listTextIndents><sf:listLabelGeometries><sf:array sfa:ID="NSArray-60"><sf:list-label-geometry sfa:ID="SFWPListLabelGeometry-126" sf:align="left" sf:scale="1" sf:offset="-1" sf:scale-with-text="true"/><sf:list-label-geometry sfa:ID="SFWPListLabelGeometry-127" sf:align="left" sf:scale="1" sf:offset="-1" sf:scale-with-text="true"/><sf:list-label-geometry sfa:ID="SFWPListLabelGeometry-128" sf:align="left" sf:scale="1" sf:offset="-1" sf:scale-with-text="true"/><sf:list-label-geometry sfa:ID="SFWPListLabelGeometry-129" sf:align="left" sf:scale="1" sf:offset="-1" sf:scale-with-text="true"/><sf:list-label-geometry sfa:ID="SFWPListLabelGeometry-130" sf:align="left" sf:scale="1" sf:offset="-1" sf:scale-with-text="true"/><sf:list-label-geometry sfa:ID="SFWPListLabelGeometry-131" sf:align="left" sf:scale="1" sf:offset="-1" sf:scale-with-text="true"/><sf:list-label-geometry sfa:ID="SFWPListLabelGeometry-132" sf:align="left" sf:scale="1" sf:offset="-1" sf:scale-with-text="true"/><sf:list-label-geometry sfa:ID="SFWPListLabelGeometry-133" sf:align="left" sf:scale="1" sf:offset="-1" sf:scale-with-text="true"/><sf:list-label-geometry sfa:ID="SFWPListLabelGeometry-134" sf:align="left" sf:scale="1" sf:offset="-1" sf:scale-with-text="true"/></sf:array></sf:listLabelGeometries><sf:listLabelIndents><sf:array sfa:ID="NSArray-61"><sf:number sfa:number="42.51968" sfa:type="f"/><sf:number sfa:number="18" sfa:type="f"/><sf:number sfa:number="36" sfa:type="f"/><sf:number sfa:number="54" sfa:type="f"/><sf:number sfa:number="72" sfa:type="f"/><sf:number sfa:number="90" sfa:type="f"/><sf:number sfa:number="108" sfa:type="f"/><sf:number sfa:number="126" sfa:type="f"/><sf:number sfa:number="144" sfa:type="f"/></sf:array></sf:listLabelIndents><sf:listLabelTypes><sf:array sfa:ID="NSArray-62"><sf:list-label-typeinfo sfa:ID="SFWPListLabelTypeInfo-126" sf:type="text"><sf:text-label sfa:ID="SFWPTextLabelFormat-92" sf:type="lower-roman" sf:format="%L." sf:first="1"/></sf:list-label-typeinfo><sf:list-label-typeinfo sfa:ID="SFWPListLabelTypeInfo-127" sf:type="text"><sf:text-label sfa:ID="SFWPTextLabelFormat-93" sf:type="bullet" sf:format="&#x2022;" sf:first="0"/></sf:list-label-typeinfo><sf:list-label-typeinfo sfa:ID="SFWPListLabelTypeInfo-128" sf:type="text"><sf:text-label sfa:ID="SFWPTextLabelFormat-94" sf:type="bullet" sf:format="&#x2022;" sf:first="0"/></sf:list-label-typeinfo><sf:list-label-typeinfo sfa:ID="SFWPListLabelTypeInfo-129" sf:type="text"><sf:text-label sfa:ID="SFWPTextLabelFormat-95" sf:type="bullet" sf:format="&#x2022;" sf:first="0"/></sf:list-label-typeinfo><sf:list-label-typeinfo sfa:ID="SFWPListLabelTypeInfo-130" sf:type="text"><sf:text-label sfa:ID="SFWPTextLabelFormat-96" sf:type="bullet" sf:format="&#x2022;" sf:first="0"/></sf:list-label-typeinfo><sf:list-label-typeinfo sfa:ID="SFWPListLabelTypeInfo-131" sf:type="text"><sf:text-label sfa:ID="SFWPTextLabelFormat-97" sf:type="bullet" sf:format="&#x2022;" sf:first="0"/></sf:list-label-typeinfo><sf:list-label-typeinfo sfa:ID="SFWPListLabelTypeInfo-132" sf:type="text"><sf:text-label sfa:ID="SFWPTextLabelFormat-98" sf:type="bullet" sf:format="&#x2022;" sf:first="0"/></sf:list-label-typeinfo><sf:list-label-typeinfo sfa:ID="SFWPListLabelTypeInfo-133" sf:type="text"><sf:text-label sfa:ID="SFWPTextLabelFormat-99" sf:type="bullet" sf:format="&#x2022;" sf:first="0"/></sf:list-label-typeinfo><sf:list-label-typeinfo sfa:ID="SFWPListLabelTypeInfo-134" sf:type="text"><sf:text-label sfa:ID="SFWPTextLabelFormat-100" sf:type="bullet" sf:format="&#x2022;" sf:first="0"/></sf:list-label-typeinfo></sf:array></sf:listLabelTypes></sf:property-map></sf:liststyle></sf:listStyle><sf:outlineLevel/><sf:firstTopicNumber/><sf:underline/><sf:defaultTabStops><sf:number sfa:number="28.34646" sfa:type="f"/></sf:defaultTabStops><sf:underlineWidth/><sf:dropCap/><sf:fontName/><sf:strikethru/><sf:baselineShift/><sf:lineSpacing/><sf:textShadow/><sf:underlineColor><sf:null/></sf:underlineColor><sf:kerning/><sf:strikethruWidth/><sf:fontColor/><sf:textBackground><sf:null/></sf:textBackground><sf:paragraphRuleWidth/><sf:paragraphStroke><sf:null/></sf:paragraphStroke><sf:bold/><sf:tracking/><sf:ligatures/><sf:language><sf:null/></sf:language><sf:followingParagraphStyle><sf:null/></sf:followingParagraphStyle><sf:outline/><sf:strikethruColor><sf:null/></sf:strikethruColor><sf:italic/><sf:word_underline/><sf:widowControl/><sf:rightIndent/><sf:atsuFontFeatures/><sf:tabs/><sf:superscript/><sf:paragraphBorderType/><sf:hyphenate/><sf:hidden/><sf:pageBreakBefore/><sf:paragraphFill><sf:null/></sf:paragraphFill><sf:spaceBefore/><sf:keepWithNext/><sf:outlineColor><sf:null/></sf:outlineColor><sf:paragraphRuleOffset/><sf:capitalization/><sf:leftIndent/><sf:firstLineIndent/></sf:property-map></sf:paragraphstyle><sf:graphic-style sfa:ID="SFDGraphicStyle-33" sf:name="graphic-shape-style-default 10" sf:ident="graphic-shape-style-default-9" sf:parent-ident="graphic-shape-style-default"><sf:property-map><sf:layoutStyle><sf:null/></sf:layoutStyle><sf:shadow><sf:shadow-ref sfa:IDREF="SFRShadow-0"/></sf:shadow><sf:fill><sf:color xsi:type="sfa:calibrated-rgb-color-type" sfa:r="0.41568627953529358" sfa:g="0.66274511814117432" sfa:b="0.39215686917304993" sfa:a="1"/></sf:fill></sf:property-map></sf:graphic-style><sf:graphic-style sfa:ID="SFDGraphicStyle-34" sf:name="graphic-textbox-style-default 7" sf:ident="graphic-textbox-style-default-6" sf:parent-ident="graphic-textbox-style-default"><sf:property-map><sf:layoutStyle><sf:null/></sf:layoutStyle><sf:stroke><sf:stroke sfa:ID="SFRStroke-63" sf:miter-limit="4" sf:width="1" sf:cap="butt" sf:join="miter"><sf:color xsi:type="sfa:calibrated-white-color-type" sfa:w="0" sfa:a="1"/><sf:pattern sfa:ID="SFRStrokePattern-58" sf:phase="0" sf:type="empty"><sf:pattern/></sf:pattern></sf:stroke></sf:stroke><sf:fill><sf:null/></sf:fill></sf:property-map></sf:graphic-style><sf:paragraphstyle sfa:ID="SFWPParagraphStyle-123" sf:name="simplesect-title" sf:ident="paragraph-style-56"><sf:property-map><sf:fontSize><sf:number sfa:number="16" sfa:type="f"/></sf:fontSize><sf:word_strikethrough/><sf:spaceAfter/><sf:alignment/><sf:keepLinesTogether/><sf:listStyle><sf:liststyle-ref sfa:IDREF="SFWPListStyle-2"/></sf:listStyle><sf:outlineLevel/><sf:firstTopicNumber/><sf:underline/><sf:defaultTabStops><sf:number sfa:number="28.34646" sfa:type="f"/></sf:defaultTabStops><sf:tocStyle><sf:tocstyle-ref sfa:IDREF="SLTOCParagraphStyle-3"/></sf:tocStyle><sf:dropCap/><sf:underlineWidth/><sf:fontName><sf:string sfa:string="Helvetica-Bold"/></sf:fontName><sf:strikethru/><sf:baselineShift/><sf:lineSpacing/><sf:textShadow/><sf:underlineColor><sf:null/></sf:underlineColor><sf:showInTOC><sf:number sfa:number="1" sfa:type="c"/></sf:showInTOC><sf:kerning/><sf:strikethruWidth/><sf:fontColor/><sf:textBackground><sf:null/></sf:textBackground><sf:paragraphRuleWidth/><sf:paragraphStroke><sf:null/></sf:paragraphStroke><sf:bold><sf:number sfa:number="1" sfa:type="c"/></sf:bold><sf:tracking/><sf:ligatures/><sf:language><sf:null/></sf:language><sf:followingParagraphStyle><sf:paragraphstyle-ref sfa:IDREF="SFWPParagraphStyle-7"/></sf:followingParagraphStyle><sf:outline/><sf:strikethruColor><sf:null/></sf:strikethruColor><sf:italic/><sf:word_underline/><sf:widowControl/><sf:rightIndent/><sf:atsuFontFeatures/><sf:tabs/><sf:superscript/><sf:paragraphBorderType/><sf:hyphenate/><sf:hidden/><sf:pageBreakBefore/><sf:paragraphFill><sf:null/></sf:paragraphFill><sf:spaceBefore><sf:number sfa:number="12" sfa:type="f"/></sf:spaceBefore><sf:keepWithNext><sf:number sfa:number="1" sfa:type="c"/></sf:keepWithNext><sf:outlineColor><sf:null/></sf:outlineColor><sf:paragraphRuleOffset/><sf:capitalization/><sf:leftIndent/><sf:firstLineIndent/></sf:property-map></sf:paragraphstyle></sf:styles><sf:anon-styles><sf:layoutstyle-ref sfa:IDREF="SFWPLayoutStyle-7"/><sf:layoutstyle-ref sfa:IDREF="SFWPLayoutStyle-9"/><sf:liststyle-ref sfa:IDREF="SFWPListStyle-16"/><sf:liststyle-ref sfa:IDREF="SFWPListStyle-9"/><sf:liststyle-ref sfa:IDREF="SFWPListStyle-12"/><sf:liststyle-ref sfa:IDREF="SFWPListStyle-10"/><sf:liststyle-ref sfa:IDREF="SFWPListStyle-3"/><sf:layoutstyle-ref sfa:IDREF="SFWPLayoutStyle-5"/><sf:liststyle-ref sfa:IDREF="SFWPListStyle-7"/><sf:characterstyle-ref sfa:IDREF="SFWPCharacterStyle-4"/><sf:liststyle-ref sfa:IDREF="SFWPListStyle-11"/><sf:liststyle-ref sfa:IDREF="SFWPListStyle-8"/><sf:layoutstyle-ref sfa:IDREF="SFWPLayoutStyle-8"/><sf:paragraphstyle-ref sfa:IDREF="SFWPParagraphStyle-13"/><sf:liststyle-ref sfa:IDREF="SFWPListStyle-5"/></sf:anon-styles></sl:stylesheet><sf:calc-engine sfa:ID="SFTCalculationEngine-0"/><sf:headers><sf:header sf:name="SFWPDefaultEvenHeaderIdentifier"><sf:text-storage sfa:ID="SFWPStorage-1" sf:kind="header"><sf:stylesheet-ref sfa:IDREF="SFSStylesheet-1"/><sf:text-body><sf:p sf:style="paragraph-style-37"/></sf:text-body></sf:text-storage></sf:header><sf:header sf:name="SFWPDefaultOddHeaderIdentifier"><sf:text-storage sfa:ID="SFWPStorage-2" sf:kind="header"><sf:stylesheet-ref sfa:IDREF="SFSStylesheet-1"/><sf:text-body><sf:p sf:style="paragraph-style-37"/></sf:text-body></sf:text-storage></sf:header><sf:header sf:name="SFWPDefaultFirstHeaderIdentifier"><sf:text-storage sfa:ID="SFWPStorage-3" sf:kind="header"><sf:stylesheet-ref sfa:IDREF="SFSStylesheet-1"/><sf:text-body><sf:p sf:style="paragraph-style-37"/></sf:text-body></sf:text-storage></sf:header></sf:headers><sf:footers><sf:footer sf:name="SFWPDefaultEvenFooterIdentifier"><sf:text-storage sfa:ID="SFWPStorage-4" sf:kind="header"><sf:stylesheet-ref sfa:IDREF="SFSStylesheet-1"/><sf:text-body><sf:p sf:style="paragraph-style-37"/></sf:text-body></sf:text-storage></sf:footer><sf:footer sf:name="SFWPDefaultOddFooterIdentifier"><sf:text-storage sfa:ID="SFWPStorage-5" sf:kind="header"><sf:stylesheet-ref sfa:IDREF="SFSStylesheet-1"/><sf:text-body><sf:p sf:style="paragraph-style-37"/></sf:text-body></sf:text-storage></sf:footer><sf:footer sf:name="SFWPDefaultFirstFooterIdentifier"><sf:text-storage sfa:ID="SFWPStorage-6" sf:kind="header"><sf:stylesheet-ref sfa:IDREF="SFSStylesheet-1"/><sf:text-body><sf:p sf:style="paragraph-style-37"/></sf:text-body></sf:text-storage></sf:footer></sf:footers><sf:text-storage sf:kind="body" sfa:ID="SFWPStorage-7"><sf:stylesheet-ref sfa:IDREF="SFSStylesheet-1"/><sf:text-body><sf:page-start sf:page-index="0"/><sf:container-hint sf:page-index="0" sf:cindex="0" sf:sindex="0" sf:lindex="0" sf:frame-x="56.692913055419922" sf:frame-y="57" sf:frame-w="481.61416625976562" sf:frame-h="714" sf:anchor-loc="0"/><sf:section sf:name="Chapter 1" sf:style="section-style-0"><sf:layout sf:style="layout-style-20"><sf:p sf:style="paragraph-style-38">Document Template<sf:br/></sf:p><sf:p sf:style="paragraph-style-32"><sf:br/></sf:p><sf:p sf:style="paragraph-style-32" sf:restart-list="true">Insert content here.</sf:p></sf:layout></sf:section><sf:insertion-point/></sf:text-body></sf:text-storage><sl:window-configs sl:layout-version="5"><sl:window-config sl:frame="31 50 743 828 0 0 1440 878 " sl:show-ruler="true" sl:show-sidebar="true" sl:page-scale="1.25" sl:sidebar-paragraph-pct="0.5" sl:sidebar-character-pct="0.5" sl:sidebar-list-pct="0"><sl:selection><sf:wp-selection sfa:ID="SLSelectionObjectWP-0"><sf:text-storage-ref sfa:IDREF="SFWPStorage-7"/></sf:wp-selection></sl:selection></sl:window-config></sl:window-configs></sl:document>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/roundtrip/template.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/roundtrip/template.xml
new file mode 100644
index 0000000..e36a7df
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/roundtrip/template.xml
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<?mso-application progid="Word.Document"?>
+<w:wordDocument xmlns:w="http://schemas.microsoft.com/office/word/2003/wordml" xmlns:v="urn:schemas-microsoft-com:vml" xmlns:w10="urn:schemas-microsoft-com:office:word" xmlns:sl="http://schemas.microsoft.com/schemaLibrary/2003/core" xmlns:aml="http://schemas.microsoft.com/aml/2001/core" xmlns:wx="http://schemas.microsoft.com/office/word/2003/auxHint" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:dt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882" xmlns:wsp="http://schemas.microsoft.com/office/word/2003/wordml/sp2" xmlns:ns0="http://schemas.openxmlformats.org/markup-compatibility/2006" w:macrosPresent="no" w:embeddedObjPresent="no" w:ocxPresent="no" xml:space="preserve"><w:ignoreElements w:val="http://schemas.microsoft.com/office/word/2003/wordml/sp2"/><o:DocumentProperties><o:Title>This document left intentionally blank</o:Title><o:Author>Steve Ball</o:Author><o:LastAuthor>Steve Ball</o:LastAuthor><o:Revision>15</o:Revision><o:TotalTime>10470</o:TotalTime><o:Created>2007-08-21T22:03:00Z</o:Created><o:LastSaved>2008-10-08T23:57:00Z</o:LastSaved><o:Pages>1</o:Pages><o:Words>7</o:Words><o:Characters>45</o:Characters><o:Company>Explain</o:Company><o:Lines>1</o:Lines><o:Paragraphs>1</o:Paragraphs><o:CharactersWithSpaces>51</o:CharactersWithSpaces><o:Version>11.0000</o:Version></o:DocumentProperties><w:fonts><w:defaultFonts w:ascii="Times New Roman" w:fareast="Times New Roman" w:h-ansi="Times New Roman" w:cs="Times New Roman"/><w:font w:name="Wingdings"><w:panose-1 w:val="05000000000000000000"/><w:charset w:val="02"/><w:family w:val="Auto"/><w:pitch w:val="variable"/><w:sig w:usb-0="00000000" w:usb-1="10000000" w:usb-2="00000000" w:usb-3="00000000" w:csb-0="80000000" w:csb-1="00000000"/></w:font><w:font w:name="Arial Narrow"><w:panose-1 w:val="020B0606020202030204"/><w:charset w:val="00"/><w:family w:val="Swiss"/><w:pitch w:val="variable"/><w:sig w:usb-0="00000287" w:usb-1="00000800" w:usb-2="00000000" w:usb-3="00000000" w:csb-0="0000009F" w:csb-1="00000000"/></w:font><w:font w:name="Lucida Sans Unicode"><w:panose-1 w:val="020B0602030504020204"/><w:charset w:val="00"/><w:family w:val="Swiss"/><w:pitch w:val="variable"/><w:sig w:usb-0="80001AFF" w:usb-1="0000396B" w:usb-2="00000000" w:usb-3="00000000" w:csb-0="0000003F" w:csb-1="00000000"/></w:font><w:font w:name="Palatino"><w:panose-1 w:val="00000000000000000000"/><w:charset w:val="00"/><w:family w:val="Roman"/><w:notTrueType/><w:pitch w:val="variable"/><w:sig w:usb-0="00000003" w:usb-1="00000000" w:usb-2="00000000" w:usb-3="00000000" w:csb-0="00000001" w:csb-1="00000000"/></w:font><w:font w:name="Monaco"><w:panose-1 w:val="00000000000000000000"/><w:charset w:val="00"/><w:family w:val="Modern"/><w:notTrueType/><w:pitch w:val="fixed"/><w:sig w:usb-0="00000003" w:usb-1="00000000" w:usb-2="00000000" w:usb-3="00000000" w:csb-0="00000001" w:csb-1="00000000"/></w:font></w:fonts><w:lists><w:listDef w:listDefId="0"><w:lsid w:val="06B32B68"/><w:plt w:val="HybridMultilevel"/><w:tmpl w:val="BA94520E"/><w:lvl w:ilvl="0" w:tplc="43580F94"><w:start w:val="1"/><w:nfc w:val="23"/><w:pStyle w:val="itemizedlist1"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="720"/></w:tabs><w:ind w:left="720" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Symbol" w:h-ansi="Symbol" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1" w:tplc="04090003" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="o"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Courier New" w:h-ansi="Courier New" w:cs="Courier New" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2" w:tplc="04090005" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3" w:tplc="04090001" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Symbol" w:h-ansi="Symbol" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4" w:tplc="04090003" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="o"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3600"/></w:tabs><w:ind w:left="3600" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Courier New" w:h-ansi="Courier New" w:cs="Courier New" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5" w:tplc="04090005" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4320"/></w:tabs><w:ind w:left="4320" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="6" w:tplc="04090001" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5040"/></w:tabs><w:ind w:left="5040" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Symbol" w:h-ansi="Symbol" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7" w:tplc="04090003" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="o"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5760"/></w:tabs><w:ind w:left="5760" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Courier New" w:h-ansi="Courier New" w:cs="Courier New" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8" w:tplc="04090005" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6480"/></w:tabs><w:ind w:left="6480" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="1"><w:lsid w:val="08CF1663"/><w:plt w:val="Multilevel"/><w:tmpl w:val="0409001D"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:lvlText w:val="%1)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="360"/></w:tabs><w:ind w:left="360" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%2)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="720"/></w:tabs><w:ind w:left="720" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%3)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1080"/></w:tabs><w:ind w:left="1080" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:lvlText w:val="(%4)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="(%5)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1800"/></w:tabs><w:ind w:left="1800" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%6)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2520"/></w:tabs><w:ind w:left="2520" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3240"/></w:tabs><w:ind w:left="3240" w:hanging="360"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="2"><w:lsid w:val="10346111"/><w:plt w:val="HybridMultilevel"/><w:tmpl w:val="4A38D8EA"/><w:lvl w:ilvl="0" w:tplc="BD40B0B8"><w:start w:val="1"/><w:nfc w:val="23"/><w:pStyle w:val="itemizedlist3"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="720"/></w:tabs><w:ind w:left="720" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1" w:tplc="04090003" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="o"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Courier New" w:h-ansi="Courier New" w:cs="Courier New" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2" w:tplc="04090005" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3" w:tplc="04090001" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Symbol" w:h-ansi="Symbol" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4" w:tplc="04090003" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="o"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3600"/></w:tabs><w:ind w:left="3600" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Courier New" w:h-ansi="Courier New" w:cs="Courier New" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5" w:tplc="04090005" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4320"/></w:tabs><w:ind w:left="4320" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="6" w:tplc="04090001" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5040"/></w:tabs><w:ind w:left="5040" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Symbol" w:h-ansi="Symbol" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7" w:tplc="04090003" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="o"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5760"/></w:tabs><w:ind w:left="5760" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Courier New" w:h-ansi="Courier New" w:cs="Courier New" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8" w:tplc="04090005" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6480"/></w:tabs><w:ind w:left="6480" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="3"><w:lsid w:val="121A2880"/><w:plt w:val="Multilevel"/><w:tmpl w:val="0409001D"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:lvlText w:val="%1)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="360"/></w:tabs><w:ind w:left="360" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%2)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="720"/></w:tabs><w:ind w:left="720" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%3)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1080"/></w:tabs><w:ind w:left="1080" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:lvlText w:val="(%4)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="(%5)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1800"/></w:tabs><w:ind w:left="1800" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%6)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2520"/></w:tabs><w:ind w:left="2520" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3240"/></w:tabs><w:ind w:left="3240" w:hanging="360"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="4"><w:lsid w:val="1341553B"/><w:plt w:val="Multilevel"/><w:tmpl w:val="0409001D"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:lvlText w:val="%1)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="360"/></w:tabs><w:ind w:left="360" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%2)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="720"/></w:tabs><w:ind w:left="720" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%3)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1080"/></w:tabs><w:ind w:left="1080" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:lvlText w:val="(%4)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="(%5)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1800"/></w:tabs><w:ind w:left="1800" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%6)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2520"/></w:tabs><w:ind w:left="2520" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3240"/></w:tabs><w:ind w:left="3240" w:hanging="360"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="5"><w:lsid w:val="38E8493E"/><w:plt w:val="HybridMultilevel"/><w:tmpl w:val="17E4C930"/><w:lvl w:ilvl="0" w:tplc="2F90EBE6"><w:start w:val="1"/><w:nfc w:val="23"/><w:pStyle w:val="note"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Symbol" w:h-ansi="Symbol" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1" w:tplc="04090003" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="o"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Courier New" w:h-ansi="Courier New" w:cs="Courier New" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2" w:tplc="04090005" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3" w:tplc="04090001" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Symbol" w:h-ansi="Symbol" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4" w:tplc="04090003" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="o"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3600"/></w:tabs><w:ind w:left="3600" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Courier New" w:h-ansi="Courier New" w:cs="Courier New" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5" w:tplc="04090005" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4320"/></w:tabs><w:ind w:left="4320" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="6" w:tplc="04090001" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5040"/></w:tabs><w:ind w:left="5040" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Symbol" w:h-ansi="Symbol" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7" w:tplc="04090003" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="o"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5760"/></w:tabs><w:ind w:left="5760" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Courier New" w:h-ansi="Courier New" w:cs="Courier New" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8" w:tplc="04090005" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6480"/></w:tabs><w:ind w:left="6480" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="6"><w:lsid w:val="3FD63D4B"/><w:plt w:val="HybridMultilevel"/><w:tmpl w:val="49AE2440"/><w:lvl w:ilvl="0" w:tplc="0C405940"><w:start w:val="1"/><w:pStyle w:val="orderedlist4"/><w:lvlText w:val="%1)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="720"/></w:tabs><w:ind w:left="720" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="1" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%2."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="2" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%3."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="3" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%4."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="4" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%5."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3600"/></w:tabs><w:ind w:left="3600" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%6."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4320"/></w:tabs><w:ind w:left="4320" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="6" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5040"/></w:tabs><w:ind w:left="5040" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5760"/></w:tabs><w:ind w:left="5760" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6480"/></w:tabs><w:ind w:left="6480" w:hanging="180"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="7"><w:lsid w:val="4576760C"/><w:plt w:val="Multilevel"/><w:tmpl w:val="0409001D"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:lvlText w:val="%1)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="360"/></w:tabs><w:ind w:left="360" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%2)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="720"/></w:tabs><w:ind w:left="720" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%3)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1080"/></w:tabs><w:ind w:left="1080" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:lvlText w:val="(%4)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="(%5)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1800"/></w:tabs><w:ind w:left="1800" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%6)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2520"/></w:tabs><w:ind w:left="2520" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3240"/></w:tabs><w:ind w:left="3240" w:hanging="360"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="8"><w:lsid w:val="4AE86026"/><w:plt w:val="HybridMultilevel"/><w:tmpl w:val="99E0A2DA"/><w:lvl w:ilvl="0" w:tplc="F4F29E32"><w:start w:val="1"/><w:nfc w:val="23"/><w:pStyle w:val="itemizedlist4"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="720"/></w:tabs><w:ind w:left="720" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1" w:tplc="04090003" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="o"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Courier New" w:h-ansi="Courier New" w:cs="Courier New" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2" w:tplc="04090005" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3" w:tplc="04090001" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Symbol" w:h-ansi="Symbol" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4" w:tplc="04090003" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="o"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3600"/></w:tabs><w:ind w:left="3600" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Courier New" w:h-ansi="Courier New" w:cs="Courier New" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5" w:tplc="04090005" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4320"/></w:tabs><w:ind w:left="4320" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="6" w:tplc="04090001" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5040"/></w:tabs><w:ind w:left="5040" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Symbol" w:h-ansi="Symbol" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7" w:tplc="04090003" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="o"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5760"/></w:tabs><w:ind w:left="5760" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Courier New" w:h-ansi="Courier New" w:cs="Courier New" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8" w:tplc="04090005" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6480"/></w:tabs><w:ind w:left="6480" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/></w:rPr></w:lvl></w:listDef><w:listDef w:listDefId="9"><w:lsid w:val="4BD72CD9"/><w:plt w:val="Multilevel"/><w:tmpl w:val="0409001D"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="360"/></w:tabs><w:ind w:left="360" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Symbol" w:h-ansi="Symbol" w:hint="default"/><w:color w:val="auto"/></w:rPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%2)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="720"/></w:tabs><w:ind w:left="720" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%3)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1080"/></w:tabs><w:ind w:left="1080" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:lvlText w:val="(%4)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="(%5)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1800"/></w:tabs><w:ind w:left="1800" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%6)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2520"/></w:tabs><w:ind w:left="2520" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3240"/></w:tabs><w:ind w:left="3240" w:hanging="360"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="10"><w:lsid w:val="50B87542"/><w:plt w:val="Multilevel"/><w:tmpl w:val="0409001D"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="360"/></w:tabs><w:ind w:left="360" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Symbol" w:h-ansi="Symbol" w:hint="default"/><w:color w:val="auto"/></w:rPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%2)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="720"/></w:tabs><w:ind w:left="720" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%3)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1080"/></w:tabs><w:ind w:left="1080" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:lvlText w:val="(%4)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="(%5)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1800"/></w:tabs><w:ind w:left="1800" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%6)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2520"/></w:tabs><w:ind w:left="2520" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3240"/></w:tabs><w:ind w:left="3240" w:hanging="360"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="11"><w:lsid w:val="5570737B"/><w:plt w:val="Multilevel"/><w:tmpl w:val="0409001D"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:lvlText w:val="%1)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="360"/></w:tabs><w:ind w:left="360" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%2)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="720"/></w:tabs><w:ind w:left="720" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%3)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1080"/></w:tabs><w:ind w:left="1080" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%4)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="(%5)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1800"/></w:tabs><w:ind w:left="1800" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%6)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2520"/></w:tabs><w:ind w:left="2520" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3240"/></w:tabs><w:ind w:left="3240" w:hanging="360"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="12"><w:lsid w:val="59A72500"/><w:plt w:val="Multilevel"/><w:tmpl w:val="0409001D"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:lvlText w:val="%1)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="360"/></w:tabs><w:ind w:left="360" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%2)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="720"/></w:tabs><w:ind w:left="720" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%3)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1080"/></w:tabs><w:ind w:left="1080" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:lvlText w:val="(%4)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="(%5)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1800"/></w:tabs><w:ind w:left="1800" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%6)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2520"/></w:tabs><w:ind w:left="2520" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3240"/></w:tabs><w:ind w:left="3240" w:hanging="360"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="13"><w:lsid w:val="5F8E0F88"/><w:plt w:val="Multilevel"/><w:tmpl w:val="0409001D"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:lvlText w:val="%1)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="360"/></w:tabs><w:ind w:left="360" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="720"/></w:tabs><w:ind w:left="720" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Symbol" w:h-ansi="Symbol" w:hint="default"/><w:color w:val="auto"/></w:rPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%3)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1080"/></w:tabs><w:ind w:left="1080" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:lvlText w:val="(%4)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="(%5)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1800"/></w:tabs><w:ind w:left="1800" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%6)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2520"/></w:tabs><w:ind w:left="2520" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3240"/></w:tabs><w:ind w:left="3240" w:hanging="360"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="14"><w:lsid w:val="63A74F9B"/><w:plt w:val="HybridMultilevel"/><w:tmpl w:val="4BA09C26"/><w:lvl w:ilvl="0" w:tplc="069ABFBE"><w:start w:val="1"/><w:lvlText w:val="%1."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="720"/></w:tabs><w:ind w:left="720" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="1" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%2."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="2" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%3."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="3" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%4."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="4" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%5."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3600"/></w:tabs><w:ind w:left="3600" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%6."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4320"/></w:tabs><w:ind w:left="4320" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="6" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5040"/></w:tabs><w:ind w:left="5040" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5760"/></w:tabs><w:ind w:left="5760" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6480"/></w:tabs><w:ind w:left="6480" w:hanging="180"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="15"><w:lsid w:val="64590623"/><w:plt w:val="HybridMultilevel"/><w:tmpl w:val="FF22825E"/><w:lvl w:ilvl="0" w:tplc="D1DEF1CE"><w:start w:val="1"/><w:nfc w:val="1"/><w:pStyle w:val="orderedlist3"/><w:lvlText w:val="%1."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1800"/></w:tabs><w:ind w:left="1800" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="1" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%2."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2520"/></w:tabs><w:ind w:left="2520" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="2" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%3."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3240"/></w:tabs><w:ind w:left="3240" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="3" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%4."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3960"/></w:tabs><w:ind w:left="3960" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="4" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%5."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4680"/></w:tabs><w:ind w:left="4680" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%6."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5400"/></w:tabs><w:ind w:left="5400" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="6" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6120"/></w:tabs><w:ind w:left="6120" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6840"/></w:tabs><w:ind w:left="6840" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="7560"/></w:tabs><w:ind w:left="7560" w:hanging="180"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="16"><w:lsid w:val="69727D75"/><w:plt w:val="Multilevel"/><w:tmpl w:val="0409001D"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:lvlText w:val="%1)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="360"/></w:tabs><w:ind w:left="360" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%2)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="720"/></w:tabs><w:ind w:left="720" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%3)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1080"/></w:tabs><w:ind w:left="1080" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:lvlText w:val="(%4)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="(%5)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1800"/></w:tabs><w:ind w:left="1800" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%6)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2520"/></w:tabs><w:ind w:left="2520" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3240"/></w:tabs><w:ind w:left="3240" w:hanging="360"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="17"><w:lsid w:val="7375110D"/><w:plt w:val="Multilevel"/><w:tmpl w:val="0409001D"/><w:lvl w:ilvl="0"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="360"/></w:tabs><w:ind w:left="360" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Symbol" w:h-ansi="Symbol" w:hint="default"/><w:color w:val="auto"/></w:rPr></w:lvl><w:lvl w:ilvl="1"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%2)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="720"/></w:tabs><w:ind w:left="720" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="2"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%3)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1080"/></w:tabs><w:ind w:left="1080" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="3"><w:start w:val="1"/><w:lvlText w:val="(%4)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="4"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="(%5)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1800"/></w:tabs><w:ind w:left="1800" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="(%6)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="6"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2520"/></w:tabs><w:ind w:left="2520" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3240"/></w:tabs><w:ind w:left="3240" w:hanging="360"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="18"><w:lsid w:val="78DC6A50"/><w:plt w:val="HybridMultilevel"/><w:tmpl w:val="AC00310A"/><w:lvl w:ilvl="0" w:tplc="203E5E88"><w:start w:val="1"/><w:nfc w:val="4"/><w:pStyle w:val="orderedlist2"/><w:lvlText w:val="%1)"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="720"/></w:tabs><w:ind w:left="720" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="1" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%2."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="2" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%3."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="3" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%4."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="4" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%5."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3600"/></w:tabs><w:ind w:left="3600" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%6."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4320"/></w:tabs><w:ind w:left="4320" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="6" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5040"/></w:tabs><w:ind w:left="5040" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5760"/></w:tabs><w:ind w:left="5760" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="right"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6480"/></w:tabs><w:ind w:left="6480" w:hanging="180"/></w:pPr></w:lvl></w:listDef><w:listDef w:listDefId="19"><w:lsid w:val="7FE26324"/><w:plt w:val="HybridMultilevel"/><w:tmpl w:val="54606432"/><w:lvl w:ilvl="0" w:tplc="D70A5764"><w:start w:val="1"/><w:nfc w:val="23"/><w:pStyle w:val="itemizedlist2"/><w:lvlText w:val="o"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="720"/></w:tabs><w:ind w:left="720" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Courier New" w:h-ansi="Courier New" w:cs="Courier New" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="1" w:tplc="04090003" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="o"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="1440"/></w:tabs><w:ind w:left="1440" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Courier New" w:h-ansi="Courier New" w:cs="Courier New" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="2" w:tplc="04090005" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2160"/></w:tabs><w:ind w:left="2160" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="3" w:tplc="04090001" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="2880"/></w:tabs><w:ind w:left="2880" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Symbol" w:h-ansi="Symbol" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="4" w:tplc="04090003" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="o"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="3600"/></w:tabs><w:ind w:left="3600" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Courier New" w:h-ansi="Courier New" w:cs="Courier New" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="5" w:tplc="04090005" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="4320"/></w:tabs><w:ind w:left="4320" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="6" w:tplc="04090001" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5040"/></w:tabs><w:ind w:left="5040" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Symbol" w:h-ansi="Symbol" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="7" w:tplc="04090003" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val="o"/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="5760"/></w:tabs><w:ind w:left="5760" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Courier New" w:h-ansi="Courier New" w:cs="Courier New" w:hint="default"/></w:rPr></w:lvl><w:lvl w:ilvl="8" w:tplc="04090005" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="23"/><w:lvlText w:val=""/><w:lvlJc w:val="left"/><w:pPr><w:tabs><w:tab w:val="list" w:pos="6480"/></w:tabs><w:ind w:left="6480" w:hanging="360"/></w:pPr><w:rPr><w:rFonts w:ascii="Wingdings" w:h-ansi="Wingdings" w:hint="default"/></w:rPr></w:lvl></w:listDef><w:list w:ilfo="1"><w:ilst w:val="5"/></w:list><w:list w:ilfo="2"><w:ilst w:val="17"/></w:list><w:list w:ilfo="3"><w:ilst w:val="9"/></w:list><w:list w:ilfo="4"><w:ilst w:val="13"/></w:list><w:list w:ilfo="5"><w:ilst w:val="10"/></w:list><w:list w:ilfo="6"><w:ilst w:val="7"/></w:list><w:list w:ilfo="7"><w:ilst w:val="4"/></w:list><w:list w:ilfo="8"><w:ilst w:val="1"/></w:list><w:list w:ilfo="9"><w:ilst w:val="3"/></w:list><w:list w:ilfo="10"><w:ilst w:val="16"/></w:list><w:list w:ilfo="11"><w:ilst w:val="11"/></w:list><w:list w:ilfo="12"><w:ilst w:val="14"/></w:list><w:list w:ilfo="13"><w:ilst w:val="18"/></w:list><w:list w:ilfo="14"><w:ilst w:val="15"/></w:list><w:list w:ilfo="15"><w:ilst w:val="12"/></w:list><w:list w:ilfo="16"><w:ilst w:val="6"/></w:list><w:list w:ilfo="17"><w:ilst w:val="19"/></w:list><w:list w:ilfo="18"><w:ilst w:val="2"/></w:list><w:list w:ilfo="19"><w:ilst w:val="8"/></w:list><w:list w:ilfo="20"><w:ilst w:val="0"/></w:list></w:lists><w:styles><w:versionOfBuiltInStylenames w:val="4"/><w:latentStyles w:defLockedState="on" w:latentStyleCount="156"><w:lsdException w:name="Normal" w:locked="off"/><w:lsdException w:name="footnote text" w:locked="off"/><w:lsdException w:name="annotation text" w:locked="off"/><w:lsdException w:name="footnote reference" w:locked="off"/><w:lsdException w:name="annotation reference" w:locked="off"/><w:lsdException w:name="Default Paragraph Font" w:locked="off"/><w:lsdException w:name="Date" w:locked="off"/><w:lsdException w:name="Hyperlink" w:locked="off"/><w:lsdException w:name="FollowedHyperlink" w:locked="off"/><w:lsdException w:name="Emphasis" w:locked="off"/><w:lsdException w:name="HTML Top of Form" w:locked="off"/><w:lsdException w:name="HTML Bottom of Form" w:locked="off"/><w:lsdException w:name="Normal Table" w:locked="off"/><w:lsdException w:name="annotation subject" w:locked="off"/><w:lsdException w:name="No List" w:locked="off"/></w:latentStyles><w:style w:type="paragraph" w:default="on" w:styleId="Normal"><w:name w:val="Normal"/><w:aliases w:val="para"/><w:rsid w:val="00826D85"/><w:rPr><wx:font wx:val="Times New Roman"/><w:sz w:val="24"/><w:sz-cs w:val="24"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="character" w:default="on" w:styleId="DefaultParagraphFont"><w:name w:val="Default Paragraph Font"/><w:semiHidden/></w:style><w:style w:type="table" w:default="on" w:styleId="TableNormal"><w:name w:val="Normal Table"/><wx:uiName wx:val="Table Normal"/><w:semiHidden/><w:rPr><wx:font wx:val="Times New Roman"/></w:rPr><w:tblPr><w:tblInd w:w="0" w:type="dxa"/><w:tblCellMar><w:top w:w="0" w:type="dxa"/><w:left w:w="108" w:type="dxa"/><w:bottom w:w="0" w:type="dxa"/><w:right w:w="108" w:type="dxa"/></w:tblCellMar></w:tblPr></w:style><w:style w:type="list" w:default="on" w:styleId="NoList"><w:name w:val="No List"/><w:semiHidden/></w:style><w:style w:type="paragraph" w:styleId="itemizedlist2"><w:name w:val="itemizedlist2"/><w:basedOn w:val="Normal"/><w:rsid w:val="00DF7E4E"/><w:pPr><w:pStyle w:val="itemizedlist2"/><w:listPr><w:ilfo w:val="17"/></w:listPr><w:ind w:left="1080"/></w:pPr><w:rPr><wx:font wx:val="Times New Roman"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="itemizedlist3"><w:name w:val="itemizedlist3"/><w:basedOn w:val="Normal"/><w:rsid w:val="00DF7E4E"/><w:pPr><w:pStyle w:val="itemizedlist3"/><w:listPr><w:ilfo w:val="18"/></w:listPr><w:ind w:left="1800"/></w:pPr><w:rPr><wx:font wx:val="Times New Roman"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="itemizedlist4"><w:name w:val="itemizedlist4"/><w:basedOn w:val="Normal"/><w:rsid w:val="00DF7E4E"/><w:pPr><w:pStyle w:val="itemizedlist4"/><w:listPr><w:ilfo w:val="19"/></w:listPr><w:ind w:left="2520"/></w:pPr><w:rPr><wx:font wx:val="Times New Roman"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="book-title"><w:name w:val="book-title"/><w:basedOn w:val="Normal"/><w:rsid w:val="000D6E3E"/><w:pPr><w:pStyle w:val="book-title"/><w:spacing w:before="240" w:after="240"/><w:jc w:val="center"/></w:pPr><w:rPr><wx:font wx:val="Times New Roman"/><w:b/><w:sz w:val="36"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="book-subtitle"><w:name w:val="book-subtitle"/><w:basedOn w:val="Normal"/><w:rsid w:val="000D6E3E"/><w:pPr><w:pStyle w:val="book-subtitle"/><w:spacing w:before="120" w:after="120"/><w:jc w:val="center"/></w:pPr><w:rPr><wx:font wx:val="Times New Roman"/><w:b/><w:sz w:val="28"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="book-titleabbrev"><w:name w:val="book-titleabbrev"/><w:basedOn w:val="Normal"/><w:rsid w:val="000D6E3E"/><w:pPr><w:pStyle w:val="book-titleabbrev"/><w:spacing w:before="120" w:after="120"/><w:jc w:val="center"/></w:pPr><w:rPr><wx:font wx:val="Times New Roman"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="article-title"><w:name w:val="article-title"/><w:basedOn w:val="Normal"/><w:rsid w:val="000D6E3E"/><w:pPr><w:pStyle w:val="article-title"/><w:spacing w:before="240" w:after="240"/><w:jc w:val="center"/></w:pPr><w:rPr><wx:font wx:val="Times New Roman"/><w:b/><w:sz w:val="36"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="article-subtitle"><w:name w:val="article-subtitle"/><w:basedOn w:val="Normal"/><w:rsid w:val="000D6E3E"/><w:pPr><w:pStyle w:val="article-subtitle"/><w:spacing w:before="120" w:after="120"/><w:jc w:val="center"/></w:pPr><w:rPr><wx:font wx:val="Times New Roman"/><w:b/><w:sz w:val="28"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="article-titleabbrev"><w:name w:val="article-titleabbrev"/><w:basedOn w:val="Normal"/><w:rsid w:val="000D6E3E"/><w:pPr><w:pStyle w:val="article-titleabbrev"/><w:spacing w:before="120" w:after="120"/><w:jc w:val="center"/></w:pPr><w:rPr><wx:font wx:val="Times New Roman"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="blockquote"><w:name w:val="blockquote"/><w:basedOn w:val="Normal"/><w:rsid w:val="000D6E3E"/><w:pPr><w:pStyle w:val="blockquote"/><w:ind w:left="720" w:right="720"/></w:pPr><w:rPr><wx:font wx:val="Times New Roman"/><w:i/><w:sz w:val="20"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="blockerror"><w:name w:val="blockerror"/><w:basedOn w:val="Normal"/><w:rsid w:val="000D6E3E"/><w:pPr><w:pStyle w:val="blockerror"/><w:ind w:left="720"/></w:pPr><w:rPr><wx:font wx:val="Times New Roman"/><w:color w:val="FF0000"/><w:effect w:val="ants-red"/></w:rPr></w:style><w:style w:type="character" w:styleId="inlineerror"><w:name w:val="inlineerror"/><w:basedOn w:val="DefaultParagraphFont"/><w:rsid w:val="000D6E3E"/><w:rPr><w:color w:val="FF0000"/><w:effect w:val="ants-red"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="legalnotice"><w:name w:val="legalnotice"/><w:basedOn w:val="Normal"/><w:rsid w:val="000D6E3E"/><w:pPr><w:pStyle w:val="legalnotice"/><w:pBdr><w:top w:val="single" w:sz="4" wx:bdrwidth="10" w:space="1" w:color="auto"/><w:left w:val="single" w:sz="4" wx:bdrwidth="10" w:space="4" w:color="auto"/><w:bottom w:val="single" w:sz="4" wx:bdrwidth="10" w:space="1" w:color="auto"/><w:right w:val="single" w:sz="4" wx:bdrwidth="10" w:space="4" w:color="auto"/></w:pBdr></w:pPr><w:rPr><wx:font wx:val="Times New Roman"/><w:u w:val="single"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="note"><w:name w:val="note"/><w:basedOn w:val="Normal"/><w:rsid w:val="000D6E3E"/><w:pPr><w:pStyle w:val="note"/><w:listPr><w:ilfo w:val="1"/></w:listPr></w:pPr><w:rPr><wx:font wx:val="Times New Roman"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="sect1-title"><w:name w:val="sect1-title"/><w:basedOn w:val="Normal"/><w:rsid w:val="000D6E3E"/><w:pPr><w:pStyle w:val="sect1-title"/><w:jc w:val="center"/></w:pPr><w:rPr><wx:font wx:val="Times New Roman"/><w:b/><w:sz w:val="36"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="sect1-subtitle"><w:name w:val="sect1-subtitle"/><w:basedOn w:val="Normal"/><w:rsid w:val="000D6E3E"/><w:pPr><w:pStyle w:val="sect1-subtitle"/><w:jc w:val="center"/></w:pPr><w:rPr><wx:font wx:val="Times New Roman"/><w:b/><w:sz w:val="28"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="sect2-title"><w:name w:val="sect2-title"/><w:basedOn w:val="Normal"/><w:rsid w:val="000D6E3E"/><w:pPr><w:pStyle w:val="sect2-title"/><w:jc w:val="center"/></w:pPr><w:rPr><wx:font wx:val="Times New Roman"/><w:b/><w:sz w:val="28"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="sect2-subtitle"><w:name w:val="sect2-subtitle"/><w:basedOn w:val="Normal"/><w:rsid w:val="000D6E3E"/><w:pPr><w:pStyle w:val="sect2-subtitle"/><w:jc w:val="center"/></w:pPr><w:rPr><wx:font wx:val="Times New Roman"/><w:b/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="sect3-title"><w:name w:val="sect3-title"/><w:basedOn w:val="Normal"/><w:rsid w:val="000D6E3E"/><w:pPr><w:pStyle w:val="sect3-title"/></w:pPr><w:rPr><wx:font wx:val="Times New Roman"/><w:b/><w:sz w:val="28"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="sect3-subtitle"><w:name w:val="sect3-subtitle"/><w:basedOn w:val="Normal"/><w:rsid w:val="000D6E3E"/><w:pPr><w:pStyle w:val="sect3-subtitle"/></w:pPr><w:rPr><wx:font wx:val="Times New Roman"/><w:b/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="sect4-title"><w:name w:val="sect4-title"/><w:basedOn w:val="Normal"/><w:rsid w:val="000D6E3E"/><w:pPr><w:pStyle w:val="sect4-title"/></w:pPr><w:rPr><wx:font wx:val="Times New Roman"/><w:b/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="sect4-subtitle"><w:name w:val="sect4-subtitle"/><w:basedOn w:val="Normal"/><w:rsid w:val="000D6E3E"/><w:pPr><w:pStyle w:val="sect4-subtitle"/></w:pPr><w:rPr><wx:font wx:val="Times New Roman"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="sect5-title"><w:name w:val="sect5-title"/><w:basedOn w:val="Normal"/><w:rsid w:val="000D6E3E"/><w:pPr><w:pStyle w:val="sect5-title"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><wx:font wx:val="Arial"/><w:b/><w:sz w:val="22"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="sect5-subtitle"><w:name w:val="sect5-subtitle"/><w:basedOn w:val="Normal"/><w:rsid w:val="000D6E3E"/><w:pPr><w:pStyle w:val="sect5-subtitle"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="20"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="simpara"><w:name w:val="simpara"/><w:basedOn w:val="Normal"/><w:rsid w:val="000D6E3E"/><w:pPr><w:pStyle w:val="simpara"/></w:pPr><w:rPr><wx:font wx:val="Times New Roman"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="formalpara"><w:name w:val="formalpara"/><w:basedOn w:val="Normal"/><w:rsid w:val="000D6E3E"/><w:pPr><w:pStyle w:val="formalpara"/></w:pPr><w:rPr><wx:font wx:val="Times New Roman"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="formalpara-title"><w:name w:val="formalpara-title"/><w:basedOn w:val="Normal"/><w:rsid w:val="000D6E3E"/><w:pPr><w:pStyle w:val="formalpara-title"/><w:ind w:left="720"/></w:pPr><w:rPr><wx:font wx:val="Times New Roman"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="simplesect-title"><w:name w:val="simplesect-title"/><w:basedOn w:val="Normal"/><w:rsid w:val="000D6E3E"/><w:pPr><w:pStyle w:val="simplesect-title"/><w:jc w:val="center"/></w:pPr><w:rPr><wx:font wx:val="Times New Roman"/><w:b/><w:sz w:val="28"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="simplesect-subtitle"><w:name w:val="simplesect-subtitle"/><w:basedOn w:val="Normal"/><w:rsid w:val="000D6E3E"/><w:pPr><w:pStyle w:val="simplesect-subtitle"/><w:jc w:val="center"/></w:pPr><w:rPr><wx:font wx:val="Times New Roman"/><w:b/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="blockquote-attribution"><w:name w:val="blockquote-attribution"/><w:basedOn w:val="Normal"/><w:rsid w:val="000D6E3E"/><w:pPr><w:pStyle w:val="blockquote-attribution"/><w:ind w:left="1440"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial Narrow" w:h-ansi="Arial Narrow"/><wx:font wx:val="Arial Narrow"/><w:sz w:val="16"/><w:u w:val="single"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="blockquote-title"><w:name w:val="blockquote-title"/><w:basedOn w:val="Normal"/><w:next w:val="blockquote"/><w:rsid w:val="000D6E3E"/><w:pPr><w:pStyle w:val="blockquote-title"/><w:ind w:left="720"/></w:pPr><w:rPr><wx:font wx:val="Times New Roman"/><w:b/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="note-title"><w:name w:val="note-title"/><w:basedOn w:val="note"/><w:rsid w:val="000D6E3E"/><w:pPr><w:pStyle w:val="note-title"/></w:pPr><w:rPr><wx:font wx:val="Times New Roman"/><w:b/><w:sz w:val="28"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="caution"><w:name w:val="caution"/><w:basedOn w:val="note"/><w:rsid w:val="000D6E3E"/><w:pPr><w:pStyle w:val="caution"/></w:pPr><w:rPr><wx:font wx:val="Times New Roman"/><w:color w:val="FF0000"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="caution-title"><w:name w:val="caution-title"/><w:basedOn w:val="caution"/><w:rsid w:val="000D6E3E"/><w:pPr><w:pStyle w:val="caution-title"/></w:pPr><w:rPr><wx:font wx:val="Times New Roman"/><w:b/><w:sz w:val="28"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="warning"><w:name w:val="warning"/><w:basedOn w:val="note"/><w:rsid w:val="000D6E3E"/><w:pPr><w:pStyle w:val="warning"/></w:pPr><w:rPr><wx:font wx:val="Times New Roman"/><w:color w:val="FFCC00"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="warning-title"><w:name w:val="warning-title"/><w:basedOn w:val="warning"/><w:rsid w:val="000D6E3E"/><w:pPr><w:pStyle w:val="warning-title"/></w:pPr><w:rPr><wx:font wx:val="Times New Roman"/><w:b/><w:sz w:val="28"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="important"><w:name w:val="important"/><w:basedOn w:val="note"/><w:rsid w:val="000D6E3E"/><w:pPr><w:pStyle w:val="important"/></w:pPr><w:rPr><wx:font wx:val="Times New Roman"/><w:color w:val="000080"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="important-title"><w:name w:val="important-title"/><w:basedOn w:val="important"/><w:rsid w:val="000D6E3E"/><w:pPr><w:pStyle w:val="important-title"/></w:pPr><w:rPr><wx:font wx:val="Times New Roman"/><w:b/><w:sz w:val="28"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="chapter-title"><w:name w:val="chapter-title"/><w:basedOn w:val="Normal"/><w:rsid w:val="000D6E3E"/><w:pPr><w:pStyle w:val="chapter-title"/><w:spacing w:before="240" w:after="240"/><w:jc w:val="center"/></w:pPr><w:rPr><wx:font wx:val="Times New Roman"/><w:b/><w:sz w:val="36"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="chapter-subtitle"><w:name w:val="chapter-subtitle"/><w:basedOn w:val="Normal"/><w:rsid w:val="000D6E3E"/><w:pPr><w:pStyle w:val="chapter-subtitle"/><w:spacing w:before="120" w:after="120"/><w:jc w:val="center"/></w:pPr><w:rPr><wx:font wx:val="Times New Roman"/><w:b/><w:sz w:val="28"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="chapter-titleabbrev"><w:name w:val="chapter-titleabbrev"/><w:basedOn w:val="Normal"/><w:rsid w:val="000D6E3E"/><w:pPr><w:pStyle w:val="chapter-titleabbrev"/><w:spacing w:before="120" w:after="120"/><w:jc w:val="center"/></w:pPr><w:rPr><wx:font wx:val="Times New Roman"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="appendix-title"><w:name w:val="appendix-title"/><w:basedOn w:val="Normal"/><w:rsid w:val="000D6E3E"/><w:pPr><w:pStyle w:val="appendix-title"/><w:spacing w:before="240" w:after="240"/><w:jc w:val="center"/></w:pPr><w:rPr><wx:font wx:val="Times New Roman"/><w:b/><w:sz w:val="36"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="preface-title"><w:name w:val="preface-title"/><w:basedOn w:val="Normal"/><w:rsid w:val="000D6E3E"/><w:pPr><w:pStyle w:val="preface-title"/><w:spacing w:before="240" w:after="240"/><w:jc w:val="center"/></w:pPr><w:rPr><wx:font wx:val="Times New Roman"/><w:b/><w:sz w:val="36"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="bibliography-title"><w:name w:val="bibliography-title"/><w:basedOn w:val="Normal"/><w:rsid w:val="000D6E3E"/><w:pPr><w:pStyle w:val="bibliography-title"/><w:spacing w:before="240" w:after="240"/><w:jc w:val="center"/></w:pPr><w:rPr><wx:font wx:val="Times New Roman"/><w:b/><w:sz w:val="36"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="glossary-title"><w:name w:val="glossary-title"/><w:basedOn w:val="Normal"/><w:rsid w:val="000D6E3E"/><w:pPr><w:pStyle w:val="glossary-title"/><w:spacing w:before="240" w:after="240"/><w:jc w:val="center"/></w:pPr><w:rPr><wx:font wx:val="Times New Roman"/><w:b/><w:sz w:val="36"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="index-title"><w:name w:val="index-title"/><w:basedOn w:val="Normal"/><w:rsid w:val="000D6E3E"/><w:pPr><w:pStyle w:val="index-title"/><w:spacing w:before="240" w:after="240"/><w:jc w:val="center"/></w:pPr><w:rPr><wx:font wx:val="Times New Roman"/><w:b/><w:sz w:val="36"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="itemizedlist1"><w:name w:val="itemizedlist1"/><w:basedOn w:val="Normal"/><w:rsid w:val="00227ABF"/><w:pPr><w:pStyle w:val="itemizedlist1"/><w:listPr><w:ilfo w:val="20"/></w:listPr></w:pPr><w:rPr><wx:font wx:val="Times New Roman"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="variablelist-term"><w:name w:val="variablelist-term"/><w:basedOn w:val="Normal"/><w:rsid w:val="000D6E3E"/><w:pPr><w:pStyle w:val="variablelist-term"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="20"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="variablelist-title"><w:name w:val="variablelist-title"/><w:basedOn w:val="Normal"/><w:rsid w:val="000D6E3E"/><w:pPr><w:pStyle w:val="variablelist-title"/><w:spacing w:before="120" w:after="120"/><w:ind w:left="720"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><wx:font wx:val="Arial"/><w:b/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="variablelist-titleabbrev"><w:name w:val="variablelist-titleabbrev"/><w:basedOn w:val="Normal"/><w:rsid w:val="000D6E3E"/><w:pPr><w:pStyle w:val="variablelist-titleabbrev"/><w:ind w:left="720"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><wx:font wx:val="Arial"/><w:i/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="tip"><w:name w:val="tip"/><w:basedOn w:val="note"/><w:rsid w:val="000D6E3E"/><w:pPr><w:pStyle w:val="tip"/></w:pPr><w:rPr><wx:font wx:val="Times New Roman"/><w:color w:val="003300"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="tip-title"><w:name w:val="tip-title"/><w:basedOn w:val="tip"/><w:rsid w:val="000D6E3E"/><w:pPr><w:pStyle w:val="tip-title"/></w:pPr><w:rPr><wx:font wx:val="Times New Roman"/><w:sz w:val="28"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="para-continue"><w:name w:val="para-continue"/><w:basedOn w:val="Normal"/><w:rsid w:val="000D6E3E"/><w:pPr><w:pStyle w:val="para-continue"/><w:ind w:left="720"/></w:pPr><w:rPr><wx:font wx:val="Times New Roman"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="releaseinfo"><w:name w:val="releaseinfo"/><w:basedOn w:val="Normal"/><w:rsid w:val="000D6E3E"/><w:pPr><w:pStyle w:val="releaseinfo"/><w:shd w:val="clear" w:color="auto" w:fill="FFFF99"/></w:pPr><w:rPr><w:rFonts w:ascii="Lucida Sans Unicode" w:h-ansi="Lucida Sans Unicode"/><wx:font wx:val="Lucida Sans Unicode"/><w:sz w:val="18"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="author"><w:name w:val="author"/><w:basedOn w:val="Normal"/><w:rsid w:val="000D6E3E"/><w:pPr><w:pStyle w:val="author"/><w:ind w:left="720"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="20"/></w:rPr></w:style><w:style w:type="character" w:styleId="surname"><w:name w:val="surname"/><w:basedOn w:val="DefaultParagraphFont"/><w:rsid w:val="000D6E3E"/><w:rPr><w:b/></w:rPr></w:style><w:style w:type="character" w:styleId="firstname"><w:name w:val="firstname"/><w:basedOn w:val="DefaultParagraphFont"/><w:rsid w:val="000D6E3E"/><w:rPr><w:i/></w:rPr></w:style><w:style w:type="character" w:styleId="honorific"><w:name w:val="honorific"/><w:basedOn w:val="DefaultParagraphFont"/><w:rsid w:val="000D6E3E"/><w:rPr><w:b/></w:rPr></w:style><w:style w:type="character" w:styleId="lineage"><w:name w:val="lineage"/><w:basedOn w:val="DefaultParagraphFont"/><w:rsid w:val="000D6E3E"/><w:rPr><w:u w:val="single"/></w:rPr></w:style><w:style w:type="character" w:styleId="othername"><w:name w:val="othername"/><w:basedOn w:val="DefaultParagraphFont"/><w:rsid w:val="000D6E3E"/><w:rPr><w:i/></w:rPr></w:style><w:style w:type="character" w:styleId="shortaffil"><w:name w:val="shortaffil"/><w:basedOn w:val="DefaultParagraphFont"/><w:rsid w:val="000D6E3E"/><w:rPr><w:u w:val="single"/></w:rPr></w:style><w:style w:type="character" w:styleId="jobtitle"><w:name w:val="jobtitle"/><w:basedOn w:val="DefaultParagraphFont"/><w:rsid w:val="000D6E3E"/><w:rPr><w:b/></w:rPr></w:style><w:style w:type="character" w:styleId="orgname"><w:name w:val="orgname"/><w:basedOn w:val="DefaultParagraphFont"/><w:rsid w:val="000D6E3E"/><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><w:b/></w:rPr></w:style><w:style w:type="character" w:styleId="orgdiv"><w:name w:val="orgdiv"/><w:basedOn w:val="DefaultParagraphFont"/><w:rsid w:val="000D6E3E"/><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="affiliation"><w:name w:val="affiliation"/><w:basedOn w:val="Normal"/><w:rsid w:val="000D6E3E"/><w:pPr><w:pStyle w:val="affiliation"/><w:ind w:left="1440"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="20"/></w:rPr></w:style><w:style w:type="character" w:styleId="contrib"><w:name w:val="contrib"/><w:basedOn w:val="DefaultParagraphFont"/><w:rsid w:val="000D6E3E"/><w:rPr><w:i/></w:rPr></w:style><w:style w:type="character" w:styleId="street"><w:name w:val="street"/><w:basedOn w:val="DefaultParagraphFont"/><w:rsid w:val="000D6E3E"/><w:rPr><w:rFonts w:ascii="Lucida Sans Unicode" w:h-ansi="Lucida Sans Unicode"/></w:rPr></w:style><w:style w:type="character" w:styleId="pob"><w:name w:val="pob"/><w:basedOn w:val="DefaultParagraphFont"/><w:rsid w:val="000D6E3E"/><w:rPr><w:rFonts w:ascii="Lucida Sans Unicode" w:h-ansi="Lucida Sans Unicode"/></w:rPr></w:style><w:style w:type="character" w:styleId="postcode"><w:name w:val="postcode"/><w:basedOn w:val="DefaultParagraphFont"/><w:rsid w:val="000D6E3E"/><w:rPr><w:rFonts w:ascii="Lucida Sans Unicode" w:h-ansi="Lucida Sans Unicode"/><w:b/></w:rPr></w:style><w:style w:type="character" w:styleId="city"><w:name w:val="city"/><w:basedOn w:val="DefaultParagraphFont"/><w:rsid w:val="000D6E3E"/><w:rPr><w:rFonts w:ascii="Lucida Sans Unicode" w:h-ansi="Lucida Sans Unicode"/><w:b/></w:rPr></w:style><w:style w:type="character" w:styleId="state"><w:name w:val="state"/><w:basedOn w:val="DefaultParagraphFont"/><w:rsid w:val="000D6E3E"/><w:rPr><w:rFonts w:ascii="Lucida Sans Unicode" w:h-ansi="Lucida Sans Unicode"/><w:b/></w:rPr></w:style><w:style w:type="character" w:styleId="country"><w:name w:val="country"/><w:basedOn w:val="DefaultParagraphFont"/><w:rsid w:val="000D6E3E"/><w:rPr><w:rFonts w:ascii="Lucida Sans Unicode" w:h-ansi="Lucida Sans Unicode"/><w:b/></w:rPr></w:style><w:style w:type="character" w:styleId="phone"><w:name w:val="phone"/><w:basedOn w:val="DefaultParagraphFont"/><w:rsid w:val="000D6E3E"/><w:rPr><w:rFonts w:ascii="Courier New" w:h-ansi="Courier New"/></w:rPr></w:style><w:style w:type="character" w:styleId="fax"><w:name w:val="fax"/><w:basedOn w:val="DefaultParagraphFont"/><w:rsid w:val="000D6E3E"/><w:rPr><w:rFonts w:ascii="Courier New" w:h-ansi="Courier New"/></w:rPr></w:style><w:style w:type="character" w:styleId="email"><w:name w:val="email"/><w:basedOn w:val="DefaultParagraphFont"/><w:rsid w:val="000D6E3E"/><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><w:color w:val="0000FF"/><w:u w:val="single"/></w:rPr></w:style><w:style w:type="character" w:styleId="otheraddr"><w:name w:val="otheraddr"/><w:basedOn w:val="DefaultParagraphFont"/><w:rsid w:val="000D6E3E"/><w:rPr><w:rFonts w:ascii="Lucida Sans Unicode" w:h-ansi="Lucida Sans Unicode"/><w:u w:val="single"/></w:rPr></w:style><w:style w:type="character" w:styleId="ulink"><w:name w:val="ulink"/><w:basedOn w:val="DefaultParagraphFont"/><w:rsid w:val="000D6E3E"/><w:rPr><w:color w:val="0000FF"/><w:u w:val="single"/></w:rPr></w:style><w:style w:type="character" w:styleId="attribute-name"><w:name w:val="attribute-name"/><w:basedOn w:val="DefaultParagraphFont"/><w:rsid w:val="000D6E3E"/><w:rPr><w:b/></w:rPr></w:style><w:style w:type="character" w:styleId="attribute-value"><w:name w:val="attribute-value"/><w:basedOn w:val="DefaultParagraphFont"/><w:rsid w:val="000D6E3E"/><w:rPr><w:u w:val="single"/></w:rPr></w:style><w:style w:type="character" w:styleId="attributes"><w:name w:val="attributes"/><w:basedOn w:val="DefaultParagraphFont"/><w:rsid w:val="000D6E3E"/><w:rPr><w:vanish/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="informalfigure-imagedata"><w:name w:val="informalfigure-imagedata"/><w:basedOn w:val="Normal"/><w:rsid w:val="000D6E3E"/><w:pPr><w:pStyle w:val="informalfigure-imagedata"/><w:spacing w:before="120" w:after="120"/><w:ind w:left="720"/></w:pPr><w:rPr><w:rFonts w:ascii="Courier New" w:h-ansi="Courier New"/><wx:font wx:val="Courier New"/><w:b/><w:sz w:val="20"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="xinclude"><w:name w:val="xinclude"/><w:basedOn w:val="Normal"/><w:rsid w:val="000D6E3E"/><w:pPr><w:pStyle w:val="xinclude"/><w:shd w:val="solid" w:color="auto" w:fill="0C0C0C" wx:bgcolor="000000"/></w:pPr><w:rPr><wx:font wx:val="Times New Roman"/><w:color w:val="FF0000"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="table-title"><w:name w:val="table-title"/><w:basedOn w:val="Normal"/><w:rsid w:val="00283454"/><w:pPr><w:pStyle w:val="table-title"/></w:pPr><w:rPr><wx:font wx:val="Times New Roman"/><w:b/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="part-title"><w:name w:val="part-title"/><w:basedOn w:val="book-title"/><w:rsid w:val="000D6E3E"/><w:pPr><w:pStyle w:val="part-title"/><w:shd w:val="clear" w:color="auto" w:fill="CCFFFF"/></w:pPr><w:rPr><wx:font wx:val="Times New Roman"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="abstract"><w:name w:val="abstract"/><w:basedOn w:val="Normal"/><w:rsid w:val="000D6E3E"/><w:pPr><w:pStyle w:val="abstract"/></w:pPr><w:rPr><wx:font wx:val="Times New Roman"/><w:i/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="abstract-title"><w:name w:val="abstract-title"/><w:basedOn w:val="sect3-title"/><w:rsid w:val="000D6E3E"/><w:pPr><w:pStyle w:val="abstract-title"/></w:pPr><w:rPr><wx:font wx:val="Times New Roman"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Caption"><w:name w:val="caption"/><wx:uiName wx:val="Caption"/><w:basedOn w:val="Normal"/><w:rsid w:val="000D6E3E"/><w:pPr><w:pStyle w:val="Caption"/><w:jc w:val="center"/></w:pPr><w:rPr><wx:font wx:val="Times New Roman"/><w:i/><w:sz w:val="18"/></w:rPr></w:style><w:style w:type="character" w:styleId="citetitle"><w:name w:val="citetitle"/><w:basedOn w:val="DefaultParagraphFont"/><w:rsid w:val="000D6E3E"/><w:rPr><w:i/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="bridgehead"><w:name w:val="bridgehead"/><w:basedOn w:val="Normal"/><w:rsid w:val="000D6E3E"/><w:pPr><w:pStyle w:val="bridgehead"/><w:spacing w:before="120" w:after="120"/><w:ind w:left="720"/></w:pPr><w:rPr><wx:font wx:val="Times New Roman"/><w:b/><w:sz w:val="28"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="orderedlist1"><w:name w:val="orderedlist1"/><w:basedOn w:val="Normal"/><w:rsid w:val="00DF7E4E"/><w:pPr><w:pStyle w:val="orderedlist1"/><w:tabs><w:tab w:val="list" w:pos="720"/></w:tabs><w:ind w:left="720" w:hanging="360"/></w:pPr><w:rPr><wx:font wx:val="Times New Roman"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="orderedlist2"><w:name w:val="orderedlist2"/><w:basedOn w:val="Normal"/><w:rsid w:val="000D6E3E"/><w:pPr><w:pStyle w:val="orderedlist2"/><w:listPr><w:ilfo w:val="13"/></w:listPr><w:ind w:left="1080"/></w:pPr><w:rPr><wx:font wx:val="Times New Roman"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="orderedlist3"><w:name w:val="orderedlist3"/><w:basedOn w:val="Normal"/><w:rsid w:val="000D6E3E"/><w:pPr><w:pStyle w:val="orderedlist3"/><w:listPr><w:ilfo w:val="14"/></w:listPr><w:tabs><w:tab w:val="clear" w:pos="1800"/><w:tab w:val="list" w:pos="1620"/></w:tabs><w:ind w:left="1627" w:hanging="360"/></w:pPr><w:rPr><wx:font wx:val="Times New Roman"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="orderedlist4"><w:name w:val="orderedlist4"/><w:basedOn w:val="Normal"/><w:rsid w:val="000D6E3E"/><w:pPr><w:pStyle w:val="orderedlist4"/><w:listPr><w:ilfo w:val="16"/></w:listPr><w:ind w:left="1800"/></w:pPr><w:rPr><wx:font wx:val="Times New Roman"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="programlisting"><w:name w:val="programlisting"/><w:basedOn w:val="Normal"/><w:rsid w:val="000D6E3E"/><w:pPr><w:pStyle w:val="programlisting"/></w:pPr><w:rPr><w:rFonts w:ascii="Courier New" w:h-ansi="Courier New"/><wx:font wx:val="Courier New"/><w:sz w:val="20"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="keyword"><w:name w:val="keyword"/><w:basedOn w:val="Normal"/><w:rsid w:val="00D41859"/><w:pPr><w:pStyle w:val="keyword"/><w:shd w:val="clear" w:color="auto" w:fill="FFFF99"/></w:pPr><w:rPr><w:rFonts w:ascii="Arial" w:h-ansi="Arial"/><wx:font wx:val="Arial"/><w:sz w:val="20"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="address"><w:name w:val="address"/><w:basedOn w:val="Normal"/><w:rsid w:val="00977F06"/><w:pPr><w:pStyle w:val="address"/><w:ind w:left="720"/></w:pPr><w:rPr><wx:font wx:val="Times New Roman"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="biblio-div"><w:name w:val="biblio-div"/><w:basedOn w:val="Normal"/><w:rsid w:val="00977F06"/><w:pPr><w:pStyle w:val="biblio-div"/><w:ind w:left="288"/></w:pPr><w:rPr><wx:font wx:val="Times New Roman"/><w:b/><w:sz w:val="28"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="biblioentry-title"><w:name w:val="biblioentry-title"/><w:basedOn w:val="Normal"/><w:rsid w:val="00977F06"/><w:pPr><w:pStyle w:val="biblioentry-title"/></w:pPr><w:rPr><wx:font wx:val="Times New Roman"/><w:b/><w:sz w:val="22"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="bibliomisc"><w:name w:val="bibliomisc"/><w:basedOn w:val="Normal"/><w:rsid w:val="00977F06"/><w:pPr><w:pStyle w:val="bibliomisc"/><w:shd w:val="clear" w:color="auto" w:fill="00FFFF"/></w:pPr><w:rPr><wx:font wx:val="Times New Roman"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="date"><w:name w:val="date"/><w:basedOn w:val="Normal"/><w:rsid w:val="004D200F"/><w:pPr><w:pStyle w:val="date"/><w:shd w:val="clear" w:color="auto" w:fill="00CCFF"/></w:pPr><w:rPr><wx:font wx:val="Times New Roman"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="example-title"><w:name w:val="example-title"/><w:basedOn w:val="Normal"/><w:rsid w:val="004D200F"/><w:pPr><w:pStyle w:val="example-title"/></w:pPr><w:rPr><wx:font wx:val="Times New Roman"/><w:b/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="figure-title"><w:name w:val="figure-title"/><w:basedOn w:val="Normal"/><w:rsid w:val="004D200F"/><w:pPr><w:pStyle w:val="figure-title"/></w:pPr><w:rPr><wx:font wx:val="Times New Roman"/><w:b/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="literallayout"><w:name w:val="literallayout"/><w:basedOn w:val="Normal"/><w:rsid w:val="004D200F"/><w:pPr><w:pStyle w:val="literallayout"/></w:pPr><w:rPr><w:rFonts w:ascii="Courier New" w:h-ansi="Courier New"/><wx:font wx:val="Courier New"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="publisher"><w:name w:val="publisher"/><w:basedOn w:val="Normal"/><w:rsid w:val="001401DD"/><w:pPr><w:pStyle w:val="publisher"/></w:pPr><w:rPr><w:rFonts w:ascii="Palatino" w:h-ansi="Palatino"/><wx:font wx:val="Palatino"/><w:sz w:val="22"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="publisher-address"><w:name w:val="publisher-address"/><w:basedOn w:val="Normal"/><w:rsid w:val="001401DD"/><w:pPr><w:pStyle w:val="publisher-address"/><w:ind w:left="720"/></w:pPr><w:rPr><w:rFonts w:ascii="Palatino" w:h-ansi="Palatino"/><wx:font wx:val="Palatino"/><w:sz w:val="22"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="revision"><w:name w:val="revision"/><w:basedOn w:val="Normal"/><w:rsid w:val="009F2926"/><w:pPr><w:pStyle w:val="revision"/><w:shd w:val="clear" w:color="auto" w:fill="FFFF99"/></w:pPr><w:rPr><wx:font wx:val="Times New Roman"/><w:b/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="edition"><w:name w:val="edition"/><w:basedOn w:val="Normal"/><w:rsid w:val="006142F4"/><w:pPr><w:pStyle w:val="edition"/><w:shd w:val="clear" w:color="auto" w:fill="99CCFF"/></w:pPr><w:rPr><wx:font wx:val="Times New Roman"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="pubdate"><w:name w:val="pubdate"/><w:basedOn w:val="Normal"/><w:rsid w:val="007745F4"/><w:pPr><w:pStyle w:val="pubdate"/><w:shd w:val="clear" w:color="auto" w:fill="FFFF99"/></w:pPr><w:rPr><wx:font wx:val="Times New Roman"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="imagedata-metadata"><w:name w:val="imagedata-metadata"/><w:basedOn w:val="Normal"/><w:rsid w:val="00514B6A"/><w:pPr><w:pStyle w:val="imagedata-metadata"/><w:shd w:val="clear" w:color="auto" w:fill="404040"/></w:pPr><w:rPr><w:rFonts w:ascii="Monaco" w:h-ansi="Monaco"/><wx:font wx:val="Monaco"/><w:color w:val="FFFFFF"/><w:sz w:val="20"/></w:rPr></w:style></w:styles><w:shapeDefaults><o:shapedefaults v:ext="edit" spidmax="10242"/><o:shapelayout v:ext="edit"><o:idmap v:ext="edit" data="1"/></o:shapelayout></w:shapeDefaults><w:docPr><w:view w:val="normal"/><w:zoom w:percent="100"/><w:doNotEmbedSystemFonts/><w:proofState w:spelling="clean" w:grammar="clean"/><w:attachedTemplate w:val=""/><w:documentProtection w:formatting="on" w:enforcement="on" w:unprotectPassword="2B3EE9A0"/><w:defaultTabStop w:val="720"/><w:punctuationKerning/><w:characterSpacingControl w:val="DontCompress"/><w:optimizeForBrowser/><w:validateAgainstSchema/><w:saveInvalidXML w:val="off"/><w:ignoreMixedContent w:val="off"/><w:alwaysShowPlaceholderText w:val="off"/><w:compat><w:breakWrappedTables/><w:snapToGridInCell/><w:wrapTextWithPunct/><w:useAsianBreakRules/><w:dontGrowAutofit/></w:compat><wsp:rsids><wsp:rsidRoot wsp:val="00DD244D"/><wsp:rsid wsp:val="001401DD"/><wsp:rsid wsp:val="001B2E2B"/><wsp:rsid wsp:val="001E5D16"/><wsp:rsid wsp:val="00227ABF"/><wsp:rsid wsp:val="00283454"/><wsp:rsid wsp:val="003E1EB8"/><wsp:rsid wsp:val="00467421"/><wsp:rsid wsp:val="004D200F"/><wsp:rsid wsp:val="00514B6A"/><wsp:rsid wsp:val="006142F4"/><wsp:rsid wsp:val="0067760C"/><wsp:rsid wsp:val="006A7249"/><wsp:rsid wsp:val="006D1FD8"/><wsp:rsid wsp:val="006F7817"/><wsp:rsid wsp:val="007745F4"/><wsp:rsid wsp:val="00826D85"/><wsp:rsid wsp:val="009208D2"/><wsp:rsid wsp:val="00977F06"/><wsp:rsid wsp:val="009F2926"/><wsp:rsid wsp:val="00C0771D"/><wsp:rsid wsp:val="00C80712"/><wsp:rsid wsp:val="00C87CDE"/><wsp:rsid wsp:val="00D41859"/><wsp:rsid wsp:val="00DD244D"/><wsp:rsid wsp:val="00DF7E4E"/><wsp:rsid wsp:val="00F34316"/></wsp:rsids></w:docPr><w:body><wx:sect><w:p wsp:rsidR="00DD244D" wsp:rsidRDefault="00F34316"><w:r><w:t>Generic </w:t></w:r><w:proofErr w:type="spellStart"/><w:r><w:t>DocB</w:t></w:r><w:r wsp:rsidR="00514B6A"><w:t>ook</w:t></w:r><w:proofErr w:type="spellEnd"/><w:r wsp:rsidR="00514B6A"><w:t> roundtrip template - 2008-10-09</w:t></w:r><w:r><w:t>-01.</w:t></w:r></w:p><w:sectPr wsp:rsidR="00DD244D" wsp:rsidSect="00DD244D"><w:pgSz w:w="12240" w:h="15840"/><w:pgMar w:top="1440" w:right="1800" w:bottom="1440" w:left="1800" w:header="720" w:footer="720" w:gutter="0"/><w:cols w:space="720"/><w:docGrid w:line-pitch="360"/></w:sectPr></wx:sect></w:body></w:wordDocument> \ No newline at end of file
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/roundtrip/wordml2normalise.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/roundtrip/wordml2normalise.xsl
new file mode 100644
index 0000000..ad22b19
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/roundtrip/wordml2normalise.xsl
@@ -0,0 +1,445 @@
+<xsl:stylesheet version="1.0"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:w="http://schemas.microsoft.com/office/word/2003/wordml"
+ xmlns:v="urn:schemas-microsoft-com:vml"
+ xmlns:w10="urn:schemas-microsoft-com:office:word"
+ xmlns:sl="http://schemas.microsoft.com/schemaLibrary/2003/core"
+ xmlns:aml="http://schemas.microsoft.com/aml/2001/core"
+ xmlns:wx="http://schemas.microsoft.com/office/word/2003/auxHint"
+ xmlns:o="urn:schemas-microsoft-com:office:office"
+ xmlns:dt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882"
+ xmlns:dbk='http://docbook.org/ns/docbook'
+ xmlns:rnd='http://docbook.org/ns/docbook/roundtrip'
+ xmlns:xlink='http://www.w3.org/1999/xlink'
+ xmlns:exsl='http://exslt.org/common'
+ exclude-result-prefixes='w v w10 sl aml wx o dt'
+ extension-element-prefixes='exsl'>
+
+ <xsl:import href='normalise-common.xsl'/>
+
+ <xsl:output method='xml' indent="yes"/>
+
+ <!-- ********************************************************************
+ $Id: wordml2normalise.xsl 8105 2008-08-15 01:29:11Z balls $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://nwalsh.com/docbook/xsl/ for copyright
+ and other information.
+
+ ******************************************************************** -->
+
+ <xsl:strip-space elements='*'/>
+ <xsl:preserve-space elements='w:t'/>
+
+ <xsl:key name='style'
+ match='w:style'
+ use='@w:styleId'/>
+
+ <xsl:template match="w:wordDocument">
+ <dbk:article>
+ <xsl:apply-templates select='w:body'/>
+ </dbk:article>
+ </xsl:template>
+
+ <xsl:template match='wx:borders |
+ wx:margin-left'/>
+
+ <xsl:template match='w:p'>
+ <xsl:variable name='style'>
+ <xsl:call-template name='rnd:map-paragraph-style'>
+ <xsl:with-param name='style' select='w:pPr/w:pStyle/@w:val'/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:choose>
+ <xsl:when test='aml:annotation[@w:type = "Word.Deletion"] and
+ not(aml:annotation[@w:type != "Word.Deletion"]) and
+ count(*) = count(aml:annotation|w:pPr)'/>
+
+ <!-- Eliminate paragraphs that have no content.
+ These are section or page breaks.
+ -->
+ <xsl:when test='not(w:r|w:hlink|w:tbl) and
+ w:pPr/w:sectPr'/>
+
+ <xsl:otherwise>
+ <dbk:para>
+ <xsl:attribute name='rnd:style'>
+ <xsl:value-of select='$style'/>
+ </xsl:attribute>
+ <xsl:if test='w:pPr/w:pStyle/@w:val and
+ $style != w:pPr/w:pStyle/@w:val'>
+ <xsl:attribute name='rnd:original-style'>
+ <xsl:value-of select='w:pPr/w:pStyle/@w:val'/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:if test='w:r[1][w:rPr/w:rStyle/@w:val = "attributes"] and
+ w:r[2][w:rPr/w:rStyle/@w:val = "CommentReference"]'>
+ <xsl:apply-templates select='w:r[2]//w:r[w:rPr/w:rStyle/@w:val = "attribute-name"]'
+ mode='rnd:attributes'/>
+ </xsl:if>
+
+ <xsl:apply-templates/>
+ </dbk:para>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+ <xsl:template match='*' mode='rnd:attributes'>
+ <xsl:attribute name='{w:t}'>
+ <xsl:apply-templates select='following-sibling::w:r[w:rPr/w:rStyle/@w:val = "attribute-value"][1]'
+ mode='rnd:attribute-value'/>
+ </xsl:attribute>
+ </xsl:template>
+
+ <xsl:template match='w:r'>
+ <xsl:param name='do-vert-align' select='true()'/>
+
+ <xsl:variable name='role'>
+ <xsl:choose>
+ <xsl:when test='w:rPr/w:b and
+ w:rPr/w:i'>
+ <xsl:text>bold-italic</xsl:text>
+ </xsl:when>
+ <xsl:when test='w:rPr/w:b'>
+ <xsl:text>bold</xsl:text>
+ </xsl:when>
+ <xsl:when test='w:rPr/w:i'>
+ <xsl:text>italic</xsl:text>
+ </xsl:when>
+ <xsl:when test='w:rPr/w:u'>
+ <xsl:text>underline</xsl:text>
+ </xsl:when>
+ <!-- TODO: add support for other styles -->
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:variable name='style'>
+ <xsl:if test='w:rPr/w:rStyle'>
+ <xsl:value-of select='w:rPr/w:rStyle/@w:val'/>
+ </xsl:if>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test='w:rPr/w:rStyle/@w:val = "attributes"'/>
+ <xsl:when test='w:rPr/w:rStyle/@w:val = "CommentReference"'/>
+ <xsl:when test='w:pict'>
+ <!-- "filename" is where the image data gets extracted to -->
+ <xsl:variable name='filename'>
+ <xsl:call-template name='rnd:image-filename'/>
+ </xsl:variable>
+ <!-- "target" is the URL that will be the target of the imagedata hyperlink.
+ This may or may not be related to the physical filename.
+ -->
+ <xsl:variable name='target'>
+ <xsl:call-template name='rnd:image-target'>
+ <xsl:with-param name='filename' select='$filename'/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:call-template name='rnd:handle-image-data'>
+ <xsl:with-param name='filename' select='$filename'/>
+ <xsl:with-param name='data' select='w:pict/w:binData'/>
+ </xsl:call-template>
+
+ <dbk:inlinemediaobject>
+ <dbk:imageobject>
+ <dbk:imagedata fileref='{$target}'>
+ <xsl:if test='w:pict/v:shape/@style'>
+ <xsl:attribute name='width'>
+ <xsl:value-of select='normalize-space(substring-before(substring-after(w:pict/v:shape/@style, "width:"), ";"))'/>
+ </xsl:attribute>
+ <xsl:attribute name='depth'>
+ <xsl:value-of select='normalize-space(substring-after(w:pict/v:shape/@style, "height:"))'/>
+ </xsl:attribute>
+ </xsl:if>
+ </dbk:imagedata>
+ </dbk:imageobject>
+ </dbk:inlinemediaobject>
+ </xsl:when>
+ <xsl:when test='$do-vert-align and
+ w:rPr/w:vertAlign/@w:val = "subscript"'>
+ <dbk:subscript>
+ <xsl:apply-templates select='.'>
+ <xsl:with-param name='do-vert-align' select='false()'/>
+ </xsl:apply-templates>
+ </dbk:subscript>
+ </xsl:when>
+ <xsl:when test='$do-vert-align and
+ w:rPr/w:vertAlign/@w:val = "superscript"'>
+ <dbk:superscript>
+ <xsl:apply-templates select='.'>
+ <xsl:with-param name='do-vert-align' select='false()'/>
+ </xsl:apply-templates>
+ </dbk:superscript>
+ </xsl:when>
+ <xsl:when test='w:endnoteRef and
+ parent::w:p/parent::w:endnote and
+ count(w:rPr|w:endnoteRef) = count(*)'/>
+ <xsl:when test='w:footnoteRef'/> <!-- is a label supplied? -->
+ <xsl:when test='w:footnote|w:endnote'>
+ <dbk:footnote>
+ <xsl:apply-templates select='w:footnote|w:endnote'/>
+ </dbk:footnote>
+ </xsl:when>
+ <xsl:when test='$role != "" or $style != ""'>
+ <dbk:emphasis>
+ <xsl:if test='$role != ""'>
+ <xsl:attribute name='role'>
+ <xsl:value-of select='$role'/>
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:if test='$style != ""'>
+ <xsl:attribute name='rnd:style'>
+ <xsl:call-template name='rnd:map-character-style'>
+ <xsl:with-param name='style' select='$style'/>
+ </xsl:call-template>
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:apply-templates/>
+ </dbk:emphasis>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+ <!-- An application may wish to override these templates -->
+
+ <!-- rnd:image-filename determines the filename of the physical file
+ to which the image data should be written.
+ -->
+ <xsl:template name='rnd:image-filename'>
+ <xsl:param name='pict' select='w:pict'/>
+
+ <xsl:choose>
+ <xsl:when test='contains($pict/w:binData/@w:name, "wordml://")'>
+ <xsl:value-of select='substring-after($pict/w:binData/@w:name, "wordml://")'/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text>image</xsl:text>
+ <xsl:value-of select='count($pict/preceding::w:pict) + 1'/>
+ <xsl:text>.jpg</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+ <!-- rnd:image-target determines the URL for the image data.
+ This may or may not be related to the physical filename.
+ -->
+ <xsl:template name='rnd:image-target'>
+ <xsl:param name='filename'/>
+ <xsl:param name='pict' select='w:pict'/>
+
+ <xsl:value-of select='$filename'/>
+ </xsl:template>
+
+ <!-- rnd:handle-image-data receives the base64-encoded data and a filename
+ for the physical file to which the data should be written.
+ Since XSLT cannot natively handle binary data, this implementation
+ just writes the undecoded data to the nominated file.
+ A real application would decode the data into a binary representation.
+ -->
+ <xsl:template name='rnd:handle-image-data'>
+ <xsl:param name='filename'/>
+ <xsl:param name='data'/>
+
+ <xsl:if test='element-available("exsl:document")'>
+ <exsl:document href='{$filename}.b64' method='text'>
+ <xsl:value-of select='w:pict/w:binData'/>
+ </exsl:document>
+ </xsl:if>
+ </xsl:template>
+
+ <xsl:template match='w:hlink'>
+ <dbk:link xlink:href='{@w:dest}'>
+ <xsl:apply-templates/>
+ </dbk:link>
+ </xsl:template>
+
+ <!-- Soft returns don't really have an equivalent in DocBook,
+ - except in literal line environments.
+ -->
+ <xsl:template match='w:br'>
+ <xsl:text>&#xa;</xsl:text>
+ </xsl:template>
+
+ <xsl:template match='w:tbl'>
+ <xsl:variable name='tbl.style'
+ select='key("style", w:tblPr/w:tblStyle/@w:val) | .'/>
+
+ <xsl:variable name='border.top'>
+ <xsl:choose>
+ <xsl:when test='$tbl.style/w:tblPr/w:tblBorders/w:top[not(@w:val = "nil" or @w:val = "none")]'>1</xsl:when>
+ <xsl:when test='$tbl.style/w:tblPr/w:tblBorders/w:top[@w:val = "nil" or @w:val = "none"]'>0</xsl:when>
+ <xsl:when test='w:tr[1]/w:tc[w:tcPr/w:tcBorders/w:top[not(@w:val = "nil" or @w:val = "none")]]'>1</xsl:when>
+ <xsl:otherwise>0</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:variable name='border.bottom'>
+ <xsl:choose>
+ <xsl:when test='$tbl.style/w:tblPr/w:tblBorders/w:bottom[not(@w:val = "nil" or @w:val = "none")]'>1</xsl:when>
+ <xsl:when test='$tbl.style/w:tblPr/w:tblBorders/w:bottom[@w:val = "nil" or @w:val = "none"]'>0</xsl:when>
+ <xsl:when test='w:tr[1]/w:tc[w:tcPr/w:tcBorders/w:bottom[not(@w:val = "nil" or @w:val = "none")]]'>1</xsl:when>
+ <xsl:otherwise>0</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:variable name='border.left'>
+ <xsl:choose>
+ <xsl:when test='$tbl.style/w:tblPr/w:tblBorders/w:left[not(@w:val = "nil" or @w:val = "none")]'>1</xsl:when>
+ <xsl:when test='$tbl.style/w:tblPr/w:tblBorders/w:left[@w:val = "nil" or @w:val = "none"]'>0</xsl:when>
+ <xsl:when test='w:tr[1]/w:tc[w:tcPr/w:tcBorders/w:left[not(@w:val = "nil" or @w:val = "none")]]'>1</xsl:when>
+ <xsl:otherwise>0</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:variable name='border.right'>
+ <xsl:choose>
+ <xsl:when test='$tbl.style/w:tblPr/w:tblBorders/w:right[not(@w:val = "nil" or @w:val = "none")]'>1</xsl:when>
+ <xsl:when test='$tbl.style/w:tblPr/w:tblBorders/w:right[@w:val = "nil" or @w:val = "none"]'>0</xsl:when>
+ <xsl:when test='w:tr[1]/w:tc[w:tcPr/w:tcBorders/w:rightt[not(@w:val = "nil" or @w:val = "none")]]'>1</xsl:when>
+ <xsl:otherwise>0</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <dbk:informaltable>
+ <xsl:choose>
+ <xsl:when test='$border.top = "1" and $border.bottom = "1" and
+ $border.left = "1" and $border.right = "1"'>
+ <xsl:attribute name='frame'>all</xsl:attribute>
+ </xsl:when>
+ <xsl:when test='$border.top = "1" and $border.bottom = "1"'>
+ <xsl:attribute name='frame'>topbot</xsl:attribute>
+ </xsl:when>
+ <xsl:when test='$border.left = "1" and $border.right = "1"'>
+ <xsl:attribute name='frame'>sides</xsl:attribute>
+ </xsl:when>
+ <xsl:when test='$border.top = "1"'>
+ <xsl:attribute name='frame'>top</xsl:attribute>
+ </xsl:when>
+ <xsl:when test='$border.bottom = "1"'>
+ <xsl:attribute name='frame'>bottom</xsl:attribute>
+ </xsl:when>
+ </xsl:choose>
+
+ <!-- TODO: analyse column widths -->
+
+ <dbk:tgroup>
+ <xsl:apply-templates select='w:tblGrid'/>
+ <xsl:choose>
+ <xsl:when test='$tbl.style/w:tblStylePr[@w:type = "firstRow"]/w:trPr/w:tblHeader'>
+ <dbk:thead>
+ <xsl:apply-templates select='w:tr[1]'/>
+ </dbk:thead>
+ <dbk:tbody>
+ <xsl:apply-templates select='w:tr[position() != 1]'/>
+ </dbk:tbody>
+ </xsl:when>
+ <xsl:otherwise>
+ <dbk:tbody>
+ <xsl:apply-templates select='w:tr'/>
+ </dbk:tbody>
+ </xsl:otherwise>
+ </xsl:choose>
+ </dbk:tgroup>
+ </dbk:informaltable>
+ </xsl:template>
+ <xsl:template match='w:tblPr'/>
+ <xsl:template match='w:tblGrid/w:gridCol'>
+ <dbk:colspec colwidth='{@w:w}*'
+ colname='column-{count(preceding-sibling::w:gridCol) + 1}'/>
+ </xsl:template>
+ <xsl:template match='w:tr'>
+ <dbk:row>
+ <xsl:apply-templates/>
+ </dbk:row>
+ </xsl:template>
+ <xsl:template match='w:tc'>
+ <xsl:variable name='tbl.style'
+ select='ancestor::w:tbl[1] |
+ key("style", ancestor::w:tbl[1]/w:tblPr/w:tblStyle/@w:val)'/>
+
+ <dbk:entry>
+ <xsl:if test='$tbl.style/w:tblPr/w:tblBorders/w:insideH[not(@w:val = "nil" or @w:val = "none")] |
+ w:tcPr/w:tcBorders/w:bottom[not(@w:val = "nil" or @w:val = "none")]'>
+ <xsl:attribute name='rowsep'>1</xsl:attribute>
+ </xsl:if>
+ <xsl:if test='$tbl.style/w:tblPr/w:tblBorders/w:insideV[not(@w:val = "nil" or @w:val = "none")] |
+ w:tcPr/w:tcBorders/w:right[not(@w:val = "nil" or @w:val = "none")]'>
+ <xsl:attribute name='colsep'>1</xsl:attribute>
+ </xsl:if>
+
+ <xsl:variable name='this.colnum'
+ select='count(preceding-sibling::w:tc) + 1 +
+ sum(preceding-sibling::w:tc/w:tcPr/w:gridSpan/@w:val) -
+ count(preceding-sibling::w:tc/w:tcPr/w:gridSpan[@w:val])'/>
+
+ <xsl:if test='w:tcPr/w:gridSpan[@w:val > 1]'>
+ <xsl:attribute name='namest'>
+ <xsl:text>column-</xsl:text>
+ <xsl:value-of select='$this.colnum'/>
+ </xsl:attribute>
+ <xsl:attribute name='nameend'>
+ <xsl:text>column-</xsl:text>
+ <xsl:value-of select='$this.colnum + w:tcPr/w:gridSpan/@w:val - 1'/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:if test='w:tcPr/w:vmerge[@w:val = "restart"]'>
+ <xsl:attribute name='morerows'>
+ <xsl:call-template name='rnd:count-rowspan'>
+ <xsl:with-param name='row' select='../following-sibling::w:tr[1]'/>
+ <xsl:with-param name='colnum' select='$this.colnum'/>
+ </xsl:call-template>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:apply-templates/>
+ </dbk:entry>
+ </xsl:template>
+
+ <xsl:template match='w:pStyle |
+ w:rStyle |
+ w:proofErr |
+ w:fldData |
+ w:instrText'/>
+
+ <xsl:template name='rnd:count-rowspan'>
+ <xsl:param name='row' select='/..'/>
+ <xsl:param name='colnum' select='0'/>
+
+ <xsl:variable name='cell'
+ select='$row/w:tc[count(preceding-sibling::w:tc) + 1 +
+ sum(preceding-sibling::w:tc/w:tcPr/w:gridSpan/@w:val) -
+ count(preceding-sibling::w:tc/w:tcPr/w:gridSpan[@w:val]) = $colnum]'/>
+
+ <xsl:choose>
+ <xsl:when test='not($cell)'>
+ <xsl:text>0</xsl:text>
+ </xsl:when>
+ <xsl:when test='$cell/w:tcPr/w:vmerge[not(@w:val = "restart")]'>
+ <xsl:variable name='remainder'>
+ <xsl:call-template name='rnd:count-rowspan'>
+ <xsl:with-param name='row'
+ select='$row/following-sibling::w:tr[1]'/>
+ <xsl:with-param name='colnum' select='$colnum'/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:value-of select='$remainder + 1'/>
+ </xsl:when>
+ <xsl:otherwise>0</xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+ <xsl:template match='w:hdr|w:ftr'/>
+
+ <xsl:template match='aml:annotation'>
+ <xsl:choose>
+ <xsl:when test='@w:type = "Word.Deletion"'/>
+ <xsl:otherwise>
+ <xsl:apply-templates/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/browser/CTOCWidget.js b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/browser/CTOCWidget.js
new file mode 100644
index 0000000..a411ea9
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/browser/CTOCWidget.js
@@ -0,0 +1,169 @@
+/*
+ * CTOCWidget.js
+ * $Revision: 1.3 $ $Date: 2003/07/14 06:02:50 $
+ */
+
+/* ***** BEGIN LICENSE BLOCK *****
+ * Version: MPL 1.1/GPL 2.0/LGPL 2.1
+ *
+ * The contents of this file are subject to the Mozilla Public License Version
+ * 1.1 (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ * http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the
+ * License.
+ *
+ * The Original Code is Netscape code.
+ *
+ * The Initial Developer of the Original Code is
+ * Netscape Corporation.
+ * Portions created by the Initial Developer are Copyright (C) 2003
+ * the Initial Developer. All Rights Reserved.
+ *
+ * Contributor(s): Bob Clary <bclary@netscape.com>
+ *
+ * ***** END LICENSE BLOCK ***** */
+
+function CTOCWidget(domTOCModel, target)
+{
+ if (domTOCModel.documentElement.nodeName != 'toc')
+ {
+ throw 'CTOCWidget called on non toc Document: ' + domTOCModel.nodeName;
+ }
+
+ this.model = domTOCModel;
+ this.target = target;
+ this.view = document.createElement('div');
+ this.view.setAttribute('class', CTOCWidget._classprefix + '_view');
+
+ var modelItems = domTOCModel.documentElement.childNodes;
+ for (var i = 0; i < modelItems.length; i++)
+ {
+ var modelItem = modelItems.item(i);
+ if (modelItem.nodeType == Node.ELEMENT_NODE)
+ {
+ var viewItem = CTOCWidget.createItemView(modelItem, target);
+ this.view.appendChild(viewItem);
+ }
+ }
+}
+
+CTOCWidget._handleImages = { open: '/toolbox/examples/2003/CTOCWidget/minus.gif', closed: '/toolbox/examples/2003/CTOCWidget/plus.gif', height: '12px', width: '16px'};
+CTOCWidget._classprefix = 'CTOCWidget';
+
+CTOCWidget.createItemView = function (modelItem, target)
+{
+ if (modelItem.nodeType != Node.ELEMENT_NODE)
+ {
+ throw 'CTOCWidget.createItemView called on non-Element: ' + modelItem.nodeName;
+ }
+
+ var i;
+
+ var viewItem = document.createElement('div');
+ viewItem.setAttribute('class', CTOCWidget._classprefix + '_item');
+
+ var viewItemHandle = document.createElement('div');
+ viewItemHandle.setAttribute('class', CTOCWidget._classprefix + '_itemhandle');
+ viewItemHandle.style.cursor = 'pointer';
+
+ var viewItemHandleImg = document.createElement('img');
+ viewItemHandleImg.style.height = CTOCWidget._handleImages.height;
+ viewItemHandleImg.style.width = CTOCWidget._handleImages.width;
+ viewItemHandleImg.addEventListener('click', CTOCWidget.toggleHandle, false);
+
+ var viewItemHandleLink;
+ if (!modelItem.getAttribute('url'))
+ {
+ viewItemHandleLink = document.createElement('span');
+ }
+ else
+ {
+ viewItemHandleLink = document.createElement('a');
+ viewItemHandleLink.setAttribute('href', modelItem.getAttribute('url'));
+ viewItemHandleLink.setAttribute('target', target);
+ }
+ viewItemHandleLink.appendChild(document.createTextNode(modelItem.getAttribute('title')));
+
+ viewItemHandle.appendChild(viewItemHandleImg);
+ viewItemHandle.appendChild(viewItemHandleLink);
+ viewItem.appendChild(viewItemHandle);
+
+ if (modelItem.childNodes.length == 0)
+ {
+ viewItemHandleImg.setAttribute('src', CTOCWidget._handleImages.open);
+ }
+ else
+ {
+ viewItemHandleImg.setAttribute('src', CTOCWidget._handleImages.closed);
+
+ var viewItemChildren = document.createElement('div');
+ viewItemChildren.setAttribute('class', CTOCWidget._classprefix + '_itemchildren');
+ viewItemChildren.style.display = 'none';
+ viewItemChildren.style.position = 'relative';
+ viewItemChildren.style.left = '1em';
+
+ for (i = 0; i < modelItem.childNodes.length; i++)
+ {
+ var modelItemChild = modelItem.childNodes.item(i);
+ if (modelItemChild.nodeType == Node.ELEMENT_NODE)
+ {
+ viewItemChildren.appendChild(CTOCWidget.createItemView(modelItemChild, target));
+ }
+ }
+
+ viewItem.appendChild(viewItemChildren);
+ }
+
+ return viewItem;
+};
+
+// fires on img part of the handle
+CTOCWidget.toggleHandle = function(e)
+{
+ switch (e.eventPhase)
+ {
+ case Event.CAPTURING_PHASE:
+ case Event.BUBBLING_PHASE:
+ return true;
+
+ case Event.AT_TARGET:
+
+ e.preventBubble();
+
+ var domHandle = e.target.parentNode;
+ var domChildren = domHandle.nextSibling;
+
+ if (!domChildren)
+ {
+ return true;
+ }
+
+ switch(domChildren.style.display)
+ {
+ case '':
+ case 'block':
+ domChildren.style.display = 'none';
+ e.target.setAttribute('src', CTOCWidget._handleImages.closed);
+ break;
+ case 'none':
+ domChildren.style.display = 'block';
+ e.target.setAttribute('src', CTOCWidget._handleImages.open);
+ break;
+ default:
+ return false;
+ }
+
+ return true;
+
+ default:
+ dump('Unknown Event Phase ' + e.eventPhase);
+ break;
+ }
+
+ return true;
+}
+
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/browser/overlay.js b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/browser/overlay.js
new file mode 100644
index 0000000..fc010fb
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/browser/overlay.js
@@ -0,0 +1,142 @@
+// -*- Java -*-
+//
+// Overlay.js, adapted from Floating image II on dynamicdrive.com
+/* Usage:
+<html>
+<head>
+<script LANGUAGE="JavaScript1.2" src="overlay.js"></script>
+...rest of head...
+</head>
+<body onload="overlaySetup(corner)">
+<div id="overlayDiv" STYLE="position:absolute;visibility:visible;">
+...body of overlay...
+</div>
+...rest of page...
+*/
+
+var overlayNS4 = document.layers ? 1 : 0;
+var overlayIE = document.all ? 1 : 0;
+var overlayNS6 = document.getElementById && !document.all ? 1 : 0;
+
+var overlayPadX = 15;
+var overlayPadY = 15;
+var overlayDelay = 60;
+
+var overlayCorner = 'ur'; // ul, ll, ur, lr, uc, lc, cl, cr
+
+function overlayRefresh() {
+ var overlayLx = 0;
+ var overlayLy = 0;
+
+ var overlayX = 0;
+ var overlayY = 0;
+ var overlayW = 0;
+ var overlayH = 0;
+ var contentH = 0;
+
+ var links = document.getElementsByTagName("body")[0];
+
+ if (overlayIE) {
+ overlayLx = document.body.clientWidth;
+ overlayLy = document.body.clientHeight;
+
+ if (document.body.parentElement) {
+ // For IE6
+ overlayLx = document.body.parentElement.clientWidth;
+ overlayLy = document.body.parentElement.clientHeight;
+ }
+
+ overlayH = overlayDiv.offsetHeight;
+ overlayW = body.offsetWidth; // overlayDiv.offsetWidth;
+ contentH = body.offsetHeight;
+ } else if (overlayNS4) {
+ overlayLy = window.innerHeight;
+ overlayLx = window.innerWidth;
+ overlayH = document.overlayDiv.clip.height;
+ overlayW = body.clip.width; // document.overlayDiv.clip.width;
+ contentH = body.clip.height;
+ } else if (overlayNS6) {
+ var odiv = document.getElementById('overlayDiv');
+
+ overlayLy = window.innerHeight;
+ overlayLx = window.innerWidth;
+ overlayH = odiv.offsetHeight;
+ overlayW = odiv.offsetWidth; // body.offsetWidth;
+ contentH = odiv.offsetHeight;
+ }
+
+ if (overlayCorner == 'ul') {
+ overlayX = overlayPadX;
+ overlayY = overlayPadY;
+ } else if (overlayCorner == 'cl') {
+ overlayX = overlayPadX;
+ overlayY = (overlayLy - overlayH) / 2;
+ } else if (overlayCorner == 'll') {
+ overlayX = overlayPadX;
+ overlayY = (overlayLy - overlayH) - overlayPadY;
+ } else if (overlayCorner == 'ur') {
+ overlayX = (overlayLx - overlayW) - overlayPadX;
+ overlayY = overlayPadY;
+ } else if (overlayCorner == 'cr') {
+ overlayX = (overlayLx - overlayW) - overlayPadX;
+ overlayY = (overlayLy - overlayH) / 2;
+ } else if (overlayCorner == 'lr') {
+ overlayX = (overlayLx - overlayW) - overlayPadX;
+ overlayY = (overlayLy - overlayH) - overlayPadY;
+ } else if (overlayCorner == 'uc') {
+ overlayX = (overlayLx - overlayW) / 2;
+ overlayY = overlayPadY;
+ } else { // overlayCorner == 'lc'
+ overlayX = (overlayLx - overlayW) / 2;
+ overlayY = (overlayLy - overlayH) - overlayPadY;
+ }
+
+ if (overlayIE) {
+ overlayDiv.style.left=overlayX;
+ overlayDiv.style.top=overlayY+document.body.scrollTop;
+
+ if (contentH > overlayLy) {
+ overlayDiv.style.visibility = "hidden";
+ }
+ } else if (overlayNS4) {
+ document.overlayDiv.pageX=overlayX;
+ document.overlayDiv.pageY=overlayY+window.pageYOffset;
+ document.overlayDiv.visibility="visible";
+
+ if (contentH > overlayLy) {
+ document.overlayDiv.style.visibility = "hidden";
+ }
+ } else if (overlayNS6) {
+ var div = document.getElementById("overlayDiv");
+ var leftpx = overlayX;
+ var toppx = overlayY+window.pageYOffset;
+ var widthpx = overlayW;
+
+ div.style.left = leftpx + "px";
+ div.style.top = toppx + "px";
+ div.style.width = widthpx + "px";
+
+ if (contentH > overlayLy) {
+ div.style.visibility = "hidden";
+ } else {
+ div.style.visibility = "visible";
+ }
+ }
+}
+
+function onad() {
+ loopfunc();
+}
+
+function loopfunc() {
+ overlayRefresh();
+ setTimeout('loopfunc()',overlayDelay);
+}
+
+function overlaySetup(corner) {
+ overlayCorner = corner;
+
+ if (overlayIE || overlayNS4 || overlayNS6) {
+ onad();
+ }
+}
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/browser/slides-default.css b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/browser/slides-default.css
new file mode 100644
index 0000000..1022d6b
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/browser/slides-default.css
@@ -0,0 +1,9 @@
+@import url('slides.css');
+
+.toclink { font-size: 10pt;
+ font-weight: normal;
+ }
+
+.toclink a { color: blue; }
+.toclink a:link { color: blue; }
+.toclink a:visited { color: blue; }
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/browser/slides-frames.css b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/browser/slides-frames.css
new file mode 100644
index 0000000..698b6a3
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/browser/slides-frames.css
@@ -0,0 +1,73 @@
+@import url('slides.css');
+
+.toc-body { margin-left: 2px;
+ margin-right: 2px;
+ }
+
+.foil-body { margin-left: 2px;
+ margin-right: 2px;
+ }
+
+h1.title { margin-top: 0px;
+ padding-top: 0px;
+ }
+
+.navhead { visibility: visible;
+ }
+
+.navfoot { visibility: visible;
+ }
+
+/* ====================================================================== */
+
+.navfoot { border-top: 1px solid black;
+ margin-top: 10px;
+ padding-top: 4px;
+ }
+/* ====================================================================== */
+
+.toc { font-weight: bold;
+ font-size: 10pt;
+ }
+
+.toc a { text-decoration: none; }
+.toc a:link { color: blue; }
+.toc a:visited { color: blue; }
+
+.toc .toc-foilgroup a { color: red; }
+.toc .toc-foilgroup a:link { color: red; }
+.toc .toc-foilgroup a:visited { color: red; }
+
+.toc .toc-titlefoil a { color: black; }
+.toc .toc-titlefoil a:link { color: black; }
+.toc .toc-titlefoil a:visited { color: black; }
+
+.toc .toc-foil a { color: blue; }
+.toc .toc-foil a:link { color: blue; }
+.toc .toc-foil a:visited { color: blue; }
+
+.toc-slidesinfo { font-family: sans-serif;
+ font-weight: bold;
+ text-align: center;
+ }
+
+.toc-titlefoil { font-family: sans-serif;
+ font-weight: bold;
+ text-align: center;
+ }
+
+.toc-foilgroup { font-family: sans-serif;
+ margin-left: 0.25in;
+ text-indent: -0.25in;
+ font-weight: bold;
+ color: red;
+ }
+
+.toc-foil { font-family: sans-serif;
+ font-size: 10pt;
+ margin-left: 0.25in;
+ text-indent: -0.4in;
+ font-weight: bold;
+ color: blue;
+ }
+
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/browser/slides-plain.css b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/browser/slides-plain.css
new file mode 100644
index 0000000..c22f289
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/browser/slides-plain.css
@@ -0,0 +1 @@
+@import url('slides.css');
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/browser/slides-table.css b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/browser/slides-table.css
new file mode 100644
index 0000000..1c195c9
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/browser/slides-table.css
@@ -0,0 +1,41 @@
+@import url('slides.css');
+
+.toc-body { margin-left: 2px;
+ margin-right: 2px;
+ }
+
+.foil-body { margin-left: 2px;
+ margin-right: 2px;
+ }
+
+.foilgroup-body { margin-left: 2px;
+ margin-right: 2px;
+ }
+
+h1.title {
+ margin-top: 0px;
+ padding-top: 0px;
+ }
+
+/* ToC Stuff */
+
+.ttoc {
+ font-size: 10pt;
+ color: white;
+ }
+
+.ttoc a { text-decoration: none; }
+.ttoc a:link { color: white }
+.ttoc a:visited { color: white }
+
+.ttoc-title {
+ font-size: 10pt;
+ }
+
+.ttoc-foilset {
+ font-size: 10pt;
+ }
+
+.ttoc-foil {
+ font-size: 10pt;
+ }
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/browser/slides-w3c.css b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/browser/slides-w3c.css
new file mode 100644
index 0000000..c22f289
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/browser/slides-w3c.css
@@ -0,0 +1 @@
+@import url('slides.css');
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/browser/slides.css b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/browser/slides.css
new file mode 100644
index 0000000..1007478
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/browser/slides.css
@@ -0,0 +1,119 @@
+/* General formatting */
+
+body { font-family: sans-serif;
+ font-weight: bold;
+ }
+
+.copyright { color: #7F7F7F;
+ }
+
+/* Title page formatting */
+
+
+.slidesinfo { text-align: center;
+ font-size: 16pt;
+ }
+
+.slidesinfo h1.title { color: blue;
+ }
+.slidesinfo h2.subtitle { color: blue;
+ }
+.slidesinfo h1.author { color: green;
+ }
+
+.slidesinfo .copyright { color: black;
+ }
+
+
+/* ToC page formatting */
+
+.tocpage h1.title { color: blue;
+ text-align: center;
+ }
+
+.tocpage a { text-decoration: none; }
+.tocpage a:link { color: blue; }
+.tocpage a:visited { color: blue; }
+
+.toc-body { margin-left: 0.5in;
+ margin-right: 0.5in;
+ }
+
+/* Foil page formatting */
+
+.foil { font-size: 16pt;
+ }
+.foil h1.title { text-align: center;
+ color: blue;
+ padding-top: 0pt;
+ margin-top: 0pt;
+ }
+.foil h2.subtitle { text-align: center;
+ color: blue;
+ padding-top: 0pt;
+ margin-top: 0pt;
+ }
+
+.foil pre { font-size: 16pt;
+ }
+
+.foil-body { margin-left: 0.5in;
+ margin-right: 0.5in;
+ }
+
+/* Foilgroup page formatting */
+
+.foilgroup { font-size: 16pt;
+ }
+.foilgroup h1.title { text-align: center;
+ color: red;
+ padding-top: 0pt;
+ margin-top: 0pt;
+ }
+.foilgroup h2.subtitle { text-align: center;
+ color: blue;
+ padding-top: 0pt;
+ margin-top: 0pt;
+ }
+
+.foilgroup-body { margin-left: 0.5in;
+ margin-right: 0.5in;
+ }
+
+/* Navigation header formatting */
+
+.navhead { border-bottom: 1px solid black;
+ margin-bottom: 10px;
+ padding-bottom: 4px;
+ }
+
+.navhead hr.top-nav-sep { display: none; }
+
+.navhead .slidestitle { font-weight: normal;
+ font-size: 10pt;
+ font-style: italic;
+ }
+
+/* Navigation footer formatting */
+
+.navfoot { border-top: 1px solid black;
+ margin-top: 10px;
+ padding-top: 4px;
+ }
+
+.navfoot hr.bottom-nav-sep { display: none; }
+
+/* General navigation formatting */
+
+.link-text { font-weight: bold;
+ font-size: 10pt;
+ }
+
+
+.link-text a { text-decoration: none; }
+.link-text a:link { color: blue; }
+.link-text a:visited { color: blue; }
+
+.no-link-text { color: #7F7F7F; }
+
+/* EOF */
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/browser/slides.js b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/browser/slides.js
new file mode 100644
index 0000000..2e48a7c
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/browser/slides.js
@@ -0,0 +1,120 @@
+// -*- Java -*-
+//
+// $Id: slides.js 4931 2005-06-21 15:45:53Z kosek $
+//
+// Copyright (C) 2002 Norman Walsh
+//
+// You are free to use, modify and distribute this software without limitation.
+// This software is provided "AS IS," without a warranty of any kind.
+//
+// This script assumes that the Netscape 'ua.js' module has also been loaded.
+
+function newPage(filename, overlay) {
+ divs = document.getElementsByTagName("div");
+
+ if (divs) {
+ var xdiv = divs[0];
+
+ if (xdiv) {
+ var xid = xdiv.getAttribute("id");
+
+ var mytoc = window.top.frames[0];
+ if (mytoc.lastUnderlined) {
+ mytoc.lastUnderlined.style.textDecoration = "none";
+ }
+
+ var tdiv = xbGetElementById(xid, mytoc);
+
+ if (tdiv) {
+ var ta = tdiv.getElementsByTagName("a").item(0);
+ ta.style.textDecoration = "underline";
+ mytoc.lastUnderlined = ta;
+ }
+ }
+ }
+
+ if (overlay != 0) {
+ overlaySetup('lc');
+ }
+}
+
+
+function navigate (evt) {
+ var kc = -1;
+
+ if (navigator.org == 'microsoft' || navigator.family == 'opera') {
+ kc = window.event.keyCode;
+ } else if (navigator.family == 'gecko') {
+ kc = evt.keyCode;
+ if(!kc) {
+ kc = evt.which;
+ }
+ } else {
+ kc = evt.which;
+ }
+
+ var forward = (kc == 110) || (kc == 78) || (kc == 32)
+ || (kc == 10) || (kc == 13) || (kc == 34)
+ || (kc == 39);
+ /* n, N, SPACE, ENTER, RETURN, PAGE UP, RIGHT ARROW */
+ var backward = (kc == 112) || (kc == 80) || (kc == 8)
+ || (kc == 33) || (kc == 37);
+ /* p, P, BACKSPACE, PAGE DOWN, LEFT ARROW */
+ var up = (kc == 117) || (kc == 85) || (kc == 38);
+ /* u, U, UP ARROW */
+ var home = (kc == 104) || (kc == 72) || (kc == 36);
+ /* h, H, HOME */
+ var toc = (kc == 116) || (kc == 84);
+ /* t, T */
+ /* previously included META (kc == 244) */
+
+ var links = document.getElementsByTagName("link");
+
+ var count = 0;
+ var target = "";
+
+ for (count = 0; count < links.length; count++) {
+ if (home && (links[count].getAttribute("rel") == 'top')) {
+ target = links[count].getAttribute("href");
+ }
+ if (toc && (links[count].getAttribute("rel") == 'contents')) {
+ target = links[count].getAttribute("href");
+ }
+ if (up && (links[count].getAttribute("rel") == 'up')) {
+ target = links[count].getAttribute("href");
+ }
+ if (forward && (links[count].getAttribute("rel") == 'next')) {
+ target = links[count].getAttribute("href");
+ }
+ if (backward && (links[count].getAttribute("rel") == 'previous')) {
+ target = links[count].getAttribute("href");
+ }
+ }
+
+ if (target != "") {
+ if (window.top.frames[1]) {
+ window.top.frames[1].location = target;
+ } else {
+ window.location = target;
+ }
+ }
+
+ return false;
+}
+
+function toggletoc (img, width, hidegraphic, showgraphic) {
+ var fsc = top.GetElementsByTagName('frameset');
+ if (fsc) {
+ var fs = fsc[0];
+ if (fs) {
+ if (fs.cols == "0,*") {
+ fs.cols = width + ",*";
+ img.src = hidegraphic;
+ } else {
+ fs.cols = "0,*";
+ img.src = showgraphic;
+ }
+ }
+ }
+}
+
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/browser/ua.js b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/browser/ua.js
new file mode 100644
index 0000000..8987659
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/browser/ua.js
@@ -0,0 +1,135 @@
+/*
+ * ua.js
+ * $Revision: 1.2 $ $Date: 2003/02/07 16:04:17 $
+ */
+
+/* ***** BEGIN LICENSE BLOCK *****
+ * Version: MPL 1.1/GPL 2.0/LGPL 2.1
+ *
+ * The contents of this file are subject to the Mozilla Public License Version
+ * 1.1 (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ * http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the
+ * License.
+ *
+ * The Original Code is Netscape code.
+ *
+ * The Initial Developer of the Original Code is
+ * Netscape Corporation.
+ * Portions created by the Initial Developer are Copyright (C) 2001
+ * the Initial Developer. All Rights Reserved.
+ *
+ * Contributor(s): Bob Clary <bclary@netscape.com>
+ *
+ * ***** END LICENSE BLOCK ***** */
+
+function xbDetectBrowser()
+{
+ var oldOnError = window.onerror;
+ var element = null;
+
+ window.onerror = null;
+
+ // work around bug in xpcdom Mozilla 0.9.1
+ window.saveNavigator = window.navigator;
+
+ navigator.OS = '';
+ navigator.version = parseFloat(navigator.appVersion);
+ navigator.org = '';
+ navigator.family = '';
+
+ var platform;
+ if (typeof(window.navigator.platform) != 'undefined')
+ {
+ platform = window.navigator.platform.toLowerCase();
+ if (platform.indexOf('win') != -1)
+ navigator.OS = 'win';
+ else if (platform.indexOf('mac') != -1)
+ navigator.OS = 'mac';
+ else if (platform.indexOf('unix') != -1 || platform.indexOf('linux') != -1 || platform.indexOf('sun') != -1)
+ navigator.OS = 'nix';
+ }
+
+ var i = 0;
+ var ua = window.navigator.userAgent.toLowerCase();
+
+ if (ua.indexOf('opera') != -1)
+ {
+ i = ua.indexOf('opera');
+ navigator.family = 'opera';
+ navigator.org = 'opera';
+ navigator.version = parseFloat('0' + ua.substr(i+6), 10);
+ }
+ else if ((i = ua.indexOf('msie')) != -1)
+ {
+ navigator.org = 'microsoft';
+ navigator.version = parseFloat('0' + ua.substr(i+5), 10);
+
+ if (navigator.version < 4)
+ navigator.family = 'ie3';
+ else
+ navigator.family = 'ie4'
+ }
+ else if (ua.indexOf('gecko') != -1)
+ {
+ navigator.family = 'gecko';
+ var rvStart = ua.indexOf('rv:');
+ var rvEnd = ua.indexOf(')', rvStart);
+ var rv = ua.substring(rvStart+3, rvEnd);
+ var rvParts = rv.split('.');
+ var rvValue = 0;
+ var exp = 1;
+
+ for (var i = 0; i < rvParts.length; i++)
+ {
+ var val = parseInt(rvParts[i]);
+ rvValue += val / exp;
+ exp *= 100;
+ }
+ navigator.version = rvValue;
+
+ if (ua.indexOf('netscape') != -1)
+ navigator.org = 'netscape';
+ else if (ua.indexOf('compuserve') != -1)
+ navigator.org = 'compuserve';
+ else
+ navigator.org = 'mozilla';
+ }
+ else if ((ua.indexOf('mozilla') !=-1) && (ua.indexOf('spoofer')==-1) && (ua.indexOf('compatible') == -1) && (ua.indexOf('opera')==-1)&& (ua.indexOf('webtv')==-1) && (ua.indexOf('hotjava')==-1))
+ {
+ var is_major = parseFloat(navigator.appVersion);
+
+ if (is_major < 4)
+ navigator.version = is_major;
+ else
+ {
+ i = ua.lastIndexOf('/')
+ navigator.version = parseFloat('0' + ua.substr(i+1), 10);
+ }
+ navigator.org = 'netscape';
+ navigator.family = 'nn' + parseInt(navigator.appVersion);
+ }
+ else if ((i = ua.indexOf('aol')) != -1 )
+ {
+ // aol
+ navigator.family = 'aol';
+ navigator.org = 'aol';
+ navigator.version = parseFloat('0' + ua.substr(i+4), 10);
+ }
+ else if ((i = ua.indexOf('hotjava')) != -1 )
+ {
+ // hotjava
+ navigator.family = 'hotjava';
+ navigator.org = 'sun';
+ navigator.version = parseFloat(navigator.appVersion);
+ }
+
+ window.onerror = oldOnError;
+}
+
+xbDetectBrowser();
+
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/browser/xbCollapsibleLists.js b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/browser/xbCollapsibleLists.js
new file mode 100644
index 0000000..6a4f93c
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/browser/xbCollapsibleLists.js
@@ -0,0 +1,537 @@
+/*
+xbCollapsibleLists.js 2001-02-26
+
+Contributor(s): Michael Bostock, Netscape Communications, Copyright 1997
+ Bob Clary, Netscape Communications, Copyright 2001
+ Seth Dillingham, Macrobyte Resources, Copyright 2001
+ Mark Filanowicz, Amdahl IT Services, Copyright 2002
+
+Netscape grants you a royalty free license to use, modify or
+distribute this software provided that this copyright notice
+appears on all copies. This software is provided "AS IS,"
+without a warranty of any kind.
+
+See xbCollapsibleLists.js.changelog.html for details of changes.
+*/
+
+
+var xbcl__id = 0;
+var xbcl_item_id = 0;
+var xbcl_mLists = new Array();
+var xbcl_parentElement = null;
+
+document.lists = xbcl_mLists;
+
+function List(visible, width, height, bgColor, collapsedImageURL, expandedImageURL)
+{
+ this.lists = new Array(); // sublists
+ this.items = new Array(); // layers
+ this.types = new Array(); // type
+ this.strs = new Array(); // content
+ this.visible = visible;
+ this.id = xbcl__id;
+ this.width = width || 350;
+ this.height = height || 22;
+
+ this.collapsedImageURL = collapsedImageURL || 'false.gif';
+ this.expandedImageURL = expandedImageURL || 'true.gif';
+
+ if (bgColor)
+ this.bgColor = bgColor;
+
+ xbcl_mLists[xbcl__id++] = this;
+}
+
+function xbcl_SetFont(i,j)
+{
+ this.fontIntro = i;
+ this.fontOutro = j;
+}
+
+function xbcl_GetFont()
+{
+ return [this.fontIntro, this.fontOutro];
+}
+
+function xbcl_setIndent(indent)
+{
+ this.i = indent;
+ if (this.i < 0)
+ {
+ this.i = 0;
+ this.space = false;
+ }
+ else
+ this.space = true;
+}
+
+function xbcl_getIndent(indent)
+{
+ return this.i;
+}
+
+function xbcl_writeItemDOMHTML( obj, s, flList, listObj )
+{
+ var styleObj;
+ var outerDiv, innerLeft, innerRight;
+ var str;
+ var leftEdge = 0;
+
+ styleObj = new xbStyle(obj);
+ styleObj.setVisibility('hidden');
+ outerDiv = document.createElement( "DIV" );
+ outerDiv.id = "DIV_" + obj.id;
+ styleObj = new xbStyle( outerDiv );
+ styleObj.setWidth( this.width );
+
+ if ( flList )
+ {
+ innerLeft = document.createElement( "DIV" );
+ innerLeft.style.position = "absolute";
+ innerLeft.style.valign = "middle";
+ leftEdge = 15;
+
+ styleObj = new xbStyle( innerLeft );
+ styleObj.setWidth( 15 );
+ styleObj.setBackgroundColor( "transparent" );
+
+ if ( listObj.visible )
+ str = '<A TARGET="_self" HREF="javascript:xbcl_expand(' + listObj.id + ');"><IMG BORDER="0" SRC="' + this.expandedImageURL + '" ID="_img' + listObj.id + '" NAME="_img' + listObj.id + '"></A>';
+ else
+ str = '<A TARGET="_self" HREF="javascript:xbcl_expand(' + listObj.id + ');"><IMG BORDER="0" SRC="' + this.collapsedImageURL + '" ID="_img' + listObj.id + '" NAME="_img' + listObj.id + '"></A>';
+
+ innerLeft.innerHTML = str;
+ outerDiv.appendChild( innerLeft );
+ }
+ else if ( this.space )
+ leftEdge = 15;
+
+ innerRight = document.createElement( "DIV" );
+ innerRight.noWrap = true;
+ innerRight.style.position = "absolute";
+
+ styleObj = new xbStyle( innerRight );
+ styleObj.setLeft( leftEdge + ( this.l * this.i ) );
+ styleObj.setWidth( this.width - 15 - this.l * this.i );
+ styleObj.setBackgroundColor( "transparent" );
+
+ // start of change by Mark Filanowicz 02-22-2002
+ if ( flList )
+ {
+ s = this.fontIntro + '<A TARGET="_self" STYLE="text-decoration: none;" HREF="javascript:xbcl_expand(' + listObj.id + ');">' + s + this.fontOutro;
+ }
+ else
+ {
+ s = this.fontIntro + s + this.fontOutro;
+ }
+ // end of change by Mark Filanowicz 02-22-2002
+
+
+ innerRight.innerHTML = s;
+ outerDiv.appendChild( innerRight );
+
+ obj.appendChild( outerDiv );
+
+ return;
+}
+
+function xbcl_writeItem( obj, s, flList, listObj )
+{
+ var cellStyle = '';
+ var str = '';
+ var styleObj = new xbStyle( obj );
+
+ styleObj.setVisibility( 'hidden' );
+
+ if ( document.body && document.body.style )
+ cellStyle = ' style="background-color: transparent;"';
+
+ str += '<TABLE WIDTH='+this.width+' NOWRAP BORDER="0" CELLPADDING="0" CELLSPACING="0"><TR>';
+
+ if ( flList )
+ {
+ str += '<TD WIDTH="15" NOWRAP VALIGN="MIDDLE"' + cellStyle + '>';
+ str += '<A TARGET="_self" HREF="javascript:xbcl_expand(' + listObj.id + ');">';
+
+ if ( listObj.visible )
+ str += '<IMG BORDER="0" SRC="' + this.expandedImageURL + '" ID="_img' + listObj.id + '" NAME="_img' + listObj.id + '">';
+ else
+ str += '<IMG BORDER="0" SRC="' + this.collapsedImageURL + '" ID="_img' + listObj.id + '" NAME="_img' + listObj.id + '">';
+
+ str += '</A></TD>';
+ }
+ else if (this.space)
+ str += '<TD WIDTH="15" NOWRAP' + cellStyle + '>&nbsp;</TD>';
+
+ if (this.l>0 && this.i>0)
+ str += '<TD WIDTH="' + this.l*this.i+ '" NOWRAP' + cellStyle + '>&nbsp;</TD>';
+
+ str += '<TD HEIGHT="' + ( this.height - 3) + '" WIDTH="' + ( this.width - 15 - this.l * this.i ) + '" VALIGN="MIDDLE" ALIGN="LEFT"' + cellStyle + '>';
+
+ // start of change by Mark Filanowicz 02-22-2002
+ if ( flList )
+ {
+ str += this.fontIntro + '<A TARGET="_self" STYLE="text-decoration: none;" HREF="javascript:xbcl_expand(' + listObj.id + ');">' + s + this.fontOutro;
+ }
+ else
+ {
+ str += this.fontIntro + s + this.fontOutro;
+ }
+ // end of change by Mark Filanowicz 02-22-2002
+
+ str += '</TD></TR></TABLE>';
+
+ styleObj.setInnerHTML( str );
+
+ return;
+}
+
+function xbcl_writeList()
+{
+ var item;
+ var i;
+ var flList;
+
+ for ( i = 0; i < this.types.length; i++ )
+ {
+ item = this.items[ i ];
+ flList = ( this.types[ i ] == 'list' );
+
+ this._writeItem( item, this.strs[ i ], flList, this.lists[ i ] );
+
+ if ( flList && this.lists[ i ].visible )
+ this.lists[ i ]._writeList();
+ }
+
+ this.built = true;
+ this.needsRewrite = false;
+ self.status = '';
+}
+
+function xbcl_showList()
+{
+ var item;
+ var styleObj;
+ var i;
+
+ for (i = 0; i < this.types.length; i++)
+ {
+ item = this.items[i];
+ styleObj = new xbStyle(item);
+ styleObj.setClipLeft(0);
+ styleObj.setClipRight(this.width);
+ styleObj.setClipTop(0);
+ if (item.height)
+ {
+ styleObj.setClipBottom(item.height);
+ styleObj.setHeight(item.height);
+ }
+ else
+ {
+ styleObj.setClipBottom(this.height);
+ styleObj.setHeight(this.height);
+ }
+
+ if ( this.visible )
+ styleObj.setVisibility( 'visible' );
+
+ var bg = item.oBgColor || this.bgColor;
+ if ((bg == null) || (bg == 'null'))
+ bg = '';
+
+ styleObj.setBackgroundColor(bg);
+
+ if (this.types[i] == 'list' && this.lists[i].visible)
+ this.lists[i]._showList();
+ }
+ this.shown = true;
+ this.needsUpdate = false;
+}
+
+function xbcl_setImage(list, item, file)
+{
+ var id = '_img' + list.id;
+ var img = null;
+
+ // for DOMHTML or IE4 use cross browser getElementById from xbStyle
+ // can't use it for NN4 since it only works for layers in NN4
+ if (document.layers)
+ img = item.document.images[0];
+ else
+ img = xbGetElementById(id);
+
+ if (img)
+ img.src = file;
+}
+
+function xbcl_getHeight()
+{
+ var totalHeight = 0;
+ var i;
+
+ if (!this.visible)
+ return 0;
+
+ for (i = 0; i < this.types.length; i++)
+ {
+ if (this.items[i].height)
+ totalHeight += this.items[i].height;
+ else
+ totalHeight += this.height;
+
+ if ((this.types[i] == 'list') && this.lists[i].visible)
+ {
+ totalHeight += this.lists[i].getHeight();
+ }
+ }
+
+ return totalHeight;
+}
+
+function xbcl_updateList(pVis, x, y)
+{
+ var currTop = y;
+ var item;
+ var styleObj;
+ var i;
+
+ for (i = 0; i < this.types.length; i++)
+ {
+ item = this.items[i];
+ styleObj = new xbStyle(item);
+
+ if (this.visible && pVis)
+ {
+ styleObj.moveTo(x, currTop);
+ if (item.height) // allow custom heights for each item
+ currTop += item.height;
+ else
+ currTop += this.height;
+
+ styleObj.setVisibility('visible');
+ }
+ else
+ {
+ styleObj.setVisibility('hidden');
+ }
+
+ if (this.types[i] == 'list')
+ {
+ if (this.lists[i].visible)
+ {
+ if (!this.lists[i].built || this.lists[i].needsRewrite)
+ this.lists[i]._writeList();
+
+ if (!this.lists[i].shown || this.lists[i].needsUpdate)
+ this.lists[i]._showList();
+
+ xbcl_setImage(this.lists[i], item, this.expandedImageURL );
+ }
+ else
+ xbcl_setImage(this.lists[i], item, this.collapsedImageURL );
+
+ if (this.lists[i].built)
+ currTop = this.lists[i]._updateList(this.visible && pVis, x, currTop);
+ }
+ }
+ return currTop;
+}
+
+function xbcl_updateParent( pid, l )
+{
+ var i;
+
+ if ( !l )
+ l = 0;
+
+ this.pid = pid;
+ this.l = l;
+
+ for ( i = 0; i < this.types.length; i++ )
+ {
+ if ( this.types[ i ] == 'list' )
+ {
+ this.lists[ i ]._updateParent( pid, l + 1 );
+ }
+ }
+}
+
+function xbcl_expand(i)
+{
+ xbcl_mLists[i].visible = !xbcl_mLists[i].visible;
+
+ if (xbcl_mLists[i].onexpand != null)
+ xbcl_mLists[i].onexpand(xbcl_mLists[i].id);
+
+ xbcl_mLists[xbcl_mLists[i].pid].rebuild();
+
+ if (xbcl_mLists[i].postexpand != null)
+ xbcl_mLists[i].postexpand(xbcl_mLists[i].id);
+}
+
+function xbcl_build(x, y)
+{
+ this._updateParent(this.id);
+ this._writeList();
+ this._showList();
+ this._updateList(true, x, y);
+ this.x = x;
+ this.y = y;
+}
+
+function xbcl_rebuild()
+{
+ this._updateList(true, this.x, this.y);
+}
+
+function xbcl_getNewItem()
+{
+ var newItem = null;
+
+ newItem = xbGetElementById('lItem' + xbcl_item_id);
+
+ if (!newItem)
+ {
+ if (document.all && !document.getElementById)
+ {
+ var parentElement = this.parentElement;
+ if (!parentElement)
+ parentElement = document.body;
+
+ parentElement.insertAdjacentHTML('beforeEnd', '<div id="lItem' + xbcl_item_id + '" style="position:absolute;"></div>');
+ newItem = xbGetElementById('lItem' + xbcl_item_id);
+ }
+ else if (document.layers)
+ {
+ if (this.parentElement)
+ newItem = new Layer(this.width, this.parentElement);
+ else
+ newItem = new Layer(this.width);
+ }
+ else if (document.createElement)
+ {
+ newItem = document.createElement('div');
+ newItem.id= 'lItem' + xbcl_item_id;
+ newItem.style.position = 'absolute';
+
+ if (this.parentElement)
+ this.parentElement.appendChild(newItem);
+ else
+ document.body.appendChild(newItem);
+ }
+ }
+
+ return newItem;
+}
+
+function xbcl_addItem(str, bgColor, item)
+{
+ if (!item)
+ item = this._getNewItem();
+
+ if (!item)
+ return;
+
+ if (bgColor)
+ item.oBgColor = bgColor;
+
+ this.items[this.items.length] = item;
+ this.types[this.types.length] = 'item';
+ this.strs[this.strs.length] = str;
+ ++xbcl_item_id;
+
+ if ( this.built )
+ {
+ this._writeItem( item, str, false );
+ xbcl_mLists[this.pid].rebuild();
+ if ( this.visible )
+ this._showList();
+ else
+ this.needsUpdate = true;
+ }
+
+ return item;
+}
+
+function xbcl_addList(list, str, bgColor, item)
+{
+ if (!item)
+ item = this._getNewItem();
+
+ if (!item)
+ return;
+
+ if (bgColor)
+ item.oBgColor = bgColor;
+
+ this.lists[this.items.length] = list;
+ this.items[this.items.length] = item;
+ this.types[this.types.length] = 'list';
+ this.strs[this.strs.length] = str;
+ ++xbcl_item_id;
+
+ list.parentList = this;
+
+ list.pid = this.pid;
+ list.l = this.l + 1;
+
+ if ( this.built )
+ {
+ this._writeItem( item, str, true, list );
+ xbcl_mLists[ this.pid ].rebuild();
+ if ( this.visible )
+ this._showList();
+ else
+ this.needsUpdate = true;
+ }
+
+ return item;
+}
+
+List.prototype.setIndent = xbcl_setIndent;
+List.prototype.getIndent = xbcl_getIndent;
+List.prototype.addItem = xbcl_addItem;
+List.prototype.addList = xbcl_addList;
+List.prototype.build = xbcl_build;
+List.prototype.rebuild = xbcl_rebuild;
+List.prototype.setFont = xbcl_SetFont;
+List.prototype.getFont = xbcl_GetFont;
+List.prototype.getHeight = xbcl_getHeight;
+
+List.prototype._writeList = xbcl_writeList;
+List.prototype._getNewItem = xbcl_getNewItem;
+
+if ( document.getElementById && document.createElement )
+ List.prototype._writeItem = xbcl_writeItemDOMHTML;
+else
+ List.prototype._writeItem = xbcl_writeItem;
+
+List.prototype._showList = xbcl_showList;
+List.prototype._updateList = xbcl_updateList;
+List.prototype._updateParent = xbcl_updateParent;
+
+List.prototype.onexpand = null;
+List.prototype.postexpand = null;
+List.prototype.lists = null; // sublists
+List.prototype.items = null; // layers
+List.prototype.types = null; // type
+List.prototype.strs = null; // content
+List.prototype.x = 0;
+List.prototype.y = 0;
+List.prototype.visible = false;
+List.prototype.id = -1;
+List.prototype.i = 18;
+List.prototype.space = true;
+List.prototype.pid = 0;
+List.prototype.fontIntro = '';
+List.prototype.fontOutro = '';
+List.prototype.width = 350;
+List.prototype.height = 22;
+List.prototype.built = false;
+List.prototype.shown = false;
+List.prototype.needsUpdate = false;
+List.prototype.needsRewrite = false;
+List.prototype.l = 0;
+List.prototype.bgColor = null;
+List.prototype.parentList = null;
+List.prototype.parentElement = null;
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/browser/xbDOM.js b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/browser/xbDOM.js
new file mode 100644
index 0000000..39cc8bf
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/browser/xbDOM.js
@@ -0,0 +1,374 @@
+/*
+ * xbDOM.js
+ * $Revision: 1.2 $ $Date: 2003/02/07 16:04:18 $
+ */
+
+/* ***** BEGIN LICENSE BLOCK *****
+ * Version: MPL 1.1/GPL 2.0/LGPL 2.1
+ *
+ * The contents of this file are subject to the Mozilla Public License Version
+ * 1.1 (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ * http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the
+ * License.
+ *
+ * The Original Code is Netscape code.
+ *
+ * The Initial Developer of the Original Code is
+ * Netscape Corporation.
+ * Portions created by the Initial Developer are Copyright (C) 2001
+ * the Initial Developer. All Rights Reserved.
+ *
+ * Contributor(s): Bob Clary <bclary@netscape.com>
+ *
+ * ***** END LICENSE BLOCK ***** */
+
+function xbToInt(s)
+{
+ var i = parseInt(s, 10);
+ if (isNaN(i))
+ i = 0;
+
+ return i;
+}
+
+function xbGetWindowWidth(windowRef)
+{
+ var width = 0;
+
+ if (!windowRef)
+ {
+ windowRef = window;
+ }
+
+ if (typeof(windowRef.innerWidth) == 'number')
+ {
+ width = windowRef.innerWidth;
+ }
+ else if (windowRef.document.body && typeof(windowRef.document.body.clientWidth) == 'number')
+ {
+ width = windowRef.document.body.clientWidth;
+ }
+
+ return width;
+}
+
+function xbGetWindowHeight(windowRef)
+{
+ var height = 0;
+
+ if (!windowRef)
+ {
+ windowRef = window;
+ }
+
+ if (typeof(windowRef.innerWidth) == 'number')
+ {
+ height = windowRef.innerHeight;
+ }
+ else if (windowRef.document.body && typeof(windowRef.document.body.clientWidth) == 'number')
+ {
+ height = windowRef.document.body.clientHeight;
+ }
+ return height;
+}
+
+function xbGetElementsByNameAndType(name, type, windowRef)
+{
+ if (!windowRef)
+ windowRef = window;
+
+ var elmlist = new Array();
+
+ xbFindElementsByNameAndType(windowRef.document, name, type, elmlist);
+
+ return elmlist;
+}
+
+function xbFindElementsByNameAndType(doc, name, type, elmlist)
+{
+ var i;
+ var subdoc;
+
+ for (i = 0; i < doc[type].length; ++i)
+ {
+ if (doc[type][i].name && name == doc[type][i].name)
+ {
+ elmlist[elmlist.length] = doc[type][i];
+ }
+ }
+
+ if (doc.layers)
+ {
+ for (i = 0; i < doc.layers.length; ++i)
+ {
+ subdoc = doc.layers[i].document;
+ xbFindElementsByNameAndType(subdoc, name, type, elmlist);
+ }
+ }
+}
+
+if (document.layers)
+{
+ nav4FindLayer =
+ function (doc, id)
+ {
+ var i;
+ var subdoc;
+ var obj;
+
+ for (i = 0; i < doc.layers.length; ++i)
+ {
+ if (doc.layers[i].id && id == doc.layers[i].id)
+ return doc.layers[i];
+
+ subdoc = doc.layers[i].document;
+ obj = nav4FindLayer(subdoc, id);
+ if (obj != null)
+ return obj;
+ }
+ return null;
+ }
+
+ nav4FindElementsByName =
+ function (doc, name, elmlist)
+ {
+ var i;
+ var j;
+ var subdoc;
+
+ for (i = 0; i < doc.images.length; ++i)
+ {
+ if (doc.images[i].name && name == doc.images[i].name)
+ {
+ elmlist[elmlist.length] = doc.images[i];
+ }
+ }
+
+ for (i = 0; i < doc.forms.length; ++i)
+ {
+ for (j = 0; j < doc.forms[i].elements.length; j++)
+ {
+ if (doc.forms[i].elements[j].name && name == doc.forms[i].elements[j].name)
+ {
+ elmlist[elmlist.length] = doc.forms[i].elements[j];
+ }
+ }
+
+ if (doc.forms[i].name && name == doc.forms[i].name)
+ {
+ elmlist[elmlist.length] = doc.forms[i];
+ }
+ }
+
+ for (i = 0; i < doc.anchors.length; ++i)
+ {
+ if (doc.anchors[i].name && name == doc.anchors[i].name)
+ {
+ elmlist[elmlist.length] = doc.anchors[i];
+ }
+ }
+
+ for (i = 0; i < doc.links.length; ++i)
+ {
+ if (doc.links[i].name && name == doc.links[i].name)
+ {
+ elmlist[elmlist.length] = doc.links[i];
+ }
+ }
+
+ for (i = 0; i < doc.applets.length; ++i)
+ {
+ if (doc.applets[i].name && name == doc.applets[i].name)
+ {
+ elmlist[elmlist.length] = doc.applets[i];
+ }
+ }
+
+ for (i = 0; i < doc.embeds.length; ++i)
+ {
+ if (doc.embeds[i].name && name == doc.embeds[i].name)
+ {
+ elmlist[elmlist.length] = doc.embeds[i];
+ }
+ }
+
+ for (i = 0; i < doc.layers.length; ++i)
+ {
+ if (doc.layers[i].name && name == doc.layers[i].name)
+ {
+ elmlist[elmlist.length] = doc.layers[i];
+ }
+
+ subdoc = doc.layers[i].document;
+ nav4FindElementsByName(subdoc, name, elmlist);
+ }
+ }
+
+ xbGetElementById = function (id, windowRef)
+ {
+ if (!windowRef)
+ windowRef = window;
+
+ return nav4FindLayer(windowRef.document, id);
+ };
+
+ xbGetElementsByName = function (name, windowRef)
+ {
+ if (!windowRef)
+ windowRef = window;
+
+ var elmlist = new Array();
+
+ nav4FindElementsByName(windowRef.document, name, elmlist);
+
+ return elmlist;
+ };
+
+}
+else if (document.all)
+{
+ xbGetElementById =
+ function (id, windowRef)
+ {
+ if (!windowRef)
+ {
+ windowRef = window;
+ }
+ var elm = windowRef.document.all[id];
+ if (!elm)
+ {
+ elm = null;
+ }
+ return elm;
+ };
+
+ xbGetElementsByName = function (name, windowRef)
+ {
+ if (!windowRef)
+ windowRef = window;
+
+ var i;
+ var idnamelist = windowRef.document.all[name];
+ var elmlist = new Array();
+
+ if (!idnamelist.length || idnamelist.name == name)
+ {
+ if (idnamelist)
+ elmlist[elmlist.length] = idnamelist;
+ }
+ else
+ {
+ for (i = 0; i < idnamelist.length; i++)
+ {
+ if (idnamelist[i].name == name)
+ elmlist[elmlist.length] = idnamelist[i];
+ }
+ }
+
+ return elmlist;
+ }
+
+}
+else if (document.getElementById)
+{
+ xbGetElementById =
+ function (id, windowRef)
+ {
+ if (!windowRef)
+ {
+ windowRef = window;
+ }
+ return windowRef.document.getElementById(id);
+ };
+
+ xbGetElementsByName =
+ function (name, windowRef)
+ {
+ if (!windowRef)
+ {
+ windowRef = window;
+ }
+ return windowRef.document.getElementsByName(name);
+ };
+}
+else
+{
+ xbGetElementById =
+ function (id, windowRef)
+ {
+ return null;
+ };
+
+ xbGetElementsByName =
+ function (name, windowRef)
+ {
+ return new Array();
+ };
+}
+
+function xbGetPageScrollX(windowRef)
+{
+ if (!windowRef)
+ {
+ windowRef = window;
+ }
+
+ if (typeof(windowRef.pageXOffset) == 'number')
+ {
+ return windowRef.pageXOffset;
+ }
+
+ if (typeof(windowRef.document.body && windowRef.document.body.scrollLeft) == 'number')
+ {
+ return windowRef.document.body.scrollLeft;
+ }
+
+ return 0;
+}
+
+function xbGetPageScrollY(windowRef)
+{
+ if (!windowRef)
+ {
+ windowRef = window;
+ }
+
+ if (typeof(windowRef.pageYOffset) == 'number')
+ {
+ return windowRef.pageYOffset;
+ }
+
+ if (typeof(windowRef.document.body && windowRef.document.body.scrollTop) == 'number')
+ {
+ return windowRef.document.body.scrollTop;
+ }
+
+ return 0;
+}
+
+if (document.layers)
+{
+ xbSetInnerHTML =
+ function (element, str)
+ {
+ element.document.write(str);
+ element.document.close();
+ };
+}
+else
+{
+ xbSetInnerHTML = function (element, str)
+ {
+ if (typeof(element.innerHTML) != 'undefined')
+ {
+ element.innerHTML = str;
+ }
+ };
+}
+
+// eof: xbDOM.js
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/browser/xbDebug.js b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/browser/xbDebug.js
new file mode 100644
index 0000000..48fd010
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/browser/xbDebug.js
@@ -0,0 +1,311 @@
+/*
+ * xbDebug.js
+ * $Revision: 1.2 $ $Date: 2003/02/07 16:04:19 $
+ */
+
+/* ***** BEGIN LICENSE BLOCK *****
+ * Version: MPL 1.1/GPL 2.0/LGPL 2.1
+ *
+ * The contents of this file are subject to the Mozilla Public License Version
+ * 1.1 (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ * http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the
+ * License.
+ *
+ * The Original Code is Netscape code.
+ *
+ * The Initial Developer of the Original Code is
+ * Netscape Corporation.
+ * Portions created by the Initial Developer are Copyright (C) 2001
+ * the Initial Developer. All Rights Reserved.
+ *
+ * Contributor(s): Bob Clary <bclary@netscape.com>
+ *
+ * ***** END LICENSE BLOCK ***** */
+
+/*
+ChangeLog:
+
+2002-02-25: bclary - modified xbDebugTraceOject to make sure
+ that original versions of wrapped functions were not
+ rewrapped. This had caused an infinite loop in IE.
+
+2002-02-07: bclary - modified xbDebug.prototype.close to not null
+ the debug window reference. This can cause problems with
+ Internet Explorer if the page is refreshed. These issues will
+ be addressed at a later date.
+*/
+
+function xbDebug()
+{
+ this.on = false;
+ this.stack = new Array();
+ this.debugwindow = null;
+ this.execprofile = new Object();
+}
+
+xbDebug.prototype.push = function ()
+{
+ this.stack[this.stack.length] = this.on;
+ this.on = true;
+}
+
+xbDebug.prototype.pop = function ()
+{
+ this.on = this.stack[this.stack.length - 1];
+ --this.stack.length;
+}
+
+xbDebug.prototype.open = function ()
+{
+ if (this.debugwindow && !this.debugwindow.closed)
+ this.close();
+
+ this.debugwindow = window.open('about:blank', 'DEBUGWINDOW', 'height=400,width=600,resizable=yes,scrollbars=yes');
+ this.debugwindow.moveTo(0,0);
+ window.focus();
+
+ this.debugwindow.document.write('<html><head><title>xbDebug Window</title></head><body><h3>Javascript Debug Window</h3></body></html>');
+}
+
+xbDebug.prototype.close = function ()
+{
+ if (!this.debugwindow)
+ return;
+
+ if (!this.debugwindow.closed)
+ this.debugwindow.close();
+
+ // bc 2002-02-07, other windows may still hold a reference to this: this.debugwindow = null;
+}
+
+xbDebug.prototype.dump = function (msg)
+{
+ if (!this.on)
+ return;
+
+ if (!this.debugwindow || this.debugwindow.closed)
+ this.open();
+
+ this.debugwindow.document.write(msg + '<br>');
+
+ return;
+}
+
+var xbDEBUG = new xbDebug();
+
+window.onunload = function () { xbDEBUG.close(); }
+
+function xbDebugGetFunctionName(funcref)
+{
+
+ if (!funcref)
+ {
+ return '';
+ }
+
+ if (funcref.name)
+ return funcref.name;
+
+ var name = funcref + '';
+ name = name.substring(name.indexOf(' ') + 1, name.indexOf('('));
+ funcref.name = name;
+
+ if (!name) alert('name not defined');
+ return name;
+}
+
+
+// emulate functionref.apply for IE mac and IE win < 5.5
+function xbDebugApplyFunction(funcname, funcref, thisref, argumentsref)
+{
+ var rv;
+
+ if (!funcref)
+ {
+ alert('xbDebugApplyFunction: funcref is null');
+ }
+
+ if (typeof(funcref.apply) != 'undefined')
+ return funcref.apply(thisref, argumentsref);
+
+ var applyexpr = 'thisref.xbDebug_orig_' + funcname + '(';
+ var i;
+
+ for (i = 0; i < argumentsref.length; i++)
+ {
+ applyexpr += 'argumentsref[' + i + '],';
+ }
+
+ if (argumentsref.length > 0)
+ {
+ applyexpr = applyexpr.substring(0, applyexpr.length - 1);
+ }
+
+ applyexpr += ')';
+
+ return eval(applyexpr);
+}
+
+function xbDebugCreateFunctionWrapper(scopename, funcname, precall, postcall)
+{
+ var wrappedfunc;
+ var scopeobject = eval(scopename);
+ var funcref = scopeobject[funcname];
+
+ scopeobject['xbDebug_orig_' + funcname] = funcref;
+
+ wrappedfunc = function ()
+ {
+ var rv;
+
+ precall(scopename, funcname, arguments);
+ rv = xbDebugApplyFunction(funcname, funcref, scopeobject, arguments);
+ postcall(scopename, funcname, arguments, rv);
+ return rv;
+ };
+
+ if (typeof(funcref.constructor) != 'undefined')
+ wrappedfunc.constructor = funcref.constuctor;
+
+ if (typeof(funcref.prototype) != 'undefined')
+ wrappedfunc.prototype = funcref.prototype;
+
+ scopeobject[funcname] = wrappedfunc;
+}
+
+function xbDebugCreateMethodWrapper(contextname, classname, methodname, precall, postcall)
+{
+ var context = eval(contextname);
+ var methodref = context[classname].prototype[methodname];
+
+ context[classname].prototype['xbDebug_orig_' + methodname] = methodref;
+
+ var wrappedmethod = function ()
+ {
+ var rv;
+ // eval 'this' at method run time to pick up reference to the object's instance
+ var thisref = eval('this');
+ // eval 'arguments' at method run time to pick up method's arguments
+ var argsref = arguments;
+
+ precall(contextname + '.' + classname, methodname, argsref);
+ rv = xbDebugApplyFunction(methodname, methodref, thisref, argsref);
+ postcall(contextname + '.' + classname, methodname, argsref, rv);
+ return rv;
+ };
+
+ return wrappedmethod;
+}
+
+function xbDebugPersistToString(obj)
+{
+ var s = '';
+
+ if (obj == null)
+ return 'null';
+
+ switch(typeof(obj))
+ {
+ case 'number':
+ return obj;
+ case 'string':
+ return '"' + obj + '"';
+ case 'undefined':
+ return 'undefined';
+ case 'boolean':
+ return obj + '';
+ }
+
+ if (obj.constructor)
+ return '[' + xbDebugGetFunctionName(obj.constructor) + ']';
+
+ return null;
+}
+
+function xbDebugTraceBefore(scopename, funcname, funcarguments)
+{
+ var i;
+ var s = '';
+ var execprofile = xbDEBUG.execprofile[scopename + '.' + funcname];
+ if (!execprofile)
+ execprofile = xbDEBUG.execprofile[scopename + '.' + funcname] = { started: 0, time: 0, count: 0 };
+
+ for (i = 0; i < funcarguments.length; i++)
+ {
+ s += xbDebugPersistToString(funcarguments[i]);
+ if (i < funcarguments.length - 1)
+ s += ', ';
+ }
+
+ xbDEBUG.dump('enter ' + scopename + '.' + funcname + '(' + s + ')');
+ execprofile.started = (new Date()).getTime();
+}
+
+function xbDebugTraceAfter(scopename, funcname, funcarguments, rv)
+{
+ var i;
+ var s = '';
+ var execprofile = xbDEBUG.execprofile[scopename + '.' + funcname];
+ if (!execprofile)
+ xbDEBUG.dump('xbDebugTraceAfter: execprofile not created for ' + scopename + '.' + funcname);
+ else if (execprofile.started == 0)
+ xbDEBUG.dump('xbDebugTraceAfter: execprofile.started == 0 for ' + scopename + '.' + funcname);
+ else
+ {
+ execprofile.time += (new Date()).getTime() - execprofile.started;
+ execprofile.count++;
+ execprofile.started = 0;
+ }
+
+ for (i = 0; i < funcarguments.length; i++)
+ {
+ s += xbDebugPersistToString(funcarguments[i]);
+ if (i < funcarguments.length - 1)
+ s += ', ';
+ }
+
+ xbDEBUG.dump('exit ' + scopename + '.' + funcname + '(' + s + ')==' + xbDebugPersistToString(rv));
+}
+
+function xbDebugTraceFunction(scopename, funcname)
+{
+ xbDebugCreateFunctionWrapper(scopename, funcname, xbDebugTraceBefore, xbDebugTraceAfter);
+}
+
+function xbDebugTraceObject(contextname, classname)
+{
+ var classref = eval(contextname + '.' + classname);
+ var p;
+ var sp;
+
+ if (!classref || !classref.prototype)
+ return;
+
+ for (p in classref.prototype)
+ {
+ sp = p + '';
+ if (typeof(classref.prototype[sp]) == 'function' && (sp).indexOf('xbDebug_orig') == -1)
+ {
+ classref.prototype[sp] = xbDebugCreateMethodWrapper(contextname, classname, sp, xbDebugTraceBefore, xbDebugTraceAfter);
+ }
+ }
+}
+
+function xbDebugDumpProfile()
+{
+ var p;
+ var execprofile;
+ var avg;
+
+ for (p in xbDEBUG.execprofile)
+ {
+ execprofile = xbDEBUG.execprofile[p];
+ avg = Math.round ( 100 * execprofile.time/execprofile.count) /100;
+ xbDEBUG.dump('Execution profile ' + p + ' called ' + execprofile.count + ' times. Total time=' + execprofile.time + 'ms. Avg Time=' + avg + 'ms.');
+ }
+}
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/browser/xbLibrary.js b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/browser/xbLibrary.js
new file mode 100644
index 0000000..9bbfd6b
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/browser/xbLibrary.js
@@ -0,0 +1,80 @@
+/*
+ * xbLibrary.js
+ * $Revision: 1.3 $ $Date: 2003/03/17 03:44:20 $
+ */
+
+/* ***** BEGIN LICENSE BLOCK *****
+ * Version: MPL 1.1/GPL 2.0/LGPL 2.1
+ *
+ * The contents of this file are subject to the Mozilla Public License Version
+ * 1.1 (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ * http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the
+ * License.
+ *
+ * The Original Code is Bob Clary code.
+ *
+ * The Initial Developer of the Original Code is
+ * Bob Clary.
+ * Portions created by the Initial Developer are Copyright (C) 2000
+ * the Initial Developer. All Rights Reserved.
+ *
+ * Contributor(s): Bob Clary <bc@bclary.com>
+ *
+ * ***** END LICENSE BLOCK ***** */
+
+if (!document.getElementById || navigator.userAgent.indexOf('Opera') != -1)
+{
+ // assign error handler for downlevel browsers
+ // Note until Opera improves it's overall support
+ // for JavaScript and the DOM, it must be considered downlevel
+
+ window.onerror = defaultOnError;
+
+ function defaultOnError(msg, url, line)
+ {
+ // handle bug in NS6.1, N6.2
+ // where an Event is passed to error handlers
+ if (typeof(msg) != 'string')
+ {
+ msg = 'unknown error';
+ }
+ if (typeof(url) != 'string')
+ {
+ url = document.location;
+ }
+
+ alert('An error has occurred at ' + url + ', line ' + line + ': ' + msg);
+ }
+}
+
+function xbLibrary(path)
+{
+ if (path.charAt(path.length-1) == '/')
+ {
+ path = path.substr(0, path.length-1)
+ }
+ this.path = path;
+}
+
+// dynamically loaded scripts
+//
+// it is an error to reference anything from the dynamically loaded file inside the
+// same script block. This means that a file can not check its dependencies and
+// load the files for it's own use. someone else must do this.
+
+xbLibrary.prototype.loadScript =
+function (scriptName)
+{
+ document.write('<script language="javascript" src="' + this.path + '/' + scriptName + '"><\/script>');
+};
+
+// default xbLibrary
+
+xblibrary = new xbLibrary('./');
+
+
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/browser/xbStyle-css.js b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/browser/xbStyle-css.js
new file mode 100644
index 0000000..f5b8467
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/browser/xbStyle-css.js
@@ -0,0 +1,791 @@
+/*
+ * xbStyle-css.js
+ * $Revision: 1.2 $ $Date: 2003/02/07 16:04:21 $
+ *
+ */
+
+/* ***** BEGIN LICENSE BLOCK *****
+ * Version: MPL 1.1/GPL 2.0/LGPL 2.1
+ *
+ * The contents of this file are subject to the Mozilla Public License Version
+ * 1.1 (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ * http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the
+ * License.
+ *
+ * The Original Code is Netscape code.
+ *
+ * The Initial Developer of the Original Code is
+ * Netscape Corporation.
+ * Portions created by the Initial Developer are Copyright (C) 2001
+ * the Initial Developer. All Rights Reserved.
+ *
+ * Contributor(s): Bob Clary <bclary@netscape.com>
+ *
+ * ***** END LICENSE BLOCK ***** */
+
+// xbStyle.getClip()
+
+function cssStyleGetClip()
+{
+ var clip = this.getEffectiveValue('clip');
+
+ // hack opera
+ if (clip == 'rect()')
+ clip = '';
+
+ if (clip == '' || clip == 'auto')
+ {
+ clip = 'rect(0px, ' + this.getWidth() + 'px, ' + this.getHeight() + 'px, 0px)';
+ }
+ else
+ {
+ clip = clip.replace(/px /g, 'px, ');
+ }
+
+ return clip;
+}
+
+// xbStyle.setClip()
+
+function cssStyleSetClip(sClipString)
+{
+ this.styleObj.clip = sClipString;
+}
+
+// xbStyle.getClipTop()
+
+function cssStyleGetClipTop()
+{
+ var clip = this.getClip();
+ var rect = new xbClipRect(clip);
+ return rect.top;
+}
+
+// xbStyle.setClipTop()
+
+function cssStyleSetClipTop(top)
+{
+ var clip = this.getClip();
+ var rect = new xbClipRect(clip);
+ rect.top = top;
+ this.styleObj.clip = rect.toString();
+}
+
+// xbStyle.getClipRight()
+
+function cssStyleGetClipRight()
+{
+ var clip = this.getClip();
+ var rect = new xbClipRect(clip);
+ return rect.right;
+}
+
+// xbStyle.setClipRight()
+
+function cssStyleSetClipRight(right)
+{
+ var clip = this.getClip();
+ var rect = new xbClipRect(clip);
+ rect.right = right;
+ this.styleObj.clip = rect.toString();
+}
+
+// xbStyle.getClipBottom()
+
+function cssStyleGetClipBottom()
+{
+ var clip = this.getClip();
+ var rect = new xbClipRect(clip);
+ return rect.bottom;
+}
+
+// xbStyle.setClipBottom()
+
+function cssStyleSetClipBottom(bottom)
+{
+ var clip = this.getClip();
+ var rect = new xbClipRect(clip);
+ rect.bottom = bottom;
+ this.styleObj.clip = rect.toString();
+}
+
+// xbStyle.getClipLeft()
+
+function cssStyleGetClipLeft()
+{
+ var clip = this.getClip();
+ var rect = new xbClipRect(clip);
+ return rect.left;
+}
+
+// xbStyle.setClipLeft()
+
+function cssStyleSetClipLeft(left)
+{
+ var clip = this.getClip();
+ var rect = new xbClipRect(clip);
+ rect.left = left;
+ this.styleObj.clip = rect.toString();
+}
+
+// xbStyle.getClipWidth()
+
+function cssStyleGetClipWidth()
+{
+ var clip = this.getClip();
+ var rect = new xbClipRect(clip);
+ return rect.getWidth();
+}
+
+// xbStyle.setClipWidth()
+
+function cssStyleSetClipWidth(width)
+{
+ var clip = this.getClip();
+ var rect = new xbClipRect(clip);
+ rect.setWidth(width);
+ this.styleObj.clip = rect.toString();
+}
+
+// xbStyle.getClipHeight()
+
+function cssStyleGetClipHeight()
+{
+ var clip = this.getClip();
+ var rect = new xbClipRect(clip);
+ return rect.getHeight();
+}
+
+// xbStyle.setClipHeight()
+
+function cssStyleSetClipHeight(height)
+{
+ var clip = this.getClip();
+ var rect = new xbClipRect(clip);
+ rect.setHeight(height);
+ this.styleObj.clip = rect.toString();
+}
+
+// the CSS attributes left,top are for absolutely positioned elements
+// measured relative to the containing element. for relatively positioned
+// elements, left,top are measured from the element's normal inline position.
+// getLeft(), setLeft() operate on this type of coordinate.
+//
+// to allow dynamic positioning the getOffsetXXX and setOffsetXXX methods are
+// defined to return and set the position of either an absolutely or relatively
+// positioned element relative to the containing element.
+//
+//
+
+// xbStyle.getLeft()
+
+function cssStyleGetLeft()
+{
+ var left = this.getEffectiveValue('left');
+ if (typeof(left) == 'number')
+ return left;
+
+ if (left != '' && left.indexOf('px') == -1)
+ {
+ xbDEBUG.dump('xbStyle.getLeft: Element ID=' + this.object.id + ' does not use pixels as units. left=' + left + ' Click Ok to continue, Cancel to Abort');
+ return 0;
+ }
+
+ if (top == 'auto' && this.object && typeof(this.object.offsetTop) == 'number')
+ {
+ left = this.object.offsetTop + 'px';
+ }
+
+ if (left == '')
+ left = '0px';
+
+ return xbToInt(left);
+}
+
+// xbStyle.setLeft()
+
+function cssStyleSetLeft(left)
+{
+ if (typeof(this.styleObj.left) == 'number')
+ this.styleObj.left = left;
+ else
+ this.styleObj.left = left + 'px';
+}
+
+// xbStyle.getTop()
+
+function cssStyleGetTop()
+{
+ var top = this.getEffectiveValue('top');
+ if (typeof(top) == 'number')
+ return top;
+
+ if (top != '' && top.indexOf('px') == -1)
+ {
+ xbDEBUG.dump('xbStyle.getTop: Element ID=' + this.object.id + ' does not use pixels as units. top=' + top + ' Click Ok to continue, Cancel to Abort');
+ return 0;
+ }
+
+ if (top == 'auto' && this.object && typeof(this.object.offsetTop) == 'number')
+ {
+ top = this.object.offsetTop + 'px';
+ }
+
+ if (top == '')
+ top = '0px';
+
+ return xbToInt(top);
+}
+
+// xbStyle.setTop()
+
+function cssStyleSetTop(top)
+{
+ if (typeof(this.styleObj.top) == 'number')
+ this.styleObj.top = top;
+ else
+ this.styleObj.top = top + 'px';
+}
+
+// xbStyle.getPageX()
+
+function cssStyleGetPageX()
+{
+ var x = 0;
+ var elm = this.object;
+ var elmstyle;
+ var position;
+
+ //xxxHack: Due to limitations in Gecko's (0.9.6) ability to determine the
+ // effective position attribute , attempt to use offsetXXX
+
+ if (typeof(elm.offsetLeft) == 'number')
+ {
+ while (elm)
+ {
+ x += elm.offsetLeft;
+ elm = elm.offsetParent;
+ }
+ }
+ else
+ {
+ while (elm)
+ {
+ if (elm.style)
+ {
+ elmstyle = new xbStyle(elm);
+ position = elmstyle.getEffectiveValue('position');
+ if (position != '' && position != 'static')
+ x += elmstyle.getLeft();
+ }
+ elm = elm.parentNode;
+ }
+ }
+
+ return x;
+}
+
+// xbStyle.setPageX()
+
+function cssStyleSetPageX(x)
+{
+ var xParent = 0;
+ var elm = this.object.parentNode;
+ var elmstyle;
+ var position;
+
+ //xxxHack: Due to limitations in Gecko's (0.9.6) ability to determine the
+ // effective position attribute , attempt to use offsetXXX
+
+ if (elm && typeof(elm.offsetLeft) == 'number')
+ {
+ while (elm)
+ {
+ xParent += elm.offsetLeft;
+ elm = elm.offsetParent;
+ }
+ }
+ else
+ {
+ while (elm)
+ {
+ if (elm.style)
+ {
+ elmstyle = new xbStyle(elm);
+ position = elmstyle.getEffectiveValue('position');
+ if (position != '' && position != 'static')
+ xParent += elmstyle.getLeft();
+ }
+ elm = elm.parentNode;
+ }
+ }
+
+ x -= xParent;
+
+ this.setLeft(x);
+}
+
+// xbStyle.getPageY()
+
+function cssStyleGetPageY()
+{
+ var y = 0;
+ var elm = this.object;
+ var elmstyle;
+ var position;
+
+ //xxxHack: Due to limitations in Gecko's (0.9.6) ability to determine the
+ // effective position attribute , attempt to use offsetXXX
+
+ if (typeof(elm.offsetTop) == 'number')
+ {
+ while (elm)
+ {
+ y += elm.offsetTop;
+ elm = elm.offsetParent;
+ }
+ }
+ else
+ {
+ while (elm)
+ {
+ if (elm.style)
+ {
+ elmstyle = new xbStyle(elm);
+ position = elmstyle.getEffectiveValue('position');
+ if (position != '' && position != 'static')
+ y += elmstyle.getTop();
+ }
+ elm = elm.parentNode;
+ }
+ }
+
+ return y;
+}
+
+// xbStyle.setPageY()
+
+function cssStyleSetPageY(y)
+{
+ var yParent = 0;
+ var elm = this.object.parentNode;
+ var elmstyle;
+ var position;
+
+ //xxxHack: Due to limitations in Gecko's (0.9.6) ability to determine the
+ // effective position attribute , attempt to use offsetXXX
+
+ if (elm && typeof(elm.offsetTop) == 'number')
+ {
+ while (elm)
+ {
+ yParent += elm.offsetTop;
+ elm = elm.offsetParent;
+ }
+ }
+ else
+ {
+ while (elm)
+ {
+ if (elm.style)
+ {
+ elmstyle = new xbStyle(elm);
+ position = elmstyle.getEffectiveValue('position');
+ if (position != '' && position != 'static')
+ yParent += elmstyle.getTop();
+ }
+ elm = elm.parentNode;
+ }
+ }
+
+ y -= yParent;
+
+ this.setTop(y);
+}
+
+// xbStyle.getHeight()
+
+function cssStyleGetHeight()
+{
+ var display = this.getEffectiveValue('display');
+ var height = this.getEffectiveValue('height');
+
+ if (typeof(height) == 'number')
+ {
+ // Opera
+ return height;
+ }
+
+ if (height == '' || height == 'auto' || height.indexOf('%') != -1)
+ {
+ if (typeof(this.object.offsetHeight) == 'number')
+ {
+ height = this.object.offsetHeight + 'px';
+ }
+ else if (typeof(this.object.scrollHeight) == 'number')
+ {
+ height = this.object.scrollHeight + 'px';
+ }
+ }
+
+ if (height.indexOf('px') == -1)
+ {
+ xbDEBUG.dump('xbStyle.getHeight: Element ID=' + this.object.id + ' does not use pixels as units. height=' + height + ' Click Ok to continue, Cancel to Abort');
+ return 0;
+ }
+
+ height = xbToInt(height);
+
+ return height;
+}
+
+// xbStyle.setHeight()
+
+function cssStyleSetHeight(height)
+{
+ if (typeof(this.styleObj.height) == 'number')
+ this.styleObj.height = height;
+ else
+ this.styleObj.height = height + 'px';
+}
+
+// xbStyle.getWidth()
+
+function cssStyleGetWidth()
+{
+ var display = this.getEffectiveValue('display');
+ var width = this.getEffectiveValue('width');
+
+ if (typeof(width) == 'number')
+ {
+ // note Opera 6 has a bug in width and offsetWidth where
+ // it returns the page width. Use clientWidth instead.
+ if (navigator.userAgent.indexOf('Opera') != -1)
+ return this.object.clientWidth;
+ else
+ return width;
+ }
+
+ if (width == '' || width == 'auto' || width.indexOf('%') != -1)
+ {
+ if (typeof(this.object.offsetWidth) == 'number')
+ {
+ width = this.object.offsetWidth + 'px';
+ }
+ else if (typeof(this.object.scrollHeight) == 'number')
+ {
+ width = this.object.scrollWidth + 'px';
+ }
+ }
+
+ if (width.indexOf('px') == -1)
+ {
+ xbDEBUG.dump('xbStyle.getWidth: Element ID=' + this.object.id + ' does not use pixels as units. width=' + width + ' Click Ok to continue, Cancel to Abort');
+ return 0;
+ }
+
+ width = xbToInt(width);
+
+ return width;
+}
+
+// xbStyle.setWidth()
+
+function cssStyleSetWidth(width)
+{
+ if (typeof(this.styleObj.width) == 'number')
+ this.styleObj.width = width;
+ else
+ this.styleObj.width = width + 'px';
+}
+
+// xbStyle.getVisibility()
+
+function cssStyleGetVisibility()
+{
+ return this.getEffectiveValue('visibility');
+}
+
+// xbStyle.setVisibility()
+
+function cssStyleSetVisibility(visibility)
+{
+ this.styleObj.visibility = visibility;
+}
+
+// xbStyle.getzIndex()
+
+function cssStyleGetzIndex()
+{
+ return xbToInt(this.getEffectiveValue('zIndex'));
+}
+
+// xbStyle.setzIndex()
+
+function cssStyleSetzIndex(zIndex)
+{
+ this.styleObj.zIndex = zIndex;
+}
+
+// xbStyle.getBackgroundColor()
+
+function cssStyleGetBackgroundColor()
+{
+ return this.getEffectiveValue('backgroundColor');
+}
+
+// xbStyle.setBackgroundColor()
+
+function cssStyleSetBackgroundColor(color)
+{
+ this.styleObj.backgroundColor = color;
+}
+
+// xbStyle.getColor()
+
+function cssStyleGetColor()
+{
+ return this.getEffectiveValue('color');
+}
+
+// xbStyle.setColor()
+
+function cssStyleSetColor(color)
+{
+ this.styleObj.color = color;
+}
+
+// xbStyle.moveAbove()
+
+function xbStyleMoveAbove(cont)
+{
+ this.setzIndex(cont.getzIndex()+1);
+}
+
+// xbStyle.moveBelow()
+
+function xbStyleMoveBelow(cont)
+{
+ var zindex = cont.getzIndex() - 1;
+
+ this.setzIndex(zindex);
+}
+
+// xbStyle.moveBy()
+
+function xbStyleMoveBy(deltaX, deltaY)
+{
+ this.moveTo(this.getLeft() + deltaX, this.getTop() + deltaY);
+}
+
+// xbStyle.moveTo()
+
+function xbStyleMoveTo(x, y)
+{
+ this.setLeft(x);
+ this.setTop(y);
+}
+
+// xbStyle.moveToAbsolute()
+
+function xbStyleMoveToAbsolute(x, y)
+{
+ this.setPageX(x);
+ this.setPageY(y);
+}
+
+// xbStyle.resizeBy()
+
+function xbStyleResizeBy(deltaX, deltaY)
+{
+ this.setWidth( this.getWidth() + deltaX );
+ this.setHeight( this.getHeight() + deltaY );
+}
+
+// xbStyle.resizeTo()
+
+function xbStyleResizeTo(x, y)
+{
+ this.setWidth(x);
+ this.setHeight(y);
+}
+
+// xbStyle.setInnerHTML()
+
+function xbSetInnerHTML(str)
+{
+ if (typeof(this.object.innerHTML) != 'undefined')
+ this.object.innerHTML = str;
+}
+
+
+// Extensions to xbStyle that are not supported by Netscape Navigator 4
+// but that provide cross browser implementations of properties for
+// Mozilla, Gecko, Netscape 6.x and Opera
+
+// xbStyle.getBorderTopWidth()
+
+function cssStyleGetBorderTopWidth()
+{
+ return xbToInt(this.getEffectiveValue('borderTopWidth'));
+}
+
+// xbStyle.getBorderRightWidth()
+
+function cssStyleGetBorderRightWidth()
+{
+ return xbToInt(this.getEffectiveValue('borderRightWidth'));
+}
+
+// xbStyle.getBorderBottomWidth()
+
+function cssStyleGetBorderBottomWidth()
+{
+ return xbToInt(this.getEffectiveValue('borderBottomWidth'));
+}
+
+// xbStyle.getBorderLeftWidth()
+
+function cssStyleGetBorderLeftWidth()
+{
+ return xbToInt(this.getEffectiveValue('borderLeftWidth'));
+}
+
+// xbStyle.getMarginTop()
+
+function cssStyleGetMarginTop()
+{
+ return xbToInt(this.getEffectiveValue('marginTop'));
+}
+
+// xbStyle.getMarginRight()
+
+function cssStyleGetMarginRight()
+{
+ return xbToInt(this.getEffectiveValue('marginRight'));
+}
+
+// xbStyle.getMarginBottom()
+
+function cssStyleGetMarginBottom()
+{
+ return xbToInt(this.getEffectiveValue('marginBottom'));
+}
+
+// xbStyle.getMarginLeft()
+
+function cssStyleGetMarginLeft()
+{
+ return xbToInt(this.getEffectiveValue('marginLeft'));
+}
+
+// xbStyle.getPaddingTop()
+
+function cssStyleGetPaddingTop()
+{
+ return xbToInt(this.getEffectiveValue('paddingTop'));
+}
+
+// xbStyle.getPaddingRight()
+
+function cssStyleGetPaddingRight()
+{
+ return xbToInt(this.getEffectiveValue('paddingRight'));
+}
+
+// xbStyle.getPaddingBottom()
+
+function cssStyleGetPaddingBottom()
+{
+ return xbToInt(this.getEffectiveValue('paddingBottom'));
+}
+
+// xbStyle.getPaddingLeft()
+
+function cssStyleGetPaddingLeft()
+{
+ return xbToInt(this.getEffectiveValue('paddingLeft'));
+}
+
+// xbStyle.getClientWidth()
+
+function cssStyleGetClientWidth()
+{
+ return this.getWidth() + this.getPaddingLeft() + this.getPaddingRight();
+ /*
+ if (typeof(this.object.clientWidth) == 'number')
+ return this.object.clientWidth;
+
+ return null;
+ */
+}
+
+// xbStyle.getClientHeight()
+
+function cssStyleGetClientHeight()
+{
+ return this.getHeight() + this.getPaddingTop() + this.getPaddingBottom();
+ /*
+ if (typeof(this.object.clientHeight) == 'number')
+ return this.object.clientHeight;
+
+ return null;
+ */
+}
+
+xbStyle.prototype.getClip = cssStyleGetClip;
+xbStyle.prototype.setClip = cssStyleSetClip;
+xbStyle.prototype.getClipTop = cssStyleGetClipTop;
+xbStyle.prototype.setClipTop = cssStyleSetClipTop;
+xbStyle.prototype.getClipRight = cssStyleGetClipRight;
+xbStyle.prototype.setClipRight = cssStyleSetClipRight;
+xbStyle.prototype.getClipBottom = cssStyleGetClipBottom;
+xbStyle.prototype.setClipBottom = cssStyleSetClipBottom;
+xbStyle.prototype.getClipLeft = cssStyleGetClipLeft;
+xbStyle.prototype.setClipLeft = cssStyleSetClipLeft;
+xbStyle.prototype.getClipWidth = cssStyleGetClipWidth;
+xbStyle.prototype.setClipWidth = cssStyleSetClipWidth;
+xbStyle.prototype.getClipHeight = cssStyleGetClipHeight;
+xbStyle.prototype.setClipHeight = cssStyleSetClipHeight;
+xbStyle.prototype.getLeft = cssStyleGetLeft;
+xbStyle.prototype.setLeft = cssStyleSetLeft;
+xbStyle.prototype.getTop = cssStyleGetTop;
+xbStyle.prototype.setTop = cssStyleSetTop;
+xbStyle.prototype.getPageX = cssStyleGetPageX;
+xbStyle.prototype.setPageX = cssStyleSetPageX;
+xbStyle.prototype.getPageY = cssStyleGetPageY;
+xbStyle.prototype.setPageY = cssStyleSetPageY;
+xbStyle.prototype.getVisibility = cssStyleGetVisibility;
+xbStyle.prototype.setVisibility = cssStyleSetVisibility;
+xbStyle.prototype.getzIndex = cssStyleGetzIndex;
+xbStyle.prototype.setzIndex = cssStyleSetzIndex;
+xbStyle.prototype.getHeight = cssStyleGetHeight;
+xbStyle.prototype.setHeight = cssStyleSetHeight;
+xbStyle.prototype.getWidth = cssStyleGetWidth;
+xbStyle.prototype.setWidth = cssStyleSetWidth;
+xbStyle.prototype.getBackgroundColor = cssStyleGetBackgroundColor;
+xbStyle.prototype.setBackgroundColor = cssStyleSetBackgroundColor;
+xbStyle.prototype.getColor = cssStyleGetColor;
+xbStyle.prototype.setColor = cssStyleSetColor;
+xbStyle.prototype.setInnerHTML = xbSetInnerHTML;
+xbStyle.prototype.getBorderTopWidth = cssStyleGetBorderTopWidth;
+xbStyle.prototype.getBorderRightWidth = cssStyleGetBorderRightWidth;
+xbStyle.prototype.getBorderBottomWidth = cssStyleGetBorderBottomWidth;
+xbStyle.prototype.getBorderLeftWidth = cssStyleGetBorderLeftWidth;
+xbStyle.prototype.getMarginLeft = cssStyleGetMarginLeft;
+xbStyle.prototype.getMarginTop = cssStyleGetMarginTop;
+xbStyle.prototype.getMarginRight = cssStyleGetMarginRight;
+xbStyle.prototype.getMarginBottom = cssStyleGetMarginBottom;
+xbStyle.prototype.getMarginLeft = cssStyleGetMarginLeft;
+xbStyle.prototype.getPaddingTop = cssStyleGetPaddingTop;
+xbStyle.prototype.getPaddingRight = cssStyleGetPaddingRight;
+xbStyle.prototype.getPaddingBottom = cssStyleGetPaddingBottom;
+xbStyle.prototype.getPaddingLeft = cssStyleGetPaddingLeft;
+xbStyle.prototype.getClientWidth = cssStyleGetClientWidth;
+xbStyle.prototype.getClientHeight = cssStyleGetClientHeight;
+
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/browser/xbStyle-nn4.js b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/browser/xbStyle-nn4.js
new file mode 100644
index 0000000..03aacff
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/browser/xbStyle-nn4.js
@@ -0,0 +1,485 @@
+/*
+ * xbStyle-nn4.js
+ * $Revision: 1.2 $ $Date: 2003/02/07 16:04:22 $
+ */
+
+/* ***** BEGIN LICENSE BLOCK *****
+ * Version: MPL 1.1/GPL 2.0/LGPL 2.1
+ *
+ * The contents of this file are subject to the Mozilla Public License Version
+ * 1.1 (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ * http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the
+ * License.
+ *
+ * The Original Code is Netscape code.
+ *
+ * The Initial Developer of the Original Code is
+ * Netscape Corporation.
+ * Portions created by the Initial Developer are Copyright (C) 2001
+ * the Initial Developer. All Rights Reserved.
+ *
+ * Contributor(s): Bob Clary <bclary@netscape.com>
+ *
+ * ***** END LICENSE BLOCK ***** */
+
+/////////////////////////////////////////////////////////////
+// xbStyle.getClip()
+
+function nsxbStyleGetClip()
+{
+ var clip = this.styleObj.clip;
+ var rect = new xbClipRect(clip.top, clip.right, clip.bottom, clip.left);
+ return rect.toString();
+}
+
+/////////////////////////////////////////////////////////////
+// xbStyle.setClip()
+
+function nsxbStyleSetClip(sClipString)
+{
+ var rect = new xbClipRect(sClipString);
+ this.styleObj.clip.top = rect.top;
+ this.styleObj.clip.right = rect.right;
+ this.styleObj.clip.bottom = rect.bottom;
+ this.styleObj.clip.left = rect.left;
+}
+
+/////////////////////////////////////////////////////////////
+// xbStyle.getClipTop()
+
+function nsxbStyleGetClipTop()
+{
+ return this.styleObj.clip.top;
+}
+
+/////////////////////////////////////////////////////////////
+// xbStyle.setClipTop()
+
+function nsxbStyleSetClipTop(top)
+{
+ return this.styleObj.clip.top = top;
+}
+
+/////////////////////////////////////////////////////////////
+// xbStyle.getClipRight()
+
+function nsxbStyleGetClipRight()
+{
+ return this.styleObj.clip.right;
+}
+
+/////////////////////////////////////////////////////////////
+// xbStyle.setClipRight()
+
+function nsxbStyleSetClipRight(right)
+{
+ return this.styleObj.clip.right = right;
+}
+
+/////////////////////////////////////////////////////////////
+// xbStyle.getClipBottom()
+
+function nsxbStyleGetClipBottom()
+{
+ return this.styleObj.clip.bottom;
+}
+
+/////////////////////////////////////////////////////////////
+// xbStyle.setClipBottom()
+
+function nsxbStyleSetClipBottom(bottom)
+{
+ return this.styleObj.clip.bottom = bottom;
+}
+
+/////////////////////////////////////////////////////////////
+// xbStyle.getClipLeft()
+
+function nsxbStyleGetClipLeft()
+{
+ return this.styleObj.clip.left;
+}
+
+/////////////////////////////////////////////////////////////
+// xbStyle.setClipLeft()
+
+function nsxbStyleSetClipLeft(left)
+{
+ return this.styleObj.clip.left = left;
+}
+
+/////////////////////////////////////////////////////////////
+// xbStyle.getClipWidth()
+
+function nsxbStyleGetClipWidth()
+{
+ return this.styleObj.clip.width;
+}
+
+/////////////////////////////////////////////////////////////
+// xbStyle.setClipWidth()
+
+function nsxbStyleSetClipWidth(width)
+{
+ return this.styleObj.clip.width = width;
+}
+
+/////////////////////////////////////////////////////////////
+// xbStyle.getClipHeight()
+
+function nsxbStyleGetClipHeight()
+{
+ return this.styleObj.clip.height;
+}
+
+/////////////////////////////////////////////////////////////
+// xbStyle.setClipHeight()
+
+function nsxbStyleSetClipHeight(height)
+{
+ return this.styleObj.clip.height = height;
+}
+
+/////////////////////////////////////////////////////////////////////////////
+// xbStyle.getLeft()
+
+function nsxbStyleGetLeft()
+{
+ return this.styleObj.left;
+}
+
+/////////////////////////////////////////////////////////////////////////////
+// xbStyle.setLeft()
+
+function nsxbStyleSetLeft(left)
+{
+ this.styleObj.left = left;
+}
+
+/////////////////////////////////////////////////////////////////////////////
+// xbStyle.getTop()
+
+function nsxbStyleGetTop()
+{
+ return this.styleObj.top;
+}
+
+/////////////////////////////////////////////////////////////////////////////
+// xbStyle.setTop()
+
+function nsxbStyleSetTop(top)
+{
+ this.styleObj.top = top;
+}
+
+
+/////////////////////////////////////////////////////////////////////////////
+// xbStyle.getPageX()
+
+function nsxbStyleGetPageX()
+{
+ return this.styleObj.pageX;
+}
+
+/////////////////////////////////////////////////////////////////////////////
+// xbStyle.setPageX()
+
+function nsxbStyleSetPageX(x)
+{
+ this.styleObj.x = this.styleObj.x + x - this.styleObj.pageX;
+}
+
+/////////////////////////////////////////////////////////////////////////////
+// xbStyle.getPageY()
+
+
+function nsxbStyleGetPageY()
+{
+ return this.styleObj.pageY;
+}
+
+/////////////////////////////////////////////////////////////////////////////
+// xbStyle.setPageY()
+
+function nsxbStyleSetPageY(y)
+{
+ this.styleObj.y = this.styleObj.y + y - this.styleObj.pageY;
+}
+
+/////////////////////////////////////////////////////////////////////////////
+// xbStyle.getHeight()
+
+function nsxbStyleGetHeight()
+{
+ //if (this.styleObj.document && this.styleObj.document.height)
+ // return this.styleObj.document.height;
+
+ return this.styleObj.clip.height;
+}
+
+/////////////////////////////////////////////////////////////////////////////
+// xbStyle.setHeight()
+
+function nsxbStyleSetHeight(height)
+{
+ this.styleObj.clip.height = height;
+}
+
+/////////////////////////////////////////////////////////////////////////////
+// xbStyle.getWidth()
+
+function nsxbStyleGetWidth()
+{
+ //if (this.styleObj.document && this.styleObj.document.width)
+ // return this.styleObj.document.width;
+
+ return this.styleObj.clip.width;
+}
+
+/////////////////////////////////////////////////////////////////////////////
+// xbStyle.setWidth()
+
+// netscape will not dynamically change the width of a
+// layer. It will only happen upon a refresh.
+function nsxbStyleSetWidth(width)
+{
+ this.styleObj.clip.width = width;
+}
+
+/////////////////////////////////////////////////////////////////////////////
+
+/////////////////////////////////////////////////////////////////////////////
+// xbStyle.getVisibility()
+
+function nsxbStyleGetVisibility()
+{
+ switch(this.styleObj.visibility)
+ {
+ case 'hide':
+ return 'hidden';
+ case 'show':
+ return 'visible';
+ }
+ return '';
+}
+
+/////////////////////////////////////////////////////////////////////////////
+// xbStyle.setVisibility()
+
+function nsxbStyleSetVisibility(visibility)
+{
+ switch(visibility)
+ {
+ case 'hidden':
+ visibility = 'hide';
+ break;
+ case 'visible':
+ visibility = 'show';
+ break;
+ case 'inherit':
+ break;
+ default:
+ visibility = 'show';
+ break;
+ }
+ this.styleObj.visibility = visibility;
+}
+
+/////////////////////////////////////////////////////////////////////////////
+// xbStyle.getzIndex()
+
+function nsxbStyleGetzIndex()
+{
+ return this.styleObj.zIndex;
+}
+
+/////////////////////////////////////////////////////////////////////////////
+// xbStyle.setzIndex()
+
+function nsxbStyleSetzIndex(zIndex)
+{
+ this.styleObj.zIndex = zIndex;
+}
+
+/////////////////////////////////////////////////////////////////////////////
+// xbStyle.getBackgroundColor()
+
+function nsxbStyleGetBackgroundColor()
+{
+ return this.styleObj.bgColor;
+}
+
+/////////////////////////////////////////////////////////////////////////////
+// xbStyle.setBackgroundColor()
+
+function nsxbStyleSetBackgroundColor(color)
+{
+ if (color)
+ {
+ this.styleObj.bgColor = color;
+ this.object.document.bgColor = color;
+ this.resizeTo(this.getWidth(), this.getHeight());
+ }
+}
+
+/////////////////////////////////////////////////////////////////////////////
+// xbStyle.getColor()
+
+function nsxbStyleGetColor()
+{
+ return '#ffffff';
+}
+
+/////////////////////////////////////////////////////////////////////////////
+// xbStyle.setColor()
+
+function nsxbStyleSetColor(color)
+{
+ this.object.document.fgColor = color;
+}
+
+
+/////////////////////////////////////////////////////////////////////////////
+// xbStyle.moveAbove()
+
+function xbStyleMoveAbove(cont)
+{
+ this.setzIndex(cont.getzIndex()+1);
+}
+
+/////////////////////////////////////////////////////////////////////////////
+// xbStyle.moveBelow()
+
+function xbStyleMoveBelow(cont)
+{
+ var zindex = cont.getzIndex() - 1;
+
+ this.setzIndex(zindex);
+}
+
+/////////////////////////////////////////////////////////////////////////////
+// xbStyle.moveBy()
+
+function xbStyleMoveBy(deltaX, deltaY)
+{
+ this.moveTo(this.getLeft() + deltaX, this.getTop() + deltaY);
+}
+
+/////////////////////////////////////////////////////////////////////////////
+// xbStyle.moveTo()
+
+function xbStyleMoveTo(x, y)
+{
+ this.setLeft(x);
+ this.setTop(y);
+}
+
+/////////////////////////////////////////////////////////////////////////////
+// xbStyle.moveToAbsolute()
+
+function xbStyleMoveToAbsolute(x, y)
+{
+ this.setPageX(x);
+ this.setPageY(y);
+}
+
+/////////////////////////////////////////////////////////////////////////////
+// xbStyle.resizeBy()
+
+function xbStyleResizeBy(deltaX, deltaY)
+{
+ this.setWidth( this.getWidth() + deltaX );
+ this.setHeight( this.getHeight() + deltaY );
+}
+
+/////////////////////////////////////////////////////////////////////////////
+// xbStyle.resizeTo()
+
+function xbStyleResizeTo(x, y)
+{
+ this.setWidth(x);
+ this.setHeight(y);
+}
+
+////////////////////////////////////////////////////////////////////////
+// Navigator 4.x resizing...
+
+function nsxbStyleOnresize()
+{
+ if (saveInnerWidth != xbGetWindowWidth() || saveInnerHeight != xbGetWindowHeight())
+ location.reload();
+
+ return false;
+}
+
+/////////////////////////////////////////////////////////////////////////////
+// xbStyle.setInnerHTML()
+
+function nsxbSetInnerHTML(str)
+{
+ this.object.document.open('text/html');
+ this.object.document.write(str);
+ this.object.document.close();
+}
+
+xbStyle.prototype.getClip = nsxbStyleGetClip;
+xbStyle.prototype.setClip = nsxbStyleSetClip;
+xbStyle.prototype.getClipTop = nsxbStyleGetClipTop;
+xbStyle.prototype.setClipTop = nsxbStyleSetClipTop;
+xbStyle.prototype.getClipRight = nsxbStyleGetClipRight;
+xbStyle.prototype.setClipRight = nsxbStyleSetClipRight;
+xbStyle.prototype.getClipBottom = nsxbStyleGetClipBottom;
+xbStyle.prototype.setClipBottom = nsxbStyleSetClipBottom;
+xbStyle.prototype.getClipLeft = nsxbStyleGetClipLeft;
+xbStyle.prototype.setClipLeft = nsxbStyleSetClipLeft;
+xbStyle.prototype.getClipWidth = nsxbStyleGetClipWidth;
+xbStyle.prototype.setClipWidth = nsxbStyleSetClipWidth;
+xbStyle.prototype.getClipHeight = nsxbStyleGetClipHeight;
+xbStyle.prototype.setClipHeight = nsxbStyleSetClipHeight;
+xbStyle.prototype.getLeft = nsxbStyleGetLeft;
+xbStyle.prototype.setLeft = nsxbStyleSetLeft;
+xbStyle.prototype.getTop = nsxbStyleGetTop;
+xbStyle.prototype.setTop = nsxbStyleSetTop;
+xbStyle.prototype.getPageX = nsxbStyleGetPageX;
+xbStyle.prototype.setPageX = nsxbStyleSetPageX;
+xbStyle.prototype.getPageY = nsxbStyleGetPageY;
+xbStyle.prototype.setPageY = nsxbStyleSetPageY;
+xbStyle.prototype.getVisibility = nsxbStyleGetVisibility;
+xbStyle.prototype.setVisibility = nsxbStyleSetVisibility;
+xbStyle.prototype.getzIndex = nsxbStyleGetzIndex;
+xbStyle.prototype.setzIndex = nsxbStyleSetzIndex;
+xbStyle.prototype.getHeight = nsxbStyleGetHeight;
+xbStyle.prototype.setHeight = nsxbStyleSetHeight;
+xbStyle.prototype.getWidth = nsxbStyleGetWidth;
+xbStyle.prototype.setWidth = nsxbStyleSetWidth;
+xbStyle.prototype.getBackgroundColor = nsxbStyleGetBackgroundColor;
+xbStyle.prototype.setBackgroundColor = nsxbStyleSetBackgroundColor;
+xbStyle.prototype.getColor = nsxbStyleGetColor;
+xbStyle.prototype.setColor = nsxbStyleSetColor;
+xbStyle.prototype.setInnerHTML = nsxbSetInnerHTML;
+xbStyle.prototype.getBorderTopWidth = xbStyleNotSupported;
+xbStyle.prototype.getBorderRightWidth = xbStyleNotSupported;
+xbStyle.prototype.getBorderBottomWidth = xbStyleNotSupported;
+xbStyle.prototype.getBorderLeftWidth = xbStyleNotSupported;
+xbStyle.prototype.getMarginLeft = xbStyleNotSupported;
+xbStyle.prototype.getMarginTop = xbStyleNotSupported;
+xbStyle.prototype.getMarginRight = xbStyleNotSupported;
+xbStyle.prototype.getMarginBottom = xbStyleNotSupported;
+xbStyle.prototype.getMarginLeft = xbStyleNotSupported;
+xbStyle.prototype.getPaddingTop = xbStyleNotSupported;
+xbStyle.prototype.getPaddingRight = xbStyleNotSupported;
+xbStyle.prototype.getPaddingBottom = xbStyleNotSupported;
+xbStyle.prototype.getPaddingLeft = xbStyleNotSupported;
+xbStyle.prototype.getClientWidth = xbStyleNotSupported;
+xbStyle.prototype.getClientHeight = xbStyleNotSupported;
+
+window.saveInnerWidth = window.innerWidth;
+window.saveInnerHeight = window.innerHeight;
+
+window.onresize = nsxbStyleOnresize;
+
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/browser/xbStyle-not-supported.js b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/browser/xbStyle-not-supported.js
new file mode 100644
index 0000000..06c4a60
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/browser/xbStyle-not-supported.js
@@ -0,0 +1,77 @@
+/*
+ * xbStyle-not-supported.js
+ * $Revision: 1.2 $ $Date: 2003/02/07 16:04:22 $
+ */
+
+/* ***** BEGIN LICENSE BLOCK *****
+ * Version: MPL 1.1/GPL 2.0/LGPL 2.1
+ *
+ * The contents of this file are subject to the Mozilla Public License Version
+ * 1.1 (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ * http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the
+ * License.
+ *
+ * The Original Code is Netscape code.
+ *
+ * The Initial Developer of the Original Code is
+ * Netscape Corporation.
+ * Portions created by the Initial Developer are Copyright (C) 2001
+ * the Initial Developer. All Rights Reserved.
+ *
+ * Contributor(s): Bob Clary <bclary@netscape.com>
+ *
+ * ***** END LICENSE BLOCK ***** */
+
+xbStyle.prototype.toString = xbStyleNotSupported;
+xbStyle.prototype.getClip = xbStyleNotSupported;
+xbStyle.prototype.setClip = xbStyleNotSupported;
+xbStyle.prototype.getClipTop = xbStyleNotSupported;
+xbStyle.prototype.setClipTop = xbStyleNotSupported;
+xbStyle.prototype.getClipRight = xbStyleNotSupported;
+xbStyle.prototype.setClipRight = xbStyleNotSupported;
+xbStyle.prototype.getClipBottom = xbStyleNotSupported;
+xbStyle.prototype.setClipBottom = xbStyleNotSupported;
+xbStyle.prototype.getClipLeft = xbStyleNotSupported;
+xbStyle.prototype.setClipLeft = xbStyleNotSupported;
+xbStyle.prototype.getClipWidth = xbStyleNotSupported;
+xbStyle.prototype.setClipWidth = xbStyleNotSupported;
+xbStyle.prototype.getClipHeight = xbStyleNotSupported;
+xbStyle.prototype.setClipHeight = xbStyleNotSupported;
+xbStyle.prototype.getLeft = xbStyleNotSupported;
+xbStyle.prototype.setLeft = xbStyleNotSupported;
+xbStyle.prototype.getTop = xbStyleNotSupported;
+xbStyle.prototype.setTop = xbStyleNotSupported;
+xbStyle.prototype.getVisibility = xbStyleNotSupported;
+xbStyle.prototype.setVisibility = xbStyleNotSupported;
+xbStyle.prototype.getzIndex = xbStyleNotSupported;
+xbStyle.prototype.setzIndex = xbStyleNotSupported;
+xbStyle.prototype.getHeight = xbStyleNotSupported;
+xbStyle.prototype.setHeight = xbStyleNotSupported;
+xbStyle.prototype.getWidth = xbStyleNotSupported;
+xbStyle.prototype.setWidth = xbStyleNotSupported;
+xbStyle.prototype.getBackgroundColor = xbStyleNotSupported;
+xbStyle.prototype.setBackgroundColor = xbStyleNotSupported;
+xbStyle.prototype.getColor = xbStyleNotSupported;
+xbStyle.prototype.setColor = xbStyleNotSupported;
+xbStyle.prototype.setInnerHTML = xbStyleNotSupported;
+xbStyle.prototype.getBorderTopWidth = xbStyleNotSupported;
+xbStyle.prototype.getBorderRightWidth = xbStyleNotSupported;
+xbStyle.prototype.getBorderBottomWidth = xbStyleNotSupported;
+xbStyle.prototype.getBorderLeftWidth = xbStyleNotSupported;
+xbStyle.prototype.getMarginLeft = xbStyleNotSupported;
+xbStyle.prototype.getMarginTop = xbStyleNotSupported;
+xbStyle.prototype.getMarginRight = xbStyleNotSupported;
+xbStyle.prototype.getMarginBottom = xbStyleNotSupported;
+xbStyle.prototype.getMarginLeft = xbStyleNotSupported;
+xbStyle.prototype.getPaddingTop = xbStyleNotSupported;
+xbStyle.prototype.getPaddingRight = xbStyleNotSupported;
+xbStyle.prototype.getPaddingBottom = xbStyleNotSupported;
+xbStyle.prototype.getPaddingLeft = xbStyleNotSupported;
+xbStyle.prototype.getClientWidth = xbStyleNotSupported;
+xbStyle.prototype.getClientHeight = xbStyleNotSupported;
+
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/browser/xbStyle.js b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/browser/xbStyle.js
new file mode 100644
index 0000000..672ff03
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/browser/xbStyle.js
@@ -0,0 +1,295 @@
+/*
+ * xbStyle.js
+ * $Revision: 1.2 $ $Date: 2003/02/07 16:04:22 $
+ */
+
+/* ***** BEGIN LICENSE BLOCK *****
+ * Version: MPL 1.1/GPL 2.0/LGPL 2.1
+ *
+ * The contents of this file are subject to the Mozilla Public License Version
+ * 1.1 (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ * http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the
+ * License.
+ *
+ * The Original Code is Netscape code.
+ *
+ * The Initial Developer of the Original Code is
+ * Netscape Corporation.
+ * Portions created by the Initial Developer are Copyright (C) 2001
+ * the Initial Developer. All Rights Reserved.
+ *
+ * Contributor(s): Bob Clary <bclary@netscape.com>
+ *
+ * ***** END LICENSE BLOCK ***** */
+
+function xbStyleNotSupported() {}
+
+function xbStyleNotSupportStringValue(propname) { xbDEBUG.dump(propname + ' is not supported in this browser'); return '';};
+
+/////////////////////////////////////////////////////////////
+// xbClipRect
+
+function xbClipRect(a1, a2, a3, a4)
+{
+ this.top = 0;
+ this.right = 0;
+ this.bottom = 0;
+ this.left = 0;
+
+ if (typeof(a1) == 'string')
+ {
+ var val;
+ var ca;
+ var i;
+
+ if (a1.indexOf('rect(') == 0)
+ {
+ // I would have preferred [0-9]+[a-zA-Z]+ for a regexp
+ // but NN4 returns null for that.
+ ca = a1.substring(5, a1.length-1).match(/-?[0-9a-zA-Z]+/g);
+ for (i = 0; i < 4; ++i)
+ {
+ val = xbToInt(ca[i]);
+ if (val != 0 && ca[i].indexOf('px') == -1)
+ {
+ xbDEBUG.dump('xbClipRect: A clipping region ' + a1 + ' was detected that did not use pixels as units. Click Ok to continue, Cancel to Abort');
+ return;
+ }
+ ca[i] = val;
+ }
+ this.top = ca[0];
+ this.right = ca[1];
+ this.bottom = ca[2];
+ this.left = ca[3];
+ }
+ }
+ else if (typeof(a1) == 'number' && typeof(a2) == 'number' && typeof(a3) == 'number' && typeof(a4) == 'number')
+ {
+ this.top = a1;
+ this.right = a2;
+ this.bottom = a3;
+ this.left = a4;
+ }
+}
+
+xbClipRect.prototype.top = 0;
+xbClipRect.prototype.right = 0;
+xbClipRect.prototype.bottom = 0;
+xbClipRect.prototype.left = 0;
+
+
+function xbClipRectGetWidth()
+{
+ return this.right - this.left;
+}
+xbClipRect.prototype.getWidth = xbClipRectGetWidth;
+
+function xbClipRectSetWidth(width)
+{
+ this.right = this.left + width;
+}
+xbClipRect.prototype.setWidth = xbClipRectSetWidth;
+
+function xbClipRectGetHeight()
+{
+ return this.bottom - this.top;
+}
+xbClipRect.prototype.getHeight = xbClipRectGetHeight;
+
+function xbClipRectSetHeight(height)
+{
+ this.bottom = this.top + height;
+}
+xbClipRect.prototype.setHeight = xbClipRectSetHeight;
+
+function xbClipRectToString()
+{
+ return 'rect(' + this.top + 'px ' + this.right + 'px ' + this.bottom + 'px ' + this.left + 'px )' ;
+}
+xbClipRect.prototype.toString = xbClipRectToString;
+
+/////////////////////////////////////////////////////////////
+// xbStyle
+//
+// Note Opera violates the standard by cascading the effective values
+// into the HTMLElement.style object. We can use IE's HTMLElement.currentStyle
+// to get the effective values. In Gecko we will use the W3 DOM Style Standard getComputedStyle
+
+function xbStyle(obj, win, position)
+{
+ if (typeof(obj) == 'object' && typeof(obj.style) != 'undefined')
+ this.styleObj = obj.style;
+ else if (document.layers) // NN4
+ {
+ if (typeof(position) == 'undefined')
+ position = '';
+
+ this.styleObj = obj;
+ this.styleObj.position = position;
+ }
+ this.object = obj;
+ this.window = win ? win : window;
+}
+
+xbStyle.prototype.styleObj = null;
+xbStyle.prototype.object = null;
+
+/////////////////////////////////////////////////////////////
+// xbStyle.getEffectiveValue()
+// note that xbStyle's constructor uses the currentStyle object
+// for IE5+ and that Opera's style object contains computed values
+// already. Netscape Navigator's layer object also contains the
+// computed values as well. Note that IE4 will not return the
+// computed values.
+
+function xbStyleGetEffectiveValue(propname)
+{
+ var value = null;
+
+ if (this.window.document.defaultView && this.window.document.defaultView.getComputedStyle)
+ {
+ // W3
+ // Note that propname is the name of the property in the CSS Style
+ // Object. However the W3 method getPropertyValue takes the actual
+ // property name from the CSS Style rule, i.e., propname is
+ // 'backgroundColor' but getPropertyValue expects 'background-color'.
+
+ var capIndex;
+ var cappropname = propname;
+
+ while ( (capIndex = cappropname.search(/[A-Z]/)) != -1)
+ {
+ if (capIndex != -1)
+ {
+ cappropname = cappropname.substring(0, capIndex) + '-' + cappropname.substring(capIndex, capIndex+1).toLowerCase() + cappropname.substr(capIndex+1);
+ }
+ }
+
+ value = this.window.document.defaultView.getComputedStyle(this.object, '').getPropertyValue(cappropname);
+
+ // xxxHack for Gecko:
+ if (!value && this.styleObj[propname])
+ {
+ value = this.styleObj[propname];
+ }
+ }
+ else if (typeof(this.styleObj[propname]) == 'undefined')
+ {
+ value = xbStyleNotSupportStringValue(propname);
+ }
+ else if (typeof(this.object.currentStyle) != 'undefined')
+ {
+ // IE5+
+ value = this.object.currentStyle[propname];
+ if (!value)
+ {
+ value = this.styleObj[propname];
+ }
+
+ if (propname == 'clip' && !value)
+ {
+ // clip is not stored in IE5/6 handle separately
+ value = 'rect(' + this.object.currentStyle.clipTop + ', ' + this.object.currentStyle.clipRight + ', ' + this.object.currentStyle.clipBottom + ', ' + this.object.currentStyle.clipLeft + ')';
+ }
+ }
+ else
+ {
+ // IE4+, Opera, NN4
+ value = this.styleObj[propname];
+ }
+
+ return value;
+}
+
+/////////////////////////////////////////////////////////////////////////////
+// xbStyle.moveAbove()
+
+function xbStyleMoveAbove(cont)
+{
+ this.setzIndex(cont.getzIndex()+1);
+}
+
+/////////////////////////////////////////////////////////////////////////////
+// xbStyle.moveBelow()
+
+function xbStyleMoveBelow(cont)
+{
+ var zindex = cont.getzIndex() - 1;
+
+ this.setzIndex(zindex);
+}
+
+/////////////////////////////////////////////////////////////////////////////
+// xbStyle.moveBy()
+
+function xbStyleMoveBy(deltaX, deltaY)
+{
+ this.moveTo(this.getLeft() + deltaX, this.getTop() + deltaY);
+}
+
+/////////////////////////////////////////////////////////////////////////////
+// xbStyle.moveTo()
+
+function xbStyleMoveTo(x, y)
+{
+ this.setLeft(x);
+ this.setTop(y);
+}
+
+/////////////////////////////////////////////////////////////////////////////
+// xbStyle.moveToAbsolute()
+
+function xbStyleMoveToAbsolute(x, y)
+{
+ this.setPageX(x);
+ this.setPageY(y);
+}
+
+/////////////////////////////////////////////////////////////////////////////
+// xbStyle.resizeBy()
+
+function xbStyleResizeBy(deltaX, deltaY)
+{
+ this.setWidth( this.getWidth() + deltaX );
+ this.setHeight( this.getHeight() + deltaY );
+}
+
+/////////////////////////////////////////////////////////////////////////////
+// xbStyle.resizeTo()
+
+function xbStyleResizeTo(x, y)
+{
+ this.setWidth(x);
+ this.setHeight(y);
+}
+
+////////////////////////////////////////////////////////////////////////
+
+xbStyle.prototype.getEffectiveValue = xbStyleGetEffectiveValue;
+xbStyle.prototype.moveAbove = xbStyleMoveAbove;
+xbStyle.prototype.moveBelow = xbStyleMoveBelow;
+xbStyle.prototype.moveBy = xbStyleMoveBy;
+xbStyle.prototype.moveTo = xbStyleMoveTo;
+xbStyle.prototype.moveToAbsolute = xbStyleMoveToAbsolute;
+xbStyle.prototype.resizeBy = xbStyleResizeBy;
+xbStyle.prototype.resizeTo = xbStyleResizeTo;
+
+if (document.all || document.getElementsByName)
+{
+ xblibrary.loadScript('xbStyle-css.js');
+}
+else if (document.layers)
+{
+ xblibrary.loadScript('xbStyle-nn4.js');
+}
+else
+{
+ xblibrary.loadScript('xbStyle-not-supported.js');
+}
+
+
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/fo/param.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/fo/param.xml
new file mode 100644
index 0000000..040ac22
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/fo/param.xml
@@ -0,0 +1,356 @@
+<?xml version="1.0" encoding="ASCII"?>
+<book version="5.0" xml:id="slides_fo_doc">
+<info>
+<title>Slides FO Parameter Reference</title>
+<releaseinfo role="meta">
+$Id: param.xweb 6633 2007-02-21 18:33:33Z xmldoc $
+</releaseinfo>
+<author>
+ <personname>
+ <surname>Walsh</surname>
+ <firstname>Norman</firstname>
+ </personname>
+</author>
+<copyright>
+ <year>2002</year>
+ <holder>Norman Walsh</holder>
+</copyright>
+<abstract>
+ <para>This is reference documentation for all user-configurable
+ parameters in the DocBook XSL Slides FO stylesheet (for
+ generating PDF slide presentations). Note that the Slides
+ stylesheet for FO output is a customization layer of the
+ DocBook XSL FO stylesheet. Therefore, in addition to the
+ slides-specific parameters listed in this section, you can
+ also use a number of <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="../fo/">FO stylesheet
+ parameters</link> to control Slides FO output.</para>
+</abstract>
+</info>
+<reference xml:id="fo">
+ <title>FO: General Params</title>
+<refentry version="5.0" xml:id="slide.title.font.family">
+<refmeta>
+<refentrytitle>slide.title.font.family</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">list</refmiscinfo>
+<refmiscinfo class="other" otherclass="list-type">open</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">serif</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">sans-serif</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">monospace</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>slide.title.font.family</refname>
+<refpurpose>Specifies font family to use for slide titles</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="slide.title.font.family.frag">
+&lt;xsl:param name="slide.title.font.family"&gt;Helvetica&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies the font family to use for slides titles.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="slide.font.family">
+<refmeta>
+<refentrytitle>slide.font.family</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">list</refmiscinfo>
+<refmiscinfo class="other" otherclass="list-type">open</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">serif</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">sans-serif</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">monospace</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>slide.font.family</refname>
+<refpurpose>Specifies font family to use for slide bodies</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="slide.font.family.frag">
+&lt;xsl:param name="slide.font.family"&gt;Helvetica&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies the font family to use for slides bodies.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="foil.title.master">
+<refmeta>
+<refentrytitle>foil.title.master</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">number</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>foil.title.master</refname>
+<refpurpose>Specifies unitless font size to use for foil titles</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="foil.title.master.frag">
+&lt;xsl:param name="foil.title.master"&gt;36&lt;/xsl:param&gt;
+&lt;!-- Inconsistant use of point size? --&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies a unitless font size to use for foil titles; used in
+combination with the <parameter>foil.title.size</parameter>
+parameter.</para>
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="foil.title.size">
+<refmeta>
+<refentrytitle>foil.title.size</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">length</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>foil.title.size</refname>
+<refpurpose>Specifies font size to use for foil titles, including units</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+ <programlisting xml:id="foil.title.size.frag">
+ &lt;xsl:param name="foil.title.size"&gt;
+ &lt;xsl:value-of select="$foil.title.master"&gt;&lt;/xsl:value-of&gt;&lt;xsl:text&gt;pt&lt;/xsl:text&gt;
+ &lt;/xsl:param&gt;
+ </programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>This parameter combines the value of the
+<parameter>foil.title.master</parameter> parameter with a unit
+specification. The default unit is <literal>pt</literal>
+(points).</para>
+
+</refsection>
+</refentry>
+
+</reference>
+<reference xml:id="propsets">
+ <title>FO: Property Sets</title>
+<refentry version="5.0" xml:id="slides.properties">
+<refmeta>
+<refentrytitle>slides.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>slides.properties</refname>
+<refpurpose>Specifies properties for all slides</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+ <programlisting xml:id="slides.properties.frag">
+ &lt;xsl:attribute-set name="slides.properties"&gt;
+ &lt;xsl:attribute name="font-family"&gt;
+ &lt;xsl:value-of select="$slide.font.family"&gt;&lt;/xsl:value-of&gt;
+ &lt;/xsl:attribute&gt;
+ &lt;/xsl:attribute-set&gt;
+ </programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>This parameter specifies properties that are applied to all slides.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="foilgroup.properties">
+<refmeta>
+<refentrytitle>foilgroup.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>foilgroup.properties</refname>
+<refpurpose>Specifies properties for all foilgroups</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+ <programlisting xml:id="foilgroup.properties.frag">
+ &lt;xsl:attribute-set name="foilgroup.properties"&gt;
+ &lt;xsl:attribute name="font-family"&gt;
+ &lt;xsl:value-of select="$slide.font.family"&gt;&lt;/xsl:value-of&gt;
+ &lt;/xsl:attribute&gt;
+ &lt;/xsl:attribute-set&gt;
+ </programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>This parameter specifies properties that are applied to all foilgroups.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="foil.subtitle.properties">
+<refmeta>
+<refentrytitle>foil.subtitle.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>foil.subtitle.properties</refname>
+<refpurpose>Specifies properties for all foil subtitles</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+ <programlisting xml:id="foil.subtitle.properties.frag">
+ &lt;xsl:attribute-set name="foil.subtitle.properties"&gt;
+ &lt;xsl:attribute name="font-family"&gt;
+ &lt;xsl:value-of select="$slide.title.font.family"&gt;&lt;/xsl:value-of&gt;
+ &lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="text-align"&gt;center&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="font-size"&gt;
+ &lt;xsl:value-of select="$foil.title.master * 0.8"&gt;&lt;/xsl:value-of&gt;&lt;xsl:text&gt;pt&lt;/xsl:text&gt;
+ &lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="space-after"&gt;12pt&lt;/xsl:attribute&gt;
+ &lt;/xsl:attribute-set&gt;
+ </programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>This parameter specifies properties that are applied to all foil subtitles.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="foil.properties">
+<refmeta>
+<refentrytitle>foil.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>foil.properties</refname>
+<refpurpose>Specifies properties for all foils</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+ <programlisting xml:id="foil.properties.frag">
+ &lt;xsl:attribute-set name="foil.properties"&gt;
+ &lt;xsl:attribute name="font-family"&gt;
+ &lt;xsl:value-of select="$slide.font.family"&gt;&lt;/xsl:value-of&gt;
+ &lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="margin-{$direction.align.start}"&gt;1in&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="margin-{$direction.align.end}"&gt;1in&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="font-size"&gt;
+ &lt;xsl:value-of select="$body.font.size"&gt;&lt;/xsl:value-of&gt;
+ &lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="font-weight"&gt;bold&lt;/xsl:attribute&gt;
+ &lt;/xsl:attribute-set&gt;
+ </programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>This parameter specifies properties that are applied to all foils.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="speakernote.properties">
+<refmeta>
+<refentrytitle>speakernote.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>speakernote.properties</refname>
+<refpurpose>Specifies properties for all speakernotes</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+ <programlisting xml:id="speakernote.properties.frag">
+ &lt;xsl:attribute-set name="speakernote.properties"&gt;
+ &lt;xsl:attribute name="font-family"&gt;Times Roman&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="font-style"&gt;italic&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="font-size"&gt;12pt&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="font-weight"&gt;normal&lt;/xsl:attribute&gt;
+ &lt;/xsl:attribute-set&gt;
+ </programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>This parameter specifies properties that are applied to all speakernotes.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="running.foot.properties">
+<refmeta>
+<refentrytitle>running.foot.properties</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>running.foot.properties</refname>
+<refpurpose>Specifies properties for running foot on each slide</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+ <programlisting xml:id="running.foot.properties.frag">
+ &lt;xsl:attribute-set name="running.foot.properties"&gt;
+ &lt;xsl:attribute name="font-family"&gt;
+ &lt;xsl:value-of select="$slide.font.family"&gt;&lt;/xsl:value-of&gt;
+ &lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="font-size"&gt;14pt&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="color"&gt;#9F9F9F&lt;/xsl:attribute&gt;
+ &lt;/xsl:attribute-set&gt;
+ </programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>This parameter specifies properties that are applied to the
+running foot area of each slide.</para>
+
+</refsection>
+</refentry>
+
+</reference>
+
+<appendix xml:id="styleheet"><title>The Stylesheet</title>
+
+<para>The <filename>param.xsl</filename> stylesheet is just a wrapper
+around all these parameters.</para>
+
+<programlisting xml:id="top">
+
+&lt;!-- This file is generated from param.xweb --&gt;
+
+&lt;xsl:stylesheet exclude-result-prefixes="src" version="1.0"&gt;
+
+&lt;!-- ********************************************************************
+ $Id: param.xweb 6633 2007-02-21 18:33:33Z xmldoc $
+ ********************************************************************
+
+ This file is part of the DocBook Slides Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** --&gt;
+
+&lt;src:fragref linkend="slide.font.family.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="slide.title.font.family.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="foil.title.master.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="foil.title.size.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="foilgroup.properties.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="foil.properties.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="foil.subtitle.properties.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="running.foot.properties.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="speakernote.properties.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="slides.properties.frag"&gt;&lt;/src:fragref&gt;
+
+&lt;/xsl:stylesheet&gt;
+</programlisting>
+
+</appendix>
+</book>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/fo/param.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/fo/param.xsl
new file mode 100644
index 0000000..bfeb493
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/fo/param.xsl
@@ -0,0 +1,74 @@
+<?xml version="1.0" encoding="ASCII"?>
+<!-- This file is generated from param.xweb -->
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
+
+<!-- ********************************************************************
+ $Id: param.xweb 6633 2007-02-21 18:33:33Z xmldoc $
+ ********************************************************************
+
+ This file is part of the DocBook Slides Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<xsl:param name="slide.font.family">Helvetica</xsl:param>
+<xsl:param name="slide.title.font.family">Helvetica</xsl:param>
+<xsl:param name="foil.title.master">36</xsl:param>
+<!-- Inconsistant use of point size? -->
+ <xsl:param name="foil.title.size">
+ <xsl:value-of select="$foil.title.master"/><xsl:text>pt</xsl:text>
+ </xsl:param>
+
+ <xsl:attribute-set name="foilgroup.properties">
+ <xsl:attribute name="font-family">
+ <xsl:value-of select="$slide.font.family"/>
+ </xsl:attribute>
+ </xsl:attribute-set>
+
+ <xsl:attribute-set name="foil.properties">
+ <xsl:attribute name="font-family">
+ <xsl:value-of select="$slide.font.family"/>
+ </xsl:attribute>
+ <xsl:attribute name="margin-{$direction.align.start}">1in</xsl:attribute>
+ <xsl:attribute name="margin-{$direction.align.end}">1in</xsl:attribute>
+ <xsl:attribute name="font-size">
+ <xsl:value-of select="$body.font.size"/>
+ </xsl:attribute>
+ <xsl:attribute name="font-weight">bold</xsl:attribute>
+ </xsl:attribute-set>
+
+ <xsl:attribute-set name="foil.subtitle.properties">
+ <xsl:attribute name="font-family">
+ <xsl:value-of select="$slide.title.font.family"/>
+ </xsl:attribute>
+ <xsl:attribute name="text-align">center</xsl:attribute>
+ <xsl:attribute name="font-size">
+ <xsl:value-of select="$foil.title.master * 0.8"/><xsl:text>pt</xsl:text>
+ </xsl:attribute>
+ <xsl:attribute name="space-after">12pt</xsl:attribute>
+ </xsl:attribute-set>
+
+ <xsl:attribute-set name="running.foot.properties">
+ <xsl:attribute name="font-family">
+ <xsl:value-of select="$slide.font.family"/>
+ </xsl:attribute>
+ <xsl:attribute name="font-size">14pt</xsl:attribute>
+ <xsl:attribute name="color">#9F9F9F</xsl:attribute>
+ </xsl:attribute-set>
+
+ <xsl:attribute-set name="speakernote.properties">
+ <xsl:attribute name="font-family">Times Roman</xsl:attribute>
+ <xsl:attribute name="font-style">italic</xsl:attribute>
+ <xsl:attribute name="font-size">12pt</xsl:attribute>
+ <xsl:attribute name="font-weight">normal</xsl:attribute>
+ </xsl:attribute-set>
+
+ <xsl:attribute-set name="slides.properties">
+ <xsl:attribute name="font-family">
+ <xsl:value-of select="$slide.font.family"/>
+ </xsl:attribute>
+ </xsl:attribute-set>
+
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/fo/plain-titlepage.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/fo/plain-titlepage.xml
new file mode 100644
index 0000000..d0a92da
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/fo/plain-titlepage.xml
@@ -0,0 +1,79 @@
+<!DOCTYPE t:templates [
+<!ENTITY hsize0 "10pt">
+<!ENTITY hsize1 "12pt">
+<!ENTITY hsize2 "14.4pt">
+<!ENTITY hsize3 "17.28pt">
+<!ENTITY hsize4 "20.736pt">
+<!ENTITY hsize5 "24.8832pt">
+<!ENTITY hsize0space "7.5pt"> <!-- 0.75 * hsize0 -->
+<!ENTITY hsize1space "9pt"> <!-- 0.75 * hsize1 -->
+<!ENTITY hsize2space "10.8pt"> <!-- 0.75 * hsize2 -->
+<!ENTITY hsize3space "12.96pt"> <!-- 0.75 * hsize3 -->
+<!ENTITY hsize4space "15.552pt"> <!-- 0.75 * hsize4 -->
+<!ENTITY hsize5space "18.6624pt"> <!-- 0.75 * hsize5 -->
+]>
+<t:templates xmlns:t="http://nwalsh.com/docbook/xsl/template/1.0"
+ xmlns:param="http://nwalsh.com/docbook/xsl/template/1.0/param"
+ xmlns:fo="http://www.w3.org/1999/XSL/Format"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+
+<!-- ==================================================================== -->
+
+<t:titlepage t:element="slides" t:wrapper="fo:block">
+ <t:titlepage-content t:side="recto">
+ <title t:predicate="[1]"
+ t:named-template="component.title"
+ param:node="ancestor-or-self::slides[1]"
+ text-align="center"
+ space-after="1em"
+ padding-top="1.5in"
+ keep-with-next="always"
+ font-size="{$foil.title.size}"
+ font-weight="bold"
+ font-family="{$slide.title.font.family}"/>
+
+ <subtitle t:predicate="[1]"
+ text-align="center"
+ space-after="1em"
+ font-family="{$slide.title.font.family}"/>
+
+ <corpauthor font-size="&hsize4;"
+ text-align="center"
+ space-after="1em"/>
+ <authorgroup/>
+ <author font-size="&hsize4;"
+ text-align="center"
+ space-after="1em"/>
+
+ <pubdate font-size="&hsize3;"
+ text-align="center"
+ space-after="1em"/>
+
+ <confgroup font-size="&hsize3;"
+ text-align="center"
+ space-after="1em"/>
+
+ <releaseinfo font-size="&hsize3;"
+ text-align="center"
+ space-after="1em"/>
+
+ <copyright font-size="&hsize3;"
+ text-align="center"/>
+
+ <revision text-align="center"/>
+ </t:titlepage-content>
+
+ <t:titlepage-content t:side="verso">
+ </t:titlepage-content>
+
+ <t:titlepage-separator>
+ </t:titlepage-separator>
+
+ <t:titlepage-before t:side="recto">
+ </t:titlepage-before>
+
+ <t:titlepage-before t:side="verso">
+ </t:titlepage-before>
+</t:titlepage>
+
+</t:templates>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/fo/plain-titlepage.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/fo/plain-titlepage.xsl
new file mode 100644
index 0000000..a6148aa
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/fo/plain-titlepage.xsl
@@ -0,0 +1,187 @@
+<?xml version="1.0"?>
+
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:exsl="http://exslt.org/common" version="1.0" exclude-result-prefixes="exsl">
+
+<!-- This stylesheet was created by template/titlepage.xsl-->
+
+<xsl:template name="slides.titlepage.recto">
+ <xsl:choose>
+ <xsl:when test="slidesinfo/title">
+ <xsl:apply-templates mode="slides.titlepage.recto.auto.mode" select="slidesinfo/title[1]"/>
+ </xsl:when>
+ <xsl:when test="docinfo/title">
+ <xsl:apply-templates mode="slides.titlepage.recto.auto.mode" select="docinfo/title[1]"/>
+ </xsl:when>
+ <xsl:when test="info/title">
+ <xsl:apply-templates mode="slides.titlepage.recto.auto.mode" select="info/title[1]"/>
+ </xsl:when>
+ <xsl:when test="title">
+ <xsl:apply-templates mode="slides.titlepage.recto.auto.mode" select="title[1]"/>
+ </xsl:when>
+ </xsl:choose>
+
+ <xsl:choose>
+ <xsl:when test="slidesinfo/subtitle">
+ <xsl:apply-templates mode="slides.titlepage.recto.auto.mode" select="slidesinfo/subtitle[1]"/>
+ </xsl:when>
+ <xsl:when test="docinfo/subtitle">
+ <xsl:apply-templates mode="slides.titlepage.recto.auto.mode" select="docinfo/subtitle[1]"/>
+ </xsl:when>
+ <xsl:when test="info/subtitle">
+ <xsl:apply-templates mode="slides.titlepage.recto.auto.mode" select="info/subtitle[1]"/>
+ </xsl:when>
+ <xsl:when test="subtitle">
+ <xsl:apply-templates mode="slides.titlepage.recto.auto.mode" select="subtitle[1]"/>
+ </xsl:when>
+ </xsl:choose>
+
+ <xsl:apply-templates mode="slides.titlepage.recto.auto.mode" select="slidesinfo/corpauthor"/>
+ <xsl:apply-templates mode="slides.titlepage.recto.auto.mode" select="docinfo/corpauthor"/>
+ <xsl:apply-templates mode="slides.titlepage.recto.auto.mode" select="info/corpauthor"/>
+ <xsl:apply-templates mode="slides.titlepage.recto.auto.mode" select="slidesinfo/authorgroup"/>
+ <xsl:apply-templates mode="slides.titlepage.recto.auto.mode" select="docinfo/authorgroup"/>
+ <xsl:apply-templates mode="slides.titlepage.recto.auto.mode" select="info/authorgroup"/>
+ <xsl:apply-templates mode="slides.titlepage.recto.auto.mode" select="slidesinfo/author"/>
+ <xsl:apply-templates mode="slides.titlepage.recto.auto.mode" select="docinfo/author"/>
+ <xsl:apply-templates mode="slides.titlepage.recto.auto.mode" select="info/author"/>
+ <xsl:apply-templates mode="slides.titlepage.recto.auto.mode" select="slidesinfo/pubdate"/>
+ <xsl:apply-templates mode="slides.titlepage.recto.auto.mode" select="docinfo/pubdate"/>
+ <xsl:apply-templates mode="slides.titlepage.recto.auto.mode" select="info/pubdate"/>
+ <xsl:apply-templates mode="slides.titlepage.recto.auto.mode" select="slidesinfo/confgroup"/>
+ <xsl:apply-templates mode="slides.titlepage.recto.auto.mode" select="docinfo/confgroup"/>
+ <xsl:apply-templates mode="slides.titlepage.recto.auto.mode" select="info/confgroup"/>
+ <xsl:apply-templates mode="slides.titlepage.recto.auto.mode" select="slidesinfo/releaseinfo"/>
+ <xsl:apply-templates mode="slides.titlepage.recto.auto.mode" select="docinfo/releaseinfo"/>
+ <xsl:apply-templates mode="slides.titlepage.recto.auto.mode" select="info/releaseinfo"/>
+ <xsl:apply-templates mode="slides.titlepage.recto.auto.mode" select="slidesinfo/copyright"/>
+ <xsl:apply-templates mode="slides.titlepage.recto.auto.mode" select="docinfo/copyright"/>
+ <xsl:apply-templates mode="slides.titlepage.recto.auto.mode" select="info/copyright"/>
+ <xsl:apply-templates mode="slides.titlepage.recto.auto.mode" select="slidesinfo/revision"/>
+ <xsl:apply-templates mode="slides.titlepage.recto.auto.mode" select="docinfo/revision"/>
+ <xsl:apply-templates mode="slides.titlepage.recto.auto.mode" select="info/revision"/>
+</xsl:template>
+
+<xsl:template name="slides.titlepage.verso">
+</xsl:template>
+
+<xsl:template name="slides.titlepage.separator">
+</xsl:template>
+
+<xsl:template name="slides.titlepage.before.recto">
+</xsl:template>
+
+<xsl:template name="slides.titlepage.before.verso">
+</xsl:template>
+
+<xsl:template name="slides.titlepage">
+ <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format">
+ <xsl:variable name="recto.content">
+ <xsl:call-template name="slides.titlepage.before.recto"/>
+ <xsl:call-template name="slides.titlepage.recto"/>
+ </xsl:variable>
+ <xsl:variable name="recto.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($recto.content) != '') or ($recto.elements.count &gt; 0)">
+ <fo:block><xsl:copy-of select="$recto.content"/></fo:block>
+ </xsl:if>
+ <xsl:variable name="verso.content">
+ <xsl:call-template name="slides.titlepage.before.verso"/>
+ <xsl:call-template name="slides.titlepage.verso"/>
+ </xsl:variable>
+ <xsl:variable name="verso.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($verso.content) != '') or ($verso.elements.count &gt; 0)">
+ <fo:block><xsl:copy-of select="$verso.content"/></fo:block>
+ </xsl:if>
+ <xsl:call-template name="slides.titlepage.separator"/>
+ </fo:block>
+</xsl:template>
+
+<xsl:template match="*" mode="slides.titlepage.recto.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="*" mode="slides.titlepage.verso.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="title" mode="slides.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="slides.titlepage.recto.style" text-align="center" space-after="1em" padding-top="1.5in" keep-with-next="always" font-size="{$foil.title.size}" font-weight="bold" font-family="{$slide.title.font.family}">
+<xsl:call-template name="component.title">
+<xsl:with-param name="node" select="ancestor-or-self::slides[1]"/>
+</xsl:call-template>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="subtitle" mode="slides.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="slides.titlepage.recto.style" text-align="center" space-after="1em" font-family="{$slide.title.font.family}">
+<xsl:apply-templates select="." mode="slides.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="corpauthor" mode="slides.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="slides.titlepage.recto.style" font-size="20.736pt" text-align="center" space-after="1em">
+<xsl:apply-templates select="." mode="slides.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="authorgroup" mode="slides.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="slides.titlepage.recto.style">
+<xsl:apply-templates select="." mode="slides.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="author" mode="slides.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="slides.titlepage.recto.style" font-size="20.736pt" text-align="center" space-after="1em">
+<xsl:apply-templates select="." mode="slides.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="pubdate" mode="slides.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="slides.titlepage.recto.style" font-size="17.28pt" text-align="center" space-after="1em">
+<xsl:apply-templates select="." mode="slides.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="confgroup" mode="slides.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="slides.titlepage.recto.style" font-size="17.28pt" text-align="center" space-after="1em">
+<xsl:apply-templates select="." mode="slides.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="releaseinfo" mode="slides.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="slides.titlepage.recto.style" font-size="17.28pt" text-align="center" space-after="1em">
+<xsl:apply-templates select="." mode="slides.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="copyright" mode="slides.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="slides.titlepage.recto.style" font-size="17.28pt" text-align="center">
+<xsl:apply-templates select="." mode="slides.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+<xsl:template match="revision" mode="slides.titlepage.recto.auto.mode">
+<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" xsl:use-attribute-sets="slides.titlepage.recto.style" text-align="center">
+<xsl:apply-templates select="." mode="slides.titlepage.recto.mode"/>
+</fo:block>
+</xsl:template>
+
+</xsl:stylesheet>
+
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/fo/plain.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/fo/plain.xsl
new file mode 100644
index 0000000..b4e729e
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/fo/plain.xsl
@@ -0,0 +1,528 @@
+<?xml version="1.0"?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:fo="http://www.w3.org/1999/XSL/Format"
+ xmlns:rx="http://www.renderx.com/XSL/Extensions"
+ version="1.0">
+
+<!-- ********************************************************************
+ $Id: plain.xsl 8101 2008-08-03 18:35:14Z mzjn $
+ ********************************************************************
+
+ This file is part of the DocBook Slides Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<xsl:import href="../../fo/docbook.xsl"/>
+<xsl:import href="param.xsl"/>
+
+<xsl:param name="alignment" select="'start'"/>
+
+<xsl:include href="plain-titlepage.xsl"/>
+
+<xsl:param name="local.l10n.xml" select="document('')"/>
+<i18n xmlns="http://docbook.sourceforge.net/xmlns/l10n/1.0">
+ <l:l10n xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0" language="en">
+ <l:gentext key="Continued" text="(Continued)"/>
+ <l:context name="title">
+ <l:template name="slides" text="%t"/>
+ <l:template name="foilgroup" text="%t"/>
+ <l:template name="foil" text="%t"/>
+ </l:context>
+ </l:l10n>
+</i18n>
+
+<xsl:variable name="root.elements" select="' slides '"/>
+
+<xsl:param name="preferred.mediaobject.role" select="'print'"/>
+
+<xsl:param name="page.orientation" select="'landscape'"/>
+
+<xsl:param name="body.font.master" select="24"/>
+
+<xsl:attribute-set name="formal.title.properties"
+ use-attribute-sets="normal.para.spacing">
+ <xsl:attribute name="font-weight">bold</xsl:attribute>
+ <xsl:attribute name="font-size">
+ <xsl:value-of select="$body.font.master * 1.2"/>
+ <xsl:text>pt</xsl:text>
+ </xsl:attribute>
+ <xsl:attribute name="hyphenate">false</xsl:attribute>
+ <xsl:attribute name="space-after.minimum">8pt</xsl:attribute>
+ <xsl:attribute name="space-after.optimum">6pt</xsl:attribute>
+ <xsl:attribute name="space-after.maximum">10pt</xsl:attribute>
+</xsl:attribute-set>
+
+<xsl:attribute-set name="list.block.spacing">
+ <xsl:attribute name="space-before.optimum">12pt</xsl:attribute>
+ <xsl:attribute name="space-before.minimum">8pt</xsl:attribute>
+ <xsl:attribute name="space-before.maximum">14pt</xsl:attribute>
+ <xsl:attribute name="space-after.optimum">0pt</xsl:attribute>
+ <xsl:attribute name="space-after.minimum">0pt</xsl:attribute>
+ <xsl:attribute name="space-after.maximum">0pt</xsl:attribute>
+</xsl:attribute-set>
+
+<xsl:attribute-set name="list.item.spacing">
+ <xsl:attribute name="space-before.optimum">6pt</xsl:attribute>
+ <xsl:attribute name="space-before.minimum">4pt</xsl:attribute>
+ <xsl:attribute name="space-before.maximum">8pt</xsl:attribute>
+</xsl:attribute-set>
+
+<xsl:attribute-set name="normal.para.spacing">
+ <xsl:attribute name="space-before.optimum">8pt</xsl:attribute>
+ <xsl:attribute name="space-before.minimum">6pt</xsl:attribute>
+ <xsl:attribute name="space-before.maximum">10pt</xsl:attribute>
+</xsl:attribute-set>
+
+<xsl:attribute-set name="slides.titlepage.recto.style">
+ <xsl:attribute name="font-family">
+ <xsl:value-of select="$slide.font.family"/>
+ </xsl:attribute>
+</xsl:attribute-set>
+
+<xsl:attribute-set name="slides.titlepage.verso.style">
+ <xsl:attribute name="font-family">
+ <xsl:value-of select="$slide.font.family"/>
+ </xsl:attribute>
+</xsl:attribute-set>
+
+<!-- ============================================================ -->
+
+<xsl:param name="page.margin.top" select="'0.25in'"/>
+<xsl:param name="region.before.extent" select="'0.75in'"/>
+<xsl:param name="body.margin.top" select="'1in'"/>
+
+<xsl:param name="region.after.extent" select="'0.5in'"/>
+<xsl:param name="body.margin.bottom" select="'0.5in'"/>
+<xsl:param name="page.margin.bottom" select="'0.25in'"/>
+
+<xsl:param name="page.margin.inner" select="'0.25in'"/>
+<xsl:param name="page.margin.outer" select="'0.25in'"/>
+<xsl:param name="column.count.body" select="1"/>
+
+<xsl:template name="user.pagemasters">
+ <fo:simple-page-master master-name="slides-titlepage-master"
+ page-width="{$page.width}"
+ page-height="{$page.height}"
+ margin-top="{$page.margin.top}"
+ margin-bottom="{$page.margin.bottom}"
+ margin-left="{$page.margin.inner}"
+ margin-right="{$page.margin.outer}">
+ <fo:region-body margin-bottom="0pt"
+ margin-top="0pt"
+ column-count="{$column.count.body}">
+ </fo:region-body>
+ </fo:simple-page-master>
+
+ <fo:simple-page-master master-name="slides-foil-master"
+ page-width="{$page.width}"
+ page-height="{$page.height}"
+ margin-top="{$page.margin.top}"
+ margin-bottom="{$page.margin.bottom}"
+ margin-left="{$page.margin.inner}"
+ margin-right="{$page.margin.outer}">
+ <fo:region-body margin-bottom="{$body.margin.bottom}"
+ margin-top="{$body.margin.top}"
+ column-count="{$column.count.body}">
+ </fo:region-body>
+ <fo:region-before region-name="xsl-region-before-foil"
+ extent="{$region.before.extent}"
+ display-align="before"/>
+ <fo:region-after region-name="xsl-region-after-foil"
+ extent="{$region.after.extent}"
+ display-align="after"/>
+ </fo:simple-page-master>
+
+ <fo:simple-page-master master-name="slides-foil-continued-master"
+ page-width="{$page.width}"
+ page-height="{$page.height}"
+ margin-top="{$page.margin.top}"
+ margin-bottom="{$page.margin.bottom}"
+ margin-left="{$page.margin.inner}"
+ margin-right="{$page.margin.outer}">
+ <fo:region-body margin-bottom="{$body.margin.bottom}"
+ margin-top="{$body.margin.top}"
+ column-count="{$column.count.body}">
+ </fo:region-body>
+ <fo:region-before region-name="xsl-region-before-foil-continued"
+ extent="{$region.before.extent}"
+ display-align="before"/>
+ <fo:region-after region-name="xsl-region-after-foil-continued"
+ extent="{$region.after.extent}"
+ display-align="after"/>
+ </fo:simple-page-master>
+
+ <fo:page-sequence-master master-name="slides-titlepage">
+ <fo:repeatable-page-master-alternatives>
+ <fo:conditional-page-master-reference master-reference="slides-titlepage-master"/>
+ </fo:repeatable-page-master-alternatives>
+ </fo:page-sequence-master>
+
+ <fo:page-sequence-master master-name="slides-foil">
+ <fo:repeatable-page-master-alternatives>
+ <fo:conditional-page-master-reference master-reference="slides-foil-master"
+ page-position="first"/>
+ <fo:conditional-page-master-reference master-reference="slides-foil-continued-master"/>
+ </fo:repeatable-page-master-alternatives>
+ </fo:page-sequence-master>
+</xsl:template>
+
+<xsl:template match="*" mode="running.head.mode">
+ <xsl:param name="master-reference" select="'unknown'"/>
+ <!-- use the foilgroup title if there is one -->
+ <fo:static-content flow-name="xsl-region-before-foil">
+ <fo:block background-color="white"
+ color="black"
+ font-size="{$foil.title.size}"
+ font-weight="bold"
+ text-align="center"
+ font-family="{$slide.title.font.family}">
+ <xsl:apply-templates select="title" mode="titlepage.mode"/>
+ </fo:block>
+ </fo:static-content>
+
+ <fo:static-content flow-name="xsl-region-before-foil-continued">
+ <fo:block background-color="white"
+ color="black"
+ font-size="{$foil.title.size}"
+ font-weight="bold"
+ text-align="center"
+ font-family="{$slide.title.font.family}">
+ <xsl:apply-templates select="title" mode="titlepage.mode"/>
+ <xsl:text> </xsl:text>
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'Continued'"/>
+ </xsl:call-template>
+ </fo:block>
+ </fo:static-content>
+</xsl:template>
+
+<xsl:template match="*" mode="running.foot.mode">
+ <xsl:param name="master-reference" select="'unknown'"/>
+
+ <xsl:variable name="last-slide"
+ select="(//foil|//foilgroup)[last()]"/>
+
+ <xsl:variable name="last-id">
+ <xsl:choose>
+ <xsl:when test="$last-slide/@id">
+ <xsl:value-of select="$last-slide/@id"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="generate-id($last-slide)"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="content">
+ <fo:table table-layout="fixed" width="100%"
+ xsl:use-attribute-sets="running.foot.properties">
+ <fo:table-column column-number="1" column-width="33%"/>
+ <fo:table-column column-number="2" column-width="34%"/>
+ <fo:table-column column-number="3" column-width="33%"/>
+ <fo:table-body>
+ <fo:table-row height="14pt">
+ <fo:table-cell text-align="left">
+ <fo:block>
+ <xsl:if test="self::foil">
+ <xsl:choose>
+ <xsl:when test="ancestor::foilgroup[1]/titleabbrev">
+ <xsl:apply-templates select="ancestor::foilgroup[1]/titleabbrev"
+ mode="titlepage.mode"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="ancestor::foilgroup[1]/title"
+ mode="titlepage.mode"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:if>
+ </fo:block>
+ </fo:table-cell>
+ <fo:table-cell text-align="center">
+ <fo:block>
+ <xsl:if test="/slides/slidesinfo/releaseinfo[@role='copyright']">
+ <xsl:apply-templates select="/slides/slidesinfo/releaseinfo[@role='copyright']"
+ mode="value"/>
+ <xsl:text>&#160;&#160;&#160;</xsl:text>
+ </xsl:if>
+ <xsl:apply-templates select="/slides/slidesinfo/copyright"
+ mode="titlepage.mode"/>
+ </fo:block>
+ </fo:table-cell>
+ <fo:table-cell text-align="right">
+ <fo:block>
+ <fo:page-number/>
+ <xsl:text>&#160;/&#160;</xsl:text>
+ <fo:page-number-citation ref-id="{$last-id}"/>
+ </fo:block>
+ </fo:table-cell>
+ </fo:table-row>
+ </fo:table-body>
+ </fo:table>
+ </xsl:variable>
+
+ <fo:static-content flow-name="xsl-region-after-foil">
+ <fo:block>
+ <xsl:copy-of select="$content"/>
+ </fo:block>
+ </fo:static-content>
+
+ <fo:static-content flow-name="xsl-region-after-foil-continued">
+ <fo:block>
+ <xsl:copy-of select="$content"/>
+ </fo:block>
+ </fo:static-content>
+</xsl:template>
+
+<xsl:template name="select.user.pagemaster">
+ <xsl:param name="element"/>
+ <xsl:param name="pageclass"/>
+ <xsl:param name="default-pagemaster"/>
+
+ <xsl:choose>
+ <xsl:when test="$element = 'slides'">slides-titlepage</xsl:when>
+ <xsl:otherwise>slides-foil</xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="slides">
+ <xsl:variable name="master-reference">
+ <xsl:call-template name="select.pagemaster"/>
+ </xsl:variable>
+
+ <fo:page-sequence hyphenate="{$hyphenate}"
+ master-reference="{$master-reference}">
+ <xsl:attribute name="language">
+ <xsl:call-template name="l10n.language"/>
+ </xsl:attribute>
+
+ <xsl:apply-templates select="." mode="running.head.mode">
+ <xsl:with-param name="master-reference" select="$master-reference"/>
+ </xsl:apply-templates>
+ <xsl:apply-templates select="." mode="running.foot.mode">
+ <xsl:with-param name="master-reference" select="$master-reference"/>
+ </xsl:apply-templates>
+ <fo:flow flow-name="xsl-region-body">
+ <fo:block>
+ <xsl:call-template name="anchor">
+ <xsl:with-param name="conditional" select="0"/>
+ </xsl:call-template>
+ <xsl:call-template name="slides.titlepage"/>
+ <xsl:apply-templates select="speakernotes"/>
+ </fo:block>
+ </fo:flow>
+ </fo:page-sequence>
+ <xsl:apply-templates select="foil|foilgroup"/>
+</xsl:template>
+
+<xsl:template match="slidesinfo"/>
+
+<xsl:template match="slides" mode="title.markup">
+ <xsl:param name="allow-anchors" select="'0'"/>
+ <xsl:apply-templates select="(slidesinfo/title|title)[1]"
+ mode="title.markup">
+ <xsl:with-param name="allow-anchors" select="$allow-anchors"/>
+ </xsl:apply-templates>
+</xsl:template>
+
+<!-- ============================================================ -->
+
+<xsl:template name="foilgroup.titlepage">
+ <fo:block background-color="black"
+ color="white"
+ font-size="{$foil.title.size}"
+ font-weight="bold"
+ text-align="center"
+ padding-top="12pt"
+ padding-bottom="12pt"
+ space-after="1em">
+ <xsl:apply-templates select="title" mode="titlepage.mode"/>
+ </fo:block>
+</xsl:template>
+
+<xsl:template match="foilgroup">
+ <xsl:variable name="master-reference">
+ <xsl:call-template name="select.pagemaster"/>
+ </xsl:variable>
+
+ <fo:page-sequence hyphenate="{$hyphenate}"
+ master-reference="{$master-reference}">
+ <xsl:call-template name="anchor">
+ <xsl:with-param name="conditional" select="0"/>
+ </xsl:call-template>
+ <xsl:attribute name="language">
+ <xsl:call-template name="l10n.language"/>
+ </xsl:attribute>
+
+ <xsl:apply-templates select="." mode="running.head.mode">
+ <xsl:with-param name="master-reference" select="$master-reference"/>
+ </xsl:apply-templates>
+ <xsl:apply-templates select="." mode="running.foot.mode">
+ <xsl:with-param name="master-reference" select="$master-reference"/>
+ </xsl:apply-templates>
+
+ <fo:flow flow-name="xsl-region-body">
+ <fo:block>
+ <xsl:if test="*[not(self::foil)]">
+ <fo:block xsl:use-attribute-sets="foil.properties" space-after="1em">
+ <xsl:apply-templates select="*[not(self::foil)]"/>
+ </fo:block>
+ </xsl:if>
+
+ <xsl:call-template name="foilgroup.titlepage"/>
+ </fo:block>
+ </fo:flow>
+ </fo:page-sequence>
+ <xsl:apply-templates select="foil"/>
+</xsl:template>
+
+<xsl:template match="foilgroup/title"/>
+<xsl:template match="foilgroup/titleabbrev"/>
+
+<xsl:template match="foilgroup/titleabbrev" mode="titlepage.mode">
+ <xsl:apply-templates/>
+</xsl:template>
+
+<xsl:template match="slides/foilgroup/title" mode="titlepage.mode">
+ <xsl:apply-templates/>
+</xsl:template>
+
+<xsl:template match="title" mode="foilgroup.titlepage.recto.mode">
+ <fo:block>
+ <fo:inline color="white">.</fo:inline>
+ <fo:block space-before="2in">
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+ </fo:block>
+ </fo:block>
+</xsl:template>
+
+<xsl:template match="foilgroupinfo"/>
+
+<!-- ============================================================ -->
+
+<!--
+<xsl:template name="foil.titlepage">
+ <fo:block background-color="white"
+ color="black"
+ font-size="{$foil.title.size}"
+ font-weight="bold"
+ text-align="center"
+ padding-top="12pt"
+ padding-bottom="12pt"
+ space-after="1em">
+ <xsl:apply-templates select="title" mode="titlepage.mode"/>
+ </fo:block>
+</xsl:template>
+-->
+
+<xsl:template match="foil">
+ <xsl:variable name="master-reference">
+ <xsl:call-template name="select.pagemaster"/>
+ </xsl:variable>
+
+ <fo:page-sequence hyphenate="{$hyphenate}"
+ master-reference="{$master-reference}">
+ <xsl:call-template name="anchor">
+ <xsl:with-param name="conditional" select="0"/>
+ </xsl:call-template>
+ <xsl:attribute name="language">
+ <xsl:call-template name="l10n.language"/>
+ </xsl:attribute>
+
+ <xsl:apply-templates select="." mode="running.head.mode">
+ <xsl:with-param name="master-reference" select="$master-reference"/>
+ </xsl:apply-templates>
+ <xsl:apply-templates select="." mode="running.foot.mode">
+ <xsl:with-param name="master-reference" select="$master-reference"/>
+ </xsl:apply-templates>
+ <fo:flow flow-name="xsl-region-body">
+ <fo:block>
+ <fo:block xsl:use-attribute-sets="foil.properties">
+ <xsl:apply-templates/>
+ </fo:block>
+ </fo:block>
+ </fo:flow>
+ </fo:page-sequence>
+</xsl:template>
+
+<xsl:template match="foilinfo"/>
+<xsl:template match="foil/title"/>
+<xsl:template match="foil/subtitle">
+ <fo:block xsl:use-attribute-sets="foil.subtitle.properties">
+ <xsl:apply-templates/>
+ </fo:block>
+</xsl:template>
+<xsl:template match="foil/titleabbrev"/>
+
+<!-- ============================================================ -->
+
+<xsl:template match="slides" mode="label.markup">
+ <xsl:if test="@label">
+ <xsl:value-of select="@label"/>
+ </xsl:if>
+</xsl:template>
+
+<!-- ============================================================ -->
+
+<xsl:template match="speakernotes">
+ <fo:block xsl:use-attribute-sets="speakernote.properties">
+ <xsl:apply-templates/>
+ </fo:block>
+</xsl:template>
+
+<!-- ============================================================ -->
+<!-- Bookmarks -->
+
+<!-- XEP -->
+
+<xsl:template match="slides|foilgroup|foil[not(@role) or @role != 'ENDTITLE']"
+ mode="xep.outline">
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+ <xsl:variable name="bookmark-label">
+ <xsl:apply-templates select="." mode="object.title.markup"/>
+ </xsl:variable>
+
+ <!-- Put the root element bookmark at the same level as its children -->
+ <!-- If the object is a set or book, generate a bookmark for the toc -->
+
+ <xsl:choose>
+ <xsl:when test="parent::*">
+ <rx:bookmark internal-destination="{$id}">
+ <rx:bookmark-label>
+ <xsl:value-of select="$bookmark-label"/>
+ </rx:bookmark-label>
+ <xsl:apply-templates select="*" mode="xep.outline"/>
+ </rx:bookmark>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:if test="$bookmark-label != ''">
+ <rx:bookmark internal-destination="{$id}">
+ <rx:bookmark-label>
+ <xsl:value-of select="$bookmark-label"/>
+ </rx:bookmark-label>
+ </rx:bookmark>
+ </xsl:if>
+
+ <xsl:apply-templates select="*" mode="xep.outline"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- Handling of xrefs -->
+
+<xsl:template match="foil|foilgroup" mode="xref-to">
+ <xsl:param name="referrer"/>
+ <xsl:param name="xrefstyle"/>
+
+ <xsl:apply-templates select="." mode="object.xref.markup">
+ <xsl:with-param name="purpose" select="'xref'"/>
+ <xsl:with-param name="xrefstyle" select="$xrefstyle"/>
+ <xsl:with-param name="referrer" select="$referrer"/>
+ </xsl:apply-templates>
+</xsl:template>
+
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/html/css.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/html/css.xsl
new file mode 100644
index 0000000..1692000
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/html/css.xsl
@@ -0,0 +1,46 @@
+<?xml version="1.0"?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="1.0">
+
+<!-- ====================================================================== -->
+
+<xsl:template name="css-file">
+ <xsl:param name="css" select="'slides.css'"/>
+
+ <xsl:variable name="source.css.dir">
+ <xsl:call-template name="dbhtml-attribute">
+ <xsl:with-param name="pis" select="/processing-instruction('dbhtml')"/>
+ <xsl:with-param name="attribute" select="'css-stylesheet-dir'"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="$source.css.dir != ''">
+ <xsl:value-of select="$source.css.dir"/>
+ <xsl:text>/</xsl:text>
+ </xsl:when>
+ <xsl:when test="$css.stylesheet.dir != ''">
+ <xsl:value-of select="$css.stylesheet.dir"/>
+ <xsl:text>/</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text>http://docbook.sourceforge.net/release/slides/browser/</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:value-of select="$css"/>
+</xsl:template>
+
+<!-- ====================================================================== -->
+<!-- active navigation images -->
+
+<xsl:template name="css.stylesheet">
+ <xsl:param name="css" select="$css.stylesheet"/>
+ <!-- Danger Will Robinson: template shadows parameter -->
+ <xsl:call-template name="css-file">
+ <xsl:with-param name="css" select="$css"/>
+ </xsl:call-template>
+</xsl:template>
+
+<!-- ====================================================================== -->
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/html/default.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/html/default.xsl
new file mode 100644
index 0000000..00a0d81
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/html/default.xsl
@@ -0,0 +1,261 @@
+<?xml version='1.0'?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="1.0">
+
+<xsl:import href="slides-common.xsl"/>
+
+<xsl:output method="html"/>
+
+<xsl:param name="css.stylesheet" select="'slides-default.css'"/>
+
+<xsl:template name="top-nav">
+ <xsl:param name="home"/>
+ <xsl:param name="up"/>
+ <xsl:param name="next"/>
+ <xsl:param name="prev"/>
+ <xsl:param name="tocfile" select="$toc.html"/>
+
+ <div class="navhead">
+ <table width="100%" border="0" cellpadding="0" cellspacing="0"
+ summary="Navigation">
+ <tr>
+ <xsl:call-template name="generate.toc.hide.show"/>
+ <td align="left" width="10%">
+ <xsl:choose>
+ <xsl:when test="$prev">
+ <a>
+ <xsl:attribute name="href">
+ <xsl:apply-templates select="$prev" mode="filename"/>
+ </xsl:attribute>
+
+ <img alt="Prev" border="0">
+ <xsl:attribute name="src">
+ <xsl:call-template name="prev.image"/>
+ </xsl:attribute>
+ </img>
+ </a>
+ </xsl:when>
+ <xsl:otherwise>&#160;</xsl:otherwise>
+ </xsl:choose>
+ </td>
+ <td align="center" width="80%">
+ <xsl:variable name="prestitle">
+ <xsl:value-of select="(/slides/slidesinfo/title
+ |/slides/title)[1]"/>
+ </xsl:variable>
+
+ <span class="navheader">
+ <xsl:value-of select="$prestitle"/>
+ </span>
+ </td>
+ <td align="right" width="10%">
+ <xsl:choose>
+ <xsl:when test="$next">
+ <a>
+ <xsl:attribute name="href">
+ <xsl:apply-templates select="$next" mode="filename"/>
+ </xsl:attribute>
+
+ <img alt="Next" border="0">
+ <xsl:attribute name="src">
+ <xsl:call-template name="next.image"/>
+ </xsl:attribute>
+ </img>
+ </a>
+ </xsl:when>
+ <xsl:otherwise>&#160;</xsl:otherwise>
+ </xsl:choose>
+ </td>
+ </tr>
+ </table>
+ <hr class="top-nav-sep"/>
+ </div>
+</xsl:template>
+
+<xsl:template name="bottom-nav">
+ <xsl:param name="home"/>
+ <xsl:param name="up"/>
+ <xsl:param name="next"/>
+ <xsl:param name="prev"/>
+ <xsl:param name="tocfile" select="$toc.html"/>
+
+ <div class="navfoot">
+ <hr class="bottom-nav-sep"/>
+ <table width="100%" border="0" cellpadding="0" cellspacing="0"
+ summary="Navigation">
+ <tr>
+ <td align="left" width="80%" valign="top">
+ <span class="navfooter">
+ <xsl:apply-templates select="/slides/slidesinfo/copyright"
+ mode="slide.footer.mode"/>
+ </span>
+ </td>
+ <td align="right" width="20%" valign="top">
+ <span class="index">
+ <xsl:value-of select="count(preceding::foil)
+ + count(preceding::foilgroup)
+ + count(ancestor::foilgroup)
+ + 1"/>
+ </span>
+ <xsl:text>&#160;</xsl:text>
+ </td>
+ </tr>
+ </table>
+ </div>
+</xsl:template>
+
+<!-- ====================================================================== -->
+
+<xsl:template name="titlepage-top-nav">
+ <xsl:param name="home"/>
+ <xsl:param name="up"/>
+ <xsl:param name="next"/>
+ <xsl:param name="prev"/>
+ <xsl:param name="tocfile" select="$toc.html"/>
+
+ <div class="navhead">
+ <table width="100%" border="0" cellpadding="0" cellspacing="0"
+ summary="Navigation">
+ <tr>
+ <td align="left" width="10%">
+ <span class="toclink">
+ <a href="{$toc.html}">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key">TableofContents</xsl:with-param>
+ </xsl:call-template>
+ </a>
+ </span>
+ </td>
+ <td align="center" width="80%">
+ <xsl:text>&#160;</xsl:text>
+ </td>
+ <td align="right" width="10%">
+ <xsl:text>&#160;</xsl:text>
+ </td>
+ </tr>
+ </table>
+ </div>
+</xsl:template>
+
+<xsl:template name="titlepage-bottom-nav">
+ <xsl:param name="home"/>
+ <xsl:param name="up"/>
+ <xsl:param name="next"/>
+ <xsl:param name="prev"/>
+ <xsl:param name="tocfile" select="$toc.html"/>
+
+ <div class="navfoot">
+ <table width="100%" border="0"
+ cellspacing="0" cellpadding="0"
+ summary="Navigation">
+ <tr>
+ <td align="left" width="80%" valign="top">
+ <span class="navfooter">
+ <xsl:apply-templates select="/slides/slidesinfo/copyright"
+ mode="slide.footer.mode"/>
+ </span>
+ </td>
+ <td align="right" width="20%" valign="top">
+ <a>
+ <xsl:attribute name="href">
+ <xsl:apply-templates select="(following::foilgroup|following::foil)[1]"
+ mode="filename"/>
+ </xsl:attribute>
+ <img alt="Next" border="0">
+ <xsl:attribute name="src">
+ <xsl:call-template name="next.image"/>
+ </xsl:attribute>
+ </img>
+ </a>
+ </td>
+ </tr>
+ </table>
+ </div>
+</xsl:template>
+
+<xsl:template name="toc-top-nav">
+ <xsl:param name="home"/>
+ <xsl:param name="up"/>
+ <xsl:param name="next"/>
+ <xsl:param name="prev"/>
+ <xsl:param name="tocfile" select="$toc.html"/>
+
+ <div class="navhead">
+ <table width="100%" border="0" cellpadding="0" cellspacing="0"
+ summary="Navigation">
+ <tr>
+ <td align="left">
+ <xsl:text>&#160;</xsl:text>
+ </td>
+ </tr>
+ </table>
+ </div>
+</xsl:template>
+
+<xsl:template name="toc-bottom-nav">
+ <div class="navfoot">
+ <table width="100%" border="0"
+ cellspacing="0" cellpadding="0"
+ summary="Navigation">
+ <tr>
+ <td align="left" width="80%" valign="top">
+ <span class="navfooter">
+ <xsl:apply-templates select="/slides/slidesinfo/copyright"
+ mode="slide.footer.mode"/>
+ </span>
+ </td>
+ <td align="right" width="20%" valign="top">
+ <a href="{$titlefoil.html}">
+ <img alt="Next" border="0">
+ <xsl:attribute name="src">
+ <xsl:call-template name="next.image"/>
+ </xsl:attribute>
+ </img>
+ </a>
+ </td>
+ </tr>
+ </table>
+ </div>
+</xsl:template>
+
+<!-- ====================================================================== -->
+
+<xsl:template name="generate.toc.hide.show">
+ <xsl:if test="$toc.hide.show != 0">
+ <td>
+ <img hspace="4" alt="Hide/Show TOC">
+ <xsl:attribute name="src">
+ <xsl:call-template name="hidetoc.image"/>
+ </xsl:attribute>
+ <xsl:attribute name="onClick">
+ <xsl:text>toggletoc(this,</xsl:text>
+ <xsl:value-of select="$toc.width"/>
+ <xsl:text>,'</xsl:text>
+ <xsl:call-template name="hidetoc.image"/>
+ <xsl:text>','</xsl:text>
+ <xsl:call-template name="showtoc.image"/>
+ <xsl:text>');</xsl:text>
+ </xsl:attribute>
+ </img>
+ </td>
+ </xsl:if>
+</xsl:template>
+
+<!-- ====================================================================== -->
+
+<xsl:template match="@*" mode="copy">
+ <xsl:attribute name="{local-name(.)}">
+ <xsl:value-of select="."/>
+ </xsl:attribute>
+</xsl:template>
+
+<xsl:template match="html:*" xmlns:html='http://www.w3.org/1999/xhtml'>
+ <xsl:element name="{local-name(.)}" namespace="">
+ <xsl:apply-templates select="@*" mode="copy"/>
+ <xsl:apply-templates/>
+ </xsl:element>
+</xsl:template>
+
+<!-- ====================================================================== -->
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/html/flat.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/html/flat.xsl
new file mode 100644
index 0000000..30fbf00
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/html/flat.xsl
@@ -0,0 +1,70 @@
+<?xml version="1.0"?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="1.0">
+
+<xsl:import href="slides-common.xsl"/>
+
+<xsl:template match="/">
+ <html>
+ <head>
+ <title><xsl:value-of select="/slides/slidesinfo/title"/></title>
+ </head>
+ <body>
+ <xsl:apply-templates/>
+ </body>
+ </html>
+</xsl:template>
+
+<xsl:template match="slidesinfo">
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+
+ <div id="{$id}" class="titlepage">
+ <div class="titlepage-body">
+ <xsl:call-template name="titlepage-body"/>
+ </div>
+ </div>
+</xsl:template>
+
+<xsl:template match="slides" mode="toc">
+ <!-- nop -->
+</xsl:template>
+
+<xsl:template match="foil">
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+
+ <div class="{name(.)}" id="{$id}">
+ <div class="foil-body">
+ <xsl:call-template name="foil-body"/>
+ </div>
+ <xsl:call-template name="process.footnotes"/>
+ </div>
+</xsl:template>
+
+<xsl:template match="foilgroup">
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+
+ <div class="{name(.)}" id="{$id}">
+ <div class="foilgroup-body">
+ <xsl:call-template name="foilgroup-body"/>
+ </div>
+ <xsl:call-template name="process.footnotes"/>
+ </div>
+
+ <xsl:apply-templates select="foil"/>
+</xsl:template>
+
+<xsl:template match="author" mode="titlepage.mode">
+ <div class="{name(.)}">
+ <h2 class="{name(.)}"><xsl:call-template name="person.name"/></h2>
+ <xsl:apply-templates mode="titlepage.mode" select="./contrib"/>
+ <xsl:apply-templates mode="titlepage.mode" select="./affiliation"/>
+ </div>
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/html/frames.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/html/frames.xsl
new file mode 100644
index 0000000..05633de
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/html/frames.xsl
@@ -0,0 +1,2016 @@
+<?xml version="1.0"?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="1.0">
+
+<xsl:import href="slides-common.xsl"/>
+
+<xsl:param name="titlefoil.html" select="concat('titlepg', $html.ext)"/>
+
+<xsl:param name="css.stylesheet" select="'slides-frames.css'"/>
+
+<!-- ====================================================================== -->
+
+<xsl:template name="doctype-public">
+ <xsl:param name="frameset" select="0"/>
+ <xsl:choose>
+ <xsl:when test="$stylesheet.result.type='html'">
+ <xsl:choose>
+ <!-- Assume when chunker.output.doctype-public is set the user
+ wants to have doctypes written out. If frameset is set
+ then overide with a frameset public identifier. -->
+ <xsl:when test="$chunker.output.doctype-public != '' and $frameset != 0">
+ <xsl:text>-//W3C//DTD HTML 4.01 Frameset//EN</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$chunker.output.doctype-public"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:when test="$stylesheet.result.type='xhtml'">
+ <xsl:choose>
+ <xsl:when test="$frameset != 0">
+ <xsl:text>-//W3C//DTD XHTML 1.0 Frameset//EN</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text>-//W3C//DTD XHTML 1.0 Transitional//EN</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="doctype-system">
+ <xsl:param name="frameset" select="0"/>
+ <xsl:choose>
+ <xsl:when test="$stylesheet.result.type='html'">
+ <xsl:choose>
+ <!-- Assume when chunker.output.doctype-system is set the user
+ wants to have doctypes written out. If frameset is set
+ then overide with a frameset system identifier. -->
+ <xsl:when test="$chunker.output.doctype-system != '' and $frameset != 0">
+ <xsl:text>http://www.w3.org/TR/html4/loose.dtd</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$chunker.output.doctype-system"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:when test="$stylesheet.result.type='xhtml'">
+ <xsl:choose>
+ <xsl:when test="$frameset != 0">
+ <xsl:text>http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text>http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ====================================================================== -->
+
+<xsl:template match="slides">
+ <xsl:variable name="title">
+ <xsl:choose>
+ <xsl:when test="(slidesinfo/titleabbrev|titleabbrev)">
+ <xsl:value-of select="(slidesinfo/titleabbrev|titleabbrev)[1]"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="(slidesinfo/title|title)[1]"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:variable name="toc.rows" select="1+count(//foilgroup)+count(//foil)"/>
+ <xsl:variable name="toc.height" select="$toc.rows * $toc.row.height"/>
+
+ <xsl:if test="$overlay != 0 and $multiframe != 0">
+ <xsl:message terminate='yes'>
+ <xsl:text>Multiframe and overlay are mutually exclusive.</xsl:text>
+ </xsl:message>
+ </xsl:if>
+
+ <xsl:variable name="doctype-public">
+ <xsl:call-template name="doctype-public">
+ <xsl:with-param name="frameset" select="1"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:variable name="doctype-system">
+ <xsl:call-template name="doctype-system">
+ <xsl:with-param name="frameset" select="1"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:call-template name="write.chunk">
+ <xsl:with-param name="indent" select="$output.indent"/>
+ <xsl:with-param name="doctype-public" select="$doctype-public"/>
+ <xsl:with-param name="doctype-system" select="$doctype-system"/>
+ <xsl:with-param name="filename" select="concat($base.dir,'frames', $html.ext)"/>
+ <xsl:with-param name="content">
+ <html>
+ <head>
+ <title><xsl:value-of select="$title"/></title>
+ </head>
+ <frameset cols="{$toc.width},*" id="topframe">
+ <frame src="{concat('toc', $html.ext)}" name="toc" id="toc" frameborder="1"/>
+ <frame src="{$titlefoil.html}" name="foil" id="foil"/>
+ <noframes>
+ <body class="frameset">
+ <xsl:call-template name="body.attributes"/>
+ <a href="{concat('titleframe', $html.ext)}">
+ <xsl:text>Your browser doesn't support frames.</xsl:text>
+ </a>
+ </body>
+ </noframes>
+ </frameset>
+ </html>
+ </xsl:with-param>
+ </xsl:call-template>
+
+ <xsl:call-template name="write.chunk">
+ <xsl:with-param name="indent" select="$output.indent"/>
+ <xsl:with-param name="filename" select="concat($base.dir,'toc',$html.ext)"/>
+ <xsl:with-param name="content">
+ <html>
+ <head>
+ <title>TOC - <xsl:value-of select="$title"/></title>
+ <xsl:call-template name="system.head.content"/>
+ <meta name="generator" content="DocBook Slides Stylesheets V{$VERSION}"/>
+ <xsl:if test="$css.stylesheet != ''">
+ <link type="text/css" rel="stylesheet">
+ <xsl:attribute name="href">
+ <xsl:call-template name="css.stylesheet"/>
+ </xsl:attribute>
+ </link>
+ </xsl:if>
+ <xsl:apply-templates select="/processing-instruction('dbhtml')" mode="css.pi"/>
+
+ <xsl:if test="$overlay != 0 or $keyboard.nav != 0
+ or $dynamic.toc != 0 or $active.toc != 0
+ or $overlay.logo != ''">
+ <script language="javascript" type="text/javascript">
+ <xsl:text> </xsl:text>
+ </script>
+ </xsl:if>
+
+ <xsl:if test="$keyboard.nav != 0 or $dynamic.toc != 0 or $active.toc != 0">
+ <xsl:call-template name="ua.js"/>
+ <xsl:call-template name="xbDOM.js">
+ <xsl:with-param name="language" select="'javascript'"/>
+ </xsl:call-template>
+ <xsl:call-template name="xbLibrary.js"/>
+ <script language="javascript" type="text/javascript">
+ <xsl:text disable-output-escaping="yes">
+ &lt;!--
+ xblibrary = new xbLibrary('</xsl:text>
+ <xsl:call-template name="script-dir"/>
+ <xsl:text disable-output-escaping="yes">');
+ // --&gt;
+ </xsl:text>
+ </script>
+ <xsl:call-template name="xbStyle.js"/>
+ <xsl:call-template name="xbCollapsibleLists.js"/>
+ <xsl:call-template name="slides.js">
+ <xsl:with-param name="language" select="'javascript'"/>
+ </xsl:call-template>
+ </xsl:if>
+
+ <xsl:if test="$overlay != '0' or $overlay.logo != ''">
+ <xsl:call-template name="overlay.js">
+ <xsl:with-param name="language" select="'javascript'"/>
+ </xsl:call-template>
+ </xsl:if>
+
+ <xsl:if test="$dynamic.toc != 0">
+ <script language="javascript" type="text/javascript">
+ <xsl:text disable-output-escaping="yes">
+ &lt;!--
+function init() {
+ var width = </xsl:text>
+<xsl:value-of select="$toc.width"/>
+<xsl:text>, height = </xsl:text>
+<xsl:value-of select="$toc.row.height"/>
+<xsl:text>;
+ myList = new List(true, width, height, "</xsl:text>
+<xsl:value-of select="$toc.bg.color"/>
+<xsl:text>","</xsl:text>
+<xsl:call-template name="plus.image"/>
+<xsl:text>","</xsl:text>
+<xsl:call-template name="minus.image"/>
+<xsl:text>");
+</xsl:text>
+<xsl:apply-templates mode="ns-toc"/>
+ <xsl:text disable-output-escaping="yes">
+ myList.build(0,0);
+}
+ // --&gt;
+</xsl:text>
+ </script>
+ <style type="text/css">
+ <xsl:text>#spacer { position: absolute; height: </xsl:text>
+ <xsl:value-of select="$toc.height"/>
+ <xsl:text>; }
+</xsl:text>
+ </style>
+ </xsl:if>
+
+ <xsl:call-template name="user.head.content"/>
+ </head>
+ <body class="toc">
+ <xsl:call-template name="body.attributes"/>
+
+ <xsl:if test="$overlay.logo != ''">
+ <xsl:attribute name="onload">
+ <xsl:text>overlaySetup('ll');</xsl:text>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:if test="$dynamic.toc != 0">
+ <xsl:attribute name="onload">
+ <xsl:text>init(</xsl:text>
+ <xsl:value-of select="$overlay"/>
+ <xsl:text>);</xsl:text>
+ <xsl:if test="$overlay.logo != ''">
+ <xsl:text>overlaySetup('ll');</xsl:text>
+ </xsl:if>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:choose>
+ <xsl:when test="$dynamic.toc = 0">
+ <div class="toc">
+ <xsl:apply-templates mode="toc"/>
+ </div>
+ </xsl:when>
+ <xsl:otherwise>
+ <div id="spacer"/>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:if test="$overlay.logo != ''">
+ <div style="position: absolute; visibility: visible;" id="overlayDiv">
+ <img src="{$overlay.logo}" alt="logo" vspace="20"/>
+ </div>
+ </xsl:if>
+ </body>
+ </html>
+ </xsl:with-param>
+ </xsl:call-template>
+
+ <xsl:apply-templates/>
+</xsl:template>
+
+<!-- ====================================================================== -->
+
+<xsl:template match="slidesinfo">
+ <xsl:variable name="next" select="(following::foil
+ |following::foilgroup)[1]"/>
+
+ <xsl:variable name="doctype-public">
+ <xsl:call-template name="doctype-public">
+ <xsl:with-param name="frameset" select="$multiframe"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="doctype-system">
+ <xsl:call-template name="doctype-system">
+ <xsl:with-param name="frameset" select="$multiframe"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:call-template name="write.chunk">
+ <xsl:with-param name="indent" select="$output.indent"/>
+ <xsl:with-param name="doctype-public" select="$doctype-public"/>
+ <xsl:with-param name="doctype-system" select="$doctype-system"/>
+ <xsl:with-param name="filename"
+ select="concat($base.dir,$titlefoil.html)"/>
+ <xsl:with-param name="content">
+ <html>
+ <head>
+ <title><xsl:value-of select="title"/></title>
+
+ <xsl:call-template name="system.head.content">
+ <xsl:with-param name="node" select=".."/>
+ </xsl:call-template>
+
+ <meta name="generator" content="DocBook Slides Stylesheets V{$VERSION}"/>
+
+ <xsl:if test="$css.stylesheet != ''">
+ <link type="text/css" rel="stylesheet">
+ <xsl:attribute name="href">
+ <xsl:call-template name="css.stylesheet"/>
+ </xsl:attribute>
+ </link>
+ </xsl:if>
+ <xsl:apply-templates select="/processing-instruction('dbhtml')" mode="css.pi"/>
+
+ <xsl:call-template name="links">
+ <xsl:with-param name="next" select="$next"/>
+ </xsl:call-template>
+
+ <xsl:if test="$overlay != 0 or $keyboard.nav != 0
+ or $dynamic.toc != 0 or $active.toc != 0">
+ <script language="javascript" type="text/javascript">
+ <xsl:text> </xsl:text>
+ </script>
+ </xsl:if>
+
+ <xsl:if test="$keyboard.nav != 0 or $dynamic.toc != 0 or $active.toc != 0">
+ <xsl:call-template name="ua.js"/>
+ <xsl:call-template name="xbDOM.js">
+ <xsl:with-param name="language" select="'javascript'"/>
+ </xsl:call-template>
+ <xsl:call-template name="xbLibrary.js"/>
+ <script language="javascript" type="text/javascript">
+ <xsl:text disable-output-escaping="yes">
+ &lt;!--
+ xblibrary = new xbLibrary('</xsl:text>
+ <xsl:call-template name="script-dir"/>
+ <xsl:text disable-output-escaping="yes">');
+ // --&gt;
+ </xsl:text>
+ </script>
+ <xsl:call-template name="xbStyle.js"/>
+ <xsl:call-template name="xbCollapsibleLists.js"/>
+ <xsl:call-template name="slides.js">
+ <xsl:with-param name="language" select="'javascript'"/>
+ </xsl:call-template>
+ </xsl:if>
+
+ <xsl:if test="$overlay != '0'">
+ <xsl:call-template name="overlay.js">
+ <xsl:with-param name="language" select="'javascript'"/>
+ </xsl:call-template>
+ </xsl:if>
+
+ <xsl:call-template name="user.head.content">
+ <xsl:with-param name="node" select=".."/>
+ </xsl:call-template>
+ </head>
+ <xsl:choose>
+ <xsl:when test="$multiframe != 0">
+ <xsl:apply-templates select="." mode="multiframe"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="." mode="singleframe"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </html>
+ </xsl:with-param>
+ </xsl:call-template>
+
+ <xsl:if test="$multiframe != 0">
+ <xsl:apply-templates select="." mode="multiframe-top"/>
+ <xsl:apply-templates select="." mode="multiframe-body"/>
+ <xsl:apply-templates select="." mode="multiframe-bottom"/>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="slidesinfo" mode="multiframe">
+ <xsl:variable name="thisfoil">
+ <xsl:value-of select="$titlefoil.html"/>
+ </xsl:variable>
+
+ <frameset rows="{$multiframe.navigation.height},*,{$multiframe.navigation.height}" id="foil">
+ <xsl:attribute name="onload">
+ <xsl:text>javascript:body.focus()</xsl:text>
+ </xsl:attribute>
+ <frame src="top-{$thisfoil}" name="top" id="top" marginheight="0" frameborder="0">
+ </frame>
+ <frame src="body-{$thisfoil}" name="body" id="body" marginheight="0" frameborder="0">
+ </frame>
+ <frame src="bot-{$thisfoil}" name="bottom" id="bottom" marginheight="0" frameborder="0">
+ </frame>
+ <noframes>
+ <body class="frameset">
+ <xsl:call-template name="body.attributes"/>
+ <p>
+ <xsl:text>Your browser doesn't support frames.</xsl:text>
+ </p>
+ </body>
+ </noframes>
+ </frameset>
+</xsl:template>
+
+<xsl:template match="slidesinfo" mode="multiframe-top">
+ <xsl:variable name="thisfoil">
+ <xsl:value-of select="$titlefoil.html"/>
+ </xsl:variable>
+
+ <xsl:variable name="next" select="(following::foil
+ |following::foilgroup)[1]"/>
+
+ <xsl:call-template name="write.chunk">
+ <xsl:with-param name="indent" select="$output.indent"/>
+ <xsl:with-param name="filename" select="concat($base.dir,'top-',$thisfoil)"/>
+ <xsl:with-param name="content">
+ <html>
+ <head>
+ <title>Navigation</title>
+
+ <xsl:call-template name="system.head.content">
+ <xsl:with-param name="node" select=".."/>
+ </xsl:call-template>
+
+ <meta name="generator" content="DocBook Slides Stylesheets V{$VERSION}"/>
+
+ <xsl:if test="$css.stylesheet != ''">
+ <link type="text/css" rel="stylesheet">
+ <xsl:attribute name="href">
+ <xsl:call-template name="css.stylesheet"/>
+ </xsl:attribute>
+ </link>
+ </xsl:if>
+ <xsl:apply-templates select="/processing-instruction('dbhtml')" mode="css.pi"/>
+
+ <xsl:call-template name="links">
+ <xsl:with-param name="next" select="$next"/>
+ </xsl:call-template>
+
+ <xsl:if test="$overlay != 0 or $keyboard.nav != 0
+ or $dynamic.toc != 0 or $active.toc != 0">
+ <script language="javascript" type="text/javascript">
+ <xsl:text> </xsl:text>
+ </script>
+ </xsl:if>
+
+ <xsl:if test="$keyboard.nav != 0 or $dynamic.toc != 0 or $active.toc != 0">
+ <xsl:call-template name="ua.js"/>
+ <xsl:call-template name="xbDOM.js">
+ <xsl:with-param name="language" select="'javascript'"/>
+ </xsl:call-template>
+ <xsl:call-template name="xbLibrary.js"/>
+ <script language="javascript" type="text/javascript">
+ <xsl:text disable-output-escaping="yes">
+ &lt;!--
+ xblibrary = new xbLibrary('</xsl:text>
+ <xsl:call-template name="script-dir"/>
+ <xsl:text disable-output-escaping="yes">');
+ // --&gt;
+ </xsl:text>
+ </script>
+ <xsl:call-template name="xbStyle.js"/>
+ <xsl:call-template name="xbCollapsibleLists.js"/>
+ <xsl:call-template name="slides.js">
+ <xsl:with-param name="language" select="'javascript'"/>
+ </xsl:call-template>
+ </xsl:if>
+
+ <xsl:if test="$overlay != '0' or $overlay.logo != ''">
+ <xsl:call-template name="overlay.js">
+ <xsl:with-param name="language" select="'javascript'"/>
+ </xsl:call-template>
+ </xsl:if>
+
+ <xsl:call-template name="user.head.content">
+ <xsl:with-param name="node" select=".."/>
+ </xsl:call-template>
+ </head>
+ <body class="topnavigation" bgcolor="{$multiframe.top.bgcolor}">
+ <xsl:call-template name="foil-top-nav">
+ <xsl:with-param name="next" select="$next"/>
+ </xsl:call-template>
+ </body>
+ </html>
+ </xsl:with-param>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="slidesinfo" mode="multiframe-body">
+ <xsl:variable name="thisfoil">
+ <xsl:value-of select="$titlefoil.html"/>
+ </xsl:variable>
+
+ <xsl:variable name="next" select="(following::foil
+ |following::foilgroup)[1]"/>
+
+ <xsl:call-template name="write.chunk">
+ <xsl:with-param name="indent" select="$output.indent"/>
+ <xsl:with-param name="filename" select="concat($base.dir,'body-',$thisfoil)"/>
+ <xsl:with-param name="content">
+ <html>
+ <head>
+ <title>Body</title>
+
+ <xsl:call-template name="system.head.content">
+ <xsl:with-param name="node" select=".."/>
+ </xsl:call-template>
+
+ <meta name="generator" content="DocBook Slides Stylesheets V{$VERSION}"/>
+
+ <xsl:if test="$css.stylesheet != ''">
+ <link type="text/css" rel="stylesheet">
+ <xsl:attribute name="href">
+ <xsl:call-template name="css.stylesheet"/>
+ </xsl:attribute>
+ </link>
+ </xsl:if>
+ <xsl:apply-templates select="/processing-instruction('dbhtml')" mode="css.pi"/>
+
+ <xsl:call-template name="links">
+ <xsl:with-param name="next" select="$next"/>
+ </xsl:call-template>
+
+ <xsl:if test="$overlay != 0 or $keyboard.nav != 0
+ or $dynamic.toc != 0 or $active.toc != 0">
+ <script language="javascript" type="text/javascript">
+ <xsl:text> </xsl:text>
+ </script>
+ </xsl:if>
+
+ <xsl:if test="$keyboard.nav != 0 or $dynamic.toc != 0 or $active.toc != 0">
+ <xsl:call-template name="ua.js"/>
+ <xsl:call-template name="xbDOM.js">
+ <xsl:with-param name="language" select="'javascript'"/>
+ </xsl:call-template>
+ <xsl:call-template name="xbLibrary.js"/>
+ <script language="javascript" type="text/javascript">
+ <xsl:text disable-output-escaping="yes">
+ &lt;!--
+ xblibrary = new xbLibrary('</xsl:text>
+ <xsl:call-template name="script-dir"/>
+ <xsl:text disable-output-escaping="yes">');
+ // --&gt;
+ </xsl:text>
+ </script>
+ <xsl:call-template name="xbStyle.js"/>
+ <xsl:call-template name="xbCollapsibleLists.js"/>
+ <xsl:call-template name="slides.js">
+ <xsl:with-param name="language" select="'javascript'"/>
+ </xsl:call-template>
+ </xsl:if>
+
+ <xsl:call-template name="user.head.content">
+ <xsl:with-param name="node" select=".."/>
+ </xsl:call-template>
+ </head>
+ <xsl:apply-templates select="." mode="singleframe"/>
+ </html>
+ </xsl:with-param>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="slidesinfo" mode="multiframe-bottom">
+ <xsl:variable name="thisfoil">
+ <xsl:value-of select="$titlefoil.html"/>
+ </xsl:variable>
+
+ <xsl:variable name="next" select="(following::foil
+ |following::foilgroup)[1]"/>
+
+ <xsl:call-template name="write.chunk">
+ <xsl:with-param name="indent" select="$output.indent"/>
+ <xsl:with-param name="filename" select="concat($base.dir,'bot-',$thisfoil)"/>
+ <xsl:with-param name="content">
+ <html>
+ <head>
+ <title>Navigation</title>
+
+ <xsl:call-template name="system.head.content">
+ <xsl:with-param name="node" select=".."/>
+ </xsl:call-template>
+
+ <meta name="generator" content="DocBook Slides Stylesheets V{$VERSION}"/>
+
+ <xsl:if test="$css.stylesheet != ''">
+ <link type="text/css" rel="stylesheet">
+ <xsl:attribute name="href">
+ <xsl:call-template name="css.stylesheet"/>
+ </xsl:attribute>
+ </link>
+ </xsl:if>
+ <xsl:apply-templates select="/processing-instruction('dbhtml')" mode="css.pi"/>
+
+ <xsl:call-template name="links">
+ <xsl:with-param name="next" select="$next"/>
+ </xsl:call-template>
+
+ <xsl:if test="$overlay != 0 or $keyboard.nav != 0
+ or $dynamic.toc != 0 or $active.toc != 0">
+ <script language="javascript" type="text/javascript">
+ <xsl:text> </xsl:text>
+ </script>
+ </xsl:if>
+
+ <xsl:if test="$keyboard.nav != 0 or $dynamic.toc != 0 or $active.toc != 0">
+ <xsl:call-template name="ua.js"/>
+ <xsl:call-template name="xbDOM.js">
+ <xsl:with-param name="language" select="'javascript'"/>
+ </xsl:call-template>
+ <xsl:call-template name="xbLibrary.js"/>
+ <script language="javascript" type="text/javascript">
+ <xsl:text disable-output-escaping="yes">
+ &lt;!--
+ xblibrary = new xbLibrary('</xsl:text>
+ <xsl:call-template name="script-dir"/>
+ <xsl:text disable-output-escaping="yes">');
+ // --&gt;
+ </xsl:text>
+ </script>
+ <xsl:call-template name="xbStyle.js"/>
+ <xsl:call-template name="xbCollapsibleLists.js"/>
+ <xsl:call-template name="slides.js">
+ <xsl:with-param name="language" select="'javascript'"/>
+ </xsl:call-template>
+ </xsl:if>
+
+ <xsl:if test="$overlay != '0'">
+ <xsl:call-template name="overlay.js">
+ <xsl:with-param name="language" select="'javascript'"/>
+ </xsl:call-template>
+ </xsl:if>
+
+ <xsl:call-template name="user.head.content">
+ <xsl:with-param name="node" select=".."/>
+ </xsl:call-template>
+ </head>
+ <body class="botnavigation" bgcolor="{$multiframe.bottom.bgcolor}">
+ <xsl:call-template name="foil-bottom-nav">
+ <xsl:with-param name="next" select="$next"/>
+ </xsl:call-template>
+ </body>
+ </html>
+ </xsl:with-param>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="slidesinfo" mode="singleframe">
+ <xsl:param name="thisfoil">
+ <xsl:value-of select="$titlefoil.html"/>
+ </xsl:param>
+
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+
+ <xsl:variable name="next" select="(following::foil
+ |following::foilgroup)[1]"/>
+
+ <body class="titlepage">
+ <xsl:call-template name="body.attributes"/>
+ <xsl:choose>
+ <xsl:when test="$active.toc != 0">
+ <xsl:attribute name="onload">
+ <xsl:text>newPage('</xsl:text>
+ <xsl:value-of select="$titlefoil.html"/>
+ <xsl:text>',</xsl:text>
+ <xsl:value-of select="$overlay"/>
+ <xsl:text>);</xsl:text>
+ </xsl:attribute>
+ </xsl:when>
+ <xsl:when test="$overlay != 0">
+ <xsl:attribute name="onload">
+ <xsl:text>overlaySetup('lc');</xsl:text>
+ </xsl:attribute>
+ </xsl:when>
+ </xsl:choose>
+
+ <xsl:if test="$keyboard.nav != 0">
+ <xsl:attribute name="onload">
+ <xsl:text>this.focus()</xsl:text>
+ </xsl:attribute>
+ <xsl:attribute name="onkeypress">
+ <xsl:text>navigate(event)</xsl:text>
+ </xsl:attribute>
+ </xsl:if>
+
+ <div class="{name(.)}">
+ <xsl:apply-templates mode="titlepage.mode"/>
+ </div>
+
+ <xsl:if test="$multiframe=0">
+ <div id="overlayDiv" class="navfoot">
+ <xsl:choose>
+ <xsl:when test="$overlay != 0">
+ <xsl:attribute name="style">
+ <xsl:text>position:absolute;visibility:visible;</xsl:text>
+ </xsl:attribute>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:attribute name="style">
+ <xsl:text>padding-top: 2in;</xsl:text>
+ </xsl:attribute>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <table width="100%" border="0"
+ cellspacing="0" cellpadding="0"
+ summary="Navigation">
+ <tr>
+ <td align="left" width="80%" valign="top">
+ <span class="navfooter">
+ <!-- suppress copyright here; it's probably already on the titlepage
+ <xsl:apply-templates select="/slides/slidesinfo/copyright"
+ mode="slide.footer.mode"/>
+ -->
+ <xsl:text>&#160;</xsl:text>
+ </span>
+ </td>
+ <td align="right" width="20%" valign="top">
+ <a>
+ <xsl:attribute name="href">
+ <xsl:apply-templates select="$next" mode="filename"/>
+ </xsl:attribute>
+ <img alt="{$text.next}" border="0">
+ <xsl:attribute name="src">
+ <xsl:call-template name="next.image"/>
+ </xsl:attribute>
+ </img>
+ </a>
+ </td>
+ </tr>
+ </table>
+ </div>
+ </xsl:if>
+ </body>
+</xsl:template>
+
+<!-- ====================================================================== -->
+
+<xsl:template name="top-nav">
+ <xsl:param name="home"/>
+ <xsl:param name="up"/>
+ <xsl:param name="next"/>
+ <xsl:param name="prev"/>
+ <xsl:param name="tocfile" select="$toc.html"/>
+
+ <div class="navhead">
+ <table border="0" width="100%" cellspacing="0" cellpadding="0"
+ summary="Navigation table">
+ <tr>
+ <td align="left" valign="bottom" width="10%">
+ <xsl:choose>
+ <xsl:when test="$prev">
+ <span class="link-text">
+ <a>
+ <xsl:attribute name="href">
+ <xsl:apply-templates select="$prev" mode="filename"/>
+ </xsl:attribute>
+ <xsl:if test="$multiframe != 0">
+ <xsl:attribute name="target">foil</xsl:attribute>
+ </xsl:if>
+ <img alt="{$text.prev}" border="0">
+ <xsl:attribute name="src">
+ <xsl:call-template name="prev.image"/>
+ </xsl:attribute>
+ </img>
+ </a>
+ </span>
+ </xsl:when>
+ <xsl:otherwise>
+ <span class="no-link-text">&#160;</span>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:text>&#160;</xsl:text>
+ </td>
+ <td width="80%" align="center" valign="bottom">
+ <xsl:call-template name="foil.number"/>
+ </td>
+ <td align="right" valign="bottom" width="10%">
+ <xsl:choose>
+ <xsl:when test="$next">
+ <span class="link-text">
+ <a>
+ <xsl:attribute name="href">
+ <xsl:apply-templates select="$next" mode="filename"/>
+ </xsl:attribute>
+ <xsl:if test="$multiframe != 0">
+ <xsl:attribute name="target">foil</xsl:attribute>
+ </xsl:if>
+ <img alt="{$text.next}" border="0">
+ <xsl:attribute name="src">
+ <xsl:call-template name="next.image"/>
+ </xsl:attribute>
+ </img>
+ </a>
+ </span>
+ </xsl:when>
+ <xsl:otherwise>
+ <span class="no-link-text">&#160;</span>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:text>&#160;</xsl:text>
+ </td>
+ </tr>
+ </table>
+ <hr class="top-nav-sep"/>
+ </div>
+</xsl:template>
+
+<xsl:template name="bottom-nav">
+ <xsl:param name="home"/>
+ <xsl:param name="up"/>
+ <xsl:param name="next"/>
+ <xsl:param name="prev"/>
+ <xsl:param name="tocfile" select="$toc.html"/>
+
+ <div class="navfoot">
+ <hr class="bottom-nav-sep"/>
+ <table border="0" width="100%" cellspacing="0" cellpadding="0"
+ summary="Navigation table">
+ <tr>
+ <td align="left" valign="top">
+ <xsl:apply-templates select="/slides/slidesinfo/copyright"
+ mode="slide.footer.mode"/>
+ <xsl:text>&#160;</xsl:text>
+ </td>
+
+ <td align="right" valign="top">
+ <xsl:choose>
+ <xsl:when test="$prev">
+ <span class="link-text">
+ <a>
+ <xsl:attribute name="href">
+ <xsl:apply-templates select="$prev" mode="filename"/>
+ </xsl:attribute>
+ <xsl:if test="$multiframe != 0">
+ <xsl:attribute name="target">foil</xsl:attribute>
+ </xsl:if>
+ <img alt="{$text.prev}" border="0">
+ <xsl:attribute name="src">
+ <xsl:call-template name="prev.image"/>
+ </xsl:attribute>
+ </img>
+ </a>
+ </span>
+ </xsl:when>
+ <xsl:otherwise>
+ <span class="no-link-text">&#160;</span>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:text>&#160;</xsl:text>
+
+ <xsl:choose>
+ <xsl:when test="$next">
+ <span class="link-text">
+ <a>
+ <xsl:attribute name="href">
+ <xsl:apply-templates select="$next" mode="filename"/>
+ </xsl:attribute>
+ <xsl:if test="$multiframe != 0">
+ <xsl:attribute name="target">foil</xsl:attribute>
+ </xsl:if>
+ <img alt="{$text.next}" border="0">
+ <xsl:attribute name="src">
+ <xsl:call-template name="next.image"/>
+ </xsl:attribute>
+ </img>
+ </a>
+ </span>
+ </xsl:when>
+ <xsl:otherwise>
+ <span class="no-link-text">&#160;</span>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:text>&#160;</xsl:text>
+ </td>
+ </tr>
+ </table>
+ </div>
+</xsl:template>
+
+<!-- ====================================================================== -->
+
+<xsl:template match="foilgroup">
+ <xsl:param name="thisfoilgroup">
+ <xsl:apply-templates select="." mode="filename"/>
+ </xsl:param>
+
+ <xsl:variable name="doctype-public">
+ <xsl:call-template name="doctype-public">
+ <xsl:with-param name="frameset" select="$multiframe"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="doctype-system">
+ <xsl:call-template name="doctype-system">
+ <xsl:with-param name="frameset" select="$multiframe"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="home" select="/slides"/>
+ <xsl:variable name="up" select="(parent::slides|parent::foilgroup)[1]"/>
+ <xsl:variable name="next" select="foil[1]"/>
+ <xsl:variable name="prev" select="(preceding::foil|parent::foilgroup|/slides)[last()]"/>
+ <xsl:call-template name="write.chunk">
+ <xsl:with-param name="indent" select="$output.indent"/>
+ <xsl:with-param name="doctype-public" select="$doctype-public"/>
+ <xsl:with-param name="doctype-system" select="$doctype-system"/>
+ <xsl:with-param name="filename" select="concat($base.dir,$thisfoilgroup)"/>
+ <xsl:with-param name="content">
+ <html>
+ <head>
+ <title><xsl:value-of select="title"/></title>
+
+ <xsl:call-template name="system.head.content"/>
+
+ <meta name="generator" content="DocBook Slides Stylesheets V{$VERSION}"/>
+
+ <xsl:if test="$css.stylesheet != ''">
+ <link type="text/css" rel="stylesheet">
+ <xsl:attribute name="href">
+ <xsl:call-template name="css.stylesheet"/>
+ </xsl:attribute>
+ </link>
+ </xsl:if>
+ <xsl:apply-templates select="/processing-instruction('dbhtml')" mode="css.pi"/>
+
+ <xsl:call-template name="links">
+ <xsl:with-param name="home" select="$home"/>
+ <xsl:with-param name="up" select="$up"/>
+ <xsl:with-param name="next" select="$next"/>
+ <xsl:with-param name="prev" select="$prev"/>
+ </xsl:call-template>
+
+ <xsl:if test="$overlay != 0 or $keyboard.nav != 0
+ or $dynamic.toc != 0 or $active.toc != 0">
+ <script language="javascript" type="text/javascript">
+ <xsl:text> </xsl:text>
+ </script>
+ </xsl:if>
+
+ <xsl:if test="$keyboard.nav != 0 or $dynamic.toc != 0 or $active.toc != 0">
+ <xsl:call-template name="ua.js"/>
+ <xsl:call-template name="xbDOM.js">
+ <xsl:with-param name="language" select="'javascript'"/>
+ </xsl:call-template>
+ <xsl:call-template name="xbLibrary.js"/>
+ <script language="javascript" type="text/javascript">
+ <xsl:text disable-output-escaping="yes">
+ &lt;!--
+ xblibrary = new xbLibrary('</xsl:text>
+ <xsl:call-template name="script-dir"/>
+ <xsl:text disable-output-escaping="yes">');
+ // --&gt;
+ </xsl:text>
+ </script>
+ <xsl:call-template name="xbStyle.js"/>
+ <xsl:call-template name="xbCollapsibleLists.js"/>
+ <xsl:call-template name="slides.js">
+ <xsl:with-param name="language" select="'javascript'"/>
+ </xsl:call-template>
+ </xsl:if>
+
+ <xsl:if test="$overlay != '0'">
+ <xsl:call-template name="overlay.js">
+ <xsl:with-param name="language" select="'javascript'"/>
+ </xsl:call-template>
+ </xsl:if>
+
+ <xsl:call-template name="user.head.content"/>
+ </head>
+ <xsl:choose>
+ <xsl:when test="$multiframe != 0">
+ <xsl:apply-templates select="." mode="multiframe"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="." mode="singleframe"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </html>
+ </xsl:with-param>
+ </xsl:call-template>
+
+ <xsl:if test="$multiframe != 0">
+ <xsl:apply-templates select="." mode="multiframe-top"/>
+ <xsl:apply-templates select="." mode="multiframe-body"/>
+ <xsl:apply-templates select="." mode="multiframe-bottom"/>
+ </xsl:if>
+
+ <xsl:apply-templates select="foil"/>
+</xsl:template>
+
+<xsl:template match="foilgroup" mode="multiframe">
+ <xsl:variable name="thisfoilgroup">
+ <xsl:text>foilgroup</xsl:text>
+ <xsl:number count="foilgroup" level="any" format="01"/>
+ <xsl:value-of select="$html.ext"/>
+ </xsl:variable>
+
+ <frameset rows="{$multiframe.navigation.height},*,{$multiframe.navigation.height}" id="foil">
+ <xsl:attribute name="onload">
+ <xsl:text>javascript:body.focus()</xsl:text>
+ </xsl:attribute>
+ <frame src="top-{$thisfoilgroup}" name="top" id="top" marginheight="0" frameborder="0"/>
+ <frame src="body-{$thisfoilgroup}" name="body" id="body" marginheight="0" frameborder="0"/>
+ <frame src="bot-{$thisfoilgroup}" name="bottom" id="bottom" marginheight="0" frameborder="0"/>
+ <noframes>
+ <body class="frameset">
+ <xsl:call-template name="body.attributes"/>
+ <p>
+ <xsl:text>Your browser doesn't support frames.</xsl:text>
+ </p>
+ </body>
+ </noframes>
+ </frameset>
+</xsl:template>
+
+<xsl:template match="foilgroup" mode="multiframe-top">
+ <xsl:variable name="foilgroup">
+ <xsl:text>foilgroup</xsl:text>
+ <xsl:number count="foilgroup" level="any" format="01"/>
+ <xsl:value-of select="$html.ext"/>
+ </xsl:variable>
+
+ <xsl:variable name="home" select="/slides"/>
+ <xsl:variable name="up" select="(parent::slides|parent::foilgroup)[1]"/>
+ <xsl:variable name="next" select="foil[1]"/>
+ <xsl:variable name="prev" select="(preceding::foil|parent::foilgroup|/slides)[last()]"/>
+
+ <xsl:call-template name="write.chunk">
+ <xsl:with-param name="indent" select="$output.indent"/>
+ <xsl:with-param name="filename" select="concat($base.dir,'top-',$foilgroup)"/>
+ <xsl:with-param name="content">
+ <html>
+ <head>
+ <title>Navigation</title>
+
+ <xsl:call-template name="system.head.content"/>
+
+ <meta name="generator" content="DocBook Slides Stylesheets V{$VERSION}"/>
+
+ <xsl:if test="$css.stylesheet != ''">
+ <link type="text/css" rel="stylesheet">
+ <xsl:attribute name="href">
+ <xsl:call-template name="css.stylesheet"/>
+ </xsl:attribute>
+ </link>
+ </xsl:if>
+ <xsl:apply-templates select="/processing-instruction('dbhtml')" mode="css.pi"/>
+
+ <xsl:call-template name="links">
+ <xsl:with-param name="home" select="$home"/>
+ <xsl:with-param name="up" select="$up"/>
+ <xsl:with-param name="next" select="$next"/>
+ <xsl:with-param name="prev" select="$prev"/>
+ </xsl:call-template>
+
+ <xsl:if test="$overlay != 0 or $keyboard.nav != 0
+ or $dynamic.toc != 0 or $active.toc != 0">
+ <script language="javascript" type="text/javascript">
+ <xsl:text> </xsl:text>
+ </script>
+ </xsl:if>
+
+ <xsl:if test="$keyboard.nav != 0 or $dynamic.toc != 0 or $active.toc != 0">
+ <xsl:call-template name="ua.js"/>
+ <xsl:call-template name="xbDOM.js">
+ <xsl:with-param name="language" select="'javascript'"/>
+ </xsl:call-template>
+ <xsl:call-template name="xbLibrary.js"/>
+ <xsl:call-template name="xbStyle.js"/>
+ <xsl:call-template name="xbCollapsibleLists.js"/>
+ <xsl:call-template name="slides.js">
+ <xsl:with-param name="language" select="'javascript'"/>
+ </xsl:call-template>
+ </xsl:if>
+
+ <xsl:if test="$overlay != '0'">
+ <xsl:call-template name="overlay.js">
+ <xsl:with-param name="language" select="'javascript'"/>
+ </xsl:call-template>
+ </xsl:if>
+
+ <xsl:call-template name="user.head.content"/>
+ </head>
+ <body class="topnavigation" bgcolor="{$multiframe.top.bgcolor}">
+ <xsl:call-template name="foilgroup-top-nav">
+ <xsl:with-param name="home" select="$home"/>
+ <xsl:with-param name="up" select="$up"/>
+ <xsl:with-param name="next" select="$next"/>
+ <xsl:with-param name="prev" select="$prev"/>
+ </xsl:call-template>
+ </body>
+ </html>
+ </xsl:with-param>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="foilgroup" mode="multiframe-body">
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+
+ <xsl:variable name="home" select="/slides"/>
+ <xsl:variable name="up" select="(parent::slides|parent::foilgroup)[1]"/>
+ <xsl:variable name="next" select="foil[1]"/>
+ <xsl:variable name="prev" select="(preceding::foil|parent::foilgroup|/slides)[last()]"/>
+
+ <xsl:variable name="thisfoilgroup">
+ <xsl:text>foilgroup</xsl:text>
+ <xsl:number count="foilgroup" level="any" format="01"/>
+ <xsl:value-of select="$html.ext"/>
+ </xsl:variable>
+
+ <xsl:call-template name="write.chunk">
+ <xsl:with-param name="indent" select="$output.indent"/>
+ <xsl:with-param name="filename" select="concat($base.dir,'body-',$thisfoilgroup)"/>
+ <xsl:with-param name="content">
+ <html>
+ <head>
+ <title>Body</title>
+
+ <xsl:call-template name="system.head.content"/>
+
+ <meta name="generator" content="DocBook Slides Stylesheets V{$VERSION}"/>
+
+ <xsl:if test="$css.stylesheet != ''">
+ <link type="text/css" rel="stylesheet">
+ <xsl:attribute name="href">
+ <xsl:call-template name="css.stylesheet"/>
+ </xsl:attribute>
+ </link>
+ </xsl:if>
+ <xsl:apply-templates select="/processing-instruction('dbhtml')" mode="css.pi"/>
+
+ <xsl:call-template name="links">
+ <xsl:with-param name="home" select="$home"/>
+ <xsl:with-param name="up" select="$up"/>
+ <xsl:with-param name="next" select="$next"/>
+ <xsl:with-param name="prev" select="$prev"/>
+ </xsl:call-template>
+
+ <xsl:if test="$overlay != 0 or $keyboard.nav != 0
+ or $dynamic.toc != 0 or $active.toc != 0">
+ <script language="javascript" type="text/javascript">
+ <xsl:text> </xsl:text>
+ </script>
+ </xsl:if>
+
+ <xsl:if test="$keyboard.nav != 0 or $dynamic.toc != 0 or $active.toc != 0">
+ <xsl:call-template name="ua.js"/>
+ <xsl:call-template name="xbDOM.js">
+ <xsl:with-param name="language" select="'javascript'"/>
+ </xsl:call-template>
+ <xsl:call-template name="xbLibrary.js"/>
+ <script language="javascript" type="text/javascript">
+ <xsl:text disable-output-escaping="yes">
+ &lt;!--
+ xblibrary = new xbLibrary('</xsl:text>
+ <xsl:call-template name="script-dir"/>
+ <xsl:text disable-output-escaping="yes">');
+ // --&gt;
+ </xsl:text>
+ </script>
+ <xsl:call-template name="xbStyle.js"/>
+ <xsl:call-template name="xbCollapsibleLists.js"/>
+ <xsl:call-template name="slides.js">
+ <xsl:with-param name="language" select="'javascript'"/>
+ </xsl:call-template>
+ </xsl:if>
+
+ <xsl:if test="$overlay != '0'">
+ <xsl:call-template name="overlay.js">
+ <xsl:with-param name="language" select="'javascript'"/>
+ </xsl:call-template>
+ </xsl:if>
+
+ <xsl:call-template name="user.head.content"/>
+ </head>
+ <xsl:apply-templates select="." mode="singleframe"/>
+ </html>
+ </xsl:with-param>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="foilgroup" mode="multiframe-bottom">
+ <xsl:variable name="thisfoilgroup">
+ <xsl:text>foilgroup</xsl:text>
+ <xsl:number count="foilgroup" level="any" format="01"/>
+ <xsl:value-of select="$html.ext"/>
+ </xsl:variable>
+
+ <xsl:variable name="home" select="/slides"/>
+ <xsl:variable name="up" select="(parent::slides|parent::foilgroup)[1]"/>
+ <xsl:variable name="next" select="foil[1]"/>
+ <xsl:variable name="prev" select="(preceding::foil|parent::foilgroup|/slides)[last()]"/>
+
+ <xsl:call-template name="write.chunk">
+ <xsl:with-param name="indent" select="$output.indent"/>
+ <xsl:with-param name="filename" select="concat($base.dir,'bot-',$thisfoilgroup)"/>
+ <xsl:with-param name="content">
+ <html>
+ <head>
+ <title>Navigation</title>
+
+ <xsl:call-template name="system.head.content"/>
+
+ <meta name="generator" content="DocBook Slides Stylesheets V{$VERSION}"/>
+
+ <xsl:if test="$css.stylesheet != ''">
+ <link type="text/css" rel="stylesheet">
+ <xsl:attribute name="href">
+ <xsl:call-template name="css.stylesheet"/>
+ </xsl:attribute>
+ </link>
+ </xsl:if>
+ <xsl:apply-templates select="/processing-instruction('dbhtml')" mode="css.pi"/>
+
+ <xsl:call-template name="links">
+ <xsl:with-param name="home" select="$home"/>
+ <xsl:with-param name="up" select="$up"/>
+ <xsl:with-param name="next" select="$next"/>
+ <xsl:with-param name="prev" select="$prev"/>
+ </xsl:call-template>
+
+ <xsl:if test="$overlay != 0 or $keyboard.nav != 0
+ or $dynamic.toc != 0 or $active.toc != 0">
+ <script language="javascript" type="text/javascript">
+ <xsl:text> </xsl:text>
+ </script>
+ </xsl:if>
+
+ <xsl:if test="$keyboard.nav != 0 or $dynamic.toc != 0 or $active.toc != 0">
+ <xsl:call-template name="ua.js"/>
+ <xsl:call-template name="xbDOM.js">
+ <xsl:with-param name="language" select="'javascript'"/>
+ </xsl:call-template>
+ <xsl:call-template name="xbLibrary.js"/>
+ <script language="javascript" type="text/javascript">
+ <xsl:text disable-output-escaping="yes">
+ &lt;!--
+ xblibrary = new xbLibrary('</xsl:text>
+ <xsl:call-template name="script-dir"/>
+ <xsl:text disable-output-escaping="yes">');
+ // --&gt;
+ </xsl:text>
+ </script>
+ <xsl:call-template name="xbStyle.js"/>
+ <xsl:call-template name="xbCollapsibleLists.js"/>
+ <xsl:call-template name="slides.js">
+ <xsl:with-param name="language" select="'javascript'"/>
+ </xsl:call-template>
+ </xsl:if>
+
+ <xsl:if test="$overlay != '0'">
+ <xsl:call-template name="overlay.js">
+ <xsl:with-param name="language" select="'javascript'"/>
+ </xsl:call-template>
+ </xsl:if>
+
+ <xsl:call-template name="user.head.content"/>
+ </head>
+ <body class="botnavigation" bgcolor="{$multiframe.bottom.bgcolor}">
+ <xsl:call-template name="foilgroup-bottom-nav">
+ <xsl:with-param name="home" select="$home"/>
+ <xsl:with-param name="up" select="$up"/>
+ <xsl:with-param name="next" select="$next"/>
+ <xsl:with-param name="prev" select="$prev"/>
+ </xsl:call-template>
+ </body>
+ </html>
+ </xsl:with-param>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="foilgroup" mode="singleframe">
+ <xsl:param name="thisfoilgroup">
+ <xsl:apply-templates select="." mode="filename"/>
+ </xsl:param>
+
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+
+ <xsl:variable name="home" select="/slides"/>
+ <xsl:variable name="up" select="(parent::slides|parent::foilgroup)[1]"/>
+ <xsl:variable name="next" select="foil[1]"/>
+ <xsl:variable name="prev" select="(preceding::foil|parent::foilgroup|/slides)[last()]"/>
+ <body class="foilgroup">
+ <xsl:call-template name="body.attributes"/>
+ <xsl:choose>
+ <xsl:when test="$active.toc != 0">
+ <xsl:attribute name="onload">
+ <xsl:text>newPage('</xsl:text>
+ <xsl:value-of select="$thisfoilgroup"/>
+ <xsl:text>',</xsl:text>
+ <xsl:value-of select="$overlay"/>
+ <xsl:text>);</xsl:text>
+ </xsl:attribute>
+ </xsl:when>
+ <xsl:when test="$overlay != 0">
+ <xsl:attribute name="onload">
+ <xsl:text>overlaySetup('lc');</xsl:text>
+ </xsl:attribute>
+ </xsl:when>
+ </xsl:choose>
+
+
+ <xsl:if test="$keyboard.nav != 0">
+ <xsl:attribute name="onkeypress">
+ <xsl:text>navigate(event)</xsl:text>
+ </xsl:attribute>
+ </xsl:if>
+
+ <div class="{name(.)}" id="{$id}">
+ <xsl:if test="$multiframe=0">
+ <xsl:call-template name="foilgroup-top-nav">
+ <xsl:with-param name="home" select="$home"/>
+ <xsl:with-param name="up" select="$up"/>
+ <xsl:with-param name="next" select="$next"/>
+ <xsl:with-param name="prev" select="$prev"/>
+ </xsl:call-template>
+ </xsl:if>
+
+ <div class="foilgroup-body" id="{$id}">
+ <xsl:call-template name="foilgroup-body">
+ <xsl:with-param name="home" select="$home"/>
+ <xsl:with-param name="up" select="$up"/>
+ <xsl:with-param name="next" select="$next"/>
+ <xsl:with-param name="prev" select="$prev"/>
+ </xsl:call-template>
+ </div>
+
+ <xsl:if test="$multiframe=0">
+ <div id="overlayDiv">
+ <xsl:if test="$overlay != 0">
+ <xsl:attribute name="style">
+ <xsl:text>position:absolute;visibility:visible;</xsl:text>
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:call-template name="foilgroup-bottom-nav">
+ <xsl:with-param name="home" select="$home"/>
+ <xsl:with-param name="up" select="$up"/>
+ <xsl:with-param name="next" select="$next"/>
+ <xsl:with-param name="prev" select="$prev"/>
+ </xsl:call-template>
+ </div>
+ </xsl:if>
+ </div>
+
+ <xsl:call-template name="process.footnotes"/>
+ </body>
+</xsl:template>
+
+<!-- ====================================================================== -->
+
+<xsl:template match="foil">
+ <xsl:variable name="thisfoil">
+ <xsl:apply-templates select="." mode="filename"/>
+ </xsl:variable>
+
+ <xsl:variable name="home" select="/slides"/>
+ <xsl:variable name="up" select="(parent::slides|parent::foilgroup)[1]"/>
+ <xsl:variable name="next" select="(following::foil
+ |following::foilgroup)[1]"/>
+ <xsl:variable name="prev" select="(preceding-sibling::foil[1]
+ |parent::foilgroup[1]
+ |/slides)[last()]"/>
+
+ <xsl:variable name="doctype-public">
+ <xsl:call-template name="doctype-public">
+ <xsl:with-param name="frameset" select="$multiframe"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="doctype-system">
+ <xsl:call-template name="doctype-system">
+ <xsl:with-param name="frameset" select="$multiframe"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:call-template name="write.chunk">
+ <xsl:with-param name="indent" select="$output.indent"/>
+ <xsl:with-param name="doctype-public" select="$doctype-public"/>
+ <xsl:with-param name="doctype-system" select="$doctype-system"/>
+ <xsl:with-param name="filename" select="concat($base.dir,$thisfoil)"/>
+ <xsl:with-param name="content">
+ <html>
+ <head>
+ <title><xsl:value-of select="title"/></title>
+
+ <xsl:call-template name="system.head.content"/>
+
+ <meta name="generator" content="DocBook Slides Stylesheets V{$VERSION}"/>
+
+ <xsl:if test="$css.stylesheet != ''">
+ <link type="text/css" rel="stylesheet">
+ <xsl:attribute name="href">
+ <xsl:call-template name="css.stylesheet"/>
+ </xsl:attribute>
+ </link>
+ </xsl:if>
+ <xsl:apply-templates select="/processing-instruction('dbhtml')" mode="css.pi"/>
+
+ <xsl:call-template name="links">
+ <xsl:with-param name="home" select="$home"/>
+ <xsl:with-param name="up" select="$up"/>
+ <xsl:with-param name="next" select="$next"/>
+ <xsl:with-param name="prev" select="$prev"/>
+ </xsl:call-template>
+
+ <xsl:if test="$overlay != 0 or $keyboard.nav != 0
+ or $dynamic.toc != 0 or $active.toc != 0">
+ <script language="javascript" type="text/javascript">
+ <xsl:text> </xsl:text>
+ </script>
+ </xsl:if>
+
+ <xsl:if test="$keyboard.nav != 0 or $dynamic.toc != 0 or $active.toc != 0">
+ <xsl:call-template name="ua.js"/>
+ <xsl:call-template name="xbDOM.js">
+ <xsl:with-param name="language" select="'javascript'"/>
+ </xsl:call-template>
+ <xsl:call-template name="xbLibrary.js"/>
+ <script language="javascript" type="text/javascript">
+ <xsl:text disable-output-escaping="yes">
+ &lt;!--
+ xblibrary = new xbLibrary('</xsl:text>
+ <xsl:call-template name="script-dir"/>
+ <xsl:text disable-output-escaping="yes">');
+ // --&gt;
+ </xsl:text>
+ </script>
+ <xsl:call-template name="xbStyle.js"/>
+ <xsl:call-template name="xbCollapsibleLists.js"/>
+ <xsl:call-template name="slides.js">
+ <xsl:with-param name="language" select="'javascript'"/>
+ </xsl:call-template>
+ </xsl:if>
+
+ <xsl:if test="$overlay != '0'">
+ <xsl:call-template name="overlay.js">
+ <xsl:with-param name="language" select="'javascript'"/>
+ </xsl:call-template>
+ </xsl:if>
+
+ <xsl:call-template name="user.head.content"/>
+ </head>
+ <xsl:choose>
+ <xsl:when test="$multiframe != 0">
+ <xsl:apply-templates select="." mode="multiframe"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="." mode="singleframe"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </html>
+ </xsl:with-param>
+ </xsl:call-template>
+
+ <xsl:if test="$multiframe != 0">
+ <xsl:apply-templates select="." mode="multiframe-top"/>
+ <xsl:apply-templates select="." mode="multiframe-body"/>
+ <xsl:apply-templates select="." mode="multiframe-bottom"/>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="foil" mode="multiframe">
+ <xsl:variable name="foilgroup" select="ancestor::foilgroup"/>
+
+ <xsl:variable name="thisfoil">
+ <xsl:apply-templates select="." mode="filename"/>
+ </xsl:variable>
+
+ <frameset rows="{$multiframe.navigation.height},*,{$multiframe.navigation.height}" id="foil">
+ <xsl:attribute name="onload">
+ <xsl:text>javascript:body.focus()</xsl:text>
+ </xsl:attribute>
+ <frame src="top-{$thisfoil}" name="top" id="top" marginheight="0" frameborder="0">
+ </frame>
+ <frame src="body-{$thisfoil}" name="body" id="body" marginheight="0" frameborder="0">
+ </frame>
+ <frame src="bot-{$thisfoil}" name="bottom" id="bottom" marginheight="0" frameborder="0">
+ </frame>
+ <noframes>
+ <body class="frameset">
+ <xsl:call-template name="body.attributes"/>
+ <p>
+ <xsl:text>Your browser doesn't support frames.</xsl:text>
+ </p>
+ </body>
+ </noframes>
+ </frameset>
+</xsl:template>
+
+<xsl:template match="foil" mode="multiframe-top">
+ <xsl:variable name="thisfoil">
+ <xsl:apply-templates select="." mode="filename"/>
+ </xsl:variable>
+
+ <xsl:variable name="home" select="/slides"/>
+ <xsl:variable name="up" select="(parent::slides|parent::foilgroup)[1]"/>
+ <xsl:variable name="next" select="(following::foil
+ |following::foilgroup)[1]"/>
+ <xsl:variable name="prev" select="(preceding-sibling::foil[1]
+ |parent::foilgroup[1]
+ |/slides)[last()]"/>
+
+ <xsl:call-template name="write.chunk">
+ <xsl:with-param name="indent" select="$output.indent"/>
+ <xsl:with-param name="filename" select="concat($base.dir,'top-',$thisfoil)"/>
+ <xsl:with-param name="content">
+ <html>
+ <head>
+ <title>Navigation</title>
+
+ <xsl:call-template name="system.head.content"/>
+
+ <meta name="generator" content="DocBook Slides Stylesheets V{$VERSION}"/>
+
+ <xsl:if test="$css.stylesheet != ''">
+ <link type="text/css" rel="stylesheet">
+ <xsl:attribute name="href">
+ <xsl:call-template name="css.stylesheet"/>
+ </xsl:attribute>
+ </link>
+ </xsl:if>
+ <xsl:apply-templates select="/processing-instruction('dbhtml')" mode="css.pi"/>
+
+ <xsl:if test="$overlay != 0 or $keyboard.nav != 0
+ or $dynamic.toc != 0 or $active.toc != 0">
+ <script language="javajcript" type="text/javascript">
+ <xsl:text> </xsl:text>
+ </script>
+ </xsl:if>
+
+ <xsl:if test="$keyboard.nav != 0 or $dynamic.toc != 0 or $active.toc != 0">
+ <xsl:call-template name="ua.js"/>
+ <xsl:call-template name="xbDOM.js">
+ <xsl:with-param name="language" select="'javascript'"/>
+ </xsl:call-template>
+ <xsl:call-template name="xbLibrary.js"/>
+ <script language="javascript" type="text/javascript">
+ <xsl:text disable-output-escaping="yes">
+ &lt;!--
+ xblibrary = new xbLibrary('</xsl:text>
+ <xsl:call-template name="script-dir"/>
+ <xsl:text disable-output-escaping="yes">');
+ // --&gt;
+ </xsl:text>
+ </script>
+ <xsl:call-template name="xbStyle.js"/>
+ <xsl:call-template name="xbCollapsibleLists.js"/>
+ <xsl:call-template name="slides.js">
+ <xsl:with-param name="language" select="'javascript'"/>
+ </xsl:call-template>
+ </xsl:if>
+
+ <xsl:if test="$overlay != '0'">
+ <xsl:call-template name="overlay.js">
+ <xsl:with-param name="language" select="'javascript'"/>
+ </xsl:call-template>
+ </xsl:if>
+
+ <xsl:call-template name="user.head.content"/>
+ </head>
+ <body class="topnavigation" bgcolor="{$multiframe.top.bgcolor}">
+ <xsl:call-template name="foil-top-nav">
+ <xsl:with-param name="home" select="$home"/>
+ <xsl:with-param name="up" select="$up"/>
+ <xsl:with-param name="next" select="$next"/>
+ <xsl:with-param name="prev" select="$prev"/>
+ </xsl:call-template>
+ </body>
+ </html>
+ </xsl:with-param>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="foil" mode="multiframe-body">
+ <xsl:variable name="thisfoil">
+ <xsl:apply-templates select="." mode="filename"/>
+ </xsl:variable>
+
+ <xsl:call-template name="write.chunk">
+ <xsl:with-param name="indent" select="$output.indent"/>
+ <xsl:with-param name="filename" select="concat($base.dir,'body-',$thisfoil)"/>
+ <xsl:with-param name="content">
+ <html>
+ <head>
+ <title>Body</title>
+
+ <xsl:call-template name="system.head.content"/>
+
+ <meta name="generator" content="DocBook Slides Stylesheets V{$VERSION}"/>
+
+ <xsl:if test="$css.stylesheet != ''">
+ <link type="text/css" rel="stylesheet">
+ <xsl:attribute name="href">
+ <xsl:call-template name="css.stylesheet"/>
+ </xsl:attribute>
+ </link>
+ </xsl:if>
+ <xsl:apply-templates select="/processing-instruction('dbhtml')" mode="css.pi"/>
+
+ <xsl:if test="$overlay != 0 or $keyboard.nav != 0
+ or $dynamic.toc != 0 or $active.toc != 0">
+ <script language="javascript" type="text/javascript">
+ <xsl:text> </xsl:text>
+ </script>
+ </xsl:if>
+
+ <xsl:if test="$keyboard.nav != 0 or $dynamic.toc != 0 or $active.toc != 0">
+ <xsl:variable name="home" select="/slides"/>
+ <xsl:variable name="up" select="(parent::slides|parent::foilgroup)[1]"/>
+ <xsl:variable name="next" select="(following::foil
+ |following::foilgroup)[1]"/>
+ <xsl:variable name="prev" select="(preceding-sibling::foil[1]
+ |parent::foilgroup[1]
+ |/slides)[last()]"/>
+
+ <xsl:call-template name="links">
+ <xsl:with-param name="home" select="$home"/>
+ <xsl:with-param name="up" select="$up"/>
+ <xsl:with-param name="next" select="$next"/>
+ <xsl:with-param name="prev" select="$prev"/>
+ </xsl:call-template>
+
+ <xsl:call-template name="ua.js"/>
+ <xsl:call-template name="xbDOM.js">
+ <xsl:with-param name="language" select="'javascript'"/>
+ </xsl:call-template>
+ <xsl:call-template name="xbLibrary.js"/>
+ <script language="javascript" type="text/javascript">
+ <xsl:text disable-output-escaping="yes">
+ &lt;!--
+ xblibrary = new xbLibrary('</xsl:text>
+ <xsl:call-template name="script-dir"/>
+ <xsl:text disable-output-escaping="yes">');
+ // --&gt;
+ </xsl:text>
+ </script>
+ <xsl:call-template name="xbStyle.js"/>
+ <xsl:call-template name="xbCollapsibleLists.js"/>
+ <xsl:call-template name="slides.js">
+ <xsl:with-param name="language" select="'javascript'"/>
+ </xsl:call-template>
+ </xsl:if>
+
+ <xsl:if test="$overlay != '0'">
+ <xsl:call-template name="overlay.js">
+ <xsl:with-param name="language" select="'javascript'"/>
+ </xsl:call-template>
+ </xsl:if>
+
+ <xsl:call-template name="user.head.content"/>
+
+ </head>
+ <xsl:apply-templates select="." mode="singleframe"/>
+ </html>
+ </xsl:with-param>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="foil" mode="multiframe-bottom">
+ <xsl:variable name="thisfoil">
+ <xsl:apply-templates select="." mode="filename"/>
+ </xsl:variable>
+
+ <xsl:variable name="home" select="/slides"/>
+ <xsl:variable name="up" select="(parent::slides|parent::foilgroup)[1]"/>
+ <xsl:variable name="next" select="(following::foil
+ |following::foilgroup)[1]"/>
+ <xsl:variable name="prev" select="(preceding-sibling::foil[1]
+ |parent::foilgroup[1]
+ |/slides)[last()]"/>
+
+ <xsl:call-template name="write.chunk">
+ <xsl:with-param name="indent" select="$output.indent"/>
+ <xsl:with-param name="filename" select="concat($base.dir,'bot-',$thisfoil)"/>
+ <xsl:with-param name="content">
+ <html>
+ <head>
+ <title>Navigation</title>
+
+ <xsl:call-template name="system.head.content"/>
+
+ <meta name="generator" content="DocBook Slides Stylesheets V{$VERSION}"/>
+
+ <xsl:if test="$css.stylesheet != ''">
+ <link type="text/css" rel="stylesheet">
+ <xsl:attribute name="href">
+ <xsl:call-template name="css.stylesheet"/>
+ </xsl:attribute>
+ </link>
+ </xsl:if>
+ <xsl:apply-templates select="/processing-instruction('dbhtml')" mode="css.pi"/>
+
+ <xsl:if test="$overlay != 0 or $keyboard.nav != 0
+ or $dynamic.toc != 0 or $active.toc != 0">
+ <script language="javascript" type="text/javascript">
+ <xsl:text> </xsl:text>
+ </script>
+ </xsl:if>
+
+ <xsl:if test="$keyboard.nav != 0 or $dynamic.toc != 0 or $active.toc != 0">
+ <xsl:call-template name="ua.js"/>
+ <xsl:call-template name="xbDOM.js">
+ <xsl:with-param name="language" select="'javascript'"/>
+ </xsl:call-template>
+ <xsl:call-template name="xbLibrary.js"/>
+ <script language="javascript" type="text/javascript">
+ <xsl:text disable-output-escaping="yes">
+ &lt;!--
+ xblibrary = new xbLibrary('</xsl:text>
+ <xsl:call-template name="script-dir"/>
+ <xsl:text disable-output-escaping="yes">');
+ // --&gt;
+ </xsl:text>
+ </script>
+ <xsl:call-template name="xbStyle.js"/>
+ <xsl:call-template name="xbCollapsibleLists.js"/>
+ <xsl:call-template name="slides.js">
+ <xsl:with-param name="language" select="'javascript'"/>
+ </xsl:call-template>
+ </xsl:if>
+
+ <xsl:if test="$overlay != '0'">
+ <xsl:call-template name="overlay.js">
+ <xsl:with-param name="language" select="'javascript'"/>
+ </xsl:call-template>
+ </xsl:if>
+
+ <xsl:call-template name="user.head.content"/>
+ </head>
+ <body class="botnavigation" bgcolor="{$multiframe.bottom.bgcolor}">
+ <xsl:call-template name="foil-bottom-nav">
+ <xsl:with-param name="home" select="$home"/>
+ <xsl:with-param name="up" select="$up"/>
+ <xsl:with-param name="next" select="$next"/>
+ <xsl:with-param name="prev" select="$prev"/>
+ </xsl:call-template>
+ </body>
+ </html>
+ </xsl:with-param>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="foil" mode="singleframe">
+ <xsl:param name="thisfoil">
+ <xsl:apply-templates select="." mode="filename"/>
+ </xsl:param>
+
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+
+ <xsl:variable name="home" select="/slides"/>
+ <xsl:variable name="up" select="(parent::slides|parent::foilgroup)[1]"/>
+ <xsl:variable name="next" select="(following::foil
+ |following::foilgroup)[1]"/>
+ <xsl:variable name="prev" select="(preceding-sibling::foil[1]
+ |parent::foilgroup[1]
+ |/slides)[last()]"/>
+
+ <body class="foil">
+ <xsl:call-template name="body.attributes"/>
+ <xsl:choose>
+ <xsl:when test="$active.toc != 0">
+ <xsl:attribute name="onload">
+ <xsl:text>newPage('</xsl:text>
+ <xsl:value-of select="$thisfoil"/>
+ <xsl:text>',</xsl:text>
+ <xsl:value-of select="$overlay"/>
+ <xsl:text>);</xsl:text>
+ </xsl:attribute>
+ </xsl:when>
+ <xsl:when test="$overlay != 0">
+ <xsl:attribute name="onload">
+ <xsl:text>overlaySetup('lc');</xsl:text>
+ </xsl:attribute>
+ </xsl:when>
+ </xsl:choose>
+
+ <xsl:if test="$keyboard.nav != 0">
+ <xsl:attribute name="onkeypress">
+ <xsl:text>navigate(event)</xsl:text>
+ </xsl:attribute>
+ </xsl:if>
+
+ <div class="{name(.)}" id="{$id}">
+ <xsl:if test="$multiframe=0">
+ <xsl:call-template name="foil-top-nav">
+ <xsl:with-param name="home" select="$home"/>
+ <xsl:with-param name="up" select="$up"/>
+ <xsl:with-param name="next" select="$next"/>
+ <xsl:with-param name="prev" select="$prev"/>
+ </xsl:call-template>
+ </xsl:if>
+
+ <div class="foil-body">
+ <xsl:apply-templates/>
+ </div>
+
+ <xsl:if test="$multiframe=0">
+ <div id="overlayDiv">
+ <xsl:if test="$overlay != 0">
+ <xsl:attribute name="style">
+ <xsl:text>position:absolute;visibility:visible;</xsl:text>
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:call-template name="foil-bottom-nav">
+ <xsl:with-param name="home" select="$home"/>
+ <xsl:with-param name="up" select="$up"/>
+ <xsl:with-param name="next" select="$next"/>
+ <xsl:with-param name="prev" select="$prev"/>
+ </xsl:call-template>
+ </div>
+ </xsl:if>
+ </div>
+
+ <xsl:call-template name="process.footnotes"/>
+ </body>
+</xsl:template>
+
+<!-- ============================================================ -->
+
+<xsl:template match="slidesinfo" mode="toc">
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+ <div id="{$id}" class="toc-slidesinfo">
+ <a href="{$titlefoil.html}" target="foil">
+ <xsl:choose>
+ <xsl:when test="titleabbrev">
+ <xsl:apply-templates select="titleabbrev" mode="toc"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="title" mode="toc"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </a>
+ <hr/>
+ </div>
+</xsl:template>
+
+<xsl:template match="foilgroup" mode="toc">
+ <xsl:variable name="id"><xsl:call-template name="object.id"/></xsl:variable>
+
+ <xsl:variable name="thisfoilgroup">
+ <xsl:text>foilgroup</xsl:text>
+ <xsl:number count="foilgroup" level="any" format="01"/>
+ <xsl:value-of select="$html.ext"/>
+ </xsl:variable>
+
+ <div class="toc-foilgroup" id="{$id}">
+ <img alt="-">
+ <xsl:attribute name="src">
+ <xsl:call-template name="minus.image"/>
+ </xsl:attribute>
+ </img>
+ <a href="{$thisfoilgroup}" target="foil">
+ <xsl:choose>
+ <xsl:when test="titleabbrev">
+ <xsl:apply-templates select="titleabbrev" mode="toc"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="title" mode="toc"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </a>
+ <xsl:apply-templates select="foil" mode="toc"/>
+ </div>
+</xsl:template>
+
+<xsl:template match="foil" mode="toc">
+ <xsl:variable name="id"><xsl:call-template name="object.id"/></xsl:variable>
+ <xsl:variable name="foil">
+ <xsl:apply-templates select="." mode="filename"/>
+ </xsl:variable>
+
+ <div id="{$id}" class="toc-foil">
+ <img alt="-">
+ <xsl:attribute name="src">
+ <xsl:call-template name="bullet.image"/>
+ </xsl:attribute>
+ </img>
+ <a href="{$foil}" target="foil">
+ <xsl:choose>
+ <xsl:when test="titleabbrev">
+ <xsl:apply-templates select="titleabbrev" mode="toc"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="title" mode="toc"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </a>
+ </div>
+</xsl:template>
+
+<!-- ====================================================================== -->
+
+<xsl:template match="slidesinfo" mode="ns-toc">
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+
+ <xsl:text>myList.addItem('</xsl:text>
+
+ <xsl:text disable-output-escaping="yes">&lt;div id="</xsl:text>
+ <xsl:value-of select="$id"/>
+ <xsl:text disable-output-escaping="yes">" class="toc-slidesinfo"&gt;</xsl:text>
+
+ <xsl:text disable-output-escaping="yes">&lt;a href="</xsl:text>
+ <xsl:value-of select="$titlefoil.html"/>
+ <xsl:text disable-output-escaping="yes">" target="foil"&gt;</xsl:text>
+
+ <xsl:call-template name="string.subst">
+ <xsl:with-param name="string">
+ <xsl:choose>
+ <xsl:when test="titleabbrev">
+ <xsl:value-of select="titleabbrev"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="title"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:with-param>
+ <xsl:with-param name="target">'</xsl:with-param>
+ <xsl:with-param name="replacement">\'</xsl:with-param>
+ </xsl:call-template>
+
+ <xsl:text disable-output-escaping="yes">&lt;\/a&gt;&lt;\/div&gt;</xsl:text>
+ <xsl:text>');&#10;</xsl:text>
+</xsl:template>
+
+<xsl:template match="foilgroup" mode="ns-toc">
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+
+ <xsl:text>subList = new List(false, width, height, "</xsl:text>
+<xsl:value-of select="$toc.bg.color"/>
+<xsl:text>");&#10;</xsl:text>
+ <xsl:text>subList.setIndent(12);&#10;</xsl:text>
+ <xsl:apply-templates select="foil" mode="ns-toc"/>
+
+ <xsl:text>myList.addList(subList, '</xsl:text>
+
+ <xsl:text disable-output-escaping="yes">&lt;div id="</xsl:text>
+ <xsl:value-of select="$id"/>
+ <xsl:text disable-output-escaping="yes">" class="toc-foilgroup"&gt;</xsl:text>
+
+ <xsl:text disable-output-escaping="yes">&lt;a href="</xsl:text>
+ <xsl:apply-templates select="." mode="filename"/>
+ <xsl:text disable-output-escaping="yes">" target="foil"&gt;</xsl:text>
+
+ <xsl:call-template name="string.subst">
+ <xsl:with-param name="string">
+ <xsl:choose>
+ <xsl:when test="titleabbrev">
+ <xsl:value-of select="titleabbrev"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="title"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:with-param>
+ <xsl:with-param name="target">'</xsl:with-param>
+ <xsl:with-param name="replacement">\'</xsl:with-param>
+ </xsl:call-template>
+
+ <xsl:text disable-output-escaping="yes">&lt;\/a&gt;&lt;\/div&gt;</xsl:text>
+ <xsl:text>');&#10;</xsl:text>
+</xsl:template>
+
+<xsl:template match="foil" mode="ns-toc">
+ <xsl:variable name="id"><xsl:call-template name="object.id"/></xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="ancestor::foilgroup">
+ <xsl:text>subList.addItem('</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text>myList.addItem('</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:text disable-output-escaping="yes">&lt;div id="</xsl:text>
+ <xsl:value-of select="$id"/>
+ <xsl:text disable-output-escaping="yes">" class="toc-foil"&gt;</xsl:text>
+
+ <xsl:text disable-output-escaping="yes">&lt;img alt="-" src="</xsl:text>
+ <xsl:call-template name="bullet.image"/>
+ <xsl:text disable-output-escaping="yes">"&gt;&lt;\/img&gt;</xsl:text>
+
+ <xsl:text disable-output-escaping="yes">&lt;a href="</xsl:text>
+ <xsl:apply-templates select="." mode="filename"/>
+ <xsl:text disable-output-escaping="yes">" target="foil"&gt;</xsl:text>
+
+ <xsl:call-template name="string.subst">
+ <xsl:with-param name="string">
+ <xsl:choose>
+ <xsl:when test="titleabbrev">
+ <xsl:value-of select="titleabbrev"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="title"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:with-param>
+ <xsl:with-param name="target">'</xsl:with-param>
+ <xsl:with-param name="replacement">\'</xsl:with-param>
+ </xsl:call-template>
+
+ <xsl:text disable-output-escaping="yes">&lt;\/a&gt;&lt;\/div&gt;</xsl:text>
+ <xsl:text>');&#10;</xsl:text>
+</xsl:template>
+
+<xsl:template match="speakernotes" mode="ns-toc">
+ <!-- nop -->
+</xsl:template>
+
+<!-- ====================================================================== -->
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/html/graphics.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/html/graphics.xsl
new file mode 100644
index 0000000..b682acd
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/html/graphics.xsl
@@ -0,0 +1,151 @@
+<?xml version="1.0"?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="1.0">
+
+<!-- ====================================================================== -->
+
+<xsl:template name="graphics-file">
+ <xsl:param name="image" select="'bullet.gif'"/>
+
+ <xsl:variable name="source.graphics.dir">
+ <xsl:call-template name="dbhtml-attribute">
+ <xsl:with-param name="pis" select="/processing-instruction('dbhtml')"/>
+ <xsl:with-param name="attribute" select="'graphics-dir'"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="$source.graphics.dir != ''">
+ <xsl:value-of select="$source.graphics.dir"/>
+ <xsl:text>/</xsl:text>
+ </xsl:when>
+ <xsl:when test="$graphics.dir != ''">
+ <xsl:value-of select="$graphics.dir"/>
+ <xsl:text>/</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text>http://docbook.sourceforge.net/release/slides/graphics/</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:value-of select="$image"/>
+</xsl:template>
+
+<!-- ====================================================================== -->
+<!-- active navigation images -->
+
+<xsl:template name="toc.image">
+ <!-- Danger Will Robinson: template shadows parameter -->
+ <xsl:call-template name="graphics-file">
+ <xsl:with-param name="image" select="$toc.image"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template name="home.image">
+ <!-- Danger Will Robinson: template shadows parameter -->
+ <xsl:call-template name="graphics-file">
+ <xsl:with-param name="image" select="$home.image"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template name="up.image">
+ <!-- Danger Will Robinson: template shadows parameter -->
+ <xsl:call-template name="graphics-file">
+ <xsl:with-param name="image" select="$up.image"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template name="prev.image">
+ <!-- Danger Will Robinson: template shadows parameter -->
+ <xsl:call-template name="graphics-file">
+ <xsl:with-param name="image" select="$prev.image"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template name="next.image">
+ <!-- Danger Will Robinson: template shadows parameter -->
+ <xsl:call-template name="graphics-file">
+ <xsl:with-param name="image" select="$next.image"/>
+ </xsl:call-template>
+</xsl:template>
+
+<!-- inactive navigation images -->
+
+<xsl:template name="no.toc.image">
+ <!-- Danger Will Robinson: template shadows parameter -->
+ <xsl:call-template name="graphics-file">
+ <xsl:with-param name="image" select="$no.toc.image"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template name="no.home.image">
+ <!-- Danger Will Robinson: template shadows parameter -->
+ <xsl:call-template name="graphics-file">
+ <xsl:with-param name="image" select="$no.home.image"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template name="no.up.image">
+ <!-- Danger Will Robinson: template shadows parameter -->
+ <xsl:call-template name="graphics-file">
+ <xsl:with-param name="image" select="$no.up.image"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template name="no.prev.image">
+ <!-- Danger Will Robinson: template shadows parameter -->
+ <xsl:call-template name="graphics-file">
+ <xsl:with-param name="image" select="$no.prev.image"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template name="no.next.image">
+ <!-- Danger Will Robinson: template shadows parameter -->
+ <xsl:call-template name="graphics-file">
+ <xsl:with-param name="image" select="$no.next.image"/>
+ </xsl:call-template>
+</xsl:template>
+
+<!-- ====================================================================== -->
+<!-- icon images -->
+
+<xsl:template name="bullet.image">
+ <!-- Danger Will Robinson: template shadows parameter -->
+ <xsl:call-template name="graphics-file">
+ <xsl:with-param name="image" select="$bullet.image"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template name="plus.image">
+ <!-- Danger Will Robinson: template shadows parameter -->
+ <xsl:call-template name="graphics-file">
+ <xsl:with-param name="image" select="$plus.image"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template name="minus.image">
+ <!-- Danger Will Robinson: template shadows parameter -->
+ <xsl:call-template name="graphics-file">
+ <xsl:with-param name="image" select="$minus.image"/>
+ </xsl:call-template>
+</xsl:template>
+
+<!-- ====================================================================== -->
+<!-- hide/show ToC images -->
+
+<xsl:template name="hidetoc.image">
+ <!-- Danger Will Robinson: template shadows parameter -->
+ <xsl:call-template name="graphics-file">
+ <xsl:with-param name="image" select="$hidetoc.image"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template name="showtoc.image">
+ <!-- Danger Will Robinson: template shadows parameter -->
+ <xsl:call-template name="graphics-file">
+ <xsl:with-param name="image" select="$showtoc.image"/>
+ </xsl:call-template>
+</xsl:template>
+
+<!-- ====================================================================== -->
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/html/jscript.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/html/jscript.xsl
new file mode 100644
index 0000000..ae4ef9f
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/html/jscript.xsl
@@ -0,0 +1,127 @@
+<?xml version="1.0"?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="1.0">
+
+<xsl:output method="html"/>
+
+<xsl:template name="script-dir">
+ <xsl:variable name="source.script.dir">
+ <xsl:call-template name="dbhtml-attribute">
+ <xsl:with-param name="pis" select="/processing-instruction('dbhtml')"/>
+ <xsl:with-param name="attribute" select="'script-dir'"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="$source.script.dir != ''">
+ <xsl:value-of select="$source.script.dir"/>
+ <xsl:text>/</xsl:text>
+ </xsl:when>
+ <xsl:when test="$script.dir != ''">
+ <xsl:value-of select="$script.dir"/>
+ <xsl:text>/</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text>http://docbook.sourceforge.net/release/slides/browser/</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="script-file">
+ <xsl:param name="js" select="'slides.js'"/>
+ <xsl:call-template name="script-dir"/>
+ <xsl:value-of select="$js"/>
+</xsl:template>
+
+<xsl:template name="ua.js">
+ <!-- Danger Will Robinson: template shadows parameter -->
+ <xsl:param name="language" select="'javascript'"/>
+ <script type="text/javascript" language="{$language}">
+ <xsl:attribute name="src">
+ <xsl:call-template name="script-file">
+ <xsl:with-param name="js" select="$ua.js"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:text> </xsl:text>
+ </script>
+</xsl:template>
+
+<xsl:template name="xbDOM.js">
+ <!-- Danger Will Robinson: template shadows parameter -->
+ <xsl:param name="language" select="'javascript'"/>
+ <script type="text/javascript" language="{$language}">
+ <xsl:attribute name="src">
+ <xsl:call-template name="script-file">
+ <xsl:with-param name="js" select="$xbDOM.js"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:text> </xsl:text>
+ </script>
+</xsl:template>
+
+<xsl:template name="xbStyle.js">
+ <!-- Danger Will Robinson: template shadows parameter -->
+ <xsl:param name="language" select="'javascript'"/>
+ <script type="text/javascript" language="{$language}">
+ <xsl:attribute name="src">
+ <xsl:call-template name="script-file">
+ <xsl:with-param name="js" select="$xbStyle.js"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:text> </xsl:text>
+ </script>
+</xsl:template>
+
+<xsl:template name="xbLibrary.js">
+ <!-- Danger Will Robinson: template shadows parameter -->
+ <xsl:param name="language" select="'javascript'"/>
+ <script type="text/javascript" language="{$language}">
+ <xsl:attribute name="src">
+ <xsl:call-template name="script-file">
+ <xsl:with-param name="js" select="$xbLibrary.js"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:text> </xsl:text>
+ </script>
+</xsl:template>
+
+<xsl:template name="xbCollapsibleLists.js">
+ <!-- Danger Will Robinson: template shadows parameter -->
+ <xsl:param name="language" select="'javascript'"/>
+ <script type="text/javascript" language="{$language}">
+ <xsl:attribute name="src">
+ <xsl:call-template name="script-file">
+ <xsl:with-param name="js" select="$xbCollapsibleLists.js"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:text> </xsl:text>
+ </script>
+</xsl:template>
+
+<xsl:template name="overlay.js">
+ <!-- Danger Will Robinson: template shadows parameter -->
+ <xsl:param name="language" select="'javascript'"/>
+ <script type="text/javascript" language="{$language}">
+ <xsl:attribute name="src">
+ <xsl:call-template name="script-file">
+ <xsl:with-param name="js" select="$overlay.js"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:text> </xsl:text>
+ </script>
+</xsl:template>
+
+<xsl:template name="slides.js">
+ <!-- Danger Will Robinson: template shadows parameter -->
+ <xsl:param name="language" select="'javascript'"/>
+ <script type="text/javascript" language="{$language}">
+ <xsl:attribute name="src">
+ <xsl:call-template name="script-file">
+ <xsl:with-param name="js" select="$slides.js"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:text> </xsl:text>
+ </script>
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/html/param.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/html/param.xml
new file mode 100644
index 0000000..84cf196
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/html/param.xml
@@ -0,0 +1,1376 @@
+<?xml version="1.0" encoding="ASCII"?>
+<book version="5.0" xml:id="slides">
+<info>
+<title>Slides HTML Parameter Reference</title>
+<releaseinfo role="meta">
+$Id: param.xweb 6633 2007-02-21 18:33:33Z xmldoc $
+</releaseinfo>
+<author>
+ <personname>
+ <surname>Walsh</surname>
+ <firstname>Norman</firstname>
+ </personname>
+</author>
+<copyright>
+ <year>2002</year>
+ <holder>Norman Walsh</holder>
+</copyright>
+<abstract>
+ <para>This is reference documentation for all user-configurable
+ parameters in the DocBook XSL Slides HTML stylesheet (for
+ generating HTML slide presentations). Note that the Slides
+ stylesheet for HTML output is a customization layer of the
+ DocBook XSL HTML stylesheet. Therefore, in addition to the
+ slides-specific parameters listed in this section, you can
+ also use a number of <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="../html/">HTML
+ stylesheet parameters</link> to control Slides HTML
+ output.</para>
+</abstract>
+</info>
+<reference xml:id="html">
+<title>HTML: General Parameters</title>
+<refentry version="5.0" xml:id="keyboard.nav">
+<refmeta>
+<refentrytitle>keyboard.nav</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>keyboard.nav</refname>
+<refpurpose>Enable keyboard navigation?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="keyboard.nav.frag">
+&lt;xsl:param name="keyboard.nav" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, JavaScript is added to the slides to enable keyboard
+navigation. Pressing 'n', space, or return moves forward; pressing 'p' moves
+backward.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="css.stylesheet">
+<refmeta>
+<refentrytitle>css.stylesheet</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">uri</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>css.stylesheet</refname>
+<refpurpose>CSS stylesheet for slides</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="css.stylesheet.frag">
+&lt;xsl:param name="css.stylesheet"&gt;slides.css&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Identifies the CSS stylesheet used by all the slides. This parameter
+can be set in the source document with the &lt;?dbhtml?&gt; pseudo-attribute
+<literal>css-stylesheet</literal>.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="css.stylesheet.dir">
+<refmeta>
+<refentrytitle>css.stylesheet.dir</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">uri</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>css.stylesheet.dir</refname>
+<refpurpose>Default directory for CSS stylesheets</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="css.stylesheet.dir.frag">
+&lt;xsl:param name="css.stylesheet.dir"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Identifies the default directory for the CSS stylesheet
+generated on all the slides. This parameter can be set in the source
+document with the &lt;?dbhtml?&gt; pseudo-attribute
+<literal>css-stylesheet-dir</literal>.</para>
+
+<para>If non-empty, this value is prepended to each of the stylesheets.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="titlefoil.html">
+<refmeta>
+<refentrytitle>titlefoil.html</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">filename</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>titlefoil.html</refname>
+<refpurpose>Name of title foil HTML file</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="titlefoil.html.frag">
+&lt;xsl:param name="titlefoil.html" select="concat('index', $html.ext)"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Sets the filename used for the slides titlepage.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="toc.html">
+<refmeta>
+<refentrytitle>toc.html</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">filename</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>toc.html</refname>
+<refpurpose>Name of ToC HTML file</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="toc.html.frag">
+&lt;xsl:param name="toc.html" select="concat('toc', $html.ext)"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Sets the filename used for the table of contents page.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="foilgroup.toc">
+<refmeta>
+<refentrytitle>foilgroup.toc</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>foilgroup.toc</refname>
+<refpurpose>Put ToC on foilgroup pages?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="foilgroup.toc.frag">
+&lt;xsl:param name="foilgroup.toc" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, a ToC will be placed on foilgroup pages (after any
+other content).
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="output.indent">
+<refmeta>
+<refentrytitle>output.indent</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">list</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">no</refmiscinfo>
+<refmiscinfo class="other" otherclass="value">yes</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>output.indent</refname>
+<refpurpose>Indent output?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="output.indent.frag">
+&lt;xsl:param name="output.indent"&gt;no&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies the setting of the <parameter>indent</parameter>
+parameter on the HTML slides. For more information, see the discussion
+of the <tag>xsl:output</tag> element in the XSLT specification.</para>
+<para>Select from <literal>yes</literal> or <literal>no</literal>.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="overlay">
+<refmeta>
+<refentrytitle>overlay</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>overlay</refname>
+<refpurpose>Overlay footer navigation?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="overlay.frag">
+&lt;xsl:param name="overlay" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, JavaScript is added to the slides to make the
+bottom navigation appear at the bottom of each page. This option and
+<link linkend="multiframe">multiframe</link> are mutually exclusive.</para>
+
+<para>If this parameter is zero, the bottom navigation simply appears
+below the content of each slide.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="show.foil.number">
+<refmeta>
+<refentrytitle>show.foil.number</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>show.foil.number</refname>
+<refpurpose>Show foil number on each foil?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="show.foil.number.frag">
+&lt;xsl:param name="show.foil.number" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, on each slide there will be its number. Currently
+not supported in all output formats.</para>
+
+</refsection>
+</refentry>
+
+</reference>
+<reference xml:id="frames">
+<title>HTML: Frames Parameters</title>
+<refentry version="5.0" xml:id="nav.separator">
+<refmeta>
+<refentrytitle>nav.separator</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>nav.separator</refname>
+<refpurpose>Output separator between navigation and body?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="nav.separator.frag">
+&lt;xsl:param name="nav.separator" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, a separator (<literal>&lt;HR&gt;</literal>) is
+added between the navigation links and the content of each slide.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="toc.row.height">
+<refmeta>
+<refentrytitle>toc.row.height</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">length</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>toc.row.height</refname>
+<refpurpose>Height of ToC rows in dynamic ToCs</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="toc.row.height.frag">
+&lt;xsl:param name="toc.row.height"&gt;22&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>This parameter specifies the height of each row in the table of
+contents. This is only applicable if a <link linkend="dynamic.toc">dynamic ToC</link> is used. You may want to
+adjust this parameter for optimal appearance with the font and image
+sizes selected by your <link linkend="css.stylesheet">CSS
+stylesheet</link>.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="toc.bg.color">
+<refmeta>
+<refentrytitle>toc.bg.color</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">color</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>toc.bg.color</refname>
+<refpurpose>Background color for ToC frame</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="toc.bg.color.frag">
+&lt;xsl:param name="toc.bg.color"&gt;#FFFFFF&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies the background color used in the ToC frame.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="body.bg.color">
+<refmeta>
+<refentrytitle>body.bg.color</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">color</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>body.bg.color</refname>
+<refpurpose>Background color for body frame</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="body.bg.color.frag">
+&lt;xsl:param name="body.bg.color"&gt;#FFFFFF&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies the background color used in the body column of
+tabular slides.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="toc.width">
+<refmeta>
+<refentrytitle>toc.width</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">length</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>toc.width</refname>
+<refpurpose>Width of ToC frame</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="toc.width.frag">
+&lt;xsl:param name="toc.width"&gt;250&lt;/xsl:param&gt;
+&lt;!-- Presumably in pixels? --&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies the width of the ToC frame in pixels.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="toc.hide.show">
+<refmeta>
+<refentrytitle>toc.hide.show</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>toc.hide.show</refname>
+<refpurpose>Enable hide/show button for ToC frame</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="toc.hide.show.frag">
+&lt;xsl:param name="toc.hide.show" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, JavaScript (and an additional icon, see
+<link linkend="hidetoc.image">hidetoc.image</link> and
+<link linkend="hidetoc.image">showtoc.image</link>) is added to each slide
+to allow the ToC panel to be <quote>toggled</quote> on each panel.</para>
+
+<note><para>There is a bug in Mozilla 1.0 (at least as of CR3) that causes
+the browser to reload the titlepage when this feature is used.</para></note>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="dynamic.toc">
+<refmeta>
+<refentrytitle>dynamic.toc</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>dynamic.toc</refname>
+<refpurpose>Dynamic ToCs?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="dynamic.toc.frag">
+&lt;xsl:param name="dynamic.toc" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, JavaScript is used to make the ToC panel <quote>dynamic</quote>.
+In a dynamic ToC, each section in the ToC can be expanded and collapsed by
+clicking on the appropriate image.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="active.toc">
+<refmeta>
+<refentrytitle>active.toc</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>active.toc</refname>
+<refpurpose>Active ToCs?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="active.toc.frag">
+&lt;xsl:param name="active.toc" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, JavaScript is used to keep the ToC and the current slide
+<quote>in sync</quote>. That is, each time the slide changes, the corresponding
+ToC entry will be underlined.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="overlay.logo">
+<refmeta>
+<refentrytitle>overlay.logo</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">uri</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>overlay.logo</refname>
+<refpurpose>Logo to overlay on ToC frame</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="overlay.logo.frag">
+&lt;xsl:param name="overlay.logo"&gt;http://docbook.sourceforge.net/release/buttons/slides-1.png&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If this URI is non-empty, JavaScript is used to overlay the
+specified image on the ToC frame.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="multiframe">
+<refmeta>
+<refentrytitle>multiframe</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>multiframe</refname>
+<refpurpose>Use multiple frames for slide bodies?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="multiframe.frag">
+&lt;xsl:param name="multiframe" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>If non-zero, multiple frames are used for the body of each
+slide. This is one way of forcing the slide navigation elements to
+appear in constant locations. The other way is with <link linkend="overlay">overlays</link>. The <link linkend="overlay"><parameter>overlay</parameter></link> and
+<parameter>multiframe</parameter> parameters are mutually
+exclusive.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="multiframe.top.bgcolor">
+<refmeta>
+<refentrytitle>multiframe.top.bgcolor</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">color</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>multiframe.top.bgcolor</refname>
+<refpurpose>Background color for top navigation frame</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="multiframe.top.bgcolor.frag">
+&lt;xsl:param name="multiframe.top.bgcolor"&gt;white&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies the background color of the top navigation frame when
+<link linkend="multiframe">multiframe</link> is enabled.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="multiframe.bottom.bgcolor">
+<refmeta>
+<refentrytitle>multiframe.bottom.bgcolor</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">color</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>multiframe.bottom.bgcolor</refname>
+<refpurpose>Background color for bottom navigation frame</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="multiframe.bottom.bgcolor.frag">
+&lt;xsl:param name="multiframe.bottom.bgcolor"&gt;white&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies the background color of the bottom navigation frame when
+<link linkend="multiframe">multiframe</link> is enabled.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="multiframe.navigation.height">
+<refmeta>
+<refentrytitle>multiframe.navigation.height</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">length</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>multiframe.navigation.height</refname>
+<refpurpose>Height of navigation frames</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="multiframe.navigation.height.frag">
+&lt;xsl:param name="multiframe.navigation.height"&gt;40&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies the height of the navigation frames in pixels when
+<link linkend="multiframe">multiframe</link> is enabled.</para>
+
+</refsection>
+</refentry>
+
+</reference>
+<reference xml:id="graphics">
+<title>HTML: Graphics Parameters</title>
+<refentry version="5.0" xml:id="graphics.dir">
+<refmeta>
+<refentrytitle>graphics.dir</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">uri</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>graphics.dir</refname>
+<refpurpose>Graphics directory</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="graphics.dir.frag">
+&lt;xsl:param name="graphics.dir"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Identifies the graphics directory for the navigation components
+generated on all the slides. This parameter can be set in the source
+document with the &lt;?dbhtml?&gt; pseudo-attribute
+<literal>graphics-dir</literal>.</para>
+
+<para>If non-empty, this value is prepended to each of the graphic
+image paths.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="bullet.image">
+<refmeta>
+<refentrytitle>bullet.image</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">filename</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>bullet.image</refname>
+<refpurpose>Bullet image</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="bullet.image.frag">
+&lt;xsl:param name="bullet.image"&gt;toc/bullet.png&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies the filename of the bullet image used for foils in the
+framed ToC.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="next.image">
+<refmeta>
+<refentrytitle>next.image</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">filename</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>next.image</refname>
+<refpurpose>Right-arrow image</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="next.image.frag">
+&lt;xsl:param name="next.image"&gt;active/nav-next.png&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies the filename of the right-pointing navigation arrow.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="prev.image">
+<refmeta>
+<refentrytitle>prev.image</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">filename</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>prev.image</refname>
+<refpurpose>Left-arrow image</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="prev.image.frag">
+&lt;xsl:param name="prev.image"&gt;active/nav-prev.png&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies the filename of the left-pointing navigation arrow.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="up.image">
+<refmeta>
+<refentrytitle>up.image</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">filename</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>up.image</refname>
+<refpurpose>Up-arrow image</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="up.image.frag">
+&lt;xsl:param name="up.image"&gt;active/nav-up.png&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies the filename of the upward-pointing navigation arrow.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="home.image">
+<refmeta>
+<refentrytitle>home.image</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">filename</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>home.image</refname>
+<refpurpose>Home image</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="home.image.frag">
+&lt;xsl:param name="home.image"&gt;active/nav-home.png&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies the filename of the home navigation icon.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="toc.image">
+<refmeta>
+<refentrytitle>toc.image</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">filename</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>toc.image</refname>
+<refpurpose>ToC image</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="toc.image.frag">
+&lt;xsl:param name="toc.image"&gt;active/nav-toc.png&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies the filename of the ToC navigation icon.</para>
+
+</refsection>
+</refentry>
+
+
+<refentry version="5.0" xml:id="no.next.image">
+<refmeta>
+<refentrytitle>no.next.image</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">filename</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>no.next.image</refname>
+<refpurpose>Inactive right-arrow image</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="no.next.image.frag">
+&lt;xsl:param name="no.next.image"&gt;inactive/nav-next.png&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies the filename of the inactive right-pointing navigation arrow.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="no.prev.image">
+<refmeta>
+<refentrytitle>no.prev.image</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">filename</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>no.prev.image</refname>
+<refpurpose>Inactive left-arrow image</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="no.prev.image.frag">
+&lt;xsl:param name="no.prev.image"&gt;inactive/nav-prev.png&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies the filename of the inactive left-pointing navigation arrow.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="no.up.image">
+<refmeta>
+<refentrytitle>no.up.image</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">filename</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>no.up.image</refname>
+<refpurpose>Inactive up-arrow image</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="no.up.image.frag">
+&lt;xsl:param name="no.up.image"&gt;inactive/nav-up.png&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies the filename of the inactive upward-pointing navigation arrow.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="no.home.image">
+<refmeta>
+<refentrytitle>no.home.image</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">filename</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>no.home.image</refname>
+<refpurpose>Inactive home image</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="no.home.image.frag">
+&lt;xsl:param name="no.home.image"&gt;inactive/nav-home.png&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies the filename of the inactive home navigation icon.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="no.toc.image">
+<refmeta>
+<refentrytitle>no.toc.image</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">filename</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>no.toc.image</refname>
+<refpurpose>Inactive ToC image</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="no.toc.image.frag">
+&lt;xsl:param name="no.toc.image"&gt;inactive/nav-toc.png&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies the filename of the inactive ToC navigation icon.</para>
+
+</refsection>
+</refentry>
+
+
+<refentry version="5.0" xml:id="plus.image">
+<refmeta>
+<refentrytitle>plus.image</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">filename</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>plus.image</refname>
+<refpurpose>Plus image</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="plus.image.frag">
+&lt;xsl:param name="plus.image"&gt;toc/closed.png&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies the filename of the <quote>plus</quote> image; the image used in a
+<link linkend="dynamic.toc">dynamic ToC</link> to indicate that a section
+can be expanded.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="minus.image">
+<refmeta>
+<refentrytitle>minus.image</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">filename</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>minus.image</refname>
+<refpurpose>Minus image</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="minus.image.frag">
+&lt;xsl:param name="minus.image"&gt;toc/open.png&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies the filename of the <quote>minus</quote> image; the image used in a
+<link linkend="dynamic.toc">dynamic ToC</link> to indicate that a section
+can be collapsed.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="hidetoc.image">
+<refmeta>
+<refentrytitle>hidetoc.image</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">filename</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>hidetoc.image</refname>
+<refpurpose>Hide ToC image</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="hidetoc.image.frag">
+&lt;xsl:param name="hidetoc.image"&gt;hidetoc.gif&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies the filename of the <quote>hide ToC</quote> image. This is used
+when the <link linkend="toc.hide.show">ToC hide/show</link> parameter is
+enabled.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="showtoc.image">
+<refmeta>
+<refentrytitle>showtoc.image</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">filename</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>showtoc.image</refname>
+<refpurpose>Show ToC image</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="showtoc.image.frag">
+&lt;xsl:param name="showtoc.image"&gt;showtoc.gif&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies the filename of the <quote>show ToC</quote> image. This is used
+when the <link linkend="toc.hide.show">ToC hide/show</link> parameter is
+enabled.</para>
+
+</refsection>
+</refentry>
+
+</reference>
+<reference xml:id="javascript">
+<title>HTML: JavaScript Parameters</title>
+<refentry version="5.0" xml:id="script.dir">
+<refmeta>
+<refentrytitle>script.dir</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">uri</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>script.dir</refname>
+<refpurpose>Script directory</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="script.dir.frag">
+&lt;xsl:param name="script.dir"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Identifies the JavaScript source directory for the slides.
+This parameter can be set in the source
+document with the &lt;?dbhtml?&gt; pseudo-attribute
+<literal>script-dir</literal>.</para>
+
+<para>If non-empty, this value is prepended to each of the JavaScript files.
+</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="ua.js">
+<refmeta>
+<refentrytitle>ua.js</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">filename</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>ua.js</refname>
+<refpurpose>UA JavaScript file</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="ua.js.frag">
+&lt;xsl:param name="ua.js"&gt;ua.js&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies the filename of the UA JavaScript file. It's unlikely
+that you will ever need to change this parameter.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="xbDOM.js">
+<refmeta>
+<refentrytitle>xbDOM.js</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">filename</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>xbDOM.js</refname>
+<refpurpose>xbDOM JavaScript file</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="xbDOM.js.frag">
+&lt;xsl:param name="xbDOM.js"&gt;xbDOM.js&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies the filename of the xbDOM JavaScript file. It's unlikely
+that you will ever need to change this parameter.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="xbStyle.js">
+<refmeta>
+<refentrytitle>xbStyle.js</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">filename</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>xbStyle.js</refname>
+<refpurpose>xbStyle JavaScript file</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="xbStyle.js.frag">
+&lt;xsl:param name="xbStyle.js"&gt;xbStyle.js&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies the filename of the xbStyle JavaScript file. It's unlikely
+that you will ever need to change this parameter.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="xbLibrary.js">
+<refmeta>
+<refentrytitle>xbLibrary.js</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">filename</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>xbLibrary.js</refname>
+<refpurpose>xbLibrary JavaScript file</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="xbLibrary.js.frag">
+&lt;xsl:param name="xbLibrary.js"&gt;xbLibrary.js&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies the filename of the xbLibrary JavaScript file. It's unlikely
+that you will ever need to change this parameter.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="xbCollapsibleLists.js">
+<refmeta>
+<refentrytitle>xbCollapsibleLists.js</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">filename</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>xbCollapsibleLists.js</refname>
+<refpurpose>xbCollapsibleLists JavaScript file</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="xbCollapsibleLists.js.frag">
+&lt;xsl:param name="xbCollapsibleLists.js"&gt;xbCollapsibleLists.js&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies the filename of the xbCollapsibleLists JavaScript file. It's unlikely
+that you will ever need to change this parameter.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="overlay.js">
+<refmeta>
+<refentrytitle>overlay.js</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">filename</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>overlay.js</refname>
+<refpurpose>Overlay JavaScript file</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="overlay.js.frag">
+&lt;xsl:param name="overlay.js"&gt;overlay.js&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies the filename of the overlay JavaScript file. It's unlikely
+that you will ever need to change this parameter.</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="slides.js">
+<refmeta>
+<refentrytitle>slides.js</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">filename</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>slides.js</refname>
+<refpurpose>Slides overlay file</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="slides.js.frag">
+&lt;xsl:param name="slides.js"&gt;slides.js&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>Specifies the filename of the slides JavaScript file. It's unlikely
+that you will ever need to change this parameter.</para>
+
+</refsection>
+</refentry>
+
+</reference>
+<reference xml:id="l10n">
+<title>HTML: Localization Parameters</title>
+<refentry version="5.0" xml:id="text.home">
+<refmeta>
+<refentrytitle>text.home</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>text.home</refname>
+<refpurpose>Home</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="text.home.frag">
+&lt;xsl:param name="text.home"&gt;Home&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>FIXME:</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="text.toc">
+<refmeta>
+<refentrytitle>text.toc</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>text.toc</refname>
+<refpurpose>FIXME:</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="text.toc.frag">
+&lt;xsl:param name="text.toc"&gt;ToC&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>FIXME:</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="text.prev">
+<refmeta>
+<refentrytitle>text.prev</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>text.prev</refname>
+<refpurpose>FIXME:</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="text.prev.frag">
+&lt;xsl:param name="text.prev"&gt;Prev&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>FIXME:</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="text.up">
+<refmeta>
+<refentrytitle>text.up</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>text.up</refname>
+<refpurpose>FIXME:</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="text.up.frag">
+&lt;xsl:param name="text.up"&gt;Up&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>FIXME:</para>
+
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="text.next">
+<refmeta>
+<refentrytitle>text.next</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>text.next</refname>
+<refpurpose>FIXME:</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="text.next.frag">
+&lt;xsl:param name="text.next"&gt;Next&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>FIXME:</para>
+
+</refsection>
+</refentry>
+
+
+
+</reference>
+<appendix xml:id="styleheet"><title>The Stylesheet</title>
+
+<para>The <filename>param.xsl</filename> stylesheet is just a wrapper
+around all these parameters.</para>
+
+<programlisting xml:id="top">
+
+&lt;!-- This file is generated from param.xweb --&gt;
+
+&lt;xsl:stylesheet exclude-result-prefixes="src" version="1.0"&gt;
+
+&lt;!-- ********************************************************************
+ $Id: param.xweb 6633 2007-02-21 18:33:33Z xmldoc $
+ ********************************************************************
+
+ This file is part of the DocBook Slides Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** --&gt;
+
+&lt;src:fragref linkend="active.toc.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="body.bg.color.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="bullet.image.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="css.stylesheet.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="css.stylesheet.dir.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="dynamic.toc.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="foilgroup.toc.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="graphics.dir.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="hidetoc.image.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="home.image.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="keyboard.nav.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="minus.image.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="multiframe.bottom.bgcolor.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="multiframe.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="multiframe.navigation.height.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="multiframe.top.bgcolor.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="nav.separator.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="next.image.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="no.home.image.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="no.next.image.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="no.prev.image.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="no.toc.image.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="no.up.image.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="output.indent.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="overlay.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="overlay.js.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="overlay.logo.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="plus.image.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="prev.image.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="script.dir.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="show.foil.number.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="showtoc.image.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="slides.js.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="text.home.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="text.next.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="text.prev.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="text.toc.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="text.up.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="titlefoil.html.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="toc.bg.color.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="toc.hide.show.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="toc.html.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="toc.image.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="toc.row.height.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="toc.width.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="ua.js.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="up.image.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="xbCollapsibleLists.js.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="xbDOM.js.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="xbStyle.js.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="xbLibrary.js.frag"&gt;&lt;/src:fragref&gt;
+
+&lt;/xsl:stylesheet&gt;
+</programlisting>
+
+</appendix>
+</book>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/html/param.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/html/param.xsl
new file mode 100644
index 0000000..7dad0bc
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/html/param.xsl
@@ -0,0 +1,68 @@
+<?xml version="1.0" encoding="ASCII"?>
+<!-- This file is generated from param.xweb -->
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
+
+<!-- ********************************************************************
+ $Id: param.xweb 6633 2007-02-21 18:33:33Z xmldoc $
+ ********************************************************************
+
+ This file is part of the DocBook Slides Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<xsl:param name="active.toc" select="0"/>
+<xsl:param name="body.bg.color">#FFFFFF</xsl:param>
+<xsl:param name="bullet.image">toc/bullet.png</xsl:param>
+<xsl:param name="css.stylesheet">slides.css</xsl:param>
+<xsl:param name="css.stylesheet.dir"/>
+<xsl:param name="dynamic.toc" select="0"/>
+<xsl:param name="foilgroup.toc" select="1"/>
+<xsl:param name="graphics.dir"/>
+<xsl:param name="hidetoc.image">hidetoc.gif</xsl:param>
+<xsl:param name="home.image">active/nav-home.png</xsl:param>
+<xsl:param name="keyboard.nav" select="1"/>
+<xsl:param name="minus.image">toc/open.png</xsl:param>
+<xsl:param name="multiframe.bottom.bgcolor">white</xsl:param>
+<xsl:param name="multiframe" select="0"/>
+<xsl:param name="multiframe.navigation.height">40</xsl:param>
+<xsl:param name="multiframe.top.bgcolor">white</xsl:param>
+<xsl:param name="nav.separator" select="1"/>
+<xsl:param name="next.image">active/nav-next.png</xsl:param>
+<xsl:param name="no.home.image">inactive/nav-home.png</xsl:param>
+<xsl:param name="no.next.image">inactive/nav-next.png</xsl:param>
+<xsl:param name="no.prev.image">inactive/nav-prev.png</xsl:param>
+<xsl:param name="no.toc.image">inactive/nav-toc.png</xsl:param>
+<xsl:param name="no.up.image">inactive/nav-up.png</xsl:param>
+<xsl:param name="output.indent">no</xsl:param>
+<xsl:param name="overlay" select="0"/>
+<xsl:param name="overlay.js">overlay.js</xsl:param>
+<xsl:param name="overlay.logo">http://docbook.sourceforge.net/release/buttons/slides-1.png</xsl:param>
+<xsl:param name="plus.image">toc/closed.png</xsl:param>
+<xsl:param name="prev.image">active/nav-prev.png</xsl:param>
+<xsl:param name="script.dir"/>
+<xsl:param name="show.foil.number" select="0"/>
+<xsl:param name="showtoc.image">showtoc.gif</xsl:param>
+<xsl:param name="slides.js">slides.js</xsl:param>
+<xsl:param name="text.home">Home</xsl:param>
+<xsl:param name="text.next">Next</xsl:param>
+<xsl:param name="text.prev">Prev</xsl:param>
+<xsl:param name="text.toc">ToC</xsl:param>
+<xsl:param name="text.up">Up</xsl:param>
+<xsl:param name="titlefoil.html" select="concat('index', $html.ext)"/>
+<xsl:param name="toc.bg.color">#FFFFFF</xsl:param>
+<xsl:param name="toc.hide.show" select="0"/>
+<xsl:param name="toc.html" select="concat('toc', $html.ext)"/>
+<xsl:param name="toc.image">active/nav-toc.png</xsl:param>
+<xsl:param name="toc.row.height">22</xsl:param>
+<xsl:param name="toc.width">250</xsl:param>
+<!-- Presumably in pixels? -->
+<xsl:param name="ua.js">ua.js</xsl:param>
+<xsl:param name="up.image">active/nav-up.png</xsl:param>
+<xsl:param name="xbCollapsibleLists.js">xbCollapsibleLists.js</xsl:param>
+<xsl:param name="xbDOM.js">xbDOM.js</xsl:param>
+<xsl:param name="xbStyle.js">xbStyle.js</xsl:param>
+<xsl:param name="xbLibrary.js">xbLibrary.js</xsl:param>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/html/plain.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/html/plain.xsl
new file mode 100644
index 0000000..47224da
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/html/plain.xsl
@@ -0,0 +1,472 @@
+<?xml version="1.0"?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="1.0">
+
+<xsl:import href="slides-common.xsl"/>
+
+<xsl:param name="prev.image" select="'active/nav-prev.png'"/>
+<xsl:param name="next.image" select="'active/nav-next.png'"/>
+<xsl:param name="up.image" select="'active/nav-up.png'"/>
+<xsl:param name="toc.image" select="'active/nav-toc.png'"/>
+<xsl:param name="home.image" select="'active/nav-home.png'"/>
+
+<xsl:param name="no.prev.image" select="'inactive/nav-prev.png'"/>
+<xsl:param name="no.next.image" select="'inactive/nav-next.png'"/>
+<xsl:param name="no.up.image" select="'inactive/nav-up.png'"/>
+<xsl:param name="no.toc.image" select="'inactive/nav-toc.png'"/>
+<xsl:param name="no.home.image" select="'inactive/nav-home.png'"/>
+
+<xsl:param name="css.stylesheet" select="'slides-plain.css'"/>
+
+<!-- ====================================================================== -->
+
+<xsl:template name="top-nav">
+ <xsl:param name="prev"/>
+ <xsl:param name="next"/>
+ <xsl:param name="up"/>
+ <xsl:param name="home"/>
+ <xsl:param name="toc" select="$toc.html"/>
+
+ <div class="navhead">
+ <table width="100%" border="0" cellpadding="0" cellspacing="0"
+ summary="Navigation">
+ <tr>
+ <td align="left" width="45%">
+ <span class="slidestitle">
+ <xsl:value-of select="(/slides/slidesinfo/title)[1]"/>
+ </span>
+ <xsl:text>&#160;</xsl:text>
+ </td>
+ <td width="10%" align="center" valign="bottom">
+ <xsl:call-template name="foil.number"/>
+ </td>
+ <td align="right" width="45%">
+ <xsl:choose>
+ <xsl:when test="$home">
+ <a>
+ <xsl:attribute name="href">
+ <xsl:apply-templates select="$home" mode="filename"/>
+ </xsl:attribute>
+ <xsl:attribute name="title">
+ <xsl:value-of select="$home/slidesinfo/title"/>
+ </xsl:attribute>
+ <img alt="Home" border="0">
+ <xsl:attribute name="src">
+ <xsl:call-template name="home.image"/>
+ </xsl:attribute>
+ </img>
+ </a>
+ </xsl:when>
+ <xsl:otherwise>
+ <img alt="Home" border="0">
+ <xsl:attribute name="src">
+ <xsl:call-template name="no.home.image"/>
+ </xsl:attribute>
+ </img>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:text>&#160;</xsl:text>
+
+ <xsl:choose>
+ <xsl:when test="$toc != ''">
+ <a title="ToC" href="{$toc}">
+ <img alt="ToC" border="0">
+ <xsl:attribute name="src">
+ <xsl:call-template name="toc.image"/>
+ </xsl:attribute>
+ </img>
+ </a>
+ </xsl:when>
+ <xsl:otherwise>
+ <img alt="ToC" border="0">
+ <xsl:attribute name="src">
+ <xsl:call-template name="no.toc.image"/>
+ </xsl:attribute>
+ </img>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:text>&#160;</xsl:text>
+
+ <xsl:choose>
+ <xsl:when test="$prev">
+ <a>
+ <xsl:attribute name="href">
+ <xsl:apply-templates select="$prev" mode="filename"/>
+ </xsl:attribute>
+ <xsl:attribute name="title">
+ <xsl:value-of select="$prev/title"/>
+ </xsl:attribute>
+ <img alt="Prev" border="0">
+ <xsl:attribute name="src">
+ <xsl:call-template name="prev.image"/>
+ </xsl:attribute>
+ </img>
+ </a>
+ </xsl:when>
+ <xsl:otherwise>
+ <img alt="Prev" border="0">
+ <xsl:attribute name="src">
+ <xsl:call-template name="no.prev.image"/>
+ </xsl:attribute>
+ </img>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:text>&#160;</xsl:text>
+
+ <xsl:choose>
+ <xsl:when test="$up">
+ <a>
+ <xsl:attribute name="href">
+ <xsl:apply-templates select="$up" mode="filename"/>
+ </xsl:attribute>
+ <xsl:attribute name="title">
+ <xsl:value-of select="$up/title"/>
+ </xsl:attribute>
+ <img alt="Up" border="0">
+ <xsl:attribute name="src">
+ <xsl:call-template name="up.image"/>
+ </xsl:attribute>
+ </img>
+ </a>
+ </xsl:when>
+ <xsl:otherwise>
+ <img alt="Up" border="0">
+ <xsl:attribute name="src">
+ <xsl:call-template name="no.up.image"/>
+ </xsl:attribute>
+ </img>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:text>&#160;</xsl:text>
+
+ <xsl:choose>
+ <xsl:when test="$next">
+ <a>
+ <xsl:attribute name="href">
+ <xsl:apply-templates select="$next" mode="filename"/>
+ </xsl:attribute>
+ <xsl:attribute name="title">
+ <xsl:value-of select="$next/title"/>
+ </xsl:attribute>
+ <img alt="Next" border="0">
+ <xsl:attribute name="src">
+ <xsl:call-template name="next.image"/>
+ </xsl:attribute>
+ </img>
+ </a>
+ </xsl:when>
+ <xsl:otherwise>
+ <img alt="Next" border="0">
+ <xsl:attribute name="src">
+ <xsl:call-template name="no.next.image"/>
+ </xsl:attribute>
+ </img>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:text>&#160;</xsl:text>
+ </td>
+ </tr>
+ </table>
+ <hr class="top-nav-sep"/>
+ </div>
+</xsl:template>
+
+<!-- ============================================================ -->
+
+<xsl:template name="titlepage-top-nav">
+ <xsl:param name="home"/>
+ <xsl:param name="up"/>
+ <xsl:param name="prev"/>
+ <xsl:param name="next"/>
+ <xsl:param name="toc" select="$toc.html"/>
+
+ <div class="navhead">
+ <table width="100%" border="0" cellpadding="0" cellspacing="0"
+ summary="Navigation">
+ <tr>
+ <td align="left" width="50%">
+ <xsl:text>&#160;</xsl:text>
+ </td>
+ <td align="right" width="50%">
+ <xsl:choose>
+ <xsl:when test="$home">
+ <a>
+ <xsl:attribute name="href">
+ <xsl:apply-templates select="$home" mode="filename"/>
+ </xsl:attribute>
+ <xsl:attribute name="title">
+ <xsl:value-of select="$home/slidesinfo/title"/>
+ </xsl:attribute>
+ <img alt="Home" border="0">
+ <xsl:attribute name="src">
+ <xsl:call-template name="home.image"/>
+ </xsl:attribute>
+ </img>
+ </a>
+ </xsl:when>
+ <xsl:otherwise>
+ <img alt="Home" border="0">
+ <xsl:attribute name="src">
+ <xsl:call-template name="no.home.image"/>
+ </xsl:attribute>
+ </img>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:text>&#160;</xsl:text>
+
+ <xsl:choose>
+ <xsl:when test="$toc.html != ''">
+ <a title="ToC" href="{$toc.html}">
+ <img alt="ToC" border="0">
+ <xsl:attribute name="src">
+ <xsl:call-template name="toc.image"/>
+ </xsl:attribute>
+ </img>
+ </a>
+ </xsl:when>
+ <xsl:otherwise>
+ <img alt="ToC" border="0">
+ <xsl:attribute name="src">
+ <xsl:call-template name="no.toc.image"/>
+ </xsl:attribute>
+ </img>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:text>&#160;</xsl:text>
+
+ <xsl:choose>
+ <xsl:when test="$prev">
+ <a>
+ <xsl:attribute name="href">
+ <xsl:apply-templates select="$prev" mode="filename"/>
+ </xsl:attribute>
+ <xsl:attribute name="title">
+ <xsl:value-of select="$prev/title"/>
+ </xsl:attribute>
+ <img alt="Prev" border="0">
+ <xsl:attribute name="src">
+ <xsl:call-template name="prev.image"/>
+ </xsl:attribute>
+ </img>
+ </a>
+ </xsl:when>
+ <xsl:otherwise>
+ <img alt="Prev" border="0">
+ <xsl:attribute name="src">
+ <xsl:call-template name="no.prev.image"/>
+ </xsl:attribute>
+ </img>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:text>&#160;</xsl:text>
+
+ <xsl:choose>
+ <xsl:when test="$up">
+ <a>
+ <xsl:attribute name="href">
+ <xsl:apply-templates select="$up" mode="filename"/>
+ </xsl:attribute>
+ <xsl:attribute name="title">
+ <xsl:value-of select="$up/title"/>
+ </xsl:attribute>
+ <img alt="Up" border="0">
+ <xsl:attribute name="src">
+ <xsl:call-template name="up.image"/>
+ </xsl:attribute>
+ </img>
+ </a>
+ </xsl:when>
+ <xsl:otherwise>
+ <img alt="Up" border="0">
+ <xsl:attribute name="src">
+ <xsl:call-template name="no.up.image"/>
+ </xsl:attribute>
+ </img>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:text>&#160;</xsl:text>
+
+ <xsl:choose>
+ <xsl:when test="$next">
+ <a>
+ <xsl:attribute name="href">
+ <xsl:apply-templates select="$next" mode="filename"/>
+ </xsl:attribute>
+ <xsl:attribute name="title">
+ <xsl:value-of select="$next/title"/>
+ </xsl:attribute>
+ <img alt="Next" border="0">
+ <xsl:attribute name="src">
+ <xsl:call-template name="next.image"/>
+ </xsl:attribute>
+ </img>
+ </a>
+ </xsl:when>
+ <xsl:otherwise>
+ <img alt="Next" border="0">
+ <xsl:attribute name="src">
+ <xsl:call-template name="no.next.image"/>
+ </xsl:attribute>
+ </img>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:text>&#160;</xsl:text>
+ </td>
+ </tr>
+ </table>
+ <hr class="top-nav-sep"/>
+ </div>
+</xsl:template>
+
+<!-- ============================================================ -->
+
+<xsl:template name="toc-top-nav">
+ <xsl:param name="home" select="/slides"/>
+ <xsl:param name="up"/>
+ <xsl:param name="prev"/>
+ <xsl:param name="next" select="(foil|foilgroup)[1]"/>
+ <xsl:param name="toc"/>
+
+ <div class="navhead">
+ <table width="100%" border="0" cellpadding="0" cellspacing="0"
+ summary="Navigation">
+ <tr>
+ <td align="left" width="50%">
+ <xsl:text>&#160;</xsl:text>
+ </td>
+ <td align="right" width="50%">
+ <xsl:choose>
+ <xsl:when test="$home">
+ <a>
+ <xsl:attribute name="href">
+ <xsl:apply-templates select="$home" mode="filename"/>
+ </xsl:attribute>
+ <xsl:attribute name="title">
+ <xsl:value-of select="$home/slidesinfo/title"/>
+ </xsl:attribute>
+ <img alt="Home" border="0">
+ <xsl:attribute name="src">
+ <xsl:call-template name="home.image"/>
+ </xsl:attribute>
+ </img>
+ </a>
+ </xsl:when>
+ <xsl:otherwise>
+ <img alt="Home" border="0">
+ <xsl:attribute name="src">
+ <xsl:call-template name="no.home.image"/>
+ </xsl:attribute>
+ </img>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:text>&#160;</xsl:text>
+
+ <xsl:choose>
+ <xsl:when test="$toc != ''">
+ <a title="ToC" href="{$toc}">
+ <img alt="ToC" border="0">
+ <xsl:attribute name="src">
+ <xsl:call-template name="toc.image"/>
+ </xsl:attribute>
+ </img>
+ </a>
+ </xsl:when>
+ <xsl:otherwise>
+ <img alt="ToC" border="0">
+ <xsl:attribute name="src">
+ <xsl:call-template name="no.toc.image"/>
+ </xsl:attribute>
+ </img>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:text>&#160;</xsl:text>
+
+ <xsl:choose>
+ <xsl:when test="$prev">
+ <a>
+ <xsl:attribute name="href">
+ <xsl:apply-templates select="$prev" mode="filename"/>
+ </xsl:attribute>
+ <xsl:attribute name="title">
+ <xsl:value-of select="$prev/title"/>
+ </xsl:attribute>
+ <img alt="Prev" border="0">
+ <xsl:attribute name="src">
+ <xsl:call-template name="prev.image"/>
+ </xsl:attribute>
+ </img>
+ </a>
+ </xsl:when>
+ <xsl:otherwise>
+ <img alt="Prev" border="0">
+ <xsl:attribute name="src">
+ <xsl:call-template name="no.prev.image"/>
+ </xsl:attribute>
+ </img>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:text>&#160;</xsl:text>
+
+ <xsl:choose>
+ <xsl:when test="$up">
+ <a>
+ <xsl:attribute name="href">
+ <xsl:apply-templates select="$up" mode="filename"/>
+ </xsl:attribute>
+ <xsl:attribute name="title">
+ <xsl:value-of select="$up/title"/>
+ </xsl:attribute>
+ <img alt="Up" border="0">
+ <xsl:attribute name="src">
+ <xsl:call-template name="up.image"/>
+ </xsl:attribute>
+ </img>
+ </a>
+ </xsl:when>
+ <xsl:otherwise>
+ <img alt="Up" border="0">
+ <xsl:attribute name="src">
+ <xsl:call-template name="no.up.image"/>
+ </xsl:attribute>
+ </img>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:text>&#160;</xsl:text>
+
+ <xsl:choose>
+ <xsl:when test="$next">
+ <a>
+ <xsl:attribute name="href">
+ <xsl:apply-templates select="$next" mode="filename"/>
+ </xsl:attribute>
+ <xsl:attribute name="title">
+ <xsl:value-of select="$next/title"/>
+ </xsl:attribute>
+ <img alt="Next" border="0">
+ <xsl:attribute name="src">
+ <xsl:call-template name="next.image"/>
+ </xsl:attribute>
+ </img>
+ </a>
+ </xsl:when>
+ <xsl:otherwise>
+ <img alt="Next" border="0">
+ <xsl:attribute name="src">
+ <xsl:call-template name="no.next.image"/>
+ </xsl:attribute>
+ </img>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:text>&#160;</xsl:text>
+ </td>
+ </tr>
+ </table>
+ <hr class="top-nav-sep"/>
+ </div>
+</xsl:template>
+
+<!-- ====================================================================== -->
+
+<xsl:template name="bottom-nav"/>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/html/slides-common.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/html/slides-common.xsl
new file mode 100644
index 0000000..9854164
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/html/slides-common.xsl
@@ -0,0 +1,1541 @@
+<?xml version='1.0'?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="1.0">
+
+<xsl:import href="../../html/chunk.xsl"/>
+<xsl:include href="../../VERSION"/>
+
+<xsl:include href="param.xsl"/>
+<xsl:include href="jscript.xsl"/>
+<xsl:include href="graphics.xsl"/>
+<xsl:include href="css.xsl"/>
+
+<xsl:output method="html"/>
+
+<xsl:strip-space elements="slides foil foilgroup"/>
+
+<!-- Process the slides -->
+
+<xsl:template match="/">
+ <xsl:apply-templates/>
+</xsl:template>
+
+<xsl:template match="slides">
+ <xsl:apply-templates select="." mode="toc"/>
+ <xsl:apply-templates/>
+</xsl:template>
+
+<!-- ====================================================================== -->
+<!-- Every slide has top and bottom navigation -->
+
+<xsl:template name="top-nav">
+ <xsl:param name="home"/>
+ <xsl:param name="up"/>
+ <xsl:param name="next"/>
+ <xsl:param name="prev"/>
+ <xsl:param name="tocfile" select="$toc.html"/>
+
+ <div class="navhead">
+ <table border="0" width="100%" cellspacing="0" cellpadding="0"
+ summary="Navigation table">
+ <tr>
+ <td align="left" valign="bottom">
+ <xsl:if test="$home">
+ <span class="slidestitle">
+ <a>
+ <xsl:attribute name="href">
+ <xsl:apply-templates select="$home" mode="filename"/>
+ </xsl:attribute>
+ <xsl:value-of select="($home/title|$home/slidesinfo/title)[1]"/>
+ </a>
+ </span>
+ </xsl:if>
+ <xsl:text>&#160;</xsl:text>
+ </td>
+
+ <td align="right" valign="bottom">
+ <xsl:choose>
+ <xsl:when test="$home">
+ <span class="link-text">
+ <a>
+ <xsl:attribute name="href">
+ <xsl:apply-templates select="$home" mode="filename"/>
+ </xsl:attribute>
+ <img alt="{$text.home}" border="0">
+ <xsl:attribute name="src">
+ <xsl:call-template name="home.image"/>
+ </xsl:attribute>
+ </img>
+ </a>
+ </span>
+ </xsl:when>
+ <xsl:otherwise>
+ <span class="no-link-text">
+ <img alt="{$text.home}" border="0">
+ <xsl:attribute name="src">
+ <xsl:call-template name="no.home.image"/>
+ </xsl:attribute>
+ </img>
+ </span>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:text>&#160;</xsl:text>
+
+ <xsl:choose>
+ <xsl:when test="$tocfile">
+ <span class="link-text">
+ <a>
+ <xsl:attribute name="href">
+ <xsl:value-of select="$tocfile"/>
+ </xsl:attribute>
+ <img alt="{$text.toc}" border="0">
+ <xsl:attribute name="src">
+ <xsl:call-template name="toc.image"/>
+ </xsl:attribute>
+ </img>
+ </a>
+ </span>
+ </xsl:when>
+ <xsl:otherwise>
+ <span class="no-link-text">
+ <img alt="{$text.toc}" border="0">
+ <xsl:attribute name="src">
+ <xsl:call-template name="no.toc.image"/>
+ </xsl:attribute>
+ </img>
+ </span>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:text>&#160;</xsl:text>
+
+ <xsl:choose>
+ <xsl:when test="$prev">
+ <span class="link-text">
+ <a>
+ <xsl:attribute name="href">
+ <xsl:apply-templates select="$prev" mode="filename"/>
+ </xsl:attribute>
+ <img alt="{$text.prev}" border="0">
+ <xsl:attribute name="src">
+ <xsl:call-template name="prev.image"/>
+ </xsl:attribute>
+ </img>
+ </a>
+ </span>
+ </xsl:when>
+ <xsl:otherwise>
+ <span class="no-link-text">
+ <img alt="{$text.prev}" border="0">
+ <xsl:attribute name="src">
+ <xsl:call-template name="no.prev.image"/>
+ </xsl:attribute>
+ </img>
+ </span>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:text>&#160;</xsl:text>
+
+ <xsl:choose>
+ <xsl:when test="$up">
+ <span class="link-text">
+ <a>
+ <xsl:attribute name="href">
+ <xsl:apply-templates select="$up" mode="filename"/>
+ </xsl:attribute>
+ <img alt="{$text.up}" border="0">
+ <xsl:attribute name="src">
+ <xsl:call-template name="up.image"/>
+ </xsl:attribute>
+ </img>
+ </a>
+ </span>
+ </xsl:when>
+ <xsl:otherwise>
+ <span class="no-link-text">
+ <img alt="{$text.up}" border="0">
+ <xsl:attribute name="src">
+ <xsl:call-template name="no.up.image"/>
+ </xsl:attribute>
+ </img>
+ </span>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:text>&#160;</xsl:text>
+
+ <xsl:choose>
+ <xsl:when test="$next">
+ <span class="link-text">
+ <a>
+ <xsl:attribute name="href">
+ <xsl:apply-templates select="$next" mode="filename"/>
+ </xsl:attribute>
+ <img alt="{$text.next}" border="0">
+ <xsl:attribute name="src">
+ <xsl:call-template name="next.image"/>
+ </xsl:attribute>
+ </img>
+ </a>
+ </span>
+ </xsl:when>
+ <xsl:otherwise>
+ <span class="no-link-text">
+ <img alt="{$text.next}" border="0">
+ <xsl:attribute name="src">
+ <xsl:call-template name="no.next.image"/>
+ </xsl:attribute>
+ </img>
+ </span>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:text>&#160;</xsl:text>
+ </td>
+ </tr>
+ </table>
+ <hr class="top-nav-sep"/>
+ </div>
+</xsl:template>
+
+<xsl:template name="bottom-nav">
+ <xsl:param name="home"/>
+ <xsl:param name="up"/>
+ <xsl:param name="next"/>
+ <xsl:param name="prev"/>
+ <xsl:param name="tocfile" select="$toc.html"/>
+
+ <div class="navfoot">
+ <hr class="bottom-nav-sep"/>
+ <table border="0" width="100%" cellspacing="0" cellpadding="0"
+ summary="Navigation table">
+ <tr>
+ <td align="left" valign="top">
+ <xsl:apply-templates select="/slides/slidesinfo/copyright"
+ mode="slide.footer.mode"/>
+ <xsl:text>&#160;</xsl:text>
+ </td>
+
+ <td align="right" valign="top">
+ <xsl:choose>
+ <xsl:when test="$prev">
+ <span class="link-text">
+ <a>
+ <xsl:attribute name="href">
+ <xsl:apply-templates select="$prev" mode="filename"/>
+ </xsl:attribute>
+ <img alt="{$text.prev}" border="0">
+ <xsl:attribute name="src">
+ <xsl:call-template name="prev.image"/>
+ </xsl:attribute>
+ </img>
+ </a>
+ </span>
+ </xsl:when>
+ <xsl:otherwise>
+ <span class="no-link-text">
+ <img alt="{$text.prev}" border="0">
+ <xsl:attribute name="src">
+ <xsl:call-template name="no.prev.image"/>
+ </xsl:attribute>
+ </img>
+ </span>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:text>&#160;</xsl:text>
+
+ <xsl:choose>
+ <xsl:when test="$next">
+ <span class="link-text">
+ <a>
+ <xsl:attribute name="href">
+ <xsl:apply-templates select="$next" mode="filename"/>
+ </xsl:attribute>
+ <img alt="{$text.next}" border="0">
+ <xsl:attribute name="src">
+ <xsl:call-template name="next.image"/>
+ </xsl:attribute>
+ </img>
+ </a>
+ </span>
+ </xsl:when>
+ <xsl:otherwise>
+ <span class="no-link-text">
+ <img alt="{$text.next}" border="0">
+ <xsl:attribute name="src">
+ <xsl:call-template name="no.next.image"/>
+ </xsl:attribute>
+ </img>
+ </span>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:text>&#160;</xsl:text>
+ </td>
+ </tr>
+ </table>
+ </div>
+</xsl:template>
+
+<!-- Navigation is also provided in the form of links in the head -->
+
+<xsl:template name="links">
+ <xsl:param name="home"/>
+ <xsl:param name="up"/>
+ <xsl:param name="next"/>
+ <xsl:param name="prev"/>
+ <xsl:param name="tocfile" select="$toc.html"/>
+
+ <xsl:if test="$tocfile != ''">
+ <link rel="contents" href="{$tocfile}">
+ <xsl:attribute name="title">
+ <xsl:value-of select="/slides/slidesinfo/title"/>
+ </xsl:attribute>
+ </link>
+ </xsl:if>
+
+ <xsl:if test="$home">
+ <link rel="top">
+ <xsl:attribute name="href">
+ <xsl:apply-templates select="$home" mode="filename"/>
+ </xsl:attribute>
+ <xsl:attribute name="title">
+ <xsl:value-of select="($home/title|$home/slidesinfo/title)[1]"/>
+ </xsl:attribute>
+ </link>
+
+ <link rel="first">
+ <xsl:attribute name="href">
+ <xsl:apply-templates select="$home" mode="filename"/>
+ </xsl:attribute>
+ <xsl:attribute name="title">
+ <xsl:value-of select="($home/title|$home/slidesinfo/title)[1]"/>
+ </xsl:attribute>
+ </link>
+ </xsl:if>
+
+ <xsl:if test="$up">
+ <link rel="up">
+ <xsl:attribute name="href">
+ <xsl:apply-templates select="$up" mode="filename"/>
+ </xsl:attribute>
+ <xsl:attribute name="title">
+ <xsl:value-of select="($up/title|$up/slidesinfo/title)[1]"/>
+ </xsl:attribute>
+ </link>
+ </xsl:if>
+
+ <xsl:if test="$prev">
+ <link rel="previous">
+ <xsl:attribute name="href">
+ <xsl:apply-templates select="$prev" mode="filename"/>
+ </xsl:attribute>
+ <xsl:attribute name="title">
+ <xsl:value-of select="($prev/title|$prev/slidesinfo/title)[1]"/>
+ </xsl:attribute>
+ </link>
+ </xsl:if>
+
+ <xsl:if test="$next">
+ <link rel="next">
+ <xsl:attribute name="href">
+ <xsl:apply-templates select="$next" mode="filename"/>
+ </xsl:attribute>
+ <xsl:attribute name="title">
+ <xsl:value-of select="$next/title"/>
+ </xsl:attribute>
+ </link>
+
+ <xsl:variable name="last" select="$next/following::foil[last()]"/>
+ <xsl:if test="$last">
+ <link rel="last">
+ <xsl:attribute name="href">
+ <xsl:apply-templates select="$last" mode="filename"/>
+ </xsl:attribute>
+ <xsl:attribute name="title">
+ <xsl:value-of select="$last/title"/>
+ </xsl:attribute>
+ </link>
+ </xsl:if>
+ </xsl:if>
+
+ <xsl:for-each select="foil">
+ <link rel="slides">
+ <xsl:attribute name="href">
+ <xsl:apply-templates select="." mode="filename"/>
+ </xsl:attribute>
+ <xsl:attribute name="title">
+ <xsl:value-of select="title[1]"/>
+ </xsl:attribute>
+ </link>
+ </xsl:for-each>
+
+ <xsl:for-each select="foilgroup|../foilgroup">
+ <link rel="section">
+ <xsl:attribute name="href">
+ <xsl:apply-templates select="." mode="filename"/>
+ </xsl:attribute>
+ <xsl:attribute name="title">
+ <xsl:value-of select="title[1]"/>
+ </xsl:attribute>
+ </link>
+ </xsl:for-each>
+</xsl:template>
+
+<!-- ====================================================================== -->
+<!-- There are four kinds of slides: titlepage, toc, foil, and foilgroup -->
+<!-- titlepage -->
+
+<xsl:template match="slidesinfo">
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+
+ <xsl:variable name="next" select="(/slides/foil|/slides/foilgroup)[1]"/>
+ <xsl:variable name="tocfile" select="$toc.html"/>
+ <xsl:variable name="dir">
+ <xsl:call-template name="dbhtml-dir"/>
+ </xsl:variable>
+
+
+ <xsl:call-template name="write.chunk">
+ <xsl:with-param name="indent" select="$output.indent"/>
+ <xsl:with-param name="filename" select="concat($base.dir, $dir, $titlefoil.html)"/>
+ <xsl:with-param name="content">
+ <html>
+ <head>
+ <title><xsl:value-of select="title"/></title>
+
+ <xsl:call-template name="system.head.content">
+ <xsl:with-param name="node" select=".."/>
+ </xsl:call-template>
+
+ <meta name="generator" content="DocBook Slides Stylesheets V{$VERSION}"/>
+
+ <!-- Links -->
+ <xsl:if test="$css.stylesheet != ''">
+ <link type="text/css" rel="stylesheet">
+ <xsl:attribute name="href">
+ <xsl:call-template name="css.stylesheet"/>
+ </xsl:attribute>
+ </link>
+ </xsl:if>
+ <xsl:apply-templates select="/processing-instruction('dbhtml')" mode="css.pi"/>
+
+ <xsl:call-template name="links">
+ <xsl:with-param name="home" select="/slides"/>
+ <xsl:with-param name="next" select="$next"/>
+ <xsl:with-param name="tocfile" select="$tocfile"/>
+ </xsl:call-template>
+
+ <!-- Scripts -->
+
+ <xsl:if test="$overlay != 0 or $keyboard.nav != 0">
+ <script language="javascript" type="text/javascript">
+ <xsl:text> </xsl:text>
+ </script>
+ </xsl:if>
+
+ <xsl:if test="$keyboard.nav != 0">
+ <xsl:call-template name="ua.js"/>
+ <xsl:call-template name="xbDOM.js">
+ <xsl:with-param name="language" select="'javascript'"/>
+ </xsl:call-template>
+ <xsl:call-template name="xbLibrary.js"/>
+ <script language="javascript" type="text/javascript">
+ <xsl:text disable-output-escaping="yes">
+ &lt;!--
+ xblibrary = new xbLibrary('</xsl:text>
+ <xsl:call-template name="script-dir"/>
+ <xsl:text disable-output-escaping="yes">');
+ // --&gt;
+ </xsl:text>
+ </script>
+ <xsl:call-template name="xbStyle.js"/>
+ <xsl:call-template name="xbCollapsibleLists.js"/>
+ <xsl:call-template name="slides.js">
+ <xsl:with-param name="language" select="'javascript'"/>
+ </xsl:call-template>
+ </xsl:if>
+
+ <xsl:if test="$overlay != '0'">
+ <xsl:call-template name="overlay.js">
+ <xsl:with-param name="language" select="'javascript'"/>
+ </xsl:call-template>
+ </xsl:if>
+
+ <xsl:call-template name="user.head.content">
+ <xsl:with-param name="node" select=".."/>
+ </xsl:call-template>
+ </head>
+ <body>
+ <xsl:attribute name="class">
+ <xsl:text>titlepage</xsl:text>
+ <xsl:if test="@role">
+ <xsl:text>-</xsl:text>
+ <xsl:value-of select="@role"/>
+ </xsl:if>
+ </xsl:attribute>
+
+ <xsl:call-template name="body.attributes"/>
+ <xsl:if test="$overlay != 0">
+ <xsl:attribute name="onload">
+ <xsl:text>overlaySetup('lc')</xsl:text>
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:if test="$keyboard.nav != 0">
+ <xsl:attribute name="onkeypress">
+ <xsl:text>navigate(event)</xsl:text>
+ </xsl:attribute>
+ </xsl:if>
+
+ <div class="titlepage" id="{$id}">
+ <xsl:call-template name="titlepage-top-nav">
+ <xsl:with-param name="next" select="$next"/>
+ <xsl:with-param name="tocfile" select="$tocfile"/>
+ </xsl:call-template>
+
+ <div class="titlepage-body">
+ <xsl:call-template name="titlepage-body"/>
+ </div>
+
+ <div id="overlayDiv">
+ <xsl:call-template name="overlayDiv.attributes"/>
+ <xsl:call-template name="titlepage-bottom-nav">
+ <xsl:with-param name="next" select="$next"/>
+ <xsl:with-param name="tocfile" select="$tocfile"/>
+ </xsl:call-template>
+ </div>
+ </div>
+ </body>
+ </html>
+ </xsl:with-param>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template name="titlepage-body">
+ <div class="{name(.)}">
+ <xsl:apply-templates mode="titlepage.mode"/>
+ </div>
+</xsl:template>
+
+<xsl:template name="titlepage-top-nav">
+ <xsl:param name="home"/>
+ <xsl:param name="up"/>
+ <xsl:param name="next"/>
+ <xsl:param name="prev"/>
+ <xsl:param name="tocfile" select="$toc.html"/>
+
+ <xsl:call-template name="top-nav">
+ <xsl:with-param name="home" select="$home"/>
+ <xsl:with-param name="up" select="$up"/>
+ <xsl:with-param name="next" select="$next"/>
+ <xsl:with-param name="prev" select="$prev"/>
+ <xsl:with-param name="tocfile" select="$tocfile"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template name="titlepage-bottom-nav">
+ <xsl:param name="home"/>
+ <xsl:param name="up"/>
+ <xsl:param name="next"/>
+ <xsl:param name="prev"/>
+ <xsl:param name="tocfile" select="$toc.html"/>
+
+ <xsl:call-template name="bottom-nav">
+ <xsl:with-param name="home" select="$home"/>
+ <xsl:with-param name="up" select="$up"/>
+ <xsl:with-param name="next" select="$next"/>
+ <xsl:with-param name="prev" select="$prev"/>
+ <xsl:with-param name="tocfile" select="$tocfile"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="slidesinfo/title">
+ <h1 class="{name(.)}"><xsl:apply-templates/></h1>
+</xsl:template>
+
+<xsl:template match="slidesinfo/authorgroup">
+ <xsl:apply-templates/>
+</xsl:template>
+
+<xsl:template match="slidesinfo/author|slidesinfo/authorgroup/author">
+ <h1 class="{name(.)}"><xsl:apply-imports/></h1>
+</xsl:template>
+
+<xsl:template match="slidesinfo/releaseinfo">
+ <h4 class="{name(.)}"><xsl:apply-templates/></h4>
+</xsl:template>
+
+<xsl:template match="slidesinfo/date">
+ <h4 class="{name(.)}"><xsl:apply-templates/></h4>
+</xsl:template>
+
+<xsl:template match="slidesinfo/copyright">
+ <!-- nop -->
+</xsl:template>
+
+<!-- On slides, output the credits explicitly each time -->
+<xsl:template match="othercredit" mode="titlepage.mode">
+ <xsl:variable name="contrib" select="string(contrib)"/>
+ <xsl:choose>
+ <xsl:when test="contrib">
+ <xsl:call-template name="paragraph">
+ <xsl:with-param name="class" select="name(.)"/>
+ <xsl:with-param name="content">
+ <xsl:apply-templates mode="titlepage.mode" select="contrib"/>
+ <xsl:text>: </xsl:text>
+ <xsl:call-template name="person.name"/>
+ <xsl:apply-templates mode="titlepage.mode" select="./affiliation"/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="paragraph">
+ <xsl:with-param name="class" select="name(.)"/>
+ <xsl:with-param name="content">
+ <xsl:call-template name="person.name"/>
+ </xsl:with-param>
+ </xsl:call-template>
+ <xsl:apply-templates mode="titlepage.mode" select="./affiliation"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ====================================================================== -->
+<!-- toc -->
+
+<xsl:template match="slides" mode="toc">
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+
+ <xsl:variable name="home" select="/slides"/>
+ <xsl:variable name="up" select="/slides"/>
+ <xsl:variable name="next" select="(foil|foilgroup)[1]"/>
+ <xsl:variable name="tocfile" select="''"/>
+ <xsl:variable name="dir"> <!-- MJ: added -->
+ <xsl:call-template name="dbhtml-dir"/>
+ </xsl:variable>
+
+ <xsl:call-template name="write.chunk">
+ <xsl:with-param name="indent" select="$output.indent"/>
+ <xsl:with-param name="filename" select="concat($base.dir, $dir, $toc.html)"/>
+ <xsl:with-param name="content">
+ <html>
+ <head>
+ <title><xsl:value-of select="slidesinfo/title"/></title>
+
+ <xsl:call-template name="system.head.content"/>
+
+ <meta name="generator" content="DocBook Slides Stylesheets V{$VERSION}"/>
+
+ <!-- Links -->
+ <xsl:if test="$css.stylesheet != ''">
+ <link type="text/css" rel="stylesheet">
+ <xsl:attribute name="href">
+ <xsl:call-template name="css.stylesheet"/>
+ </xsl:attribute>
+ </link>
+ </xsl:if>
+ <xsl:apply-templates select="/processing-instruction('dbhtml')" mode="css.pi"/>
+
+ <xsl:call-template name="links">
+ <xsl:with-param name="home" select="$home"/>
+ <xsl:with-param name="up" select="$up"/>
+ <xsl:with-param name="next" select="$next"/>
+ <xsl:with-param name="tocfile" select="$tocfile"/>
+ </xsl:call-template>
+
+ <!-- Scripts -->
+
+ <xsl:if test="$overlay != 0 or $keyboard.nav != 0">
+ <script language="javascript" type="text/javascript">
+ <xsl:text> </xsl:text>
+ </script>
+ </xsl:if>
+
+ <xsl:if test="$keyboard.nav != 0">
+ <xsl:call-template name="ua.js"/>
+ <xsl:call-template name="xbDOM.js">
+ <xsl:with-param name="language" select="'javascript'"/>
+ </xsl:call-template>
+ <xsl:call-template name="xbLibrary.js"/>
+ <script language="javascript" type="text/javascript">
+ <xsl:text disable-output-escaping="yes">
+ &lt;!--
+ xblibrary = new xbLibrary('</xsl:text>
+ <xsl:call-template name="script-dir"/>
+ <xsl:text disable-output-escaping="yes">');
+ // --&gt;
+ </xsl:text>
+ </script>
+ <xsl:call-template name="xbStyle.js"/>
+ <xsl:call-template name="xbCollapsibleLists.js"/>
+ <xsl:call-template name="slides.js">
+ <xsl:with-param name="language" select="'javascript'"/>
+ </xsl:call-template>
+ </xsl:if>
+
+ <xsl:if test="$overlay != '0'">
+ <xsl:call-template name="overlay.js">
+ <xsl:with-param name="language" select="'javascript'"/>
+ </xsl:call-template>
+ </xsl:if>
+
+ <xsl:call-template name="user.head.content"/>
+ </head>
+
+ <body class="tocpage">
+ <xsl:call-template name="body.attributes"/>
+ <xsl:if test="$overlay != 0">
+ <xsl:attribute name="onload">
+ <xsl:text>overlaySetup('lc')</xsl:text>
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:if test="$keyboard.nav != 0">
+ <xsl:attribute name="onkeypress">
+ <xsl:text>navigate(event)</xsl:text>
+ </xsl:attribute>
+ </xsl:if>
+
+ <div id="{$id}">
+ <xsl:call-template name="toc-top-nav">
+ <xsl:with-param name="home" select="$home"/>
+ <xsl:with-param name="up" select="$up"/>
+ <xsl:with-param name="next" select="$next"/>
+ <xsl:with-param name="tocfile" select="$tocfile"/>
+ </xsl:call-template>
+
+ <div class="toc-body">
+ <xsl:call-template name="toc-body"/>
+ </div>
+
+ <div id="overlayDiv">
+ <xsl:call-template name="overlayDiv.attributes"/>
+ <xsl:call-template name="toc-bottom-nav">
+ <xsl:with-param name="home" select="$home"/>
+ <xsl:with-param name="up" select="$up"/>
+ <xsl:with-param name="next" select="$next"/>
+ <xsl:with-param name="tocfile" select="$tocfile"/>
+ </xsl:call-template>
+ </div>
+ </div>
+ </body>
+ </html>
+ </xsl:with-param>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template name="toc-body">
+ <h1 class="title">
+ <a href="{$titlefoil.html}">
+ <xsl:value-of select="/slides/slidesinfo/title"/>
+ </a>
+ </h1>
+
+ <p class="toctitle">
+ <b>
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key">TableofContents</xsl:with-param>
+ </xsl:call-template>
+ </b>
+ </p>
+ <dl class="toc">
+ <xsl:apply-templates select="foilgroup|foil" mode="toc"/>
+ </dl>
+</xsl:template>
+
+<xsl:template name="toc-top-nav">
+ <xsl:param name="home" select="/slides"/>
+ <xsl:param name="up"/>
+ <xsl:param name="prev"/>
+ <xsl:param name="next" select="(foil|foilgroup)[1]"/>
+ <xsl:param name="tocfile"/>
+
+ <xsl:call-template name="top-nav">
+ <xsl:with-param name="home" select="$home"/>
+ <xsl:with-param name="up" select="$up"/>
+ <xsl:with-param name="next" select="$next"/>
+ <xsl:with-param name="prev" select="$prev"/>
+ <xsl:with-param name="tocfile" select="$tocfile"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template name="toc-bottom-nav">
+ <xsl:param name="home" select="/slides"/>
+ <xsl:param name="up"/>
+ <xsl:param name="prev"/>
+ <xsl:param name="next" select="(foil|foilgroup)[1]"/>
+ <xsl:param name="tocfile"/>
+
+ <xsl:call-template name="bottom-nav">
+ <xsl:with-param name="home" select="$home"/>
+ <xsl:with-param name="up" select="$up"/>
+ <xsl:with-param name="next" select="$next"/>
+ <xsl:with-param name="prev" select="$prev"/>
+ <xsl:with-param name="tocfile" select="$tocfile"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="foilgroup" mode="toc">
+ <xsl:param name="recursive" select="1"/>
+
+ <dt>
+ <xsl:apply-templates select="." mode="number"/>
+ <xsl:text>. </xsl:text>
+ <a>
+ <xsl:attribute name="href">
+ <xsl:apply-templates select="." mode="filename"/>
+ </xsl:attribute>
+ <xsl:value-of select="title"/>
+ </a>
+ </dt>
+ <xsl:if test="$recursive != 0">
+ <dd>
+ <dl class="toc">
+ <xsl:apply-templates select="foil" mode="toc"/>
+ </dl>
+ </dd>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="foil" mode="toc">
+ <dt>
+ <xsl:apply-templates select="." mode="number"/>
+ <xsl:text>. </xsl:text>
+ <a>
+ <xsl:attribute name="href">
+ <xsl:apply-templates select="." mode="filename"/>
+ </xsl:attribute>
+ <xsl:value-of select="title"/>
+ </a>
+ </dt>
+</xsl:template>
+
+<xsl:template match="title|titleabbrev" mode="toc">
+ <xsl:apply-templates mode="toc"/>
+</xsl:template>
+
+<xsl:template match="speakernotes" mode="toc">
+ <!-- nop -->
+</xsl:template>
+
+<!-- ====================================================================== -->
+<!-- foil -->
+
+<xsl:template match="foil">
+ <xsl:param name="thisfoil">
+ <xsl:apply-templates select="." mode="chunk-filename"/>
+ </xsl:param>
+
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+
+ <xsl:variable name="home" select="/slides"/>
+ <xsl:variable name="up" select="(parent::slides|parent::foilgroup)[1]"/>
+ <xsl:variable name="next" select="(following::foil
+ |following::foilgroup)[1]"/>
+ <xsl:variable name="prev" select="(preceding-sibling::foil[1]
+ |parent::foilgroup[1]
+ |/slides)[last()]"/>
+
+ <xsl:call-template name="write.chunk">
+ <xsl:with-param name="indent" select="$output.indent"/>
+ <xsl:with-param name="filename" select="concat($base.dir, $thisfoil)"/>
+ <xsl:with-param name="content">
+ <html>
+ <head>
+ <title><xsl:value-of select="title"/></title>
+
+ <xsl:call-template name="system.head.content"/>
+
+ <meta name="generator" content="DocBook Slides Stylesheets V{$VERSION}"/>
+
+ <!-- Links -->
+ <xsl:if test="$css.stylesheet != ''">
+ <link type="text/css" rel="stylesheet">
+ <xsl:attribute name="href">
+ <xsl:call-template name="css.stylesheet"/>
+ </xsl:attribute>
+ </link>
+ </xsl:if>
+ <xsl:apply-templates select="/processing-instruction('dbhtml')" mode="css.pi"/>
+
+ <xsl:call-template name="links">
+ <xsl:with-param name="home" select="$home"/>
+ <xsl:with-param name="up" select="$up"/>
+ <xsl:with-param name="next" select="$next"/>
+ <xsl:with-param name="prev" select="$prev"/>
+ </xsl:call-template>
+
+ <!-- Scripts -->
+
+ <xsl:if test="$overlay != 0 or $keyboard.nav != 0">
+ <script language="javascript" type="text/javascript">
+ <xsl:text> </xsl:text>
+ </script>
+ </xsl:if>
+
+ <xsl:if test="$keyboard.nav != 0">
+ <xsl:call-template name="ua.js"/>
+ <xsl:call-template name="xbDOM.js">
+ <xsl:with-param name="language" select="'javascript'"/>
+ </xsl:call-template>
+ <xsl:call-template name="xbLibrary.js"/>
+ <script language="javascript" type="text/javascript">
+ <xsl:text disable-output-escaping="yes">
+ &lt;!--
+ xblibrary = new xbLibrary('</xsl:text>
+ <xsl:call-template name="script-dir"/>
+ <xsl:text disable-output-escaping="yes">');
+ // --&gt;
+ </xsl:text>
+ </script>
+ <xsl:call-template name="xbStyle.js"/>
+ <xsl:call-template name="xbCollapsibleLists.js"/>
+ <xsl:call-template name="slides.js">
+ <xsl:with-param name="language" select="'javascript'"/>
+ </xsl:call-template>
+ </xsl:if>
+
+ <xsl:if test="$overlay != '0'">
+ <xsl:call-template name="overlay.js">
+ <xsl:with-param name="language" select="'javascript'"/>
+ </xsl:call-template>
+ </xsl:if>
+
+ <xsl:call-template name="user.head.content"/>
+ </head>
+ <body>
+ <xsl:attribute name="class">
+ <xsl:value-of select="local-name(.)"/>
+ <xsl:if test="@role">
+ <xsl:text>-</xsl:text>
+ <xsl:value-of select="@role"/>
+ </xsl:if>
+ </xsl:attribute>
+
+ <xsl:call-template name="body.attributes"/>
+ <xsl:if test="$overlay != 0">
+ <xsl:attribute name="onload">
+ <xsl:text>overlaySetup('lc')</xsl:text>
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:if test="$keyboard.nav != 0">
+ <xsl:attribute name="onkeypress">
+ <xsl:text>navigate(event)</xsl:text>
+ </xsl:attribute>
+ </xsl:if>
+
+ <div class="{name(.)}" id="{$id}">
+ <xsl:call-template name="foil-top-nav">
+ <xsl:with-param name="home" select="$home"/>
+ <xsl:with-param name="up" select="$up"/>
+ <xsl:with-param name="next" select="$next"/>
+ <xsl:with-param name="prev" select="$prev"/>
+ </xsl:call-template>
+
+ <div class="foil-body">
+ <xsl:call-template name="foil-body">
+ <xsl:with-param name="home" select="$home"/>
+ <xsl:with-param name="up" select="$up"/>
+ <xsl:with-param name="next" select="$next"/>
+ <xsl:with-param name="prev" select="$prev"/>
+ </xsl:call-template>
+ </div>
+
+ <div id="overlayDiv">
+ <xsl:call-template name="overlayDiv.attributes"/>
+ <xsl:call-template name="foil-bottom-nav">
+ <xsl:with-param name="home" select="$home"/>
+ <xsl:with-param name="up" select="$up"/>
+ <xsl:with-param name="next" select="$next"/>
+ <xsl:with-param name="prev" select="$prev"/>
+ </xsl:call-template>
+ </div>
+ </div>
+
+ <xsl:call-template name="process.footnotes"/>
+ </body>
+ </html>
+ </xsl:with-param>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template name="foil-body">
+ <xsl:param name="home"/>
+ <xsl:param name="up"/>
+ <xsl:param name="next"/>
+ <xsl:param name="prev"/>
+ <xsl:param name="tocfile" select="$toc.html"/>
+ <xsl:apply-templates/>
+</xsl:template>
+
+<xsl:template name="foil-top-nav">
+ <xsl:param name="home"/>
+ <xsl:param name="up"/>
+ <xsl:param name="next"/>
+ <xsl:param name="prev"/>
+ <xsl:param name="tocfile" select="$toc.html"/>
+
+ <xsl:call-template name="top-nav">
+ <xsl:with-param name="home" select="$home"/>
+ <xsl:with-param name="up" select="$up"/>
+ <xsl:with-param name="next" select="$next"/>
+ <xsl:with-param name="prev" select="$prev"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template name="foil-bottom-nav">
+ <xsl:param name="home"/>
+ <xsl:param name="up"/>
+ <xsl:param name="next"/>
+ <xsl:param name="prev"/>
+ <xsl:param name="tocfile" select="$toc.html"/>
+
+ <xsl:call-template name="bottom-nav">
+ <xsl:with-param name="home" select="$home"/>
+ <xsl:with-param name="up" select="$up"/>
+ <xsl:with-param name="next" select="$next"/>
+ <xsl:with-param name="prev" select="$prev"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="foil/title">
+ <h1 class="{name(.)}">
+ <xsl:apply-templates/>
+ </h1>
+</xsl:template>
+
+<!-- ====================================================================== -->
+<!-- foilgroup -->
+
+<xsl:template match="foilgroup">
+ <xsl:param name="thisfoilgroup">
+ <xsl:apply-templates select="." mode="chunk-filename"/>
+ </xsl:param>
+
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+
+ <xsl:variable name="home" select="/slides"/>
+ <xsl:variable name="up" select="(parent::slides|parent::foilgroup)[1]"/>
+ <xsl:variable name="next" select="foil[1]"/>
+ <xsl:variable name="prev" select="(preceding::foil|parent::foilgroup|/slides)[last()]"/>
+
+ <xsl:call-template name="write.chunk">
+ <xsl:with-param name="indent" select="$output.indent"/>
+ <xsl:with-param name="filename" select="concat($base.dir, $thisfoilgroup)"/>
+ <xsl:with-param name="content">
+ <html>
+ <head>
+ <title><xsl:value-of select="title"/></title>
+
+ <xsl:call-template name="system.head.content"/>
+
+ <meta name="generator" content="DocBook Slides Stylesheets V{$VERSION}"/>
+
+ <!-- Links -->
+ <xsl:if test="$css.stylesheet != ''">
+ <link type="text/css" rel="stylesheet">
+ <xsl:attribute name="href">
+ <xsl:call-template name="css.stylesheet"/>
+ </xsl:attribute>
+ </link>
+ </xsl:if>
+ <xsl:apply-templates select="/processing-instruction('dbhtml')" mode="css.pi"/>
+
+ <xsl:call-template name="links">
+ <xsl:with-param name="home" select="$home"/>
+ <xsl:with-param name="up" select="$up"/>
+ <xsl:with-param name="next" select="$next"/>
+ <xsl:with-param name="prev" select="$prev"/>
+ </xsl:call-template>
+
+ <!-- Scripts -->
+
+ <xsl:if test="$overlay != 0 or $keyboard.nav != 0">
+ <script language="javascript" type="text/javascript">
+ <xsl:text> </xsl:text>
+ </script>
+ </xsl:if>
+
+ <xsl:if test="$keyboard.nav != 0">
+ <xsl:call-template name="ua.js"/>
+ <xsl:call-template name="xbDOM.js">
+ <xsl:with-param name="language" select="'javascript'"/>
+ </xsl:call-template>
+ <xsl:call-template name="xbLibrary.js"/>
+ <script language="javascript" type="text/javascript">
+ <xsl:text disable-output-escaping="yes">
+ &lt;!--
+ xblibrary = new xbLibrary('</xsl:text>
+ <xsl:call-template name="script-dir"/>
+ <xsl:text disable-output-escaping="yes">');
+ // --&gt;
+ </xsl:text>
+ </script>
+ <xsl:call-template name="xbStyle.js"/>
+ <xsl:call-template name="xbCollapsibleLists.js"/>
+ <xsl:call-template name="slides.js">
+ <xsl:with-param name="language" select="'javascript'"/>
+ </xsl:call-template>
+ </xsl:if>
+
+ <xsl:if test="$overlay != '0'">
+ <xsl:call-template name="overlay.js">
+ <xsl:with-param name="language" select="'javascript'"/>
+ </xsl:call-template>
+ </xsl:if>
+
+ <xsl:call-template name="user.head.content"/>
+ </head>
+ <body>
+ <xsl:attribute name="class">
+ <xsl:value-of select="local-name(.)"/>
+ <xsl:if test="@role">
+ <xsl:text>-</xsl:text>
+ <xsl:value-of select="@role"/>
+ </xsl:if>
+ </xsl:attribute>
+
+ <xsl:call-template name="body.attributes"/>
+ <xsl:if test="$overlay != 0">
+ <xsl:attribute name="onload">
+ <xsl:text>overlaySetup('lc')</xsl:text>
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:if test="$keyboard.nav != 0">
+ <xsl:attribute name="onkeypress">
+ <xsl:text>navigate(event)</xsl:text>
+ </xsl:attribute>
+ </xsl:if>
+
+ <div class="{name(.)}" id="{$id}">
+ <xsl:call-template name="foilgroup-top-nav">
+ <xsl:with-param name="home" select="$home"/>
+ <xsl:with-param name="up" select="$up"/>
+ <xsl:with-param name="next" select="$next"/>
+ <xsl:with-param name="prev" select="$prev"/>
+ </xsl:call-template>
+
+ <!-- n.b. the foilgroup-body template is responsible for generating -->
+ <!-- the foilgroup toc -->
+ <div class="foilgroup-body">
+ <xsl:call-template name="foilgroup-body">
+ <xsl:with-param name="home" select="$home"/>
+ <xsl:with-param name="up" select="$up"/>
+ <xsl:with-param name="next" select="$next"/>
+ <xsl:with-param name="prev" select="$prev"/>
+ </xsl:call-template>
+ </div>
+
+ <div id="overlayDiv">
+ <xsl:call-template name="overlayDiv.attributes"/>
+ <xsl:call-template name="foilgroup-bottom-nav">
+ <xsl:with-param name="home" select="$home"/>
+ <xsl:with-param name="up" select="$up"/>
+ <xsl:with-param name="next" select="$next"/>
+ <xsl:with-param name="prev" select="$prev"/>
+ </xsl:call-template>
+ </div>
+ </div>
+
+ <xsl:call-template name="process.footnotes"/>
+ </body>
+ </html>
+ </xsl:with-param>
+ </xsl:call-template>
+
+ <xsl:apply-templates select="foil"/>
+</xsl:template>
+
+<xsl:template match="foilgroup/title">
+ <h1 class="{name(.)}"><xsl:apply-templates/></h1>
+</xsl:template>
+
+<xsl:template name="foilgroup-body">
+ <xsl:param name="home"/>
+ <xsl:param name="up"/>
+ <xsl:param name="next"/>
+ <xsl:param name="prev"/>
+ <xsl:param name="tocfile" select="$toc.html"/>
+
+ <xsl:apply-templates select="*[name(.) != 'foil'
+ and name(.) != 'foilgroup']"/>
+
+ <xsl:if test="$foilgroup.toc != 0">
+ <dl class="toc">
+ <xsl:apply-templates select="foil" mode="toc"/>
+ </dl>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template name="foilgroup-top-nav">
+ <xsl:param name="home"/>
+ <xsl:param name="up"/>
+ <xsl:param name="next"/>
+ <xsl:param name="prev"/>
+ <xsl:param name="tocfile" select="$toc.html"/>
+
+ <xsl:call-template name="top-nav">
+ <xsl:with-param name="home" select="$home"/>
+ <xsl:with-param name="up" select="$up"/>
+ <xsl:with-param name="next" select="$next"/>
+ <xsl:with-param name="prev" select="$prev"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template name="foilgroup-bottom-nav">
+ <xsl:param name="home"/>
+ <xsl:param name="up"/>
+ <xsl:param name="next"/>
+ <xsl:param name="prev"/>
+ <xsl:param name="tocfile" select="$toc.html"/>
+
+ <xsl:call-template name="bottom-nav">
+ <xsl:with-param name="home" select="$home"/>
+ <xsl:with-param name="up" select="$up"/>
+ <xsl:with-param name="next" select="$next"/>
+ <xsl:with-param name="prev" select="$prev"/>
+ </xsl:call-template>
+</xsl:template>
+
+<!-- ====================================================================== -->
+
+<xsl:template name="overlayDiv.attributes">
+ <xsl:choose>
+ <xsl:when test="$overlay != 0">
+ <xsl:attribute name="style">
+ <xsl:text>position: absolute; visibility: visible;</xsl:text>
+ </xsl:attribute>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:attribute name="style">padding-top: 2in;</xsl:attribute>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ====================================================================== -->
+
+<xsl:template match="processing-instruction('dbhtml')" mode="css.pi">
+ <xsl:variable name="href">
+ <xsl:call-template name="dbhtml-attribute">
+ <xsl:with-param name="pis" select="."/>
+ <xsl:with-param name="attribute" select="'css-stylesheet'"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:if test="$href!=''">
+ <xsl:choose>
+ <xsl:when test="$href = ''">
+ <!-- nop -->
+ </xsl:when>
+ <xsl:when test="contains($href, '//')">
+ <link type="text/css" rel="stylesheet" href="{$href}"/>
+ </xsl:when>
+ <xsl:when test="starts-with($href, '/')">
+ <link type="text/css" rel="stylesheet" href="{$href}"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <link type="text/css" rel="stylesheet">
+ <xsl:attribute name="href">
+ <xsl:call-template name="css-file">
+ <xsl:with-param name="css" select="$href"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ </link>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:if>
+
+</xsl:template>
+
+<!-- ====================================================================== -->
+
+<xsl:template match="foil" mode="number">
+ <xsl:number count="foil|foilgroup" level="any"/>
+</xsl:template>
+
+<xsl:template match="foilgroup" mode="number">
+ <xsl:number count="foil|foilgroup" level="any"/>
+</xsl:template>
+
+<!-- ====================================================================== -->
+
+<xsl:template match="slides" mode="filename">
+ <xsl:value-of select="$titlefoil.html"/>
+</xsl:template>
+
+<xsl:template match="foil" mode="filename">
+ <xsl:text>foil</xsl:text>
+ <xsl:number count="foil" level="any" format="01"/>
+ <xsl:value-of select="$html.ext"/>
+</xsl:template>
+
+<xsl:template match="foilgroup" mode="filename">
+ <xsl:text>foilgroup</xsl:text>
+ <xsl:number count="foilgroup" level="any" format="01"/>
+ <xsl:value-of select="$html.ext"/>
+</xsl:template>
+
+<!-- ============================================================ -->
+
+<xsl:template match="processing-instruction('Pub')">
+ <xsl:variable name="pidata"><xsl:value-of select="(.)"/></xsl:variable>
+ <xsl:choose>
+ <xsl:when test="contains($pidata,'UDT')"></xsl:when>
+ <xsl:when test="contains($pidata,'/_font')">
+ <xsl:text disable-output-escaping="yes">&lt;/span&gt;</xsl:text>
+ </xsl:when>
+ <xsl:when test="contains($pidata,'_font')">
+ <xsl:text disable-output-escaping="yes">&lt;span </xsl:text>
+ <xsl:choose>
+ <xsl:when test="contains($pidata,'green')">class="green"</xsl:when>
+ <xsl:when test="contains($pidata,'blue')">class="blue"</xsl:when>
+ <xsl:when test="contains($pidata,'orange')">class="orange"</xsl:when>
+ <xsl:when test="contains($pidata,'red')">class="red"</xsl:when>
+ <xsl:when test="contains($pidata,'brown')">class="brown"</xsl:when>
+ <xsl:when test="contains($pidata,'violet')">class="violet"</xsl:when>
+ <xsl:when test="contains($pidata,'black')">class="black"</xsl:when>
+ <xsl:otherwise>class="bold"</xsl:otherwise>
+ </xsl:choose>
+ <xsl:text disable-output-escaping="yes">&gt;</xsl:text>
+ </xsl:when>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ============================================================ -->
+<!-- blocks -->
+
+<xsl:template match="figure">
+ <div class="{name(.)}">
+ <xsl:apply-imports/>
+ </div>
+ <xsl:if test="following-sibling::*"><hr/></xsl:if>
+</xsl:template>
+
+<xsl:template match="copyright" mode="slide.footer.mode">
+ <span class="{name(.)}">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'Copyright'"/>
+ </xsl:call-template>
+ <xsl:call-template name="gentext.space"/>
+ <xsl:call-template name="dingbat">
+ <xsl:with-param name="dingbat">copyright</xsl:with-param>
+ </xsl:call-template>
+ <xsl:call-template name="gentext.space"/>
+ <xsl:call-template name="copyright.years">
+ <xsl:with-param name="years" select="year"/>
+ <xsl:with-param name="print.ranges" select="$make.year.ranges"/>
+ <xsl:with-param name="single.year.ranges"
+ select="$make.single.year.ranges"/>
+ </xsl:call-template>
+ <xsl:call-template name="gentext.space"/>
+ <xsl:apply-templates select="holder" mode="titlepage.mode"/>
+ </span>
+</xsl:template>
+
+<!-- ============================================================ -->
+<!-- inlines -->
+
+<xsl:template match="link">
+ <xsl:call-template name="link">
+ <xsl:with-param name="a.target" select="'foil'"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="ulink">
+ <a>
+ <xsl:if test="@id">
+ <xsl:attribute name="name"><xsl:value-of select="@id"/></xsl:attribute>
+ </xsl:if>
+ <xsl:attribute name="href"><xsl:value-of select="@url"/></xsl:attribute>
+ <xsl:if test="$ulink.target != ''">
+ <xsl:attribute name="target">
+ <xsl:value-of select="$ulink.target"/>
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:choose>
+ <xsl:when test="count(child::node())=0">
+ <xsl:value-of select="@url"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates/>
+ <xsl:if test="@role='show'">
+ <xsl:text> (</xsl:text>
+ <xsl:value-of select="@url"/>
+ <xsl:text>)</xsl:text>
+ </xsl:if>
+ </xsl:otherwise>
+ </xsl:choose>
+ </a>
+</xsl:template>
+
+<xsl:template match="title/ulink">
+ <a>
+ <xsl:if test="@id">
+ <xsl:attribute name="name"><xsl:value-of select="@id"/></xsl:attribute>
+ </xsl:if>
+ <xsl:attribute name="href"><xsl:value-of select="@url"/></xsl:attribute>
+ <xsl:if test="$ulink.target != ''">
+ <xsl:attribute name="target">
+ <xsl:value-of select="$ulink.target"/>
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:choose>
+ <xsl:when test="count(child::node())=0">
+ <xsl:value-of select="@url"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </a>
+</xsl:template>
+
+<xsl:template match="subtitle">
+ <h2 class="subtitle">
+ <xsl:apply-templates/>
+ </h2>
+</xsl:template>
+
+<xsl:template match="graphic">
+ <center>
+ <!-- can't this be done a better way? -->
+ <xsl:apply-imports/>
+ </center>
+</xsl:template>
+
+<xsl:template match="titleabbrev">
+ <!-- nop -->
+</xsl:template>
+
+<xsl:template match="speakernotes">
+ <!-- nop -->
+</xsl:template>
+
+<!-- ====================================================================== -->
+<!-- Chunking for slides -->
+
+<xsl:template name="chunk">
+ <xsl:param name="node" select="."/>
+ <xsl:choose>
+ <xsl:when test="name($node)='slides'">1</xsl:when>
+ <xsl:when test="name($node)='foilgroup'">1</xsl:when>
+ <xsl:when test="name($node)='foil'">1</xsl:when>
+ <xsl:otherwise>0</xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="*" mode="chunk-filename">
+ <xsl:param name="recursive">0</xsl:param>
+ <!-- returns the filename of a chunk -->
+ <xsl:variable name="ischunk"><xsl:call-template name="chunk"/></xsl:variable>
+ <xsl:variable name="filename">
+ <xsl:call-template name="pi.dbhtml_filename"/>
+ </xsl:variable>
+ <xsl:variable name="dir">
+ <xsl:call-template name="dbhtml-dir"/>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="$ischunk='0'">
+ <!-- if called on something that isn't a chunk, walk up... -->
+ <xsl:choose>
+ <xsl:when test="count(./parent::*)>0">
+ <xsl:apply-templates mode="chunk-filename" select="./parent::*">
+ <xsl:with-param name="recursive" select="$recursive"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <!-- unless there is no up, in which case return "" -->
+ <xsl:otherwise></xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+
+ <xsl:when test="not($recursive) and $filename != ''">
+ <!-- if this chunk has an explicit name, use it -->
+ <xsl:if test="$dir != ''">
+ <xsl:value-of select="$dir"/>
+ <xsl:text>/</xsl:text>
+ </xsl:if>
+ <xsl:value-of select="$filename"/>
+ </xsl:when>
+
+ <xsl:when test="name(.)='foil'">
+ <xsl:variable name="foilnumber">
+ <xsl:number count="foil" level="any"/>
+ </xsl:variable>
+
+ <xsl:value-of select="$dir"/>
+ <xsl:text>foil</xsl:text>
+ <xsl:number value="$foilnumber" format="01"/>
+ <xsl:value-of select="$html.ext"/>
+ </xsl:when>
+
+ <xsl:when test="name(.)='foilgroup'">
+ <xsl:variable name="foilgroupnumber">
+ <xsl:number count="foilgroup" level="any" format="01"/>
+ </xsl:variable>
+
+ <xsl:value-of select="$dir"/>
+ <xsl:text>foilgroup</xsl:text>
+ <xsl:number value="$foilgroupnumber" format="01"/>
+ <xsl:value-of select="$html.ext"/>
+ </xsl:when>
+
+ <xsl:otherwise>
+ <xsl:text>chunk-filename-error-</xsl:text>
+ <xsl:value-of select="name(.)"/>
+ <xsl:number level="any" format="01" from="set"/>
+ <xsl:if test="not($recursive)">
+ <xsl:value-of select="$html.ext"/>
+ </xsl:if>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ====================================================================== -->
+<!-- Handling of xrefs -->
+
+<xsl:template match="foil|foilgroup" mode="xref-to">
+ <xsl:param name="referrer"/>
+ <xsl:param name="xrefstyle"/>
+
+ <xsl:apply-templates select="." mode="object.xref.markup">
+ <xsl:with-param name="purpose" select="'xref'"/>
+ <xsl:with-param name="xrefstyle" select="$xrefstyle"/>
+ <xsl:with-param name="referrer" select="$referrer"/>
+ </xsl:apply-templates>
+</xsl:template>
+
+<!-- ====================================================================== -->
+
+<xsl:template match="@*" mode="copy">
+ <xsl:attribute name="{local-name(.)}">
+ <xsl:value-of select="."/>
+ </xsl:attribute>
+</xsl:template>
+
+<xsl:template match="html:*" xmlns:html='http://www.w3.org/1999/xhtml'>
+ <xsl:element name="{local-name(.)}" namespace="">
+ <xsl:apply-templates select="@*" mode="copy"/>
+ <xsl:apply-templates/>
+ </xsl:element>
+</xsl:template>
+
+<!-- ====================================================================== -->
+
+<xsl:template name="foil.number">
+ <xsl:choose>
+ <xsl:when test="$show.foil.number != 0 and self::foil">
+ <xsl:number count="foil" level="any"/>
+ /
+ <xsl:value-of select="count(//foil)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ &#160;
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/html/tables.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/html/tables.xsl
new file mode 100644
index 0000000..0462528
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/html/tables.xsl
@@ -0,0 +1,336 @@
+<?xml version="1.0"?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="1.0">
+
+<xsl:import href="slides-common.xsl"/>
+
+<xsl:param name="blank.image" select="'blank.png'"/>
+<xsl:param name="arrow.image" select="'pointer.png'"/>
+
+<xsl:param name="toc.bg.color">#6A719C</xsl:param>
+<xsl:param name="toc.width">220</xsl:param>
+
+<xsl:param name="css.stylesheet" select="'slides-table.css'"/>
+
+<!-- ============================================================ -->
+
+<xsl:template name="foilgroup-body">
+ <table border="0" width="100%" summary="Navigation and body table"
+ cellpadding="0" cellspacing="0">
+ <tr>
+ <td width="{$toc.width}" valign="top" align="left">
+ <xsl:if test="$toc.bg.color != ''">
+ <xsl:attribute name="bgcolor">
+ <xsl:value-of select="$toc.bg.color"/>
+ </xsl:attribute>
+ </xsl:if>
+ <div class="ttoc">
+ <xsl:apply-templates select="." mode="t-toc"/>
+ </div>
+ </td>
+ <td>&#160;</td>
+ <td valign="top" align="left">
+ <xsl:if test="$body.bg.color != ''">
+ <xsl:attribute name="bgcolor">
+ <xsl:value-of select="$body.bg.color"/>
+ </xsl:attribute>
+ </xsl:if>
+ <div class="{name(.)}">
+ <xsl:apply-templates select="*[name(.) != 'foil'
+ and name(.) != 'foilgroup']"/>
+ </div>
+
+ <xsl:if test="$foilgroup.toc != 0">
+ <dl class="toc">
+ <xsl:apply-templates select="foil" mode="toc"/>
+ </dl>
+ </xsl:if>
+ </td>
+ </tr>
+ </table>
+</xsl:template>
+
+<xsl:template name="foil-body">
+ <table border="0" width="100%" summary="Navigation and body table"
+ cellpadding="0" cellspacing="0">
+ <tr>
+ <td width="{$toc.width}" valign="top" align="left">
+ <xsl:if test="$toc.bg.color != ''">
+ <xsl:attribute name="bgcolor">
+ <xsl:value-of select="$toc.bg.color"/>
+ </xsl:attribute>
+ </xsl:if>
+ <div class="ttoc">
+ <xsl:apply-templates select="." mode="t-toc"/>
+ </div>
+ </td>
+ <td>&#160;</td>
+ <td valign="top" align="left">
+ <xsl:if test="$body.bg.color != ''">
+ <xsl:attribute name="bgcolor">
+ <xsl:value-of select="$body.bg.color"/>
+ </xsl:attribute>
+ </xsl:if>
+ <div class="{name(.)}">
+ <xsl:apply-templates/>
+ </div>
+ </td>
+ </tr>
+ </table>
+</xsl:template>
+
+<!-- ============================================================ -->
+
+<xsl:template match="foilgroup" mode="t-toc">
+ <xsl:variable name="thisfoilgroup" select="."/>
+
+ <xsl:for-each select="/slides/foil|/slides/foilgroup">
+ <xsl:choose>
+ <xsl:when test="name(.) = 'foilgroup'">
+ <xsl:choose>
+ <xsl:when test="$thisfoilgroup = .">
+ <img alt="+">
+ <xsl:attribute name="src">
+ <xsl:call-template name="graphics-file">
+ <xsl:with-param name="image" select="$arrow.image"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ </img>
+ </xsl:when>
+ <xsl:otherwise>
+ <img alt=" ">
+ <xsl:attribute name="src">
+ <xsl:call-template name="graphics-file">
+ <xsl:with-param name="image" select="$blank.image"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ </img>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <span class="ttoc-foilgroup">
+ <a>
+ <xsl:attribute name="href">
+ <xsl:apply-templates select="." mode="filename"/>
+ </xsl:attribute>
+ <xsl:apply-templates select="." mode="toc-title"/>
+ </a>
+ </span>
+ <br/>
+
+ <xsl:if test="$thisfoilgroup = .">
+ <xsl:for-each select="foil">
+ <img alt=" ">
+ <xsl:attribute name="src">
+ <xsl:call-template name="graphics-file">
+ <xsl:with-param name="image" select="$blank.image"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ </img>
+ <img alt=" ">
+ <xsl:attribute name="src">
+ <xsl:call-template name="graphics-file">
+ <xsl:with-param name="image" select="$blank.image"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ </img>
+
+ <span class="ttoc-foil">
+ <a>
+ <xsl:attribute name="href">
+ <xsl:apply-templates select="." mode="filename"/>
+ </xsl:attribute>
+ <xsl:apply-templates select="." mode="toc-title"/>
+ </a>
+ </span>
+ <br/>
+ </xsl:for-each>
+ </xsl:if>
+ </xsl:when>
+ <xsl:otherwise>
+ <img alt=" ">
+ <xsl:attribute name="src">
+ <xsl:call-template name="graphics-file">
+ <xsl:with-param name="image" select="$blank.image"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ </img>
+ <span class="ttoc-foil">
+ <a>
+ <xsl:attribute name="href">
+ <xsl:apply-templates select="." mode="filename"/>
+ </xsl:attribute>
+ <xsl:apply-templates select="." mode="toc-title"/>
+ </a>
+ </span>
+ <br/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:for-each>
+</xsl:template>
+
+<xsl:template match="foil" mode="t-toc">
+ <xsl:variable name="thisfoil" select="."/>
+
+ <xsl:for-each select="/slides/foil|/slides/foilgroup">
+ <xsl:choose>
+ <xsl:when test="name(.) = 'foilgroup'">
+ <img alt=" ">
+ <xsl:attribute name="src">
+ <xsl:call-template name="graphics-file">
+ <xsl:with-param name="image" select="$blank.image"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ </img>
+ <span class="ttoc-foilgroup">
+ <a>
+ <xsl:attribute name="href">
+ <xsl:apply-templates select="." mode="filename"/>
+ </xsl:attribute>
+ <xsl:apply-templates select="." mode="toc-title"/>
+ </a>
+ </span>
+ <br/>
+
+ <xsl:if test="$thisfoil/ancestor::foilgroup = .">
+ <xsl:for-each select="foil">
+ <img alt=" ">
+ <xsl:attribute name="src">
+ <xsl:call-template name="graphics-file">
+ <xsl:with-param name="image" select="$blank.image"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ </img>
+
+ <xsl:choose>
+ <xsl:when test="$thisfoil = .">
+ <img alt="+">
+ <xsl:attribute name="src">
+ <xsl:call-template name="graphics-file">
+ <xsl:with-param name="image" select="$arrow.image"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ </img>
+ </xsl:when>
+ <xsl:otherwise>
+ <img alt=" ">
+ <xsl:attribute name="src">
+ <xsl:call-template name="graphics-file">
+ <xsl:with-param name="image" select="$blank.image"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ </img>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <span class="ttoc-foil">
+ <a>
+ <xsl:attribute name="href">
+ <xsl:apply-templates select="." mode="filename"/>
+ </xsl:attribute>
+ <xsl:apply-templates select="." mode="toc-title"/>
+ </a>
+ </span>
+ <br/>
+ </xsl:for-each>
+ </xsl:if>
+ </xsl:when>
+ <xsl:otherwise>
+ <!-- foils only -->
+ <xsl:for-each select="/slides/foil">
+ <xsl:choose>
+ <xsl:when test="$thisfoil = .">
+ <img alt="+">
+ <xsl:attribute name="src">
+ <xsl:call-template name="graphics-file">
+ <xsl:with-param name="image" select="$arrow.image"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ </img>
+ </xsl:when>
+ <xsl:otherwise>
+ <img alt=" ">
+ <xsl:attribute name="src">
+ <xsl:call-template name="graphics-file">
+ <xsl:with-param name="image" select="$blank.image"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ </img>
+ </xsl:otherwise>
+ </xsl:choose>
+ <span class="ttoc-foil">
+ <xsl:apply-templates select="." mode="toc-title"/>
+ </span>
+ <br/>
+ </xsl:for-each>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:for-each>
+</xsl:template>
+
+<!-- ============================================================ -->
+
+<xsl:template match="slides" mode="toc-title">
+ <xsl:call-template name="nobreak">
+ <xsl:with-param name="string">
+ <xsl:choose>
+ <xsl:when test="slidesinfo/titleabbrev">
+ <xsl:value-of select="slidesinfo/titleabbrev"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="slidesinfo/title"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:with-param>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="foilgroup" mode="toc-title">
+ <xsl:call-template name="nobreak">
+ <xsl:with-param name="string">
+ <xsl:choose>
+ <xsl:when test="titleabbrev">
+ <xsl:value-of select="titleabbrev"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="title"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:with-param>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="foil" mode="toc-title">
+ <xsl:call-template name="nobreak">
+ <xsl:with-param name="string">
+ <xsl:choose>
+ <xsl:when test="titleabbrev">
+ <xsl:value-of select="titleabbrev"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="title"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:with-param>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template name="nobreak">
+ <xsl:param name="string" select="''"/>
+ <xsl:choose>
+ <xsl:when test="contains($string, ' ')">
+ <xsl:value-of select="substring-before($string, ' ')"/>
+ <xsl:text>&#160;</xsl:text>
+ <xsl:call-template name="nobreak">
+ <xsl:with-param name="string" select="substring-after($string, ' ')"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$string"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ============================================================ -->
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/html/vslides.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/html/vslides.xsl
new file mode 100644
index 0000000..f490099
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/html/vslides.xsl
@@ -0,0 +1,667 @@
+<?xml version="1.0"?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="1.0">
+
+<xsl:import href="slides-common.xsl"/>
+
+<xsl:param name="but-fforward.png" select="'active/but-fforward.png'"/>
+<xsl:param name="but-info.png" select="'active/but-info.png'"/>
+<xsl:param name="but-next.png" select="'active/but-next.png'"/>
+<xsl:param name="but-prev.png" select="'active/but-prev.png'"/>
+<xsl:param name="but-rewind.png" select="'active/but-rewind.png'"/>
+
+<xsl:param name="but-xfforward.png" select="'inactive/but-fforward.png'"/>
+<xsl:param name="but-xinfo.png" select="'inactive/but-info.png'"/>
+<xsl:param name="but-xnext.png" select="'inactive/but-next.png'"/>
+<xsl:param name="but-xprev.png" select="'inactive/but-prev.png'"/>
+<xsl:param name="but-xrewind.png" select="'inactive/but-rewind.png'"/>
+
+<!-- overrides for this stylesheet -->
+<xsl:param name="titlefoil.html" select="concat('index', $html.ext)"/>
+<xsl:param name="toc.width" select="40"/>
+
+<!-- ============================================================ -->
+
+<xsl:template match="slides">
+ <xsl:call-template name="write.chunk">
+ <xsl:with-param name="indent" select="$output.indent"/>
+ <xsl:with-param name="filename" select="concat($base.dir, $toc.html)"/>
+ <xsl:with-param name="content">
+ <html>
+ <head>
+ <title><xsl:value-of select="slidesinfo/title"/></title>
+ <xsl:if test="$css.stylesheet != ''">
+ <link type="text/css" rel="stylesheet">
+ <xsl:attribute name="href">
+ <xsl:call-template name="css.stylesheet"/>
+ </xsl:attribute>
+ </link>
+ </xsl:if>
+ <xsl:apply-templates select="/processing-instruction('dbhtml')" mode="css.pi"/>
+
+ <xsl:call-template name="links">
+ <xsl:with-param name="next" select="/slides"/>
+ <xsl:with-param name="tocfile" select="$toc.html"/>
+ </xsl:call-template>
+
+ <xsl:if test="$keyboard.nav != 0">
+ <script language="javascript" type="text/javascript">
+ <xsl:text> </xsl:text>
+ </script>
+ </xsl:if>
+
+ <xsl:if test="$keyboard.nav != 0">
+ <xsl:call-template name="ua.js"/>
+ <xsl:call-template name="xbDOM.js">
+ <xsl:with-param name="language" select="'javascript'"/>
+ </xsl:call-template>
+ <xsl:call-template name="xbLibrary.js"/>
+ <script language="javascript" type="text/javascript">
+ <xsl:text disable-output-escaping="yes">
+ &lt;!--
+ xblibrary = new xbLibrary('../browser');
+ // --&gt;
+ </xsl:text>
+ </script>
+ <xsl:call-template name="xbStyle.js"/>
+ <xsl:call-template name="xbCollapsibleLists.js"/>
+ <xsl:call-template name="slides.js">
+ <xsl:with-param name="language" select="'javascript'"/>
+ </xsl:call-template>
+ </xsl:if>
+ </head>
+ <body class="tocpage">
+ <xsl:call-template name="body.attributes"/>
+ <xsl:if test="$keyboard.nav != 0">
+ <xsl:attribute name="onkeypress">
+ <xsl:text>navigate(event)</xsl:text>
+ </xsl:attribute>
+ </xsl:if>
+
+ <table border="0" width="100%" summary="Navigation and body table"
+ cellpadding="0" cellspacing="0">
+ <tr>
+ <td>&#160;</td>
+ <td><xsl:apply-templates select="." mode="header"/></td>
+ </tr>
+
+ <tr>
+ <td width="{$toc.width}" valign="top" align="left">
+ <xsl:if test="$toc.bg.color != ''">
+ <xsl:attribute name="bgcolor">
+ <xsl:value-of select="$toc.bg.color"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:call-template name="vertical-navigation">
+ <xsl:with-param name="next" select="/slides"/>
+ <xsl:with-param name="tocfile"/>
+ </xsl:call-template>
+
+ </td>
+ <td valign="top" align="left">
+ <xsl:if test="$body.bg.color != ''">
+ <xsl:attribute name="bgcolor">
+ <xsl:value-of select="$body.bg.color"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <div class="{name(.)}">
+
+ <div class="toc-body">
+ <xsl:call-template name="toc-body"/>
+ </div>
+
+ </div>
+ </td>
+ </tr>
+
+ <tr>
+ <td>&#160;</td>
+ <td><xsl:apply-templates select="." mode="footer"/></td>
+ </tr>
+ </table>
+ </body>
+ </html>
+ </xsl:with-param>
+ </xsl:call-template>
+
+ <xsl:apply-templates/>
+</xsl:template>
+
+<xsl:template match="slidesinfo">
+ <xsl:call-template name="write.chunk">
+ <xsl:with-param name="indent" select="$output.indent"/>
+ <xsl:with-param name="filename" select="concat($base.dir, $titlefoil.html)"/>
+ <xsl:with-param name="content">
+ <html>
+ <head>
+ <title><xsl:value-of select="title"/></title>
+ <xsl:if test="$css.stylesheet != ''">
+ <link type="text/css" rel="stylesheet">
+ <xsl:attribute name="href">
+ <xsl:call-template name="css.stylesheet"/>
+ </xsl:attribute>
+ </link>
+ </xsl:if>
+ <xsl:apply-templates select="/processing-instruction('dbhtml')" mode="css.pi"/>
+
+ <xsl:call-template name="links">
+ <xsl:with-param name="next" select="(/slides/foil|/slides/foilgroup)[1]"/>
+ <xsl:with-param name="tocfile" select="$toc.html"/>
+ </xsl:call-template>
+
+ <xsl:if test="$keyboard.nav != 0">
+ <script language="javascript" type="text/javascript">
+ <xsl:text> </xsl:text>
+ </script>
+ </xsl:if>
+
+ <xsl:if test="$keyboard.nav != 0">
+ <xsl:call-template name="ua.js"/>
+ <xsl:call-template name="xbDOM.js">
+ <xsl:with-param name="language" select="'javascript'"/>
+ </xsl:call-template>
+ <xsl:call-template name="xbLibrary.js"/>
+ <script language="javascript" type="text/javascript">
+ <xsl:text disable-output-escaping="yes">
+ &lt;!--
+ xblibrary = new xbLibrary('../browser');
+ // --&gt;
+ </xsl:text>
+ </script>
+ <xsl:call-template name="xbStyle.js"/>
+ <xsl:call-template name="xbCollapsibleLists.js"/>
+ <xsl:call-template name="slides.js">
+ <xsl:with-param name="language" select="'javascript'"/>
+ </xsl:call-template>
+ </xsl:if>
+ </head>
+ <body class="titlepage">
+ <xsl:call-template name="body.attributes"/>
+ <xsl:if test="$keyboard.nav != 0">
+ <xsl:attribute name="onkeypress">
+ <xsl:text>navigate(event)</xsl:text>
+ </xsl:attribute>
+ </xsl:if>
+
+ <table border="0" width="100%" summary="Navigation and body table"
+ cellpadding="0" cellspacing="0">
+ <tr>
+ <td>&#160;</td>
+ <td><xsl:apply-templates select="." mode="header"/></td>
+ </tr>
+
+ <tr>
+ <td width="{$toc.width}" valign="top" align="left">
+ <xsl:if test="$toc.bg.color != ''">
+ <xsl:attribute name="bgcolor">
+ <xsl:value-of select="$toc.bg.color"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:call-template name="vertical-navigation">
+ <xsl:with-param name="first"/>
+ <xsl:with-param name="last" select="(following::foilgroup|following::foil)[last()]"/>
+ <xsl:with-param name="next" select="(following::foilgroup|following::foil)[1]"/>
+ </xsl:call-template>
+
+ </td>
+ <td valign="top" align="left">
+ <xsl:if test="$body.bg.color != ''">
+ <xsl:attribute name="bgcolor">
+ <xsl:value-of select="$body.bg.color"/>
+ </xsl:attribute>
+ </xsl:if>
+ <div class="{name(.)}">
+ <xsl:apply-templates mode="titlepage.mode"/>
+ </div>
+ </td>
+ </tr>
+
+ <tr>
+ <td>&#160;</td>
+ <td><xsl:apply-templates select="." mode="footer"/></td>
+ </tr>
+ </table>
+ </body>
+ </html>
+ </xsl:with-param>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="foilgroup">
+ <xsl:param name="thisfoilgroup">
+ <xsl:apply-templates select="." mode="filename"/>
+ </xsl:param>
+
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+
+ <xsl:variable name="nextfoil" select="foil[1]"/>
+ <xsl:variable name="lastfoil" select="(descendant::foil|following::foil)[last()]"/>
+ <xsl:variable name="prevfoil" select="(preceding::foil|/slides)[last()]"/>
+
+ <xsl:call-template name="write.chunk">
+ <xsl:with-param name="indent" select="$output.indent"/>
+ <xsl:with-param name="filename" select="concat($base.dir, $thisfoilgroup)"/>
+ <xsl:with-param name="content">
+ <html>
+ <head>
+ <title><xsl:value-of select="title"/></title>
+ <xsl:if test="$css.stylesheet != ''">
+ <link type="text/css" rel="stylesheet">
+ <xsl:attribute name="href">
+ <xsl:call-template name="css.stylesheet"/>
+ </xsl:attribute>
+ </link>
+ </xsl:if>
+ <xsl:apply-templates select="/processing-instruction('dbhtml')" mode="css.pi"/>
+
+ <xsl:call-template name="links">
+ <xsl:with-param name="prev" select="$prevfoil"/>
+ <xsl:with-param name="next" select="$nextfoil"/>
+ </xsl:call-template>
+
+ <xsl:if test="$keyboard.nav != 0">
+ <script language="javascript" type="text/javascript">
+ <xsl:text> </xsl:text>
+ </script>
+ </xsl:if>
+
+ <xsl:if test="$keyboard.nav != 0">
+ <xsl:call-template name="ua.js"/>
+ <xsl:call-template name="xbDOM.js">
+ <xsl:with-param name="language" select="'javascript'"/>
+ </xsl:call-template>
+ <xsl:call-template name="xbLibrary.js"/>
+ <script language="javascript" type="text/javascript">
+ <xsl:text disable-output-escaping="yes">
+ &lt;!--
+ xblibrary = new xbLibrary('../browser');
+ // --&gt;
+ </xsl:text>
+ </script>
+ <xsl:call-template name="xbStyle.js"/>
+ <xsl:call-template name="xbCollapsibleLists.js"/>
+ <xsl:call-template name="slides.js">
+ <xsl:with-param name="language" select="'javascript'"/>
+ </xsl:call-template>
+ </xsl:if>
+ </head>
+ <body class="foilgroup">
+ <xsl:call-template name="body.attributes"/>
+ <xsl:if test="$keyboard.nav != 0">
+ <xsl:attribute name="onkeypress">
+ <xsl:text>navigate(event)</xsl:text>
+ </xsl:attribute>
+ </xsl:if>
+
+ <table border="0" width="100%" summary="Navigation and body table"
+ cellpadding="0" cellspacing="0">
+ <tr>
+ <td>&#160;</td>
+ <td><xsl:apply-templates select="." mode="header"/></td>
+ </tr>
+
+ <tr>
+ <td width="{$toc.width}" valign="top" align="left">
+ <xsl:if test="$toc.bg.color != ''">
+ <xsl:attribute name="bgcolor">
+ <xsl:value-of select="$toc.bg.color"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:call-template name="vertical-navigation">
+ <xsl:with-param name="last" select="$lastfoil"/>
+ <xsl:with-param name="prev" select="$prevfoil"/>
+ <xsl:with-param name="next" select="$nextfoil"/>
+ </xsl:call-template>
+
+ </td>
+ <td valign="top" align="left">
+ <xsl:if test="$body.bg.color != ''">
+ <xsl:attribute name="bgcolor">
+ <xsl:value-of select="$body.bg.color"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <div class="{name(.)}">
+ <xsl:apply-templates/>
+ </div>
+ </td>
+ </tr>
+
+ <tr>
+ <td>&#160;</td>
+ <td><xsl:apply-templates select="." mode="footer"/></td>
+ </tr>
+ </table>
+ </body>
+ </html>
+ </xsl:with-param>
+ </xsl:call-template>
+
+ <xsl:apply-templates select="foil"/>
+</xsl:template>
+
+<xsl:template match="foil">
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+
+ <xsl:variable name="foilgroup" select="ancestor::foilgroup"/>
+
+ <xsl:variable name="thisfoil">
+ <xsl:apply-templates select="." mode="filename"/>
+ </xsl:variable>
+
+ <xsl:variable name="nextfoil" select="(following::foil
+ |following::foilgroup)[1]"/>
+
+ <xsl:variable name="lastfoil" select="following::foil[last()]"/>
+
+ <xsl:variable name="prevfoil" select="(preceding-sibling::foil[1]
+ |parent::foilgroup[1]
+ |/slides)[last()]"/>
+
+ <xsl:call-template name="write.chunk">
+ <xsl:with-param name="indent" select="$output.indent"/>
+ <xsl:with-param name="filename" select="concat($base.dir, $thisfoil)"/>
+ <xsl:with-param name="content">
+ <html>
+ <head>
+ <title><xsl:value-of select="title"/></title>
+ <xsl:if test="$css.stylesheet != ''">
+ <link type="text/css" rel="stylesheet">
+ <xsl:attribute name="href">
+ <xsl:call-template name="css.stylesheet"/>
+ </xsl:attribute>
+ </link>
+ </xsl:if>
+ <xsl:apply-templates select="/processing-instruction('dbhtml')" mode="css.pi"/>
+
+ <xsl:call-template name="links">
+ <xsl:with-param name="prev" select="$prevfoil"/>
+ <xsl:with-param name="next" select="$nextfoil"/>
+ </xsl:call-template>
+
+ <xsl:if test="$keyboard.nav != 0">
+ <script language="javascript" type="text/javascript">
+ <xsl:text> </xsl:text>
+ </script>
+ </xsl:if>
+
+ <xsl:if test="$keyboard.nav != 0">
+ <xsl:call-template name="ua.js"/>
+ <xsl:call-template name="xbDOM.js">
+ <xsl:with-param name="language" select="'javascript'"/>
+ </xsl:call-template>
+ <xsl:call-template name="xbLibrary.js"/>
+ <script language="javascript" type="text/javascript">
+ <xsl:text disable-output-escaping="yes">
+ &lt;!--
+ xblibrary = new xbLibrary('../browser');
+ // --&gt;
+ </xsl:text>
+ </script>
+ <xsl:call-template name="xbStyle.js"/>
+ <xsl:call-template name="xbCollapsibleLists.js"/>
+ <xsl:call-template name="slides.js">
+ <xsl:with-param name="language" select="'javascript'"/>
+ </xsl:call-template>
+ </xsl:if>
+ </head>
+ <body class="foil">
+ <xsl:call-template name="body.attributes"/>
+ <xsl:if test="$keyboard.nav != 0">
+ <xsl:attribute name="onkeypress">
+ <xsl:text>navigate(event)</xsl:text>
+ </xsl:attribute>
+ </xsl:if>
+
+ <table border="0" width="100%" summary="Navigation and body table"
+ cellpadding="0" cellspacing="0">
+ <tr>
+ <td>&#160;</td>
+ <td><xsl:apply-templates select="." mode="header"/></td>
+ </tr>
+
+ <tr>
+ <td width="{$toc.width}" valign="top" align="left">
+ <xsl:if test="$toc.bg.color != ''">
+ <xsl:attribute name="bgcolor">
+ <xsl:value-of select="$toc.bg.color"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:call-template name="vertical-navigation">
+ <xsl:with-param name="last" select="$lastfoil"/>
+ <xsl:with-param name="prev" select="$prevfoil"/>
+ <xsl:with-param name="next" select="$nextfoil"/>
+ </xsl:call-template>
+
+ </td>
+ <td valign="top" align="left">
+ <xsl:if test="$body.bg.color != ''">
+ <xsl:attribute name="bgcolor">
+ <xsl:value-of select="$body.bg.color"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <div class="{name(.)}">
+ <xsl:apply-templates/>
+ </div>
+ </td>
+ </tr>
+
+ <tr>
+ <td>&#160;</td>
+ <td><xsl:apply-templates select="." mode="footer"/></td>
+ </tr>
+ </table>
+ </body>
+ </html>
+ </xsl:with-param>
+ </xsl:call-template>
+</xsl:template>
+
+<!-- ============================================================ -->
+
+<xsl:template match="slidesinfo" mode="header">
+ <div class="navhead">
+ <!-- nop -->
+ </div>
+</xsl:template>
+
+<xsl:template match="foil|foilgroup" mode="header">
+ <div class="navhead">
+ <table border="0" width="100%" summary="Header table"
+ cellpadding="0" cellspacing="0">
+ <tr>
+ <td align="left">
+ <xsl:apply-templates select="/slides/slidesinfo/title"
+ mode="slide.footer.mode"/>
+ </td>
+ <td align="right">
+ <xsl:value-of select="count(preceding::foil)
+ + count(preceding::foilgroup)
+ + count(ancestor::foilgroup)
+ + 1"/>
+ </td>
+ </tr>
+ </table>
+ </div>
+</xsl:template>
+
+<xsl:template match="slidesinfo" mode="footer">
+ <div class="navfoot">
+ <!-- nop -->
+ </div>
+</xsl:template>
+
+<xsl:template match="foil|foilgroup" mode="footer">
+ <div class="navfoot">
+ <table border="0" width="100%" summary="Header table"
+ cellpadding="0" cellspacing="0">
+ <tr>
+ <td align="center">
+ <xsl:text>Slide </xsl:text>
+ <xsl:value-of select="count(preceding::foil)
+ + count(preceding::foilgroup)
+ + count(ancestor::foilgroup)
+ + 1"/>
+ <xsl:text> of </xsl:text>
+ <xsl:value-of select="count(//foil) + count(//foilgroup)"/>
+ </td>
+ </tr>
+ </table>
+ </div>
+</xsl:template>
+
+<xsl:template match="slides" mode="footer"/>
+
+<!-- ============================================================ -->
+
+<xsl:template name="vertical-navigation">
+ <xsl:param name="first" select="/slides"/>
+ <xsl:param name="prev"/>
+ <xsl:param name="last"/>
+ <xsl:param name="next"/>
+ <xsl:param name="tocfile" select="$toc.html"/>
+
+ <div class="vnav">
+ <xsl:choose>
+ <xsl:when test="$first">
+ <a>
+ <xsl:attribute name="href">
+ <xsl:apply-templates select="$first" mode="filename"/>
+ </xsl:attribute>
+ <img border="0" alt="First">
+ <xsl:attribute name="src">
+ <xsl:call-template name="graphics-file">
+ <xsl:with-param name="image" select="$but-rewind.png"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ </img>
+ </a>
+ </xsl:when>
+ <xsl:otherwise>
+ <img alt="First">
+ <xsl:attribute name="src">
+ <xsl:call-template name="graphics-file">
+ <xsl:with-param name="image" select="$but-xrewind.png"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ </img>
+ </xsl:otherwise>
+ </xsl:choose>
+ <br/>
+ <xsl:choose>
+ <xsl:when test="$prev">
+ <a>
+ <xsl:attribute name="href">
+ <xsl:apply-templates select="$prev" mode="filename"/>
+ </xsl:attribute>
+ <img border="0" alt="Previous">
+ <xsl:attribute name="src">
+ <xsl:call-template name="graphics-file">
+ <xsl:with-param name="image" select="$but-prev.png"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ </img>
+ </a>
+ </xsl:when>
+ <xsl:otherwise>
+ <img alt="Previous">
+ <xsl:attribute name="src">
+ <xsl:call-template name="graphics-file">
+ <xsl:with-param name="image" select="$but-xprev.png"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ </img>
+ </xsl:otherwise>
+ </xsl:choose>
+ <br/>
+ <xsl:choose>
+ <xsl:when test="$next">
+ <a>
+ <xsl:attribute name="href">
+ <xsl:apply-templates select="$next" mode="filename"/>
+ </xsl:attribute>
+ <img border="0" alt="Last">
+ <xsl:attribute name="src">
+ <xsl:call-template name="graphics-file">
+ <xsl:with-param name="image" select="$but-next.png"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ </img>
+ </a>
+ </xsl:when>
+ <xsl:otherwise>
+ <img alt="Last">
+ <xsl:attribute name="src">
+ <xsl:call-template name="graphics-file">
+ <xsl:with-param name="image" select="$but-xnext.png"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ </img>
+ </xsl:otherwise>
+ </xsl:choose>
+ <br/>
+ <xsl:choose>
+ <xsl:when test="$last">
+ <a>
+ <xsl:attribute name="href">
+ <xsl:apply-templates select="$last" mode="filename"/>
+ </xsl:attribute>
+ <img border="0" alt="Next">
+ <xsl:attribute name="src">
+ <xsl:call-template name="graphics-file">
+ <xsl:with-param name="image" select="$but-fforward.png"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ </img>
+ </a>
+ </xsl:when>
+ <xsl:otherwise>
+ <img alt="Next">
+ <xsl:attribute name="src">
+ <xsl:call-template name="graphics-file">
+ <xsl:with-param name="image" select="$but-xfforward.png"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ </img>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <br/>
+ <br/>
+
+ <xsl:choose>
+ <xsl:when test="$tocfile != ''">
+ <a href="{$tocfile}">
+ <img border="0" alt="ToC">
+ <xsl:attribute name="src">
+ <xsl:call-template name="graphics-file">
+ <xsl:with-param name="image" select="$but-info.png"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ </img>
+ </a>
+ </xsl:when>
+ <xsl:otherwise>
+ <img border="0" alt="ToC">
+ <xsl:attribute name="src">
+ <xsl:call-template name="graphics-file">
+ <xsl:with-param name="image" select="$but-xinfo.png"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ </img>
+ </xsl:otherwise>
+ </xsl:choose>
+ </div>
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/html/w3c.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/html/w3c.xsl
new file mode 100644
index 0000000..5a5b420
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/html/w3c.xsl
@@ -0,0 +1,376 @@
+<?xml version='1.0'?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="1.0">
+
+<xsl:import href="slides-common.xsl"/>
+
+<xsl:param name="logo.image.uri" select="''"/>
+<xsl:param name="logo.uri" select="''"/>
+<xsl:param name="logo.title" select="''"/>
+
+<xsl:param name="next.image" select="'active/w3c-next.png'"/>
+<xsl:param name="no.next.image" select="'inactive/w3c-next.png'"/>
+
+<xsl:param name="prev.image" select="'active/w3c-prev.png'"/>
+<xsl:param name="no.prev.image" select="'inactive/w3c-prev.png'"/>
+
+<xsl:param name="toc.image" select="'active/w3c-toc.png'"/>
+<xsl:param name="no.toc.image" select="'inactive/w3c-toc.png'"/>
+
+<xsl:param name="css.stylesheet" select="'slides-w3c.css'"/>
+
+<xsl:template name="logo">
+ <xsl:if test="$logo.uri != ''">
+ <a href="{$logo.uri}" title="{$logo.title}">
+ <xsl:choose>
+ <xsl:when test="$logo.image.uri=''">
+ <xsl:value-of select="$logo.title"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <img src="{$logo.image.uri}" alt="{$logo.title}" border="0"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </a>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template name="overlayDiv.attributes">
+ <xsl:if test="$overlay != 0">
+ <xsl:attribute name="style">
+ <xsl:text>position: absolute; visibility: visible;</xsl:text>
+ </xsl:attribute>
+ </xsl:if>
+</xsl:template>
+
+<!-- ====================================================================== -->
+
+<xsl:template name="top-nav">
+ <xsl:param name="home"/>
+ <xsl:param name="up"/>
+ <xsl:param name="next"/>
+ <xsl:param name="prev"/>
+ <xsl:param name="tocfile" select="$toc.html"/>
+
+ <div class="navhead">
+ <table class="navbar" cellspacing="0" cellpadding="0" border="0" width="97%"
+ summary="Navigation buttons">
+ <tr>
+ <td align="left" valign="top">
+ <xsl:call-template name="logo"/>
+ </td>
+ <td valign="top" nowrap="nowrap" width="150">
+ <div align="right">
+ <xsl:choose>
+ <xsl:when test="$prev">
+ <a rel="previous" accesskey="P">
+ <xsl:attribute name="href">
+ <xsl:apply-templates select="$prev" mode="filename"/>
+ </xsl:attribute>
+ <img border="0" width="32" height="32"
+ alt=" Previous" title="{$prev/title}">
+ <xsl:attribute name="src">
+ <xsl:call-template name="prev.image"/>
+ </xsl:attribute>
+ </img>
+ </a>
+ </xsl:when>
+ <xsl:otherwise>
+ <img border="0" width="32" height="32" alt=" Previous" title="">
+ <xsl:attribute name="src">
+ <xsl:call-template name="no.prev.image"/>
+ </xsl:attribute>
+ </img>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:choose>
+ <xsl:when test="$tocfile != ''">
+ <a rel="contents" href="{$tocfile}" accesskey="C">
+ <img border="0" width="32" height="32"
+ alt=" Contents" title="Table of Contents">
+ <xsl:attribute name="src">
+ <xsl:call-template name="toc.image"/>
+ </xsl:attribute>
+ </img>
+ </a>
+ </xsl:when>
+ <xsl:otherwise>
+ <img border="0" width="32" height="32"
+ alt=" Contents" title="Table of Contents">
+ <xsl:attribute name="src">
+ <xsl:call-template name="no.toc.image"/>
+ </xsl:attribute>
+ </img>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:choose>
+ <xsl:when test="$next">
+ <a rel="next" accesskey="N">
+ <xsl:attribute name="href">
+ <xsl:apply-templates select="$next" mode="filename"/>
+ </xsl:attribute>
+ <img border="0" width="32" height="32"
+ alt=" Next" title="{$next/title}">
+ <xsl:attribute name="src">
+ <xsl:call-template name="next.image"/>
+ </xsl:attribute>
+ </img>
+ </a>
+ </xsl:when>
+ <xsl:otherwise>
+ <img border="0" width="32" height="32" alt=" Next" title="">
+ <xsl:attribute name="src">
+ <xsl:call-template name="no.next.image"/>
+ </xsl:attribute>
+ </img>
+ </xsl:otherwise>
+ </xsl:choose>
+ </div>
+ </td>
+ </tr>
+ </table>
+
+ <xsl:apply-templates select="title"/>
+ <hr class="top-nav-sep"/>
+ </div>
+</xsl:template>
+
+<xsl:template name="bottom-nav">
+ <xsl:param name="home"/>
+ <xsl:param name="up"/>
+ <xsl:param name="next"/>
+ <xsl:param name="prev"/>
+ <xsl:param name="tocfile" select="$toc.html"/>
+
+ <div class="navfoot">
+ <hr class="bottom-nav-sep"/>
+ <table class="footer" cellspacing="0" cellpadding="0" border="0" width="97%"
+ summary="footer">
+ <tr>
+ <td align="left" valign="top">
+ <xsl:variable name="author" select="(/slides/slidesinfo//author
+ |/slides/slidesinfo//editor)"/>
+ <xsl:for-each select="$author">
+ <xsl:choose>
+ <xsl:when test=".//email">
+ <a href="mailto:{.//email[1]}">
+ <xsl:call-template name="person.name"/>
+ </a>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="person.name"/>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:if test="position() &lt; last()">, </xsl:if>
+ </xsl:for-each>
+ </td>
+ <td align="right" valign="top">
+ <span class="index">
+ <xsl:value-of select="count(preceding::foil)
+ + count(preceding::foilgroup)
+ + count(ancestor::foilgroup)
+ + 1"/>
+ <xsl:text> of </xsl:text>
+ <xsl:value-of select="count(//foil|//foilgroup)"/>
+ </span>
+ </td>
+
+ <td valign="top" nowrap="nowrap" width="150">
+ <div align="right">
+ <xsl:choose>
+ <xsl:when test="$prev">
+ <a rel="previous" accesskey="P">
+ <xsl:attribute name="href">
+ <xsl:apply-templates select="$prev" mode="filename"/>
+ </xsl:attribute>
+ <img border="0" width="32" height="32"
+ alt=" Previous" title="{$prev/title}">
+ <xsl:attribute name="src">
+ <xsl:call-template name="prev.image"/>
+ </xsl:attribute>
+ </img>
+ </a>
+ </xsl:when>
+ <xsl:otherwise>
+ <img border="0" width="32" height="32" alt=" Prev" title="">
+ <xsl:attribute name="src">
+ <xsl:call-template name="no.prev.image"/>
+ </xsl:attribute>
+ </img>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:choose>
+ <xsl:when test="$next">
+ <a rel="next" accesskey="N">
+ <xsl:attribute name="href">
+ <xsl:apply-templates select="$next" mode="filename"/>
+ </xsl:attribute>
+ <img border="0" width="32" height="32"
+ alt=" Next" title="{$next/title}">
+ <xsl:attribute name="src">
+ <xsl:call-template name="next.image"/>
+ </xsl:attribute>
+ </img>
+ </a>
+ </xsl:when>
+ <xsl:otherwise>
+ <img border="0" width="32" height="32" alt=" Next" title="">
+ <xsl:attribute name="src">
+ <xsl:call-template name="no.next.image"/>
+ </xsl:attribute>
+ </img>
+ </xsl:otherwise>
+ </xsl:choose>
+ </div>
+ </td>
+ </tr>
+ </table>
+ </div>
+</xsl:template>
+
+<!-- ====================================================================== -->
+
+<xsl:template name="titlepage-top-nav">
+ <xsl:param name="home"/>
+ <xsl:param name="up"/>
+ <xsl:param name="next"/>
+ <xsl:param name="prev"/>
+ <xsl:param name="tocfile" select="$toc.html"/>
+
+ <div class="navhead">
+ <table class="navbar" cellspacing="0" cellpadding="0" border="0" width="97%"
+ summary="Navigation buttons">
+ <tr>
+ <td align="left" valign="top">
+ <xsl:call-template name="logo"/>
+ </td>
+ <td valign="top" nowrap="nowrap" width="150">
+ <div align="right">
+ <xsl:choose>
+ <xsl:when test="$prev">
+ <a rel="previous" accesskey="P">
+ <xsl:attribute name="href">
+ <xsl:apply-templates select="$prev" mode="filename"/>
+ </xsl:attribute>
+ <img border="0" width="32" height="32"
+ alt=" Previous" title="{$prev/title}">
+ <xsl:attribute name="src">
+ <xsl:call-template name="prev.image"/>
+ </xsl:attribute>
+ </img>
+ </a>
+ </xsl:when>
+ <xsl:otherwise>
+ <img border="0" width="32" height="32" alt=" Previous" title="">
+ <xsl:attribute name="src">
+ <xsl:call-template name="no.prev.image"/>
+ </xsl:attribute>
+ </img>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:choose>
+ <xsl:when test="$tocfile != ''">
+ <a rel="contents" href="{$tocfile}" accesskey="C">
+ <img border="0" width="32" height="32"
+ alt=" Contents" title="Table of Contents">
+ <xsl:attribute name="src">
+ <xsl:call-template name="toc.image"/>
+ </xsl:attribute>
+ </img>
+ </a>
+ </xsl:when>
+ <xsl:otherwise>
+ <img border="0" width="32" height="32"
+ alt=" Contents" title="Table of Contents">
+ <xsl:attribute name="src">
+ <xsl:call-template name="no.toc.image"/>
+ </xsl:attribute>
+ </img>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:choose>
+ <xsl:when test="$next">
+ <a rel="next" accesskey="N">
+ <xsl:attribute name="href">
+ <xsl:apply-templates select="$next" mode="filename"/>
+ </xsl:attribute>
+ <img border="0" width="32" height="32"
+ alt=" Next" title="{$next/title}">
+ <xsl:attribute name="src">
+ <xsl:call-template name="next.image"/>
+ </xsl:attribute>
+ </img>
+ </a>
+ </xsl:when>
+ <xsl:otherwise>
+ <img border="0" width="32" height="32" alt=" Next" title="">
+ <xsl:attribute name="src">
+ <xsl:call-template name="no.next.image"/>
+ </xsl:attribute>
+ </img>
+ </xsl:otherwise>
+ </xsl:choose>
+ </div>
+ </td>
+ </tr>
+ </table>
+
+ <hr class="top-nav-sep"/>
+ </div>
+</xsl:template>
+
+<!-- ====================================================================== -->
+
+<xsl:template name="foil-body">
+ <xsl:param name="home"/>
+ <xsl:param name="up"/>
+ <xsl:param name="next"/>
+ <xsl:param name="prev"/>
+ <xsl:param name="tocfile" select="$toc.html"/>
+
+ <!-- skip the title -->
+ <xsl:apply-templates select="*[name(.) != 'title']"/>
+</xsl:template>
+
+<xsl:template name="foilgroup-body">
+ <xsl:param name="home"/>
+ <xsl:param name="up"/>
+ <xsl:param name="next"/>
+ <xsl:param name="prev"/>
+ <xsl:param name="tocfile" select="$toc.html"/>
+
+ <!-- skip the title -->
+ <xsl:apply-templates select="*[name(.) != 'title'
+ and name(.) != 'foil'
+ and name(.) != 'foilgroup']"/>
+
+ <xsl:if test="$foilgroup.toc != 0">
+ <dl class="toc">
+ <xsl:apply-templates select="foil" mode="toc"/>
+ </dl>
+ </xsl:if>
+</xsl:template>
+
+<!-- ====================================================================== -->
+
+<xsl:template match="@*" mode="copy">
+ <xsl:attribute name="{local-name(.)}">
+ <xsl:value-of select="."/>
+ </xsl:attribute>
+</xsl:template>
+
+<xsl:template match="html:*" xmlns:html='http://www.w3.org/1999/xhtml'>
+ <xsl:element name="{local-name(.)}" namespace="">
+ <xsl:apply-templates select="@*" mode="copy"/>
+ <xsl:apply-templates/>
+ </xsl:element>
+</xsl:template>
+
+<!-- ====================================================================== -->
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/htmlhelp/htmlhelp.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/htmlhelp/htmlhelp.xsl
new file mode 100644
index 0000000..4a6b370
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/htmlhelp/htmlhelp.xsl
@@ -0,0 +1,89 @@
+<?xml version="1.0"?>
+<!DOCTYPE xsl:stylesheet [
+<!ENTITY lf '<xsl:text xmlns:xsl="http://www.w3.org/1999/XSL/Transform">&#xA;</xsl:text>'>
+]>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:doc="http://nwalsh.com/xsl/documentation/1.0"
+ xmlns:exsl="http://exslt.org/common"
+ xmlns:set="http://exslt.org/sets"
+ version="1.0"
+ exclude-result-prefixes="doc exsl set">
+
+<!-- ********************************************************************
+ $Id: htmlhelp.xsl 6569 2007-01-30 07:03:13Z xmldoc $
+ ********************************************************************
+
+ This stylesheet can convert DocBook Slides document type into HTML Help.
+
+ ******************************************************************** -->
+
+<xsl:import href="../html/plain.xsl"/>
+<xsl:include href="../../htmlhelp/htmlhelp-common.xsl"/>
+
+<xsl:param name="keyboard.nav" select="0"/>
+<xsl:param name="htmlhelp.default.topic" select="'index.html'"/>
+
+<xsl:template match="slides" mode="title.markup">
+ <xsl:param name="allow-anchors" select="0"/>
+ <xsl:apply-templates select="(slidesinfo/title|title)[1]"
+ mode="title.markup">
+ <xsl:with-param name="allow-anchors" select="$allow-anchors"/>
+ </xsl:apply-templates>
+</xsl:template>
+
+<xsl:template match="slides|foilgroup" mode="hhc">
+ <xsl:variable name="title">
+ <xsl:if test="$htmlhelp.autolabel=1">
+ <xsl:variable name="label.markup">
+ <xsl:apply-templates select="." mode="label.markup"/>
+ </xsl:variable>
+ <xsl:if test="normalize-space($label.markup)">
+ <xsl:value-of select="concat($label.markup,$autotoc.label.separator)"/>
+ </xsl:if>
+ </xsl:if>
+ <xsl:apply-templates select="." mode="title.markup"/>
+ </xsl:variable>
+
+ <xsl:if test="$htmlhelp.hhc.show.root != 0 or parent::*">
+ <LI><OBJECT type="text/sitemap">&lf;
+ <param name="Name" value="{normalize-space($title)}"/>&lf;
+ <param name="Local">
+ <xsl:attribute name="value">
+ <xsl:apply-templates select="." mode="filename"/>
+ </xsl:attribute>
+ </param>
+ </OBJECT></LI>&lf;
+ </xsl:if>
+ <xsl:if test="foil|foilgroup">
+ <UL>&lf;
+ <xsl:apply-templates select="foil|foilgroup" mode="hhc"/>
+ </UL>&lf;
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="foil" mode="hhc">
+ <xsl:variable name="title">
+ <xsl:if test="$htmlhelp.autolabel=1">
+ <xsl:variable name="label.markup">
+ <xsl:apply-templates select="." mode="label.markup"/>
+ </xsl:variable>
+ <xsl:if test="normalize-space($label.markup)">
+ <xsl:value-of select="concat($label.markup,$autotoc.label.separator)"/>
+ </xsl:if>
+ </xsl:if>
+ <xsl:apply-templates select="." mode="title.markup"/>
+ </xsl:variable>
+
+ <xsl:if test="$htmlhelp.hhc.show.root != 0 or parent::*">
+ <LI><OBJECT type="text/sitemap">&lf;
+ <param name="Name" value="{normalize-space($title)}"/>&lf;
+ <param name="Local">
+ <xsl:attribute name="value">
+ <xsl:apply-templates select="." mode="filename"/>
+ </xsl:attribute>
+ </param>
+ </OBJECT></LI>&lf;
+ </xsl:if>
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/keynote/default.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/keynote/default.xsl
new file mode 100644
index 0000000..7ff90b1
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/keynote/default.xsl
@@ -0,0 +1,600 @@
+<xsl:stylesheet version='1.0'
+ xmlns:xsl='http://www.w3.org/1999/XSL/Transform'
+ xmlns='http://developer.apple.com/schemas/APXL'
+ xmlns:apxl='http://developer.apple.com/schemas/APXL'
+ xmlns:plugin='http://developer.apple.com/schemas/APXLPlugins'
+ xmlns:doc='http://nwalsh.com/xsl/documentation/1.0'
+ xmlns:str='http://xsltsl.org/string'
+ xmlns:math='http://xsltsl.org/math'
+ exclude-result-prefixes='doc str math'>
+
+ <xsl:import href='xsltsl/stdlib.xsl'/>
+ <xsl:output method='xml' indent='yes' encoding='UTF-8'/>
+ <xsl:strip-space elements='*'/>
+
+ <doc:article xmlns=''>
+ <articleinfo>
+ <title>Keynote Slides</title>
+
+ <author>
+ <firstname>Steve</firstname>
+ <surname>Ball</surname>
+ <affiliation>
+ <orgname>Zveno</orgname>
+ <address>
+ <otheraddr>
+ <ulink url='http://www.zveno.com/'>zveno.com</ulink>
+ </otheraddr>
+ </address>
+ </affiliation>
+ </author>
+
+ <releaseinfo>$Id: default.xsl 3991 2004-11-10 06:51:55Z balls $</releaseinfo>
+
+ <copyright>
+ <year>2004</year>
+ <year>2003</year>
+ <holder>Steve Ball, Zveno Pty Ltd</holder>
+ </copyright>
+
+ <legalnotice>
+ <para>Zveno Pty Ltd makes this software and associated documentation available free of charge for any purpose. You may make copies of the software but you must include all of this notice on any copy.</para>
+ <para>Zveno Pty Ltd does not warrant that this software is error free or fit for any purpose. Zveno Pty Ltd disclaims any liability for all claims, expenses, losses, damages and costs any user may incur as a result of using, copying or modifying the software.</para>
+ </legalnotice>
+ </articleinfo>
+ </doc:article>
+
+ <xsl:param name='slides'/>
+
+ <xsl:variable name='slide-master' select='"Title &amp; Subtitle"'/>
+ <xsl:variable name='foilgroup-master' select='"Title - Center"'/>
+ <xsl:variable name='overview-master' select='"Title - Top"'/>
+ <xsl:variable name='bullet-master' select='"SmlTitle &amp; Bullets"'/>
+ <xsl:variable name='bullet-and-image-master' select='"Title &amp; Bullets - Left"'/>
+ <xsl:variable name='title-only-master' select='"SmlTitle"'/>
+
+ <xsl:variable name='masters' select='/apxl:presentation/apxl:theme/apxl:master-slides'/>
+
+ <xsl:template match='/'>
+ <xsl:choose>
+ <xsl:when test='$slides = ""'>
+ <xsl:message terminate='yes'>You must specify your slides document using the "slides" parameter</xsl:message>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+ <xsl:template match='apxl:slide-list'>
+ <slide-list>
+ <xsl:apply-templates select='document($slides)' mode='slides'/>
+ </slide-list>
+ </xsl:template>
+
+ <xsl:template match='slides' mode='slides'>
+ <slide id='slide-1' master-slide-id="{$masters/apxl:master-slide[@name=$slide-master]/@id}">
+ <drawables>
+ <body visibility='tracks-master' vertical-alignment='tracks-master'/>
+ <title visibility='tracks-master' vertical-alignment='tracks-master'/>
+ </drawables>
+ <transition-style type='inherited'/>
+ <thumbnails>
+ <thumbnail file='thumbs/st0.tiff' byte-size='6520' size='60 45'/>
+ </thumbnails>
+ <bullets>
+ <bullet marker-type='inherited' level='0'>
+ <content tab-stops='L 96' font-size='84' font-color='g1' font-name='GillSans' paragraph-alignment='center'>
+ <xsl:apply-templates select='slidesinfo/title/node()'/>
+ </content>
+ </bullet>
+ <xsl:choose>
+ <xsl:when test='slidesinfo/subtitle'>
+ <bullet marker-type='inherited' level='1'>
+ <content tab-stops='L 96' font-size='36' font-color='g1' font-name='GillSans' paragraph-alignment='center'>
+ <xsl:apply-templates select='slidesinfo/subtitle/node()' mode='slides'/>
+ </content>
+ </bullet>
+ </xsl:when>
+ <xsl:when test='slidesinfo/corpauthor'>
+ <bullet marker-type='inherited' level='1'>
+ <content tab-stops='L 96' font-size='36' font-color='g1' font-name='GillSans' paragraph-alignment='center'>
+ <xsl:apply-templates select='slidesinfo/corpauthor/node()' mode='slides'/>
+ </content>
+ </bullet>
+ </xsl:when>
+ <xsl:when test='slidesinfo/author'>
+ <bullet marker-type='inherited' level='1'>
+ <content tab-stops='L 96' font-size='36' font-color='g1' font-name='GillSans' paragraph-alignment='center'>
+ <xsl:apply-templates select='slidesinfo/author' mode='slides'/>
+ </content>
+ </bullet>
+ </xsl:when>
+ </xsl:choose>
+ </bullets>
+ <notes font-size='18' font-name='LucidaGrande'>
+ <xsl:apply-templates select='slidesinfo/*[not(self::title|self::subtitle|self::corpauthor|self::author)]' mode='slides'/>
+ </notes>
+ </slide>
+
+ <xsl:if test='foilgroup'>
+ <xsl:call-template name='overview'/>
+ </xsl:if>
+
+ <xsl:apply-templates select='foilgroup|foil' mode='slides'/>
+ </xsl:template>
+
+ <xsl:template name='overview'>
+ <xsl:param name='current' select='/'/>
+
+ <slide id='overview-{generate-id()}' master-slide-id="{$masters/apxl:master-slide[@name=$overview-master]/@id}">
+ <drawables>
+ <body visibility='tracks-master' vertical-alignment='tracks-master'/>
+ <title visibility='tracks-master' vertical-alignment='tracks-master'/>
+
+ <xsl:for-each select='ancestor-or-self::slides/foilgroup'>
+ <textbox id='textbox-{position()}' grow-horizontally='true' transformation='1 0 0 1 {100 + floor((position() - 1) div 10) * 400} {200 + floor((position() - 1) mod 10) * 50}' size='200 50'>
+ <content tab-stops='L 84' font-size='36' paragraph-alignment='left'>
+ <xsl:attribute name='font-color'>
+ <xsl:choose>
+ <xsl:when test='generate-id() = generate-id($current)'>
+ <xsl:text>1 0.5 0</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>g1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:attribute>
+ <xsl:apply-templates select='title' mode='slides'/>
+ </content>
+ </textbox>
+ </xsl:for-each>
+
+ </drawables>
+ <transition-style type='inherited'/>
+ <thumbnails>
+ <thumbnail file='thumbs/st0.tiff' byte-size='6520' size='60 45'/>
+ </thumbnails>
+ <bullets>
+ <bullet marker-type='inherited' level='0'>
+ <content tab-stops='L 96' font-size='84' font-color='g1' font-name='GillSans' paragraph-alignment='center'>Overview</content>
+ </bullet>
+ </bullets>
+ </slide>
+ </xsl:template>
+
+ <xsl:template match='author' mode='slides'>
+ <xsl:apply-templates select='firstname/node()' mode='slides'/>
+ <xsl:text> </xsl:text>
+ <xsl:apply-templates select='surname/node()' mode='slides'/>
+ </xsl:template>
+ <xsl:template match='copyright' mode='slides'>
+ <xsl:text>Copyright (c) </xsl:text>
+ <xsl:value-of select='year'/>
+ <xsl:text> </xsl:text>
+ <xsl:apply-templates select='holder' mode='slides'/>
+ <xsl:text>. </xsl:text>
+ </xsl:template>
+
+ <xsl:template match='foilgroup' mode='slides'>
+ <xsl:variable name='number' select='count(preceding-sibling::foilgroup) + count(preceding::foil) + 1'/>
+
+ <xsl:call-template name='overview'>
+ <xsl:with-param name='current' select='.'/>
+ </xsl:call-template>
+
+ <slide id='foilgroup-{generate-id()}'>
+ <xsl:attribute name='master-slide-id'>
+ <xsl:choose>
+ <xsl:when test='*[not(self::foil|self::foilgroupinfo|self::speakernotes)]'>
+ <xsl:value-of select='$masters/apxl:master-slide[@name=$title-only-master]/@id'/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select='$masters/apxl:master-slide[@name=$foilgroup-master]/@id'/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:attribute>
+
+ <drawables>
+ <title visibility='tracks-master' vertical-alignment='tracks-master'/>
+ <body visibility='hidden' vertical-alignment='tracks-master'/>
+ <xsl:call-template name='drawables'/>
+ </drawables>
+ <transition-style type='inherited'/>
+ <thumbnails>
+ <thumbnail file='thumbs/st0.tiff' byte-size='6520' size='60 45'/>
+ </thumbnails>
+ <bullets>
+ <bullet marker-type='inherited' level='0'>
+ <content tab-stops='L 96' font-size='84' font-color='g1' font-name='GillSans' paragraph-alignment='center'>
+ <xsl:apply-templates select='title' mode='slides'/>
+ </content>
+ </bullet>
+
+ <xsl:apply-templates select='itemizedlist/listitem' mode='slides'/>
+ </bullets>
+ <xsl:if test='speakernotes'>
+ <notes font-size='18' font-name='LucidaGrande'>
+ <xsl:apply-templates select='speakernotes/para[1]/node()' mode='slides'/>
+ <xsl:for-each select='speakernotes/para[position() != 1]'>
+ <xsl:text>; </xsl:text>
+ <xsl:apply-templates select='node()' mode='slides'/>
+ </xsl:for-each>
+ </notes>
+ </xsl:if>
+ </slide>
+
+ <xsl:apply-templates select='foil' mode='slides'/>
+
+ </xsl:template>
+
+ <xsl:template match='foil' mode='slides'>
+ <xsl:variable name='number' select='count(preceding::foilgroup) + count(preceding::foil) + count(preceding-sibling::foil) + 1'/>
+
+ <slide id='foil-{generate-id()}'>
+ <xsl:attribute name='master-slide-id'>
+ <xsl:choose>
+ <xsl:when test='imageobject'>
+ <xsl:value-of select='$masters/apxl:master-slide[@name=$title-only-master]/@id'/>
+ </xsl:when>
+ <xsl:when test='itemizedlist[.//imageobject]'>
+ <xsl:value-of select='$masters/apxl:master-slide[@name=$bullet-and-image-master]/@id'/>
+ </xsl:when>
+ <xsl:when test='itemizedlist'>
+ <xsl:value-of select='$masters/apxl:master-slide[@name=$bullet-master]/@id'/>
+ </xsl:when>
+ <xsl:when test='example|informalexample'>
+ <xsl:value-of select='$masters/apxl:master-slide[@name=$title-only-master]/@id'/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select='$masters/apxl:master-slide[@name=$bullet-master]/@id'/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:attribute>
+ <drawables>
+ <body visibility='tracks-master' vertical-alignment='tracks-master'/>
+ <title visibility='tracks-master' vertical-alignment='tracks-master'/>
+ <xsl:call-template name='drawables'/>
+ </drawables>
+ <transition-style type='inherited'/>
+ <thumbnails>
+ <thumbnail file='thumbs/st0.tiff' byte-size='6520' size='60 45'/>
+ </thumbnails>
+ <bullets>
+ <bullet marker-type='inherited' level='0'>
+ <content tab-stops='L 96' font-size='64' font-color='g1' font-name='GillSans' paragraph-alignment='inherited'>
+ <!--
+ <xsl:apply-templates select='../title' mode='slides'/>
+ <xsl:text>: </xsl:text>
+-->
+ <xsl:apply-templates select='title' mode='slides'/>
+ </content>
+ </bullet>
+ <xsl:apply-templates select='itemizedlist/listitem' mode='slides'/>
+ </bullets>
+ <xsl:if test='speakernotes'>
+ <notes font-size='18' font-name='LucidaGrande'>
+ <xsl:apply-templates select='speakernotes/para[1]/node()' mode='slides'/>
+ <xsl:for-each select='speakernotes/para[position() != 1]'>
+ <xsl:text>; </xsl:text>
+ <xsl:apply-templates select='node()' mode='slides'/>
+ </xsl:for-each>
+ </notes>
+ </xsl:if>
+ </slide>
+ </xsl:template>
+
+ <doc:template xmlns=''>
+ <title>drawables Template</title>
+
+ <para>This template adds objects to the drawables section of a foil. These include images, as well as unadorned (non-bullet) text.</para>
+
+ <para>A single image is placed centered on the foil. An image on a foil that contains other text is placed on the right-hand-side.</para>
+ </doc:template>
+
+ <xsl:template name='drawables'>
+ <xsl:choose>
+ <xsl:when test='imageobject'>
+ <plugin opacity='1' transformation='1 0 0 1 140 130'>
+ <plugin-data>
+ <plugin:movie bundled='true' src='{imageobject/imagedata/@fileref}' key='root' width='740' height='560'/>
+ <string key='CPVersion'>1.0</string>
+ <string key='MIMEType'>video/quicktime</string>
+ </plugin-data>
+ <styles>
+ <shadow-style opacity='0' radius='0'/>
+ </styles>
+ </plugin>
+ </xsl:when>
+ <xsl:when test='false() and .//informaltable|.//table'>
+ <xsl:variable name='table' select='.//informaltable|.//table[1]'/>
+ <xsl:variable name='cells' select='$table/tgroup/*/row/entry'/>
+ <xsl:variable name='numrows' select='count($table/tgroup/*/row)'/>
+ <xsl:variable name='numcols' select='count($table/tgroup/*[1]/row[1]/entry)'/>
+ <xsl:variable name='identbase' select='count($table/preceding::node())'/>
+
+ <plugin transformation='1 0 0 1 200 200'>
+ <plugin-data>
+ <plugin:table key='root' version='1.2'>
+ <xsl:attribute name='size'>
+ <xsl:text>{800, 400}</xsl:text>
+ </xsl:attribute>
+
+ <dict/>
+ <xsl:for-each select='$cells'>
+ <plugin:element type='text' tr='5834' bl='5838' tl='5833' br='5839'>
+ <xsl:attribute name='tl'>
+ <xsl:value-of select='$identbase + (floor(position() div $numcols) * ($numcols + 1)) + (position() mod $numcols)'/>
+ </xsl:attribute>
+ <xsl:attribute name='tr'>
+ <xsl:value-of select='$identbase + (floor(position() div $numcols) * ($numcols + 1)) + (position() mod $numcols) + 1'/>
+ </xsl:attribute>
+ <xsl:attribute name='bl'>
+ <xsl:value-of select='$identbase + (floor(position() div $numcols) * ($numcols + 1) + 1) + (position() mod $numcols)'/>
+ </xsl:attribute>
+ <xsl:attribute name='br'>
+ <xsl:value-of select='$identbase + (floor(position() div $numcols) * ($numcols + 1) + 1) + (position() mod $numcols) + 1'/>
+ </xsl:attribute>
+ <plugin:node ident='5833'>
+ <xsl:attribute name='pos'>
+ <xsl:text>{0, 300}</xsl:text>
+ </xsl:attribute>
+ </plugin:node>
+ <plugin:node ident='5834'>
+ <xsl:attribute name='pos'>
+ <xsl:text>{150, 300}</xsl:text>
+ </xsl:attribute>
+ </plugin:node>
+ <plugin:node ident='5838'>
+ <xsl:attribute name='pos'>
+ <xsl:text>{0, 200}</xsl:text>
+ </xsl:attribute>
+ </plugin:node>
+ <plugin:node ident='5839'>
+ <xsl:attribute name='pos'>
+ <xsl:text>{150, 200}</xsl:text>
+ </xsl:attribute>
+ </plugin:node>
+ <content tab-stops='L 84' font-size='32' font-color='g1' font-name='GillSans' paragraph-alignment='center'>
+ <xsl:value-of select='$cells[1]'/>
+ </content>
+ <dict/>
+ </plugin:element>
+
+ </xsl:for-each>
+ </plugin:table>
+ </plugin-data>
+ </plugin>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:if test='not(self::foilgroup) and .//imageobject'>
+ <xsl:variable name='base'>
+ <xsl:call-template name='str:substring-after-last'>
+ <xsl:with-param name='text' select='.//imageobject/imagedata/@fileref'/>
+ <xsl:with-param name='chars' select='"/"'/>
+ </xsl:call-template>
+ </xsl:variable>
+ <image display-name='{$base}' id='image-1' image-data='{.//imageobject/imagedata/@fileref}' byte-size='1' transformation='1 0 0 1 500 200' natural-size='{.//imageobject/imagedata/@width} {.//imageobject/imagedata/@height}' lock-aspect-ratio='true'/>
+ </xsl:if>
+ <xsl:apply-templates select='para|informalexample|example' mode='slides'/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+ <xsl:template match='itemizedlist/listitem' mode='slides'>
+ <bullet marker-type='inherited' level='{count(ancestor::itemizedlist)}'>
+ <content tab-stops='L 96' font-size='36' font-color='g1' font-name='GillSans' paragraph-alignment='left'>
+ <xsl:apply-templates select='para|informalexample' mode='slides'/>
+ </content>
+ </bullet>
+ <xsl:apply-templates select='itemizedlist/listitem' mode='slides'/>
+ </xsl:template>
+ <xsl:template match='listitem/para|listitem/informalexample' mode='slides'>
+ <xsl:if test='preceding-sibling::*'>
+ <xsl:text>
+
+</xsl:text>
+ </xsl:if>
+ <xsl:apply-templates mode='slides'/>
+ </xsl:template>
+ <xsl:template match='listitem/informalexample/programlisting' mode='slides'>
+ <textbox transformation='1 0 0 1 110 260' size='830 82'>
+ <content tab-stops='L 84' font-size='36' font-color='g1' font-name='AmericanTypewriter-CondensedBold' paragraph-alignment='left'>
+ <xsl:call-template name='literallayout'/>
+ </content>
+ </textbox>
+ </xsl:template>
+
+ <xsl:template name='literallayout'>
+ <xsl:param name='nodes' select='node()'/>
+ <xsl:param name='inCDATA' select='false()'/>
+
+ <xsl:choose>
+ <xsl:when test='not($nodes) and $inCDATA'>
+ <xsl:text disable-output-escaping='yes'>]]&gt;</xsl:text>
+ </xsl:when>
+ <xsl:when test='not($nodes)'/>
+ <xsl:when test='$nodes[1][self::emphasis] and $inCDATA'>
+ <xsl:text disable-output-escaping='yes'>]]&gt;</xsl:text>
+ <xsl:apply-templates select='$nodes[1]' mode='literal'/>
+ <xsl:call-template name='literallayout'>
+ <xsl:with-param name='nodes' select='$nodes[position() != 1]'/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test='$nodes[1][self::emphasis]'>
+ <xsl:apply-templates select='$nodes[1]' mode='literal'/>
+ <xsl:call-template name='literallayout'>
+ <xsl:with-param name='nodes' select='$nodes[position() != 1]'/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test='$inCDATA'>
+ <xsl:apply-templates select='$nodes[1]' mode='literal'/>
+ <xsl:call-template name='literallayout'>
+ <xsl:with-param name='nodes' select='$nodes[position() != 1]'/>
+ <xsl:with-param name='inCDATA' select='$inCDATA'/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text disable-output-escaping='yes'>&lt;![CDATA[</xsl:text>
+ <xsl:apply-templates select='$nodes[1]' mode='literal'/>
+ <xsl:call-template name='literallayout'>
+ <xsl:with-param name='nodes' select='$nodes[position() != 1]'/>
+ <xsl:with-param name='inCDATA' select='true()'/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+ <xsl:template match='para' mode='slides'>
+ <textbox transformation='1 0 0 1 110 {200 + count(preceding-sibling::para|preceding-sibling::informalexample) * 60}' size='830 41'>
+ <content tab-stops='L 84' font-size='36' font-color='g1' paragraph-alignment='left'>
+ <xsl:attribute name='font-name'>
+ <xsl:choose>
+ <xsl:when test='@font-style = "italic"'>GillSans-Italic</xsl:when>
+ <xsl:otherwise>GillSans</xsl:otherwise>
+ </xsl:choose>
+ </xsl:attribute>
+
+ <xsl:apply-templates mode='slides'/>
+ </content>
+ </textbox>
+ </xsl:template>
+
+ <xsl:template match='text()' mode='slides'>
+ <xsl:variable name='tmp'>
+ <xsl:call-template name='str:subst'>
+ <xsl:with-param name='text' select='.'/>
+ <xsl:with-param name='replace'>&quot;</xsl:with-param>
+ <xsl:with-param name='with'>“</xsl:with-param>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:variable name='content'>
+ <xsl:call-template name='str:subst'>
+ <xsl:with-param name='text' select='$tmp'/>
+ <xsl:with-param name='replace'>]]&gt;</xsl:with-param>
+ <xsl:with-param name='with'>]] &gt;</xsl:with-param>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:choose>
+ <xsl:when test='ancestor::programlisting'>
+ <xsl:value-of disable-output-escaping='yes' select='$content'/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select='$content'/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+ <xsl:template match='text()' mode='literal'>
+ <xsl:variable name='tmp'>
+ <xsl:call-template name='str:subst'>
+ <xsl:with-param name='text' select='.'/>
+ <xsl:with-param name='replace'>&lt;</xsl:with-param>
+ <xsl:with-param name='with'>&lt;</xsl:with-param>
+ <xsl:with-param name='disable-output-escaping' select='yes'/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:variable name='tmp2'>
+ <xsl:call-template name='str:subst'>
+ <xsl:with-param name='text' select='$tmp'/>
+ <xsl:with-param name='replace'>]]&gt;</xsl:with-param>
+ <xsl:with-param name='with'>]] &gt;</xsl:with-param>
+ <xsl:with-param name='disable-output-escaping' select='yes'/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:value-of select='$tmp2' disable-output-escaping='yes'/>
+ </xsl:template>
+
+ <xsl:template match='informalexample|example' mode='slides'>
+ <xsl:apply-templates mode='slides'/>
+ </xsl:template>
+ <xsl:template match='programlisting' mode='slides'>
+ <xsl:variable name='lines'>
+ <xsl:call-template name='str:count-substring'>
+ <xsl:with-param name='text' select='text()'/>
+ <xsl:with-param name='chars' select='"&#x0a;"'/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:variable name='offset'>
+ <xsl:choose>
+ <xsl:when test='string-length(../preceding-sibling::para) > 45'>20</xsl:when>
+ <xsl:otherwise>0</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <!-- xsl:comment> layout programlisting with offset <xsl:value-of select='$offset'/> have preceding-sibling para? <xsl:value-of select='count(../preceding-sibling::para)'/> length <xsl:value-of select='string-length(../preceding-sibling::para)'/></xsl:comment -->
+ <textbox transformation='1 0 0 1 110 {200 + $offset + count(preceding-sibling::para|../preceding-sibling::para|preceding-sibling::informalexample|preceding-sibling::example) * 60}' size='830 {($lines + 1) * 41}'>
+ <content tab-stops='L 84' font-size='36' font-color='g1' font-name='AmericanTypewriter-CondensedBold' paragraph-alignment='left'>
+ <xsl:choose>
+ <xsl:when test='emphasis'>
+ <xsl:call-template name='literallayout'/>
+ </xsl:when>
+ <xsl:otherwise>
+ <span>
+ <xsl:call-template name='literallayout'/>
+ </span>
+ </xsl:otherwise>
+ </xsl:choose>
+ </content>
+ </textbox>
+ </xsl:template>
+
+ <xsl:template match='emphasis' mode='literal'>
+ <span>
+ <xsl:choose>
+ <xsl:when test='ancestor::programlisting and @font-style = "italic" and @font-weight="bold"'>
+ <xsl:attribute name='font-name'>AmericanTypewriter-CondensedBoldItalic</xsl:attribute>
+ </xsl:when>
+ <xsl:when test='@font-style = "italic" and @font-weight="bold"'>
+ <xsl:attribute name='font-name'>GillSans-BoldItalic</xsl:attribute>
+ </xsl:when>
+ <xsl:when test='ancestor::programlisting and @font-style = "italic"'>
+ <xsl:attribute name='font-name'>AmericanTypewriter-CondensedItalic</xsl:attribute>
+ </xsl:when>
+ <xsl:when test='@font-style = "italic"'>
+ <xsl:attribute name='font-name'>GillSans-Italic</xsl:attribute>
+ </xsl:when>
+ <xsl:when test='ancestor::programlisting and @font-weight = "bold"'>
+ <xsl:attribute name='font-name'>AmericanTypewriter-CondensedBold</xsl:attribute>
+ </xsl:when>
+ <xsl:when test='@font-weight = "bold"'>
+ <xsl:attribute name='font-name'>GillSans-Bold</xsl:attribute>
+ </xsl:when>
+ </xsl:choose>
+ <xsl:if test='@fill'>
+ <xsl:attribute name='font-color'>
+ <xsl:variable name='red'>
+ <xsl:call-template name='math:cvt-hex-decimal'>
+ <xsl:with-param name='value' select='substring(@fill, 2, 2)'/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:variable name='green'>
+ <xsl:call-template name='math:cvt-hex-decimal'>
+ <xsl:with-param name='value' select='substring(@fill, 4, 2)'/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:variable name='blue'>
+ <xsl:call-template name='math:cvt-hex-decimal'>
+ <xsl:with-param name='value' select='substring(@fill, 6, 2)'/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:value-of select='$red div 255'/>
+ <xsl:text> </xsl:text>
+ <xsl:value-of select='$green div 255'/>
+ <xsl:text> </xsl:text>
+ <xsl:value-of select='$blue div 255'/>
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:call-template name='literallayout'/>
+ </span>
+ </xsl:template>
+
+ <xsl:template match="*">
+ <xsl:copy>
+ <xsl:for-each select="@*">
+ <xsl:copy/>
+ </xsl:for-each>
+ <xsl:apply-templates/>
+ </xsl:copy>
+ </xsl:template>
+ <xsl:template match="comment()|processing-instruction()">
+ <xsl:copy/>
+ </xsl:template>
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/keynote/xsltsl/cmp.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/keynote/xsltsl/cmp.xsl
new file mode 100644
index 0000000..6e2866d
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/keynote/xsltsl/cmp.xsl
@@ -0,0 +1,348 @@
+<?xml version="1.0"?>
+
+<xsl:stylesheet
+ version="1.0"
+ extension-element-prefixes="doc"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:doc="http://xsltsl.org/xsl/documentation/1.0"
+ xmlns:str="http://xsltsl.org/string"
+ xmlns:cmp="http://xsltsl.org/cmp"
+ exclude-result-prefixes="cmp str doc"
+>
+
+ <doc:reference xmlns="">
+ <referenceinfo>
+ <releaseinfo role="meta">
+ $Id: cmp.xsl 6297 2006-09-14 01:32:27Z xmldoc $
+ </releaseinfo>
+ <author>
+ <surname>Hummel</surname>
+ <firstname>Mark</firstname>
+ </author>
+ <copyright>
+ <year>2003</year>
+ <holder>Mark Hummel</holder>
+ </copyright>
+ </referenceinfo>
+
+ <title>XML Compare</title>
+
+ <partintro>
+ <section>
+ <title>Introduction</title>
+
+ <para>This module provides a template for comparing two xml documents. </para>
+
+ </section>
+ </partintro>
+
+ </doc:reference>
+
+
+ <doc:template name="cmp:diff">
+ <refpurpose>Find differences</refpurpose>
+
+ <refdescription>
+ <para>Compare two xml documents and display differences. Two xml documents are defined to be the same if: They have the matching elements and attributes, and that the data in the elements also match. The comparison is order sensitive. </para>
+
+ <para>The element names from the documents at the current depth are compared, followed by their values, then any attribute names and values are compared. The process is applied then to the subtrees of the documents.</para>
+
+ <para>Notes: If there are leaf nodes in one nodeset which don't exist in the other, the value of those 'extra' elements won't appear as a difference.
+ </para>
+ </refdescription>
+
+ <refparameter>
+ <variablelist>
+ <varlistentry>
+ <term>ns1</term>
+ <term>ns2</term>
+ <listitem>
+ <para>The two nodesets which are to be compared. </para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+
+ <refreturn>
+ <para>Returns the difference between the documents. </para>
+
+ <para>The format of the output is an xml document. A node is added to the result tree for every difference. The node contains the type of difference (e.g element name difference, attribute value difference, etc), the value in the first nodeset and the value in the second nodeset, and the parent node. The indentation level is the depth at which the difference was found relative to the first document. </para>
+
+ </refreturn>
+ </doc:template>
+
+ <!-- pass in a nodeset and compare. Is order sensitive. Output attribute, element and textual differences. -->
+
+ <xsl:template name="cmp:diff">
+ <xsl:param name="ns1"/>
+ <xsl:param name="ns2"/>
+
+ <!-- attribute compare -->
+ <!-- Optimisation attempt
+
+ Can probaby change this into one loop ie -
+ <xsl:for-each
+ i = position
+ if node1[i] = node2[i]...
+
+ -->
+
+ <!-- Need to check if there are two sets of attributes -->
+ <xsl:choose>
+ <xsl:when test='count($ns1/attribute::*) = count($ns2/attribute::*)'>
+ <xsl:for-each select="$ns1/attribute::*">
+ <xsl:variable name="name1" select="name()"/>
+ <xsl:variable name="value1" select="."/>
+ <xsl:variable name="i" select="position()"/>
+
+ <xsl:for-each select="$ns2/attribute::*">
+
+ <xsl:variable name="j" select="position()"/>
+ <xsl:variable name="name2" select="name()"/>
+ <xsl:variable name="value2" select="."/>
+
+ <xsl:if test="$i = $j">
+ <xsl:if test="$name1 != $name2">
+ <attributeNameDifference>
+ <parentElement><xsl:value-of select="name(..)"/></parentElement>
+ <before><xsl:value-of select="$name1"/></before>
+ <after><xsl:value-of select="$name2"/></after>
+ </attributeNameDifference>
+ </xsl:if>
+
+ <xsl:if test="$name1 = $name2 and $value1 != $value2">
+ <attributeValueDifference>
+ <parentElement><xsl:value-of select="name(..)"/></parentElement>
+ <before><xsl:value-of select="$value1"/></before>
+ <after><xsl:value-of select="$value2"/></after>
+ </attributeValueDifference>
+ </xsl:if>
+
+ </xsl:if>
+ </xsl:for-each>
+ </xsl:for-each>
+ </xsl:when>
+ <xsl:otherwise>
+ <attributeNameDifference>
+ <parentElement>
+ <xsl:value-of select="name(..)"/>
+ </parentElement>
+ <before><xsl:value-of select='$ns1/attribute::*'/></before>
+ <after><xsl:value-of select='$ns2/attribute::*'/></after>
+ </attributeNameDifference>
+ </xsl:otherwise>
+ </xsl:choose>
+
+
+ <!-- Find element differences by comparing the element names from the same position in both documents. Iterate over all the nodes in the nodeset with the largest number of elements, so the extra elements will appear as differences. -->
+
+ <xsl:choose>
+ <!-- Define loop direction based on which tree has more nodes
+ FIXME: Replacing this with one for-each and a test for the case
+ of the second tree having more nodes would be more elegant
+
+ Solution: Add variable for direction and assign the 'larger' nodeset to that
+ variable. Then do one for-each.
+
+ FIXME: The solution is a bit too iterative. Make it more functional
+
+ -->
+ <xsl:when test="count($ns1) &gt; count($ns2)">
+ <xsl:for-each select="$ns1">
+ <xsl:variable name="i" select="position()"/>
+
+ <xsl:message>node[<xsl:value-of select='$i'/>]:
+ <xsl:value-of select='$ns1[$i]'/>
+ </xsl:message>
+
+ <!-- Element name compare -->
+ <xsl:if test="name($ns1[$i]) != name($ns2[$i])">
+ <elementNameDifference>
+ <parentElement><xsl:value-of select="name(..)"/></parentElement>
+ <before><xsl:value-of select="name($ns1[$i])"/></before>
+ <after><xsl:value-of select="name($ns2[$i])"/></after>
+ </elementNameDifference>
+ </xsl:if>
+
+ <!-- Element Value compare -->
+
+ <xsl:if test="count($ns1/*) = 0">
+ <xsl:if test="$ns1[$i] != $ns2[$i]">
+ <elementValueDifference>
+ <parentElement><xsl:value-of select="name(..)"/></parentElement>
+ <before><xsl:value-of select="$ns1[$i]"/></before>
+ <after><xsl:value-of select="$ns2[$i]"/></after>
+ </elementValueDifference>
+ </xsl:if>
+ </xsl:if>
+
+ </xsl:for-each>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:for-each select="$ns2">
+ <xsl:variable name="i" select="position()"/>
+
+ <!-- Element Name compare -->
+
+ <xsl:if test="name($ns1[$i]) != name($ns2[$i])">
+ <elementNameDifference>
+ <parentElement><xsl:value-of select="name(..)"/></parentElement>
+ <before><xsl:value-of select="name($ns1[$i])"/></before>
+ <after><xsl:value-of select="name($ns2[$i])"/></after>
+ </elementNameDifference>
+
+ </xsl:if>
+
+ <!-- value compare -->
+
+ <xsl:if test="count($ns2/*) = 0">
+ <xsl:if test="$ns2[$i] != $ns1[$i]">
+ <elementValueDifference>
+ <parentElement><xsl:value-of select="name(..)"/></parentElement>
+ <after><xsl:value-of select="$ns2[$i]"/></after>
+ <before><xsl:value-of select="$ns1[$i]"/></before>
+ </elementValueDifference>
+ </xsl:if>
+ </xsl:if>
+
+ </xsl:for-each>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <!-- stop processing when leaf node is reached. -->
+
+ <xsl:if test="count($ns1/*) &gt; 0 and count($ns2/*) &gt; 0">
+ <xsl:call-template name="cmp:diff">
+ <xsl:with-param name="ns1" select="$ns1/*"/>
+ <xsl:with-param name="ns2" select="$ns2/*"/>
+ </xsl:call-template>
+ </xsl:if>
+
+ </xsl:template>
+
+ <!-- Return false if the two nodesets are not identical
+ -->
+
+ <doc:template name="cmp:cmp">
+ <refpurpose>Compare</refpurpose>
+
+ <refdescription>
+ <para>Recursively compare two xml nodesets, stop when a difference is found and return false. Otherwise return true if the document is identical. </para>
+
+ <para>The element names from the documents at the current depth are compared, followed by their values, then any attribute names and values are compared. The process is applied then to the subtrees of the documents.</para>
+
+ <para>Notes: If there are leaf nodes in one nodeset which don't exist in the other, the value of those 'extra' elements won't appear as a difference.
+ </para>
+ </refdescription>
+
+ <refparameter>
+ <variablelist>
+ <varlistentry>
+ <term>ns1</term>
+ <term>ns2</term>
+ <listitem>
+ <para>The two nodesets which are to be compared. </para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+
+ <refreturn>
+ <para>False when the nodesets are not identical, empty otherwise. </para>
+
+ </refreturn>
+ </doc:template>
+
+ <xsl:template name="cmp:cmp">
+ <xsl:param name="ns1"/>
+ <xsl:param name="ns2"/>
+ <xsl:param name="depth"/>
+
+ <xsl:choose>
+ <xsl:when test='count($ns1) != count($ns2)'>
+ <xsl:value-of select='"countDiff"'/>
+ </xsl:when>
+ <xsl:when test='count($ns1/attribute::*) != count($ns2/attribute::*)'>
+ <xsl:value-of select='"countDiff"'/>
+ </xsl:when>
+ <xsl:when test='$ns1 and $ns2'>
+
+ <xsl:variable name='result'>
+ <xsl:call-template name='cmp:cmp'>
+ <xsl:with-param name='ns1' select='$ns1/*'/>
+ <xsl:with-param name='ns2' select='$ns2/*'/>
+ <xsl:with-param name='depth' select='$depth+1'/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test='$result = "countDiff"'>
+ <xsl:value-of select='$result'/>
+ </xsl:when>
+ <xsl:when test='$result = "textDiff"'>
+ <xsl:value-of select='$result'/>
+ </xsl:when>
+ <xsl:when test='$result = ""'>
+
+ <xsl:variable name='keyText1' select='name($ns1)'/>
+ <xsl:variable name='keyText2' select='name($ns2)'/>
+
+ <xsl:choose>
+ <!-- Check if the text of the nodesets are the same and the attributes-->
+ <xsl:when test='$ns1 = $ns2 and $keyText1 = $keyText2'>
+
+ <!-- Check the attribute names are the same -->
+ <!-- Number of attributes being different is caught higher up -->
+ <xsl:if test='count($ns1/attribute::*)'>
+ <xsl:for-each select='$ns1/attribute::*'>
+ <xsl:variable name='i' select='position()'/>
+ <xsl:variable name='name1' select='name(.)'/>
+ <xsl:variable name='value1' select='.'/>
+
+ <xsl:for-each select='$ns2/attribute::*'>
+ <xsl:variable name='j' select='position()'/>
+ <xsl:variable name='name2' select='name(.)'/>
+ <xsl:variable name='value2' select='.'/>
+
+ <xsl:if test='$i = $j and ($name1 != $name2 or
+ $value1 != $value2)'>
+ <xsl:value-of select='"textDiff"'/>
+ </xsl:if>
+
+ </xsl:for-each>
+ </xsl:for-each>
+ </xsl:if>
+ <!--
+ <xsl:variable name='diffResult'>
+ <xsl:call-template name='cmp:diff'>
+ <xsl:with-param name='ns1' select='$ns1'/>
+ <xsl:with-param name='ns2' select='$ns2'/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:if test='not($diffResult = "")'>
+ <xsl:value-of select='"textDiff"'/>
+ </xsl:if>
+ -->
+
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select='"textDiff"'/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ </xsl:choose>
+
+ </xsl:when>
+ <xsl:when test='$ns1 and not($ns2)'>
+ <xsl:value-of select='"structDiff"'/>
+ </xsl:when>
+ <xsl:when test='$ns2 and not($ns1)'>
+ <xsl:value-of select='"structDiff"'/>
+ </xsl:when>
+ </xsl:choose>
+
+ </xsl:template>
+
+</xsl:stylesheet>
+
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/keynote/xsltsl/date-time.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/keynote/xsltsl/date-time.xsl
new file mode 100644
index 0000000..671260d
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/keynote/xsltsl/date-time.xsl
@@ -0,0 +1,1524 @@
+<?xml version="1.0"?>
+<xsl:stylesheet version="1.0"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:doc="http://xsltsl.org/xsl/documentation/1.0"
+ xmlns:dt="http://xsltsl.org/date-time"
+ xmlns:str="http://xsltsl.org/string"
+ extension-element-prefixes="doc str">
+
+ <doc:reference xmlns="">
+ <referenceinfo>
+ <releaseinfo role="meta">
+ $Id: date-time.xsl 3991 2004-11-10 06:51:55Z balls $
+ </releaseinfo>
+ <author>
+ <surname>Diamond</surname>
+ <firstname>Jason</firstname>
+ </author>
+ <copyright>
+ <year>2004</year>
+ <holder>Steve Ball</holder>
+ </copyright>
+ <copyright>
+ <year>2001</year>
+ <holder>Jason Diamond</holder>
+ </copyright>
+ </referenceinfo>
+
+ <title>Date/Time Processing</title>
+
+ <partintro>
+ <section>
+ <title>Introduction</title>
+
+ <para>This module provides templates for formatting and parsing date/time strings.</para>
+
+ <para>See <ulink url="http://www.tondering.dk/claus/calendar.html">http://www.tondering.dk/claus/calendar.html</ulink> for more information on calendars and the calculations this library performs.</para>
+
+ </section>
+ </partintro>
+
+ </doc:reference>
+
+ <doc:template name="dt:format-date-time" xmlns="">
+ <refpurpose>Returns a string with a formatted date/time.</refpurpose>
+
+ <refdescription>
+ <para>The formatted date/time is determined by the format parameter. The default format is %Y-%m-%dT%H:%M:%S%z, the W3C format.</para>
+ </refdescription>
+
+ <refparameter>
+ <variablelist>
+
+ <varlistentry>
+ <term>xsd-date-time</term>
+ <listitem>
+ <para>The date-time value in XML Schemas (WXS) format.</para>
+ <para>If this value is specified, it takes priority over other parameters.</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>year</term>
+ <listitem>
+ <para>Year, in either 2 or 4+ digit format..</para>
+ <para>If the year is given as a two digit value, it will be converted to a four digit value using the fixed window method. Values between 00 and 49 will be prepended by "20". Values between 50 and 99 will be prepended by "19".</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>month</term>
+ <listitem>
+ <para>Month (1 - 12; January = 1)</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>day</term>
+ <listitem>
+ <para>Day of month (1 - 31)</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>hour</term>
+ <listitem>
+ <para>Hours since midnight (0 - 23)</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>minute</term>
+ <listitem>
+ <para>Minutes after hour (0 - 59)</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>second</term>
+ <listitem>
+ <para>Seconds after minute (0 - 59)</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>time-zone</term>
+ <listitem>
+ <para>Time zone string (e.g., 'Z' or '-08:00')</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>format</term>
+ <listitem>
+ <para>The format specification.</para>
+ <variablelist>
+
+ <varlistentry>
+ <term>%a</term>
+ <listitem>
+ <para>Abbreviated weekday name</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>%A</term>
+ <listitem>
+ <para>Full weekday name</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>%b</term>
+ <listitem>
+ <para>Abbreviated month name</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>%B</term>
+ <listitem>
+ <para>Full month name</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>%c</term>
+ <listitem>
+ <para>Date and time representation appropriate for locale</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>%d</term>
+ <listitem>
+ <para>Day of month as decimal number (01 - 31)</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>%e</term>
+ <listitem>
+ <para>Day of month as decimal number (1 - 31)</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>%H</term>
+ <listitem>
+ <para>Hour in 24-hour format (00 - 23)</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>%I</term>
+ <listitem>
+ <para>Hour in 12-hour format (01 - 12)</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>%i</term>
+ <listitem>
+ <para>Hour in 12-hour format (1 - 12)</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>%j</term>
+ <listitem>
+ <para>Day of year as decimal number (001 - 366)</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>%m</term>
+ <listitem>
+ <para>Month as decimal number (01 - 12)</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>%n</term>
+ <listitem>
+ <para>Month as decimal number (1 - 12)</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>%M</term>
+ <listitem>
+ <para>Minute as decimal number (00 - 59)</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>%P</term>
+ <listitem>
+ <para>Current locale's A.M./P.M. indicator for 12-hour clock, uppercase</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>%Q</term>
+ <listitem>
+ <para>Current locale's A.M./P.M. indicator for 12-hour clock, uppercase with periods</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>%p</term>
+ <listitem>
+ <para>Current locale's A.M./P.M. indicator for 12-hour clock, lowercase</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>%q</term>
+ <listitem>
+ <para>Current locale's A.M./P.M. indicator for 12-hour clock, lowercase with periods</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>%S</term>
+ <listitem>
+ <para>Second as decimal number (00 - 59)</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>%U</term>
+ <listitem>
+ <para>Week of year as decimal number, with Sunday as first day of week (00 - 53)</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>%w</term>
+ <listitem>
+ <para>Weekday as decimal number (0 - 6; Sunday is 0)</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>%W</term>
+ <listitem>
+ <para>Week of year as decimal number, with Monday as first day of week (00 - 53)</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>%x</term>
+ <listitem>
+ <para>Date representation for current locale </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>%X</term>
+ <listitem>
+ <para>Time representation for current locale</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>%y</term>
+ <listitem>
+ <para>Year without century, as decimal number (00 - 99)</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>%Y</term>
+ <listitem>
+ <para>Year with century, as decimal number</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>%z</term>
+ <listitem>
+ <para>Time-zone name or abbreviation; no characters if time zone is unknown</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>%%</term>
+ <listitem>
+ <para>Percent sign</para>
+ </listitem>
+ </varlistentry>
+
+ </variablelist>
+ </listitem>
+ </varlistentry>
+
+ </variablelist>
+ </refparameter>
+
+ <refreturn>
+ <para>Returns a formatted date/time string.</para>
+ </refreturn>
+
+ </doc:template>
+
+ <xsl:template name="dt:format-date-time">
+ <xsl:param name='xsd-date-time'/>
+ <xsl:param name="year"/>
+ <xsl:param name="month"/>
+ <xsl:param name="day"/>
+ <xsl:param name="hour"/>
+ <xsl:param name="minute"/>
+ <xsl:param name="second"/>
+ <xsl:param name="time-zone"/>
+ <xsl:param name="format" select="'%Y-%m-%dT%H:%M:%S%z'"/>
+
+ <xsl:value-of select="substring-before($format, '%')"/>
+
+ <xsl:variable name="code" select="substring(substring-after($format, '%'), 1, 1)"/>
+
+ <xsl:choose>
+
+ <xsl:when test='$xsd-date-time'>
+ <xsl:call-template name='dt:format-date-time'>
+ <xsl:with-param name='year'>
+ <xsl:call-template name='dt:get-xsd-datetime-year'>
+ <xsl:with-param name='xsd-date-time' select='$xsd-date-time'/>
+ </xsl:call-template>
+ </xsl:with-param>
+ <xsl:with-param name='month'>
+ <xsl:call-template name='dt:get-xsd-datetime-month'>
+ <xsl:with-param name='xsd-date-time' select='$xsd-date-time'/>
+ </xsl:call-template>
+ </xsl:with-param>
+ <xsl:with-param name='day'>
+ <xsl:call-template name='dt:get-xsd-datetime-day'>
+ <xsl:with-param name='xsd-date-time' select='$xsd-date-time'/>
+ </xsl:call-template>
+ </xsl:with-param>
+ <xsl:with-param name='hour'>
+ <xsl:call-template name='dt:get-xsd-datetime-hour'>
+ <xsl:with-param name='xsd-date-time' select='$xsd-date-time'/>
+ </xsl:call-template>
+ </xsl:with-param>
+ <xsl:with-param name='minute'>
+ <xsl:call-template name='dt:get-xsd-datetime-minute'>
+ <xsl:with-param name='xsd-date-time' select='$xsd-date-time'/>
+ </xsl:call-template>
+ </xsl:with-param>
+ <xsl:with-param name='second'>
+ <xsl:call-template name='dt:get-xsd-datetime-second'>
+ <xsl:with-param name='xsd-date-time' select='$xsd-date-time'/>
+ </xsl:call-template>
+ </xsl:with-param>
+ <xsl:with-param name='time-zone'>
+ <xsl:call-template name='dt:get-xsd-datetime-timezone'>
+ <xsl:with-param name='xsd-date-time' select='$xsd-date-time'/>
+ </xsl:call-template>
+ </xsl:with-param>
+ <xsl:with-param name='format'>
+ <xsl:choose>
+ <xsl:when test='contains($format, "%")'>
+ <xsl:text>%</xsl:text>
+ <xsl:value-of select='substring-after($format, "%")'/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select='$format'/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:when>
+
+ <!-- Abbreviated weekday name -->
+ <xsl:when test="$code='a'">
+ <xsl:variable name="day-of-the-week">
+ <xsl:call-template name="dt:calculate-day-of-the-week">
+ <xsl:with-param name="year" select="$year"/>
+ <xsl:with-param name="month" select="$month"/>
+ <xsl:with-param name="day" select="$day"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:call-template name="dt:get-day-of-the-week-abbreviation">
+ <xsl:with-param name="day-of-the-week" select="$day-of-the-week"/>
+ </xsl:call-template>
+ </xsl:when>
+
+ <!-- Full weekday name -->
+ <xsl:when test="$code='A'">
+ <xsl:variable name="day-of-the-week">
+ <xsl:call-template name="dt:calculate-day-of-the-week">
+ <xsl:with-param name="year" select="$year"/>
+ <xsl:with-param name="month" select="$month"/>
+ <xsl:with-param name="day" select="$day"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:call-template name="dt:get-day-of-the-week-name">
+ <xsl:with-param name="day-of-the-week" select="$day-of-the-week"/>
+ </xsl:call-template>
+ </xsl:when>
+
+ <!-- Abbreviated month name -->
+ <xsl:when test="$code='b'">
+ <xsl:call-template name="dt:get-month-abbreviation">
+ <xsl:with-param name="month" select="$month"/>
+ </xsl:call-template>
+ </xsl:when>
+
+ <!-- Full month name -->
+ <xsl:when test="$code='B'">
+ <xsl:call-template name="dt:get-month-name">
+ <xsl:with-param name="month" select="$month"/>
+ </xsl:call-template>
+ </xsl:when>
+
+ <!-- Date and time representation appropriate for locale -->
+ <xsl:when test="$code='c'">
+ <xsl:text>[not implemented]</xsl:text>
+ </xsl:when>
+
+ <!-- Day of month as decimal number (01 - 31) -->
+ <xsl:when test="$code='d'">
+ <xsl:if test="$day &lt; 10">0</xsl:if>
+ <xsl:value-of select="number($day)"/>
+ </xsl:when>
+ <!-- Day of month as decimal number (1 - 31) -->
+ <xsl:when test="$code='e'">
+ <xsl:value-of select="number($day)"/>
+ </xsl:when>
+
+ <!-- Hour in 24-hour format (00 - 23) -->
+ <xsl:when test="$code='H'">
+ <xsl:if test="$hour &lt; 10">0</xsl:if>
+ <xsl:value-of select="number($hour)"/>
+ </xsl:when>
+
+ <!-- Hour in 12-hour format (01 - 12) -->
+ <xsl:when test="$code='I'">
+ <xsl:choose>
+ <xsl:when test="$hour = 0">12</xsl:when>
+ <xsl:when test="$hour &lt; 10">0<xsl:value-of select="$hour - 0"/></xsl:when>
+ <xsl:when test="$hour &lt; 13"><xsl:value-of select="$hour - 0"/></xsl:when>
+ <xsl:when test="$hour &lt; 22">0<xsl:value-of select="$hour - 12"/></xsl:when>
+ <xsl:otherwise><xsl:value-of select="$hour - 12"/></xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <!-- Hour in 12-hour format (1 - 12) -->
+ <xsl:when test="$code='i'">
+ <xsl:choose>
+ <xsl:when test="$hour = 0">12</xsl:when>
+ <xsl:when test="$hour &lt; 10"><xsl:value-of select="$hour - 0"/></xsl:when>
+ <xsl:when test="$hour &lt; 13"><xsl:value-of select="$hour - 0"/></xsl:when>
+ <xsl:when test="$hour &lt; 22"><xsl:value-of select="$hour - 12"/></xsl:when>
+ <xsl:otherwise><xsl:value-of select="$hour - 12"/></xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+
+ <!-- Day of year as decimal number (001 - 366) -->
+ <xsl:when test="$code='j'">
+ <xsl:text>[not implemented]</xsl:text>
+ </xsl:when>
+
+ <!-- Month as decimal number (01 - 12) -->
+ <xsl:when test="$code='m'">
+ <xsl:if test="$month &lt; 10">0</xsl:if>
+ <xsl:value-of select="number($month)"/>
+ </xsl:when>
+ <!-- Month as decimal number (1 - 12) -->
+ <xsl:when test="$code='n'">
+ <xsl:value-of select="number($month)"/>
+ </xsl:when>
+
+ <!-- Minute as decimal number (00 - 59) -->
+ <xsl:when test="$code='M'">
+ <xsl:if test="$minute &lt; 10">0</xsl:if>
+ <xsl:value-of select="number($minute)"/>
+ </xsl:when>
+
+ <!-- Current locale's A.M./P.M. indicator for 12-hour clock -->
+ <xsl:when test="$code='p'">
+ <xsl:choose>
+ <xsl:when test="$hour &lt; 12">am</xsl:when>
+ <xsl:otherwise>pm</xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <!-- Current locale's A.M./P.M. indicator for 12-hour clock with periods -->
+ <xsl:when test="$code='q'">
+ <xsl:choose>
+ <xsl:when test="$hour &lt; 12">am</xsl:when>
+ <xsl:otherwise>p.m.</xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <!-- Current locale's A.M./P.M. indicator for 12-hour clock -->
+ <xsl:when test="$code='P'">
+ <xsl:choose>
+ <xsl:when test="$hour &lt; 12">AM</xsl:when>
+ <xsl:otherwise>PM</xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <!-- Current locale's A.M./P.M. indicator for 12-hour clock with periods -->
+ <xsl:when test="$code='Q'">
+ <xsl:choose>
+ <xsl:when test="$hour &lt; 12">AM</xsl:when>
+ <xsl:otherwise>P.M.</xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+
+ <!-- Second as decimal number (00 - 59) -->
+ <xsl:when test="$code='S'">
+ <xsl:if test="$second &lt; 10">0</xsl:if>
+ <xsl:value-of select="number($second)"/>
+ </xsl:when>
+
+ <!-- Week of year as decimal number, with Sunday as first day of week (00 - 53) -->
+ <xsl:when test="$code='U'">
+ <!-- add 1 to day -->
+ <xsl:call-template name="dt:calculate-week-number">
+ <xsl:with-param name="year" select="$year"/>
+ <xsl:with-param name="month" select="$month"/>
+ <xsl:with-param name="day" select="$day + 1"/>
+ </xsl:call-template>
+ </xsl:when>
+
+ <!-- Weekday as decimal number (0 - 6; Sunday is 0) -->
+ <xsl:when test="$code='w'">
+ <xsl:call-template name="dt:calculate-day-of-the-week">
+ <xsl:with-param name="year" select="$year"/>
+ <xsl:with-param name="month" select="$month"/>
+ <xsl:with-param name="day" select="$day"/>
+ </xsl:call-template>
+ </xsl:when>
+
+ <!-- Week of year as decimal number, with Monday as first day of week (00 - 53) -->
+ <xsl:when test="$code='W'">
+ <xsl:call-template name="dt:calculate-week-number">
+ <xsl:with-param name="year" select="$year"/>
+ <xsl:with-param name="month" select="$month"/>
+ <xsl:with-param name="day" select="$day"/>
+ </xsl:call-template>
+ </xsl:when>
+
+ <!-- Date representation for current locale -->
+ <xsl:when test="$code='x'">
+ <xsl:text>[not implemented]</xsl:text>
+ </xsl:when>
+
+ <!-- Time representation for current locale -->
+ <xsl:when test="$code='X'">
+ <xsl:text>[not implemented]</xsl:text>
+ </xsl:when>
+
+ <!-- Year without century, as decimal number (00 - 99) -->
+ <xsl:when test="$code='y'">
+ <xsl:choose>
+ <xsl:when test='not(number($year))'>invalid year value</xsl:when>
+
+ <!-- workaround MSXML bug -->
+ <xsl:when test='number($year) mod 100 = 0'>00</xsl:when>
+
+ <xsl:otherwise>
+ <xsl:number format='01' value='number($year) mod 100'/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+
+ <!-- Year with century, as decimal number -->
+ <xsl:when test="$code='Y'">
+ <xsl:choose>
+ <xsl:when test='not(number($year))'>invalid year value</xsl:when>
+ <xsl:when test='string-length($year) = 2'>
+ <xsl:call-template name='dt:format-two-digit-year'>
+ <xsl:with-param name='year' select='$year'/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test='string-length($year) >= 4'>
+ <xsl:value-of select='$year'/>
+ </xsl:when>
+ <xsl:otherwise>invalid year value</xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+
+ <!-- Time-zone name or abbreviation; no characters if time zone is unknown -->
+ <xsl:when test="$code='z'">
+ <xsl:value-of select="$time-zone"/>
+ </xsl:when>
+
+ <!-- Percent sign -->
+ <xsl:when test="$code='%'">
+ <xsl:text>%</xsl:text>
+ </xsl:when>
+
+ </xsl:choose>
+
+ <xsl:variable name="remainder" select="substring(substring-after($format, '%'), 2)"/>
+
+ <xsl:if test="not($xsd-date-time) and $remainder">
+ <xsl:call-template name="dt:format-date-time">
+ <xsl:with-param name="year" select="$year"/>
+ <xsl:with-param name="month" select="$month"/>
+ <xsl:with-param name="day" select="$day"/>
+ <xsl:with-param name="hour" select="$hour"/>
+ <xsl:with-param name="minute" select="$minute"/>
+ <xsl:with-param name="second" select="$second"/>
+ <xsl:with-param name="time-zone" select="$time-zone"/>
+ <xsl:with-param name="format" select="$remainder"/>
+ </xsl:call-template>
+ </xsl:if>
+
+ </xsl:template>
+
+ <doc:template name="dt:calculate-day-of-the-week" xmlns="">
+ <refpurpose>Calculates the day of the week.</refpurpose>
+
+ <refdescription>
+ <para>Given any Gregorian date, this calculates the day of the week.</para>
+ </refdescription>
+
+ <refparameter>
+ <variablelist>
+ <varlistentry>
+ <term>year</term>
+ <listitem>
+ <para>Year</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>month</term>
+ <listitem>
+ <para>Month (1 - 12; January = 1)</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>day</term>
+ <listitem>
+ <para>Day of month (1 - 31)</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+
+ <refreturn>
+ <para>Returns the day of the week (0 - 6; Sunday = 0).</para>
+ </refreturn>
+
+ </doc:template>
+
+ <xsl:template name="dt:calculate-day-of-the-week">
+ <xsl:param name="year"/>
+ <xsl:param name="month"/>
+ <xsl:param name="day"/>
+
+ <xsl:variable name="a" select="floor((14 - $month) div 12)"/>
+ <xsl:variable name="y" select="$year - $a"/>
+ <xsl:variable name="m" select="$month + 12 * $a - 2"/>
+
+ <xsl:value-of select="($day + $y + floor($y div 4) - floor($y div 100) + floor($y div 400) + floor((31 * $m) div 12)) mod 7"/>
+
+ </xsl:template>
+
+ <doc:template name="dt:calculate-last-day-of-month" xmlns="">
+ <refpurpose>Calculates the number of days for a specified month.</refpurpose>
+
+ <refdescription>
+ <para>Given any Gregorian month, this calculates the last day of the month.</para>
+ </refdescription>
+
+ <refparameter>
+ <variablelist>
+ <varlistentry>
+ <term>year</term>
+ <listitem>
+ <para>Year</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>month</term>
+ <listitem>
+ <para>Month (1 - 12; January = 1)</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+
+ <refreturn>
+ <para>Returns the number of days in given month as a decimal number.</para>
+ </refreturn>
+ </doc:template>
+
+ <xsl:template name="dt:calculate-last-day-of-month">
+ <xsl:param name="year"/>
+ <xsl:param name="month"/>
+
+ <xsl:choose>
+ <xsl:when test="$month = 2">
+ <xsl:choose>
+ <xsl:when test="($year mod 4) = 0 and (($year mod 400) = 0
+ or ($year mod 100) != 0)">29</xsl:when>
+ <xsl:otherwise>28</xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:when test="$month &lt; 8">
+ <xsl:choose>
+ <xsl:when test="$month mod 2 = 0">30</xsl:when>
+ <xsl:otherwise>31</xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:choose>
+ <xsl:when test="$month mod 2 = 1">30</xsl:when>
+ <xsl:otherwise>31</xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+ <doc:template name="dt:get-day-of-the-week-name" xmlns="">
+ <refpurpose>Gets the day of the week's full name.</refpurpose>
+
+ <refdescription>
+ <para>Converts a numeric day of the week value into a string representing the day's full name.</para>
+ </refdescription>
+
+ <refparameter>
+ <variablelist>
+ <varlistentry>
+ <term>day-of-the-week</term>
+ <listitem>
+ <para>Day of the week (0 - 6; Sunday = 0)</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+
+ <refreturn>
+ <para>Returns a string.</para>
+ </refreturn>
+
+ </doc:template>
+
+ <xsl:template name="dt:get-day-of-the-week-name">
+ <xsl:param name="day-of-the-week"/>
+
+ <xsl:choose>
+ <xsl:when test="$day-of-the-week = 0">Sunday</xsl:when>
+ <xsl:when test="$day-of-the-week = 1">Monday</xsl:when>
+ <xsl:when test="$day-of-the-week = 2">Tuesday</xsl:when>
+ <xsl:when test="$day-of-the-week = 3">Wednesday</xsl:when>
+ <xsl:when test="$day-of-the-week = 4">Thursday</xsl:when>
+ <xsl:when test="$day-of-the-week = 5">Friday</xsl:when>
+ <xsl:when test="$day-of-the-week = 6">Saturday</xsl:when>
+ <xsl:otherwise>error: <xsl:value-of select="$day-of-the-week"/></xsl:otherwise>
+ </xsl:choose>
+
+ </xsl:template>
+
+ <doc:template name="dt:get-day-of-the-week-abbreviation" xmlns="">
+ <refpurpose>Gets the day of the week's abbreviation.</refpurpose>
+
+ <refdescription>
+ <para>Converts a numeric day of the week value into a string representing the day's abbreviation.</para>
+ </refdescription>
+
+ <refparameter>
+ <variablelist>
+ <varlistentry>
+ <term>day-of-the-week</term>
+ <listitem>
+ <para>Day of the week (0 - 6; Sunday = 0)</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+
+ <refreturn>
+ <para>Returns a string.</para>
+ </refreturn>
+
+ </doc:template>
+
+ <xsl:template name="dt:get-day-of-the-week-abbreviation">
+ <xsl:param name="day-of-the-week"/>
+
+ <xsl:choose>
+ <xsl:when test="$day-of-the-week = 0">Sun</xsl:when>
+ <xsl:when test="$day-of-the-week = 1">Mon</xsl:when>
+ <xsl:when test="$day-of-the-week = 2">Tue</xsl:when>
+ <xsl:when test="$day-of-the-week = 3">Wed</xsl:when>
+ <xsl:when test="$day-of-the-week = 4">Thu</xsl:when>
+ <xsl:when test="$day-of-the-week = 5">Fri</xsl:when>
+ <xsl:when test="$day-of-the-week = 6">Sat</xsl:when>
+ <xsl:otherwise>error: <xsl:value-of select="$day-of-the-week"/></xsl:otherwise>
+ </xsl:choose>
+
+ </xsl:template>
+
+ <doc:template name="dt:get-month-name" xmlns="">
+ <refpurpose>Gets the month's full name.</refpurpose>
+
+ <refdescription>
+ <para>Converts a numeric month value into a string representing the month's full name.</para>
+ </refdescription>
+
+ <refparameter>
+ <variablelist>
+ <varlistentry>
+ <term>month</term>
+ <listitem>
+ <para>Month (1 - 12; Januaray = 1)</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+
+ <refreturn>
+ <para>Returns a string.</para>
+ </refreturn>
+
+ </doc:template>
+
+ <xsl:template name="dt:get-month-name">
+ <xsl:param name="month"/>
+
+ <xsl:choose>
+ <xsl:when test="$month = 1">January</xsl:when>
+ <xsl:when test="$month = 2">February</xsl:when>
+ <xsl:when test="$month = 3">March</xsl:when>
+ <xsl:when test="$month = 4">April</xsl:when>
+ <xsl:when test="$month = 5">May</xsl:when>
+ <xsl:when test="$month = 6">June</xsl:when>
+ <xsl:when test="$month = 7">July</xsl:when>
+ <xsl:when test="$month = 8">August</xsl:when>
+ <xsl:when test="$month = 9">September</xsl:when>
+ <xsl:when test="$month = 10">October</xsl:when>
+ <xsl:when test="$month = 11">November</xsl:when>
+ <xsl:when test="$month = 12">December</xsl:when>
+ <xsl:otherwise>error: <xsl:value-of select="$month"/></xsl:otherwise>
+ </xsl:choose>
+
+ </xsl:template>
+
+ <doc:template name="dt:get-month-abbreviation" xmlns="">
+ <refpurpose>Gets the month's abbreviation.</refpurpose>
+
+ <refdescription>
+ <para>Converts a numeric month value into a string representing the month's abbreviation.</para>
+ </refdescription>
+
+ <refparameter>
+ <variablelist>
+ <varlistentry>
+ <term>month</term>
+ <listitem>
+ <para>Month (1 - 12; Januaray = 1)</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+
+ <refreturn>
+ <para>Returns a string.</para>
+ </refreturn>
+
+ </doc:template>
+
+ <xsl:template name="dt:get-month-abbreviation">
+ <xsl:param name="month"/>
+
+ <xsl:choose>
+ <xsl:when test="$month = 1">Jan</xsl:when>
+ <xsl:when test="$month = 2">Feb</xsl:when>
+ <xsl:when test="$month = 3">Mar</xsl:when>
+ <xsl:when test="$month = 4">Apr</xsl:when>
+ <xsl:when test="$month = 5">May</xsl:when>
+ <xsl:when test="$month = 6">Jun</xsl:when>
+ <xsl:when test="$month = 7">Jul</xsl:when>
+ <xsl:when test="$month = 8">Aug</xsl:when>
+ <xsl:when test="$month = 9">Sep</xsl:when>
+ <xsl:when test="$month = 10">Oct</xsl:when>
+ <xsl:when test="$month = 11">Nov</xsl:when>
+ <xsl:when test="$month = 12">Dec</xsl:when>
+ <xsl:otherwise>error: <xsl:value-of select="$month"/></xsl:otherwise>
+ </xsl:choose>
+
+ </xsl:template>
+
+ <doc:template name="dt:calculate-julian-day" xmlns="">
+ <refpurpose>Calculates the Julian Day for a specified date.</refpurpose>
+
+ <refdescription>
+ <para>Given any Gregorian date, this calculates the Julian Day.</para>
+ </refdescription>
+
+ <refparameter>
+ <variablelist>
+ <varlistentry>
+ <term>year</term>
+ <listitem>
+ <para>Year</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>month</term>
+ <listitem>
+ <para>Month (1 - 12; January = 1)</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>day</term>
+ <listitem>
+ <para>Day of month (1 - 31)</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+
+ <refreturn>
+ <para>Returns the Julian Day as a decimal number.</para>
+ </refreturn>
+
+ </doc:template>
+
+ <xsl:template name="dt:calculate-julian-day">
+ <xsl:param name="year"/>
+ <xsl:param name="month"/>
+ <xsl:param name="day"/>
+
+ <xsl:variable name="a" select="floor((14 - $month) div 12)"/>
+ <xsl:variable name="y" select="$year + 4800 - $a"/>
+ <xsl:variable name="m" select="$month + 12 * $a - 3"/>
+
+ <xsl:value-of select="$day + floor((153 * $m + 2) div 5) + $y * 365 + floor($y div 4) - floor($y div 100) + floor($y div 400) - 32045"/>
+
+ </xsl:template>
+
+ <doc:template name="dt:format-julian-day" xmlns="">
+ <refpurpose>Returns a string with a formatted date for a specified Julian Day.</refpurpose>
+
+ <refdescription>
+ <para>Given any Julian Day, this returns a string according to the format specification.</para>
+ </refdescription>
+
+ <refparameter>
+ <variablelist>
+ <varlistentry>
+ <term>julian-day</term>
+ <listitem>
+ <para>A Julian Day</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>format</term>
+ <listitem>
+ <para>The format specification. See dt:format-date-time for more details.</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+
+ <refreturn>
+ <para>A string.</para>
+ </refreturn>
+
+ </doc:template>
+
+ <xsl:template name="dt:format-julian-day">
+ <xsl:param name="julian-day"/>
+ <xsl:param name="format" select="'%Y-%m-%d'"/>
+
+ <xsl:variable name="a" select="$julian-day + 32044"/>
+ <xsl:variable name="b" select="floor((4 * $a + 3) div 146097)"/>
+ <xsl:variable name="c" select="$a - floor(($b * 146097) div 4)"/>
+
+ <xsl:variable name="d" select="floor((4 * $c + 3) div 1461)"/>
+ <xsl:variable name="e" select="$c - floor((1461 * $d) div 4)"/>
+ <xsl:variable name="m" select="floor((5 * $e + 2) div 153)"/>
+
+ <xsl:variable name="day" select="$e - floor((153 * $m + 2) div 5) + 1"/>
+ <xsl:variable name="month" select="$m + 3 - 12 * floor($m div 10)"/>
+ <xsl:variable name="year" select="$b * 100 + $d - 4800 + floor($m div 10)"/>
+
+ <xsl:call-template name="dt:format-date-time">
+ <xsl:with-param name="year" select="$year"/>
+ <xsl:with-param name="month" select="$month"/>
+ <xsl:with-param name="day" select="$day"/>
+ <xsl:with-param name="format" select="$format"/>
+ </xsl:call-template>
+
+ </xsl:template>
+
+ <doc:template name="dt:calculate-week-number" xmlns="">
+ <refpurpose>Calculates the week number for a specified date.</refpurpose>
+
+ <refdescription>
+ <para>Assumes Monday is the first day of the week.</para>
+ </refdescription>
+
+ <refparameter>
+ <variablelist>
+ <varlistentry>
+ <term>year</term>
+ <listitem>
+ <para>Year</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>month</term>
+ <listitem>
+ <para>Month (1 - 12; January = 1)</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>day</term>
+ <listitem>
+ <para>Day of month (1 - 31)</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+
+ <refreturn>
+ <para>Returns the week number as a decimal number.</para>
+ </refreturn>
+
+ </doc:template>
+
+ <xsl:template name="dt:calculate-week-number">
+ <xsl:param name="year"/>
+ <xsl:param name="month"/>
+ <xsl:param name="day"/>
+
+ <xsl:variable name="J">
+ <xsl:call-template name="dt:calculate-julian-day">
+ <xsl:with-param name="year" select="$year"/>
+ <xsl:with-param name="month" select="$month"/>
+ <xsl:with-param name="day" select="$day"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="d4" select="($J + 31741 - ($J mod 7)) mod 146097 mod 36524 mod 1461"/>
+ <xsl:variable name="L" select="floor($d4 div 1460)"/>
+ <xsl:variable name="d1" select="(($d4 - $L) mod 365) + $L"/>
+
+ <xsl:value-of select="floor($d1 div 7) + 1"/>
+
+ </xsl:template>
+
+ <doc:template name="dt:get-month-number" xmlns="">
+ <refpurpose>Take a month by name and return a number which can be used as input to the templates. </refpurpose>
+
+ <refdescription>
+ <para>Input</para>
+ </refdescription>
+
+ <refparameter>
+ <variablelist>
+ <varlistentry>
+ <term>month</term>
+ <listitem>
+ <para>Month as described either by full name or abbreviation.</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+
+ <refreturn>
+ <para>Return a month as a decimal number. (Jan = 1)</para>
+ </refreturn>
+ </doc:template>
+
+ <xsl:template name='dt:get-month-number'>
+ <xsl:param name='month'/>
+
+ <xsl:variable name='monToUpper'>
+ <xsl:call-template name='str:to-upper'>
+ <xsl:with-param name='text' select='$month'/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test='starts-with($monToUpper,"JAN")'>
+ <xsl:value-of select='"1"'/>
+ </xsl:when>
+ <xsl:when test='starts-with($monToUpper,"FEB")'>
+ <xsl:value-of select='2'/>
+ </xsl:when>
+ <xsl:when test='starts-with($monToUpper,"MAR")'>
+ <xsl:value-of select='3'/>
+ </xsl:when>
+ <xsl:when test='starts-with($monToUpper,"APR")'>
+ <xsl:value-of select='4'/>
+ </xsl:when>
+ <xsl:when test='starts-with($monToUpper,"MAY")'>
+ <xsl:value-of select='5'/>
+ </xsl:when>
+ <xsl:when test='starts-with($monToUpper,"JUN")'>
+ <xsl:value-of select='6'/>
+ </xsl:when>
+ <xsl:when test='starts-with($monToUpper,"JUL")'>
+ <xsl:value-of select='7'/>
+ </xsl:when>
+ <xsl:when test='starts-with($monToUpper,"AUG")'>
+ <xsl:value-of select='8'/>
+ </xsl:when>
+ <xsl:when test='starts-with($monToUpper,"SEP")'>
+ <xsl:value-of select='9'/>
+ </xsl:when>
+ <xsl:when test='starts-with($monToUpper,"OCT")'>
+ <xsl:value-of select='10'/>
+ </xsl:when>
+ <xsl:when test='starts-with($monToUpper,"NOV")'>
+ <xsl:value-of select='11'/>
+ </xsl:when>
+ <xsl:when test='starts-with($monToUpper,"DEC")'>
+ <xsl:value-of select='"12"'/>
+ </xsl:when>
+ </xsl:choose>
+ </xsl:template>
+
+ <doc:template name="dt:get-xsd-datetime-year" xmlns="">
+ <refpurpose>Return year component of XSD DateTime value.</refpurpose>
+
+ <refdescription>
+ <para>Extract component of XML Schemas DateTime value.</para>
+ </refdescription>
+
+ <refparameter>
+ <variablelist>
+ <varlistentry>
+ <term>xsd-date-time</term>
+ <listitem>
+ <para>A value in XSD DateTime format.</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+
+ <refreturn>
+ <para>Returns year component.</para>
+ </refreturn>
+ </doc:template>
+
+ <xsl:template name='dt:get-xsd-datetime-year'>
+ <xsl:param name='xsd-date-time'/>
+
+ <xsl:choose>
+ <xsl:when test='contains($xsd-date-time, "T")'>
+ <xsl:call-template name='dt:get-xsd-datetime-year'>
+ <xsl:with-param name='xsd-date-time' select='substring-before($xsd-date-time, "T")'/>
+ </xsl:call-template>
+ </xsl:when>
+
+ <!-- Check for time -->
+ <xsl:when test='substring($xsd-date-time, 3, 1) = ":"'/>
+
+ <xsl:otherwise>
+ <!-- This is a date -->
+ <xsl:value-of select='substring-before($xsd-date-time, "-")'/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+ <doc:template name="dt:get-xsd-datetime-month" xmlns="">
+ <refpurpose>Return month component of XSD DateTime value.</refpurpose>
+
+ <refdescription>
+ <para>Extract component of XML Schemas DateTime value.</para>
+ </refdescription>
+
+ <refparameter>
+ <variablelist>
+ <varlistentry>
+ <term>xsd-date-time</term>
+ <listitem>
+ <para>A value in XSD DateTime format.</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+
+ <refreturn>
+ <para>Returns month component.</para>
+ </refreturn>
+ </doc:template>
+
+ <xsl:template name='dt:get-xsd-datetime-month'>
+ <xsl:param name='xsd-date-time'/>
+
+ <xsl:choose>
+ <xsl:when test='contains($xsd-date-time, "T")'>
+ <xsl:call-template name='dt:get-xsd-datetime-month'>
+ <xsl:with-param name='xsd-date-time' select='substring-before($xsd-date-time, "T")'/>
+ </xsl:call-template>
+ </xsl:when>
+
+ <!-- Check for time -->
+ <xsl:when test='substring($xsd-date-time, 3, 1) = ":"'/>
+
+ <xsl:otherwise>
+ <!-- This is a date -->
+ <xsl:value-of select='substring(substring-after($xsd-date-time, "-"), 1, 2)'/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+ <doc:template name="dt:get-xsd-datetime-day" xmlns="">
+ <refpurpose>Return day component of XSD DateTime value.</refpurpose>
+
+ <refdescription>
+ <para>Extract component of XML Schemas DateTime value.</para>
+ </refdescription>
+
+ <refparameter>
+ <variablelist>
+ <varlistentry>
+ <term>xsd-date-time</term>
+ <listitem>
+ <para>A value in XSD DateTime format.</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+
+ <refreturn>
+ <para>Returns day component.</para>
+ </refreturn>
+ </doc:template>
+
+ <xsl:template name='dt:get-xsd-datetime-day'>
+ <xsl:param name='xsd-date-time'/>
+
+ <xsl:choose>
+ <xsl:when test='contains($xsd-date-time, "T")'>
+ <xsl:call-template name='dt:get-xsd-datetime-day'>
+ <xsl:with-param name='xsd-date-time' select='substring-before($xsd-date-time, "T")'/>
+ </xsl:call-template>
+ </xsl:when>
+
+ <!-- Check for time -->
+ <xsl:when test='substring($xsd-date-time, 3, 1) = ":"'/>
+
+ <xsl:otherwise>
+ <!-- This is a date -->
+ <xsl:value-of select='substring(substring-after($xsd-date-time, "-"), 4, 2)'/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+ <doc:template name="dt:get-xsd-datetime-hour" xmlns="">
+ <refpurpose>Return hour component of XSD DateTime value.</refpurpose>
+
+ <refdescription>
+ <para>Extract component of XML Schemas DateTime value.</para>
+ </refdescription>
+
+ <refparameter>
+ <variablelist>
+ <varlistentry>
+ <term>xsd-date-time</term>
+ <listitem>
+ <para>A value in XSD DateTime format.</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+
+ <refreturn>
+ <para>Returns hour component.</para>
+ </refreturn>
+ </doc:template>
+
+ <xsl:template name='dt:get-xsd-datetime-hour'>
+ <xsl:param name='xsd-date-time'/>
+
+ <xsl:choose>
+ <xsl:when test='contains($xsd-date-time, "T")'>
+ <xsl:call-template name='dt:get-xsd-datetime-hour'>
+ <xsl:with-param name='xsd-date-time' select='substring-after($xsd-date-time, "T")'/>
+ </xsl:call-template>
+ </xsl:when>
+
+ <!-- Check for time -->
+ <xsl:when test='substring($xsd-date-time, 3, 1) = ":"'>
+ <xsl:value-of select='substring($xsd-date-time, 1, 2)'/>
+ </xsl:when>
+
+ <xsl:otherwise>
+ <!-- This is a date -->
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+ <doc:template name="dt:get-xsd-datetime-minute" xmlns="">
+ <refpurpose>Return minute component of XSD DateTime value.</refpurpose>
+
+ <refdescription>
+ <para>Extract component of XML Schemas DateTime value.</para>
+ </refdescription>
+
+ <refparameter>
+ <variablelist>
+ <varlistentry>
+ <term>xsd-date-time</term>
+ <listitem>
+ <para>A value in XSD DateTime format.</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+
+ <refreturn>
+ <para>Returns minute component.</para>
+ </refreturn>
+ </doc:template>
+
+ <xsl:template name='dt:get-xsd-datetime-minute'>
+ <xsl:param name='xsd-date-time'/>
+
+ <xsl:choose>
+ <xsl:when test='contains($xsd-date-time, "T")'>
+ <xsl:call-template name='dt:get-xsd-datetime-minute'>
+ <xsl:with-param name='xsd-date-time' select='substring-after($xsd-date-time, "T")'/>
+ </xsl:call-template>
+ </xsl:when>
+
+ <!-- Check for time -->
+ <xsl:when test='substring($xsd-date-time, 3, 1) = ":"'>
+ <xsl:value-of select='substring($xsd-date-time, 4, 2)'/>
+ </xsl:when>
+
+ <xsl:otherwise>
+ <!-- This is a date -->
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+ <doc:template name="dt:get-xsd-datetime-second" xmlns="">
+ <refpurpose>Return second component of XSD DateTime value.</refpurpose>
+
+ <refdescription>
+ <para>Extract component of XML Schemas DateTime value.</para>
+ </refdescription>
+
+ <refparameter>
+ <variablelist>
+ <varlistentry>
+ <term>xsd-date-time</term>
+ <listitem>
+ <para>A value in XSD DateTime format.</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+
+ <refreturn>
+ <para>Returns second component.</para>
+ </refreturn>
+ </doc:template>
+
+ <xsl:template name='dt:get-xsd-datetime-second'>
+ <xsl:param name='xsd-date-time'/>
+
+ <xsl:choose>
+ <xsl:when test='contains($xsd-date-time, "T")'>
+ <xsl:call-template name='dt:get-xsd-datetime-second'>
+ <xsl:with-param name='xsd-date-time' select='substring-after($xsd-date-time, "T")'/>
+ </xsl:call-template>
+ </xsl:when>
+
+ <!-- Check for time -->
+ <xsl:when test='substring($xsd-date-time, 3, 1) = ":"'>
+ <xsl:variable name='part' select='substring($xsd-date-time, 7)'/>
+ <xsl:choose>
+ <xsl:when test='contains($part, "Z")'>
+ <xsl:value-of select='substring-before($part, "Z")'/>
+ </xsl:when>
+ <xsl:when test='contains($part, "+")'>
+ <xsl:value-of select='substring-before($part, "+")'/>
+ </xsl:when>
+ <xsl:when test='contains($part, "-")'>
+ <xsl:value-of select='substring-before($part, "-")'/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select='$part'/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+
+ <xsl:otherwise>
+ <!-- This is a date -->
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+ <doc:template name="dt:get-xsd-datetime-timezone" xmlns="">
+ <refpurpose>Return timezone component of XSD DateTime value.</refpurpose>
+
+ <refdescription>
+ <para>Extract component of XML Schemas DateTime value.</para>
+ </refdescription>
+
+ <refparameter>
+ <variablelist>
+ <varlistentry>
+ <term>xsd-date-time</term>
+ <listitem>
+ <para>A value in XSD DateTime format.</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+
+ <refreturn>
+ <para>Returns timezone component.</para>
+ </refreturn>
+ </doc:template>
+
+ <xsl:template name='dt:get-xsd-datetime-timezone'>
+ <xsl:param name='xsd-date-time'/>
+
+ <xsl:choose>
+ <xsl:when test='contains($xsd-date-time, "Z")'>Z</xsl:when>
+ <xsl:when test='contains($xsd-date-time, "T")'>
+ <xsl:call-template name='dt:get-xsd-datetime-timezone'>
+ <xsl:with-param name='xsd-date-time' select='substring-after($xsd-date-time, "T")'/>
+ </xsl:call-template>
+ </xsl:when>
+
+ <xsl:when test='substring($xsd-date-time, 3, 1) = ":"'>
+ <!-- This is a time -->
+ <xsl:choose>
+ <xsl:when test='contains($xsd-date-time, "+")'>
+ <xsl:text>+</xsl:text>
+ <xsl:value-of select='substring-after($xsd-date-time, "+")'/>
+ </xsl:when>
+ <xsl:when test='contains($xsd-date-time, "-")'>
+ <xsl:text>-</xsl:text>
+ <xsl:value-of select='substring-after($xsd-date-time, "-")'/>
+ </xsl:when>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <!-- This is a date -->
+ <xsl:value-of select='substring(substring-after($xsd-date-time, "-"), 6)'/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+ <doc:template name="dt:format-two-digit-year" xmlns="">
+ <refpurpose>Return two digit year as four digit year value.</refpurpose>
+
+ <refdescription>
+ <para>Prepend century to two digit year value.</para>
+ <para>Century value is calculated according to suggested solutions in RFC2626 (section 5).</para>
+ <para>Fixed window solution: 20 is prepended to year if the year is less than 50, otherwise 19 is prepended to year.</para>
+ <para>Sliding window solution: The year is considered in the future if the year is less than the current 2 digit year plus 'n' years (where 'n' is a param), otherwise it is considered in the past.</para>
+ </refdescription>
+
+ <refparameter>
+ <variablelist>
+ <varlistentry>
+ <term>year</term>
+ <listitem>
+ <para>A year value in 2 digit format.</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>method</term>
+ <listitem>
+ <para>RFC2626 suggested solution ('fixed' or 'sliding'). Default is 'fixed'.</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>n</term>
+ <listitem>
+ <para>No. of years. Used in sliding windows solution.</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+
+ <refreturn>
+ <para>Returns four digit year value.</para>
+ </refreturn>
+ </doc:template>
+
+ <xsl:template name="dt:format-two-digit-year">
+ <xsl:param name="year" />
+ <xsl:param name="method" select="'fixed'"/>
+
+ <xsl:choose>
+ <xsl:when test="string-length($year) != 2">invalid year value</xsl:when>
+ <xsl:when test="$method = 'fixed'">
+ <xsl:choose>
+ <xsl:when test="$year &lt; 50">20</xsl:when>
+ <xsl:otherwise>19</xsl:otherwise>
+ </xsl:choose>
+ <xsl:value-of select="$year" />
+ </xsl:when>
+ <xsl:when test="$method = 'window'">not yet implemented</xsl:when>
+ <xsl:otherwise>invalid method</xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+ </xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/keynote/xsltsl/example.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/keynote/xsltsl/example.xsl
new file mode 100644
index 0000000..349bab9
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/keynote/xsltsl/example.xsl
@@ -0,0 +1,90 @@
+<?xml version="1.0"?>
+
+<xsl:stylesheet
+ version="1.0"
+ extension-element-prefixes="doc"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:doc="http://xsltsl.org/xsl/documentation/1.0"
+ xmlns:eg="http://xsltsl.org/example"
+>
+
+ <doc:reference xmlns="">
+ <referenceinfo>
+ <releaseinfo role="meta">
+ $Id: example.xsl 3991 2004-11-10 06:51:55Z balls $
+ </releaseinfo>
+ <author>
+ <surname>Ball</surname>
+ <firstname>Steve</firstname>
+ </author>
+ <copyright>
+ <year>2001</year>
+ <holder>Steve Ball</holder>
+ </copyright>
+ </referenceinfo>
+
+ <title>Example Stylesheet</title>
+
+ <partintro>
+ <section>
+ <title>Introduction</title>
+
+ <para>This module provides a template for adding stylesheet modules to the XSLT Standard Library.</para>
+ <para>To add a new module to the library, follow these easy steps:</para>
+ <orderedlist>
+ <listitem>
+ <para>Copy this file and replace its contents with the new module templates and documentation.</para>
+ </listitem>
+ <listitem>
+ <para>Copy the corresponding test file in the <filename>test</filename> directory. Replace its contents with tests for the new module.</para>
+ </listitem>
+ <listitem>
+ <para>Add an include element in the <filename>stdlib.xsl</filename> stylesheet.</para>
+ </listitem>
+ <listitem>
+ <para>Add an entry in the <filename>test/test.xml</filename> file.</para>
+ </listitem>
+ <listitem>
+ <para>Add entries in the <filename>test/test.xsl</filename> stylesheet.</para>
+ </listitem>
+ <listitem>
+ <para>Add an entry in the <filename>doc/build.xml</filename> file.</para>
+ </listitem>
+ </orderedlist>
+
+ <para>The <filename>example.xsl</filename> stylesheet provides a more extensive example.</para>
+
+ </section>
+ </partintro>
+
+ </doc:reference>
+
+ <doc:template name="eg:example" xmlns="">
+ <refpurpose>Template Example</refpurpose>
+
+ <refdescription>
+ <para>Provides a template for writing templates. Replace this paragraph with a description of your template</para>
+ </refdescription>
+
+ <refparameter>
+ <variablelist>
+ <varlistentry>
+ <term>text</term>
+ <listitem>
+ <para>The example string</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+
+ <refreturn>
+ <para>Returns nothing.</para>
+ </refreturn>
+ </doc:template>
+
+ <xsl:template name="eg:example">
+ <xsl:param name="text"/>
+ </xsl:template>
+
+</xsl:stylesheet>
+
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/keynote/xsltsl/markup.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/keynote/xsltsl/markup.xsl
new file mode 100644
index 0000000..cff2485
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/keynote/xsltsl/markup.xsl
@@ -0,0 +1,789 @@
+<xsl:stylesheet version='1.0'
+ xmlns:xsl='http://www.w3.org/1999/XSL/Transform'
+ xmlns:doc='http://xsltsl.org/xsl/documentation/1.0'
+ xmlns:markup='http://xsltsl.org/markup'
+ xmlns:str='http://xsltsl.org/string'
+ extension-element-prefixes='doc markup str'>
+
+ <doc:reference xmlns=''>
+ <referenceinfo>
+ <releaseinfo role="meta">
+ $Id: markup.xsl 3991 2004-11-10 06:51:55Z balls $
+ </releaseinfo>
+ <author>
+ <surname>Ball</surname>
+ <firstname>Steve</firstname>
+ </author>
+ <copyright>
+ <year>2003</year>
+ <year>2001</year>
+ <holder>Steve Ball</holder>
+ </copyright>
+ </referenceinfo>
+
+ <title>XML Markup Templates</title>
+
+ <partintro>
+ <section>
+ <title>Introduction</title>
+
+ <para>This stylesheet module provides functions for generating literal XML markup.</para>
+
+ </section>
+ </partintro>
+
+ </doc:reference>
+
+ <doc:template name="markup:xml-declaration" xmlns="">
+ <refpurpose>Create an XML Declaration</refpurpose>
+
+ <refdescription>
+ <para>This template returns an XML Declaration. Although the XSLT standard provides control over the generation of the XML Declaration, this template may be useful in circumstances where the values must be computed at runtime.</para>
+ </refdescription>
+
+ <refparameter>
+ <variablelist>
+ <varlistentry>
+ <term>version</term>
+ <listitem>
+ <para>Version number.</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>standalone</term>
+ <listitem>
+ <para>Standalone indication. Must be value "yes" or "no".</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>encoding</term>
+ <listitem>
+ <para>Character encoding.</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+
+ <refreturn>
+ <para>Returns an XML Declaration as a string.</para>
+ </refreturn>
+ </doc:template>
+
+ <xsl:template name='markup:xml-declaration'>
+ <xsl:param name='version' select="'1.0'"/>
+ <xsl:param name='standalone'/>
+ <xsl:param name='encoding'/>
+
+ <xsl:text disable-output-escaping='yes'>&lt;?xml version="</xsl:text>
+ <xsl:copy-of select="$version"/>
+ <xsl:text>"</xsl:text>
+
+ <xsl:choose>
+ <xsl:when test="string-length($standalone) = 0"/>
+ <xsl:when test='$standalone = "yes" or $standalone = "no"'>
+ <xsl:text> standalone="</xsl:text>
+ <xsl:copy-of select="$standalone"/>
+ <xsl:text>"</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:message terminate="yes">invalid value "<xsl:value-of select="$standalone"/>" for standalone attribute</xsl:message>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:if test='string-length($encoding) &gt; 0'>
+ <xsl:text> encoding="</xsl:text>
+ <xsl:copy-of select='$encoding'/>
+ <xsl:text>"</xsl:text>
+ </xsl:if>
+
+ <xsl:text disable-output-escaping='yes'>?&gt;
+</xsl:text>
+ </xsl:template>
+
+ <doc:template name="markup:doctype-declaration" xmlns="">
+ <refpurpose>Create a Document Type Declaration</refpurpose>
+
+ <refdescription>
+ <para>This template returns a Document Type Declaration. Although the XSLT standard provides control over the generation of a Document Type Declaration, this template may be useful in circumstances where the values for the identifiers or the internal subset must be computed at runtime.</para>
+ </refdescription>
+
+ <refparameter>
+ <variablelist>
+ <varlistentry>
+ <term>docel</term>
+ <listitem>
+ <para>The name of the document element.</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>publicid</term>
+ <listitem>
+ <para>The public identifier for the external DTD subset.</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>systemid</term>
+ <listitem>
+ <para>The system identifier for the external DTD subset.</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>internaldtd</term>
+ <listitem>
+ <para>The internal DTD subset.</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+
+ <refreturn>
+ <para>Returns a Document Type Declaration as a string.</para>
+ </refreturn>
+ </doc:template>
+
+ <xsl:template name='markup:doctype-declaration'>
+ <xsl:param name='docel'/>
+ <xsl:param name='publicid'/>
+ <xsl:param name='systemid'/>
+ <xsl:param name='internaldtd'/>
+
+ <xsl:if test='string-length($docel) = 0'>
+ <xsl:message terminate='yes'>No document element specified</xsl:message>
+ </xsl:if>
+
+ <xsl:text disable-output-escaping='yes'>&lt;!DOCTYPE </xsl:text>
+ <xsl:copy-of select="$docel"/>
+
+ <xsl:call-template name='markup:external-identifier'>
+ <xsl:with-param name='publicid' select='$publicid'/>
+ <xsl:with-param name='systemid' select='$systemid'/>
+ <xsl:with-param name='leading-space' select='true()'/>
+ </xsl:call-template>
+
+ <xsl:if test='string-length($internaldtd) &gt; 0'>
+ <xsl:text> [</xsl:text>
+ <xsl:copy-of select='$internaldtd'/>
+ <xsl:text>]</xsl:text>
+ </xsl:if>
+
+ <xsl:text disable-output-escaping='yes'>&gt;
+</xsl:text>
+ </xsl:template>
+
+ <doc:template name="markup:element-declaration" xmlns="">
+ <refpurpose>Create an Element Declaration</refpurpose>
+
+ <refdescription>
+ <para>This template returns an element declaration..</para>
+ </refdescription>
+
+ <refparameter>
+ <variablelist>
+ <varlistentry>
+ <term>type</term>
+ <listitem>
+ <para>The element type.</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>content-spec</term>
+ <listitem>
+ <para>The content specification.</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+
+ <refreturn>
+ <para>Returns an element declaration as a string.</para>
+ </refreturn>
+ </doc:template>
+
+ <xsl:template name='markup:element-declaration'>
+ <xsl:param name='type'/>
+ <xsl:param name='content-spec' select="'ANY'"/>
+
+ <xsl:if test='string-length($type) = 0'>
+ <xsl:message terminate='yes'>element type must be specified</xsl:message>
+ </xsl:if>
+ <xsl:if test='string-length($content-spec) = 0'>
+ <xsl:message terminate='yes'>content specification must be specified</xsl:message>
+ </xsl:if>
+
+ <xsl:text disable-output-escaping='yes'>&lt;!ELEMENT </xsl:text>
+ <xsl:copy-of select='$type'/>
+ <xsl:text> </xsl:text>
+ <xsl:copy-of select='$content-spec'/>
+ <xsl:text disable-output-escaping='yes'>&gt;</xsl:text>
+ </xsl:template>
+
+ <doc:template name="markup:attlist-declaration" xmlns="">
+ <refpurpose>Create an Attribute List Declaration</refpurpose>
+
+ <refdescription>
+ <para>This template returns an attribute list declaration.</para>
+ </refdescription>
+
+ <refparameter>
+ <variablelist>
+ <varlistentry>
+ <term>type</term>
+ <listitem>
+ <para>The element type.</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>attr-defns</term>
+ <listitem>
+ <para>Attribute definitions.</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+
+ <refreturn>
+ <para>Returns an attribute list declaration as a string.</para>
+ </refreturn>
+ </doc:template>
+
+ <xsl:template name='markup:attlist-declaration'>
+ <xsl:param name='type'/>
+ <xsl:param name='attr-defns'/>
+
+ <xsl:if test='string-length($type) = 0'>
+ <xsl:message terminate='yes'>element type must be specified</xsl:message>
+ </xsl:if>
+
+ <xsl:text disable-output-escaping='yes'>&lt;!ATTLIST </xsl:text>
+ <xsl:copy-of select='$type'/>
+ <xsl:text> </xsl:text>
+ <xsl:copy-of select='$attr-defns'/>
+ <xsl:text disable-output-escaping='yes'>&gt;</xsl:text>
+ </xsl:template>
+
+ <doc:template name="markup:attribute-definition" xmlns="">
+ <refpurpose>Create an Attribute Definition</refpurpose>
+
+ <refdescription>
+ <para>This template returns an attribute definition.</para>
+ </refdescription>
+
+ <refparameter>
+ <variablelist>
+ <varlistentry>
+ <term>name</term>
+ <listitem>
+ <para>The attribute name.</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>type</term>
+ <listitem>
+ <para>The attribute type.</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>default</term>
+ <listitem>
+ <para>The attribute default.</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+
+ <refreturn>
+ <para>Returns an attribute definition as a string.</para>
+ </refreturn>
+ </doc:template>
+
+ <xsl:template name='markup:attribute-definition'>
+ <xsl:param name='name'/>
+ <xsl:param name='type'/>
+ <xsl:param name='default'/>
+
+ <xsl:if test='string-length($name) = 0'>
+ <xsl:message terminate='yes'>attribute name must be specified</xsl:message>
+ </xsl:if>
+ <xsl:if test='string-length($type) = 0'>
+ <xsl:message terminate='yes'>attribute type must be specified</xsl:message>
+ </xsl:if>
+ <xsl:if test='string-length($default) = 0'>
+ <xsl:message terminate='yes'>attribute default must be specified</xsl:message>
+ </xsl:if>
+
+ <xsl:text> </xsl:text>
+ <xsl:copy-of select='$name'/>
+ <xsl:text> </xsl:text>
+ <xsl:copy-of select='$type'/>
+ <xsl:text> </xsl:text>
+ <xsl:copy-of select='$default'/>
+ </xsl:template>
+
+ <doc:template name="markup:entity-declaration" xmlns="">
+ <refpurpose>Create an Entity Declaration</refpurpose>
+
+ <refdescription>
+ <para>This template returns an entity declaration.</para>
+ <para>If the 'text' parameter is given a value, then an internal entity is created. If either the 'publicid' or 'systemid' parameters are given a value then an external entity is created. It is an error for the 'text' parameter to have value as well as the 'publicid', 'systemid' or 'notation' parameters.</para>
+ </refdescription>
+
+ <refparameter>
+ <variablelist>
+ <varlistentry>
+ <term>name</term>
+ <listitem>
+ <para>The entity name.</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>parameter</term>
+ <listitem>
+ <para>Boolean value to determine whether a parameter entity is created. Default is 'false()'.</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>text</term>
+ <listitem>
+ <para>The replacement text. Must be a string.</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>nodes</term>
+ <listitem>
+ <para>The replacement text as a nodeset. The nodeset is formatted as XML using the as-xml template. If both text and nodes are specified then nodes takes precedence.</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>publicid</term>
+ <listitem>
+ <para>The public identifier for an external entity.</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>systemid</term>
+ <listitem>
+ <para>The system identifier for an external entity.</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>notation</term>
+ <listitem>
+ <para>The notation for an external entity.</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+
+ <refreturn>
+ <para>Returns an entity declaration as a string.</para>
+ </refreturn>
+ </doc:template>
+
+ <xsl:template name='markup:entity-declaration'>
+ <xsl:param name='name'/>
+ <xsl:param name='parameter' select='false()'/>
+ <xsl:param name='text'/>
+ <xsl:param name='nodes'/>
+ <xsl:param name='publicid'/>
+ <xsl:param name='systemid'/>
+ <xsl:param name='notation'/>
+
+ <xsl:if test='string-length($name) = 0'>
+ <xsl:message terminate='yes'>entity name must be specified</xsl:message>
+ </xsl:if>
+ <xsl:if test='string-length($text) &gt; 0 and
+ (string-length($publicid) &gt; 0 or
+ string-length($systemid) &gt; 0 or
+ string-length($notation) &gt; 0)'>
+ <xsl:message terminate='yes'>both replacement text and external identifier specified</xsl:message>
+ </xsl:if>
+
+ <xsl:text disable-output-escaping='yes'>&lt;!ENTITY </xsl:text>
+ <xsl:copy-of select='$name'/>
+ <xsl:text> </xsl:text>
+ <xsl:if test="$parameter">
+ <xsl:text>% </xsl:text>
+ </xsl:if>
+
+ <xsl:choose>
+ <xsl:when test="$nodes">
+ <xsl:call-template name='markup:quote-value'>
+ <xsl:with-param name='value'>
+ <xsl:call-template name="markup:as-xml">
+ <xsl:with-param name="nodes" select="$nodes"/>
+ </xsl:call-template>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test='$text'>
+ <xsl:call-template name='markup:quote-value'>
+ <xsl:with-param name='value' select='$text'/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name='markup:external-identifier'>
+ <xsl:with-param name='publicid' select='$publicid'/>
+ <xsl:with-param name='systemid' select='$systemid'/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:if test='$notation'>
+ <xsl:text> NDATA "</xsl:text>
+ <xsl:copy-of select='$notation'/>
+ <xsl:text>"</xsl:text>
+ </xsl:if>
+
+ <xsl:text disable-output-escaping='yes'>&gt;</xsl:text>
+ </xsl:template>
+
+ <doc:template name="markup:quote-value" xmlns="">
+ <refpurpose>Quote an Attribute Value</refpurpose>
+
+ <refdescription>
+ <para>This template returns a quoted value.</para>
+ </refdescription>
+
+ <refparameter>
+ <variablelist>
+ <varlistentry>
+ <term>value</term>
+ <listitem>
+ <para>The value to quote.</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+
+ <refreturn>
+ <para>Returns a quote value as a string.</para>
+ </refreturn>
+ </doc:template>
+
+ <xsl:template name='markup:quote-value'>
+ <xsl:param name='value'/>
+
+ <xsl:variable name="quoted">
+ <xsl:call-template name='markup:quote-value-aux'>
+ <xsl:with-param name='value' select='$value'/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="contains($value, '&lt;')">
+ <xsl:call-template name='str:subst'>
+ <xsl:with-param name='text' select='$quoted'/>
+ <xsl:with-param name='replace'>&lt;</xsl:with-param>
+ <xsl:with-param name='with'>
+ <xsl:text disable-output-escaping='yes'>&amp;lt;</xsl:text>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:copy-of select='$quoted'/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+ <xsl:template name='markup:quote-value-aux'>
+ <xsl:param name='value'/>
+
+ <!-- Quoting hell! -->
+ <xsl:variable name="quot">&quot;</xsl:variable>
+ <xsl:variable name="apos">&apos;</xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test='contains($value, $quot) and contains($value, $apos)'>
+ <xsl:text>"</xsl:text>
+ <xsl:call-template name='str:subst'>
+ <xsl:with-param name='text' select='$value'/>
+ <xsl:with-param name='replace'>"</xsl:with-param>
+ <xsl:with-param name='with'>
+ <xsl:text disable-output-escaping='yes'>&amp;quot;</xsl:text>
+ </xsl:with-param>
+ </xsl:call-template>
+ <xsl:text>"</xsl:text>
+ </xsl:when>
+ <xsl:when test='contains($value, $quot)'>
+ <xsl:text>'</xsl:text>
+ <xsl:value-of select='$value'/>
+ <xsl:text>'</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text>"</xsl:text>
+ <xsl:value-of select='$value'/>
+ <xsl:text>"</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+ <doc:template name="markup:external-identifier" xmlns="">
+ <refpurpose>Create an External Identifier</refpurpose>
+
+ <refdescription>
+ <para>This template returns an external identifier.</para>
+ </refdescription>
+
+ <refparameter>
+ <variablelist>
+ <varlistentry>
+ <term>publicid</term>
+ <listitem>
+ <para>The public identifier.</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>systemid</term>
+ <listitem>
+ <para>The system identifier.</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+
+ <refreturn>
+ <para>Returns an external identifier as a string.</para>
+ </refreturn>
+ </doc:template>
+
+ <xsl:template name='markup:external-identifier'>
+ <xsl:param name='publicid'/>
+ <xsl:param name='systemid'/>
+ <xsl:param name='leading-space' select='false()'/>
+
+ <xsl:choose>
+ <xsl:when test='string-length($publicid) &gt; 0'>
+ <xsl:if test='$leading-space'>
+ <xsl:text> </xsl:text>
+ </xsl:if>
+ <xsl:text disable-output-escaping='yes'>PUBLIC "</xsl:text>
+ <xsl:value-of select='$publicid' disable-output-escaping='yes'/>
+ <xsl:text disable-output-escaping='yes'>"</xsl:text>
+ <xsl:if test='string-length($systemid) &gt; 0'>
+ <xsl:text disable-output-escaping='yes'> "</xsl:text>
+ <xsl:value-of select='$systemid' disable-output-escaping='yes'/>
+ <xsl:text disable-output-escaping='yes'>"</xsl:text>
+ </xsl:if>
+ </xsl:when>
+ <xsl:when test="string-length($systemid) &gt; 0">
+ <xsl:if test='$leading-space'>
+ <xsl:text> </xsl:text>
+ </xsl:if>
+ <xsl:text disable-output-escaping='yes'>SYSTEM "</xsl:text>
+ <xsl:value-of select='$systemid' disable-output-escaping='yes'/>
+ <xsl:text disable-output-escaping='yes'>"</xsl:text>
+ </xsl:when>
+ </xsl:choose>
+ </xsl:template>
+
+ <doc:template name="markup:entity-reference" xmlns="">
+ <refpurpose>Create an Entity Reference</refpurpose>
+
+ <refdescription>
+ <para>This template returns an entity reference.</para>
+ </refdescription>
+
+ <refparameter>
+ <variablelist>
+ <varlistentry>
+ <term>name</term>
+ <listitem>
+ <para>The name of the entity.</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+
+ <refreturn>
+ <para>Returns an entity reference as a string.</para>
+ </refreturn>
+ </doc:template>
+
+ <xsl:template name='markup:entity-reference'>
+ <xsl:param name='name'/>
+
+ <xsl:text disable-output-escaping='yes'>&amp;</xsl:text>
+ <xsl:value-of select='$name'/>
+ <xsl:text>;</xsl:text>
+
+ </xsl:template>
+
+ <doc:template name="markup:notation-declaration" xmlns="">
+ <refpurpose>Create a Notation Declaration</refpurpose>
+
+ <refdescription>
+ <para>This template returns a notation declaration.</para>
+ </refdescription>
+
+ <refparameter>
+ <variablelist>
+ <varlistentry>
+ <term>name</term>
+ <listitem>
+ <para>The notation name.</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>publicid</term>
+ <listitem>
+ <para>The public identifier for the notation.</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>systemid</term>
+ <listitem>
+ <para>The system identifier for the notation.</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+
+ <refreturn>
+ <para>Returns a notation declaration as a string.</para>
+ </refreturn>
+ </doc:template>
+
+ <xsl:template name='markup:notation-declaration'>
+ <xsl:param name='name'/>
+ <xsl:param name='publicid'/>
+ <xsl:param name='systemid'/>
+
+ <xsl:if test='string-length($name) = 0'>
+ <xsl:message terminate='yes'>notation name must be specified</xsl:message>
+ </xsl:if>
+ <xsl:if test='string-length($publicid) = 0 and string-length($systemid) = 0'>
+ <xsl:message terminate='yes'>external identifier must be specified</xsl:message>
+ </xsl:if>
+
+ <xsl:text disable-output-escaping='yes'>&lt;!NOTATION </xsl:text>
+ <xsl:copy-of select='$name'/>
+
+ <xsl:call-template name='markup:external-identifier'>
+ <xsl:with-param name='publicid' select='$publicid'/>
+ <xsl:with-param name='systemid' select='$systemid'/>
+ <xsl:with-param name='leading-space' select='true()'/>
+ </xsl:call-template>
+
+ <xsl:text disable-output-escaping='yes'>&gt;</xsl:text>
+ </xsl:template>
+
+ <doc:template name="markup:cdata-section" xmlns="">
+ <refpurpose>Create a CDATA Section</refpurpose>
+
+ <refdescription>
+ <para>This template returns a CDATA Section. The XSLT specification provides a mechanism for instructing the XSL processor to output character data in a CDATA section for certain elements, but this template may be useful in those circumstances where not all instances of an element are to have their content placed in a CDATA section.</para>
+ </refdescription>
+
+ <refparameter>
+ <variablelist>
+ <varlistentry>
+ <term>text</term>
+ <listitem>
+ <para>The content of the CDATA section.</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+
+ <refreturn>
+ <para>Returns a CDATA section as a string.</para>
+ </refreturn>
+ </doc:template>
+
+ <xsl:template name='markup:cdata-section'>
+ <xsl:param name='text'/>
+
+ <xsl:if test="contains($text, ']]&gt;')">
+ <xsl:message terminate="yes">CDATA section contains "]]&gt;"</xsl:message>
+ </xsl:if>
+
+ <xsl:text disable-output-escaping='yes'>&lt;![CDATA[</xsl:text>
+ <xsl:copy-of select='$text'/>
+ <xsl:text disable-output-escaping='yes'>]]&gt;</xsl:text>
+ </xsl:template>
+
+ <doc:template name="markup:as-xml" xmlns="">
+ <refpurpose>Format Nodeset As XML Markup</refpurpose>
+
+ <refdescription>
+ <para>This template returns XML markup. Each node in the given nodeset is converted to its equivalent XML markup.</para>
+
+ <para>BUG: This version may not adequately handle XML Namespaces.</para>
+ </refdescription>
+
+ <refparameter>
+ <variablelist>
+ <varlistentry>
+ <term>nodes</term>
+ <listitem>
+ <para>Nodeset to format as XML.</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+
+ <refreturn>
+ <para>Returns XML markup.</para>
+ </refreturn>
+ </doc:template>
+
+ <xsl:template name='markup:as-xml'>
+ <xsl:param name='nodes'/>
+
+ <xsl:if test="$nodes">
+ <xsl:choose>
+ <xsl:when test="$nodes[1]/self::*">
+ <xsl:text disable-output-escaping='yes'>&lt;</xsl:text>
+ <xsl:value-of select="name($nodes[1])"/>
+ <xsl:for-each select="$nodes[1]/@*">
+ <xsl:text> </xsl:text>
+ <xsl:value-of select="name()"/>
+ <xsl:text>=</xsl:text>
+ <xsl:call-template name='markup:quote-value'>
+ <xsl:with-param name='value' select='.'/>
+ </xsl:call-template>
+ </xsl:for-each>
+
+ <xsl:choose>
+ <xsl:when test='$nodes[1]/node()'>
+ <xsl:text disable-output-escaping='yes'>&gt;</xsl:text>
+ <xsl:call-template name='markup:as-xml'>
+ <xsl:with-param name='nodes' select='$nodes[1]/node()'/>
+ </xsl:call-template>
+ <xsl:text disable-output-escaping='yes'>&lt;/</xsl:text>
+ <xsl:value-of select="name($nodes[1])"/>
+ <xsl:text disable-output-escaping='yes'>&gt;</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text disable-output-escaping='yes'>/&gt;</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:when test="$nodes[1]/self::text()">
+ <xsl:value-of select="$nodes[1]"/>
+ </xsl:when>
+ <xsl:when test="$nodes[1]/self::comment()">
+ <xsl:text disable-output-escaping='yes'>&lt;!--</xsl:text>
+ <xsl:value-of select="$nodes[1]"/>
+ <xsl:text disable-output-escaping='yes'>--&gt;</xsl:text>
+ </xsl:when>
+ <xsl:when test="$nodes[1]/self::processing-instruction()">
+ <xsl:text disable-output-escaping='yes'>&lt;?</xsl:text>
+ <xsl:value-of select="name($nodes[1])"/>
+ <xsl:text> </xsl:text>
+ <xsl:value-of select="$nodes[1]"/>
+ <xsl:text disable-output-escaping='yes'>?&gt;</xsl:text>
+ </xsl:when>
+
+ <xsl:when test="not($nodes[1]/parent::*)"/> <!-- root node -->
+ <xsl:when test="count($nodes[1] | $nodes[1]/../namespace::*) = count($nodes[1]/../namespace::*)"/> <!-- namespace node -->
+ <xsl:when test="count($nodes[1] | $nodes[1]/../@*) = count($nodes[1]/../@*)"/> <!-- attribute node -->
+ </xsl:choose>
+
+ <xsl:call-template name="markup:as-xml">
+ <xsl:with-param name="nodes" select="$nodes[position() &gt; 1]"/>
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:template>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/keynote/xsltsl/math.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/keynote/xsltsl/math.xsl
new file mode 100644
index 0000000..e3e14dd
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/keynote/xsltsl/math.xsl
@@ -0,0 +1,704 @@
+<?xml version="1.0"?>
+<xsl:stylesheet version="1.0"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:doc="http://xsltsl.org/xsl/documentation/1.0"
+ xmlns:math="http://xsltsl.org/math"
+ exclude-result-prefixes="doc math">
+
+ <doc:reference xmlns="">
+ <referenceinfo>
+ <releaseinfo role="meta">
+ $Id: math.xsl 3991 2004-11-10 06:51:55Z balls $
+ </releaseinfo>
+ <author>
+ <surname>Ball</surname>
+ <firstname>Steve</firstname>
+ </author>
+ <copyright>
+ <year>2004</year>
+ <year>2002</year>
+ <holder>Steve Ball</holder>
+ </copyright>
+ </referenceinfo>
+
+ <title>Math Module</title>
+
+ <partintro>
+ <section>
+ <title>Introduction</title>
+
+ <para>This module provides mathematical functions.</para>
+ </section>
+ </partintro>
+
+ </doc:reference>
+
+ <doc:template name="math:power" xmlns="">
+ <refpurpose>Power</refpurpose>
+
+ <refdescription>
+ <para>Raises a number to a power.</para>
+ </refdescription>
+
+ <refparameter>
+ <variablelist>
+ <varlistentry>
+ <term>base</term>
+ <listitem>
+ <para>The base number. Must be a number.</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>power</term>
+ <listitem>
+ <para>The power to raise the number to. Must be an integer.</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+
+ <refreturn>
+ <para>Returns base multiplied by itself power times. If the base or power are not numbers or if the power is fractional then an empty string is returned.</para>
+ </refreturn>
+ </doc:template>
+
+ <xsl:template name="math:power">
+ <xsl:param name="base"/>
+ <xsl:param name="power"/>
+
+ <xsl:choose>
+ <xsl:when test='$power = "0" and $base = "0"'>
+ <xsl:text>1</xsl:text>
+ </xsl:when>
+ <xsl:when test='$power = "0" and number($base)'>
+ <xsl:text>1</xsl:text>
+ </xsl:when>
+ <xsl:when test='$power = "0" and not(number($base))'/>
+ <xsl:when test='$base = "0" and number($power)'>
+ <xsl:text>0</xsl:text>
+ </xsl:when>
+
+ <xsl:when test='not(number($base)) or not(number($power))'/>
+
+ <xsl:when test='floor(number($power)) != number($power)'/>
+
+ <xsl:when test='number($power) &lt; 0'>
+ <xsl:variable name='x'>
+ <xsl:call-template name='math:power'>
+ <xsl:with-param name='base' select='$base'/>
+ <xsl:with-param name='power' select='-1 * $power'/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:value-of select='1 div $x'/>
+ </xsl:when>
+
+ <xsl:when test='number($power) = 1'>
+ <xsl:value-of select='$base'/>
+ </xsl:when>
+
+ <xsl:when test='number($power) &gt; 0'>
+ <xsl:variable name='x'>
+ <xsl:call-template name='math:power'>
+ <xsl:with-param name='base' select='$base'/>
+ <xsl:with-param name='power' select='$power - 1'/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:value-of select='$base * $x'/>
+ </xsl:when>
+ <xsl:otherwise/>
+ </xsl:choose>
+ </xsl:template>
+
+ <doc:template name="math:abs" xmlns="">
+ <refpurpose>Absolute Value</refpurpose>
+
+ <refdescription>
+ <para>Absolute value of a number.</para>
+ </refdescription>
+
+ <refparameter>
+ <variablelist>
+ <varlistentry>
+ <term>number</term>
+ <listitem>
+ <para>The number. Must be a number.</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+
+ <refreturn>
+ <para>Returns the absolute value of the number.</para>
+ </refreturn>
+ </doc:template>
+
+ <xsl:template name="math:abs">
+ <xsl:param name="number"/>
+
+ <xsl:choose>
+ <xsl:when test='$number &lt; 0'>
+ <xsl:value-of select='$number * -1'/>
+ </xsl:when>
+ <xsl:when test='$number >= 0'>
+ <xsl:value-of select='$number'/>
+ </xsl:when>
+ </xsl:choose>
+ </xsl:template>
+
+ <doc:template name="math:cvt-hex-decimal" xmlns="">
+ <refpurpose>Conversion</refpurpose>
+
+ <refdescription>
+ <para>Converts a hexidecimal value to a decimal value.</para>
+ </refdescription>
+
+ <refparameter>
+ <variablelist>
+ <varlistentry>
+ <term>value</term>
+ <listitem>
+ <para>The hexidecimal number. Must be a number in hexidecimal format.</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+
+ <refreturn>
+ <para>Returns the value as a decimal string. If the value is not a number then a NaN value is returned.</para>
+ </refreturn>
+ </doc:template>
+
+ <xsl:template name="math:cvt-hex-decimal">
+ <xsl:param name="value"/>
+
+ <xsl:choose>
+ <xsl:when test='$value = ""'/>
+
+ <xsl:when test='string-length($value) = 1'>
+ <xsl:call-template name='math:cvt-hex-decimal-digit'>
+ <xsl:with-param name='digit' select='$value'/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:variable name='first-digit'>
+ <xsl:call-template name='math:cvt-hex-decimal-digit'>
+ <xsl:with-param name='digit' select='substring($value, 1, 1)'/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:variable name='remainder'>
+ <xsl:call-template name='math:cvt-hex-decimal'>
+ <xsl:with-param name='value' select='substring($value, 2)'/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:value-of select='$first-digit * 16 + $remainder'/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+ <xsl:template name='math:cvt-hex-decimal-digit'>
+ <xsl:param name='digit' select='0'/>
+ <xsl:choose>
+ <xsl:when test='$digit &lt;= 9'>
+ <xsl:value-of select='$digit'/>
+ </xsl:when>
+ <xsl:when test='$digit = "a" or $digit = "A"'>10</xsl:when>
+ <xsl:when test='$digit = "b" or $digit = "B"'>11</xsl:when>
+ <xsl:when test='$digit = "c" or $digit = "C"'>12</xsl:when>
+ <xsl:when test='$digit = "d" or $digit = "D"'>13</xsl:when>
+ <xsl:when test='$digit = "e" or $digit = "E"'>14</xsl:when>
+ <xsl:when test='$digit = "f" or $digit = "F"'>15</xsl:when>
+ </xsl:choose>
+ </xsl:template>
+
+ <doc:template name="math:cvt-decimal-hex" xmlns="">
+ <refpurpose>Conversion</refpurpose>
+
+ <refdescription>
+ <para>Converts a decimal value to a hexidecimal value.</para>
+ </refdescription>
+
+ <refparameter>
+ <variablelist>
+ <varlistentry>
+ <term>value</term>
+ <listitem>
+ <para>The decimal number.</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+
+ <refreturn>
+ <para>Returns the value as a hexidecimal string (lowercase). If the value is not a number then a NaN value is returned.</para>
+ </refreturn>
+ </doc:template>
+
+ <xsl:template name="math:cvt-decimal-hex">
+ <xsl:param name="value"/>
+
+ <xsl:choose>
+ <xsl:when test='$value = "0"'>0</xsl:when>
+ <xsl:when test='not(number($value))'>NaN</xsl:when>
+
+ <xsl:when test='$value div 16 >= 1'>
+ <xsl:call-template name='math:cvt-decimal-hex'>
+ <xsl:with-param name='value' select='floor($value div 16)'/>
+ </xsl:call-template>
+ <xsl:call-template name='math:cvt-decimal-hex'>
+ <xsl:with-param name='value' select='$value mod 16'/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test='$value = 10'>a</xsl:when>
+ <xsl:when test='$value = 11'>b</xsl:when>
+ <xsl:when test='$value = 12'>c</xsl:when>
+ <xsl:when test='$value = 13'>d</xsl:when>
+ <xsl:when test='$value = 14'>e</xsl:when>
+ <xsl:when test='$value = 15'>f</xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select='$value'/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+ <doc:template name="math:ordinal" xmlns="">
+ <refpurpose>Ordinal number</refpurpose>
+
+ <refdescription>
+ <para>Gives the ordinal number of a given counting number. For example, 1 becomes "1st".</para>
+ </refdescription>
+
+ <refparameter>
+ <variablelist>
+ <varlistentry>
+ <term>number</term>
+ <listitem>
+ <para>An integer number.</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+
+ <refreturn>
+ <para>Returns the number with an ordinal suffix.</para>
+ </refreturn>
+ </doc:template>
+
+ <xsl:template name="math:ordinal">
+ <xsl:param name="number"/>
+
+ <xsl:choose>
+ <xsl:when test='$number &lt; 0'/>
+ <xsl:otherwise>
+ <xsl:value-of select='$number'/>
+ <xsl:choose>
+ <xsl:when test='$number = 11 or $number = 12 or $number = 13'>th</xsl:when>
+ <xsl:when test='$number mod 10 = 1'>st</xsl:when>
+ <xsl:when test='$number mod 10 = 2'>nd</xsl:when>
+ <xsl:when test='$number mod 10 = 3'>rd</xsl:when>
+ <xsl:otherwise>th</xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+
+ <doc:template name="math:ordinal-as-word" xmlns="">
+ <refpurpose>Returns an ordinal number</refpurpose>
+
+ <refdescription>
+ <para>This template returns the ordinal number for a given counting number as a word. For example "first" for 1.</para>
+ <para>Only handles numbers less than 10000000 (ten million).</para>
+ </refdescription>
+
+ <refparameter>
+ <variablelist>
+ <varlistentry>
+ <term>number</term>
+ <listitem>
+ <para>The counting number.</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>conjunctive</term>
+ <listitem>
+ <para>Whether to add the word "and" to the result, for example "one hundred and first" rather than "one hundred first". Default is "yes".</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+
+ <refreturn>
+ <para>Returns the ordinal number as a string.</para>
+ </refreturn>
+ </doc:template>
+
+ <xsl:template name="math:ordinal-as-word">
+ <xsl:param name="number" select="0"/>
+ <xsl:param name='conjunctive' select='"yes"'/>
+ <xsl:param name='preceding' select='0'/>
+
+ <xsl:choose>
+ <xsl:when test='$preceding = 1 and $number = 0'/>
+ <xsl:when test='$number = 0'>zeroth</xsl:when>
+
+ <xsl:when test="$number &lt; 1 or $number != floor($number)"/>
+
+ <xsl:when test='$number = 1'>
+ <xsl:if test='$preceding = 1'> and </xsl:if>
+ <xsl:text>first</xsl:text>
+ </xsl:when>
+ <xsl:when test='$number = 2'>
+ <xsl:if test='$preceding = 1'> and </xsl:if>
+ <xsl:text>second</xsl:text>
+ </xsl:when>
+ <xsl:when test='$number = 3'>
+ <xsl:if test='$preceding = 1'> and </xsl:if>
+ <xsl:text>third</xsl:text>
+ </xsl:when>
+ <xsl:when test='$number = 4'>
+ <xsl:if test='$preceding = 1'> and </xsl:if>
+ <xsl:text>fourth</xsl:text>
+ </xsl:when>
+ <xsl:when test='$number = 5'>
+ <xsl:if test='$preceding = 1'> and </xsl:if>
+ <xsl:text>fifth</xsl:text>
+ </xsl:when>
+ <xsl:when test='$number = 6'>
+ <xsl:if test='$preceding = 1'> and </xsl:if>
+ <xsl:text>sixth</xsl:text>
+ </xsl:when>
+ <xsl:when test='$number = 7'>
+ <xsl:if test='$preceding = 1'> and </xsl:if>
+ <xsl:text>seventh</xsl:text>
+ </xsl:when>
+ <xsl:when test='$number = 8'>
+ <xsl:if test='$preceding = 1'> and </xsl:if>
+ <xsl:text>eighth</xsl:text>
+ </xsl:when>
+ <xsl:when test='$number = 9'>
+ <xsl:if test='$preceding = 1'> and </xsl:if>
+ <xsl:text>ninth</xsl:text>
+ </xsl:when>
+ <xsl:when test='$number = 10'>
+ <xsl:if test='$preceding = 1'> and </xsl:if>
+ <xsl:text>tenth</xsl:text>
+ </xsl:when>
+ <xsl:when test='$number = 11'>
+ <xsl:if test='$preceding = 1'> and </xsl:if>
+ <xsl:text>eleventh</xsl:text>
+ </xsl:when>
+ <xsl:when test='$number = 12'>
+ <xsl:if test='$preceding = 1'> and </xsl:if>
+ <xsl:text>twelveth</xsl:text>
+ </xsl:when>
+ <xsl:when test='$number = 13'>
+ <xsl:if test='$preceding = 1'> and </xsl:if>
+ <xsl:text>thirteenth</xsl:text>
+ </xsl:when>
+ <xsl:when test='$number = 14'>
+ <xsl:if test='$preceding = 1'> and </xsl:if>
+ <xsl:text>fourteenth</xsl:text>
+ </xsl:when>
+ <xsl:when test='$number = 15'>
+ <xsl:if test='$preceding = 1'> and </xsl:if>
+ <xsl:text>fifteenth</xsl:text>
+ </xsl:when>
+ <xsl:when test='$number = 16'>
+ <xsl:if test='$preceding = 1'> and </xsl:if>
+ <xsl:text>sixteenth</xsl:text>
+ </xsl:when>
+ <xsl:when test='$number = 17'>
+ <xsl:if test='$preceding = 1'> and </xsl:if>
+ <xsl:text>seventeenth</xsl:text>
+ </xsl:when>
+ <xsl:when test='$number = 18'>
+ <xsl:if test='$preceding = 1'> and </xsl:if>
+ <xsl:text>eighteenth</xsl:text>
+ </xsl:when>
+ <xsl:when test='$number = 19'>
+ <xsl:if test='$preceding = 1'> and </xsl:if>
+ <xsl:text>nineteenth</xsl:text>
+ </xsl:when>
+ <xsl:when test='$number = 20'>
+ <xsl:if test='$preceding = 1'> and </xsl:if>
+ <xsl:text>twentieth</xsl:text>
+ </xsl:when>
+ <xsl:when test='$number = 30'>
+ <xsl:if test='$preceding = 1'> and </xsl:if>
+ <xsl:text>thirtieth</xsl:text>
+ </xsl:when>
+ <xsl:when test='$number = 40'>
+ <xsl:if test='$preceding = 1'> and </xsl:if>
+ <xsl:text>fortieth</xsl:text>
+ </xsl:when>
+ <xsl:when test='$number = 50'>
+ <xsl:if test='$preceding = 1'> and </xsl:if>
+ <xsl:text>fiftieth</xsl:text>
+ </xsl:when>
+ <xsl:when test='$number = 60'>
+ <xsl:if test='$preceding = 1'> and </xsl:if>
+ <xsl:text>sixtieth</xsl:text>
+ </xsl:when>
+ <xsl:when test='$number = 70'>
+ <xsl:if test='$preceding = 1'> and </xsl:if>
+ <xsl:text>seventieth</xsl:text>
+ </xsl:when>
+ <xsl:when test='$number = 80'>
+ <xsl:if test='$preceding = 1'> and </xsl:if>
+ <xsl:text>eightieth</xsl:text>
+ </xsl:when>
+ <xsl:when test='$number = 90'>
+ <xsl:if test='$preceding = 1'> and </xsl:if>
+ <xsl:text>ninetieth</xsl:text>
+ </xsl:when>
+
+ <xsl:when test='$number mod 1000000 = 0'>
+ <xsl:call-template name='math:number-as-word'>
+ <xsl:with-param name='number' select='floor($number div 1000000)'/>
+ </xsl:call-template>
+ <xsl:text> millionth</xsl:text>
+ </xsl:when>
+ <xsl:when test='$number &lt; 1000000 and $number mod 1000 = 0'>
+ <xsl:if test='$preceding = 1 and $conjunctive'> and </xsl:if>
+ <xsl:call-template name='math:number-as-word'>
+ <xsl:with-param name='number' select='floor($number div 1000)'/>
+ </xsl:call-template>
+ <xsl:text> thousandth</xsl:text>
+ </xsl:when>
+ <xsl:when test='$number &lt; 1000 and $number mod 100 = 0'>
+ <xsl:if test='$preceding = 1 and $conjunctive'> and </xsl:if>
+ <xsl:call-template name='math:number-as-word'>
+ <xsl:with-param name='number' select='floor($number div 100)'/>
+ </xsl:call-template>
+ <xsl:text> hundredth</xsl:text>
+ </xsl:when>
+
+ <xsl:when test='$number &gt; 1000000'>
+ <xsl:if test='$preceding = 1'>
+ <xsl:text> </xsl:text>
+ <xsl:if test='$conjunctive'>and </xsl:if>
+ </xsl:if>
+ <xsl:call-template name='math:number-as-word'>
+ <xsl:with-param name='number' select='floor($number div 1000000) * 1000000'/>
+ </xsl:call-template>
+ <xsl:choose>
+ <xsl:when
+ test='(floor(floor(($number mod 1000000) + 0.1) div 100000) > 0 and $number mod 100000 > 0) or
+ (floor(floor(($number mod 100000) + 0.1) div 10000) > 0 and $number mod 10000 > 0) or
+ (floor(floor(($number mod 10000) + 0.1) div 1000) > 0 and $number mod 1000 > 0) or
+ (floor(floor(($number mod 1000) + 0.1) div 100) > 0 and $number mod 100 > 0) or
+ (floor(floor(($number mod 100) + 0.1) div 10) > 0 and $number mod 10 > 0 and $number mod 100 > 20)'>
+ <xsl:text> </xsl:text>
+ <xsl:call-template name='math:ordinal-as-word'>
+ <xsl:with-param name='number' select='floor(($number mod 1000000) + 0.1)'/>
+ <xsl:with-param name='conjunctive' select='$conjunctive'/>
+ <xsl:with-param name='preceding' select='0'/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name='math:ordinal-as-word'>
+ <xsl:with-param name='number' select='floor(($number mod 1000000) + 0.1)'/>
+ <xsl:with-param name='conjunctive' select='$conjunctive'/>
+ <xsl:with-param name='preceding' select='1'/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:when test='$number &gt; 1000'>
+ <xsl:if test='$preceding = 1'>
+ <xsl:text> </xsl:text>
+ <xsl:if test='$conjunctive'>and </xsl:if>
+ </xsl:if>
+ <xsl:call-template name='math:number-as-word'>
+ <xsl:with-param name='number' select='floor($number div 1000) * 1000'/>
+ <xsl:with-param name='conjunctive' select='$conjunctive'/>
+ </xsl:call-template>
+ <xsl:choose>
+ <xsl:when test='floor(floor(($number mod 1000) + 0.1) div 100) > 0'>
+ <xsl:text> </xsl:text>
+ <xsl:call-template name='math:ordinal-as-word'>
+ <xsl:with-param name='number' select='floor(($number mod 1000) + 0.1)'/>
+ <xsl:with-param name='conjunctive' select='$conjunctive'/>
+ <xsl:with-param name='preceding' select='0'/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name='math:ordinal-as-word'>
+ <xsl:with-param name='number' select='floor(($number mod 1000) + 0.1)'/>
+ <xsl:with-param name='conjunctive' select='$conjunctive'/>
+ <xsl:with-param name='preceding' select='1'/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:when test='$number &gt; 100'>
+ <xsl:if test='$preceding = 1'>
+ <xsl:text> </xsl:text>
+ <xsl:if test='$conjunctive'>and </xsl:if>
+ </xsl:if>
+ <xsl:call-template name='math:number-as-word'>
+ <xsl:with-param name='number' select='floor($number div 100) * 100'/>
+ </xsl:call-template>
+ <xsl:call-template name='math:ordinal-as-word'>
+ <xsl:with-param name='number' select='floor(($number mod 100) + 0.1)'/>
+ <xsl:with-param name='conjunctive' select='$conjunctive'/>
+ <xsl:with-param name='preceding' select='1'/>
+ </xsl:call-template>
+ </xsl:when>
+
+ <xsl:when test='$number &gt; 20'>
+ <xsl:if test='$preceding = 1'>
+ <xsl:text> </xsl:text>
+ <xsl:if test='$conjunctive'>and </xsl:if>
+ </xsl:if>
+ <xsl:call-template name='math:number-as-word'>
+ <xsl:with-param name='number' select='floor($number div 10) * 10'/>
+ </xsl:call-template>
+ <xsl:text> </xsl:text>
+ <xsl:call-template name='math:ordinal-as-word'>
+ <xsl:with-param name='number' select='floor(($number mod 10) + 0.1)'/>
+ <xsl:with-param name='conjunctive' select='$conjunctive'/>
+ </xsl:call-template>
+ </xsl:when>
+
+ <xsl:otherwise/>
+ </xsl:choose>
+ </xsl:template>
+
+ <doc:template name="math:number-as-word" xmlns="">
+ <refpurpose>Returns a number as a word</refpurpose>
+
+ <refdescription>
+ <para>This template returns the word for a given integer number, for example "one" for 1.</para>
+ <para>Only handles numbers less than 10000000 (ten million).</para>
+ </refdescription>
+
+ <refparameter>
+ <variablelist>
+ <varlistentry>
+ <term>number</term>
+ <listitem>
+ <para>The counting number.</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>conjunctive</term>
+ <listitem>
+ <para>Adds the word "and" where appropriate, for example.</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+
+ <refreturn>
+ <para>Returns the number as a string.</para>
+ </refreturn>
+ </doc:template>
+
+ <xsl:template name="math:number-as-word">
+ <xsl:param name="number" select="0"/>
+ <xsl:param name='conjunctive' select='true()'/>
+
+ <xsl:choose>
+
+ <xsl:when test='$number = 0'>zero</xsl:when>
+
+ <xsl:when test='$number &lt; 0'>
+ <xsl:text>minus </xsl:text>
+ <xsl:call-template name='math:number-as-word'>
+ <xsl:with-param name='number' select='-1 * $number'/>
+ </xsl:call-template>
+ </xsl:when>
+
+ <xsl:when test="$number != floor($number)"/>
+
+ <xsl:when test='$number mod 1000000 = 0'>
+ <xsl:call-template name='math:number-as-word'>
+ <xsl:with-param name='number' select='floor($number div 1000000)'/>
+ </xsl:call-template>
+ <xsl:text> million</xsl:text>
+ </xsl:when>
+ <xsl:when test='$number &gt;= 1000000'>
+ <xsl:call-template name='math:number-as-word'>
+ <xsl:with-param name='number' select='floor($number div 1000000)'/>
+ </xsl:call-template>
+ <xsl:text> million </xsl:text>
+ <xsl:call-template name='math:number-as-word'>
+ <xsl:with-param name='number' select='floor(($number mod 1000000) + 0.1)'/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test='$number mod 1000 = 0'>
+ <xsl:call-template name='math:number-as-word'>
+ <xsl:with-param name='number' select='floor($number div 1000)'/>
+ </xsl:call-template>
+ <xsl:text> thousand</xsl:text>
+ </xsl:when>
+ <xsl:when test='$number &gt;= 1000'>
+ <xsl:call-template name='math:number-as-word'>
+ <xsl:with-param name='number' select='floor($number div 1000)'/>
+ </xsl:call-template>
+ <xsl:text> thousand </xsl:text>
+ <xsl:if test='$conjunctive and floor(floor(($number mod 1000) + 0.1) div 100) = 0'>and </xsl:if>
+ <xsl:call-template name='math:number-as-word'>
+ <xsl:with-param name='number' select='floor(($number mod 1000) + 0.1)'/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test='$number mod 100 = 0'>
+ <xsl:call-template name='math:number-as-word'>
+ <xsl:with-param name='number' select='floor($number div 100)'/>
+ </xsl:call-template>
+ <xsl:text> hundred</xsl:text>
+ </xsl:when>
+ <xsl:when test='$number &gt;= 100'>
+ <xsl:call-template name='math:number-as-word'>
+ <xsl:with-param name='number' select='floor($number div 100)'/>
+ </xsl:call-template>
+ <xsl:text> hundred </xsl:text>
+ <xsl:if test='$conjunctive'>and </xsl:if>
+ <xsl:call-template name='math:number-as-word'>
+ <xsl:with-param name='number' select='floor(($number mod 100) + 0.1)'/>
+ </xsl:call-template>
+ </xsl:when>
+
+ <xsl:when test='$number = 1'>one</xsl:when>
+ <xsl:when test='$number = 2'>two</xsl:when>
+ <xsl:when test='$number = 3'>three</xsl:when>
+ <xsl:when test='$number = 4'>four</xsl:when>
+ <xsl:when test='$number = 5'>five</xsl:when>
+ <xsl:when test='$number = 6'>six</xsl:when>
+ <xsl:when test='$number = 7'>seven</xsl:when>
+ <xsl:when test='$number = 8'>eight</xsl:when>
+ <xsl:when test='$number = 9'>nine</xsl:when>
+ <xsl:when test='$number = 10'>ten</xsl:when>
+ <xsl:when test='$number = 11'>eleven</xsl:when>
+ <xsl:when test='$number = 12'>twelve</xsl:when>
+ <xsl:when test='$number = 13'>thirteen</xsl:when>
+ <xsl:when test='$number = 14'>fourteen</xsl:when>
+ <xsl:when test='$number = 15'>fifteen</xsl:when>
+ <xsl:when test='$number = 16'>sixteen</xsl:when>
+ <xsl:when test='$number = 17'>seventeen</xsl:when>
+ <xsl:when test='$number = 18'>eighteen</xsl:when>
+ <xsl:when test='$number = 19'>nineteen</xsl:when>
+ <xsl:when test='$number = 20'>twenty</xsl:when>
+ <xsl:when test='$number = 30'>thirty</xsl:when>
+ <xsl:when test='$number = 40'>forty</xsl:when>
+ <xsl:when test='$number = 50'>fifty</xsl:when>
+ <xsl:when test='$number = 60'>sixty</xsl:when>
+ <xsl:when test='$number = 70'>seventy</xsl:when>
+ <xsl:when test='$number = 80'>eighty</xsl:when>
+ <xsl:when test='$number = 90'>ninety</xsl:when>
+
+ <xsl:when test='$number &lt; 100'>
+ <xsl:call-template name='math:number-as-word'>
+ <xsl:with-param name='number' select='floor($number div 10) * 10'/>
+ </xsl:call-template>
+ <xsl:text> </xsl:text>
+ <xsl:call-template name='math:number-as-word'>
+ <xsl:with-param name='number' select='floor(($number mod 10) + 0.1)'/>
+ </xsl:call-template>
+ </xsl:when>
+ </xsl:choose>
+ </xsl:template>
+</xsl:stylesheet>
+
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/keynote/xsltsl/node.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/keynote/xsltsl/node.xsl
new file mode 100644
index 0000000..bf4fd7f
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/keynote/xsltsl/node.xsl
@@ -0,0 +1,229 @@
+<?xml version="1.0"?>
+
+<xsl:stylesheet version="1.0"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:doc="http://xsltsl.org/xsl/documentation/1.0"
+ xmlns:node="http://xsltsl.org/node"
+ extension-element-prefixes="doc node">
+
+ <doc:reference xmlns="">
+ <referenceinfo>
+ <releaseinfo role="meta">
+ $Id: node.xsl 3991 2004-11-10 06:51:55Z balls $
+ </releaseinfo>
+ <author>
+ <surname>Ball</surname>
+ <firstname>Steve</firstname>
+ </author>
+ <copyright>
+ <year>2001</year>
+ <holder>Steve Ball</holder>
+ </copyright>
+ </referenceinfo>
+
+ <title>Node Templates</title>
+
+ <partintro>
+ <section>
+ <title>Introduction</title>
+
+ <para>This stylesheet module provides functions for reporting on or manipulating nodes and nodesets.</para>
+
+ </section>
+ </partintro>
+
+ </doc:reference>
+
+ <doc:template name="node:xpath" xmlns="">
+ <refpurpose>Returns an XPath location path</refpurpose>
+
+ <refdescription>
+ <para>This template returns an XPath location path that uniquely identifies the given node within the document.</para>
+ </refdescription>
+
+ <refparameter>
+ <variablelist>
+ <varlistentry>
+ <term>node</term>
+ <listitem>
+ <para>The node to create an XPath for. If this parameter is given as a nodeset, then the first node in the nodeset is used.</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+
+ <refreturn>
+ <para>Returns an XPath location path as a string.</para>
+ </refreturn>
+ </doc:template>
+
+ <xsl:template name="node:xpath">
+ <xsl:param name="node" select="."/>
+
+ <xsl:choose>
+
+ <xsl:when test="$node">
+
+ <xsl:for-each select="$node[1]/ancestor-or-self::*">
+ <xsl:text/>/<xsl:value-of select="name()"/>
+ <xsl:text/>[<xsl:value-of select="count(preceding-sibling::*[name() = name(current())]) + 1"/>]<xsl:text/>
+ </xsl:for-each>
+
+ <xsl:choose>
+
+ <xsl:when test="$node[1]/self::comment()">
+ <xsl:text>/comment()</xsl:text>
+ <xsl:text/>[<xsl:value-of select="count($node[1]/preceding-sibling::comment()) + 1" />]<xsl:text/>
+ </xsl:when>
+
+ <xsl:when test="$node[1]/self::processing-instruction()">
+ <xsl:text>/processing-instruction()</xsl:text>
+ <xsl:text/>[<xsl:value-of select="count($node[1]/preceding-sibling::processing-instruction()) + 1" />]<xsl:text/>
+ </xsl:when>
+
+ <xsl:when test="$node[1]/self::text()">
+ <xsl:text>/text()</xsl:text>
+ <xsl:text/>[<xsl:value-of select="count($node[1]/preceding-sibling::text()) + 1" />]<xsl:text/>
+ </xsl:when>
+
+ <xsl:when test="not($node[1]/..)">
+ <xsl:text>/</xsl:text>
+ </xsl:when>
+
+ <xsl:when test="count($node[1]/../namespace::* | $node[1]) = count($node[1]/../namespace::*)">
+ <xsl:text/>/namespace::<xsl:value-of select="name($node[1])" />
+ </xsl:when>
+
+ <xsl:when test="count($node[1]/../@* | $node[1]) = count($node[1]/../@*)">
+ <xsl:text/>/@<xsl:value-of select="name($node[1])" />
+ </xsl:when>
+
+ </xsl:choose>
+ </xsl:when>
+
+ <xsl:otherwise>
+ <xsl:text>/..</xsl:text>
+ </xsl:otherwise>
+
+ </xsl:choose>
+
+ </xsl:template>
+
+ <doc:template name="node:type" xmlns="">
+ <refpurpose>Return node type</refpurpose>
+
+ <refdescription>
+ <para>Returns the type of a node as a string.</para>
+ </refdescription>
+
+ <refparameter>
+ <variablelist>
+ <varlistentry>
+ <term>node</term>
+ <listitem>
+ <para>The node to get the type for. If this parameter is given as a nodeset, then the first node in the nodeset is used.</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+
+ <refreturn>
+ <para>Returns node type as a string. Values returned are:</para>
+ <variablelist>
+ <varlistentry>
+ <term>Element</term>
+ <listitem>
+ <para><literal>element</literal></para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>Text Node</term>
+ <listitem>
+ <para><literal>text</literal></para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>Comment</term>
+ <listitem>
+ <para><literal>comment</literal></para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>Processing Instruction</term>
+ <listitem>
+ <para><literal>processing instruction</literal></para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refreturn>
+ </doc:template>
+
+ <xsl:template name="node:type">
+ <xsl:param name="node" select="."/>
+
+ <xsl:choose>
+ <xsl:when test="not($node)"/>
+ <xsl:when test="$node[1]/self::*">
+ <xsl:text>element</xsl:text>
+ </xsl:when>
+ <xsl:when test="$node[1]/self::text()">
+ <xsl:text>text</xsl:text>
+ </xsl:when>
+ <xsl:when test="$node[1]/self::comment()">
+ <xsl:text>comment</xsl:text>
+ </xsl:when>
+ <xsl:when test="$node[1]/self::processing-instruction()">
+ <xsl:text>processing instruction</xsl:text>
+ </xsl:when>
+ <xsl:when test="not($node[1]/parent::*)">
+ <xsl:text>root</xsl:text>
+ </xsl:when>
+ <xsl:when test="count($node[1] | $node[1]/../namespace::*) = count($node[1]/../namespace::*)">
+ <xsl:text>namespace</xsl:text>
+ </xsl:when>
+ <xsl:when test="count($node[1] | $node[1]/../@*) = count($node[1]/../@*)">
+ <xsl:text>attribute</xsl:text>
+ </xsl:when>
+ </xsl:choose>
+ </xsl:template>
+
+ <doc:template name="node:copy" xmlns="">
+ <refpurpose>Copy Nodes</refpurpose>
+
+ <refdescription>
+ <para>Makes a copy of the given nodes, including attributes and descendants.</para>
+ </refdescription>
+
+ <refparameter>
+ <variablelist>
+ <varlistentry>
+ <term>nodes</term>
+ <listitem>
+ <para>The nodes to copy.</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+
+ <refreturn>
+ <para>Returns the copied nodes as a result tree fragment.</para>
+ </refreturn>
+ </doc:template>
+
+ <xsl:template name='node:copy'>
+ <xsl:param name='nodes' select='.'/>
+
+ <xsl:for-each select='$nodes'>
+ <xsl:copy>
+ <xsl:for-each select='@*'>
+ <xsl:copy/>
+ </xsl:for-each>
+
+ <xsl:for-each select='node()'>
+ <xsl:call-template name='node:copy'/>
+ </xsl:for-each>
+ </xsl:copy>
+ </xsl:for-each>
+ </xsl:template>
+</xsl:stylesheet>
+
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/keynote/xsltsl/stdlib.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/keynote/xsltsl/stdlib.xsl
new file mode 100644
index 0000000..c014f13
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/keynote/xsltsl/stdlib.xsl
@@ -0,0 +1,340 @@
+<?xml version="1.0"?>
+<!DOCTYPE xsl:stylesheet [
+ <!ENTITY version "1.2.1">
+]>
+
+<xsl:stylesheet
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:doc="http://xsltsl.org/xsl/documentation/1.0"
+ exclude-result-prefixes="doc"
+ version="1.0">
+
+ <xsl:import href="string.xsl"/>
+ <xsl:import href="date-time.xsl"/>
+ <xsl:import href="node.xsl"/>
+ <xsl:import href="uri.xsl"/>
+ <xsl:import href="markup.xsl"/>
+ <xsl:import href="math.xsl"/>
+ <xsl:import href="cmp.xsl"/>
+
+ <xsl:import href="svg.xsl"/>
+<!--
+ <xsl:import href="html/html.xsl"/>
+ <xsl:import href="fo/fo.xsl"/>
+-->
+
+ <!-- For a new module, add an import element here -->
+ <xsl:import href="example.xsl"/>
+
+ <doc:book xmlns="">
+ <bookinfo>
+ <title>XSLT Standard Library</title>
+ <subtitle>Version &version;</subtitle>
+ <!-- $Id: stdlib.xsl 3991 2004-11-10 06:51:55Z balls $ -->
+
+ <author>
+ <surname>Ball</surname>
+ <firstname>Steve</firstname>
+ </author>
+ <copyright>
+ <year>2004</year>
+ <year>2002</year>
+ <holder>Steve Ball</holder>
+ </copyright>
+ </bookinfo>
+
+ <preface>
+ <para>The <ulink url="http://www.w3.org/Style/XSL">XSLT</ulink> Standard Library, <acronym>xsltsl</acronym>, provides the XSLT developer with a set of XSLT templates for commonly used functions. These are implemented purely in XSLT, that is they do not use any extensions.</para>
+ <para><acronym>xsltsl</acronym> is a <ulink url="http://sourceforge.net/projects/xsltsl/">SourceForge project</ulink>.</para>
+ <para><ulink url="http://sourceforge.net/"><inlinemediaobject>
+ <imageobject>
+ <imagedata fileref="sflogo.gif" width="88" height="31"/>
+ </imageobject>
+ <textobject>
+ <phrase>SourceForge Logo</phrase>
+ </textobject>
+ </inlinemediaobject></ulink></para>
+ <para>Goals of the <acronym>xsltsl</acronym> project include:</para>
+ <itemizedlist>
+ <listitem>
+ <para>Provision of a high-quality library of XSLT templates, suitable for inclusion by vendors in XSLT processor software products.</para>
+ </listitem>
+ <listitem>
+ <para>Demonstration of best practice in XSLT stylesheet development and documentation.</para>
+ </listitem>
+ <listitem>
+ <para>Provide examples of various techniques used to develop XSLT stylesheets (ie. a working FAQ).</para>
+ </listitem>
+ </itemizedlist>
+ </preface>
+
+ <chapter>
+ <title>Using The Library</title>
+
+ <para>There are two ways of using the library:</para>
+ <itemizedlist>
+ <listitem>
+ <para>Use a local copy of the library.</para>
+ <orderedlist>
+ <listitem>
+ <para>Download the distribution (see below).</para>
+ </listitem>
+ <listitem>
+ <para>Unpack the distribution, using either gunzip/tar or unzip.</para>
+ </listitem>
+ <listitem>
+ <para>In your stylesheet import or include either the main stylesheet, <filename>stdlib.xsl</filename>, or the stylesheet module you wish to use, such as <filename>string.xsl</filename>. This example assumes that the distribution has been extracted into the same directory as your own stylesheet:</para>
+ <informalexample>
+ <programlisting><![CDATA[
+<xsl:import href="stdlib.xsl"/>
+]]></programlisting>
+ </informalexample>
+ </listitem>
+ </orderedlist>
+ </listitem>
+ <listitem>
+ <para>Import or include either the main stylesheet, or the stylesheet module you wish to use, directly from the library website; http://xsltsl.sourceforge.net/modules/. The <filename>modules</filename> directory always contains the latest stable release. For example:</para>
+ <informalexample>
+ <programlisting><![CDATA[
+<xsl:import href="http://xsltsl.sourceforge.net/modules/stdlib.xsl"/>
+]]></programlisting>
+ </informalexample>
+ <para>Older versions of the library are available in subdirectories. For example, to access version 1.1 of the library use:</para>
+ <informalexample>
+ <programlisting><![CDATA[
+<xsl:import href="http://xsltsl.sourceforge.net/modules/1.1/stdlib.xsl"/>
+]]></programlisting>
+ </informalexample>
+ </listitem>
+ </itemizedlist>
+ <para>Next, add XML Namespace declarations for the modules you wish to use. For example, to use templates from the string module, your stylesheet should have the following declaration:</para>
+ <informalexample>
+ <programlisting><![CDATA[
+<xsl:stylesheet version="1.0"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:str="http://xsltsl.org/string">
+
+<xsl:import href="http://xsltsl.sourceforge.net/modules/stdlib.xsl"/>
+]]></programlisting>
+ </informalexample>
+ <para>Finally, use a template with the <sgmltag>call-template</sgmltag> element. Most templates require parameters, which are passed using the <sgmltag>with-param</sgmltag> element. For example:</para>
+ <informalexample>
+ <programlisting><![CDATA[
+<xsl:template match="foo">
+ <xsl:call-template name="str:subst">
+ <xsl:with-param name="text" select="."/>
+ <xsl:with-param name="replace">a word</xsl:with-param>
+ <xsl:with-param name="with">another word</xsl:with-param>
+ </xsl:call-template>
+</xsl:template>
+]]></programlisting>
+ </informalexample>
+ </chapter>
+
+ <chapter>
+ <title>Obtaining The Library</title>
+
+ <para>The XSLT Standard Library is available for download as either:</para>
+ <itemizedlist>
+ <listitem>
+ <para>Gzip'd tarball: <ulink url="http://prdownloads.sourceforge.net/xsltsl/xsltsl-&version;.tar.gz">http://prdownloads.sourceforge.net/xsltsl/xsltsl-&version;.tar.gz</ulink></para>
+ </listitem>
+ <listitem>
+ <para>Zip file: <ulink url="http://prdownloads.sourceforge.net/xsltsl/xsltsl-&version;.zip">http://prdownloads.sourceforge.net/xsltsl/xsltsl-&version;.zip</ulink></para>
+ </listitem>
+ </itemizedlist>
+ </chapter>
+
+ <chapter>
+ <title>Getting Involved</title>
+
+ <para>Contributions to the project are most welcome, and may be in the form of stylesheet modules, patches, bug reports or sample code. Any contributed code must use the LGPL license to be accepted into the library.</para>
+
+ <para>See the SourceForge Project Page <ulink url="http://sourceforge.net/projects/xsltsl/">http://sourceforge.net/projects/xsltsl/</ulink> for information on the development of the project. Bug reports may be submitted here.</para>
+
+ <para>See the project Web Page <ulink url="http://xsltsl.sourceforge.net/">http://xsltsl.sourceforge.net/</ulink> for documentation.</para>
+
+ <para>There are three mailing lists for the project:</para>
+ <variablelist>
+ <varlistentry>
+ <term><email>xsltsl-users@lists.sourceforge.net</email></term>
+ <listitem>
+ <para>Discussion of the use of <acronym>xsltsl</acronym>.</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><email>xsltsl-devel@lists.sourceforge.net</email></term>
+ <listitem>
+ <para>Discussion of the development of <acronym>xsltsl</acronym>.</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><email>xsltsl-announce@lists.sourceforge.net</email></term>
+ <listitem>
+ <para>Project announcements.</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </chapter>
+
+ <chapter>
+ <title>XML Namespaces</title>
+
+ <para>Apart from the XSLT XML Namespace (http://www.w3.org/1999/XSL/Transform), <acronym>xsltsl</acronym> employs a number of XML Namespaces to allow inclusion of the library in developer stylesheets. In addition, documentation is defined in a separate namespace.</para>
+ <para>Each module is allocated a namespace URI by appending the module name to the URI for the project, http://xsltsl.org/. For example, the string module has the namespace URI http://xsltsl.org/string.</para>
+ <para>All documentation is written using an <ulink url="docbook-extensions.html">extension</ulink> of <ulink url="http://www.docbook.org/">DocBook</ulink> designed for <ulink url="docbook-extensions.html">embedding DocBook into XSLT stylesheets</ulink>. The namespace URI for DocBook embedded in stylesheets is http://xsltsl.org/xsl/documentation/1.0</para>
+ </chapter>
+
+ <chapter>
+ <title>Engineering Standards</title>
+
+ <para>In order to maintain a high engineering standard, all modules and contributions to the <acronym>xsltsl</acronym> project must adhere to the following coding and documentation standards. Submissions which do not meet (or exceed) this standard will not be accepted.</para>
+ <itemizedlist>
+ <listitem>
+ <para>All stylesheets must be indented, with each level indented by two spaces. NB. a simple stylesheet could be used to enforce/fix this.</para>
+ </listitem>
+ <listitem>
+ <para>Templates are named using a qualified name (QName). The namespace URI for the template's containing stylesheet is assigned as above.</para>
+ </listitem>
+ <listitem>
+ <para>Parameters for templates should use sensible names. Where possible (or if in doubt), follow these conventions:</para>
+ <itemizedlist>
+ <listitem>
+ <para>A parameter containing a single node is named <parametername>node</parametername>. Where more than one parameter contains a single node, the suffix <parametername>Node</parametername> is appended to the parameter name, eg. <parametername>referenceNode</parametername></para>
+ </listitem>
+ <listitem>
+ <para>A parameter which potentially contains multiple nodes is named <parametername>nodes</parametername>. Where more than one parameter potentially contains multiple nodes, the suffix <parametername>Nodes</parametername> is appended to the parameter name, eg. <parametername>copyNodes</parametername></para>
+ </listitem>
+ <listitem>
+ <para>A parameter which contains a string value is named <parametername>text</parametername>.</para>
+ </listitem>
+ </itemizedlist>
+ </listitem>
+ <listitem>
+ <para>All templates in each stylesheet must be documented. A template is documented as a <ulink url="http://www.docbook.org/">DocBook</ulink> RefEntry.</para>
+ </listitem>
+ <listitem>
+ <para>Every stylesheet must include a test suite. The test system is in the <filename>test</filename> subdirectory. See <ulink url="test/test.html">test/test.html</ulink> for further details.</para>
+ </listitem>
+ </itemizedlist>
+
+ <para>An <ulink url="example.xsl">example stylesheet</ulink> has been provided, which acts as a template for new stylesheet modules.</para>
+
+ </chapter>
+
+ <chapter>
+ <title>Related Work</title>
+
+ <para>The <ulink url="http://www.exslt.org/">EXSLT</ulink> project is creating a library to standardise extension functions. The XSLT Standard Library is complementary to the EXSLT project.</para>
+
+ </chapter>
+
+ <chapter>
+ <title>Reference Documentation</title>
+
+ <para>Reference documentation is available for each module.</para>
+
+ <section>
+ <title>String Processing</title>
+
+ <itemizedlist>
+ <listitem>
+ <para><ulink url="string.html">string.xsl</ulink></para>
+ </listitem>
+ </itemizedlist>
+ </section>
+
+ <section>
+ <title>Nodes</title>
+
+ <itemizedlist>
+ <listitem>
+ <para><ulink url="node.html">node.xsl</ulink></para>
+ </listitem>
+ </itemizedlist>
+ </section>
+
+ <section>
+ <title>Date/Time Processing</title>
+
+ <itemizedlist>
+ <listitem>
+ <para><ulink url="date-time.html">date-time.xsl</ulink></para>
+ </listitem>
+ </itemizedlist>
+ </section>
+
+ <section>
+ <title>Mathematics</title>
+
+ <itemizedlist>
+ <listitem>
+ <para><ulink url="math.html">math.xsl</ulink></para>
+ </listitem>
+ </itemizedlist>
+ </section>
+
+ <section>
+ <title>URI (Uniform Resource Identifier) Processing</title>
+
+ <itemizedlist>
+ <listitem>
+ <para><ulink url="uri.html">uri.xsl</ulink></para>
+ </listitem>
+ </itemizedlist>
+ </section>
+
+ <section>
+ <title>Comparing Nodesets</title>
+
+ <itemizedlist>
+ <listitem>
+ <para><ulink url="cmp.html">cmp.xsl</ulink></para>
+ </listitem>
+ </itemizedlist>
+ </section>
+
+ <section>
+ <title>Generating XML Markup</title>
+
+ <itemizedlist>
+ <listitem>
+ <para><ulink url="markup.html">markup.xsl</ulink></para>
+ </listitem>
+ </itemizedlist>
+ </section>
+
+ <section>
+ <title>Presentation Media Support</title>
+
+ <itemizedlist>
+ <listitem>
+ <para>Scalable Vector Graphics: <ulink url="svg.html">svg.xsl</ulink></para>
+ </listitem>
+<!--
+ <listitem>
+ <para><ulink url="html/html.html">html/html.xsl</ulink></para>
+ </listitem>
+ <listitem>
+ <para><ulink url="fo/fo.html">fo/fo.xsl</ulink></para>
+ </listitem>
+-->
+ </itemizedlist>
+ </section>
+
+ <section>
+ <title>Example</title>
+
+ <!-- Add a new module in a similar fashion -->
+
+ <itemizedlist>
+ <listitem>
+ <para><ulink url="example.html">example.xsl</ulink></para>
+ </listitem>
+ </itemizedlist>
+ </section>
+ </chapter>
+
+ </doc:book>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/keynote/xsltsl/string.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/keynote/xsltsl/string.xsl
new file mode 100644
index 0000000..e7eef8b
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/keynote/xsltsl/string.xsl
@@ -0,0 +1,1233 @@
+<?xml version="1.0"?>
+
+<xsl:stylesheet version="1.0"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:doc="http://xsltsl.org/xsl/documentation/1.0"
+ xmlns:str="http://xsltsl.org/string"
+ extension-element-prefixes="doc str">
+
+ <doc:reference xmlns="">
+ <referenceinfo>
+ <releaseinfo role="meta">
+ $Id: string.xsl 3991 2004-11-10 06:51:55Z balls $
+ </releaseinfo>
+ <author>
+ <surname>Ball</surname>
+ <firstname>Steve</firstname>
+ </author>
+ <copyright>
+ <year>2002</year>
+ <year>2001</year>
+ <holder>Steve Ball</holder>
+ </copyright>
+ </referenceinfo>
+
+ <title>String Processing</title>
+
+ <partintro>
+ <section>
+ <title>Introduction</title>
+
+ <para>This module provides templates for manipulating strings.</para>
+
+ </section>
+ </partintro>
+
+ </doc:reference>
+
+ <!-- Common string constants and datasets as XSL variables -->
+
+ <!-- str:lower and str:upper contain pairs of lower and upper case
+ characters. Below insanely long strings should contain the
+ official lower/uppercase pairs, making this stylesheet working
+ for every language on earth. Hopefully. -->
+ <!-- These values are not enough, however. There are some
+ exceptions, dealt with below. -->
+ <xsl:variable name="xsltsl-str-lower" select="'&#x0061;&#x0062;&#x0063;&#x0064;&#x0065;&#x0066;&#x0067;&#x0068;&#x0069;&#x006A;&#x006B;&#x006C;&#x006D;&#x006E;&#x006F;&#x0070;&#x0071;&#x0072;&#x0073;&#x0074;&#x0075;&#x0076;&#x0077;&#x0078;&#x0079;&#x007A;&#x00B5;&#x00E0;&#x00E1;&#x00E2;&#x00E3;&#x00E4;&#x00E5;&#x00E6;&#x00E7;&#x00E8;&#x00E9;&#x00EA;&#x00EB;&#x00EC;&#x00ED;&#x00EE;&#x00EF;&#x00F0;&#x00F1;&#x00F2;&#x00F3;&#x00F4;&#x00F5;&#x00F6;&#x00F8;&#x00F9;&#x00FA;&#x00FB;&#x00FC;&#x00FD;&#x00FE;&#x00FF;&#x0101;&#x0103;&#x0105;&#x0107;&#x0109;&#x010B;&#x010D;&#x010F;&#x0111;&#x0113;&#x0115;&#x0117;&#x0119;&#x011B;&#x011D;&#x011F;&#x0121;&#x0123;&#x0125;&#x0127;&#x0129;&#x012B;&#x012D;&#x012F;&#x0131;&#x0133;&#x0135;&#x0137;&#x013A;&#x013C;&#x013E;&#x0140;&#x0142;&#x0144;&#x0146;&#x0148;&#x014B;&#x014D;&#x014F;&#x0151;&#x0153;&#x0155;&#x0157;&#x0159;&#x015B;&#x015D;&#x015F;&#x0161;&#x0163;&#x0165;&#x0167;&#x0169;&#x016B;&#x016D;&#x016F;&#x0171;&#x0173;&#x0175;&#x0177;&#x017A;&#x017C;&#x017E;&#x017F;&#x0183;&#x0185;&#x0188;&#x018C;&#x0192;&#x0195;&#x0199;&#x01A1;&#x01A3;&#x01A5;&#x01A8;&#x01AD;&#x01B0;&#x01B4;&#x01B6;&#x01B9;&#x01BD;&#x01BF;&#x01C5;&#x01C6;&#x01C8;&#x01C9;&#x01CB;&#x01CC;&#x01CE;&#x01D0;&#x01D2;&#x01D4;&#x01D6;&#x01D8;&#x01DA;&#x01DC;&#x01DD;&#x01DF;&#x01E1;&#x01E3;&#x01E5;&#x01E7;&#x01E9;&#x01EB;&#x01ED;&#x01EF;&#x01F2;&#x01F3;&#x01F5;&#x01F9;&#x01FB;&#x01FD;&#x01FF;&#x0201;&#x0203;&#x0205;&#x0207;&#x0209;&#x020B;&#x020D;&#x020F;&#x0211;&#x0213;&#x0215;&#x0217;&#x0219;&#x021B;&#x021D;&#x021F;&#x0223;&#x0225;&#x0227;&#x0229;&#x022B;&#x022D;&#x022F;&#x0231;&#x0233;&#x0253;&#x0254;&#x0256;&#x0257;&#x0259;&#x025B;&#x0260;&#x0263;&#x0268;&#x0269;&#x026F;&#x0272;&#x0275;&#x0280;&#x0283;&#x0288;&#x028A;&#x028B;&#x0292;&#x0345;&#x03AC;&#x03AD;&#x03AE;&#x03AF;&#x03B1;&#x03B2;&#x03B3;&#x03B4;&#x03B5;&#x03B6;&#x03B7;&#x03B8;&#x03B9;&#x03BA;&#x03BB;&#x03BC;&#x03BD;&#x03BE;&#x03BF;&#x03C0;&#x03C1;&#x03C2;&#x03C3;&#x03C4;&#x03C5;&#x03C6;&#x03C7;&#x03C8;&#x03C9;&#x03CA;&#x03CB;&#x03CC;&#x03CD;&#x03CE;&#x03D0;&#x03D1;&#x03D5;&#x03D6;&#x03DB;&#x03DD;&#x03DF;&#x03E1;&#x03E3;&#x03E5;&#x03E7;&#x03E9;&#x03EB;&#x03ED;&#x03EF;&#x03F0;&#x03F1;&#x03F2;&#x03F5;&#x0430;&#x0431;&#x0432;&#x0433;&#x0434;&#x0435;&#x0436;&#x0437;&#x0438;&#x0439;&#x043A;&#x043B;&#x043C;&#x043D;&#x043E;&#x043F;&#x0440;&#x0441;&#x0442;&#x0443;&#x0444;&#x0445;&#x0446;&#x0447;&#x0448;&#x0449;&#x044A;&#x044B;&#x044C;&#x044D;&#x044E;&#x044F;&#x0450;&#x0451;&#x0452;&#x0453;&#x0454;&#x0455;&#x0456;&#x0457;&#x0458;&#x0459;&#x045A;&#x045B;&#x045C;&#x045D;&#x045E;&#x045F;&#x0461;&#x0463;&#x0465;&#x0467;&#x0469;&#x046B;&#x046D;&#x046F;&#x0471;&#x0473;&#x0475;&#x0477;&#x0479;&#x047B;&#x047D;&#x047F;&#x0481;&#x048D;&#x048F;&#x0491;&#x0493;&#x0495;&#x0497;&#x0499;&#x049B;&#x049D;&#x049F;&#x04A1;&#x04A3;&#x04A5;&#x04A7;&#x04A9;&#x04AB;&#x04AD;&#x04AF;&#x04B1;&#x04B3;&#x04B5;&#x04B7;&#x04B9;&#x04BB;&#x04BD;&#x04BF;&#x04C2;&#x04C4;&#x04C8;&#x04CC;&#x04D1;&#x04D3;&#x04D5;&#x04D7;&#x04D9;&#x04DB;&#x04DD;&#x04DF;&#x04E1;&#x04E3;&#x04E5;&#x04E7;&#x04E9;&#x04EB;&#x04ED;&#x04EF;&#x04F1;&#x04F3;&#x04F5;&#x04F9;&#x0561;&#x0562;&#x0563;&#x0564;&#x0565;&#x0566;&#x0567;&#x0568;&#x0569;&#x056A;&#x056B;&#x056C;&#x056D;&#x056E;&#x056F;&#x0570;&#x0571;&#x0572;&#x0573;&#x0574;&#x0575;&#x0576;&#x0577;&#x0578;&#x0579;&#x057A;&#x057B;&#x057C;&#x057D;&#x057E;&#x057F;&#x0580;&#x0581;&#x0582;&#x0583;&#x0584;&#x0585;&#x0586;&#x1E01;&#x1E03;&#x1E05;&#x1E07;&#x1E09;&#x1E0B;&#x1E0D;&#x1E0F;&#x1E11;&#x1E13;&#x1E15;&#x1E17;&#x1E19;&#x1E1B;&#x1E1D;&#x1E1F;&#x1E21;&#x1E23;&#x1E25;&#x1E27;&#x1E29;&#x1E2B;&#x1E2D;&#x1E2F;&#x1E31;&#x1E33;&#x1E35;&#x1E37;&#x1E39;&#x1E3B;&#x1E3D;&#x1E3F;&#x1E41;&#x1E43;&#x1E45;&#x1E47;&#x1E49;&#x1E4B;&#x1E4D;&#x1E4F;&#x1E51;&#x1E53;&#x1E55;&#x1E57;&#x1E59;&#x1E5B;&#x1E5D;&#x1E5F;&#x1E61;&#x1E63;&#x1E65;&#x1E67;&#x1E69;&#x1E6B;&#x1E6D;&#x1E6F;&#x1E71;&#x1E73;&#x1E75;&#x1E77;&#x1E79;&#x1E7B;&#x1E7D;&#x1E7F;&#x1E81;&#x1E83;&#x1E85;&#x1E87;&#x1E89;&#x1E8B;&#x1E8D;&#x1E8F;&#x1E91;&#x1E93;&#x1E95;&#x1E9B;&#x1EA1;&#x1EA3;&#x1EA5;&#x1EA7;&#x1EA9;&#x1EAB;&#x1EAD;&#x1EAF;&#x1EB1;&#x1EB3;&#x1EB5;&#x1EB7;&#x1EB9;&#x1EBB;&#x1EBD;&#x1EBF;&#x1EC1;&#x1EC3;&#x1EC5;&#x1EC7;&#x1EC9;&#x1ECB;&#x1ECD;&#x1ECF;&#x1ED1;&#x1ED3;&#x1ED5;&#x1ED7;&#x1ED9;&#x1EDB;&#x1EDD;&#x1EDF;&#x1EE1;&#x1EE3;&#x1EE5;&#x1EE7;&#x1EE9;&#x1EEB;&#x1EED;&#x1EEF;&#x1EF1;&#x1EF3;&#x1EF5;&#x1EF7;&#x1EF9;&#x1F00;&#x1F01;&#x1F02;&#x1F03;&#x1F04;&#x1F05;&#x1F06;&#x1F07;&#x1F10;&#x1F11;&#x1F12;&#x1F13;&#x1F14;&#x1F15;&#x1F20;&#x1F21;&#x1F22;&#x1F23;&#x1F24;&#x1F25;&#x1F26;&#x1F27;&#x1F30;&#x1F31;&#x1F32;&#x1F33;&#x1F34;&#x1F35;&#x1F36;&#x1F37;&#x1F40;&#x1F41;&#x1F42;&#x1F43;&#x1F44;&#x1F45;&#x1F51;&#x1F53;&#x1F55;&#x1F57;&#x1F60;&#x1F61;&#x1F62;&#x1F63;&#x1F64;&#x1F65;&#x1F66;&#x1F67;&#x1F70;&#x1F71;&#x1F72;&#x1F73;&#x1F74;&#x1F75;&#x1F76;&#x1F77;&#x1F78;&#x1F79;&#x1F7A;&#x1F7B;&#x1F7C;&#x1F7D;&#x1F80;&#x1F81;&#x1F82;&#x1F83;&#x1F84;&#x1F85;&#x1F86;&#x1F87;&#x1F90;&#x1F91;&#x1F92;&#x1F93;&#x1F94;&#x1F95;&#x1F96;&#x1F97;&#x1FA0;&#x1FA1;&#x1FA2;&#x1FA3;&#x1FA4;&#x1FA5;&#x1FA6;&#x1FA7;&#x1FB0;&#x1FB1;&#x1FB3;&#x1FBE;&#x1FC3;&#x1FD0;&#x1FD1;&#x1FE0;&#x1FE1;&#x1FE5;&#x1FF3;&#x2170;&#x2171;&#x2172;&#x2173;&#x2174;&#x2175;&#x2176;&#x2177;&#x2178;&#x2179;&#x217A;&#x217B;&#x217C;&#x217D;&#x217E;&#x217F;&#x24D0;&#x24D1;&#x24D2;&#x24D3;&#x24D4;&#x24D5;&#x24D6;&#x24D7;&#x24D8;&#x24D9;&#x24DA;&#x24DB;&#x24DC;&#x24DD;&#x24DE;&#x24DF;&#x24E0;&#x24E1;&#x24E2;&#x24E3;&#x24E4;&#x24E5;&#x24E6;&#x24E7;&#x24E8;&#x24E9;&#xFF41;&#xFF42;&#xFF43;&#xFF44;&#xFF45;&#xFF46;&#xFF47;&#xFF48;&#xFF49;&#xFF4A;&#xFF4B;&#xFF4C;&#xFF4D;&#xFF4E;&#xFF4F;&#xFF50;&#xFF51;&#xFF52;&#xFF53;&#xFF54;&#xFF55;&#xFF56;&#xFF57;&#xFF58;&#xFF59;&#xFF5A;&#x10428;&#x10429;&#x1042A;&#x1042B;&#x1042C;&#x1042D;&#x1042E;&#x1042F;&#x10430;&#x10431;&#x10432;&#x10433;&#x10434;&#x10435;&#x10436;&#x10437;&#x10438;&#x10439;&#x1043A;&#x1043B;&#x1043C;&#x1043D;&#x1043E;&#x1043F;&#x10440;&#x10441;&#x10442;&#x10443;&#x10444;&#x10445;&#x10446;&#x10447;&#x10448;&#x10449;&#x1044A;&#x1044B;&#x1044C;&#x1044D;'"/>
+ <xsl:variable name="xsltsl-str-upper" select="'&#x0041;&#x0042;&#x0043;&#x0044;&#x0045;&#x0046;&#x0047;&#x0048;&#x0049;&#x004A;&#x004B;&#x004C;&#x004D;&#x004E;&#x004F;&#x0050;&#x0051;&#x0052;&#x0053;&#x0054;&#x0055;&#x0056;&#x0057;&#x0058;&#x0059;&#x005A;&#x039C;&#x00C0;&#x00C1;&#x00C2;&#x00C3;&#x00C4;&#x00C5;&#x00C6;&#x00C7;&#x00C8;&#x00C9;&#x00CA;&#x00CB;&#x00CC;&#x00CD;&#x00CE;&#x00CF;&#x00D0;&#x00D1;&#x00D2;&#x00D3;&#x00D4;&#x00D5;&#x00D6;&#x00D8;&#x00D9;&#x00DA;&#x00DB;&#x00DC;&#x00DD;&#x00DE;&#x0178;&#x0100;&#x0102;&#x0104;&#x0106;&#x0108;&#x010A;&#x010C;&#x010E;&#x0110;&#x0112;&#x0114;&#x0116;&#x0118;&#x011A;&#x011C;&#x011E;&#x0120;&#x0122;&#x0124;&#x0126;&#x0128;&#x012A;&#x012C;&#x012E;&#x0049;&#x0132;&#x0134;&#x0136;&#x0139;&#x013B;&#x013D;&#x013F;&#x0141;&#x0143;&#x0145;&#x0147;&#x014A;&#x014C;&#x014E;&#x0150;&#x0152;&#x0154;&#x0156;&#x0158;&#x015A;&#x015C;&#x015E;&#x0160;&#x0162;&#x0164;&#x0166;&#x0168;&#x016A;&#x016C;&#x016E;&#x0170;&#x0172;&#x0174;&#x0176;&#x0179;&#x017B;&#x017D;&#x0053;&#x0182;&#x0184;&#x0187;&#x018B;&#x0191;&#x01F6;&#x0198;&#x01A0;&#x01A2;&#x01A4;&#x01A7;&#x01AC;&#x01AF;&#x01B3;&#x01B5;&#x01B8;&#x01BC;&#x01F7;&#x01C4;&#x01C4;&#x01C7;&#x01C7;&#x01CA;&#x01CA;&#x01CD;&#x01CF;&#x01D1;&#x01D3;&#x01D5;&#x01D7;&#x01D9;&#x01DB;&#x018E;&#x01DE;&#x01E0;&#x01E2;&#x01E4;&#x01E6;&#x01E8;&#x01EA;&#x01EC;&#x01EE;&#x01F1;&#x01F1;&#x01F4;&#x01F8;&#x01FA;&#x01FC;&#x01FE;&#x0200;&#x0202;&#x0204;&#x0206;&#x0208;&#x020A;&#x020C;&#x020E;&#x0210;&#x0212;&#x0214;&#x0216;&#x0218;&#x021A;&#x021C;&#x021E;&#x0222;&#x0224;&#x0226;&#x0228;&#x022A;&#x022C;&#x022E;&#x0230;&#x0232;&#x0181;&#x0186;&#x0189;&#x018A;&#x018F;&#x0190;&#x0193;&#x0194;&#x0197;&#x0196;&#x019C;&#x019D;&#x019F;&#x01A6;&#x01A9;&#x01AE;&#x01B1;&#x01B2;&#x01B7;&#x0399;&#x0386;&#x0388;&#x0389;&#x038A;&#x0391;&#x0392;&#x0393;&#x0394;&#x0395;&#x0396;&#x0397;&#x0398;&#x0399;&#x039A;&#x039B;&#x039C;&#x039D;&#x039E;&#x039F;&#x03A0;&#x03A1;&#x03A3;&#x03A3;&#x03A4;&#x03A5;&#x03A6;&#x03A7;&#x03A8;&#x03A9;&#x03AA;&#x03AB;&#x038C;&#x038E;&#x038F;&#x0392;&#x0398;&#x03A6;&#x03A0;&#x03DA;&#x03DC;&#x03DE;&#x03E0;&#x03E2;&#x03E4;&#x03E6;&#x03E8;&#x03EA;&#x03EC;&#x03EE;&#x039A;&#x03A1;&#x03A3;&#x0395;&#x0410;&#x0411;&#x0412;&#x0413;&#x0414;&#x0415;&#x0416;&#x0417;&#x0418;&#x0419;&#x041A;&#x041B;&#x041C;&#x041D;&#x041E;&#x041F;&#x0420;&#x0421;&#x0422;&#x0423;&#x0424;&#x0425;&#x0426;&#x0427;&#x0428;&#x0429;&#x042A;&#x042B;&#x042C;&#x042D;&#x042E;&#x042F;&#x0400;&#x0401;&#x0402;&#x0403;&#x0404;&#x0405;&#x0406;&#x0407;&#x0408;&#x0409;&#x040A;&#x040B;&#x040C;&#x040D;&#x040E;&#x040F;&#x0460;&#x0462;&#x0464;&#x0466;&#x0468;&#x046A;&#x046C;&#x046E;&#x0470;&#x0472;&#x0474;&#x0476;&#x0478;&#x047A;&#x047C;&#x047E;&#x0480;&#x048C;&#x048E;&#x0490;&#x0492;&#x0494;&#x0496;&#x0498;&#x049A;&#x049C;&#x049E;&#x04A0;&#x04A2;&#x04A4;&#x04A6;&#x04A8;&#x04AA;&#x04AC;&#x04AE;&#x04B0;&#x04B2;&#x04B4;&#x04B6;&#x04B8;&#x04BA;&#x04BC;&#x04BE;&#x04C1;&#x04C3;&#x04C7;&#x04CB;&#x04D0;&#x04D2;&#x04D4;&#x04D6;&#x04D8;&#x04DA;&#x04DC;&#x04DE;&#x04E0;&#x04E2;&#x04E4;&#x04E6;&#x04E8;&#x04EA;&#x04EC;&#x04EE;&#x04F0;&#x04F2;&#x04F4;&#x04F8;&#x0531;&#x0532;&#x0533;&#x0534;&#x0535;&#x0536;&#x0537;&#x0538;&#x0539;&#x053A;&#x053B;&#x053C;&#x053D;&#x053E;&#x053F;&#x0540;&#x0541;&#x0542;&#x0543;&#x0544;&#x0545;&#x0546;&#x0547;&#x0548;&#x0549;&#x054A;&#x054B;&#x054C;&#x054D;&#x054E;&#x054F;&#x0550;&#x0551;&#x0552;&#x0553;&#x0554;&#x0555;&#x0556;&#x1E00;&#x1E02;&#x1E04;&#x1E06;&#x1E08;&#x1E0A;&#x1E0C;&#x1E0E;&#x1E10;&#x1E12;&#x1E14;&#x1E16;&#x1E18;&#x1E1A;&#x1E1C;&#x1E1E;&#x1E20;&#x1E22;&#x1E24;&#x1E26;&#x1E28;&#x1E2A;&#x1E2C;&#x1E2E;&#x1E30;&#x1E32;&#x1E34;&#x1E36;&#x1E38;&#x1E3A;&#x1E3C;&#x1E3E;&#x1E40;&#x1E42;&#x1E44;&#x1E46;&#x1E48;&#x1E4A;&#x1E4C;&#x1E4E;&#x1E50;&#x1E52;&#x1E54;&#x1E56;&#x1E58;&#x1E5A;&#x1E5C;&#x1E5E;&#x1E60;&#x1E62;&#x1E64;&#x1E66;&#x1E68;&#x1E6A;&#x1E6C;&#x1E6E;&#x1E70;&#x1E72;&#x1E74;&#x1E76;&#x1E78;&#x1E7A;&#x1E7C;&#x1E7E;&#x1E80;&#x1E82;&#x1E84;&#x1E86;&#x1E88;&#x1E8A;&#x1E8C;&#x1E8E;&#x1E90;&#x1E92;&#x1E94;&#x1E60;&#x1EA0;&#x1EA2;&#x1EA4;&#x1EA6;&#x1EA8;&#x1EAA;&#x1EAC;&#x1EAE;&#x1EB0;&#x1EB2;&#x1EB4;&#x1EB6;&#x1EB8;&#x1EBA;&#x1EBC;&#x1EBE;&#x1EC0;&#x1EC2;&#x1EC4;&#x1EC6;&#x1EC8;&#x1ECA;&#x1ECC;&#x1ECE;&#x1ED0;&#x1ED2;&#x1ED4;&#x1ED6;&#x1ED8;&#x1EDA;&#x1EDC;&#x1EDE;&#x1EE0;&#x1EE2;&#x1EE4;&#x1EE6;&#x1EE8;&#x1EEA;&#x1EEC;&#x1EEE;&#x1EF0;&#x1EF2;&#x1EF4;&#x1EF6;&#x1EF8;&#x1F08;&#x1F09;&#x1F0A;&#x1F0B;&#x1F0C;&#x1F0D;&#x1F0E;&#x1F0F;&#x1F18;&#x1F19;&#x1F1A;&#x1F1B;&#x1F1C;&#x1F1D;&#x1F28;&#x1F29;&#x1F2A;&#x1F2B;&#x1F2C;&#x1F2D;&#x1F2E;&#x1F2F;&#x1F38;&#x1F39;&#x1F3A;&#x1F3B;&#x1F3C;&#x1F3D;&#x1F3E;&#x1F3F;&#x1F48;&#x1F49;&#x1F4A;&#x1F4B;&#x1F4C;&#x1F4D;&#x1F59;&#x1F5B;&#x1F5D;&#x1F5F;&#x1F68;&#x1F69;&#x1F6A;&#x1F6B;&#x1F6C;&#x1F6D;&#x1F6E;&#x1F6F;&#x1FBA;&#x1FBB;&#x1FC8;&#x1FC9;&#x1FCA;&#x1FCB;&#x1FDA;&#x1FDB;&#x1FF8;&#x1FF9;&#x1FEA;&#x1FEB;&#x1FFA;&#x1FFB;&#x1F88;&#x1F89;&#x1F8A;&#x1F8B;&#x1F8C;&#x1F8D;&#x1F8E;&#x1F8F;&#x1F98;&#x1F99;&#x1F9A;&#x1F9B;&#x1F9C;&#x1F9D;&#x1F9E;&#x1F9F;&#x1FA8;&#x1FA9;&#x1FAA;&#x1FAB;&#x1FAC;&#x1FAD;&#x1FAE;&#x1FAF;&#x1FB8;&#x1FB9;&#x1FBC;&#x0399;&#x1FCC;&#x1FD8;&#x1FD9;&#x1FE8;&#x1FE9;&#x1FEC;&#x1FFC;&#x2160;&#x2161;&#x2162;&#x2163;&#x2164;&#x2165;&#x2166;&#x2167;&#x2168;&#x2169;&#x216A;&#x216B;&#x216C;&#x216D;&#x216E;&#x216F;&#x24B6;&#x24B7;&#x24B8;&#x24B9;&#x24BA;&#x24BB;&#x24BC;&#x24BD;&#x24BE;&#x24BF;&#x24C0;&#x24C1;&#x24C2;&#x24C3;&#x24C4;&#x24C5;&#x24C6;&#x24C7;&#x24C8;&#x24C9;&#x24CA;&#x24CB;&#x24CC;&#x24CD;&#x24CE;&#x24CF;&#xFF21;&#xFF22;&#xFF23;&#xFF24;&#xFF25;&#xFF26;&#xFF27;&#xFF28;&#xFF29;&#xFF2A;&#xFF2B;&#xFF2C;&#xFF2D;&#xFF2E;&#xFF2F;&#xFF30;&#xFF31;&#xFF32;&#xFF33;&#xFF34;&#xFF35;&#xFF36;&#xFF37;&#xFF38;&#xFF39;&#xFF3A;&#x10400;&#x10401;&#x10402;&#x10403;&#x10404;&#x10405;&#x10406;&#x10407;&#x10408;&#x10409;&#x1040A;&#x1040B;&#x1040C;&#x1040D;&#x1040E;&#x1040F;&#x10410;&#x10411;&#x10412;&#x10413;&#x10414;&#x10415;&#x10416;&#x10417;&#x10418;&#x10419;&#x1041A;&#x1041B;&#x1041C;&#x1041D;&#x1041E;&#x1041F;&#x10420;&#x10421;&#x10422;&#x10423;&#x10424;&#x10425;'"/>
+ <xsl:variable name="xsltsl-str-digits" select="'0123456789'"/>
+ <!-- space (#x20) characters, carriage returns, line feeds, or tabs. -->
+ <xsl:variable name="xsltsl-str-ws" select="'&#x20;&#x9;&#xD;&#xA;'"/>
+
+ <doc:template name="str:to-upper" xmlns="">
+ <refpurpose>Make string uppercase</refpurpose>
+
+ <refdescription>
+ <para>Converts all lowercase letters to uppercase.</para>
+ </refdescription>
+
+ <refparameter>
+ <variablelist>
+ <varlistentry>
+ <term>text</term>
+ <listitem>
+ <para>The string to be converted</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+
+ <refreturn>
+ <para>Returns string with all uppercase letters.</para>
+ </refreturn>
+ </doc:template>
+
+ <xsl:template name="str:to-upper">
+ <xsl:param name="text"/>
+
+ <!-- Below exception is extracted from unicode's SpecialCasing.txt
+ file. It's the german lowercase "eszett" (the thing looking
+ like a greek beta) that's to become "SS" in uppercase (note:
+ that are *two* characters, that's why it doesn't fit in the
+ list of upper/lowercase characters). There are more
+ characters in that file (103, excluding the locale-specific
+ ones), but they seemed to be much less used to me and they
+ add up to a hellish long stylesheet.... - Reinout -->
+ <xsl:param name="modified-text">
+ <xsl:call-template name="str:subst">
+ <xsl:with-param name="text">
+ <xsl:value-of select="$text"/>
+ </xsl:with-param>
+ <xsl:with-param name="replace">
+ <xsl:text>&#x00DF;</xsl:text>
+ </xsl:with-param>
+ <xsl:with-param name="with">
+ <xsl:text>&#x0053;</xsl:text>
+ <xsl:text>&#x0053;</xsl:text>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:param>
+
+ <xsl:value-of select="translate($modified-text, $xsltsl-str-lower, $xsltsl-str-upper)"/>
+ </xsl:template>
+
+ <doc:template name="str:to-lower" xmlns="">
+ <refpurpose>Make string lowercase</refpurpose>
+
+ <refdescription>
+ <para>Converts all uppercase letters to lowercase.</para>
+ </refdescription>
+
+ <refparameter>
+ <variablelist>
+ <varlistentry>
+ <term>text</term>
+ <listitem>
+ <para>The string to be converted</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+
+ <refreturn>
+ <para>Returns string with all lowercase letters.</para>
+ </refreturn>
+ </doc:template>
+
+ <xsl:template name="str:to-lower">
+ <xsl:param name="text"/>
+
+ <xsl:value-of select="translate($text, $xsltsl-str-upper, $xsltsl-str-lower)"/>
+ </xsl:template>
+
+ <doc:template name="str:capitalise" xmlns="">
+ <refpurpose>Capitalise string</refpurpose>
+
+ <refdescription>
+ <para>Converts first character of string to an uppercase letter. All remaining characters are converted to lowercase.</para>
+ </refdescription>
+
+ <refparameter>
+ <variablelist>
+ <varlistentry>
+ <term>text</term>
+ <listitem>
+ <para>The string to be capitalised</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>all</term>
+ <listitem>
+ <para>Boolean controlling whether all words in the string are capitalised.</para>
+ <para>Default is true.</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+
+ <refreturn>
+ <para>Returns string with first character uppcase and all remaining characters lowercase.</para>
+ </refreturn>
+ </doc:template>
+
+ <xsl:template name="str:capitalise">
+ <xsl:param name="text"/>
+ <xsl:param name="all" select="true()"/>
+
+ <xsl:choose>
+ <xsl:when test="$all and (contains($text, ' ') or contains($text, ' ') or contains($text, '&#10;'))">
+ <xsl:variable name="firstword">
+ <xsl:call-template name="str:substring-before-first">
+ <xsl:with-param name="text" select="$text"/>
+ <xsl:with-param name="chars" select="$xsltsl-str-ws"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:call-template name="str:capitalise">
+ <xsl:with-param name="text">
+ <xsl:value-of select="$firstword"/>
+ </xsl:with-param>
+ <xsl:with-param name="all" select="false()"/>
+ </xsl:call-template>
+ <xsl:value-of select="substring($text, string-length($firstword) + 1, 1)"/>
+ <xsl:call-template name="str:capitalise">
+ <xsl:with-param name="text">
+ <xsl:value-of select="substring($text, string-length($firstword) + 2)"/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:when>
+
+ <xsl:otherwise>
+ <xsl:call-template name="str:to-upper">
+ <xsl:with-param name="text" select="substring($text, 1, 1)"/>
+ </xsl:call-template>
+ <xsl:call-template name="str:to-lower">
+ <xsl:with-param name="text" select="substring($text, 2)"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+ <doc:template name="str:to-camelcase" xmlns="">
+ <refpurpose>Convert a string to one camelcase word</refpurpose>
+
+ <refdescription>
+ <para>Converts a string to one lowerCamelCase or UpperCamelCase
+ word, depending on the setting of the "upper"
+ parameter. UpperCamelCase is also called MixedCase while
+ lowerCamelCase is also called just camelCase. The template
+ removes any spaces, tabs and slashes, but doesn't deal with
+ other punctuation. It's purpose is to convert strings like
+ "hollow timber flush door" to a term suitable as identifier or
+ XML tag like "HollowTimberFlushDoor".
+ </para>
+ </refdescription>
+
+ <refparameter>
+ <variablelist>
+ <varlistentry>
+ <term>text</term>
+ <listitem>
+ <para>The string to be capitalised</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>upper</term>
+ <listitem>
+ <para>Boolean controlling whether the string becomes an
+ UpperCamelCase word or a lowerCamelCase word.</para>
+ <para>Default is true.</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+
+ <refreturn>
+ <para>Returns string with first character uppcase and all remaining characters lowercase.</para>
+ </refreturn>
+ </doc:template>
+
+ <xsl:template name="str:to-camelcase">
+ <xsl:param name="text"/>
+ <xsl:param name="upper" select="true()"/>
+ <!-- First change all 'strange' characters to spaces -->
+ <xsl:param name="string-with-only-spaces">
+ <xsl:value-of select="translate($text,concat($xsltsl-str-ws,'/'),' ')"/>
+ </xsl:param>
+ <!-- Then process them -->
+ <xsl:param name="before-space-removal">
+ <xsl:variable name="firstword">
+ <xsl:call-template name="str:substring-before-first">
+ <xsl:with-param name="text" select="$string-with-only-spaces"/>
+ <xsl:with-param name="chars" select="$xsltsl-str-ws"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:choose>
+ <xsl:when test="$upper">
+ <xsl:call-template name="str:to-upper">
+ <xsl:with-param name="text" select="substring($firstword, 1, 1)"/>
+ </xsl:call-template>
+ <xsl:call-template name="str:to-lower">
+ <xsl:with-param name="text" select="substring($firstword, 2)"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="str:to-lower">
+ <xsl:with-param name="text" select="$firstword"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:call-template name="str:capitalise">
+ <xsl:with-param name="text">
+ <xsl:value-of select="substring($string-with-only-spaces, string-length($firstword) + 2)"/>
+ </xsl:with-param>
+ <xsl:with-param name="all" select="true()"/>
+ </xsl:call-template>
+ </xsl:param>
+ <xsl:value-of select="translate($before-space-removal,' ','')"/>
+ </xsl:template>
+
+ <doc:template name="str:substring-before-first" xmlns="">
+ <refpurpose>String extraction</refpurpose>
+
+ <refdescription>
+ <para>Extracts the portion of string 'text' which occurs before any of the characters in string 'chars'.</para>
+ </refdescription>
+
+ <refparameter>
+ <variablelist>
+ <varlistentry>
+ <term>text</term>
+ <listitem>
+ <para>The string from which to extract a substring.</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>chars</term>
+ <listitem>
+ <para>The string containing characters to find.</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+
+ <refreturn>
+ <para>Returns string.</para>
+ </refreturn>
+ </doc:template>
+
+ <xsl:template name="str:substring-before-first">
+ <xsl:param name="text"/>
+ <xsl:param name="chars"/>
+
+ <xsl:choose>
+
+ <xsl:when test="string-length($text) = 0"/>
+
+ <xsl:when test="string-length($chars) = 0">
+ <xsl:value-of select="$text"/>
+ </xsl:when>
+
+ <xsl:when test="contains($text, substring($chars, 1, 1))">
+ <xsl:variable name="this" select="substring-before($text, substring($chars, 1, 1))"/>
+ <xsl:variable name="rest">
+ <xsl:call-template name="str:substring-before-first">
+ <xsl:with-param name="text" select="$text"/>
+ <xsl:with-param name="chars" select="substring($chars, 2)"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="string-length($this) &lt; string-length($rest)">
+ <xsl:value-of select="$this"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$rest"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+
+ <xsl:otherwise>
+ <xsl:call-template name="str:substring-before-first">
+ <xsl:with-param name="text" select="$text"/>
+ <xsl:with-param name="chars" select="substring($chars, 2)"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+
+ </xsl:choose>
+ </xsl:template>
+
+ <doc:template name="str:substring-after-last" xmlns="">
+ <refpurpose>String extraction</refpurpose>
+
+ <refdescription>
+ <para>Extracts the portion of string 'text' which occurs after the last of the character in string 'chars'.</para>
+ </refdescription>
+
+ <refparameter>
+ <variablelist>
+ <varlistentry>
+ <term>text</term>
+ <listitem>
+ <para>The string from which to extract a substring.</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>chars</term>
+ <listitem>
+ <para>The string containing characters to find.</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+
+ <refreturn>
+ <para>Returns string.</para>
+ </refreturn>
+ </doc:template>
+
+ <xsl:template name="str:substring-after-last">
+ <xsl:param name="text"/>
+ <xsl:param name="chars"/>
+
+ <xsl:choose>
+
+ <xsl:when test="contains($text, $chars)">
+ <xsl:variable name="last" select="substring-after($text, $chars)"/>
+
+ <xsl:choose>
+ <xsl:when test="contains($last, $chars)">
+ <xsl:call-template name="str:substring-after-last">
+ <xsl:with-param name="text" select="$last"/>
+ <xsl:with-param name="chars" select="$chars"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$last"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+
+ <xsl:otherwise>
+ <xsl:value-of select="$text"/>
+ </xsl:otherwise>
+
+ </xsl:choose>
+ </xsl:template>
+
+ <doc:template name="str:substring-before-last" xmlns="">
+ <refpurpose>String extraction</refpurpose>
+
+ <refdescription>
+ <para>Extracts the portion of string 'text' which occurs before the first character of the last occurance of string 'chars'.</para>
+ </refdescription>
+
+ <refparameter>
+ <variablelist>
+ <varlistentry>
+ <term>text</term>
+ <listitem>
+ <para>The string from which to extract a substring.</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>chars</term>
+ <listitem>
+ <para>The string containing characters to find.</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+
+ <refreturn>
+ <para>Returns string.</para>
+ </refreturn>
+ </doc:template>
+
+ <xsl:template name="str:substring-before-last">
+ <xsl:param name="text"/>
+ <xsl:param name="chars"/>
+
+ <xsl:choose>
+
+ <xsl:when test="string-length($text) = 0"/>
+
+ <xsl:when test="string-length($chars) = 0">
+ <xsl:value-of select="$text"/>
+ </xsl:when>
+
+ <xsl:when test="contains($text, $chars)">
+ <xsl:call-template name="str:substring-before-last-aux">
+ <xsl:with-param name="text" select="$text"/>
+ <xsl:with-param name="chars" select="$chars"/>
+ </xsl:call-template>
+ </xsl:when>
+
+ <xsl:otherwise>
+ <xsl:value-of select="$text"/>
+ </xsl:otherwise>
+
+ </xsl:choose>
+ </xsl:template>
+
+ <xsl:template name="str:substring-before-last-aux">
+ <xsl:param name="text"/>
+ <xsl:param name="chars"/>
+
+ <xsl:choose>
+ <xsl:when test="string-length($text) = 0"/>
+
+ <xsl:when test="contains($text, $chars)">
+ <xsl:variable name="after">
+ <xsl:call-template name="str:substring-before-last-aux">
+ <xsl:with-param name="text" select="substring-after($text, $chars)"/>
+ <xsl:with-param name="chars" select="$chars"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:value-of select="substring-before($text, $chars)"/>
+ <xsl:if test="string-length($after) &gt; 0">
+ <xsl:value-of select="$chars"/>
+ <xsl:copy-of select="$after"/>
+ </xsl:if>
+ </xsl:when>
+
+ <xsl:otherwise/>
+ </xsl:choose>
+ </xsl:template>
+
+ <doc:template name="str:subst" xmlns="">
+ <refpurpose>String substitution</refpurpose>
+
+ <refdescription>
+ <para>Substitute 'replace' for 'with' in string 'text'.</para>
+ </refdescription>
+
+ <refparameter>
+ <variablelist>
+ <varlistentry>
+ <term>text</term>
+ <listitem>
+ <para>The string upon which to perform substitution.</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>replace</term>
+ <listitem>
+ <para>The string to substitute.</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>with</term>
+ <listitem>
+ <para>The string to be substituted.</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>disable-output-escaping</term>
+ <listitem>
+ <para>A value of <literal>yes</literal> indicates that the result should have output escaping disabled. Any other value allows normal escaping of text values. The default is to enable output escaping.</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+
+ <refreturn>
+ <para>Returns string.</para>
+ </refreturn>
+ </doc:template>
+
+ <xsl:template name="str:subst">
+ <xsl:param name="text"/>
+ <xsl:param name="replace"/>
+ <xsl:param name="with"/>
+ <xsl:param name='disable-output-escaping'>no</xsl:param>
+
+ <xsl:choose>
+ <xsl:when test="string-length($replace) = 0 and $disable-output-escaping = 'yes'">
+ <xsl:value-of select="$text" disable-output-escaping='yes'/>
+ </xsl:when>
+ <xsl:when test="string-length($replace) = 0">
+ <xsl:value-of select="$text"/>
+ </xsl:when>
+ <xsl:when test="contains($text, $replace)">
+
+ <xsl:variable name="before" select="substring-before($text, $replace)"/>
+ <xsl:variable name="after" select="substring-after($text, $replace)"/>
+
+ <xsl:choose>
+ <xsl:when test='$disable-output-escaping = "yes"'>
+ <xsl:value-of select="$before" disable-output-escaping="yes"/>
+ <xsl:value-of select="$with" disable-output-escaping="yes"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$before"/>
+ <xsl:value-of select="$with"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:call-template name="str:subst">
+ <xsl:with-param name="text" select="$after"/>
+ <xsl:with-param name="replace" select="$replace"/>
+ <xsl:with-param name="with" select="$with"/>
+ <xsl:with-param name="disable-output-escaping" select="$disable-output-escaping"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test='$disable-output-escaping = "yes"'>
+ <xsl:value-of select="$text" disable-output-escaping="yes"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$text"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+ <doc:template name="str:count-substring" xmlns="">
+ <refpurpose>Count Substrings</refpurpose>
+
+ <refdescription>
+ <para>Counts the number of times a substring occurs in a string. This can also counts the number of times a character occurs in a string, since a character is simply a string of length 1.</para>
+ </refdescription>
+
+ <example>
+ <title>Counting Lines</title>
+ <programlisting><![CDATA[
+<xsl:call-template name="str:count-substring">
+ <xsl:with-param name="text" select="$mytext"/>
+ <xsl:with-param name="chars" select="'&#x0a;'"/>
+</xsl:call-template>
+]]></programlisting>
+ </example>
+
+ <refparameter>
+ <variablelist>
+ <varlistentry>
+ <term>text</term>
+ <listitem>
+ <para>The source string.</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>chars</term>
+ <listitem>
+ <para>The substring to count.</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+
+ <refreturn>
+ <para>Returns a non-negative integer value.</para>
+ </refreturn>
+ </doc:template>
+
+ <xsl:template name="str:count-substring">
+ <xsl:param name="text"/>
+ <xsl:param name="chars"/>
+
+ <xsl:choose>
+ <xsl:when test="string-length($text) = 0 or string-length($chars) = 0">
+ <xsl:text>0</xsl:text>
+ </xsl:when>
+ <xsl:when test="contains($text, $chars)">
+ <xsl:variable name="remaining">
+ <xsl:call-template name="str:count-substring">
+ <xsl:with-param name="text" select="substring-after($text, $chars)"/>
+ <xsl:with-param name="chars" select="$chars"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:value-of select="$remaining + 1"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text>0</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+ <doc:template name="str:substring-after-at" xmlns="">
+ <refpurpose>String extraction</refpurpose>
+ <refdescription>
+ <para>Extracts the portion of a 'char' delimited 'text' string "array" at a given 'position'.</para>
+ </refdescription>
+ <refparameter>
+ <variablelist>
+ <varlistentry>
+ <term>text</term>
+ <listitem>
+ <para>The string from which to extract a substring.</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>chars</term>
+ <listitem>
+ <para>delimiters</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>position</term>
+ <listitem>
+ <para>position of the elements</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>all</term>
+ <listitem>
+ <para>If true all of the remaining string is returned, otherwise only the element at the given position is returned. Default: false().</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+ <refreturn>
+ <para>Returns string.</para>
+ </refreturn>
+ </doc:template>
+
+
+ <xsl:template name="str:substring-after-at">
+ <xsl:param name="text"/>
+ <xsl:param name="chars"/>
+ <xsl:param name="position"/>
+ <xsl:param name="all" select='false()'/>
+
+ <xsl:choose>
+ <xsl:when test='number($position) = 0 and $all'>
+ <xsl:value-of select='$text'/>
+ </xsl:when>
+ <xsl:when test='number($position) = 0 and not($chars)'>
+ <xsl:value-of select='$text'/>
+ </xsl:when>
+ <xsl:when test='number($position) = 0 and not(contains($text, $chars))'>
+ <xsl:value-of select='$text'/>
+ </xsl:when>
+ <xsl:when test='not(contains($text, $chars))'>
+ </xsl:when>
+ <xsl:when test="number($position) = 0">
+ <xsl:value-of select="substring-before($text, $chars)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="str:substring-after-at">
+ <xsl:with-param name="text" select="substring-after($text, $chars)"/>
+ <xsl:with-param name="chars" select="$chars"/>
+ <xsl:with-param name="all" select="$all"/>
+ <xsl:with-param name="position" select="$position - 1"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+ <doc:template name="str:substring-before-at" xmlns="">
+ <refpurpose>String extraction</refpurpose>
+ <refdescription>
+ <para>Extracts the portion of a 'char' delimited 'text' string "array" at a given 'position' </para>
+ </refdescription>
+ <refparameter>
+ <variablelist>
+ <varlistentry>
+ <term>text</term>
+ <listitem>
+ <para>The string from which to extract a substring.</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>chars</term>
+ <listitem>
+ <para>delimiters</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>position</term>
+ <listitem>
+ <para>position of the elements</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+ <refreturn>
+ <para>Returns string.</para>
+ </refreturn>
+ </doc:template>
+
+ <xsl:template name="str:substring-before-at">
+ <xsl:param name="text"/>
+ <xsl:param name="chars"/>
+ <xsl:param name="position"/>
+
+ <xsl:choose>
+ <xsl:when test="$position &lt;= 0"/>
+ <xsl:when test="not(contains($text, $chars))"/>
+ <xsl:otherwise>
+ <xsl:value-of select='substring-before($text, $chars)'/>
+ <xsl:value-of select='$chars'/>
+
+ <xsl:call-template name="str:substring-before-at">
+ <xsl:with-param name="text" select="substring-after($text, $chars)"/>
+ <xsl:with-param name="position" select="$position - 1"/>
+ <xsl:with-param name="chars" select="$chars"/>
+ </xsl:call-template>
+
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+ <doc:template name="str:insert-at" xmlns="">
+ <refpurpose>String insertion</refpurpose>
+ <refdescription>
+ <para>Insert 'chars' into "text' at any given "position'</para>
+ </refdescription>
+ <refparameter>
+ <variablelist>
+ <varlistentry>
+ <term>text</term>
+ <listitem>
+ <para>The string upon which to perform insertion</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>position</term>
+ <listitem>
+ <para>the position where insertion will be performed</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>with</term>
+ <listitem>
+ <para>The string to be inserted</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+ <refreturn>
+ <para>Returns string.</para>
+ </refreturn>
+ </doc:template>
+
+ <xsl:template name="str:insert-at">
+ <xsl:param name="text"/>
+ <xsl:param name="position"/>
+ <xsl:param name="chars"/>
+
+ <xsl:variable name="firstpart" select="substring($text, 0, $position)"/>
+ <xsl:variable name="secondpart" select="substring($text, $position, string-length($text))"/>
+
+ <xsl:value-of select="concat($firstpart, $chars, $secondpart)"/>
+ </xsl:template>
+
+
+ <doc:template name="str:backward" xmlns="">
+ <refpurpose>String reversal</refpurpose>
+
+ <refdescription>
+ <para>Reverse the content of a given string</para>
+ </refdescription>
+
+ <refparameter>
+ <variablelist>
+ <varlistentry>
+ <term>text</term>
+ <listitem>
+ <para>The string to be reversed</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+
+ <refreturn>
+ <para>Returns string.</para>
+ </refreturn>
+ </doc:template>
+
+ <xsl:template name="str:backward">
+ <xsl:param name="text"/>
+ <xsl:variable name="mirror">
+ <xsl:call-template name="str:build-mirror">
+ <xsl:with-param name="text" select="$text"/>
+ <xsl:with-param name="position" select="string-length($text)"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:value-of select="substring($mirror, string-length($text) + 1, string-length($text))"/>
+ </xsl:template>
+
+ <xsl:template name="str:build-mirror">
+ <xsl:param name="text"/>
+ <xsl:param name="position"/>
+
+ <xsl:choose>
+ <xsl:when test="$position &gt; 0">
+ <xsl:call-template name="str:build-mirror">
+ <xsl:with-param name="text" select="concat($text, substring($text, $position, 1))"/>
+ <xsl:with-param name="position" select="$position - 1"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$text"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+ <doc:template name="str:justify" xmlns="">
+ <refpurpose>Format a string</refpurpose>
+
+ <refdescription>
+ <para>Inserts newlines and spaces into a string to format it as a block of text.</para>
+ </refdescription>
+
+ <refparameter>
+ <variablelist>
+ <varlistentry>
+ <term>text</term>
+ <listitem>
+ <para>String to be formatted.</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>max</term>
+ <listitem>
+ <para>Maximum line length.</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>indent</term>
+ <listitem>
+ <para>Number of spaces to insert at the beginning of each line.</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>justify</term>
+ <listitem>
+ <para>Justify left, right or both. Not currently implemented (fixed at "left").</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+
+ <refreturn>
+ <para>Formatted block of text.</para>
+ </refreturn>
+ </doc:template>
+
+ <xsl:template name='str:justify'>
+ <xsl:param name='text'/>
+ <xsl:param name='max' select='"80"'/>
+ <xsl:param name='indent' select='"0"'/>
+ <xsl:param name='justify' select='"left"'/>
+
+ <xsl:choose>
+ <xsl:when test='string-length($text) = 0 or $max &lt;= 0'/>
+
+ <xsl:when test='string-length($text) > $max and contains($text, " ") and string-length(substring-before($text, " ")) > $max'>
+ <xsl:call-template name='str:generate-string'>
+ <xsl:with-param name='text' select='" "'/>
+ <xsl:with-param name='count' select='$indent'/>
+ </xsl:call-template>
+ <xsl:value-of select='substring-before($text, " ")'/>
+ <xsl:text>
+</xsl:text>
+ <xsl:call-template name='str:justify'>
+ <xsl:with-param name='text' select='substring-after($text, " ")'/>
+ <xsl:with-param name='max' select='$max'/>
+ <xsl:with-param name='indent' select='$indent'/>
+ <xsl:with-param name='justify' select='$justify'/>
+ </xsl:call-template>
+ </xsl:when>
+
+ <xsl:when test='string-length($text) > $max and contains($text, " ")'>
+ <xsl:variable name='first'>
+ <xsl:call-template name='str:substring-before-last'>
+ <xsl:with-param name='text' select='substring($text, 1, $max)'/>
+ <xsl:with-param name='chars' select='" "'/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:call-template name='str:generate-string'>
+ <xsl:with-param name='text' select='" "'/>
+ <xsl:with-param name='count' select='$indent'/>
+ </xsl:call-template>
+ <xsl:value-of select='$first'/>
+ <xsl:text>
+</xsl:text>
+ <xsl:call-template name='str:justify'>
+ <xsl:with-param name='text' select='substring($text, string-length($first) + 2)'/>
+ <xsl:with-param name='max' select='$max'/>
+ <xsl:with-param name='indent' select='$indent'/>
+ <xsl:with-param name='justify' select='$justify'/>
+ </xsl:call-template>
+ </xsl:when>
+
+ <xsl:otherwise>
+ <xsl:call-template name='str:generate-string'>
+ <xsl:with-param name='text' select='" "'/>
+ <xsl:with-param name='count' select='$indent'/>
+ </xsl:call-template>
+ <xsl:value-of select='$text'/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+ <doc:template name="str:character-first" xmlns="">
+ <refpurpose>Find first occurring character in a string</refpurpose>
+
+ <refdescription>
+ <para>Finds which of the given characters occurs first in a string.</para>
+ </refdescription>
+
+ <refparameter>
+ <variablelist>
+ <varlistentry>
+ <term>text</term>
+ <listitem>
+ <para>The source string.</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>chars</term>
+ <listitem>
+ <para>The characters to search for.</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+ </doc:template>
+
+ <xsl:template name="str:character-first">
+ <xsl:param name="text"/>
+ <xsl:param name="chars"/>
+
+ <xsl:choose>
+ <xsl:when test="string-length($text) = 0 or string-length($chars) = 0"/>
+
+ <xsl:when test="contains($text, substring($chars, 1, 1))">
+ <xsl:variable name="next-character">
+ <xsl:call-template name="str:character-first">
+ <xsl:with-param name="text" select="$text"/>
+ <xsl:with-param name="chars" select="substring($chars, 2)"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="string-length($next-character)">
+ <xsl:variable name="first-character-position" select="string-length(substring-before($text, substring($chars, 1, 1)))"/>
+ <xsl:variable name="next-character-position" select="string-length(substring-before($text, $next-character))"/>
+
+ <xsl:choose>
+ <xsl:when test="$first-character-position &lt; $next-character-position">
+ <xsl:value-of select="substring($chars, 1, 1)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$next-character"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="substring($chars, 1, 1)"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="str:character-first">
+ <xsl:with-param name="text" select="$text"/>
+ <xsl:with-param name="chars" select="substring($chars, 2)"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+ <doc:template name="str:string-match" xmlns="">
+ <refpurpose>Match A String To A Pattern</refpurpose>
+
+ <refdescription>
+ <para>Performs globbing-style pattern matching on a string.</para>
+ </refdescription>
+
+ <example>
+ <title>Match Pattern</title>
+ <programlisting><![CDATA[
+<xsl:call-template name="str:string-match">
+ <xsl:with-param name="text" select="$mytext"/>
+ <xsl:with-param name="pattern" select="'abc*def?g'"/>
+</xsl:call-template>
+]]></programlisting>
+ </example>
+
+ <refparameter>
+ <variablelist>
+ <varlistentry>
+ <term>text</term>
+ <listitem>
+ <para>The source string.</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>pattern</term>
+ <listitem>
+ <para>The pattern to match against. Certain characters have special meaning:</para>
+ <variablelist>
+ <varlistentry>
+ <term>*</term>
+ <listitem>
+ <para>Matches zero or more characters.</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>?</term>
+ <listitem>
+ <para>Matches a single character.</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>\</term>
+ <listitem>
+ <para>Character escape. The next character is taken as a literal character.</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+
+ <refreturn>
+ <para>Returns "1" if the string matches the pattern, "0" otherwise.</para>
+ </refreturn>
+ </doc:template>
+
+ <xsl:template name="str:string-match">
+ <xsl:param name="text"/>
+ <xsl:param name="pattern"/>
+
+ <xsl:choose>
+ <xsl:when test="$pattern = '*'">
+ <!-- Special case: always matches -->
+ <xsl:text>1</xsl:text>
+ </xsl:when>
+ <xsl:when test="string-length($text) = 0 and string-length($pattern) = 0">
+ <xsl:text>1</xsl:text>
+ </xsl:when>
+ <xsl:when test="string-length($text) = 0 or string-length($pattern) = 0">
+ <xsl:text>0</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:variable name='before-special'>
+ <xsl:call-template name='str:substring-before-first'>
+ <xsl:with-param name='text' select='$pattern'/>
+ <xsl:with-param name='chars' select='"*?\"'/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:variable name='special'>
+ <xsl:call-template name='str:character-first'>
+ <xsl:with-param name='text' select='$pattern'/>
+ <xsl:with-param name='chars' select='"*?\"'/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name='new-text' select='substring($text, string-length($before-special) + 1)'/>
+ <xsl:variable name='new-pattern' select='substring($pattern, string-length($before-special) + 1)'/>
+
+ <xsl:choose>
+ <xsl:when test="not(starts-with($text, $before-special))">
+ <!-- Verbatim characters don't match -->
+ <xsl:text>0</xsl:text>
+ </xsl:when>
+
+ <xsl:when test="$special = '*' and string-length($new-pattern) = 1">
+ <xsl:text>1</xsl:text>
+ </xsl:when>
+ <xsl:when test="$special = '*'">
+ <xsl:call-template name='str:match-postfix'>
+ <xsl:with-param name='text' select='$new-text'/>
+ <xsl:with-param name='pattern' select='substring($new-pattern, 2)'/>
+ </xsl:call-template>
+ </xsl:when>
+
+ <xsl:when test="$special = '?'">
+ <xsl:call-template name="str:string-match">
+ <xsl:with-param name='text' select='substring($new-text, 2)'/>
+ <xsl:with-param name='pattern' select='substring($new-pattern, 2)'/>
+ </xsl:call-template>
+ </xsl:when>
+
+ <xsl:when test="$special = '\' and substring($new-text, 1, 1) = substring($new-pattern, 2, 1)">
+ <xsl:call-template name="str:string-match">
+ <xsl:with-param name='text' select='substring($new-text, 2)'/>
+ <xsl:with-param name='pattern' select='substring($new-pattern, 3)'/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="$special = '\' and substring($new-text, 1, 1) != substring($new-pattern, 2, 1)">
+ <xsl:text>0</xsl:text>
+ </xsl:when>
+
+ <xsl:otherwise>
+ <!-- There were no special characters in the pattern -->
+ <xsl:choose>
+ <xsl:when test='$text = $pattern'>
+ <xsl:text>1</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text>0</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+ <xsl:template name="str:match-postfix">
+ <xsl:param name="text"/>
+ <xsl:param name="pattern"/>
+
+ <xsl:variable name='result'>
+ <xsl:call-template name='str:string-match'>
+ <xsl:with-param name='text' select='$text'/>
+ <xsl:with-param name='pattern' select='$pattern'/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test='$result = "1"'>
+ <xsl:value-of select='$result'/>
+ </xsl:when>
+ <xsl:when test='string-length($text) = 0'>
+ <xsl:text>0</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name='str:match-postfix'>
+ <xsl:with-param name='text' select='substring($text, 2)'/>
+ <xsl:with-param name='pattern' select='$pattern'/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ </xsl:template>
+
+ <doc:template name="str:generate-string" xmlns="">
+ <refpurpose>Create A Repeating Sequence of Characters</refpurpose>
+
+ <refdescription>
+ <para>Repeats a string a given number of times.</para>
+ </refdescription>
+
+ <refparameter>
+ <variablelist>
+ <varlistentry>
+ <term>text</term>
+ <listitem>
+ <para>The string to repeat.</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>count</term>
+ <listitem>
+ <para>The number of times to repeat the string.</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+ </doc:template>
+
+ <xsl:template name="str:generate-string">
+ <xsl:param name="text"/>
+ <xsl:param name="count"/>
+
+ <xsl:choose>
+ <xsl:when test="string-length($text) = 0 or $count &lt;= 0"/>
+ <xsl:otherwise>
+ <xsl:value-of select="$text"/>
+ <xsl:call-template name="str:generate-string">
+ <xsl:with-param name="text" select="$text"/>
+ <xsl:with-param name="count" select="$count - 1"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+</xsl:stylesheet>
+
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/keynote/xsltsl/svg.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/keynote/xsltsl/svg.xsl
new file mode 100644
index 0000000..1254ab9
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/keynote/xsltsl/svg.xsl
@@ -0,0 +1,177 @@
+<xsl:stylesheet version='1.0'
+ xmlns:xsl='http://www.w3.org/1999/XSL/Transform'
+ xmlns:svg='http://xsltsl.org/svg'
+ xmlns:doc="http://xsltsl.org/xsl/documentation/1.0"
+ exclude-result-prefixes="doc">
+
+ <xsl:variable name='svg-public-id' select='"-//W3C//DTD SVG 20010904//EN"'/>
+ <xsl:variable name='svg-system-id' select='"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd"'/>
+
+ <doc:reference xmlns="">
+ <referenceinfo>
+ <releaseinfo role="meta">
+ $Id: svg.xsl 3991 2004-11-10 06:51:55Z balls $
+ </releaseinfo>
+ <author>
+ <surname>Ball</surname>
+ <firstname>Steve</firstname>
+ </author>
+ <copyright>
+ <year>2002</year>
+ <holder>Steve Ball</holder>
+ </copyright>
+ </referenceinfo>
+
+ <title>SVG Stylesheet</title>
+
+ <partintro>
+ <section>
+ <title>Introduction</title>
+
+ <para>This module provides templates for creating SVG images.</para>
+ </section>
+ </partintro>
+ </doc:reference>
+
+ <doc:template name="svg:aqua-button-defs" xmlns="">
+ <refpurpose>Aqua-style Button</refpurpose>
+
+ <refdescription>
+ <para>Part of the mechanism to create an Aqua-style button. Include a call to this template in your SVG document's <sgmltag>defs</sgmltag> element. This template only needs to be included once. Use this in conjunction with <sgmltag>svg:aqua-button</sgmltag>.</para>
+
+ <para>The default values for color1, color2 and color3 result in a grey button.</para>
+ </refdescription>
+
+ <refparameter>
+ <variablelist>
+ <varlistentry>
+ <term>prefix</term>
+ <listitem>
+ <para>A prefix to append to the identifiers used, so that they don't clash with other identifiers. Default: "aqua-".</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>color1</term>
+ <listitem>
+ <para>The base colour of the button. Default: "#d9d9d9".</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>color2</term>
+ <listitem>
+ <para>A "background" colour for the button. Should be a darker colour than color1. Default: "#a9a9a9".</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>color3</term>
+ <listitem>
+ <para>A highlight colour for the button. Should be a lighter colour than color1. Default: "#f9f9f9".</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+
+ <refreturn>
+ <para>Returns SVG result-tree-fragment.</para>
+ </refreturn>
+ </doc:template>
+
+ <xsl:template name="svg:aqua-button-defs">
+ <xsl:param name="prefix" select='"aqua-"'/>
+ <xsl:param name="color1" select='"#d9d9d9"'/>
+ <xsl:param name="color2" select='"#a9a9a9"'/>
+ <xsl:param name="color3" select='"#f9f9f9"'/>
+
+ <linearGradient id='{$prefix}gradient' x1='0%' y1='0%' x2='0%' y2='100%'>
+ <stop offset='0%' stop-color='{$color2}'/>
+ <stop offset='100%' stop-color='{$color1}'/>
+ </linearGradient>
+ <linearGradient id='{$prefix}highlight-gradient' x1='0%' y1='0%' x2='0%' y2='100%'>
+ <stop offset='0%' stop-color='#ffffff'/>
+ <stop offset='75%' stop-color='{$color3}' stop-opacity='0'/>
+ <stop offset='100%' stop-color='{$color3}' stop-opacity='0'/>
+ </linearGradient>
+ <linearGradient id='{$prefix}revhighlight-gradient' x1='0%' y1='100%' x2='0%' y2='0%'>
+ <stop offset='0%' stop-color='#ffffff'/>
+ <stop offset='50%' stop-color='{$color3}' stop-opacity='0'/>
+ <stop offset='100%' stop-color='{$color3}' stop-opacity='0'/>
+ </linearGradient>
+ <linearGradient id='{$prefix}corner-left-gradient' x1='0%' y1='0%' x2='100%' y2='100%'>
+ <stop offset='0%' stop-color='#000000'/>
+ <stop offset='100%' stop-color='{$color3}' stop-opacity='0'/>
+ </linearGradient>
+ <linearGradient id='{$prefix}corner-right-gradient' x1='100%' y1='0%' x2='0%' y2='100%'>
+ <stop offset='0%' stop-color='#000000'/>
+ <stop offset='100%' stop-color='{$color3}' stop-opacity='0'/>
+ </linearGradient>
+
+ <filter id='{$prefix}filter-blur' filterUnits='userSpaceOnUse' x='0' y='0' width='200' height='100'>
+ <feGaussianBlur in='SourceGraphic' stdDeviation='2'/>
+ </filter>
+ <filter id='{$prefix}drop-shadow' y='-5' height='100'>
+ <feColorMatrix type='matrix' in='SourceAlpha' result='inglow'
+ values='.5 .5 .5 1 0
+ .5 .5 .5 1 0
+ .5 .5 .5 1 0
+ 0 0 0 1 0'/>
+ <feBlend mode='multiply' in2='SourceGraphic' in='inglow' result='innerglow'/>
+
+ <feGaussianBlur stdDeviation='4' in='SourceAlpha' result='shadow'/>
+ <feColorMatrix type='matrix' in='shadow' result='lightshadow'
+ values='.33 .33 .33 1 0
+ .33 .33 .33 1 0
+ .33 .33 .33 1 0
+ 0 0 0 1 0'/>
+ <feOffset in='lightshadow' dx='0' dy='3' result='dropshadow'/>
+ <feMerge>
+ <feMergeNode in='dropshadow'/>
+ <feMergeNode in='innerglow'/>
+ </feMerge>
+ </filter>
+
+ </xsl:template>
+
+ <doc:template name="svg:aqua-button" xmlns="">
+ <refpurpose>Aqua-style Button</refpurpose>
+
+ <refdescription>
+ <para>Part of the mechanism to create an Aqua-style button. Include a call to this template in your SVG document where you want a button to appear. This template can be used many times in a single SVG document. Use this in conjunction with <sgmltag>svg:aqua-button-defs</sgmltag>.</para>
+ </refdescription>
+
+ <refparameter>
+ <variablelist>
+ <varlistentry>
+ <term>prefix</term>
+ <listitem>
+ <para>A prefix to append to the identifiers used, so that they don't clash with other identifiers. Default: "aqua-".</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+
+ <refreturn>
+ <para>Returns SVG result-tree-fragment.</para>
+ </refreturn>
+ </doc:template>
+
+ <xsl:template name='svg:aqua-button'>
+ <xsl:param name="prefix" select='"aqua-"'/>
+
+ <g filter='url(#{$prefix}drop-shadow)'>
+ <clipPath id='{$prefix}main-shape'>
+ <path clip-rule='evenodd'
+ d="M50,90 C0,90 0,30 50,30 L150,30 C200,30 200,90 150,90 z" />
+ </clipPath>
+ <path fill="url(#{$prefix}gradient)" stroke="none"
+ d="M50,90 C0,90 0,30 50,30 L150,30 C200,30 200,90 150,90 z" />
+ <path clip-path='url(#{$prefix}main-shape)' fill='url(#{$prefix}corner-left-gradient)' stroke='none' filter='url(#{$prefix}filter-blur)'
+ d="M50,57 L13,57 A35,35 -90 0,1 50,30 z" />
+ <path clip-path='url(#{$prefix}main-shape)' fill='url(#{$prefix}corner-right-gradient)' stroke='none' filter='url(#{$prefix}filter-blur)'
+ d="M150,30 A35,35 90 0,1 190,57 L150,57 z" />
+ <path fill="url(#{$prefix}highlight-gradient)" stroke="none" stroke-width='1'
+ d="M50,65 C20,65 20,35 50,35 L150,35 C180,35 180,65 150,65 z" />
+ <path filter='url(#{$prefix}filter-blur)' fill="url(#{$prefix}revhighlight-gradient)" stroke="none"
+ d="M50,85 C10,85 10,35 50,35 L150,35 C190,35 190,85 150,85 z" />
+ </g>
+ </xsl:template>
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/keynote/xsltsl/uri.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/keynote/xsltsl/uri.xsl
new file mode 100644
index 0000000..df1f738
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/keynote/xsltsl/uri.xsl
@@ -0,0 +1,580 @@
+<?xml version="1.0"?>
+
+<xsl:stylesheet
+ version="1.0"
+ extension-element-prefixes="doc"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:doc="http://xsltsl.org/xsl/documentation/1.0"
+ xmlns:uri="http://xsltsl.org/uri"
+>
+
+ <doc:reference xmlns="">
+ <referenceinfo>
+ <releaseinfo role="meta">
+ $Id: uri.xsl 3991 2004-11-10 06:51:55Z balls $
+ </releaseinfo>
+ <author>
+ <surname>Diamond</surname>
+ <firstname>Jason</firstname>
+ </author>
+ <copyright>
+ <year>2001</year>
+ <holder>Jason Diamond</holder>
+ </copyright>
+ </referenceinfo>
+
+ <title>URI (Uniform Resource Identifier) Processing</title>
+
+ <partintro>
+ <section>
+ <title>Introduction</title>
+ <para>This module provides templates for processing URIs (Uniform Resource Identifers).</para>
+ </section>
+ </partintro>
+
+ </doc:reference>
+
+ <doc:template name="uri:is-absolute-uri" xmlns="">
+ <refpurpose>Determines if a URI is absolute or relative.</refpurpose>
+
+ <refdescription>
+ <para>Absolute URIs start with a scheme (like "http:" or "mailto:").</para>
+ </refdescription>
+
+ <refparameter>
+ <variablelist>
+ <varlistentry>
+ <term>uri</term>
+ <listitem>
+ <para>An absolute or relative URI.</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+
+ <refreturn>
+ <para>Returns 'true' if the URI is absolute or '' if it's not.</para>
+ </refreturn>
+ </doc:template>
+
+ <xsl:template name="uri:is-absolute-uri">
+ <xsl:param name="uri"/>
+
+ <xsl:if test="contains($uri, ':')">
+ <xsl:value-of select="true()"/>
+ </xsl:if>
+
+ </xsl:template>
+
+ <doc:template name="uri:get-uri-scheme" xmlns="">
+ <refpurpose>Gets the scheme part of a URI.</refpurpose>
+
+ <refdescription>
+ <para>The ':' is not part of the scheme.</para>
+ </refdescription>
+
+ <refparameter>
+ <variablelist>
+ <varlistentry>
+ <term>uri</term>
+ <listitem>
+ <para>An absolute or relative URI.</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+
+ <refreturn>
+ <para>Returns the scheme (without the ':') or '' if the URI is relative.</para>
+ </refreturn>
+ </doc:template>
+
+ <xsl:template name="uri:get-uri-scheme">
+ <xsl:param name="uri"/>
+ <xsl:if test="contains($uri, ':')">
+ <xsl:value-of select="substring-before($uri, ':')"/>
+ </xsl:if>
+ </xsl:template>
+
+ <doc:template name="uri:get-uri-authority" xmlns="">
+ <refpurpose>Gets the authority part of a URI.</refpurpose>
+
+ <refdescription>
+ <para>The authority usually specifies the host machine for a resource. It always follows '//' in a typical URI.</para>
+ </refdescription>
+
+ <refparameter>
+ <variablelist>
+ <varlistentry>
+ <term>uri</term>
+ <listitem>
+ <para>An absolute or relative URI.</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+
+ <refreturn>
+ <para>Returns the authority (without the '//') or '' if the URI has no authority.</para>
+ </refreturn>
+ </doc:template>
+
+ <xsl:template name="uri:get-uri-authority">
+ <xsl:param name="uri"/>
+
+ <xsl:variable name="a">
+ <xsl:choose>
+ <xsl:when test="contains($uri, ':')">
+ <xsl:if test="substring(substring-after($uri, ':'), 1, 2) = '//'">
+ <xsl:value-of select="substring(substring-after($uri, ':'), 3)"/>
+ </xsl:if>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:if test="substring($uri, 1, 2) = '//'">
+ <xsl:value-of select="substring($uri, 3)"/>
+ </xsl:if>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="contains($a, '/')">
+ <xsl:value-of select="substring-before($a, '/')" />
+ </xsl:when>
+ <xsl:when test="contains($a, '?')">
+ <xsl:value-of select="substring-before($a, '?')" />
+ </xsl:when>
+ <xsl:when test="contains($a, '#')">
+ <xsl:value-of select="substring-before($a, '#')" />
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$a" />
+ </xsl:otherwise>
+ </xsl:choose>
+
+ </xsl:template>
+
+ <doc:template name="uri:get-uri-path" xmlns="">
+ <refpurpose>Gets the path part of a URI.</refpurpose>
+
+ <refdescription>
+ <para>The path usually comes after the '/' in a URI.</para>
+ </refdescription>
+
+ <refparameter>
+ <variablelist>
+ <varlistentry>
+ <term>uri</term>
+ <listitem>
+ <para>An absolute or relative URI.</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+
+ <refreturn>
+ <para>Returns the path (with any leading '/') or '' if the URI has no path.</para>
+ </refreturn>
+ </doc:template>
+
+ <xsl:template name="uri:get-uri-path">
+ <xsl:param name="uri"/>
+
+ <xsl:variable name="p">
+ <xsl:choose>
+ <xsl:when test="contains($uri, '//')">
+ <xsl:if test="contains(substring-after($uri, '//'), '/')">
+ <xsl:value-of select="concat('/', substring-after(substring-after($uri, '//'), '/'))"/>
+ </xsl:if>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:choose>
+ <xsl:when test="contains($uri, ':')">
+ <xsl:value-of select="substring-after($uri, ':')"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$uri"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="contains($p, '?')">
+ <xsl:value-of select="substring-before($p, '?')" />
+ </xsl:when>
+ <xsl:when test="contains($p, '#')">
+ <xsl:value-of select="substring-before($p, '#')" />
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$p" />
+ </xsl:otherwise>
+ </xsl:choose>
+
+ </xsl:template>
+
+ <doc:template name="uri:get-uri-query" xmlns="">
+ <refpurpose>Gets the query part of a URI.</refpurpose>
+
+ <refdescription>
+ <para>The query comes after the '?' in a URI.</para>
+ </refdescription>
+
+ <refparameter>
+ <variablelist>
+ <varlistentry>
+ <term>uri</term>
+ <listitem>
+ <para>An absolute or relative URI.</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+
+ <refreturn>
+ <para>Returns the query (without the '?') or '' if the URI has no query.</para>
+ </refreturn>
+ </doc:template>
+
+ <xsl:template name="uri:get-uri-query">
+ <xsl:param name="uri"/>
+
+ <xsl:variable name="q" select="substring-after($uri, '?')"/>
+
+ <xsl:choose>
+ <xsl:when test="contains($q, '#')">
+ <xsl:value-of select="substring-before($q, '#')"/>
+ </xsl:when>
+ <xsl:otherwise><xsl:value-of select="$q"/></xsl:otherwise>
+ </xsl:choose>
+
+ </xsl:template>
+
+ <doc:template name="uri:get-uri-fragment" xmlns="">
+ <refpurpose>Gets the fragment part of a URI.</refpurpose>
+
+ <refdescription>
+ <para>The fragment comes after the '#' in a URI.</para>
+ </refdescription>
+
+ <refparameter>
+ <variablelist>
+ <varlistentry>
+ <term>uri</term>
+ <listitem>
+ <para>An absolute or relative URI.</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+
+ <refreturn>
+ <para>Returns the fragment (without the '#') or '' if the URI has no fragment.</para>
+ </refreturn>
+ </doc:template>
+
+ <xsl:template name="uri:get-uri-fragment">
+ <xsl:param name="uri"/>
+
+ <xsl:value-of select="substring-after($uri, '#')"/>
+
+ </xsl:template>
+
+ <doc:template name="uri:resolve-uri" xmlns="">
+ <refpurpose>Resolves a URI reference against a base URI.</refpurpose>
+
+ <refdescription>
+ <para>This template follows the guidelines specified by <ulink url="ftp://ftp.isi.edu/in-notes/rfc2396.txt">RFC 2396</ulink>.</para>
+ </refdescription>
+
+ <refparameter>
+ <variablelist>
+ <varlistentry>
+ <term>reference</term>
+ <listitem>
+ <para>A (potentially relative) URI reference.</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>base</term>
+ <listitem>
+ <para>The base URI.</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>document</term>
+ <listitem>
+ <para>The URI of the current document. This defaults to the value of the base URI if not specified.</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+
+ <refreturn>
+ <para>The "combined" URI.</para>
+ </refreturn>
+ </doc:template>
+
+ <xsl:template name="uri:resolve-uri">
+ <xsl:param name="reference"/>
+ <xsl:param name="base"/>
+ <xsl:param name="document" select="$base"/>
+
+ <xsl:variable name="reference-scheme">
+ <xsl:call-template name="uri:get-uri-scheme">
+ <xsl:with-param name="uri" select="$reference"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="reference-authority">
+ <xsl:call-template name="uri:get-uri-authority">
+ <xsl:with-param name="uri" select="$reference"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="reference-path">
+ <xsl:call-template name="uri:get-uri-path">
+ <xsl:with-param name="uri" select="$reference"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="reference-query">
+ <xsl:call-template name="uri:get-uri-query">
+ <xsl:with-param name="uri" select="$reference"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="reference-fragment">
+ <xsl:call-template name="uri:get-uri-fragment">
+ <xsl:with-param name="uri" select="$reference"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:choose>
+
+ <xsl:when test="
+ not(string-length($reference-scheme)) and
+ not(string-length($reference-authority)) and
+ not(string-length($reference-path)) and
+ not(string-length($reference-query))"
+ >
+
+ <xsl:choose>
+ <xsl:when test="contains($document, '?')">
+ <xsl:value-of select="substring-before($document, '?')"/>
+ </xsl:when>
+ <xsl:when test="contains($document, '#')">
+ <xsl:value-of select="substring-before($document, '#')"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$document"/>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:if test="string-length($reference-fragment)">
+ <xsl:value-of select="concat('#', $reference-fragment)"/>
+ </xsl:if>
+
+ </xsl:when>
+
+ <xsl:when test="string-length($reference-scheme)">
+
+ <xsl:value-of select="$reference"/>
+
+ </xsl:when>
+
+ <xsl:otherwise>
+
+ <xsl:variable name="base-scheme">
+ <xsl:call-template name="uri:get-uri-scheme">
+ <xsl:with-param name="uri" select="$base"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="base-authority">
+ <xsl:call-template name="uri:get-uri-authority">
+ <xsl:with-param name="uri" select="$base"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="base-path">
+ <xsl:call-template name="uri:get-uri-path">
+ <xsl:with-param name="uri" select="$base"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="base-query">
+ <xsl:call-template name="uri:get-uri-query">
+ <xsl:with-param name="uri" select="$base"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="base-fragment">
+ <xsl:call-template name="uri:get-uri-fragment">
+ <xsl:with-param name="uri" select="$base"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="result-authority">
+ <xsl:choose>
+ <xsl:when test="string-length($reference-authority)">
+ <xsl:value-of select="$reference-authority"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$base-authority"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="result-path">
+ <xsl:choose>
+ <!-- don't normalize absolute paths -->
+ <xsl:when test="starts-with($reference-path, '/')">
+ <xsl:value-of select="$reference-path" />
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="uri:normalize-path">
+ <xsl:with-param name="path">
+ <xsl:if test="string-length($reference-authority) = 0 and substring($reference-path, 1, 1) != '/'">
+ <xsl:call-template name="uri:get-path-without-file">
+ <xsl:with-param name="path-with-file" select="$base-path"/>
+ </xsl:call-template>
+ <xsl:value-of select="'/'"/>
+ </xsl:if>
+ <xsl:value-of select="$reference-path"/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:value-of select="concat($base-scheme, '://', $result-authority, $result-path)"/>
+
+ <xsl:if test="string-length($reference-query)">
+ <xsl:value-of select="concat('?', $reference-query)"/>
+ </xsl:if>
+
+ <xsl:if test="string-length($reference-fragment)">
+ <xsl:value-of select="concat('#', $reference-fragment)"/>
+ </xsl:if>
+
+ </xsl:otherwise>
+ </xsl:choose>
+
+ </xsl:template>
+
+ <xsl:template name="uri:get-path-without-file">
+ <xsl:param name="path-with-file" />
+ <xsl:param name="path-without-file" />
+
+ <xsl:choose>
+ <xsl:when test="contains($path-with-file, '/')">
+ <xsl:call-template name="uri:get-path-without-file">
+ <xsl:with-param name="path-with-file" select="substring-after($path-with-file, '/')" />
+ <xsl:with-param name="path-without-file">
+ <xsl:choose>
+ <xsl:when test="$path-without-file">
+ <xsl:value-of select="concat($path-without-file, '/', substring-before($path-with-file, '/'))" />
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="substring-before($path-with-file, '/')" />
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$path-without-file" />
+ </xsl:otherwise>
+ </xsl:choose>
+
+ </xsl:template>
+
+ <xsl:template name="uri:normalize-path">
+ <xsl:param name="path"/>
+ <xsl:param name="result" select="''"/>
+
+ <xsl:choose>
+ <xsl:when test="string-length($path)">
+ <xsl:choose>
+ <xsl:when test="$path = '/'">
+ <xsl:value-of select="concat($result, '/')"/>
+ </xsl:when>
+ <xsl:when test="$path = '.'">
+ <xsl:value-of select="concat($result, '/')"/>
+ </xsl:when>
+ <xsl:when test="$path = '..'">
+ <xsl:call-template name="uri:get-path-without-file">
+ <xsl:with-param name="path-with-file" select="$result"/>
+ </xsl:call-template>
+ <xsl:value-of select="'/'"/>
+ </xsl:when>
+ <xsl:when test="contains($path, '/')">
+ <!-- the current segment -->
+ <xsl:variable name="s" select="substring-before($path, '/')"/>
+ <!-- the remaining path -->
+ <xsl:variable name="p">
+ <xsl:choose>
+ <xsl:when test="substring-after($path, '/') = ''">
+ <xsl:value-of select="'/'"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="substring-after($path, '/')"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:choose>
+ <xsl:when test="$s = ''">
+ <xsl:call-template name="uri:normalize-path">
+ <xsl:with-param name="path" select="$p"/>
+ <xsl:with-param name="result" select="$result"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="$s = '.'">
+ <xsl:call-template name="uri:normalize-path">
+ <xsl:with-param name="path" select="$p"/>
+ <xsl:with-param name="result" select="$result"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="$s = '..'">
+ <xsl:choose>
+ <xsl:when test="string-length($result) and (substring($result, string-length($result) - 2) != '/..')">
+ <xsl:call-template name="uri:normalize-path">
+ <xsl:with-param name="path" select="$p"/>
+ <xsl:with-param name="result">
+ <xsl:call-template name="uri:get-path-without-file">
+ <xsl:with-param name="path-with-file" select="$result"/>
+ </xsl:call-template>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="uri:normalize-path">
+ <xsl:with-param name="path" select="$p"/>
+ <xsl:with-param name="result" select="concat($result, '/..')"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="uri:normalize-path">
+ <xsl:with-param name="path" select="$p"/>
+ <xsl:with-param name="result" select="concat($result, '/', $s)"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="concat($result, '/', $path)"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$result"/>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ </xsl:template>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/svg/default.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/svg/default.xsl
new file mode 100644
index 0000000..86ea133
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/svg/default.xsl
@@ -0,0 +1,686 @@
+<xsl:stylesheet version='1.0'
+ xmlns:xsl='http://www.w3.org/1999/XSL/Transform'
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:doc='http://nwalsh.com/xsl/documentation/1.0'
+ exclude-result-prefixes='doc'>
+
+ <xsl:import href='../../lib/lib.xsl'/>
+
+ <doc:article xmlns=''>
+ <articleinfo>
+ <title>SVG Slides</title>
+
+ <author>
+ <firstname>Steve</firstname>
+ <surname>Ball</surname>
+ <affiliation>
+ <orgname>Zveno</orgname>
+ <address>
+ <otheraddr>
+ <ulink url='http://www.zveno.com/'>zveno.com</ulink>
+ </otheraddr>
+ </address>
+ </affiliation>
+ </author>
+
+ <releaseinfo>$Id: default.xsl 6567 2007-01-30 06:43:18Z xmldoc $</releaseinfo>
+
+ <copyright>
+ <year>2002</year>
+ <holder>Steve Ball, Zveno Pty Ltd</holder>
+ </copyright>
+
+ <legalnotice>
+ <para>Zveno Pty Ltd makes this software and associated documentation available free of charge for any purpose. You may make copies of the software but you must include all of this notice on any copy.</para>
+ <para>Zveno Pty Ltd does not warrant that this software is error free or fit for any purpose. Zveno Pty Ltd disclaims any liability for all claims, expenses, losses, damages and costs any user may incur as a result of using, copying or modifying the software.</para>
+ </legalnotice>
+ </articleinfo>
+ </doc:article>
+
+ <xsl:variable name='svg-public-id' select='"-//W3C//DTD SVG 20001102//EN"'/>
+ <xsl:variable name='svg-system-id' select='"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd"'/>
+
+ <xsl:output method="xml" indent='yes' doctype-public='-//W3C//DTD SVG 20001102//EN' doctype-system='http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd' cdata-section-elements="script"/>
+
+ <xsl:strip-space elements='slides foil foilgroup'/>
+
+ <xsl:param name='css-stylesheet'>slides.css</xsl:param>
+ <xsl:param name='graphics.dir'>graphics</xsl:param>
+
+ <xsl:param name='toc.bg.color'>white</xsl:param>
+
+ <xsl:param name='font.family'>Arial</xsl:param>
+ <xsl:param name='bg.color'>white</xsl:param>
+ <xsl:param name='fg.color'>black</xsl:param>
+
+ <xsl:param name='foil.width' select='800'/>
+ <xsl:param name='foil.height' select='600'/>
+
+ <xsl:param name='toc.line.max' select='7'/>
+
+ <xsl:attribute-set name="svg.attributes">
+ <xsl:attribute name="xml:space">preserve</xsl:attribute>
+ <xsl:attribute name="width">100%</xsl:attribute>
+ <xsl:attribute name="height"><xsl:value-of select='$foil.height'/></xsl:attribute>
+ <xsl:attribute name="style">font-family: <xsl:value-of select='$font.family'/>; font-size: 18pt; fill: <xsl:value-of select='$fg.color'/>; stroke: <xsl:value-of select='$fg.color'/>; background-color: <xsl:value-of select='$bg.color'/></xsl:attribute>
+ </xsl:attribute-set>
+
+ <xsl:attribute-set name="text-title">
+ <xsl:attribute name="style">font-size: 24pt; font-weight: bold</xsl:attribute>
+ </xsl:attribute-set>
+ <xsl:attribute-set name="text-author">
+ <xsl:attribute name="style">font-size: 18pt</xsl:attribute>
+ </xsl:attribute-set>
+ <xsl:attribute-set name="text-main">
+ <xsl:attribute name="style">font-size: 18pt</xsl:attribute>
+ </xsl:attribute-set>
+
+<!-- ============================================================ -->
+
+<xsl:template name="graphics.dir">
+ <!-- danger will robinson: template shadows parameter -->
+ <xsl:variable name="source.graphics.dir">
+ <xsl:call-template name="dbhtml-attribute">
+ <xsl:with-param name="pis" select="/processing-instruction('dbhtml')"/>
+ <xsl:with-param name="attribute" select="'graphics-dir'"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="$source.graphics.dir != ''">
+ <xsl:value-of select="$source.graphics.dir"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$graphics.dir"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="css-stylesheet">
+ <!-- danger will robinson: template shadows parameter -->
+ <xsl:variable name="source.css-stylesheet">
+ <xsl:call-template name="dbhtml-attribute">
+ <xsl:with-param name="pis" select="/processing-instruction('dbhtml')"/>
+ <xsl:with-param name="attribute" select="'css-stylesheet'"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="$source.css-stylesheet != ''">
+ <xsl:value-of select="$source.css-stylesheet"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$css-stylesheet"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ============================================================ -->
+
+ <xsl:template match="/">
+ <xsl:apply-templates/>
+ </xsl:template>
+
+ <xsl:template match="slides">
+ <xsl:if test='$css-stylesheet != ""'>
+ <xsl:processing-instruction name='xml-stylesheet'>
+ <xsl:text> href="</xsl:text>
+ <xsl:value-of select='$css-stylesheet'/>
+ <xsl:text>" type="text/css"</xsl:text>
+ </xsl:processing-instruction>
+ </xsl:if>
+
+ <svg xsl:use-attribute-sets="svg.attributes">
+ <title>
+ <xsl:value-of select="slidesinfo/title"/>
+ </title>
+
+ <defs>
+ <xsl:call-template name='svg.defs'/>
+ </defs>
+
+ <!-- Create the title foil -->
+ <g id='title' display='inline'>
+ <xsl:call-template name='render-background'>
+ <xsl:with-param name='mode'>title</xsl:with-param>
+ <xsl:with-param name='id' select='"title-bg"'/>
+ </xsl:call-template>
+
+ <text id='title-main' x='50%' y='33.3%' text-anchor='middle' xsl:use-attribute-sets='text-title'>
+ <xsl:value-of select='/slides/slidesinfo/title'/>
+ </text>
+ <g id='title-author'>
+ <xsl:apply-templates select='/slides/slidesinfo/author|/slides/slidesinfo/corpauthor'/>
+ </g>
+
+ <set attributeName='display' to='none' attributeType='CSS'>
+ <xsl:attribute name='begin'>
+ <xsl:text>title.click</xsl:text>
+ </xsl:attribute>
+ <xsl:attribute name='end'>
+ <xsl:text>foil1-previous-button.click; </xsl:text>
+ <xsl:value-of select='concat("foil", count(//foil), ".click")'/>
+ <xsl:for-each select='//foil'>
+ <xsl:value-of select='concat("; foil", count(preceding-sibling::foil|preceding::foil) + 1, "-title-button.click")'/>
+ </xsl:for-each>
+ </xsl:attribute>
+ </set>
+ </g>
+
+ <!-- Create the TOC -->
+ <xsl:if test='foilgroup'>
+ <g id='toc' display='none'>
+
+ <xsl:call-template name='render-background'>
+ <xsl:with-param name='mode'>toc</xsl:with-param>
+ <xsl:with-param name='id' select='"index-bg"'/>
+ </xsl:call-template>
+
+ <text id='toc-main' x='50%' y='50' text-anchor='middle' xsl:use-attribute-sets='text-title'>
+ <xsl:value-of select='/slides/slidesinfo/title'/>
+ </text>
+
+ <set attributeName='display' to='inline' attributeType='CSS'>
+ <xsl:attribute name='begin'>
+ <xsl:text>title.click</xsl:text>
+ <xsl:for-each select='//foil'>
+ <xsl:value-of select='concat("; foil", count(preceding-sibling::foil|preceding::foil) + 1, "-toc-button.click")'/>
+ </xsl:for-each>
+ </xsl:attribute>
+ <xsl:attribute name='end'>
+ <xsl:text>toc.click; toc-content.click</xsl:text>
+ <xsl:for-each select='//foilgroup'>
+ <xsl:value-of select='concat("; index-foilgroup-", count(preceding-sibling::foilgroup|preceding::foilgroup) + 1, ".click")'/>
+ </xsl:for-each>
+ </xsl:attribute>
+ </set>
+
+ </g>
+ <g id='toc-content' display='none'>
+ <xsl:call-template name='layout-toc-columns'>
+ <xsl:with-param name='nodes' select='foilgroup'/>
+ <xsl:with-param name='x'>
+ <xsl:choose>
+ <xsl:when test='count(foilgroup) > $toc.line.max'>
+ <xsl:text>50</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>75</xsl:otherwise>
+ </xsl:choose>
+ </xsl:with-param>
+ </xsl:call-template>
+ <set attributeName='display' to='inline' attributeType='CSS'>
+ <xsl:attribute name='begin'>
+ <xsl:text>title.click</xsl:text>
+ <xsl:for-each select='//foil'>
+ <xsl:value-of select='concat("; foil", count(preceding-sibling::foil|preceding::foil) + 1, "-toc-button.click")'/>
+ </xsl:for-each>
+ </xsl:attribute>
+ <xsl:attribute name='end'>
+ <xsl:text>toc.click; toc-content.click</xsl:text>
+ <xsl:for-each select='//foilgroup'>
+ <xsl:value-of select='concat("; index-foilgroup-", count(preceding-sibling::foilgroup|preceding::foilgroup) + 1, ".click")'/>
+ </xsl:for-each>
+ </xsl:attribute>
+ </set>
+ </g>
+ </xsl:if>
+
+ <xsl:apply-templates select='*[not(self::slidesinfo)]'/>
+
+ </svg>
+ </xsl:template>
+
+ <!-- The application is expected to override these templates -->
+ <xsl:template name='svg.defs'/>
+ <xsl:template name='render-background'>
+ <!-- mode lets us know what kind of foil is being produced -->
+ <xsl:param name='mode'/>
+
+ <!-- id is a required parameter to include in the generated graphics.
+ - This is important for slide transitions.
+ -->
+ <xsl:param name='id'/>
+
+ <!-- This background covers most of the foil area,
+ - but leaves a space in the lower left corner for the
+ - controls
+ -->
+
+ <xsl:choose>
+ <xsl:when test='$mode = "toc"'>
+ <g id='{$id}'>
+ <!--
+ <rect width='{2 * $foil.width}' height='75' style='fill: {$toc.bg.color}; stroke: none'/>
+-->
+ <rect width="{2 * $foil.width}" height="{$foil.height - 200}" style="fill: {$toc.bg.color}; stroke: none"/>
+ <rect transform='translate(100 {$foil.height - 200})' width="{2 * $foil.width}" height="200" style="fill: {$toc.bg.color}; stroke: none"/>
+ </g>
+ </xsl:when>
+ <xsl:otherwise>
+ <g id="{$id}">
+ <rect width="{2 * $foil.width}" height="{$foil.height - 200}" style="fill: {$bg.color}; stroke: none"/>
+ <rect transform='translate(100 {$foil.height - 200})' width="{2 * $foil.width}" height="200" style="fill: {$bg.color}; stroke: none"/>
+ </g>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+ <xsl:template match='author'>
+ <text x='50%' y='60%' text-anchor='middle' xsl:use-attribute-sets='text-author'>
+ <tspan>
+ <xsl:apply-templates select='firstname'/>
+ </tspan>
+ <tspan>
+ <xsl:text> </xsl:text>
+ </tspan>
+ <tspan>
+ <xsl:apply-templates select='surname'/>
+ </tspan>
+ <xsl:if test='affiliation'>
+ <tspan x='0' y='20'>
+ <xsl:apply-templates select='affiliation'/>
+ </tspan>
+ </xsl:if>
+ </text>
+ </xsl:template>
+ <xsl:template match='corpauthor'>
+ <text x='50%' y='70%' text-anchor='middle' xsl:use-attribute-sets='text-author'>
+ <xsl:apply-templates/>
+ </text>
+ </xsl:template>
+
+ <xsl:template name='layout-toc-columns'>
+ <xsl:param name='nodes'/>
+ <xsl:param name='entries-are-links' select='"yes"'/>
+ <xsl:param name='highlight'/>
+ <xsl:param name='x' select='50'/>
+
+ <xsl:choose>
+ <xsl:when test='not($nodes)'/>
+
+ <xsl:otherwise>
+ <xsl:for-each select='$nodes[position() &lt;= $toc.line.max]'>
+ <g>
+ <xsl:if test='$entries-are-links = "yes"'>
+ <xsl:attribute name='id'>
+ <xsl:text>index-foilgroup-</xsl:text>
+ <xsl:value-of select='count(preceding-sibling::foilgroup|preceding::foilgroup) + 1'/>
+ </xsl:attribute>
+ </xsl:if>
+ <text x='{$x}' y='{position() * 35 + 75}' xsl:use-attribute-sets='text-main'>
+ <xsl:if test='$highlight and generate-id($highlight) = generate-id(.)'>
+ <xsl:attribute name='fill'>#ff8000</xsl:attribute>
+ <xsl:attribute name='stroke'>#ff8000</xsl:attribute>
+ </xsl:if>
+ <xsl:value-of select='title'/>
+ </text>
+ <xsl:if test='$entries-are-links = "yes"'>
+ <set attributeName='fill' attributeType='CSS' to='#ff0033' begin='mouseover' end='mouseout'/>
+ <set attributeName='stroke' attributeType='CSS' to='#ff0033' begin='mouseover' end='mouseout'/>
+ </xsl:if>
+ </g>
+ </xsl:for-each>
+
+ <xsl:call-template name='layout-toc-columns'>
+ <xsl:with-param name='nodes' select='$nodes[position() > $toc.line.max]'/>
+ <xsl:with-param name='entries-are-links' select='$entries-are-links'/>
+ <xsl:with-param name='highlight' select='$highlight'/>
+ <xsl:with-param name='x' select='$x + 200'/>
+ </xsl:call-template>
+
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+ <xsl:template match='foilgroup'>
+ <xsl:variable name='fg-num' select='count(preceding-sibling::foilgroup) + 1'/>
+
+ <!-- Add a separator foil to indicate progress -->
+ <g id='toc-sep-{$fg-num}' display='none'>
+ <xsl:call-template name='render-background'>
+ <xsl:with-param name='mode'>toc</xsl:with-param>
+ <xsl:with-param name='id' select='concat("toc-sep-", $fg-num, "-bg")'/>
+ </xsl:call-template>
+
+ <text id='toc-sep-{$fg-num}-main' x='50%' y='50' text-anchor='middle' xsl:use-attribute-sets='text-title'>
+ <xsl:value-of select='/slides/slidesinfo/title'/>
+ </text>
+
+ <set attributeName='display' to='inline' attributeType='CSS' end='toc-sep-{$fg-num}.click; toc-sep-{$fg-num}-content.click'>
+ <xsl:attribute name='begin'>
+ <xsl:choose>
+ <xsl:when test='$fg-num = 1'>
+ <xsl:text>index-foilgroup-1.click; toc.click; toc-content.click</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text>index-foilgroup-</xsl:text>
+ <xsl:value-of select='count(preceding-sibling::foilgroup) + 1'/>
+ <xsl:text>.click; foil</xsl:text>
+ <xsl:value-of select='count(preceding::foil)'/>
+ <xsl:text>.click</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:attribute>
+ </set>
+
+ </g>
+ <g id='toc-sep-{$fg-num}-content' display='none'>
+ <xsl:call-template name='layout-toc-columns'>
+ <xsl:with-param name='nodes' select='/slides/foilgroup'/>
+ <xsl:with-param name='entries-are-links' select='no'/>
+ <xsl:with-param name='highlight' select='.'/>
+ <xsl:with-param name='x'>
+ <xsl:choose>
+ <xsl:when test='count(/slides/foilgroup) > $toc.line.max'>
+ <xsl:text>50</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>75</xsl:otherwise>
+ </xsl:choose>
+ </xsl:with-param>
+ </xsl:call-template>
+ <set attributeName='display' to='inline' attributeType='CSS' end='toc-sep-{$fg-num}.click; toc-sep-{$fg-num}-content.click'>
+ <xsl:attribute name='begin'>
+ <xsl:choose>
+ <xsl:when test='$fg-num = 1'>
+ <xsl:text>index-foilgroup-1.click; toc.click; toc-content.click</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text>index-foilgroup-</xsl:text>
+ <xsl:value-of select='count(preceding-sibling::foilgroup) + 1'/>
+ <xsl:text>.click; foil</xsl:text>
+ <xsl:value-of select='count(preceding::foil)'/>
+ <xsl:text>.click</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:attribute>
+ </set>
+ </g>
+
+ <!-- still want TOC and Previous buttons -->
+
+ <xsl:apply-templates select='foil'/>
+ </xsl:template>
+
+ <xsl:template match='foil'>
+ <xsl:variable name='number' select='count(preceding-sibling::foil|preceding::foil) + 1'/>
+
+ <g id='foil{$number}' display='none'>
+ <xsl:call-template name='render-background'>
+ <xsl:with-param name='id' select='concat("foil", $number, "-bg")'/>
+ </xsl:call-template>
+
+ <text id='foil{$number}-title' transform='translate(50 50)'>
+ <tspan id='foil{$number}-title-foilgroup' x='0' y='0' xsl:use-attribute-sets='text-title'>
+ <xsl:choose>
+ <xsl:when test='parent::foilgroup'>
+ <xsl:value-of select='../title'/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select='/slides/slidesinfo/title'/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </tspan>
+ <tspan> - </tspan>
+ <tspan id='foil{$number}-title-foil' xsl:use-attribute-sets='text-title'>
+ <xsl:value-of select='title'/>
+ </tspan>
+ </text>
+
+ <g transform='translate(50 100)'>
+ <xsl:apply-templates select='*[not(self::title)][1]'/>
+ </g>
+
+ <xsl:call-template name='foil-events'>
+ <xsl:with-param name='number' select='$number'/>
+ </xsl:call-template>
+
+ </g>
+
+ <!-- Add previous and TOC buttons
+ - (no need for next, mouse click does that)
+ -->
+
+ <g id='foil{$number}-toc-button' transform='translate(20 {$foil.height - 180})' display='none'>
+ <g style='opacity: 0'>
+ <xsl:call-template name='toc-button'/>
+ <text x='25' y='28'>TOC</text>
+ <set attributeName='opacity' to='1' attributeType='CSS' begin='mouseover' end='mouseout'/>
+ </g>
+
+ <xsl:call-template name='foil-events'>
+ <xsl:with-param name='number' select='$number'/>
+ </xsl:call-template>
+
+ </g>
+ <xsl:if test='$number != 1'>
+ <g id='foil{$number}-previous-button' transform='translate(20 {$foil.height - 150})' display='none'>
+ <g style='opacity: 0'>
+ <xsl:call-template name='previous-button'/>
+ <text x='17' y='28'>Previous</text>
+ <set attributeName='opacity' to='1' attributeType='CSS' begin='mouseover' end='mouseout'/>
+ </g>
+
+ <xsl:call-template name='foil-events'>
+ <xsl:with-param name='number' select='$number'/>
+ </xsl:call-template>
+
+ </g>
+ </xsl:if>
+
+ </xsl:template>
+
+ <!-- The application may override these -->
+ <xsl:template name='toc-button'/>
+ <xsl:template name='previous-button'/>
+
+ <xsl:template match='foilinfo|foil/title|foil/subtitle|foil/titleabbrev'/>
+
+ <xsl:template name='foil-events'>
+ <xsl:param name='number' select='0'/>
+ <xsl:param name='attribute' select='"display"'/>
+ <xsl:param name='onvalue' select='"inline"'/>
+ <xsl:param name='offvalue' select='"none"'/>
+
+ <!-- Must account for first and last foils and also foilgroup separators:
+ - On first foil, previous goes back to main TOC,
+ - If no TOC foil, then go to title foil instead.
+ - First foil in foilgroup follows group separator.
+ - Last foil in foilgroup goes to next group separator,
+ - except last foil in last group goes to main TOC.
+ -->
+
+ <xsl:choose>
+ <xsl:when test='$number = 1'>
+ <!-- This is the very first foil -->
+ <set attributeName='{$attribute}' to='{$onvalue}' attributeType='CSS'
+ end='foil{$number}.click; foil{$number}-toc-button.click'>
+ <xsl:attribute name='begin'>
+ <xsl:choose>
+ <xsl:when test='parent::foilgroup'>
+ <xsl:value-of select='concat("toc-sep-", count(preceding::foilgroup) + 1, ".click")'/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text>title.click</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:if test='parent::foilgroup and not(preceding-sibling::foil)'>
+ <xsl:value-of select='concat("; index-foilgroup-", count(preceding::foilgroup) + 1, ".click")'/>
+ </xsl:if>
+ <xsl:value-of select='concat("; foil", $number + 1, "-previous-button.click")'/>
+ </xsl:attribute>
+ </set>
+ </xsl:when>
+ <xsl:when test='count(following-sibling::foil|following::foil) = 0'>
+ <!-- This is the very last foil -->
+ <set attributeName='{$attribute}' to='{$onvalue}' attributeType='CSS'
+ end='foil{$number}.click; foil{$number}-toc-button.click; foil{$number}-previous-button.click'>
+ <xsl:attribute name='begin'>
+ <xsl:choose>
+ <xsl:when test='parent::foilgroup and not(preceding-sibling::foil)'>
+ <xsl:value-of select='concat("; index-foilgroup-", count(preceding::foilgroup) + 1, ".click; toc-sep-", count(preceding::foilgroup) + 1, ".click")'/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select='concat("foil", $number - 1, ".click")'/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:attribute>
+ </set>
+ </xsl:when>
+ <xsl:otherwise>
+ <set attributeName='{$attribute}' to='{$onvalue}' attributeType='CSS'
+ end='foil{$number}.click; foil{$number}-toc-button.click; foil{$number}-previous-button.click'>
+ <xsl:attribute name='begin'>
+ <xsl:value-of select='concat("foil", $number + 1, "-previous-button.click")'/>
+ <xsl:choose>
+ <xsl:when test='parent::foilgroup and not(preceding-sibling::foil)'>
+ <xsl:value-of select='concat("; index-foilgroup-", count(preceding::foilgroup) + 1, ".click; toc-sep-", count(preceding::foilgroup) + 1, ".click")'/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select='concat("; foil", $number - 1, ".click")'/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:attribute>
+ </set>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ </xsl:template>
+
+ <xsl:template match="para">
+ <xsl:variable name='depth'>
+ <xsl:choose>
+ <xsl:when test='@depth'>
+ <xsl:value-of select='@depth'/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text>1</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <g transform='translate(0 30)'>
+ <xsl:if test='not(@style)'>
+ <g transform='translate({25 * ($depth - 1)} 0)'>
+ <xsl:call-template name='bullet'/>
+ </g>
+ </xsl:if>
+
+ <text y="10">
+ <xsl:attribute name='x'>
+ <xsl:value-of select='25 * $depth'/>
+ </xsl:attribute>
+ <xsl:if test='@style'>
+ <xsl:attribute name='style'>
+ <xsl:value-of select='@style'/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:apply-templates/>
+ </text>
+
+ <xsl:apply-templates select='following-sibling::*[1]'/>
+ </g>
+ </xsl:template>
+
+ <xsl:template match='text()'>
+ <tspan>
+ <xsl:value-of select='.'/>
+ </tspan>
+ </xsl:template>
+
+ <xsl:template match='emphasis'>
+ <xsl:variable name='style'>
+ <xsl:choose>
+ <xsl:when test='@role = "bold"'>
+ <xsl:text>font-weight: bold</xsl:text>
+ </xsl:when>
+ <xsl:when test='@role = "italic"'>
+ <xsl:text>font-style: italic</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text>font-style: italic</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <tspan style='{$style}'>
+ <xsl:value-of select='.'/>
+ </tspan>
+ </xsl:template>
+
+ <xsl:template match='listitem'>
+ <xsl:call-template name="bullet"/>
+ <g transform='translate(20 0)'>
+ <xsl:apply-templates/>
+ </g>
+ </xsl:template>
+
+ <xsl:template name="bullet">
+ <xsl:choose>
+ <xsl:when test="@depth = 1 or count(ancestor-or-self::listitem) = 1">
+ <xsl:call-template name="large-filled-circle"/>
+ </xsl:when>
+ <xsl:when test="@depth = 2 or count(ancestor-or-self::listitem) = 2">
+ <xsl:call-template name="small-open-circle"/>
+ </xsl:when>
+ <xsl:when test="@depth = 3 or count(ancestor-or-self::listitem) = 3">
+ <xsl:call-template name="small-filled-circle"/>
+ </xsl:when>
+ <xsl:when test="@depth = 4 or count(ancestor-or-self::listitem) = 4">
+ <xsl:call-template name="closed-toggle"/>
+ </xsl:when>
+ <xsl:when test="@depth = 5 or count(ancestor-or-self::listitem) = 5">
+ <xsl:call-template name="large-filled-circle"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="small-open-box"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+ <xsl:template name="closed-toggle">
+ <polyline fill="white" stroke="black" stroke-width="1" points="0 0 10 5 0 10 0 0"/>
+ </xsl:template>
+ <xsl:template name="large-filled-circle">
+ <circle fill="black" cx="10" cy="6" r="5"/>
+ </xsl:template>
+ <xsl:template name="small-filled-circle">
+ <circle fill="black" cx="10" cy="6" r="2.5"/>
+ </xsl:template>
+ <xsl:template name="small-open-circle">
+ <circle fill="none" stroke="black" stroke-width="1" cx="10" cy="6" r="2.5"/>
+ </xsl:template>
+ <xsl:template name="small-open-box">
+ <rect fill="none" stroke="black" stroke-width="1" x="5" y="5" width="5" height="5"/>
+ </xsl:template>
+
+ <xsl:template match="subject">
+ <tspan style="font-weight: bold">
+ <xsl:apply-templates/>
+ </tspan>
+ </xsl:template>
+
+ <xsl:template match="informalexample">
+ </xsl:template>
+ <xsl:template match="programlisting">
+ <!-- Output lines verbatim -->
+ </xsl:template>
+
+ <xsl:template match="imageobject|mediaobject">
+ <xsl:apply-templates/>
+ </xsl:template>
+ <xsl:template match='textobject|videoobject'/>
+ <xsl:template match='imagedata'>
+ <g transform='translate(0 30)'>
+ <image xlink:href='{@fileref}' x='0' y='0' width='600' height='400'/>
+ </g>
+ </xsl:template>
+
+ <xsl:template match='ulink'>
+ <a xlink:href='{@url}'>
+ <xsl:apply-templates/>
+ </a>
+ </xsl:template>
+
+</xsl:stylesheet>
+
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/xhtml/css.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/xhtml/css.xsl
new file mode 100644
index 0000000..d0b47c6
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/xhtml/css.xsl
@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="ASCII"?>
+<!--This file was created automatically by html2xhtml-->
+<!--from the HTML stylesheets.-->
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1999/xhtml" version="1.0">
+
+<!-- ====================================================================== -->
+
+<xsl:template name="css-file">
+ <xsl:param name="css" select="'slides.css'"/>
+
+ <xsl:variable name="source.css.dir">
+ <xsl:call-template name="dbhtml-attribute">
+ <xsl:with-param name="pis" select="/processing-instruction('dbhtml')"/>
+ <xsl:with-param name="attribute" select="'css-stylesheet-dir'"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="$source.css.dir != ''">
+ <xsl:value-of select="$source.css.dir"/>
+ <xsl:text>/</xsl:text>
+ </xsl:when>
+ <xsl:when test="$css.stylesheet.dir != ''">
+ <xsl:value-of select="$css.stylesheet.dir"/>
+ <xsl:text>/</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text>http://docbook.sourceforge.net/release/slides/browser/</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:value-of select="$css"/>
+</xsl:template>
+
+<!-- ====================================================================== -->
+<!-- active navigation images -->
+
+<xsl:template name="css.stylesheet">
+ <xsl:param name="css" select="$css.stylesheet"/>
+ <!-- Danger Will Robinson: template shadows parameter -->
+ <xsl:call-template name="css-file">
+ <xsl:with-param name="css" select="$css"/>
+ </xsl:call-template>
+</xsl:template>
+
+<!-- ====================================================================== -->
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/xhtml/default.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/xhtml/default.xsl
new file mode 100644
index 0000000..86f2cb3
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/xhtml/default.xsl
@@ -0,0 +1,246 @@
+<?xml version="1.0" encoding="ASCII"?>
+<!--This file was created automatically by html2xhtml-->
+<!--from the HTML stylesheets.-->
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1999/xhtml" version="1.0">
+
+<xsl:import href="slides-common.xsl"/>
+
+<xsl:output method="xml" encoding="UTF-8" doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN" doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"/>
+
+<xsl:param name="css.stylesheet" select="'slides-default.css'"/>
+
+<xsl:template name="top-nav">
+ <xsl:param name="home"/>
+ <xsl:param name="up"/>
+ <xsl:param name="next"/>
+ <xsl:param name="prev"/>
+ <xsl:param name="tocfile" select="$toc.html"/>
+
+ <div class="navhead">
+ <table width="100%" border="0" cellpadding="0" cellspacing="0" summary="Navigation">
+ <tr>
+ <xsl:call-template name="generate.toc.hide.show"/>
+ <td align="left" width="10%">
+ <xsl:choose>
+ <xsl:when test="$prev">
+ <a>
+ <xsl:attribute name="href">
+ <xsl:apply-templates select="$prev" mode="filename"/>
+ </xsl:attribute>
+
+ <img alt="Prev" border="0">
+ <xsl:attribute name="src">
+ <xsl:call-template name="prev.image"/>
+ </xsl:attribute>
+ </img>
+ </a>
+ </xsl:when>
+ <xsl:otherwise>&#160;</xsl:otherwise>
+ </xsl:choose>
+ </td>
+ <td align="center" width="80%">
+ <xsl:variable name="prestitle">
+ <xsl:value-of select="(/slides/slidesinfo/title |/slides/title)[1]"/>
+ </xsl:variable>
+
+ <span class="navheader">
+ <xsl:value-of select="$prestitle"/>
+ </span>
+ </td>
+ <td align="right" width="10%">
+ <xsl:choose>
+ <xsl:when test="$next">
+ <a>
+ <xsl:attribute name="href">
+ <xsl:apply-templates select="$next" mode="filename"/>
+ </xsl:attribute>
+
+ <img alt="Next" border="0">
+ <xsl:attribute name="src">
+ <xsl:call-template name="next.image"/>
+ </xsl:attribute>
+ </img>
+ </a>
+ </xsl:when>
+ <xsl:otherwise>&#160;</xsl:otherwise>
+ </xsl:choose>
+ </td>
+ </tr>
+ </table>
+ <hr class="top-nav-sep"/>
+ </div>
+</xsl:template>
+
+<xsl:template name="bottom-nav">
+ <xsl:param name="home"/>
+ <xsl:param name="up"/>
+ <xsl:param name="next"/>
+ <xsl:param name="prev"/>
+ <xsl:param name="tocfile" select="$toc.html"/>
+
+ <div class="navfoot">
+ <hr class="bottom-nav-sep"/>
+ <table width="100%" border="0" cellpadding="0" cellspacing="0" summary="Navigation">
+ <tr>
+ <td align="left" width="80%" valign="top">
+ <span class="navfooter">
+ <xsl:apply-templates select="/slides/slidesinfo/copyright" mode="slide.footer.mode"/>
+ </span>
+ </td>
+ <td align="right" width="20%" valign="top">
+ <span class="index">
+ <xsl:value-of select="count(preceding::foil) + count(preceding::foilgroup) + count(ancestor::foilgroup) + 1"/>
+ </span>
+ <xsl:text>&#160;</xsl:text>
+ </td>
+ </tr>
+ </table>
+ </div>
+</xsl:template>
+
+<!-- ====================================================================== -->
+
+<xsl:template name="titlepage-top-nav">
+ <xsl:param name="home"/>
+ <xsl:param name="up"/>
+ <xsl:param name="next"/>
+ <xsl:param name="prev"/>
+ <xsl:param name="tocfile" select="$toc.html"/>
+
+ <div class="navhead">
+ <table width="100%" border="0" cellpadding="0" cellspacing="0" summary="Navigation">
+ <tr>
+ <td align="left" width="10%">
+ <span class="toclink">
+ <a href="{$toc.html}">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key">TableofContents</xsl:with-param>
+ </xsl:call-template>
+ </a>
+ </span>
+ </td>
+ <td align="center" width="80%">
+ <xsl:text>&#160;</xsl:text>
+ </td>
+ <td align="right" width="10%">
+ <xsl:text>&#160;</xsl:text>
+ </td>
+ </tr>
+ </table>
+ </div>
+</xsl:template>
+
+<xsl:template name="titlepage-bottom-nav">
+ <xsl:param name="home"/>
+ <xsl:param name="up"/>
+ <xsl:param name="next"/>
+ <xsl:param name="prev"/>
+ <xsl:param name="tocfile" select="$toc.html"/>
+
+ <div class="navfoot">
+ <table width="100%" border="0" cellspacing="0" cellpadding="0" summary="Navigation">
+ <tr>
+ <td align="left" width="80%" valign="top">
+ <span class="navfooter">
+ <xsl:apply-templates select="/slides/slidesinfo/copyright" mode="slide.footer.mode"/>
+ </span>
+ </td>
+ <td align="right" width="20%" valign="top">
+ <a>
+ <xsl:attribute name="href">
+ <xsl:apply-templates select="(following::foilgroup|following::foil)[1]" mode="filename"/>
+ </xsl:attribute>
+ <img alt="Next" border="0">
+ <xsl:attribute name="src">
+ <xsl:call-template name="next.image"/>
+ </xsl:attribute>
+ </img>
+ </a>
+ </td>
+ </tr>
+ </table>
+ </div>
+</xsl:template>
+
+<xsl:template name="toc-top-nav">
+ <xsl:param name="home"/>
+ <xsl:param name="up"/>
+ <xsl:param name="next"/>
+ <xsl:param name="prev"/>
+ <xsl:param name="tocfile" select="$toc.html"/>
+
+ <div class="navhead">
+ <table width="100%" border="0" cellpadding="0" cellspacing="0" summary="Navigation">
+ <tr>
+ <td align="left">
+ <xsl:text>&#160;</xsl:text>
+ </td>
+ </tr>
+ </table>
+ </div>
+</xsl:template>
+
+<xsl:template name="toc-bottom-nav">
+ <div class="navfoot">
+ <table width="100%" border="0" cellspacing="0" cellpadding="0" summary="Navigation">
+ <tr>
+ <td align="left" width="80%" valign="top">
+ <span class="navfooter">
+ <xsl:apply-templates select="/slides/slidesinfo/copyright" mode="slide.footer.mode"/>
+ </span>
+ </td>
+ <td align="right" width="20%" valign="top">
+ <a href="{$titlefoil.html}">
+ <img alt="Next" border="0">
+ <xsl:attribute name="src">
+ <xsl:call-template name="next.image"/>
+ </xsl:attribute>
+ </img>
+ </a>
+ </td>
+ </tr>
+ </table>
+ </div>
+</xsl:template>
+
+<!-- ====================================================================== -->
+
+<xsl:template name="generate.toc.hide.show">
+ <xsl:if test="$toc.hide.show != 0">
+ <td>
+ <img hspace="4" alt="Hide/Show TOC">
+ <xsl:attribute name="src">
+ <xsl:call-template name="hidetoc.image"/>
+ </xsl:attribute>
+ <xsl:attribute name="onClick">
+ <xsl:text>toggletoc(this,</xsl:text>
+ <xsl:value-of select="$toc.width"/>
+ <xsl:text>,'</xsl:text>
+ <xsl:call-template name="hidetoc.image"/>
+ <xsl:text>','</xsl:text>
+ <xsl:call-template name="showtoc.image"/>
+ <xsl:text>');</xsl:text>
+ </xsl:attribute>
+ </img>
+ </td>
+ </xsl:if>
+</xsl:template>
+
+<!-- ====================================================================== -->
+
+<xsl:template match="@*" mode="copy">
+ <xsl:attribute name="{local-name(.)}">
+ <xsl:value-of select="."/>
+ </xsl:attribute>
+</xsl:template>
+
+<xsl:template xmlns:html="http://www.w3.org/1999/xhtml" match="html:*">
+ <xsl:element name="{local-name(.)}" namespace="http://www.w3.org/1999/xhtml">
+ <xsl:apply-templates select="@*" mode="copy"/>
+ <xsl:apply-templates/>
+ </xsl:element>
+</xsl:template>
+
+<!-- ====================================================================== -->
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/xhtml/flat.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/xhtml/flat.xsl
new file mode 100644
index 0000000..e0c57e9
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/xhtml/flat.xsl
@@ -0,0 +1,71 @@
+<?xml version="1.0" encoding="ASCII"?>
+<!--This file was created automatically by html2xhtml-->
+<!--from the HTML stylesheets.-->
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1999/xhtml" version="1.0">
+
+<xsl:import href="slides-common.xsl"/>
+
+<xsl:template match="/">
+ <html>
+ <head>
+ <title><xsl:value-of select="/slides/slidesinfo/title"/></title>
+ </head>
+ <body>
+ <xsl:apply-templates/>
+ </body>
+ </html>
+</xsl:template>
+
+<xsl:template match="slidesinfo">
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+
+ <div id="{$id}" class="titlepage">
+ <div class="titlepage-body">
+ <xsl:call-template name="titlepage-body"/>
+ </div>
+ </div>
+</xsl:template>
+
+<xsl:template match="slides" mode="toc">
+ <!-- nop -->
+</xsl:template>
+
+<xsl:template match="foil">
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+
+ <div class="{name(.)}" id="{$id}">
+ <div class="foil-body">
+ <xsl:call-template name="foil-body"/>
+ </div>
+ <xsl:call-template name="process.footnotes"/>
+ </div>
+</xsl:template>
+
+<xsl:template match="foilgroup">
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+
+ <div class="{name(.)}" id="{$id}">
+ <div class="foilgroup-body">
+ <xsl:call-template name="foilgroup-body"/>
+ </div>
+ <xsl:call-template name="process.footnotes"/>
+ </div>
+
+ <xsl:apply-templates select="foil"/>
+</xsl:template>
+
+<xsl:template match="author" mode="titlepage.mode">
+ <div class="{name(.)}">
+ <h2 class="{name(.)}"><xsl:call-template name="person.name"/></h2>
+ <xsl:apply-templates mode="titlepage.mode" select="./contrib"/>
+ <xsl:apply-templates mode="titlepage.mode" select="./affiliation"/>
+ </div>
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/xhtml/frames.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/xhtml/frames.xsl
new file mode 100644
index 0000000..aea4172
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/xhtml/frames.xsl
@@ -0,0 +1,1982 @@
+<?xml version="1.0" encoding="ASCII"?>
+<!--This file was created automatically by html2xhtml-->
+<!--from the HTML stylesheets.-->
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1999/xhtml" version="1.0">
+
+<xsl:import href="slides-common.xsl"/>
+
+<xsl:param name="titlefoil.html" select="concat('titlepg', $html.ext)"/>
+
+<xsl:param name="css.stylesheet" select="'slides-frames.css'"/>
+
+<!-- ====================================================================== -->
+
+<xsl:template name="doctype-public">
+ <xsl:param name="frameset" select="0"/>
+ <xsl:choose>
+ <xsl:when test="$stylesheet.result.type='html'">
+ <xsl:choose>
+ <!-- Assume when chunker.output.doctype-public is set the user
+ wants to have doctypes written out. If frameset is set
+ then overide with a frameset public identifier. -->
+ <xsl:when test="$chunker.output.doctype-public != '' and $frameset != 0">
+ <xsl:text>-//W3C//DTD HTML 4.01 Frameset//EN</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$chunker.output.doctype-public"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:when test="$stylesheet.result.type='xhtml'">
+ <xsl:choose>
+ <xsl:when test="$frameset != 0">
+ <xsl:text>-//W3C//DTD XHTML 1.0 Frameset//EN</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text>-//W3C//DTD XHTML 1.0 Transitional//EN</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="doctype-system">
+ <xsl:param name="frameset" select="0"/>
+ <xsl:choose>
+ <xsl:when test="$stylesheet.result.type='html'">
+ <xsl:choose>
+ <!-- Assume when chunker.output.doctype-system is set the user
+ wants to have doctypes written out. If frameset is set
+ then overide with a frameset system identifier. -->
+ <xsl:when test="$chunker.output.doctype-system != '' and $frameset != 0">
+ <xsl:text>http://www.w3.org/TR/html4/loose.dtd</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$chunker.output.doctype-system"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:when test="$stylesheet.result.type='xhtml'">
+ <xsl:choose>
+ <xsl:when test="$frameset != 0">
+ <xsl:text>http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text>http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ====================================================================== -->
+
+<xsl:template match="slides">
+ <xsl:variable name="title">
+ <xsl:choose>
+ <xsl:when test="(slidesinfo/titleabbrev|titleabbrev)">
+ <xsl:value-of select="(slidesinfo/titleabbrev|titleabbrev)[1]"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="(slidesinfo/title|title)[1]"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:variable name="toc.rows" select="1+count(//foilgroup)+count(//foil)"/>
+ <xsl:variable name="toc.height" select="$toc.rows * $toc.row.height"/>
+
+ <xsl:if test="$overlay != 0 and $multiframe != 0">
+ <xsl:message terminate="yes">
+ <xsl:text>Multiframe and overlay are mutually exclusive.</xsl:text>
+ </xsl:message>
+ </xsl:if>
+
+ <xsl:variable name="doctype-public">
+ <xsl:call-template name="doctype-public">
+ <xsl:with-param name="frameset" select="1"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:variable name="doctype-system">
+ <xsl:call-template name="doctype-system">
+ <xsl:with-param name="frameset" select="1"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:call-template name="write.chunk">
+ <xsl:with-param name="indent" select="$output.indent"/>
+ <xsl:with-param name="doctype-public" select="$doctype-public"/>
+ <xsl:with-param name="doctype-system" select="$doctype-system"/>
+ <xsl:with-param name="filename" select="concat($base.dir,'frames', $html.ext)"/>
+ <xsl:with-param name="content">
+ <html>
+ <head>
+ <title><xsl:value-of select="$title"/></title>
+ </head>
+ <frameset cols="{$toc.width},*" id="topframe">
+ <frame src="{concat('toc', $html.ext)}" name="toc" id="toc" frameborder="1"/>
+ <frame src="{$titlefoil.html}" name="foil" id="foil"/>
+ <noframes>
+ <body class="frameset">
+ <xsl:call-template name="body.attributes"/>
+ <a href="{concat('titleframe', $html.ext)}">
+ <xsl:text>Your browser doesn't support frames.</xsl:text>
+ </a>
+ </body>
+ </noframes>
+ </frameset>
+ </html>
+ </xsl:with-param>
+ </xsl:call-template>
+
+ <xsl:call-template name="write.chunk">
+ <xsl:with-param name="indent" select="$output.indent"/>
+ <xsl:with-param name="filename" select="concat($base.dir,'toc',$html.ext)"/>
+ <xsl:with-param name="content">
+ <html>
+ <head>
+ <title>TOC - <xsl:value-of select="$title"/></title>
+ <xsl:call-template name="system.head.content"/>
+ <meta name="generator" content="DocBook Slides Stylesheets V{$VERSION}"/>
+ <xsl:if test="$css.stylesheet != ''">
+ <link type="text/css" rel="stylesheet">
+ <xsl:attribute name="href">
+ <xsl:call-template name="css.stylesheet"/>
+ </xsl:attribute>
+ </link>
+ </xsl:if>
+ <xsl:apply-templates select="/processing-instruction('dbhtml')" mode="css.pi"/>
+
+ <xsl:if test="$overlay != 0 or $keyboard.nav != 0 or $dynamic.toc != 0 or $active.toc != 0 or $overlay.logo != ''">
+ <script language="javascript" type="text/javascript">
+ <xsl:text> </xsl:text>
+ </script>
+ </xsl:if>
+
+ <xsl:if test="$keyboard.nav != 0 or $dynamic.toc != 0 or $active.toc != 0">
+ <xsl:call-template name="ua.js"/>
+ <xsl:call-template name="xbDOM.js">
+ <xsl:with-param name="language" select="'javascript'"/>
+ </xsl:call-template>
+ <xsl:call-template name="xbLibrary.js"/>
+ <script language="javascript" type="text/javascript">
+ <xsl:text disable-output-escaping="yes">
+ &lt;!--
+ xblibrary = new xbLibrary('</xsl:text>
+ <xsl:call-template name="script-dir"/>
+ <xsl:text disable-output-escaping="yes">');
+ // --&gt;
+ </xsl:text>
+ </script>
+ <xsl:call-template name="xbStyle.js"/>
+ <xsl:call-template name="xbCollapsibleLists.js"/>
+ <xsl:call-template name="slides.js">
+ <xsl:with-param name="language" select="'javascript'"/>
+ </xsl:call-template>
+ </xsl:if>
+
+ <xsl:if test="$overlay != '0' or $overlay.logo != ''">
+ <xsl:call-template name="overlay.js">
+ <xsl:with-param name="language" select="'javascript'"/>
+ </xsl:call-template>
+ </xsl:if>
+
+ <xsl:if test="$dynamic.toc != 0">
+ <script language="javascript" type="text/javascript">
+ <xsl:text disable-output-escaping="yes">
+ &lt;!--
+function init() {
+ var width = </xsl:text>
+<xsl:value-of select="$toc.width"/>
+<xsl:text>, height = </xsl:text>
+<xsl:value-of select="$toc.row.height"/>
+<xsl:text>;
+ myList = new List(true, width, height, "</xsl:text>
+<xsl:value-of select="$toc.bg.color"/>
+<xsl:text>","</xsl:text>
+<xsl:call-template name="plus.image"/>
+<xsl:text>","</xsl:text>
+<xsl:call-template name="minus.image"/>
+<xsl:text>");
+</xsl:text>
+<xsl:apply-templates mode="ns-toc"/>
+ <xsl:text disable-output-escaping="yes">
+ myList.build(0,0);
+}
+ // --&gt;
+</xsl:text>
+ </script>
+ <style type="text/css">
+ <xsl:text>#spacer { position: absolute; height: </xsl:text>
+ <xsl:value-of select="$toc.height"/>
+ <xsl:text>; }
+</xsl:text>
+ </style>
+ </xsl:if>
+
+ <xsl:call-template name="user.head.content"/>
+ </head>
+ <body class="toc">
+ <xsl:call-template name="body.attributes"/>
+
+ <xsl:if test="$overlay.logo != ''">
+ <xsl:attribute name="onload">
+ <xsl:text>overlaySetup('ll');</xsl:text>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:if test="$dynamic.toc != 0">
+ <xsl:attribute name="onload">
+ <xsl:text>init(</xsl:text>
+ <xsl:value-of select="$overlay"/>
+ <xsl:text>);</xsl:text>
+ <xsl:if test="$overlay.logo != ''">
+ <xsl:text>overlaySetup('ll');</xsl:text>
+ </xsl:if>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:choose>
+ <xsl:when test="$dynamic.toc = 0">
+ <div class="toc">
+ <xsl:apply-templates mode="toc"/>
+ </div>
+ </xsl:when>
+ <xsl:otherwise>
+ <div id="spacer"/>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:if test="$overlay.logo != ''">
+ <div style="position: absolute; visibility: visible;" id="overlayDiv">
+ <img src="{$overlay.logo}" alt="logo" vspace="20"/>
+ </div>
+ </xsl:if>
+ </body>
+ </html>
+ </xsl:with-param>
+ </xsl:call-template>
+
+ <xsl:apply-templates/>
+</xsl:template>
+
+<!-- ====================================================================== -->
+
+<xsl:template match="slidesinfo">
+ <xsl:variable name="next" select="(following::foil |following::foilgroup)[1]"/>
+
+ <xsl:variable name="doctype-public">
+ <xsl:call-template name="doctype-public">
+ <xsl:with-param name="frameset" select="$multiframe"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="doctype-system">
+ <xsl:call-template name="doctype-system">
+ <xsl:with-param name="frameset" select="$multiframe"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:call-template name="write.chunk">
+ <xsl:with-param name="indent" select="$output.indent"/>
+ <xsl:with-param name="doctype-public" select="$doctype-public"/>
+ <xsl:with-param name="doctype-system" select="$doctype-system"/>
+ <xsl:with-param name="filename" select="concat($base.dir,$titlefoil.html)"/>
+ <xsl:with-param name="content">
+ <html>
+ <head>
+ <title><xsl:value-of select="title"/></title>
+
+ <xsl:call-template name="system.head.content">
+ <xsl:with-param name="node" select=".."/>
+ </xsl:call-template>
+
+ <meta name="generator" content="DocBook Slides Stylesheets V{$VERSION}"/>
+
+ <xsl:if test="$css.stylesheet != ''">
+ <link type="text/css" rel="stylesheet">
+ <xsl:attribute name="href">
+ <xsl:call-template name="css.stylesheet"/>
+ </xsl:attribute>
+ </link>
+ </xsl:if>
+ <xsl:apply-templates select="/processing-instruction('dbhtml')" mode="css.pi"/>
+
+ <xsl:call-template name="links">
+ <xsl:with-param name="next" select="$next"/>
+ </xsl:call-template>
+
+ <xsl:if test="$overlay != 0 or $keyboard.nav != 0 or $dynamic.toc != 0 or $active.toc != 0">
+ <script language="javascript" type="text/javascript">
+ <xsl:text> </xsl:text>
+ </script>
+ </xsl:if>
+
+ <xsl:if test="$keyboard.nav != 0 or $dynamic.toc != 0 or $active.toc != 0">
+ <xsl:call-template name="ua.js"/>
+ <xsl:call-template name="xbDOM.js">
+ <xsl:with-param name="language" select="'javascript'"/>
+ </xsl:call-template>
+ <xsl:call-template name="xbLibrary.js"/>
+ <script language="javascript" type="text/javascript">
+ <xsl:text disable-output-escaping="yes">
+ &lt;!--
+ xblibrary = new xbLibrary('</xsl:text>
+ <xsl:call-template name="script-dir"/>
+ <xsl:text disable-output-escaping="yes">');
+ // --&gt;
+ </xsl:text>
+ </script>
+ <xsl:call-template name="xbStyle.js"/>
+ <xsl:call-template name="xbCollapsibleLists.js"/>
+ <xsl:call-template name="slides.js">
+ <xsl:with-param name="language" select="'javascript'"/>
+ </xsl:call-template>
+ </xsl:if>
+
+ <xsl:if test="$overlay != '0'">
+ <xsl:call-template name="overlay.js">
+ <xsl:with-param name="language" select="'javascript'"/>
+ </xsl:call-template>
+ </xsl:if>
+
+ <xsl:call-template name="user.head.content">
+ <xsl:with-param name="node" select=".."/>
+ </xsl:call-template>
+ </head>
+ <xsl:choose>
+ <xsl:when test="$multiframe != 0">
+ <xsl:apply-templates select="." mode="multiframe"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="." mode="singleframe"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </html>
+ </xsl:with-param>
+ </xsl:call-template>
+
+ <xsl:if test="$multiframe != 0">
+ <xsl:apply-templates select="." mode="multiframe-top"/>
+ <xsl:apply-templates select="." mode="multiframe-body"/>
+ <xsl:apply-templates select="." mode="multiframe-bottom"/>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="slidesinfo" mode="multiframe">
+ <xsl:variable name="thisfoil">
+ <xsl:value-of select="$titlefoil.html"/>
+ </xsl:variable>
+
+ <frameset rows="{$multiframe.navigation.height},*,{$multiframe.navigation.height}" id="foil">
+ <xsl:attribute name="onload">
+ <xsl:text>javascript:body.focus()</xsl:text>
+ </xsl:attribute>
+ <frame src="top-{$thisfoil}" name="top" id="top" marginheight="0" frameborder="0">
+ </frame>
+ <frame src="body-{$thisfoil}" name="body" id="body" marginheight="0" frameborder="0">
+ </frame>
+ <frame src="bot-{$thisfoil}" name="bottom" id="bottom" marginheight="0" frameborder="0">
+ </frame>
+ <noframes>
+ <body class="frameset">
+ <xsl:call-template name="body.attributes"/>
+ <p>
+ <xsl:text>Your browser doesn't support frames.</xsl:text>
+ </p>
+ </body>
+ </noframes>
+ </frameset>
+</xsl:template>
+
+<xsl:template match="slidesinfo" mode="multiframe-top">
+ <xsl:variable name="thisfoil">
+ <xsl:value-of select="$titlefoil.html"/>
+ </xsl:variable>
+
+ <xsl:variable name="next" select="(following::foil |following::foilgroup)[1]"/>
+
+ <xsl:call-template name="write.chunk">
+ <xsl:with-param name="indent" select="$output.indent"/>
+ <xsl:with-param name="filename" select="concat($base.dir,'top-',$thisfoil)"/>
+ <xsl:with-param name="content">
+ <html>
+ <head>
+ <title>Navigation</title>
+
+ <xsl:call-template name="system.head.content">
+ <xsl:with-param name="node" select=".."/>
+ </xsl:call-template>
+
+ <meta name="generator" content="DocBook Slides Stylesheets V{$VERSION}"/>
+
+ <xsl:if test="$css.stylesheet != ''">
+ <link type="text/css" rel="stylesheet">
+ <xsl:attribute name="href">
+ <xsl:call-template name="css.stylesheet"/>
+ </xsl:attribute>
+ </link>
+ </xsl:if>
+ <xsl:apply-templates select="/processing-instruction('dbhtml')" mode="css.pi"/>
+
+ <xsl:call-template name="links">
+ <xsl:with-param name="next" select="$next"/>
+ </xsl:call-template>
+
+ <xsl:if test="$overlay != 0 or $keyboard.nav != 0 or $dynamic.toc != 0 or $active.toc != 0">
+ <script language="javascript" type="text/javascript">
+ <xsl:text> </xsl:text>
+ </script>
+ </xsl:if>
+
+ <xsl:if test="$keyboard.nav != 0 or $dynamic.toc != 0 or $active.toc != 0">
+ <xsl:call-template name="ua.js"/>
+ <xsl:call-template name="xbDOM.js">
+ <xsl:with-param name="language" select="'javascript'"/>
+ </xsl:call-template>
+ <xsl:call-template name="xbLibrary.js"/>
+ <script language="javascript" type="text/javascript">
+ <xsl:text disable-output-escaping="yes">
+ &lt;!--
+ xblibrary = new xbLibrary('</xsl:text>
+ <xsl:call-template name="script-dir"/>
+ <xsl:text disable-output-escaping="yes">');
+ // --&gt;
+ </xsl:text>
+ </script>
+ <xsl:call-template name="xbStyle.js"/>
+ <xsl:call-template name="xbCollapsibleLists.js"/>
+ <xsl:call-template name="slides.js">
+ <xsl:with-param name="language" select="'javascript'"/>
+ </xsl:call-template>
+ </xsl:if>
+
+ <xsl:if test="$overlay != '0' or $overlay.logo != ''">
+ <xsl:call-template name="overlay.js">
+ <xsl:with-param name="language" select="'javascript'"/>
+ </xsl:call-template>
+ </xsl:if>
+
+ <xsl:call-template name="user.head.content">
+ <xsl:with-param name="node" select=".."/>
+ </xsl:call-template>
+ </head>
+ <body class="topnavigation" bgcolor="{$multiframe.top.bgcolor}">
+ <xsl:call-template name="foil-top-nav">
+ <xsl:with-param name="next" select="$next"/>
+ </xsl:call-template>
+ </body>
+ </html>
+ </xsl:with-param>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="slidesinfo" mode="multiframe-body">
+ <xsl:variable name="thisfoil">
+ <xsl:value-of select="$titlefoil.html"/>
+ </xsl:variable>
+
+ <xsl:variable name="next" select="(following::foil |following::foilgroup)[1]"/>
+
+ <xsl:call-template name="write.chunk">
+ <xsl:with-param name="indent" select="$output.indent"/>
+ <xsl:with-param name="filename" select="concat($base.dir,'body-',$thisfoil)"/>
+ <xsl:with-param name="content">
+ <html>
+ <head>
+ <title>Body</title>
+
+ <xsl:call-template name="system.head.content">
+ <xsl:with-param name="node" select=".."/>
+ </xsl:call-template>
+
+ <meta name="generator" content="DocBook Slides Stylesheets V{$VERSION}"/>
+
+ <xsl:if test="$css.stylesheet != ''">
+ <link type="text/css" rel="stylesheet">
+ <xsl:attribute name="href">
+ <xsl:call-template name="css.stylesheet"/>
+ </xsl:attribute>
+ </link>
+ </xsl:if>
+ <xsl:apply-templates select="/processing-instruction('dbhtml')" mode="css.pi"/>
+
+ <xsl:call-template name="links">
+ <xsl:with-param name="next" select="$next"/>
+ </xsl:call-template>
+
+ <xsl:if test="$overlay != 0 or $keyboard.nav != 0 or $dynamic.toc != 0 or $active.toc != 0">
+ <script language="javascript" type="text/javascript">
+ <xsl:text> </xsl:text>
+ </script>
+ </xsl:if>
+
+ <xsl:if test="$keyboard.nav != 0 or $dynamic.toc != 0 or $active.toc != 0">
+ <xsl:call-template name="ua.js"/>
+ <xsl:call-template name="xbDOM.js">
+ <xsl:with-param name="language" select="'javascript'"/>
+ </xsl:call-template>
+ <xsl:call-template name="xbLibrary.js"/>
+ <script language="javascript" type="text/javascript">
+ <xsl:text disable-output-escaping="yes">
+ &lt;!--
+ xblibrary = new xbLibrary('</xsl:text>
+ <xsl:call-template name="script-dir"/>
+ <xsl:text disable-output-escaping="yes">');
+ // --&gt;
+ </xsl:text>
+ </script>
+ <xsl:call-template name="xbStyle.js"/>
+ <xsl:call-template name="xbCollapsibleLists.js"/>
+ <xsl:call-template name="slides.js">
+ <xsl:with-param name="language" select="'javascript'"/>
+ </xsl:call-template>
+ </xsl:if>
+
+ <xsl:call-template name="user.head.content">
+ <xsl:with-param name="node" select=".."/>
+ </xsl:call-template>
+ </head>
+ <xsl:apply-templates select="." mode="singleframe"/>
+ </html>
+ </xsl:with-param>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="slidesinfo" mode="multiframe-bottom">
+ <xsl:variable name="thisfoil">
+ <xsl:value-of select="$titlefoil.html"/>
+ </xsl:variable>
+
+ <xsl:variable name="next" select="(following::foil |following::foilgroup)[1]"/>
+
+ <xsl:call-template name="write.chunk">
+ <xsl:with-param name="indent" select="$output.indent"/>
+ <xsl:with-param name="filename" select="concat($base.dir,'bot-',$thisfoil)"/>
+ <xsl:with-param name="content">
+ <html>
+ <head>
+ <title>Navigation</title>
+
+ <xsl:call-template name="system.head.content">
+ <xsl:with-param name="node" select=".."/>
+ </xsl:call-template>
+
+ <meta name="generator" content="DocBook Slides Stylesheets V{$VERSION}"/>
+
+ <xsl:if test="$css.stylesheet != ''">
+ <link type="text/css" rel="stylesheet">
+ <xsl:attribute name="href">
+ <xsl:call-template name="css.stylesheet"/>
+ </xsl:attribute>
+ </link>
+ </xsl:if>
+ <xsl:apply-templates select="/processing-instruction('dbhtml')" mode="css.pi"/>
+
+ <xsl:call-template name="links">
+ <xsl:with-param name="next" select="$next"/>
+ </xsl:call-template>
+
+ <xsl:if test="$overlay != 0 or $keyboard.nav != 0 or $dynamic.toc != 0 or $active.toc != 0">
+ <script language="javascript" type="text/javascript">
+ <xsl:text> </xsl:text>
+ </script>
+ </xsl:if>
+
+ <xsl:if test="$keyboard.nav != 0 or $dynamic.toc != 0 or $active.toc != 0">
+ <xsl:call-template name="ua.js"/>
+ <xsl:call-template name="xbDOM.js">
+ <xsl:with-param name="language" select="'javascript'"/>
+ </xsl:call-template>
+ <xsl:call-template name="xbLibrary.js"/>
+ <script language="javascript" type="text/javascript">
+ <xsl:text disable-output-escaping="yes">
+ &lt;!--
+ xblibrary = new xbLibrary('</xsl:text>
+ <xsl:call-template name="script-dir"/>
+ <xsl:text disable-output-escaping="yes">');
+ // --&gt;
+ </xsl:text>
+ </script>
+ <xsl:call-template name="xbStyle.js"/>
+ <xsl:call-template name="xbCollapsibleLists.js"/>
+ <xsl:call-template name="slides.js">
+ <xsl:with-param name="language" select="'javascript'"/>
+ </xsl:call-template>
+ </xsl:if>
+
+ <xsl:if test="$overlay != '0'">
+ <xsl:call-template name="overlay.js">
+ <xsl:with-param name="language" select="'javascript'"/>
+ </xsl:call-template>
+ </xsl:if>
+
+ <xsl:call-template name="user.head.content">
+ <xsl:with-param name="node" select=".."/>
+ </xsl:call-template>
+ </head>
+ <body class="botnavigation" bgcolor="{$multiframe.bottom.bgcolor}">
+ <xsl:call-template name="foil-bottom-nav">
+ <xsl:with-param name="next" select="$next"/>
+ </xsl:call-template>
+ </body>
+ </html>
+ </xsl:with-param>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="slidesinfo" mode="singleframe">
+ <xsl:param name="thisfoil">
+ <xsl:value-of select="$titlefoil.html"/>
+ </xsl:param>
+
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+
+ <xsl:variable name="next" select="(following::foil |following::foilgroup)[1]"/>
+
+ <body class="titlepage">
+ <xsl:call-template name="body.attributes"/>
+ <xsl:choose>
+ <xsl:when test="$active.toc != 0">
+ <xsl:attribute name="onload">
+ <xsl:text>newPage('</xsl:text>
+ <xsl:value-of select="$titlefoil.html"/>
+ <xsl:text>',</xsl:text>
+ <xsl:value-of select="$overlay"/>
+ <xsl:text>);</xsl:text>
+ </xsl:attribute>
+ </xsl:when>
+ <xsl:when test="$overlay != 0">
+ <xsl:attribute name="onload">
+ <xsl:text>overlaySetup('lc');</xsl:text>
+ </xsl:attribute>
+ </xsl:when>
+ </xsl:choose>
+
+ <xsl:if test="$keyboard.nav != 0">
+ <xsl:attribute name="onload">
+ <xsl:text>this.focus()</xsl:text>
+ </xsl:attribute>
+ <xsl:attribute name="onkeypress">
+ <xsl:text>navigate(event)</xsl:text>
+ </xsl:attribute>
+ </xsl:if>
+
+ <div class="{name(.)}">
+ <xsl:apply-templates mode="titlepage.mode"/>
+ </div>
+
+ <xsl:if test="$multiframe=0">
+ <div id="overlayDiv" class="navfoot">
+ <xsl:choose>
+ <xsl:when test="$overlay != 0">
+ <xsl:attribute name="style">
+ <xsl:text>position:absolute;visibility:visible;</xsl:text>
+ </xsl:attribute>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:attribute name="style">
+ <xsl:text>padding-top: 2in;</xsl:text>
+ </xsl:attribute>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <table width="100%" border="0" cellspacing="0" cellpadding="0" summary="Navigation">
+ <tr>
+ <td align="left" width="80%" valign="top">
+ <span class="navfooter">
+ <!-- suppress copyright here; it's probably already on the titlepage
+ <xsl:apply-templates select="/slides/slidesinfo/copyright"
+ mode="slide.footer.mode"/>
+ -->
+ <xsl:text>&#160;</xsl:text>
+ </span>
+ </td>
+ <td align="right" width="20%" valign="top">
+ <a>
+ <xsl:attribute name="href">
+ <xsl:apply-templates select="$next" mode="filename"/>
+ </xsl:attribute>
+ <img alt="{$text.next}" border="0">
+ <xsl:attribute name="src">
+ <xsl:call-template name="next.image"/>
+ </xsl:attribute>
+ </img>
+ </a>
+ </td>
+ </tr>
+ </table>
+ </div>
+ </xsl:if>
+ </body>
+</xsl:template>
+
+<!-- ====================================================================== -->
+
+<xsl:template name="top-nav">
+ <xsl:param name="home"/>
+ <xsl:param name="up"/>
+ <xsl:param name="next"/>
+ <xsl:param name="prev"/>
+ <xsl:param name="tocfile" select="$toc.html"/>
+
+ <div class="navhead">
+ <table border="0" width="100%" cellspacing="0" cellpadding="0" summary="Navigation table">
+ <tr>
+ <td align="left" valign="bottom" width="10%">
+ <xsl:choose>
+ <xsl:when test="$prev">
+ <span class="link-text">
+ <a>
+ <xsl:attribute name="href">
+ <xsl:apply-templates select="$prev" mode="filename"/>
+ </xsl:attribute>
+ <xsl:if test="$multiframe != 0">
+ <xsl:attribute name="target">foil</xsl:attribute>
+ </xsl:if>
+ <img alt="{$text.prev}" border="0">
+ <xsl:attribute name="src">
+ <xsl:call-template name="prev.image"/>
+ </xsl:attribute>
+ </img>
+ </a>
+ </span>
+ </xsl:when>
+ <xsl:otherwise>
+ <span class="no-link-text">&#160;</span>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:text>&#160;</xsl:text>
+ </td>
+ <td width="80%" align="center" valign="bottom">
+ <xsl:call-template name="foil.number"/>
+ </td>
+ <td align="right" valign="bottom" width="10%">
+ <xsl:choose>
+ <xsl:when test="$next">
+ <span class="link-text">
+ <a>
+ <xsl:attribute name="href">
+ <xsl:apply-templates select="$next" mode="filename"/>
+ </xsl:attribute>
+ <xsl:if test="$multiframe != 0">
+ <xsl:attribute name="target">foil</xsl:attribute>
+ </xsl:if>
+ <img alt="{$text.next}" border="0">
+ <xsl:attribute name="src">
+ <xsl:call-template name="next.image"/>
+ </xsl:attribute>
+ </img>
+ </a>
+ </span>
+ </xsl:when>
+ <xsl:otherwise>
+ <span class="no-link-text">&#160;</span>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:text>&#160;</xsl:text>
+ </td>
+ </tr>
+ </table>
+ <hr class="top-nav-sep"/>
+ </div>
+</xsl:template>
+
+<xsl:template name="bottom-nav">
+ <xsl:param name="home"/>
+ <xsl:param name="up"/>
+ <xsl:param name="next"/>
+ <xsl:param name="prev"/>
+ <xsl:param name="tocfile" select="$toc.html"/>
+
+ <div class="navfoot">
+ <hr class="bottom-nav-sep"/>
+ <table border="0" width="100%" cellspacing="0" cellpadding="0" summary="Navigation table">
+ <tr>
+ <td align="left" valign="top">
+ <xsl:apply-templates select="/slides/slidesinfo/copyright" mode="slide.footer.mode"/>
+ <xsl:text>&#160;</xsl:text>
+ </td>
+
+ <td align="right" valign="top">
+ <xsl:choose>
+ <xsl:when test="$prev">
+ <span class="link-text">
+ <a>
+ <xsl:attribute name="href">
+ <xsl:apply-templates select="$prev" mode="filename"/>
+ </xsl:attribute>
+ <xsl:if test="$multiframe != 0">
+ <xsl:attribute name="target">foil</xsl:attribute>
+ </xsl:if>
+ <img alt="{$text.prev}" border="0">
+ <xsl:attribute name="src">
+ <xsl:call-template name="prev.image"/>
+ </xsl:attribute>
+ </img>
+ </a>
+ </span>
+ </xsl:when>
+ <xsl:otherwise>
+ <span class="no-link-text">&#160;</span>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:text>&#160;</xsl:text>
+
+ <xsl:choose>
+ <xsl:when test="$next">
+ <span class="link-text">
+ <a>
+ <xsl:attribute name="href">
+ <xsl:apply-templates select="$next" mode="filename"/>
+ </xsl:attribute>
+ <xsl:if test="$multiframe != 0">
+ <xsl:attribute name="target">foil</xsl:attribute>
+ </xsl:if>
+ <img alt="{$text.next}" border="0">
+ <xsl:attribute name="src">
+ <xsl:call-template name="next.image"/>
+ </xsl:attribute>
+ </img>
+ </a>
+ </span>
+ </xsl:when>
+ <xsl:otherwise>
+ <span class="no-link-text">&#160;</span>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:text>&#160;</xsl:text>
+ </td>
+ </tr>
+ </table>
+ </div>
+</xsl:template>
+
+<!-- ====================================================================== -->
+
+<xsl:template match="foilgroup">
+ <xsl:param name="thisfoilgroup">
+ <xsl:apply-templates select="." mode="filename"/>
+ </xsl:param>
+
+ <xsl:variable name="doctype-public">
+ <xsl:call-template name="doctype-public">
+ <xsl:with-param name="frameset" select="$multiframe"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="doctype-system">
+ <xsl:call-template name="doctype-system">
+ <xsl:with-param name="frameset" select="$multiframe"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="home" select="/slides"/>
+ <xsl:variable name="up" select="(parent::slides|parent::foilgroup)[1]"/>
+ <xsl:variable name="next" select="foil[1]"/>
+ <xsl:variable name="prev" select="(preceding::foil|parent::foilgroup|/slides)[last()]"/>
+ <xsl:call-template name="write.chunk">
+ <xsl:with-param name="indent" select="$output.indent"/>
+ <xsl:with-param name="doctype-public" select="$doctype-public"/>
+ <xsl:with-param name="doctype-system" select="$doctype-system"/>
+ <xsl:with-param name="filename" select="concat($base.dir,$thisfoilgroup)"/>
+ <xsl:with-param name="content">
+ <html>
+ <head>
+ <title><xsl:value-of select="title"/></title>
+
+ <xsl:call-template name="system.head.content"/>
+
+ <meta name="generator" content="DocBook Slides Stylesheets V{$VERSION}"/>
+
+ <xsl:if test="$css.stylesheet != ''">
+ <link type="text/css" rel="stylesheet">
+ <xsl:attribute name="href">
+ <xsl:call-template name="css.stylesheet"/>
+ </xsl:attribute>
+ </link>
+ </xsl:if>
+ <xsl:apply-templates select="/processing-instruction('dbhtml')" mode="css.pi"/>
+
+ <xsl:call-template name="links">
+ <xsl:with-param name="home" select="$home"/>
+ <xsl:with-param name="up" select="$up"/>
+ <xsl:with-param name="next" select="$next"/>
+ <xsl:with-param name="prev" select="$prev"/>
+ </xsl:call-template>
+
+ <xsl:if test="$overlay != 0 or $keyboard.nav != 0 or $dynamic.toc != 0 or $active.toc != 0">
+ <script language="javascript" type="text/javascript">
+ <xsl:text> </xsl:text>
+ </script>
+ </xsl:if>
+
+ <xsl:if test="$keyboard.nav != 0 or $dynamic.toc != 0 or $active.toc != 0">
+ <xsl:call-template name="ua.js"/>
+ <xsl:call-template name="xbDOM.js">
+ <xsl:with-param name="language" select="'javascript'"/>
+ </xsl:call-template>
+ <xsl:call-template name="xbLibrary.js"/>
+ <script language="javascript" type="text/javascript">
+ <xsl:text disable-output-escaping="yes">
+ &lt;!--
+ xblibrary = new xbLibrary('</xsl:text>
+ <xsl:call-template name="script-dir"/>
+ <xsl:text disable-output-escaping="yes">');
+ // --&gt;
+ </xsl:text>
+ </script>
+ <xsl:call-template name="xbStyle.js"/>
+ <xsl:call-template name="xbCollapsibleLists.js"/>
+ <xsl:call-template name="slides.js">
+ <xsl:with-param name="language" select="'javascript'"/>
+ </xsl:call-template>
+ </xsl:if>
+
+ <xsl:if test="$overlay != '0'">
+ <xsl:call-template name="overlay.js">
+ <xsl:with-param name="language" select="'javascript'"/>
+ </xsl:call-template>
+ </xsl:if>
+
+ <xsl:call-template name="user.head.content"/>
+ </head>
+ <xsl:choose>
+ <xsl:when test="$multiframe != 0">
+ <xsl:apply-templates select="." mode="multiframe"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="." mode="singleframe"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </html>
+ </xsl:with-param>
+ </xsl:call-template>
+
+ <xsl:if test="$multiframe != 0">
+ <xsl:apply-templates select="." mode="multiframe-top"/>
+ <xsl:apply-templates select="." mode="multiframe-body"/>
+ <xsl:apply-templates select="." mode="multiframe-bottom"/>
+ </xsl:if>
+
+ <xsl:apply-templates select="foil"/>
+</xsl:template>
+
+<xsl:template match="foilgroup" mode="multiframe">
+ <xsl:variable name="thisfoilgroup">
+ <xsl:text>foilgroup</xsl:text>
+ <xsl:number count="foilgroup" level="any" format="01"/>
+ <xsl:value-of select="$html.ext"/>
+ </xsl:variable>
+
+ <frameset rows="{$multiframe.navigation.height},*,{$multiframe.navigation.height}" id="foil">
+ <xsl:attribute name="onload">
+ <xsl:text>javascript:body.focus()</xsl:text>
+ </xsl:attribute>
+ <frame src="top-{$thisfoilgroup}" name="top" id="top" marginheight="0" frameborder="0"/>
+ <frame src="body-{$thisfoilgroup}" name="body" id="body" marginheight="0" frameborder="0"/>
+ <frame src="bot-{$thisfoilgroup}" name="bottom" id="bottom" marginheight="0" frameborder="0"/>
+ <noframes>
+ <body class="frameset">
+ <xsl:call-template name="body.attributes"/>
+ <p>
+ <xsl:text>Your browser doesn't support frames.</xsl:text>
+ </p>
+ </body>
+ </noframes>
+ </frameset>
+</xsl:template>
+
+<xsl:template match="foilgroup" mode="multiframe-top">
+ <xsl:variable name="foilgroup">
+ <xsl:text>foilgroup</xsl:text>
+ <xsl:number count="foilgroup" level="any" format="01"/>
+ <xsl:value-of select="$html.ext"/>
+ </xsl:variable>
+
+ <xsl:variable name="home" select="/slides"/>
+ <xsl:variable name="up" select="(parent::slides|parent::foilgroup)[1]"/>
+ <xsl:variable name="next" select="foil[1]"/>
+ <xsl:variable name="prev" select="(preceding::foil|parent::foilgroup|/slides)[last()]"/>
+
+ <xsl:call-template name="write.chunk">
+ <xsl:with-param name="indent" select="$output.indent"/>
+ <xsl:with-param name="filename" select="concat($base.dir,'top-',$foilgroup)"/>
+ <xsl:with-param name="content">
+ <html>
+ <head>
+ <title>Navigation</title>
+
+ <xsl:call-template name="system.head.content"/>
+
+ <meta name="generator" content="DocBook Slides Stylesheets V{$VERSION}"/>
+
+ <xsl:if test="$css.stylesheet != ''">
+ <link type="text/css" rel="stylesheet">
+ <xsl:attribute name="href">
+ <xsl:call-template name="css.stylesheet"/>
+ </xsl:attribute>
+ </link>
+ </xsl:if>
+ <xsl:apply-templates select="/processing-instruction('dbhtml')" mode="css.pi"/>
+
+ <xsl:call-template name="links">
+ <xsl:with-param name="home" select="$home"/>
+ <xsl:with-param name="up" select="$up"/>
+ <xsl:with-param name="next" select="$next"/>
+ <xsl:with-param name="prev" select="$prev"/>
+ </xsl:call-template>
+
+ <xsl:if test="$overlay != 0 or $keyboard.nav != 0 or $dynamic.toc != 0 or $active.toc != 0">
+ <script language="javascript" type="text/javascript">
+ <xsl:text> </xsl:text>
+ </script>
+ </xsl:if>
+
+ <xsl:if test="$keyboard.nav != 0 or $dynamic.toc != 0 or $active.toc != 0">
+ <xsl:call-template name="ua.js"/>
+ <xsl:call-template name="xbDOM.js">
+ <xsl:with-param name="language" select="'javascript'"/>
+ </xsl:call-template>
+ <xsl:call-template name="xbLibrary.js"/>
+ <xsl:call-template name="xbStyle.js"/>
+ <xsl:call-template name="xbCollapsibleLists.js"/>
+ <xsl:call-template name="slides.js">
+ <xsl:with-param name="language" select="'javascript'"/>
+ </xsl:call-template>
+ </xsl:if>
+
+ <xsl:if test="$overlay != '0'">
+ <xsl:call-template name="overlay.js">
+ <xsl:with-param name="language" select="'javascript'"/>
+ </xsl:call-template>
+ </xsl:if>
+
+ <xsl:call-template name="user.head.content"/>
+ </head>
+ <body class="topnavigation" bgcolor="{$multiframe.top.bgcolor}">
+ <xsl:call-template name="foilgroup-top-nav">
+ <xsl:with-param name="home" select="$home"/>
+ <xsl:with-param name="up" select="$up"/>
+ <xsl:with-param name="next" select="$next"/>
+ <xsl:with-param name="prev" select="$prev"/>
+ </xsl:call-template>
+ </body>
+ </html>
+ </xsl:with-param>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="foilgroup" mode="multiframe-body">
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+
+ <xsl:variable name="home" select="/slides"/>
+ <xsl:variable name="up" select="(parent::slides|parent::foilgroup)[1]"/>
+ <xsl:variable name="next" select="foil[1]"/>
+ <xsl:variable name="prev" select="(preceding::foil|parent::foilgroup|/slides)[last()]"/>
+
+ <xsl:variable name="thisfoilgroup">
+ <xsl:text>foilgroup</xsl:text>
+ <xsl:number count="foilgroup" level="any" format="01"/>
+ <xsl:value-of select="$html.ext"/>
+ </xsl:variable>
+
+ <xsl:call-template name="write.chunk">
+ <xsl:with-param name="indent" select="$output.indent"/>
+ <xsl:with-param name="filename" select="concat($base.dir,'body-',$thisfoilgroup)"/>
+ <xsl:with-param name="content">
+ <html>
+ <head>
+ <title>Body</title>
+
+ <xsl:call-template name="system.head.content"/>
+
+ <meta name="generator" content="DocBook Slides Stylesheets V{$VERSION}"/>
+
+ <xsl:if test="$css.stylesheet != ''">
+ <link type="text/css" rel="stylesheet">
+ <xsl:attribute name="href">
+ <xsl:call-template name="css.stylesheet"/>
+ </xsl:attribute>
+ </link>
+ </xsl:if>
+ <xsl:apply-templates select="/processing-instruction('dbhtml')" mode="css.pi"/>
+
+ <xsl:call-template name="links">
+ <xsl:with-param name="home" select="$home"/>
+ <xsl:with-param name="up" select="$up"/>
+ <xsl:with-param name="next" select="$next"/>
+ <xsl:with-param name="prev" select="$prev"/>
+ </xsl:call-template>
+
+ <xsl:if test="$overlay != 0 or $keyboard.nav != 0 or $dynamic.toc != 0 or $active.toc != 0">
+ <script language="javascript" type="text/javascript">
+ <xsl:text> </xsl:text>
+ </script>
+ </xsl:if>
+
+ <xsl:if test="$keyboard.nav != 0 or $dynamic.toc != 0 or $active.toc != 0">
+ <xsl:call-template name="ua.js"/>
+ <xsl:call-template name="xbDOM.js">
+ <xsl:with-param name="language" select="'javascript'"/>
+ </xsl:call-template>
+ <xsl:call-template name="xbLibrary.js"/>
+ <script language="javascript" type="text/javascript">
+ <xsl:text disable-output-escaping="yes">
+ &lt;!--
+ xblibrary = new xbLibrary('</xsl:text>
+ <xsl:call-template name="script-dir"/>
+ <xsl:text disable-output-escaping="yes">');
+ // --&gt;
+ </xsl:text>
+ </script>
+ <xsl:call-template name="xbStyle.js"/>
+ <xsl:call-template name="xbCollapsibleLists.js"/>
+ <xsl:call-template name="slides.js">
+ <xsl:with-param name="language" select="'javascript'"/>
+ </xsl:call-template>
+ </xsl:if>
+
+ <xsl:if test="$overlay != '0'">
+ <xsl:call-template name="overlay.js">
+ <xsl:with-param name="language" select="'javascript'"/>
+ </xsl:call-template>
+ </xsl:if>
+
+ <xsl:call-template name="user.head.content"/>
+ </head>
+ <xsl:apply-templates select="." mode="singleframe"/>
+ </html>
+ </xsl:with-param>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="foilgroup" mode="multiframe-bottom">
+ <xsl:variable name="thisfoilgroup">
+ <xsl:text>foilgroup</xsl:text>
+ <xsl:number count="foilgroup" level="any" format="01"/>
+ <xsl:value-of select="$html.ext"/>
+ </xsl:variable>
+
+ <xsl:variable name="home" select="/slides"/>
+ <xsl:variable name="up" select="(parent::slides|parent::foilgroup)[1]"/>
+ <xsl:variable name="next" select="foil[1]"/>
+ <xsl:variable name="prev" select="(preceding::foil|parent::foilgroup|/slides)[last()]"/>
+
+ <xsl:call-template name="write.chunk">
+ <xsl:with-param name="indent" select="$output.indent"/>
+ <xsl:with-param name="filename" select="concat($base.dir,'bot-',$thisfoilgroup)"/>
+ <xsl:with-param name="content">
+ <html>
+ <head>
+ <title>Navigation</title>
+
+ <xsl:call-template name="system.head.content"/>
+
+ <meta name="generator" content="DocBook Slides Stylesheets V{$VERSION}"/>
+
+ <xsl:if test="$css.stylesheet != ''">
+ <link type="text/css" rel="stylesheet">
+ <xsl:attribute name="href">
+ <xsl:call-template name="css.stylesheet"/>
+ </xsl:attribute>
+ </link>
+ </xsl:if>
+ <xsl:apply-templates select="/processing-instruction('dbhtml')" mode="css.pi"/>
+
+ <xsl:call-template name="links">
+ <xsl:with-param name="home" select="$home"/>
+ <xsl:with-param name="up" select="$up"/>
+ <xsl:with-param name="next" select="$next"/>
+ <xsl:with-param name="prev" select="$prev"/>
+ </xsl:call-template>
+
+ <xsl:if test="$overlay != 0 or $keyboard.nav != 0 or $dynamic.toc != 0 or $active.toc != 0">
+ <script language="javascript" type="text/javascript">
+ <xsl:text> </xsl:text>
+ </script>
+ </xsl:if>
+
+ <xsl:if test="$keyboard.nav != 0 or $dynamic.toc != 0 or $active.toc != 0">
+ <xsl:call-template name="ua.js"/>
+ <xsl:call-template name="xbDOM.js">
+ <xsl:with-param name="language" select="'javascript'"/>
+ </xsl:call-template>
+ <xsl:call-template name="xbLibrary.js"/>
+ <script language="javascript" type="text/javascript">
+ <xsl:text disable-output-escaping="yes">
+ &lt;!--
+ xblibrary = new xbLibrary('</xsl:text>
+ <xsl:call-template name="script-dir"/>
+ <xsl:text disable-output-escaping="yes">');
+ // --&gt;
+ </xsl:text>
+ </script>
+ <xsl:call-template name="xbStyle.js"/>
+ <xsl:call-template name="xbCollapsibleLists.js"/>
+ <xsl:call-template name="slides.js">
+ <xsl:with-param name="language" select="'javascript'"/>
+ </xsl:call-template>
+ </xsl:if>
+
+ <xsl:if test="$overlay != '0'">
+ <xsl:call-template name="overlay.js">
+ <xsl:with-param name="language" select="'javascript'"/>
+ </xsl:call-template>
+ </xsl:if>
+
+ <xsl:call-template name="user.head.content"/>
+ </head>
+ <body class="botnavigation" bgcolor="{$multiframe.bottom.bgcolor}">
+ <xsl:call-template name="foilgroup-bottom-nav">
+ <xsl:with-param name="home" select="$home"/>
+ <xsl:with-param name="up" select="$up"/>
+ <xsl:with-param name="next" select="$next"/>
+ <xsl:with-param name="prev" select="$prev"/>
+ </xsl:call-template>
+ </body>
+ </html>
+ </xsl:with-param>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="foilgroup" mode="singleframe">
+ <xsl:param name="thisfoilgroup">
+ <xsl:apply-templates select="." mode="filename"/>
+ </xsl:param>
+
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+
+ <xsl:variable name="home" select="/slides"/>
+ <xsl:variable name="up" select="(parent::slides|parent::foilgroup)[1]"/>
+ <xsl:variable name="next" select="foil[1]"/>
+ <xsl:variable name="prev" select="(preceding::foil|parent::foilgroup|/slides)[last()]"/>
+ <body class="foilgroup">
+ <xsl:call-template name="body.attributes"/>
+ <xsl:choose>
+ <xsl:when test="$active.toc != 0">
+ <xsl:attribute name="onload">
+ <xsl:text>newPage('</xsl:text>
+ <xsl:value-of select="$thisfoilgroup"/>
+ <xsl:text>',</xsl:text>
+ <xsl:value-of select="$overlay"/>
+ <xsl:text>);</xsl:text>
+ </xsl:attribute>
+ </xsl:when>
+ <xsl:when test="$overlay != 0">
+ <xsl:attribute name="onload">
+ <xsl:text>overlaySetup('lc');</xsl:text>
+ </xsl:attribute>
+ </xsl:when>
+ </xsl:choose>
+
+
+ <xsl:if test="$keyboard.nav != 0">
+ <xsl:attribute name="onkeypress">
+ <xsl:text>navigate(event)</xsl:text>
+ </xsl:attribute>
+ </xsl:if>
+
+ <div class="{name(.)}" id="{$id}">
+ <xsl:if test="$multiframe=0">
+ <xsl:call-template name="foilgroup-top-nav">
+ <xsl:with-param name="home" select="$home"/>
+ <xsl:with-param name="up" select="$up"/>
+ <xsl:with-param name="next" select="$next"/>
+ <xsl:with-param name="prev" select="$prev"/>
+ </xsl:call-template>
+ </xsl:if>
+
+ <div class="foilgroup-body" id="{$id}">
+ <xsl:call-template name="foilgroup-body">
+ <xsl:with-param name="home" select="$home"/>
+ <xsl:with-param name="up" select="$up"/>
+ <xsl:with-param name="next" select="$next"/>
+ <xsl:with-param name="prev" select="$prev"/>
+ </xsl:call-template>
+ </div>
+
+ <xsl:if test="$multiframe=0">
+ <div id="overlayDiv">
+ <xsl:if test="$overlay != 0">
+ <xsl:attribute name="style">
+ <xsl:text>position:absolute;visibility:visible;</xsl:text>
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:call-template name="foilgroup-bottom-nav">
+ <xsl:with-param name="home" select="$home"/>
+ <xsl:with-param name="up" select="$up"/>
+ <xsl:with-param name="next" select="$next"/>
+ <xsl:with-param name="prev" select="$prev"/>
+ </xsl:call-template>
+ </div>
+ </xsl:if>
+ </div>
+
+ <xsl:call-template name="process.footnotes"/>
+ </body>
+</xsl:template>
+
+<!-- ====================================================================== -->
+
+<xsl:template match="foil">
+ <xsl:variable name="thisfoil">
+ <xsl:apply-templates select="." mode="filename"/>
+ </xsl:variable>
+
+ <xsl:variable name="home" select="/slides"/>
+ <xsl:variable name="up" select="(parent::slides|parent::foilgroup)[1]"/>
+ <xsl:variable name="next" select="(following::foil |following::foilgroup)[1]"/>
+ <xsl:variable name="prev" select="(preceding-sibling::foil[1] |parent::foilgroup[1] |/slides)[last()]"/>
+
+ <xsl:variable name="doctype-public">
+ <xsl:call-template name="doctype-public">
+ <xsl:with-param name="frameset" select="$multiframe"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="doctype-system">
+ <xsl:call-template name="doctype-system">
+ <xsl:with-param name="frameset" select="$multiframe"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:call-template name="write.chunk">
+ <xsl:with-param name="indent" select="$output.indent"/>
+ <xsl:with-param name="doctype-public" select="$doctype-public"/>
+ <xsl:with-param name="doctype-system" select="$doctype-system"/>
+ <xsl:with-param name="filename" select="concat($base.dir,$thisfoil)"/>
+ <xsl:with-param name="content">
+ <html>
+ <head>
+ <title><xsl:value-of select="title"/></title>
+
+ <xsl:call-template name="system.head.content"/>
+
+ <meta name="generator" content="DocBook Slides Stylesheets V{$VERSION}"/>
+
+ <xsl:if test="$css.stylesheet != ''">
+ <link type="text/css" rel="stylesheet">
+ <xsl:attribute name="href">
+ <xsl:call-template name="css.stylesheet"/>
+ </xsl:attribute>
+ </link>
+ </xsl:if>
+ <xsl:apply-templates select="/processing-instruction('dbhtml')" mode="css.pi"/>
+
+ <xsl:call-template name="links">
+ <xsl:with-param name="home" select="$home"/>
+ <xsl:with-param name="up" select="$up"/>
+ <xsl:with-param name="next" select="$next"/>
+ <xsl:with-param name="prev" select="$prev"/>
+ </xsl:call-template>
+
+ <xsl:if test="$overlay != 0 or $keyboard.nav != 0 or $dynamic.toc != 0 or $active.toc != 0">
+ <script language="javascript" type="text/javascript">
+ <xsl:text> </xsl:text>
+ </script>
+ </xsl:if>
+
+ <xsl:if test="$keyboard.nav != 0 or $dynamic.toc != 0 or $active.toc != 0">
+ <xsl:call-template name="ua.js"/>
+ <xsl:call-template name="xbDOM.js">
+ <xsl:with-param name="language" select="'javascript'"/>
+ </xsl:call-template>
+ <xsl:call-template name="xbLibrary.js"/>
+ <script language="javascript" type="text/javascript">
+ <xsl:text disable-output-escaping="yes">
+ &lt;!--
+ xblibrary = new xbLibrary('</xsl:text>
+ <xsl:call-template name="script-dir"/>
+ <xsl:text disable-output-escaping="yes">');
+ // --&gt;
+ </xsl:text>
+ </script>
+ <xsl:call-template name="xbStyle.js"/>
+ <xsl:call-template name="xbCollapsibleLists.js"/>
+ <xsl:call-template name="slides.js">
+ <xsl:with-param name="language" select="'javascript'"/>
+ </xsl:call-template>
+ </xsl:if>
+
+ <xsl:if test="$overlay != '0'">
+ <xsl:call-template name="overlay.js">
+ <xsl:with-param name="language" select="'javascript'"/>
+ </xsl:call-template>
+ </xsl:if>
+
+ <xsl:call-template name="user.head.content"/>
+ </head>
+ <xsl:choose>
+ <xsl:when test="$multiframe != 0">
+ <xsl:apply-templates select="." mode="multiframe"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="." mode="singleframe"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </html>
+ </xsl:with-param>
+ </xsl:call-template>
+
+ <xsl:if test="$multiframe != 0">
+ <xsl:apply-templates select="." mode="multiframe-top"/>
+ <xsl:apply-templates select="." mode="multiframe-body"/>
+ <xsl:apply-templates select="." mode="multiframe-bottom"/>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="foil" mode="multiframe">
+ <xsl:variable name="foilgroup" select="ancestor::foilgroup"/>
+
+ <xsl:variable name="thisfoil">
+ <xsl:apply-templates select="." mode="filename"/>
+ </xsl:variable>
+
+ <frameset rows="{$multiframe.navigation.height},*,{$multiframe.navigation.height}" id="foil">
+ <xsl:attribute name="onload">
+ <xsl:text>javascript:body.focus()</xsl:text>
+ </xsl:attribute>
+ <frame src="top-{$thisfoil}" name="top" id="top" marginheight="0" frameborder="0">
+ </frame>
+ <frame src="body-{$thisfoil}" name="body" id="body" marginheight="0" frameborder="0">
+ </frame>
+ <frame src="bot-{$thisfoil}" name="bottom" id="bottom" marginheight="0" frameborder="0">
+ </frame>
+ <noframes>
+ <body class="frameset">
+ <xsl:call-template name="body.attributes"/>
+ <p>
+ <xsl:text>Your browser doesn't support frames.</xsl:text>
+ </p>
+ </body>
+ </noframes>
+ </frameset>
+</xsl:template>
+
+<xsl:template match="foil" mode="multiframe-top">
+ <xsl:variable name="thisfoil">
+ <xsl:apply-templates select="." mode="filename"/>
+ </xsl:variable>
+
+ <xsl:variable name="home" select="/slides"/>
+ <xsl:variable name="up" select="(parent::slides|parent::foilgroup)[1]"/>
+ <xsl:variable name="next" select="(following::foil |following::foilgroup)[1]"/>
+ <xsl:variable name="prev" select="(preceding-sibling::foil[1] |parent::foilgroup[1] |/slides)[last()]"/>
+
+ <xsl:call-template name="write.chunk">
+ <xsl:with-param name="indent" select="$output.indent"/>
+ <xsl:with-param name="filename" select="concat($base.dir,'top-',$thisfoil)"/>
+ <xsl:with-param name="content">
+ <html>
+ <head>
+ <title>Navigation</title>
+
+ <xsl:call-template name="system.head.content"/>
+
+ <meta name="generator" content="DocBook Slides Stylesheets V{$VERSION}"/>
+
+ <xsl:if test="$css.stylesheet != ''">
+ <link type="text/css" rel="stylesheet">
+ <xsl:attribute name="href">
+ <xsl:call-template name="css.stylesheet"/>
+ </xsl:attribute>
+ </link>
+ </xsl:if>
+ <xsl:apply-templates select="/processing-instruction('dbhtml')" mode="css.pi"/>
+
+ <xsl:if test="$overlay != 0 or $keyboard.nav != 0 or $dynamic.toc != 0 or $active.toc != 0">
+ <script language="javajcript" type="text/javascript">
+ <xsl:text> </xsl:text>
+ </script>
+ </xsl:if>
+
+ <xsl:if test="$keyboard.nav != 0 or $dynamic.toc != 0 or $active.toc != 0">
+ <xsl:call-template name="ua.js"/>
+ <xsl:call-template name="xbDOM.js">
+ <xsl:with-param name="language" select="'javascript'"/>
+ </xsl:call-template>
+ <xsl:call-template name="xbLibrary.js"/>
+ <script language="javascript" type="text/javascript">
+ <xsl:text disable-output-escaping="yes">
+ &lt;!--
+ xblibrary = new xbLibrary('</xsl:text>
+ <xsl:call-template name="script-dir"/>
+ <xsl:text disable-output-escaping="yes">');
+ // --&gt;
+ </xsl:text>
+ </script>
+ <xsl:call-template name="xbStyle.js"/>
+ <xsl:call-template name="xbCollapsibleLists.js"/>
+ <xsl:call-template name="slides.js">
+ <xsl:with-param name="language" select="'javascript'"/>
+ </xsl:call-template>
+ </xsl:if>
+
+ <xsl:if test="$overlay != '0'">
+ <xsl:call-template name="overlay.js">
+ <xsl:with-param name="language" select="'javascript'"/>
+ </xsl:call-template>
+ </xsl:if>
+
+ <xsl:call-template name="user.head.content"/>
+ </head>
+ <body class="topnavigation" bgcolor="{$multiframe.top.bgcolor}">
+ <xsl:call-template name="foil-top-nav">
+ <xsl:with-param name="home" select="$home"/>
+ <xsl:with-param name="up" select="$up"/>
+ <xsl:with-param name="next" select="$next"/>
+ <xsl:with-param name="prev" select="$prev"/>
+ </xsl:call-template>
+ </body>
+ </html>
+ </xsl:with-param>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="foil" mode="multiframe-body">
+ <xsl:variable name="thisfoil">
+ <xsl:apply-templates select="." mode="filename"/>
+ </xsl:variable>
+
+ <xsl:call-template name="write.chunk">
+ <xsl:with-param name="indent" select="$output.indent"/>
+ <xsl:with-param name="filename" select="concat($base.dir,'body-',$thisfoil)"/>
+ <xsl:with-param name="content">
+ <html>
+ <head>
+ <title>Body</title>
+
+ <xsl:call-template name="system.head.content"/>
+
+ <meta name="generator" content="DocBook Slides Stylesheets V{$VERSION}"/>
+
+ <xsl:if test="$css.stylesheet != ''">
+ <link type="text/css" rel="stylesheet">
+ <xsl:attribute name="href">
+ <xsl:call-template name="css.stylesheet"/>
+ </xsl:attribute>
+ </link>
+ </xsl:if>
+ <xsl:apply-templates select="/processing-instruction('dbhtml')" mode="css.pi"/>
+
+ <xsl:if test="$overlay != 0 or $keyboard.nav != 0 or $dynamic.toc != 0 or $active.toc != 0">
+ <script language="javascript" type="text/javascript">
+ <xsl:text> </xsl:text>
+ </script>
+ </xsl:if>
+
+ <xsl:if test="$keyboard.nav != 0 or $dynamic.toc != 0 or $active.toc != 0">
+ <xsl:variable name="home" select="/slides"/>
+ <xsl:variable name="up" select="(parent::slides|parent::foilgroup)[1]"/>
+ <xsl:variable name="next" select="(following::foil |following::foilgroup)[1]"/>
+ <xsl:variable name="prev" select="(preceding-sibling::foil[1] |parent::foilgroup[1] |/slides)[last()]"/>
+
+ <xsl:call-template name="links">
+ <xsl:with-param name="home" select="$home"/>
+ <xsl:with-param name="up" select="$up"/>
+ <xsl:with-param name="next" select="$next"/>
+ <xsl:with-param name="prev" select="$prev"/>
+ </xsl:call-template>
+
+ <xsl:call-template name="ua.js"/>
+ <xsl:call-template name="xbDOM.js">
+ <xsl:with-param name="language" select="'javascript'"/>
+ </xsl:call-template>
+ <xsl:call-template name="xbLibrary.js"/>
+ <script language="javascript" type="text/javascript">
+ <xsl:text disable-output-escaping="yes">
+ &lt;!--
+ xblibrary = new xbLibrary('</xsl:text>
+ <xsl:call-template name="script-dir"/>
+ <xsl:text disable-output-escaping="yes">');
+ // --&gt;
+ </xsl:text>
+ </script>
+ <xsl:call-template name="xbStyle.js"/>
+ <xsl:call-template name="xbCollapsibleLists.js"/>
+ <xsl:call-template name="slides.js">
+ <xsl:with-param name="language" select="'javascript'"/>
+ </xsl:call-template>
+ </xsl:if>
+
+ <xsl:if test="$overlay != '0'">
+ <xsl:call-template name="overlay.js">
+ <xsl:with-param name="language" select="'javascript'"/>
+ </xsl:call-template>
+ </xsl:if>
+
+ <xsl:call-template name="user.head.content"/>
+
+ </head>
+ <xsl:apply-templates select="." mode="singleframe"/>
+ </html>
+ </xsl:with-param>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="foil" mode="multiframe-bottom">
+ <xsl:variable name="thisfoil">
+ <xsl:apply-templates select="." mode="filename"/>
+ </xsl:variable>
+
+ <xsl:variable name="home" select="/slides"/>
+ <xsl:variable name="up" select="(parent::slides|parent::foilgroup)[1]"/>
+ <xsl:variable name="next" select="(following::foil |following::foilgroup)[1]"/>
+ <xsl:variable name="prev" select="(preceding-sibling::foil[1] |parent::foilgroup[1] |/slides)[last()]"/>
+
+ <xsl:call-template name="write.chunk">
+ <xsl:with-param name="indent" select="$output.indent"/>
+ <xsl:with-param name="filename" select="concat($base.dir,'bot-',$thisfoil)"/>
+ <xsl:with-param name="content">
+ <html>
+ <head>
+ <title>Navigation</title>
+
+ <xsl:call-template name="system.head.content"/>
+
+ <meta name="generator" content="DocBook Slides Stylesheets V{$VERSION}"/>
+
+ <xsl:if test="$css.stylesheet != ''">
+ <link type="text/css" rel="stylesheet">
+ <xsl:attribute name="href">
+ <xsl:call-template name="css.stylesheet"/>
+ </xsl:attribute>
+ </link>
+ </xsl:if>
+ <xsl:apply-templates select="/processing-instruction('dbhtml')" mode="css.pi"/>
+
+ <xsl:if test="$overlay != 0 or $keyboard.nav != 0 or $dynamic.toc != 0 or $active.toc != 0">
+ <script language="javascript" type="text/javascript">
+ <xsl:text> </xsl:text>
+ </script>
+ </xsl:if>
+
+ <xsl:if test="$keyboard.nav != 0 or $dynamic.toc != 0 or $active.toc != 0">
+ <xsl:call-template name="ua.js"/>
+ <xsl:call-template name="xbDOM.js">
+ <xsl:with-param name="language" select="'javascript'"/>
+ </xsl:call-template>
+ <xsl:call-template name="xbLibrary.js"/>
+ <script language="javascript" type="text/javascript">
+ <xsl:text disable-output-escaping="yes">
+ &lt;!--
+ xblibrary = new xbLibrary('</xsl:text>
+ <xsl:call-template name="script-dir"/>
+ <xsl:text disable-output-escaping="yes">');
+ // --&gt;
+ </xsl:text>
+ </script>
+ <xsl:call-template name="xbStyle.js"/>
+ <xsl:call-template name="xbCollapsibleLists.js"/>
+ <xsl:call-template name="slides.js">
+ <xsl:with-param name="language" select="'javascript'"/>
+ </xsl:call-template>
+ </xsl:if>
+
+ <xsl:if test="$overlay != '0'">
+ <xsl:call-template name="overlay.js">
+ <xsl:with-param name="language" select="'javascript'"/>
+ </xsl:call-template>
+ </xsl:if>
+
+ <xsl:call-template name="user.head.content"/>
+ </head>
+ <body class="botnavigation" bgcolor="{$multiframe.bottom.bgcolor}">
+ <xsl:call-template name="foil-bottom-nav">
+ <xsl:with-param name="home" select="$home"/>
+ <xsl:with-param name="up" select="$up"/>
+ <xsl:with-param name="next" select="$next"/>
+ <xsl:with-param name="prev" select="$prev"/>
+ </xsl:call-template>
+ </body>
+ </html>
+ </xsl:with-param>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="foil" mode="singleframe">
+ <xsl:param name="thisfoil">
+ <xsl:apply-templates select="." mode="filename"/>
+ </xsl:param>
+
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+
+ <xsl:variable name="home" select="/slides"/>
+ <xsl:variable name="up" select="(parent::slides|parent::foilgroup)[1]"/>
+ <xsl:variable name="next" select="(following::foil |following::foilgroup)[1]"/>
+ <xsl:variable name="prev" select="(preceding-sibling::foil[1] |parent::foilgroup[1] |/slides)[last()]"/>
+
+ <body class="foil">
+ <xsl:call-template name="body.attributes"/>
+ <xsl:choose>
+ <xsl:when test="$active.toc != 0">
+ <xsl:attribute name="onload">
+ <xsl:text>newPage('</xsl:text>
+ <xsl:value-of select="$thisfoil"/>
+ <xsl:text>',</xsl:text>
+ <xsl:value-of select="$overlay"/>
+ <xsl:text>);</xsl:text>
+ </xsl:attribute>
+ </xsl:when>
+ <xsl:when test="$overlay != 0">
+ <xsl:attribute name="onload">
+ <xsl:text>overlaySetup('lc');</xsl:text>
+ </xsl:attribute>
+ </xsl:when>
+ </xsl:choose>
+
+ <xsl:if test="$keyboard.nav != 0">
+ <xsl:attribute name="onkeypress">
+ <xsl:text>navigate(event)</xsl:text>
+ </xsl:attribute>
+ </xsl:if>
+
+ <div class="{name(.)}" id="{$id}">
+ <xsl:if test="$multiframe=0">
+ <xsl:call-template name="foil-top-nav">
+ <xsl:with-param name="home" select="$home"/>
+ <xsl:with-param name="up" select="$up"/>
+ <xsl:with-param name="next" select="$next"/>
+ <xsl:with-param name="prev" select="$prev"/>
+ </xsl:call-template>
+ </xsl:if>
+
+ <div class="foil-body">
+ <xsl:apply-templates/>
+ </div>
+
+ <xsl:if test="$multiframe=0">
+ <div id="overlayDiv">
+ <xsl:if test="$overlay != 0">
+ <xsl:attribute name="style">
+ <xsl:text>position:absolute;visibility:visible;</xsl:text>
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:call-template name="foil-bottom-nav">
+ <xsl:with-param name="home" select="$home"/>
+ <xsl:with-param name="up" select="$up"/>
+ <xsl:with-param name="next" select="$next"/>
+ <xsl:with-param name="prev" select="$prev"/>
+ </xsl:call-template>
+ </div>
+ </xsl:if>
+ </div>
+
+ <xsl:call-template name="process.footnotes"/>
+ </body>
+</xsl:template>
+
+<!-- ============================================================ -->
+
+<xsl:template match="slidesinfo" mode="toc">
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+ <div id="{$id}" class="toc-slidesinfo">
+ <a href="{$titlefoil.html}" target="foil">
+ <xsl:choose>
+ <xsl:when test="titleabbrev">
+ <xsl:apply-templates select="titleabbrev" mode="toc"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="title" mode="toc"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </a>
+ <hr/>
+ </div>
+</xsl:template>
+
+<xsl:template match="foilgroup" mode="toc">
+ <xsl:variable name="id"><xsl:call-template name="object.id"/></xsl:variable>
+
+ <xsl:variable name="thisfoilgroup">
+ <xsl:text>foilgroup</xsl:text>
+ <xsl:number count="foilgroup" level="any" format="01"/>
+ <xsl:value-of select="$html.ext"/>
+ </xsl:variable>
+
+ <div class="toc-foilgroup" id="{$id}">
+ <img alt="-">
+ <xsl:attribute name="src">
+ <xsl:call-template name="minus.image"/>
+ </xsl:attribute>
+ </img>
+ <a href="{$thisfoilgroup}" target="foil">
+ <xsl:choose>
+ <xsl:when test="titleabbrev">
+ <xsl:apply-templates select="titleabbrev" mode="toc"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="title" mode="toc"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </a>
+ <xsl:apply-templates select="foil" mode="toc"/>
+ </div>
+</xsl:template>
+
+<xsl:template match="foil" mode="toc">
+ <xsl:variable name="id"><xsl:call-template name="object.id"/></xsl:variable>
+ <xsl:variable name="foil">
+ <xsl:apply-templates select="." mode="filename"/>
+ </xsl:variable>
+
+ <div id="{$id}" class="toc-foil">
+ <img alt="-">
+ <xsl:attribute name="src">
+ <xsl:call-template name="bullet.image"/>
+ </xsl:attribute>
+ </img>
+ <a href="{$foil}" target="foil">
+ <xsl:choose>
+ <xsl:when test="titleabbrev">
+ <xsl:apply-templates select="titleabbrev" mode="toc"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="title" mode="toc"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </a>
+ </div>
+</xsl:template>
+
+<!-- ====================================================================== -->
+
+<xsl:template match="slidesinfo" mode="ns-toc">
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+
+ <xsl:text>myList.addItem('</xsl:text>
+
+ <xsl:text disable-output-escaping="yes">&lt;div id="</xsl:text>
+ <xsl:value-of select="$id"/>
+ <xsl:text disable-output-escaping="yes">" class="toc-slidesinfo"&gt;</xsl:text>
+
+ <xsl:text disable-output-escaping="yes">&lt;a href="</xsl:text>
+ <xsl:value-of select="$titlefoil.html"/>
+ <xsl:text disable-output-escaping="yes">" target="foil"&gt;</xsl:text>
+
+ <xsl:call-template name="string.subst">
+ <xsl:with-param name="string">
+ <xsl:choose>
+ <xsl:when test="titleabbrev">
+ <xsl:value-of select="titleabbrev"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="title"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:with-param>
+ <xsl:with-param name="target">'</xsl:with-param>
+ <xsl:with-param name="replacement">\'</xsl:with-param>
+ </xsl:call-template>
+
+ <xsl:text disable-output-escaping="yes">&lt;\/a&gt;&lt;\/div&gt;</xsl:text>
+ <xsl:text>');
+</xsl:text>
+</xsl:template>
+
+<xsl:template match="foilgroup" mode="ns-toc">
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+
+ <xsl:text>subList = new List(false, width, height, "</xsl:text>
+<xsl:value-of select="$toc.bg.color"/>
+<xsl:text>");
+</xsl:text>
+ <xsl:text>subList.setIndent(12);
+</xsl:text>
+ <xsl:apply-templates select="foil" mode="ns-toc"/>
+
+ <xsl:text>myList.addList(subList, '</xsl:text>
+
+ <xsl:text disable-output-escaping="yes">&lt;div id="</xsl:text>
+ <xsl:value-of select="$id"/>
+ <xsl:text disable-output-escaping="yes">" class="toc-foilgroup"&gt;</xsl:text>
+
+ <xsl:text disable-output-escaping="yes">&lt;a href="</xsl:text>
+ <xsl:apply-templates select="." mode="filename"/>
+ <xsl:text disable-output-escaping="yes">" target="foil"&gt;</xsl:text>
+
+ <xsl:call-template name="string.subst">
+ <xsl:with-param name="string">
+ <xsl:choose>
+ <xsl:when test="titleabbrev">
+ <xsl:value-of select="titleabbrev"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="title"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:with-param>
+ <xsl:with-param name="target">'</xsl:with-param>
+ <xsl:with-param name="replacement">\'</xsl:with-param>
+ </xsl:call-template>
+
+ <xsl:text disable-output-escaping="yes">&lt;\/a&gt;&lt;\/div&gt;</xsl:text>
+ <xsl:text>');
+</xsl:text>
+</xsl:template>
+
+<xsl:template match="foil" mode="ns-toc">
+ <xsl:variable name="id"><xsl:call-template name="object.id"/></xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="ancestor::foilgroup">
+ <xsl:text>subList.addItem('</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text>myList.addItem('</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:text disable-output-escaping="yes">&lt;div id="</xsl:text>
+ <xsl:value-of select="$id"/>
+ <xsl:text disable-output-escaping="yes">" class="toc-foil"&gt;</xsl:text>
+
+ <xsl:text disable-output-escaping="yes">&lt;img alt="-" src="</xsl:text>
+ <xsl:call-template name="bullet.image"/>
+ <xsl:text disable-output-escaping="yes">"&gt;&lt;\/img&gt;</xsl:text>
+
+ <xsl:text disable-output-escaping="yes">&lt;a href="</xsl:text>
+ <xsl:apply-templates select="." mode="filename"/>
+ <xsl:text disable-output-escaping="yes">" target="foil"&gt;</xsl:text>
+
+ <xsl:call-template name="string.subst">
+ <xsl:with-param name="string">
+ <xsl:choose>
+ <xsl:when test="titleabbrev">
+ <xsl:value-of select="titleabbrev"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="title"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:with-param>
+ <xsl:with-param name="target">'</xsl:with-param>
+ <xsl:with-param name="replacement">\'</xsl:with-param>
+ </xsl:call-template>
+
+ <xsl:text disable-output-escaping="yes">&lt;\/a&gt;&lt;\/div&gt;</xsl:text>
+ <xsl:text>');
+</xsl:text>
+</xsl:template>
+
+<xsl:template match="speakernotes" mode="ns-toc">
+ <!-- nop -->
+</xsl:template>
+
+<!-- ====================================================================== -->
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/xhtml/graphics.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/xhtml/graphics.xsl
new file mode 100644
index 0000000..6317a4b
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/xhtml/graphics.xsl
@@ -0,0 +1,152 @@
+<?xml version="1.0" encoding="ASCII"?>
+<!--This file was created automatically by html2xhtml-->
+<!--from the HTML stylesheets.-->
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1999/xhtml" version="1.0">
+
+<!-- ====================================================================== -->
+
+<xsl:template name="graphics-file">
+ <xsl:param name="image" select="'bullet.gif'"/>
+
+ <xsl:variable name="source.graphics.dir">
+ <xsl:call-template name="dbhtml-attribute">
+ <xsl:with-param name="pis" select="/processing-instruction('dbhtml')"/>
+ <xsl:with-param name="attribute" select="'graphics-dir'"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="$source.graphics.dir != ''">
+ <xsl:value-of select="$source.graphics.dir"/>
+ <xsl:text>/</xsl:text>
+ </xsl:when>
+ <xsl:when test="$graphics.dir != ''">
+ <xsl:value-of select="$graphics.dir"/>
+ <xsl:text>/</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text>http://docbook.sourceforge.net/release/slides/graphics/</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:value-of select="$image"/>
+</xsl:template>
+
+<!-- ====================================================================== -->
+<!-- active navigation images -->
+
+<xsl:template name="toc.image">
+ <!-- Danger Will Robinson: template shadows parameter -->
+ <xsl:call-template name="graphics-file">
+ <xsl:with-param name="image" select="$toc.image"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template name="home.image">
+ <!-- Danger Will Robinson: template shadows parameter -->
+ <xsl:call-template name="graphics-file">
+ <xsl:with-param name="image" select="$home.image"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template name="up.image">
+ <!-- Danger Will Robinson: template shadows parameter -->
+ <xsl:call-template name="graphics-file">
+ <xsl:with-param name="image" select="$up.image"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template name="prev.image">
+ <!-- Danger Will Robinson: template shadows parameter -->
+ <xsl:call-template name="graphics-file">
+ <xsl:with-param name="image" select="$prev.image"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template name="next.image">
+ <!-- Danger Will Robinson: template shadows parameter -->
+ <xsl:call-template name="graphics-file">
+ <xsl:with-param name="image" select="$next.image"/>
+ </xsl:call-template>
+</xsl:template>
+
+<!-- inactive navigation images -->
+
+<xsl:template name="no.toc.image">
+ <!-- Danger Will Robinson: template shadows parameter -->
+ <xsl:call-template name="graphics-file">
+ <xsl:with-param name="image" select="$no.toc.image"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template name="no.home.image">
+ <!-- Danger Will Robinson: template shadows parameter -->
+ <xsl:call-template name="graphics-file">
+ <xsl:with-param name="image" select="$no.home.image"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template name="no.up.image">
+ <!-- Danger Will Robinson: template shadows parameter -->
+ <xsl:call-template name="graphics-file">
+ <xsl:with-param name="image" select="$no.up.image"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template name="no.prev.image">
+ <!-- Danger Will Robinson: template shadows parameter -->
+ <xsl:call-template name="graphics-file">
+ <xsl:with-param name="image" select="$no.prev.image"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template name="no.next.image">
+ <!-- Danger Will Robinson: template shadows parameter -->
+ <xsl:call-template name="graphics-file">
+ <xsl:with-param name="image" select="$no.next.image"/>
+ </xsl:call-template>
+</xsl:template>
+
+<!-- ====================================================================== -->
+<!-- icon images -->
+
+<xsl:template name="bullet.image">
+ <!-- Danger Will Robinson: template shadows parameter -->
+ <xsl:call-template name="graphics-file">
+ <xsl:with-param name="image" select="$bullet.image"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template name="plus.image">
+ <!-- Danger Will Robinson: template shadows parameter -->
+ <xsl:call-template name="graphics-file">
+ <xsl:with-param name="image" select="$plus.image"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template name="minus.image">
+ <!-- Danger Will Robinson: template shadows parameter -->
+ <xsl:call-template name="graphics-file">
+ <xsl:with-param name="image" select="$minus.image"/>
+ </xsl:call-template>
+</xsl:template>
+
+<!-- ====================================================================== -->
+<!-- hide/show ToC images -->
+
+<xsl:template name="hidetoc.image">
+ <!-- Danger Will Robinson: template shadows parameter -->
+ <xsl:call-template name="graphics-file">
+ <xsl:with-param name="image" select="$hidetoc.image"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template name="showtoc.image">
+ <!-- Danger Will Robinson: template shadows parameter -->
+ <xsl:call-template name="graphics-file">
+ <xsl:with-param name="image" select="$showtoc.image"/>
+ </xsl:call-template>
+</xsl:template>
+
+<!-- ====================================================================== -->
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/xhtml/jscript.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/xhtml/jscript.xsl
new file mode 100644
index 0000000..b3047ee
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/xhtml/jscript.xsl
@@ -0,0 +1,128 @@
+<?xml version="1.0" encoding="ASCII"?>
+<!--This file was created automatically by html2xhtml-->
+<!--from the HTML stylesheets.-->
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1999/xhtml" version="1.0">
+
+<xsl:output method="xml" encoding="UTF-8" doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN" doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"/>
+
+<xsl:template name="script-dir">
+ <xsl:variable name="source.script.dir">
+ <xsl:call-template name="dbhtml-attribute">
+ <xsl:with-param name="pis" select="/processing-instruction('dbhtml')"/>
+ <xsl:with-param name="attribute" select="'script-dir'"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="$source.script.dir != ''">
+ <xsl:value-of select="$source.script.dir"/>
+ <xsl:text>/</xsl:text>
+ </xsl:when>
+ <xsl:when test="$script.dir != ''">
+ <xsl:value-of select="$script.dir"/>
+ <xsl:text>/</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text>http://docbook.sourceforge.net/release/slides/browser/</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="script-file">
+ <xsl:param name="js" select="'slides.js'"/>
+ <xsl:call-template name="script-dir"/>
+ <xsl:value-of select="$js"/>
+</xsl:template>
+
+<xsl:template name="ua.js">
+ <!-- Danger Will Robinson: template shadows parameter -->
+ <xsl:param name="language" select="'javascript'"/>
+ <script type="text/javascript" language="{$language}">
+ <xsl:attribute name="src">
+ <xsl:call-template name="script-file">
+ <xsl:with-param name="js" select="$ua.js"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:text> </xsl:text>
+ </script>
+</xsl:template>
+
+<xsl:template name="xbDOM.js">
+ <!-- Danger Will Robinson: template shadows parameter -->
+ <xsl:param name="language" select="'javascript'"/>
+ <script type="text/javascript" language="{$language}">
+ <xsl:attribute name="src">
+ <xsl:call-template name="script-file">
+ <xsl:with-param name="js" select="$xbDOM.js"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:text> </xsl:text>
+ </script>
+</xsl:template>
+
+<xsl:template name="xbStyle.js">
+ <!-- Danger Will Robinson: template shadows parameter -->
+ <xsl:param name="language" select="'javascript'"/>
+ <script type="text/javascript" language="{$language}">
+ <xsl:attribute name="src">
+ <xsl:call-template name="script-file">
+ <xsl:with-param name="js" select="$xbStyle.js"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:text> </xsl:text>
+ </script>
+</xsl:template>
+
+<xsl:template name="xbLibrary.js">
+ <!-- Danger Will Robinson: template shadows parameter -->
+ <xsl:param name="language" select="'javascript'"/>
+ <script type="text/javascript" language="{$language}">
+ <xsl:attribute name="src">
+ <xsl:call-template name="script-file">
+ <xsl:with-param name="js" select="$xbLibrary.js"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:text> </xsl:text>
+ </script>
+</xsl:template>
+
+<xsl:template name="xbCollapsibleLists.js">
+ <!-- Danger Will Robinson: template shadows parameter -->
+ <xsl:param name="language" select="'javascript'"/>
+ <script type="text/javascript" language="{$language}">
+ <xsl:attribute name="src">
+ <xsl:call-template name="script-file">
+ <xsl:with-param name="js" select="$xbCollapsibleLists.js"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:text> </xsl:text>
+ </script>
+</xsl:template>
+
+<xsl:template name="overlay.js">
+ <!-- Danger Will Robinson: template shadows parameter -->
+ <xsl:param name="language" select="'javascript'"/>
+ <script type="text/javascript" language="{$language}">
+ <xsl:attribute name="src">
+ <xsl:call-template name="script-file">
+ <xsl:with-param name="js" select="$overlay.js"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:text> </xsl:text>
+ </script>
+</xsl:template>
+
+<xsl:template name="slides.js">
+ <!-- Danger Will Robinson: template shadows parameter -->
+ <xsl:param name="language" select="'javascript'"/>
+ <script type="text/javascript" language="{$language}">
+ <xsl:attribute name="src">
+ <xsl:call-template name="script-file">
+ <xsl:with-param name="js" select="$slides.js"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:text> </xsl:text>
+ </script>
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/xhtml/param.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/xhtml/param.xsl
new file mode 100644
index 0000000..c3ec806
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/xhtml/param.xsl
@@ -0,0 +1,70 @@
+<?xml version="1.0" encoding="ASCII"?>
+<!--This file was created automatically by html2xhtml-->
+<!--from the HTML stylesheets.-->
+<!-- This file is generated from param.xweb -->
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1999/xhtml" version="1.0">
+
+<!-- ********************************************************************
+ $Id: param.xweb 6633 2007-02-21 18:33:33Z xmldoc $
+ ********************************************************************
+
+ This file is part of the DocBook Slides Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<xsl:param name="active.toc" select="0"/>
+<xsl:param name="body.bg.color">#FFFFFF</xsl:param>
+<xsl:param name="bullet.image">toc/bullet.png</xsl:param>
+<xsl:param name="css.stylesheet">slides.css</xsl:param>
+<xsl:param name="css.stylesheet.dir"/>
+<xsl:param name="dynamic.toc" select="0"/>
+<xsl:param name="foilgroup.toc" select="1"/>
+<xsl:param name="graphics.dir"/>
+<xsl:param name="hidetoc.image">hidetoc.gif</xsl:param>
+<xsl:param name="home.image">active/nav-home.png</xsl:param>
+<xsl:param name="keyboard.nav" select="1"/>
+<xsl:param name="minus.image">toc/open.png</xsl:param>
+<xsl:param name="multiframe.bottom.bgcolor">white</xsl:param>
+<xsl:param name="multiframe" select="0"/>
+<xsl:param name="multiframe.navigation.height">40</xsl:param>
+<xsl:param name="multiframe.top.bgcolor">white</xsl:param>
+<xsl:param name="nav.separator" select="1"/>
+<xsl:param name="next.image">active/nav-next.png</xsl:param>
+<xsl:param name="no.home.image">inactive/nav-home.png</xsl:param>
+<xsl:param name="no.next.image">inactive/nav-next.png</xsl:param>
+<xsl:param name="no.prev.image">inactive/nav-prev.png</xsl:param>
+<xsl:param name="no.toc.image">inactive/nav-toc.png</xsl:param>
+<xsl:param name="no.up.image">inactive/nav-up.png</xsl:param>
+<xsl:param name="output.indent">no</xsl:param>
+<xsl:param name="overlay" select="0"/>
+<xsl:param name="overlay.js">overlay.js</xsl:param>
+<xsl:param name="overlay.logo">http://docbook.sourceforge.net/release/buttons/slides-1.png</xsl:param>
+<xsl:param name="plus.image">toc/closed.png</xsl:param>
+<xsl:param name="prev.image">active/nav-prev.png</xsl:param>
+<xsl:param name="script.dir"/>
+<xsl:param name="show.foil.number" select="0"/>
+<xsl:param name="showtoc.image">showtoc.gif</xsl:param>
+<xsl:param name="slides.js">slides.js</xsl:param>
+<xsl:param name="text.home">Home</xsl:param>
+<xsl:param name="text.next">Next</xsl:param>
+<xsl:param name="text.prev">Prev</xsl:param>
+<xsl:param name="text.toc">ToC</xsl:param>
+<xsl:param name="text.up">Up</xsl:param>
+<xsl:param name="titlefoil.html" select="concat('index', $html.ext)"/>
+<xsl:param name="toc.bg.color">#FFFFFF</xsl:param>
+<xsl:param name="toc.hide.show" select="0"/>
+<xsl:param name="toc.html" select="concat('toc', $html.ext)"/>
+<xsl:param name="toc.image">active/nav-toc.png</xsl:param>
+<xsl:param name="toc.row.height">22</xsl:param>
+<xsl:param name="toc.width">250</xsl:param>
+<!-- Presumably in pixels? -->
+<xsl:param name="ua.js">ua.js</xsl:param>
+<xsl:param name="up.image">active/nav-up.png</xsl:param>
+<xsl:param name="xbCollapsibleLists.js">xbCollapsibleLists.js</xsl:param>
+<xsl:param name="xbDOM.js">xbDOM.js</xsl:param>
+<xsl:param name="xbStyle.js">xbStyle.js</xsl:param>
+<xsl:param name="xbLibrary.js">xbLibrary.js</xsl:param>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/xhtml/plain.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/xhtml/plain.xsl
new file mode 100644
index 0000000..29d43fc
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/xhtml/plain.xsl
@@ -0,0 +1,470 @@
+<?xml version="1.0" encoding="ASCII"?>
+<!--This file was created automatically by html2xhtml-->
+<!--from the HTML stylesheets.-->
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1999/xhtml" version="1.0">
+
+<xsl:import href="slides-common.xsl"/>
+
+<xsl:param name="prev.image" select="'active/nav-prev.png'"/>
+<xsl:param name="next.image" select="'active/nav-next.png'"/>
+<xsl:param name="up.image" select="'active/nav-up.png'"/>
+<xsl:param name="toc.image" select="'active/nav-toc.png'"/>
+<xsl:param name="home.image" select="'active/nav-home.png'"/>
+
+<xsl:param name="no.prev.image" select="'inactive/nav-prev.png'"/>
+<xsl:param name="no.next.image" select="'inactive/nav-next.png'"/>
+<xsl:param name="no.up.image" select="'inactive/nav-up.png'"/>
+<xsl:param name="no.toc.image" select="'inactive/nav-toc.png'"/>
+<xsl:param name="no.home.image" select="'inactive/nav-home.png'"/>
+
+<xsl:param name="css.stylesheet" select="'slides-plain.css'"/>
+
+<!-- ====================================================================== -->
+
+<xsl:template name="top-nav">
+ <xsl:param name="prev"/>
+ <xsl:param name="next"/>
+ <xsl:param name="up"/>
+ <xsl:param name="home"/>
+ <xsl:param name="toc" select="$toc.html"/>
+
+ <div class="navhead">
+ <table width="100%" border="0" cellpadding="0" cellspacing="0" summary="Navigation">
+ <tr>
+ <td align="left" width="45%">
+ <span class="slidestitle">
+ <xsl:value-of select="(/slides/slidesinfo/title)[1]"/>
+ </span>
+ <xsl:text>&#160;</xsl:text>
+ </td>
+ <td width="10%" align="center" valign="bottom">
+ <xsl:call-template name="foil.number"/>
+ </td>
+ <td align="right" width="45%">
+ <xsl:choose>
+ <xsl:when test="$home">
+ <a>
+ <xsl:attribute name="href">
+ <xsl:apply-templates select="$home" mode="filename"/>
+ </xsl:attribute>
+ <xsl:attribute name="title">
+ <xsl:value-of select="$home/slidesinfo/title"/>
+ </xsl:attribute>
+ <img alt="Home" border="0">
+ <xsl:attribute name="src">
+ <xsl:call-template name="home.image"/>
+ </xsl:attribute>
+ </img>
+ </a>
+ </xsl:when>
+ <xsl:otherwise>
+ <img alt="Home" border="0">
+ <xsl:attribute name="src">
+ <xsl:call-template name="no.home.image"/>
+ </xsl:attribute>
+ </img>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:text>&#160;</xsl:text>
+
+ <xsl:choose>
+ <xsl:when test="$toc != ''">
+ <a title="ToC" href="{$toc}">
+ <img alt="ToC" border="0">
+ <xsl:attribute name="src">
+ <xsl:call-template name="toc.image"/>
+ </xsl:attribute>
+ </img>
+ </a>
+ </xsl:when>
+ <xsl:otherwise>
+ <img alt="ToC" border="0">
+ <xsl:attribute name="src">
+ <xsl:call-template name="no.toc.image"/>
+ </xsl:attribute>
+ </img>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:text>&#160;</xsl:text>
+
+ <xsl:choose>
+ <xsl:when test="$prev">
+ <a>
+ <xsl:attribute name="href">
+ <xsl:apply-templates select="$prev" mode="filename"/>
+ </xsl:attribute>
+ <xsl:attribute name="title">
+ <xsl:value-of select="$prev/title"/>
+ </xsl:attribute>
+ <img alt="Prev" border="0">
+ <xsl:attribute name="src">
+ <xsl:call-template name="prev.image"/>
+ </xsl:attribute>
+ </img>
+ </a>
+ </xsl:when>
+ <xsl:otherwise>
+ <img alt="Prev" border="0">
+ <xsl:attribute name="src">
+ <xsl:call-template name="no.prev.image"/>
+ </xsl:attribute>
+ </img>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:text>&#160;</xsl:text>
+
+ <xsl:choose>
+ <xsl:when test="$up">
+ <a>
+ <xsl:attribute name="href">
+ <xsl:apply-templates select="$up" mode="filename"/>
+ </xsl:attribute>
+ <xsl:attribute name="title">
+ <xsl:value-of select="$up/title"/>
+ </xsl:attribute>
+ <img alt="Up" border="0">
+ <xsl:attribute name="src">
+ <xsl:call-template name="up.image"/>
+ </xsl:attribute>
+ </img>
+ </a>
+ </xsl:when>
+ <xsl:otherwise>
+ <img alt="Up" border="0">
+ <xsl:attribute name="src">
+ <xsl:call-template name="no.up.image"/>
+ </xsl:attribute>
+ </img>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:text>&#160;</xsl:text>
+
+ <xsl:choose>
+ <xsl:when test="$next">
+ <a>
+ <xsl:attribute name="href">
+ <xsl:apply-templates select="$next" mode="filename"/>
+ </xsl:attribute>
+ <xsl:attribute name="title">
+ <xsl:value-of select="$next/title"/>
+ </xsl:attribute>
+ <img alt="Next" border="0">
+ <xsl:attribute name="src">
+ <xsl:call-template name="next.image"/>
+ </xsl:attribute>
+ </img>
+ </a>
+ </xsl:when>
+ <xsl:otherwise>
+ <img alt="Next" border="0">
+ <xsl:attribute name="src">
+ <xsl:call-template name="no.next.image"/>
+ </xsl:attribute>
+ </img>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:text>&#160;</xsl:text>
+ </td>
+ </tr>
+ </table>
+ <hr class="top-nav-sep"/>
+ </div>
+</xsl:template>
+
+<!-- ============================================================ -->
+
+<xsl:template name="titlepage-top-nav">
+ <xsl:param name="home"/>
+ <xsl:param name="up"/>
+ <xsl:param name="prev"/>
+ <xsl:param name="next"/>
+ <xsl:param name="toc" select="$toc.html"/>
+
+ <div class="navhead">
+ <table width="100%" border="0" cellpadding="0" cellspacing="0" summary="Navigation">
+ <tr>
+ <td align="left" width="50%">
+ <xsl:text>&#160;</xsl:text>
+ </td>
+ <td align="right" width="50%">
+ <xsl:choose>
+ <xsl:when test="$home">
+ <a>
+ <xsl:attribute name="href">
+ <xsl:apply-templates select="$home" mode="filename"/>
+ </xsl:attribute>
+ <xsl:attribute name="title">
+ <xsl:value-of select="$home/slidesinfo/title"/>
+ </xsl:attribute>
+ <img alt="Home" border="0">
+ <xsl:attribute name="src">
+ <xsl:call-template name="home.image"/>
+ </xsl:attribute>
+ </img>
+ </a>
+ </xsl:when>
+ <xsl:otherwise>
+ <img alt="Home" border="0">
+ <xsl:attribute name="src">
+ <xsl:call-template name="no.home.image"/>
+ </xsl:attribute>
+ </img>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:text>&#160;</xsl:text>
+
+ <xsl:choose>
+ <xsl:when test="$toc.html != ''">
+ <a title="ToC" href="{$toc.html}">
+ <img alt="ToC" border="0">
+ <xsl:attribute name="src">
+ <xsl:call-template name="toc.image"/>
+ </xsl:attribute>
+ </img>
+ </a>
+ </xsl:when>
+ <xsl:otherwise>
+ <img alt="ToC" border="0">
+ <xsl:attribute name="src">
+ <xsl:call-template name="no.toc.image"/>
+ </xsl:attribute>
+ </img>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:text>&#160;</xsl:text>
+
+ <xsl:choose>
+ <xsl:when test="$prev">
+ <a>
+ <xsl:attribute name="href">
+ <xsl:apply-templates select="$prev" mode="filename"/>
+ </xsl:attribute>
+ <xsl:attribute name="title">
+ <xsl:value-of select="$prev/title"/>
+ </xsl:attribute>
+ <img alt="Prev" border="0">
+ <xsl:attribute name="src">
+ <xsl:call-template name="prev.image"/>
+ </xsl:attribute>
+ </img>
+ </a>
+ </xsl:when>
+ <xsl:otherwise>
+ <img alt="Prev" border="0">
+ <xsl:attribute name="src">
+ <xsl:call-template name="no.prev.image"/>
+ </xsl:attribute>
+ </img>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:text>&#160;</xsl:text>
+
+ <xsl:choose>
+ <xsl:when test="$up">
+ <a>
+ <xsl:attribute name="href">
+ <xsl:apply-templates select="$up" mode="filename"/>
+ </xsl:attribute>
+ <xsl:attribute name="title">
+ <xsl:value-of select="$up/title"/>
+ </xsl:attribute>
+ <img alt="Up" border="0">
+ <xsl:attribute name="src">
+ <xsl:call-template name="up.image"/>
+ </xsl:attribute>
+ </img>
+ </a>
+ </xsl:when>
+ <xsl:otherwise>
+ <img alt="Up" border="0">
+ <xsl:attribute name="src">
+ <xsl:call-template name="no.up.image"/>
+ </xsl:attribute>
+ </img>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:text>&#160;</xsl:text>
+
+ <xsl:choose>
+ <xsl:when test="$next">
+ <a>
+ <xsl:attribute name="href">
+ <xsl:apply-templates select="$next" mode="filename"/>
+ </xsl:attribute>
+ <xsl:attribute name="title">
+ <xsl:value-of select="$next/title"/>
+ </xsl:attribute>
+ <img alt="Next" border="0">
+ <xsl:attribute name="src">
+ <xsl:call-template name="next.image"/>
+ </xsl:attribute>
+ </img>
+ </a>
+ </xsl:when>
+ <xsl:otherwise>
+ <img alt="Next" border="0">
+ <xsl:attribute name="src">
+ <xsl:call-template name="no.next.image"/>
+ </xsl:attribute>
+ </img>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:text>&#160;</xsl:text>
+ </td>
+ </tr>
+ </table>
+ <hr class="top-nav-sep"/>
+ </div>
+</xsl:template>
+
+<!-- ============================================================ -->
+
+<xsl:template name="toc-top-nav">
+ <xsl:param name="home" select="/slides"/>
+ <xsl:param name="up"/>
+ <xsl:param name="prev"/>
+ <xsl:param name="next" select="(foil|foilgroup)[1]"/>
+ <xsl:param name="toc"/>
+
+ <div class="navhead">
+ <table width="100%" border="0" cellpadding="0" cellspacing="0" summary="Navigation">
+ <tr>
+ <td align="left" width="50%">
+ <xsl:text>&#160;</xsl:text>
+ </td>
+ <td align="right" width="50%">
+ <xsl:choose>
+ <xsl:when test="$home">
+ <a>
+ <xsl:attribute name="href">
+ <xsl:apply-templates select="$home" mode="filename"/>
+ </xsl:attribute>
+ <xsl:attribute name="title">
+ <xsl:value-of select="$home/slidesinfo/title"/>
+ </xsl:attribute>
+ <img alt="Home" border="0">
+ <xsl:attribute name="src">
+ <xsl:call-template name="home.image"/>
+ </xsl:attribute>
+ </img>
+ </a>
+ </xsl:when>
+ <xsl:otherwise>
+ <img alt="Home" border="0">
+ <xsl:attribute name="src">
+ <xsl:call-template name="no.home.image"/>
+ </xsl:attribute>
+ </img>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:text>&#160;</xsl:text>
+
+ <xsl:choose>
+ <xsl:when test="$toc != ''">
+ <a title="ToC" href="{$toc}">
+ <img alt="ToC" border="0">
+ <xsl:attribute name="src">
+ <xsl:call-template name="toc.image"/>
+ </xsl:attribute>
+ </img>
+ </a>
+ </xsl:when>
+ <xsl:otherwise>
+ <img alt="ToC" border="0">
+ <xsl:attribute name="src">
+ <xsl:call-template name="no.toc.image"/>
+ </xsl:attribute>
+ </img>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:text>&#160;</xsl:text>
+
+ <xsl:choose>
+ <xsl:when test="$prev">
+ <a>
+ <xsl:attribute name="href">
+ <xsl:apply-templates select="$prev" mode="filename"/>
+ </xsl:attribute>
+ <xsl:attribute name="title">
+ <xsl:value-of select="$prev/title"/>
+ </xsl:attribute>
+ <img alt="Prev" border="0">
+ <xsl:attribute name="src">
+ <xsl:call-template name="prev.image"/>
+ </xsl:attribute>
+ </img>
+ </a>
+ </xsl:when>
+ <xsl:otherwise>
+ <img alt="Prev" border="0">
+ <xsl:attribute name="src">
+ <xsl:call-template name="no.prev.image"/>
+ </xsl:attribute>
+ </img>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:text>&#160;</xsl:text>
+
+ <xsl:choose>
+ <xsl:when test="$up">
+ <a>
+ <xsl:attribute name="href">
+ <xsl:apply-templates select="$up" mode="filename"/>
+ </xsl:attribute>
+ <xsl:attribute name="title">
+ <xsl:value-of select="$up/title"/>
+ </xsl:attribute>
+ <img alt="Up" border="0">
+ <xsl:attribute name="src">
+ <xsl:call-template name="up.image"/>
+ </xsl:attribute>
+ </img>
+ </a>
+ </xsl:when>
+ <xsl:otherwise>
+ <img alt="Up" border="0">
+ <xsl:attribute name="src">
+ <xsl:call-template name="no.up.image"/>
+ </xsl:attribute>
+ </img>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:text>&#160;</xsl:text>
+
+ <xsl:choose>
+ <xsl:when test="$next">
+ <a>
+ <xsl:attribute name="href">
+ <xsl:apply-templates select="$next" mode="filename"/>
+ </xsl:attribute>
+ <xsl:attribute name="title">
+ <xsl:value-of select="$next/title"/>
+ </xsl:attribute>
+ <img alt="Next" border="0">
+ <xsl:attribute name="src">
+ <xsl:call-template name="next.image"/>
+ </xsl:attribute>
+ </img>
+ </a>
+ </xsl:when>
+ <xsl:otherwise>
+ <img alt="Next" border="0">
+ <xsl:attribute name="src">
+ <xsl:call-template name="no.next.image"/>
+ </xsl:attribute>
+ </img>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:text>&#160;</xsl:text>
+ </td>
+ </tr>
+ </table>
+ <hr class="top-nav-sep"/>
+ </div>
+</xsl:template>
+
+<!-- ====================================================================== -->
+
+<xsl:template name="bottom-nav"/>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/xhtml/slides-common.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/xhtml/slides-common.xsl
new file mode 100644
index 0000000..65d3b7a
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/xhtml/slides-common.xsl
@@ -0,0 +1,1534 @@
+<?xml version="1.0" encoding="ASCII"?>
+<!--This file was created automatically by html2xhtml-->
+<!--from the HTML stylesheets.-->
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1999/xhtml" version="1.0">
+
+<xsl:import href="../../xhtml/chunk.xsl"/>
+<xsl:include href="../../VERSION"/>
+
+<xsl:include href="param.xsl"/>
+<xsl:include href="jscript.xsl"/>
+<xsl:include href="graphics.xsl"/>
+<xsl:include href="css.xsl"/>
+
+<xsl:output method="xml" encoding="UTF-8" doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN" doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"/>
+
+<xsl:strip-space elements="slides foil foilgroup"/>
+
+<!-- Process the slides -->
+
+<xsl:template match="/">
+ <xsl:apply-templates/>
+</xsl:template>
+
+<xsl:template match="slides">
+ <xsl:apply-templates select="." mode="toc"/>
+ <xsl:apply-templates/>
+</xsl:template>
+
+<!-- ====================================================================== -->
+<!-- Every slide has top and bottom navigation -->
+
+<xsl:template name="top-nav">
+ <xsl:param name="home"/>
+ <xsl:param name="up"/>
+ <xsl:param name="next"/>
+ <xsl:param name="prev"/>
+ <xsl:param name="tocfile" select="$toc.html"/>
+
+ <div class="navhead">
+ <table border="0" width="100%" cellspacing="0" cellpadding="0" summary="Navigation table">
+ <tr>
+ <td align="left" valign="bottom">
+ <xsl:if test="$home">
+ <span class="slidestitle">
+ <a>
+ <xsl:attribute name="href">
+ <xsl:apply-templates select="$home" mode="filename"/>
+ </xsl:attribute>
+ <xsl:value-of select="($home/title|$home/slidesinfo/title)[1]"/>
+ </a>
+ </span>
+ </xsl:if>
+ <xsl:text>&#160;</xsl:text>
+ </td>
+
+ <td align="right" valign="bottom">
+ <xsl:choose>
+ <xsl:when test="$home">
+ <span class="link-text">
+ <a>
+ <xsl:attribute name="href">
+ <xsl:apply-templates select="$home" mode="filename"/>
+ </xsl:attribute>
+ <img alt="{$text.home}" border="0">
+ <xsl:attribute name="src">
+ <xsl:call-template name="home.image"/>
+ </xsl:attribute>
+ </img>
+ </a>
+ </span>
+ </xsl:when>
+ <xsl:otherwise>
+ <span class="no-link-text">
+ <img alt="{$text.home}" border="0">
+ <xsl:attribute name="src">
+ <xsl:call-template name="no.home.image"/>
+ </xsl:attribute>
+ </img>
+ </span>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:text>&#160;</xsl:text>
+
+ <xsl:choose>
+ <xsl:when test="$tocfile">
+ <span class="link-text">
+ <a>
+ <xsl:attribute name="href">
+ <xsl:value-of select="$tocfile"/>
+ </xsl:attribute>
+ <img alt="{$text.toc}" border="0">
+ <xsl:attribute name="src">
+ <xsl:call-template name="toc.image"/>
+ </xsl:attribute>
+ </img>
+ </a>
+ </span>
+ </xsl:when>
+ <xsl:otherwise>
+ <span class="no-link-text">
+ <img alt="{$text.toc}" border="0">
+ <xsl:attribute name="src">
+ <xsl:call-template name="no.toc.image"/>
+ </xsl:attribute>
+ </img>
+ </span>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:text>&#160;</xsl:text>
+
+ <xsl:choose>
+ <xsl:when test="$prev">
+ <span class="link-text">
+ <a>
+ <xsl:attribute name="href">
+ <xsl:apply-templates select="$prev" mode="filename"/>
+ </xsl:attribute>
+ <img alt="{$text.prev}" border="0">
+ <xsl:attribute name="src">
+ <xsl:call-template name="prev.image"/>
+ </xsl:attribute>
+ </img>
+ </a>
+ </span>
+ </xsl:when>
+ <xsl:otherwise>
+ <span class="no-link-text">
+ <img alt="{$text.prev}" border="0">
+ <xsl:attribute name="src">
+ <xsl:call-template name="no.prev.image"/>
+ </xsl:attribute>
+ </img>
+ </span>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:text>&#160;</xsl:text>
+
+ <xsl:choose>
+ <xsl:when test="$up">
+ <span class="link-text">
+ <a>
+ <xsl:attribute name="href">
+ <xsl:apply-templates select="$up" mode="filename"/>
+ </xsl:attribute>
+ <img alt="{$text.up}" border="0">
+ <xsl:attribute name="src">
+ <xsl:call-template name="up.image"/>
+ </xsl:attribute>
+ </img>
+ </a>
+ </span>
+ </xsl:when>
+ <xsl:otherwise>
+ <span class="no-link-text">
+ <img alt="{$text.up}" border="0">
+ <xsl:attribute name="src">
+ <xsl:call-template name="no.up.image"/>
+ </xsl:attribute>
+ </img>
+ </span>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:text>&#160;</xsl:text>
+
+ <xsl:choose>
+ <xsl:when test="$next">
+ <span class="link-text">
+ <a>
+ <xsl:attribute name="href">
+ <xsl:apply-templates select="$next" mode="filename"/>
+ </xsl:attribute>
+ <img alt="{$text.next}" border="0">
+ <xsl:attribute name="src">
+ <xsl:call-template name="next.image"/>
+ </xsl:attribute>
+ </img>
+ </a>
+ </span>
+ </xsl:when>
+ <xsl:otherwise>
+ <span class="no-link-text">
+ <img alt="{$text.next}" border="0">
+ <xsl:attribute name="src">
+ <xsl:call-template name="no.next.image"/>
+ </xsl:attribute>
+ </img>
+ </span>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:text>&#160;</xsl:text>
+ </td>
+ </tr>
+ </table>
+ <hr class="top-nav-sep"/>
+ </div>
+</xsl:template>
+
+<xsl:template name="bottom-nav">
+ <xsl:param name="home"/>
+ <xsl:param name="up"/>
+ <xsl:param name="next"/>
+ <xsl:param name="prev"/>
+ <xsl:param name="tocfile" select="$toc.html"/>
+
+ <div class="navfoot">
+ <hr class="bottom-nav-sep"/>
+ <table border="0" width="100%" cellspacing="0" cellpadding="0" summary="Navigation table">
+ <tr>
+ <td align="left" valign="top">
+ <xsl:apply-templates select="/slides/slidesinfo/copyright" mode="slide.footer.mode"/>
+ <xsl:text>&#160;</xsl:text>
+ </td>
+
+ <td align="right" valign="top">
+ <xsl:choose>
+ <xsl:when test="$prev">
+ <span class="link-text">
+ <a>
+ <xsl:attribute name="href">
+ <xsl:apply-templates select="$prev" mode="filename"/>
+ </xsl:attribute>
+ <img alt="{$text.prev}" border="0">
+ <xsl:attribute name="src">
+ <xsl:call-template name="prev.image"/>
+ </xsl:attribute>
+ </img>
+ </a>
+ </span>
+ </xsl:when>
+ <xsl:otherwise>
+ <span class="no-link-text">
+ <img alt="{$text.prev}" border="0">
+ <xsl:attribute name="src">
+ <xsl:call-template name="no.prev.image"/>
+ </xsl:attribute>
+ </img>
+ </span>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:text>&#160;</xsl:text>
+
+ <xsl:choose>
+ <xsl:when test="$next">
+ <span class="link-text">
+ <a>
+ <xsl:attribute name="href">
+ <xsl:apply-templates select="$next" mode="filename"/>
+ </xsl:attribute>
+ <img alt="{$text.next}" border="0">
+ <xsl:attribute name="src">
+ <xsl:call-template name="next.image"/>
+ </xsl:attribute>
+ </img>
+ </a>
+ </span>
+ </xsl:when>
+ <xsl:otherwise>
+ <span class="no-link-text">
+ <img alt="{$text.next}" border="0">
+ <xsl:attribute name="src">
+ <xsl:call-template name="no.next.image"/>
+ </xsl:attribute>
+ </img>
+ </span>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:text>&#160;</xsl:text>
+ </td>
+ </tr>
+ </table>
+ </div>
+</xsl:template>
+
+<!-- Navigation is also provided in the form of links in the head -->
+
+<xsl:template name="links">
+ <xsl:param name="home"/>
+ <xsl:param name="up"/>
+ <xsl:param name="next"/>
+ <xsl:param name="prev"/>
+ <xsl:param name="tocfile" select="$toc.html"/>
+
+ <xsl:if test="$tocfile != ''">
+ <link rel="contents" href="{$tocfile}">
+ <xsl:attribute name="title">
+ <xsl:value-of select="/slides/slidesinfo/title"/>
+ </xsl:attribute>
+ </link>
+ </xsl:if>
+
+ <xsl:if test="$home">
+ <link rel="top">
+ <xsl:attribute name="href">
+ <xsl:apply-templates select="$home" mode="filename"/>
+ </xsl:attribute>
+ <xsl:attribute name="title">
+ <xsl:value-of select="($home/title|$home/slidesinfo/title)[1]"/>
+ </xsl:attribute>
+ </link>
+
+ <link rel="first">
+ <xsl:attribute name="href">
+ <xsl:apply-templates select="$home" mode="filename"/>
+ </xsl:attribute>
+ <xsl:attribute name="title">
+ <xsl:value-of select="($home/title|$home/slidesinfo/title)[1]"/>
+ </xsl:attribute>
+ </link>
+ </xsl:if>
+
+ <xsl:if test="$up">
+ <link rel="up">
+ <xsl:attribute name="href">
+ <xsl:apply-templates select="$up" mode="filename"/>
+ </xsl:attribute>
+ <xsl:attribute name="title">
+ <xsl:value-of select="($up/title|$up/slidesinfo/title)[1]"/>
+ </xsl:attribute>
+ </link>
+ </xsl:if>
+
+ <xsl:if test="$prev">
+ <link rel="previous">
+ <xsl:attribute name="href">
+ <xsl:apply-templates select="$prev" mode="filename"/>
+ </xsl:attribute>
+ <xsl:attribute name="title">
+ <xsl:value-of select="($prev/title|$prev/slidesinfo/title)[1]"/>
+ </xsl:attribute>
+ </link>
+ </xsl:if>
+
+ <xsl:if test="$next">
+ <link rel="next">
+ <xsl:attribute name="href">
+ <xsl:apply-templates select="$next" mode="filename"/>
+ </xsl:attribute>
+ <xsl:attribute name="title">
+ <xsl:value-of select="$next/title"/>
+ </xsl:attribute>
+ </link>
+
+ <xsl:variable name="last" select="$next/following::foil[last()]"/>
+ <xsl:if test="$last">
+ <link rel="last">
+ <xsl:attribute name="href">
+ <xsl:apply-templates select="$last" mode="filename"/>
+ </xsl:attribute>
+ <xsl:attribute name="title">
+ <xsl:value-of select="$last/title"/>
+ </xsl:attribute>
+ </link>
+ </xsl:if>
+ </xsl:if>
+
+ <xsl:for-each select="foil">
+ <link rel="slides">
+ <xsl:attribute name="href">
+ <xsl:apply-templates select="." mode="filename"/>
+ </xsl:attribute>
+ <xsl:attribute name="title">
+ <xsl:value-of select="title[1]"/>
+ </xsl:attribute>
+ </link>
+ </xsl:for-each>
+
+ <xsl:for-each select="foilgroup|../foilgroup">
+ <link rel="section">
+ <xsl:attribute name="href">
+ <xsl:apply-templates select="." mode="filename"/>
+ </xsl:attribute>
+ <xsl:attribute name="title">
+ <xsl:value-of select="title[1]"/>
+ </xsl:attribute>
+ </link>
+ </xsl:for-each>
+</xsl:template>
+
+<!-- ====================================================================== -->
+<!-- There are four kinds of slides: titlepage, toc, foil, and foilgroup -->
+<!-- titlepage -->
+
+<xsl:template match="slidesinfo">
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+
+ <xsl:variable name="next" select="(/slides/foil|/slides/foilgroup)[1]"/>
+ <xsl:variable name="tocfile" select="$toc.html"/>
+ <xsl:variable name="dir">
+ <xsl:call-template name="dbhtml-dir"/>
+ </xsl:variable>
+
+
+ <xsl:call-template name="write.chunk">
+ <xsl:with-param name="indent" select="$output.indent"/>
+ <xsl:with-param name="filename" select="concat($base.dir, $dir, $titlefoil.html)"/>
+ <xsl:with-param name="content">
+ <html>
+ <head>
+ <title><xsl:value-of select="title"/></title>
+
+ <xsl:call-template name="system.head.content">
+ <xsl:with-param name="node" select=".."/>
+ </xsl:call-template>
+
+ <meta name="generator" content="DocBook Slides Stylesheets V{$VERSION}"/>
+
+ <!-- Links -->
+ <xsl:if test="$css.stylesheet != ''">
+ <link type="text/css" rel="stylesheet">
+ <xsl:attribute name="href">
+ <xsl:call-template name="css.stylesheet"/>
+ </xsl:attribute>
+ </link>
+ </xsl:if>
+ <xsl:apply-templates select="/processing-instruction('dbhtml')" mode="css.pi"/>
+
+ <xsl:call-template name="links">
+ <xsl:with-param name="home" select="/slides"/>
+ <xsl:with-param name="next" select="$next"/>
+ <xsl:with-param name="tocfile" select="$tocfile"/>
+ </xsl:call-template>
+
+ <!-- Scripts -->
+
+ <xsl:if test="$overlay != 0 or $keyboard.nav != 0">
+ <script language="javascript" type="text/javascript">
+ <xsl:text> </xsl:text>
+ </script>
+ </xsl:if>
+
+ <xsl:if test="$keyboard.nav != 0">
+ <xsl:call-template name="ua.js"/>
+ <xsl:call-template name="xbDOM.js">
+ <xsl:with-param name="language" select="'javascript'"/>
+ </xsl:call-template>
+ <xsl:call-template name="xbLibrary.js"/>
+ <script language="javascript" type="text/javascript">
+ <xsl:text disable-output-escaping="yes">
+ &lt;!--
+ xblibrary = new xbLibrary('</xsl:text>
+ <xsl:call-template name="script-dir"/>
+ <xsl:text disable-output-escaping="yes">');
+ // --&gt;
+ </xsl:text>
+ </script>
+ <xsl:call-template name="xbStyle.js"/>
+ <xsl:call-template name="xbCollapsibleLists.js"/>
+ <xsl:call-template name="slides.js">
+ <xsl:with-param name="language" select="'javascript'"/>
+ </xsl:call-template>
+ </xsl:if>
+
+ <xsl:if test="$overlay != '0'">
+ <xsl:call-template name="overlay.js">
+ <xsl:with-param name="language" select="'javascript'"/>
+ </xsl:call-template>
+ </xsl:if>
+
+ <xsl:call-template name="user.head.content">
+ <xsl:with-param name="node" select=".."/>
+ </xsl:call-template>
+ </head>
+ <body>
+ <xsl:attribute name="class">
+ <xsl:text>titlepage</xsl:text>
+ <xsl:if test="@role">
+ <xsl:text>-</xsl:text>
+ <xsl:value-of select="@role"/>
+ </xsl:if>
+ </xsl:attribute>
+
+ <xsl:call-template name="body.attributes"/>
+ <xsl:if test="$overlay != 0">
+ <xsl:attribute name="onload">
+ <xsl:text>overlaySetup('lc')</xsl:text>
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:if test="$keyboard.nav != 0">
+ <xsl:attribute name="onkeypress">
+ <xsl:text>navigate(event)</xsl:text>
+ </xsl:attribute>
+ </xsl:if>
+
+ <div class="titlepage" id="{$id}">
+ <xsl:call-template name="titlepage-top-nav">
+ <xsl:with-param name="next" select="$next"/>
+ <xsl:with-param name="tocfile" select="$tocfile"/>
+ </xsl:call-template>
+
+ <div class="titlepage-body">
+ <xsl:call-template name="titlepage-body"/>
+ </div>
+
+ <div id="overlayDiv">
+ <xsl:call-template name="overlayDiv.attributes"/>
+ <xsl:call-template name="titlepage-bottom-nav">
+ <xsl:with-param name="next" select="$next"/>
+ <xsl:with-param name="tocfile" select="$tocfile"/>
+ </xsl:call-template>
+ </div>
+ </div>
+ </body>
+ </html>
+ </xsl:with-param>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template name="titlepage-body">
+ <div class="{name(.)}">
+ <xsl:apply-templates mode="titlepage.mode"/>
+ </div>
+</xsl:template>
+
+<xsl:template name="titlepage-top-nav">
+ <xsl:param name="home"/>
+ <xsl:param name="up"/>
+ <xsl:param name="next"/>
+ <xsl:param name="prev"/>
+ <xsl:param name="tocfile" select="$toc.html"/>
+
+ <xsl:call-template name="top-nav">
+ <xsl:with-param name="home" select="$home"/>
+ <xsl:with-param name="up" select="$up"/>
+ <xsl:with-param name="next" select="$next"/>
+ <xsl:with-param name="prev" select="$prev"/>
+ <xsl:with-param name="tocfile" select="$tocfile"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template name="titlepage-bottom-nav">
+ <xsl:param name="home"/>
+ <xsl:param name="up"/>
+ <xsl:param name="next"/>
+ <xsl:param name="prev"/>
+ <xsl:param name="tocfile" select="$toc.html"/>
+
+ <xsl:call-template name="bottom-nav">
+ <xsl:with-param name="home" select="$home"/>
+ <xsl:with-param name="up" select="$up"/>
+ <xsl:with-param name="next" select="$next"/>
+ <xsl:with-param name="prev" select="$prev"/>
+ <xsl:with-param name="tocfile" select="$tocfile"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="slidesinfo/title">
+ <h1 class="{name(.)}"><xsl:apply-templates/></h1>
+</xsl:template>
+
+<xsl:template match="slidesinfo/authorgroup">
+ <xsl:apply-templates/>
+</xsl:template>
+
+<xsl:template match="slidesinfo/author|slidesinfo/authorgroup/author">
+ <h1 class="{name(.)}"><xsl:apply-imports/></h1>
+</xsl:template>
+
+<xsl:template match="slidesinfo/releaseinfo">
+ <h4 class="{name(.)}"><xsl:apply-templates/></h4>
+</xsl:template>
+
+<xsl:template match="slidesinfo/date">
+ <h4 class="{name(.)}"><xsl:apply-templates/></h4>
+</xsl:template>
+
+<xsl:template match="slidesinfo/copyright">
+ <!-- nop -->
+</xsl:template>
+
+<!-- On slides, output the credits explicitly each time -->
+<xsl:template match="othercredit" mode="titlepage.mode">
+ <xsl:variable name="contrib" select="string(contrib)"/>
+ <xsl:choose>
+ <xsl:when test="contrib">
+ <xsl:call-template name="paragraph">
+ <xsl:with-param name="class" select="name(.)"/>
+ <xsl:with-param name="content">
+ <xsl:apply-templates mode="titlepage.mode" select="contrib"/>
+ <xsl:text>: </xsl:text>
+ <xsl:call-template name="person.name"/>
+ <xsl:apply-templates mode="titlepage.mode" select="./affiliation"/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="paragraph">
+ <xsl:with-param name="class" select="name(.)"/>
+ <xsl:with-param name="content">
+ <xsl:call-template name="person.name"/>
+ </xsl:with-param>
+ </xsl:call-template>
+ <xsl:apply-templates mode="titlepage.mode" select="./affiliation"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ====================================================================== -->
+<!-- toc -->
+
+<xsl:template match="slides" mode="toc">
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+
+ <xsl:variable name="home" select="/slides"/>
+ <xsl:variable name="up" select="/slides"/>
+ <xsl:variable name="next" select="(foil|foilgroup)[1]"/>
+ <xsl:variable name="tocfile" select="''"/>
+ <xsl:variable name="dir"> <!-- MJ: added -->
+ <xsl:call-template name="dbhtml-dir"/>
+ </xsl:variable>
+
+ <xsl:call-template name="write.chunk">
+ <xsl:with-param name="indent" select="$output.indent"/>
+ <xsl:with-param name="filename" select="concat($base.dir, $dir, $toc.html)"/>
+ <xsl:with-param name="content">
+ <html>
+ <head>
+ <title><xsl:value-of select="slidesinfo/title"/></title>
+
+ <xsl:call-template name="system.head.content"/>
+
+ <meta name="generator" content="DocBook Slides Stylesheets V{$VERSION}"/>
+
+ <!-- Links -->
+ <xsl:if test="$css.stylesheet != ''">
+ <link type="text/css" rel="stylesheet">
+ <xsl:attribute name="href">
+ <xsl:call-template name="css.stylesheet"/>
+ </xsl:attribute>
+ </link>
+ </xsl:if>
+ <xsl:apply-templates select="/processing-instruction('dbhtml')" mode="css.pi"/>
+
+ <xsl:call-template name="links">
+ <xsl:with-param name="home" select="$home"/>
+ <xsl:with-param name="up" select="$up"/>
+ <xsl:with-param name="next" select="$next"/>
+ <xsl:with-param name="tocfile" select="$tocfile"/>
+ </xsl:call-template>
+
+ <!-- Scripts -->
+
+ <xsl:if test="$overlay != 0 or $keyboard.nav != 0">
+ <script language="javascript" type="text/javascript">
+ <xsl:text> </xsl:text>
+ </script>
+ </xsl:if>
+
+ <xsl:if test="$keyboard.nav != 0">
+ <xsl:call-template name="ua.js"/>
+ <xsl:call-template name="xbDOM.js">
+ <xsl:with-param name="language" select="'javascript'"/>
+ </xsl:call-template>
+ <xsl:call-template name="xbLibrary.js"/>
+ <script language="javascript" type="text/javascript">
+ <xsl:text disable-output-escaping="yes">
+ &lt;!--
+ xblibrary = new xbLibrary('</xsl:text>
+ <xsl:call-template name="script-dir"/>
+ <xsl:text disable-output-escaping="yes">');
+ // --&gt;
+ </xsl:text>
+ </script>
+ <xsl:call-template name="xbStyle.js"/>
+ <xsl:call-template name="xbCollapsibleLists.js"/>
+ <xsl:call-template name="slides.js">
+ <xsl:with-param name="language" select="'javascript'"/>
+ </xsl:call-template>
+ </xsl:if>
+
+ <xsl:if test="$overlay != '0'">
+ <xsl:call-template name="overlay.js">
+ <xsl:with-param name="language" select="'javascript'"/>
+ </xsl:call-template>
+ </xsl:if>
+
+ <xsl:call-template name="user.head.content"/>
+ </head>
+
+ <body class="tocpage">
+ <xsl:call-template name="body.attributes"/>
+ <xsl:if test="$overlay != 0">
+ <xsl:attribute name="onload">
+ <xsl:text>overlaySetup('lc')</xsl:text>
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:if test="$keyboard.nav != 0">
+ <xsl:attribute name="onkeypress">
+ <xsl:text>navigate(event)</xsl:text>
+ </xsl:attribute>
+ </xsl:if>
+
+ <div id="{$id}">
+ <xsl:call-template name="toc-top-nav">
+ <xsl:with-param name="home" select="$home"/>
+ <xsl:with-param name="up" select="$up"/>
+ <xsl:with-param name="next" select="$next"/>
+ <xsl:with-param name="tocfile" select="$tocfile"/>
+ </xsl:call-template>
+
+ <div class="toc-body">
+ <xsl:call-template name="toc-body"/>
+ </div>
+
+ <div id="overlayDiv">
+ <xsl:call-template name="overlayDiv.attributes"/>
+ <xsl:call-template name="toc-bottom-nav">
+ <xsl:with-param name="home" select="$home"/>
+ <xsl:with-param name="up" select="$up"/>
+ <xsl:with-param name="next" select="$next"/>
+ <xsl:with-param name="tocfile" select="$tocfile"/>
+ </xsl:call-template>
+ </div>
+ </div>
+ </body>
+ </html>
+ </xsl:with-param>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template name="toc-body">
+ <h1 class="title">
+ <a href="{$titlefoil.html}">
+ <xsl:value-of select="/slides/slidesinfo/title"/>
+ </a>
+ </h1>
+
+ <p class="toctitle">
+ <strong xmlns:xslo="http://www.w3.org/1999/XSL/Transform">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key">TableofContents</xsl:with-param>
+ </xsl:call-template>
+ </strong>
+ </p>
+ <dl class="toc">
+ <xsl:apply-templates select="foilgroup|foil" mode="toc"/>
+ </dl>
+</xsl:template>
+
+<xsl:template name="toc-top-nav">
+ <xsl:param name="home" select="/slides"/>
+ <xsl:param name="up"/>
+ <xsl:param name="prev"/>
+ <xsl:param name="next" select="(foil|foilgroup)[1]"/>
+ <xsl:param name="tocfile"/>
+
+ <xsl:call-template name="top-nav">
+ <xsl:with-param name="home" select="$home"/>
+ <xsl:with-param name="up" select="$up"/>
+ <xsl:with-param name="next" select="$next"/>
+ <xsl:with-param name="prev" select="$prev"/>
+ <xsl:with-param name="tocfile" select="$tocfile"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template name="toc-bottom-nav">
+ <xsl:param name="home" select="/slides"/>
+ <xsl:param name="up"/>
+ <xsl:param name="prev"/>
+ <xsl:param name="next" select="(foil|foilgroup)[1]"/>
+ <xsl:param name="tocfile"/>
+
+ <xsl:call-template name="bottom-nav">
+ <xsl:with-param name="home" select="$home"/>
+ <xsl:with-param name="up" select="$up"/>
+ <xsl:with-param name="next" select="$next"/>
+ <xsl:with-param name="prev" select="$prev"/>
+ <xsl:with-param name="tocfile" select="$tocfile"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="foilgroup" mode="toc">
+ <xsl:param name="recursive" select="1"/>
+
+ <dt>
+ <xsl:apply-templates select="." mode="number"/>
+ <xsl:text>. </xsl:text>
+ <a>
+ <xsl:attribute name="href">
+ <xsl:apply-templates select="." mode="filename"/>
+ </xsl:attribute>
+ <xsl:value-of select="title"/>
+ </a>
+ </dt>
+ <xsl:if test="$recursive != 0">
+ <dd>
+ <dl class="toc">
+ <xsl:apply-templates select="foil" mode="toc"/>
+ </dl>
+ </dd>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="foil" mode="toc">
+ <dt>
+ <xsl:apply-templates select="." mode="number"/>
+ <xsl:text>. </xsl:text>
+ <a>
+ <xsl:attribute name="href">
+ <xsl:apply-templates select="." mode="filename"/>
+ </xsl:attribute>
+ <xsl:value-of select="title"/>
+ </a>
+ </dt>
+</xsl:template>
+
+<xsl:template match="title|titleabbrev" mode="toc">
+ <xsl:apply-templates mode="toc"/>
+</xsl:template>
+
+<xsl:template match="speakernotes" mode="toc">
+ <!-- nop -->
+</xsl:template>
+
+<!-- ====================================================================== -->
+<!-- foil -->
+
+<xsl:template match="foil">
+ <xsl:param name="thisfoil">
+ <xsl:apply-templates select="." mode="chunk-filename"/>
+ </xsl:param>
+
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+
+ <xsl:variable name="home" select="/slides"/>
+ <xsl:variable name="up" select="(parent::slides|parent::foilgroup)[1]"/>
+ <xsl:variable name="next" select="(following::foil |following::foilgroup)[1]"/>
+ <xsl:variable name="prev" select="(preceding-sibling::foil[1] |parent::foilgroup[1] |/slides)[last()]"/>
+
+ <xsl:call-template name="write.chunk">
+ <xsl:with-param name="indent" select="$output.indent"/>
+ <xsl:with-param name="filename" select="concat($base.dir, $thisfoil)"/>
+ <xsl:with-param name="content">
+ <html>
+ <head>
+ <title><xsl:value-of select="title"/></title>
+
+ <xsl:call-template name="system.head.content"/>
+
+ <meta name="generator" content="DocBook Slides Stylesheets V{$VERSION}"/>
+
+ <!-- Links -->
+ <xsl:if test="$css.stylesheet != ''">
+ <link type="text/css" rel="stylesheet">
+ <xsl:attribute name="href">
+ <xsl:call-template name="css.stylesheet"/>
+ </xsl:attribute>
+ </link>
+ </xsl:if>
+ <xsl:apply-templates select="/processing-instruction('dbhtml')" mode="css.pi"/>
+
+ <xsl:call-template name="links">
+ <xsl:with-param name="home" select="$home"/>
+ <xsl:with-param name="up" select="$up"/>
+ <xsl:with-param name="next" select="$next"/>
+ <xsl:with-param name="prev" select="$prev"/>
+ </xsl:call-template>
+
+ <!-- Scripts -->
+
+ <xsl:if test="$overlay != 0 or $keyboard.nav != 0">
+ <script language="javascript" type="text/javascript">
+ <xsl:text> </xsl:text>
+ </script>
+ </xsl:if>
+
+ <xsl:if test="$keyboard.nav != 0">
+ <xsl:call-template name="ua.js"/>
+ <xsl:call-template name="xbDOM.js">
+ <xsl:with-param name="language" select="'javascript'"/>
+ </xsl:call-template>
+ <xsl:call-template name="xbLibrary.js"/>
+ <script language="javascript" type="text/javascript">
+ <xsl:text disable-output-escaping="yes">
+ &lt;!--
+ xblibrary = new xbLibrary('</xsl:text>
+ <xsl:call-template name="script-dir"/>
+ <xsl:text disable-output-escaping="yes">');
+ // --&gt;
+ </xsl:text>
+ </script>
+ <xsl:call-template name="xbStyle.js"/>
+ <xsl:call-template name="xbCollapsibleLists.js"/>
+ <xsl:call-template name="slides.js">
+ <xsl:with-param name="language" select="'javascript'"/>
+ </xsl:call-template>
+ </xsl:if>
+
+ <xsl:if test="$overlay != '0'">
+ <xsl:call-template name="overlay.js">
+ <xsl:with-param name="language" select="'javascript'"/>
+ </xsl:call-template>
+ </xsl:if>
+
+ <xsl:call-template name="user.head.content"/>
+ </head>
+ <body>
+ <xsl:attribute name="class">
+ <xsl:value-of select="local-name(.)"/>
+ <xsl:if test="@role">
+ <xsl:text>-</xsl:text>
+ <xsl:value-of select="@role"/>
+ </xsl:if>
+ </xsl:attribute>
+
+ <xsl:call-template name="body.attributes"/>
+ <xsl:if test="$overlay != 0">
+ <xsl:attribute name="onload">
+ <xsl:text>overlaySetup('lc')</xsl:text>
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:if test="$keyboard.nav != 0">
+ <xsl:attribute name="onkeypress">
+ <xsl:text>navigate(event)</xsl:text>
+ </xsl:attribute>
+ </xsl:if>
+
+ <div class="{name(.)}" id="{$id}">
+ <xsl:call-template name="foil-top-nav">
+ <xsl:with-param name="home" select="$home"/>
+ <xsl:with-param name="up" select="$up"/>
+ <xsl:with-param name="next" select="$next"/>
+ <xsl:with-param name="prev" select="$prev"/>
+ </xsl:call-template>
+
+ <div class="foil-body">
+ <xsl:call-template name="foil-body">
+ <xsl:with-param name="home" select="$home"/>
+ <xsl:with-param name="up" select="$up"/>
+ <xsl:with-param name="next" select="$next"/>
+ <xsl:with-param name="prev" select="$prev"/>
+ </xsl:call-template>
+ </div>
+
+ <div id="overlayDiv">
+ <xsl:call-template name="overlayDiv.attributes"/>
+ <xsl:call-template name="foil-bottom-nav">
+ <xsl:with-param name="home" select="$home"/>
+ <xsl:with-param name="up" select="$up"/>
+ <xsl:with-param name="next" select="$next"/>
+ <xsl:with-param name="prev" select="$prev"/>
+ </xsl:call-template>
+ </div>
+ </div>
+
+ <xsl:call-template name="process.footnotes"/>
+ </body>
+ </html>
+ </xsl:with-param>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template name="foil-body">
+ <xsl:param name="home"/>
+ <xsl:param name="up"/>
+ <xsl:param name="next"/>
+ <xsl:param name="prev"/>
+ <xsl:param name="tocfile" select="$toc.html"/>
+ <xsl:apply-templates/>
+</xsl:template>
+
+<xsl:template name="foil-top-nav">
+ <xsl:param name="home"/>
+ <xsl:param name="up"/>
+ <xsl:param name="next"/>
+ <xsl:param name="prev"/>
+ <xsl:param name="tocfile" select="$toc.html"/>
+
+ <xsl:call-template name="top-nav">
+ <xsl:with-param name="home" select="$home"/>
+ <xsl:with-param name="up" select="$up"/>
+ <xsl:with-param name="next" select="$next"/>
+ <xsl:with-param name="prev" select="$prev"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template name="foil-bottom-nav">
+ <xsl:param name="home"/>
+ <xsl:param name="up"/>
+ <xsl:param name="next"/>
+ <xsl:param name="prev"/>
+ <xsl:param name="tocfile" select="$toc.html"/>
+
+ <xsl:call-template name="bottom-nav">
+ <xsl:with-param name="home" select="$home"/>
+ <xsl:with-param name="up" select="$up"/>
+ <xsl:with-param name="next" select="$next"/>
+ <xsl:with-param name="prev" select="$prev"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="foil/title">
+ <h1 class="{name(.)}">
+ <xsl:apply-templates/>
+ </h1>
+</xsl:template>
+
+<!-- ====================================================================== -->
+<!-- foilgroup -->
+
+<xsl:template match="foilgroup">
+ <xsl:param name="thisfoilgroup">
+ <xsl:apply-templates select="." mode="chunk-filename"/>
+ </xsl:param>
+
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+
+ <xsl:variable name="home" select="/slides"/>
+ <xsl:variable name="up" select="(parent::slides|parent::foilgroup)[1]"/>
+ <xsl:variable name="next" select="foil[1]"/>
+ <xsl:variable name="prev" select="(preceding::foil|parent::foilgroup|/slides)[last()]"/>
+
+ <xsl:call-template name="write.chunk">
+ <xsl:with-param name="indent" select="$output.indent"/>
+ <xsl:with-param name="filename" select="concat($base.dir, $thisfoilgroup)"/>
+ <xsl:with-param name="content">
+ <html>
+ <head>
+ <title><xsl:value-of select="title"/></title>
+
+ <xsl:call-template name="system.head.content"/>
+
+ <meta name="generator" content="DocBook Slides Stylesheets V{$VERSION}"/>
+
+ <!-- Links -->
+ <xsl:if test="$css.stylesheet != ''">
+ <link type="text/css" rel="stylesheet">
+ <xsl:attribute name="href">
+ <xsl:call-template name="css.stylesheet"/>
+ </xsl:attribute>
+ </link>
+ </xsl:if>
+ <xsl:apply-templates select="/processing-instruction('dbhtml')" mode="css.pi"/>
+
+ <xsl:call-template name="links">
+ <xsl:with-param name="home" select="$home"/>
+ <xsl:with-param name="up" select="$up"/>
+ <xsl:with-param name="next" select="$next"/>
+ <xsl:with-param name="prev" select="$prev"/>
+ </xsl:call-template>
+
+ <!-- Scripts -->
+
+ <xsl:if test="$overlay != 0 or $keyboard.nav != 0">
+ <script language="javascript" type="text/javascript">
+ <xsl:text> </xsl:text>
+ </script>
+ </xsl:if>
+
+ <xsl:if test="$keyboard.nav != 0">
+ <xsl:call-template name="ua.js"/>
+ <xsl:call-template name="xbDOM.js">
+ <xsl:with-param name="language" select="'javascript'"/>
+ </xsl:call-template>
+ <xsl:call-template name="xbLibrary.js"/>
+ <script language="javascript" type="text/javascript">
+ <xsl:text disable-output-escaping="yes">
+ &lt;!--
+ xblibrary = new xbLibrary('</xsl:text>
+ <xsl:call-template name="script-dir"/>
+ <xsl:text disable-output-escaping="yes">');
+ // --&gt;
+ </xsl:text>
+ </script>
+ <xsl:call-template name="xbStyle.js"/>
+ <xsl:call-template name="xbCollapsibleLists.js"/>
+ <xsl:call-template name="slides.js">
+ <xsl:with-param name="language" select="'javascript'"/>
+ </xsl:call-template>
+ </xsl:if>
+
+ <xsl:if test="$overlay != '0'">
+ <xsl:call-template name="overlay.js">
+ <xsl:with-param name="language" select="'javascript'"/>
+ </xsl:call-template>
+ </xsl:if>
+
+ <xsl:call-template name="user.head.content"/>
+ </head>
+ <body>
+ <xsl:attribute name="class">
+ <xsl:value-of select="local-name(.)"/>
+ <xsl:if test="@role">
+ <xsl:text>-</xsl:text>
+ <xsl:value-of select="@role"/>
+ </xsl:if>
+ </xsl:attribute>
+
+ <xsl:call-template name="body.attributes"/>
+ <xsl:if test="$overlay != 0">
+ <xsl:attribute name="onload">
+ <xsl:text>overlaySetup('lc')</xsl:text>
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:if test="$keyboard.nav != 0">
+ <xsl:attribute name="onkeypress">
+ <xsl:text>navigate(event)</xsl:text>
+ </xsl:attribute>
+ </xsl:if>
+
+ <div class="{name(.)}" id="{$id}">
+ <xsl:call-template name="foilgroup-top-nav">
+ <xsl:with-param name="home" select="$home"/>
+ <xsl:with-param name="up" select="$up"/>
+ <xsl:with-param name="next" select="$next"/>
+ <xsl:with-param name="prev" select="$prev"/>
+ </xsl:call-template>
+
+ <!-- n.b. the foilgroup-body template is responsible for generating -->
+ <!-- the foilgroup toc -->
+ <div class="foilgroup-body">
+ <xsl:call-template name="foilgroup-body">
+ <xsl:with-param name="home" select="$home"/>
+ <xsl:with-param name="up" select="$up"/>
+ <xsl:with-param name="next" select="$next"/>
+ <xsl:with-param name="prev" select="$prev"/>
+ </xsl:call-template>
+ </div>
+
+ <div id="overlayDiv">
+ <xsl:call-template name="overlayDiv.attributes"/>
+ <xsl:call-template name="foilgroup-bottom-nav">
+ <xsl:with-param name="home" select="$home"/>
+ <xsl:with-param name="up" select="$up"/>
+ <xsl:with-param name="next" select="$next"/>
+ <xsl:with-param name="prev" select="$prev"/>
+ </xsl:call-template>
+ </div>
+ </div>
+
+ <xsl:call-template name="process.footnotes"/>
+ </body>
+ </html>
+ </xsl:with-param>
+ </xsl:call-template>
+
+ <xsl:apply-templates select="foil"/>
+</xsl:template>
+
+<xsl:template match="foilgroup/title">
+ <h1 class="{name(.)}"><xsl:apply-templates/></h1>
+</xsl:template>
+
+<xsl:template name="foilgroup-body">
+ <xsl:param name="home"/>
+ <xsl:param name="up"/>
+ <xsl:param name="next"/>
+ <xsl:param name="prev"/>
+ <xsl:param name="tocfile" select="$toc.html"/>
+
+ <xsl:apply-templates select="*[name(.) != 'foil' and name(.) != 'foilgroup']"/>
+
+ <xsl:if test="$foilgroup.toc != 0">
+ <dl class="toc">
+ <xsl:apply-templates select="foil" mode="toc"/>
+ </dl>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template name="foilgroup-top-nav">
+ <xsl:param name="home"/>
+ <xsl:param name="up"/>
+ <xsl:param name="next"/>
+ <xsl:param name="prev"/>
+ <xsl:param name="tocfile" select="$toc.html"/>
+
+ <xsl:call-template name="top-nav">
+ <xsl:with-param name="home" select="$home"/>
+ <xsl:with-param name="up" select="$up"/>
+ <xsl:with-param name="next" select="$next"/>
+ <xsl:with-param name="prev" select="$prev"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template name="foilgroup-bottom-nav">
+ <xsl:param name="home"/>
+ <xsl:param name="up"/>
+ <xsl:param name="next"/>
+ <xsl:param name="prev"/>
+ <xsl:param name="tocfile" select="$toc.html"/>
+
+ <xsl:call-template name="bottom-nav">
+ <xsl:with-param name="home" select="$home"/>
+ <xsl:with-param name="up" select="$up"/>
+ <xsl:with-param name="next" select="$next"/>
+ <xsl:with-param name="prev" select="$prev"/>
+ </xsl:call-template>
+</xsl:template>
+
+<!-- ====================================================================== -->
+
+<xsl:template name="overlayDiv.attributes">
+ <xsl:choose>
+ <xsl:when test="$overlay != 0">
+ <xsl:attribute name="style">
+ <xsl:text>position: absolute; visibility: visible;</xsl:text>
+ </xsl:attribute>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:attribute name="style">padding-top: 2in;</xsl:attribute>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ====================================================================== -->
+
+<xsl:template match="processing-instruction('dbhtml')" mode="css.pi">
+ <xsl:variable name="href">
+ <xsl:call-template name="dbhtml-attribute">
+ <xsl:with-param name="pis" select="."/>
+ <xsl:with-param name="attribute" select="'css-stylesheet'"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:if test="$href!=''">
+ <xsl:choose>
+ <xsl:when test="$href = ''">
+ <!-- nop -->
+ </xsl:when>
+ <xsl:when test="contains($href, '//')">
+ <link type="text/css" rel="stylesheet" href="{$href}"/>
+ </xsl:when>
+ <xsl:when test="starts-with($href, '/')">
+ <link type="text/css" rel="stylesheet" href="{$href}"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <link type="text/css" rel="stylesheet">
+ <xsl:attribute name="href">
+ <xsl:call-template name="css-file">
+ <xsl:with-param name="css" select="$href"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ </link>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:if>
+
+</xsl:template>
+
+<!-- ====================================================================== -->
+
+<xsl:template match="foil" mode="number">
+ <xsl:number count="foil|foilgroup" level="any"/>
+</xsl:template>
+
+<xsl:template match="foilgroup" mode="number">
+ <xsl:number count="foil|foilgroup" level="any"/>
+</xsl:template>
+
+<!-- ====================================================================== -->
+
+<xsl:template match="slides" mode="filename">
+ <xsl:value-of select="$titlefoil.html"/>
+</xsl:template>
+
+<xsl:template match="foil" mode="filename">
+ <xsl:text>foil</xsl:text>
+ <xsl:number count="foil" level="any" format="01"/>
+ <xsl:value-of select="$html.ext"/>
+</xsl:template>
+
+<xsl:template match="foilgroup" mode="filename">
+ <xsl:text>foilgroup</xsl:text>
+ <xsl:number count="foilgroup" level="any" format="01"/>
+ <xsl:value-of select="$html.ext"/>
+</xsl:template>
+
+<!-- ============================================================ -->
+
+<xsl:template match="processing-instruction('Pub')">
+ <xsl:variable name="pidata"><xsl:value-of select="(.)"/></xsl:variable>
+ <xsl:choose>
+ <xsl:when test="contains($pidata,'UDT')"/>
+ <xsl:when test="contains($pidata,'/_font')">
+ <xsl:text disable-output-escaping="yes">&lt;/span&gt;</xsl:text>
+ </xsl:when>
+ <xsl:when test="contains($pidata,'_font')">
+ <xsl:text disable-output-escaping="yes">&lt;span </xsl:text>
+ <xsl:choose>
+ <xsl:when test="contains($pidata,'green')">class="green"</xsl:when>
+ <xsl:when test="contains($pidata,'blue')">class="blue"</xsl:when>
+ <xsl:when test="contains($pidata,'orange')">class="orange"</xsl:when>
+ <xsl:when test="contains($pidata,'red')">class="red"</xsl:when>
+ <xsl:when test="contains($pidata,'brown')">class="brown"</xsl:when>
+ <xsl:when test="contains($pidata,'violet')">class="violet"</xsl:when>
+ <xsl:when test="contains($pidata,'black')">class="black"</xsl:when>
+ <xsl:otherwise>class="bold"</xsl:otherwise>
+ </xsl:choose>
+ <xsl:text disable-output-escaping="yes">&gt;</xsl:text>
+ </xsl:when>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ============================================================ -->
+<!-- blocks -->
+
+<xsl:template match="figure">
+ <div class="{name(.)}">
+ <xsl:apply-imports/>
+ </div>
+ <xsl:if test="following-sibling::*"><hr/></xsl:if>
+</xsl:template>
+
+<xsl:template match="copyright" mode="slide.footer.mode">
+ <span class="{name(.)}">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'Copyright'"/>
+ </xsl:call-template>
+ <xsl:call-template name="gentext.space"/>
+ <xsl:call-template name="dingbat">
+ <xsl:with-param name="dingbat">copyright</xsl:with-param>
+ </xsl:call-template>
+ <xsl:call-template name="gentext.space"/>
+ <xsl:call-template name="copyright.years">
+ <xsl:with-param name="years" select="year"/>
+ <xsl:with-param name="print.ranges" select="$make.year.ranges"/>
+ <xsl:with-param name="single.year.ranges" select="$make.single.year.ranges"/>
+ </xsl:call-template>
+ <xsl:call-template name="gentext.space"/>
+ <xsl:apply-templates select="holder" mode="titlepage.mode"/>
+ </span>
+</xsl:template>
+
+<!-- ============================================================ -->
+<!-- inlines -->
+
+<xsl:template match="link">
+ <xsl:call-template name="link">
+ <xsl:with-param name="a.target" select="'foil'"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="ulink">
+ <a>
+ <xsl:if test="@id">
+ <xsl:attribute name="id"><xsl:value-of select="@id"/></xsl:attribute>
+ </xsl:if>
+ <xsl:attribute name="href"><xsl:value-of select="@url"/></xsl:attribute>
+ <xsl:if test="$ulink.target != ''">
+ <xsl:attribute name="target">
+ <xsl:value-of select="$ulink.target"/>
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:choose>
+ <xsl:when test="count(child::node())=0">
+ <xsl:value-of select="@url"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates/>
+ <xsl:if test="@role='show'">
+ <xsl:text> (</xsl:text>
+ <xsl:value-of select="@url"/>
+ <xsl:text>)</xsl:text>
+ </xsl:if>
+ </xsl:otherwise>
+ </xsl:choose>
+ </a>
+</xsl:template>
+
+<xsl:template match="title/ulink">
+ <a>
+ <xsl:if test="@id">
+ <xsl:attribute name="id"><xsl:value-of select="@id"/></xsl:attribute>
+ </xsl:if>
+ <xsl:attribute name="href"><xsl:value-of select="@url"/></xsl:attribute>
+ <xsl:if test="$ulink.target != ''">
+ <xsl:attribute name="target">
+ <xsl:value-of select="$ulink.target"/>
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:choose>
+ <xsl:when test="count(child::node())=0">
+ <xsl:value-of select="@url"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </a>
+</xsl:template>
+
+<xsl:template match="subtitle">
+ <h2 class="subtitle">
+ <xsl:apply-templates/>
+ </h2>
+</xsl:template>
+
+<xsl:template match="graphic">
+ <center>
+ <!-- can't this be done a better way? -->
+ <xsl:apply-imports/>
+ </center>
+</xsl:template>
+
+<xsl:template match="titleabbrev">
+ <!-- nop -->
+</xsl:template>
+
+<xsl:template match="speakernotes">
+ <!-- nop -->
+</xsl:template>
+
+<!-- ====================================================================== -->
+<!-- Chunking for slides -->
+
+<xsl:template name="chunk">
+ <xsl:param name="node" select="."/>
+ <xsl:choose>
+ <xsl:when test="name($node)='slides'">1</xsl:when>
+ <xsl:when test="name($node)='foilgroup'">1</xsl:when>
+ <xsl:when test="name($node)='foil'">1</xsl:when>
+ <xsl:otherwise>0</xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="*" mode="chunk-filename">
+ <xsl:param name="recursive">0</xsl:param>
+ <!-- returns the filename of a chunk -->
+ <xsl:variable name="ischunk"><xsl:call-template name="chunk"/></xsl:variable>
+ <xsl:variable name="filename">
+ <xsl:call-template name="pi.dbhtml_filename"/>
+ </xsl:variable>
+ <xsl:variable name="dir">
+ <xsl:call-template name="dbhtml-dir"/>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="$ischunk='0'">
+ <!-- if called on something that isn't a chunk, walk up... -->
+ <xsl:choose>
+ <xsl:when test="count(./parent::*)&gt;0">
+ <xsl:apply-templates mode="chunk-filename" select="./parent::*">
+ <xsl:with-param name="recursive" select="$recursive"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <!-- unless there is no up, in which case return "" -->
+ <xsl:otherwise/>
+ </xsl:choose>
+ </xsl:when>
+
+ <xsl:when test="not($recursive) and $filename != ''">
+ <!-- if this chunk has an explicit name, use it -->
+ <xsl:if test="$dir != ''">
+ <xsl:value-of select="$dir"/>
+ <xsl:text>/</xsl:text>
+ </xsl:if>
+ <xsl:value-of select="$filename"/>
+ </xsl:when>
+
+ <xsl:when test="name(.)='foil'">
+ <xsl:variable name="foilnumber">
+ <xsl:number count="foil" level="any"/>
+ </xsl:variable>
+
+ <xsl:value-of select="$dir"/>
+ <xsl:text>foil</xsl:text>
+ <xsl:number value="$foilnumber" format="01"/>
+ <xsl:value-of select="$html.ext"/>
+ </xsl:when>
+
+ <xsl:when test="name(.)='foilgroup'">
+ <xsl:variable name="foilgroupnumber">
+ <xsl:number count="foilgroup" level="any" format="01"/>
+ </xsl:variable>
+
+ <xsl:value-of select="$dir"/>
+ <xsl:text>foilgroup</xsl:text>
+ <xsl:number value="$foilgroupnumber" format="01"/>
+ <xsl:value-of select="$html.ext"/>
+ </xsl:when>
+
+ <xsl:otherwise>
+ <xsl:text>chunk-filename-error-</xsl:text>
+ <xsl:value-of select="name(.)"/>
+ <xsl:number level="any" format="01" from="set"/>
+ <xsl:if test="not($recursive)">
+ <xsl:value-of select="$html.ext"/>
+ </xsl:if>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ====================================================================== -->
+<!-- Handling of xrefs -->
+
+<xsl:template match="foil|foilgroup" mode="xref-to">
+ <xsl:param name="referrer"/>
+ <xsl:param name="xrefstyle"/>
+
+ <xsl:apply-templates select="." mode="object.xref.markup">
+ <xsl:with-param name="purpose" select="'xref'"/>
+ <xsl:with-param name="xrefstyle" select="$xrefstyle"/>
+ <xsl:with-param name="referrer" select="$referrer"/>
+ </xsl:apply-templates>
+</xsl:template>
+
+<!-- ====================================================================== -->
+
+<xsl:template match="@*" mode="copy">
+ <xsl:attribute name="{local-name(.)}">
+ <xsl:value-of select="."/>
+ </xsl:attribute>
+</xsl:template>
+
+<xsl:template xmlns:html="http://www.w3.org/1999/xhtml" match="html:*">
+ <xsl:element name="{local-name(.)}" namespace="http://www.w3.org/1999/xhtml">
+ <xsl:apply-templates select="@*" mode="copy"/>
+ <xsl:apply-templates/>
+ </xsl:element>
+</xsl:template>
+
+<!-- ====================================================================== -->
+
+<xsl:template name="foil.number">
+ <xsl:choose>
+ <xsl:when test="$show.foil.number != 0 and self::foil">
+ <xsl:number count="foil" level="any"/>
+ /
+ <xsl:value-of select="count(//foil)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ &#160;
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/xhtml/tables.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/xhtml/tables.xsl
new file mode 100644
index 0000000..7d5ec6b
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/xhtml/tables.xsl
@@ -0,0 +1,334 @@
+<?xml version="1.0" encoding="ASCII"?>
+<!--This file was created automatically by html2xhtml-->
+<!--from the HTML stylesheets.-->
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1999/xhtml" version="1.0">
+
+<xsl:import href="slides-common.xsl"/>
+
+<xsl:param name="blank.image" select="'blank.png'"/>
+<xsl:param name="arrow.image" select="'pointer.png'"/>
+
+<xsl:param name="toc.bg.color">#6A719C</xsl:param>
+<xsl:param name="toc.width">220</xsl:param>
+
+<xsl:param name="css.stylesheet" select="'slides-table.css'"/>
+
+<!-- ============================================================ -->
+
+<xsl:template name="foilgroup-body">
+ <table border="0" width="100%" summary="Navigation and body table" cellpadding="0" cellspacing="0">
+ <tr>
+ <td width="{$toc.width}" valign="top" align="left">
+ <xsl:if test="$toc.bg.color != ''">
+ <xsl:attribute name="bgcolor">
+ <xsl:value-of select="$toc.bg.color"/>
+ </xsl:attribute>
+ </xsl:if>
+ <div class="ttoc">
+ <xsl:apply-templates select="." mode="t-toc"/>
+ </div>
+ </td>
+ <td>&#160;</td>
+ <td valign="top" align="left">
+ <xsl:if test="$body.bg.color != ''">
+ <xsl:attribute name="bgcolor">
+ <xsl:value-of select="$body.bg.color"/>
+ </xsl:attribute>
+ </xsl:if>
+ <div class="{name(.)}">
+ <xsl:apply-templates select="*[name(.) != 'foil' and name(.) != 'foilgroup']"/>
+ </div>
+
+ <xsl:if test="$foilgroup.toc != 0">
+ <dl class="toc">
+ <xsl:apply-templates select="foil" mode="toc"/>
+ </dl>
+ </xsl:if>
+ </td>
+ </tr>
+ </table>
+</xsl:template>
+
+<xsl:template name="foil-body">
+ <table border="0" width="100%" summary="Navigation and body table" cellpadding="0" cellspacing="0">
+ <tr>
+ <td width="{$toc.width}" valign="top" align="left">
+ <xsl:if test="$toc.bg.color != ''">
+ <xsl:attribute name="bgcolor">
+ <xsl:value-of select="$toc.bg.color"/>
+ </xsl:attribute>
+ </xsl:if>
+ <div class="ttoc">
+ <xsl:apply-templates select="." mode="t-toc"/>
+ </div>
+ </td>
+ <td>&#160;</td>
+ <td valign="top" align="left">
+ <xsl:if test="$body.bg.color != ''">
+ <xsl:attribute name="bgcolor">
+ <xsl:value-of select="$body.bg.color"/>
+ </xsl:attribute>
+ </xsl:if>
+ <div class="{name(.)}">
+ <xsl:apply-templates/>
+ </div>
+ </td>
+ </tr>
+ </table>
+</xsl:template>
+
+<!-- ============================================================ -->
+
+<xsl:template match="foilgroup" mode="t-toc">
+ <xsl:variable name="thisfoilgroup" select="."/>
+
+ <xsl:for-each select="/slides/foil|/slides/foilgroup">
+ <xsl:choose>
+ <xsl:when test="name(.) = 'foilgroup'">
+ <xsl:choose>
+ <xsl:when test="$thisfoilgroup = .">
+ <img alt="+">
+ <xsl:attribute name="src">
+ <xsl:call-template name="graphics-file">
+ <xsl:with-param name="image" select="$arrow.image"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ </img>
+ </xsl:when>
+ <xsl:otherwise>
+ <img alt=" ">
+ <xsl:attribute name="src">
+ <xsl:call-template name="graphics-file">
+ <xsl:with-param name="image" select="$blank.image"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ </img>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <span class="ttoc-foilgroup">
+ <a>
+ <xsl:attribute name="href">
+ <xsl:apply-templates select="." mode="filename"/>
+ </xsl:attribute>
+ <xsl:apply-templates select="." mode="toc-title"/>
+ </a>
+ </span>
+ <br/>
+
+ <xsl:if test="$thisfoilgroup = .">
+ <xsl:for-each select="foil">
+ <img alt=" ">
+ <xsl:attribute name="src">
+ <xsl:call-template name="graphics-file">
+ <xsl:with-param name="image" select="$blank.image"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ </img>
+ <img alt=" ">
+ <xsl:attribute name="src">
+ <xsl:call-template name="graphics-file">
+ <xsl:with-param name="image" select="$blank.image"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ </img>
+
+ <span class="ttoc-foil">
+ <a>
+ <xsl:attribute name="href">
+ <xsl:apply-templates select="." mode="filename"/>
+ </xsl:attribute>
+ <xsl:apply-templates select="." mode="toc-title"/>
+ </a>
+ </span>
+ <br/>
+ </xsl:for-each>
+ </xsl:if>
+ </xsl:when>
+ <xsl:otherwise>
+ <img alt=" ">
+ <xsl:attribute name="src">
+ <xsl:call-template name="graphics-file">
+ <xsl:with-param name="image" select="$blank.image"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ </img>
+ <span class="ttoc-foil">
+ <a>
+ <xsl:attribute name="href">
+ <xsl:apply-templates select="." mode="filename"/>
+ </xsl:attribute>
+ <xsl:apply-templates select="." mode="toc-title"/>
+ </a>
+ </span>
+ <br/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:for-each>
+</xsl:template>
+
+<xsl:template match="foil" mode="t-toc">
+ <xsl:variable name="thisfoil" select="."/>
+
+ <xsl:for-each select="/slides/foil|/slides/foilgroup">
+ <xsl:choose>
+ <xsl:when test="name(.) = 'foilgroup'">
+ <img alt=" ">
+ <xsl:attribute name="src">
+ <xsl:call-template name="graphics-file">
+ <xsl:with-param name="image" select="$blank.image"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ </img>
+ <span class="ttoc-foilgroup">
+ <a>
+ <xsl:attribute name="href">
+ <xsl:apply-templates select="." mode="filename"/>
+ </xsl:attribute>
+ <xsl:apply-templates select="." mode="toc-title"/>
+ </a>
+ </span>
+ <br/>
+
+ <xsl:if test="$thisfoil/ancestor::foilgroup = .">
+ <xsl:for-each select="foil">
+ <img alt=" ">
+ <xsl:attribute name="src">
+ <xsl:call-template name="graphics-file">
+ <xsl:with-param name="image" select="$blank.image"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ </img>
+
+ <xsl:choose>
+ <xsl:when test="$thisfoil = .">
+ <img alt="+">
+ <xsl:attribute name="src">
+ <xsl:call-template name="graphics-file">
+ <xsl:with-param name="image" select="$arrow.image"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ </img>
+ </xsl:when>
+ <xsl:otherwise>
+ <img alt=" ">
+ <xsl:attribute name="src">
+ <xsl:call-template name="graphics-file">
+ <xsl:with-param name="image" select="$blank.image"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ </img>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <span class="ttoc-foil">
+ <a>
+ <xsl:attribute name="href">
+ <xsl:apply-templates select="." mode="filename"/>
+ </xsl:attribute>
+ <xsl:apply-templates select="." mode="toc-title"/>
+ </a>
+ </span>
+ <br/>
+ </xsl:for-each>
+ </xsl:if>
+ </xsl:when>
+ <xsl:otherwise>
+ <!-- foils only -->
+ <xsl:for-each select="/slides/foil">
+ <xsl:choose>
+ <xsl:when test="$thisfoil = .">
+ <img alt="+">
+ <xsl:attribute name="src">
+ <xsl:call-template name="graphics-file">
+ <xsl:with-param name="image" select="$arrow.image"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ </img>
+ </xsl:when>
+ <xsl:otherwise>
+ <img alt=" ">
+ <xsl:attribute name="src">
+ <xsl:call-template name="graphics-file">
+ <xsl:with-param name="image" select="$blank.image"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ </img>
+ </xsl:otherwise>
+ </xsl:choose>
+ <span class="ttoc-foil">
+ <xsl:apply-templates select="." mode="toc-title"/>
+ </span>
+ <br/>
+ </xsl:for-each>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:for-each>
+</xsl:template>
+
+<!-- ============================================================ -->
+
+<xsl:template match="slides" mode="toc-title">
+ <xsl:call-template name="nobreak">
+ <xsl:with-param name="string">
+ <xsl:choose>
+ <xsl:when test="slidesinfo/titleabbrev">
+ <xsl:value-of select="slidesinfo/titleabbrev"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="slidesinfo/title"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:with-param>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="foilgroup" mode="toc-title">
+ <xsl:call-template name="nobreak">
+ <xsl:with-param name="string">
+ <xsl:choose>
+ <xsl:when test="titleabbrev">
+ <xsl:value-of select="titleabbrev"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="title"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:with-param>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="foil" mode="toc-title">
+ <xsl:call-template name="nobreak">
+ <xsl:with-param name="string">
+ <xsl:choose>
+ <xsl:when test="titleabbrev">
+ <xsl:value-of select="titleabbrev"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="title"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:with-param>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template name="nobreak">
+ <xsl:param name="string" select="''"/>
+ <xsl:choose>
+ <xsl:when test="contains($string, ' ')">
+ <xsl:value-of select="substring-before($string, ' ')"/>
+ <xsl:text>&#160;</xsl:text>
+ <xsl:call-template name="nobreak">
+ <xsl:with-param name="string" select="substring-after($string, ' ')"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$string"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ============================================================ -->
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/xhtml/vslides.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/xhtml/vslides.xsl
new file mode 100644
index 0000000..26e9961
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/xhtml/vslides.xsl
@@ -0,0 +1,652 @@
+<?xml version="1.0" encoding="ASCII"?>
+<!--This file was created automatically by html2xhtml-->
+<!--from the HTML stylesheets.-->
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1999/xhtml" version="1.0">
+
+<xsl:import href="slides-common.xsl"/>
+
+<xsl:param name="but-fforward.png" select="'active/but-fforward.png'"/>
+<xsl:param name="but-info.png" select="'active/but-info.png'"/>
+<xsl:param name="but-next.png" select="'active/but-next.png'"/>
+<xsl:param name="but-prev.png" select="'active/but-prev.png'"/>
+<xsl:param name="but-rewind.png" select="'active/but-rewind.png'"/>
+
+<xsl:param name="but-xfforward.png" select="'inactive/but-fforward.png'"/>
+<xsl:param name="but-xinfo.png" select="'inactive/but-info.png'"/>
+<xsl:param name="but-xnext.png" select="'inactive/but-next.png'"/>
+<xsl:param name="but-xprev.png" select="'inactive/but-prev.png'"/>
+<xsl:param name="but-xrewind.png" select="'inactive/but-rewind.png'"/>
+
+<!-- overrides for this stylesheet -->
+<xsl:param name="titlefoil.html" select="concat('index', $html.ext)"/>
+<xsl:param name="toc.width" select="40"/>
+
+<!-- ============================================================ -->
+
+<xsl:template match="slides">
+ <xsl:call-template name="write.chunk">
+ <xsl:with-param name="indent" select="$output.indent"/>
+ <xsl:with-param name="filename" select="concat($base.dir, $toc.html)"/>
+ <xsl:with-param name="content">
+ <html>
+ <head>
+ <title><xsl:value-of select="slidesinfo/title"/></title>
+ <xsl:if test="$css.stylesheet != ''">
+ <link type="text/css" rel="stylesheet">
+ <xsl:attribute name="href">
+ <xsl:call-template name="css.stylesheet"/>
+ </xsl:attribute>
+ </link>
+ </xsl:if>
+ <xsl:apply-templates select="/processing-instruction('dbhtml')" mode="css.pi"/>
+
+ <xsl:call-template name="links">
+ <xsl:with-param name="next" select="/slides"/>
+ <xsl:with-param name="tocfile" select="$toc.html"/>
+ </xsl:call-template>
+
+ <xsl:if test="$keyboard.nav != 0">
+ <script language="javascript" type="text/javascript">
+ <xsl:text> </xsl:text>
+ </script>
+ </xsl:if>
+
+ <xsl:if test="$keyboard.nav != 0">
+ <xsl:call-template name="ua.js"/>
+ <xsl:call-template name="xbDOM.js">
+ <xsl:with-param name="language" select="'javascript'"/>
+ </xsl:call-template>
+ <xsl:call-template name="xbLibrary.js"/>
+ <script language="javascript" type="text/javascript">
+ <xsl:text disable-output-escaping="yes">
+ &lt;!--
+ xblibrary = new xbLibrary('../browser');
+ // --&gt;
+ </xsl:text>
+ </script>
+ <xsl:call-template name="xbStyle.js"/>
+ <xsl:call-template name="xbCollapsibleLists.js"/>
+ <xsl:call-template name="slides.js">
+ <xsl:with-param name="language" select="'javascript'"/>
+ </xsl:call-template>
+ </xsl:if>
+ </head>
+ <body class="tocpage">
+ <xsl:call-template name="body.attributes"/>
+ <xsl:if test="$keyboard.nav != 0">
+ <xsl:attribute name="onkeypress">
+ <xsl:text>navigate(event)</xsl:text>
+ </xsl:attribute>
+ </xsl:if>
+
+ <table border="0" width="100%" summary="Navigation and body table" cellpadding="0" cellspacing="0">
+ <tr>
+ <td>&#160;</td>
+ <td><xsl:apply-templates select="." mode="header"/></td>
+ </tr>
+
+ <tr>
+ <td width="{$toc.width}" valign="top" align="left">
+ <xsl:if test="$toc.bg.color != ''">
+ <xsl:attribute name="bgcolor">
+ <xsl:value-of select="$toc.bg.color"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:call-template name="vertical-navigation">
+ <xsl:with-param name="next" select="/slides"/>
+ <xsl:with-param name="tocfile"/>
+ </xsl:call-template>
+
+ </td>
+ <td valign="top" align="left">
+ <xsl:if test="$body.bg.color != ''">
+ <xsl:attribute name="bgcolor">
+ <xsl:value-of select="$body.bg.color"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <div class="{name(.)}">
+
+ <div class="toc-body">
+ <xsl:call-template name="toc-body"/>
+ </div>
+
+ </div>
+ </td>
+ </tr>
+
+ <tr>
+ <td>&#160;</td>
+ <td><xsl:apply-templates select="." mode="footer"/></td>
+ </tr>
+ </table>
+ </body>
+ </html>
+ </xsl:with-param>
+ </xsl:call-template>
+
+ <xsl:apply-templates/>
+</xsl:template>
+
+<xsl:template match="slidesinfo">
+ <xsl:call-template name="write.chunk">
+ <xsl:with-param name="indent" select="$output.indent"/>
+ <xsl:with-param name="filename" select="concat($base.dir, $titlefoil.html)"/>
+ <xsl:with-param name="content">
+ <html>
+ <head>
+ <title><xsl:value-of select="title"/></title>
+ <xsl:if test="$css.stylesheet != ''">
+ <link type="text/css" rel="stylesheet">
+ <xsl:attribute name="href">
+ <xsl:call-template name="css.stylesheet"/>
+ </xsl:attribute>
+ </link>
+ </xsl:if>
+ <xsl:apply-templates select="/processing-instruction('dbhtml')" mode="css.pi"/>
+
+ <xsl:call-template name="links">
+ <xsl:with-param name="next" select="(/slides/foil|/slides/foilgroup)[1]"/>
+ <xsl:with-param name="tocfile" select="$toc.html"/>
+ </xsl:call-template>
+
+ <xsl:if test="$keyboard.nav != 0">
+ <script language="javascript" type="text/javascript">
+ <xsl:text> </xsl:text>
+ </script>
+ </xsl:if>
+
+ <xsl:if test="$keyboard.nav != 0">
+ <xsl:call-template name="ua.js"/>
+ <xsl:call-template name="xbDOM.js">
+ <xsl:with-param name="language" select="'javascript'"/>
+ </xsl:call-template>
+ <xsl:call-template name="xbLibrary.js"/>
+ <script language="javascript" type="text/javascript">
+ <xsl:text disable-output-escaping="yes">
+ &lt;!--
+ xblibrary = new xbLibrary('../browser');
+ // --&gt;
+ </xsl:text>
+ </script>
+ <xsl:call-template name="xbStyle.js"/>
+ <xsl:call-template name="xbCollapsibleLists.js"/>
+ <xsl:call-template name="slides.js">
+ <xsl:with-param name="language" select="'javascript'"/>
+ </xsl:call-template>
+ </xsl:if>
+ </head>
+ <body class="titlepage">
+ <xsl:call-template name="body.attributes"/>
+ <xsl:if test="$keyboard.nav != 0">
+ <xsl:attribute name="onkeypress">
+ <xsl:text>navigate(event)</xsl:text>
+ </xsl:attribute>
+ </xsl:if>
+
+ <table border="0" width="100%" summary="Navigation and body table" cellpadding="0" cellspacing="0">
+ <tr>
+ <td>&#160;</td>
+ <td><xsl:apply-templates select="." mode="header"/></td>
+ </tr>
+
+ <tr>
+ <td width="{$toc.width}" valign="top" align="left">
+ <xsl:if test="$toc.bg.color != ''">
+ <xsl:attribute name="bgcolor">
+ <xsl:value-of select="$toc.bg.color"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:call-template name="vertical-navigation">
+ <xsl:with-param name="first"/>
+ <xsl:with-param name="last" select="(following::foilgroup|following::foil)[last()]"/>
+ <xsl:with-param name="next" select="(following::foilgroup|following::foil)[1]"/>
+ </xsl:call-template>
+
+ </td>
+ <td valign="top" align="left">
+ <xsl:if test="$body.bg.color != ''">
+ <xsl:attribute name="bgcolor">
+ <xsl:value-of select="$body.bg.color"/>
+ </xsl:attribute>
+ </xsl:if>
+ <div class="{name(.)}">
+ <xsl:apply-templates mode="titlepage.mode"/>
+ </div>
+ </td>
+ </tr>
+
+ <tr>
+ <td>&#160;</td>
+ <td><xsl:apply-templates select="." mode="footer"/></td>
+ </tr>
+ </table>
+ </body>
+ </html>
+ </xsl:with-param>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="foilgroup">
+ <xsl:param name="thisfoilgroup">
+ <xsl:apply-templates select="." mode="filename"/>
+ </xsl:param>
+
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+
+ <xsl:variable name="nextfoil" select="foil[1]"/>
+ <xsl:variable name="lastfoil" select="(descendant::foil|following::foil)[last()]"/>
+ <xsl:variable name="prevfoil" select="(preceding::foil|/slides)[last()]"/>
+
+ <xsl:call-template name="write.chunk">
+ <xsl:with-param name="indent" select="$output.indent"/>
+ <xsl:with-param name="filename" select="concat($base.dir, $thisfoilgroup)"/>
+ <xsl:with-param name="content">
+ <html>
+ <head>
+ <title><xsl:value-of select="title"/></title>
+ <xsl:if test="$css.stylesheet != ''">
+ <link type="text/css" rel="stylesheet">
+ <xsl:attribute name="href">
+ <xsl:call-template name="css.stylesheet"/>
+ </xsl:attribute>
+ </link>
+ </xsl:if>
+ <xsl:apply-templates select="/processing-instruction('dbhtml')" mode="css.pi"/>
+
+ <xsl:call-template name="links">
+ <xsl:with-param name="prev" select="$prevfoil"/>
+ <xsl:with-param name="next" select="$nextfoil"/>
+ </xsl:call-template>
+
+ <xsl:if test="$keyboard.nav != 0">
+ <script language="javascript" type="text/javascript">
+ <xsl:text> </xsl:text>
+ </script>
+ </xsl:if>
+
+ <xsl:if test="$keyboard.nav != 0">
+ <xsl:call-template name="ua.js"/>
+ <xsl:call-template name="xbDOM.js">
+ <xsl:with-param name="language" select="'javascript'"/>
+ </xsl:call-template>
+ <xsl:call-template name="xbLibrary.js"/>
+ <script language="javascript" type="text/javascript">
+ <xsl:text disable-output-escaping="yes">
+ &lt;!--
+ xblibrary = new xbLibrary('../browser');
+ // --&gt;
+ </xsl:text>
+ </script>
+ <xsl:call-template name="xbStyle.js"/>
+ <xsl:call-template name="xbCollapsibleLists.js"/>
+ <xsl:call-template name="slides.js">
+ <xsl:with-param name="language" select="'javascript'"/>
+ </xsl:call-template>
+ </xsl:if>
+ </head>
+ <body class="foilgroup">
+ <xsl:call-template name="body.attributes"/>
+ <xsl:if test="$keyboard.nav != 0">
+ <xsl:attribute name="onkeypress">
+ <xsl:text>navigate(event)</xsl:text>
+ </xsl:attribute>
+ </xsl:if>
+
+ <table border="0" width="100%" summary="Navigation and body table" cellpadding="0" cellspacing="0">
+ <tr>
+ <td>&#160;</td>
+ <td><xsl:apply-templates select="." mode="header"/></td>
+ </tr>
+
+ <tr>
+ <td width="{$toc.width}" valign="top" align="left">
+ <xsl:if test="$toc.bg.color != ''">
+ <xsl:attribute name="bgcolor">
+ <xsl:value-of select="$toc.bg.color"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:call-template name="vertical-navigation">
+ <xsl:with-param name="last" select="$lastfoil"/>
+ <xsl:with-param name="prev" select="$prevfoil"/>
+ <xsl:with-param name="next" select="$nextfoil"/>
+ </xsl:call-template>
+
+ </td>
+ <td valign="top" align="left">
+ <xsl:if test="$body.bg.color != ''">
+ <xsl:attribute name="bgcolor">
+ <xsl:value-of select="$body.bg.color"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <div class="{name(.)}">
+ <xsl:apply-templates/>
+ </div>
+ </td>
+ </tr>
+
+ <tr>
+ <td>&#160;</td>
+ <td><xsl:apply-templates select="." mode="footer"/></td>
+ </tr>
+ </table>
+ </body>
+ </html>
+ </xsl:with-param>
+ </xsl:call-template>
+
+ <xsl:apply-templates select="foil"/>
+</xsl:template>
+
+<xsl:template match="foil">
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+
+ <xsl:variable name="foilgroup" select="ancestor::foilgroup"/>
+
+ <xsl:variable name="thisfoil">
+ <xsl:apply-templates select="." mode="filename"/>
+ </xsl:variable>
+
+ <xsl:variable name="nextfoil" select="(following::foil |following::foilgroup)[1]"/>
+
+ <xsl:variable name="lastfoil" select="following::foil[last()]"/>
+
+ <xsl:variable name="prevfoil" select="(preceding-sibling::foil[1] |parent::foilgroup[1] |/slides)[last()]"/>
+
+ <xsl:call-template name="write.chunk">
+ <xsl:with-param name="indent" select="$output.indent"/>
+ <xsl:with-param name="filename" select="concat($base.dir, $thisfoil)"/>
+ <xsl:with-param name="content">
+ <html>
+ <head>
+ <title><xsl:value-of select="title"/></title>
+ <xsl:if test="$css.stylesheet != ''">
+ <link type="text/css" rel="stylesheet">
+ <xsl:attribute name="href">
+ <xsl:call-template name="css.stylesheet"/>
+ </xsl:attribute>
+ </link>
+ </xsl:if>
+ <xsl:apply-templates select="/processing-instruction('dbhtml')" mode="css.pi"/>
+
+ <xsl:call-template name="links">
+ <xsl:with-param name="prev" select="$prevfoil"/>
+ <xsl:with-param name="next" select="$nextfoil"/>
+ </xsl:call-template>
+
+ <xsl:if test="$keyboard.nav != 0">
+ <script language="javascript" type="text/javascript">
+ <xsl:text> </xsl:text>
+ </script>
+ </xsl:if>
+
+ <xsl:if test="$keyboard.nav != 0">
+ <xsl:call-template name="ua.js"/>
+ <xsl:call-template name="xbDOM.js">
+ <xsl:with-param name="language" select="'javascript'"/>
+ </xsl:call-template>
+ <xsl:call-template name="xbLibrary.js"/>
+ <script language="javascript" type="text/javascript">
+ <xsl:text disable-output-escaping="yes">
+ &lt;!--
+ xblibrary = new xbLibrary('../browser');
+ // --&gt;
+ </xsl:text>
+ </script>
+ <xsl:call-template name="xbStyle.js"/>
+ <xsl:call-template name="xbCollapsibleLists.js"/>
+ <xsl:call-template name="slides.js">
+ <xsl:with-param name="language" select="'javascript'"/>
+ </xsl:call-template>
+ </xsl:if>
+ </head>
+ <body class="foil">
+ <xsl:call-template name="body.attributes"/>
+ <xsl:if test="$keyboard.nav != 0">
+ <xsl:attribute name="onkeypress">
+ <xsl:text>navigate(event)</xsl:text>
+ </xsl:attribute>
+ </xsl:if>
+
+ <table border="0" width="100%" summary="Navigation and body table" cellpadding="0" cellspacing="0">
+ <tr>
+ <td>&#160;</td>
+ <td><xsl:apply-templates select="." mode="header"/></td>
+ </tr>
+
+ <tr>
+ <td width="{$toc.width}" valign="top" align="left">
+ <xsl:if test="$toc.bg.color != ''">
+ <xsl:attribute name="bgcolor">
+ <xsl:value-of select="$toc.bg.color"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:call-template name="vertical-navigation">
+ <xsl:with-param name="last" select="$lastfoil"/>
+ <xsl:with-param name="prev" select="$prevfoil"/>
+ <xsl:with-param name="next" select="$nextfoil"/>
+ </xsl:call-template>
+
+ </td>
+ <td valign="top" align="left">
+ <xsl:if test="$body.bg.color != ''">
+ <xsl:attribute name="bgcolor">
+ <xsl:value-of select="$body.bg.color"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <div class="{name(.)}">
+ <xsl:apply-templates/>
+ </div>
+ </td>
+ </tr>
+
+ <tr>
+ <td>&#160;</td>
+ <td><xsl:apply-templates select="." mode="footer"/></td>
+ </tr>
+ </table>
+ </body>
+ </html>
+ </xsl:with-param>
+ </xsl:call-template>
+</xsl:template>
+
+<!-- ============================================================ -->
+
+<xsl:template match="slidesinfo" mode="header">
+ <div class="navhead">
+ <!-- nop -->
+ </div>
+</xsl:template>
+
+<xsl:template match="foil|foilgroup" mode="header">
+ <div class="navhead">
+ <table border="0" width="100%" summary="Header table" cellpadding="0" cellspacing="0">
+ <tr>
+ <td align="left">
+ <xsl:apply-templates select="/slides/slidesinfo/title" mode="slide.footer.mode"/>
+ </td>
+ <td align="right">
+ <xsl:value-of select="count(preceding::foil) + count(preceding::foilgroup) + count(ancestor::foilgroup) + 1"/>
+ </td>
+ </tr>
+ </table>
+ </div>
+</xsl:template>
+
+<xsl:template match="slidesinfo" mode="footer">
+ <div class="navfoot">
+ <!-- nop -->
+ </div>
+</xsl:template>
+
+<xsl:template match="foil|foilgroup" mode="footer">
+ <div class="navfoot">
+ <table border="0" width="100%" summary="Header table" cellpadding="0" cellspacing="0">
+ <tr>
+ <td align="center">
+ <xsl:text>Slide </xsl:text>
+ <xsl:value-of select="count(preceding::foil) + count(preceding::foilgroup) + count(ancestor::foilgroup) + 1"/>
+ <xsl:text> of </xsl:text>
+ <xsl:value-of select="count(//foil) + count(//foilgroup)"/>
+ </td>
+ </tr>
+ </table>
+ </div>
+</xsl:template>
+
+<xsl:template match="slides" mode="footer"/>
+
+<!-- ============================================================ -->
+
+<xsl:template name="vertical-navigation">
+ <xsl:param name="first" select="/slides"/>
+ <xsl:param name="prev"/>
+ <xsl:param name="last"/>
+ <xsl:param name="next"/>
+ <xsl:param name="tocfile" select="$toc.html"/>
+
+ <div class="vnav">
+ <xsl:choose>
+ <xsl:when test="$first">
+ <a>
+ <xsl:attribute name="href">
+ <xsl:apply-templates select="$first" mode="filename"/>
+ </xsl:attribute>
+ <img border="0" alt="First">
+ <xsl:attribute name="src">
+ <xsl:call-template name="graphics-file">
+ <xsl:with-param name="image" select="$but-rewind.png"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ </img>
+ </a>
+ </xsl:when>
+ <xsl:otherwise>
+ <img alt="First">
+ <xsl:attribute name="src">
+ <xsl:call-template name="graphics-file">
+ <xsl:with-param name="image" select="$but-xrewind.png"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ </img>
+ </xsl:otherwise>
+ </xsl:choose>
+ <br/>
+ <xsl:choose>
+ <xsl:when test="$prev">
+ <a>
+ <xsl:attribute name="href">
+ <xsl:apply-templates select="$prev" mode="filename"/>
+ </xsl:attribute>
+ <img border="0" alt="Previous">
+ <xsl:attribute name="src">
+ <xsl:call-template name="graphics-file">
+ <xsl:with-param name="image" select="$but-prev.png"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ </img>
+ </a>
+ </xsl:when>
+ <xsl:otherwise>
+ <img alt="Previous">
+ <xsl:attribute name="src">
+ <xsl:call-template name="graphics-file">
+ <xsl:with-param name="image" select="$but-xprev.png"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ </img>
+ </xsl:otherwise>
+ </xsl:choose>
+ <br/>
+ <xsl:choose>
+ <xsl:when test="$next">
+ <a>
+ <xsl:attribute name="href">
+ <xsl:apply-templates select="$next" mode="filename"/>
+ </xsl:attribute>
+ <img border="0" alt="Last">
+ <xsl:attribute name="src">
+ <xsl:call-template name="graphics-file">
+ <xsl:with-param name="image" select="$but-next.png"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ </img>
+ </a>
+ </xsl:when>
+ <xsl:otherwise>
+ <img alt="Last">
+ <xsl:attribute name="src">
+ <xsl:call-template name="graphics-file">
+ <xsl:with-param name="image" select="$but-xnext.png"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ </img>
+ </xsl:otherwise>
+ </xsl:choose>
+ <br/>
+ <xsl:choose>
+ <xsl:when test="$last">
+ <a>
+ <xsl:attribute name="href">
+ <xsl:apply-templates select="$last" mode="filename"/>
+ </xsl:attribute>
+ <img border="0" alt="Next">
+ <xsl:attribute name="src">
+ <xsl:call-template name="graphics-file">
+ <xsl:with-param name="image" select="$but-fforward.png"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ </img>
+ </a>
+ </xsl:when>
+ <xsl:otherwise>
+ <img alt="Next">
+ <xsl:attribute name="src">
+ <xsl:call-template name="graphics-file">
+ <xsl:with-param name="image" select="$but-xfforward.png"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ </img>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <br/>
+ <br/>
+
+ <xsl:choose>
+ <xsl:when test="$tocfile != ''">
+ <a href="{$tocfile}">
+ <img border="0" alt="ToC">
+ <xsl:attribute name="src">
+ <xsl:call-template name="graphics-file">
+ <xsl:with-param name="image" select="$but-info.png"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ </img>
+ </a>
+ </xsl:when>
+ <xsl:otherwise>
+ <img border="0" alt="ToC">
+ <xsl:attribute name="src">
+ <xsl:call-template name="graphics-file">
+ <xsl:with-param name="image" select="$but-xinfo.png"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ </img>
+ </xsl:otherwise>
+ </xsl:choose>
+ </div>
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/xhtml/w3c.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/xhtml/w3c.xsl
new file mode 100644
index 0000000..d361a33
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/slides/xhtml/w3c.xsl
@@ -0,0 +1,358 @@
+<?xml version="1.0" encoding="ASCII"?>
+<!--This file was created automatically by html2xhtml-->
+<!--from the HTML stylesheets.-->
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1999/xhtml" version="1.0">
+
+<xsl:import href="slides-common.xsl"/>
+
+<xsl:param name="logo.image.uri" select="''"/>
+<xsl:param name="logo.uri" select="''"/>
+<xsl:param name="logo.title" select="''"/>
+
+<xsl:param name="next.image" select="'active/w3c-next.png'"/>
+<xsl:param name="no.next.image" select="'inactive/w3c-next.png'"/>
+
+<xsl:param name="prev.image" select="'active/w3c-prev.png'"/>
+<xsl:param name="no.prev.image" select="'inactive/w3c-prev.png'"/>
+
+<xsl:param name="toc.image" select="'active/w3c-toc.png'"/>
+<xsl:param name="no.toc.image" select="'inactive/w3c-toc.png'"/>
+
+<xsl:param name="css.stylesheet" select="'slides-w3c.css'"/>
+
+<xsl:template name="logo">
+ <xsl:if test="$logo.uri != ''">
+ <a href="{$logo.uri}" title="{$logo.title}">
+ <xsl:choose>
+ <xsl:when test="$logo.image.uri=''">
+ <xsl:value-of select="$logo.title"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <img src="{$logo.image.uri}" alt="{$logo.title}" border="0"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </a>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template name="overlayDiv.attributes">
+ <xsl:if test="$overlay != 0">
+ <xsl:attribute name="style">
+ <xsl:text>position: absolute; visibility: visible;</xsl:text>
+ </xsl:attribute>
+ </xsl:if>
+</xsl:template>
+
+<!-- ====================================================================== -->
+
+<xsl:template name="top-nav">
+ <xsl:param name="home"/>
+ <xsl:param name="up"/>
+ <xsl:param name="next"/>
+ <xsl:param name="prev"/>
+ <xsl:param name="tocfile" select="$toc.html"/>
+
+ <div class="navhead">
+ <table class="navbar" cellspacing="0" cellpadding="0" border="0" width="97%" summary="Navigation buttons">
+ <tr>
+ <td align="left" valign="top">
+ <xsl:call-template name="logo"/>
+ </td>
+ <td valign="top" nowrap="nowrap" width="150">
+ <div align="right">
+ <xsl:choose>
+ <xsl:when test="$prev">
+ <a rel="previous" accesskey="P">
+ <xsl:attribute name="href">
+ <xsl:apply-templates select="$prev" mode="filename"/>
+ </xsl:attribute>
+ <img border="0" width="32" height="32" alt=" Previous" title="{$prev/title}">
+ <xsl:attribute name="src">
+ <xsl:call-template name="prev.image"/>
+ </xsl:attribute>
+ </img>
+ </a>
+ </xsl:when>
+ <xsl:otherwise>
+ <img border="0" width="32" height="32" alt=" Previous" title="">
+ <xsl:attribute name="src">
+ <xsl:call-template name="no.prev.image"/>
+ </xsl:attribute>
+ </img>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:choose>
+ <xsl:when test="$tocfile != ''">
+ <a rel="contents" href="{$tocfile}" accesskey="C">
+ <img border="0" width="32" height="32" alt=" Contents" title="Table of Contents">
+ <xsl:attribute name="src">
+ <xsl:call-template name="toc.image"/>
+ </xsl:attribute>
+ </img>
+ </a>
+ </xsl:when>
+ <xsl:otherwise>
+ <img border="0" width="32" height="32" alt=" Contents" title="Table of Contents">
+ <xsl:attribute name="src">
+ <xsl:call-template name="no.toc.image"/>
+ </xsl:attribute>
+ </img>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:choose>
+ <xsl:when test="$next">
+ <a rel="next" accesskey="N">
+ <xsl:attribute name="href">
+ <xsl:apply-templates select="$next" mode="filename"/>
+ </xsl:attribute>
+ <img border="0" width="32" height="32" alt=" Next" title="{$next/title}">
+ <xsl:attribute name="src">
+ <xsl:call-template name="next.image"/>
+ </xsl:attribute>
+ </img>
+ </a>
+ </xsl:when>
+ <xsl:otherwise>
+ <img border="0" width="32" height="32" alt=" Next" title="">
+ <xsl:attribute name="src">
+ <xsl:call-template name="no.next.image"/>
+ </xsl:attribute>
+ </img>
+ </xsl:otherwise>
+ </xsl:choose>
+ </div>
+ </td>
+ </tr>
+ </table>
+
+ <xsl:apply-templates select="title"/>
+ <hr class="top-nav-sep"/>
+ </div>
+</xsl:template>
+
+<xsl:template name="bottom-nav">
+ <xsl:param name="home"/>
+ <xsl:param name="up"/>
+ <xsl:param name="next"/>
+ <xsl:param name="prev"/>
+ <xsl:param name="tocfile" select="$toc.html"/>
+
+ <div class="navfoot">
+ <hr class="bottom-nav-sep"/>
+ <table class="footer" cellspacing="0" cellpadding="0" border="0" width="97%" summary="footer">
+ <tr>
+ <td align="left" valign="top">
+ <xsl:variable name="author" select="(/slides/slidesinfo//author |/slides/slidesinfo//editor)"/>
+ <xsl:for-each select="$author">
+ <xsl:choose>
+ <xsl:when test=".//email">
+ <a href="mailto:{.//email[1]}">
+ <xsl:call-template name="person.name"/>
+ </a>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="person.name"/>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:if test="position() &lt; last()">, </xsl:if>
+ </xsl:for-each>
+ </td>
+ <td align="right" valign="top">
+ <span class="index">
+ <xsl:value-of select="count(preceding::foil) + count(preceding::foilgroup) + count(ancestor::foilgroup) + 1"/>
+ <xsl:text> of </xsl:text>
+ <xsl:value-of select="count(//foil|//foilgroup)"/>
+ </span>
+ </td>
+
+ <td valign="top" nowrap="nowrap" width="150">
+ <div align="right">
+ <xsl:choose>
+ <xsl:when test="$prev">
+ <a rel="previous" accesskey="P">
+ <xsl:attribute name="href">
+ <xsl:apply-templates select="$prev" mode="filename"/>
+ </xsl:attribute>
+ <img border="0" width="32" height="32" alt=" Previous" title="{$prev/title}">
+ <xsl:attribute name="src">
+ <xsl:call-template name="prev.image"/>
+ </xsl:attribute>
+ </img>
+ </a>
+ </xsl:when>
+ <xsl:otherwise>
+ <img border="0" width="32" height="32" alt=" Prev" title="">
+ <xsl:attribute name="src">
+ <xsl:call-template name="no.prev.image"/>
+ </xsl:attribute>
+ </img>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:choose>
+ <xsl:when test="$next">
+ <a rel="next" accesskey="N">
+ <xsl:attribute name="href">
+ <xsl:apply-templates select="$next" mode="filename"/>
+ </xsl:attribute>
+ <img border="0" width="32" height="32" alt=" Next" title="{$next/title}">
+ <xsl:attribute name="src">
+ <xsl:call-template name="next.image"/>
+ </xsl:attribute>
+ </img>
+ </a>
+ </xsl:when>
+ <xsl:otherwise>
+ <img border="0" width="32" height="32" alt=" Next" title="">
+ <xsl:attribute name="src">
+ <xsl:call-template name="no.next.image"/>
+ </xsl:attribute>
+ </img>
+ </xsl:otherwise>
+ </xsl:choose>
+ </div>
+ </td>
+ </tr>
+ </table>
+ </div>
+</xsl:template>
+
+<!-- ====================================================================== -->
+
+<xsl:template name="titlepage-top-nav">
+ <xsl:param name="home"/>
+ <xsl:param name="up"/>
+ <xsl:param name="next"/>
+ <xsl:param name="prev"/>
+ <xsl:param name="tocfile" select="$toc.html"/>
+
+ <div class="navhead">
+ <table class="navbar" cellspacing="0" cellpadding="0" border="0" width="97%" summary="Navigation buttons">
+ <tr>
+ <td align="left" valign="top">
+ <xsl:call-template name="logo"/>
+ </td>
+ <td valign="top" nowrap="nowrap" width="150">
+ <div align="right">
+ <xsl:choose>
+ <xsl:when test="$prev">
+ <a rel="previous" accesskey="P">
+ <xsl:attribute name="href">
+ <xsl:apply-templates select="$prev" mode="filename"/>
+ </xsl:attribute>
+ <img border="0" width="32" height="32" alt=" Previous" title="{$prev/title}">
+ <xsl:attribute name="src">
+ <xsl:call-template name="prev.image"/>
+ </xsl:attribute>
+ </img>
+ </a>
+ </xsl:when>
+ <xsl:otherwise>
+ <img border="0" width="32" height="32" alt=" Previous" title="">
+ <xsl:attribute name="src">
+ <xsl:call-template name="no.prev.image"/>
+ </xsl:attribute>
+ </img>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:choose>
+ <xsl:when test="$tocfile != ''">
+ <a rel="contents" href="{$tocfile}" accesskey="C">
+ <img border="0" width="32" height="32" alt=" Contents" title="Table of Contents">
+ <xsl:attribute name="src">
+ <xsl:call-template name="toc.image"/>
+ </xsl:attribute>
+ </img>
+ </a>
+ </xsl:when>
+ <xsl:otherwise>
+ <img border="0" width="32" height="32" alt=" Contents" title="Table of Contents">
+ <xsl:attribute name="src">
+ <xsl:call-template name="no.toc.image"/>
+ </xsl:attribute>
+ </img>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:choose>
+ <xsl:when test="$next">
+ <a rel="next" accesskey="N">
+ <xsl:attribute name="href">
+ <xsl:apply-templates select="$next" mode="filename"/>
+ </xsl:attribute>
+ <img border="0" width="32" height="32" alt=" Next" title="{$next/title}">
+ <xsl:attribute name="src">
+ <xsl:call-template name="next.image"/>
+ </xsl:attribute>
+ </img>
+ </a>
+ </xsl:when>
+ <xsl:otherwise>
+ <img border="0" width="32" height="32" alt=" Next" title="">
+ <xsl:attribute name="src">
+ <xsl:call-template name="no.next.image"/>
+ </xsl:attribute>
+ </img>
+ </xsl:otherwise>
+ </xsl:choose>
+ </div>
+ </td>
+ </tr>
+ </table>
+
+ <hr class="top-nav-sep"/>
+ </div>
+</xsl:template>
+
+<!-- ====================================================================== -->
+
+<xsl:template name="foil-body">
+ <xsl:param name="home"/>
+ <xsl:param name="up"/>
+ <xsl:param name="next"/>
+ <xsl:param name="prev"/>
+ <xsl:param name="tocfile" select="$toc.html"/>
+
+ <!-- skip the title -->
+ <xsl:apply-templates select="*[name(.) != 'title']"/>
+</xsl:template>
+
+<xsl:template name="foilgroup-body">
+ <xsl:param name="home"/>
+ <xsl:param name="up"/>
+ <xsl:param name="next"/>
+ <xsl:param name="prev"/>
+ <xsl:param name="tocfile" select="$toc.html"/>
+
+ <!-- skip the title -->
+ <xsl:apply-templates select="*[name(.) != 'title' and name(.) != 'foil' and name(.) != 'foilgroup']"/>
+
+ <xsl:if test="$foilgroup.toc != 0">
+ <dl class="toc">
+ <xsl:apply-templates select="foil" mode="toc"/>
+ </dl>
+ </xsl:if>
+</xsl:template>
+
+<!-- ====================================================================== -->
+
+<xsl:template match="@*" mode="copy">
+ <xsl:attribute name="{local-name(.)}">
+ <xsl:value-of select="."/>
+ </xsl:attribute>
+</xsl:template>
+
+<xsl:template xmlns:html="http://www.w3.org/1999/xhtml" match="html:*">
+ <xsl:element name="{local-name(.)}" namespace="http://www.w3.org/1999/xhtml">
+ <xsl:apply-templates select="@*" mode="copy"/>
+ <xsl:apply-templates/>
+ </xsl:element>
+</xsl:template>
+
+<!-- ====================================================================== -->
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/template/titlepage.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/template/titlepage.xml
new file mode 100644
index 0000000..f1e1e3c
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/template/titlepage.xml
@@ -0,0 +1,478 @@
+<?xml version="1.0"?>
+
+<reference xml:id="template"><?dbhtml dir="template"?><?dbhtml filename="index.html"?>
+
+
+ <info>
+ <title>Titlepage Template Stylesheet Reference</title>
+ <releaseinfo role="meta">
+ $Id: titlepage.xsl 7058 2007-07-17 13:59:29Z xmldoc $
+ </releaseinfo>
+ </info>
+ <partintro xml:id="intro_partintro">
+ <title>Introduction</title>
+
+<para>This is technical reference documentation for the
+ “titlepage†templates in the DocBook XSL Stylesheets.</para>
+
+
+<para>This is not intended to be user documentation. It is
+ provided for developers writing customization layers for the
+ stylesheets.</para>
+
+ </partintro>
+
+<refentry xmlns:xlink="http://www.w3.org/1999/xlink" xml:id="templates">
+<refnamediv>
+<refname>t:templates</refname>
+<refpurpose>Construct a stylesheet for the templates provided</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+<synopsis>&lt;xsl:template match="t:templates"/&gt;</synopsis>
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>The <literal>t:templates</literal> element is the root of a
+set of templates. This template creates an appropriate
+<literal>xsl:stylesheet</literal> for the templates.</para>
+
+
+
+<para>If the <literal>t:templates</literal> element has a
+<literal>base-stylesheet</literal> attribute, an
+<literal>xsl:import</literal> statement is constructed for it.</para>
+
+</refsect1></refentry>
+
+<refentry xmlns:xlink="http://www.w3.org/1999/xlink" xml:id="star">
+<refnamediv>
+<refname>xsl:*</refname>
+<refpurpose>Copy xsl: elements straight through</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+<synopsis>&lt;xsl:template match="xsl:*"/&gt;</synopsis>
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>This template simply copies the xsl: elements
+straight through into the result tree.</para>
+
+</refsect1></refentry>
+
+<refentry xmlns:xlink="http://www.w3.org/1999/xlink" xml:id="titlepage">
+<refnamediv>
+<refname>t:titlepage</refname>
+<refpurpose>Create the templates necessary to construct a title page</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+<synopsis>&lt;xsl:template match="t:titlepage"/&gt;</synopsis>
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>The <literal>t:titlepage</literal> element creates a set of
+templates for processing the titlepage for an element. The
+<quote>root</quote> of this template set is the template named
+<quote><literal>wrapper.titlepage</literal></quote>. That is the
+template that should be called to generate the title page.
+</para>
+
+
+
+<para>The <literal>t:titlepage</literal> element has three attributes:
+
+
+<variablelist>
+<varlistentry><term>element</term>
+<listitem>
+<para>The name of the source document element for which
+these templates apply. In other words, to make a title page for the
+<tag>article</tag> element, set the
+<tag class="attribute">element</tag> attribute to
+<quote><literal>article</literal></quote>. This attribute is required.
+</para>
+</listitem>
+</varlistentry>
+<varlistentry><term>wrapper</term>
+<listitem>
+<para>The entire title page can be wrapped with an element.
+This attribute identifies that element.
+</para>
+</listitem>
+</varlistentry>
+<varlistentry><term>class</term>
+<listitem>
+<para>If the <tag class="attribute">class</tag> attribute
+is set, a <tag class="attribute">class</tag> attribute with this
+value will be added to the wrapper element that surrounds the entire
+title page.
+</para>
+</listitem>
+</varlistentry>
+</variablelist>
+
+</para>
+
+
+
+<para>Any other attributes are copied through literally to the
+wrapper element.</para>
+
+
+
+<para>The content of a <literal>t:titlepage</literal> is one or
+more <literal>t:titlepage-content</literal>,
+<literal>t:titlepage-separator</literal>, and
+<literal>t:titlepage-before</literal> elements.</para>
+
+
+
+<para>Each of these elements may be provided for the <quote>recto</quote>
+and <quote>verso</quote> sides of the title page.</para>
+
+
+</refsect1></refentry>
+
+<refentry xmlns:xlink="http://www.w3.org/1999/xlink" xml:id="attr_star_in_copy.literal.atts">
+<refnamediv>
+<refname>@* (in copy.literal.atts mode)</refname>
+<refpurpose>Copy t:titlepage attributes</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+<synopsis>&lt;xsl:template match="@*" mode="copy.literal.atts"/&gt;</synopsis>
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>This template copies all of the <quote>other</quote> attributes
+from a <literal>t:titlepage</literal> element onto the specified
+wrapper.</para>
+
+</refsect1></refentry>
+
+<refentry xmlns:xlink="http://www.w3.org/1999/xlink" xml:id="titlepage-content">
+<refnamediv>
+<refname>t:titlepage-content</refname>
+<refpurpose>Create templates for the content of one side of a title page</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+<synopsis>&lt;xsl:template match="t:titlepage-content"/&gt;</synopsis>
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>The title page content, that is, the elements from the source
+document that are rendered on the title page, can be controlled independently
+for the recto and verso sides of the title page.</para>
+
+
+
+<para>The <literal>t:titlepage-content</literal> element has two attributes:
+
+
+<variablelist>
+<varlistentry><term>side</term>
+<listitem>
+<para>Identifies the side of the page to which this title
+page content applies. The
+<tag class="attribute">side</tag> attribute is required and
+must be set to either
+<quote><literal>recto</literal></quote> or
+<quote><literal>verso</literal></quote>. In addition, you must specify
+exactly one <literal>t:titlepage-content</literal> for each side
+within each <literal>t:titlepage</literal>.</para>
+
+</listitem>
+</varlistentry>
+<varlistentry><term>order</term>
+<listitem>
+<para>Indicates how the order of the elements presented on
+the title page is determined. If the
+<tag class="attribute">order</tag> is
+<quote><literal>document</literal></quote>, the elements are presented
+in document order. Otherwise (if the
+<tag class="attribute">order</tag> is
+<quote><literal>stylesheet</literal></quote>), the elements are presented
+in the order that they appear in the template (and consequently in
+the stylesheet).</para>
+
+</listitem>
+</varlistentry>
+</variablelist>
+
+</para>
+
+
+
+<para>The content of a <literal>t:titlepage-content</literal> element is
+a list of element names. These names should be unqualified. They identify
+the elements in the source document that should appear on the title page.
+</para>
+
+
+
+<para>Each element may have a single attribute:
+<tag class="attribute">predicate</tag>. The value of this
+attribute is used as a predicate for the expression that matches
+the element on which it occurs.</para>
+
+
+
+<para>In other words, to put only the first three authors on the
+recto-side of a title
+page, you could specify:
+
+<screen>
+ &lt;t:titlepage-contents side="recto"&gt;
+ &lt;!-- other titlepage elements --&gt;
+ &lt;author predicate="[count(previous-sibling::author)&lt;2]"/&gt;
+ &lt;!-- other titlepage elements --&gt;
+ &lt;/t:titlepage-contents&gt;
+</screen>
+</para>
+
+
+
+<para>Usually, the elements so named are empty. But it is possible to
+make one level of selection within them. Suppose that you want to
+process <literal>authorgroup</literal> elements on the title page, but
+you want to select only proper authors, editors, or corporate authors,
+not collaborators or other credited authors.</para>
+
+
+
+<para>In that case, you can put a <literal>t:or</literal> group inside
+the <literal>authorgroup</literal> element:
+
+<screen>
+ &lt;t:titlepage-contents side="recto"&gt;
+ &lt;!-- other titlepage elements --&gt;
+ &lt;authorgroup&gt;
+ &lt;t:or&gt;
+ &lt;author/&gt;
+ &lt;editor/&gt;
+ &lt;corpauthor/&gt;
+ &lt;/t:or&gt;
+ &lt;/authorgroup&gt;
+ &lt;!-- other titlepage elements --&gt;
+ &lt;/t:titlepage-contents&gt;
+</screen>
+</para>
+
+
+
+<para>This will have the effect of automatically generating a template
+for processing <literal>authorgroup</literal>s in the title page mode,
+selecting only the specified children. If you need more complex processing,
+you'll have to construct the templates by hand.</para>
+
+
+</refsect1></refentry>
+
+<refentry xmlns:xlink="http://www.w3.org/1999/xlink" xml:id="titlepage-separator">
+<refnamediv>
+<refname>t:titlepage-separator</refname>
+<refpurpose>Create templates for the separator</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+<synopsis>&lt;xsl:template match="t:titlepage-separator"/&gt;</synopsis>
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>The title page is separated from the content which follows it by
+the markup specified in the <literal>t:titlepage-separator</literal>
+element.</para>
+
+</refsect1></refentry>
+
+<refentry xmlns:xlink="http://www.w3.org/1999/xlink" xml:id="titlepage-before">
+<refnamediv>
+<refname>t:titlepage-before</refname>
+<refpurpose>Create templates for what precedes a title page</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+<synopsis>&lt;xsl:template match="t:titlepage-before"/&gt;</synopsis>
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>Each side of the title page is preceded by the markup specified
+in the <literal>t:titlepage-before</literal> element for that
+side.</para>
+
+</refsect1></refentry>
+
+<refentry xmlns:xlink="http://www.w3.org/1999/xlink" xml:id="star_in_copy">
+<refnamediv>
+<refname>* (in copy mode)</refname>
+<refpurpose>Copy elements</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+<synopsis>&lt;xsl:template match="*" mode="copy"/&gt;</synopsis>
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>This template simply copies the elements that it applies to
+straight through into the result tree.</para>
+
+</refsect1></refentry>
+
+<refentry xmlns:xlink="http://www.w3.org/1999/xlink" xml:id="attr_star_in_copy">
+<refnamediv>
+<refname>@* (in copy mode)</refname>
+<refpurpose>Copy attributes</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+<synopsis>&lt;xsl:template match="@*" mode="copy"/&gt;</synopsis>
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>This template simply copies the attributes that it applies to
+straight through into the result tree.</para>
+
+</refsect1></refentry>
+
+<refentry xmlns:xlink="http://www.w3.org/1999/xlink" xml:id="attr_star_in_document.order">
+<refnamediv>
+<refname>* (in document.order mode)</refname>
+<refpurpose>Create rules to process titlepage elements in document order</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+<synopsis>&lt;xsl:template match="*" mode="document.order"/&gt;</synopsis>
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>This template is called to process all of the children of the
+<literal>t:titlepage-content</literal> element. It creates the hairy
+select expression necessary to process each of those elements in
+the title page.</para>
+
+
+
+<para>Note that this template automatically handles the case where
+some DocBook elements, like title and subtitle, can occur both inside
+the *info elements where metadata is usually stored and outside.
+</para>
+
+
+
+<para>It also automatically calculates the name for the *info container
+and handles elements that have historically had containers with different
+names.</para>
+
+
+</refsect1></refentry>
+
+<refentry xmlns:xlink="http://www.w3.org/1999/xlink" xml:id="star_in_document.order">
+<refnamediv>
+<refname>* (in document.order mode)</refname>
+<refpurpose>Create rules to process titlepage elements in stylesheet order</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+<synopsis>&lt;xsl:template match="*" mode="document.order"/&gt;</synopsis>
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>This template is called to process all of the children of the
+<literal>t:titlepage-content</literal> element. It creates the set
+of <literal>xsl:apply-templates</literal> elements necessary
+process each of those elements in the title page.</para>
+
+
+
+<para>Note that this template automatically handles the case where
+some DocBook elements, like title and subtitle, can occur both inside
+the *info elements where metadata is usually stored and outside.
+</para>
+
+
+
+<para>It also automatically calculates the name for the *info container
+and handles elements that have historically had containers with different
+names.</para>
+
+
+</refsect1></refentry>
+
+<refentry xmlns:xlink="http://www.w3.org/1999/xlink" xml:id="star_in_titlepage.specialrules">
+<refnamediv>
+<refname>* (in titlepage.specialrules mode)</refname>
+<refpurpose>Create templates for special rules</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+<synopsis>&lt;xsl:template match="*" mode="titlepage.specialrules"/&gt;</synopsis>
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>This template is called to process all of the descendants of the
+<literal>t:titlepage-content</literal> element that require special
+processing. At present, that's just <literal>t:or</literal> elements.
+</para>
+
+</refsect1></refentry>
+
+<refentry xmlns:xlink="http://www.w3.org/1999/xlink" xml:id="star_in_titlepage.subrules">
+<refnamediv>
+<refname>* (in titlepage.subrules mode)</refname>
+<refpurpose>Create template for individual special rules</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+<synopsis>&lt;xsl:template match="*" mode="titlepage.subrules"/&gt;</synopsis>
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>This template is called to process the children of special
+template elements.
+</para>
+
+</refsect1></refentry>
+
+<refentry xmlns:xlink="http://www.w3.org/1999/xlink" xml:id="or">
+<refnamediv>
+<refname>t:or</refname>
+<refpurpose>Process the t:or special rule</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+<synopsis>&lt;xsl:template match="t:or"/&gt;&lt;xsl:template match="t:or" mode="titlepage.subrules"/&gt;</synopsis>
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>This template processes t:or.</para>
+
+</refsect1></refentry>
+
+<refentry xmlns:xlink="http://www.w3.org/1999/xlink" xml:id="or_in_titlepage.subrules">
+<refnamediv>
+<refname>t:or (in titlepage.subrules mode)</refname>
+<refpurpose>Process the t:or special rule in
+titlepage.subrules mode</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+<synopsis>&lt;xsl:template match="t:or" mode="titlepage.subrules"/&gt;</synopsis>
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>The titlepage.subrules mode doesn't apply to t:or, so just
+reprocess this node in the normal mode.</para>
+
+</refsect1></refentry>
+
+<refentry xmlns:xlink="http://www.w3.org/1999/xlink" xml:id="template.element-or-list">
+<refnamediv>
+<refname>element-or-list</refname>
+<refpurpose>Construct the "or-list" used in the select attribute for
+special rules.</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+<synopsis>&lt;xsl:template name="element-or-list"&gt;
+&lt;xsl:param name="elements" select="*"/&gt;
+&lt;xsl:param name="element.count" select="count($elements)"/&gt;
+&lt;xsl:param name="count" select="1"/&gt;
+&lt;xsl:param name="orlist"/&gt;
+ ...
+&lt;/xsl:template&gt;</synopsis>
+</refsynopsisdiv>
+<refsect1><title>Description</title>
+
+<para>Walk through each of the children of t:or, producing the
+text of the select attribute.</para>
+
+</refsect1></refentry>
+</reference>
+
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/template/titlepage.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/template/titlepage.xsl
new file mode 100644
index 0000000..ce147e3
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/template/titlepage.xsl
@@ -0,0 +1,1280 @@
+<?xml version='1.0'?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:t="http://nwalsh.com/docbook/xsl/template/1.0"
+ xmlns:param="http://nwalsh.com/docbook/xsl/template/1.0/param"
+ xmlns:doc="http://nwalsh.com/xsl/documentation/1.0"
+ xmlns:fo="http://www.w3.org/1999/XSL/Format"
+ xmlns:exsl="http://exslt.org/common"
+ exclude-result-prefixes="doc t param exsl"
+ version='1.0'>
+
+<!-- ********************************************************************
+ $Id: titlepage.xsl 7058 2007-07-17 13:59:29Z xmldoc $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<!-- ==================================================================== -->
+
+<xsl:template match="/">
+ <xsl:text>&#x0a;</xsl:text>
+ <xsl:apply-templates/>
+ <xsl:text>&#x0a;</xsl:text>
+</xsl:template>
+
+<doc:reference xmlns="" xml:id="template">
+ <?dbhtml dir="template"?>
+ <?dbhtml filename="index.html"?>
+ <info>
+ <title>Titlepage Template Stylesheet Reference</title>
+ <releaseinfo role="meta">
+ $Id: titlepage.xsl 7058 2007-07-17 13:59:29Z xmldoc $
+ </releaseinfo>
+ </info>
+ <partintro xml:id="intro_partintro">
+ <title>Introduction</title>
+ <para>This is technical reference documentation for the
+ “titlepage†templates in the DocBook XSL Stylesheets.</para>
+ <para>This is not intended to be user documentation. It is
+ provided for developers writing customization layers for the
+ stylesheets.</para>
+ </partintro>
+</doc:reference>
+
+<!-- ==================================================================== -->
+
+<xsl:preserve-space elements="*"/>
+<xsl:strip-space elements="xsl:* t:*"/>
+
+<!-- ==================================================================== -->
+
+<doc:template match="t:templates" xmlns="" id="templates">
+<refpurpose>Construct a stylesheet for the templates provided</refpurpose>
+
+<refdescription>
+<para>The <literal>t:templates</literal> element is the root of a
+set of templates. This template creates an appropriate
+<literal>xsl:stylesheet</literal> for the templates.</para>
+
+<para>If the <literal>t:templates</literal> element has a
+<literal>base-stylesheet</literal> attribute, an
+<literal>xsl:import</literal> statement is constructed for it.</para>
+</refdescription>
+</doc:template>
+
+<xsl:template match="t:templates">
+ <xsl:element name="xsl:stylesheet">
+
+ <xsl:for-each select="document('')/xsl:stylesheet/namespace::exsl">
+ <xsl:copy/>
+ </xsl:for-each>
+
+ <xsl:attribute name="version">1.0</xsl:attribute>
+ <xsl:attribute name="exclude-result-prefixes">exsl</xsl:attribute>
+
+ <xsl:text>&#xA;&#xA;</xsl:text>
+ <xsl:comment>
+ <xsl:text> This stylesheet was created by </xsl:text>
+ <xsl:text>template/titlepage.xsl</xsl:text>
+ </xsl:comment>
+
+ <xsl:if test="@t:base-stylesheet">
+ <xsl:text>&#xA;&#xA;</xsl:text>
+ <xsl:element name="xsl:import">
+ <xsl:attribute name="href">
+ <xsl:value-of select="@t:base-stylesheet"/>
+ </xsl:attribute>
+ </xsl:element>
+ </xsl:if>
+
+ <xsl:apply-templates/>
+
+ <xsl:text>&#xA;&#xA;</xsl:text>
+ </xsl:element>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<doc:template match="xsl:*" xmlns="" id="star">
+<refpurpose>Copy xsl: elements straight through</refpurpose>
+
+<refdescription>
+<para>This template simply copies the xsl: elements
+straight through into the result tree.</para>
+</refdescription>
+</doc:template>
+
+<xsl:template match="xsl:*">
+ <xsl:apply-templates select="." mode="copy"/>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<doc:template match="t:titlepage" xmlns="" id="titlepage">
+<refpurpose>Create the templates necessary to construct a title page</refpurpose>
+
+<refdescription>
+<para>The <literal>t:titlepage</literal> element creates a set of
+templates for processing the titlepage for an element. The
+<quote>root</quote> of this template set is the template named
+<quote><literal>wrapper.titlepage</literal></quote>. That is the
+template that should be called to generate the title page.
+</para>
+
+<para>The <literal>t:titlepage</literal> element has three attributes:
+
+<variablelist>
+<varlistentry><term>element</term>
+<listitem><para>The name of the source document element for which
+these templates apply. In other words, to make a title page for the
+<tag>article</tag> element, set the
+<tag class="attribute">element</tag> attribute to
+<quote><literal>article</literal></quote>. This attribute is required.
+</para></listitem>
+</varlistentry>
+<varlistentry><term>wrapper</term>
+<listitem><para>The entire title page can be wrapped with an element.
+This attribute identifies that element.
+</para></listitem>
+</varlistentry>
+<varlistentry><term>class</term>
+<listitem><para>If the <tag class="attribute">class</tag> attribute
+is set, a <tag class="attribute">class</tag> attribute with this
+value will be added to the wrapper element that surrounds the entire
+title page.
+</para></listitem>
+</varlistentry>
+</variablelist>
+</para>
+
+<para>Any other attributes are copied through literally to the
+wrapper element.</para>
+
+<para>The content of a <literal>t:titlepage</literal> is one or
+more <literal>t:titlepage-content</literal>,
+<literal>t:titlepage-separator</literal>, and
+<literal>t:titlepage-before</literal> elements.</para>
+
+<para>Each of these elements may be provided for the <quote>recto</quote>
+and <quote>verso</quote> sides of the title page.</para>
+
+</refdescription>
+</doc:template>
+
+<xsl:template match="t:titlepage">
+ <!-- process the children to make the templates for the content,
+ separator, and before elements -->
+ <xsl:apply-templates/>
+
+ <!-- output the title page template -->
+ <xsl:text>&#xA;&#xA;</xsl:text>
+ <xsl:element name="xsl:template">
+ <xsl:attribute name="name">
+ <xsl:value-of select="@t:element"/>
+ <xsl:text>.titlepage</xsl:text>
+ </xsl:attribute>
+ <xsl:text>&#xA; </xsl:text>
+ <xsl:element name="{@t:wrapper}">
+ <xsl:apply-templates select="@*" mode="copy.literal.atts"/>
+ <xsl:text>&#xA; </xsl:text>
+ <xsl:element name="xsl:variable">
+ <xsl:attribute name="name">recto.content</xsl:attribute>
+ <xsl:text>&#xA; </xsl:text>
+ <xsl:element name="xsl:call-template">
+ <xsl:attribute name="name">
+ <xsl:value-of select="@t:element"/>
+ <xsl:text>.titlepage.before.recto</xsl:text>
+ </xsl:attribute>
+ </xsl:element>
+ <xsl:text>&#xA; </xsl:text>
+ <xsl:element name="xsl:call-template">
+ <xsl:attribute name="name">
+ <xsl:value-of select="@t:element"/>
+ <xsl:text>.titlepage.recto</xsl:text>
+ </xsl:attribute>
+ </xsl:element>
+ <xsl:text>&#xA; </xsl:text>
+ </xsl:element>
+ <xsl:text>&#xA; </xsl:text>
+ <xsl:element name="xsl:variable">
+ <xsl:attribute name="name">recto.elements.count</xsl:attribute>
+ <xsl:text>&#xA; </xsl:text>
+ <xsl:element name="xsl:choose">
+ <xsl:text>&#xA; </xsl:text>
+ <xsl:element name="xsl:when">
+ <xsl:attribute name="test">function-available('exsl:node-set')</xsl:attribute>
+ <xsl:element name="xsl:value-of">
+ <xsl:attribute name="select">count(exsl:node-set($recto.content)/*)</xsl:attribute>
+ </xsl:element>
+ </xsl:element>
+ <xsl:text>&#xA; </xsl:text>
+ <xsl:element name="xsl:when">
+ <xsl:attribute name="test">contains(system-property('xsl:vendor'), 'Apache Software Foundation')</xsl:attribute>
+ <xsl:text>&#xA; </xsl:text>
+ <xsl:comment>Xalan quirk</xsl:comment>
+ <xsl:element name="xsl:value-of">
+ <xsl:attribute name="select">count(exsl:node-set($recto.content)/*)</xsl:attribute>
+ </xsl:element>
+ </xsl:element>
+ <xsl:text>&#xA; </xsl:text>
+ <xsl:element name="xsl:otherwise">
+ <xsl:text>1</xsl:text>
+ </xsl:element>
+ <xsl:text>&#xA; </xsl:text>
+ </xsl:element>
+ <xsl:text>&#xA; </xsl:text>
+ </xsl:element>
+ <xsl:text>&#xA; </xsl:text>
+ <xsl:element name="xsl:if">
+ <xsl:attribute name="test">(normalize-space($recto.content) != '') or ($recto.elements.count > 0)</xsl:attribute>
+ <xsl:text>&#xA; </xsl:text>
+ <xsl:element name="{@t:wrapper}">
+ <xsl:apply-templates select="t:titlepage-content[@t:side='recto']/@*"
+ mode="copy.literal.atts"/>
+ <xsl:element name="xsl:copy-of">
+ <xsl:attribute name="select">$recto.content</xsl:attribute>
+ </xsl:element>
+ </xsl:element>
+ <xsl:text>&#xA; </xsl:text>
+ </xsl:element>
+ <xsl:text>&#xA; </xsl:text>
+ <xsl:element name="xsl:variable">
+ <xsl:attribute name="name">verso.content</xsl:attribute>
+ <xsl:text>&#xA; </xsl:text>
+ <xsl:element name="xsl:call-template">
+ <xsl:attribute name="name">
+ <xsl:value-of select="@t:element"/>
+ <xsl:text>.titlepage.before.verso</xsl:text>
+ </xsl:attribute>
+ </xsl:element>
+ <xsl:text>&#xA; </xsl:text>
+ <xsl:element name="xsl:call-template">
+ <xsl:attribute name="name">
+ <xsl:value-of select="@t:element"/>
+ <xsl:text>.titlepage.verso</xsl:text>
+ </xsl:attribute>
+ </xsl:element>
+ <xsl:text>&#xA; </xsl:text>
+ </xsl:element>
+ <xsl:text>&#xA; </xsl:text>
+ <xsl:element name="xsl:variable">
+ <xsl:attribute name="name">verso.elements.count</xsl:attribute>
+ <xsl:text>&#xA; </xsl:text>
+ <xsl:element name="xsl:choose">
+ <xsl:text>&#xA; </xsl:text>
+ <xsl:element name="xsl:when">
+ <xsl:attribute name="test">function-available('exsl:node-set')</xsl:attribute>
+ <xsl:element name="xsl:value-of">
+ <xsl:attribute name="select">count(exsl:node-set($verso.content)/*)</xsl:attribute>
+ </xsl:element>
+ </xsl:element>
+ <xsl:text>&#xA; </xsl:text>
+ <xsl:element name="xsl:when">
+ <xsl:attribute name="test">contains(system-property('xsl:vendor'), 'Apache Software Foundation')</xsl:attribute>
+ <xsl:text>&#xA; </xsl:text>
+ <xsl:comment>Xalan quirk</xsl:comment>
+ <xsl:element name="xsl:value-of">
+ <xsl:attribute name="select">count(exsl:node-set($verso.content)/*)</xsl:attribute>
+ </xsl:element>
+ </xsl:element>
+ <xsl:text>&#xA; </xsl:text>
+ <xsl:element name="xsl:otherwise">
+ <xsl:text>1</xsl:text>
+ </xsl:element>
+ <xsl:text>&#xA; </xsl:text>
+ </xsl:element>
+ <xsl:text>&#xA; </xsl:text>
+ </xsl:element>
+ <xsl:text>&#xA; </xsl:text>
+ <xsl:element name="xsl:if">
+ <xsl:attribute name="test">(normalize-space($verso.content) != '') or ($verso.elements.count > 0)</xsl:attribute>
+ <xsl:text>&#xA; </xsl:text>
+ <xsl:element name="{@t:wrapper}">
+ <xsl:apply-templates select="t:titlepage-content[@t:side='verso']/@*"
+ mode="copy.literal.atts"/>
+ <xsl:element name="xsl:copy-of">
+ <xsl:attribute name="select">$verso.content</xsl:attribute>
+ </xsl:element>
+ </xsl:element>
+ <xsl:text>&#xA; </xsl:text>
+ </xsl:element>
+ <xsl:text>&#xA; </xsl:text>
+ <xsl:element name="xsl:call-template">
+ <xsl:attribute name="name">
+ <xsl:value-of select="@t:element"/>
+ <xsl:text>.titlepage.separator</xsl:text>
+ </xsl:attribute>
+ </xsl:element>
+ <xsl:text>&#xA; </xsl:text>
+ </xsl:element>
+ <xsl:text>&#xA;</xsl:text>
+ </xsl:element>
+
+ <!-- If we're not importing a base stylesheet, output a default rule
+ for the recto- and verso-mode elements. (If we are importing a
+ base stylesheet, don't do this since the *-rules in the stylesheet
+ will totally override the rules that would otherwise be imported.)
+ -->
+
+ <xsl:if test="not(../@t:base-stylesheet)">
+ <!-- output a default rule for the recto-modes elements -->
+ <xsl:text>&#xA;&#xA;</xsl:text>
+ <xsl:element name="xsl:template">
+ <xsl:attribute name="match">*</xsl:attribute>
+ <xsl:attribute name="mode">
+ <xsl:value-of select="@t:element"/>
+ <xsl:text>.titlepage.recto.mode</xsl:text>
+ </xsl:attribute>
+ <xsl:text>&#xA; </xsl:text>
+ <xsl:comment> if an element isn't found in this mode, </xsl:comment>
+ <xsl:text>&#xA; </xsl:text>
+ <xsl:comment> try the generic titlepage.mode </xsl:comment>
+ <xsl:text>&#xA; </xsl:text>
+ <xsl:element name="xsl:apply-templates">
+ <xsl:attribute name="select">.</xsl:attribute>
+ <xsl:attribute name="mode">titlepage.mode</xsl:attribute>
+ </xsl:element>
+ <xsl:text>&#xA;</xsl:text>
+ </xsl:element>
+
+ <!-- output a default rule for the verso-modes elements -->
+ <xsl:text>&#xA;&#xA;</xsl:text>
+ <xsl:element name="xsl:template">
+ <xsl:attribute name="match">*</xsl:attribute>
+ <xsl:attribute name="mode">
+ <xsl:value-of select="@t:element"/>
+ <xsl:text>.titlepage.verso.mode</xsl:text>
+ </xsl:attribute>
+ <xsl:text>&#xA; </xsl:text>
+ <xsl:comment> if an element isn't found in this mode, </xsl:comment>
+ <xsl:text>&#xA; </xsl:text>
+ <xsl:comment> try the generic titlepage.mode </xsl:comment>
+ <xsl:text>&#xA; </xsl:text>
+ <xsl:element name="xsl:apply-templates">
+ <xsl:attribute name="select">.</xsl:attribute>
+ <xsl:attribute name="mode">titlepage.mode</xsl:attribute>
+ </xsl:element>
+ <xsl:text>&#xA;</xsl:text>
+ </xsl:element>
+ </xsl:if>
+
+ <!-- output default templates for each of the elements listed in -->
+ <!-- the titlepage-content. If a template is suppressed or forced -->
+ <!-- to be off, or has already been output, don't output it. -->
+ <xsl:for-each select="t:titlepage-content/*">
+ <xsl:variable name="thisnode" select="."/>
+ <xsl:if test="(not(@t:suppress-template) or @t:suppress-template='0')
+ and (not(@t:force) or @t:force='0')
+ and (not(preceding-sibling::*[name(.)=name($thisnode)]))">
+ <xsl:text>&#xA;&#xA;</xsl:text>
+ <xsl:element name="xsl:template">
+ <xsl:attribute name="match">
+ <xsl:value-of select="name(.)"/>
+ </xsl:attribute>
+ <xsl:attribute name="mode">
+ <xsl:value-of select="../../@t:element"/>
+ <xsl:text>.titlepage.</xsl:text>
+ <xsl:value-of select="../@t:side"/>
+ <xsl:text>.auto.mode</xsl:text>
+ </xsl:attribute>
+ <xsl:text>&#xA;</xsl:text>
+ <xsl:element name="{../../@t:wrapper}">
+ <xsl:attribute name="xsl:use-attribute-sets">
+ <xsl:value-of select="../../@t:element"/>
+ <xsl:text>.titlepage.</xsl:text>
+ <xsl:value-of select="../@t:side"/>
+ <xsl:text>.style</xsl:text>
+ </xsl:attribute>
+ <xsl:for-each select="@*">
+ <xsl:if test="not(starts-with(namespace-uri(.),
+ 'http://nwalsh.com/docbook/xsl/template/1.0'))">
+ <xsl:attribute name="{name(.)}" namespace="{namespace-uri(.)}">
+ <xsl:value-of select="."/>
+ </xsl:attribute>
+ </xsl:if>
+ </xsl:for-each>
+ <xsl:text>&#xA;</xsl:text>
+
+ <xsl:choose>
+ <xsl:when test="@t:named-template">
+ <xsl:element name="xsl:call-template">
+ <xsl:attribute name="name">
+ <xsl:value-of select="@t:named-template"/>
+ </xsl:attribute>
+ <xsl:for-each select="@*">
+ <xsl:if test="namespace-uri(.)='http://nwalsh.com/docbook/xsl/template/1.0/param'">
+ <xsl:text>&#xA;</xsl:text>
+ <xsl:element name="xsl:with-param">
+ <xsl:attribute name="name">
+ <xsl:value-of select="local-name(.)"/>
+ </xsl:attribute>
+ <xsl:attribute name="select">
+ <xsl:value-of select="."/>
+ </xsl:attribute>
+ </xsl:element>
+ </xsl:if>
+ </xsl:for-each>
+ <xsl:text>&#xA;</xsl:text>
+ </xsl:element>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:element name="xsl:apply-templates">
+ <xsl:attribute name="select">.</xsl:attribute>
+ <xsl:attribute name="mode">
+ <xsl:value-of select="../../@t:element"/>
+ <xsl:text>.titlepage.</xsl:text>
+ <xsl:value-of select="../@t:side"/>
+ <xsl:text>.mode</xsl:text>
+ </xsl:attribute>
+ </xsl:element>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:text>&#xA;</xsl:text>
+ </xsl:element>
+ <xsl:text>&#xA;</xsl:text>
+ </xsl:element>
+ </xsl:if>
+ </xsl:for-each>
+</xsl:template>
+
+<doc:template match="@*" mode="copy.literal.atts" xmlns=""
+ id="attr_star_in_copy.literal.atts">
+<refpurpose>Copy t:titlepage attributes</refpurpose>
+
+<refdescription>
+<para>This template copies all of the <quote>other</quote> attributes
+from a <literal>t:titlepage</literal> element onto the specified
+wrapper.</para>
+</refdescription>
+</doc:template>
+
+<xsl:template match="@*" mode="copy.literal.atts">
+ <xsl:if test="not(starts-with(namespace-uri(.),
+ 'http://nwalsh.com/docbook/xsl/template/1.0'))">
+ <xsl:attribute name="{name(.)}">
+ <xsl:value-of select="."/>
+ </xsl:attribute>
+ </xsl:if>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<doc:template match="t:titlepage-content" id="titlepage-content">
+<refpurpose>Create templates for the content of one side of a title page</refpurpose>
+
+<refdescription>
+<para>The title page content, that is, the elements from the source
+document that are rendered on the title page, can be controlled independently
+for the recto and verso sides of the title page.</para>
+
+<para>The <literal>t:titlepage-content</literal> element has two attributes:
+
+<variablelist>
+<varlistentry><term>side</term>
+<listitem><para>Identifies the side of the page to which this title
+page content applies. The
+<tag class="attribute">side</tag> attribute is required and
+must be set to either
+<quote><literal>recto</literal></quote> or
+<quote><literal>verso</literal></quote>. In addition, you must specify
+exactly one <literal>t:titlepage-content</literal> for each side
+within each <literal>t:titlepage</literal>.</para>
+</listitem>
+</varlistentry>
+<varlistentry><term>order</term>
+<listitem><para>Indicates how the order of the elements presented on
+the title page is determined. If the
+<tag class="attribute">order</tag> is
+<quote><literal>document</literal></quote>, the elements are presented
+in document order. Otherwise (if the
+<tag class="attribute">order</tag> is
+<quote><literal>stylesheet</literal></quote>), the elements are presented
+in the order that they appear in the template (and consequently in
+the stylesheet).</para>
+</listitem>
+</varlistentry>
+</variablelist>
+</para>
+
+<para>The content of a <literal>t:titlepage-content</literal> element is
+a list of element names. These names should be unqualified. They identify
+the elements in the source document that should appear on the title page.
+</para>
+
+<para>Each element may have a single attribute:
+<tag class="attribute">predicate</tag>. The value of this
+attribute is used as a predicate for the expression that matches
+the element on which it occurs.</para>
+
+<para>In other words, to put only the first three authors on the
+recto-side of a title
+page, you could specify:
+
+<screen><![CDATA[
+ <t:titlepage-contents side="recto">
+ <!-- other titlepage elements -->
+ <author predicate="[count(previous-sibling::author)<2]"/>
+ <!-- other titlepage elements -->
+ </t:titlepage-contents>
+]]></screen>
+</para>
+
+<para>Usually, the elements so named are empty. But it is possible to
+make one level of selection within them. Suppose that you want to
+process <literal>authorgroup</literal> elements on the title page, but
+you want to select only proper authors, editors, or corporate authors,
+not collaborators or other credited authors.</para>
+
+<para>In that case, you can put a <literal>t:or</literal> group inside
+the <literal>authorgroup</literal> element:
+
+<screen><![CDATA[
+ <t:titlepage-contents side="recto">
+ <!-- other titlepage elements -->
+ <authorgroup>
+ <t:or>
+ <author/>
+ <editor/>
+ <corpauthor/>
+ </t:or>
+ </authorgroup>
+ <!-- other titlepage elements -->
+ </t:titlepage-contents>
+]]></screen>
+</para>
+
+<para>This will have the effect of automatically generating a template
+for processing <literal>authorgroup</literal>s in the title page mode,
+selecting only the specified children. If you need more complex processing,
+you'll have to construct the templates by hand.</para>
+
+</refdescription>
+</doc:template>
+
+<xsl:template match="t:titlepage-content">
+ <xsl:variable name="side">
+ <xsl:choose>
+ <xsl:when test="@t:side='recto' or @t:side='verso'">
+ <xsl:value-of select="@t:side"/>
+ </xsl:when>
+ <xsl:when test="@t:side">
+ <xsl:message terminate="yes">
+ <xsl:text>Illegal value specified for @t:side </xsl:text>
+ <xsl:text>on t:titlepage-content: </xsl:text>
+ <xsl:value-of select="@t:side"/>
+ </xsl:message>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:message terminate="yes">
+ <xsl:text>The @t:side attribute is required on </xsl:text>
+ <xsl:text>t:titlepage-content.</xsl:text>
+ </xsl:message>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="mode">
+ <xsl:value-of select="../@t:element"/>
+ <xsl:text>.titlepage.</xsl:text>
+ <xsl:value-of select="$side"/>
+ <xsl:text>.auto.mode</xsl:text>
+ </xsl:variable>
+
+ <xsl:text>&#xA;&#xA;</xsl:text>
+ <xsl:element name="xsl:template">
+ <xsl:attribute name="name">
+ <xsl:value-of select="../@t:element"/>
+ <xsl:text>.titlepage.</xsl:text>
+ <xsl:value-of select="$side"/>
+ </xsl:attribute>
+
+ <xsl:choose>
+ <!-- if document order is selected, make a huge select statement
+ on a single xsl:apply-templates to pick out the right elements
+ for the title page. -->
+ <xsl:when test="@t:order='document'">
+ <xsl:if test="count(child::*)&gt;0">
+ <xsl:element name="xsl:apply-templates">
+ <xsl:attribute name="mode">
+ <xsl:value-of select="$mode"/>
+ </xsl:attribute>
+ <xsl:attribute name="select">
+ <xsl:apply-templates mode="document.order"/>
+ </xsl:attribute>
+ </xsl:element>
+ </xsl:if>
+ </xsl:when>
+
+ <!-- otherwise, select each of the elements in the specified order -->
+ <xsl:otherwise>
+ <xsl:apply-templates mode="stylesheet.order"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:text>&#xA;</xsl:text>
+ </xsl:element>
+ <xsl:apply-templates mode="titlepage.specialrules"/>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<doc:template match="t:titlepage-separator" id="titlepage-separator">
+<refpurpose>Create templates for the separator</refpurpose>
+
+<refdescription>
+<para>The title page is separated from the content which follows it by
+the markup specified in the <literal>t:titlepage-separator</literal>
+element.</para>
+</refdescription>
+</doc:template>
+
+<xsl:template match="t:titlepage-separator">
+ <xsl:text>&#xA;&#xA;</xsl:text>
+ <xsl:element name="xsl:template">
+ <xsl:attribute name="name">
+ <xsl:value-of select="../@t:element"/>
+ <xsl:text>.titlepage.separator</xsl:text>
+ </xsl:attribute>
+
+ <xsl:apply-templates mode="copy"/>
+ <xsl:text>&#xA;</xsl:text>
+ </xsl:element>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<doc:template match="t:titlepage-before" id="titlepage-before">
+<refpurpose>Create templates for what precedes a title page</refpurpose>
+
+<refdescription>
+<para>Each side of the title page is preceded by the markup specified
+in the <literal>t:titlepage-before</literal> element for that
+side.</para>
+</refdescription>
+</doc:template>
+
+<xsl:template match="t:titlepage-before">
+ <xsl:text>&#xA;&#xA;</xsl:text>
+ <xsl:element name="xsl:template">
+ <xsl:attribute name="name">
+ <xsl:value-of select="../@t:element"/>
+ <xsl:text>.titlepage.before.</xsl:text>
+ <xsl:value-of select="@t:side"/>
+ </xsl:attribute>
+
+ <xsl:apply-templates mode="copy"/>
+ <xsl:text>&#xA;</xsl:text>
+ </xsl:element>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<doc:template match="*" mode="copy" xmlns="" id="star_in_copy">
+<refpurpose>Copy elements</refpurpose>
+
+<refdescription>
+<para>This template simply copies the elements that it applies to
+straight through into the result tree.</para>
+</refdescription>
+</doc:template>
+
+<xsl:template match="*" mode="copy">
+ <xsl:element name="{name(.)}">
+ <xsl:apply-templates select="@*" mode="copy"/>
+ <xsl:apply-templates mode="copy"/>
+ </xsl:element>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<doc:template match="@*" mode="copy" xmlns="" id="attr_star_in_copy">
+<refpurpose>Copy attributes</refpurpose>
+
+<refdescription>
+<para>This template simply copies the attributes that it applies to
+straight through into the result tree.</para>
+</refdescription>
+</doc:template>
+
+<xsl:template match="@*" mode="copy">
+ <xsl:attribute name="{name(.)}">
+ <xsl:value-of select="."/>
+ </xsl:attribute>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<doc:template match="*" mode="document.order" xmlns="" id="attr_star_in_document.order">
+<refpurpose>Create rules to process titlepage elements in document order</refpurpose>
+
+<refdescription>
+<para>This template is called to process all of the children of the
+<literal>t:titlepage-content</literal> element. It creates the hairy
+select expression necessary to process each of those elements in
+the title page.</para>
+
+<para>Note that this template automatically handles the case where
+some DocBook elements, like title and subtitle, can occur both inside
+the *info elements where metadata is usually stored and outside.
+</para>
+
+<para>It also automatically calculates the name for the *info container
+and handles elements that have historically had containers with different
+names.</para>
+
+</refdescription>
+</doc:template>
+
+<xsl:template match="*" mode="document.order">
+ <xsl:variable name="docinfo">
+ <xsl:value-of select="ancestor::t:titlepage/@t:element"/>
+ <xsl:text>info</xsl:text>
+ </xsl:variable>
+
+ <xsl:variable name="altinfo">
+ <xsl:choose>
+ <xsl:when test="ancestor::t:titlepage/@t:element='article'">
+ <xsl:text>artheader</xsl:text>
+ </xsl:when>
+ <xsl:when test="ancestor::t:titlepage/@t:element='qandaset'">
+ <xsl:text>blockinfo</xsl:text>
+ </xsl:when>
+ <xsl:when test="ancestor::t:titlepage/@t:element='section'"></xsl:when>
+ <xsl:when test="ancestor::t:titlepage/@t:element='sect1'"></xsl:when>
+ <xsl:when test="ancestor::t:titlepage/@t:element='sect2'"></xsl:when>
+ <xsl:when test="ancestor::t:titlepage/@t:element='sect3'"></xsl:when>
+ <xsl:when test="ancestor::t:titlepage/@t:element='sect4'"></xsl:when>
+ <xsl:when test="ancestor::t:titlepage/@t:element='sect5'"></xsl:when>
+ <xsl:when test="ancestor::t:titlepage/@t:element='book'"></xsl:when>
+ <xsl:when test="ancestor::t:titlepage/@t:element='set'"></xsl:when>
+ <xsl:otherwise>docinfo</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="side">
+ <xsl:choose>
+ <xsl:when test="ancestor::t:titlepage-content/@t:side">
+ <xsl:value-of select="ancestor::t:titlepage-content/@t:side"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text>recto</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="mode">
+ <xsl:value-of select="ancestor::t:titlepage/@t:element"/>
+ <xsl:text>.titlepage.</xsl:text>
+ <xsl:value-of select="$side"/>
+ <xsl:text>.auto.mode</xsl:text>
+ </xsl:variable>
+
+ <xsl:if test="preceding-sibling::*">
+ <xsl:text>|</xsl:text>
+ </xsl:if>
+
+ <xsl:value-of select="$docinfo"/>
+ <xsl:text>/</xsl:text>
+ <xsl:value-of select="name(.)"/>
+ <xsl:if test="@t:predicate">
+ <xsl:value-of select="@t:predicate"/>
+ </xsl:if>
+
+ <xsl:if test="$altinfo != ''">
+ <xsl:text>|</xsl:text>
+ <xsl:value-of select="$altinfo"/>
+ <xsl:text>/</xsl:text>
+ <xsl:value-of select="name(.)"/>
+ <xsl:if test="@t:predicate">
+ <xsl:value-of select="@t:predicate"/>
+ </xsl:if>
+ </xsl:if>
+
+ <!-- info -->
+ <xsl:text>|info</xsl:text>
+ <xsl:text>/</xsl:text>
+ <xsl:value-of select="name(.)"/>
+ <xsl:if test="@t:predicate">
+ <xsl:value-of select="@t:predicate"/>
+ </xsl:if>
+
+ <xsl:if test="local-name(.) = 'title'
+ or local-name(.) = 'subtitle'
+ or local-name(.) = 'titleabbrev'">
+ <xsl:text>|</xsl:text>
+ <xsl:value-of select="name(.)"/>
+ <xsl:if test="@t:predicate">
+ <xsl:value-of select="@t:predicate"/>
+ </xsl:if>
+ </xsl:if>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<doc:template match="*" mode="document.order" xmlns="" id="star_in_document.order">
+<refpurpose>Create rules to process titlepage elements in stylesheet order</refpurpose>
+
+<refdescription>
+<para>This template is called to process all of the children of the
+<literal>t:titlepage-content</literal> element. It creates the set
+of <literal>xsl:apply-templates</literal> elements necessary
+process each of those elements in the title page.</para>
+
+<para>Note that this template automatically handles the case where
+some DocBook elements, like title and subtitle, can occur both inside
+the *info elements where metadata is usually stored and outside.
+</para>
+
+<para>It also automatically calculates the name for the *info container
+and handles elements that have historically had containers with different
+names.</para>
+
+</refdescription>
+</doc:template>
+
+<xsl:template match="*" mode="stylesheet.order">
+ <xsl:variable name="docinfo">
+ <xsl:value-of select="ancestor::t:titlepage/@t:element"/>
+ <xsl:text>info</xsl:text>
+ </xsl:variable>
+
+ <xsl:variable name="altinfo">
+ <xsl:choose>
+ <xsl:when test="ancestor::t:titlepage/@t:element='article'">
+ <xsl:text>artheader</xsl:text>
+ </xsl:when>
+ <xsl:when test="ancestor::t:titlepage/@t:element='qandaset'">
+ <xsl:text>blockinfo</xsl:text>
+ </xsl:when>
+ <xsl:when test="ancestor::t:titlepage/@t:element='section'"></xsl:when>
+ <xsl:when test="ancestor::t:titlepage/@t:element='sect1'"></xsl:when>
+ <xsl:when test="ancestor::t:titlepage/@t:element='sect2'"></xsl:when>
+ <xsl:when test="ancestor::t:titlepage/@t:element='sect3'"></xsl:when>
+ <xsl:when test="ancestor::t:titlepage/@t:element='sect4'"></xsl:when>
+ <xsl:when test="ancestor::t:titlepage/@t:element='sect5'"></xsl:when>
+ <xsl:when test="ancestor::t:titlepage/@t:element='book'"></xsl:when>
+ <xsl:when test="ancestor::t:titlepage/@t:element='set'"></xsl:when>
+ <xsl:otherwise>docinfo</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="side">
+ <xsl:choose>
+ <xsl:when test="ancestor::t:titlepage-content/@t:side">
+ <xsl:value-of select="ancestor::t:titlepage-content/@t:side"/>
+ </xsl:when>
+ <xsl:otherwise>recto</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="mode">
+ <xsl:value-of select="ancestor::t:titlepage/@t:element"/>
+ <xsl:text>.titlepage.</xsl:text>
+ <xsl:value-of select="$side"/>
+ <xsl:text>.auto.mode</xsl:text>
+ </xsl:variable>
+
+ <xsl:text>&#xA; </xsl:text>
+
+ <xsl:choose>
+ <xsl:when test="@t:force and @t:force != '0'">
+ <xsl:choose>
+ <xsl:when test="@t:named-template">
+ <xsl:element name="{../../@t:wrapper}">
+ <xsl:attribute name="xsl:use-attribute-sets">
+ <xsl:value-of select="../../@t:element"/>
+ <xsl:text>.titlepage.</xsl:text>
+ <xsl:value-of select="../@t:side"/>
+ <xsl:text>.style</xsl:text>
+ </xsl:attribute>
+ <xsl:for-each select="@*">
+ <xsl:if test="not(starts-with(namespace-uri(.),
+ 'http://nwalsh.com/docbook/xsl/template/1.0'))">
+ <xsl:attribute name="{name(.)}" namespace="{namespace-uri(.)}">
+ <xsl:value-of select="."/>
+ </xsl:attribute>
+ </xsl:if>
+ </xsl:for-each>
+ <xsl:text>&#xA;</xsl:text>
+ <xsl:element name="xsl:call-template">
+ <xsl:attribute name="name">
+ <xsl:value-of select="@t:named-template"/>
+ </xsl:attribute>
+ <xsl:for-each select="@*">
+ <xsl:if test="namespace-uri(.)='http://nwalsh.com/docbook/xsl/template/1.0/param'">
+ <xsl:text>&#xA;</xsl:text>
+ <xsl:element name="xsl:with-param">
+ <xsl:attribute name="name">
+ <xsl:value-of select="local-name(.)"/>
+ </xsl:attribute>
+ <xsl:attribute name="select">
+ <xsl:value-of select="."/>
+ </xsl:attribute>
+ </xsl:element>
+ </xsl:if>
+ </xsl:for-each>
+ <xsl:text>&#xA;</xsl:text>
+ </xsl:element>
+ </xsl:element>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:message terminate="yes">
+ <xsl:text>Force can only be used with named-templates.</xsl:text>
+ </xsl:message>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+
+ <xsl:choose>
+ <xsl:when test="local-name(.) = 'title'
+ or local-name(.) = 'subtitle'
+ or local-name(.) = 'titleabbrev'">
+ <!-- the title, subtitle, and titleabbrev elements are special -->
+ <xsl:element name="xsl:choose">
+ <xsl:text>&#xA; </xsl:text>
+ <xsl:element name="xsl:when">
+ <xsl:attribute name="test">
+ <xsl:value-of select="$docinfo"/>
+ <xsl:text>/</xsl:text>
+ <xsl:value-of select="name(.)"/>
+ </xsl:attribute>
+ <xsl:text>&#xA; </xsl:text>
+ <xsl:element name="xsl:apply-templates">
+ <xsl:attribute name="mode">
+ <xsl:value-of select="$mode"/>
+ </xsl:attribute>
+ <xsl:attribute name="select">
+ <xsl:value-of select="$docinfo"/>
+ <xsl:text>/</xsl:text>
+ <xsl:value-of select="name(.)"/>
+ <xsl:if test="@t:predicate">
+ <xsl:value-of select="@t:predicate"/>
+ </xsl:if>
+ </xsl:attribute>
+ </xsl:element>
+ <xsl:text>&#xA; </xsl:text>
+ </xsl:element>
+
+ <xsl:if test="$altinfo != ''">
+ <xsl:text>&#xA; </xsl:text>
+ <xsl:element name="xsl:when">
+ <xsl:attribute name="test">
+ <xsl:value-of select="$altinfo"/>
+ <xsl:text>/</xsl:text>
+ <xsl:value-of select="name(.)"/>
+ </xsl:attribute>
+ <xsl:text>&#xA; </xsl:text>
+ <xsl:element name="xsl:apply-templates">
+ <xsl:attribute name="mode">
+ <xsl:value-of select="$mode"/>
+ </xsl:attribute>
+ <xsl:attribute name="select">
+ <xsl:value-of select="$altinfo"/>
+ <xsl:text>/</xsl:text>
+ <xsl:value-of select="name(.)"/>
+ <xsl:if test="@t:predicate">
+ <xsl:value-of select="@t:predicate"/>
+ </xsl:if>
+ </xsl:attribute>
+ </xsl:element>
+ <xsl:text>&#xA; </xsl:text>
+ </xsl:element>
+ </xsl:if>
+
+ <!-- info -->
+ <xsl:text>&#xA; </xsl:text>
+ <xsl:element name="xsl:when">
+ <xsl:attribute name="test">
+ <xsl:value-of select="'info'"/>
+ <xsl:text>/</xsl:text>
+ <xsl:value-of select="name(.)"/>
+ </xsl:attribute>
+ <xsl:text>&#xA; </xsl:text>
+ <xsl:element name="xsl:apply-templates">
+ <xsl:attribute name="mode">
+ <xsl:value-of select="$mode"/>
+ </xsl:attribute>
+ <xsl:attribute name="select">
+ <xsl:value-of select="'info'"/>
+ <xsl:text>/</xsl:text>
+ <xsl:value-of select="name(.)"/>
+ <xsl:if test="@t:predicate">
+ <xsl:value-of select="@t:predicate"/>
+ </xsl:if>
+ </xsl:attribute>
+ </xsl:element>
+ <xsl:text>&#xA; </xsl:text>
+ </xsl:element>
+
+ <xsl:text>&#xA; </xsl:text>
+ <xsl:element name="xsl:when">
+ <xsl:attribute name="test">
+ <xsl:value-of select="name(.)"/>
+ </xsl:attribute>
+ <xsl:text>&#xA; </xsl:text>
+ <xsl:element name="xsl:apply-templates">
+ <xsl:attribute name="mode">
+ <xsl:value-of select="$mode"/>
+ </xsl:attribute>
+ <xsl:attribute name="select">
+ <xsl:value-of select="name(.)"/>
+ <xsl:if test="@t:predicate">
+ <xsl:value-of select="@t:predicate"/>
+ </xsl:if>
+ </xsl:attribute>
+ </xsl:element>
+ <xsl:text>&#xA; </xsl:text>
+ </xsl:element>
+ <xsl:text>&#xA; </xsl:text>
+ </xsl:element>
+ <xsl:text>&#xA;</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+
+ <!-- first take care of the $docinfo version -->
+ <xsl:element name="xsl:apply-templates">
+ <xsl:attribute name="mode">
+ <xsl:value-of select="$mode"/>
+ </xsl:attribute>
+ <xsl:attribute name="select">
+ <xsl:value-of select="$docinfo"/>
+ <xsl:text>/</xsl:text>
+ <xsl:value-of select="name(.)"/>
+ <xsl:if test="@t:predicate">
+ <xsl:value-of select="@t:predicate"/>
+ </xsl:if>
+ </xsl:attribute>
+ </xsl:element>
+
+ <!-- then take care of the $altinfo version -->
+ <xsl:if test="$altinfo != ''">
+ <xsl:text>&#xA; </xsl:text>
+ <xsl:element name="xsl:apply-templates">
+ <xsl:attribute name="mode">
+ <xsl:value-of select="$mode"/>
+ </xsl:attribute>
+ <xsl:attribute name="select">
+ <xsl:value-of select="$altinfo"/>
+ <xsl:text>/</xsl:text>
+ <xsl:value-of select="name(.)"/>
+ <xsl:if test="@t:predicate">
+ <xsl:value-of select="@t:predicate"/>
+ </xsl:if>
+ </xsl:attribute>
+ </xsl:element>
+ </xsl:if>
+
+ <!-- info -->
+ <xsl:text>&#xA; </xsl:text>
+ <xsl:element name="xsl:apply-templates">
+ <xsl:attribute name="mode">
+ <xsl:value-of select="$mode"/>
+ </xsl:attribute>
+ <xsl:attribute name="select">
+ <xsl:value-of select="'info'"/>
+ <xsl:text>/</xsl:text>
+ <xsl:value-of select="name(.)"/>
+ <xsl:if test="@t:predicate">
+ <xsl:value-of select="@t:predicate"/>
+ </xsl:if>
+ </xsl:attribute>
+ </xsl:element>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<doc:template match="*" mode="titlepage.specialrules" xmlns=""
+ id="star_in_titlepage.specialrules">
+<refpurpose>Create templates for special rules</refpurpose>
+
+<refdescription>
+<para>This template is called to process all of the descendants of the
+<literal>t:titlepage-content</literal> element that require special
+processing. At present, that's just <literal>t:or</literal> elements.
+</para>
+</refdescription>
+</doc:template>
+
+<xsl:template match="*" mode="titlepage.specialrules">
+ <xsl:variable name="side">
+ <xsl:choose>
+ <xsl:when test="ancestor::t:titlepage-content/@t:side">
+ <xsl:value-of select="ancestor::t:titlepage-content/@t:side"/>
+ </xsl:when>
+ <xsl:otherwise>recto</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="mode">
+ <xsl:value-of select="ancestor::t:titlepage/@t:element"/>
+ <xsl:text>.titlepage.</xsl:text>
+ <xsl:value-of select="$side"/>
+ <xsl:text>.auto.mode</xsl:text>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="name(.)='t:or'">
+ <xsl:apply-templates select="*" mode="titlepage.specialrules"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:if test="*"><!-- does this element have children? -->
+ <xsl:text>&#xA;&#xA;</xsl:text>
+ <xsl:element name="xsl:template">
+ <xsl:attribute name="match">
+ <xsl:value-of select="name(.)"/>
+ </xsl:attribute>
+ <xsl:attribute name="mode">
+ <xsl:value-of select="$mode"/>
+ </xsl:attribute>
+ <xsl:apply-templates select="*" mode="titlepage.subrules"/>
+ <xsl:text>&#xA;</xsl:text>
+ </xsl:element>
+ </xsl:if>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<doc:template match="*" mode="titlepage.subrules" xmlns=""
+ id="star_in_titlepage.subrules">
+<refpurpose>Create template for individual special rules</refpurpose>
+
+<refdescription>
+<para>This template is called to process the children of special
+template elements.
+</para>
+</refdescription>
+</doc:template>
+
+<xsl:template match="*" mode="titlepage.subrules">
+ <xsl:variable name="side">
+ <xsl:choose>
+ <xsl:when test="ancestor::t:titlepage-content/@t:side">
+ <xsl:value-of select="ancestor::t:titlepage-content/@t:side"/>
+ </xsl:when>
+ <xsl:otherwise>recto</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="mode">
+ <xsl:value-of select="ancestor::t:titlepage/@t:element"/>
+ <xsl:text>.titlepage.</xsl:text>
+ <xsl:value-of select="$side"/>
+ <xsl:text>.auto.mode</xsl:text>
+ </xsl:variable>
+
+ <xsl:element name="xsl:apply-templates">
+ <xsl:attribute name="select">
+ <xsl:value-of select="name(.)"/>
+ </xsl:attribute>
+ <xsl:attribute name="mode">
+ <xsl:value-of select="$mode"/>
+ </xsl:attribute>
+ </xsl:element>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<doc:template match="t:or" xmlns="" id="or">
+<refpurpose>Process the t:or special rule</refpurpose>
+
+<refdescription>
+<para>This template processes t:or.</para>
+</refdescription>
+</doc:template>
+
+<xsl:template match="t:or">
+ <xsl:variable name="side">
+ <xsl:choose>
+ <xsl:when test="ancestor::t:titlepage-content/@t:side">
+ <xsl:value-of select="ancestor::t:titlepage-content/@t:side"/>
+ </xsl:when>
+ <xsl:otherwise>recto</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="mode">
+ <xsl:value-of select="ancestor::t:titlepage/@t:element"/>
+ <xsl:text>.titlepage.</xsl:text>
+ <xsl:value-of select="$side"/>
+ <xsl:text>.auto.mode</xsl:text>
+ </xsl:variable>
+
+ <xsl:text>&#xA; </xsl:text>
+ <xsl:element name="xsl:apply-templates">
+ <xsl:attribute name="select">
+ <xsl:call-template name="element-or-list"/>
+ </xsl:attribute>
+ <xsl:attribute name="mode">
+ <xsl:value-of select="$mode"/>
+ </xsl:attribute>
+ </xsl:element>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<doc:template match="t:or" mode="titlepage.subrules" xmlns=""
+ id="or_in_titlepage.subrules">
+<refpurpose>Process the t:or special rule in
+titlepage.subrules mode</refpurpose>
+
+<refdescription>
+<para>The titlepage.subrules mode doesn't apply to t:or, so just
+reprocess this node in the normal mode.</para>
+</refdescription>
+</doc:template>
+
+<xsl:template match="t:or" mode="titlepage.subrules">
+ <xsl:apply-templates select="."/><!-- use normal mode -->
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<doc:template name="element-or-list" xmlns="">
+<refpurpose>Construct the "or-list" used in the select attribute for
+special rules.</refpurpose>
+
+<refdescription>
+<para>Walk through each of the children of t:or, producing the
+text of the select attribute.</para>
+</refdescription>
+</doc:template>
+
+<xsl:template name="element-or-list">
+ <xsl:param name="elements" select="*"/>
+ <xsl:param name="element.count" select="count($elements)"/>
+ <xsl:param name="count" select="1"/>
+ <xsl:param name="orlist"></xsl:param>
+
+ <xsl:choose>
+ <xsl:when test="$count>$element.count">
+ <xsl:value-of select="$orlist"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="element-or-list">
+ <xsl:with-param name="elements" select="$elements"/>
+ <xsl:with-param name="element.count" select="$element.count"/>
+ <xsl:with-param name="count" select="$count+1"/>
+ <xsl:with-param name="orlist">
+ <xsl:value-of select="$orlist"/>
+ <xsl:if test="not($orlist='')">|</xsl:if>
+ <xsl:value-of select="name($elements[position()=$count])"/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/tests/refentry.007.ns.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/tests/refentry.007.ns.xml
new file mode 100644
index 0000000..f66d6e0
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/tests/refentry.007.ns.xml
@@ -0,0 +1,325 @@
+<book xmlns="http://docbook.org/ns/docbook" version="5.0">
+<info><title>Unit Test: refentry.007</title>
+
+<releaseinfo role="CVS">$Id: refentry.007.xml 7282 2007-08-23 09:27:01Z xmldoc $</releaseinfo>
+<author><personname><firstname>Norman</firstname><surname>Walsh</surname></personname><affiliation><address><email>ndw@nwalsh.com</email></address></affiliation></author>
+</info>
+<reference><info><title>Reference</title></info>
+
+<refentry>
+ <info>
+ <authorgroup>
+ <author><personname><firstname>Norman</firstname><surname>Walsh</surname></personname><email>ndw@nwalsh.com</email><personblurb>
+ <para>Wrote the original version of this document.</para>
+ </personblurb></author>
+ <editor><personname><firstname>Michael(tm)</firstname><surname>Smith</surname></personname><contrib>Added a bunch of test cases.</contrib><email>smith@sideshowbarker.net</email></editor>
+ </authorgroup>
+ <copyright>
+ <year>2003</year>
+ <holder>Norman Walsh</holder>
+ </copyright>
+ <copyright>
+ <year>2006</year>
+ <holder>Michael(tm) Smith</holder>
+ </copyright>
+ <legalnotice>
+ <para>This file is a product of the DocBook Project.</para>
+ </legalnotice>
+ <legalnotice>
+ <para>Share and share alike.</para>
+ </legalnotice>
+ </info>
+<refnamediv>
+<refname>FirstName</refname>
+<refname>SecondName</refname>
+<refpurpose>Purpose for FirstName</refpurpose>
+</refnamediv>
+
+<refnamediv>
+<refname>ThirdName</refname>
+<refpurpose>Purpose for ThirdName</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+ <?dbfunclist ?>
+ <funcsynopsis>
+ <!-- * Yes, friend, Funcsynopsis is a verbatim -->
+ <funcsynopsisinfo>#include &lt;varargs.h&gt;
+#include &lt;mouteyh.h&gt;
+#include &lt;qlmppzj.h&gt;</funcsynopsisinfo>
+ <funcprototype>
+ <funcdef><type>float</type> <function>rand</function></funcdef>
+ <void/>
+ </funcprototype>
+
+ <funcprototype>
+ <funcdef>int <function>max</function></funcdef>
+ <varargs/>
+ </funcprototype>
+
+ <funcprototype>
+ <funcdef>int <function>idiv</function></funcdef>
+ <paramdef><type>int</type> <parameter>n</parameter></paramdef>
+ <paramdef><type>int</type> <parameter>m</parameter></paramdef>
+ </funcprototype>
+ </funcsynopsis>
+
+ <para>Another.</para>
+
+ <funcsynopsis>
+ <funcprototype>
+ <funcdef>void <function>qsort</function></funcdef>
+ <paramdef>void *<parameter>dataptr</parameter>[]</paramdef>
+ <paramdef>int <parameter>left</parameter></paramdef>
+ <paramdef>int <parameter>right</parameter></paramdef>
+ <paramdef>int (*<parameter>comp</parameter>)
+ <funcparams>void *, void *</funcparams></paramdef>
+ </funcprototype>
+ </funcsynopsis>
+
+ <funcsynopsis>
+ <funcprototype>
+ <funcdef>int <function>foo_frob_something</function></funcdef>
+ <paramdef>foo_sometype1 <parameter>foo_frob_parm1</parameter></paramdef>
+ <paramdef>foo_sometype1 <parameter>foo_frob_parm2</parameter></paramdef>
+ <paramdef>foo_sometype1 <parameter>foo_frob_parm3</parameter></paramdef>
+ <paramdef><type>int</type> (* <parameter>parm4</parameter> )
+ <funcparams>int a, int b, int c</funcparams>
+ </paramdef>
+ <paramdef>foo_sometype1 <parameter>foo_frob_parm5</parameter></paramdef>
+ </funcprototype>
+
+ <funcprototype>
+ <funcdef>int <function>foo_frob_something</function></funcdef>
+ <paramdef>foo_sometype1 <parameter>foo_frob_parm1</parameter></paramdef>
+ <paramdef>foo_sometype1 <parameter>foo_frob_parm2</parameter></paramdef>
+ <paramdef>foo_sometype1 <parameter>foo_frob_parm3</parameter></paramdef>
+ <paramdef><type>int</type> (* <parameter>parm4</parameter> )
+ <funcparams>int a, int b, int c</funcparams>
+ </paramdef>
+ <paramdef>foo_sometype1 <parameter>foo_frob_parm5</parameter></paramdef>
+ </funcprototype>
+ </funcsynopsis>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+
+<para>This is a minimal RefEntry.</para>
+
+<para>The following is a Variablelist with a title.
+<variablelist><info><title>My variablelist</title></info>
+
+ <varlistentry>
+ <term>varlistentry term 1</term>
+ <listitem><para>some listitem text</para></listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>varlistentry term 2</term>
+ <listitem><para>some more listitem text</para></listitem>
+ </varlistentry>
+</variablelist>
+</para>
+<refsection><info><title>Subsection</title></info>
+
+<para>This is a minimal RefEntry.</para>
+
+<para>The following is a Variablelist with a title and a nested variablelist
+ <glosslist>
+
+ <glossentry>
+ <glossterm>glossentry term 1</glossterm>
+ <glossdef><para>some glossdef text</para></glossdef>
+ </glossentry>
+ <glossentry>
+ <glossterm>glossentry term 2</glossterm>
+ <glossdef>
+ <variablelist>
+ <varlistentry>
+ <term>nested variablelist term 1</term>
+ <listitem><para>some variablelist text</para></listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>nested variablelist term 2</term>
+ <listitem><para>some more variablelist text</para></listitem>
+ </varlistentry>
+ </variablelist>
+ </glossdef>
+ </glossentry>
+ </glosslist>
+</para>
+
+<refsection><info><title>Sub-subsection</title></info>
+
+<para>This is a minimal RefEntry.</para>
+</refsection>
+</refsection>
+</refsection>
+
+<refsection><info><title>More Description</title></info>
+
+<para>This is a not-so minimal RefEntry.</para>
+<screen>
+This is a screen [break here]
+that starts with a line of space. [break here]
+And it ends with a line of space.
+</screen>
+
+<para>normal paragraph here</para>
+
+<screen>This is a screen [break here]
+that does not start with a line of space. [break here]
+And does not end with a line of space.</screen>
+
+<para>This is a normal paragraph that contains a screen.
+<screen>This is a screen within a normal paragraph [break here]
+that does not start with a line of space. [break here]
+And does not end with a line of space but is followed
+by a line of space.</screen>
+</para>
+
+<para>This is another normal paragraph that contains a screen.
+<screen>This is a screen within a normal paragraph [break here]
+that does not start with a line of space. [break here]
+And does not end with a line of space and is not followed
+by a line of space.</screen></para>
+
+<para>This is another normal paragraph that contains a screen.
+<screen>
+This is a screen within a normal paragraph [break here]
+that starts with a line of space. [break here]
+And ends with a line of space but is not followed by a line of space.
+</screen></para>
+
+<para>This is another normal paragraph that contains a screen.
+<screen>
+This is a screen within a normal paragraph [break here]
+that starts with a line of space. [break here]
+And ends with a line of space and is followed by a line of space.
+</screen>
+</para>
+
+<para>This is another normal paragraph that contains a screen.
+<screen>
+
+This is a screen within a normal paragraph [break here]
+that starts with a 2 lines of space. [break here]
+And ends with 3 lines of space and is followed by a line of space.
+
+
+</screen>
+</para>
+
+<para>This paragraph contains an itemizedlist with a title. The title
+is “Mrignkwolmcngâ€.
+<orderedlist inheritnum="ignore" continuation="restarts"><info><title>Mrignkwolmcng</title></info>
+
+ <listitem>
+ <para>itemizedlist listitem 1</para>
+ </listitem>
+ <listitem>
+ <para>itemizedlist listitem 2</para>
+ </listitem>
+</orderedlist>
+
+This is some useless text that follows the “Mrignkwolmcng†orderedlist
+in the same para.</para>
+
+<para>The following is a Variablelist with a title and with a nested itemizedlist.
+<variablelist><info><title>My variablelist</title></info>
+
+ <varlistentry>
+ <term>varlistentry term 1</term>
+ <listitem>
+ <itemizedlist><info><title>nested itemizedlist</title></info>
+
+ <listitem>
+ <para>itemizedlist listitem 1</para>
+ </listitem>
+ <listitem>
+ <para>itemizedlist listitem 2</para>
+ </listitem>
+ </itemizedlist>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>varlistentry term 2</term>
+ <listitem><para>some more listitem text</para></listitem>
+ </varlistentry>
+</variablelist>
+</para>
+
+<para>The following is a Variablelist with a title and with a
+nested Varlistentry that contains multiple Terms
+<variablelist><info><title>My nested-multi-term-per-varlistentry variablelist</title></info>
+
+ <varlistentry>
+ <term>Varlistentry term 1</term>
+ <listitem>
+ <variablelist>
+ <varlistentry>
+ <term> varlistentry term 1.1</term>
+ <term>varlistentry term 1.2 </term>
+ <term>varlistentry term 1.3</term>
+ <listitem><para>All 'bout terms 1.1, 1.2, and 1.3</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>varlistentry term 2</term>
+ <listitem><para>some more listitem text</para></listitem>
+ </varlistentry>
+</variablelist>
+</para>
+
+<refsection><info><title>Subsection</title></info>
+
+<para>This is a minimal RefEntry.</para>
+</refsection>
+</refsection>
+
+<refsection><info><title>Even More Description</title></info>
+
+<para>This is an even less minimal RefEntry.</para>
+
+<para>This is a paragraph. It contains the following segmentedlist,
+titled “Gibbererishâ€, with several segtitle elements.
+<segmentedlist>
+
+ <segtitle>Floober</segtitle>
+ <segtitle>Buugler</segtitle>
+ <segtitle>Sstangooo</segtitle>
+ <segtitle>Borobinda</segtitle>
+ <seglistitem>
+ <seg>Bamalalaboonda Bamalalaboonda Bamalalaboonda Bamalalaboonda Bamalalaboonda Bamalalaboonda</seg>
+ <seg>Mondorotoluafu</seg>
+ <seg>Ganafutralinga</seg>
+ <seg>Patagularamakundra</seg>
+ </seglistitem>
+ <seglistitem>
+ <seg>Cadraracondar</seg>
+ <seg>Hentirotomaambu</seg>
+ <seg>BdomentriolaiaBdomentriolaiaBdomentriolaia</seg>
+ <seg>Candamalaturuanio</seg>
+ </seglistitem>
+</segmentedlist>
+This is some text that follows the segementedlist within the same
+paragraph. The next part of this same paragraph is an
+<tag>important</tag> admonition.
+<important>
+ <para>It is very important that you read this. That’s why it stands
+ out the way that it does.</para>
+</important>
+</para>
+
+<para>This is a para with a footnote
+ <footnote><para>Stuff here <programlisting>This is a program listing
+that's two lines long.</programlisting></para>
+ and stuff after the
+footnote</footnote></para>
+</refsection>
+
+</refentry>
+</reference>
+</book>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/tests/refentry.007.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/tests/refentry.007.xml
new file mode 100644
index 0000000..4521376
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/tests/refentry.007.xml
@@ -0,0 +1,340 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.4//EN"
+ "http://www.oasis-open.org/docbook/xml/4.4/docbookx.dtd">
+<book>
+<bookinfo>
+<title>Unit Test: refentry.007</title>
+<releaseinfo role="CVS">$Id: refentry.007.xml 7282 2007-08-23 09:27:01Z xmldoc $</releaseinfo>
+<author><firstname>Norman</firstname><surname>Walsh</surname>
+ <affiliation><address><email>ndw@nwalsh.com</email></address></affiliation>
+</author>
+</bookinfo>
+<reference>
+<title>Reference</title>
+<refentry>
+ <refentryinfo>
+ <authorgroup>
+ <author>
+ <firstname>Norman</firstname><surname>Walsh</surname>
+ <email>ndw@nwalsh.com</email>
+ <personblurb>
+ <para>Wrote the original version of this document.</para>
+ </personblurb>
+ </author>
+ <editor>
+ <contrib>Added a bunch of test cases.</contrib>
+ <firstname>Michael(tm)</firstname><surname>Smith</surname>
+ <email>smith@sideshowbarker.net</email>
+ </editor>
+ </authorgroup>
+ <copyright>
+ <year>2003</year>
+ <holder>Norman Walsh</holder>
+ </copyright>
+ <copyright>
+ <year>2006</year>
+ <holder>Michael(tm) Smith</holder>
+ </copyright>
+ <legalnotice>
+ <para>This file is a product of the DocBook Project.</para>
+ </legalnotice>
+ <legalnotice>
+ <para>Share and share alike.</para>
+ </legalnotice>
+ </refentryinfo>
+<refnamediv>
+<refname>FirstName</refname>
+<refname>SecondName</refname>
+<refpurpose>Purpose for FirstName</refpurpose>
+</refnamediv>
+
+<refnamediv>
+<refname>ThirdName</refname>
+<refpurpose>Purpose for ThirdName</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+ <?dbfunclist ?>
+ <funcsynopsis>
+ <!-- * Yes, friend, Funcsynopsis is a verbatim -->
+ <funcsynopsisinfo
+>#include &lt;varargs.h&gt;
+#include &lt;mouteyh.h&gt;
+#include &lt;qlmppzj.h&gt;</funcsynopsisinfo>
+ <funcprototype>
+ <funcdef><type>float</type> <function>rand</function></funcdef>
+ <void/>
+ </funcprototype>
+
+ <funcprototype>
+ <funcdef>int <function>max</function></funcdef>
+ <varargs/>
+ </funcprototype>
+
+ <funcprototype>
+ <funcdef>int <function>idiv</function></funcdef>
+ <paramdef><type>int</type> <parameter>n</parameter></paramdef>
+ <paramdef><type>int</type> <parameter>m</parameter></paramdef>
+ </funcprototype>
+ </funcsynopsis>
+
+ <para>Another.</para>
+
+ <funcsynopsis>
+ <funcprototype>
+ <funcdef>void <function>qsort</function></funcdef>
+ <paramdef>void *<parameter>dataptr</parameter>[]</paramdef>
+ <paramdef>int <parameter>left</parameter></paramdef>
+ <paramdef>int <parameter>right</parameter></paramdef>
+ <paramdef>int (*<parameter>comp</parameter>)
+ <funcparams>void *, void *</funcparams></paramdef>
+ </funcprototype>
+ </funcsynopsis>
+
+ <funcsynopsis>
+ <funcprototype>
+ <funcdef>int <function>foo_frob_something</function></funcdef>
+ <paramdef>foo_sometype1 <parameter>foo_frob_parm1</parameter></paramdef>
+ <paramdef>foo_sometype1 <parameter>foo_frob_parm2</parameter></paramdef>
+ <paramdef>foo_sometype1 <parameter>foo_frob_parm3</parameter></paramdef>
+ <paramdef><type>int</type> (* <parameter>parm4</parameter> )
+ <funcparams>int a, int b, int c</funcparams>
+ </paramdef>
+ <paramdef>foo_sometype1 <parameter>foo_frob_parm5</parameter></paramdef>
+ </funcprototype>
+
+ <funcprototype>
+ <funcdef>int <function>foo_frob_something</function></funcdef>
+ <paramdef>foo_sometype1 <parameter>foo_frob_parm1</parameter></paramdef>
+ <paramdef>foo_sometype1 <parameter>foo_frob_parm2</parameter></paramdef>
+ <paramdef>foo_sometype1 <parameter>foo_frob_parm3</parameter></paramdef>
+ <paramdef><type>int</type> (* <parameter>parm4</parameter> )
+ <funcparams>int a, int b, int c</funcparams>
+ </paramdef>
+ <paramdef>foo_sometype1 <parameter>foo_frob_parm5</parameter></paramdef>
+ </funcprototype>
+ </funcsynopsis>
+</refsynopsisdiv>
+
+<refsect1>
+<title>Description</title>
+<para>This is a minimal RefEntry.</para>
+
+<para>The following is a Variablelist with a title.
+<variablelist>
+ <title>My variablelist</title>
+ <varlistentry>
+ <term>varlistentry term 1</term>
+ <listitem><para>some listitem text</para></listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>varlistentry term 2</term>
+ <listitem><para>some more listitem text</para></listitem>
+ </varlistentry>
+</variablelist>
+</para>
+<refsect2>
+<title>Subsection</title>
+<para>This is a minimal RefEntry.</para>
+
+<para>The following is a Variablelist with a title and a nested variablelist
+ <glosslist>
+ <title>My glosslist</title>
+ <glossentry>
+ <glossterm>glossentry term 1</glossterm>
+ <glossdef><para>some glossdef text</para></glossdef>
+ </glossentry>
+ <glossentry>
+ <glossterm>glossentry term 2</glossterm>
+ <glossdef>
+ <variablelist>
+ <varlistentry>
+ <term>nested variablelist term 1</term>
+ <listitem><para>some variablelist text</para></listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>nested variablelist term 2</term>
+ <listitem><para>some more variablelist text</para></listitem>
+ </varlistentry>
+ </variablelist>
+ </glossdef>
+ </glossentry>
+ </glosslist>
+</para>
+
+<refsect3>
+<title>Sub-subsection</title>
+<para>This is a minimal RefEntry.</para>
+</refsect3>
+</refsect2>
+</refsect1>
+
+<refsect1>
+<title>More Description</title>
+<para>This is a not-so minimal RefEntry.</para>
+<screen>
+This is a screen [break here]
+that starts with a line of space. [break here]
+And it ends with a line of space.
+</screen>
+
+<para>normal paragraph here</para>
+
+<screen>This is a screen [break here]
+that does not start with a line of space. [break here]
+And does not end with a line of space.</screen>
+
+<para>This is a normal paragraph that contains a screen.
+<screen>This is a screen within a normal paragraph [break here]
+that does not start with a line of space. [break here]
+And does not end with a line of space but is followed
+by a line of space.</screen>
+</para>
+
+<para>This is another normal paragraph that contains a screen.
+<screen>This is a screen within a normal paragraph [break here]
+that does not start with a line of space. [break here]
+And does not end with a line of space and is not followed
+by a line of space.</screen></para>
+
+<para>This is another normal paragraph that contains a screen.
+<screen>
+This is a screen within a normal paragraph [break here]
+that starts with a line of space. [break here]
+And ends with a line of space but is not followed by a line of space.
+</screen></para>
+
+<para>This is another normal paragraph that contains a screen.
+<screen>
+This is a screen within a normal paragraph [break here]
+that starts with a line of space. [break here]
+And ends with a line of space and is followed by a line of space.
+</screen>
+</para>
+
+<para>This is another normal paragraph that contains a screen.
+<screen>
+
+This is a screen within a normal paragraph [break here]
+that starts with a 2 lines of space. [break here]
+And ends with 3 lines of space and is followed by a line of space.
+
+
+</screen>
+</para>
+
+<para>This paragraph contains an itemizedlist with a title. The title
+is “Mrignkwolmcngâ€.
+<orderedlist>
+ <title>Mrignkwolmcng</title>
+ <listitem>
+ <para>itemizedlist listitem 1</para>
+ </listitem>
+ <listitem>
+ <para>itemizedlist listitem 2</para>
+ </listitem>
+</orderedlist>
+
+This is some useless text that follows the “Mrignkwolmcng†orderedlist
+in the same para.</para>
+
+<para>The following is a Variablelist with a title and with a nested itemizedlist.
+<variablelist>
+ <title>My variablelist</title>
+ <varlistentry>
+ <term>varlistentry term 1</term>
+ <listitem>
+ <itemizedlist>
+ <title>nested itemizedlist</title>
+ <listitem>
+ <para>itemizedlist listitem 1</para>
+ </listitem>
+ <listitem>
+ <para>itemizedlist listitem 2</para>
+ </listitem>
+ </itemizedlist>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>varlistentry term 2</term>
+ <listitem><para>some more listitem text</para></listitem>
+ </varlistentry>
+</variablelist>
+</para>
+
+<para>The following is a Variablelist with a title and with a
+nested Varlistentry that contains multiple Terms
+<variablelist>
+ <title>My nested-multi-term-per-varlistentry variablelist</title>
+ <varlistentry>
+ <term>Varlistentry term 1</term>
+ <listitem>
+ <variablelist>
+ <varlistentry>
+ <term> varlistentry term 1.1</term>
+ <term>varlistentry term 1.2 </term>
+ <term>varlistentry term 1.3</term>
+ <listitem><para>All 'bout terms 1.1, 1.2, and 1.3</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>varlistentry term 2</term>
+ <listitem><para>some more listitem text</para></listitem>
+ </varlistentry>
+</variablelist>
+</para>
+
+<refsect2>
+<title>Subsection</title>
+<para>This is a minimal RefEntry.</para>
+</refsect2>
+</refsect1>
+
+<refsect1>
+<title>Even More Description</title>
+<para>This is an even less minimal RefEntry.</para>
+
+<para>This is a paragraph. It contains the following segmentedlist,
+titled “Gibbererishâ€, with several segtitle elements.
+<segmentedlist>
+ <title>Gibbererish</title>
+ <segtitle>Floober</segtitle>
+ <segtitle>Buugler</segtitle>
+ <segtitle>Sstangooo</segtitle>
+ <segtitle>Borobinda</segtitle>
+ <seglistitem>
+ <seg>Bamalalaboonda Bamalalaboonda Bamalalaboonda Bamalalaboonda Bamalalaboonda Bamalalaboonda</seg>
+ <seg>Mondorotoluafu</seg>
+ <seg>Ganafutralinga</seg>
+ <seg>Patagularamakundra</seg>
+ </seglistitem>
+ <seglistitem>
+ <seg>Cadraracondar</seg>
+ <seg>Hentirotomaambu</seg>
+ <seg>BdomentriolaiaBdomentriolaiaBdomentriolaia</seg>
+ <seg>Candamalaturuanio</seg>
+ </seglistitem>
+</segmentedlist>
+This is some text that follows the segementedlist within the same
+paragraph. The next part of this same paragraph is an
+<sgmltag>important</sgmltag> admonition.
+<important>
+ <para>It is very important that you read this. That’s why it stands
+ out the way that it does.</para>
+</important>
+</para>
+
+<para>This is a para with a footnote
+ <footnote
+ ><para>Stuff here <programlisting>This is a program listing
+that's two lines long.</programlisting></para>
+ and stuff after the
+footnote</footnote></para>
+</refsect1>
+
+</refentry>
+</reference>
+</book>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/tools/bin/docbook-xsl-update b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/tools/bin/docbook-xsl-update
new file mode 100644
index 0000000..0d44f56
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/tools/bin/docbook-xsl-update
@@ -0,0 +1,53 @@
+#!/bin/bash
+# vim: number
+
+# docbook-xsl-update - Update environment to latest docbook-xsl snapshot
+# $Id: docbook-xsl-update 6565 2007-01-29 23:00:16Z xmldoc $
+
+if [ -z $DOCBOOK_MIRROR ]; then
+ myhost=docbook.xml-doc.org:5873;
+else
+ myhost=$DOCBOOK_MIRROR;
+fi
+
+mydir=$(readlink -f $(dirname $0))
+mydocbook_xsl_base=$(readlink -f $(dirname $0)/../..)
+
+if [ ! -f $mydocbook_xsl_base/VERSION ]; then
+ cat <<- EOF
+$(basename $0): error: not in snapshot directory. Stopping.
+
+The $(basename $0) script must be installed within its original
+location in the tools/bin directory in the docbook-xsl distribution.
+EOF
+ exit 1
+fi
+
+usage="Usage:
+
+ $(basename $0) [-h HOST[:PORT]]
+
+ -h HOST[:PORT] Specifies the rsync host and port number to use.
+ If not specified, uses the value of the
+ \$DOCBOOK_MIRROR environment variable. If that
+ environment variable is not specified, defaults
+ to a hard-coded value.
+
+"
+
+while getopts "h:" opt; do
+ case $opt in
+ h ) myhost=$OPTARG ;;
+ \? ) printf "$usage"
+ printf "$opts_admon"
+ exit 1 ;;
+ esac
+done
+
+shift $(($OPTIND - 1))
+
+if [ -z $myhost ]; then
+ myhost=$DOCBOOK_MIRROR
+fi
+
+rsync -auv rsync://$myhost/xsl $mydocbook_xsl_base
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/tools/make/Makefile.DocBook b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/tools/make/Makefile.DocBook
new file mode 100644
index 0000000..242066e
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/tools/make/Makefile.DocBook
@@ -0,0 +1,698 @@
+# $Source$
+# $Author: xmldoc $
+# $Date: 2008-03-03 01:20:29 -0800 (Mon, 03 Mar 2008) $
+# $Revision: 7787 $
+# vim: number
+#
+# -----------------------------------------------------------------
+# ** Makefile.DocBook -- generate output from DocBook sources **
+# -----------------------------------------------------------------
+#
+# This file is part of the DocBook Project XSL Stylesheet
+# distribution.
+#
+# See http://docbook.sourceforge.net/release/xsl/current/
+# for copyright and other information.
+
+# DOCBOOK_OUTPUT_FORMATS is the default set of targets (output
+# formats) that get built when you type "make" without any targets
+# explicitly specified. To generate a different set of output
+# formats, change the value of DOCBOOK_OUTPUT_FORMATS here or set
+# it in your environment; for example:
+#
+# set DOCBOOK_OUTPUT_FORMATS="html pdf"; export DOCBOOK_OUTPUT_FORMATS
+#
+# Of course by explicitly specifying particular targets when you
+# invoke "make", you can always override generation of the default
+# set of targets; for example:
+#
+# make html txt
+#
+# That would generate just HTML (unchunked) and plain-text output.
+#
+DOCBOOK_OUTPUT_FORMATS ?= xml man man-pdf chunk txt pdf
+
+# If you want XHTML output instead of HTML, set HTML_OR_XHTML to
+# 'xhtml' or just specify 'xhtml" in DOCBOOK_OUTPUT_FORMATS.
+ifeq ($(findstring xhtml,$(DOCBOOK_OUTPUT_FORMATS)),)
+HTML_OR_XHTML ?= html
+else
+HTML_OR_XHTML ?= xhtml
+endif
+
+# if your source is in asciidoc instead of DocBook, set
+# ASCII_OR_DOCBOOK to "ascii"
+ASCII_OR_DOCBOOK ?= docbook
+
+# -----------------------------------------------------------------
+# *** TOOLS and other DEPENDENCIES ***
+# -----------------------------------------------------------------
+# we use rmdir(1) to remove dirs we create for chunked HTML output
+RMDIR = rmdir
+# "-p" causes empty parent dirs to be deleted as well
+RMDIR_FLAGS = --ignore-fail-on-non-empty -p
+
+# possible values for PDF_MAKER are:
+# dblatex|fop|xep|xmlroff|passivetex
+PDF_MAKER = dblatex
+
+# possible values for TXT_MAKER are:
+# links|lynx|w3m|w3mmee
+TXT_MAKER = links
+TXT_MAKER_FLAGS = -dump
+
+# xsl
+XSLT = xsltproc
+XSLT_FLAGS = --xinclude
+
+# http://dblatex.sourceforge.net/
+DBLATEX = dblatex
+DBLATEX_FLAGS = -b pdftex
+
+FOP = fop
+FOP_FLAGS =
+
+XEP = xep
+XEP_FLAGS =
+
+# http://xmlroff.sourceforge.net/
+XMLROFF = xmlroff
+XMLROFF_FLAGS =
+
+PDFTEX = pdftex
+PDFTEX_FLAGS =
+
+# used by PassiveTeX
+PDFXMLTEX = pdfxmltex
+
+# http://docbook2x.sourceforge.net/
+DB2X_XSLTPROC = db2x_xsltproc
+DB2X_XSLTPROC_FLAGS =
+DB2X_TEXIXML = db2x_texixml
+DB2X_TEXIXML_FLAGS =
+
+# we call the man(1) command to generate "foo.N.pdf" and
+# "foo.N.txt" output (see "man-pdf" & "man-txt" targets)
+MAN = man
+MAN_FLAGS =
+
+# The "ps2pdf" command is part of GhostSript (gs) distro.
+# It is just a wrapper script around gs that does this:
+#
+# gs -dCompatibilityLevel=1.2 -q -dNOPAUSE -dBATCH -sDEVICE=pdfwrite \
+# "-sOutputFile=$outfile" -dCompatibilityLevel=1.2 -c .setpdfwrite -f "$infile"
+#
+# Where, for example: $outfile = foo.pdf and $infile = foo.1
+PS2PDF = ps2pdf
+PS2PDF_FLAGS =
+
+# asciidoc is used to generate DocBook XML from asciidoc source
+ASCIIDOC=asciidoc
+ASCIIDOCFLAGS=
+
+# asciidoc source seems to have DOS line endings, so we use
+# DOS2UNIX to be able to grep them correctly
+DOS2UNIX=dos2unix
+DOS2UNIXFLAGS=
+
+# The "col" command is needed for stripping backspaces and
+# underscores from man(1) output to get pure plain-text
+COL = col
+COL_FLAGS =
+
+# The "expand" command is needed for expanding tabs from files
+# generated from "man foo.1 | col -b" output
+# output to get pure plain-text
+EXPAND = expand
+EXPAND_FLAGS =
+
+# value of DOCBOOK_XSL should either be the canonical
+# (docbook.sourceforge.net) URL for the DocBook Project XSL
+# stylesheets OR it can be a local system path
+DOCBOOK_XSL = http://docbook.sourceforge.net/release/xsl/current
+
+# -----------------------------------------------------------------
+# names of some DIRECTORIES and FILES we need
+# -----------------------------------------------------------------
+# We create a tmp directory once per make invocation; it's needed
+# for holding a temporary copy of the custom DBLaTeX stylesheet
+# (because dblatex currently can't read a stylesheet from stdin)
+TMP ?= /tmp
+TMPNUM := $(shell echo $$$$)
+DOCBOOK_TMP := $(TMP)/docbook-make-$(TMPNUM)
+
+# MAN_MANIFEST_EXT is file extension added to individual manifest
+# files
+MAN_MANIFEST_EXT = manifest_man
+
+# HTML_MANIFEST_EXT is file extension added to HTML manifest files
+HTML_MANIFEST_EXT = manifest_html
+
+# BASEDIR_SUFFIX is a what you need to set if you want a suffix
+# added to the end of each "base.dir" we create while generating
+# chunked HTML output
+#BASEDIR_SUFFIX = -html
+#BASEDIR_SUFFIX = _html
+BASEDIR_SUFFIX =
+
+# -----------------------------------------------------------------
+# assorted OPTIONS
+# -----------------------------------------------------------------
+# HTML_STYLESHEET -> $html.stylesheet stylesheet param
+# http://docbook.sourceforge.net/snapshots/xsl/doc/html/html.stylesheet.html
+HTML_STYLESHEET = style.css
+# HTML_IMAGES -> $admon.graphics.path
+# http://docbook.sourceforge.net/snapshots/xsl/doc/html/admon.graphics.path.html
+HTML_IMAGES = images/
+# HTML_IMAGES_EXT -> $admon.graphics.extension
+# http://docbook.sourceforge.net/snapshots/xsl/doc/html/admon.graphics.extension.html
+HTML_IMAGES_EXT = .png
+
+# use these to set params on the command-line
+# format is, e.g., HTML_PARAMS="--stringparam variablelist.as.table 1..."
+FO_PARAMS =
+HTML_PARAMS =
+MAN_PARAMS =
+
+# DBX_PARAMS is for dblatex(1); format uses "-p":
+# DBX_PARAMS="-p doc.publisher.show 1 -p term.breakline 1...
+DBX_PARAMS=
+
+# What file extension do you use for DocBook source files?
+DOCBOOK_FILE_EXTENSION = .xml
+
+# -----------------------------------------------------------------
+# make(1) functions for building file lists
+# -----------------------------------------------------------------
+#
+# the values of the following are used for determing what needs
+# to be built and/or cleaned up
+
+ifeq ($(ASCII_OR_DOCBOOK),docbook)
+SOURCE_FILES_DBK = $(wildcard *$(DOCBOOK_FILE_EXTENSION))
+else
+SOURCE_FILES_DBK = $(foreach base,$(basename $(wildcard *.txt)),$(base)$(DOCBOOK_FILE_EXTENSION))
+endif
+
+FILES_FO = $(foreach base,$(basename $(SOURCE_FILES_DBK)),$(base).fo)
+FILES_TXT = $(foreach base,$(basename $(SOURCE_FILES_DBK)),$(base).out.txt)
+FILES_PDF = $(foreach base,$(basename $(SOURCE_FILES_DBK)),$(base).pdf)
+FILES_LOG = $(foreach base,$(basename $(SOURCE_FILES_DBK)),$(base).log)
+FILES_OUT = $(foreach base,$(basename $(SOURCE_FILES_DBK)),$(base).out)
+FILES_AUX = $(foreach base,$(basename $(SOURCE_FILES_DBK)),$(base).aux)
+FILES_HTML = $(foreach base,$(basename $(SOURCE_FILES_DBK)),$(base).html)
+FILES_INFO = $(foreach base,$(basename $(SOURCE_FILES_DBK)),$(base).info)
+DIRS_CHUNK = $(foreach base,$(basename $(SOURCE_FILES_DBK)),$(base)$(BASEDIR_SUFFIX))
+LISTS_HTML = $(foreach base,$(basename $(SOURCE_FILES_DBK)),$(base).$(HTML_MANIFEST_EXT))
+LISTS_MAN = $(foreach base,$(basename $(SOURCE_FILES_DBK)),$(base).$(MAN_MANIFEST_EXT))
+FILES_CHNK = $(shell for manifest in $(LISTS_HTML); do if [ -f "$$manifest" ]; then cat $$manifest; fi done)
+FILES_MAN = $(shell for manifest in $(LISTS_MAN); do if [ -f "$$manifest" ]; then cat $$manifest; fi done)
+FILES_MANP = $(foreach base,$(FILES_MAN),$(base).man.pdf)
+FILES_MANT = $(foreach base,$(FILES_MAN),$(base).out.txt)
+DIRS_MAN = $(shell for file in $(FILES_MAN); do dirname $$file; done | uniq)
+
+# -----------------------------------------------------------------
+# ** stylesheet for testing whether a file has a refentry
+# -----------------------------------------------------------------
+REFENTRY_CHECK := <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" \
+ version="1.0" \
+ xmlns:db="http://docbook.org/ns/docbook" \
+ > \
+ <xsl:output method="text"/> \
+ <xsl:template match="/"> \
+ <xsl:if test="//refentry|//db:refentry"> \
+ <xsl:text>true</xsl:text> \
+ </xsl:if> \
+ </xsl:template> \
+</xsl:stylesheet>
+
+# -----------------------------------------------------------------
+# ** Stylesheet Customization Layers **
+# -----------------------------------------------------------------
+#
+# for DBLaTeX
+DBX_CUSTOM := <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" \
+ version="1.0"> \
+ <xsl:param name="co.linkends.show">0</xsl:param> \
+ <xsl:param name="callout.markup.circled">1</xsl:param> \
+ <xsl:param name="callout.linkends.hot">0</xsl:param> \
+ <xsl:param name="doc.publisher.show">1</xsl:param> \
+ <xsl:param name="term.breakline">1</xsl:param> \
+ <xsl:param name="doc.alignment">left</xsl:param> \
+ <xsl:param name="newtbl.use">1</xsl:param> \
+ <xsl:param name="latex.hyperparam"/> \
+ <xsl:param name="latex.style">docbook</xsl:param> \
+ <xsl:param name="latex.biblio.output">all</xsl:param> \
+ <xsl:param name="latex.bibfiles">""</xsl:param> \
+ <xsl:param name="latex.bibwidelabel">WIDELABEL</xsl:param> \
+ <xsl:param name="latex.output.revhistory">0</xsl:param> \
+ <xsl:param name="latex.figure.position">[htbp]</xsl:param> \
+ <xsl:param name="latex.figure.boxed">0</xsl:param> \
+ <xsl:param name="latex.babel.use">1</xsl:param> \
+ <xsl:param name="latex.babel.language"></xsl:param> \
+ <xsl:param name="latex.class.options">twoside</xsl:param> \
+ <xsl:param name="biblioentry.item.separator">, </xsl:param> \
+ <xsl:param name="refentry.xref.manvolnum">1</xsl:param> \
+ <xsl:param name="refsynopsis.title">Synopsis</xsl:param> \
+ <xsl:param name="refnamediv.title"></xsl:param> \
+ <xsl:param name="funcsynopsis.style">ansi</xsl:param> \
+ <xsl:param name="funcsynopsis.decoration">1</xsl:param> \
+ <xsl:param name="function.parens">0</xsl:param> \
+ <xsl:param name="classsynopsis.default.language">java</xsl:param> \
+ <xsl:param name="show.comments">0</xsl:param> \
+</xsl:stylesheet>
+
+# for FO output
+FO_CUSTOM := <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" \
+ xmlns:fo="http://www.w3.org/1999/XSL/Format" \
+ version="1.0"> \
+ <xsl:import href="$(DOCBOOK_XSL)/fo/docbook.xsl"/> \
+ <xsl:param name="$(PDF_MAKER).extensions">1</xsl:param> \
+ <xsl:param name="paper.type">A4</xsl:param> \
+ <xsl:param name="draft.watermark.image"></xsl:param> \
+ <xsl:param name="hyphenation">false</xsl:param> \
+ <xsl:param name="hyphenate.verbatim">1</xsl:param> \
+ <xsl:param name="alignment">left</xsl:param> \
+ <xsl:param name="refentry.generate.name">1</xsl:param> \
+ <xsl:param name="refentry.generate.title">0</xsl:param> \
+ <xsl:param name="refentry.pagebreak">1</xsl:param> \
+ <xsl:param name="shade.verbatim">1</xsl:param> \
+ <xsl:param name="variablelist.as.blocks">1</xsl:param> \
+ <xsl:param name="ulink.show">1</xsl:param> \
+ <xsl:param name="ulink.footnotes">1</xsl:param> \
+ <xsl:param name="index.on.type">1</xsl:param> \
+ <xsl:attribute-set name="xref.properties"> \
+ <xsl:attribute name="color">blue</xsl:attribute> \
+ </xsl:attribute-set> \
+ <xsl:attribute-set name="shade.verbatim.style"> \
+ <xsl:attribute name="background-color">\#E0E0E0</xsl:attribute> \
+ <xsl:attribute name="padding-left">4pt</xsl:attribute> \
+ <xsl:attribute name="padding-right">4pt</xsl:attribute> \
+ <xsl:attribute name="padding-top">4pt</xsl:attribute> \
+ <xsl:attribute name="padding-bottom">4pt</xsl:attribute> \
+ </xsl:attribute-set> \
+ <xsl:attribute-set name="section.title.level1.properties"> \
+ <xsl:attribute name="font-size"> \
+ <xsl:value-of select="$$body.font.master * 1.5"></xsl:value-of> \
+ <xsl:text>pt</xsl:text> \
+ </xsl:attribute> \
+ </xsl:attribute-set> \
+ <xsl:attribute-set name="section.title.level2.properties"> \
+ <xsl:attribute name="font-size"> \
+ <xsl:value-of select="$$body.font.master * 1.3"></xsl:value-of> \
+ <xsl:text>pt</xsl:text> \
+ </xsl:attribute> \
+ </xsl:attribute-set> \
+ <xsl:attribute-set name="section.title.level3.properties"> \
+ <xsl:attribute name="font-size"> \
+ <xsl:value-of select="$$body.font.master * 1.1"></xsl:value-of> \
+ <xsl:text>pt</xsl:text> \
+ </xsl:attribute> \
+ </xsl:attribute-set> \
+ <xsl:attribute-set name="section.title.level4.properties"> \
+ <xsl:attribute name="font-size"> \
+ <xsl:value-of select="$$body.font.master"></xsl:value-of> \
+ <xsl:text>pt</xsl:text> \
+ </xsl:attribute> \
+ </xsl:attribute-set> \
+ <xsl:attribute-set name="component.title.properties"> \
+ <xsl:attribute name="font-size"> \
+ <xsl:value-of select="$$body.font.master * 1.5"></xsl:value-of> \
+ <xsl:text>pt</xsl:text> \
+ </xsl:attribute> \
+ </xsl:attribute-set> \
+ <xsl:attribute-set name="monospace.verbatim.properties"> \
+ <xsl:attribute name="wrap-option">wrap</xsl:attribute> \
+ <xsl:attribute name="hyphenation-character">\</xsl:attribute> \
+ <xsl:attribute name="font-size"> \
+ <xsl:value-of select="$$body.font.master * 0.8"></xsl:value-of> \
+ <xsl:text>pt</xsl:text> \
+ </xsl:attribute> \
+ </xsl:attribute-set> \
+</xsl:stylesheet>
+
+# for single-file (X)HTML outpout
+HTML_CUSTOM := <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" \
+ version="1.0"> \
+ <xsl:import href="$(DOCBOOK_XSL)/$(HTML_OR_XHTML)/docbook.xsl"/> \
+ <xsl:param name="gentext.custom">local.l10n.xml</xsl:param> \
+ <xsl:param name="local.l10n.xml" select="document($$gentext.custom)"/> \
+ <xsl:param name="refentry.generate.name">1</xsl:param> \
+ <xsl:param name="refentry.generate.title">0</xsl:param> \
+ <xsl:param name="root.filename"></xsl:param> \
+ <xsl:param name="variablelist.as.table">0</xsl:param> \
+ <xsl:param name="html.stylesheet">$(HTML_STYLESHEET)</xsl:param> \
+ <xsl:param name="admon.graphics">0</xsl:param> \
+ <xsl:param name="index.on.type">1</xsl:param> \
+</xsl:stylesheet>
+
+# for chunked (X)HTML output
+CHNK_CUSTOM := <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" \
+ version="1.0"> \
+ <xsl:import href="$(DOCBOOK_XSL)/$(HTML_OR_XHTML)/chunk.xsl"/> \
+ <xsl:param name="refentry.generate.name">0</xsl:param> \
+ <xsl:param name="refentry.generate.title">1</xsl:param> \
+ <xsl:param name="variablelist.as.table">0</xsl:param> \
+ <xsl:param name="html.stylesheet">$(HTML_STYLESHEET)</xsl:param> \
+ <xsl:param name="admon.graphics">1</xsl:param> \
+ <xsl:param name="admon.graphics.path">$(HTML_IMAGES)</xsl:param> \
+ <xsl:param name="admon.graphics.extension">$(HTML_IMAGES_EXT)</xsl:param> \
+ <xsl:param name="root.filename"></xsl:param> \
+ <xsl:param name="generate.manifest">1</xsl:param> \
+ <xsl:param name="use.id.as.filename">1</xsl:param> \
+ <xsl:param name="chunker.output.indent">yes</xsl:param> \
+ <xsl:param name="index.on.type">1</xsl:param> \
+</xsl:stylesheet>
+
+# for man-page output
+MAN_CUSTOM := <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" \
+ version="1.0"> \
+ <xsl:import href="$(DOCBOOK_XSL)/manpages/docbook.xsl"/> \
+ <xsl:param name="man.output.manifest.enabled" select="1"/> \
+ <xsl:param name="man.output.in.separate.dir" select="1"/> \
+ <xsl:param name="man.output.base.dir">man/</xsl:param> \
+ <xsl:param name="man.output.subdirs.enabled" select="1"/> \
+</xsl:stylesheet>
+
+# -----------------------------------------------------------------
+# ** TARGETS START HERE **
+# -----------------------------------------------------------------
+# prevents make from deleting, e.g. foo.1, after making foo.1.pdf
+# and foo.1.txt from it.
+.PRECIOUS: %.1 %.2 %.3 %.4 %.5 %.6 %.7 %.8 %.9
+
+docbook: $(DOCBOOK_OUTPUT_FORMATS)
+
+xml: $(SOURCE_FILES_DBK)
+
+man: $(LISTS_MAN)
+
+# we can generate PDFs from man pages
+man-pdf: man
+ $(MAKE) $(FILES_MANP)
+
+# we can generate plain text from man pages
+man-txt: man
+ $(MAKE) $(FILES_MANT)
+
+html: $(FILES_HTML)
+
+chunk: $(LISTS_HTML)
+
+txt: $(FILES_TXT)
+
+pdf: $(FILES_PDF)
+
+info: $(FILES_INFO)
+
+# use the "debug" target to echo variables, etc., to
+# test/troubleshoot changes you make to this makefile
+debug:
+ echo $(wildcard *$(DOCBOOK_FILE_EXTENSION))
+ echo $(ASCII_OR_DOCBOOK)
+ echo $(SOURCE_FILES_DBK)
+
+# -----------------------------------------------------------------
+# pattern rule to make DocBook refentry from asciidoc source
+# -----------------------------------------------------------------
+%.1$(DOCBOOK_FILE_EXTENSION): %.1.txt
+ $(ASCIIDOC) $(ASCIIDOCFLAGS) -d manpage -b docbook $<
+
+%.2$(DOCBOOK_FILE_EXTENSION): %.2.txt
+ $(ASCIIDOC) $(ASCIIDOCFLAGS) -d manpage -b docbook $<
+
+%.3$(DOCBOOK_FILE_EXTENSION): %.3.txt
+ $(ASCIIDOC) $(ASCIIDOCFLAGS) -d manpage -b docbook $<
+
+%.4$(DOCBOOK_FILE_EXTENSION): %.4.txt
+ $(ASCIIDOC) $(ASCIIDOCFLAGS) -d manpage -b docbook $<
+
+%.5$(DOCBOOK_FILE_EXTENSION): %.5.txt
+ $(ASCIIDOC) $(ASCIIDOCFLAGS) -d manpage -b docbook $<
+
+%.6$(DOCBOOK_FILE_EXTENSION): %.6.txt
+ $(ASCIIDOC) $(ASCIIDOCFLAGS) -d manpage -b docbook $<
+
+%.7$(DOCBOOK_FILE_EXTENSION): %.7.txt
+ $(ASCIIDOC) $(ASCIIDOCFLAGS) -d manpage -b docbook $<
+
+%.8$(DOCBOOK_FILE_EXTENSION): %.8.txt
+ $(ASCIIDOC) $(ASCIIDOCFLAGS) -d manpage -b docbook $<
+
+%.9$(DOCBOOK_FILE_EXTENSION): %.9.txt
+ $(ASCIIDOC) $(ASCIIDOCFLAGS) -d manpage -b docbook $<
+
+# -----------------------------------------------------------------
+# pattern rule to make DocBook article from asciidoc source
+# -----------------------------------------------------------------
+%$(DOCBOOK_FILE_EXTENSION): %.txt
+ export LINECOUNT1=$$(cat $< | $(DOS2UNIX) $(DOS2UNIXFLAGS) | egrep "^=+$$" | wc -l); \
+ export LINECOUNT2=$$(cat $< | $(DOS2UNIX) $(DOS2UNIXFLAGS) | egrep "^= $$" | wc -l); \
+ if [[ $$LINECOUNT1 > 1 || $$LINECOUNT2 > 1 ]]; then \
+ $(ASCIIDOC) $(ASCIIDOCFLAGS) -d book -b docbook $<; \
+ else \
+ $(ASCIIDOC) $(ASCIIDOCFLAGS) -b docbook $<; \
+ fi
+
+# -----------------------------------------------------------------
+# pattern rule for making (X)HTML and plain-text output
+# -----------------------------------------------------------------
+%.html: %$(DOCBOOK_FILE_EXTENSION)
+ @echo '$(HTML_CUSTOM)' | $(XSLT) $(XSLT_FLAGS) $(HTML_PARAMS) - $< > $@
+
+%.out.txt: %.html
+ $(TXT_MAKER) $(TXT_MAKER_FLAGS) ./$< \
+ | sed "s/^\(\s\+[0-9]\+\. \)file:\/\/.\+$$/\\1(local)/g" \
+ | egrep -v '^ file:///.+$$' \
+ > $@
+# if DOCBOOK_OUTPUT_FORMATS does not contain "html", then we need
+# to remove the "intermediate" HTML files we used for generating
+# plain-text output
+ifeq ($(findstring html,$(DOCBOOK_OUTPUT_FORMATS)),)
+ $(RM) $<
+endif
+
+# -----------------------------------------------------------------
+# pattern rule for making chunked (X)HTML pages
+# -----------------------------------------------------------------
+%.$(HTML_MANIFEST_EXT): %$(DOCBOOK_FILE_EXTENSION)
+ @echo '$(CHNK_CUSTOM)' | $(XSLT) $(XSLT_FLAGS) $(HTML_PARAMS) \
+ --stringparam manifest $@ \
+ --stringparam base.dir $(basename $@)$(BASEDIR_SUFFIX)/ \
+ - $<
+
+# -----------------------------------------------------------------
+# pattern rules for making FO and PDF stuff
+# -----------------------------------------------------------------
+%.fo: %$(DOCBOOK_FILE_EXTENSION)
+ @echo '$(FO_CUSTOM)' \
+ | $(XSLT) $(XSLT_FLAGS) $(FO_PARAMS) - $< > $@
+
+ifeq ($(PDF_MAKER),dblatex)
+%.pdf: %$(DOCBOOK_FILE_EXTENSION)
+ mkdir -p $(DOCBOOK_TMP)
+ echo '$(DBX_CUSTOM)' > $(DOCBOOK_TMP)/dblatex.xsl
+ -$(DBLATEX) $(DBLATEX_FLAGS)\
+ -p $(DOCBOOK_TMP)/dblatex.xsl \
+ -o $@ \
+ $<
+ $(RM) -r $(DOCBOOK_TMP)
+endif
+
+%.pdf: %.fo
+ifeq ($(PDF_MAKER),)
+ $(error No PDF_MAKER specified. Cannot make pdf)
+else
+ifeq ($(PDF_MAKER),xep)
+ $(XEP) $(XEP_FLAGS) $< $@
+else
+ifeq ($(PDF_MAKER),fop)
+ $(FOP) $(FOP_FLAGS) $< $@
+else
+ifeq ($(PDF_MAKER),xmlroff)
+ $(XMLROFF) $(XMLROFF_FLAGS) $< -o $@
+else
+ifeq ($(PDF_MAKER),passivetex)
+ $(PDFTEX) $(PDFTEX_FLAGS) &$(PDFXMLTEX) $<
+ @if [ `egrep Rerun $(basename $@).log | wc -l` -gt 0 ]; then \
+ $(PDFTEX) $(PDFTEX_FLAGS) &$(PDFXMLTEX) $< ; \
+ fi
+ @if [ `egrep Rerun $(basename $@).log | wc -l` -gt 0 ]; then \
+ $(PDFTEX) $(PDFTEX_FLAGS) &$(PDFXMLTEX) $< ; \
+ fi
+ $(RM) $(basename $@).log
+ $(RM) $(basename $@).aux
+ $(RM) $(basename $@).out
+else
+ $(error I do not know how to make a PDF using "$(PDF_MAKER)")
+endif
+endif
+endif
+endif
+endif
+
+# -----------------------------------------------------------------
+# pattern rules for making TeXinfo stuff
+# -----------------------------------------------------------------
+%.txml: %$(DOCBOOK_FILE_EXTENSION)
+ $(DB2X_XSLTPROC) $(DB2X_XSLTPROC_FLAGS) -s texi -o $@ $<
+
+%.texi: %.txml
+ $(DB2X_TEXIXML) $(DB2X_TEXIXML_FLAGS) $<
+
+# the following is actually a built-in rule, but it's redefined
+# here just for the sake of clarity
+%.info: %.texi
+ $(MAKEINFO) $(MAKEINFO_FLAGS) $< -o $@
+
+# -----------------------------------------------------------------
+# pattern rule for making man pages
+# -----------------------------------------------------------------
+%.$(MAN_MANIFEST_EXT): %$(DOCBOOK_FILE_EXTENSION)
+ @if [ "$(strip $(shell echo '$(REFENTRY_CHECK)' | $(XSLT) $(XSLT_FLAGS) - $<))" != "true" ]; then \
+ touch $@; \
+ else \
+ echo '$(MAN_CUSTOM)' \
+ | $(XSLT) $(XSLT_FLAGS) $(MAN_PARAMS) \
+ --stringparam man.output.manifest.filename $@ \
+ - $<; \
+ fi
+
+# -----------------------------------------------------------------
+# pattern rule for enabling direct "make foo.1" to work
+# -----------------------------------------------------------------
+
+%.1 %.2 %.3 %.4 %.5 %.6 %.7: %.xml
+ $(MAKE) $(basename $<).$(MAN_MANIFEST_EXT)
+
+# -----------------------------------------------------------------
+# pattern rules for making Postscript/PDF output from man pages
+# -----------------------------------------------------------------
+%.1.man.ps: %.1
+ $(MAN) -l $(MAN_FLAGS) -Tps $< > $@
+
+%.2.man.ps: %.2
+ $(MAN) -l $(MAN_FLAGS) -Tps $< > $@
+
+%.3.man.ps: %.3
+ $(MAN) -l $(MAN_FLAGS) -Tps $< > $@
+
+%.4.man.ps: %.4
+ $(MAN) -l $(MAN_FLAGS) -Tps $< > $@
+
+%.5.man.ps: %.5
+ $(MAN) -l $(MAN_FLAGS) -Tps $< > $@
+
+%.6.man.ps: %.6
+ $(MAN) -l $(MAN_FLAGS) -Tps $< > $@
+
+%.7.man.ps: %.7
+ $(MAN) -l $(MAN_FLAGS) -Tps $< > $@
+
+%.8.man.ps: %.8
+ $(MAN) -l $(MAN_FLAGS) -Tps $< > $@
+
+%.9.man.ps: %.9
+ $(MAN) -l $(MAN_FLAGS) -Tps $< > $@
+
+# -----------------------------------------------------------------
+# pattern rule for converting Postscript to PDF
+# -----------------------------------------------------------------
+%.pdf: %.ps
+ $(PS2PDF) $(PS2PDF_FLAGS) $<
+
+# -----------------------------------------------------------------
+# pattern rules for making plain-text output from man pages
+# -----------------------------------------------------------------
+%.1.out.txt: %.1
+ $(MAN) -l $(MAN_FLAGS) -Tascii $< | $(COL) -b $(COL_FLAGS) | $(EXPAND) $(EXPAND_FLAGS) > $@
+
+%.2.out.txt: %.2
+ $(MAN) -l $(MAN_FLAGS) -Tascii $< | $(COL) -b $(COL_FLAGS) | $(EXPAND) $(EXPAND_FLAGS) > $@
+
+%.3.out.txt: %.3
+ $(MAN) -l $(MAN_FLAGS) -Tascii $< | $(COL) -b $(COL_FLAGS) | $(EXPAND) $(EXPAND_FLAGS) > $@
+
+%.4.out.txt: %.4
+ $(MAN) -l $(MAN_FLAGS) -Tascii $< | $(COL) -b $(COL_FLAGS) | $(EXPAND) $(EXPAND_FLAGS) > $@
+
+%.5.out.txt: %.5
+ $(MAN) -l $(MAN_FLAGS) -Tascii $< | $(COL) -b $(COL_FLAGS) | $(EXPAND) $(EXPAND_FLAGS) > $@
+
+%.6.out.txt: %.6
+ $(MAN) -l $(MAN_FLAGS) -Tascii $< | $(COL) -b $(COL_FLAGS) | $(EXPAND) $(EXPAND_FLAGS) > $@
+
+%.7.out.txt: %.7
+ $(MAN) -l $(MAN_FLAGS) -Tascii $< | $(COL) -b $(COL_FLAGS) | $(EXPAND) $(EXPAND_FLAGS) > $@
+
+%.8.out.txt: %.8
+ $(MAN) -l $(MAN_FLAGS) -Tascii $< | $(COL) -b $(COL_FLAGS) | $(EXPAND) $(EXPAND_FLAGS) > $@
+
+%.9.out.txt: %.9
+ $(MAN) -l $(MAN_FLAGS) -Tascii $< | $(COL) -b $(COL_FLAGS) | $(EXPAND) $(EXPAND_FLAGS) > $@
+
+# -----------------------------------------------------------------
+# target(s) for cleaning up the mess
+# -----------------------------------------------------------------
+clean:
+ifneq ($(FILES_TXT),)
+ $(RM) $(FILES_TXT)
+endif
+ifneq ($(FILES_PDF),)
+ $(RM) $(FILES_PDF)
+endif
+ifneq ($(FILES_FO),)
+ $(RM) $(FILES_FO)
+endif
+ifneq ($(FILES_LOG),)
+ $(RM) $(FILES_LOG)
+endif
+ifneq ($(FILES_OUT),)
+ $(RM) $(FILES_OUT)
+endif
+ifneq ($(FILES_AUX),)
+ $(RM) $(FILES_AUX)
+endif
+ifneq ($(FILES_HTML),)
+ $(RM) $(FILES_HTML)
+endif
+ifneq ($(FILES_CHNK),)
+ $(RM) $(FILES_CHNK)
+endif
+ifneq ($(FILES_MAN),)
+ $(RM) $(FILES_MAN)
+endif
+ifneq ($(FILES_MANT),)
+ $(RM) $(FILES_MANT)
+endif
+ifneq ($(FILES_MANP),)
+ $(RM) $(FILES_MANP)
+endif
+ifneq ($(FILES_INFO),)
+ $(RM) $(FILES_INFO)
+endif
+ifneq ($(DIRS_CHUNK),)
+ for dir in $(DIRS_CHUNK); do \
+ if [ -d "$$dir" ]; then \
+ $(RMDIR) $(RMDIR_FLAGS) $$dir; \
+ fi \
+ done
+endif
+ifneq ($(DIRS_MAN),)
+ifneq ($(DIRS_MAN),.)
+ for dir in $(DIRS_MAN); do \
+ if [ -d "$$dir" ]; then \
+ $(RMDIR) $(RMDIR_FLAGS) $$dir; \
+ fi \
+ done
+endif
+endif
+ifneq ($(LISTS_MAN),)
+ $(RM) $(LISTS_MAN)
+endif
+ifneq ($(LISTS_HTML),)
+ $(RM) $(LISTS_HTML)
+endif
+ifneq ($(ASCII_OR_DOCBOOK),docbook)
+ $(RM) -i $(SOURCE_FILES_DBK)
+endif
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/tools/make/Makefile.combine b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/tools/make/Makefile.combine
new file mode 100644
index 0000000..28a5e18
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/tools/make/Makefile.combine
@@ -0,0 +1,182 @@
+# $Source$
+# $Author: xmldoc $
+# $Date: 2007-03-04 22:28:18 -0800 (Sun, 04 Mar 2007) $
+# $Revision: 6666 $
+# vim: number
+#
+# -----------------------------------------------------------------
+# ** Makefile.combine -- combine source files **
+# -----------------------------------------------------------------
+#
+# This file is part of the DocBook Project XSL Stylesheet
+# distribution.
+#
+# See http://docbook.sourceforge.net/release/xsl/current/
+# for copyright and other information.
+#
+# This makefile creates "wrapper" files that combine sets of
+# individual DocBook source files. The purpose of combining the
+# files is to speed up processing time. By default it puts 20
+# files into each wrapper. Use CHUNKSIZE to configure the number
+# of files per wrapper.
+#
+# Currently, this makefile has only a "man" target and is mainly
+# intended to speed up processing of large numbers of individual
+# refentry instances.
+
+# What file extension do you use for DocBook source files?
+DOCBOOK_FILE_EXTENSION = .xml
+SOURCE_FILES_DBK = $(wildcard *$(DOCBOOK_FILE_EXTENSION))
+
+MAKEFILE_DOCBOOK = Makefile.DocBook
+
+XSLTPROC=xsltproc
+XSLTPROC_FLAGS=
+
+SED=sed
+SED_FLAGS=-i
+
+CHUNKSIZE ?= 20
+
+WRAPPER_ELEMENT = reference
+WRAPPER_TITLE=Combined contents
+
+COMBINE_XSL = <?xml version="1.0"?> \
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" \
+ xmlns:exsl="http://exslt.org/common" \
+ xmlns:xi="http://www.w3.org/2001/XInclude" \
+ exclude-result-prefixes="exsl xi" \
+ extension-element-prefixes="exsl" \
+ version="1.0"> \
+ <xsl:param name="files"/> \
+ <xsl:param name="chunk.size"/> \
+ <xsl:template match="/"> \
+ <xsl:call-template name="make.file"/> \
+ </xsl:template> \
+ \
+ <xsl:template name="make.file"> \
+ <xsl:param name="count" select="1"/> \
+ <xsl:param name="current.files" select="concat(normalize-space($$files), ^^ ^^)"/> \
+ <xsl:param name="more.files" \
+ select="concat(normalize-space(substring-after($$current.files, ^^ ^^)),^^ ^^)"/> \
+ <xsl:param name="file.number" select="1"/> \
+ <xsl:param name="filename" select="concat(^^./build/^^,$$file.number,^^.xml^^)"/> \
+ \
+ <xsl:choose> \
+ <xsl:when test="$$more.files = ^^ ^^"/> \
+ <xsl:when test="$$count mod $$chunk.size = 0"> \
+ <xsl:variable name="fileset" select="concat($$current.files, ^^ ^^, \
+ substring-before($$more.files, ^^ ^^))"/> \
+ <exsl:document href="{$$filename}" \
+ method="xml" \
+ encoding="UTF-8" \
+ indent="yes" \
+ omit-xml-declaration="yes" \
+ media-type="" \
+ standalone="no"> \
+ <$(WRAPPER_ELEMENT)> \
+ <title>$(WRAPPER_TITLE)</title> \
+ <xsl:call-template name="make.xinclude"> \
+ <xsl:with-param name="file"> \
+ <xsl:choose> \
+ <xsl:when test="contains($$fileset, ^^ ^^)"> \
+ <xsl:value-of \
+ select="normalize-space(substring-before($$fileset, ^^ ^^))"/> \
+ </xsl:when> \
+ <xsl:otherwise> \
+ <xsl:value-of select="$$fileset"/> \
+ </xsl:otherwise> \
+ </xsl:choose> \
+ </xsl:with-param> \
+ <xsl:with-param \
+ name="remaining.files" \
+ select="concat(normalize-space(substring-after($$fileset, ^^ ^^)),^^ ^^)"/> \
+ </xsl:call-template> \
+ </$(WRAPPER_ELEMENT)> \
+ </exsl:document> \
+ <xsl:call-template name="make.file"> \
+ <xsl:with-param name="count" select="1"/> \
+ <xsl:with-param name="current.files" \
+ select="$$more.files"/> \
+ <xsl:with-param name="file.number" select="number($$file.number) + 1"/> \
+ <xsl:with-param name="filename" select="concat(^^./build/^^,$$file.number,^^.xml^^)"/> \
+ </xsl:call-template> \
+ </xsl:when> \
+ <xsl:otherwise> \
+ <xsl:call-template name="make.file"> \
+ <xsl:with-param name="count" select="$$count + 1"/> \
+ <xsl:with-param name="current.files"> \
+ <xsl:choose> \
+ <xsl:when test="$$count = 1 and $$file.number = 1"> \
+ <xsl:value-of \
+ select="concat(substring-before($$current.files, ^^ ^^), \
+ ^^ ^^, \
+ substring-before($$more.files, ^^ ^^))"/> \
+ </xsl:when> \
+ <xsl:when test="$$count = 1"> \
+ <xsl:value-of \
+ select="substring-before($$more.files, ^^ ^^)"/> \
+ </xsl:when> \
+ <xsl:otherwise> \
+ <xsl:value-of \
+ select="concat($$current.files, ^^ ^^, \
+ substring-before($$more.files, ^^ ^^))"/> \
+ </xsl:otherwise> \
+ </xsl:choose> \
+ </xsl:with-param> \
+ <xsl:with-param name="more.files" \
+ select="substring-after($$more.files, ^^ ^^)"/> \
+ <xsl:with-param name="file.number" select="$$file.number"/> \
+ </xsl:call-template> \
+ </xsl:otherwise> \
+ </xsl:choose> \
+ </xsl:template> \
+ \
+ <xsl:template name="make.xinclude"> \
+ <xsl:param name="file"/> \
+ <xsl:param name="remaining.files"/> \
+ <xsl:param name="count" select="1"/> \
+ <xsl:if test="not($$file = ^^^^)"> \
+ <xi:include href="../{$$file}"/> \
+ <xsl:call-template name="make.xinclude"> \
+ <xsl:with-param \
+ name="file" \
+ select="substring-before($$remaining.files, ^^ ^^)"/> \
+ <xsl:with-param \
+ name="remaining.files" \
+ select="substring-after($$remaining.files, ^^ ^^)"/> \
+ <xsl:with-param name="count" select="$$count + 1"/> \
+ </xsl:call-template> \
+ </xsl:if> \
+ </xsl:template> \
+ \
+</xsl:stylesheet>
+
+all: man
+
+man: build/man
+
+build/Makefile:
+ if [ ! -d build ]; then mkdir build; fi
+ cp $(MAKEFILE_DOCBOOK) $@
+
+combine.xsl: Makefile
+ @echo '$(COMBINE_XSL)' > $@
+ $(SED) $(SED_FLAGS) "s/\^\^/'/g" $@
+
+build/1.xml: combine.xsl
+ $(XSLTPROC) $(XSLTPROC_FLAGS) \
+ --stringparam files "$(SOURCE_FILES_DBK)" \
+ --stringparam chunk.size $(CHUNKSIZE) \
+ $< $<
+
+build/man: build/Makefile build/1.xml
+ time $(MAKE) -C build man \
+ MAN_PARAMS="--stringparam man.output.quietly 1 \
+ --stringparam refentry.meta.get.quietly 1 \
+ --stringparam man.charmap.enabled 0"
+
+debug:
+
+clean:
+ $(RM) -r build
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/tools/make/Makefile.docParam b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/tools/make/Makefile.docParam
new file mode 100644
index 0000000..36d12ca
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/tools/make/Makefile.docParam
@@ -0,0 +1,59 @@
+# $Source$
+# $Author: xmldoc $
+# $Date: 2007-03-23 14:57:22 -0700 (Fri, 23 Mar 2007) $
+# $Revision: 6759 $
+# vim: number
+#
+# ------------------------------------------------------------------
+# ** Makefile.paramDoc - create param.xsl files w/ embedded doc **
+# ------------------------------------------------------------------
+
+PARAMFILES = $(wildcard ../../*/param.xsl)
+PARAMFILESDOCD = $(foreach base,$(basename $(PARAMFILES)),$(base).docd.xsl)
+
+XSLT=xsltproc
+XSLTFLAGS=
+
+COPYDOC := <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" \
+ xmlns:doc="http://docbook.org/ns/docbook" \
+ version="1.0"> \
+ <xsl:template match="*[local-name() = &apos;param&apos;]"> \
+ <xsl:call-template name="copy-xsl-source"/> \
+ </xsl:template> \
+ <xsl:template match="*[local-name() = &apos;attribute-set&apos;]"> \
+ <xsl:call-template name="copy-xsl-source"/> \
+ </xsl:template> \
+ <xsl:template name="copy-xsl-source"> \
+ <xsl:variable \
+ name="source" \
+ select="concat(&apos;../../params/&apos;,@name,&apos;.xml&apos;)"/> \
+ <xsl:apply-templates select="document($$source)/*[local-name() = &apos;refentry&apos;]"/> \
+ <xsl:copy> \
+ <xsl:apply-templates select="@* | node()"/> \
+ </xsl:copy> \
+ </xsl:template> \
+ <xsl:template match="node() | @*"> \
+ <xsl:copy> \
+ <xsl:apply-templates select="@* | node()"/> \
+ </xsl:copy> \
+ </xsl:template> \
+ <xsl:template match="*[local-name() = &apos;refentry&apos;]"> \
+ <xsl:text>&\#x0a;</xsl:text> \
+ <doc:refentry id="{@*[local-name() = &apos;id&apos;]}"> \
+ <xsl:apply-templates/> \
+ </doc:refentry> \
+ <xsl:text>&\#x0a;</xsl:text> \
+ </xsl:template> \
+ <xsl:template match="*[local-name() = &apos;refsynopsisdiv&apos;]"/> \
+</xsl:stylesheet>
+
+all: $(PARAMFILESDOCD)
+
+%.docd.xsl: %.xsl
+ @echo '$(COPYDOC)' | $(XSLT) $(XSLTFLAGS) - $< > $@
+
+debug:
+ @echo $(PARAMFILESDOCD)
+
+clean:
+ $(RM) $(PARAMFILESDOCD)
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/LICENSE b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/LICENSE
new file mode 100644
index 0000000..63c2931
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/LICENSE
@@ -0,0 +1 @@
+See doc/content/index.html. \ No newline at end of file
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/docs/common/css/positioning.css b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/docs/common/css/positioning.css
new file mode 100644
index 0000000..3d30bc2
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/docs/common/css/positioning.css
@@ -0,0 +1,109 @@
+body { font: 12px Verdana, Geneva, sans-serif; }
+p, ul, ol, li { font: 10pt Verdana, Geneva, sans-serif; }
+h1 { font: bold 15pt Arial, Helvetica, geneva; }
+h2 { font: bold 14pt Arial, Helvetica, geneva; }
+
+#header {
+ background: white url(../images/header-bg.gif) repeat-x;
+ position: fixed;
+ width: 100%;
+ height: 95px;
+ top: 0;
+ right: 0;
+ bottom: auto;
+ left: 0;
+ border-bottom: 2px solid #cccccc;
+ z-index: 2000;
+}
+
+#leftnavigation {
+/* background-color:#91e7b3;*/
+ overflow: auto;
+ position: fixed;
+ height: auto;
+ top: 90px;
+ bottom: 0;
+ left: 0;
+ width: 280px;
+ z-index: 1500;
+ border-right:2px solid #CCCCCC;
+}
+
+#content {
+ position: relative;
+ top: 90px; /* left: 240px;*/
+ right: auto; /* bottom: 20px; */
+ margin: 0px 0px 0px 280px;
+ width: auto;
+ height: inherit;
+ padding-left: 5px;
+ padding-right: 30px;
+ color: #000000;
+ /*border-left: 2px solid #cccccc; overflow :scroll;*/
+ z-index: 1000;
+
+ max-width: 70em;
+ min-width:800px;
+}
+
+#navheader {
+ position: fixed;
+ top: 65px;
+ right:4px;
+}
+
+#content h1, #content h2 { color: #cc0000; }
+.navfooter { bottom: 2%; }
+.highlight { background-color: #c5d3c3; }
+.highlightButton{ font-size: 0; }
+
+/* Show Hide TOC tree */
+.pointLeft {
+ background: url("../images/showHideTreeIcons.png") 0 0 no-repeat;
+ height: 28px;
+ width: 15px;
+ display: block;
+ font-size: 0;
+ cursor: pointer;
+}
+.pointRight {
+ background: url("../images/showHideTreeIcons.png") -15px 0 no-repeat;
+ height: 28px;
+ display: block;
+ font-size: 0;
+ cursor: pointer;
+}
+
+/* Search results Styling */
+.searchExpression {
+ color: #0050A0;
+ background-color: #EBEFF8;
+ font-size: 12pt;
+}
+.searchresult li a {
+ text-decoration: none;
+ color: #0050A0;
+}
+.searchresult li {
+ color: #0050A0;
+}
+.shortdesclink {
+ color: gray;
+ font-size: 9pt;
+}
+.searchText {
+ border: #BFCEE9 solid 1pt;
+ width: 11em
+}
+.searchButton {
+ margin-left: 3px;
+ background: #EBEFF8;
+ color: #0050A0;
+ border: #BFCEE9 solid 1pt;
+ font-weight: bold;
+ font-size: 10pt
+}
+
+.title, div.toc>p{
+ font-weight: bold;
+ } \ No newline at end of file
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/docs/common/jquery/jquery-1.4.2.min.js b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/docs/common/jquery/jquery-1.4.2.min.js
new file mode 100644
index 0000000..7c24308
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/docs/common/jquery/jquery-1.4.2.min.js
@@ -0,0 +1,154 @@
+/*!
+ * jQuery JavaScript Library v1.4.2
+ * http://jquery.com/
+ *
+ * Copyright 2010, John Resig
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * Includes Sizzle.js
+ * http://sizzlejs.com/
+ * Copyright 2010, The Dojo Foundation
+ * Released under the MIT, BSD, and GPL Licenses.
+ *
+ * Date: Sat Feb 13 22:33:48 2010 -0500
+ */
+(function(A,w){function ma(){if(!c.isReady){try{s.documentElement.doScroll("left")}catch(a){setTimeout(ma,1);return}c.ready()}}function Qa(a,b){b.src?c.ajax({url:b.src,async:false,dataType:"script"}):c.globalEval(b.text||b.textContent||b.innerHTML||"");b.parentNode&&b.parentNode.removeChild(b)}function X(a,b,d,f,e,j){var i=a.length;if(typeof b==="object"){for(var o in b)X(a,o,b[o],f,e,d);return a}if(d!==w){f=!j&&f&&c.isFunction(d);for(o=0;o<i;o++)e(a[o],b,f?d.call(a[o],o,e(a[o],b)):d,j);return a}return i?
+e(a[0],b):w}function J(){return(new Date).getTime()}function Y(){return false}function Z(){return true}function na(a,b,d){d[0].type=a;return c.event.handle.apply(b,d)}function oa(a){var b,d=[],f=[],e=arguments,j,i,o,k,n,r;i=c.data(this,"events");if(!(a.liveFired===this||!i||!i.live||a.button&&a.type==="click")){a.liveFired=this;var u=i.live.slice(0);for(k=0;k<u.length;k++){i=u[k];i.origType.replace(O,"")===a.type?f.push(i.selector):u.splice(k--,1)}j=c(a.target).closest(f,a.currentTarget);n=0;for(r=
+j.length;n<r;n++)for(k=0;k<u.length;k++){i=u[k];if(j[n].selector===i.selector){o=j[n].elem;f=null;if(i.preType==="mouseenter"||i.preType==="mouseleave")f=c(a.relatedTarget).closest(i.selector)[0];if(!f||f!==o)d.push({elem:o,handleObj:i})}}n=0;for(r=d.length;n<r;n++){j=d[n];a.currentTarget=j.elem;a.data=j.handleObj.data;a.handleObj=j.handleObj;if(j.handleObj.origHandler.apply(j.elem,e)===false){b=false;break}}return b}}function pa(a,b){return"live."+(a&&a!=="*"?a+".":"")+b.replace(/\./g,"`").replace(/ /g,
+"&")}function qa(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function ra(a,b){var d=0;b.each(function(){if(this.nodeName===(a[d]&&a[d].nodeName)){var f=c.data(a[d++]),e=c.data(this,f);if(f=f&&f.events){delete e.handle;e.events={};for(var j in f)for(var i in f[j])c.event.add(this,j,f[j][i],f[j][i].data)}}})}function sa(a,b,d){var f,e,j;b=b&&b[0]?b[0].ownerDocument||b[0]:s;if(a.length===1&&typeof a[0]==="string"&&a[0].length<512&&b===s&&!ta.test(a[0])&&(c.support.checkClone||!ua.test(a[0]))){e=
+true;if(j=c.fragments[a[0]])if(j!==1)f=j}if(!f){f=b.createDocumentFragment();c.clean(a,b,f,d)}if(e)c.fragments[a[0]]=j?f:1;return{fragment:f,cacheable:e}}function K(a,b){var d={};c.each(va.concat.apply([],va.slice(0,b)),function(){d[this]=a});return d}function wa(a){return"scrollTo"in a&&a.document?a:a.nodeType===9?a.defaultView||a.parentWindow:false}var c=function(a,b){return new c.fn.init(a,b)},Ra=A.jQuery,Sa=A.$,s=A.document,T,Ta=/^[^<]*(<[\w\W]+>)[^>]*$|^#([\w-]+)$/,Ua=/^.[^:#\[\.,]*$/,Va=/\S/,
+Wa=/^(\s|\u00A0)+|(\s|\u00A0)+$/g,Xa=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,P=navigator.userAgent,xa=false,Q=[],L,$=Object.prototype.toString,aa=Object.prototype.hasOwnProperty,ba=Array.prototype.push,R=Array.prototype.slice,ya=Array.prototype.indexOf;c.fn=c.prototype={init:function(a,b){var d,f;if(!a)return this;if(a.nodeType){this.context=this[0]=a;this.length=1;return this}if(a==="body"&&!b){this.context=s;this[0]=s.body;this.selector="body";this.length=1;return this}if(typeof a==="string")if((d=Ta.exec(a))&&
+(d[1]||!b))if(d[1]){f=b?b.ownerDocument||b:s;if(a=Xa.exec(a))if(c.isPlainObject(b)){a=[s.createElement(a[1])];c.fn.attr.call(a,b,true)}else a=[f.createElement(a[1])];else{a=sa([d[1]],[f]);a=(a.cacheable?a.fragment.cloneNode(true):a.fragment).childNodes}return c.merge(this,a)}else{if(b=s.getElementById(d[2])){if(b.id!==d[2])return T.find(a);this.length=1;this[0]=b}this.context=s;this.selector=a;return this}else if(!b&&/^\w+$/.test(a)){this.selector=a;this.context=s;a=s.getElementsByTagName(a);return c.merge(this,
+a)}else return!b||b.jquery?(b||T).find(a):c(b).find(a);else if(c.isFunction(a))return T.ready(a);if(a.selector!==w){this.selector=a.selector;this.context=a.context}return c.makeArray(a,this)},selector:"",jquery:"1.4.2",length:0,size:function(){return this.length},toArray:function(){return R.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this.slice(a)[0]:this[a]},pushStack:function(a,b,d){var f=c();c.isArray(a)?ba.apply(f,a):c.merge(f,a);f.prevObject=this;f.context=this.context;if(b===
+"find")f.selector=this.selector+(this.selector?" ":"")+d;else if(b)f.selector=this.selector+"."+b+"("+d+")";return f},each:function(a,b){return c.each(this,a,b)},ready:function(a){c.bindReady();if(c.isReady)a.call(s,c);else Q&&Q.push(a);return this},eq:function(a){return a===-1?this.slice(a):this.slice(a,+a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(R.apply(this,arguments),"slice",R.call(arguments).join(","))},map:function(a){return this.pushStack(c.map(this,
+function(b,d){return a.call(b,d,b)}))},end:function(){return this.prevObject||c(null)},push:ba,sort:[].sort,splice:[].splice};c.fn.init.prototype=c.fn;c.extend=c.fn.extend=function(){var a=arguments[0]||{},b=1,d=arguments.length,f=false,e,j,i,o;if(typeof a==="boolean"){f=a;a=arguments[1]||{};b=2}if(typeof a!=="object"&&!c.isFunction(a))a={};if(d===b){a=this;--b}for(;b<d;b++)if((e=arguments[b])!=null)for(j in e){i=a[j];o=e[j];if(a!==o)if(f&&o&&(c.isPlainObject(o)||c.isArray(o))){i=i&&(c.isPlainObject(i)||
+c.isArray(i))?i:c.isArray(o)?[]:{};a[j]=c.extend(f,i,o)}else if(o!==w)a[j]=o}return a};c.extend({noConflict:function(a){A.$=Sa;if(a)A.jQuery=Ra;return c},isReady:false,ready:function(){if(!c.isReady){if(!s.body)return setTimeout(c.ready,13);c.isReady=true;if(Q){for(var a,b=0;a=Q[b++];)a.call(s,c);Q=null}c.fn.triggerHandler&&c(s).triggerHandler("ready")}},bindReady:function(){if(!xa){xa=true;if(s.readyState==="complete")return c.ready();if(s.addEventListener){s.addEventListener("DOMContentLoaded",
+L,false);A.addEventListener("load",c.ready,false)}else if(s.attachEvent){s.attachEvent("onreadystatechange",L);A.attachEvent("onload",c.ready);var a=false;try{a=A.frameElement==null}catch(b){}s.documentElement.doScroll&&a&&ma()}}},isFunction:function(a){return $.call(a)==="[object Function]"},isArray:function(a){return $.call(a)==="[object Array]"},isPlainObject:function(a){if(!a||$.call(a)!=="[object Object]"||a.nodeType||a.setInterval)return false;if(a.constructor&&!aa.call(a,"constructor")&&!aa.call(a.constructor.prototype,
+"isPrototypeOf"))return false;var b;for(b in a);return b===w||aa.call(a,b)},isEmptyObject:function(a){for(var b in a)return false;return true},error:function(a){throw a;},parseJSON:function(a){if(typeof a!=="string"||!a)return null;a=c.trim(a);if(/^[\],:{}\s]*$/.test(a.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,"@").replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,"]").replace(/(?:^|:|,)(?:\s*\[)+/g,"")))return A.JSON&&A.JSON.parse?A.JSON.parse(a):(new Function("return "+
+a))();else c.error("Invalid JSON: "+a)},noop:function(){},globalEval:function(a){if(a&&Va.test(a)){var b=s.getElementsByTagName("head")[0]||s.documentElement,d=s.createElement("script");d.type="text/javascript";if(c.support.scriptEval)d.appendChild(s.createTextNode(a));else d.text=a;b.insertBefore(d,b.firstChild);b.removeChild(d)}},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,b,d){var f,e=0,j=a.length,i=j===w||c.isFunction(a);if(d)if(i)for(f in a){if(b.apply(a[f],
+d)===false)break}else for(;e<j;){if(b.apply(a[e++],d)===false)break}else if(i)for(f in a){if(b.call(a[f],f,a[f])===false)break}else for(d=a[0];e<j&&b.call(d,e,d)!==false;d=a[++e]);return a},trim:function(a){return(a||"").replace(Wa,"")},makeArray:function(a,b){b=b||[];if(a!=null)a.length==null||typeof a==="string"||c.isFunction(a)||typeof a!=="function"&&a.setInterval?ba.call(b,a):c.merge(b,a);return b},inArray:function(a,b){if(b.indexOf)return b.indexOf(a);for(var d=0,f=b.length;d<f;d++)if(b[d]===
+a)return d;return-1},merge:function(a,b){var d=a.length,f=0;if(typeof b.length==="number")for(var e=b.length;f<e;f++)a[d++]=b[f];else for(;b[f]!==w;)a[d++]=b[f++];a.length=d;return a},grep:function(a,b,d){for(var f=[],e=0,j=a.length;e<j;e++)!d!==!b(a[e],e)&&f.push(a[e]);return f},map:function(a,b,d){for(var f=[],e,j=0,i=a.length;j<i;j++){e=b(a[j],j,d);if(e!=null)f[f.length]=e}return f.concat.apply([],f)},guid:1,proxy:function(a,b,d){if(arguments.length===2)if(typeof b==="string"){d=a;a=d[b];b=w}else if(b&&
+!c.isFunction(b)){d=b;b=w}if(!b&&a)b=function(){return a.apply(d||this,arguments)};if(a)b.guid=a.guid=a.guid||b.guid||c.guid++;return b},uaMatch:function(a){a=a.toLowerCase();a=/(webkit)[ \/]([\w.]+)/.exec(a)||/(opera)(?:.*version)?[ \/]([\w.]+)/.exec(a)||/(msie) ([\w.]+)/.exec(a)||!/compatible/.test(a)&&/(mozilla)(?:.*? rv:([\w.]+))?/.exec(a)||[];return{browser:a[1]||"",version:a[2]||"0"}},browser:{}});P=c.uaMatch(P);if(P.browser){c.browser[P.browser]=true;c.browser.version=P.version}if(c.browser.webkit)c.browser.safari=
+true;if(ya)c.inArray=function(a,b){return ya.call(b,a)};T=c(s);if(s.addEventListener)L=function(){s.removeEventListener("DOMContentLoaded",L,false);c.ready()};else if(s.attachEvent)L=function(){if(s.readyState==="complete"){s.detachEvent("onreadystatechange",L);c.ready()}};(function(){c.support={};var a=s.documentElement,b=s.createElement("script"),d=s.createElement("div"),f="script"+J();d.style.display="none";d.innerHTML=" <link/><table></table><a href='/a' style='color:red;float:left;opacity:.55;'>a</a><input type='checkbox'/>";
+var e=d.getElementsByTagName("*"),j=d.getElementsByTagName("a")[0];if(!(!e||!e.length||!j)){c.support={leadingWhitespace:d.firstChild.nodeType===3,tbody:!d.getElementsByTagName("tbody").length,htmlSerialize:!!d.getElementsByTagName("link").length,style:/red/.test(j.getAttribute("style")),hrefNormalized:j.getAttribute("href")==="/a",opacity:/^0.55$/.test(j.style.opacity),cssFloat:!!j.style.cssFloat,checkOn:d.getElementsByTagName("input")[0].value==="on",optSelected:s.createElement("select").appendChild(s.createElement("option")).selected,
+parentNode:d.removeChild(d.appendChild(s.createElement("div"))).parentNode===null,deleteExpando:true,checkClone:false,scriptEval:false,noCloneEvent:true,boxModel:null};b.type="text/javascript";try{b.appendChild(s.createTextNode("window."+f+"=1;"))}catch(i){}a.insertBefore(b,a.firstChild);if(A[f]){c.support.scriptEval=true;delete A[f]}try{delete b.test}catch(o){c.support.deleteExpando=false}a.removeChild(b);if(d.attachEvent&&d.fireEvent){d.attachEvent("onclick",function k(){c.support.noCloneEvent=
+false;d.detachEvent("onclick",k)});d.cloneNode(true).fireEvent("onclick")}d=s.createElement("div");d.innerHTML="<input type='radio' name='radiotest' checked='checked'/>";a=s.createDocumentFragment();a.appendChild(d.firstChild);c.support.checkClone=a.cloneNode(true).cloneNode(true).lastChild.checked;c(function(){var k=s.createElement("div");k.style.width=k.style.paddingLeft="1px";s.body.appendChild(k);c.boxModel=c.support.boxModel=k.offsetWidth===2;s.body.removeChild(k).style.display="none"});a=function(k){var n=
+s.createElement("div");k="on"+k;var r=k in n;if(!r){n.setAttribute(k,"return;");r=typeof n[k]==="function"}return r};c.support.submitBubbles=a("submit");c.support.changeBubbles=a("change");a=b=d=e=j=null}})();c.props={"for":"htmlFor","class":"className",readonly:"readOnly",maxlength:"maxLength",cellspacing:"cellSpacing",rowspan:"rowSpan",colspan:"colSpan",tabindex:"tabIndex",usemap:"useMap",frameborder:"frameBorder"};var G="jQuery"+J(),Ya=0,za={};c.extend({cache:{},expando:G,noData:{embed:true,object:true,
+applet:true},data:function(a,b,d){if(!(a.nodeName&&c.noData[a.nodeName.toLowerCase()])){a=a==A?za:a;var f=a[G],e=c.cache;if(!f&&typeof b==="string"&&d===w)return null;f||(f=++Ya);if(typeof b==="object"){a[G]=f;e[f]=c.extend(true,{},b)}else if(!e[f]){a[G]=f;e[f]={}}a=e[f];if(d!==w)a[b]=d;return typeof b==="string"?a[b]:a}},removeData:function(a,b){if(!(a.nodeName&&c.noData[a.nodeName.toLowerCase()])){a=a==A?za:a;var d=a[G],f=c.cache,e=f[d];if(b){if(e){delete e[b];c.isEmptyObject(e)&&c.removeData(a)}}else{if(c.support.deleteExpando)delete a[c.expando];
+else a.removeAttribute&&a.removeAttribute(c.expando);delete f[d]}}}});c.fn.extend({data:function(a,b){if(typeof a==="undefined"&&this.length)return c.data(this[0]);else if(typeof a==="object")return this.each(function(){c.data(this,a)});var d=a.split(".");d[1]=d[1]?"."+d[1]:"";if(b===w){var f=this.triggerHandler("getData"+d[1]+"!",[d[0]]);if(f===w&&this.length)f=c.data(this[0],a);return f===w&&d[1]?this.data(d[0]):f}else return this.trigger("setData"+d[1]+"!",[d[0],b]).each(function(){c.data(this,
+a,b)})},removeData:function(a){return this.each(function(){c.removeData(this,a)})}});c.extend({queue:function(a,b,d){if(a){b=(b||"fx")+"queue";var f=c.data(a,b);if(!d)return f||[];if(!f||c.isArray(d))f=c.data(a,b,c.makeArray(d));else f.push(d);return f}},dequeue:function(a,b){b=b||"fx";var d=c.queue(a,b),f=d.shift();if(f==="inprogress")f=d.shift();if(f){b==="fx"&&d.unshift("inprogress");f.call(a,function(){c.dequeue(a,b)})}}});c.fn.extend({queue:function(a,b){if(typeof a!=="string"){b=a;a="fx"}if(b===
+w)return c.queue(this[0],a);return this.each(function(){var d=c.queue(this,a,b);a==="fx"&&d[0]!=="inprogress"&&c.dequeue(this,a)})},dequeue:function(a){return this.each(function(){c.dequeue(this,a)})},delay:function(a,b){a=c.fx?c.fx.speeds[a]||a:a;b=b||"fx";return this.queue(b,function(){var d=this;setTimeout(function(){c.dequeue(d,b)},a)})},clearQueue:function(a){return this.queue(a||"fx",[])}});var Aa=/[\n\t]/g,ca=/\s+/,Za=/\r/g,$a=/href|src|style/,ab=/(button|input)/i,bb=/(button|input|object|select|textarea)/i,
+cb=/^(a|area)$/i,Ba=/radio|checkbox/;c.fn.extend({attr:function(a,b){return X(this,a,b,true,c.attr)},removeAttr:function(a){return this.each(function(){c.attr(this,a,"");this.nodeType===1&&this.removeAttribute(a)})},addClass:function(a){if(c.isFunction(a))return this.each(function(n){var r=c(this);r.addClass(a.call(this,n,r.attr("class")))});if(a&&typeof a==="string")for(var b=(a||"").split(ca),d=0,f=this.length;d<f;d++){var e=this[d];if(e.nodeType===1)if(e.className){for(var j=" "+e.className+" ",
+i=e.className,o=0,k=b.length;o<k;o++)if(j.indexOf(" "+b[o]+" ")<0)i+=" "+b[o];e.className=c.trim(i)}else e.className=a}return this},removeClass:function(a){if(c.isFunction(a))return this.each(function(k){var n=c(this);n.removeClass(a.call(this,k,n.attr("class")))});if(a&&typeof a==="string"||a===w)for(var b=(a||"").split(ca),d=0,f=this.length;d<f;d++){var e=this[d];if(e.nodeType===1&&e.className)if(a){for(var j=(" "+e.className+" ").replace(Aa," "),i=0,o=b.length;i<o;i++)j=j.replace(" "+b[i]+" ",
+" ");e.className=c.trim(j)}else e.className=""}return this},toggleClass:function(a,b){var d=typeof a,f=typeof b==="boolean";if(c.isFunction(a))return this.each(function(e){var j=c(this);j.toggleClass(a.call(this,e,j.attr("class"),b),b)});return this.each(function(){if(d==="string")for(var e,j=0,i=c(this),o=b,k=a.split(ca);e=k[j++];){o=f?o:!i.hasClass(e);i[o?"addClass":"removeClass"](e)}else if(d==="undefined"||d==="boolean"){this.className&&c.data(this,"__className__",this.className);this.className=
+this.className||a===false?"":c.data(this,"__className__")||""}})},hasClass:function(a){a=" "+a+" ";for(var b=0,d=this.length;b<d;b++)if((" "+this[b].className+" ").replace(Aa," ").indexOf(a)>-1)return true;return false},val:function(a){if(a===w){var b=this[0];if(b){if(c.nodeName(b,"option"))return(b.attributes.value||{}).specified?b.value:b.text;if(c.nodeName(b,"select")){var d=b.selectedIndex,f=[],e=b.options;b=b.type==="select-one";if(d<0)return null;var j=b?d:0;for(d=b?d+1:e.length;j<d;j++){var i=
+e[j];if(i.selected){a=c(i).val();if(b)return a;f.push(a)}}return f}if(Ba.test(b.type)&&!c.support.checkOn)return b.getAttribute("value")===null?"on":b.value;return(b.value||"").replace(Za,"")}return w}var o=c.isFunction(a);return this.each(function(k){var n=c(this),r=a;if(this.nodeType===1){if(o)r=a.call(this,k,n.val());if(typeof r==="number")r+="";if(c.isArray(r)&&Ba.test(this.type))this.checked=c.inArray(n.val(),r)>=0;else if(c.nodeName(this,"select")){var u=c.makeArray(r);c("option",this).each(function(){this.selected=
+c.inArray(c(this).val(),u)>=0});if(!u.length)this.selectedIndex=-1}else this.value=r}})}});c.extend({attrFn:{val:true,css:true,html:true,text:true,data:true,width:true,height:true,offset:true},attr:function(a,b,d,f){if(!a||a.nodeType===3||a.nodeType===8)return w;if(f&&b in c.attrFn)return c(a)[b](d);f=a.nodeType!==1||!c.isXMLDoc(a);var e=d!==w;b=f&&c.props[b]||b;if(a.nodeType===1){var j=$a.test(b);if(b in a&&f&&!j){if(e){b==="type"&&ab.test(a.nodeName)&&a.parentNode&&c.error("type property can't be changed");
+a[b]=d}if(c.nodeName(a,"form")&&a.getAttributeNode(b))return a.getAttributeNode(b).nodeValue;if(b==="tabIndex")return(b=a.getAttributeNode("tabIndex"))&&b.specified?b.value:bb.test(a.nodeName)||cb.test(a.nodeName)&&a.href?0:w;return a[b]}if(!c.support.style&&f&&b==="style"){if(e)a.style.cssText=""+d;return a.style.cssText}e&&a.setAttribute(b,""+d);a=!c.support.hrefNormalized&&f&&j?a.getAttribute(b,2):a.getAttribute(b);return a===null?w:a}return c.style(a,b,d)}});var O=/\.(.*)$/,db=function(a){return a.replace(/[^\w\s\.\|`]/g,
+function(b){return"\\"+b})};c.event={add:function(a,b,d,f){if(!(a.nodeType===3||a.nodeType===8)){if(a.setInterval&&a!==A&&!a.frameElement)a=A;var e,j;if(d.handler){e=d;d=e.handler}if(!d.guid)d.guid=c.guid++;if(j=c.data(a)){var i=j.events=j.events||{},o=j.handle;if(!o)j.handle=o=function(){return typeof c!=="undefined"&&!c.event.triggered?c.event.handle.apply(o.elem,arguments):w};o.elem=a;b=b.split(" ");for(var k,n=0,r;k=b[n++];){j=e?c.extend({},e):{handler:d,data:f};if(k.indexOf(".")>-1){r=k.split(".");
+k=r.shift();j.namespace=r.slice(0).sort().join(".")}else{r=[];j.namespace=""}j.type=k;j.guid=d.guid;var u=i[k],z=c.event.special[k]||{};if(!u){u=i[k]=[];if(!z.setup||z.setup.call(a,f,r,o)===false)if(a.addEventListener)a.addEventListener(k,o,false);else a.attachEvent&&a.attachEvent("on"+k,o)}if(z.add){z.add.call(a,j);if(!j.handler.guid)j.handler.guid=d.guid}u.push(j);c.event.global[k]=true}a=null}}},global:{},remove:function(a,b,d,f){if(!(a.nodeType===3||a.nodeType===8)){var e,j=0,i,o,k,n,r,u,z=c.data(a),
+C=z&&z.events;if(z&&C){if(b&&b.type){d=b.handler;b=b.type}if(!b||typeof b==="string"&&b.charAt(0)==="."){b=b||"";for(e in C)c.event.remove(a,e+b)}else{for(b=b.split(" ");e=b[j++];){n=e;i=e.indexOf(".")<0;o=[];if(!i){o=e.split(".");e=o.shift();k=new RegExp("(^|\\.)"+c.map(o.slice(0).sort(),db).join("\\.(?:.*\\.)?")+"(\\.|$)")}if(r=C[e])if(d){n=c.event.special[e]||{};for(B=f||0;B<r.length;B++){u=r[B];if(d.guid===u.guid){if(i||k.test(u.namespace)){f==null&&r.splice(B--,1);n.remove&&n.remove.call(a,u)}if(f!=
+null)break}}if(r.length===0||f!=null&&r.length===1){if(!n.teardown||n.teardown.call(a,o)===false)Ca(a,e,z.handle);delete C[e]}}else for(var B=0;B<r.length;B++){u=r[B];if(i||k.test(u.namespace)){c.event.remove(a,n,u.handler,B);r.splice(B--,1)}}}if(c.isEmptyObject(C)){if(b=z.handle)b.elem=null;delete z.events;delete z.handle;c.isEmptyObject(z)&&c.removeData(a)}}}}},trigger:function(a,b,d,f){var e=a.type||a;if(!f){a=typeof a==="object"?a[G]?a:c.extend(c.Event(e),a):c.Event(e);if(e.indexOf("!")>=0){a.type=
+e=e.slice(0,-1);a.exclusive=true}if(!d){a.stopPropagation();c.event.global[e]&&c.each(c.cache,function(){this.events&&this.events[e]&&c.event.trigger(a,b,this.handle.elem)})}if(!d||d.nodeType===3||d.nodeType===8)return w;a.result=w;a.target=d;b=c.makeArray(b);b.unshift(a)}a.currentTarget=d;(f=c.data(d,"handle"))&&f.apply(d,b);f=d.parentNode||d.ownerDocument;try{if(!(d&&d.nodeName&&c.noData[d.nodeName.toLowerCase()]))if(d["on"+e]&&d["on"+e].apply(d,b)===false)a.result=false}catch(j){}if(!a.isPropagationStopped()&&
+f)c.event.trigger(a,b,f,true);else if(!a.isDefaultPrevented()){f=a.target;var i,o=c.nodeName(f,"a")&&e==="click",k=c.event.special[e]||{};if((!k._default||k._default.call(d,a)===false)&&!o&&!(f&&f.nodeName&&c.noData[f.nodeName.toLowerCase()])){try{if(f[e]){if(i=f["on"+e])f["on"+e]=null;c.event.triggered=true;f[e]()}}catch(n){}if(i)f["on"+e]=i;c.event.triggered=false}}},handle:function(a){var b,d,f,e;a=arguments[0]=c.event.fix(a||A.event);a.currentTarget=this;b=a.type.indexOf(".")<0&&!a.exclusive;
+if(!b){d=a.type.split(".");a.type=d.shift();f=new RegExp("(^|\\.)"+d.slice(0).sort().join("\\.(?:.*\\.)?")+"(\\.|$)")}e=c.data(this,"events");d=e[a.type];if(e&&d){d=d.slice(0);e=0;for(var j=d.length;e<j;e++){var i=d[e];if(b||f.test(i.namespace)){a.handler=i.handler;a.data=i.data;a.handleObj=i;i=i.handler.apply(this,arguments);if(i!==w){a.result=i;if(i===false){a.preventDefault();a.stopPropagation()}}if(a.isImmediatePropagationStopped())break}}}return a.result},props:"altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode layerX layerY metaKey newValue offsetX offsetY originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),
+fix:function(a){if(a[G])return a;var b=a;a=c.Event(b);for(var d=this.props.length,f;d;){f=this.props[--d];a[f]=b[f]}if(!a.target)a.target=a.srcElement||s;if(a.target.nodeType===3)a.target=a.target.parentNode;if(!a.relatedTarget&&a.fromElement)a.relatedTarget=a.fromElement===a.target?a.toElement:a.fromElement;if(a.pageX==null&&a.clientX!=null){b=s.documentElement;d=s.body;a.pageX=a.clientX+(b&&b.scrollLeft||d&&d.scrollLeft||0)-(b&&b.clientLeft||d&&d.clientLeft||0);a.pageY=a.clientY+(b&&b.scrollTop||
+d&&d.scrollTop||0)-(b&&b.clientTop||d&&d.clientTop||0)}if(!a.which&&(a.charCode||a.charCode===0?a.charCode:a.keyCode))a.which=a.charCode||a.keyCode;if(!a.metaKey&&a.ctrlKey)a.metaKey=a.ctrlKey;if(!a.which&&a.button!==w)a.which=a.button&1?1:a.button&2?3:a.button&4?2:0;return a},guid:1E8,proxy:c.proxy,special:{ready:{setup:c.bindReady,teardown:c.noop},live:{add:function(a){c.event.add(this,a.origType,c.extend({},a,{handler:oa}))},remove:function(a){var b=true,d=a.origType.replace(O,"");c.each(c.data(this,
+"events").live||[],function(){if(d===this.origType.replace(O,""))return b=false});b&&c.event.remove(this,a.origType,oa)}},beforeunload:{setup:function(a,b,d){if(this.setInterval)this.onbeforeunload=d;return false},teardown:function(a,b){if(this.onbeforeunload===b)this.onbeforeunload=null}}}};var Ca=s.removeEventListener?function(a,b,d){a.removeEventListener(b,d,false)}:function(a,b,d){a.detachEvent("on"+b,d)};c.Event=function(a){if(!this.preventDefault)return new c.Event(a);if(a&&a.type){this.originalEvent=
+a;this.type=a.type}else this.type=a;this.timeStamp=J();this[G]=true};c.Event.prototype={preventDefault:function(){this.isDefaultPrevented=Z;var a=this.originalEvent;if(a){a.preventDefault&&a.preventDefault();a.returnValue=false}},stopPropagation:function(){this.isPropagationStopped=Z;var a=this.originalEvent;if(a){a.stopPropagation&&a.stopPropagation();a.cancelBubble=true}},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=Z;this.stopPropagation()},isDefaultPrevented:Y,isPropagationStopped:Y,
+isImmediatePropagationStopped:Y};var Da=function(a){var b=a.relatedTarget;try{for(;b&&b!==this;)b=b.parentNode;if(b!==this){a.type=a.data;c.event.handle.apply(this,arguments)}}catch(d){}},Ea=function(a){a.type=a.data;c.event.handle.apply(this,arguments)};c.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(a,b){c.event.special[a]={setup:function(d){c.event.add(this,b,d&&d.selector?Ea:Da,a)},teardown:function(d){c.event.remove(this,b,d&&d.selector?Ea:Da)}}});if(!c.support.submitBubbles)c.event.special.submit=
+{setup:function(){if(this.nodeName.toLowerCase()!=="form"){c.event.add(this,"click.specialSubmit",function(a){var b=a.target,d=b.type;if((d==="submit"||d==="image")&&c(b).closest("form").length)return na("submit",this,arguments)});c.event.add(this,"keypress.specialSubmit",function(a){var b=a.target,d=b.type;if((d==="text"||d==="password")&&c(b).closest("form").length&&a.keyCode===13)return na("submit",this,arguments)})}else return false},teardown:function(){c.event.remove(this,".specialSubmit")}};
+if(!c.support.changeBubbles){var da=/textarea|input|select/i,ea,Fa=function(a){var b=a.type,d=a.value;if(b==="radio"||b==="checkbox")d=a.checked;else if(b==="select-multiple")d=a.selectedIndex>-1?c.map(a.options,function(f){return f.selected}).join("-"):"";else if(a.nodeName.toLowerCase()==="select")d=a.selectedIndex;return d},fa=function(a,b){var d=a.target,f,e;if(!(!da.test(d.nodeName)||d.readOnly)){f=c.data(d,"_change_data");e=Fa(d);if(a.type!=="focusout"||d.type!=="radio")c.data(d,"_change_data",
+e);if(!(f===w||e===f))if(f!=null||e){a.type="change";return c.event.trigger(a,b,d)}}};c.event.special.change={filters:{focusout:fa,click:function(a){var b=a.target,d=b.type;if(d==="radio"||d==="checkbox"||b.nodeName.toLowerCase()==="select")return fa.call(this,a)},keydown:function(a){var b=a.target,d=b.type;if(a.keyCode===13&&b.nodeName.toLowerCase()!=="textarea"||a.keyCode===32&&(d==="checkbox"||d==="radio")||d==="select-multiple")return fa.call(this,a)},beforeactivate:function(a){a=a.target;c.data(a,
+"_change_data",Fa(a))}},setup:function(){if(this.type==="file")return false;for(var a in ea)c.event.add(this,a+".specialChange",ea[a]);return da.test(this.nodeName)},teardown:function(){c.event.remove(this,".specialChange");return da.test(this.nodeName)}};ea=c.event.special.change.filters}s.addEventListener&&c.each({focus:"focusin",blur:"focusout"},function(a,b){function d(f){f=c.event.fix(f);f.type=b;return c.event.handle.call(this,f)}c.event.special[b]={setup:function(){this.addEventListener(a,
+d,true)},teardown:function(){this.removeEventListener(a,d,true)}}});c.each(["bind","one"],function(a,b){c.fn[b]=function(d,f,e){if(typeof d==="object"){for(var j in d)this[b](j,f,d[j],e);return this}if(c.isFunction(f)){e=f;f=w}var i=b==="one"?c.proxy(e,function(k){c(this).unbind(k,i);return e.apply(this,arguments)}):e;if(d==="unload"&&b!=="one")this.one(d,f,e);else{j=0;for(var o=this.length;j<o;j++)c.event.add(this[j],d,i,f)}return this}});c.fn.extend({unbind:function(a,b){if(typeof a==="object"&&
+!a.preventDefault)for(var d in a)this.unbind(d,a[d]);else{d=0;for(var f=this.length;d<f;d++)c.event.remove(this[d],a,b)}return this},delegate:function(a,b,d,f){return this.live(b,d,f,a)},undelegate:function(a,b,d){return arguments.length===0?this.unbind("live"):this.die(b,null,d,a)},trigger:function(a,b){return this.each(function(){c.event.trigger(a,b,this)})},triggerHandler:function(a,b){if(this[0]){a=c.Event(a);a.preventDefault();a.stopPropagation();c.event.trigger(a,b,this[0]);return a.result}},
+toggle:function(a){for(var b=arguments,d=1;d<b.length;)c.proxy(a,b[d++]);return this.click(c.proxy(a,function(f){var e=(c.data(this,"lastToggle"+a.guid)||0)%d;c.data(this,"lastToggle"+a.guid,e+1);f.preventDefault();return b[e].apply(this,arguments)||false}))},hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}});var Ga={focus:"focusin",blur:"focusout",mouseenter:"mouseover",mouseleave:"mouseout"};c.each(["live","die"],function(a,b){c.fn[b]=function(d,f,e,j){var i,o=0,k,n,r=j||this.selector,
+u=j?this:c(this.context);if(c.isFunction(f)){e=f;f=w}for(d=(d||"").split(" ");(i=d[o++])!=null;){j=O.exec(i);k="";if(j){k=j[0];i=i.replace(O,"")}if(i==="hover")d.push("mouseenter"+k,"mouseleave"+k);else{n=i;if(i==="focus"||i==="blur"){d.push(Ga[i]+k);i+=k}else i=(Ga[i]||i)+k;b==="live"?u.each(function(){c.event.add(this,pa(i,r),{data:f,selector:r,handler:e,origType:i,origHandler:e,preType:n})}):u.unbind(pa(i,r),e)}}return this}});c.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error".split(" "),
+function(a,b){c.fn[b]=function(d){return d?this.bind(b,d):this.trigger(b)};if(c.attrFn)c.attrFn[b]=true});A.attachEvent&&!A.addEventListener&&A.attachEvent("onunload",function(){for(var a in c.cache)if(c.cache[a].handle)try{c.event.remove(c.cache[a].handle.elem)}catch(b){}});(function(){function a(g){for(var h="",l,m=0;g[m];m++){l=g[m];if(l.nodeType===3||l.nodeType===4)h+=l.nodeValue;else if(l.nodeType!==8)h+=a(l.childNodes)}return h}function b(g,h,l,m,q,p){q=0;for(var v=m.length;q<v;q++){var t=m[q];
+if(t){t=t[g];for(var y=false;t;){if(t.sizcache===l){y=m[t.sizset];break}if(t.nodeType===1&&!p){t.sizcache=l;t.sizset=q}if(t.nodeName.toLowerCase()===h){y=t;break}t=t[g]}m[q]=y}}}function d(g,h,l,m,q,p){q=0;for(var v=m.length;q<v;q++){var t=m[q];if(t){t=t[g];for(var y=false;t;){if(t.sizcache===l){y=m[t.sizset];break}if(t.nodeType===1){if(!p){t.sizcache=l;t.sizset=q}if(typeof h!=="string"){if(t===h){y=true;break}}else if(k.filter(h,[t]).length>0){y=t;break}}t=t[g]}m[q]=y}}}var f=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,
+e=0,j=Object.prototype.toString,i=false,o=true;[0,0].sort(function(){o=false;return 0});var k=function(g,h,l,m){l=l||[];var q=h=h||s;if(h.nodeType!==1&&h.nodeType!==9)return[];if(!g||typeof g!=="string")return l;for(var p=[],v,t,y,S,H=true,M=x(h),I=g;(f.exec(""),v=f.exec(I))!==null;){I=v[3];p.push(v[1]);if(v[2]){S=v[3];break}}if(p.length>1&&r.exec(g))if(p.length===2&&n.relative[p[0]])t=ga(p[0]+p[1],h);else for(t=n.relative[p[0]]?[h]:k(p.shift(),h);p.length;){g=p.shift();if(n.relative[g])g+=p.shift();
+t=ga(g,t)}else{if(!m&&p.length>1&&h.nodeType===9&&!M&&n.match.ID.test(p[0])&&!n.match.ID.test(p[p.length-1])){v=k.find(p.shift(),h,M);h=v.expr?k.filter(v.expr,v.set)[0]:v.set[0]}if(h){v=m?{expr:p.pop(),set:z(m)}:k.find(p.pop(),p.length===1&&(p[0]==="~"||p[0]==="+")&&h.parentNode?h.parentNode:h,M);t=v.expr?k.filter(v.expr,v.set):v.set;if(p.length>0)y=z(t);else H=false;for(;p.length;){var D=p.pop();v=D;if(n.relative[D])v=p.pop();else D="";if(v==null)v=h;n.relative[D](y,v,M)}}else y=[]}y||(y=t);y||k.error(D||
+g);if(j.call(y)==="[object Array]")if(H)if(h&&h.nodeType===1)for(g=0;y[g]!=null;g++){if(y[g]&&(y[g]===true||y[g].nodeType===1&&E(h,y[g])))l.push(t[g])}else for(g=0;y[g]!=null;g++)y[g]&&y[g].nodeType===1&&l.push(t[g]);else l.push.apply(l,y);else z(y,l);if(S){k(S,q,l,m);k.uniqueSort(l)}return l};k.uniqueSort=function(g){if(B){i=o;g.sort(B);if(i)for(var h=1;h<g.length;h++)g[h]===g[h-1]&&g.splice(h--,1)}return g};k.matches=function(g,h){return k(g,null,null,h)};k.find=function(g,h,l){var m,q;if(!g)return[];
+for(var p=0,v=n.order.length;p<v;p++){var t=n.order[p];if(q=n.leftMatch[t].exec(g)){var y=q[1];q.splice(1,1);if(y.substr(y.length-1)!=="\\"){q[1]=(q[1]||"").replace(/\\/g,"");m=n.find[t](q,h,l);if(m!=null){g=g.replace(n.match[t],"");break}}}}m||(m=h.getElementsByTagName("*"));return{set:m,expr:g}};k.filter=function(g,h,l,m){for(var q=g,p=[],v=h,t,y,S=h&&h[0]&&x(h[0]);g&&h.length;){for(var H in n.filter)if((t=n.leftMatch[H].exec(g))!=null&&t[2]){var M=n.filter[H],I,D;D=t[1];y=false;t.splice(1,1);if(D.substr(D.length-
+1)!=="\\"){if(v===p)p=[];if(n.preFilter[H])if(t=n.preFilter[H](t,v,l,p,m,S)){if(t===true)continue}else y=I=true;if(t)for(var U=0;(D=v[U])!=null;U++)if(D){I=M(D,t,U,v);var Ha=m^!!I;if(l&&I!=null)if(Ha)y=true;else v[U]=false;else if(Ha){p.push(D);y=true}}if(I!==w){l||(v=p);g=g.replace(n.match[H],"");if(!y)return[];break}}}if(g===q)if(y==null)k.error(g);else break;q=g}return v};k.error=function(g){throw"Syntax error, unrecognized expression: "+g;};var n=k.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF-]|\\.)+)/,
+CLASS:/\.((?:[\w\u00c0-\uFFFF-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\((even|odd|[\dn+-]*)\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/},leftMatch:{},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(g){return g.getAttribute("href")}},
+relative:{"+":function(g,h){var l=typeof h==="string",m=l&&!/\W/.test(h);l=l&&!m;if(m)h=h.toLowerCase();m=0;for(var q=g.length,p;m<q;m++)if(p=g[m]){for(;(p=p.previousSibling)&&p.nodeType!==1;);g[m]=l||p&&p.nodeName.toLowerCase()===h?p||false:p===h}l&&k.filter(h,g,true)},">":function(g,h){var l=typeof h==="string";if(l&&!/\W/.test(h)){h=h.toLowerCase();for(var m=0,q=g.length;m<q;m++){var p=g[m];if(p){l=p.parentNode;g[m]=l.nodeName.toLowerCase()===h?l:false}}}else{m=0;for(q=g.length;m<q;m++)if(p=g[m])g[m]=
+l?p.parentNode:p.parentNode===h;l&&k.filter(h,g,true)}},"":function(g,h,l){var m=e++,q=d;if(typeof h==="string"&&!/\W/.test(h)){var p=h=h.toLowerCase();q=b}q("parentNode",h,m,g,p,l)},"~":function(g,h,l){var m=e++,q=d;if(typeof h==="string"&&!/\W/.test(h)){var p=h=h.toLowerCase();q=b}q("previousSibling",h,m,g,p,l)}},find:{ID:function(g,h,l){if(typeof h.getElementById!=="undefined"&&!l)return(g=h.getElementById(g[1]))?[g]:[]},NAME:function(g,h){if(typeof h.getElementsByName!=="undefined"){var l=[];
+h=h.getElementsByName(g[1]);for(var m=0,q=h.length;m<q;m++)h[m].getAttribute("name")===g[1]&&l.push(h[m]);return l.length===0?null:l}},TAG:function(g,h){return h.getElementsByTagName(g[1])}},preFilter:{CLASS:function(g,h,l,m,q,p){g=" "+g[1].replace(/\\/g,"")+" ";if(p)return g;p=0;for(var v;(v=h[p])!=null;p++)if(v)if(q^(v.className&&(" "+v.className+" ").replace(/[\t\n]/g," ").indexOf(g)>=0))l||m.push(v);else if(l)h[p]=false;return false},ID:function(g){return g[1].replace(/\\/g,"")},TAG:function(g){return g[1].toLowerCase()},
+CHILD:function(g){if(g[1]==="nth"){var h=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(g[2]==="even"&&"2n"||g[2]==="odd"&&"2n+1"||!/\D/.test(g[2])&&"0n+"+g[2]||g[2]);g[2]=h[1]+(h[2]||1)-0;g[3]=h[3]-0}g[0]=e++;return g},ATTR:function(g,h,l,m,q,p){h=g[1].replace(/\\/g,"");if(!p&&n.attrMap[h])g[1]=n.attrMap[h];if(g[2]==="~=")g[4]=" "+g[4]+" ";return g},PSEUDO:function(g,h,l,m,q){if(g[1]==="not")if((f.exec(g[3])||"").length>1||/^\w/.test(g[3]))g[3]=k(g[3],null,null,h);else{g=k.filter(g[3],h,l,true^q);l||m.push.apply(m,
+g);return false}else if(n.match.POS.test(g[0])||n.match.CHILD.test(g[0]))return true;return g},POS:function(g){g.unshift(true);return g}},filters:{enabled:function(g){return g.disabled===false&&g.type!=="hidden"},disabled:function(g){return g.disabled===true},checked:function(g){return g.checked===true},selected:function(g){return g.selected===true},parent:function(g){return!!g.firstChild},empty:function(g){return!g.firstChild},has:function(g,h,l){return!!k(l[3],g).length},header:function(g){return/h\d/i.test(g.nodeName)},
+text:function(g){return"text"===g.type},radio:function(g){return"radio"===g.type},checkbox:function(g){return"checkbox"===g.type},file:function(g){return"file"===g.type},password:function(g){return"password"===g.type},submit:function(g){return"submit"===g.type},image:function(g){return"image"===g.type},reset:function(g){return"reset"===g.type},button:function(g){return"button"===g.type||g.nodeName.toLowerCase()==="button"},input:function(g){return/input|select|textarea|button/i.test(g.nodeName)}},
+setFilters:{first:function(g,h){return h===0},last:function(g,h,l,m){return h===m.length-1},even:function(g,h){return h%2===0},odd:function(g,h){return h%2===1},lt:function(g,h,l){return h<l[3]-0},gt:function(g,h,l){return h>l[3]-0},nth:function(g,h,l){return l[3]-0===h},eq:function(g,h,l){return l[3]-0===h}},filter:{PSEUDO:function(g,h,l,m){var q=h[1],p=n.filters[q];if(p)return p(g,l,h,m);else if(q==="contains")return(g.textContent||g.innerText||a([g])||"").indexOf(h[3])>=0;else if(q==="not"){h=
+h[3];l=0;for(m=h.length;l<m;l++)if(h[l]===g)return false;return true}else k.error("Syntax error, unrecognized expression: "+q)},CHILD:function(g,h){var l=h[1],m=g;switch(l){case "only":case "first":for(;m=m.previousSibling;)if(m.nodeType===1)return false;if(l==="first")return true;m=g;case "last":for(;m=m.nextSibling;)if(m.nodeType===1)return false;return true;case "nth":l=h[2];var q=h[3];if(l===1&&q===0)return true;h=h[0];var p=g.parentNode;if(p&&(p.sizcache!==h||!g.nodeIndex)){var v=0;for(m=p.firstChild;m;m=
+m.nextSibling)if(m.nodeType===1)m.nodeIndex=++v;p.sizcache=h}g=g.nodeIndex-q;return l===0?g===0:g%l===0&&g/l>=0}},ID:function(g,h){return g.nodeType===1&&g.getAttribute("id")===h},TAG:function(g,h){return h==="*"&&g.nodeType===1||g.nodeName.toLowerCase()===h},CLASS:function(g,h){return(" "+(g.className||g.getAttribute("class"))+" ").indexOf(h)>-1},ATTR:function(g,h){var l=h[1];g=n.attrHandle[l]?n.attrHandle[l](g):g[l]!=null?g[l]:g.getAttribute(l);l=g+"";var m=h[2];h=h[4];return g==null?m==="!=":m===
+"="?l===h:m==="*="?l.indexOf(h)>=0:m==="~="?(" "+l+" ").indexOf(h)>=0:!h?l&&g!==false:m==="!="?l!==h:m==="^="?l.indexOf(h)===0:m==="$="?l.substr(l.length-h.length)===h:m==="|="?l===h||l.substr(0,h.length+1)===h+"-":false},POS:function(g,h,l,m){var q=n.setFilters[h[2]];if(q)return q(g,l,h,m)}}},r=n.match.POS;for(var u in n.match){n.match[u]=new RegExp(n.match[u].source+/(?![^\[]*\])(?![^\(]*\))/.source);n.leftMatch[u]=new RegExp(/(^(?:.|\r|\n)*?)/.source+n.match[u].source.replace(/\\(\d+)/g,function(g,
+h){return"\\"+(h-0+1)}))}var z=function(g,h){g=Array.prototype.slice.call(g,0);if(h){h.push.apply(h,g);return h}return g};try{Array.prototype.slice.call(s.documentElement.childNodes,0)}catch(C){z=function(g,h){h=h||[];if(j.call(g)==="[object Array]")Array.prototype.push.apply(h,g);else if(typeof g.length==="number")for(var l=0,m=g.length;l<m;l++)h.push(g[l]);else for(l=0;g[l];l++)h.push(g[l]);return h}}var B;if(s.documentElement.compareDocumentPosition)B=function(g,h){if(!g.compareDocumentPosition||
+!h.compareDocumentPosition){if(g==h)i=true;return g.compareDocumentPosition?-1:1}g=g.compareDocumentPosition(h)&4?-1:g===h?0:1;if(g===0)i=true;return g};else if("sourceIndex"in s.documentElement)B=function(g,h){if(!g.sourceIndex||!h.sourceIndex){if(g==h)i=true;return g.sourceIndex?-1:1}g=g.sourceIndex-h.sourceIndex;if(g===0)i=true;return g};else if(s.createRange)B=function(g,h){if(!g.ownerDocument||!h.ownerDocument){if(g==h)i=true;return g.ownerDocument?-1:1}var l=g.ownerDocument.createRange(),m=
+h.ownerDocument.createRange();l.setStart(g,0);l.setEnd(g,0);m.setStart(h,0);m.setEnd(h,0);g=l.compareBoundaryPoints(Range.START_TO_END,m);if(g===0)i=true;return g};(function(){var g=s.createElement("div"),h="script"+(new Date).getTime();g.innerHTML="<a name='"+h+"'/>";var l=s.documentElement;l.insertBefore(g,l.firstChild);if(s.getElementById(h)){n.find.ID=function(m,q,p){if(typeof q.getElementById!=="undefined"&&!p)return(q=q.getElementById(m[1]))?q.id===m[1]||typeof q.getAttributeNode!=="undefined"&&
+q.getAttributeNode("id").nodeValue===m[1]?[q]:w:[]};n.filter.ID=function(m,q){var p=typeof m.getAttributeNode!=="undefined"&&m.getAttributeNode("id");return m.nodeType===1&&p&&p.nodeValue===q}}l.removeChild(g);l=g=null})();(function(){var g=s.createElement("div");g.appendChild(s.createComment(""));if(g.getElementsByTagName("*").length>0)n.find.TAG=function(h,l){l=l.getElementsByTagName(h[1]);if(h[1]==="*"){h=[];for(var m=0;l[m];m++)l[m].nodeType===1&&h.push(l[m]);l=h}return l};g.innerHTML="<a href='#'></a>";
+if(g.firstChild&&typeof g.firstChild.getAttribute!=="undefined"&&g.firstChild.getAttribute("href")!=="#")n.attrHandle.href=function(h){return h.getAttribute("href",2)};g=null})();s.querySelectorAll&&function(){var g=k,h=s.createElement("div");h.innerHTML="<p class='TEST'></p>";if(!(h.querySelectorAll&&h.querySelectorAll(".TEST").length===0)){k=function(m,q,p,v){q=q||s;if(!v&&q.nodeType===9&&!x(q))try{return z(q.querySelectorAll(m),p)}catch(t){}return g(m,q,p,v)};for(var l in g)k[l]=g[l];h=null}}();
+(function(){var g=s.createElement("div");g.innerHTML="<div class='test e'></div><div class='test'></div>";if(!(!g.getElementsByClassName||g.getElementsByClassName("e").length===0)){g.lastChild.className="e";if(g.getElementsByClassName("e").length!==1){n.order.splice(1,0,"CLASS");n.find.CLASS=function(h,l,m){if(typeof l.getElementsByClassName!=="undefined"&&!m)return l.getElementsByClassName(h[1])};g=null}}})();var E=s.compareDocumentPosition?function(g,h){return!!(g.compareDocumentPosition(h)&16)}:
+function(g,h){return g!==h&&(g.contains?g.contains(h):true)},x=function(g){return(g=(g?g.ownerDocument||g:0).documentElement)?g.nodeName!=="HTML":false},ga=function(g,h){var l=[],m="",q;for(h=h.nodeType?[h]:h;q=n.match.PSEUDO.exec(g);){m+=q[0];g=g.replace(n.match.PSEUDO,"")}g=n.relative[g]?g+"*":g;q=0;for(var p=h.length;q<p;q++)k(g,h[q],l);return k.filter(m,l)};c.find=k;c.expr=k.selectors;c.expr[":"]=c.expr.filters;c.unique=k.uniqueSort;c.text=a;c.isXMLDoc=x;c.contains=E})();var eb=/Until$/,fb=/^(?:parents|prevUntil|prevAll)/,
+gb=/,/;R=Array.prototype.slice;var Ia=function(a,b,d){if(c.isFunction(b))return c.grep(a,function(e,j){return!!b.call(e,j,e)===d});else if(b.nodeType)return c.grep(a,function(e){return e===b===d});else if(typeof b==="string"){var f=c.grep(a,function(e){return e.nodeType===1});if(Ua.test(b))return c.filter(b,f,!d);else b=c.filter(b,f)}return c.grep(a,function(e){return c.inArray(e,b)>=0===d})};c.fn.extend({find:function(a){for(var b=this.pushStack("","find",a),d=0,f=0,e=this.length;f<e;f++){d=b.length;
+c.find(a,this[f],b);if(f>0)for(var j=d;j<b.length;j++)for(var i=0;i<d;i++)if(b[i]===b[j]){b.splice(j--,1);break}}return b},has:function(a){var b=c(a);return this.filter(function(){for(var d=0,f=b.length;d<f;d++)if(c.contains(this,b[d]))return true})},not:function(a){return this.pushStack(Ia(this,a,false),"not",a)},filter:function(a){return this.pushStack(Ia(this,a,true),"filter",a)},is:function(a){return!!a&&c.filter(a,this).length>0},closest:function(a,b){if(c.isArray(a)){var d=[],f=this[0],e,j=
+{},i;if(f&&a.length){e=0;for(var o=a.length;e<o;e++){i=a[e];j[i]||(j[i]=c.expr.match.POS.test(i)?c(i,b||this.context):i)}for(;f&&f.ownerDocument&&f!==b;){for(i in j){e=j[i];if(e.jquery?e.index(f)>-1:c(f).is(e)){d.push({selector:i,elem:f});delete j[i]}}f=f.parentNode}}return d}var k=c.expr.match.POS.test(a)?c(a,b||this.context):null;return this.map(function(n,r){for(;r&&r.ownerDocument&&r!==b;){if(k?k.index(r)>-1:c(r).is(a))return r;r=r.parentNode}return null})},index:function(a){if(!a||typeof a===
+"string")return c.inArray(this[0],a?c(a):this.parent().children());return c.inArray(a.jquery?a[0]:a,this)},add:function(a,b){a=typeof a==="string"?c(a,b||this.context):c.makeArray(a);b=c.merge(this.get(),a);return this.pushStack(qa(a[0])||qa(b[0])?b:c.unique(b))},andSelf:function(){return this.add(this.prevObject)}});c.each({parent:function(a){return(a=a.parentNode)&&a.nodeType!==11?a:null},parents:function(a){return c.dir(a,"parentNode")},parentsUntil:function(a,b,d){return c.dir(a,"parentNode",
+d)},next:function(a){return c.nth(a,2,"nextSibling")},prev:function(a){return c.nth(a,2,"previousSibling")},nextAll:function(a){return c.dir(a,"nextSibling")},prevAll:function(a){return c.dir(a,"previousSibling")},nextUntil:function(a,b,d){return c.dir(a,"nextSibling",d)},prevUntil:function(a,b,d){return c.dir(a,"previousSibling",d)},siblings:function(a){return c.sibling(a.parentNode.firstChild,a)},children:function(a){return c.sibling(a.firstChild)},contents:function(a){return c.nodeName(a,"iframe")?
+a.contentDocument||a.contentWindow.document:c.makeArray(a.childNodes)}},function(a,b){c.fn[a]=function(d,f){var e=c.map(this,b,d);eb.test(a)||(f=d);if(f&&typeof f==="string")e=c.filter(f,e);e=this.length>1?c.unique(e):e;if((this.length>1||gb.test(f))&&fb.test(a))e=e.reverse();return this.pushStack(e,a,R.call(arguments).join(","))}});c.extend({filter:function(a,b,d){if(d)a=":not("+a+")";return c.find.matches(a,b)},dir:function(a,b,d){var f=[];for(a=a[b];a&&a.nodeType!==9&&(d===w||a.nodeType!==1||!c(a).is(d));){a.nodeType===
+1&&f.push(a);a=a[b]}return f},nth:function(a,b,d){b=b||1;for(var f=0;a;a=a[d])if(a.nodeType===1&&++f===b)break;return a},sibling:function(a,b){for(var d=[];a;a=a.nextSibling)a.nodeType===1&&a!==b&&d.push(a);return d}});var Ja=/ jQuery\d+="(?:\d+|null)"/g,V=/^\s+/,Ka=/(<([\w:]+)[^>]*?)\/>/g,hb=/^(?:area|br|col|embed|hr|img|input|link|meta|param)$/i,La=/<([\w:]+)/,ib=/<tbody/i,jb=/<|&#?\w+;/,ta=/<script|<object|<embed|<option|<style/i,ua=/checked\s*(?:[^=]|=\s*.checked.)/i,Ma=function(a,b,d){return hb.test(d)?
+a:b+"></"+d+">"},F={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],area:[1,"<map>","</map>"],_default:[0,"",""]};F.optgroup=F.option;F.tbody=F.tfoot=F.colgroup=F.caption=F.thead;F.th=F.td;if(!c.support.htmlSerialize)F._default=[1,"div<div>","</div>"];c.fn.extend({text:function(a){if(c.isFunction(a))return this.each(function(b){var d=
+c(this);d.text(a.call(this,b,d.text()))});if(typeof a!=="object"&&a!==w)return this.empty().append((this[0]&&this[0].ownerDocument||s).createTextNode(a));return c.text(this)},wrapAll:function(a){if(c.isFunction(a))return this.each(function(d){c(this).wrapAll(a.call(this,d))});if(this[0]){var b=c(a,this[0].ownerDocument).eq(0).clone(true);this[0].parentNode&&b.insertBefore(this[0]);b.map(function(){for(var d=this;d.firstChild&&d.firstChild.nodeType===1;)d=d.firstChild;return d}).append(this)}return this},
+wrapInner:function(a){if(c.isFunction(a))return this.each(function(b){c(this).wrapInner(a.call(this,b))});return this.each(function(){var b=c(this),d=b.contents();d.length?d.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){c(this).wrapAll(a)})},unwrap:function(){return this.parent().each(function(){c.nodeName(this,"body")||c(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.appendChild(a)})},
+prepend:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b,this)});else if(arguments.length){var a=c(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b,
+this.nextSibling)});else if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,c(arguments[0]).toArray());return a}},remove:function(a,b){for(var d=0,f;(f=this[d])!=null;d++)if(!a||c.filter(a,[f]).length){if(!b&&f.nodeType===1){c.cleanData(f.getElementsByTagName("*"));c.cleanData([f])}f.parentNode&&f.parentNode.removeChild(f)}return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++)for(b.nodeType===1&&c.cleanData(b.getElementsByTagName("*"));b.firstChild;)b.removeChild(b.firstChild);
+return this},clone:function(a){var b=this.map(function(){if(!c.support.noCloneEvent&&!c.isXMLDoc(this)){var d=this.outerHTML,f=this.ownerDocument;if(!d){d=f.createElement("div");d.appendChild(this.cloneNode(true));d=d.innerHTML}return c.clean([d.replace(Ja,"").replace(/=([^="'>\s]+\/)>/g,'="$1">').replace(V,"")],f)[0]}else return this.cloneNode(true)});if(a===true){ra(this,b);ra(this.find("*"),b.find("*"))}return b},html:function(a){if(a===w)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(Ja,
+""):null;else if(typeof a==="string"&&!ta.test(a)&&(c.support.leadingWhitespace||!V.test(a))&&!F[(La.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Ka,Ma);try{for(var b=0,d=this.length;b<d;b++)if(this[b].nodeType===1){c.cleanData(this[b].getElementsByTagName("*"));this[b].innerHTML=a}}catch(f){this.empty().append(a)}}else c.isFunction(a)?this.each(function(e){var j=c(this),i=j.html();j.empty().append(function(){return a.call(this,e,i)})}):this.empty().append(a);return this},replaceWith:function(a){if(this[0]&&
+this[0].parentNode){if(c.isFunction(a))return this.each(function(b){var d=c(this),f=d.html();d.replaceWith(a.call(this,b,f))});if(typeof a!=="string")a=c(a).detach();return this.each(function(){var b=this.nextSibling,d=this.parentNode;c(this).remove();b?c(b).before(a):c(d).append(a)})}else return this.pushStack(c(c.isFunction(a)?a():a),"replaceWith",a)},detach:function(a){return this.remove(a,true)},domManip:function(a,b,d){function f(u){return c.nodeName(u,"table")?u.getElementsByTagName("tbody")[0]||
+u.appendChild(u.ownerDocument.createElement("tbody")):u}var e,j,i=a[0],o=[],k;if(!c.support.checkClone&&arguments.length===3&&typeof i==="string"&&ua.test(i))return this.each(function(){c(this).domManip(a,b,d,true)});if(c.isFunction(i))return this.each(function(u){var z=c(this);a[0]=i.call(this,u,b?z.html():w);z.domManip(a,b,d)});if(this[0]){e=i&&i.parentNode;e=c.support.parentNode&&e&&e.nodeType===11&&e.childNodes.length===this.length?{fragment:e}:sa(a,this,o);k=e.fragment;if(j=k.childNodes.length===
+1?(k=k.firstChild):k.firstChild){b=b&&c.nodeName(j,"tr");for(var n=0,r=this.length;n<r;n++)d.call(b?f(this[n],j):this[n],n>0||e.cacheable||this.length>1?k.cloneNode(true):k)}o.length&&c.each(o,Qa)}return this}});c.fragments={};c.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){c.fn[a]=function(d){var f=[];d=c(d);var e=this.length===1&&this[0].parentNode;if(e&&e.nodeType===11&&e.childNodes.length===1&&d.length===1){d[b](this[0]);
+return this}else{e=0;for(var j=d.length;e<j;e++){var i=(e>0?this.clone(true):this).get();c.fn[b].apply(c(d[e]),i);f=f.concat(i)}return this.pushStack(f,a,d.selector)}}});c.extend({clean:function(a,b,d,f){b=b||s;if(typeof b.createElement==="undefined")b=b.ownerDocument||b[0]&&b[0].ownerDocument||s;for(var e=[],j=0,i;(i=a[j])!=null;j++){if(typeof i==="number")i+="";if(i){if(typeof i==="string"&&!jb.test(i))i=b.createTextNode(i);else if(typeof i==="string"){i=i.replace(Ka,Ma);var o=(La.exec(i)||["",
+""])[1].toLowerCase(),k=F[o]||F._default,n=k[0],r=b.createElement("div");for(r.innerHTML=k[1]+i+k[2];n--;)r=r.lastChild;if(!c.support.tbody){n=ib.test(i);o=o==="table"&&!n?r.firstChild&&r.firstChild.childNodes:k[1]==="<table>"&&!n?r.childNodes:[];for(k=o.length-1;k>=0;--k)c.nodeName(o[k],"tbody")&&!o[k].childNodes.length&&o[k].parentNode.removeChild(o[k])}!c.support.leadingWhitespace&&V.test(i)&&r.insertBefore(b.createTextNode(V.exec(i)[0]),r.firstChild);i=r.childNodes}if(i.nodeType)e.push(i);else e=
+c.merge(e,i)}}if(d)for(j=0;e[j];j++)if(f&&c.nodeName(e[j],"script")&&(!e[j].type||e[j].type.toLowerCase()==="text/javascript"))f.push(e[j].parentNode?e[j].parentNode.removeChild(e[j]):e[j]);else{e[j].nodeType===1&&e.splice.apply(e,[j+1,0].concat(c.makeArray(e[j].getElementsByTagName("script"))));d.appendChild(e[j])}return e},cleanData:function(a){for(var b,d,f=c.cache,e=c.event.special,j=c.support.deleteExpando,i=0,o;(o=a[i])!=null;i++)if(d=o[c.expando]){b=f[d];if(b.events)for(var k in b.events)e[k]?
+c.event.remove(o,k):Ca(o,k,b.handle);if(j)delete o[c.expando];else o.removeAttribute&&o.removeAttribute(c.expando);delete f[d]}}});var kb=/z-?index|font-?weight|opacity|zoom|line-?height/i,Na=/alpha\([^)]*\)/,Oa=/opacity=([^)]*)/,ha=/float/i,ia=/-([a-z])/ig,lb=/([A-Z])/g,mb=/^-?\d+(?:px)?$/i,nb=/^-?\d/,ob={position:"absolute",visibility:"hidden",display:"block"},pb=["Left","Right"],qb=["Top","Bottom"],rb=s.defaultView&&s.defaultView.getComputedStyle,Pa=c.support.cssFloat?"cssFloat":"styleFloat",ja=
+function(a,b){return b.toUpperCase()};c.fn.css=function(a,b){return X(this,a,b,true,function(d,f,e){if(e===w)return c.curCSS(d,f);if(typeof e==="number"&&!kb.test(f))e+="px";c.style(d,f,e)})};c.extend({style:function(a,b,d){if(!a||a.nodeType===3||a.nodeType===8)return w;if((b==="width"||b==="height")&&parseFloat(d)<0)d=w;var f=a.style||a,e=d!==w;if(!c.support.opacity&&b==="opacity"){if(e){f.zoom=1;b=parseInt(d,10)+""==="NaN"?"":"alpha(opacity="+d*100+")";a=f.filter||c.curCSS(a,"filter")||"";f.filter=
+Na.test(a)?a.replace(Na,b):b}return f.filter&&f.filter.indexOf("opacity=")>=0?parseFloat(Oa.exec(f.filter)[1])/100+"":""}if(ha.test(b))b=Pa;b=b.replace(ia,ja);if(e)f[b]=d;return f[b]},css:function(a,b,d,f){if(b==="width"||b==="height"){var e,j=b==="width"?pb:qb;function i(){e=b==="width"?a.offsetWidth:a.offsetHeight;f!=="border"&&c.each(j,function(){f||(e-=parseFloat(c.curCSS(a,"padding"+this,true))||0);if(f==="margin")e+=parseFloat(c.curCSS(a,"margin"+this,true))||0;else e-=parseFloat(c.curCSS(a,
+"border"+this+"Width",true))||0})}a.offsetWidth!==0?i():c.swap(a,ob,i);return Math.max(0,Math.round(e))}return c.curCSS(a,b,d)},curCSS:function(a,b,d){var f,e=a.style;if(!c.support.opacity&&b==="opacity"&&a.currentStyle){f=Oa.test(a.currentStyle.filter||"")?parseFloat(RegExp.$1)/100+"":"";return f===""?"1":f}if(ha.test(b))b=Pa;if(!d&&e&&e[b])f=e[b];else if(rb){if(ha.test(b))b="float";b=b.replace(lb,"-$1").toLowerCase();e=a.ownerDocument.defaultView;if(!e)return null;if(a=e.getComputedStyle(a,null))f=
+a.getPropertyValue(b);if(b==="opacity"&&f==="")f="1"}else if(a.currentStyle){d=b.replace(ia,ja);f=a.currentStyle[b]||a.currentStyle[d];if(!mb.test(f)&&nb.test(f)){b=e.left;var j=a.runtimeStyle.left;a.runtimeStyle.left=a.currentStyle.left;e.left=d==="fontSize"?"1em":f||0;f=e.pixelLeft+"px";e.left=b;a.runtimeStyle.left=j}}return f},swap:function(a,b,d){var f={};for(var e in b){f[e]=a.style[e];a.style[e]=b[e]}d.call(a);for(e in b)a.style[e]=f[e]}});if(c.expr&&c.expr.filters){c.expr.filters.hidden=function(a){var b=
+a.offsetWidth,d=a.offsetHeight,f=a.nodeName.toLowerCase()==="tr";return b===0&&d===0&&!f?true:b>0&&d>0&&!f?false:c.curCSS(a,"display")==="none"};c.expr.filters.visible=function(a){return!c.expr.filters.hidden(a)}}var sb=J(),tb=/<script(.|\s)*?\/script>/gi,ub=/select|textarea/i,vb=/color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week/i,N=/=\?(&|$)/,ka=/\?/,wb=/(\?|&)_=.*?(&|$)/,xb=/^(\w+:)?\/\/([^\/?#]+)/,yb=/%20/g,zb=c.fn.load;c.fn.extend({load:function(a,b,d){if(typeof a!==
+"string")return zb.call(this,a);else if(!this.length)return this;var f=a.indexOf(" ");if(f>=0){var e=a.slice(f,a.length);a=a.slice(0,f)}f="GET";if(b)if(c.isFunction(b)){d=b;b=null}else if(typeof b==="object"){b=c.param(b,c.ajaxSettings.traditional);f="POST"}var j=this;c.ajax({url:a,type:f,dataType:"html",data:b,complete:function(i,o){if(o==="success"||o==="notmodified")j.html(e?c("<div />").append(i.responseText.replace(tb,"")).find(e):i.responseText);d&&j.each(d,[i.responseText,o,i])}});return this},
+serialize:function(){return c.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?c.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||ub.test(this.nodeName)||vb.test(this.type))}).map(function(a,b){a=c(this).val();return a==null?null:c.isArray(a)?c.map(a,function(d){return{name:b.name,value:d}}):{name:b.name,value:a}}).get()}});c.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),
+function(a,b){c.fn[b]=function(d){return this.bind(b,d)}});c.extend({get:function(a,b,d,f){if(c.isFunction(b)){f=f||d;d=b;b=null}return c.ajax({type:"GET",url:a,data:b,success:d,dataType:f})},getScript:function(a,b){return c.get(a,null,b,"script")},getJSON:function(a,b,d){return c.get(a,b,d,"json")},post:function(a,b,d,f){if(c.isFunction(b)){f=f||d;d=b;b={}}return c.ajax({type:"POST",url:a,data:b,success:d,dataType:f})},ajaxSetup:function(a){c.extend(c.ajaxSettings,a)},ajaxSettings:{url:location.href,
+global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,xhr:A.XMLHttpRequest&&(A.location.protocol!=="file:"||!A.ActiveXObject)?function(){return new A.XMLHttpRequest}:function(){try{return new A.ActiveXObject("Microsoft.XMLHTTP")}catch(a){}},accepts:{xml:"application/xml, text/xml",html:"text/html",script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},lastModified:{},etag:{},ajax:function(a){function b(){e.success&&
+e.success.call(k,o,i,x);e.global&&f("ajaxSuccess",[x,e])}function d(){e.complete&&e.complete.call(k,x,i);e.global&&f("ajaxComplete",[x,e]);e.global&&!--c.active&&c.event.trigger("ajaxStop")}function f(q,p){(e.context?c(e.context):c.event).trigger(q,p)}var e=c.extend(true,{},c.ajaxSettings,a),j,i,o,k=a&&a.context||e,n=e.type.toUpperCase();if(e.data&&e.processData&&typeof e.data!=="string")e.data=c.param(e.data,e.traditional);if(e.dataType==="jsonp"){if(n==="GET")N.test(e.url)||(e.url+=(ka.test(e.url)?
+"&":"?")+(e.jsonp||"callback")+"=?");else if(!e.data||!N.test(e.data))e.data=(e.data?e.data+"&":"")+(e.jsonp||"callback")+"=?";e.dataType="json"}if(e.dataType==="json"&&(e.data&&N.test(e.data)||N.test(e.url))){j=e.jsonpCallback||"jsonp"+sb++;if(e.data)e.data=(e.data+"").replace(N,"="+j+"$1");e.url=e.url.replace(N,"="+j+"$1");e.dataType="script";A[j]=A[j]||function(q){o=q;b();d();A[j]=w;try{delete A[j]}catch(p){}z&&z.removeChild(C)}}if(e.dataType==="script"&&e.cache===null)e.cache=false;if(e.cache===
+false&&n==="GET"){var r=J(),u=e.url.replace(wb,"$1_="+r+"$2");e.url=u+(u===e.url?(ka.test(e.url)?"&":"?")+"_="+r:"")}if(e.data&&n==="GET")e.url+=(ka.test(e.url)?"&":"?")+e.data;e.global&&!c.active++&&c.event.trigger("ajaxStart");r=(r=xb.exec(e.url))&&(r[1]&&r[1]!==location.protocol||r[2]!==location.host);if(e.dataType==="script"&&n==="GET"&&r){var z=s.getElementsByTagName("head")[0]||s.documentElement,C=s.createElement("script");C.src=e.url;if(e.scriptCharset)C.charset=e.scriptCharset;if(!j){var B=
+false;C.onload=C.onreadystatechange=function(){if(!B&&(!this.readyState||this.readyState==="loaded"||this.readyState==="complete")){B=true;b();d();C.onload=C.onreadystatechange=null;z&&C.parentNode&&z.removeChild(C)}}}z.insertBefore(C,z.firstChild);return w}var E=false,x=e.xhr();if(x){e.username?x.open(n,e.url,e.async,e.username,e.password):x.open(n,e.url,e.async);try{if(e.data||a&&a.contentType)x.setRequestHeader("Content-Type",e.contentType);if(e.ifModified){c.lastModified[e.url]&&x.setRequestHeader("If-Modified-Since",
+c.lastModified[e.url]);c.etag[e.url]&&x.setRequestHeader("If-None-Match",c.etag[e.url])}r||x.setRequestHeader("X-Requested-With","XMLHttpRequest");x.setRequestHeader("Accept",e.dataType&&e.accepts[e.dataType]?e.accepts[e.dataType]+", */*":e.accepts._default)}catch(ga){}if(e.beforeSend&&e.beforeSend.call(k,x,e)===false){e.global&&!--c.active&&c.event.trigger("ajaxStop");x.abort();return false}e.global&&f("ajaxSend",[x,e]);var g=x.onreadystatechange=function(q){if(!x||x.readyState===0||q==="abort"){E||
+d();E=true;if(x)x.onreadystatechange=c.noop}else if(!E&&x&&(x.readyState===4||q==="timeout")){E=true;x.onreadystatechange=c.noop;i=q==="timeout"?"timeout":!c.httpSuccess(x)?"error":e.ifModified&&c.httpNotModified(x,e.url)?"notmodified":"success";var p;if(i==="success")try{o=c.httpData(x,e.dataType,e)}catch(v){i="parsererror";p=v}if(i==="success"||i==="notmodified")j||b();else c.handleError(e,x,i,p);d();q==="timeout"&&x.abort();if(e.async)x=null}};try{var h=x.abort;x.abort=function(){x&&h.call(x);
+g("abort")}}catch(l){}e.async&&e.timeout>0&&setTimeout(function(){x&&!E&&g("timeout")},e.timeout);try{x.send(n==="POST"||n==="PUT"||n==="DELETE"?e.data:null)}catch(m){c.handleError(e,x,null,m);d()}e.async||g();return x}},handleError:function(a,b,d,f){if(a.error)a.error.call(a.context||a,b,d,f);if(a.global)(a.context?c(a.context):c.event).trigger("ajaxError",[b,a,f])},active:0,httpSuccess:function(a){try{return!a.status&&location.protocol==="file:"||a.status>=200&&a.status<300||a.status===304||a.status===
+1223||a.status===0}catch(b){}return false},httpNotModified:function(a,b){var d=a.getResponseHeader("Last-Modified"),f=a.getResponseHeader("Etag");if(d)c.lastModified[b]=d;if(f)c.etag[b]=f;return a.status===304||a.status===0},httpData:function(a,b,d){var f=a.getResponseHeader("content-type")||"",e=b==="xml"||!b&&f.indexOf("xml")>=0;a=e?a.responseXML:a.responseText;e&&a.documentElement.nodeName==="parsererror"&&c.error("parsererror");if(d&&d.dataFilter)a=d.dataFilter(a,b);if(typeof a==="string")if(b===
+"json"||!b&&f.indexOf("json")>=0)a=c.parseJSON(a);else if(b==="script"||!b&&f.indexOf("javascript")>=0)c.globalEval(a);return a},param:function(a,b){function d(i,o){if(c.isArray(o))c.each(o,function(k,n){b||/\[\]$/.test(i)?f(i,n):d(i+"["+(typeof n==="object"||c.isArray(n)?k:"")+"]",n)});else!b&&o!=null&&typeof o==="object"?c.each(o,function(k,n){d(i+"["+k+"]",n)}):f(i,o)}function f(i,o){o=c.isFunction(o)?o():o;e[e.length]=encodeURIComponent(i)+"="+encodeURIComponent(o)}var e=[];if(b===w)b=c.ajaxSettings.traditional;
+if(c.isArray(a)||a.jquery)c.each(a,function(){f(this.name,this.value)});else for(var j in a)d(j,a[j]);return e.join("&").replace(yb,"+")}});var la={},Ab=/toggle|show|hide/,Bb=/^([+-]=)?([\d+-.]+)(.*)$/,W,va=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];c.fn.extend({show:function(a,b){if(a||a===0)return this.animate(K("show",3),a,b);else{a=0;for(b=this.length;a<b;a++){var d=c.data(this[a],"olddisplay");
+this[a].style.display=d||"";if(c.css(this[a],"display")==="none"){d=this[a].nodeName;var f;if(la[d])f=la[d];else{var e=c("<"+d+" />").appendTo("body");f=e.css("display");if(f==="none")f="block";e.remove();la[d]=f}c.data(this[a],"olddisplay",f)}}a=0;for(b=this.length;a<b;a++)this[a].style.display=c.data(this[a],"olddisplay")||"";return this}},hide:function(a,b){if(a||a===0)return this.animate(K("hide",3),a,b);else{a=0;for(b=this.length;a<b;a++){var d=c.data(this[a],"olddisplay");!d&&d!=="none"&&c.data(this[a],
+"olddisplay",c.css(this[a],"display"))}a=0;for(b=this.length;a<b;a++)this[a].style.display="none";return this}},_toggle:c.fn.toggle,toggle:function(a,b){var d=typeof a==="boolean";if(c.isFunction(a)&&c.isFunction(b))this._toggle.apply(this,arguments);else a==null||d?this.each(function(){var f=d?a:c(this).is(":hidden");c(this)[f?"show":"hide"]()}):this.animate(K("toggle",3),a,b);return this},fadeTo:function(a,b,d){return this.filter(":hidden").css("opacity",0).show().end().animate({opacity:b},a,d)},
+animate:function(a,b,d,f){var e=c.speed(b,d,f);if(c.isEmptyObject(a))return this.each(e.complete);return this[e.queue===false?"each":"queue"](function(){var j=c.extend({},e),i,o=this.nodeType===1&&c(this).is(":hidden"),k=this;for(i in a){var n=i.replace(ia,ja);if(i!==n){a[n]=a[i];delete a[i];i=n}if(a[i]==="hide"&&o||a[i]==="show"&&!o)return j.complete.call(this);if((i==="height"||i==="width")&&this.style){j.display=c.css(this,"display");j.overflow=this.style.overflow}if(c.isArray(a[i])){(j.specialEasing=
+j.specialEasing||{})[i]=a[i][1];a[i]=a[i][0]}}if(j.overflow!=null)this.style.overflow="hidden";j.curAnim=c.extend({},a);c.each(a,function(r,u){var z=new c.fx(k,j,r);if(Ab.test(u))z[u==="toggle"?o?"show":"hide":u](a);else{var C=Bb.exec(u),B=z.cur(true)||0;if(C){u=parseFloat(C[2]);var E=C[3]||"px";if(E!=="px"){k.style[r]=(u||1)+E;B=(u||1)/z.cur(true)*B;k.style[r]=B+E}if(C[1])u=(C[1]==="-="?-1:1)*u+B;z.custom(B,u,E)}else z.custom(B,u,"")}});return true})},stop:function(a,b){var d=c.timers;a&&this.queue([]);
+this.each(function(){for(var f=d.length-1;f>=0;f--)if(d[f].elem===this){b&&d[f](true);d.splice(f,1)}});b||this.dequeue();return this}});c.each({slideDown:K("show",1),slideUp:K("hide",1),slideToggle:K("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"}},function(a,b){c.fn[a]=function(d,f){return this.animate(b,d,f)}});c.extend({speed:function(a,b,d){var f=a&&typeof a==="object"?a:{complete:d||!d&&b||c.isFunction(a)&&a,duration:a,easing:d&&b||b&&!c.isFunction(b)&&b};f.duration=c.fx.off?0:typeof f.duration===
+"number"?f.duration:c.fx.speeds[f.duration]||c.fx.speeds._default;f.old=f.complete;f.complete=function(){f.queue!==false&&c(this).dequeue();c.isFunction(f.old)&&f.old.call(this)};return f},easing:{linear:function(a,b,d,f){return d+f*a},swing:function(a,b,d,f){return(-Math.cos(a*Math.PI)/2+0.5)*f+d}},timers:[],fx:function(a,b,d){this.options=b;this.elem=a;this.prop=d;if(!b.orig)b.orig={}}});c.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this);(c.fx.step[this.prop]||
+c.fx.step._default)(this);if((this.prop==="height"||this.prop==="width")&&this.elem.style)this.elem.style.display="block"},cur:function(a){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null))return this.elem[this.prop];return(a=parseFloat(c.css(this.elem,this.prop,a)))&&a>-10000?a:parseFloat(c.curCSS(this.elem,this.prop))||0},custom:function(a,b,d){function f(j){return e.step(j)}this.startTime=J();this.start=a;this.end=b;this.unit=d||this.unit||"px";this.now=this.start;
+this.pos=this.state=0;var e=this;f.elem=this.elem;if(f()&&c.timers.push(f)&&!W)W=setInterval(c.fx.tick,13)},show:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.show=true;this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur());c(this.elem).show()},hide:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.hide=true;this.custom(this.cur(),0)},step:function(a){var b=J(),d=true;if(a||b>=this.options.duration+this.startTime){this.now=
+this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;for(var f in this.options.curAnim)if(this.options.curAnim[f]!==true)d=false;if(d){if(this.options.display!=null){this.elem.style.overflow=this.options.overflow;a=c.data(this.elem,"olddisplay");this.elem.style.display=a?a:this.options.display;if(c.css(this.elem,"display")==="none")this.elem.style.display="block"}this.options.hide&&c(this.elem).hide();if(this.options.hide||this.options.show)for(var e in this.options.curAnim)c.style(this.elem,
+e,this.options.orig[e]);this.options.complete.call(this.elem)}return false}else{e=b-this.startTime;this.state=e/this.options.duration;a=this.options.easing||(c.easing.swing?"swing":"linear");this.pos=c.easing[this.options.specialEasing&&this.options.specialEasing[this.prop]||a](this.state,e,0,1,this.options.duration);this.now=this.start+(this.end-this.start)*this.pos;this.update()}return true}};c.extend(c.fx,{tick:function(){for(var a=c.timers,b=0;b<a.length;b++)a[b]()||a.splice(b--,1);a.length||
+c.fx.stop()},stop:function(){clearInterval(W);W=null},speeds:{slow:600,fast:200,_default:400},step:{opacity:function(a){c.style(a.elem,"opacity",a.now)},_default:function(a){if(a.elem.style&&a.elem.style[a.prop]!=null)a.elem.style[a.prop]=(a.prop==="width"||a.prop==="height"?Math.max(0,a.now):a.now)+a.unit;else a.elem[a.prop]=a.now}}});if(c.expr&&c.expr.filters)c.expr.filters.animated=function(a){return c.grep(c.timers,function(b){return a===b.elem}).length};c.fn.offset="getBoundingClientRect"in s.documentElement?
+function(a){var b=this[0];if(a)return this.each(function(e){c.offset.setOffset(this,a,e)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return c.offset.bodyOffset(b);var d=b.getBoundingClientRect(),f=b.ownerDocument;b=f.body;f=f.documentElement;return{top:d.top+(self.pageYOffset||c.support.boxModel&&f.scrollTop||b.scrollTop)-(f.clientTop||b.clientTop||0),left:d.left+(self.pageXOffset||c.support.boxModel&&f.scrollLeft||b.scrollLeft)-(f.clientLeft||b.clientLeft||0)}}:function(a){var b=
+this[0];if(a)return this.each(function(r){c.offset.setOffset(this,a,r)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return c.offset.bodyOffset(b);c.offset.initialize();var d=b.offsetParent,f=b,e=b.ownerDocument,j,i=e.documentElement,o=e.body;f=(e=e.defaultView)?e.getComputedStyle(b,null):b.currentStyle;for(var k=b.offsetTop,n=b.offsetLeft;(b=b.parentNode)&&b!==o&&b!==i;){if(c.offset.supportsFixedPosition&&f.position==="fixed")break;j=e?e.getComputedStyle(b,null):b.currentStyle;
+k-=b.scrollTop;n-=b.scrollLeft;if(b===d){k+=b.offsetTop;n+=b.offsetLeft;if(c.offset.doesNotAddBorder&&!(c.offset.doesAddBorderForTableAndCells&&/^t(able|d|h)$/i.test(b.nodeName))){k+=parseFloat(j.borderTopWidth)||0;n+=parseFloat(j.borderLeftWidth)||0}f=d;d=b.offsetParent}if(c.offset.subtractsBorderForOverflowNotVisible&&j.overflow!=="visible"){k+=parseFloat(j.borderTopWidth)||0;n+=parseFloat(j.borderLeftWidth)||0}f=j}if(f.position==="relative"||f.position==="static"){k+=o.offsetTop;n+=o.offsetLeft}if(c.offset.supportsFixedPosition&&
+f.position==="fixed"){k+=Math.max(i.scrollTop,o.scrollTop);n+=Math.max(i.scrollLeft,o.scrollLeft)}return{top:k,left:n}};c.offset={initialize:function(){var a=s.body,b=s.createElement("div"),d,f,e,j=parseFloat(c.curCSS(a,"marginTop",true))||0;c.extend(b.style,{position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"});b.innerHTML="<div style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;'><div></div></div><table style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;' cellpadding='0' cellspacing='0'><tr><td></td></tr></table>";
+a.insertBefore(b,a.firstChild);d=b.firstChild;f=d.firstChild;e=d.nextSibling.firstChild.firstChild;this.doesNotAddBorder=f.offsetTop!==5;this.doesAddBorderForTableAndCells=e.offsetTop===5;f.style.position="fixed";f.style.top="20px";this.supportsFixedPosition=f.offsetTop===20||f.offsetTop===15;f.style.position=f.style.top="";d.style.overflow="hidden";d.style.position="relative";this.subtractsBorderForOverflowNotVisible=f.offsetTop===-5;this.doesNotIncludeMarginInBodyOffset=a.offsetTop!==j;a.removeChild(b);
+c.offset.initialize=c.noop},bodyOffset:function(a){var b=a.offsetTop,d=a.offsetLeft;c.offset.initialize();if(c.offset.doesNotIncludeMarginInBodyOffset){b+=parseFloat(c.curCSS(a,"marginTop",true))||0;d+=parseFloat(c.curCSS(a,"marginLeft",true))||0}return{top:b,left:d}},setOffset:function(a,b,d){if(/static/.test(c.curCSS(a,"position")))a.style.position="relative";var f=c(a),e=f.offset(),j=parseInt(c.curCSS(a,"top",true),10)||0,i=parseInt(c.curCSS(a,"left",true),10)||0;if(c.isFunction(b))b=b.call(a,
+d,e);d={top:b.top-e.top+j,left:b.left-e.left+i};"using"in b?b.using.call(a,d):f.css(d)}};c.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),d=this.offset(),f=/^body|html$/i.test(b[0].nodeName)?{top:0,left:0}:b.offset();d.top-=parseFloat(c.curCSS(a,"marginTop",true))||0;d.left-=parseFloat(c.curCSS(a,"marginLeft",true))||0;f.top+=parseFloat(c.curCSS(b[0],"borderTopWidth",true))||0;f.left+=parseFloat(c.curCSS(b[0],"borderLeftWidth",true))||0;return{top:d.top-
+f.top,left:d.left-f.left}},offsetParent:function(){return this.map(function(){for(var a=this.offsetParent||s.body;a&&!/^body|html$/i.test(a.nodeName)&&c.css(a,"position")==="static";)a=a.offsetParent;return a})}});c.each(["Left","Top"],function(a,b){var d="scroll"+b;c.fn[d]=function(f){var e=this[0],j;if(!e)return null;if(f!==w)return this.each(function(){if(j=wa(this))j.scrollTo(!a?f:c(j).scrollLeft(),a?f:c(j).scrollTop());else this[d]=f});else return(j=wa(e))?"pageXOffset"in j?j[a?"pageYOffset":
+"pageXOffset"]:c.support.boxModel&&j.document.documentElement[d]||j.document.body[d]:e[d]}});c.each(["Height","Width"],function(a,b){var d=b.toLowerCase();c.fn["inner"+b]=function(){return this[0]?c.css(this[0],d,false,"padding"):null};c.fn["outer"+b]=function(f){return this[0]?c.css(this[0],d,false,f?"margin":"border"):null};c.fn[d]=function(f){var e=this[0];if(!e)return f==null?null:this;if(c.isFunction(f))return this.each(function(j){var i=c(this);i[d](f.call(this,j,i[d]()))});return"scrollTo"in
+e&&e.document?e.document.compatMode==="CSS1Compat"&&e.document.documentElement["client"+b]||e.document.body["client"+b]:e.nodeType===9?Math.max(e.documentElement["client"+b],e.body["scroll"+b],e.documentElement["scroll"+b],e.body["offset"+b],e.documentElement["offset"+b]):f===w?c.css(e,d):this.css(d,typeof f==="string"?f:f+"px")}});A.jQuery=A.$=c})(window);
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/docs/common/jquery/jquery-ui-1.8.2.custom.min.js b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/docs/common/jquery/jquery-ui-1.8.2.custom.min.js
new file mode 100644
index 0000000..fec53e8
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/docs/common/jquery/jquery-ui-1.8.2.custom.min.js
@@ -0,0 +1,321 @@
+/*!
+ * jQuery UI 1.8.2
+ *
+ * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT (MIT-LICENSE.txt)
+ * and GPL (GPL-LICENSE.txt) licenses.
+ *
+ * http://docs.jquery.com/UI
+ */
+(function(c){c.ui=c.ui||{};if(!c.ui.version){c.extend(c.ui,{version:"1.8.2",plugin:{add:function(a,b,d){a=c.ui[a].prototype;for(var e in d){a.plugins[e]=a.plugins[e]||[];a.plugins[e].push([b,d[e]])}},call:function(a,b,d){if((b=a.plugins[b])&&a.element[0].parentNode)for(var e=0;e<b.length;e++)a.options[b[e][0]]&&b[e][1].apply(a.element,d)}},contains:function(a,b){return document.compareDocumentPosition?a.compareDocumentPosition(b)&16:a!==b&&a.contains(b)},hasScroll:function(a,b){if(c(a).css("overflow")==
+"hidden")return false;b=b&&b=="left"?"scrollLeft":"scrollTop";var d=false;if(a[b]>0)return true;a[b]=1;d=a[b]>0;a[b]=0;return d},isOverAxis:function(a,b,d){return a>b&&a<b+d},isOver:function(a,b,d,e,f,g){return c.ui.isOverAxis(a,d,f)&&c.ui.isOverAxis(b,e,g)},keyCode:{ALT:18,BACKSPACE:8,CAPS_LOCK:20,COMMA:188,COMMAND:91,COMMAND_LEFT:91,COMMAND_RIGHT:93,CONTROL:17,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,INSERT:45,LEFT:37,MENU:93,NUMPAD_ADD:107,NUMPAD_DECIMAL:110,NUMPAD_DIVIDE:111,NUMPAD_ENTER:108,
+NUMPAD_MULTIPLY:106,NUMPAD_SUBTRACT:109,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SHIFT:16,SPACE:32,TAB:9,UP:38,WINDOWS:91}});c.fn.extend({_focus:c.fn.focus,focus:function(a,b){return typeof a==="number"?this.each(function(){var d=this;setTimeout(function(){c(d).focus();b&&b.call(d)},a)}):this._focus.apply(this,arguments)},enableSelection:function(){return this.attr("unselectable","off").css("MozUserSelect","")},disableSelection:function(){return this.attr("unselectable","on").css("MozUserSelect",
+"none")},scrollParent:function(){var a;a=c.browser.msie&&/(static|relative)/.test(this.css("position"))||/absolute/.test(this.css("position"))?this.parents().filter(function(){return/(relative|absolute|fixed)/.test(c.curCSS(this,"position",1))&&/(auto|scroll)/.test(c.curCSS(this,"overflow",1)+c.curCSS(this,"overflow-y",1)+c.curCSS(this,"overflow-x",1))}).eq(0):this.parents().filter(function(){return/(auto|scroll)/.test(c.curCSS(this,"overflow",1)+c.curCSS(this,"overflow-y",1)+c.curCSS(this,"overflow-x",
+1))}).eq(0);return/fixed/.test(this.css("position"))||!a.length?c(document):a},zIndex:function(a){if(a!==undefined)return this.css("zIndex",a);if(this.length){a=c(this[0]);for(var b;a.length&&a[0]!==document;){b=a.css("position");if(b=="absolute"||b=="relative"||b=="fixed"){b=parseInt(a.css("zIndex"));if(!isNaN(b)&&b!=0)return b}a=a.parent()}}return 0}});c.extend(c.expr[":"],{data:function(a,b,d){return!!c.data(a,d[3])},focusable:function(a){var b=a.nodeName.toLowerCase(),d=c.attr(a,"tabindex");return(/input|select|textarea|button|object/.test(b)?
+!a.disabled:"a"==b||"area"==b?a.href||!isNaN(d):!isNaN(d))&&!c(a)["area"==b?"parents":"closest"](":hidden").length},tabbable:function(a){var b=c.attr(a,"tabindex");return(isNaN(b)||b>=0)&&c(a).is(":focusable")}})}})(jQuery);
+;/*!
+ * jQuery UI Widget 1.8.2
+ *
+ * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT (MIT-LICENSE.txt)
+ * and GPL (GPL-LICENSE.txt) licenses.
+ *
+ * http://docs.jquery.com/UI/Widget
+ */
+(function(b){var j=b.fn.remove;b.fn.remove=function(a,c){return this.each(function(){if(!c)if(!a||b.filter(a,[this]).length)b("*",this).add(this).each(function(){b(this).triggerHandler("remove")});return j.call(b(this),a,c)})};b.widget=function(a,c,d){var e=a.split(".")[0],f;a=a.split(".")[1];f=e+"-"+a;if(!d){d=c;c=b.Widget}b.expr[":"][f]=function(h){return!!b.data(h,a)};b[e]=b[e]||{};b[e][a]=function(h,g){arguments.length&&this._createWidget(h,g)};c=new c;c.options=b.extend({},c.options);b[e][a].prototype=
+b.extend(true,c,{namespace:e,widgetName:a,widgetEventPrefix:b[e][a].prototype.widgetEventPrefix||a,widgetBaseClass:f},d);b.widget.bridge(a,b[e][a])};b.widget.bridge=function(a,c){b.fn[a]=function(d){var e=typeof d==="string",f=Array.prototype.slice.call(arguments,1),h=this;d=!e&&f.length?b.extend.apply(null,[true,d].concat(f)):d;if(e&&d.substring(0,1)==="_")return h;e?this.each(function(){var g=b.data(this,a),i=g&&b.isFunction(g[d])?g[d].apply(g,f):g;if(i!==g&&i!==undefined){h=i;return false}}):this.each(function(){var g=
+b.data(this,a);if(g){d&&g.option(d);g._init()}else b.data(this,a,new c(d,this))});return h}};b.Widget=function(a,c){arguments.length&&this._createWidget(a,c)};b.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",options:{disabled:false},_createWidget:function(a,c){this.element=b(c).data(this.widgetName,this);this.options=b.extend(true,{},this.options,b.metadata&&b.metadata.get(c)[this.widgetName],a);var d=this;this.element.bind("remove."+this.widgetName,function(){d.destroy()});this._create();
+this._init()},_create:function(){},_init:function(){},destroy:function(){this.element.unbind("."+this.widgetName).removeData(this.widgetName);this.widget().unbind("."+this.widgetName).removeAttr("aria-disabled").removeClass(this.widgetBaseClass+"-disabled ui-state-disabled")},widget:function(){return this.element},option:function(a,c){var d=a,e=this;if(arguments.length===0)return b.extend({},e.options);if(typeof a==="string"){if(c===undefined)return this.options[a];d={};d[a]=c}b.each(d,function(f,
+h){e._setOption(f,h)});return e},_setOption:function(a,c){this.options[a]=c;if(a==="disabled")this.widget()[c?"addClass":"removeClass"](this.widgetBaseClass+"-disabled ui-state-disabled").attr("aria-disabled",c);return this},enable:function(){return this._setOption("disabled",false)},disable:function(){return this._setOption("disabled",true)},_trigger:function(a,c,d){var e=this.options[a];c=b.Event(c);c.type=(a===this.widgetEventPrefix?a:this.widgetEventPrefix+a).toLowerCase();d=d||{};if(c.originalEvent){a=
+b.event.props.length;for(var f;a;){f=b.event.props[--a];c[f]=c.originalEvent[f]}}this.element.trigger(c,d);return!(b.isFunction(e)&&e.call(this.element[0],c,d)===false||c.isDefaultPrevented())}}})(jQuery);
+;/*!
+ * jQuery UI Mouse 1.8.2
+ *
+ * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT (MIT-LICENSE.txt)
+ * and GPL (GPL-LICENSE.txt) licenses.
+ *
+ * http://docs.jquery.com/UI/Mouse
+ *
+ * Depends:
+ * jquery.ui.widget.js
+ */
+(function(c){c.widget("ui.mouse",{options:{cancel:":input,option",distance:1,delay:0},_mouseInit:function(){var a=this;this.element.bind("mousedown."+this.widgetName,function(b){return a._mouseDown(b)}).bind("click."+this.widgetName,function(b){if(a._preventClickEvent){a._preventClickEvent=false;b.stopImmediatePropagation();return false}});this.started=false},_mouseDestroy:function(){this.element.unbind("."+this.widgetName)},_mouseDown:function(a){a.originalEvent=a.originalEvent||{};if(!a.originalEvent.mouseHandled){this._mouseStarted&&
+this._mouseUp(a);this._mouseDownEvent=a;var b=this,e=a.which==1,f=typeof this.options.cancel=="string"?c(a.target).parents().add(a.target).filter(this.options.cancel).length:false;if(!e||f||!this._mouseCapture(a))return true;this.mouseDelayMet=!this.options.delay;if(!this.mouseDelayMet)this._mouseDelayTimer=setTimeout(function(){b.mouseDelayMet=true},this.options.delay);if(this._mouseDistanceMet(a)&&this._mouseDelayMet(a)){this._mouseStarted=this._mouseStart(a)!==false;if(!this._mouseStarted){a.preventDefault();
+return true}}this._mouseMoveDelegate=function(d){return b._mouseMove(d)};this._mouseUpDelegate=function(d){return b._mouseUp(d)};c(document).bind("mousemove."+this.widgetName,this._mouseMoveDelegate).bind("mouseup."+this.widgetName,this._mouseUpDelegate);c.browser.safari||a.preventDefault();return a.originalEvent.mouseHandled=true}},_mouseMove:function(a){if(c.browser.msie&&!a.button)return this._mouseUp(a);if(this._mouseStarted){this._mouseDrag(a);return a.preventDefault()}if(this._mouseDistanceMet(a)&&
+this._mouseDelayMet(a))(this._mouseStarted=this._mouseStart(this._mouseDownEvent,a)!==false)?this._mouseDrag(a):this._mouseUp(a);return!this._mouseStarted},_mouseUp:function(a){c(document).unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate);if(this._mouseStarted){this._mouseStarted=false;this._preventClickEvent=a.target==this._mouseDownEvent.target;this._mouseStop(a)}return false},_mouseDistanceMet:function(a){return Math.max(Math.abs(this._mouseDownEvent.pageX-
+a.pageX),Math.abs(this._mouseDownEvent.pageY-a.pageY))>=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return true}})})(jQuery);
+;/*
+ * jQuery UI Position 1.8.2
+ *
+ * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT (MIT-LICENSE.txt)
+ * and GPL (GPL-LICENSE.txt) licenses.
+ *
+ * http://docs.jquery.com/UI/Position
+ */
+(function(c){c.ui=c.ui||{};var m=/left|center|right/,n=/top|center|bottom/,p=c.fn.position,q=c.fn.offset;c.fn.position=function(a){if(!a||!a.of)return p.apply(this,arguments);a=c.extend({},a);var b=c(a.of),d=(a.collision||"flip").split(" "),e=a.offset?a.offset.split(" "):[0,0],g,h,i;if(a.of.nodeType===9){g=b.width();h=b.height();i={top:0,left:0}}else if(a.of.scrollTo&&a.of.document){g=b.width();h=b.height();i={top:b.scrollTop(),left:b.scrollLeft()}}else if(a.of.preventDefault){a.at="left top";g=h=
+0;i={top:a.of.pageY,left:a.of.pageX}}else{g=b.outerWidth();h=b.outerHeight();i=b.offset()}c.each(["my","at"],function(){var f=(a[this]||"").split(" ");if(f.length===1)f=m.test(f[0])?f.concat(["center"]):n.test(f[0])?["center"].concat(f):["center","center"];f[0]=m.test(f[0])?f[0]:"center";f[1]=n.test(f[1])?f[1]:"center";a[this]=f});if(d.length===1)d[1]=d[0];e[0]=parseInt(e[0],10)||0;if(e.length===1)e[1]=e[0];e[1]=parseInt(e[1],10)||0;if(a.at[0]==="right")i.left+=g;else if(a.at[0]==="center")i.left+=
+g/2;if(a.at[1]==="bottom")i.top+=h;else if(a.at[1]==="center")i.top+=h/2;i.left+=e[0];i.top+=e[1];return this.each(function(){var f=c(this),k=f.outerWidth(),l=f.outerHeight(),j=c.extend({},i);if(a.my[0]==="right")j.left-=k;else if(a.my[0]==="center")j.left-=k/2;if(a.my[1]==="bottom")j.top-=l;else if(a.my[1]==="center")j.top-=l/2;j.left=parseInt(j.left);j.top=parseInt(j.top);c.each(["left","top"],function(o,r){c.ui.position[d[o]]&&c.ui.position[d[o]][r](j,{targetWidth:g,targetHeight:h,elemWidth:k,
+elemHeight:l,offset:e,my:a.my,at:a.at})});c.fn.bgiframe&&f.bgiframe();f.offset(c.extend(j,{using:a.using}))})};c.ui.position={fit:{left:function(a,b){var d=c(window);b=a.left+b.elemWidth-d.width()-d.scrollLeft();a.left=b>0?a.left-b:Math.max(0,a.left)},top:function(a,b){var d=c(window);b=a.top+b.elemHeight-d.height()-d.scrollTop();a.top=b>0?a.top-b:Math.max(0,a.top)}},flip:{left:function(a,b){if(b.at[0]!=="center"){var d=c(window);d=a.left+b.elemWidth-d.width()-d.scrollLeft();var e=b.my[0]==="left"?
+-b.elemWidth:b.my[0]==="right"?b.elemWidth:0,g=-2*b.offset[0];a.left+=a.left<0?e+b.targetWidth+g:d>0?e-b.targetWidth+g:0}},top:function(a,b){if(b.at[1]!=="center"){var d=c(window);d=a.top+b.elemHeight-d.height()-d.scrollTop();var e=b.my[1]==="top"?-b.elemHeight:b.my[1]==="bottom"?b.elemHeight:0,g=b.at[1]==="top"?b.targetHeight:-b.targetHeight,h=-2*b.offset[1];a.top+=a.top<0?e+b.targetHeight+h:d>0?e+g+h:0}}}};if(!c.offset.setOffset){c.offset.setOffset=function(a,b){if(/static/.test(c.curCSS(a,"position")))a.style.position=
+"relative";var d=c(a),e=d.offset(),g=parseInt(c.curCSS(a,"top",true),10)||0,h=parseInt(c.curCSS(a,"left",true),10)||0;e={top:b.top-e.top+g,left:b.left-e.left+h};"using"in b?b.using.call(a,e):d.css(e)};c.fn.offset=function(a){var b=this[0];if(!b||!b.ownerDocument)return null;if(a)return this.each(function(){c.offset.setOffset(this,a)});return q.call(this)}}})(jQuery);
+;/*
+ * jQuery UI Resizable 1.8.2
+ *
+ * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT (MIT-LICENSE.txt)
+ * and GPL (GPL-LICENSE.txt) licenses.
+ *
+ * http://docs.jquery.com/UI/Resizables
+ *
+ * Depends:
+ * jquery.ui.core.js
+ * jquery.ui.mouse.js
+ * jquery.ui.widget.js
+ */
+(function(d){d.widget("ui.resizable",d.ui.mouse,{widgetEventPrefix:"resize",options:{alsoResize:false,animate:false,animateDuration:"slow",animateEasing:"swing",aspectRatio:false,autoHide:false,containment:false,ghost:false,grid:false,handles:"e,s,se",helper:false,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:1E3},_create:function(){var b=this,a=this.options;this.element.addClass("ui-resizable");d.extend(this,{_aspectRatio:!!a.aspectRatio,aspectRatio:a.aspectRatio,originalElement:this.element,
+_proportionallyResizeElements:[],_helper:a.helper||a.ghost||a.animate?a.helper||"ui-resizable-helper":null});if(this.element[0].nodeName.match(/canvas|textarea|input|select|button|img/i)){/relative/.test(this.element.css("position"))&&d.browser.opera&&this.element.css({position:"relative",top:"auto",left:"auto"});this.element.wrap(d('<div class="ui-wrapper" style="overflow: hidden;"></div>').css({position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),
+top:this.element.css("top"),left:this.element.css("left")}));this.element=this.element.parent().data("resizable",this.element.data("resizable"));this.elementIsWrapper=true;this.element.css({marginLeft:this.originalElement.css("marginLeft"),marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom")});this.originalElement.css({marginLeft:0,marginTop:0,marginRight:0,marginBottom:0});this.originalResizeStyle=
+this.originalElement.css("resize");this.originalElement.css("resize","none");this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"}));this.originalElement.css({margin:this.originalElement.css("margin")});this._proportionallyResize()}this.handles=a.handles||(!d(".ui-resizable-handle",this.element).length?"e,s,se":{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",
+nw:".ui-resizable-nw"});if(this.handles.constructor==String){if(this.handles=="all")this.handles="n,e,s,w,se,sw,ne,nw";var c=this.handles.split(",");this.handles={};for(var e=0;e<c.length;e++){var g=d.trim(c[e]),f=d('<div class="ui-resizable-handle '+("ui-resizable-"+g)+'"></div>');/sw|se|ne|nw/.test(g)&&f.css({zIndex:++a.zIndex});"se"==g&&f.addClass("ui-icon ui-icon-gripsmall-diagonal-se");this.handles[g]=".ui-resizable-"+g;this.element.append(f)}}this._renderAxis=function(h){h=h||this.element;for(var i in this.handles){if(this.handles[i].constructor==
+String)this.handles[i]=d(this.handles[i],this.element).show();if(this.elementIsWrapper&&this.originalElement[0].nodeName.match(/textarea|input|select|button/i)){var j=d(this.handles[i],this.element),l=0;l=/sw|ne|nw|se|n|s/.test(i)?j.outerHeight():j.outerWidth();j=["padding",/ne|nw|n/.test(i)?"Top":/se|sw|s/.test(i)?"Bottom":/^e$/.test(i)?"Right":"Left"].join("");h.css(j,l);this._proportionallyResize()}d(this.handles[i])}};this._renderAxis(this.element);this._handles=d(".ui-resizable-handle",this.element).disableSelection();
+this._handles.mouseover(function(){if(!b.resizing){if(this.className)var h=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i);b.axis=h&&h[1]?h[1]:"se"}});if(a.autoHide){this._handles.hide();d(this.element).addClass("ui-resizable-autohide").hover(function(){d(this).removeClass("ui-resizable-autohide");b._handles.show()},function(){if(!b.resizing){d(this).addClass("ui-resizable-autohide");b._handles.hide()}})}this._mouseInit()},destroy:function(){this._mouseDestroy();var b=function(c){d(c).removeClass("ui-resizable ui-resizable-disabled ui-resizable-resizing").removeData("resizable").unbind(".resizable").find(".ui-resizable-handle").remove()};
+if(this.elementIsWrapper){b(this.element);var a=this.element;a.after(this.originalElement.css({position:a.css("position"),width:a.outerWidth(),height:a.outerHeight(),top:a.css("top"),left:a.css("left")})).remove()}this.originalElement.css("resize",this.originalResizeStyle);b(this.originalElement);return this},_mouseCapture:function(b){var a=false;for(var c in this.handles)if(d(this.handles[c])[0]==b.target)a=true;return!this.options.disabled&&a},_mouseStart:function(b){var a=this.options,c=this.element.position(),
+e=this.element;this.resizing=true;this.documentScroll={top:d(document).scrollTop(),left:d(document).scrollLeft()};if(e.is(".ui-draggable")||/absolute/.test(e.css("position")))e.css({position:"absolute",top:c.top,left:c.left});d.browser.opera&&/relative/.test(e.css("position"))&&e.css({position:"relative",top:"auto",left:"auto"});this._renderProxy();c=m(this.helper.css("left"));var g=m(this.helper.css("top"));if(a.containment){c+=d(a.containment).scrollLeft()||0;g+=d(a.containment).scrollTop()||0}this.offset=
+this.helper.offset();this.position={left:c,top:g};this.size=this._helper?{width:e.outerWidth(),height:e.outerHeight()}:{width:e.width(),height:e.height()};this.originalSize=this._helper?{width:e.outerWidth(),height:e.outerHeight()}:{width:e.width(),height:e.height()};this.originalPosition={left:c,top:g};this.sizeDiff={width:e.outerWidth()-e.width(),height:e.outerHeight()-e.height()};this.originalMousePosition={left:b.pageX,top:b.pageY};this.aspectRatio=typeof a.aspectRatio=="number"?a.aspectRatio:
+this.originalSize.width/this.originalSize.height||1;a=d(".ui-resizable-"+this.axis).css("cursor");d("body").css("cursor",a=="auto"?this.axis+"-resize":a);e.addClass("ui-resizable-resizing");this._propagate("start",b);return true},_mouseDrag:function(b){var a=this.helper,c=this.originalMousePosition,e=this._change[this.axis];if(!e)return false;c=e.apply(this,[b,b.pageX-c.left||0,b.pageY-c.top||0]);if(this._aspectRatio||b.shiftKey)c=this._updateRatio(c,b);c=this._respectSize(c,b);this._propagate("resize",
+b);a.css({top:this.position.top+"px",left:this.position.left+"px",width:this.size.width+"px",height:this.size.height+"px"});!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize();this._updateCache(c);this._trigger("resize",b,this.ui());return false},_mouseStop:function(b){this.resizing=false;var a=this.options,c=this;if(this._helper){var e=this._proportionallyResizeElements,g=e.length&&/textarea/i.test(e[0].nodeName);e=g&&d.ui.hasScroll(e[0],"left")?0:c.sizeDiff.height;
+g={width:c.size.width-(g?0:c.sizeDiff.width),height:c.size.height-e};e=parseInt(c.element.css("left"),10)+(c.position.left-c.originalPosition.left)||null;var f=parseInt(c.element.css("top"),10)+(c.position.top-c.originalPosition.top)||null;a.animate||this.element.css(d.extend(g,{top:f,left:e}));c.helper.height(c.size.height);c.helper.width(c.size.width);this._helper&&!a.animate&&this._proportionallyResize()}d("body").css("cursor","auto");this.element.removeClass("ui-resizable-resizing");this._propagate("stop",
+b);this._helper&&this.helper.remove();return false},_updateCache:function(b){this.offset=this.helper.offset();if(k(b.left))this.position.left=b.left;if(k(b.top))this.position.top=b.top;if(k(b.height))this.size.height=b.height;if(k(b.width))this.size.width=b.width},_updateRatio:function(b){var a=this.position,c=this.size,e=this.axis;if(b.height)b.width=c.height*this.aspectRatio;else if(b.width)b.height=c.width/this.aspectRatio;if(e=="sw"){b.left=a.left+(c.width-b.width);b.top=null}if(e=="nw"){b.top=
+a.top+(c.height-b.height);b.left=a.left+(c.width-b.width)}return b},_respectSize:function(b){var a=this.options,c=this.axis,e=k(b.width)&&a.maxWidth&&a.maxWidth<b.width,g=k(b.height)&&a.maxHeight&&a.maxHeight<b.height,f=k(b.width)&&a.minWidth&&a.minWidth>b.width,h=k(b.height)&&a.minHeight&&a.minHeight>b.height;if(f)b.width=a.minWidth;if(h)b.height=a.minHeight;if(e)b.width=a.maxWidth;if(g)b.height=a.maxHeight;var i=this.originalPosition.left+this.originalSize.width,j=this.position.top+this.size.height,
+l=/sw|nw|w/.test(c);c=/nw|ne|n/.test(c);if(f&&l)b.left=i-a.minWidth;if(e&&l)b.left=i-a.maxWidth;if(h&&c)b.top=j-a.minHeight;if(g&&c)b.top=j-a.maxHeight;if((a=!b.width&&!b.height)&&!b.left&&b.top)b.top=null;else if(a&&!b.top&&b.left)b.left=null;return b},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var b=this.helper||this.element,a=0;a<this._proportionallyResizeElements.length;a++){var c=this._proportionallyResizeElements[a];if(!this.borderDif){var e=[c.css("borderTopWidth"),
+c.css("borderRightWidth"),c.css("borderBottomWidth"),c.css("borderLeftWidth")],g=[c.css("paddingTop"),c.css("paddingRight"),c.css("paddingBottom"),c.css("paddingLeft")];this.borderDif=d.map(e,function(f,h){f=parseInt(f,10)||0;h=parseInt(g[h],10)||0;return f+h})}d.browser.msie&&(d(b).is(":hidden")||d(b).parents(":hidden").length)||c.css({height:b.height()-this.borderDif[0]-this.borderDif[2]||0,width:b.width()-this.borderDif[1]-this.borderDif[3]||0})}},_renderProxy:function(){var b=this.options;this.elementOffset=
+this.element.offset();if(this._helper){this.helper=this.helper||d('<div style="overflow:hidden;"></div>');var a=d.browser.msie&&d.browser.version<7,c=a?1:0;a=a?2:-1;this.helper.addClass(this._helper).css({width:this.element.outerWidth()+a,height:this.element.outerHeight()+a,position:"absolute",left:this.elementOffset.left-c+"px",top:this.elementOffset.top-c+"px",zIndex:++b.zIndex});this.helper.appendTo("body").disableSelection()}else this.helper=this.element},_change:{e:function(b,a){return{width:this.originalSize.width+
+a}},w:function(b,a){return{left:this.originalPosition.left+a,width:this.originalSize.width-a}},n:function(b,a,c){return{top:this.originalPosition.top+c,height:this.originalSize.height-c}},s:function(b,a,c){return{height:this.originalSize.height+c}},se:function(b,a,c){return d.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[b,a,c]))},sw:function(b,a,c){return d.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[b,a,c]))},ne:function(b,a,c){return d.extend(this._change.n.apply(this,
+arguments),this._change.e.apply(this,[b,a,c]))},nw:function(b,a,c){return d.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[b,a,c]))}},_propagate:function(b,a){d.ui.plugin.call(this,b,[a,this.ui()]);b!="resize"&&this._trigger(b,a,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}});d.extend(d.ui.resizable,
+{version:"1.8.2"});d.ui.plugin.add("resizable","alsoResize",{start:function(){var b=d(this).data("resizable").options,a=function(c){d(c).each(function(){d(this).data("resizable-alsoresize",{width:parseInt(d(this).width(),10),height:parseInt(d(this).height(),10),left:parseInt(d(this).css("left"),10),top:parseInt(d(this).css("top"),10)})})};if(typeof b.alsoResize=="object"&&!b.alsoResize.parentNode)if(b.alsoResize.length){b.alsoResize=b.alsoResize[0];a(b.alsoResize)}else d.each(b.alsoResize,function(c){a(c)});
+else a(b.alsoResize)},resize:function(){var b=d(this).data("resizable"),a=b.options,c=b.originalSize,e=b.originalPosition,g={height:b.size.height-c.height||0,width:b.size.width-c.width||0,top:b.position.top-e.top||0,left:b.position.left-e.left||0},f=function(h,i){d(h).each(function(){var j=d(this),l=d(this).data("resizable-alsoresize"),p={};d.each((i&&i.length?i:["width","height","top","left"])||["width","height","top","left"],function(n,o){if((n=(l[o]||0)+(g[o]||0))&&n>=0)p[o]=n||null});if(/relative/.test(j.css("position"))&&
+d.browser.opera){b._revertToRelativePosition=true;j.css({position:"absolute",top:"auto",left:"auto"})}j.css(p)})};typeof a.alsoResize=="object"&&!a.alsoResize.nodeType?d.each(a.alsoResize,function(h,i){f(h,i)}):f(a.alsoResize)},stop:function(){var b=d(this).data("resizable");if(b._revertToRelativePosition&&d.browser.opera){b._revertToRelativePosition=false;el.css({position:"relative"})}d(this).removeData("resizable-alsoresize-start")}});d.ui.plugin.add("resizable","animate",{stop:function(b){var a=
+d(this).data("resizable"),c=a.options,e=a._proportionallyResizeElements,g=e.length&&/textarea/i.test(e[0].nodeName),f=g&&d.ui.hasScroll(e[0],"left")?0:a.sizeDiff.height;g={width:a.size.width-(g?0:a.sizeDiff.width),height:a.size.height-f};f=parseInt(a.element.css("left"),10)+(a.position.left-a.originalPosition.left)||null;var h=parseInt(a.element.css("top"),10)+(a.position.top-a.originalPosition.top)||null;a.element.animate(d.extend(g,h&&f?{top:h,left:f}:{}),{duration:c.animateDuration,easing:c.animateEasing,
+step:function(){var i={width:parseInt(a.element.css("width"),10),height:parseInt(a.element.css("height"),10),top:parseInt(a.element.css("top"),10),left:parseInt(a.element.css("left"),10)};e&&e.length&&d(e[0]).css({width:i.width,height:i.height});a._updateCache(i);a._propagate("resize",b)}})}});d.ui.plugin.add("resizable","containment",{start:function(){var b=d(this).data("resizable"),a=b.element,c=b.options.containment;if(a=c instanceof d?c.get(0):/parent/.test(c)?a.parent().get(0):c){b.containerElement=
+d(a);if(/document/.test(c)||c==document){b.containerOffset={left:0,top:0};b.containerPosition={left:0,top:0};b.parentData={element:d(document),left:0,top:0,width:d(document).width(),height:d(document).height()||document.body.parentNode.scrollHeight}}else{var e=d(a),g=[];d(["Top","Right","Left","Bottom"]).each(function(i,j){g[i]=m(e.css("padding"+j))});b.containerOffset=e.offset();b.containerPosition=e.position();b.containerSize={height:e.innerHeight()-g[3],width:e.innerWidth()-g[1]};c=b.containerOffset;
+var f=b.containerSize.height,h=b.containerSize.width;h=d.ui.hasScroll(a,"left")?a.scrollWidth:h;f=d.ui.hasScroll(a)?a.scrollHeight:f;b.parentData={element:a,left:c.left,top:c.top,width:h,height:f}}}},resize:function(b){var a=d(this).data("resizable"),c=a.options,e=a.containerOffset,g=a.position;b=a._aspectRatio||b.shiftKey;var f={top:0,left:0},h=a.containerElement;if(h[0]!=document&&/static/.test(h.css("position")))f=e;if(g.left<(a._helper?e.left:0)){a.size.width+=a._helper?a.position.left-e.left:
+a.position.left-f.left;if(b)a.size.height=a.size.width/c.aspectRatio;a.position.left=c.helper?e.left:0}if(g.top<(a._helper?e.top:0)){a.size.height+=a._helper?a.position.top-e.top:a.position.top;if(b)a.size.width=a.size.height*c.aspectRatio;a.position.top=a._helper?e.top:0}a.offset.left=a.parentData.left+a.position.left;a.offset.top=a.parentData.top+a.position.top;c=Math.abs((a._helper?a.offset.left-f.left:a.offset.left-f.left)+a.sizeDiff.width);e=Math.abs((a._helper?a.offset.top-f.top:a.offset.top-
+e.top)+a.sizeDiff.height);g=a.containerElement.get(0)==a.element.parent().get(0);f=/relative|absolute/.test(a.containerElement.css("position"));if(g&&f)c-=a.parentData.left;if(c+a.size.width>=a.parentData.width){a.size.width=a.parentData.width-c;if(b)a.size.height=a.size.width/a.aspectRatio}if(e+a.size.height>=a.parentData.height){a.size.height=a.parentData.height-e;if(b)a.size.width=a.size.height*a.aspectRatio}},stop:function(){var b=d(this).data("resizable"),a=b.options,c=b.containerOffset,e=b.containerPosition,
+g=b.containerElement,f=d(b.helper),h=f.offset(),i=f.outerWidth()-b.sizeDiff.width;f=f.outerHeight()-b.sizeDiff.height;b._helper&&!a.animate&&/relative/.test(g.css("position"))&&d(this).css({left:h.left-e.left-c.left,width:i,height:f});b._helper&&!a.animate&&/static/.test(g.css("position"))&&d(this).css({left:h.left-e.left-c.left,width:i,height:f})}});d.ui.plugin.add("resizable","ghost",{start:function(){var b=d(this).data("resizable"),a=b.options,c=b.size;b.ghost=b.originalElement.clone();b.ghost.css({opacity:0.25,
+display:"block",position:"relative",height:c.height,width:c.width,margin:0,left:0,top:0}).addClass("ui-resizable-ghost").addClass(typeof a.ghost=="string"?a.ghost:"");b.ghost.appendTo(b.helper)},resize:function(){var b=d(this).data("resizable");b.ghost&&b.ghost.css({position:"relative",height:b.size.height,width:b.size.width})},stop:function(){var b=d(this).data("resizable");b.ghost&&b.helper&&b.helper.get(0).removeChild(b.ghost.get(0))}});d.ui.plugin.add("resizable","grid",{resize:function(){var b=
+d(this).data("resizable"),a=b.options,c=b.size,e=b.originalSize,g=b.originalPosition,f=b.axis;a.grid=typeof a.grid=="number"?[a.grid,a.grid]:a.grid;var h=Math.round((c.width-e.width)/(a.grid[0]||1))*(a.grid[0]||1);a=Math.round((c.height-e.height)/(a.grid[1]||1))*(a.grid[1]||1);if(/^(se|s|e)$/.test(f)){b.size.width=e.width+h;b.size.height=e.height+a}else if(/^(ne)$/.test(f)){b.size.width=e.width+h;b.size.height=e.height+a;b.position.top=g.top-a}else{if(/^(sw)$/.test(f)){b.size.width=e.width+h;b.size.height=
+e.height+a}else{b.size.width=e.width+h;b.size.height=e.height+a;b.position.top=g.top-a}b.position.left=g.left-h}}});var m=function(b){return parseInt(b,10)||0},k=function(b){return!isNaN(parseInt(b,10))}})(jQuery);
+;
+/*
+ * jQuery UI Selectable 1.8.2
+ *
+ * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT (MIT-LICENSE.txt)
+ * and GPL (GPL-LICENSE.txt) licenses.
+ *
+ * http://docs.jquery.com/UI/Selectables
+ *
+ * Depends:
+ * jquery.ui.core.js
+ * jquery.ui.mouse.js
+ * jquery.ui.widget.js
+ */
+(function(e){e.widget("ui.selectable",e.ui.mouse,{options:{appendTo:"body",autoRefresh:true,distance:0,filter:"*",tolerance:"touch"},_create:function(){var c=this;this.element.addClass("ui-selectable");this.dragged=false;var f;this.refresh=function(){f=e(c.options.filter,c.element[0]);f.each(function(){var d=e(this),b=d.offset();e.data(this,"selectable-item",{element:this,$element:d,left:b.left,top:b.top,right:b.left+d.outerWidth(),bottom:b.top+d.outerHeight(),startselected:false,selected:d.hasClass("ui-selected"),
+selecting:d.hasClass("ui-selecting"),unselecting:d.hasClass("ui-unselecting")})})};this.refresh();this.selectees=f.addClass("ui-selectee");this._mouseInit();this.helper=e("<div class='ui-selectable-helper'></div>")},destroy:function(){this.selectees.removeClass("ui-selectee").removeData("selectable-item");this.element.removeClass("ui-selectable ui-selectable-disabled").removeData("selectable").unbind(".selectable");this._mouseDestroy();return this},_mouseStart:function(c){var f=this;this.opos=[c.pageX,
+c.pageY];if(!this.options.disabled){var d=this.options;this.selectees=e(d.filter,this.element[0]);this._trigger("start",c);e(d.appendTo).append(this.helper);this.helper.css({"z-index":100,position:"absolute",left:c.clientX,top:c.clientY,width:0,height:0});d.autoRefresh&&this.refresh();this.selectees.filter(".ui-selected").each(function(){var b=e.data(this,"selectable-item");b.startselected=true;if(!c.metaKey){b.$element.removeClass("ui-selected");b.selected=false;b.$element.addClass("ui-unselecting");
+b.unselecting=true;f._trigger("unselecting",c,{unselecting:b.element})}});e(c.target).parents().andSelf().each(function(){var b=e.data(this,"selectable-item");if(b){var g=!c.metaKey||!b.$element.hasClass("ui-selected");b.$element.removeClass(g?"ui-unselecting":"ui-selected").addClass(g?"ui-selecting":"ui-unselecting");b.unselecting=!g;b.selecting=g;(b.selected=g)?f._trigger("selecting",c,{selecting:b.element}):f._trigger("unselecting",c,{unselecting:b.element});return false}})}},_mouseDrag:function(c){var f=
+this;this.dragged=true;if(!this.options.disabled){var d=this.options,b=this.opos[0],g=this.opos[1],h=c.pageX,i=c.pageY;if(b>h){var j=h;h=b;b=j}if(g>i){j=i;i=g;g=j}this.helper.css({left:b,top:g,width:h-b,height:i-g});this.selectees.each(function(){var a=e.data(this,"selectable-item");if(!(!a||a.element==f.element[0])){var k=false;if(d.tolerance=="touch")k=!(a.left>h||a.right<b||a.top>i||a.bottom<g);else if(d.tolerance=="fit")k=a.left>b&&a.right<h&&a.top>g&&a.bottom<i;if(k){if(a.selected){a.$element.removeClass("ui-selected");
+a.selected=false}if(a.unselecting){a.$element.removeClass("ui-unselecting");a.unselecting=false}if(!a.selecting){a.$element.addClass("ui-selecting");a.selecting=true;f._trigger("selecting",c,{selecting:a.element})}}else{if(a.selecting)if(c.metaKey&&a.startselected){a.$element.removeClass("ui-selecting");a.selecting=false;a.$element.addClass("ui-selected");a.selected=true}else{a.$element.removeClass("ui-selecting");a.selecting=false;if(a.startselected){a.$element.addClass("ui-unselecting");a.unselecting=
+true}f._trigger("unselecting",c,{unselecting:a.element})}if(a.selected)if(!c.metaKey&&!a.startselected){a.$element.removeClass("ui-selected");a.selected=false;a.$element.addClass("ui-unselecting");a.unselecting=true;f._trigger("unselecting",c,{unselecting:a.element})}}}});return false}},_mouseStop:function(c){var f=this;this.dragged=false;e(".ui-unselecting",this.element[0]).each(function(){var d=e.data(this,"selectable-item");d.$element.removeClass("ui-unselecting");d.unselecting=false;d.startselected=
+false;f._trigger("unselected",c,{unselected:d.element})});e(".ui-selecting",this.element[0]).each(function(){var d=e.data(this,"selectable-item");d.$element.removeClass("ui-selecting").addClass("ui-selected");d.selecting=false;d.selected=true;d.startselected=true;f._trigger("selected",c,{selected:d.element})});this._trigger("stop",c);this.helper.remove();return false}});e.extend(e.ui.selectable,{version:"1.8.2"})})(jQuery);
+
+(function(e){e.widget("ui.selectable",e.ui.mouse,{options:{appendTo:"body",autoRefresh:true,distance:0,filter:"*",tolerance:"touch"},_create:function(){var c=this;this.element.addClass("ui-selectable");this.dragged=false;var f;this.refresh=function(){f=e(c.options.filter,c.element[0]);f.each(function(){var d=e(this),b=d.offset();e.data(this,"selectable-item",{element:this,$element:d,left:b.left,top:b.top,right:b.left+d.outerWidth(),bottom:b.top+d.outerHeight(),startselected:false,selected:d.hasClass("ui-selected"),
+selecting:d.hasClass("ui-selecting"),unselecting:d.hasClass("ui-unselecting")})})};this.refresh();this.selectees=f.addClass("ui-selectee");this._mouseInit();this.helper=e("<div class='ui-selectable-helper'></div>")},destroy:function(){this.selectees.removeClass("ui-selectee").removeData("selectable-item");this.element.removeClass("ui-selectable ui-selectable-disabled").removeData("selectable").unbind(".selectable");this._mouseDestroy();return this},_mouseStart:function(c){var f=this;this.opos=[c.pageX,
+c.pageY];if(!this.options.disabled){var d=this.options;this.selectees=e(d.filter,this.element[0]);this._trigger("start",c);e(d.appendTo).append(this.helper);this.helper.css({"z-index":100,position:"absolute",left:c.clientX,top:c.clientY,width:0,height:0});d.autoRefresh&&this.refresh();this.selectees.filter(".ui-selected").each(function(){var b=e.data(this,"selectable-item");b.startselected=true;if(!c.metaKey){b.$element.removeClass("ui-selected");b.selected=false;b.$element.addClass("ui-unselecting");
+b.unselecting=true;f._trigger("unselecting",c,{unselecting:b.element})}});e(c.target).parents().andSelf().each(function(){var b=e.data(this,"selectable-item");if(b){var g=!c.metaKey||!b.$element.hasClass("ui-selected");b.$element.removeClass(g?"ui-unselecting":"ui-selected").addClass(g?"ui-selecting":"ui-unselecting");b.unselecting=!g;b.selecting=g;(b.selected=g)?f._trigger("selecting",c,{selecting:b.element}):f._trigger("unselecting",c,{unselecting:b.element});return false}})}},_mouseDrag:function(c){var f=
+this;this.dragged=true;if(!this.options.disabled){var d=this.options,b=this.opos[0],g=this.opos[1],h=c.pageX,i=c.pageY;if(b>h){var j=h;h=b;b=j}if(g>i){j=i;i=g;g=j}this.helper.css({left:b,top:g,width:h-b,height:i-g});this.selectees.each(function(){var a=e.data(this,"selectable-item");if(!(!a||a.element==f.element[0])){var k=false;if(d.tolerance=="touch")k=!(a.left>h||a.right<b||a.top>i||a.bottom<g);else if(d.tolerance=="fit")k=a.left>b&&a.right<h&&a.top>g&&a.bottom<i;if(k){if(a.selected){a.$element.removeClass("ui-selected");
+a.selected=false}if(a.unselecting){a.$element.removeClass("ui-unselecting");a.unselecting=false}if(!a.selecting){a.$element.addClass("ui-selecting");a.selecting=true;f._trigger("selecting",c,{selecting:a.element})}}else{if(a.selecting)if(c.metaKey&&a.startselected){a.$element.removeClass("ui-selecting");a.selecting=false;a.$element.addClass("ui-selected");a.selected=true}else{a.$element.removeClass("ui-selecting");a.selecting=false;if(a.startselected){a.$element.addClass("ui-unselecting");a.unselecting=
+true}f._trigger("unselecting",c,{unselecting:a.element})}if(a.selected)if(!c.metaKey&&!a.startselected){a.$element.removeClass("ui-selected");a.selected=false;a.$element.addClass("ui-unselecting");a.unselecting=true;f._trigger("unselecting",c,{unselecting:a.element})}}}});return false}},_mouseStop:function(c){var f=this;this.dragged=false;e(".ui-unselecting",this.element[0]).each(function(){var d=e.data(this,"selectable-item");d.$element.removeClass("ui-unselecting");d.unselecting=false;d.startselected=
+false;f._trigger("unselected",c,{unselected:d.element})});e(".ui-selecting",this.element[0]).each(function(){var d=e.data(this,"selectable-item");d.$element.removeClass("ui-selecting").addClass("ui-selected");d.selecting=false;d.selected=true;d.startselected=true;f._trigger("selected",c,{selected:d.element})});this._trigger("stop",c);this.helper.remove();return false}});e.extend(e.ui.selectable,{version:"1.8.2"})})(jQuery);
+;/*
+ * jQuery UI Autocomplete 1.8.2
+ *
+ * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT (MIT-LICENSE.txt)
+ * and GPL (GPL-LICENSE.txt) licenses.
+ *
+ * http://docs.jquery.com/UI/Autocomplete
+ *
+ * Depends:
+ * jquery.ui.core.js
+ * jquery.ui.widget.js
+ * jquery.ui.position.js
+ */
+(function(e){e.widget("ui.autocomplete",{options:{minLength:1,delay:300},_create:function(){var a=this,c=this.element[0].ownerDocument;this.element.addClass("ui-autocomplete-input").attr("autocomplete","off").attr({role:"textbox","aria-autocomplete":"list","aria-haspopup":"true"}).bind("keydown.autocomplete",function(d){var b=e.ui.keyCode;switch(d.keyCode){case b.PAGE_UP:a._move("previousPage",d);break;case b.PAGE_DOWN:a._move("nextPage",d);break;case b.UP:a._move("previous",d);d.preventDefault();
+break;case b.DOWN:a._move("next",d);d.preventDefault();break;case b.ENTER:case b.NUMPAD_ENTER:a.menu.active&&d.preventDefault();case b.TAB:if(!a.menu.active)return;a.menu.select(d);break;case b.ESCAPE:a.element.val(a.term);a.close(d);break;case b.LEFT:case b.RIGHT:case b.SHIFT:case b.CONTROL:case b.ALT:case b.COMMAND:case b.COMMAND_RIGHT:case b.INSERT:case b.CAPS_LOCK:case b.END:case b.HOME:break;default:clearTimeout(a.searching);a.searching=setTimeout(function(){a.search(null,d)},a.options.delay);
+break}}).bind("focus.autocomplete",function(){a.selectedItem=null;a.previous=a.element.val()}).bind("blur.autocomplete",function(d){clearTimeout(a.searching);a.closing=setTimeout(function(){a.close(d);a._change(d)},150)});this._initSource();this.response=function(){return a._response.apply(a,arguments)};this.menu=e("<ul></ul>").addClass("ui-autocomplete").appendTo("body",c).mousedown(function(){setTimeout(function(){clearTimeout(a.closing)},13)}).menu({focus:function(d,b){b=b.item.data("item.autocomplete");
+false!==a._trigger("focus",null,{item:b})&&/^key/.test(d.originalEvent.type)&&a.element.val(b.value)},selected:function(d,b){b=b.item.data("item.autocomplete");false!==a._trigger("select",d,{item:b})&&a.element.val(b.value);a.close(d);d=a.previous;if(a.element[0]!==c.activeElement){a.element.focus();a.previous=d}a.selectedItem=b},blur:function(){a.menu.element.is(":visible")&&a.element.val(a.term)}}).zIndex(this.element.zIndex()+1).css({top:0,left:0}).hide().data("menu");e.fn.bgiframe&&this.menu.element.bgiframe()},
+destroy:function(){this.element.removeClass("ui-autocomplete-input").removeAttr("autocomplete").removeAttr("role").removeAttr("aria-autocomplete").removeAttr("aria-haspopup");this.menu.element.remove();e.Widget.prototype.destroy.call(this)},_setOption:function(a){e.Widget.prototype._setOption.apply(this,arguments);a==="source"&&this._initSource()},_initSource:function(){var a,c;if(e.isArray(this.options.source)){a=this.options.source;this.source=function(d,b){b(e.ui.autocomplete.filter(a,d.term))}}else if(typeof this.options.source===
+"string"){c=this.options.source;this.source=function(d,b){e.getJSON(c,d,b)}}else this.source=this.options.source},search:function(a,c){a=a!=null?a:this.element.val();if(a.length<this.options.minLength)return this.close(c);clearTimeout(this.closing);if(this._trigger("search")!==false)return this._search(a)},_search:function(a){this.term=this.element.addClass("ui-autocomplete-loading").val();this.source({term:a},this.response)},_response:function(a){if(a.length){a=this._normalize(a);this._suggest(a);
+this._trigger("open")}else this.close();this.element.removeClass("ui-autocomplete-loading")},close:function(a){clearTimeout(this.closing);if(this.menu.element.is(":visible")){this._trigger("close",a);this.menu.element.hide();this.menu.deactivate()}},_change:function(a){this.previous!==this.element.val()&&this._trigger("change",a,{item:this.selectedItem})},_normalize:function(a){if(a.length&&a[0].label&&a[0].value)return a;return e.map(a,function(c){if(typeof c==="string")return{label:c,value:c};return e.extend({label:c.label||
+c.value,value:c.value||c.label},c)})},_suggest:function(a){var c=this.menu.element.empty().zIndex(this.element.zIndex()+1),d;this._renderMenu(c,a);this.menu.deactivate();this.menu.refresh();this.menu.element.show().position({my:"left top",at:"left bottom",of:this.element,collision:"none"});a=c.width("").width();d=this.element.width();c.width(Math.max(a,d))},_renderMenu:function(a,c){var d=this;e.each(c,function(b,f){d._renderItem(a,f)})},_renderItem:function(a,c){return e("<li></li>").data("item.autocomplete",
+c).append("<a>"+c.label+"</a>").appendTo(a)},_move:function(a,c){if(this.menu.element.is(":visible"))if(this.menu.first()&&/^previous/.test(a)||this.menu.last()&&/^next/.test(a)){this.element.val(this.term);this.menu.deactivate()}else this.menu[a](c);else this.search(null,c)},widget:function(){return this.menu.element}});e.extend(e.ui.autocomplete,{escapeRegex:function(a){return a.replace(/([\^\$\(\)\[\]\{\}\*\.\+\?\|\\])/gi,"\\$1")},filter:function(a,c){var d=new RegExp(e.ui.autocomplete.escapeRegex(c),
+"i");return e.grep(a,function(b){return d.test(b.label||b.value||b)})}})})(jQuery);
+(function(e){e.widget("ui.menu",{_create:function(){var a=this;this.element.addClass("ui-menu ui-widget ui-widget-content ui-corner-all").attr({role:"listbox","aria-activedescendant":"ui-active-menuitem"}).click(function(c){if(e(c.target).closest(".ui-menu-item a").length){c.preventDefault();a.select(c)}});this.refresh()},refresh:function(){var a=this;this.element.children("li:not(.ui-menu-item):has(a)").addClass("ui-menu-item").attr("role","menuitem").children("a").addClass("ui-corner-all").attr("tabindex",
+-1).mouseenter(function(c){a.activate(c,e(this).parent())}).mouseleave(function(){a.deactivate()})},activate:function(a,c){this.deactivate();if(this.hasScroll()){var d=c.offset().top-this.element.offset().top,b=this.element.attr("scrollTop"),f=this.element.height();if(d<0)this.element.attr("scrollTop",b+d);else d>f&&this.element.attr("scrollTop",b+d-f+c.height())}this.active=c.eq(0).children("a").addClass("ui-state-hover").attr("id","ui-active-menuitem").end();this._trigger("focus",a,{item:c})},deactivate:function(){if(this.active){this.active.children("a").removeClass("ui-state-hover").removeAttr("id");
+this._trigger("blur");this.active=null}},next:function(a){this.move("next",".ui-menu-item:first",a)},previous:function(a){this.move("prev",".ui-menu-item:last",a)},first:function(){return this.active&&!this.active.prev().length},last:function(){return this.active&&!this.active.next().length},move:function(a,c,d){if(this.active){a=this.active[a+"All"](".ui-menu-item").eq(0);a.length?this.activate(d,a):this.activate(d,this.element.children(c))}else this.activate(d,this.element.children(c))},nextPage:function(a){if(this.hasScroll())if(!this.active||
+this.last())this.activate(a,this.element.children(":first"));else{var c=this.active.offset().top,d=this.element.height(),b=this.element.children("li").filter(function(){var f=e(this).offset().top-c-d+e(this).height();return f<10&&f>-10});b.length||(b=this.element.children(":last"));this.activate(a,b)}else this.activate(a,this.element.children(!this.active||this.last()?":first":":last"))},previousPage:function(a){if(this.hasScroll())if(!this.active||this.first())this.activate(a,this.element.children(":last"));
+else{var c=this.active.offset().top,d=this.element.height();result=this.element.children("li").filter(function(){var b=e(this).offset().top-c+d-e(this).height();return b<10&&b>-10});result.length||(result=this.element.children(":first"));this.activate(a,result)}else this.activate(a,this.element.children(!this.active||this.first()?":last":":first"))},hasScroll:function(){return this.element.height()<this.element.attr("scrollHeight")},select:function(a){this._trigger("selected",a,{item:this.active})}})})(jQuery);
+;/*
+ * jQuery UI Button 1.8.2
+ *
+ * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT (MIT-LICENSE.txt)
+ * and GPL (GPL-LICENSE.txt) licenses.
+ *
+ * http://docs.jquery.com/UI/Button
+ *
+ * Depends:
+ * jquery.ui.core.js
+ * jquery.ui.widget.js
+ */
+(function(a){var g,i=function(b){a(":ui-button",b.target.form).each(function(){var c=a(this).data("button");setTimeout(function(){c.refresh()},1)})},h=function(b){var c=b.name,d=b.form,e=a([]);if(c)e=d?a(d).find("[name='"+c+"']"):a("[name='"+c+"']",b.ownerDocument).filter(function(){return!this.form});return e};a.widget("ui.button",{options:{text:true,label:null,icons:{primary:null,secondary:null}},_create:function(){this.element.closest("form").unbind("reset.button").bind("reset.button",i);this._determineButtonType();
+this.hasTitle=!!this.buttonElement.attr("title");var b=this,c=this.options,d=this.type==="checkbox"||this.type==="radio",e="ui-state-hover"+(!d?" ui-state-active":"");if(c.label===null)c.label=this.buttonElement.html();if(this.element.is(":disabled"))c.disabled=true;this.buttonElement.addClass("ui-button ui-widget ui-state-default ui-corner-all").attr("role","button").bind("mouseenter.button",function(){if(!c.disabled){a(this).addClass("ui-state-hover");this===g&&a(this).addClass("ui-state-active")}}).bind("mouseleave.button",
+function(){c.disabled||a(this).removeClass(e)}).bind("focus.button",function(){a(this).addClass("ui-state-focus")}).bind("blur.button",function(){a(this).removeClass("ui-state-focus")});d&&this.element.bind("change.button",function(){b.refresh()});if(this.type==="checkbox")this.buttonElement.bind("click.button",function(){if(c.disabled)return false;a(this).toggleClass("ui-state-active");b.buttonElement.attr("aria-pressed",b.element[0].checked)});else if(this.type==="radio")this.buttonElement.bind("click.button",
+function(){if(c.disabled)return false;a(this).addClass("ui-state-active");b.buttonElement.attr("aria-pressed",true);var f=b.element[0];h(f).not(f).map(function(){return a(this).button("widget")[0]}).removeClass("ui-state-active").attr("aria-pressed",false)});else{this.buttonElement.bind("mousedown.button",function(){if(c.disabled)return false;a(this).addClass("ui-state-active");g=this;a(document).one("mouseup",function(){g=null})}).bind("mouseup.button",function(){if(c.disabled)return false;a(this).removeClass("ui-state-active")}).bind("keydown.button",
+function(f){if(c.disabled)return false;if(f.keyCode==a.ui.keyCode.SPACE||f.keyCode==a.ui.keyCode.ENTER)a(this).addClass("ui-state-active")}).bind("keyup.button",function(){a(this).removeClass("ui-state-active")});this.buttonElement.is("a")&&this.buttonElement.keyup(function(f){f.keyCode===a.ui.keyCode.SPACE&&a(this).click()})}this._setOption("disabled",c.disabled)},_determineButtonType:function(){this.type=this.element.is(":checkbox")?"checkbox":this.element.is(":radio")?"radio":this.element.is("input")?
+"input":"button";if(this.type==="checkbox"||this.type==="radio"){this.buttonElement=this.element.parents().last().find("[for="+this.element.attr("id")+"]");this.element.addClass("ui-helper-hidden-accessible");var b=this.element.is(":checked");b&&this.buttonElement.addClass("ui-state-active");this.buttonElement.attr("aria-pressed",b)}else this.buttonElement=this.element},widget:function(){return this.buttonElement},destroy:function(){this.element.removeClass("ui-helper-hidden-accessible");this.buttonElement.removeClass("ui-button ui-widget ui-state-default ui-corner-all ui-state-hover ui-state-active ui-button-icons-only ui-button-icon-only ui-button-text-icons ui-button-text-icon ui-button-text-only").removeAttr("role").removeAttr("aria-pressed").html(this.buttonElement.find(".ui-button-text").html());
+this.hasTitle||this.buttonElement.removeAttr("title");a.Widget.prototype.destroy.call(this)},_setOption:function(b,c){a.Widget.prototype._setOption.apply(this,arguments);if(b==="disabled")c?this.element.attr("disabled",true):this.element.removeAttr("disabled");this._resetButton()},refresh:function(){var b=this.element.is(":disabled");b!==this.options.disabled&&this._setOption("disabled",b);if(this.type==="radio")h(this.element[0]).each(function(){a(this).is(":checked")?a(this).button("widget").addClass("ui-state-active").attr("aria-pressed",
+true):a(this).button("widget").removeClass("ui-state-active").attr("aria-pressed",false)});else if(this.type==="checkbox")this.element.is(":checked")?this.buttonElement.addClass("ui-state-active").attr("aria-pressed",true):this.buttonElement.removeClass("ui-state-active").attr("aria-pressed",false)},_resetButton:function(){if(this.type==="input")this.options.label&&this.element.val(this.options.label);else{var b=this.buttonElement.removeClass("ui-button-icons-only ui-button-icon-only ui-button-text-icons ui-button-text-icon ui-button-text-only"),
+c=a("<span></span>").addClass("ui-button-text").html(this.options.label).appendTo(b.empty()).text(),d=this.options.icons,e=d.primary&&d.secondary;if(d.primary||d.secondary){b.addClass("ui-button-text-icon"+(e?"s":""));d.primary&&b.prepend("<span class='ui-button-icon-primary ui-icon "+d.primary+"'></span>");d.secondary&&b.append("<span class='ui-button-icon-secondary ui-icon "+d.secondary+"'></span>");if(!this.options.text){b.addClass(e?"ui-button-icons-only":"ui-button-icon-only").removeClass("ui-button-text-icons ui-button-text-icon");
+this.hasTitle||b.attr("title",c)}}else b.addClass("ui-button-text-only")}}});a.widget("ui.buttonset",{_create:function(){this.element.addClass("ui-buttonset");this._init()},_init:function(){this.refresh()},_setOption:function(b,c){b==="disabled"&&this.buttons.button("option",b,c);a.Widget.prototype._setOption.apply(this,arguments)},refresh:function(){this.buttons=this.element.find(":button, :submit, :reset, :checkbox, :radio, a, :data(button)").filter(":ui-button").button("refresh").end().not(":ui-button").button().end().map(function(){return a(this).button("widget")[0]}).removeClass("ui-corner-all ui-corner-left ui-corner-right").filter(":first").addClass("ui-corner-left").end().filter(":last").addClass("ui-corner-right").end().end()},
+destroy:function(){this.element.removeClass("ui-buttonset");this.buttons.map(function(){return a(this).button("widget")[0]}).removeClass("ui-corner-left ui-corner-right").end().button("destroy");a.Widget.prototype.destroy.call(this)}})})(jQuery);
+;/*
+ * jQuery UI Dialog 1.8.2
+ *
+ * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT (MIT-LICENSE.txt)
+ * and GPL (GPL-LICENSE.txt) licenses.
+ *
+ * http://docs.jquery.com/UI/Dialog
+ *
+ * Depends:
+ * jquery.ui.core.js
+ * jquery.ui.widget.js
+ * jquery.ui.button.js
+ * jquery.ui.draggable.js
+ * jquery.ui.mouse.js
+ * jquery.ui.position.js
+ * jquery.ui.resizable.js
+ */
+(function(c){c.widget("ui.dialog",{options:{autoOpen:true,buttons:{},closeOnEscape:true,closeText:"close",dialogClass:"",draggable:true,hide:null,height:"auto",maxHeight:false,maxWidth:false,minHeight:150,minWidth:150,modal:false,position:"center",resizable:true,show:null,stack:true,title:"",width:300,zIndex:1E3},_create:function(){this.originalTitle=this.element.attr("title");var a=this,b=a.options,d=b.title||a.originalTitle||"&#160;",e=c.ui.dialog.getTitleId(a.element),g=(a.uiDialog=c("<div></div>")).appendTo(document.body).hide().addClass("ui-dialog ui-widget ui-widget-content ui-corner-all "+
+b.dialogClass).css({zIndex:b.zIndex}).attr("tabIndex",-1).css("outline",0).keydown(function(i){if(b.closeOnEscape&&i.keyCode&&i.keyCode===c.ui.keyCode.ESCAPE){a.close(i);i.preventDefault()}}).attr({role:"dialog","aria-labelledby":e}).mousedown(function(i){a.moveToTop(false,i)});a.element.show().removeAttr("title").addClass("ui-dialog-content ui-widget-content").appendTo(g);var f=(a.uiDialogTitlebar=c("<div></div>")).addClass("ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix").prependTo(g),
+h=c('<a href="#"></a>').addClass("ui-dialog-titlebar-close ui-corner-all").attr("role","button").hover(function(){h.addClass("ui-state-hover")},function(){h.removeClass("ui-state-hover")}).focus(function(){h.addClass("ui-state-focus")}).blur(function(){h.removeClass("ui-state-focus")}).click(function(i){a.close(i);return false}).appendTo(f);(a.uiDialogTitlebarCloseText=c("<span></span>")).addClass("ui-icon ui-icon-closethick").text(b.closeText).appendTo(h);c("<span></span>").addClass("ui-dialog-title").attr("id",
+e).html(d).prependTo(f);if(c.isFunction(b.beforeclose)&&!c.isFunction(b.beforeClose))b.beforeClose=b.beforeclose;f.find("*").add(f).disableSelection();b.draggable&&c.fn.draggable&&a._makeDraggable();b.resizable&&c.fn.resizable&&a._makeResizable();a._createButtons(b.buttons);a._isOpen=false;c.fn.bgiframe&&g.bgiframe()},_init:function(){this.options.autoOpen&&this.open()},destroy:function(){var a=this;a.overlay&&a.overlay.destroy();a.uiDialog.hide();a.element.unbind(".dialog").removeData("dialog").removeClass("ui-dialog-content ui-widget-content").hide().appendTo("body");
+a.uiDialog.remove();a.originalTitle&&a.element.attr("title",a.originalTitle);return a},widget:function(){return this.uiDialog},close:function(a){var b=this,d;if(false!==b._trigger("beforeClose",a)){b.overlay&&b.overlay.destroy();b.uiDialog.unbind("keypress.ui-dialog");b._isOpen=false;if(b.options.hide)b.uiDialog.hide(b.options.hide,function(){b._trigger("close",a)});else{b.uiDialog.hide();b._trigger("close",a)}c.ui.dialog.overlay.resize();if(b.options.modal){d=0;c(".ui-dialog").each(function(){if(this!==
+b.uiDialog[0])d=Math.max(d,c(this).css("z-index"))});c.ui.dialog.maxZ=d}return b}},isOpen:function(){return this._isOpen},moveToTop:function(a,b){var d=this,e=d.options;if(e.modal&&!a||!e.stack&&!e.modal)return d._trigger("focus",b);if(e.zIndex>c.ui.dialog.maxZ)c.ui.dialog.maxZ=e.zIndex;if(d.overlay){c.ui.dialog.maxZ+=1;d.overlay.$el.css("z-index",c.ui.dialog.overlay.maxZ=c.ui.dialog.maxZ)}a={scrollTop:d.element.attr("scrollTop"),scrollLeft:d.element.attr("scrollLeft")};c.ui.dialog.maxZ+=1;d.uiDialog.css("z-index",
+c.ui.dialog.maxZ);d.element.attr(a);d._trigger("focus",b);return d},open:function(){if(!this._isOpen){var a=this,b=a.options,d=a.uiDialog;a.overlay=b.modal?new c.ui.dialog.overlay(a):null;d.next().length&&d.appendTo("body");a._size();a._position(b.position);d.show(b.show);a.moveToTop(true);b.modal&&d.bind("keypress.ui-dialog",function(e){if(e.keyCode===c.ui.keyCode.TAB){var g=c(":tabbable",this),f=g.filter(":first");g=g.filter(":last");if(e.target===g[0]&&!e.shiftKey){f.focus(1);return false}else if(e.target===
+f[0]&&e.shiftKey){g.focus(1);return false}}});c([]).add(d.find(".ui-dialog-content :tabbable:first")).add(d.find(".ui-dialog-buttonpane :tabbable:first")).add(d).filter(":first").focus();a._trigger("open");a._isOpen=true;return a}},_createButtons:function(a){var b=this,d=false,e=c("<div></div>").addClass("ui-dialog-buttonpane ui-widget-content ui-helper-clearfix");b.uiDialog.find(".ui-dialog-buttonpane").remove();typeof a==="object"&&a!==null&&c.each(a,function(){return!(d=true)});if(d){c.each(a,
+function(g,f){g=c('<button type="button"></button>').text(g).click(function(){f.apply(b.element[0],arguments)}).appendTo(e);c.fn.button&&g.button()});e.appendTo(b.uiDialog)}},_makeDraggable:function(){function a(f){return{position:f.position,offset:f.offset}}var b=this,d=b.options,e=c(document),g;b.uiDialog.draggable({cancel:".ui-dialog-content, .ui-dialog-titlebar-close",handle:".ui-dialog-titlebar",containment:"document",start:function(f,h){g=d.height==="auto"?"auto":c(this).height();c(this).height(c(this).height()).addClass("ui-dialog-dragging");
+b._trigger("dragStart",f,a(h))},drag:function(f,h){b._trigger("drag",f,a(h))},stop:function(f,h){d.position=[h.position.left-e.scrollLeft(),h.position.top-e.scrollTop()];c(this).removeClass("ui-dialog-dragging").height(g);b._trigger("dragStop",f,a(h));c.ui.dialog.overlay.resize()}})},_makeResizable:function(a){function b(f){return{originalPosition:f.originalPosition,originalSize:f.originalSize,position:f.position,size:f.size}}a=a===undefined?this.options.resizable:a;var d=this,e=d.options,g=d.uiDialog.css("position");
+a=typeof a==="string"?a:"n,e,s,w,se,sw,ne,nw";d.uiDialog.resizable({cancel:".ui-dialog-content",containment:"document",alsoResize:d.element,maxWidth:e.maxWidth,maxHeight:e.maxHeight,minWidth:e.minWidth,minHeight:d._minHeight(),handles:a,start:function(f,h){c(this).addClass("ui-dialog-resizing");d._trigger("resizeStart",f,b(h))},resize:function(f,h){d._trigger("resize",f,b(h))},stop:function(f,h){c(this).removeClass("ui-dialog-resizing");e.height=c(this).height();e.width=c(this).width();d._trigger("resizeStop",
+f,b(h));c.ui.dialog.overlay.resize()}}).css("position",g).find(".ui-resizable-se").addClass("ui-icon ui-icon-grip-diagonal-se")},_minHeight:function(){var a=this.options;return a.height==="auto"?a.minHeight:Math.min(a.minHeight,a.height)},_position:function(a){var b=[],d=[0,0];a=a||c.ui.dialog.prototype.options.position;if(typeof a==="string"||typeof a==="object"&&"0"in a){b=a.split?a.split(" "):[a[0],a[1]];if(b.length===1)b[1]=b[0];c.each(["left","top"],function(e,g){if(+b[e]===b[e]){d[e]=b[e];b[e]=
+g}})}else if(typeof a==="object"){if("left"in a){b[0]="left";d[0]=a.left}else if("right"in a){b[0]="right";d[0]=-a.right}if("top"in a){b[1]="top";d[1]=a.top}else if("bottom"in a){b[1]="bottom";d[1]=-a.bottom}}(a=this.uiDialog.is(":visible"))||this.uiDialog.show();this.uiDialog.css({top:0,left:0}).position({my:b.join(" "),at:b.join(" "),offset:d.join(" "),of:window,collision:"fit",using:function(e){var g=c(this).css(e).offset().top;g<0&&c(this).css("top",e.top-g)}});a||this.uiDialog.hide()},_setOption:function(a,
+b){var d=this,e=d.uiDialog,g=e.is(":data(resizable)"),f=false;switch(a){case "beforeclose":a="beforeClose";break;case "buttons":d._createButtons(b);break;case "closeText":d.uiDialogTitlebarCloseText.text(""+b);break;case "dialogClass":e.removeClass(d.options.dialogClass).addClass("ui-dialog ui-widget ui-widget-content ui-corner-all "+b);break;case "disabled":b?e.addClass("ui-dialog-disabled"):e.removeClass("ui-dialog-disabled");break;case "draggable":b?d._makeDraggable():e.draggable("destroy");break;
+case "height":f=true;break;case "maxHeight":g&&e.resizable("option","maxHeight",b);f=true;break;case "maxWidth":g&&e.resizable("option","maxWidth",b);f=true;break;case "minHeight":g&&e.resizable("option","minHeight",b);f=true;break;case "minWidth":g&&e.resizable("option","minWidth",b);f=true;break;case "position":d._position(b);break;case "resizable":g&&!b&&e.resizable("destroy");g&&typeof b==="string"&&e.resizable("option","handles",b);!g&&b!==false&&d._makeResizable(b);break;case "title":c(".ui-dialog-title",
+d.uiDialogTitlebar).html(""+(b||"&#160;"));break;case "width":f=true;break}c.Widget.prototype._setOption.apply(d,arguments);f&&d._size()},_size:function(){var a=this.options,b;this.element.css({width:"auto",minHeight:0,height:0});b=this.uiDialog.css({height:"auto",width:a.width}).height();this.element.css(a.height==="auto"?{minHeight:Math.max(a.minHeight-b,0),height:"auto"}:{minHeight:0,height:Math.max(a.height-b,0)}).show();this.uiDialog.is(":data(resizable)")&&this.uiDialog.resizable("option","minHeight",
+this._minHeight())}});c.extend(c.ui.dialog,{version:"1.8.2",uuid:0,maxZ:0,getTitleId:function(a){a=a.attr("id");if(!a){this.uuid+=1;a=this.uuid}return"ui-dialog-title-"+a},overlay:function(a){this.$el=c.ui.dialog.overlay.create(a)}});c.extend(c.ui.dialog.overlay,{instances:[],oldInstances:[],maxZ:0,events:c.map("focus,mousedown,mouseup,keydown,keypress,click".split(","),function(a){return a+".dialog-overlay"}).join(" "),create:function(a){if(this.instances.length===0){setTimeout(function(){c.ui.dialog.overlay.instances.length&&
+c(document).bind(c.ui.dialog.overlay.events,function(d){return c(d.target).zIndex()>=c.ui.dialog.overlay.maxZ})},1);c(document).bind("keydown.dialog-overlay",function(d){if(a.options.closeOnEscape&&d.keyCode&&d.keyCode===c.ui.keyCode.ESCAPE){a.close(d);d.preventDefault()}});c(window).bind("resize.dialog-overlay",c.ui.dialog.overlay.resize)}var b=(this.oldInstances.pop()||c("<div></div>").addClass("ui-widget-overlay")).appendTo(document.body).css({width:this.width(),height:this.height()});c.fn.bgiframe&&
+b.bgiframe();this.instances.push(b);return b},destroy:function(a){this.oldInstances.push(this.instances.splice(c.inArray(a,this.instances),1)[0]);this.instances.length===0&&c([document,window]).unbind(".dialog-overlay");a.remove();var b=0;c.each(this.instances,function(){b=Math.max(b,this.css("z-index"))});this.maxZ=b},height:function(){var a,b;if(c.browser.msie&&c.browser.version<7){a=Math.max(document.documentElement.scrollHeight,document.body.scrollHeight);b=Math.max(document.documentElement.offsetHeight,
+document.body.offsetHeight);return a<b?c(window).height()+"px":a+"px"}else return c(document).height()+"px"},width:function(){var a,b;if(c.browser.msie&&c.browser.version<7){a=Math.max(document.documentElement.scrollWidth,document.body.scrollWidth);b=Math.max(document.documentElement.offsetWidth,document.body.offsetWidth);return a<b?c(window).width()+"px":a+"px"}else return c(document).width()+"px"},resize:function(){var a=c([]);c.each(c.ui.dialog.overlay.instances,function(){a=a.add(this)});a.css({width:0,
+height:0}).css({width:c.ui.dialog.overlay.width(),height:c.ui.dialog.overlay.height()})}});c.extend(c.ui.dialog.overlay.prototype,{destroy:function(){c.ui.dialog.overlay.destroy(this.$el)}})})(jQuery);
+;/*
+ * jQuery UI Tabs 1.8.2
+ *
+ * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT (MIT-LICENSE.txt)
+ * and GPL (GPL-LICENSE.txt) licenses.
+ *
+ * http://docs.jquery.com/UI/Tabs
+ *
+ * Depends:
+ * jquery.ui.core.js
+ * jquery.ui.widget.js
+ */
+(function(d){function s(){return++u}function v(){return++w}var u=0,w=0;d.widget("ui.tabs",{options:{add:null,ajaxOptions:null,cache:false,cookie:null,collapsible:false,disable:null,disabled:[],enable:null,event:"click",fx:null,idPrefix:"ui-tabs-",load:null,panelTemplate:"<div></div>",remove:null,select:null,show:null,spinner:"<em>Loading&#8230;</em>",tabTemplate:'<li><a href="#{href}"><span>#{label}</span></a></li>'},_create:function(){this._tabify(true)},_setOption:function(c,e){if(c=="selected")this.options.collapsible&&
+e==this.options.selected||this.select(e);else{this.options[c]=e;this._tabify()}},_tabId:function(c){return c.title&&c.title.replace(/\s/g,"_").replace(/[^A-Za-z0-9\-_:\.]/g,"")||this.options.idPrefix+s()},_sanitizeSelector:function(c){return c.replace(/:/g,"\\:")},_cookie:function(){var c=this.cookie||(this.cookie=this.options.cookie.name||"ui-tabs-"+v());return d.cookie.apply(null,[c].concat(d.makeArray(arguments)))},_ui:function(c,e){return{tab:c,panel:e,index:this.anchors.index(c)}},_cleanup:function(){this.lis.filter(".ui-state-processing").removeClass("ui-state-processing").find("span:data(label.tabs)").each(function(){var c=
+d(this);c.html(c.data("label.tabs")).removeData("label.tabs")})},_tabify:function(c){function e(g,f){g.css({display:""});!d.support.opacity&&f.opacity&&g[0].style.removeAttribute("filter")}this.list=this.element.find("ol,ul").eq(0);this.lis=d("li:has(a[href])",this.list);this.anchors=this.lis.map(function(){return d("a",this)[0]});this.panels=d([]);var a=this,b=this.options,h=/^#.+/;this.anchors.each(function(g,f){var j=d(f).attr("href"),l=j.split("#")[0],p;if(l&&(l===location.toString().split("#")[0]||
+(p=d("base")[0])&&l===p.href)){j=f.hash;f.href=j}if(h.test(j))a.panels=a.panels.add(a._sanitizeSelector(j));else if(j!="#"){d.data(f,"href.tabs",j);d.data(f,"load.tabs",j.replace(/#.*$/,""));j=a._tabId(f);f.href="#"+j;f=d("#"+j);if(!f.length){f=d(b.panelTemplate).attr("id",j).addClass("ui-tabs-panel ui-widget-content ui-corner-bottom").insertAfter(a.panels[g-1]||a.list);f.data("destroy.tabs",true)}a.panels=a.panels.add(f)}else b.disabled.push(g)});if(c){this.element.addClass("ui-tabs ui-widget ui-widget-content ui-corner-all");
+this.list.addClass("ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all");this.lis.addClass("ui-state-default ui-corner-top");this.panels.addClass("ui-tabs-panel ui-widget-content ui-corner-bottom");if(b.selected===undefined){location.hash&&this.anchors.each(function(g,f){if(f.hash==location.hash){b.selected=g;return false}});if(typeof b.selected!="number"&&b.cookie)b.selected=parseInt(a._cookie(),10);if(typeof b.selected!="number"&&this.lis.filter(".ui-tabs-selected").length)b.selected=
+this.lis.index(this.lis.filter(".ui-tabs-selected"));b.selected=b.selected||(this.lis.length?0:-1)}else if(b.selected===null)b.selected=-1;b.selected=b.selected>=0&&this.anchors[b.selected]||b.selected<0?b.selected:0;b.disabled=d.unique(b.disabled.concat(d.map(this.lis.filter(".ui-state-disabled"),function(g){return a.lis.index(g)}))).sort();d.inArray(b.selected,b.disabled)!=-1&&b.disabled.splice(d.inArray(b.selected,b.disabled),1);this.panels.addClass("ui-tabs-hide");this.lis.removeClass("ui-tabs-selected ui-state-active");
+if(b.selected>=0&&this.anchors.length){this.panels.eq(b.selected).removeClass("ui-tabs-hide");this.lis.eq(b.selected).addClass("ui-tabs-selected ui-state-active");a.element.queue("tabs",function(){a._trigger("show",null,a._ui(a.anchors[b.selected],a.panels[b.selected]))});this.load(b.selected)}d(window).bind("unload",function(){a.lis.add(a.anchors).unbind(".tabs");a.lis=a.anchors=a.panels=null})}else b.selected=this.lis.index(this.lis.filter(".ui-tabs-selected"));this.element[b.collapsible?"addClass":
+"removeClass"]("ui-tabs-collapsible");b.cookie&&this._cookie(b.selected,b.cookie);c=0;for(var i;i=this.lis[c];c++)d(i)[d.inArray(c,b.disabled)!=-1&&!d(i).hasClass("ui-tabs-selected")?"addClass":"removeClass"]("ui-state-disabled");b.cache===false&&this.anchors.removeData("cache.tabs");this.lis.add(this.anchors).unbind(".tabs");if(b.event!="mouseover"){var k=function(g,f){f.is(":not(.ui-state-disabled)")&&f.addClass("ui-state-"+g)},n=function(g,f){f.removeClass("ui-state-"+g)};this.lis.bind("mouseover.tabs",
+function(){k("hover",d(this))});this.lis.bind("mouseout.tabs",function(){n("hover",d(this))});this.anchors.bind("focus.tabs",function(){k("focus",d(this).closest("li"))});this.anchors.bind("blur.tabs",function(){n("focus",d(this).closest("li"))})}var m,o;if(b.fx)if(d.isArray(b.fx)){m=b.fx[0];o=b.fx[1]}else m=o=b.fx;var q=o?function(g,f){d(g).closest("li").addClass("ui-tabs-selected ui-state-active");f.hide().removeClass("ui-tabs-hide").animate(o,o.duration||"normal",function(){e(f,o);a._trigger("show",
+null,a._ui(g,f[0]))})}:function(g,f){d(g).closest("li").addClass("ui-tabs-selected ui-state-active");f.removeClass("ui-tabs-hide");a._trigger("show",null,a._ui(g,f[0]))},r=m?function(g,f){f.animate(m,m.duration||"normal",function(){a.lis.removeClass("ui-tabs-selected ui-state-active");f.addClass("ui-tabs-hide");e(f,m);a.element.dequeue("tabs")})}:function(g,f){a.lis.removeClass("ui-tabs-selected ui-state-active");f.addClass("ui-tabs-hide");a.element.dequeue("tabs")};this.anchors.bind(b.event+".tabs",
+function(){var g=this,f=d(this).closest("li"),j=a.panels.filter(":not(.ui-tabs-hide)"),l=d(a._sanitizeSelector(this.hash));if(f.hasClass("ui-tabs-selected")&&!b.collapsible||f.hasClass("ui-state-disabled")||f.hasClass("ui-state-processing")||a._trigger("select",null,a._ui(this,l[0]))===false){this.blur();return false}b.selected=a.anchors.index(this);a.abort();if(b.collapsible)if(f.hasClass("ui-tabs-selected")){b.selected=-1;b.cookie&&a._cookie(b.selected,b.cookie);a.element.queue("tabs",function(){r(g,
+j)}).dequeue("tabs");this.blur();return false}else if(!j.length){b.cookie&&a._cookie(b.selected,b.cookie);a.element.queue("tabs",function(){q(g,l)});a.load(a.anchors.index(this));this.blur();return false}b.cookie&&a._cookie(b.selected,b.cookie);if(l.length){j.length&&a.element.queue("tabs",function(){r(g,j)});a.element.queue("tabs",function(){q(g,l)});a.load(a.anchors.index(this))}else throw"jQuery UI Tabs: Mismatching fragment identifier.";d.browser.msie&&this.blur()});this.anchors.bind("click.tabs",
+function(){return false})},destroy:function(){var c=this.options;this.abort();this.element.unbind(".tabs").removeClass("ui-tabs ui-widget ui-widget-content ui-corner-all ui-tabs-collapsible").removeData("tabs");this.list.removeClass("ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all");this.anchors.each(function(){var e=d.data(this,"href.tabs");if(e)this.href=e;var a=d(this).unbind(".tabs");d.each(["href","load","cache"],function(b,h){a.removeData(h+".tabs")})});this.lis.unbind(".tabs").add(this.panels).each(function(){d.data(this,
+"destroy.tabs")?d(this).remove():d(this).removeClass("ui-state-default ui-corner-top ui-tabs-selected ui-state-active ui-state-hover ui-state-focus ui-state-disabled ui-tabs-panel ui-widget-content ui-corner-bottom ui-tabs-hide")});c.cookie&&this._cookie(null,c.cookie);return this},add:function(c,e,a){if(a===undefined)a=this.anchors.length;var b=this,h=this.options;e=d(h.tabTemplate.replace(/#\{href\}/g,c).replace(/#\{label\}/g,e));c=!c.indexOf("#")?c.replace("#",""):this._tabId(d("a",e)[0]);e.addClass("ui-state-default ui-corner-top").data("destroy.tabs",
+true);var i=d("#"+c);i.length||(i=d(h.panelTemplate).attr("id",c).data("destroy.tabs",true));i.addClass("ui-tabs-panel ui-widget-content ui-corner-bottom ui-tabs-hide");if(a>=this.lis.length){e.appendTo(this.list);i.appendTo(this.list[0].parentNode)}else{e.insertBefore(this.lis[a]);i.insertBefore(this.panels[a])}h.disabled=d.map(h.disabled,function(k){return k>=a?++k:k});this._tabify();if(this.anchors.length==1){h.selected=0;e.addClass("ui-tabs-selected ui-state-active");i.removeClass("ui-tabs-hide");
+this.element.queue("tabs",function(){b._trigger("show",null,b._ui(b.anchors[0],b.panels[0]))});this.load(0)}this._trigger("add",null,this._ui(this.anchors[a],this.panels[a]));return this},remove:function(c){var e=this.options,a=this.lis.eq(c).remove(),b=this.panels.eq(c).remove();if(a.hasClass("ui-tabs-selected")&&this.anchors.length>1)this.select(c+(c+1<this.anchors.length?1:-1));e.disabled=d.map(d.grep(e.disabled,function(h){return h!=c}),function(h){return h>=c?--h:h});this._tabify();this._trigger("remove",
+null,this._ui(a.find("a")[0],b[0]));return this},enable:function(c){var e=this.options;if(d.inArray(c,e.disabled)!=-1){this.lis.eq(c).removeClass("ui-state-disabled");e.disabled=d.grep(e.disabled,function(a){return a!=c});this._trigger("enable",null,this._ui(this.anchors[c],this.panels[c]));return this}},disable:function(c){var e=this.options;if(c!=e.selected){this.lis.eq(c).addClass("ui-state-disabled");e.disabled.push(c);e.disabled.sort();this._trigger("disable",null,this._ui(this.anchors[c],this.panels[c]))}return this},
+select:function(c){if(typeof c=="string")c=this.anchors.index(this.anchors.filter("[href$="+c+"]"));else if(c===null)c=-1;if(c==-1&&this.options.collapsible)c=this.options.selected;this.anchors.eq(c).trigger(this.options.event+".tabs");return this},load:function(c){var e=this,a=this.options,b=this.anchors.eq(c)[0],h=d.data(b,"load.tabs");this.abort();if(!h||this.element.queue("tabs").length!==0&&d.data(b,"cache.tabs"))this.element.dequeue("tabs");else{this.lis.eq(c).addClass("ui-state-processing");
+if(a.spinner){var i=d("span",b);i.data("label.tabs",i.html()).html(a.spinner)}this.xhr=d.ajax(d.extend({},a.ajaxOptions,{url:h,success:function(k,n){d(e._sanitizeSelector(b.hash)).html(k);e._cleanup();a.cache&&d.data(b,"cache.tabs",true);e._trigger("load",null,e._ui(e.anchors[c],e.panels[c]));try{a.ajaxOptions.success(k,n)}catch(m){}},error:function(k,n){e._cleanup();e._trigger("load",null,e._ui(e.anchors[c],e.panels[c]));try{a.ajaxOptions.error(k,n,c,b)}catch(m){}}}));e.element.dequeue("tabs");return this}},
+abort:function(){this.element.queue([]);this.panels.stop(false,true);this.element.queue("tabs",this.element.queue("tabs").splice(-2,2));if(this.xhr){this.xhr.abort();delete this.xhr}this._cleanup();return this},url:function(c,e){this.anchors.eq(c).removeData("cache.tabs").data("load.tabs",e);return this},length:function(){return this.anchors.length}});d.extend(d.ui.tabs,{version:"1.8.2"});d.extend(d.ui.tabs.prototype,{rotation:null,rotate:function(c,e){var a=this,b=this.options,h=a._rotate||(a._rotate=
+function(i){clearTimeout(a.rotation);a.rotation=setTimeout(function(){var k=b.selected;a.select(++k<a.anchors.length?k:0)},c);i&&i.stopPropagation()});e=a._unrotate||(a._unrotate=!e?function(i){i.clientX&&a.rotate(null)}:function(){t=b.selected;h()});if(c){this.element.bind("tabsshow",h);this.anchors.bind(b.event+".tabs",e);h()}else{clearTimeout(a.rotation);this.element.unbind("tabsshow",h);this.anchors.unbind(b.event+".tabs",e);delete this._rotate;delete this._unrotate}return this}})})(jQuery);
+;/*
+ * jQuery UI Effects 1.8.2
+ *
+ * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT (MIT-LICENSE.txt)
+ * and GPL (GPL-LICENSE.txt) licenses.
+ *
+ * http://docs.jquery.com/UI/Effects/
+ */
+jQuery.effects||function(f){function k(c){var a;if(c&&c.constructor==Array&&c.length==3)return c;if(a=/rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(c))return[parseInt(a[1],10),parseInt(a[2],10),parseInt(a[3],10)];if(a=/rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(c))return[parseFloat(a[1])*2.55,parseFloat(a[2])*2.55,parseFloat(a[3])*2.55];if(a=/#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(c))return[parseInt(a[1],
+16),parseInt(a[2],16),parseInt(a[3],16)];if(a=/#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(c))return[parseInt(a[1]+a[1],16),parseInt(a[2]+a[2],16),parseInt(a[3]+a[3],16)];if(/rgba\(0, 0, 0, 0\)/.exec(c))return l.transparent;return l[f.trim(c).toLowerCase()]}function q(c,a){var b;do{b=f.curCSS(c,a);if(b!=""&&b!="transparent"||f.nodeName(c,"body"))break;a="backgroundColor"}while(c=c.parentNode);return k(b)}function m(){var c=document.defaultView?document.defaultView.getComputedStyle(this,null):this.currentStyle,
+a={},b,d;if(c&&c.length&&c[0]&&c[c[0]])for(var e=c.length;e--;){b=c[e];if(typeof c[b]=="string"){d=b.replace(/\-(\w)/g,function(g,h){return h.toUpperCase()});a[d]=c[b]}}else for(b in c)if(typeof c[b]==="string")a[b]=c[b];return a}function n(c){var a,b;for(a in c){b=c[a];if(b==null||f.isFunction(b)||a in r||/scrollbar/.test(a)||!/color/i.test(a)&&isNaN(parseFloat(b)))delete c[a]}return c}function s(c,a){var b={_:0},d;for(d in a)if(c[d]!=a[d])b[d]=a[d];return b}function j(c,a,b,d){if(typeof c=="object"){d=
+a;b=null;a=c;c=a.effect}if(f.isFunction(a)){d=a;b=null;a={}}if(f.isFunction(b)){d=b;b=null}if(typeof a=="number"||f.fx.speeds[a]){d=b;b=a;a={}}a=a||{};b=b||a.duration;b=f.fx.off?0:typeof b=="number"?b:f.fx.speeds[b]||f.fx.speeds._default;d=d||a.complete;return[c,a,b,d]}f.effects={};f.each(["backgroundColor","borderBottomColor","borderLeftColor","borderRightColor","borderTopColor","color","outlineColor"],function(c,a){f.fx.step[a]=function(b){if(!b.colorInit){b.start=q(b.elem,a);b.end=k(b.end);b.colorInit=
+true}b.elem.style[a]="rgb("+Math.max(Math.min(parseInt(b.pos*(b.end[0]-b.start[0])+b.start[0],10),255),0)+","+Math.max(Math.min(parseInt(b.pos*(b.end[1]-b.start[1])+b.start[1],10),255),0)+","+Math.max(Math.min(parseInt(b.pos*(b.end[2]-b.start[2])+b.start[2],10),255),0)+")"}});var l={aqua:[0,255,255],azure:[240,255,255],beige:[245,245,220],black:[0,0,0],blue:[0,0,255],brown:[165,42,42],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgrey:[169,169,169],darkgreen:[0,100,0],darkkhaki:[189,
+183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkviolet:[148,0,211],fuchsia:[255,0,255],gold:[255,215,0],green:[0,128,0],indigo:[75,0,130],khaki:[240,230,140],lightblue:[173,216,230],lightcyan:[224,255,255],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightyellow:[255,255,224],lime:[0,255,0],magenta:[255,0,255],maroon:[128,0,0],navy:[0,0,128],olive:[128,128,0],orange:[255,
+165,0],pink:[255,192,203],purple:[128,0,128],violet:[128,0,128],red:[255,0,0],silver:[192,192,192],white:[255,255,255],yellow:[255,255,0],transparent:[255,255,255]},o=["add","remove","toggle"],r={border:1,borderBottom:1,borderColor:1,borderLeft:1,borderRight:1,borderTop:1,borderWidth:1,margin:1,padding:1};f.effects.animateClass=function(c,a,b,d){if(f.isFunction(b)){d=b;b=null}return this.each(function(){var e=f(this),g=e.attr("style")||" ",h=n(m.call(this)),p,t=e.attr("className");f.each(o,function(u,
+i){c[i]&&e[i+"Class"](c[i])});p=n(m.call(this));e.attr("className",t);e.animate(s(h,p),a,b,function(){f.each(o,function(u,i){c[i]&&e[i+"Class"](c[i])});if(typeof e.attr("style")=="object"){e.attr("style").cssText="";e.attr("style").cssText=g}else e.attr("style",g);d&&d.apply(this,arguments)})})};f.fn.extend({_addClass:f.fn.addClass,addClass:function(c,a,b,d){return a?f.effects.animateClass.apply(this,[{add:c},a,b,d]):this._addClass(c)},_removeClass:f.fn.removeClass,removeClass:function(c,a,b,d){return a?
+f.effects.animateClass.apply(this,[{remove:c},a,b,d]):this._removeClass(c)},_toggleClass:f.fn.toggleClass,toggleClass:function(c,a,b,d,e){return typeof a=="boolean"||a===undefined?b?f.effects.animateClass.apply(this,[a?{add:c}:{remove:c},b,d,e]):this._toggleClass(c,a):f.effects.animateClass.apply(this,[{toggle:c},a,b,d])},switchClass:function(c,a,b,d,e){return f.effects.animateClass.apply(this,[{add:a,remove:c},b,d,e])}});f.extend(f.effects,{version:"1.8.2",save:function(c,a){for(var b=0;b<a.length;b++)a[b]!==
+null&&c.data("ec.storage."+a[b],c[0].style[a[b]])},restore:function(c,a){for(var b=0;b<a.length;b++)a[b]!==null&&c.css(a[b],c.data("ec.storage."+a[b]))},setMode:function(c,a){if(a=="toggle")a=c.is(":hidden")?"show":"hide";return a},getBaseline:function(c,a){var b;switch(c[0]){case "top":b=0;break;case "middle":b=0.5;break;case "bottom":b=1;break;default:b=c[0]/a.height}switch(c[1]){case "left":c=0;break;case "center":c=0.5;break;case "right":c=1;break;default:c=c[1]/a.width}return{x:c,y:b}},createWrapper:function(c){if(c.parent().is(".ui-effects-wrapper"))return c.parent();
+var a={width:c.outerWidth(true),height:c.outerHeight(true),"float":c.css("float")},b=f("<div></div>").addClass("ui-effects-wrapper").css({fontSize:"100%",background:"transparent",border:"none",margin:0,padding:0});c.wrap(b);b=c.parent();if(c.css("position")=="static"){b.css({position:"relative"});c.css({position:"relative"})}else{f.extend(a,{position:c.css("position"),zIndex:c.css("z-index")});f.each(["top","left","bottom","right"],function(d,e){a[e]=c.css(e);if(isNaN(parseInt(a[e],10)))a[e]="auto"});
+c.css({position:"relative",top:0,left:0})}return b.css(a).show()},removeWrapper:function(c){if(c.parent().is(".ui-effects-wrapper"))return c.parent().replaceWith(c);return c},setTransition:function(c,a,b,d){d=d||{};f.each(a,function(e,g){unit=c.cssUnit(g);if(unit[0]>0)d[g]=unit[0]*b+unit[1]});return d}});f.fn.extend({effect:function(c){var a=j.apply(this,arguments);a={options:a[1],duration:a[2],callback:a[3]};var b=f.effects[c];return b&&!f.fx.off?b.call(this,a):this},_show:f.fn.show,show:function(c){if(!c||
+typeof c=="number"||f.fx.speeds[c])return this._show.apply(this,arguments);else{var a=j.apply(this,arguments);a[1].mode="show";return this.effect.apply(this,a)}},_hide:f.fn.hide,hide:function(c){if(!c||typeof c=="number"||f.fx.speeds[c])return this._hide.apply(this,arguments);else{var a=j.apply(this,arguments);a[1].mode="hide";return this.effect.apply(this,a)}},__toggle:f.fn.toggle,toggle:function(c){if(!c||typeof c=="number"||f.fx.speeds[c]||typeof c=="boolean"||f.isFunction(c))return this.__toggle.apply(this,
+arguments);else{var a=j.apply(this,arguments);a[1].mode="toggle";return this.effect.apply(this,a)}},cssUnit:function(c){var a=this.css(c),b=[];f.each(["em","px","%","pt"],function(d,e){if(a.indexOf(e)>0)b=[parseFloat(a),e]});return b}});f.easing.jswing=f.easing.swing;f.extend(f.easing,{def:"easeOutQuad",swing:function(c,a,b,d,e){return f.easing[f.easing.def](c,a,b,d,e)},easeInQuad:function(c,a,b,d,e){return d*(a/=e)*a+b},easeOutQuad:function(c,a,b,d,e){return-d*(a/=e)*(a-2)+b},easeInOutQuad:function(c,
+a,b,d,e){if((a/=e/2)<1)return d/2*a*a+b;return-d/2*(--a*(a-2)-1)+b},easeInCubic:function(c,a,b,d,e){return d*(a/=e)*a*a+b},easeOutCubic:function(c,a,b,d,e){return d*((a=a/e-1)*a*a+1)+b},easeInOutCubic:function(c,a,b,d,e){if((a/=e/2)<1)return d/2*a*a*a+b;return d/2*((a-=2)*a*a+2)+b},easeInQuart:function(c,a,b,d,e){return d*(a/=e)*a*a*a+b},easeOutQuart:function(c,a,b,d,e){return-d*((a=a/e-1)*a*a*a-1)+b},easeInOutQuart:function(c,a,b,d,e){if((a/=e/2)<1)return d/2*a*a*a*a+b;return-d/2*((a-=2)*a*a*a-2)+
+b},easeInQuint:function(c,a,b,d,e){return d*(a/=e)*a*a*a*a+b},easeOutQuint:function(c,a,b,d,e){return d*((a=a/e-1)*a*a*a*a+1)+b},easeInOutQuint:function(c,a,b,d,e){if((a/=e/2)<1)return d/2*a*a*a*a*a+b;return d/2*((a-=2)*a*a*a*a+2)+b},easeInSine:function(c,a,b,d,e){return-d*Math.cos(a/e*(Math.PI/2))+d+b},easeOutSine:function(c,a,b,d,e){return d*Math.sin(a/e*(Math.PI/2))+b},easeInOutSine:function(c,a,b,d,e){return-d/2*(Math.cos(Math.PI*a/e)-1)+b},easeInExpo:function(c,a,b,d,e){return a==0?b:d*Math.pow(2,
+10*(a/e-1))+b},easeOutExpo:function(c,a,b,d,e){return a==e?b+d:d*(-Math.pow(2,-10*a/e)+1)+b},easeInOutExpo:function(c,a,b,d,e){if(a==0)return b;if(a==e)return b+d;if((a/=e/2)<1)return d/2*Math.pow(2,10*(a-1))+b;return d/2*(-Math.pow(2,-10*--a)+2)+b},easeInCirc:function(c,a,b,d,e){return-d*(Math.sqrt(1-(a/=e)*a)-1)+b},easeOutCirc:function(c,a,b,d,e){return d*Math.sqrt(1-(a=a/e-1)*a)+b},easeInOutCirc:function(c,a,b,d,e){if((a/=e/2)<1)return-d/2*(Math.sqrt(1-a*a)-1)+b;return d/2*(Math.sqrt(1-(a-=2)*
+a)+1)+b},easeInElastic:function(c,a,b,d,e){c=1.70158;var g=0,h=d;if(a==0)return b;if((a/=e)==1)return b+d;g||(g=e*0.3);if(h<Math.abs(d)){h=d;c=g/4}else c=g/(2*Math.PI)*Math.asin(d/h);return-(h*Math.pow(2,10*(a-=1))*Math.sin((a*e-c)*2*Math.PI/g))+b},easeOutElastic:function(c,a,b,d,e){c=1.70158;var g=0,h=d;if(a==0)return b;if((a/=e)==1)return b+d;g||(g=e*0.3);if(h<Math.abs(d)){h=d;c=g/4}else c=g/(2*Math.PI)*Math.asin(d/h);return h*Math.pow(2,-10*a)*Math.sin((a*e-c)*2*Math.PI/g)+d+b},easeInOutElastic:function(c,
+a,b,d,e){c=1.70158;var g=0,h=d;if(a==0)return b;if((a/=e/2)==2)return b+d;g||(g=e*0.3*1.5);if(h<Math.abs(d)){h=d;c=g/4}else c=g/(2*Math.PI)*Math.asin(d/h);if(a<1)return-0.5*h*Math.pow(2,10*(a-=1))*Math.sin((a*e-c)*2*Math.PI/g)+b;return h*Math.pow(2,-10*(a-=1))*Math.sin((a*e-c)*2*Math.PI/g)*0.5+d+b},easeInBack:function(c,a,b,d,e,g){if(g==undefined)g=1.70158;return d*(a/=e)*a*((g+1)*a-g)+b},easeOutBack:function(c,a,b,d,e,g){if(g==undefined)g=1.70158;return d*((a=a/e-1)*a*((g+1)*a+g)+1)+b},easeInOutBack:function(c,
+a,b,d,e,g){if(g==undefined)g=1.70158;if((a/=e/2)<1)return d/2*a*a*(((g*=1.525)+1)*a-g)+b;return d/2*((a-=2)*a*(((g*=1.525)+1)*a+g)+2)+b},easeInBounce:function(c,a,b,d,e){return d-f.easing.easeOutBounce(c,e-a,0,d,e)+b},easeOutBounce:function(c,a,b,d,e){return(a/=e)<1/2.75?d*7.5625*a*a+b:a<2/2.75?d*(7.5625*(a-=1.5/2.75)*a+0.75)+b:a<2.5/2.75?d*(7.5625*(a-=2.25/2.75)*a+0.9375)+b:d*(7.5625*(a-=2.625/2.75)*a+0.984375)+b},easeInOutBounce:function(c,a,b,d,e){if(a<e/2)return f.easing.easeInBounce(c,a*2,0,
+d,e)*0.5+b;return f.easing.easeOutBounce(c,a*2-e,0,d,e)*0.5+d*0.5+b}})}(jQuery);
+;/*
+ * jQuery UI Effects Fold 1.8.2
+ *
+ * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT (MIT-LICENSE.txt)
+ * and GPL (GPL-LICENSE.txt) licenses.
+ *
+ * http://docs.jquery.com/UI/Effects/Fold
+ *
+ * Depends:
+ * jquery.effects.core.js
+ */
+(function(c){c.effects.fold=function(a){return this.queue(function(){var b=c(this),j=["position","top","left"],d=c.effects.setMode(b,a.options.mode||"hide"),g=a.options.size||15,h=!!a.options.horizFirst,k=a.duration?a.duration/2:c.fx.speeds._default/2;c.effects.save(b,j);b.show();var e=c.effects.createWrapper(b).css({overflow:"hidden"}),f=d=="show"!=h,l=f?["width","height"]:["height","width"];f=f?[e.width(),e.height()]:[e.height(),e.width()];var i=/([0-9]+)%/.exec(g);if(i)g=parseInt(i[1],10)/100*
+f[d=="hide"?0:1];if(d=="show")e.css(h?{height:0,width:g}:{height:g,width:0});h={};i={};h[l[0]]=d=="show"?f[0]:g;i[l[1]]=d=="show"?f[1]:0;e.animate(h,k,a.options.easing).animate(i,k,a.options.easing,function(){d=="hide"&&b.hide();c.effects.restore(b,j);c.effects.removeWrapper(b);a.callback&&a.callback.apply(b[0],arguments);b.dequeue()})})}})(jQuery);
+;/*
+ * jQuery Highlight plugin
+ * Based on highlight v3 by Johann Burkard
+ * http://johannburkard.de/blog/programming/javascript/highlight-javascript-text-higlighting-jquery-plugin.html
+ * Copyright (c) 2009 Bartek Szopka http://bartaz.github.com/sandbox.js/jquery.highlight.html
+ * Licensed under MIT license.
+ */
+jQuery.extend({highlight:function(a,c,b,e){if(a.nodeType===3){if(c=a.data.match(c)){b=document.createElement(b||"span");b.className=e||"highlight";a=a.splitText(c.index);a.splitText(c[0].length);e=a.cloneNode(true);b.appendChild(e);a.parentNode.replaceChild(b,a);return 1}}else if(a.nodeType===1&&a.childNodes&&!/(script|style)/i.test(a.tagName)&&!(a.tagName===b.toUpperCase()&&a.className===e))for(var d=0;d<a.childNodes.length;d++)d+=jQuery.highlight(a.childNodes[d],c,b,e);return 0}});
+jQuery.fn.unhighlight=function(a){var c={className:"highlight",element:"span"};jQuery.extend(c,a);return this.find(c.element+"."+c.className).each(function(){var b=this.parentNode;b.replaceChild(this.firstChild,this);b.normalize()}).end()};
+jQuery.fn.highlight=function(a,c){var b={className:"highlight",element:"span",caseSensitive:false,wordsOnly:false};jQuery.extend(b,c);if(a.constructor===String)a=[a];a=jQuery.grep(a,function(f){return f!=""});if(a.length==0)return this;var e=b.caseSensitive?"":"i",d="("+a.join("|")+")";if(b.wordsOnly)d="\\b"+d+"\\b";var g=RegExp(d,e);return this.each(function(){jQuery.highlight(this,g,b.element,b.className)})}; \ No newline at end of file
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/docs/common/jquery/jquery.cookie.js b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/docs/common/jquery/jquery.cookie.js
new file mode 100644
index 0000000..bada7bf
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/docs/common/jquery/jquery.cookie.js
@@ -0,0 +1,93 @@
+/**
+ * Cookie plugin
+ *
+ * Copyright (c) 2006 Klaus Hartl (stilbuero.de)
+ * Dual licensed under the MIT and GPL licenses:
+ * http://www.opensource.org/licenses/mit-license.php
+ * http://www.gnu.org/licenses/gpl.html
+ *
+ */
+
+/**
+ * Create a cookie with the given name and value and other optional parameters.
+ *
+ * @example $.cookie('the_cookie', 'the_value');
+ * @desc Set the value of a cookie.
+ * @example $.cookie('the_cookie', 'the_value', {expires: 7, path: '/', domain: 'jquery.com', secure: true});
+ * @desc Create a cookie with all available options.
+ * @example $.cookie('the_cookie', 'the_value');
+ * @desc Create a session cookie.
+ * @example $.cookie('the_cookie', null);
+ * @desc Delete a cookie by passing null as value.
+ *
+ * @param String name The name of the cookie.
+ * @param String value The value of the cookie.
+ * @param Object options An object literal containing key/value pairs to provide optional cookie attributes.
+ * @option Number|Date expires Either an integer specifying the expiration date from now on in days or a Date object.
+ * If a negative value is specified (e.g. a date in the past), the cookie will be deleted.
+ * If set to null or omitted, the cookie will be a session cookie and will not be retained
+ * when the the browser exits.
+ * @option String path The value of the path atribute of the cookie (default: path of page that created the cookie).
+ * @option String domain The value of the domain attribute of the cookie (default: domain of page that created the cookie).
+ * @option Boolean secure If true, the secure attribute of the cookie will be set and the cookie transmission will
+ * require a secure protocol (like HTTPS).
+ * @type undefined
+ *
+ * @name $.cookie
+ * @cat Plugins/Cookie
+ * @author Klaus Hartl/klaus.hartl@stilbuero.de
+ */
+
+/**
+ * Get the value of a cookie with the given name.
+ *
+ * @example $.cookie('the_cookie');
+ * @desc Get the value of a cookie.
+ *
+ * @param String name The name of the cookie.
+ * @return The value of the cookie.
+ * @type String
+ *
+ * @name $.cookie
+ * @cat Plugins/Cookie
+ * @author Klaus Hartl/klaus.hartl@stilbuero.de
+ */
+jQuery.cookie = function(name, value, options) {
+ if (typeof value != 'undefined') { // name and value given, set cookie
+ options = options || {};
+ if (value === null) {
+ value = '';
+ options.expires = -1;
+ }
+ var expires = '';
+ if (options.expires && (typeof options.expires == 'number' || options.expires.toUTCString)) {
+ var date;
+ if (typeof options.expires == 'number') {
+ date = new Date();
+ date.setTime(date.getTime() + (options.expires * 24 * 60 * 60 * 1000));
+ } else {
+ date = options.expires;
+ }
+ expires = '; expires=' + date.toUTCString(); // use expires attribute, max-age is not supported by IE
+ }
+ var path = options.path ? '; path=' + options.path : '';
+ var domain = options.domain ? '; domain=' + options.domain : '';
+ var secure = options.secure ? '; secure' : '';
+ document.cookie = [name, '=', encodeURIComponent(value), expires, path, domain, secure].join('');
+
+ } else { // only name given, get cookie
+ var cookieValue = null;
+ if (document.cookie && document.cookie != '') {
+ var cookies = document.cookie.split(';');
+ for (var i = 0; i < cookies.length; i++) {
+ var cookie = jQuery.trim(cookies[i]);
+ // Does this cookie string begin with the name we want?
+ if (cookie.substring(0, name.length + 1) == (name + '=')) {
+ cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
+ break;
+ }
+ }
+ }
+ return cookieValue;
+ }
+}; \ No newline at end of file
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/docs/common/jquery/theme-redmond/jquery-ui-1.8.2.custom.css b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/docs/common/jquery/theme-redmond/jquery-ui-1.8.2.custom.css
new file mode 100644
index 0000000..0b17363
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/docs/common/jquery/theme-redmond/jquery-ui-1.8.2.custom.css
@@ -0,0 +1,398 @@
+/*
+* jQuery UI CSS Framework
+* Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about)
+* Dual licensed under the MIT (MIT-LICENSE.txt) and GPL (GPL-LICENSE.txt) licenses.
+*/
+
+/* Layout helpers
+----------------------------------*/
+.ui-helper-hidden { display: none; }
+.ui-helper-hidden-accessible { position: absolute; left: -99999999px; }
+.ui-helper-reset { margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none; }
+.ui-helper-clearfix:after { content: "."; display: block; height: 0; clear: both; visibility: hidden; }
+.ui-helper-clearfix { display: inline-block; }
+/* required comment for clearfix to work in Opera \*/
+* html .ui-helper-clearfix { height:1%; }
+.ui-helper-clearfix { display:block; }
+/* end clearfix */
+.ui-helper-zfix { width: 100%; height: 100%; top: 0; left: 0; position: absolute; opacity: 0; filter:Alpha(Opacity=0); }
+
+
+/* Interaction Cues
+----------------------------------*/
+.ui-state-disabled { cursor: default !important; }
+
+
+/* Icons
+----------------------------------*/
+
+/* states and images */
+.ui-icon { display: block; text-indent: -99999px; overflow: hidden; background-repeat: no-repeat; }
+
+
+/* Misc visuals
+----------------------------------*/
+
+/* Overlays */
+.ui-widget-overlay { position: absolute; top: 0; left: 0; width: 100%; height: 100%; }
+
+
+/*
+* jQuery UI CSS Framework
+* Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about)
+* Dual licensed under the MIT (MIT-LICENSE.txt) and GPL (GPL-LICENSE.txt) licenses.
+* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Lucida%20Grande,%20Lucida%20Sans,%20Arial,%20sans-serif&fwDefault=bold&fsDefault=1.1em&cornerRadius=5px&bgColorHeader=5c9ccc&bgTextureHeader=12_gloss_wave.png&bgImgOpacityHeader=55&borderColorHeader=4297d7&fcHeader=ffffff&iconColorHeader=d8e7f3&bgColorContent=fcfdfd&bgTextureContent=06_inset_hard.png&bgImgOpacityContent=100&borderColorContent=a6c9e2&fcContent=222222&iconColorContent=469bdd&bgColorDefault=dfeffc&bgTextureDefault=02_glass.png&bgImgOpacityDefault=85&borderColorDefault=c5dbec&fcDefault=2e6e9e&iconColorDefault=6da8d5&bgColorHover=d0e5f5&bgTextureHover=02_glass.png&bgImgOpacityHover=75&borderColorHover=79b7e7&fcHover=1d5987&iconColorHover=217bc0&bgColorActive=f5f8f9&bgTextureActive=06_inset_hard.png&bgImgOpacityActive=100&borderColorActive=79b7e7&fcActive=e17009&iconColorActive=f9bd01&bgColorHighlight=fbec88&bgTextureHighlight=01_flat.png&bgImgOpacityHighlight=55&borderColorHighlight=fad42e&fcHighlight=363636&iconColorHighlight=2e83ff&bgColorError=fef1ec&bgTextureError=02_glass.png&bgImgOpacityError=95&borderColorError=cd0a0a&fcError=cd0a0a&iconColorError=cd0a0a&bgColorOverlay=aaaaaa&bgTextureOverlay=01_flat.png&bgImgOpacityOverlay=0&opacityOverlay=30&bgColorShadow=aaaaaa&bgTextureShadow=01_flat.png&bgImgOpacityShadow=0&opacityShadow=30&thicknessShadow=8px&offsetTopShadow=-8px&offsetLeftShadow=-8px&cornerRadiusShadow=8px
+*/
+
+
+/* Component containers
+----------------------------------*/
+.ui-widget { font-family: Lucida Grande, Lucida Sans, Arial, sans-serif; font-size: 1.1em; }
+.ui-widget .ui-widget { font-size: 1em; }
+.ui-widget input, .ui-widget select, .ui-widget textarea, .ui-widget button { font-family: Lucida Grande, Lucida Sans, Arial, sans-serif; font-size: 1em; }
+.ui-widget-content { border: 1px solid #a6c9e2; background: #fcfdfd url(images/ui-bg_inset-hard_100_fcfdfd_1x100.png) 50% bottom repeat-x; color: #222222; }
+.ui-widget-content a { color: #222222; }
+.ui-widget-header { border: 1px solid #4297d7; background: #5c9ccc url(images/ui-bg_gloss-wave_55_5c9ccc_500x100.png) 50% 50% repeat-x; color: #ffffff; font-weight: bold; }
+.ui-widget-header a { color: #ffffff; }
+
+/* Interaction states
+----------------------------------*/
+.ui-state-default, .ui-widget-content .ui-state-default, .ui-widget-header .ui-state-default { border: 1px solid #c5dbec; background: #dfeffc url(images/ui-bg_glass_85_dfeffc_1x400.png) 50% 50% repeat-x; font-weight: bold; color: #2e6e9e; }
+.ui-state-default a, .ui-state-default a:link, .ui-state-default a:visited { color: #2e6e9e; text-decoration: none; }
+.ui-state-hover, .ui-widget-content .ui-state-hover, .ui-widget-header .ui-state-hover, .ui-state-focus, .ui-widget-content .ui-state-focus, .ui-widget-header .ui-state-focus { border: 1px solid #79b7e7; background: #d0e5f5 url(images/ui-bg_glass_75_d0e5f5_1x400.png) 50% 50% repeat-x; font-weight: bold; color: #1d5987; }
+.ui-state-hover a, .ui-state-hover a:hover { color: #1d5987; text-decoration: none; }
+.ui-state-active, .ui-widget-content .ui-state-active, .ui-widget-header .ui-state-active { border: 1px solid #79b7e7; background: #f5f8f9 url(images/ui-bg_inset-hard_100_f5f8f9_1x100.png) 50% 50% repeat-x; font-weight: bold; color: #e17009; }
+.ui-state-active a, .ui-state-active a:link, .ui-state-active a:visited { color: #e17009; text-decoration: none; }
+.ui-widget :active { outline: none; }
+
+/* Interaction Cues
+----------------------------------*/
+.ui-state-highlight, .ui-widget-content .ui-state-highlight, .ui-widget-header .ui-state-highlight {border: 1px solid #fad42e; background: #fbec88 url(images/ui-bg_flat_55_fbec88_40x100.png) 50% 50% repeat-x; color: #363636; }
+.ui-state-highlight a, .ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a { color: #363636; }
+.ui-state-error, .ui-widget-content .ui-state-error, .ui-widget-header .ui-state-error {border: 1px solid #cd0a0a; background: #fef1ec url(images/ui-bg_glass_95_fef1ec_1x400.png) 50% 50% repeat-x; color: #cd0a0a; }
+.ui-state-error a, .ui-widget-content .ui-state-error a, .ui-widget-header .ui-state-error a { color: #cd0a0a; }
+.ui-state-error-text, .ui-widget-content .ui-state-error-text, .ui-widget-header .ui-state-error-text { color: #cd0a0a; }
+.ui-priority-primary, .ui-widget-content .ui-priority-primary, .ui-widget-header .ui-priority-primary { font-weight: bold; }
+.ui-priority-secondary, .ui-widget-content .ui-priority-secondary, .ui-widget-header .ui-priority-secondary { opacity: .7; filter:Alpha(Opacity=70); font-weight: normal; }
+.ui-state-disabled, .ui-widget-content .ui-state-disabled, .ui-widget-header .ui-state-disabled { opacity: .35; filter:Alpha(Opacity=35); background-image: none; }
+
+/* Icons
+----------------------------------*/
+
+/* states and images */
+.ui-icon { width: 16px; height: 16px; background-image: url(images/ui-icons_469bdd_256x240.png); }
+.ui-widget-content .ui-icon {background-image: url(images/ui-icons_469bdd_256x240.png); }
+.ui-widget-header .ui-icon {background-image: url(images/ui-icons_d8e7f3_256x240.png); }
+.ui-state-default .ui-icon { background-image: url(images/ui-icons_6da8d5_256x240.png); }
+.ui-state-hover .ui-icon, .ui-state-focus .ui-icon {background-image: url(images/ui-icons_217bc0_256x240.png); }
+.ui-state-active .ui-icon {background-image: url(images/ui-icons_f9bd01_256x240.png); }
+.ui-state-highlight .ui-icon {background-image: url(images/ui-icons_2e83ff_256x240.png); }
+.ui-state-error .ui-icon, .ui-state-error-text .ui-icon {background-image: url(images/ui-icons_cd0a0a_256x240.png); }
+
+/* positioning */
+.ui-icon-carat-1-n { background-position: 0 0; }
+.ui-icon-carat-1-ne { background-position: -16px 0; }
+.ui-icon-carat-1-e { background-position: -32px 0; }
+.ui-icon-carat-1-se { background-position: -48px 0; }
+.ui-icon-carat-1-s { background-position: -64px 0; }
+.ui-icon-carat-1-sw { background-position: -80px 0; }
+.ui-icon-carat-1-w { background-position: -96px 0; }
+.ui-icon-carat-1-nw { background-position: -112px 0; }
+.ui-icon-carat-2-n-s { background-position: -128px 0; }
+.ui-icon-carat-2-e-w { background-position: -144px 0; }
+.ui-icon-triangle-1-n { background-position: 0 -16px; }
+.ui-icon-triangle-1-ne { background-position: -16px -16px; }
+.ui-icon-triangle-1-e { background-position: -32px -16px; }
+.ui-icon-triangle-1-se { background-position: -48px -16px; }
+.ui-icon-triangle-1-s { background-position: -64px -16px; }
+.ui-icon-triangle-1-sw { background-position: -80px -16px; }
+.ui-icon-triangle-1-w { background-position: -96px -16px; }
+.ui-icon-triangle-1-nw { background-position: -112px -16px; }
+.ui-icon-triangle-2-n-s { background-position: -128px -16px; }
+.ui-icon-triangle-2-e-w { background-position: -144px -16px; }
+.ui-icon-arrow-1-n { background-position: 0 -32px; }
+.ui-icon-arrow-1-ne { background-position: -16px -32px; }
+.ui-icon-arrow-1-e { background-position: -32px -32px; }
+.ui-icon-arrow-1-se { background-position: -48px -32px; }
+.ui-icon-arrow-1-s { background-position: -64px -32px; }
+.ui-icon-arrow-1-sw { background-position: -80px -32px; }
+.ui-icon-arrow-1-w { background-position: -96px -32px; }
+.ui-icon-arrow-1-nw { background-position: -112px -32px; }
+.ui-icon-arrow-2-n-s { background-position: -128px -32px; }
+.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }
+.ui-icon-arrow-2-e-w { background-position: -160px -32px; }
+.ui-icon-arrow-2-se-nw { background-position: -176px -32px; }
+.ui-icon-arrowstop-1-n { background-position: -192px -32px; }
+.ui-icon-arrowstop-1-e { background-position: -208px -32px; }
+.ui-icon-arrowstop-1-s { background-position: -224px -32px; }
+.ui-icon-arrowstop-1-w { background-position: -240px -32px; }
+.ui-icon-arrowthick-1-n { background-position: 0 -48px; }
+.ui-icon-arrowthick-1-ne { background-position: -16px -48px; }
+.ui-icon-arrowthick-1-e { background-position: -32px -48px; }
+.ui-icon-arrowthick-1-se { background-position: -48px -48px; }
+.ui-icon-arrowthick-1-s { background-position: -64px -48px; }
+.ui-icon-arrowthick-1-sw { background-position: -80px -48px; }
+.ui-icon-arrowthick-1-w { background-position: -96px -48px; }
+.ui-icon-arrowthick-1-nw { background-position: -112px -48px; }
+.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }
+.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }
+.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }
+.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }
+.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }
+.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }
+.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }
+.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }
+.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }
+.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }
+.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }
+.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }
+.ui-icon-arrowreturn-1-w { background-position: -64px -64px; }
+.ui-icon-arrowreturn-1-n { background-position: -80px -64px; }
+.ui-icon-arrowreturn-1-e { background-position: -96px -64px; }
+.ui-icon-arrowreturn-1-s { background-position: -112px -64px; }
+.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }
+.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }
+.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }
+.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }
+.ui-icon-arrow-4 { background-position: 0 -80px; }
+.ui-icon-arrow-4-diag { background-position: -16px -80px; }
+.ui-icon-extlink { background-position: -32px -80px; }
+.ui-icon-newwin { background-position: -48px -80px; }
+.ui-icon-refresh { background-position: -64px -80px; }
+.ui-icon-shuffle { background-position: -80px -80px; }
+.ui-icon-transfer-e-w { background-position: -96px -80px; }
+.ui-icon-transferthick-e-w { background-position: -112px -80px; }
+.ui-icon-folder-collapsed { background-position: 0 -96px; }
+.ui-icon-folder-open { background-position: -16px -96px; }
+.ui-icon-document { background-position: -32px -96px; }
+.ui-icon-document-b { background-position: -48px -96px; }
+.ui-icon-note { background-position: -64px -96px; }
+.ui-icon-mail-closed { background-position: -80px -96px; }
+.ui-icon-mail-open { background-position: -96px -96px; }
+.ui-icon-suitcase { background-position: -112px -96px; }
+.ui-icon-comment { background-position: -128px -96px; }
+.ui-icon-person { background-position: -144px -96px; }
+.ui-icon-print { background-position: -160px -96px; }
+.ui-icon-trash { background-position: -176px -96px; }
+.ui-icon-locked { background-position: -192px -96px; }
+.ui-icon-unlocked { background-position: -208px -96px; }
+.ui-icon-bookmark { background-position: -224px -96px; }
+.ui-icon-tag { background-position: -240px -96px; }
+.ui-icon-home { background-position: 0 -112px; }
+.ui-icon-flag { background-position: -16px -112px; }
+.ui-icon-calendar { background-position: -32px -112px; }
+.ui-icon-cart { background-position: -48px -112px; }
+.ui-icon-pencil { background-position: -64px -112px; }
+.ui-icon-clock { background-position: -80px -112px; }
+.ui-icon-disk { background-position: -96px -112px; }
+.ui-icon-calculator { background-position: -112px -112px; }
+.ui-icon-zoomin { background-position: -128px -112px; }
+.ui-icon-zoomout { background-position: -144px -112px; }
+.ui-icon-search { background-position: -160px -112px; }
+.ui-icon-wrench { background-position: -176px -112px; }
+.ui-icon-gear { background-position: -192px -112px; }
+.ui-icon-heart { background-position: -208px -112px; }
+.ui-icon-star { background-position: -224px -112px; }
+.ui-icon-link { background-position: -240px -112px; }
+.ui-icon-cancel { background-position: 0 -128px; }
+.ui-icon-plus { background-position: -16px -128px; }
+.ui-icon-plusthick { background-position: -32px -128px; }
+.ui-icon-minus { background-position: -48px -128px; }
+.ui-icon-minusthick { background-position: -64px -128px; }
+.ui-icon-close { background-position: -80px -128px; }
+.ui-icon-closethick { background-position: -96px -128px; }
+.ui-icon-key { background-position: -112px -128px; }
+.ui-icon-lightbulb { background-position: -128px -128px; }
+.ui-icon-scissors { background-position: -144px -128px; }
+.ui-icon-clipboard { background-position: -160px -128px; }
+.ui-icon-copy { background-position: -176px -128px; }
+.ui-icon-contact { background-position: -192px -128px; }
+.ui-icon-image { background-position: -208px -128px; }
+.ui-icon-video { background-position: -224px -128px; }
+.ui-icon-script { background-position: -240px -128px; }
+.ui-icon-alert { background-position: 0 -144px; }
+.ui-icon-info { background-position: -16px -144px; }
+.ui-icon-notice { background-position: -32px -144px; }
+.ui-icon-help { background-position: -48px -144px; }
+.ui-icon-check { background-position: -64px -144px; }
+.ui-icon-bullet { background-position: -80px -144px; }
+.ui-icon-radio-off { background-position: -96px -144px; }
+.ui-icon-radio-on { background-position: -112px -144px; }
+.ui-icon-pin-w { background-position: -128px -144px; }
+.ui-icon-pin-s { background-position: -144px -144px; }
+.ui-icon-play { background-position: 0 -160px; }
+.ui-icon-pause { background-position: -16px -160px; }
+.ui-icon-seek-next { background-position: -32px -160px; }
+.ui-icon-seek-prev { background-position: -48px -160px; }
+.ui-icon-seek-end { background-position: -64px -160px; }
+.ui-icon-seek-start { background-position: -80px -160px; }
+/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */
+.ui-icon-seek-first { background-position: -80px -160px; }
+.ui-icon-stop { background-position: -96px -160px; }
+.ui-icon-eject { background-position: -112px -160px; }
+.ui-icon-volume-off { background-position: -128px -160px; }
+.ui-icon-volume-on { background-position: -144px -160px; }
+.ui-icon-power { background-position: 0 -176px; }
+.ui-icon-signal-diag { background-position: -16px -176px; }
+.ui-icon-signal { background-position: -32px -176px; }
+.ui-icon-battery-0 { background-position: -48px -176px; }
+.ui-icon-battery-1 { background-position: -64px -176px; }
+.ui-icon-battery-2 { background-position: -80px -176px; }
+.ui-icon-battery-3 { background-position: -96px -176px; }
+.ui-icon-circle-plus { background-position: 0 -192px; }
+.ui-icon-circle-minus { background-position: -16px -192px; }
+.ui-icon-circle-close { background-position: -32px -192px; }
+.ui-icon-circle-triangle-e { background-position: -48px -192px; }
+.ui-icon-circle-triangle-s { background-position: -64px -192px; }
+.ui-icon-circle-triangle-w { background-position: -80px -192px; }
+.ui-icon-circle-triangle-n { background-position: -96px -192px; }
+.ui-icon-circle-arrow-e { background-position: -112px -192px; }
+.ui-icon-circle-arrow-s { background-position: -128px -192px; }
+.ui-icon-circle-arrow-w { background-position: -144px -192px; }
+.ui-icon-circle-arrow-n { background-position: -160px -192px; }
+.ui-icon-circle-zoomin { background-position: -176px -192px; }
+.ui-icon-circle-zoomout { background-position: -192px -192px; }
+.ui-icon-circle-check { background-position: -208px -192px; }
+.ui-icon-circlesmall-plus { background-position: 0 -208px; }
+.ui-icon-circlesmall-minus { background-position: -16px -208px; }
+.ui-icon-circlesmall-close { background-position: -32px -208px; }
+.ui-icon-squaresmall-plus { background-position: -48px -208px; }
+.ui-icon-squaresmall-minus { background-position: -64px -208px; }
+.ui-icon-squaresmall-close { background-position: -80px -208px; }
+.ui-icon-grip-dotted-vertical { background-position: 0 -224px; }
+.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }
+.ui-icon-grip-solid-vertical { background-position: -32px -224px; }
+.ui-icon-grip-solid-horizontal { background-position: -48px -224px; }
+.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }
+.ui-icon-grip-diagonal-se { background-position: -80px -224px; }
+
+
+/* Misc visuals
+----------------------------------*/
+
+/* Corner radius */
+.ui-corner-tl { -moz-border-radius-topleft: 5px; -webkit-border-top-left-radius: 5px; border-top-left-radius: 5px; }
+.ui-corner-tr { -moz-border-radius-topright: 5px; -webkit-border-top-right-radius: 5px; border-top-right-radius: 5px; }
+.ui-corner-bl { -moz-border-radius-bottomleft: 5px; -webkit-border-bottom-left-radius: 5px; border-bottom-left-radius: 5px; }
+.ui-corner-br { -moz-border-radius-bottomright: 5px; -webkit-border-bottom-right-radius: 5px; border-bottom-right-radius: 5px; }
+.ui-corner-top { -moz-border-radius-topleft: 5px; -webkit-border-top-left-radius: 5px; border-top-left-radius: 5px; -moz-border-radius-topright: 5px; -webkit-border-top-right-radius: 5px; border-top-right-radius: 5px; }
+.ui-corner-bottom { -moz-border-radius-bottomleft: 5px; -webkit-border-bottom-left-radius: 5px; border-bottom-left-radius: 5px; -moz-border-radius-bottomright: 5px; -webkit-border-bottom-right-radius: 5px; border-bottom-right-radius: 5px; }
+.ui-corner-right { -moz-border-radius-topright: 5px; -webkit-border-top-right-radius: 5px; border-top-right-radius: 5px; -moz-border-radius-bottomright: 5px; -webkit-border-bottom-right-radius: 5px; border-bottom-right-radius: 5px; }
+.ui-corner-left { -moz-border-radius-topleft: 5px; -webkit-border-top-left-radius: 5px; border-top-left-radius: 5px; -moz-border-radius-bottomleft: 5px; -webkit-border-bottom-left-radius: 5px; border-bottom-left-radius: 5px; }
+.ui-corner-all { -moz-border-radius: 5px; -webkit-border-radius: 5px; border-radius: 5px; }
+
+/* Overlays */
+.ui-widget-overlay { background: #aaaaaa url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x; opacity: .30;filter:Alpha(Opacity=30); }
+.ui-widget-shadow { margin: -8px 0 0 -8px; padding: 8px; background: #aaaaaa url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x; opacity: .30;filter:Alpha(Opacity=30); -moz-border-radius: 8px; -webkit-border-radius: 8px; border-radius: 8px; }/* Resizable
+----------------------------------*/
+.ui-resizable { position: relative;}
+.ui-resizable-handle { position: absolute;font-size: 0.1px;z-index: 99999; display: block;}
+.ui-resizable-disabled .ui-resizable-handle, .ui-resizable-autohide .ui-resizable-handle { display: none; }
+.ui-resizable-n { cursor: n-resize; height: 7px; width: 100%; top: -5px; left: 0; }
+.ui-resizable-s { cursor: s-resize; height: 7px; width: 100%; bottom: -5px; left: 0; }
+.ui-resizable-e { cursor: e-resize; width: 7px; right: -5px; top: 0; height: 100%; }
+.ui-resizable-w { cursor: w-resize; width: 7px; left: -5px; top: 0; height: 100%; }
+.ui-resizable-se { cursor: se-resize; width: 12px; height: 12px; right: 1px; bottom: 1px; }
+.ui-resizable-sw { cursor: sw-resize; width: 9px; height: 9px; left: -5px; bottom: -5px; }
+.ui-resizable-nw { cursor: nw-resize; width: 9px; height: 9px; left: -5px; top: -5px; }
+.ui-resizable-ne { cursor: ne-resize; width: 9px; height: 9px; right: -5px; top: -5px;}/* Selectable
+----------------------------------*/
+.ui-selectable-helper { border:1px dotted black }
+/* Autocomplete
+----------------------------------*/
+.ui-autocomplete { position: absolute; cursor: default; }
+.ui-autocomplete-loading { background: white url('images/ui-anim_basic_16x16.gif') right center no-repeat; }
+
+/* workarounds */
+* html .ui-autocomplete { width:1px; } /* without this, the menu expands to 100% in IE6 */
+
+/* Menu
+----------------------------------*/
+.ui-menu {
+ list-style:none;
+ padding: 2px;
+ margin: 0;
+ display:block;
+}
+.ui-menu .ui-menu {
+ margin-top: -3px;
+}
+.ui-menu .ui-menu-item {
+ margin:0;
+ padding: 0;
+ zoom: 1;
+ float: left;
+ clear: left;
+ width: 100%;
+}
+.ui-menu .ui-menu-item a {
+ text-decoration:none;
+ display:block;
+ padding:.2em .4em;
+ line-height:1.5;
+ zoom:1;
+}
+.ui-menu .ui-menu-item a.ui-state-hover,
+.ui-menu .ui-menu-item a.ui-state-active {
+ font-weight: normal;
+ margin: -1px;
+}
+/* Button
+----------------------------------*/
+
+.ui-button { display: inline-block; position: relative; padding: 0; margin-right: .1em; text-decoration: none !important; cursor: pointer; text-align: center; zoom: 1; overflow: visible; } /* the overflow property removes extra width in IE */
+.ui-button-icon-only { width: 2.2em; } /* to make room for the icon, a width needs to be set here */
+button.ui-button-icon-only { width: 2.4em; } /* button elements seem to need a little more width */
+.ui-button-icons-only { width: 3.4em; }
+button.ui-button-icons-only { width: 3.7em; }
+
+/*button text element */
+.ui-button .ui-button-text { display: block; line-height: 1.4; }
+.ui-button-text-only .ui-button-text { padding: .4em 1em; }
+.ui-button-icon-only .ui-button-text, .ui-button-icons-only .ui-button-text { padding: .4em; text-indent: -9999999px; }
+.ui-button-text-icon .ui-button-text, .ui-button-text-icons .ui-button-text { padding: .4em 1em .4em 2.1em; }
+.ui-button-text-icons .ui-button-text { padding-left: 2.1em; padding-right: 2.1em; }
+/* no icon support for input elements, provide padding by default */
+input.ui-button { padding: .4em 1em; }
+
+/*button icon element(s) */
+.ui-button-icon-only .ui-icon, .ui-button-text-icon .ui-icon, .ui-button-text-icons .ui-icon, .ui-button-icons-only .ui-icon { position: absolute; top: 50%; margin-top: -8px; }
+.ui-button-icon-only .ui-icon { left: 50%; margin-left: -8px; }
+.ui-button-text-icon .ui-button-icon-primary, .ui-button-text-icons .ui-button-icon-primary, .ui-button-icons-only .ui-button-icon-primary { left: .5em; }
+.ui-button-text-icons .ui-button-icon-secondary, .ui-button-icons-only .ui-button-icon-secondary { right: .5em; }
+
+/*button sets*/
+.ui-buttonset { margin-right: 7px; }
+.ui-buttonset .ui-button { margin-left: 0; margin-right: -.3em; }
+
+/* workarounds */
+button.ui-button::-moz-focus-inner { border: 0; padding: 0; } /* reset extra padding in Firefox */
+
+
+
+
+
+/* Dialog
+----------------------------------*/
+.ui-dialog { position: absolute; padding: .2em; width: 300px; overflow: hidden; }
+.ui-dialog .ui-dialog-titlebar { padding: .5em 1em .3em; position: relative; }
+.ui-dialog .ui-dialog-title { float: left; margin: .1em 16px .2em 0; }
+.ui-dialog .ui-dialog-titlebar-close { position: absolute; right: .3em; top: 50%; width: 19px; margin: -10px 0 0 0; padding: 1px; height: 18px; }
+.ui-dialog .ui-dialog-titlebar-close span { display: block; margin: 1px; }
+.ui-dialog .ui-dialog-titlebar-close:hover, .ui-dialog .ui-dialog-titlebar-close:focus { padding: 0; }
+.ui-dialog .ui-dialog-content { border: 0; padding: .5em 1em; background: none; overflow: auto; zoom: 1; }
+.ui-dialog .ui-dialog-buttonpane { text-align: left; border-width: 1px 0 0 0; background-image: none; margin: .5em 0 0 0; padding: .3em 1em .5em .4em; }
+.ui-dialog .ui-dialog-buttonpane button { float: right; margin: .5em .4em .5em 0; cursor: pointer; padding: .2em .6em .3em .6em; line-height: 1.4em; width:auto; overflow:visible; }
+.ui-dialog .ui-resizable-se { width: 14px; height: 14px; right: 3px; bottom: 3px; }
+.ui-draggable .ui-dialog-titlebar { cursor: move; }
+/* Tabs
+----------------------------------*/
+.ui-tabs { position: relative; padding: .2em; zoom: 1; } /* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */
+.ui-tabs .ui-tabs-nav { margin: 0; padding: .2em .2em 0; }
+.ui-tabs .ui-tabs-nav li { list-style: none; float: left; position: relative; top: 1px; margin: 0 .2em 1px 0; border-bottom: 0 !important; padding: 0; white-space: nowrap; }
+.ui-tabs .ui-tabs-nav li a { float: left; padding: .5em 1em; text-decoration: none; }
+.ui-tabs .ui-tabs-nav li.ui-tabs-selected { margin-bottom: 0; padding-bottom: 1px; }
+.ui-tabs .ui-tabs-nav li.ui-tabs-selected a, .ui-tabs .ui-tabs-nav li.ui-state-disabled a, .ui-tabs .ui-tabs-nav li.ui-state-processing a { cursor: text; }
+.ui-tabs .ui-tabs-nav li a, .ui-tabs.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-selected a { cursor: pointer; } /* first selector in group seems obsolete, but required to overcome bug in Opera applying cursor: text overall if defined elsewhere... */
+.ui-tabs .ui-tabs-panel { display: block; border-width: 0; padding: 1em 1.4em; background: none; }
+.ui-tabs .ui-tabs-hide { display: none !important; }
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/docs/common/jquery/treeview/jquery.treeview.async.js b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/docs/common/jquery/treeview/jquery.treeview.async.js
new file mode 100644
index 0000000..2597dde
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/docs/common/jquery/treeview/jquery.treeview.async.js
@@ -0,0 +1,72 @@
+/*
+ * Async Treeview 0.1 - Lazy-loading extension for Treeview
+ *
+ * http://bassistance.de/jquery-plugins/jquery-plugin-treeview/
+ *
+ * Copyright (c) 2007 Jörn Zaefferer
+ *
+ * Dual licensed under the MIT and GPL licenses:
+ * http://www.opensource.org/licenses/mit-license.php
+ * http://www.gnu.org/licenses/gpl.html
+ *
+ * Revision: $Id$
+ *
+ */
+
+;(function($) {
+
+function load(settings, root, child, container) {
+ $.getJSON(settings.url, {root: root}, function(response) {
+ function createNode(parent) {
+ var current = $("<li/>").attr("id", this.id || "").html("<span>" + this.text + "</span>").appendTo(parent);
+ if (this.classes) {
+ current.children("span").addClass(this.classes);
+ }
+ if (this.expanded) {
+ current.addClass("open");
+ }
+ if (this.hasChildren || this.children && this.children.length) {
+ var branch = $("<ul/>").appendTo(current);
+ if (this.hasChildren) {
+ current.addClass("hasChildren");
+ createNode.call({
+ text:"placeholder",
+ id:"placeholder",
+ children:[]
+ }, branch);
+ }
+ if (this.children && this.children.length) {
+ $.each(this.children, createNode, [branch])
+ }
+ }
+ }
+ $.each(response, createNode, [child]);
+ $(container).treeview({add: child});
+ });
+}
+
+var proxied = $.fn.treeview;
+$.fn.treeview = function(settings) {
+ if (!settings.url) {
+ return proxied.apply(this, arguments);
+ }
+ var container = this;
+ load(settings, "source", this, container);
+ var userToggle = settings.toggle;
+ return proxied.call(this, $.extend({}, settings, {
+ collapsed: true,
+ toggle: function() {
+ var $this = $(this);
+ if ($this.hasClass("hasChildren")) {
+ var childList = $this.removeClass("hasChildren").find("ul");
+ childList.empty();
+ load(settings, this.id, childList, container);
+ }
+ if (userToggle) {
+ userToggle.apply(this, arguments);
+ }
+ }
+ }));
+};
+
+})(jQuery); \ No newline at end of file
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/docs/common/jquery/treeview/jquery.treeview.css b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/docs/common/jquery/treeview/jquery.treeview.css
new file mode 100644
index 0000000..dbf425b
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/docs/common/jquery/treeview/jquery.treeview.css
@@ -0,0 +1,85 @@
+.treeview, .treeview ul {
+ padding: 0;
+ margin: 0;
+ list-style: none;
+}
+
+.treeview ul {
+ background-color: white;
+ margin-top: 4px;
+}
+
+.treeview .hitarea {
+ background: url(images/treeview-default.gif) -64px -25px no-repeat;
+ height: 16px;
+ width: 16px;
+ margin-left: -16px;
+ float: left;
+ cursor: pointer;
+}
+/* fix for IE6 */
+* html .hitarea {
+ display: inline;
+ float:none;
+}
+
+.treeview li {
+ margin: 0;
+ padding: 3px 0 3px 16px;
+}
+
+.treeview a.selected {
+ background-color: #eee;
+}
+
+#treecontrol { margin: 1em 0; display: none; }
+
+.treeview .hover { color: red; cursor: pointer; }
+
+.treeview li { background: url(images/treeview-default-line.gif) 0 0 no-repeat; }
+.treeview li.collapsable, .treeview li.expandable { background-position: 0 -176px; }
+
+.treeview .expandable-hitarea { background-position: -80px -3px; }
+
+.treeview li.last { background-position: 0 -1766px }
+.treeview li.lastCollapsable, .treeview li.lastExpandable { background-image: url(images/treeview-default.gif); }
+.treeview li.lastCollapsable { background-position: 0 -111px }
+.treeview li.lastExpandable { background-position: -32px -67px }
+
+.treeview div.lastCollapsable-hitarea, .treeview div.lastExpandable-hitarea { background-position: 0; }
+
+.treeview-red li { background-image: url(images/treeview-red-line.gif); }
+.treeview-red .hitarea, .treeview-red li.lastCollapsable, .treeview-red li.lastExpandable { background-image: url(images/treeview-red.gif); }
+
+.treeview-black li { background-image: url(images/treeview-black-line.gif); }
+.treeview-black .hitarea, .treeview-black li.lastCollapsable, .treeview-black li.lastExpandable { background-image: url(images/treeview-black.gif); }
+
+.treeview-gray li { background-image: url(images/treeview-gray-line.gif); }
+.treeview-gray .hitarea, .treeview-gray li.lastCollapsable, .treeview-gray li.lastExpandable { background-image: url(images/treeview-gray.gif); }
+
+.treeview-famfamfam li { background-image: url(images/treeview-famfamfam-line.gif); }
+.treeview-famfamfam .hitarea, .treeview-famfamfam li.lastCollapsable, .treeview-famfamfam li.lastExpandable { background-image: url(images/treeview-famfamfam.gif); }
+
+
+.filetree li { padding: 3px 0 2px 16px; }
+.filetree span.folder, .filetree span.file { padding: 1px 0 1px 16px; display: block; }
+.filetree span.folder { background: url(images/folder.gif) 0 0 no-repeat; }
+.filetree li.expandable span.folder { background: url(images/folder-closed.gif) 0 0 no-repeat; }
+.filetree span.file { background: url(images/file.gif) 0 0 no-repeat; }
+
+html, body {height:100%; margin: 0; padding: 0; }
+
+/*
+html>body {
+ font-size: 16px;
+ font-size: 68.75%;
+} Reset Base Font Size */
+ /*
+body {
+ font-family: Verdana, helvetica, arial, sans-serif;
+ font-size: 68.75%;
+ background: #fff;
+ color: #333;
+} */
+
+a img { border: none; } \ No newline at end of file
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/docs/common/jquery/treeview/jquery.treeview.js b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/docs/common/jquery/treeview/jquery.treeview.js
new file mode 100644
index 0000000..248e725
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/docs/common/jquery/treeview/jquery.treeview.js
@@ -0,0 +1,255 @@
+/*
+ * Treeview 1.4 - jQuery plugin to hide and show branches of a tree
+ *
+ * http://bassistance.de/jquery-plugins/jquery-plugin-treeview/
+ * http://docs.jquery.com/Plugins/Treeview
+ *
+ * Copyright (c) 2007 Jörn Zaefferer
+ *
+ * Dual licensed under the MIT and GPL licenses:
+ * http://www.opensource.org/licenses/mit-license.php
+ * http://www.gnu.org/licenses/gpl.html
+ *
+ * Revision: $Id: jquery.treeview.js 4684 2008-02-07 19:08:06Z joern.zaefferer $
+ *
+ */
+
+;(function($) {
+
+ $.extend($.fn, {
+ swapClass: function(c1, c2) {
+ var c1Elements = this.filter('.' + c1);
+ this.filter('.' + c2).removeClass(c2).addClass(c1);
+ c1Elements.removeClass(c1).addClass(c2);
+ return this;
+ },
+ replaceClass: function(c1, c2) {
+ return this.filter('.' + c1).removeClass(c1).addClass(c2).end();
+ },
+ hoverClass: function(className) {
+ className = className || "hover";
+ return this.hover(function() {
+ $(this).addClass(className);
+ }, function() {
+ $(this).removeClass(className);
+ });
+ },
+ heightToggle: function(animated, callback) {
+ animated ?
+ this.animate({ height: "toggle" }, animated, callback) :
+ this.each(function(){
+ jQuery(this)[ jQuery(this).is(":hidden") ? "show" : "hide" ]();
+ if(callback)
+ callback.apply(this, arguments);
+ });
+ },
+ heightHide: function(animated, callback) {
+ if (animated) {
+ this.animate({ height: "hide" }, animated, callback);
+ } else {
+ this.hide();
+ if (callback)
+ this.each(callback);
+ }
+ },
+ prepareBranches: function(settings) {
+ if (!settings.prerendered) {
+ // mark last tree items
+ this.filter(":last-child:not(ul)").addClass(CLASSES.last);
+ // collapse whole tree, or only those marked as closed, anyway except those marked as open
+ this.filter((settings.collapsed ? "" : "." + CLASSES.closed) + ":not(." + CLASSES.open + ")").find(">ul").hide();
+ }
+ // return all items with sublists
+ return this.filter(":has(>ul)");
+ },
+ applyClasses: function(settings, toggler) {
+ this.filter(":has(>ul):not(:has(>a))").find(">span").click(function(event) {
+ toggler.apply($(this).next());
+ }).add( $("a", this) ).hoverClass();
+
+ if (!settings.prerendered) {
+ // handle closed ones first
+ this.filter(":has(>ul:hidden)")
+ .addClass(CLASSES.expandable)
+ .replaceClass(CLASSES.last, CLASSES.lastExpandable);
+
+ // handle open ones
+ this.not(":has(>ul:hidden)")
+ .addClass(CLASSES.collapsable)
+ .replaceClass(CLASSES.last, CLASSES.lastCollapsable);
+
+ // create hitarea
+ this.prepend("<div class=\"" + CLASSES.hitarea + "\"/>").find("div." + CLASSES.hitarea).each(function() {
+ var classes = "";
+ $.each($(this).parent().attr("class").split(" "), function() {
+ classes += this + "-hitarea ";
+ });
+ $(this).addClass( classes );
+ });
+ }
+
+ // apply event to hitarea
+ this.find("div." + CLASSES.hitarea).click( toggler );
+ },
+ treeview: function(settings) {
+
+ if(typeof(window.treeCookieId) !== 'undefined' || window.treeCookieId === ""){
+ treeCookieId = "treeview";
+ }
+
+ settings = $.extend({
+ cookieId: treeCookieId
+ }, settings);
+
+ if (settings.add) {
+ return this.trigger("add", [settings.add]);
+ }
+
+ if ( settings.toggle ) {
+ var callback = settings.toggle;
+ settings.toggle = function() {
+ return callback.apply($(this).parent()[0], arguments);
+ };
+ }
+
+ // factory for treecontroller
+ function treeController(tree, control) {
+ // factory for click handlers
+ function handler(filter) {
+ return function() {
+ // reuse toggle event handler, applying the elements to toggle
+ // start searching for all hitareas
+ toggler.apply( $("div." + CLASSES.hitarea, tree).filter(function() {
+ // for plain toggle, no filter is provided, otherwise we need to check the parent element
+ return filter ? $(this).parent("." + filter).length : true;
+ }) );
+ return false;
+ };
+ }
+ // click on first element to collapse tree
+ $("a:eq(0)", control).click( handler(CLASSES.collapsable) );
+ // click on second to expand tree
+ $("a:eq(1)", control).click( handler(CLASSES.expandable) );
+ // click on third to toggle tree
+ $("a:eq(2)", control).click( handler() );
+ }
+
+ // handle toggle event
+ function toggler() {
+ $(this)
+ .parent()
+ // swap classes for hitarea
+ .find(">.hitarea")
+ .swapClass( CLASSES.collapsableHitarea, CLASSES.expandableHitarea )
+ .swapClass( CLASSES.lastCollapsableHitarea, CLASSES.lastExpandableHitarea )
+ .end()
+ // swap classes for parent li
+ .swapClass( CLASSES.collapsable, CLASSES.expandable )
+ .swapClass( CLASSES.lastCollapsable, CLASSES.lastExpandable )
+ // find child lists
+ .find( ">ul" )
+ // toggle them
+ .heightToggle( settings.animated, settings.toggle );
+ if ( settings.unique ) {
+ $(this).parent()
+ .siblings()
+ // swap classes for hitarea
+ .find(">.hitarea")
+ .replaceClass( CLASSES.collapsableHitarea, CLASSES.expandableHitarea )
+ .replaceClass( CLASSES.lastCollapsableHitarea, CLASSES.lastExpandableHitarea )
+ .end()
+ .replaceClass( CLASSES.collapsable, CLASSES.expandable )
+ .replaceClass( CLASSES.lastCollapsable, CLASSES.lastExpandable )
+ .find( ">ul" )
+ .heightHide( settings.animated, settings.toggle );
+ }
+ }
+ //Cookie Persistence
+ function serialize() {
+ function binary(arg) {
+ return arg ? 1 : 0;
+ }
+ var data = [];
+ branches.each(function(i, e) {
+ data[i] = $(e).is(":has(>ul:visible)") ? 1 : 0;
+ });
+ $.cookie(settings.cookieId, data.join("") );
+ }
+
+ function deserialize() {
+ var stored = $.cookie(settings.cookieId);
+ if ( stored ) {
+ var data = stored.split("");
+ branches.each(function(i, e) {
+ $(e).find(">ul")[ parseInt(data[i]) ? "show" : "hide" ]();
+ });
+ }
+ }
+
+ // add treeview class to activate styles
+ this.addClass("treeview");
+
+ // prepare branches and find all tree items with child lists
+ var branches = this.find("li").prepareBranches(settings);
+
+ switch(settings.persist) {
+ case "cookie":
+ var toggleCallback = settings.toggle;
+ settings.toggle = function() {
+ serialize();
+ if (toggleCallback) {
+ toggleCallback.apply(this, arguments);
+ }
+ };
+ deserialize();
+ break;
+ case "location":
+ var current = this.find("a").filter(function() { return this.href.toLowerCase() == location.href.toLowerCase(); });
+ if ( current.length ) {
+ current.addClass("selected").parents("ul, li").add( current.next() ).show();
+ }
+ break;
+ }
+
+ branches.applyClasses(settings, toggler);
+
+ // if control option is set, create the treecontroller and show it
+ if ( settings.control ) {
+ treeController(this, settings.control);
+ $(settings.control).show();
+ }
+
+ return this.bind("add", function(event, branches) {
+ $(branches).prev()
+ .removeClass(CLASSES.last)
+ .removeClass(CLASSES.lastCollapsable)
+ .removeClass(CLASSES.lastExpandable)
+ .find(">.hitarea")
+ .removeClass(CLASSES.lastCollapsableHitarea)
+ .removeClass(CLASSES.lastExpandableHitarea);
+ $(branches).find("li").andSelf().prepareBranches(settings).applyClasses(settings, toggler);
+ });
+ }
+ });
+
+ // classes used by the plugin
+ // need to be styled via external stylesheet, see first example
+ var CLASSES = $.fn.treeview.classes = {
+ open: "open",
+ closed: "closed",
+ expandable: "expandable",
+ expandableHitarea: "expandable-hitarea",
+ lastExpandableHitarea: "lastExpandable-hitarea",
+ collapsable: "collapsable",
+ collapsableHitarea: "collapsable-hitarea",
+ lastCollapsableHitarea: "lastCollapsable-hitarea",
+ lastCollapsable: "lastCollapsable",
+ lastExpandable: "lastExpandable",
+ last: "last",
+ hitarea: "hitarea"
+ };
+
+ // provide backwards compability
+ $.fn.Treeview = $.fn.treeview;
+
+})(jQuery); \ No newline at end of file
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/docs/common/jquery/treeview/jquery.treeview.min.js b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/docs/common/jquery/treeview/jquery.treeview.min.js
new file mode 100644
index 0000000..e693321
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/docs/common/jquery/treeview/jquery.treeview.min.js
@@ -0,0 +1,16 @@
+/*
+ * Treeview 1.4 - jQuery plugin to hide and show branches of a tree
+ *
+ * http://bassistance.de/jquery-plugins/jquery-plugin-treeview/
+ * http://docs.jquery.com/Plugins/Treeview
+ *
+ * Copyright (c) 2007 Jörn Zaefferer
+ *
+ * Dual licensed under the MIT and GPL licenses:
+ * http://www.opensource.org/licenses/mit-license.php
+ * http://www.gnu.org/licenses/gpl.html
+ *
+ * Revision: $Id: jquery.treeview.js 4684 2008-02-07 19:08:06Z joern.zaefferer $
+ * kasunbg: changed the cookieid name
+ *
+ */;(function($){$.extend($.fn,{swapClass:function(c1,c2){var c1Elements=this.filter('.'+c1);this.filter('.'+c2).removeClass(c2).addClass(c1);c1Elements.removeClass(c1).addClass(c2);return this;},replaceClass:function(c1,c2){return this.filter('.'+c1).removeClass(c1).addClass(c2).end();},hoverClass:function(className){className=className||"hover";return this.hover(function(){$(this).addClass(className);},function(){$(this).removeClass(className);});},heightToggle:function(animated,callback){animated?this.animate({height:"toggle"},animated,callback):this.each(function(){jQuery(this)[jQuery(this).is(":hidden")?"show":"hide"]();if(callback)callback.apply(this,arguments);});},heightHide:function(animated,callback){if(animated){this.animate({height:"hide"},animated,callback);}else{this.hide();if(callback)this.each(callback);}},prepareBranches:function(settings){if(!settings.prerendered){this.filter(":last-child:not(ul)").addClass(CLASSES.last);this.filter((settings.collapsed?"":"."+CLASSES.closed)+":not(."+CLASSES.open+")").find(">ul").hide();}return this.filter(":has(>ul)");},applyClasses:function(settings,toggler){this.filter(":has(>ul):not(:has(>a))").find(">span").click(function(event){toggler.apply($(this).next());}).add($("a",this)).hoverClass();if(!settings.prerendered){this.filter(":has(>ul:hidden)").addClass(CLASSES.expandable).replaceClass(CLASSES.last,CLASSES.lastExpandable);this.not(":has(>ul:hidden)").addClass(CLASSES.collapsable).replaceClass(CLASSES.last,CLASSES.lastCollapsable);this.prepend("<div class=\""+CLASSES.hitarea+"\"/>").find("div."+CLASSES.hitarea).each(function(){var classes="";$.each($(this).parent().attr("class").split(" "),function(){classes+=this+"-hitarea ";});$(this).addClass(classes);});}this.find("div."+CLASSES.hitarea).click(toggler);},treeview:function(settings){if(typeof(window.treeCookieId) === 'undefined' || window.treeCookieId === ""){treeCookieId = "treeview";} settings=$.extend({cookieId: treeCookieId},settings);if(settings.add){return this.trigger("add",[settings.add]);}if(settings.toggle){var callback=settings.toggle;settings.toggle=function(){return callback.apply($(this).parent()[0],arguments);};}function treeController(tree,control){function handler(filter){return function(){toggler.apply($("div."+CLASSES.hitarea,tree).filter(function(){return filter?$(this).parent("."+filter).length:true;}));return false;};}$("a:eq(0)",control).click(handler(CLASSES.collapsable));$("a:eq(1)",control).click(handler(CLASSES.expandable));$("a:eq(2)",control).click(handler());}function toggler(){$(this).parent().find(">.hitarea").swapClass(CLASSES.collapsableHitarea,CLASSES.expandableHitarea).swapClass(CLASSES.lastCollapsableHitarea,CLASSES.lastExpandableHitarea).end().swapClass(CLASSES.collapsable,CLASSES.expandable).swapClass(CLASSES.lastCollapsable,CLASSES.lastExpandable).find(">ul").heightToggle(settings.animated,settings.toggle);if(settings.unique){$(this).parent().siblings().find(">.hitarea").replaceClass(CLASSES.collapsableHitarea,CLASSES.expandableHitarea).replaceClass(CLASSES.lastCollapsableHitarea,CLASSES.lastExpandableHitarea).end().replaceClass(CLASSES.collapsable,CLASSES.expandable).replaceClass(CLASSES.lastCollapsable,CLASSES.lastExpandable).find(">ul").heightHide(settings.animated,settings.toggle);}}function serialize(){function binary(arg){return arg?1:0;}var data=[];branches.each(function(i,e){data[i]=$(e).is(":has(>ul:visible)")?1:0;});$.cookie(settings.cookieId,data.join(""));}function deserialize(){var stored=$.cookie(settings.cookieId);if(stored){var data=stored.split("");branches.each(function(i,e){$(e).find(">ul")[parseInt(data[i])?"show":"hide"]();});}}this.addClass("treeview");var branches=this.find("li").prepareBranches(settings);switch(settings.persist){case"cookie":var toggleCallback=settings.toggle;settings.toggle=function(){serialize();if(toggleCallback){toggleCallback.apply(this,arguments);}};deserialize();break;case"location":var current=this.find("a").filter(function(){return this.href.toLowerCase()==location.href.toLowerCase();});if(current.length){current.addClass("selected").parents("ul, li").add(current.next()).show();}break;}branches.applyClasses(settings,toggler);if(settings.control){treeController(this,settings.control);$(settings.control).show();}return this.bind("add",function(event,branches){$(branches).prev().removeClass(CLASSES.last).removeClass(CLASSES.lastCollapsable).removeClass(CLASSES.lastExpandable).find(">.hitarea").removeClass(CLASSES.lastCollapsableHitarea).removeClass(CLASSES.lastExpandableHitarea);$(branches).find("li").andSelf().prepareBranches(settings).applyClasses(settings,toggler);});}});var CLASSES=$.fn.treeview.classes={open:"open",closed:"closed",expandable:"expandable",expandableHitarea:"expandable-hitarea",lastExpandableHitarea:"lastExpandable-hitarea",collapsable:"collapsable",collapsableHitarea:"collapsable-hitarea",lastCollapsableHitarea:"lastCollapsable-hitarea",lastCollapsable:"lastCollapsable",lastExpandable:"lastExpandable",last:"last",hitarea:"hitarea"};$.fn.Treeview=$.fn.treeview;})(jQuery); \ No newline at end of file
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/docs/common/jquery/treeview/jquery.treeview.pack.js b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/docs/common/jquery/treeview/jquery.treeview.pack.js
new file mode 100644
index 0000000..eddac49
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/docs/common/jquery/treeview/jquery.treeview.pack.js
@@ -0,0 +1,16 @@
+/*
+ * Treeview 1.4 - jQuery plugin to hide and show branches of a tree
+ *
+ * http://bassistance.de/jquery-plugins/jquery-plugin-treeview/
+ * http://docs.jquery.com/Plugins/Treeview
+ *
+ * Copyright (c) 2007 Jörn Zaefferer
+ *
+ * Dual licensed under the MIT and GPL licenses:
+ * http://www.opensource.org/licenses/mit-license.php
+ * http://www.gnu.org/licenses/gpl.html
+ *
+ * Revision: $Id: jquery.treeview.js 4684 2008-02-07 19:08:06Z joern.zaefferer $
+ *
+ */
+eval(function(p,a,c,k,e,r){e=function(c){return(c<a?'':e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)r[e(c)]=k[c]||e(c);k=[function(e){return r[e]}];e=function(){return'\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}(';(4($){$.1l($.F,{E:4(b,c){l a=3.n(\'.\'+b);3.n(\'.\'+c).o(c).m(b);a.o(b).m(c);8 3},s:4(a,b){8 3.n(\'.\'+a).o(a).m(b).P()},1n:4(a){a=a||"1j";8 3.1j(4(){$(3).m(a)},4(){$(3).o(a)})},1h:4(b,a){b?3.1g({1e:"p"},b,a):3.x(4(){T(3)[T(3).1a(":U")?"H":"D"]();7(a)a.A(3,O)})},12:4(b,a){7(b){3.1g({1e:"D"},b,a)}1L{3.D();7(a)3.x(a)}},11:4(a){7(!a.1k){3.n(":r-1H:G(9)").m(k.r);3.n((a.1F?"":"."+k.X)+":G(."+k.W+")").6(">9").D()}8 3.n(":y(>9)")},S:4(b,c){3.n(":y(>9):G(:y(>a))").6(">1z").C(4(a){c.A($(3).19())}).w($("a",3)).1n();7(!b.1k){3.n(":y(>9:U)").m(k.q).s(k.r,k.t);3.G(":y(>9:U)").m(k.u).s(k.r,k.v);3.1r("<J 14=\\""+k.5+"\\"/>").6("J."+k.5).x(4(){l a="";$.x($(3).B().1o("14").13(" "),4(){a+=3+"-5 "});$(3).m(a)})}3.6("J."+k.5).C(c)},z:4(g){g=$.1l({N:"z"},g);7(g.w){8 3.1K("w",[g.w])}7(g.p){l d=g.p;g.p=4(){8 d.A($(3).B()[0],O)}}4 1m(b,c){4 L(a){8 4(){K.A($("J."+k.5,b).n(4(){8 a?$(3).B("."+a).1i:1I}));8 1G}}$("a:10(0)",c).C(L(k.u));$("a:10(1)",c).C(L(k.q));$("a:10(2)",c).C(L())}4 K(){$(3).B().6(">.5").E(k.Z,k.Y).E(k.I,k.M).P().E(k.u,k.q).E(k.v,k.t).6(">9").1h(g.1f,g.p);7(g.1E){$(3).B().1D().6(">.5").s(k.Z,k.Y).s(k.I,k.M).P().s(k.u,k.q).s(k.v,k.t).6(">9").12(g.1f,g.p)}}4 1d(){4 1C(a){8 a?1:0}l b=[];j.x(4(i,e){b[i]=$(e).1a(":y(>9:1B)")?1:0});$.V(g.N,b.1A(""))}4 1c(){l b=$.V(g.N);7(b){l a=b.13("");j.x(4(i,e){$(e).6(">9")[1y(a[i])?"H":"D"]()})}}3.m("z");l j=3.6("Q").11(g);1x(g.1w){18"V":l h=g.p;g.p=4(){1d();7(h){h.A(3,O)}};1c();17;18"1b":l f=3.6("a").n(4(){8 3.16.15()==1b.16.15()});7(f.1i){f.m("1v").1u("9, Q").w(f.19()).H()}17}j.S(g,K);7(g.R){1m(3,g.R);$(g.R).H()}8 3.1t("w",4(a,b){$(b).1s().o(k.r).o(k.v).o(k.t).6(">.5").o(k.I).o(k.M);$(b).6("Q").1q().11(g).S(g,K)})}});l k=$.F.z.1J={W:"W",X:"X",q:"q",Y:"q-5",M:"t-5",u:"u",Z:"u-5",I:"v-5",v:"v",t:"t",r:"r",5:"5"};$.F.1p=$.F.z})(T);',62,110,'|||this|function|hitarea|find|if|return|ul||||||||||||var|addClass|filter|removeClass|toggle|expandable|last|replaceClass|lastExpandable|collapsable|lastCollapsable|add|each|has|treeview|apply|parent|click|hide|swapClass|fn|not|show|lastCollapsableHitarea|div|toggler|handler|lastExpandableHitarea|cookieId|arguments|end|li|control|applyClasses|jQuery|hidden|cookie|open|closed|expandableHitarea|collapsableHitarea|eq|prepareBranches|heightHide|split|class|toLowerCase|href|break|case|next|is|location|deserialize|serialize|height|animated|animate|heightToggle|length|hover|prerendered|extend|treeController|hoverClass|attr|Treeview|andSelf|prepend|prev|bind|parents|selected|persist|switch|parseInt|span|join|visible|binary|siblings|unique|collapsed|false|child|true|classes|trigger|else'.split('|'),0,{})) \ No newline at end of file
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/docs/common/main.js b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/docs/common/main.js
new file mode 100644
index 0000000..dee7303
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/docs/common/main.js
@@ -0,0 +1,161 @@
+/**
+ * Miscellaneous js functions for WebHelp
+ * Kasun Gajasinghe, http://kasunbg.blogspot.com
+ * David Cramer, http://www.thingbag.net
+ *
+ */
+
+$(document).ready(function() {
+ // $("#showHideHighlight").button(); //add jquery button styling to 'Go' button
+ //Generate tabs in nav-pane with JQuery
+ $(function() {
+ $("#tabs").tabs({
+ cookie: {
+ // store cookie for 2 days.
+ expires: 2
+ }
+ });
+ });
+
+ //Generate the tree
+ $("#ulTreeDiv").attr("style","");
+ $("#tree").treeview({
+ collapsed: true,
+ animated: "medium",
+ control: "#sidetreecontrol",
+ persist: "cookie"
+ });
+
+ //after toc fully styled, display it. Until loading, a 'loading' image will be displayed
+ $("#tocLoading").attr("style","display:none;");
+// $("#ulTreeDiv").attr("style","display:block;");
+
+ //.searchButton is the css class applied to 'Go' button
+ $(function() {
+ $("button", ".searchButton").button();
+
+ $("button", ".searchButton").click(function() { return false; });
+ });
+
+ //'ui-tabs-1' is the cookie name which is used for the persistence of the tabs.(Content/Search tab)
+ if ($.cookie('ui-tabs-1') === '1') { //search tab is visible
+ if ($.cookie('textToSearch') != undefined && $.cookie('textToSearch').length > 0) {
+ document.getElementById('textToSearch').value = $.cookie('textToSearch');
+ Verifie('diaSearch_Form');
+ searchHighlight($.cookie('textToSearch'));
+ $("#showHideHighlight").css("display","block");
+ }
+ }
+
+ syncToc(); //Synchronize the toc tree with the content pane, when loading the page.
+ //$("#doSearch").button(); //add jquery button styling to 'Go' button
+});
+
+/**
+ * Synchronize with the tableOfContents
+ */
+function syncToc(){
+ var a = document.getElementById("webhelp-currentid");
+ if (a != undefined) {
+ var b = a.getElementsByTagName("a")[0];
+
+ if (b != undefined) {
+ //Setting the background for selected node.
+ var style = a.getAttribute("style");
+ if (style != null && !style.match(/background-color: Background;/)) {
+ a.setAttribute("style", "background-color: #6495ed; " + style);
+ b.setAttribute("style", "color: white;");
+ } else if (style != null) {
+ a.setAttribute("style", "background-color: #6495ed; " + style);
+ b.setAttribute("style", "color: white;");
+ } else {
+ a.setAttribute("style", "background-color: #6495ed; ");
+ b.setAttribute("style", "color: white;");
+ }
+ }
+
+ //shows the node related to current content.
+ //goes a recursive call from current node to ancestor nodes, displaying all of them.
+ while (a.parentNode && a.parentNode.nodeName) {
+ var parentNode = a.parentNode;
+ var nodeName = parentNode.nodeName;
+
+ if (nodeName.toLowerCase() == "ul") {
+ parentNode.setAttribute("style", "display: block;");
+ } else if (nodeName.toLocaleLowerCase() == "li") {
+ parentNode.setAttribute("class", "collapsable");
+ parentNode.firstChild.setAttribute("class", "hitarea collapsable-hitarea ");
+ }
+ a = parentNode;
+ }
+ }
+}
+
+/**
+ * Code for Show/Hide TOC
+ *
+ */
+function showHideToc() {
+ var showHideButton = $("#showHideButton");
+ var leftNavigation = $("#leftnavigation");
+ var content = $("#content");
+
+ if (showHideButton != undefined && showHideButton.hasClass("pointLeft")) {
+ //Hide TOC
+ showHideButton.removeClass('pointLeft').addClass('pointRight');
+ content.css("margin", "0 0 0 0");
+ leftNavigation.css("display","none");
+ showHideButton.attr("title", "Show the TOC tree");
+ } else {
+ //Show the TOC
+ showHideButton.removeClass('pointRight').addClass('pointLeft');
+ content.css("margin", "0 0 0 280px");
+ leftNavigation.css("display","block");
+ showHideButton.attr("title", "Hide the TOC Tree");
+ }
+}
+
+/**
+ * Code for searh highlighting
+ */
+var highlightOn = true;
+function searchHighlight(searchText) {
+ highlightOn = true;
+ if (searchText != undefined) {
+ var wList;
+ var sList = new Array(); //stem list
+ //Highlight the search terms
+ searchText = searchText.toLowerCase().replace(/<\//g, "_st_").replace(/\$_/g, "_di_").replace(/\.|%2C|%3B|%21|%3A|@|\/|\*/g, " ").replace(/(%20)+/g, " ").replace(/_st_/g, "</").replace(/_di_/g, "%24_")
+ searchText = searchText.replace(/ +/g, " ");
+ searchText = searchText.replace(/ $/, "").replace(/^ /, "");
+
+ wList = searchText.split(" ");
+ $("#content").highlight(wList); //Highlight the search input
+
+ if(typeof stemmer != "undefined" ){
+ //Highlight the stems
+ for (var i = 0; i < wList.length; i++) {
+ var stemW = stemmer(wList[i]);
+ sList.push(stemW);
+ }
+ } else {
+ sList = wList;
+ }
+ $("#content").highlight(sList); //Highlight the search input's all stems
+ }
+}
+
+function searchUnhighlight(){
+ highlightOn = false;
+ //unhighlight the search input's all stems
+ $("#content").unhighlight();
+ $("#content").unhighlight();
+}
+
+function toggleHighlight(){
+ if(highlightOn) {
+ searchUnhighlight();
+ } else {
+ searchHighlight($.cookie('textToSearch'));
+ }
+} \ No newline at end of file
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/docs/content/ch01.html b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/docs/content/ch01.html
new file mode 100644
index 0000000..7edbb53
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/docs/content/ch01.html
@@ -0,0 +1,61 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xmlns:exsl="http://exslt.org/common" xmlns:ng="http://docbook.org/docbook-ng" xmlns:db="http://docbook.org/ns/docbook"><head>
+<meta http-equiv="X-UA-Compatible" content="IE=7" />
+<title>Chapter 1. Introduction</title><meta name="generator" content="DocBook XSL Stylesheets V1.76.1" /><meta name="description" content="Overview of the package." /><link rel="home" href="index.html" title="README: Web-based Help from DocBook XML" /><link rel="up" href="index.html" title="README: Web-based Help from DocBook XML" /><link rel="prev" href="index.html" title="README: Web-based Help from DocBook XML" /><link rel="next" href="ch02.html" title="Chapter 2. Using the package" /><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><script type="text/javascript">
+ //The id for tree cookie
+ var treeCookieId = "treeview-897";
+ var language = "en";
+ var w = new Object();
+ //Localization
+ txt_filesfound = 'Results';
+ txt_enter_at_least_1_char = "You must enter at least one character.";
+ txt_browser_not_supported = "Your browser is not supported. Use of Mozilla Firefox is recommended.";
+ txt_please_wait = "Please wait. Search in progress...";
+ txt_results_for = "Results for: ";
+ </script><style type="text/css">
+ input {
+ margin-bottom: 5px;
+ margin-top: 2px;
+ }
+
+ .folder {
+ display: block;
+ height: 22px;
+ padding-left: 20px;
+ background: transparent url(../common/jquery/treeview/images/folder.gif) 0 0px no-repeat;
+ }
+ </style><link rel="shortcut icon" href="../favicon.ico" type="image/x-icon" /><link rel="stylesheet" type="text/css" href="../common/css/positioning.css" /><link rel="stylesheet" type="text/css" href="../common/jquery/theme-redmond/jquery-ui-1.8.2.custom.css" /><link rel="stylesheet" type="text/css" href="../common/jquery/treeview/jquery.treeview.css" /><script type="text/javascript" src="../common/jquery/jquery-1.4.2.min.js"></script><script type="text/javascript" src="../common/jquery/jquery-ui-1.8.2.custom.min.js"></script><script type="text/javascript" src="../common/jquery/jquery.cookie.js"></script><script type="text/javascript" src="../common/jquery/treeview/jquery.treeview.min.js"></script><script type="text/javascript" src="search/htmlFileList.js"></script><script type="text/javascript" src="search/htmlFileInfoList.js"></script><script type="text/javascript" src="search/nwSearchFnt.js"></script><script type="text/javascript" src="search/stemmers/en_stemmer.js"><!--//make this scalable to other languages as well.--></script><script type="text/javascript" src="search/index-1.js"></script><script type="text/javascript" src="search/index-2.js"></script><script type="text/javascript" src="search/index-3.js"></script></head><body><div id="header"><img style="margin-right: 2px; height: 59px; padding-right: 25px; padding-top: 8px" align="right" src="../common/images/logo.png" alt="Company Logo" /><h1 align="center">Chapter 1. Introduction<br /> </h1><div id="navheader" align="right"><table><tr><td style="height: 28px; width: 16px;"><a id="showHideButton" onclick="showHideToc();" class="pointLeft" title="Hide TOC tree">.
+ </a></td><td><img src="../common/images/highlight-blue.gif" alt="H" height="25px" onclick="toggleHighlight()" id="showHideHighlight" style="cursor:pointer" title="Toggle search result highlighting" /></td><td><a accesskey="p" href="index.html">Prev</a> 
+ |
+ <a accesskey="n" href="ch02.html">Next</a></td></tr></table></div></div><div id="content"><div class="chapter" title="Chapter 1. Introduction"><div class="titlepage"><div><div><h2 class="title"><a id="id36123150"></a>Chapter 1. Introduction</h2></div><div><div class="abstract" title="Abstract"><p class="title"><strong>Abstract</strong></p><p>Overview of the package.</p></div></div></div></div><p>A common requirement for technical publications groups is to produce a Web-based help
+ format that includes a table of contents pane, a search feature, and an index similar to what
+ you get from the Microsoft HTML Help (.chm) format or Eclipse help. If the content is help for
+ a Web application that is not exposed to the Internet or requires that the user be logged in,
+ then it is impossible to use services like Google to add search. <a id="id36123176" class="indexterm"></a>
+ </p><div class="itemizedlist" title="Features"><p class="title"><strong>Features</strong></p><ul class="itemizedlist" type="disc"><li class="listitem"><p>Full text search.<a id="id36123195" class="indexterm"></a></p><div class="itemizedlist"><ul class="itemizedlist" type="circle"><li class="listitem"><p>Stemming support for English, French, and German. Stemming support can be added
+ for other languages by implementing a stemmer.<a id="id36123214" class="indexterm"></a></p></li><li class="listitem"><p>Support for Chinese, Japanese, and Korean using code from the Lucene search
+ engine. </p></li><li class="listitem"><p>Search highlighting shows where the searched for term appears in the results.
+ Use the <span class="guibutton">H</span> button to toggle the highlighting off and on.
+ <a id="id36123242" class="indexterm"></a></p></li><li class="listitem"><p>Search results can include brief descriptions of the target.<a id="id36123259" class="indexterm"></a></p></li></ul></div></li><li class="listitem"><p>Table of contents pane with collapsible toc tree.</p></li><li class="listitem"><p>Auto-synchronization of content pane and TOC.</p></li><li class="listitem"><p>TOC and search pane implemented without the use of a frameset.</p></li><li class="listitem"><p>An Ant <code class="filename">build.xml</code> file to generate output. You can use this
+ build file by importing it into your own or use it as a model for integrating this
+ output format into your own build system.</p></li></ul></div><p>
+ </p><div class="itemizedlist" title="Possible future enhancements"><p class="title"><strong>Possible future enhancements</strong></p><ul class="itemizedlist" type="disc"><li class="listitem"><p>Move webhelp-specific parameters and gentext strings into base DocBook stylesheets.
+ </p></li><li class="listitem"><p>Use <code class="sgmltag-attribute">tabindex</code> attributes to control the tab
+ order in the output. The Contents and Search tabs should be first and second, then the
+ search box and button, then the table of contents items, and so on.</p></li><li class="listitem"><p>Add "Expand all" and "Collapse all" buttons to the table of contents.</p></li><li class="listitem"><p>Add other search options:</p><div class="itemizedlist"><ul class="itemizedlist" type="circle"><li class="listitem"><p>Add an option to use Lucene for server-side searches with table of contents
+ state persisted on the server.</p></li><li class="listitem"><p>Add a simple form that uses a Google site:my.domain.com based search.</p></li></ul></div></li><li class="listitem"><p>Sort search results based on relevance</p></li><li class="listitem"><p>Support wild card characters in the search query.</p></li><li class="listitem"><p>Parameterize width of the TOC pane OR make the TOC pane resizeable by the
+ user.</p></li><li class="listitem"><p>Automate search results summary text:</p><div class="itemizedlist"><ul class="itemizedlist" type="circle"><li class="listitem"><p>Automatically use the first non-heading content as the summary in the search
+ results.</p></li><li class="listitem"><p>Automatically limit the size of the search description to something 140
+ characters.</p></li></ul></div></li><li class="listitem"><p>Support boolean operators in search.</p></li><li class="listitem"><p>Parameterize list of files to exclude from indexing. Currently it's hard coded that
+ we don't index <code class="filename">index.html </code>and <code class="filename">ix01.html</code> (the
+ legal notice and index topics). It should be smarter and automatically not index the
+ index file even if it's not named <code class="filename">ix01.html</code>.</p></li><li class="listitem"><p>Improve performance by moving the table of contents div out of each page and into a
+ separate JavaScript file which then adds it to the page.</p></li><li class="listitem"><p>Add to the indexer the ability to specify a list of files or file patterns not to
+ index. Currently it does not index <code class="filename">index.html</code> or
+ <code class="filename">ix01.html</code>, which is generally appropriate, but it should be up to
+ the user to decide.</p></li><li class="listitem"><p>Add an index tab populated by a separate JavaScript file. Include a param/property
+ that allows the content creator to disable the index.</p></li><li class="listitem"><p>Add functionality to the <code class="filename">build.xml</code> file so that when a property
+ is set, the build generates a pdf version of the document and includes a link to it from
+ the header.</p></li><li class="listitem"><p>Add <a class="ulink" href="http://www.comparenetworks.com/developers/jqueryplugins/jbreadcrumb.html" target="_top">breadcrumbs</a> so the user will know what topics he's been to.</p></li><li class="listitem"><p>Consider using more advanced Lucene indexers for Chinese and Japanese than the
+ CJKAnalyzer</p></li></ul></div></div><script type="text/javascript" src="../common/main.js"></script><div class="navfooter"><hr /><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="index.html">Prev</a> </td><td width="20%" align="center"> </td><td width="40%" align="right"> <a accesskey="n" href="ch02.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top"> </td><td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td><td width="40%" align="right" valign="top"> </td></tr></table></div></div><div><div id="leftnavigation" style="padding-top:3px; background-color:white;"><div id="tabs"><ul><li><a href="#treeDiv"><em>Contents</em></a></li><li><a href="#searchDiv"><em>Search</em></a></li></ul><div id="treeDiv"><img src="../common/images/loading.gif" alt="loading table of contents..." id="tocLoading" style="display:block;" /><div id="ulTreeDiv" style="display:none"><ul id="tree" class="filetree"><li id="webhelp-currentid"><span class="file"><a href="ch01.html">Introduction</a></span></li><li><span class="file"><a href="ch02.html">Using the package</a></span><ul><li><span class="file"><a href="ch02s01.html">Generating webhelp output</a></span></li><li><span class="file"><a href="ch02s02.html">Using and customizing the output</a></span><ul><li><span class="file"><a href="ch02s02.html#id36124136">Recommended Apache configurations</a></span></li></ul></li><li><span class="file"><a href="ch02s03.html">Building the indexer</a></span></li><li><span class="file"><a href="ch02s04.html">Adding support for other (non-CJKV) languages</a></span></li></ul></li><li><span class="file"><a href="ch03.html">Developer Docs</a></span><ul><li><span class="file"><a href="ch03s01.html">Design</a></span></li><li><span class="file"><a href="ch03s02.html">Search</a></span><ul><li><span class="file"><a href="ch03s02.html#id36124646">New Stemmers</a></span></li></ul></li></ul></li></ul></div></div><div id="searchDiv"><div id="search"><form onsubmit="Verifie(ditaSearch_Form);return false" name="ditaSearch_Form" class="searchForm" id="ditaSearch_Form"><fieldset class="searchFieldSet"><legend>Search</legend><center><input id="textToSearch" name="textToSearch" type="text" class="searchText" /> &nbsp; <input onclick="Verifie(ditaSearch_Form)" type="button" class="searchButton" value="Go" id="doSearch" /></center></fieldset></form></div><div id="searchResults"><center></center></div></div></div></div></div></body></html>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/docs/content/ch02.html b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/docs/content/ch02.html
new file mode 100644
index 0000000..d7f7def
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/docs/content/ch02.html
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xmlns:exsl="http://exslt.org/common" xmlns:ng="http://docbook.org/docbook-ng" xmlns:db="http://docbook.org/ns/docbook"><head>
+<meta http-equiv="X-UA-Compatible" content="IE=7" />
+<title>Chapter 2. Using the package</title><meta name="generator" content="DocBook XSL Stylesheets V1.76.1" /><link rel="home" href="index.html" title="README: Web-based Help from DocBook XML" /><link rel="up" href="index.html" title="README: Web-based Help from DocBook XML" /><link rel="prev" href="ch01.html" title="Chapter 1. Introduction" /><link rel="next" href="ch02s01.html" title="Generating webhelp output" /><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><script type="text/javascript">
+ //The id for tree cookie
+ var treeCookieId = "treeview-897";
+ var language = "en";
+ var w = new Object();
+ //Localization
+ txt_filesfound = 'Results';
+ txt_enter_at_least_1_char = "You must enter at least one character.";
+ txt_browser_not_supported = "Your browser is not supported. Use of Mozilla Firefox is recommended.";
+ txt_please_wait = "Please wait. Search in progress...";
+ txt_results_for = "Results for: ";
+ </script><style type="text/css">
+ input {
+ margin-bottom: 5px;
+ margin-top: 2px;
+ }
+
+ .folder {
+ display: block;
+ height: 22px;
+ padding-left: 20px;
+ background: transparent url(../common/jquery/treeview/images/folder.gif) 0 0px no-repeat;
+ }
+ </style><link rel="shortcut icon" href="../favicon.ico" type="image/x-icon" /><link rel="stylesheet" type="text/css" href="../common/css/positioning.css" /><link rel="stylesheet" type="text/css" href="../common/jquery/theme-redmond/jquery-ui-1.8.2.custom.css" /><link rel="stylesheet" type="text/css" href="../common/jquery/treeview/jquery.treeview.css" /><script type="text/javascript" src="../common/jquery/jquery-1.4.2.min.js"></script><script type="text/javascript" src="../common/jquery/jquery-ui-1.8.2.custom.min.js"></script><script type="text/javascript" src="../common/jquery/jquery.cookie.js"></script><script type="text/javascript" src="../common/jquery/treeview/jquery.treeview.min.js"></script><script type="text/javascript" src="search/htmlFileList.js"></script><script type="text/javascript" src="search/htmlFileInfoList.js"></script><script type="text/javascript" src="search/nwSearchFnt.js"></script><script type="text/javascript" src="search/stemmers/en_stemmer.js"><!--//make this scalable to other languages as well.--></script><script type="text/javascript" src="search/index-1.js"></script><script type="text/javascript" src="search/index-2.js"></script><script type="text/javascript" src="search/index-3.js"></script></head><body><div id="header"><img style="margin-right: 2px; height: 59px; padding-right: 25px; padding-top: 8px" align="right" src="../common/images/logo.png" alt="Company Logo" /><h1 align="center">Chapter 2. Using the package<br /> </h1><div id="navheader" align="right"><table><tr><td style="height: 28px; width: 16px;"><a id="showHideButton" onclick="showHideToc();" class="pointLeft" title="Hide TOC tree">.
+ </a></td><td><img src="../common/images/highlight-blue.gif" alt="H" height="25px" onclick="toggleHighlight()" id="showHideHighlight" style="cursor:pointer" title="Toggle search result highlighting" /></td><td><a accesskey="p" href="ch01.html">Prev</a> 
+ |
+ <a accesskey="n" href="ch02s01.html">Next</a></td></tr></table></div></div><div id="content"><div class="chapter" title="Chapter 2. Using the package"><div class="titlepage"><div><div><h2 class="title"><a id="id36123631"></a>Chapter 2. Using the package</h2></div></div></div><div class="toc"><p><strong>Contents</strong></p><dl><dt><span class="section"><a href="ch02s01.html">Generating webhelp output</a></span></dt><dt><span class="section"><a href="ch02s02.html">Using and customizing the output</a></span></dt><dd><dl><dt><span class="section"><a href="ch02s02.html#id36124136">Recommended Apache configurations</a></span></dt></dl></dd><dt><span class="section"><a href="ch02s03.html">Building the indexer</a></span></dt><dt><span class="section"><a href="ch02s04.html">Adding support for other (non-CJKV) languages</a></span></dt></dl></div><p class="summary">The following sections describe how to install and
+ use the package on Windows.</p></div><script type="text/javascript" src="../common/main.js"></script><div class="navfooter"><hr /><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="ch01.html">Prev</a> </td><td width="20%" align="center"> </td><td width="40%" align="right"> <a accesskey="n" href="ch02s01.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top"> </td><td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td><td width="40%" align="right" valign="top"> </td></tr></table></div></div><div><div id="leftnavigation" style="padding-top:3px; background-color:white;"><div id="tabs"><ul><li><a href="#treeDiv"><em>Contents</em></a></li><li><a href="#searchDiv"><em>Search</em></a></li></ul><div id="treeDiv"><img src="../common/images/loading.gif" alt="loading table of contents..." id="tocLoading" style="display:block;" /><div id="ulTreeDiv" style="display:none"><ul id="tree" class="filetree"><li><span class="file"><a href="ch01.html">Introduction</a></span></li><li id="webhelp-currentid"><span class="file"><a href="ch02.html">Using the package</a></span><ul><li><span class="file"><a href="ch02s01.html">Generating webhelp output</a></span></li><li><span class="file"><a href="ch02s02.html">Using and customizing the output</a></span><ul><li><span class="file"><a href="ch02s02.html#id36124136">Recommended Apache configurations</a></span></li></ul></li><li><span class="file"><a href="ch02s03.html">Building the indexer</a></span></li><li><span class="file"><a href="ch02s04.html">Adding support for other (non-CJKV) languages</a></span></li></ul></li><li><span class="file"><a href="ch03.html">Developer Docs</a></span><ul><li><span class="file"><a href="ch03s01.html">Design</a></span></li><li><span class="file"><a href="ch03s02.html">Search</a></span><ul><li><span class="file"><a href="ch03s02.html#id36124646">New Stemmers</a></span></li></ul></li></ul></li></ul></div></div><div id="searchDiv"><div id="search"><form onsubmit="Verifie(ditaSearch_Form);return false" name="ditaSearch_Form" class="searchForm" id="ditaSearch_Form"><fieldset class="searchFieldSet"><legend>Search</legend><center><input id="textToSearch" name="textToSearch" type="text" class="searchText" /> &nbsp; <input onclick="Verifie(ditaSearch_Form)" type="button" class="searchButton" value="Go" id="doSearch" /></center></fieldset></form></div><div id="searchResults"><center></center></div></div></div></div></div></body></html>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/docs/content/ch02s01.html b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/docs/content/ch02s01.html
new file mode 100644
index 0000000..0b7c930
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/docs/content/ch02s01.html
@@ -0,0 +1,117 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xmlns:exsl="http://exslt.org/common" xmlns:ng="http://docbook.org/docbook-ng" xmlns:db="http://docbook.org/ns/docbook"><head>
+<meta http-equiv="X-UA-Compatible" content="IE=7" />
+<title>Generating webhelp output</title><meta name="generator" content="DocBook XSL Stylesheets V1.76.1" /><meta name="description" content="Installation instructions" /><link rel="home" href="index.html" title="README: Web-based Help from DocBook XML" /><link rel="up" href="ch02.html" title="Chapter 2. Using the package" /><link rel="prev" href="ch02.html" title="Chapter 2. Using the package" /><link rel="next" href="ch02s02.html" title="Using and customizing the output" /><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><script type="text/javascript">
+ //The id for tree cookie
+ var treeCookieId = "treeview-897";
+ var language = "en";
+ var w = new Object();
+ //Localization
+ txt_filesfound = 'Results';
+ txt_enter_at_least_1_char = "You must enter at least one character.";
+ txt_browser_not_supported = "Your browser is not supported. Use of Mozilla Firefox is recommended.";
+ txt_please_wait = "Please wait. Search in progress...";
+ txt_results_for = "Results for: ";
+ </script><style type="text/css">
+ input {
+ margin-bottom: 5px;
+ margin-top: 2px;
+ }
+
+ .folder {
+ display: block;
+ height: 22px;
+ padding-left: 20px;
+ background: transparent url(../common/jquery/treeview/images/folder.gif) 0 0px no-repeat;
+ }
+ </style><link rel="shortcut icon" href="../favicon.ico" type="image/x-icon" /><link rel="stylesheet" type="text/css" href="../common/css/positioning.css" /><link rel="stylesheet" type="text/css" href="../common/jquery/theme-redmond/jquery-ui-1.8.2.custom.css" /><link rel="stylesheet" type="text/css" href="../common/jquery/treeview/jquery.treeview.css" /><script type="text/javascript" src="../common/jquery/jquery-1.4.2.min.js"></script><script type="text/javascript" src="../common/jquery/jquery-ui-1.8.2.custom.min.js"></script><script type="text/javascript" src="../common/jquery/jquery.cookie.js"></script><script type="text/javascript" src="../common/jquery/treeview/jquery.treeview.min.js"></script><script type="text/javascript" src="search/htmlFileList.js"></script><script type="text/javascript" src="search/htmlFileInfoList.js"></script><script type="text/javascript" src="search/nwSearchFnt.js"></script><script type="text/javascript" src="search/stemmers/en_stemmer.js"><!--//make this scalable to other languages as well.--></script><script type="text/javascript" src="search/index-1.js"></script><script type="text/javascript" src="search/index-2.js"></script><script type="text/javascript" src="search/index-3.js"></script></head><body><div id="header"><img style="margin-right: 2px; height: 59px; padding-right: 25px; padding-top: 8px" align="right" src="../common/images/logo.png" alt="Company Logo" /><h1 align="center">Generating webhelp output<br />Chapter 2. Using the package</h1><div id="navheader" align="right"><table><tr><td style="height: 28px; width: 16px;"><a id="showHideButton" onclick="showHideToc();" class="pointLeft" title="Hide TOC tree">.
+ </a></td><td><img src="../common/images/highlight-blue.gif" alt="H" height="25px" onclick="toggleHighlight()" id="showHideHighlight" style="cursor:pointer" title="Toggle search result highlighting" /></td><td><a accesskey="p" href="ch02.html">Prev</a>
+ |
+ <a accesskey="u" href="ch02.html">Up</a>
+ |
+ <a accesskey="n" href="ch02s02.html">Next</a></td></tr></table></div></div><div id="content"><div class="section" title="Generating webhelp output"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a id="id36123640"></a>Generating webhelp output</h2></div><div><div class="abstract" title="Abstract"><p class="title"><strong>Abstract</strong></p><p>Installation instructions</p></div></div></div></div><div class="procedure" title="Procedure 2.1. To install the package on Windows"><a id="id36123655"></a><p class="title"><strong>Procedure 2.1. To install the package on Windows</strong></p><div class="note" title="Note" style="margin-left: 0.5in; margin-right: 0.5in;"><h3 class="title">Note</h3><p>The examples in this procedure assume a Windows installation,
+ but the process is the same in other environments,
+ <span class="foreignphrase"><em class="foreignphrase">mutatis mutandis</em></span>.</p></div><ol class="procedure" type="1"><li class="step" title="Step 1"><p>If necessary, install <a class="ulink" href="http://www.java.com/en/download/manual.jsp" target="_top">Java 1.6</a> or
+ higher.</p><ol type="a" class="substeps"><li class="step" title="Step 1.a"><p>Confirm that Java is installed and in your
+ <code class="envar">PATH</code> by typing the following at a command prompt:
+ </p><pre class="programlisting">java -version</pre><div class="note" title="Note" style="margin-left: 0.5in; margin-right: 0.5in;"><h3 class="title">Note</h3><p>To build the indexer, you must have the JDK.</p></div></li></ol></li><li class="step" title="Step 2"><p>If necessary, install <a class="ulink" href="http://ant.apache.org/bindownload.cgi" target="_top">Apache Ant</a> 1.6.5
+ or higher.</p><ol type="a" class="substeps"><li class="step" title="Step 2.a"><p>Unzip the Ant binary distribution to a convenient location
+ on your system. For example: <code class="filename">c:\Program
+ Files</code>.</p></li><li class="step" title="Step 2.b"><p>Set the environment variable <code class="envar">ANT_HOME</code> to
+ the top-level Ant directory. For example: <code class="filename">c:\Program
+ Files\apache-ant-1.7.1</code>. </p><div class="tip" title="Tip" style="margin-left: 0.5in; margin-right: 0.5in;"><h3 class="title">Tip</h3><p>See <a class="ulink" href="http://support.microsoft.com/kb/310519" target="_top">How To Manage
+ Environment Variables in Windows XP</a> for information
+ on setting environment variables.</p></div></li><li class="step" title="Step 2.c"><p>Add the Ant <code class="filename">bin</code> directory to your
+ <code class="envar">PATH</code>. For example: <code class="filename">c:\Program
+ Files\apache-ant-1.7.1\bin</code></p></li><li class="step" title="Step 2.d"><p>Confirm that Ant is installed by typing the following at a
+ command prompt: </p><pre class="programlisting">ant -version</pre><div class="note" title="Note" style="margin-left: 0.5in; margin-right: 0.5in;"><h3 class="title">Note</h3><p>If you see a message about the file
+ <code class="filename">tools.jar</code> being missing, you can safely
+ ignore it.</p></div></li></ol></li><li class="step" title="Step 3"><p>Download <a class="ulink" href="http://prdownloads.sourceforge.net/saxon/saxon6-5-5.zip" target="_top">Saxon
+ 6.5.x</a> and unzip the distribution to a convenient location on your file system.
+ You will use the path to <code class="filename">saxon.jar</code> in <a class="xref" href="ch02s01.html#edit-build-properties" title="Step 4">Step 4</a> below.</p><div class="note" title="Note" style="margin-left: 0.5in; margin-right: 0.5in;"><h3 class="title">Note</h3><p>The <code class="filename">build.xml</code> has only been tested with Saxon 6.5, though
+ it could be adapted to work with other XSLT processors. However, when you generate
+ output, the Saxon jar must <span class="bold"><strong>not</strong></span> be in your
+ <code class="envar">CLASSPATH</code>.</p></div></li><li class="step" title="Step 4"><a id="edit-build-properties"></a><p>In a text editor, edit the
+ <code class="filename">build.properties</code> file in the webhelp directory
+ and make the changes indicated by the comments:</p><pre class="programlisting"># The path (relative to the build.xml file) to your input document.
+# To use your own input document, create a build.xml file of your own
+# and import this build.xml.
+input-xml=docsrc/readme.xml
+
+# The directory in which to put the output files.
+# This directory is created if it does not exist.
+output-dir=docs
+
+# If you are using a customization layer that imports webhelp.xsl, use
+# this property to point to it.
+stylesheet-path=${ant.file.dir}/xsl/webhelp.xsl
+
+# If your document has image directories that need to be copied
+# to the output directory, you can list patterns here.
+# See the Ant documentation for fileset for documentation
+# on patterns.
+#input-images-dirs=images/**,figures/**,graphics/**
+
+# By default, the ant script assumes your images are stored
+# in the same directory as the input-xml. If you store your
+# image directories in another directory, specify it here.
+# and uncomment this line.
+#input-images-basedir=/path/to/image/location
+
+# Modify this so that it points to your copy of the Saxon 6.5 jar.
+xslt-processor-classpath=/usr/share/java/saxon-6.5.5.jar
+
+# For non-ns version only, this validates the document
+# against a dtd.
+validate-against-dtd=true
+
+# Set this to false if you don't need a search tab.
+webhelp.include.search.tab=true
+
+# indexer-language is used to tell the search indexer which language
+# the docbook is written. This will be used to identify the correct
+# stemmer, and punctuations that differs from language to language.
+# see the documentation for details. en=English, fr=French, de=German,
+# zh=Chinese, ja=Japanese etc.
+webhelp.indexer.language=en</pre></li><li class="step" title="Step 5"><p>Test the package by running the command <code class="code">ant webhelp
+ -Doutput-dir=test-ouput</code> at the command line in the webhelp directory. It should
+ generate a copy of this documentation in the <code class="filename">doc</code>
+ directory. Type <code class="code">start test-output\index.html</code> to open the output in a
+ browser. Once you have confirmed that the process worked, you can delete the <code class="filename">test-output</code> directory. </p><div class="important" title="Important" style="margin-left: 0.5in; margin-right: 0.5in;"><h3 class="title">Important</h3><p>The Saxon 6.5 jar should <span class="emphasis"><em>not</em></span> be in your
+ <code class="envar">CLASSPATH</code> when you generate the webhelp output. If you have any
+ problems, try running ant with an empty <code class="envar">CLASSPATH</code>.</p></div></li><li class="step" title="Step 6"><p>To process your own document, simply refer to this package
+ from another <code class="filename">build.xml</code> in arbitrary location on
+ your system:</p><ol type="a" class="substeps"><li class="step" title="Step 6.a"><p>Create a new <code class="filename">build.xml</code> file that
+ defines the name of your source file, the desired output
+ directory, and imports the <code class="filename">build.xml</code> from
+ this package. For example: </p><pre class="programlisting">&lt;project&gt;
+ &lt;property name="input-xml" value="<em class="replaceable"><code>path-to/yourfile.xml</code></em>"/&gt;
+ &lt;property name="input-images-dirs" value="<em class="replaceable"><code>images/** figures/** graphics/**</code></em>"/&gt;
+ &lt;property name="output-dir" value="<em class="replaceable"><code>path-to/desired-output-dir</code></em>"/&gt;
+ &lt;import file="<em class="replaceable"><code>path-to/docbook-webhelp/</code></em>build.xml"/&gt;
+&lt;/project&gt;</pre></li><li class="step" title="Step 6.b"><p>From the directory containing your newly created
+ <code class="filename">build.xml</code> file, type <code class="code">ant
+ webhelp</code> to build your document.</p><div class="important" title="Important" style="margin-left: 0.5in; margin-right: 0.5in;"><h3 class="title">Important</h3><p>The Saxon 6.5 jar should <span class="emphasis"><em>not</em></span> be in your
+ <code class="envar">CLASSPATH</code> when you generate the webhelp output. If you have any
+ problems, try running ant with an empty <code class="envar">CLASSPATH</code>.</p></div></li></ol></li></ol></div></div><script type="text/javascript" src="../common/main.js"></script><div class="navfooter"><hr /><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="ch02.html">Prev</a> </td><td width="20%" align="center"><a accesskey="u" href="ch02.html">Up</a></td><td width="40%" align="right"> <a accesskey="n" href="ch02s02.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top"> </td><td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td><td width="40%" align="right" valign="top"> </td></tr></table></div></div><div><div id="leftnavigation" style="padding-top:3px; background-color:white;"><div id="tabs"><ul><li><a href="#treeDiv"><em>Contents</em></a></li><li><a href="#searchDiv"><em>Search</em></a></li></ul><div id="treeDiv"><img src="../common/images/loading.gif" alt="loading table of contents..." id="tocLoading" style="display:block;" /><div id="ulTreeDiv" style="display:none"><ul id="tree" class="filetree"><li><span class="file"><a href="ch01.html">Introduction</a></span></li><li><span class="file"><a href="ch02.html">Using the package</a></span><ul><li id="webhelp-currentid"><span class="file"><a href="ch02s01.html">Generating webhelp output</a></span></li><li><span class="file"><a href="ch02s02.html">Using and customizing the output</a></span><ul><li><span class="file"><a href="ch02s02.html#id36124136">Recommended Apache configurations</a></span></li></ul></li><li><span class="file"><a href="ch02s03.html">Building the indexer</a></span></li><li><span class="file"><a href="ch02s04.html">Adding support for other (non-CJKV) languages</a></span></li></ul></li><li><span class="file"><a href="ch03.html">Developer Docs</a></span><ul><li><span class="file"><a href="ch03s01.html">Design</a></span></li><li><span class="file"><a href="ch03s02.html">Search</a></span><ul><li><span class="file"><a href="ch03s02.html#id36124646">New Stemmers</a></span></li></ul></li></ul></li></ul></div></div><div id="searchDiv"><div id="search"><form onsubmit="Verifie(ditaSearch_Form);return false" name="ditaSearch_Form" class="searchForm" id="ditaSearch_Form"><fieldset class="searchFieldSet"><legend>Search</legend><center><input id="textToSearch" name="textToSearch" type="text" class="searchText" /> &nbsp; <input onclick="Verifie(ditaSearch_Form)" type="button" class="searchButton" value="Go" id="doSearch" /></center></fieldset></form></div><div id="searchResults"><center></center></div></div></div></div></div></body></html>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/docs/content/ch02s02.html b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/docs/content/ch02s02.html
new file mode 100644
index 0000000..091e67c
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/docs/content/ch02s02.html
@@ -0,0 +1,102 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xmlns:exsl="http://exslt.org/common" xmlns:ng="http://docbook.org/docbook-ng" xmlns:db="http://docbook.org/ns/docbook"><head>
+<meta http-equiv="X-UA-Compatible" content="IE=7" />
+<title>Using and customizing the output</title><meta name="generator" content="DocBook XSL Stylesheets V1.76.1" /><link rel="home" href="index.html" title="README: Web-based Help from DocBook XML" /><link rel="up" href="ch02.html" title="Chapter 2. Using the package" /><link rel="prev" href="ch02s01.html" title="Generating webhelp output" /><link rel="next" href="ch02s03.html" title="Building the indexer" /><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><script type="text/javascript">
+ //The id for tree cookie
+ var treeCookieId = "treeview-897";
+ var language = "en";
+ var w = new Object();
+ //Localization
+ txt_filesfound = 'Results';
+ txt_enter_at_least_1_char = "You must enter at least one character.";
+ txt_browser_not_supported = "Your browser is not supported. Use of Mozilla Firefox is recommended.";
+ txt_please_wait = "Please wait. Search in progress...";
+ txt_results_for = "Results for: ";
+ </script><style type="text/css">
+ input {
+ margin-bottom: 5px;
+ margin-top: 2px;
+ }
+
+ .folder {
+ display: block;
+ height: 22px;
+ padding-left: 20px;
+ background: transparent url(../common/jquery/treeview/images/folder.gif) 0 0px no-repeat;
+ }
+ </style><link rel="shortcut icon" href="../favicon.ico" type="image/x-icon" /><link rel="stylesheet" type="text/css" href="../common/css/positioning.css" /><link rel="stylesheet" type="text/css" href="../common/jquery/theme-redmond/jquery-ui-1.8.2.custom.css" /><link rel="stylesheet" type="text/css" href="../common/jquery/treeview/jquery.treeview.css" /><script type="text/javascript" src="../common/jquery/jquery-1.4.2.min.js"></script><script type="text/javascript" src="../common/jquery/jquery-ui-1.8.2.custom.min.js"></script><script type="text/javascript" src="../common/jquery/jquery.cookie.js"></script><script type="text/javascript" src="../common/jquery/treeview/jquery.treeview.min.js"></script><script type="text/javascript" src="search/htmlFileList.js"></script><script type="text/javascript" src="search/htmlFileInfoList.js"></script><script type="text/javascript" src="search/nwSearchFnt.js"></script><script type="text/javascript" src="search/stemmers/en_stemmer.js"><!--//make this scalable to other languages as well.--></script><script type="text/javascript" src="search/index-1.js"></script><script type="text/javascript" src="search/index-2.js"></script><script type="text/javascript" src="search/index-3.js"></script></head><body><div id="header"><img style="margin-right: 2px; height: 59px; padding-right: 25px; padding-top: 8px" align="right" src="../common/images/logo.png" alt="Company Logo" /><h1 align="center">Using and customizing the output<br />Chapter 2. Using the package</h1><div id="navheader" align="right"><table><tr><td style="height: 28px; width: 16px;"><a id="showHideButton" onclick="showHideToc();" class="pointLeft" title="Hide TOC tree">.
+ </a></td><td><img src="../common/images/highlight-blue.gif" alt="H" height="25px" onclick="toggleHighlight()" id="showHideHighlight" style="cursor:pointer" title="Toggle search result highlighting" /></td><td><a accesskey="p" href="ch02s01.html">Prev</a>
+ |
+ <a accesskey="u" href="ch02.html">Up</a>
+ |
+ <a accesskey="n" href="ch02s03.html">Next</a></td></tr></table></div></div><div id="content"><div class="section" title="Using and customizing the output"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a id="id36124011"></a>Using and customizing the output</h2></div></div></div><p>To deep link to a topic inside the help set, simply link directly
+ to the page. This help system uses no frameset, so nothing further is
+ necessary. </p><div class="tip" title="Tip" style="margin-left: 0.5in; margin-right: 0.5in;"><h3 class="title">Tip</h3><p>See <a class="ulink" href="http://www.sagehill.net/docbookxsl/Chunking.html" target="_top">Chunking into
+ multiple HTML files</a> in Bob Stayton's <a class="ulink" href="http://www.sagehill.net/docbookxsl/index.html" target="_top">DocBook XSL: The
+ Complete Guide</a> for information on controlling output file
+ names and which files are chunked in DocBook.</p></div><p>When you perform a search, the results can include brief
+ summaries. These are populated in one of two ways:</p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>By adding <code class="sgmltag-element">role="summary"</code> to a
+ <code class="sgmltag-element">para</code> or <code class="sgmltag-element">phrase</code> in the
+ <code class="sgmltag-element">chapter</code> or <code class="sgmltag-element">section</code>.</p></li><li class="listitem"><p>By adding an <code class="sgmltag-element">abstract</code> to the
+ <code class="sgmltag-element">chapterinfo</code> or <code class="sgmltag-element">sectioninfo</code>
+ element.</p></li></ul></div><p>To customize the look and feel of the help, study the following
+ css files:</p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p><code class="filename">docs/common/css/positioning.css</code>: This
+ handles the Positioning of DIVs in appropriate positions. For
+ example, it causes the <code class="code">leftnavigation</code> div to appear
+ on the left, the header on top, and so on. Use this if you need to
+ change the relative positions or need to change the width/height
+ etc.</p></li><li class="listitem"><p><code class="filename">docs/common/jquery/theme-redmond/jquery-ui-1.8.2.custom.css</code>:
+ This is the theming part which adds colors and stuff. This is a
+ default theme comes with <a class="ulink" href="http://jqueryui.com/download" target="_top">jqueryui</a> unchanged. You
+ can get any theme based your interest from this. (Themes are on
+ right navigation bar.) Then replace the css theme folder
+ (theme-redmond) with it, and change the xsl to point to the new
+ css.</p></li><li class="listitem"><p><code class="filename">docs/common/jquery/treeview/jquery.treeview.css</code>:
+ This styles the toc Tree. Generally, you don't have to edit this
+ file.</p></li></ul></div><div class="section" title="Recommended Apache configurations"><div class="titlepage"><div><div><h3 class="title"><a id="id36124136"></a>Recommended Apache configurations</h3></div></div></div><p>If you are serving a long document from an Apache web server, we
+ recommend you make the following additions or changes to your
+ <code class="filename">httpd.conf</code> or <code class="filename">.htaccess</code>
+ file. <em><span class="remark">TODO: Explain what each thing
+ does.</span></em></p><pre class="programlisting">AddDefaultCharSet UTF-8 # <a id="AddDefaultCharSet"></a><img src="images/callouts/1.png" alt="1" border="0" />
+
+ # 480 weeks
+ &lt;FilesMatch "\.(ico|pdf|flv|jpg|jpeg|png|gif|js|css|swf)$"&gt; # <a id="CachingSettings"></a><img src="images/callouts/2.png" alt="2" border="0" />
+ Header set Cache-Control "max-age=290304000, public"
+ &lt;/FilesMatch&gt;
+
+ # 2 DAYS
+ &lt;FilesMatch "\.(xml|txt)$"&gt;
+ Header set Cache-Control "max-age=172800, public, must-revalidate"
+ &lt;/FilesMatch&gt;
+
+ # 2 HOURS
+ &lt;FilesMatch "\.(html|htm)$"&gt;
+ Header set Cache-Control "max-age=7200, must-revalidate"
+ &lt;/FilesMatch&gt;
+
+ # compress text, html, javascript, css, xml:
+ AddOutputFilterByType DEFLATE text/plain # <a id="CompressSetting"></a><img src="images/callouts/3.png" alt="3" border="0" />
+ AddOutputFilterByType DEFLATE text/html
+ AddOutputFilterByType DEFLATE text/xml
+ AddOutputFilterByType DEFLATE text/css
+ AddOutputFilterByType DEFLATE application/xml
+ AddOutputFilterByType DEFLATE application/xhtml+xml
+ AddOutputFilterByType DEFLATE application/rss+xml
+ AddOutputFilterByType DEFLATE application/javascript
+ AddOutputFilterByType DEFLATE application/x-javascript
+
+ # Or, compress certain file types by extension:
+ &lt;Files *.html&gt;
+ SetOutputFilter DEFLATE
+ &lt;/Files&gt;
+ </pre><div class="calloutlist"><table border="0" summary="Callout list"><tr><td width="5%" valign="top" align="left"><p><a href="#AddDefaultCharSet"><img src="images/callouts/1.png" alt="1" border="0" /></a> </p></td><td valign="top" align="left"><p>See <a class="ulink" href="http://www.sagehill.net/docbookxsl/SpecialChars.html" target="_top">Odd
+ characters in HTML output</a> in Bob Stayton's book
+ <em class="citetitle">DocBook XSL: The Complete Guide</em> for more
+ information about this setting.</p></td></tr><tr><td width="5%" valign="top" align="left"><p><a href="#CachingSettings"><img src="images/callouts/2.png" alt="2" border="0" /></a> </p></td><td valign="top" align="left"><p>These lines and those that follow cause the browser to
+ cache various resources such as bitmaps and JavaScript files.
+ Note that caching JavaScript files could cause your users to
+ have stale search indexes if you update your document since the
+ search index is stored in JavaScript files.</p></td></tr><tr><td width="5%" valign="top" align="left"><p><a href="#CompressSetting"><img src="images/callouts/3.png" alt="3" border="0" /></a> </p></td><td valign="top" align="left"><p>These lines cause the the server to compress html, css,
+ and JavaScript files and the brower to uncompress them to
+ improve download performance.</p></td></tr></table></div></div></div><script type="text/javascript" src="../common/main.js"></script><div class="navfooter"><hr /><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="ch02s01.html">Prev</a> </td><td width="20%" align="center"><a accesskey="u" href="ch02.html">Up</a></td><td width="40%" align="right"> <a accesskey="n" href="ch02s03.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top"> </td><td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td><td width="40%" align="right" valign="top"> </td></tr></table></div></div><div><div id="leftnavigation" style="padding-top:3px; background-color:white;"><div id="tabs"><ul><li><a href="#treeDiv"><em>Contents</em></a></li><li><a href="#searchDiv"><em>Search</em></a></li></ul><div id="treeDiv"><img src="../common/images/loading.gif" alt="loading table of contents..." id="tocLoading" style="display:block;" /><div id="ulTreeDiv" style="display:none"><ul id="tree" class="filetree"><li><span class="file"><a href="ch01.html">Introduction</a></span></li><li><span class="file"><a href="ch02.html">Using the package</a></span><ul><li><span class="file"><a href="ch02s01.html">Generating webhelp output</a></span></li><li id="webhelp-currentid"><span class="file"><a href="ch02s02.html">Using and customizing the output</a></span><ul><li><span class="file"><a href="ch02s02.html#id36124136">Recommended Apache configurations</a></span></li></ul></li><li><span class="file"><a href="ch02s03.html">Building the indexer</a></span></li><li><span class="file"><a href="ch02s04.html">Adding support for other (non-CJKV) languages</a></span></li></ul></li><li><span class="file"><a href="ch03.html">Developer Docs</a></span><ul><li><span class="file"><a href="ch03s01.html">Design</a></span></li><li><span class="file"><a href="ch03s02.html">Search</a></span><ul><li><span class="file"><a href="ch03s02.html#id36124646">New Stemmers</a></span></li></ul></li></ul></li></ul></div></div><div id="searchDiv"><div id="search"><form onsubmit="Verifie(ditaSearch_Form);return false" name="ditaSearch_Form" class="searchForm" id="ditaSearch_Form"><fieldset class="searchFieldSet"><legend>Search</legend><center><input id="textToSearch" name="textToSearch" type="text" class="searchText" /> &nbsp; <input onclick="Verifie(ditaSearch_Form)" type="button" class="searchButton" value="Go" id="doSearch" /></center></fieldset></form></div><div id="searchResults"><center></center></div></div></div></div></div></body></html>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/docs/content/ch02s03.html b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/docs/content/ch02s03.html
new file mode 100644
index 0000000..4e0efde
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/docs/content/ch02s03.html
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xmlns:exsl="http://exslt.org/common" xmlns:ng="http://docbook.org/docbook-ng" xmlns:db="http://docbook.org/ns/docbook"><head>
+<meta http-equiv="X-UA-Compatible" content="IE=7" />
+<title>Building the indexer</title><meta name="generator" content="DocBook XSL Stylesheets V1.76.1" /><link rel="home" href="index.html" title="README: Web-based Help from DocBook XML" /><link rel="up" href="ch02.html" title="Chapter 2. Using the package" /><link rel="prev" href="ch02s02.html" title="Using and customizing the output" /><link rel="next" href="ch02s04.html" title="Adding support for other (non-CJKV) languages" /><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><script type="text/javascript">
+ //The id for tree cookie
+ var treeCookieId = "treeview-897";
+ var language = "en";
+ var w = new Object();
+ //Localization
+ txt_filesfound = 'Results';
+ txt_enter_at_least_1_char = "You must enter at least one character.";
+ txt_browser_not_supported = "Your browser is not supported. Use of Mozilla Firefox is recommended.";
+ txt_please_wait = "Please wait. Search in progress...";
+ txt_results_for = "Results for: ";
+ </script><style type="text/css">
+ input {
+ margin-bottom: 5px;
+ margin-top: 2px;
+ }
+
+ .folder {
+ display: block;
+ height: 22px;
+ padding-left: 20px;
+ background: transparent url(../common/jquery/treeview/images/folder.gif) 0 0px no-repeat;
+ }
+ </style><link rel="shortcut icon" href="../favicon.ico" type="image/x-icon" /><link rel="stylesheet" type="text/css" href="../common/css/positioning.css" /><link rel="stylesheet" type="text/css" href="../common/jquery/theme-redmond/jquery-ui-1.8.2.custom.css" /><link rel="stylesheet" type="text/css" href="../common/jquery/treeview/jquery.treeview.css" /><script type="text/javascript" src="../common/jquery/jquery-1.4.2.min.js"></script><script type="text/javascript" src="../common/jquery/jquery-ui-1.8.2.custom.min.js"></script><script type="text/javascript" src="../common/jquery/jquery.cookie.js"></script><script type="text/javascript" src="../common/jquery/treeview/jquery.treeview.min.js"></script><script type="text/javascript" src="search/htmlFileList.js"></script><script type="text/javascript" src="search/htmlFileInfoList.js"></script><script type="text/javascript" src="search/nwSearchFnt.js"></script><script type="text/javascript" src="search/stemmers/en_stemmer.js"><!--//make this scalable to other languages as well.--></script><script type="text/javascript" src="search/index-1.js"></script><script type="text/javascript" src="search/index-2.js"></script><script type="text/javascript" src="search/index-3.js"></script></head><body><div id="header"><img style="margin-right: 2px; height: 59px; padding-right: 25px; padding-top: 8px" align="right" src="../common/images/logo.png" alt="Company Logo" /><h1 align="center">Building the indexer<br />Chapter 2. Using the package</h1><div id="navheader" align="right"><table><tr><td style="height: 28px; width: 16px;"><a id="showHideButton" onclick="showHideToc();" class="pointLeft" title="Hide TOC tree">.
+ </a></td><td><img src="../common/images/highlight-blue.gif" alt="H" height="25px" onclick="toggleHighlight()" id="showHideHighlight" style="cursor:pointer" title="Toggle search result highlighting" /></td><td><a accesskey="p" href="ch02s02.html">Prev</a>
+ |
+ <a accesskey="u" href="ch02.html">Up</a>
+ |
+ <a accesskey="n" href="ch02s04.html">Next</a></td></tr></table></div></div><div id="content"><div class="section" title="Building the indexer"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a id="id36124227"></a>Building the indexer</h2></div></div></div><p class="summary">To build the indexer, you must have installed the
+ JDK version 1.5 or higher and set the <code class="envar">ANT_HOME</code>
+ environment variable. Run <code class="code">ant build-indexer</code> to recompile
+ <code class="filename">nw-cms.jar</code></p><a id="id36124248" class="indexterm"></a><a id="id36124257" class="indexterm"></a></div><script type="text/javascript" src="../common/main.js"></script><div class="navfooter"><hr /><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="ch02s02.html">Prev</a> </td><td width="20%" align="center"><a accesskey="u" href="ch02.html">Up</a></td><td width="40%" align="right"> <a accesskey="n" href="ch02s04.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top"> </td><td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td><td width="40%" align="right" valign="top"> </td></tr></table></div></div><div><div id="leftnavigation" style="padding-top:3px; background-color:white;"><div id="tabs"><ul><li><a href="#treeDiv"><em>Contents</em></a></li><li><a href="#searchDiv"><em>Search</em></a></li></ul><div id="treeDiv"><img src="../common/images/loading.gif" alt="loading table of contents..." id="tocLoading" style="display:block;" /><div id="ulTreeDiv" style="display:none"><ul id="tree" class="filetree"><li><span class="file"><a href="ch01.html">Introduction</a></span></li><li><span class="file"><a href="ch02.html">Using the package</a></span><ul><li><span class="file"><a href="ch02s01.html">Generating webhelp output</a></span></li><li><span class="file"><a href="ch02s02.html">Using and customizing the output</a></span><ul><li><span class="file"><a href="ch02s02.html#id36124136">Recommended Apache configurations</a></span></li></ul></li><li id="webhelp-currentid"><span class="file"><a href="ch02s03.html">Building the indexer</a></span></li><li><span class="file"><a href="ch02s04.html">Adding support for other (non-CJKV) languages</a></span></li></ul></li><li><span class="file"><a href="ch03.html">Developer Docs</a></span><ul><li><span class="file"><a href="ch03s01.html">Design</a></span></li><li><span class="file"><a href="ch03s02.html">Search</a></span><ul><li><span class="file"><a href="ch03s02.html#id36124646">New Stemmers</a></span></li></ul></li></ul></li></ul></div></div><div id="searchDiv"><div id="search"><form onsubmit="Verifie(ditaSearch_Form);return false" name="ditaSearch_Form" class="searchForm" id="ditaSearch_Form"><fieldset class="searchFieldSet"><legend>Search</legend><center><input id="textToSearch" name="textToSearch" type="text" class="searchText" /> &nbsp; <input onclick="Verifie(ditaSearch_Form)" type="button" class="searchButton" value="Go" id="doSearch" /></center></fieldset></form></div><div id="searchResults"><center></center></div></div></div></div></div></body></html>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/docs/content/ch02s04.html b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/docs/content/ch02s04.html
new file mode 100644
index 0000000..d3ba7e8
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/docs/content/ch02s04.html
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xmlns:exsl="http://exslt.org/common" xmlns:ng="http://docbook.org/docbook-ng" xmlns:db="http://docbook.org/ns/docbook"><head>
+<meta http-equiv="X-UA-Compatible" content="IE=7" />
+<title>Adding support for other (non-CJKV) languages</title><meta name="generator" content="DocBook XSL Stylesheets V1.76.1" /><link rel="home" href="index.html" title="README: Web-based Help from DocBook XML" /><link rel="up" href="ch02.html" title="Chapter 2. Using the package" /><link rel="prev" href="ch02s03.html" title="Building the indexer" /><link rel="next" href="ch03.html" title="Chapter 3. Developer Docs" /><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><script type="text/javascript">
+ //The id for tree cookie
+ var treeCookieId = "treeview-897";
+ var language = "en";
+ var w = new Object();
+ //Localization
+ txt_filesfound = 'Results';
+ txt_enter_at_least_1_char = "You must enter at least one character.";
+ txt_browser_not_supported = "Your browser is not supported. Use of Mozilla Firefox is recommended.";
+ txt_please_wait = "Please wait. Search in progress...";
+ txt_results_for = "Results for: ";
+ </script><style type="text/css">
+ input {
+ margin-bottom: 5px;
+ margin-top: 2px;
+ }
+
+ .folder {
+ display: block;
+ height: 22px;
+ padding-left: 20px;
+ background: transparent url(../common/jquery/treeview/images/folder.gif) 0 0px no-repeat;
+ }
+ </style><link rel="shortcut icon" href="../favicon.ico" type="image/x-icon" /><link rel="stylesheet" type="text/css" href="../common/css/positioning.css" /><link rel="stylesheet" type="text/css" href="../common/jquery/theme-redmond/jquery-ui-1.8.2.custom.css" /><link rel="stylesheet" type="text/css" href="../common/jquery/treeview/jquery.treeview.css" /><script type="text/javascript" src="../common/jquery/jquery-1.4.2.min.js"></script><script type="text/javascript" src="../common/jquery/jquery-ui-1.8.2.custom.min.js"></script><script type="text/javascript" src="../common/jquery/jquery.cookie.js"></script><script type="text/javascript" src="../common/jquery/treeview/jquery.treeview.min.js"></script><script type="text/javascript" src="search/htmlFileList.js"></script><script type="text/javascript" src="search/htmlFileInfoList.js"></script><script type="text/javascript" src="search/nwSearchFnt.js"></script><script type="text/javascript" src="search/stemmers/en_stemmer.js"><!--//make this scalable to other languages as well.--></script><script type="text/javascript" src="search/index-1.js"></script><script type="text/javascript" src="search/index-2.js"></script><script type="text/javascript" src="search/index-3.js"></script></head><body><div id="header"><img style="margin-right: 2px; height: 59px; padding-right: 25px; padding-top: 8px" align="right" src="../common/images/logo.png" alt="Company Logo" /><h1 align="center">Adding support for other (non-CJKV) languages<br />Chapter 2. Using the package</h1><div id="navheader" align="right"><table><tr><td style="height: 28px; width: 16px;"><a id="showHideButton" onclick="showHideToc();" class="pointLeft" title="Hide TOC tree">.
+ </a></td><td><img src="../common/images/highlight-blue.gif" alt="H" height="25px" onclick="toggleHighlight()" id="showHideHighlight" style="cursor:pointer" title="Toggle search result highlighting" /></td><td><a accesskey="p" href="ch02s03.html">Prev</a>
+ |
+ <a accesskey="u" href="ch02.html">Up</a>
+ |
+ <a accesskey="n" href="ch03.html">Next</a></td></tr></table></div></div><div id="content"><div class="section" title="Adding support for other (non-CJKV) languages"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a id="id36124269"></a>Adding support for other (non-CJKV) languages</h2></div></div></div><p>To support stemming for a language, the search mechanism requires
+ a stemmer implemented in both Java and JavaScript. The Java version is
+ used by the indexer and the JavaScript verison is used to stem the
+ user's input on the search form. Currently the search mechanism supports
+ stemming for English and German. In addition, Java stemmers are included
+ for the following languages. Therefore, to support these languages, you
+ only need to implement the stemmer in JavaScript and add it to the
+ template. If you do undertake this task, please consider contributing
+ the JavaScript version back to this project and to <a class="ulink" href="http://snowball.tartarus.org/texts/stemmersoverview.html" target="_top">Martin
+ Porter's project</a>.</p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>Danish</p></li><li class="listitem"><p>Dutch</p></li><li class="listitem"><p>Finnish</p></li><li class="listitem"><p>Hungarian</p></li><li class="listitem"><p>Italian</p></li><li class="listitem"><p>Norwegian</p></li><li class="listitem"><p>Portuguese</p></li><li class="listitem"><p>Romanian</p></li><li class="listitem"><p>Russian</p></li><li class="listitem"><p>Spanish</p></li><li class="listitem"><p>Swedish</p></li><li class="listitem"><p>Turkish</p></li></ul></div></div><script type="text/javascript" src="../common/main.js"></script><div class="navfooter"><hr /><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="ch02s03.html">Prev</a> </td><td width="20%" align="center"><a accesskey="u" href="ch02.html">Up</a></td><td width="40%" align="right"> <a accesskey="n" href="ch03.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top"> </td><td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td><td width="40%" align="right" valign="top"> </td></tr></table></div></div><div><div id="leftnavigation" style="padding-top:3px; background-color:white;"><div id="tabs"><ul><li><a href="#treeDiv"><em>Contents</em></a></li><li><a href="#searchDiv"><em>Search</em></a></li></ul><div id="treeDiv"><img src="../common/images/loading.gif" alt="loading table of contents..." id="tocLoading" style="display:block;" /><div id="ulTreeDiv" style="display:none"><ul id="tree" class="filetree"><li><span class="file"><a href="ch01.html">Introduction</a></span></li><li><span class="file"><a href="ch02.html">Using the package</a></span><ul><li><span class="file"><a href="ch02s01.html">Generating webhelp output</a></span></li><li><span class="file"><a href="ch02s02.html">Using and customizing the output</a></span><ul><li><span class="file"><a href="ch02s02.html#id36124136">Recommended Apache configurations</a></span></li></ul></li><li><span class="file"><a href="ch02s03.html">Building the indexer</a></span></li><li id="webhelp-currentid"><span class="file"><a href="ch02s04.html">Adding support for other (non-CJKV) languages</a></span></li></ul></li><li><span class="file"><a href="ch03.html">Developer Docs</a></span><ul><li><span class="file"><a href="ch03s01.html">Design</a></span></li><li><span class="file"><a href="ch03s02.html">Search</a></span><ul><li><span class="file"><a href="ch03s02.html#id36124646">New Stemmers</a></span></li></ul></li></ul></li></ul></div></div><div id="searchDiv"><div id="search"><form onsubmit="Verifie(ditaSearch_Form);return false" name="ditaSearch_Form" class="searchForm" id="ditaSearch_Form"><fieldset class="searchFieldSet"><legend>Search</legend><center><input id="textToSearch" name="textToSearch" type="text" class="searchText" /> &nbsp; <input onclick="Verifie(ditaSearch_Form)" type="button" class="searchButton" value="Go" id="doSearch" /></center></fieldset></form></div><div id="searchResults"><center></center></div></div></div></div></div></body></html>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/docs/content/ch03.html b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/docs/content/ch03.html
new file mode 100644
index 0000000..0e608fd
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/docs/content/ch03.html
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xmlns:exsl="http://exslt.org/common" xmlns:ng="http://docbook.org/docbook-ng" xmlns:db="http://docbook.org/ns/docbook"><head>
+<meta http-equiv="X-UA-Compatible" content="IE=7" />
+<title>Chapter 3. Developer Docs</title><meta name="generator" content="DocBook XSL Stylesheets V1.76.1" /><link rel="home" href="index.html" title="README: Web-based Help from DocBook XML" /><link rel="up" href="index.html" title="README: Web-based Help from DocBook XML" /><link rel="prev" href="ch02s04.html" title="Adding support for other (non-CJKV) languages" /><link rel="next" href="ch03s01.html" title="Design" /><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><script type="text/javascript">
+ //The id for tree cookie
+ var treeCookieId = "treeview-897";
+ var language = "en";
+ var w = new Object();
+ //Localization
+ txt_filesfound = 'Results';
+ txt_enter_at_least_1_char = "You must enter at least one character.";
+ txt_browser_not_supported = "Your browser is not supported. Use of Mozilla Firefox is recommended.";
+ txt_please_wait = "Please wait. Search in progress...";
+ txt_results_for = "Results for: ";
+ </script><style type="text/css">
+ input {
+ margin-bottom: 5px;
+ margin-top: 2px;
+ }
+
+ .folder {
+ display: block;
+ height: 22px;
+ padding-left: 20px;
+ background: transparent url(../common/jquery/treeview/images/folder.gif) 0 0px no-repeat;
+ }
+ </style><link rel="shortcut icon" href="../favicon.ico" type="image/x-icon" /><link rel="stylesheet" type="text/css" href="../common/css/positioning.css" /><link rel="stylesheet" type="text/css" href="../common/jquery/theme-redmond/jquery-ui-1.8.2.custom.css" /><link rel="stylesheet" type="text/css" href="../common/jquery/treeview/jquery.treeview.css" /><script type="text/javascript" src="../common/jquery/jquery-1.4.2.min.js"></script><script type="text/javascript" src="../common/jquery/jquery-ui-1.8.2.custom.min.js"></script><script type="text/javascript" src="../common/jquery/jquery.cookie.js"></script><script type="text/javascript" src="../common/jquery/treeview/jquery.treeview.min.js"></script><script type="text/javascript" src="search/htmlFileList.js"></script><script type="text/javascript" src="search/htmlFileInfoList.js"></script><script type="text/javascript" src="search/nwSearchFnt.js"></script><script type="text/javascript" src="search/stemmers/en_stemmer.js"><!--//make this scalable to other languages as well.--></script><script type="text/javascript" src="search/index-1.js"></script><script type="text/javascript" src="search/index-2.js"></script><script type="text/javascript" src="search/index-3.js"></script></head><body><div id="header"><img style="margin-right: 2px; height: 59px; padding-right: 25px; padding-top: 8px" align="right" src="../common/images/logo.png" alt="Company Logo" /><h1 align="center">Chapter 3. Developer Docs<br /> </h1><div id="navheader" align="right"><table><tr><td style="height: 28px; width: 16px;"><a id="showHideButton" onclick="showHideToc();" class="pointLeft" title="Hide TOC tree">.
+ </a></td><td><img src="../common/images/highlight-blue.gif" alt="H" height="25px" onclick="toggleHighlight()" id="showHideHighlight" style="cursor:pointer" title="Toggle search result highlighting" /></td><td><a accesskey="p" href="ch02s04.html">Prev</a> 
+ |
+ <a accesskey="n" href="ch03s01.html">Next</a></td></tr></table></div></div><div id="content"><div class="chapter" title="Chapter 3. Developer Docs"><div class="titlepage"><div><div><h2 class="title"><a id="id36124370"></a>Chapter 3. Developer Docs</h2></div></div></div><div class="toc"><p><strong>Contents</strong></p><dl><dt><span class="section"><a href="ch03s01.html">Design</a></span></dt><dt><span class="section"><a href="ch03s02.html">Search</a></span></dt><dd><dl><dt><span class="section"><a href="ch03s02.html#id36124646">New Stemmers</a></span></dt></dl></dd></dl></div><p class="summary">This chapter provides an overview of how webhelp is implemented.</p><p>The table of contents and search panes are implemented as divs and
+ rendered as if they were the left pane in a frameset. As a result, the
+ page must save the state of the table of contents and the search in
+ cookies when you navigate away from a page. When you load a new page, the
+ page reads these cookies and restores the state of the table of contents
+ tree and search. The result is that the help system behaves exactly as if
+ it were a frameset.</p></div><script type="text/javascript" src="../common/main.js"></script><div class="navfooter"><hr /><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="ch02s04.html">Prev</a> </td><td width="20%" align="center"> </td><td width="40%" align="right"> <a accesskey="n" href="ch03s01.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top"> </td><td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td><td width="40%" align="right" valign="top"> </td></tr></table></div></div><div><div id="leftnavigation" style="padding-top:3px; background-color:white;"><div id="tabs"><ul><li><a href="#treeDiv"><em>Contents</em></a></li><li><a href="#searchDiv"><em>Search</em></a></li></ul><div id="treeDiv"><img src="../common/images/loading.gif" alt="loading table of contents..." id="tocLoading" style="display:block;" /><div id="ulTreeDiv" style="display:none"><ul id="tree" class="filetree"><li><span class="file"><a href="ch01.html">Introduction</a></span></li><li><span class="file"><a href="ch02.html">Using the package</a></span><ul><li><span class="file"><a href="ch02s01.html">Generating webhelp output</a></span></li><li><span class="file"><a href="ch02s02.html">Using and customizing the output</a></span><ul><li><span class="file"><a href="ch02s02.html#id36124136">Recommended Apache configurations</a></span></li></ul></li><li><span class="file"><a href="ch02s03.html">Building the indexer</a></span></li><li><span class="file"><a href="ch02s04.html">Adding support for other (non-CJKV) languages</a></span></li></ul></li><li id="webhelp-currentid"><span class="file"><a href="ch03.html">Developer Docs</a></span><ul><li><span class="file"><a href="ch03s01.html">Design</a></span></li><li><span class="file"><a href="ch03s02.html">Search</a></span><ul><li><span class="file"><a href="ch03s02.html#id36124646">New Stemmers</a></span></li></ul></li></ul></li></ul></div></div><div id="searchDiv"><div id="search"><form onsubmit="Verifie(ditaSearch_Form);return false" name="ditaSearch_Form" class="searchForm" id="ditaSearch_Form"><fieldset class="searchFieldSet"><legend>Search</legend><center><input id="textToSearch" name="textToSearch" type="text" class="searchText" /> &nbsp; <input onclick="Verifie(ditaSearch_Form)" type="button" class="searchButton" value="Go" id="doSearch" /></center></fieldset></form></div><div id="searchResults"><center></center></div></div></div></div></div></body></html>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/docs/content/ch03s01.html b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/docs/content/ch03s01.html
new file mode 100644
index 0000000..f41f801
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/docs/content/ch03s01.html
@@ -0,0 +1,62 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xmlns:exsl="http://exslt.org/common" xmlns:ng="http://docbook.org/docbook-ng" xmlns:db="http://docbook.org/ns/docbook"><head>
+<meta http-equiv="X-UA-Compatible" content="IE=7" />
+<title>Design</title><meta name="generator" content="DocBook XSL Stylesheets V1.76.1" /><link rel="home" href="index.html" title="README: Web-based Help from DocBook XML" /><link rel="up" href="ch03.html" title="Chapter 3. Developer Docs" /><link rel="prev" href="ch03.html" title="Chapter 3. Developer Docs" /><link rel="next" href="ch03s02.html" title="Search" /><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><script type="text/javascript">
+ //The id for tree cookie
+ var treeCookieId = "treeview-897";
+ var language = "en";
+ var w = new Object();
+ //Localization
+ txt_filesfound = 'Results';
+ txt_enter_at_least_1_char = "You must enter at least one character.";
+ txt_browser_not_supported = "Your browser is not supported. Use of Mozilla Firefox is recommended.";
+ txt_please_wait = "Please wait. Search in progress...";
+ txt_results_for = "Results for: ";
+ </script><style type="text/css">
+ input {
+ margin-bottom: 5px;
+ margin-top: 2px;
+ }
+
+ .folder {
+ display: block;
+ height: 22px;
+ padding-left: 20px;
+ background: transparent url(../common/jquery/treeview/images/folder.gif) 0 0px no-repeat;
+ }
+ </style><link rel="shortcut icon" href="../favicon.ico" type="image/x-icon" /><link rel="stylesheet" type="text/css" href="../common/css/positioning.css" /><link rel="stylesheet" type="text/css" href="../common/jquery/theme-redmond/jquery-ui-1.8.2.custom.css" /><link rel="stylesheet" type="text/css" href="../common/jquery/treeview/jquery.treeview.css" /><script type="text/javascript" src="../common/jquery/jquery-1.4.2.min.js"></script><script type="text/javascript" src="../common/jquery/jquery-ui-1.8.2.custom.min.js"></script><script type="text/javascript" src="../common/jquery/jquery.cookie.js"></script><script type="text/javascript" src="../common/jquery/treeview/jquery.treeview.min.js"></script><script type="text/javascript" src="search/htmlFileList.js"></script><script type="text/javascript" src="search/htmlFileInfoList.js"></script><script type="text/javascript" src="search/nwSearchFnt.js"></script><script type="text/javascript" src="search/stemmers/en_stemmer.js"><!--//make this scalable to other languages as well.--></script><script type="text/javascript" src="search/index-1.js"></script><script type="text/javascript" src="search/index-2.js"></script><script type="text/javascript" src="search/index-3.js"></script></head><body><div id="header"><img style="margin-right: 2px; height: 59px; padding-right: 25px; padding-top: 8px" align="right" src="../common/images/logo.png" alt="Company Logo" /><h1 align="center">Design<br />Chapter 3. Developer Docs</h1><div id="navheader" align="right"><table><tr><td style="height: 28px; width: 16px;"><a id="showHideButton" onclick="showHideToc();" class="pointLeft" title="Hide TOC tree">.
+ </a></td><td><img src="../common/images/highlight-blue.gif" alt="H" height="25px" onclick="toggleHighlight()" id="showHideHighlight" style="cursor:pointer" title="Toggle search result highlighting" /></td><td><a accesskey="p" href="ch03.html">Prev</a>
+ |
+ <a accesskey="u" href="ch03.html">Up</a>
+ |
+ <a accesskey="n" href="ch03s02.html">Next</a></td></tr></table></div></div><div id="content"><div class="section" title="Design"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a id="id36124388"></a>Design</h2></div></div></div><p class="summary">An overview of webhelp page structure.</p><p>DocBook WebHelp page structure is fully built on css-based design
+ abandoning frameset structure. Overall page structure can be divided in to three main sections
+ </p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>Header: Header is a separate Div which include company logo,
+ navigation button(prev, next etc.), page title and heading of parent topic.</p></li><li class="listitem"><p>Content: This includes the content of the documentation. The processing of this part is
+ done by <a class="ulink" href="http://docbook.sourceforge.net/release/xsl/current/xhtml/chunk.xsl" target="_top">
+ DocBook XSL Chunking customization</a>. Few further css-styling applied from
+ <code class="filename">positioning.css</code>.
+ </p></li><li class="listitem"><p>Left Navigation: This includes the table of contents and search tab. This
+ is customized using <a class="ulink" href="http://jqueryui.com/" target="_top">jquery-ui</a> styling.</p><div class="itemizedlist"><ul class="itemizedlist" type="circle"><li class="listitem"><p>Tabbed Navigation: The navigation pane is organized in to two tabs.
+ Contents tab, and Search tab. Tabbed output is achieved using
+ <a class="ulink" href="http://docs.jquery.com/UI/Tabs" target="_top">JQuery Tabs plugin</a>.
+ </p></li><li class="listitem"><p>Table of Contents (TOC) tree: When building the chunked html from the
+ docbook file, Table of Contents is generated as an Unordered List (a list
+ made from <code class="code">&lt;ul&gt; &lt;li&gt;</code> tags). When page loads in the browser,
+ we apply styling to it to achieve the nice look that you see. Styling for TOC
+ tree is done by a JQuery UI plugin called
+ <a class="ulink" href="http://bassistance.de/jquery-plugins/jquery-plugin-treeview/" target="_top">
+ TreeView</a>. We can generate the tree easily by following javascript code:
+
+</p><pre class="programlisting">
+//Generate the tree
+$("#tree").treeview({
+collapsed: true,
+animated: "medium",
+control: "#sidetreecontrol",
+persist: "cookie"
+});
+</pre><p>
+ </p></li><li class="listitem"><p>Search Tab: This includes the search feature.</p></li></ul></div></li></ul></div><p>
+ </p></div><script type="text/javascript" src="../common/main.js"></script><div class="navfooter"><hr /><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="ch03.html">Prev</a> </td><td width="20%" align="center"><a accesskey="u" href="ch03.html">Up</a></td><td width="40%" align="right"> <a accesskey="n" href="ch03s02.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top"> </td><td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td><td width="40%" align="right" valign="top"> </td></tr></table></div></div><div><div id="leftnavigation" style="padding-top:3px; background-color:white;"><div id="tabs"><ul><li><a href="#treeDiv"><em>Contents</em></a></li><li><a href="#searchDiv"><em>Search</em></a></li></ul><div id="treeDiv"><img src="../common/images/loading.gif" alt="loading table of contents..." id="tocLoading" style="display:block;" /><div id="ulTreeDiv" style="display:none"><ul id="tree" class="filetree"><li><span class="file"><a href="ch01.html">Introduction</a></span></li><li><span class="file"><a href="ch02.html">Using the package</a></span><ul><li><span class="file"><a href="ch02s01.html">Generating webhelp output</a></span></li><li><span class="file"><a href="ch02s02.html">Using and customizing the output</a></span><ul><li><span class="file"><a href="ch02s02.html#id36124136">Recommended Apache configurations</a></span></li></ul></li><li><span class="file"><a href="ch02s03.html">Building the indexer</a></span></li><li><span class="file"><a href="ch02s04.html">Adding support for other (non-CJKV) languages</a></span></li></ul></li><li><span class="file"><a href="ch03.html">Developer Docs</a></span><ul><li id="webhelp-currentid"><span class="file"><a href="ch03s01.html">Design</a></span></li><li><span class="file"><a href="ch03s02.html">Search</a></span><ul><li><span class="file"><a href="ch03s02.html#id36124646">New Stemmers</a></span></li></ul></li></ul></li></ul></div></div><div id="searchDiv"><div id="search"><form onsubmit="Verifie(ditaSearch_Form);return false" name="ditaSearch_Form" class="searchForm" id="ditaSearch_Form"><fieldset class="searchFieldSet"><legend>Search</legend><center><input id="textToSearch" name="textToSearch" type="text" class="searchText" /> &nbsp; <input onclick="Verifie(ditaSearch_Form)" type="button" class="searchButton" value="Go" id="doSearch" /></center></fieldset></form></div><div id="searchResults"><center></center></div></div></div></div></div></body></html>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/docs/content/ch03s02.html b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/docs/content/ch03s02.html
new file mode 100644
index 0000000..c4ba872
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/docs/content/ch03s02.html
@@ -0,0 +1,124 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xmlns:exsl="http://exslt.org/common" xmlns:ng="http://docbook.org/docbook-ng" xmlns:db="http://docbook.org/ns/docbook"><head>
+<meta http-equiv="X-UA-Compatible" content="IE=7" />
+<title>Search</title><meta name="generator" content="DocBook XSL Stylesheets V1.76.1" /><link rel="home" href="index.html" title="README: Web-based Help from DocBook XML" /><link rel="up" href="ch03.html" title="Chapter 3. Developer Docs" /><link rel="prev" href="ch03s01.html" title="Design" /><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><script type="text/javascript">
+ //The id for tree cookie
+ var treeCookieId = "treeview-897";
+ var language = "en";
+ var w = new Object();
+ //Localization
+ txt_filesfound = 'Results';
+ txt_enter_at_least_1_char = "You must enter at least one character.";
+ txt_browser_not_supported = "Your browser is not supported. Use of Mozilla Firefox is recommended.";
+ txt_please_wait = "Please wait. Search in progress...";
+ txt_results_for = "Results for: ";
+ </script><style type="text/css">
+ input {
+ margin-bottom: 5px;
+ margin-top: 2px;
+ }
+
+ .folder {
+ display: block;
+ height: 22px;
+ padding-left: 20px;
+ background: transparent url(../common/jquery/treeview/images/folder.gif) 0 0px no-repeat;
+ }
+ </style><link rel="shortcut icon" href="../favicon.ico" type="image/x-icon" /><link rel="stylesheet" type="text/css" href="../common/css/positioning.css" /><link rel="stylesheet" type="text/css" href="../common/jquery/theme-redmond/jquery-ui-1.8.2.custom.css" /><link rel="stylesheet" type="text/css" href="../common/jquery/treeview/jquery.treeview.css" /><script type="text/javascript" src="../common/jquery/jquery-1.4.2.min.js"></script><script type="text/javascript" src="../common/jquery/jquery-ui-1.8.2.custom.min.js"></script><script type="text/javascript" src="../common/jquery/jquery.cookie.js"></script><script type="text/javascript" src="../common/jquery/treeview/jquery.treeview.min.js"></script><script type="text/javascript" src="search/htmlFileList.js"></script><script type="text/javascript" src="search/htmlFileInfoList.js"></script><script type="text/javascript" src="search/nwSearchFnt.js"></script><script type="text/javascript" src="search/stemmers/en_stemmer.js"><!--//make this scalable to other languages as well.--></script><script type="text/javascript" src="search/index-1.js"></script><script type="text/javascript" src="search/index-2.js"></script><script type="text/javascript" src="search/index-3.js"></script></head><body><div id="header"><img style="margin-right: 2px; height: 59px; padding-right: 25px; padding-top: 8px" align="right" src="../common/images/logo.png" alt="Company Logo" /><h1 align="center">Search<br />Chapter 3. Developer Docs</h1><div id="navheader" align="right"><table><tr><td style="height: 28px; width: 16px;"><a id="showHideButton" onclick="showHideToc();" class="pointLeft" title="Hide TOC tree">.
+ </a></td><td><img src="../common/images/highlight-blue.gif" alt="H" height="25px" onclick="toggleHighlight()" id="showHideHighlight" style="cursor:pointer" title="Toggle search result highlighting" /></td><td><a accesskey="p" href="ch03s01.html">Prev</a>
+ |
+ <a accesskey="u" href="ch03.html">Up</a></td></tr></table></div></div><div id="content"><div class="section" title="Search"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a id="id36124495"></a>Search</h2></div></div></div><p class="summary">Overview design of Search mechanism.</p><p>
+ The searching is a fully client-side implementation of querying texts for
+ content searching, and no server is involved. That means when a user enters a query,
+ it is processed by JavaScript inside the browser, and displays the matching results by
+ comparing the query with a generated 'index', which too reside in the client-side web browser.
+
+ Mainly the search mechanism has two parts.
+ </p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>Indexing: First we need to traverse the content in the docs/content folder and index
+ the words in it. This is done by <code class="filename">nw-cms.jar</code>. You can invoke it by
+ <code class="code">ant index</code> command from the root of webhelp of directory. You can recompile it
+ again and build the jar file by <code class="code">ant build-indexer</code>. Indexer has some extensive
+ support for such as stemming of words. Indexer has extensive support for English, German,
+ French languages. By extensive support, what I meant is that those texts are stemmed
+ first, to get the root word and then indexes them. For CJK (Chinese, Japanese, Korean)
+ languages, it uses bi-gram tokenizing to break up the words. (CJK languages does not have
+ spaces between words.)
+ </p><p>
+ When we run <code class="code">ant index</code>, it generates five output files:
+ </p><div class="itemizedlist"><ul class="itemizedlist" type="circle"><li class="listitem"><p><code class="filename">htmlFileList.js</code> - This contains an array named <code class="code">fl</code> which stores details
+ all the files indexed by the indexer.
+ </p></li><li class="listitem"><p><code class="filename">htmlFileInfoList.js</code> - This includes some meta data about the indexed files in an array
+ named <code class="code">fil</code>. It includes details about file name, file (html) title, a summary
+ of the content.Format would look like,
+ <code class="code">fil["4"]= "ch03.html@@@Developer Docs@@@This chapter provides an overview of how webhelp is implemented.";</code>
+ </p></li><li class="listitem"><p><code class="filename">index-*.js</code> (Three index files) - These three files actually stores the index of the content.
+ Index is added to an array named <code class="code">w</code>.</p></li></ul></div><p>
+
+ </p></li><li class="listitem"><p>
+ Querying: Query processing happens totally in client side. Following JavaScript files handles them.
+ </p><div class="itemizedlist"><ul class="itemizedlist" type="circle"><li class="listitem"><p><code class="filename">nwSearchFnt.js</code> - This handles the user query and returns the search results. It does query
+ word tokenizing, drop unnecessary punctuations and common words, do stemming if docbook language
+ supports it, etc.</p></li><li class="listitem"><p><code class="filename">{$indexer-language-code}_stemmer.js</code> - This includes the stemming library.
+ <code class="filename">nwSearchFnt.js</code> file calls <code class="code">stemmer</code> method in this file for stemming.
+ ex: <code class="code">var stem = stemmer(foobar);</code>
+ </p></li></ul></div><p>
+ </p></li></ul></div><p>
+ </p><div class="section" title="New Stemmers"><div class="titlepage"><div><div><h3 class="title"><a id="id36124646"></a>New Stemmers</h3></div></div></div><p class="summary">Adding new Stemmers is very simple.</p><p>Currently, only English, French, and German stemmers are integrated in to WebHelp. But the code is
+ extensible such that you can add new stemmers easily by few steps.</p><p>What you need:
+ </p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>You'll need two versions of the stemmer; One written in JavaScript, and another in Java. But fortunately,
+ Snowball contains Java stemmers for number of popular languages, and are already included with the package.
+ You can see the full list in <a class="ulink" href="ch02s04.html" target="_top">Adding support for other (non-CJKV) languages</a>.
+ If your language is listed there,
+ Then you have to find javascript version of the stemmer. Generally, new stemmers are getting added in to
+ <a class="ulink" href="http://snowball.tartarus.org/otherlangs/index.html" target="_top">Snowball Stemmers in other languages</a> location.
+ If javascript stemmer for your language is available, then download it. Else, you can write a new stemmer in
+ JavaScript using SnowBall algorithm fairly easily. Algorithms are at
+ <a class="ulink" href="http://snowball.tartarus.org/" target="_top">Snowball</a>.
+ </p></li><li class="listitem"><p>Then, name the JS stemmer exactly like this: <code class="filename">{$language-code}_stemmer.js</code>. For example,
+ for Italian(it), name it as, <code class="filename">it_stemmer.js</code>. Then, copy it to the
+ <code class="filename">docbook-webhelp/template/content/search/stemmers/</code> folder. (I assumed
+ <code class="filename">docbook-webhelp</code> is the root folder for webhelp.)
+ </p><div class="note" title="Note" style="margin-left: 0.5in; margin-right: 0.5in;"><h3 class="title">Note</h3><p>Make sure you changed the <code class="code">webhelp.indexer.language</code> property in <code class="filename">build.properties</code>
+ to your language.
+ </p></div><p>
+
+ </p></li><li class="listitem"><p>Now two easy changes needed for the indexer.</p><div class="itemizedlist"><ul class="itemizedlist" type="circle"><li class="listitem"><p>Open <code class="filename">docbook-webhelp/indexer/src/com/nexwave/nquindexer/IndexerTask.java</code> in
+ a text editor and add your language code to the <code class="code">supportedLanguages</code> String Array. </p><div class="example"><a id="id36124759"></a><p class="title"><strong>Example 3.1. Add new language to supportedLanguages array</strong></p><div class="example-contents"><p>
+ change the Array from,
+</p><pre class="programlisting">
+private String[] supportedLanguages= {"en", "de", "fr", "cn", "ja", "ko"};
+ //currently extended support available for
+ // English, German, French and CJK (Chinese, Japanese, Korean) languages only.
+</pre><p>
+ To,</p><pre class="programlisting">
+private String[] supportedLanguages= {"en", "de", "fr", "cn", "ja", "ko", <span class="emphasis"><em>"it"</em></span>};
+ //currently extended support available for
+ // English, German, French, CJK (Chinese, Japanese, Korean), and Italian languages only.
+ </pre></div></div><br class="example-break" /></li><li class="listitem"><p>
+ Now, open <code class="filename">docbook-webhelp/indexer/src/com/nexwave/nquindexer/SaxHTMLIndex.java</code> and
+ add the following line to the code where it initializes the Stemmer (Search for
+ <code class="code">SnowballStemmer stemmer;</code>). Then add code to initialize the stemmer Object in your language.
+ It's self understandable. See the example. The class names are at:
+ <code class="filename">docbook-webhelp/indexer/src/com/nexwave/stemmer/snowball/ext/</code>.
+ </p><div class="example"><a id="id36124809"></a><p class="title"><strong>Example 3.2. initialize correct stemmer based on the <code class="code">webhelp.indexer.language</code> specified</strong></p><div class="example-contents"><pre class="programlisting">
+ SnowballStemmer stemmer;
+ if(indexerLanguage.equalsIgnoreCase("en")){
+ stemmer = new EnglishStemmer();
+ } else if (indexerLanguage.equalsIgnoreCase("de")){
+ stemmer= new GermanStemmer();
+ } else if (indexerLanguage.equalsIgnoreCase("fr")){
+ stemmer= new FrenchStemmer();
+ }
+<span class="emphasis"><em>else if (indexerLanguage.equalsIgnoreCase("it")){ //If language code is "it" (Italian)
+ stemmer= new italianStemmer(); //Initialize the stemmer to <code class="code">italianStemmer</code> object.
+ } </em></span>
+ else {
+ stemmer = null;
+ }
+</pre></div></div><br class="example-break" /></li></ul></div></li></ul></div><p>
+ </p><p>That's all. Now run <code class="code">ant build-indexer</code> to compile and build the java code.
+ Then, run <code class="code">ant webhelp</code> to generate the output from your docbook file.
+ For any questions, contact us or email to the docbook mailing list
+ <code class="email">&lt;<a class="email" href="mailto:docbook-apps@lists.oasis-open.org">docbook-apps@lists.oasis-open.org</a>&gt;</code>.
+ </p></div></div><script type="text/javascript" src="../common/main.js"></script><div class="navfooter"><hr /><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="ch03s01.html">Prev</a> </td><td width="20%" align="center"><a accesskey="u" href="ch03.html">Up</a></td><td width="40%" align="right"> </td></tr><tr><td width="40%" align="left" valign="top"> </td><td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td><td width="40%" align="right" valign="top"> </td></tr></table></div></div><div><div id="leftnavigation" style="padding-top:3px; background-color:white;"><div id="tabs"><ul><li><a href="#treeDiv"><em>Contents</em></a></li><li><a href="#searchDiv"><em>Search</em></a></li></ul><div id="treeDiv"><img src="../common/images/loading.gif" alt="loading table of contents..." id="tocLoading" style="display:block;" /><div id="ulTreeDiv" style="display:none"><ul id="tree" class="filetree"><li><span class="file"><a href="ch01.html">Introduction</a></span></li><li><span class="file"><a href="ch02.html">Using the package</a></span><ul><li><span class="file"><a href="ch02s01.html">Generating webhelp output</a></span></li><li><span class="file"><a href="ch02s02.html">Using and customizing the output</a></span><ul><li><span class="file"><a href="ch02s02.html#id36124136">Recommended Apache configurations</a></span></li></ul></li><li><span class="file"><a href="ch02s03.html">Building the indexer</a></span></li><li><span class="file"><a href="ch02s04.html">Adding support for other (non-CJKV) languages</a></span></li></ul></li><li><span class="file"><a href="ch03.html">Developer Docs</a></span><ul><li><span class="file"><a href="ch03s01.html">Design</a></span></li><li id="webhelp-currentid"><span class="file"><a href="ch03s02.html">Search</a></span><ul><li><span class="file"><a href="ch03s02.html#id36124646">New Stemmers</a></span></li></ul></li></ul></li></ul></div></div><div id="searchDiv"><div id="search"><form onsubmit="Verifie(ditaSearch_Form);return false" name="ditaSearch_Form" class="searchForm" id="ditaSearch_Form"><fieldset class="searchFieldSet"><legend>Search</legend><center><input id="textToSearch" name="textToSearch" type="text" class="searchText" /> &nbsp; <input onclick="Verifie(ditaSearch_Form)" type="button" class="searchButton" value="Go" id="doSearch" /></center></fieldset></form></div><div id="searchResults"><center></center></div></div></div></div></div></body></html>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/docs/content/index.html b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/docs/content/index.html
new file mode 100644
index 0000000..54ae642
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/docs/content/index.html
@@ -0,0 +1,71 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xmlns:exsl="http://exslt.org/common" xmlns:ng="http://docbook.org/docbook-ng" xmlns:db="http://docbook.org/ns/docbook"><head>
+<meta http-equiv="X-UA-Compatible" content="IE=7" />
+<title>README: Web-based Help from DocBook XML</title><meta name="generator" content="DocBook XSL Stylesheets V1.76.1" /><link rel="home" href="index.html" title="README: Web-based Help from DocBook XML" /><link rel="next" href="ch01.html" title="Chapter 1. Introduction" /><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><script type="text/javascript">
+ //The id for tree cookie
+ var treeCookieId = "treeview-897";
+ var language = "en";
+ var w = new Object();
+ //Localization
+ txt_filesfound = 'Results';
+ txt_enter_at_least_1_char = "You must enter at least one character.";
+ txt_browser_not_supported = "Your browser is not supported. Use of Mozilla Firefox is recommended.";
+ txt_please_wait = "Please wait. Search in progress...";
+ txt_results_for = "Results for: ";
+ </script><style type="text/css">
+ input {
+ margin-bottom: 5px;
+ margin-top: 2px;
+ }
+
+ .folder {
+ display: block;
+ height: 22px;
+ padding-left: 20px;
+ background: transparent url(../common/jquery/treeview/images/folder.gif) 0 0px no-repeat;
+ }
+ </style><link rel="shortcut icon" href="../favicon.ico" type="image/x-icon" /><link rel="stylesheet" type="text/css" href="../common/css/positioning.css" /><link rel="stylesheet" type="text/css" href="../common/jquery/theme-redmond/jquery-ui-1.8.2.custom.css" /><link rel="stylesheet" type="text/css" href="../common/jquery/treeview/jquery.treeview.css" /><script type="text/javascript" src="../common/jquery/jquery-1.4.2.min.js"></script><script type="text/javascript" src="../common/jquery/jquery-ui-1.8.2.custom.min.js"></script><script type="text/javascript" src="../common/jquery/jquery.cookie.js"></script><script type="text/javascript" src="../common/jquery/treeview/jquery.treeview.min.js"></script><script type="text/javascript" src="search/htmlFileList.js"></script><script type="text/javascript" src="search/htmlFileInfoList.js"></script><script type="text/javascript" src="search/nwSearchFnt.js"></script><script type="text/javascript" src="search/stemmers/en_stemmer.js"><!--//make this scalable to other languages as well.--></script><script type="text/javascript" src="search/index-1.js"></script><script type="text/javascript" src="search/index-2.js"></script><script type="text/javascript" src="search/index-3.js"></script></head><body><div id="header"><img style="margin-right: 2px; height: 59px; padding-right: 25px; padding-top: 8px" align="right" src="../common/images/logo.png" alt="Company Logo" /><h1 align="center">README: Web-based Help from DocBook XML<br /> </h1><div id="navheader" align="right"><table><tr><td style="height: 28px; width: 16px;"><a id="showHideButton" onclick="showHideToc();" class="pointLeft" title="Hide TOC tree">.
+ </a></td><td><img src="../common/images/highlight-blue.gif" alt="H" height="25px" onclick="toggleHighlight()" id="showHideHighlight" style="cursor:pointer" title="Toggle search result highlighting" /></td><td> 
+ |
+ <a accesskey="n" href="ch01.html">Next</a></td></tr></table></div></div><div id="content"><div class="book" title="README: Web-based Help from DocBook XML"><div class="titlepage"><div><div><h1 class="title"><a id="id36085812"></a>README: Web-based Help from DocBook XML</h1></div><div><div class="author"><h3 class="author"><span class="firstname">David</span> <span class="surname">Cramer</span></h3><code class="email">&lt;<a class="email" href="mailto:dcramer AT motive DOT com">dcramer AT motive DOT com</a>&gt;</code><code class="email">&lt;<a class="email" href="mailto:david AT thingbag DOT net">david AT thingbag DOT net</a>&gt;</code></div></div><div><div class="author"><h3 class="author"><span class="firstname">Kasun</span> <span class="surname">Gajasinghe</span></h3><code class="email">&lt;<a class="email" href="mailto:kasunbg AT gmail DOT com">kasunbg AT gmail DOT com</a>&gt;</code></div></div><div><p class="copyright">Copyright © 2008-2010 Kasun Gajasinghe, David Cramer</p></div><div><div class="legalnotice" title="Legal Notice"><a id="id36122924"></a><p>Permission is hereby granted, free of charge, to any person
+ obtaining a copy of this software and associated documentation files
+ (the <span class="quote">“<span class="quote">Software</span>â€</span>), to deal in the Software without
+ restriction, including without limitation the rights to use, copy,
+ modify, merge, publish, distribute, sublicense, and/or sell copies of
+ the Software, and to permit persons to whom the Software is furnished to
+ do so, subject to the following conditions: </p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>The above copyright notice and this permission notice shall
+ be included in all copies or substantial portions of the
+ Software.</p></li><li class="listitem"><p>Except as contained in this notice, the names of individuals
+ credited with contribution to this software shall not be used in
+ advertising or otherwise to promote the sale, use or other
+ dealings in this Software without prior written authorization from
+ the individuals in question.</p></li><li class="listitem"><p>Any stylesheet derived from this Software that is publicly
+ distributed will be identified with a different name and the
+ version strings in any derived Software will be changed so that no
+ possibility of confusion between the derived package and this
+ Software will exist.</p></li></ul></div><p title="Warranty:"><strong>Warranty: </strong>THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+ IN NO EVENT SHALL DAVID CRAMER, KASUN GAJASINGHE, OR ANY OTHER CONTRIBUTOR BE LIABLE FOR
+ ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
+ CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.</p><p>This package is maintained by Kasun Gajasinghe, <code class="email">&lt;<a class="email" href="mailto:kasunbg AT&#10; gmail DOT com">kasunbg AT
+ gmail DOT com</a>&gt;</code> and David Cramer, <code class="email">&lt;<a class="email" href="mailto:david AT thingbag DOT&#10; net">david AT thingbag DOT
+ net</a>&gt;</code>.</p><p>This package also includes the following software written and
+ copyrighted by others:</p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>Files in <code class="filename">template/common/jquery</code> are
+ copyrighted by <a class="ulink" href="http://jquery.com/" target="_top">JQuery</a>
+ under the MIT License. The file
+ <code class="filename">jquery.cookie.js</code> Copyright (c) 2006 Klaus
+ Hartl under the MIT license.</p><a id="id36123021" class="indexterm"></a></li><li class="listitem"><p>Some files in the <code class="filename">template/content/search</code> and <code class="filename">indexer</code> directories were originally
+ part of N. Quaine's htmlsearch DITA plugin. The htmlsearch DITA
+ plugin is available from the <a class="ulink" href="http://tech.groups.yahoo.com/group/dita-users/files/Demos/" target="_top">files
+ page</a> of the DITA-users yahoogroup. The htmlsearch plugin
+ was released under a BSD-style license. See
+ <code class="filename">indexer/license.txt</code> for details. <a id="id36123055" class="indexterm"></a> <a id="id36123063" class="indexterm"></a></p></li><li class="listitem"><p>Stemmers from the <a class="ulink" href="http://snowball.tartarus.org/texts/stemmersoverview.html" target="_top">Snowball
+ project</a> released under a BSD license.</p></li><li class="listitem"><p>Code from the <a class="ulink" href="http://lucene.apache.org/" target="_top">Apache
+ Lucene</a> search engine provides support for tokenizing
+ Chinese, Japanese, and Korean content released under the Apache
+ 2.0 license. </p></li></ul></div><p>
+ Webhelp for DocBook was developed as a <a class="ulink" href="http://socghop.appspot.com" target="_top">Google Summer of Code</a> project.
+ </p></div></div><div><p class="pubdate">August 2010</p></div></div><hr /></div><div class="toc"><p><strong>Contents</strong></p><dl><dt><span class="chapter"><a href="ch01.html">1. Introduction</a></span></dt><dt><span class="chapter"><a href="ch02.html">2. Using the package</a></span></dt><dd><dl><dt><span class="section"><a href="ch02s01.html">Generating webhelp output</a></span></dt><dt><span class="section"><a href="ch02s02.html">Using and customizing the output</a></span></dt><dd><dl><dt><span class="section"><a href="ch02s02.html#id36124136">Recommended Apache configurations</a></span></dt></dl></dd><dt><span class="section"><a href="ch02s03.html">Building the indexer</a></span></dt><dt><span class="section"><a href="ch02s04.html">Adding support for other (non-CJKV) languages</a></span></dt></dl></dd><dt><span class="chapter"><a href="ch03.html">3. Developer Docs</a></span></dt><dd><dl><dt><span class="section"><a href="ch03s01.html">Design</a></span></dt><dt><span class="section"><a href="ch03s02.html">Search</a></span></dt><dd><dl><dt><span class="section"><a href="ch03s02.html#id36124646">New Stemmers</a></span></dt></dl></dd></dl></dd></dl></div><div class="list-of-examples"><p><strong>List of Examples</strong></p><dl><dt>3.1. <a href="ch03s02.html#id36124759">Add new language to supportedLanguages array</a></dt><dt>3.2. <a href="ch03s02.html#id36124809">initialize correct stemmer based on the <code class="code">webhelp.indexer.language</code> specified</a></dt></dl></div></div><script type="text/javascript" src="../common/main.js"></script><div class="navfooter"><hr /><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"> </td><td width="20%" align="center"> </td><td width="40%" align="right"> <a accesskey="n" href="ch01.html">Next</a></td></tr></table></div></div><div><div id="leftnavigation" style="padding-top:3px; background-color:white;"><div id="tabs"><ul><li><a href="#treeDiv"><em>Contents</em></a></li><li><a href="#searchDiv"><em>Search</em></a></li></ul><div id="treeDiv"><img src="../common/images/loading.gif" alt="loading table of contents..." id="tocLoading" style="display:block;" /><div id="ulTreeDiv" style="display:none"><ul id="tree" class="filetree"><li><span class="file"><a href="ch01.html">Introduction</a></span></li><li><span class="file"><a href="ch02.html">Using the package</a></span><ul><li><span class="file"><a href="ch02s01.html">Generating webhelp output</a></span></li><li><span class="file"><a href="ch02s02.html">Using and customizing the output</a></span><ul><li><span class="file"><a href="ch02s02.html#id36124136">Recommended Apache configurations</a></span></li></ul></li><li><span class="file"><a href="ch02s03.html">Building the indexer</a></span></li><li><span class="file"><a href="ch02s04.html">Adding support for other (non-CJKV) languages</a></span></li></ul></li><li><span class="file"><a href="ch03.html">Developer Docs</a></span><ul><li><span class="file"><a href="ch03s01.html">Design</a></span></li><li><span class="file"><a href="ch03s02.html">Search</a></span><ul><li><span class="file"><a href="ch03s02.html#id36124646">New Stemmers</a></span></li></ul></li></ul></li></ul></div></div><div id="searchDiv"><div id="search"><form onsubmit="Verifie(ditaSearch_Form);return false" name="ditaSearch_Form" class="searchForm" id="ditaSearch_Form"><fieldset class="searchFieldSet"><legend>Search</legend><center><input id="textToSearch" name="textToSearch" type="text" class="searchText" /> &nbsp; <input onclick="Verifie(ditaSearch_Form)" type="button" class="searchButton" value="Go" id="doSearch" /></center></fieldset></form></div><div id="searchResults"><center></center></div></div></div></div></div></body></html>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/docs/content/search/htmlFileInfoList.js b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/docs/content/search/htmlFileInfoList.js
new file mode 100644
index 0000000..4517cb8
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/docs/content/search/htmlFileInfoList.js
@@ -0,0 +1,10 @@
+fil = new Array();
+fil["0"]= "ch01.html@@@Chapter 1. Introduction@@@Overview of the package.";
+fil["1"]= "ch02.html@@@Chapter 2. Using the package@@@The following sections describe how to install and use the package on Windows.";
+fil["2"]= "ch02s01.html@@@Generating webhelp output@@@Installation instructions";
+fil["3"]= "ch02s02.html@@@Using and customizing the output@@@null";
+fil["4"]= "ch02s03.html@@@Building the indexer@@@To build the indexer, you must have installed the JDK version 1.5 or higher and set the ANT_HOME environment variable. Run ant build-indexer to recompile nw-cms.jar";
+fil["5"]= "ch02s04.html@@@Adding support for other (non-CJKV) languages@@@null";
+fil["6"]= "ch03.html@@@Chapter 3. Developer Docs@@@This chapter provides an overview of how webhelp is implemented.";
+fil["7"]= "ch03s01.html@@@Design@@@An overview of webhelp page structure.";
+fil["8"]= "ch03s02.html@@@Search@@@Adding new Stemmers is very simple.";
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/docs/content/search/htmlFileList.js b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/docs/content/search/htmlFileList.js
new file mode 100644
index 0000000..c09eccf
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/docs/content/search/htmlFileList.js
@@ -0,0 +1,11 @@
+//List of files which are indexed.
+fl = new Array();
+fl["0"]= "ch01.html";
+fl["1"]= "ch02.html";
+fl["2"]= "ch02s01.html";
+fl["3"]= "ch02s02.html";
+fl["4"]= "ch02s03.html";
+fl["5"]= "ch02s04.html";
+fl["6"]= "ch03.html";
+fl["7"]= "ch03s01.html";
+fl["8"]= "ch03s02.html";
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/docs/content/search/index-1.js b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/docs/content/search/index-1.js
new file mode 100644
index 0000000..8af5f1e
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/docs/content/search/index-1.js
@@ -0,0 +1,224 @@
+var indexerLanguage="en";
+//Auto generated index for searching.
+w["-"]="8";
+w["-doutput-dir"]="2";
+w["-version"]="2";
+w["1"]="0,2,4,8";
+w["140"]="0";
+w["172800"]="3";
+w["2"]="1,2,3,8";
+w["290304000"]="3";
+w["3"]="6,8";
+w["4"]="2,8";
+w["480"]="3";
+w["5"]="2,4";
+w["6"]="2";
+w["7"]="2";
+w["7200"]="3";
+w["8"]="3";
+w["_stemmer"]="8";
+w["abandon"]="7";
+w["abil"]="0";
+w["abstract"]="0,2,3";
+w["achiev"]="7";
+w["actual"]="8";
+w["ad"]="0,1,3,5,8";
+w["adapt"]="2";
+w["add"]="0,2,3,5,8";
+w["adddefaultcharset"]="3";
+w["addit"]="3,5";
+w["addoutputfilterbytyp"]="3";
+w["advanc"]="0";
+w["again"]="8";
+w["against"]="2";
+w["algorithm"]="8";
+w["all"]="0,8";
+w["allow"]="0";
+w["alreadi"]="8";
+w["and"]="0,1,2,3,4,5,6,7,8";
+w["ani"]="2,3,8";
+w["anim"]="7";
+w["anoth"]="2,8";
+w["ant"]="0,2,4,8";
+w["ant_hom"]="2,4";
+w["apach"]="1,2,3";
+w["apache-ant-1"]="2";
+w["appear"]="0,3";
+w["appli"]="7";
+w["applic"]="0,3";
+w["appropri"]="0,3";
+w["arbitrari"]="2";
+w["array"]="8";
+w["assum"]="2,8";
+w["attribut"]="0";
+w["auto-synchron"]="0";
+w["autom"]="0";
+w["automat"]="0";
+w["avail"]="8";
+w["away"]="6";
+w["back"]="5";
+w["bar"]="3";
+w["base"]="0,3,8";
+w["be"]="2";
+w["been"]="0,2";
+w["behav"]="6";
+w["below"]="2";
+w["between"]="8";
+w["bi-gram"]="8";
+w["bin"]="2";
+w["binari"]="2";
+w["bitmap"]="3";
+w["bob"]="3";
+w["book"]="3";
+w["boolean"]="0";
+w["both"]="5";
+w["box"]="0";
+w["breadcrumb"]="0";
+w["break"]="8";
+w["brief"]="0,3";
+w["brower"]="3";
+w["browser"]="2,3,7,8";
+w["build"]="0,1,2,4,7,8";
+w["build-index"]="4,8";
+w["built"]="7";
+w["but"]="0,2,8";
+w["button"]="0,7";
+w["c"]="2";
+w["cach"]="3";
+w["cache-control"]="3";
+w["call"]="7,8";
+w["can"]="0,2,3,7,8";
+w["card"]="0";
+w["caus"]="3";
+w["certain"]="3";
+w["ch03"]="8";
+w["chang"]="2,3,8";
+w["chapter"]="0,1,3,6,8";
+w["chapterinfo"]="3";
+w["charact"]="0,3";
+w["chines"]="0,2,8";
+w["chm"]="0";
+w["chunk"]="3,7";
+w["cjk"]="8";
+w["cjkanalyz"]="0";
+w["class"]="8";
+w["classpath"]="2";
+w["client"]="8";
+w["client-sid"]="8";
+w["cn"]="8";
+w["code"]="0,7,8";
+w["collaps"]="0,7";
+w["color"]="3";
+w["come"]="3";
+w["command"]="2,8";
+w["comment"]="2";
+w["common"]="0,3,8";
+w["compani"]="7";
+w["compar"]="8";
+w["compil"]="8";
+w["complet"]="3";
+w["compress"]="3";
+w["conf"]="3";
+w["configur"]="1,3";
+w["confirm"]="2";
+w["consid"]="0,5";
+w["contact"]="8";
+w["contain"]="2,8";
+w["content"]="0,1,6,7,8";
+w["contribut"]="5";
+w["control"]="0,3,7";
+w["conveni"]="2";
+w["cooki"]="6,7";
+w["copi"]="2,8";
+w["correct"]="2,8";
+w["could"]="2,3";
+w["creat"]="2";
+w["creator"]="0";
+w["css"]="3,7";
+w["css-base"]="7";
+w["css-style"]="7";
+w["current"]="0,5,8";
+w["custom"]="1,2,3,7";
+w["danish"]="5";
+w["data"]="8";
+w["day"]="3";
+w["decid"]="0";
+w["deep"]="3";
+w["default"]="2,3";
+w["defin"]="2";
+w["deflat"]="3";
+w["delet"]="2";
+w["describ"]="1";
+w["descript"]="0";
+w["design"]="6,7,8";
+w["desir"]="2";
+w["desired-output-dir"]="2";
+w["detail"]="2,8";
+w["develop"]="6";
+w["differ"]="2";
+w["dir"]="2";
+w["direct"]="3";
+w["directori"]="2,8";
+w["disabl"]="0";
+w["display"]="8";
+w["distribut"]="2";
+w["div"]="0,3,6,7";
+w["divid"]="7";
+w["do"]="5,8";
+w["doc"]="2,3,6,8";
+w["docbook"]="0,2,3,7,8";
+w["docbook-apps@list"]="8";
+w["docbook-webhelp"]="2,8";
+w["docs@@@"]="8";
+w["docsrc"]="2";
+w["document"]="0,2,3,7";
+w["doe"]="0,2,3,8";
+w["domain"]="0";
+w["don"]="0,2,3";
+w["done"]="7,8";
+w["download"]="2,3,8";
+w["drop"]="8";
+w["dtd"]="2";
+w["dutch"]="5";
+w["each"]="0,3";
+w["easi"]="8";
+w["easili"]="7,8";
+w["eclips"]="0";
+w["edit"]="2,3";
+w["editor"]="2,8";
+w["element"]="3";
+w["els"]="8";
+w["email"]="8";
+w["empti"]="2";
+w["engin"]="0";
+w["english"]="0,2,5,8";
+w["englishstemm"]="8";
+w["enhanc"]="0";
+w["enter"]="8";
+w["environ"]="2,4";
+w["equalsignorecas"]="8";
+w["etc"]="2,3,7,8";
+w["even"]="0";
+w["ex"]="8";
+w["exact"]="6,8";
+w["exampl"]="2,3,8";
+w["exclud"]="0";
+w["exist"]="2";
+w["expand"]="0";
+w["explain"]="3";
+w["expos"]="0";
+w["ext"]="8";
+w["extend"]="8";
+w["extens"]="3,8";
+w["fair"]="8";
+w["fals"]="2";
+w["featur"]="0,7";
+w["feel"]="3";
+w["few"]="7,8";
+w["figur"]="2";
+w["fil"]="8";
+w["file"]="0,2,3,7,8";
+w["fileset"]="2";
+w["filesmatch"]="3";
+w["find"]="8";
+
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/docs/content/search/index-2.js b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/docs/content/search/index-2.js
new file mode 100644
index 0000000..ebab219
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/docs/content/search/index-2.js
@@ -0,0 +1,223 @@
+//Auto generated index for searching.
+w["finnish"]="5";
+w["first"]="0,8";
+w["five"]="8";
+w["fl"]="8";
+w["flv"]="3";
+w["folder"]="3,8";
+w["follow"]="1,2,3,5,7,8";
+w["foobar"]="8";
+w["form"]="0,5";
+w["format"]="0,8";
+w["fortun"]="8";
+w["fr"]="2,8";
+w["frameset"]="0,3,6,7";
+w["french"]="0,2,8";
+w["frenchstemm"]="8";
+w["full"]="0,8";
+w["fulli"]="7,8";
+w["function"]="0";
+w["further"]="3,7";
+w["futur"]="0";
+w["general"]="0,3,8";
+w["generat"]="0,1,2,7,8";
+w["gentext"]="0";
+w["german"]="0,2,5,8";
+w["germanstemm"]="8";
+w["get"]="0,3,8";
+w["gif"]="3";
+w["googl"]="0";
+w["graphic"]="2";
+w["group"]="0";
+w["guid"]="3";
+w["h"]="0";
+w["handl"]="3,8";
+w["happen"]="8";
+w["hard"]="0";
+w["has"]="2,8";
+w["have"]="2,3,4,8";
+w["he"]="0";
+w["head"]="7";
+w["header"]="0,3,7";
+w["height"]="3";
+w["help"]="0,3,6";
+w["here"]="2";
+w["higher"]="2,4";
+w["highlight"]="0";
+w["hour"]="3";
+w["howev"]="2";
+w["htaccess"]="3";
+w["htm"]="3";
+w["html"]="0,2,3,7,8";
+w["html@@@develop"]="8";
+w["htmlfileinfolist"]="8";
+w["htmlfilelist"]="8";
+w["httpd"]="3";
+w["hungarian"]="5";
+w["ico"]="3";
+w["identifi"]="2";
+w["if"]="0,2,3,5,6,8";
+w["ignor"]="2";
+w["imag"]="2";
+w["implement"]="0,5,6,8";
+w["import"]="0,2";
+w["imposs"]="0";
+w["improv"]="0,3";
+w["includ"]="0,2,3,5,7,8";
+w["index"]="0,1,2,3,4,5,8";
+w["index-"]="8";
+w["indexer-languag"]="2";
+w["indexer-language-cod"]="8";
+w["indexerlanguag"]="8";
+w["indexertask"]="8";
+w["indic"]="2";
+w["inform"]="2,3";
+w["initi"]="8";
+w["input"]="2,5";
+w["input-images-basedir"]="2";
+w["input-images-dir"]="2";
+w["input-xml"]="2";
+w["insid"]="3,8";
+w["instal"]="1,2,4";
+w["instruct"]="2";
+w["integr"]="0,8";
+w["interest"]="3";
+w["internet"]="0";
+w["into"]="0,3";
+w["introduct"]="0";
+w["invok"]="8";
+w["involv"]="8";
+w["it_stemm"]="8";
+w["italian"]="5,8";
+w["italianstemm"]="8";
+w["item"]="0";
+w["ix01"]="0";
+w["ja"]="2,8";
+w["japanes"]="0,2,8";
+w["jar"]="2,4,8";
+w["java"]="2,5,8";
+w["javascript"]="0,3,5,7,8";
+w["jdk"]="2,4";
+w["jpeg"]="3";
+w["jpg"]="3";
+w["jqueri"]="3,7";
+w["jquery-ui"]="7";
+w["jquery-ui-1"]="3";
+w["jqueryui"]="3";
+w["js"]="3,8";
+w["know"]="0";
+w["ko"]="8";
+w["korean"]="0,8";
+w["languag"]="0,1,2,5,8";
+w["language-cod"]="8";
+w["layer"]="2";
+w["left"]="3,6,7";
+w["leftnavig"]="3";
+w["legal"]="0";
+w["li"]="7";
+w["librari"]="8";
+w["like"]="0,8";
+w["limit"]="0";
+w["line"]="2,3,8";
+w["link"]="0,3";
+w["list"]="0,2,7,8";
+w["ll"]="8";
+w["load"]="6,7";
+w["locat"]="2,8";
+w["log"]="0";
+w["logo"]="7";
+w["long"]="3";
+w["look"]="3,7,8";
+w["lucen"]="0";
+w["made"]="7";
+w["mail"]="8";
+w["main"]="7,8";
+w["make"]="0,2,3,8";
+w["manag"]="2";
+w["martin"]="5";
+w["match"]="8";
+w["max-ag"]="3";
+w["mean"]="8";
+w["meant"]="8";
+w["mechan"]="5,8";
+w["medium"]="7";
+w["messag"]="2";
+w["meta"]="8";
+w["method"]="8";
+w["microsoft"]="0";
+w["miss"]="2";
+w["model"]="0";
+w["modifi"]="2";
+w["more"]="0,3";
+w["move"]="0";
+w["multipl"]="3";
+w["must"]="2,4,6";
+w["must-revalid"]="3";
+w["mutandi"]="2";
+w["mutati"]="2";
+w["my"]="0";
+w["name"]="0,2,3,8";
+w["navig"]="3,6,7";
+w["necessari"]="2,3";
+w["need"]="2,3,5,8";
+w["new"]="2,3,6,8";
+w["newli"]="2";
+w["next"]="7";
+w["nexwav"]="8";
+w["nice"]="7";
+w["no"]="3,8";
+w["non-cjkv"]="1,5,8";
+w["non-head"]="0";
+w["non-n"]="2";
+w["norwegian"]="5";
+w["not"]="0,2,8";
+w["note"]="2,3,8";
+w["noth"]="3";
+w["notic"]="0";
+w["now"]="8";
+w["nquindex"]="8";
+w["null"]="8";
+w["number"]="8";
+w["nw-cms"]="4,8";
+w["nwsearchfnt"]="8";
+w["oasis-open"]="8";
+w["object"]="8";
+w["odd"]="3";
+w["off"]="0";
+w["onc"]="2";
+w["one"]="3,8";
+w["onli"]="2,5,8";
+w["open"]="2,8";
+w["oper"]="0";
+w["option"]="0";
+w["order"]="0";
+w["org"]="8";
+w["organ"]="7";
+w["other"]="0,1,2,5,8";
+w["out"]="0";
+w["output"]="0,1,2,3,7,8";
+w["output-dir"]="2";
+w["overal"]="7";
+w["overview"]="0,6,7,8";
+w["own"]="0,2";
+w["packag"]="0,1,2,8";
+w["page"]="0,3,6,7";
+w["pane"]="0,6,7";
+w["para"]="3";
+w["param"]="0";
+w["paramet"]="0";
+w["parameter"]="0";
+w["parent"]="7";
+w["part"]="3,7,8";
+w["path"]="2";
+w["path-"]="2";
+w["pattern"]="0,2";
+w["pdf"]="0,3";
+w["perform"]="0,3";
+w["persist"]="0,7";
+w["phrase"]="3";
+w["plain"]="3";
+w["pleas"]="5";
+w["plugin"]="7";
+w["png"]="3";
+
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/docs/content/search/index-3.js b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/docs/content/search/index-3.js
new file mode 100644
index 0000000..b71ffe6
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/docs/content/search/index-3.js
@@ -0,0 +1,221 @@
+//Auto generated index for searching.
+w["point"]="2,3";
+w["popul"]="0,3";
+w["popular"]="8";
+w["porter"]="5";
+w["portugues"]="5";
+w["posit"]="3,7";
+w["possibl"]="0";
+w["prev"]="7";
+w["privat"]="8";
+w["problem"]="2";
+w["procedur"]="2";
+w["process"]="2,7,8";
+w["processor"]="2";
+w["produc"]="0";
+w["program"]="2";
+w["project"]="2,5";
+w["prompt"]="2";
+w["properti"]="0,2,8";
+w["provid"]="6,8";
+w["public"]="0,3";
+w["punctuat"]="2,8";
+w["put"]="2";
+w["queri"]="0,8";
+w["question"]="8";
+w["read"]="6";
+w["readm"]="2";
+w["recommend"]="1,3";
+w["recompil"]="4,8";
+w["refer"]="2";
+w["relat"]="2,3";
+w["relev"]="0";
+w["render"]="6";
+w["replac"]="3";
+w["requir"]="0,5";
+w["resid"]="8";
+w["resiz"]="0";
+w["resourc"]="3";
+w["restor"]="6";
+w["result"]="0,3,6,8";
+w["return"]="8";
+w["right"]="3";
+w["role"]="3";
+w["romanian"]="5";
+w["root"]="8";
+w["rss"]="3";
+w["run"]="2,4,8";
+w["russian"]="5";
+w["s"]="0,3,5,8";
+w["safe"]="2";
+w["same"]="2";
+w["save"]="6";
+w["saxhtmlindex"]="8";
+w["saxon"]="2";
+w["saxon-6"]="2";
+w["script"]="2";
+w["search"]="0,2,3,5,6,7,8";
+w["second"]="0";
+w["section"]="1,3,7";
+w["sectioninfo"]="3";
+w["see"]="2,3,7,8";
+w["self"]="8";
+w["separ"]="0,7";
+w["serv"]="3";
+w["server"]="0,3,8";
+w["server-sid"]="0";
+w["servic"]="0";
+w["set"]="0,2,3,4";
+w["setoutputfilt"]="3";
+w["share"]="2";
+w["should"]="0,2";
+w["show"]="0";
+w["side"]="8";
+w["sidetreecontrol"]="7";
+w["similar"]="0";
+w["simpl"]="0,8";
+w["simpli"]="2,3";
+w["sinc"]="3";
+w["site"]="0";
+w["size"]="0";
+w["smarter"]="0";
+w["snowbal"]="8";
+w["snowballstemm"]="8";
+w["so"]="0,2,3";
+w["some"]="8";
+w["someth"]="0";
+w["sort"]="0";
+w["sourc"]="2";
+w["space"]="8";
+w["spanish"]="5";
+w["specifi"]="0,2,8";
+w["src"]="8";
+w["stale"]="3";
+w["start"]="2";
+w["state"]="0,6";
+w["stayton"]="3";
+w["stem"]="0,5,8";
+w["stemmer"]="0,2,5,6,8";
+w["step"]="2,8";
+w["store"]="2,3,8";
+w["string"]="0,8";
+w["structur"]="7";
+w["studi"]="3";
+w["stuff"]="3";
+w["style"]="3,7";
+w["stylesheet"]="0";
+w["stylesheet-path"]="2";
+w["such"]="3,8";
+w["summari"]="0,3,8";
+w["support"]="0,1,5,8";
+w["supportedlanguag"]="8";
+w["sure"]="8";
+w["swedish"]="5";
+w["swf"]="3";
+w["system"]="0,2,3,6";
+w["t"]="0,2,3";
+w["tab"]="0,2,7";
+w["tabindex"]="0";
+w["tabl"]="0,6,7";
+w["tag"]="7";
+w["target"]="0";
+w["task"]="5";
+w["technic"]="0";
+w["tell"]="2";
+w["templat"]="5,8";
+w["term"]="0";
+w["test"]="2";
+w["test-ouput"]="2";
+w["test-output"]="2";
+w["text"]="0,2,3,8";
+w["than"]="0";
+w["them"]="3,8";
+w["theme"]="3";
+w["theme-redmond"]="3";
+w["then"]="0,3,8";
+w["there"]="8";
+w["therefor"]="5";
+w["these"]="3,5,6,8";
+w["they"]="6";
+w["thing"]="3";
+w["those"]="3,8";
+w["though"]="2";
+w["three"]="7,8";
+w["tip"]="2,3";
+w["titl"]="7,8";
+w["toc"]="0,3,7";
+w["todo"]="3";
+w["toggl"]="0";
+w["token"]="8";
+w["too"]="8";
+w["tool"]="2";
+w["top"]="3";
+w["top-level"]="2";
+w["topic"]="0,3,7";
+w["total"]="8";
+w["travers"]="8";
+w["tree"]="0,3,6,7";
+w["treeview"]="3,7";
+w["tri"]="2";
+w["true"]="2,7";
+w["turkish"]="5";
+w["two"]="3,7,8";
+w["txt"]="3";
+w["type"]="2,3";
+w["ui"]="7";
+w["ul"]="7";
+w["unchang"]="3";
+w["uncom"]="2";
+w["uncompress"]="3";
+w["understand"]="8";
+w["undertak"]="5";
+w["unnecessari"]="8";
+w["unord"]="7";
+w["unzip"]="2";
+w["up"]="0,2,3,4,5,7,8";
+w["updat"]="3";
+w["us"]="8";
+w["use"]="0,1,2,3,5,7,8";
+w["user"]="0,3,5,8";
+w["usr"]="2";
+w["utf-8"]="3";
+w["valid"]="2";
+w["validate-against-dtd"]="2";
+w["valu"]="2";
+w["var"]="8";
+w["variabl"]="2,4";
+w["various"]="3";
+w["veri"]="8";
+w["verison"]="5";
+w["version"]="0,2,4,5,8";
+w["w"]="8";
+w["way"]="3";
+w["we"]="0,3,7,8";
+w["web"]="0,3,8";
+w["web-bas"]="0";
+w["webhelp"]="1,2,6,7,8";
+w["webhelp-specif"]="0";
+w["week"]="3";
+w["were"]="6";
+w["which"]="0,2,3,7,8";
+w["width"]="0,3";
+w["wild"]="0";
+w["window"]="1,2";
+w["without"]="0";
+w["word"]="8";
+w["work"]="2";
+w["would"]="8";
+w["write"]="8";
+w["written"]="2,8";
+w["x"]="2";
+w["x-javascript"]="3";
+w["xhtml"]="3";
+w["xml"]="0,2,3";
+w["xp"]="2";
+w["xsl"]="2,3,7";
+w["xslt"]="2";
+w["xslt-processor-classpath"]="2";
+w["you"]="0,2,3,4,5,6,7,8";
+w["your"]="0,2,3,8";
+w["yourfil"]="2";
+
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/docs/content/search/nwSearchFnt.js b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/docs/content/search/nwSearchFnt.js
new file mode 100644
index 0000000..0111559
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/docs/content/search/nwSearchFnt.js
@@ -0,0 +1,513 @@
+/*----------------------------------------------------------------------------
+ * JavaScript for webhelp search
+ *----------------------------------------------------------------------------
+ This file is part of the webhelpsearch plugin for DocBook WebHelp
+ Copyright (c) 2007-2008 NexWave Solutions All Rights Reserved.
+ www.nexwave.biz Nadege Quaine
+ http://kasunbg.blogspot.com/ Kasun Gajasinghe
+ */
+
+//string initialization
+var htmlfileList = "htmlFileList.js";
+var htmlfileinfoList = "htmlFileInfoList.js";
+var useCJKTokenizing = false;
+
+/* Cette fonction verifie la validite de la recherche entrre par l utilisateur */
+function Verifie(ditaSearch_Form) {
+
+ // Check browser compatibitily
+ if (navigator.userAgent.indexOf("Konquerer") > -1) {
+
+ alert(txt_browser_not_supported);
+ return;
+ }
+
+
+ var expressionInput = document.ditaSearch_Form.textToSearch.value;
+ //Set a cookie to store the searched keywords
+ $.cookie('textToSearch', expressionInput);
+
+
+ if (expressionInput.length < 1) {
+
+ // expression is invalid
+ alert(txt_enter_at_least_1_char);
+ // reactive la fenetre de search (utile car cadres)
+ document.ditaSearch_Form.textToSearch.focus();
+ }
+ else {
+
+ // Effectuer la recherche
+ Effectuer_recherche(expressionInput);
+
+ // reactive la fenetre de search (utile car cadres)
+ document.ditaSearch_Form.textToSearch.focus();
+ }
+}
+
+var stemQueryMap = new Array(); // A hashtable which maps stems to query words
+
+/* This function parses the search expression, loads the indices and displays the results*/
+function Effectuer_recherche(expressionInput) {
+
+ /* Display a waiting message */
+ //DisplayWaitingMessage();
+
+ /*data initialisation*/
+ var searchFor = ""; // expression en lowercase et sans les caracte res speciaux
+ //w = new Object(); // hashtable, key=word, value = list of the index of the html files
+ scriptLetterTab = new Scriptfirstchar(); // Array containing the first letter of each word to look for
+ var wordsList = new Array(); // Array with the words to look for
+ var finalWordsList = new Array(); // Array with the words to look for after removing spaces
+ var linkTab = new Array();
+ var fileAndWordList = new Array();
+ var txt_wordsnotfound = "";
+
+
+ /*nqu: expressionInput, la recherche est lower cased, plus remplacement des char speciaux*/
+ searchFor = expressionInput.toLowerCase().replace(/<\//g, "_st_").replace(/\$_/g, "_di_").replace(/\.|%2C|%3B|%21|%3A|@|\/|\*/g, " ").replace(/(%20)+/g, " ").replace(/_st_/g, "</").replace(/_di_/g, "%24_");
+
+ searchFor = searchFor.replace(/ +/g, " ");
+ searchFor = searchFor.replace(/ $/, "").replace(/^ /, "");
+
+ wordsList = searchFor.split(" ");
+ wordsList.sort();
+
+ //set the tokenizing method
+ if(typeof indexerLanguage != "undefined" && (indexerLanguage=="zh" || indexerLanguage=="ja" ||indexerLanguage=="ko")){
+ useCJKTokenizing=true;
+ } else {
+ useCJKTokenizing=false;
+ }
+ //If Lucene CJKTokenizer was used as the indexer, then useCJKTokenizing will be true. Else, do normal tokenizing.
+ // 2-gram tokenizinghappens in CJKTokenizing,
+ if(useCJKTokenizing){
+ finalWordsList = cjkTokenize(wordsList);
+ } else {
+ finalWordsList = tokenize(wordsList);
+ }
+
+ //load the scripts with the indices: the following lines do not work on the server. To be corrected
+ /*if (IEBrowser) {
+ scriptsarray = loadTheIndexScripts (scriptLetterTab);
+ } */
+
+ /**
+ * Compare with the indexed words (in the w[] array), and push words that are in it to tempTab.
+ */
+ var tempTab = new Array();
+ for (var t in finalWordsList) {
+ if (w[finalWordsList[t].toString()] == undefined) {
+ txt_wordsnotfound += finalWordsList[t] + " ";
+ } else {
+ tempTab.push(finalWordsList[t]);
+ }
+ }
+ finalWordsList = tempTab;
+
+ if (finalWordsList.length) {
+
+ //search 'and' and 'or' one time
+ fileAndWordList = SortResults(finalWordsList);
+
+ var cpt = fileAndWordList.length;
+ for (var i = cpt - 1; i >= 0; i--) {
+ if (fileAndWordList[i] != undefined) {
+ linkTab.push("<p>" + txt_results_for + " " + "<span class=\"searchExpression\">" + fileAndWordList[i][0].motslisteDisplay + "</span>" + "</p>");
+
+ linkTab.push("<ul class='searchresult'>");
+ for (t in fileAndWordList[i]) {
+ //DEBUG: alert(": "+ fileAndWordList[i][t].filenb+" " +fileAndWordList[i][t].motsliste);
+ //linkTab.push("<li><a href=\"../"+fl[fileAndWordList[i][t].filenb]+"\">"+fl[fileAndWordList[i][t].filenb]+"</a></li>");
+ var tempInfo = fil[fileAndWordList[i][t].filenb];
+ var pos1 = tempInfo.indexOf("@@@");
+ var pos2 = tempInfo.lastIndexOf("@@@");
+ var tempPath = tempInfo.substring(0, pos1);
+ var tempTitle = tempInfo.substring(pos1 + 3, pos2);
+ var tempShortdesc = tempInfo.substring(pos2 + 3, tempInfo.length);
+
+ //file:///home/kasun/docbook/WEBHELP/webhelp-draft-output-format-idea/src/main/resources/web/webhelp/installation.html
+ var linkString = "<li><a href=" + tempPath + ">" + tempTitle + "</a>";
+ // var linkString = "<li><a href=\"installation.html\">" + tempTitle + "</a>";
+ if ((tempShortdesc != "null")) {
+ linkString += "\n<div class=\"shortdesclink\">" + tempShortdesc + "</div>";
+ }
+ linkString += "</li>";
+ linkTab.push(linkString);
+ }
+ linkTab.push("</ul>");
+ }
+ }
+ }
+
+ var results = "";
+ if (linkTab.length > 0) {
+ /*writeln ("<p>" + txt_results_for + " " + "<span class=\"searchExpression\">" + cleanwordsList + "</span>" + "<br/>"+"</p>");*/
+ results = "<p>";
+ //write("<ul class='searchresult'>");
+ for (t in linkTab) {
+ results += linkTab[t].toString();
+ }
+ results += "</p>";
+ } else {
+ results = "<p>" + "Your search returned no results for " + "<span class=\"searchExpression\">" + txt_wordsnotfound + "</span>" + "</p>";
+ }
+ //alert(results);
+ document.getElementById('searchResults').innerHTML = results;
+}
+
+function tokenize(wordsList){
+ var stemmedWordsList = new Array(); // Array with the words to look for after removing spaces
+ var cleanwordsList = new Array(); // Array with the words to look for
+ for(var j in wordsList){
+ var word = wordsList[j];
+ if(typeof stemmer != "undefined" ){
+ stemQueryMap[stemmer(word)] = word;
+ } else {
+ stemQueryMap[word] = word;
+ }
+ }
+ //stemmedWordsList is the stemmed list of words separated by spaces.
+ for (var t in wordsList) {
+ wordsList[t] = wordsList[t].replace(/(%22)|^-/g, "");
+ if (wordsList[t] != "%20") {
+ scriptLetterTab.add(wordsList[t].charAt(0));
+ cleanwordsList.push(wordsList[t]);
+ }
+ }
+
+ if(typeof stemmer != "undefined" ){
+ //Do the stemming using Porter's stemming algorithm
+ for (var i = 0; i < cleanwordsList.length; i++) {
+ var stemWord = stemmer(cleanwordsList[i]);
+ stemmedWordsList.push(stemWord);
+ }
+ } else {
+ stemmedWordsList = cleanwordsList;
+ }
+ return stemmedWordsList;
+}
+
+//Invoker of CJKTokenizer class methods.
+function cjkTokenize(wordsList){
+ var allTokens= new Array();
+ var notCJKTokens= new Array();
+ var j=0;
+ for(j=0;j<wordsList.length;j++){
+ var word = wordsList[j];
+ if(getAvgAsciiValue(word) < 127){
+ notCJKTokens.push(word);
+ } else {
+ var tokenizer = new CJKTokenizer(word);
+ var tokensTmp = tokenizer.getAllTokens();
+ allTokens = allTokens.concat(tokensTmp);
+ }
+ }
+ allTokens = allTokens.concat(tokenize(notCJKTokens));
+ return allTokens;
+}
+
+//A simple way to determine whether the query is in english or not.
+function getAvgAsciiValue(word){
+ var tmp = 0;
+ var num = word.length < 5 ? word.length:5;
+ for(var i=0;i<num;i++){
+ if(i==5) break;
+ tmp += word.charCodeAt(i);
+ }
+ return tmp/num;
+}
+
+//CJKTokenizer
+function CJKTokenizer(input){
+ this.input = input;
+ this.offset=-1;
+ this.tokens = new Array();
+ this.incrementToken = incrementToken;
+ this.tokenize = tokenize;
+ this.getAllTokens = getAllTokens;
+ this.unique = unique;
+
+ function incrementToken(){
+ if(this.input.length - 2 <= this.offset){
+ // console.log("false "+offset);
+ return false;
+ }
+ else {
+ this.offset+=1;
+ return true;
+ }
+ }
+
+ function tokenize(){
+ //document.getElementById("content").innerHTML += x.substring(offset,offset+2)+"<br>";
+ return this.input.substring(this.offset,this.offset+2);
+ }
+
+ function getAllTokens(){
+ while(this.incrementToken()){
+ var tmp = this.tokenize();
+ this.tokens.push(tmp);
+ }
+ return this.unique(this.tokens);
+// document.getElementById("content").innerHTML += tokens+" ";
+// document.getElementById("content").innerHTML += "<br>dada"+sortedTokens+" ";
+// console.log(tokens.length+"dsdsds");
+ /*for(i=0;i<tokens.length;i++){
+ console.log(tokens[i]);
+ var ss = tokens[i] == sortedTokens[i];
+
+// document.getElementById("content").innerHTML += "<br>dada"+un[i]+"- "+stems[i]+"&nbsp;&nbsp;&nbsp;"+ ss;
+ document.getElementById("content").innerHTML += "<br>"+sortedTokens[i];
+ }*/
+ }
+
+ function unique(a)
+ {
+ var r = new Array();
+ o:for(var i = 0, n = a.length; i < n; i++)
+ {
+ for(var x = 0, y = r.length; x < y; x++)
+ {
+ if(r[x]==a[i]) continue o;
+ }
+ r[r.length] = a[i];
+ }
+ return r;
+ }
+}
+
+
+/* Scriptfirstchar: to gather the first letter of index js files to upload */
+function Scriptfirstchar() {
+ this.strLetters = "";
+ this.add = addLettre;
+}
+
+function addLettre(caract) {
+
+ if (this.strLetters == 'undefined') {
+ this.strLetters = caract;
+ } else if (this.strLetters.indexOf(caract) < 0) {
+ this.strLetters += caract;
+ }
+
+ return 0;
+}
+/* end of scriptfirstchar */
+
+/*main loader function*/
+/*tab contains the first letters of each word looked for*/
+function loadTheIndexScripts(tab) {
+
+ //alert (tab.strLetters);
+ var scriptsarray = new Array();
+
+ for (var i = 0; i < tab.strLetters.length; i++) {
+
+ scriptsarray[i] = "..\/search" + "\/" + tab.strLetters.charAt(i) + ".js";
+ }
+ // add the list of html files
+ i++;
+ scriptsarray[i] = "..\/search" + "\/" + htmlfileList;
+
+ //debug
+ for (var t in scriptsarray) {
+ //alert (scriptsarray[t]);
+ }
+
+ tab = new ScriptLoader();
+ for (t in scriptsarray) {
+ tab.add(scriptsarray[t]);
+ }
+ tab.load();
+ //alert ("scripts loaded");
+ return (scriptsarray);
+}
+
+/* ScriptLoader: to load the scripts and wait that it's finished */
+function ScriptLoader() {
+ this.cpt = 0;
+ this.scriptTab = new Array();
+ this.add = addAScriptInTheList;
+ this.load = loadTheScripts;
+ this.onScriptLoaded = onScriptLoadedFunc;
+}
+
+function addAScriptInTheList(scriptPath) {
+ this.scriptTab.push(scriptPath);
+}
+
+function loadTheScripts() {
+ var script;
+ var head;
+
+ head = document.getElementsByTagName('head').item(0);
+
+ //script = document.createElement('script');
+
+ for (var el in this.scriptTab) {
+ //alert (el+this.scriptTab[el]);
+ script = document.createElement('script');
+ script.src = this.scriptTab[el];
+ script.type = 'text/javascript';
+ script.defer = false;
+
+ head.appendChild(script);
+ }
+
+}
+
+function onScriptLoadedFunc(e) {
+ e = e || window.event;
+ var target = e.target || e.srcElement;
+ var isComplete = true;
+ if (typeof target.readyState != undefined) {
+
+ isComplete = (target.readyState == "complete" || target.readyState == "loaded");
+ }
+ if (isComplete) {
+ ScriptLoader.cpt++;
+ if (ScriptLoader.cpt == ScriptLoader.scripts.length) {
+ ScriptLoader.onLoadComplete();
+ }
+ }
+}
+
+/*
+function onLoadComplete() {
+ alert("loaded !!");
+} */
+
+/* End of scriptloader functions */
+
+// Array.unique( strict ) - Remove duplicate values
+function unique(tab) {
+ var a = new Array();
+ var i;
+ var l = tab.length;
+
+ if (tab[0] != undefined) {
+ a[0] = tab[0];
+ }
+ else {
+ return -1
+ }
+
+ for (i = 1; i < l; i++) {
+ if (indexof(a, tab[i], 0) < 0) {
+ a.push(tab[i]);
+ }
+ }
+ return a;
+}
+function indexof(tab, element, begin) {
+ for (var i = begin; i < tab.length; i++) {
+ if (tab[i] == element) {
+ return i;
+ }
+ }
+ return -1;
+
+}
+/* end of Array functions */
+
+
+/*
+ Param: mots= list of words to look for.
+ This function creates an hashtable:
+ - The key is the index of a html file which contains a word to look for.
+ - The value is the list of all words contained in the html file.
+
+ Return value: the hashtable fileAndWordList
+ */
+function SortResults(mots) {
+
+ var fileAndWordList = new Object();
+ if (mots.length == 0) {
+ return null;
+ }
+
+ for (var t in mots) {
+ // get the list of the indices of the files.
+ var listNumerosDesFicStr = w[mots[t].toString()];
+ //alert ("listNumerosDesFicStr "+listNumerosDesFicStr);
+ var tab = listNumerosDesFicStr.split(",");
+
+ //for each file (file's index):
+ for (var t2 in tab) {
+ var temp = tab[t2].toString();
+ if (fileAndWordList[temp] == undefined) {
+
+ fileAndWordList[temp] = "" + mots[t];
+ } else {
+
+ fileAndWordList[temp] += "," + mots[t];
+ }
+ }
+ }
+
+ var fileAndWordListValuesOnly = new Array();
+
+ // sort results according to values
+ var temptab = new Array();
+ for (t in fileAndWordList) {
+ tab = fileAndWordList[t].split(',');
+
+ var tempDisplay = new Array();
+ for (var x in tab) {
+ if(stemQueryMap[tab[x]] != undefined){
+ tempDisplay.push(stemQueryMap[tab[x]]); //get the original word from the stem word.
+ } else {
+ tempDisplay.push(tab[x]); //no stem is available. (probably a CJK language)
+ }
+ }
+ var tempDispString = tempDisplay.join(", ");
+
+ temptab.push(new resultPerFile(t, fileAndWordList[t], tab.length, tempDispString));
+ fileAndWordListValuesOnly.push(fileAndWordList[t]);
+ }
+
+
+ //alert("t"+fileAndWordListValuesOnly.toString());
+
+ fileAndWordListValuesOnly = unique(fileAndWordListValuesOnly);
+ fileAndWordListValuesOnly = fileAndWordListValuesOnly.sort(compare_nbMots);
+ //alert("t: "+fileAndWordListValuesOnly.join(';'));
+
+ var listToOutput = new Array();
+
+ for (var j in fileAndWordListValuesOnly) {
+ for (t in temptab) {
+ if (temptab[t].motsliste == fileAndWordListValuesOnly[j]) {
+ if (listToOutput[j] == undefined) {
+ listToOutput[j] = new Array(temptab[t]);
+ } else {
+ listToOutput[j].push(temptab[t]);
+ }
+ }
+ }
+ }
+ return listToOutput;
+}
+
+function resultPerFile(filenb, motsliste, motsnb, motslisteDisplay) {
+ this.filenb = filenb;
+ this.motsliste = motsliste;
+ this.motsnb = motsnb;
+ this.motslisteDisplay= motslisteDisplay;
+}
+
+function compare_nbMots(s1, s2) {
+ var t1 = s1.split(',');
+ var t2 = s2.split(',');
+ //alert ("s1:"+t1.length + " " +t2.length)
+ if (t1.length == t2.length) {
+ return 0;
+ } else if (t1.length > t2.length) {
+ return 1;
+ } else {
+ return -1;
+ }
+ //return t1.length - t2.length);
+} \ No newline at end of file
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/docs/content/search/stemmers/en_stemmer.js b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/docs/content/search/stemmers/en_stemmer.js
new file mode 100644
index 0000000..f58012f
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/docs/content/search/stemmers/en_stemmer.js
@@ -0,0 +1,187 @@
+// Porter stemmer in Javascript. Few comments, but it's easy to follow against the rules in the original
+// paper, in
+//
+// Porter, 1980, An algorithm for suffix stripping, Program, Vol. 14,
+// no. 3, pp 130-137,
+//
+// see also http://www.tartarus.org/~martin/PorterStemmer
+
+// Release 1 be 'andargor', Jul 2004
+// Release 2 (substantially revised) by Christopher McKenzie, Aug 2009
+
+
+var stemmer = (function(){
+ var step2list = {
+ "ational" : "ate",
+ "tional" : "tion",
+ "enci" : "ence",
+ "anci" : "ance",
+ "izer" : "ize",
+ "bli" : "ble",
+ "alli" : "al",
+ "entli" : "ent",
+ "eli" : "e",
+ "ousli" : "ous",
+ "ization" : "ize",
+ "ation" : "ate",
+ "ator" : "ate",
+ "alism" : "al",
+ "iveness" : "ive",
+ "fulness" : "ful",
+ "ousness" : "ous",
+ "aliti" : "al",
+ "iviti" : "ive",
+ "biliti" : "ble",
+ "logi" : "log"
+ },
+
+ step3list = {
+ "icate" : "ic",
+ "ative" : "",
+ "alize" : "al",
+ "iciti" : "ic",
+ "ical" : "ic",
+ "ful" : "",
+ "ness" : ""
+ },
+
+ c = "[^aeiou]", // consonant
+ v = "[aeiouy]", // vowel
+ C = c + "[^aeiouy]*", // consonant sequence
+ V = v + "[aeiou]*", // vowel sequence
+
+ mgr0 = "^(" + C + ")?" + V + C, // [C]VC... is m>0
+ meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$", // [C]VC[V] is m=1
+ mgr1 = "^(" + C + ")?" + V + C + V + C, // [C]VCVC... is m>1
+ s_v = "^(" + C + ")?" + v; // vowel in stem
+
+ return function (w) {
+ var stem,
+ suffix,
+ firstch,
+ re,
+ re2,
+ re3,
+ re4,
+ origword = w;
+
+ if (w.length < 3) { return w; }
+
+ firstch = w.substr(0,1);
+ if (firstch == "y") {
+ w = firstch.toUpperCase() + w.substr(1);
+ }
+
+ // Step 1a
+ re = /^(.+?)(ss|i)es$/;
+ re2 = /^(.+?)([^s])s$/;
+
+ if (re.test(w)) { w = w.replace(re,"$1$2"); }
+ else if (re2.test(w)) { w = w.replace(re2,"$1$2"); }
+
+ // Step 1b
+ re = /^(.+?)eed$/;
+ re2 = /^(.+?)(ed|ing)$/;
+ if (re.test(w)) {
+ var fp = re.exec(w);
+ re = new RegExp(mgr0);
+ if (re.test(fp[1])) {
+ re = /.$/;
+ w = w.replace(re,"");
+ }
+ } else if (re2.test(w)) {
+ var fp = re2.exec(w);
+ stem = fp[1];
+ re2 = new RegExp(s_v);
+ if (re2.test(stem)) {
+ w = stem;
+ re2 = /(at|bl|iz)$/;
+ re3 = new RegExp("([^aeiouylsz])\\1$");
+ re4 = new RegExp("^" + C + v + "[^aeiouwxy]$");
+ if (re2.test(w)) { w = w + "e"; }
+ else if (re3.test(w)) { re = /.$/; w = w.replace(re,""); }
+ else if (re4.test(w)) { w = w + "e"; }
+ }
+ }
+
+ // Step 1c
+ re = /^(.+?)y$/;
+ if (re.test(w)) {
+ var fp = re.exec(w);
+ stem = fp[1];
+ re = new RegExp(s_v);
+ if (re.test(stem)) { w = stem + "i"; }
+ }
+
+ // Step 2
+ re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/;
+ if (re.test(w)) {
+ var fp = re.exec(w);
+ stem = fp[1];
+ suffix = fp[2];
+ re = new RegExp(mgr0);
+ if (re.test(stem)) {
+ w = stem + step2list[suffix];
+ }
+ }
+
+ // Step 3
+ re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/;
+ if (re.test(w)) {
+ var fp = re.exec(w);
+ stem = fp[1];
+ suffix = fp[2];
+ re = new RegExp(mgr0);
+ if (re.test(stem)) {
+ w = stem + step3list[suffix];
+ }
+ }
+
+ // Step 4
+ re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/;
+ re2 = /^(.+?)(s|t)(ion)$/;
+ if (re.test(w)) {
+ var fp = re.exec(w);
+ stem = fp[1];
+ re = new RegExp(mgr1);
+ if (re.test(stem)) {
+ w = stem;
+ }
+ } else if (re2.test(w)) {
+ var fp = re2.exec(w);
+ stem = fp[1] + fp[2];
+ re2 = new RegExp(mgr1);
+ if (re2.test(stem)) {
+ w = stem;
+ }
+ }
+
+ // Step 5
+ re = /^(.+?)e$/;
+ if (re.test(w)) {
+ var fp = re.exec(w);
+ stem = fp[1];
+ re = new RegExp(mgr1);
+ re2 = new RegExp(meq1);
+ re3 = new RegExp("^" + C + v + "[^aeiouwxy]$");
+ if (re.test(stem) || (re2.test(stem) && !(re3.test(stem)))) {
+ w = stem;
+ }
+ }
+
+ re = /ll$/;
+ re2 = new RegExp(mgr1);
+ if (re.test(w) && re2.test(w)) {
+ re = /.$/;
+ w = w.replace(re,"");
+ }
+
+ // and turn initial Y back to y
+
+ if (firstch == "y") {
+ w = firstch.toLowerCase() + w.substr(1);
+ }
+
+ return w;
+ }
+})(); \ No newline at end of file
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/docs/index.html b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/docs/index.html
new file mode 100644
index 0000000..a027144
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/docs/index.html
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+ <head>
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+ <link rel="shortcut icon" href="favicon.ico" />
+ <meta http-equiv="Refresh" content="1; URL=content/ch01.html" />
+ <title>README: Web-based Help from DocBook XML 
+ </title>
+ </head>
+ <body>
+ If not automatically redirected, click here: <a href="content/ch01.html">content/ch01.html</a></body>
+</html>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/docsrc/readme.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/docsrc/readme.xml
new file mode 100644
index 0000000..4d19190
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/docsrc/readme.xml
@@ -0,0 +1,928 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
+"http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd">
+<book>
+ <title>README: Web-based Help from DocBook XML</title>
+
+ <bookinfo>
+ <legalnotice>
+ <para>Permission is hereby granted, free of charge, to any person
+ obtaining a copy of this software and associated documentation files
+ (the <quote>Software</quote>), to deal in the Software without
+ restriction, including without limitation the rights to use, copy,
+ modify, merge, publish, distribute, sublicense, and/or sell copies of
+ the Software, and to permit persons to whom the Software is furnished to
+ do so, subject to the following conditions: <itemizedlist>
+ <listitem>
+ <para>The above copyright notice and this permission notice shall
+ be included in all copies or substantial portions of the
+ Software.</para>
+ </listitem>
+
+ <listitem>
+ <para>Except as contained in this notice, the names of individuals
+ credited with contribution to this software shall not be used in
+ advertising or otherwise to promote the sale, use or other
+ dealings in this Software without prior written authorization from
+ the individuals in question.</para>
+ </listitem>
+
+ <listitem>
+ <para>Any stylesheet derived from this Software that is publicly
+ distributed will be identified with a different name and the
+ version strings in any derived Software will be changed so that no
+ possibility of confusion between the derived package and this
+ Software will exist.</para>
+ </listitem>
+ </itemizedlist></para>
+
+ <formalpara>
+ <title>Warranty:</title>
+
+ <para>THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+ IN NO EVENT SHALL DAVID CRAMER, KASUN GAJASINGHE, OR ANY OTHER CONTRIBUTOR BE LIABLE FOR
+ ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
+ CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.</para>
+ </formalpara>
+
+ <para>This package is maintained by Kasun Gajasinghe, <email>kasunbg AT
+ gmail DOT com</email> and David Cramer, <email>david AT thingbag DOT
+ net</email>.</para>
+
+ <para>This package also includes the following software written and
+ copyrighted by others:<itemizedlist>
+ <listitem>
+ <para>Files in <filename
+ class="directory">template/common/jquery</filename> are
+ copyrighted by <ulink url="http://jquery.com/">JQuery</ulink>
+ under the MIT License. The file
+ <filename>jquery.cookie.js</filename> Copyright (c) 2006 Klaus
+ Hartl under the MIT license.</para>
+
+ <indexterm>
+ <primary>jquery</primary>
+ </indexterm>
+ </listitem>
+
+ <listitem>
+ <para>Some files in the <filename
+ class="directory">template/content/search</filename> and <filename
+ class="directory">indexer</filename> directories were originally
+ part of N. Quaine's htmlsearch DITA plugin. The htmlsearch DITA
+ plugin is available from the <ulink
+ url="http://tech.groups.yahoo.com/group/dita-users/files/Demos/">files
+ page</ulink> of the DITA-users yahoogroup. The htmlsearch plugin
+ was released under a BSD-style license. See
+ <filename>indexer/license.txt</filename> for details. <indexterm>
+ <primary>htmlsearch</primary>
+ </indexterm> <indexterm>
+ <primary>DITA</primary>
+
+ <secondary>htmlsearch plugin</secondary>
+ </indexterm></para>
+ </listitem>
+
+ <listitem>
+ <para>Stemmers from the <ulink
+ url="http://snowball.tartarus.org/texts/stemmersoverview.html">Snowball
+ project</ulink> released under a BSD license.</para>
+ </listitem>
+
+ <listitem>
+ <para>Code from the <ulink url="http://lucene.apache.org/">Apache
+ Lucene</ulink> search engine provides support for tokenizing
+ Chinese, Japanese, and Korean content released under the Apache
+ 2.0 license. </para>
+ </listitem>
+ </itemizedlist>
+ Webhelp for DocBook was developed as a <ulink url="http://socghop.appspot.com">Google Summer of Code</ulink> project.
+ </para>
+ </legalnotice>
+
+ <copyright>
+ <year>2008-2010</year>
+
+ <holder>Kasun Gajasinghe</holder>
+
+ <holder>David Cramer</holder>
+ </copyright>
+
+ <author>
+ <firstname>David</firstname>
+
+ <surname>Cramer</surname>
+
+ <email>dcramer AT motive DOT com</email>
+
+ <email>david AT thingbag DOT net</email>
+ </author>
+
+ <author>
+ <firstname>Kasun</firstname>
+
+ <surname>Gajasinghe</surname>
+
+ <email>kasunbg AT gmail DOT com</email>
+ </author>
+
+ <pubdate>August 2010</pubdate>
+ </bookinfo>
+
+ <chapter>
+ <chapterinfo>
+ <abstract>
+ <!-- This becomes the brief description that appears in search results UNLESS there's a para or phrase with role="summary". If there is, then the role="summary" text wins. -->
+
+ <para>Overview of the package.</para>
+ </abstract>
+ </chapterinfo>
+
+ <title>Introduction</title>
+
+ <para>A common requirement for technical publications groups is to produce a Web-based help
+ format that includes a table of contents pane, a search feature, and an index similar to what
+ you get from the Microsoft HTML Help (.chm) format or Eclipse help. If the content is help for
+ a Web application that is not exposed to the Internet or requires that the user be logged in,
+ then it is impossible to use services like Google to add search. <indexterm class="singular">
+ <primary>features</primary>
+ </indexterm>
+ <itemizedlist>
+ <title>Features</title>
+ <listitem>
+ <para>Full text search.<indexterm class="singular">
+ <primary>search</primary>
+ <secondary>features</secondary>
+ </indexterm></para>
+ <itemizedlist>
+ <listitem>
+ <para>Stemming support for English, French, and German. Stemming support can be added
+ for other languages by implementing a stemmer.<indexterm class="singular">
+ <primary>search</primary>
+ <secondary>stemming</secondary>
+ </indexterm></para>
+ </listitem>
+ <listitem>
+ <para>Support for Chinese, Japanese, and Korean using code from the Lucene search
+ engine. </para>
+ </listitem>
+ <listitem>
+ <para>Search highlighting shows where the searched for term appears in the results.
+ Use the <guibutton>H</guibutton> button to toggle the highlighting off and on.
+ <indexterm class="singular">
+ <primary>search</primary>
+ <secondary>highlighting</secondary>
+ </indexterm></para>
+ </listitem>
+ <listitem>
+ <para>Search results can include brief descriptions of the target.<indexterm
+ class="singular">
+ <primary>search</primary>
+ <secondary>descriptions</secondary>
+ </indexterm></para>
+ </listitem>
+ </itemizedlist>
+ </listitem>
+ <listitem>
+ <para>Table of contents pane with collapsible toc tree.</para>
+ </listitem>
+ <listitem>
+ <para>Auto-synchronization of content pane and TOC.</para>
+ </listitem>
+ <listitem>
+ <para>TOC and search pane implemented without the use of a frameset.</para>
+ </listitem>
+ <listitem>
+ <para>An Ant <filename>build.xml</filename> file to generate output. You can use this
+ build file by importing it into your own or use it as a model for integrating this
+ output format into your own build system.</para>
+ </listitem>
+ </itemizedlist>
+ <itemizedlist>
+ <title>Possible future enhancements</title>
+ <listitem>
+ <para>Move webhelp-specific parameters and gentext strings into base DocBook stylesheets.
+ </para>
+ </listitem>
+ <listitem>
+ <para>Use <sgmltag class="attribute">tabindex</sgmltag> attributes to control the tab
+ order in the output. The Contents and Search tabs should be first and second, then the
+ search box and button, then the table of contents items, and so on.</para>
+ </listitem>
+ <listitem>
+ <para>Add "Expand all" and "Collapse all" buttons to the table of contents.</para>
+ </listitem>
+ <listitem>
+ <para>Add other search options:</para>
+ <itemizedlist>
+ <listitem>
+ <para>Add an option to use Lucene for server-side searches with table of contents
+ state persisted on the server.</para>
+ </listitem>
+ <listitem>
+ <para>Add a simple form that uses a Google site:my.domain.com based search.</para>
+ </listitem>
+ </itemizedlist>
+ </listitem>
+ <listitem>
+ <para>Sort search results based on relevance</para>
+ </listitem>
+ <listitem>
+ <para>Support wild card characters in the search query.</para>
+ </listitem>
+ <listitem>
+ <para>Parameterize width of the TOC pane OR make the TOC pane resizeable by the
+ user.</para>
+ </listitem>
+ <listitem>
+ <para>Automate search results summary text:</para>
+ <itemizedlist>
+ <listitem>
+ <para>Automatically use the first non-heading content as the summary in the search
+ results.</para>
+ </listitem>
+ <listitem>
+ <para>Automatically limit the size of the search description to something 140
+ characters.</para>
+ </listitem>
+ </itemizedlist>
+ </listitem>
+ <listitem>
+ <para>Support boolean operators in search.</para>
+ </listitem>
+ <listitem>
+ <para>Parameterize list of files to exclude from indexing. Currently it's hard coded that
+ we don't index <filename>index.html </filename>and <filename>ix01.html</filename> (the
+ legal notice and index topics). It should be smarter and automatically not index the
+ index file even if it's not named <filename>ix01.html</filename>.</para>
+ </listitem>
+ <listitem>
+ <para>Improve performance by moving the table of contents div out of each page and into a
+ separate JavaScript file which then adds it to the page.</para>
+ </listitem>
+ <listitem>
+ <para>Add to the indexer the ability to specify a list of files or file patterns not to
+ index. Currently it does not index <filename>index.html</filename> or
+ <filename>ix01.html</filename>, which is generally appropriate, but it should be up to
+ the user to decide.</para>
+ </listitem>
+ <listitem>
+ <para>Add an index tab populated by a separate JavaScript file. Include a param/property
+ that allows the content creator to disable the index.</para>
+ </listitem>
+ <listitem>
+ <para>Add functionality to the <filename>build.xml</filename> file so that when a property
+ is set, the build generates a pdf version of the document and includes a link to it from
+ the header.</para>
+ </listitem>
+ <listitem>
+ <para>Add <ulink
+ url="http://www.comparenetworks.com/developers/jqueryplugins/jbreadcrumb.html"
+ >breadcrumbs</ulink> so the user will know what topics he's been to.</para>
+ </listitem>
+ <listitem>
+ <para>Consider using more advanced Lucene indexers for Chinese and Japanese than the
+ CJKAnalyzer</para>
+ </listitem>
+ </itemizedlist></para>
+ </chapter>
+
+ <chapter>
+ <title>Using the package</title>
+
+ <para role="summary">The following sections describe how to install and
+ use the package on Windows.</para>
+
+ <section>
+ <sectioninfo>
+ <abstract>
+ <para>Installation instructions</para>
+ </abstract>
+ </sectioninfo>
+
+ <title>Generating webhelp output</title>
+
+ <procedure>
+ <title>To install the package on Windows</title>
+
+ <note>
+ <para>The examples in this procedure assume a Windows installation,
+ but the process is the same in other environments,
+ <foreignphrase>mutatis mutandis</foreignphrase>.</para>
+ </note>
+
+ <step>
+ <para>If necessary, install <ulink
+ url="http://www.java.com/en/download/manual.jsp">Java 1.6</ulink> or
+ higher.</para>
+
+ <substeps>
+ <step>
+ <para>Confirm that Java is installed and in your
+ <envar>PATH</envar> by typing the following at a command prompt:
+ <programlisting>java -version</programlisting></para>
+ <note>
+ <para>To build the indexer, you must have the JDK.</para>
+ </note>
+ </step>
+ </substeps>
+ </step>
+
+ <step>
+ <para>If necessary, install <ulink
+ url="http://ant.apache.org/bindownload.cgi">Apache Ant</ulink> 1.6.5
+ or higher.</para>
+
+ <substeps>
+ <step>
+ <para>Unzip the Ant binary distribution to a convenient location
+ on your system. For example: <filename>c:\Program
+ Files</filename>.</para>
+ </step>
+
+ <step>
+ <para>Set the environment variable <envar>ANT_HOME</envar> to
+ the top-level Ant directory. For example: <filename>c:\Program
+ Files\apache-ant-1.7.1</filename>. <tip>
+ <para>See <ulink
+ url="http://support.microsoft.com/kb/310519">How To Manage
+ Environment Variables in Windows XP</ulink> for information
+ on setting environment variables.</para>
+ </tip></para>
+ </step>
+
+ <step>
+ <para>Add the Ant <filename>bin</filename> directory to your
+ <envar>PATH</envar>. For example: <filename>c:\Program
+ Files\apache-ant-1.7.1\bin</filename></para>
+ </step>
+
+ <step>
+ <para>Confirm that Ant is installed by typing the following at a
+ command prompt: <programlisting>ant -version</programlisting></para>
+
+ <note>
+ <para>If you see a message about the file
+ <filename>tools.jar</filename> being missing, you can safely
+ ignore it.</para>
+ </note>
+ </step>
+ </substeps>
+ </step>
+
+ <step>
+ <para>Download <ulink url="http://prdownloads.sourceforge.net/saxon/saxon6-5-5.zip">Saxon
+ 6.5.x</ulink> and unzip the distribution to a convenient location on your file system.
+ You will use the path to <filename>saxon.jar</filename> in <xref
+ linkend="edit-build-properties"/> below.<note>
+ <para>The <filename>build.xml</filename> has only been tested with Saxon 6.5, though
+ it could be adapted to work with other XSLT processors. However, when you generate
+ output, the Saxon jar must <emphasis role="bold">not</emphasis> be in your
+ <envar>CLASSPATH</envar>.</para>
+ </note></para>
+ </step>
+
+ <step id="edit-build-properties">
+ <para>In a text editor, edit the
+ <filename>build.properties</filename> file in the webhelp directory
+ and make the changes indicated by the comments:<programlisting># The path (relative to the build.xml file) to your input document.
+# To use your own input document, create a build.xml file of your own
+# and import this build.xml.
+input-xml=docsrc/readme.xml
+
+# The directory in which to put the output files.
+# This directory is created if it does not exist.
+output-dir=docs
+
+# If you are using a customization layer that imports webhelp.xsl, use
+# this property to point to it.
+stylesheet-path=${ant.file.dir}/xsl/webhelp.xsl
+
+# If your document has image directories that need to be copied
+# to the output directory, you can list patterns here.
+# See the Ant documentation for fileset for documentation
+# on patterns.
+#input-images-dirs=images/**,figures/**,graphics/**
+
+# By default, the ant script assumes your images are stored
+# in the same directory as the input-xml. If you store your
+# image directories in another directory, specify it here.
+# and uncomment this line.
+#input-images-basedir=/path/to/image/location
+
+# Modify this so that it points to your copy of the Saxon 6.5 jar.
+xslt-processor-classpath=/usr/share/java/saxon-6.5.5.jar
+
+# For non-ns version only, this validates the document
+# against a dtd.
+validate-against-dtd=true
+
+# Set this to false if you don't need a search tab.
+webhelp.include.search.tab=true
+
+# indexer-language is used to tell the search indexer which language
+# the docbook is written. This will be used to identify the correct
+# stemmer, and punctuations that differs from language to language.
+# see the documentation for details. en=English, fr=French, de=German,
+# zh=Chinese, ja=Japanese etc.
+webhelp.indexer.language=en</programlisting></para>
+ </step>
+
+ <step>
+ <para>Test the package by running the command <code>ant webhelp
+ -Doutput-dir=test-ouput</code> at the command line in the webhelp directory. It should
+ generate a copy of this documentation in the <filename class="directory">doc</filename>
+ directory. Type <code>start test-output\index.html</code> to open the output in a
+ browser. Once you have confirmed that the process worked, you can delete the <filename
+ class="directory">test-output</filename> directory. <important>
+ <para>The Saxon 6.5 jar should <emphasis>not</emphasis> be in your
+ <envar>CLASSPATH</envar> when you generate the webhelp output. If you have any
+ problems, try running ant with an empty <envar>CLASSPATH</envar>.</para>
+ </important></para>
+ </step>
+
+ <step>
+ <para>To process your own document, simply refer to this package
+ from another <filename>build.xml</filename> in arbitrary location on
+ your system:</para>
+
+ <substeps>
+ <step>
+ <para>Create a new <filename>build.xml</filename> file that
+ defines the name of your source file, the desired output
+ directory, and imports the <filename>build.xml</filename> from
+ this package. For example: <programlisting>&lt;project&gt;
+ &lt;property name="input-xml" value="<replaceable>path-to/yourfile.xml</replaceable>"/&gt;
+ &lt;property name="input-images-dirs" value="<replaceable>images/** figures/** graphics/**</replaceable>"/&gt;
+ &lt;property name="output-dir" value="<replaceable>path-to/desired-output-dir</replaceable>"/&gt;
+ &lt;import file="<replaceable>path-to/docbook-webhelp/</replaceable>build.xml"/&gt;
+&lt;/project&gt;</programlisting></para>
+ </step>
+
+ <step>
+ <para>From the directory containing your newly created
+ <filename>build.xml</filename> file, type <code>ant
+ webhelp</code> to build your document.</para>
+ <important>
+ <para>The Saxon 6.5 jar should <emphasis>not</emphasis> be in your
+ <envar>CLASSPATH</envar> when you generate the webhelp output. If you have any
+ problems, try running ant with an empty <envar>CLASSPATH</envar>.</para>
+ </important>
+ </step>
+ </substeps>
+ </step>
+ </procedure>
+ </section>
+
+ <section>
+ <title>Using and customizing the output</title>
+
+ <para>To deep link to a topic inside the help set, simply link directly
+ to the page. This help system uses no frameset, so nothing further is
+ necessary. <tip>
+ <para>See <ulink
+ url="http://www.sagehill.net/docbookxsl/Chunking.html">Chunking into
+ multiple HTML files</ulink> in Bob Stayton's <ulink
+ url="http://www.sagehill.net/docbookxsl/index.html">DocBook XSL: The
+ Complete Guide</ulink> for information on controlling output file
+ names and which files are chunked in DocBook.</para>
+ </tip></para>
+
+ <para>When you perform a search, the results can include brief
+ summaries. These are populated in one of two ways:<itemizedlist>
+ <listitem>
+ <para>By adding <sgmltag>role="summary"</sgmltag> to a
+ <sgmltag>para</sgmltag> or <sgmltag>phrase</sgmltag> in the
+ <sgmltag>chapter</sgmltag> or <sgmltag>section</sgmltag>.</para>
+ </listitem>
+
+ <listitem>
+ <para>By adding an <sgmltag>abstract</sgmltag> to the
+ <sgmltag>chapterinfo</sgmltag> or <sgmltag>sectioninfo</sgmltag>
+ element.</para>
+ </listitem>
+ </itemizedlist></para>
+
+ <para>To customize the look and feel of the help, study the following
+ css files:<itemizedlist>
+ <listitem>
+ <para><filename>docs/common/css/positioning.css</filename>: This
+ handles the Positioning of DIVs in appropriate positions. For
+ example, it causes the <code>leftnavigation</code> div to appear
+ on the left, the header on top, and so on. Use this if you need to
+ change the relative positions or need to change the width/height
+ etc.</para>
+ </listitem>
+
+ <listitem>
+ <para><filename>docs/common/jquery/theme-redmond/jquery-ui-1.8.2.custom.css</filename>:
+ This is the theming part which adds colors and stuff. This is a
+ default theme comes with <ulink
+ url="http://jqueryui.com/download">jqueryui</ulink> unchanged. You
+ can get any theme based your interest from this. (Themes are on
+ right navigation bar.) Then replace the css theme folder
+ (theme-redmond) with it, and change the xsl to point to the new
+ css.</para>
+ </listitem>
+
+ <listitem>
+ <para><filename>docs/common/jquery/treeview/jquery.treeview.css</filename>:
+ This styles the toc Tree. Generally, you don't have to edit this
+ file.</para>
+ </listitem>
+ </itemizedlist></para>
+
+ <section>
+ <title>Recommended Apache configurations</title>
+
+ <para>If you are serving a long document from an Apache web server, we
+ recommend you make the following additions or changes to your
+ <filename>httpd.conf</filename> or <filename>.htaccess</filename>
+ file. <remark>TODO: Explain what each thing
+ does.</remark><programlisting>AddDefaultCharSet UTF-8 # <co
+ id="AddDefaultCharSet" />
+
+ # 480 weeks
+ &lt;FilesMatch "\.(ico|pdf|flv|jpg|jpeg|png|gif|js|css|swf)$"&gt; # <co
+ id="CachingSettings" />
+ Header set Cache-Control "max-age=290304000, public"
+ &lt;/FilesMatch&gt;
+
+ # 2 DAYS
+ &lt;FilesMatch "\.(xml|txt)$"&gt;
+ Header set Cache-Control "max-age=172800, public, must-revalidate"
+ &lt;/FilesMatch&gt;
+
+ # 2 HOURS
+ &lt;FilesMatch "\.(html|htm)$"&gt;
+ Header set Cache-Control "max-age=7200, must-revalidate"
+ &lt;/FilesMatch&gt;
+
+ # compress text, html, javascript, css, xml:
+ AddOutputFilterByType DEFLATE text/plain # <co id="CompressSetting" />
+ AddOutputFilterByType DEFLATE text/html
+ AddOutputFilterByType DEFLATE text/xml
+ AddOutputFilterByType DEFLATE text/css
+ AddOutputFilterByType DEFLATE application/xml
+ AddOutputFilterByType DEFLATE application/xhtml+xml
+ AddOutputFilterByType DEFLATE application/rss+xml
+ AddOutputFilterByType DEFLATE application/javascript
+ AddOutputFilterByType DEFLATE application/x-javascript
+
+ # Or, compress certain file types by extension:
+ &lt;Files *.html&gt;
+ SetOutputFilter DEFLATE
+ &lt;/Files&gt;
+ </programlisting><calloutlist>
+ <callout arearefs="AddDefaultCharSet">
+ <para>See <ulink
+ url="http://www.sagehill.net/docbookxsl/SpecialChars.html">Odd
+ characters in HTML output</ulink> in Bob Stayton's book
+ <citetitle>DocBook XSL: The Complete Guide</citetitle> for more
+ information about this setting.</para>
+ </callout>
+
+ <callout arearefs="CachingSettings">
+ <para>These lines and those that follow cause the browser to
+ cache various resources such as bitmaps and JavaScript files.
+ Note that caching JavaScript files could cause your users to
+ have stale search indexes if you update your document since the
+ search index is stored in JavaScript files.</para>
+ </callout>
+
+ <callout arearefs="CompressSetting">
+ <para>These lines cause the the server to compress html, css,
+ and JavaScript files and the brower to uncompress them to
+ improve download performance.</para>
+ </callout>
+ </calloutlist></para>
+ </section>
+ </section>
+
+ <section>
+ <title>Building the indexer</title>
+
+ <para role="summary">To build the indexer, you must have installed the
+ JDK version 1.5 or higher and set the <envar>ANT_HOME</envar>
+ environment variable. Run <code>ant build-indexer</code> to recompile
+ <filename>nw-cms.jar</filename></para>
+
+ <indexterm>
+ <primary>ANT_HOME</primary>
+ </indexterm>
+
+ <indexterm>
+ <primary>indexer</primary>
+
+ <secondary>building</secondary>
+ </indexterm>
+ </section>
+
+ <section>
+ <title>Adding support for other (non-CJKV) languages</title>
+
+ <para>To support stemming for a language, the search mechanism requires
+ a stemmer implemented in both Java and JavaScript. The Java version is
+ used by the indexer and the JavaScript verison is used to stem the
+ user's input on the search form. Currently the search mechanism supports
+ stemming for English and German. In addition, Java stemmers are included
+ for the following languages. Therefore, to support these languages, you
+ only need to implement the stemmer in JavaScript and add it to the
+ template. If you do undertake this task, please consider contributing
+ the JavaScript version back to this project and to <ulink
+ url="http://snowball.tartarus.org/texts/stemmersoverview.html">Martin
+ Porter's project</ulink>.<itemizedlist>
+ <listitem>
+ <para>Danish</para>
+ </listitem>
+
+ <listitem>
+ <para>Dutch</para>
+ </listitem>
+
+ <listitem>
+ <para>Finnish</para>
+ </listitem>
+
+ <listitem>
+ <para>Hungarian</para>
+ </listitem>
+
+ <listitem>
+ <para>Italian</para>
+ </listitem>
+
+ <listitem>
+ <para>Norwegian</para>
+ </listitem>
+
+ <listitem>
+ <para>Portuguese</para>
+ </listitem>
+
+ <listitem>
+ <para>Romanian</para>
+ </listitem>
+
+ <listitem>
+ <para>Russian</para>
+ </listitem>
+
+ <listitem>
+ <para>Spanish</para>
+ </listitem>
+
+ <listitem>
+ <para>Swedish</para>
+ </listitem>
+
+ <listitem>
+ <para>Turkish</para>
+ </listitem>
+ </itemizedlist></para>
+ </section>
+ </chapter>
+
+ <chapter>
+ <title>Developer Docs</title>
+
+ <para role="summary">This chapter provides an overview of how webhelp is implemented.</para>
+
+ <para>The table of contents and search panes are implemented as divs and
+ rendered as if they were the left pane in a frameset. As a result, the
+ page must save the state of the table of contents and the search in
+ cookies when you navigate away from a page. When you load a new page, the
+ page reads these cookies and restores the state of the table of contents
+ tree and search. The result is that the help system behaves exactly as if
+ it were a frameset.</para>
+
+ <section>
+ <title>Design</title>
+ <para role="summary">An overview of webhelp page structure.</para>
+ <para>DocBook WebHelp page structure is fully built on css-based design
+ abandoning frameset structure. Overall page structure can be divided in to three main sections
+ <itemizedlist>
+ <listitem>
+ <para>Header: Header is a separate Div which include company logo,
+ navigation button(prev, next etc.), page title and heading of parent topic.</para>
+ </listitem>
+
+ <listitem>
+ <para>Content: This includes the content of the documentation. The processing of this part is
+ done by <ulink
+ url="http://docbook.sourceforge.net/release/xsl/current/xhtml/chunk.xsl">
+ DocBook XSL Chunking customization</ulink>. Few further css-styling applied from
+ <filename>positioning.css</filename>.
+ </para>
+ </listitem>
+
+ <listitem>
+ <para>Left Navigation: This includes the table of contents and search tab. This
+ is customized using <ulink url="http://jqueryui.com/">jquery-ui</ulink> styling.</para>
+ <itemizedlist>
+ <listitem>
+ <para>Tabbed Navigation: The navigation pane is organized in to two tabs.
+ Contents tab, and Search tab. Tabbed output is achieved using
+ <ulink url="http://docs.jquery.com/UI/Tabs">JQuery Tabs plugin</ulink>.
+ </para>
+ </listitem>
+
+ <listitem>
+ <para>Table of Contents (TOC) tree: When building the chunked html from the
+ docbook file, Table of Contents is generated as an Unordered List (a list
+ made from <code>&lt;ul> &lt;li></code> tags). When page loads in the browser,
+ we apply styling to it to achieve the nice look that you see. Styling for TOC
+ tree is done by a JQuery UI plugin called
+ <ulink url="http://bassistance.de/jquery-plugins/jquery-plugin-treeview/">
+ TreeView</ulink>. We can generate the tree easily by following javascript code:
+
+<programlisting>
+//Generate the tree
+$("#tree").treeview({
+collapsed: true,
+animated: "medium",
+control: "#sidetreecontrol",
+persist: "cookie"
+});
+</programlisting>
+ </para>
+ </listitem>
+
+ <listitem>
+ <para>Search Tab: This includes the search feature.</para>
+ </listitem>
+ </itemizedlist>
+
+ </listitem>
+ </itemizedlist>
+ </para>
+ </section>
+
+ <section>
+ <title>Search</title>
+ <para role="summary">Overview design of Search mechanism.</para>
+ <para>
+ The searching is a fully client-side implementation of querying texts for
+ content searching, and no server is involved. That means when a user enters a query,
+ it is processed by JavaScript inside the browser, and displays the matching results by
+ comparing the query with a generated 'index', which too reside in the client-side web browser.
+
+ Mainly the search mechanism has two parts.
+ <itemizedlist>
+ <listitem>
+ <para>Indexing: First we need to traverse the content in the docs/content folder and index
+ the words in it. This is done by <filename>nw-cms.jar</filename>. You can invoke it by
+ <code>ant index</code> command from the root of webhelp of directory. You can recompile it
+ again and build the jar file by <code>ant build-indexer</code>. Indexer has some extensive
+ support for such as stemming of words. Indexer has extensive support for English, German,
+ French languages. By extensive support, what I meant is that those texts are stemmed
+ first, to get the root word and then indexes them. For CJK (Chinese, Japanese, Korean)
+ languages, it uses bi-gram tokenizing to break up the words. (CJK languages does not have
+ spaces between words.)
+ </para>
+ <para>
+ When we run <code>ant index</code>, it generates five output files:
+ <itemizedlist>
+ <listitem>
+ <para><filename>htmlFileList.js</filename> - This contains an array named <code>fl</code> which stores details
+ all the files indexed by the indexer.
+ </para>
+ </listitem>
+ <listitem>
+ <para><filename>htmlFileInfoList.js</filename> - This includes some meta data about the indexed files in an array
+ named <code>fil</code>. It includes details about file name, file (html) title, a summary
+ of the content.Format would look like,
+ <code>fil["4"]= "ch03.html@@@Developer Docs@@@This chapter provides an overview of how webhelp is implemented.";</code>
+ </para>
+ </listitem>
+
+ <listitem>
+ <para><filename>index-*.js</filename> (Three index files) - These three files actually stores the index of the content.
+ Index is added to an array named <code>w</code>.</para>
+ </listitem>
+ </itemizedlist>
+
+ </para>
+ </listitem>
+
+ <listitem>
+ <para>
+ Querying: Query processing happens totally in client side. Following JavaScript files handles them.
+ <itemizedlist>
+ <listitem>
+ <para><filename>nwSearchFnt.js</filename> - This handles the user query and returns the search results. It does query
+ word tokenizing, drop unnecessary punctuations and common words, do stemming if docbook language
+ supports it, etc.</para>
+ </listitem>
+ <listitem>
+ <para><filename>{$indexer-language-code}_stemmer.js</filename> - This includes the stemming library.
+ <filename>nwSearchFnt.js</filename> file calls <code>stemmer</code> method in this file for stemming.
+ ex: <code>var stem = stemmer(foobar);</code>
+ </para>
+ </listitem>
+ </itemizedlist>
+ </para>
+ </listitem>
+ </itemizedlist>
+ </para>
+
+ <section>
+ <title>New Stemmers</title>
+ <para role="summary">Adding new Stemmers is very simple.</para>
+ <para>Currently, only English, French, and German stemmers are integrated in to WebHelp. But the code is
+ extensible such that you can add new stemmers easily by few steps.</para>
+ <para>What you need:
+ <itemizedlist>
+ <listitem>
+ <para>You'll need two versions of the stemmer; One written in JavaScript, and another in Java. But fortunately,
+ Snowball contains Java stemmers for number of popular languages, and are already included with the package.
+ You can see the full list in <ulink url="ch02s04.html">Adding support for other (non-CJKV) languages</ulink>.
+ If your language is listed there,
+ Then you have to find javascript version of the stemmer. Generally, new stemmers are getting added in to
+ <ulink url="http://snowball.tartarus.org/otherlangs/index.html">Snowball Stemmers in other languages</ulink> location.
+ If javascript stemmer for your language is available, then download it. Else, you can write a new stemmer in
+ JavaScript using SnowBall algorithm fairly easily. Algorithms are at
+ <ulink url="http://snowball.tartarus.org/">Snowball</ulink>.
+ </para>
+ </listitem>
+ <listitem>
+ <para>Then, name the JS stemmer exactly like this: <filename>{$language-code}_stemmer.js</filename>. For example,
+ for Italian(it), name it as, <filename>it_stemmer.js</filename>. Then, copy it to the
+ <filename>docbook-webhelp/template/content/search/stemmers/</filename> folder. (I assumed
+ <filename>docbook-webhelp</filename> is the root folder for webhelp.)
+ <note>
+ <para>Make sure you changed the <code>webhelp.indexer.language</code> property in <filename>build.properties</filename>
+ to your language.
+ </para>
+ </note>
+
+ </para>
+
+ </listitem>
+ <listitem>
+ <para>Now two easy changes needed for the indexer.</para>
+ <itemizedlist>
+ <listitem>
+ <para>Open <filename>docbook-webhelp/indexer/src/com/nexwave/nquindexer/IndexerTask.java</filename> in
+ a text editor and add your language code to the <code>supportedLanguages</code> String Array. </para>
+ <example>
+ <title>Add new language to supportedLanguages array</title>
+ <para>
+ change the Array from,
+<programlisting>
+private String[] supportedLanguages= {"en", "de", "fr", "cn", "ja", "ko"};
+ //currently extended support available for
+ // English, German, French and CJK (Chinese, Japanese, Korean) languages only.
+</programlisting>
+ To,</para>
+ <programlisting>
+private String[] supportedLanguages= {"en", "de", "fr", "cn", "ja", "ko", <emphasis>"it"</emphasis>};
+ //currently extended support available for
+ // English, German, French, CJK (Chinese, Japanese, Korean), and Italian languages only.
+ </programlisting>
+
+ </example>
+ </listitem>
+ <listitem>
+ <para>
+ Now, open <filename>docbook-webhelp/indexer/src/com/nexwave/nquindexer/SaxHTMLIndex.java</filename> and
+ add the following line to the code where it initializes the Stemmer (Search for
+ <code>SnowballStemmer stemmer;</code>). Then add code to initialize the stemmer Object in your language.
+ It's self understandable. See the example. The class names are at:
+ <filename>docbook-webhelp/indexer/src/com/nexwave/stemmer/snowball/ext/</filename>.
+ </para>
+ <example>
+ <title>initialize correct stemmer based on the <code>webhelp.indexer.language</code> specified</title>
+<programlisting>
+ SnowballStemmer stemmer;
+ if(indexerLanguage.equalsIgnoreCase("en")){
+ stemmer = new EnglishStemmer();
+ } else if (indexerLanguage.equalsIgnoreCase("de")){
+ stemmer= new GermanStemmer();
+ } else if (indexerLanguage.equalsIgnoreCase("fr")){
+ stemmer= new FrenchStemmer();
+ }
+<emphasis>else if (indexerLanguage.equalsIgnoreCase("it")){ //If language code is "it" (Italian)
+ stemmer= new italianStemmer(); //Initialize the stemmer to <code>italianStemmer</code> object.
+ } </emphasis>
+ else {
+ stemmer = null;
+ }
+</programlisting>
+ </example>
+ </listitem>
+ </itemizedlist>
+ </listitem>
+ </itemizedlist>
+ </para>
+ <para>That's all. Now run <code>ant build-indexer</code> to compile and build the java code.
+ Then, run <code>ant webhelp</code> to generate the output from your docbook file.
+ For any questions, contact us or email to the docbook mailing list
+ <email>docbook-apps@lists.oasis-open.org</email>.
+ </para>
+ </section>
+ </section>
+ </chapter>
+</book>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/template/common/css/positioning.css b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/template/common/css/positioning.css
new file mode 100644
index 0000000..3d30bc2
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/template/common/css/positioning.css
@@ -0,0 +1,109 @@
+body { font: 12px Verdana, Geneva, sans-serif; }
+p, ul, ol, li { font: 10pt Verdana, Geneva, sans-serif; }
+h1 { font: bold 15pt Arial, Helvetica, geneva; }
+h2 { font: bold 14pt Arial, Helvetica, geneva; }
+
+#header {
+ background: white url(../images/header-bg.gif) repeat-x;
+ position: fixed;
+ width: 100%;
+ height: 95px;
+ top: 0;
+ right: 0;
+ bottom: auto;
+ left: 0;
+ border-bottom: 2px solid #cccccc;
+ z-index: 2000;
+}
+
+#leftnavigation {
+/* background-color:#91e7b3;*/
+ overflow: auto;
+ position: fixed;
+ height: auto;
+ top: 90px;
+ bottom: 0;
+ left: 0;
+ width: 280px;
+ z-index: 1500;
+ border-right:2px solid #CCCCCC;
+}
+
+#content {
+ position: relative;
+ top: 90px; /* left: 240px;*/
+ right: auto; /* bottom: 20px; */
+ margin: 0px 0px 0px 280px;
+ width: auto;
+ height: inherit;
+ padding-left: 5px;
+ padding-right: 30px;
+ color: #000000;
+ /*border-left: 2px solid #cccccc; overflow :scroll;*/
+ z-index: 1000;
+
+ max-width: 70em;
+ min-width:800px;
+}
+
+#navheader {
+ position: fixed;
+ top: 65px;
+ right:4px;
+}
+
+#content h1, #content h2 { color: #cc0000; }
+.navfooter { bottom: 2%; }
+.highlight { background-color: #c5d3c3; }
+.highlightButton{ font-size: 0; }
+
+/* Show Hide TOC tree */
+.pointLeft {
+ background: url("../images/showHideTreeIcons.png") 0 0 no-repeat;
+ height: 28px;
+ width: 15px;
+ display: block;
+ font-size: 0;
+ cursor: pointer;
+}
+.pointRight {
+ background: url("../images/showHideTreeIcons.png") -15px 0 no-repeat;
+ height: 28px;
+ display: block;
+ font-size: 0;
+ cursor: pointer;
+}
+
+/* Search results Styling */
+.searchExpression {
+ color: #0050A0;
+ background-color: #EBEFF8;
+ font-size: 12pt;
+}
+.searchresult li a {
+ text-decoration: none;
+ color: #0050A0;
+}
+.searchresult li {
+ color: #0050A0;
+}
+.shortdesclink {
+ color: gray;
+ font-size: 9pt;
+}
+.searchText {
+ border: #BFCEE9 solid 1pt;
+ width: 11em
+}
+.searchButton {
+ margin-left: 3px;
+ background: #EBEFF8;
+ color: #0050A0;
+ border: #BFCEE9 solid 1pt;
+ font-weight: bold;
+ font-size: 10pt
+}
+
+.title, div.toc>p{
+ font-weight: bold;
+ } \ No newline at end of file
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/template/common/jquery/jquery-1.4.2.min.js b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/template/common/jquery/jquery-1.4.2.min.js
new file mode 100644
index 0000000..7c24308
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/template/common/jquery/jquery-1.4.2.min.js
@@ -0,0 +1,154 @@
+/*!
+ * jQuery JavaScript Library v1.4.2
+ * http://jquery.com/
+ *
+ * Copyright 2010, John Resig
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * Includes Sizzle.js
+ * http://sizzlejs.com/
+ * Copyright 2010, The Dojo Foundation
+ * Released under the MIT, BSD, and GPL Licenses.
+ *
+ * Date: Sat Feb 13 22:33:48 2010 -0500
+ */
+(function(A,w){function ma(){if(!c.isReady){try{s.documentElement.doScroll("left")}catch(a){setTimeout(ma,1);return}c.ready()}}function Qa(a,b){b.src?c.ajax({url:b.src,async:false,dataType:"script"}):c.globalEval(b.text||b.textContent||b.innerHTML||"");b.parentNode&&b.parentNode.removeChild(b)}function X(a,b,d,f,e,j){var i=a.length;if(typeof b==="object"){for(var o in b)X(a,o,b[o],f,e,d);return a}if(d!==w){f=!j&&f&&c.isFunction(d);for(o=0;o<i;o++)e(a[o],b,f?d.call(a[o],o,e(a[o],b)):d,j);return a}return i?
+e(a[0],b):w}function J(){return(new Date).getTime()}function Y(){return false}function Z(){return true}function na(a,b,d){d[0].type=a;return c.event.handle.apply(b,d)}function oa(a){var b,d=[],f=[],e=arguments,j,i,o,k,n,r;i=c.data(this,"events");if(!(a.liveFired===this||!i||!i.live||a.button&&a.type==="click")){a.liveFired=this;var u=i.live.slice(0);for(k=0;k<u.length;k++){i=u[k];i.origType.replace(O,"")===a.type?f.push(i.selector):u.splice(k--,1)}j=c(a.target).closest(f,a.currentTarget);n=0;for(r=
+j.length;n<r;n++)for(k=0;k<u.length;k++){i=u[k];if(j[n].selector===i.selector){o=j[n].elem;f=null;if(i.preType==="mouseenter"||i.preType==="mouseleave")f=c(a.relatedTarget).closest(i.selector)[0];if(!f||f!==o)d.push({elem:o,handleObj:i})}}n=0;for(r=d.length;n<r;n++){j=d[n];a.currentTarget=j.elem;a.data=j.handleObj.data;a.handleObj=j.handleObj;if(j.handleObj.origHandler.apply(j.elem,e)===false){b=false;break}}return b}}function pa(a,b){return"live."+(a&&a!=="*"?a+".":"")+b.replace(/\./g,"`").replace(/ /g,
+"&")}function qa(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function ra(a,b){var d=0;b.each(function(){if(this.nodeName===(a[d]&&a[d].nodeName)){var f=c.data(a[d++]),e=c.data(this,f);if(f=f&&f.events){delete e.handle;e.events={};for(var j in f)for(var i in f[j])c.event.add(this,j,f[j][i],f[j][i].data)}}})}function sa(a,b,d){var f,e,j;b=b&&b[0]?b[0].ownerDocument||b[0]:s;if(a.length===1&&typeof a[0]==="string"&&a[0].length<512&&b===s&&!ta.test(a[0])&&(c.support.checkClone||!ua.test(a[0]))){e=
+true;if(j=c.fragments[a[0]])if(j!==1)f=j}if(!f){f=b.createDocumentFragment();c.clean(a,b,f,d)}if(e)c.fragments[a[0]]=j?f:1;return{fragment:f,cacheable:e}}function K(a,b){var d={};c.each(va.concat.apply([],va.slice(0,b)),function(){d[this]=a});return d}function wa(a){return"scrollTo"in a&&a.document?a:a.nodeType===9?a.defaultView||a.parentWindow:false}var c=function(a,b){return new c.fn.init(a,b)},Ra=A.jQuery,Sa=A.$,s=A.document,T,Ta=/^[^<]*(<[\w\W]+>)[^>]*$|^#([\w-]+)$/,Ua=/^.[^:#\[\.,]*$/,Va=/\S/,
+Wa=/^(\s|\u00A0)+|(\s|\u00A0)+$/g,Xa=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,P=navigator.userAgent,xa=false,Q=[],L,$=Object.prototype.toString,aa=Object.prototype.hasOwnProperty,ba=Array.prototype.push,R=Array.prototype.slice,ya=Array.prototype.indexOf;c.fn=c.prototype={init:function(a,b){var d,f;if(!a)return this;if(a.nodeType){this.context=this[0]=a;this.length=1;return this}if(a==="body"&&!b){this.context=s;this[0]=s.body;this.selector="body";this.length=1;return this}if(typeof a==="string")if((d=Ta.exec(a))&&
+(d[1]||!b))if(d[1]){f=b?b.ownerDocument||b:s;if(a=Xa.exec(a))if(c.isPlainObject(b)){a=[s.createElement(a[1])];c.fn.attr.call(a,b,true)}else a=[f.createElement(a[1])];else{a=sa([d[1]],[f]);a=(a.cacheable?a.fragment.cloneNode(true):a.fragment).childNodes}return c.merge(this,a)}else{if(b=s.getElementById(d[2])){if(b.id!==d[2])return T.find(a);this.length=1;this[0]=b}this.context=s;this.selector=a;return this}else if(!b&&/^\w+$/.test(a)){this.selector=a;this.context=s;a=s.getElementsByTagName(a);return c.merge(this,
+a)}else return!b||b.jquery?(b||T).find(a):c(b).find(a);else if(c.isFunction(a))return T.ready(a);if(a.selector!==w){this.selector=a.selector;this.context=a.context}return c.makeArray(a,this)},selector:"",jquery:"1.4.2",length:0,size:function(){return this.length},toArray:function(){return R.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this.slice(a)[0]:this[a]},pushStack:function(a,b,d){var f=c();c.isArray(a)?ba.apply(f,a):c.merge(f,a);f.prevObject=this;f.context=this.context;if(b===
+"find")f.selector=this.selector+(this.selector?" ":"")+d;else if(b)f.selector=this.selector+"."+b+"("+d+")";return f},each:function(a,b){return c.each(this,a,b)},ready:function(a){c.bindReady();if(c.isReady)a.call(s,c);else Q&&Q.push(a);return this},eq:function(a){return a===-1?this.slice(a):this.slice(a,+a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(R.apply(this,arguments),"slice",R.call(arguments).join(","))},map:function(a){return this.pushStack(c.map(this,
+function(b,d){return a.call(b,d,b)}))},end:function(){return this.prevObject||c(null)},push:ba,sort:[].sort,splice:[].splice};c.fn.init.prototype=c.fn;c.extend=c.fn.extend=function(){var a=arguments[0]||{},b=1,d=arguments.length,f=false,e,j,i,o;if(typeof a==="boolean"){f=a;a=arguments[1]||{};b=2}if(typeof a!=="object"&&!c.isFunction(a))a={};if(d===b){a=this;--b}for(;b<d;b++)if((e=arguments[b])!=null)for(j in e){i=a[j];o=e[j];if(a!==o)if(f&&o&&(c.isPlainObject(o)||c.isArray(o))){i=i&&(c.isPlainObject(i)||
+c.isArray(i))?i:c.isArray(o)?[]:{};a[j]=c.extend(f,i,o)}else if(o!==w)a[j]=o}return a};c.extend({noConflict:function(a){A.$=Sa;if(a)A.jQuery=Ra;return c},isReady:false,ready:function(){if(!c.isReady){if(!s.body)return setTimeout(c.ready,13);c.isReady=true;if(Q){for(var a,b=0;a=Q[b++];)a.call(s,c);Q=null}c.fn.triggerHandler&&c(s).triggerHandler("ready")}},bindReady:function(){if(!xa){xa=true;if(s.readyState==="complete")return c.ready();if(s.addEventListener){s.addEventListener("DOMContentLoaded",
+L,false);A.addEventListener("load",c.ready,false)}else if(s.attachEvent){s.attachEvent("onreadystatechange",L);A.attachEvent("onload",c.ready);var a=false;try{a=A.frameElement==null}catch(b){}s.documentElement.doScroll&&a&&ma()}}},isFunction:function(a){return $.call(a)==="[object Function]"},isArray:function(a){return $.call(a)==="[object Array]"},isPlainObject:function(a){if(!a||$.call(a)!=="[object Object]"||a.nodeType||a.setInterval)return false;if(a.constructor&&!aa.call(a,"constructor")&&!aa.call(a.constructor.prototype,
+"isPrototypeOf"))return false;var b;for(b in a);return b===w||aa.call(a,b)},isEmptyObject:function(a){for(var b in a)return false;return true},error:function(a){throw a;},parseJSON:function(a){if(typeof a!=="string"||!a)return null;a=c.trim(a);if(/^[\],:{}\s]*$/.test(a.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,"@").replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,"]").replace(/(?:^|:|,)(?:\s*\[)+/g,"")))return A.JSON&&A.JSON.parse?A.JSON.parse(a):(new Function("return "+
+a))();else c.error("Invalid JSON: "+a)},noop:function(){},globalEval:function(a){if(a&&Va.test(a)){var b=s.getElementsByTagName("head")[0]||s.documentElement,d=s.createElement("script");d.type="text/javascript";if(c.support.scriptEval)d.appendChild(s.createTextNode(a));else d.text=a;b.insertBefore(d,b.firstChild);b.removeChild(d)}},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,b,d){var f,e=0,j=a.length,i=j===w||c.isFunction(a);if(d)if(i)for(f in a){if(b.apply(a[f],
+d)===false)break}else for(;e<j;){if(b.apply(a[e++],d)===false)break}else if(i)for(f in a){if(b.call(a[f],f,a[f])===false)break}else for(d=a[0];e<j&&b.call(d,e,d)!==false;d=a[++e]);return a},trim:function(a){return(a||"").replace(Wa,"")},makeArray:function(a,b){b=b||[];if(a!=null)a.length==null||typeof a==="string"||c.isFunction(a)||typeof a!=="function"&&a.setInterval?ba.call(b,a):c.merge(b,a);return b},inArray:function(a,b){if(b.indexOf)return b.indexOf(a);for(var d=0,f=b.length;d<f;d++)if(b[d]===
+a)return d;return-1},merge:function(a,b){var d=a.length,f=0;if(typeof b.length==="number")for(var e=b.length;f<e;f++)a[d++]=b[f];else for(;b[f]!==w;)a[d++]=b[f++];a.length=d;return a},grep:function(a,b,d){for(var f=[],e=0,j=a.length;e<j;e++)!d!==!b(a[e],e)&&f.push(a[e]);return f},map:function(a,b,d){for(var f=[],e,j=0,i=a.length;j<i;j++){e=b(a[j],j,d);if(e!=null)f[f.length]=e}return f.concat.apply([],f)},guid:1,proxy:function(a,b,d){if(arguments.length===2)if(typeof b==="string"){d=a;a=d[b];b=w}else if(b&&
+!c.isFunction(b)){d=b;b=w}if(!b&&a)b=function(){return a.apply(d||this,arguments)};if(a)b.guid=a.guid=a.guid||b.guid||c.guid++;return b},uaMatch:function(a){a=a.toLowerCase();a=/(webkit)[ \/]([\w.]+)/.exec(a)||/(opera)(?:.*version)?[ \/]([\w.]+)/.exec(a)||/(msie) ([\w.]+)/.exec(a)||!/compatible/.test(a)&&/(mozilla)(?:.*? rv:([\w.]+))?/.exec(a)||[];return{browser:a[1]||"",version:a[2]||"0"}},browser:{}});P=c.uaMatch(P);if(P.browser){c.browser[P.browser]=true;c.browser.version=P.version}if(c.browser.webkit)c.browser.safari=
+true;if(ya)c.inArray=function(a,b){return ya.call(b,a)};T=c(s);if(s.addEventListener)L=function(){s.removeEventListener("DOMContentLoaded",L,false);c.ready()};else if(s.attachEvent)L=function(){if(s.readyState==="complete"){s.detachEvent("onreadystatechange",L);c.ready()}};(function(){c.support={};var a=s.documentElement,b=s.createElement("script"),d=s.createElement("div"),f="script"+J();d.style.display="none";d.innerHTML=" <link/><table></table><a href='/a' style='color:red;float:left;opacity:.55;'>a</a><input type='checkbox'/>";
+var e=d.getElementsByTagName("*"),j=d.getElementsByTagName("a")[0];if(!(!e||!e.length||!j)){c.support={leadingWhitespace:d.firstChild.nodeType===3,tbody:!d.getElementsByTagName("tbody").length,htmlSerialize:!!d.getElementsByTagName("link").length,style:/red/.test(j.getAttribute("style")),hrefNormalized:j.getAttribute("href")==="/a",opacity:/^0.55$/.test(j.style.opacity),cssFloat:!!j.style.cssFloat,checkOn:d.getElementsByTagName("input")[0].value==="on",optSelected:s.createElement("select").appendChild(s.createElement("option")).selected,
+parentNode:d.removeChild(d.appendChild(s.createElement("div"))).parentNode===null,deleteExpando:true,checkClone:false,scriptEval:false,noCloneEvent:true,boxModel:null};b.type="text/javascript";try{b.appendChild(s.createTextNode("window."+f+"=1;"))}catch(i){}a.insertBefore(b,a.firstChild);if(A[f]){c.support.scriptEval=true;delete A[f]}try{delete b.test}catch(o){c.support.deleteExpando=false}a.removeChild(b);if(d.attachEvent&&d.fireEvent){d.attachEvent("onclick",function k(){c.support.noCloneEvent=
+false;d.detachEvent("onclick",k)});d.cloneNode(true).fireEvent("onclick")}d=s.createElement("div");d.innerHTML="<input type='radio' name='radiotest' checked='checked'/>";a=s.createDocumentFragment();a.appendChild(d.firstChild);c.support.checkClone=a.cloneNode(true).cloneNode(true).lastChild.checked;c(function(){var k=s.createElement("div");k.style.width=k.style.paddingLeft="1px";s.body.appendChild(k);c.boxModel=c.support.boxModel=k.offsetWidth===2;s.body.removeChild(k).style.display="none"});a=function(k){var n=
+s.createElement("div");k="on"+k;var r=k in n;if(!r){n.setAttribute(k,"return;");r=typeof n[k]==="function"}return r};c.support.submitBubbles=a("submit");c.support.changeBubbles=a("change");a=b=d=e=j=null}})();c.props={"for":"htmlFor","class":"className",readonly:"readOnly",maxlength:"maxLength",cellspacing:"cellSpacing",rowspan:"rowSpan",colspan:"colSpan",tabindex:"tabIndex",usemap:"useMap",frameborder:"frameBorder"};var G="jQuery"+J(),Ya=0,za={};c.extend({cache:{},expando:G,noData:{embed:true,object:true,
+applet:true},data:function(a,b,d){if(!(a.nodeName&&c.noData[a.nodeName.toLowerCase()])){a=a==A?za:a;var f=a[G],e=c.cache;if(!f&&typeof b==="string"&&d===w)return null;f||(f=++Ya);if(typeof b==="object"){a[G]=f;e[f]=c.extend(true,{},b)}else if(!e[f]){a[G]=f;e[f]={}}a=e[f];if(d!==w)a[b]=d;return typeof b==="string"?a[b]:a}},removeData:function(a,b){if(!(a.nodeName&&c.noData[a.nodeName.toLowerCase()])){a=a==A?za:a;var d=a[G],f=c.cache,e=f[d];if(b){if(e){delete e[b];c.isEmptyObject(e)&&c.removeData(a)}}else{if(c.support.deleteExpando)delete a[c.expando];
+else a.removeAttribute&&a.removeAttribute(c.expando);delete f[d]}}}});c.fn.extend({data:function(a,b){if(typeof a==="undefined"&&this.length)return c.data(this[0]);else if(typeof a==="object")return this.each(function(){c.data(this,a)});var d=a.split(".");d[1]=d[1]?"."+d[1]:"";if(b===w){var f=this.triggerHandler("getData"+d[1]+"!",[d[0]]);if(f===w&&this.length)f=c.data(this[0],a);return f===w&&d[1]?this.data(d[0]):f}else return this.trigger("setData"+d[1]+"!",[d[0],b]).each(function(){c.data(this,
+a,b)})},removeData:function(a){return this.each(function(){c.removeData(this,a)})}});c.extend({queue:function(a,b,d){if(a){b=(b||"fx")+"queue";var f=c.data(a,b);if(!d)return f||[];if(!f||c.isArray(d))f=c.data(a,b,c.makeArray(d));else f.push(d);return f}},dequeue:function(a,b){b=b||"fx";var d=c.queue(a,b),f=d.shift();if(f==="inprogress")f=d.shift();if(f){b==="fx"&&d.unshift("inprogress");f.call(a,function(){c.dequeue(a,b)})}}});c.fn.extend({queue:function(a,b){if(typeof a!=="string"){b=a;a="fx"}if(b===
+w)return c.queue(this[0],a);return this.each(function(){var d=c.queue(this,a,b);a==="fx"&&d[0]!=="inprogress"&&c.dequeue(this,a)})},dequeue:function(a){return this.each(function(){c.dequeue(this,a)})},delay:function(a,b){a=c.fx?c.fx.speeds[a]||a:a;b=b||"fx";return this.queue(b,function(){var d=this;setTimeout(function(){c.dequeue(d,b)},a)})},clearQueue:function(a){return this.queue(a||"fx",[])}});var Aa=/[\n\t]/g,ca=/\s+/,Za=/\r/g,$a=/href|src|style/,ab=/(button|input)/i,bb=/(button|input|object|select|textarea)/i,
+cb=/^(a|area)$/i,Ba=/radio|checkbox/;c.fn.extend({attr:function(a,b){return X(this,a,b,true,c.attr)},removeAttr:function(a){return this.each(function(){c.attr(this,a,"");this.nodeType===1&&this.removeAttribute(a)})},addClass:function(a){if(c.isFunction(a))return this.each(function(n){var r=c(this);r.addClass(a.call(this,n,r.attr("class")))});if(a&&typeof a==="string")for(var b=(a||"").split(ca),d=0,f=this.length;d<f;d++){var e=this[d];if(e.nodeType===1)if(e.className){for(var j=" "+e.className+" ",
+i=e.className,o=0,k=b.length;o<k;o++)if(j.indexOf(" "+b[o]+" ")<0)i+=" "+b[o];e.className=c.trim(i)}else e.className=a}return this},removeClass:function(a){if(c.isFunction(a))return this.each(function(k){var n=c(this);n.removeClass(a.call(this,k,n.attr("class")))});if(a&&typeof a==="string"||a===w)for(var b=(a||"").split(ca),d=0,f=this.length;d<f;d++){var e=this[d];if(e.nodeType===1&&e.className)if(a){for(var j=(" "+e.className+" ").replace(Aa," "),i=0,o=b.length;i<o;i++)j=j.replace(" "+b[i]+" ",
+" ");e.className=c.trim(j)}else e.className=""}return this},toggleClass:function(a,b){var d=typeof a,f=typeof b==="boolean";if(c.isFunction(a))return this.each(function(e){var j=c(this);j.toggleClass(a.call(this,e,j.attr("class"),b),b)});return this.each(function(){if(d==="string")for(var e,j=0,i=c(this),o=b,k=a.split(ca);e=k[j++];){o=f?o:!i.hasClass(e);i[o?"addClass":"removeClass"](e)}else if(d==="undefined"||d==="boolean"){this.className&&c.data(this,"__className__",this.className);this.className=
+this.className||a===false?"":c.data(this,"__className__")||""}})},hasClass:function(a){a=" "+a+" ";for(var b=0,d=this.length;b<d;b++)if((" "+this[b].className+" ").replace(Aa," ").indexOf(a)>-1)return true;return false},val:function(a){if(a===w){var b=this[0];if(b){if(c.nodeName(b,"option"))return(b.attributes.value||{}).specified?b.value:b.text;if(c.nodeName(b,"select")){var d=b.selectedIndex,f=[],e=b.options;b=b.type==="select-one";if(d<0)return null;var j=b?d:0;for(d=b?d+1:e.length;j<d;j++){var i=
+e[j];if(i.selected){a=c(i).val();if(b)return a;f.push(a)}}return f}if(Ba.test(b.type)&&!c.support.checkOn)return b.getAttribute("value")===null?"on":b.value;return(b.value||"").replace(Za,"")}return w}var o=c.isFunction(a);return this.each(function(k){var n=c(this),r=a;if(this.nodeType===1){if(o)r=a.call(this,k,n.val());if(typeof r==="number")r+="";if(c.isArray(r)&&Ba.test(this.type))this.checked=c.inArray(n.val(),r)>=0;else if(c.nodeName(this,"select")){var u=c.makeArray(r);c("option",this).each(function(){this.selected=
+c.inArray(c(this).val(),u)>=0});if(!u.length)this.selectedIndex=-1}else this.value=r}})}});c.extend({attrFn:{val:true,css:true,html:true,text:true,data:true,width:true,height:true,offset:true},attr:function(a,b,d,f){if(!a||a.nodeType===3||a.nodeType===8)return w;if(f&&b in c.attrFn)return c(a)[b](d);f=a.nodeType!==1||!c.isXMLDoc(a);var e=d!==w;b=f&&c.props[b]||b;if(a.nodeType===1){var j=$a.test(b);if(b in a&&f&&!j){if(e){b==="type"&&ab.test(a.nodeName)&&a.parentNode&&c.error("type property can't be changed");
+a[b]=d}if(c.nodeName(a,"form")&&a.getAttributeNode(b))return a.getAttributeNode(b).nodeValue;if(b==="tabIndex")return(b=a.getAttributeNode("tabIndex"))&&b.specified?b.value:bb.test(a.nodeName)||cb.test(a.nodeName)&&a.href?0:w;return a[b]}if(!c.support.style&&f&&b==="style"){if(e)a.style.cssText=""+d;return a.style.cssText}e&&a.setAttribute(b,""+d);a=!c.support.hrefNormalized&&f&&j?a.getAttribute(b,2):a.getAttribute(b);return a===null?w:a}return c.style(a,b,d)}});var O=/\.(.*)$/,db=function(a){return a.replace(/[^\w\s\.\|`]/g,
+function(b){return"\\"+b})};c.event={add:function(a,b,d,f){if(!(a.nodeType===3||a.nodeType===8)){if(a.setInterval&&a!==A&&!a.frameElement)a=A;var e,j;if(d.handler){e=d;d=e.handler}if(!d.guid)d.guid=c.guid++;if(j=c.data(a)){var i=j.events=j.events||{},o=j.handle;if(!o)j.handle=o=function(){return typeof c!=="undefined"&&!c.event.triggered?c.event.handle.apply(o.elem,arguments):w};o.elem=a;b=b.split(" ");for(var k,n=0,r;k=b[n++];){j=e?c.extend({},e):{handler:d,data:f};if(k.indexOf(".")>-1){r=k.split(".");
+k=r.shift();j.namespace=r.slice(0).sort().join(".")}else{r=[];j.namespace=""}j.type=k;j.guid=d.guid;var u=i[k],z=c.event.special[k]||{};if(!u){u=i[k]=[];if(!z.setup||z.setup.call(a,f,r,o)===false)if(a.addEventListener)a.addEventListener(k,o,false);else a.attachEvent&&a.attachEvent("on"+k,o)}if(z.add){z.add.call(a,j);if(!j.handler.guid)j.handler.guid=d.guid}u.push(j);c.event.global[k]=true}a=null}}},global:{},remove:function(a,b,d,f){if(!(a.nodeType===3||a.nodeType===8)){var e,j=0,i,o,k,n,r,u,z=c.data(a),
+C=z&&z.events;if(z&&C){if(b&&b.type){d=b.handler;b=b.type}if(!b||typeof b==="string"&&b.charAt(0)==="."){b=b||"";for(e in C)c.event.remove(a,e+b)}else{for(b=b.split(" ");e=b[j++];){n=e;i=e.indexOf(".")<0;o=[];if(!i){o=e.split(".");e=o.shift();k=new RegExp("(^|\\.)"+c.map(o.slice(0).sort(),db).join("\\.(?:.*\\.)?")+"(\\.|$)")}if(r=C[e])if(d){n=c.event.special[e]||{};for(B=f||0;B<r.length;B++){u=r[B];if(d.guid===u.guid){if(i||k.test(u.namespace)){f==null&&r.splice(B--,1);n.remove&&n.remove.call(a,u)}if(f!=
+null)break}}if(r.length===0||f!=null&&r.length===1){if(!n.teardown||n.teardown.call(a,o)===false)Ca(a,e,z.handle);delete C[e]}}else for(var B=0;B<r.length;B++){u=r[B];if(i||k.test(u.namespace)){c.event.remove(a,n,u.handler,B);r.splice(B--,1)}}}if(c.isEmptyObject(C)){if(b=z.handle)b.elem=null;delete z.events;delete z.handle;c.isEmptyObject(z)&&c.removeData(a)}}}}},trigger:function(a,b,d,f){var e=a.type||a;if(!f){a=typeof a==="object"?a[G]?a:c.extend(c.Event(e),a):c.Event(e);if(e.indexOf("!")>=0){a.type=
+e=e.slice(0,-1);a.exclusive=true}if(!d){a.stopPropagation();c.event.global[e]&&c.each(c.cache,function(){this.events&&this.events[e]&&c.event.trigger(a,b,this.handle.elem)})}if(!d||d.nodeType===3||d.nodeType===8)return w;a.result=w;a.target=d;b=c.makeArray(b);b.unshift(a)}a.currentTarget=d;(f=c.data(d,"handle"))&&f.apply(d,b);f=d.parentNode||d.ownerDocument;try{if(!(d&&d.nodeName&&c.noData[d.nodeName.toLowerCase()]))if(d["on"+e]&&d["on"+e].apply(d,b)===false)a.result=false}catch(j){}if(!a.isPropagationStopped()&&
+f)c.event.trigger(a,b,f,true);else if(!a.isDefaultPrevented()){f=a.target;var i,o=c.nodeName(f,"a")&&e==="click",k=c.event.special[e]||{};if((!k._default||k._default.call(d,a)===false)&&!o&&!(f&&f.nodeName&&c.noData[f.nodeName.toLowerCase()])){try{if(f[e]){if(i=f["on"+e])f["on"+e]=null;c.event.triggered=true;f[e]()}}catch(n){}if(i)f["on"+e]=i;c.event.triggered=false}}},handle:function(a){var b,d,f,e;a=arguments[0]=c.event.fix(a||A.event);a.currentTarget=this;b=a.type.indexOf(".")<0&&!a.exclusive;
+if(!b){d=a.type.split(".");a.type=d.shift();f=new RegExp("(^|\\.)"+d.slice(0).sort().join("\\.(?:.*\\.)?")+"(\\.|$)")}e=c.data(this,"events");d=e[a.type];if(e&&d){d=d.slice(0);e=0;for(var j=d.length;e<j;e++){var i=d[e];if(b||f.test(i.namespace)){a.handler=i.handler;a.data=i.data;a.handleObj=i;i=i.handler.apply(this,arguments);if(i!==w){a.result=i;if(i===false){a.preventDefault();a.stopPropagation()}}if(a.isImmediatePropagationStopped())break}}}return a.result},props:"altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode layerX layerY metaKey newValue offsetX offsetY originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),
+fix:function(a){if(a[G])return a;var b=a;a=c.Event(b);for(var d=this.props.length,f;d;){f=this.props[--d];a[f]=b[f]}if(!a.target)a.target=a.srcElement||s;if(a.target.nodeType===3)a.target=a.target.parentNode;if(!a.relatedTarget&&a.fromElement)a.relatedTarget=a.fromElement===a.target?a.toElement:a.fromElement;if(a.pageX==null&&a.clientX!=null){b=s.documentElement;d=s.body;a.pageX=a.clientX+(b&&b.scrollLeft||d&&d.scrollLeft||0)-(b&&b.clientLeft||d&&d.clientLeft||0);a.pageY=a.clientY+(b&&b.scrollTop||
+d&&d.scrollTop||0)-(b&&b.clientTop||d&&d.clientTop||0)}if(!a.which&&(a.charCode||a.charCode===0?a.charCode:a.keyCode))a.which=a.charCode||a.keyCode;if(!a.metaKey&&a.ctrlKey)a.metaKey=a.ctrlKey;if(!a.which&&a.button!==w)a.which=a.button&1?1:a.button&2?3:a.button&4?2:0;return a},guid:1E8,proxy:c.proxy,special:{ready:{setup:c.bindReady,teardown:c.noop},live:{add:function(a){c.event.add(this,a.origType,c.extend({},a,{handler:oa}))},remove:function(a){var b=true,d=a.origType.replace(O,"");c.each(c.data(this,
+"events").live||[],function(){if(d===this.origType.replace(O,""))return b=false});b&&c.event.remove(this,a.origType,oa)}},beforeunload:{setup:function(a,b,d){if(this.setInterval)this.onbeforeunload=d;return false},teardown:function(a,b){if(this.onbeforeunload===b)this.onbeforeunload=null}}}};var Ca=s.removeEventListener?function(a,b,d){a.removeEventListener(b,d,false)}:function(a,b,d){a.detachEvent("on"+b,d)};c.Event=function(a){if(!this.preventDefault)return new c.Event(a);if(a&&a.type){this.originalEvent=
+a;this.type=a.type}else this.type=a;this.timeStamp=J();this[G]=true};c.Event.prototype={preventDefault:function(){this.isDefaultPrevented=Z;var a=this.originalEvent;if(a){a.preventDefault&&a.preventDefault();a.returnValue=false}},stopPropagation:function(){this.isPropagationStopped=Z;var a=this.originalEvent;if(a){a.stopPropagation&&a.stopPropagation();a.cancelBubble=true}},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=Z;this.stopPropagation()},isDefaultPrevented:Y,isPropagationStopped:Y,
+isImmediatePropagationStopped:Y};var Da=function(a){var b=a.relatedTarget;try{for(;b&&b!==this;)b=b.parentNode;if(b!==this){a.type=a.data;c.event.handle.apply(this,arguments)}}catch(d){}},Ea=function(a){a.type=a.data;c.event.handle.apply(this,arguments)};c.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(a,b){c.event.special[a]={setup:function(d){c.event.add(this,b,d&&d.selector?Ea:Da,a)},teardown:function(d){c.event.remove(this,b,d&&d.selector?Ea:Da)}}});if(!c.support.submitBubbles)c.event.special.submit=
+{setup:function(){if(this.nodeName.toLowerCase()!=="form"){c.event.add(this,"click.specialSubmit",function(a){var b=a.target,d=b.type;if((d==="submit"||d==="image")&&c(b).closest("form").length)return na("submit",this,arguments)});c.event.add(this,"keypress.specialSubmit",function(a){var b=a.target,d=b.type;if((d==="text"||d==="password")&&c(b).closest("form").length&&a.keyCode===13)return na("submit",this,arguments)})}else return false},teardown:function(){c.event.remove(this,".specialSubmit")}};
+if(!c.support.changeBubbles){var da=/textarea|input|select/i,ea,Fa=function(a){var b=a.type,d=a.value;if(b==="radio"||b==="checkbox")d=a.checked;else if(b==="select-multiple")d=a.selectedIndex>-1?c.map(a.options,function(f){return f.selected}).join("-"):"";else if(a.nodeName.toLowerCase()==="select")d=a.selectedIndex;return d},fa=function(a,b){var d=a.target,f,e;if(!(!da.test(d.nodeName)||d.readOnly)){f=c.data(d,"_change_data");e=Fa(d);if(a.type!=="focusout"||d.type!=="radio")c.data(d,"_change_data",
+e);if(!(f===w||e===f))if(f!=null||e){a.type="change";return c.event.trigger(a,b,d)}}};c.event.special.change={filters:{focusout:fa,click:function(a){var b=a.target,d=b.type;if(d==="radio"||d==="checkbox"||b.nodeName.toLowerCase()==="select")return fa.call(this,a)},keydown:function(a){var b=a.target,d=b.type;if(a.keyCode===13&&b.nodeName.toLowerCase()!=="textarea"||a.keyCode===32&&(d==="checkbox"||d==="radio")||d==="select-multiple")return fa.call(this,a)},beforeactivate:function(a){a=a.target;c.data(a,
+"_change_data",Fa(a))}},setup:function(){if(this.type==="file")return false;for(var a in ea)c.event.add(this,a+".specialChange",ea[a]);return da.test(this.nodeName)},teardown:function(){c.event.remove(this,".specialChange");return da.test(this.nodeName)}};ea=c.event.special.change.filters}s.addEventListener&&c.each({focus:"focusin",blur:"focusout"},function(a,b){function d(f){f=c.event.fix(f);f.type=b;return c.event.handle.call(this,f)}c.event.special[b]={setup:function(){this.addEventListener(a,
+d,true)},teardown:function(){this.removeEventListener(a,d,true)}}});c.each(["bind","one"],function(a,b){c.fn[b]=function(d,f,e){if(typeof d==="object"){for(var j in d)this[b](j,f,d[j],e);return this}if(c.isFunction(f)){e=f;f=w}var i=b==="one"?c.proxy(e,function(k){c(this).unbind(k,i);return e.apply(this,arguments)}):e;if(d==="unload"&&b!=="one")this.one(d,f,e);else{j=0;for(var o=this.length;j<o;j++)c.event.add(this[j],d,i,f)}return this}});c.fn.extend({unbind:function(a,b){if(typeof a==="object"&&
+!a.preventDefault)for(var d in a)this.unbind(d,a[d]);else{d=0;for(var f=this.length;d<f;d++)c.event.remove(this[d],a,b)}return this},delegate:function(a,b,d,f){return this.live(b,d,f,a)},undelegate:function(a,b,d){return arguments.length===0?this.unbind("live"):this.die(b,null,d,a)},trigger:function(a,b){return this.each(function(){c.event.trigger(a,b,this)})},triggerHandler:function(a,b){if(this[0]){a=c.Event(a);a.preventDefault();a.stopPropagation();c.event.trigger(a,b,this[0]);return a.result}},
+toggle:function(a){for(var b=arguments,d=1;d<b.length;)c.proxy(a,b[d++]);return this.click(c.proxy(a,function(f){var e=(c.data(this,"lastToggle"+a.guid)||0)%d;c.data(this,"lastToggle"+a.guid,e+1);f.preventDefault();return b[e].apply(this,arguments)||false}))},hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}});var Ga={focus:"focusin",blur:"focusout",mouseenter:"mouseover",mouseleave:"mouseout"};c.each(["live","die"],function(a,b){c.fn[b]=function(d,f,e,j){var i,o=0,k,n,r=j||this.selector,
+u=j?this:c(this.context);if(c.isFunction(f)){e=f;f=w}for(d=(d||"").split(" ");(i=d[o++])!=null;){j=O.exec(i);k="";if(j){k=j[0];i=i.replace(O,"")}if(i==="hover")d.push("mouseenter"+k,"mouseleave"+k);else{n=i;if(i==="focus"||i==="blur"){d.push(Ga[i]+k);i+=k}else i=(Ga[i]||i)+k;b==="live"?u.each(function(){c.event.add(this,pa(i,r),{data:f,selector:r,handler:e,origType:i,origHandler:e,preType:n})}):u.unbind(pa(i,r),e)}}return this}});c.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error".split(" "),
+function(a,b){c.fn[b]=function(d){return d?this.bind(b,d):this.trigger(b)};if(c.attrFn)c.attrFn[b]=true});A.attachEvent&&!A.addEventListener&&A.attachEvent("onunload",function(){for(var a in c.cache)if(c.cache[a].handle)try{c.event.remove(c.cache[a].handle.elem)}catch(b){}});(function(){function a(g){for(var h="",l,m=0;g[m];m++){l=g[m];if(l.nodeType===3||l.nodeType===4)h+=l.nodeValue;else if(l.nodeType!==8)h+=a(l.childNodes)}return h}function b(g,h,l,m,q,p){q=0;for(var v=m.length;q<v;q++){var t=m[q];
+if(t){t=t[g];for(var y=false;t;){if(t.sizcache===l){y=m[t.sizset];break}if(t.nodeType===1&&!p){t.sizcache=l;t.sizset=q}if(t.nodeName.toLowerCase()===h){y=t;break}t=t[g]}m[q]=y}}}function d(g,h,l,m,q,p){q=0;for(var v=m.length;q<v;q++){var t=m[q];if(t){t=t[g];for(var y=false;t;){if(t.sizcache===l){y=m[t.sizset];break}if(t.nodeType===1){if(!p){t.sizcache=l;t.sizset=q}if(typeof h!=="string"){if(t===h){y=true;break}}else if(k.filter(h,[t]).length>0){y=t;break}}t=t[g]}m[q]=y}}}var f=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,
+e=0,j=Object.prototype.toString,i=false,o=true;[0,0].sort(function(){o=false;return 0});var k=function(g,h,l,m){l=l||[];var q=h=h||s;if(h.nodeType!==1&&h.nodeType!==9)return[];if(!g||typeof g!=="string")return l;for(var p=[],v,t,y,S,H=true,M=x(h),I=g;(f.exec(""),v=f.exec(I))!==null;){I=v[3];p.push(v[1]);if(v[2]){S=v[3];break}}if(p.length>1&&r.exec(g))if(p.length===2&&n.relative[p[0]])t=ga(p[0]+p[1],h);else for(t=n.relative[p[0]]?[h]:k(p.shift(),h);p.length;){g=p.shift();if(n.relative[g])g+=p.shift();
+t=ga(g,t)}else{if(!m&&p.length>1&&h.nodeType===9&&!M&&n.match.ID.test(p[0])&&!n.match.ID.test(p[p.length-1])){v=k.find(p.shift(),h,M);h=v.expr?k.filter(v.expr,v.set)[0]:v.set[0]}if(h){v=m?{expr:p.pop(),set:z(m)}:k.find(p.pop(),p.length===1&&(p[0]==="~"||p[0]==="+")&&h.parentNode?h.parentNode:h,M);t=v.expr?k.filter(v.expr,v.set):v.set;if(p.length>0)y=z(t);else H=false;for(;p.length;){var D=p.pop();v=D;if(n.relative[D])v=p.pop();else D="";if(v==null)v=h;n.relative[D](y,v,M)}}else y=[]}y||(y=t);y||k.error(D||
+g);if(j.call(y)==="[object Array]")if(H)if(h&&h.nodeType===1)for(g=0;y[g]!=null;g++){if(y[g]&&(y[g]===true||y[g].nodeType===1&&E(h,y[g])))l.push(t[g])}else for(g=0;y[g]!=null;g++)y[g]&&y[g].nodeType===1&&l.push(t[g]);else l.push.apply(l,y);else z(y,l);if(S){k(S,q,l,m);k.uniqueSort(l)}return l};k.uniqueSort=function(g){if(B){i=o;g.sort(B);if(i)for(var h=1;h<g.length;h++)g[h]===g[h-1]&&g.splice(h--,1)}return g};k.matches=function(g,h){return k(g,null,null,h)};k.find=function(g,h,l){var m,q;if(!g)return[];
+for(var p=0,v=n.order.length;p<v;p++){var t=n.order[p];if(q=n.leftMatch[t].exec(g)){var y=q[1];q.splice(1,1);if(y.substr(y.length-1)!=="\\"){q[1]=(q[1]||"").replace(/\\/g,"");m=n.find[t](q,h,l);if(m!=null){g=g.replace(n.match[t],"");break}}}}m||(m=h.getElementsByTagName("*"));return{set:m,expr:g}};k.filter=function(g,h,l,m){for(var q=g,p=[],v=h,t,y,S=h&&h[0]&&x(h[0]);g&&h.length;){for(var H in n.filter)if((t=n.leftMatch[H].exec(g))!=null&&t[2]){var M=n.filter[H],I,D;D=t[1];y=false;t.splice(1,1);if(D.substr(D.length-
+1)!=="\\"){if(v===p)p=[];if(n.preFilter[H])if(t=n.preFilter[H](t,v,l,p,m,S)){if(t===true)continue}else y=I=true;if(t)for(var U=0;(D=v[U])!=null;U++)if(D){I=M(D,t,U,v);var Ha=m^!!I;if(l&&I!=null)if(Ha)y=true;else v[U]=false;else if(Ha){p.push(D);y=true}}if(I!==w){l||(v=p);g=g.replace(n.match[H],"");if(!y)return[];break}}}if(g===q)if(y==null)k.error(g);else break;q=g}return v};k.error=function(g){throw"Syntax error, unrecognized expression: "+g;};var n=k.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF-]|\\.)+)/,
+CLASS:/\.((?:[\w\u00c0-\uFFFF-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\((even|odd|[\dn+-]*)\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/},leftMatch:{},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(g){return g.getAttribute("href")}},
+relative:{"+":function(g,h){var l=typeof h==="string",m=l&&!/\W/.test(h);l=l&&!m;if(m)h=h.toLowerCase();m=0;for(var q=g.length,p;m<q;m++)if(p=g[m]){for(;(p=p.previousSibling)&&p.nodeType!==1;);g[m]=l||p&&p.nodeName.toLowerCase()===h?p||false:p===h}l&&k.filter(h,g,true)},">":function(g,h){var l=typeof h==="string";if(l&&!/\W/.test(h)){h=h.toLowerCase();for(var m=0,q=g.length;m<q;m++){var p=g[m];if(p){l=p.parentNode;g[m]=l.nodeName.toLowerCase()===h?l:false}}}else{m=0;for(q=g.length;m<q;m++)if(p=g[m])g[m]=
+l?p.parentNode:p.parentNode===h;l&&k.filter(h,g,true)}},"":function(g,h,l){var m=e++,q=d;if(typeof h==="string"&&!/\W/.test(h)){var p=h=h.toLowerCase();q=b}q("parentNode",h,m,g,p,l)},"~":function(g,h,l){var m=e++,q=d;if(typeof h==="string"&&!/\W/.test(h)){var p=h=h.toLowerCase();q=b}q("previousSibling",h,m,g,p,l)}},find:{ID:function(g,h,l){if(typeof h.getElementById!=="undefined"&&!l)return(g=h.getElementById(g[1]))?[g]:[]},NAME:function(g,h){if(typeof h.getElementsByName!=="undefined"){var l=[];
+h=h.getElementsByName(g[1]);for(var m=0,q=h.length;m<q;m++)h[m].getAttribute("name")===g[1]&&l.push(h[m]);return l.length===0?null:l}},TAG:function(g,h){return h.getElementsByTagName(g[1])}},preFilter:{CLASS:function(g,h,l,m,q,p){g=" "+g[1].replace(/\\/g,"")+" ";if(p)return g;p=0;for(var v;(v=h[p])!=null;p++)if(v)if(q^(v.className&&(" "+v.className+" ").replace(/[\t\n]/g," ").indexOf(g)>=0))l||m.push(v);else if(l)h[p]=false;return false},ID:function(g){return g[1].replace(/\\/g,"")},TAG:function(g){return g[1].toLowerCase()},
+CHILD:function(g){if(g[1]==="nth"){var h=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(g[2]==="even"&&"2n"||g[2]==="odd"&&"2n+1"||!/\D/.test(g[2])&&"0n+"+g[2]||g[2]);g[2]=h[1]+(h[2]||1)-0;g[3]=h[3]-0}g[0]=e++;return g},ATTR:function(g,h,l,m,q,p){h=g[1].replace(/\\/g,"");if(!p&&n.attrMap[h])g[1]=n.attrMap[h];if(g[2]==="~=")g[4]=" "+g[4]+" ";return g},PSEUDO:function(g,h,l,m,q){if(g[1]==="not")if((f.exec(g[3])||"").length>1||/^\w/.test(g[3]))g[3]=k(g[3],null,null,h);else{g=k.filter(g[3],h,l,true^q);l||m.push.apply(m,
+g);return false}else if(n.match.POS.test(g[0])||n.match.CHILD.test(g[0]))return true;return g},POS:function(g){g.unshift(true);return g}},filters:{enabled:function(g){return g.disabled===false&&g.type!=="hidden"},disabled:function(g){return g.disabled===true},checked:function(g){return g.checked===true},selected:function(g){return g.selected===true},parent:function(g){return!!g.firstChild},empty:function(g){return!g.firstChild},has:function(g,h,l){return!!k(l[3],g).length},header:function(g){return/h\d/i.test(g.nodeName)},
+text:function(g){return"text"===g.type},radio:function(g){return"radio"===g.type},checkbox:function(g){return"checkbox"===g.type},file:function(g){return"file"===g.type},password:function(g){return"password"===g.type},submit:function(g){return"submit"===g.type},image:function(g){return"image"===g.type},reset:function(g){return"reset"===g.type},button:function(g){return"button"===g.type||g.nodeName.toLowerCase()==="button"},input:function(g){return/input|select|textarea|button/i.test(g.nodeName)}},
+setFilters:{first:function(g,h){return h===0},last:function(g,h,l,m){return h===m.length-1},even:function(g,h){return h%2===0},odd:function(g,h){return h%2===1},lt:function(g,h,l){return h<l[3]-0},gt:function(g,h,l){return h>l[3]-0},nth:function(g,h,l){return l[3]-0===h},eq:function(g,h,l){return l[3]-0===h}},filter:{PSEUDO:function(g,h,l,m){var q=h[1],p=n.filters[q];if(p)return p(g,l,h,m);else if(q==="contains")return(g.textContent||g.innerText||a([g])||"").indexOf(h[3])>=0;else if(q==="not"){h=
+h[3];l=0;for(m=h.length;l<m;l++)if(h[l]===g)return false;return true}else k.error("Syntax error, unrecognized expression: "+q)},CHILD:function(g,h){var l=h[1],m=g;switch(l){case "only":case "first":for(;m=m.previousSibling;)if(m.nodeType===1)return false;if(l==="first")return true;m=g;case "last":for(;m=m.nextSibling;)if(m.nodeType===1)return false;return true;case "nth":l=h[2];var q=h[3];if(l===1&&q===0)return true;h=h[0];var p=g.parentNode;if(p&&(p.sizcache!==h||!g.nodeIndex)){var v=0;for(m=p.firstChild;m;m=
+m.nextSibling)if(m.nodeType===1)m.nodeIndex=++v;p.sizcache=h}g=g.nodeIndex-q;return l===0?g===0:g%l===0&&g/l>=0}},ID:function(g,h){return g.nodeType===1&&g.getAttribute("id")===h},TAG:function(g,h){return h==="*"&&g.nodeType===1||g.nodeName.toLowerCase()===h},CLASS:function(g,h){return(" "+(g.className||g.getAttribute("class"))+" ").indexOf(h)>-1},ATTR:function(g,h){var l=h[1];g=n.attrHandle[l]?n.attrHandle[l](g):g[l]!=null?g[l]:g.getAttribute(l);l=g+"";var m=h[2];h=h[4];return g==null?m==="!=":m===
+"="?l===h:m==="*="?l.indexOf(h)>=0:m==="~="?(" "+l+" ").indexOf(h)>=0:!h?l&&g!==false:m==="!="?l!==h:m==="^="?l.indexOf(h)===0:m==="$="?l.substr(l.length-h.length)===h:m==="|="?l===h||l.substr(0,h.length+1)===h+"-":false},POS:function(g,h,l,m){var q=n.setFilters[h[2]];if(q)return q(g,l,h,m)}}},r=n.match.POS;for(var u in n.match){n.match[u]=new RegExp(n.match[u].source+/(?![^\[]*\])(?![^\(]*\))/.source);n.leftMatch[u]=new RegExp(/(^(?:.|\r|\n)*?)/.source+n.match[u].source.replace(/\\(\d+)/g,function(g,
+h){return"\\"+(h-0+1)}))}var z=function(g,h){g=Array.prototype.slice.call(g,0);if(h){h.push.apply(h,g);return h}return g};try{Array.prototype.slice.call(s.documentElement.childNodes,0)}catch(C){z=function(g,h){h=h||[];if(j.call(g)==="[object Array]")Array.prototype.push.apply(h,g);else if(typeof g.length==="number")for(var l=0,m=g.length;l<m;l++)h.push(g[l]);else for(l=0;g[l];l++)h.push(g[l]);return h}}var B;if(s.documentElement.compareDocumentPosition)B=function(g,h){if(!g.compareDocumentPosition||
+!h.compareDocumentPosition){if(g==h)i=true;return g.compareDocumentPosition?-1:1}g=g.compareDocumentPosition(h)&4?-1:g===h?0:1;if(g===0)i=true;return g};else if("sourceIndex"in s.documentElement)B=function(g,h){if(!g.sourceIndex||!h.sourceIndex){if(g==h)i=true;return g.sourceIndex?-1:1}g=g.sourceIndex-h.sourceIndex;if(g===0)i=true;return g};else if(s.createRange)B=function(g,h){if(!g.ownerDocument||!h.ownerDocument){if(g==h)i=true;return g.ownerDocument?-1:1}var l=g.ownerDocument.createRange(),m=
+h.ownerDocument.createRange();l.setStart(g,0);l.setEnd(g,0);m.setStart(h,0);m.setEnd(h,0);g=l.compareBoundaryPoints(Range.START_TO_END,m);if(g===0)i=true;return g};(function(){var g=s.createElement("div"),h="script"+(new Date).getTime();g.innerHTML="<a name='"+h+"'/>";var l=s.documentElement;l.insertBefore(g,l.firstChild);if(s.getElementById(h)){n.find.ID=function(m,q,p){if(typeof q.getElementById!=="undefined"&&!p)return(q=q.getElementById(m[1]))?q.id===m[1]||typeof q.getAttributeNode!=="undefined"&&
+q.getAttributeNode("id").nodeValue===m[1]?[q]:w:[]};n.filter.ID=function(m,q){var p=typeof m.getAttributeNode!=="undefined"&&m.getAttributeNode("id");return m.nodeType===1&&p&&p.nodeValue===q}}l.removeChild(g);l=g=null})();(function(){var g=s.createElement("div");g.appendChild(s.createComment(""));if(g.getElementsByTagName("*").length>0)n.find.TAG=function(h,l){l=l.getElementsByTagName(h[1]);if(h[1]==="*"){h=[];for(var m=0;l[m];m++)l[m].nodeType===1&&h.push(l[m]);l=h}return l};g.innerHTML="<a href='#'></a>";
+if(g.firstChild&&typeof g.firstChild.getAttribute!=="undefined"&&g.firstChild.getAttribute("href")!=="#")n.attrHandle.href=function(h){return h.getAttribute("href",2)};g=null})();s.querySelectorAll&&function(){var g=k,h=s.createElement("div");h.innerHTML="<p class='TEST'></p>";if(!(h.querySelectorAll&&h.querySelectorAll(".TEST").length===0)){k=function(m,q,p,v){q=q||s;if(!v&&q.nodeType===9&&!x(q))try{return z(q.querySelectorAll(m),p)}catch(t){}return g(m,q,p,v)};for(var l in g)k[l]=g[l];h=null}}();
+(function(){var g=s.createElement("div");g.innerHTML="<div class='test e'></div><div class='test'></div>";if(!(!g.getElementsByClassName||g.getElementsByClassName("e").length===0)){g.lastChild.className="e";if(g.getElementsByClassName("e").length!==1){n.order.splice(1,0,"CLASS");n.find.CLASS=function(h,l,m){if(typeof l.getElementsByClassName!=="undefined"&&!m)return l.getElementsByClassName(h[1])};g=null}}})();var E=s.compareDocumentPosition?function(g,h){return!!(g.compareDocumentPosition(h)&16)}:
+function(g,h){return g!==h&&(g.contains?g.contains(h):true)},x=function(g){return(g=(g?g.ownerDocument||g:0).documentElement)?g.nodeName!=="HTML":false},ga=function(g,h){var l=[],m="",q;for(h=h.nodeType?[h]:h;q=n.match.PSEUDO.exec(g);){m+=q[0];g=g.replace(n.match.PSEUDO,"")}g=n.relative[g]?g+"*":g;q=0;for(var p=h.length;q<p;q++)k(g,h[q],l);return k.filter(m,l)};c.find=k;c.expr=k.selectors;c.expr[":"]=c.expr.filters;c.unique=k.uniqueSort;c.text=a;c.isXMLDoc=x;c.contains=E})();var eb=/Until$/,fb=/^(?:parents|prevUntil|prevAll)/,
+gb=/,/;R=Array.prototype.slice;var Ia=function(a,b,d){if(c.isFunction(b))return c.grep(a,function(e,j){return!!b.call(e,j,e)===d});else if(b.nodeType)return c.grep(a,function(e){return e===b===d});else if(typeof b==="string"){var f=c.grep(a,function(e){return e.nodeType===1});if(Ua.test(b))return c.filter(b,f,!d);else b=c.filter(b,f)}return c.grep(a,function(e){return c.inArray(e,b)>=0===d})};c.fn.extend({find:function(a){for(var b=this.pushStack("","find",a),d=0,f=0,e=this.length;f<e;f++){d=b.length;
+c.find(a,this[f],b);if(f>0)for(var j=d;j<b.length;j++)for(var i=0;i<d;i++)if(b[i]===b[j]){b.splice(j--,1);break}}return b},has:function(a){var b=c(a);return this.filter(function(){for(var d=0,f=b.length;d<f;d++)if(c.contains(this,b[d]))return true})},not:function(a){return this.pushStack(Ia(this,a,false),"not",a)},filter:function(a){return this.pushStack(Ia(this,a,true),"filter",a)},is:function(a){return!!a&&c.filter(a,this).length>0},closest:function(a,b){if(c.isArray(a)){var d=[],f=this[0],e,j=
+{},i;if(f&&a.length){e=0;for(var o=a.length;e<o;e++){i=a[e];j[i]||(j[i]=c.expr.match.POS.test(i)?c(i,b||this.context):i)}for(;f&&f.ownerDocument&&f!==b;){for(i in j){e=j[i];if(e.jquery?e.index(f)>-1:c(f).is(e)){d.push({selector:i,elem:f});delete j[i]}}f=f.parentNode}}return d}var k=c.expr.match.POS.test(a)?c(a,b||this.context):null;return this.map(function(n,r){for(;r&&r.ownerDocument&&r!==b;){if(k?k.index(r)>-1:c(r).is(a))return r;r=r.parentNode}return null})},index:function(a){if(!a||typeof a===
+"string")return c.inArray(this[0],a?c(a):this.parent().children());return c.inArray(a.jquery?a[0]:a,this)},add:function(a,b){a=typeof a==="string"?c(a,b||this.context):c.makeArray(a);b=c.merge(this.get(),a);return this.pushStack(qa(a[0])||qa(b[0])?b:c.unique(b))},andSelf:function(){return this.add(this.prevObject)}});c.each({parent:function(a){return(a=a.parentNode)&&a.nodeType!==11?a:null},parents:function(a){return c.dir(a,"parentNode")},parentsUntil:function(a,b,d){return c.dir(a,"parentNode",
+d)},next:function(a){return c.nth(a,2,"nextSibling")},prev:function(a){return c.nth(a,2,"previousSibling")},nextAll:function(a){return c.dir(a,"nextSibling")},prevAll:function(a){return c.dir(a,"previousSibling")},nextUntil:function(a,b,d){return c.dir(a,"nextSibling",d)},prevUntil:function(a,b,d){return c.dir(a,"previousSibling",d)},siblings:function(a){return c.sibling(a.parentNode.firstChild,a)},children:function(a){return c.sibling(a.firstChild)},contents:function(a){return c.nodeName(a,"iframe")?
+a.contentDocument||a.contentWindow.document:c.makeArray(a.childNodes)}},function(a,b){c.fn[a]=function(d,f){var e=c.map(this,b,d);eb.test(a)||(f=d);if(f&&typeof f==="string")e=c.filter(f,e);e=this.length>1?c.unique(e):e;if((this.length>1||gb.test(f))&&fb.test(a))e=e.reverse();return this.pushStack(e,a,R.call(arguments).join(","))}});c.extend({filter:function(a,b,d){if(d)a=":not("+a+")";return c.find.matches(a,b)},dir:function(a,b,d){var f=[];for(a=a[b];a&&a.nodeType!==9&&(d===w||a.nodeType!==1||!c(a).is(d));){a.nodeType===
+1&&f.push(a);a=a[b]}return f},nth:function(a,b,d){b=b||1;for(var f=0;a;a=a[d])if(a.nodeType===1&&++f===b)break;return a},sibling:function(a,b){for(var d=[];a;a=a.nextSibling)a.nodeType===1&&a!==b&&d.push(a);return d}});var Ja=/ jQuery\d+="(?:\d+|null)"/g,V=/^\s+/,Ka=/(<([\w:]+)[^>]*?)\/>/g,hb=/^(?:area|br|col|embed|hr|img|input|link|meta|param)$/i,La=/<([\w:]+)/,ib=/<tbody/i,jb=/<|&#?\w+;/,ta=/<script|<object|<embed|<option|<style/i,ua=/checked\s*(?:[^=]|=\s*.checked.)/i,Ma=function(a,b,d){return hb.test(d)?
+a:b+"></"+d+">"},F={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],area:[1,"<map>","</map>"],_default:[0,"",""]};F.optgroup=F.option;F.tbody=F.tfoot=F.colgroup=F.caption=F.thead;F.th=F.td;if(!c.support.htmlSerialize)F._default=[1,"div<div>","</div>"];c.fn.extend({text:function(a){if(c.isFunction(a))return this.each(function(b){var d=
+c(this);d.text(a.call(this,b,d.text()))});if(typeof a!=="object"&&a!==w)return this.empty().append((this[0]&&this[0].ownerDocument||s).createTextNode(a));return c.text(this)},wrapAll:function(a){if(c.isFunction(a))return this.each(function(d){c(this).wrapAll(a.call(this,d))});if(this[0]){var b=c(a,this[0].ownerDocument).eq(0).clone(true);this[0].parentNode&&b.insertBefore(this[0]);b.map(function(){for(var d=this;d.firstChild&&d.firstChild.nodeType===1;)d=d.firstChild;return d}).append(this)}return this},
+wrapInner:function(a){if(c.isFunction(a))return this.each(function(b){c(this).wrapInner(a.call(this,b))});return this.each(function(){var b=c(this),d=b.contents();d.length?d.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){c(this).wrapAll(a)})},unwrap:function(){return this.parent().each(function(){c.nodeName(this,"body")||c(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.appendChild(a)})},
+prepend:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b,this)});else if(arguments.length){var a=c(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b,
+this.nextSibling)});else if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,c(arguments[0]).toArray());return a}},remove:function(a,b){for(var d=0,f;(f=this[d])!=null;d++)if(!a||c.filter(a,[f]).length){if(!b&&f.nodeType===1){c.cleanData(f.getElementsByTagName("*"));c.cleanData([f])}f.parentNode&&f.parentNode.removeChild(f)}return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++)for(b.nodeType===1&&c.cleanData(b.getElementsByTagName("*"));b.firstChild;)b.removeChild(b.firstChild);
+return this},clone:function(a){var b=this.map(function(){if(!c.support.noCloneEvent&&!c.isXMLDoc(this)){var d=this.outerHTML,f=this.ownerDocument;if(!d){d=f.createElement("div");d.appendChild(this.cloneNode(true));d=d.innerHTML}return c.clean([d.replace(Ja,"").replace(/=([^="'>\s]+\/)>/g,'="$1">').replace(V,"")],f)[0]}else return this.cloneNode(true)});if(a===true){ra(this,b);ra(this.find("*"),b.find("*"))}return b},html:function(a){if(a===w)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(Ja,
+""):null;else if(typeof a==="string"&&!ta.test(a)&&(c.support.leadingWhitespace||!V.test(a))&&!F[(La.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Ka,Ma);try{for(var b=0,d=this.length;b<d;b++)if(this[b].nodeType===1){c.cleanData(this[b].getElementsByTagName("*"));this[b].innerHTML=a}}catch(f){this.empty().append(a)}}else c.isFunction(a)?this.each(function(e){var j=c(this),i=j.html();j.empty().append(function(){return a.call(this,e,i)})}):this.empty().append(a);return this},replaceWith:function(a){if(this[0]&&
+this[0].parentNode){if(c.isFunction(a))return this.each(function(b){var d=c(this),f=d.html();d.replaceWith(a.call(this,b,f))});if(typeof a!=="string")a=c(a).detach();return this.each(function(){var b=this.nextSibling,d=this.parentNode;c(this).remove();b?c(b).before(a):c(d).append(a)})}else return this.pushStack(c(c.isFunction(a)?a():a),"replaceWith",a)},detach:function(a){return this.remove(a,true)},domManip:function(a,b,d){function f(u){return c.nodeName(u,"table")?u.getElementsByTagName("tbody")[0]||
+u.appendChild(u.ownerDocument.createElement("tbody")):u}var e,j,i=a[0],o=[],k;if(!c.support.checkClone&&arguments.length===3&&typeof i==="string"&&ua.test(i))return this.each(function(){c(this).domManip(a,b,d,true)});if(c.isFunction(i))return this.each(function(u){var z=c(this);a[0]=i.call(this,u,b?z.html():w);z.domManip(a,b,d)});if(this[0]){e=i&&i.parentNode;e=c.support.parentNode&&e&&e.nodeType===11&&e.childNodes.length===this.length?{fragment:e}:sa(a,this,o);k=e.fragment;if(j=k.childNodes.length===
+1?(k=k.firstChild):k.firstChild){b=b&&c.nodeName(j,"tr");for(var n=0,r=this.length;n<r;n++)d.call(b?f(this[n],j):this[n],n>0||e.cacheable||this.length>1?k.cloneNode(true):k)}o.length&&c.each(o,Qa)}return this}});c.fragments={};c.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){c.fn[a]=function(d){var f=[];d=c(d);var e=this.length===1&&this[0].parentNode;if(e&&e.nodeType===11&&e.childNodes.length===1&&d.length===1){d[b](this[0]);
+return this}else{e=0;for(var j=d.length;e<j;e++){var i=(e>0?this.clone(true):this).get();c.fn[b].apply(c(d[e]),i);f=f.concat(i)}return this.pushStack(f,a,d.selector)}}});c.extend({clean:function(a,b,d,f){b=b||s;if(typeof b.createElement==="undefined")b=b.ownerDocument||b[0]&&b[0].ownerDocument||s;for(var e=[],j=0,i;(i=a[j])!=null;j++){if(typeof i==="number")i+="";if(i){if(typeof i==="string"&&!jb.test(i))i=b.createTextNode(i);else if(typeof i==="string"){i=i.replace(Ka,Ma);var o=(La.exec(i)||["",
+""])[1].toLowerCase(),k=F[o]||F._default,n=k[0],r=b.createElement("div");for(r.innerHTML=k[1]+i+k[2];n--;)r=r.lastChild;if(!c.support.tbody){n=ib.test(i);o=o==="table"&&!n?r.firstChild&&r.firstChild.childNodes:k[1]==="<table>"&&!n?r.childNodes:[];for(k=o.length-1;k>=0;--k)c.nodeName(o[k],"tbody")&&!o[k].childNodes.length&&o[k].parentNode.removeChild(o[k])}!c.support.leadingWhitespace&&V.test(i)&&r.insertBefore(b.createTextNode(V.exec(i)[0]),r.firstChild);i=r.childNodes}if(i.nodeType)e.push(i);else e=
+c.merge(e,i)}}if(d)for(j=0;e[j];j++)if(f&&c.nodeName(e[j],"script")&&(!e[j].type||e[j].type.toLowerCase()==="text/javascript"))f.push(e[j].parentNode?e[j].parentNode.removeChild(e[j]):e[j]);else{e[j].nodeType===1&&e.splice.apply(e,[j+1,0].concat(c.makeArray(e[j].getElementsByTagName("script"))));d.appendChild(e[j])}return e},cleanData:function(a){for(var b,d,f=c.cache,e=c.event.special,j=c.support.deleteExpando,i=0,o;(o=a[i])!=null;i++)if(d=o[c.expando]){b=f[d];if(b.events)for(var k in b.events)e[k]?
+c.event.remove(o,k):Ca(o,k,b.handle);if(j)delete o[c.expando];else o.removeAttribute&&o.removeAttribute(c.expando);delete f[d]}}});var kb=/z-?index|font-?weight|opacity|zoom|line-?height/i,Na=/alpha\([^)]*\)/,Oa=/opacity=([^)]*)/,ha=/float/i,ia=/-([a-z])/ig,lb=/([A-Z])/g,mb=/^-?\d+(?:px)?$/i,nb=/^-?\d/,ob={position:"absolute",visibility:"hidden",display:"block"},pb=["Left","Right"],qb=["Top","Bottom"],rb=s.defaultView&&s.defaultView.getComputedStyle,Pa=c.support.cssFloat?"cssFloat":"styleFloat",ja=
+function(a,b){return b.toUpperCase()};c.fn.css=function(a,b){return X(this,a,b,true,function(d,f,e){if(e===w)return c.curCSS(d,f);if(typeof e==="number"&&!kb.test(f))e+="px";c.style(d,f,e)})};c.extend({style:function(a,b,d){if(!a||a.nodeType===3||a.nodeType===8)return w;if((b==="width"||b==="height")&&parseFloat(d)<0)d=w;var f=a.style||a,e=d!==w;if(!c.support.opacity&&b==="opacity"){if(e){f.zoom=1;b=parseInt(d,10)+""==="NaN"?"":"alpha(opacity="+d*100+")";a=f.filter||c.curCSS(a,"filter")||"";f.filter=
+Na.test(a)?a.replace(Na,b):b}return f.filter&&f.filter.indexOf("opacity=")>=0?parseFloat(Oa.exec(f.filter)[1])/100+"":""}if(ha.test(b))b=Pa;b=b.replace(ia,ja);if(e)f[b]=d;return f[b]},css:function(a,b,d,f){if(b==="width"||b==="height"){var e,j=b==="width"?pb:qb;function i(){e=b==="width"?a.offsetWidth:a.offsetHeight;f!=="border"&&c.each(j,function(){f||(e-=parseFloat(c.curCSS(a,"padding"+this,true))||0);if(f==="margin")e+=parseFloat(c.curCSS(a,"margin"+this,true))||0;else e-=parseFloat(c.curCSS(a,
+"border"+this+"Width",true))||0})}a.offsetWidth!==0?i():c.swap(a,ob,i);return Math.max(0,Math.round(e))}return c.curCSS(a,b,d)},curCSS:function(a,b,d){var f,e=a.style;if(!c.support.opacity&&b==="opacity"&&a.currentStyle){f=Oa.test(a.currentStyle.filter||"")?parseFloat(RegExp.$1)/100+"":"";return f===""?"1":f}if(ha.test(b))b=Pa;if(!d&&e&&e[b])f=e[b];else if(rb){if(ha.test(b))b="float";b=b.replace(lb,"-$1").toLowerCase();e=a.ownerDocument.defaultView;if(!e)return null;if(a=e.getComputedStyle(a,null))f=
+a.getPropertyValue(b);if(b==="opacity"&&f==="")f="1"}else if(a.currentStyle){d=b.replace(ia,ja);f=a.currentStyle[b]||a.currentStyle[d];if(!mb.test(f)&&nb.test(f)){b=e.left;var j=a.runtimeStyle.left;a.runtimeStyle.left=a.currentStyle.left;e.left=d==="fontSize"?"1em":f||0;f=e.pixelLeft+"px";e.left=b;a.runtimeStyle.left=j}}return f},swap:function(a,b,d){var f={};for(var e in b){f[e]=a.style[e];a.style[e]=b[e]}d.call(a);for(e in b)a.style[e]=f[e]}});if(c.expr&&c.expr.filters){c.expr.filters.hidden=function(a){var b=
+a.offsetWidth,d=a.offsetHeight,f=a.nodeName.toLowerCase()==="tr";return b===0&&d===0&&!f?true:b>0&&d>0&&!f?false:c.curCSS(a,"display")==="none"};c.expr.filters.visible=function(a){return!c.expr.filters.hidden(a)}}var sb=J(),tb=/<script(.|\s)*?\/script>/gi,ub=/select|textarea/i,vb=/color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week/i,N=/=\?(&|$)/,ka=/\?/,wb=/(\?|&)_=.*?(&|$)/,xb=/^(\w+:)?\/\/([^\/?#]+)/,yb=/%20/g,zb=c.fn.load;c.fn.extend({load:function(a,b,d){if(typeof a!==
+"string")return zb.call(this,a);else if(!this.length)return this;var f=a.indexOf(" ");if(f>=0){var e=a.slice(f,a.length);a=a.slice(0,f)}f="GET";if(b)if(c.isFunction(b)){d=b;b=null}else if(typeof b==="object"){b=c.param(b,c.ajaxSettings.traditional);f="POST"}var j=this;c.ajax({url:a,type:f,dataType:"html",data:b,complete:function(i,o){if(o==="success"||o==="notmodified")j.html(e?c("<div />").append(i.responseText.replace(tb,"")).find(e):i.responseText);d&&j.each(d,[i.responseText,o,i])}});return this},
+serialize:function(){return c.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?c.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||ub.test(this.nodeName)||vb.test(this.type))}).map(function(a,b){a=c(this).val();return a==null?null:c.isArray(a)?c.map(a,function(d){return{name:b.name,value:d}}):{name:b.name,value:a}}).get()}});c.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),
+function(a,b){c.fn[b]=function(d){return this.bind(b,d)}});c.extend({get:function(a,b,d,f){if(c.isFunction(b)){f=f||d;d=b;b=null}return c.ajax({type:"GET",url:a,data:b,success:d,dataType:f})},getScript:function(a,b){return c.get(a,null,b,"script")},getJSON:function(a,b,d){return c.get(a,b,d,"json")},post:function(a,b,d,f){if(c.isFunction(b)){f=f||d;d=b;b={}}return c.ajax({type:"POST",url:a,data:b,success:d,dataType:f})},ajaxSetup:function(a){c.extend(c.ajaxSettings,a)},ajaxSettings:{url:location.href,
+global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,xhr:A.XMLHttpRequest&&(A.location.protocol!=="file:"||!A.ActiveXObject)?function(){return new A.XMLHttpRequest}:function(){try{return new A.ActiveXObject("Microsoft.XMLHTTP")}catch(a){}},accepts:{xml:"application/xml, text/xml",html:"text/html",script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},lastModified:{},etag:{},ajax:function(a){function b(){e.success&&
+e.success.call(k,o,i,x);e.global&&f("ajaxSuccess",[x,e])}function d(){e.complete&&e.complete.call(k,x,i);e.global&&f("ajaxComplete",[x,e]);e.global&&!--c.active&&c.event.trigger("ajaxStop")}function f(q,p){(e.context?c(e.context):c.event).trigger(q,p)}var e=c.extend(true,{},c.ajaxSettings,a),j,i,o,k=a&&a.context||e,n=e.type.toUpperCase();if(e.data&&e.processData&&typeof e.data!=="string")e.data=c.param(e.data,e.traditional);if(e.dataType==="jsonp"){if(n==="GET")N.test(e.url)||(e.url+=(ka.test(e.url)?
+"&":"?")+(e.jsonp||"callback")+"=?");else if(!e.data||!N.test(e.data))e.data=(e.data?e.data+"&":"")+(e.jsonp||"callback")+"=?";e.dataType="json"}if(e.dataType==="json"&&(e.data&&N.test(e.data)||N.test(e.url))){j=e.jsonpCallback||"jsonp"+sb++;if(e.data)e.data=(e.data+"").replace(N,"="+j+"$1");e.url=e.url.replace(N,"="+j+"$1");e.dataType="script";A[j]=A[j]||function(q){o=q;b();d();A[j]=w;try{delete A[j]}catch(p){}z&&z.removeChild(C)}}if(e.dataType==="script"&&e.cache===null)e.cache=false;if(e.cache===
+false&&n==="GET"){var r=J(),u=e.url.replace(wb,"$1_="+r+"$2");e.url=u+(u===e.url?(ka.test(e.url)?"&":"?")+"_="+r:"")}if(e.data&&n==="GET")e.url+=(ka.test(e.url)?"&":"?")+e.data;e.global&&!c.active++&&c.event.trigger("ajaxStart");r=(r=xb.exec(e.url))&&(r[1]&&r[1]!==location.protocol||r[2]!==location.host);if(e.dataType==="script"&&n==="GET"&&r){var z=s.getElementsByTagName("head")[0]||s.documentElement,C=s.createElement("script");C.src=e.url;if(e.scriptCharset)C.charset=e.scriptCharset;if(!j){var B=
+false;C.onload=C.onreadystatechange=function(){if(!B&&(!this.readyState||this.readyState==="loaded"||this.readyState==="complete")){B=true;b();d();C.onload=C.onreadystatechange=null;z&&C.parentNode&&z.removeChild(C)}}}z.insertBefore(C,z.firstChild);return w}var E=false,x=e.xhr();if(x){e.username?x.open(n,e.url,e.async,e.username,e.password):x.open(n,e.url,e.async);try{if(e.data||a&&a.contentType)x.setRequestHeader("Content-Type",e.contentType);if(e.ifModified){c.lastModified[e.url]&&x.setRequestHeader("If-Modified-Since",
+c.lastModified[e.url]);c.etag[e.url]&&x.setRequestHeader("If-None-Match",c.etag[e.url])}r||x.setRequestHeader("X-Requested-With","XMLHttpRequest");x.setRequestHeader("Accept",e.dataType&&e.accepts[e.dataType]?e.accepts[e.dataType]+", */*":e.accepts._default)}catch(ga){}if(e.beforeSend&&e.beforeSend.call(k,x,e)===false){e.global&&!--c.active&&c.event.trigger("ajaxStop");x.abort();return false}e.global&&f("ajaxSend",[x,e]);var g=x.onreadystatechange=function(q){if(!x||x.readyState===0||q==="abort"){E||
+d();E=true;if(x)x.onreadystatechange=c.noop}else if(!E&&x&&(x.readyState===4||q==="timeout")){E=true;x.onreadystatechange=c.noop;i=q==="timeout"?"timeout":!c.httpSuccess(x)?"error":e.ifModified&&c.httpNotModified(x,e.url)?"notmodified":"success";var p;if(i==="success")try{o=c.httpData(x,e.dataType,e)}catch(v){i="parsererror";p=v}if(i==="success"||i==="notmodified")j||b();else c.handleError(e,x,i,p);d();q==="timeout"&&x.abort();if(e.async)x=null}};try{var h=x.abort;x.abort=function(){x&&h.call(x);
+g("abort")}}catch(l){}e.async&&e.timeout>0&&setTimeout(function(){x&&!E&&g("timeout")},e.timeout);try{x.send(n==="POST"||n==="PUT"||n==="DELETE"?e.data:null)}catch(m){c.handleError(e,x,null,m);d()}e.async||g();return x}},handleError:function(a,b,d,f){if(a.error)a.error.call(a.context||a,b,d,f);if(a.global)(a.context?c(a.context):c.event).trigger("ajaxError",[b,a,f])},active:0,httpSuccess:function(a){try{return!a.status&&location.protocol==="file:"||a.status>=200&&a.status<300||a.status===304||a.status===
+1223||a.status===0}catch(b){}return false},httpNotModified:function(a,b){var d=a.getResponseHeader("Last-Modified"),f=a.getResponseHeader("Etag");if(d)c.lastModified[b]=d;if(f)c.etag[b]=f;return a.status===304||a.status===0},httpData:function(a,b,d){var f=a.getResponseHeader("content-type")||"",e=b==="xml"||!b&&f.indexOf("xml")>=0;a=e?a.responseXML:a.responseText;e&&a.documentElement.nodeName==="parsererror"&&c.error("parsererror");if(d&&d.dataFilter)a=d.dataFilter(a,b);if(typeof a==="string")if(b===
+"json"||!b&&f.indexOf("json")>=0)a=c.parseJSON(a);else if(b==="script"||!b&&f.indexOf("javascript")>=0)c.globalEval(a);return a},param:function(a,b){function d(i,o){if(c.isArray(o))c.each(o,function(k,n){b||/\[\]$/.test(i)?f(i,n):d(i+"["+(typeof n==="object"||c.isArray(n)?k:"")+"]",n)});else!b&&o!=null&&typeof o==="object"?c.each(o,function(k,n){d(i+"["+k+"]",n)}):f(i,o)}function f(i,o){o=c.isFunction(o)?o():o;e[e.length]=encodeURIComponent(i)+"="+encodeURIComponent(o)}var e=[];if(b===w)b=c.ajaxSettings.traditional;
+if(c.isArray(a)||a.jquery)c.each(a,function(){f(this.name,this.value)});else for(var j in a)d(j,a[j]);return e.join("&").replace(yb,"+")}});var la={},Ab=/toggle|show|hide/,Bb=/^([+-]=)?([\d+-.]+)(.*)$/,W,va=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];c.fn.extend({show:function(a,b){if(a||a===0)return this.animate(K("show",3),a,b);else{a=0;for(b=this.length;a<b;a++){var d=c.data(this[a],"olddisplay");
+this[a].style.display=d||"";if(c.css(this[a],"display")==="none"){d=this[a].nodeName;var f;if(la[d])f=la[d];else{var e=c("<"+d+" />").appendTo("body");f=e.css("display");if(f==="none")f="block";e.remove();la[d]=f}c.data(this[a],"olddisplay",f)}}a=0;for(b=this.length;a<b;a++)this[a].style.display=c.data(this[a],"olddisplay")||"";return this}},hide:function(a,b){if(a||a===0)return this.animate(K("hide",3),a,b);else{a=0;for(b=this.length;a<b;a++){var d=c.data(this[a],"olddisplay");!d&&d!=="none"&&c.data(this[a],
+"olddisplay",c.css(this[a],"display"))}a=0;for(b=this.length;a<b;a++)this[a].style.display="none";return this}},_toggle:c.fn.toggle,toggle:function(a,b){var d=typeof a==="boolean";if(c.isFunction(a)&&c.isFunction(b))this._toggle.apply(this,arguments);else a==null||d?this.each(function(){var f=d?a:c(this).is(":hidden");c(this)[f?"show":"hide"]()}):this.animate(K("toggle",3),a,b);return this},fadeTo:function(a,b,d){return this.filter(":hidden").css("opacity",0).show().end().animate({opacity:b},a,d)},
+animate:function(a,b,d,f){var e=c.speed(b,d,f);if(c.isEmptyObject(a))return this.each(e.complete);return this[e.queue===false?"each":"queue"](function(){var j=c.extend({},e),i,o=this.nodeType===1&&c(this).is(":hidden"),k=this;for(i in a){var n=i.replace(ia,ja);if(i!==n){a[n]=a[i];delete a[i];i=n}if(a[i]==="hide"&&o||a[i]==="show"&&!o)return j.complete.call(this);if((i==="height"||i==="width")&&this.style){j.display=c.css(this,"display");j.overflow=this.style.overflow}if(c.isArray(a[i])){(j.specialEasing=
+j.specialEasing||{})[i]=a[i][1];a[i]=a[i][0]}}if(j.overflow!=null)this.style.overflow="hidden";j.curAnim=c.extend({},a);c.each(a,function(r,u){var z=new c.fx(k,j,r);if(Ab.test(u))z[u==="toggle"?o?"show":"hide":u](a);else{var C=Bb.exec(u),B=z.cur(true)||0;if(C){u=parseFloat(C[2]);var E=C[3]||"px";if(E!=="px"){k.style[r]=(u||1)+E;B=(u||1)/z.cur(true)*B;k.style[r]=B+E}if(C[1])u=(C[1]==="-="?-1:1)*u+B;z.custom(B,u,E)}else z.custom(B,u,"")}});return true})},stop:function(a,b){var d=c.timers;a&&this.queue([]);
+this.each(function(){for(var f=d.length-1;f>=0;f--)if(d[f].elem===this){b&&d[f](true);d.splice(f,1)}});b||this.dequeue();return this}});c.each({slideDown:K("show",1),slideUp:K("hide",1),slideToggle:K("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"}},function(a,b){c.fn[a]=function(d,f){return this.animate(b,d,f)}});c.extend({speed:function(a,b,d){var f=a&&typeof a==="object"?a:{complete:d||!d&&b||c.isFunction(a)&&a,duration:a,easing:d&&b||b&&!c.isFunction(b)&&b};f.duration=c.fx.off?0:typeof f.duration===
+"number"?f.duration:c.fx.speeds[f.duration]||c.fx.speeds._default;f.old=f.complete;f.complete=function(){f.queue!==false&&c(this).dequeue();c.isFunction(f.old)&&f.old.call(this)};return f},easing:{linear:function(a,b,d,f){return d+f*a},swing:function(a,b,d,f){return(-Math.cos(a*Math.PI)/2+0.5)*f+d}},timers:[],fx:function(a,b,d){this.options=b;this.elem=a;this.prop=d;if(!b.orig)b.orig={}}});c.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this);(c.fx.step[this.prop]||
+c.fx.step._default)(this);if((this.prop==="height"||this.prop==="width")&&this.elem.style)this.elem.style.display="block"},cur:function(a){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null))return this.elem[this.prop];return(a=parseFloat(c.css(this.elem,this.prop,a)))&&a>-10000?a:parseFloat(c.curCSS(this.elem,this.prop))||0},custom:function(a,b,d){function f(j){return e.step(j)}this.startTime=J();this.start=a;this.end=b;this.unit=d||this.unit||"px";this.now=this.start;
+this.pos=this.state=0;var e=this;f.elem=this.elem;if(f()&&c.timers.push(f)&&!W)W=setInterval(c.fx.tick,13)},show:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.show=true;this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur());c(this.elem).show()},hide:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.hide=true;this.custom(this.cur(),0)},step:function(a){var b=J(),d=true;if(a||b>=this.options.duration+this.startTime){this.now=
+this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;for(var f in this.options.curAnim)if(this.options.curAnim[f]!==true)d=false;if(d){if(this.options.display!=null){this.elem.style.overflow=this.options.overflow;a=c.data(this.elem,"olddisplay");this.elem.style.display=a?a:this.options.display;if(c.css(this.elem,"display")==="none")this.elem.style.display="block"}this.options.hide&&c(this.elem).hide();if(this.options.hide||this.options.show)for(var e in this.options.curAnim)c.style(this.elem,
+e,this.options.orig[e]);this.options.complete.call(this.elem)}return false}else{e=b-this.startTime;this.state=e/this.options.duration;a=this.options.easing||(c.easing.swing?"swing":"linear");this.pos=c.easing[this.options.specialEasing&&this.options.specialEasing[this.prop]||a](this.state,e,0,1,this.options.duration);this.now=this.start+(this.end-this.start)*this.pos;this.update()}return true}};c.extend(c.fx,{tick:function(){for(var a=c.timers,b=0;b<a.length;b++)a[b]()||a.splice(b--,1);a.length||
+c.fx.stop()},stop:function(){clearInterval(W);W=null},speeds:{slow:600,fast:200,_default:400},step:{opacity:function(a){c.style(a.elem,"opacity",a.now)},_default:function(a){if(a.elem.style&&a.elem.style[a.prop]!=null)a.elem.style[a.prop]=(a.prop==="width"||a.prop==="height"?Math.max(0,a.now):a.now)+a.unit;else a.elem[a.prop]=a.now}}});if(c.expr&&c.expr.filters)c.expr.filters.animated=function(a){return c.grep(c.timers,function(b){return a===b.elem}).length};c.fn.offset="getBoundingClientRect"in s.documentElement?
+function(a){var b=this[0];if(a)return this.each(function(e){c.offset.setOffset(this,a,e)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return c.offset.bodyOffset(b);var d=b.getBoundingClientRect(),f=b.ownerDocument;b=f.body;f=f.documentElement;return{top:d.top+(self.pageYOffset||c.support.boxModel&&f.scrollTop||b.scrollTop)-(f.clientTop||b.clientTop||0),left:d.left+(self.pageXOffset||c.support.boxModel&&f.scrollLeft||b.scrollLeft)-(f.clientLeft||b.clientLeft||0)}}:function(a){var b=
+this[0];if(a)return this.each(function(r){c.offset.setOffset(this,a,r)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return c.offset.bodyOffset(b);c.offset.initialize();var d=b.offsetParent,f=b,e=b.ownerDocument,j,i=e.documentElement,o=e.body;f=(e=e.defaultView)?e.getComputedStyle(b,null):b.currentStyle;for(var k=b.offsetTop,n=b.offsetLeft;(b=b.parentNode)&&b!==o&&b!==i;){if(c.offset.supportsFixedPosition&&f.position==="fixed")break;j=e?e.getComputedStyle(b,null):b.currentStyle;
+k-=b.scrollTop;n-=b.scrollLeft;if(b===d){k+=b.offsetTop;n+=b.offsetLeft;if(c.offset.doesNotAddBorder&&!(c.offset.doesAddBorderForTableAndCells&&/^t(able|d|h)$/i.test(b.nodeName))){k+=parseFloat(j.borderTopWidth)||0;n+=parseFloat(j.borderLeftWidth)||0}f=d;d=b.offsetParent}if(c.offset.subtractsBorderForOverflowNotVisible&&j.overflow!=="visible"){k+=parseFloat(j.borderTopWidth)||0;n+=parseFloat(j.borderLeftWidth)||0}f=j}if(f.position==="relative"||f.position==="static"){k+=o.offsetTop;n+=o.offsetLeft}if(c.offset.supportsFixedPosition&&
+f.position==="fixed"){k+=Math.max(i.scrollTop,o.scrollTop);n+=Math.max(i.scrollLeft,o.scrollLeft)}return{top:k,left:n}};c.offset={initialize:function(){var a=s.body,b=s.createElement("div"),d,f,e,j=parseFloat(c.curCSS(a,"marginTop",true))||0;c.extend(b.style,{position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"});b.innerHTML="<div style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;'><div></div></div><table style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;' cellpadding='0' cellspacing='0'><tr><td></td></tr></table>";
+a.insertBefore(b,a.firstChild);d=b.firstChild;f=d.firstChild;e=d.nextSibling.firstChild.firstChild;this.doesNotAddBorder=f.offsetTop!==5;this.doesAddBorderForTableAndCells=e.offsetTop===5;f.style.position="fixed";f.style.top="20px";this.supportsFixedPosition=f.offsetTop===20||f.offsetTop===15;f.style.position=f.style.top="";d.style.overflow="hidden";d.style.position="relative";this.subtractsBorderForOverflowNotVisible=f.offsetTop===-5;this.doesNotIncludeMarginInBodyOffset=a.offsetTop!==j;a.removeChild(b);
+c.offset.initialize=c.noop},bodyOffset:function(a){var b=a.offsetTop,d=a.offsetLeft;c.offset.initialize();if(c.offset.doesNotIncludeMarginInBodyOffset){b+=parseFloat(c.curCSS(a,"marginTop",true))||0;d+=parseFloat(c.curCSS(a,"marginLeft",true))||0}return{top:b,left:d}},setOffset:function(a,b,d){if(/static/.test(c.curCSS(a,"position")))a.style.position="relative";var f=c(a),e=f.offset(),j=parseInt(c.curCSS(a,"top",true),10)||0,i=parseInt(c.curCSS(a,"left",true),10)||0;if(c.isFunction(b))b=b.call(a,
+d,e);d={top:b.top-e.top+j,left:b.left-e.left+i};"using"in b?b.using.call(a,d):f.css(d)}};c.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),d=this.offset(),f=/^body|html$/i.test(b[0].nodeName)?{top:0,left:0}:b.offset();d.top-=parseFloat(c.curCSS(a,"marginTop",true))||0;d.left-=parseFloat(c.curCSS(a,"marginLeft",true))||0;f.top+=parseFloat(c.curCSS(b[0],"borderTopWidth",true))||0;f.left+=parseFloat(c.curCSS(b[0],"borderLeftWidth",true))||0;return{top:d.top-
+f.top,left:d.left-f.left}},offsetParent:function(){return this.map(function(){for(var a=this.offsetParent||s.body;a&&!/^body|html$/i.test(a.nodeName)&&c.css(a,"position")==="static";)a=a.offsetParent;return a})}});c.each(["Left","Top"],function(a,b){var d="scroll"+b;c.fn[d]=function(f){var e=this[0],j;if(!e)return null;if(f!==w)return this.each(function(){if(j=wa(this))j.scrollTo(!a?f:c(j).scrollLeft(),a?f:c(j).scrollTop());else this[d]=f});else return(j=wa(e))?"pageXOffset"in j?j[a?"pageYOffset":
+"pageXOffset"]:c.support.boxModel&&j.document.documentElement[d]||j.document.body[d]:e[d]}});c.each(["Height","Width"],function(a,b){var d=b.toLowerCase();c.fn["inner"+b]=function(){return this[0]?c.css(this[0],d,false,"padding"):null};c.fn["outer"+b]=function(f){return this[0]?c.css(this[0],d,false,f?"margin":"border"):null};c.fn[d]=function(f){var e=this[0];if(!e)return f==null?null:this;if(c.isFunction(f))return this.each(function(j){var i=c(this);i[d](f.call(this,j,i[d]()))});return"scrollTo"in
+e&&e.document?e.document.compatMode==="CSS1Compat"&&e.document.documentElement["client"+b]||e.document.body["client"+b]:e.nodeType===9?Math.max(e.documentElement["client"+b],e.body["scroll"+b],e.documentElement["scroll"+b],e.body["offset"+b],e.documentElement["offset"+b]):f===w?c.css(e,d):this.css(d,typeof f==="string"?f:f+"px")}});A.jQuery=A.$=c})(window);
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/template/common/jquery/jquery-ui-1.8.2.custom.min.js b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/template/common/jquery/jquery-ui-1.8.2.custom.min.js
new file mode 100644
index 0000000..fec53e8
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/template/common/jquery/jquery-ui-1.8.2.custom.min.js
@@ -0,0 +1,321 @@
+/*!
+ * jQuery UI 1.8.2
+ *
+ * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT (MIT-LICENSE.txt)
+ * and GPL (GPL-LICENSE.txt) licenses.
+ *
+ * http://docs.jquery.com/UI
+ */
+(function(c){c.ui=c.ui||{};if(!c.ui.version){c.extend(c.ui,{version:"1.8.2",plugin:{add:function(a,b,d){a=c.ui[a].prototype;for(var e in d){a.plugins[e]=a.plugins[e]||[];a.plugins[e].push([b,d[e]])}},call:function(a,b,d){if((b=a.plugins[b])&&a.element[0].parentNode)for(var e=0;e<b.length;e++)a.options[b[e][0]]&&b[e][1].apply(a.element,d)}},contains:function(a,b){return document.compareDocumentPosition?a.compareDocumentPosition(b)&16:a!==b&&a.contains(b)},hasScroll:function(a,b){if(c(a).css("overflow")==
+"hidden")return false;b=b&&b=="left"?"scrollLeft":"scrollTop";var d=false;if(a[b]>0)return true;a[b]=1;d=a[b]>0;a[b]=0;return d},isOverAxis:function(a,b,d){return a>b&&a<b+d},isOver:function(a,b,d,e,f,g){return c.ui.isOverAxis(a,d,f)&&c.ui.isOverAxis(b,e,g)},keyCode:{ALT:18,BACKSPACE:8,CAPS_LOCK:20,COMMA:188,COMMAND:91,COMMAND_LEFT:91,COMMAND_RIGHT:93,CONTROL:17,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,INSERT:45,LEFT:37,MENU:93,NUMPAD_ADD:107,NUMPAD_DECIMAL:110,NUMPAD_DIVIDE:111,NUMPAD_ENTER:108,
+NUMPAD_MULTIPLY:106,NUMPAD_SUBTRACT:109,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SHIFT:16,SPACE:32,TAB:9,UP:38,WINDOWS:91}});c.fn.extend({_focus:c.fn.focus,focus:function(a,b){return typeof a==="number"?this.each(function(){var d=this;setTimeout(function(){c(d).focus();b&&b.call(d)},a)}):this._focus.apply(this,arguments)},enableSelection:function(){return this.attr("unselectable","off").css("MozUserSelect","")},disableSelection:function(){return this.attr("unselectable","on").css("MozUserSelect",
+"none")},scrollParent:function(){var a;a=c.browser.msie&&/(static|relative)/.test(this.css("position"))||/absolute/.test(this.css("position"))?this.parents().filter(function(){return/(relative|absolute|fixed)/.test(c.curCSS(this,"position",1))&&/(auto|scroll)/.test(c.curCSS(this,"overflow",1)+c.curCSS(this,"overflow-y",1)+c.curCSS(this,"overflow-x",1))}).eq(0):this.parents().filter(function(){return/(auto|scroll)/.test(c.curCSS(this,"overflow",1)+c.curCSS(this,"overflow-y",1)+c.curCSS(this,"overflow-x",
+1))}).eq(0);return/fixed/.test(this.css("position"))||!a.length?c(document):a},zIndex:function(a){if(a!==undefined)return this.css("zIndex",a);if(this.length){a=c(this[0]);for(var b;a.length&&a[0]!==document;){b=a.css("position");if(b=="absolute"||b=="relative"||b=="fixed"){b=parseInt(a.css("zIndex"));if(!isNaN(b)&&b!=0)return b}a=a.parent()}}return 0}});c.extend(c.expr[":"],{data:function(a,b,d){return!!c.data(a,d[3])},focusable:function(a){var b=a.nodeName.toLowerCase(),d=c.attr(a,"tabindex");return(/input|select|textarea|button|object/.test(b)?
+!a.disabled:"a"==b||"area"==b?a.href||!isNaN(d):!isNaN(d))&&!c(a)["area"==b?"parents":"closest"](":hidden").length},tabbable:function(a){var b=c.attr(a,"tabindex");return(isNaN(b)||b>=0)&&c(a).is(":focusable")}})}})(jQuery);
+;/*!
+ * jQuery UI Widget 1.8.2
+ *
+ * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT (MIT-LICENSE.txt)
+ * and GPL (GPL-LICENSE.txt) licenses.
+ *
+ * http://docs.jquery.com/UI/Widget
+ */
+(function(b){var j=b.fn.remove;b.fn.remove=function(a,c){return this.each(function(){if(!c)if(!a||b.filter(a,[this]).length)b("*",this).add(this).each(function(){b(this).triggerHandler("remove")});return j.call(b(this),a,c)})};b.widget=function(a,c,d){var e=a.split(".")[0],f;a=a.split(".")[1];f=e+"-"+a;if(!d){d=c;c=b.Widget}b.expr[":"][f]=function(h){return!!b.data(h,a)};b[e]=b[e]||{};b[e][a]=function(h,g){arguments.length&&this._createWidget(h,g)};c=new c;c.options=b.extend({},c.options);b[e][a].prototype=
+b.extend(true,c,{namespace:e,widgetName:a,widgetEventPrefix:b[e][a].prototype.widgetEventPrefix||a,widgetBaseClass:f},d);b.widget.bridge(a,b[e][a])};b.widget.bridge=function(a,c){b.fn[a]=function(d){var e=typeof d==="string",f=Array.prototype.slice.call(arguments,1),h=this;d=!e&&f.length?b.extend.apply(null,[true,d].concat(f)):d;if(e&&d.substring(0,1)==="_")return h;e?this.each(function(){var g=b.data(this,a),i=g&&b.isFunction(g[d])?g[d].apply(g,f):g;if(i!==g&&i!==undefined){h=i;return false}}):this.each(function(){var g=
+b.data(this,a);if(g){d&&g.option(d);g._init()}else b.data(this,a,new c(d,this))});return h}};b.Widget=function(a,c){arguments.length&&this._createWidget(a,c)};b.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",options:{disabled:false},_createWidget:function(a,c){this.element=b(c).data(this.widgetName,this);this.options=b.extend(true,{},this.options,b.metadata&&b.metadata.get(c)[this.widgetName],a);var d=this;this.element.bind("remove."+this.widgetName,function(){d.destroy()});this._create();
+this._init()},_create:function(){},_init:function(){},destroy:function(){this.element.unbind("."+this.widgetName).removeData(this.widgetName);this.widget().unbind("."+this.widgetName).removeAttr("aria-disabled").removeClass(this.widgetBaseClass+"-disabled ui-state-disabled")},widget:function(){return this.element},option:function(a,c){var d=a,e=this;if(arguments.length===0)return b.extend({},e.options);if(typeof a==="string"){if(c===undefined)return this.options[a];d={};d[a]=c}b.each(d,function(f,
+h){e._setOption(f,h)});return e},_setOption:function(a,c){this.options[a]=c;if(a==="disabled")this.widget()[c?"addClass":"removeClass"](this.widgetBaseClass+"-disabled ui-state-disabled").attr("aria-disabled",c);return this},enable:function(){return this._setOption("disabled",false)},disable:function(){return this._setOption("disabled",true)},_trigger:function(a,c,d){var e=this.options[a];c=b.Event(c);c.type=(a===this.widgetEventPrefix?a:this.widgetEventPrefix+a).toLowerCase();d=d||{};if(c.originalEvent){a=
+b.event.props.length;for(var f;a;){f=b.event.props[--a];c[f]=c.originalEvent[f]}}this.element.trigger(c,d);return!(b.isFunction(e)&&e.call(this.element[0],c,d)===false||c.isDefaultPrevented())}}})(jQuery);
+;/*!
+ * jQuery UI Mouse 1.8.2
+ *
+ * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT (MIT-LICENSE.txt)
+ * and GPL (GPL-LICENSE.txt) licenses.
+ *
+ * http://docs.jquery.com/UI/Mouse
+ *
+ * Depends:
+ * jquery.ui.widget.js
+ */
+(function(c){c.widget("ui.mouse",{options:{cancel:":input,option",distance:1,delay:0},_mouseInit:function(){var a=this;this.element.bind("mousedown."+this.widgetName,function(b){return a._mouseDown(b)}).bind("click."+this.widgetName,function(b){if(a._preventClickEvent){a._preventClickEvent=false;b.stopImmediatePropagation();return false}});this.started=false},_mouseDestroy:function(){this.element.unbind("."+this.widgetName)},_mouseDown:function(a){a.originalEvent=a.originalEvent||{};if(!a.originalEvent.mouseHandled){this._mouseStarted&&
+this._mouseUp(a);this._mouseDownEvent=a;var b=this,e=a.which==1,f=typeof this.options.cancel=="string"?c(a.target).parents().add(a.target).filter(this.options.cancel).length:false;if(!e||f||!this._mouseCapture(a))return true;this.mouseDelayMet=!this.options.delay;if(!this.mouseDelayMet)this._mouseDelayTimer=setTimeout(function(){b.mouseDelayMet=true},this.options.delay);if(this._mouseDistanceMet(a)&&this._mouseDelayMet(a)){this._mouseStarted=this._mouseStart(a)!==false;if(!this._mouseStarted){a.preventDefault();
+return true}}this._mouseMoveDelegate=function(d){return b._mouseMove(d)};this._mouseUpDelegate=function(d){return b._mouseUp(d)};c(document).bind("mousemove."+this.widgetName,this._mouseMoveDelegate).bind("mouseup."+this.widgetName,this._mouseUpDelegate);c.browser.safari||a.preventDefault();return a.originalEvent.mouseHandled=true}},_mouseMove:function(a){if(c.browser.msie&&!a.button)return this._mouseUp(a);if(this._mouseStarted){this._mouseDrag(a);return a.preventDefault()}if(this._mouseDistanceMet(a)&&
+this._mouseDelayMet(a))(this._mouseStarted=this._mouseStart(this._mouseDownEvent,a)!==false)?this._mouseDrag(a):this._mouseUp(a);return!this._mouseStarted},_mouseUp:function(a){c(document).unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate);if(this._mouseStarted){this._mouseStarted=false;this._preventClickEvent=a.target==this._mouseDownEvent.target;this._mouseStop(a)}return false},_mouseDistanceMet:function(a){return Math.max(Math.abs(this._mouseDownEvent.pageX-
+a.pageX),Math.abs(this._mouseDownEvent.pageY-a.pageY))>=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return true}})})(jQuery);
+;/*
+ * jQuery UI Position 1.8.2
+ *
+ * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT (MIT-LICENSE.txt)
+ * and GPL (GPL-LICENSE.txt) licenses.
+ *
+ * http://docs.jquery.com/UI/Position
+ */
+(function(c){c.ui=c.ui||{};var m=/left|center|right/,n=/top|center|bottom/,p=c.fn.position,q=c.fn.offset;c.fn.position=function(a){if(!a||!a.of)return p.apply(this,arguments);a=c.extend({},a);var b=c(a.of),d=(a.collision||"flip").split(" "),e=a.offset?a.offset.split(" "):[0,0],g,h,i;if(a.of.nodeType===9){g=b.width();h=b.height();i={top:0,left:0}}else if(a.of.scrollTo&&a.of.document){g=b.width();h=b.height();i={top:b.scrollTop(),left:b.scrollLeft()}}else if(a.of.preventDefault){a.at="left top";g=h=
+0;i={top:a.of.pageY,left:a.of.pageX}}else{g=b.outerWidth();h=b.outerHeight();i=b.offset()}c.each(["my","at"],function(){var f=(a[this]||"").split(" ");if(f.length===1)f=m.test(f[0])?f.concat(["center"]):n.test(f[0])?["center"].concat(f):["center","center"];f[0]=m.test(f[0])?f[0]:"center";f[1]=n.test(f[1])?f[1]:"center";a[this]=f});if(d.length===1)d[1]=d[0];e[0]=parseInt(e[0],10)||0;if(e.length===1)e[1]=e[0];e[1]=parseInt(e[1],10)||0;if(a.at[0]==="right")i.left+=g;else if(a.at[0]==="center")i.left+=
+g/2;if(a.at[1]==="bottom")i.top+=h;else if(a.at[1]==="center")i.top+=h/2;i.left+=e[0];i.top+=e[1];return this.each(function(){var f=c(this),k=f.outerWidth(),l=f.outerHeight(),j=c.extend({},i);if(a.my[0]==="right")j.left-=k;else if(a.my[0]==="center")j.left-=k/2;if(a.my[1]==="bottom")j.top-=l;else if(a.my[1]==="center")j.top-=l/2;j.left=parseInt(j.left);j.top=parseInt(j.top);c.each(["left","top"],function(o,r){c.ui.position[d[o]]&&c.ui.position[d[o]][r](j,{targetWidth:g,targetHeight:h,elemWidth:k,
+elemHeight:l,offset:e,my:a.my,at:a.at})});c.fn.bgiframe&&f.bgiframe();f.offset(c.extend(j,{using:a.using}))})};c.ui.position={fit:{left:function(a,b){var d=c(window);b=a.left+b.elemWidth-d.width()-d.scrollLeft();a.left=b>0?a.left-b:Math.max(0,a.left)},top:function(a,b){var d=c(window);b=a.top+b.elemHeight-d.height()-d.scrollTop();a.top=b>0?a.top-b:Math.max(0,a.top)}},flip:{left:function(a,b){if(b.at[0]!=="center"){var d=c(window);d=a.left+b.elemWidth-d.width()-d.scrollLeft();var e=b.my[0]==="left"?
+-b.elemWidth:b.my[0]==="right"?b.elemWidth:0,g=-2*b.offset[0];a.left+=a.left<0?e+b.targetWidth+g:d>0?e-b.targetWidth+g:0}},top:function(a,b){if(b.at[1]!=="center"){var d=c(window);d=a.top+b.elemHeight-d.height()-d.scrollTop();var e=b.my[1]==="top"?-b.elemHeight:b.my[1]==="bottom"?b.elemHeight:0,g=b.at[1]==="top"?b.targetHeight:-b.targetHeight,h=-2*b.offset[1];a.top+=a.top<0?e+b.targetHeight+h:d>0?e+g+h:0}}}};if(!c.offset.setOffset){c.offset.setOffset=function(a,b){if(/static/.test(c.curCSS(a,"position")))a.style.position=
+"relative";var d=c(a),e=d.offset(),g=parseInt(c.curCSS(a,"top",true),10)||0,h=parseInt(c.curCSS(a,"left",true),10)||0;e={top:b.top-e.top+g,left:b.left-e.left+h};"using"in b?b.using.call(a,e):d.css(e)};c.fn.offset=function(a){var b=this[0];if(!b||!b.ownerDocument)return null;if(a)return this.each(function(){c.offset.setOffset(this,a)});return q.call(this)}}})(jQuery);
+;/*
+ * jQuery UI Resizable 1.8.2
+ *
+ * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT (MIT-LICENSE.txt)
+ * and GPL (GPL-LICENSE.txt) licenses.
+ *
+ * http://docs.jquery.com/UI/Resizables
+ *
+ * Depends:
+ * jquery.ui.core.js
+ * jquery.ui.mouse.js
+ * jquery.ui.widget.js
+ */
+(function(d){d.widget("ui.resizable",d.ui.mouse,{widgetEventPrefix:"resize",options:{alsoResize:false,animate:false,animateDuration:"slow",animateEasing:"swing",aspectRatio:false,autoHide:false,containment:false,ghost:false,grid:false,handles:"e,s,se",helper:false,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:1E3},_create:function(){var b=this,a=this.options;this.element.addClass("ui-resizable");d.extend(this,{_aspectRatio:!!a.aspectRatio,aspectRatio:a.aspectRatio,originalElement:this.element,
+_proportionallyResizeElements:[],_helper:a.helper||a.ghost||a.animate?a.helper||"ui-resizable-helper":null});if(this.element[0].nodeName.match(/canvas|textarea|input|select|button|img/i)){/relative/.test(this.element.css("position"))&&d.browser.opera&&this.element.css({position:"relative",top:"auto",left:"auto"});this.element.wrap(d('<div class="ui-wrapper" style="overflow: hidden;"></div>').css({position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),
+top:this.element.css("top"),left:this.element.css("left")}));this.element=this.element.parent().data("resizable",this.element.data("resizable"));this.elementIsWrapper=true;this.element.css({marginLeft:this.originalElement.css("marginLeft"),marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom")});this.originalElement.css({marginLeft:0,marginTop:0,marginRight:0,marginBottom:0});this.originalResizeStyle=
+this.originalElement.css("resize");this.originalElement.css("resize","none");this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"}));this.originalElement.css({margin:this.originalElement.css("margin")});this._proportionallyResize()}this.handles=a.handles||(!d(".ui-resizable-handle",this.element).length?"e,s,se":{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",
+nw:".ui-resizable-nw"});if(this.handles.constructor==String){if(this.handles=="all")this.handles="n,e,s,w,se,sw,ne,nw";var c=this.handles.split(",");this.handles={};for(var e=0;e<c.length;e++){var g=d.trim(c[e]),f=d('<div class="ui-resizable-handle '+("ui-resizable-"+g)+'"></div>');/sw|se|ne|nw/.test(g)&&f.css({zIndex:++a.zIndex});"se"==g&&f.addClass("ui-icon ui-icon-gripsmall-diagonal-se");this.handles[g]=".ui-resizable-"+g;this.element.append(f)}}this._renderAxis=function(h){h=h||this.element;for(var i in this.handles){if(this.handles[i].constructor==
+String)this.handles[i]=d(this.handles[i],this.element).show();if(this.elementIsWrapper&&this.originalElement[0].nodeName.match(/textarea|input|select|button/i)){var j=d(this.handles[i],this.element),l=0;l=/sw|ne|nw|se|n|s/.test(i)?j.outerHeight():j.outerWidth();j=["padding",/ne|nw|n/.test(i)?"Top":/se|sw|s/.test(i)?"Bottom":/^e$/.test(i)?"Right":"Left"].join("");h.css(j,l);this._proportionallyResize()}d(this.handles[i])}};this._renderAxis(this.element);this._handles=d(".ui-resizable-handle",this.element).disableSelection();
+this._handles.mouseover(function(){if(!b.resizing){if(this.className)var h=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i);b.axis=h&&h[1]?h[1]:"se"}});if(a.autoHide){this._handles.hide();d(this.element).addClass("ui-resizable-autohide").hover(function(){d(this).removeClass("ui-resizable-autohide");b._handles.show()},function(){if(!b.resizing){d(this).addClass("ui-resizable-autohide");b._handles.hide()}})}this._mouseInit()},destroy:function(){this._mouseDestroy();var b=function(c){d(c).removeClass("ui-resizable ui-resizable-disabled ui-resizable-resizing").removeData("resizable").unbind(".resizable").find(".ui-resizable-handle").remove()};
+if(this.elementIsWrapper){b(this.element);var a=this.element;a.after(this.originalElement.css({position:a.css("position"),width:a.outerWidth(),height:a.outerHeight(),top:a.css("top"),left:a.css("left")})).remove()}this.originalElement.css("resize",this.originalResizeStyle);b(this.originalElement);return this},_mouseCapture:function(b){var a=false;for(var c in this.handles)if(d(this.handles[c])[0]==b.target)a=true;return!this.options.disabled&&a},_mouseStart:function(b){var a=this.options,c=this.element.position(),
+e=this.element;this.resizing=true;this.documentScroll={top:d(document).scrollTop(),left:d(document).scrollLeft()};if(e.is(".ui-draggable")||/absolute/.test(e.css("position")))e.css({position:"absolute",top:c.top,left:c.left});d.browser.opera&&/relative/.test(e.css("position"))&&e.css({position:"relative",top:"auto",left:"auto"});this._renderProxy();c=m(this.helper.css("left"));var g=m(this.helper.css("top"));if(a.containment){c+=d(a.containment).scrollLeft()||0;g+=d(a.containment).scrollTop()||0}this.offset=
+this.helper.offset();this.position={left:c,top:g};this.size=this._helper?{width:e.outerWidth(),height:e.outerHeight()}:{width:e.width(),height:e.height()};this.originalSize=this._helper?{width:e.outerWidth(),height:e.outerHeight()}:{width:e.width(),height:e.height()};this.originalPosition={left:c,top:g};this.sizeDiff={width:e.outerWidth()-e.width(),height:e.outerHeight()-e.height()};this.originalMousePosition={left:b.pageX,top:b.pageY};this.aspectRatio=typeof a.aspectRatio=="number"?a.aspectRatio:
+this.originalSize.width/this.originalSize.height||1;a=d(".ui-resizable-"+this.axis).css("cursor");d("body").css("cursor",a=="auto"?this.axis+"-resize":a);e.addClass("ui-resizable-resizing");this._propagate("start",b);return true},_mouseDrag:function(b){var a=this.helper,c=this.originalMousePosition,e=this._change[this.axis];if(!e)return false;c=e.apply(this,[b,b.pageX-c.left||0,b.pageY-c.top||0]);if(this._aspectRatio||b.shiftKey)c=this._updateRatio(c,b);c=this._respectSize(c,b);this._propagate("resize",
+b);a.css({top:this.position.top+"px",left:this.position.left+"px",width:this.size.width+"px",height:this.size.height+"px"});!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize();this._updateCache(c);this._trigger("resize",b,this.ui());return false},_mouseStop:function(b){this.resizing=false;var a=this.options,c=this;if(this._helper){var e=this._proportionallyResizeElements,g=e.length&&/textarea/i.test(e[0].nodeName);e=g&&d.ui.hasScroll(e[0],"left")?0:c.sizeDiff.height;
+g={width:c.size.width-(g?0:c.sizeDiff.width),height:c.size.height-e};e=parseInt(c.element.css("left"),10)+(c.position.left-c.originalPosition.left)||null;var f=parseInt(c.element.css("top"),10)+(c.position.top-c.originalPosition.top)||null;a.animate||this.element.css(d.extend(g,{top:f,left:e}));c.helper.height(c.size.height);c.helper.width(c.size.width);this._helper&&!a.animate&&this._proportionallyResize()}d("body").css("cursor","auto");this.element.removeClass("ui-resizable-resizing");this._propagate("stop",
+b);this._helper&&this.helper.remove();return false},_updateCache:function(b){this.offset=this.helper.offset();if(k(b.left))this.position.left=b.left;if(k(b.top))this.position.top=b.top;if(k(b.height))this.size.height=b.height;if(k(b.width))this.size.width=b.width},_updateRatio:function(b){var a=this.position,c=this.size,e=this.axis;if(b.height)b.width=c.height*this.aspectRatio;else if(b.width)b.height=c.width/this.aspectRatio;if(e=="sw"){b.left=a.left+(c.width-b.width);b.top=null}if(e=="nw"){b.top=
+a.top+(c.height-b.height);b.left=a.left+(c.width-b.width)}return b},_respectSize:function(b){var a=this.options,c=this.axis,e=k(b.width)&&a.maxWidth&&a.maxWidth<b.width,g=k(b.height)&&a.maxHeight&&a.maxHeight<b.height,f=k(b.width)&&a.minWidth&&a.minWidth>b.width,h=k(b.height)&&a.minHeight&&a.minHeight>b.height;if(f)b.width=a.minWidth;if(h)b.height=a.minHeight;if(e)b.width=a.maxWidth;if(g)b.height=a.maxHeight;var i=this.originalPosition.left+this.originalSize.width,j=this.position.top+this.size.height,
+l=/sw|nw|w/.test(c);c=/nw|ne|n/.test(c);if(f&&l)b.left=i-a.minWidth;if(e&&l)b.left=i-a.maxWidth;if(h&&c)b.top=j-a.minHeight;if(g&&c)b.top=j-a.maxHeight;if((a=!b.width&&!b.height)&&!b.left&&b.top)b.top=null;else if(a&&!b.top&&b.left)b.left=null;return b},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var b=this.helper||this.element,a=0;a<this._proportionallyResizeElements.length;a++){var c=this._proportionallyResizeElements[a];if(!this.borderDif){var e=[c.css("borderTopWidth"),
+c.css("borderRightWidth"),c.css("borderBottomWidth"),c.css("borderLeftWidth")],g=[c.css("paddingTop"),c.css("paddingRight"),c.css("paddingBottom"),c.css("paddingLeft")];this.borderDif=d.map(e,function(f,h){f=parseInt(f,10)||0;h=parseInt(g[h],10)||0;return f+h})}d.browser.msie&&(d(b).is(":hidden")||d(b).parents(":hidden").length)||c.css({height:b.height()-this.borderDif[0]-this.borderDif[2]||0,width:b.width()-this.borderDif[1]-this.borderDif[3]||0})}},_renderProxy:function(){var b=this.options;this.elementOffset=
+this.element.offset();if(this._helper){this.helper=this.helper||d('<div style="overflow:hidden;"></div>');var a=d.browser.msie&&d.browser.version<7,c=a?1:0;a=a?2:-1;this.helper.addClass(this._helper).css({width:this.element.outerWidth()+a,height:this.element.outerHeight()+a,position:"absolute",left:this.elementOffset.left-c+"px",top:this.elementOffset.top-c+"px",zIndex:++b.zIndex});this.helper.appendTo("body").disableSelection()}else this.helper=this.element},_change:{e:function(b,a){return{width:this.originalSize.width+
+a}},w:function(b,a){return{left:this.originalPosition.left+a,width:this.originalSize.width-a}},n:function(b,a,c){return{top:this.originalPosition.top+c,height:this.originalSize.height-c}},s:function(b,a,c){return{height:this.originalSize.height+c}},se:function(b,a,c){return d.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[b,a,c]))},sw:function(b,a,c){return d.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[b,a,c]))},ne:function(b,a,c){return d.extend(this._change.n.apply(this,
+arguments),this._change.e.apply(this,[b,a,c]))},nw:function(b,a,c){return d.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[b,a,c]))}},_propagate:function(b,a){d.ui.plugin.call(this,b,[a,this.ui()]);b!="resize"&&this._trigger(b,a,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}});d.extend(d.ui.resizable,
+{version:"1.8.2"});d.ui.plugin.add("resizable","alsoResize",{start:function(){var b=d(this).data("resizable").options,a=function(c){d(c).each(function(){d(this).data("resizable-alsoresize",{width:parseInt(d(this).width(),10),height:parseInt(d(this).height(),10),left:parseInt(d(this).css("left"),10),top:parseInt(d(this).css("top"),10)})})};if(typeof b.alsoResize=="object"&&!b.alsoResize.parentNode)if(b.alsoResize.length){b.alsoResize=b.alsoResize[0];a(b.alsoResize)}else d.each(b.alsoResize,function(c){a(c)});
+else a(b.alsoResize)},resize:function(){var b=d(this).data("resizable"),a=b.options,c=b.originalSize,e=b.originalPosition,g={height:b.size.height-c.height||0,width:b.size.width-c.width||0,top:b.position.top-e.top||0,left:b.position.left-e.left||0},f=function(h,i){d(h).each(function(){var j=d(this),l=d(this).data("resizable-alsoresize"),p={};d.each((i&&i.length?i:["width","height","top","left"])||["width","height","top","left"],function(n,o){if((n=(l[o]||0)+(g[o]||0))&&n>=0)p[o]=n||null});if(/relative/.test(j.css("position"))&&
+d.browser.opera){b._revertToRelativePosition=true;j.css({position:"absolute",top:"auto",left:"auto"})}j.css(p)})};typeof a.alsoResize=="object"&&!a.alsoResize.nodeType?d.each(a.alsoResize,function(h,i){f(h,i)}):f(a.alsoResize)},stop:function(){var b=d(this).data("resizable");if(b._revertToRelativePosition&&d.browser.opera){b._revertToRelativePosition=false;el.css({position:"relative"})}d(this).removeData("resizable-alsoresize-start")}});d.ui.plugin.add("resizable","animate",{stop:function(b){var a=
+d(this).data("resizable"),c=a.options,e=a._proportionallyResizeElements,g=e.length&&/textarea/i.test(e[0].nodeName),f=g&&d.ui.hasScroll(e[0],"left")?0:a.sizeDiff.height;g={width:a.size.width-(g?0:a.sizeDiff.width),height:a.size.height-f};f=parseInt(a.element.css("left"),10)+(a.position.left-a.originalPosition.left)||null;var h=parseInt(a.element.css("top"),10)+(a.position.top-a.originalPosition.top)||null;a.element.animate(d.extend(g,h&&f?{top:h,left:f}:{}),{duration:c.animateDuration,easing:c.animateEasing,
+step:function(){var i={width:parseInt(a.element.css("width"),10),height:parseInt(a.element.css("height"),10),top:parseInt(a.element.css("top"),10),left:parseInt(a.element.css("left"),10)};e&&e.length&&d(e[0]).css({width:i.width,height:i.height});a._updateCache(i);a._propagate("resize",b)}})}});d.ui.plugin.add("resizable","containment",{start:function(){var b=d(this).data("resizable"),a=b.element,c=b.options.containment;if(a=c instanceof d?c.get(0):/parent/.test(c)?a.parent().get(0):c){b.containerElement=
+d(a);if(/document/.test(c)||c==document){b.containerOffset={left:0,top:0};b.containerPosition={left:0,top:0};b.parentData={element:d(document),left:0,top:0,width:d(document).width(),height:d(document).height()||document.body.parentNode.scrollHeight}}else{var e=d(a),g=[];d(["Top","Right","Left","Bottom"]).each(function(i,j){g[i]=m(e.css("padding"+j))});b.containerOffset=e.offset();b.containerPosition=e.position();b.containerSize={height:e.innerHeight()-g[3],width:e.innerWidth()-g[1]};c=b.containerOffset;
+var f=b.containerSize.height,h=b.containerSize.width;h=d.ui.hasScroll(a,"left")?a.scrollWidth:h;f=d.ui.hasScroll(a)?a.scrollHeight:f;b.parentData={element:a,left:c.left,top:c.top,width:h,height:f}}}},resize:function(b){var a=d(this).data("resizable"),c=a.options,e=a.containerOffset,g=a.position;b=a._aspectRatio||b.shiftKey;var f={top:0,left:0},h=a.containerElement;if(h[0]!=document&&/static/.test(h.css("position")))f=e;if(g.left<(a._helper?e.left:0)){a.size.width+=a._helper?a.position.left-e.left:
+a.position.left-f.left;if(b)a.size.height=a.size.width/c.aspectRatio;a.position.left=c.helper?e.left:0}if(g.top<(a._helper?e.top:0)){a.size.height+=a._helper?a.position.top-e.top:a.position.top;if(b)a.size.width=a.size.height*c.aspectRatio;a.position.top=a._helper?e.top:0}a.offset.left=a.parentData.left+a.position.left;a.offset.top=a.parentData.top+a.position.top;c=Math.abs((a._helper?a.offset.left-f.left:a.offset.left-f.left)+a.sizeDiff.width);e=Math.abs((a._helper?a.offset.top-f.top:a.offset.top-
+e.top)+a.sizeDiff.height);g=a.containerElement.get(0)==a.element.parent().get(0);f=/relative|absolute/.test(a.containerElement.css("position"));if(g&&f)c-=a.parentData.left;if(c+a.size.width>=a.parentData.width){a.size.width=a.parentData.width-c;if(b)a.size.height=a.size.width/a.aspectRatio}if(e+a.size.height>=a.parentData.height){a.size.height=a.parentData.height-e;if(b)a.size.width=a.size.height*a.aspectRatio}},stop:function(){var b=d(this).data("resizable"),a=b.options,c=b.containerOffset,e=b.containerPosition,
+g=b.containerElement,f=d(b.helper),h=f.offset(),i=f.outerWidth()-b.sizeDiff.width;f=f.outerHeight()-b.sizeDiff.height;b._helper&&!a.animate&&/relative/.test(g.css("position"))&&d(this).css({left:h.left-e.left-c.left,width:i,height:f});b._helper&&!a.animate&&/static/.test(g.css("position"))&&d(this).css({left:h.left-e.left-c.left,width:i,height:f})}});d.ui.plugin.add("resizable","ghost",{start:function(){var b=d(this).data("resizable"),a=b.options,c=b.size;b.ghost=b.originalElement.clone();b.ghost.css({opacity:0.25,
+display:"block",position:"relative",height:c.height,width:c.width,margin:0,left:0,top:0}).addClass("ui-resizable-ghost").addClass(typeof a.ghost=="string"?a.ghost:"");b.ghost.appendTo(b.helper)},resize:function(){var b=d(this).data("resizable");b.ghost&&b.ghost.css({position:"relative",height:b.size.height,width:b.size.width})},stop:function(){var b=d(this).data("resizable");b.ghost&&b.helper&&b.helper.get(0).removeChild(b.ghost.get(0))}});d.ui.plugin.add("resizable","grid",{resize:function(){var b=
+d(this).data("resizable"),a=b.options,c=b.size,e=b.originalSize,g=b.originalPosition,f=b.axis;a.grid=typeof a.grid=="number"?[a.grid,a.grid]:a.grid;var h=Math.round((c.width-e.width)/(a.grid[0]||1))*(a.grid[0]||1);a=Math.round((c.height-e.height)/(a.grid[1]||1))*(a.grid[1]||1);if(/^(se|s|e)$/.test(f)){b.size.width=e.width+h;b.size.height=e.height+a}else if(/^(ne)$/.test(f)){b.size.width=e.width+h;b.size.height=e.height+a;b.position.top=g.top-a}else{if(/^(sw)$/.test(f)){b.size.width=e.width+h;b.size.height=
+e.height+a}else{b.size.width=e.width+h;b.size.height=e.height+a;b.position.top=g.top-a}b.position.left=g.left-h}}});var m=function(b){return parseInt(b,10)||0},k=function(b){return!isNaN(parseInt(b,10))}})(jQuery);
+;
+/*
+ * jQuery UI Selectable 1.8.2
+ *
+ * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT (MIT-LICENSE.txt)
+ * and GPL (GPL-LICENSE.txt) licenses.
+ *
+ * http://docs.jquery.com/UI/Selectables
+ *
+ * Depends:
+ * jquery.ui.core.js
+ * jquery.ui.mouse.js
+ * jquery.ui.widget.js
+ */
+(function(e){e.widget("ui.selectable",e.ui.mouse,{options:{appendTo:"body",autoRefresh:true,distance:0,filter:"*",tolerance:"touch"},_create:function(){var c=this;this.element.addClass("ui-selectable");this.dragged=false;var f;this.refresh=function(){f=e(c.options.filter,c.element[0]);f.each(function(){var d=e(this),b=d.offset();e.data(this,"selectable-item",{element:this,$element:d,left:b.left,top:b.top,right:b.left+d.outerWidth(),bottom:b.top+d.outerHeight(),startselected:false,selected:d.hasClass("ui-selected"),
+selecting:d.hasClass("ui-selecting"),unselecting:d.hasClass("ui-unselecting")})})};this.refresh();this.selectees=f.addClass("ui-selectee");this._mouseInit();this.helper=e("<div class='ui-selectable-helper'></div>")},destroy:function(){this.selectees.removeClass("ui-selectee").removeData("selectable-item");this.element.removeClass("ui-selectable ui-selectable-disabled").removeData("selectable").unbind(".selectable");this._mouseDestroy();return this},_mouseStart:function(c){var f=this;this.opos=[c.pageX,
+c.pageY];if(!this.options.disabled){var d=this.options;this.selectees=e(d.filter,this.element[0]);this._trigger("start",c);e(d.appendTo).append(this.helper);this.helper.css({"z-index":100,position:"absolute",left:c.clientX,top:c.clientY,width:0,height:0});d.autoRefresh&&this.refresh();this.selectees.filter(".ui-selected").each(function(){var b=e.data(this,"selectable-item");b.startselected=true;if(!c.metaKey){b.$element.removeClass("ui-selected");b.selected=false;b.$element.addClass("ui-unselecting");
+b.unselecting=true;f._trigger("unselecting",c,{unselecting:b.element})}});e(c.target).parents().andSelf().each(function(){var b=e.data(this,"selectable-item");if(b){var g=!c.metaKey||!b.$element.hasClass("ui-selected");b.$element.removeClass(g?"ui-unselecting":"ui-selected").addClass(g?"ui-selecting":"ui-unselecting");b.unselecting=!g;b.selecting=g;(b.selected=g)?f._trigger("selecting",c,{selecting:b.element}):f._trigger("unselecting",c,{unselecting:b.element});return false}})}},_mouseDrag:function(c){var f=
+this;this.dragged=true;if(!this.options.disabled){var d=this.options,b=this.opos[0],g=this.opos[1],h=c.pageX,i=c.pageY;if(b>h){var j=h;h=b;b=j}if(g>i){j=i;i=g;g=j}this.helper.css({left:b,top:g,width:h-b,height:i-g});this.selectees.each(function(){var a=e.data(this,"selectable-item");if(!(!a||a.element==f.element[0])){var k=false;if(d.tolerance=="touch")k=!(a.left>h||a.right<b||a.top>i||a.bottom<g);else if(d.tolerance=="fit")k=a.left>b&&a.right<h&&a.top>g&&a.bottom<i;if(k){if(a.selected){a.$element.removeClass("ui-selected");
+a.selected=false}if(a.unselecting){a.$element.removeClass("ui-unselecting");a.unselecting=false}if(!a.selecting){a.$element.addClass("ui-selecting");a.selecting=true;f._trigger("selecting",c,{selecting:a.element})}}else{if(a.selecting)if(c.metaKey&&a.startselected){a.$element.removeClass("ui-selecting");a.selecting=false;a.$element.addClass("ui-selected");a.selected=true}else{a.$element.removeClass("ui-selecting");a.selecting=false;if(a.startselected){a.$element.addClass("ui-unselecting");a.unselecting=
+true}f._trigger("unselecting",c,{unselecting:a.element})}if(a.selected)if(!c.metaKey&&!a.startselected){a.$element.removeClass("ui-selected");a.selected=false;a.$element.addClass("ui-unselecting");a.unselecting=true;f._trigger("unselecting",c,{unselecting:a.element})}}}});return false}},_mouseStop:function(c){var f=this;this.dragged=false;e(".ui-unselecting",this.element[0]).each(function(){var d=e.data(this,"selectable-item");d.$element.removeClass("ui-unselecting");d.unselecting=false;d.startselected=
+false;f._trigger("unselected",c,{unselected:d.element})});e(".ui-selecting",this.element[0]).each(function(){var d=e.data(this,"selectable-item");d.$element.removeClass("ui-selecting").addClass("ui-selected");d.selecting=false;d.selected=true;d.startselected=true;f._trigger("selected",c,{selected:d.element})});this._trigger("stop",c);this.helper.remove();return false}});e.extend(e.ui.selectable,{version:"1.8.2"})})(jQuery);
+
+(function(e){e.widget("ui.selectable",e.ui.mouse,{options:{appendTo:"body",autoRefresh:true,distance:0,filter:"*",tolerance:"touch"},_create:function(){var c=this;this.element.addClass("ui-selectable");this.dragged=false;var f;this.refresh=function(){f=e(c.options.filter,c.element[0]);f.each(function(){var d=e(this),b=d.offset();e.data(this,"selectable-item",{element:this,$element:d,left:b.left,top:b.top,right:b.left+d.outerWidth(),bottom:b.top+d.outerHeight(),startselected:false,selected:d.hasClass("ui-selected"),
+selecting:d.hasClass("ui-selecting"),unselecting:d.hasClass("ui-unselecting")})})};this.refresh();this.selectees=f.addClass("ui-selectee");this._mouseInit();this.helper=e("<div class='ui-selectable-helper'></div>")},destroy:function(){this.selectees.removeClass("ui-selectee").removeData("selectable-item");this.element.removeClass("ui-selectable ui-selectable-disabled").removeData("selectable").unbind(".selectable");this._mouseDestroy();return this},_mouseStart:function(c){var f=this;this.opos=[c.pageX,
+c.pageY];if(!this.options.disabled){var d=this.options;this.selectees=e(d.filter,this.element[0]);this._trigger("start",c);e(d.appendTo).append(this.helper);this.helper.css({"z-index":100,position:"absolute",left:c.clientX,top:c.clientY,width:0,height:0});d.autoRefresh&&this.refresh();this.selectees.filter(".ui-selected").each(function(){var b=e.data(this,"selectable-item");b.startselected=true;if(!c.metaKey){b.$element.removeClass("ui-selected");b.selected=false;b.$element.addClass("ui-unselecting");
+b.unselecting=true;f._trigger("unselecting",c,{unselecting:b.element})}});e(c.target).parents().andSelf().each(function(){var b=e.data(this,"selectable-item");if(b){var g=!c.metaKey||!b.$element.hasClass("ui-selected");b.$element.removeClass(g?"ui-unselecting":"ui-selected").addClass(g?"ui-selecting":"ui-unselecting");b.unselecting=!g;b.selecting=g;(b.selected=g)?f._trigger("selecting",c,{selecting:b.element}):f._trigger("unselecting",c,{unselecting:b.element});return false}})}},_mouseDrag:function(c){var f=
+this;this.dragged=true;if(!this.options.disabled){var d=this.options,b=this.opos[0],g=this.opos[1],h=c.pageX,i=c.pageY;if(b>h){var j=h;h=b;b=j}if(g>i){j=i;i=g;g=j}this.helper.css({left:b,top:g,width:h-b,height:i-g});this.selectees.each(function(){var a=e.data(this,"selectable-item");if(!(!a||a.element==f.element[0])){var k=false;if(d.tolerance=="touch")k=!(a.left>h||a.right<b||a.top>i||a.bottom<g);else if(d.tolerance=="fit")k=a.left>b&&a.right<h&&a.top>g&&a.bottom<i;if(k){if(a.selected){a.$element.removeClass("ui-selected");
+a.selected=false}if(a.unselecting){a.$element.removeClass("ui-unselecting");a.unselecting=false}if(!a.selecting){a.$element.addClass("ui-selecting");a.selecting=true;f._trigger("selecting",c,{selecting:a.element})}}else{if(a.selecting)if(c.metaKey&&a.startselected){a.$element.removeClass("ui-selecting");a.selecting=false;a.$element.addClass("ui-selected");a.selected=true}else{a.$element.removeClass("ui-selecting");a.selecting=false;if(a.startselected){a.$element.addClass("ui-unselecting");a.unselecting=
+true}f._trigger("unselecting",c,{unselecting:a.element})}if(a.selected)if(!c.metaKey&&!a.startselected){a.$element.removeClass("ui-selected");a.selected=false;a.$element.addClass("ui-unselecting");a.unselecting=true;f._trigger("unselecting",c,{unselecting:a.element})}}}});return false}},_mouseStop:function(c){var f=this;this.dragged=false;e(".ui-unselecting",this.element[0]).each(function(){var d=e.data(this,"selectable-item");d.$element.removeClass("ui-unselecting");d.unselecting=false;d.startselected=
+false;f._trigger("unselected",c,{unselected:d.element})});e(".ui-selecting",this.element[0]).each(function(){var d=e.data(this,"selectable-item");d.$element.removeClass("ui-selecting").addClass("ui-selected");d.selecting=false;d.selected=true;d.startselected=true;f._trigger("selected",c,{selected:d.element})});this._trigger("stop",c);this.helper.remove();return false}});e.extend(e.ui.selectable,{version:"1.8.2"})})(jQuery);
+;/*
+ * jQuery UI Autocomplete 1.8.2
+ *
+ * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT (MIT-LICENSE.txt)
+ * and GPL (GPL-LICENSE.txt) licenses.
+ *
+ * http://docs.jquery.com/UI/Autocomplete
+ *
+ * Depends:
+ * jquery.ui.core.js
+ * jquery.ui.widget.js
+ * jquery.ui.position.js
+ */
+(function(e){e.widget("ui.autocomplete",{options:{minLength:1,delay:300},_create:function(){var a=this,c=this.element[0].ownerDocument;this.element.addClass("ui-autocomplete-input").attr("autocomplete","off").attr({role:"textbox","aria-autocomplete":"list","aria-haspopup":"true"}).bind("keydown.autocomplete",function(d){var b=e.ui.keyCode;switch(d.keyCode){case b.PAGE_UP:a._move("previousPage",d);break;case b.PAGE_DOWN:a._move("nextPage",d);break;case b.UP:a._move("previous",d);d.preventDefault();
+break;case b.DOWN:a._move("next",d);d.preventDefault();break;case b.ENTER:case b.NUMPAD_ENTER:a.menu.active&&d.preventDefault();case b.TAB:if(!a.menu.active)return;a.menu.select(d);break;case b.ESCAPE:a.element.val(a.term);a.close(d);break;case b.LEFT:case b.RIGHT:case b.SHIFT:case b.CONTROL:case b.ALT:case b.COMMAND:case b.COMMAND_RIGHT:case b.INSERT:case b.CAPS_LOCK:case b.END:case b.HOME:break;default:clearTimeout(a.searching);a.searching=setTimeout(function(){a.search(null,d)},a.options.delay);
+break}}).bind("focus.autocomplete",function(){a.selectedItem=null;a.previous=a.element.val()}).bind("blur.autocomplete",function(d){clearTimeout(a.searching);a.closing=setTimeout(function(){a.close(d);a._change(d)},150)});this._initSource();this.response=function(){return a._response.apply(a,arguments)};this.menu=e("<ul></ul>").addClass("ui-autocomplete").appendTo("body",c).mousedown(function(){setTimeout(function(){clearTimeout(a.closing)},13)}).menu({focus:function(d,b){b=b.item.data("item.autocomplete");
+false!==a._trigger("focus",null,{item:b})&&/^key/.test(d.originalEvent.type)&&a.element.val(b.value)},selected:function(d,b){b=b.item.data("item.autocomplete");false!==a._trigger("select",d,{item:b})&&a.element.val(b.value);a.close(d);d=a.previous;if(a.element[0]!==c.activeElement){a.element.focus();a.previous=d}a.selectedItem=b},blur:function(){a.menu.element.is(":visible")&&a.element.val(a.term)}}).zIndex(this.element.zIndex()+1).css({top:0,left:0}).hide().data("menu");e.fn.bgiframe&&this.menu.element.bgiframe()},
+destroy:function(){this.element.removeClass("ui-autocomplete-input").removeAttr("autocomplete").removeAttr("role").removeAttr("aria-autocomplete").removeAttr("aria-haspopup");this.menu.element.remove();e.Widget.prototype.destroy.call(this)},_setOption:function(a){e.Widget.prototype._setOption.apply(this,arguments);a==="source"&&this._initSource()},_initSource:function(){var a,c;if(e.isArray(this.options.source)){a=this.options.source;this.source=function(d,b){b(e.ui.autocomplete.filter(a,d.term))}}else if(typeof this.options.source===
+"string"){c=this.options.source;this.source=function(d,b){e.getJSON(c,d,b)}}else this.source=this.options.source},search:function(a,c){a=a!=null?a:this.element.val();if(a.length<this.options.minLength)return this.close(c);clearTimeout(this.closing);if(this._trigger("search")!==false)return this._search(a)},_search:function(a){this.term=this.element.addClass("ui-autocomplete-loading").val();this.source({term:a},this.response)},_response:function(a){if(a.length){a=this._normalize(a);this._suggest(a);
+this._trigger("open")}else this.close();this.element.removeClass("ui-autocomplete-loading")},close:function(a){clearTimeout(this.closing);if(this.menu.element.is(":visible")){this._trigger("close",a);this.menu.element.hide();this.menu.deactivate()}},_change:function(a){this.previous!==this.element.val()&&this._trigger("change",a,{item:this.selectedItem})},_normalize:function(a){if(a.length&&a[0].label&&a[0].value)return a;return e.map(a,function(c){if(typeof c==="string")return{label:c,value:c};return e.extend({label:c.label||
+c.value,value:c.value||c.label},c)})},_suggest:function(a){var c=this.menu.element.empty().zIndex(this.element.zIndex()+1),d;this._renderMenu(c,a);this.menu.deactivate();this.menu.refresh();this.menu.element.show().position({my:"left top",at:"left bottom",of:this.element,collision:"none"});a=c.width("").width();d=this.element.width();c.width(Math.max(a,d))},_renderMenu:function(a,c){var d=this;e.each(c,function(b,f){d._renderItem(a,f)})},_renderItem:function(a,c){return e("<li></li>").data("item.autocomplete",
+c).append("<a>"+c.label+"</a>").appendTo(a)},_move:function(a,c){if(this.menu.element.is(":visible"))if(this.menu.first()&&/^previous/.test(a)||this.menu.last()&&/^next/.test(a)){this.element.val(this.term);this.menu.deactivate()}else this.menu[a](c);else this.search(null,c)},widget:function(){return this.menu.element}});e.extend(e.ui.autocomplete,{escapeRegex:function(a){return a.replace(/([\^\$\(\)\[\]\{\}\*\.\+\?\|\\])/gi,"\\$1")},filter:function(a,c){var d=new RegExp(e.ui.autocomplete.escapeRegex(c),
+"i");return e.grep(a,function(b){return d.test(b.label||b.value||b)})}})})(jQuery);
+(function(e){e.widget("ui.menu",{_create:function(){var a=this;this.element.addClass("ui-menu ui-widget ui-widget-content ui-corner-all").attr({role:"listbox","aria-activedescendant":"ui-active-menuitem"}).click(function(c){if(e(c.target).closest(".ui-menu-item a").length){c.preventDefault();a.select(c)}});this.refresh()},refresh:function(){var a=this;this.element.children("li:not(.ui-menu-item):has(a)").addClass("ui-menu-item").attr("role","menuitem").children("a").addClass("ui-corner-all").attr("tabindex",
+-1).mouseenter(function(c){a.activate(c,e(this).parent())}).mouseleave(function(){a.deactivate()})},activate:function(a,c){this.deactivate();if(this.hasScroll()){var d=c.offset().top-this.element.offset().top,b=this.element.attr("scrollTop"),f=this.element.height();if(d<0)this.element.attr("scrollTop",b+d);else d>f&&this.element.attr("scrollTop",b+d-f+c.height())}this.active=c.eq(0).children("a").addClass("ui-state-hover").attr("id","ui-active-menuitem").end();this._trigger("focus",a,{item:c})},deactivate:function(){if(this.active){this.active.children("a").removeClass("ui-state-hover").removeAttr("id");
+this._trigger("blur");this.active=null}},next:function(a){this.move("next",".ui-menu-item:first",a)},previous:function(a){this.move("prev",".ui-menu-item:last",a)},first:function(){return this.active&&!this.active.prev().length},last:function(){return this.active&&!this.active.next().length},move:function(a,c,d){if(this.active){a=this.active[a+"All"](".ui-menu-item").eq(0);a.length?this.activate(d,a):this.activate(d,this.element.children(c))}else this.activate(d,this.element.children(c))},nextPage:function(a){if(this.hasScroll())if(!this.active||
+this.last())this.activate(a,this.element.children(":first"));else{var c=this.active.offset().top,d=this.element.height(),b=this.element.children("li").filter(function(){var f=e(this).offset().top-c-d+e(this).height();return f<10&&f>-10});b.length||(b=this.element.children(":last"));this.activate(a,b)}else this.activate(a,this.element.children(!this.active||this.last()?":first":":last"))},previousPage:function(a){if(this.hasScroll())if(!this.active||this.first())this.activate(a,this.element.children(":last"));
+else{var c=this.active.offset().top,d=this.element.height();result=this.element.children("li").filter(function(){var b=e(this).offset().top-c+d-e(this).height();return b<10&&b>-10});result.length||(result=this.element.children(":first"));this.activate(a,result)}else this.activate(a,this.element.children(!this.active||this.first()?":last":":first"))},hasScroll:function(){return this.element.height()<this.element.attr("scrollHeight")},select:function(a){this._trigger("selected",a,{item:this.active})}})})(jQuery);
+;/*
+ * jQuery UI Button 1.8.2
+ *
+ * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT (MIT-LICENSE.txt)
+ * and GPL (GPL-LICENSE.txt) licenses.
+ *
+ * http://docs.jquery.com/UI/Button
+ *
+ * Depends:
+ * jquery.ui.core.js
+ * jquery.ui.widget.js
+ */
+(function(a){var g,i=function(b){a(":ui-button",b.target.form).each(function(){var c=a(this).data("button");setTimeout(function(){c.refresh()},1)})},h=function(b){var c=b.name,d=b.form,e=a([]);if(c)e=d?a(d).find("[name='"+c+"']"):a("[name='"+c+"']",b.ownerDocument).filter(function(){return!this.form});return e};a.widget("ui.button",{options:{text:true,label:null,icons:{primary:null,secondary:null}},_create:function(){this.element.closest("form").unbind("reset.button").bind("reset.button",i);this._determineButtonType();
+this.hasTitle=!!this.buttonElement.attr("title");var b=this,c=this.options,d=this.type==="checkbox"||this.type==="radio",e="ui-state-hover"+(!d?" ui-state-active":"");if(c.label===null)c.label=this.buttonElement.html();if(this.element.is(":disabled"))c.disabled=true;this.buttonElement.addClass("ui-button ui-widget ui-state-default ui-corner-all").attr("role","button").bind("mouseenter.button",function(){if(!c.disabled){a(this).addClass("ui-state-hover");this===g&&a(this).addClass("ui-state-active")}}).bind("mouseleave.button",
+function(){c.disabled||a(this).removeClass(e)}).bind("focus.button",function(){a(this).addClass("ui-state-focus")}).bind("blur.button",function(){a(this).removeClass("ui-state-focus")});d&&this.element.bind("change.button",function(){b.refresh()});if(this.type==="checkbox")this.buttonElement.bind("click.button",function(){if(c.disabled)return false;a(this).toggleClass("ui-state-active");b.buttonElement.attr("aria-pressed",b.element[0].checked)});else if(this.type==="radio")this.buttonElement.bind("click.button",
+function(){if(c.disabled)return false;a(this).addClass("ui-state-active");b.buttonElement.attr("aria-pressed",true);var f=b.element[0];h(f).not(f).map(function(){return a(this).button("widget")[0]}).removeClass("ui-state-active").attr("aria-pressed",false)});else{this.buttonElement.bind("mousedown.button",function(){if(c.disabled)return false;a(this).addClass("ui-state-active");g=this;a(document).one("mouseup",function(){g=null})}).bind("mouseup.button",function(){if(c.disabled)return false;a(this).removeClass("ui-state-active")}).bind("keydown.button",
+function(f){if(c.disabled)return false;if(f.keyCode==a.ui.keyCode.SPACE||f.keyCode==a.ui.keyCode.ENTER)a(this).addClass("ui-state-active")}).bind("keyup.button",function(){a(this).removeClass("ui-state-active")});this.buttonElement.is("a")&&this.buttonElement.keyup(function(f){f.keyCode===a.ui.keyCode.SPACE&&a(this).click()})}this._setOption("disabled",c.disabled)},_determineButtonType:function(){this.type=this.element.is(":checkbox")?"checkbox":this.element.is(":radio")?"radio":this.element.is("input")?
+"input":"button";if(this.type==="checkbox"||this.type==="radio"){this.buttonElement=this.element.parents().last().find("[for="+this.element.attr("id")+"]");this.element.addClass("ui-helper-hidden-accessible");var b=this.element.is(":checked");b&&this.buttonElement.addClass("ui-state-active");this.buttonElement.attr("aria-pressed",b)}else this.buttonElement=this.element},widget:function(){return this.buttonElement},destroy:function(){this.element.removeClass("ui-helper-hidden-accessible");this.buttonElement.removeClass("ui-button ui-widget ui-state-default ui-corner-all ui-state-hover ui-state-active ui-button-icons-only ui-button-icon-only ui-button-text-icons ui-button-text-icon ui-button-text-only").removeAttr("role").removeAttr("aria-pressed").html(this.buttonElement.find(".ui-button-text").html());
+this.hasTitle||this.buttonElement.removeAttr("title");a.Widget.prototype.destroy.call(this)},_setOption:function(b,c){a.Widget.prototype._setOption.apply(this,arguments);if(b==="disabled")c?this.element.attr("disabled",true):this.element.removeAttr("disabled");this._resetButton()},refresh:function(){var b=this.element.is(":disabled");b!==this.options.disabled&&this._setOption("disabled",b);if(this.type==="radio")h(this.element[0]).each(function(){a(this).is(":checked")?a(this).button("widget").addClass("ui-state-active").attr("aria-pressed",
+true):a(this).button("widget").removeClass("ui-state-active").attr("aria-pressed",false)});else if(this.type==="checkbox")this.element.is(":checked")?this.buttonElement.addClass("ui-state-active").attr("aria-pressed",true):this.buttonElement.removeClass("ui-state-active").attr("aria-pressed",false)},_resetButton:function(){if(this.type==="input")this.options.label&&this.element.val(this.options.label);else{var b=this.buttonElement.removeClass("ui-button-icons-only ui-button-icon-only ui-button-text-icons ui-button-text-icon ui-button-text-only"),
+c=a("<span></span>").addClass("ui-button-text").html(this.options.label).appendTo(b.empty()).text(),d=this.options.icons,e=d.primary&&d.secondary;if(d.primary||d.secondary){b.addClass("ui-button-text-icon"+(e?"s":""));d.primary&&b.prepend("<span class='ui-button-icon-primary ui-icon "+d.primary+"'></span>");d.secondary&&b.append("<span class='ui-button-icon-secondary ui-icon "+d.secondary+"'></span>");if(!this.options.text){b.addClass(e?"ui-button-icons-only":"ui-button-icon-only").removeClass("ui-button-text-icons ui-button-text-icon");
+this.hasTitle||b.attr("title",c)}}else b.addClass("ui-button-text-only")}}});a.widget("ui.buttonset",{_create:function(){this.element.addClass("ui-buttonset");this._init()},_init:function(){this.refresh()},_setOption:function(b,c){b==="disabled"&&this.buttons.button("option",b,c);a.Widget.prototype._setOption.apply(this,arguments)},refresh:function(){this.buttons=this.element.find(":button, :submit, :reset, :checkbox, :radio, a, :data(button)").filter(":ui-button").button("refresh").end().not(":ui-button").button().end().map(function(){return a(this).button("widget")[0]}).removeClass("ui-corner-all ui-corner-left ui-corner-right").filter(":first").addClass("ui-corner-left").end().filter(":last").addClass("ui-corner-right").end().end()},
+destroy:function(){this.element.removeClass("ui-buttonset");this.buttons.map(function(){return a(this).button("widget")[0]}).removeClass("ui-corner-left ui-corner-right").end().button("destroy");a.Widget.prototype.destroy.call(this)}})})(jQuery);
+;/*
+ * jQuery UI Dialog 1.8.2
+ *
+ * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT (MIT-LICENSE.txt)
+ * and GPL (GPL-LICENSE.txt) licenses.
+ *
+ * http://docs.jquery.com/UI/Dialog
+ *
+ * Depends:
+ * jquery.ui.core.js
+ * jquery.ui.widget.js
+ * jquery.ui.button.js
+ * jquery.ui.draggable.js
+ * jquery.ui.mouse.js
+ * jquery.ui.position.js
+ * jquery.ui.resizable.js
+ */
+(function(c){c.widget("ui.dialog",{options:{autoOpen:true,buttons:{},closeOnEscape:true,closeText:"close",dialogClass:"",draggable:true,hide:null,height:"auto",maxHeight:false,maxWidth:false,minHeight:150,minWidth:150,modal:false,position:"center",resizable:true,show:null,stack:true,title:"",width:300,zIndex:1E3},_create:function(){this.originalTitle=this.element.attr("title");var a=this,b=a.options,d=b.title||a.originalTitle||"&#160;",e=c.ui.dialog.getTitleId(a.element),g=(a.uiDialog=c("<div></div>")).appendTo(document.body).hide().addClass("ui-dialog ui-widget ui-widget-content ui-corner-all "+
+b.dialogClass).css({zIndex:b.zIndex}).attr("tabIndex",-1).css("outline",0).keydown(function(i){if(b.closeOnEscape&&i.keyCode&&i.keyCode===c.ui.keyCode.ESCAPE){a.close(i);i.preventDefault()}}).attr({role:"dialog","aria-labelledby":e}).mousedown(function(i){a.moveToTop(false,i)});a.element.show().removeAttr("title").addClass("ui-dialog-content ui-widget-content").appendTo(g);var f=(a.uiDialogTitlebar=c("<div></div>")).addClass("ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix").prependTo(g),
+h=c('<a href="#"></a>').addClass("ui-dialog-titlebar-close ui-corner-all").attr("role","button").hover(function(){h.addClass("ui-state-hover")},function(){h.removeClass("ui-state-hover")}).focus(function(){h.addClass("ui-state-focus")}).blur(function(){h.removeClass("ui-state-focus")}).click(function(i){a.close(i);return false}).appendTo(f);(a.uiDialogTitlebarCloseText=c("<span></span>")).addClass("ui-icon ui-icon-closethick").text(b.closeText).appendTo(h);c("<span></span>").addClass("ui-dialog-title").attr("id",
+e).html(d).prependTo(f);if(c.isFunction(b.beforeclose)&&!c.isFunction(b.beforeClose))b.beforeClose=b.beforeclose;f.find("*").add(f).disableSelection();b.draggable&&c.fn.draggable&&a._makeDraggable();b.resizable&&c.fn.resizable&&a._makeResizable();a._createButtons(b.buttons);a._isOpen=false;c.fn.bgiframe&&g.bgiframe()},_init:function(){this.options.autoOpen&&this.open()},destroy:function(){var a=this;a.overlay&&a.overlay.destroy();a.uiDialog.hide();a.element.unbind(".dialog").removeData("dialog").removeClass("ui-dialog-content ui-widget-content").hide().appendTo("body");
+a.uiDialog.remove();a.originalTitle&&a.element.attr("title",a.originalTitle);return a},widget:function(){return this.uiDialog},close:function(a){var b=this,d;if(false!==b._trigger("beforeClose",a)){b.overlay&&b.overlay.destroy();b.uiDialog.unbind("keypress.ui-dialog");b._isOpen=false;if(b.options.hide)b.uiDialog.hide(b.options.hide,function(){b._trigger("close",a)});else{b.uiDialog.hide();b._trigger("close",a)}c.ui.dialog.overlay.resize();if(b.options.modal){d=0;c(".ui-dialog").each(function(){if(this!==
+b.uiDialog[0])d=Math.max(d,c(this).css("z-index"))});c.ui.dialog.maxZ=d}return b}},isOpen:function(){return this._isOpen},moveToTop:function(a,b){var d=this,e=d.options;if(e.modal&&!a||!e.stack&&!e.modal)return d._trigger("focus",b);if(e.zIndex>c.ui.dialog.maxZ)c.ui.dialog.maxZ=e.zIndex;if(d.overlay){c.ui.dialog.maxZ+=1;d.overlay.$el.css("z-index",c.ui.dialog.overlay.maxZ=c.ui.dialog.maxZ)}a={scrollTop:d.element.attr("scrollTop"),scrollLeft:d.element.attr("scrollLeft")};c.ui.dialog.maxZ+=1;d.uiDialog.css("z-index",
+c.ui.dialog.maxZ);d.element.attr(a);d._trigger("focus",b);return d},open:function(){if(!this._isOpen){var a=this,b=a.options,d=a.uiDialog;a.overlay=b.modal?new c.ui.dialog.overlay(a):null;d.next().length&&d.appendTo("body");a._size();a._position(b.position);d.show(b.show);a.moveToTop(true);b.modal&&d.bind("keypress.ui-dialog",function(e){if(e.keyCode===c.ui.keyCode.TAB){var g=c(":tabbable",this),f=g.filter(":first");g=g.filter(":last");if(e.target===g[0]&&!e.shiftKey){f.focus(1);return false}else if(e.target===
+f[0]&&e.shiftKey){g.focus(1);return false}}});c([]).add(d.find(".ui-dialog-content :tabbable:first")).add(d.find(".ui-dialog-buttonpane :tabbable:first")).add(d).filter(":first").focus();a._trigger("open");a._isOpen=true;return a}},_createButtons:function(a){var b=this,d=false,e=c("<div></div>").addClass("ui-dialog-buttonpane ui-widget-content ui-helper-clearfix");b.uiDialog.find(".ui-dialog-buttonpane").remove();typeof a==="object"&&a!==null&&c.each(a,function(){return!(d=true)});if(d){c.each(a,
+function(g,f){g=c('<button type="button"></button>').text(g).click(function(){f.apply(b.element[0],arguments)}).appendTo(e);c.fn.button&&g.button()});e.appendTo(b.uiDialog)}},_makeDraggable:function(){function a(f){return{position:f.position,offset:f.offset}}var b=this,d=b.options,e=c(document),g;b.uiDialog.draggable({cancel:".ui-dialog-content, .ui-dialog-titlebar-close",handle:".ui-dialog-titlebar",containment:"document",start:function(f,h){g=d.height==="auto"?"auto":c(this).height();c(this).height(c(this).height()).addClass("ui-dialog-dragging");
+b._trigger("dragStart",f,a(h))},drag:function(f,h){b._trigger("drag",f,a(h))},stop:function(f,h){d.position=[h.position.left-e.scrollLeft(),h.position.top-e.scrollTop()];c(this).removeClass("ui-dialog-dragging").height(g);b._trigger("dragStop",f,a(h));c.ui.dialog.overlay.resize()}})},_makeResizable:function(a){function b(f){return{originalPosition:f.originalPosition,originalSize:f.originalSize,position:f.position,size:f.size}}a=a===undefined?this.options.resizable:a;var d=this,e=d.options,g=d.uiDialog.css("position");
+a=typeof a==="string"?a:"n,e,s,w,se,sw,ne,nw";d.uiDialog.resizable({cancel:".ui-dialog-content",containment:"document",alsoResize:d.element,maxWidth:e.maxWidth,maxHeight:e.maxHeight,minWidth:e.minWidth,minHeight:d._minHeight(),handles:a,start:function(f,h){c(this).addClass("ui-dialog-resizing");d._trigger("resizeStart",f,b(h))},resize:function(f,h){d._trigger("resize",f,b(h))},stop:function(f,h){c(this).removeClass("ui-dialog-resizing");e.height=c(this).height();e.width=c(this).width();d._trigger("resizeStop",
+f,b(h));c.ui.dialog.overlay.resize()}}).css("position",g).find(".ui-resizable-se").addClass("ui-icon ui-icon-grip-diagonal-se")},_minHeight:function(){var a=this.options;return a.height==="auto"?a.minHeight:Math.min(a.minHeight,a.height)},_position:function(a){var b=[],d=[0,0];a=a||c.ui.dialog.prototype.options.position;if(typeof a==="string"||typeof a==="object"&&"0"in a){b=a.split?a.split(" "):[a[0],a[1]];if(b.length===1)b[1]=b[0];c.each(["left","top"],function(e,g){if(+b[e]===b[e]){d[e]=b[e];b[e]=
+g}})}else if(typeof a==="object"){if("left"in a){b[0]="left";d[0]=a.left}else if("right"in a){b[0]="right";d[0]=-a.right}if("top"in a){b[1]="top";d[1]=a.top}else if("bottom"in a){b[1]="bottom";d[1]=-a.bottom}}(a=this.uiDialog.is(":visible"))||this.uiDialog.show();this.uiDialog.css({top:0,left:0}).position({my:b.join(" "),at:b.join(" "),offset:d.join(" "),of:window,collision:"fit",using:function(e){var g=c(this).css(e).offset().top;g<0&&c(this).css("top",e.top-g)}});a||this.uiDialog.hide()},_setOption:function(a,
+b){var d=this,e=d.uiDialog,g=e.is(":data(resizable)"),f=false;switch(a){case "beforeclose":a="beforeClose";break;case "buttons":d._createButtons(b);break;case "closeText":d.uiDialogTitlebarCloseText.text(""+b);break;case "dialogClass":e.removeClass(d.options.dialogClass).addClass("ui-dialog ui-widget ui-widget-content ui-corner-all "+b);break;case "disabled":b?e.addClass("ui-dialog-disabled"):e.removeClass("ui-dialog-disabled");break;case "draggable":b?d._makeDraggable():e.draggable("destroy");break;
+case "height":f=true;break;case "maxHeight":g&&e.resizable("option","maxHeight",b);f=true;break;case "maxWidth":g&&e.resizable("option","maxWidth",b);f=true;break;case "minHeight":g&&e.resizable("option","minHeight",b);f=true;break;case "minWidth":g&&e.resizable("option","minWidth",b);f=true;break;case "position":d._position(b);break;case "resizable":g&&!b&&e.resizable("destroy");g&&typeof b==="string"&&e.resizable("option","handles",b);!g&&b!==false&&d._makeResizable(b);break;case "title":c(".ui-dialog-title",
+d.uiDialogTitlebar).html(""+(b||"&#160;"));break;case "width":f=true;break}c.Widget.prototype._setOption.apply(d,arguments);f&&d._size()},_size:function(){var a=this.options,b;this.element.css({width:"auto",minHeight:0,height:0});b=this.uiDialog.css({height:"auto",width:a.width}).height();this.element.css(a.height==="auto"?{minHeight:Math.max(a.minHeight-b,0),height:"auto"}:{minHeight:0,height:Math.max(a.height-b,0)}).show();this.uiDialog.is(":data(resizable)")&&this.uiDialog.resizable("option","minHeight",
+this._minHeight())}});c.extend(c.ui.dialog,{version:"1.8.2",uuid:0,maxZ:0,getTitleId:function(a){a=a.attr("id");if(!a){this.uuid+=1;a=this.uuid}return"ui-dialog-title-"+a},overlay:function(a){this.$el=c.ui.dialog.overlay.create(a)}});c.extend(c.ui.dialog.overlay,{instances:[],oldInstances:[],maxZ:0,events:c.map("focus,mousedown,mouseup,keydown,keypress,click".split(","),function(a){return a+".dialog-overlay"}).join(" "),create:function(a){if(this.instances.length===0){setTimeout(function(){c.ui.dialog.overlay.instances.length&&
+c(document).bind(c.ui.dialog.overlay.events,function(d){return c(d.target).zIndex()>=c.ui.dialog.overlay.maxZ})},1);c(document).bind("keydown.dialog-overlay",function(d){if(a.options.closeOnEscape&&d.keyCode&&d.keyCode===c.ui.keyCode.ESCAPE){a.close(d);d.preventDefault()}});c(window).bind("resize.dialog-overlay",c.ui.dialog.overlay.resize)}var b=(this.oldInstances.pop()||c("<div></div>").addClass("ui-widget-overlay")).appendTo(document.body).css({width:this.width(),height:this.height()});c.fn.bgiframe&&
+b.bgiframe();this.instances.push(b);return b},destroy:function(a){this.oldInstances.push(this.instances.splice(c.inArray(a,this.instances),1)[0]);this.instances.length===0&&c([document,window]).unbind(".dialog-overlay");a.remove();var b=0;c.each(this.instances,function(){b=Math.max(b,this.css("z-index"))});this.maxZ=b},height:function(){var a,b;if(c.browser.msie&&c.browser.version<7){a=Math.max(document.documentElement.scrollHeight,document.body.scrollHeight);b=Math.max(document.documentElement.offsetHeight,
+document.body.offsetHeight);return a<b?c(window).height()+"px":a+"px"}else return c(document).height()+"px"},width:function(){var a,b;if(c.browser.msie&&c.browser.version<7){a=Math.max(document.documentElement.scrollWidth,document.body.scrollWidth);b=Math.max(document.documentElement.offsetWidth,document.body.offsetWidth);return a<b?c(window).width()+"px":a+"px"}else return c(document).width()+"px"},resize:function(){var a=c([]);c.each(c.ui.dialog.overlay.instances,function(){a=a.add(this)});a.css({width:0,
+height:0}).css({width:c.ui.dialog.overlay.width(),height:c.ui.dialog.overlay.height()})}});c.extend(c.ui.dialog.overlay.prototype,{destroy:function(){c.ui.dialog.overlay.destroy(this.$el)}})})(jQuery);
+;/*
+ * jQuery UI Tabs 1.8.2
+ *
+ * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT (MIT-LICENSE.txt)
+ * and GPL (GPL-LICENSE.txt) licenses.
+ *
+ * http://docs.jquery.com/UI/Tabs
+ *
+ * Depends:
+ * jquery.ui.core.js
+ * jquery.ui.widget.js
+ */
+(function(d){function s(){return++u}function v(){return++w}var u=0,w=0;d.widget("ui.tabs",{options:{add:null,ajaxOptions:null,cache:false,cookie:null,collapsible:false,disable:null,disabled:[],enable:null,event:"click",fx:null,idPrefix:"ui-tabs-",load:null,panelTemplate:"<div></div>",remove:null,select:null,show:null,spinner:"<em>Loading&#8230;</em>",tabTemplate:'<li><a href="#{href}"><span>#{label}</span></a></li>'},_create:function(){this._tabify(true)},_setOption:function(c,e){if(c=="selected")this.options.collapsible&&
+e==this.options.selected||this.select(e);else{this.options[c]=e;this._tabify()}},_tabId:function(c){return c.title&&c.title.replace(/\s/g,"_").replace(/[^A-Za-z0-9\-_:\.]/g,"")||this.options.idPrefix+s()},_sanitizeSelector:function(c){return c.replace(/:/g,"\\:")},_cookie:function(){var c=this.cookie||(this.cookie=this.options.cookie.name||"ui-tabs-"+v());return d.cookie.apply(null,[c].concat(d.makeArray(arguments)))},_ui:function(c,e){return{tab:c,panel:e,index:this.anchors.index(c)}},_cleanup:function(){this.lis.filter(".ui-state-processing").removeClass("ui-state-processing").find("span:data(label.tabs)").each(function(){var c=
+d(this);c.html(c.data("label.tabs")).removeData("label.tabs")})},_tabify:function(c){function e(g,f){g.css({display:""});!d.support.opacity&&f.opacity&&g[0].style.removeAttribute("filter")}this.list=this.element.find("ol,ul").eq(0);this.lis=d("li:has(a[href])",this.list);this.anchors=this.lis.map(function(){return d("a",this)[0]});this.panels=d([]);var a=this,b=this.options,h=/^#.+/;this.anchors.each(function(g,f){var j=d(f).attr("href"),l=j.split("#")[0],p;if(l&&(l===location.toString().split("#")[0]||
+(p=d("base")[0])&&l===p.href)){j=f.hash;f.href=j}if(h.test(j))a.panels=a.panels.add(a._sanitizeSelector(j));else if(j!="#"){d.data(f,"href.tabs",j);d.data(f,"load.tabs",j.replace(/#.*$/,""));j=a._tabId(f);f.href="#"+j;f=d("#"+j);if(!f.length){f=d(b.panelTemplate).attr("id",j).addClass("ui-tabs-panel ui-widget-content ui-corner-bottom").insertAfter(a.panels[g-1]||a.list);f.data("destroy.tabs",true)}a.panels=a.panels.add(f)}else b.disabled.push(g)});if(c){this.element.addClass("ui-tabs ui-widget ui-widget-content ui-corner-all");
+this.list.addClass("ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all");this.lis.addClass("ui-state-default ui-corner-top");this.panels.addClass("ui-tabs-panel ui-widget-content ui-corner-bottom");if(b.selected===undefined){location.hash&&this.anchors.each(function(g,f){if(f.hash==location.hash){b.selected=g;return false}});if(typeof b.selected!="number"&&b.cookie)b.selected=parseInt(a._cookie(),10);if(typeof b.selected!="number"&&this.lis.filter(".ui-tabs-selected").length)b.selected=
+this.lis.index(this.lis.filter(".ui-tabs-selected"));b.selected=b.selected||(this.lis.length?0:-1)}else if(b.selected===null)b.selected=-1;b.selected=b.selected>=0&&this.anchors[b.selected]||b.selected<0?b.selected:0;b.disabled=d.unique(b.disabled.concat(d.map(this.lis.filter(".ui-state-disabled"),function(g){return a.lis.index(g)}))).sort();d.inArray(b.selected,b.disabled)!=-1&&b.disabled.splice(d.inArray(b.selected,b.disabled),1);this.panels.addClass("ui-tabs-hide");this.lis.removeClass("ui-tabs-selected ui-state-active");
+if(b.selected>=0&&this.anchors.length){this.panels.eq(b.selected).removeClass("ui-tabs-hide");this.lis.eq(b.selected).addClass("ui-tabs-selected ui-state-active");a.element.queue("tabs",function(){a._trigger("show",null,a._ui(a.anchors[b.selected],a.panels[b.selected]))});this.load(b.selected)}d(window).bind("unload",function(){a.lis.add(a.anchors).unbind(".tabs");a.lis=a.anchors=a.panels=null})}else b.selected=this.lis.index(this.lis.filter(".ui-tabs-selected"));this.element[b.collapsible?"addClass":
+"removeClass"]("ui-tabs-collapsible");b.cookie&&this._cookie(b.selected,b.cookie);c=0;for(var i;i=this.lis[c];c++)d(i)[d.inArray(c,b.disabled)!=-1&&!d(i).hasClass("ui-tabs-selected")?"addClass":"removeClass"]("ui-state-disabled");b.cache===false&&this.anchors.removeData("cache.tabs");this.lis.add(this.anchors).unbind(".tabs");if(b.event!="mouseover"){var k=function(g,f){f.is(":not(.ui-state-disabled)")&&f.addClass("ui-state-"+g)},n=function(g,f){f.removeClass("ui-state-"+g)};this.lis.bind("mouseover.tabs",
+function(){k("hover",d(this))});this.lis.bind("mouseout.tabs",function(){n("hover",d(this))});this.anchors.bind("focus.tabs",function(){k("focus",d(this).closest("li"))});this.anchors.bind("blur.tabs",function(){n("focus",d(this).closest("li"))})}var m,o;if(b.fx)if(d.isArray(b.fx)){m=b.fx[0];o=b.fx[1]}else m=o=b.fx;var q=o?function(g,f){d(g).closest("li").addClass("ui-tabs-selected ui-state-active");f.hide().removeClass("ui-tabs-hide").animate(o,o.duration||"normal",function(){e(f,o);a._trigger("show",
+null,a._ui(g,f[0]))})}:function(g,f){d(g).closest("li").addClass("ui-tabs-selected ui-state-active");f.removeClass("ui-tabs-hide");a._trigger("show",null,a._ui(g,f[0]))},r=m?function(g,f){f.animate(m,m.duration||"normal",function(){a.lis.removeClass("ui-tabs-selected ui-state-active");f.addClass("ui-tabs-hide");e(f,m);a.element.dequeue("tabs")})}:function(g,f){a.lis.removeClass("ui-tabs-selected ui-state-active");f.addClass("ui-tabs-hide");a.element.dequeue("tabs")};this.anchors.bind(b.event+".tabs",
+function(){var g=this,f=d(this).closest("li"),j=a.panels.filter(":not(.ui-tabs-hide)"),l=d(a._sanitizeSelector(this.hash));if(f.hasClass("ui-tabs-selected")&&!b.collapsible||f.hasClass("ui-state-disabled")||f.hasClass("ui-state-processing")||a._trigger("select",null,a._ui(this,l[0]))===false){this.blur();return false}b.selected=a.anchors.index(this);a.abort();if(b.collapsible)if(f.hasClass("ui-tabs-selected")){b.selected=-1;b.cookie&&a._cookie(b.selected,b.cookie);a.element.queue("tabs",function(){r(g,
+j)}).dequeue("tabs");this.blur();return false}else if(!j.length){b.cookie&&a._cookie(b.selected,b.cookie);a.element.queue("tabs",function(){q(g,l)});a.load(a.anchors.index(this));this.blur();return false}b.cookie&&a._cookie(b.selected,b.cookie);if(l.length){j.length&&a.element.queue("tabs",function(){r(g,j)});a.element.queue("tabs",function(){q(g,l)});a.load(a.anchors.index(this))}else throw"jQuery UI Tabs: Mismatching fragment identifier.";d.browser.msie&&this.blur()});this.anchors.bind("click.tabs",
+function(){return false})},destroy:function(){var c=this.options;this.abort();this.element.unbind(".tabs").removeClass("ui-tabs ui-widget ui-widget-content ui-corner-all ui-tabs-collapsible").removeData("tabs");this.list.removeClass("ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all");this.anchors.each(function(){var e=d.data(this,"href.tabs");if(e)this.href=e;var a=d(this).unbind(".tabs");d.each(["href","load","cache"],function(b,h){a.removeData(h+".tabs")})});this.lis.unbind(".tabs").add(this.panels).each(function(){d.data(this,
+"destroy.tabs")?d(this).remove():d(this).removeClass("ui-state-default ui-corner-top ui-tabs-selected ui-state-active ui-state-hover ui-state-focus ui-state-disabled ui-tabs-panel ui-widget-content ui-corner-bottom ui-tabs-hide")});c.cookie&&this._cookie(null,c.cookie);return this},add:function(c,e,a){if(a===undefined)a=this.anchors.length;var b=this,h=this.options;e=d(h.tabTemplate.replace(/#\{href\}/g,c).replace(/#\{label\}/g,e));c=!c.indexOf("#")?c.replace("#",""):this._tabId(d("a",e)[0]);e.addClass("ui-state-default ui-corner-top").data("destroy.tabs",
+true);var i=d("#"+c);i.length||(i=d(h.panelTemplate).attr("id",c).data("destroy.tabs",true));i.addClass("ui-tabs-panel ui-widget-content ui-corner-bottom ui-tabs-hide");if(a>=this.lis.length){e.appendTo(this.list);i.appendTo(this.list[0].parentNode)}else{e.insertBefore(this.lis[a]);i.insertBefore(this.panels[a])}h.disabled=d.map(h.disabled,function(k){return k>=a?++k:k});this._tabify();if(this.anchors.length==1){h.selected=0;e.addClass("ui-tabs-selected ui-state-active");i.removeClass("ui-tabs-hide");
+this.element.queue("tabs",function(){b._trigger("show",null,b._ui(b.anchors[0],b.panels[0]))});this.load(0)}this._trigger("add",null,this._ui(this.anchors[a],this.panels[a]));return this},remove:function(c){var e=this.options,a=this.lis.eq(c).remove(),b=this.panels.eq(c).remove();if(a.hasClass("ui-tabs-selected")&&this.anchors.length>1)this.select(c+(c+1<this.anchors.length?1:-1));e.disabled=d.map(d.grep(e.disabled,function(h){return h!=c}),function(h){return h>=c?--h:h});this._tabify();this._trigger("remove",
+null,this._ui(a.find("a")[0],b[0]));return this},enable:function(c){var e=this.options;if(d.inArray(c,e.disabled)!=-1){this.lis.eq(c).removeClass("ui-state-disabled");e.disabled=d.grep(e.disabled,function(a){return a!=c});this._trigger("enable",null,this._ui(this.anchors[c],this.panels[c]));return this}},disable:function(c){var e=this.options;if(c!=e.selected){this.lis.eq(c).addClass("ui-state-disabled");e.disabled.push(c);e.disabled.sort();this._trigger("disable",null,this._ui(this.anchors[c],this.panels[c]))}return this},
+select:function(c){if(typeof c=="string")c=this.anchors.index(this.anchors.filter("[href$="+c+"]"));else if(c===null)c=-1;if(c==-1&&this.options.collapsible)c=this.options.selected;this.anchors.eq(c).trigger(this.options.event+".tabs");return this},load:function(c){var e=this,a=this.options,b=this.anchors.eq(c)[0],h=d.data(b,"load.tabs");this.abort();if(!h||this.element.queue("tabs").length!==0&&d.data(b,"cache.tabs"))this.element.dequeue("tabs");else{this.lis.eq(c).addClass("ui-state-processing");
+if(a.spinner){var i=d("span",b);i.data("label.tabs",i.html()).html(a.spinner)}this.xhr=d.ajax(d.extend({},a.ajaxOptions,{url:h,success:function(k,n){d(e._sanitizeSelector(b.hash)).html(k);e._cleanup();a.cache&&d.data(b,"cache.tabs",true);e._trigger("load",null,e._ui(e.anchors[c],e.panels[c]));try{a.ajaxOptions.success(k,n)}catch(m){}},error:function(k,n){e._cleanup();e._trigger("load",null,e._ui(e.anchors[c],e.panels[c]));try{a.ajaxOptions.error(k,n,c,b)}catch(m){}}}));e.element.dequeue("tabs");return this}},
+abort:function(){this.element.queue([]);this.panels.stop(false,true);this.element.queue("tabs",this.element.queue("tabs").splice(-2,2));if(this.xhr){this.xhr.abort();delete this.xhr}this._cleanup();return this},url:function(c,e){this.anchors.eq(c).removeData("cache.tabs").data("load.tabs",e);return this},length:function(){return this.anchors.length}});d.extend(d.ui.tabs,{version:"1.8.2"});d.extend(d.ui.tabs.prototype,{rotation:null,rotate:function(c,e){var a=this,b=this.options,h=a._rotate||(a._rotate=
+function(i){clearTimeout(a.rotation);a.rotation=setTimeout(function(){var k=b.selected;a.select(++k<a.anchors.length?k:0)},c);i&&i.stopPropagation()});e=a._unrotate||(a._unrotate=!e?function(i){i.clientX&&a.rotate(null)}:function(){t=b.selected;h()});if(c){this.element.bind("tabsshow",h);this.anchors.bind(b.event+".tabs",e);h()}else{clearTimeout(a.rotation);this.element.unbind("tabsshow",h);this.anchors.unbind(b.event+".tabs",e);delete this._rotate;delete this._unrotate}return this}})})(jQuery);
+;/*
+ * jQuery UI Effects 1.8.2
+ *
+ * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT (MIT-LICENSE.txt)
+ * and GPL (GPL-LICENSE.txt) licenses.
+ *
+ * http://docs.jquery.com/UI/Effects/
+ */
+jQuery.effects||function(f){function k(c){var a;if(c&&c.constructor==Array&&c.length==3)return c;if(a=/rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(c))return[parseInt(a[1],10),parseInt(a[2],10),parseInt(a[3],10)];if(a=/rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(c))return[parseFloat(a[1])*2.55,parseFloat(a[2])*2.55,parseFloat(a[3])*2.55];if(a=/#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(c))return[parseInt(a[1],
+16),parseInt(a[2],16),parseInt(a[3],16)];if(a=/#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(c))return[parseInt(a[1]+a[1],16),parseInt(a[2]+a[2],16),parseInt(a[3]+a[3],16)];if(/rgba\(0, 0, 0, 0\)/.exec(c))return l.transparent;return l[f.trim(c).toLowerCase()]}function q(c,a){var b;do{b=f.curCSS(c,a);if(b!=""&&b!="transparent"||f.nodeName(c,"body"))break;a="backgroundColor"}while(c=c.parentNode);return k(b)}function m(){var c=document.defaultView?document.defaultView.getComputedStyle(this,null):this.currentStyle,
+a={},b,d;if(c&&c.length&&c[0]&&c[c[0]])for(var e=c.length;e--;){b=c[e];if(typeof c[b]=="string"){d=b.replace(/\-(\w)/g,function(g,h){return h.toUpperCase()});a[d]=c[b]}}else for(b in c)if(typeof c[b]==="string")a[b]=c[b];return a}function n(c){var a,b;for(a in c){b=c[a];if(b==null||f.isFunction(b)||a in r||/scrollbar/.test(a)||!/color/i.test(a)&&isNaN(parseFloat(b)))delete c[a]}return c}function s(c,a){var b={_:0},d;for(d in a)if(c[d]!=a[d])b[d]=a[d];return b}function j(c,a,b,d){if(typeof c=="object"){d=
+a;b=null;a=c;c=a.effect}if(f.isFunction(a)){d=a;b=null;a={}}if(f.isFunction(b)){d=b;b=null}if(typeof a=="number"||f.fx.speeds[a]){d=b;b=a;a={}}a=a||{};b=b||a.duration;b=f.fx.off?0:typeof b=="number"?b:f.fx.speeds[b]||f.fx.speeds._default;d=d||a.complete;return[c,a,b,d]}f.effects={};f.each(["backgroundColor","borderBottomColor","borderLeftColor","borderRightColor","borderTopColor","color","outlineColor"],function(c,a){f.fx.step[a]=function(b){if(!b.colorInit){b.start=q(b.elem,a);b.end=k(b.end);b.colorInit=
+true}b.elem.style[a]="rgb("+Math.max(Math.min(parseInt(b.pos*(b.end[0]-b.start[0])+b.start[0],10),255),0)+","+Math.max(Math.min(parseInt(b.pos*(b.end[1]-b.start[1])+b.start[1],10),255),0)+","+Math.max(Math.min(parseInt(b.pos*(b.end[2]-b.start[2])+b.start[2],10),255),0)+")"}});var l={aqua:[0,255,255],azure:[240,255,255],beige:[245,245,220],black:[0,0,0],blue:[0,0,255],brown:[165,42,42],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgrey:[169,169,169],darkgreen:[0,100,0],darkkhaki:[189,
+183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkviolet:[148,0,211],fuchsia:[255,0,255],gold:[255,215,0],green:[0,128,0],indigo:[75,0,130],khaki:[240,230,140],lightblue:[173,216,230],lightcyan:[224,255,255],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightyellow:[255,255,224],lime:[0,255,0],magenta:[255,0,255],maroon:[128,0,0],navy:[0,0,128],olive:[128,128,0],orange:[255,
+165,0],pink:[255,192,203],purple:[128,0,128],violet:[128,0,128],red:[255,0,0],silver:[192,192,192],white:[255,255,255],yellow:[255,255,0],transparent:[255,255,255]},o=["add","remove","toggle"],r={border:1,borderBottom:1,borderColor:1,borderLeft:1,borderRight:1,borderTop:1,borderWidth:1,margin:1,padding:1};f.effects.animateClass=function(c,a,b,d){if(f.isFunction(b)){d=b;b=null}return this.each(function(){var e=f(this),g=e.attr("style")||" ",h=n(m.call(this)),p,t=e.attr("className");f.each(o,function(u,
+i){c[i]&&e[i+"Class"](c[i])});p=n(m.call(this));e.attr("className",t);e.animate(s(h,p),a,b,function(){f.each(o,function(u,i){c[i]&&e[i+"Class"](c[i])});if(typeof e.attr("style")=="object"){e.attr("style").cssText="";e.attr("style").cssText=g}else e.attr("style",g);d&&d.apply(this,arguments)})})};f.fn.extend({_addClass:f.fn.addClass,addClass:function(c,a,b,d){return a?f.effects.animateClass.apply(this,[{add:c},a,b,d]):this._addClass(c)},_removeClass:f.fn.removeClass,removeClass:function(c,a,b,d){return a?
+f.effects.animateClass.apply(this,[{remove:c},a,b,d]):this._removeClass(c)},_toggleClass:f.fn.toggleClass,toggleClass:function(c,a,b,d,e){return typeof a=="boolean"||a===undefined?b?f.effects.animateClass.apply(this,[a?{add:c}:{remove:c},b,d,e]):this._toggleClass(c,a):f.effects.animateClass.apply(this,[{toggle:c},a,b,d])},switchClass:function(c,a,b,d,e){return f.effects.animateClass.apply(this,[{add:a,remove:c},b,d,e])}});f.extend(f.effects,{version:"1.8.2",save:function(c,a){for(var b=0;b<a.length;b++)a[b]!==
+null&&c.data("ec.storage."+a[b],c[0].style[a[b]])},restore:function(c,a){for(var b=0;b<a.length;b++)a[b]!==null&&c.css(a[b],c.data("ec.storage."+a[b]))},setMode:function(c,a){if(a=="toggle")a=c.is(":hidden")?"show":"hide";return a},getBaseline:function(c,a){var b;switch(c[0]){case "top":b=0;break;case "middle":b=0.5;break;case "bottom":b=1;break;default:b=c[0]/a.height}switch(c[1]){case "left":c=0;break;case "center":c=0.5;break;case "right":c=1;break;default:c=c[1]/a.width}return{x:c,y:b}},createWrapper:function(c){if(c.parent().is(".ui-effects-wrapper"))return c.parent();
+var a={width:c.outerWidth(true),height:c.outerHeight(true),"float":c.css("float")},b=f("<div></div>").addClass("ui-effects-wrapper").css({fontSize:"100%",background:"transparent",border:"none",margin:0,padding:0});c.wrap(b);b=c.parent();if(c.css("position")=="static"){b.css({position:"relative"});c.css({position:"relative"})}else{f.extend(a,{position:c.css("position"),zIndex:c.css("z-index")});f.each(["top","left","bottom","right"],function(d,e){a[e]=c.css(e);if(isNaN(parseInt(a[e],10)))a[e]="auto"});
+c.css({position:"relative",top:0,left:0})}return b.css(a).show()},removeWrapper:function(c){if(c.parent().is(".ui-effects-wrapper"))return c.parent().replaceWith(c);return c},setTransition:function(c,a,b,d){d=d||{};f.each(a,function(e,g){unit=c.cssUnit(g);if(unit[0]>0)d[g]=unit[0]*b+unit[1]});return d}});f.fn.extend({effect:function(c){var a=j.apply(this,arguments);a={options:a[1],duration:a[2],callback:a[3]};var b=f.effects[c];return b&&!f.fx.off?b.call(this,a):this},_show:f.fn.show,show:function(c){if(!c||
+typeof c=="number"||f.fx.speeds[c])return this._show.apply(this,arguments);else{var a=j.apply(this,arguments);a[1].mode="show";return this.effect.apply(this,a)}},_hide:f.fn.hide,hide:function(c){if(!c||typeof c=="number"||f.fx.speeds[c])return this._hide.apply(this,arguments);else{var a=j.apply(this,arguments);a[1].mode="hide";return this.effect.apply(this,a)}},__toggle:f.fn.toggle,toggle:function(c){if(!c||typeof c=="number"||f.fx.speeds[c]||typeof c=="boolean"||f.isFunction(c))return this.__toggle.apply(this,
+arguments);else{var a=j.apply(this,arguments);a[1].mode="toggle";return this.effect.apply(this,a)}},cssUnit:function(c){var a=this.css(c),b=[];f.each(["em","px","%","pt"],function(d,e){if(a.indexOf(e)>0)b=[parseFloat(a),e]});return b}});f.easing.jswing=f.easing.swing;f.extend(f.easing,{def:"easeOutQuad",swing:function(c,a,b,d,e){return f.easing[f.easing.def](c,a,b,d,e)},easeInQuad:function(c,a,b,d,e){return d*(a/=e)*a+b},easeOutQuad:function(c,a,b,d,e){return-d*(a/=e)*(a-2)+b},easeInOutQuad:function(c,
+a,b,d,e){if((a/=e/2)<1)return d/2*a*a+b;return-d/2*(--a*(a-2)-1)+b},easeInCubic:function(c,a,b,d,e){return d*(a/=e)*a*a+b},easeOutCubic:function(c,a,b,d,e){return d*((a=a/e-1)*a*a+1)+b},easeInOutCubic:function(c,a,b,d,e){if((a/=e/2)<1)return d/2*a*a*a+b;return d/2*((a-=2)*a*a+2)+b},easeInQuart:function(c,a,b,d,e){return d*(a/=e)*a*a*a+b},easeOutQuart:function(c,a,b,d,e){return-d*((a=a/e-1)*a*a*a-1)+b},easeInOutQuart:function(c,a,b,d,e){if((a/=e/2)<1)return d/2*a*a*a*a+b;return-d/2*((a-=2)*a*a*a-2)+
+b},easeInQuint:function(c,a,b,d,e){return d*(a/=e)*a*a*a*a+b},easeOutQuint:function(c,a,b,d,e){return d*((a=a/e-1)*a*a*a*a+1)+b},easeInOutQuint:function(c,a,b,d,e){if((a/=e/2)<1)return d/2*a*a*a*a*a+b;return d/2*((a-=2)*a*a*a*a+2)+b},easeInSine:function(c,a,b,d,e){return-d*Math.cos(a/e*(Math.PI/2))+d+b},easeOutSine:function(c,a,b,d,e){return d*Math.sin(a/e*(Math.PI/2))+b},easeInOutSine:function(c,a,b,d,e){return-d/2*(Math.cos(Math.PI*a/e)-1)+b},easeInExpo:function(c,a,b,d,e){return a==0?b:d*Math.pow(2,
+10*(a/e-1))+b},easeOutExpo:function(c,a,b,d,e){return a==e?b+d:d*(-Math.pow(2,-10*a/e)+1)+b},easeInOutExpo:function(c,a,b,d,e){if(a==0)return b;if(a==e)return b+d;if((a/=e/2)<1)return d/2*Math.pow(2,10*(a-1))+b;return d/2*(-Math.pow(2,-10*--a)+2)+b},easeInCirc:function(c,a,b,d,e){return-d*(Math.sqrt(1-(a/=e)*a)-1)+b},easeOutCirc:function(c,a,b,d,e){return d*Math.sqrt(1-(a=a/e-1)*a)+b},easeInOutCirc:function(c,a,b,d,e){if((a/=e/2)<1)return-d/2*(Math.sqrt(1-a*a)-1)+b;return d/2*(Math.sqrt(1-(a-=2)*
+a)+1)+b},easeInElastic:function(c,a,b,d,e){c=1.70158;var g=0,h=d;if(a==0)return b;if((a/=e)==1)return b+d;g||(g=e*0.3);if(h<Math.abs(d)){h=d;c=g/4}else c=g/(2*Math.PI)*Math.asin(d/h);return-(h*Math.pow(2,10*(a-=1))*Math.sin((a*e-c)*2*Math.PI/g))+b},easeOutElastic:function(c,a,b,d,e){c=1.70158;var g=0,h=d;if(a==0)return b;if((a/=e)==1)return b+d;g||(g=e*0.3);if(h<Math.abs(d)){h=d;c=g/4}else c=g/(2*Math.PI)*Math.asin(d/h);return h*Math.pow(2,-10*a)*Math.sin((a*e-c)*2*Math.PI/g)+d+b},easeInOutElastic:function(c,
+a,b,d,e){c=1.70158;var g=0,h=d;if(a==0)return b;if((a/=e/2)==2)return b+d;g||(g=e*0.3*1.5);if(h<Math.abs(d)){h=d;c=g/4}else c=g/(2*Math.PI)*Math.asin(d/h);if(a<1)return-0.5*h*Math.pow(2,10*(a-=1))*Math.sin((a*e-c)*2*Math.PI/g)+b;return h*Math.pow(2,-10*(a-=1))*Math.sin((a*e-c)*2*Math.PI/g)*0.5+d+b},easeInBack:function(c,a,b,d,e,g){if(g==undefined)g=1.70158;return d*(a/=e)*a*((g+1)*a-g)+b},easeOutBack:function(c,a,b,d,e,g){if(g==undefined)g=1.70158;return d*((a=a/e-1)*a*((g+1)*a+g)+1)+b},easeInOutBack:function(c,
+a,b,d,e,g){if(g==undefined)g=1.70158;if((a/=e/2)<1)return d/2*a*a*(((g*=1.525)+1)*a-g)+b;return d/2*((a-=2)*a*(((g*=1.525)+1)*a+g)+2)+b},easeInBounce:function(c,a,b,d,e){return d-f.easing.easeOutBounce(c,e-a,0,d,e)+b},easeOutBounce:function(c,a,b,d,e){return(a/=e)<1/2.75?d*7.5625*a*a+b:a<2/2.75?d*(7.5625*(a-=1.5/2.75)*a+0.75)+b:a<2.5/2.75?d*(7.5625*(a-=2.25/2.75)*a+0.9375)+b:d*(7.5625*(a-=2.625/2.75)*a+0.984375)+b},easeInOutBounce:function(c,a,b,d,e){if(a<e/2)return f.easing.easeInBounce(c,a*2,0,
+d,e)*0.5+b;return f.easing.easeOutBounce(c,a*2-e,0,d,e)*0.5+d*0.5+b}})}(jQuery);
+;/*
+ * jQuery UI Effects Fold 1.8.2
+ *
+ * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT (MIT-LICENSE.txt)
+ * and GPL (GPL-LICENSE.txt) licenses.
+ *
+ * http://docs.jquery.com/UI/Effects/Fold
+ *
+ * Depends:
+ * jquery.effects.core.js
+ */
+(function(c){c.effects.fold=function(a){return this.queue(function(){var b=c(this),j=["position","top","left"],d=c.effects.setMode(b,a.options.mode||"hide"),g=a.options.size||15,h=!!a.options.horizFirst,k=a.duration?a.duration/2:c.fx.speeds._default/2;c.effects.save(b,j);b.show();var e=c.effects.createWrapper(b).css({overflow:"hidden"}),f=d=="show"!=h,l=f?["width","height"]:["height","width"];f=f?[e.width(),e.height()]:[e.height(),e.width()];var i=/([0-9]+)%/.exec(g);if(i)g=parseInt(i[1],10)/100*
+f[d=="hide"?0:1];if(d=="show")e.css(h?{height:0,width:g}:{height:g,width:0});h={};i={};h[l[0]]=d=="show"?f[0]:g;i[l[1]]=d=="show"?f[1]:0;e.animate(h,k,a.options.easing).animate(i,k,a.options.easing,function(){d=="hide"&&b.hide();c.effects.restore(b,j);c.effects.removeWrapper(b);a.callback&&a.callback.apply(b[0],arguments);b.dequeue()})})}})(jQuery);
+;/*
+ * jQuery Highlight plugin
+ * Based on highlight v3 by Johann Burkard
+ * http://johannburkard.de/blog/programming/javascript/highlight-javascript-text-higlighting-jquery-plugin.html
+ * Copyright (c) 2009 Bartek Szopka http://bartaz.github.com/sandbox.js/jquery.highlight.html
+ * Licensed under MIT license.
+ */
+jQuery.extend({highlight:function(a,c,b,e){if(a.nodeType===3){if(c=a.data.match(c)){b=document.createElement(b||"span");b.className=e||"highlight";a=a.splitText(c.index);a.splitText(c[0].length);e=a.cloneNode(true);b.appendChild(e);a.parentNode.replaceChild(b,a);return 1}}else if(a.nodeType===1&&a.childNodes&&!/(script|style)/i.test(a.tagName)&&!(a.tagName===b.toUpperCase()&&a.className===e))for(var d=0;d<a.childNodes.length;d++)d+=jQuery.highlight(a.childNodes[d],c,b,e);return 0}});
+jQuery.fn.unhighlight=function(a){var c={className:"highlight",element:"span"};jQuery.extend(c,a);return this.find(c.element+"."+c.className).each(function(){var b=this.parentNode;b.replaceChild(this.firstChild,this);b.normalize()}).end()};
+jQuery.fn.highlight=function(a,c){var b={className:"highlight",element:"span",caseSensitive:false,wordsOnly:false};jQuery.extend(b,c);if(a.constructor===String)a=[a];a=jQuery.grep(a,function(f){return f!=""});if(a.length==0)return this;var e=b.caseSensitive?"":"i",d="("+a.join("|")+")";if(b.wordsOnly)d="\\b"+d+"\\b";var g=RegExp(d,e);return this.each(function(){jQuery.highlight(this,g,b.element,b.className)})}; \ No newline at end of file
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/template/common/jquery/jquery.cookie.js b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/template/common/jquery/jquery.cookie.js
new file mode 100644
index 0000000..bada7bf
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/template/common/jquery/jquery.cookie.js
@@ -0,0 +1,93 @@
+/**
+ * Cookie plugin
+ *
+ * Copyright (c) 2006 Klaus Hartl (stilbuero.de)
+ * Dual licensed under the MIT and GPL licenses:
+ * http://www.opensource.org/licenses/mit-license.php
+ * http://www.gnu.org/licenses/gpl.html
+ *
+ */
+
+/**
+ * Create a cookie with the given name and value and other optional parameters.
+ *
+ * @example $.cookie('the_cookie', 'the_value');
+ * @desc Set the value of a cookie.
+ * @example $.cookie('the_cookie', 'the_value', {expires: 7, path: '/', domain: 'jquery.com', secure: true});
+ * @desc Create a cookie with all available options.
+ * @example $.cookie('the_cookie', 'the_value');
+ * @desc Create a session cookie.
+ * @example $.cookie('the_cookie', null);
+ * @desc Delete a cookie by passing null as value.
+ *
+ * @param String name The name of the cookie.
+ * @param String value The value of the cookie.
+ * @param Object options An object literal containing key/value pairs to provide optional cookie attributes.
+ * @option Number|Date expires Either an integer specifying the expiration date from now on in days or a Date object.
+ * If a negative value is specified (e.g. a date in the past), the cookie will be deleted.
+ * If set to null or omitted, the cookie will be a session cookie and will not be retained
+ * when the the browser exits.
+ * @option String path The value of the path atribute of the cookie (default: path of page that created the cookie).
+ * @option String domain The value of the domain attribute of the cookie (default: domain of page that created the cookie).
+ * @option Boolean secure If true, the secure attribute of the cookie will be set and the cookie transmission will
+ * require a secure protocol (like HTTPS).
+ * @type undefined
+ *
+ * @name $.cookie
+ * @cat Plugins/Cookie
+ * @author Klaus Hartl/klaus.hartl@stilbuero.de
+ */
+
+/**
+ * Get the value of a cookie with the given name.
+ *
+ * @example $.cookie('the_cookie');
+ * @desc Get the value of a cookie.
+ *
+ * @param String name The name of the cookie.
+ * @return The value of the cookie.
+ * @type String
+ *
+ * @name $.cookie
+ * @cat Plugins/Cookie
+ * @author Klaus Hartl/klaus.hartl@stilbuero.de
+ */
+jQuery.cookie = function(name, value, options) {
+ if (typeof value != 'undefined') { // name and value given, set cookie
+ options = options || {};
+ if (value === null) {
+ value = '';
+ options.expires = -1;
+ }
+ var expires = '';
+ if (options.expires && (typeof options.expires == 'number' || options.expires.toUTCString)) {
+ var date;
+ if (typeof options.expires == 'number') {
+ date = new Date();
+ date.setTime(date.getTime() + (options.expires * 24 * 60 * 60 * 1000));
+ } else {
+ date = options.expires;
+ }
+ expires = '; expires=' + date.toUTCString(); // use expires attribute, max-age is not supported by IE
+ }
+ var path = options.path ? '; path=' + options.path : '';
+ var domain = options.domain ? '; domain=' + options.domain : '';
+ var secure = options.secure ? '; secure' : '';
+ document.cookie = [name, '=', encodeURIComponent(value), expires, path, domain, secure].join('');
+
+ } else { // only name given, get cookie
+ var cookieValue = null;
+ if (document.cookie && document.cookie != '') {
+ var cookies = document.cookie.split(';');
+ for (var i = 0; i < cookies.length; i++) {
+ var cookie = jQuery.trim(cookies[i]);
+ // Does this cookie string begin with the name we want?
+ if (cookie.substring(0, name.length + 1) == (name + '=')) {
+ cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
+ break;
+ }
+ }
+ }
+ return cookieValue;
+ }
+}; \ No newline at end of file
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/template/common/jquery/theme-redmond/jquery-ui-1.8.2.custom.css b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/template/common/jquery/theme-redmond/jquery-ui-1.8.2.custom.css
new file mode 100644
index 0000000..0b17363
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/template/common/jquery/theme-redmond/jquery-ui-1.8.2.custom.css
@@ -0,0 +1,398 @@
+/*
+* jQuery UI CSS Framework
+* Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about)
+* Dual licensed under the MIT (MIT-LICENSE.txt) and GPL (GPL-LICENSE.txt) licenses.
+*/
+
+/* Layout helpers
+----------------------------------*/
+.ui-helper-hidden { display: none; }
+.ui-helper-hidden-accessible { position: absolute; left: -99999999px; }
+.ui-helper-reset { margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none; }
+.ui-helper-clearfix:after { content: "."; display: block; height: 0; clear: both; visibility: hidden; }
+.ui-helper-clearfix { display: inline-block; }
+/* required comment for clearfix to work in Opera \*/
+* html .ui-helper-clearfix { height:1%; }
+.ui-helper-clearfix { display:block; }
+/* end clearfix */
+.ui-helper-zfix { width: 100%; height: 100%; top: 0; left: 0; position: absolute; opacity: 0; filter:Alpha(Opacity=0); }
+
+
+/* Interaction Cues
+----------------------------------*/
+.ui-state-disabled { cursor: default !important; }
+
+
+/* Icons
+----------------------------------*/
+
+/* states and images */
+.ui-icon { display: block; text-indent: -99999px; overflow: hidden; background-repeat: no-repeat; }
+
+
+/* Misc visuals
+----------------------------------*/
+
+/* Overlays */
+.ui-widget-overlay { position: absolute; top: 0; left: 0; width: 100%; height: 100%; }
+
+
+/*
+* jQuery UI CSS Framework
+* Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about)
+* Dual licensed under the MIT (MIT-LICENSE.txt) and GPL (GPL-LICENSE.txt) licenses.
+* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Lucida%20Grande,%20Lucida%20Sans,%20Arial,%20sans-serif&fwDefault=bold&fsDefault=1.1em&cornerRadius=5px&bgColorHeader=5c9ccc&bgTextureHeader=12_gloss_wave.png&bgImgOpacityHeader=55&borderColorHeader=4297d7&fcHeader=ffffff&iconColorHeader=d8e7f3&bgColorContent=fcfdfd&bgTextureContent=06_inset_hard.png&bgImgOpacityContent=100&borderColorContent=a6c9e2&fcContent=222222&iconColorContent=469bdd&bgColorDefault=dfeffc&bgTextureDefault=02_glass.png&bgImgOpacityDefault=85&borderColorDefault=c5dbec&fcDefault=2e6e9e&iconColorDefault=6da8d5&bgColorHover=d0e5f5&bgTextureHover=02_glass.png&bgImgOpacityHover=75&borderColorHover=79b7e7&fcHover=1d5987&iconColorHover=217bc0&bgColorActive=f5f8f9&bgTextureActive=06_inset_hard.png&bgImgOpacityActive=100&borderColorActive=79b7e7&fcActive=e17009&iconColorActive=f9bd01&bgColorHighlight=fbec88&bgTextureHighlight=01_flat.png&bgImgOpacityHighlight=55&borderColorHighlight=fad42e&fcHighlight=363636&iconColorHighlight=2e83ff&bgColorError=fef1ec&bgTextureError=02_glass.png&bgImgOpacityError=95&borderColorError=cd0a0a&fcError=cd0a0a&iconColorError=cd0a0a&bgColorOverlay=aaaaaa&bgTextureOverlay=01_flat.png&bgImgOpacityOverlay=0&opacityOverlay=30&bgColorShadow=aaaaaa&bgTextureShadow=01_flat.png&bgImgOpacityShadow=0&opacityShadow=30&thicknessShadow=8px&offsetTopShadow=-8px&offsetLeftShadow=-8px&cornerRadiusShadow=8px
+*/
+
+
+/* Component containers
+----------------------------------*/
+.ui-widget { font-family: Lucida Grande, Lucida Sans, Arial, sans-serif; font-size: 1.1em; }
+.ui-widget .ui-widget { font-size: 1em; }
+.ui-widget input, .ui-widget select, .ui-widget textarea, .ui-widget button { font-family: Lucida Grande, Lucida Sans, Arial, sans-serif; font-size: 1em; }
+.ui-widget-content { border: 1px solid #a6c9e2; background: #fcfdfd url(images/ui-bg_inset-hard_100_fcfdfd_1x100.png) 50% bottom repeat-x; color: #222222; }
+.ui-widget-content a { color: #222222; }
+.ui-widget-header { border: 1px solid #4297d7; background: #5c9ccc url(images/ui-bg_gloss-wave_55_5c9ccc_500x100.png) 50% 50% repeat-x; color: #ffffff; font-weight: bold; }
+.ui-widget-header a { color: #ffffff; }
+
+/* Interaction states
+----------------------------------*/
+.ui-state-default, .ui-widget-content .ui-state-default, .ui-widget-header .ui-state-default { border: 1px solid #c5dbec; background: #dfeffc url(images/ui-bg_glass_85_dfeffc_1x400.png) 50% 50% repeat-x; font-weight: bold; color: #2e6e9e; }
+.ui-state-default a, .ui-state-default a:link, .ui-state-default a:visited { color: #2e6e9e; text-decoration: none; }
+.ui-state-hover, .ui-widget-content .ui-state-hover, .ui-widget-header .ui-state-hover, .ui-state-focus, .ui-widget-content .ui-state-focus, .ui-widget-header .ui-state-focus { border: 1px solid #79b7e7; background: #d0e5f5 url(images/ui-bg_glass_75_d0e5f5_1x400.png) 50% 50% repeat-x; font-weight: bold; color: #1d5987; }
+.ui-state-hover a, .ui-state-hover a:hover { color: #1d5987; text-decoration: none; }
+.ui-state-active, .ui-widget-content .ui-state-active, .ui-widget-header .ui-state-active { border: 1px solid #79b7e7; background: #f5f8f9 url(images/ui-bg_inset-hard_100_f5f8f9_1x100.png) 50% 50% repeat-x; font-weight: bold; color: #e17009; }
+.ui-state-active a, .ui-state-active a:link, .ui-state-active a:visited { color: #e17009; text-decoration: none; }
+.ui-widget :active { outline: none; }
+
+/* Interaction Cues
+----------------------------------*/
+.ui-state-highlight, .ui-widget-content .ui-state-highlight, .ui-widget-header .ui-state-highlight {border: 1px solid #fad42e; background: #fbec88 url(images/ui-bg_flat_55_fbec88_40x100.png) 50% 50% repeat-x; color: #363636; }
+.ui-state-highlight a, .ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a { color: #363636; }
+.ui-state-error, .ui-widget-content .ui-state-error, .ui-widget-header .ui-state-error {border: 1px solid #cd0a0a; background: #fef1ec url(images/ui-bg_glass_95_fef1ec_1x400.png) 50% 50% repeat-x; color: #cd0a0a; }
+.ui-state-error a, .ui-widget-content .ui-state-error a, .ui-widget-header .ui-state-error a { color: #cd0a0a; }
+.ui-state-error-text, .ui-widget-content .ui-state-error-text, .ui-widget-header .ui-state-error-text { color: #cd0a0a; }
+.ui-priority-primary, .ui-widget-content .ui-priority-primary, .ui-widget-header .ui-priority-primary { font-weight: bold; }
+.ui-priority-secondary, .ui-widget-content .ui-priority-secondary, .ui-widget-header .ui-priority-secondary { opacity: .7; filter:Alpha(Opacity=70); font-weight: normal; }
+.ui-state-disabled, .ui-widget-content .ui-state-disabled, .ui-widget-header .ui-state-disabled { opacity: .35; filter:Alpha(Opacity=35); background-image: none; }
+
+/* Icons
+----------------------------------*/
+
+/* states and images */
+.ui-icon { width: 16px; height: 16px; background-image: url(images/ui-icons_469bdd_256x240.png); }
+.ui-widget-content .ui-icon {background-image: url(images/ui-icons_469bdd_256x240.png); }
+.ui-widget-header .ui-icon {background-image: url(images/ui-icons_d8e7f3_256x240.png); }
+.ui-state-default .ui-icon { background-image: url(images/ui-icons_6da8d5_256x240.png); }
+.ui-state-hover .ui-icon, .ui-state-focus .ui-icon {background-image: url(images/ui-icons_217bc0_256x240.png); }
+.ui-state-active .ui-icon {background-image: url(images/ui-icons_f9bd01_256x240.png); }
+.ui-state-highlight .ui-icon {background-image: url(images/ui-icons_2e83ff_256x240.png); }
+.ui-state-error .ui-icon, .ui-state-error-text .ui-icon {background-image: url(images/ui-icons_cd0a0a_256x240.png); }
+
+/* positioning */
+.ui-icon-carat-1-n { background-position: 0 0; }
+.ui-icon-carat-1-ne { background-position: -16px 0; }
+.ui-icon-carat-1-e { background-position: -32px 0; }
+.ui-icon-carat-1-se { background-position: -48px 0; }
+.ui-icon-carat-1-s { background-position: -64px 0; }
+.ui-icon-carat-1-sw { background-position: -80px 0; }
+.ui-icon-carat-1-w { background-position: -96px 0; }
+.ui-icon-carat-1-nw { background-position: -112px 0; }
+.ui-icon-carat-2-n-s { background-position: -128px 0; }
+.ui-icon-carat-2-e-w { background-position: -144px 0; }
+.ui-icon-triangle-1-n { background-position: 0 -16px; }
+.ui-icon-triangle-1-ne { background-position: -16px -16px; }
+.ui-icon-triangle-1-e { background-position: -32px -16px; }
+.ui-icon-triangle-1-se { background-position: -48px -16px; }
+.ui-icon-triangle-1-s { background-position: -64px -16px; }
+.ui-icon-triangle-1-sw { background-position: -80px -16px; }
+.ui-icon-triangle-1-w { background-position: -96px -16px; }
+.ui-icon-triangle-1-nw { background-position: -112px -16px; }
+.ui-icon-triangle-2-n-s { background-position: -128px -16px; }
+.ui-icon-triangle-2-e-w { background-position: -144px -16px; }
+.ui-icon-arrow-1-n { background-position: 0 -32px; }
+.ui-icon-arrow-1-ne { background-position: -16px -32px; }
+.ui-icon-arrow-1-e { background-position: -32px -32px; }
+.ui-icon-arrow-1-se { background-position: -48px -32px; }
+.ui-icon-arrow-1-s { background-position: -64px -32px; }
+.ui-icon-arrow-1-sw { background-position: -80px -32px; }
+.ui-icon-arrow-1-w { background-position: -96px -32px; }
+.ui-icon-arrow-1-nw { background-position: -112px -32px; }
+.ui-icon-arrow-2-n-s { background-position: -128px -32px; }
+.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }
+.ui-icon-arrow-2-e-w { background-position: -160px -32px; }
+.ui-icon-arrow-2-se-nw { background-position: -176px -32px; }
+.ui-icon-arrowstop-1-n { background-position: -192px -32px; }
+.ui-icon-arrowstop-1-e { background-position: -208px -32px; }
+.ui-icon-arrowstop-1-s { background-position: -224px -32px; }
+.ui-icon-arrowstop-1-w { background-position: -240px -32px; }
+.ui-icon-arrowthick-1-n { background-position: 0 -48px; }
+.ui-icon-arrowthick-1-ne { background-position: -16px -48px; }
+.ui-icon-arrowthick-1-e { background-position: -32px -48px; }
+.ui-icon-arrowthick-1-se { background-position: -48px -48px; }
+.ui-icon-arrowthick-1-s { background-position: -64px -48px; }
+.ui-icon-arrowthick-1-sw { background-position: -80px -48px; }
+.ui-icon-arrowthick-1-w { background-position: -96px -48px; }
+.ui-icon-arrowthick-1-nw { background-position: -112px -48px; }
+.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }
+.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }
+.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }
+.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }
+.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }
+.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }
+.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }
+.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }
+.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }
+.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }
+.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }
+.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }
+.ui-icon-arrowreturn-1-w { background-position: -64px -64px; }
+.ui-icon-arrowreturn-1-n { background-position: -80px -64px; }
+.ui-icon-arrowreturn-1-e { background-position: -96px -64px; }
+.ui-icon-arrowreturn-1-s { background-position: -112px -64px; }
+.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }
+.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }
+.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }
+.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }
+.ui-icon-arrow-4 { background-position: 0 -80px; }
+.ui-icon-arrow-4-diag { background-position: -16px -80px; }
+.ui-icon-extlink { background-position: -32px -80px; }
+.ui-icon-newwin { background-position: -48px -80px; }
+.ui-icon-refresh { background-position: -64px -80px; }
+.ui-icon-shuffle { background-position: -80px -80px; }
+.ui-icon-transfer-e-w { background-position: -96px -80px; }
+.ui-icon-transferthick-e-w { background-position: -112px -80px; }
+.ui-icon-folder-collapsed { background-position: 0 -96px; }
+.ui-icon-folder-open { background-position: -16px -96px; }
+.ui-icon-document { background-position: -32px -96px; }
+.ui-icon-document-b { background-position: -48px -96px; }
+.ui-icon-note { background-position: -64px -96px; }
+.ui-icon-mail-closed { background-position: -80px -96px; }
+.ui-icon-mail-open { background-position: -96px -96px; }
+.ui-icon-suitcase { background-position: -112px -96px; }
+.ui-icon-comment { background-position: -128px -96px; }
+.ui-icon-person { background-position: -144px -96px; }
+.ui-icon-print { background-position: -160px -96px; }
+.ui-icon-trash { background-position: -176px -96px; }
+.ui-icon-locked { background-position: -192px -96px; }
+.ui-icon-unlocked { background-position: -208px -96px; }
+.ui-icon-bookmark { background-position: -224px -96px; }
+.ui-icon-tag { background-position: -240px -96px; }
+.ui-icon-home { background-position: 0 -112px; }
+.ui-icon-flag { background-position: -16px -112px; }
+.ui-icon-calendar { background-position: -32px -112px; }
+.ui-icon-cart { background-position: -48px -112px; }
+.ui-icon-pencil { background-position: -64px -112px; }
+.ui-icon-clock { background-position: -80px -112px; }
+.ui-icon-disk { background-position: -96px -112px; }
+.ui-icon-calculator { background-position: -112px -112px; }
+.ui-icon-zoomin { background-position: -128px -112px; }
+.ui-icon-zoomout { background-position: -144px -112px; }
+.ui-icon-search { background-position: -160px -112px; }
+.ui-icon-wrench { background-position: -176px -112px; }
+.ui-icon-gear { background-position: -192px -112px; }
+.ui-icon-heart { background-position: -208px -112px; }
+.ui-icon-star { background-position: -224px -112px; }
+.ui-icon-link { background-position: -240px -112px; }
+.ui-icon-cancel { background-position: 0 -128px; }
+.ui-icon-plus { background-position: -16px -128px; }
+.ui-icon-plusthick { background-position: -32px -128px; }
+.ui-icon-minus { background-position: -48px -128px; }
+.ui-icon-minusthick { background-position: -64px -128px; }
+.ui-icon-close { background-position: -80px -128px; }
+.ui-icon-closethick { background-position: -96px -128px; }
+.ui-icon-key { background-position: -112px -128px; }
+.ui-icon-lightbulb { background-position: -128px -128px; }
+.ui-icon-scissors { background-position: -144px -128px; }
+.ui-icon-clipboard { background-position: -160px -128px; }
+.ui-icon-copy { background-position: -176px -128px; }
+.ui-icon-contact { background-position: -192px -128px; }
+.ui-icon-image { background-position: -208px -128px; }
+.ui-icon-video { background-position: -224px -128px; }
+.ui-icon-script { background-position: -240px -128px; }
+.ui-icon-alert { background-position: 0 -144px; }
+.ui-icon-info { background-position: -16px -144px; }
+.ui-icon-notice { background-position: -32px -144px; }
+.ui-icon-help { background-position: -48px -144px; }
+.ui-icon-check { background-position: -64px -144px; }
+.ui-icon-bullet { background-position: -80px -144px; }
+.ui-icon-radio-off { background-position: -96px -144px; }
+.ui-icon-radio-on { background-position: -112px -144px; }
+.ui-icon-pin-w { background-position: -128px -144px; }
+.ui-icon-pin-s { background-position: -144px -144px; }
+.ui-icon-play { background-position: 0 -160px; }
+.ui-icon-pause { background-position: -16px -160px; }
+.ui-icon-seek-next { background-position: -32px -160px; }
+.ui-icon-seek-prev { background-position: -48px -160px; }
+.ui-icon-seek-end { background-position: -64px -160px; }
+.ui-icon-seek-start { background-position: -80px -160px; }
+/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */
+.ui-icon-seek-first { background-position: -80px -160px; }
+.ui-icon-stop { background-position: -96px -160px; }
+.ui-icon-eject { background-position: -112px -160px; }
+.ui-icon-volume-off { background-position: -128px -160px; }
+.ui-icon-volume-on { background-position: -144px -160px; }
+.ui-icon-power { background-position: 0 -176px; }
+.ui-icon-signal-diag { background-position: -16px -176px; }
+.ui-icon-signal { background-position: -32px -176px; }
+.ui-icon-battery-0 { background-position: -48px -176px; }
+.ui-icon-battery-1 { background-position: -64px -176px; }
+.ui-icon-battery-2 { background-position: -80px -176px; }
+.ui-icon-battery-3 { background-position: -96px -176px; }
+.ui-icon-circle-plus { background-position: 0 -192px; }
+.ui-icon-circle-minus { background-position: -16px -192px; }
+.ui-icon-circle-close { background-position: -32px -192px; }
+.ui-icon-circle-triangle-e { background-position: -48px -192px; }
+.ui-icon-circle-triangle-s { background-position: -64px -192px; }
+.ui-icon-circle-triangle-w { background-position: -80px -192px; }
+.ui-icon-circle-triangle-n { background-position: -96px -192px; }
+.ui-icon-circle-arrow-e { background-position: -112px -192px; }
+.ui-icon-circle-arrow-s { background-position: -128px -192px; }
+.ui-icon-circle-arrow-w { background-position: -144px -192px; }
+.ui-icon-circle-arrow-n { background-position: -160px -192px; }
+.ui-icon-circle-zoomin { background-position: -176px -192px; }
+.ui-icon-circle-zoomout { background-position: -192px -192px; }
+.ui-icon-circle-check { background-position: -208px -192px; }
+.ui-icon-circlesmall-plus { background-position: 0 -208px; }
+.ui-icon-circlesmall-minus { background-position: -16px -208px; }
+.ui-icon-circlesmall-close { background-position: -32px -208px; }
+.ui-icon-squaresmall-plus { background-position: -48px -208px; }
+.ui-icon-squaresmall-minus { background-position: -64px -208px; }
+.ui-icon-squaresmall-close { background-position: -80px -208px; }
+.ui-icon-grip-dotted-vertical { background-position: 0 -224px; }
+.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }
+.ui-icon-grip-solid-vertical { background-position: -32px -224px; }
+.ui-icon-grip-solid-horizontal { background-position: -48px -224px; }
+.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }
+.ui-icon-grip-diagonal-se { background-position: -80px -224px; }
+
+
+/* Misc visuals
+----------------------------------*/
+
+/* Corner radius */
+.ui-corner-tl { -moz-border-radius-topleft: 5px; -webkit-border-top-left-radius: 5px; border-top-left-radius: 5px; }
+.ui-corner-tr { -moz-border-radius-topright: 5px; -webkit-border-top-right-radius: 5px; border-top-right-radius: 5px; }
+.ui-corner-bl { -moz-border-radius-bottomleft: 5px; -webkit-border-bottom-left-radius: 5px; border-bottom-left-radius: 5px; }
+.ui-corner-br { -moz-border-radius-bottomright: 5px; -webkit-border-bottom-right-radius: 5px; border-bottom-right-radius: 5px; }
+.ui-corner-top { -moz-border-radius-topleft: 5px; -webkit-border-top-left-radius: 5px; border-top-left-radius: 5px; -moz-border-radius-topright: 5px; -webkit-border-top-right-radius: 5px; border-top-right-radius: 5px; }
+.ui-corner-bottom { -moz-border-radius-bottomleft: 5px; -webkit-border-bottom-left-radius: 5px; border-bottom-left-radius: 5px; -moz-border-radius-bottomright: 5px; -webkit-border-bottom-right-radius: 5px; border-bottom-right-radius: 5px; }
+.ui-corner-right { -moz-border-radius-topright: 5px; -webkit-border-top-right-radius: 5px; border-top-right-radius: 5px; -moz-border-radius-bottomright: 5px; -webkit-border-bottom-right-radius: 5px; border-bottom-right-radius: 5px; }
+.ui-corner-left { -moz-border-radius-topleft: 5px; -webkit-border-top-left-radius: 5px; border-top-left-radius: 5px; -moz-border-radius-bottomleft: 5px; -webkit-border-bottom-left-radius: 5px; border-bottom-left-radius: 5px; }
+.ui-corner-all { -moz-border-radius: 5px; -webkit-border-radius: 5px; border-radius: 5px; }
+
+/* Overlays */
+.ui-widget-overlay { background: #aaaaaa url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x; opacity: .30;filter:Alpha(Opacity=30); }
+.ui-widget-shadow { margin: -8px 0 0 -8px; padding: 8px; background: #aaaaaa url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x; opacity: .30;filter:Alpha(Opacity=30); -moz-border-radius: 8px; -webkit-border-radius: 8px; border-radius: 8px; }/* Resizable
+----------------------------------*/
+.ui-resizable { position: relative;}
+.ui-resizable-handle { position: absolute;font-size: 0.1px;z-index: 99999; display: block;}
+.ui-resizable-disabled .ui-resizable-handle, .ui-resizable-autohide .ui-resizable-handle { display: none; }
+.ui-resizable-n { cursor: n-resize; height: 7px; width: 100%; top: -5px; left: 0; }
+.ui-resizable-s { cursor: s-resize; height: 7px; width: 100%; bottom: -5px; left: 0; }
+.ui-resizable-e { cursor: e-resize; width: 7px; right: -5px; top: 0; height: 100%; }
+.ui-resizable-w { cursor: w-resize; width: 7px; left: -5px; top: 0; height: 100%; }
+.ui-resizable-se { cursor: se-resize; width: 12px; height: 12px; right: 1px; bottom: 1px; }
+.ui-resizable-sw { cursor: sw-resize; width: 9px; height: 9px; left: -5px; bottom: -5px; }
+.ui-resizable-nw { cursor: nw-resize; width: 9px; height: 9px; left: -5px; top: -5px; }
+.ui-resizable-ne { cursor: ne-resize; width: 9px; height: 9px; right: -5px; top: -5px;}/* Selectable
+----------------------------------*/
+.ui-selectable-helper { border:1px dotted black }
+/* Autocomplete
+----------------------------------*/
+.ui-autocomplete { position: absolute; cursor: default; }
+.ui-autocomplete-loading { background: white url('images/ui-anim_basic_16x16.gif') right center no-repeat; }
+
+/* workarounds */
+* html .ui-autocomplete { width:1px; } /* without this, the menu expands to 100% in IE6 */
+
+/* Menu
+----------------------------------*/
+.ui-menu {
+ list-style:none;
+ padding: 2px;
+ margin: 0;
+ display:block;
+}
+.ui-menu .ui-menu {
+ margin-top: -3px;
+}
+.ui-menu .ui-menu-item {
+ margin:0;
+ padding: 0;
+ zoom: 1;
+ float: left;
+ clear: left;
+ width: 100%;
+}
+.ui-menu .ui-menu-item a {
+ text-decoration:none;
+ display:block;
+ padding:.2em .4em;
+ line-height:1.5;
+ zoom:1;
+}
+.ui-menu .ui-menu-item a.ui-state-hover,
+.ui-menu .ui-menu-item a.ui-state-active {
+ font-weight: normal;
+ margin: -1px;
+}
+/* Button
+----------------------------------*/
+
+.ui-button { display: inline-block; position: relative; padding: 0; margin-right: .1em; text-decoration: none !important; cursor: pointer; text-align: center; zoom: 1; overflow: visible; } /* the overflow property removes extra width in IE */
+.ui-button-icon-only { width: 2.2em; } /* to make room for the icon, a width needs to be set here */
+button.ui-button-icon-only { width: 2.4em; } /* button elements seem to need a little more width */
+.ui-button-icons-only { width: 3.4em; }
+button.ui-button-icons-only { width: 3.7em; }
+
+/*button text element */
+.ui-button .ui-button-text { display: block; line-height: 1.4; }
+.ui-button-text-only .ui-button-text { padding: .4em 1em; }
+.ui-button-icon-only .ui-button-text, .ui-button-icons-only .ui-button-text { padding: .4em; text-indent: -9999999px; }
+.ui-button-text-icon .ui-button-text, .ui-button-text-icons .ui-button-text { padding: .4em 1em .4em 2.1em; }
+.ui-button-text-icons .ui-button-text { padding-left: 2.1em; padding-right: 2.1em; }
+/* no icon support for input elements, provide padding by default */
+input.ui-button { padding: .4em 1em; }
+
+/*button icon element(s) */
+.ui-button-icon-only .ui-icon, .ui-button-text-icon .ui-icon, .ui-button-text-icons .ui-icon, .ui-button-icons-only .ui-icon { position: absolute; top: 50%; margin-top: -8px; }
+.ui-button-icon-only .ui-icon { left: 50%; margin-left: -8px; }
+.ui-button-text-icon .ui-button-icon-primary, .ui-button-text-icons .ui-button-icon-primary, .ui-button-icons-only .ui-button-icon-primary { left: .5em; }
+.ui-button-text-icons .ui-button-icon-secondary, .ui-button-icons-only .ui-button-icon-secondary { right: .5em; }
+
+/*button sets*/
+.ui-buttonset { margin-right: 7px; }
+.ui-buttonset .ui-button { margin-left: 0; margin-right: -.3em; }
+
+/* workarounds */
+button.ui-button::-moz-focus-inner { border: 0; padding: 0; } /* reset extra padding in Firefox */
+
+
+
+
+
+/* Dialog
+----------------------------------*/
+.ui-dialog { position: absolute; padding: .2em; width: 300px; overflow: hidden; }
+.ui-dialog .ui-dialog-titlebar { padding: .5em 1em .3em; position: relative; }
+.ui-dialog .ui-dialog-title { float: left; margin: .1em 16px .2em 0; }
+.ui-dialog .ui-dialog-titlebar-close { position: absolute; right: .3em; top: 50%; width: 19px; margin: -10px 0 0 0; padding: 1px; height: 18px; }
+.ui-dialog .ui-dialog-titlebar-close span { display: block; margin: 1px; }
+.ui-dialog .ui-dialog-titlebar-close:hover, .ui-dialog .ui-dialog-titlebar-close:focus { padding: 0; }
+.ui-dialog .ui-dialog-content { border: 0; padding: .5em 1em; background: none; overflow: auto; zoom: 1; }
+.ui-dialog .ui-dialog-buttonpane { text-align: left; border-width: 1px 0 0 0; background-image: none; margin: .5em 0 0 0; padding: .3em 1em .5em .4em; }
+.ui-dialog .ui-dialog-buttonpane button { float: right; margin: .5em .4em .5em 0; cursor: pointer; padding: .2em .6em .3em .6em; line-height: 1.4em; width:auto; overflow:visible; }
+.ui-dialog .ui-resizable-se { width: 14px; height: 14px; right: 3px; bottom: 3px; }
+.ui-draggable .ui-dialog-titlebar { cursor: move; }
+/* Tabs
+----------------------------------*/
+.ui-tabs { position: relative; padding: .2em; zoom: 1; } /* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */
+.ui-tabs .ui-tabs-nav { margin: 0; padding: .2em .2em 0; }
+.ui-tabs .ui-tabs-nav li { list-style: none; float: left; position: relative; top: 1px; margin: 0 .2em 1px 0; border-bottom: 0 !important; padding: 0; white-space: nowrap; }
+.ui-tabs .ui-tabs-nav li a { float: left; padding: .5em 1em; text-decoration: none; }
+.ui-tabs .ui-tabs-nav li.ui-tabs-selected { margin-bottom: 0; padding-bottom: 1px; }
+.ui-tabs .ui-tabs-nav li.ui-tabs-selected a, .ui-tabs .ui-tabs-nav li.ui-state-disabled a, .ui-tabs .ui-tabs-nav li.ui-state-processing a { cursor: text; }
+.ui-tabs .ui-tabs-nav li a, .ui-tabs.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-selected a { cursor: pointer; } /* first selector in group seems obsolete, but required to overcome bug in Opera applying cursor: text overall if defined elsewhere... */
+.ui-tabs .ui-tabs-panel { display: block; border-width: 0; padding: 1em 1.4em; background: none; }
+.ui-tabs .ui-tabs-hide { display: none !important; }
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/template/common/jquery/treeview/jquery.treeview.async.js b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/template/common/jquery/treeview/jquery.treeview.async.js
new file mode 100644
index 0000000..2597dde
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/template/common/jquery/treeview/jquery.treeview.async.js
@@ -0,0 +1,72 @@
+/*
+ * Async Treeview 0.1 - Lazy-loading extension for Treeview
+ *
+ * http://bassistance.de/jquery-plugins/jquery-plugin-treeview/
+ *
+ * Copyright (c) 2007 Jörn Zaefferer
+ *
+ * Dual licensed under the MIT and GPL licenses:
+ * http://www.opensource.org/licenses/mit-license.php
+ * http://www.gnu.org/licenses/gpl.html
+ *
+ * Revision: $Id$
+ *
+ */
+
+;(function($) {
+
+function load(settings, root, child, container) {
+ $.getJSON(settings.url, {root: root}, function(response) {
+ function createNode(parent) {
+ var current = $("<li/>").attr("id", this.id || "").html("<span>" + this.text + "</span>").appendTo(parent);
+ if (this.classes) {
+ current.children("span").addClass(this.classes);
+ }
+ if (this.expanded) {
+ current.addClass("open");
+ }
+ if (this.hasChildren || this.children && this.children.length) {
+ var branch = $("<ul/>").appendTo(current);
+ if (this.hasChildren) {
+ current.addClass("hasChildren");
+ createNode.call({
+ text:"placeholder",
+ id:"placeholder",
+ children:[]
+ }, branch);
+ }
+ if (this.children && this.children.length) {
+ $.each(this.children, createNode, [branch])
+ }
+ }
+ }
+ $.each(response, createNode, [child]);
+ $(container).treeview({add: child});
+ });
+}
+
+var proxied = $.fn.treeview;
+$.fn.treeview = function(settings) {
+ if (!settings.url) {
+ return proxied.apply(this, arguments);
+ }
+ var container = this;
+ load(settings, "source", this, container);
+ var userToggle = settings.toggle;
+ return proxied.call(this, $.extend({}, settings, {
+ collapsed: true,
+ toggle: function() {
+ var $this = $(this);
+ if ($this.hasClass("hasChildren")) {
+ var childList = $this.removeClass("hasChildren").find("ul");
+ childList.empty();
+ load(settings, this.id, childList, container);
+ }
+ if (userToggle) {
+ userToggle.apply(this, arguments);
+ }
+ }
+ }));
+};
+
+})(jQuery); \ No newline at end of file
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/template/common/jquery/treeview/jquery.treeview.css b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/template/common/jquery/treeview/jquery.treeview.css
new file mode 100644
index 0000000..dbf425b
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/template/common/jquery/treeview/jquery.treeview.css
@@ -0,0 +1,85 @@
+.treeview, .treeview ul {
+ padding: 0;
+ margin: 0;
+ list-style: none;
+}
+
+.treeview ul {
+ background-color: white;
+ margin-top: 4px;
+}
+
+.treeview .hitarea {
+ background: url(images/treeview-default.gif) -64px -25px no-repeat;
+ height: 16px;
+ width: 16px;
+ margin-left: -16px;
+ float: left;
+ cursor: pointer;
+}
+/* fix for IE6 */
+* html .hitarea {
+ display: inline;
+ float:none;
+}
+
+.treeview li {
+ margin: 0;
+ padding: 3px 0 3px 16px;
+}
+
+.treeview a.selected {
+ background-color: #eee;
+}
+
+#treecontrol { margin: 1em 0; display: none; }
+
+.treeview .hover { color: red; cursor: pointer; }
+
+.treeview li { background: url(images/treeview-default-line.gif) 0 0 no-repeat; }
+.treeview li.collapsable, .treeview li.expandable { background-position: 0 -176px; }
+
+.treeview .expandable-hitarea { background-position: -80px -3px; }
+
+.treeview li.last { background-position: 0 -1766px }
+.treeview li.lastCollapsable, .treeview li.lastExpandable { background-image: url(images/treeview-default.gif); }
+.treeview li.lastCollapsable { background-position: 0 -111px }
+.treeview li.lastExpandable { background-position: -32px -67px }
+
+.treeview div.lastCollapsable-hitarea, .treeview div.lastExpandable-hitarea { background-position: 0; }
+
+.treeview-red li { background-image: url(images/treeview-red-line.gif); }
+.treeview-red .hitarea, .treeview-red li.lastCollapsable, .treeview-red li.lastExpandable { background-image: url(images/treeview-red.gif); }
+
+.treeview-black li { background-image: url(images/treeview-black-line.gif); }
+.treeview-black .hitarea, .treeview-black li.lastCollapsable, .treeview-black li.lastExpandable { background-image: url(images/treeview-black.gif); }
+
+.treeview-gray li { background-image: url(images/treeview-gray-line.gif); }
+.treeview-gray .hitarea, .treeview-gray li.lastCollapsable, .treeview-gray li.lastExpandable { background-image: url(images/treeview-gray.gif); }
+
+.treeview-famfamfam li { background-image: url(images/treeview-famfamfam-line.gif); }
+.treeview-famfamfam .hitarea, .treeview-famfamfam li.lastCollapsable, .treeview-famfamfam li.lastExpandable { background-image: url(images/treeview-famfamfam.gif); }
+
+
+.filetree li { padding: 3px 0 2px 16px; }
+.filetree span.folder, .filetree span.file { padding: 1px 0 1px 16px; display: block; }
+.filetree span.folder { background: url(images/folder.gif) 0 0 no-repeat; }
+.filetree li.expandable span.folder { background: url(images/folder-closed.gif) 0 0 no-repeat; }
+.filetree span.file { background: url(images/file.gif) 0 0 no-repeat; }
+
+html, body {height:100%; margin: 0; padding: 0; }
+
+/*
+html>body {
+ font-size: 16px;
+ font-size: 68.75%;
+} Reset Base Font Size */
+ /*
+body {
+ font-family: Verdana, helvetica, arial, sans-serif;
+ font-size: 68.75%;
+ background: #fff;
+ color: #333;
+} */
+
+a img { border: none; } \ No newline at end of file
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/template/common/jquery/treeview/jquery.treeview.js b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/template/common/jquery/treeview/jquery.treeview.js
new file mode 100644
index 0000000..248e725
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/template/common/jquery/treeview/jquery.treeview.js
@@ -0,0 +1,255 @@
+/*
+ * Treeview 1.4 - jQuery plugin to hide and show branches of a tree
+ *
+ * http://bassistance.de/jquery-plugins/jquery-plugin-treeview/
+ * http://docs.jquery.com/Plugins/Treeview
+ *
+ * Copyright (c) 2007 Jörn Zaefferer
+ *
+ * Dual licensed under the MIT and GPL licenses:
+ * http://www.opensource.org/licenses/mit-license.php
+ * http://www.gnu.org/licenses/gpl.html
+ *
+ * Revision: $Id: jquery.treeview.js 4684 2008-02-07 19:08:06Z joern.zaefferer $
+ *
+ */
+
+;(function($) {
+
+ $.extend($.fn, {
+ swapClass: function(c1, c2) {
+ var c1Elements = this.filter('.' + c1);
+ this.filter('.' + c2).removeClass(c2).addClass(c1);
+ c1Elements.removeClass(c1).addClass(c2);
+ return this;
+ },
+ replaceClass: function(c1, c2) {
+ return this.filter('.' + c1).removeClass(c1).addClass(c2).end();
+ },
+ hoverClass: function(className) {
+ className = className || "hover";
+ return this.hover(function() {
+ $(this).addClass(className);
+ }, function() {
+ $(this).removeClass(className);
+ });
+ },
+ heightToggle: function(animated, callback) {
+ animated ?
+ this.animate({ height: "toggle" }, animated, callback) :
+ this.each(function(){
+ jQuery(this)[ jQuery(this).is(":hidden") ? "show" : "hide" ]();
+ if(callback)
+ callback.apply(this, arguments);
+ });
+ },
+ heightHide: function(animated, callback) {
+ if (animated) {
+ this.animate({ height: "hide" }, animated, callback);
+ } else {
+ this.hide();
+ if (callback)
+ this.each(callback);
+ }
+ },
+ prepareBranches: function(settings) {
+ if (!settings.prerendered) {
+ // mark last tree items
+ this.filter(":last-child:not(ul)").addClass(CLASSES.last);
+ // collapse whole tree, or only those marked as closed, anyway except those marked as open
+ this.filter((settings.collapsed ? "" : "." + CLASSES.closed) + ":not(." + CLASSES.open + ")").find(">ul").hide();
+ }
+ // return all items with sublists
+ return this.filter(":has(>ul)");
+ },
+ applyClasses: function(settings, toggler) {
+ this.filter(":has(>ul):not(:has(>a))").find(">span").click(function(event) {
+ toggler.apply($(this).next());
+ }).add( $("a", this) ).hoverClass();
+
+ if (!settings.prerendered) {
+ // handle closed ones first
+ this.filter(":has(>ul:hidden)")
+ .addClass(CLASSES.expandable)
+ .replaceClass(CLASSES.last, CLASSES.lastExpandable);
+
+ // handle open ones
+ this.not(":has(>ul:hidden)")
+ .addClass(CLASSES.collapsable)
+ .replaceClass(CLASSES.last, CLASSES.lastCollapsable);
+
+ // create hitarea
+ this.prepend("<div class=\"" + CLASSES.hitarea + "\"/>").find("div." + CLASSES.hitarea).each(function() {
+ var classes = "";
+ $.each($(this).parent().attr("class").split(" "), function() {
+ classes += this + "-hitarea ";
+ });
+ $(this).addClass( classes );
+ });
+ }
+
+ // apply event to hitarea
+ this.find("div." + CLASSES.hitarea).click( toggler );
+ },
+ treeview: function(settings) {
+
+ if(typeof(window.treeCookieId) !== 'undefined' || window.treeCookieId === ""){
+ treeCookieId = "treeview";
+ }
+
+ settings = $.extend({
+ cookieId: treeCookieId
+ }, settings);
+
+ if (settings.add) {
+ return this.trigger("add", [settings.add]);
+ }
+
+ if ( settings.toggle ) {
+ var callback = settings.toggle;
+ settings.toggle = function() {
+ return callback.apply($(this).parent()[0], arguments);
+ };
+ }
+
+ // factory for treecontroller
+ function treeController(tree, control) {
+ // factory for click handlers
+ function handler(filter) {
+ return function() {
+ // reuse toggle event handler, applying the elements to toggle
+ // start searching for all hitareas
+ toggler.apply( $("div." + CLASSES.hitarea, tree).filter(function() {
+ // for plain toggle, no filter is provided, otherwise we need to check the parent element
+ return filter ? $(this).parent("." + filter).length : true;
+ }) );
+ return false;
+ };
+ }
+ // click on first element to collapse tree
+ $("a:eq(0)", control).click( handler(CLASSES.collapsable) );
+ // click on second to expand tree
+ $("a:eq(1)", control).click( handler(CLASSES.expandable) );
+ // click on third to toggle tree
+ $("a:eq(2)", control).click( handler() );
+ }
+
+ // handle toggle event
+ function toggler() {
+ $(this)
+ .parent()
+ // swap classes for hitarea
+ .find(">.hitarea")
+ .swapClass( CLASSES.collapsableHitarea, CLASSES.expandableHitarea )
+ .swapClass( CLASSES.lastCollapsableHitarea, CLASSES.lastExpandableHitarea )
+ .end()
+ // swap classes for parent li
+ .swapClass( CLASSES.collapsable, CLASSES.expandable )
+ .swapClass( CLASSES.lastCollapsable, CLASSES.lastExpandable )
+ // find child lists
+ .find( ">ul" )
+ // toggle them
+ .heightToggle( settings.animated, settings.toggle );
+ if ( settings.unique ) {
+ $(this).parent()
+ .siblings()
+ // swap classes for hitarea
+ .find(">.hitarea")
+ .replaceClass( CLASSES.collapsableHitarea, CLASSES.expandableHitarea )
+ .replaceClass( CLASSES.lastCollapsableHitarea, CLASSES.lastExpandableHitarea )
+ .end()
+ .replaceClass( CLASSES.collapsable, CLASSES.expandable )
+ .replaceClass( CLASSES.lastCollapsable, CLASSES.lastExpandable )
+ .find( ">ul" )
+ .heightHide( settings.animated, settings.toggle );
+ }
+ }
+ //Cookie Persistence
+ function serialize() {
+ function binary(arg) {
+ return arg ? 1 : 0;
+ }
+ var data = [];
+ branches.each(function(i, e) {
+ data[i] = $(e).is(":has(>ul:visible)") ? 1 : 0;
+ });
+ $.cookie(settings.cookieId, data.join("") );
+ }
+
+ function deserialize() {
+ var stored = $.cookie(settings.cookieId);
+ if ( stored ) {
+ var data = stored.split("");
+ branches.each(function(i, e) {
+ $(e).find(">ul")[ parseInt(data[i]) ? "show" : "hide" ]();
+ });
+ }
+ }
+
+ // add treeview class to activate styles
+ this.addClass("treeview");
+
+ // prepare branches and find all tree items with child lists
+ var branches = this.find("li").prepareBranches(settings);
+
+ switch(settings.persist) {
+ case "cookie":
+ var toggleCallback = settings.toggle;
+ settings.toggle = function() {
+ serialize();
+ if (toggleCallback) {
+ toggleCallback.apply(this, arguments);
+ }
+ };
+ deserialize();
+ break;
+ case "location":
+ var current = this.find("a").filter(function() { return this.href.toLowerCase() == location.href.toLowerCase(); });
+ if ( current.length ) {
+ current.addClass("selected").parents("ul, li").add( current.next() ).show();
+ }
+ break;
+ }
+
+ branches.applyClasses(settings, toggler);
+
+ // if control option is set, create the treecontroller and show it
+ if ( settings.control ) {
+ treeController(this, settings.control);
+ $(settings.control).show();
+ }
+
+ return this.bind("add", function(event, branches) {
+ $(branches).prev()
+ .removeClass(CLASSES.last)
+ .removeClass(CLASSES.lastCollapsable)
+ .removeClass(CLASSES.lastExpandable)
+ .find(">.hitarea")
+ .removeClass(CLASSES.lastCollapsableHitarea)
+ .removeClass(CLASSES.lastExpandableHitarea);
+ $(branches).find("li").andSelf().prepareBranches(settings).applyClasses(settings, toggler);
+ });
+ }
+ });
+
+ // classes used by the plugin
+ // need to be styled via external stylesheet, see first example
+ var CLASSES = $.fn.treeview.classes = {
+ open: "open",
+ closed: "closed",
+ expandable: "expandable",
+ expandableHitarea: "expandable-hitarea",
+ lastExpandableHitarea: "lastExpandable-hitarea",
+ collapsable: "collapsable",
+ collapsableHitarea: "collapsable-hitarea",
+ lastCollapsableHitarea: "lastCollapsable-hitarea",
+ lastCollapsable: "lastCollapsable",
+ lastExpandable: "lastExpandable",
+ last: "last",
+ hitarea: "hitarea"
+ };
+
+ // provide backwards compability
+ $.fn.Treeview = $.fn.treeview;
+
+})(jQuery); \ No newline at end of file
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/template/common/jquery/treeview/jquery.treeview.min.js b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/template/common/jquery/treeview/jquery.treeview.min.js
new file mode 100644
index 0000000..e693321
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/template/common/jquery/treeview/jquery.treeview.min.js
@@ -0,0 +1,16 @@
+/*
+ * Treeview 1.4 - jQuery plugin to hide and show branches of a tree
+ *
+ * http://bassistance.de/jquery-plugins/jquery-plugin-treeview/
+ * http://docs.jquery.com/Plugins/Treeview
+ *
+ * Copyright (c) 2007 Jörn Zaefferer
+ *
+ * Dual licensed under the MIT and GPL licenses:
+ * http://www.opensource.org/licenses/mit-license.php
+ * http://www.gnu.org/licenses/gpl.html
+ *
+ * Revision: $Id: jquery.treeview.js 4684 2008-02-07 19:08:06Z joern.zaefferer $
+ * kasunbg: changed the cookieid name
+ *
+ */;(function($){$.extend($.fn,{swapClass:function(c1,c2){var c1Elements=this.filter('.'+c1);this.filter('.'+c2).removeClass(c2).addClass(c1);c1Elements.removeClass(c1).addClass(c2);return this;},replaceClass:function(c1,c2){return this.filter('.'+c1).removeClass(c1).addClass(c2).end();},hoverClass:function(className){className=className||"hover";return this.hover(function(){$(this).addClass(className);},function(){$(this).removeClass(className);});},heightToggle:function(animated,callback){animated?this.animate({height:"toggle"},animated,callback):this.each(function(){jQuery(this)[jQuery(this).is(":hidden")?"show":"hide"]();if(callback)callback.apply(this,arguments);});},heightHide:function(animated,callback){if(animated){this.animate({height:"hide"},animated,callback);}else{this.hide();if(callback)this.each(callback);}},prepareBranches:function(settings){if(!settings.prerendered){this.filter(":last-child:not(ul)").addClass(CLASSES.last);this.filter((settings.collapsed?"":"."+CLASSES.closed)+":not(."+CLASSES.open+")").find(">ul").hide();}return this.filter(":has(>ul)");},applyClasses:function(settings,toggler){this.filter(":has(>ul):not(:has(>a))").find(">span").click(function(event){toggler.apply($(this).next());}).add($("a",this)).hoverClass();if(!settings.prerendered){this.filter(":has(>ul:hidden)").addClass(CLASSES.expandable).replaceClass(CLASSES.last,CLASSES.lastExpandable);this.not(":has(>ul:hidden)").addClass(CLASSES.collapsable).replaceClass(CLASSES.last,CLASSES.lastCollapsable);this.prepend("<div class=\""+CLASSES.hitarea+"\"/>").find("div."+CLASSES.hitarea).each(function(){var classes="";$.each($(this).parent().attr("class").split(" "),function(){classes+=this+"-hitarea ";});$(this).addClass(classes);});}this.find("div."+CLASSES.hitarea).click(toggler);},treeview:function(settings){if(typeof(window.treeCookieId) === 'undefined' || window.treeCookieId === ""){treeCookieId = "treeview";} settings=$.extend({cookieId: treeCookieId},settings);if(settings.add){return this.trigger("add",[settings.add]);}if(settings.toggle){var callback=settings.toggle;settings.toggle=function(){return callback.apply($(this).parent()[0],arguments);};}function treeController(tree,control){function handler(filter){return function(){toggler.apply($("div."+CLASSES.hitarea,tree).filter(function(){return filter?$(this).parent("."+filter).length:true;}));return false;};}$("a:eq(0)",control).click(handler(CLASSES.collapsable));$("a:eq(1)",control).click(handler(CLASSES.expandable));$("a:eq(2)",control).click(handler());}function toggler(){$(this).parent().find(">.hitarea").swapClass(CLASSES.collapsableHitarea,CLASSES.expandableHitarea).swapClass(CLASSES.lastCollapsableHitarea,CLASSES.lastExpandableHitarea).end().swapClass(CLASSES.collapsable,CLASSES.expandable).swapClass(CLASSES.lastCollapsable,CLASSES.lastExpandable).find(">ul").heightToggle(settings.animated,settings.toggle);if(settings.unique){$(this).parent().siblings().find(">.hitarea").replaceClass(CLASSES.collapsableHitarea,CLASSES.expandableHitarea).replaceClass(CLASSES.lastCollapsableHitarea,CLASSES.lastExpandableHitarea).end().replaceClass(CLASSES.collapsable,CLASSES.expandable).replaceClass(CLASSES.lastCollapsable,CLASSES.lastExpandable).find(">ul").heightHide(settings.animated,settings.toggle);}}function serialize(){function binary(arg){return arg?1:0;}var data=[];branches.each(function(i,e){data[i]=$(e).is(":has(>ul:visible)")?1:0;});$.cookie(settings.cookieId,data.join(""));}function deserialize(){var stored=$.cookie(settings.cookieId);if(stored){var data=stored.split("");branches.each(function(i,e){$(e).find(">ul")[parseInt(data[i])?"show":"hide"]();});}}this.addClass("treeview");var branches=this.find("li").prepareBranches(settings);switch(settings.persist){case"cookie":var toggleCallback=settings.toggle;settings.toggle=function(){serialize();if(toggleCallback){toggleCallback.apply(this,arguments);}};deserialize();break;case"location":var current=this.find("a").filter(function(){return this.href.toLowerCase()==location.href.toLowerCase();});if(current.length){current.addClass("selected").parents("ul, li").add(current.next()).show();}break;}branches.applyClasses(settings,toggler);if(settings.control){treeController(this,settings.control);$(settings.control).show();}return this.bind("add",function(event,branches){$(branches).prev().removeClass(CLASSES.last).removeClass(CLASSES.lastCollapsable).removeClass(CLASSES.lastExpandable).find(">.hitarea").removeClass(CLASSES.lastCollapsableHitarea).removeClass(CLASSES.lastExpandableHitarea);$(branches).find("li").andSelf().prepareBranches(settings).applyClasses(settings,toggler);});}});var CLASSES=$.fn.treeview.classes={open:"open",closed:"closed",expandable:"expandable",expandableHitarea:"expandable-hitarea",lastExpandableHitarea:"lastExpandable-hitarea",collapsable:"collapsable",collapsableHitarea:"collapsable-hitarea",lastCollapsableHitarea:"lastCollapsable-hitarea",lastCollapsable:"lastCollapsable",lastExpandable:"lastExpandable",last:"last",hitarea:"hitarea"};$.fn.Treeview=$.fn.treeview;})(jQuery); \ No newline at end of file
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/template/common/jquery/treeview/jquery.treeview.pack.js b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/template/common/jquery/treeview/jquery.treeview.pack.js
new file mode 100644
index 0000000..eddac49
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/template/common/jquery/treeview/jquery.treeview.pack.js
@@ -0,0 +1,16 @@
+/*
+ * Treeview 1.4 - jQuery plugin to hide and show branches of a tree
+ *
+ * http://bassistance.de/jquery-plugins/jquery-plugin-treeview/
+ * http://docs.jquery.com/Plugins/Treeview
+ *
+ * Copyright (c) 2007 Jörn Zaefferer
+ *
+ * Dual licensed under the MIT and GPL licenses:
+ * http://www.opensource.org/licenses/mit-license.php
+ * http://www.gnu.org/licenses/gpl.html
+ *
+ * Revision: $Id: jquery.treeview.js 4684 2008-02-07 19:08:06Z joern.zaefferer $
+ *
+ */
+eval(function(p,a,c,k,e,r){e=function(c){return(c<a?'':e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)r[e(c)]=k[c]||e(c);k=[function(e){return r[e]}];e=function(){return'\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}(';(4($){$.1l($.F,{E:4(b,c){l a=3.n(\'.\'+b);3.n(\'.\'+c).o(c).m(b);a.o(b).m(c);8 3},s:4(a,b){8 3.n(\'.\'+a).o(a).m(b).P()},1n:4(a){a=a||"1j";8 3.1j(4(){$(3).m(a)},4(){$(3).o(a)})},1h:4(b,a){b?3.1g({1e:"p"},b,a):3.x(4(){T(3)[T(3).1a(":U")?"H":"D"]();7(a)a.A(3,O)})},12:4(b,a){7(b){3.1g({1e:"D"},b,a)}1L{3.D();7(a)3.x(a)}},11:4(a){7(!a.1k){3.n(":r-1H:G(9)").m(k.r);3.n((a.1F?"":"."+k.X)+":G(."+k.W+")").6(">9").D()}8 3.n(":y(>9)")},S:4(b,c){3.n(":y(>9):G(:y(>a))").6(">1z").C(4(a){c.A($(3).19())}).w($("a",3)).1n();7(!b.1k){3.n(":y(>9:U)").m(k.q).s(k.r,k.t);3.G(":y(>9:U)").m(k.u).s(k.r,k.v);3.1r("<J 14=\\""+k.5+"\\"/>").6("J."+k.5).x(4(){l a="";$.x($(3).B().1o("14").13(" "),4(){a+=3+"-5 "});$(3).m(a)})}3.6("J."+k.5).C(c)},z:4(g){g=$.1l({N:"z"},g);7(g.w){8 3.1K("w",[g.w])}7(g.p){l d=g.p;g.p=4(){8 d.A($(3).B()[0],O)}}4 1m(b,c){4 L(a){8 4(){K.A($("J."+k.5,b).n(4(){8 a?$(3).B("."+a).1i:1I}));8 1G}}$("a:10(0)",c).C(L(k.u));$("a:10(1)",c).C(L(k.q));$("a:10(2)",c).C(L())}4 K(){$(3).B().6(">.5").E(k.Z,k.Y).E(k.I,k.M).P().E(k.u,k.q).E(k.v,k.t).6(">9").1h(g.1f,g.p);7(g.1E){$(3).B().1D().6(">.5").s(k.Z,k.Y).s(k.I,k.M).P().s(k.u,k.q).s(k.v,k.t).6(">9").12(g.1f,g.p)}}4 1d(){4 1C(a){8 a?1:0}l b=[];j.x(4(i,e){b[i]=$(e).1a(":y(>9:1B)")?1:0});$.V(g.N,b.1A(""))}4 1c(){l b=$.V(g.N);7(b){l a=b.13("");j.x(4(i,e){$(e).6(">9")[1y(a[i])?"H":"D"]()})}}3.m("z");l j=3.6("Q").11(g);1x(g.1w){18"V":l h=g.p;g.p=4(){1d();7(h){h.A(3,O)}};1c();17;18"1b":l f=3.6("a").n(4(){8 3.16.15()==1b.16.15()});7(f.1i){f.m("1v").1u("9, Q").w(f.19()).H()}17}j.S(g,K);7(g.R){1m(3,g.R);$(g.R).H()}8 3.1t("w",4(a,b){$(b).1s().o(k.r).o(k.v).o(k.t).6(">.5").o(k.I).o(k.M);$(b).6("Q").1q().11(g).S(g,K)})}});l k=$.F.z.1J={W:"W",X:"X",q:"q",Y:"q-5",M:"t-5",u:"u",Z:"u-5",I:"v-5",v:"v",t:"t",r:"r",5:"5"};$.F.1p=$.F.z})(T);',62,110,'|||this|function|hitarea|find|if|return|ul||||||||||||var|addClass|filter|removeClass|toggle|expandable|last|replaceClass|lastExpandable|collapsable|lastCollapsable|add|each|has|treeview|apply|parent|click|hide|swapClass|fn|not|show|lastCollapsableHitarea|div|toggler|handler|lastExpandableHitarea|cookieId|arguments|end|li|control|applyClasses|jQuery|hidden|cookie|open|closed|expandableHitarea|collapsableHitarea|eq|prepareBranches|heightHide|split|class|toLowerCase|href|break|case|next|is|location|deserialize|serialize|height|animated|animate|heightToggle|length|hover|prerendered|extend|treeController|hoverClass|attr|Treeview|andSelf|prepend|prev|bind|parents|selected|persist|switch|parseInt|span|join|visible|binary|siblings|unique|collapsed|false|child|true|classes|trigger|else'.split('|'),0,{})) \ No newline at end of file
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/template/common/main.js b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/template/common/main.js
new file mode 100644
index 0000000..dee7303
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/template/common/main.js
@@ -0,0 +1,161 @@
+/**
+ * Miscellaneous js functions for WebHelp
+ * Kasun Gajasinghe, http://kasunbg.blogspot.com
+ * David Cramer, http://www.thingbag.net
+ *
+ */
+
+$(document).ready(function() {
+ // $("#showHideHighlight").button(); //add jquery button styling to 'Go' button
+ //Generate tabs in nav-pane with JQuery
+ $(function() {
+ $("#tabs").tabs({
+ cookie: {
+ // store cookie for 2 days.
+ expires: 2
+ }
+ });
+ });
+
+ //Generate the tree
+ $("#ulTreeDiv").attr("style","");
+ $("#tree").treeview({
+ collapsed: true,
+ animated: "medium",
+ control: "#sidetreecontrol",
+ persist: "cookie"
+ });
+
+ //after toc fully styled, display it. Until loading, a 'loading' image will be displayed
+ $("#tocLoading").attr("style","display:none;");
+// $("#ulTreeDiv").attr("style","display:block;");
+
+ //.searchButton is the css class applied to 'Go' button
+ $(function() {
+ $("button", ".searchButton").button();
+
+ $("button", ".searchButton").click(function() { return false; });
+ });
+
+ //'ui-tabs-1' is the cookie name which is used for the persistence of the tabs.(Content/Search tab)
+ if ($.cookie('ui-tabs-1') === '1') { //search tab is visible
+ if ($.cookie('textToSearch') != undefined && $.cookie('textToSearch').length > 0) {
+ document.getElementById('textToSearch').value = $.cookie('textToSearch');
+ Verifie('diaSearch_Form');
+ searchHighlight($.cookie('textToSearch'));
+ $("#showHideHighlight").css("display","block");
+ }
+ }
+
+ syncToc(); //Synchronize the toc tree with the content pane, when loading the page.
+ //$("#doSearch").button(); //add jquery button styling to 'Go' button
+});
+
+/**
+ * Synchronize with the tableOfContents
+ */
+function syncToc(){
+ var a = document.getElementById("webhelp-currentid");
+ if (a != undefined) {
+ var b = a.getElementsByTagName("a")[0];
+
+ if (b != undefined) {
+ //Setting the background for selected node.
+ var style = a.getAttribute("style");
+ if (style != null && !style.match(/background-color: Background;/)) {
+ a.setAttribute("style", "background-color: #6495ed; " + style);
+ b.setAttribute("style", "color: white;");
+ } else if (style != null) {
+ a.setAttribute("style", "background-color: #6495ed; " + style);
+ b.setAttribute("style", "color: white;");
+ } else {
+ a.setAttribute("style", "background-color: #6495ed; ");
+ b.setAttribute("style", "color: white;");
+ }
+ }
+
+ //shows the node related to current content.
+ //goes a recursive call from current node to ancestor nodes, displaying all of them.
+ while (a.parentNode && a.parentNode.nodeName) {
+ var parentNode = a.parentNode;
+ var nodeName = parentNode.nodeName;
+
+ if (nodeName.toLowerCase() == "ul") {
+ parentNode.setAttribute("style", "display: block;");
+ } else if (nodeName.toLocaleLowerCase() == "li") {
+ parentNode.setAttribute("class", "collapsable");
+ parentNode.firstChild.setAttribute("class", "hitarea collapsable-hitarea ");
+ }
+ a = parentNode;
+ }
+ }
+}
+
+/**
+ * Code for Show/Hide TOC
+ *
+ */
+function showHideToc() {
+ var showHideButton = $("#showHideButton");
+ var leftNavigation = $("#leftnavigation");
+ var content = $("#content");
+
+ if (showHideButton != undefined && showHideButton.hasClass("pointLeft")) {
+ //Hide TOC
+ showHideButton.removeClass('pointLeft').addClass('pointRight');
+ content.css("margin", "0 0 0 0");
+ leftNavigation.css("display","none");
+ showHideButton.attr("title", "Show the TOC tree");
+ } else {
+ //Show the TOC
+ showHideButton.removeClass('pointRight').addClass('pointLeft');
+ content.css("margin", "0 0 0 280px");
+ leftNavigation.css("display","block");
+ showHideButton.attr("title", "Hide the TOC Tree");
+ }
+}
+
+/**
+ * Code for searh highlighting
+ */
+var highlightOn = true;
+function searchHighlight(searchText) {
+ highlightOn = true;
+ if (searchText != undefined) {
+ var wList;
+ var sList = new Array(); //stem list
+ //Highlight the search terms
+ searchText = searchText.toLowerCase().replace(/<\//g, "_st_").replace(/\$_/g, "_di_").replace(/\.|%2C|%3B|%21|%3A|@|\/|\*/g, " ").replace(/(%20)+/g, " ").replace(/_st_/g, "</").replace(/_di_/g, "%24_")
+ searchText = searchText.replace(/ +/g, " ");
+ searchText = searchText.replace(/ $/, "").replace(/^ /, "");
+
+ wList = searchText.split(" ");
+ $("#content").highlight(wList); //Highlight the search input
+
+ if(typeof stemmer != "undefined" ){
+ //Highlight the stems
+ for (var i = 0; i < wList.length; i++) {
+ var stemW = stemmer(wList[i]);
+ sList.push(stemW);
+ }
+ } else {
+ sList = wList;
+ }
+ $("#content").highlight(sList); //Highlight the search input's all stems
+ }
+}
+
+function searchUnhighlight(){
+ highlightOn = false;
+ //unhighlight the search input's all stems
+ $("#content").unhighlight();
+ $("#content").unhighlight();
+}
+
+function toggleHighlight(){
+ if(highlightOn) {
+ searchUnhighlight();
+ } else {
+ searchHighlight($.cookie('textToSearch'));
+ }
+} \ No newline at end of file
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/template/content/search/default.props b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/template/content/search/default.props
new file mode 100644
index 0000000..22edf43
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/template/content/search/default.props
@@ -0,0 +1 @@
+DEF01=a \ No newline at end of file
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/template/content/search/en-us.props b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/template/content/search/en-us.props
new file mode 100644
index 0000000..da284ce
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/template/content/search/en-us.props
@@ -0,0 +1,45 @@
+DEF01=this
+DEF02=is
+DEF03=the
+DEF04=in
+DEF05=i
+DEF06=on
+DEF07=a
+DEF08=about
+DEF09=an
+DEF10=are
+DEF11=as
+DEF12=at
+DEF13=be
+DEF14=by
+DEF15=com
+DEF16=de
+DEF17=en
+DEF18=for
+DEF19=from
+DEF20=how
+DEF21=it
+DEF22=la
+DEF23=of
+DEF24=on
+DEF25=or
+DEF26=that
+DEF27=to
+DEF28=was
+DEF29=what
+DEF30=when
+DEF31=where
+DEF32=who
+DEF33=will
+DEF34=with
+DEF35=und
+DEF36=Next
+DEF37=Prev
+DEF38=Home
+DEF39=Motive
+DEF40=Inc
+DEF41=Copyright
+DEF42=All
+DEF43=rights
+DEF44=reserved
+DEF45=Up \ No newline at end of file
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/template/content/search/es-es.props b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/template/content/search/es-es.props
new file mode 100644
index 0000000..fb73bdc
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/template/content/search/es-es.props
@@ -0,0 +1,179 @@
+DEF01=un
+DEF02=una
+DEF03=unas
+DEF04=unos
+DEF05=uno
+DEF06=sobre
+DEF07=todo
+DEF08=también
+DEF09=tras
+DEF10=otro
+DEF11=algún
+DEF12=alguno
+DEF13=alguna
+DEF14=algunos
+DEF15=algunas
+DEF16=ser
+DEF17=es
+DEF18=soy
+DEF19=eres
+DEF20=somos
+DEF21=sois
+DEF22=estoy
+DEF23=esta
+DEF24=estamos
+DEF25=estais
+DEF26=estan
+DEF27=como
+DEF28=en
+DEF29=para
+DEF30=atras
+DEF31=porque
+DEF32=por
+DEF33=estado
+DEF34=estaba
+DEF35=ante
+DEF36=antes
+DEF37=siendo
+DEF38=ambos
+DEF39=pero
+DEF40=por
+DEF41=poder
+DEF42=puede
+DEF43=puedo
+DEF44=podemos
+DEF45=podeis
+DEF46=pueden
+DEF47=fui
+DEF48=fue
+DEF49=fuimos
+DEF50=fueron
+DEF51=hacer
+DEF52=hago
+DEF53=hace
+DEF54=hacemos
+DEF55=haceis
+DEF56=hacen
+DEF57=cada
+DEF58=fin
+DEF59=incluso
+DEF60=primero
+DEF61=desde
+DEF62=conseguir
+DEF63=consigo
+DEF64=consigue
+DEF65=consigues
+DEF66=conseguimos
+DEF67=consiguen
+DEF68=ir
+DEF69=voy
+DEF70=va
+DEF71=vamos
+DEF72=vais
+DEF73=van
+DEF74=vaya
+DEF75=gueno
+DEF76=ha
+DEF77=tener
+DEF78=tengo
+DEF79=tiene
+DEF80=tenemos
+DEF81=teneis
+DEF82=tienen
+DEF83=el
+DEF84=la
+DEF85=lo
+DEF86=las
+DEF87=los
+DEF88=su
+DEF89=aqui
+DEF90=mio
+DEF91=tuyo
+DEF92=ellos
+DEF93=ellas
+DEF94=nos
+DEF95=nosotros
+DEF96=vosotros
+DEF97=vosotras
+DEF98=si
+DEF99=dentro
+DEF100=solo
+DEF101=solamente
+DEF102=saber
+DEF103=sabes
+DEF104=sabe
+DEF105=sabemos
+DEF106=sabeis
+DEF107=saben
+DEF108=ultimo
+DEF109=largo
+DEF110=bastante
+DEF111=haces
+DEF112=muchos
+DEF113=aquellos
+DEF114=aquellas
+DEF115=sus
+DEF116=entonces
+DEF117=tiempo
+DEF118=verdad
+DEF119=verdadero
+DEF120=verdadera
+DEF121=cierto
+DEF122=ciertos
+DEF123=cierta
+DEF124=ciertas
+DEF125=intentar
+DEF126=intento
+DEF127=intenta
+DEF128=intentas
+DEF129=intentamos
+DEF130=intentais
+DEF131=intentan
+DEF132=dos
+DEF133=bajo
+DEF134=arriba
+DEF135=encima
+DEF136=usar
+DEF137=uso
+DEF138=usas
+DEF139=usa
+DEF140=usamos
+DEF141=usais
+DEF142=usan
+DEF143=emplear
+DEF144=empleo
+DEF145=empleas
+DEF146=emplean
+DEF147=ampleamos
+DEF148=empleais
+DEF149=valor
+DEF150=muy
+DEF151=era
+DEF152=eras
+DEF153=eramos
+DEF154=eran
+DEF155=modo
+DEF156=bien
+DEF157=cual
+DEF158=cuando
+DEF159=donde
+DEF160=mientras
+DEF161=quien
+DEF162=con
+DEF163=entre
+DEF164=sin
+DEF165=trabajo
+DEF166=trabajar
+DEF167=trabajas
+DEF168=trabaja
+DEF169=trabajamos
+DEF170=trabajais
+DEF171=trabajan
+DEF172=podria
+DEF173=podrias
+DEF174=podriamos
+DEF175=podrian
+DEF176=podriais
+DEF177=yo
+DEF178=aquel
+DEF179=qué \ No newline at end of file
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/template/content/search/ja-jp.props b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/template/content/search/ja-jp.props
new file mode 100644
index 0000000..2756805
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/template/content/search/ja-jp.props
@@ -0,0 +1 @@
+J01=\\u306B \ No newline at end of file
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/template/content/search/nwSearchFnt.js b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/template/content/search/nwSearchFnt.js
new file mode 100644
index 0000000..0111559
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/template/content/search/nwSearchFnt.js
@@ -0,0 +1,513 @@
+/*----------------------------------------------------------------------------
+ * JavaScript for webhelp search
+ *----------------------------------------------------------------------------
+ This file is part of the webhelpsearch plugin for DocBook WebHelp
+ Copyright (c) 2007-2008 NexWave Solutions All Rights Reserved.
+ www.nexwave.biz Nadege Quaine
+ http://kasunbg.blogspot.com/ Kasun Gajasinghe
+ */
+
+//string initialization
+var htmlfileList = "htmlFileList.js";
+var htmlfileinfoList = "htmlFileInfoList.js";
+var useCJKTokenizing = false;
+
+/* Cette fonction verifie la validite de la recherche entrre par l utilisateur */
+function Verifie(ditaSearch_Form) {
+
+ // Check browser compatibitily
+ if (navigator.userAgent.indexOf("Konquerer") > -1) {
+
+ alert(txt_browser_not_supported);
+ return;
+ }
+
+
+ var expressionInput = document.ditaSearch_Form.textToSearch.value;
+ //Set a cookie to store the searched keywords
+ $.cookie('textToSearch', expressionInput);
+
+
+ if (expressionInput.length < 1) {
+
+ // expression is invalid
+ alert(txt_enter_at_least_1_char);
+ // reactive la fenetre de search (utile car cadres)
+ document.ditaSearch_Form.textToSearch.focus();
+ }
+ else {
+
+ // Effectuer la recherche
+ Effectuer_recherche(expressionInput);
+
+ // reactive la fenetre de search (utile car cadres)
+ document.ditaSearch_Form.textToSearch.focus();
+ }
+}
+
+var stemQueryMap = new Array(); // A hashtable which maps stems to query words
+
+/* This function parses the search expression, loads the indices and displays the results*/
+function Effectuer_recherche(expressionInput) {
+
+ /* Display a waiting message */
+ //DisplayWaitingMessage();
+
+ /*data initialisation*/
+ var searchFor = ""; // expression en lowercase et sans les caracte res speciaux
+ //w = new Object(); // hashtable, key=word, value = list of the index of the html files
+ scriptLetterTab = new Scriptfirstchar(); // Array containing the first letter of each word to look for
+ var wordsList = new Array(); // Array with the words to look for
+ var finalWordsList = new Array(); // Array with the words to look for after removing spaces
+ var linkTab = new Array();
+ var fileAndWordList = new Array();
+ var txt_wordsnotfound = "";
+
+
+ /*nqu: expressionInput, la recherche est lower cased, plus remplacement des char speciaux*/
+ searchFor = expressionInput.toLowerCase().replace(/<\//g, "_st_").replace(/\$_/g, "_di_").replace(/\.|%2C|%3B|%21|%3A|@|\/|\*/g, " ").replace(/(%20)+/g, " ").replace(/_st_/g, "</").replace(/_di_/g, "%24_");
+
+ searchFor = searchFor.replace(/ +/g, " ");
+ searchFor = searchFor.replace(/ $/, "").replace(/^ /, "");
+
+ wordsList = searchFor.split(" ");
+ wordsList.sort();
+
+ //set the tokenizing method
+ if(typeof indexerLanguage != "undefined" && (indexerLanguage=="zh" || indexerLanguage=="ja" ||indexerLanguage=="ko")){
+ useCJKTokenizing=true;
+ } else {
+ useCJKTokenizing=false;
+ }
+ //If Lucene CJKTokenizer was used as the indexer, then useCJKTokenizing will be true. Else, do normal tokenizing.
+ // 2-gram tokenizinghappens in CJKTokenizing,
+ if(useCJKTokenizing){
+ finalWordsList = cjkTokenize(wordsList);
+ } else {
+ finalWordsList = tokenize(wordsList);
+ }
+
+ //load the scripts with the indices: the following lines do not work on the server. To be corrected
+ /*if (IEBrowser) {
+ scriptsarray = loadTheIndexScripts (scriptLetterTab);
+ } */
+
+ /**
+ * Compare with the indexed words (in the w[] array), and push words that are in it to tempTab.
+ */
+ var tempTab = new Array();
+ for (var t in finalWordsList) {
+ if (w[finalWordsList[t].toString()] == undefined) {
+ txt_wordsnotfound += finalWordsList[t] + " ";
+ } else {
+ tempTab.push(finalWordsList[t]);
+ }
+ }
+ finalWordsList = tempTab;
+
+ if (finalWordsList.length) {
+
+ //search 'and' and 'or' one time
+ fileAndWordList = SortResults(finalWordsList);
+
+ var cpt = fileAndWordList.length;
+ for (var i = cpt - 1; i >= 0; i--) {
+ if (fileAndWordList[i] != undefined) {
+ linkTab.push("<p>" + txt_results_for + " " + "<span class=\"searchExpression\">" + fileAndWordList[i][0].motslisteDisplay + "</span>" + "</p>");
+
+ linkTab.push("<ul class='searchresult'>");
+ for (t in fileAndWordList[i]) {
+ //DEBUG: alert(": "+ fileAndWordList[i][t].filenb+" " +fileAndWordList[i][t].motsliste);
+ //linkTab.push("<li><a href=\"../"+fl[fileAndWordList[i][t].filenb]+"\">"+fl[fileAndWordList[i][t].filenb]+"</a></li>");
+ var tempInfo = fil[fileAndWordList[i][t].filenb];
+ var pos1 = tempInfo.indexOf("@@@");
+ var pos2 = tempInfo.lastIndexOf("@@@");
+ var tempPath = tempInfo.substring(0, pos1);
+ var tempTitle = tempInfo.substring(pos1 + 3, pos2);
+ var tempShortdesc = tempInfo.substring(pos2 + 3, tempInfo.length);
+
+ //file:///home/kasun/docbook/WEBHELP/webhelp-draft-output-format-idea/src/main/resources/web/webhelp/installation.html
+ var linkString = "<li><a href=" + tempPath + ">" + tempTitle + "</a>";
+ // var linkString = "<li><a href=\"installation.html\">" + tempTitle + "</a>";
+ if ((tempShortdesc != "null")) {
+ linkString += "\n<div class=\"shortdesclink\">" + tempShortdesc + "</div>";
+ }
+ linkString += "</li>";
+ linkTab.push(linkString);
+ }
+ linkTab.push("</ul>");
+ }
+ }
+ }
+
+ var results = "";
+ if (linkTab.length > 0) {
+ /*writeln ("<p>" + txt_results_for + " " + "<span class=\"searchExpression\">" + cleanwordsList + "</span>" + "<br/>"+"</p>");*/
+ results = "<p>";
+ //write("<ul class='searchresult'>");
+ for (t in linkTab) {
+ results += linkTab[t].toString();
+ }
+ results += "</p>";
+ } else {
+ results = "<p>" + "Your search returned no results for " + "<span class=\"searchExpression\">" + txt_wordsnotfound + "</span>" + "</p>";
+ }
+ //alert(results);
+ document.getElementById('searchResults').innerHTML = results;
+}
+
+function tokenize(wordsList){
+ var stemmedWordsList = new Array(); // Array with the words to look for after removing spaces
+ var cleanwordsList = new Array(); // Array with the words to look for
+ for(var j in wordsList){
+ var word = wordsList[j];
+ if(typeof stemmer != "undefined" ){
+ stemQueryMap[stemmer(word)] = word;
+ } else {
+ stemQueryMap[word] = word;
+ }
+ }
+ //stemmedWordsList is the stemmed list of words separated by spaces.
+ for (var t in wordsList) {
+ wordsList[t] = wordsList[t].replace(/(%22)|^-/g, "");
+ if (wordsList[t] != "%20") {
+ scriptLetterTab.add(wordsList[t].charAt(0));
+ cleanwordsList.push(wordsList[t]);
+ }
+ }
+
+ if(typeof stemmer != "undefined" ){
+ //Do the stemming using Porter's stemming algorithm
+ for (var i = 0; i < cleanwordsList.length; i++) {
+ var stemWord = stemmer(cleanwordsList[i]);
+ stemmedWordsList.push(stemWord);
+ }
+ } else {
+ stemmedWordsList = cleanwordsList;
+ }
+ return stemmedWordsList;
+}
+
+//Invoker of CJKTokenizer class methods.
+function cjkTokenize(wordsList){
+ var allTokens= new Array();
+ var notCJKTokens= new Array();
+ var j=0;
+ for(j=0;j<wordsList.length;j++){
+ var word = wordsList[j];
+ if(getAvgAsciiValue(word) < 127){
+ notCJKTokens.push(word);
+ } else {
+ var tokenizer = new CJKTokenizer(word);
+ var tokensTmp = tokenizer.getAllTokens();
+ allTokens = allTokens.concat(tokensTmp);
+ }
+ }
+ allTokens = allTokens.concat(tokenize(notCJKTokens));
+ return allTokens;
+}
+
+//A simple way to determine whether the query is in english or not.
+function getAvgAsciiValue(word){
+ var tmp = 0;
+ var num = word.length < 5 ? word.length:5;
+ for(var i=0;i<num;i++){
+ if(i==5) break;
+ tmp += word.charCodeAt(i);
+ }
+ return tmp/num;
+}
+
+//CJKTokenizer
+function CJKTokenizer(input){
+ this.input = input;
+ this.offset=-1;
+ this.tokens = new Array();
+ this.incrementToken = incrementToken;
+ this.tokenize = tokenize;
+ this.getAllTokens = getAllTokens;
+ this.unique = unique;
+
+ function incrementToken(){
+ if(this.input.length - 2 <= this.offset){
+ // console.log("false "+offset);
+ return false;
+ }
+ else {
+ this.offset+=1;
+ return true;
+ }
+ }
+
+ function tokenize(){
+ //document.getElementById("content").innerHTML += x.substring(offset,offset+2)+"<br>";
+ return this.input.substring(this.offset,this.offset+2);
+ }
+
+ function getAllTokens(){
+ while(this.incrementToken()){
+ var tmp = this.tokenize();
+ this.tokens.push(tmp);
+ }
+ return this.unique(this.tokens);
+// document.getElementById("content").innerHTML += tokens+" ";
+// document.getElementById("content").innerHTML += "<br>dada"+sortedTokens+" ";
+// console.log(tokens.length+"dsdsds");
+ /*for(i=0;i<tokens.length;i++){
+ console.log(tokens[i]);
+ var ss = tokens[i] == sortedTokens[i];
+
+// document.getElementById("content").innerHTML += "<br>dada"+un[i]+"- "+stems[i]+"&nbsp;&nbsp;&nbsp;"+ ss;
+ document.getElementById("content").innerHTML += "<br>"+sortedTokens[i];
+ }*/
+ }
+
+ function unique(a)
+ {
+ var r = new Array();
+ o:for(var i = 0, n = a.length; i < n; i++)
+ {
+ for(var x = 0, y = r.length; x < y; x++)
+ {
+ if(r[x]==a[i]) continue o;
+ }
+ r[r.length] = a[i];
+ }
+ return r;
+ }
+}
+
+
+/* Scriptfirstchar: to gather the first letter of index js files to upload */
+function Scriptfirstchar() {
+ this.strLetters = "";
+ this.add = addLettre;
+}
+
+function addLettre(caract) {
+
+ if (this.strLetters == 'undefined') {
+ this.strLetters = caract;
+ } else if (this.strLetters.indexOf(caract) < 0) {
+ this.strLetters += caract;
+ }
+
+ return 0;
+}
+/* end of scriptfirstchar */
+
+/*main loader function*/
+/*tab contains the first letters of each word looked for*/
+function loadTheIndexScripts(tab) {
+
+ //alert (tab.strLetters);
+ var scriptsarray = new Array();
+
+ for (var i = 0; i < tab.strLetters.length; i++) {
+
+ scriptsarray[i] = "..\/search" + "\/" + tab.strLetters.charAt(i) + ".js";
+ }
+ // add the list of html files
+ i++;
+ scriptsarray[i] = "..\/search" + "\/" + htmlfileList;
+
+ //debug
+ for (var t in scriptsarray) {
+ //alert (scriptsarray[t]);
+ }
+
+ tab = new ScriptLoader();
+ for (t in scriptsarray) {
+ tab.add(scriptsarray[t]);
+ }
+ tab.load();
+ //alert ("scripts loaded");
+ return (scriptsarray);
+}
+
+/* ScriptLoader: to load the scripts and wait that it's finished */
+function ScriptLoader() {
+ this.cpt = 0;
+ this.scriptTab = new Array();
+ this.add = addAScriptInTheList;
+ this.load = loadTheScripts;
+ this.onScriptLoaded = onScriptLoadedFunc;
+}
+
+function addAScriptInTheList(scriptPath) {
+ this.scriptTab.push(scriptPath);
+}
+
+function loadTheScripts() {
+ var script;
+ var head;
+
+ head = document.getElementsByTagName('head').item(0);
+
+ //script = document.createElement('script');
+
+ for (var el in this.scriptTab) {
+ //alert (el+this.scriptTab[el]);
+ script = document.createElement('script');
+ script.src = this.scriptTab[el];
+ script.type = 'text/javascript';
+ script.defer = false;
+
+ head.appendChild(script);
+ }
+
+}
+
+function onScriptLoadedFunc(e) {
+ e = e || window.event;
+ var target = e.target || e.srcElement;
+ var isComplete = true;
+ if (typeof target.readyState != undefined) {
+
+ isComplete = (target.readyState == "complete" || target.readyState == "loaded");
+ }
+ if (isComplete) {
+ ScriptLoader.cpt++;
+ if (ScriptLoader.cpt == ScriptLoader.scripts.length) {
+ ScriptLoader.onLoadComplete();
+ }
+ }
+}
+
+/*
+function onLoadComplete() {
+ alert("loaded !!");
+} */
+
+/* End of scriptloader functions */
+
+// Array.unique( strict ) - Remove duplicate values
+function unique(tab) {
+ var a = new Array();
+ var i;
+ var l = tab.length;
+
+ if (tab[0] != undefined) {
+ a[0] = tab[0];
+ }
+ else {
+ return -1
+ }
+
+ for (i = 1; i < l; i++) {
+ if (indexof(a, tab[i], 0) < 0) {
+ a.push(tab[i]);
+ }
+ }
+ return a;
+}
+function indexof(tab, element, begin) {
+ for (var i = begin; i < tab.length; i++) {
+ if (tab[i] == element) {
+ return i;
+ }
+ }
+ return -1;
+
+}
+/* end of Array functions */
+
+
+/*
+ Param: mots= list of words to look for.
+ This function creates an hashtable:
+ - The key is the index of a html file which contains a word to look for.
+ - The value is the list of all words contained in the html file.
+
+ Return value: the hashtable fileAndWordList
+ */
+function SortResults(mots) {
+
+ var fileAndWordList = new Object();
+ if (mots.length == 0) {
+ return null;
+ }
+
+ for (var t in mots) {
+ // get the list of the indices of the files.
+ var listNumerosDesFicStr = w[mots[t].toString()];
+ //alert ("listNumerosDesFicStr "+listNumerosDesFicStr);
+ var tab = listNumerosDesFicStr.split(",");
+
+ //for each file (file's index):
+ for (var t2 in tab) {
+ var temp = tab[t2].toString();
+ if (fileAndWordList[temp] == undefined) {
+
+ fileAndWordList[temp] = "" + mots[t];
+ } else {
+
+ fileAndWordList[temp] += "," + mots[t];
+ }
+ }
+ }
+
+ var fileAndWordListValuesOnly = new Array();
+
+ // sort results according to values
+ var temptab = new Array();
+ for (t in fileAndWordList) {
+ tab = fileAndWordList[t].split(',');
+
+ var tempDisplay = new Array();
+ for (var x in tab) {
+ if(stemQueryMap[tab[x]] != undefined){
+ tempDisplay.push(stemQueryMap[tab[x]]); //get the original word from the stem word.
+ } else {
+ tempDisplay.push(tab[x]); //no stem is available. (probably a CJK language)
+ }
+ }
+ var tempDispString = tempDisplay.join(", ");
+
+ temptab.push(new resultPerFile(t, fileAndWordList[t], tab.length, tempDispString));
+ fileAndWordListValuesOnly.push(fileAndWordList[t]);
+ }
+
+
+ //alert("t"+fileAndWordListValuesOnly.toString());
+
+ fileAndWordListValuesOnly = unique(fileAndWordListValuesOnly);
+ fileAndWordListValuesOnly = fileAndWordListValuesOnly.sort(compare_nbMots);
+ //alert("t: "+fileAndWordListValuesOnly.join(';'));
+
+ var listToOutput = new Array();
+
+ for (var j in fileAndWordListValuesOnly) {
+ for (t in temptab) {
+ if (temptab[t].motsliste == fileAndWordListValuesOnly[j]) {
+ if (listToOutput[j] == undefined) {
+ listToOutput[j] = new Array(temptab[t]);
+ } else {
+ listToOutput[j].push(temptab[t]);
+ }
+ }
+ }
+ }
+ return listToOutput;
+}
+
+function resultPerFile(filenb, motsliste, motsnb, motslisteDisplay) {
+ this.filenb = filenb;
+ this.motsliste = motsliste;
+ this.motsnb = motsnb;
+ this.motslisteDisplay= motslisteDisplay;
+}
+
+function compare_nbMots(s1, s2) {
+ var t1 = s1.split(',');
+ var t2 = s2.split(',');
+ //alert ("s1:"+t1.length + " " +t2.length)
+ if (t1.length == t2.length) {
+ return 0;
+ } else if (t1.length > t2.length) {
+ return 1;
+ } else {
+ return -1;
+ }
+ //return t1.length - t2.length);
+} \ No newline at end of file
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/template/content/search/punctuation.props b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/template/content/search/punctuation.props
new file mode 100644
index 0000000..d3e3fcd
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/template/content/search/punctuation.props
@@ -0,0 +1,31 @@
+Punct01=\\u3002
+Punct02=\\u3003
+Punct03=\\u300C
+Punct04=\\u300D
+Punct05=\\u300E
+Punct06=\\u300F
+Punct07=\\u301D
+Punct08=\\u301E
+Punct09=\\u301F
+Punct10=\\u309B
+Punct11=\\u2018
+Punct12=\\u2019
+Punct13=\\u201A
+Punct14=\\u201C
+Punct15=\\u201D
+Punct16=\\u201E
+Punct17=\\u2032
+Punct18=\\u2033
+Punct19=\\u2035
+Punct20=\\u2039
+Punct21=\\u203A
+Punct22=\\u201E
+Punct23=\\u00BB
+Punct24=\\u00AB
+Punct25=©
+Punct26=’
+Punct27=\\u00A0
+Punct28=\\u2014
+
+
+
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/template/content/search/stemmers/de_stemmer.js b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/template/content/search/stemmers/de_stemmer.js
new file mode 100644
index 0000000..7ff3822
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/template/content/search/stemmers/de_stemmer.js
@@ -0,0 +1,247 @@
+/*
+ * Author: Joder Illi
+ *
+ * Copyright (c) 2010, FormBlitz AG
+ * All rights reserved.
+ * Implementation of the stemming algorithm from http://snowball.tartarus.org/algorithms/german/stemmer.html
+ * Copyright of the algorithm is: Copyright (c) 2001, Dr Martin Porter and can be found at http://snowball.tartarus.org/license.php
+ *
+ * Redistribution and use in source and binary forms, with or without modification, is covered by the standard BSD license.
+ *
+ */
+
+//var stemmer = function Stemmer() {
+ /*
+ German includes the following accented forms,
+ ä ö ü
+ and a special letter, ß, equivalent to double s.
+ The following letters are vowels:
+ a e i o u y ä ö ü
+ */
+
+ var stemmer = function(word) {
+ /*
+ Put u and y between vowels into upper case
+ */
+ word = word.replace(/([aeiouyäöü])u([aeiouyäöü])/g, '$1U$2');
+ word = word.replace(/([aeiouyäöü])y([aeiouyäöü])/g, '$1Y$2');
+
+ /*
+ and then do the following mappings,
+ (a) replace ß with ss,
+ (a) replace ae with ä, Not doing these, have trouble with diphtongs
+ (a) replace oe with ö, Not doing these, have trouble with diphtongs
+ (a) replace ue with ü unless preceded by q. Not doing these, have trouble with diphtongs
+ So in quelle, ue is not mapped to ü because it follows q, and in feuer it is not mapped because the first part of the rule changes it to feUer, so the u is not found.
+ */
+ word = word.replace(/ß/g, 'ss');
+ //word = word.replace(/ae/g, 'ä');
+ //word = word.replace(/oe/g, 'ö');
+ //word = word.replace(/([^q])ue/g, '$1ü');
+
+ /*
+ R1 and R2 are first set up in the standard way (see the note on R1 and R2), but then R1 is adjusted so that the region before it contains at least 3 letters.
+ R1 is the region after the first non-vowel following a vowel, or is the null region at the end of the word if there is no such non-vowel.
+ R2 is the region after the first non-vowel following a vowel in R1, or is the null region at the end of the word if there is no such non-vowel.
+ */
+
+ var r1Index = word.search(/[aeiouyäöü][^aeiouyäöü]/);
+ var r1 = '';
+ if (r1Index != -1) {
+ r1Index += 2;
+ r1 = word.substring(r1Index);
+ }
+
+ var r2Index = -1;
+ var r2 = '';
+
+ if (r1Index != -1) {
+ var r2Index = r1.search(/[aeiouyäöü][^aeiouyäöü]/);
+ if (r2Index != -1) {
+ r2Index += 2;
+ r2 = r1.substring(r2Index);
+ r2Index += r1Index;
+ } else {
+ r2 = '';
+ }
+ }
+
+ if (r1Index != -1 && r1Index < 3) {
+ r1Index = 3;
+ r1 = word.substring(r1Index);
+ }
+
+ /*
+ Define a valid s-ending as one of b, d, f, g, h, k, l, m, n, r or t.
+ Define a valid st-ending as the same list, excluding letter r.
+ */
+
+ /*
+ Do each of steps 1, 2 and 3.
+ */
+
+ /*
+ Step 1:
+ Search for the longest among the following suffixes,
+ (a) em ern er
+ (b) e en es
+ (c) s (preceded by a valid s-ending)
+ */
+ var a1Index = word.search(/(em|ern|er)$/g);
+ var b1Index = word.search(/(e|en|es)$/g);
+ var c1Index = word.search(/([bdfghklmnrt]s)$/g);
+ if (c1Index != -1) {
+ c1Index++;
+ }
+ var index1 = 10000;
+ var optionUsed1 = '';
+ if (a1Index != -1 && a1Index < index1) {
+ optionUsed1 = 'a';
+ index1 = a1Index;
+ }
+ if (b1Index != -1 && b1Index < index1) {
+ optionUsed1 = 'b';
+ index1 = b1Index;
+ }
+ if (c1Index != -1 && c1Index < index1) {
+ optionUsed1 = 'c';
+ index1 = c1Index;
+ }
+
+ /*
+ and delete if in R1. (Of course the letter of the valid s-ending is not necessarily in R1.) If an ending of group (b) is deleted, and the ending is preceded by niss, delete the final s.
+ (For example, äckern -> äck, ackers -> acker, armes -> arm, bedürfnissen -> bedürfnis)
+ */
+
+ if (index1 != 10000 && r1Index != -1) {
+ if (index1 >= r1Index) {
+ word = word.substring(0, index1);
+ if (optionUsed1 == 'b') {
+ if (word.search(/niss$/) != -1) {
+ word = word.substring(0, word.length -1);
+ }
+ }
+ }
+ }
+ /*
+ Step 2:
+ Search for the longest among the following suffixes,
+ (a) en er est
+ (b) st (preceded by a valid st-ending, itself preceded by at least 3 letters)
+ */
+
+ var a2Index = word.search(/(en|er|est)$/g);
+ var b2Index = word.search(/(.{3}[bdfghklmnt]st)$/g);
+ if (b2Index != -1) {
+ b2Index += 4;
+ }
+
+ var index2 = 10000;
+ var optionUsed2 = '';
+ if (a2Index != -1 && a2Index < index2) {
+ optionUsed2 = 'a';
+ index2 = a2Index;
+ }
+ if (b2Index != -1 && b2Index < index2) {
+ optionUsed2 = 'b';
+ index2 = b2Index;
+ }
+
+ /*
+ and delete if in R1.
+ (For example, derbsten -> derbst by step 1, and derbst -> derb by step 2, since b is a valid st-ending, and is preceded by just 3 letters)
+ */
+
+ if (index2 != 10000 && r1Index != -1) {
+ if (index2 >= r1Index) {
+ word = word.substring(0, index2);
+ }
+ }
+
+ /*
+ Step 3: d-suffixes (*)
+ Search for the longest among the following suffixes, and perform the action indicated.
+ end ung
+ delete if in R2
+ if preceded by ig, delete if in R2 and not preceded by e
+ ig ik isch
+ delete if in R2 and not preceded by e
+ lich heit
+ delete if in R2
+ if preceded by er or en, delete if in R1
+ keit
+ delete if in R2
+ if preceded by lich or ig, delete if in R2
+ */
+
+ var a3Index = word.search(/(end|ung)$/g);
+ var b3Index = word.search(/[^e](ig|ik|isch)$/g);
+ var c3Index = word.search(/(lich|heit)$/g);
+ var d3Index = word.search(/(keit)$/g);
+ if (b3Index != -1) {
+ b3Index ++;
+ }
+
+ var index3 = 10000;
+ var optionUsed3 = '';
+ if (a3Index != -1 && a3Index < index3) {
+ optionUsed3 = 'a';
+ index3 = a3Index;
+ }
+ if (b3Index != -1 && b3Index < index3) {
+ optionUsed3 = 'b';
+ index3 = b3Index;
+ }
+ if (c3Index != -1 && c3Index < index3) {
+ optionUsed3 = 'c';
+ index3 = c3Index;
+ }
+ if (d3Index != -1 && d3Index < index3) {
+ optionUsed3 = 'd';
+ index3 = d3Index;
+ }
+
+ if (index3 != 10000 && r2Index != -1) {
+ if (index3 >= r2Index) {
+ word = word.substring(0, index3);
+ var optionIndex = -1;
+ var optionSubsrt = '';
+ if (optionUsed3 == 'a') {
+ optionIndex = word.search(/[^e](ig)$/);
+ if (optionIndex != -1) {
+ optionIndex++;
+ if (optionIndex >= r2Index) {
+ word = word.substring(0, optionIndex);
+ }
+ }
+ } else if (optionUsed3 == 'c') {
+ optionIndex = word.search(/(er|en)$/);
+ if (optionIndex != -1) {
+ if (optionIndex >= r1Index) {
+ word = word.substring(0, optionIndex);
+ }
+ }
+ } else if (optionUsed3 == 'd') {
+ optionIndex = word.search(/(lich|ig)$/);
+ if (optionIndex != -1) {
+ if (optionIndex >= r2Index) {
+ word = word.substring(0, optionIndex);
+ }
+ }
+ }
+ }
+ }
+
+ /*
+ Finally,
+ turn U and Y back into lower case, and remove the umlaut accent from a, o and u.
+ */
+ word = word.replace(/U/g, 'u');
+ word = word.replace(/Y/g, 'y');
+ word = word.replace(/ä/g, 'a');
+ word = word.replace(/ö/g, 'o');
+ word = word.replace(/ü/g, 'u');
+
+ return word;
+ };
+//} \ No newline at end of file
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/template/content/search/stemmers/en_stemmer.js b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/template/content/search/stemmers/en_stemmer.js
new file mode 100644
index 0000000..f58012f
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/template/content/search/stemmers/en_stemmer.js
@@ -0,0 +1,187 @@
+// Porter stemmer in Javascript. Few comments, but it's easy to follow against the rules in the original
+// paper, in
+//
+// Porter, 1980, An algorithm for suffix stripping, Program, Vol. 14,
+// no. 3, pp 130-137,
+//
+// see also http://www.tartarus.org/~martin/PorterStemmer
+
+// Release 1 be 'andargor', Jul 2004
+// Release 2 (substantially revised) by Christopher McKenzie, Aug 2009
+
+
+var stemmer = (function(){
+ var step2list = {
+ "ational" : "ate",
+ "tional" : "tion",
+ "enci" : "ence",
+ "anci" : "ance",
+ "izer" : "ize",
+ "bli" : "ble",
+ "alli" : "al",
+ "entli" : "ent",
+ "eli" : "e",
+ "ousli" : "ous",
+ "ization" : "ize",
+ "ation" : "ate",
+ "ator" : "ate",
+ "alism" : "al",
+ "iveness" : "ive",
+ "fulness" : "ful",
+ "ousness" : "ous",
+ "aliti" : "al",
+ "iviti" : "ive",
+ "biliti" : "ble",
+ "logi" : "log"
+ },
+
+ step3list = {
+ "icate" : "ic",
+ "ative" : "",
+ "alize" : "al",
+ "iciti" : "ic",
+ "ical" : "ic",
+ "ful" : "",
+ "ness" : ""
+ },
+
+ c = "[^aeiou]", // consonant
+ v = "[aeiouy]", // vowel
+ C = c + "[^aeiouy]*", // consonant sequence
+ V = v + "[aeiou]*", // vowel sequence
+
+ mgr0 = "^(" + C + ")?" + V + C, // [C]VC... is m>0
+ meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$", // [C]VC[V] is m=1
+ mgr1 = "^(" + C + ")?" + V + C + V + C, // [C]VCVC... is m>1
+ s_v = "^(" + C + ")?" + v; // vowel in stem
+
+ return function (w) {
+ var stem,
+ suffix,
+ firstch,
+ re,
+ re2,
+ re3,
+ re4,
+ origword = w;
+
+ if (w.length < 3) { return w; }
+
+ firstch = w.substr(0,1);
+ if (firstch == "y") {
+ w = firstch.toUpperCase() + w.substr(1);
+ }
+
+ // Step 1a
+ re = /^(.+?)(ss|i)es$/;
+ re2 = /^(.+?)([^s])s$/;
+
+ if (re.test(w)) { w = w.replace(re,"$1$2"); }
+ else if (re2.test(w)) { w = w.replace(re2,"$1$2"); }
+
+ // Step 1b
+ re = /^(.+?)eed$/;
+ re2 = /^(.+?)(ed|ing)$/;
+ if (re.test(w)) {
+ var fp = re.exec(w);
+ re = new RegExp(mgr0);
+ if (re.test(fp[1])) {
+ re = /.$/;
+ w = w.replace(re,"");
+ }
+ } else if (re2.test(w)) {
+ var fp = re2.exec(w);
+ stem = fp[1];
+ re2 = new RegExp(s_v);
+ if (re2.test(stem)) {
+ w = stem;
+ re2 = /(at|bl|iz)$/;
+ re3 = new RegExp("([^aeiouylsz])\\1$");
+ re4 = new RegExp("^" + C + v + "[^aeiouwxy]$");
+ if (re2.test(w)) { w = w + "e"; }
+ else if (re3.test(w)) { re = /.$/; w = w.replace(re,""); }
+ else if (re4.test(w)) { w = w + "e"; }
+ }
+ }
+
+ // Step 1c
+ re = /^(.+?)y$/;
+ if (re.test(w)) {
+ var fp = re.exec(w);
+ stem = fp[1];
+ re = new RegExp(s_v);
+ if (re.test(stem)) { w = stem + "i"; }
+ }
+
+ // Step 2
+ re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/;
+ if (re.test(w)) {
+ var fp = re.exec(w);
+ stem = fp[1];
+ suffix = fp[2];
+ re = new RegExp(mgr0);
+ if (re.test(stem)) {
+ w = stem + step2list[suffix];
+ }
+ }
+
+ // Step 3
+ re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/;
+ if (re.test(w)) {
+ var fp = re.exec(w);
+ stem = fp[1];
+ suffix = fp[2];
+ re = new RegExp(mgr0);
+ if (re.test(stem)) {
+ w = stem + step3list[suffix];
+ }
+ }
+
+ // Step 4
+ re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/;
+ re2 = /^(.+?)(s|t)(ion)$/;
+ if (re.test(w)) {
+ var fp = re.exec(w);
+ stem = fp[1];
+ re = new RegExp(mgr1);
+ if (re.test(stem)) {
+ w = stem;
+ }
+ } else if (re2.test(w)) {
+ var fp = re2.exec(w);
+ stem = fp[1] + fp[2];
+ re2 = new RegExp(mgr1);
+ if (re2.test(stem)) {
+ w = stem;
+ }
+ }
+
+ // Step 5
+ re = /^(.+?)e$/;
+ if (re.test(w)) {
+ var fp = re.exec(w);
+ stem = fp[1];
+ re = new RegExp(mgr1);
+ re2 = new RegExp(meq1);
+ re3 = new RegExp("^" + C + v + "[^aeiouwxy]$");
+ if (re.test(stem) || (re2.test(stem) && !(re3.test(stem)))) {
+ w = stem;
+ }
+ }
+
+ re = /ll$/;
+ re2 = new RegExp(mgr1);
+ if (re.test(w) && re2.test(w)) {
+ re = /.$/;
+ w = w.replace(re,"");
+ }
+
+ // and turn initial Y back to y
+
+ if (firstch == "y") {
+ w = firstch.toLowerCase() + w.substr(1);
+ }
+
+ return w;
+ }
+})(); \ No newline at end of file
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/template/content/search/stemmers/fr_stemmer.js b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/template/content/search/stemmers/fr_stemmer.js
new file mode 100644
index 0000000..34f9743
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/template/content/search/stemmers/fr_stemmer.js
@@ -0,0 +1,299 @@
+/*
+ * Author: Kasun Gajasinghe
+ * E-Mail: kasunbg AT gmail DOT com
+ * Date: 09.08.2010
+ *
+ * usage: stemmer(word);
+ * ex: var stem = stemmer(foobar);
+ * Implementation of the stemming algorithm from http://snowball.tartarus.org/algorithms/french/stemmer.html
+ *
+ * LICENSE:
+ *
+ * Copyright (c) 2010, Kasun Gajasinghe. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ *
+ *
+ * THIS SOFTWARE IS PROVIDED BY KASUN GAJASINGHE ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+ * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL KASUN GAJASINGHE BE LIABLE FOR ANY DIRECT,
+ * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+ * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
+ * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+
+var stemmer = function(word){
+// Letters in French include the following accented forms,
+// â à ç ë é ê è ï î ô û ù
+// The following letters are vowels:
+// a e i o u y â à ë é ê è ï î ô û ù
+
+ word = word.toLowerCase();
+ var oriWord = word;
+ word = word.replace(/qu/g, 'qU'); //have to perform first, as after the operation, capital U is not treated as a vowel
+ word = word.replace(/([aeiouyâàëéêèïîôûù])u([aeiouyâàëéêèïîôûù])/g, '$1U$2');
+ word = word.replace(/([aeiouyâàëéêèïîôûù])i([aeiouyâàëéêèïîôûù])/g, '$1I$2');
+ word = word.replace(/([aeiouyâàëéêèïîôûù])y/g, '$1Y');
+ word = word.replace(/y([aeiouyâàëéêèïîôûù])/g, 'Y$1');
+
+ var rv='';
+ var rvIndex = -1;
+ if(word.search(/^(par|col|tap)/) != -1 || word.search(/^[aeiouyâàëéêèïîôûù]{2}/) != -1){
+ rv = word.substring(3);
+ rvIndex = 3;
+ } else {
+ rvIndex = word.substring(1).search(/[aeiouyâàëéêèïîôûù]/);
+ if(rvIndex != -1){
+ rvIndex +=2; //+2 is to supplement the substring(1) used to find rvIndex
+ rv = word.substring(rvIndex);
+ } else {
+ rvIndex = word.length;
+ }
+ }
+
+// R1 is the region after the first non-vowel following a vowel, or the end of the word if there is no such non-vowel.
+// R2 is the region after the first non-vowel following a vowel in R1, or the end of the word if there is no such non-vowel
+ var r1Index = word.search(/[aeiouyâàëéêèïîôûù][^aeiouyâàëéêèïîôûù]/);
+ var r1 = '';
+ if (r1Index != -1) {
+ r1Index += 2;
+ r1 = word.substring(r1Index);
+ } else {
+ r1Index = word.length;
+ }
+
+ var r2Index = -1;
+ var r2 = '';
+ if (r1Index != -1) {
+ r2Index = r1.search(/[aeiouyâàëéêèïîôûù][^aeiouyâàëéêèïîôûù]/);
+ if (r2Index != -1) {
+ r2Index += 2;
+ r2 = r1.substring(r2Index);
+ r2Index += r1Index;
+ } else {
+ r2 = '';
+ r2Index = word.length;
+ }
+ }
+ if (r1Index != -1 && r1Index < 3) {
+ r1Index = 3;
+ r1 = word.substring(r1Index);
+ }
+
+ /*
+ Step 1: Standard suffix removal
+ */
+ var a1Index = word.search(/(ance|iqUe|isme|able|iste|eux|ances|iqUes|ismes|ables|istes)$/);
+ var a2Index = word.search(/(atrice|ateur|ation|atrices|ateurs|ations)$/);
+ var a3Index = word.search(/(logie|logies)$/);
+ var a4Index = word.search(/(usion|ution|usions|utions)$/);
+ var a5Index = word.search(/(ence|ences)$/);
+ var a6Index = word.search(/(ement|ements)$/);
+ var a7Index = word.search(/(ité|ités)$/);
+ var a8Index = word.search(/(if|ive|ifs|ives)$/);
+ var a9Index = word.search(/(eaux)$/);
+ var a10Index = word.search(/(aux)$/);
+ var a11Index = word.search(/(euse|euses)$/);
+ var a12Index = word.search(/[^aeiouyâàëéêèïîôûù](issement|issements)$/);
+ var a13Index = word.search(/(amment)$/);
+ var a14Index = word.search(/(emment)$/);
+ var a15Index = word.search(/[aeiouyâàëéêèïîôûù](ment|ments)$/);
+
+ if(a1Index != -1 && a1Index >= r2Index){
+ word = word.substring(0,a1Index);
+ } else if(a2Index != -1 && a2Index >= r2Index){
+ word = word.substring(0,a2Index);
+ var a2Index2 = word.search(/(ic)$/);
+ if(a2Index2 != -1 && a2Index2 >= r2Index){
+ word = word.substring(0, a2Index2); //if preceded by ic, delete if in R2,
+ } else { //else replace by iqU
+ word = word.replace(/(ic)$/,'iqU');
+ }
+ } else if(a3Index != -1 && a3Index >= r2Index){
+ word = word.replace(/(logie|logies)$/,'log'); //replace with log if in R2
+ } else if(a4Index != -1 && a4Index >= r2Index){
+ word = word.replace(/(usion|ution|usions|utions)$/,'u'); //replace with u if in R2
+ } else if(a5Index != -1 && a5Index >= r2Index){
+ word = word.replace(/(ence|ences)$/,'ent'); //replace with ent if in R2
+ } else if(a6Index != -1 && a6Index >= rvIndex){
+ word = word.substring(0,a6Index);
+ if(word.search(/(iv)$/) >= r2Index){
+ word = word.replace(/(iv)$/, '');
+ if(word.search(/(at)$/) >= r2Index){
+ word = word.replace(/(at)$/, '');
+ }
+ } else if(word.search(/(eus)$/) != -1){
+ var a6Index2 = word.search(/(eus)$/);
+ if(a6Index2 >=r2Index){
+ word = word.substring(0, a6Index2);
+ } else if(a6Index2 >= r1Index){
+ word = word.substring(0,a6Index2)+"eux";
+ }
+ } else if(word.search(/(abl|iqU)$/) >= r2Index){
+ word = word.replace(/(abl|iqU)$/,''); //if preceded by abl or iqU, delete if in R2,
+ } else if(word.search(/(ièr|Ièr)$/) >= rvIndex){
+ word = word.replace(/(ièr|Ièr)$/,'i'); //if preceded by abl or iqU, delete if in R2,
+ }
+ } else if(a7Index != -1 && a7Index >= r2Index){
+ word = word.substring(0,a7Index); //delete if in R2
+ if(word.search(/(abil)$/) != -1){ //if preceded by abil, delete if in R2, else replace by abl, otherwise,
+ var a7Index2 = word.search(/(abil)$/);
+ if(a7Index2 >=r2Index){
+ word = word.substring(0, a7Index2);
+ } else {
+ word = word.substring(0,a7Index2)+"abl";
+ }
+ } else if(word.search(/(ic)$/) != -1){
+ var a7Index3 = word.search(/(ic)$/);
+ if(a7Index3 != -1 && a7Index3 >= r2Index){
+ word = word.substring(0, a7Index3); //if preceded by ic, delete if in R2,
+ } else { //else replace by iqU
+ word = word.replace(/(ic)$/,'iqU');
+ }
+ } else if(word.search(/(iv)$/) != r2Index){
+ word = word.replace(/(iv)$/,'');
+ }
+ } else if(a8Index != -1 && a8Index >= r2Index){
+ word = word.substring(0,a8Index);
+ if(word.search(/(at)$/) >= r2Index){
+ word = word.replace(/(at)$/, '');
+ if(word.search(/(ic)$/) >= r2Index){
+ word = word.replace(/(ic)$/, '');
+ } else { word = word.replace(/(ic)$/, 'iqU'); }
+ }
+ } else if(a9Index != -1){ word = word.replace(/(eaux)/,'eau')
+ } else if(a10Index >= r1Index){ word = word.replace(/(aux)/,'al')
+ } else if(a11Index != -1 ){
+ var a11Index2 = word.search(/(euse|euses)$/);
+ if(a11Index2 >=r2Index){
+ word = word.substring(0, a11Index2);
+ } else if(a11Index2 >= r1Index){
+ word = word.substring(0, a11Index2)+"eux";
+ }
+ } else if(a12Index!=-1 && a12Index>=r1Index){
+ word = word.substring(0,a12Index+1); //+1- amendment to non-vowel
+ } else if(a13Index!=-1 && a13Index>=rvIndex){
+ word = word.replace(/(amment)$/,'ant');
+ } else if(a14Index!=-1 && a14Index>=rvIndex){
+ word = word.replace(/(emment)$/,'ent');
+ } else if(a15Index!=-1 && a15Index>=rvIndex){
+ word = word.substring(0,a15Index+1);
+ }
+
+ /* Step 2a: Verb suffixes beginning i*/
+ var wordStep1 = word;
+ var step2aDone = false;
+ if(oriWord == word.toLowerCase() || oriWord.search(/(amment|emment|ment|ments)$/) != -1){
+ step2aDone = true;
+ var b1Regex = /([^aeiouyâàëéêèïîôûù])(îmes|ît|îtes|i|ie|ies|ir|ira|irai|iraIent|irais|irait|iras|irent|irez|iriez|irions|irons|iront|is|issaIent|issais|issait|issant|issante|issantes|issants|isse|issent|isses|issez|issiez|issions|issons|it)$/i;
+ if(word.search(b1Regex) >= rvIndex){
+ word = word.replace(b1Regex,'$1');
+ }
+ }
+
+ /* Step 2b: Other verb suffixes*/
+ if (step2aDone && wordStep1 == word) {
+ if (word.search(/(ions)$/) >= r2Index) {
+ word = word.replace(/(ions)$/, '');
+ } else {
+ var b2Regex = /(é|ée|ées|és|èrent|er|era|erai|eraIent|erais|erait|eras|erez|eriez|erions|erons|eront|ez|iez)$/i;
+ if (word.search(b2Regex) >= rvIndex) {
+ word = word.replace(b2Regex, '');
+ } else {
+ var b3Regex = /e(âmes|ât|âtes|a|ai|aIent|ais|ait|ant|ante|antes|ants|as|asse|assent|asses|assiez|assions)$/i;
+ if (word.search(b3Regex) >= rvIndex) {
+ word = word.replace(b3Regex, '');
+ } else {
+ var b3Regex2 = /(âmes|ât|âtes|a|ai|aIent|ais|ait|ant|ante|antes|ants|as|asse|assent|asses|assiez|assions)$/i;
+ if (word.search(b3Regex2) >= rvIndex) {
+ word = word.replace(b3Regex2, '');
+ }
+ }
+ }
+ }
+ }
+
+ if(oriWord != word.toLowerCase()){
+ /* Step 3 */
+ var rep = '';
+ if(word.search(/Y$/) != -1) {
+ word = word.replace(/Y$/, 'i');
+ } else if(word.search(/ç$/) != -1){
+ word = word.replace(/ç$/, 'c');
+ }
+ } else {
+ /* Step 4 */
+ //If the word ends s, not preceded by a, i, o, u, è or s, delete it.
+ if (word.search(/([^aiouès])s$/) >= rvIndex) {
+ word = word.replace(/([^aiouès])s$/, '$1');
+ }
+ var e1Index = word.search(/ion$/);
+ if (e1Index >= r2Index && word.search(/[st]ion$/) >= rvIndex) {
+ word = word.substring(0, e1Index);
+ } else {
+ var e2Index = word.search(/(ier|ière|Ier|Ière)$/);
+ if (e2Index != -1 && e2Index >= rvIndex) {
+ word = word.substring(0, e2Index) + "i";
+ } else {
+ if (word.search(/e$/) >= rvIndex) {
+ word = word.replace(/e$/, ''); //delete last e
+ } else if (word.search(/guë$/) >= rvIndex) {
+ word = word.replace(/guë$/, 'gu');
+ }
+ }
+ }
+ }
+
+ /* Step 5: Undouble */
+ //word = word.replace(/(en|on|et|el|eil)(n|t|l)$/,'$1');
+ word = word.replace(/(en|on)(n)$/,'$1');
+ word = word.replace(/(ett)$/,'et');
+ word = word.replace(/(el|eil)(l)$/,'$1');
+
+ /* Step 6: Un-accent */
+ word = word.replace(/[éè]([^aeiouyâàëéêèïîôûù]+)$/,'e$1');
+ word = word.toLowerCase();
+ return word;
+};
+
+var eqOut = new Array();
+var noteqOut = new Array();
+var eqCount = 0;
+/*
+To test the stemming, create two arrays named "voc" and "COut" which are for vocabualary and the stemmed output.
+Then add the vocabulary strings and output strings. This method will generate the stemmed output for "voc" and will
+compare the output with COut.
+ (I used porter's voc and out files and did a regex to convert them to js objects. regex: /");\nvoc.push("/g . This
+ will add strings to voc array such that output would look like: voc.push("foobar"); ) drop me an email for any help.
+ */
+function testFr(){
+ var start = new Date().getTime(); //execution time
+ eqCount = 0;
+ eqOut = new Array();
+ noteqOut = new Array();
+ for(var k=0;k<voc.length;k++){
+ if(COut[k]==stemmer(voc[k])){
+ eqCount++;
+ eqOut.push("v: "+voc[k]+" c: "+COut[k]);
+ } else {
+ noteqOut.push(voc[k]+", c: "+COut[k]+" s:"+stemmer(voc[k]));
+ }
+ }
+ var end = new Date().getTime(); //execution time
+ var time = end-start;
+ alert("equal count= "+eqCount+" out of "+voc.length+" words. time= "+time+" ms");
+ //console.log("equal count= "+eqCount+" out of "+voc.length+" words. time= "+time+" ms");
+}
+
+
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/xsl/webhelp.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/xsl/webhelp.xsl
new file mode 100644
index 0000000..9d72d5d
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/webhelp/xsl/webhelp.xsl
@@ -0,0 +1,782 @@
+<xsl:stylesheet
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:exsl="http://exslt.org/common"
+ xmlns:ng="http://docbook.org/docbook-ng"
+ xmlns:db="http://docbook.org/ns/docbook"
+ version="1.0" xmlns="http://www.w3.org/1999/xhtml">
+
+ <xsl:import href="../../xhtml/chunk.xsl"/>
+
+ <xsl:output
+ method="html"
+ encoding="utf-8"
+ cdata-section-elements=""/>
+
+ <!-- webhelp-specific params! -->
+ <!-- To be added to normal params file someday -->
+ <xsl:param name="webhelp.include.search.tab">true</xsl:param>
+ <xsl:param name="webhelp.start.filename">index.html</xsl:param>
+ <xsl:param name="webhelp.base.dir">docs</xsl:param>
+ <xsl:param name="webhelp.tree.cookie.id" select="concat( 'treeview-', count(//node()) )"/>
+ <xsl:param name="webhelp.indexer.language">en</xsl:param>
+ <xsl:param name="webhelp.default.topic"/>
+ <xsl:param name="webhelp.autolabel">0</xsl:param>
+ <!-- webhelp-specific params! -->
+
+ <!-- Set some reasonable defaults for webhelp output -->
+ <xsl:param name="chunker.output.indent">no</xsl:param>
+ <xsl:param name="navig.showtitles">0</xsl:param>
+ <xsl:param name="manifest.in.base.dir" select="0"/>
+ <xsl:param name="base.dir" select="concat($webhelp.base.dir,'/content/')"/>
+ <xsl:param name="suppress.navigation">0</xsl:param>
+ <xsl:param name="generate.index" select="1"/>
+ <xsl:param name="inherit.keywords" select="'0'"/>
+ <xsl:param name="local.l10n.xml" select="document('')"/>
+ <xsl:param name="para.propagates.style" select="1"/>
+ <xsl:param name="phrase.propagates.style" select="1"/>
+ <xsl:param name="chunk.first.sections" select="1"/>
+ <xsl:param name="chapter.autolabel" select="1"/>
+ <xsl:param name="section.autolabel" select="0"/>
+ <!--xsl:param name="generate.toc">book toc</xsl:param-->
+
+ <i18n xmlns="http://docbook.sourceforge.net/xmlns/l10n/1.0">
+ <l10n xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0" language="en">
+ <l:gentext key="Search" text="Search"/>
+ <l:gentext key="Enter_a_term_and_click" text="Enter a term and click "/>
+ <l:gentext key="Go" text="Go"/>
+ <l:gentext key="to_perform_a_search" text=" to perform a search."/>
+ <l:gentext key="txt_filesfound" text="Results"/>
+ <l:gentext key="txt_enter_at_least_1_char" text="You must enter at least one character."/>
+ <l:gentext key="txt_browser_not_supported"
+ text="Your browser is not supported. Use of Mozilla Firefox is recommended."/>
+ <l:gentext key="txt_please_wait" text="Please wait. Search in progress..."/>
+ <l:gentext key="txt_results_for" text="Results for: "/>
+ <l:gentext key="TableofContents" text="Contents"/>
+ <l:gentext key="HighlightButton" text="Toggle search result highlighting"/>
+ </l10n>
+ <!-- The fallback mechansim doesn't seem to work for local l10n stuff -->
+ <l10n xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0" language="ja">
+ <l:gentext key="Search" text="Search"/>
+ <l:gentext key="Enter_a_term_and_click" text="Enter a term and click "/>
+ <l:gentext key="Go" text="Go"/>
+ <l:gentext key="to_perform_a_search" text=" to perform a search."/>
+ <l:gentext key="txt_filesfound" text="Results"/>
+ <l:gentext key="txt_enter_at_least_1_char" text="You must enter at least one character."/>
+ <l:gentext key="txt_browser_not_supported"
+ text="Your browser is not supported. Use of Mozilla Firefox is recommended."/>
+ <l:gentext key="txt_please_wait" text="Please wait. Search in progress..."/>
+ <l:gentext key="txt_results_for" text="Results for: "/>
+ <l:gentext key="HighlightButton" text="Toggle search result highlighting"/>
+ </l10n>
+ <l10n xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0" language="de">
+ <l:gentext key="Search" text="Search"/>
+ <l:gentext key="Enter_a_term_and_click" text="Enter a term and click "/>
+ <l:gentext key="Go" text="Go"/>
+ <l:gentext key="to_perform_a_search" text=" to perform a search."/>
+ <l:gentext key="txt_filesfound" text="Results"/>
+ <l:gentext key="txt_enter_at_least_1_char" text="You must enter at least one character."/>
+ <l:gentext key="txt_browser_not_supported"
+ text="Your browser is not supported. Use of Mozilla Firefox is recommended."/>
+ <l:gentext key="txt_please_wait" text="Please wait. Search in progress..."/>
+ <l:gentext key="txt_results_for" text="Results for: "/>
+ <l:gentext key="HighlightButton" text="Toggle search result highlighting"/>
+ </l10n>
+ <l10n xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0" language="fr">
+ <l:gentext key="Search" text="Search"/>
+ <l:gentext key="Enter_a_term_and_click" text="Enter a term and click "/>
+ <l:gentext key="Go" text="Go"/>
+ <l:gentext key="to_perform_a_search" text=" to perform a search."/>
+ <l:gentext key="txt_filesfound" text="Results"/>
+ <l:gentext key="txt_enter_at_least_1_char" text="You must enter at least one character."/>
+ <l:gentext key="txt_browser_not_supported"
+ text="Your browser is not supported. Use of Mozilla Firefox is recommended."/>
+ <l:gentext key="txt_please_wait" text="Please wait. Search in progress..."/>
+ <l:gentext key="txt_results_for" text="Results for: "/>
+ <l:gentext key="HighlightButton" text="Toggle search result highlighting"/>
+ </l10n>
+ <l10n xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0" language="zh">
+ <l:gentext key="Search" text="Search"/>
+ <l:gentext key="Enter_a_term_and_click" text="Enter a term and click "/>
+ <l:gentext key="Go" text="Go"/>
+ <l:gentext key="to_perform_a_search" text=" to perform a search."/>
+ <l:gentext key="txt_filesfound" text="Results"/>
+ <l:gentext key="txt_enter_at_least_1_char" text="You must enter at least one character."/>
+ <l:gentext key="txt_browser_not_supported"
+ text="Your browser is not supported. Use of Mozilla Firefox is recommended."/>
+ <l:gentext key="txt_please_wait" text="Please wait. Search in progress..."/>
+ <l:gentext key="txt_results_for" text="Results for: "/>
+ <l:gentext key="HighlightButton" text="Toggle search result highlighting"/>
+ </l10n>
+
+ </i18n>
+
+ <xsl:template name="system.head.content">
+ <xsl:param name="node" select="."/>
+<xsl:text>
+</xsl:text>
+<!--
+This avoids two problems in IE 8. We should someday figure out why this is happening and tweak the JavaScript so this <meta/> tag is not necessary:
+1. When you perform a search and click the Toggle Highlight button, IE 8 adds a line break before the highlighted word.
+2. If you click the show/hide toc button, the tab crashes.
+These problems go away when you add this IE=7 mode meta tag.
+ -->
+ <meta http-equiv="X-UA-Compatible" content="IE=7" />
+<xsl:text>
+</xsl:text>
+ </xsl:template>
+
+
+ <xsl:template name="user.head.content">
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
+ <!-- <xsl:message>
+ webhelp.tree.cookie.id = <xsl:value-of select="$webhelp.tree.cookie.id"/> +++ <xsl:value-of select="count(//node())"/>
+ $webhelp.indexer.language = <xsl:value-of select="$webhelp.indexer.language"/> +++ <xsl:value-of select="count(//node())"/>
+ </xsl:message>-->
+ <script type="text/javascript">
+ //The id for tree cookie
+ var treeCookieId = "<xsl:value-of select="$webhelp.tree.cookie.id"/>";
+ var language = "<xsl:value-of select="$webhelp.indexer.language"/>";
+ var w = new Object();
+ //Localization
+ txt_filesfound = '<xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'txt_filesfound'"/>
+ </xsl:call-template>';
+ txt_enter_at_least_1_char = "<xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'txt_enter_at_least_1_char'"/>
+ </xsl:call-template>";
+ txt_browser_not_supported = "<xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'txt_browser_not_supported'"/>
+ </xsl:call-template>";
+ txt_please_wait = "<xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'txt_please_wait'"/>
+ </xsl:call-template>";
+ txt_results_for = "<xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'txt_results_for'"/>
+ </xsl:call-template>";
+ </script>
+ <style type="text/css">
+ input {
+ margin-bottom: 5px;
+ margin-top: 2px;
+ }
+
+ .folder {
+ display: block;
+ height: 22px;
+ padding-left: 20px;
+ background: transparent url(../common/jquery/treeview/images/folder.gif) 0 0px no-repeat;
+ }
+ <!--[if IE]>
+ input {
+ margin-bottom: 5px;
+ margin-top: 2px;
+ }
+ <![endif]-->
+ </style>
+ <link rel="shortcut icon" href="../favicon.ico" type="image/x-icon"/>
+ <link rel="stylesheet" type="text/css" href="../common/css/positioning.css"/>
+ <link rel="stylesheet" type="text/css" href="../common/jquery/theme-redmond/jquery-ui-1.8.2.custom.css"/>
+ <link rel="stylesheet" type="text/css" href="../common/jquery/treeview/jquery.treeview.css"/>
+
+ <script type="text/javascript" src="../common/jquery/jquery-1.4.2.min.js">
+ <xsl:comment> </xsl:comment>
+ </script>
+ <script type="text/javascript" src="../common/jquery/jquery-ui-1.8.2.custom.min.js">
+ <xsl:comment> </xsl:comment>
+ </script>
+ <script type="text/javascript" src="../common/jquery/jquery.cookie.js">
+ <xsl:comment> </xsl:comment>
+ </script>
+ <script type="text/javascript" src="../common/jquery/treeview/jquery.treeview.min.js">
+ <xsl:comment> </xsl:comment>
+ </script>
+ <!--Scripts/css stylesheets for Search-->
+ <script type="text/javascript" src="search/htmlFileList.js">
+ <xsl:comment> </xsl:comment>
+ </script>
+ <script type="text/javascript" src="search/htmlFileInfoList.js">
+ <xsl:comment> </xsl:comment>
+ </script>
+ <script type="text/javascript" src="search/nwSearchFnt.js">
+ <xsl:comment> </xsl:comment>
+ </script>
+
+ <!--script type="text/javascript" src="search/addition.js">
+ <xsl:comment></xsl:comment>
+ </script>
+ <script type="text/javascript" src="search/indexLoader.js">
+ <xsl:comment></xsl:comment>
+ </script-->
+
+
+ <!--
+ NOTE: Stemmer javascript files should be in format <language>_stemmer.js.
+ For example, for English(en), source should be: "search/stemmers/en_stemmer.js"
+ For country codes, see: http://www.uspto.gov/patft/help/helpctry.htm
+ -->
+ <!--<xsl:message><xsl:value-of select="concat('search/stemmers/',$webhelp.indexer.language,'_stemmer.js')"/></xsl:message>-->
+ <script type="text/javascript" src="{concat('search/stemmers/',$webhelp.indexer.language,'_stemmer.js')}">
+ <xsl:comment>//make this scalable to other languages as well.</xsl:comment>
+ </script>
+
+ <!--Index Files:
+ Index is broken in to three equal sized(number of index items) files. This is to help parallel downloading
+ of files to make it faster.-->
+ <script type="text/javascript" src="search/index-1.js">
+ <xsl:comment> </xsl:comment>
+ </script>
+ <script type="text/javascript" src="search/index-2.js">
+ <xsl:comment> </xsl:comment>
+ </script>
+ <script type="text/javascript" src="search/index-3.js">
+ <xsl:comment> </xsl:comment>
+ </script>
+ <!--End of index files -->
+ </xsl:template>
+
+ <xsl:template name="user.header.navigation">
+ <xsl:param name="prev"/>
+ <xsl:param name="next"/>
+ <xsl:param name="nav.context"/>
+ <xsl:call-template name="webhelpheader">
+ <xsl:with-param name="prev" select="$prev"/>
+ <xsl:with-param name="next" select="$next"/>
+ <xsl:with-param name="nav.context" select="$nav.context"/>
+ </xsl:call-template>
+ <!--xsl:call-template name="webhelptoc"/-->
+
+ <!--testing toc in the content page>
+ <xsl:call-template name="webhelptoctoc"/>
+ <xsl:if test="$webhelp.include.search.tab != 'false'">
+ <xsl:call-template name="search"/>
+ </xsl:if-->
+ </xsl:template>
+
+ <xsl:template name="user.header.content">
+ <xsl:comment> <!-- KEEP this code. --> </xsl:comment>
+ </xsl:template>
+
+ <xsl:template name="user.footer.navigation">
+ <xsl:call-template name="webhelptoc">
+ <xsl:with-param name="currentid" select="generate-id(.)"/>
+ </xsl:call-template>
+ </xsl:template>
+
+ <xsl:template match="/">
+ <xsl:message>language: <xsl:value-of select="$webhelp.indexer.language"/> </xsl:message>
+ <!-- * Get a title for current doc so that we let the user -->
+ <!-- * know what document we are processing at this point. -->
+ <xsl:variable name="doc.title">
+ <xsl:call-template name="get.doc.title"/>
+ </xsl:variable>
+ <xsl:choose>
+ <!-- Hack! If someone hands us a DocBook V5.x or DocBook NG document,
+ toss the namespace and continue. Use the docbook5 namespaced
+ stylesheets for DocBook5 if you don't want to use this feature.-->
+ <!-- include extra test for Xalan quirk -->
+ <xsl:when test="$exsl.node.set.available != 0 and (*/self::ng:* or */self::db:*)">
+ <xsl:call-template name="log.message">
+ <xsl:with-param name="level">Note</xsl:with-param>
+ <xsl:with-param name="source" select="$doc.title"/>
+ <xsl:with-param name="context-desc">
+ <xsl:text>namesp. cut</xsl:text>
+ </xsl:with-param>
+ <xsl:with-param name="message">
+ <xsl:text>stripped namespace before processing</xsl:text>
+ </xsl:with-param>
+ </xsl:call-template>
+ <xsl:variable name="nons">
+ <xsl:apply-templates mode="stripNS"/>
+ </xsl:variable>
+ <!--
+ <xsl:message>Saving stripped document.</xsl:message>
+ <xsl:call-template name="write.chunk">
+ <xsl:with-param name="filename" select="'/tmp/stripped.xml'"/>
+ <xsl:with-param name="method" select="'xml'"/>
+ <xsl:with-param name="content">
+ <xsl:copy-of select="exsl:node-set($nons)"/>
+ </xsl:with-param>
+ </xsl:call-template>
+ -->
+ <xsl:call-template name="log.message">
+ <xsl:with-param name="level">Note</xsl:with-param>
+ <xsl:with-param name="source" select="$doc.title"/>
+ <xsl:with-param name="context-desc">
+ <xsl:text>namesp. cut</xsl:text>
+ </xsl:with-param>
+ <xsl:with-param name="message">
+ <xsl:text>processing stripped document</xsl:text>
+ </xsl:with-param>
+ </xsl:call-template>
+ <xsl:apply-templates select="exsl:node-set($nons)"/>
+ </xsl:when>
+ <!-- Can't process unless namespace removed -->
+ <xsl:when test="*/self::ng:* or */self::db:*">
+ <xsl:message terminate="yes">
+ <xsl:text>Unable to strip the namespace from DB5 document,</xsl:text>
+ <xsl:text> cannot proceed.</xsl:text>
+ </xsl:message>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:choose>
+ <xsl:when test="$rootid != ''">
+ <xsl:choose>
+ <xsl:when test="count(key('id',$rootid)) = 0">
+ <xsl:message terminate="yes">
+ <xsl:text>ID '</xsl:text>
+ <xsl:value-of select="$rootid"/>
+ <xsl:text>' not found in document.</xsl:text>
+ </xsl:message>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:if test="$collect.xref.targets = 'yes' or $collect.xref.targets = 'only'">
+ <xsl:apply-templates select="key('id', $rootid)" mode="collect.targets"/>
+ </xsl:if>
+ <xsl:if test="$collect.xref.targets != 'only'">
+ <xsl:apply-templates select="key('id',$rootid)" mode="process.root"/>
+ <xsl:if test="$tex.math.in.alt != ''">
+ <xsl:apply-templates select="key('id',$rootid)" mode="collect.tex.math"/>
+ </xsl:if>
+ </xsl:if>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:if test="$collect.xref.targets = 'yes' or $collect.xref.targets = 'only'">
+ <xsl:apply-templates select="/" mode="collect.targets"/>
+ </xsl:if>
+ <xsl:if test="$collect.xref.targets != 'only'">
+ <xsl:apply-templates select="/" mode="process.root"/>
+ <xsl:if test="$tex.math.in.alt != ''">
+ <xsl:apply-templates select="/" mode="collect.tex.math"/>
+ </xsl:if>
+ </xsl:if>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:call-template name="index.html"/>
+
+ </xsl:template>
+
+ <xsl:template name="chunk-element-content">
+ <xsl:param name="prev"/>
+ <xsl:param name="next"/>
+ <xsl:param name="nav.context"/>
+ <xsl:param name="content">
+ <xsl:apply-imports/>
+ </xsl:param>
+
+ <xsl:call-template name="user.preroot"/>
+
+ <html>
+ <xsl:call-template name="html.head">
+ <xsl:with-param name="prev" select="$prev"/>
+ <xsl:with-param name="next" select="$next"/>
+ </xsl:call-template>
+
+ <body>
+ <xsl:call-template name="body.attributes"/>
+
+ <xsl:call-template name="user.header.navigation">
+ <xsl:with-param name="prev" select="$prev"/>
+ <xsl:with-param name="next" select="$next"/>
+ <xsl:with-param name="nav.context" select="$nav.context"/>
+ </xsl:call-template>
+
+
+ <div id="content">
+
+ <xsl:call-template name="user.header.content"/>
+
+ <xsl:copy-of select="$content"/>
+
+ <xsl:call-template name="user.footer.content"/>
+
+ <xsl:call-template name="footer.navigation">
+ <xsl:with-param name="prev" select="$prev"/>
+ <xsl:with-param name="next" select="$next"/>
+ <xsl:with-param name="nav.context" select="$nav.context"/>
+ </xsl:call-template>
+ </div>
+
+ <xsl:call-template name="user.footer.navigation"/>
+ </body>
+ </html>
+ <xsl:value-of select="$chunk.append"/>
+ </xsl:template>
+
+ <!-- The Header with the company logo -->
+ <xsl:template name="webhelpheader">
+ <xsl:param name="prev"/>
+ <xsl:param name="next"/>
+ <xsl:param name="nav.context"/>
+
+ <xsl:variable name="home" select="/*[1]"/>
+ <xsl:variable name="up" select="parent::*"/>
+
+ <div id="header">
+ <img style='margin-right: 2px; height: 59px; padding-right: 25px; padding-top: 8px' align="right"
+ src='../common/images/logo.png' alt="Company Logo"/>
+
+ <!-- Display the page title and the main heading(parent) of it-->
+ <h1 align="center">
+ <xsl:apply-templates select="." mode="object.title.markup"/>
+ <br/>
+ <xsl:choose>
+ <xsl:when
+ test="count($up) &gt; 0 and generate-id($up) != generate-id($home)">
+ <xsl:apply-templates select="$up" mode="object.title.markup"/>
+ </xsl:when>
+ <xsl:otherwise>&#160;</xsl:otherwise>
+ </xsl:choose>
+ </h1>
+
+ <!-- Prev and Next links generation-->
+ <div id="navheader" align="right">
+ <xsl:comment>
+ <!-- KEEP this code. In case of neither prev nor next links are available, this will help to
+ keep the integrity of the DOM tree-->
+ </xsl:comment>
+ <!--xsl:with-param name="prev" select="$prev"/>
+ <xsl:with-param name="next" select="$next"/>
+ <xsl:with-param name="nav.context" select="$nav.context"/-->
+ <table>
+ <tr>
+ <td style="height: 28px; width: 16px;">
+ <a id="showHideButton" onclick="showHideToc();"
+ class="pointLeft" title="Hide TOC tree">.
+ </a>
+ </td>
+ <td>
+ <img src="../common/images/highlight-blue.gif" alt="H" height="25px"
+ onclick="toggleHighlight()" id="showHideHighlight" style="cursor:pointer">
+ <xsl:attribute name="title">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'HighlightButton'"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ </img>
+ </td>
+ <xsl:if test="count($prev) &gt; 0
+ or (count($up) &gt; 0
+ and generate-id($up) != generate-id($home)
+ and $navig.showtitles != 0)
+ or count($next) &gt; 0">
+ <td>
+ <xsl:if test="count($prev)>0">
+ <a accesskey="p">
+ <xsl:attribute name="href">
+ <xsl:call-template name="href.target">
+ <xsl:with-param name="object" select="$prev"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:call-template name="navig.content">
+ <xsl:with-param name="direction" select="'prev'"/>
+ </xsl:call-template>
+ </a>
+ </xsl:if>
+
+ <!-- "Up" link-->
+ <xsl:choose>
+ <xsl:when test="count($up)&gt;0
+ and generate-id($up) != generate-id($home)">
+ |
+ <a accesskey="u">
+ <xsl:attribute name="href">
+ <xsl:call-template name="href.target">
+ <xsl:with-param name="object" select="$up"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:call-template name="navig.content">
+ <xsl:with-param name="direction" select="'up'"/>
+ </xsl:call-template>
+ </a>
+ </xsl:when>
+ <xsl:otherwise>&#160;</xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:if test="count($next)>0">
+ |
+ <a accesskey="n">
+ <xsl:attribute name="href">
+ <xsl:call-template name="href.target">
+ <xsl:with-param name="object" select="$next"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:call-template name="navig.content">
+ <xsl:with-param name="direction" select="'next'"/>
+ </xsl:call-template>
+ </a>
+ </xsl:if>
+ </td>
+ </xsl:if>
+
+ </tr>
+ </table>
+
+
+
+ </div>
+
+ </div>
+ </xsl:template>
+
+ <xsl:template name="webhelptoc">
+ <xsl:param name="currentid"/>
+ <xsl:choose>
+ <xsl:when test="$rootid != ''">
+ <xsl:variable name="title">
+ <xsl:if test="$webhelp.autolabel=1">
+ <xsl:variable name="label.markup">
+ <xsl:apply-templates select="key('id',$rootid)" mode="label.markup"/>
+ </xsl:variable>
+ <xsl:if test="normalize-space($label.markup)">
+ <xsl:value-of select="concat($label.markup,$autotoc.label.separator)"/>
+ </xsl:if>
+ </xsl:if>
+ <xsl:apply-templates select="key('id',$rootid)" mode="title.markup"/>
+ </xsl:variable>
+ <xsl:variable name="href">
+ <xsl:choose>
+ <xsl:when test="$manifest.in.base.dir != 0">
+ <xsl:call-template name="href.target">
+ <xsl:with-param name="object" select="key('id',$rootid)"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="href.target.with.base.dir">
+ <xsl:with-param name="object" select="key('id',$rootid)"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ </xsl:when>
+
+ <xsl:otherwise>
+ <xsl:variable name="title">
+ <xsl:if test="$webhelp.autolabel=1">
+ <xsl:variable name="label.markup">
+ <xsl:apply-templates select="/*" mode="label.markup"/>
+ </xsl:variable>
+ <xsl:if test="normalize-space($label.markup)">
+ <xsl:value-of select="concat($label.markup,$autotoc.label.separator)"/>
+ </xsl:if>
+ </xsl:if>
+ <xsl:apply-templates select="/*" mode="title.markup"/>
+ </xsl:variable>
+ <xsl:variable name="href">
+ <xsl:choose>
+ <xsl:when test="$manifest.in.base.dir != 0">
+ <xsl:call-template name="href.target">
+ <xsl:with-param name="object" select="/"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="href.target.with.base.dir">
+ <xsl:with-param name="object" select="/"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <div>
+ <div id="leftnavigation" style="padding-top:3px; background-color:white;">
+ <div id="tabs">
+ <ul>
+ <li>
+ <a href="#treeDiv">
+ <em>
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'TableofContents'"/>
+ </xsl:call-template>
+ </em>
+ </a>
+ </li>
+ <xsl:if test="$webhelp.include.search.tab != 'false'">
+ <li>
+ <a href="#searchDiv">
+ <em>
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'Search'"/>
+ </xsl:call-template>
+ </em>
+ </a>
+ </li>
+ </xsl:if>
+ </ul>
+ <div id="treeDiv">
+ <img src="../common/images/loading.gif" alt="loading table of contents..."
+ id="tocLoading" style="display:block;"/>
+ <div id="ulTreeDiv" style="display:none">
+ <ul id="tree" class="filetree">
+ <xsl:apply-templates select="/*/*" mode="webhelptoc">
+ <xsl:with-param name="currentid" select="$currentid"/>
+ </xsl:apply-templates>
+ </ul>
+ </div>
+
+ </div>
+ <xsl:if test="$webhelp.include.search.tab != 'false'">
+ <div id="searchDiv">
+ <div id="search">
+ <form onsubmit="Verifie(ditaSearch_Form);return false"
+ name="ditaSearch_Form"
+ class="searchForm">
+ <fieldset class="searchFieldSet">
+ <legend>
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'Search'"/>
+ </xsl:call-template>
+ </legend>
+ <center>
+ <input id="textToSearch" name="textToSearch" type="text"
+ class="searchText"/>
+ <xsl:text disable-output-escaping="yes"> <![CDATA[&nbsp;]]> </xsl:text>
+ <input onclick="Verifie(ditaSearch_Form)" type="button"
+ class="searchButton"
+ value="Go" id="doSearch"/>
+ </center>
+ </fieldset>
+ </form>
+ </div>
+ <div id="searchResults">
+ <center> </center>
+ </div>
+ </div>
+ </xsl:if>
+
+ </div>
+ </div>
+ </div>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+ <xsl:template
+ match="book|part|reference|preface|chapter|bibliography|appendix|article|glossary|section|simplesect|sect1|sect2|sect3|sect4|sect5|refentry|colophon|bibliodiv|index"
+ mode="webhelptoc">
+ <xsl:param name="currentid"/>
+ <xsl:variable name="title">
+ <xsl:if test="$webhelp.autolabel=1">
+ <xsl:variable name="label.markup">
+ <xsl:apply-templates select="." mode="label.markup"/>
+ </xsl:variable>
+ <xsl:if test="normalize-space($label.markup)">
+ <xsl:value-of select="concat($label.markup,$autotoc.label.separator)"/>
+ </xsl:if>
+ </xsl:if>
+ <xsl:apply-templates select="." mode="title.markup"/>
+ </xsl:variable>
+
+ <xsl:variable name="href">
+ <xsl:choose>
+ <xsl:when test="$manifest.in.base.dir != 0">
+ <xsl:call-template name="href.target"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="href.target.with.base.dir"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="id" select="generate-id(.)"/>
+ <!--xsl:message>
+ <xsl: select="name(ancestor-or-self::*) "/>
+ </xsl:message-->
+
+ <xsl:if test="not(self::index) or (self::index and not($generate.index = 0))">
+ <!--li style="white-space: pre; line-height: 0em;"-->
+ <li>
+ <xsl:if test="$id = $currentid">
+ <xsl:attribute name="id">webhelp-currentid</xsl:attribute>
+ </xsl:if>
+ <span class="file">
+ <a href="{substring-after($href,concat($webhelp.base.dir,'/content/'))}">
+ <xsl:value-of select="$title"/>
+ </a>
+ </span>
+ <xsl:if test="part|reference|preface|chapter|bibliography|appendix|article|glossary|section|simplesect|sect1|sect2|sect3|sect4|sect5|refentry|colophon|bibliodiv">
+ <ul>
+ <xsl:apply-templates
+ select="part|reference|preface|chapter|bibliography|appendix|article|glossary|section|simplesect|sect1|sect2|sect3|sect4|sect5|refentry|colophon|bibliodiv"
+ mode="webhelptoc">
+ <xsl:with-param name="currentid" select="$currentid"/>
+ </xsl:apply-templates>
+ </ul>
+ </xsl:if>
+ </li>
+ </xsl:if>
+ </xsl:template>
+
+ <xsl:template match="text()" mode="webhelptoc"/>
+
+ <xsl:template name="user.footer.content">
+ <script type="text/javascript" src="../common/main.js">
+ <xsl:comment></xsl:comment>
+ </script>
+ </xsl:template>
+
+ <xsl:template name="index.html">
+ <xsl:variable name="default.topic">
+ <xsl:choose>
+ <xsl:when test="$webhelp.default.topic != ''">
+ <xsl:value-of select="$htmlhelp.default.topic"/>
+ </xsl:when>
+ <xsl:when test="$htmlhelp.default.topic != ''">
+ <xsl:value-of select="$htmlhelp.default.topic"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="make-relative-filename">
+ <xsl:with-param name="base.dir"/>
+ <xsl:with-param name="base.name">
+ <xsl:choose>
+ <xsl:when test="$rootid != ''">
+ <xsl:apply-templates select="key('id',$rootid)" mode="chunk-filename"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates
+ select="*/*[self::preface|self::chapter|self::appendix|self::part][1]"
+ mode="chunk-filename"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:call-template name="write.chunk">
+ <xsl:with-param name="filename">
+ <!-- <xsl:if test="$manifest.in.base.dir != 0"> -->
+ <!-- <xsl:value-of select="$base.dir"/> -->
+ <!-- </xsl:if> -->
+ <xsl:choose>
+ <xsl:when test="$webhelp.start.filename">
+ <xsl:value-of select="concat($webhelp.base.dir,'/',$webhelp.start.filename)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="'index.html'"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:with-param>
+ <xsl:with-param name="method" select="'xml'"/>
+ <xsl:with-param name="encoding" select="'utf-8'"/>
+ <xsl:with-param name="indent" select="'yes'"/>
+ <xsl:with-param name="content">
+ <html>
+ <head>
+ <link rel="shortcut icon" href="favicon.ico"/>
+ <meta http-equiv="Refresh" content="1; URL=content/{$default.topic}"/>
+ <title><xsl:value-of select="//title[1]"/>&#160;
+ </title>
+ </head>
+ <body>
+ If not automatically redirected, click here: <a href="content/ch01.html">content/ch01.html</a>
+ </body>
+ </html>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:template>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/website/autolayout.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/website/autolayout.xsl
new file mode 100644
index 0000000..461bfce
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/website/autolayout.xsl
@@ -0,0 +1,258 @@
+<?xml version="1.0"?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="1.0">
+
+<xsl:output method="xml" indent="no"
+ doctype-public="-//Norman Walsh//DTD Website Autolayout V2.5.0//EN"
+ doctype-system="http://docbook.sourceforge.net/release/website/2.5.0/schema/dtd/autolayout.dtd"
+/>
+
+<xsl:strip-space elements="toc tocentry layout copyright"/>
+
+<xsl:template match="layout">
+ <autolayout>
+ <xsl:text>&#10;</xsl:text>
+ <xsl:apply-templates/>
+ </autolayout>
+ <xsl:text>&#10;</xsl:text>
+</xsl:template>
+
+<xsl:template match="style|script|headlink|copyright|config">
+ <xsl:apply-templates select="." mode="copy"/>
+</xsl:template>
+
+<xsl:template match="*" mode="copy">
+ <xsl:element name="{name(.)}">
+ <xsl:copy-of select="@*"/>
+ <xsl:apply-templates mode="copy"/>
+ </xsl:element>
+</xsl:template>
+
+<xsl:template match="toc">
+ <xsl:if test="not(@page)">
+ <xsl:message terminate="yes">
+ <xsl:text>All toc entries must have a page attribute.</xsl:text>
+ </xsl:message>
+ </xsl:if>
+
+ <xsl:variable name="page" select="document(@page,.)"/>
+
+ <toc>
+ <xsl:call-template name="tocentry"/>
+ </toc>
+ <xsl:text>&#10;</xsl:text>
+</xsl:template>
+
+<xsl:template match="tocentry">
+ <tocentry>
+ <xsl:call-template name="tocentry"/>
+ </tocentry>
+ <xsl:text>&#10;</xsl:text>
+</xsl:template>
+
+<xsl:template match="notoc">
+ <notoc>
+ <xsl:call-template name="tocentry"/>
+ </notoc>
+ <xsl:text>&#10;</xsl:text>
+</xsl:template>
+
+<xsl:template name="tocentry">
+ <xsl:if test="@revisionflag">
+ <xsl:attribute name="revisionflag">
+ <xsl:value-of select="@revisionflag"/>
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:choose>
+ <xsl:when test="@href">
+ <xsl:call-template name="tocentry.href"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="tocentry.page"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="tocentry.href">
+ <xsl:if test="not(@href)">
+ <xsl:message terminate="yes">
+ <xsl:text>All toc entries must have an href attribute.</xsl:text>
+ </xsl:message>
+ </xsl:if>
+
+ <xsl:if test="not(@id)">
+ <xsl:message terminate="yes">
+ <xsl:text>All href toc entries must have an id attribute.</xsl:text>
+ </xsl:message>
+ </xsl:if>
+
+ <xsl:message>
+ <xsl:text>off site: </xsl:text>
+ <xsl:value-of select="@href"/>
+ </xsl:message>
+
+ <xsl:attribute name="id">
+ <xsl:value-of select="@id"/>
+ </xsl:attribute>
+ <xsl:attribute name="href">
+ <xsl:value-of select="@href"/>
+ </xsl:attribute>
+ <xsl:if test="@tocskip = '1'">
+ <xsl:attribute name="tocskip">
+ <xsl:value-of select="@tocskip"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:if test="not(title)">
+ <xsl:message terminate="yes">
+ <xsl:text>Off-site links must provide a title.</xsl:text>
+ </xsl:message>
+ </xsl:if>
+
+ <xsl:text>&#10;</xsl:text>
+ <xsl:apply-templates select="title|titleabbrev|summary" mode="copy"/>
+ <xsl:text>&#10;</xsl:text>
+ <xsl:apply-templates select="tocentry"/>
+</xsl:template>
+
+<xsl:template name="tocentry.page">
+ <xsl:if test="not(@page)">
+ <xsl:message terminate="yes">
+ <xsl:text>All toc entries must have a page attribute.</xsl:text>
+ </xsl:message>
+ </xsl:if>
+
+ <xsl:variable name="page" select="document(@page,.)"/>
+
+ <xsl:if test="not($page/*[1]/@id)">
+ <xsl:message terminate="yes">
+ <xsl:value-of select="@page"/>
+ <xsl:text>: missing ID.</xsl:text>
+ </xsl:message>
+ </xsl:if>
+
+ <xsl:variable name="id" select="$page/*[1]/@id"/>
+
+ <xsl:variable name="filename">
+ <xsl:choose>
+ <xsl:when test="@filename">
+ <xsl:value-of select="@filename"/>
+ </xsl:when>
+ <xsl:when test="/layout/config[@param='default-filename']">
+ <xsl:value-of select="(/layout/config[@param='default-filename'])[1]/@value"/>
+ </xsl:when>
+ <xsl:otherwise>index.html</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="dir">
+ <xsl:apply-templates select="." mode="calculate-dir"/>
+ </xsl:variable>
+
+ <xsl:if test="$filename = ''">
+ <xsl:message terminate="yes">
+ <xsl:value-of select="@page"/>
+ <xsl:text>: missing filename.</xsl:text>
+ </xsl:message>
+ </xsl:if>
+
+ <xsl:message>
+ <xsl:value-of select="@page"/>
+ <xsl:text>: </xsl:text>
+ <xsl:if test="$dir != ''">
+ <xsl:value-of select="$dir"/>
+ </xsl:if>
+ <xsl:value-of select="$filename"/>
+ </xsl:message>
+
+ <xsl:attribute name="page">
+ <xsl:value-of select="@page"/>
+ </xsl:attribute>
+ <xsl:attribute name="id">
+ <xsl:value-of select="$id"/>
+ </xsl:attribute>
+ <xsl:if test="$dir != ''">
+ <xsl:attribute name="dir">
+ <xsl:value-of select="$dir"/>
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:attribute name="filename">
+ <xsl:value-of select="$filename"/>
+ </xsl:attribute>
+ <xsl:if test="@tocskip = '1'">
+ <xsl:attribute name="tocskip">
+ <xsl:value-of select="@tocskip"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:text>&#10;</xsl:text>
+ <xsl:choose>
+ <xsl:when test="title">
+ <xsl:apply-templates select="title" mode="copy"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <title>
+ <xsl:apply-templates select="$page/*[1]/head/title"/>
+ </title>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:text>&#10;</xsl:text>
+
+ <xsl:if test="titleabbrev or $page/*[1]/head/titleabbrev">
+ <xsl:choose>
+ <xsl:when test="titleabbrev">
+ <xsl:apply-templates select="titleabbrev" mode="copy"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <titleabbrev>
+ <xsl:apply-templates select="$page/*[1]/head/titleabbrev"/>
+ </titleabbrev>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:text>&#10;</xsl:text>
+ </xsl:if>
+
+ <xsl:if test="summary or $page/*[1]/head/summary">
+ <xsl:choose>
+ <xsl:when test="summary">
+ <xsl:apply-templates select="summary" mode="copy"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <summary>
+ <xsl:apply-templates select="$page/*[1]/head/summary"/>
+ </summary>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:text>&#10;</xsl:text>
+ </xsl:if>
+
+ <xsl:apply-templates select="tocentry"/>
+</xsl:template>
+
+<xsl:template match="*" mode="calculate-dir">
+ <xsl:choose>
+ <xsl:when test="starts-with(@dir, '/')">
+ <!-- if the directory on this begins with a "/", we're done... -->
+ <xsl:value-of select="substring-after(@dir, '/')"/>
+ <xsl:text>/</xsl:text>
+ </xsl:when>
+
+ <xsl:when test="parent::*">
+ <!-- if there's a parent, try it -->
+ <xsl:apply-templates select="parent::*" mode="calculate-dir"/>
+ <xsl:if test="@dir">
+ <xsl:value-of select="@dir"/>
+ <xsl:text>/</xsl:text>
+ </xsl:if>
+ </xsl:when>
+
+ <xsl:otherwise>
+ <xsl:if test="@dir">
+ <xsl:value-of select="@dir"/>
+ <xsl:text>/</xsl:text>
+ </xsl:if>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/website/chunk-common.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/website/chunk-common.xsl
new file mode 100644
index 0000000..d750c05
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/website/chunk-common.xsl
@@ -0,0 +1,227 @@
+<?xml version="1.0"?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:xweb="xalan://com.nwalsh.xalan.Website"
+ xmlns:sweb="http://nwalsh.com/xslt/ext/com.nwalsh.saxon.Website"
+ exclude-result-prefixes="sweb xweb"
+ version="1.0">
+
+<xsl:output method="html"/>
+
+<xsl:param name="output-root" select="'.'"/>
+<xsl:param name="dry-run" select="'0'"/>
+<xsl:param name="rebuild-all" select="'0'"/>
+
+<xsl:template match="autolayout">
+ <!-- Regenerate olink database? -->
+ <xsl:if test="$collect.xref.targets = 'yes' or
+ $collect.xref.targets = 'only'">
+ <xsl:apply-templates select="." mode="collect.targets"/>
+ </xsl:if>
+
+ <xsl:if test="$collect.xref.targets != 'only'" >
+ <xsl:apply-templates select="toc|notoc" mode="make"/>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="toc|tocentry|notoc" mode="make">
+ <xsl:call-template name="make.tocentry"/>
+ <xsl:apply-templates select="tocentry" mode="make"/>
+</xsl:template>
+
+<xsl:template name="make.tocentry">
+ <xsl:variable name="srcFile" select="@page"/>
+
+ <xsl:if test="@page and @href">
+ <xsl:message terminate="yes">
+ <xsl:text>Fail: tocentry has both page and href attributes.</xsl:text>
+ </xsl:message>
+ </xsl:if>
+
+ <xsl:variable name="filename">
+ <xsl:choose>
+ <xsl:when test="@filename">
+ <xsl:value-of select="@filename"/>
+ </xsl:when>
+ <xsl:otherwise>index.html</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="dir">
+ <xsl:apply-templates select="." mode="calculate-dir"/>
+ </xsl:variable>
+
+<!--
+ <xsl:message>
+ <xsl:text>!!</xsl:text>
+ <xsl:value-of select="$dir"/>
+ <xsl:text>!!</xsl:text>
+ <xsl:value-of select="$filename-prefix"/>
+ <xsl:text>!!</xsl:text>
+ <xsl:value-of select="$filename"/>
+ </xsl:message>
+-->
+
+ <xsl:variable name="targetFile">
+ <xsl:value-of select="$dir"/>
+ <xsl:value-of select="$filename-prefix"/>
+ <xsl:value-of select="$filename"/>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="function-available('sweb:exists')">
+ <xsl:if test="not(@href) and not(sweb:exists($srcFile))">
+ <xsl:message terminate="yes">
+ <xsl:value-of select="$srcFile"/>
+ <xsl:text> does not exist.</xsl:text>
+ </xsl:message>
+ </xsl:if>
+ </xsl:when>
+ <xsl:when test="function-available('xweb:exists')">
+ <xsl:if test="not(@href) and not(xweb:exists($srcFile))">
+ <xsl:message terminate="yes">
+ <xsl:value-of select="$srcFile"/>
+ <xsl:text> does not exist.</xsl:text>
+ </xsl:message>
+ </xsl:if>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:message terminate="no">
+ <xsl:value-of select="$srcFile"/>
+ </xsl:message>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:variable name="output-file">
+ <xsl:choose>
+ <xsl:when test="@href">
+ <xsl:value-of select="@href"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$output-root"/>
+ <xsl:text>/</xsl:text>
+ <xsl:value-of select="$targetFile"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="needsUpdate">
+ <xsl:choose>
+ <xsl:when test="@href">0</xsl:when>
+ <xsl:when test="function-available('sweb:needsUpdate')">
+ <xsl:choose>
+ <xsl:when test="$rebuild-all != 0
+ or sweb:needsUpdate($autolayout-file, $output-file)
+ or sweb:needsUpdate($srcFile, $output-file)">
+ <xsl:text>1</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>0</xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:when test="function-available('xweb:needsUpdate')">
+ <xsl:choose>
+ <xsl:when test="$rebuild-all != 0
+ or xweb:needsUpdate($autolayout-file, $output-file)
+ or xweb:needsUpdate($srcFile, $output-file)">
+ <xsl:text>1</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>0</xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="$needsUpdate != 0">
+ <xsl:message>
+ <xsl:text>Update: </xsl:text>
+ <xsl:value-of select="$output-file"/>
+ <xsl:text>: </xsl:text>
+ <xsl:value-of select="$srcFile"/>
+ </xsl:message>
+
+ <xsl:variable name="webpage" select="document($srcFile,.)"/>
+ <xsl:variable name="content">
+ <xsl:apply-templates select="$webpage/webpage"/>
+ </xsl:variable>
+
+ <xsl:if test="$dry-run = 0">
+ <xsl:call-template name="write.chunk">
+ <xsl:with-param name="filename" select="$output-file"/>
+ <xsl:with-param name="content" select="$content"/>
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:message>
+ <xsl:text>Up-to-date: </xsl:text>
+ <xsl:value-of select="$output-file"/>
+ </xsl:message>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="*" mode="calculate-dir">
+ <xsl:choose>
+ <xsl:when test="@dir">
+ <!-- if there's a directory, use it -->
+ <xsl:choose>
+ <xsl:when test="starts-with(@dir, '/')">
+ <!-- if the directory on this begins with a "/", we're done... -->
+ <xsl:value-of select="substring-after(@dir, '/')"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="@dir"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+
+ <xsl:when test="parent::*">
+ <!-- if there's a parent, try it -->
+ <xsl:apply-templates select="parent::*" mode="calculate-dir"/>
+ </xsl:when>
+
+ <xsl:otherwise>
+ <!-- nop -->
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="autolayout" mode="collect.targets">
+ <xsl:choose>
+ <xsl:when test="$website.database.document = ''">
+ <xsl:message>
+ Must specify a $website.database.document parameter when
+ $collect.xref.targets is set to 'yes' or 'only'.
+ The xref targets were not collected.
+ </xsl:message>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:choose>
+ <xsl:when test="$website.database.document">
+ <xsl:call-template name="write.chunk">
+ <xsl:with-param name="filename"
+ select="$website.database.document"/>
+ <xsl:with-param name="method" select="'xml'"/>
+ <xsl:with-param name="encoding" select="'utf-8'"/>
+ <xsl:with-param name="omit-xml-declaration" select="'no'"/>
+ <xsl:with-param name="indent" select="'yes'"/>
+ <xsl:with-param name="quiet" select="0"/>
+ <xsl:with-param name="content">
+ <targetset>
+ <xsl:apply-templates select="." mode="olink.mode"/>
+ </targetset>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <!-- Else write to standard output -->
+ <xsl:apply-templates select="." mode="olink.mode"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/website/chunk-tabular.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/website/chunk-tabular.xsl
new file mode 100644
index 0000000..cdf97cf
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/website/chunk-tabular.xsl
@@ -0,0 +1,12 @@
+<?xml version="1.0"?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:xweb="xalan://com.nwalsh.xalan.Website"
+ xmlns:sweb="http://nwalsh.com/xslt/ext/com.nwalsh.saxon.Website"
+ exclude-result-prefixes="sweb xweb"
+ version="1.0">
+
+<xsl:import href="tabular.xsl"/>
+<xsl:import href="../html/chunker.xsl"/>
+<xsl:include href="chunk-common.xsl"/>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/website/chunk-website.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/website/chunk-website.xsl
new file mode 100644
index 0000000..a9179a0
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/website/chunk-website.xsl
@@ -0,0 +1,12 @@
+<?xml version="1.0"?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:xweb="xalan://com.nwalsh.xalan.Website"
+ xmlns:sweb="http://nwalsh.com/xslt/ext/com.nwalsh.saxon.Website"
+ exclude-result-prefixes="sweb xweb"
+ version="1.0">
+
+<xsl:import href="website.xsl"/>
+<xsl:import href="../html/chunker.xsl"/>
+<xsl:include href="chunk-common.xsl"/>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/website/head.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/website/head.xsl
new file mode 100644
index 0000000..e3ac308
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/website/head.xsl
@@ -0,0 +1,316 @@
+<?xml version="1.0"?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="1.0">
+
+<xsl:template match="head" mode="head.mode">
+ <xsl:variable name="nodes" select="*"/>
+ <head>
+ <meta name="generator" content="Website XSL Stylesheet V{$VERSION}"/>
+ <xsl:if test="$html.stylesheet != ''">
+ <link rel="stylesheet" href="{$html.stylesheet}" type="text/css">
+ <xsl:if test="$html.stylesheet.type != ''">
+ <xsl:attribute name="type">
+ <xsl:value-of select="$html.stylesheet.type"/>
+ </xsl:attribute>
+ </xsl:if>
+ </link>
+ </xsl:if>
+
+ <xsl:variable name="thisid" select="ancestor-or-self::webpage/@id"/>
+ <xsl:variable name="thisrelpath">
+ <xsl:apply-templates select="$autolayout//*[@id=$thisid]" mode="toc-rel-path"/>
+ </xsl:variable>
+
+ <xsl:variable name="topid">
+ <xsl:call-template name="top.page"/>
+ </xsl:variable>
+
+ <xsl:if test="$topid != ''">
+ <link rel="home">
+ <xsl:attribute name="href">
+ <xsl:call-template name="page.uri">
+ <xsl:with-param name="page" select="$autolayout//*[@id=$topid]"/>
+ <xsl:with-param name="relpath" select="$thisrelpath"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:attribute name="title">
+ <xsl:value-of select="$autolayout//*[@id=$topid]/title"/>
+ </xsl:attribute>
+ </link>
+ </xsl:if>
+
+ <xsl:variable name="upid">
+ <xsl:call-template name="up.page"/>
+ </xsl:variable>
+
+ <xsl:if test="$upid != ''">
+ <link rel="up">
+ <xsl:attribute name="href">
+ <xsl:call-template name="page.uri">
+ <xsl:with-param name="page" select="$autolayout//*[@id=$upid]"/>
+ <xsl:with-param name="relpath" select="$thisrelpath"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:attribute name="title">
+ <xsl:value-of select="$autolayout//*[@id=$upid]/title"/>
+ </xsl:attribute>
+ </link>
+ </xsl:if>
+
+ <xsl:variable name="previd">
+ <xsl:call-template name="prev.page"/>
+ </xsl:variable>
+
+ <xsl:if test="$previd != ''">
+ <link rel="previous">
+ <xsl:attribute name="href">
+ <xsl:call-template name="page.uri">
+ <xsl:with-param name="page" select="$autolayout//*[@id=$previd]"/>
+ <xsl:with-param name="relpath" select="$thisrelpath"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:attribute name="title">
+ <xsl:value-of select="$autolayout//*[@id=$previd]/title"/>
+ </xsl:attribute>
+ </link>
+ </xsl:if>
+
+ <xsl:variable name="nextid">
+ <xsl:call-template name="next.page"/>
+ </xsl:variable>
+
+ <xsl:if test="$nextid != ''">
+ <link rel="next">
+ <xsl:attribute name="href">
+ <xsl:call-template name="page.uri">
+ <xsl:with-param name="page" select="$autolayout//*[@id=$nextid]"/>
+ <xsl:with-param name="relpath" select="$thisrelpath"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:attribute name="title">
+ <xsl:value-of select="$autolayout//*[@id=$nextid]/title"/>
+ </xsl:attribute>
+ </link>
+ </xsl:if>
+
+ <xsl:variable name="firstid">
+ <xsl:call-template name="first.page"/>
+ </xsl:variable>
+
+ <xsl:if test="$firstid != ''">
+ <link rel="first">
+ <xsl:attribute name="href">
+ <xsl:call-template name="page.uri">
+ <xsl:with-param name="page" select="$autolayout//*[@id=$firstid]"/>
+ <xsl:with-param name="relpath" select="$thisrelpath"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:attribute name="title">
+ <xsl:value-of select="$autolayout//*[@id=$firstid]/title"/>
+ </xsl:attribute>
+ </link>
+ </xsl:if>
+
+ <xsl:variable name="lastid">
+ <xsl:call-template name="last.page"/>
+ </xsl:variable>
+
+ <xsl:if test="$lastid != ''">
+ <link rel="last">
+ <xsl:attribute name="href">
+ <xsl:call-template name="page.uri">
+ <xsl:with-param name="page" select="$autolayout//*[@id=$lastid]"/>
+ <xsl:with-param name="relpath" select="$thisrelpath"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:attribute name="title">
+ <xsl:value-of select="$autolayout//*[@id=$lastid]/title"/>
+ </xsl:attribute>
+ </link>
+ </xsl:if>
+
+ <xsl:apply-templates select="$autolayout/autolayout/style
+ |$autolayout/autolayout/script
+ |$autolayout/autolayout/headlink"
+ mode="head.mode">
+ <xsl:with-param name="webpage" select="ancestor::webpage"/>
+ </xsl:apply-templates>
+ <xsl:apply-templates mode="head.mode"/>
+ <xsl:call-template name="user.head.content">
+ <xsl:with-param name="node" select="ancestor::webpage"/>
+ </xsl:call-template>
+ </head>
+</xsl:template>
+
+<xsl:template match="title" mode="head.mode">
+ <title><xsl:value-of select="."/></title>
+</xsl:template>
+
+<xsl:template match="titleabbrev" mode="head.mode">
+ <!--nop-->
+</xsl:template>
+
+<xsl:template match="subtitle" mode="head.mode">
+ <!--nop-->
+</xsl:template>
+
+<xsl:template match="summary" mode="head.mode">
+ <!--nop-->
+</xsl:template>
+
+<xsl:template match="base" mode="head.mode">
+ <base href="{@href}">
+ <xsl:if test="@target">
+ <xsl:attribute name="target">
+ <xsl:value-of select="@target"/>
+ </xsl:attribute>
+ </xsl:if>
+ </base>
+</xsl:template>
+
+<xsl:template match="keywords" mode="head.mode">
+ <meta name="keyword" content="{.}"/>
+ <meta name="keywords" content="{.}"/>
+</xsl:template>
+
+<xsl:template match="copyright" mode="head.mode">
+ <!--nop-->
+</xsl:template>
+
+<xsl:template match="author" mode="head.mode">
+ <!--nop-->
+</xsl:template>
+
+<xsl:template match="edition" mode="head.mode">
+ <!--nop-->
+</xsl:template>
+
+<xsl:template match="meta" mode="head.mode">
+ <xsl:choose>
+ <xsl:when test="@http-equiv">
+ <meta http-equiv="{@http-equiv}" content="{@content}"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <meta name="{@name}" content="{@content}"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="script" mode="head.mode">
+ <script>
+ <xsl:choose>
+ <xsl:when test="@language">
+ <xsl:attribute name="language">
+ <xsl:value-of select="@language"/>
+ </xsl:attribute>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:attribute name="language">JavaScript</xsl:attribute>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:choose>
+ <xsl:when test="@type">
+ <xsl:attribute name="type">
+ <xsl:value-of select="@type"/>
+ </xsl:attribute>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:attribute name="type">text/javascript</xsl:attribute>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:apply-templates/>
+ </script>
+</xsl:template>
+
+<xsl:template match="script[@src]" mode="head.mode" priority="2">
+ <xsl:param name="webpage" select="ancestor::webpage"/>
+ <xsl:variable name="relpath">
+ <xsl:call-template name="root-rel-path">
+ <xsl:with-param name="webpage" select="$webpage"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="language">
+ <xsl:choose>
+ <xsl:when test="@language">
+ <xsl:value-of select="@language"/>
+ </xsl:when>
+ <xsl:otherwise>JavaScript</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="type">
+ <xsl:choose>
+ <xsl:when test="@type">
+ <xsl:value-of select="@type"/>
+ </xsl:when>
+ <xsl:otherwise>text/javascript</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <script src="{$relpath}{@src}" language="{$language}" type="{$type}"/>
+</xsl:template>
+
+<xsl:template match="style" mode="head.mode">
+ <style>
+ <xsl:if test="@type">
+ <xsl:attribute name="type">
+ <xsl:value-of select="@type"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:apply-templates/>
+
+ </style>
+</xsl:template>
+
+<xsl:template match="style[@src]" mode="head.mode" priority="2">
+ <xsl:param name="webpage" select="ancestor::webpage"/>
+ <xsl:variable name="relpath">
+ <xsl:call-template name="root-rel-path">
+ <xsl:with-param name="webpage" select="$webpage"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="starts-with(@src, '/')">
+ <link rel="stylesheet" href="{@src}">
+ <xsl:if test="@type">
+ <xsl:attribute name="type">
+ <xsl:value-of select="@type"/>
+ </xsl:attribute>
+ </xsl:if>
+ </link>
+ </xsl:when>
+ <xsl:otherwise>
+ <link rel="stylesheet" href="{$relpath}{@src}">
+ <xsl:if test="@type">
+ <xsl:attribute name="type">
+ <xsl:value-of select="@type"/>
+ </xsl:attribute>
+ </xsl:if>
+ </link>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="headlink" mode="head.mode">
+ <link>
+ <xsl:copy-of select="@*"/>
+ </link>
+</xsl:template>
+
+<xsl:template match="abstract" mode="head.mode">
+ <!--nop-->
+</xsl:template>
+
+<xsl:template match="revhistory" mode="head.mode">
+ <!--nop-->
+</xsl:template>
+
+<xsl:template match="rddl:*" mode="head.mode"
+ xmlns:rddl='http://www.rddl.org/'>
+ <!--nop-->
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/website/makefile-dep.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/website/makefile-dep.xsl
new file mode 100644
index 0000000..00f810b
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/website/makefile-dep.xsl
@@ -0,0 +1,143 @@
+<?xml version="1.0"?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="1.0">
+
+<xsl:param name="filename-prefix" select="''"/>
+<xsl:param name="depends-file" select="''"/>
+<xsl:param name="output-root" select="''"/>
+<!-- Additional dependencies for target website -->
+<xsl:param name="add-website-depends" select="''"/>
+<!-- Remove output root dir instead removing each html output file.
+ Useful for removing subdirs and none html files: images, css etc. -->
+<xsl:param name="remove-output-root" select="0"/>
+
+<xsl:output method="text"/>
+
+<xsl:template match="autolayout">
+ <xsl:text>website: </xsl:text>
+ <xsl:value-of select="$add-website-depends"/>
+ <xsl:text> </xsl:text>
+ <xsl:apply-templates select="toc" mode="all"/>
+ <xsl:apply-templates select="notoc" mode="all"/>
+ <xsl:text>&#10;&#10;</xsl:text>
+ <xsl:apply-templates select="toc"/>
+ <xsl:apply-templates select="notoc"/>
+ <xsl:text>&#10;</xsl:text>
+ <xsl:text>distclean: clean
+&#9;-rm -f </xsl:text>
+ <xsl:text>autolayout.xml website.database.xml </xsl:text>
+ <xsl:text>&#32;</xsl:text>
+ <xsl:value-of select="$depends-file"/>
+ <xsl:text>&#10;&#10;</xsl:text>
+ <xsl:text>clean:&#10;</xsl:text>
+ <xsl:choose>
+ <xsl:when test="$remove-output-root and not($output-root='')">
+ <xsl:text>&#9;-rm -rf </xsl:text>
+ <xsl:call-template name="output-root"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text>&#9;-rm -f </xsl:text>
+ <xsl:apply-templates select="toc" mode="all"/>
+ <xsl:apply-templates select="notoc" mode="all"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:text>&#10;&#10;</xsl:text>
+</xsl:template>
+
+<xsl:template match="toc">
+<!--
+ <xsl:apply-templates select="." mode="calculate-dir"/>
+-->
+ <xsl:call-template name="output-root"/>
+ <xsl:value-of select="@dir"/>
+ <xsl:value-of select="$filename-prefix"/>
+ <xsl:value-of select="@filename"/>
+ <xsl:text>: </xsl:text>
+ <xsl:value-of select="@page"/>
+ <xsl:text>&#10;</xsl:text>
+ <xsl:apply-templates select=".//tocentry"/>
+</xsl:template>
+
+<xsl:template match="tocentry|notoc">
+<!--
+ <xsl:apply-templates select="." mode="calculate-dir"/>
+-->
+ <xsl:if test="@filename">
+ <xsl:call-template name="output-root"/>
+ <xsl:value-of select="@dir"/>
+ <xsl:value-of select="$filename-prefix"/>
+ <xsl:value-of select="@filename"/>
+ <xsl:text>: </xsl:text>
+ <xsl:value-of select="@page"/>
+ <xsl:text>&#10;</xsl:text>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="toc" mode="all">
+ <xsl:apply-templates select=".//tocentry" mode="all"/>
+<!--
+ <xsl:apply-templates select="." mode="calculate-dir"/>
+-->
+ <xsl:call-template name="output-root"/>
+ <xsl:value-of select="@dir"/>
+ <xsl:value-of select="$filename-prefix"/>
+ <xsl:value-of select="@filename"/>
+ <xsl:text> </xsl:text>
+</xsl:template>
+
+<xsl:template match="tocentry|notoc" mode="all">
+<!--
+ <xsl:apply-templates select="." mode="calculate-dir"/>
+-->
+ <xsl:if test="@filename">
+ <xsl:call-template name="output-root"/>
+ <xsl:value-of select="@dir"/>
+ <xsl:value-of select="$filename-prefix"/>
+ <xsl:value-of select="@filename"/>
+ <xsl:text> </xsl:text>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="*" mode="calculate-dir">
+ <xsl:choose>
+ <xsl:when test="starts-with(@dir, '/')">
+ <!-- if the directory on this begins with a "/", we're done... -->
+ <xsl:value-of select="substring-after(@dir, '/')"/>
+<!--
+ <xsl:if test="@dir != '/'">
+ <xsl:text>/</xsl:text>
+ </xsl:if>
+-->
+ </xsl:when>
+
+ <xsl:when test="parent::*">
+ <!-- if there's a parent, try it -->
+ <xsl:apply-templates select="parent::*" mode="calculate-dir"/>
+ <xsl:if test="@dir">
+ <xsl:value-of select="@dir"/>
+<!--
+ <xsl:text>/</xsl:text>
+-->
+ </xsl:if>
+ </xsl:when>
+
+ <xsl:otherwise>
+ <xsl:if test="@dir">
+ <xsl:value-of select="@dir"/>
+<!--
+ <xsl:text>/</xsl:text>
+-->
+ </xsl:if>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="output-root">
+ <xsl:if test="$output-root != ''">
+ <xsl:value-of select="$output-root"/>
+ <xsl:text>/</xsl:text>
+ </xsl:if>
+</xsl:template>
+
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/website/olink.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/website/olink.xsl
new file mode 100644
index 0000000..6766bdd
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/website/olink.xsl
@@ -0,0 +1,297 @@
+<?xml version="1.0"?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="1.0">
+
+<xsl:param name="website.database.document"
+ select="'website.database.xml'"/>
+
+<xsl:template match="olink">
+ <xsl:choose>
+ <xsl:when test="@targetdoc != '' or @targetptr != ''">
+ <xsl:apply-imports/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="olink-entity"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="olink-entity">
+ <xsl:variable name="xmlfile"
+ select="document(unparsed-entity-uri(@targetdocent),$autolayout)"/>
+ <xsl:variable name="webpage"
+ select="$xmlfile/webpage"/>
+ <xsl:variable name="tocentry"
+ select="$autolayout//*[$webpage/@id=@id]"/>
+
+ <xsl:variable name="dir">
+ <xsl:choose>
+ <xsl:when test="starts-with($tocentry/@dir, '/')">
+ <xsl:value-of select="substring($tocentry/@dir, 2)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$tocentry/@dir"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+<!-- debug
+ <xsl:message>Olink for <xsl:value-of select="unparsed-entity-uri(@targetdocent)"/></xsl:message>
+ <xsl:message>Page id <xsl:value-of select="$webpage/@id"/></xsl:message>
+-->
+
+ <xsl:choose>
+ <xsl:when test="@type = 'embed'">
+ <xsl:apply-templates select="$xmlfile"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <!-- @type = 'replace' or @type = 'new' -->
+ <a>
+ <xsl:if test="@id">
+ <xsl:attribute name="name">
+ <xsl:value-of select="@id"/>
+ </xsl:attribute>
+ </xsl:if>
+
+<!-- debug
+ <xsl:message>
+ <xsl:text>href: </xsl:text>
+ <xsl:call-template name="root-rel-path"/>
+ <xsl:text>::</xsl:text>
+ <xsl:value-of select="$dir"/>
+ <xsl:text>::</xsl:text>
+ <xsl:value-of select="$filename-prefix"/>
+ <xsl:text>::</xsl:text>
+ <xsl:value-of select="$tocentry/@filename"/>
+ <xsl:text>::</xsl:text>
+ <xsl:if test="@localinfo">
+ <xsl:text>#</xsl:text>
+ <xsl:value-of select="@localinfo"/>
+ </xsl:if>
+ </xsl:message>
+-->
+
+ <xsl:attribute name="href">
+ <xsl:call-template name="root-rel-path"/>
+ <xsl:value-of select="$dir"/>
+ <xsl:value-of select="$filename-prefix"/>
+ <xsl:value-of select="$tocentry/@filename"/>
+ <xsl:if test="@localinfo">
+ <xsl:text>#</xsl:text>
+ <xsl:value-of select="@localinfo"/>
+ </xsl:if>
+ </xsl:attribute>
+
+ <xsl:if test="@type = 'new'">
+ <xsl:attribute name="target">_blank</xsl:attribute>
+ </xsl:if>
+
+ <xsl:choose>
+ <xsl:when test="count(node()) = 0">
+ <xsl:apply-templates select="$webpage/head/title"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </a>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- Customize the selection to use both website and offsite databases -->
+<xsl:template name="select.target.database">
+ <xsl:param name="targetdoc.att" select="''"/>
+ <xsl:param name="targetptr.att" select="''"/>
+ <xsl:param name="olink.lang" select="''"/>
+
+ <!-- Is the target in the website database? -->
+ <xsl:variable name="website.olink.key">
+ <xsl:if test="$website.database.document != ''">
+ <xsl:call-template name="select.olink.key">
+ <xsl:with-param name="targetdoc.att" select="$targetdoc.att"/>
+ <xsl:with-param name="targetptr.att" select="$targetptr.att"/>
+ <xsl:with-param name="olink.lang" select="$olink.lang"/>
+ <xsl:with-param name="target.database"
+ select="document($website.database.document,/)"/>
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:variable>
+
+ <!-- Is the target in the offsite database? -->
+ <xsl:variable name="offsite.olink.key">
+ <xsl:if test="$target.database.document != ''">
+ <xsl:call-template name="select.olink.key">
+ <xsl:with-param name="targetdoc.att" select="$targetdoc.att"/>
+ <xsl:with-param name="targetptr.att" select="$targetptr.att"/>
+ <xsl:with-param name="olink.lang" select="$olink.lang"/>
+ <xsl:with-param name="target.database"
+ select="document($target.database.document,/)"/>
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="$website.olink.key != ''">
+ <xsl:value-of select="$website.database.document"/>
+ </xsl:when>
+ <xsl:when test="$offsite.olink.key != ''">
+ <xsl:value-of select="$target.database.document"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <!-- Return a bogus string and let the olink template deal with it
+ <xsl:text>NOMATCHINANYDATABASEDOCUMENT</xsl:text>
+ -->
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- Customize this template to use Website root-relative -->
+<xsl:template name="make.olink.href">
+ <xsl:param name="olink.key" select="''"/>
+ <xsl:param name="target.database"/>
+
+ <xsl:if test="$olink.key != ''">
+
+ <xsl:variable name="targetdoc">
+ <xsl:value-of select="substring-before($olink.key, '/')"/>
+ </xsl:variable>
+
+ <xsl:variable name="targetptr">
+ <xsl:value-of select="substring-before(substring-after($olink.key, '/'),'/')"/>
+ </xsl:variable>
+
+ <xsl:variable name="target.href" >
+ <xsl:for-each select="$target.database" >
+ <xsl:value-of select="key('targetptr-key', $olink.key)/@href" />
+ </xsl:for-each>
+ </xsl:variable>
+
+ <xsl:variable name="target.dir" >
+ <xsl:for-each select="$target.database" >
+ <xsl:value-of select="key('targetdoc-key', $targetdoc)/@dir" />
+ </xsl:for-each>
+ </xsl:variable>
+
+ <xsl:variable name="target.element" >
+ <xsl:for-each select="$target.database" >
+ <xsl:value-of select="key('targetptr-key', $olink.key)/@element" />
+ </xsl:for-each>
+ </xsl:variable>
+
+ <!-- Does the target database use a sitemap? -->
+ <xsl:variable name="use.sitemap">
+ <xsl:choose>
+ <xsl:when test="$target.database//sitemap">1</xsl:when>
+ <xsl:otherwise>0</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+
+ <!-- Get the baseuri for this targetptr -->
+ <xsl:variable name="baseuri" >
+ <xsl:choose>
+ <!-- Does the database use a sitemap? -->
+ <xsl:when test="$use.sitemap != 0" >
+ <xsl:choose>
+ <!-- Was current.docid parameter set? -->
+ <xsl:when test="$current.docid != ''">
+ <!-- Was it found in the database? -->
+ <xsl:variable name="currentdoc.key" >
+ <xsl:for-each select="$target.database" >
+ <xsl:value-of select="key('targetdoc-key',
+ $current.docid)/@targetdoc" />
+ </xsl:for-each>
+ </xsl:variable>
+ <xsl:choose>
+ <xsl:when test="$currentdoc.key != ''">
+ <xsl:for-each select="$target.database" >
+ <xsl:call-template name="targetpath" >
+ <xsl:with-param name="dirnode"
+ select="key('targetdoc-key', $current.docid)/parent::dir"/>
+ <xsl:with-param name="targetdoc" select="$targetdoc"/>
+ </xsl:call-template>
+ </xsl:for-each >
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:message>
+ <xsl:text>Olink error: cannot compute relative </xsl:text>
+ <xsl:text>sitemap path because $current.docid '</xsl:text>
+ <xsl:value-of select="$current.docid"/>
+ <xsl:text>' not found in target database.</xsl:text>
+ </xsl:message>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:message>
+ <xsl:text>Olink warning: cannot compute relative </xsl:text>
+ <xsl:text>sitemap path without $current.docid parameter</xsl:text>
+ </xsl:message>
+ </xsl:otherwise>
+ </xsl:choose>
+ <!-- In either case, add baseuri from its document entry-->
+ <xsl:variable name="docbaseuri">
+ <xsl:for-each select="$target.database" >
+ <xsl:value-of select="key('targetdoc-key', $targetdoc)/@baseuri" />
+ </xsl:for-each>
+ </xsl:variable>
+ <xsl:if test="$docbaseuri != ''" >
+ <xsl:value-of select="$docbaseuri"/>
+ </xsl:if>
+ </xsl:when>
+ <!-- No database sitemap in use -->
+ <xsl:otherwise>
+ <!-- compute a root-relative path if current page has a @dir -->
+ <xsl:variable name="root-rel">
+ <xsl:call-template name="root-rel-path"/>
+ </xsl:variable>
+ <xsl:if test="$root-rel != ''">
+ <xsl:value-of select="$root-rel"/>
+ </xsl:if>
+ <!-- Add the target's @dir to the path -->
+ <xsl:if test="$target.dir != ''">
+ <xsl:value-of select="$target.dir"/>
+ </xsl:if>
+ <!-- Just use any baseuri from its document entry -->
+ <xsl:variable name="docbaseuri">
+ <xsl:for-each select="$target.database" >
+ <xsl:value-of select="key('targetdoc-key',
+ $targetdoc)/@baseuri" />
+ </xsl:for-each>
+ </xsl:variable>
+ <xsl:if test="$docbaseuri != ''" >
+ <xsl:value-of select="$docbaseuri"/>
+ </xsl:if>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <!-- Form the href information -->
+ <xsl:if test="$baseuri != ''">
+ <xsl:value-of select="$baseuri"/>
+ <xsl:if test="substring($target.href,1,1) != '#'">
+ <!--xsl:text>/</xsl:text-->
+ </xsl:if>
+ </xsl:if>
+ <xsl:choose>
+ <xsl:when test="$target.element = 'webpage' and
+ $targetdoc = $targetptr">
+ <!-- Don't output #id because not needed -->
+ </xsl:when>
+ <!-- optionally turn off frag for PDF references -->
+ <xsl:when test="not($insert.olink.pdf.frag = 0 and
+ translate(substring($baseuri, string-length($baseuri) - 3),
+ 'PDF', 'pdf') = '.pdf'
+ and starts-with($target.href, '#') )">
+ <xsl:value-of select="$target.href"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$target.href"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:if>
+</xsl:template>
+
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/website/param.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/website/param.xml
new file mode 100644
index 0000000..0be62a8
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/website/param.xml
@@ -0,0 +1,788 @@
+<?xml version="1.0" encoding="ASCII"?>
+<book version="5.0">
+<info>
+<title>Website Parameter Reference</title>
+<releaseinfo role="meta">
+$Id: param.xweb 7076 2007-07-18 16:20:33Z xmldoc $
+</releaseinfo>
+<author>
+ <personname>
+ <surname>Walsh</surname>
+ <firstname>Norman</firstname>
+ </personname>
+</author>
+<copyright>
+ <year>2002-2005</year>
+ <holder>Norman Walsh</holder>
+</copyright>
+<abstract>
+ <para>This is reference documentation for all user-configurable
+ parameters in the DocBook XSL Website stylesheet (for
+ generating websites from DocBook XML sources). Note that the
+ Website stylesheet is a customization layer of the DocBook XSL
+ HTML stylesheet. Therefore, in addition to the
+ Website-specific parameters listed in this section, you can
+ also use a number of <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="../html/">HTML
+ stylesheet parameters</link> to control Website output.</para>
+</abstract>
+</info>
+<reference xml:id="general">
+<title>General Parameters</title>
+<refentry version="5.0" xml:id="autolayout-file">
+<refmeta>
+<refentrytitle>autolayout-file</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">filename</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>autolayout-file</refname>
+<refpurpose>Identifies the autolayout.xml file</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="autolayout-file.frag">
+&lt;xsl:param name="autolayout-file"&gt;autolayout.xml&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+<para>When the source pages are spread over several directories, this
+parameter can be set (for example, from the command line of a batch-mode
+XSLT processor) to indicate the location of the autolayout.xml file.</para>
+<para>FIXME: for browser-based use, there needs to be a PI for this...
+</para>
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="body.attributes">
+<refmeta>
+<refentrytitle>body.attributes</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">attribute set</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>body.attributes</refname>
+<refpurpose>DEPRECATED</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="body.attributes.frag">
+&lt;xsl:attribute-set name="body.attributes"&gt;
+ &lt;xsl:attribute name="bgcolor"&gt;white&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="text"&gt;black&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="link"&gt;#0000FF&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="vlink"&gt;#840084&lt;/xsl:attribute&gt;
+ &lt;xsl:attribute name="alink"&gt;#0000FF&lt;/xsl:attribute&gt;
+&lt;/xsl:attribute-set&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+<para>DEPRECATED</para>
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="currentpage.marker">
+<refmeta>
+<refentrytitle>currentpage.marker</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>currentpage.marker</refname>
+<refpurpose>The text symbol used to mark the current page</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="currentpage.marker.frag">
+&lt;xsl:param name="currentpage.marker"&gt;@&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+<para>Character to use as identifying the current page in </para>
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="dry-run">
+<refmeta>
+<refentrytitle>dry-run</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>dry-run</refname>
+<refpurpose>Indicates that no files should be produced</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+ <programlisting xml:id="dry-run.frag">
+ &lt;xsl:param name="dry-run" select="0"&gt;&lt;/xsl:param&gt;
+ </programlisting>
+</refsynopsisdiv>
+<refsection><info><title>Description</title></info>
+<para>When using the XSLT processor to manage dependencies and construct
+the website, this parameter can be used to suppress the generation of
+new and updated files. Effectively, this allows you to see what the
+stylesheet would do, without actually making any changes.</para>
+<para>Only applies when XSLT-based chunking is being used.</para>
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="feedback.href">
+<refmeta>
+<refentrytitle>feedback.href</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">uri</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>feedback.href</refname>
+<refpurpose>HREF (URI) for feedback link</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="feedback.href.frag">
+&lt;xsl:param name="feedback.href"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+<para>The <varname>feedback.href</varname> value is used as the value
+for the <tag class="attribute">href</tag> attribute on the feedback
+link. If <varname>feedback.href</varname>
+is empty, no feedback link is generated.</para>
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="feedback.link.text">
+<refmeta>
+<refentrytitle>feedback.link.text</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>feedback.link.text</refname>
+<refpurpose>The text of the feedback link</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="feedback.link.text.frag">
+&lt;xsl:param name="feedback.link.text"&gt;Feedback&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+<para>The contents of this variable is used as the text of the feedback
+link if <varname>feedback.href</varname> is not empty. If
+<varname>feedback.href</varname> is empty, no feedback link is
+generated.</para>
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="feedback.with.ids">
+<refmeta>
+<refentrytitle>feedback.with.ids</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>feedback.with.ids</refname>
+<refpurpose>Toggle use of IDs in feedback</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="feedback.with.ids.frag">
+&lt;xsl:param name="feedback.with.ids" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+<para>If <varname>feedback.with.ids</varname> is non-zero, the ID of the
+current page will be added to the feedback link. This can be used, for
+example, if the <varname>feedback.href</varname> is a CGI script.</para>
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="filename-prefix">
+<refmeta>
+<refentrytitle>filename-prefix</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>filename-prefix</refname>
+<refpurpose>Prefix added to all filenames</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="filename-prefix.frag">
+&lt;xsl:param name="filename-prefix"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+<para>To produce the <quote>text-only</quote> (that is, non-tabular) layout
+of a website simultaneously with the tabular layout, the filenames have to
+be distinguished. That's accomplished by adding the
+<varname>filename-prefix</varname> to the front of each filename.</para>
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="footer.hr">
+<refmeta>
+<refentrytitle>footer.hr</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>footer.hr</refname>
+<refpurpose>Toggle &lt;HR&gt; before footer</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="footer.hr.frag">
+&lt;xsl:param name="footer.hr" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+<para>If non-zero, an &lt;HR&gt; is generated at the bottom of each web page,
+before the footer.</para>
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="header.hr">
+<refmeta>
+<refentrytitle>header.hr</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>header.hr</refname>
+<refpurpose>Toggle &lt;HR&gt; after header</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="header.hr.frag">
+&lt;xsl:param name="header.hr" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+<para>If non-zero, an &lt;HR&gt; is generated at the bottom of each web page,
+before the footer.</para>
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="output-root">
+<refmeta>
+<refentrytitle>output-root</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">filename</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>output-root</refname>
+<refpurpose>Specifies the root directory of the website</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="output-root.frag">
+&lt;xsl:param name="output-root"&gt;.&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+<para>When using the XSLT processor to manage dependencies and construct
+the website, this parameter can be used to indicate the root directory
+where the resulting pages are placed.</para>
+<para>Only applies when XSLT-based chunking is being used.</para>
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="rebuild-all">
+<refmeta>
+<refentrytitle>rebuild-all</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>rebuild-all</refname>
+<refpurpose>Indicates that all files should be produced</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="rebuild-all.frag">
+&lt;xsl:param name="rebuild-all" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+<para>When using the XSLT processor to manage dependencies and construct
+the website, this parameter can be used to regenerate the whole website,
+updating even pages that don't appear to need to be updated.</para>
+<para>The dependency extension only looks at the source documents. So
+if you change something in the stylesheet, for example, that has a global
+effect, you can use this parameter to force the stylesheet to rebuild the
+whole website.
+</para>
+<para>Only applies when XSLT-based chunking is being used.</para>
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="sequential.links">
+<refmeta>
+<refentrytitle>sequential.links</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>sequential.links</refname>
+<refpurpose>Make sequentional links?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="sequential.links.frag">
+&lt;xsl:param name="sequential.links" select="0"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+<para>FIXME</para>
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="suppress.homepage.title">
+<refmeta>
+<refentrytitle>suppress.homepage.title</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>suppress.homepage.title</refname>
+<refpurpose>Suppress title on homepage?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="suppress.homepage.title.frag">
+&lt;xsl:param name="suppress.homepage.title" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+<para>FIXME:If non-zero, the title on the homepage is suppressed?</para>
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="table.spacer.image">
+<refmeta>
+<refentrytitle>table.spacer.image</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">filename</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>table.spacer.image</refname>
+<refpurpose>Invisible pixel for tabular accessibility</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="table.spacer.image.frag">
+&lt;xsl:param name="table.spacer.image"&gt;graphics/spacer.gif&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+<para>This is the 1x1 pixel, transparent pixel used for <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://diveintoaccessibility.org/day_10_presenting_your_main_content_first.html">the table trick</link> to increase the accessibility of the tabular
+website presentation.</para>
+</refsection>
+</refentry>
+
+</reference>
+<reference xml:id="nav">
+<title>Navigation Parameters</title>
+<refentry version="5.0" xml:id="banner.before.navigation">
+<refmeta>
+<refentrytitle>banner.before.navigation</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>banner.before.navigation</refname>
+<refpurpose>Put banner before navigation?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="banner.before.navigation.frag">
+&lt;xsl:param name="banner.before.navigation" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+<para>FIXME</para>
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="navbgcolor">
+<refmeta>
+<refentrytitle>navbgcolor</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">color</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>navbgcolor</refname>
+<refpurpose>The background color of the navigation TOC</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="navbgcolor.frag">
+&lt;xsl:param name="navbgcolor"&gt;#4080FF&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+<para>The background color of the navigation TOC.</para>
+<para>Only applies with the tabular presentation is being used.</para>
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="navbodywidth">
+<refmeta>
+<refentrytitle>navbodywidth</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">length</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>navbodywidth</refname>
+<refpurpose>Specifies the width of the navigation table body</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="navbodywidth.frag">
+&lt;xsl:param name="navbodywidth"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+<para>The width of the body column.</para>
+<para>Only applies with the tabular presentation is being used.</para>
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="nav.table.summary">
+<refmeta>
+<refentrytitle>nav.table.summary</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>nav.table.summary</refname>
+<refpurpose>HTML Table summary attribute value for navigation tables</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="nav.table.summary.frag">
+&lt;xsl:param name="nav.table.summary"&gt;Navigation&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+<para>The value of this parameter is used as the value of the table
+summary attribute for the navigation table.</para>
+<para>Only applies with the tabular presentation is being used.</para>
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="navtocwidth">
+<refmeta>
+<refentrytitle>navtocwidth</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">length</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>navtocwidth</refname>
+<refpurpose>Specifies the width of the navigation table TOC</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="navtocwidth.frag">
+&lt;xsl:param name="navtocwidth"&gt;220&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+<para>The width, in pixels, of the navigation column.</para>
+<para>Only applies with the tabular presentation is being used.</para>
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="textbgcolor">
+<refmeta>
+<refentrytitle>textbgcolor</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">color</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>textbgcolor</refname>
+<refpurpose>The background color of the table body</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="textbgcolor.frag">
+&lt;xsl:param name="textbgcolor"&gt;white&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+<para>The background color of the table body.</para>
+<para>Only applies with the tabular presentation is being used.</para>
+</refsection>
+</refentry>
+
+</reference>
+<reference xml:id="toc">
+<title>ToC Parameters</title>
+<refentry version="5.0" xml:id="toc.blank.graphic">
+<refmeta>
+<refentrytitle>toc.blank.graphic</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>toc.blank.graphic</refname>
+<refpurpose>Use graphic for "blanks" in TOC?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="toc.blank.graphic.frag">
+&lt;xsl:param name="toc.blank.graphic" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+<para>If non-zero, "blanks" in the the TOC will be accomplished
+with the graphic identified by <varname>toc.spacer.image</varname>.
+</para>
+<para>Only applies with the tabular presentation is being used.</para>
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="toc.blank.image">
+<refmeta>
+<refentrytitle>toc.blank.image</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">filename</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>toc.blank.image</refname>
+<refpurpose>The image for "blanks" in the TOC</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="toc.blank.image.frag">
+&lt;xsl:param name="toc.blank.image"&gt;graphics/blank.gif&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+<para>If <varname>toc.blank.graphic</varname> is non-zero, this image
+will be used to for "blanks" in the TOC.</para>
+<para>Only applies with the tabular presentation is being used.</para>
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="toc.blank.text">
+<refmeta>
+<refentrytitle>toc.blank.text</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>toc.blank.text</refname>
+<refpurpose>The text for "blanks" in the TOC</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="toc.blank.text.frag">
+&lt;xsl:param name="toc.blank.text"&gt;&#160;&#160;&#160;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+<para>If <varname>toc.blank.graphic</varname> is zero, this text string
+will be used for "blanks" in the TOC.</para>
+<para>Only applies with the tabular presentation is being used.</para>
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="toc.pointer.graphic">
+<refmeta>
+<refentrytitle>toc.pointer.graphic</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>toc.pointer.graphic</refname>
+<refpurpose>Use graphic for TOC pointer?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="toc.pointer.graphic.frag">
+&lt;xsl:param name="toc.pointer.graphic" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+<para>If non-zero, the "pointer" in the TOC will be displayed
+with the graphic identified by <varname>toc.pointer.image</varname>.
+</para>
+<para>Only applies with the tabular presentation is being used.</para>
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="toc.pointer.image">
+<refmeta>
+<refentrytitle>toc.pointer.image</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">filename</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>toc.pointer.image</refname>
+<refpurpose>The image for the "pointer" in the TOC</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="toc.pointer.image.frag">
+&lt;xsl:param name="toc.pointer.image"&gt;graphics/arrow.gif&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+<para>If <varname>toc.pointer.graphic</varname> is non-zero, this image
+will be used for the "pointer" in the TOC.</para>
+<para>Only applies with the tabular presentation is being used.</para>
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="toc.pointer.text">
+<refmeta>
+<refentrytitle>toc.pointer.text</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>toc.pointer.text</refname>
+<refpurpose>The text for the "pointer" in the TOC</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="toc.pointer.text.frag">
+&lt;xsl:param name="toc.pointer.text"&gt;&#160;&gt;&#160;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+<para>If <varname>toc.pointer.graphic</varname> is zero, this text string
+will be used to display the "pointer" in the TOC.</para>
+<para>Only applies with the tabular presentation is being used.</para>
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="toc.spacer.graphic">
+<refmeta>
+<refentrytitle>toc.spacer.graphic</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">boolean</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>toc.spacer.graphic</refname>
+<refpurpose>Use graphic for TOC spacer?</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="toc.spacer.graphic.frag">
+&lt;xsl:param name="toc.spacer.graphic" select="1"&gt;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+<para>If non-zero, the indentation in the TOC will be accomplished
+with the graphic identified by <varname>toc.spacer.image</varname>.
+</para>
+<para>Only applies with the tabular presentation is being used.</para>
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="toc.spacer.image">
+<refmeta>
+<refentrytitle>toc.spacer.image</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">filename</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>toc.spacer.image</refname>
+<refpurpose>The image for spacing the TOC</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="toc.spacer.image.frag">
+&lt;xsl:param name="toc.spacer.image"&gt;graphics/blank.gif&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+<para>If <varname>toc.spacer.graphic</varname> is non-zero, this image
+will be used to indent the TOC.</para>
+<para>Only applies with the tabular presentation is being used.</para>
+</refsection>
+</refentry>
+
+<refentry version="5.0" xml:id="toc.spacer.text">
+<refmeta>
+<refentrytitle>toc.spacer.text</refentrytitle>
+<refmiscinfo class="other" otherclass="datatype">string</refmiscinfo>
+</refmeta>
+<refnamediv>
+<refname>toc.spacer.text</refname>
+<refpurpose>The text for spacing the TOC</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+<programlisting xml:id="toc.spacer.text.frag">
+&lt;xsl:param name="toc.spacer.text"&gt;&#160;&#160;&#160;&lt;/xsl:param&gt;
+</programlisting>
+</refsynopsisdiv>
+
+<refsection><info><title>Description</title></info>
+<para>If <varname>toc.spacer.graphic</varname> is zero, this text string
+will be used to indent the TOC.</para>
+<para>Only applies with the tabular presentation is being used.</para>
+</refsection>
+</refentry>
+
+</reference>
+<appendix xml:id="stylesheet"><title>The Stylesheet</title>
+
+<para>The <filename>param.xsl</filename> stylesheet is just a wrapper
+around all these parameters.</para>
+
+<programlisting xml:id="top">
+
+&lt;!-- This file is generated from param.xweb --&gt;
+
+&lt;xsl:stylesheet exclude-result-prefixes="src" version="1.0"&gt;
+
+&lt;!-- ********************************************************************
+ $Id: param.xweb 7076 2007-07-18 16:20:33Z xmldoc $
+ ********************************************************************
+
+ This file is part of the DocBook XSL Stylesheets distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** --&gt;
+
+&lt;src:fragref linkend="autolayout-file.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="header.hr.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="footer.hr.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="feedback.href.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="feedback.with.ids.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="feedback.link.text.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="filename-prefix.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="output-root.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="dry-run.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="rebuild-all.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="nav.table.summary.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="navtocwidth.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="navbodywidth.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="textbgcolor.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="navbgcolor.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="toc.spacer.graphic.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="toc.spacer.text.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="toc.spacer.image.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="toc.pointer.graphic.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="toc.pointer.text.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="toc.pointer.image.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="toc.blank.graphic.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="toc.blank.text.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="toc.blank.image.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="suppress.homepage.title.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="body.attributes.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="sequential.links.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="currentpage.marker.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="banner.before.navigation.frag"&gt;&lt;/src:fragref&gt;
+&lt;src:fragref linkend="table.spacer.image.frag"&gt;&lt;/src:fragref&gt;
+
+&lt;/xsl:stylesheet&gt;
+</programlisting>
+
+</appendix>
+</book>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/website/param.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/website/param.xsl
new file mode 100644
index 0000000..ccd1f20
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/website/param.xsl
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="ASCII"?>
+<!-- This file is generated from param.xweb -->
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
+
+<!-- ********************************************************************
+ $Id: param.xweb 7076 2007-07-18 16:20:33Z xmldoc $
+ ********************************************************************
+
+ This file is part of the DocBook XSL Stylesheets distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<xsl:param name="autolayout-file">autolayout.xml</xsl:param>
+<xsl:param name="header.hr" select="1"/>
+<xsl:param name="footer.hr" select="1"/>
+<xsl:param name="feedback.href"/>
+<xsl:param name="feedback.with.ids" select="0"/>
+<xsl:param name="feedback.link.text">Feedback</xsl:param>
+<xsl:param name="filename-prefix"/>
+<xsl:param name="output-root">.</xsl:param>
+ <xsl:param name="dry-run" select="0"/>
+
+<xsl:param name="rebuild-all" select="0"/>
+<xsl:param name="nav.table.summary">Navigation</xsl:param>
+<xsl:param name="navtocwidth">220</xsl:param>
+<xsl:param name="navbodywidth"/>
+<xsl:param name="textbgcolor">white</xsl:param>
+<xsl:param name="navbgcolor">#4080FF</xsl:param>
+<xsl:param name="toc.spacer.graphic" select="1"/>
+<xsl:param name="toc.spacer.text">&#160;&#160;&#160;</xsl:param>
+<xsl:param name="toc.spacer.image">graphics/blank.gif</xsl:param>
+<xsl:param name="toc.pointer.graphic" select="1"/>
+<xsl:param name="toc.pointer.text">&#160;&gt;&#160;</xsl:param>
+<xsl:param name="toc.pointer.image">graphics/arrow.gif</xsl:param>
+<xsl:param name="toc.blank.graphic" select="1"/>
+<xsl:param name="toc.blank.text">&#160;&#160;&#160;</xsl:param>
+<xsl:param name="toc.blank.image">graphics/blank.gif</xsl:param>
+<xsl:param name="suppress.homepage.title" select="1"/>
+<xsl:attribute-set name="body.attributes">
+ <xsl:attribute name="bgcolor">white</xsl:attribute>
+ <xsl:attribute name="text">black</xsl:attribute>
+ <xsl:attribute name="link">#0000FF</xsl:attribute>
+ <xsl:attribute name="vlink">#840084</xsl:attribute>
+ <xsl:attribute name="alink">#0000FF</xsl:attribute>
+</xsl:attribute-set>
+<xsl:param name="sequential.links" select="0"/>
+<xsl:param name="currentpage.marker">@</xsl:param>
+<xsl:param name="banner.before.navigation" select="1"/>
+<xsl:param name="table.spacer.image">graphics/spacer.gif</xsl:param>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/website/rss.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/website/rss.xsl
new file mode 100644
index 0000000..4f27a24
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/website/rss.xsl
@@ -0,0 +1,143 @@
+<?xml version="1.0"?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:rss="http://purl.org/rss/1.0/"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:cvsf="http://nwalsh.com/xslt/ext/com.nwalsh.saxon.CVS"
+ xmlns:cvs="http://nwalsh.com/rdf/cvs#"
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ exclude-result-prefixes="rss rdf cvs dc cvsf"
+ version="1.0">
+
+<xsl:output method="html"/>
+
+<xsl:template match="rss">
+ <xsl:variable name="rss" select="document(@feed, .)"/>
+
+ <div class='rss'>
+ <xsl:choose>
+ <xsl:when test="not($rss)">
+ <xsl:message>RSS Failed: <xsl:value-of select="@feed"/></xsl:message>
+ <xsl:text>[RSS Failed: </xsl:text>
+ <xsl:value-of select="@feed"/>
+ </xsl:when>
+ <xsl:when test="$rss/rdf:RDF">
+ <xsl:apply-templates select="$rss/*/rss:channel"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <!-- is there an otherwise case? -->
+ <xsl:apply-templates select="$rss//rss:channel"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </div>
+</xsl:template>
+
+<xsl:template match="rss:channel">
+ <xsl:variable name="image-resource" select="rss:image/@rdf:resource"/>
+ <xsl:variable name="image" select="//rss:image[@rdf:about = $image-resource]"/>
+
+ <xsl:if test="$image">
+ <xsl:choose>
+ <xsl:when test="$image/rss:link">
+ <a href="{$image/rss:link}">
+ <img src="{$image/rss:url}" alt="{$image/rss:title}" align="right" border="0"/>
+ </a>
+ </xsl:when>
+ <xsl:otherwise>
+ <img src="{$image/rss:url}" alt="{$image/rss:title}" align="right"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:if>
+
+ <xsl:apply-templates select="rss:title"/>
+ <xsl:apply-templates select="rss:description"/>
+ <xsl:apply-templates select="rss:items"/>
+
+ <xsl:if test="$image">
+ <br clear="right"/>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="rss:title">
+ <xsl:param name="wrapper" select="'h3'"/>
+
+ <xsl:element name="{$wrapper}">
+ <xsl:choose>
+ <xsl:when test="../rss:link">
+ <a href="{../rss:link[1]}">
+ <xsl:apply-templates/>
+ </a>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates/>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:if test="../dc:date|../cvs:date">
+ <xsl:choose>
+ <xsl:when test="../dc:date">
+ <xsl:text> (</xsl:text>
+ <xsl:value-of select="../dc:date[1]"/>
+ <xsl:text>)</xsl:text>
+ </xsl:when>
+ <xsl:when test="function-available('cvsf:localTime')">
+ <xsl:variable name="timeString" select="cvsf:localTime(../cvs:date[1])"/>
+ <xsl:text> (</xsl:text>
+ <xsl:value-of select="substring($timeString, 1, 3)"/>
+ <xsl:text>, </xsl:text>
+ <xsl:value-of select="substring($timeString, 9, 2)"/>
+ <xsl:text> </xsl:text>
+ <xsl:value-of select="substring($timeString, 5, 3)"/>
+ <xsl:text> </xsl:text>
+ <xsl:value-of select="substring($timeString, 25, 4)"/>
+ <xsl:text>)</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="../cvs:date[1]"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:if>
+ </xsl:element>
+</xsl:template>
+
+<xsl:template match="rss:description">
+ <p>
+ <xsl:apply-templates/>
+ </p>
+</xsl:template>
+
+<xsl:template match="rss:items">
+ <dl>
+ <xsl:for-each select="rdf:Seq/rdf:li[@rdf:resource and @rdf:resource != '']">
+ <xsl:variable name="resource" select="@rdf:resource"/>
+ <xsl:variable name="item" select="//rss:item[@rdf:about = $resource]"/>
+ <xsl:if test="not($item)">
+ <xsl:message>
+ <xsl:text>RSS Warning: there is no item labelled: </xsl:text>
+ <xsl:value-of select="$resource"/>
+ </xsl:message>
+ </xsl:if>
+ <xsl:if test="count($item) &gt; 1">
+ <xsl:message>
+ <xsl:text>RSS Warning: there is more than one item labelled: </xsl:text>
+ <xsl:value-of select="$resource"/>
+ </xsl:message>
+ </xsl:if>
+ <xsl:apply-templates select="$item"/>
+ </xsl:for-each>
+ </dl>
+</xsl:template>
+
+<xsl:template match="rss:item">
+ <xsl:message>RSS item: <xsl:value-of select="rss:title"/></xsl:message>
+
+ <xsl:apply-templates select="rss:title">
+ <xsl:with-param name="wrapper" select="'dt'"/>
+ </xsl:apply-templates>
+ <xsl:if test="rss:description">
+ <dd>
+ <xsl:apply-templates select="rss:description"/>
+ </dd>
+ </xsl:if>
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/website/tabular.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/website/tabular.xsl
new file mode 100644
index 0000000..14e597e
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/website/tabular.xsl
@@ -0,0 +1,213 @@
+<?xml version="1.0"?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:html='http://www.w3.org/1999/xhtml'
+ xmlns:doc="http://nwalsh.com/xsl/documentation/1.0"
+ exclude-result-prefixes="html doc"
+ version="1.0">
+
+<xsl:import href="website-common.xsl"/>
+<xsl:include href="toc-tabular.xsl"/>
+
+<xsl:output method="html"
+ indent="no"
+ doctype-public="-//W3C//DTD HTML 4.01 Transitional//EN"
+ doctype-system="http://www.w3.org/TR/html4/loose.dtd"
+/>
+
+<xsl:param name="autolayout" select="document($autolayout-file, /*)"/>
+
+<!-- ==================================================================== -->
+
+<!-- Netscape gets badly confused if it sees a CSS style... -->
+<xsl:param name="admon.style" select="''"/>
+<xsl:param name="admon.graphics" select="1"/>
+<xsl:param name="admon.graphics.path">graphics/</xsl:param>
+<xsl:param name="admon.graphics.extension">.gif</xsl:param>
+
+<xsl:attribute-set name="table.properties">
+ <xsl:attribute name="border">0</xsl:attribute>
+ <xsl:attribute name="cellpadding">0</xsl:attribute>
+ <xsl:attribute name="cellspacing">0</xsl:attribute>
+ <xsl:attribute name="width">100%</xsl:attribute>
+</xsl:attribute-set>
+
+<xsl:attribute-set name="table.navigation.cell.properties">
+ <xsl:attribute name="valign">top</xsl:attribute>
+ <xsl:attribute name="align">left</xsl:attribute>
+ <!-- width is set with $navotocwidth -->
+ <xsl:attribute name="bgcolor">
+ <xsl:choose>
+ <xsl:when test="/webpage/config[@param='navbgcolor']/@value[. != '']">
+ <xsl:value-of select="/webpage/config[@param='navbgcolor']/@value"/>
+ </xsl:when>
+ <xsl:when test="$autolayout/autolayout/config[@param='navbgcolor']/@value[. != '']">
+ <xsl:value-of select="$autolayout/autolayout/config[@param='navbgcolor']/@value"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$navbgcolor"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:attribute>
+</xsl:attribute-set>
+
+<xsl:attribute-set name="table.body.cell.properties">
+ <xsl:attribute name="valign">top</xsl:attribute>
+ <xsl:attribute name="align">left</xsl:attribute>
+ <!-- width is set with $navobodywidth -->
+ <xsl:attribute name="bgcolor">
+ <xsl:value-of select="$textbgcolor"/>
+ </xsl:attribute>
+</xsl:attribute-set>
+
+<xsl:param name="body.columns" select="2"/>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="/">
+ <xsl:apply-templates/>
+</xsl:template>
+
+<xsl:template name="home.navhead">
+ <xsl:text>Navhead</xsl:text>
+</xsl:template>
+
+<xsl:template name="home.navhead.upperright">
+ <xsl:text>Upper-right</xsl:text>
+</xsl:template>
+
+<xsl:template name="home.navhead.cell">
+ <td width="50%" valign="middle" align="left">
+ <xsl:call-template name="home.navhead"/>
+ </td>
+</xsl:template>
+
+<xsl:template name="home.navhead.upperright.cell">
+ <td width="50%" valign="middle" align="right">
+ <xsl:call-template name="home.navhead.upperright"/>
+ </td>
+</xsl:template>
+
+<xsl:template name="home.navhead.separator">
+ <hr/>
+</xsl:template>
+
+<xsl:template match="webpage">
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+
+ <xsl:variable name="relpath">
+ <xsl:call-template name="root-rel-path">
+ <xsl:with-param name="webpage" select="."/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="tocentry" select="$autolayout/autolayout//*[$id=@id]"/>
+ <xsl:variable name="toc" select="($tocentry/ancestor-or-self::toc
+ |$autolayout/autolayout/toc[1])[last()]"/>
+
+ <html>
+ <xsl:apply-templates select="head" mode="head.mode"/>
+ <xsl:apply-templates select="config" mode="head.mode"/>
+ <body class="tabular">
+ <xsl:call-template name="body.attributes"/>
+
+ <div class="{name(.)}">
+ <a name="{$id}"/>
+
+ <xsl:call-template name="allpages.banner"/>
+
+ <table xsl:use-attribute-sets="table.properties" border="0">
+ <xsl:if test="$nav.table.summary!=''">
+ <xsl:attribute name="summary">
+ <xsl:value-of select="normalize-space($nav.table.summary)"/>
+ </xsl:attribute>
+ </xsl:if>
+ <tr>
+ <td xsl:use-attribute-sets="table.navigation.cell.properties">
+ <img src="{$relpath}{$table.spacer.image}" alt=" " width="1" height="1"/>
+ </td>
+ <xsl:call-template name="hspacer">
+ <xsl:with-param name="vspacer" select="1"/>
+ </xsl:call-template>
+ <td rowspan="2" xsl:use-attribute-sets="table.body.cell.properties">
+ <xsl:if test="$navbodywidth != ''">
+ <xsl:attribute name="width">
+ <xsl:value-of select="$navbodywidth"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:if test="$autolayout/autolayout/toc[1]/@id = $id">
+ <table border="0" summary="home page extra headers"
+ cellpadding="0" cellspacing="0" width="100%">
+ <tr>
+ <xsl:call-template name="home.navhead.cell"/>
+ <xsl:call-template name="home.navhead.upperright.cell"/>
+ </tr>
+ </table>
+ <xsl:call-template name="home.navhead.separator"/>
+ </xsl:if>
+
+ <xsl:if test="$autolayout/autolayout/toc[1]/@id != $id
+ or $suppress.homepage.title = 0">
+ <xsl:apply-templates select="./head/title" mode="title.mode"/>
+ </xsl:if>
+
+ <xsl:apply-templates select="child::node()[not(self::webpage)]"/>
+ <xsl:call-template name="process.footnotes"/>
+ <br/>
+ </td>
+ </tr>
+ <tr>
+ <td xsl:use-attribute-sets="table.navigation.cell.properties">
+ <xsl:if test="$navtocwidth != ''">
+ <xsl:attribute name="width">
+ <xsl:choose>
+ <xsl:when test="/webpage/config[@param='navtocwidth']/@value[. != '']">
+ <xsl:value-of select="/webpage/config[@param='navtocwidth']/@value"/>
+ </xsl:when>
+ <xsl:when test="$autolayout/autolayout/config[@param='navtocwidth']/@value[. != '']">
+ <xsl:value-of select="$autolayout/autolayout/config[@param='navtocwidth']/@value"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$navtocwidth"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:choose>
+ <xsl:when test="$toc">
+ <p class="navtoc">
+ <xsl:apply-templates select="$toc">
+ <xsl:with-param name="pageid" select="@id"/>
+ </xsl:apply-templates>
+ </p>
+ </xsl:when>
+ <xsl:otherwise>&#160;</xsl:otherwise>
+ </xsl:choose>
+ </td>
+ <xsl:call-template name="hspacer"/>
+ </tr>
+ <xsl:call-template name="webpage.table.footer"/>
+ </table>
+
+ <xsl:call-template name="webpage.footer"/>
+ </div>
+
+ </body>
+ </html>
+</xsl:template>
+
+<xsl:template name="hspacer">
+ <xsl:param name="vspacer" select="0"/>
+ <!-- nop -->
+</xsl:template>
+
+<xsl:template match="config[@param='filename']" mode="head.mode">
+</xsl:template>
+
+<xsl:template match="webtoc">
+ <!-- nop -->
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/website/toc-tabular.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/website/toc-tabular.xsl
new file mode 100644
index 0000000..4809840
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/website/toc-tabular.xsl
@@ -0,0 +1,480 @@
+<?xml version="1.0"?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="1.0">
+
+<xsl:output method="html"/>
+
+<xsl:param name="nav.graphics" select="1"/>
+<xsl:param name="nav.pointer" select="1"/>
+<xsl:param name="nav.revisionflag" select="1"/>
+
+<xsl:param name="toc.spacer.text">&#160;&#160;&#160;</xsl:param>
+<xsl:param name="toc.spacer.image">graphics/blank.gif</xsl:param>
+
+<xsl:param name="nav.icon.path">graphics/navicons/</xsl:param>
+<xsl:param name="nav.icon.extension">.gif</xsl:param>
+
+<!-- styles: folder, folder16, plusminus, triangle, arrow -->
+<xsl:param name="nav.icon.style">triangle</xsl:param>
+
+<xsl:param name="nav.text.spacer">&#160;</xsl:param>
+<xsl:param name="nav.text.current.open">+</xsl:param>
+<xsl:param name="nav.text.current.page">+</xsl:param>
+<xsl:param name="nav.text.other.open">&#160;</xsl:param>
+<xsl:param name="nav.text.other.closed">&#160;</xsl:param>
+<xsl:param name="nav.text.other.page">&#160;</xsl:param>
+<xsl:param name="nav.text.revisionflag.added">New</xsl:param>
+<xsl:param name="nav.text.revisionflag.changed">Changed</xsl:param>
+<xsl:param name="nav.text.revisionflag.deleted"></xsl:param>
+<xsl:param name="nav.text.revisionflag.off"></xsl:param>
+
+<xsl:param name="nav.text.pointer">&lt;-</xsl:param>
+
+<xsl:param name="toc.expand.depth" select="1"/>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="toc/title|tocentry/title|titleabbrev">
+ <xsl:apply-templates/>
+</xsl:template>
+
+<xsl:template match="toc">
+ <xsl:param name="pageid" select="@id"/>
+
+ <xsl:variable name="relpath">
+ <xsl:call-template name="toc-rel-path">
+ <xsl:with-param name="pageid" select="$pageid"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="homebanner"
+ select="/autolayout/config[@param='homebanner-tabular'][1]"/>
+
+ <xsl:variable name="banner"
+ select="/autolayout/config[@param='banner-tabular'][1]"/>
+
+ <xsl:choose>
+ <xsl:when test="$pageid = @id">
+ <img align="left" border="0">
+ <xsl:attribute name="src">
+ <xsl:value-of select="$relpath"/>
+ <xsl:value-of select="$homebanner/@value"/>
+ </xsl:attribute>
+ <xsl:attribute name="alt">
+ <xsl:value-of select="$homebanner/@altval"/>
+ </xsl:attribute>
+ </img>
+ <br clear="all"/>
+ <br/>
+ </xsl:when>
+ <xsl:otherwise>
+ <a href="{$relpath}{@dir}{$filename-prefix}{@filename}">
+ <img align="left" border="0">
+ <xsl:attribute name="src">
+ <xsl:value-of select="$relpath"/>
+ <xsl:value-of select="$banner/@value"/>
+ </xsl:attribute>
+ <xsl:attribute name="alt">
+ <xsl:value-of select="$banner/@altval"/>
+ </xsl:attribute>
+ </img>
+ </a>
+ <br clear="all"/>
+ <br/>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:apply-templates select="tocentry">
+ <xsl:with-param name="pageid" select="$pageid"/>
+ <xsl:with-param name="relpath" select="$relpath"/>
+ </xsl:apply-templates>
+ <br/>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="tocentry">
+ <xsl:param name="pageid" select="@id"/>
+ <xsl:param name="toclevel" select="count(ancestor::*)"/>
+ <xsl:param name="relpath" select="''"/>
+ <xsl:param name="revisionflag" select="@revisionflag"/>
+
+ <xsl:variable name="page" select="."/>
+ <xsl:variable name="target"
+ select="($page/descendant-or-self::tocentry[not(@tocskip) or @tocskip = '0']
+ |$page/following::tocentry[@tocskip and @tocskip='0'])[1]"/>
+
+ <xsl:variable name="depth" select="count(ancestor::*)-1"/>
+
+ <xsl:variable name="isdescendant">
+ <xsl:choose>
+ <xsl:when test="ancestor::*[@id=$pageid]">1</xsl:when>
+ <xsl:otherwise>0</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="hasdescendant">
+ <xsl:choose>
+ <xsl:when test="descendant::tocentry != ''">1</xsl:when>
+ <xsl:otherwise>0</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="isancestor">
+ <xsl:choose>
+ <xsl:when test="descendant::*[@id=$pageid]">1</xsl:when>
+ <xsl:otherwise>0</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="use.toc.expand.depth">
+ <xsl:variable name="config-param" select="ancestor::autolayout/config[@param='toc.expand.depth']/@value"/>
+ <xsl:choose>
+ <!-- toc.expand.depth attribute is not in DTD -->
+ <xsl:when test="ancestor::toc/@toc.expand.depth">
+ <xsl:value-of select="ancestor::toc/@toc.expand.depth"/>
+ </xsl:when>
+ <xsl:when test="floor($config-param) > 0">
+ <xsl:value-of select="$config-param"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$toc.expand.depth"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="is.open">
+ <xsl:choose>
+ <xsl:when test="$pageid = @id
+ or $isancestor='1'
+ or $depth &lt; $use.toc.expand.depth">1</xsl:when>
+ <xsl:otherwise>0</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <!-- For any entry in the TOC:
+ 1. It is the current page
+ a. it is a leaf current/leaf
+ b. it is an open page current/open
+ 2. It is not the current page
+ a. it is a leaf other/leaf
+ b. it is an open page other/open
+ c. it is a closed page other/closed
+ -->
+
+ <xsl:variable name="preceding-icon">
+ <xsl:value-of select="$relpath"/>
+ <xsl:value-of select="$nav.icon.path"/>
+ <xsl:value-of select="$nav.icon.style"/>
+ <xsl:choose>
+ <xsl:when test="$pageid=@id">
+ <xsl:choose>
+ <xsl:when test="$hasdescendant != 0">
+ <xsl:text>/current/open</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text>/current/leaf</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:choose>
+ <xsl:when test="$hasdescendant = 0">
+ <xsl:text>/other/leaf</xsl:text>
+ </xsl:when>
+ <xsl:when test="$is.open != 0">
+ <xsl:text>/other/open</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text>/other/closed</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:value-of select="$nav.icon.extension"/>
+ </xsl:variable>
+
+ <xsl:variable name="preceding-text">
+ <xsl:choose>
+ <xsl:when test="$pageid=@id">
+ <xsl:choose>
+ <xsl:when test="$hasdescendant != 0">
+ <xsl:value-of select="$nav.text.current.open"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$nav.text.current.page"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:choose>
+ <xsl:when test="$isancestor != 0">
+ <xsl:value-of select="$nav.text.other.open"/>
+ </xsl:when>
+ <xsl:when test="$hasdescendant != 0">
+ <xsl:value-of select="$nav.text.other.closed"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$nav.text.other.page"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="following-icon">
+ <xsl:value-of select="$relpath"/>
+ <xsl:value-of select="$nav.icon.path"/>
+ <xsl:value-of select="$nav.icon.style"/>
+ <xsl:text>/current/pointer</xsl:text>
+ <xsl:value-of select="$nav.icon.extension"/>
+ </xsl:variable>
+
+ <xsl:variable name="following-text">
+ <xsl:value-of select="$nav.text.pointer"/>
+ </xsl:variable>
+
+ <xsl:variable name="revisionflag-icon">
+ <xsl:value-of select="$relpath"/>
+ <xsl:value-of select="$nav.icon.path"/>
+ <xsl:value-of select="$nav.icon.style"/>
+ <xsl:text>/</xsl:text>
+ <xsl:value-of select="$revisionflag"/>
+ <xsl:value-of select="$nav.icon.extension"/>
+ </xsl:variable>
+
+ <xsl:variable name="revisionflag-text">
+ <xsl:choose>
+ <xsl:when test="$revisionflag = 'changed'">
+ <xsl:value-of select="$nav.text.revisionflag.changed"/>
+ </xsl:when>
+ <xsl:when test="$revisionflag = 'added'">
+ <xsl:value-of select="$nav.text.revisionflag.added"/>
+ </xsl:when>
+ <xsl:when test="$revisionflag = 'deleted'">
+ <xsl:value-of select="$nav.text.revisionflag.deleted"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$nav.text.revisionflag.off"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <span>
+ <xsl:if test="$toclevel = 2">
+ <xsl:attribute name="class">
+ <xsl:text>toplevel</xsl:text>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:if test="$toclevel &gt; 2">
+ <xsl:attribute name="class">
+ <xsl:text>shrink</xsl:text>
+ <xsl:value-of select="$toclevel - 2"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:call-template name="insert.spacers">
+ <xsl:with-param name="count" select="$toclevel - 1"/>
+ <xsl:with-param name="relpath" select="$relpath"/>
+ </xsl:call-template>
+
+ <xsl:choose>
+ <xsl:when test="$nav.graphics != 0">
+ <xsl:call-template name="link.to.page">
+ <xsl:with-param name="href" select="@href"/>
+ <xsl:with-param name="page" select="$target"/>
+ <xsl:with-param name="relpath" select="$relpath"/>
+ <xsl:with-param name="linktext">
+ <img src="{$preceding-icon}" alt="{$preceding-text}" border="0"/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$preceding-text"/>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:choose>
+ <xsl:when test="$pageid = @id">
+ <span class="curpage">
+ <xsl:choose>
+ <xsl:when test="titleabbrev">
+ <xsl:apply-templates select="titleabbrev"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="title"/>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:if test="$nav.revisionflag != '0' and $revisionflag">
+ <xsl:value-of select="$nav.text.spacer"/>
+ <xsl:choose>
+ <xsl:when test="$nav.graphics = '1'">
+ <img src="{$revisionflag-icon}" alt="{$revisionflag-text}" align="bottom"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text>(</xsl:text>
+ <xsl:value-of select="$revisionflag-text"/>
+ <xsl:text>)</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:if>
+
+ <xsl:if test="$nav.pointer != '0'">
+ <xsl:value-of select="$nav.text.spacer"/>
+ <xsl:choose>
+ <xsl:when test="$nav.graphics = '1'">
+ <img src="{$following-icon}" alt="{$following-text}"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$following-text"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:if>
+ </span>
+ <br/>
+ </xsl:when>
+ <xsl:otherwise>
+ <span>
+ <xsl:choose>
+ <xsl:when test="$isdescendant='0'">
+ <xsl:choose>
+ <xsl:when test="$isancestor='1'">
+ <xsl:attribute name="class">ancestor</xsl:attribute>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:attribute name="class">otherpage</xsl:attribute>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <!-- IS a descendant of curpage -->
+ <xsl:attribute name="class">descendant</xsl:attribute>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:call-template name="link.to.page">
+ <xsl:with-param name="href" select="@href"/>
+ <xsl:with-param name="page" select="$target"/>
+ <xsl:with-param name="relpath" select="$relpath"/>
+ <xsl:with-param name="linktext">
+ <xsl:choose>
+ <xsl:when test="titleabbrev">
+ <xsl:apply-templates select="titleabbrev"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="title"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:with-param>
+ </xsl:call-template>
+
+ <xsl:if test="$nav.revisionflag != '0' and $revisionflag">
+ <xsl:value-of select="$nav.text.spacer"/>
+ <xsl:choose>
+ <xsl:when test="$nav.graphics = '1'">
+ <img src="{$revisionflag-icon}" alt="{$revisionflag-text}"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text>(</xsl:text>
+ <xsl:value-of select="$revisionflag-text"/>
+ <xsl:text>)</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:if>
+
+ </span>
+ <br/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </span>
+
+ <xsl:if test="$is.open != 0">
+ <xsl:apply-templates select="tocentry">
+ <xsl:with-param name="pageid" select="$pageid"/>
+ <xsl:with-param name="relpath" select="$relpath"/>
+ </xsl:apply-templates>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template name="insert.spacers">
+ <xsl:param name="count" select="0"/>
+ <xsl:param name="relpath"/>
+ <xsl:if test="$count>0">
+ <xsl:choose>
+ <xsl:when test="$nav.graphics != 0">
+ <img src="{$relpath}{$toc.spacer.image}" alt="{$toc.spacer.text}"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$toc.spacer.text"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:call-template name="insert.spacers">
+ <xsl:with-param name="count" select="$count - 1"/>
+ <xsl:with-param name="relpath" select="$relpath"/>
+ </xsl:call-template>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="toc|tocentry|notoc" mode="toc-rel-path">
+ <xsl:call-template name="toc-rel-path"/>
+</xsl:template>
+
+<xsl:template name="toc-rel-path">
+ <xsl:param name="pageid" select="@id"/>
+ <xsl:variable name="entry" select="$autolayout//*[@id=$pageid]"/>
+ <xsl:variable name="filename" select="concat($entry/@dir,$entry/@filename)"/>
+
+ <xsl:variable name="slash-count">
+ <xsl:call-template name="toc-directory-depth">
+ <xsl:with-param name="filename" select="$filename"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="depth">
+ <xsl:choose>
+ <xsl:when test="starts-with($filename, '/')">
+ <xsl:value-of select="$slash-count - 1"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$slash-count"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+<!--
+ <xsl:message>
+ <xsl:value-of select="$filename"/>
+ <xsl:text> depth=</xsl:text>
+ <xsl:value-of select="$depth"/>
+ </xsl:message>
+-->
+
+ <xsl:if test="$depth > 0">
+ <xsl:call-template name="copy-string">
+ <xsl:with-param name="string">../</xsl:with-param>
+ <xsl:with-param name="count" select="$depth"/>
+ </xsl:call-template>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template name="toc-directory-depth">
+ <xsl:param name="filename"></xsl:param>
+ <xsl:param name="count" select="0"/>
+
+ <xsl:choose>
+ <xsl:when test='contains($filename,"/")'>
+ <xsl:call-template name="toc-directory-depth">
+ <xsl:with-param name="filename"
+ select="substring-after($filename,'/')"/>
+ <xsl:with-param name="count" select="$count + 1"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$count"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/website/toc.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/website/toc.xsl
new file mode 100644
index 0000000..0252ea9
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/website/toc.xsl
@@ -0,0 +1,286 @@
+<?xml version="1.0"?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="1.0">
+
+<xsl:output method="html"/>
+
+<xsl:param name="max.toc.width" select="7"/>
+
+<xsl:template match="toc/title|tocentry/title|titleabbrev">
+ <xsl:apply-templates/>
+</xsl:template>
+
+<xsl:template match="toc">
+ <xsl:param name="pageid" select="@id"/>
+
+ <xsl:variable name="relpath">
+ <xsl:call-template name="toc-rel-path">
+ <xsl:with-param name="pageid" select="$pageid"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="homebanner"
+ select="/autolayout/config[@param='homebanner'][1]"/>
+
+ <xsl:variable name="banner"
+ select="/autolayout/config[@param='banner'][1]"/>
+
+ <xsl:variable name="homebannertext"
+ select="/autolayout/config[@param='homebannertext'][1]"/>
+
+ <xsl:variable name="bannertext"
+ select="/autolayout/config[@param='bannertext'][1]"/>
+
+ <xsl:choose>
+ <xsl:when test="$pageid = @id">
+ <xsl:choose>
+ <xsl:when test="$homebanner">
+ <img border="0">
+ <xsl:attribute name="src">
+ <xsl:value-of select="$relpath"/>
+ <xsl:value-of select="$homebanner/@value"/>
+ </xsl:attribute>
+ <xsl:attribute name="alt">
+ <xsl:value-of select="$homebanner/@altval"/>
+ </xsl:attribute>
+ </img>
+ <xsl:value-of select="$currentpage.marker"/>
+ </xsl:when>
+ <xsl:when test="$homebannertext">
+ <xsl:value-of select="$homebannertext/@value"/>
+ <xsl:value-of select="$currentpage.marker"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="gentext.nav.home"/>
+ <xsl:value-of select="$currentpage.marker"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <a href="{$relpath}{@dir}{$filename-prefix}{@filename}">
+ <xsl:choose>
+ <xsl:when test="$banner">
+ <img border="0">
+ <xsl:attribute name="src">
+ <xsl:value-of select="$relpath"/>
+ <xsl:value-of select="$banner/@value"/>
+ </xsl:attribute>
+ <xsl:attribute name="alt">
+ <xsl:value-of select="$banner/@altval"/>
+ </xsl:attribute>
+ </img>
+ </xsl:when>
+ <xsl:when test="$bannertext">
+ <xsl:value-of select="$bannertext/@value"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="gentext.nav.home"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </a>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:text> | </xsl:text>
+
+ <xsl:call-template name="process-children">
+ <xsl:with-param name="pageid" select="$pageid"/>
+ <xsl:with-param name="relpath" select="$relpath"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="tocentry">
+ <xsl:param name="pageid" select="@id"/>
+ <xsl:param name="relpath" select="''"/>
+
+ <xsl:if test="preceding-sibling::tocentry">
+ <xsl:text> | </xsl:text>
+ </xsl:if>
+
+ <xsl:choose>
+ <xsl:when test="$pageid = @id">
+ <xsl:choose>
+ <xsl:when test="titleabbrev">
+ <xsl:apply-templates select="titleabbrev"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="title"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:value-of select="$currentpage.marker"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <a>
+ <xsl:attribute name="href">
+ <xsl:choose>
+ <xsl:when test="@href">
+ <xsl:value-of select="@href"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$relpath"/>
+ <xsl:value-of select="@dir"/>
+ <xsl:value-of select="$filename-prefix"/>
+ <xsl:value-of select="@filename"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:attribute>
+ <xsl:choose>
+ <xsl:when test="titleabbrev">
+ <xsl:apply-templates select="titleabbrev"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="title"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </a>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="toc|tocentry|notoc" mode="toc-rel-path">
+ <xsl:call-template name="toc-rel-path"/>
+</xsl:template>
+
+<xsl:template name="toc-rel-path">
+ <xsl:param name="pageid" select="@id"/>
+ <xsl:variable name="entry" select="$autolayout//*[@id=$pageid]"/>
+ <xsl:variable name="filename" select="concat($entry/@dir,$entry/@filename)"/>
+
+ <xsl:variable name="depth">
+ <xsl:call-template name="toc-directory-depth">
+ <xsl:with-param name="filename" select="$filename"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:if test="$depth > 0">
+ <xsl:call-template name="copy-string">
+ <xsl:with-param name="string">../</xsl:with-param>
+ <xsl:with-param name="count" select="$depth"/>
+ </xsl:call-template>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template name="toc-directory-depth">
+ <xsl:param name="filename"></xsl:param>
+ <xsl:param name="count" select="0"/>
+
+ <xsl:choose>
+ <xsl:when test='contains($filename,"/")'>
+ <xsl:call-template name="toc-directory-depth">
+ <xsl:with-param name="filename"
+ select="substring-after($filename,'/')"/>
+ <xsl:with-param name="count" select="$count + 1"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$count"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="process-children">
+ <xsl:param name="pageid" select="@id"/>
+ <xsl:param name="relpath" select="''"/>
+
+ <xsl:choose>
+ <xsl:when test="tocentry[descendant-or-self::*[@id=$pageid]]">
+ <xsl:call-template name="process-tocentry-children">
+ <xsl:with-param name="pageid" select="$pageid"/>
+ <xsl:with-param name="relpath" select="$relpath"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="process-toc-children">
+ <xsl:with-param name="pageid" select="$pageid"/>
+ <xsl:with-param name="relpath" select="$relpath"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="process-tocentry-children">
+ <xsl:param name="pageid" select="@id"/>
+ <xsl:param name="relpath" select="''"/>
+
+ <xsl:choose>
+ <xsl:when test="count(tocentry) &gt; $max.toc.width">
+ <xsl:variable name="cur"
+ select="tocentry[descendant-or-self::*[@id=$pageid]]"/>
+
+ <xsl:variable name="half" select="$max.toc.width div 2"/>
+
+ <xsl:variable name="all-nodes"
+ select="$cur/preceding-sibling::tocentry[position() &lt; $half]
+ | $cur
+ | $cur/following-sibling::tocentry"/>
+
+ <xsl:variable name="nodes"
+ select="$all-nodes[position() &lt; $max.toc.width]"/>
+
+ <xsl:if test="count($cur/preceding-sibling::tocentry) &gt; $half">
+ <xsl:text>...</xsl:text>
+ </xsl:if>
+ <xsl:apply-templates select="$nodes">
+ <xsl:with-param name="pageid" select="$pageid"/>
+ <xsl:with-param name="relpath" select="$relpath"/>
+ </xsl:apply-templates>
+ <xsl:if test="count($all-nodes) &gt; $max.toc.width">
+ <xsl:text> | ...</xsl:text>
+ </xsl:if>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="tocentry">
+ <xsl:with-param name="pageid" select="$pageid"/>
+ <xsl:with-param name="relpath" select="$relpath"/>
+ </xsl:apply-templates>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <br/>
+
+ <!-- if the current page isn't in this list, keep digging... -->
+ <xsl:if test="not(tocentry[$pageid=@id])">
+ <xsl:for-each select="tocentry">
+ <xsl:if test="descendant::*[@id=$pageid]">
+ <xsl:call-template name="process-children">
+ <xsl:with-param name="pageid" select="$pageid"/>
+ <xsl:with-param name="relpath" select="$relpath"/>
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:for-each>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template name="process-toc-children">
+ <xsl:param name="pageid" select="@id"/>
+ <xsl:param name="relpath" select="''"/>
+
+ <xsl:choose>
+ <xsl:when test="count(tocentry) &gt; $max.toc.width">
+ <xsl:variable name="half" select="$max.toc.width div 2"/>
+
+ <xsl:variable name="all-nodes" select="tocentry"/>
+ <xsl:variable name="nodes"
+ select="$all-nodes[position() &lt; $max.toc.width]"/>
+
+ <xsl:apply-templates select="$nodes">
+ <xsl:with-param name="pageid" select="$pageid"/>
+ <xsl:with-param name="relpath" select="$relpath"/>
+ </xsl:apply-templates>
+
+ <xsl:if test="count($all-nodes) &gt; $max.toc.width">
+ <xsl:text> | ...</xsl:text>
+ </xsl:if>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="tocentry">
+ <xsl:with-param name="pageid" select="$pageid"/>
+ <xsl:with-param name="relpath" select="$relpath"/>
+ </xsl:apply-templates>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <br/>
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/website/website-common.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/website/website-common.xsl
new file mode 100644
index 0000000..370062a
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/website/website-common.xsl
@@ -0,0 +1,821 @@
+<?xml version='1.0'?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:html='http://www.w3.org/1999/xhtml'
+ xmlns:doc="http://nwalsh.com/xsl/documentation/1.0"
+ exclude-result-prefixes="doc html"
+ version='1.0'>
+
+<!-- ********************************************************************
+ $Id: website-common.xsl 8100 2008-08-03 18:15:51Z mzjn $
+ ********************************************************************
+
+ This file is part of the WebSite distribution.
+ See ../README or http://nwalsh.com/website/ for copyright
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<!-- ==================================================================== -->
+
+<xsl:import href="../html/docbook.xsl"/>
+<xsl:import href="xbel.xsl"/>
+<xsl:include href="../VERSION"/>
+<xsl:include href="param.xsl"/>
+<xsl:include href="head.xsl"/>
+<xsl:include href="rss.xsl"/>
+<xsl:include href="olink.xsl"/>
+
+<xsl:preserve-space elements="*"/>
+<xsl:strip-space elements="website webpage"/>
+
+<xsl:output method="html"
+ indent="no"/>
+
+<!-- ==================================================================== -->
+
+<xsl:template name="admon.graphic">
+ <xsl:param name="node" select="."/>
+ <xsl:call-template name="root-rel-path"/>
+ <xsl:value-of select="$admon.graphics.path"/>
+ <xsl:choose>
+ <xsl:when test="name($node)='note'">note</xsl:when>
+ <xsl:when test="name($node)='warning'">warning</xsl:when>
+ <xsl:when test="name($node)='caution'">caution</xsl:when>
+ <xsl:when test="name($node)='tip'">tip</xsl:when>
+ <xsl:when test="name($node)='important'">important</xsl:when>
+ <xsl:otherwise>note</xsl:otherwise>
+ </xsl:choose>
+ <xsl:value-of select="$admon.graphics.extension"/>
+</xsl:template>
+
+<doc:template name="admon.graphic">
+<refpurpose>Select appropriate admonition graphic</refpurpose>
+<refdescription>
+<para>Selects the appropriate admonition graphic file and returns the
+fully qualified path to it.</para>
+</refdescription>
+<refparam>
+<variablelist>
+<varlistentry><term>node</term>
+<listitem>
+<para>The source node to use for the purpose of selection. It should
+be one of the admonition elements (<sgmltag>note</sgmltag>,
+<sgmltag>warning</sgmltag>, etc.). The default node is the context
+node.</para>
+</listitem>
+</varlistentry>
+</variablelist>
+</refparam>
+<refreturns>
+<para>The fully qualified path to the admonition graphic. If the
+<varname>node</varname> is not an admonition element, the
+ <quote>note</quote> graphic is returned.</para>
+</refreturns>
+</doc:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="/">
+ <xsl:apply-templates/>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template name="allpages.banner"/>
+
+<!-- ==================================================================== -->
+
+<xsl:template name="webpage.table.footer"/>
+
+<xsl:template name="webpage.footer">
+ <xsl:variable name="page" select="."/>
+ <xsl:variable name="footers" select="$page/config[@param='footer']
+ |$page/config[@param='footlink']
+ |$autolayout/autolayout/config[@param='footer']
+ |$autolayout/autolayout/config[@param='footlink']"/>
+
+ <xsl:variable name="tocentry" select="$autolayout//*[@id=$page/@id]"/>
+ <xsl:variable name="toc" select="($tocentry/ancestor-or-self::toc[1]
+ | $autolayout//toc[1])[last()]"/>
+
+ <xsl:variable name="feedback">
+ <xsl:choose>
+ <xsl:when test="$page/config[@param='feedback.href']">
+ <xsl:value-of select="($page/config[@param='feedback.href'])[1]/@value"/>
+ </xsl:when>
+ <xsl:when test="$autolayout/autolayout/config[@param='feedback.href']">
+ <xsl:value-of select="($autolayout/autolayout/config[@param='feedback.href'])[1]/@value"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$feedback.href"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <div class="navfoot">
+ <xsl:if test="$footer.hr != 0"><hr/></xsl:if>
+ <table width="100%" border="0" summary="Footer navigation">
+ <tr>
+ <td width="33%" align="left">
+ <span class="footdate">
+ <xsl:call-template name="rcsdate.format">
+ <xsl:with-param name="rcsdate"
+ select="$page/config[@param='rcsdate']/@value"/>
+ </xsl:call-template>
+ </span>
+ </td>
+ <td width="34%" align="center">
+ <xsl:choose>
+ <xsl:when test="not($toc)">
+ <xsl:message>
+ <xsl:text>Cannot determine TOC for </xsl:text>
+ <xsl:value-of select="$page/@id"/>
+ </xsl:message>
+ </xsl:when>
+ <xsl:when test="$toc/@id = $page/@id">
+ <!-- nop; this is the home page -->
+ </xsl:when>
+ <xsl:otherwise>
+ <span class="foothome">
+ <a>
+ <xsl:attribute name="href">
+ <xsl:call-template name="homeuri"/>
+ </xsl:attribute>
+ <xsl:call-template name="gentext.nav.home"/>
+ </a>
+ <xsl:if test="$footers">
+ <xsl:text> | </xsl:text>
+ </xsl:if>
+ </span>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:apply-templates select="$footers" mode="footer.link.mode"/>
+ </td>
+ <td width="33%" align="right">
+ <xsl:choose>
+ <xsl:when test="$feedback != ''">
+ <span class="footfeed">
+ <a>
+ <xsl:choose>
+ <xsl:when test="$feedback.with.ids != 0">
+ <xsl:attribute name="href">
+ <xsl:value-of select="$feedback"/>
+ <xsl:value-of select="$page/@id"/>
+ </xsl:attribute>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:attribute name="href">
+ <xsl:value-of select="$feedback"/>
+ </xsl:attribute>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:value-of select="$feedback.link.text"/>
+ </a>
+ </span>
+ </xsl:when>
+ <xsl:otherwise>&#160;</xsl:otherwise>
+ </xsl:choose>
+ </td>
+ </tr>
+ <tr>
+ <td colspan="3" align="right">
+ <span class="footcopy">
+ <xsl:choose>
+ <xsl:when test="head/copyright">
+ <xsl:apply-templates select="head/copyright" mode="footer.mode"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates mode="footer.mode"
+ select="$autolayout/autolayout/copyright"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </span>
+ </td>
+ </tr>
+ <xsl:if test="$sequential.links != 0">
+ <tr>
+ <xsl:variable name="prev">
+ <xsl:call-template name="prev.page"/>
+ </xsl:variable>
+ <xsl:variable name="next">
+ <xsl:call-template name="next.page"/>
+ </xsl:variable>
+ <xsl:variable name="ptoc"
+ select="$autolayout/autolayout//*[$prev=@id]"/>
+ <xsl:variable name="ntoc"
+ select="$autolayout/autolayout//*[$next=@id]"/>
+
+ <td align="left" valign="top">
+ <xsl:choose>
+ <xsl:when test="$prev != ''">
+ <xsl:call-template name="link.to.page">
+ <xsl:with-param name="frompage" select="$tocentry"/>
+ <xsl:with-param name="page" select="$ptoc"/>
+ <xsl:with-param name="linktext" select="'Prev'"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>&#160;</xsl:otherwise>
+ </xsl:choose>
+ </td>
+ <td>&#160;</td>
+ <td align="right" valign="top">
+ <xsl:choose>
+ <xsl:when test="$next != ''">
+ <xsl:call-template name="link.to.page">
+ <xsl:with-param name="frompage" select="$tocentry"/>
+ <xsl:with-param name="page" select="$ntoc"/>
+ <xsl:with-param name="linktext" select="'Next'"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>&#160;</xsl:otherwise>
+ </xsl:choose>
+ </td>
+ </tr>
+ </xsl:if>
+ </table>
+ </div>
+</xsl:template>
+
+<xsl:template name="rcsdate.format">
+ <xsl:param name="rcsdate" select="./config[@param='rcsdate']/@value"/>
+ <xsl:value-of select="$rcsdate"/>
+</xsl:template>
+
+<xsl:template match="config" mode="footer.link.mode">
+ <span class="foothome">
+ <xsl:if test="position() &gt; 1">
+ <xsl:text> | </xsl:text>
+ </xsl:if>
+ <xsl:choose>
+ <xsl:when test="@param='footlink'">
+ <xsl:variable name="id" select="@value"/>
+ <xsl:variable name="tocentry"
+ select="$autolayout//*[@id=$id]"/>
+ <xsl:if test="count($tocentry) != 1">
+ <xsl:message>
+ <xsl:text>Footlink to </xsl:text>
+ <xsl:value-of select="$id"/>
+ <xsl:text> does not id a unique page.</xsl:text>
+ </xsl:message>
+ </xsl:if>
+ <xsl:variable name="dir">
+ <xsl:choose>
+ <xsl:when test="starts-with($tocentry/@dir, '/')">
+ <xsl:value-of select="substring($tocentry/@dir, 2)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$tocentry/@dir"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <a>
+ <xsl:attribute name="href">
+ <xsl:call-template name="root-rel-path"/>
+ <xsl:value-of select="$dir"/>
+ <xsl:value-of select="$filename-prefix"/>
+ <xsl:value-of select="$tocentry/@filename"/>
+ </xsl:attribute>
+ <xsl:value-of select="@altval"/>
+ </a>
+ </xsl:when>
+ <xsl:otherwise>
+ <a href="{@value}">
+ <xsl:value-of select="@altval"/>
+ </a>
+ </xsl:otherwise>
+ </xsl:choose>
+ </span>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template name="homeuri">
+ <xsl:param name="page" select="ancestor-or-self::webpage"/>
+ <xsl:variable name="id" select="$page/@id"/>
+ <xsl:variable name="tocentry"
+ select="$autolayout//*[@id=$id]"/>
+ <xsl:variable name="toc" select="$tocentry/ancestor::toc"/>
+ <xsl:variable name="first-toc"
+ select="$autolayout/autolayout/toc[1]"/>
+
+ <xsl:call-template name="root-rel-path"/>
+ <xsl:choose>
+ <xsl:when test="$toc">
+ <xsl:choose>
+ <xsl:when test="starts-with($toc/@dir, '/')">
+ <xsl:value-of select="substring($toc/@dir, 2)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$toc/@dir"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:value-of select="$filename-prefix"/>
+ <xsl:value-of select="$toc/@filename"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:choose>
+ <xsl:when test="starts-with($first-toc/@dir, '/')">
+ <xsl:value-of select="substring($first-toc/@dir, 2)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$first-toc/@dir"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:value-of select="$filename-prefix"/>
+ <xsl:value-of select="$first-toc/@filename"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="copyright" mode="footer.mode">
+ <span class="{name(.)}">
+ <xsl:call-template name="gentext.element.name"/>
+ <xsl:call-template name="gentext.space"/>
+ <xsl:call-template name="dingbat">
+ <xsl:with-param name="dingbat">copyright</xsl:with-param>
+ </xsl:call-template>
+ <xsl:call-template name="gentext.space"/>
+ <xsl:apply-templates select="year" mode="footer.mode"/>
+ <xsl:call-template name="gentext.space"/>
+ <xsl:apply-templates select="holder" mode="footer.mode"/>
+ <xsl:value-of select="$biblioentry.item.separator"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="year" mode="footer.mode">
+ <xsl:apply-templates/><xsl:text>, </xsl:text>
+</xsl:template>
+
+<xsl:template match="year[position()=last()]" mode="footer.mode">
+ <xsl:apply-templates/>
+</xsl:template>
+
+<xsl:template match="holder" mode="footer.mode">
+ <xsl:apply-templates/>
+ <xsl:if test="position() != last()">, </xsl:if>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="config">
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="head">
+</xsl:template>
+
+<xsl:template match="head/title" mode="title.mode">
+ <h1><xsl:apply-templates/></h1>
+</xsl:template>
+
+<xsl:template match="head/title">
+ <xsl:apply-templates/>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template name="directory-depth">
+ <xsl:param name="dir"></xsl:param>
+ <xsl:param name="count" select="0"/>
+
+ <xsl:choose>
+ <xsl:when test='contains($dir,"/")'>
+ <xsl:call-template name="directory-depth">
+ <xsl:with-param name="dir" select="substring-after($dir,'/')"/>
+ <xsl:with-param name="count" select="$count + 1"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:choose>
+ <xsl:when test='$dir=""'>
+ <xsl:value-of select="$count"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$count + 1"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="root-rel-path">
+ <xsl:param name="webpage" select="ancestor-or-self::webpage"/>
+ <xsl:variable name="tocentry" select="$autolayout//*[$webpage/@id=@id]"/>
+ <xsl:apply-templates select="$tocentry" mode="toc-rel-path"/>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="footnote" mode="footnote.number">
+ <xsl:choose>
+ <xsl:when test="ancestor::table|ancestor::informaltable">
+ <xsl:number level="any" from="table|informaltable" format="a"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:number level="any" from="webpage" format="1"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="process.footnotes">
+ <!-- we're only interested in footnotes that occur on this page, not
+ on descendants of this page (which will be similarly processed) -->
+ <xsl:variable name="thispage"
+ select="ancestor-or-self::webpage"/>
+ <xsl:variable name="footnotes"
+ select=".//footnote[ancestor-or-self::webpage=$thispage]"/>
+ <xsl:variable name="table.footnotes"
+ select=".//table//footnote[ancestor-or-self::webpage=$thispage]
+ |.//informaltable//footnote[ancestor-or-self::webpage
+ =$thispage]"/>
+
+ <!-- Only bother to do this if there's at least one non-table footnote -->
+ <xsl:if test="count($footnotes)>count($table.footnotes)">
+ <div class="footnotes">
+ <hr width="100" align="left"/>
+ <xsl:apply-templates select="$footnotes" mode="process.footnote.mode"/>
+ </div>
+ </xsl:if>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="@*" mode="copy">
+ <xsl:attribute name="{local-name(.)}">
+ <xsl:value-of select="."/>
+ </xsl:attribute>
+</xsl:template>
+
+<xsl:template match="html:*">
+ <xsl:element name="{local-name(.)}" namespace="">
+ <xsl:apply-templates select="@*" mode="copy"/>
+ <xsl:apply-templates/>
+ </xsl:element>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="processing-instruction('php')">
+ <xsl:processing-instruction name="php">
+ <xsl:value-of select="."/>
+ </xsl:processing-instruction>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="rddl:*" xmlns:rddl='http://www.rddl.org/'>
+ <xsl:element name="{name(.)}">
+ <xsl:apply-templates select="@*" mode="copy"/>
+ <xsl:apply-templates/>
+ </xsl:element>
+</xsl:template>
+
+<xsl:template match="section[@rddl]" xmlns:rddl='http://www.rddl.org/'>
+ <xsl:variable name="rddl" select="id(@rddl)"/>
+ <xsl:choose>
+ <xsl:when test="local-name($rddl) != 'resource'">
+ <xsl:message>
+ <xsl:text>Warning: section rddl isn't an rddl:resource: </xsl:text>
+ <xsl:value-of select="@rddl"/>
+ </xsl:message>
+ <xsl:apply-imports/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:element name="{name($rddl)}">
+ <xsl:apply-templates select="$rddl/@*" mode="copy"/>
+ <xsl:apply-imports/>
+ </xsl:element>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template name="page.uri">
+ <xsl:param name="href" select="''"/>
+ <xsl:param name="page" select="ancestor-or-self::tocentry"/>
+ <xsl:param name="relpath">
+ <xsl:call-template name="toc-rel-path">
+ <xsl:with-param name="pageid" select="$page/@id"/>
+ </xsl:call-template>
+ </xsl:param>
+
+<!--
+ <xsl:message><xsl:value-of select="$page/@id"/>: <xsl:value-of select="$relpath"/></xsl:message>
+-->
+
+ <xsl:variable name="dir">
+ <xsl:choose>
+ <xsl:when test="starts-with($page/@dir, '/')">
+ <xsl:value-of select="substring($page/@dir, 2)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$page/@dir"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="html.href">
+ <xsl:choose>
+ <xsl:when test="$href != ''">
+ <xsl:value-of select="$href"/>
+ </xsl:when>
+ <xsl:when test="$page/@href">
+ <xsl:value-of select="$page/@href"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="concat($relpath,$dir,$filename-prefix)"/>
+ <xsl:value-of select="$page/@filename"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:value-of select="$html.href"/>
+</xsl:template>
+
+<xsl:template name="link.to.page">
+ <xsl:param name="href" select="''"/>
+ <xsl:param name="frompage"/>
+ <xsl:param name="page" select="ancestor-or-self::tocentry"/>
+ <xsl:param name="relpath">
+ <xsl:choose>
+ <xsl:when test="$frompage">
+ <xsl:call-template name="toc-rel-path">
+ <xsl:with-param name="pageid" select="$frompage/@id"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="toc-rel-path">
+ <xsl:with-param name="pageid" select="$page/@id"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:param>
+ <xsl:param name="linktext" select="'???'"/>
+
+ <a>
+ <xsl:attribute name="href">
+ <xsl:call-template name="page.uri">
+ <xsl:with-param name="href" select="$href"/>
+ <xsl:with-param name="page" select="$page"/>
+ <xsl:with-param name="relpath" select="$relpath"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:if test="summary">
+ <xsl:attribute name="title">
+ <xsl:value-of select="normalize-space(string(summary))"/>
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:copy-of select="$linktext"/>
+ </a>
+</xsl:template>
+
+<xsl:template name="next.page">
+ <xsl:param name="page" select="ancestor-or-self::webpage"/>
+ <xsl:variable name="id" select="$page/@id"/>
+ <xsl:variable name="tocentry"
+ select="$autolayout//*[@id=$id]"/>
+ <xsl:variable name="next-following"
+ select="$tocentry/following::tocentry[1]"/>
+ <xsl:variable name="next-child"
+ select="$tocentry/descendant::tocentry[1]"/>
+
+ <xsl:variable name="nextid">
+ <xsl:choose>
+ <xsl:when test="$next-child">
+ <xsl:value-of select="$next-child/@id"/>
+ </xsl:when>
+ <xsl:when test="$next-following">
+ <xsl:value-of select="$next-following/@id"/>
+ </xsl:when>
+ <xsl:otherwise></xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:value-of select="$nextid"/>
+</xsl:template>
+
+<xsl:template name="prev.page">
+ <xsl:param name="page" select="ancestor-or-self::webpage"/>
+ <xsl:variable name="id" select="$page/@id"/>
+ <xsl:variable name="tocentry"
+ select="$autolayout//*[@id=$id]"/>
+ <xsl:variable name="prev-ancestor"
+ select="($tocentry/ancestor::tocentry
+ |$tocentry/ancestor::toc)[last()]"/>
+ <xsl:variable name="prev-sibling"
+ select="$tocentry/preceding-sibling::tocentry[1]"/>
+
+ <xsl:variable name="previd">
+ <xsl:choose>
+ <xsl:when test="$prev-sibling">
+ <xsl:value-of select="$prev-sibling/@id"/>
+ </xsl:when>
+ <xsl:when test="$prev-ancestor">
+ <xsl:value-of select="$prev-ancestor/@id"/>
+ </xsl:when>
+ <xsl:otherwise></xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:value-of select="$previd"/>
+</xsl:template>
+
+<xsl:template name="top.page">
+ <xsl:param name="page" select="ancestor-or-self::webpage"/>
+ <xsl:variable name="id" select="$page/@id"/>
+ <xsl:variable name="tocentry"
+ select="$autolayout//*[@id=$id]"/>
+
+ <xsl:value-of select="$tocentry/ancestor::toc/@id"/>
+</xsl:template>
+
+<xsl:template name="up.page">
+ <xsl:param name="page" select="ancestor-or-self::webpage"/>
+ <xsl:variable name="id" select="$page/@id"/>
+ <xsl:variable name="tocentry"
+ select="$autolayout//*[@id=$id]"/>
+
+ <xsl:choose>
+ <xsl:when test="$tocentry/ancestor::tocentry">
+ <xsl:value-of select="$tocentry/ancestor::tocentry[1]/@id"/>
+ </xsl:when>
+ <xsl:when test="$tocentry/ancestor::toc">
+ <xsl:value-of select="$tocentry/ancestor::toc[1]/@id"/>
+ </xsl:when>
+ <xsl:otherwise></xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="first.page">
+ <xsl:param name="page" select="ancestor-or-self::webpage"/>
+ <xsl:variable name="id" select="$page/@id"/>
+ <xsl:variable name="tocentry"
+ select="$autolayout//*[@id=$id]"/>
+
+ <xsl:value-of select="$tocentry/preceding-sibling::tocentry[last()]/@id"/>
+</xsl:template>
+
+<xsl:template name="last.page">
+ <xsl:param name="page" select="ancestor-or-self::webpage"/>
+ <xsl:variable name="id" select="$page/@id"/>
+ <xsl:variable name="tocentry"
+ select="$autolayout//*[@id=$id]"/>
+
+ <xsl:variable name="prev-sibling"
+ select="$tocentry/preceding-sibling::tocentry[1]"/>
+
+ <xsl:value-of select="$tocentry/following-sibling::tocentry[last()]/@id"/>
+</xsl:template>
+
+<xsl:template match="autolayout" mode="collect.targets">
+ <targetset>
+ <xsl:apply-templates mode="olink.mode"/>
+ </targetset>
+</xsl:template>
+
+<xsl:template match="toc|tocentry|notoc" mode="olink.mode">
+ <xsl:text>&#10;</xsl:text>
+ <xsl:call-template name="tocentry"/>
+ <xsl:apply-templates select="tocentry" mode="olink.mode"/>
+</xsl:template>
+
+
+<xsl:template name="tocentry">
+ <xsl:choose>
+ <xsl:when test="@href">
+ <!-- no op -->
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:if test="not(@page)">
+ <xsl:message terminate="yes">
+ <xsl:text>All toc entries must have a page attribute.</xsl:text>
+ </xsl:message>
+ </xsl:if>
+
+ <xsl:variable name="page" select="document(@page,.)"/>
+
+ <xsl:if test="not($page/*[1]/@id)">
+ <xsl:message terminate="yes">
+ <xsl:value-of select="@page"/>
+ <xsl:text>: missing ID.</xsl:text>
+ </xsl:message>
+ </xsl:if>
+
+ <xsl:variable name="id" select="$page/*[1]/@id"/>
+
+ <xsl:variable name="filename">
+ <xsl:choose>
+ <xsl:when test="@filename">
+ <xsl:value-of select="$filename-prefix"/>
+ <xsl:value-of select="@filename"/>
+ </xsl:when>
+ <xsl:when test="/layout/config[@param='default-filename']">
+ <xsl:value-of select="$filename-prefix"/>
+ <xsl:value-of select="(/layout/config[@param='default-filename'])[1]/@value"/>
+ </xsl:when>
+ <xsl:otherwise><xsl:value-of select="$filename-prefix"/>index.html</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="dir" select="@dir"/>
+
+ <xsl:if test="$filename = ''">
+ <xsl:message terminate="yes">
+ <xsl:value-of select="@page"/>
+ <xsl:text>: missing filename.</xsl:text>
+ </xsl:message>
+ </xsl:if>
+
+ <!--
+ <xsl:message>
+ <xsl:value-of select="@page"/>
+ <xsl:text>: </xsl:text>
+ <xsl:if test="$dir != ''">
+ <xsl:value-of select="$dir"/>
+ </xsl:if>
+ <xsl:value-of select="$filename"/>
+ </xsl:message>
+ -->
+
+ <document>
+ <xsl:attribute name="targetdoc">
+ <xsl:value-of select="$id"/>
+ </xsl:attribute>
+ <xsl:attribute name="baseuri">
+ <xsl:value-of select="$filename"/>
+ </xsl:attribute>
+ <xsl:if test="$dir != ''">
+ <xsl:attribute name="dir">
+ <xsl:value-of select="$dir"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:apply-templates select="$page" mode="olink.mode"/>
+ </document>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="webpage" mode="olink.mode">
+ <xsl:call-template name="div"/>
+</xsl:template>
+
+<xsl:template match="webpage" mode="xref-to" >
+ <xsl:param name="referrer"/>
+ <xsl:param name="xrefstyle"/>
+
+ <xsl:apply-templates select="." mode="object.xref.markup">
+ <xsl:with-param name="purpose" select="'xref'"/>
+ <xsl:with-param name="xrefstyle" select="$xrefstyle"/>
+ <xsl:with-param name="referrer" select="$referrer"/>
+ </xsl:apply-templates>
+ <!-- FIXME: What about "in Chapter X"? -->
+</xsl:template>
+
+<xsl:template match="webpage" mode="title.markup">
+ <xsl:param name="allow-anchors" select="0"/>
+ <xsl:apply-templates select="head/title"
+ mode="title.markup">
+ <xsl:with-param name="allow-anchors" select="$allow-anchors"/>
+ </xsl:apply-templates>
+</xsl:template>
+
+<xsl:param name="local.l10n.xml" select="document('')" />
+<l:i18n xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0">
+ <l:l10n language="en">
+ <l:context name="title">
+ <l:template name="webpage" text="%t"/>
+ </l:context>
+ <l:context name="xref">
+ <l:template name="webpage" text="%t"/>
+ </l:context>
+ </l:l10n>
+ <l:l10n language="de">
+ <l:context name="title">
+ <l:template name="webpage" text="%t"/>
+ </l:context>
+ <l:context name="xref">
+ <l:template name="webpage" text="%t"/>
+ </l:context>
+ </l:l10n>
+ <l:l10n language="fr">
+ <l:context name="title">
+ <l:template name="webpage" text="%t"/>
+ </l:context>
+ <l:context name="xref">
+ <l:template name="webpage" text="%t"/>
+ </l:context>
+ </l:l10n>
+ <l:l10n language="es">
+ <l:context name="title">
+ <l:template name="webpage" text="%t"/>
+ </l:context>
+ <l:context name="xref">
+ <l:template name="webpage" text="%t"/>
+ </l:context>
+ </l:l10n>
+</l:i18n>
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/website/website-targets.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/website/website-targets.xsl
new file mode 100644
index 0000000..2cd0b25
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/website/website-targets.xsl
@@ -0,0 +1,27 @@
+<?xml version="1.0"?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="1.0">
+
+<xsl:import href="tabular.xsl"/>
+
+<xsl:output method="xml"
+ indent="no"
+ encoding="utf-8"
+ doctype-public="-//Norman Walsh//DTD DocBook OLink Summary V2.0//EN"
+ doctype-system="http://docbook.sourceforge.net/release/xsl/current/common/targetdatabase.dtd"/>
+
+
+<!-- Used only when processing autolayout.xml -->
+<xsl:template match="/">
+ <xsl:apply-templates mode="collect.targets"/>
+</xsl:template>
+
+<xsl:template match="*"/>
+
+<xsl:template match="autolayout" mode="collect.targets">
+ <targetset>
+ <xsl:apply-templates mode="olink.mode"/>
+ </targetset>
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/website/website.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/website/website.xsl
new file mode 100644
index 0000000..7364d9b
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/website/website.xsl
@@ -0,0 +1,132 @@
+<?xml version='1.0'?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:html='http://www.w3.org/1999/xhtml'
+ xmlns:doc="http://nwalsh.com/xsl/documentation/1.0"
+ exclude-result-prefixes="doc html"
+ version='1.0'>
+
+<!-- ********************************************************************
+ $Id: website.xsl 6910 2007-06-28 23:23:30Z xmldoc $
+ ********************************************************************
+
+ This file is part of the WebSite distribution.
+ See ../README or http://nwalsh.com/website/ for copyright
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<!-- ==================================================================== -->
+
+<xsl:include href="website-common.xsl"/>
+<xsl:include href="toc.xsl"/>
+
+<xsl:output method="html"
+ indent="no"/>
+
+<xsl:param name="autolayout" select="document($autolayout-file,/*[1])"/>
+
+<xsl:attribute-set name="body.attributes"/>
+
+<xsl:template name="body.attributes">
+ <!-- Turn off the template from the stock DocBook XSL -->
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="webpage">
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+
+ <xsl:variable name="tocentry" select="$autolayout/autolayout//*[$id=@id]"/>
+ <xsl:variable name="toc" select="$tocentry/ancestor-or-self::toc"/>
+
+ <html>
+ <xsl:apply-templates select="head" mode="head.mode"/>
+ <xsl:apply-templates select="config" mode="head.mode"/>
+ <body class="website">
+ <xsl:call-template name="body.attributes"/>
+
+ <div class="{name(.)}">
+ <a name="{$id}"/>
+
+ <xsl:if test="$banner.before.navigation != 0">
+ <xsl:call-template name="allpages.banner"/>
+ </xsl:if>
+
+ <xsl:if test="$toc">
+ <div class="navhead">
+ <xsl:apply-templates select="$toc">
+ <xsl:with-param name="pageid" select="@id"/>
+ </xsl:apply-templates>
+ <xsl:if test="$header.hr != 0"><hr/></xsl:if>
+ </div>
+ </xsl:if>
+
+ <xsl:if test="$banner.before.navigation = 0">
+ <xsl:call-template name="allpages.banner"/>
+ </xsl:if>
+
+ <xsl:apply-templates select="./head/title" mode="title.mode"/>
+
+ <xsl:apply-templates select="child::node()[not(self::webpage)]"/>
+
+ <xsl:call-template name="process.footnotes"/>
+
+ <xsl:call-template name="webpage.footer"/>
+ </div>
+ </body>
+ </html>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="webtoc">
+ <xsl:variable name="webpage" select="ancestor::webpage"/>
+ <xsl:variable name="relpath">
+ <xsl:call-template name="root-rel-path">
+ <xsl:with-param name="webpage" select="$webpage"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:variable name="pageid" select="$webpage/@id"/>
+
+ <xsl:variable name="pages"
+ select="$autolayout//*[$pageid=@id]/tocentry"/>
+
+ <xsl:if test="count($pages) > 0">
+ <ul class="toc">
+ <xsl:for-each select="$pages">
+ <li>
+ <a>
+ <xsl:attribute name="href">
+ <xsl:choose>
+ <xsl:when test="@href">
+ <xsl:value-of select="@href"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$relpath"/>
+ <xsl:value-of select="@dir"/>
+ <xsl:value-of select="$filename-prefix"/>
+ <xsl:value-of select="@filename"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:attribute>
+ <xsl:apply-templates select="title"/>
+ </a>
+ <xsl:if test="summary">
+ <xsl:text>--</xsl:text>
+ <xsl:apply-templates select="summary"/>
+ </xsl:if>
+ </li>
+ </xsl:for-each>
+ </ul>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="toc/summary|tocentry/summary|notoc/summary">
+ <xsl:apply-templates/>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/website/xbel.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/website/xbel.xsl
new file mode 100644
index 0000000..ec9873c
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/website/xbel.xsl
@@ -0,0 +1,114 @@
+<?xml version='1.0'?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version='1.0'>
+
+<!-- ********************************************************************
+ $Id: xbel.xsl 6910 2007-06-28 23:23:30Z xmldoc $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<!-- ==================================================================== -->
+
+<xsl:output method="xml"/>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="xbel">
+ <ul>
+ <xsl:apply-templates/>
+ </ul>
+</xsl:template>
+
+<!-- Only partial support for xbel elements -->
+<xsl:template match="xbel/info|xbel/title|xbel/desc|
+ xbel/alias|xbel/separator">
+ <!-- No op -->
+</xsl:template>
+
+<xsl:template match="folder">
+ <li>
+ <xsl:apply-templates select="title"/>
+ <ul>
+ <xsl:apply-templates select="folder|bookmark"/>
+ </ul>
+ </li>
+</xsl:template>
+
+<xsl:template match="folder/title">
+ <b><xsl:apply-templates/></b>
+</xsl:template>
+
+<xsl:template match="bookmark">
+ <li>
+ <a href="{@href}" target="_top">
+ <xsl:apply-templates select="title"/>
+ </a>
+ </li>
+</xsl:template>
+
+<xsl:template match="bookmark/title">
+ <xsl:apply-templates/>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="xbel" mode="dynamic">
+ <ul>
+ <xsl:apply-templates mode="dynamic"/>
+ </ul>
+</xsl:template>
+
+<xsl:template match="info" mode="dynamic">
+</xsl:template>
+
+<xsl:template match="folder" mode="dynamic">
+ <li>
+ <xsl:apply-templates select="title" mode="dynamic"/>
+ <ul style="display:none" id="{@id}">
+ <xsl:apply-templates select="folder|bookmark" mode="dynamic"/>
+ </ul>
+ </li>
+</xsl:template>
+
+<xsl:template match="folder/title" mode="dynamic">
+ <b>
+ <span>
+ <xsl:choose>
+ <xsl:when test="../@id">
+ <xsl:attribute name="onClick">
+ <xsl:text>toggleList('</xsl:text>
+ <xsl:value-of select="../@id"/>
+ <xsl:text>')</xsl:text>
+ </xsl:attribute>
+ <xsl:attribute name="class">exlist</xsl:attribute>
+ <xsl:attribute name="style">color: blue</xsl:attribute>
+ <xsl:apply-templates mode="dynamic"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates mode="dynamic"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </span>
+ </b>
+</xsl:template>
+
+<xsl:template match="bookmark" mode="dynamic">
+ <li>
+ <a href="{@href}" target="_top">
+ <xsl:apply-templates select="title" mode="dynamic"/>
+ </a>
+ </li>
+</xsl:template>
+
+<xsl:template match="bookmark/title" mode="dynamic">
+ <xsl:apply-templates mode="dynamic"/>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/admon.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/admon.xsl
new file mode 100644
index 0000000..f96ebaf
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/admon.xsl
@@ -0,0 +1,133 @@
+<?xml version="1.0" encoding="ASCII"?>
+<!--This file was created automatically by html2xhtml-->
+<!--from the HTML stylesheets.-->
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1999/xhtml" version="1.0">
+
+<!-- ********************************************************************
+ $Id: admon.xsl 8421 2009-05-04 07:49:49Z bobstayton $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<xsl:template match="*" mode="admon.graphic.width">
+ <xsl:param name="node" select="."/>
+ <xsl:text>25</xsl:text>
+</xsl:template>
+
+<xsl:template match="note|important|warning|caution|tip">
+ <xsl:choose>
+ <xsl:when test="$admon.graphics != 0">
+ <xsl:call-template name="graphical.admonition"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="nongraphical.admonition"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="admon.graphic">
+ <xsl:param name="node" select="."/>
+ <xsl:value-of select="$admon.graphics.path"/>
+ <xsl:choose>
+ <xsl:when test="local-name($node)='note'">note</xsl:when>
+ <xsl:when test="local-name($node)='warning'">warning</xsl:when>
+ <xsl:when test="local-name($node)='caution'">caution</xsl:when>
+ <xsl:when test="local-name($node)='tip'">tip</xsl:when>
+ <xsl:when test="local-name($node)='important'">important</xsl:when>
+ <xsl:otherwise>note</xsl:otherwise>
+ </xsl:choose>
+ <xsl:value-of select="$admon.graphics.extension"/>
+</xsl:template>
+
+<xsl:template name="graphical.admonition">
+ <xsl:variable name="admon.type">
+ <xsl:choose>
+ <xsl:when test="local-name(.)='note'">Note</xsl:when>
+ <xsl:when test="local-name(.)='warning'">Warning</xsl:when>
+ <xsl:when test="local-name(.)='caution'">Caution</xsl:when>
+ <xsl:when test="local-name(.)='tip'">Tip</xsl:when>
+ <xsl:when test="local-name(.)='important'">Important</xsl:when>
+ <xsl:otherwise>Note</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="alt">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="$admon.type"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <div>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:if test="$admon.style != ''">
+ <xsl:attribute name="style">
+ <xsl:value-of select="$admon.style"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <table border="0">
+ <xsl:attribute name="summary">
+ <xsl:value-of select="$admon.type"/>
+ <xsl:if test="title|info/title">
+ <xsl:text>: </xsl:text>
+ <xsl:value-of select="(title|info/title)[1]"/>
+ </xsl:if>
+ </xsl:attribute>
+ <tr>
+ <td rowspan="2" align="center" valign="top">
+
+ <img alt="[{$alt}]">
+ <xsl:attribute name="src">
+ <xsl:call-template name="admon.graphic"/>
+ </xsl:attribute>
+ </img>
+ </td>
+ <th align="{$direction.align.start}">
+ <xsl:call-template name="anchor"/>
+ <xsl:if test="$admon.textlabel != 0 or title or info/title">
+ <xsl:apply-templates select="." mode="object.title.markup"/>
+ </xsl:if>
+ </th>
+ </tr>
+ <tr>
+ <td align="{$direction.align.start}" valign="top">
+ <xsl:apply-templates/>
+ </td>
+ </tr>
+ </table>
+ </div>
+</xsl:template>
+
+<xsl:template name="nongraphical.admonition">
+ <div>
+ <xsl:call-template name="common.html.attributes">
+ <xsl:with-param name="inherit" select="1"/>
+ </xsl:call-template>
+ <xsl:if test="$admon.style">
+ <xsl:attribute name="style">
+ <xsl:value-of select="$admon.style"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:if test="$admon.textlabel != 0 or title or info/title">
+ <h3 class="title">
+ <xsl:call-template name="anchor"/>
+ <xsl:apply-templates select="." mode="object.title.markup"/>
+ </h3>
+ </xsl:if>
+
+ <xsl:apply-templates/>
+ </div>
+</xsl:template>
+
+<xsl:template match="note/title"/>
+<xsl:template match="important/title"/>
+<xsl:template match="warning/title"/>
+<xsl:template match="caution/title"/>
+<xsl:template match="tip/title"/>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/annotations.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/annotations.xsl
new file mode 100644
index 0000000..00f2cca
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/annotations.xsl
@@ -0,0 +1,158 @@
+<?xml version="1.0" encoding="ASCII"?>
+<!--This file was created automatically by html2xhtml-->
+<!--from the HTML stylesheets.-->
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1999/xhtml" version="1.0">
+
+<xsl:template name="add.annotation.links">
+ <xsl:param name="scripts" select="normalize-space($annotation.js)"/>
+ <xsl:choose>
+ <xsl:when test="contains($scripts, ' ')">
+ <script type="text/javascript" src="{substring-before($scripts, ' ')}"/>
+ <xsl:call-template name="add.annotation.links">
+ <xsl:with-param name="scripts" select="substring-after($scripts, ' ')"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <script type="text/javascript" src="{$scripts}"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="annotation"/>
+
+<xsl:template name="apply-annotations">
+ <xsl:if test="$annotation.support != 0">
+ <!-- do any annotations apply to the context node? -->
+ <xsl:variable name="id" select="(@id|@xml:id)[1]"/>
+
+ <xsl:variable name="aids">
+ <xsl:for-each select="//annotation">
+ <xsl:if test="@annotates=$id or starts-with(@annotates, concat($id, ' ')) or contains(@annotates, concat(' ', $id, ' ')) or substring(@annotates, string-length(@annotates)-3) = concat(' ', $id)">
+ <xsl:value-of select="generate-id()"/>
+ <xsl:text> </xsl:text>
+ </xsl:if>
+ </xsl:for-each>
+ <xsl:if test="normalize-space(@annotations) != ''">
+ <xsl:call-template name="annotations-pointed-to">
+ <xsl:with-param name="annotations" select="normalize-space(@annotations)"/>
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:variable>
+
+ <xsl:if test="$aids != ''">
+ <xsl:call-template name="apply-annotations-by-gid">
+ <xsl:with-param name="gids" select="normalize-space($aids)"/>
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template name="annotations-pointed-to">
+ <xsl:param name="annotations"/>
+ <xsl:choose>
+ <xsl:when test="contains($annotations, ' ')">
+ <xsl:variable name="a" select="key('id', substring-before($annotations, ' '))"/>
+ <xsl:if test="$a">
+ <xsl:value-of select="generate-id($a)"/>
+ <xsl:text> </xsl:text>
+ </xsl:if>
+ <xsl:call-template name="annotations-pointed-to">
+ <xsl:with-param name="annotations" select="substring-after($annotations, ' ')"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:variable name="a" select="key('id', $annotations)"/>
+ <xsl:if test="$a">
+ <xsl:value-of select="generate-id($a)"/>
+ <xsl:text> </xsl:text>
+ </xsl:if>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="apply-annotations-by-gid">
+ <xsl:param name="gids"/>
+
+ <xsl:choose>
+ <xsl:when test="contains($gids, ' ')">
+ <xsl:variable name="gid" select="substring-before($gids, ' ')"/>
+ <xsl:apply-templates select="key('gid', $gid)" mode="annotation-inline"/>
+ <xsl:call-template name="apply-annotations-by-gid">
+ <xsl:with-param name="gids" select="substring-after($gids, ' ')"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="key('gid', $gids)" mode="annotation-inline"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="annotation" mode="annotation-inline">
+ <xsl:variable name="title">
+ <xsl:choose>
+ <xsl:when test="title">
+ <xsl:value-of select="title"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text>[Annotation #</xsl:text>
+ <xsl:number count="annotation" level="any" format="1"/>
+ <xsl:text>]</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <a id="anch-{generate-id(.)}" href="#annot-{generate-id(.)}" title="{$title}">
+ <xsl:apply-templates select="." mode="class.attribute"/>
+ <xsl:attribute name="onClick">
+ <xsl:text>popup_</xsl:text>
+ <xsl:value-of select="generate-id(.)"/>
+ <xsl:text>.showPopup('anch-</xsl:text>
+ <xsl:value-of select="generate-id(.)"/>
+ <xsl:text>'); return false;</xsl:text>
+ </xsl:attribute>
+ <img src="{$annotation.graphic.open}" alt="{$title}"/>
+ </a>
+</xsl:template>
+
+<xsl:template match="annotation" mode="annotation-popup">
+ <div class="annotation-nocss">
+ <p>
+ <a id="annot-{generate-id(.)}"/>
+ <xsl:text>Annotation #</xsl:text>
+ <xsl:number count="annotation" level="any" format="1"/>
+ <xsl:text>:</xsl:text>
+ </p>
+ </div>
+
+ <div id="popup-{generate-id(.)}" class="annotation-popup">
+ <xsl:if test="string-length(.) &gt; 300">
+ <xsl:attribute name="style">width:400px</xsl:attribute>
+ </xsl:if>
+
+ <xsl:call-template name="annotation-title"/>
+ <div class="annotation-body">
+ <xsl:apply-templates select="*[local-name(.) != 'title']"/>
+ </div>
+ <div class="annotation-close">
+ <a href="#" onclick="popup_{generate-id(.)}.hidePopup();return false;">
+ <xsl:apply-templates select="." mode="class.attribute"/>
+ <img src="{$annotation.graphic.close}" alt="X"/>
+ </a>
+ </div>
+ </div>
+</xsl:template>
+
+<xsl:template name="annotation-title">
+ <div class="annotation-title">
+ <xsl:choose>
+ <xsl:when test="title">
+ <xsl:apply-templates select="title/node()"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text>Annotation</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ </div>
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/autoidx-kimber.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/autoidx-kimber.xsl
new file mode 100644
index 0000000..cfaa447
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/autoidx-kimber.xsl
@@ -0,0 +1,139 @@
+<?xml version="1.0" encoding="ASCII"?>
+<!--This file was created automatically by html2xhtml-->
+<!--from the HTML stylesheets.-->
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:k="http://www.isogen.com/functions/com.isogen.saxoni18n.Saxoni18nService" xmlns="http://www.w3.org/1999/xhtml" exclude-result-prefixes="k" version="1.0">
+
+<!-- ********************************************************************
+ $Id: autoidx-kimber.xsl 8729 2010-07-15 16:43:56Z bobstayton $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<!-- ==================================================================== -->
+<!-- The "kimber" method contributed by Eliot Kimber of Innodata Isogen. -->
+<!-- ==================================================================== -->
+<!-- *** THIS MODULE ONLY WORKS WITH SAXON 6 OR SAXON 8 *** -->
+<!-- ==================================================================== -->
+
+
+<xsl:include href="../common/autoidx-kimber.xsl"/>
+
+<!-- Java sort apparently works only on lang part, not country -->
+<xsl:param name="sort.lang">
+ <xsl:choose>
+ <xsl:when test="contains(concat(/*/@lang, /*/@xml:lang), '-')">
+ <xsl:value-of select="substring-before(concat(/*/@lang, /*/@xml:lang), '-')"/>
+ </xsl:when>
+ <xsl:when test="contains(concat(/*/@lang, /*/@xml:lang), '_')">
+ <xsl:value-of select="substring-before(concat(/*/@lang, /*/@xml:lang), '_')"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="concat(/*/@lang, /*/@xml:lang)"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:param>
+
+<xsl:template name="generate-kimber-index">
+ <xsl:param name="scope" select="NOTANODE"/>
+
+ <xsl:variable name="vendor" select="system-property('xsl:vendor')"/>
+ <xsl:if test="not(contains($vendor, 'SAXON '))">
+ <xsl:message terminate="yes">
+ <xsl:text>ERROR: the 'kimber' index method requires the </xsl:text>
+ <xsl:text>Saxon version 6 or 8 XSLT processor.</xsl:text>
+ </xsl:message>
+ </xsl:if>
+
+ <xsl:if test="not(function-available('k:getIndexGroupKey'))">
+ <xsl:message terminate="yes">
+ <xsl:text>ERROR: the 'kimber' index method requires the </xsl:text>
+ <xsl:text>Innodata Isogen
+Java extensions for </xsl:text>
+ <xsl:text>internationalized indexes.
+Install those </xsl:text>
+ <xsl:text>extensions, or use a different index method.
+</xsl:text>
+ <xsl:text>For more information, see:
+</xsl:text>
+ <xsl:text>http://www.innodata-isogen.com/knowledge_center/tools_downloads/i18nsupport</xsl:text>
+ </xsl:message>
+ </xsl:if>
+
+ <xsl:variable name="role">
+ <xsl:if test="$index.on.role != 0">
+ <xsl:value-of select="@role"/>
+ </xsl:if>
+ </xsl:variable>
+
+ <xsl:variable name="type">
+ <xsl:if test="$index.on.type != 0">
+ <xsl:value-of select="@type"/>
+ </xsl:if>
+ </xsl:variable>
+
+ <xsl:variable name="terms" select="//indexterm[count(.|key('k-group', k:getIndexGroupKey(concat(/*/@lang, /*/@xml:lang), normalize-space(concat(primary/@sortas, &quot; &quot;, primary))))[count(ancestor::node()|$scope) = count(ancestor::node()) and ($role = @role or $type = @type or (string-length($role) = 0 and string-length($type) = 0))][1]) = 1 and not(@class = 'endofrange')]"/>
+
+ <xsl:variable name="alphabetical" select="$terms[not(starts-with( k:getIndexGroupKey(concat(/*/@lang, /*/@xml:lang), normalize-space(concat(primary/@sortas, &quot; &quot;, primary))), '#NUMERIC' ))]"/>
+
+ <xsl:variable name="others" select="$terms[starts-with( k:getIndexGroupKey(concat(/*/@lang, /*/@xml:lang), normalize-space(concat(primary/@sortas, &quot; &quot;, primary))), '#NUMERIC' )]"/>
+
+ <div class="index">
+ <xsl:if test="$others">
+ <div class="indexdev">
+ <h3>
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'index symbols'"/>
+ </xsl:call-template>
+ </h3>
+ <dl>
+ <xsl:apply-templates select="$others" mode="index-symbol-div">
+ <xsl:with-param name="scope" select="$scope"/>
+ <xsl:with-param name="role" select="$role"/>
+ <xsl:with-param name="type" select="$type"/>
+ <xsl:sort lang="{$sort.lang}" select="k:getIndexGroupSortKey(concat(/*/@lang, /*/@xml:lang), k:getIndexGroupKey(concat(/*/@lang, /*/@xml:lang), normalize-space(concat(primary/@sortas, &quot; &quot;, primary))))"/>
+ </xsl:apply-templates>
+ </dl>
+ </div>
+ </xsl:if>
+
+ <xsl:apply-templates select="$alphabetical" mode="index-div-kimber">
+ <xsl:with-param name="scope" select="$scope"/>
+ <xsl:with-param name="role" select="$role"/>
+ <xsl:with-param name="type" select="$type"/>
+ <xsl:sort lang="{$sort.lang}" select="k:getIndexGroupSortKey(concat(/*/@lang, /*/@xml:lang), k:getIndexGroupKey(concat(/*/@lang, /*/@xml:lang), normalize-space(concat(primary/@sortas, &quot; &quot;, primary))))"/>
+ </xsl:apply-templates>
+ </div>
+
+</xsl:template>
+
+<xsl:template match="indexterm" mode="index-div-kimber">
+ <xsl:param name="scope" select="."/>
+ <xsl:param name="role" select="''"/>
+ <xsl:param name="type" select="''"/>
+
+ <xsl:variable name="key" select="k:getIndexGroupKey(concat(/*/@lang, /*/@xml:lang), normalize-space(concat(primary/@sortas, &quot; &quot;, primary)))"/>
+
+ <xsl:variable name="label" select="k:getIndexGroupLabel(concat(/*/@lang, /*/@xml:lang), $key)"/>
+
+ <xsl:if test="key('k-group', $label)[count(ancestor::node()|$scope) = count(ancestor::node()) and ($role = @role or $type = @type or (string-length($role) = 0 and string-length($type) = 0))][count(.|key('primary', normalize-space(concat(primary/@sortas, &quot; &quot;, primary)))[count(ancestor::node()|$scope) = count(ancestor::node()) and ($role = @role or $type = @type or (string-length($role) = 0 and string-length($type) = 0))][1]) = 1]">
+ <div class="indexdiv">
+ <h3>
+ <xsl:value-of select="$label"/>
+ </h3>
+ <dl>
+ <xsl:apply-templates select="key('k-group', $key)[count(ancestor::node()|$scope) = count(ancestor::node()) and ($role = @role or $type = @type or (string-length($role) = 0 and string-length($type) = 0))] [count(.|key('primary', normalize-space(concat(primary/@sortas, &quot; &quot;, primary)))[count(ancestor::node()|$scope) = count(ancestor::node()) and ($role = @role or $type = @type or (string-length($role) = 0 and string-length($type) = 0))] [1])=1]" mode="index-primary">
+ <xsl:sort select="normalize-space(concat(primary/@sortas, &quot; &quot;, primary))" lang="{$sort.lang}"/>
+ <xsl:with-param name="scope" select="$scope"/>
+ <xsl:with-param name="role" select="$role"/>
+ <xsl:with-param name="type" select="$type"/>
+ </xsl:apply-templates>
+ </dl>
+ </div>
+ </xsl:if>
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/autoidx-kosek.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/autoidx-kosek.xsl
new file mode 100644
index 0000000..de6eef5
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/autoidx-kosek.xsl
@@ -0,0 +1,109 @@
+<?xml version="1.0" encoding="ASCII"?>
+<!--This file was created automatically by html2xhtml-->
+<!--from the HTML stylesheets.-->
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:i="urn:cz-kosek:functions:index" xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0" xmlns:func="http://exslt.org/functions" xmlns:k="http://www.isogen.com/functions/com.isogen.saxoni18n.Saxoni18nService" xmlns:exslt="http://exslt.org/common" xmlns="http://www.w3.org/1999/xhtml" extension-element-prefixes="func exslt" exclude-result-prefixes="func exslt i l k" version="1.0">
+
+<!-- ********************************************************************
+ $Id: autoidx-kosek.xsl 8725 2010-07-15 08:08:04Z kosek $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<!-- ==================================================================== -->
+<!-- The "kosek" method contributed by Jirka Kosek. -->
+
+<xsl:include href="../common/autoidx-kosek.xsl"/>
+
+<xsl:template name="generate-kosek-index">
+ <xsl:param name="scope" select="(ancestor::book|/)[last()]"/>
+
+ <xsl:variable name="vendor" select="system-property('xsl:vendor')"/>
+ <xsl:if test="contains($vendor, 'libxslt')">
+ <xsl:message terminate="yes">
+ <xsl:text>ERROR: the 'kosek' index method does not </xsl:text>
+ <xsl:text>work with the xsltproc XSLT processor.</xsl:text>
+ </xsl:message>
+ </xsl:if>
+
+ <xsl:if test="contains($vendor, 'Saxonica')">
+ <xsl:message terminate="yes">
+ <xsl:text>ERROR: the 'kosek' index method does not </xsl:text>
+ <xsl:text>work with the Saxon 8 XSLT processor.</xsl:text>
+ </xsl:message>
+ </xsl:if>
+
+ <xsl:if test="$exsl.node.set.available = 0">
+ <xsl:message terminate="yes">
+ <xsl:text>ERROR: the 'kosek' index method requires the </xsl:text>
+ <xsl:text>exslt:node-set() function. Use a processor that </xsl:text>
+ <xsl:text>has it, or use a different index method.</xsl:text>
+ </xsl:message>
+ </xsl:if>
+
+ <xsl:if test="not(function-available('i:group-index'))">
+ <xsl:message terminate="yes">
+ <xsl:text>ERROR: the 'kosek' index method requires the
+</xsl:text>
+ <xsl:text>index extension functions be imported:
+</xsl:text>
+ <xsl:text> xsl:import href="common/autoidx-kosek.xsl"</xsl:text>
+ </xsl:message>
+ </xsl:if>
+
+ <xsl:variable name="role">
+ <xsl:if test="$index.on.role != 0">
+ <xsl:value-of select="@role"/>
+ </xsl:if>
+ </xsl:variable>
+
+ <xsl:variable name="type">
+ <xsl:if test="$index.on.type != 0">
+ <xsl:value-of select="@type"/>
+ </xsl:if>
+ </xsl:variable>
+
+ <xsl:variable name="terms" select="//indexterm[count(.|key('group-code', i:group-index(normalize-space(concat(primary/@sortas, &quot; &quot;, primary))))[count(ancestor::node()|$scope) = count(ancestor::node()) and ($role = @role or $type = @type or (string-length($role) = 0 and string-length($type) = 0))][1]) = 1 and not(@class = 'endofrange')]"/>
+
+ <div class="index">
+ <xsl:apply-templates select="$terms" mode="index-div-kosek">
+ <xsl:with-param name="scope" select="$scope"/>
+ <xsl:with-param name="role" select="$role"/>
+ <xsl:with-param name="type" select="$type"/>
+ <xsl:sort select="i:group-index(normalize-space(concat(primary/@sortas, &quot; &quot;, primary)))" data-type="number"/>
+ </xsl:apply-templates>
+ </div>
+</xsl:template>
+
+<xsl:template match="indexterm" mode="index-div-kosek">
+ <xsl:param name="scope" select="."/>
+ <xsl:param name="role" select="''"/>
+ <xsl:param name="type" select="''"/>
+
+ <xsl:variable name="key" select="i:group-index(normalize-space(concat(primary/@sortas, &quot; &quot;, primary)))"/>
+
+ <xsl:variable name="lang">
+ <xsl:call-template name="l10n.language"/>
+ </xsl:variable>
+
+ <xsl:if test="key('group-code', $key)[count(ancestor::node()|$scope) = count(ancestor::node()) and ($role = @role or $type = @type or (string-length($role) = 0 and string-length($type) = 0))][count(.|key('primary', normalize-space(concat(primary/@sortas, &quot; &quot;, primary)))[count(ancestor::node()|$scope) = count(ancestor::node()) and ($role = @role or $type = @type or (string-length($role) = 0 and string-length($type) = 0))][1]) = 1]">
+ <div class="indexdiv">
+ <h3>
+ <xsl:value-of select="i:group-letter($key)"/>
+ </h3>
+ <dl>
+ <xsl:apply-templates select="key('group-code', $key)[count(ancestor::node()|$scope) = count(ancestor::node()) and ($role = @role or $type = @type or (string-length($role) = 0 and string-length($type) = 0))][count(.|key('primary', normalize-space(concat(primary/@sortas, &quot; &quot;, primary)))[count(ancestor::node()|$scope) = count(ancestor::node()) and ($role = @role or $type = @type or (string-length($role) = 0 and string-length($type) = 0))][1])=1]" mode="index-primary">
+ <xsl:sort select="normalize-space(concat(primary/@sortas, &quot; &quot;, primary))" lang="{$lang}"/>
+ <xsl:with-param name="scope" select="$scope"/>
+ <xsl:with-param name="role" select="$role"/>
+ <xsl:with-param name="type" select="$type"/>
+ </xsl:apply-templates>
+ </dl>
+ </div>
+ </xsl:if>
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/autoidx-ng.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/autoidx-ng.xsl
new file mode 100644
index 0000000..5d08db6
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/autoidx-ng.xsl
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="ASCII"?>
+<!--This file was created automatically by html2xhtml-->
+<!--from the HTML stylesheets.-->
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1999/xhtml" version="1.0">
+
+<!-- ********************************************************************
+ $Id: autoidx-ng.xsl 6910 2007-06-28 23:23:30Z xmldoc $
+ ********************************************************************
+
+ This file is part of the DocBook XSL Stylesheet distribution.
+ See ../README or http://docbook.sf.net/ for copyright
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<!-- You should have this directly in your customization file. -->
+<!-- This file is there only to retain backward compatibility. -->
+<xsl:import href="autoidx-kosek.xsl"/>
+<xsl:param name="index.method">kosek</xsl:param>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/autoidx.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/autoidx.xsl
new file mode 100644
index 0000000..baf4a1d
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/autoidx.xsl
@@ -0,0 +1,681 @@
+<?xml version="1.0" encoding="ASCII"?>
+<!--This file was created automatically by html2xhtml-->
+<!--from the HTML stylesheets.-->
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:exslt="http://exslt.org/common" xmlns="http://www.w3.org/1999/xhtml" extension-element-prefixes="exslt" exclude-result-prefixes="exslt" version="1.0">
+
+<!-- ********************************************************************
+ $Id: autoidx.xsl 8516 2009-08-12 02:54:56Z abdelazer $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<!-- ==================================================================== -->
+<!-- The "basic" method derived from Jeni Tennison's work. -->
+<!-- The "kosek" method contributed by Jirka Kosek. -->
+<!-- The "kimber" method contributed by Eliot Kimber of Innodata Isogen. -->
+
+<xsl:variable name="kimber.imported" select="0"/>
+<xsl:variable name="kosek.imported" select="0"/>
+
+<xsl:key name="letter" match="indexterm" use="translate(substring(normalize-space(concat(primary/@sortas, &quot; &quot;, primary)), 1, 1),'Aa&#192;&#224;&#193;&#225;&#194;&#226;&#195;&#227;&#196;&#228;&#197;&#229;&#256;&#257;&#258;&#259;&#260;&#261;&#461;&#462;&#478;&#479;&#480;&#481;&#506;&#507;&#512;&#513;&#514;&#515;&#550;&#551;&#7680;&#7681;&#7834;&#7840;&#7841;&#7842;&#7843;&#7844;&#7845;&#7846;&#7847;&#7848;&#7849;&#7850;&#7851;&#7852;&#7853;&#7854;&#7855;&#7856;&#7857;&#7858;&#7859;&#7860;&#7861;&#7862;&#7863;Bb&#384;&#385;&#595;&#386;&#387;&#7682;&#7683;&#7684;&#7685;&#7686;&#7687;Cc&#199;&#231;&#262;&#263;&#264;&#265;&#266;&#267;&#268;&#269;&#391;&#392;&#597;&#7688;&#7689;Dd&#270;&#271;&#272;&#273;&#394;&#599;&#395;&#396;&#453;&#498;&#545;&#598;&#7690;&#7691;&#7692;&#7693;&#7694;&#7695;&#7696;&#7697;&#7698;&#7699;Ee&#200;&#232;&#201;&#233;&#202;&#234;&#203;&#235;&#274;&#275;&#276;&#277;&#278;&#279;&#280;&#281;&#282;&#283;&#516;&#517;&#518;&#519;&#552;&#553;&#7700;&#7701;&#7702;&#7703;&#7704;&#7705;&#7706;&#7707;&#7708;&#7709;&#7864;&#7865;&#7866;&#7867;&#7868;&#7869;&#7870;&#7871;&#7872;&#7873;&#7874;&#7875;&#7876;&#7877;&#7878;&#7879;Ff&#401;&#402;&#7710;&#7711;Gg&#284;&#285;&#286;&#287;&#288;&#289;&#290;&#291;&#403;&#608;&#484;&#485;&#486;&#487;&#500;&#501;&#7712;&#7713;Hh&#292;&#293;&#294;&#295;&#542;&#543;&#614;&#7714;&#7715;&#7716;&#7717;&#7718;&#7719;&#7720;&#7721;&#7722;&#7723;&#7830;Ii&#204;&#236;&#205;&#237;&#206;&#238;&#207;&#239;&#296;&#297;&#298;&#299;&#300;&#301;&#302;&#303;&#304;&#407;&#616;&#463;&#464;&#520;&#521;&#522;&#523;&#7724;&#7725;&#7726;&#7727;&#7880;&#7881;&#7882;&#7883;Jj&#308;&#309;&#496;&#669;Kk&#310;&#311;&#408;&#409;&#488;&#489;&#7728;&#7729;&#7730;&#7731;&#7732;&#7733;Ll&#313;&#314;&#315;&#316;&#317;&#318;&#319;&#320;&#321;&#322;&#410;&#456;&#564;&#619;&#620;&#621;&#7734;&#7735;&#7736;&#7737;&#7738;&#7739;&#7740;&#7741;Mm&#625;&#7742;&#7743;&#7744;&#7745;&#7746;&#7747;Nn&#209;&#241;&#323;&#324;&#325;&#326;&#327;&#328;&#413;&#626;&#414;&#544;&#459;&#504;&#505;&#565;&#627;&#7748;&#7749;&#7750;&#7751;&#7752;&#7753;&#7754;&#7755;Oo&#210;&#242;&#211;&#243;&#212;&#244;&#213;&#245;&#214;&#246;&#216;&#248;&#332;&#333;&#334;&#335;&#336;&#337;&#415;&#416;&#417;&#465;&#466;&#490;&#491;&#492;&#493;&#510;&#511;&#524;&#525;&#526;&#527;&#554;&#555;&#556;&#557;&#558;&#559;&#560;&#561;&#7756;&#7757;&#7758;&#7759;&#7760;&#7761;&#7762;&#7763;&#7884;&#7885;&#7886;&#7887;&#7888;&#7889;&#7890;&#7891;&#7892;&#7893;&#7894;&#7895;&#7896;&#7897;&#7898;&#7899;&#7900;&#7901;&#7902;&#7903;&#7904;&#7905;&#7906;&#7907;Pp&#420;&#421;&#7764;&#7765;&#7766;&#7767;Qq&#672;Rr&#340;&#341;&#342;&#343;&#344;&#345;&#528;&#529;&#530;&#531;&#636;&#637;&#638;&#7768;&#7769;&#7770;&#7771;&#7772;&#7773;&#7774;&#7775;Ss&#346;&#347;&#348;&#349;&#350;&#351;&#352;&#353;&#536;&#537;&#642;&#7776;&#7777;&#7778;&#7779;&#7780;&#7781;&#7782;&#7783;&#7784;&#7785;Tt&#354;&#355;&#356;&#357;&#358;&#359;&#427;&#428;&#429;&#430;&#648;&#538;&#539;&#566;&#7786;&#7787;&#7788;&#7789;&#7790;&#7791;&#7792;&#7793;&#7831;Uu&#217;&#249;&#218;&#250;&#219;&#251;&#220;&#252;&#360;&#361;&#362;&#363;&#364;&#365;&#366;&#367;&#368;&#369;&#370;&#371;&#431;&#432;&#467;&#468;&#469;&#470;&#471;&#472;&#473;&#474;&#475;&#476;&#532;&#533;&#534;&#535;&#7794;&#7795;&#7796;&#7797;&#7798;&#7799;&#7800;&#7801;&#7802;&#7803;&#7908;&#7909;&#7910;&#7911;&#7912;&#7913;&#7914;&#7915;&#7916;&#7917;&#7918;&#7919;&#7920;&#7921;Vv&#434;&#651;&#7804;&#7805;&#7806;&#7807;Ww&#372;&#373;&#7808;&#7809;&#7810;&#7811;&#7812;&#7813;&#7814;&#7815;&#7816;&#7817;&#7832;Xx&#7818;&#7819;&#7820;&#7821;Yy&#221;&#253;&#255;&#376;&#374;&#375;&#435;&#436;&#562;&#563;&#7822;&#7823;&#7833;&#7922;&#7923;&#7924;&#7925;&#7926;&#7927;&#7928;&#7929;Zz&#377;&#378;&#379;&#380;&#381;&#382;&#437;&#438;&#548;&#549;&#656;&#657;&#7824;&#7825;&#7826;&#7827;&#7828;&#7829;&#7829;','AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBCCCCCCCCCCCCCCCCCDDDDDDDDDDDDDDDDDDDDDDDDEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEFFFFFFGGGGGGGGGGGGGGGGGGGGHHHHHHHHHHHHHHHHHHHHIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIJJJJJJKKKKKKKKKKKKKKLLLLLLLLLLLLLLLLLLLLLLLLLLMMMMMMMMMNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOPPPPPPPPQQQRRRRRRRRRRRRRRRRRRRRRRRSSSSSSSSSSSSSSSSSSSSSSSTTTTTTTTTTTTTTTTTTTTTTTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUVVVVVVVVWWWWWWWWWWWWWWWXXXXXXYYYYYYYYYYYYYYYYYYYYYYYZZZZZZZZZZZZZZZZZZZZZ')"/>
+
+<xsl:key name="primary" match="indexterm" use="normalize-space(concat(primary/@sortas, &quot; &quot;, primary))"/>
+
+<xsl:key name="secondary" match="indexterm" use="concat(normalize-space(concat(primary/@sortas, &quot; &quot;, primary)), &quot; &quot;, normalize-space(concat(secondary/@sortas, &quot; &quot;, secondary)))"/>
+
+<xsl:key name="tertiary" match="indexterm" use="concat(normalize-space(concat(primary/@sortas, &quot; &quot;, primary)), &quot; &quot;, normalize-space(concat(secondary/@sortas, &quot; &quot;, secondary)), &quot; &quot;, normalize-space(concat(tertiary/@sortas, &quot; &quot;, tertiary)))"/>
+
+<xsl:key name="endofrange" match="indexterm[@class='endofrange']" use="@startref"/>
+
+<xsl:key name="primary-section" match="indexterm[not(secondary) and not(see)]" use="concat(normalize-space(concat(primary/@sortas, &quot; &quot;, primary)), &quot; &quot;, generate-id((ancestor-or-self::set|ancestor-or-self::book|ancestor-or-self::part|ancestor-or-self::reference|ancestor-or-self::partintro|ancestor-or-self::chapter|ancestor-or-self::appendix|ancestor-or-self::preface|ancestor-or-self::article|ancestor-or-self::section|ancestor-or-self::sect1|ancestor-or-self::sect2|ancestor-or-self::sect3|ancestor-or-self::sect4|ancestor-or-self::sect5|ancestor-or-self::refentry|ancestor-or-self::refsect1|ancestor-or-self::refsect2|ancestor-or-self::refsect3|ancestor-or-self::simplesect|ancestor-or-self::bibliography|ancestor-or-self::glossary|ancestor-or-self::index|ancestor-or-self::webpage)[last()]))"/>
+
+<xsl:key name="secondary-section" match="indexterm[not(tertiary) and not(see)]" use="concat(normalize-space(concat(primary/@sortas, &quot; &quot;, primary)), &quot; &quot;, normalize-space(concat(secondary/@sortas, &quot; &quot;, secondary)), &quot; &quot;, generate-id((ancestor-or-self::set|ancestor-or-self::book|ancestor-or-self::part|ancestor-or-self::reference|ancestor-or-self::partintro|ancestor-or-self::chapter|ancestor-or-self::appendix|ancestor-or-self::preface|ancestor-or-self::article|ancestor-or-self::section|ancestor-or-self::sect1|ancestor-or-self::sect2|ancestor-or-self::sect3|ancestor-or-self::sect4|ancestor-or-self::sect5|ancestor-or-self::refentry|ancestor-or-self::refsect1|ancestor-or-self::refsect2|ancestor-or-self::refsect3|ancestor-or-self::simplesect|ancestor-or-self::bibliography|ancestor-or-self::glossary|ancestor-or-self::index|ancestor-or-self::webpage)[last()]))"/>
+
+<xsl:key name="tertiary-section" match="indexterm[not(see)]" use="concat(normalize-space(concat(primary/@sortas, &quot; &quot;, primary)), &quot; &quot;, normalize-space(concat(secondary/@sortas, &quot; &quot;, secondary)), &quot; &quot;, normalize-space(concat(tertiary/@sortas, &quot; &quot;, tertiary)), &quot; &quot;, generate-id((ancestor-or-self::set|ancestor-or-self::book|ancestor-or-self::part|ancestor-or-self::reference|ancestor-or-self::partintro|ancestor-or-self::chapter|ancestor-or-self::appendix|ancestor-or-self::preface|ancestor-or-self::article|ancestor-or-self::section|ancestor-or-self::sect1|ancestor-or-self::sect2|ancestor-or-self::sect3|ancestor-or-self::sect4|ancestor-or-self::sect5|ancestor-or-self::refentry|ancestor-or-self::refsect1|ancestor-or-self::refsect2|ancestor-or-self::refsect3|ancestor-or-self::simplesect|ancestor-or-self::bibliography|ancestor-or-self::glossary|ancestor-or-self::index|ancestor-or-self::webpage)[last()]))"/>
+
+<xsl:key name="see-also" match="indexterm[seealso]" use="concat(normalize-space(concat(primary/@sortas, &quot; &quot;, primary)), &quot; &quot;, normalize-space(concat(secondary/@sortas, &quot; &quot;, secondary)), &quot; &quot;, normalize-space(concat(tertiary/@sortas, &quot; &quot;, tertiary)), &quot; &quot;, seealso)"/>
+
+<xsl:key name="see" match="indexterm[see]" use="concat(normalize-space(concat(primary/@sortas, &quot; &quot;, primary)), &quot; &quot;, normalize-space(concat(secondary/@sortas, &quot; &quot;, secondary)), &quot; &quot;, normalize-space(concat(tertiary/@sortas, &quot; &quot;, tertiary)), &quot; &quot;, see)"/>
+
+<xsl:key name="sections" match="*[@id or @xml:id]" use="@id|@xml:id"/>
+
+
+<xsl:template name="generate-index">
+ <xsl:param name="scope" select="(ancestor::book|/)[last()]"/>
+
+ <xsl:choose>
+ <xsl:when test="$index.method = 'kosek'">
+ <xsl:call-template name="generate-kosek-index">
+ <xsl:with-param name="scope" select="$scope"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="$index.method = 'kimber'">
+ <xsl:call-template name="generate-kimber-index">
+ <xsl:with-param name="scope" select="$scope"/>
+ </xsl:call-template>
+ </xsl:when>
+
+ <xsl:otherwise>
+ <xsl:call-template name="generate-basic-index">
+ <xsl:with-param name="scope" select="$scope"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="generate-basic-index">
+ <xsl:param name="scope" select="NOTANODE"/>
+
+ <xsl:variable name="role">
+ <xsl:if test="$index.on.role != 0">
+ <xsl:value-of select="@role"/>
+ </xsl:if>
+ </xsl:variable>
+
+ <xsl:variable name="type">
+ <xsl:if test="$index.on.type != 0">
+ <xsl:value-of select="@type"/>
+ </xsl:if>
+ </xsl:variable>
+
+ <xsl:variable name="terms" select="//indexterm [count(.|key('letter', translate(substring(normalize-space(concat(primary/@sortas, &quot; &quot;, primary)), 1, 1), 'Aa&#192;&#224;&#193;&#225;&#194;&#226;&#195;&#227;&#196;&#228;&#197;&#229;&#256;&#257;&#258;&#259;&#260;&#261;&#461;&#462;&#478;&#479;&#480;&#481;&#506;&#507;&#512;&#513;&#514;&#515;&#550;&#551;&#7680;&#7681;&#7834;&#7840;&#7841;&#7842;&#7843;&#7844;&#7845;&#7846;&#7847;&#7848;&#7849;&#7850;&#7851;&#7852;&#7853;&#7854;&#7855;&#7856;&#7857;&#7858;&#7859;&#7860;&#7861;&#7862;&#7863;Bb&#384;&#385;&#595;&#386;&#387;&#7682;&#7683;&#7684;&#7685;&#7686;&#7687;Cc&#199;&#231;&#262;&#263;&#264;&#265;&#266;&#267;&#268;&#269;&#391;&#392;&#597;&#7688;&#7689;Dd&#270;&#271;&#272;&#273;&#394;&#599;&#395;&#396;&#453;&#498;&#545;&#598;&#7690;&#7691;&#7692;&#7693;&#7694;&#7695;&#7696;&#7697;&#7698;&#7699;Ee&#200;&#232;&#201;&#233;&#202;&#234;&#203;&#235;&#274;&#275;&#276;&#277;&#278;&#279;&#280;&#281;&#282;&#283;&#516;&#517;&#518;&#519;&#552;&#553;&#7700;&#7701;&#7702;&#7703;&#7704;&#7705;&#7706;&#7707;&#7708;&#7709;&#7864;&#7865;&#7866;&#7867;&#7868;&#7869;&#7870;&#7871;&#7872;&#7873;&#7874;&#7875;&#7876;&#7877;&#7878;&#7879;Ff&#401;&#402;&#7710;&#7711;Gg&#284;&#285;&#286;&#287;&#288;&#289;&#290;&#291;&#403;&#608;&#484;&#485;&#486;&#487;&#500;&#501;&#7712;&#7713;Hh&#292;&#293;&#294;&#295;&#542;&#543;&#614;&#7714;&#7715;&#7716;&#7717;&#7718;&#7719;&#7720;&#7721;&#7722;&#7723;&#7830;Ii&#204;&#236;&#205;&#237;&#206;&#238;&#207;&#239;&#296;&#297;&#298;&#299;&#300;&#301;&#302;&#303;&#304;&#407;&#616;&#463;&#464;&#520;&#521;&#522;&#523;&#7724;&#7725;&#7726;&#7727;&#7880;&#7881;&#7882;&#7883;Jj&#308;&#309;&#496;&#669;Kk&#310;&#311;&#408;&#409;&#488;&#489;&#7728;&#7729;&#7730;&#7731;&#7732;&#7733;Ll&#313;&#314;&#315;&#316;&#317;&#318;&#319;&#320;&#321;&#322;&#410;&#456;&#564;&#619;&#620;&#621;&#7734;&#7735;&#7736;&#7737;&#7738;&#7739;&#7740;&#7741;Mm&#625;&#7742;&#7743;&#7744;&#7745;&#7746;&#7747;Nn&#209;&#241;&#323;&#324;&#325;&#326;&#327;&#328;&#413;&#626;&#414;&#544;&#459;&#504;&#505;&#565;&#627;&#7748;&#7749;&#7750;&#7751;&#7752;&#7753;&#7754;&#7755;Oo&#210;&#242;&#211;&#243;&#212;&#244;&#213;&#245;&#214;&#246;&#216;&#248;&#332;&#333;&#334;&#335;&#336;&#337;&#415;&#416;&#417;&#465;&#466;&#490;&#491;&#492;&#493;&#510;&#511;&#524;&#525;&#526;&#527;&#554;&#555;&#556;&#557;&#558;&#559;&#560;&#561;&#7756;&#7757;&#7758;&#7759;&#7760;&#7761;&#7762;&#7763;&#7884;&#7885;&#7886;&#7887;&#7888;&#7889;&#7890;&#7891;&#7892;&#7893;&#7894;&#7895;&#7896;&#7897;&#7898;&#7899;&#7900;&#7901;&#7902;&#7903;&#7904;&#7905;&#7906;&#7907;Pp&#420;&#421;&#7764;&#7765;&#7766;&#7767;Qq&#672;Rr&#340;&#341;&#342;&#343;&#344;&#345;&#528;&#529;&#530;&#531;&#636;&#637;&#638;&#7768;&#7769;&#7770;&#7771;&#7772;&#7773;&#7774;&#7775;Ss&#346;&#347;&#348;&#349;&#350;&#351;&#352;&#353;&#536;&#537;&#642;&#7776;&#7777;&#7778;&#7779;&#7780;&#7781;&#7782;&#7783;&#7784;&#7785;Tt&#354;&#355;&#356;&#357;&#358;&#359;&#427;&#428;&#429;&#430;&#648;&#538;&#539;&#566;&#7786;&#7787;&#7788;&#7789;&#7790;&#7791;&#7792;&#7793;&#7831;Uu&#217;&#249;&#218;&#250;&#219;&#251;&#220;&#252;&#360;&#361;&#362;&#363;&#364;&#365;&#366;&#367;&#368;&#369;&#370;&#371;&#431;&#432;&#467;&#468;&#469;&#470;&#471;&#472;&#473;&#474;&#475;&#476;&#532;&#533;&#534;&#535;&#7794;&#7795;&#7796;&#7797;&#7798;&#7799;&#7800;&#7801;&#7802;&#7803;&#7908;&#7909;&#7910;&#7911;&#7912;&#7913;&#7914;&#7915;&#7916;&#7917;&#7918;&#7919;&#7920;&#7921;Vv&#434;&#651;&#7804;&#7805;&#7806;&#7807;Ww&#372;&#373;&#7808;&#7809;&#7810;&#7811;&#7812;&#7813;&#7814;&#7815;&#7816;&#7817;&#7832;Xx&#7818;&#7819;&#7820;&#7821;Yy&#221;&#253;&#255;&#376;&#374;&#375;&#435;&#436;&#562;&#563;&#7822;&#7823;&#7833;&#7922;&#7923;&#7924;&#7925;&#7926;&#7927;&#7928;&#7929;Zz&#377;&#378;&#379;&#380;&#381;&#382;&#437;&#438;&#548;&#549;&#656;&#657;&#7824;&#7825;&#7826;&#7827;&#7828;&#7829;&#7829;', 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBCCCCCCCCCCCCCCCCCDDDDDDDDDDDDDDDDDDDDDDDDEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEFFFFFFGGGGGGGGGGGGGGGGGGGGHHHHHHHHHHHHHHHHHHHHIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIJJJJJJKKKKKKKKKKKKKKLLLLLLLLLLLLLLLLLLLLLLLLLLMMMMMMMMMNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOPPPPPPPPQQQRRRRRRRRRRRRRRRRRRRRRRRSSSSSSSSSSSSSSSSSSSSSSSTTTTTTTTTTTTTTTTTTTTTTTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUVVVVVVVVWWWWWWWWWWWWWWWXXXXXXYYYYYYYYYYYYYYYYYYYYYYYZZZZZZZZZZZZZZZZZZZZZ')) [count(ancestor::node()|$scope) = count(ancestor::node()) and ($role = @role or $type = @type or (string-length($role) = 0 and string-length($type) = 0))][1]) = 1 and not(@class = 'endofrange')]"/>
+
+ <xsl:variable name="alphabetical" select="$terms[contains(concat('Aa&#192;&#224;&#193;&#225;&#194;&#226;&#195;&#227;&#196;&#228;&#197;&#229;&#256;&#257;&#258;&#259;&#260;&#261;&#461;&#462;&#478;&#479;&#480;&#481;&#506;&#507;&#512;&#513;&#514;&#515;&#550;&#551;&#7680;&#7681;&#7834;&#7840;&#7841;&#7842;&#7843;&#7844;&#7845;&#7846;&#7847;&#7848;&#7849;&#7850;&#7851;&#7852;&#7853;&#7854;&#7855;&#7856;&#7857;&#7858;&#7859;&#7860;&#7861;&#7862;&#7863;Bb&#384;&#385;&#595;&#386;&#387;&#7682;&#7683;&#7684;&#7685;&#7686;&#7687;Cc&#199;&#231;&#262;&#263;&#264;&#265;&#266;&#267;&#268;&#269;&#391;&#392;&#597;&#7688;&#7689;Dd&#270;&#271;&#272;&#273;&#394;&#599;&#395;&#396;&#453;&#498;&#545;&#598;&#7690;&#7691;&#7692;&#7693;&#7694;&#7695;&#7696;&#7697;&#7698;&#7699;Ee&#200;&#232;&#201;&#233;&#202;&#234;&#203;&#235;&#274;&#275;&#276;&#277;&#278;&#279;&#280;&#281;&#282;&#283;&#516;&#517;&#518;&#519;&#552;&#553;&#7700;&#7701;&#7702;&#7703;&#7704;&#7705;&#7706;&#7707;&#7708;&#7709;&#7864;&#7865;&#7866;&#7867;&#7868;&#7869;&#7870;&#7871;&#7872;&#7873;&#7874;&#7875;&#7876;&#7877;&#7878;&#7879;Ff&#401;&#402;&#7710;&#7711;Gg&#284;&#285;&#286;&#287;&#288;&#289;&#290;&#291;&#403;&#608;&#484;&#485;&#486;&#487;&#500;&#501;&#7712;&#7713;Hh&#292;&#293;&#294;&#295;&#542;&#543;&#614;&#7714;&#7715;&#7716;&#7717;&#7718;&#7719;&#7720;&#7721;&#7722;&#7723;&#7830;Ii&#204;&#236;&#205;&#237;&#206;&#238;&#207;&#239;&#296;&#297;&#298;&#299;&#300;&#301;&#302;&#303;&#304;&#407;&#616;&#463;&#464;&#520;&#521;&#522;&#523;&#7724;&#7725;&#7726;&#7727;&#7880;&#7881;&#7882;&#7883;Jj&#308;&#309;&#496;&#669;Kk&#310;&#311;&#408;&#409;&#488;&#489;&#7728;&#7729;&#7730;&#7731;&#7732;&#7733;Ll&#313;&#314;&#315;&#316;&#317;&#318;&#319;&#320;&#321;&#322;&#410;&#456;&#564;&#619;&#620;&#621;&#7734;&#7735;&#7736;&#7737;&#7738;&#7739;&#7740;&#7741;Mm&#625;&#7742;&#7743;&#7744;&#7745;&#7746;&#7747;Nn&#209;&#241;&#323;&#324;&#325;&#326;&#327;&#328;&#413;&#626;&#414;&#544;&#459;&#504;&#505;&#565;&#627;&#7748;&#7749;&#7750;&#7751;&#7752;&#7753;&#7754;&#7755;Oo&#210;&#242;&#211;&#243;&#212;&#244;&#213;&#245;&#214;&#246;&#216;&#248;&#332;&#333;&#334;&#335;&#336;&#337;&#415;&#416;&#417;&#465;&#466;&#490;&#491;&#492;&#493;&#510;&#511;&#524;&#525;&#526;&#527;&#554;&#555;&#556;&#557;&#558;&#559;&#560;&#561;&#7756;&#7757;&#7758;&#7759;&#7760;&#7761;&#7762;&#7763;&#7884;&#7885;&#7886;&#7887;&#7888;&#7889;&#7890;&#7891;&#7892;&#7893;&#7894;&#7895;&#7896;&#7897;&#7898;&#7899;&#7900;&#7901;&#7902;&#7903;&#7904;&#7905;&#7906;&#7907;Pp&#420;&#421;&#7764;&#7765;&#7766;&#7767;Qq&#672;Rr&#340;&#341;&#342;&#343;&#344;&#345;&#528;&#529;&#530;&#531;&#636;&#637;&#638;&#7768;&#7769;&#7770;&#7771;&#7772;&#7773;&#7774;&#7775;Ss&#346;&#347;&#348;&#349;&#350;&#351;&#352;&#353;&#536;&#537;&#642;&#7776;&#7777;&#7778;&#7779;&#7780;&#7781;&#7782;&#7783;&#7784;&#7785;Tt&#354;&#355;&#356;&#357;&#358;&#359;&#427;&#428;&#429;&#430;&#648;&#538;&#539;&#566;&#7786;&#7787;&#7788;&#7789;&#7790;&#7791;&#7792;&#7793;&#7831;Uu&#217;&#249;&#218;&#250;&#219;&#251;&#220;&#252;&#360;&#361;&#362;&#363;&#364;&#365;&#366;&#367;&#368;&#369;&#370;&#371;&#431;&#432;&#467;&#468;&#469;&#470;&#471;&#472;&#473;&#474;&#475;&#476;&#532;&#533;&#534;&#535;&#7794;&#7795;&#7796;&#7797;&#7798;&#7799;&#7800;&#7801;&#7802;&#7803;&#7908;&#7909;&#7910;&#7911;&#7912;&#7913;&#7914;&#7915;&#7916;&#7917;&#7918;&#7919;&#7920;&#7921;Vv&#434;&#651;&#7804;&#7805;&#7806;&#7807;Ww&#372;&#373;&#7808;&#7809;&#7810;&#7811;&#7812;&#7813;&#7814;&#7815;&#7816;&#7817;&#7832;Xx&#7818;&#7819;&#7820;&#7821;Yy&#221;&#253;&#255;&#376;&#374;&#375;&#435;&#436;&#562;&#563;&#7822;&#7823;&#7833;&#7922;&#7923;&#7924;&#7925;&#7926;&#7927;&#7928;&#7929;Zz&#377;&#378;&#379;&#380;&#381;&#382;&#437;&#438;&#548;&#549;&#656;&#657;&#7824;&#7825;&#7826;&#7827;&#7828;&#7829;&#7829;', 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBCCCCCCCCCCCCCCCCCDDDDDDDDDDDDDDDDDDDDDDDDEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEFFFFFFGGGGGGGGGGGGGGGGGGGGHHHHHHHHHHHHHHHHHHHHIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIJJJJJJKKKKKKKKKKKKKKLLLLLLLLLLLLLLLLLLLLLLLLLLMMMMMMMMMNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOPPPPPPPPQQQRRRRRRRRRRRRRRRRRRRRRRRSSSSSSSSSSSSSSSSSSSSSSSTTTTTTTTTTTTTTTTTTTTTTTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUVVVVVVVVWWWWWWWWWWWWWWWXXXXXXYYYYYYYYYYYYYYYYYYYYYYYZZZZZZZZZZZZZZZZZZZZZ'), substring(normalize-space(concat(primary/@sortas, &quot; &quot;, primary)), 1, 1))]"/>
+
+ <xsl:variable name="others" select="$terms[not(contains(concat('Aa&#192;&#224;&#193;&#225;&#194;&#226;&#195;&#227;&#196;&#228;&#197;&#229;&#256;&#257;&#258;&#259;&#260;&#261;&#461;&#462;&#478;&#479;&#480;&#481;&#506;&#507;&#512;&#513;&#514;&#515;&#550;&#551;&#7680;&#7681;&#7834;&#7840;&#7841;&#7842;&#7843;&#7844;&#7845;&#7846;&#7847;&#7848;&#7849;&#7850;&#7851;&#7852;&#7853;&#7854;&#7855;&#7856;&#7857;&#7858;&#7859;&#7860;&#7861;&#7862;&#7863;Bb&#384;&#385;&#595;&#386;&#387;&#7682;&#7683;&#7684;&#7685;&#7686;&#7687;Cc&#199;&#231;&#262;&#263;&#264;&#265;&#266;&#267;&#268;&#269;&#391;&#392;&#597;&#7688;&#7689;Dd&#270;&#271;&#272;&#273;&#394;&#599;&#395;&#396;&#453;&#498;&#545;&#598;&#7690;&#7691;&#7692;&#7693;&#7694;&#7695;&#7696;&#7697;&#7698;&#7699;Ee&#200;&#232;&#201;&#233;&#202;&#234;&#203;&#235;&#274;&#275;&#276;&#277;&#278;&#279;&#280;&#281;&#282;&#283;&#516;&#517;&#518;&#519;&#552;&#553;&#7700;&#7701;&#7702;&#7703;&#7704;&#7705;&#7706;&#7707;&#7708;&#7709;&#7864;&#7865;&#7866;&#7867;&#7868;&#7869;&#7870;&#7871;&#7872;&#7873;&#7874;&#7875;&#7876;&#7877;&#7878;&#7879;Ff&#401;&#402;&#7710;&#7711;Gg&#284;&#285;&#286;&#287;&#288;&#289;&#290;&#291;&#403;&#608;&#484;&#485;&#486;&#487;&#500;&#501;&#7712;&#7713;Hh&#292;&#293;&#294;&#295;&#542;&#543;&#614;&#7714;&#7715;&#7716;&#7717;&#7718;&#7719;&#7720;&#7721;&#7722;&#7723;&#7830;Ii&#204;&#236;&#205;&#237;&#206;&#238;&#207;&#239;&#296;&#297;&#298;&#299;&#300;&#301;&#302;&#303;&#304;&#407;&#616;&#463;&#464;&#520;&#521;&#522;&#523;&#7724;&#7725;&#7726;&#7727;&#7880;&#7881;&#7882;&#7883;Jj&#308;&#309;&#496;&#669;Kk&#310;&#311;&#408;&#409;&#488;&#489;&#7728;&#7729;&#7730;&#7731;&#7732;&#7733;Ll&#313;&#314;&#315;&#316;&#317;&#318;&#319;&#320;&#321;&#322;&#410;&#456;&#564;&#619;&#620;&#621;&#7734;&#7735;&#7736;&#7737;&#7738;&#7739;&#7740;&#7741;Mm&#625;&#7742;&#7743;&#7744;&#7745;&#7746;&#7747;Nn&#209;&#241;&#323;&#324;&#325;&#326;&#327;&#328;&#413;&#626;&#414;&#544;&#459;&#504;&#505;&#565;&#627;&#7748;&#7749;&#7750;&#7751;&#7752;&#7753;&#7754;&#7755;Oo&#210;&#242;&#211;&#243;&#212;&#244;&#213;&#245;&#214;&#246;&#216;&#248;&#332;&#333;&#334;&#335;&#336;&#337;&#415;&#416;&#417;&#465;&#466;&#490;&#491;&#492;&#493;&#510;&#511;&#524;&#525;&#526;&#527;&#554;&#555;&#556;&#557;&#558;&#559;&#560;&#561;&#7756;&#7757;&#7758;&#7759;&#7760;&#7761;&#7762;&#7763;&#7884;&#7885;&#7886;&#7887;&#7888;&#7889;&#7890;&#7891;&#7892;&#7893;&#7894;&#7895;&#7896;&#7897;&#7898;&#7899;&#7900;&#7901;&#7902;&#7903;&#7904;&#7905;&#7906;&#7907;Pp&#420;&#421;&#7764;&#7765;&#7766;&#7767;Qq&#672;Rr&#340;&#341;&#342;&#343;&#344;&#345;&#528;&#529;&#530;&#531;&#636;&#637;&#638;&#7768;&#7769;&#7770;&#7771;&#7772;&#7773;&#7774;&#7775;Ss&#346;&#347;&#348;&#349;&#350;&#351;&#352;&#353;&#536;&#537;&#642;&#7776;&#7777;&#7778;&#7779;&#7780;&#7781;&#7782;&#7783;&#7784;&#7785;Tt&#354;&#355;&#356;&#357;&#358;&#359;&#427;&#428;&#429;&#430;&#648;&#538;&#539;&#566;&#7786;&#7787;&#7788;&#7789;&#7790;&#7791;&#7792;&#7793;&#7831;Uu&#217;&#249;&#218;&#250;&#219;&#251;&#220;&#252;&#360;&#361;&#362;&#363;&#364;&#365;&#366;&#367;&#368;&#369;&#370;&#371;&#431;&#432;&#467;&#468;&#469;&#470;&#471;&#472;&#473;&#474;&#475;&#476;&#532;&#533;&#534;&#535;&#7794;&#7795;&#7796;&#7797;&#7798;&#7799;&#7800;&#7801;&#7802;&#7803;&#7908;&#7909;&#7910;&#7911;&#7912;&#7913;&#7914;&#7915;&#7916;&#7917;&#7918;&#7919;&#7920;&#7921;Vv&#434;&#651;&#7804;&#7805;&#7806;&#7807;Ww&#372;&#373;&#7808;&#7809;&#7810;&#7811;&#7812;&#7813;&#7814;&#7815;&#7816;&#7817;&#7832;Xx&#7818;&#7819;&#7820;&#7821;Yy&#221;&#253;&#255;&#376;&#374;&#375;&#435;&#436;&#562;&#563;&#7822;&#7823;&#7833;&#7922;&#7923;&#7924;&#7925;&#7926;&#7927;&#7928;&#7929;Zz&#377;&#378;&#379;&#380;&#381;&#382;&#437;&#438;&#548;&#549;&#656;&#657;&#7824;&#7825;&#7826;&#7827;&#7828;&#7829;&#7829;', 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBCCCCCCCCCCCCCCCCCDDDDDDDDDDDDDDDDDDDDDDDDEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEFFFFFFGGGGGGGGGGGGGGGGGGGGHHHHHHHHHHHHHHHHHHHHIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIJJJJJJKKKKKKKKKKKKKKLLLLLLLLLLLLLLLLLLLLLLLLLLMMMMMMMMMNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOPPPPPPPPQQQRRRRRRRRRRRRRRRRRRRRRRRSSSSSSSSSSSSSSSSSSSSSSSTTTTTTTTTTTTTTTTTTTTTTTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUVVVVVVVVWWWWWWWWWWWWWWWXXXXXXYYYYYYYYYYYYYYYYYYYYYYYZZZZZZZZZZZZZZZZZZZZZ'), substring(normalize-space(concat(primary/@sortas, &quot; &quot;, primary)), 1, 1)))]"/>
+ <div class="index">
+ <xsl:if test="$others">
+ <xsl:choose>
+ <xsl:when test="normalize-space($type) != '' and $others[@type = $type][count(.|key('primary', normalize-space(concat(primary/@sortas, &quot; &quot;, primary)))[count(ancestor::node()|$scope) = count(ancestor::node()) and ($role = @role or $type = @type or (string-length($role) = 0 and string-length($type) = 0))][1]) = 1]">
+ <div class="indexdiv">
+ <h3>
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'index symbols'"/>
+ </xsl:call-template>
+ </h3>
+ <dl>
+ <xsl:apply-templates select="$others[count(.|key('primary', normalize-space(concat(primary/@sortas, &quot; &quot;, primary)))[count(ancestor::node()|$scope) = count(ancestor::node()) and ($role = @role or $type = @type or (string-length($role) = 0 and string-length($type) = 0))][1]) = 1]" mode="index-symbol-div">
+ <xsl:with-param name="position" select="position()"/>
+ <xsl:with-param name="scope" select="$scope"/>
+ <xsl:with-param name="role" select="$role"/>
+ <xsl:with-param name="type" select="$type"/>
+ <xsl:sort select="translate(normalize-space(concat(primary/@sortas, &quot; &quot;, primary)), 'Aa&#192;&#224;&#193;&#225;&#194;&#226;&#195;&#227;&#196;&#228;&#197;&#229;&#256;&#257;&#258;&#259;&#260;&#261;&#461;&#462;&#478;&#479;&#480;&#481;&#506;&#507;&#512;&#513;&#514;&#515;&#550;&#551;&#7680;&#7681;&#7834;&#7840;&#7841;&#7842;&#7843;&#7844;&#7845;&#7846;&#7847;&#7848;&#7849;&#7850;&#7851;&#7852;&#7853;&#7854;&#7855;&#7856;&#7857;&#7858;&#7859;&#7860;&#7861;&#7862;&#7863;Bb&#384;&#385;&#595;&#386;&#387;&#7682;&#7683;&#7684;&#7685;&#7686;&#7687;Cc&#199;&#231;&#262;&#263;&#264;&#265;&#266;&#267;&#268;&#269;&#391;&#392;&#597;&#7688;&#7689;Dd&#270;&#271;&#272;&#273;&#394;&#599;&#395;&#396;&#453;&#498;&#545;&#598;&#7690;&#7691;&#7692;&#7693;&#7694;&#7695;&#7696;&#7697;&#7698;&#7699;Ee&#200;&#232;&#201;&#233;&#202;&#234;&#203;&#235;&#274;&#275;&#276;&#277;&#278;&#279;&#280;&#281;&#282;&#283;&#516;&#517;&#518;&#519;&#552;&#553;&#7700;&#7701;&#7702;&#7703;&#7704;&#7705;&#7706;&#7707;&#7708;&#7709;&#7864;&#7865;&#7866;&#7867;&#7868;&#7869;&#7870;&#7871;&#7872;&#7873;&#7874;&#7875;&#7876;&#7877;&#7878;&#7879;Ff&#401;&#402;&#7710;&#7711;Gg&#284;&#285;&#286;&#287;&#288;&#289;&#290;&#291;&#403;&#608;&#484;&#485;&#486;&#487;&#500;&#501;&#7712;&#7713;Hh&#292;&#293;&#294;&#295;&#542;&#543;&#614;&#7714;&#7715;&#7716;&#7717;&#7718;&#7719;&#7720;&#7721;&#7722;&#7723;&#7830;Ii&#204;&#236;&#205;&#237;&#206;&#238;&#207;&#239;&#296;&#297;&#298;&#299;&#300;&#301;&#302;&#303;&#304;&#407;&#616;&#463;&#464;&#520;&#521;&#522;&#523;&#7724;&#7725;&#7726;&#7727;&#7880;&#7881;&#7882;&#7883;Jj&#308;&#309;&#496;&#669;Kk&#310;&#311;&#408;&#409;&#488;&#489;&#7728;&#7729;&#7730;&#7731;&#7732;&#7733;Ll&#313;&#314;&#315;&#316;&#317;&#318;&#319;&#320;&#321;&#322;&#410;&#456;&#564;&#619;&#620;&#621;&#7734;&#7735;&#7736;&#7737;&#7738;&#7739;&#7740;&#7741;Mm&#625;&#7742;&#7743;&#7744;&#7745;&#7746;&#7747;Nn&#209;&#241;&#323;&#324;&#325;&#326;&#327;&#328;&#413;&#626;&#414;&#544;&#459;&#504;&#505;&#565;&#627;&#7748;&#7749;&#7750;&#7751;&#7752;&#7753;&#7754;&#7755;Oo&#210;&#242;&#211;&#243;&#212;&#244;&#213;&#245;&#214;&#246;&#216;&#248;&#332;&#333;&#334;&#335;&#336;&#337;&#415;&#416;&#417;&#465;&#466;&#490;&#491;&#492;&#493;&#510;&#511;&#524;&#525;&#526;&#527;&#554;&#555;&#556;&#557;&#558;&#559;&#560;&#561;&#7756;&#7757;&#7758;&#7759;&#7760;&#7761;&#7762;&#7763;&#7884;&#7885;&#7886;&#7887;&#7888;&#7889;&#7890;&#7891;&#7892;&#7893;&#7894;&#7895;&#7896;&#7897;&#7898;&#7899;&#7900;&#7901;&#7902;&#7903;&#7904;&#7905;&#7906;&#7907;Pp&#420;&#421;&#7764;&#7765;&#7766;&#7767;Qq&#672;Rr&#340;&#341;&#342;&#343;&#344;&#345;&#528;&#529;&#530;&#531;&#636;&#637;&#638;&#7768;&#7769;&#7770;&#7771;&#7772;&#7773;&#7774;&#7775;Ss&#346;&#347;&#348;&#349;&#350;&#351;&#352;&#353;&#536;&#537;&#642;&#7776;&#7777;&#7778;&#7779;&#7780;&#7781;&#7782;&#7783;&#7784;&#7785;Tt&#354;&#355;&#356;&#357;&#358;&#359;&#427;&#428;&#429;&#430;&#648;&#538;&#539;&#566;&#7786;&#7787;&#7788;&#7789;&#7790;&#7791;&#7792;&#7793;&#7831;Uu&#217;&#249;&#218;&#250;&#219;&#251;&#220;&#252;&#360;&#361;&#362;&#363;&#364;&#365;&#366;&#367;&#368;&#369;&#370;&#371;&#431;&#432;&#467;&#468;&#469;&#470;&#471;&#472;&#473;&#474;&#475;&#476;&#532;&#533;&#534;&#535;&#7794;&#7795;&#7796;&#7797;&#7798;&#7799;&#7800;&#7801;&#7802;&#7803;&#7908;&#7909;&#7910;&#7911;&#7912;&#7913;&#7914;&#7915;&#7916;&#7917;&#7918;&#7919;&#7920;&#7921;Vv&#434;&#651;&#7804;&#7805;&#7806;&#7807;Ww&#372;&#373;&#7808;&#7809;&#7810;&#7811;&#7812;&#7813;&#7814;&#7815;&#7816;&#7817;&#7832;Xx&#7818;&#7819;&#7820;&#7821;Yy&#221;&#253;&#255;&#376;&#374;&#375;&#435;&#436;&#562;&#563;&#7822;&#7823;&#7833;&#7922;&#7923;&#7924;&#7925;&#7926;&#7927;&#7928;&#7929;Zz&#377;&#378;&#379;&#380;&#381;&#382;&#437;&#438;&#548;&#549;&#656;&#657;&#7824;&#7825;&#7826;&#7827;&#7828;&#7829;&#7829;', 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBCCCCCCCCCCCCCCCCCDDDDDDDDDDDDDDDDDDDDDDDDEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEFFFFFFGGGGGGGGGGGGGGGGGGGGHHHHHHHHHHHHHHHHHHHHIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIJJJJJJKKKKKKKKKKKKKKLLLLLLLLLLLLLLLLLLLLLLLLLLMMMMMMMMMNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOPPPPPPPPQQQRRRRRRRRRRRRRRRRRRRRRRRSSSSSSSSSSSSSSSSSSSSSSSTTTTTTTTTTTTTTTTTTTTTTTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUVVVVVVVVWWWWWWWWWWWWWWWXXXXXXYYYYYYYYYYYYYYYYYYYYYYYZZZZZZZZZZZZZZZZZZZZZ')"/>
+ </xsl:apply-templates>
+ </dl>
+ </div>
+ </xsl:when>
+ <xsl:when test="normalize-space($type) != ''">
+ <!-- Output nothing, as there isn't a match for $other using this $type -->
+ </xsl:when>
+ <xsl:otherwise>
+ <div class="indexdiv">
+ <h3>
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'index symbols'"/>
+ </xsl:call-template>
+ </h3>
+ <dl>
+ <xsl:apply-templates select="$others[count(.|key('primary', normalize-space(concat(primary/@sortas, &quot; &quot;, primary)))[count(ancestor::node()|$scope) = count(ancestor::node()) and ($role = @role or $type = @type or (string-length($role) = 0 and string-length($type) = 0))][1]) = 1]" mode="index-symbol-div">
+ <xsl:with-param name="position" select="position()"/>
+ <xsl:with-param name="scope" select="$scope"/>
+ <xsl:with-param name="role" select="$role"/>
+ <xsl:with-param name="type" select="$type"/>
+ <xsl:sort select="translate(normalize-space(concat(primary/@sortas, &quot; &quot;, primary)), 'Aa&#192;&#224;&#193;&#225;&#194;&#226;&#195;&#227;&#196;&#228;&#197;&#229;&#256;&#257;&#258;&#259;&#260;&#261;&#461;&#462;&#478;&#479;&#480;&#481;&#506;&#507;&#512;&#513;&#514;&#515;&#550;&#551;&#7680;&#7681;&#7834;&#7840;&#7841;&#7842;&#7843;&#7844;&#7845;&#7846;&#7847;&#7848;&#7849;&#7850;&#7851;&#7852;&#7853;&#7854;&#7855;&#7856;&#7857;&#7858;&#7859;&#7860;&#7861;&#7862;&#7863;Bb&#384;&#385;&#595;&#386;&#387;&#7682;&#7683;&#7684;&#7685;&#7686;&#7687;Cc&#199;&#231;&#262;&#263;&#264;&#265;&#266;&#267;&#268;&#269;&#391;&#392;&#597;&#7688;&#7689;Dd&#270;&#271;&#272;&#273;&#394;&#599;&#395;&#396;&#453;&#498;&#545;&#598;&#7690;&#7691;&#7692;&#7693;&#7694;&#7695;&#7696;&#7697;&#7698;&#7699;Ee&#200;&#232;&#201;&#233;&#202;&#234;&#203;&#235;&#274;&#275;&#276;&#277;&#278;&#279;&#280;&#281;&#282;&#283;&#516;&#517;&#518;&#519;&#552;&#553;&#7700;&#7701;&#7702;&#7703;&#7704;&#7705;&#7706;&#7707;&#7708;&#7709;&#7864;&#7865;&#7866;&#7867;&#7868;&#7869;&#7870;&#7871;&#7872;&#7873;&#7874;&#7875;&#7876;&#7877;&#7878;&#7879;Ff&#401;&#402;&#7710;&#7711;Gg&#284;&#285;&#286;&#287;&#288;&#289;&#290;&#291;&#403;&#608;&#484;&#485;&#486;&#487;&#500;&#501;&#7712;&#7713;Hh&#292;&#293;&#294;&#295;&#542;&#543;&#614;&#7714;&#7715;&#7716;&#7717;&#7718;&#7719;&#7720;&#7721;&#7722;&#7723;&#7830;Ii&#204;&#236;&#205;&#237;&#206;&#238;&#207;&#239;&#296;&#297;&#298;&#299;&#300;&#301;&#302;&#303;&#304;&#407;&#616;&#463;&#464;&#520;&#521;&#522;&#523;&#7724;&#7725;&#7726;&#7727;&#7880;&#7881;&#7882;&#7883;Jj&#308;&#309;&#496;&#669;Kk&#310;&#311;&#408;&#409;&#488;&#489;&#7728;&#7729;&#7730;&#7731;&#7732;&#7733;Ll&#313;&#314;&#315;&#316;&#317;&#318;&#319;&#320;&#321;&#322;&#410;&#456;&#564;&#619;&#620;&#621;&#7734;&#7735;&#7736;&#7737;&#7738;&#7739;&#7740;&#7741;Mm&#625;&#7742;&#7743;&#7744;&#7745;&#7746;&#7747;Nn&#209;&#241;&#323;&#324;&#325;&#326;&#327;&#328;&#413;&#626;&#414;&#544;&#459;&#504;&#505;&#565;&#627;&#7748;&#7749;&#7750;&#7751;&#7752;&#7753;&#7754;&#7755;Oo&#210;&#242;&#211;&#243;&#212;&#244;&#213;&#245;&#214;&#246;&#216;&#248;&#332;&#333;&#334;&#335;&#336;&#337;&#415;&#416;&#417;&#465;&#466;&#490;&#491;&#492;&#493;&#510;&#511;&#524;&#525;&#526;&#527;&#554;&#555;&#556;&#557;&#558;&#559;&#560;&#561;&#7756;&#7757;&#7758;&#7759;&#7760;&#7761;&#7762;&#7763;&#7884;&#7885;&#7886;&#7887;&#7888;&#7889;&#7890;&#7891;&#7892;&#7893;&#7894;&#7895;&#7896;&#7897;&#7898;&#7899;&#7900;&#7901;&#7902;&#7903;&#7904;&#7905;&#7906;&#7907;Pp&#420;&#421;&#7764;&#7765;&#7766;&#7767;Qq&#672;Rr&#340;&#341;&#342;&#343;&#344;&#345;&#528;&#529;&#530;&#531;&#636;&#637;&#638;&#7768;&#7769;&#7770;&#7771;&#7772;&#7773;&#7774;&#7775;Ss&#346;&#347;&#348;&#349;&#350;&#351;&#352;&#353;&#536;&#537;&#642;&#7776;&#7777;&#7778;&#7779;&#7780;&#7781;&#7782;&#7783;&#7784;&#7785;Tt&#354;&#355;&#356;&#357;&#358;&#359;&#427;&#428;&#429;&#430;&#648;&#538;&#539;&#566;&#7786;&#7787;&#7788;&#7789;&#7790;&#7791;&#7792;&#7793;&#7831;Uu&#217;&#249;&#218;&#250;&#219;&#251;&#220;&#252;&#360;&#361;&#362;&#363;&#364;&#365;&#366;&#367;&#368;&#369;&#370;&#371;&#431;&#432;&#467;&#468;&#469;&#470;&#471;&#472;&#473;&#474;&#475;&#476;&#532;&#533;&#534;&#535;&#7794;&#7795;&#7796;&#7797;&#7798;&#7799;&#7800;&#7801;&#7802;&#7803;&#7908;&#7909;&#7910;&#7911;&#7912;&#7913;&#7914;&#7915;&#7916;&#7917;&#7918;&#7919;&#7920;&#7921;Vv&#434;&#651;&#7804;&#7805;&#7806;&#7807;Ww&#372;&#373;&#7808;&#7809;&#7810;&#7811;&#7812;&#7813;&#7814;&#7815;&#7816;&#7817;&#7832;Xx&#7818;&#7819;&#7820;&#7821;Yy&#221;&#253;&#255;&#376;&#374;&#375;&#435;&#436;&#562;&#563;&#7822;&#7823;&#7833;&#7922;&#7923;&#7924;&#7925;&#7926;&#7927;&#7928;&#7929;Zz&#377;&#378;&#379;&#380;&#381;&#382;&#437;&#438;&#548;&#549;&#656;&#657;&#7824;&#7825;&#7826;&#7827;&#7828;&#7829;&#7829;', 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBCCCCCCCCCCCCCCCCCDDDDDDDDDDDDDDDDDDDDDDDDEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEFFFFFFGGGGGGGGGGGGGGGGGGGGHHHHHHHHHHHHHHHHHHHHIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIJJJJJJKKKKKKKKKKKKKKLLLLLLLLLLLLLLLLLLLLLLLLLLMMMMMMMMMNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOPPPPPPPPQQQRRRRRRRRRRRRRRRRRRRRRRRSSSSSSSSSSSSSSSSSSSSSSSTTTTTTTTTTTTTTTTTTTTTTTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUVVVVVVVVWWWWWWWWWWWWWWWXXXXXXYYYYYYYYYYYYYYYYYYYYYYYZZZZZZZZZZZZZZZZZZZZZ')"/>
+ </xsl:apply-templates>
+ </dl>
+ </div>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:if>
+
+ <xsl:apply-templates select="$alphabetical[count(.|key('letter', translate(substring(normalize-space(concat(primary/@sortas, &quot; &quot;, primary)), 1, 1), 'Aa&#192;&#224;&#193;&#225;&#194;&#226;&#195;&#227;&#196;&#228;&#197;&#229;&#256;&#257;&#258;&#259;&#260;&#261;&#461;&#462;&#478;&#479;&#480;&#481;&#506;&#507;&#512;&#513;&#514;&#515;&#550;&#551;&#7680;&#7681;&#7834;&#7840;&#7841;&#7842;&#7843;&#7844;&#7845;&#7846;&#7847;&#7848;&#7849;&#7850;&#7851;&#7852;&#7853;&#7854;&#7855;&#7856;&#7857;&#7858;&#7859;&#7860;&#7861;&#7862;&#7863;Bb&#384;&#385;&#595;&#386;&#387;&#7682;&#7683;&#7684;&#7685;&#7686;&#7687;Cc&#199;&#231;&#262;&#263;&#264;&#265;&#266;&#267;&#268;&#269;&#391;&#392;&#597;&#7688;&#7689;Dd&#270;&#271;&#272;&#273;&#394;&#599;&#395;&#396;&#453;&#498;&#545;&#598;&#7690;&#7691;&#7692;&#7693;&#7694;&#7695;&#7696;&#7697;&#7698;&#7699;Ee&#200;&#232;&#201;&#233;&#202;&#234;&#203;&#235;&#274;&#275;&#276;&#277;&#278;&#279;&#280;&#281;&#282;&#283;&#516;&#517;&#518;&#519;&#552;&#553;&#7700;&#7701;&#7702;&#7703;&#7704;&#7705;&#7706;&#7707;&#7708;&#7709;&#7864;&#7865;&#7866;&#7867;&#7868;&#7869;&#7870;&#7871;&#7872;&#7873;&#7874;&#7875;&#7876;&#7877;&#7878;&#7879;Ff&#401;&#402;&#7710;&#7711;Gg&#284;&#285;&#286;&#287;&#288;&#289;&#290;&#291;&#403;&#608;&#484;&#485;&#486;&#487;&#500;&#501;&#7712;&#7713;Hh&#292;&#293;&#294;&#295;&#542;&#543;&#614;&#7714;&#7715;&#7716;&#7717;&#7718;&#7719;&#7720;&#7721;&#7722;&#7723;&#7830;Ii&#204;&#236;&#205;&#237;&#206;&#238;&#207;&#239;&#296;&#297;&#298;&#299;&#300;&#301;&#302;&#303;&#304;&#407;&#616;&#463;&#464;&#520;&#521;&#522;&#523;&#7724;&#7725;&#7726;&#7727;&#7880;&#7881;&#7882;&#7883;Jj&#308;&#309;&#496;&#669;Kk&#310;&#311;&#408;&#409;&#488;&#489;&#7728;&#7729;&#7730;&#7731;&#7732;&#7733;Ll&#313;&#314;&#315;&#316;&#317;&#318;&#319;&#320;&#321;&#322;&#410;&#456;&#564;&#619;&#620;&#621;&#7734;&#7735;&#7736;&#7737;&#7738;&#7739;&#7740;&#7741;Mm&#625;&#7742;&#7743;&#7744;&#7745;&#7746;&#7747;Nn&#209;&#241;&#323;&#324;&#325;&#326;&#327;&#328;&#413;&#626;&#414;&#544;&#459;&#504;&#505;&#565;&#627;&#7748;&#7749;&#7750;&#7751;&#7752;&#7753;&#7754;&#7755;Oo&#210;&#242;&#211;&#243;&#212;&#244;&#213;&#245;&#214;&#246;&#216;&#248;&#332;&#333;&#334;&#335;&#336;&#337;&#415;&#416;&#417;&#465;&#466;&#490;&#491;&#492;&#493;&#510;&#511;&#524;&#525;&#526;&#527;&#554;&#555;&#556;&#557;&#558;&#559;&#560;&#561;&#7756;&#7757;&#7758;&#7759;&#7760;&#7761;&#7762;&#7763;&#7884;&#7885;&#7886;&#7887;&#7888;&#7889;&#7890;&#7891;&#7892;&#7893;&#7894;&#7895;&#7896;&#7897;&#7898;&#7899;&#7900;&#7901;&#7902;&#7903;&#7904;&#7905;&#7906;&#7907;Pp&#420;&#421;&#7764;&#7765;&#7766;&#7767;Qq&#672;Rr&#340;&#341;&#342;&#343;&#344;&#345;&#528;&#529;&#530;&#531;&#636;&#637;&#638;&#7768;&#7769;&#7770;&#7771;&#7772;&#7773;&#7774;&#7775;Ss&#346;&#347;&#348;&#349;&#350;&#351;&#352;&#353;&#536;&#537;&#642;&#7776;&#7777;&#7778;&#7779;&#7780;&#7781;&#7782;&#7783;&#7784;&#7785;Tt&#354;&#355;&#356;&#357;&#358;&#359;&#427;&#428;&#429;&#430;&#648;&#538;&#539;&#566;&#7786;&#7787;&#7788;&#7789;&#7790;&#7791;&#7792;&#7793;&#7831;Uu&#217;&#249;&#218;&#250;&#219;&#251;&#220;&#252;&#360;&#361;&#362;&#363;&#364;&#365;&#366;&#367;&#368;&#369;&#370;&#371;&#431;&#432;&#467;&#468;&#469;&#470;&#471;&#472;&#473;&#474;&#475;&#476;&#532;&#533;&#534;&#535;&#7794;&#7795;&#7796;&#7797;&#7798;&#7799;&#7800;&#7801;&#7802;&#7803;&#7908;&#7909;&#7910;&#7911;&#7912;&#7913;&#7914;&#7915;&#7916;&#7917;&#7918;&#7919;&#7920;&#7921;Vv&#434;&#651;&#7804;&#7805;&#7806;&#7807;Ww&#372;&#373;&#7808;&#7809;&#7810;&#7811;&#7812;&#7813;&#7814;&#7815;&#7816;&#7817;&#7832;Xx&#7818;&#7819;&#7820;&#7821;Yy&#221;&#253;&#255;&#376;&#374;&#375;&#435;&#436;&#562;&#563;&#7822;&#7823;&#7833;&#7922;&#7923;&#7924;&#7925;&#7926;&#7927;&#7928;&#7929;Zz&#377;&#378;&#379;&#380;&#381;&#382;&#437;&#438;&#548;&#549;&#656;&#657;&#7824;&#7825;&#7826;&#7827;&#7828;&#7829;&#7829;','AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBCCCCCCCCCCCCCCCCCDDDDDDDDDDDDDDDDDDDDDDDDEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEFFFFFFGGGGGGGGGGGGGGGGGGGGHHHHHHHHHHHHHHHHHHHHIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIJJJJJJKKKKKKKKKKKKKKLLLLLLLLLLLLLLLLLLLLLLLLLLMMMMMMMMMNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOPPPPPPPPQQQRRRRRRRRRRRRRRRRRRRRRRRSSSSSSSSSSSSSSSSSSSSSSSTTTTTTTTTTTTTTTTTTTTTTTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUVVVVVVVVWWWWWWWWWWWWWWWXXXXXXYYYYYYYYYYYYYYYYYYYYYYYZZZZZZZZZZZZZZZZZZZZZ'))[count(ancestor::node()|$scope) = count(ancestor::node()) and ($role = @role or $type = @type or (string-length($role) = 0 and string-length($type) = 0))][1]) = 1]" mode="index-div-basic">
+ <xsl:with-param name="position" select="position()"/>
+ <xsl:with-param name="scope" select="$scope"/>
+ <xsl:with-param name="role" select="$role"/>
+ <xsl:with-param name="type" select="$type"/>
+ <xsl:sort select="translate(normalize-space(concat(primary/@sortas, &quot; &quot;, primary)), 'Aa&#192;&#224;&#193;&#225;&#194;&#226;&#195;&#227;&#196;&#228;&#197;&#229;&#256;&#257;&#258;&#259;&#260;&#261;&#461;&#462;&#478;&#479;&#480;&#481;&#506;&#507;&#512;&#513;&#514;&#515;&#550;&#551;&#7680;&#7681;&#7834;&#7840;&#7841;&#7842;&#7843;&#7844;&#7845;&#7846;&#7847;&#7848;&#7849;&#7850;&#7851;&#7852;&#7853;&#7854;&#7855;&#7856;&#7857;&#7858;&#7859;&#7860;&#7861;&#7862;&#7863;Bb&#384;&#385;&#595;&#386;&#387;&#7682;&#7683;&#7684;&#7685;&#7686;&#7687;Cc&#199;&#231;&#262;&#263;&#264;&#265;&#266;&#267;&#268;&#269;&#391;&#392;&#597;&#7688;&#7689;Dd&#270;&#271;&#272;&#273;&#394;&#599;&#395;&#396;&#453;&#498;&#545;&#598;&#7690;&#7691;&#7692;&#7693;&#7694;&#7695;&#7696;&#7697;&#7698;&#7699;Ee&#200;&#232;&#201;&#233;&#202;&#234;&#203;&#235;&#274;&#275;&#276;&#277;&#278;&#279;&#280;&#281;&#282;&#283;&#516;&#517;&#518;&#519;&#552;&#553;&#7700;&#7701;&#7702;&#7703;&#7704;&#7705;&#7706;&#7707;&#7708;&#7709;&#7864;&#7865;&#7866;&#7867;&#7868;&#7869;&#7870;&#7871;&#7872;&#7873;&#7874;&#7875;&#7876;&#7877;&#7878;&#7879;Ff&#401;&#402;&#7710;&#7711;Gg&#284;&#285;&#286;&#287;&#288;&#289;&#290;&#291;&#403;&#608;&#484;&#485;&#486;&#487;&#500;&#501;&#7712;&#7713;Hh&#292;&#293;&#294;&#295;&#542;&#543;&#614;&#7714;&#7715;&#7716;&#7717;&#7718;&#7719;&#7720;&#7721;&#7722;&#7723;&#7830;Ii&#204;&#236;&#205;&#237;&#206;&#238;&#207;&#239;&#296;&#297;&#298;&#299;&#300;&#301;&#302;&#303;&#304;&#407;&#616;&#463;&#464;&#520;&#521;&#522;&#523;&#7724;&#7725;&#7726;&#7727;&#7880;&#7881;&#7882;&#7883;Jj&#308;&#309;&#496;&#669;Kk&#310;&#311;&#408;&#409;&#488;&#489;&#7728;&#7729;&#7730;&#7731;&#7732;&#7733;Ll&#313;&#314;&#315;&#316;&#317;&#318;&#319;&#320;&#321;&#322;&#410;&#456;&#564;&#619;&#620;&#621;&#7734;&#7735;&#7736;&#7737;&#7738;&#7739;&#7740;&#7741;Mm&#625;&#7742;&#7743;&#7744;&#7745;&#7746;&#7747;Nn&#209;&#241;&#323;&#324;&#325;&#326;&#327;&#328;&#413;&#626;&#414;&#544;&#459;&#504;&#505;&#565;&#627;&#7748;&#7749;&#7750;&#7751;&#7752;&#7753;&#7754;&#7755;Oo&#210;&#242;&#211;&#243;&#212;&#244;&#213;&#245;&#214;&#246;&#216;&#248;&#332;&#333;&#334;&#335;&#336;&#337;&#415;&#416;&#417;&#465;&#466;&#490;&#491;&#492;&#493;&#510;&#511;&#524;&#525;&#526;&#527;&#554;&#555;&#556;&#557;&#558;&#559;&#560;&#561;&#7756;&#7757;&#7758;&#7759;&#7760;&#7761;&#7762;&#7763;&#7884;&#7885;&#7886;&#7887;&#7888;&#7889;&#7890;&#7891;&#7892;&#7893;&#7894;&#7895;&#7896;&#7897;&#7898;&#7899;&#7900;&#7901;&#7902;&#7903;&#7904;&#7905;&#7906;&#7907;Pp&#420;&#421;&#7764;&#7765;&#7766;&#7767;Qq&#672;Rr&#340;&#341;&#342;&#343;&#344;&#345;&#528;&#529;&#530;&#531;&#636;&#637;&#638;&#7768;&#7769;&#7770;&#7771;&#7772;&#7773;&#7774;&#7775;Ss&#346;&#347;&#348;&#349;&#350;&#351;&#352;&#353;&#536;&#537;&#642;&#7776;&#7777;&#7778;&#7779;&#7780;&#7781;&#7782;&#7783;&#7784;&#7785;Tt&#354;&#355;&#356;&#357;&#358;&#359;&#427;&#428;&#429;&#430;&#648;&#538;&#539;&#566;&#7786;&#7787;&#7788;&#7789;&#7790;&#7791;&#7792;&#7793;&#7831;Uu&#217;&#249;&#218;&#250;&#219;&#251;&#220;&#252;&#360;&#361;&#362;&#363;&#364;&#365;&#366;&#367;&#368;&#369;&#370;&#371;&#431;&#432;&#467;&#468;&#469;&#470;&#471;&#472;&#473;&#474;&#475;&#476;&#532;&#533;&#534;&#535;&#7794;&#7795;&#7796;&#7797;&#7798;&#7799;&#7800;&#7801;&#7802;&#7803;&#7908;&#7909;&#7910;&#7911;&#7912;&#7913;&#7914;&#7915;&#7916;&#7917;&#7918;&#7919;&#7920;&#7921;Vv&#434;&#651;&#7804;&#7805;&#7806;&#7807;Ww&#372;&#373;&#7808;&#7809;&#7810;&#7811;&#7812;&#7813;&#7814;&#7815;&#7816;&#7817;&#7832;Xx&#7818;&#7819;&#7820;&#7821;Yy&#221;&#253;&#255;&#376;&#374;&#375;&#435;&#436;&#562;&#563;&#7822;&#7823;&#7833;&#7922;&#7923;&#7924;&#7925;&#7926;&#7927;&#7928;&#7929;Zz&#377;&#378;&#379;&#380;&#381;&#382;&#437;&#438;&#548;&#549;&#656;&#657;&#7824;&#7825;&#7826;&#7827;&#7828;&#7829;&#7829;', 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBCCCCCCCCCCCCCCCCCDDDDDDDDDDDDDDDDDDDDDDDDEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEFFFFFFGGGGGGGGGGGGGGGGGGGGHHHHHHHHHHHHHHHHHHHHIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIJJJJJJKKKKKKKKKKKKKKLLLLLLLLLLLLLLLLLLLLLLLLLLMMMMMMMMMNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOPPPPPPPPQQQRRRRRRRRRRRRRRRRRRRRRRRSSSSSSSSSSSSSSSSSSSSSSSTTTTTTTTTTTTTTTTTTTTTTTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUVVVVVVVVWWWWWWWWWWWWWWWXXXXXXYYYYYYYYYYYYYYYYYYYYYYYZZZZZZZZZZZZZZZZZZZZZ')"/>
+ </xsl:apply-templates>
+ </div>
+</xsl:template>
+
+<!-- This template not used if html/autoidx-kosek.xsl is imported -->
+<xsl:template name="generate-kosek-index">
+ <xsl:param name="scope" select="NOTANODE"/>
+
+ <xsl:variable name="vendor" select="system-property('xsl:vendor')"/>
+ <xsl:if test="contains($vendor, 'libxslt')">
+ <xsl:message terminate="yes">
+ <xsl:text>ERROR: the 'kosek' index method does not </xsl:text>
+ <xsl:text>work with the xsltproc XSLT processor.</xsl:text>
+ </xsl:message>
+ </xsl:if>
+
+
+ <xsl:if test="$exsl.node.set.available = 0">
+ <xsl:message terminate="yes">
+ <xsl:text>ERROR: the 'kosek' index method requires the </xsl:text>
+ <xsl:text>exslt:node-set() function. Use a processor that </xsl:text>
+ <xsl:text>has it, or use a different index method.</xsl:text>
+ </xsl:message>
+ </xsl:if>
+
+ <xsl:if test="$kosek.imported = 0">
+ <xsl:message terminate="yes">
+ <xsl:text>ERROR: the 'kosek' index method requires the
+</xsl:text>
+ <xsl:text>kosek index extensions be imported:
+</xsl:text>
+ <xsl:text> xsl:import href="html/autoidx-kosek.xsl"</xsl:text>
+ </xsl:message>
+ </xsl:if>
+
+</xsl:template>
+
+<!-- This template not used if html/autoidx-kimber.xsl is imported -->
+<xsl:template name="generate-kimber-index">
+ <xsl:param name="scope" select="NOTANODE"/>
+
+ <xsl:variable name="vendor" select="system-property('xsl:vendor')"/>
+ <xsl:if test="not(contains($vendor, 'SAXON '))">
+ <xsl:message terminate="yes">
+ <xsl:text>ERROR: the 'kimber' index method requires the </xsl:text>
+ <xsl:text>Saxon version 6 or 8 XSLT processor.</xsl:text>
+ </xsl:message>
+ </xsl:if>
+
+ <xsl:if test="$kimber.imported = 0">
+ <xsl:message terminate="yes">
+ <xsl:text>ERROR: the 'kimber' index method requires the
+</xsl:text>
+ <xsl:text>kimber index extensions be imported:
+</xsl:text>
+ <xsl:text> xsl:import href="html/autoidx-kimber.xsl"</xsl:text>
+ </xsl:message>
+ </xsl:if>
+
+</xsl:template>
+
+<xsl:template match="indexterm" mode="index-div-basic">
+ <xsl:param name="scope" select="."/>
+ <xsl:param name="role" select="''"/>
+ <xsl:param name="type" select="''"/>
+
+ <xsl:variable name="key" select="translate(substring(normalize-space(concat(primary/@sortas, &quot; &quot;, primary)), 1, 1), 'Aa&#192;&#224;&#193;&#225;&#194;&#226;&#195;&#227;&#196;&#228;&#197;&#229;&#256;&#257;&#258;&#259;&#260;&#261;&#461;&#462;&#478;&#479;&#480;&#481;&#506;&#507;&#512;&#513;&#514;&#515;&#550;&#551;&#7680;&#7681;&#7834;&#7840;&#7841;&#7842;&#7843;&#7844;&#7845;&#7846;&#7847;&#7848;&#7849;&#7850;&#7851;&#7852;&#7853;&#7854;&#7855;&#7856;&#7857;&#7858;&#7859;&#7860;&#7861;&#7862;&#7863;Bb&#384;&#385;&#595;&#386;&#387;&#7682;&#7683;&#7684;&#7685;&#7686;&#7687;Cc&#199;&#231;&#262;&#263;&#264;&#265;&#266;&#267;&#268;&#269;&#391;&#392;&#597;&#7688;&#7689;Dd&#270;&#271;&#272;&#273;&#394;&#599;&#395;&#396;&#453;&#498;&#545;&#598;&#7690;&#7691;&#7692;&#7693;&#7694;&#7695;&#7696;&#7697;&#7698;&#7699;Ee&#200;&#232;&#201;&#233;&#202;&#234;&#203;&#235;&#274;&#275;&#276;&#277;&#278;&#279;&#280;&#281;&#282;&#283;&#516;&#517;&#518;&#519;&#552;&#553;&#7700;&#7701;&#7702;&#7703;&#7704;&#7705;&#7706;&#7707;&#7708;&#7709;&#7864;&#7865;&#7866;&#7867;&#7868;&#7869;&#7870;&#7871;&#7872;&#7873;&#7874;&#7875;&#7876;&#7877;&#7878;&#7879;Ff&#401;&#402;&#7710;&#7711;Gg&#284;&#285;&#286;&#287;&#288;&#289;&#290;&#291;&#403;&#608;&#484;&#485;&#486;&#487;&#500;&#501;&#7712;&#7713;Hh&#292;&#293;&#294;&#295;&#542;&#543;&#614;&#7714;&#7715;&#7716;&#7717;&#7718;&#7719;&#7720;&#7721;&#7722;&#7723;&#7830;Ii&#204;&#236;&#205;&#237;&#206;&#238;&#207;&#239;&#296;&#297;&#298;&#299;&#300;&#301;&#302;&#303;&#304;&#407;&#616;&#463;&#464;&#520;&#521;&#522;&#523;&#7724;&#7725;&#7726;&#7727;&#7880;&#7881;&#7882;&#7883;Jj&#308;&#309;&#496;&#669;Kk&#310;&#311;&#408;&#409;&#488;&#489;&#7728;&#7729;&#7730;&#7731;&#7732;&#7733;Ll&#313;&#314;&#315;&#316;&#317;&#318;&#319;&#320;&#321;&#322;&#410;&#456;&#564;&#619;&#620;&#621;&#7734;&#7735;&#7736;&#7737;&#7738;&#7739;&#7740;&#7741;Mm&#625;&#7742;&#7743;&#7744;&#7745;&#7746;&#7747;Nn&#209;&#241;&#323;&#324;&#325;&#326;&#327;&#328;&#413;&#626;&#414;&#544;&#459;&#504;&#505;&#565;&#627;&#7748;&#7749;&#7750;&#7751;&#7752;&#7753;&#7754;&#7755;Oo&#210;&#242;&#211;&#243;&#212;&#244;&#213;&#245;&#214;&#246;&#216;&#248;&#332;&#333;&#334;&#335;&#336;&#337;&#415;&#416;&#417;&#465;&#466;&#490;&#491;&#492;&#493;&#510;&#511;&#524;&#525;&#526;&#527;&#554;&#555;&#556;&#557;&#558;&#559;&#560;&#561;&#7756;&#7757;&#7758;&#7759;&#7760;&#7761;&#7762;&#7763;&#7884;&#7885;&#7886;&#7887;&#7888;&#7889;&#7890;&#7891;&#7892;&#7893;&#7894;&#7895;&#7896;&#7897;&#7898;&#7899;&#7900;&#7901;&#7902;&#7903;&#7904;&#7905;&#7906;&#7907;Pp&#420;&#421;&#7764;&#7765;&#7766;&#7767;Qq&#672;Rr&#340;&#341;&#342;&#343;&#344;&#345;&#528;&#529;&#530;&#531;&#636;&#637;&#638;&#7768;&#7769;&#7770;&#7771;&#7772;&#7773;&#7774;&#7775;Ss&#346;&#347;&#348;&#349;&#350;&#351;&#352;&#353;&#536;&#537;&#642;&#7776;&#7777;&#7778;&#7779;&#7780;&#7781;&#7782;&#7783;&#7784;&#7785;Tt&#354;&#355;&#356;&#357;&#358;&#359;&#427;&#428;&#429;&#430;&#648;&#538;&#539;&#566;&#7786;&#7787;&#7788;&#7789;&#7790;&#7791;&#7792;&#7793;&#7831;Uu&#217;&#249;&#218;&#250;&#219;&#251;&#220;&#252;&#360;&#361;&#362;&#363;&#364;&#365;&#366;&#367;&#368;&#369;&#370;&#371;&#431;&#432;&#467;&#468;&#469;&#470;&#471;&#472;&#473;&#474;&#475;&#476;&#532;&#533;&#534;&#535;&#7794;&#7795;&#7796;&#7797;&#7798;&#7799;&#7800;&#7801;&#7802;&#7803;&#7908;&#7909;&#7910;&#7911;&#7912;&#7913;&#7914;&#7915;&#7916;&#7917;&#7918;&#7919;&#7920;&#7921;Vv&#434;&#651;&#7804;&#7805;&#7806;&#7807;Ww&#372;&#373;&#7808;&#7809;&#7810;&#7811;&#7812;&#7813;&#7814;&#7815;&#7816;&#7817;&#7832;Xx&#7818;&#7819;&#7820;&#7821;Yy&#221;&#253;&#255;&#376;&#374;&#375;&#435;&#436;&#562;&#563;&#7822;&#7823;&#7833;&#7922;&#7923;&#7924;&#7925;&#7926;&#7927;&#7928;&#7929;Zz&#377;&#378;&#379;&#380;&#381;&#382;&#437;&#438;&#548;&#549;&#656;&#657;&#7824;&#7825;&#7826;&#7827;&#7828;&#7829;&#7829;','AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBCCCCCCCCCCCCCCCCCDDDDDDDDDDDDDDDDDDDDDDDDEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEFFFFFFGGGGGGGGGGGGGGGGGGGGHHHHHHHHHHHHHHHHHHHHIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIJJJJJJKKKKKKKKKKKKKKLLLLLLLLLLLLLLLLLLLLLLLLLLMMMMMMMMMNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOPPPPPPPPQQQRRRRRRRRRRRRRRRRRRRRRRRSSSSSSSSSSSSSSSSSSSSSSSTTTTTTTTTTTTTTTTTTTTTTTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUVVVVVVVVWWWWWWWWWWWWWWWXXXXXXYYYYYYYYYYYYYYYYYYYYYYYZZZZZZZZZZZZZZZZZZZZZ')"/>
+
+ <xsl:if test="key('letter', $key)[count(ancestor::node()|$scope) = count(ancestor::node()) and ($role = @role or $type = @type or (string-length($role) = 0 and string-length($type) = 0))] [count(.|key('primary', normalize-space(concat(primary/@sortas, &quot; &quot;, primary)))[count(ancestor::node()|$scope) = count(ancestor::node()) and ($role = @role or $type = @type or (string-length($role) = 0 and string-length($type) = 0))][1]) = 1]">
+ <div class="indexdiv">
+ <xsl:if test="contains(concat('Aa&#192;&#224;&#193;&#225;&#194;&#226;&#195;&#227;&#196;&#228;&#197;&#229;&#256;&#257;&#258;&#259;&#260;&#261;&#461;&#462;&#478;&#479;&#480;&#481;&#506;&#507;&#512;&#513;&#514;&#515;&#550;&#551;&#7680;&#7681;&#7834;&#7840;&#7841;&#7842;&#7843;&#7844;&#7845;&#7846;&#7847;&#7848;&#7849;&#7850;&#7851;&#7852;&#7853;&#7854;&#7855;&#7856;&#7857;&#7858;&#7859;&#7860;&#7861;&#7862;&#7863;Bb&#384;&#385;&#595;&#386;&#387;&#7682;&#7683;&#7684;&#7685;&#7686;&#7687;Cc&#199;&#231;&#262;&#263;&#264;&#265;&#266;&#267;&#268;&#269;&#391;&#392;&#597;&#7688;&#7689;Dd&#270;&#271;&#272;&#273;&#394;&#599;&#395;&#396;&#453;&#498;&#545;&#598;&#7690;&#7691;&#7692;&#7693;&#7694;&#7695;&#7696;&#7697;&#7698;&#7699;Ee&#200;&#232;&#201;&#233;&#202;&#234;&#203;&#235;&#274;&#275;&#276;&#277;&#278;&#279;&#280;&#281;&#282;&#283;&#516;&#517;&#518;&#519;&#552;&#553;&#7700;&#7701;&#7702;&#7703;&#7704;&#7705;&#7706;&#7707;&#7708;&#7709;&#7864;&#7865;&#7866;&#7867;&#7868;&#7869;&#7870;&#7871;&#7872;&#7873;&#7874;&#7875;&#7876;&#7877;&#7878;&#7879;Ff&#401;&#402;&#7710;&#7711;Gg&#284;&#285;&#286;&#287;&#288;&#289;&#290;&#291;&#403;&#608;&#484;&#485;&#486;&#487;&#500;&#501;&#7712;&#7713;Hh&#292;&#293;&#294;&#295;&#542;&#543;&#614;&#7714;&#7715;&#7716;&#7717;&#7718;&#7719;&#7720;&#7721;&#7722;&#7723;&#7830;Ii&#204;&#236;&#205;&#237;&#206;&#238;&#207;&#239;&#296;&#297;&#298;&#299;&#300;&#301;&#302;&#303;&#304;&#407;&#616;&#463;&#464;&#520;&#521;&#522;&#523;&#7724;&#7725;&#7726;&#7727;&#7880;&#7881;&#7882;&#7883;Jj&#308;&#309;&#496;&#669;Kk&#310;&#311;&#408;&#409;&#488;&#489;&#7728;&#7729;&#7730;&#7731;&#7732;&#7733;Ll&#313;&#314;&#315;&#316;&#317;&#318;&#319;&#320;&#321;&#322;&#410;&#456;&#564;&#619;&#620;&#621;&#7734;&#7735;&#7736;&#7737;&#7738;&#7739;&#7740;&#7741;Mm&#625;&#7742;&#7743;&#7744;&#7745;&#7746;&#7747;Nn&#209;&#241;&#323;&#324;&#325;&#326;&#327;&#328;&#413;&#626;&#414;&#544;&#459;&#504;&#505;&#565;&#627;&#7748;&#7749;&#7750;&#7751;&#7752;&#7753;&#7754;&#7755;Oo&#210;&#242;&#211;&#243;&#212;&#244;&#213;&#245;&#214;&#246;&#216;&#248;&#332;&#333;&#334;&#335;&#336;&#337;&#415;&#416;&#417;&#465;&#466;&#490;&#491;&#492;&#493;&#510;&#511;&#524;&#525;&#526;&#527;&#554;&#555;&#556;&#557;&#558;&#559;&#560;&#561;&#7756;&#7757;&#7758;&#7759;&#7760;&#7761;&#7762;&#7763;&#7884;&#7885;&#7886;&#7887;&#7888;&#7889;&#7890;&#7891;&#7892;&#7893;&#7894;&#7895;&#7896;&#7897;&#7898;&#7899;&#7900;&#7901;&#7902;&#7903;&#7904;&#7905;&#7906;&#7907;Pp&#420;&#421;&#7764;&#7765;&#7766;&#7767;Qq&#672;Rr&#340;&#341;&#342;&#343;&#344;&#345;&#528;&#529;&#530;&#531;&#636;&#637;&#638;&#7768;&#7769;&#7770;&#7771;&#7772;&#7773;&#7774;&#7775;Ss&#346;&#347;&#348;&#349;&#350;&#351;&#352;&#353;&#536;&#537;&#642;&#7776;&#7777;&#7778;&#7779;&#7780;&#7781;&#7782;&#7783;&#7784;&#7785;Tt&#354;&#355;&#356;&#357;&#358;&#359;&#427;&#428;&#429;&#430;&#648;&#538;&#539;&#566;&#7786;&#7787;&#7788;&#7789;&#7790;&#7791;&#7792;&#7793;&#7831;Uu&#217;&#249;&#218;&#250;&#219;&#251;&#220;&#252;&#360;&#361;&#362;&#363;&#364;&#365;&#366;&#367;&#368;&#369;&#370;&#371;&#431;&#432;&#467;&#468;&#469;&#470;&#471;&#472;&#473;&#474;&#475;&#476;&#532;&#533;&#534;&#535;&#7794;&#7795;&#7796;&#7797;&#7798;&#7799;&#7800;&#7801;&#7802;&#7803;&#7908;&#7909;&#7910;&#7911;&#7912;&#7913;&#7914;&#7915;&#7916;&#7917;&#7918;&#7919;&#7920;&#7921;Vv&#434;&#651;&#7804;&#7805;&#7806;&#7807;Ww&#372;&#373;&#7808;&#7809;&#7810;&#7811;&#7812;&#7813;&#7814;&#7815;&#7816;&#7817;&#7832;Xx&#7818;&#7819;&#7820;&#7821;Yy&#221;&#253;&#255;&#376;&#374;&#375;&#435;&#436;&#562;&#563;&#7822;&#7823;&#7833;&#7922;&#7923;&#7924;&#7925;&#7926;&#7927;&#7928;&#7929;Zz&#377;&#378;&#379;&#380;&#381;&#382;&#437;&#438;&#548;&#549;&#656;&#657;&#7824;&#7825;&#7826;&#7827;&#7828;&#7829;&#7829;', 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBCCCCCCCCCCCCCCCCCDDDDDDDDDDDDDDDDDDDDDDDDEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEFFFFFFGGGGGGGGGGGGGGGGGGGGHHHHHHHHHHHHHHHHHHHHIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIJJJJJJKKKKKKKKKKKKKKLLLLLLLLLLLLLLLLLLLLLLLLLLMMMMMMMMMNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOPPPPPPPPQQQRRRRRRRRRRRRRRRRRRRRRRRSSSSSSSSSSSSSSSSSSSSSSSTTTTTTTTTTTTTTTTTTTTTTTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUVVVVVVVVWWWWWWWWWWWWWWWXXXXXXYYYYYYYYYYYYYYYYYYYYYYYZZZZZZZZZZZZZZZZZZZZZ'), $key)">
+ <h3>
+ <xsl:value-of select="translate($key, 'Aa&#192;&#224;&#193;&#225;&#194;&#226;&#195;&#227;&#196;&#228;&#197;&#229;&#256;&#257;&#258;&#259;&#260;&#261;&#461;&#462;&#478;&#479;&#480;&#481;&#506;&#507;&#512;&#513;&#514;&#515;&#550;&#551;&#7680;&#7681;&#7834;&#7840;&#7841;&#7842;&#7843;&#7844;&#7845;&#7846;&#7847;&#7848;&#7849;&#7850;&#7851;&#7852;&#7853;&#7854;&#7855;&#7856;&#7857;&#7858;&#7859;&#7860;&#7861;&#7862;&#7863;Bb&#384;&#385;&#595;&#386;&#387;&#7682;&#7683;&#7684;&#7685;&#7686;&#7687;Cc&#199;&#231;&#262;&#263;&#264;&#265;&#266;&#267;&#268;&#269;&#391;&#392;&#597;&#7688;&#7689;Dd&#270;&#271;&#272;&#273;&#394;&#599;&#395;&#396;&#453;&#498;&#545;&#598;&#7690;&#7691;&#7692;&#7693;&#7694;&#7695;&#7696;&#7697;&#7698;&#7699;Ee&#200;&#232;&#201;&#233;&#202;&#234;&#203;&#235;&#274;&#275;&#276;&#277;&#278;&#279;&#280;&#281;&#282;&#283;&#516;&#517;&#518;&#519;&#552;&#553;&#7700;&#7701;&#7702;&#7703;&#7704;&#7705;&#7706;&#7707;&#7708;&#7709;&#7864;&#7865;&#7866;&#7867;&#7868;&#7869;&#7870;&#7871;&#7872;&#7873;&#7874;&#7875;&#7876;&#7877;&#7878;&#7879;Ff&#401;&#402;&#7710;&#7711;Gg&#284;&#285;&#286;&#287;&#288;&#289;&#290;&#291;&#403;&#608;&#484;&#485;&#486;&#487;&#500;&#501;&#7712;&#7713;Hh&#292;&#293;&#294;&#295;&#542;&#543;&#614;&#7714;&#7715;&#7716;&#7717;&#7718;&#7719;&#7720;&#7721;&#7722;&#7723;&#7830;Ii&#204;&#236;&#205;&#237;&#206;&#238;&#207;&#239;&#296;&#297;&#298;&#299;&#300;&#301;&#302;&#303;&#304;&#407;&#616;&#463;&#464;&#520;&#521;&#522;&#523;&#7724;&#7725;&#7726;&#7727;&#7880;&#7881;&#7882;&#7883;Jj&#308;&#309;&#496;&#669;Kk&#310;&#311;&#408;&#409;&#488;&#489;&#7728;&#7729;&#7730;&#7731;&#7732;&#7733;Ll&#313;&#314;&#315;&#316;&#317;&#318;&#319;&#320;&#321;&#322;&#410;&#456;&#564;&#619;&#620;&#621;&#7734;&#7735;&#7736;&#7737;&#7738;&#7739;&#7740;&#7741;Mm&#625;&#7742;&#7743;&#7744;&#7745;&#7746;&#7747;Nn&#209;&#241;&#323;&#324;&#325;&#326;&#327;&#328;&#413;&#626;&#414;&#544;&#459;&#504;&#505;&#565;&#627;&#7748;&#7749;&#7750;&#7751;&#7752;&#7753;&#7754;&#7755;Oo&#210;&#242;&#211;&#243;&#212;&#244;&#213;&#245;&#214;&#246;&#216;&#248;&#332;&#333;&#334;&#335;&#336;&#337;&#415;&#416;&#417;&#465;&#466;&#490;&#491;&#492;&#493;&#510;&#511;&#524;&#525;&#526;&#527;&#554;&#555;&#556;&#557;&#558;&#559;&#560;&#561;&#7756;&#7757;&#7758;&#7759;&#7760;&#7761;&#7762;&#7763;&#7884;&#7885;&#7886;&#7887;&#7888;&#7889;&#7890;&#7891;&#7892;&#7893;&#7894;&#7895;&#7896;&#7897;&#7898;&#7899;&#7900;&#7901;&#7902;&#7903;&#7904;&#7905;&#7906;&#7907;Pp&#420;&#421;&#7764;&#7765;&#7766;&#7767;Qq&#672;Rr&#340;&#341;&#342;&#343;&#344;&#345;&#528;&#529;&#530;&#531;&#636;&#637;&#638;&#7768;&#7769;&#7770;&#7771;&#7772;&#7773;&#7774;&#7775;Ss&#346;&#347;&#348;&#349;&#350;&#351;&#352;&#353;&#536;&#537;&#642;&#7776;&#7777;&#7778;&#7779;&#7780;&#7781;&#7782;&#7783;&#7784;&#7785;Tt&#354;&#355;&#356;&#357;&#358;&#359;&#427;&#428;&#429;&#430;&#648;&#538;&#539;&#566;&#7786;&#7787;&#7788;&#7789;&#7790;&#7791;&#7792;&#7793;&#7831;Uu&#217;&#249;&#218;&#250;&#219;&#251;&#220;&#252;&#360;&#361;&#362;&#363;&#364;&#365;&#366;&#367;&#368;&#369;&#370;&#371;&#431;&#432;&#467;&#468;&#469;&#470;&#471;&#472;&#473;&#474;&#475;&#476;&#532;&#533;&#534;&#535;&#7794;&#7795;&#7796;&#7797;&#7798;&#7799;&#7800;&#7801;&#7802;&#7803;&#7908;&#7909;&#7910;&#7911;&#7912;&#7913;&#7914;&#7915;&#7916;&#7917;&#7918;&#7919;&#7920;&#7921;Vv&#434;&#651;&#7804;&#7805;&#7806;&#7807;Ww&#372;&#373;&#7808;&#7809;&#7810;&#7811;&#7812;&#7813;&#7814;&#7815;&#7816;&#7817;&#7832;Xx&#7818;&#7819;&#7820;&#7821;Yy&#221;&#253;&#255;&#376;&#374;&#375;&#435;&#436;&#562;&#563;&#7822;&#7823;&#7833;&#7922;&#7923;&#7924;&#7925;&#7926;&#7927;&#7928;&#7929;Zz&#377;&#378;&#379;&#380;&#381;&#382;&#437;&#438;&#548;&#549;&#656;&#657;&#7824;&#7825;&#7826;&#7827;&#7828;&#7829;&#7829;', 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBCCCCCCCCCCCCCCCCCDDDDDDDDDDDDDDDDDDDDDDDDEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEFFFFFFGGGGGGGGGGGGGGGGGGGGHHHHHHHHHHHHHHHHHHHHIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIJJJJJJKKKKKKKKKKKKKKLLLLLLLLLLLLLLLLLLLLLLLLLLMMMMMMMMMNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOPPPPPPPPQQQRRRRRRRRRRRRRRRRRRRRRRRSSSSSSSSSSSSSSSSSSSSSSSTTTTTTTTTTTTTTTTTTTTTTTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUVVVVVVVVWWWWWWWWWWWWWWWXXXXXXYYYYYYYYYYYYYYYYYYYYYYYZZZZZZZZZZZZZZZZZZZZZ')"/>
+ </h3>
+ </xsl:if>
+ <dl>
+ <xsl:apply-templates select="key('letter', $key)[count(ancestor::node()|$scope) = count(ancestor::node()) and ($role = @role or $type = @type or (string-length($role) = 0 and string-length($type) = 0))] [count(.|key('primary', normalize-space(concat(primary/@sortas, &quot; &quot;, primary))) [count(ancestor::node()|$scope) = count(ancestor::node()) and ($role = @role or $type = @type or (string-length($role) = 0 and string-length($type) = 0))][1])=1]" mode="index-primary">
+ <xsl:with-param name="position" select="position()"/>
+ <xsl:with-param name="scope" select="$scope"/>
+ <xsl:with-param name="role" select="$role"/>
+ <xsl:with-param name="type" select="$type"/>
+ <xsl:sort select="translate(normalize-space(concat(primary/@sortas, &quot; &quot;, primary)), 'Aa&#192;&#224;&#193;&#225;&#194;&#226;&#195;&#227;&#196;&#228;&#197;&#229;&#256;&#257;&#258;&#259;&#260;&#261;&#461;&#462;&#478;&#479;&#480;&#481;&#506;&#507;&#512;&#513;&#514;&#515;&#550;&#551;&#7680;&#7681;&#7834;&#7840;&#7841;&#7842;&#7843;&#7844;&#7845;&#7846;&#7847;&#7848;&#7849;&#7850;&#7851;&#7852;&#7853;&#7854;&#7855;&#7856;&#7857;&#7858;&#7859;&#7860;&#7861;&#7862;&#7863;Bb&#384;&#385;&#595;&#386;&#387;&#7682;&#7683;&#7684;&#7685;&#7686;&#7687;Cc&#199;&#231;&#262;&#263;&#264;&#265;&#266;&#267;&#268;&#269;&#391;&#392;&#597;&#7688;&#7689;Dd&#270;&#271;&#272;&#273;&#394;&#599;&#395;&#396;&#453;&#498;&#545;&#598;&#7690;&#7691;&#7692;&#7693;&#7694;&#7695;&#7696;&#7697;&#7698;&#7699;Ee&#200;&#232;&#201;&#233;&#202;&#234;&#203;&#235;&#274;&#275;&#276;&#277;&#278;&#279;&#280;&#281;&#282;&#283;&#516;&#517;&#518;&#519;&#552;&#553;&#7700;&#7701;&#7702;&#7703;&#7704;&#7705;&#7706;&#7707;&#7708;&#7709;&#7864;&#7865;&#7866;&#7867;&#7868;&#7869;&#7870;&#7871;&#7872;&#7873;&#7874;&#7875;&#7876;&#7877;&#7878;&#7879;Ff&#401;&#402;&#7710;&#7711;Gg&#284;&#285;&#286;&#287;&#288;&#289;&#290;&#291;&#403;&#608;&#484;&#485;&#486;&#487;&#500;&#501;&#7712;&#7713;Hh&#292;&#293;&#294;&#295;&#542;&#543;&#614;&#7714;&#7715;&#7716;&#7717;&#7718;&#7719;&#7720;&#7721;&#7722;&#7723;&#7830;Ii&#204;&#236;&#205;&#237;&#206;&#238;&#207;&#239;&#296;&#297;&#298;&#299;&#300;&#301;&#302;&#303;&#304;&#407;&#616;&#463;&#464;&#520;&#521;&#522;&#523;&#7724;&#7725;&#7726;&#7727;&#7880;&#7881;&#7882;&#7883;Jj&#308;&#309;&#496;&#669;Kk&#310;&#311;&#408;&#409;&#488;&#489;&#7728;&#7729;&#7730;&#7731;&#7732;&#7733;Ll&#313;&#314;&#315;&#316;&#317;&#318;&#319;&#320;&#321;&#322;&#410;&#456;&#564;&#619;&#620;&#621;&#7734;&#7735;&#7736;&#7737;&#7738;&#7739;&#7740;&#7741;Mm&#625;&#7742;&#7743;&#7744;&#7745;&#7746;&#7747;Nn&#209;&#241;&#323;&#324;&#325;&#326;&#327;&#328;&#413;&#626;&#414;&#544;&#459;&#504;&#505;&#565;&#627;&#7748;&#7749;&#7750;&#7751;&#7752;&#7753;&#7754;&#7755;Oo&#210;&#242;&#211;&#243;&#212;&#244;&#213;&#245;&#214;&#246;&#216;&#248;&#332;&#333;&#334;&#335;&#336;&#337;&#415;&#416;&#417;&#465;&#466;&#490;&#491;&#492;&#493;&#510;&#511;&#524;&#525;&#526;&#527;&#554;&#555;&#556;&#557;&#558;&#559;&#560;&#561;&#7756;&#7757;&#7758;&#7759;&#7760;&#7761;&#7762;&#7763;&#7884;&#7885;&#7886;&#7887;&#7888;&#7889;&#7890;&#7891;&#7892;&#7893;&#7894;&#7895;&#7896;&#7897;&#7898;&#7899;&#7900;&#7901;&#7902;&#7903;&#7904;&#7905;&#7906;&#7907;Pp&#420;&#421;&#7764;&#7765;&#7766;&#7767;Qq&#672;Rr&#340;&#341;&#342;&#343;&#344;&#345;&#528;&#529;&#530;&#531;&#636;&#637;&#638;&#7768;&#7769;&#7770;&#7771;&#7772;&#7773;&#7774;&#7775;Ss&#346;&#347;&#348;&#349;&#350;&#351;&#352;&#353;&#536;&#537;&#642;&#7776;&#7777;&#7778;&#7779;&#7780;&#7781;&#7782;&#7783;&#7784;&#7785;Tt&#354;&#355;&#356;&#357;&#358;&#359;&#427;&#428;&#429;&#430;&#648;&#538;&#539;&#566;&#7786;&#7787;&#7788;&#7789;&#7790;&#7791;&#7792;&#7793;&#7831;Uu&#217;&#249;&#218;&#250;&#219;&#251;&#220;&#252;&#360;&#361;&#362;&#363;&#364;&#365;&#366;&#367;&#368;&#369;&#370;&#371;&#431;&#432;&#467;&#468;&#469;&#470;&#471;&#472;&#473;&#474;&#475;&#476;&#532;&#533;&#534;&#535;&#7794;&#7795;&#7796;&#7797;&#7798;&#7799;&#7800;&#7801;&#7802;&#7803;&#7908;&#7909;&#7910;&#7911;&#7912;&#7913;&#7914;&#7915;&#7916;&#7917;&#7918;&#7919;&#7920;&#7921;Vv&#434;&#651;&#7804;&#7805;&#7806;&#7807;Ww&#372;&#373;&#7808;&#7809;&#7810;&#7811;&#7812;&#7813;&#7814;&#7815;&#7816;&#7817;&#7832;Xx&#7818;&#7819;&#7820;&#7821;Yy&#221;&#253;&#255;&#376;&#374;&#375;&#435;&#436;&#562;&#563;&#7822;&#7823;&#7833;&#7922;&#7923;&#7924;&#7925;&#7926;&#7927;&#7928;&#7929;Zz&#377;&#378;&#379;&#380;&#381;&#382;&#437;&#438;&#548;&#549;&#656;&#657;&#7824;&#7825;&#7826;&#7827;&#7828;&#7829;&#7829;', 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBCCCCCCCCCCCCCCCCCDDDDDDDDDDDDDDDDDDDDDDDDEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEFFFFFFGGGGGGGGGGGGGGGGGGGGHHHHHHHHHHHHHHHHHHHHIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIJJJJJJKKKKKKKKKKKKKKLLLLLLLLLLLLLLLLLLLLLLLLLLMMMMMMMMMNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOPPPPPPPPQQQRRRRRRRRRRRRRRRRRRRRRRRSSSSSSSSSSSSSSSSSSSSSSSTTTTTTTTTTTTTTTTTTTTTTTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUVVVVVVVVWWWWWWWWWWWWWWWXXXXXXYYYYYYYYYYYYYYYYYYYYYYYZZZZZZZZZZZZZZZZZZZZZ')"/>
+ </xsl:apply-templates>
+ </dl>
+ </div>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="indexterm" mode="index-symbol-div">
+ <xsl:param name="scope" select="/"/>
+ <xsl:param name="role" select="''"/>
+ <xsl:param name="type" select="''"/>
+
+ <xsl:variable name="key" select="translate(substring(normalize-space(concat(primary/@sortas, &quot; &quot;, primary)), 1, 1), 'Aa&#192;&#224;&#193;&#225;&#194;&#226;&#195;&#227;&#196;&#228;&#197;&#229;&#256;&#257;&#258;&#259;&#260;&#261;&#461;&#462;&#478;&#479;&#480;&#481;&#506;&#507;&#512;&#513;&#514;&#515;&#550;&#551;&#7680;&#7681;&#7834;&#7840;&#7841;&#7842;&#7843;&#7844;&#7845;&#7846;&#7847;&#7848;&#7849;&#7850;&#7851;&#7852;&#7853;&#7854;&#7855;&#7856;&#7857;&#7858;&#7859;&#7860;&#7861;&#7862;&#7863;Bb&#384;&#385;&#595;&#386;&#387;&#7682;&#7683;&#7684;&#7685;&#7686;&#7687;Cc&#199;&#231;&#262;&#263;&#264;&#265;&#266;&#267;&#268;&#269;&#391;&#392;&#597;&#7688;&#7689;Dd&#270;&#271;&#272;&#273;&#394;&#599;&#395;&#396;&#453;&#498;&#545;&#598;&#7690;&#7691;&#7692;&#7693;&#7694;&#7695;&#7696;&#7697;&#7698;&#7699;Ee&#200;&#232;&#201;&#233;&#202;&#234;&#203;&#235;&#274;&#275;&#276;&#277;&#278;&#279;&#280;&#281;&#282;&#283;&#516;&#517;&#518;&#519;&#552;&#553;&#7700;&#7701;&#7702;&#7703;&#7704;&#7705;&#7706;&#7707;&#7708;&#7709;&#7864;&#7865;&#7866;&#7867;&#7868;&#7869;&#7870;&#7871;&#7872;&#7873;&#7874;&#7875;&#7876;&#7877;&#7878;&#7879;Ff&#401;&#402;&#7710;&#7711;Gg&#284;&#285;&#286;&#287;&#288;&#289;&#290;&#291;&#403;&#608;&#484;&#485;&#486;&#487;&#500;&#501;&#7712;&#7713;Hh&#292;&#293;&#294;&#295;&#542;&#543;&#614;&#7714;&#7715;&#7716;&#7717;&#7718;&#7719;&#7720;&#7721;&#7722;&#7723;&#7830;Ii&#204;&#236;&#205;&#237;&#206;&#238;&#207;&#239;&#296;&#297;&#298;&#299;&#300;&#301;&#302;&#303;&#304;&#407;&#616;&#463;&#464;&#520;&#521;&#522;&#523;&#7724;&#7725;&#7726;&#7727;&#7880;&#7881;&#7882;&#7883;Jj&#308;&#309;&#496;&#669;Kk&#310;&#311;&#408;&#409;&#488;&#489;&#7728;&#7729;&#7730;&#7731;&#7732;&#7733;Ll&#313;&#314;&#315;&#316;&#317;&#318;&#319;&#320;&#321;&#322;&#410;&#456;&#564;&#619;&#620;&#621;&#7734;&#7735;&#7736;&#7737;&#7738;&#7739;&#7740;&#7741;Mm&#625;&#7742;&#7743;&#7744;&#7745;&#7746;&#7747;Nn&#209;&#241;&#323;&#324;&#325;&#326;&#327;&#328;&#413;&#626;&#414;&#544;&#459;&#504;&#505;&#565;&#627;&#7748;&#7749;&#7750;&#7751;&#7752;&#7753;&#7754;&#7755;Oo&#210;&#242;&#211;&#243;&#212;&#244;&#213;&#245;&#214;&#246;&#216;&#248;&#332;&#333;&#334;&#335;&#336;&#337;&#415;&#416;&#417;&#465;&#466;&#490;&#491;&#492;&#493;&#510;&#511;&#524;&#525;&#526;&#527;&#554;&#555;&#556;&#557;&#558;&#559;&#560;&#561;&#7756;&#7757;&#7758;&#7759;&#7760;&#7761;&#7762;&#7763;&#7884;&#7885;&#7886;&#7887;&#7888;&#7889;&#7890;&#7891;&#7892;&#7893;&#7894;&#7895;&#7896;&#7897;&#7898;&#7899;&#7900;&#7901;&#7902;&#7903;&#7904;&#7905;&#7906;&#7907;Pp&#420;&#421;&#7764;&#7765;&#7766;&#7767;Qq&#672;Rr&#340;&#341;&#342;&#343;&#344;&#345;&#528;&#529;&#530;&#531;&#636;&#637;&#638;&#7768;&#7769;&#7770;&#7771;&#7772;&#7773;&#7774;&#7775;Ss&#346;&#347;&#348;&#349;&#350;&#351;&#352;&#353;&#536;&#537;&#642;&#7776;&#7777;&#7778;&#7779;&#7780;&#7781;&#7782;&#7783;&#7784;&#7785;Tt&#354;&#355;&#356;&#357;&#358;&#359;&#427;&#428;&#429;&#430;&#648;&#538;&#539;&#566;&#7786;&#7787;&#7788;&#7789;&#7790;&#7791;&#7792;&#7793;&#7831;Uu&#217;&#249;&#218;&#250;&#219;&#251;&#220;&#252;&#360;&#361;&#362;&#363;&#364;&#365;&#366;&#367;&#368;&#369;&#370;&#371;&#431;&#432;&#467;&#468;&#469;&#470;&#471;&#472;&#473;&#474;&#475;&#476;&#532;&#533;&#534;&#535;&#7794;&#7795;&#7796;&#7797;&#7798;&#7799;&#7800;&#7801;&#7802;&#7803;&#7908;&#7909;&#7910;&#7911;&#7912;&#7913;&#7914;&#7915;&#7916;&#7917;&#7918;&#7919;&#7920;&#7921;Vv&#434;&#651;&#7804;&#7805;&#7806;&#7807;Ww&#372;&#373;&#7808;&#7809;&#7810;&#7811;&#7812;&#7813;&#7814;&#7815;&#7816;&#7817;&#7832;Xx&#7818;&#7819;&#7820;&#7821;Yy&#221;&#253;&#255;&#376;&#374;&#375;&#435;&#436;&#562;&#563;&#7822;&#7823;&#7833;&#7922;&#7923;&#7924;&#7925;&#7926;&#7927;&#7928;&#7929;Zz&#377;&#378;&#379;&#380;&#381;&#382;&#437;&#438;&#548;&#549;&#656;&#657;&#7824;&#7825;&#7826;&#7827;&#7828;&#7829;&#7829;','AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBCCCCCCCCCCCCCCCCCDDDDDDDDDDDDDDDDDDDDDDDDEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEFFFFFFGGGGGGGGGGGGGGGGGGGGHHHHHHHHHHHHHHHHHHHHIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIJJJJJJKKKKKKKKKKKKKKLLLLLLLLLLLLLLLLLLLLLLLLLLMMMMMMMMMNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOPPPPPPPPQQQRRRRRRRRRRRRRRRRRRRRRRRSSSSSSSSSSSSSSSSSSSSSSSTTTTTTTTTTTTTTTTTTTTTTTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUVVVVVVVVWWWWWWWWWWWWWWWXXXXXXYYYYYYYYYYYYYYYYYYYYYYYZZZZZZZZZZZZZZZZZZZZZ')"/>
+
+ <xsl:apply-templates select="key('letter', $key) [count(ancestor::node()|$scope) = count(ancestor::node()) and ($role = @role or $type = @type or (string-length($role) = 0 and string-length($type) = 0))][count(.|key('primary', normalize-space(concat(primary/@sortas, &quot; &quot;, primary)))[1]) = 1]" mode="index-primary">
+ <xsl:with-param name="position" select="position()"/>
+ <xsl:with-param name="scope" select="$scope"/>
+ <xsl:with-param name="role" select="$role"/>
+ <xsl:with-param name="type" select="$type"/>
+ <xsl:sort select="translate(normalize-space(concat(primary/@sortas, &quot; &quot;, primary)), 'Aa&#192;&#224;&#193;&#225;&#194;&#226;&#195;&#227;&#196;&#228;&#197;&#229;&#256;&#257;&#258;&#259;&#260;&#261;&#461;&#462;&#478;&#479;&#480;&#481;&#506;&#507;&#512;&#513;&#514;&#515;&#550;&#551;&#7680;&#7681;&#7834;&#7840;&#7841;&#7842;&#7843;&#7844;&#7845;&#7846;&#7847;&#7848;&#7849;&#7850;&#7851;&#7852;&#7853;&#7854;&#7855;&#7856;&#7857;&#7858;&#7859;&#7860;&#7861;&#7862;&#7863;Bb&#384;&#385;&#595;&#386;&#387;&#7682;&#7683;&#7684;&#7685;&#7686;&#7687;Cc&#199;&#231;&#262;&#263;&#264;&#265;&#266;&#267;&#268;&#269;&#391;&#392;&#597;&#7688;&#7689;Dd&#270;&#271;&#272;&#273;&#394;&#599;&#395;&#396;&#453;&#498;&#545;&#598;&#7690;&#7691;&#7692;&#7693;&#7694;&#7695;&#7696;&#7697;&#7698;&#7699;Ee&#200;&#232;&#201;&#233;&#202;&#234;&#203;&#235;&#274;&#275;&#276;&#277;&#278;&#279;&#280;&#281;&#282;&#283;&#516;&#517;&#518;&#519;&#552;&#553;&#7700;&#7701;&#7702;&#7703;&#7704;&#7705;&#7706;&#7707;&#7708;&#7709;&#7864;&#7865;&#7866;&#7867;&#7868;&#7869;&#7870;&#7871;&#7872;&#7873;&#7874;&#7875;&#7876;&#7877;&#7878;&#7879;Ff&#401;&#402;&#7710;&#7711;Gg&#284;&#285;&#286;&#287;&#288;&#289;&#290;&#291;&#403;&#608;&#484;&#485;&#486;&#487;&#500;&#501;&#7712;&#7713;Hh&#292;&#293;&#294;&#295;&#542;&#543;&#614;&#7714;&#7715;&#7716;&#7717;&#7718;&#7719;&#7720;&#7721;&#7722;&#7723;&#7830;Ii&#204;&#236;&#205;&#237;&#206;&#238;&#207;&#239;&#296;&#297;&#298;&#299;&#300;&#301;&#302;&#303;&#304;&#407;&#616;&#463;&#464;&#520;&#521;&#522;&#523;&#7724;&#7725;&#7726;&#7727;&#7880;&#7881;&#7882;&#7883;Jj&#308;&#309;&#496;&#669;Kk&#310;&#311;&#408;&#409;&#488;&#489;&#7728;&#7729;&#7730;&#7731;&#7732;&#7733;Ll&#313;&#314;&#315;&#316;&#317;&#318;&#319;&#320;&#321;&#322;&#410;&#456;&#564;&#619;&#620;&#621;&#7734;&#7735;&#7736;&#7737;&#7738;&#7739;&#7740;&#7741;Mm&#625;&#7742;&#7743;&#7744;&#7745;&#7746;&#7747;Nn&#209;&#241;&#323;&#324;&#325;&#326;&#327;&#328;&#413;&#626;&#414;&#544;&#459;&#504;&#505;&#565;&#627;&#7748;&#7749;&#7750;&#7751;&#7752;&#7753;&#7754;&#7755;Oo&#210;&#242;&#211;&#243;&#212;&#244;&#213;&#245;&#214;&#246;&#216;&#248;&#332;&#333;&#334;&#335;&#336;&#337;&#415;&#416;&#417;&#465;&#466;&#490;&#491;&#492;&#493;&#510;&#511;&#524;&#525;&#526;&#527;&#554;&#555;&#556;&#557;&#558;&#559;&#560;&#561;&#7756;&#7757;&#7758;&#7759;&#7760;&#7761;&#7762;&#7763;&#7884;&#7885;&#7886;&#7887;&#7888;&#7889;&#7890;&#7891;&#7892;&#7893;&#7894;&#7895;&#7896;&#7897;&#7898;&#7899;&#7900;&#7901;&#7902;&#7903;&#7904;&#7905;&#7906;&#7907;Pp&#420;&#421;&#7764;&#7765;&#7766;&#7767;Qq&#672;Rr&#340;&#341;&#342;&#343;&#344;&#345;&#528;&#529;&#530;&#531;&#636;&#637;&#638;&#7768;&#7769;&#7770;&#7771;&#7772;&#7773;&#7774;&#7775;Ss&#346;&#347;&#348;&#349;&#350;&#351;&#352;&#353;&#536;&#537;&#642;&#7776;&#7777;&#7778;&#7779;&#7780;&#7781;&#7782;&#7783;&#7784;&#7785;Tt&#354;&#355;&#356;&#357;&#358;&#359;&#427;&#428;&#429;&#430;&#648;&#538;&#539;&#566;&#7786;&#7787;&#7788;&#7789;&#7790;&#7791;&#7792;&#7793;&#7831;Uu&#217;&#249;&#218;&#250;&#219;&#251;&#220;&#252;&#360;&#361;&#362;&#363;&#364;&#365;&#366;&#367;&#368;&#369;&#370;&#371;&#431;&#432;&#467;&#468;&#469;&#470;&#471;&#472;&#473;&#474;&#475;&#476;&#532;&#533;&#534;&#535;&#7794;&#7795;&#7796;&#7797;&#7798;&#7799;&#7800;&#7801;&#7802;&#7803;&#7908;&#7909;&#7910;&#7911;&#7912;&#7913;&#7914;&#7915;&#7916;&#7917;&#7918;&#7919;&#7920;&#7921;Vv&#434;&#651;&#7804;&#7805;&#7806;&#7807;Ww&#372;&#373;&#7808;&#7809;&#7810;&#7811;&#7812;&#7813;&#7814;&#7815;&#7816;&#7817;&#7832;Xx&#7818;&#7819;&#7820;&#7821;Yy&#221;&#253;&#255;&#376;&#374;&#375;&#435;&#436;&#562;&#563;&#7822;&#7823;&#7833;&#7922;&#7923;&#7924;&#7925;&#7926;&#7927;&#7928;&#7929;Zz&#377;&#378;&#379;&#380;&#381;&#382;&#437;&#438;&#548;&#549;&#656;&#657;&#7824;&#7825;&#7826;&#7827;&#7828;&#7829;&#7829;', 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBCCCCCCCCCCCCCCCCCDDDDDDDDDDDDDDDDDDDDDDDDEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEFFFFFFGGGGGGGGGGGGGGGGGGGGHHHHHHHHHHHHHHHHHHHHIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIJJJJJJKKKKKKKKKKKKKKLLLLLLLLLLLLLLLLLLLLLLLLLLMMMMMMMMMNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOPPPPPPPPQQQRRRRRRRRRRRRRRRRRRRRRRRSSSSSSSSSSSSSSSSSSSSSSSTTTTTTTTTTTTTTTTTTTTTTTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUVVVVVVVVWWWWWWWWWWWWWWWXXXXXXYYYYYYYYYYYYYYYYYYYYYYYZZZZZZZZZZZZZZZZZZZZZ')"/>
+ </xsl:apply-templates>
+</xsl:template>
+
+<xsl:template match="indexterm" mode="index-primary">
+ <xsl:param name="scope" select="."/>
+ <xsl:param name="role" select="''"/>
+ <xsl:param name="type" select="''"/>
+
+ <xsl:variable name="key" select="normalize-space(concat(primary/@sortas, &quot; &quot;, primary))"/>
+ <xsl:variable name="refs" select="key('primary', $key)[count(ancestor::node()|$scope) = count(ancestor::node()) and ($role = @role or $type = @type or (string-length($role) = 0 and string-length($type) = 0))]"/>
+ <dt>
+ <xsl:for-each select="$refs/primary">
+ <xsl:if test="@id or @xml:id">
+ <a id="{(@id|@xml:id)[1]}"/>
+ </xsl:if>
+ </xsl:for-each>
+ <xsl:value-of select="primary"/>
+ <xsl:choose>
+ <xsl:when test="$index.links.to.section = 1">
+ <xsl:for-each select="$refs[generate-id() = generate-id(key('primary-section', concat($key, &quot; &quot;, generate-id((ancestor-or-self::set|ancestor-or-self::book|ancestor-or-self::part|ancestor-or-self::reference|ancestor-or-self::partintro|ancestor-or-self::chapter|ancestor-or-self::appendix|ancestor-or-self::preface|ancestor-or-self::article|ancestor-or-self::section|ancestor-or-self::sect1|ancestor-or-self::sect2|ancestor-or-self::sect3|ancestor-or-self::sect4|ancestor-or-self::sect5|ancestor-or-self::refentry|ancestor-or-self::refsect1|ancestor-or-self::refsect2|ancestor-or-self::refsect3|ancestor-or-self::simplesect|ancestor-or-self::bibliography|ancestor-or-self::glossary|ancestor-or-self::index|ancestor-or-self::webpage)[last()])))[count(ancestor::node()|$scope) = count(ancestor::node()) and ($role = @role or $type = @type or (string-length($role) = 0 and string-length($type) = 0))][1])]">
+ <xsl:apply-templates select="." mode="reference">
+ <xsl:with-param name="position" select="position()"/>
+ <xsl:with-param name="scope" select="$scope"/>
+ <xsl:with-param name="role" select="$role"/>
+ <xsl:with-param name="type" select="$type"/>
+ </xsl:apply-templates>
+ </xsl:for-each>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:for-each select="$refs[count(ancestor::node()|$scope) = count(ancestor::node()) and ($role = @role or $type = @type or (string-length($role) = 0 and string-length($type) = 0))]">
+ <xsl:apply-templates select="." mode="reference">
+ <xsl:with-param name="position" select="position()"/>
+ <xsl:with-param name="scope" select="$scope"/>
+ <xsl:with-param name="role" select="$role"/>
+ <xsl:with-param name="type" select="$type"/>
+ </xsl:apply-templates>
+ </xsl:for-each>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:if test="$refs[not(secondary)]/*[self::see]">
+ <xsl:apply-templates select="$refs[generate-id() = generate-id(key('see', concat(normalize-space(concat(primary/@sortas, &quot; &quot;, primary)), &quot; &quot;, &quot; &quot;, &quot; &quot;, see))[count(ancestor::node()|$scope) = count(ancestor::node()) and ($role = @role or $type = @type or (string-length($role) = 0 and string-length($type) = 0))][1])]" mode="index-see">
+ <xsl:with-param name="position" select="position()"/>
+ <xsl:with-param name="scope" select="$scope"/>
+ <xsl:with-param name="role" select="$role"/>
+ <xsl:with-param name="type" select="$type"/>
+ <xsl:sort select="translate(see, 'Aa&#192;&#224;&#193;&#225;&#194;&#226;&#195;&#227;&#196;&#228;&#197;&#229;&#256;&#257;&#258;&#259;&#260;&#261;&#461;&#462;&#478;&#479;&#480;&#481;&#506;&#507;&#512;&#513;&#514;&#515;&#550;&#551;&#7680;&#7681;&#7834;&#7840;&#7841;&#7842;&#7843;&#7844;&#7845;&#7846;&#7847;&#7848;&#7849;&#7850;&#7851;&#7852;&#7853;&#7854;&#7855;&#7856;&#7857;&#7858;&#7859;&#7860;&#7861;&#7862;&#7863;Bb&#384;&#385;&#595;&#386;&#387;&#7682;&#7683;&#7684;&#7685;&#7686;&#7687;Cc&#199;&#231;&#262;&#263;&#264;&#265;&#266;&#267;&#268;&#269;&#391;&#392;&#597;&#7688;&#7689;Dd&#270;&#271;&#272;&#273;&#394;&#599;&#395;&#396;&#453;&#498;&#545;&#598;&#7690;&#7691;&#7692;&#7693;&#7694;&#7695;&#7696;&#7697;&#7698;&#7699;Ee&#200;&#232;&#201;&#233;&#202;&#234;&#203;&#235;&#274;&#275;&#276;&#277;&#278;&#279;&#280;&#281;&#282;&#283;&#516;&#517;&#518;&#519;&#552;&#553;&#7700;&#7701;&#7702;&#7703;&#7704;&#7705;&#7706;&#7707;&#7708;&#7709;&#7864;&#7865;&#7866;&#7867;&#7868;&#7869;&#7870;&#7871;&#7872;&#7873;&#7874;&#7875;&#7876;&#7877;&#7878;&#7879;Ff&#401;&#402;&#7710;&#7711;Gg&#284;&#285;&#286;&#287;&#288;&#289;&#290;&#291;&#403;&#608;&#484;&#485;&#486;&#487;&#500;&#501;&#7712;&#7713;Hh&#292;&#293;&#294;&#295;&#542;&#543;&#614;&#7714;&#7715;&#7716;&#7717;&#7718;&#7719;&#7720;&#7721;&#7722;&#7723;&#7830;Ii&#204;&#236;&#205;&#237;&#206;&#238;&#207;&#239;&#296;&#297;&#298;&#299;&#300;&#301;&#302;&#303;&#304;&#407;&#616;&#463;&#464;&#520;&#521;&#522;&#523;&#7724;&#7725;&#7726;&#7727;&#7880;&#7881;&#7882;&#7883;Jj&#308;&#309;&#496;&#669;Kk&#310;&#311;&#408;&#409;&#488;&#489;&#7728;&#7729;&#7730;&#7731;&#7732;&#7733;Ll&#313;&#314;&#315;&#316;&#317;&#318;&#319;&#320;&#321;&#322;&#410;&#456;&#564;&#619;&#620;&#621;&#7734;&#7735;&#7736;&#7737;&#7738;&#7739;&#7740;&#7741;Mm&#625;&#7742;&#7743;&#7744;&#7745;&#7746;&#7747;Nn&#209;&#241;&#323;&#324;&#325;&#326;&#327;&#328;&#413;&#626;&#414;&#544;&#459;&#504;&#505;&#565;&#627;&#7748;&#7749;&#7750;&#7751;&#7752;&#7753;&#7754;&#7755;Oo&#210;&#242;&#211;&#243;&#212;&#244;&#213;&#245;&#214;&#246;&#216;&#248;&#332;&#333;&#334;&#335;&#336;&#337;&#415;&#416;&#417;&#465;&#466;&#490;&#491;&#492;&#493;&#510;&#511;&#524;&#525;&#526;&#527;&#554;&#555;&#556;&#557;&#558;&#559;&#560;&#561;&#7756;&#7757;&#7758;&#7759;&#7760;&#7761;&#7762;&#7763;&#7884;&#7885;&#7886;&#7887;&#7888;&#7889;&#7890;&#7891;&#7892;&#7893;&#7894;&#7895;&#7896;&#7897;&#7898;&#7899;&#7900;&#7901;&#7902;&#7903;&#7904;&#7905;&#7906;&#7907;Pp&#420;&#421;&#7764;&#7765;&#7766;&#7767;Qq&#672;Rr&#340;&#341;&#342;&#343;&#344;&#345;&#528;&#529;&#530;&#531;&#636;&#637;&#638;&#7768;&#7769;&#7770;&#7771;&#7772;&#7773;&#7774;&#7775;Ss&#346;&#347;&#348;&#349;&#350;&#351;&#352;&#353;&#536;&#537;&#642;&#7776;&#7777;&#7778;&#7779;&#7780;&#7781;&#7782;&#7783;&#7784;&#7785;Tt&#354;&#355;&#356;&#357;&#358;&#359;&#427;&#428;&#429;&#430;&#648;&#538;&#539;&#566;&#7786;&#7787;&#7788;&#7789;&#7790;&#7791;&#7792;&#7793;&#7831;Uu&#217;&#249;&#218;&#250;&#219;&#251;&#220;&#252;&#360;&#361;&#362;&#363;&#364;&#365;&#366;&#367;&#368;&#369;&#370;&#371;&#431;&#432;&#467;&#468;&#469;&#470;&#471;&#472;&#473;&#474;&#475;&#476;&#532;&#533;&#534;&#535;&#7794;&#7795;&#7796;&#7797;&#7798;&#7799;&#7800;&#7801;&#7802;&#7803;&#7908;&#7909;&#7910;&#7911;&#7912;&#7913;&#7914;&#7915;&#7916;&#7917;&#7918;&#7919;&#7920;&#7921;Vv&#434;&#651;&#7804;&#7805;&#7806;&#7807;Ww&#372;&#373;&#7808;&#7809;&#7810;&#7811;&#7812;&#7813;&#7814;&#7815;&#7816;&#7817;&#7832;Xx&#7818;&#7819;&#7820;&#7821;Yy&#221;&#253;&#255;&#376;&#374;&#375;&#435;&#436;&#562;&#563;&#7822;&#7823;&#7833;&#7922;&#7923;&#7924;&#7925;&#7926;&#7927;&#7928;&#7929;Zz&#377;&#378;&#379;&#380;&#381;&#382;&#437;&#438;&#548;&#549;&#656;&#657;&#7824;&#7825;&#7826;&#7827;&#7828;&#7829;&#7829;', 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBCCCCCCCCCCCCCCCCCDDDDDDDDDDDDDDDDDDDDDDDDEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEFFFFFFGGGGGGGGGGGGGGGGGGGGHHHHHHHHHHHHHHHHHHHHIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIJJJJJJKKKKKKKKKKKKKKLLLLLLLLLLLLLLLLLLLLLLLLLLMMMMMMMMMNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOPPPPPPPPQQQRRRRRRRRRRRRRRRRRRRRRRRSSSSSSSSSSSSSSSSSSSSSSSTTTTTTTTTTTTTTTTTTTTTTTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUVVVVVVVVWWWWWWWWWWWWWWWXXXXXXYYYYYYYYYYYYYYYYYYYYYYYZZZZZZZZZZZZZZZZZZZZZ')"/>
+ </xsl:apply-templates>
+ </xsl:if>
+ </dt>
+ <xsl:if test="$refs/secondary or $refs[not(secondary)]/*[self::seealso]">
+ <dd>
+ <dl>
+ <xsl:apply-templates select="$refs[generate-id() = generate-id(key('see-also', concat(normalize-space(concat(primary/@sortas, &quot; &quot;, primary)), &quot; &quot;, &quot; &quot;, &quot; &quot;, seealso))[count(ancestor::node()|$scope) = count(ancestor::node()) and ($role = @role or $type = @type or (string-length($role) = 0 and string-length($type) = 0))][1])]" mode="index-seealso">
+ <xsl:with-param name="position" select="position()"/>
+ <xsl:with-param name="scope" select="$scope"/>
+ <xsl:with-param name="role" select="$role"/>
+ <xsl:with-param name="type" select="$type"/>
+ <xsl:sort select="translate(seealso, 'Aa&#192;&#224;&#193;&#225;&#194;&#226;&#195;&#227;&#196;&#228;&#197;&#229;&#256;&#257;&#258;&#259;&#260;&#261;&#461;&#462;&#478;&#479;&#480;&#481;&#506;&#507;&#512;&#513;&#514;&#515;&#550;&#551;&#7680;&#7681;&#7834;&#7840;&#7841;&#7842;&#7843;&#7844;&#7845;&#7846;&#7847;&#7848;&#7849;&#7850;&#7851;&#7852;&#7853;&#7854;&#7855;&#7856;&#7857;&#7858;&#7859;&#7860;&#7861;&#7862;&#7863;Bb&#384;&#385;&#595;&#386;&#387;&#7682;&#7683;&#7684;&#7685;&#7686;&#7687;Cc&#199;&#231;&#262;&#263;&#264;&#265;&#266;&#267;&#268;&#269;&#391;&#392;&#597;&#7688;&#7689;Dd&#270;&#271;&#272;&#273;&#394;&#599;&#395;&#396;&#453;&#498;&#545;&#598;&#7690;&#7691;&#7692;&#7693;&#7694;&#7695;&#7696;&#7697;&#7698;&#7699;Ee&#200;&#232;&#201;&#233;&#202;&#234;&#203;&#235;&#274;&#275;&#276;&#277;&#278;&#279;&#280;&#281;&#282;&#283;&#516;&#517;&#518;&#519;&#552;&#553;&#7700;&#7701;&#7702;&#7703;&#7704;&#7705;&#7706;&#7707;&#7708;&#7709;&#7864;&#7865;&#7866;&#7867;&#7868;&#7869;&#7870;&#7871;&#7872;&#7873;&#7874;&#7875;&#7876;&#7877;&#7878;&#7879;Ff&#401;&#402;&#7710;&#7711;Gg&#284;&#285;&#286;&#287;&#288;&#289;&#290;&#291;&#403;&#608;&#484;&#485;&#486;&#487;&#500;&#501;&#7712;&#7713;Hh&#292;&#293;&#294;&#295;&#542;&#543;&#614;&#7714;&#7715;&#7716;&#7717;&#7718;&#7719;&#7720;&#7721;&#7722;&#7723;&#7830;Ii&#204;&#236;&#205;&#237;&#206;&#238;&#207;&#239;&#296;&#297;&#298;&#299;&#300;&#301;&#302;&#303;&#304;&#407;&#616;&#463;&#464;&#520;&#521;&#522;&#523;&#7724;&#7725;&#7726;&#7727;&#7880;&#7881;&#7882;&#7883;Jj&#308;&#309;&#496;&#669;Kk&#310;&#311;&#408;&#409;&#488;&#489;&#7728;&#7729;&#7730;&#7731;&#7732;&#7733;Ll&#313;&#314;&#315;&#316;&#317;&#318;&#319;&#320;&#321;&#322;&#410;&#456;&#564;&#619;&#620;&#621;&#7734;&#7735;&#7736;&#7737;&#7738;&#7739;&#7740;&#7741;Mm&#625;&#7742;&#7743;&#7744;&#7745;&#7746;&#7747;Nn&#209;&#241;&#323;&#324;&#325;&#326;&#327;&#328;&#413;&#626;&#414;&#544;&#459;&#504;&#505;&#565;&#627;&#7748;&#7749;&#7750;&#7751;&#7752;&#7753;&#7754;&#7755;Oo&#210;&#242;&#211;&#243;&#212;&#244;&#213;&#245;&#214;&#246;&#216;&#248;&#332;&#333;&#334;&#335;&#336;&#337;&#415;&#416;&#417;&#465;&#466;&#490;&#491;&#492;&#493;&#510;&#511;&#524;&#525;&#526;&#527;&#554;&#555;&#556;&#557;&#558;&#559;&#560;&#561;&#7756;&#7757;&#7758;&#7759;&#7760;&#7761;&#7762;&#7763;&#7884;&#7885;&#7886;&#7887;&#7888;&#7889;&#7890;&#7891;&#7892;&#7893;&#7894;&#7895;&#7896;&#7897;&#7898;&#7899;&#7900;&#7901;&#7902;&#7903;&#7904;&#7905;&#7906;&#7907;Pp&#420;&#421;&#7764;&#7765;&#7766;&#7767;Qq&#672;Rr&#340;&#341;&#342;&#343;&#344;&#345;&#528;&#529;&#530;&#531;&#636;&#637;&#638;&#7768;&#7769;&#7770;&#7771;&#7772;&#7773;&#7774;&#7775;Ss&#346;&#347;&#348;&#349;&#350;&#351;&#352;&#353;&#536;&#537;&#642;&#7776;&#7777;&#7778;&#7779;&#7780;&#7781;&#7782;&#7783;&#7784;&#7785;Tt&#354;&#355;&#356;&#357;&#358;&#359;&#427;&#428;&#429;&#430;&#648;&#538;&#539;&#566;&#7786;&#7787;&#7788;&#7789;&#7790;&#7791;&#7792;&#7793;&#7831;Uu&#217;&#249;&#218;&#250;&#219;&#251;&#220;&#252;&#360;&#361;&#362;&#363;&#364;&#365;&#366;&#367;&#368;&#369;&#370;&#371;&#431;&#432;&#467;&#468;&#469;&#470;&#471;&#472;&#473;&#474;&#475;&#476;&#532;&#533;&#534;&#535;&#7794;&#7795;&#7796;&#7797;&#7798;&#7799;&#7800;&#7801;&#7802;&#7803;&#7908;&#7909;&#7910;&#7911;&#7912;&#7913;&#7914;&#7915;&#7916;&#7917;&#7918;&#7919;&#7920;&#7921;Vv&#434;&#651;&#7804;&#7805;&#7806;&#7807;Ww&#372;&#373;&#7808;&#7809;&#7810;&#7811;&#7812;&#7813;&#7814;&#7815;&#7816;&#7817;&#7832;Xx&#7818;&#7819;&#7820;&#7821;Yy&#221;&#253;&#255;&#376;&#374;&#375;&#435;&#436;&#562;&#563;&#7822;&#7823;&#7833;&#7922;&#7923;&#7924;&#7925;&#7926;&#7927;&#7928;&#7929;Zz&#377;&#378;&#379;&#380;&#381;&#382;&#437;&#438;&#548;&#549;&#656;&#657;&#7824;&#7825;&#7826;&#7827;&#7828;&#7829;&#7829;', 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBCCCCCCCCCCCCCCCCCDDDDDDDDDDDDDDDDDDDDDDDDEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEFFFFFFGGGGGGGGGGGGGGGGGGGGHHHHHHHHHHHHHHHHHHHHIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIJJJJJJKKKKKKKKKKKKKKLLLLLLLLLLLLLLLLLLLLLLLLLLMMMMMMMMMNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOPPPPPPPPQQQRRRRRRRRRRRRRRRRRRRRRRRSSSSSSSSSSSSSSSSSSSSSSSTTTTTTTTTTTTTTTTTTTTTTTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUVVVVVVVVWWWWWWWWWWWWWWWXXXXXXYYYYYYYYYYYYYYYYYYYYYYYZZZZZZZZZZZZZZZZZZZZZ')"/>
+ </xsl:apply-templates>
+ <xsl:apply-templates select="$refs[secondary and count(.|key('secondary', concat($key, &quot; &quot;, normalize-space(concat(secondary/@sortas, &quot; &quot;, secondary))))[count(ancestor::node()|$scope) = count(ancestor::node()) and ($role = @role or $type = @type or (string-length($role) = 0 and string-length($type) = 0))][1]) = 1]" mode="index-secondary">
+ <xsl:with-param name="position" select="position()"/>
+ <xsl:with-param name="scope" select="$scope"/>
+ <xsl:with-param name="role" select="$role"/>
+ <xsl:with-param name="type" select="$type"/>
+ <xsl:sort select="translate(normalize-space(concat(secondary/@sortas, &quot; &quot;, secondary)), 'Aa&#192;&#224;&#193;&#225;&#194;&#226;&#195;&#227;&#196;&#228;&#197;&#229;&#256;&#257;&#258;&#259;&#260;&#261;&#461;&#462;&#478;&#479;&#480;&#481;&#506;&#507;&#512;&#513;&#514;&#515;&#550;&#551;&#7680;&#7681;&#7834;&#7840;&#7841;&#7842;&#7843;&#7844;&#7845;&#7846;&#7847;&#7848;&#7849;&#7850;&#7851;&#7852;&#7853;&#7854;&#7855;&#7856;&#7857;&#7858;&#7859;&#7860;&#7861;&#7862;&#7863;Bb&#384;&#385;&#595;&#386;&#387;&#7682;&#7683;&#7684;&#7685;&#7686;&#7687;Cc&#199;&#231;&#262;&#263;&#264;&#265;&#266;&#267;&#268;&#269;&#391;&#392;&#597;&#7688;&#7689;Dd&#270;&#271;&#272;&#273;&#394;&#599;&#395;&#396;&#453;&#498;&#545;&#598;&#7690;&#7691;&#7692;&#7693;&#7694;&#7695;&#7696;&#7697;&#7698;&#7699;Ee&#200;&#232;&#201;&#233;&#202;&#234;&#203;&#235;&#274;&#275;&#276;&#277;&#278;&#279;&#280;&#281;&#282;&#283;&#516;&#517;&#518;&#519;&#552;&#553;&#7700;&#7701;&#7702;&#7703;&#7704;&#7705;&#7706;&#7707;&#7708;&#7709;&#7864;&#7865;&#7866;&#7867;&#7868;&#7869;&#7870;&#7871;&#7872;&#7873;&#7874;&#7875;&#7876;&#7877;&#7878;&#7879;Ff&#401;&#402;&#7710;&#7711;Gg&#284;&#285;&#286;&#287;&#288;&#289;&#290;&#291;&#403;&#608;&#484;&#485;&#486;&#487;&#500;&#501;&#7712;&#7713;Hh&#292;&#293;&#294;&#295;&#542;&#543;&#614;&#7714;&#7715;&#7716;&#7717;&#7718;&#7719;&#7720;&#7721;&#7722;&#7723;&#7830;Ii&#204;&#236;&#205;&#237;&#206;&#238;&#207;&#239;&#296;&#297;&#298;&#299;&#300;&#301;&#302;&#303;&#304;&#407;&#616;&#463;&#464;&#520;&#521;&#522;&#523;&#7724;&#7725;&#7726;&#7727;&#7880;&#7881;&#7882;&#7883;Jj&#308;&#309;&#496;&#669;Kk&#310;&#311;&#408;&#409;&#488;&#489;&#7728;&#7729;&#7730;&#7731;&#7732;&#7733;Ll&#313;&#314;&#315;&#316;&#317;&#318;&#319;&#320;&#321;&#322;&#410;&#456;&#564;&#619;&#620;&#621;&#7734;&#7735;&#7736;&#7737;&#7738;&#7739;&#7740;&#7741;Mm&#625;&#7742;&#7743;&#7744;&#7745;&#7746;&#7747;Nn&#209;&#241;&#323;&#324;&#325;&#326;&#327;&#328;&#413;&#626;&#414;&#544;&#459;&#504;&#505;&#565;&#627;&#7748;&#7749;&#7750;&#7751;&#7752;&#7753;&#7754;&#7755;Oo&#210;&#242;&#211;&#243;&#212;&#244;&#213;&#245;&#214;&#246;&#216;&#248;&#332;&#333;&#334;&#335;&#336;&#337;&#415;&#416;&#417;&#465;&#466;&#490;&#491;&#492;&#493;&#510;&#511;&#524;&#525;&#526;&#527;&#554;&#555;&#556;&#557;&#558;&#559;&#560;&#561;&#7756;&#7757;&#7758;&#7759;&#7760;&#7761;&#7762;&#7763;&#7884;&#7885;&#7886;&#7887;&#7888;&#7889;&#7890;&#7891;&#7892;&#7893;&#7894;&#7895;&#7896;&#7897;&#7898;&#7899;&#7900;&#7901;&#7902;&#7903;&#7904;&#7905;&#7906;&#7907;Pp&#420;&#421;&#7764;&#7765;&#7766;&#7767;Qq&#672;Rr&#340;&#341;&#342;&#343;&#344;&#345;&#528;&#529;&#530;&#531;&#636;&#637;&#638;&#7768;&#7769;&#7770;&#7771;&#7772;&#7773;&#7774;&#7775;Ss&#346;&#347;&#348;&#349;&#350;&#351;&#352;&#353;&#536;&#537;&#642;&#7776;&#7777;&#7778;&#7779;&#7780;&#7781;&#7782;&#7783;&#7784;&#7785;Tt&#354;&#355;&#356;&#357;&#358;&#359;&#427;&#428;&#429;&#430;&#648;&#538;&#539;&#566;&#7786;&#7787;&#7788;&#7789;&#7790;&#7791;&#7792;&#7793;&#7831;Uu&#217;&#249;&#218;&#250;&#219;&#251;&#220;&#252;&#360;&#361;&#362;&#363;&#364;&#365;&#366;&#367;&#368;&#369;&#370;&#371;&#431;&#432;&#467;&#468;&#469;&#470;&#471;&#472;&#473;&#474;&#475;&#476;&#532;&#533;&#534;&#535;&#7794;&#7795;&#7796;&#7797;&#7798;&#7799;&#7800;&#7801;&#7802;&#7803;&#7908;&#7909;&#7910;&#7911;&#7912;&#7913;&#7914;&#7915;&#7916;&#7917;&#7918;&#7919;&#7920;&#7921;Vv&#434;&#651;&#7804;&#7805;&#7806;&#7807;Ww&#372;&#373;&#7808;&#7809;&#7810;&#7811;&#7812;&#7813;&#7814;&#7815;&#7816;&#7817;&#7832;Xx&#7818;&#7819;&#7820;&#7821;Yy&#221;&#253;&#255;&#376;&#374;&#375;&#435;&#436;&#562;&#563;&#7822;&#7823;&#7833;&#7922;&#7923;&#7924;&#7925;&#7926;&#7927;&#7928;&#7929;Zz&#377;&#378;&#379;&#380;&#381;&#382;&#437;&#438;&#548;&#549;&#656;&#657;&#7824;&#7825;&#7826;&#7827;&#7828;&#7829;&#7829;', 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBCCCCCCCCCCCCCCCCCDDDDDDDDDDDDDDDDDDDDDDDDEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEFFFFFFGGGGGGGGGGGGGGGGGGGGHHHHHHHHHHHHHHHHHHHHIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIJJJJJJKKKKKKKKKKKKKKLLLLLLLLLLLLLLLLLLLLLLLLLLMMMMMMMMMNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOPPPPPPPPQQQRRRRRRRRRRRRRRRRRRRRRRRSSSSSSSSSSSSSSSSSSSSSSSTTTTTTTTTTTTTTTTTTTTTTTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUVVVVVVVVWWWWWWWWWWWWWWWXXXXXXYYYYYYYYYYYYYYYYYYYYYYYZZZZZZZZZZZZZZZZZZZZZ')"/>
+ </xsl:apply-templates>
+ </dl>
+ </dd>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="indexterm" mode="index-secondary">
+ <xsl:param name="scope" select="."/>
+ <xsl:param name="role" select="''"/>
+ <xsl:param name="type" select="''"/>
+
+ <xsl:variable name="key" select="concat(normalize-space(concat(primary/@sortas, &quot; &quot;, primary)), &quot; &quot;, normalize-space(concat(secondary/@sortas, &quot; &quot;, secondary)))"/>
+ <xsl:variable name="refs" select="key('secondary', $key)[count(ancestor::node()|$scope) = count(ancestor::node()) and ($role = @role or $type = @type or (string-length($role) = 0 and string-length($type) = 0))]"/>
+ <dt>
+ <xsl:for-each select="$refs/secondary">
+ <xsl:if test="@id or @xml:id">
+ <a id="{(@id|@xml:id)[1]}"/>
+ </xsl:if>
+ </xsl:for-each>
+ <xsl:value-of select="secondary"/>
+ <xsl:choose>
+ <xsl:when test="$index.links.to.section = 1">
+ <xsl:for-each select="$refs[generate-id() = generate-id(key('secondary-section', concat($key, &quot; &quot;, generate-id((ancestor-or-self::set|ancestor-or-self::book|ancestor-or-self::part|ancestor-or-self::reference|ancestor-or-self::partintro|ancestor-or-self::chapter|ancestor-or-self::appendix|ancestor-or-self::preface|ancestor-or-self::article|ancestor-or-self::section|ancestor-or-self::sect1|ancestor-or-self::sect2|ancestor-or-self::sect3|ancestor-or-self::sect4|ancestor-or-self::sect5|ancestor-or-self::refentry|ancestor-or-self::refsect1|ancestor-or-self::refsect2|ancestor-or-self::refsect3|ancestor-or-self::simplesect|ancestor-or-self::bibliography|ancestor-or-self::glossary|ancestor-or-self::index|ancestor-or-self::webpage)[last()])))[count(ancestor::node()|$scope) = count(ancestor::node()) and ($role = @role or $type = @type or (string-length($role) = 0 and string-length($type) = 0))][1])]">
+ <xsl:apply-templates select="." mode="reference">
+ <xsl:with-param name="position" select="position()"/>
+ <xsl:with-param name="scope" select="$scope"/>
+ <xsl:with-param name="role" select="$role"/>
+ <xsl:with-param name="type" select="$type"/>
+ </xsl:apply-templates>
+ </xsl:for-each>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:for-each select="$refs[count(ancestor::node()|$scope) = count(ancestor::node()) and ($role = @role or $type = @type or (string-length($role) = 0 and string-length($type) = 0))]">
+ <xsl:apply-templates select="." mode="reference">
+ <xsl:with-param name="position" select="position()"/>
+ <xsl:with-param name="scope" select="$scope"/>
+ <xsl:with-param name="role" select="$role"/>
+ <xsl:with-param name="type" select="$type"/>
+ </xsl:apply-templates>
+ </xsl:for-each>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:if test="$refs[not(tertiary)]/*[self::see]">
+ <xsl:apply-templates select="$refs[generate-id() = generate-id(key('see', concat(normalize-space(concat(primary/@sortas, &quot; &quot;, primary)), &quot; &quot;, normalize-space(concat(secondary/@sortas, &quot; &quot;, secondary)), &quot; &quot;, &quot; &quot;, see))[count(ancestor::node()|$scope) = count(ancestor::node()) and ($role = @role or $type = @type or (string-length($role) = 0 and string-length($type) = 0))][1])]" mode="index-see">
+ <xsl:with-param name="position" select="position()"/>
+ <xsl:with-param name="scope" select="$scope"/>
+ <xsl:with-param name="role" select="$role"/>
+ <xsl:with-param name="type" select="$type"/>
+ <xsl:sort select="translate(see, 'Aa&#192;&#224;&#193;&#225;&#194;&#226;&#195;&#227;&#196;&#228;&#197;&#229;&#256;&#257;&#258;&#259;&#260;&#261;&#461;&#462;&#478;&#479;&#480;&#481;&#506;&#507;&#512;&#513;&#514;&#515;&#550;&#551;&#7680;&#7681;&#7834;&#7840;&#7841;&#7842;&#7843;&#7844;&#7845;&#7846;&#7847;&#7848;&#7849;&#7850;&#7851;&#7852;&#7853;&#7854;&#7855;&#7856;&#7857;&#7858;&#7859;&#7860;&#7861;&#7862;&#7863;Bb&#384;&#385;&#595;&#386;&#387;&#7682;&#7683;&#7684;&#7685;&#7686;&#7687;Cc&#199;&#231;&#262;&#263;&#264;&#265;&#266;&#267;&#268;&#269;&#391;&#392;&#597;&#7688;&#7689;Dd&#270;&#271;&#272;&#273;&#394;&#599;&#395;&#396;&#453;&#498;&#545;&#598;&#7690;&#7691;&#7692;&#7693;&#7694;&#7695;&#7696;&#7697;&#7698;&#7699;Ee&#200;&#232;&#201;&#233;&#202;&#234;&#203;&#235;&#274;&#275;&#276;&#277;&#278;&#279;&#280;&#281;&#282;&#283;&#516;&#517;&#518;&#519;&#552;&#553;&#7700;&#7701;&#7702;&#7703;&#7704;&#7705;&#7706;&#7707;&#7708;&#7709;&#7864;&#7865;&#7866;&#7867;&#7868;&#7869;&#7870;&#7871;&#7872;&#7873;&#7874;&#7875;&#7876;&#7877;&#7878;&#7879;Ff&#401;&#402;&#7710;&#7711;Gg&#284;&#285;&#286;&#287;&#288;&#289;&#290;&#291;&#403;&#608;&#484;&#485;&#486;&#487;&#500;&#501;&#7712;&#7713;Hh&#292;&#293;&#294;&#295;&#542;&#543;&#614;&#7714;&#7715;&#7716;&#7717;&#7718;&#7719;&#7720;&#7721;&#7722;&#7723;&#7830;Ii&#204;&#236;&#205;&#237;&#206;&#238;&#207;&#239;&#296;&#297;&#298;&#299;&#300;&#301;&#302;&#303;&#304;&#407;&#616;&#463;&#464;&#520;&#521;&#522;&#523;&#7724;&#7725;&#7726;&#7727;&#7880;&#7881;&#7882;&#7883;Jj&#308;&#309;&#496;&#669;Kk&#310;&#311;&#408;&#409;&#488;&#489;&#7728;&#7729;&#7730;&#7731;&#7732;&#7733;Ll&#313;&#314;&#315;&#316;&#317;&#318;&#319;&#320;&#321;&#322;&#410;&#456;&#564;&#619;&#620;&#621;&#7734;&#7735;&#7736;&#7737;&#7738;&#7739;&#7740;&#7741;Mm&#625;&#7742;&#7743;&#7744;&#7745;&#7746;&#7747;Nn&#209;&#241;&#323;&#324;&#325;&#326;&#327;&#328;&#413;&#626;&#414;&#544;&#459;&#504;&#505;&#565;&#627;&#7748;&#7749;&#7750;&#7751;&#7752;&#7753;&#7754;&#7755;Oo&#210;&#242;&#211;&#243;&#212;&#244;&#213;&#245;&#214;&#246;&#216;&#248;&#332;&#333;&#334;&#335;&#336;&#337;&#415;&#416;&#417;&#465;&#466;&#490;&#491;&#492;&#493;&#510;&#511;&#524;&#525;&#526;&#527;&#554;&#555;&#556;&#557;&#558;&#559;&#560;&#561;&#7756;&#7757;&#7758;&#7759;&#7760;&#7761;&#7762;&#7763;&#7884;&#7885;&#7886;&#7887;&#7888;&#7889;&#7890;&#7891;&#7892;&#7893;&#7894;&#7895;&#7896;&#7897;&#7898;&#7899;&#7900;&#7901;&#7902;&#7903;&#7904;&#7905;&#7906;&#7907;Pp&#420;&#421;&#7764;&#7765;&#7766;&#7767;Qq&#672;Rr&#340;&#341;&#342;&#343;&#344;&#345;&#528;&#529;&#530;&#531;&#636;&#637;&#638;&#7768;&#7769;&#7770;&#7771;&#7772;&#7773;&#7774;&#7775;Ss&#346;&#347;&#348;&#349;&#350;&#351;&#352;&#353;&#536;&#537;&#642;&#7776;&#7777;&#7778;&#7779;&#7780;&#7781;&#7782;&#7783;&#7784;&#7785;Tt&#354;&#355;&#356;&#357;&#358;&#359;&#427;&#428;&#429;&#430;&#648;&#538;&#539;&#566;&#7786;&#7787;&#7788;&#7789;&#7790;&#7791;&#7792;&#7793;&#7831;Uu&#217;&#249;&#218;&#250;&#219;&#251;&#220;&#252;&#360;&#361;&#362;&#363;&#364;&#365;&#366;&#367;&#368;&#369;&#370;&#371;&#431;&#432;&#467;&#468;&#469;&#470;&#471;&#472;&#473;&#474;&#475;&#476;&#532;&#533;&#534;&#535;&#7794;&#7795;&#7796;&#7797;&#7798;&#7799;&#7800;&#7801;&#7802;&#7803;&#7908;&#7909;&#7910;&#7911;&#7912;&#7913;&#7914;&#7915;&#7916;&#7917;&#7918;&#7919;&#7920;&#7921;Vv&#434;&#651;&#7804;&#7805;&#7806;&#7807;Ww&#372;&#373;&#7808;&#7809;&#7810;&#7811;&#7812;&#7813;&#7814;&#7815;&#7816;&#7817;&#7832;Xx&#7818;&#7819;&#7820;&#7821;Yy&#221;&#253;&#255;&#376;&#374;&#375;&#435;&#436;&#562;&#563;&#7822;&#7823;&#7833;&#7922;&#7923;&#7924;&#7925;&#7926;&#7927;&#7928;&#7929;Zz&#377;&#378;&#379;&#380;&#381;&#382;&#437;&#438;&#548;&#549;&#656;&#657;&#7824;&#7825;&#7826;&#7827;&#7828;&#7829;&#7829;', 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBCCCCCCCCCCCCCCCCCDDDDDDDDDDDDDDDDDDDDDDDDEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEFFFFFFGGGGGGGGGGGGGGGGGGGGHHHHHHHHHHHHHHHHHHHHIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIJJJJJJKKKKKKKKKKKKKKLLLLLLLLLLLLLLLLLLLLLLLLLLMMMMMMMMMNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOPPPPPPPPQQQRRRRRRRRRRRRRRRRRRRRRRRSSSSSSSSSSSSSSSSSSSSSSSTTTTTTTTTTTTTTTTTTTTTTTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUVVVVVVVVWWWWWWWWWWWWWWWXXXXXXYYYYYYYYYYYYYYYYYYYYYYYZZZZZZZZZZZZZZZZZZZZZ')"/>
+ </xsl:apply-templates>
+ </xsl:if>
+ </dt>
+ <xsl:if test="$refs/tertiary or $refs[not(tertiary)]/*[self::seealso]">
+ <dd>
+ <dl>
+ <xsl:apply-templates select="$refs[generate-id() = generate-id(key('see-also', concat(normalize-space(concat(primary/@sortas, &quot; &quot;, primary)), &quot; &quot;, normalize-space(concat(secondary/@sortas, &quot; &quot;, secondary)), &quot; &quot;, &quot; &quot;, seealso))[count(ancestor::node()|$scope) = count(ancestor::node()) and ($role = @role or $type = @type or (string-length($role) = 0 and string-length($type) = 0))][1])]" mode="index-seealso">
+ <xsl:with-param name="position" select="position()"/>
+ <xsl:with-param name="scope" select="$scope"/>
+ <xsl:with-param name="role" select="$role"/>
+ <xsl:with-param name="type" select="$type"/>
+ <xsl:sort select="translate(seealso, 'Aa&#192;&#224;&#193;&#225;&#194;&#226;&#195;&#227;&#196;&#228;&#197;&#229;&#256;&#257;&#258;&#259;&#260;&#261;&#461;&#462;&#478;&#479;&#480;&#481;&#506;&#507;&#512;&#513;&#514;&#515;&#550;&#551;&#7680;&#7681;&#7834;&#7840;&#7841;&#7842;&#7843;&#7844;&#7845;&#7846;&#7847;&#7848;&#7849;&#7850;&#7851;&#7852;&#7853;&#7854;&#7855;&#7856;&#7857;&#7858;&#7859;&#7860;&#7861;&#7862;&#7863;Bb&#384;&#385;&#595;&#386;&#387;&#7682;&#7683;&#7684;&#7685;&#7686;&#7687;Cc&#199;&#231;&#262;&#263;&#264;&#265;&#266;&#267;&#268;&#269;&#391;&#392;&#597;&#7688;&#7689;Dd&#270;&#271;&#272;&#273;&#394;&#599;&#395;&#396;&#453;&#498;&#545;&#598;&#7690;&#7691;&#7692;&#7693;&#7694;&#7695;&#7696;&#7697;&#7698;&#7699;Ee&#200;&#232;&#201;&#233;&#202;&#234;&#203;&#235;&#274;&#275;&#276;&#277;&#278;&#279;&#280;&#281;&#282;&#283;&#516;&#517;&#518;&#519;&#552;&#553;&#7700;&#7701;&#7702;&#7703;&#7704;&#7705;&#7706;&#7707;&#7708;&#7709;&#7864;&#7865;&#7866;&#7867;&#7868;&#7869;&#7870;&#7871;&#7872;&#7873;&#7874;&#7875;&#7876;&#7877;&#7878;&#7879;Ff&#401;&#402;&#7710;&#7711;Gg&#284;&#285;&#286;&#287;&#288;&#289;&#290;&#291;&#403;&#608;&#484;&#485;&#486;&#487;&#500;&#501;&#7712;&#7713;Hh&#292;&#293;&#294;&#295;&#542;&#543;&#614;&#7714;&#7715;&#7716;&#7717;&#7718;&#7719;&#7720;&#7721;&#7722;&#7723;&#7830;Ii&#204;&#236;&#205;&#237;&#206;&#238;&#207;&#239;&#296;&#297;&#298;&#299;&#300;&#301;&#302;&#303;&#304;&#407;&#616;&#463;&#464;&#520;&#521;&#522;&#523;&#7724;&#7725;&#7726;&#7727;&#7880;&#7881;&#7882;&#7883;Jj&#308;&#309;&#496;&#669;Kk&#310;&#311;&#408;&#409;&#488;&#489;&#7728;&#7729;&#7730;&#7731;&#7732;&#7733;Ll&#313;&#314;&#315;&#316;&#317;&#318;&#319;&#320;&#321;&#322;&#410;&#456;&#564;&#619;&#620;&#621;&#7734;&#7735;&#7736;&#7737;&#7738;&#7739;&#7740;&#7741;Mm&#625;&#7742;&#7743;&#7744;&#7745;&#7746;&#7747;Nn&#209;&#241;&#323;&#324;&#325;&#326;&#327;&#328;&#413;&#626;&#414;&#544;&#459;&#504;&#505;&#565;&#627;&#7748;&#7749;&#7750;&#7751;&#7752;&#7753;&#7754;&#7755;Oo&#210;&#242;&#211;&#243;&#212;&#244;&#213;&#245;&#214;&#246;&#216;&#248;&#332;&#333;&#334;&#335;&#336;&#337;&#415;&#416;&#417;&#465;&#466;&#490;&#491;&#492;&#493;&#510;&#511;&#524;&#525;&#526;&#527;&#554;&#555;&#556;&#557;&#558;&#559;&#560;&#561;&#7756;&#7757;&#7758;&#7759;&#7760;&#7761;&#7762;&#7763;&#7884;&#7885;&#7886;&#7887;&#7888;&#7889;&#7890;&#7891;&#7892;&#7893;&#7894;&#7895;&#7896;&#7897;&#7898;&#7899;&#7900;&#7901;&#7902;&#7903;&#7904;&#7905;&#7906;&#7907;Pp&#420;&#421;&#7764;&#7765;&#7766;&#7767;Qq&#672;Rr&#340;&#341;&#342;&#343;&#344;&#345;&#528;&#529;&#530;&#531;&#636;&#637;&#638;&#7768;&#7769;&#7770;&#7771;&#7772;&#7773;&#7774;&#7775;Ss&#346;&#347;&#348;&#349;&#350;&#351;&#352;&#353;&#536;&#537;&#642;&#7776;&#7777;&#7778;&#7779;&#7780;&#7781;&#7782;&#7783;&#7784;&#7785;Tt&#354;&#355;&#356;&#357;&#358;&#359;&#427;&#428;&#429;&#430;&#648;&#538;&#539;&#566;&#7786;&#7787;&#7788;&#7789;&#7790;&#7791;&#7792;&#7793;&#7831;Uu&#217;&#249;&#218;&#250;&#219;&#251;&#220;&#252;&#360;&#361;&#362;&#363;&#364;&#365;&#366;&#367;&#368;&#369;&#370;&#371;&#431;&#432;&#467;&#468;&#469;&#470;&#471;&#472;&#473;&#474;&#475;&#476;&#532;&#533;&#534;&#535;&#7794;&#7795;&#7796;&#7797;&#7798;&#7799;&#7800;&#7801;&#7802;&#7803;&#7908;&#7909;&#7910;&#7911;&#7912;&#7913;&#7914;&#7915;&#7916;&#7917;&#7918;&#7919;&#7920;&#7921;Vv&#434;&#651;&#7804;&#7805;&#7806;&#7807;Ww&#372;&#373;&#7808;&#7809;&#7810;&#7811;&#7812;&#7813;&#7814;&#7815;&#7816;&#7817;&#7832;Xx&#7818;&#7819;&#7820;&#7821;Yy&#221;&#253;&#255;&#376;&#374;&#375;&#435;&#436;&#562;&#563;&#7822;&#7823;&#7833;&#7922;&#7923;&#7924;&#7925;&#7926;&#7927;&#7928;&#7929;Zz&#377;&#378;&#379;&#380;&#381;&#382;&#437;&#438;&#548;&#549;&#656;&#657;&#7824;&#7825;&#7826;&#7827;&#7828;&#7829;&#7829;', 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBCCCCCCCCCCCCCCCCCDDDDDDDDDDDDDDDDDDDDDDDDEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEFFFFFFGGGGGGGGGGGGGGGGGGGGHHHHHHHHHHHHHHHHHHHHIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIJJJJJJKKKKKKKKKKKKKKLLLLLLLLLLLLLLLLLLLLLLLLLLMMMMMMMMMNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOPPPPPPPPQQQRRRRRRRRRRRRRRRRRRRRRRRSSSSSSSSSSSSSSSSSSSSSSSTTTTTTTTTTTTTTTTTTTTTTTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUVVVVVVVVWWWWWWWWWWWWWWWXXXXXXYYYYYYYYYYYYYYYYYYYYYYYZZZZZZZZZZZZZZZZZZZZZ')"/>
+ </xsl:apply-templates>
+ <xsl:apply-templates select="$refs[tertiary and count(.|key('tertiary', concat($key, &quot; &quot;, normalize-space(concat(tertiary/@sortas, &quot; &quot;, tertiary))))[count(ancestor::node()|$scope) = count(ancestor::node()) and ($role = @role or $type = @type or (string-length($role) = 0 and string-length($type) = 0))][1]) = 1]" mode="index-tertiary">
+ <xsl:with-param name="position" select="position()"/>
+ <xsl:with-param name="scope" select="$scope"/>
+ <xsl:with-param name="role" select="$role"/>
+ <xsl:with-param name="type" select="$type"/>
+ <xsl:sort select="translate(normalize-space(concat(tertiary/@sortas, &quot; &quot;, tertiary)), 'Aa&#192;&#224;&#193;&#225;&#194;&#226;&#195;&#227;&#196;&#228;&#197;&#229;&#256;&#257;&#258;&#259;&#260;&#261;&#461;&#462;&#478;&#479;&#480;&#481;&#506;&#507;&#512;&#513;&#514;&#515;&#550;&#551;&#7680;&#7681;&#7834;&#7840;&#7841;&#7842;&#7843;&#7844;&#7845;&#7846;&#7847;&#7848;&#7849;&#7850;&#7851;&#7852;&#7853;&#7854;&#7855;&#7856;&#7857;&#7858;&#7859;&#7860;&#7861;&#7862;&#7863;Bb&#384;&#385;&#595;&#386;&#387;&#7682;&#7683;&#7684;&#7685;&#7686;&#7687;Cc&#199;&#231;&#262;&#263;&#264;&#265;&#266;&#267;&#268;&#269;&#391;&#392;&#597;&#7688;&#7689;Dd&#270;&#271;&#272;&#273;&#394;&#599;&#395;&#396;&#453;&#498;&#545;&#598;&#7690;&#7691;&#7692;&#7693;&#7694;&#7695;&#7696;&#7697;&#7698;&#7699;Ee&#200;&#232;&#201;&#233;&#202;&#234;&#203;&#235;&#274;&#275;&#276;&#277;&#278;&#279;&#280;&#281;&#282;&#283;&#516;&#517;&#518;&#519;&#552;&#553;&#7700;&#7701;&#7702;&#7703;&#7704;&#7705;&#7706;&#7707;&#7708;&#7709;&#7864;&#7865;&#7866;&#7867;&#7868;&#7869;&#7870;&#7871;&#7872;&#7873;&#7874;&#7875;&#7876;&#7877;&#7878;&#7879;Ff&#401;&#402;&#7710;&#7711;Gg&#284;&#285;&#286;&#287;&#288;&#289;&#290;&#291;&#403;&#608;&#484;&#485;&#486;&#487;&#500;&#501;&#7712;&#7713;Hh&#292;&#293;&#294;&#295;&#542;&#543;&#614;&#7714;&#7715;&#7716;&#7717;&#7718;&#7719;&#7720;&#7721;&#7722;&#7723;&#7830;Ii&#204;&#236;&#205;&#237;&#206;&#238;&#207;&#239;&#296;&#297;&#298;&#299;&#300;&#301;&#302;&#303;&#304;&#407;&#616;&#463;&#464;&#520;&#521;&#522;&#523;&#7724;&#7725;&#7726;&#7727;&#7880;&#7881;&#7882;&#7883;Jj&#308;&#309;&#496;&#669;Kk&#310;&#311;&#408;&#409;&#488;&#489;&#7728;&#7729;&#7730;&#7731;&#7732;&#7733;Ll&#313;&#314;&#315;&#316;&#317;&#318;&#319;&#320;&#321;&#322;&#410;&#456;&#564;&#619;&#620;&#621;&#7734;&#7735;&#7736;&#7737;&#7738;&#7739;&#7740;&#7741;Mm&#625;&#7742;&#7743;&#7744;&#7745;&#7746;&#7747;Nn&#209;&#241;&#323;&#324;&#325;&#326;&#327;&#328;&#413;&#626;&#414;&#544;&#459;&#504;&#505;&#565;&#627;&#7748;&#7749;&#7750;&#7751;&#7752;&#7753;&#7754;&#7755;Oo&#210;&#242;&#211;&#243;&#212;&#244;&#213;&#245;&#214;&#246;&#216;&#248;&#332;&#333;&#334;&#335;&#336;&#337;&#415;&#416;&#417;&#465;&#466;&#490;&#491;&#492;&#493;&#510;&#511;&#524;&#525;&#526;&#527;&#554;&#555;&#556;&#557;&#558;&#559;&#560;&#561;&#7756;&#7757;&#7758;&#7759;&#7760;&#7761;&#7762;&#7763;&#7884;&#7885;&#7886;&#7887;&#7888;&#7889;&#7890;&#7891;&#7892;&#7893;&#7894;&#7895;&#7896;&#7897;&#7898;&#7899;&#7900;&#7901;&#7902;&#7903;&#7904;&#7905;&#7906;&#7907;Pp&#420;&#421;&#7764;&#7765;&#7766;&#7767;Qq&#672;Rr&#340;&#341;&#342;&#343;&#344;&#345;&#528;&#529;&#530;&#531;&#636;&#637;&#638;&#7768;&#7769;&#7770;&#7771;&#7772;&#7773;&#7774;&#7775;Ss&#346;&#347;&#348;&#349;&#350;&#351;&#352;&#353;&#536;&#537;&#642;&#7776;&#7777;&#7778;&#7779;&#7780;&#7781;&#7782;&#7783;&#7784;&#7785;Tt&#354;&#355;&#356;&#357;&#358;&#359;&#427;&#428;&#429;&#430;&#648;&#538;&#539;&#566;&#7786;&#7787;&#7788;&#7789;&#7790;&#7791;&#7792;&#7793;&#7831;Uu&#217;&#249;&#218;&#250;&#219;&#251;&#220;&#252;&#360;&#361;&#362;&#363;&#364;&#365;&#366;&#367;&#368;&#369;&#370;&#371;&#431;&#432;&#467;&#468;&#469;&#470;&#471;&#472;&#473;&#474;&#475;&#476;&#532;&#533;&#534;&#535;&#7794;&#7795;&#7796;&#7797;&#7798;&#7799;&#7800;&#7801;&#7802;&#7803;&#7908;&#7909;&#7910;&#7911;&#7912;&#7913;&#7914;&#7915;&#7916;&#7917;&#7918;&#7919;&#7920;&#7921;Vv&#434;&#651;&#7804;&#7805;&#7806;&#7807;Ww&#372;&#373;&#7808;&#7809;&#7810;&#7811;&#7812;&#7813;&#7814;&#7815;&#7816;&#7817;&#7832;Xx&#7818;&#7819;&#7820;&#7821;Yy&#221;&#253;&#255;&#376;&#374;&#375;&#435;&#436;&#562;&#563;&#7822;&#7823;&#7833;&#7922;&#7923;&#7924;&#7925;&#7926;&#7927;&#7928;&#7929;Zz&#377;&#378;&#379;&#380;&#381;&#382;&#437;&#438;&#548;&#549;&#656;&#657;&#7824;&#7825;&#7826;&#7827;&#7828;&#7829;&#7829;', 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBCCCCCCCCCCCCCCCCCDDDDDDDDDDDDDDDDDDDDDDDDEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEFFFFFFGGGGGGGGGGGGGGGGGGGGHHHHHHHHHHHHHHHHHHHHIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIJJJJJJKKKKKKKKKKKKKKLLLLLLLLLLLLLLLLLLLLLLLLLLMMMMMMMMMNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOPPPPPPPPQQQRRRRRRRRRRRRRRRRRRRRRRRSSSSSSSSSSSSSSSSSSSSSSSTTTTTTTTTTTTTTTTTTTTTTTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUVVVVVVVVWWWWWWWWWWWWWWWXXXXXXYYYYYYYYYYYYYYYYYYYYYYYZZZZZZZZZZZZZZZZZZZZZ')"/>
+ </xsl:apply-templates>
+ </dl>
+ </dd>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="indexterm" mode="index-tertiary">
+ <xsl:param name="scope" select="."/>
+ <xsl:param name="role" select="''"/>
+ <xsl:param name="type" select="''"/>
+
+ <xsl:variable name="key" select="concat(normalize-space(concat(primary/@sortas, &quot; &quot;, primary)), &quot; &quot;, normalize-space(concat(secondary/@sortas, &quot; &quot;, secondary)), &quot; &quot;, normalize-space(concat(tertiary/@sortas, &quot; &quot;, tertiary)))"/>
+ <xsl:variable name="refs" select="key('tertiary', $key)[count(ancestor::node()|$scope) = count(ancestor::node()) and ($role = @role or $type = @type or (string-length($role) = 0 and string-length($type) = 0))]"/>
+ <dt>
+ <xsl:for-each select="$refs/tertiary">
+ <xsl:if test="@id or @xml:id">
+ <a id="{(@id|@xml:id)[1]}"/>
+ </xsl:if>
+ </xsl:for-each>
+ <xsl:value-of select="tertiary"/>
+ <xsl:choose>
+ <xsl:when test="$index.links.to.section = 1">
+ <xsl:for-each select="$refs[generate-id() = generate-id(key('tertiary-section', concat($key, &quot; &quot;, generate-id((ancestor-or-self::set|ancestor-or-self::book|ancestor-or-self::part|ancestor-or-self::reference|ancestor-or-self::partintro|ancestor-or-self::chapter|ancestor-or-self::appendix|ancestor-or-self::preface|ancestor-or-self::article|ancestor-or-self::section|ancestor-or-self::sect1|ancestor-or-self::sect2|ancestor-or-self::sect3|ancestor-or-self::sect4|ancestor-or-self::sect5|ancestor-or-self::refentry|ancestor-or-self::refsect1|ancestor-or-self::refsect2|ancestor-or-self::refsect3|ancestor-or-self::simplesect|ancestor-or-self::bibliography|ancestor-or-self::glossary|ancestor-or-self::index|ancestor-or-self::webpage)[last()])))[count(ancestor::node()|$scope) = count(ancestor::node()) and ($role = @role or $type = @type or (string-length($role) = 0 and string-length($type) = 0))][1])]">
+ <xsl:apply-templates select="." mode="reference">
+ <xsl:with-param name="position" select="position()"/>
+ <xsl:with-param name="scope" select="$scope"/>
+ <xsl:with-param name="role" select="$role"/>
+ <xsl:with-param name="type" select="$type"/>
+ </xsl:apply-templates>
+ </xsl:for-each>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:for-each select="$refs[count(ancestor::node()|$scope) = count(ancestor::node()) and ($role = @role or $type = @type or (string-length($role) = 0 and string-length($type) = 0))]">
+ <xsl:apply-templates select="." mode="reference">
+ <xsl:with-param name="position" select="position()"/>
+ <xsl:with-param name="scope" select="$scope"/>
+ <xsl:with-param name="role" select="$role"/>
+ <xsl:with-param name="type" select="$type"/>
+ </xsl:apply-templates>
+ </xsl:for-each>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:if test="$refs/see">
+ <xsl:apply-templates select="$refs[generate-id() = generate-id(key('see', concat(normalize-space(concat(primary/@sortas, &quot; &quot;, primary)), &quot; &quot;, normalize-space(concat(secondary/@sortas, &quot; &quot;, secondary)), &quot; &quot;, normalize-space(concat(tertiary/@sortas, &quot; &quot;, tertiary)), &quot; &quot;, see))[count(ancestor::node()|$scope) = count(ancestor::node()) and ($role = @role or $type = @type or (string-length($role) = 0 and string-length($type) = 0))][1])]" mode="index-see">
+ <xsl:with-param name="position" select="position()"/>
+ <xsl:with-param name="scope" select="$scope"/>
+ <xsl:with-param name="role" select="$role"/>
+ <xsl:with-param name="type" select="$type"/>
+ <xsl:sort select="translate(see, 'Aa&#192;&#224;&#193;&#225;&#194;&#226;&#195;&#227;&#196;&#228;&#197;&#229;&#256;&#257;&#258;&#259;&#260;&#261;&#461;&#462;&#478;&#479;&#480;&#481;&#506;&#507;&#512;&#513;&#514;&#515;&#550;&#551;&#7680;&#7681;&#7834;&#7840;&#7841;&#7842;&#7843;&#7844;&#7845;&#7846;&#7847;&#7848;&#7849;&#7850;&#7851;&#7852;&#7853;&#7854;&#7855;&#7856;&#7857;&#7858;&#7859;&#7860;&#7861;&#7862;&#7863;Bb&#384;&#385;&#595;&#386;&#387;&#7682;&#7683;&#7684;&#7685;&#7686;&#7687;Cc&#199;&#231;&#262;&#263;&#264;&#265;&#266;&#267;&#268;&#269;&#391;&#392;&#597;&#7688;&#7689;Dd&#270;&#271;&#272;&#273;&#394;&#599;&#395;&#396;&#453;&#498;&#545;&#598;&#7690;&#7691;&#7692;&#7693;&#7694;&#7695;&#7696;&#7697;&#7698;&#7699;Ee&#200;&#232;&#201;&#233;&#202;&#234;&#203;&#235;&#274;&#275;&#276;&#277;&#278;&#279;&#280;&#281;&#282;&#283;&#516;&#517;&#518;&#519;&#552;&#553;&#7700;&#7701;&#7702;&#7703;&#7704;&#7705;&#7706;&#7707;&#7708;&#7709;&#7864;&#7865;&#7866;&#7867;&#7868;&#7869;&#7870;&#7871;&#7872;&#7873;&#7874;&#7875;&#7876;&#7877;&#7878;&#7879;Ff&#401;&#402;&#7710;&#7711;Gg&#284;&#285;&#286;&#287;&#288;&#289;&#290;&#291;&#403;&#608;&#484;&#485;&#486;&#487;&#500;&#501;&#7712;&#7713;Hh&#292;&#293;&#294;&#295;&#542;&#543;&#614;&#7714;&#7715;&#7716;&#7717;&#7718;&#7719;&#7720;&#7721;&#7722;&#7723;&#7830;Ii&#204;&#236;&#205;&#237;&#206;&#238;&#207;&#239;&#296;&#297;&#298;&#299;&#300;&#301;&#302;&#303;&#304;&#407;&#616;&#463;&#464;&#520;&#521;&#522;&#523;&#7724;&#7725;&#7726;&#7727;&#7880;&#7881;&#7882;&#7883;Jj&#308;&#309;&#496;&#669;Kk&#310;&#311;&#408;&#409;&#488;&#489;&#7728;&#7729;&#7730;&#7731;&#7732;&#7733;Ll&#313;&#314;&#315;&#316;&#317;&#318;&#319;&#320;&#321;&#322;&#410;&#456;&#564;&#619;&#620;&#621;&#7734;&#7735;&#7736;&#7737;&#7738;&#7739;&#7740;&#7741;Mm&#625;&#7742;&#7743;&#7744;&#7745;&#7746;&#7747;Nn&#209;&#241;&#323;&#324;&#325;&#326;&#327;&#328;&#413;&#626;&#414;&#544;&#459;&#504;&#505;&#565;&#627;&#7748;&#7749;&#7750;&#7751;&#7752;&#7753;&#7754;&#7755;Oo&#210;&#242;&#211;&#243;&#212;&#244;&#213;&#245;&#214;&#246;&#216;&#248;&#332;&#333;&#334;&#335;&#336;&#337;&#415;&#416;&#417;&#465;&#466;&#490;&#491;&#492;&#493;&#510;&#511;&#524;&#525;&#526;&#527;&#554;&#555;&#556;&#557;&#558;&#559;&#560;&#561;&#7756;&#7757;&#7758;&#7759;&#7760;&#7761;&#7762;&#7763;&#7884;&#7885;&#7886;&#7887;&#7888;&#7889;&#7890;&#7891;&#7892;&#7893;&#7894;&#7895;&#7896;&#7897;&#7898;&#7899;&#7900;&#7901;&#7902;&#7903;&#7904;&#7905;&#7906;&#7907;Pp&#420;&#421;&#7764;&#7765;&#7766;&#7767;Qq&#672;Rr&#340;&#341;&#342;&#343;&#344;&#345;&#528;&#529;&#530;&#531;&#636;&#637;&#638;&#7768;&#7769;&#7770;&#7771;&#7772;&#7773;&#7774;&#7775;Ss&#346;&#347;&#348;&#349;&#350;&#351;&#352;&#353;&#536;&#537;&#642;&#7776;&#7777;&#7778;&#7779;&#7780;&#7781;&#7782;&#7783;&#7784;&#7785;Tt&#354;&#355;&#356;&#357;&#358;&#359;&#427;&#428;&#429;&#430;&#648;&#538;&#539;&#566;&#7786;&#7787;&#7788;&#7789;&#7790;&#7791;&#7792;&#7793;&#7831;Uu&#217;&#249;&#218;&#250;&#219;&#251;&#220;&#252;&#360;&#361;&#362;&#363;&#364;&#365;&#366;&#367;&#368;&#369;&#370;&#371;&#431;&#432;&#467;&#468;&#469;&#470;&#471;&#472;&#473;&#474;&#475;&#476;&#532;&#533;&#534;&#535;&#7794;&#7795;&#7796;&#7797;&#7798;&#7799;&#7800;&#7801;&#7802;&#7803;&#7908;&#7909;&#7910;&#7911;&#7912;&#7913;&#7914;&#7915;&#7916;&#7917;&#7918;&#7919;&#7920;&#7921;Vv&#434;&#651;&#7804;&#7805;&#7806;&#7807;Ww&#372;&#373;&#7808;&#7809;&#7810;&#7811;&#7812;&#7813;&#7814;&#7815;&#7816;&#7817;&#7832;Xx&#7818;&#7819;&#7820;&#7821;Yy&#221;&#253;&#255;&#376;&#374;&#375;&#435;&#436;&#562;&#563;&#7822;&#7823;&#7833;&#7922;&#7923;&#7924;&#7925;&#7926;&#7927;&#7928;&#7929;Zz&#377;&#378;&#379;&#380;&#381;&#382;&#437;&#438;&#548;&#549;&#656;&#657;&#7824;&#7825;&#7826;&#7827;&#7828;&#7829;&#7829;', 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBCCCCCCCCCCCCCCCCCDDDDDDDDDDDDDDDDDDDDDDDDEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEFFFFFFGGGGGGGGGGGGGGGGGGGGHHHHHHHHHHHHHHHHHHHHIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIJJJJJJKKKKKKKKKKKKKKLLLLLLLLLLLLLLLLLLLLLLLLLLMMMMMMMMMNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOPPPPPPPPQQQRRRRRRRRRRRRRRRRRRRRRRRSSSSSSSSSSSSSSSSSSSSSSSTTTTTTTTTTTTTTTTTTTTTTTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUVVVVVVVVWWWWWWWWWWWWWWWXXXXXXYYYYYYYYYYYYYYYYYYYYYYYZZZZZZZZZZZZZZZZZZZZZ')"/>
+ </xsl:apply-templates>
+ </xsl:if>
+ </dt>
+ <xsl:if test="$refs/seealso">
+ <dd>
+ <dl>
+ <xsl:apply-templates select="$refs[generate-id() = generate-id(key('see-also', concat(normalize-space(concat(primary/@sortas, &quot; &quot;, primary)), &quot; &quot;, normalize-space(concat(secondary/@sortas, &quot; &quot;, secondary)), &quot; &quot;, normalize-space(concat(tertiary/@sortas, &quot; &quot;, tertiary)), &quot; &quot;, seealso))[count(ancestor::node()|$scope) = count(ancestor::node()) and ($role = @role or $type = @type or (string-length($role) = 0 and string-length($type) = 0))][1])]" mode="index-seealso">
+ <xsl:with-param name="position" select="position()"/>
+ <xsl:with-param name="scope" select="$scope"/>
+ <xsl:with-param name="role" select="$role"/>
+ <xsl:with-param name="type" select="$type"/>
+ <xsl:sort select="translate(seealso, 'Aa&#192;&#224;&#193;&#225;&#194;&#226;&#195;&#227;&#196;&#228;&#197;&#229;&#256;&#257;&#258;&#259;&#260;&#261;&#461;&#462;&#478;&#479;&#480;&#481;&#506;&#507;&#512;&#513;&#514;&#515;&#550;&#551;&#7680;&#7681;&#7834;&#7840;&#7841;&#7842;&#7843;&#7844;&#7845;&#7846;&#7847;&#7848;&#7849;&#7850;&#7851;&#7852;&#7853;&#7854;&#7855;&#7856;&#7857;&#7858;&#7859;&#7860;&#7861;&#7862;&#7863;Bb&#384;&#385;&#595;&#386;&#387;&#7682;&#7683;&#7684;&#7685;&#7686;&#7687;Cc&#199;&#231;&#262;&#263;&#264;&#265;&#266;&#267;&#268;&#269;&#391;&#392;&#597;&#7688;&#7689;Dd&#270;&#271;&#272;&#273;&#394;&#599;&#395;&#396;&#453;&#498;&#545;&#598;&#7690;&#7691;&#7692;&#7693;&#7694;&#7695;&#7696;&#7697;&#7698;&#7699;Ee&#200;&#232;&#201;&#233;&#202;&#234;&#203;&#235;&#274;&#275;&#276;&#277;&#278;&#279;&#280;&#281;&#282;&#283;&#516;&#517;&#518;&#519;&#552;&#553;&#7700;&#7701;&#7702;&#7703;&#7704;&#7705;&#7706;&#7707;&#7708;&#7709;&#7864;&#7865;&#7866;&#7867;&#7868;&#7869;&#7870;&#7871;&#7872;&#7873;&#7874;&#7875;&#7876;&#7877;&#7878;&#7879;Ff&#401;&#402;&#7710;&#7711;Gg&#284;&#285;&#286;&#287;&#288;&#289;&#290;&#291;&#403;&#608;&#484;&#485;&#486;&#487;&#500;&#501;&#7712;&#7713;Hh&#292;&#293;&#294;&#295;&#542;&#543;&#614;&#7714;&#7715;&#7716;&#7717;&#7718;&#7719;&#7720;&#7721;&#7722;&#7723;&#7830;Ii&#204;&#236;&#205;&#237;&#206;&#238;&#207;&#239;&#296;&#297;&#298;&#299;&#300;&#301;&#302;&#303;&#304;&#407;&#616;&#463;&#464;&#520;&#521;&#522;&#523;&#7724;&#7725;&#7726;&#7727;&#7880;&#7881;&#7882;&#7883;Jj&#308;&#309;&#496;&#669;Kk&#310;&#311;&#408;&#409;&#488;&#489;&#7728;&#7729;&#7730;&#7731;&#7732;&#7733;Ll&#313;&#314;&#315;&#316;&#317;&#318;&#319;&#320;&#321;&#322;&#410;&#456;&#564;&#619;&#620;&#621;&#7734;&#7735;&#7736;&#7737;&#7738;&#7739;&#7740;&#7741;Mm&#625;&#7742;&#7743;&#7744;&#7745;&#7746;&#7747;Nn&#209;&#241;&#323;&#324;&#325;&#326;&#327;&#328;&#413;&#626;&#414;&#544;&#459;&#504;&#505;&#565;&#627;&#7748;&#7749;&#7750;&#7751;&#7752;&#7753;&#7754;&#7755;Oo&#210;&#242;&#211;&#243;&#212;&#244;&#213;&#245;&#214;&#246;&#216;&#248;&#332;&#333;&#334;&#335;&#336;&#337;&#415;&#416;&#417;&#465;&#466;&#490;&#491;&#492;&#493;&#510;&#511;&#524;&#525;&#526;&#527;&#554;&#555;&#556;&#557;&#558;&#559;&#560;&#561;&#7756;&#7757;&#7758;&#7759;&#7760;&#7761;&#7762;&#7763;&#7884;&#7885;&#7886;&#7887;&#7888;&#7889;&#7890;&#7891;&#7892;&#7893;&#7894;&#7895;&#7896;&#7897;&#7898;&#7899;&#7900;&#7901;&#7902;&#7903;&#7904;&#7905;&#7906;&#7907;Pp&#420;&#421;&#7764;&#7765;&#7766;&#7767;Qq&#672;Rr&#340;&#341;&#342;&#343;&#344;&#345;&#528;&#529;&#530;&#531;&#636;&#637;&#638;&#7768;&#7769;&#7770;&#7771;&#7772;&#7773;&#7774;&#7775;Ss&#346;&#347;&#348;&#349;&#350;&#351;&#352;&#353;&#536;&#537;&#642;&#7776;&#7777;&#7778;&#7779;&#7780;&#7781;&#7782;&#7783;&#7784;&#7785;Tt&#354;&#355;&#356;&#357;&#358;&#359;&#427;&#428;&#429;&#430;&#648;&#538;&#539;&#566;&#7786;&#7787;&#7788;&#7789;&#7790;&#7791;&#7792;&#7793;&#7831;Uu&#217;&#249;&#218;&#250;&#219;&#251;&#220;&#252;&#360;&#361;&#362;&#363;&#364;&#365;&#366;&#367;&#368;&#369;&#370;&#371;&#431;&#432;&#467;&#468;&#469;&#470;&#471;&#472;&#473;&#474;&#475;&#476;&#532;&#533;&#534;&#535;&#7794;&#7795;&#7796;&#7797;&#7798;&#7799;&#7800;&#7801;&#7802;&#7803;&#7908;&#7909;&#7910;&#7911;&#7912;&#7913;&#7914;&#7915;&#7916;&#7917;&#7918;&#7919;&#7920;&#7921;Vv&#434;&#651;&#7804;&#7805;&#7806;&#7807;Ww&#372;&#373;&#7808;&#7809;&#7810;&#7811;&#7812;&#7813;&#7814;&#7815;&#7816;&#7817;&#7832;Xx&#7818;&#7819;&#7820;&#7821;Yy&#221;&#253;&#255;&#376;&#374;&#375;&#435;&#436;&#562;&#563;&#7822;&#7823;&#7833;&#7922;&#7923;&#7924;&#7925;&#7926;&#7927;&#7928;&#7929;Zz&#377;&#378;&#379;&#380;&#381;&#382;&#437;&#438;&#548;&#549;&#656;&#657;&#7824;&#7825;&#7826;&#7827;&#7828;&#7829;&#7829;', 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBCCCCCCCCCCCCCCCCCDDDDDDDDDDDDDDDDDDDDDDDDEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEFFFFFFGGGGGGGGGGGGGGGGGGGGHHHHHHHHHHHHHHHHHHHHIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIJJJJJJKKKKKKKKKKKKKKLLLLLLLLLLLLLLLLLLLLLLLLLLMMMMMMMMMNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOPPPPPPPPQQQRRRRRRRRRRRRRRRRRRRRRRRSSSSSSSSSSSSSSSSSSSSSSSTTTTTTTTTTTTTTTTTTTTTTTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUVVVVVVVVWWWWWWWWWWWWWWWXXXXXXYYYYYYYYYYYYYYYYYYYYYYYZZZZZZZZZZZZZZZZZZZZZ')"/>
+ </xsl:apply-templates>
+ </dl>
+ </dd>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="indexterm" mode="reference">
+ <xsl:param name="scope" select="."/>
+ <xsl:param name="role" select="''"/>
+ <xsl:param name="type" select="''"/>
+ <xsl:param name="position"/>
+
+ <xsl:variable name="term.separator">
+ <xsl:call-template name="index.separator">
+ <xsl:with-param name="key" select="'index.term.separator'"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="number.separator">
+ <xsl:call-template name="index.separator">
+ <xsl:with-param name="key" select="'index.number.separator'"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="range.separator">
+ <xsl:call-template name="index.separator">
+ <xsl:with-param name="key" select="'index.range.separator'"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="$position = 1">
+ <xsl:value-of select="$term.separator"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$number.separator"/>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:choose>
+ <xsl:when test="@zone and string(@zone)">
+ <xsl:call-template name="reference">
+ <xsl:with-param name="zones" select="normalize-space(@zone)"/>
+ <xsl:with-param name="position" select="position()"/>
+ <xsl:with-param name="scope" select="$scope"/>
+ <xsl:with-param name="role" select="$role"/>
+ <xsl:with-param name="type" select="$type"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <a>
+ <xsl:apply-templates select="." mode="class.attribute"/>
+ <xsl:variable name="title">
+ <xsl:choose>
+ <xsl:when test="(ancestor-or-self::set|ancestor-or-self::book|ancestor-or-self::part|ancestor-or-self::reference|ancestor-or-self::partintro|ancestor-or-self::chapter|ancestor-or-self::appendix|ancestor-or-self::preface|ancestor-or-self::article|ancestor-or-self::section|ancestor-or-self::sect1|ancestor-or-self::sect2|ancestor-or-self::sect3|ancestor-or-self::sect4|ancestor-or-self::sect5|ancestor-or-self::refentry|ancestor-or-self::refsect1|ancestor-or-self::refsect2|ancestor-or-self::refsect3|ancestor-or-self::simplesect|ancestor-or-self::bibliography|ancestor-or-self::glossary|ancestor-or-self::index|ancestor-or-self::webpage)[last()]/titleabbrev and $index.prefer.titleabbrev != 0">
+ <xsl:apply-templates select="(ancestor-or-self::set|ancestor-or-self::book|ancestor-or-self::part|ancestor-or-self::reference|ancestor-or-self::partintro|ancestor-or-self::chapter|ancestor-or-self::appendix|ancestor-or-self::preface|ancestor-or-self::article|ancestor-or-self::section|ancestor-or-self::sect1|ancestor-or-self::sect2|ancestor-or-self::sect3|ancestor-or-self::sect4|ancestor-or-self::sect5|ancestor-or-self::refentry|ancestor-or-self::refsect1|ancestor-or-self::refsect2|ancestor-or-self::refsect3|ancestor-or-self::simplesect|ancestor-or-self::bibliography|ancestor-or-self::glossary|ancestor-or-self::index|ancestor-or-self::webpage)[last()]" mode="titleabbrev.markup"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="(ancestor-or-self::set|ancestor-or-self::book|ancestor-or-self::part|ancestor-or-self::reference|ancestor-or-self::partintro|ancestor-or-self::chapter|ancestor-or-self::appendix|ancestor-or-self::preface|ancestor-or-self::article|ancestor-or-self::section|ancestor-or-self::sect1|ancestor-or-self::sect2|ancestor-or-self::sect3|ancestor-or-self::sect4|ancestor-or-self::sect5|ancestor-or-self::refentry|ancestor-or-self::refsect1|ancestor-or-self::refsect2|ancestor-or-self::refsect3|ancestor-or-self::simplesect|ancestor-or-self::bibliography|ancestor-or-self::glossary|ancestor-or-self::index|ancestor-or-self::webpage)[last()]" mode="title.markup"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:attribute name="href">
+ <xsl:choose>
+ <xsl:when test="$index.links.to.section = 1">
+ <xsl:call-template name="href.target">
+ <xsl:with-param name="object" select="(ancestor-or-self::set|ancestor-or-self::book|ancestor-or-self::part|ancestor-or-self::reference|ancestor-or-self::partintro|ancestor-or-self::chapter|ancestor-or-self::appendix|ancestor-or-self::preface|ancestor-or-self::article|ancestor-or-self::section|ancestor-or-self::sect1|ancestor-or-self::sect2|ancestor-or-self::sect3|ancestor-or-self::sect4|ancestor-or-self::sect5|ancestor-or-self::refentry|ancestor-or-self::refsect1|ancestor-or-self::refsect2|ancestor-or-self::refsect3|ancestor-or-self::simplesect|ancestor-or-self::bibliography|ancestor-or-self::glossary|ancestor-or-self::index|ancestor-or-self::webpage)[last()]"/>
+ <xsl:with-param name="context" select="//index[count(ancestor::node()|$scope) = count(ancestor::node()) and ($role = @role or $type = @type or (string-length($role) = 0 and string-length($type) = 0))][1]"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="href.target">
+ <xsl:with-param name="object" select="."/>
+ <xsl:with-param name="context" select="//index[count(ancestor::node()|$scope) = count(ancestor::node()) and ($role = @role or $type = @type or (string-length($role) = 0 and string-length($type) = 0))][1]"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ </xsl:attribute>
+
+ <xsl:value-of select="$title"/> <!-- text only -->
+ </a>
+
+ <xsl:variable name="id" select="(@id|@xml:id)[1]"/>
+ <xsl:if test="key('endofrange', $id)[count(ancestor::node()|$scope) = count(ancestor::node()) and ($role = @role or $type = @type or (string-length($role) = 0 and string-length($type) = 0))]">
+ <xsl:apply-templates select="key('endofrange', $id)[count(ancestor::node()|$scope) = count(ancestor::node()) and ($role = @role or $type = @type or (string-length($role) = 0 and string-length($type) = 0))][last()]" mode="reference">
+ <xsl:with-param name="position" select="position()"/>
+ <xsl:with-param name="scope" select="$scope"/>
+ <xsl:with-param name="role" select="$role"/>
+ <xsl:with-param name="type" select="$type"/>
+ <xsl:with-param name="separator" select="$range.separator"/>
+ </xsl:apply-templates>
+ </xsl:if>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="reference">
+ <xsl:param name="scope" select="."/>
+ <xsl:param name="role" select="''"/>
+ <xsl:param name="type" select="''"/>
+ <xsl:param name="zones"/>
+
+ <xsl:choose>
+ <xsl:when test="contains($zones, ' ')">
+ <xsl:variable name="zone" select="substring-before($zones, ' ')"/>
+ <xsl:variable name="target" select="key('sections', $zone)"/>
+
+ <a>
+ <xsl:apply-templates select="." mode="class.attribute"/>
+ <xsl:attribute name="href">
+ <xsl:call-template name="href.target">
+ <xsl:with-param name="object" select="$target[1]"/>
+ <xsl:with-param name="context" select="//index[count(ancestor::node()|$scope) = count(ancestor::node()) and ($role = @role or $type = @type or (string-length($role) = 0 and string-length($type) = 0))][1]"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:apply-templates select="$target[1]" mode="index-title-content"/>
+ </a>
+ <xsl:text>, </xsl:text>
+ <xsl:call-template name="reference">
+ <xsl:with-param name="zones" select="substring-after($zones, ' ')"/>
+ <xsl:with-param name="position" select="position()"/>
+ <xsl:with-param name="scope" select="$scope"/>
+ <xsl:with-param name="role" select="$role"/>
+ <xsl:with-param name="type" select="$type"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:variable name="zone" select="$zones"/>
+ <xsl:variable name="target" select="key('sections', $zone)"/>
+
+ <a>
+ <xsl:apply-templates select="." mode="class.attribute"/>
+ <xsl:attribute name="href">
+ <xsl:call-template name="href.target">
+ <xsl:with-param name="object" select="$target[1]"/>
+ <xsl:with-param name="context" select="//index[count(ancestor::node()|$scope) = count(ancestor::node()) and ($role = @role or $type = @type or (string-length($role) = 0 and string-length($type) = 0))][1]"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:apply-templates select="$target[1]" mode="index-title-content"/>
+ </a>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="indexterm" mode="index-see">
+ <xsl:param name="scope" select="."/>
+ <xsl:param name="role" select="''"/>
+ <xsl:param name="type" select="''"/>
+
+ <xsl:text> (</xsl:text>
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'see'"/>
+ </xsl:call-template>
+ <xsl:text> </xsl:text>
+ <xsl:value-of select="see"/>
+ <xsl:text>)</xsl:text>
+</xsl:template>
+
+<xsl:template match="indexterm" mode="index-seealso">
+ <xsl:param name="scope" select="."/>
+ <xsl:param name="role" select="''"/>
+ <xsl:param name="type" select="''"/>
+
+ <xsl:for-each select="seealso">
+ <xsl:sort select="translate(., 'Aa&#192;&#224;&#193;&#225;&#194;&#226;&#195;&#227;&#196;&#228;&#197;&#229;&#256;&#257;&#258;&#259;&#260;&#261;&#461;&#462;&#478;&#479;&#480;&#481;&#506;&#507;&#512;&#513;&#514;&#515;&#550;&#551;&#7680;&#7681;&#7834;&#7840;&#7841;&#7842;&#7843;&#7844;&#7845;&#7846;&#7847;&#7848;&#7849;&#7850;&#7851;&#7852;&#7853;&#7854;&#7855;&#7856;&#7857;&#7858;&#7859;&#7860;&#7861;&#7862;&#7863;Bb&#384;&#385;&#595;&#386;&#387;&#7682;&#7683;&#7684;&#7685;&#7686;&#7687;Cc&#199;&#231;&#262;&#263;&#264;&#265;&#266;&#267;&#268;&#269;&#391;&#392;&#597;&#7688;&#7689;Dd&#270;&#271;&#272;&#273;&#394;&#599;&#395;&#396;&#453;&#498;&#545;&#598;&#7690;&#7691;&#7692;&#7693;&#7694;&#7695;&#7696;&#7697;&#7698;&#7699;Ee&#200;&#232;&#201;&#233;&#202;&#234;&#203;&#235;&#274;&#275;&#276;&#277;&#278;&#279;&#280;&#281;&#282;&#283;&#516;&#517;&#518;&#519;&#552;&#553;&#7700;&#7701;&#7702;&#7703;&#7704;&#7705;&#7706;&#7707;&#7708;&#7709;&#7864;&#7865;&#7866;&#7867;&#7868;&#7869;&#7870;&#7871;&#7872;&#7873;&#7874;&#7875;&#7876;&#7877;&#7878;&#7879;Ff&#401;&#402;&#7710;&#7711;Gg&#284;&#285;&#286;&#287;&#288;&#289;&#290;&#291;&#403;&#608;&#484;&#485;&#486;&#487;&#500;&#501;&#7712;&#7713;Hh&#292;&#293;&#294;&#295;&#542;&#543;&#614;&#7714;&#7715;&#7716;&#7717;&#7718;&#7719;&#7720;&#7721;&#7722;&#7723;&#7830;Ii&#204;&#236;&#205;&#237;&#206;&#238;&#207;&#239;&#296;&#297;&#298;&#299;&#300;&#301;&#302;&#303;&#304;&#407;&#616;&#463;&#464;&#520;&#521;&#522;&#523;&#7724;&#7725;&#7726;&#7727;&#7880;&#7881;&#7882;&#7883;Jj&#308;&#309;&#496;&#669;Kk&#310;&#311;&#408;&#409;&#488;&#489;&#7728;&#7729;&#7730;&#7731;&#7732;&#7733;Ll&#313;&#314;&#315;&#316;&#317;&#318;&#319;&#320;&#321;&#322;&#410;&#456;&#564;&#619;&#620;&#621;&#7734;&#7735;&#7736;&#7737;&#7738;&#7739;&#7740;&#7741;Mm&#625;&#7742;&#7743;&#7744;&#7745;&#7746;&#7747;Nn&#209;&#241;&#323;&#324;&#325;&#326;&#327;&#328;&#413;&#626;&#414;&#544;&#459;&#504;&#505;&#565;&#627;&#7748;&#7749;&#7750;&#7751;&#7752;&#7753;&#7754;&#7755;Oo&#210;&#242;&#211;&#243;&#212;&#244;&#213;&#245;&#214;&#246;&#216;&#248;&#332;&#333;&#334;&#335;&#336;&#337;&#415;&#416;&#417;&#465;&#466;&#490;&#491;&#492;&#493;&#510;&#511;&#524;&#525;&#526;&#527;&#554;&#555;&#556;&#557;&#558;&#559;&#560;&#561;&#7756;&#7757;&#7758;&#7759;&#7760;&#7761;&#7762;&#7763;&#7884;&#7885;&#7886;&#7887;&#7888;&#7889;&#7890;&#7891;&#7892;&#7893;&#7894;&#7895;&#7896;&#7897;&#7898;&#7899;&#7900;&#7901;&#7902;&#7903;&#7904;&#7905;&#7906;&#7907;Pp&#420;&#421;&#7764;&#7765;&#7766;&#7767;Qq&#672;Rr&#340;&#341;&#342;&#343;&#344;&#345;&#528;&#529;&#530;&#531;&#636;&#637;&#638;&#7768;&#7769;&#7770;&#7771;&#7772;&#7773;&#7774;&#7775;Ss&#346;&#347;&#348;&#349;&#350;&#351;&#352;&#353;&#536;&#537;&#642;&#7776;&#7777;&#7778;&#7779;&#7780;&#7781;&#7782;&#7783;&#7784;&#7785;Tt&#354;&#355;&#356;&#357;&#358;&#359;&#427;&#428;&#429;&#430;&#648;&#538;&#539;&#566;&#7786;&#7787;&#7788;&#7789;&#7790;&#7791;&#7792;&#7793;&#7831;Uu&#217;&#249;&#218;&#250;&#219;&#251;&#220;&#252;&#360;&#361;&#362;&#363;&#364;&#365;&#366;&#367;&#368;&#369;&#370;&#371;&#431;&#432;&#467;&#468;&#469;&#470;&#471;&#472;&#473;&#474;&#475;&#476;&#532;&#533;&#534;&#535;&#7794;&#7795;&#7796;&#7797;&#7798;&#7799;&#7800;&#7801;&#7802;&#7803;&#7908;&#7909;&#7910;&#7911;&#7912;&#7913;&#7914;&#7915;&#7916;&#7917;&#7918;&#7919;&#7920;&#7921;Vv&#434;&#651;&#7804;&#7805;&#7806;&#7807;Ww&#372;&#373;&#7808;&#7809;&#7810;&#7811;&#7812;&#7813;&#7814;&#7815;&#7816;&#7817;&#7832;Xx&#7818;&#7819;&#7820;&#7821;Yy&#221;&#253;&#255;&#376;&#374;&#375;&#435;&#436;&#562;&#563;&#7822;&#7823;&#7833;&#7922;&#7923;&#7924;&#7925;&#7926;&#7927;&#7928;&#7929;Zz&#377;&#378;&#379;&#380;&#381;&#382;&#437;&#438;&#548;&#549;&#656;&#657;&#7824;&#7825;&#7826;&#7827;&#7828;&#7829;&#7829;', 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBCCCCCCCCCCCCCCCCCDDDDDDDDDDDDDDDDDDDDDDDDEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEFFFFFFGGGGGGGGGGGGGGGGGGGGHHHHHHHHHHHHHHHHHHHHIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIJJJJJJKKKKKKKKKKKKKKLLLLLLLLLLLLLLLLLLLLLLLLLLMMMMMMMMMNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOPPPPPPPPQQQRRRRRRRRRRRRRRRRRRRRRRRSSSSSSSSSSSSSSSSSSSSSSSTTTTTTTTTTTTTTTTTTTTTTTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUVVVVVVVVWWWWWWWWWWWWWWWXXXXXXYYYYYYYYYYYYYYYYYYYYYYYZZZZZZZZZZZZZZZZZZZZZ')"/>
+ <dt>
+ <xsl:text>(</xsl:text>
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'seealso'"/>
+ </xsl:call-template>
+ <xsl:text> </xsl:text>
+ <xsl:value-of select="."/>
+ <xsl:text>)</xsl:text>
+ </dt>
+ </xsl:for-each>
+</xsl:template>
+
+<xsl:template match="*" mode="index-title-content">
+ <xsl:variable name="title">
+ <xsl:apply-templates select="(ancestor-or-self::set|ancestor-or-self::book|ancestor-or-self::part|ancestor-or-self::reference|ancestor-or-self::partintro|ancestor-or-self::chapter|ancestor-or-self::appendix|ancestor-or-self::preface|ancestor-or-self::article|ancestor-or-self::section|ancestor-or-self::sect1|ancestor-or-self::sect2|ancestor-or-self::sect3|ancestor-or-self::sect4|ancestor-or-self::sect5|ancestor-or-self::refentry|ancestor-or-self::refsect1|ancestor-or-self::refsect2|ancestor-or-self::refsect3|ancestor-or-self::simplesect|ancestor-or-self::bibliography|ancestor-or-self::glossary|ancestor-or-self::index|ancestor-or-self::webpage)[last()]" mode="title.markup"/>
+ </xsl:variable>
+
+ <xsl:value-of select="$title"/>
+</xsl:template>
+
+<xsl:template name="index.separator">
+ <xsl:param name="key" select="''"/>
+ <xsl:param name="lang">
+ <xsl:call-template name="l10n.language"/>
+ </xsl:param>
+
+ <xsl:choose>
+ <xsl:when test="$key = 'index.term.separator'">
+ <xsl:choose>
+ <!-- Use the override if not blank -->
+ <xsl:when test="$index.term.separator != ''">
+ <xsl:copy-of select="$index.term.separator"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="gentext.template">
+ <xsl:with-param name="lang" select="$lang"/>
+ <xsl:with-param name="context">index</xsl:with-param>
+ <xsl:with-param name="name">term-separator</xsl:with-param>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:when test="$key = 'index.number.separator'">
+ <xsl:choose>
+ <!-- Use the override if not blank -->
+ <xsl:when test="$index.number.separator != ''">
+ <xsl:copy-of select="$index.number.separator"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="gentext.template">
+ <xsl:with-param name="lang" select="$lang"/>
+ <xsl:with-param name="context">index</xsl:with-param>
+ <xsl:with-param name="name">number-separator</xsl:with-param>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:when test="$key = 'index.range.separator'">
+ <xsl:choose>
+ <!-- Use the override if not blank -->
+ <xsl:when test="$index.range.separator != ''">
+ <xsl:copy-of select="$index.range.separator"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="gentext.template">
+ <xsl:with-param name="lang" select="$lang"/>
+ <xsl:with-param name="context">index</xsl:with-param>
+ <xsl:with-param name="name">range-separator</xsl:with-param>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ </xsl:choose>
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/autotoc.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/autotoc.xsl
new file mode 100644
index 0000000..a337ec5
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/autotoc.xsl
@@ -0,0 +1,663 @@
+<?xml version="1.0" encoding="ASCII"?>
+<!--This file was created automatically by html2xhtml-->
+<!--from the HTML stylesheets.-->
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1999/xhtml" version="1.0">
+
+<!-- ********************************************************************
+ $Id: autotoc.xsl 8558 2009-12-11 00:33:17Z bobstayton $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<xsl:variable name="toc.listitem.type">
+ <xsl:choose>
+ <xsl:when test="$toc.list.type = 'dl'">dt</xsl:when>
+ <xsl:otherwise>li</xsl:otherwise>
+ </xsl:choose>
+</xsl:variable>
+
+<!-- this is just hack because dl and ul aren't completely isomorphic -->
+<xsl:variable name="toc.dd.type">
+ <xsl:choose>
+ <xsl:when test="$toc.list.type = 'dl'">dd</xsl:when>
+ <xsl:otherwise/>
+ </xsl:choose>
+</xsl:variable>
+
+<xsl:template name="make.toc">
+ <xsl:param name="toc-context" select="."/>
+ <xsl:param name="toc.title.p" select="true()"/>
+ <xsl:param name="nodes" select="/NOT-AN-ELEMENT"/>
+
+ <xsl:variable name="nodes.plus" select="$nodes | qandaset"/>
+
+ <xsl:variable name="toc.title">
+ <xsl:if test="$toc.title.p">
+ <xsl:choose>
+ <xsl:when test="$make.clean.html != 0">
+ <div class="toc-title">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key">TableofContents</xsl:with-param>
+ </xsl:call-template>
+ </div>
+ </xsl:when>
+ <xsl:otherwise>
+ <p>
+ <strong xmlns:xslo="http://www.w3.org/1999/XSL/Transform">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key">TableofContents</xsl:with-param>
+ </xsl:call-template>
+ </strong>
+ </p>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:if>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="$manual.toc != ''">
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+ <xsl:variable name="toc" select="document($manual.toc, .)"/>
+ <xsl:variable name="tocentry" select="$toc//tocentry[@linkend=$id]"/>
+ <xsl:if test="$tocentry and $tocentry/*">
+ <div class="toc">
+ <xsl:copy-of select="$toc.title"/>
+ <xsl:element name="{$toc.list.type}" namespace="http://www.w3.org/1999/xhtml">
+ <xsl:call-template name="manual-toc">
+ <xsl:with-param name="tocentry" select="$tocentry/*[1]"/>
+ </xsl:call-template>
+ </xsl:element>
+ </div>
+ </xsl:if>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:choose>
+ <xsl:when test="$qanda.in.toc != 0">
+ <xsl:if test="$nodes.plus">
+ <div class="toc">
+ <xsl:copy-of select="$toc.title"/>
+ <xsl:element name="{$toc.list.type}" namespace="http://www.w3.org/1999/xhtml">
+ <xsl:apply-templates select="$nodes.plus" mode="toc">
+ <xsl:with-param name="toc-context" select="$toc-context"/>
+ </xsl:apply-templates>
+ </xsl:element>
+ </div>
+ </xsl:if>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:if test="$nodes">
+ <div class="toc">
+ <xsl:copy-of select="$toc.title"/>
+ <xsl:element name="{$toc.list.type}" namespace="http://www.w3.org/1999/xhtml">
+ <xsl:apply-templates select="$nodes" mode="toc">
+ <xsl:with-param name="toc-context" select="$toc-context"/>
+ </xsl:apply-templates>
+ </xsl:element>
+ </div>
+ </xsl:if>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="make.lots">
+ <xsl:param name="toc.params" select="''"/>
+ <xsl:param name="toc"/>
+
+ <xsl:if test="contains($toc.params, 'toc')">
+ <xsl:copy-of select="$toc"/>
+ </xsl:if>
+
+ <xsl:if test="contains($toc.params, 'figure')">
+ <xsl:call-template name="list.of.titles">
+ <xsl:with-param name="titles" select="'figure'"/>
+ <xsl:with-param name="nodes" select=".//figure"/>
+ </xsl:call-template>
+ </xsl:if>
+
+ <xsl:if test="contains($toc.params, 'table')">
+ <xsl:call-template name="list.of.titles">
+ <xsl:with-param name="titles" select="'table'"/>
+ <xsl:with-param name="nodes" select=".//table"/>
+ </xsl:call-template>
+ </xsl:if>
+
+ <xsl:if test="contains($toc.params, 'example')">
+ <xsl:call-template name="list.of.titles">
+ <xsl:with-param name="titles" select="'example'"/>
+ <xsl:with-param name="nodes" select=".//example"/>
+ </xsl:call-template>
+ </xsl:if>
+
+ <xsl:if test="contains($toc.params, 'equation')">
+ <xsl:call-template name="list.of.titles">
+ <xsl:with-param name="titles" select="'equation'"/>
+ <xsl:with-param name="nodes" select=".//equation[title or info/title]"/>
+ </xsl:call-template>
+ </xsl:if>
+
+ <xsl:if test="contains($toc.params, 'procedure')">
+ <xsl:call-template name="list.of.titles">
+ <xsl:with-param name="titles" select="'procedure'"/>
+ <xsl:with-param name="nodes" select=".//procedure[title]"/>
+ </xsl:call-template>
+ </xsl:if>
+</xsl:template>
+
+<!-- ====================================================================== -->
+
+<xsl:template name="set.toc">
+ <xsl:param name="toc-context" select="."/>
+ <xsl:param name="toc.title.p" select="true()"/>
+
+ <xsl:call-template name="make.toc">
+ <xsl:with-param name="toc-context" select="$toc-context"/>
+ <xsl:with-param name="toc.title.p" select="$toc.title.p"/>
+ <xsl:with-param name="nodes" select="book|setindex"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template name="division.toc">
+ <xsl:param name="toc-context" select="."/>
+ <xsl:param name="toc.title.p" select="true()"/>
+
+ <xsl:call-template name="make.toc">
+ <xsl:with-param name="toc-context" select="$toc-context"/>
+ <xsl:with-param name="toc.title.p" select="$toc.title.p"/>
+ <xsl:with-param name="nodes" select="part|reference |preface|chapter|appendix |article |bibliography|glossary|index |refentry |bridgehead[$bridgehead.in.toc != 0]"/>
+
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template name="component.toc">
+ <xsl:param name="toc-context" select="."/>
+ <xsl:param name="toc.title.p" select="true()"/>
+
+ <xsl:call-template name="make.toc">
+ <xsl:with-param name="toc-context" select="$toc-context"/>
+ <xsl:with-param name="toc.title.p" select="$toc.title.p"/>
+ <xsl:with-param name="nodes" select="section|sect1 |simplesect[$simplesect.in.toc != 0] |refentry |article|bibliography|glossary |appendix|index |bridgehead[not(@renderas) and $bridgehead.in.toc != 0] |.//bridgehead[@renderas='sect1' and $bridgehead.in.toc != 0]"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template name="component.toc.separator">
+ <!-- Customize to output something between
+ component.toc and first output -->
+</xsl:template>
+
+<xsl:template name="section.toc">
+ <xsl:param name="toc-context" select="."/>
+ <xsl:param name="toc.title.p" select="true()"/>
+
+ <xsl:call-template name="make.toc">
+ <xsl:with-param name="toc-context" select="$toc-context"/>
+ <xsl:with-param name="toc.title.p" select="$toc.title.p"/>
+ <xsl:with-param name="nodes" select="section|sect1|sect2|sect3|sect4|sect5|refentry |bridgehead[$bridgehead.in.toc != 0]"/>
+
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template name="section.toc.separator">
+ <!-- Customize to output something between
+ section.toc and first output -->
+</xsl:template>
+<!-- ==================================================================== -->
+
+<xsl:template name="subtoc">
+ <xsl:param name="toc-context" select="."/>
+ <xsl:param name="nodes" select="NOT-AN-ELEMENT"/>
+
+ <xsl:variable name="nodes.plus" select="$nodes | qandaset"/>
+
+ <xsl:variable name="subtoc">
+ <xsl:element name="{$toc.list.type}" namespace="http://www.w3.org/1999/xhtml">
+ <xsl:choose>
+ <xsl:when test="$qanda.in.toc != 0">
+ <xsl:apply-templates mode="toc" select="$nodes.plus">
+ <xsl:with-param name="toc-context" select="$toc-context"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates mode="toc" select="$nodes">
+ <xsl:with-param name="toc-context" select="$toc-context"/>
+ </xsl:apply-templates>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:element>
+ </xsl:variable>
+
+ <xsl:variable name="depth">
+ <xsl:choose>
+ <xsl:when test="local-name(.) = 'section'">
+ <xsl:value-of select="count(ancestor::section) + 1"/>
+ </xsl:when>
+ <xsl:when test="local-name(.) = 'sect1'">1</xsl:when>
+ <xsl:when test="local-name(.) = 'sect2'">2</xsl:when>
+ <xsl:when test="local-name(.) = 'sect3'">3</xsl:when>
+ <xsl:when test="local-name(.) = 'sect4'">4</xsl:when>
+ <xsl:when test="local-name(.) = 'sect5'">5</xsl:when>
+ <xsl:when test="local-name(.) = 'refsect1'">1</xsl:when>
+ <xsl:when test="local-name(.) = 'refsect2'">2</xsl:when>
+ <xsl:when test="local-name(.) = 'refsect3'">3</xsl:when>
+ <xsl:when test="local-name(.) = 'simplesect'">
+ <!-- sigh... -->
+ <xsl:choose>
+ <xsl:when test="local-name(..) = 'section'">
+ <xsl:value-of select="count(ancestor::section)"/>
+ </xsl:when>
+ <xsl:when test="local-name(..) = 'sect1'">2</xsl:when>
+ <xsl:when test="local-name(..) = 'sect2'">3</xsl:when>
+ <xsl:when test="local-name(..) = 'sect3'">4</xsl:when>
+ <xsl:when test="local-name(..) = 'sect4'">5</xsl:when>
+ <xsl:when test="local-name(..) = 'sect5'">6</xsl:when>
+ <xsl:when test="local-name(..) = 'refsect1'">2</xsl:when>
+ <xsl:when test="local-name(..) = 'refsect2'">3</xsl:when>
+ <xsl:when test="local-name(..) = 'refsect3'">4</xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>0</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="depth.from.context" select="count(ancestor::*)-count($toc-context/ancestor::*)"/>
+
+ <xsl:variable name="subtoc.list">
+ <xsl:choose>
+ <xsl:when test="$toc.dd.type = ''">
+ <xsl:copy-of select="$subtoc"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:element name="{$toc.dd.type}" namespace="http://www.w3.org/1999/xhtml">
+ <xsl:copy-of select="$subtoc"/>
+ </xsl:element>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:element name="{$toc.listitem.type}" namespace="http://www.w3.org/1999/xhtml">
+ <xsl:call-template name="toc.line">
+ <xsl:with-param name="toc-context" select="$toc-context"/>
+ </xsl:call-template>
+ <xsl:if test="$toc.listitem.type = 'li' and $toc.section.depth &gt; $depth and ( ($qanda.in.toc = 0 and count($nodes)&gt;0) or ($qanda.in.toc != 0 and count($nodes.plus)&gt;0) ) and $toc.max.depth &gt; $depth.from.context">
+ <xsl:copy-of select="$subtoc.list"/>
+ </xsl:if>
+ </xsl:element>
+ <xsl:if test="$toc.listitem.type != 'li' and $toc.section.depth &gt; $depth and ( ($qanda.in.toc = 0 and count($nodes)&gt;0) or ($qanda.in.toc != 0 and count($nodes.plus)&gt;0) ) and $toc.max.depth &gt; $depth.from.context">
+ <xsl:copy-of select="$subtoc.list"/>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template name="toc.line">
+ <xsl:param name="toc-context" select="."/>
+ <xsl:param name="depth" select="1"/>
+ <xsl:param name="depth.from.context" select="8"/>
+
+ <span>
+ <xsl:attribute name="class"><xsl:value-of select="local-name(.)"/></xsl:attribute>
+
+ <!-- * if $autotoc.label.in.hyperlink is zero, then output the label -->
+ <!-- * before the hyperlinked title (as the DSSSL stylesheet does) -->
+ <xsl:if test="$autotoc.label.in.hyperlink = 0">
+ <xsl:variable name="label">
+ <xsl:apply-templates select="." mode="label.markup"/>
+ </xsl:variable>
+ <xsl:copy-of select="$label"/>
+ <xsl:if test="$label != ''">
+ <xsl:value-of select="$autotoc.label.separator"/>
+ </xsl:if>
+ </xsl:if>
+
+ <a>
+ <xsl:attribute name="href">
+ <xsl:call-template name="href.target">
+ <xsl:with-param name="context" select="$toc-context"/>
+ <xsl:with-param name="toc-context" select="$toc-context"/>
+ </xsl:call-template>
+ </xsl:attribute>
+
+ <!-- * if $autotoc.label.in.hyperlink is non-zero, then output the label -->
+ <!-- * as part of the hyperlinked title -->
+ <xsl:if test="not($autotoc.label.in.hyperlink = 0)">
+ <xsl:variable name="label">
+ <xsl:apply-templates select="." mode="label.markup"/>
+ </xsl:variable>
+ <xsl:copy-of select="$label"/>
+ <xsl:if test="$label != ''">
+ <xsl:value-of select="$autotoc.label.separator"/>
+ </xsl:if>
+ </xsl:if>
+
+ <xsl:apply-templates select="." mode="titleabbrev.markup"/>
+ </a>
+ </span>
+</xsl:template>
+
+<xsl:template match="book" mode="toc">
+ <xsl:param name="toc-context" select="."/>
+
+ <xsl:call-template name="subtoc">
+ <xsl:with-param name="toc-context" select="$toc-context"/>
+ <xsl:with-param name="nodes" select="part|reference |preface|chapter|appendix |article |bibliography|glossary|index |refentry |bridgehead[$bridgehead.in.toc != 0]"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="setindex" mode="toc">
+ <xsl:param name="toc-context" select="."/>
+
+ <!-- If the setindex tag is not empty, it should be it in the TOC -->
+ <xsl:if test="* or $generate.index != 0">
+ <xsl:call-template name="subtoc">
+ <xsl:with-param name="toc-context" select="$toc-context"/>
+ </xsl:call-template>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="part|reference" mode="toc">
+ <xsl:param name="toc-context" select="."/>
+
+ <xsl:call-template name="subtoc">
+ <xsl:with-param name="toc-context" select="$toc-context"/>
+ <xsl:with-param name="nodes" select="appendix|chapter|article |index|glossary|bibliography |preface|reference|refentry |bridgehead[$bridgehead.in.toc != 0]"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="preface|chapter|appendix|article" mode="toc">
+ <xsl:param name="toc-context" select="."/>
+
+ <xsl:call-template name="subtoc">
+ <xsl:with-param name="toc-context" select="$toc-context"/>
+ <xsl:with-param name="nodes" select="section|sect1 |simplesect[$simplesect.in.toc != 0] |refentry |glossary|bibliography|index |bridgehead[$bridgehead.in.toc != 0]"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="sect1" mode="toc">
+ <xsl:param name="toc-context" select="."/>
+ <xsl:call-template name="subtoc">
+ <xsl:with-param name="toc-context" select="$toc-context"/>
+ <xsl:with-param name="nodes" select="sect2 |bridgehead[$bridgehead.in.toc != 0]"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="sect2" mode="toc">
+ <xsl:param name="toc-context" select="."/>
+
+ <xsl:call-template name="subtoc">
+ <xsl:with-param name="toc-context" select="$toc-context"/>
+ <xsl:with-param name="nodes" select="sect3 |bridgehead[$bridgehead.in.toc != 0]"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="sect3" mode="toc">
+ <xsl:param name="toc-context" select="."/>
+
+ <xsl:call-template name="subtoc">
+ <xsl:with-param name="toc-context" select="$toc-context"/>
+ <xsl:with-param name="nodes" select="sect4 |bridgehead[$bridgehead.in.toc != 0]"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="sect4" mode="toc">
+ <xsl:param name="toc-context" select="."/>
+
+ <xsl:call-template name="subtoc">
+ <xsl:with-param name="toc-context" select="$toc-context"/>
+ <xsl:with-param name="nodes" select="sect5 |bridgehead[$bridgehead.in.toc != 0]"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="sect5" mode="toc">
+ <xsl:param name="toc-context" select="."/>
+
+ <xsl:call-template name="subtoc">
+ <xsl:with-param name="toc-context" select="$toc-context"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="simplesect" mode="toc">
+ <xsl:param name="toc-context" select="."/>
+
+ <xsl:call-template name="subtoc">
+ <xsl:with-param name="toc-context" select="$toc-context"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="section" mode="toc">
+ <xsl:param name="toc-context" select="."/>
+
+ <xsl:call-template name="subtoc">
+ <xsl:with-param name="toc-context" select="$toc-context"/>
+ <xsl:with-param name="nodes" select="section|refentry |simplesect[$simplesect.in.toc != 0] |bridgehead[$bridgehead.in.toc != 0]"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="bridgehead" mode="toc">
+ <xsl:param name="toc-context" select="."/>
+
+ <xsl:if test="$bridgehead.in.toc != 0">
+ <xsl:call-template name="subtoc">
+ <xsl:with-param name="toc-context" select="$toc-context"/>
+ </xsl:call-template>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="bibliography|glossary" mode="toc">
+ <xsl:param name="toc-context" select="."/>
+
+ <xsl:call-template name="subtoc">
+ <xsl:with-param name="toc-context" select="$toc-context"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="index" mode="toc">
+ <xsl:param name="toc-context" select="."/>
+
+ <!-- If the index tag is not empty, it should be it in the TOC -->
+ <xsl:if test="* or $generate.index != 0">
+ <xsl:call-template name="subtoc">
+ <xsl:with-param name="toc-context" select="$toc-context"/>
+ </xsl:call-template>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="refentry" mode="toc">
+ <xsl:param name="toc-context" select="."/>
+
+ <xsl:variable name="refmeta" select=".//refmeta"/>
+ <xsl:variable name="refentrytitle" select="$refmeta//refentrytitle"/>
+ <xsl:variable name="refnamediv" select=".//refnamediv"/>
+ <xsl:variable name="refname" select="$refnamediv//refname"/>
+ <xsl:variable name="refdesc" select="$refnamediv//refdescriptor"/>
+ <xsl:variable name="title">
+ <xsl:choose>
+ <xsl:when test="$refentrytitle">
+ <xsl:apply-templates select="$refentrytitle[1]" mode="titleabbrev.markup"/>
+ </xsl:when>
+ <xsl:when test="$refdesc">
+ <xsl:apply-templates select="$refdesc" mode="titleabbrev.markup"/>
+ </xsl:when>
+ <xsl:when test="$refname">
+ <xsl:apply-templates select="$refname[1]" mode="titleabbrev.markup"/>
+ </xsl:when>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:element name="{$toc.listitem.type}" namespace="http://www.w3.org/1999/xhtml">
+ <span class="refentrytitle">
+ <a>
+ <xsl:attribute name="href">
+ <xsl:call-template name="href.target">
+ <xsl:with-param name="toc-context" select="$toc-context"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:copy-of select="$title"/>
+ </a>
+ </span>
+ <span class="refpurpose">
+ <xsl:if test="$annotate.toc != 0">
+ <!-- * DocBook 5 says inlinemediaobject (among other things) -->
+ <!-- * is allowed in refpurpose; so we need to run -->
+ <!-- * apply-templates on refpurpose here, instead of value-of -->
+ <xsl:apply-templates select="refnamediv/refpurpose"/>
+ </xsl:if>
+ </span>
+ </xsl:element>
+</xsl:template>
+
+<xsl:template match="title" mode="toc">
+ <xsl:param name="toc-context" select="."/>
+
+ <a>
+ <xsl:attribute name="href">
+ <xsl:call-template name="href.target">
+ <xsl:with-param name="object" select=".."/>
+ <xsl:with-param name="toc-context" select="$toc-context"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:apply-templates/>
+ </a>
+</xsl:template>
+
+<xsl:template name="manual-toc">
+ <xsl:param name="toc-context" select="."/>
+ <xsl:param name="tocentry"/>
+
+ <!-- be careful, we don't want to change the current document to the other tree! -->
+
+ <xsl:if test="$tocentry">
+ <xsl:variable name="node" select="key('id', $tocentry/@linkend)"/>
+
+ <xsl:element name="{$toc.listitem.type}" namespace="http://www.w3.org/1999/xhtml">
+ <xsl:variable name="label">
+ <xsl:apply-templates select="$node" mode="label.markup"/>
+ </xsl:variable>
+ <xsl:copy-of select="$label"/>
+ <xsl:if test="$label != ''">
+ <xsl:value-of select="$autotoc.label.separator"/>
+ </xsl:if>
+ <a>
+ <xsl:attribute name="href">
+ <xsl:call-template name="href.target">
+ <xsl:with-param name="object" select="$node"/>
+ <xsl:with-param name="toc-context" select="$toc-context"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:apply-templates select="$node" mode="titleabbrev.markup"/>
+ </a>
+ </xsl:element>
+
+ <xsl:if test="$tocentry/*">
+ <xsl:element name="{$toc.list.type}" namespace="http://www.w3.org/1999/xhtml">
+ <xsl:call-template name="manual-toc">
+ <xsl:with-param name="tocentry" select="$tocentry/*[1]"/>
+ </xsl:call-template>
+ </xsl:element>
+ </xsl:if>
+
+ <xsl:if test="$tocentry/following-sibling::*">
+ <xsl:call-template name="manual-toc">
+ <xsl:with-param name="tocentry" select="$tocentry/following-sibling::*[1]"/>
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:if>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template name="list.of.titles">
+ <xsl:param name="toc-context" select="."/>
+ <xsl:param name="titles" select="'table'"/>
+ <xsl:param name="nodes" select=".//table"/>
+
+ <xsl:if test="$nodes">
+ <div class="list-of-{$titles}s">
+ <xsl:choose>
+ <xsl:when test="$make.clean.html != 0">
+ <div class="toc-title">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key">
+ <xsl:choose>
+ <xsl:when test="$titles='table'">ListofTables</xsl:when>
+ <xsl:when test="$titles='figure'">ListofFigures</xsl:when>
+ <xsl:when test="$titles='equation'">ListofEquations</xsl:when>
+ <xsl:when test="$titles='example'">ListofExamples</xsl:when>
+ <xsl:when test="$titles='procedure'">ListofProcedures</xsl:when>
+ <xsl:otherwise>ListofUnknown</xsl:otherwise>
+ </xsl:choose>
+ </xsl:with-param>
+ </xsl:call-template>
+ </div>
+ </xsl:when>
+ <xsl:otherwise>
+ <p>
+ <strong xmlns:xslo="http://www.w3.org/1999/XSL/Transform">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key">
+ <xsl:choose>
+ <xsl:when test="$titles='table'">ListofTables</xsl:when>
+ <xsl:when test="$titles='figure'">ListofFigures</xsl:when>
+ <xsl:when test="$titles='equation'">ListofEquations</xsl:when>
+ <xsl:when test="$titles='example'">ListofExamples</xsl:when>
+ <xsl:when test="$titles='procedure'">ListofProcedures</xsl:when>
+ <xsl:otherwise>ListofUnknown</xsl:otherwise>
+ </xsl:choose>
+ </xsl:with-param>
+ </xsl:call-template>
+ </strong>
+ </p>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:element name="{$toc.list.type}" namespace="http://www.w3.org/1999/xhtml">
+ <xsl:apply-templates select="$nodes" mode="toc">
+ <xsl:with-param name="toc-context" select="$toc-context"/>
+ </xsl:apply-templates>
+ </xsl:element>
+ </div>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="figure|table|example|equation|procedure" mode="toc">
+ <xsl:param name="toc-context" select="."/>
+
+ <xsl:element name="{$toc.listitem.type}" namespace="http://www.w3.org/1999/xhtml">
+ <xsl:variable name="label">
+ <xsl:apply-templates select="." mode="label.markup"/>
+ </xsl:variable>
+ <xsl:copy-of select="$label"/>
+ <xsl:if test="$label != ''">
+ <xsl:value-of select="$autotoc.label.separator"/>
+ </xsl:if>
+ <a>
+ <xsl:attribute name="href">
+ <xsl:call-template name="href.target">
+ <xsl:with-param name="toc-context" select="$toc-context"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:apply-templates select="." mode="titleabbrev.markup"/>
+ </a>
+ </xsl:element>
+</xsl:template>
+
+<!-- Used only if qanda.in.toc parameter is non-zero -->
+<xsl:template match="qandaset" mode="toc">
+ <xsl:param name="toc-context" select="."/>
+ <xsl:call-template name="subtoc">
+ <xsl:with-param name="toc-context" select="$toc-context"/>
+ <xsl:with-param name="nodes" select="qandadiv | qandaentry"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="qandadiv|qandaentry" mode="toc">
+ <xsl:apply-templates select="." mode="qandatoc.mode"/>
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/biblio-iso690.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/biblio-iso690.xsl
new file mode 100644
index 0000000..7713409
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/biblio-iso690.xsl
@@ -0,0 +1,1300 @@
+<?xml version="1.0" encoding="ASCII"?>
+<!--This file was created automatically by html2xhtml-->
+<!--from the HTML stylesheets.-->
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1999/xhtml" version="1.0">
+
+
+<!-- ********************************************************************
+ $Id: biblio.xsl 6402 2006-11-12 08:23:21Z bobstayton $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ The original code for processing bibliography in ISO690 style
+ was provided by Jana Dvorakova <jana4u@seznam.cz>
+
+ ******************************************************************** -->
+
+<!-- ==================================================================== -->
+
+<!-- if biblioentry.alt.primary.seps is set to nonzero value then use alternative separators for primary responsibility - $alt.person.two.sep, $alt.person.last.sep, $alt.person.more.sep -->
+<xsl:param name="biblioentry.alt.primary.seps" select="0"/>
+
+<!-- how many authors will be printed if there is more than three authors - set to number 1 (default value), 2 or 3 -->
+<xsl:param name="biblioentry.primary.count" select="1"/>
+
+<!-- ==================================================================== -->
+
+<xsl:template name="iso690.makecitation">
+<!-- Types of resources -->
+ <xsl:choose>
+
+ <!-- SYSTEMS OF ELECTRONIC COMMUNICATION : ENTIRE MESSAGE SYSTEM -->
+ <!-- same as Monographs -->
+ <xsl:when test="./@role='messagesystem'">
+ <xsl:call-template name="iso690.monogr"/>
+ </xsl:when>
+
+ <!-- SYSTEMS OF ELECTRONIC COMMUNICATION : ELECTRONIC MESSAGES -->
+ <!-- same as Contributions to Monographs -->
+ <xsl:when test="./@role='message'">
+ <xsl:call-template name="iso690.paper.mon"/>
+ </xsl:when>
+
+ <!-- SERIALS -->
+ <xsl:when test="./@role='serial' or ./biblioid/@class='issn' or ./issn">
+ <xsl:call-template name="iso690.serial"/>
+ </xsl:when>
+
+ <!-- PARTS OF MONOGRAPHS -->
+ <xsl:when test="./@role='part' or (./bibliomisc[@role='secnum']|./bibliomisc[@role='sectitle'])">
+ <xsl:call-template name="iso690.monogr.part"/>
+ </xsl:when>
+
+ <!-- CONTRIBUTIONS TO MONOGRAPHS -->
+ <xsl:when test="./@role='contribution' or (./biblioset/@relation='part' and ./biblioset/@relation='book')">
+ <xsl:call-template name="iso690.paper.mon"/>
+ </xsl:when>
+
+ <!-- ARTICLES, ETC., IN SERIALS -->
+ <xsl:when test="./@role='article' or (./biblioset/@relation='journal' and ./biblioset/@relation='article')">
+ <xsl:call-template name="iso690.article"/>
+ </xsl:when>
+
+ <!-- PATENT DOCUMENTS -->
+ <xsl:when test="./@role='patent' or (./bibliomisc[@role='patenttype'] and ./bibliomisc[@role='patentnum'])">
+ <xsl:call-template name="iso690.patent"/>
+ </xsl:when>
+
+ <!-- MONOGRAPHS -->
+ <xsl:otherwise>
+ <xsl:call-template name="iso690.monogr"/>
+ </xsl:otherwise>
+
+ </xsl:choose>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<!-- MONOGRAPHS -->
+<xsl:template name="iso690.monogr">
+ <!-- Primary responsibility -->
+ <xsl:call-template name="iso690.primary"/>
+ <!-- Title and Type of medium -->
+ <xsl:call-template name="iso690.title"/>
+ <!-- Subordinate responsibility -->
+ <xsl:call-template name="iso690.secondary"/>
+ <!-- Edition -->
+ <xsl:call-template name="iso690.edition"/>
+ <!-- Place of publication, Publisher, Year/Date of publication, Date of update/revision, Date of citation -->
+ <xsl:call-template name="iso690.pub"/>
+ <!-- Extent -->
+ <xsl:call-template name="iso690.extent"/>
+ <!-- Series -->
+ <xsl:call-template name="iso690.serie"/>
+ <!-- Notes -->
+ <xsl:call-template name="iso690.notice"/>
+ <!-- Avaibility and access -->
+ <xsl:call-template name="iso690.access"/>
+ <!-- Standard number -->
+ <xsl:call-template name="iso690.isbn"/>
+</xsl:template>
+
+<!-- SERIALS -->
+<xsl:template name="iso690.serial">
+ <!-- Title and Type of medium -->
+ <xsl:call-template name="iso690.title"/>
+ <!-- Responsibility [nonEL] -->
+ <xsl:if test="not(./bibliomisc[@role='medium'])">
+ <xsl:call-template name="iso690.secondary"/>
+ </xsl:if>
+ <!-- Edition -->
+ <xsl:call-template name="iso690.edition">
+ <xsl:with-param name="after" select="./bibliomisc[@role='issuing']"/>
+ </xsl:call-template>
+ <!-- Issue designation (date and/or num) [nonEL] -->
+ <xsl:if test="not(./bibliomisc[@role='medium'])">
+ <xsl:call-template name="iso690.issuing"/>
+ </xsl:if>
+ <!-- Place of publication, Publisher, Year/Date of publication, Date of update/revision, Date of citation -->
+ <xsl:call-template name="iso690.pub"/>
+ <!-- Series -->
+ <xsl:call-template name="iso690.serie"/>
+ <!-- Notes -->
+ <xsl:call-template name="iso690.notice"/>
+ <!-- Avaibility and access -->
+ <xsl:call-template name="iso690.access"/>
+ <!-- Standard number -->
+ <xsl:call-template name="iso690.issn"/>
+</xsl:template>
+
+<!-- PARTS OF MONOGRAPHS -->
+<xsl:template name="iso690.monogr.part">
+ <!-- Primary responsibility of host document -->
+ <xsl:call-template name="iso690.primary"/>
+ <!-- Title and Type of medium of host document -->
+ <xsl:call-template name="iso690.title"/>
+ <!-- Subordinate responsibility of host document [EL] -->
+ <xsl:if test="./bibliomisc[@role='medium']">
+ <xsl:call-template name="iso690.secondary"/>
+ </xsl:if>
+ <!-- Edition -->
+ <xsl:call-template name="iso690.edition">
+ <xsl:with-param name="after" select="./volumenum"/>
+ </xsl:call-template>
+ <!-- Numeration of the part [nonEL]-->
+ <xsl:if test="not(./bibliomisc[@role='medium'])">
+ <xsl:call-template name="iso690.partnr"/>
+ <!-- Subordinate responsibility [nonEL] -->
+ <xsl:call-template name="iso690.secondary"/>
+ </xsl:if>
+ <!-- Place of publication, Publisher, Year/Date of publication, Date of update/revision, Date of citation -->
+ <xsl:call-template name="iso690.pub"/>
+ <!-- Location within host -->
+ <xsl:call-template name="iso690.part.location"/>
+ <xsl:if test="./bibliomisc[@role='medium']">
+ <!-- Numeration within host document [EL] -->
+ <!-- Notes [EL] -->
+ <xsl:call-template name="iso690.notice"/>
+ <!-- Avaibility and access [EL] -->
+ <xsl:call-template name="iso690.access"/>
+ <!-- Standard number [EL] -->
+ <xsl:call-template name="iso690.isbn"/>
+ </xsl:if>
+</xsl:template>
+
+<!-- CONTRIBUTIONS TO MONOGRAPHS -->
+<xsl:template name="iso690.paper.mon">
+<!-- Contribution -->
+ <xsl:apply-templates mode="iso690.paper.part" select="./biblioset[@relation='part']"/>
+<!-- In -->
+ <xsl:text>In </xsl:text>
+<!-- Host -->
+ <xsl:apply-templates mode="iso690.paper.book" select="./biblioset[@relation='book']"/>
+</xsl:template>
+
+<xsl:template match="biblioset" mode="iso690.paper.part">
+<!-- Contribution -->
+ <!-- Primary responsibility -->
+ <xsl:call-template name="iso690.primary"/>
+ <!-- Title -->
+ <xsl:call-template name="iso690.title">
+ <xsl:with-param name="italic" select="0"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="biblioset" mode="iso690.paper.book">
+<!-- Host -->
+ <!-- Primary responsibility -->
+ <xsl:call-template name="iso690.primary"/>
+ <!-- Title and Type of medium -->
+ <xsl:call-template name="iso690.title"/>
+ <!-- Subordinate responsibility [EL] -->
+ <xsl:if test="./bibliomisc[@role='medium']">
+ <xsl:call-template name="iso690.secondary"/>
+ </xsl:if>
+ <!-- Edition -->
+ <xsl:call-template name="iso690.edition"/>
+ <!-- Place of publication, Publisher, Year/Date of publication, Date of update/revision, Date of citation -->
+ <xsl:call-template name="iso690.paper.pub"/>
+ <!-- Numeration within host document [EL] -->
+ <!-- Location within host -->
+ <xsl:call-template name="iso690.location"/>
+ <xsl:if test="./bibliomisc[@role='medium']">
+ <!-- Notes [EL] -->
+ <xsl:call-template name="iso690.notice"/>
+ <!-- Avaibility and access [EL] -->
+ <xsl:call-template name="iso690.access"/>
+ <!-- Standard number [EL] -->
+ <xsl:call-template name="iso690.isbn"/>
+ </xsl:if>
+</xsl:template>
+
+<!-- ARTICLES, ETC., IN SERIALS -->
+<xsl:template name="iso690.article">
+<!-- Article -->
+ <xsl:apply-templates mode="iso690.article.art" select="./biblioset[@relation='article']"/>
+<!-- Serial -->
+ <xsl:apply-templates mode="iso690.article.jour" select="./biblioset[@relation='journal']"/>
+</xsl:template>
+
+<xsl:template match="biblioset" mode="iso690.article.art">
+<!-- Article -->
+ <!-- Primary responsibility -->
+ <xsl:call-template name="iso690.primary"/>
+ <!-- Title -->
+ <xsl:call-template name="iso690.title">
+ <xsl:with-param name="italic" select="0"/>
+ </xsl:call-template>
+ <!-- Subordinate responsibility [nonEL] -->
+ <xsl:if test="not(../*/bibliomisc[@role='medium'])">
+ <xsl:call-template name="iso690.secondary"/>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="biblioset" mode="iso690.article.jour">
+<!-- Serial -->
+ <!-- Title and Type of medium -->
+ <xsl:call-template name="iso690.title"/>
+ <!-- Edition -->
+ <xsl:call-template name="iso690.edition">
+ <xsl:with-param name="after" select="./pubdate[not(@role='issuing')]|./volumenum|./issuenum|./pagenums"/>
+ </xsl:call-template>
+ <!-- Number designation [EL] -->
+ <!-- Location within host -->
+ <xsl:call-template name="iso690.article.location"/>
+ <xsl:if test="./bibliomisc[@role='medium']">
+ <!-- Notes [EL] -->
+ <xsl:call-template name="iso690.notice"/>
+ <!-- Avaibility and access [EL] -->
+ <xsl:call-template name="iso690.access"/>
+ <!-- Standard number [EL] -->
+ <xsl:call-template name="iso690.issn"/>
+ </xsl:if>
+</xsl:template>
+
+<!-- PATENT DOCUMENTS -->
+<xsl:template name="iso690.patent">
+ <!-- Primary responsibility (applicant) -->
+ <xsl:call-template name="iso690.primary"/>
+ <!-- Title of the invention -->
+ <xsl:call-template name="iso690.title"/>
+ <!-- Subordinate responsibility -->
+ <xsl:call-template name="iso690.secondary"/>
+ <!-- Notes -->
+ <xsl:call-template name="iso690.notice"/>
+ <!-- Identification -->
+ <xsl:call-template name="iso690.pat.ident"/>
+</xsl:template>
+
+<!-- ==================================================================== -->
+<!-- Elements -->
+
+<!-- Primary responsibility -->
+<xsl:template name="iso690.primary">
+ <xsl:param name="primary.sep">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'primary.sep'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:choose>
+ <xsl:when test="./authorgroup/author|./author">
+ <xsl:call-template name="iso690.author.list">
+ <xsl:with-param name="person.list" select=".//authorgroup/author|.//author"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="./authorgroup/editor|./editor">
+ <xsl:call-template name="iso690.author.list">
+ <xsl:with-param name="person.list" select=".//authorgroup/editor|.//editor"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="./authorgroup/corpauthor|./corpauthor">
+ <xsl:call-template name="iso690.author.list">
+ <xsl:with-param name="person.list" select=".//authorgroup/corpauthor|.//corpauthor"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:if test="(./firstname)and(./surname)">
+ <xsl:call-template name="iso690.author"/>
+ <xsl:call-template name="iso690.endsep">
+ <xsl:with-param name="text" select="string(./firstname[1])"/>
+ <xsl:with-param name="sep" select="$primary.sep"/>
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="iso690.author.list">
+ <xsl:param name="person.list" select="author|corpauthor|editor"/>
+ <xsl:param name="person.count" select="count($person.list)"/>
+ <xsl:param name="count" select="1"/>
+ <xsl:param name="group" select="./authorgroup[@role='many']"/>
+ <xsl:param name="many" select="0"/>
+
+ <xsl:param name="primary.many">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'primary.many'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:param name="primary.editor">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'primary.editor'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:param name="primary.sep">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'primary.sep'"/></xsl:call-template>
+ </xsl:param>
+
+ <xsl:choose>
+ <xsl:when test="$count &gt; $person.count"/>
+ <xsl:otherwise>
+ <xsl:choose>
+ <xsl:when test="$person.count &lt; 4 and not($group)">
+ <xsl:call-template name="iso690.author">
+ <xsl:with-param name="node" select="$person.list[position()=$count]"/>
+ </xsl:call-template>
+ <xsl:choose>
+ <xsl:when test="$person.count = 2 and $count = 1 and $biblioentry.alt.primary.seps != 0">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'alt.person.two.sep'"/></xsl:call-template>
+ </xsl:when>
+ <xsl:when test="$person.count = 2 and $count = 1">
+ <xsl:call-template name="gentext.template">
+ <xsl:with-param name="context" select="'authorgroup'"/>
+ <xsl:with-param name="name" select="'sep2'"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="$person.count &gt; 2 and $count+1 = $person.count and $biblioentry.alt.primary.seps != 0">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'alt.person.last.sep'"/></xsl:call-template>
+ </xsl:when>
+ <xsl:when test="$person.count &gt; 2 and $count+1 = $person.count">
+ <xsl:call-template name="gentext.template">
+ <xsl:with-param name="context" select="'authorgroup'"/>
+ <xsl:with-param name="name" select="'seplast'"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="$count &lt; $person.count and $biblioentry.alt.primary.seps != 0">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'alt.person.more.sep'"/></xsl:call-template>
+ </xsl:when>
+ <xsl:when test="$count &lt; $person.count">
+ <xsl:call-template name="gentext.template">
+ <xsl:with-param name="context" select="'authorgroup'"/>
+ <xsl:with-param name="name" select="'sep'"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="($count = $person.count)">
+ <xsl:choose>
+ <xsl:when test="$many!=0">
+ <xsl:if test="name($person.list[position()=$count])='editor'">
+ <xsl:value-of select="$primary.editor"/>
+ </xsl:if>
+ <xsl:value-of select="$primary.many"/>
+ <xsl:call-template name="iso690.endsep">
+ <xsl:with-param name="text" select="$primary.many"/>
+ <xsl:with-param name="sep" select="$primary.sep"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="name($person.list[position()=$count])='editor'">
+ <xsl:value-of select="$primary.editor"/>
+ <xsl:value-of select="$primary.sep"/>
+ </xsl:when>
+ <xsl:when test="name($person.list[position()=$count])='corpauthor'">
+ <xsl:call-template name="iso690.endsep">
+ <xsl:with-param name="text" select="string($person.list[position()=$count])"/>
+ <xsl:with-param name="sep" select="$primary.sep"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="iso690.endsep">
+ <xsl:with-param name="text" select="string($person.list[position()=$count]//firstname[1])"/>
+ <xsl:with-param name="sep" select="$primary.sep"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ </xsl:choose>
+
+ <xsl:call-template name="iso690.author.list">
+ <xsl:with-param name="person.list" select="$person.list"/>
+ <xsl:with-param name="person.count" select="$person.count"/>
+ <xsl:with-param name="count" select="$count+1"/>
+ <xsl:with-param name="many" select="$many"/>
+ <xsl:with-param name="group"/>
+ </xsl:call-template>
+ </xsl:when>
+
+ <xsl:otherwise>
+ <xsl:choose>
+ <xsl:when test="($biblioentry.primary.count&gt;=3) and ($person.count&gt;=3)">
+ <xsl:call-template name="iso690.author.list">
+ <xsl:with-param name="person.list" select="$person.list[1]|$person.list[2]|$person.list[3]"/>
+ <xsl:with-param name="person.count" select="3"/>
+ <xsl:with-param name="count" select="1"/>
+ <xsl:with-param name="many" select="1"/>
+ <xsl:with-param name="group"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="($biblioentry.primary.count&gt;1) and ($person.count&gt;1)">
+ <xsl:call-template name="iso690.author.list">
+ <xsl:with-param name="person.list" select="$person.list[1]|$person.list[2]"/>
+ <xsl:with-param name="person.count" select="2"/>
+ <xsl:with-param name="count" select="1"/>
+ <xsl:with-param name="many" select="1"/>
+ <xsl:with-param name="group"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="iso690.author.list">
+ <xsl:with-param name="person.list" select="$person.list[1]"/>
+ <xsl:with-param name="person.count" select="1"/>
+ <xsl:with-param name="count" select="1"/>
+ <xsl:with-param name="many" select="1"/>
+ <xsl:with-param name="group"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="iso690.author">
+ <xsl:param name="node" select="."/>
+ <xsl:param name="lastfirst.sep">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'lastfirst.sep'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:choose>
+ <xsl:when test="name($node)!='corpauthor'">
+ <span style="text-transform:uppercase">
+ <xsl:apply-templates mode="iso690.mode" select="$node//surname[1]"/>
+ </span>
+ <xsl:if test="$node//surname and $node//firstname">
+ <xsl:value-of select="$lastfirst.sep"/>
+ </xsl:if>
+ <xsl:apply-templates mode="iso690.mode" select="$node//firstname[1]"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <span style="text-transform:uppercase">
+ <xsl:apply-templates mode="iso690.mode" select="$node"/>
+ </span>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="corpauthor|firstname|surname" mode="iso690.mode">
+ <xsl:apply-templates mode="iso690.mode"/>
+</xsl:template>
+
+<!-- Title and Type of medium -->
+<xsl:template name="iso690.title">
+ <xsl:param name="medium" select="./bibliomisc[@role='medium']"/>
+ <xsl:param name="italic" select="1"/>
+ <xsl:param name="sep">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'title.sep'"/></xsl:call-template>
+ </xsl:param>
+
+ <xsl:apply-templates mode="iso690.mode" select="./title">
+ <xsl:with-param name="medium" select="$medium"/>
+ <xsl:with-param name="italic" select="$italic"/>
+ <xsl:with-param name="sep" select="$sep"/>
+ </xsl:apply-templates>
+</xsl:template>
+
+<xsl:template match="title" mode="iso690.mode">
+ <xsl:param name="medium"/>
+ <xsl:param name="italic" select="1"/>
+ <xsl:param name="sep">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'title.sep'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:param name="medium1">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'medium1'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:param name="medium2">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'medium2'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:choose>
+ <xsl:when test="$italic=1">
+ <xsl:call-template name="iso690.italic.title"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="iso690.make.title"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:if test="$medium">
+ <xsl:value-of select="$medium1"/>
+ <xsl:apply-templates mode="iso690.mode" select="$medium"/>
+ <xsl:value-of select="$medium2"/>
+ </xsl:if>
+ <xsl:call-template name="iso690.endsep">
+ <xsl:with-param name="text" select="concat(string(.),string(../subtitle))"/>
+ <xsl:with-param name="sep" select="$sep"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template name="iso690.italic.title">
+ <em xmlns:xslo="http://www.w3.org/1999/XSL/Transform">
+ <xsl:call-template name="iso690.make.title"/>
+ </em>
+</xsl:template>
+
+<xsl:template name="iso690.make.title">
+ <xsl:param name="submaintitle.sep">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'submaintitle.sep'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:apply-templates mode="iso690.mode"/>
+ <xsl:if test="../subtitle">
+ <xsl:value-of select="$submaintitle.sep"/>
+ <xsl:apply-templates mode="iso690.mode" select="../subtitle"/>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="subtitle" mode="iso690.mode">
+ <xsl:apply-templates mode="iso690.mode"/>
+</xsl:template>
+
+<xsl:template match="bibliomisc[@role='medium']" mode="iso690.mode">
+ <xsl:apply-templates mode="iso690.mode"/>
+</xsl:template>
+
+<!-- Subordinate responsibility -->
+<xsl:template name="iso690.secondary">
+ <xsl:param name="secondary.sep">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'secondary.sep'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:param name="secondary.person.sep">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'secondary.person.sep'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:for-each select="./bibliomisc[@role='secondary']">
+ <xsl:apply-templates mode="iso690.mode" select="."/>
+ <xsl:choose>
+ <xsl:when test="position()=count(../bibliomisc[@role='secondary'])">
+ <xsl:call-template name="iso690.endsep">
+ <xsl:with-param name="text" select="string(.)"/>
+ <xsl:with-param name="sep" select="$secondary.sep"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$secondary.person.sep"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:for-each>
+</xsl:template>
+
+<xsl:template match="bibliomisc[@role='secondary']" mode="iso690.mode">
+ <xsl:apply-templates mode="iso690.mode"/>
+</xsl:template>
+
+<!-- Edition -->
+<xsl:template name="iso690.edition">
+ <xsl:param name="after"/>
+ <xsl:param name="edition.serial.sep">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'edition.serial.sep'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:choose>
+ <xsl:when test="string($after)!=''">
+ <xsl:apply-templates mode="iso690.mode" select="./edition">
+ <xsl:with-param name="sep" select="$edition.serial.sep"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates mode="iso690.mode" select="./edition"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="edition" mode="iso690.mode">
+ <xsl:param name="sep">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'edition.sep'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:apply-templates mode="iso690.mode"/>
+ <xsl:call-template name="iso690.endsep">
+ <xsl:with-param name="text" select="string(.)"/>
+ <xsl:with-param name="sep" select="$sep"/>
+ </xsl:call-template>
+</xsl:template>
+
+<!-- Issue designation (date and/or num) -->
+<xsl:template name="iso690.issuing">
+ <xsl:param name="issuing.div">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'issuing.div'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:param name="issuing.range">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'issuing.range'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:param name="issuing.sep">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'issuing.sep'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:choose>
+ <xsl:when test="./pubdate[@role='issuing'] and ./volumenum[2] and ./issuenum[2]">
+ <xsl:call-template name="iso690.issuedate"/>
+ <xsl:apply-templates mode="iso690.mode" select="./volumenum[1]">
+ <xsl:with-param name="sep" select="$issuing.div"/>
+ </xsl:apply-templates>
+ <xsl:apply-templates mode="iso690.mode" select="./issuenum[1]">
+ <xsl:with-param name="sep" select="$issuing.range"/>
+ </xsl:apply-templates>
+ <xsl:apply-templates mode="iso690.mode" select="./volumenum[2]">
+ <xsl:with-param name="sep" select="$issuing.div"/>
+ </xsl:apply-templates>
+ <xsl:apply-templates mode="iso690.mode" select="./issuenum[2]">
+ <xsl:with-param name="sep" select="$issuing.sep"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:when test="./pubdate[@role='issuing'] and ./volumenum[2]">
+ <xsl:call-template name="iso690.issuedate"/>
+ <xsl:apply-templates mode="iso690.mode" select="./volumenum[1]">
+ <xsl:with-param name="sep" select="$issuing.range"/>
+ </xsl:apply-templates>
+ <xsl:apply-templates mode="iso690.mode" select="./volumenum[2]">
+ <xsl:with-param name="sep" select="$issuing.sep"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:when test="./pubdate[@role='issuing'] and ./volumenum and ./issuenum">
+ <xsl:apply-templates mode="iso690.mode" select="./pubdate[@role='issuing']">
+ <xsl:with-param name="sep" select="$issuing.div"/>
+ </xsl:apply-templates>
+ <xsl:apply-templates mode="iso690.mode" select="./volumenum">
+ <xsl:with-param name="sep" select="$issuing.div"/>
+ </xsl:apply-templates>
+ <xsl:apply-templates mode="iso690.mode" select="./issuenum">
+ <xsl:with-param name="sep" select="$issuing.sep"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:when test="./pubdate[@role='issuing']">
+ <xsl:apply-templates mode="iso690.mode" select="./pubdate[@role='issuing']">
+ <xsl:with-param name="sep" select="$issuing.sep"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:when test="./volumenum">
+ <xsl:apply-templates mode="iso690.mode" select="./volumenum">
+ <xsl:with-param name="sep" select="$issuing.sep"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:when test="./issuenum">
+ <xsl:apply-templates mode="iso690.mode" select="./issuenum">
+ <xsl:with-param name="sep" select="$issuing.sep"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="iso690.issuedate">
+ <xsl:param name="issuing.div">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'issuing.div'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:param name="issuing.range">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'issuing.range'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:param name="issuing.sep">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'issuing.sep'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:choose>
+ <xsl:when test="./pubdate[@role='issuing'][2]">
+ <xsl:apply-templates mode="iso690.mode" select="./pubdate[@role='issuing'][1]">
+ <xsl:with-param name="sep" select="$issuing.range"/>
+ </xsl:apply-templates>
+ <xsl:apply-templates mode="iso690.mode" select="./pubdate[@role='issuing'][2]">
+ <xsl:with-param name="sep" select="$issuing.div"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates mode="iso690.mode" select="./pubdate[@role='issuing']">
+ <xsl:with-param name="sep" select="$issuing.div"/>
+ </xsl:apply-templates>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="pubdate[@role='issuing']" mode="iso690.mode">
+ <xsl:param name="sep"/>
+ <xsl:variable name="substr" select="substring(string(.),string-length(string(.)))"/>
+ <xsl:apply-templates mode="iso690.mode"/>
+ <xsl:call-template name="iso690.space">
+ <xsl:with-param name="text" select="$substr"/>
+ </xsl:call-template>
+ <xsl:choose>
+ <xsl:when test="$substr='-'">
+ <xsl:call-template name="iso690.endsep">
+ <xsl:with-param name="text" select="' '"/>
+ <xsl:with-param name="sep" select="$sep"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="iso690.endsep">
+ <xsl:with-param name="text" select="string(.)"/>
+ <xsl:with-param name="sep" select="$sep"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- Numeration of the part -->
+<xsl:template name="iso690.partnr">
+ <xsl:param name="partnr.sep">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'partnr.sep'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:apply-templates mode="iso690.mode" select="./volumenum">
+ <xsl:with-param name="sep" select="$partnr.sep"/>
+ </xsl:apply-templates>
+</xsl:template>
+
+<!-- Place of publication, Publisher, Year/Date of publication, Date of update/revision, Date of citation -->
+<xsl:template name="iso690.pub">
+ <xsl:param name="onlydate" select="0"/>
+ <xsl:param name="placesep">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'placepubl.sep'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:param name="pubsep">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'publyear.sep'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:param name="endsep">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'pubinfo.sep'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:choose>
+ <xsl:when test="(./publisher/publishername|./publishername|./publisher/address/city)and($onlydate=0)and(./pubdate[not(@role='issuing')]|./copyright/year|./date[@role='upd']|./date[@role='upd'])">
+ <xsl:apply-templates mode="iso690.mode" select="./publisher/address/city">
+ <xsl:with-param name="sep" select="$placesep"/>
+ </xsl:apply-templates>
+ <xsl:apply-templates mode="iso690.mode" select="./publisher/publishername|./publishername">
+ <xsl:with-param name="sep" select="$pubsep"/>
+ </xsl:apply-templates>
+ <xsl:apply-templates mode="iso690.mode" select="./pubdate[not(@role='issuing')]|./copyright/year">
+ <xsl:with-param name="sep" select="$endsep"/>
+ </xsl:apply-templates>
+ <xsl:if test="not(./pubdate[not(@role='issuing')]|./copyright/year)">
+ <xsl:call-template name="iso690.data">
+ <xsl:with-param name="sep" select="$endsep"/>
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:when>
+ <xsl:when test="(./publisher/publishername|./publishername)and(./publisher/address/city)and($onlydate=0)">
+ <xsl:apply-templates mode="iso690.mode" select="./publisher/address/city">
+ <xsl:with-param name="sep" select="$placesep"/>
+ </xsl:apply-templates>
+ <xsl:apply-templates mode="iso690.mode" select="./publisher/publishername|./publishername">
+ <xsl:with-param name="sep" select="$endsep"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:when test="($onlydate=1)or(./pubdate[not(@role='issuing')]|./copyright/year)">
+ <xsl:apply-templates mode="iso690.mode" select="./pubdate[not(@role='issuing')]|./copyright/year">
+ <xsl:with-param name="sep" select="$endsep"/>
+ </xsl:apply-templates>
+ <xsl:if test="$onlydate=1">
+ <xsl:call-template name="iso690.location">
+ <xsl:with-param name="onlypages" select="1"/>
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:when>
+ <xsl:when test="not(./pubdate[not(@role='issuing')]|./copyright/year)">
+ <xsl:call-template name="iso690.data">
+ <xsl:with-param name="sep" select="$endsep"/>
+ </xsl:call-template>
+ </xsl:when>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="iso690.paper.pub">
+ <xsl:param name="spec.pubinfo.sep">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'spec.pubinfo.sep'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:choose>
+ <xsl:when test="./volumnum|./issuenum|./pagenums">
+ <xsl:call-template name="iso690.pub">
+ <xsl:with-param name="endsep" select="$spec.pubinfo.sep"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="iso690.pub"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="iso690.data">
+ <xsl:param name="sep"/>
+ <xsl:param name="datecit2">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'datecit2'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:apply-templates mode="iso690.mode" select="./date[@role='upd']">
+ <xsl:with-param name="sep"/>
+ </xsl:apply-templates>
+ <xsl:apply-templates mode="iso690.mode" select="./date[@role='cit']"/>
+ <xsl:choose>
+ <xsl:when test="./date[@role='cit']">
+ <xsl:call-template name="iso690.endsep">
+ <xsl:with-param name="text" select="$datecit2"/>
+ <xsl:with-param name="sep" select="$sep"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="./date[@role='upd']">
+ <xsl:call-template name="iso690.endsep">
+ <xsl:with-param name="text" select="string(./date[@role='upd'])"/>
+ <xsl:with-param name="sep" select="$sep"/>
+ </xsl:call-template>
+ </xsl:when>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="publisher/address/city|publishername" mode="iso690.mode">
+ <xsl:param name="sep"/>
+ <xsl:param name="upd" select="0"/>
+ <xsl:apply-templates mode="iso690.mode"/>
+ <xsl:call-template name="iso690.endsep">
+ <xsl:with-param name="text" select="string(.)"/>
+ <xsl:with-param name="sep" select="$sep"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="pubdate|copyright/year" mode="iso690.mode">
+ <xsl:param name="sep"/>
+ <xsl:param name="upd" select="1"/>
+ <xsl:param name="datecit2">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'datecit2'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:variable name="substr" select="substring(string(.),string-length(string(.)))"/>
+ <xsl:if test="name(.)!='pubdate'">
+ <xsl:value-of select="'&#169;'"/><!-- copyright -->
+ </xsl:if>
+ <xsl:apply-templates mode="iso690.mode"/>
+ <xsl:call-template name="iso690.space">
+ <xsl:with-param name="text" select="$substr"/>
+ </xsl:call-template>
+ <xsl:if test="$upd!=0">
+ <xsl:choose>
+ <xsl:when test="name(.)='pubdate'">
+ <xsl:apply-templates mode="iso690.mode" select="../date[@role='upd']"/>
+ <xsl:apply-templates mode="iso690.mode" select="../date[@role='cit']"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates mode="iso690.mode" select="../../date[@role='upd']"/>
+ <xsl:apply-templates mode="iso690.mode" select="../../date[@role='cit']"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:if>
+ <xsl:choose>
+ <xsl:when test="../date[@role='cit']|../../date[@role='cit'] and $upd!=0">
+ <xsl:call-template name="iso690.endsep">
+ <xsl:with-param name="text" select="$datecit2"/>
+ <xsl:with-param name="sep" select="$sep"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="../date[@role='upd']|../../date[@role='upd'] and $upd!=0">
+ <xsl:call-template name="iso690.endsep">
+ <xsl:with-param name="text" select="string(../date[@role='upd'])"/>
+ <xsl:with-param name="sep" select="$sep"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="$substr='-'">
+ <xsl:call-template name="iso690.endsep">
+ <xsl:with-param name="text" select="' '"/>
+ <xsl:with-param name="sep" select="$sep"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="iso690.endsep">
+ <xsl:with-param name="text" select="string(.)"/>
+ <xsl:with-param name="sep" select="$sep"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="iso690.space">
+ <xsl:param name="text" select="substring(string(.),string-length(string(.)))"/>
+ <xsl:if test="$text='-'">
+ <xsl:value-of select="' '"/>
+ </xsl:if>
+</xsl:template>
+
+<!-- Date of update/revision -->
+<xsl:template match="date[@role='upd']" mode="iso690.mode">
+ <xsl:param name="sep">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'upd.sep'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:value-of select="$sep"/>
+ <xsl:apply-templates mode="iso690.mode"/>
+</xsl:template>
+
+<!-- Date of citation -->
+<xsl:template match="date[@role='cit']" mode="iso690.mode">
+ <xsl:param name="datecit1">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'datecit1'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:param name="datecit2">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'datecit2'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:value-of select="$datecit1"/>
+ <xsl:apply-templates mode="iso690.mode"/>
+ <xsl:value-of select="$datecit2"/>
+</xsl:template>
+
+<!-- Extent -->
+<xsl:template name="iso690.extent">
+ <xsl:param name="extent.sep">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'extent.sep'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:apply-templates mode="iso690.mode" select="./pagenums">
+ <xsl:with-param name="sep" select="$extent.sep"/>
+ </xsl:apply-templates>
+</xsl:template>
+
+<!-- Location within host -->
+<xsl:template name="iso690.part.location">
+ <xsl:param name="location.sep">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'location.sep'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:choose>
+ <xsl:when test="./pagenums">
+ <xsl:apply-templates mode="iso690.mode" select="./bibliomisc[@role='secnum']"/>
+ <xsl:apply-templates mode="iso690.mode" select="./bibliomisc[@role='sectitle']"/>
+ <xsl:apply-templates mode="iso690.mode" select="./pagenums"/>
+ </xsl:when>
+ <xsl:when test="./bibliomisc[@role='sectitle']">
+ <xsl:apply-templates mode="iso690.mode" select="./bibliomisc[@role='secnum']"/>
+ <xsl:apply-templates mode="iso690.mode" select="./bibliomisc[@role='sectitle']">
+ <xsl:with-param name="sep" select="$location.sep"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates mode="iso690.mode" select="./bibliomisc[@role='secnum']">
+ <xsl:with-param name="sep" select="$location.sep"/>
+ </xsl:apply-templates>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="iso690.article.location">
+ <xsl:param name="location.sep">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'location.sep'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:param name="locs.sep">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'locs.sep'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:choose>
+ <xsl:when test="not(./date[@role='upd']|./date[@role='cit'])">
+ <xsl:choose>
+ <xsl:when test="./volumenum|./issuenum|./pagenums">
+ <xsl:apply-templates mode="iso690.mode" select="./pubdate[not(@role='issuing')]">
+ <xsl:with-param name="upd" select="0"/>
+ <xsl:with-param name="sep" select="$locs.sep"/>
+ </xsl:apply-templates>
+ <xsl:call-template name="iso690.location"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates mode="iso690.mode" select="./pubdate[not(@role='issuing')]">
+ <xsl:with-param name="sep" select="$location.sep"/>
+ </xsl:apply-templates>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:choose>
+ <xsl:when test="./volumenum|./issuenum|./pagenums">
+ <xsl:apply-templates mode="iso690.mode" select="./pubdate[not(@role='issuing')]">
+ <xsl:with-param name="upd" select="0"/>
+ <xsl:with-param name="sep" select="$locs.sep"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates mode="iso690.mode" select="./pubdate[not(@role='issuing')]">
+ <xsl:with-param name="upd" select="0"/>
+ <xsl:with-param name="sep" select="$location.sep"/>
+ </xsl:apply-templates>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:choose>
+ <xsl:when test="./issuenum">
+ <xsl:apply-templates mode="iso690.mode" select="./volumenum"/>
+ <xsl:apply-templates mode="iso690.mode" select="./issuenum">
+ <xsl:with-param name="sep"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates mode="iso690.mode" select="./volumenum">
+ <xsl:with-param name="sep"/>
+ </xsl:apply-templates>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:choose>
+ <xsl:when test="./pagenums">
+ <xsl:call-template name="iso690.data">
+ <xsl:with-param name="sep" select="$locs.sep"/>
+ </xsl:call-template>
+ <xsl:apply-templates mode="iso690.mode" select="./pagenums"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="iso690.data">
+ <xsl:with-param name="sep" select="$location.sep"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="iso690.location">
+ <xsl:param name="location.sep">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'location.sep'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:choose>
+ <xsl:when test="./volumenum and not(./issuenum) and not(./pagenums)">
+ <xsl:apply-templates mode="iso690.mode" select="./volumenum">
+ <xsl:with-param name="sep" select="$location.sep"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:when test="./issuenum and not(./pagenums)">
+ <xsl:apply-templates mode="iso690.mode" select="./volumenum"/>
+ <xsl:apply-templates mode="iso690.mode" select="./issuenum">
+ <xsl:with-param name="sep" select="$location.sep"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:when test="./pagenums">
+ <xsl:apply-templates mode="iso690.mode" select="./volumenum"/>
+ <xsl:apply-templates mode="iso690.mode" select="./issuenum"/>
+ <xsl:apply-templates mode="iso690.mode" select="./pagenums"/>
+ </xsl:when>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="bibliomisc[@role='secnum']|bibliomisc[@role='sectitle']" mode="iso690.mode">
+ <xsl:param name="sep">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'locs.sep'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:apply-templates mode="iso690.mode"/>
+ <xsl:call-template name="iso690.endsep">
+ <xsl:with-param name="text" select="string(.)"/>
+ <xsl:with-param name="sep" select="$sep"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="volumenum|issuenum" mode="iso690.mode">
+ <xsl:param name="sep">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'locs.sep'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:apply-templates mode="iso690.mode"/>
+ <xsl:call-template name="iso690.endsep">
+ <xsl:with-param name="text" select="string(.)"/>
+ <xsl:with-param name="sep" select="$sep"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="pagenums" mode="iso690.mode">
+ <xsl:param name="sep">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'location.sep'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:apply-templates mode="iso690.mode"/>
+ <xsl:call-template name="iso690.endsep">
+ <xsl:with-param name="text" select="string(.)"/>
+ <xsl:with-param name="sep" select="$sep"/>
+ </xsl:call-template>
+</xsl:template>
+
+<!-- Series -->
+<xsl:template name="iso690.serie">
+ <xsl:apply-templates mode="iso690.mode" select=".//bibliomisc[@role='serie']"/>
+</xsl:template>
+
+<!-- Notes -->
+<xsl:template name="iso690.notice">
+ <xsl:apply-templates mode="iso690.mode" select=".//bibliomisc[not(@role)]"/>
+</xsl:template>
+
+<xsl:template match="bibliomisc[not(@role)]|bibliomisc[@role='serie']" mode="iso690.mode">
+ <xsl:param name="notice.sep">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'notice.sep'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:apply-templates mode="iso690.mode"/>
+ <xsl:call-template name="iso690.endsep">
+ <xsl:with-param name="text" select="string(.)"/>
+ <xsl:with-param name="sep" select="$notice.sep"/>
+ </xsl:call-template>
+</xsl:template>
+
+<!-- Avaibility and access -->
+<xsl:template name="iso690.access">
+ <xsl:for-each select="./biblioid[@class='uri']|./bibliomisc[@role='access']">
+ <xsl:choose>
+ <xsl:when test="position()=1">
+ <xsl:apply-templates mode="iso690.mode" select="."/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates mode="iso690.mode" select=".">
+ <xsl:with-param name="firstacc" select="0"/>
+ </xsl:apply-templates>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:for-each>
+</xsl:template>
+
+<xsl:template match="biblioid[@class='uri']/ulink|bibliomisc[@role='access']/ulink" mode="iso690.mode">
+ <xsl:param name="link1">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'link1'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:param name="link2">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'link2'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:value-of select="$link1"/>
+ <xsl:call-template name="ulink"/>
+ <xsl:value-of select="$link2"/>
+</xsl:template>
+
+<xsl:template match="biblioid[@class='uri']|bibliomisc[@role='access']" mode="iso690.mode">
+ <xsl:param name="firstacc" select="1"/>
+ <xsl:param name="access">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'access'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:param name="acctoo">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'acctoo'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:param name="onwww">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'onwww'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:param name="oninet">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'oninet'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:param name="access.end">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'access.end'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:param name="access.sep">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'access.sep'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:choose>
+ <xsl:when test="$firstacc=1">
+ <xsl:value-of select="$access"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$acctoo"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:choose>
+ <xsl:when test="(./ulink)and(string(./ulink)=string(.))">
+ <xsl:choose>
+ <xsl:when test="(starts-with(./ulink/@url,'http://')or(starts-with(./ulink/@url,'https://')))">
+ <xsl:value-of select="$onwww"/>
+ <xsl:value-of select="$access.end"/>
+ <xsl:apply-templates mode="iso690.mode" select="./ulink"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$oninet"/>
+ <xsl:value-of select="$access.end"/>
+ <xsl:apply-templates mode="iso690.mode" select="./ulink"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:when test="(./ulink)and(string(./ulink)!=string(.))">
+ <xsl:value-of select="text()[1]"/>
+ <xsl:call-template name="iso690.endsep">
+ <xsl:with-param name="text" select="text()[1]"/>
+ <xsl:with-param name="sep" select="$access.end"/>
+ </xsl:call-template>
+ <xsl:apply-templates mode="iso690.mode" select="./ulink"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates mode="iso690.mode"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:value-of select="$access.sep"/>
+</xsl:template>
+
+<!-- Standard number - ISBN -->
+<xsl:template name="iso690.isbn">
+ <xsl:choose>
+ <xsl:when test="./biblioid/@class='isbn'">
+ <xsl:apply-templates mode="iso690.mode" select="./biblioid[@class='isbn']"/>
+ </xsl:when>
+ <xsl:when test="./isbn">
+ <xsl:apply-templates mode="iso690.mode" select="./isbn"/>
+ </xsl:when>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="isbn|biblioid[@class='isbn']" mode="iso690.mode">
+ <xsl:param name="isbn">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'isbn'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:param name="stdnum.sep">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'stdnum.sep'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:value-of select="$isbn"/>
+ <xsl:apply-templates mode="iso690.mode"/>
+ <xsl:value-of select="$stdnum.sep"/>
+</xsl:template>
+
+<!-- Standard number - ISSN -->
+<xsl:template name="iso690.issn">
+ <xsl:choose>
+ <xsl:when test="./biblioid/@class='issn'">
+ <xsl:apply-templates mode="iso690.mode" select="./biblioid[@class='issn']"/>
+ </xsl:when>
+ <xsl:when test="./issn">
+ <xsl:apply-templates mode="iso690.mode" select="./issn"/>
+ </xsl:when>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="issn|biblioid[@class='issn']" mode="iso690.mode">
+ <xsl:param name="issn">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'issn'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:param name="stdnum.sep">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'stdnum.sep'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:value-of select="$issn"/>
+ <xsl:apply-templates mode="iso690.mode"/>
+ <xsl:value-of select="$stdnum.sep"/>
+</xsl:template>
+
+<!-- Identification of patent document -->
+<xsl:template name="iso690.pat.ident">
+ <xsl:param name="patdate.sep">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'patdate.sep'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:apply-templates mode="iso690.mode" select="./address/country"/>
+ <xsl:apply-templates mode="iso690.mode" select="./bibliomisc[@role='patenttype']"/>
+ <xsl:choose>
+ <xsl:when test="./biblioid[@class='other' and @otherclass='patentnum']">
+ <xsl:apply-templates mode="iso690.mode" select="./biblioid[@class='other' and @otherclass='patentnum']"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates mode="iso690.mode" select="./bibliomisc[@role='patentnum']"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:apply-templates mode="iso690.mode" select="./pubdate[not(@role='issuing')]">
+ <xsl:with-param name="sep" select="$patdate.sep"/>
+ </xsl:apply-templates>
+</xsl:template>
+
+<!-- Country or issuing office -->
+<xsl:template match="address/country" mode="iso690.mode">
+ <xsl:param name="patcountry.sep">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'patcountry.sep'"/></xsl:call-template>
+ </xsl:param>
+ <em xmlns:xslo="http://www.w3.org/1999/XSL/Transform">
+ <xsl:apply-templates mode="iso690.mode"/>
+ </em>
+ <xsl:value-of select="$patcountry.sep"/>
+</xsl:template>
+
+<!-- Kind of patent document -->
+<xsl:template match="bibliomisc[@role='patenttype']" mode="iso690.mode">
+ <xsl:param name="pattype.sep">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'pattype.sep'"/></xsl:call-template>
+ </xsl:param>
+ <em xmlns:xslo="http://www.w3.org/1999/XSL/Transform">
+ <xsl:apply-templates mode="iso690.mode"/>
+ </em>
+ <xsl:value-of select="$pattype.sep"/>
+</xsl:template>
+
+<!-- Number -->
+<xsl:template match="biblioid[@class='other' and @otherclass='patentnum']|bibliomisc[@role='patentnum']" mode="iso690.mode">
+ <xsl:param name="patnum.sep">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'patnum.sep'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:apply-templates mode="iso690.mode"/>
+ <xsl:value-of select="$patnum.sep"/>
+</xsl:template>
+
+<!-- ==================================================================== -->
+<!-- Supplementary templates -->
+
+<xsl:template name="iso690.endsep">
+ <xsl:param name="text"/>
+ <xsl:param name="sep" select=". "/>
+ <xsl:choose>
+ <xsl:when test="substring($text,string-length($text))!=substring($sep,1,1)">
+ <xsl:value-of select="$sep"/>
+ </xsl:when>
+ <xsl:when test="substring($text,string-length($text))=' '">
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="' '"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="*" mode="iso690.mode">
+ <xsl:apply-templates select="."/><!-- try the default mode -->
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/biblio.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/biblio.xsl
new file mode 100644
index 0000000..18ee8e2
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/biblio.xsl
@@ -0,0 +1,1240 @@
+<?xml version="1.0" encoding="ASCII"?>
+<!--This file was created automatically by html2xhtml-->
+<!--from the HTML stylesheets.-->
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1999/xhtml" version="1.0">
+
+<!-- ********************************************************************
+ $Id: biblio.xsl 8421 2009-05-04 07:49:49Z bobstayton $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<!-- ==================================================================== -->
+
+<xsl:template match="bibliography">
+ <xsl:call-template name="id.warning"/>
+
+ <div>
+ <xsl:call-template name="common.html.attributes">
+ <xsl:with-param name="inherit" select="1"/>
+ </xsl:call-template>
+ <xsl:if test="$generate.id.attributes != 0">
+ <xsl:attribute name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:call-template name="bibliography.titlepage"/>
+
+ <xsl:apply-templates/>
+
+ <xsl:if test="not(parent::article)">
+ <xsl:call-template name="process.footnotes"/>
+ </xsl:if>
+ </div>
+</xsl:template>
+
+<xsl:template match="bibliography/bibliographyinfo"/>
+<xsl:template match="bibliography/info"/>
+<xsl:template match="bibliography/title"/>
+<xsl:template match="bibliography/subtitle"/>
+<xsl:template match="bibliography/titleabbrev"/>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="bibliodiv">
+ <xsl:call-template name="id.warning"/>
+
+ <div>
+ <xsl:call-template name="common.html.attributes">
+ <xsl:with-param name="inherit" select="0"/>
+ </xsl:call-template>
+ <xsl:apply-templates/>
+ </div>
+</xsl:template>
+
+<xsl:template match="bibliodiv/title">
+ <h3>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:call-template name="anchor">
+ <xsl:with-param name="node" select=".."/>
+ <xsl:with-param name="conditional" select="0"/>
+ </xsl:call-template>
+ <xsl:apply-templates/>
+ </h3>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="bibliolist">
+ <div>
+ <xsl:call-template name="common.html.attributes">
+ <xsl:with-param name="inherit" select="0"/>
+ </xsl:call-template>
+ <xsl:call-template name="anchor"/>
+ <xsl:if test="blockinfo/title|info/title|title">
+ <xsl:call-template name="formal.object.heading"/>
+ </xsl:if>
+ <xsl:apply-templates select="*[not(self::blockinfo) and not(self::info) and not(self::title) and not(self::titleabbrev) and not(self::biblioentry) and not(self::bibliomixed)]"/>
+ <xsl:apply-templates select="biblioentry|bibliomixed"/>
+ </div>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="biblioentry">
+ <xsl:param name="label">
+ <xsl:call-template name="biblioentry.label"/>
+ </xsl:param>
+
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="string(.) = ''">
+ <xsl:variable name="bib" select="document($bibliography.collection,.)"/>
+ <xsl:variable name="entry" select="$bib/bibliography// *[@id=$id or @xml:id=$id][1]"/>
+ <xsl:choose>
+ <xsl:when test="$entry">
+ <xsl:choose>
+ <xsl:when test="$bibliography.numbered != 0">
+ <xsl:apply-templates select="$entry">
+ <xsl:with-param name="label" select="$label"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="$entry"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:message>
+ <xsl:text>No bibliography entry: </xsl:text>
+ <xsl:value-of select="$id"/>
+ <xsl:text> found in </xsl:text>
+ <xsl:value-of select="$bibliography.collection"/>
+ </xsl:message>
+ <div>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:call-template name="anchor"/>
+ <p>
+ <xsl:copy-of select="$label"/>
+ <xsl:text>Error: no bibliography entry: </xsl:text>
+ <xsl:value-of select="$id"/>
+ <xsl:text> found in </xsl:text>
+ <xsl:value-of select="$bibliography.collection"/>
+ </p>
+ </div>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <div>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:call-template name="anchor">
+ <xsl:with-param name="conditional" select="0"/>
+ </xsl:call-template>
+ <p>
+ <xsl:copy-of select="$label"/>
+ <xsl:choose>
+ <xsl:when test="$bibliography.style = 'iso690'">
+ <xsl:call-template name="iso690.makecitation"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </p>
+ </div>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="bibliomixed">
+ <xsl:param name="label">
+ <xsl:call-template name="biblioentry.label"/>
+ </xsl:param>
+
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="string(.) = ''">
+ <xsl:variable name="bib" select="document($bibliography.collection,.)"/>
+ <xsl:variable name="entry" select="$bib/bibliography// *[@id=$id or @xml:id=$id][1]"/>
+ <xsl:choose>
+ <xsl:when test="$entry">
+ <xsl:choose>
+ <xsl:when test="$bibliography.numbered != 0">
+ <xsl:apply-templates select="$entry">
+ <xsl:with-param name="label" select="$label"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="$entry"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:message>
+ <xsl:text>No bibliography entry: </xsl:text>
+ <xsl:value-of select="$id"/>
+ <xsl:text> found in </xsl:text>
+ <xsl:value-of select="$bibliography.collection"/>
+ </xsl:message>
+ <div>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:call-template name="anchor"/>
+ <p>
+ <xsl:copy-of select="$label"/>
+ <xsl:text>Error: no bibliography entry: </xsl:text>
+ <xsl:value-of select="$id"/>
+ <xsl:text> found in </xsl:text>
+ <xsl:value-of select="$bibliography.collection"/>
+ </p>
+ </div>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <div>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:call-template name="anchor">
+ <xsl:with-param name="conditional" select="0"/>
+ </xsl:call-template>
+ <p>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:copy-of select="$label"/>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </p>
+ </div>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="biblioentry.label">
+ <xsl:param name="node" select="."/>
+
+ <xsl:choose>
+ <xsl:when test="$bibliography.numbered != 0">
+ <xsl:text>[</xsl:text>
+ <xsl:number from="bibliography" count="biblioentry|bibliomixed" level="any" format="1"/>
+ <xsl:text>] </xsl:text>
+ </xsl:when>
+ <xsl:when test="local-name($node/child::*[1]) = 'abbrev'">
+ <xsl:text>[</xsl:text>
+ <xsl:apply-templates select="$node/abbrev[1]"/>
+ <xsl:text>] </xsl:text>
+ </xsl:when>
+ <xsl:when test="$node/@xreflabel">
+ <xsl:text>[</xsl:text>
+ <xsl:value-of select="$node/@xreflabel"/>
+ <xsl:text>] </xsl:text>
+ </xsl:when>
+ <xsl:when test="$node/@id">
+ <xsl:text>[</xsl:text>
+ <xsl:value-of select="$node/@id"/>
+ <xsl:text>] </xsl:text>
+ </xsl:when>
+ <xsl:when test="$node/@xml:id">
+ <xsl:text>[</xsl:text>
+ <xsl:value-of select="$node/@xml:id"/>
+ <xsl:text>] </xsl:text>
+ </xsl:when>
+ <xsl:otherwise><!-- nop --></xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="*" mode="bibliography.mode">
+ <xsl:apply-templates select="."/><!-- try the default mode -->
+</xsl:template>
+
+<xsl:template match="abbrev" mode="bibliography.mode">
+ <xsl:if test="preceding-sibling::*">
+ <xsl:apply-templates mode="bibliography.mode"/>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="abstract" mode="bibliography.mode">
+ <!-- suppressed -->
+</xsl:template>
+
+<xsl:template match="address" mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:copy-of select="$biblioentry.item.separator"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="affiliation" mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:copy-of select="$biblioentry.item.separator"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="shortaffil" mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:copy-of select="$biblioentry.item.separator"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="jobtitle" mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:copy-of select="$biblioentry.item.separator"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="artheader|articleinfo|info" mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:copy-of select="$biblioentry.item.separator"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="artpagenums" mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:copy-of select="$biblioentry.item.separator"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="author" mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:call-template name="person.name"/>
+ <xsl:copy-of select="$biblioentry.item.separator"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="authorblurb|personblurb" mode="bibliography.mode">
+ <!-- suppressed -->
+</xsl:template>
+
+<xsl:template match="authorgroup" mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:call-template name="person.name.list"/>
+ <xsl:copy-of select="$biblioentry.item.separator"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="authorinitials" mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:copy-of select="$biblioentry.item.separator"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="bibliomisc" mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:copy-of select="$biblioentry.item.separator"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="bibliomset" mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:copy-of select="$biblioentry.item.separator"/>
+ </span>
+</xsl:template>
+
+<!-- ================================================== -->
+
+<xsl:template match="biblioset" mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="biblioset/title|biblioset/citetitle" mode="bibliography.mode">
+ <xsl:variable name="relation" select="../@relation"/>
+ <xsl:choose>
+ <xsl:when test="$relation='article' or @pubwork='article'">
+ <xsl:call-template name="gentext.startquote"/>
+ <xsl:apply-templates/>
+ <xsl:call-template name="gentext.endquote"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <em xmlns:xslo="http://www.w3.org/1999/XSL/Transform"><xsl:apply-templates/></em>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:copy-of select="$biblioentry.item.separator"/>
+</xsl:template>
+
+<!-- ================================================== -->
+
+<xsl:template match="bookbiblio" mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:copy-of select="$biblioentry.item.separator"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="citetitle" mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:choose>
+ <xsl:when test="@pubwork = 'article'">
+ <xsl:call-template name="gentext.startquote"/>
+ <xsl:call-template name="inline.charseq"/>
+ <xsl:call-template name="gentext.endquote"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="inline.italicseq"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:copy-of select="$biblioentry.item.separator"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="collab" mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:copy-of select="$biblioentry.item.separator"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="collabname" mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:copy-of select="$biblioentry.item.separator"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="confgroup" mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:copy-of select="$biblioentry.item.separator"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="confdates" mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:copy-of select="$biblioentry.item.separator"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="conftitle" mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:copy-of select="$biblioentry.item.separator"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="confnum" mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:copy-of select="$biblioentry.item.separator"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="confsponsor" mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:copy-of select="$biblioentry.item.separator"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="contractnum" mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:copy-of select="$biblioentry.item.separator"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="contractsponsor" mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:copy-of select="$biblioentry.item.separator"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="contrib" mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:copy-of select="$biblioentry.item.separator"/>
+ </span>
+</xsl:template>
+
+<!-- ================================================== -->
+
+<xsl:template match="copyright" mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'Copyright'"/>
+ </xsl:call-template>
+ <xsl:call-template name="gentext.space"/>
+ <xsl:call-template name="dingbat">
+ <xsl:with-param name="dingbat">copyright</xsl:with-param>
+ </xsl:call-template>
+ <xsl:call-template name="gentext.space"/>
+ <xsl:apply-templates select="year" mode="bibliography.mode"/>
+ <xsl:if test="holder">
+ <xsl:call-template name="gentext.space"/>
+ <xsl:apply-templates select="holder" mode="bibliography.mode"/>
+ </xsl:if>
+ <xsl:copy-of select="$biblioentry.item.separator"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="year" mode="bibliography.mode">
+ <xsl:apply-templates/><xsl:text>, </xsl:text>
+</xsl:template>
+
+<xsl:template match="year[position()=last()]" mode="bibliography.mode">
+ <xsl:apply-templates/>
+</xsl:template>
+
+<xsl:template match="holder" mode="bibliography.mode">
+ <xsl:apply-templates/>
+</xsl:template>
+
+<!-- ================================================== -->
+
+<xsl:template match="corpauthor" mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:copy-of select="$biblioentry.item.separator"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="corpcredit" mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:copy-of select="$biblioentry.item.separator"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="corpname" mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:copy-of select="$biblioentry.item.separator"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="date" mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:copy-of select="$biblioentry.item.separator"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="edition" mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:copy-of select="$biblioentry.item.separator"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="editor" mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:call-template name="person.name"/>
+ <xsl:copy-of select="$biblioentry.item.separator"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="firstname" mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:copy-of select="$biblioentry.item.separator"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="honorific" mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:copy-of select="$biblioentry.item.separator"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="indexterm" mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:copy-of select="$biblioentry.item.separator"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="invpartnumber" mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:copy-of select="$biblioentry.item.separator"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="isbn" mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:copy-of select="$biblioentry.item.separator"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="issn" mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:copy-of select="$biblioentry.item.separator"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="issuenum" mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:copy-of select="$biblioentry.item.separator"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="lineage" mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:copy-of select="$biblioentry.item.separator"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="orgname" mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:copy-of select="$biblioentry.item.separator"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="orgdiv" mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:copy-of select="$biblioentry.item.separator"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="othercredit" mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:copy-of select="$biblioentry.item.separator"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="othername" mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:copy-of select="$biblioentry.item.separator"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="pagenums" mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:copy-of select="$biblioentry.item.separator"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="printhistory" mode="bibliography.mode">
+ <!-- suppressed -->
+</xsl:template>
+
+<xsl:template match="productname" mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:copy-of select="$biblioentry.item.separator"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="productnumber" mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:copy-of select="$biblioentry.item.separator"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="pubdate" mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:copy-of select="$biblioentry.item.separator"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="publisher" mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="publishername" mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:copy-of select="$biblioentry.item.separator"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="pubsnumber" mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:copy-of select="$biblioentry.item.separator"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="releaseinfo" mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:copy-of select="$biblioentry.item.separator"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="revhistory" mode="bibliography.mode">
+ <!-- suppressed; how could this be represented? -->
+</xsl:template>
+
+<xsl:template match="seriesinfo" mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="seriesvolnums" mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:copy-of select="$biblioentry.item.separator"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="subtitle" mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:copy-of select="$biblioentry.item.separator"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="surname" mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:copy-of select="$biblioentry.item.separator"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="title" mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <em xmlns:xslo="http://www.w3.org/1999/XSL/Transform"><xsl:apply-templates mode="bibliography.mode"/></em>
+ <xsl:copy-of select="$biblioentry.item.separator"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="titleabbrev" mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:copy-of select="$biblioentry.item.separator"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="volumenum" mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:copy-of select="$biblioentry.item.separator"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="bibliocoverage|biblioid|bibliorelation|bibliosource" mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:copy-of select="$biblioentry.item.separator"/>
+ </span>
+</xsl:template>
+
+<!-- See FR #1934434 and http://doi.org -->
+<xsl:template match="biblioid[@class='doi']" mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <a href="{concat('http://dx.doi.org/', .)}">doi:<xsl:value-of select="."/></a>
+ </span>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="*" mode="bibliomixed.mode">
+ <xsl:apply-templates select="."/><!-- try the default mode -->
+</xsl:template>
+
+<xsl:template match="abbrev" mode="bibliomixed.mode">
+ <xsl:if test="preceding-sibling::*">
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="abstract" mode="bibliomixed.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="address" mode="bibliomixed.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="affiliation" mode="bibliomixed.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="shortaffil" mode="bibliomixed.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="jobtitle" mode="bibliomixed.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="artpagenums" mode="bibliomixed.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="author" mode="bibliomixed.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="authorblurb|personblurb" mode="bibliomixed.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="authorgroup" mode="bibliomixed.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="authorinitials" mode="bibliomixed.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="bibliomisc" mode="bibliomixed.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </span>
+</xsl:template>
+
+<!-- ================================================== -->
+
+<xsl:template match="bibliomset" mode="bibliomixed.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="bibliomset/title|bibliomset/citetitle" mode="bibliomixed.mode">
+ <xsl:variable name="relation" select="../@relation"/>
+ <xsl:choose>
+ <xsl:when test="$relation='article' or @pubwork='article'">
+ <xsl:call-template name="gentext.startquote"/>
+ <xsl:apply-templates/>
+ <xsl:call-template name="gentext.endquote"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <em xmlns:xslo="http://www.w3.org/1999/XSL/Transform"><xsl:apply-templates/></em>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ================================================== -->
+
+<xsl:template match="biblioset" mode="bibliomixed.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="citetitle" mode="bibliomixed.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:choose>
+ <xsl:when test="@pubwork = 'article'">
+ <xsl:call-template name="gentext.startquote"/>
+ <xsl:call-template name="inline.charseq"/>
+ <xsl:call-template name="gentext.endquote"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="inline.italicseq"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </span>
+</xsl:template>
+
+
+<xsl:template match="collab" mode="bibliomixed.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="confgroup" mode="bibliomixed.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="contractnum" mode="bibliomixed.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="contractsponsor" mode="bibliomixed.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="contrib" mode="bibliomixed.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="copyright" mode="bibliomixed.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="corpauthor" mode="bibliomixed.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="corpcredit" mode="bibliomixed.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="corpname" mode="bibliomixed.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="date" mode="bibliomixed.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="edition" mode="bibliomixed.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="editor" mode="bibliomixed.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="firstname" mode="bibliomixed.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="honorific" mode="bibliomixed.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="indexterm" mode="bibliomixed.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="invpartnumber" mode="bibliomixed.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="isbn" mode="bibliomixed.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="issn" mode="bibliomixed.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="issuenum" mode="bibliomixed.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="lineage" mode="bibliomixed.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="orgname" mode="bibliomixed.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="othercredit" mode="bibliomixed.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="othername" mode="bibliomixed.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="pagenums" mode="bibliomixed.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="printhistory" mode="bibliomixed.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="productname" mode="bibliomixed.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="productnumber" mode="bibliomixed.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="pubdate" mode="bibliomixed.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="publisher" mode="bibliomixed.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="publishername" mode="bibliomixed.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="pubsnumber" mode="bibliomixed.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="releaseinfo" mode="bibliomixed.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="revhistory" mode="bibliomixed.mode">
+ <!-- suppressed; how could this be represented? -->
+</xsl:template>
+
+<xsl:template match="seriesvolnums" mode="bibliomixed.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="subtitle" mode="bibliomixed.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="surname" mode="bibliomixed.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="title" mode="bibliomixed.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="titleabbrev" mode="bibliomixed.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="volumenum" mode="bibliomixed.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="bibliocoverage|biblioid|bibliorelation|bibliosource" mode="bibliomixed.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </span>
+</xsl:template>
+
+<!-- See FR #1934434 and http://doi.org -->
+<xsl:template match="biblioid[@class='doi']" mode="bibliomixed.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <a href="{concat('http://dx.doi.org/', .)}">doi:<xsl:value-of select="."/></a>
+ </span>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/block.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/block.xsl
new file mode 100644
index 0000000..fa91c31
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/block.xsl
@@ -0,0 +1,535 @@
+<?xml version="1.0" encoding="ASCII"?>
+<!--This file was created automatically by html2xhtml-->
+<!--from the HTML stylesheets.-->
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1999/xhtml" version="1.0">
+
+<!-- ********************************************************************
+ $Id: block.xsl 8831 2010-08-13 17:08:49Z mzjn $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<!-- ==================================================================== -->
+<!-- What should we do about styling blockinfo? -->
+
+<xsl:template match="blockinfo|info">
+ <!-- suppress -->
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template name="block.object">
+ <div>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:call-template name="anchor"/>
+ <xsl:apply-templates/>
+ </div>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="para">
+ <xsl:call-template name="paragraph">
+ <xsl:with-param name="class">
+ <xsl:if test="@role and $para.propagates.style != 0">
+ <xsl:value-of select="@role"/>
+ </xsl:if>
+ </xsl:with-param>
+ <xsl:with-param name="content">
+ <xsl:if test="position() = 1 and parent::listitem">
+ <xsl:call-template name="anchor">
+ <xsl:with-param name="node" select="parent::listitem"/>
+ </xsl:call-template>
+ </xsl:if>
+
+ <xsl:call-template name="anchor"/>
+ <xsl:apply-templates/>
+ </xsl:with-param>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template name="paragraph">
+ <xsl:param name="class" select="''"/>
+ <xsl:param name="content"/>
+
+ <xsl:variable name="p">
+ <p>
+ <xsl:choose>
+ <xsl:when test="$class != ''">
+ <xsl:call-template name="common.html.attributes">
+ <xsl:with-param name="class" select="$class"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="locale.html.attributes"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:copy-of select="$content"/>
+ </p>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="$html.cleanup != 0">
+ <xsl:call-template name="unwrap.p">
+ <xsl:with-param name="p" select="$p"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:copy-of select="$p"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="simpara">
+ <!-- see also listitem/simpara in lists.xsl -->
+ <p>
+ <xsl:call-template name="locale.html.attributes"/>
+ <xsl:if test="@role and $para.propagates.style != 0">
+ <xsl:apply-templates select="." mode="class.attribute">
+ <xsl:with-param name="class" select="@role"/>
+ </xsl:apply-templates>
+ </xsl:if>
+
+ <xsl:call-template name="anchor"/>
+ <xsl:apply-templates/>
+ </p>
+</xsl:template>
+
+<xsl:template match="formalpara">
+ <xsl:call-template name="paragraph">
+ <xsl:with-param name="class">
+ <xsl:if test="@role and $para.propagates.style != 0">
+ <xsl:value-of select="@role"/>
+ </xsl:if>
+ </xsl:with-param>
+ <xsl:with-param name="content">
+ <xsl:call-template name="anchor"/>
+ <xsl:apply-templates/>
+ </xsl:with-param>
+ </xsl:call-template>
+</xsl:template>
+
+<!-- Only use title from info -->
+<xsl:template match="formalpara/info">
+ <xsl:apply-templates select="title"/>
+</xsl:template>
+
+<xsl:template match="formalpara/title|formalpara/info/title">
+ <xsl:variable name="titleStr">
+ <xsl:apply-templates/>
+ </xsl:variable>
+ <xsl:variable name="lastChar">
+ <xsl:if test="$titleStr != ''">
+ <xsl:value-of select="substring($titleStr,string-length($titleStr),1)"/>
+ </xsl:if>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="$make.clean.html != 0">
+ <span class="formalpara-title">
+ <xsl:copy-of select="$titleStr"/>
+ <xsl:if test="$lastChar != '' and not(contains($runinhead.title.end.punct, $lastChar))">
+ <xsl:value-of select="$runinhead.default.title.end.punct"/>
+ </xsl:if>
+ <xsl:text>&#160;</xsl:text>
+ </span>
+ </xsl:when>
+ <xsl:otherwise>
+ <strong xmlns:xslo="http://www.w3.org/1999/XSL/Transform">
+ <xsl:copy-of select="$titleStr"/>
+ <xsl:if test="$lastChar != '' and not(contains($runinhead.title.end.punct, $lastChar))">
+ <xsl:value-of select="$runinhead.default.title.end.punct"/>
+ </xsl:if>
+ <xsl:text>&#160;</xsl:text>
+ </strong>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="formalpara/para">
+ <xsl:apply-templates/>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="blockquote">
+ <div>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:call-template name="anchor"/>
+
+ <xsl:choose>
+ <xsl:when test="attribution">
+ <table border="0" width="100%" cellspacing="0" cellpadding="0" class="blockquote" summary="Block quote">
+ <tr>
+ <td valign="top">&#160;</td>
+ <td valign="top">
+ <xsl:apply-templates select="child::*[local-name(.)!='attribution']"/>
+ </td>
+ <td valign="top">&#160;</td>
+ </tr>
+ <tr>
+ <td valign="top">&#160;</td>
+ <td colspan="2" align="{$direction.align.end}" valign="top">
+ <xsl:text>--</xsl:text>
+ <xsl:apply-templates select="attribution"/>
+ </td>
+ </tr>
+ </table>
+ </xsl:when>
+ <xsl:otherwise>
+ <blockquote>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates/>
+ </blockquote>
+ </xsl:otherwise>
+ </xsl:choose>
+ </div>
+</xsl:template>
+
+<xsl:template match="blockquote/title|blockquote/info/title">
+ <xsl:choose>
+ <xsl:when test="$make.clean.html != 0">
+ <div class="blockquote-title">
+ <xsl:apply-templates/>
+ </div>
+ </xsl:when>
+ <xsl:otherwise>
+ <div class="blockquote-title">
+ <p>
+ <strong xmlns:xslo="http://www.w3.org/1999/XSL/Transform">
+ <xsl:apply-templates/>
+ </strong>
+ </p>
+ </div>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- Use an em dash per Chicago Manual of Style and https://sourceforge.net/tracker/index.php?func=detail&aid=2793878&group_id=21935&atid=373747 -->
+<xsl:template match="epigraph">
+ <div>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates select="para|simpara|formalpara|literallayout"/>
+ <xsl:if test="attribution">
+ <div class="attribution">
+ <span>&#8212;<xsl:apply-templates select="attribution"/></span>
+ </div>
+ </xsl:if>
+ </div>
+</xsl:template>
+
+<xsl:template match="attribution">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates/>
+ </span>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="abstract|sidebar">
+ <div>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:call-template name="anchor"/>
+ <xsl:call-template name="sidebar.titlepage"/>
+ <xsl:apply-templates/>
+ </div>
+</xsl:template>
+
+<xsl:template match="abstract/title|sidebar/title">
+</xsl:template>
+
+<xsl:template match="sidebar/sidebarinfo|sidebar/info"/>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="msgset">
+ <xsl:apply-templates/>
+</xsl:template>
+
+<xsl:template match="msgentry">
+ <xsl:call-template name="block.object"/>
+</xsl:template>
+
+<xsl:template match="simplemsgentry">
+ <xsl:call-template name="block.object"/>
+</xsl:template>
+
+<xsl:template match="msg">
+ <xsl:call-template name="block.object"/>
+</xsl:template>
+
+<xsl:template match="msgmain">
+ <xsl:apply-templates/>
+</xsl:template>
+
+<xsl:template match="msgmain/title">
+ <xsl:choose>
+ <xsl:when test="$make.clean.html != 0">
+ <span class="msgmain-title">
+ <xsl:apply-templates/>
+ </span>
+ </xsl:when>
+ <xsl:otherwise>
+ <strong xmlns:xslo="http://www.w3.org/1999/XSL/Transform"><xsl:apply-templates/></strong>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="msgsub">
+ <xsl:apply-templates/>
+</xsl:template>
+
+<xsl:template match="msgsub/title">
+ <xsl:choose>
+ <xsl:when test="$make.clean.html != 0">
+ <span class="msgsub-title">
+ <xsl:apply-templates/>
+ </span>
+ </xsl:when>
+ <xsl:otherwise>
+ <strong xmlns:xslo="http://www.w3.org/1999/XSL/Transform"><xsl:apply-templates/></strong>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="msgrel">
+ <xsl:apply-templates/>
+</xsl:template>
+
+<xsl:template match="msgrel/title">
+ <xsl:choose>
+ <xsl:when test="$make.clean.html != 0">
+ <span class="msgrel-title">
+ <xsl:apply-templates/>
+ </span>
+ </xsl:when>
+ <xsl:otherwise>
+ <strong xmlns:xslo="http://www.w3.org/1999/XSL/Transform"><xsl:apply-templates/></strong>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="msgtext">
+ <xsl:apply-templates/>
+</xsl:template>
+
+<xsl:template match="msginfo">
+ <xsl:call-template name="block.object"/>
+</xsl:template>
+
+<xsl:template match="msglevel">
+ <xsl:choose>
+ <xsl:when test="$make.clean.html != 0">
+ <div class="msglevel">
+ <span class="msglevel-title">
+ <xsl:call-template name="gentext.template">
+ <xsl:with-param name="context" select="'msgset'"/>
+ <xsl:with-param name="name" select="'MsgLevel'"/>
+ </xsl:call-template>
+ </span>
+ <xsl:apply-templates/>
+ </div>
+ </xsl:when>
+ <xsl:otherwise>
+ <p>
+ <strong xmlns:xslo="http://www.w3.org/1999/XSL/Transform">
+ <xsl:call-template name="gentext.template">
+ <xsl:with-param name="context" select="'msgset'"/>
+ <xsl:with-param name="name" select="'MsgLevel'"/>
+ </xsl:call-template>
+ </strong>
+ <xsl:apply-templates/>
+ </p>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="msgorig">
+ <xsl:choose>
+ <xsl:when test="$make.clean.html != 0">
+ <div class="msgorig">
+ <span class="msgorig-title">
+ <xsl:call-template name="gentext.template">
+ <xsl:with-param name="context" select="'msgset'"/>
+ <xsl:with-param name="name" select="'MsgOrig'"/>
+ </xsl:call-template>
+ </span>
+ <xsl:apply-templates/>
+ </div>
+ </xsl:when>
+ <xsl:otherwise>
+ <p>
+ <strong xmlns:xslo="http://www.w3.org/1999/XSL/Transform">
+ <xsl:call-template name="gentext.template">
+ <xsl:with-param name="context" select="'msgset'"/>
+ <xsl:with-param name="name" select="'MsgOrig'"/>
+ </xsl:call-template>
+ </strong>
+ <xsl:apply-templates/>
+ </p>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="msgaud">
+ <xsl:choose>
+ <xsl:when test="$make.clean.html != 0">
+ <div class="msgaud">
+ <span class="msgaud-title">
+ <xsl:call-template name="gentext.template">
+ <xsl:with-param name="context" select="'msgset'"/>
+ <xsl:with-param name="name" select="'MsgAud'"/>
+ </xsl:call-template>
+ </span>
+ <xsl:apply-templates/>
+ </div>
+ </xsl:when>
+ <xsl:otherwise>
+ <p>
+ <strong xmlns:xslo="http://www.w3.org/1999/XSL/Transform">
+ <xsl:call-template name="gentext.template">
+ <xsl:with-param name="context" select="'msgset'"/>
+ <xsl:with-param name="name" select="'MsgAud'"/>
+ </xsl:call-template>
+ </strong>
+ <xsl:apply-templates/>
+ </p>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="msgexplan">
+ <xsl:call-template name="block.object"/>
+</xsl:template>
+
+<xsl:template match="msgexplan/title">
+ <xsl:choose>
+ <xsl:when test="$make.clean.html != 0">
+ <div class="msgexplan">
+ <span class="msgexplan-title">
+ <xsl:apply-templates/>
+ </span>
+ </div>
+ </xsl:when>
+ <xsl:otherwise>
+ <p>
+ <strong xmlns:xslo="http://www.w3.org/1999/XSL/Transform">
+ <xsl:apply-templates/>
+ </strong>
+ </p>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="revhistory">
+ <div>
+ <xsl:call-template name="common.html.attributes"/>
+ <table border="0" width="100%" summary="Revision history">
+ <tr>
+ <th align="{$direction.align.start}" valign="top" colspan="3">
+ <strong xmlns:xslo="http://www.w3.org/1999/XSL/Transform">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'RevHistory'"/>
+ </xsl:call-template>
+ </strong>
+ </th>
+ </tr>
+ <xsl:apply-templates/>
+ </table>
+ </div>
+</xsl:template>
+
+<xsl:template match="revhistory/revision">
+ <xsl:variable name="revnumber" select="revnumber"/>
+ <xsl:variable name="revdate" select="date"/>
+ <xsl:variable name="revauthor" select="authorinitials|author"/>
+ <xsl:variable name="revremark" select="revremark|revdescription"/>
+ <tr>
+ <td align="{$direction.align.start}">
+ <xsl:if test="$revnumber">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'Revision'"/>
+ </xsl:call-template>
+ <xsl:call-template name="gentext.space"/>
+ <xsl:apply-templates select="$revnumber"/>
+ </xsl:if>
+ </td>
+ <td align="{$direction.align.start}">
+ <xsl:apply-templates select="$revdate"/>
+ </td>
+ <xsl:choose>
+ <xsl:when test="count($revauthor)=0">
+ <td align="{$direction.align.start}">
+ <xsl:call-template name="dingbat">
+ <xsl:with-param name="dingbat">nbsp</xsl:with-param>
+ </xsl:call-template>
+ </td>
+ </xsl:when>
+ <xsl:otherwise>
+ <td align="{$direction.align.start}">
+ <xsl:for-each select="$revauthor">
+ <xsl:apply-templates select="."/>
+ <xsl:if test="position() != last()">
+ <xsl:text>, </xsl:text>
+ </xsl:if>
+ </xsl:for-each>
+ </td>
+ </xsl:otherwise>
+ </xsl:choose>
+ </tr>
+ <xsl:if test="$revremark">
+ <tr>
+ <td align="{$direction.align.start}" colspan="3">
+ <xsl:apply-templates select="$revremark"/>
+ </td>
+ </tr>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="revision/revnumber">
+ <xsl:apply-templates/>
+</xsl:template>
+
+<xsl:template match="revision/date">
+ <xsl:apply-templates/>
+</xsl:template>
+
+<xsl:template match="revision/authorinitials">
+ <xsl:text>, </xsl:text>
+ <xsl:apply-templates/>
+</xsl:template>
+
+<xsl:template match="revision/authorinitials[1]" priority="2">
+ <xsl:apply-templates/>
+</xsl:template>
+
+<xsl:template match="revision/revremark">
+ <xsl:apply-templates/>
+</xsl:template>
+
+<xsl:template match="revision/revdescription">
+ <xsl:apply-templates/>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="ackno|acknowledgements[parent::article]">
+ <xsl:call-template name="block.object"/>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="highlights">
+ <xsl:call-template name="block.object"/>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/callout.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/callout.xsl
new file mode 100644
index 0000000..1b3f532
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/callout.xsl
@@ -0,0 +1,188 @@
+<?xml version="1.0" encoding="ASCII"?>
+<!--This file was created automatically by html2xhtml-->
+<!--from the HTML stylesheets.-->
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:sverb="http://nwalsh.com/xslt/ext/com.nwalsh.saxon.Verbatim" xmlns:xverb="xalan://com.nwalsh.xalan.Verbatim" xmlns:lxslt="http://xml.apache.org/xslt" xmlns="http://www.w3.org/1999/xhtml" exclude-result-prefixes="sverb xverb lxslt" version="1.0">
+
+<!-- ********************************************************************
+ $Id: callout.xsl 8421 2009-05-04 07:49:49Z bobstayton $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<lxslt:component prefix="xverb" functions="insertCallouts"/>
+
+<xsl:template match="programlistingco|screenco">
+ <xsl:variable name="verbatim" select="programlisting|screen"/>
+
+ <xsl:choose>
+ <xsl:when test="$use.extensions != '0' and $callouts.extension != '0'">
+ <xsl:variable name="rtf">
+ <xsl:apply-templates select="$verbatim">
+ <xsl:with-param name="suppress-numbers" select="'1'"/>
+ </xsl:apply-templates>
+ </xsl:variable>
+
+ <xsl:variable name="rtf-with-callouts">
+ <xsl:choose>
+ <xsl:when test="function-available('sverb:insertCallouts')">
+ <xsl:copy-of select="sverb:insertCallouts(areaspec,$rtf)"/>
+ </xsl:when>
+ <xsl:when test="function-available('xverb:insertCallouts')">
+ <xsl:copy-of select="xverb:insertCallouts(areaspec,$rtf)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:message terminate="yes">
+ <xsl:text>No insertCallouts function is available.</xsl:text>
+ </xsl:message>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="$verbatim/@linenumbering = 'numbered' and $linenumbering.extension != '0'">
+ <div>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:call-template name="number.rtf.lines">
+ <xsl:with-param name="rtf" select="$rtf-with-callouts"/>
+ <xsl:with-param name="pi.context" select="programlisting|screen"/>
+ </xsl:call-template>
+ <xsl:apply-templates select="calloutlist"/>
+ </div>
+ </xsl:when>
+ <xsl:otherwise>
+ <div>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:copy-of select="$rtf-with-callouts"/>
+ <xsl:apply-templates select="calloutlist"/>
+ </div>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <div>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates/>
+ </div>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="areaspec|areaset|area">
+</xsl:template>
+
+<xsl:template match="areaset" mode="conumber">
+ <xsl:number count="area|areaset" format="1"/>
+</xsl:template>
+
+<xsl:template match="area" mode="conumber">
+ <xsl:number count="area|areaset" format="1"/>
+</xsl:template>
+
+<xsl:template match="co" name="co">
+ <!-- Support a single linkend in HTML -->
+ <xsl:variable name="targets" select="key('id', @linkends)"/>
+ <xsl:variable name="target" select="$targets[1]"/>
+ <xsl:choose>
+ <xsl:when test="$target">
+ <a>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:if test="@id or @xml:id">
+ <xsl:attribute name="id">
+ <xsl:value-of select="(@id|@xml:id)[1]"/>
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:attribute name="href">
+ <xsl:call-template name="href.target">
+ <xsl:with-param name="object" select="$target"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:apply-templates select="." mode="callout-bug"/>
+ </a>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="anchor"/>
+ <xsl:apply-templates select="." mode="callout-bug"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="coref">
+ <!-- tricky; this relies on the fact that we can process the "co" that's -->
+ <!-- "over there" as if it were "right here" -->
+
+ <xsl:variable name="co" select="key('id', @linkend)"/>
+ <xsl:choose>
+ <xsl:when test="not($co)">
+ <xsl:message>
+ <xsl:text>Error: coref link is broken: </xsl:text>
+ <xsl:value-of select="@linkend"/>
+ </xsl:message>
+ </xsl:when>
+ <xsl:when test="local-name($co) != 'co'">
+ <xsl:message>
+ <xsl:text>Error: coref doesn't point to a co: </xsl:text>
+ <xsl:value-of select="@linkend"/>
+ </xsl:message>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="$co"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="co" mode="callout-bug">
+ <xsl:call-template name="callout-bug">
+ <xsl:with-param name="conum">
+ <xsl:number count="co" level="any" from="programlisting|screen|literallayout|synopsis" format="1"/>
+ </xsl:with-param>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template name="callout-bug">
+ <xsl:param name="conum" select="1"/>
+
+ <xsl:choose>
+ <xsl:when test="$callout.graphics != 0 and $conum &lt;= $callout.graphics.number.limit">
+ <img src="{$callout.graphics.path}{$conum}{$callout.graphics.extension}" alt="{$conum}"/>
+ </xsl:when>
+ <xsl:when test="$callout.unicode != 0 and $conum &lt;= $callout.unicode.number.limit">
+ <xsl:choose>
+ <xsl:when test="$callout.unicode.start.character = 10102">
+ <xsl:choose>
+ <xsl:when test="$conum = 1">&#10102;</xsl:when>
+ <xsl:when test="$conum = 2">&#10103;</xsl:when>
+ <xsl:when test="$conum = 3">&#10104;</xsl:when>
+ <xsl:when test="$conum = 4">&#10105;</xsl:when>
+ <xsl:when test="$conum = 5">&#10106;</xsl:when>
+ <xsl:when test="$conum = 6">&#10107;</xsl:when>
+ <xsl:when test="$conum = 7">&#10108;</xsl:when>
+ <xsl:when test="$conum = 8">&#10109;</xsl:when>
+ <xsl:when test="$conum = 9">&#10110;</xsl:when>
+ <xsl:when test="$conum = 10">&#10111;</xsl:when>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:message>
+ <xsl:text>Don't know how to generate Unicode callouts </xsl:text>
+ <xsl:text>when $callout.unicode.start.character is </xsl:text>
+ <xsl:value-of select="$callout.unicode.start.character"/>
+ </xsl:message>
+ <xsl:text>(</xsl:text>
+ <xsl:value-of select="$conum"/>
+ <xsl:text>)</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text>(</xsl:text>
+ <xsl:value-of select="$conum"/>
+ <xsl:text>)</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/changebars.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/changebars.xsl
new file mode 100644
index 0000000..2e70e0e
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/changebars.xsl
@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="ASCII"?>
+<!--This file was created automatically by html2xhtml-->
+<!--from the HTML stylesheets.-->
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1999/xhtml" version="1.0">
+
+<!-- ********************************************************************
+ $Id: changebars.xsl 8128 2008-09-29 17:16:10Z mzjn $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<!-- ==================================================================== -->
+<xsl:import href="docbook.xsl"/>
+
+<xsl:param name="show.revisionflag" select="'1'"/>
+
+<xsl:template name="system.head.content">
+<xsl:param name="node" select="."/>
+
+<style type="text/css">
+<xsl:text>
+div.added { background-color: #ffff99;
+ text-decoration: underline; }
+div.deleted { text-decoration: line-through;
+ background-color: #FF7F7F; }
+div.changed { background-color: #99ff99; }
+div.off { }
+
+span.added { background-color: #ffff99;
+ text-decoration: underline; }
+span.deleted { text-decoration: line-through;
+ background-color: #FF7F7F; }
+span.changed { background-color: #99ff99; }
+span.off { }
+</xsl:text>
+</style>
+</xsl:template>
+
+<xsl:template match="*[@revisionflag]">
+ <xsl:call-template name="block.or.inline.revision"/>
+</xsl:template>
+
+<xsl:template name="block.or.inline.revision">
+ <xsl:param name="revisionflag" select="@revisionflag"/>
+
+ <xsl:choose>
+ <xsl:when test="local-name(.) = 'para' or local-name(.) = 'formalpara' or local-name(.) = 'simpara' or local-name(.) = 'simplesect' or local-name(.) = 'section' or local-name(.) = 'sect1' or local-name(.) = 'sect2' or local-name(.) = 'sect3' or local-name(.) = 'sect4' or local-name(.) = 'sect5' or local-name(.) = 'chapter' or local-name(.) = 'preface' or local-name(.) = 'itemizedlist' or local-name(.) = 'orderedlist' or local-name(.) = 'variablelist' or local-name(.) = 'varlistentry' or local-name(.) = 'informaltable' or local-name(.) = 'informalexample' or local-name(.) = 'note' or local-name(.) = 'example' or local-name(.) = 'mediaobject' or local-name(.) = 'sidebar' or local-name(.) = 'glossary' or local-name(.) = 'glossentry' or local-name(.) = 'bibliography' or local-name(.) = 'index' or local-name(.) = 'appendix'">
+ <div class="{$revisionflag}">
+ <xsl:apply-imports/>
+ </div>
+ </xsl:when>
+ <xsl:when test="local-name(.) = 'phrase' or local-name(.) = 'ulink' or local-name(.) = 'link' or local-name(.) = 'olink' or local-name(.) = 'inlinemediaobject' or local-name(.) = 'filename' or local-name(.) = 'literal' or local-name(.) = 'member' or local-name(.) = 'term' or local-name(.) = 'guilabel' or local-name(.) = 'glossterm' or local-name(.) = 'sgmltag' or local-name(.) = 'tag' or local-name(.) = 'quote' or local-name(.) = 'emphasis' or local-name(.) = 'command' or local-name(.) = 'xref'">
+ <span class="{$revisionflag}">
+ <xsl:apply-imports/>
+ </span>
+ </xsl:when>
+ <xsl:when test="local-name(.) = 'listitem' or local-name(.) = 'entry' or local-name(.) = 'title'">
+ <!-- nop; these are handled directly in the stylesheet -->
+ <xsl:apply-imports/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:message>
+ <xsl:text>Revisionflag on unexpected element: </xsl:text>
+ <xsl:value-of select="local-name(.)"/>
+ <xsl:text> (Assuming block)</xsl:text>
+ </xsl:message>
+ <div class="{$revisionflag}">
+ <xsl:apply-imports/>
+ </div>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/chunk-changebars.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/chunk-changebars.xsl
new file mode 100644
index 0000000..7c0e81a
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/chunk-changebars.xsl
@@ -0,0 +1,96 @@
+<?xml version="1.0" encoding="ASCII"?>
+<!--This file was created automatically by html2xhtml-->
+<!--from the HTML stylesheets.-->
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:exsl="http://exslt.org/common" xmlns:cf="http://docbook.sourceforge.net/xmlns/chunkfast/1.0" xmlns="http://www.w3.org/1999/xhtml" version="1.0" exclude-result-prefixes="exsl cf">
+
+<!-- ********************************************************************
+ $Id: chunk-changebars.xsl 8399 2009-04-08 07:37:42Z bobstayton $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<!-- ==================================================================== -->
+
+<!-- This file is a variant of chunk.xsl, to be used for generating chunked
+ output with highlighting based on change markup. -->
+
+<xsl:import href="changebars.xsl"/>
+<xsl:import href="chunk-common.xsl"/>
+
+<!-- This customization of "process-chunk-element" is needed in order to make change
+ highlighting be inherited by chunked children of an element with change markup. -->
+<xsl:template name="process-chunk-element">
+ <xsl:param name="content">
+ <xsl:choose>
+
+ <xsl:when test="ancestor-or-self::*[@revisionflag] and $show.revisionflag != 0">
+ <xsl:variable name="revisionflag" select="ancestor-or-self::*[@revisionflag][1]/@revisionflag"/>
+ <xsl:call-template name="block.or.inline.revision">
+ <xsl:with-param name="revisionflag" select="$revisionflag"/>
+ </xsl:call-template>
+ </xsl:when>
+
+ <xsl:otherwise>
+ <xsl:apply-imports/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:param>
+
+ <xsl:choose>
+ <xsl:when test="$chunk.fast != 0 and $exsl.node.set.available != 0">
+ <xsl:variable name="chunks" select="exsl:node-set($chunk.hierarchy)//cf:div"/>
+ <xsl:variable name="genid" select="generate-id()"/>
+
+ <xsl:variable name="div" select="$chunks[@id=$genid or @xml:id=$genid]"/>
+
+ <xsl:variable name="prevdiv" select="($div/preceding-sibling::cf:div|$div/preceding::cf:div|$div/parent::cf:div)[last()]"/>
+ <xsl:variable name="prev" select="key('genid', ($prevdiv/@id|$prevdiv/@xml:id)[1])"/>
+
+ <xsl:variable name="nextdiv" select="($div/following-sibling::cf:div|$div/following::cf:div|$div/cf:div)[1]"/>
+ <xsl:variable name="next" select="key('genid', ($nextdiv/@id|$nextdiv/@xml:id)[1])"/>
+
+ <xsl:choose>
+ <xsl:when test="$onechunk != 0 and parent::*">
+ <xsl:copy-of select="$content"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="process-chunk">
+ <xsl:with-param name="prev" select="$prev"/>
+ <xsl:with-param name="next" select="$next"/>
+ <xsl:with-param name="content" select="$content"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:choose>
+ <xsl:when test="$onechunk != 0 and not(parent::*)">
+ <xsl:call-template name="chunk-all-sections">
+ <xsl:with-param name="content" select="$content"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="$onechunk != 0">
+ <xsl:copy-of select="$content"/>
+ </xsl:when>
+ <xsl:when test="$chunk.first.sections = 0">
+ <xsl:call-template name="chunk-first-section-with-parent">
+ <xsl:with-param name="content" select="$content"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="chunk-all-sections">
+ <xsl:with-param name="content" select="$content"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:include href="chunk-code.xsl"/>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/chunk-code.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/chunk-code.xsl
new file mode 100644
index 0000000..4682df5
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/chunk-code.xsl
@@ -0,0 +1,645 @@
+<?xml version="1.0" encoding="ASCII"?>
+<!--This file was created automatically by html2xhtml-->
+<!--from the HTML stylesheets.-->
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:exsl="http://exslt.org/common" xmlns:cf="http://docbook.sourceforge.net/xmlns/chunkfast/1.0" xmlns:ng="http://docbook.org/docbook-ng" xmlns:db="http://docbook.org/ns/docbook" xmlns="http://www.w3.org/1999/xhtml" exclude-result-prefixes="exsl cf ng db" version="1.0">
+
+<!-- ********************************************************************
+ $Id: chunk-code.xsl 8596 2010-03-20 04:36:45Z bobstayton $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<!-- ==================================================================== -->
+
+
+<xsl:template match="*" mode="chunk-filename">
+ <!-- returns the filename of a chunk -->
+ <xsl:variable name="ischunk">
+ <xsl:call-template name="chunk"/>
+ </xsl:variable>
+
+ <xsl:variable name="fn">
+ <xsl:apply-templates select="." mode="recursive-chunk-filename"/>
+ </xsl:variable>
+
+ <!--
+ <xsl:message>
+ <xsl:value-of select="$ischunk"/>
+ <xsl:text> (</xsl:text>
+ <xsl:value-of select="local-name(.)"/>
+ <xsl:text>) </xsl:text>
+ <xsl:value-of select="$fn"/>
+ <xsl:text>, </xsl:text>
+ <xsl:call-template name="dbhtml-dir"/>
+ </xsl:message>
+ -->
+
+ <!-- 2003-11-25 by ndw:
+ The following test used to read test="$ischunk != 0 and $fn != ''"
+ I've removed the ischunk part of the test so that href.to.uri and
+ href.from.uri will be fully qualified even if the source or target
+ isn't a chunk. I *think* that if $fn != '' then it's appropriate
+ to put the directory on the front, even if the element isn't a
+ chunk. I could be wrong. -->
+
+ <xsl:if test="$fn != ''">
+ <xsl:call-template name="dbhtml-dir"/>
+ </xsl:if>
+
+ <xsl:value-of select="$fn"/>
+ <!-- You can't add the html.ext here because dbhtml filename= may already -->
+ <!-- have added it. It really does have to be handled in the recursive template -->
+</xsl:template>
+
+<xsl:template match="*" mode="recursive-chunk-filename">
+ <xsl:param name="recursive" select="false()"/>
+
+ <!-- returns the filename of a chunk -->
+ <xsl:variable name="ischunk">
+ <xsl:call-template name="chunk"/>
+ </xsl:variable>
+
+ <xsl:variable name="dbhtml-filename">
+ <xsl:call-template name="pi.dbhtml_filename"/>
+ </xsl:variable>
+
+ <xsl:variable name="filename">
+ <xsl:choose>
+ <xsl:when test="$dbhtml-filename != ''">
+ <xsl:value-of select="$dbhtml-filename"/>
+ </xsl:when>
+ <!-- if this is the root element, use the root.filename -->
+ <xsl:when test="not(parent::*) and $root.filename != ''">
+ <xsl:value-of select="$root.filename"/>
+ <xsl:value-of select="$html.ext"/>
+ </xsl:when>
+ <!-- Special case -->
+ <xsl:when test="self::legalnotice and not($generate.legalnotice.link = 0)">
+ <xsl:choose>
+ <xsl:when test="(@id or @xml:id) and not($use.id.as.filename = 0)">
+ <!-- * if this legalnotice has an ID, then go ahead and use -->
+ <!-- * just the value of that ID as the basename for the file -->
+ <!-- * (that is, without prepending an "ln-" too it) -->
+ <xsl:value-of select="(@id|@xml:id)[1]"/>
+ <xsl:value-of select="$html.ext"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <!-- * otherwise, if this legalnotice does not have an ID, -->
+ <!-- * then we generate an ID... -->
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+ <!-- * ...and then we take that generated ID, prepend an -->
+ <!-- * "ln-" to it, and use that as the basename for the file -->
+ <xsl:value-of select="concat('ln-',$id,$html.ext)"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <!-- if there's no dbhtml filename, and if we're to use IDs as -->
+ <!-- filenames, then use the ID to generate the filename. -->
+ <xsl:when test="(@id or @xml:id) and $use.id.as.filename != 0">
+ <xsl:value-of select="(@id|@xml:id)[1]"/>
+ <xsl:value-of select="$html.ext"/>
+ </xsl:when>
+ <xsl:otherwise/>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="$ischunk='0'">
+ <!-- if called on something that isn't a chunk, walk up... -->
+ <xsl:choose>
+ <xsl:when test="count(parent::*)&gt;0">
+ <xsl:apply-templates mode="recursive-chunk-filename" select="parent::*">
+ <xsl:with-param name="recursive" select="$recursive"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <!-- unless there is no up, in which case return "" -->
+ <xsl:otherwise/>
+ </xsl:choose>
+ </xsl:when>
+
+ <xsl:when test="not($recursive) and $filename != ''">
+ <!-- if this chunk has an explicit name, use it -->
+ <xsl:value-of select="$filename"/>
+ </xsl:when>
+
+ <xsl:when test="self::set">
+ <xsl:value-of select="$root.filename"/>
+ <xsl:if test="not($recursive)">
+ <xsl:value-of select="$html.ext"/>
+ </xsl:if>
+ </xsl:when>
+
+ <xsl:when test="self::book">
+ <xsl:text>bk</xsl:text>
+ <xsl:number level="any" format="01"/>
+ <xsl:if test="not($recursive)">
+ <xsl:value-of select="$html.ext"/>
+ </xsl:if>
+ </xsl:when>
+
+ <xsl:when test="self::article">
+ <xsl:if test="/set">
+ <!-- in a set, make sure we inherit the right book info... -->
+ <xsl:apply-templates mode="recursive-chunk-filename" select="parent::*">
+ <xsl:with-param name="recursive" select="true()"/>
+ </xsl:apply-templates>
+ </xsl:if>
+
+ <xsl:text>ar</xsl:text>
+ <xsl:number level="any" format="01" from="book"/>
+ <xsl:if test="not($recursive)">
+ <xsl:value-of select="$html.ext"/>
+ </xsl:if>
+ </xsl:when>
+
+ <xsl:when test="self::preface">
+ <xsl:if test="/set">
+ <!-- in a set, make sure we inherit the right book info... -->
+ <xsl:apply-templates mode="recursive-chunk-filename" select="parent::*">
+ <xsl:with-param name="recursive" select="true()"/>
+ </xsl:apply-templates>
+ </xsl:if>
+
+ <xsl:text>pr</xsl:text>
+ <xsl:number level="any" format="01" from="book"/>
+ <xsl:if test="not($recursive)">
+ <xsl:value-of select="$html.ext"/>
+ </xsl:if>
+ </xsl:when>
+
+ <xsl:when test="self::chapter">
+ <xsl:if test="/set">
+ <!-- in a set, make sure we inherit the right book info... -->
+ <xsl:apply-templates mode="recursive-chunk-filename" select="parent::*">
+ <xsl:with-param name="recursive" select="true()"/>
+ </xsl:apply-templates>
+ </xsl:if>
+
+ <xsl:text>ch</xsl:text>
+ <xsl:number level="any" format="01" from="book"/>
+ <xsl:if test="not($recursive)">
+ <xsl:value-of select="$html.ext"/>
+ </xsl:if>
+ </xsl:when>
+
+ <xsl:when test="self::appendix">
+ <xsl:if test="/set">
+ <!-- in a set, make sure we inherit the right book info... -->
+ <xsl:apply-templates mode="recursive-chunk-filename" select="parent::*">
+ <xsl:with-param name="recursive" select="true()"/>
+ </xsl:apply-templates>
+ </xsl:if>
+
+ <xsl:text>ap</xsl:text>
+ <xsl:number level="any" format="a" from="book"/>
+ <xsl:if test="not($recursive)">
+ <xsl:value-of select="$html.ext"/>
+ </xsl:if>
+ </xsl:when>
+
+ <xsl:when test="self::part">
+ <xsl:choose>
+ <xsl:when test="/set">
+ <!-- in a set, make sure we inherit the right book info... -->
+ <xsl:apply-templates mode="recursive-chunk-filename" select="parent::*">
+ <xsl:with-param name="recursive" select="true()"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:otherwise>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:text>pt</xsl:text>
+ <xsl:number level="any" format="01" from="book"/>
+ <xsl:if test="not($recursive)">
+ <xsl:value-of select="$html.ext"/>
+ </xsl:if>
+ </xsl:when>
+
+ <xsl:when test="self::reference">
+ <xsl:choose>
+ <xsl:when test="/set">
+ <!-- in a set, make sure we inherit the right book info... -->
+ <xsl:apply-templates mode="recursive-chunk-filename" select="parent::*">
+ <xsl:with-param name="recursive" select="true()"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:otherwise>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:text>rn</xsl:text>
+ <xsl:number level="any" format="01" from="book"/>
+ <xsl:if test="not($recursive)">
+ <xsl:value-of select="$html.ext"/>
+ </xsl:if>
+ </xsl:when>
+
+ <xsl:when test="self::refentry">
+ <xsl:choose>
+ <xsl:when test="parent::reference">
+ <xsl:apply-templates mode="recursive-chunk-filename" select="parent::*">
+ <xsl:with-param name="recursive" select="true()"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:if test="/set">
+ <!-- in a set, make sure we inherit the right book info... -->
+ <xsl:apply-templates mode="recursive-chunk-filename" select="parent::*">
+ <xsl:with-param name="recursive" select="true()"/>
+ </xsl:apply-templates>
+ </xsl:if>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:text>re</xsl:text>
+ <xsl:number level="any" format="01" from="book"/>
+ <xsl:if test="not($recursive)">
+ <xsl:value-of select="$html.ext"/>
+ </xsl:if>
+ </xsl:when>
+
+ <xsl:when test="self::colophon">
+ <xsl:choose>
+ <xsl:when test="/set">
+ <!-- in a set, make sure we inherit the right book info... -->
+ <xsl:apply-templates mode="recursive-chunk-filename" select="parent::*">
+ <xsl:with-param name="recursive" select="true()"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:otherwise>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:text>co</xsl:text>
+ <xsl:number level="any" format="01" from="book"/>
+ <xsl:if test="not($recursive)">
+ <xsl:value-of select="$html.ext"/>
+ </xsl:if>
+ </xsl:when>
+
+ <xsl:when test="self::sect1 or self::sect2 or self::sect3 or self::sect4 or self::sect5 or self::section">
+ <xsl:apply-templates mode="recursive-chunk-filename" select="parent::*">
+ <xsl:with-param name="recursive" select="true()"/>
+ </xsl:apply-templates>
+ <xsl:text>s</xsl:text>
+ <xsl:number format="01"/>
+ <xsl:if test="not($recursive)">
+ <xsl:value-of select="$html.ext"/>
+ </xsl:if>
+ </xsl:when>
+
+ <xsl:when test="self::bibliography">
+ <xsl:choose>
+ <xsl:when test="/set">
+ <!-- in a set, make sure we inherit the right book info... -->
+ <xsl:apply-templates mode="recursive-chunk-filename" select="parent::*">
+ <xsl:with-param name="recursive" select="true()"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:otherwise>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:text>bi</xsl:text>
+ <xsl:number level="any" format="01" from="book"/>
+ <xsl:if test="not($recursive)">
+ <xsl:value-of select="$html.ext"/>
+ </xsl:if>
+ </xsl:when>
+
+ <xsl:when test="self::glossary">
+ <xsl:choose>
+ <xsl:when test="/set">
+ <!-- in a set, make sure we inherit the right book info... -->
+ <xsl:apply-templates mode="recursive-chunk-filename" select="parent::*">
+ <xsl:with-param name="recursive" select="true()"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:otherwise>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:text>go</xsl:text>
+ <xsl:number level="any" format="01" from="book"/>
+ <xsl:if test="not($recursive)">
+ <xsl:value-of select="$html.ext"/>
+ </xsl:if>
+ </xsl:when>
+
+ <xsl:when test="self::index">
+ <xsl:choose>
+ <xsl:when test="/set">
+ <!-- in a set, make sure we inherit the right book info... -->
+ <xsl:apply-templates mode="recursive-chunk-filename" select="parent::*">
+ <xsl:with-param name="recursive" select="true()"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:otherwise>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:text>ix</xsl:text>
+ <xsl:number level="any" format="01" from="book"/>
+ <xsl:if test="not($recursive)">
+ <xsl:value-of select="$html.ext"/>
+ </xsl:if>
+ </xsl:when>
+
+ <xsl:when test="self::setindex">
+ <xsl:text>si</xsl:text>
+ <xsl:number level="any" format="01" from="set"/>
+ <xsl:if test="not($recursive)">
+ <xsl:value-of select="$html.ext"/>
+ </xsl:if>
+ </xsl:when>
+
+ <xsl:otherwise>
+ <xsl:text>chunk-filename-error-</xsl:text>
+ <xsl:value-of select="name(.)"/>
+ <xsl:number level="any" format="01" from="set"/>
+ <xsl:if test="not($recursive)">
+ <xsl:value-of select="$html.ext"/>
+ </xsl:if>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+
+
+<xsl:template match="processing-instruction('dbhtml')">
+ <!-- nop -->
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+
+<xsl:template match="*" mode="find.chunks">
+ <xsl:variable name="chunk">
+ <xsl:call-template name="chunk"/>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="$chunk != 0">
+ <cf:div id="{generate-id()}">
+ <xsl:apply-templates select="." mode="class.attribute"/>
+ <xsl:apply-templates select="*" mode="find.chunks"/>
+ </cf:div>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="*" mode="find.chunks"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="/">
+ <!-- * Get a title for current doc so that we let the user -->
+ <!-- * know what document we are processing at this point. -->
+ <xsl:variable name="doc.title">
+ <xsl:call-template name="get.doc.title"/>
+ </xsl:variable>
+ <xsl:choose>
+ <!-- Hack! If someone hands us a DocBook V5.x or DocBook NG document,
+ toss the namespace and continue. Use the docbook5 namespaced
+ stylesheets for DocBook5 if you don't want to use this feature.-->
+ <xsl:when test="$exsl.node.set.available != 0 and (*/self::ng:* or */self::db:*)">
+ <xsl:call-template name="log.message">
+ <xsl:with-param name="level">Note</xsl:with-param>
+ <xsl:with-param name="source" select="$doc.title"/>
+ <xsl:with-param name="context-desc">
+ <xsl:text>namesp. cut</xsl:text>
+ </xsl:with-param>
+ <xsl:with-param name="message">
+ <xsl:text>stripped namespace before processing</xsl:text>
+ </xsl:with-param>
+ </xsl:call-template>
+ <xsl:variable name="nons">
+ <xsl:apply-templates mode="stripNS"/>
+ </xsl:variable>
+ <xsl:call-template name="log.message">
+ <xsl:with-param name="level">Note</xsl:with-param>
+ <xsl:with-param name="source" select="$doc.title"/>
+ <xsl:with-param name="context-desc">
+ <xsl:text>namesp. cut</xsl:text>
+ </xsl:with-param>
+ <xsl:with-param name="message">
+ <xsl:text>processing stripped document</xsl:text>
+ </xsl:with-param>
+ </xsl:call-template>
+ <xsl:apply-templates select="exsl:node-set($nons)"/>
+ </xsl:when>
+ <!-- Can't process unless namespace removed -->
+ <xsl:when test="*/self::ng:* or */self::db:*">
+ <xsl:message terminate="yes">
+ <xsl:text>Unable to strip the namespace from DB5 document,</xsl:text>
+ <xsl:text> cannot proceed.</xsl:text>
+ </xsl:message>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:choose>
+ <xsl:when test="$rootid != ''">
+ <xsl:choose>
+ <xsl:when test="count(key('id',$rootid)) = 0">
+ <xsl:message terminate="yes">
+ <xsl:text>ID '</xsl:text>
+ <xsl:value-of select="$rootid"/>
+ <xsl:text>' not found in document.</xsl:text>
+ </xsl:message>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:if test="$collect.xref.targets = 'yes' or $collect.xref.targets = 'only'">
+ <xsl:apply-templates select="key('id', $rootid)" mode="collect.targets"/>
+ </xsl:if>
+ <xsl:if test="$collect.xref.targets != 'only'">
+ <xsl:apply-templates select="key('id',$rootid)" mode="process.root"/>
+ <xsl:if test="$tex.math.in.alt != ''">
+ <xsl:apply-templates select="key('id',$rootid)" mode="collect.tex.math"/>
+ </xsl:if>
+ <xsl:if test="$generate.manifest != 0">
+ <xsl:call-template name="generate.manifest">
+ <xsl:with-param name="node" select="key('id',$rootid)"/>
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:if>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:if test="$collect.xref.targets = 'yes' or $collect.xref.targets = 'only'">
+ <xsl:apply-templates select="/" mode="collect.targets"/>
+ </xsl:if>
+ <xsl:if test="$collect.xref.targets != 'only'">
+ <xsl:apply-templates select="/" mode="process.root"/>
+ <xsl:if test="$tex.math.in.alt != ''">
+ <xsl:apply-templates select="/" mode="collect.tex.math"/>
+ </xsl:if>
+ <xsl:if test="$generate.manifest != 0">
+ <xsl:call-template name="generate.manifest">
+ <xsl:with-param name="node" select="/"/>
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:if>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="*" mode="process.root">
+ <xsl:apply-templates select="."/>
+ <xsl:call-template name="generate.css"/>
+</xsl:template>
+
+<!-- ====================================================================== -->
+
+<xsl:template match="set|book|part|preface|chapter|appendix |article |reference|refentry |book/glossary|article/glossary|part/glossary |book/bibliography|article/bibliography|part/bibliography |colophon">
+ <xsl:choose>
+ <xsl:when test="$onechunk != 0 and parent::*">
+ <xsl:apply-imports/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="process-chunk-element"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="sect1|sect2|sect3|sect4|sect5|section">
+ <xsl:variable name="ischunk">
+ <xsl:call-template name="chunk"/>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="not(parent::*)">
+ <xsl:call-template name="process-chunk-element"/>
+ </xsl:when>
+ <xsl:when test="$ischunk = 0">
+ <xsl:apply-imports/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="process-chunk-element"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="setindex |book/index |article/index |part/index">
+ <!-- some implementations use completely empty index tags to indicate -->
+ <!-- where an automatically generated index should be inserted. so -->
+ <!-- if the index is completely empty, skip it. -->
+ <xsl:if test="count(*)&gt;0 or $generate.index != '0'">
+ <xsl:call-template name="process-chunk-element"/>
+ </xsl:if>
+</xsl:template>
+
+<!-- Resolve xml:base attributes -->
+<xsl:template match="@fileref">
+ <!-- need a check for absolute urls -->
+ <xsl:choose>
+ <xsl:when test="contains(., ':')">
+ <!-- it has a uri scheme so it is an absolute uri -->
+ <xsl:value-of select="."/>
+ </xsl:when>
+ <xsl:when test="$keep.relative.image.uris != 0">
+ <!-- leave it alone -->
+ <xsl:value-of select="."/>
+ </xsl:when>
+ <xsl:otherwise>
+ <!-- its a relative uri -->
+ <xsl:call-template name="relative-uri">
+ <xsl:with-param name="destdir">
+ <xsl:call-template name="dbhtml-dir">
+ <xsl:with-param name="context" select=".."/>
+ </xsl:call-template>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ==================================================================== -->
+<xsl:template match="set|book|part|preface|chapter|appendix |article |reference|refentry |sect1|sect2|sect3|sect4|sect5 |section |book/glossary|article/glossary|part/glossary |book/bibliography|article/bibliography|part/bibliography |colophon" mode="enumerate-files">
+ <xsl:variable name="ischunk"><xsl:call-template name="chunk"/></xsl:variable>
+ <xsl:if test="$ischunk='1'">
+ <xsl:call-template name="make-relative-filename">
+ <xsl:with-param name="base.dir">
+ <xsl:if test="$manifest.in.base.dir = 0">
+ <xsl:value-of select="$base.dir"/>
+ </xsl:if>
+ </xsl:with-param>
+ <xsl:with-param name="base.name">
+ <xsl:apply-templates mode="chunk-filename" select="."/>
+ </xsl:with-param>
+ </xsl:call-template>
+ <xsl:text>
+</xsl:text>
+ </xsl:if>
+ <xsl:apply-templates select="*" mode="enumerate-files"/>
+</xsl:template>
+
+<xsl:template match="book/index|article/index|part/index" mode="enumerate-files">
+ <xsl:if test="$htmlhelp.output != 1">
+ <xsl:variable name="ischunk"><xsl:call-template name="chunk"/></xsl:variable>
+ <xsl:if test="$ischunk='1'">
+ <xsl:call-template name="make-relative-filename">
+ <xsl:with-param name="base.dir">
+ <xsl:if test="$manifest.in.base.dir = 0">
+ <xsl:value-of select="$base.dir"/>
+ </xsl:if>
+ </xsl:with-param>
+ <xsl:with-param name="base.name">
+ <xsl:apply-templates mode="chunk-filename" select="."/>
+ </xsl:with-param>
+ </xsl:call-template>
+ <xsl:text>
+</xsl:text>
+ </xsl:if>
+ <xsl:apply-templates select="*" mode="enumerate-files"/>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="legalnotice" mode="enumerate-files">
+ <xsl:variable name="id"><xsl:call-template name="object.id"/></xsl:variable>
+ <xsl:if test="$generate.legalnotice.link != 0">
+ <xsl:call-template name="make-relative-filename">
+ <xsl:with-param name="base.dir">
+ <xsl:if test="$manifest.in.base.dir = 0">
+ <xsl:value-of select="$base.dir"/>
+ </xsl:if>
+ </xsl:with-param>
+ <xsl:with-param name="base.name">
+ <xsl:apply-templates mode="chunk-filename" select="."/>
+ </xsl:with-param>
+ </xsl:call-template>
+ <xsl:text>
+</xsl:text>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="mediaobject[imageobject] | inlinemediaobject[imageobject]" mode="enumerate-files">
+ <xsl:variable name="longdesc.uri">
+ <xsl:call-template name="longdesc.uri">
+ <xsl:with-param name="mediaobject" select="."/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:variable name="mediaobject" select="."/>
+
+ <xsl:if test="$html.longdesc != 0 and $mediaobject/textobject[not(phrase)]">
+ <xsl:call-template name="longdesc.uri">
+ <xsl:with-param name="mediaobject" select="$mediaobject"/>
+ </xsl:call-template>
+ <xsl:text>
+</xsl:text>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="text()" mode="enumerate-files">
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/chunk-common.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/chunk-common.xsl
new file mode 100644
index 0000000..88c719b
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/chunk-common.xsl
@@ -0,0 +1,1561 @@
+<?xml version="1.0" encoding="ASCII"?>
+<!--This file was created automatically by html2xhtml-->
+<!--from the HTML stylesheets.-->
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:exsl="http://exslt.org/common" xmlns:cf="http://docbook.sourceforge.net/xmlns/chunkfast/1.0" xmlns:ng="http://docbook.org/docbook-ng" xmlns:db="http://docbook.org/ns/docbook" xmlns="http://www.w3.org/1999/xhtml" version="1.0" exclude-result-prefixes="exsl cf ng db">
+
+<!-- ********************************************************************
+ $Id: chunk-common.xsl 8551 2009-12-07 06:03:50Z bobstayton $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<!-- ==================================================================== -->
+
+<xsl:param name="onechunk" select="0"/>
+<xsl:param name="refentry.separator" select="0"/>
+<xsl:param name="chunk.fast" select="0"/>
+
+<xsl:key name="genid" match="*" use="generate-id()"/>
+
+<!-- ==================================================================== -->
+
+<xsl:variable name="chunk.hierarchy">
+ <xsl:if test="$chunk.fast != 0">
+ <xsl:choose>
+ <xsl:when test="$exsl.node.set.available != 0">
+ <xsl:message>Computing chunks...</xsl:message>
+ <xsl:apply-templates select="/*" mode="find.chunks"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:message>
+ <xsl:text>Fast chunking requires exsl:node-set(). </xsl:text>
+ <xsl:text>Using "slow" chunking.</xsl:text>
+ </xsl:message>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:if>
+</xsl:variable>
+
+<!-- ==================================================================== -->
+
+<xsl:template name="process-chunk-element">
+ <xsl:param name="content">
+ <xsl:apply-imports/>
+ </xsl:param>
+
+ <xsl:choose>
+ <xsl:when test="$chunk.fast != 0 and $exsl.node.set.available != 0">
+ <xsl:variable name="chunks" select="exsl:node-set($chunk.hierarchy)//cf:div"/>
+ <xsl:variable name="genid" select="generate-id()"/>
+
+ <xsl:variable name="div" select="$chunks[@id=$genid or @xml:id=$genid]"/>
+
+ <xsl:variable name="prevdiv" select="($div/preceding-sibling::cf:div|$div/preceding::cf:div|$div/parent::cf:div)[last()]"/>
+ <xsl:variable name="prev" select="key('genid', ($prevdiv/@id|$prevdiv/@xml:id)[1])"/>
+
+ <xsl:variable name="nextdiv" select="($div/following-sibling::cf:div|$div/following::cf:div|$div/cf:div)[1]"/>
+ <xsl:variable name="next" select="key('genid', ($nextdiv/@id|$nextdiv/@xml:id)[1])"/>
+
+ <xsl:choose>
+ <xsl:when test="$onechunk != 0 and parent::*">
+ <xsl:copy-of select="$content"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="process-chunk">
+ <xsl:with-param name="prev" select="$prev"/>
+ <xsl:with-param name="next" select="$next"/>
+ <xsl:with-param name="content" select="$content"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:choose>
+ <xsl:when test="$onechunk != 0 and not(parent::*)">
+ <xsl:call-template name="chunk-all-sections">
+ <xsl:with-param name="content" select="$content"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="$onechunk != 0">
+ <xsl:copy-of select="$content"/>
+ </xsl:when>
+ <xsl:when test="$chunk.first.sections = 0">
+ <xsl:call-template name="chunk-first-section-with-parent">
+ <xsl:with-param name="content" select="$content"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="chunk-all-sections">
+ <xsl:with-param name="content" select="$content"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="process-chunk">
+ <xsl:param name="prev" select="."/>
+ <xsl:param name="next" select="."/>
+ <xsl:param name="content">
+ <xsl:apply-imports/>
+ </xsl:param>
+
+ <xsl:variable name="ischunk">
+ <xsl:call-template name="chunk"/>
+ </xsl:variable>
+
+ <xsl:variable name="chunkfn">
+ <xsl:if test="$ischunk='1'">
+ <xsl:apply-templates mode="chunk-filename" select="."/>
+ </xsl:if>
+ </xsl:variable>
+
+ <xsl:if test="$ischunk='0'">
+ <xsl:message>
+ <xsl:text>Error </xsl:text>
+ <xsl:value-of select="name(.)"/>
+ <xsl:text> is not a chunk!</xsl:text>
+ </xsl:message>
+ </xsl:if>
+
+ <xsl:variable name="filename">
+ <xsl:call-template name="make-relative-filename">
+ <xsl:with-param name="base.dir" select="$base.dir"/>
+ <xsl:with-param name="base.name" select="$chunkfn"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:call-template name="write.chunk">
+ <xsl:with-param name="filename" select="$filename"/>
+ <xsl:with-param name="content">
+ <xsl:call-template name="chunk-element-content">
+ <xsl:with-param name="prev" select="$prev"/>
+ <xsl:with-param name="next" select="$next"/>
+ <xsl:with-param name="content" select="$content"/>
+ </xsl:call-template>
+ </xsl:with-param>
+ <xsl:with-param name="quiet" select="$chunk.quietly"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template name="chunk-first-section-with-parent">
+ <xsl:param name="content">
+ <xsl:apply-imports/>
+ </xsl:param>
+
+ <!-- These xpath expressions are really hairy. The trick is to pick sections -->
+ <!-- that are not first children and are not the children of first children -->
+
+ <!-- Break these variables into pieces to work around
+ http://nagoya.apache.org/bugzilla/show_bug.cgi?id=6063 -->
+
+ <xsl:variable name="prev-v1" select="(ancestor::sect1[$chunk.section.depth &gt; 0 and not(ancestor::*/processing-instruction('dbhtml')[normalize-space(.) ='stop-chunking']) and preceding-sibling::sect1][1] |ancestor::sect2[$chunk.section.depth &gt; 1 and not(ancestor::*/processing-instruction('dbhtml')[normalize-space(.) ='stop-chunking']) and preceding-sibling::sect2 and parent::sect1[preceding-sibling::sect1]][1] |ancestor::sect3[$chunk.section.depth &gt; 2 and not(ancestor::*/processing-instruction('dbhtml')[normalize-space(.) ='stop-chunking']) and preceding-sibling::sect3 and parent::sect2[preceding-sibling::sect2] and ancestor::sect1[preceding-sibling::sect1]][1] |ancestor::sect4[$chunk.section.depth &gt; 3 and not(ancestor::*/processing-instruction('dbhtml')[normalize-space(.) ='stop-chunking']) and preceding-sibling::sect4 and parent::sect3[preceding-sibling::sect3] and ancestor::sect2[preceding-sibling::sect2] and ancestor::sect1[preceding-sibling::sect1]][1] |ancestor::sect5[$chunk.section.depth &gt; 4 and not(ancestor::*/processing-instruction('dbhtml')[normalize-space(.) ='stop-chunking']) and preceding-sibling::sect5 and parent::sect4[preceding-sibling::sect4] and ancestor::sect3[preceding-sibling::sect3] and ancestor::sect2[preceding-sibling::sect2] and ancestor::sect1[preceding-sibling::sect1]][1] |ancestor::section[$chunk.section.depth &gt; count(ancestor::section) and not(ancestor::*/processing-instruction('dbhtml')[normalize-space(.) ='stop-chunking']) and not(ancestor::section[not(preceding-sibling::section)])][1])[last()]"/>
+
+ <xsl:variable name="prev-v2" select="(preceding::sect1[$chunk.section.depth &gt; 0 and not(ancestor::*/processing-instruction('dbhtml')[normalize-space(.) ='stop-chunking']) and preceding-sibling::sect1][1] |preceding::sect2[$chunk.section.depth &gt; 1 and not(ancestor::*/processing-instruction('dbhtml')[normalize-space(.) ='stop-chunking']) and preceding-sibling::sect2 and parent::sect1[preceding-sibling::sect1]][1] |preceding::sect3[$chunk.section.depth &gt; 2 and not(ancestor::*/processing-instruction('dbhtml')[normalize-space(.) ='stop-chunking']) and preceding-sibling::sect3 and parent::sect2[preceding-sibling::sect2] and ancestor::sect1[preceding-sibling::sect1]][1] |preceding::sect4[$chunk.section.depth &gt; 3 and not(ancestor::*/processing-instruction('dbhtml')[normalize-space(.) ='stop-chunking']) and preceding-sibling::sect4 and parent::sect3[preceding-sibling::sect3] and ancestor::sect2[preceding-sibling::sect2] and ancestor::sect1[preceding-sibling::sect1]][1] |preceding::sect5[$chunk.section.depth &gt; 4 and not(ancestor::*/processing-instruction('dbhtml')[normalize-space(.) ='stop-chunking']) and preceding-sibling::sect5 and parent::sect4[preceding-sibling::sect4] and ancestor::sect3[preceding-sibling::sect3] and ancestor::sect2[preceding-sibling::sect2] and ancestor::sect1[preceding-sibling::sect1]][1] |preceding::section[$chunk.section.depth &gt; count(ancestor::section) and not(ancestor::*/processing-instruction('dbhtml')[normalize-space(.) ='stop-chunking']) and preceding-sibling::section and not(ancestor::section[not(preceding-sibling::section)])][1])[last()]"/>
+
+ <xsl:variable name="prev" select="(preceding::book[1] |preceding::preface[1] |preceding::chapter[1] |preceding::appendix[1] |preceding::part[1] |preceding::reference[1] |preceding::refentry[1] |preceding::colophon[1] |preceding::article[1] |preceding::bibliography[parent::article or parent::book or parent::part][1] |preceding::glossary[parent::article or parent::book or parent::part][1] |preceding::index[$generate.index != 0] [parent::article or parent::book or parent::part][1] |preceding::setindex[$generate.index != 0][1] |ancestor::set |ancestor::book[1] |ancestor::preface[1] |ancestor::chapter[1] |ancestor::appendix[1] |ancestor::part[1] |ancestor::reference[1] |ancestor::article[1] |$prev-v1 |$prev-v2)[last()]"/>
+
+ <xsl:variable name="next-v1" select="(following::sect1[$chunk.section.depth &gt; 0 and not(ancestor::*/processing-instruction('dbhtml')[normalize-space(.) ='stop-chunking']) and preceding-sibling::sect1][1] |following::sect2[$chunk.section.depth &gt; 1 and not(ancestor::*/processing-instruction('dbhtml')[normalize-space(.) ='stop-chunking']) and preceding-sibling::sect2 and parent::sect1[preceding-sibling::sect1]][1] |following::sect3[$chunk.section.depth &gt; 2 and not(ancestor::*/processing-instruction('dbhtml')[normalize-space(.) ='stop-chunking']) and preceding-sibling::sect3 and parent::sect2[preceding-sibling::sect2] and ancestor::sect1[preceding-sibling::sect1]][1] |following::sect4[$chunk.section.depth &gt; 3 and not(ancestor::*/processing-instruction('dbhtml')[normalize-space(.) ='stop-chunking']) and preceding-sibling::sect4 and parent::sect3[preceding-sibling::sect3] and ancestor::sect2[preceding-sibling::sect2] and ancestor::sect1[preceding-sibling::sect1]][1] |following::sect5[$chunk.section.depth &gt; 4 and not(ancestor::*/processing-instruction('dbhtml')[normalize-space(.) ='stop-chunking']) and preceding-sibling::sect5 and parent::sect4[preceding-sibling::sect4] and ancestor::sect3[preceding-sibling::sect3] and ancestor::sect2[preceding-sibling::sect2] and ancestor::sect1[preceding-sibling::sect1]][1] |following::section[$chunk.section.depth &gt; count(ancestor::section) and not(ancestor::*/processing-instruction('dbhtml')[normalize-space(.) ='stop-chunking']) and preceding-sibling::section and not(ancestor::section[not(preceding-sibling::section)])][1])[1]"/>
+
+ <xsl:variable name="next-v2" select="(descendant::sect1[$chunk.section.depth &gt; 0 and not(ancestor::*/processing-instruction('dbhtml')[normalize-space(.) ='stop-chunking']) and preceding-sibling::sect1][1] |descendant::sect2[$chunk.section.depth &gt; 1 and not(ancestor::*/processing-instruction('dbhtml')[normalize-space(.) ='stop-chunking']) and preceding-sibling::sect2 and parent::sect1[preceding-sibling::sect1]][1] |descendant::sect3[$chunk.section.depth &gt; 2 and not(ancestor::*/processing-instruction('dbhtml')[normalize-space(.) ='stop-chunking']) and preceding-sibling::sect3 and parent::sect2[preceding-sibling::sect2] and ancestor::sect1[preceding-sibling::sect1]][1] |descendant::sect4[$chunk.section.depth &gt; 3 and not(ancestor::*/processing-instruction('dbhtml')[normalize-space(.) ='stop-chunking']) and preceding-sibling::sect4 and parent::sect3[preceding-sibling::sect3] and ancestor::sect2[preceding-sibling::sect2] and ancestor::sect1[preceding-sibling::sect1]][1] |descendant::sect5[$chunk.section.depth &gt; 4 and not(ancestor::*/processing-instruction('dbhtml')[normalize-space(.) ='stop-chunking']) and preceding-sibling::sect5 and parent::sect4[preceding-sibling::sect4] and ancestor::sect3[preceding-sibling::sect3] and ancestor::sect2[preceding-sibling::sect2] and ancestor::sect1[preceding-sibling::sect1]][1] |descendant::section[$chunk.section.depth &gt; count(ancestor::section) and not(ancestor::*/processing-instruction('dbhtml')[normalize-space(.) ='stop-chunking']) and preceding-sibling::section and not(ancestor::section[not(preceding-sibling::section)])])[1]"/>
+
+ <xsl:variable name="next" select="(following::book[1] |following::preface[1] |following::chapter[1] |following::appendix[1] |following::part[1] |following::reference[1] |following::refentry[1] |following::colophon[1] |following::bibliography[parent::article or parent::book or parent::part][1] |following::glossary[parent::article or parent::book or parent::part][1] |following::index[$generate.index != 0] [parent::article or parent::book or parent::part][1] |following::article[1] |following::setindex[$generate.index != 0][1] |descendant::book[1] |descendant::preface[1] |descendant::chapter[1] |descendant::appendix[1] |descendant::article[1] |descendant::bibliography[parent::article or parent::book or parent::part][1] |descendant::glossary[parent::article or parent::book or parent::part][1] |descendant::index[$generate.index != 0] [parent::article or parent::book or parent::part][1] |descendant::colophon[1] |descendant::setindex[$generate.index != 0][1] |descendant::part[1] |descendant::reference[1] |descendant::refentry[1] |$next-v1 |$next-v2)[1]"/>
+
+ <xsl:call-template name="process-chunk">
+ <xsl:with-param name="prev" select="$prev"/>
+ <xsl:with-param name="next" select="$next"/>
+ <xsl:with-param name="content" select="$content"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template name="chunk-all-sections">
+ <xsl:param name="content">
+ <xsl:apply-imports/>
+ </xsl:param>
+
+ <xsl:variable name="prev-v1" select="(preceding::sect1[$chunk.section.depth &gt; 0 and not(ancestor::*/processing-instruction('dbhtml')[normalize-space(.) ='stop-chunking'])][1] |preceding::sect2[$chunk.section.depth &gt; 1 and not(ancestor::*/processing-instruction('dbhtml')[normalize-space(.) ='stop-chunking'])][1] |preceding::sect3[$chunk.section.depth &gt; 2 and not(ancestor::*/processing-instruction('dbhtml')[normalize-space(.) ='stop-chunking'])][1] |preceding::sect4[$chunk.section.depth &gt; 3 and not(ancestor::*/processing-instruction('dbhtml')[normalize-space(.) ='stop-chunking'])][1] |preceding::sect5[$chunk.section.depth &gt; 4 and not(ancestor::*/processing-instruction('dbhtml')[normalize-space(.) ='stop-chunking'])][1] |preceding::section[$chunk.section.depth &gt; count(ancestor::section) and not(ancestor::*/processing-instruction('dbhtml')[normalize-space(.) ='stop-chunking'])][1])[last()]"/>
+
+ <xsl:variable name="prev-v2" select="(ancestor::sect1[$chunk.section.depth &gt; 0 and not(ancestor::*/processing-instruction('dbhtml')[normalize-space(.) ='stop-chunking'])][1] |ancestor::sect2[$chunk.section.depth &gt; 1 and not(ancestor::*/processing-instruction('dbhtml')[normalize-space(.) ='stop-chunking'])][1] |ancestor::sect3[$chunk.section.depth &gt; 2 and not(ancestor::*/processing-instruction('dbhtml')[normalize-space(.) ='stop-chunking'])][1] |ancestor::sect4[$chunk.section.depth &gt; 3 and not(ancestor::*/processing-instruction('dbhtml')[normalize-space(.) ='stop-chunking'])][1] |ancestor::sect5[$chunk.section.depth &gt; 4 and not(ancestor::*/processing-instruction('dbhtml')[normalize-space(.) ='stop-chunking'])][1] |ancestor::section[$chunk.section.depth &gt; count(ancestor::section) and not(ancestor::*/processing-instruction('dbhtml')[normalize-space(.) ='stop-chunking'])][1])[last()]"/>
+
+ <xsl:variable name="prev" select="(preceding::book[1] |preceding::preface[1] |preceding::chapter[1] |preceding::appendix[1] |preceding::part[1] |preceding::reference[1] |preceding::refentry[1] |preceding::colophon[1] |preceding::article[1] |preceding::bibliography[parent::article or parent::book or parent::part][1] |preceding::glossary[parent::article or parent::book or parent::part][1] |preceding::index[$generate.index != 0] [parent::article or parent::book or parent::part][1] |preceding::setindex[$generate.index != 0][1] |ancestor::set |ancestor::book[1] |ancestor::preface[1] |ancestor::chapter[1] |ancestor::appendix[1] |ancestor::part[1] |ancestor::reference[1] |ancestor::article[1] |$prev-v1 |$prev-v2)[last()]"/>
+
+ <xsl:variable name="next-v1" select="(following::sect1[$chunk.section.depth &gt; 0 and not(ancestor::*/processing-instruction('dbhtml')[normalize-space(.) ='stop-chunking'])][1] |following::sect2[$chunk.section.depth &gt; 1 and not(ancestor::*/processing-instruction('dbhtml')[normalize-space(.) ='stop-chunking'])][1] |following::sect3[$chunk.section.depth &gt; 2 and not(ancestor::*/processing-instruction('dbhtml')[normalize-space(.) ='stop-chunking'])][1] |following::sect4[$chunk.section.depth &gt; 3 and not(ancestor::*/processing-instruction('dbhtml')[normalize-space(.) ='stop-chunking'])][1] |following::sect5[$chunk.section.depth &gt; 4 and not(ancestor::*/processing-instruction('dbhtml')[normalize-space(.) ='stop-chunking'])][1] |following::section[$chunk.section.depth &gt; count(ancestor::section) and not(ancestor::*/processing-instruction('dbhtml')[normalize-space(.) ='stop-chunking'])][1])[1]"/>
+
+ <xsl:variable name="next-v2" select="(descendant::sect1[$chunk.section.depth &gt; 0 and not(ancestor::*/processing-instruction('dbhtml')[normalize-space(.) ='stop-chunking'])][1] |descendant::sect2[$chunk.section.depth &gt; 1 and not(ancestor::*/processing-instruction('dbhtml')[normalize-space(.) ='stop-chunking'])][1] |descendant::sect3[$chunk.section.depth &gt; 2 and not(ancestor::*/processing-instruction('dbhtml')[normalize-space(.) ='stop-chunking'])][1] |descendant::sect4[$chunk.section.depth &gt; 3 and not(ancestor::*/processing-instruction('dbhtml')[normalize-space(.) ='stop-chunking'])][1] |descendant::sect5[$chunk.section.depth &gt; 4 and not(ancestor::*/processing-instruction('dbhtml')[normalize-space(.) ='stop-chunking'])][1] |descendant::section[$chunk.section.depth &gt; count(ancestor::section) and not(ancestor::*/processing-instruction('dbhtml')[normalize-space(.) ='stop-chunking'])][1])[1]"/>
+
+ <xsl:variable name="next" select="(following::book[1] |following::preface[1] |following::chapter[1] |following::appendix[1] |following::part[1] |following::reference[1] |following::refentry[1] |following::colophon[1] |following::bibliography[parent::article or parent::book or parent::part][1] |following::glossary[parent::article or parent::book or parent::part][1] |following::index[$generate.index != 0] [parent::article or parent::book][1] |following::article[1] |following::setindex[$generate.index != 0][1] |descendant::book[1] |descendant::preface[1] |descendant::chapter[1] |descendant::appendix[1] |descendant::article[1] |descendant::bibliography[parent::article or parent::book][1] |descendant::glossary[parent::article or parent::book or parent::part][1] |descendant::index[$generate.index != 0] [parent::article or parent::book][1] |descendant::colophon[1] |descendant::setindex[$generate.index != 0][1] |descendant::part[1] |descendant::reference[1] |descendant::refentry[1] |$next-v1 |$next-v2)[1]"/>
+
+ <xsl:call-template name="process-chunk">
+ <xsl:with-param name="prev" select="$prev"/>
+ <xsl:with-param name="next" select="$next"/>
+ <xsl:with-param name="content" select="$content"/>
+ </xsl:call-template>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<!-- ==================================================================== -->
+
+<xsl:template name="make.lots">
+ <xsl:param name="toc.params" select="''"/>
+ <xsl:param name="toc"/>
+
+ <xsl:variable name="lots">
+ <xsl:if test="contains($toc.params, 'toc')">
+ <xsl:copy-of select="$toc"/>
+ </xsl:if>
+
+ <xsl:if test="contains($toc.params, 'figure')">
+ <xsl:choose>
+ <xsl:when test="$chunk.separate.lots != '0'">
+ <xsl:call-template name="make.lot.chunk">
+ <xsl:with-param name="type" select="'figure'"/>
+ <xsl:with-param name="lot">
+ <xsl:call-template name="list.of.titles">
+ <xsl:with-param name="titles" select="'figure'"/>
+ <xsl:with-param name="nodes" select=".//figure"/>
+ </xsl:call-template>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="list.of.titles">
+ <xsl:with-param name="titles" select="'figure'"/>
+ <xsl:with-param name="nodes" select=".//figure"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:if>
+
+ <xsl:if test="contains($toc.params, 'table')">
+ <xsl:choose>
+ <xsl:when test="$chunk.separate.lots != '0'">
+ <xsl:call-template name="make.lot.chunk">
+ <xsl:with-param name="type" select="'table'"/>
+ <xsl:with-param name="lot">
+ <xsl:call-template name="list.of.titles">
+ <xsl:with-param name="titles" select="'table'"/>
+ <xsl:with-param name="nodes" select=".//table"/>
+ </xsl:call-template>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="list.of.titles">
+ <xsl:with-param name="titles" select="'table'"/>
+ <xsl:with-param name="nodes" select=".//table"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:if>
+
+ <xsl:if test="contains($toc.params, 'example')">
+ <xsl:choose>
+ <xsl:when test="$chunk.separate.lots != '0'">
+ <xsl:call-template name="make.lot.chunk">
+ <xsl:with-param name="type" select="'example'"/>
+ <xsl:with-param name="lot">
+ <xsl:call-template name="list.of.titles">
+ <xsl:with-param name="titles" select="'example'"/>
+ <xsl:with-param name="nodes" select=".//example"/>
+ </xsl:call-template>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="list.of.titles">
+ <xsl:with-param name="titles" select="'example'"/>
+ <xsl:with-param name="nodes" select=".//example"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:if>
+
+ <xsl:if test="contains($toc.params, 'equation')">
+ <xsl:choose>
+ <xsl:when test="$chunk.separate.lots != '0'">
+ <xsl:call-template name="make.lot.chunk">
+ <xsl:with-param name="type" select="'equation'"/>
+ <xsl:with-param name="lot">
+ <xsl:call-template name="list.of.titles">
+ <xsl:with-param name="titles" select="'equation'"/>
+ <xsl:with-param name="nodes" select=".//equation[title or info/title]"/>
+ </xsl:call-template>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="list.of.titles">
+ <xsl:with-param name="titles" select="'equation'"/>
+ <xsl:with-param name="nodes" select=".//equation[title or info/title]"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:if>
+
+ <xsl:if test="contains($toc.params, 'procedure')">
+ <xsl:choose>
+ <xsl:when test="$chunk.separate.lots != '0'">
+ <xsl:call-template name="make.lot.chunk">
+ <xsl:with-param name="type" select="'procedure'"/>
+ <xsl:with-param name="lot">
+ <xsl:call-template name="list.of.titles">
+ <xsl:with-param name="titles" select="'procedure'"/>
+ <xsl:with-param name="nodes" select=".//procedure[title]"/>
+ </xsl:call-template>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="list.of.titles">
+ <xsl:with-param name="titles" select="'procedure'"/>
+ <xsl:with-param name="nodes" select=".//procedure[title]"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:if>
+ </xsl:variable>
+
+ <xsl:if test="string($lots) != ''">
+ <xsl:choose>
+ <xsl:when test="$chunk.tocs.and.lots != 0 and not(parent::*)">
+ <xsl:call-template name="write.chunk">
+ <xsl:with-param name="filename">
+ <xsl:call-template name="make-relative-filename">
+ <xsl:with-param name="base.dir" select="$base.dir"/>
+ <xsl:with-param name="base.name">
+ <xsl:call-template name="dbhtml-dir"/>
+ <xsl:apply-templates select="." mode="recursive-chunk-filename">
+ <xsl:with-param name="recursive" select="true()"/>
+ </xsl:apply-templates>
+ <xsl:text>-toc</xsl:text>
+ <xsl:value-of select="$html.ext"/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:with-param>
+ <xsl:with-param name="content">
+ <xsl:call-template name="chunk-element-content">
+ <xsl:with-param name="prev" select="/foo"/>
+ <xsl:with-param name="next" select="/foo"/>
+ <xsl:with-param name="nav.context" select="'toc'"/>
+ <xsl:with-param name="content">
+ <xsl:if test="$chunk.tocs.and.lots.has.title != 0">
+ <h1>
+ <xsl:apply-templates select="." mode="object.title.markup"/>
+ </h1>
+ </xsl:if>
+ <xsl:copy-of select="$lots"/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:with-param>
+ <xsl:with-param name="quiet" select="$chunk.quietly"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:copy-of select="$lots"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template name="make.lot.chunk">
+ <xsl:param name="type" select="''"/>
+ <xsl:param name="lot"/>
+
+ <xsl:if test="string($lot) != ''">
+ <xsl:variable name="filename">
+ <xsl:call-template name="make-relative-filename">
+ <xsl:with-param name="base.dir" select="$base.dir"/>
+ <xsl:with-param name="base.name">
+ <xsl:call-template name="dbhtml-dir"/>
+ <xsl:value-of select="$type"/>
+ <xsl:text>-toc</xsl:text>
+ <xsl:value-of select="$html.ext"/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="href">
+ <xsl:call-template name="make-relative-filename">
+ <xsl:with-param name="base.name">
+ <xsl:call-template name="dbhtml-dir"/>
+ <xsl:value-of select="$type"/>
+ <xsl:text>-toc</xsl:text>
+ <xsl:value-of select="$html.ext"/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:call-template name="write.chunk">
+ <xsl:with-param name="filename" select="$filename"/>
+ <xsl:with-param name="content">
+ <xsl:call-template name="chunk-element-content">
+ <xsl:with-param name="prev" select="/foo"/>
+ <xsl:with-param name="next" select="/foo"/>
+ <xsl:with-param name="nav.context" select="'toc'"/>
+ <xsl:with-param name="content">
+ <xsl:copy-of select="$lot"/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:with-param>
+ <xsl:with-param name="quiet" select="$chunk.quietly"/>
+ </xsl:call-template>
+ <!-- And output a link to this file -->
+ <div>
+ <xsl:attribute name="class">
+ <xsl:text>ListofTitles</xsl:text>
+ </xsl:attribute>
+ <a href="{$href}">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key">
+ <xsl:choose>
+ <xsl:when test="$type='table'">ListofTables</xsl:when>
+ <xsl:when test="$type='figure'">ListofFigures</xsl:when>
+ <xsl:when test="$type='equation'">ListofEquations</xsl:when>
+ <xsl:when test="$type='example'">ListofExamples</xsl:when>
+ <xsl:when test="$type='procedure'">ListofProcedures</xsl:when>
+ <xsl:otherwise>ListofUnknown</xsl:otherwise>
+ </xsl:choose>
+ </xsl:with-param>
+ </xsl:call-template>
+ </a>
+ </div>
+ </xsl:if>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template name="in.other.chunk">
+ <xsl:param name="chunk" select="."/>
+ <xsl:param name="node" select="."/>
+
+ <xsl:variable name="is.chunk">
+ <xsl:call-template name="chunk">
+ <xsl:with-param name="node" select="$node"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+<!--
+ <xsl:message>
+ <xsl:text>in.other.chunk: </xsl:text>
+ <xsl:value-of select="name($chunk)"/>
+ <xsl:text> </xsl:text>
+ <xsl:value-of select="name($node)"/>
+ <xsl:text> </xsl:text>
+ <xsl:value-of select="$chunk = $node"/>
+ <xsl:text> </xsl:text>
+ <xsl:value-of select="$is.chunk"/>
+ </xsl:message>
+-->
+
+ <xsl:choose>
+ <xsl:when test="$chunk = $node">0</xsl:when>
+ <xsl:when test="$is.chunk = 1">1</xsl:when>
+ <xsl:when test="count($node) = 0">0</xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="in.other.chunk">
+ <xsl:with-param name="chunk" select="$chunk"/>
+ <xsl:with-param name="node" select="$node/parent::*"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="count.footnotes.in.this.chunk">
+ <xsl:param name="node" select="."/>
+ <xsl:param name="footnotes" select="$node//footnote"/>
+ <xsl:param name="count" select="0"/>
+
+<!--
+ <xsl:message>
+ <xsl:text>count.footnotes.in.this.chunk: </xsl:text>
+ <xsl:value-of select="name($node)"/>
+ </xsl:message>
+-->
+
+ <xsl:variable name="in.other.chunk">
+ <xsl:call-template name="in.other.chunk">
+ <xsl:with-param name="chunk" select="$node"/>
+ <xsl:with-param name="node" select="$footnotes[1]"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="count($footnotes) = 0">
+ <xsl:value-of select="$count"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:choose>
+ <xsl:when test="$in.other.chunk != 0">
+ <xsl:call-template name="count.footnotes.in.this.chunk">
+ <xsl:with-param name="node" select="$node"/>
+ <xsl:with-param name="footnotes" select="$footnotes[position() &gt; 1]"/>
+ <xsl:with-param name="count" select="$count"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="$footnotes[1]/ancestor::table |$footnotes[1]/ancestor::informaltable">
+ <xsl:call-template name="count.footnotes.in.this.chunk">
+ <xsl:with-param name="node" select="$node"/>
+ <xsl:with-param name="footnotes" select="$footnotes[position() &gt; 1]"/>
+ <xsl:with-param name="count" select="$count"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="count.footnotes.in.this.chunk">
+ <xsl:with-param name="node" select="$node"/>
+ <xsl:with-param name="footnotes" select="$footnotes[position() &gt; 1]"/>
+ <xsl:with-param name="count" select="$count + 1"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="process.footnotes.in.this.chunk">
+ <xsl:param name="node" select="."/>
+ <xsl:param name="footnotes" select="$node//footnote"/>
+
+<!--
+ <xsl:message>process.footnotes.in.this.chunk</xsl:message>
+-->
+
+ <xsl:variable name="in.other.chunk">
+ <xsl:call-template name="in.other.chunk">
+ <xsl:with-param name="chunk" select="$node"/>
+ <xsl:with-param name="node" select="$footnotes[1]"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="count($footnotes) = 0">
+ <!-- nop -->
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:choose>
+ <xsl:when test="$in.other.chunk != 0">
+ <xsl:call-template name="process.footnotes.in.this.chunk">
+ <xsl:with-param name="node" select="$node"/>
+ <xsl:with-param name="footnotes" select="$footnotes[position() &gt; 1]"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="$footnotes[1]/ancestor::table |$footnotes[1]/ancestor::informaltable">
+ <xsl:call-template name="process.footnotes.in.this.chunk">
+ <xsl:with-param name="node" select="$node"/>
+ <xsl:with-param name="footnotes" select="$footnotes[position() &gt; 1]"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="$footnotes[1]" mode="process.footnote.mode"/>
+ <xsl:call-template name="process.footnotes.in.this.chunk">
+ <xsl:with-param name="node" select="$node"/>
+ <xsl:with-param name="footnotes" select="$footnotes[position() &gt; 1]"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="process.footnotes">
+ <xsl:variable name="footnotes" select=".//footnote"/>
+ <xsl:variable name="fcount">
+ <xsl:call-template name="count.footnotes.in.this.chunk">
+ <xsl:with-param name="node" select="."/>
+ <xsl:with-param name="footnotes" select="$footnotes"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+<!--
+ <xsl:message>
+ <xsl:value-of select="name(.)"/>
+ <xsl:text> fcount: </xsl:text>
+ <xsl:value-of select="$fcount"/>
+ </xsl:message>
+-->
+
+ <!-- Only bother to do this if there's at least one non-table footnote -->
+ <xsl:if test="$fcount &gt; 0">
+ <div class="footnotes">
+ <br/>
+ <hr/>
+ <xsl:call-template name="process.footnotes.in.this.chunk">
+ <xsl:with-param name="node" select="."/>
+ <xsl:with-param name="footnotes" select="$footnotes"/>
+ </xsl:call-template>
+ </div>
+ </xsl:if>
+
+ <!-- FIXME: When chunking, only the annotations actually used
+ in this chunk should be referenced. I don't think it
+ does any harm to reference them all, but it adds
+ unnecessary bloat to each chunk. -->
+ <xsl:if test="$annotation.support != 0 and //annotation">
+ <div class="annotation-list">
+ <div class="annotation-nocss">
+ <p>The following annotations are from this essay. You are seeing
+ them here because your browser doesn&#8217;t support the user-interface
+ techniques used to make them appear as &#8216;popups&#8217; on modern browsers.</p>
+ </div>
+
+ <xsl:apply-templates select="//annotation" mode="annotation-popup"/>
+ </div>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template name="process.chunk.footnotes">
+ <xsl:variable name="is.chunk">
+ <xsl:call-template name="chunk"/>
+ </xsl:variable>
+ <xsl:if test="$is.chunk = 1">
+ <xsl:call-template name="process.footnotes"/>
+ </xsl:if>
+</xsl:template>
+
+<!-- ====================================================================== -->
+
+<xsl:template name="chunk">
+ <xsl:param name="node" select="."/>
+ <!-- returns 1 if $node is a chunk -->
+
+ <!-- ==================================================================== -->
+ <!-- What's a chunk?
+
+ The root element
+ appendix
+ article
+ bibliography in article or part or book
+ book
+ chapter
+ colophon
+ glossary in article or part or book
+ index in article or part or book
+ part
+ preface
+ refentry
+ reference
+ sect{1,2,3,4,5} if position()>1 && depth < chunk.section.depth
+ section if position()>1 && depth < chunk.section.depth
+ set
+ setindex
+ -->
+ <!-- ==================================================================== -->
+
+<!--
+ <xsl:message>
+ <xsl:text>chunk: </xsl:text>
+ <xsl:value-of select="name($node)"/>
+ <xsl:text>(</xsl:text>
+ <xsl:value-of select="$node/@id"/>
+ <xsl:text>)</xsl:text>
+ <xsl:text> csd: </xsl:text>
+ <xsl:value-of select="$chunk.section.depth"/>
+ <xsl:text> cfs: </xsl:text>
+ <xsl:value-of select="$chunk.first.sections"/>
+ <xsl:text> ps: </xsl:text>
+ <xsl:value-of select="count($node/parent::section)"/>
+ <xsl:text> prs: </xsl:text>
+ <xsl:value-of select="count($node/preceding-sibling::section)"/>
+ </xsl:message>
+-->
+
+ <xsl:choose>
+ <xsl:when test="$node/parent::*/processing-instruction('dbhtml')[normalize-space(.) = 'stop-chunking']">0</xsl:when>
+ <xsl:when test="not($node/parent::*)">1</xsl:when>
+
+ <xsl:when test="local-name($node) = 'sect1' and $chunk.section.depth &gt;= 1 and ($chunk.first.sections != 0 or count($node/preceding-sibling::sect1) &gt; 0)">
+ <xsl:text>1</xsl:text>
+ </xsl:when>
+ <xsl:when test="local-name($node) = 'sect2' and $chunk.section.depth &gt;= 2 and ($chunk.first.sections != 0 or count($node/preceding-sibling::sect2) &gt; 0)">
+ <xsl:call-template name="chunk">
+ <xsl:with-param name="node" select="$node/parent::*"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="local-name($node) = 'sect3' and $chunk.section.depth &gt;= 3 and ($chunk.first.sections != 0 or count($node/preceding-sibling::sect3) &gt; 0)">
+ <xsl:call-template name="chunk">
+ <xsl:with-param name="node" select="$node/parent::*"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="local-name($node) = 'sect4' and $chunk.section.depth &gt;= 4 and ($chunk.first.sections != 0 or count($node/preceding-sibling::sect4) &gt; 0)">
+ <xsl:call-template name="chunk">
+ <xsl:with-param name="node" select="$node/parent::*"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="local-name($node) = 'sect5' and $chunk.section.depth &gt;= 5 and ($chunk.first.sections != 0 or count($node/preceding-sibling::sect5) &gt; 0)">
+ <xsl:call-template name="chunk">
+ <xsl:with-param name="node" select="$node/parent::*"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="local-name($node) = 'section' and $chunk.section.depth &gt;= count($node/ancestor::section)+1 and ($chunk.first.sections != 0 or count($node/preceding-sibling::section) &gt; 0)">
+ <xsl:call-template name="chunk">
+ <xsl:with-param name="node" select="$node/parent::*"/>
+ </xsl:call-template>
+ </xsl:when>
+
+ <xsl:when test="local-name($node)='preface'">1</xsl:when>
+ <xsl:when test="local-name($node)='chapter'">1</xsl:when>
+ <xsl:when test="local-name($node)='appendix'">1</xsl:when>
+ <xsl:when test="local-name($node)='article'">1</xsl:when>
+ <xsl:when test="local-name($node)='part'">1</xsl:when>
+ <xsl:when test="local-name($node)='reference'">1</xsl:when>
+ <xsl:when test="local-name($node)='refentry'">1</xsl:when>
+ <xsl:when test="local-name($node)='index' and ($generate.index != 0 or count($node/*) &gt; 0) and (local-name($node/parent::*) = 'article' or local-name($node/parent::*) = 'book' or local-name($node/parent::*) = 'part' )">1</xsl:when>
+ <xsl:when test="local-name($node)='bibliography' and (local-name($node/parent::*) = 'article' or local-name($node/parent::*) = 'book' or local-name($node/parent::*) = 'part' )">1</xsl:when>
+ <xsl:when test="local-name($node)='glossary' and (local-name($node/parent::*) = 'article' or local-name($node/parent::*) = 'book' or local-name($node/parent::*) = 'part' )">1</xsl:when>
+ <xsl:when test="local-name($node)='colophon'">1</xsl:when>
+ <xsl:when test="local-name($node)='book'">1</xsl:when>
+ <xsl:when test="local-name($node)='set'">1</xsl:when>
+ <xsl:when test="local-name($node)='setindex'">1</xsl:when>
+ <xsl:when test="local-name($node)='legalnotice' and $generate.legalnotice.link != 0">1</xsl:when>
+ <xsl:otherwise>0</xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ==================================================================== -->
+<xsl:template name="href.target.uri">
+ <xsl:param name="object" select="."/>
+ <xsl:variable name="ischunk">
+ <xsl:call-template name="chunk">
+ <xsl:with-param name="node" select="$object"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:apply-templates mode="chunk-filename" select="$object"/>
+
+ <xsl:if test="$ischunk='0'">
+ <xsl:text>#</xsl:text>
+ <xsl:call-template name="object.id">
+ <xsl:with-param name="object" select="$object"/>
+ </xsl:call-template>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template name="href.target">
+ <xsl:param name="context" select="."/>
+ <xsl:param name="object" select="."/>
+ <xsl:param name="toc-context" select="."/>
+ <!-- * If $toc-context contains some node other than the current node, -->
+ <!-- * it means we're processing a link in a TOC. In that case, to -->
+ <!-- * ensure the link will work correctly, we need to take a look at -->
+ <!-- * where the file containing the TOC will get written, and where -->
+ <!-- * the file that's being linked to will get written. -->
+ <xsl:variable name="toc-output-dir">
+ <xsl:if test="not($toc-context = .)">
+ <!-- * Get the $toc-context node and all its ancestors, look down -->
+ <!-- * through them to find the last/closest node to the -->
+ <!-- * toc-context node that has a "dbhtml dir" PI, and get the -->
+ <!-- * directory name from that. That's the name of the directory -->
+ <!-- * to which the current toc output file will get written. -->
+ <xsl:call-template name="dbhtml-dir">
+ <xsl:with-param name="context" select="$toc-context/ancestor-or-self::*[processing-instruction('dbhtml')[contains(.,'dir')]][last()]"/>
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:variable>
+ <xsl:variable name="linked-file-output-dir">
+ <xsl:if test="not($toc-context = .)">
+ <!-- * Get the current node and all its ancestors, look down -->
+ <!-- * through them to find the last/closest node to the current -->
+ <!-- * node that has a "dbhtml dir" PI, and get the directory name -->
+ <!-- * from that. That's the name of the directory to which the -->
+ <!-- * file that's being linked to will get written. -->
+ <xsl:call-template name="dbhtml-dir">
+ <xsl:with-param name="context" select="ancestor-or-self::*[processing-instruction('dbhtml')[contains(.,'dir')]][last()]"/>
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:variable>
+ <xsl:variable name="href.to.uri">
+ <xsl:call-template name="href.target.uri">
+ <xsl:with-param name="object" select="$object"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:variable name="href.from.uri">
+ <xsl:choose>
+ <xsl:when test="not($toc-context = .)">
+ <xsl:call-template name="href.target.uri">
+ <xsl:with-param name="object" select="$toc-context"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="href.target.uri">
+ <xsl:with-param name="object" select="$context"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <!-- * <xsl:message>toc-context: <xsl:value-of select="local-name($toc-context)"/></xsl:message> -->
+ <!-- * <xsl:message>node: <xsl:value-of select="local-name(.)"/></xsl:message> -->
+ <!-- * <xsl:message>context: <xsl:value-of select="local-name($context)"/></xsl:message> -->
+ <!-- * <xsl:message>object: <xsl:value-of select="local-name($object)"/></xsl:message> -->
+ <!-- * <xsl:message>toc-output-dir: <xsl:value-of select="$toc-output-dir"/></xsl:message> -->
+ <!-- * <xsl:message>linked-file-output-dir: <xsl:value-of select="$linked-file-output-dir"/></xsl:message> -->
+ <!-- * <xsl:message>href.to.uri: <xsl:value-of select="$href.to.uri"/></xsl:message> -->
+ <!-- * <xsl:message>href.from.uri: <xsl:value-of select="$href.from.uri"/></xsl:message> -->
+ <xsl:variable name="href.to">
+ <xsl:choose>
+ <!-- * 2007-07-19, MikeSmith: Added the following conditional to -->
+ <!-- * deal with a problem case for links in TOCs. It checks to see -->
+ <!-- * if the output dir that a TOC will get written to is -->
+ <!-- * different from the output dir of the file being linked to. -->
+ <!-- * If it is different, we do not call trim.common.uri.paths. -->
+ <!-- * -->
+ <!-- * Reason why I added that conditional is: I ran into a bug for -->
+ <!-- * this case: -->
+ <!-- * -->
+ <!-- * 1. we are chunking into separate dirs -->
+ <!-- * -->
+ <!-- * 2. output for the TOC is written to current dir, but the file -->
+ <!-- * being linked to is written to some subdir "foo". -->
+ <!-- * -->
+ <!-- * For that case, links to that file in that TOC did not show -->
+ <!-- * the correct path - they omitted the "foo". -->
+ <!-- * -->
+ <!-- * The cause of that problem was that the trim.common.uri.paths -->
+ <!-- * template[1] was being called under all conditions. But it's -->
+ <!-- * apparent that we don't want to call trim.common.uri.paths in -->
+ <!-- * the case where a linked file is being written to a different -->
+ <!-- * directory than the TOC that contains the link, because doing -->
+ <!-- * so will cause a necessary (not redundant) directory-name -->
+ <!-- * part of the link to get inadvertently trimmed, resulting in -->
+ <!-- * a broken link to that file. Thus, added the conditional. -->
+ <!-- * -->
+ <!-- * [1] The purpose of the trim.common.uri.paths template is to -->
+ <!-- * prevent cases where, if we didn't call it, we end up with -->
+ <!-- * unnecessary, redundant directory names getting output; for -->
+ <!-- * example, "foo/foo/refname.html". -->
+ <xsl:when test="not($toc-output-dir = $linked-file-output-dir)">
+ <xsl:value-of select="$href.to.uri"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="trim.common.uri.paths">
+ <xsl:with-param name="uriA" select="$href.to.uri"/>
+ <xsl:with-param name="uriB" select="$href.from.uri"/>
+ <xsl:with-param name="return" select="'A'"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:variable name="href.from">
+ <xsl:call-template name="trim.common.uri.paths">
+ <xsl:with-param name="uriA" select="$href.to.uri"/>
+ <xsl:with-param name="uriB" select="$href.from.uri"/>
+ <xsl:with-param name="return" select="'B'"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:variable name="depth">
+ <xsl:call-template name="count.uri.path.depth">
+ <xsl:with-param name="filename" select="$href.from"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:variable name="href">
+ <xsl:call-template name="copy-string">
+ <xsl:with-param name="string" select="'../'"/>
+ <xsl:with-param name="count" select="$depth"/>
+ </xsl:call-template>
+ <xsl:value-of select="$href.to"/>
+ </xsl:variable>
+ <!--
+ <xsl:message>
+ <xsl:text>In </xsl:text>
+ <xsl:value-of select="name(.)"/>
+ <xsl:text> (</xsl:text>
+ <xsl:value-of select="$href.from"/>
+ <xsl:text>,</xsl:text>
+ <xsl:value-of select="$depth"/>
+ <xsl:text>) </xsl:text>
+ <xsl:value-of select="name($object)"/>
+ <xsl:text> href=</xsl:text>
+ <xsl:value-of select="$href"/>
+ </xsl:message>
+ -->
+ <xsl:value-of select="$href"/>
+</xsl:template>
+
+<!-- Returns the complete olink href value if found -->
+<!-- Must take into account any dbhtml dir of the chunk containing the olink -->
+<xsl:template name="make.olink.href">
+ <xsl:param name="olink.key" select="''"/>
+ <xsl:param name="target.database"/>
+
+ <xsl:if test="$olink.key != ''">
+ <xsl:variable name="target.href">
+ <xsl:for-each select="$target.database">
+ <xsl:value-of select="key('targetptr-key', $olink.key)[1]/@href"/>
+ </xsl:for-each>
+ </xsl:variable>
+
+ <!-- an olink starting point may be in a subdirectory, so need
+ the "from" reference point to compute a relative path -->
+
+ <xsl:variable name="from.href">
+ <xsl:call-template name="olink.from.uri">
+ <xsl:with-param name="target.database" select="$target.database"/>
+ <xsl:with-param name="object" select="."/>
+ <xsl:with-param name="object.targetdoc" select="$current.docid"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <!-- If the from.href has directory path, then must "../" upward
+ to document level -->
+ <xsl:variable name="upward.from.path">
+ <xsl:call-template name="upward.path">
+ <xsl:with-param name="path" select="$from.href"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="targetdoc">
+ <xsl:value-of select="substring-before($olink.key, '/')"/>
+ </xsl:variable>
+
+ <!-- Does the target database use a sitemap? -->
+ <xsl:variable name="use.sitemap">
+ <xsl:choose>
+ <xsl:when test="$target.database//sitemap">1</xsl:when>
+ <xsl:otherwise>0</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+
+ <!-- Get the baseuri for this targetptr -->
+ <xsl:variable name="baseuri">
+ <xsl:choose>
+ <!-- Does the database use a sitemap? -->
+ <xsl:when test="$use.sitemap != 0">
+ <xsl:choose>
+ <!-- Was current.docid parameter set? -->
+ <xsl:when test="$current.docid != ''">
+ <!-- Was it found in the database? -->
+ <xsl:variable name="currentdoc.key">
+ <xsl:for-each select="$target.database">
+ <xsl:value-of select="key('targetdoc-key', $current.docid)/@targetdoc"/>
+ </xsl:for-each>
+ </xsl:variable>
+ <xsl:choose>
+ <xsl:when test="$currentdoc.key != ''">
+ <xsl:for-each select="$target.database">
+ <xsl:call-template name="targetpath">
+ <xsl:with-param name="dirnode" select="key('targetdoc-key', $current.docid)/parent::dir"/>
+ <xsl:with-param name="targetdoc" select="$targetdoc"/>
+ </xsl:call-template>
+ </xsl:for-each>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:message>
+ <xsl:text>Olink error: cannot compute relative </xsl:text>
+ <xsl:text>sitemap path because $current.docid '</xsl:text>
+ <xsl:value-of select="$current.docid"/>
+ <xsl:text>' not found in target database.</xsl:text>
+ </xsl:message>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:message>
+ <xsl:text>Olink warning: cannot compute relative </xsl:text>
+ <xsl:text>sitemap path without $current.docid parameter</xsl:text>
+ </xsl:message>
+ </xsl:otherwise>
+ </xsl:choose>
+ <!-- In either case, add baseuri from its document entry-->
+ <xsl:variable name="docbaseuri">
+ <xsl:for-each select="$target.database">
+ <xsl:value-of select="key('targetdoc-key', $targetdoc)/@baseuri"/>
+ </xsl:for-each>
+ </xsl:variable>
+ <xsl:if test="$docbaseuri != ''">
+ <xsl:value-of select="$docbaseuri"/>
+ </xsl:if>
+ </xsl:when>
+ <!-- No database sitemap in use -->
+ <xsl:otherwise>
+ <!-- Just use any baseuri from its document entry -->
+ <xsl:variable name="docbaseuri">
+ <xsl:for-each select="$target.database">
+ <xsl:value-of select="key('targetdoc-key', $targetdoc)/@baseuri"/>
+ </xsl:for-each>
+ </xsl:variable>
+ <xsl:if test="$docbaseuri != ''">
+ <xsl:value-of select="$docbaseuri"/>
+ </xsl:if>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <!-- Form the href information -->
+ <xsl:if test="not(contains($baseuri, ':'))">
+ <!-- if not an absolute uri, add upward path from olink chunk -->
+ <xsl:value-of select="$upward.from.path"/>
+ </xsl:if>
+
+ <xsl:if test="$baseuri != ''">
+ <xsl:value-of select="$baseuri"/>
+ <xsl:if test="substring($target.href,1,1) != '#'">
+ <!--xsl:text>/</xsl:text-->
+ </xsl:if>
+ </xsl:if>
+ <!-- optionally turn off frag for PDF references -->
+ <xsl:if test="not($insert.olink.pdf.frag = 0 and translate(substring($baseuri, string-length($baseuri) - 3), 'PDF', 'pdf') = '.pdf' and starts-with($target.href, '#') )">
+ <xsl:value-of select="$target.href"/>
+ </xsl:if>
+ </xsl:if>
+</xsl:template>
+
+<!-- Computes "../" to reach top -->
+<xsl:template name="upward.path">
+ <xsl:param name="path" select="''"/>
+ <xsl:choose>
+ <!-- Don't bother with absolute uris -->
+ <xsl:when test="contains($path, ':')"/>
+ <xsl:when test="starts-with($path, '/')"/>
+ <xsl:when test="contains($path, '/')">
+ <xsl:text>../</xsl:text>
+ <xsl:call-template name="upward.path">
+ <xsl:with-param name="path" select="substring-after($path, '/')"/>
+ </xsl:call-template>
+ </xsl:when>
+ </xsl:choose>
+
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template name="html.head">
+ <xsl:param name="prev" select="/foo"/>
+ <xsl:param name="next" select="/foo"/>
+ <xsl:variable name="this" select="."/>
+ <xsl:variable name="home" select="/*[1]"/>
+ <xsl:variable name="up" select="parent::*"/>
+
+ <head>
+ <xsl:call-template name="system.head.content"/>
+ <xsl:call-template name="head.content"/>
+
+ <xsl:if test="$home">
+ <link rel="home">
+ <xsl:attribute name="href">
+ <xsl:call-template name="href.target">
+ <xsl:with-param name="object" select="$home"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:attribute name="title">
+ <xsl:apply-templates select="$home" mode="object.title.markup.textonly"/>
+ </xsl:attribute>
+ </link>
+ </xsl:if>
+
+ <xsl:if test="$up">
+ <link rel="up">
+ <xsl:attribute name="href">
+ <xsl:call-template name="href.target">
+ <xsl:with-param name="object" select="$up"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:attribute name="title">
+ <xsl:apply-templates select="$up" mode="object.title.markup.textonly"/>
+ </xsl:attribute>
+ </link>
+ </xsl:if>
+
+ <xsl:if test="$prev">
+ <link rel="prev">
+ <xsl:attribute name="href">
+ <xsl:call-template name="href.target">
+ <xsl:with-param name="object" select="$prev"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:attribute name="title">
+ <xsl:apply-templates select="$prev" mode="object.title.markup.textonly"/>
+ </xsl:attribute>
+ </link>
+ </xsl:if>
+
+ <xsl:if test="$next">
+ <link rel="next">
+ <xsl:attribute name="href">
+ <xsl:call-template name="href.target">
+ <xsl:with-param name="object" select="$next"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:attribute name="title">
+ <xsl:apply-templates select="$next" mode="object.title.markup.textonly"/>
+ </xsl:attribute>
+ </link>
+ </xsl:if>
+
+ <xsl:if test="$html.extra.head.links != 0">
+ <xsl:for-each select="//part |//reference |//preface |//chapter |//article |//refentry |//appendix[not(parent::article)]|appendix |//glossary[not(parent::article)]|glossary |//index[not(parent::article)]|index">
+ <link rel="{local-name(.)}">
+ <xsl:attribute name="href">
+ <xsl:call-template name="href.target">
+ <xsl:with-param name="context" select="$this"/>
+ <xsl:with-param name="object" select="."/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:attribute name="title">
+ <xsl:apply-templates select="." mode="object.title.markup.textonly"/>
+ </xsl:attribute>
+ </link>
+ </xsl:for-each>
+
+ <xsl:for-each select="section|sect1|refsection|refsect1">
+ <link>
+ <xsl:attribute name="rel">
+ <xsl:choose>
+ <xsl:when test="local-name($this) = 'section' or local-name($this) = 'refsection'">
+ <xsl:value-of select="'subsection'"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="'section'"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:attribute>
+ <xsl:attribute name="href">
+ <xsl:call-template name="href.target">
+ <xsl:with-param name="context" select="$this"/>
+ <xsl:with-param name="object" select="."/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:attribute name="title">
+ <xsl:apply-templates select="." mode="object.title.markup.textonly"/>
+ </xsl:attribute>
+ </link>
+ </xsl:for-each>
+
+ <xsl:for-each select="sect2|sect3|sect4|sect5|refsect2|refsect3">
+ <link rel="subsection">
+ <xsl:attribute name="href">
+ <xsl:call-template name="href.target">
+ <xsl:with-param name="context" select="$this"/>
+ <xsl:with-param name="object" select="."/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:attribute name="title">
+ <xsl:apply-templates select="." mode="object.title.markup.textonly"/>
+ </xsl:attribute>
+ </link>
+ </xsl:for-each>
+ </xsl:if>
+
+ <!-- * if we have a legalnotice and user wants it output as a -->
+ <!-- * separate page and $html.head.legalnotice.link.types is -->
+ <!-- * non-empty, we generate a link or links for each value in -->
+ <!-- * $html.head.legalnotice.link.types -->
+ <xsl:if test="//legalnotice and not($generate.legalnotice.link = 0) and not($html.head.legalnotice.link.types = '')">
+ <xsl:call-template name="make.legalnotice.head.links"/>
+ </xsl:if>
+
+ <xsl:call-template name="user.head.content"/>
+ </head>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template name="header.navigation">
+ <xsl:param name="prev" select="/foo"/>
+ <xsl:param name="next" select="/foo"/>
+ <xsl:param name="nav.context"/>
+
+ <xsl:variable name="home" select="/*[1]"/>
+ <xsl:variable name="up" select="parent::*"/>
+
+ <xsl:variable name="row1" select="$navig.showtitles != 0"/>
+ <xsl:variable name="row2" select="count($prev) &gt; 0 or (count($up) &gt; 0 and generate-id($up) != generate-id($home) and $navig.showtitles != 0) or count($next) &gt; 0"/>
+
+ <xsl:if test="$suppress.navigation = '0' and $suppress.header.navigation = '0'">
+ <div class="navheader">
+ <xsl:if test="$row1 or $row2">
+ <table width="100%" summary="Navigation header">
+ <xsl:if test="$row1">
+ <tr>
+ <th colspan="3" align="center">
+ <xsl:apply-templates select="." mode="object.title.markup"/>
+ </th>
+ </tr>
+ </xsl:if>
+
+ <xsl:if test="$row2">
+ <tr>
+ <td align="{$direction.align.start}">
+ <xsl:if test="count($prev)&gt;0">
+ <a accesskey="p">
+ <xsl:attribute name="href">
+ <xsl:call-template name="href.target">
+ <xsl:with-param name="object" select="$prev"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:call-template name="navig.content">
+ <xsl:with-param name="direction" select="'prev'"/>
+ </xsl:call-template>
+ </a>
+ </xsl:if>
+ <xsl:text>&#160;</xsl:text>
+ </td>
+ <th width="60%" align="center">
+ <xsl:choose>
+ <xsl:when test="count($up) &gt; 0 and generate-id($up) != generate-id($home) and $navig.showtitles != 0">
+ <xsl:apply-templates select="$up" mode="object.title.markup"/>
+ </xsl:when>
+ <xsl:otherwise>&#160;</xsl:otherwise>
+ </xsl:choose>
+ </th>
+ <td align="{$direction.align.end}">
+ <xsl:text>&#160;</xsl:text>
+ <xsl:if test="count($next)&gt;0">
+ <a accesskey="n">
+ <xsl:attribute name="href">
+ <xsl:call-template name="href.target">
+ <xsl:with-param name="object" select="$next"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:call-template name="navig.content">
+ <xsl:with-param name="direction" select="'next'"/>
+ </xsl:call-template>
+ </a>
+ </xsl:if>
+ </td>
+ </tr>
+ </xsl:if>
+ </table>
+ </xsl:if>
+ <xsl:if test="$header.rule != 0">
+ <hr/>
+ </xsl:if>
+ </div>
+ </xsl:if>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template name="footer.navigation">
+ <xsl:param name="prev" select="/foo"/>
+ <xsl:param name="next" select="/foo"/>
+ <xsl:param name="nav.context"/>
+
+ <xsl:variable name="home" select="/*[1]"/>
+ <xsl:variable name="up" select="parent::*"/>
+
+ <xsl:variable name="row1" select="count($prev) &gt; 0 or count($up) &gt; 0 or count($next) &gt; 0"/>
+
+ <xsl:variable name="row2" select="($prev and $navig.showtitles != 0) or (generate-id($home) != generate-id(.) or $nav.context = 'toc') or ($chunk.tocs.and.lots != 0 and $nav.context != 'toc') or ($next and $navig.showtitles != 0)"/>
+
+ <xsl:if test="$suppress.navigation = '0' and $suppress.footer.navigation = '0'">
+ <div class="navfooter">
+ <xsl:if test="$footer.rule != 0">
+ <hr/>
+ </xsl:if>
+
+ <xsl:if test="$row1 or $row2">
+ <table width="100%" summary="Navigation footer">
+ <xsl:if test="$row1">
+ <tr>
+ <td align="{$direction.align.start}">
+ <xsl:if test="count($prev)&gt;0">
+ <a accesskey="p">
+ <xsl:attribute name="href">
+ <xsl:call-template name="href.target">
+ <xsl:with-param name="object" select="$prev"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:call-template name="navig.content">
+ <xsl:with-param name="direction" select="'prev'"/>
+ </xsl:call-template>
+ </a>
+ </xsl:if>
+ <xsl:text>&#160;</xsl:text>
+ </td>
+ <td align="center">
+ <xsl:choose>
+ <xsl:when test="count($up)&gt;0 and generate-id($up) != generate-id($home)">
+ <a accesskey="u">
+ <xsl:attribute name="href">
+ <xsl:call-template name="href.target">
+ <xsl:with-param name="object" select="$up"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:call-template name="navig.content">
+ <xsl:with-param name="direction" select="'up'"/>
+ </xsl:call-template>
+ </a>
+ </xsl:when>
+ <xsl:otherwise>&#160;</xsl:otherwise>
+ </xsl:choose>
+ </td>
+ <td align="{$direction.align.end}">
+ <xsl:text>&#160;</xsl:text>
+ <xsl:if test="count($next)&gt;0">
+ <a accesskey="n">
+ <xsl:attribute name="href">
+ <xsl:call-template name="href.target">
+ <xsl:with-param name="object" select="$next"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:call-template name="navig.content">
+ <xsl:with-param name="direction" select="'next'"/>
+ </xsl:call-template>
+ </a>
+ </xsl:if>
+ </td>
+ </tr>
+ </xsl:if>
+
+ <xsl:if test="$row2">
+ <tr>
+ <td align="{$direction.align.start}" valign="top">
+ <xsl:if test="$navig.showtitles != 0">
+ <xsl:apply-templates select="$prev" mode="object.title.markup"/>
+ </xsl:if>
+ <xsl:text>&#160;</xsl:text>
+ </td>
+ <td align="center">
+ <xsl:choose>
+ <xsl:when test="$home != . or $nav.context = 'toc'">
+ <a accesskey="h">
+ <xsl:attribute name="href">
+ <xsl:call-template name="href.target">
+ <xsl:with-param name="object" select="$home"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:call-template name="navig.content">
+ <xsl:with-param name="direction" select="'home'"/>
+ </xsl:call-template>
+ </a>
+ <xsl:if test="$chunk.tocs.and.lots != 0 and $nav.context != 'toc'">
+ <xsl:text>&#160;|&#160;</xsl:text>
+ </xsl:if>
+ </xsl:when>
+ <xsl:otherwise>&#160;</xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:if test="$chunk.tocs.and.lots != 0 and $nav.context != 'toc'">
+ <a accesskey="t">
+ <xsl:attribute name="href">
+ <xsl:apply-templates select="/*[1]" mode="recursive-chunk-filename">
+ <xsl:with-param name="recursive" select="true()"/>
+ </xsl:apply-templates>
+ <xsl:text>-toc</xsl:text>
+ <xsl:value-of select="$html.ext"/>
+ </xsl:attribute>
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'nav-toc'"/>
+ </xsl:call-template>
+ </a>
+ </xsl:if>
+ </td>
+ <td align="{$direction.align.end}" valign="top">
+ <xsl:text>&#160;</xsl:text>
+ <xsl:if test="$navig.showtitles != 0">
+ <xsl:apply-templates select="$next" mode="object.title.markup"/>
+ </xsl:if>
+ </td>
+ </tr>
+ </xsl:if>
+ </table>
+ </xsl:if>
+ </div>
+ </xsl:if>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template name="navig.content">
+ <xsl:param name="direction" select="next"/>
+ <xsl:variable name="navtext">
+ <xsl:choose>
+ <xsl:when test="$direction = 'prev'">
+ <xsl:call-template name="gentext.nav.prev"/>
+ </xsl:when>
+ <xsl:when test="$direction = 'next'">
+ <xsl:call-template name="gentext.nav.next"/>
+ </xsl:when>
+ <xsl:when test="$direction = 'up'">
+ <xsl:call-template name="gentext.nav.up"/>
+ </xsl:when>
+ <xsl:when test="$direction = 'home'">
+ <xsl:call-template name="gentext.nav.home"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text>xxx</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="$navig.graphics != 0">
+ <img>
+ <xsl:attribute name="src">
+ <xsl:value-of select="$navig.graphics.path"/>
+ <xsl:value-of select="$direction"/>
+ <xsl:value-of select="$navig.graphics.extension"/>
+ </xsl:attribute>
+ <xsl:attribute name="alt">
+ <xsl:value-of select="$navtext"/>
+ </xsl:attribute>
+ </img>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$navtext"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<!-- * The following template assumes that the first legalnotice -->
+<!-- * instance found in a document applies to the contents of the -->
+<!-- * entire document. It generates an HTML link in each chunk, back -->
+<!-- * to the file containing the contents of the first legalnotice. -->
+<!-- * -->
+<!-- * Actually, it may generate multiple link instances in each chunk, -->
+<!-- * because it walks through the space-separated list of link -->
+<!-- * types specified in the $html.head.legalnotice.link.types param, -->
+<!-- * popping off link types and generating links for them until it -->
+<!-- * depletes the list. -->
+
+<xsl:template name="make.legalnotice.head.links">
+ <!-- * the following ID is used as part of the legalnotice filename; -->
+ <!-- * we need it in order to construct the filename for use in the -->
+ <!-- * value of the href attribute on the link -->
+
+ <xsl:param name="ln-node" select="(//legalnotice)[1]"/>
+
+ <xsl:param name="linktype">
+ <xsl:choose>
+ <xsl:when test="contains($html.head.legalnotice.link.types, ' ')">
+ <xsl:value-of select="normalize-space( substring-before($html.head.legalnotice.link.types, ' '))"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$html.head.legalnotice.link.types"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:param>
+ <xsl:param name="remaining.linktypes" select="concat( normalize-space( substring-after($html.head.legalnotice.link.types, ' ')),' ')"/>
+ <xsl:if test="not($linktype = '')">
+
+ <!-- Compute name of legalnotice file (see titlepage.xsl) -->
+ <xsl:variable name="file">
+ <xsl:call-template name="ln.or.rh.filename">
+ <xsl:with-param name="node" select="$ln-node"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <link rel="{$linktype}">
+ <xsl:attribute name="href">
+ <xsl:value-of select="$file"/>
+ </xsl:attribute>
+ <xsl:attribute name="title">
+ <xsl:apply-templates select="(//legalnotice)[1]" mode="object.title.markup.textonly"/>
+ </xsl:attribute>
+ </link>
+ <xsl:call-template name="make.legalnotice.head.links">
+ <!-- * pop the next value off the list of link types -->
+ <xsl:with-param name="linktype" select="substring-before($remaining.linktypes, ' ')"/>
+ <!-- * remove the link type from the list of remaining link types -->
+ <xsl:with-param name="remaining.linktypes" select="substring-after($remaining.linktypes, ' ')"/>
+ </xsl:call-template>
+ </xsl:if>
+</xsl:template>
+
+<!-- ==================================================================== -->
+<xsl:template name="chunk-element-content">
+ <xsl:param name="prev"/>
+ <xsl:param name="next"/>
+ <xsl:param name="nav.context"/>
+ <xsl:param name="content">
+ <xsl:apply-imports/>
+ </xsl:param>
+
+ <xsl:call-template name="user.preroot"/>
+
+ <html>
+ <xsl:call-template name="html.head">
+ <xsl:with-param name="prev" select="$prev"/>
+ <xsl:with-param name="next" select="$next"/>
+ </xsl:call-template>
+
+ <body>
+ <xsl:call-template name="body.attributes"/>
+ <xsl:call-template name="user.header.navigation"/>
+
+ <xsl:call-template name="header.navigation">
+ <xsl:with-param name="prev" select="$prev"/>
+ <xsl:with-param name="next" select="$next"/>
+ <xsl:with-param name="nav.context" select="$nav.context"/>
+ </xsl:call-template>
+
+ <xsl:call-template name="user.header.content"/>
+
+ <xsl:copy-of select="$content"/>
+
+ <xsl:call-template name="user.footer.content"/>
+
+ <xsl:call-template name="footer.navigation">
+ <xsl:with-param name="prev" select="$prev"/>
+ <xsl:with-param name="next" select="$next"/>
+ <xsl:with-param name="nav.context" select="$nav.context"/>
+ </xsl:call-template>
+
+ <xsl:call-template name="user.footer.navigation"/>
+ </body>
+ </html>
+ <xsl:value-of select="$chunk.append"/>
+</xsl:template>
+
+<!-- ==================================================================== -->
+<xsl:template name="generate.manifest">
+ <xsl:param name="node" select="/"/>
+ <xsl:call-template name="write.text.chunk">
+ <xsl:with-param name="filename">
+ <xsl:if test="$manifest.in.base.dir != 0">
+ <xsl:value-of select="$base.dir"/>
+ </xsl:if>
+ <xsl:value-of select="$manifest"/>
+ </xsl:with-param>
+ <xsl:with-param name="method" select="'text'"/>
+ <xsl:with-param name="content">
+ <xsl:apply-templates select="$node" mode="enumerate-files"/>
+ </xsl:with-param>
+ <xsl:with-param name="encoding" select="$chunker.output.encoding"/>
+ </xsl:call-template>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template name="dbhtml-dir">
+ <xsl:param name="context" select="."/>
+ <!-- directories are now inherited from previous levels -->
+ <xsl:variable name="ppath">
+ <xsl:if test="$context/parent::*">
+ <xsl:call-template name="dbhtml-dir">
+ <xsl:with-param name="context" select="$context/parent::*"/>
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:variable>
+ <xsl:variable name="path">
+ <xsl:call-template name="pi.dbhtml_dir">
+ <xsl:with-param name="node" select="$context"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:choose>
+ <xsl:when test="$path = ''">
+ <xsl:if test="$ppath != ''">
+ <xsl:value-of select="$ppath"/>
+ </xsl:if>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:if test="$ppath != ''">
+ <xsl:value-of select="$ppath"/>
+ <xsl:if test="substring($ppath, string-length($ppath), 1) != '/'">
+ <xsl:text>/</xsl:text>
+ </xsl:if>
+ </xsl:if>
+ <xsl:value-of select="$path"/>
+ <xsl:text>/</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/chunk.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/chunk.xsl
new file mode 100644
index 0000000..6b74923
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/chunk.xsl
@@ -0,0 +1,52 @@
+<?xml version="1.0" encoding="ASCII"?>
+<!--This file was created automatically by html2xhtml-->
+<!--from the HTML stylesheets.-->
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:exsl="http://exslt.org/common" xmlns="http://www.w3.org/1999/xhtml" version="1.0" exclude-result-prefixes="exsl">
+
+<!-- ********************************************************************
+ $Id: chunk.xsl 6910 2007-06-28 23:23:30Z xmldoc $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<!-- ==================================================================== -->
+
+<!-- First import the non-chunking templates that format elements
+ within each chunk file. In a customization, you should
+ create a separate non-chunking customization layer such
+ as mydocbook.xsl that imports the original docbook.xsl and
+ customizes any presentation templates. Then your chunking
+ customization should import mydocbook.xsl instead of
+ docbook.xsl. -->
+<xsl:import href="docbook.xsl"/>
+
+<!-- chunk-common.xsl contains all the named templates for chunking.
+ In a customization file, you import chunk-common.xsl, then
+ add any customized chunking templates of the same name.
+ They will have import precedence over the original
+ chunking templates in chunk-common.xsl. -->
+<xsl:import href="chunk-common.xsl"/>
+
+<!-- The manifest.xsl module is no longer imported because its
+ templates were moved into chunk-common and chunk-code -->
+
+<!-- chunk-code.xsl contains all the chunking templates that use
+ a match attribute. In a customization it should be referenced
+ using <xsl:include> instead of <xsl:import>, and then add
+ any customized chunking templates with match attributes. But be sure
+ to add a priority="1" to such customized templates to resolve
+ its conflict with the original, since they have the
+ same import precedence.
+
+ Using xsl:include prevents adding another layer
+ of import precedence, which would cause any
+ customizations that use xsl:apply-imports to wrongly
+ apply the chunking version instead of the original
+ non-chunking version to format an element. -->
+<xsl:include href="chunk-code.xsl"/>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/chunker.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/chunker.xsl
new file mode 100644
index 0000000..f1e86a1
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/chunker.xsl
@@ -0,0 +1,302 @@
+<?xml version="1.0" encoding="ASCII"?>
+<!--This file was created automatically by html2xhtml-->
+<!--from the HTML stylesheets.-->
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:saxon="http://icl.com/saxon" xmlns:lxslt="http://xml.apache.org/xslt" xmlns:redirect="http://xml.apache.org/xalan/redirect" xmlns:exsl="http://exslt.org/common" xmlns:doc="http://nwalsh.com/xsl/documentation/1.0" xmlns="http://www.w3.org/1999/xhtml" version="1.0" exclude-result-prefixes="saxon lxslt redirect exsl doc" extension-element-prefixes="saxon redirect lxslt exsl">
+
+<!-- ********************************************************************
+ $Id: chunker.xsl 8526 2009-10-14 18:59:40Z bobstayton $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<!-- ==================================================================== -->
+
+<!-- This stylesheet works with XSLT implementations that support -->
+<!-- exsl:document, saxon:output, or Xalan's redirect:write -->
+<!-- Note: Only Saxon 6.4.2 or later is supported. -->
+
+<xsl:param name="chunker.output.method" select="'xml'"/>
+<xsl:param name="chunker.output.encoding" select="'UTF-8'"/>
+<xsl:param name="chunker.output.indent" select="'no'"/>
+<xsl:param name="chunker.output.omit-xml-declaration" select="'no'"/>
+<xsl:param name="chunker.output.standalone" select="'no'"/>
+<xsl:param name="chunker.output.doctype-public" select="'-//W3C//DTD XHTML 1.1//EN'"/>
+<xsl:param name="chunker.output.doctype-system" select="'http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd'"/>
+<xsl:param name="chunker.output.media-type" select="''"/>
+<xsl:param name="chunker.output.cdata-section-elements" select="''"/>
+<xsl:param name="chunker.output.quiet" select="0"/>
+
+<xsl:param name="saxon.character.representation" select="'entity;decimal'"/>
+
+<!-- ==================================================================== -->
+
+<xsl:template name="make-relative-filename">
+ <xsl:param name="base.dir" select="'./'"/>
+ <xsl:param name="base.name" select="''"/>
+
+ <xsl:choose>
+ <!-- put Saxon first to work around a bug in libxslt -->
+ <xsl:when test="element-available('saxon:output')">
+ <!-- Saxon doesn't make the chunks relative -->
+ <xsl:value-of select="concat($base.dir,$base.name)"/>
+ </xsl:when>
+ <xsl:when test="element-available('exsl:document')">
+ <!-- EXSL document does make the chunks relative, I think -->
+ <xsl:choose>
+ <xsl:when test="count(parent::*) = 0">
+ <xsl:value-of select="concat($base.dir,$base.name)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$base.name"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:when test="element-available('redirect:write')">
+ <!-- Xalan doesn't make the chunks relative -->
+ <xsl:value-of select="concat($base.dir,$base.name)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:message terminate="yes">
+ <xsl:text>Don't know how to chunk with </xsl:text>
+ <xsl:value-of select="system-property('xsl:vendor')"/>
+ </xsl:message>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="write.chunk">
+ <xsl:param name="filename" select="''"/>
+ <xsl:param name="quiet" select="$chunker.output.quiet"/>
+ <xsl:param name="suppress-context-node-name" select="0"/>
+ <xsl:param name="message-prolog"/>
+ <xsl:param name="message-epilog"/>
+
+ <xsl:param name="method" select="$chunker.output.method"/>
+ <xsl:param name="encoding" select="$chunker.output.encoding"/>
+ <xsl:param name="indent" select="$chunker.output.indent"/>
+ <xsl:param name="omit-xml-declaration" select="$chunker.output.omit-xml-declaration"/>
+ <xsl:param name="standalone" select="$chunker.output.standalone"/>
+ <xsl:param name="doctype-public" select="$chunker.output.doctype-public"/>
+ <xsl:param name="doctype-system" select="$chunker.output.doctype-system"/>
+ <xsl:param name="media-type" select="$chunker.output.media-type"/>
+ <xsl:param name="cdata-section-elements" select="$chunker.output.cdata-section-elements"/>
+
+ <xsl:param name="content"/>
+
+ <xsl:if test="$quiet = 0">
+ <xsl:message>
+ <xsl:if test="not($message-prolog = '')">
+ <xsl:value-of select="$message-prolog"/>
+ </xsl:if>
+ <xsl:text>Writing </xsl:text>
+ <xsl:value-of select="$filename"/>
+ <xsl:if test="name(.) != '' and $suppress-context-node-name = 0">
+ <xsl:text> for </xsl:text>
+ <xsl:value-of select="name(.)"/>
+ <xsl:if test="@id or @xml:id">
+ <xsl:text>(</xsl:text>
+ <xsl:value-of select="(@id|@xml:id)[1]"/>
+ <xsl:text>)</xsl:text>
+ </xsl:if>
+ </xsl:if>
+ <xsl:if test="not($message-epilog = '')">
+ <xsl:value-of select="$message-epilog"/>
+ </xsl:if>
+ </xsl:message>
+ </xsl:if>
+
+ <xsl:choose>
+ <xsl:when test="element-available('exsl:document')">
+ <xsl:choose>
+ <!-- Handle the permutations ... -->
+ <xsl:when test="$media-type != ''">
+ <xsl:choose>
+ <xsl:when test="$doctype-public != '' and $doctype-system != ''">
+ <exsl:document href="{$filename}" method="{$method}" encoding="{$encoding}" indent="{$indent}" omit-xml-declaration="{$omit-xml-declaration}" cdata-section-elements="{$cdata-section-elements}" media-type="{$media-type}" doctype-public="{$doctype-public}" doctype-system="{$doctype-system}" standalone="{$standalone}">
+ <xsl:copy-of select="$content"/>
+ </exsl:document>
+ </xsl:when>
+ <xsl:when test="$doctype-public != '' and $doctype-system = ''">
+ <exsl:document href="{$filename}" method="{$method}" encoding="{$encoding}" indent="{$indent}" omit-xml-declaration="{$omit-xml-declaration}" cdata-section-elements="{$cdata-section-elements}" media-type="{$media-type}" doctype-public="{$doctype-public}" standalone="{$standalone}">
+ <xsl:copy-of select="$content"/>
+ </exsl:document>
+ </xsl:when>
+ <xsl:when test="$doctype-public = '' and $doctype-system != ''">
+ <exsl:document href="{$filename}" method="{$method}" encoding="{$encoding}" indent="{$indent}" omit-xml-declaration="{$omit-xml-declaration}" cdata-section-elements="{$cdata-section-elements}" media-type="{$media-type}" doctype-system="{$doctype-system}" standalone="{$standalone}">
+ <xsl:copy-of select="$content"/>
+ </exsl:document>
+ </xsl:when>
+ <xsl:otherwise><!-- $doctype-public = '' and $doctype-system = ''"> -->
+ <exsl:document href="{$filename}" method="{$method}" encoding="{$encoding}" indent="{$indent}" omit-xml-declaration="{$omit-xml-declaration}" cdata-section-elements="{$cdata-section-elements}" media-type="{$media-type}" standalone="{$standalone}">
+ <xsl:copy-of select="$content"/>
+ </exsl:document>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:choose>
+ <xsl:when test="$doctype-public != '' and $doctype-system != ''">
+ <exsl:document href="{$filename}" method="{$method}" encoding="{$encoding}" indent="{$indent}" omit-xml-declaration="{$omit-xml-declaration}" cdata-section-elements="{$cdata-section-elements}" doctype-public="{$doctype-public}" doctype-system="{$doctype-system}" standalone="{$standalone}">
+ <xsl:copy-of select="$content"/>
+ </exsl:document>
+ </xsl:when>
+ <xsl:when test="$doctype-public != '' and $doctype-system = ''">
+ <exsl:document href="{$filename}" method="{$method}" encoding="{$encoding}" indent="{$indent}" omit-xml-declaration="{$omit-xml-declaration}" cdata-section-elements="{$cdata-section-elements}" doctype-public="{$doctype-public}" standalone="{$standalone}">
+ <xsl:copy-of select="$content"/>
+ </exsl:document>
+ </xsl:when>
+ <xsl:when test="$doctype-public = '' and $doctype-system != ''">
+ <exsl:document href="{$filename}" method="{$method}" encoding="{$encoding}" indent="{$indent}" omit-xml-declaration="{$omit-xml-declaration}" cdata-section-elements="{$cdata-section-elements}" doctype-system="{$doctype-system}" standalone="{$standalone}">
+ <xsl:copy-of select="$content"/>
+ </exsl:document>
+ </xsl:when>
+ <xsl:otherwise><!-- $doctype-public = '' and $doctype-system = ''"> -->
+ <exsl:document href="{$filename}" method="{$method}" encoding="{$encoding}" indent="{$indent}" omit-xml-declaration="{$omit-xml-declaration}" cdata-section-elements="{$cdata-section-elements}" standalone="{$standalone}">
+ <xsl:copy-of select="$content"/>
+ </exsl:document>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+
+ <xsl:when test="element-available('saxon:output')">
+ <xsl:choose>
+ <!-- Handle the permutations ... -->
+ <xsl:when test="$media-type != ''">
+ <xsl:choose>
+ <xsl:when test="$doctype-public != '' and $doctype-system != ''">
+ <saxon:output saxon:character-representation="{$saxon.character.representation}" href="{$filename}" method="{$method}" encoding="{$encoding}" indent="{$indent}" omit-xml-declaration="{$omit-xml-declaration}" cdata-section-elements="{$cdata-section-elements}" media-type="{$media-type}" doctype-public="{$doctype-public}" doctype-system="{$doctype-system}" standalone="{$standalone}">
+ <xsl:copy-of select="$content"/>
+ </saxon:output>
+ </xsl:when>
+ <xsl:when test="$doctype-public != '' and $doctype-system = ''">
+ <saxon:output saxon:character-representation="{$saxon.character.representation}" href="{$filename}" method="{$method}" encoding="{$encoding}" indent="{$indent}" omit-xml-declaration="{$omit-xml-declaration}" cdata-section-elements="{$cdata-section-elements}" media-type="{$media-type}" doctype-public="{$doctype-public}" standalone="{$standalone}">
+ <xsl:copy-of select="$content"/>
+ </saxon:output>
+ </xsl:when>
+ <xsl:when test="$doctype-public = '' and $doctype-system != ''">
+ <saxon:output saxon:character-representation="{$saxon.character.representation}" href="{$filename}" method="{$method}" encoding="{$encoding}" indent="{$indent}" omit-xml-declaration="{$omit-xml-declaration}" cdata-section-elements="{$cdata-section-elements}" media-type="{$media-type}" doctype-system="{$doctype-system}" standalone="{$standalone}">
+ <xsl:copy-of select="$content"/>
+ </saxon:output>
+ </xsl:when>
+ <xsl:otherwise><!-- $doctype-public = '' and $doctype-system = ''"> -->
+ <saxon:output saxon:character-representation="{$saxon.character.representation}" href="{$filename}" method="{$method}" encoding="{$encoding}" indent="{$indent}" omit-xml-declaration="{$omit-xml-declaration}" cdata-section-elements="{$cdata-section-elements}" media-type="{$media-type}" standalone="{$standalone}">
+ <xsl:copy-of select="$content"/>
+ </saxon:output>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:choose>
+ <xsl:when test="$doctype-public != '' and $doctype-system != ''">
+ <saxon:output saxon:character-representation="{$saxon.character.representation}" href="{$filename}" method="{$method}" encoding="{$encoding}" indent="{$indent}" omit-xml-declaration="{$omit-xml-declaration}" cdata-section-elements="{$cdata-section-elements}" doctype-public="{$doctype-public}" doctype-system="{$doctype-system}" standalone="{$standalone}">
+ <xsl:copy-of select="$content"/>
+ </saxon:output>
+ </xsl:when>
+ <xsl:when test="$doctype-public != '' and $doctype-system = ''">
+ <saxon:output saxon:character-representation="{$saxon.character.representation}" href="{$filename}" method="{$method}" encoding="{$encoding}" indent="{$indent}" omit-xml-declaration="{$omit-xml-declaration}" cdata-section-elements="{$cdata-section-elements}" doctype-public="{$doctype-public}" standalone="{$standalone}">
+ <xsl:copy-of select="$content"/>
+ </saxon:output>
+ </xsl:when>
+ <xsl:when test="$doctype-public = '' and $doctype-system != ''">
+ <saxon:output saxon:character-representation="{$saxon.character.representation}" href="{$filename}" method="{$method}" encoding="{$encoding}" indent="{$indent}" omit-xml-declaration="{$omit-xml-declaration}" cdata-section-elements="{$cdata-section-elements}" doctype-system="{$doctype-system}" standalone="{$standalone}">
+ <xsl:copy-of select="$content"/>
+ </saxon:output>
+ </xsl:when>
+ <xsl:otherwise><!-- $doctype-public = '' and $doctype-system = ''"> -->
+ <saxon:output saxon:character-representation="{$saxon.character.representation}" href="{$filename}" method="{$method}" encoding="{$encoding}" indent="{$indent}" omit-xml-declaration="{$omit-xml-declaration}" cdata-section-elements="{$cdata-section-elements}" standalone="{$standalone}">
+ <xsl:copy-of select="$content"/>
+ </saxon:output>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+
+ <xsl:when test="element-available('redirect:write')">
+ <!-- Xalan uses redirect -->
+ <redirect:write file="{$filename}">
+ <xsl:copy-of select="$content"/>
+ </redirect:write>
+ </xsl:when>
+
+ <xsl:otherwise>
+ <!-- it doesn't matter since we won't be making chunks... -->
+ <xsl:message terminate="yes">
+ <xsl:text>Can't make chunks with </xsl:text>
+ <xsl:value-of select="system-property('xsl:vendor')"/>
+ <xsl:text>'s processor.</xsl:text>
+ </xsl:message>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="write.chunk.with.doctype">
+ <xsl:param name="filename" select="''"/>
+ <xsl:param name="quiet" select="$chunker.output.quiet"/>
+
+ <xsl:param name="method" select="$chunker.output.method"/>
+ <xsl:param name="encoding" select="$chunker.output.encoding"/>
+ <xsl:param name="indent" select="$chunker.output.indent"/>
+ <xsl:param name="omit-xml-declaration" select="$chunker.output.omit-xml-declaration"/>
+ <xsl:param name="standalone" select="$chunker.output.standalone"/>
+ <xsl:param name="doctype-public" select="$chunker.output.doctype-public"/>
+ <xsl:param name="doctype-system" select="$chunker.output.doctype-system"/>
+ <xsl:param name="media-type" select="$chunker.output.media-type"/>
+ <xsl:param name="cdata-section-elements" select="$chunker.output.cdata-section-elements"/>
+
+ <xsl:param name="content"/>
+
+ <xsl:call-template name="write.chunk">
+ <xsl:with-param name="filename" select="$filename"/>
+ <xsl:with-param name="quiet" select="$quiet"/>
+ <xsl:with-param name="method" select="$method"/>
+ <xsl:with-param name="encoding" select="$encoding"/>
+ <xsl:with-param name="indent" select="$indent"/>
+ <xsl:with-param name="omit-xml-declaration" select="$omit-xml-declaration"/>
+ <xsl:with-param name="standalone" select="$standalone"/>
+ <xsl:with-param name="doctype-public" select="$doctype-public"/>
+ <xsl:with-param name="doctype-system" select="$doctype-system"/>
+ <xsl:with-param name="media-type" select="$media-type"/>
+ <xsl:with-param name="cdata-section-elements" select="$cdata-section-elements"/>
+ <xsl:with-param name="content" select="$content"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template name="write.text.chunk">
+ <xsl:param name="filename" select="''"/>
+ <xsl:param name="quiet" select="$chunker.output.quiet"/>
+ <xsl:param name="suppress-context-node-name" select="0"/>
+ <xsl:param name="message-prolog"/>
+ <xsl:param name="message-epilog"/>
+ <xsl:param name="method" select="'text'"/>
+ <xsl:param name="encoding" select="$chunker.output.encoding"/>
+ <xsl:param name="media-type" select="$chunker.output.media-type"/>
+ <xsl:param name="content"/>
+
+ <xsl:call-template name="write.chunk">
+ <xsl:with-param name="filename" select="$filename"/>
+ <xsl:with-param name="quiet" select="$quiet"/>
+ <xsl:with-param name="suppress-context-node-name" select="$suppress-context-node-name"/>
+ <xsl:with-param name="message-prolog" select="$message-prolog"/>
+ <xsl:with-param name="message-epilog" select="$message-epilog"/>
+ <xsl:with-param name="method" select="$method"/>
+ <xsl:with-param name="encoding" select="$encoding"/>
+ <xsl:with-param name="indent" select="'no'"/>
+ <xsl:with-param name="omit-xml-declaration" select="'no'"/>
+ <xsl:with-param name="standalone" select="'no'"/>
+ <xsl:with-param name="doctype-public"/>
+ <xsl:with-param name="doctype-system"/>
+ <xsl:with-param name="media-type" select="$media-type"/>
+ <xsl:with-param name="cdata-section-elements"/>
+ <xsl:with-param name="content" select="$content"/>
+ </xsl:call-template>
+</xsl:template>
+
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/chunkfast.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/chunkfast.xsl
new file mode 100644
index 0000000..ba7c287
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/chunkfast.xsl
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="ASCII"?>
+<!--This file was created automatically by html2xhtml-->
+<!--from the HTML stylesheets.-->
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:exsl="http://exslt.org/common" xmlns:cf="http://docbook.sourceforge.net/xmlns/chunkfast/1.0" xmlns="http://www.w3.org/1999/xhtml" version="1.0" exclude-result-prefixes="cf exsl">
+
+<!-- ********************************************************************
+ $Id: chunkfast.xsl 8345 2009-03-16 06:44:07Z bobstayton $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<!-- ==================================================================== -->
+
+<xsl:import href="chunk.xsl"/>
+<xsl:param name="chunk.fast" select="1"/>
+
+<xsl:variable name="chunks" select="exsl:node-set($chunk.hierarchy)//cf:div"/>
+
+<!-- ==================================================================== -->
+
+<xsl:template name="process-chunk-element">
+ <xsl:choose>
+ <xsl:when test="$chunk.fast != 0 and $exsl.node.set.available != 0">
+ <xsl:variable name="genid" select="generate-id()"/>
+
+ <xsl:variable name="div" select="$chunks[@id=$genid or @xml:id=$genid]"/>
+
+ <xsl:variable name="prevdiv" select="($div/preceding-sibling::cf:div|$div/preceding::cf:div|$div/parent::cf:div)[last()]"/>
+ <xsl:variable name="prev" select="key('genid', ($prevdiv/@id|$prevdiv/@xml:id)[1])"/>
+
+ <xsl:variable name="nextdiv" select="($div/following-sibling::cf:div|$div/following::cf:div|$div/cf:div)[1]"/>
+ <xsl:variable name="next" select="key('genid', ($nextdiv/@id|$nextdiv/@xml:id)[1])"/>
+
+ <xsl:choose>
+ <xsl:when test="$onechunk != 0 and parent::*">
+ <xsl:apply-imports/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="process-chunk">
+ <xsl:with-param name="prev" select="$prev"/>
+ <xsl:with-param name="next" select="$next"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:choose>
+ <xsl:when test="$onechunk != 0 and not(parent::*)">
+ <xsl:call-template name="chunk-all-sections"/>
+ </xsl:when>
+ <xsl:when test="$onechunk != 0">
+ <xsl:apply-imports/>
+ </xsl:when>
+ <xsl:when test="$chunk.first.sections = 0">
+ <xsl:call-template name="chunk-first-section-with-parent"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="chunk-all-sections"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/chunktoc.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/chunktoc.xsl
new file mode 100644
index 0000000..400fd6a
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/chunktoc.xsl
@@ -0,0 +1,528 @@
+<?xml version="1.0" encoding="ASCII"?>
+<!--This file was created automatically by html2xhtml-->
+<!--from the HTML stylesheets.-->
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:doc="http://nwalsh.com/xsl/documentation/1.0" xmlns:exsl="http://exslt.org/common" xmlns:ng="http://docbook.org/docbook-ng" xmlns:db="http://docbook.org/ns/docbook" xmlns="http://www.w3.org/1999/xhtml" version="1.0" exclude-result-prefixes="doc exsl ng db">
+
+<!-- ********************************************************************
+ $Id: chunktoc.xsl 8545 2009-12-02 07:22:10Z bobstayton $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<!-- ==================================================================== -->
+
+<xsl:import href="docbook.xsl"/>
+<xsl:import href="chunk-common.xsl"/>
+
+<xsl:template name="chunk">
+ <xsl:param name="node" select="."/>
+ <!-- returns 1 if $node is a chunk -->
+
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id">
+ <xsl:with-param name="object" select="$node"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="chunks" select="document($chunk.toc,/)"/>
+
+ <xsl:choose>
+ <xsl:when test="$chunks//tocentry[@linkend=$id]">1</xsl:when>
+ <xsl:otherwise>0</xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="*" mode="chunk-filename">
+ <!-- returns the filename of a chunk -->
+
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+
+ <xsl:variable name="chunks" select="document($chunk.toc,/)"/>
+
+ <xsl:variable name="chunk" select="$chunks//tocentry[@linkend=$id]"/>
+ <xsl:variable name="filename">
+ <xsl:call-template name="pi.dbhtml_filename">
+ <xsl:with-param name="node" select="$chunk"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="$chunk">
+ <xsl:value-of select="$filename"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="parent::*" mode="chunk-filename"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template name="process-chunk">
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+
+ <xsl:variable name="chunks" select="document($chunk.toc,/)"/>
+
+ <xsl:variable name="chunk" select="$chunks//tocentry[@linkend=$id]"/>
+ <xsl:variable name="prev-id" select="($chunk/preceding::tocentry |$chunk/ancestor::tocentry)[last()]/@linkend"/>
+ <xsl:variable name="next-id" select="($chunk/following::tocentry |$chunk/child::tocentry)[1]/@linkend"/>
+
+ <xsl:variable name="prev" select="key('id',$prev-id)"/>
+ <xsl:variable name="next" select="key('id',$next-id)"/>
+
+ <xsl:variable name="ischunk">
+ <xsl:call-template name="chunk"/>
+ </xsl:variable>
+
+ <xsl:variable name="chunkfn">
+ <xsl:if test="$ischunk='1'">
+ <xsl:apply-templates mode="chunk-filename" select="."/>
+ </xsl:if>
+ </xsl:variable>
+
+ <xsl:variable name="filename">
+ <xsl:call-template name="make-relative-filename">
+ <xsl:with-param name="base.dir" select="$base.dir"/>
+ <xsl:with-param name="base.name" select="$chunkfn"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="$ischunk = 0">
+ <xsl:apply-imports/>
+ </xsl:when>
+
+ <xsl:otherwise>
+ <xsl:call-template name="write.chunk">
+ <xsl:with-param name="filename" select="$filename"/>
+ <xsl:with-param name="content">
+ <xsl:call-template name="chunk-element-content">
+ <xsl:with-param name="prev" select="$prev"/>
+ <xsl:with-param name="next" select="$next"/>
+ </xsl:call-template>
+ </xsl:with-param>
+ <xsl:with-param name="quiet" select="$chunk.quietly"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="set">
+ <xsl:call-template name="process-chunk"/>
+</xsl:template>
+
+<xsl:template match="book">
+ <xsl:call-template name="process-chunk"/>
+</xsl:template>
+
+<xsl:template match="appendix">
+ <xsl:call-template name="process-chunk"/>
+</xsl:template>
+
+<xsl:template match="book/glossary">
+ <xsl:call-template name="process-chunk"/>
+</xsl:template>
+
+<xsl:template match="book/bibliography">
+ <xsl:call-template name="process-chunk"/>
+</xsl:template>
+
+<xsl:template match="dedication" mode="dedication">
+ <xsl:call-template name="process-chunk"/>
+</xsl:template>
+
+<xsl:template match="preface|chapter">
+ <xsl:call-template name="process-chunk"/>
+</xsl:template>
+
+<xsl:template match="part|reference">
+ <xsl:call-template name="process-chunk"/>
+</xsl:template>
+
+<xsl:template match="refentry">
+ <xsl:call-template name="process-chunk"/>
+</xsl:template>
+
+<xsl:template match="colophon">
+ <xsl:call-template name="process-chunk"/>
+</xsl:template>
+
+<xsl:template match="article">
+ <xsl:call-template name="process-chunk"/>
+</xsl:template>
+
+<xsl:template match="article/glossary">
+ <xsl:call-template name="process-chunk"/>
+</xsl:template>
+
+<xsl:template match="article/bibliography">
+ <xsl:call-template name="process-chunk"/>
+</xsl:template>
+
+<xsl:template match="sect1|sect2|sect3|sect4|sect5|section">
+ <xsl:variable name="ischunk">
+ <xsl:call-template name="chunk"/>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="$ischunk != 0">
+ <xsl:call-template name="process-chunk"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-imports/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="setindex |book/index |article/index">
+ <!-- some implementations use completely empty index tags to indicate -->
+ <!-- where an automatically generated index should be inserted. so -->
+ <!-- if the index is completely empty, skip it. -->
+ <xsl:if test="count(*)&gt;0 or $generate.index != '0'">
+ <xsl:call-template name="process-chunk"/>
+ </xsl:if>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="/">
+ <!-- * Get a title for current doc so that we let the user -->
+ <!-- * know what document we are processing at this point. -->
+ <xsl:variable name="doc.title">
+ <xsl:call-template name="get.doc.title"/>
+ </xsl:variable>
+ <xsl:choose>
+ <xsl:when test="$chunk.toc = ''">
+ <xsl:message terminate="yes">
+ <xsl:text>The chunk.toc file is not set.</xsl:text>
+ </xsl:message>
+ </xsl:when>
+ <!-- Hack! If someone hands us a DocBook V5.x or DocBook NG document,
+ toss the namespace and continue. Use the docbook5 namespaced
+ stylesheets for DocBook5 if you don't want to use this feature.-->
+ <!-- include extra test for Xalan quirk -->
+ <xsl:when test="$exsl.node.set.available != 0 and (*/self::ng:* or */self::db:*)">
+ <xsl:call-template name="log.message">
+ <xsl:with-param name="level">Note</xsl:with-param>
+ <xsl:with-param name="source" select="$doc.title"/>
+ <xsl:with-param name="context-desc">
+ <xsl:text>namesp. cut</xsl:text>
+ </xsl:with-param>
+ <xsl:with-param name="message">
+ <xsl:text>stripped namespace before processing</xsl:text>
+ </xsl:with-param>
+ </xsl:call-template>
+ <xsl:variable name="nons">
+ <xsl:apply-templates mode="stripNS"/>
+ </xsl:variable>
+ <xsl:call-template name="log.message">
+ <xsl:with-param name="level">Note</xsl:with-param>
+ <xsl:with-param name="source" select="$doc.title"/>
+ <xsl:with-param name="context-desc">
+ <xsl:text>namesp. cut</xsl:text>
+ </xsl:with-param>
+ <xsl:with-param name="message">
+ <xsl:text>processing stripped document</xsl:text>
+ </xsl:with-param>
+ </xsl:call-template>
+ <xsl:apply-templates select="exsl:node-set($nons)"/>
+ </xsl:when>
+ <!-- Can't process unless namespace removed -->
+ <xsl:when test="*/self::ng:* or */self::db:*">
+ <xsl:message terminate="yes">
+ <xsl:text>Unable to strip the namespace from DB5 document,</xsl:text>
+ <xsl:text> cannot proceed.</xsl:text>
+ </xsl:message>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:choose>
+ <xsl:when test="$rootid != ''">
+ <xsl:choose>
+ <xsl:when test="count(key('id',$rootid)) = 0">
+ <xsl:message terminate="yes">
+ <xsl:text>ID '</xsl:text>
+ <xsl:value-of select="$rootid"/>
+ <xsl:text>' not found in document.</xsl:text>
+ </xsl:message>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:if test="$collect.xref.targets = 'yes' or $collect.xref.targets = 'only'">
+ <xsl:apply-templates select="key('id', $rootid)" mode="collect.targets"/>
+ </xsl:if>
+ <xsl:if test="$collect.xref.targets != 'only'">
+ <xsl:apply-templates select="key('id',$rootid)" mode="process.root"/>
+ <xsl:if test="$tex.math.in.alt != ''">
+ <xsl:apply-templates select="key('id',$rootid)" mode="collect.tex.math"/>
+ </xsl:if>
+ <xsl:if test="$generate.manifest != 0">
+ <xsl:call-template name="generate.manifest">
+ <xsl:with-param name="node" select="key('id',$rootid)"/>
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:if>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:if test="$collect.xref.targets = 'yes' or $collect.xref.targets = 'only'">
+ <xsl:apply-templates select="/" mode="collect.targets"/>
+ </xsl:if>
+ <xsl:if test="$collect.xref.targets != 'only'">
+ <xsl:apply-templates select="/" mode="process.root"/>
+ <xsl:if test="$tex.math.in.alt != ''">
+ <xsl:apply-templates select="/" mode="collect.tex.math"/>
+ </xsl:if>
+ <xsl:if test="$generate.manifest != 0">
+ <xsl:call-template name="generate.manifest">
+ <xsl:with-param name="node" select="/"/>
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:if>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="*" mode="process.root">
+ <xsl:apply-templates select="."/>
+</xsl:template>
+
+<xsl:template name="make.lots">
+ <xsl:param name="toc.params" select="''"/>
+ <xsl:param name="toc"/>
+
+ <xsl:variable name="lots">
+ <xsl:if test="contains($toc.params, 'toc')">
+ <xsl:copy-of select="$toc"/>
+ </xsl:if>
+
+ <xsl:if test="contains($toc.params, 'figure')">
+ <xsl:choose>
+ <xsl:when test="$chunk.separate.lots != '0'">
+ <xsl:call-template name="make.lot.chunk">
+ <xsl:with-param name="type" select="'figure'"/>
+ <xsl:with-param name="lot">
+ <xsl:call-template name="list.of.titles">
+ <xsl:with-param name="titles" select="'figure'"/>
+ <xsl:with-param name="nodes" select=".//figure"/>
+ </xsl:call-template>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="list.of.titles">
+ <xsl:with-param name="titles" select="'figure'"/>
+ <xsl:with-param name="nodes" select=".//figure"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:if>
+
+ <xsl:if test="contains($toc.params, 'table')">
+ <xsl:choose>
+ <xsl:when test="$chunk.separate.lots != '0'">
+ <xsl:call-template name="make.lot.chunk">
+ <xsl:with-param name="type" select="'table'"/>
+ <xsl:with-param name="lot">
+ <xsl:call-template name="list.of.titles">
+ <xsl:with-param name="titles" select="'table'"/>
+ <xsl:with-param name="nodes" select=".//table"/>
+ </xsl:call-template>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="list.of.titles">
+ <xsl:with-param name="titles" select="'table'"/>
+ <xsl:with-param name="nodes" select=".//table"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:if>
+
+ <xsl:if test="contains($toc.params, 'example')">
+ <xsl:choose>
+ <xsl:when test="$chunk.separate.lots != '0'">
+ <xsl:call-template name="make.lot.chunk">
+ <xsl:with-param name="type" select="'example'"/>
+ <xsl:with-param name="lot">
+ <xsl:call-template name="list.of.titles">
+ <xsl:with-param name="titles" select="'example'"/>
+ <xsl:with-param name="nodes" select=".//example"/>
+ </xsl:call-template>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="list.of.titles">
+ <xsl:with-param name="titles" select="'example'"/>
+ <xsl:with-param name="nodes" select=".//example"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:if>
+
+ <xsl:if test="contains($toc.params, 'equation')">
+ <xsl:choose>
+ <xsl:when test="$chunk.separate.lots != '0'">
+ <xsl:call-template name="make.lot.chunk">
+ <xsl:with-param name="type" select="'equation'"/>
+ <xsl:with-param name="lot">
+ <xsl:call-template name="list.of.titles">
+ <xsl:with-param name="titles" select="'equation'"/>
+ <xsl:with-param name="nodes" select=".//equation"/>
+ </xsl:call-template>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="list.of.titles">
+ <xsl:with-param name="titles" select="'equation'"/>
+ <xsl:with-param name="nodes" select=".//equation"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:if>
+
+ <xsl:if test="contains($toc.params, 'procedure')">
+ <xsl:choose>
+ <xsl:when test="$chunk.separate.lots != '0'">
+ <xsl:call-template name="make.lot.chunk">
+ <xsl:with-param name="type" select="'procedure'"/>
+ <xsl:with-param name="lot">
+ <xsl:call-template name="list.of.titles">
+ <xsl:with-param name="titles" select="'procedure'"/>
+ <xsl:with-param name="nodes" select=".//procedure[title]"/>
+ </xsl:call-template>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="list.of.titles">
+ <xsl:with-param name="titles" select="'procedure'"/>
+ <xsl:with-param name="nodes" select=".//procedure[title]"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:if>
+ </xsl:variable>
+
+ <xsl:if test="string($lots) != ''">
+ <xsl:choose>
+ <xsl:when test="$chunk.tocs.and.lots != 0 and not(parent::*)">
+ <xsl:call-template name="write.chunk">
+ <xsl:with-param name="filename">
+ <xsl:call-template name="make-relative-filename">
+ <xsl:with-param name="base.dir" select="$base.dir"/>
+ <xsl:with-param name="base.name">
+ <xsl:call-template name="dbhtml-dir"/>
+ <xsl:apply-templates select="." mode="recursive-chunk-filename">
+ <xsl:with-param name="recursive" select="true()"/>
+ </xsl:apply-templates>
+ <xsl:text>-toc</xsl:text>
+ <xsl:value-of select="$html.ext"/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:with-param>
+ <xsl:with-param name="content">
+ <xsl:call-template name="chunk-element-content">
+ <xsl:with-param name="prev" select="/foo"/>
+ <xsl:with-param name="next" select="/foo"/>
+ <xsl:with-param name="nav.context" select="'toc'"/>
+ <xsl:with-param name="content">
+ <h1>
+ <xsl:apply-templates select="." mode="object.title.markup"/>
+ </h1>
+ <xsl:copy-of select="$lots"/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:with-param>
+ <xsl:with-param name="quiet" select="$chunk.quietly"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:copy-of select="$lots"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template name="make.lot.chunk">
+ <xsl:param name="type" select="''"/>
+ <xsl:param name="lot"/>
+
+ <xsl:if test="string($lot) != ''">
+ <xsl:variable name="filename">
+ <xsl:call-template name="make-relative-filename">
+ <xsl:with-param name="base.dir" select="$base.dir"/>
+ <xsl:with-param name="base.name">
+ <xsl:call-template name="dbhtml-dir"/>
+ <xsl:value-of select="$type"/>
+ <xsl:text>-toc</xsl:text>
+ <xsl:value-of select="$html.ext"/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="href">
+ <xsl:call-template name="make-relative-filename">
+ <xsl:with-param name="base.name">
+ <xsl:call-template name="dbhtml-dir"/>
+ <xsl:value-of select="$type"/>
+ <xsl:text>-toc</xsl:text>
+ <xsl:value-of select="$html.ext"/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:call-template name="write.chunk">
+ <xsl:with-param name="filename" select="$filename"/>
+ <xsl:with-param name="content">
+ <xsl:call-template name="chunk-element-content">
+ <xsl:with-param name="prev" select="/foo"/>
+ <xsl:with-param name="next" select="/foo"/>
+ <xsl:with-param name="nav.context" select="'toc'"/>
+ <xsl:with-param name="content">
+ <xsl:copy-of select="$lot"/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:with-param>
+ <xsl:with-param name="quiet" select="$chunk.quietly"/>
+ </xsl:call-template>
+ <!-- And output a link to this file -->
+ <div>
+ <xsl:attribute name="class">
+ <xsl:text>ListofTitles</xsl:text>
+ </xsl:attribute>
+ <a href="{$href}">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key">
+ <xsl:choose>
+ <xsl:when test="$type='table'">ListofTables</xsl:when>
+ <xsl:when test="$type='figure'">ListofFigures</xsl:when>
+ <xsl:when test="$type='equation'">ListofEquations</xsl:when>
+ <xsl:when test="$type='example'">ListofExamples</xsl:when>
+ <xsl:when test="$type='procedure'">ListofProcedures</xsl:when>
+ <xsl:otherwise>ListofUnknown</xsl:otherwise>
+ </xsl:choose>
+ </xsl:with-param>
+ </xsl:call-template>
+ </a>
+ </div>
+ </xsl:if>
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/component.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/component.xsl
new file mode 100644
index 0000000..b18d533
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/component.xsl
@@ -0,0 +1,395 @@
+<?xml version="1.0" encoding="ASCII"?>
+<!--This file was created automatically by html2xhtml-->
+<!--from the HTML stylesheets.-->
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1999/xhtml" version="1.0">
+
+<!-- ********************************************************************
+ $Id: component.xsl 8568 2010-01-11 03:16:56Z bobstayton $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<!-- ==================================================================== -->
+
+<xsl:template name="component.title">
+ <xsl:param name="node" select="."/>
+
+ <xsl:variable name="level">
+ <xsl:choose>
+ <xsl:when test="ancestor::section">
+ <xsl:value-of select="count(ancestor::section)+1"/>
+ </xsl:when>
+ <xsl:when test="ancestor::sect5">6</xsl:when>
+ <xsl:when test="ancestor::sect4">5</xsl:when>
+ <xsl:when test="ancestor::sect3">4</xsl:when>
+ <xsl:when test="ancestor::sect2">3</xsl:when>
+ <xsl:when test="ancestor::sect1">2</xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <!-- Let's handle the case where a component (bibliography, for example)
+ occurs inside a section; will we need parameters for this? -->
+
+ <xsl:element name="h{$level+1}" namespace="http://www.w3.org/1999/xhtml">
+ <xsl:attribute name="class">title</xsl:attribute>
+ <xsl:if test="$generate.id.attributes = 0">
+ <xsl:call-template name="anchor">
+ <xsl:with-param name="node" select="$node"/>
+ <xsl:with-param name="conditional" select="0"/>
+ </xsl:call-template>
+ </xsl:if>
+ <xsl:apply-templates select="$node" mode="object.title.markup">
+ <xsl:with-param name="allow-anchors" select="1"/>
+ </xsl:apply-templates>
+ </xsl:element>
+</xsl:template>
+
+<xsl:template name="component.subtitle">
+ <xsl:param name="node" select="."/>
+ <xsl:variable name="subtitle" select="($node/docinfo/subtitle |$node/info/subtitle |$node/prefaceinfo/subtitle |$node/chapterinfo/subtitle |$node/appendixinfo/subtitle |$node/articleinfo/subtitle |$node/artheader/subtitle |$node/subtitle)[1]"/>
+
+ <xsl:if test="$subtitle">
+ <h3 class="subtitle">
+ <em xmlns:xslo="http://www.w3.org/1999/XSL/Transform">
+ <xsl:apply-templates select="$node" mode="object.subtitle.markup"/>
+ </em>
+ </h3>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template name="component.separator">
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="dedication" mode="dedication">
+ <xsl:call-template name="id.warning"/>
+
+ <div>
+ <xsl:call-template name="common.html.attributes">
+ <xsl:with-param name="inherit" select="1"/>
+ </xsl:call-template>
+ <xsl:call-template name="dedication.titlepage"/>
+ <xsl:apply-templates/>
+ <xsl:call-template name="process.footnotes"/>
+ </div>
+</xsl:template>
+
+<xsl:template match="dedication/title|dedication/info/title" mode="titlepage.mode" priority="2">
+ <xsl:call-template name="component.title">
+ <xsl:with-param name="node" select="ancestor::dedication[1]"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="dedication/subtitle|dedication/info/subtitle" mode="titlepage.mode" priority="2">
+ <xsl:call-template name="component.subtitle">
+ <xsl:with-param name="node" select="ancestor::dedication[1]"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="dedication"/> <!-- see mode="dedication" -->
+<xsl:template match="dedication/title"/>
+<xsl:template match="dedication/subtitle"/>
+<xsl:template match="dedication/titleabbrev"/>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="acknowledgements" mode="acknowledgements">
+ <xsl:call-template name="id.warning"/>
+
+ <div>
+ <xsl:call-template name="common.html.attributes">
+ <xsl:with-param name="inherit" select="1"/>
+ </xsl:call-template>
+ <xsl:call-template name="acknowledgements.titlepage"/>
+ <xsl:apply-templates/>
+ <xsl:call-template name="process.footnotes"/>
+ </div>
+</xsl:template>
+
+<xsl:template match="acknowledgements/title|acknowledgements/info/title" mode="titlepage.mode" priority="2">
+ <xsl:call-template name="component.title">
+ <xsl:with-param name="node" select="ancestor::acknowledgements[1]"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="acknowledgements/subtitle|acknowledgements/info/subtitle" mode="titlepage.mode" priority="2">
+ <xsl:call-template name="component.subtitle">
+ <xsl:with-param name="node" select="ancestor::acknowledgements[1]"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="acknowledgements"/> <!-- see mode="acknowledgements" -->
+<xsl:template match="acknowledgements/title"/>
+<xsl:template match="acknowledgements/subtitle"/>
+<xsl:template match="acknowledgements/titleabbrev"/>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="colophon">
+ <xsl:call-template name="id.warning"/>
+
+ <div>
+ <xsl:call-template name="common.html.attributes">
+ <xsl:with-param name="inherit" select="1"/>
+ </xsl:call-template>
+ <xsl:if test="$generate.id.attributes != 0">
+ <xsl:attribute name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:call-template name="component.separator"/>
+ <xsl:call-template name="component.title"/>
+ <xsl:call-template name="component.subtitle"/>
+
+ <xsl:apply-templates/>
+ <xsl:call-template name="process.footnotes"/>
+ </div>
+</xsl:template>
+
+<xsl:template match="colophon/title"/>
+<xsl:template match="colophon/subtitle"/>
+<xsl:template match="colophon/titleabbrev"/>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="preface">
+ <xsl:call-template name="id.warning"/>
+
+ <div>
+ <xsl:call-template name="common.html.attributes">
+ <xsl:with-param name="inherit" select="1"/>
+ </xsl:call-template>
+ <xsl:if test="$generate.id.attributes != 0">
+ <xsl:attribute name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:call-template name="component.separator"/>
+ <xsl:call-template name="preface.titlepage"/>
+
+ <xsl:variable name="toc.params">
+ <xsl:call-template name="find.path.params">
+ <xsl:with-param name="table" select="normalize-space($generate.toc)"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:if test="contains($toc.params, 'toc')">
+ <xsl:call-template name="component.toc">
+ <xsl:with-param name="toc.title.p" select="contains($toc.params, 'title')"/>
+ </xsl:call-template>
+ <xsl:call-template name="component.toc.separator"/>
+ </xsl:if>
+ <xsl:apply-templates/>
+ <xsl:call-template name="process.footnotes"/>
+ </div>
+</xsl:template>
+
+<xsl:template match="preface/title" mode="titlepage.mode" priority="2">
+ <xsl:call-template name="component.title">
+ <xsl:with-param name="node" select="ancestor::preface[1]"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="preface/subtitle |preface/prefaceinfo/subtitle |preface/info/subtitle |preface/docinfo/subtitle" mode="titlepage.mode" priority="2">
+ <xsl:call-template name="component.subtitle">
+ <xsl:with-param name="node" select="ancestor::preface[1]"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="preface/docinfo|prefaceinfo"/>
+<xsl:template match="preface/info"/>
+<xsl:template match="preface/title"/>
+<xsl:template match="preface/titleabbrev"/>
+<xsl:template match="preface/subtitle"/>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="chapter">
+ <xsl:call-template name="id.warning"/>
+
+ <div>
+ <xsl:call-template name="common.html.attributes">
+ <xsl:with-param name="inherit" select="1"/>
+ </xsl:call-template>
+ <xsl:if test="$generate.id.attributes != 0">
+ <xsl:attribute name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:call-template name="component.separator"/>
+ <xsl:call-template name="chapter.titlepage"/>
+
+ <xsl:variable name="toc.params">
+ <xsl:call-template name="find.path.params">
+ <xsl:with-param name="table" select="normalize-space($generate.toc)"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:if test="contains($toc.params, 'toc')">
+ <xsl:call-template name="component.toc">
+ <xsl:with-param name="toc.title.p" select="contains($toc.params, 'title')"/>
+ </xsl:call-template>
+ <xsl:call-template name="component.toc.separator"/>
+ </xsl:if>
+ <xsl:apply-templates/>
+ <xsl:call-template name="process.footnotes"/>
+ </div>
+</xsl:template>
+
+<xsl:template match="chapter/title|chapter/chapterinfo/title|chapter/info/title" mode="titlepage.mode" priority="2">
+ <xsl:call-template name="component.title">
+ <xsl:with-param name="node" select="ancestor::chapter[1]"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="chapter/subtitle |chapter/chapterinfo/subtitle |chapter/info/subtitle |chapter/docinfo/subtitle" mode="titlepage.mode" priority="2">
+ <xsl:call-template name="component.subtitle">
+ <xsl:with-param name="node" select="ancestor::chapter[1]"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="chapter/docinfo|chapterinfo"/>
+<xsl:template match="chapter/info"/>
+<xsl:template match="chapter/title"/>
+<xsl:template match="chapter/titleabbrev"/>
+<xsl:template match="chapter/subtitle"/>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="appendix">
+ <xsl:variable name="ischunk">
+ <xsl:call-template name="chunk"/>
+ </xsl:variable>
+
+ <xsl:call-template name="id.warning"/>
+
+ <div>
+ <xsl:call-template name="common.html.attributes">
+ <xsl:with-param name="inherit" select="1"/>
+ </xsl:call-template>
+ <xsl:if test="$generate.id.attributes != 0">
+ <xsl:attribute name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:choose>
+ <xsl:when test="parent::article and $ischunk = 0">
+ <xsl:call-template name="section.heading">
+ <xsl:with-param name="level" select="1"/>
+ <xsl:with-param name="title">
+ <xsl:apply-templates select="." mode="object.title.markup"/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="component.separator"/>
+ <xsl:call-template name="appendix.titlepage"/>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:variable name="toc.params">
+ <xsl:call-template name="find.path.params">
+ <xsl:with-param name="table" select="normalize-space($generate.toc)"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:if test="contains($toc.params, 'toc')">
+ <xsl:call-template name="component.toc">
+ <xsl:with-param name="toc.title.p" select="contains($toc.params, 'title')"/>
+ </xsl:call-template>
+ <xsl:call-template name="component.toc.separator"/>
+ </xsl:if>
+
+ <xsl:apply-templates/>
+
+ <xsl:if test="not(parent::article) or $ischunk != 0">
+ <xsl:call-template name="process.footnotes"/>
+ </xsl:if>
+ </div>
+</xsl:template>
+
+<xsl:template match="appendix/title|appendix/appendixinfo/title" mode="titlepage.mode" priority="2">
+ <xsl:call-template name="component.title">
+ <xsl:with-param name="node" select="ancestor::appendix[1]"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="appendix/subtitle |appendix/appendixinfo/subtitle |appendix/info/subtitle |appendix/docinfo/subtitle" mode="titlepage.mode" priority="2">
+ <xsl:call-template name="component.subtitle">
+ <xsl:with-param name="node" select="ancestor::appendix[1]"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="appendix/docinfo|appendixinfo"/>
+<xsl:template match="appendix/info"/>
+<xsl:template match="appendix/title"/>
+<xsl:template match="appendix/titleabbrev"/>
+<xsl:template match="appendix/subtitle"/>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="article">
+ <xsl:call-template name="id.warning"/>
+
+ <div>
+ <xsl:call-template name="common.html.attributes">
+ <xsl:with-param name="inherit" select="1"/>
+ </xsl:call-template>
+ <xsl:if test="$generate.id.attributes != 0">
+ <xsl:attribute name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:call-template name="article.titlepage"/>
+
+ <xsl:variable name="toc.params">
+ <xsl:call-template name="find.path.params">
+ <xsl:with-param name="table" select="normalize-space($generate.toc)"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:call-template name="make.lots">
+ <xsl:with-param name="toc.params" select="$toc.params"/>
+ <xsl:with-param name="toc">
+ <xsl:call-template name="component.toc">
+ <xsl:with-param name="toc.title.p" select="contains($toc.params, 'title')"/>
+ </xsl:call-template>
+ </xsl:with-param>
+ </xsl:call-template>
+
+ <xsl:apply-templates/>
+ <xsl:call-template name="process.footnotes"/>
+ </div>
+</xsl:template>
+
+<xsl:template match="article/title|article/articleinfo/title" mode="titlepage.mode" priority="2">
+ <xsl:call-template name="component.title">
+ <xsl:with-param name="node" select="ancestor::article[1]"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="article/subtitle |article/articleinfo/subtitle |article/info/subtitle |article/artheader/subtitle" mode="titlepage.mode" priority="2">
+ <xsl:call-template name="component.subtitle">
+ <xsl:with-param name="node" select="ancestor::article[1]"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="article/artheader|article/articleinfo"/>
+<xsl:template match="article/info"/>
+<xsl:template match="article/title"/>
+<xsl:template match="article/titleabbrev"/>
+<xsl:template match="article/subtitle"/>
+
+<!-- ==================================================================== -->
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/division.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/division.xsl
new file mode 100644
index 0000000..5002fe5
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/division.xsl
@@ -0,0 +1,217 @@
+<?xml version="1.0" encoding="ASCII"?>
+<!--This file was created automatically by html2xhtml-->
+<!--from the HTML stylesheets.-->
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1999/xhtml" version="1.0">
+
+<!-- ********************************************************************
+ $Id: division.xsl 8421 2009-05-04 07:49:49Z bobstayton $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<!-- ==================================================================== -->
+
+<xsl:template match="set">
+ <xsl:call-template name="id.warning"/>
+
+ <div>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:call-template name="dir">
+ <xsl:with-param name="inherit" select="1"/>
+ </xsl:call-template>
+ <xsl:call-template name="xml.language.attribute"/>
+ <xsl:if test="$generate.id.attributes != 0">
+ <xsl:attribute name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:call-template name="set.titlepage"/>
+
+ <xsl:variable name="toc.params">
+ <xsl:call-template name="find.path.params">
+ <xsl:with-param name="table" select="normalize-space($generate.toc)"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:call-template name="make.lots">
+ <xsl:with-param name="toc.params" select="$toc.params"/>
+ <xsl:with-param name="toc">
+ <xsl:call-template name="set.toc">
+ <xsl:with-param name="toc.title.p" select="contains($toc.params, 'title')"/>
+ </xsl:call-template>
+ </xsl:with-param>
+ </xsl:call-template>
+
+ <xsl:apply-templates/>
+ </div>
+</xsl:template>
+
+<xsl:template match="set/setinfo"/>
+<xsl:template match="set/title"/>
+<xsl:template match="set/titleabbrev"/>
+<xsl:template match="set/subtitle"/>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="book">
+ <xsl:call-template name="id.warning"/>
+
+ <div>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:if test="$generate.id.attributes != 0">
+ <xsl:attribute name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:call-template name="book.titlepage"/>
+
+ <xsl:apply-templates select="dedication" mode="dedication"/>
+ <xsl:apply-templates select="acknowledgements" mode="acknowledgements"/>
+
+ <xsl:variable name="toc.params">
+ <xsl:call-template name="find.path.params">
+ <xsl:with-param name="table" select="normalize-space($generate.toc)"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:call-template name="make.lots">
+ <xsl:with-param name="toc.params" select="$toc.params"/>
+ <xsl:with-param name="toc">
+ <xsl:call-template name="division.toc">
+ <xsl:with-param name="toc.title.p" select="contains($toc.params, 'title')"/>
+ </xsl:call-template>
+ </xsl:with-param>
+ </xsl:call-template>
+
+ <xsl:apply-templates/>
+ </div>
+</xsl:template>
+
+<xsl:template match="book/bookinfo"/>
+<xsl:template match="book/info"/>
+<xsl:template match="book/title"/>
+<xsl:template match="book/titleabbrev"/>
+<xsl:template match="book/subtitle"/>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="part">
+ <xsl:call-template name="id.warning"/>
+
+ <div>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:if test="$generate.id.attributes != 0">
+ <xsl:attribute name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:call-template name="part.titlepage"/>
+
+ <xsl:variable name="toc.params">
+ <xsl:call-template name="find.path.params">
+ <xsl:with-param name="table" select="normalize-space($generate.toc)"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:if test="not(partintro) and contains($toc.params, 'toc')">
+ <xsl:call-template name="division.toc"/>
+ </xsl:if>
+ <xsl:apply-templates/>
+ </div>
+</xsl:template>
+
+<xsl:template match="part" mode="make.part.toc">
+ <xsl:call-template name="division.toc"/>
+</xsl:template>
+
+<xsl:template match="reference" mode="make.part.toc">
+ <xsl:call-template name="division.toc"/>
+</xsl:template>
+
+<xsl:template match="part/docinfo"/>
+<xsl:template match="part/partinfo"/>
+<xsl:template match="part/info"/>
+<xsl:template match="part/title"/>
+<xsl:template match="part/titleabbrev"/>
+<xsl:template match="part/subtitle"/>
+
+<xsl:template match="partintro">
+ <xsl:call-template name="id.warning"/>
+
+ <div>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:if test="$generate.id.attributes != 0">
+ <xsl:attribute name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:call-template name="partintro.titlepage"/>
+ <xsl:apply-templates/>
+
+ <xsl:variable name="toc.params">
+ <xsl:call-template name="find.path.params">
+ <xsl:with-param name="node" select="parent::*"/>
+ <xsl:with-param name="table" select="normalize-space($generate.toc)"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:if test="contains($toc.params, 'toc')">
+ <!-- not ancestor::part because partintro appears in reference -->
+ <xsl:apply-templates select="parent::*" mode="make.part.toc"/>
+ </xsl:if>
+ <xsl:call-template name="process.footnotes"/>
+ </div>
+</xsl:template>
+
+<xsl:template match="partintro/title"/>
+<xsl:template match="partintro/titleabbrev"/>
+<xsl:template match="partintro/subtitle"/>
+
+<xsl:template match="partintro/title" mode="partintro.title.mode">
+ <h2>
+ <xsl:apply-templates/>
+ </h2>
+</xsl:template>
+
+<xsl:template match="partintro/subtitle" mode="partintro.title.mode">
+ <h3>
+ <em xmlns:xslo="http://www.w3.org/1999/XSL/Transform"><xsl:apply-templates/></em>
+ </h3>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="book" mode="division.number">
+ <xsl:number from="set" count="book" format="1."/>
+</xsl:template>
+
+<xsl:template match="part" mode="division.number">
+ <xsl:number from="book" count="part" format="I."/>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template name="division.title">
+ <xsl:param name="node" select="."/>
+
+ <h1>
+ <xsl:attribute name="class">title</xsl:attribute>
+ <xsl:if test="$generate.id.attributes = 0">
+ <xsl:call-template name="anchor">
+ <xsl:with-param name="node" select="$node"/>
+ <xsl:with-param name="conditional" select="0"/>
+ </xsl:call-template>
+ </xsl:if>
+ <xsl:apply-templates select="$node" mode="object.title.markup">
+ <xsl:with-param name="allow-anchors" select="1"/>
+ </xsl:apply-templates>
+ </h1>
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/docbook.css.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/docbook.css.xml
new file mode 100644
index 0000000..d93a25c
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/docbook.css.xml
@@ -0,0 +1,109 @@
+<?xml version="1.0"?>
+<style>
+
+/********************************/
+/* start of styles in block.xsl */
+
+.formalpara-title {
+ font-weight: bold;
+}
+
+div.blockquote-title {
+ font-weight: bold;
+ margin-top: 1em;
+ margin-bottom: 1em;
+}
+
+span.msgmain-title {
+ font-weight: bold;
+}
+
+span.msgsub-title {
+ font-weight: bold;
+}
+
+span.msgrel-title {
+ font-weight: bold;
+}
+
+div.msglevel, div.msgorig, div.msgaud {
+ margin-top: 1em;
+ margin-bottom: 1em;
+}
+
+span.msglevel-title, span.msgorig-title, span.msgaud-title {
+ font-weight: bold;
+}
+
+div.msgexplan {
+ margin-top: 1em;
+ margin-bottom: 1em;
+}
+
+span.msgexplan-title {
+ font-weight: bold;
+}
+
+/* end of styles in block.xsl */
+/********************************/
+
+/********************************/
+/* start of styles in autotoc.xsl */
+
+ font-weight: bold;
+ margin-top: 1em;
+ margin-bottom: 1em;
+}
+
+
+/* end of styles in autotoc.xsl */
+/********************************/
+
+/********************************/
+/* start of styles in formal.xsl */
+
+div.figure-title {
+ font-weight: bold;
+}
+
+div.example-title {
+ font-weight: bold;
+}
+
+div.equation-title {
+ font-weight: bold;
+}
+
+div.table-title {
+ font-weight: bold;
+}
+
+div.sidebar-title {
+ font-weight: bold;
+}
+
+
+/* end of styles in formal.xsl */
+/********************************/
+
+/********************************/
+/* start of styles in verbatim.xsl */
+
+div.programlisting {
+ white-space: pre;
+ font-family: monospace;
+}
+
+div.screen {
+ white-space: pre;
+ font-family: monospace;
+}
+
+div.synopsis {
+ white-space: pre;
+ font-family: monospace;
+}
+
+/* end of styles in verbatim.xsl */
+/********************************/
+</style>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/docbook.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/docbook.xsl
new file mode 100644
index 0000000..84a4e17
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/docbook.xsl
@@ -0,0 +1,446 @@
+<?xml version="1.0" encoding="ASCII"?>
+<!--This file was created automatically by html2xhtml-->
+<!--from the HTML stylesheets.-->
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ng="http://docbook.org/docbook-ng" xmlns:db="http://docbook.org/ns/docbook" xmlns:exsl="http://exslt.org/common" xmlns:exslt="http://exslt.org/common" xmlns="http://www.w3.org/1999/xhtml" exclude-result-prefixes="db ng exsl exslt" version="1.0">
+
+<xsl:output method="xml" encoding="UTF-8" indent="no" doctype-public="-//W3C//DTD XHTML 1.1//EN" doctype-system="http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"/>
+
+<!-- ********************************************************************
+ $Id: docbook.xsl 8783 2010-07-28 10:59:39Z mzjn $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<!-- ==================================================================== -->
+
+<xsl:include href="../VERSION"/>
+<xsl:include href="param.xsl"/>
+<xsl:include href="../lib/lib.xsl"/>
+<xsl:include href="../common/l10n.xsl"/>
+<xsl:include href="../common/common.xsl"/>
+<xsl:include href="../common/utility.xsl"/>
+<xsl:include href="../common/labels.xsl"/>
+<xsl:include href="../common/titles.xsl"/>
+<xsl:include href="../common/subtitles.xsl"/>
+<xsl:include href="../common/gentext.xsl"/>
+<xsl:include href="../common/targets.xsl"/>
+<xsl:include href="../common/olink.xsl"/>
+<xsl:include href="../common/pi.xsl"/>
+<xsl:include href="autotoc.xsl"/>
+<xsl:include href="autoidx.xsl"/>
+<xsl:include href="lists.xsl"/>
+<xsl:include href="callout.xsl"/>
+<xsl:include href="verbatim.xsl"/>
+<xsl:include href="graphics.xsl"/>
+<xsl:include href="xref.xsl"/>
+<xsl:include href="formal.xsl"/>
+<xsl:include href="table.xsl"/>
+<xsl:include href="htmltbl.xsl"/>
+<xsl:include href="sections.xsl"/>
+<xsl:include href="inline.xsl"/>
+<xsl:include href="footnote.xsl"/>
+<xsl:include href="html.xsl"/>
+<xsl:include href="info.xsl"/>
+<xsl:include href="keywords.xsl"/>
+<xsl:include href="division.xsl"/>
+<xsl:include href="toc.xsl"/>
+<xsl:include href="index.xsl"/>
+<xsl:include href="refentry.xsl"/>
+<xsl:include href="math.xsl"/>
+<xsl:include href="admon.xsl"/>
+<xsl:include href="component.xsl"/>
+<xsl:include href="biblio.xsl"/>
+<xsl:include href="biblio-iso690.xsl"/>
+<xsl:include href="glossary.xsl"/>
+<xsl:include href="block.xsl"/>
+<xsl:include href="task.xsl"/>
+<xsl:include href="qandaset.xsl"/>
+<xsl:include href="synop.xsl"/>
+<xsl:include href="titlepage.xsl"/>
+<xsl:include href="titlepage.templates.xsl"/>
+<xsl:include href="pi.xsl"/>
+<xsl:include href="ebnf.xsl"/>
+<xsl:include href="chunker.xsl"/>
+<xsl:include href="html-rtf.xsl"/>
+<xsl:include href="annotations.xsl"/>
+<xsl:include href="../common/stripns.xsl"/>
+
+<xsl:param name="stylesheet.result.type" select="'xhtml'"/>
+<xsl:param name="htmlhelp.output" select="0"/>
+
+<!-- ==================================================================== -->
+
+<xsl:key name="id" match="*" use="@id|@xml:id"/>
+<xsl:key name="gid" match="*" use="generate-id()"/>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="*">
+ <xsl:message>
+ <xsl:text>Element </xsl:text>
+ <xsl:value-of select="local-name(.)"/>
+ <xsl:text> in namespace '</xsl:text>
+ <xsl:value-of select="namespace-uri(.)"/>
+ <xsl:text>' encountered</xsl:text>
+ <xsl:if test="parent::*">
+ <xsl:text> in </xsl:text>
+ <xsl:value-of select="name(parent::*)"/>
+ </xsl:if>
+ <xsl:text>, but no template matches.</xsl:text>
+ </xsl:message>
+
+ <span style="color: red">
+ <xsl:text>&lt;</xsl:text>
+ <xsl:value-of select="name(.)"/>
+ <xsl:text>&gt;</xsl:text>
+ <xsl:apply-templates/>
+ <xsl:text>&lt;/</xsl:text>
+ <xsl:value-of select="name(.)"/>
+ <xsl:text>&gt;</xsl:text>
+ </span>
+</xsl:template>
+
+<xsl:template match="text()">
+ <xsl:value-of select="."/>
+</xsl:template>
+
+<xsl:template name="body.attributes">
+<!-- no apply-templates; make it empty -->
+</xsl:template>
+
+<xsl:template name="head.content">
+ <xsl:param name="node" select="."/>
+ <xsl:param name="title">
+ <xsl:apply-templates select="$node" mode="object.title.markup.textonly"/>
+ </xsl:param>
+
+ <title>
+ <xsl:copy-of select="$title"/>
+ </title>
+
+ <xsl:if test="$html.base != ''">
+ <base href="{$html.base}"/>
+ </xsl:if>
+
+ <!-- Insert links to CSS files or insert literal style elements -->
+ <xsl:call-template name="generate.css"/>
+
+ <xsl:if test="$html.stylesheet != ''">
+ <xsl:call-template name="output.html.stylesheets">
+ <xsl:with-param name="stylesheets" select="normalize-space($html.stylesheet)"/>
+ </xsl:call-template>
+ </xsl:if>
+
+ <xsl:if test="$link.mailto.url != ''">
+ <link rev="made" href="{$link.mailto.url}"/>
+ </xsl:if>
+
+ <meta name="generator" content="DocBook {$DistroTitle} V{$VERSION}"/>
+
+ <xsl:if test="$generate.meta.abstract != 0">
+ <xsl:variable name="info" select="(articleinfo |bookinfo |prefaceinfo |chapterinfo |appendixinfo |sectioninfo |sect1info |sect2info |sect3info |sect4info |sect5info |referenceinfo |refentryinfo |partinfo |info |docinfo)[1]"/>
+ <xsl:if test="$info and $info/abstract">
+ <meta name="description">
+ <xsl:attribute name="content">
+ <xsl:for-each select="$info/abstract[1]/*">
+ <xsl:value-of select="normalize-space(.)"/>
+ <xsl:if test="position() &lt; last()">
+ <xsl:text> </xsl:text>
+ </xsl:if>
+ </xsl:for-each>
+ </xsl:attribute>
+ </meta>
+ </xsl:if>
+ </xsl:if>
+
+ <xsl:if test="($draft.mode = 'yes' or ($draft.mode = 'maybe' and ancestor-or-self::*[@status][1]/@status = 'draft')) and $draft.watermark.image != ''">
+ <style type="text/css"><xsl:text>
+body { background-image: url('</xsl:text>
+<xsl:value-of select="$draft.watermark.image"/><xsl:text>');
+ background-repeat: no-repeat;
+ background-position: top left;
+ /* The following properties make the watermark "fixed" on the page. */
+ /* I think that's just a bit too distracting for the reader... */
+ /* background-attachment: fixed; */
+ /* background-position: center center; */
+ }</xsl:text>
+ </style>
+ </xsl:if>
+ <xsl:apply-templates select="." mode="head.keywords.content"/>
+</xsl:template>
+
+<xsl:template name="output.html.stylesheets">
+ <xsl:param name="stylesheets" select="''"/>
+
+ <xsl:choose>
+ <xsl:when test="contains($stylesheets, ' ')">
+ <xsl:variable name="css.filename" select="substring-before($stylesheets, ' ')"/>
+
+ <xsl:call-template name="make.css.link">
+ <xsl:with-param name="css.filename" select="$css.filename"/>
+ </xsl:call-template>
+
+ <xsl:call-template name="output.html.stylesheets">
+ <xsl:with-param name="stylesheets" select="substring-after($stylesheets, ' ')"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="$stylesheets != ''">
+ <xsl:call-template name="make.css.link">
+ <xsl:with-param name="css.filename" select="$stylesheets"/>
+ </xsl:call-template>
+ </xsl:when>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ============================================================ -->
+
+<xsl:template match="*" mode="head.keywords.content">
+ <xsl:apply-templates select="chapterinfo/keywordset" mode="html.header"/>
+ <xsl:apply-templates select="appendixinfo/keywordset" mode="html.header"/>
+ <xsl:apply-templates select="prefaceinfo/keywordset" mode="html.header"/>
+ <xsl:apply-templates select="bookinfo/keywordset" mode="html.header"/>
+ <xsl:apply-templates select="setinfo/keywordset" mode="html.header"/>
+ <xsl:apply-templates select="articleinfo/keywordset" mode="html.header"/>
+ <xsl:apply-templates select="artheader/keywordset" mode="html.header"/>
+ <xsl:apply-templates select="sect1info/keywordset" mode="html.header"/>
+ <xsl:apply-templates select="sect2info/keywordset" mode="html.header"/>
+ <xsl:apply-templates select="sect3info/keywordset" mode="html.header"/>
+ <xsl:apply-templates select="sect4info/keywordset" mode="html.header"/>
+ <xsl:apply-templates select="sect5info/keywordset" mode="html.header"/>
+ <xsl:apply-templates select="sectioninfo/keywordset" mode="html.header"/>
+ <xsl:apply-templates select="refsect1info/keywordset" mode="html.header"/>
+ <xsl:apply-templates select="refsect2info/keywordset" mode="html.header"/>
+ <xsl:apply-templates select="refsect3info/keywordset" mode="html.header"/>
+ <xsl:apply-templates select="bibliographyinfo/keywordset" mode="html.header"/>
+ <xsl:apply-templates select="glossaryinfo/keywordset" mode="html.header"/>
+ <xsl:apply-templates select="indexinfo/keywordset" mode="html.header"/>
+ <xsl:apply-templates select="refentryinfo/keywordset" mode="html.header"/>
+ <xsl:apply-templates select="partinfo/keywordset" mode="html.header"/>
+ <xsl:apply-templates select="referenceinfo/keywordset" mode="html.header"/>
+ <xsl:apply-templates select="docinfo/keywordset" mode="html.header"/>
+ <xsl:apply-templates select="info/keywordset" mode="html.header"/>
+
+ <xsl:if test="$inherit.keywords != 0 and parent::*">
+ <xsl:apply-templates select="parent::*" mode="head.keywords.content"/>
+ </xsl:if>
+</xsl:template>
+
+<!-- ============================================================ -->
+
+<xsl:template name="system.head.content">
+ <xsl:param name="node" select="."/>
+
+ <!-- FIXME: When chunking, only the annotations actually used
+ in this chunk should be referenced. I don't think it
+ does any harm to reference them all, but it adds
+ unnecessary bloat to each chunk. -->
+ <xsl:if test="$annotation.support != 0 and //annotation">
+ <xsl:call-template name="add.annotation.links"/>
+ <script type="text/javascript">
+ <xsl:text>
+// Create PopupWindow objects</xsl:text>
+ <xsl:for-each select="//annotation">
+ <xsl:text>
+var popup_</xsl:text>
+ <xsl:value-of select="generate-id(.)"/>
+ <xsl:text> = new PopupWindow("popup-</xsl:text>
+ <xsl:value-of select="generate-id(.)"/>
+ <xsl:text>");
+</xsl:text>
+ <xsl:text>popup_</xsl:text>
+ <xsl:value-of select="generate-id(.)"/>
+ <xsl:text>.offsetY = 15;
+</xsl:text>
+ <xsl:text>popup_</xsl:text>
+ <xsl:value-of select="generate-id(.)"/>
+ <xsl:text>.autoHide();
+</xsl:text>
+ </xsl:for-each>
+ </script>
+
+ <style type="text/css">
+ <xsl:value-of select="$annotation.css"/>
+ </style>
+ </xsl:if>
+
+ <!-- system.head.content is like user.head.content, except that
+ it is called before head.content. This is important because it
+ means, for example, that <style> elements output by system.head.content
+ have a lower CSS precedence than the users stylesheet. -->
+</xsl:template>
+
+<!-- ============================================================ -->
+
+<xsl:template name="user.preroot">
+ <!-- Pre-root output, can be used to output comments and PIs. -->
+ <!-- This must not output any element content! -->
+</xsl:template>
+
+<xsl:template name="user.head.content">
+ <xsl:param name="node" select="."/>
+</xsl:template>
+
+<xsl:template name="user.header.navigation">
+ <xsl:param name="node" select="."/>
+</xsl:template>
+
+<xsl:template name="user.header.content">
+ <xsl:param name="node" select="."/>
+</xsl:template>
+
+<xsl:template name="user.footer.content">
+ <xsl:param name="node" select="."/>
+</xsl:template>
+
+<xsl:template name="user.footer.navigation">
+ <xsl:param name="node" select="."/>
+</xsl:template>
+
+<xsl:template match="/">
+ <!-- * Get a title for current doc so that we let the user -->
+ <!-- * know what document we are processing at this point. -->
+ <xsl:variable name="doc.title">
+ <xsl:call-template name="get.doc.title"/>
+ </xsl:variable>
+ <xsl:choose>
+ <!-- Hack! If someone hands us a DocBook V5.x or DocBook NG document,
+ toss the namespace and continue. Use the docbook5 namespaced
+ stylesheets for DocBook5 if you don't want to use this feature.-->
+ <!-- include extra test for Xalan quirk -->
+ <xsl:when test="$exsl.node.set.available != 0 and (*/self::ng:* or */self::db:*)">
+ <xsl:call-template name="log.message">
+ <xsl:with-param name="level">Note</xsl:with-param>
+ <xsl:with-param name="source" select="$doc.title"/>
+ <xsl:with-param name="context-desc">
+ <xsl:text>namesp. cut</xsl:text>
+ </xsl:with-param>
+ <xsl:with-param name="message">
+ <xsl:text>stripped namespace before processing</xsl:text>
+ </xsl:with-param>
+ </xsl:call-template>
+ <xsl:variable name="nons">
+ <xsl:apply-templates mode="stripNS"/>
+ </xsl:variable>
+ <!--
+ <xsl:message>Saving stripped document.</xsl:message>
+ <xsl:call-template name="write.chunk">
+ <xsl:with-param name="filename" select="'/tmp/stripped.xml'"/>
+ <xsl:with-param name="method" select="'xml'"/>
+ <xsl:with-param name="content">
+ <xsl:copy-of select="exsl:node-set($nons)"/>
+ </xsl:with-param>
+ </xsl:call-template>
+ -->
+ <xsl:call-template name="log.message">
+ <xsl:with-param name="level">Note</xsl:with-param>
+ <xsl:with-param name="source" select="$doc.title"/>
+ <xsl:with-param name="context-desc">
+ <xsl:text>namesp. cut</xsl:text>
+ </xsl:with-param>
+ <xsl:with-param name="message">
+ <xsl:text>processing stripped document</xsl:text>
+ </xsl:with-param>
+ </xsl:call-template>
+ <xsl:apply-templates select="exsl:node-set($nons)"/>
+ </xsl:when>
+ <!-- Can't process unless namespace removed -->
+ <xsl:when test="*/self::ng:* or */self::db:*">
+ <xsl:message terminate="yes">
+ <xsl:text>Unable to strip the namespace from DB5 document,</xsl:text>
+ <xsl:text> cannot proceed.</xsl:text>
+ </xsl:message>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:choose>
+ <xsl:when test="$rootid != ''">
+ <xsl:choose>
+ <xsl:when test="count(key('id',$rootid)) = 0">
+ <xsl:message terminate="yes">
+ <xsl:text>ID '</xsl:text>
+ <xsl:value-of select="$rootid"/>
+ <xsl:text>' not found in document.</xsl:text>
+ </xsl:message>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:if test="$collect.xref.targets = 'yes' or $collect.xref.targets = 'only'">
+ <xsl:apply-templates select="key('id', $rootid)" mode="collect.targets"/>
+ </xsl:if>
+ <xsl:if test="$collect.xref.targets != 'only'">
+ <xsl:apply-templates select="key('id',$rootid)" mode="process.root"/>
+ <xsl:if test="$tex.math.in.alt != ''">
+ <xsl:apply-templates select="key('id',$rootid)" mode="collect.tex.math"/>
+ </xsl:if>
+ </xsl:if>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:if test="$collect.xref.targets = 'yes' or $collect.xref.targets = 'only'">
+ <xsl:apply-templates select="/" mode="collect.targets"/>
+ </xsl:if>
+ <xsl:if test="$collect.xref.targets != 'only'">
+ <xsl:apply-templates select="/" mode="process.root"/>
+ <xsl:if test="$tex.math.in.alt != ''">
+ <xsl:apply-templates select="/" mode="collect.tex.math"/>
+ </xsl:if>
+ </xsl:if>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="*" mode="process.root">
+ <xsl:variable name="doc" select="self::*"/>
+
+ <xsl:call-template name="user.preroot"/>
+ <xsl:call-template name="root.messages"/>
+
+ <html>
+ <head>
+ <xsl:call-template name="system.head.content">
+ <xsl:with-param name="node" select="$doc"/>
+ </xsl:call-template>
+ <xsl:call-template name="head.content">
+ <xsl:with-param name="node" select="$doc"/>
+ </xsl:call-template>
+ <xsl:call-template name="user.head.content">
+ <xsl:with-param name="node" select="$doc"/>
+ </xsl:call-template>
+ </head>
+ <body>
+ <xsl:call-template name="body.attributes"/>
+ <xsl:call-template name="user.header.content">
+ <xsl:with-param name="node" select="$doc"/>
+ </xsl:call-template>
+ <xsl:apply-templates select="."/>
+ <xsl:call-template name="user.footer.content">
+ <xsl:with-param name="node" select="$doc"/>
+ </xsl:call-template>
+ </body>
+ </html>
+ <xsl:value-of select="$html.append"/>
+
+ <!-- Generate any css files only once, not once per chunk -->
+ <xsl:call-template name="generate.css.files"/>
+</xsl:template>
+
+<xsl:template name="root.messages">
+ <!-- redefine this any way you'd like to output messages -->
+ <!-- DO NOT OUTPUT ANYTHING FROM THIS TEMPLATE -->
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template name="chunk">
+ <xsl:param name="node" select="."/>
+
+ <!-- The default is that we are not chunking... -->
+ <xsl:text>0</xsl:text>
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/ebnf.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/ebnf.xsl
new file mode 100644
index 0000000..85e33ee
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/ebnf.xsl
@@ -0,0 +1,328 @@
+<?xml version="1.0" encoding="ASCII"?>
+<!--This file was created automatically by html2xhtml-->
+<!--from the HTML stylesheets.-->
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:doc="http://nwalsh.com/xsl/documentation/1.0" xmlns="http://www.w3.org/1999/xhtml" exclude-result-prefixes="doc" version="1.0">
+
+<!-- ********************************************************************
+ $Id: ebnf.xsl 8178 2008-12-15 22:26:38Z bobstayton $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<doc:reference xmlns="">
+<referenceinfo xmlns="http://www.w3.org/1999/xhtml">
+<releaseinfo role="meta">
+$Id: ebnf.xsl 8178 2008-12-15 22:26:38Z bobstayton $
+</releaseinfo>
+<author><surname>Walsh</surname>
+<firstname>Norman</firstname></author>
+<copyright><year>1999</year><year>2000</year>
+<holder>Norman Walsh</holder>
+</copyright>
+</referenceinfo>
+<title xmlns="http://www.w3.org/1999/xhtml">HTML EBNF Reference</title>
+
+<partintro xmlns="http://www.w3.org/1999/xhtml">
+<section><title>Introduction</title>
+
+<para>This is technical reference documentation for the DocBook XSL
+Stylesheets; it documents (some of) the parameters, templates, and
+other elements of the stylesheets.</para>
+
+<para>This reference describes the templates and parameters relevant
+to formatting EBNF markup.</para>
+
+<para>This is not intended to be <quote>user</quote> documentation.
+It is provided for developers writing customization layers for the
+stylesheets, and for anyone who's interested in <quote>how it
+works</quote>.</para>
+
+<para>Although I am trying to be thorough, this documentation is known
+to be incomplete. Don't forget to read the source, too :-)</para>
+</section>
+</partintro>
+</doc:reference>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="productionset">
+ <table width="100%" cellpadding="5">
+ <xsl:if test="$ebnf.table.bgcolor != ''">
+ <xsl:attribute name="style"><xsl:text>background-color: </xsl:text>
+ <xsl:value-of select="$ebnf.table.bgcolor"/>
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:if test="$ebnf.table.border != 0">
+ <xsl:attribute name="border">1</xsl:attribute>
+ </xsl:if>
+ <xsl:attribute name="class">
+ <xsl:value-of select="local-name(.)"/>
+ </xsl:attribute>
+ <xsl:attribute name="summary">
+ <xsl:text>EBNF</xsl:text>
+ <xsl:if test="title">
+ <xsl:text> for </xsl:text>
+ <xsl:value-of select="title"/>
+ </xsl:if>
+ </xsl:attribute>
+
+ <xsl:if test="title">
+ <tr>
+ <th align="{$direction.align.start}" valign="top">
+ <xsl:apply-templates select="." mode="class.attribute"/>
+ <xsl:apply-templates select="title"/>
+ </th>
+ </tr>
+ </xsl:if>
+ <tr>
+ <td>
+ <table border="0" width="99%" cellpadding="0">
+ <xsl:if test="$ebnf.table.bgcolor != ''">
+ <xsl:attribute name="style"><xsl:text>background-color: </xsl:text>
+ <xsl:value-of select="$ebnf.table.bgcolor"/>
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:attribute name="class">
+ <xsl:value-of select="local-name(.)"/>
+ </xsl:attribute>
+ <xsl:attribute name="summary">EBNF productions</xsl:attribute>
+ <xsl:apply-templates select="production|productionrecap"/>
+ </table>
+ </td>
+ </tr>
+ </table>
+</xsl:template>
+
+<xsl:template match="productionset/title">
+ <xsl:apply-templates/>
+</xsl:template>
+
+<xsl:template match="production">
+ <xsl:param name="recap" select="false()"/>
+ <tr>
+ <td align="{$direction.align.start}" valign="top">
+ <xsl:text>[</xsl:text>
+ <xsl:number count="production" level="any"/>
+ <xsl:text>]</xsl:text>
+ </td>
+ <td align="{$direction.align.end}" valign="top">
+ <xsl:choose>
+ <xsl:when test="$recap">
+ <a>
+ <xsl:attribute name="href">
+ <xsl:call-template name="href.target">
+ <xsl:with-param name="object" select="."/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:apply-templates select="lhs"/>
+ </a>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="anchor"/>
+ <xsl:apply-templates select="lhs"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </td>
+ <td valign="top" align="center">
+ <xsl:copy-of select="$ebnf.assignment"/>
+ </td>
+ <td valign="top">
+ <xsl:apply-templates select="rhs"/>
+ <xsl:copy-of select="$ebnf.statement.terminator"/>
+ </td>
+ <td align="{$direction.align.start}" valign="top">
+ <xsl:choose>
+ <xsl:when test="rhs/lineannotation|constraint">
+ <xsl:apply-templates select="rhs/lineannotation" mode="rhslo"/>
+ <xsl:apply-templates select="constraint"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text>&#160;</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ </td>
+ </tr>
+</xsl:template>
+
+<xsl:template match="productionrecap">
+ <xsl:variable name="targets" select="key('id',@linkend)"/>
+ <xsl:variable name="target" select="$targets[1]"/>
+
+ <xsl:if test="count($targets)=0">
+ <xsl:message>
+ <xsl:text>Error: no ID for productionrecap linkend: </xsl:text>
+ <xsl:value-of select="@linkend"/>
+ <xsl:text>.</xsl:text>
+ </xsl:message>
+ </xsl:if>
+
+ <xsl:if test="count($targets)&gt;1">
+ <xsl:message>
+ <xsl:text>Warning: multiple "IDs" for productionrecap linkend: </xsl:text>
+ <xsl:value-of select="@linkend"/>
+ <xsl:text>.</xsl:text>
+ </xsl:message>
+ </xsl:if>
+
+ <xsl:apply-templates select="$target">
+ <xsl:with-param name="recap" select="true()"/>
+ </xsl:apply-templates>
+</xsl:template>
+
+<xsl:template match="lhs">
+ <xsl:apply-templates/>
+</xsl:template>
+
+<xsl:template match="rhs">
+ <xsl:apply-templates/>
+ <xsl:if test="following-sibling::rhs">
+ <xsl:text> |</xsl:text>
+ <br/>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="nonterminal">
+ <xsl:variable name="linkend">
+ <xsl:call-template name="xpointer.idref">
+ <xsl:with-param name="xpointer" select="@def"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:call-template name="check.id.unique">
+ <xsl:with-param name="linkend" select="$linkend"/>
+ </xsl:call-template>
+
+ <xsl:call-template name="check.idref.targets">
+ <xsl:with-param name="linkend" select="$linkend"/>
+ <xsl:with-param name="element-list">production</xsl:with-param>
+ </xsl:call-template>
+
+ <!-- If you don't provide content, you can't point outside this doc. -->
+ <xsl:choose>
+ <xsl:when test="*|text()"><!--nop--></xsl:when>
+ <xsl:otherwise>
+ <xsl:if test="$linkend = ''">
+ <xsl:message>
+ <xsl:text>Non-terminals with no content must point to </xsl:text>
+ <xsl:text>production elements in the current document.</xsl:text>
+ </xsl:message>
+ <xsl:message>
+ <xsl:text>Invalid xpointer for empty nt: </xsl:text>
+ <xsl:value-of select="@def"/>
+ </xsl:message>
+ </xsl:if>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:variable name="href">
+ <xsl:choose>
+ <xsl:when test="$linkend != ''">
+ <xsl:variable name="targets" select="key('id',$linkend)"/>
+ <xsl:variable name="target" select="$targets[1]"/>
+ <xsl:call-template name="href.target">
+ <xsl:with-param name="object" select="$target"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="@def"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <a href="{$href}">
+ <xsl:choose>
+ <xsl:when test="*|text()">
+ <xsl:apply-templates/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:choose>
+ <xsl:when test="$linkend != ''">
+ <xsl:variable name="targets" select="key('id',$linkend)"/>
+ <xsl:variable name="target" select="$targets[1]"/>
+ <xsl:apply-templates select="$target/lhs"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text>???</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+ </a>
+</xsl:template>
+
+<xsl:template match="rhs/lineannotation">
+ <!--nop-->
+</xsl:template>
+
+<xsl:template match="rhs/lineannotation" mode="rhslo">
+ <xsl:text>/*&#160;</xsl:text>
+ <xsl:apply-templates/>
+ <xsl:text>&#160;*/</xsl:text>
+ <br/>
+</xsl:template>
+
+<xsl:template match="constraint">
+ <xsl:call-template name="check.id.unique">
+ <xsl:with-param name="linkend" select="@linkend"/>
+ </xsl:call-template>
+
+ <xsl:call-template name="check.idref.targets">
+ <xsl:with-param name="linkend" select="@linkend"/>
+ <xsl:with-param name="element-list">constraintdef</xsl:with-param>
+ </xsl:call-template>
+
+ <xsl:variable name="href">
+ <xsl:variable name="targets" select="key('id',@linkend)"/>
+ <xsl:variable name="target" select="$targets[1]"/>
+ <xsl:call-template name="href.target">
+ <xsl:with-param name="object" select="$target"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:text>[&#160;</xsl:text>
+
+ <xsl:choose>
+ <xsl:when test="@role">
+ <xsl:value-of select="@role"/>
+ <xsl:text>: </xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:variable name="targets" select="key('id',@linkend)"/>
+ <xsl:variable name="target" select="$targets[1]"/>
+ <xsl:if test="$target/@role">
+ <xsl:value-of select="$target/@role"/>
+ <xsl:text>: </xsl:text>
+ </xsl:if>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <a href="{$href}">
+ <xsl:variable name="targets" select="key('id',@linkend)"/>
+ <xsl:variable name="target" select="$targets[1]"/>
+ <xsl:apply-templates select="$target" mode="title.markup"/>
+ </a>
+ <xsl:text>&#160;]</xsl:text>
+ <xsl:if test="following-sibling::constraint">
+ <br/>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="constraintdef">
+ <div>
+ <xsl:apply-templates select="." mode="class.attribute"/>
+ <xsl:call-template name="anchor"/>
+ <xsl:apply-templates/>
+ </div>
+</xsl:template>
+
+<xsl:template match="constraintdef/title">
+ <p><strong xmlns:xslo="http://www.w3.org/1999/XSL/Transform"><xsl:apply-templates/></strong></p>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/footnote.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/footnote.xsl
new file mode 100644
index 0000000..8da2720
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/footnote.xsl
@@ -0,0 +1,305 @@
+<?xml version="1.0" encoding="ASCII"?>
+<!--This file was created automatically by html2xhtml-->
+<!--from the HTML stylesheets.-->
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:exsl="http://exslt.org/common" xmlns="http://www.w3.org/1999/xhtml" exclude-result-prefixes="exsl" version="1.0">
+
+<!-- ********************************************************************
+ $Id: footnote.xsl 8812 2010-08-09 20:51:51Z bobstayton $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<xsl:template match="footnote">
+ <xsl:variable name="name">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+ <xsl:variable name="href">
+ <xsl:text>#ftn.</xsl:text>
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="ancestor::table or ancestor::informaltable">
+ <sup>
+ <xsl:text>[</xsl:text>
+ <a id="{$name}" href="{$href}">
+ <xsl:apply-templates select="." mode="class.attribute"/>
+ <xsl:apply-templates select="." mode="footnote.number"/>
+ </a>
+ <xsl:text>]</xsl:text>
+ </sup>
+ </xsl:when>
+ <xsl:otherwise>
+ <sup>
+ <xsl:text>[</xsl:text>
+ <a id="{$name}" href="{$href}">
+ <xsl:apply-templates select="." mode="class.attribute"/>
+ <xsl:apply-templates select="." mode="footnote.number"/>
+ </a>
+ <xsl:text>]</xsl:text>
+ </sup>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="footnoteref">
+ <xsl:variable name="targets" select="key('id',@linkend)"/>
+ <xsl:variable name="footnote" select="$targets[1]"/>
+
+ <xsl:if test="not(local-name($footnote) = 'footnote')">
+ <xsl:message terminate="yes">
+ERROR: A footnoteref element has a linkend that points to an element that is not a footnote.
+Typically this happens when an id attribute is accidentally applied to the child of a footnote element.
+target element: <xsl:value-of select="local-name($footnote)"/>
+linkend/id: <xsl:value-of select="@linkend"/>
+ </xsl:message>
+ </xsl:if>
+
+ <xsl:variable name="target.href">
+ <xsl:call-template name="href.target">
+ <xsl:with-param name="object" select="$footnote"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="href">
+ <xsl:value-of select="substring-before($target.href, '#')"/>
+ <xsl:text>#ftn.</xsl:text>
+ <xsl:value-of select="substring-after($target.href, '#')"/>
+ </xsl:variable>
+
+ <sup>
+ <xsl:text>[</xsl:text>
+ <a href="{$href}">
+ <xsl:apply-templates select="." mode="class.attribute"/>
+ <xsl:apply-templates select="$footnote" mode="footnote.number"/>
+ </a>
+ <xsl:text>]</xsl:text>
+ </sup>
+</xsl:template>
+
+<xsl:template match="footnote" mode="footnote.number">
+ <xsl:choose>
+ <xsl:when test="string-length(@label) != 0">
+ <xsl:value-of select="@label"/>
+ </xsl:when>
+ <xsl:when test="ancestor::table or ancestor::informaltable">
+ <xsl:variable name="tfnum">
+ <xsl:number level="any" from="table|informaltable" format="1"/>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="string-length($table.footnote.number.symbols) &gt;= $tfnum">
+ <xsl:value-of select="substring($table.footnote.number.symbols, $tfnum, 1)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:number level="any" from="table | informaltable" format="{$table.footnote.number.format}"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:variable name="pfoot" select="preceding::footnote[not(@label)]"/>
+ <xsl:variable name="ptfoot" select="preceding::table//footnote | preceding::informaltable//footnote"/>
+ <xsl:variable name="fnum" select="count($pfoot) - count($ptfoot) + 1"/>
+
+ <xsl:choose>
+ <xsl:when test="string-length($footnote.number.symbols) &gt;= $fnum">
+ <xsl:value-of select="substring($footnote.number.symbols, $fnum, 1)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:number value="$fnum" format="{$footnote.number.format}"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="footnote/para[1]|footnote/simpara[1]" priority="2">
+ <!-- this only works if the first thing in a footnote is a para, -->
+ <!-- which is ok, because it usually is. -->
+ <xsl:variable name="name">
+ <xsl:text>ftn.</xsl:text>
+ <xsl:call-template name="object.id">
+ <xsl:with-param name="object" select="ancestor::footnote"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:variable name="href">
+ <xsl:text>#</xsl:text>
+ <xsl:call-template name="object.id">
+ <xsl:with-param name="object" select="ancestor::footnote"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:call-template name="paragraph">
+ <xsl:with-param name="class">
+ <xsl:if test="@role and $para.propagates.style != 0">
+ <xsl:value-of select="@role"/>
+ </xsl:if>
+ </xsl:with-param>
+ <xsl:with-param name="content">
+ <sup>
+ <xsl:text>[</xsl:text>
+ <a id="{$name}" href="{$href}">
+ <xsl:apply-templates select="." mode="class.attribute"/>
+ <xsl:apply-templates select="ancestor::footnote" mode="footnote.number"/>
+ </a>
+ <xsl:text>] </xsl:text>
+ </sup>
+ <xsl:apply-templates/>
+ </xsl:with-param>
+ </xsl:call-template>
+
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="*" mode="footnote.body.number">
+ <xsl:variable name="name">
+ <xsl:text>ftn.</xsl:text>
+ <xsl:call-template name="object.id">
+ <xsl:with-param name="object" select="ancestor::footnote"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:variable name="href">
+ <xsl:text>#</xsl:text>
+ <xsl:call-template name="object.id">
+ <xsl:with-param name="object" select="ancestor::footnote"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:variable name="footnote.mark">
+ <sup>
+ <xsl:text>[</xsl:text>
+ <a id="{$name}" href="{$href}">
+ <xsl:apply-templates select="." mode="class.attribute"/>
+ <xsl:apply-templates select="ancestor::footnote" mode="footnote.number"/>
+ </a>
+ <xsl:text>] </xsl:text>
+ </sup>
+ </xsl:variable>
+
+ <xsl:variable name="html">
+ <xsl:apply-templates select="."/>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="$exsl.node.set.available != 0">
+ <xsl:variable name="html-nodes" select="exsl:node-set($html)"/>
+ <xsl:choose>
+ <xsl:when test="$html-nodes//p">
+ <xsl:apply-templates select="$html-nodes" mode="insert.html.p">
+ <xsl:with-param name="mark" select="$footnote.mark"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="$html-nodes" mode="insert.html.text">
+ <xsl:with-param name="mark" select="$footnote.mark"/>
+ </xsl:apply-templates>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:copy-of select="$html"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<!--
+<xsl:template name="count-element-from">
+ <xsl:param name="from" select=".."/>
+ <xsl:param name="to" select="."/>
+ <xsl:param name="count" select="0"/>
+ <xsl:param name="list" select="$from/following::*[local-name(.)=local-name($to)]
+ |$from/descendant-or-self::*[local-name(.)=local-name($to)]"/>
+
+ <xsl:choose>
+ <xsl:when test="not($list)">
+ <xsl:text>-1</xsl:text>
+ </xsl:when>
+ <xsl:when test="$list[1] = $to">
+ <xsl:value-of select="$count + 1"/>
+ </xsl:when>
+ <xsl:otherwise>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+-->
+
+<!-- ==================================================================== -->
+
+<xsl:template name="process.footnotes">
+ <xsl:variable name="footnotes" select=".//footnote"/>
+ <xsl:variable name="table.footnotes" select=".//table//footnote | .//informaltable//footnote"/>
+
+ <!-- Only bother to do this if there's at least one non-table footnote -->
+ <xsl:if test="count($footnotes)&gt;count($table.footnotes)">
+ <div class="footnotes">
+ <br/>
+ <hr/>
+ <xsl:apply-templates select="$footnotes" mode="process.footnote.mode"/>
+ </div>
+ </xsl:if>
+
+ <xsl:if test="$annotation.support != 0 and //annotation">
+ <div class="annotation-list">
+ <div class="annotation-nocss">
+ <p>The following annotations are from this essay. You are seeing
+ them here because your browser doesn&#8217;t support the user-interface
+ techniques used to make them appear as &#8216;popups&#8217; on modern browsers.</p>
+ </div>
+
+ <xsl:apply-templates select="//annotation" mode="annotation-popup"/>
+ </div>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template name="process.chunk.footnotes">
+ <!-- nop -->
+</xsl:template>
+
+<xsl:template match="footnote" name="process.footnote" mode="process.footnote.mode">
+ <xsl:choose>
+ <xsl:when test="local-name(*[1]) = 'para' or local-name(*[1]) = 'simpara'">
+ <div>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates/>
+ </div>
+ </xsl:when>
+
+ <xsl:when test="$html.cleanup != 0 and $exsl.node.set.available != 0">
+ <div>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates select="*[1]" mode="footnote.body.number"/>
+ <xsl:apply-templates select="*[position() &gt; 1]"/>
+ </div>
+ </xsl:when>
+
+ <xsl:otherwise>
+ <xsl:message>
+ <xsl:text>Warning: footnote number may not be generated </xsl:text>
+ <xsl:text>correctly; </xsl:text>
+ <xsl:value-of select="local-name(*[1])"/>
+ <xsl:text> unexpected as first child of footnote.</xsl:text>
+ </xsl:message>
+ <div>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates/>
+ </div>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="table//footnote | informaltable//footnote" mode="process.footnote.mode">
+</xsl:template>
+
+<xsl:template match="footnote" mode="table.footnote.mode">
+ <xsl:call-template name="process.footnote"/>
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/formal.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/formal.xsl
new file mode 100644
index 0000000..57c98f3
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/formal.xsl
@@ -0,0 +1,411 @@
+<?xml version="1.0" encoding="ASCII"?>
+<!--This file was created automatically by html2xhtml-->
+<!--from the HTML stylesheets.-->
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1999/xhtml" version="1.0">
+
+<!-- ********************************************************************
+ $Id: formal.xsl 8806 2010-08-09 18:25:58Z bobstayton $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<xsl:param name="formal.object.break.after">1</xsl:param>
+
+<xsl:template name="formal.object">
+ <xsl:param name="placement" select="'before'"/>
+ <xsl:param name="class">
+ <xsl:apply-templates select="." mode="class.value"/>
+ </xsl:param>
+
+ <xsl:call-template name="id.warning"/>
+
+ <xsl:variable name="content">
+ <div class="{$class}">
+ <xsl:call-template name="anchor">
+ <xsl:with-param name="conditional" select="0"/>
+ </xsl:call-template>
+
+ <xsl:choose>
+ <xsl:when test="$placement = 'before'">
+ <xsl:call-template name="formal.object.heading"/>
+ <div class="{$class}-contents">
+ <xsl:apply-templates/>
+ </div>
+ <!-- HACK: This doesn't belong inside formal.object; it
+ should be done by the table template, but I want
+ the link to be inside the DIV, so... -->
+ <xsl:if test="local-name(.) = 'table'">
+ <xsl:call-template name="table.longdesc"/>
+ </xsl:if>
+
+ <xsl:if test="$spacing.paras != 0"><p/></xsl:if>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:if test="$spacing.paras != 0"><p/></xsl:if>
+ <div class="{$class}-contents"><xsl:apply-templates/></div>
+ <!-- HACK: This doesn't belong inside formal.object; it
+ should be done by the table template, but I want
+ the link to be inside the DIV, so... -->
+ <xsl:if test="local-name(.) = 'table'">
+ <xsl:call-template name="table.longdesc"/>
+ </xsl:if>
+
+ <xsl:call-template name="formal.object.heading"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </div>
+ <xsl:if test="not($formal.object.break.after = '0')">
+ <br class="{$class}-break"/>
+ </xsl:if>
+ </xsl:variable>
+
+ <xsl:variable name="floatstyle">
+ <xsl:call-template name="floatstyle"/>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="$floatstyle != ''">
+ <xsl:call-template name="floater">
+ <xsl:with-param name="class"><xsl:value-of select="$class"/>-float</xsl:with-param>
+ <xsl:with-param name="floatstyle" select="$floatstyle"/>
+ <xsl:with-param name="content" select="$content"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:copy-of select="$content"/>
+ </xsl:otherwise>
+ </xsl:choose>
+
+</xsl:template>
+
+<xsl:template name="formal.object.heading">
+ <xsl:param name="object" select="."/>
+ <xsl:param name="title">
+ <xsl:apply-templates select="$object" mode="object.title.markup">
+ <xsl:with-param name="allow-anchors" select="1"/>
+ </xsl:apply-templates>
+ </xsl:param>
+
+
+ <xsl:choose>
+ <xsl:when test="$make.clean.html != 0">
+ <xsl:variable name="html.class" select="concat(local-name($object),'-title')"/>
+ <div class="{$html.class}">
+ <xsl:copy-of select="$title"/>
+ </div>
+ </xsl:when>
+ <xsl:otherwise>
+ <p class="title">
+ <strong xmlns:xslo="http://www.w3.org/1999/XSL/Transform">
+ <xsl:copy-of select="$title"/>
+ </strong>
+ </p>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="informal.object">
+ <xsl:param name="class" select="local-name(.)"/>
+
+ <xsl:variable name="content">
+ <div class="{$class}">
+ <xsl:if test="$spacing.paras != 0"><p/></xsl:if>
+ <xsl:call-template name="anchor"/>
+ <xsl:apply-templates/>
+
+ <!-- HACK: This doesn't belong inside formal.object; it
+ should be done by the table template, but I want
+ the link to be inside the DIV, so... -->
+ <xsl:if test="local-name(.) = 'informaltable'">
+ <xsl:call-template name="table.longdesc"/>
+ </xsl:if>
+
+ <xsl:if test="$spacing.paras != 0"><p/></xsl:if>
+ </div>
+ </xsl:variable>
+
+ <xsl:variable name="floatstyle">
+ <xsl:call-template name="floatstyle"/>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="$floatstyle != ''">
+ <xsl:call-template name="floater">
+ <xsl:with-param name="class"><xsl:value-of select="$class"/>-float</xsl:with-param>
+ <xsl:with-param name="floatstyle" select="$floatstyle"/>
+ <xsl:with-param name="content" select="$content"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:copy-of select="$content"/>
+ </xsl:otherwise>
+ </xsl:choose>
+
+</xsl:template>
+
+<xsl:template name="semiformal.object">
+ <xsl:param name="placement" select="'before'"/>
+ <xsl:param name="class" select="local-name(.)"/>
+
+ <xsl:choose>
+ <xsl:when test="title or info/title">
+ <xsl:call-template name="formal.object">
+ <xsl:with-param name="placement" select="$placement"/>
+ <xsl:with-param name="class" select="$class"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="informal.object">
+ <xsl:with-param name="class" select="$class"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="figure">
+ <xsl:variable name="param.placement" select="substring-after(normalize-space($formal.title.placement), concat(local-name(.), ' '))"/>
+
+ <xsl:variable name="placement">
+ <xsl:choose>
+ <xsl:when test="contains($param.placement, ' ')">
+ <xsl:value-of select="substring-before($param.placement, ' ')"/>
+ </xsl:when>
+ <xsl:when test="$param.placement = ''">before</xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$param.placement"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:call-template name="formal.object">
+ <xsl:with-param name="placement" select="$placement"/>
+ </xsl:call-template>
+
+</xsl:template>
+
+<xsl:template match="table">
+ <xsl:choose>
+ <xsl:when test="tgroup|mediaobject|graphic">
+ <xsl:call-template name="calsTable"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <!-- do not use xsl:copy because of XHTML's needs -->
+ <xsl:element name="table" namespace="http://www.w3.org/1999/xhtml">
+ <xsl:apply-templates select="@*" mode="htmlTableAtt"/>
+ <xsl:attribute name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:attribute>
+ <xsl:call-template name="htmlTable"/>
+ </xsl:element>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="calsTable">
+ <xsl:if test="tgroup/tbody/tr |tgroup/thead/tr |tgroup/tfoot/tr">
+ <xsl:message terminate="yes">Broken table: tr descendent of CALS Table.</xsl:message>
+ </xsl:if>
+
+ <xsl:variable name="param.placement" select="substring-after(normalize-space($formal.title.placement), concat(local-name(.), ' '))"/>
+
+ <xsl:variable name="placement">
+ <xsl:choose>
+ <xsl:when test="contains($param.placement, ' ')">
+ <xsl:value-of select="substring-before($param.placement, ' ')"/>
+ </xsl:when>
+ <xsl:when test="$param.placement = ''">before</xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$param.placement"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:call-template name="formal.object">
+ <xsl:with-param name="placement" select="$placement"/>
+ <xsl:with-param name="class">
+ <xsl:choose>
+ <xsl:when test="@tabstyle">
+ <!-- hack, this will only ever occur on table, not example -->
+ <xsl:value-of select="@tabstyle"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="local-name(.)"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:with-param>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template name="htmlTable">
+ <xsl:if test="tgroup/tbody/row |tgroup/thead/row |tgroup/tfoot/row">
+ <xsl:message terminate="yes">Broken table: row descendent of HTML table.</xsl:message>
+ </xsl:if>
+
+ <xsl:apply-templates mode="htmlTable"/>
+
+ <xsl:if test=".//footnote|../title//footnote">
+ <tbody class="footnotes">
+ <tr>
+ <td colspan="50">
+ <xsl:apply-templates select=".//footnote|../title//footnote" mode="table.footnote.mode"/>
+ </td>
+ </tr>
+ </tbody>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="example">
+ <xsl:variable name="param.placement" select="substring-after(normalize-space($formal.title.placement), concat(local-name(.), ' '))"/>
+
+ <xsl:variable name="placement">
+ <xsl:choose>
+ <xsl:when test="contains($param.placement, ' ')">
+ <xsl:value-of select="substring-before($param.placement, ' ')"/>
+ </xsl:when>
+ <xsl:when test="$param.placement = ''">before</xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$param.placement"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:call-template name="formal.object">
+ <xsl:with-param name="placement" select="$placement"/>
+ </xsl:call-template>
+
+</xsl:template>
+
+<xsl:template match="equation">
+ <xsl:variable name="param.placement" select="substring-after(normalize-space($formal.title.placement), concat(local-name(.), ' '))"/>
+
+ <xsl:variable name="placement">
+ <xsl:choose>
+ <xsl:when test="contains($param.placement, ' ')">
+ <xsl:value-of select="substring-before($param.placement, ' ')"/>
+ </xsl:when>
+ <xsl:when test="$param.placement = ''">before</xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$param.placement"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:call-template name="formal.object">
+ <xsl:with-param name="placement" select="$placement"/>
+ </xsl:call-template>
+
+</xsl:template>
+
+<xsl:template match="figure/title"/>
+<xsl:template match="figure/titleabbrev"/>
+<xsl:template match="table/title"/>
+<xsl:template match="table/titleabbrev"/>
+<xsl:template match="table/textobject"/>
+<xsl:template match="example/title"/>
+<xsl:template match="example/titleabbrev"/>
+<xsl:template match="equation/title"/>
+<xsl:template match="equation/titleabbrev"/>
+
+<xsl:template match="informalfigure">
+ <xsl:call-template name="informal.object"/>
+</xsl:template>
+
+<xsl:template match="informalexample">
+ <xsl:call-template name="informal.object"/>
+</xsl:template>
+
+<xsl:template match="informaltable">
+ <xsl:choose>
+ <xsl:when test="tgroup|mediaobject|graphic">
+ <xsl:call-template name="informal.object">
+ <xsl:with-param name="class">
+ <xsl:choose>
+ <xsl:when test="@tabstyle">
+ <xsl:value-of select="@tabstyle"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="local-name(.)"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:element name="table" namespace="http://www.w3.org/1999/xhtml">
+ <xsl:apply-templates select="@*" mode="htmlTableAtt"/>
+ <xsl:attribute name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:attribute>
+ <xsl:call-template name="htmlTable"/>
+ </xsl:element>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="informaltable/textobject"/>
+
+<xsl:template name="table.longdesc">
+ <!-- HACK: This doesn't belong inside formal.objectt; it should be done by -->
+ <!-- the table template, but I want the link to be inside the DIV, so... -->
+ <xsl:variable name="longdesc.uri">
+ <xsl:call-template name="longdesc.uri">
+ <xsl:with-param name="mediaobject" select="."/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="irrelevant">
+ <!-- write.longdesc returns the filename ... -->
+ <xsl:call-template name="write.longdesc">
+ <xsl:with-param name="mediaobject" select="."/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:if test="$html.longdesc != 0 and $html.longdesc.link != 0 and textobject[not(phrase)]">
+ <xsl:call-template name="longdesc.link">
+ <xsl:with-param name="longdesc.uri" select="$longdesc.uri"/>
+ </xsl:call-template>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="informalequation">
+ <xsl:call-template name="informal.object"/>
+</xsl:template>
+
+<xsl:template name="floatstyle">
+ <xsl:if test="(@float and @float != '0') or @floatstyle != ''">
+ <xsl:choose>
+ <xsl:when test="@floatstyle != ''">
+ <xsl:value-of select="@floatstyle"/>
+ </xsl:when>
+ <xsl:when test="@float = '1'">
+ <xsl:value-of select="$default.float.class"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="@float"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template name="floater">
+ <xsl:param name="content"/>
+ <xsl:param name="class" select="'float'"/>
+ <xsl:param name="floatstyle" select="'left'"/>
+
+ <div class="{$class}">
+ <xsl:if test="$floatstyle = 'left' or $floatstyle = 'right'">
+ <xsl:attribute name="style">
+ <xsl:text>float: </xsl:text>
+ <xsl:value-of select="$floatstyle"/>
+ <xsl:text>;</xsl:text>
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:copy-of select="$content"/>
+ </div>
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/glossary.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/glossary.xsl
new file mode 100644
index 0000000..d22b6c5
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/glossary.xsl
@@ -0,0 +1,564 @@
+<?xml version="1.0" encoding="ASCII"?>
+<!--This file was created automatically by html2xhtml-->
+<!--from the HTML stylesheets.-->
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/1999/xhtml" exclude-result-prefixes="xlink" version="1.0">
+
+<!-- ********************************************************************
+ $Id: glossary.xsl 8421 2009-05-04 07:49:49Z bobstayton $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<!-- ==================================================================== -->
+
+<xsl:template match="glossary">
+
+<xsl:variable name="language">
+ <xsl:call-template name="l10n.language"/>
+</xsl:variable>
+
+<xsl:variable name="lowercase">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key">normalize.sort.input</xsl:with-param>
+ </xsl:call-template>
+</xsl:variable>
+
+<xsl:variable name="uppercase">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key">normalize.sort.output</xsl:with-param>
+ </xsl:call-template>
+</xsl:variable>
+
+ <xsl:call-template name="id.warning"/>
+
+ <div>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:if test="$generate.id.attributes != 0">
+ <xsl:attribute name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:call-template name="glossary.titlepage"/>
+
+ <xsl:choose>
+ <xsl:when test="glossdiv">
+ <xsl:apply-templates select="(glossdiv[1]/preceding-sibling::*)"/>
+ </xsl:when>
+ <xsl:when test="glossentry">
+ <xsl:apply-templates select="(glossentry[1]/preceding-sibling::*)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates/>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:choose>
+ <xsl:when test="glossdiv">
+ <xsl:apply-templates select="glossdiv"/>
+ </xsl:when>
+ <xsl:when test="glossentry">
+ <dl>
+ <xsl:choose>
+ <xsl:when test="$glossary.sort != 0">
+ <xsl:apply-templates select="glossentry">
+ <xsl:sort lang="{$language}" select="normalize-space(translate(concat(@sortas, glossterm[not(parent::glossentry/@sortas) or parent::glossentry/@sortas = '']), 'Aa&#192;&#224;&#193;&#225;&#194;&#226;&#195;&#227;&#196;&#228;&#197;&#229;&#256;&#257;&#258;&#259;&#260;&#261;&#461;&#462;&#478;&#479;&#480;&#481;&#506;&#507;&#512;&#513;&#514;&#515;&#550;&#551;&#7680;&#7681;&#7834;&#7840;&#7841;&#7842;&#7843;&#7844;&#7845;&#7846;&#7847;&#7848;&#7849;&#7850;&#7851;&#7852;&#7853;&#7854;&#7855;&#7856;&#7857;&#7858;&#7859;&#7860;&#7861;&#7862;&#7863;Bb&#384;&#385;&#595;&#386;&#387;&#7682;&#7683;&#7684;&#7685;&#7686;&#7687;Cc&#199;&#231;&#262;&#263;&#264;&#265;&#266;&#267;&#268;&#269;&#391;&#392;&#597;&#7688;&#7689;Dd&#270;&#271;&#272;&#273;&#394;&#599;&#395;&#396;&#453;&#498;&#545;&#598;&#7690;&#7691;&#7692;&#7693;&#7694;&#7695;&#7696;&#7697;&#7698;&#7699;Ee&#200;&#232;&#201;&#233;&#202;&#234;&#203;&#235;&#274;&#275;&#276;&#277;&#278;&#279;&#280;&#281;&#282;&#283;&#516;&#517;&#518;&#519;&#552;&#553;&#7700;&#7701;&#7702;&#7703;&#7704;&#7705;&#7706;&#7707;&#7708;&#7709;&#7864;&#7865;&#7866;&#7867;&#7868;&#7869;&#7870;&#7871;&#7872;&#7873;&#7874;&#7875;&#7876;&#7877;&#7878;&#7879;Ff&#401;&#402;&#7710;&#7711;Gg&#284;&#285;&#286;&#287;&#288;&#289;&#290;&#291;&#403;&#608;&#484;&#485;&#486;&#487;&#500;&#501;&#7712;&#7713;Hh&#292;&#293;&#294;&#295;&#542;&#543;&#614;&#7714;&#7715;&#7716;&#7717;&#7718;&#7719;&#7720;&#7721;&#7722;&#7723;&#7830;Ii&#204;&#236;&#205;&#237;&#206;&#238;&#207;&#239;&#296;&#297;&#298;&#299;&#300;&#301;&#302;&#303;&#304;&#407;&#616;&#463;&#464;&#520;&#521;&#522;&#523;&#7724;&#7725;&#7726;&#7727;&#7880;&#7881;&#7882;&#7883;Jj&#308;&#309;&#496;&#669;Kk&#310;&#311;&#408;&#409;&#488;&#489;&#7728;&#7729;&#7730;&#7731;&#7732;&#7733;Ll&#313;&#314;&#315;&#316;&#317;&#318;&#319;&#320;&#321;&#322;&#410;&#456;&#564;&#619;&#620;&#621;&#7734;&#7735;&#7736;&#7737;&#7738;&#7739;&#7740;&#7741;Mm&#625;&#7742;&#7743;&#7744;&#7745;&#7746;&#7747;Nn&#209;&#241;&#323;&#324;&#325;&#326;&#327;&#328;&#413;&#626;&#414;&#544;&#459;&#504;&#505;&#565;&#627;&#7748;&#7749;&#7750;&#7751;&#7752;&#7753;&#7754;&#7755;Oo&#210;&#242;&#211;&#243;&#212;&#244;&#213;&#245;&#214;&#246;&#216;&#248;&#332;&#333;&#334;&#335;&#336;&#337;&#415;&#416;&#417;&#465;&#466;&#490;&#491;&#492;&#493;&#510;&#511;&#524;&#525;&#526;&#527;&#554;&#555;&#556;&#557;&#558;&#559;&#560;&#561;&#7756;&#7757;&#7758;&#7759;&#7760;&#7761;&#7762;&#7763;&#7884;&#7885;&#7886;&#7887;&#7888;&#7889;&#7890;&#7891;&#7892;&#7893;&#7894;&#7895;&#7896;&#7897;&#7898;&#7899;&#7900;&#7901;&#7902;&#7903;&#7904;&#7905;&#7906;&#7907;Pp&#420;&#421;&#7764;&#7765;&#7766;&#7767;Qq&#672;Rr&#340;&#341;&#342;&#343;&#344;&#345;&#528;&#529;&#530;&#531;&#636;&#637;&#638;&#7768;&#7769;&#7770;&#7771;&#7772;&#7773;&#7774;&#7775;Ss&#346;&#347;&#348;&#349;&#350;&#351;&#352;&#353;&#536;&#537;&#642;&#7776;&#7777;&#7778;&#7779;&#7780;&#7781;&#7782;&#7783;&#7784;&#7785;Tt&#354;&#355;&#356;&#357;&#358;&#359;&#427;&#428;&#429;&#430;&#648;&#538;&#539;&#566;&#7786;&#7787;&#7788;&#7789;&#7790;&#7791;&#7792;&#7793;&#7831;Uu&#217;&#249;&#218;&#250;&#219;&#251;&#220;&#252;&#360;&#361;&#362;&#363;&#364;&#365;&#366;&#367;&#368;&#369;&#370;&#371;&#431;&#432;&#467;&#468;&#469;&#470;&#471;&#472;&#473;&#474;&#475;&#476;&#532;&#533;&#534;&#535;&#7794;&#7795;&#7796;&#7797;&#7798;&#7799;&#7800;&#7801;&#7802;&#7803;&#7908;&#7909;&#7910;&#7911;&#7912;&#7913;&#7914;&#7915;&#7916;&#7917;&#7918;&#7919;&#7920;&#7921;Vv&#434;&#651;&#7804;&#7805;&#7806;&#7807;Ww&#372;&#373;&#7808;&#7809;&#7810;&#7811;&#7812;&#7813;&#7814;&#7815;&#7816;&#7817;&#7832;Xx&#7818;&#7819;&#7820;&#7821;Yy&#221;&#253;&#255;&#376;&#374;&#375;&#435;&#436;&#562;&#563;&#7822;&#7823;&#7833;&#7922;&#7923;&#7924;&#7925;&#7926;&#7927;&#7928;&#7929;Zz&#377;&#378;&#379;&#380;&#381;&#382;&#437;&#438;&#548;&#549;&#656;&#657;&#7824;&#7825;&#7826;&#7827;&#7828;&#7829;&#7829;', 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBCCCCCCCCCCCCCCCCCDDDDDDDDDDDDDDDDDDDDDDDDEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEFFFFFFGGGGGGGGGGGGGGGGGGGGHHHHHHHHHHHHHHHHHHHHIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIJJJJJJKKKKKKKKKKKKKKLLLLLLLLLLLLLLLLLLLLLLLLLLMMMMMMMMMNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOPPPPPPPPQQQRRRRRRRRRRRRRRRRRRRRRRRSSSSSSSSSSSSSSSSSSSSSSSTTTTTTTTTTTTTTTTTTTTTTTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUVVVVVVVVWWWWWWWWWWWWWWWXXXXXXYYYYYYYYYYYYYYYYYYYYYYYZZZZZZZZZZZZZZZZZZZZZ'))"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="glossentry"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </dl>
+ </xsl:when>
+ <xsl:otherwise>
+ <!-- empty glossary -->
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:if test="not(parent::article)">
+ <xsl:call-template name="process.footnotes"/>
+ </xsl:if>
+ </div>
+</xsl:template>
+
+<xsl:template match="glossary/glossaryinfo"/>
+<xsl:template match="glossary/info"/>
+<xsl:template match="glossary/title"/>
+<xsl:template match="glossary/subtitle"/>
+<xsl:template match="glossary/titleabbrev"/>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="glosslist">
+
+<xsl:variable name="language">
+ <xsl:call-template name="l10n.language"/>
+</xsl:variable>
+
+<xsl:variable name="lowercase">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key">normalize.sort.input</xsl:with-param>
+ </xsl:call-template>
+</xsl:variable>
+
+<xsl:variable name="uppercase">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key">normalize.sort.output</xsl:with-param>
+ </xsl:call-template>
+</xsl:variable>
+
+ <div>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:call-template name="anchor"/>
+ <xsl:if test="blockinfo/title|info/title|title">
+ <xsl:call-template name="formal.object.heading"/>
+ </xsl:if>
+ <dl>
+ <xsl:choose>
+ <xsl:when test="$glossary.sort != 0">
+ <xsl:apply-templates select="glossentry">
+ <xsl:sort lang="{$language}" select="normalize-space(translate(concat(@sortas, glossterm[not(parent::glossentry/@sortas) or parent::glossentry/@sortas = '']), 'Aa&#192;&#224;&#193;&#225;&#194;&#226;&#195;&#227;&#196;&#228;&#197;&#229;&#256;&#257;&#258;&#259;&#260;&#261;&#461;&#462;&#478;&#479;&#480;&#481;&#506;&#507;&#512;&#513;&#514;&#515;&#550;&#551;&#7680;&#7681;&#7834;&#7840;&#7841;&#7842;&#7843;&#7844;&#7845;&#7846;&#7847;&#7848;&#7849;&#7850;&#7851;&#7852;&#7853;&#7854;&#7855;&#7856;&#7857;&#7858;&#7859;&#7860;&#7861;&#7862;&#7863;Bb&#384;&#385;&#595;&#386;&#387;&#7682;&#7683;&#7684;&#7685;&#7686;&#7687;Cc&#199;&#231;&#262;&#263;&#264;&#265;&#266;&#267;&#268;&#269;&#391;&#392;&#597;&#7688;&#7689;Dd&#270;&#271;&#272;&#273;&#394;&#599;&#395;&#396;&#453;&#498;&#545;&#598;&#7690;&#7691;&#7692;&#7693;&#7694;&#7695;&#7696;&#7697;&#7698;&#7699;Ee&#200;&#232;&#201;&#233;&#202;&#234;&#203;&#235;&#274;&#275;&#276;&#277;&#278;&#279;&#280;&#281;&#282;&#283;&#516;&#517;&#518;&#519;&#552;&#553;&#7700;&#7701;&#7702;&#7703;&#7704;&#7705;&#7706;&#7707;&#7708;&#7709;&#7864;&#7865;&#7866;&#7867;&#7868;&#7869;&#7870;&#7871;&#7872;&#7873;&#7874;&#7875;&#7876;&#7877;&#7878;&#7879;Ff&#401;&#402;&#7710;&#7711;Gg&#284;&#285;&#286;&#287;&#288;&#289;&#290;&#291;&#403;&#608;&#484;&#485;&#486;&#487;&#500;&#501;&#7712;&#7713;Hh&#292;&#293;&#294;&#295;&#542;&#543;&#614;&#7714;&#7715;&#7716;&#7717;&#7718;&#7719;&#7720;&#7721;&#7722;&#7723;&#7830;Ii&#204;&#236;&#205;&#237;&#206;&#238;&#207;&#239;&#296;&#297;&#298;&#299;&#300;&#301;&#302;&#303;&#304;&#407;&#616;&#463;&#464;&#520;&#521;&#522;&#523;&#7724;&#7725;&#7726;&#7727;&#7880;&#7881;&#7882;&#7883;Jj&#308;&#309;&#496;&#669;Kk&#310;&#311;&#408;&#409;&#488;&#489;&#7728;&#7729;&#7730;&#7731;&#7732;&#7733;Ll&#313;&#314;&#315;&#316;&#317;&#318;&#319;&#320;&#321;&#322;&#410;&#456;&#564;&#619;&#620;&#621;&#7734;&#7735;&#7736;&#7737;&#7738;&#7739;&#7740;&#7741;Mm&#625;&#7742;&#7743;&#7744;&#7745;&#7746;&#7747;Nn&#209;&#241;&#323;&#324;&#325;&#326;&#327;&#328;&#413;&#626;&#414;&#544;&#459;&#504;&#505;&#565;&#627;&#7748;&#7749;&#7750;&#7751;&#7752;&#7753;&#7754;&#7755;Oo&#210;&#242;&#211;&#243;&#212;&#244;&#213;&#245;&#214;&#246;&#216;&#248;&#332;&#333;&#334;&#335;&#336;&#337;&#415;&#416;&#417;&#465;&#466;&#490;&#491;&#492;&#493;&#510;&#511;&#524;&#525;&#526;&#527;&#554;&#555;&#556;&#557;&#558;&#559;&#560;&#561;&#7756;&#7757;&#7758;&#7759;&#7760;&#7761;&#7762;&#7763;&#7884;&#7885;&#7886;&#7887;&#7888;&#7889;&#7890;&#7891;&#7892;&#7893;&#7894;&#7895;&#7896;&#7897;&#7898;&#7899;&#7900;&#7901;&#7902;&#7903;&#7904;&#7905;&#7906;&#7907;Pp&#420;&#421;&#7764;&#7765;&#7766;&#7767;Qq&#672;Rr&#340;&#341;&#342;&#343;&#344;&#345;&#528;&#529;&#530;&#531;&#636;&#637;&#638;&#7768;&#7769;&#7770;&#7771;&#7772;&#7773;&#7774;&#7775;Ss&#346;&#347;&#348;&#349;&#350;&#351;&#352;&#353;&#536;&#537;&#642;&#7776;&#7777;&#7778;&#7779;&#7780;&#7781;&#7782;&#7783;&#7784;&#7785;Tt&#354;&#355;&#356;&#357;&#358;&#359;&#427;&#428;&#429;&#430;&#648;&#538;&#539;&#566;&#7786;&#7787;&#7788;&#7789;&#7790;&#7791;&#7792;&#7793;&#7831;Uu&#217;&#249;&#218;&#250;&#219;&#251;&#220;&#252;&#360;&#361;&#362;&#363;&#364;&#365;&#366;&#367;&#368;&#369;&#370;&#371;&#431;&#432;&#467;&#468;&#469;&#470;&#471;&#472;&#473;&#474;&#475;&#476;&#532;&#533;&#534;&#535;&#7794;&#7795;&#7796;&#7797;&#7798;&#7799;&#7800;&#7801;&#7802;&#7803;&#7908;&#7909;&#7910;&#7911;&#7912;&#7913;&#7914;&#7915;&#7916;&#7917;&#7918;&#7919;&#7920;&#7921;Vv&#434;&#651;&#7804;&#7805;&#7806;&#7807;Ww&#372;&#373;&#7808;&#7809;&#7810;&#7811;&#7812;&#7813;&#7814;&#7815;&#7816;&#7817;&#7832;Xx&#7818;&#7819;&#7820;&#7821;Yy&#221;&#253;&#255;&#376;&#374;&#375;&#435;&#436;&#562;&#563;&#7822;&#7823;&#7833;&#7922;&#7923;&#7924;&#7925;&#7926;&#7927;&#7928;&#7929;Zz&#377;&#378;&#379;&#380;&#381;&#382;&#437;&#438;&#548;&#549;&#656;&#657;&#7824;&#7825;&#7826;&#7827;&#7828;&#7829;&#7829;', 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBCCCCCCCCCCCCCCCCCDDDDDDDDDDDDDDDDDDDDDDDDEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEFFFFFFGGGGGGGGGGGGGGGGGGGGHHHHHHHHHHHHHHHHHHHHIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIJJJJJJKKKKKKKKKKKKKKLLLLLLLLLLLLLLLLLLLLLLLLLLMMMMMMMMMNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOPPPPPPPPQQQRRRRRRRRRRRRRRRRRRRRRRRSSSSSSSSSSSSSSSSSSSSSSSTTTTTTTTTTTTTTTTTTTTTTTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUVVVVVVVVWWWWWWWWWWWWWWWXXXXXXYYYYYYYYYYYYYYYYYYYYYYYZZZZZZZZZZZZZZZZZZZZZ'))"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="glossentry"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </dl>
+ </div>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="glossdiv">
+
+<xsl:variable name="language">
+ <xsl:call-template name="l10n.language"/>
+</xsl:variable>
+
+<xsl:variable name="lowercase">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key">normalize.sort.input</xsl:with-param>
+ </xsl:call-template>
+</xsl:variable>
+
+<xsl:variable name="uppercase">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key">normalize.sort.output</xsl:with-param>
+ </xsl:call-template>
+</xsl:variable>
+
+ <xsl:call-template name="id.warning"/>
+
+ <div>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates select="(glossentry[1]/preceding-sibling::*)"/>
+
+ <dl>
+ <xsl:choose>
+ <xsl:when test="$glossary.sort != 0">
+ <xsl:apply-templates select="glossentry">
+ <xsl:sort lang="{$language}" select="translate(glossterm, $lowercase, $uppercase)"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="glossentry"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </dl>
+ </div>
+</xsl:template>
+
+<xsl:template match="glossdiv/title">
+ <h3>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates/>
+ </h3>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<!--
+GlossEntry ::=
+ GlossTerm, Acronym?, Abbrev?,
+ (IndexTerm)*,
+ RevHistory?,
+ (GlossSee | GlossDef+)
+-->
+
+<xsl:template match="glossentry">
+ <xsl:choose>
+ <xsl:when test="$glossentry.show.acronym = 'primary'">
+ <dt>
+ <xsl:call-template name="anchor">
+ <xsl:with-param name="conditional">
+ <xsl:choose>
+ <xsl:when test="$glossterm.auto.link != 0">0</xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:with-param>
+ </xsl:call-template>
+
+ <xsl:choose>
+ <xsl:when test="acronym|abbrev">
+ <xsl:apply-templates select="acronym|abbrev"/>
+ <xsl:text> (</xsl:text>
+ <xsl:apply-templates select="glossterm"/>
+ <xsl:text>)</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="glossterm"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </dt>
+ </xsl:when>
+ <xsl:when test="$glossentry.show.acronym = 'yes'">
+ <dt>
+ <xsl:call-template name="anchor">
+ <xsl:with-param name="conditional">
+ <xsl:choose>
+ <xsl:when test="$glossterm.auto.link != 0">0</xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:with-param>
+ </xsl:call-template>
+
+ <xsl:apply-templates select="glossterm"/>
+
+ <xsl:if test="acronym|abbrev">
+ <xsl:text> (</xsl:text>
+ <xsl:apply-templates select="acronym|abbrev"/>
+ <xsl:text>)</xsl:text>
+ </xsl:if>
+ </dt>
+ </xsl:when>
+ <xsl:otherwise>
+ <dt>
+ <xsl:call-template name="anchor">
+ <xsl:with-param name="conditional">
+ <xsl:choose>
+ <xsl:when test="$glossterm.auto.link != 0">0</xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:with-param>
+ </xsl:call-template>
+
+ <xsl:apply-templates select="glossterm"/>
+ </dt>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:apply-templates select="indexterm|revhistory|glosssee|glossdef"/>
+</xsl:template>
+
+<xsl:template match="glossentry/glossterm">
+ <xsl:apply-templates/>
+ <xsl:if test="following-sibling::glossterm">, </xsl:if>
+</xsl:template>
+
+<xsl:template match="glossentry/acronym">
+ <xsl:apply-templates/>
+ <xsl:if test="following-sibling::acronym|following-sibling::abbrev">, </xsl:if>
+</xsl:template>
+
+<xsl:template match="glossentry/abbrev">
+ <xsl:apply-templates/>
+ <xsl:if test="following-sibling::acronym|following-sibling::abbrev">, </xsl:if>
+</xsl:template>
+
+<xsl:template match="glossentry/revhistory">
+</xsl:template>
+
+<xsl:template match="glossentry/glosssee">
+ <xsl:variable name="otherterm" select="@otherterm"/>
+ <xsl:variable name="targets" select="key('id', $otherterm)"/>
+ <xsl:variable name="target" select="$targets[1]"/>
+ <xsl:variable name="xlink" select="@xlink:href"/>
+
+ <dd>
+ <p>
+ <xsl:variable name="template">
+ <xsl:call-template name="gentext.template">
+ <xsl:with-param name="context" select="'glossary'"/>
+ <xsl:with-param name="name" select="'see'"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="title">
+ <xsl:choose>
+ <xsl:when test="$target">
+ <a>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:attribute name="href">
+ <xsl:call-template name="href.target">
+ <xsl:with-param name="object" select="$target"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:apply-templates select="$target" mode="xref-to"/>
+ </a>
+ </xsl:when>
+ <xsl:when test="$xlink">
+ <xsl:call-template name="simple.xlink">
+ <xsl:with-param name="content">
+ <xsl:apply-templates/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="$otherterm != '' and not($target)">
+ <xsl:message>
+ <xsl:text>Warning: glosssee @otherterm reference not found: </xsl:text>
+ <xsl:value-of select="$otherterm"/>
+ </xsl:message>
+ <xsl:apply-templates/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:call-template name="substitute-markup">
+ <xsl:with-param name="template" select="$template"/>
+ <xsl:with-param name="title" select="$title"/>
+ </xsl:call-template>
+ </p>
+ </dd>
+</xsl:template>
+
+<xsl:template match="glossentry/glossdef">
+ <dd>
+ <xsl:apply-templates select="*[local-name(.) != 'glossseealso']"/>
+ <xsl:if test="glossseealso">
+ <p>
+ <xsl:variable name="template">
+ <xsl:call-template name="gentext.template">
+ <xsl:with-param name="context" select="'glossary'"/>
+ <xsl:with-param name="name" select="'seealso'"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:variable name="title">
+ <xsl:apply-templates select="glossseealso"/>
+ </xsl:variable>
+ <xsl:call-template name="substitute-markup">
+ <xsl:with-param name="template" select="$template"/>
+ <xsl:with-param name="title" select="$title"/>
+ </xsl:call-template>
+ </p>
+ </xsl:if>
+ </dd>
+</xsl:template>
+
+<xsl:template match="glossseealso">
+ <xsl:variable name="otherterm" select="@otherterm"/>
+ <xsl:variable name="targets" select="key('id', $otherterm)"/>
+ <xsl:variable name="target" select="$targets[1]"/>
+ <xsl:variable name="xlink" select="@xlink:href"/>
+
+ <xsl:choose>
+ <xsl:when test="$target">
+ <a>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:attribute name="href">
+ <xsl:call-template name="href.target">
+ <xsl:with-param name="object" select="$target"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:apply-templates select="$target" mode="xref-to"/>
+ </a>
+ </xsl:when>
+ <xsl:when test="$xlink">
+ <xsl:call-template name="simple.xlink">
+ <xsl:with-param name="content">
+ <xsl:apply-templates/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="$otherterm != '' and not($target)">
+ <xsl:message>
+ <xsl:text>Warning: glossseealso @otherterm reference not found: </xsl:text>
+ <xsl:value-of select="$otherterm"/>
+ </xsl:message>
+ <xsl:apply-templates/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates/>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:choose>
+ <xsl:when test="position() = last()"/>
+ <xsl:otherwise>
+ <xsl:call-template name="gentext.template">
+ <xsl:with-param name="context" select="'glossary'"/>
+ <xsl:with-param name="name" select="'seealso-separator'"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<!-- Glossary collection -->
+
+<xsl:template match="glossary[@role='auto']" priority="2">
+
+<xsl:variable name="language">
+ <xsl:call-template name="l10n.language"/>
+</xsl:variable>
+
+<xsl:variable name="lowercase">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key">normalize.sort.input</xsl:with-param>
+ </xsl:call-template>
+</xsl:variable>
+
+<xsl:variable name="uppercase">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key">normalize.sort.output</xsl:with-param>
+ </xsl:call-template>
+</xsl:variable>
+
+ <xsl:variable name="terms" select="//glossterm[not(parent::glossdef)]|//firstterm"/>
+ <xsl:variable name="collection" select="document($glossary.collection, .)"/>
+
+ <xsl:call-template name="id.warning"/>
+
+ <xsl:if test="$glossary.collection = ''">
+ <xsl:message>
+ <xsl:text>Warning: processing automatic glossary </xsl:text>
+ <xsl:text>without a glossary.collection file.</xsl:text>
+ </xsl:message>
+ </xsl:if>
+
+ <xsl:if test="not($collection) and $glossary.collection != ''">
+ <xsl:message>
+ <xsl:text>Warning: processing automatic glossary but unable to </xsl:text>
+ <xsl:text>open glossary.collection file '</xsl:text>
+ <xsl:value-of select="$glossary.collection"/>
+ <xsl:text>'</xsl:text>
+ </xsl:message>
+ </xsl:if>
+
+ <div>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:if test="$generate.id.attributes != 0">
+ <xsl:attribute name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:call-template name="glossary.titlepage"/>
+
+ <xsl:choose>
+ <xsl:when test="glossdiv and $collection//glossdiv">
+ <xsl:for-each select="$collection//glossdiv">
+ <!-- first see if there are any in this div -->
+ <xsl:variable name="exist.test">
+ <xsl:for-each select="glossentry">
+ <xsl:variable name="cterm" select="glossterm"/>
+ <xsl:if test="$terms[@baseform = $cterm or . = $cterm]">
+ <xsl:value-of select="glossterm"/>
+ </xsl:if>
+ </xsl:for-each>
+ </xsl:variable>
+
+ <xsl:if test="$exist.test != ''">
+ <xsl:apply-templates select="." mode="auto-glossary">
+ <xsl:with-param name="terms" select="$terms"/>
+ </xsl:apply-templates>
+ </xsl:if>
+ </xsl:for-each>
+ </xsl:when>
+ <xsl:otherwise>
+ <dl>
+ <xsl:choose>
+ <xsl:when test="$glossary.sort != 0">
+ <xsl:for-each select="$collection//glossentry">
+ <xsl:sort lang="{$language}" select="normalize-space(translate(concat(@sortas, glossterm[not(parent::glossentry/@sortas) or parent::glossentry/@sortas = '']), 'Aa&#192;&#224;&#193;&#225;&#194;&#226;&#195;&#227;&#196;&#228;&#197;&#229;&#256;&#257;&#258;&#259;&#260;&#261;&#461;&#462;&#478;&#479;&#480;&#481;&#506;&#507;&#512;&#513;&#514;&#515;&#550;&#551;&#7680;&#7681;&#7834;&#7840;&#7841;&#7842;&#7843;&#7844;&#7845;&#7846;&#7847;&#7848;&#7849;&#7850;&#7851;&#7852;&#7853;&#7854;&#7855;&#7856;&#7857;&#7858;&#7859;&#7860;&#7861;&#7862;&#7863;Bb&#384;&#385;&#595;&#386;&#387;&#7682;&#7683;&#7684;&#7685;&#7686;&#7687;Cc&#199;&#231;&#262;&#263;&#264;&#265;&#266;&#267;&#268;&#269;&#391;&#392;&#597;&#7688;&#7689;Dd&#270;&#271;&#272;&#273;&#394;&#599;&#395;&#396;&#453;&#498;&#545;&#598;&#7690;&#7691;&#7692;&#7693;&#7694;&#7695;&#7696;&#7697;&#7698;&#7699;Ee&#200;&#232;&#201;&#233;&#202;&#234;&#203;&#235;&#274;&#275;&#276;&#277;&#278;&#279;&#280;&#281;&#282;&#283;&#516;&#517;&#518;&#519;&#552;&#553;&#7700;&#7701;&#7702;&#7703;&#7704;&#7705;&#7706;&#7707;&#7708;&#7709;&#7864;&#7865;&#7866;&#7867;&#7868;&#7869;&#7870;&#7871;&#7872;&#7873;&#7874;&#7875;&#7876;&#7877;&#7878;&#7879;Ff&#401;&#402;&#7710;&#7711;Gg&#284;&#285;&#286;&#287;&#288;&#289;&#290;&#291;&#403;&#608;&#484;&#485;&#486;&#487;&#500;&#501;&#7712;&#7713;Hh&#292;&#293;&#294;&#295;&#542;&#543;&#614;&#7714;&#7715;&#7716;&#7717;&#7718;&#7719;&#7720;&#7721;&#7722;&#7723;&#7830;Ii&#204;&#236;&#205;&#237;&#206;&#238;&#207;&#239;&#296;&#297;&#298;&#299;&#300;&#301;&#302;&#303;&#304;&#407;&#616;&#463;&#464;&#520;&#521;&#522;&#523;&#7724;&#7725;&#7726;&#7727;&#7880;&#7881;&#7882;&#7883;Jj&#308;&#309;&#496;&#669;Kk&#310;&#311;&#408;&#409;&#488;&#489;&#7728;&#7729;&#7730;&#7731;&#7732;&#7733;Ll&#313;&#314;&#315;&#316;&#317;&#318;&#319;&#320;&#321;&#322;&#410;&#456;&#564;&#619;&#620;&#621;&#7734;&#7735;&#7736;&#7737;&#7738;&#7739;&#7740;&#7741;Mm&#625;&#7742;&#7743;&#7744;&#7745;&#7746;&#7747;Nn&#209;&#241;&#323;&#324;&#325;&#326;&#327;&#328;&#413;&#626;&#414;&#544;&#459;&#504;&#505;&#565;&#627;&#7748;&#7749;&#7750;&#7751;&#7752;&#7753;&#7754;&#7755;Oo&#210;&#242;&#211;&#243;&#212;&#244;&#213;&#245;&#214;&#246;&#216;&#248;&#332;&#333;&#334;&#335;&#336;&#337;&#415;&#416;&#417;&#465;&#466;&#490;&#491;&#492;&#493;&#510;&#511;&#524;&#525;&#526;&#527;&#554;&#555;&#556;&#557;&#558;&#559;&#560;&#561;&#7756;&#7757;&#7758;&#7759;&#7760;&#7761;&#7762;&#7763;&#7884;&#7885;&#7886;&#7887;&#7888;&#7889;&#7890;&#7891;&#7892;&#7893;&#7894;&#7895;&#7896;&#7897;&#7898;&#7899;&#7900;&#7901;&#7902;&#7903;&#7904;&#7905;&#7906;&#7907;Pp&#420;&#421;&#7764;&#7765;&#7766;&#7767;Qq&#672;Rr&#340;&#341;&#342;&#343;&#344;&#345;&#528;&#529;&#530;&#531;&#636;&#637;&#638;&#7768;&#7769;&#7770;&#7771;&#7772;&#7773;&#7774;&#7775;Ss&#346;&#347;&#348;&#349;&#350;&#351;&#352;&#353;&#536;&#537;&#642;&#7776;&#7777;&#7778;&#7779;&#7780;&#7781;&#7782;&#7783;&#7784;&#7785;Tt&#354;&#355;&#356;&#357;&#358;&#359;&#427;&#428;&#429;&#430;&#648;&#538;&#539;&#566;&#7786;&#7787;&#7788;&#7789;&#7790;&#7791;&#7792;&#7793;&#7831;Uu&#217;&#249;&#218;&#250;&#219;&#251;&#220;&#252;&#360;&#361;&#362;&#363;&#364;&#365;&#366;&#367;&#368;&#369;&#370;&#371;&#431;&#432;&#467;&#468;&#469;&#470;&#471;&#472;&#473;&#474;&#475;&#476;&#532;&#533;&#534;&#535;&#7794;&#7795;&#7796;&#7797;&#7798;&#7799;&#7800;&#7801;&#7802;&#7803;&#7908;&#7909;&#7910;&#7911;&#7912;&#7913;&#7914;&#7915;&#7916;&#7917;&#7918;&#7919;&#7920;&#7921;Vv&#434;&#651;&#7804;&#7805;&#7806;&#7807;Ww&#372;&#373;&#7808;&#7809;&#7810;&#7811;&#7812;&#7813;&#7814;&#7815;&#7816;&#7817;&#7832;Xx&#7818;&#7819;&#7820;&#7821;Yy&#221;&#253;&#255;&#376;&#374;&#375;&#435;&#436;&#562;&#563;&#7822;&#7823;&#7833;&#7922;&#7923;&#7924;&#7925;&#7926;&#7927;&#7928;&#7929;Zz&#377;&#378;&#379;&#380;&#381;&#382;&#437;&#438;&#548;&#549;&#656;&#657;&#7824;&#7825;&#7826;&#7827;&#7828;&#7829;&#7829;', 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBCCCCCCCCCCCCCCCCCDDDDDDDDDDDDDDDDDDDDDDDDEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEFFFFFFGGGGGGGGGGGGGGGGGGGGHHHHHHHHHHHHHHHHHHHHIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIJJJJJJKKKKKKKKKKKKKKLLLLLLLLLLLLLLLLLLLLLLLLLLMMMMMMMMMNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOPPPPPPPPQQQRRRRRRRRRRRRRRRRRRRRRRRSSSSSSSSSSSSSSSSSSSSSSSTTTTTTTTTTTTTTTTTTTTTTTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUVVVVVVVVWWWWWWWWWWWWWWWXXXXXXYYYYYYYYYYYYYYYYYYYYYYYZZZZZZZZZZZZZZZZZZZZZ'))"/>
+ <xsl:variable name="cterm" select="glossterm"/>
+ <xsl:if test="$terms[@baseform = $cterm or . = $cterm]">
+ <xsl:apply-templates select="." mode="auto-glossary"/>
+ </xsl:if>
+ </xsl:for-each>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:for-each select="$collection//glossentry">
+ <xsl:variable name="cterm" select="glossterm"/>
+ <xsl:if test="$terms[@baseform = $cterm or . = $cterm]">
+ <xsl:apply-templates select="." mode="auto-glossary"/>
+ </xsl:if>
+ </xsl:for-each>
+ </xsl:otherwise>
+ </xsl:choose>
+ </dl>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:if test="not(parent::article)">
+ <xsl:call-template name="process.footnotes"/>
+ </xsl:if>
+ </div>
+</xsl:template>
+
+<xsl:template match="*" mode="auto-glossary">
+ <!-- pop back out to the default mode for most elements -->
+ <xsl:apply-templates select="."/>
+</xsl:template>
+
+<xsl:template match="glossdiv" mode="auto-glossary">
+ <xsl:param name="terms" select="."/>
+
+
+<xsl:variable name="language">
+ <xsl:call-template name="l10n.language"/>
+</xsl:variable>
+
+<xsl:variable name="lowercase">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key">normalize.sort.input</xsl:with-param>
+ </xsl:call-template>
+</xsl:variable>
+
+<xsl:variable name="uppercase">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key">normalize.sort.output</xsl:with-param>
+ </xsl:call-template>
+</xsl:variable>
+
+
+ <div>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates select="(glossentry[1]/preceding-sibling::*)"/>
+
+ <dl>
+ <xsl:choose>
+ <xsl:when test="$glossary.sort != 0">
+ <xsl:for-each select="glossentry">
+ <xsl:sort lang="{$language}" select="normalize-space(translate(concat(@sortas, glossterm[not(parent::glossentry/@sortas) or parent::glossentry/@sortas = '']), 'Aa&#192;&#224;&#193;&#225;&#194;&#226;&#195;&#227;&#196;&#228;&#197;&#229;&#256;&#257;&#258;&#259;&#260;&#261;&#461;&#462;&#478;&#479;&#480;&#481;&#506;&#507;&#512;&#513;&#514;&#515;&#550;&#551;&#7680;&#7681;&#7834;&#7840;&#7841;&#7842;&#7843;&#7844;&#7845;&#7846;&#7847;&#7848;&#7849;&#7850;&#7851;&#7852;&#7853;&#7854;&#7855;&#7856;&#7857;&#7858;&#7859;&#7860;&#7861;&#7862;&#7863;Bb&#384;&#385;&#595;&#386;&#387;&#7682;&#7683;&#7684;&#7685;&#7686;&#7687;Cc&#199;&#231;&#262;&#263;&#264;&#265;&#266;&#267;&#268;&#269;&#391;&#392;&#597;&#7688;&#7689;Dd&#270;&#271;&#272;&#273;&#394;&#599;&#395;&#396;&#453;&#498;&#545;&#598;&#7690;&#7691;&#7692;&#7693;&#7694;&#7695;&#7696;&#7697;&#7698;&#7699;Ee&#200;&#232;&#201;&#233;&#202;&#234;&#203;&#235;&#274;&#275;&#276;&#277;&#278;&#279;&#280;&#281;&#282;&#283;&#516;&#517;&#518;&#519;&#552;&#553;&#7700;&#7701;&#7702;&#7703;&#7704;&#7705;&#7706;&#7707;&#7708;&#7709;&#7864;&#7865;&#7866;&#7867;&#7868;&#7869;&#7870;&#7871;&#7872;&#7873;&#7874;&#7875;&#7876;&#7877;&#7878;&#7879;Ff&#401;&#402;&#7710;&#7711;Gg&#284;&#285;&#286;&#287;&#288;&#289;&#290;&#291;&#403;&#608;&#484;&#485;&#486;&#487;&#500;&#501;&#7712;&#7713;Hh&#292;&#293;&#294;&#295;&#542;&#543;&#614;&#7714;&#7715;&#7716;&#7717;&#7718;&#7719;&#7720;&#7721;&#7722;&#7723;&#7830;Ii&#204;&#236;&#205;&#237;&#206;&#238;&#207;&#239;&#296;&#297;&#298;&#299;&#300;&#301;&#302;&#303;&#304;&#407;&#616;&#463;&#464;&#520;&#521;&#522;&#523;&#7724;&#7725;&#7726;&#7727;&#7880;&#7881;&#7882;&#7883;Jj&#308;&#309;&#496;&#669;Kk&#310;&#311;&#408;&#409;&#488;&#489;&#7728;&#7729;&#7730;&#7731;&#7732;&#7733;Ll&#313;&#314;&#315;&#316;&#317;&#318;&#319;&#320;&#321;&#322;&#410;&#456;&#564;&#619;&#620;&#621;&#7734;&#7735;&#7736;&#7737;&#7738;&#7739;&#7740;&#7741;Mm&#625;&#7742;&#7743;&#7744;&#7745;&#7746;&#7747;Nn&#209;&#241;&#323;&#324;&#325;&#326;&#327;&#328;&#413;&#626;&#414;&#544;&#459;&#504;&#505;&#565;&#627;&#7748;&#7749;&#7750;&#7751;&#7752;&#7753;&#7754;&#7755;Oo&#210;&#242;&#211;&#243;&#212;&#244;&#213;&#245;&#214;&#246;&#216;&#248;&#332;&#333;&#334;&#335;&#336;&#337;&#415;&#416;&#417;&#465;&#466;&#490;&#491;&#492;&#493;&#510;&#511;&#524;&#525;&#526;&#527;&#554;&#555;&#556;&#557;&#558;&#559;&#560;&#561;&#7756;&#7757;&#7758;&#7759;&#7760;&#7761;&#7762;&#7763;&#7884;&#7885;&#7886;&#7887;&#7888;&#7889;&#7890;&#7891;&#7892;&#7893;&#7894;&#7895;&#7896;&#7897;&#7898;&#7899;&#7900;&#7901;&#7902;&#7903;&#7904;&#7905;&#7906;&#7907;Pp&#420;&#421;&#7764;&#7765;&#7766;&#7767;Qq&#672;Rr&#340;&#341;&#342;&#343;&#344;&#345;&#528;&#529;&#530;&#531;&#636;&#637;&#638;&#7768;&#7769;&#7770;&#7771;&#7772;&#7773;&#7774;&#7775;Ss&#346;&#347;&#348;&#349;&#350;&#351;&#352;&#353;&#536;&#537;&#642;&#7776;&#7777;&#7778;&#7779;&#7780;&#7781;&#7782;&#7783;&#7784;&#7785;Tt&#354;&#355;&#356;&#357;&#358;&#359;&#427;&#428;&#429;&#430;&#648;&#538;&#539;&#566;&#7786;&#7787;&#7788;&#7789;&#7790;&#7791;&#7792;&#7793;&#7831;Uu&#217;&#249;&#218;&#250;&#219;&#251;&#220;&#252;&#360;&#361;&#362;&#363;&#364;&#365;&#366;&#367;&#368;&#369;&#370;&#371;&#431;&#432;&#467;&#468;&#469;&#470;&#471;&#472;&#473;&#474;&#475;&#476;&#532;&#533;&#534;&#535;&#7794;&#7795;&#7796;&#7797;&#7798;&#7799;&#7800;&#7801;&#7802;&#7803;&#7908;&#7909;&#7910;&#7911;&#7912;&#7913;&#7914;&#7915;&#7916;&#7917;&#7918;&#7919;&#7920;&#7921;Vv&#434;&#651;&#7804;&#7805;&#7806;&#7807;Ww&#372;&#373;&#7808;&#7809;&#7810;&#7811;&#7812;&#7813;&#7814;&#7815;&#7816;&#7817;&#7832;Xx&#7818;&#7819;&#7820;&#7821;Yy&#221;&#253;&#255;&#376;&#374;&#375;&#435;&#436;&#562;&#563;&#7822;&#7823;&#7833;&#7922;&#7923;&#7924;&#7925;&#7926;&#7927;&#7928;&#7929;Zz&#377;&#378;&#379;&#380;&#381;&#382;&#437;&#438;&#548;&#549;&#656;&#657;&#7824;&#7825;&#7826;&#7827;&#7828;&#7829;&#7829;', 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBCCCCCCCCCCCCCCCCCDDDDDDDDDDDDDDDDDDDDDDDDEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEFFFFFFGGGGGGGGGGGGGGGGGGGGHHHHHHHHHHHHHHHHHHHHIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIJJJJJJKKKKKKKKKKKKKKLLLLLLLLLLLLLLLLLLLLLLLLLLMMMMMMMMMNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOPPPPPPPPQQQRRRRRRRRRRRRRRRRRRRRRRRSSSSSSSSSSSSSSSSSSSSSSSTTTTTTTTTTTTTTTTTTTTTTTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUVVVVVVVVWWWWWWWWWWWWWWWXXXXXXYYYYYYYYYYYYYYYYYYYYYYYZZZZZZZZZZZZZZZZZZZZZ'))"/>!
+ <xsl:variable name="cterm" select="glossterm"/>
+ <xsl:if test="$terms[@baseform = $cterm or . = $cterm]">
+ <xsl:apply-templates select="." mode="auto-glossary"/>
+ </xsl:if>
+ </xsl:for-each>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:for-each select="glossentry">
+ <xsl:variable name="cterm" select="glossterm"/>
+ <xsl:if test="$terms[@baseform = $cterm or . = $cterm]">
+ <xsl:apply-templates select="." mode="auto-glossary"/>
+ </xsl:if>
+ </xsl:for-each>
+ </xsl:otherwise>
+ </xsl:choose>
+ </dl>
+ </div>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/graphics.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/graphics.xsl
new file mode 100644
index 0000000..db05ad2
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/graphics.xsl
@@ -0,0 +1,1436 @@
+<?xml version="1.0" encoding="ASCII"?>
+<!--This file was created automatically by html2xhtml-->
+<!--from the HTML stylesheets.-->
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:stext="http://nwalsh.com/xslt/ext/com.nwalsh.saxon.TextFactory" xmlns:simg="http://nwalsh.com/xslt/ext/com.nwalsh.saxon.ImageIntrinsics" xmlns:ximg="xalan://com.nwalsh.xalan.ImageIntrinsics" xmlns:xtext="xalan://com.nwalsh.xalan.Text" xmlns:lxslt="http://xml.apache.org/xslt" xmlns="http://www.w3.org/1999/xhtml" exclude-result-prefixes="xlink stext xtext lxslt simg ximg" extension-element-prefixes="stext xtext" version="1.0">
+
+<!-- ********************************************************************
+ $Id: graphics.xsl 8421 2009-05-04 07:49:49Z bobstayton $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ Contributors:
+ Colin Paul Adams, <colin@colina.demon.co.uk>
+
+ ******************************************************************** -->
+
+<lxslt:component prefix="xtext" elements="insertfile"/>
+<lxslt:component prefix="ximg" functions="new getWidth getDepth"/>
+
+<!-- ==================================================================== -->
+<!-- Graphic format tests for the HTML backend -->
+
+<xsl:template name="is.graphic.format">
+ <xsl:param name="format"/>
+ <xsl:if test="$format = 'SVG' or $format = 'PNG' or $format = 'JPG' or $format = 'JPEG' or $format = 'linespecific' or $format = 'GIF' or $format = 'GIF87a' or $format = 'GIF89a' or $format = 'BMP'">1</xsl:if>
+</xsl:template>
+
+<xsl:template name="is.graphic.extension">
+ <xsl:param name="ext"/>
+ <xsl:variable name="lcext" select="translate($ext, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')"/>
+ <xsl:if test="$lcext = 'svg' or $lcext = 'png' or $lcext = 'jpeg' or $lcext = 'jpg' or $lcext = 'avi' or $lcext = 'mpg' or $lcext = 'mpeg' or $lcext = 'qt' or $lcext = 'gif' or $lcext = 'bmp'">1</xsl:if>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="screenshot">
+ <div>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates/>
+ </div>
+</xsl:template>
+
+<xsl:template match="screeninfo">
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template name="process.image">
+ <!-- When this template is called, the current node should be -->
+ <!-- a graphic, inlinegraphic, imagedata, or videodata. All -->
+ <!-- those elements have the same set of attributes, so we can -->
+ <!-- handle them all in one place. -->
+ <xsl:param name="tag" select="'img'"/>
+ <xsl:param name="alt"/>
+ <xsl:param name="longdesc"/>
+
+ <!-- The HTML img element only supports the notion of content-area
+ scaling; it doesn't support the distinction between a
+ content-area and a viewport-area, so we have to make some
+ compromises.
+
+ 1. If only the content-area is specified, everything is fine.
+ (If you ask for a three inch image, that's what you'll get.)
+
+ 2. If only the viewport-area is provided:
+ - If scalefit=1, treat it as both the content-area and
+ the viewport-area. (If you ask for an image in a five inch
+ area, we'll make the image five inches to fill that area.)
+ - If scalefit=0, ignore the viewport-area specification.
+
+ Note: this is not quite the right semantic and has the additional
+ problem that it can result in anamorphic scaling, which scalefit
+ should never cause.
+
+ 3. If both the content-area and the viewport-area is specified
+ on a graphic element, ignore the viewport-area.
+ (If you ask for a three inch image in a five inch area, we'll assume
+ it's better to give you a three inch image in an unspecified area
+ than a five inch image in a five inch area.
+
+ Relative units also cause problems. As a general rule, the stylesheets
+ are operating too early and too loosely coupled with the rendering engine
+ to know things like the current font size or the actual dimensions of
+ an image. Therefore:
+
+ 1. We use a fixed size for pixels, $pixels.per.inch
+
+ 2. We use a fixed size for "em"s, $points.per.em
+
+ Percentages are problematic. In the following discussion, we speak
+ of width and contentwidth, but the same issues apply to depth and
+ contentdepth
+
+ 1. A width of 50% means "half of the available space for the image."
+ That's fine. But note that in HTML, this is a dynamic property and
+ the image size will vary if the browser window is resized.
+
+ 2. A contentwidth of 50% means "half of the actual image width". But
+ the stylesheets have no way to assess the image's actual size. Treating
+ this as a width of 50% is one possibility, but it produces behavior
+ (dynamic scaling) that seems entirely out of character with the
+ meaning.
+
+ Instead, the stylesheets define a $nominal.image.width
+ and convert percentages to actual values based on that nominal size.
+
+ Scale can be problematic. Scale applies to the contentwidth, so
+ a scale of 50 when a contentwidth is not specified is analagous to a
+ width of 50%. (If a contentwidth is specified, the scaling factor can
+ be applied to that value and no problem exists.)
+
+ If scale is specified but contentwidth is not supplied, the
+ nominal.image.width is used to calculate a base size
+ for scaling.
+
+ Warning: as a consequence of these decisions, unless the aspect ratio
+ of your image happens to be exactly the same as (nominal width / nominal height),
+ specifying contentwidth="50%" and contentdepth="50%" is NOT going to
+ scale the way you expect (or really, the way it should).
+
+ Don't do that. In fact, a percentage value is not recommended for content
+ size at all. Use scale instead.
+
+ Finally, align and valign are troublesome. Horizontal alignment is now
+ supported by wrapping the image in a <div align="{@align}"> (in block
+ contexts!). I can't think of anything (practical) to do about vertical
+ alignment.
+ -->
+
+ <xsl:variable name="width-units">
+ <xsl:choose>
+ <xsl:when test="$ignore.image.scaling != 0"/>
+ <xsl:when test="@width">
+ <xsl:call-template name="length-units">
+ <xsl:with-param name="length" select="@width"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="not(@depth) and $default.image.width != ''">
+ <xsl:call-template name="length-units">
+ <xsl:with-param name="length" select="$default.image.width"/>
+ </xsl:call-template>
+ </xsl:when>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="width">
+ <xsl:choose>
+ <xsl:when test="$ignore.image.scaling != 0"/>
+ <xsl:when test="@width">
+ <xsl:choose>
+ <xsl:when test="$width-units = '%'">
+ <xsl:value-of select="@width"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="length-spec">
+ <xsl:with-param name="length" select="@width"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:when test="not(@depth) and $default.image.width != ''">
+ <xsl:value-of select="$default.image.width"/>
+ </xsl:when>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="scalefit">
+ <xsl:choose>
+ <xsl:when test="$ignore.image.scaling != 0">0</xsl:when>
+ <xsl:when test="@contentwidth or @contentdepth">0</xsl:when>
+ <xsl:when test="@scale">0</xsl:when>
+ <xsl:when test="@scalefit"><xsl:value-of select="@scalefit"/></xsl:when>
+ <xsl:when test="$width != '' or @depth">1</xsl:when>
+ <xsl:otherwise>0</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="scale">
+ <xsl:choose>
+ <xsl:when test="$ignore.image.scaling != 0">1.0</xsl:when>
+ <xsl:when test="@contentwidth or @contentdepth">1.0</xsl:when>
+ <xsl:when test="@scale">
+ <xsl:value-of select="@scale div 100.0"/>
+ </xsl:when>
+ <xsl:otherwise>1.0</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="filename">
+ <xsl:choose>
+ <xsl:when test="local-name(.) = 'graphic' or local-name(.) = 'inlinegraphic'">
+ <!-- handle legacy graphic and inlinegraphic by new template -->
+ <xsl:call-template name="mediaobject.filename">
+ <xsl:with-param name="object" select="."/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <!-- imagedata, videodata, audiodata -->
+ <xsl:call-template name="mediaobject.filename">
+ <xsl:with-param name="object" select=".."/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="output_filename">
+ <xsl:choose>
+ <xsl:when test="@entityref">
+ <xsl:value-of select="$filename"/>
+ </xsl:when>
+ <!--
+ Moved test for $keep.relative.image.uris to template below:
+ <xsl:template match="@fileref">
+ -->
+ <xsl:otherwise>
+ <xsl:value-of select="$filename"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="img.src.path.pi">
+ <xsl:call-template name="pi.dbhtml_img.src.path">
+ <xsl:with-param name="node" select=".."/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="filename.for.graphicsize">
+ <xsl:choose>
+ <xsl:when test="$img.src.path.pi != ''">
+ <xsl:value-of select="concat($img.src.path.pi, $filename)"/>
+ </xsl:when>
+ <xsl:when test="$img.src.path != '' and $graphicsize.use.img.src.path != 0 and $tag = 'img' and not(starts-with($filename, '/')) and not(contains($filename, '://'))">
+ <xsl:value-of select="concat($img.src.path, $filename)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$filename"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="realintrinsicwidth">
+ <!-- This funny compound test works around a bug in XSLTC -->
+ <xsl:choose>
+ <xsl:when test="$use.extensions != 0 and $graphicsize.extension != 0">
+ <xsl:choose>
+ <xsl:when test="function-available('simg:getWidth')">
+ <xsl:value-of select="simg:getWidth(simg:new($filename.for.graphicsize), $nominal.image.width)"/>
+ </xsl:when>
+ <xsl:when test="function-available('ximg:getWidth')">
+ <xsl:value-of select="ximg:getWidth(ximg:new($filename.for.graphicsize), $nominal.image.width)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="0"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="0"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="intrinsicwidth">
+ <xsl:choose>
+ <xsl:when test="$realintrinsicwidth = 0">
+ <xsl:value-of select="$nominal.image.width"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$realintrinsicwidth"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="intrinsicdepth">
+ <!-- This funny compound test works around a bug in XSLTC -->
+ <xsl:choose>
+ <xsl:when test="$use.extensions != 0 and $graphicsize.extension != 0">
+ <xsl:choose>
+ <xsl:when test="function-available('simg:getDepth')">
+ <xsl:value-of select="simg:getDepth(simg:new($filename.for.graphicsize), $nominal.image.depth)"/>
+ </xsl:when>
+ <xsl:when test="function-available('ximg:getDepth')">
+ <xsl:value-of select="ximg:getDepth(ximg:new($filename.for.graphicsize), $nominal.image.depth)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$nominal.image.depth"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$nominal.image.depth"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="contentwidth">
+ <xsl:choose>
+ <xsl:when test="$ignore.image.scaling != 0"/>
+ <xsl:when test="@contentwidth">
+ <xsl:variable name="units">
+ <xsl:call-template name="length-units">
+ <xsl:with-param name="length" select="@contentwidth"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="$units = '%'">
+ <xsl:variable name="cmagnitude">
+ <xsl:call-template name="length-magnitude">
+ <xsl:with-param name="length" select="@contentwidth"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:value-of select="$intrinsicwidth * $cmagnitude div 100.0"/>
+ <xsl:text>px</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="length-spec">
+ <xsl:with-param name="length" select="@contentwidth"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$intrinsicwidth"/>
+ <xsl:text>px</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="scaled.contentwidth">
+ <xsl:if test="$contentwidth != ''">
+ <xsl:variable name="cwidth.in.points">
+ <xsl:call-template name="length-in-points">
+ <xsl:with-param name="length" select="$contentwidth"/>
+ <xsl:with-param name="pixels.per.inch" select="$pixels.per.inch"/>
+ <xsl:with-param name="em.size" select="$points.per.em"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:value-of select="$cwidth.in.points div 72.0 * $pixels.per.inch * $scale"/>
+ </xsl:if>
+ </xsl:variable>
+
+ <xsl:variable name="html.width">
+ <xsl:choose>
+ <xsl:when test="$ignore.image.scaling != 0"/>
+ <xsl:when test="$width-units = '%'">
+ <xsl:value-of select="$width"/>
+ </xsl:when>
+ <xsl:when test="$width != ''">
+ <xsl:variable name="width.in.points">
+ <xsl:call-template name="length-in-points">
+ <xsl:with-param name="length" select="$width"/>
+ <xsl:with-param name="pixels.per.inch" select="$pixels.per.inch"/>
+ <xsl:with-param name="em.size" select="$points.per.em"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:value-of select="round($width.in.points div 72.0 * $pixels.per.inch)"/>
+ </xsl:when>
+ <xsl:otherwise/>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="contentdepth">
+ <xsl:choose>
+ <xsl:when test="$ignore.image.scaling != 0"/>
+ <xsl:when test="@contentdepth">
+ <xsl:variable name="units">
+ <xsl:call-template name="length-units">
+ <xsl:with-param name="length" select="@contentdepth"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="$units = '%'">
+ <xsl:variable name="cmagnitude">
+ <xsl:call-template name="length-magnitude">
+ <xsl:with-param name="length" select="@contentdepth"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:value-of select="$intrinsicdepth * $cmagnitude div 100.0"/>
+ <xsl:text>px</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="length-spec">
+ <xsl:with-param name="length" select="@contentdepth"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$intrinsicdepth"/>
+ <xsl:text>px</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="scaled.contentdepth">
+ <xsl:if test="$contentdepth != ''">
+ <xsl:variable name="cdepth.in.points">
+ <xsl:call-template name="length-in-points">
+ <xsl:with-param name="length" select="$contentdepth"/>
+ <xsl:with-param name="pixels.per.inch" select="$pixels.per.inch"/>
+ <xsl:with-param name="em.size" select="$points.per.em"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:value-of select="$cdepth.in.points div 72.0 * $pixels.per.inch * $scale"/>
+ </xsl:if>
+ </xsl:variable>
+
+ <xsl:variable name="depth-units">
+ <xsl:if test="@depth">
+ <xsl:call-template name="length-units">
+ <xsl:with-param name="length" select="@depth"/>
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:variable>
+
+ <xsl:variable name="depth">
+ <xsl:if test="@depth">
+ <xsl:choose>
+ <xsl:when test="$depth-units = '%'">
+ <xsl:value-of select="@depth"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="length-spec">
+ <xsl:with-param name="length" select="@depth"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:if>
+ </xsl:variable>
+
+ <xsl:variable name="html.depth">
+ <xsl:choose>
+ <xsl:when test="$ignore.image.scaling != 0"/>
+ <xsl:when test="$depth-units = '%'">
+ <xsl:value-of select="$depth"/>
+ </xsl:when>
+ <xsl:when test="@depth and @depth != ''">
+ <xsl:variable name="depth.in.points">
+ <xsl:call-template name="length-in-points">
+ <xsl:with-param name="length" select="$depth"/>
+ <xsl:with-param name="pixels.per.inch" select="$pixels.per.inch"/>
+ <xsl:with-param name="em.size" select="$points.per.em"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:value-of select="round($depth.in.points div 72.0 * $pixels.per.inch)"/>
+ </xsl:when>
+ <xsl:otherwise/>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="viewport">
+ <xsl:choose>
+ <xsl:when test="$ignore.image.scaling != 0">0</xsl:when>
+ <xsl:when test="local-name(.) = 'inlinegraphic' or ancestor::inlinemediaobject or ancestor::inlineequation">0</xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$make.graphic.viewport"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+<!--
+ <xsl:message>=====================================
+scale: <xsl:value-of select="$scale"/>, <xsl:value-of select="$scalefit"/>
+@contentwidth <xsl:value-of select="@contentwidth"/>
+$contentwidth <xsl:value-of select="$contentwidth"/>
+scaled.contentwidth: <xsl:value-of select="$scaled.contentwidth"/>
+@width: <xsl:value-of select="@width"/>
+width: <xsl:value-of select="$width"/>
+html.width: <xsl:value-of select="$html.width"/>
+@contentdepth <xsl:value-of select="@contentdepth"/>
+$contentdepth <xsl:value-of select="$contentdepth"/>
+scaled.contentdepth: <xsl:value-of select="$scaled.contentdepth"/>
+@depth: <xsl:value-of select="@depth"/>
+depth: <xsl:value-of select="$depth"/>
+html.depth: <xsl:value-of select="$html.depth"/>
+align: <xsl:value-of select="@align"/>
+valign: <xsl:value-of select="@valign"/></xsl:message>
+-->
+
+ <xsl:variable name="scaled" select="@width|@depth|@contentwidth|@contentdepth |@scale|@scalefit"/>
+
+ <xsl:variable name="img">
+ <xsl:choose>
+ <xsl:when test="@format = 'SVG'">
+ <object type="image/svg+xml">
+ <xsl:attribute name="data">
+ <xsl:choose>
+ <xsl:when test="$img.src.path != '' and $tag = 'img' and not(starts-with($output_filename, '/')) and not(contains($output_filename, '://'))">
+ <xsl:value-of select="$img.src.path"/>
+ </xsl:when>
+ </xsl:choose>
+ <xsl:value-of select="$output_filename"/>
+ </xsl:attribute>
+ <xsl:call-template name="process.image.attributes">
+ <!--xsl:with-param name="alt" select="$alt"/ there's no alt here-->
+ <xsl:with-param name="html.depth" select="$html.depth"/>
+ <xsl:with-param name="html.width" select="$html.width"/>
+ <xsl:with-param name="longdesc" select="$longdesc"/>
+ <xsl:with-param name="scale" select="$scale"/>
+ <xsl:with-param name="scalefit" select="$scalefit"/>
+ <xsl:with-param name="scaled.contentdepth" select="$scaled.contentdepth"/>
+ <xsl:with-param name="scaled.contentwidth" select="$scaled.contentwidth"/>
+ <xsl:with-param name="viewport" select="$viewport"/>
+ </xsl:call-template>
+ <xsl:if test="@align">
+ <xsl:attribute name="style"><xsl:text>text-align: </xsl:text>
+ <xsl:choose>
+ <xsl:when test="@align = 'center'">middle</xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="@align"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:if test="$use.embed.for.svg != 0">
+ <embed type="image/svg+xml">
+ <xsl:attribute name="src">
+ <xsl:choose>
+ <xsl:when test="$img.src.path != '' and $tag = 'img' and not(starts-with($output_filename, '/')) and not(contains($output_filename, '://'))">
+ <xsl:value-of select="$img.src.path"/>
+ </xsl:when>
+ </xsl:choose>
+ <xsl:value-of select="$output_filename"/>
+ </xsl:attribute>
+ <xsl:call-template name="process.image.attributes">
+ <!--xsl:with-param name="alt" select="$alt"/ there's no alt here -->
+ <xsl:with-param name="html.depth" select="$html.depth"/>
+ <xsl:with-param name="html.width" select="$html.width"/>
+ <xsl:with-param name="longdesc" select="$longdesc"/>
+ <xsl:with-param name="scale" select="$scale"/>
+ <xsl:with-param name="scalefit" select="$scalefit"/>
+ <xsl:with-param name="scaled.contentdepth" select="$scaled.contentdepth"/>
+ <xsl:with-param name="scaled.contentwidth" select="$scaled.contentwidth"/>
+ <xsl:with-param name="viewport" select="$viewport"/>
+ </xsl:call-template>
+ </embed>
+ </xsl:if>
+ </object>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:element name="{$tag}" namespace="http://www.w3.org/1999/xhtml">
+ <xsl:if test="$tag = 'img' and ../../self::imageobjectco">
+ <xsl:variable name="mapname">
+ <xsl:call-template name="object.id">
+ <xsl:with-param name="object" select="../../areaspec"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:choose>
+ <xsl:when test="$scaled">
+ <!-- It might be possible to handle some scaling; needs -->
+ <!-- more investigation -->
+ <xsl:message>
+ <xsl:text>Warning: imagemaps not supported </xsl:text>
+ <xsl:text>on scaled images</xsl:text>
+ </xsl:message>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:attribute name="border">0</xsl:attribute>
+ <xsl:attribute name="usemap">
+ <xsl:value-of select="concat('#', $mapname)"/>
+ </xsl:attribute>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:if>
+
+ <xsl:attribute name="src">
+ <xsl:choose>
+ <xsl:when test="$img.src.path != '' and $tag = 'img' and not(starts-with($output_filename, '/')) and not(contains($output_filename, '://'))">
+ <xsl:value-of select="$img.src.path"/>
+ </xsl:when>
+ </xsl:choose>
+ <xsl:value-of select="$output_filename"/>
+ </xsl:attribute>
+
+ <xsl:if test="@align">
+ <xsl:attribute name="style"><xsl:text>text-align: </xsl:text>
+ <xsl:choose>
+ <xsl:when test="@align = 'center'">middle</xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="@align"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:call-template name="process.image.attributes">
+ <xsl:with-param name="alt">
+ <xsl:choose>
+ <xsl:when test="$alt != ''">
+ <xsl:copy-of select="$alt"/>
+ </xsl:when>
+ <xsl:when test="ancestor::figure">
+ <xsl:value-of select="normalize-space(ancestor::figure/title)"/>
+ </xsl:when>
+ </xsl:choose>
+ </xsl:with-param>
+ <xsl:with-param name="html.depth" select="$html.depth"/>
+ <xsl:with-param name="html.width" select="$html.width"/>
+ <xsl:with-param name="longdesc" select="$longdesc"/>
+ <xsl:with-param name="scale" select="$scale"/>
+ <xsl:with-param name="scalefit" select="$scalefit"/>
+ <xsl:with-param name="scaled.contentdepth" select="$scaled.contentdepth"/>
+ <xsl:with-param name="scaled.contentwidth" select="$scaled.contentwidth"/>
+ <xsl:with-param name="viewport" select="$viewport"/>
+ </xsl:call-template>
+ </xsl:element>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="bgcolor">
+ <xsl:call-template name="pi.dbhtml_background-color">
+ <xsl:with-param name="node" select=".."/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="use.viewport" select="0"/>
+
+ <xsl:choose>
+ <xsl:when test="$use.viewport">
+ <table border="0" summary="manufactured viewport for HTML img" cellspacing="0" cellpadding="0">
+ <xsl:if test="$html.width != ''">
+ <xsl:attribute name="width">
+ <xsl:value-of select="$html.width"/>
+ </xsl:attribute>
+ </xsl:if>
+ <tr>
+ <xsl:if test="$html.depth != '' and $depth-units != '%'">
+ <!-- don't do this for percentages because browsers get confused -->
+ <xsl:choose>
+ <xsl:when test="$css.decoration != 0">
+ <xsl:attribute name="style">
+ <xsl:text>height: </xsl:text>
+ <xsl:value-of select="$html.depth"/>
+ <xsl:text>px</xsl:text>
+ </xsl:attribute>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:attribute name="height">
+ <xsl:value-of select="$html.depth"/>
+ </xsl:attribute>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:if>
+ <td>
+ <xsl:if test="$bgcolor != ''">
+ <xsl:choose>
+ <xsl:when test="$css.decoration != 0">
+ <xsl:attribute name="style">
+ <xsl:text>background-color: </xsl:text>
+ <xsl:value-of select="$bgcolor"/>
+ </xsl:attribute>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:attribute name="style"><xsl:text>background-color: </xsl:text>
+ <xsl:value-of select="$bgcolor"/>
+ </xsl:attribute>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:if>
+ <xsl:if test="@align">
+ <xsl:attribute name="style"><xsl:text>text-align: </xsl:text>
+ <xsl:value-of select="@align"/>
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:if test="@valign">
+ <xsl:attribute name="valign">
+ <xsl:value-of select="@valign"/>
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:copy-of select="$img"/>
+ </td>
+ </tr>
+ </table>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:copy-of select="$img"/>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:if test="$tag = 'img' and ../../self::imageobjectco and not($scaled)">
+ <xsl:variable name="mapname">
+ <xsl:call-template name="object.id">
+ <xsl:with-param name="object" select="../../areaspec"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <map name="{$mapname}">
+ <xsl:for-each select="../../areaspec//area">
+ <xsl:variable name="units">
+ <xsl:choose>
+ <xsl:when test="@units = 'other' and @otherunits">
+ <xsl:value-of select="@otherunits"/>
+ </xsl:when>
+ <xsl:when test="@units">
+ <xsl:value-of select="@units"/>
+ </xsl:when>
+ <!-- areaspec|areaset/area -->
+ <xsl:when test="../@units = 'other' and ../@otherunits">
+ <xsl:value-of select="../@otherunits"/>
+ </xsl:when>
+ <xsl:when test="../@units">
+ <xsl:value-of select="../@units"/>
+ </xsl:when>
+ <!-- areaspec/areaset/area -->
+ <xsl:when test="../../@units = 'other' and ../../@otherunits">
+ <xsl:value-of select="../@otherunits"/>
+ </xsl:when>
+ <xsl:when test="../../@units">
+ <xsl:value-of select="../../@units"/>
+ </xsl:when>
+ <xsl:otherwise>calspair</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="$units = 'calspair' or $units = 'imagemap'">
+ <xsl:variable name="coords" select="normalize-space(@coords)"/>
+
+ <area shape="rect">
+ <xsl:variable name="linkends">
+ <xsl:choose>
+ <xsl:when test="@linkends">
+ <xsl:value-of select="normalize-space(@linkends)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="normalize-space(../@linkends)"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="href">
+ <xsl:choose>
+ <xsl:when test="@xlink:href">
+ <xsl:value-of select="@xlink:href"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="../@xlink:href"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="$linkends != ''">
+ <xsl:variable name="linkend">
+ <xsl:choose>
+ <xsl:when test="contains($linkends, ' ')">
+ <xsl:value-of select="substring-before($linkends, ' ')"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$linkends"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="target" select="key('id', $linkend)[1]"/>
+
+ <xsl:if test="$target">
+ <xsl:attribute name="href">
+ <xsl:call-template name="href.target">
+ <xsl:with-param name="object" select="$target"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ </xsl:if>
+ </xsl:when>
+ <xsl:when test="$href != ''">
+ <xsl:attribute name="href">
+ <xsl:value-of select="$href"/>
+ </xsl:attribute>
+ </xsl:when>
+ </xsl:choose>
+
+ <xsl:if test="alt">
+ <xsl:attribute name="alt">
+ <xsl:value-of select="alt[1]"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:attribute name="coords">
+ <xsl:choose>
+ <xsl:when test="$units = 'calspair'">
+
+ <xsl:variable name="p1" select="substring-before($coords, ' ')"/>
+ <xsl:variable name="p2" select="substring-after($coords, ' ')"/>
+
+ <xsl:variable name="x1" select="substring-before($p1,',')"/>
+ <xsl:variable name="y1" select="substring-after($p1,',')"/>
+ <xsl:variable name="x2" select="substring-before($p2,',')"/>
+ <xsl:variable name="y2" select="substring-after($p2,',')"/>
+
+ <xsl:variable name="x1p" select="$x1 div 100.0"/>
+ <xsl:variable name="y1p" select="$y1 div 100.0"/>
+ <xsl:variable name="x2p" select="$x2 div 100.0"/>
+ <xsl:variable name="y2p" select="$y2 div 100.0"/>
+
+ <!--
+ <xsl:message>
+ <xsl:text>units: </xsl:text>
+ <xsl:value-of select="$units"/>
+ <xsl:text> </xsl:text>
+ <xsl:value-of select="$x1p"/><xsl:text>, </xsl:text>
+ <xsl:value-of select="$y1p"/><xsl:text>, </xsl:text>
+ <xsl:value-of select="$x2p"/><xsl:text>, </xsl:text>
+ <xsl:value-of select="$y2p"/><xsl:text>, </xsl:text>
+ </xsl:message>
+
+ <xsl:message>
+ <xsl:text> </xsl:text>
+ <xsl:value-of select="$intrinsicwidth"/>
+ <xsl:text>, </xsl:text>
+ <xsl:value-of select="$intrinsicdepth"/>
+ </xsl:message>
+
+ <xsl:message>
+ <xsl:text> </xsl:text>
+ <xsl:value-of select="$units"/>
+ <xsl:text> </xsl:text>
+ <xsl:value-of
+ select="round($x1p * $intrinsicwidth div 100.0)"/>
+ <xsl:text>,</xsl:text>
+ <xsl:value-of select="round($intrinsicdepth
+ - ($y2p * $intrinsicdepth div 100.0))"/>
+ <xsl:text>,</xsl:text>
+ <xsl:value-of select="round($x2p *
+ $intrinsicwidth div 100.0)"/>
+ <xsl:text>,</xsl:text>
+ <xsl:value-of select="round($intrinsicdepth
+ - ($y1p * $intrinsicdepth div 100.0))"/>
+ </xsl:message>
+ -->
+ <xsl:value-of select="round($x1p * $intrinsicwidth div 100.0)"/>
+ <xsl:text>,</xsl:text>
+ <xsl:value-of select="round($intrinsicdepth - ($y2p * $intrinsicdepth div 100.0))"/>
+ <xsl:text>,</xsl:text>
+ <xsl:value-of select="round($x2p * $intrinsicwidth div 100.0)"/>
+ <xsl:text>,</xsl:text>
+ <xsl:value-of select="round($intrinsicdepth - ($y1p * $intrinsicdepth div 100.0))"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:copy-of select="$coords"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:attribute>
+ </area>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:message>
+ <xsl:text>Warning: only calspair or </xsl:text>
+ <xsl:text>otherunits='imagemap' supported </xsl:text>
+ <xsl:text>in imageobjectco</xsl:text>
+ </xsl:message>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:for-each>
+ </map>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template name="process.image.attributes">
+ <xsl:param name="alt"/>
+ <xsl:param name="html.width"/>
+ <xsl:param name="html.depth"/>
+ <xsl:param name="longdesc"/>
+ <xsl:param name="scale"/>
+ <xsl:param name="scalefit"/>
+ <xsl:param name="scaled.contentdepth"/>
+ <xsl:param name="scaled.contentwidth"/>
+ <xsl:param name="viewport"/>
+
+ <xsl:choose>
+ <xsl:when test="@contentwidth or @contentdepth">
+ <!-- ignore @width/@depth, @scale, and @scalefit if specified -->
+ <xsl:if test="@contentwidth and $scaled.contentwidth != ''">
+ <xsl:attribute name="width">
+ <xsl:value-of select="$scaled.contentwidth"/>
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:if test="@contentdepth and $scaled.contentdepth != ''">
+ <xsl:attribute name="height">
+ <xsl:value-of select="$scaled.contentdepth"/>
+ </xsl:attribute>
+ </xsl:if>
+ </xsl:when>
+
+ <xsl:when test="number($scale) != 1.0">
+ <!-- scaling is always uniform, so we only have to specify one dimension -->
+ <!-- ignore @scalefit if specified -->
+ <xsl:attribute name="width">
+ <xsl:value-of select="$scaled.contentwidth"/>
+ </xsl:attribute>
+ </xsl:when>
+
+ <xsl:when test="$scalefit != 0">
+ <xsl:choose>
+ <xsl:when test="contains($html.width, '%')">
+ <xsl:choose>
+ <xsl:when test="$viewport != 0">
+ <!-- The *viewport* will be scaled, so use 100% here! -->
+ <xsl:attribute name="width">
+ <xsl:value-of select="'100%'"/>
+ </xsl:attribute>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:attribute name="width">
+ <xsl:value-of select="$html.width"/>
+ </xsl:attribute>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+
+ <xsl:when test="contains($html.depth, '%')">
+ <!-- HTML doesn't deal with this case very well...do nothing -->
+ </xsl:when>
+
+ <xsl:when test="$scaled.contentwidth != '' and $html.width != '' and $scaled.contentdepth != '' and $html.depth != ''">
+ <!-- scalefit should not be anamorphic; figure out which direction -->
+ <!-- has the limiting scale factor and scale in that direction -->
+ <xsl:choose>
+ <xsl:when test="$html.width div $scaled.contentwidth &gt; $html.depth div $scaled.contentdepth">
+ <xsl:attribute name="height">
+ <xsl:value-of select="$html.depth"/>
+ </xsl:attribute>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:attribute name="width">
+ <xsl:value-of select="$html.width"/>
+ </xsl:attribute>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+
+ <xsl:when test="$scaled.contentwidth != '' and $html.width != ''">
+ <xsl:attribute name="width">
+ <xsl:value-of select="$html.width"/>
+ </xsl:attribute>
+ </xsl:when>
+
+ <xsl:when test="$scaled.contentdepth != '' and $html.depth != ''">
+ <xsl:attribute name="height">
+ <xsl:value-of select="$html.depth"/>
+ </xsl:attribute>
+ </xsl:when>
+ </xsl:choose>
+ </xsl:when>
+ </xsl:choose>
+
+ <xsl:if test="$alt != ''">
+ <xsl:attribute name="alt">
+ <xsl:value-of select="normalize-space($alt)"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:if test="$longdesc != ''">
+ <xsl:attribute name="longdesc">
+ <xsl:value-of select="$longdesc"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:if test="@align and $viewport = 0">
+ <xsl:attribute name="style"><xsl:text>text-align: </xsl:text>
+ <xsl:choose>
+ <xsl:when test="@align = 'center'">middle</xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="@align"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:attribute>
+ </xsl:if>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="graphic">
+ <xsl:choose>
+ <xsl:when test="parent::inlineequation">
+ <xsl:call-template name="anchor"/>
+ <xsl:call-template name="process.image"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <div>
+ <xsl:if test="@align">
+ <xsl:attribute name="style"><xsl:text>text-align: </xsl:text>
+ <xsl:value-of select="@align"/>
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:call-template name="anchor"/>
+ <xsl:call-template name="process.image"/>
+ </div>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="inlinegraphic">
+ <xsl:variable name="filename">
+ <xsl:choose>
+ <xsl:when test="@entityref">
+ <xsl:value-of select="unparsed-entity-uri(@entityref)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="@fileref"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:call-template name="anchor"/>
+
+ <xsl:choose>
+ <xsl:when test="@format='linespecific'">
+ <xsl:choose>
+ <xsl:when test="$use.extensions != '0' and $textinsert.extension != '0'">
+ <xsl:choose>
+ <xsl:when test="element-available('stext:insertfile')">
+ <stext:insertfile href="{$filename}" encoding="{$textdata.default.encoding}"/>
+ </xsl:when>
+ <xsl:when test="element-available('xtext:insertfile')">
+ <xtext:insertfile href="{$filename}"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:message terminate="yes">
+ <xsl:text>No insertfile extension available.</xsl:text>
+ </xsl:message>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:message terminate="yes">
+ <xsl:text>Cannot insert </xsl:text><xsl:value-of select="$filename"/>
+ <xsl:text>. Check use.extensions and textinsert.extension parameters.</xsl:text>
+ </xsl:message>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="process.image"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="mediaobject|mediaobjectco">
+
+ <xsl:variable name="olist" select="imageobject|imageobjectco |videoobject|audioobject |textobject"/>
+
+ <xsl:variable name="object.index">
+ <xsl:call-template name="select.mediaobject.index">
+ <xsl:with-param name="olist" select="$olist"/>
+ <xsl:with-param name="count" select="1"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="object" select="$olist[position() = $object.index]"/>
+
+ <xsl:variable name="align">
+ <xsl:value-of select="$object/descendant::imagedata[@align][1]/@align"/>
+ </xsl:variable>
+
+ <div>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:if test="$align != '' ">
+ <xsl:attribute name="style"><xsl:text>text-align: </xsl:text>
+ <xsl:value-of select="$align"/>
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:call-template name="anchor"/>
+
+ <xsl:apply-templates select="$object"/>
+ <xsl:apply-templates select="caption"/>
+ </div>
+</xsl:template>
+
+<xsl:template match="inlinemediaobject">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:call-template name="anchor"/>
+ <xsl:call-template name="select.mediaobject"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="programlisting/inlinemediaobject |screen/inlinemediaobject" priority="2">
+ <!-- the additional span causes problems in some cases -->
+ <xsl:call-template name="select.mediaobject"/>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="imageobjectco">
+ <xsl:call-template name="anchor"/>
+ <xsl:apply-templates select="imageobject"/>
+ <xsl:apply-templates select="calloutlist"/>
+</xsl:template>
+
+<xsl:template match="imageobject">
+ <xsl:apply-templates select="imagedata"/>
+</xsl:template>
+
+<xsl:template match="imagedata">
+ <xsl:variable name="filename">
+ <xsl:call-template name="mediaobject.filename">
+ <xsl:with-param name="object" select=".."/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:choose>
+ <!-- Handle MathML and SVG markup in imagedata -->
+ <xsl:when xmlns:mml="http://www.w3.org/1998/Math/MathML" test="mml:*">
+ <xsl:apply-templates/>
+ </xsl:when>
+
+ <xsl:when xmlns:svg="http://www.w3.org/2000/svg" test="svg:*">
+ <xsl:apply-templates/>
+ </xsl:when>
+
+ <xsl:when test="@format='linespecific'">
+ <xsl:choose>
+ <xsl:when test="$use.extensions != '0' and $textinsert.extension != '0'">
+ <xsl:choose>
+ <xsl:when test="element-available('stext:insertfile')">
+ <stext:insertfile href="{$filename}" encoding="{$textdata.default.encoding}"/>
+ </xsl:when>
+ <xsl:when test="element-available('xtext:insertfile')">
+ <xtext:insertfile href="{$filename}"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:message terminate="yes">
+ <xsl:text>No insertfile extension available.</xsl:text>
+ </xsl:message>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <a xlink:type="simple" xlink:show="embed" xlink:actuate="onLoad" href="{$filename}"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:variable name="longdesc.uri">
+ <xsl:call-template name="longdesc.uri">
+ <xsl:with-param name="mediaobject" select="ancestor::imageobject/parent::*"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="phrases" select="ancestor::mediaobject/textobject[phrase] |ancestor::inlinemediaobject/textobject[phrase] |ancestor::mediaobjectco/textobject[phrase]"/>
+
+ <xsl:call-template name="process.image">
+ <xsl:with-param name="alt">
+ <xsl:apply-templates select="$phrases[not(@role) or @role!='tex'][1]"/>
+ </xsl:with-param>
+ <xsl:with-param name="longdesc">
+ <xsl:call-template name="write.longdesc">
+ <xsl:with-param name="mediaobject" select="ancestor::imageobject/parent::*"/>
+ </xsl:call-template>
+ </xsl:with-param>
+ </xsl:call-template>
+
+ <xsl:if test="$html.longdesc != 0 and $html.longdesc.link != 0 and ancestor::imageobject/parent::*/textobject[not(phrase)]">
+ <xsl:call-template name="longdesc.link">
+ <xsl:with-param name="longdesc.uri" select="$longdesc.uri"/>
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template name="longdesc.uri">
+ <xsl:param name="mediaobject" select="."/>
+ <xsl:if test="$html.longdesc">
+ <xsl:if test="$mediaobject/textobject[not(phrase)]">
+ <xsl:variable name="dbhtml.dir">
+ <xsl:call-template name="dbhtml-dir"/>
+ </xsl:variable>
+ <xsl:variable name="filename">
+ <xsl:call-template name="make-relative-filename">
+ <xsl:with-param name="base.dir">
+ <xsl:choose>
+ <xsl:when test="$dbhtml.dir != ''">
+ <xsl:value-of select="$dbhtml.dir"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$base.dir"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:with-param>
+ <xsl:with-param name="base.name">
+ <xsl:choose>
+ <xsl:when test=" $mediaobject/@*[local-name() = 'id'] and not($use.id.as.filename = 0)">
+ <!-- * if this mediaobject has an ID, then we use the -->
+ <!-- * value of that ID as basename for the "longdesc" -->
+ <!-- * file (that is, without prepending an "ld-" too it) -->
+ <xsl:value-of select="$mediaobject/@*[local-name() = 'id']"/>
+ <xsl:value-of select="$html.ext"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <!-- * otherwise, if this mediaobject does not have an -->
+ <!-- * ID, then we generate an ID... -->
+ <xsl:variable name="image-id">
+ <xsl:call-template name="object.id">
+ <xsl:with-param name="object" select="$mediaobject"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <!-- * ...and then we take that generated ID, prepend an -->
+ <!-- * "ld-" to it, and use that as the basename for the file -->
+ <xsl:value-of select="concat('ld-',$image-id,$html.ext)"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:value-of select="$filename"/>
+ </xsl:if>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template name="write.longdesc">
+ <xsl:param name="mediaobject" select="."/>
+ <xsl:if test="$html.longdesc != 0 and $mediaobject/textobject[not(phrase)]">
+ <xsl:variable name="filename">
+ <xsl:call-template name="longdesc.uri">
+ <xsl:with-param name="mediaobject" select="$mediaobject"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:value-of select="$filename"/>
+
+ <xsl:call-template name="write.chunk">
+ <xsl:with-param name="filename" select="$filename"/>
+ <xsl:with-param name="quiet" select="$chunk.quietly"/>
+ <xsl:with-param name="content">
+ <xsl:call-template name="user.preroot"/>
+ <html>
+ <head>
+ <xsl:call-template name="system.head.content"/>
+ <xsl:call-template name="head.content">
+ <xsl:with-param name="title" select="'Long Description'"/>
+ </xsl:call-template>
+ <xsl:call-template name="user.head.content"/>
+ </head>
+ <body>
+ <xsl:call-template name="body.attributes"/>
+ <xsl:for-each select="$mediaobject/textobject[not(phrase)]">
+ <xsl:apply-templates select="./*"/>
+ </xsl:for-each>
+ </body>
+ </html>
+ <xsl:value-of select="$chunk.append"/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template name="longdesc.link">
+ <xsl:param name="longdesc.uri" select="''"/>
+
+ <xsl:variable name="this.uri">
+ <xsl:call-template name="make-relative-filename">
+ <xsl:with-param name="base.dir" select="$base.dir"/>
+ <xsl:with-param name="base.name">
+ <xsl:call-template name="href.target.uri"/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="href.to">
+ <xsl:call-template name="trim.common.uri.paths">
+ <xsl:with-param name="uriA" select="$longdesc.uri"/>
+ <xsl:with-param name="uriB" select="$this.uri"/>
+ <xsl:with-param name="return" select="'A'"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <div class="longdesc-link" align="{$direction.align.end}">
+ <br clear="all"/>
+ <span class="longdesc-link">
+ <xsl:text>[</xsl:text>
+ <a href="{$href.to}" target="longdesc">D</a>
+ <xsl:text>]</xsl:text>
+ </span>
+ </div>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="videoobject">
+ <xsl:apply-templates select="videodata"/>
+</xsl:template>
+
+<xsl:template match="videodata">
+ <xsl:call-template name="process.image">
+ <xsl:with-param name="tag" select="'embed'"/>
+ <xsl:with-param name="alt">
+ <xsl:apply-templates select="(../../textobject/phrase)[1]"/>
+ </xsl:with-param>
+ </xsl:call-template>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="audioobject">
+ <xsl:apply-templates select="audiodata"/>
+</xsl:template>
+
+<xsl:template match="audiodata">
+ <xsl:call-template name="process.image">
+ <xsl:with-param name="tag" select="'embed'"/>
+ <xsl:with-param name="alt">
+ <xsl:apply-templates select="(../../textobject/phrase)[1]"/>
+ </xsl:with-param>
+ </xsl:call-template>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="textobject">
+ <xsl:apply-templates/>
+</xsl:template>
+
+<xsl:template match="textdata">
+ <xsl:variable name="filename">
+ <xsl:choose>
+ <xsl:when test="@entityref">
+ <xsl:value-of select="unparsed-entity-uri(@entityref)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="@fileref"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="encoding">
+ <xsl:choose>
+ <xsl:when test="@encoding">
+ <xsl:value-of select="@encoding"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$textdata.default.encoding"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="$use.extensions != '0' and $textinsert.extension != '0'">
+ <xsl:choose>
+ <xsl:when test="element-available('stext:insertfile')">
+ <stext:insertfile href="{$filename}" encoding="{$encoding}"/>
+ </xsl:when>
+ <xsl:when test="element-available('xtext:insertfile')">
+ <xtext:insertfile href="{$filename}"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:message terminate="yes">
+ <xsl:text>No insertfile extension available.</xsl:text>
+ </xsl:message>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:message terminate="yes">
+ <xsl:text>Cannot insert </xsl:text><xsl:value-of select="$filename"/>
+ <xsl:text>. Check use.extensions and textinsert.extension parameters.</xsl:text>
+ </xsl:message>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="caption">
+ <div>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:if test="@align = 'right' or @align = 'left' or @align='center'">
+ <xsl:attribute name="style"><xsl:text>text-align: </xsl:text><xsl:value-of select="@align"/></xsl:attribute>
+ </xsl:if>
+ <xsl:apply-templates/>
+ </div>
+</xsl:template>
+
+<!-- ==================================================================== -->
+<!-- "Support" for SVG -->
+
+<xsl:template xmlns:svg="http://www.w3.org/2000/svg" match="svg:*">
+ <xsl:copy>
+ <xsl:copy-of select="@*"/>
+ <xsl:apply-templates/>
+ </xsl:copy>
+</xsl:template>
+
+
+<!-- The following works sometimes, but needs to take into account
+ 1. When there is no /*/@xml:base
+ 2. When the chunks are going somewhere else
+<xsl:variable name="relpath">
+ <xsl:call-template name="relative-uri">
+ <xsl:with-param name="filename" select="@fileref"/>
+ </xsl:call-template>
+</xsl:variable>
+
+<xsl:choose>
+ <xsl:when test="/*/@xml:base
+ and starts-with($relpath,/*/@xml:base)">
+ <xsl:value-of select="substring-after($relpath,/*/@xml:base)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="@fileref"/>
+ </xsl:otherwise>
+</xsl:choose>
+<xsl:value-of select="@fileref"/>
+ </xsl:when>
+-->
+<!-- Resolve xml:base attributes -->
+<xsl:template match="@fileref">
+ <!-- need a check for absolute urls -->
+ <xsl:choose>
+ <xsl:when test="contains(., ':')">
+ <!-- it has a uri scheme so it is an absolute uri -->
+ <xsl:value-of select="."/>
+ </xsl:when>
+ <xsl:when test="$keep.relative.image.uris != 0">
+ <!-- leave it alone -->
+ <xsl:value-of select="."/>
+ </xsl:when>
+ <xsl:otherwise>
+ <!-- its a relative uri that needs xml:base processing -->
+ <xsl:call-template name="relative-uri">
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/highlight.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/highlight.xsl
new file mode 100644
index 0000000..222a055
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/highlight.xsl
@@ -0,0 +1,88 @@
+<?xml version="1.0" encoding="ASCII"?>
+<!--This file was created automatically by html2xhtml-->
+<!--from the HTML stylesheets.-->
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xslthl="http://xslthl.sf.net" xmlns="http://www.w3.org/1999/xhtml" exclude-result-prefixes="xslthl" version="1.0">
+ <!-- ********************************************************************
+ $Id: highlight.xsl 8911 2010-09-28 17:02:06Z abdelazer $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ and other information.
+
+ ******************************************************************** -->
+ <xsl:import href="../highlighting/common.xsl"/>
+ <xsl:template match="xslthl:keyword" mode="xslthl">
+ <strong class="hl-keyword">
+ <xsl:apply-templates mode="xslthl"/>
+ </strong>
+ </xsl:template>
+ <xsl:template match="xslthl:string" mode="xslthl">
+ <strong class="hl-string">
+ <em style="color:red">
+ <xsl:apply-templates mode="xslthl"/>
+ </em>
+ </strong>
+ </xsl:template>
+ <xsl:template match="xslthl:comment" mode="xslthl">
+ <em class="hl-comment" style="color: silver">
+ <xsl:apply-templates mode="xslthl"/>
+ </em>
+ </xsl:template>
+ <xsl:template match="xslthl:directive" mode="xslthl">
+ <span class="hl-directive" style="color: maroon">
+ <xsl:apply-templates mode="xslthl"/>
+ </span>
+ </xsl:template>
+ <xsl:template match="xslthl:tag" mode="xslthl">
+ <strong class="hl-tag" style="color: #000096">
+ <xsl:apply-templates mode="xslthl"/>
+ </strong>
+ </xsl:template>
+ <xsl:template match="xslthl:attribute" mode="xslthl">
+ <span class="hl-attribute" style="color: #F5844C">
+ <xsl:apply-templates mode="xslthl"/>
+ </span>
+ </xsl:template>
+ <xsl:template match="xslthl:value" mode="xslthl">
+ <span class="hl-value" style="color: #993300">
+ <xsl:apply-templates mode="xslthl"/>
+ </span>
+ </xsl:template>
+ <xsl:template match="xslthl:html" mode="xslthl">
+ <strong>
+ <em style="color: red">
+ <xsl:apply-templates mode="xslthl"/>
+ </em>
+ </strong>
+ </xsl:template>
+ <xsl:template match="xslthl:xslt" mode="xslthl">
+ <strong style="color: #0066FF">
+ <xsl:apply-templates mode="xslthl"/>
+ </strong>
+ </xsl:template>
+ <!-- Not emitted since XSLTHL 2.0 -->
+ <xsl:template match="xslthl:section" mode="xslthl">
+ <strong>
+ <xsl:apply-templates mode="xslthl"/>
+ </strong>
+ </xsl:template>
+ <xsl:template match="xslthl:number" mode="xslthl">
+ <span class="hl-number">
+ <xsl:apply-templates mode="xslthl"/>
+ </span>
+ </xsl:template>
+ <xsl:template match="xslthl:annotation" mode="xslthl">
+ <em>
+ <span class="hl-annotation" style="color: gray">
+ <xsl:apply-templates mode="xslthl"/>
+ </span>
+ </em>
+ </xsl:template>
+ <!-- Not sure which element will be in final XSLTHL 2.0 -->
+ <xsl:template match="xslthl:doccomment|xslthl:doctype" mode="xslthl">
+ <strong class="hl-tag" style="color: blue">
+ <xsl:apply-templates mode="xslthl"/>
+ </strong>
+ </xsl:template>
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/html-rtf.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/html-rtf.xsl
new file mode 100644
index 0000000..e079a73
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/html-rtf.xsl
@@ -0,0 +1,321 @@
+<?xml version="1.0" encoding="ASCII"?>
+<!--This file was created automatically by html2xhtml-->
+<!--from the HTML stylesheets.-->
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:exsl="http://exslt.org/common" xmlns:set="http://exslt.org/sets" xmlns="http://www.w3.org/1999/xhtml" exclude-result-prefixes="exsl set" version="1.0">
+
+<!-- ********************************************************************
+ $Id: html-rtf.xsl 8345 2009-03-16 06:44:07Z bobstayton $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<!-- ==================================================================== -->
+
+<!-- This module contains templates that match against HTML nodes. It is used
+ to post-process result tree fragments for some sorts of cleanup.
+ These templates can only ever be fired by a processor that supports
+ exslt:node-set(). -->
+
+<!-- ==================================================================== -->
+
+<!-- insert.html.p mode templates insert a particular RTF at the beginning
+ of the first paragraph in the primary RTF. -->
+
+<xsl:template match="/" mode="insert.html.p">
+ <xsl:param name="mark" select="'?'"/>
+ <xsl:apply-templates mode="insert.html.p">
+ <xsl:with-param name="mark" select="$mark"/>
+ </xsl:apply-templates>
+</xsl:template>
+
+<xsl:template match="*" mode="insert.html.p">
+ <xsl:param name="mark" select="'?'"/>
+ <xsl:copy>
+ <xsl:copy-of select="@*"/>
+ <xsl:apply-templates mode="insert.html.p">
+ <xsl:with-param name="mark" select="$mark"/>
+ </xsl:apply-templates>
+ </xsl:copy>
+</xsl:template>
+
+<xsl:template xmlns:html="http://www.w3.org/1999/xhtml" match="html:p|p" mode="insert.html.p">
+ <xsl:param name="mark" select="'?'"/>
+ <xsl:copy>
+ <xsl:copy-of select="@*"/>
+ <xsl:if test="not(preceding::p|preceding::html:p)">
+ <xsl:copy-of select="$mark"/>
+ </xsl:if>
+ <xsl:apply-templates mode="insert.html.p">
+ <xsl:with-param name="mark" select="$mark"/>
+ </xsl:apply-templates>
+ </xsl:copy>
+</xsl:template>
+
+<xsl:template match="text()|processing-instruction()|comment()" mode="insert.html.p">
+ <xsl:param name="mark" select="'?'"/>
+ <xsl:copy/>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<!-- insert.html.text mode templates insert a particular RTF at the beginning
+ of the first text-node in the primary RTF. -->
+
+<xsl:template match="/" mode="insert.html.text">
+ <xsl:param name="mark" select="'?'"/>
+ <xsl:apply-templates mode="insert.html.text">
+ <xsl:with-param name="mark" select="$mark"/>
+ </xsl:apply-templates>
+</xsl:template>
+
+<xsl:template match="*" mode="insert.html.text">
+ <xsl:param name="mark" select="'?'"/>
+ <xsl:copy>
+ <xsl:copy-of select="@*"/>
+ <xsl:apply-templates mode="insert.html.text">
+ <xsl:with-param name="mark" select="$mark"/>
+ </xsl:apply-templates>
+ </xsl:copy>
+</xsl:template>
+
+<xsl:template match="text()|processing-instruction()|comment()" mode="insert.html.text">
+ <xsl:param name="mark" select="'?'"/>
+
+ <xsl:if test="not(preceding::text())">
+ <xsl:copy-of select="$mark"/>
+ </xsl:if>
+
+ <xsl:copy/>
+</xsl:template>
+
+<xsl:template match="processing-instruction()|comment()" mode="insert.html.text">
+ <xsl:param name="mark" select="'?'"/>
+ <xsl:copy/>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<!-- unwrap.p mode templates remove blocks from HTML p elements (and
+ other places where blocks aren't allowed) -->
+
+<xsl:template name="unwrap.p">
+ <xsl:param name="p"/>
+ <xsl:choose>
+ <xsl:when test="$exsl.node.set.available != 0 and function-available('set:leading') and function-available('set:trailing')">
+ <xsl:apply-templates select="exsl:node-set($p)" mode="unwrap.p"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:copy-of select="$p"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template xmlns:html="http://www.w3.org/1999/xhtml" match="html:p|p" mode="unwrap.p">
+ <!-- xmlns:html is necessary for the xhtml stylesheet case -->
+ <xsl:variable name="blocks" select="address|blockquote|div|hr|h1|h2|h3|h4|h5|h6 |layer|p|pre|table|dl|menu|ol|ul|form |html:address|html:blockquote|html:div|html:hr |html:h1|html:h2|html:h3|html:h4|html:h5|html:h6 |html:layer|html:p|html:pre|html:table|html:dl |html:menu|html:ol|html:ul|html:form"/>
+ <xsl:choose>
+ <xsl:when test="$blocks">
+ <xsl:call-template name="unwrap.p.nodes">
+ <xsl:with-param name="wrap" select="."/>
+ <xsl:with-param name="first" select="1"/>
+ <xsl:with-param name="nodes" select="node()"/>
+ <xsl:with-param name="blocks" select="$blocks"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:copy>
+ <xsl:copy-of select="@*"/>
+ <xsl:apply-templates mode="unwrap.p"/>
+ </xsl:copy>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="*" mode="unwrap.p">
+ <xsl:copy>
+ <xsl:copy-of select="@*"/>
+ <xsl:apply-templates mode="unwrap.p"/>
+ </xsl:copy>
+</xsl:template>
+
+<xsl:template match="text()|processing-instruction()|comment()" mode="unwrap.p">
+ <xsl:copy/>
+</xsl:template>
+
+<xsl:template name="unwrap.p.nodes">
+ <xsl:param name="wrap" select="."/>
+ <xsl:param name="first" select="0"/>
+ <xsl:param name="nodes"/>
+ <xsl:param name="blocks"/>
+ <xsl:variable name="block" select="$blocks[1]"/>
+
+ <!-- This template should never get called if these functions aren't available -->
+ <!-- but this test is still necessary so that processors don't choke on the -->
+ <!-- function calls if they don't support the set: functions -->
+ <xsl:if test="function-available('set:leading') and function-available('set:trailing')">
+ <xsl:choose>
+ <xsl:when test="$blocks">
+ <xsl:variable name="leading" select="set:leading($nodes,$block)"/>
+ <xsl:variable name="trailing" select="set:trailing($nodes,$block)"/>
+
+ <xsl:if test="(($wrap/@id or $wrap/@xml:id) and $first = 1) or $leading">
+ <xsl:element name="{local-name($wrap)}" namespace="http://www.w3.org/1999/xhtml">
+ <xsl:for-each select="$wrap/@*">
+ <xsl:if test="$first != 0 or local-name(.) != 'id'">
+ <xsl:copy/>
+ </xsl:if>
+ </xsl:for-each>
+ <xsl:apply-templates select="$leading" mode="unwrap.p"/>
+ </xsl:element>
+ </xsl:if>
+
+ <xsl:apply-templates select="$block" mode="unwrap.p"/>
+
+ <xsl:if test="$trailing">
+ <xsl:call-template name="unwrap.p.nodes">
+ <xsl:with-param name="wrap" select="$wrap"/>
+ <xsl:with-param name="nodes" select="$trailing"/>
+ <xsl:with-param name="blocks" select="$blocks[position() &gt; 1]"/>
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:when>
+
+ <xsl:otherwise>
+ <xsl:if test="(($wrap/@id or $wrap/@xml:id) and $first = 1) or $nodes">
+ <xsl:element name="{local-name($wrap)}" namespace="http://www.w3.org/1999/xhtml">
+ <xsl:for-each select="$wrap/@*">
+ <xsl:if test="$first != 0 or local-name(.) != 'id'">
+ <xsl:copy/>
+ </xsl:if>
+ </xsl:for-each>
+ <xsl:apply-templates select="$nodes" mode="unwrap.p"/>
+ </xsl:element>
+ </xsl:if>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:if>
+</xsl:template>
+
+<!-- ==================================================================== -->
+<!-- make.verbatim.mode replaces spaces and newlines -->
+
+<xsl:template match="/" mode="make.verbatim.mode">
+ <xsl:apply-templates mode="make.verbatim.mode"/>
+</xsl:template>
+
+<xsl:template match="*" mode="make.verbatim.mode">
+ <xsl:copy>
+ <xsl:copy-of select="@*"/>
+ <xsl:apply-templates mode="make.verbatim.mode"/>
+ </xsl:copy>
+</xsl:template>
+
+<xsl:template match="processing-instruction()|comment()" mode="make.verbatim.mode">
+ <xsl:copy/>
+</xsl:template>
+
+<xsl:template match="text()" mode="make.verbatim.mode">
+ <xsl:variable name="text" select="translate(., ' ', '&#160;')"/>
+
+ <xsl:choose>
+ <xsl:when test="not(contains($text, '&#10;'))">
+ <xsl:value-of select="$text"/>
+ </xsl:when>
+
+ <xsl:otherwise>
+ <xsl:variable name="len" select="string-length($text)"/>
+
+ <xsl:choose>
+ <xsl:when test="$len = 1">
+ <br/><xsl:text>
+</xsl:text>
+ </xsl:when>
+
+ <xsl:otherwise>
+ <xsl:variable name="half" select="$len div 2"/>
+ <xsl:call-template name="make-verbatim-recursive">
+ <xsl:with-param name="text" select="substring($text, 1, $half)"/>
+ </xsl:call-template>
+ <xsl:call-template name="make-verbatim-recursive">
+ <xsl:with-param name="text" select="substring($text, ($half + 1), $len)"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="make-verbatim-recursive">
+ <xsl:param name="text" select="''"/>
+
+ <xsl:choose>
+ <xsl:when test="not(contains($text, '&#10;'))">
+ <xsl:value-of select="$text"/>
+ </xsl:when>
+
+ <xsl:otherwise>
+ <xsl:variable name="len" select="string-length($text)"/>
+
+ <xsl:choose>
+ <xsl:when test="$len = 1">
+ <br/><xsl:text>
+</xsl:text>
+ </xsl:when>
+
+ <xsl:otherwise>
+ <xsl:variable name="half" select="$len div 2"/>
+ <xsl:call-template name="make-verbatim-recursive">
+ <xsl:with-param name="text" select="substring($text, 1, $half)"/>
+ </xsl:call-template>
+ <xsl:call-template name="make-verbatim-recursive">
+ <xsl:with-param name="text" select="substring($text, ($half + 1), $len)"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<!-- remove.empty.div mode templates remove empty blocks -->
+
+<xsl:template name="remove.empty.div">
+ <xsl:param name="div"/>
+ <xsl:choose>
+ <xsl:when test="$exsl.node.set.available != 0">
+ <xsl:apply-templates select="exsl:node-set($div)" mode="remove.empty.div"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:copy-of select="$div"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template xmlns:html="http://www.w3.org/1999/xhtml" match="html:p|p|html:div|div" mode="remove.empty.div">
+ <xsl:if test="node()">
+ <xsl:copy>
+ <xsl:copy-of select="@*"/>
+ <xsl:apply-templates mode="remove.empty.div"/>
+ </xsl:copy>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="*" mode="remove.empty.div">
+ <xsl:copy>
+ <xsl:copy-of select="@*"/>
+ <xsl:apply-templates mode="remove.empty.div"/>
+ </xsl:copy>
+</xsl:template>
+
+<xsl:template match="text()|processing-instruction()|comment()" mode="remove.empty.div">
+ <xsl:copy/>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/html.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/html.xsl
new file mode 100644
index 0000000..154a645
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/html.xsl
@@ -0,0 +1,598 @@
+<?xml version="1.0" encoding="ASCII"?>
+<!--This file was created automatically by html2xhtml-->
+<!--from the HTML stylesheets.-->
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1999/xhtml" version="1.0">
+
+<!-- ********************************************************************
+ $Id: html.xsl 8556 2009-12-11 00:05:45Z bobstayton $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<!-- These variables set the align attribute value for HTML output based on
+ the writing-mode specified in the gentext file for the document's lang. -->
+
+<xsl:variable name="direction.align.start">
+ <xsl:choose>
+ <xsl:when test="starts-with($writing.mode, 'lr')">left</xsl:when>
+ <xsl:when test="starts-with($writing.mode, 'rl')">right</xsl:when>
+ <xsl:otherwise>left</xsl:otherwise>
+ </xsl:choose>
+</xsl:variable>
+
+<xsl:variable name="direction.align.end">
+ <xsl:choose>
+ <xsl:when test="starts-with($writing.mode, 'lr')">right</xsl:when>
+ <xsl:when test="starts-with($writing.mode, 'rl')">left</xsl:when>
+ <xsl:otherwise>right</xsl:otherwise>
+ </xsl:choose>
+</xsl:variable>
+
+<xsl:variable name="direction.mode">
+ <xsl:choose>
+ <xsl:when test="starts-with($writing.mode, 'lr')">ltr</xsl:when>
+ <xsl:when test="starts-with($writing.mode, 'rl')">rtl</xsl:when>
+ <xsl:otherwise>ltr</xsl:otherwise>
+ </xsl:choose>
+</xsl:variable>
+
+<!-- The generate.html.title template is currently used for generating HTML -->
+<!-- "title" attributes for some inline elements only, but not for any -->
+<!-- block elements. It is called in eleven places in the inline.xsl -->
+<!-- file. But it's called by all the inline.* templates (e.g., -->
+<!-- inline.boldseq), which in turn are called by other (element) -->
+<!-- templates, so it results, currently, in supporting generation of the -->
+<!-- HTML "title" attribute for a total of about 92 elements. -->
+<!-- You can use mode="html.title.attribute" to get a title for -->
+<!-- an element specified by a param, including targets of cross references. -->
+<xsl:template name="generate.html.title">
+ <xsl:apply-templates select="." mode="html.title.attribute"/>
+</xsl:template>
+
+<!-- Generate a title attribute for the context node -->
+<xsl:template match="*" mode="html.title.attribute">
+ <xsl:variable name="is.title">
+ <xsl:call-template name="gentext.template.exists">
+ <xsl:with-param name="context" select="'title'"/>
+ <xsl:with-param name="name" select="local-name(.)"/>
+ <xsl:with-param name="lang">
+ <xsl:call-template name="l10n.language"/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="is.title-numbered">
+ <xsl:call-template name="gentext.template.exists">
+ <xsl:with-param name="context" select="'title-numbered'"/>
+ <xsl:with-param name="name" select="local-name(.)"/>
+ <xsl:with-param name="lang">
+ <xsl:call-template name="l10n.language"/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="is.title-unnumbered">
+ <xsl:call-template name="gentext.template.exists">
+ <xsl:with-param name="context" select="'title-unnumbered'"/>
+ <xsl:with-param name="name" select="local-name(.)"/>
+ <xsl:with-param name="lang">
+ <xsl:call-template name="l10n.language"/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="has.title.markup">
+ <xsl:apply-templates select="." mode="title.markup">
+ <xsl:with-param name="verbose" select="0"/>
+ </xsl:apply-templates>
+ </xsl:variable>
+
+ <xsl:variable name="gentext.title">
+ <xsl:if test="$has.title.markup != '???TITLE???' and ($is.title != 0 or $is.title-numbered != 0 or $is.title-unnumbered != 0)">
+ <xsl:apply-templates select="." mode="object.title.markup.textonly"/>
+ </xsl:if>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="string-length($gentext.title) != 0">
+ <xsl:attribute name="title">
+ <xsl:value-of select="$gentext.title"/>
+ </xsl:attribute>
+ </xsl:when>
+ <!-- Fall back to alt if available -->
+ <xsl:when test="alt">
+ <xsl:attribute name="title">
+ <xsl:value-of select="normalize-space(alt)"/>
+ </xsl:attribute>
+ </xsl:when>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="qandaentry" mode="html.title.attribute">
+ <xsl:apply-templates select="question" mode="html.title.attribute"/>
+</xsl:template>
+
+<xsl:template match="question" mode="html.title.attribute">
+ <xsl:variable name="label.text">
+ <xsl:apply-templates select="." mode="qanda.label"/>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="string-length($label.text) != 0">
+ <xsl:attribute name="title">
+ <xsl:value-of select="$label.text"/>
+ </xsl:attribute>
+ </xsl:when>
+ <!-- Fall back to alt if available -->
+ <xsl:when test="alt">
+ <xsl:attribute name="title">
+ <xsl:value-of select="normalize-space(alt)"/>
+ </xsl:attribute>
+ </xsl:when>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="dir">
+ <xsl:param name="inherit" select="0"/>
+
+ <xsl:variable name="dir">
+ <xsl:choose>
+ <xsl:when test="@dir">
+ <xsl:value-of select="@dir"/>
+ </xsl:when>
+ <xsl:when test="$inherit != 0">
+ <xsl:value-of select="ancestor::*/@dir[1]"/>
+ </xsl:when>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:if test="$dir != ''">
+ <xsl:attribute name="dir">
+ <xsl:value-of select="$dir"/>
+ </xsl:attribute>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template name="anchor">
+ <xsl:param name="node" select="."/>
+ <xsl:param name="conditional" select="1"/>
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id">
+ <xsl:with-param name="object" select="$node"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xslo:if xmlns:xslo="http://www.w3.org/1999/XSL/Transform" test="not($node[parent::blockquote])"><xsl:if test="$conditional = 0 or $node/@id or $node/@xml:id">
+ <a id="{$id}"/>
+ </xsl:if></xslo:if>
+</xsl:template>
+
+<xsl:template name="href.target.uri">
+ <xsl:param name="context" select="."/>
+ <xsl:param name="object" select="."/>
+ <xsl:text>#</xsl:text>
+ <xsl:call-template name="object.id">
+ <xsl:with-param name="object" select="$object"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template name="href.target">
+ <xsl:param name="context" select="."/>
+ <xsl:param name="object" select="."/>
+ <xsl:text>#</xsl:text>
+ <xsl:call-template name="object.id">
+ <xsl:with-param name="object" select="$object"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template name="href.target.with.base.dir">
+ <xsl:param name="context" select="."/>
+ <xsl:param name="object" select="."/>
+ <xsl:if test="$manifest.in.base.dir = 0">
+ <xsl:value-of select="$base.dir"/>
+ </xsl:if>
+ <xsl:call-template name="href.target">
+ <xsl:with-param name="context" select="$context"/>
+ <xsl:with-param name="object" select="$object"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template name="dingbat">
+ <xsl:param name="dingbat">bullet</xsl:param>
+ <xsl:call-template name="dingbat.characters">
+ <xsl:with-param name="dingbat" select="$dingbat"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template name="dingbat.characters">
+ <!-- now that I'm using the real serializer, all that dingbat malarky -->
+ <!-- isn't necessary anymore... -->
+ <xsl:param name="dingbat">bullet</xsl:param>
+ <xsl:choose>
+ <xsl:when test="$dingbat='bullet'">&#8226;</xsl:when>
+ <xsl:when test="$dingbat='copyright'">&#169;</xsl:when>
+ <xsl:when test="$dingbat='trademark'">&#8482;</xsl:when>
+ <xsl:when test="$dingbat='trade'">&#8482;</xsl:when>
+ <xsl:when test="$dingbat='registered'">&#174;</xsl:when>
+ <xsl:when test="$dingbat='service'">(SM)</xsl:when>
+ <xsl:when test="$dingbat='nbsp'">&#160;</xsl:when>
+ <xsl:when test="$dingbat='ldquo'">&#8220;</xsl:when>
+ <xsl:when test="$dingbat='rdquo'">&#8221;</xsl:when>
+ <xsl:when test="$dingbat='lsquo'">&#8216;</xsl:when>
+ <xsl:when test="$dingbat='rsquo'">&#8217;</xsl:when>
+ <xsl:when test="$dingbat='em-dash'">&#8212;</xsl:when>
+ <xsl:when test="$dingbat='mdash'">&#8212;</xsl:when>
+ <xsl:when test="$dingbat='en-dash'">&#8211;</xsl:when>
+ <xsl:when test="$dingbat='ndash'">&#8211;</xsl:when>
+ <xsl:otherwise>
+ <xsl:text>&#8226;</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="id.warning">
+ <xsl:if test="$id.warnings != 0 and not(@id) and not(@xml:id) and parent::*">
+ <xsl:variable name="title">
+ <xsl:choose>
+ <xsl:when test="title">
+ <xsl:value-of select="title[1]"/>
+ </xsl:when>
+ <xsl:when test="substring(local-name(*[1]), string-length(local-name(*[1])-3) = 'info') and *[1]/title">
+ <xsl:value-of select="*[1]/title[1]"/>
+ </xsl:when>
+ <xsl:when test="refmeta/refentrytitle">
+ <xsl:value-of select="refmeta/refentrytitle"/>
+ </xsl:when>
+ <xsl:when test="refnamediv/refname">
+ <xsl:value-of select="refnamediv/refname[1]"/>
+ </xsl:when>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:message>
+ <xsl:text>ID recommended on </xsl:text>
+ <xsl:value-of select="local-name(.)"/>
+ <xsl:if test="$title != ''">
+ <xsl:text>: </xsl:text>
+ <xsl:choose>
+ <xsl:when test="string-length($title) &gt; 40">
+ <xsl:value-of select="substring($title,1,40)"/>
+ <xsl:text>...</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$title"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:if>
+ </xsl:message>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template name="generate.class.attribute">
+ <xsl:param name="class" select="local-name(.)"/>
+ <xsl:apply-templates select="." mode="class.attribute">
+ <xsl:with-param name="class" select="$class"/>
+ </xsl:apply-templates>
+</xsl:template>
+
+<xsl:template match="*" mode="class.attribute">
+ <xsl:param name="class" select="local-name(.)"/>
+ <!-- permit customization of class attributes -->
+ <!-- Use element name by default -->
+ <xsl:attribute name="class">
+ <xsl:apply-templates select="." mode="class.value">
+ <xsl:with-param name="class" select="$class"/>
+ </xsl:apply-templates>
+ </xsl:attribute>
+</xsl:template>
+
+<xsl:template match="*" mode="class.value">
+ <xsl:param name="class" select="local-name(.)"/>
+ <!-- permit customization of class value only -->
+ <!-- Use element name by default -->
+ <xsl:value-of select="$class"/>
+</xsl:template>
+
+<!-- Apply common attributes such as class, lang, dir -->
+<xsl:template name="common.html.attributes">
+ <xsl:param name="inherit" select="0"/>
+ <xsl:param name="class" select="local-name(.)"/>
+ <xsl:apply-templates select="." mode="common.html.attributes">
+ <xsl:with-param name="class" select="$class"/>
+ <xsl:with-param name="inherit" select="$inherit"/>
+ </xsl:apply-templates>
+</xsl:template>
+
+<xsl:template match="*" mode="common.html.attributes">
+ <xsl:param name="class" select="local-name(.)"/>
+ <xsl:param name="inherit" select="0"/>
+ <xsl:call-template name="generate.html.lang"/>
+ <xsl:call-template name="dir">
+ <xsl:with-param name="inherit" select="$inherit"/>
+ </xsl:call-template>
+ <xsl:apply-templates select="." mode="class.attribute">
+ <xsl:with-param name="class" select="$class"/>
+ </xsl:apply-templates>
+ <xsl:call-template name="generate.html.title"/>
+</xsl:template>
+
+<!-- Apply common attributes not including class -->
+<xsl:template name="locale.html.attributes">
+ <xsl:apply-templates select="." mode="locale.html.attributes"/>
+</xsl:template>
+
+<xsl:template match="*" mode="locale.html.attributes">
+ <xsl:call-template name="generate.html.lang"/>
+ <xsl:call-template name="dir"/>
+ <xsl:call-template name="generate.html.title"/>
+</xsl:template>
+
+<!-- Pass through any lang attributes -->
+<xsl:template name="generate.html.lang">
+ <xsl:apply-templates select="." mode="html.lang.attribute"/>
+</xsl:template>
+
+<xsl:template match="*" mode="html.lang.attribute">
+ <!-- match the attribute name to the output type -->
+ <xsl:choose>
+ <xsl:when test="@lang and $stylesheet.result.type = 'html'">
+ <xsl:attribute name="lang">
+ <xsl:value-of select="@lang"/>
+ </xsl:attribute>
+ </xsl:when>
+ <xsl:when test="@lang and $stylesheet.result.type = 'xhtml'">
+ <xsl:attribute name="xml:lang">
+ <xsl:value-of select="@lang"/>
+ </xsl:attribute>
+ </xsl:when>
+ <xsl:when test="@xml:lang and $stylesheet.result.type = 'html'">
+ <xsl:attribute name="lang">
+ <xsl:value-of select="@xml:lang"/>
+ </xsl:attribute>
+ </xsl:when>
+ <xsl:when test="@xml:lang and $stylesheet.result.type = 'xhtml'">
+ <xsl:attribute name="xml:lang">
+ <xsl:value-of select="@xml:lang"/>
+ </xsl:attribute>
+ </xsl:when>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ==================================================================== -->
+<!-- Insert link to css or insert literal CSS in head element -->
+<xsl:template name="generate.css">
+ <xsl:choose>
+ <xsl:when test="$generate.css.header = 0">
+ <xsl:call-template name="generate.css.links"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="generate.css.headers"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="generate.css.headers">
+ <xsl:call-template name="generate.default.css.header"/>
+ <xsl:call-template name="generate.custom.css.header"/>
+</xsl:template>
+
+<xsl:template name="generate.default.css.header">
+ <xsl:if test="$make.clean.html != 0 and $docbook.css.source != ''">
+ <!-- Select default file relative to stylesheet -->
+ <xsl:variable name="css.node" select="document($docbook.css.source)/*[1]"/>
+
+ <xsl:call-template name="output.css.header">
+ <xsl:with-param name="css.node" select="$css.node"/>
+ </xsl:call-template>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template name="generate.custom.css.header">
+ <xsl:if test="$custom.css.source != ''">
+ <!-- Select custom file relative to document -->
+ <xsl:variable name="css.node" select="document($custom.css.source,.)/*[1]"/>
+
+ <xsl:call-template name="output.css.header">
+ <xsl:with-param name="css.node" select="$css.node"/>
+ </xsl:call-template>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template name="output.css.header">
+ <xsl:param name="css.node"/>
+
+ <xsl:choose>
+ <xsl:when test="count($css.node) = 0">
+ </xsl:when>
+ <xsl:otherwise>
+ <style type="text/css">
+ <xsl:copy-of select="$css.node/text()"/>
+ </style>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ==================================================================== -->
+<xsl:template name="generate.css.links">
+ <xsl:call-template name="generate.default.css.link"/>
+ <xsl:call-template name="generate.custom.css.link"/>
+</xsl:template>
+
+<xsl:template name="generate.default.css.link">
+ <xsl:if test="$make.clean.html != 0 and $docbook.css.link != 0 and $docbook.css.source != ''">
+ <xsl:variable name="filename">
+ <xsl:call-template name="css.output.filename">
+ <xsl:with-param name="src" select="$docbook.css.source"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:call-template name="make.css.link">
+ <xsl:with-param name="css.filename" select="$filename"/>
+ </xsl:call-template>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template name="generate.custom.css.link">
+ <xsl:if test="$custom.css.source != ''">
+ <xsl:variable name="filename">
+ <xsl:call-template name="css.output.filename">
+ <xsl:with-param name="src" select="$custom.css.source"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:call-template name="make.css.link">
+ <xsl:with-param name="css.filename" select="$filename"/>
+ </xsl:call-template>
+ </xsl:if>
+</xsl:template>
+
+<!-- a CSS link reference must take into account the relative
+ path to a CSS file when chunked HTML is output to more than one directory -->
+<xsl:template name="make.css.link">
+ <xsl:param name="css.filename" select="''"/>
+
+ <xsl:variable name="href.to.uri" select="$css.filename"/>
+
+ <xsl:variable name="href.from.uri">
+ <xsl:call-template name="href.target.uri">
+ <xsl:with-param name="object" select="."/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="href.to">
+ <xsl:call-template name="trim.common.uri.paths">
+ <xsl:with-param name="uriA" select="$href.to.uri"/>
+ <xsl:with-param name="uriB" select="$href.from.uri"/>
+ <xsl:with-param name="return" select="'A'"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="href.from">
+ <xsl:call-template name="trim.common.uri.paths">
+ <xsl:with-param name="uriA" select="$href.to.uri"/>
+ <xsl:with-param name="uriB" select="$href.from.uri"/>
+ <xsl:with-param name="return" select="'B'"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:variable name="depth">
+ <xsl:call-template name="count.uri.path.depth">
+ <xsl:with-param name="filename" select="$href.from"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:variable name="href">
+ <xsl:call-template name="copy-string">
+ <xsl:with-param name="string" select="'../'"/>
+ <xsl:with-param name="count" select="$depth"/>
+ </xsl:call-template>
+ <xsl:value-of select="$href.to"/>
+ </xsl:variable>
+
+ <xsl:if test="string-length($css.filename) != 0">
+ <link rel="stylesheet" type="text/css" href="{$href}"/>
+ </xsl:if>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template name="generate.css.files">
+ <xsl:call-template name="generate.default.css.file"/>
+ <xsl:call-template name="generate.custom.css.file"/>
+</xsl:template>
+
+<xsl:template name="generate.default.css.file">
+ <xsl:if test="$make.clean.html != 0 and $generate.css.header = 0 and $docbook.css.source != ''">
+ <!-- Select default file relative to stylesheet -->
+ <xsl:variable name="css.node" select="document($docbook.css.source)/*[1]"/>
+
+ <xsl:call-template name="generate.css.file">
+ <xsl:with-param name="src" select="$docbook.css.source"/>
+ <xsl:with-param name="css.node" select="$css.node"/>
+ </xsl:call-template>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template name="generate.custom.css.file">
+ <xsl:if test="$custom.css.source != '' and $generate.css.header = 0">
+ <!-- Select custom file relative to document -->
+ <xsl:variable name="css.node" select="document($custom.css.source,.)/*[1]"/>
+
+ <xsl:call-template name="generate.css.file">
+ <xsl:with-param name="src" select="$custom.css.source"/>
+ <xsl:with-param name="css.node" select="$css.node"/>
+ </xsl:call-template>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template name="generate.css.file">
+ <xsl:param name="css.node"/>
+ <xsl:param name="src" select="''"/>
+
+ <xsl:variable name="css.text" select="$css.node/text()"/>
+
+ <xsl:choose>
+ <xsl:when test="count($css.node) = 0">
+ <xsl:message>
+ <xsl:text>ERROR: no root element for CSS source file'</xsl:text>
+ <xsl:value-of select="$src"/>
+ <xsl:text>'.</xsl:text>
+ </xsl:message>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:variable name="filename">
+ <xsl:call-template name="css.output.pathname">
+ <xsl:with-param name="src" select="$src"/>
+ <xsl:with-param name="content" select="$css.node"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:call-template name="write.text.chunk">
+ <xsl:with-param name="filename" select="$filename"/>
+ <xsl:with-param name="content" select="$css.text"/>
+ </xsl:call-template>
+
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="css.output.filename">
+ <xsl:param name="content"/>
+ <xsl:param name="src" select="''"/>
+
+ <xsl:variable name="candidate">
+ <xsl:choose>
+ <xsl:when test="string-length($src) = 0">
+ <xsl:message>
+ <xsl:text>ERROR: missing CSS input filename.</xsl:text>
+ </xsl:message>
+ </xsl:when>
+ <xsl:when test="substring($src,string-length($src)-3) = '.xml'">
+ <xsl:value-of select="substring($src, 1, string-length($src) - 4)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$src"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:value-of select="$candidate"/>
+</xsl:template>
+
+<xsl:template name="css.output.pathname">
+ <xsl:param name="content"/>
+ <xsl:param name="src" select="''"/>
+
+ <xsl:variable name="file">
+ <xsl:call-template name="css.output.filename">
+ <xsl:with-param name="content" select="$content"/>
+ <xsl:with-param name="src" select="$src"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="path" select="concat($base.dir, $file)"/>
+ <xsl:value-of select="$path"/>
+
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/htmltbl.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/htmltbl.xsl
new file mode 100644
index 0000000..47c9a98
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/htmltbl.xsl
@@ -0,0 +1,102 @@
+<?xml version="1.0" encoding="ASCII"?>
+<!--This file was created automatically by html2xhtml-->
+<!--from the HTML stylesheets.-->
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1999/xhtml" version="1.0">
+
+<!-- ********************************************************************
+ $Id: htmltbl.xsl 8477 2009-07-13 11:38:55Z nwalsh $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<!-- ==================================================================== -->
+
+<xsl:template match="colgroup" mode="htmlTable">
+ <xsl:element name="{local-name()}" namespace="http://www.w3.org/1999/xhtml">
+ <xsl:apply-templates select="@*" mode="htmlTableAtt"/>
+ <xsl:apply-templates mode="htmlTable"/>
+ </xsl:element>
+</xsl:template>
+
+<xsl:template match="col" mode="htmlTable">
+ <xsl:element name="{local-name()}" namespace="http://www.w3.org/1999/xhtml">
+ <xsl:apply-templates select="@*" mode="htmlTableAtt"/>
+ </xsl:element>
+</xsl:template>
+
+<xsl:template match="caption" mode="htmlTable">
+ <!-- do not use xsl:copy because of XHTML's needs -->
+ <caption>
+ <xsl:apply-templates select="@*" mode="htmlTableAtt"/>
+
+ <xsl:apply-templates select=".." mode="object.title.markup">
+ <xsl:with-param name="allow-anchors" select="1"/>
+ </xsl:apply-templates>
+
+ </caption>
+</xsl:template>
+
+<xsl:template match="tbody|thead|tfoot|tr" mode="htmlTable">
+ <xsl:element name="{local-name(.)}" namespace="http://www.w3.org/1999/xhtml">
+ <xsl:apply-templates select="@*" mode="htmlTableAtt"/>
+ <xsl:apply-templates mode="htmlTable"/>
+ </xsl:element>
+</xsl:template>
+
+<xsl:template match="th|td" mode="htmlTable">
+ <xsl:element name="{local-name(.)}" namespace="http://www.w3.org/1999/xhtml">
+ <xsl:apply-templates select="@*" mode="htmlTableAtt"/>
+ <xsl:apply-templates/> <!-- *not* mode=htmlTable -->
+ </xsl:element>
+</xsl:template>
+
+<!-- don't copy through DocBook-specific attributes on HTML table markup -->
+<!-- default behavior is to not copy through because there are more
+ DocBook attributes than HTML attributes -->
+<xsl:template mode="htmlTableAtt" match="@*"/>
+
+<!-- copy these through -->
+<xsl:template mode="htmlTableAtt" match="@abbr | @align | @axis | @bgcolor | @border | @cellpadding | @cellspacing | @char | @charoff | @class | @dir | @frame | @headers | @height | @lang | @nowrap | @onclick | @ondblclick | @onkeydown | @onkeypress | @onkeyup | @onmousedown | @onmousemove | @onmouseout | @onmouseover | @onmouseup | @rules | @style | @summary | @title | @valign | @valign | @width | @xml:lang">
+ <xsl:copy-of select="."/>
+</xsl:template>
+
+<xsl:template match="@span|@rowspan|@colspan" mode="htmlTableAtt">
+ <!-- No need to copy through the DTD's default value "1" of the attribute -->
+ <xsl:if test="number(.) != 1">
+ <xsl:attribute name="{local-name(.)}">
+ <xsl:value-of select="."/>
+ </xsl:attribute>
+ </xsl:if>
+</xsl:template>
+
+<!-- map floatstyle to HTML float values -->
+<xsl:template match="@floatstyle" mode="htmlTableAtt">
+ <xsl:attribute name="style">
+ <xsl:text>float: </xsl:text>
+ <xsl:choose>
+ <xsl:when test="contains(., 'left')">left</xsl:when>
+ <xsl:when test="contains(., 'right')">right</xsl:when>
+ <xsl:when test="contains(., 'start')">
+ <xsl:value-of select="$direction.align.start"/>
+ </xsl:when>
+ <xsl:when test="contains(., 'end')">
+ <xsl:value-of select="$direction.align.end"/>
+ </xsl:when>
+ <xsl:when test="contains(., 'inside')">
+ <xsl:value-of select="$direction.align.start"/>
+ </xsl:when>
+ <xsl:when test="contains(., 'outside')">
+ <xsl:value-of select="$direction.align.end"/>
+ </xsl:when>
+ <xsl:when test="contains(., 'before')">none</xsl:when>
+ <xsl:when test="contains(., 'none')">none</xsl:when>
+ </xsl:choose>
+ <xsl:text>;</xsl:text>
+ </xsl:attribute>
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/index.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/index.xsl
new file mode 100644
index 0000000..2c39f4f
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/index.xsl
@@ -0,0 +1,264 @@
+<?xml version="1.0" encoding="ASCII"?>
+<!--This file was created automatically by html2xhtml-->
+<!--from the HTML stylesheets.-->
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1999/xhtml" version="1.0">
+
+<!-- ********************************************************************
+ $Id: index.xsl 8421 2009-05-04 07:49:49Z bobstayton $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<!-- ==================================================================== -->
+
+<xsl:template match="index">
+ <!-- some implementations use completely empty index tags to indicate -->
+ <!-- where an automatically generated index should be inserted. so -->
+ <!-- if the index is completely empty, skip it. Unless generate.index -->
+ <!-- is non-zero, in which case, this is where the automatically -->
+ <!-- generated index should go. -->
+
+ <xsl:call-template name="id.warning"/>
+
+ <xsl:if test="count(*)&gt;0 or $generate.index != '0'">
+ <div>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:if test="$generate.id.attributes != 0">
+ <xsl:attribute name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:call-template name="index.titlepage"/>
+ <xsl:choose>
+ <xsl:when test="indexdiv">
+ <xsl:apply-templates/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="*[not(self::indexentry)]"/>
+ <!-- Because it's actually valid for Index to have neither any -->
+ <!-- Indexdivs nor any Indexentries, we need to check and make -->
+ <!-- sure that at least one Indexentry exists, and generate a -->
+ <!-- wrapper dl if there is at least one; otherwise, do nothing. -->
+ <xsl:if test="indexentry">
+ <!-- The indexentry template assumes a parent dl wrapper has -->
+ <!-- been generated; for Indexes that have Indexdivs, the dl -->
+ <!-- wrapper is generated by the indexdiv template; however, -->
+ <!-- for Indexes that lack Indexdivs, if we don't generate a -->
+ <!-- dl here, HTML output will not be valid. -->
+ <dl>
+ <xsl:apply-templates select="indexentry"/>
+ </dl>
+ </xsl:if>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:if test="count(indexentry) = 0 and count(indexdiv) = 0">
+ <xsl:call-template name="generate-index">
+ <xsl:with-param name="scope" select="(ancestor::book|/)[last()]"/>
+ </xsl:call-template>
+ </xsl:if>
+
+ <xsl:if test="not(parent::article)">
+ <xsl:call-template name="process.footnotes"/>
+ </xsl:if>
+ </div>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="setindex">
+ <!-- some implementations use completely empty index tags to indicate -->
+ <!-- where an automatically generated index should be inserted. so -->
+ <!-- if the index is completely empty, skip it. Unless generate.index -->
+ <!-- is non-zero, in which case, this is where the automatically -->
+ <!-- generated index should go. -->
+
+ <xsl:call-template name="id.warning"/>
+
+ <xsl:if test="count(*)&gt;0 or $generate.index != '0'">
+ <div>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:if test="$generate.id.attributes != 0">
+ <xsl:attribute name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:call-template name="setindex.titlepage"/>
+ <xsl:apply-templates/>
+
+ <xsl:if test="count(indexentry) = 0 and count(indexdiv) = 0">
+ <xsl:call-template name="generate-index">
+ <xsl:with-param name="scope" select="/"/>
+ </xsl:call-template>
+ </xsl:if>
+
+ <xsl:if test="not(parent::article)">
+ <xsl:call-template name="process.footnotes"/>
+ </xsl:if>
+ </div>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="index/indexinfo"/>
+<xsl:template match="index/info"/>
+<xsl:template match="index/title"/>
+<xsl:template match="index/subtitle"/>
+<xsl:template match="index/titleabbrev"/>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="indexdiv">
+ <xsl:call-template name="id.warning"/>
+
+ <div>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:if test="$generate.id.attributes != 0">
+ <xsl:attribute name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:call-template name="anchor"/>
+ <xsl:apply-templates select="*[not(self::indexentry)]"/>
+ <dl>
+ <xsl:apply-templates select="indexentry"/>
+ </dl>
+ </div>
+</xsl:template>
+
+<xsl:template match="indexdiv/title">
+ <h3>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates/>
+ </h3>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="indexterm">
+ <!-- this one must have a name, even if it doesn't have an ID -->
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+
+ <a id="{$id}" class="indexterm"/>
+</xsl:template>
+
+<xsl:template match="primary|secondary|tertiary|see|seealso">
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="indexentry">
+ <xsl:apply-templates select="primaryie"/>
+</xsl:template>
+
+<xsl:template match="primaryie">
+ <dt>
+ <xsl:apply-templates/>
+ </dt>
+ <dd>
+ <xsl:apply-templates select="following-sibling::seeie [not(preceding-sibling::secondaryie)]" mode="indexentry"/>
+ <xsl:apply-templates select="following-sibling::seealsoie [not(preceding-sibling::secondaryie)]" mode="indexentry"/>
+ <xsl:apply-templates select="following-sibling::secondaryie" mode="indexentry"/>
+ </dd>
+</xsl:template>
+
+<!-- Handled in mode to convert flat list to structured output -->
+<xsl:template match="secondaryie">
+</xsl:template>
+<xsl:template match="tertiaryie">
+</xsl:template>
+<xsl:template match="seeie|seealsoie">
+</xsl:template>
+
+<xsl:template match="secondaryie" mode="indexentry">
+ <dl>
+ <dt>
+ <xsl:apply-templates/>
+ </dt>
+ <dd>
+ <!-- select following see* elements up to next secondaryie or tertiary or end -->
+ <xsl:variable name="after.this" select="following-sibling::*"/>
+ <xsl:variable name="next.entry" select="(following-sibling::secondaryie|following-sibling::tertiaryie)[1]"/>
+ <xsl:variable name="before.entry" select="$next.entry/preceding-sibling::*"/>
+ <xsl:variable name="see.intersection" select="$after.this[count(.|$before.entry) = count($before.entry)] [self::seeie or self::seealsoie]"/>
+ <xsl:choose>
+ <xsl:when test="count($see.intersection) != 0">
+ <xsl:apply-templates select="$see.intersection" mode="indexentry"/>
+ </xsl:when>
+ <xsl:when test="count($next.entry) = 0">
+ <xsl:apply-templates select="following-sibling::seeie" mode="indexentry"/>
+ <xsl:apply-templates select="following-sibling::seealsoie" mode="indexentry"/>
+ </xsl:when>
+ </xsl:choose>
+
+ <!-- now process any tertiaryie before the next secondaryie -->
+ <xsl:variable name="before.next.secondary" select="following-sibling::secondaryie[1]/preceding-sibling::*"/>
+ <xsl:variable name="tertiary.intersection" select="$after.this[count(.|$before.next.secondary) = count($before.next.secondary)] [not(self::seeie) and not(self::seealsoie)]"/>
+ <xsl:choose>
+ <xsl:when test="count($tertiary.intersection) != 0">
+ <xsl:apply-templates select="$tertiary.intersection" mode="indexentry"/>
+ </xsl:when>
+ <xsl:when test="not(following-sibling::secondaryie)">
+ <xsl:apply-templates select="following-sibling::tertiaryie" mode="indexentry"/>
+ </xsl:when>
+ </xsl:choose>
+ </dd>
+ </dl>
+</xsl:template>
+
+<xsl:template match="tertiaryie" mode="indexentry">
+ <dl>
+ <dt>
+ <xsl:apply-templates/>
+ </dt>
+ <dd>
+ <!-- select following see* elements up to next secondaryie or tertiary or end -->
+ <xsl:variable name="after.this" select="following-sibling::*"/>
+ <xsl:variable name="next.entry" select="(following-sibling::secondaryie|following-sibling::tertiaryie)[1]"/>
+ <xsl:variable name="before.entry" select="$next.entry/preceding-sibling::*"/>
+ <xsl:variable name="see.intersection" select="$after.this[count(.|$before.entry) = count($before.entry)] [self::seeie or self::seealsoie]"/>
+ <xsl:choose>
+ <xsl:when test="count($see.intersection) != 0">
+ <xsl:apply-templates select="$see.intersection" mode="indexentry"/>
+ </xsl:when>
+ <xsl:when test="count($next.entry) = 0">
+ <xsl:apply-templates select="following-sibling::seeie" mode="indexentry"/>
+ <xsl:apply-templates select="following-sibling::seealsoie" mode="indexentry"/>
+ </xsl:when>
+ </xsl:choose>
+ </dd>
+ </dl>
+</xsl:template>
+
+<xsl:template match="seeie" mode="indexentry">
+ <dt>
+ <xsl:text>(</xsl:text>
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'see'"/>
+ </xsl:call-template>
+ <xsl:text> </xsl:text>
+ <xsl:apply-templates/>
+ <xsl:text>)</xsl:text>
+ </dt>
+</xsl:template>
+
+<xsl:template match="seealsoie" mode="indexentry">
+ <div>
+ <xsl:text>(</xsl:text>
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'seealso'"/>
+ </xsl:call-template>
+ <xsl:text> </xsl:text>
+ <xsl:apply-templates/>
+ <xsl:text>)</xsl:text>
+ </div>
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/info.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/info.xsl
new file mode 100644
index 0000000..76285ab
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/info.xsl
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="ASCII"?>
+<!--This file was created automatically by html2xhtml-->
+<!--from the HTML stylesheets.-->
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1999/xhtml" version="1.0">
+
+<!-- ********************************************************************
+ $Id: info.xsl 8421 2009-05-04 07:49:49Z bobstayton $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<!-- These templates define the "default behavior" for info
+ elements. Even if you don't process the *info wrappers,
+ some of these elements are needed because the elements are
+ processed from named templates that are called with modes.
+ Since modes aren't sticky, these rules apply.
+ (TODO: clarify this comment) -->
+
+<!-- ==================================================================== -->
+<!-- called from named templates in a given mode -->
+
+<xsl:template match="corpauthor">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates/>
+ </span>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="jobtitle">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates/>
+ </span>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/inline.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/inline.xsl
new file mode 100644
index 0000000..da72226
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/inline.xsl
@@ -0,0 +1,1451 @@
+<?xml version="1.0" encoding="ASCII"?>
+<!--This file was created automatically by html2xhtml-->
+<!--from the HTML stylesheets.-->
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:suwl="http://nwalsh.com/xslt/ext/com.nwalsh.saxon.UnwrapLinks" xmlns="http://www.w3.org/1999/xhtml" exclude-result-prefixes="xlink suwl" version="1.0">
+
+<!-- ********************************************************************
+ $Id: inline.xsl 8811 2010-08-09 20:24:45Z mzjn $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<xsl:key name="glossentries" match="glossentry" use="normalize-space(glossterm)"/>
+<xsl:key name="glossentries" match="glossentry" use="normalize-space(glossterm/@baseform)"/>
+
+<xsl:template name="simple.xlink">
+ <xsl:param name="node" select="."/>
+ <xsl:param name="content">
+ <xsl:apply-templates/>
+ </xsl:param>
+ <xsl:param name="linkend" select="$node/@linkend"/>
+ <xsl:param name="xhref" select="$node/@xlink:href"/>
+
+ <!-- Support for @xlink:show -->
+ <xsl:variable name="target.show">
+ <xsl:choose>
+ <xsl:when test="$node/@xlink:show = 'new'">_blank</xsl:when>
+ <xsl:when test="$node/@xlink:show = 'replace'">_top</xsl:when>
+ <xsl:otherwise/>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="link">
+ <xsl:choose>
+ <xsl:when test="$xhref and (not($node/@xlink:type) or $node/@xlink:type='simple')">
+
+ <!-- Is it a local idref or a uri? -->
+ <xsl:variable name="is.idref">
+ <xsl:choose>
+ <!-- if the href starts with # and does not contain an "(" -->
+ <!-- or if the href starts with #xpointer(id(, it's just an ID -->
+ <xsl:when test="starts-with($xhref,'#') and (not(contains($xhref,'(')) or starts-with($xhref, '#xpointer(id('))">1</xsl:when>
+ <xsl:otherwise>0</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <!-- Is it an olink ? -->
+ <xsl:variable name="is.olink">
+ <xsl:choose>
+ <!-- If xlink:role="http://docbook.org/xlink/role/olink" -->
+ <!-- and if the href contains # -->
+ <xsl:when test="contains($xhref,'#') and @xlink:role = $xolink.role">1</xsl:when>
+ <xsl:otherwise>0</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="$is.olink = 1">
+ <xsl:call-template name="olink">
+ <xsl:with-param name="content" select="$content"/>
+ </xsl:call-template>
+ </xsl:when>
+
+ <xsl:when test="$is.idref = 1">
+
+ <xsl:variable name="idref">
+ <xsl:call-template name="xpointer.idref">
+ <xsl:with-param name="xpointer" select="$xhref"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="targets" select="key('id',$idref)"/>
+ <xsl:variable name="target" select="$targets[1]"/>
+
+ <xsl:call-template name="check.id.unique">
+ <xsl:with-param name="linkend" select="$idref"/>
+ </xsl:call-template>
+
+ <xsl:choose>
+ <xsl:when test="count($target) = 0">
+ <xsl:message>
+ <xsl:text>XLink to nonexistent id: </xsl:text>
+ <xsl:value-of select="$idref"/>
+ </xsl:message>
+ <xsl:copy-of select="$content"/>
+ </xsl:when>
+
+ <xsl:otherwise>
+ <a>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+
+ <xsl:attribute name="href">
+ <xsl:call-template name="href.target">
+ <xsl:with-param name="object" select="$target"/>
+ </xsl:call-template>
+ </xsl:attribute>
+
+ <xsl:choose>
+ <xsl:when test="$node/@xlink:title">
+ <xsl:attribute name="title">
+ <xsl:value-of select="$node/@xlink:title"/>
+ </xsl:attribute>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="$target" mode="html.title.attribute"/>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:if test="$target.show !=''">
+ <xsl:attribute name="target">
+ <xsl:value-of select="$target.show"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:copy-of select="$content"/>
+
+ </a>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+
+ <!-- otherwise it's a URI -->
+ <xsl:otherwise>
+ <a>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:attribute name="href">
+ <xsl:value-of select="$xhref"/>
+ </xsl:attribute>
+ <xsl:if test="$node/@xlink:title">
+ <xsl:attribute name="title">
+ <xsl:value-of select="$node/@xlink:title"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <!-- For URIs, use @xlink:show if defined, otherwise use ulink.target -->
+ <xsl:choose>
+ <xsl:when test="$target.show !=''">
+ <xsl:attribute name="target">
+ <xsl:value-of select="$target.show"/>
+ </xsl:attribute>
+ </xsl:when>
+ <xsl:when test="$ulink.target !=''">
+ <xsl:attribute name="target">
+ <xsl:value-of select="$ulink.target"/>
+ </xsl:attribute>
+ </xsl:when>
+ </xsl:choose>
+
+ <xsl:copy-of select="$content"/>
+ </a>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+
+ <xsl:when test="$linkend">
+ <xsl:variable name="targets" select="key('id',$linkend)"/>
+ <xsl:variable name="target" select="$targets[1]"/>
+
+ <xsl:call-template name="check.id.unique">
+ <xsl:with-param name="linkend" select="$linkend"/>
+ </xsl:call-template>
+
+ <a>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:attribute name="href">
+ <xsl:call-template name="href.target">
+ <xsl:with-param name="object" select="$target"/>
+ </xsl:call-template>
+ </xsl:attribute>
+
+ <xsl:apply-templates select="$target" mode="html.title.attribute"/>
+
+ <xsl:copy-of select="$content"/>
+
+ </a>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:copy-of select="$content"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="function-available('suwl:unwrapLinks')">
+ <xsl:copy-of select="suwl:unwrapLinks($link)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:copy-of select="$link"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="inline.charseq">
+ <xsl:param name="content">
+ <xsl:call-template name="anchor"/>
+ <xsl:call-template name="simple.xlink">
+ <xsl:with-param name="content">
+ <xsl:apply-templates/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:param>
+ <!-- * if you want output from the inline.charseq template wrapped in -->
+ <!-- * something other than a Span, call the template with some value -->
+ <!-- * for the 'wrapper-name' param -->
+ <xsl:param name="wrapper-name">span</xsl:param>
+ <xsl:element name="{$wrapper-name}" namespace="http://www.w3.org/1999/xhtml">
+ <xsl:attribute name="class">
+ <xsl:value-of select="local-name(.)"/>
+ </xsl:attribute>
+ <xsl:call-template name="dir"/>
+ <xsl:call-template name="generate.html.title"/>
+ <xsl:copy-of select="$content"/>
+ <xsl:call-template name="apply-annotations"/>
+ </xsl:element>
+</xsl:template>
+
+<xsl:template name="inline.monoseq">
+ <xsl:param name="content">
+ <xsl:call-template name="anchor"/>
+ <xsl:call-template name="simple.xlink">
+ <xsl:with-param name="content">
+ <xsl:apply-templates/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:param>
+ <code>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:copy-of select="$content"/>
+ <xsl:call-template name="apply-annotations"/>
+ </code>
+</xsl:template>
+
+<xsl:template name="inline.boldseq">
+ <xsl:param name="content">
+ <xsl:call-template name="anchor"/>
+ <xsl:call-template name="simple.xlink">
+ <xsl:with-param name="content">
+ <xsl:apply-templates/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:param>
+
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+
+ <!-- don't put <strong> inside figure, example, or table titles -->
+ <xsl:choose>
+ <xsl:when test="local-name(..) = 'title' and (local-name(../..) = 'figure' or local-name(../..) = 'example' or local-name(../..) = 'table')">
+ <xsl:copy-of select="$content"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <strong>
+ <xsl:copy-of select="$content"/>
+ </strong>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:call-template name="apply-annotations"/>
+ </span>
+</xsl:template>
+
+<xsl:template name="inline.italicseq">
+ <xsl:param name="content">
+ <xsl:call-template name="anchor"/>
+ <xsl:call-template name="simple.xlink">
+ <xsl:with-param name="content">
+ <xsl:apply-templates/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:param>
+ <em>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:copy-of select="$content"/>
+ <xsl:call-template name="apply-annotations"/>
+ </em>
+</xsl:template>
+
+<xsl:template name="inline.boldmonoseq">
+ <xsl:param name="content">
+ <xsl:call-template name="anchor"/>
+ <xsl:call-template name="simple.xlink">
+ <xsl:with-param name="content">
+ <xsl:apply-templates/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:param>
+ <!-- don't put <strong> inside figure, example, or table titles -->
+ <!-- or other titles that may already be represented with <strong>'s. -->
+ <xsl:choose>
+ <xsl:when test="local-name(..) = 'title' and (local-name(../..) = 'figure' or local-name(../..) = 'example' or local-name(../..) = 'table' or local-name(../..) = 'formalpara')">
+ <code>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:copy-of select="$content"/>
+ <xsl:call-template name="apply-annotations"/>
+ </code>
+ </xsl:when>
+ <xsl:otherwise>
+ <strong>
+ <xsl:call-template name="common.html.attributes"/>
+ <code>
+ <xsl:call-template name="generate.html.title"/>
+ <xsl:call-template name="dir"/>
+ <xsl:copy-of select="$content"/>
+ </code>
+ <xsl:call-template name="apply-annotations"/>
+ </strong>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="inline.italicmonoseq">
+ <xsl:param name="content">
+ <xsl:call-template name="anchor"/>
+ <xsl:call-template name="simple.xlink">
+ <xsl:with-param name="content">
+ <xsl:apply-templates/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:param>
+ <em>
+ <xsl:call-template name="common.html.attributes"/>
+ <code>
+ <xsl:call-template name="generate.html.title"/>
+ <xsl:call-template name="dir"/>
+ <xsl:copy-of select="$content"/>
+ <xsl:call-template name="apply-annotations"/>
+ </code>
+ </em>
+</xsl:template>
+
+<xsl:template name="inline.superscriptseq">
+ <xsl:param name="content">
+ <xsl:call-template name="anchor"/>
+ <xsl:call-template name="simple.xlink">
+ <xsl:with-param name="content">
+ <xsl:apply-templates/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:param>
+ <sup>
+ <xsl:call-template name="generate.html.title"/>
+ <xsl:call-template name="dir"/>
+ <xsl:copy-of select="$content"/>
+ <xsl:call-template name="apply-annotations"/>
+ </sup>
+</xsl:template>
+
+<xsl:template name="inline.subscriptseq">
+ <xsl:param name="content">
+ <xsl:call-template name="anchor"/>
+ <xsl:call-template name="simple.xlink">
+ <xsl:with-param name="content">
+ <xsl:apply-templates/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:param>
+ <sub>
+ <xsl:call-template name="generate.html.title"/>
+ <xsl:call-template name="dir"/>
+ <xsl:copy-of select="$content"/>
+ <xsl:call-template name="apply-annotations"/>
+ </sub>
+</xsl:template>
+
+<!-- ==================================================================== -->
+<!-- some special cases -->
+
+<xsl:template match="author">
+ <xsl:param name="content">
+ <xsl:call-template name="anchor"/>
+ <xsl:call-template name="simple.xlink">
+ <xsl:with-param name="content">
+ <xsl:call-template name="person.name"/>
+ </xsl:with-param>
+ </xsl:call-template>
+ <xsl:call-template name="apply-annotations"/>
+ </xsl:param>
+
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:copy-of select="$content"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="editor">
+ <xsl:param name="content">
+ <xsl:call-template name="anchor"/>
+ <xsl:call-template name="simple.xlink">
+ <xsl:with-param name="content">
+ <xsl:call-template name="person.name"/>
+ </xsl:with-param>
+ </xsl:call-template>
+ <xsl:call-template name="apply-annotations"/>
+ </xsl:param>
+
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:copy-of select="$content"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="othercredit">
+ <xsl:param name="content">
+ <xsl:call-template name="anchor"/>
+ <xsl:call-template name="simple.xlink">
+ <xsl:with-param name="content">
+ <xsl:call-template name="person.name"/>
+ </xsl:with-param>
+ </xsl:call-template>
+ <xsl:call-template name="apply-annotations"/>
+ </xsl:param>
+
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:copy-of select="$content"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="authorinitials">
+ <xsl:call-template name="inline.charseq"/>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="accel">
+ <xsl:call-template name="inline.charseq"/>
+</xsl:template>
+
+<xsl:template match="action">
+ <xsl:call-template name="inline.charseq"/>
+</xsl:template>
+
+<xsl:template match="application">
+ <xsl:call-template name="inline.charseq"/>
+</xsl:template>
+
+<xsl:template match="classname">
+ <xsl:call-template name="inline.monoseq"/>
+</xsl:template>
+
+<xsl:template match="exceptionname">
+ <xsl:call-template name="inline.monoseq"/>
+</xsl:template>
+
+<xsl:template match="interfacename">
+ <xsl:call-template name="inline.monoseq"/>
+</xsl:template>
+
+<xsl:template match="methodname">
+ <xsl:call-template name="inline.monoseq"/>
+</xsl:template>
+
+<xsl:template match="command">
+ <xsl:call-template name="inline.boldseq"/>
+</xsl:template>
+
+<xsl:template match="computeroutput">
+ <xsl:call-template name="inline.monoseq"/>
+</xsl:template>
+
+<xsl:template match="constant">
+ <xsl:call-template name="inline.monoseq"/>
+</xsl:template>
+
+<xsl:template match="database">
+ <xsl:call-template name="inline.charseq"/>
+</xsl:template>
+
+<xsl:template match="date">
+ <!-- should this support locale-specific formatting? how? -->
+ <xsl:call-template name="inline.charseq"/>
+</xsl:template>
+
+<xsl:template match="errorcode">
+ <xsl:call-template name="inline.charseq"/>
+</xsl:template>
+
+<xsl:template match="errorname">
+ <xsl:call-template name="inline.charseq"/>
+</xsl:template>
+
+<xsl:template match="errortype">
+ <xsl:call-template name="inline.charseq"/>
+</xsl:template>
+
+<xsl:template match="errortext">
+ <xsl:call-template name="inline.charseq"/>
+</xsl:template>
+
+<xsl:template match="envar">
+ <xsl:call-template name="inline.monoseq"/>
+</xsl:template>
+
+<xsl:template match="filename">
+ <xsl:call-template name="inline.monoseq"/>
+</xsl:template>
+
+<xsl:template match="function">
+ <xsl:choose>
+ <xsl:when test="$function.parens != '0' and (parameter or function or replaceable)">
+ <xsl:variable name="nodes" select="text()|*"/>
+ <xsl:call-template name="inline.monoseq">
+ <xsl:with-param name="content">
+ <xsl:call-template name="simple.xlink">
+ <xsl:with-param name="content">
+ <xsl:apply-templates select="$nodes[1]"/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:with-param>
+ </xsl:call-template>
+ <xsl:text>(</xsl:text>
+ <xsl:apply-templates select="$nodes[position()&gt;1]"/>
+ <xsl:text>)</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="inline.monoseq"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="function/parameter" priority="2">
+ <xsl:call-template name="inline.italicmonoseq"/>
+ <xsl:if test="following-sibling::*">
+ <xsl:text>, </xsl:text>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="function/replaceable" priority="2">
+ <xsl:call-template name="inline.italicmonoseq"/>
+ <xsl:if test="following-sibling::*">
+ <xsl:text>, </xsl:text>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="guibutton">
+ <xsl:call-template name="inline.charseq"/>
+</xsl:template>
+
+<xsl:template match="guiicon">
+ <xsl:call-template name="inline.charseq"/>
+</xsl:template>
+
+<xsl:template match="guilabel">
+ <xsl:call-template name="inline.charseq"/>
+</xsl:template>
+
+<xsl:template match="guimenu">
+ <xsl:call-template name="inline.charseq"/>
+</xsl:template>
+
+<xsl:template match="guimenuitem">
+ <xsl:call-template name="inline.charseq"/>
+</xsl:template>
+
+<xsl:template match="guisubmenu">
+ <xsl:call-template name="inline.charseq"/>
+</xsl:template>
+
+<xsl:template match="hardware">
+ <xsl:call-template name="inline.charseq"/>
+</xsl:template>
+
+<xsl:template match="interface">
+ <xsl:call-template name="inline.charseq"/>
+</xsl:template>
+
+<xsl:template match="interfacedefinition">
+ <xsl:call-template name="inline.charseq"/>
+</xsl:template>
+
+<xsl:template match="keycap">
+ <xsl:call-template name="inline.boldseq"/>
+</xsl:template>
+
+<xsl:template match="keycode">
+ <xsl:call-template name="inline.charseq"/>
+</xsl:template>
+
+<xsl:template match="keysym">
+ <xsl:call-template name="inline.charseq"/>
+</xsl:template>
+
+<xsl:template match="literal">
+ <xsl:call-template name="inline.monoseq"/>
+</xsl:template>
+
+<xsl:template match="code">
+ <xsl:call-template name="inline.monoseq"/>
+</xsl:template>
+
+<xsl:template match="medialabel">
+ <xsl:call-template name="inline.italicseq"/>
+</xsl:template>
+
+<xsl:template match="shortcut">
+ <xsl:call-template name="inline.boldseq"/>
+</xsl:template>
+
+<xsl:template match="mousebutton">
+ <xsl:call-template name="inline.charseq"/>
+</xsl:template>
+
+<xsl:template match="option">
+ <xsl:call-template name="inline.monoseq"/>
+</xsl:template>
+
+<xsl:template match="package">
+ <xsl:call-template name="inline.charseq"/>
+</xsl:template>
+
+<xsl:template match="parameter">
+ <xsl:call-template name="inline.italicmonoseq"/>
+</xsl:template>
+
+<xsl:template match="property">
+ <xsl:call-template name="inline.charseq"/>
+</xsl:template>
+
+<xsl:template match="prompt">
+ <xsl:call-template name="inline.monoseq"/>
+</xsl:template>
+
+<xsl:template match="replaceable" priority="1">
+ <xsl:call-template name="inline.italicmonoseq"/>
+</xsl:template>
+
+<xsl:template match="returnvalue">
+ <xsl:call-template name="inline.charseq"/>
+</xsl:template>
+
+<xsl:template match="structfield">
+ <xsl:call-template name="inline.italicmonoseq"/>
+</xsl:template>
+
+<xsl:template match="structname">
+ <xsl:call-template name="inline.charseq"/>
+</xsl:template>
+
+<xsl:template match="symbol">
+ <xsl:call-template name="inline.charseq"/>
+</xsl:template>
+
+<xsl:template match="systemitem">
+ <xsl:call-template name="inline.monoseq"/>
+</xsl:template>
+
+<xsl:template match="token">
+ <xsl:call-template name="inline.charseq"/>
+</xsl:template>
+
+<xsl:template match="type">
+ <xsl:call-template name="inline.charseq"/>
+</xsl:template>
+
+<xsl:template match="userinput">
+ <xsl:call-template name="inline.boldmonoseq"/>
+</xsl:template>
+
+<xsl:template match="abbrev">
+ <xsl:call-template name="inline.charseq">
+ <xsl:with-param name="wrapper-name">abbr</xsl:with-param>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="acronym">
+ <xsl:call-template name="inline.charseq">
+ <xsl:with-param name="wrapper-name">acronym</xsl:with-param>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="citerefentry">
+ <xsl:choose>
+ <xsl:when test="$citerefentry.link != '0'">
+ <a>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:attribute name="href">
+ <xsl:call-template name="generate.citerefentry.link"/>
+ </xsl:attribute>
+ <xsl:call-template name="inline.charseq"/>
+ </a>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="inline.charseq"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="generate.citerefentry.link">
+ <!-- nop -->
+</xsl:template>
+
+<xsl:template name="x.generate.citerefentry.link">
+ <xsl:text>http://example.com/cgi-bin/man.cgi?</xsl:text>
+ <xsl:value-of select="refentrytitle"/>
+ <xsl:text>(</xsl:text>
+ <xsl:value-of select="manvolnum"/>
+ <xsl:text>)</xsl:text>
+</xsl:template>
+
+<xsl:template match="citetitle">
+ <xsl:choose>
+ <xsl:when test="@pubwork = 'article'">
+ <xsl:call-template name="gentext.startquote"/>
+ <xsl:call-template name="inline.charseq"/>
+ <xsl:call-template name="gentext.endquote"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="inline.italicseq"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="emphasis">
+ <span>
+ <xsl:choose>
+ <!-- We don't want empty @class values, so do not propagate empty @roles -->
+ <xsl:when test="@role and normalize-space(@role) != '' and $emphasis.propagates.style != 0">
+ <xsl:apply-templates select="." mode="common.html.attributes">
+ <xsl:with-param name="class" select="@role"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:call-template name="anchor"/>
+
+ <xsl:call-template name="simple.xlink">
+ <xsl:with-param name="content">
+ <xsl:choose>
+ <xsl:when test="@role = 'bold' or @role='strong'">
+ <!-- backwards compatibility: make bold into b elements, but -->
+ <!-- don't put bold inside figure, example, or table titles -->
+ <xsl:choose>
+ <xsl:when test="local-name(..) = 'title' and (local-name(../..) = 'figure' or local-name(../..) = 'example' or local-name(../..) = 'table')">
+ <xsl:apply-templates/>
+ </xsl:when>
+ <xsl:otherwise>
+ <strong><xsl:apply-templates/></strong>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:when test="@role and $emphasis.propagates.style != 0">
+ <xsl:apply-templates/>
+ </xsl:when>
+ <xsl:otherwise>
+ <em><xsl:apply-templates/></em>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:with-param>
+ </xsl:call-template>
+ </span>
+</xsl:template>
+
+<xsl:template match="foreignphrase">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:call-template name="inline.italicseq"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="markup">
+ <xsl:call-template name="inline.charseq"/>
+</xsl:template>
+
+<xsl:template match="phrase">
+ <span>
+ <xsl:call-template name="locale.html.attributes"/>
+ <!-- We don't want empty @class values, so do not propagate empty @roles -->
+ <xsl:if test="@role and normalize-space(@role) != '' and $phrase.propagates.style != 0">
+ <xsl:apply-templates select="." mode="class.attribute">
+ <xsl:with-param name="class" select="@role"/>
+ </xsl:apply-templates>
+ </xsl:if>
+ <xsl:call-template name="dir"/>
+ <xsl:call-template name="anchor"/>
+ <xsl:call-template name="simple.xlink">
+ <xsl:with-param name="content">
+ <xsl:apply-templates/>
+ </xsl:with-param>
+ </xsl:call-template>
+ <xsl:call-template name="apply-annotations"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="quote">
+ <xsl:variable name="depth">
+ <xsl:call-template name="dot.count">
+ <xsl:with-param name="string">
+ <xsl:number level="multiple"/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:variable>
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:call-template name="anchor"/>
+ <xsl:choose>
+ <xsl:when test="$depth mod 2 = 0">
+ <xsl:call-template name="gentext.startquote"/>
+ <xsl:call-template name="inline.charseq"/>
+ <xsl:call-template name="gentext.endquote"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="gentext.nestedstartquote"/>
+ <xsl:call-template name="inline.charseq"/>
+ <xsl:call-template name="gentext.nestedendquote"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </span>
+</xsl:template>
+
+<xsl:template match="varname">
+ <xsl:call-template name="inline.monoseq"/>
+</xsl:template>
+
+<xsl:template match="wordasword">
+ <xsl:call-template name="inline.italicseq"/>
+</xsl:template>
+
+<xsl:template match="lineannotation">
+ <em>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:call-template name="inline.charseq"/>
+ </em>
+</xsl:template>
+
+<xsl:template match="superscript">
+ <xsl:call-template name="inline.superscriptseq"/>
+</xsl:template>
+
+<xsl:template match="subscript">
+ <xsl:call-template name="inline.subscriptseq"/>
+</xsl:template>
+
+<xsl:template match="trademark">
+ <xsl:call-template name="inline.charseq"/>
+ <xsl:choose>
+ <xsl:when test="@class = 'copyright' or @class = 'registered'">
+ <xsl:call-template name="dingbat">
+ <xsl:with-param name="dingbat" select="@class"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="@class = 'service'">
+ <sup>SM</sup>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="dingbat">
+ <xsl:with-param name="dingbat" select="'trademark'"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="firstterm">
+ <xsl:call-template name="glossterm">
+ <xsl:with-param name="firstterm" select="1"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="glossterm" name="glossterm">
+ <xsl:param name="firstterm" select="0"/>
+
+ <!-- To avoid extra <a name=""> anchor from inline.italicseq -->
+ <xsl:variable name="content">
+ <xsl:apply-templates/>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="($firstterm.only.link = 0 or $firstterm = 1) and @linkend">
+ <xsl:variable name="targets" select="key('id',@linkend)"/>
+ <xsl:variable name="target" select="$targets[1]"/>
+
+ <xsl:call-template name="check.id.unique">
+ <xsl:with-param name="linkend" select="@linkend"/>
+ </xsl:call-template>
+
+ <xsl:choose>
+ <xsl:when test="$target">
+ <a>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:if test="@id or @xml:id">
+ <xsl:attribute name="id">
+ <xsl:value-of select="(@id|@xml:id)[1]"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:attribute name="href">
+ <xsl:call-template name="href.target">
+ <xsl:with-param name="object" select="$target"/>
+ </xsl:call-template>
+ </xsl:attribute>
+
+ <xsl:call-template name="inline.italicseq">
+ <xsl:with-param name="content" select="$content"/>
+ </xsl:call-template>
+ </a>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="inline.italicseq">
+ <xsl:with-param name="content" select="$content"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+
+ <xsl:when test="not(@linkend) and ($firstterm.only.link = 0 or $firstterm = 1) and ($glossterm.auto.link != 0) and $glossary.collection != ''">
+ <xsl:variable name="term">
+ <xsl:choose>
+ <xsl:when test="@baseform"><xsl:value-of select="@baseform"/></xsl:when>
+ <xsl:otherwise><xsl:value-of select="."/></xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="cterm" select="(document($glossary.collection,.)//glossentry[glossterm=$term])[1]"/>
+
+ <!-- HACK HACK HACK! But it works... -->
+ <!-- You'd need to do more work if you wanted to chunk on glossdiv, though -->
+
+ <xsl:variable name="glossary" select="//glossary[@role='auto']"/>
+
+ <xsl:if test="count($glossary) != 1">
+ <xsl:message>
+ <xsl:text>Warning: glossary.collection specified, but there are </xsl:text>
+ <xsl:value-of select="count($glossary)"/>
+ <xsl:text> automatic glossaries</xsl:text>
+ </xsl:message>
+ </xsl:if>
+
+ <xsl:variable name="glosschunk">
+ <xsl:call-template name="href.target">
+ <xsl:with-param name="object" select="$glossary"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="chunkbase">
+ <xsl:choose>
+ <xsl:when test="contains($glosschunk, '#')">
+ <xsl:value-of select="substring-before($glosschunk, '#')"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$glosschunk"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="not($cterm)">
+ <xsl:message>
+ <xsl:text>There's no entry for </xsl:text>
+ <xsl:value-of select="$term"/>
+ <xsl:text> in </xsl:text>
+ <xsl:value-of select="$glossary.collection"/>
+ </xsl:message>
+ <xsl:call-template name="inline.italicseq"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id">
+ <xsl:with-param name="object" select="$cterm"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <a href="{$chunkbase}#{$id}">
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:call-template name="inline.italicseq">
+ <xsl:with-param name="content" select="$content"/>
+ </xsl:call-template>
+ </a>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+
+ <xsl:when test="not(@linkend) and ($firstterm.only.link = 0 or $firstterm = 1) and $glossterm.auto.link != 0">
+ <xsl:variable name="term">
+ <xsl:choose>
+ <xsl:when test="@baseform">
+ <xsl:value-of select="normalize-space(@baseform)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="normalize-space(.)"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:variable name="targets" select="key('glossentries', $term)"/>
+ <xsl:variable name="target" select="$targets[1]"/>
+
+ <xsl:choose>
+ <xsl:when test="count($targets)=0">
+ <xsl:message>
+ <xsl:text>Error: no glossentry for glossterm: </xsl:text>
+ <xsl:value-of select="."/>
+ <xsl:text>.</xsl:text>
+ </xsl:message>
+ <xsl:call-template name="inline.italicseq"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <a>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:if test="@id or @xml:id">
+ <xsl:attribute name="id">
+ <xsl:value-of select="(@id|@xml:id)[1]"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:attribute name="href">
+ <xsl:call-template name="href.target">
+ <xsl:with-param name="object" select="$target"/>
+ </xsl:call-template>
+ </xsl:attribute>
+
+ <xsl:call-template name="inline.italicseq">
+ <xsl:with-param name="content" select="$content"/>
+ </xsl:call-template>
+ </a>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+
+ <xsl:otherwise>
+ <xsl:call-template name="inline.italicseq"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="termdef">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:call-template name="gentext.template">
+ <xsl:with-param name="context" select="'termdef'"/>
+ <xsl:with-param name="name" select="'prefix'"/>
+ </xsl:call-template>
+ <xsl:apply-templates/>
+ <xsl:call-template name="gentext.template">
+ <xsl:with-param name="context" select="'termdef'"/>
+ <xsl:with-param name="name" select="'suffix'"/>
+ </xsl:call-template>
+ </span>
+</xsl:template>
+
+<xsl:template match="sgmltag|tag">
+ <xsl:call-template name="format.sgmltag"/>
+</xsl:template>
+
+<xsl:template name="format.sgmltag">
+ <xsl:param name="class">
+ <xsl:choose>
+ <xsl:when test="@class">
+ <xsl:value-of select="@class"/>
+ </xsl:when>
+ <xsl:otherwise>element</xsl:otherwise>
+ </xsl:choose>
+ </xsl:param>
+
+ <xsl:variable name="content">
+ <xsl:choose>
+ <xsl:when test="$class='attribute'">
+ <xsl:apply-templates/>
+ </xsl:when>
+ <xsl:when test="$class='attvalue'">
+ <xsl:apply-templates/>
+ </xsl:when>
+ <xsl:when test="$class='element'">
+ <xsl:apply-templates/>
+ </xsl:when>
+ <xsl:when test="$class='endtag'">
+ <xsl:text>&lt;/</xsl:text>
+ <xsl:apply-templates/>
+ <xsl:text>&gt;</xsl:text>
+ </xsl:when>
+ <xsl:when test="$class='genentity'">
+ <xsl:text>&amp;</xsl:text>
+ <xsl:apply-templates/>
+ <xsl:text>;</xsl:text>
+ </xsl:when>
+ <xsl:when test="$class='numcharref'">
+ <xsl:text>&amp;#</xsl:text>
+ <xsl:apply-templates/>
+ <xsl:text>;</xsl:text>
+ </xsl:when>
+ <xsl:when test="$class='paramentity'">
+ <xsl:text>%</xsl:text>
+ <xsl:apply-templates/>
+ <xsl:text>;</xsl:text>
+ </xsl:when>
+ <xsl:when test="$class='pi'">
+ <xsl:text>&lt;?</xsl:text>
+ <xsl:apply-templates/>
+ <xsl:text>&gt;</xsl:text>
+ </xsl:when>
+ <xsl:when test="$class='xmlpi'">
+ <xsl:text>&lt;?</xsl:text>
+ <xsl:apply-templates/>
+ <xsl:text>?&gt;</xsl:text>
+ </xsl:when>
+ <xsl:when test="$class='starttag'">
+ <xsl:text>&lt;</xsl:text>
+ <xsl:apply-templates/>
+ <xsl:text>&gt;</xsl:text>
+ </xsl:when>
+ <xsl:when test="$class='emptytag'">
+ <xsl:text>&lt;</xsl:text>
+ <xsl:apply-templates/>
+ <xsl:text>/&gt;</xsl:text>
+ </xsl:when>
+ <xsl:when test="$class='sgmlcomment' or $class='comment'">
+ <xsl:text>&lt;!--</xsl:text>
+ <xsl:apply-templates/>
+ <xsl:text>--&gt;</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <code>
+ <xsl:apply-templates select="." mode="common.html.attributes">
+ <xsl:with-param name="class" select="concat('sgmltag-', $class)"/>
+ </xsl:apply-templates>
+ <xsl:call-template name="simple.xlink">
+ <xsl:with-param name="content" select="$content"/>
+ </xsl:call-template>
+ </code>
+</xsl:template>
+
+<xsl:template match="email">
+ <xsl:call-template name="inline.monoseq">
+ <xsl:with-param name="content">
+ <xsl:if test="not($email.delimiters.enabled = 0)">
+ <xsl:text>&lt;</xsl:text>
+ </xsl:if>
+ <a>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:attribute name="href">
+ <xsl:text>mailto:</xsl:text>
+ <xsl:value-of select="."/>
+ </xsl:attribute>
+ <xsl:apply-templates/>
+ </a>
+ <xsl:if test="not($email.delimiters.enabled = 0)">
+ <xsl:text>&gt;</xsl:text>
+ </xsl:if>
+ </xsl:with-param>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="keycombo">
+ <xsl:variable name="action" select="@action"/>
+ <xsl:variable name="joinchar">
+ <xsl:choose>
+ <xsl:when test="$action='seq'"><xsl:text> </xsl:text></xsl:when>
+ <xsl:when test="$action='simul'">+</xsl:when>
+ <xsl:when test="$action='press'">-</xsl:when>
+ <xsl:when test="$action='click'">-</xsl:when>
+ <xsl:when test="$action='double-click'">-</xsl:when>
+ <xsl:when test="$action='other'"/>
+ <xsl:otherwise>+</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:for-each select="*">
+ <xsl:if test="position()&gt;1"><xsl:value-of select="$joinchar"/></xsl:if>
+ <xsl:apply-templates select="."/>
+ </xsl:for-each>
+</xsl:template>
+
+<xsl:template match="uri">
+ <xsl:call-template name="inline.monoseq"/>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="menuchoice">
+ <xsl:variable name="shortcut" select="./shortcut"/>
+ <xsl:call-template name="process.menuchoice"/>
+ <xsl:if test="$shortcut">
+ <xsl:text> (</xsl:text>
+ <xsl:apply-templates select="$shortcut"/>
+ <xsl:text>)</xsl:text>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template name="process.menuchoice">
+ <xsl:param name="nodelist" select="guibutton|guiicon|guilabel|guimenu|guimenuitem|guisubmenu|interface"/><!-- not(shortcut) -->
+ <xsl:param name="count" select="1"/>
+
+ <xsl:choose>
+ <xsl:when test="$count&gt;count($nodelist)"/>
+ <xsl:when test="$count=1">
+ <xsl:apply-templates select="$nodelist[$count=position()]"/>
+ <xsl:call-template name="process.menuchoice">
+ <xsl:with-param name="nodelist" select="$nodelist"/>
+ <xsl:with-param name="count" select="$count+1"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:variable name="node" select="$nodelist[$count=position()]"/>
+ <xsl:choose>
+ <xsl:when test="local-name($node)='guimenuitem' or local-name($node)='guisubmenu'">
+ <xsl:value-of select="$menuchoice.menu.separator"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$menuchoice.separator"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:apply-templates select="$node"/>
+ <xsl:call-template name="process.menuchoice">
+ <xsl:with-param name="nodelist" select="$nodelist"/>
+ <xsl:with-param name="count" select="$count+1"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="optional">
+ <xsl:value-of select="$arg.choice.opt.open.str"/>
+ <xsl:call-template name="inline.charseq"/>
+ <xsl:value-of select="$arg.choice.opt.close.str"/>
+</xsl:template>
+
+<xsl:template match="citation">
+ <!-- todo: integrate with bibliography collection -->
+ <xsl:variable name="targets" select="(//biblioentry | //bibliomixed)[abbrev = string(current())]"/>
+ <xsl:variable name="target" select="$targets[1]"/>
+
+ <xsl:choose>
+ <!-- try automatic linking based on match to abbrev -->
+ <xsl:when test="$target and not(xref) and not(link)">
+
+ <xsl:text>[</xsl:text>
+ <a>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:attribute name="href">
+ <xsl:call-template name="href.target">
+ <xsl:with-param name="object" select="$target"/>
+ </xsl:call-template>
+ </xsl:attribute>
+
+ <xsl:choose>
+ <xsl:when test="$bibliography.numbered != 0">
+ <xsl:apply-templates select="$target" mode="citation"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="inline.charseq"/>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ </a>
+ <xsl:text>]</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text>[</xsl:text>
+ <xsl:call-template name="inline.charseq"/>
+ <xsl:text>]</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="citebiblioid">
+ <xsl:variable name="targets" select="//*[biblioid = string(current())]"/>
+ <xsl:variable name="target" select="$targets[1]"/>
+
+ <xsl:choose>
+ <!-- try automatic linking based on match to parent of biblioid -->
+ <xsl:when test="$target and not(xref) and not(link)">
+
+ <xsl:text>[</xsl:text>
+ <a>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:attribute name="href">
+ <xsl:call-template name="href.target">
+ <xsl:with-param name="object" select="$target"/>
+ </xsl:call-template>
+ </xsl:attribute>
+
+ <xsl:call-template name="inline.charseq"/>
+
+ </a>
+ <xsl:text>]</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text>[</xsl:text>
+ <xsl:call-template name="inline.charseq"/>
+ <xsl:text>]</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="biblioentry|bibliomixed" mode="citation">
+ <xsl:number from="bibliography" count="biblioentry|bibliomixed" level="any" format="1"/>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="comment[parent::answer|parent::appendix|parent::article|parent::bibliodiv|&#10; parent::bibliography|parent::blockquote|parent::caution|parent::chapter|&#10; parent::glossary|parent::glossdiv|parent::important|parent::index|&#10; parent::indexdiv|parent::listitem|parent::note|parent::orderedlist|&#10; parent::partintro|parent::preface|parent::procedure|parent::qandadiv|&#10; parent::qandaset|parent::question|parent::refentry|parent::refnamediv|&#10; parent::refsect1|parent::refsect2|parent::refsect3|parent::refsection|&#10; parent::refsynopsisdiv|parent::sect1|parent::sect2|parent::sect3|parent::sect4|&#10; parent::sect5|parent::section|parent::setindex|parent::sidebar|&#10; parent::simplesect|parent::taskprerequisites|parent::taskrelated|&#10; parent::tasksummary|parent::warning]|remark[parent::answer|parent::appendix|parent::article|parent::bibliodiv|&#10; parent::bibliography|parent::blockquote|parent::caution|parent::chapter|&#10; parent::glossary|parent::glossdiv|parent::important|parent::index|&#10; parent::indexdiv|parent::listitem|parent::note|parent::orderedlist|&#10; parent::partintro|parent::preface|parent::procedure|parent::qandadiv|&#10; parent::qandaset|parent::question|parent::refentry|parent::refnamediv|&#10; parent::refsect1|parent::refsect2|parent::refsect3|parent::refsection|&#10; parent::refsynopsisdiv|parent::sect1|parent::sect2|parent::sect3|parent::sect4|&#10; parent::sect5|parent::section|parent::setindex|parent::sidebar|&#10; parent::simplesect|parent::taskprerequisites|parent::taskrelated|&#10; parent::tasksummary|parent::warning]">
+ <xsl:if test="$show.comments != 0">
+ <p class="remark"><em><xsl:call-template name="inline.charseq"/></em></p>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="comment|remark">
+ <xsl:if test="$show.comments != 0">
+ <em><xsl:call-template name="inline.charseq"/></em>
+ </xsl:if>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="productname">
+ <xsl:call-template name="inline.charseq"/>
+ <xsl:if test="@class">
+ <xsl:call-template name="dingbat">
+ <xsl:with-param name="dingbat" select="@class"/>
+ </xsl:call-template>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="productnumber">
+ <xsl:call-template name="inline.charseq"/>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="pob|street|city|state|postcode|country|otheraddr">
+ <xsl:call-template name="inline.charseq"/>
+</xsl:template>
+
+<xsl:template match="phone|fax">
+ <xsl:call-template name="inline.charseq"/>
+</xsl:template>
+
+<!-- in Addresses, for example -->
+<xsl:template match="honorific|firstname|surname|lineage|othername">
+ <xsl:call-template name="inline.charseq"/>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="person">
+ <xsl:param name="content">
+ <xsl:call-template name="anchor"/>
+ <xsl:call-template name="simple.xlink">
+ <xsl:with-param name="content">
+ <xsl:apply-templates select="personname"/>
+ </xsl:with-param>
+ </xsl:call-template>
+ <xsl:call-template name="apply-annotations"/>
+ </xsl:param>
+
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:copy-of select="$content"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="personname">
+ <xsl:param name="content">
+ <xsl:call-template name="anchor"/>
+ <xsl:call-template name="simple.xlink">
+ <xsl:with-param name="content">
+ <xsl:call-template name="person.name"/>
+ </xsl:with-param>
+ </xsl:call-template>
+ <xsl:call-template name="apply-annotations"/>
+ </xsl:param>
+
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:copy-of select="$content"/>
+ </span>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="org">
+ <xsl:param name="content">
+ <xsl:call-template name="anchor"/>
+ <xsl:call-template name="simple.xlink">
+ <xsl:with-param name="content">
+ <xsl:apply-templates/>
+ </xsl:with-param>
+ </xsl:call-template>
+ <xsl:call-template name="apply-annotations"/>
+ </xsl:param>
+
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:copy-of select="$content"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="orgname">
+ <xsl:param name="content">
+ <xsl:call-template name="anchor"/>
+ <xsl:call-template name="simple.xlink">
+ <xsl:with-param name="content">
+ <xsl:apply-templates/>
+ </xsl:with-param>
+ </xsl:call-template>
+ <xsl:call-template name="apply-annotations"/>
+ </xsl:param>
+
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:copy-of select="$content"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="orgdiv">
+ <xsl:param name="content">
+ <xsl:call-template name="anchor"/>
+ <xsl:call-template name="simple.xlink">
+ <xsl:with-param name="content">
+ <xsl:apply-templates/>
+ </xsl:with-param>
+ </xsl:call-template>
+ <xsl:call-template name="apply-annotations"/>
+ </xsl:param>
+
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:copy-of select="$content"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="affiliation">
+ <xsl:param name="content">
+ <xsl:call-template name="anchor"/>
+ <xsl:call-template name="simple.xlink">
+ <xsl:with-param name="content">
+ <xsl:call-template name="person.name"/>
+ </xsl:with-param>
+ </xsl:call-template>
+ <xsl:call-template name="apply-annotations"/>
+ </xsl:param>
+
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:copy-of select="$content"/>
+ </span>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="beginpage">
+ <!-- does nothing; this *is not* markup to force a page break. -->
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/keywords.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/keywords.xsl
new file mode 100644
index 0000000..5f6b4fb
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/keywords.xsl
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="ASCII"?>
+<!--This file was created automatically by html2xhtml-->
+<!--from the HTML stylesheets.-->
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1999/xhtml" version="1.0">
+
+<!-- ********************************************************************
+ $Id: keywords.xsl 6910 2007-06-28 23:23:30Z xmldoc $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<xsl:template match="keywordset"/>
+<xsl:template match="subjectset"/>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="keywordset" mode="html.header">
+ <meta name="keywords">
+ <xsl:attribute name="content">
+ <xsl:apply-templates select="keyword" mode="html.header"/>
+ </xsl:attribute>
+ </meta>
+</xsl:template>
+
+<xsl:template match="keyword" mode="html.header">
+ <xsl:apply-templates/>
+ <xsl:if test="following-sibling::keyword">, </xsl:if>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/lists.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/lists.xsl
new file mode 100644
index 0000000..967443f
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/lists.xsl
@@ -0,0 +1,1088 @@
+<?xml version="1.0" encoding="ASCII"?>
+<!--This file was created automatically by html2xhtml-->
+<!--from the HTML stylesheets.-->
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1999/xhtml" version="1.0">
+
+<!-- ********************************************************************
+ $Id: lists.xsl 8524 2009-10-10 02:45:47Z abdelazer $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<!-- ==================================================================== -->
+
+<xsl:template match="itemizedlist">
+ <div>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:call-template name="anchor"/>
+ <xsl:if test="title">
+ <xsl:call-template name="formal.object.heading"/>
+ </xsl:if>
+
+ <!-- Preserve order of PIs and comments -->
+ <xsl:apply-templates select="*[not(self::listitem or self::title or self::titleabbrev)] |comment()[not(preceding-sibling::listitem)] |processing-instruction()[not(preceding-sibling::listitem)]"/>
+
+ <ul>
+ <xsl:call-template name="generate.class.attribute"/>
+ <xsl:if test="$css.decoration != 0">
+
+ </xsl:if>
+
+ <xsl:if test="@spacing='compact'"><xsl:message><xsl:text>Compact spacing via @spacing attribute cannot be set in strict XHTML output for listitem: </xsl:text><xsl:value-of select="@spacing"/></xsl:message></xsl:if>
+ <xsl:apply-templates select="listitem |comment()[preceding-sibling::listitem] |processing-instruction()[preceding-sibling::listitem]"/>
+ </ul>
+ </div>
+</xsl:template>
+
+<xsl:template match="itemizedlist/title">
+ <!-- nop -->
+</xsl:template>
+
+<xsl:template match="itemizedlist/listitem">
+ <xsl:variable name="mark" select="../@mark"/>
+ <xsl:variable name="override" select="@override"/>
+
+ <xsl:variable name="usemark">
+ <xsl:choose>
+ <xsl:when test="$override != ''">
+ <xsl:value-of select="$override"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$mark"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="cssmark">
+ <xsl:choose>
+ <xsl:when test="$usemark = 'opencircle'">circle</xsl:when>
+ <xsl:when test="$usemark = 'bullet'">disc</xsl:when>
+ <xsl:when test="$usemark = 'box'">square</xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$usemark"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <li>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:if test="$css.decoration = '1' and $cssmark != ''">
+ <xsl:attribute name="style">
+ <xsl:text>list-style-type: </xsl:text>
+ <xsl:value-of select="$cssmark"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <!-- we can't just drop the anchor in since some browsers (Opera)
+ get confused about line breaks if we do. So if the first child
+ is a para, assume the para will put in the anchor. Otherwise,
+ put the anchor in anyway. -->
+ <xsl:if test="local-name(child::*[1]) != 'para'">
+ <xsl:call-template name="anchor"/>
+ </xsl:if>
+
+ <xsl:choose>
+ <xsl:when test="$show.revisionflag != 0 and @revisionflag">
+ <div class="{@revisionflag}">
+ <xsl:apply-templates/>
+ </div>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </li>
+</xsl:template>
+
+<xsl:template match="orderedlist">
+ <xsl:variable name="start">
+ <xsl:call-template name="orderedlist-starting-number"/>
+ </xsl:variable>
+
+ <xsl:variable name="numeration">
+ <xsl:call-template name="list.numeration"/>
+ </xsl:variable>
+
+ <xsl:variable name="type">
+ <xsl:choose>
+ <xsl:when test="$numeration='arabic'">1</xsl:when>
+ <xsl:when test="$numeration='loweralpha'">a</xsl:when>
+ <xsl:when test="$numeration='lowerroman'">i</xsl:when>
+ <xsl:when test="$numeration='upperalpha'">A</xsl:when>
+ <xsl:when test="$numeration='upperroman'">I</xsl:when>
+ <!-- What!? This should never happen -->
+ <xsl:otherwise>
+ <xsl:message>
+ <xsl:text>Unexpected numeration: </xsl:text>
+ <xsl:value-of select="$numeration"/>
+ </xsl:message>
+ <xsl:value-of select="1"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <div>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:call-template name="anchor"/>
+
+ <xsl:if test="title">
+ <xsl:call-template name="formal.object.heading"/>
+ </xsl:if>
+
+ <!-- Preserve order of PIs and comments -->
+ <xsl:apply-templates select="*[not(self::listitem or self::title or self::titleabbrev)] |comment()[not(preceding-sibling::listitem)] |processing-instruction()[not(preceding-sibling::listitem)]"/>
+
+ <xsl:choose>
+ <xsl:when test="@inheritnum='inherit' and ancestor::listitem[parent::orderedlist]">
+ <table border="0">
+ <xsl:call-template name="generate.class.attribute"/>
+ <col align="{$direction.align.start}" valign="top"/>
+ <tbody>
+ <xsl:apply-templates mode="orderedlist-table" select="listitem |comment()[preceding-sibling::listitem] |processing-instruction()[preceding-sibling::listitem]"/>
+ </tbody>
+ </table>
+ </xsl:when>
+ <xsl:otherwise>
+ <ol>
+ <xsl:call-template name="generate.class.attribute"/>
+ <xsl:if test="$start != '1'"><xsl:message><xsl:text>Strict XHTML does not allow setting @start attribute for lists! </xsl:text></xsl:message></xsl:if>
+ <xsl:if test="$numeration != ''">
+
+ </xsl:if>
+ <xsl:if test="@spacing='compact'"><xsl:message><xsl:text>Compact spacing via @spacing attribute cannot be set in strict XHTML output for listitem: </xsl:text><xsl:value-of select="@spacing"/></xsl:message></xsl:if>
+ <xsl:apply-templates select="listitem |comment()[preceding-sibling::listitem] |processing-instruction()[preceding-sibling::listitem]"/>
+ </ol>
+ </xsl:otherwise>
+ </xsl:choose>
+ </div>
+</xsl:template>
+
+<xsl:template match="orderedlist/title">
+ <!-- nop -->
+</xsl:template>
+
+<xsl:template match="orderedlist/listitem">
+ <li>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:if test="@override"><xsl:message><xsl:text>@override attribute cannot be set in strict XHTML output for listitem: </xsl:text><xsl:value-of select="@override"/></xsl:message></xsl:if>
+
+ <!-- we can't just drop the anchor in since some browsers (Opera)
+ get confused about line breaks if we do. So if the first child
+ is a para, assume the para will put in the anchor. Otherwise,
+ put the anchor in anyway. -->
+ <xsl:if test="local-name(child::*[1]) != 'para'">
+ <xsl:call-template name="anchor"/>
+ </xsl:if>
+
+ <xsl:choose>
+ <xsl:when test="$show.revisionflag != 0 and @revisionflag">
+ <div class="{@revisionflag}">
+ <xsl:apply-templates/>
+ </div>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </li>
+</xsl:template>
+
+<xsl:template match="orderedlist/listitem" mode="orderedlist-table">
+ <tr>
+ <td>
+ <xsl:apply-templates select="." mode="item-number"/>
+ </td>
+ <td>
+ <xsl:if test="local-name(child::*[1]) != 'para'">
+ <xsl:call-template name="anchor"/>
+ </xsl:if>
+
+ <xsl:choose>
+ <xsl:when test="$show.revisionflag != 0 and @revisionflag">
+ <div class="{@revisionflag}">
+ <xsl:apply-templates/>
+ </div>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </td>
+ </tr>
+</xsl:template>
+
+<xsl:template match="variablelist">
+ <xsl:variable name="pi-presentation">
+ <xsl:call-template name="pi.dbhtml_list-presentation"/>
+ </xsl:variable>
+
+ <xsl:variable name="presentation">
+ <xsl:choose>
+ <xsl:when test="$pi-presentation != ''">
+ <xsl:value-of select="$pi-presentation"/>
+ </xsl:when>
+ <xsl:when test="$variablelist.as.table != 0">
+ <xsl:value-of select="'table'"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="'list'"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="list-width">
+ <xsl:call-template name="pi.dbhtml_list-width"/>
+ </xsl:variable>
+
+ <xsl:variable name="term-width">
+ <xsl:call-template name="pi.dbhtml_term-width"/>
+ </xsl:variable>
+
+ <xsl:variable name="table-summary">
+ <xsl:call-template name="pi.dbhtml_table-summary"/>
+ </xsl:variable>
+
+ <div>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:call-template name="anchor"/>
+ <xsl:if test="title">
+ <xsl:call-template name="formal.object.heading"/>
+ </xsl:if>
+
+ <xsl:choose>
+ <xsl:when test="$presentation = 'table'">
+ <!-- Preserve order of PIs and comments -->
+ <xsl:apply-templates select="*[not(self::varlistentry or self::title or self::titleabbrev)] |comment()[not(preceding-sibling::varlistentry)] |processing-instruction()[not(preceding-sibling::varlistentry)]"/>
+ <table border="0">
+ <xsl:if test="$list-width != ''">
+ <xsl:attribute name="width">
+ <xsl:value-of select="$list-width"/>
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:if test="$table-summary != ''">
+ <xsl:attribute name="summary">
+ <xsl:value-of select="$table-summary"/>
+ </xsl:attribute>
+ </xsl:if>
+ <col align="{$direction.align.start}" valign="top">
+ <xsl:if test="$term-width != ''">
+ <xsl:attribute name="width">
+ <xsl:value-of select="$term-width"/>
+ </xsl:attribute>
+ </xsl:if>
+ </col>
+ <tbody>
+ <xsl:apply-templates mode="varlist-table" select="varlistentry |comment()[preceding-sibling::varlistentry] |processing-instruction()[preceding-sibling::varlistentry]"/>
+ </tbody>
+ </table>
+ </xsl:when>
+ <xsl:otherwise>
+ <!-- Preserve order of PIs and comments -->
+ <xsl:apply-templates select="*[not(self::varlistentry or self::title or self::titleabbrev)] |comment()[not(preceding-sibling::varlistentry)] |processing-instruction()[not(preceding-sibling::varlistentry)]"/>
+ <dl>
+ <xsl:apply-templates select="varlistentry |comment()[preceding-sibling::varlistentry] |processing-instruction()[preceding-sibling::varlistentry]"/>
+ </dl>
+ </xsl:otherwise>
+ </xsl:choose>
+ </div>
+</xsl:template>
+
+<xsl:template match="variablelist/title">
+ <!-- nop -->
+</xsl:template>
+
+<xsl:template match="itemizedlist/titleabbrev|orderedlist/titleabbrev">
+ <!--nop-->
+</xsl:template>
+
+<xsl:template match="variablelist/titleabbrev">
+ <!--nop-->
+</xsl:template>
+
+<xsl:template match="listitem" mode="xref">
+ <xsl:number format="1"/>
+</xsl:template>
+
+<xsl:template match="listitem/simpara" priority="2">
+ <!-- If a listitem contains only a single simpara, don't output
+ the <p> wrapper; this has the effect of creating an li
+ with simple text content. -->
+ <xsl:choose>
+ <xsl:when test="not(preceding-sibling::*) and not (following-sibling::*)">
+ <xsl:call-template name="anchor"/>
+ <xsl:apply-templates/>
+ </xsl:when>
+ <xsl:otherwise>
+ <p>
+ <xsl:choose>
+ <xsl:when test="@role and $para.propagates.style != 0">
+ <xsl:call-template name="common.html.attributes">
+ <xsl:with-param name="class" select="@role"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="common.html.attributes"/>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:call-template name="anchor"/>
+ <xsl:apply-templates/>
+ </p>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="varlistentry">
+ <dt>
+ <xsl:call-template name="anchor"/>
+ <xsl:apply-templates select="term"/>
+ </dt>
+ <dd>
+ <xsl:apply-templates select="listitem"/>
+ </dd>
+</xsl:template>
+
+<xsl:template match="varlistentry" mode="varlist-table">
+ <xsl:variable name="presentation">
+ <xsl:call-template name="pi.dbhtml_term-presentation">
+ <xsl:with-param name="node" select=".."/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="separator">
+ <xsl:call-template name="pi.dbhtml_term-separator">
+ <xsl:with-param name="node" select=".."/>
+ </xsl:call-template>
+ </xsl:variable>
+ <tr>
+ <xsl:call-template name="tr.attributes">
+ <xsl:with-param name="rownum">
+ <xsl:number from="variablelist" count="varlistentry"/>
+ </xsl:with-param>
+ </xsl:call-template>
+
+ <td>
+ <p>
+ <xsl:call-template name="anchor"/>
+ <xsl:choose>
+ <xsl:when test="$presentation = 'bold'">
+ <strong>
+ <xsl:apply-templates select="term"/>
+ <xsl:value-of select="$separator"/>
+ </strong>
+ </xsl:when>
+ <xsl:when test="$presentation = 'italic'">
+ <em>
+ <xsl:apply-templates select="term"/>
+ <xsl:value-of select="$separator"/>
+ </em>
+ </xsl:when>
+ <xsl:when test="$presentation = 'bold-italic'">
+ <strong>
+ <em>
+ <xsl:apply-templates select="term"/>
+ <xsl:value-of select="$separator"/>
+ </em>
+ </strong>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="term"/>
+ <xsl:value-of select="$separator"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </p>
+ </td>
+ <td>
+ <xsl:apply-templates select="listitem"/>
+ </td>
+ </tr>
+</xsl:template>
+
+<xsl:template match="varlistentry/term">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:call-template name="anchor"/>
+ <xsl:call-template name="simple.xlink">
+ <xsl:with-param name="content">
+ <xsl:apply-templates/>
+ </xsl:with-param>
+ </xsl:call-template>
+ <xsl:choose>
+ <xsl:when test="position() = last()"/> <!-- do nothing -->
+ <xsl:otherwise>
+ <!-- * if we have multiple terms in the same varlistentry, generate -->
+ <!-- * a separator (", " by default) and/or an additional line -->
+ <!-- * break after each one except the last -->
+ <xsl:value-of select="$variablelist.term.separator"/>
+ <xsl:if test="not($variablelist.term.break.after = '0')">
+ <br/>
+ </xsl:if>
+ </xsl:otherwise>
+ </xsl:choose>
+ </span>
+</xsl:template>
+
+<xsl:template match="varlistentry/listitem">
+ <!-- we can't just drop the anchor in since some browsers (Opera)
+ get confused about line breaks if we do. So if the first child
+ is a para, assume the para will put in the anchor. Otherwise,
+ put the anchor in anyway. -->
+ <xsl:if test="local-name(child::*[1]) != 'para'">
+ <xsl:call-template name="anchor"/>
+ </xsl:if>
+
+ <xsl:choose>
+ <xsl:when test="$show.revisionflag != 0 and @revisionflag">
+ <div class="{@revisionflag}">
+ <xsl:apply-templates/>
+ </div>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="simplelist">
+ <!-- with no type specified, the default is 'vert' -->
+ <xsl:call-template name="anchor"/>
+ <table border="0" summary="Simple list">
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:call-template name="simplelist.vert">
+ <xsl:with-param name="cols">
+ <xsl:choose>
+ <xsl:when test="@columns">
+ <xsl:value-of select="@columns"/>
+ </xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:with-param>
+ </xsl:call-template>
+ </table>
+</xsl:template>
+
+<xsl:template match="simplelist[@type='inline']">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <!-- if dbchoice PI exists, use that to determine the choice separator -->
+ <!-- (that is, equivalent of "and" or "or" in current locale), or literal -->
+ <!-- value of "choice" otherwise -->
+ <xsl:variable name="localized-choice-separator">
+ <xsl:choose>
+ <xsl:when test="processing-instruction('dbchoice')">
+ <xsl:call-template name="select.choice.separator"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <!-- empty -->
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:for-each select="member">
+ <xsl:call-template name="simple.xlink">
+ <xsl:with-param name="content">
+ <xsl:apply-templates/>
+ </xsl:with-param>
+ </xsl:call-template>
+ <xsl:choose>
+ <xsl:when test="position() = last()"/> <!-- do nothing -->
+ <xsl:otherwise>
+ <xsl:text>, </xsl:text>
+ <xsl:if test="position() = last() - 1">
+ <xsl:if test="$localized-choice-separator != ''">
+ <xsl:value-of select="$localized-choice-separator"/>
+ <xsl:text> </xsl:text>
+ </xsl:if>
+ </xsl:if>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:for-each>
+ </span>
+</xsl:template>
+
+<xsl:template match="simplelist[@type='horiz']">
+ <xsl:call-template name="anchor"/>
+ <table border="0" summary="Simple list">
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:call-template name="simplelist.horiz">
+ <xsl:with-param name="cols">
+ <xsl:choose>
+ <xsl:when test="@columns">
+ <xsl:value-of select="@columns"/>
+ </xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:with-param>
+ </xsl:call-template>
+ </table>
+</xsl:template>
+
+<xsl:template match="simplelist[@type='vert']">
+ <xsl:call-template name="anchor"/>
+ <table border="0" summary="Simple list">
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:call-template name="simplelist.vert">
+ <xsl:with-param name="cols">
+ <xsl:choose>
+ <xsl:when test="@columns">
+ <xsl:value-of select="@columns"/>
+ </xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:with-param>
+ </xsl:call-template>
+ </table>
+</xsl:template>
+
+<xsl:template name="simplelist.horiz">
+ <xsl:param name="cols">1</xsl:param>
+ <xsl:param name="cell">1</xsl:param>
+ <xsl:param name="members" select="./member"/>
+
+ <xsl:if test="$cell &lt;= count($members)">
+ <tr>
+ <xsl:call-template name="tr.attributes">
+ <xsl:with-param name="row" select="$members[1]"/>
+ <xsl:with-param name="rownum" select="(($cell - 1) div $cols) + 1"/>
+ </xsl:call-template>
+
+ <xsl:call-template name="simplelist.horiz.row">
+ <xsl:with-param name="cols" select="$cols"/>
+ <xsl:with-param name="cell" select="$cell"/>
+ <xsl:with-param name="members" select="$members"/>
+ </xsl:call-template>
+ </tr>
+ <xsl:call-template name="simplelist.horiz">
+ <xsl:with-param name="cols" select="$cols"/>
+ <xsl:with-param name="cell" select="$cell + $cols"/>
+ <xsl:with-param name="members" select="$members"/>
+ </xsl:call-template>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template name="simplelist.horiz.row">
+ <xsl:param name="cols">1</xsl:param>
+ <xsl:param name="cell">1</xsl:param>
+ <xsl:param name="members" select="./member"/>
+ <xsl:param name="curcol">1</xsl:param>
+
+ <xsl:if test="$curcol &lt;= $cols">
+ <td>
+ <xsl:choose>
+ <xsl:when test="$members[position()=$cell]">
+ <xsl:apply-templates select="$members[position()=$cell]"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text>&#160;</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ </td>
+ <xsl:call-template name="simplelist.horiz.row">
+ <xsl:with-param name="cols" select="$cols"/>
+ <xsl:with-param name="cell" select="$cell+1"/>
+ <xsl:with-param name="members" select="$members"/>
+ <xsl:with-param name="curcol" select="$curcol+1"/>
+ </xsl:call-template>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template name="simplelist.vert">
+ <xsl:param name="cols">1</xsl:param>
+ <xsl:param name="cell">1</xsl:param>
+ <xsl:param name="members" select="./member"/>
+ <xsl:param name="rows" select="floor((count($members)+$cols - 1) div $cols)"/>
+
+ <xsl:if test="$cell &lt;= $rows">
+ <tr>
+ <xsl:call-template name="tr.attributes">
+ <xsl:with-param name="row" select="$members[1]"/>
+ <xsl:with-param name="rownum" select="$cell"/>
+ </xsl:call-template>
+
+ <xsl:call-template name="simplelist.vert.row">
+ <xsl:with-param name="cols" select="$cols"/>
+ <xsl:with-param name="rows" select="$rows"/>
+ <xsl:with-param name="cell" select="$cell"/>
+ <xsl:with-param name="members" select="$members"/>
+ </xsl:call-template>
+ </tr>
+ <xsl:call-template name="simplelist.vert">
+ <xsl:with-param name="cols" select="$cols"/>
+ <xsl:with-param name="cell" select="$cell+1"/>
+ <xsl:with-param name="members" select="$members"/>
+ <xsl:with-param name="rows" select="$rows"/>
+ </xsl:call-template>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template name="simplelist.vert.row">
+ <xsl:param name="cols">1</xsl:param>
+ <xsl:param name="rows">1</xsl:param>
+ <xsl:param name="cell">1</xsl:param>
+ <xsl:param name="members" select="./member"/>
+ <xsl:param name="curcol">1</xsl:param>
+
+ <xsl:if test="$curcol &lt;= $cols">
+ <td>
+ <xsl:choose>
+ <xsl:when test="$members[position()=$cell]">
+ <xsl:apply-templates select="$members[position()=$cell]"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text>&#160;</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ </td>
+ <xsl:call-template name="simplelist.vert.row">
+ <xsl:with-param name="cols" select="$cols"/>
+ <xsl:with-param name="rows" select="$rows"/>
+ <xsl:with-param name="cell" select="$cell+$rows"/>
+ <xsl:with-param name="members" select="$members"/>
+ <xsl:with-param name="curcol" select="$curcol+1"/>
+ </xsl:call-template>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="member">
+ <xsl:call-template name="anchor"/>
+ <xsl:call-template name="simple.xlink">
+ <xsl:with-param name="content">
+ <xsl:apply-templates/>
+ </xsl:with-param>
+ </xsl:call-template>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="procedure">
+ <xsl:variable name="param.placement" select="substring-after(normalize-space($formal.title.placement), concat(local-name(.), ' '))"/>
+
+ <xsl:variable name="placement">
+ <xsl:choose>
+ <xsl:when test="contains($param.placement, ' ')">
+ <xsl:value-of select="substring-before($param.placement, ' ')"/>
+ </xsl:when>
+ <xsl:when test="$param.placement = ''">before</xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$param.placement"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <!-- Preserve order of PIs and comments -->
+ <xsl:variable name="preamble" select="*[not(self::step or self::title or self::titleabbrev)] |comment()[not(preceding-sibling::step)] |processing-instruction()[not(preceding-sibling::step)]"/>
+
+ <div>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:call-template name="anchor">
+ <xsl:with-param name="conditional">
+ <xsl:choose>
+ <xsl:when test="title">0</xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:with-param>
+ </xsl:call-template>
+
+ <xsl:if test="title and $placement = 'before'">
+ <xsl:call-template name="formal.object.heading"/>
+ </xsl:if>
+
+ <xsl:apply-templates select="$preamble"/>
+
+ <xsl:choose>
+ <xsl:when test="count(step) = 1">
+ <ul>
+ <xsl:call-template name="generate.class.attribute"/>
+ <xsl:apply-templates select="step |comment()[preceding-sibling::step] |processing-instruction()[preceding-sibling::step]"/>
+ </ul>
+ </xsl:when>
+ <xsl:otherwise>
+ <ol>
+ <xsl:call-template name="generate.class.attribute"/>
+
+ <xsl:apply-templates select="step |comment()[preceding-sibling::step] |processing-instruction()[preceding-sibling::step]"/>
+ </ol>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:if test="title and $placement != 'before'">
+ <xsl:call-template name="formal.object.heading"/>
+ </xsl:if>
+ </div>
+</xsl:template>
+
+<xsl:template match="procedure/title">
+ <!-- nop -->
+</xsl:template>
+
+<xsl:template match="substeps"><xsl:variable name="numeration"><xsl:call-template name="procedure.step.numeration"/></xsl:variable><xsl:variable name="cssstyle"><xsl:choose><xsl:when test="$numeration = '1'">decimal</xsl:when><xsl:when test="$numeration = 'a'">lower-alpha</xsl:when><xsl:when test="$numeration = 'i'">lower-roman</xsl:when><xsl:when test="$numeration = 'A'">upper-alpha</xsl:when><xsl:when test="$numeration = 'I'">upper-roman</xsl:when><xsl:otherwise><xsl:message>Warning: unknown procedure.step.numeration value: <xsl:value-of select="$numeration"/></xsl:message></xsl:otherwise></xsl:choose></xsl:variable><xsl:call-template name="anchor"/><ol><xsl:attribute name="style"><xsl:text>list-style-type: </xsl:text><xsl:value-of select="$cssstyle"/></xsl:attribute><xsl:apply-templates/></ol></xsl:template>
+
+<xsl:template match="step">
+ <li>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:call-template name="anchor"/>
+ <xsl:apply-templates/>
+ </li>
+</xsl:template>
+
+<xsl:template match="stepalternatives">
+ <xsl:call-template name="anchor"/>
+ <ul>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates/>
+ </ul>
+</xsl:template>
+
+<xsl:template match="step/title">
+ <p>
+ <xsl:call-template name="common.html.attributes"/>
+ <strong xmlns:xslo="http://www.w3.org/1999/XSL/Transform">
+ <xsl:apply-templates/>
+ </strong>
+ </p>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="segmentedlist">
+ <xsl:variable name="presentation">
+ <xsl:call-template name="pi.dbhtml_list-presentation"/>
+ </xsl:variable>
+
+ <div>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:call-template name="anchor"/>
+
+ <xsl:choose>
+ <xsl:when test="$presentation = 'table'">
+ <xsl:apply-templates select="." mode="seglist-table"/>
+ </xsl:when>
+ <xsl:when test="$presentation = 'list'">
+ <xsl:apply-templates/>
+ </xsl:when>
+ <xsl:when test="$segmentedlist.as.table != 0">
+ <xsl:apply-templates select="." mode="seglist-table"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </div>
+</xsl:template>
+
+<xsl:template match="segmentedlist/title">
+ <div>
+ <xsl:call-template name="common.html.attributes"/>
+ <strong>
+ <span>
+ <xsl:call-template name="generate.class.attribute"/>
+ <xsl:apply-templates/>
+ </span>
+ </strong>
+ </div>
+</xsl:template>
+
+<xsl:template match="segtitle">
+</xsl:template>
+
+<xsl:template match="segtitle" mode="segtitle-in-seg">
+ <xsl:apply-templates/>
+</xsl:template>
+
+<xsl:template match="seglistitem">
+ <div>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:call-template name="anchor"/>
+ <xsl:apply-templates/>
+ </div>
+</xsl:template>
+
+<xsl:template match="seg">
+ <xsl:variable name="segnum" select="count(preceding-sibling::seg)+1"/>
+ <xsl:variable name="seglist" select="ancestor::segmentedlist"/>
+ <xsl:variable name="segtitles" select="$seglist/segtitle"/>
+
+ <!--
+ Note: segtitle is only going to be the right thing in a well formed
+ SegmentedList. If there are too many Segs or too few SegTitles,
+ you'll get something odd...maybe an error
+ -->
+
+ <div>
+ <xsl:call-template name="common.html.attributes"/>
+ <strong>
+ <span class="segtitle">
+ <xsl:apply-templates select="$segtitles[$segnum=position()]" mode="segtitle-in-seg"/>
+ <xsl:text>: </xsl:text>
+ </span>
+ </strong>
+ <xsl:apply-templates/>
+ </div>
+</xsl:template>
+
+<xsl:template match="segmentedlist" mode="seglist-table">
+ <xsl:variable name="table-summary">
+ <xsl:call-template name="pi.dbhtml_table-summary"/>
+ </xsl:variable>
+
+ <xsl:variable name="list-width">
+ <xsl:call-template name="pi.dbhtml_list-width"/>
+ </xsl:variable>
+
+ <xsl:apply-templates select="title"/>
+
+ <table border="0">
+ <xsl:if test="$list-width != ''">
+ <xsl:attribute name="width">
+ <xsl:value-of select="$list-width"/>
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:if test="$table-summary != ''">
+ <xsl:attribute name="summary">
+ <xsl:value-of select="$table-summary"/>
+ </xsl:attribute>
+ </xsl:if>
+ <thead>
+ <tr class="segtitle">
+ <xsl:call-template name="tr.attributes">
+ <xsl:with-param name="row" select="segtitle[1]"/>
+ <xsl:with-param name="rownum" select="1"/>
+ </xsl:call-template>
+ <xsl:apply-templates select="segtitle" mode="seglist-table"/>
+ </tr>
+ </thead>
+ <tbody>
+ <xsl:apply-templates select="seglistitem" mode="seglist-table"/>
+ </tbody>
+ </table>
+</xsl:template>
+
+<xsl:template match="segtitle" mode="seglist-table">
+ <th><xsl:apply-templates/></th>
+</xsl:template>
+
+<xsl:template match="seglistitem" mode="seglist-table">
+ <xsl:variable name="seglinum">
+ <xsl:number from="segmentedlist" count="seglistitem"/>
+ </xsl:variable>
+
+ <tr>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:call-template name="tr.attributes">
+ <xsl:with-param name="rownum" select="$seglinum + 1"/>
+ </xsl:call-template>
+ <xsl:apply-templates mode="seglist-table"/>
+ </tr>
+</xsl:template>
+
+<xsl:template match="seg" mode="seglist-table">
+ <td>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates/>
+ </td>
+</xsl:template>
+
+<xsl:template match="seg[1]" mode="seglist-table">
+ <td>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:call-template name="anchor">
+ <xsl:with-param name="node" select="ancestor::seglistitem"/>
+ </xsl:call-template>
+ <xsl:apply-templates/>
+ </td>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="calloutlist">
+ <div>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:call-template name="anchor"/>
+ <xsl:if test="title|info/title">
+ <xsl:call-template name="formal.object.heading"/>
+ </xsl:if>
+
+ <!-- Preserve order of PIs and comments -->
+ <xsl:apply-templates select="*[not(self::callout or self::title or self::titleabbrev)] |comment()[not(preceding-sibling::callout)] |processing-instruction()[not(preceding-sibling::callout)]"/>
+
+ <xsl:choose>
+ <xsl:when test="$callout.list.table != 0">
+ <table border="0" summary="Callout list">
+ <xsl:apply-templates select="callout |comment()[preceding-sibling::callout] |processing-instruction()[preceding-sibling::callout]"/>
+ </table>
+ </xsl:when>
+ <xsl:otherwise>
+ <dl compact="compact">
+ <xsl:apply-templates select="callout |comment()[preceding-sibling::callout] |processing-instruction()[preceding-sibling::callout]"/>
+ </dl>
+ </xsl:otherwise>
+ </xsl:choose>
+ </div>
+</xsl:template>
+
+<xsl:template match="calloutlist/title">
+</xsl:template>
+
+<xsl:template match="callout">
+ <xsl:choose>
+ <xsl:when test="$callout.list.table != 0">
+ <tr>
+ <xsl:call-template name="tr.attributes">
+ <xsl:with-param name="rownum">
+ <xsl:number from="calloutlist" count="callout"/>
+ </xsl:with-param>
+ </xsl:call-template>
+
+ <td valign="top" align="{$direction.align.start}">
+ <p>
+ <xsl:call-template name="anchor"/>
+ <xsl:call-template name="callout.arearefs">
+ <xsl:with-param name="arearefs" select="@arearefs"/>
+ </xsl:call-template>
+ </p>
+ </td>
+ <td valign="top" align="{$direction.align.start}">
+ <xsl:apply-templates/>
+ </td>
+ </tr>
+ </xsl:when>
+ <xsl:otherwise>
+ <dt>
+ <xsl:call-template name="anchor"/>
+ <xsl:call-template name="callout.arearefs">
+ <xsl:with-param name="arearefs" select="@arearefs"/>
+ </xsl:call-template>
+ </dt>
+ <dd><xsl:apply-templates/></dd>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="callout/simpara" priority="2">
+ <!-- If a callout contains only a single simpara, don't output
+ the <p> wrapper; this has the effect of creating an li
+ with simple text content. -->
+ <xsl:choose>
+ <xsl:when test="not(preceding-sibling::*) and not (following-sibling::*)">
+ <xsl:call-template name="anchor"/>
+ <xsl:apply-templates/>
+ </xsl:when>
+ <xsl:otherwise>
+ <p>
+ <xsl:if test="@role and $para.propagates.style != 0">
+ <xsl:choose>
+ <xsl:when test="@role and $para.propagates.style != 0">
+ <xsl:call-template name="common.html.attributes">
+ <xsl:with-param name="class" select="@role"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="common.html.attributes"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:if>
+
+ <xsl:call-template name="anchor"/>
+ <xsl:apply-templates/>
+ </p>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="callout.arearefs">
+ <xsl:param name="arearefs"/>
+ <xsl:if test="$arearefs!=''">
+ <xsl:choose>
+ <xsl:when test="substring-before($arearefs,' ')=''">
+ <xsl:call-template name="callout.arearef">
+ <xsl:with-param name="arearef" select="$arearefs"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="callout.arearef">
+ <xsl:with-param name="arearef" select="substring-before($arearefs,' ')"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:call-template name="callout.arearefs">
+ <xsl:with-param name="arearefs" select="substring-after($arearefs,' ')"/>
+ </xsl:call-template>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template name="callout.arearef">
+ <xsl:param name="arearef"/>
+ <xsl:variable name="targets" select="key('id',$arearef)"/>
+ <xsl:variable name="target" select="$targets[1]"/>
+
+ <xsl:call-template name="check.id.unique">
+ <xsl:with-param name="linkend" select="$arearef"/>
+ </xsl:call-template>
+
+ <xsl:choose>
+ <xsl:when test="count($target)=0">
+ <xsl:text>???</xsl:text>
+ </xsl:when>
+ <xsl:when test="local-name($target)='co'">
+ <a>
+ <xsl:attribute name="href">
+ <xsl:text>#</xsl:text>
+ <xsl:value-of select="$arearef"/>
+ </xsl:attribute>
+ <xsl:apply-templates select="$target" mode="callout-bug"/>
+ </a>
+ <xsl:text> </xsl:text>
+ </xsl:when>
+ <xsl:when test="local-name($target)='areaset'">
+ <xsl:call-template name="callout-bug">
+ <xsl:with-param name="conum">
+ <xsl:apply-templates select="$target" mode="conumber"/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="local-name($target)='area'">
+ <xsl:choose>
+ <xsl:when test="$target/parent::areaset">
+ <xsl:call-template name="callout-bug">
+ <xsl:with-param name="conum">
+ <xsl:apply-templates select="$target/parent::areaset" mode="conumber"/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="callout-bug">
+ <xsl:with-param name="conum">
+ <xsl:apply-templates select="$target" mode="conumber"/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text>???</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template name="orderedlist-starting-number">
+ <xsl:param name="list" select="."/>
+ <xsl:variable name="pi-start">
+ <xsl:call-template name="pi.dbhtml_start">
+ <xsl:with-param name="node" select="$list"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:call-template name="output-orderedlist-starting-number">
+ <xsl:with-param name="list" select="$list"/>
+ <xsl:with-param name="pi-start" select="$pi-start"/>
+ </xsl:call-template>
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/maketoc.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/maketoc.xsl
new file mode 100644
index 0000000..d1f710f
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/maketoc.xsl
@@ -0,0 +1,91 @@
+<?xml version="1.0" encoding="ASCII"?>
+<!--This file was created automatically by html2xhtml-->
+<!--from the HTML stylesheets.-->
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:doc="http://nwalsh.com/xsl/documentation/1.0" xmlns="http://www.w3.org/1999/xhtml" version="1.0" exclude-result-prefixes="doc">
+
+<!-- ********************************************************************
+ $Id: maketoc.xsl 6910 2007-06-28 23:23:30Z xmldoc $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<!-- ==================================================================== -->
+
+<xsl:import href="docbook.xsl"/>
+<xsl:import href="chunk.xsl"/>
+
+<xsl:output method="xml" indent="no" encoding="UTF-8" doctype-public="-//W3C//DTD XHTML 1.1//EN" doctype-system="http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"/>
+
+<xsl:param name="toc.list.type" select="'tocentry'"/>
+
+<!-- refentry in autotoc.xsl does not use subtoc, so must
+ handle it explicitly here. -->
+<xsl:template match="refentry" mode="toc">
+ <xsl:param name="toc-context" select="."/>
+
+ <xsl:call-template name="subtoc">
+ <xsl:with-param name="toc-context" select="$toc-context"/>
+ </xsl:call-template>
+</xsl:template>
+
+
+<xsl:template name="subtoc">
+ <xsl:param name="nodes" select="NOT-AN-ELEMENT"/>
+ <xsl:variable name="filename">
+ <xsl:apply-templates select="." mode="chunk-filename"/>
+ </xsl:variable>
+
+ <xsl:variable name="chunk">
+ <xsl:call-template name="chunk"/>
+ </xsl:variable>
+
+ <xsl:if test="$chunk != 0">
+ <xsl:call-template name="indent-spaces"/>
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+ <tocentry linkend="{$id}">
+ <xsl:processing-instruction name="dbhtml">
+ <xsl:text>filename="</xsl:text>
+ <xsl:value-of select="$filename"/>
+ <xsl:text>"</xsl:text>
+ </xsl:processing-instruction>
+ <xsl:text>
+</xsl:text>
+ <xsl:apply-templates mode="toc" select="$nodes"/>
+ <xsl:call-template name="indent-spaces"/>
+ </tocentry>
+ <xsl:text>
+</xsl:text>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template name="indent-spaces">
+ <xsl:param name="node" select="."/>
+ <xsl:text> </xsl:text>
+ <xsl:if test="$node/parent::*">
+ <xsl:call-template name="indent-spaces">
+ <xsl:with-param name="node" select="$node/parent::*"/>
+ </xsl:call-template>
+ </xsl:if>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="/" priority="-1">
+ <xsl:text>
+</xsl:text>
+ <toc role="chunk-toc">
+ <xsl:text>
+</xsl:text>
+ <xsl:apply-templates select="/" mode="toc"/>
+ </toc>
+ <xsl:text>
+</xsl:text>
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/manifest.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/manifest.xsl
new file mode 100644
index 0000000..26b51d0
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/manifest.xsl
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="ASCII"?>
+<!--This file was created automatically by html2xhtml-->
+<!--from the HTML stylesheets.-->
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:doc="http://nwalsh.com/xsl/documentation/1.0" xmlns="http://www.w3.org/1999/xhtml" version="1.0" exclude-result-prefixes="doc">
+
+<!-- ********************************************************************
+ $Id: manifest.xsl 6910 2007-06-28 23:23:30Z xmldoc $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<!-- ==================================================================== -->
+<!-- OBSOLETE. The templates from this file were moved to -->
+<!-- chunk-common.xsl and chunk-code.xsl. -->
+<!-- ==================================================================== -->
+
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/math.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/math.xsl
new file mode 100644
index 0000000..b2cac2d
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/math.xsl
@@ -0,0 +1,284 @@
+<?xml version="1.0" encoding="ASCII"?>
+<!--This file was created automatically by html2xhtml-->
+<!--from the HTML stylesheets.-->
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns="http://www.w3.org/1999/xhtml" exclude-result-prefixes="mml" version="1.0">
+
+<!-- ********************************************************************
+ $Id: math.xsl 8421 2009-05-04 07:49:49Z bobstayton $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<xsl:template match="inlineequation">
+ <xsl:apply-templates/>
+</xsl:template>
+
+<xsl:template match="alt">
+</xsl:template>
+
+<xsl:template match="mathphrase">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates/>
+ </span>
+</xsl:template>
+
+<!-- "Support" for MathML -->
+
+<xsl:template match="mml:*">
+ <xsl:copy>
+ <xsl:copy-of select="@*"/>
+ <xsl:apply-templates/>
+ </xsl:copy>
+</xsl:template>
+
+<!-- Support for TeX math in alt -->
+
+<xsl:template match="*" mode="collect.tex.math">
+ <xsl:call-template name="write.text.chunk">
+ <xsl:with-param name="filename" select="$tex.math.file"/>
+ <xsl:with-param name="method" select="'text'"/>
+ <xsl:with-param name="content">
+ <xsl:choose>
+ <xsl:when test="$tex.math.in.alt = 'plain'">
+ <xsl:call-template name="tex.math.plain.head"/>
+ <xsl:apply-templates select="." mode="collect.tex.math.plain"/>
+ <xsl:call-template name="tex.math.plain.tail"/>
+ </xsl:when>
+ <xsl:when test="$tex.math.in.alt = 'latex'">
+ <xsl:call-template name="tex.math.latex.head"/>
+ <xsl:apply-templates select="." mode="collect.tex.math.latex"/>
+ <xsl:call-template name="tex.math.latex.tail"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:message>
+ Unsupported TeX math notation:
+ <xsl:value-of select="$tex.math.in.alt"/>
+ </xsl:message>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:with-param>
+ <xsl:with-param name="encoding" select="$chunker.output.encoding"/>
+ </xsl:call-template>
+</xsl:template>
+
+<!-- PlainTeX -->
+
+<xsl:template name="tex.math.plain.head">
+ <xsl:text>\nopagenumbers
+</xsl:text>
+</xsl:template>
+
+<xsl:template name="tex.math.plain.tail">
+ <xsl:text>\bye
+</xsl:text>
+</xsl:template>
+
+<xsl:template match="inlineequation" mode="collect.tex.math.plain">
+ <xsl:variable name="filename">
+ <xsl:choose>
+ <xsl:when test="graphic">
+ <xsl:call-template name="mediaobject.filename">
+ <xsl:with-param name="object" select="graphic"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="select.mediaobject.filename">
+ <xsl:with-param name="olist" select="inlinemediaobject/*"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:variable name="output.delims">
+ <xsl:call-template name="tex.math.output.delims"/>
+ </xsl:variable>
+ <xsl:variable name="tex" select="alt[@role='tex'] | inlinemediaobject/textobject[@role='tex']"/>
+ <xsl:if test="$tex">
+ <xsl:text>\special{dvi2bitmap outputfile </xsl:text>
+ <xsl:value-of select="$filename"/>
+ <xsl:text>}
+</xsl:text>
+ <xsl:if test="$output.delims != 0">
+ <xsl:text>$</xsl:text>
+ </xsl:if>
+ <xsl:value-of select="$tex"/>
+ <xsl:if test="$output.delims != 0">
+ <xsl:text>$
+</xsl:text>
+ </xsl:if>
+ <xsl:text>\vfill\eject
+</xsl:text>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="equation|informalequation" mode="collect.tex.math.plain">
+ <xsl:variable name="filename">
+ <xsl:choose>
+ <xsl:when test="graphic">
+ <xsl:call-template name="mediaobject.filename">
+ <xsl:with-param name="object" select="graphic"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="select.mediaobject.filename">
+ <xsl:with-param name="olist" select="mediaobject/*"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:variable name="output.delims">
+ <xsl:call-template name="tex.math.output.delims"/>
+ </xsl:variable>
+ <xsl:variable name="tex" select="alt[@role='tex'] | mediaobject/textobject[@role='tex']"/>
+ <xsl:if test="$tex">
+ <xsl:text>\special{dvi2bitmap outputfile </xsl:text>
+ <xsl:value-of select="$filename"/>
+ <xsl:text>}
+</xsl:text>
+ <xsl:if test="$output.delims != 0">
+ <xsl:text>$$</xsl:text>
+ </xsl:if>
+ <xsl:value-of select="$tex"/>
+ <xsl:if test="$output.delims != 0">
+ <xsl:text>$$
+</xsl:text>
+ </xsl:if>
+ <xsl:text>\vfill\eject
+</xsl:text>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="text()" mode="collect.tex.math.plain"/>
+
+<!-- LaTeX -->
+
+<xsl:template name="tex.math.latex.head">
+ <xsl:text>\documentclass{article}
+</xsl:text>
+ <xsl:text>\pagestyle{empty}
+</xsl:text>
+ <xsl:text>\begin{document}
+</xsl:text>
+</xsl:template>
+
+<xsl:template name="tex.math.latex.tail">
+ <xsl:text>\end{document}
+</xsl:text>
+</xsl:template>
+
+<xsl:template match="inlineequation" mode="collect.tex.math.latex">
+ <xsl:variable name="filename">
+ <xsl:choose>
+ <xsl:when test="graphic">
+ <xsl:call-template name="mediaobject.filename">
+ <xsl:with-param name="object" select="graphic"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="select.mediaobject.filename">
+ <xsl:with-param name="olist" select="inlinemediaobject/*"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:variable name="output.delims">
+ <xsl:call-template name="tex.math.output.delims"/>
+ </xsl:variable>
+ <xsl:variable name="tex" select="alt[@role='tex'] | inlinemediaobject/textobject[@role='tex']"/>
+ <xsl:if test="$tex">
+ <xsl:text>\special{dvi2bitmap outputfile </xsl:text>
+ <xsl:value-of select="$filename"/>
+ <xsl:text>}
+</xsl:text>
+ <xsl:if test="$output.delims != 0">
+ <xsl:text>$</xsl:text>
+ </xsl:if>
+ <xsl:value-of select="$tex"/>
+ <xsl:if test="$output.delims != 0">
+ <xsl:text>$
+</xsl:text>
+ </xsl:if>
+ <xsl:text>\newpage
+</xsl:text>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="equation|informalequation" mode="collect.tex.math.latex">
+ <xsl:variable name="filename">
+ <xsl:choose>
+ <xsl:when test="graphic">
+ <xsl:call-template name="mediaobject.filename">
+ <xsl:with-param name="object" select="graphic"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="select.mediaobject.filename">
+ <xsl:with-param name="olist" select="mediaobject/*"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:variable name="output.delims">
+ <xsl:call-template name="tex.math.output.delims"/>
+ </xsl:variable>
+ <xsl:variable name="tex" select="alt[@role='tex'] | mediaobject/textobject[@role='tex']"/>
+ <xsl:if test="$tex">
+ <xsl:text>\special{dvi2bitmap outputfile </xsl:text>
+ <xsl:value-of select="$filename"/>
+ <xsl:text>}
+</xsl:text>
+ <xsl:if test="$output.delims != 0">
+ <xsl:text>$$</xsl:text>
+ </xsl:if>
+ <xsl:value-of select="$tex"/>
+ <xsl:if test="$output.delims != 0">
+ <xsl:text>$$
+</xsl:text>
+ </xsl:if>
+ <xsl:text>\newpage
+</xsl:text>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="text()" mode="collect.tex.math.latex"/>
+
+<!-- Extracting image filename from mediaobject and graphic elements -->
+
+<xsl:template name="select.mediaobject.filename">
+ <xsl:param name="olist" select="imageobject|imageobjectco |videoobject|audioobject|textobject"/>
+
+ <xsl:variable name="mediaobject.index">
+ <xsl:call-template name="select.mediaobject.index">
+ <xsl:with-param name="olist" select="$olist"/>
+ <xsl:with-param name="count" select="1"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:if test="$mediaobject.index != ''">
+ <xsl:call-template name="mediaobject.filename">
+ <xsl:with-param name="object" select="$olist[position() = $mediaobject.index]"/>
+ </xsl:call-template>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template name="tex.math.output.delims">
+ <xsl:variable name="pi.delims">
+ <xsl:call-template name="pi.dbtex_delims">
+ <xsl:with-param name="node" select="descendant-or-self::*"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:variable name="result">
+ <xsl:choose>
+ <xsl:when test="$pi.delims = 'no'">0</xsl:when>
+ <xsl:when test="$pi.delims = '' and $tex.math.delims = 0">0</xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:value-of select="$result"/>
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/oldchunker.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/oldchunker.xsl
new file mode 100644
index 0000000..e727bf1
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/oldchunker.xsl
@@ -0,0 +1,176 @@
+<?xml version="1.0" encoding="ASCII"?>
+<!--This file was created automatically by html2xhtml-->
+<!--from the HTML stylesheets.-->
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:saxon="http://icl.com/saxon" xmlns:lxslt="http://xml.apache.org/xslt" xmlns:redirect="http://xml.apache.org/xalan/redirect" xmlns:doc="http://nwalsh.com/xsl/documentation/1.0" xmlns="http://www.w3.org/1999/xhtml" version="1.1" exclude-result-prefixes="doc" extension-element-prefixes="saxon redirect lxslt">
+
+<!-- ********************************************************************
+ $Id: oldchunker.xsl 6910 2007-06-28 23:23:30Z xmldoc $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<!-- ==================================================================== -->
+
+<!-- This stylesheet works with Saxon and Xalan; for XT use xtchunker.xsl -->
+
+<!-- ==================================================================== -->
+
+<xsl:param name="default.encoding" select="'ISO-8859-1'" doc:type="string"/>
+
+<doc:param xmlns="" name="default.encoding">
+<refpurpose xmlns="http://www.w3.org/1999/xhtml">Encoding used in generated HTML pages</refpurpose>
+<refdescription xmlns="http://www.w3.org/1999/xhtml">
+<para>This encoding is used in files generated by chunking stylesheet. Currently
+only Saxon is able to change output encoding.
+</para>
+</refdescription>
+</doc:param>
+
+<!-- ==================================================================== -->
+
+<xsl:param name="saxon.character.representation" select="'entity;decimal'" doc:type="string"/>
+
+<doc:param xmlns="" name="saxon.character.representation">
+<refpurpose xmlns="http://www.w3.org/1999/xhtml">Saxon character representation used in generated HTML pages</refpurpose>
+<refdescription xmlns="http://www.w3.org/1999/xhtml">
+<para>This character representation is used in files generated by chunking stylesheet. If
+you want to suppress entity references for characters with direct representation
+in default.encoding, set this parameter to value <literal>native</literal>.
+</para>
+</refdescription>
+</doc:param>
+
+<!-- ==================================================================== -->
+
+<xsl:template name="make-relative-filename">
+ <xsl:param name="base.dir" select="'./'"/>
+ <xsl:param name="base.name" select="''"/>
+
+ <xsl:variable name="vendor" select="system-property('xsl:vendor')"/>
+
+ <xsl:choose>
+ <xsl:when test="contains($vendor, 'SAXON')">
+ <!-- Saxon doesn't make the chunks relative -->
+ <xsl:value-of select="concat($base.dir,$base.name)"/>
+ </xsl:when>
+ <xsl:when test="contains($vendor, 'Apache')">
+ <!-- Xalan doesn't make the chunks relative -->
+ <xsl:value-of select="concat($base.dir,$base.name)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:message terminate="yes">
+ <xsl:text>Chunking isn't supported with </xsl:text>
+ <xsl:value-of select="$vendor"/>
+ </xsl:message>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="write.chunk">
+ <xsl:param name="filename" select="''"/>
+ <xsl:param name="method" select="'html'"/>
+ <xsl:param name="encoding" select="$default.encoding"/>
+ <xsl:param name="indent" select="'no'"/>
+ <xsl:param name="content" select="''"/>
+
+ <xsl:message>
+ <xsl:text>Writing </xsl:text>
+ <xsl:value-of select="$filename"/>
+ <xsl:if test="name(.) != ''">
+ <xsl:text> for </xsl:text>
+ <xsl:value-of select="name(.)"/>
+ <xsl:if test="@id">
+ <xsl:text>(</xsl:text>
+ <xsl:value-of select="@id"/>
+ <xsl:text>)</xsl:text>
+ </xsl:if>
+ </xsl:if>
+ </xsl:message>
+
+ <xsl:variable name="vendor" select="system-property('xsl:vendor')"/>
+
+ <xsl:choose>
+ <xsl:when test="contains($vendor, 'SAXON 6.2')">
+ <!-- Saxon 6.2.x uses xsl:document -->
+ <xsl:document href="{$filename}" method="{$method}" encoding="{$encoding}" indent="{$indent}" saxon:character-representation="{$saxon.character.representation}">
+ <xsl:copy-of select="$content"/>
+ </xsl:document>
+ </xsl:when>
+ <xsl:when test="contains($vendor, 'SAXON')">
+ <!-- Saxon uses saxon:output -->
+ <saxon:output file="{$filename}" href="{$filename}" method="{$method}" encoding="{$encoding}" indent="{$indent}" saxon:character-representation="{$saxon.character.representation}">
+ <xsl:copy-of select="$content"/>
+ </saxon:output>
+ </xsl:when>
+ <xsl:when test="contains($vendor, 'Apache')">
+ <!-- Xalan uses redirect -->
+ <redirect:write file="{$filename}">
+ <xsl:copy-of select="$content"/>
+ </redirect:write>
+ </xsl:when>
+ <xsl:otherwise>
+ <!-- it doesn't matter since we won't be making chunks... -->
+ <xsl:message terminate="yes">
+ <xsl:text>Can't make chunks with </xsl:text>
+ <xsl:value-of select="$vendor"/>
+ <xsl:text>'s processor.</xsl:text>
+ </xsl:message>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="write.chunk.with.doctype">
+ <xsl:param name="filename" select="''"/>
+ <xsl:param name="method" select="'html'"/>
+ <xsl:param name="encoding" select="$default.encoding"/>
+ <xsl:param name="indent" select="'no'"/>
+ <xsl:param name="doctype-public" select="''"/>
+ <xsl:param name="doctype-system" select="''"/>
+ <xsl:param name="content" select="''"/>
+
+ <xsl:message>
+ <xsl:text>Writing </xsl:text>
+ <xsl:value-of select="$filename"/>
+ <xsl:if test="name(.) != ''">
+ <xsl:text> for </xsl:text>
+ <xsl:value-of select="name(.)"/>
+ </xsl:if>
+ </xsl:message>
+
+ <xsl:variable name="vendor" select="system-property('xsl:vendor')"/>
+
+ <xsl:choose>
+ <xsl:when test="contains($vendor, 'SAXON 6.2')">
+ <!-- Saxon 6.2.x uses xsl:document -->
+ <xsl:document href="{$filename}" method="{$method}" encoding="{$encoding}" indent="{$indent}" doctype-public="{$doctype-public}" doctype-system="{$doctype-system}" saxon:character-representation="{$saxon.character.representation}">
+ <xsl:copy-of select="$content"/>
+ </xsl:document>
+ </xsl:when>
+ <xsl:when test="contains($vendor, 'SAXON')">
+ <!-- Saxon uses saxon:output -->
+ <saxon:output file="{$filename}" href="{$filename}" method="{$method}" encoding="{$encoding}" indent="{$indent}" doctype-public="{$doctype-public}" doctype-system="{$doctype-system}" saxon:character-representation="{$saxon.character.representation}">
+ <xsl:copy-of select="$content"/>
+ </saxon:output>
+ </xsl:when>
+ <xsl:when test="contains($vendor, 'Apache')">
+ <!-- Xalan uses redirect -->
+ <redirect:write file="{$filename}">
+ <xsl:copy-of select="$content"/>
+ </redirect:write>
+ </xsl:when>
+ <xsl:otherwise>
+ <!-- it doesn't matter since we won't be making chunks... -->
+ <xsl:message terminate="yes">
+ <xsl:text>Can't make chunks with </xsl:text>
+ <xsl:value-of select="$vendor"/>
+ <xsl:text>'s processor.</xsl:text>
+ </xsl:message>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/onechunk.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/onechunk.xsl
new file mode 100644
index 0000000..15a04e1
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/onechunk.xsl
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="ASCII"?>
+<!--This file was created automatically by html2xhtml-->
+<!--from the HTML stylesheets.-->
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:doc="http://nwalsh.com/xsl/documentation/1.0" xmlns="http://www.w3.org/1999/xhtml" version="1.0" exclude-result-prefixes="doc">
+
+<!-- ********************************************************************
+ $Id: onechunk.xsl 6910 2007-06-28 23:23:30Z xmldoc $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<!-- ==================================================================== -->
+
+<xsl:import href="chunk.xsl"/>
+
+<!-- Ok, using the onechunk parameter makes this all work again. -->
+<!-- It does have the disadvantage that it only works for documents that have -->
+<!-- a root element that is considered a chunk by the chunk.xsl stylesheet. -->
+<!-- Ideally, onechunk would let anything be a chunk. But not today. -->
+
+<xsl:param name="onechunk" select="1"/>
+<xsl:param name="suppress.navigation">1</xsl:param>
+
+<xsl:template name="href.target.uri">
+ <xsl:param name="object" select="."/>
+ <xsl:text>#</xsl:text>
+ <xsl:call-template name="object.id">
+ <xsl:with-param name="object" select="$object"/>
+ </xsl:call-template>
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/param.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/param.xsl
new file mode 100644
index 0000000..e687d52
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/param.xsl
@@ -0,0 +1,436 @@
+<?xml version="1.0" encoding="ASCII"?>
+<!--This file was created automatically by html2xhtml-->
+<!--from the HTML stylesheets.-->
+<!-- This file is generated from param.xweb -->
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1999/xhtml" version="1.0">
+
+<!-- ********************************************************************
+ $Id: param.xweb 8552 2009-12-07 17:45:26Z bobstayton $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<xsl:param name="abstract.notitle.enabled" select="0"/>
+<xsl:param name="admon.graphics.extension">.png</xsl:param>
+<xsl:param name="admon.graphics" select="0"/>
+<xsl:param name="admon.graphics.path">images/</xsl:param>
+<xsl:param name="admon.style">
+ <xsl:value-of select="concat('margin-', $direction.align.start, ': 0.5in; margin-', $direction.align.end, ': 0.5in;')"/>
+</xsl:param>
+<xsl:param name="admon.textlabel" select="1"/>
+<xsl:param name="annotate.toc" select="1"/>
+<xsl:param name="annotation.css">
+/* ======================================================================
+ Annotations
+*/
+
+div.annotation-list { visibility: hidden;
+ }
+
+div.annotation-nocss { position: absolute;
+ visibility: hidden;
+ }
+
+div.annotation-popup { position: absolute;
+ z-index: 4;
+ visibility: hidden;
+ padding: 0px;
+ margin: 2px;
+ border-style: solid;
+ border-width: 1px;
+ width: 200px;
+ background-color: white;
+ }
+
+div.annotation-title { padding: 1px;
+ font-weight: bold;
+ border-bottom-style: solid;
+ border-bottom-width: 1px;
+ color: white;
+ background-color: black;
+ }
+
+div.annotation-body { padding: 2px;
+ }
+
+div.annotation-body p { margin-top: 0px;
+ padding-top: 0px;
+ }
+
+div.annotation-close { position: absolute;
+ top: 2px;
+ right: 2px;
+ }
+</xsl:param>
+<xsl:param name="annotation.graphic.close">
+http://docbook.sourceforge.net/release/images/annot-close.png</xsl:param>
+<xsl:param name="annotation.graphic.open">http://docbook.sourceforge.net/release/images/annot-open.png</xsl:param>
+
+<xsl:param name="annotation.js">
+<xsl:text>http://docbook.sourceforge.net/release/script/AnchorPosition.js http://docbook.sourceforge.net/release/script/PopupWindow.js</xsl:text></xsl:param>
+
+<xsl:param name="annotation.support" select="0"/>
+<xsl:param name="appendix.autolabel">A</xsl:param>
+<xsl:param name="author.othername.in.middle" select="1"/>
+<xsl:param name="autotoc.label.in.hyperlink" select="1"/>
+<xsl:param name="autotoc.label.separator">. </xsl:param>
+<xsl:param name="base.dir"/>
+<xsl:param name="biblioentry.item.separator">. </xsl:param>
+<xsl:param name="bibliography.collection">http://docbook.sourceforge.net/release/bibliography/bibliography.xml</xsl:param>
+
+<xsl:param name="bibliography.numbered" select="0"/>
+<xsl:param name="bibliography.style">normal</xsl:param>
+<xsl:param name="blurb.on.titlepage.enabled" select="0"/>
+<xsl:param name="bridgehead.in.toc" select="0"/>
+<xsl:param name="callout.defaultcolumn">60</xsl:param>
+<xsl:param name="callout.graphics.extension">.png</xsl:param>
+
+<xsl:param name="callout.graphics" select="1"/>
+<xsl:param name="callout.graphics.number.limit">15</xsl:param>
+
+<xsl:param name="callout.graphics.path">images/callouts/</xsl:param>
+<xsl:param name="callout.list.table" select="1"/>
+<xsl:param name="callout.unicode" select="0"/>
+<xsl:param name="callout.unicode.number.limit">10</xsl:param>
+<xsl:param name="callout.unicode.start.character">10102</xsl:param>
+<xsl:param name="callouts.extension" select="1"/>
+<xsl:param name="chapter.autolabel" select="1"/>
+<xsl:param name="chunk.append"/>
+<xsl:param name="chunk.first.sections" select="0"/>
+<xsl:param name="chunk.quietly" select="0"/>
+<xsl:param name="chunk.section.depth" select="1"/>
+<xsl:param name="chunk.separate.lots" select="0"/>
+<xsl:param name="chunk.toc"/>
+<xsl:param name="chunk.tocs.and.lots" select="0"/>
+<xsl:param name="chunk.tocs.and.lots.has.title" select="1"/>
+<xsl:param name="citerefentry.link" select="0"/>
+<xsl:param name="collect.xref.targets">no</xsl:param>
+<xsl:param name="component.label.includes.part.label" select="0"/>
+<xsl:param name="contrib.inline.enabled">1</xsl:param>
+<xsl:param name="css.decoration" select="0"/>
+<xsl:param name="current.docid"/>
+<xsl:param name="custom.css.source"/>
+<xsl:param name="default.float.class">
+ <xsl:choose>
+ <xsl:when test="contains($stylesheet.result.type,'html')">left</xsl:when>
+ <xsl:otherwise>before</xsl:otherwise>
+ </xsl:choose>
+</xsl:param>
+<xsl:param name="default.image.width"/>
+<xsl:param name="default.table.frame">all</xsl:param>
+<xsl:param name="default.table.width"/>
+<xsl:param name="docbook.css.link" select="1"/>
+<xsl:param name="docbook.css.source">docbook.css.xml</xsl:param>
+<xsl:param name="draft.mode">no</xsl:param>
+<xsl:param name="draft.watermark.image">images/draft.png</xsl:param>
+<xsl:param name="ebnf.assignment">
+<code>::=</code>
+</xsl:param>
+
+<xsl:param name="ebnf.statement.terminator"/>
+
+<xsl:param name="ebnf.table.bgcolor">#F5DCB3</xsl:param>
+<xsl:param name="ebnf.table.border" select="1"/>
+<xsl:param name="eclipse.autolabel" select="0"/>
+<xsl:param name="eclipse.plugin.id">com.example.help</xsl:param>
+<xsl:param name="eclipse.plugin.name">DocBook Online Help Sample</xsl:param>
+<xsl:param name="eclipse.plugin.provider">Example provider</xsl:param>
+<xsl:param name="editedby.enabled">1</xsl:param>
+<xsl:param name="email.delimiters.enabled" select="1"/>
+<xsl:param name="emphasis.propagates.style" select="1"/>
+<xsl:param name="entry.propagates.style" select="1"/>
+<xsl:param name="exsl.node.set.available">
+ <xsl:choose>
+ <xsl:when xmlns:exsl="http://exslt.org/common" exsl:foo="" test="function-available('exsl:node-set') or contains(system-property('xsl:vendor'), 'Apache Software Foundation')">1</xsl:when>
+ <xsl:otherwise>0</xsl:otherwise>
+ </xsl:choose>
+</xsl:param>
+<xsl:param name="firstterm.only.link" select="0"/>
+<xsl:param name="footer.rule" select="1"/>
+<xsl:param name="footnote.number.format">1</xsl:param>
+<xsl:param name="footnote.number.symbols"/>
+<xsl:param name="formal.procedures" select="1"/>
+<xsl:param name="formal.title.placement">
+figure before
+example before
+equation before
+table before
+procedure before
+task before
+</xsl:param>
+<xsl:param name="funcsynopsis.decoration" select="1"/>
+<xsl:param name="funcsynopsis.style">kr</xsl:param>
+<xsl:param name="function.parens" select="0"/>
+<xsl:param name="generate.css.header" select="0"/>
+<xsl:param name="generate.id.attributes" select="0"/>
+<xsl:param name="generate.index" select="1"/>
+<xsl:param name="generate.legalnotice.link" select="0"/>
+<xsl:param name="generate.manifest" select="0"/>
+<xsl:param name="generate.meta.abstract" select="1"/>
+<xsl:param name="generate.revhistory.link" select="0"/>
+<xsl:param name="generate.section.toc.level" select="0"/>
+<xsl:param name="generate.toc">
+appendix toc,title
+article/appendix nop
+article toc,title
+book toc,title,figure,table,example,equation
+chapter toc,title
+part toc,title
+preface toc,title
+qandadiv toc
+qandaset toc
+reference toc,title
+sect1 toc
+sect2 toc
+sect3 toc
+sect4 toc
+sect5 toc
+section toc
+set toc,title
+</xsl:param>
+
+<xsl:param name="glossary.collection"/>
+<xsl:param name="glossary.sort" select="0"/>
+<xsl:param name="glossentry.show.acronym">no</xsl:param>
+<xsl:param name="glossterm.auto.link" select="0"/>
+<xsl:param name="graphic.default.extension"/>
+<xsl:param name="graphicsize.extension" select="1"/>
+<xsl:param name="graphicsize.use.img.src.path" select="0"/>
+<xsl:param name="header.rule" select="1"/>
+<xsl:param name="highlight.default.language"/>
+<xsl:param name="highlight.source" select="0"/>
+<xsl:param name="highlight.xslthl.config"/>
+<xsl:param name="html.append"/>
+<xsl:param name="html.base"/>
+<xsl:param name="html.cellpadding"/>
+<xsl:param name="html.cellspacing"/>
+<xsl:param name="html.cleanup" select="1"/>
+<xsl:param name="html.ext">.html</xsl:param>
+<xsl:param name="html.extra.head.links" select="0"/>
+<xsl:param name="html.head.legalnotice.link.multiple" select="1"/>
+<xsl:param name="html.head.legalnotice.link.types">copyright</xsl:param>
+<xsl:param name="html.longdesc" select="0"/>
+<xsl:param name="html.longdesc.link" select="$html.longdesc"/>
+<xsl:param name="html.stylesheet"/>
+<xsl:param name="html.stylesheet.type">text/css</xsl:param>
+<xsl:param name="htmlhelp.alias.file">alias.h</xsl:param>
+<xsl:param name="htmlhelp.autolabel" select="0"/>
+<xsl:param name="htmlhelp.button.back" select="1"/>
+<xsl:param name="htmlhelp.button.forward" select="0"/>
+<xsl:param name="htmlhelp.button.hideshow" select="1"/>
+<xsl:param name="htmlhelp.button.home" select="0"/>
+<xsl:param name="htmlhelp.button.home.url"/>
+<xsl:param name="htmlhelp.button.jump1" select="0"/>
+<xsl:param name="htmlhelp.button.jump1.title">User1</xsl:param>
+<xsl:param name="htmlhelp.button.jump1.url"/>
+<xsl:param name="htmlhelp.button.jump2" select="0"/>
+<xsl:param name="htmlhelp.button.jump2.title">User2</xsl:param>
+<xsl:param name="htmlhelp.button.jump2.url"/>
+<xsl:param name="htmlhelp.button.locate" select="0"/>
+<xsl:param name="htmlhelp.button.next" select="1"/>
+<xsl:param name="htmlhelp.button.options" select="1"/>
+<xsl:param name="htmlhelp.button.prev" select="1"/>
+<xsl:param name="htmlhelp.button.print" select="1"/>
+<xsl:param name="htmlhelp.button.refresh" select="0"/>
+<xsl:param name="htmlhelp.button.stop" select="0"/>
+<xsl:param name="htmlhelp.button.zoom" select="0"/>
+<xsl:param name="htmlhelp.chm">htmlhelp.chm</xsl:param>
+<xsl:param name="htmlhelp.default.topic"/>
+<xsl:param name="htmlhelp.display.progress" select="1"/>
+<xsl:param name="htmlhelp.encoding">iso-8859-1</xsl:param>
+<xsl:param name="htmlhelp.enhanced.decompilation" select="0"/>
+<xsl:param name="htmlhelp.enumerate.images" select="0"/>
+<xsl:param name="htmlhelp.force.map.and.alias" select="0"/>
+<xsl:param name="htmlhelp.hhc.binary" select="1"/>
+<xsl:param name="htmlhelp.hhc.folders.instead.books" select="1"/>
+<xsl:param name="htmlhelp.hhc">toc.hhc</xsl:param>
+<xsl:param name="htmlhelp.hhc.section.depth">5</xsl:param>
+<xsl:param name="htmlhelp.hhc.show.root" select="1"/>
+<xsl:param name="htmlhelp.hhc.width"/>
+<xsl:param name="htmlhelp.hhk">index.hhk</xsl:param>
+<xsl:param name="htmlhelp.hhp">htmlhelp.hhp</xsl:param>
+<xsl:param name="htmlhelp.hhp.tail"/>
+<xsl:param name="htmlhelp.hhp.window">Main</xsl:param>
+<xsl:param name="htmlhelp.hhp.windows"/>
+<xsl:param name="htmlhelp.map.file">context.h</xsl:param>
+<xsl:param name="htmlhelp.only" select="0"/>
+<xsl:param name="htmlhelp.remember.window.position" select="0"/>
+<xsl:param name="htmlhelp.show.advanced.search" select="0"/>
+<xsl:param name="htmlhelp.show.favorities" select="0"/>
+<xsl:param name="htmlhelp.show.menu" select="0"/>
+<xsl:param name="htmlhelp.show.toolbar.text" select="1"/>
+<xsl:param name="htmlhelp.title"/>
+<xsl:param name="htmlhelp.use.hhk" select="0"/>
+<xsl:param name="htmlhelp.window.geometry"/>
+<xsl:param name="id.warnings" select="0"/>
+<xsl:param name="ignore.image.scaling" select="0"/>
+<xsl:param name="img.src.path"/>
+<xsl:param name="index.links.to.section" select="1"/>
+<xsl:param name="index.method">basic</xsl:param>
+<xsl:param name="index.number.separator"/>
+<xsl:param name="index.on.role" select="0"/>
+<xsl:param name="index.on.type" select="0"/>
+<xsl:param name="index.prefer.titleabbrev" select="0"/>
+<xsl:param name="index.range.separator"/>
+<xsl:param name="index.term.separator"/>
+<xsl:param name="inherit.keywords" select="1"/>
+<xsl:param name="insert.olink.page.number">no</xsl:param>
+<xsl:param name="insert.olink.pdf.frag" select="0"/>
+<xsl:param name="insert.xref.page.number">no</xsl:param>
+<xsl:param name="javahelp.encoding">iso-8859-1</xsl:param>
+<xsl:param name="keep.relative.image.uris" select="1"/>
+
+<xsl:param name="l10n.gentext.default.language">en</xsl:param>
+<xsl:param name="l10n.gentext.language"/>
+<xsl:param name="l10n.gentext.use.xref.language" select="0"/>
+<xsl:param name="l10n.lang.value.rfc.compliant" select="1"/>
+<xsl:param name="label.from.part" select="0"/>
+<xsl:param name="linenumbering.everyNth">5</xsl:param>
+<xsl:param name="linenumbering.extension" select="1"/>
+<xsl:param name="linenumbering.separator"><xsl:text> </xsl:text></xsl:param>
+<xsl:param name="linenumbering.width">3</xsl:param>
+<xsl:param name="link.mailto.url"/>
+<xsl:param name="make.clean.html" select="0"/>
+<xsl:param name="make.graphic.viewport" select="1"/>
+<xsl:param name="make.single.year.ranges" select="0"/>
+<xsl:param name="make.valid.html" select="1"/>
+<xsl:param name="make.year.ranges" select="0"/>
+ <xsl:param name="manifest">HTML.manifest</xsl:param>
+
+<xsl:param name="manifest.in.base.dir" select="0"/>
+<xsl:param name="manual.toc"/>
+<xsl:param name="menuchoice.menu.separator"> &#8594; </xsl:param>
+<xsl:param name="menuchoice.separator">+</xsl:param>
+<xsl:param name="navig.graphics.extension">.gif</xsl:param>
+<xsl:param name="navig.graphics" select="0"/>
+<xsl:param name="navig.graphics.path">images/</xsl:param>
+<xsl:param name="navig.showtitles">1</xsl:param>
+<xsl:param name="nominal.image.depth" select="4 * $pixels.per.inch"/>
+<xsl:param name="nominal.image.width" select="6 * $pixels.per.inch"/>
+<xsl:param name="nominal.table.width">6in</xsl:param>
+<xsl:param name="olink.base.uri"/>
+<xsl:param name="olink.debug" select="0"/>
+<xsl:param name="olink.doctitle">no</xsl:param>
+<xsl:param name="olink.fragid">fragid=</xsl:param>
+<xsl:param name="olink.lang.fallback.sequence"/>
+<xsl:param name="olink.outline.ext">.olink</xsl:param>
+<xsl:attribute-set name="olink.properties">
+ <xsl:attribute name="show-destination">replace</xsl:attribute>
+</xsl:attribute-set>
+<xsl:param name="olink.pubid">pubid</xsl:param>
+ <xsl:param name="olink.resolver">/cgi-bin/olink</xsl:param>
+<xsl:param name="olink.sysid">sysid</xsl:param>
+<xsl:param name="othercredit.like.author.enabled">0</xsl:param>
+<xsl:param name="para.propagates.style" select="1"/>
+<xsl:param name="part.autolabel">I</xsl:param>
+<xsl:param name="phrase.propagates.style" select="1"/>
+<xsl:param name="pixels.per.inch">90</xsl:param>
+<xsl:param name="points.per.em">10</xsl:param>
+<xsl:param name="preface.autolabel" select="0"/>
+<xsl:param name="prefer.internal.olink" select="0"/>
+<xsl:param name="preferred.mediaobject.role"/>
+<xsl:param name="process.empty.source.toc" select="0"/>
+<xsl:param name="process.source.toc" select="0"/>
+<xsl:param name="profile.arch"/>
+<xsl:param name="profile.attribute"/>
+<xsl:param name="profile.audience"/>
+<xsl:param name="profile.condition"/>
+<xsl:param name="profile.conformance"/>
+<xsl:param name="profile.lang"/>
+<xsl:param name="profile.os"/>
+<xsl:param name="profile.revision"/>
+<xsl:param name="profile.revisionflag"/>
+<xsl:param name="profile.role"/>
+<xsl:param name="profile.security"/>
+<xsl:param name="profile.separator">;</xsl:param>
+<xsl:param name="profile.status"/>
+<xsl:param name="profile.userlevel"/>
+<xsl:param name="profile.value"/>
+<xsl:param name="profile.vendor"/>
+<xsl:param name="profile.wordsize"/>
+<xsl:param name="punct.honorific">.</xsl:param>
+<xsl:param name="qanda.defaultlabel">number</xsl:param>
+<xsl:param name="qanda.in.toc" select="0"/>
+<xsl:param name="qanda.inherit.numeration" select="1"/>
+<xsl:param name="qanda.nested.in.toc" select="0"/>
+<xsl:param name="qandadiv.autolabel" select="1"/>
+<xsl:param name="refclass.suppress" select="0"/>
+<xsl:param name="refentry.generate.name" select="1"/>
+<xsl:param name="refentry.generate.title" select="0"/>
+<xsl:param name="refentry.separator" select="1"/>
+<xsl:param name="refentry.xref.manvolnum" select="1"/>
+ <xsl:param name="reference.autolabel">I</xsl:param>
+<xsl:param name="root.filename">index</xsl:param>
+<xsl:param name="rootid"/>
+<xsl:param name="runinhead.default.title.end.punct">.</xsl:param>
+<xsl:param name="runinhead.title.end.punct">.!?:</xsl:param>
+<xsl:param name="section.autolabel" select="0"/>
+<xsl:param name="section.autolabel.max.depth">8</xsl:param>
+<xsl:param name="section.label.includes.component.label" select="0"/>
+<xsl:param name="segmentedlist.as.table" select="0"/>
+<xsl:param name="shade.verbatim" select="0"/>
+<xsl:attribute-set name="shade.verbatim.style">
+ <xsl:attribute name="border">0</xsl:attribute>
+ <xsl:attribute name="style"><xsl:text>background-color: </xsl:text>#E0E0E0</xsl:attribute>
+</xsl:attribute-set>
+
+<xsl:param name="show.comments" select="1"/>
+<xsl:param name="show.revisionflag" select="0"/>
+<xsl:param name="simplesect.in.toc" select="0"/>
+<xsl:param name="spacing.paras" select="0"/>
+<xsl:param name="suppress.footer.navigation">0</xsl:param>
+<xsl:param name="suppress.header.navigation" select="0"/>
+<xsl:param name="suppress.navigation" select="0"/>
+<xsl:param name="table.borders.with.css" select="0"/>
+<xsl:param name="table.cell.border.color"/>
+
+<xsl:param name="table.cell.border.style">solid</xsl:param>
+<xsl:param name="table.cell.border.thickness">0.5pt</xsl:param>
+<xsl:param name="table.footnote.number.format">a</xsl:param>
+<xsl:param name="table.footnote.number.symbols"/>
+<xsl:param name="table.frame.border.color"/>
+
+<xsl:param name="table.frame.border.style">solid</xsl:param>
+<xsl:param name="table.frame.border.thickness">0.5pt</xsl:param>
+<xsl:param name="tablecolumns.extension" select="1"/>
+ <xsl:param name="target.database.document">olinkdb.xml</xsl:param>
+<xsl:param name="targets.filename">target.db</xsl:param>
+<xsl:param name="tex.math.delims" select="1"/>
+<xsl:param name="tex.math.file">tex-math-equations.tex</xsl:param>
+<xsl:param name="tex.math.in.alt"/>
+<xsl:param name="textdata.default.encoding"/>
+ <xsl:param name="textinsert.extension" select="1"/>
+<xsl:param name="toc.list.type">dl</xsl:param>
+<xsl:param name="toc.max.depth">8</xsl:param>
+<xsl:param name="toc.section.depth">2</xsl:param>
+<xsl:param name="ulink.target"/>
+<xsl:param name="use.embed.for.svg" select="0"/>
+<xsl:param name="use.extensions" select="0"/>
+<xsl:param name="use.id.as.filename" select="0"/>
+<xsl:param name="use.local.olink.style" select="0"/>
+<xsl:param name="use.role.as.xrefstyle" select="1"/>
+<xsl:param name="use.role.for.mediaobject" select="1"/>
+<xsl:param name="use.svg" select="1"/>
+<xsl:param name="variablelist.as.table" select="0"/>
+<xsl:param name="variablelist.term.break.after">0</xsl:param>
+<xsl:param name="variablelist.term.separator">, </xsl:param>
+<xsl:param name="writing.mode">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key">writing-mode</xsl:with-param>
+ <xsl:with-param name="lang">
+ <xsl:call-template name="l10n.language">
+ <xsl:with-param name="target" select="/*[1]"/>
+ </xsl:call-template>
+ </xsl:with-param>
+ </xsl:call-template>
+</xsl:param>
+<xsl:param name="xref.label-page.separator"><xsl:text> </xsl:text></xsl:param>
+<xsl:param name="xref.label-title.separator">: </xsl:param>
+<xsl:param name="xref.title-page.separator"><xsl:text> </xsl:text></xsl:param>
+<xsl:param name="xref.with.number.and.title" select="1"/>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/pi.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/pi.xsl
new file mode 100644
index 0000000..28f9efe
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/pi.xsl
@@ -0,0 +1,1203 @@
+<?xml version="1.0" encoding="ASCII"?>
+<!--This file was created automatically by html2xhtml-->
+<!--from the HTML stylesheets.-->
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:doc="http://nwalsh.com/xsl/documentation/1.0" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/1999/xhtml" exclude-result-prefixes="doc" version="1.0">
+
+<!-- ********************************************************************
+ $Id: pi.xsl 8394 2009-04-02 20:31:30Z mzjn $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<doc:reference xmlns=""><info xmlns="http://www.w3.org/1999/xhtml"><title>HTML Processing Instruction Reference</title>
+ <releaseinfo role="meta">
+ $Id: pi.xsl 8394 2009-04-02 20:31:30Z mzjn $
+ </releaseinfo>
+ </info>
+ <partintro xmlns="http://www.w3.org/1999/xhtml" xml:id="partintro">
+ <title>Introduction</title>
+ <para>This is generated reference documentation for all
+ user-specifiable processing instructions (PIs) in the DocBook
+ XSL stylesheets for HTML output.
+ <note>
+ <para>You add these PIs at particular points in a document to
+ cause specific &#8220;exceptions&#8221; to formatting/output behavior. To
+ make global changes in formatting/output behavior across an
+ entire document, it&#8217;s better to do it by setting an
+ appropriate stylesheet parameter (if there is one).</para>
+ </note>
+ </para>
+ </partintro>
+</doc:reference>
+
+<!-- ==================================================================== -->
+
+<doc:pi xmlns="" name="dbhtml_background-color">
+ <refpurpose xmlns="http://www.w3.org/1999/xhtml">Sets background color for an image</refpurpose>
+ <refdescription xmlns="http://www.w3.org/1999/xhtml">
+ <para>Use the <tag class="xmlpi">dbhtml background-color</tag> PI before or
+ after an image (<tag>graphic</tag>, <tag>inlinegraphic</tag>,
+ <tag>imagedata</tag>, or <tag>videodata</tag> element) as a
+ sibling to the element, to set a background color for the
+ image.</para>
+ </refdescription>
+ <refsynopsisdiv xmlns="http://www.w3.org/1999/xhtml">
+ <synopsis><tag class="xmlpi">dbhtml background-color="<replaceable>color</replaceable>"</tag></synopsis>
+ </refsynopsisdiv>
+ <refparameter xmlns="http://www.w3.org/1999/xhtml">
+ <variablelist>
+ <varlistentry><term>background-color="<replaceable>color</replaceable>"</term>
+ <listitem>
+ <para>An HTML color value</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+ <refsee xmlns="http://www.w3.org/1999/xhtml" role="tcg">
+ <para><link role="tcg" xlink:href="BGcolor.html">Background color</link></para>
+ </refsee>
+</doc:pi>
+<xsl:template name="pi.dbhtml_background-color">
+ <xsl:param name="node" select="."/>
+ <xsl:call-template name="dbhtml-attribute">
+ <xsl:with-param name="pis" select="$node/processing-instruction('dbhtml')"/>
+ <xsl:with-param name="attribute" select="'background-color'"/>
+ </xsl:call-template>
+</xsl:template>
+
+<doc:pi xmlns="" name="dbhtml_bgcolor">
+ <refpurpose xmlns="http://www.w3.org/1999/xhtml">Sets background color on a CALS table row or table cell</refpurpose>
+ <refdescription xmlns="http://www.w3.org/1999/xhtml">
+ <para>Use the <tag class="xmlpi">dbhtml bgcolor</tag> PI as child of a CALS table row
+ or cell to set a background color for that table row or cell.</para>
+ </refdescription>
+ <refsynopsisdiv xmlns="http://www.w3.org/1999/xhtml">
+ <synopsis><tag class="xmlpi">dbhtml bgcolor="<replaceable>color</replaceable>"</tag></synopsis>
+ </refsynopsisdiv>
+ <refparameter xmlns="http://www.w3.org/1999/xhtml">
+ <variablelist>
+ <varlistentry><term>bgcolor="<replaceable>color</replaceable>"</term>
+ <listitem>
+ <para>An HTML color value</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+ <refsee xmlns="http://www.w3.org/1999/xhtml" role="tcg">
+ <para><link role="tcg" xlink:href="BGtableColor.html#CellBGColor">Cell background color</link></para>
+ </refsee>
+</doc:pi>
+<xsl:template name="pi.dbhtml_bgcolor">
+ <xsl:param name="node" select="."/>
+ <xsl:call-template name="dbhtml-attribute">
+ <xsl:with-param name="pis" select="$node/processing-instruction('dbhtml')"/>
+ <xsl:with-param name="attribute" select="'bgcolor'"/>
+ </xsl:call-template>
+</xsl:template>
+
+<doc:pi xmlns="" name="dbhtml_cellpadding">
+ <refpurpose xmlns="http://www.w3.org/1999/xhtml">Specifies cellpadding in CALS table or qandaset output</refpurpose>
+ <refdescription xmlns="http://www.w3.org/1999/xhtml">
+ <para>Use the <tag class="xmlpi">dbhtml cellpadding</tag> PI as a child of a
+ CALS <tag>table</tag> or <tag>qandaset</tag> to specify the value
+ for the HTML <literal>cellpadding</literal> attribute in the
+ output HTML table.</para>
+ </refdescription>
+ <refsynopsisdiv xmlns="http://www.w3.org/1999/xhtml">
+ <synopsis><tag class="xmlpi">dbhtml cellpadding="<replaceable>number</replaceable>"</tag></synopsis>
+ </refsynopsisdiv>
+ <refparameter xmlns="http://www.w3.org/1999/xhtml">
+ <variablelist>
+ <varlistentry><term>cellpadding="<replaceable>number</replaceable>"</term>
+ <listitem>
+ <para>Specifies the cellpadding</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+ <refsee xmlns="http://www.w3.org/1999/xhtml" role="params">
+ <para><parameter>html.cellpadding</parameter></para>
+ </refsee>
+ <refsee xmlns="http://www.w3.org/1999/xhtml" role="tcg">
+ <para><link role="tcg" xlink:href="CellSpacing.html">Cell spacing and cell padding</link>,
+ <link role="tcg" xlink:href="QandAformat.html">Q and A formatting</link></para>
+ </refsee>
+</doc:pi>
+<xsl:template name="pi.dbhtml_cellpadding">
+ <xsl:param name="node" select="."/>
+ <xsl:call-template name="dbhtml-attribute">
+ <xsl:with-param name="pis" select="$node/processing-instruction('dbhtml')"/>
+ <xsl:with-param name="attribute" select="'cellpadding'"/>
+ </xsl:call-template>
+</xsl:template>
+
+<doc:pi xmlns="" name="dbhtml_cellspacing">
+ <refpurpose xmlns="http://www.w3.org/1999/xhtml">Specifies cellspacing in CALS table or qandaset output</refpurpose>
+ <refdescription xmlns="http://www.w3.org/1999/xhtml">
+ <para>Use the <tag class="xmlpi">dbhtml cellspacing</tag> PI as a child of a
+ CALS <tag>table</tag> or <tag>qandaset</tag> to specify the value
+ for the HTML <literal>cellspacing</literal> attribute in the
+ output HTML table.</para>
+ </refdescription>
+ <refsynopsisdiv xmlns="http://www.w3.org/1999/xhtml">
+ <synopsis><tag class="xmlpi">dbhtml cellspacing="<replaceable>number</replaceable>"</tag></synopsis>
+ </refsynopsisdiv>
+ <refparameter xmlns="http://www.w3.org/1999/xhtml">
+ <variablelist>
+ <varlistentry><term>cellspacing="<replaceable>number</replaceable>"</term>
+ <listitem>
+ <para>Specifies the cellspacing</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+ <refsee xmlns="http://www.w3.org/1999/xhtml" role="params">
+ <para><parameter>html.cellspacing</parameter></para>
+ </refsee>
+ <refsee xmlns="http://www.w3.org/1999/xhtml" role="tcg">
+ <para><link role="tcg" xlink:href="CellSpacing.html">Cell spacing and cell padding</link>,
+ <link role="tcg" xlink:href="QandAformat.html">Q and A formatting</link></para>
+ </refsee>
+</doc:pi>
+<xsl:template name="pi.dbhtml_cellspacing">
+ <xsl:param name="node" select="."/>
+ <xsl:call-template name="dbhtml-attribute">
+ <xsl:with-param name="pis" select="$node/processing-instruction('dbhtml')"/>
+ <xsl:with-param name="attribute" select="'cellspacing'"/>
+ </xsl:call-template>
+</xsl:template>
+
+<doc:pi xmlns="" name="dbhtml_class">
+ <refpurpose xmlns="http://www.w3.org/1999/xhtml">Set value of the class attribute for a CALS table row</refpurpose>
+ <refdescription xmlns="http://www.w3.org/1999/xhtml">
+ <para>Use the <tag class="xmlpi">dbhtml class</tag> PI as a child of a
+ <tag>row</tag> to specify a <literal>class</literal>
+ attribute and value in the HTML output for that row.</para>
+ </refdescription>
+ <refsynopsisdiv xmlns="http://www.w3.org/1999/xhtml">
+ <synopsis><tag class="xmlpi">dbhtml class="<replaceable>name</replaceable>"</tag></synopsis>
+ </refsynopsisdiv>
+ <refparameter xmlns="http://www.w3.org/1999/xhtml">
+ <variablelist>
+ <varlistentry><term>class="<replaceable>name</replaceable>"</term>
+ <listitem>
+ <para>Specifies the class name</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+ <refsee xmlns="http://www.w3.org/1999/xhtml" role="tcg">
+ <para><link role="tcg" xlink:href="CSSTableCells.html">Table styles in HTML output</link></para>
+ </refsee>
+</doc:pi>
+<xsl:template name="pi.dbhtml_class">
+ <xsl:param name="node" select="."/>
+ <xsl:call-template name="dbhtml-attribute">
+ <xsl:with-param name="pis" select="$node/processing-instruction('dbhtml')"/>
+ <xsl:with-param name="attribute" select="'class'"/>
+ </xsl:call-template>
+</xsl:template>
+
+<doc:pi xmlns="" name="dbhtml_dir">
+ <refpurpose xmlns="http://www.w3.org/1999/xhtml">Specifies a directory name in which to write files</refpurpose>
+ <refdescription xmlns="http://www.w3.org/1999/xhtml">
+ <para>When chunking output, use the <tag class="xmlpi">dbhtml dir</tag> PI
+ as a child of a chunk source to cause the output of that
+ chunk to be written to the specified directory; also, use it
+ as a child of a <tag>mediaobject</tag> to specify a
+ directory into which any long-description files for that
+ <tag>mediaobject</tag> will be written.</para>
+ </refdescription>
+ <refsynopsisdiv xmlns="http://www.w3.org/1999/xhtml">
+ <synopsis><tag class="xmlpi">dbhtml dir="<replaceable>path</replaceable>"</tag></synopsis>
+ </refsynopsisdiv>
+ <refparameter xmlns="http://www.w3.org/1999/xhtml">
+ <variablelist>
+ <varlistentry><term>dir="<replaceable>path</replaceable>"</term>
+ <listitem>
+ <para>Specifies the pathname for the directory</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+ <refsee xmlns="http://www.w3.org/1999/xhtml" role="params">
+ <para><parameter>base.dir</parameter></para>
+ </refsee>
+ <refsee xmlns="http://www.w3.org/1999/xhtml" role="tcg">
+ <para><link role="tcg" xlink:href="Chunking.html#dbhtmlDirPI">dbhtml dir processing instruction</link></para>
+ </refsee>
+</doc:pi>
+<xsl:template name="pi.dbhtml_dir">
+ <xsl:param name="node" select="."/>
+ <xsl:call-template name="dbhtml-attribute">
+ <xsl:with-param name="pis" select="$node/processing-instruction('dbhtml')"/>
+ <xsl:with-param name="attribute" select="'dir'"/>
+ </xsl:call-template>
+</xsl:template>
+
+<doc:pi xmlns="" name="dbhtml_filename">
+ <refpurpose xmlns="http://www.w3.org/1999/xhtml">Specifies a filename for a chunk</refpurpose>
+ <refdescription xmlns="http://www.w3.org/1999/xhtml">
+ <para>When chunking output, use the <tag class="xmlpi">dbhtml filename</tag>
+ PI as a child of a chunk source to specify a filename for
+ the output file for that chunk.</para>
+ </refdescription>
+ <refsynopsisdiv xmlns="http://www.w3.org/1999/xhtml">
+ <synopsis><tag class="xmlpi">dbhtml filename="<replaceable>filename</replaceable>"</tag></synopsis>
+ </refsynopsisdiv>
+ <refparameter xmlns="http://www.w3.org/1999/xhtml">
+ <variablelist>
+ <varlistentry><term>filename="<replaceable>path</replaceable>"</term>
+ <listitem>
+ <para>Specifies the filename for the file</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+ <refsee xmlns="http://www.w3.org/1999/xhtml" role="params">
+ <para><parameter>use.id.as.filename</parameter></para>
+ </refsee>
+ <refsee xmlns="http://www.w3.org/1999/xhtml" role="tcg">
+ <para><link role="tcg" xlink:href="Chunking.html#DbhtmlFilenames">dbhtml filenames</link></para>
+ </refsee>
+</doc:pi>
+<xsl:template name="pi.dbhtml_filename">
+ <xsl:param name="node" select="."/>
+ <xsl:call-template name="dbhtml-attribute">
+ <xsl:with-param name="pis" select="$node/processing-instruction('dbhtml')"/>
+ <xsl:with-param name="attribute" select="'filename'"/>
+ </xsl:call-template>
+</xsl:template>
+
+<doc:pi xmlns="" name="dbhtml_funcsynopsis-style">
+ <refpurpose xmlns="http://www.w3.org/1999/xhtml">Specifies presentation style for a funcsynopsis</refpurpose>
+ <refdescription xmlns="http://www.w3.org/1999/xhtml">
+ <para>Use the <tag class="xmlpi">dbhtml funcsynopsis-style</tag> PI as a child of
+ a <tag>funcsynopsis</tag> or anywhere within a funcsynopsis
+ to control the presentation style for output of all
+ <tag>funcprototype</tag> instances within that funcsynopsis.</para>
+ </refdescription>
+ <refsynopsisdiv xmlns="http://www.w3.org/1999/xhtml">
+ <synopsis><tag class="xmlpi">dbhtml funcsynopsis-style="kr"|"ansi"</tag></synopsis>
+ </refsynopsisdiv>
+ <refparameter xmlns="http://www.w3.org/1999/xhtml">
+ <variablelist>
+ <varlistentry><term>funcsynopsis-style="kr"</term>
+ <listitem>
+ <para>Displays <tag>funcprototype</tag> output in K&amp;R style</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry><term>funcsynopsis-style="ansi"</term>
+ <listitem>
+ <para>Displays <tag>funcprototype</tag> output in ANSI style</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+ <refsee xmlns="http://www.w3.org/1999/xhtml" role="params">
+ <para><parameter>funcsynopsis.style</parameter></para>
+ </refsee>
+</doc:pi>
+<xsl:template name="pi.dbhtml_funcsynopsis-style">
+ <xsl:param name="node" select="."/>
+ <xsl:call-template name="dbhtml-attribute">
+ <xsl:with-param name="pis" select="$node/processing-instruction('dbhtml')"/>
+ <xsl:with-param name="attribute" select="'funcsynopsis-style'"/>
+ </xsl:call-template>
+</xsl:template>
+
+<doc:pi xmlns="" name="dbhtml_img.src.path">
+ <refpurpose xmlns="http://www.w3.org/1999/xhtml">Specifies a path to the location of an image file</refpurpose>
+ <refdescription xmlns="http://www.w3.org/1999/xhtml">
+ <para>Use the <tag class="xmlpi">dbhtml img.src.path</tag> PI before or
+ after an image (<tag>graphic</tag>,
+ <tag>inlinegraphic</tag>, <tag>imagedata</tag>, or
+ <tag>videodata</tag> element) as a sibling to the element,
+ to specify a path to the location of the image; in HTML
+ output, the value specified for the
+ <code>img.src.path</code> attribute is prepended to the
+ filename.</para>
+ </refdescription>
+ <refsynopsisdiv xmlns="http://www.w3.org/1999/xhtml">
+ <synopsis><tag class="xmlpi">dbhtml img.src.path="<replaceable>path</replaceable>"</tag></synopsis>
+ </refsynopsisdiv>
+ <refparameter xmlns="http://www.w3.org/1999/xhtml">
+ <variablelist>
+ <varlistentry><term>img.src.path="<replaceable>path</replaceable>"</term>
+ <listitem>
+ <para>Specifies the pathname to prepend to the name of the image file</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+ <refsee xmlns="http://www.w3.org/1999/xhtml" role="params">
+ <para><parameter>img.src.path</parameter></para>
+ </refsee>
+ <refsee xmlns="http://www.w3.org/1999/xhtml" role="tcg">
+ <para><link role="tcg" xlink:href="GraphicsLocations.html#UsingFileref">Using fileref</link></para>
+ </refsee>
+</doc:pi>
+<xsl:template name="pi.dbhtml_img.src.path">
+ <xsl:param name="node" select="."/>
+ <xsl:call-template name="dbhtml-attribute">
+ <xsl:with-param name="pis" select="$node/processing-instruction('dbhtml')"/>
+ <xsl:with-param name="attribute" select="'img.src.path'"/>
+ </xsl:call-template>
+</xsl:template>
+
+<doc:pi xmlns="" name="dbhtml_label-width">
+ <refpurpose xmlns="http://www.w3.org/1999/xhtml">Specifies the label width for a qandaset</refpurpose>
+ <refdescription xmlns="http://www.w3.org/1999/xhtml">
+ <para>Use the <tag class="xmlpi">dbhtml label-width</tag> PI as a child of a
+ <tag>qandaset</tag> to specify the width of labels.</para>
+ </refdescription>
+ <refsynopsisdiv xmlns="http://www.w3.org/1999/xhtml">
+ <synopsis><tag class="xmlpi">dbhtml label-width="<replaceable>width</replaceable>"</tag></synopsis>
+ </refsynopsisdiv>
+ <refparameter xmlns="http://www.w3.org/1999/xhtml">
+ <variablelist>
+ <varlistentry><term>label-width="<replaceable>width</replaceable>"</term>
+ <listitem>
+ <para>Specifies the label width (including units)</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+ <refsee xmlns="http://www.w3.org/1999/xhtml" role="tcg">
+ <para><link role="tcg" xlink:href="QandAformat.html">Q and A formatting</link></para>
+ </refsee>
+</doc:pi>
+<xsl:template name="pi.dbhtml_label-width">
+ <xsl:param name="node" select="."/>
+ <xsl:call-template name="dbhtml-attribute">
+ <xsl:with-param name="pis" select="$node/processing-instruction('dbhtml')"/>
+ <xsl:with-param name="attribute" select="'label-width'"/>
+ </xsl:call-template>
+</xsl:template>
+
+<doc:pi xmlns="" name="dbhtml_linenumbering.everyNth">
+ <refpurpose xmlns="http://www.w3.org/1999/xhtml">Specifies interval for line numbers in verbatims</refpurpose>
+ <refdescription xmlns="http://www.w3.org/1999/xhtml">
+ <para>Use the <tag class="xmlpi">dbhtml linenumbering.everyNth</tag> PI as a child
+ of a &#8220;verbatim&#8221; element &#8211; <tag>programlisting</tag>,
+ <tag>screen</tag>, <tag>synopsis</tag> &#8212; to specify
+ the interval at which lines are numbered.</para>
+ </refdescription>
+ <refsynopsisdiv xmlns="http://www.w3.org/1999/xhtml">
+ <synopsis><tag class="xmlpi">dbhtml linenumbering.everyNth="<replaceable>N</replaceable>"</tag></synopsis>
+ </refsynopsisdiv>
+ <refparameter xmlns="http://www.w3.org/1999/xhtml">
+ <variablelist>
+ <varlistentry><term>linenumbering.everyNth="<replaceable>N</replaceable>"</term>
+ <listitem>
+ <para>Specifies numbering interval; a number is output
+ before every <replaceable>N</replaceable>th line</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+ <refsee xmlns="http://www.w3.org/1999/xhtml" role="params">
+ <para><parameter>linenumbering.everyNth</parameter></para>
+ </refsee>
+ <refsee xmlns="http://www.w3.org/1999/xhtml" role="tcg">
+ <para><link role="tcg" xlink:href="AnnotateListing.html#LineNumbering">Line numbering</link></para>
+ </refsee>
+</doc:pi>
+<xsl:template name="pi.dbhtml_linenumbering.everyNth">
+ <xsl:param name="node" select="."/>
+ <xsl:call-template name="dbhtml-attribute">
+ <xsl:with-param name="pis" select="$node/processing-instruction('dbhtml')"/>
+ <xsl:with-param name="attribute" select="'linenumbering.everyNth'"/>
+ </xsl:call-template>
+</xsl:template>
+
+<doc:pi xmlns="" name="dbhtml_linenumbering.separator">
+ <refpurpose xmlns="http://www.w3.org/1999/xhtml">Specifies separator text for line numbers in verbatims</refpurpose>
+ <refdescription xmlns="http://www.w3.org/1999/xhtml">
+ <para>Use the <tag class="xmlpi">dbhtml linenumbering.separator</tag> PI as a child
+ of a &#8220;verbatim&#8221; element &#8211; <tag>programlisting</tag>,
+ <tag>screen</tag>, <tag>synopsis</tag> &#8212; to specify
+ the separator text output between the line numbers and content.</para>
+ </refdescription>
+ <refsynopsisdiv xmlns="http://www.w3.org/1999/xhtml">
+ <synopsis><tag class="xmlpi">dbhtml linenumbering.separator="<replaceable>text</replaceable>"</tag></synopsis>
+ </refsynopsisdiv>
+ <refparameter xmlns="http://www.w3.org/1999/xhtml">
+ <variablelist>
+ <varlistentry><term>linenumbering.separator="<replaceable>text</replaceable>"</term>
+ <listitem>
+ <para>Specifies the text (zero or more characters)</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+ <refsee xmlns="http://www.w3.org/1999/xhtml" role="params">
+ <para><parameter>linenumbering.separator</parameter></para>
+ </refsee>
+ <refsee xmlns="http://www.w3.org/1999/xhtml" role="tcg">
+ <para><link role="tcg" xlink:href="AnnotateListing.html#LineNumbering">Line numbering</link></para>
+ </refsee>
+</doc:pi>
+<xsl:template name="pi.dbhtml_linenumbering.separator">
+ <xsl:param name="node" select="."/>
+ <xsl:call-template name="dbhtml-attribute">
+ <xsl:with-param name="pis" select="$node/processing-instruction('dbhtml')"/>
+ <xsl:with-param name="attribute" select="'linenumbering.separator'"/>
+ </xsl:call-template>
+</xsl:template>
+
+<doc:pi xmlns="" name="dbhtml_linenumbering.width">
+ <refpurpose xmlns="http://www.w3.org/1999/xhtml">Specifies width for line numbers in verbatims</refpurpose>
+ <refdescription xmlns="http://www.w3.org/1999/xhtml">
+ <para>Use the <tag class="xmlpi">dbhtml linenumbering.width</tag> PI as a child
+ of a &#8220;verbatim&#8221; element &#8211; <tag>programlisting</tag>,
+ <tag>screen</tag>, <tag>synopsis</tag> &#8212; to specify
+ the width set aside for line numbers.</para>
+ </refdescription>
+ <refsynopsisdiv xmlns="http://www.w3.org/1999/xhtml">
+ <synopsis><tag class="xmlpi">dbhtml linenumbering.width="<replaceable>width</replaceable>"</tag></synopsis>
+ </refsynopsisdiv>
+ <refparameter xmlns="http://www.w3.org/1999/xhtml">
+ <variablelist>
+ <varlistentry><term>linenumbering.width="<replaceable>width</replaceable>"</term>
+ <listitem>
+ <para>Specifies the width (inluding units)</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+ <refsee xmlns="http://www.w3.org/1999/xhtml" role="params">
+ <para><parameter>linenumbering.width</parameter></para>
+ </refsee>
+ <refsee xmlns="http://www.w3.org/1999/xhtml" role="tcg">
+ <para><link role="tcg" xlink:href="AnnotateListing.html#LineNumbering">Line numbering</link></para>
+ </refsee>
+</doc:pi>
+<xsl:template name="pi.dbhtml_linenumbering.width">
+ <xsl:param name="node" select="."/>
+ <xsl:call-template name="dbhtml-attribute">
+ <xsl:with-param name="pis" select="$node/processing-instruction('dbhtml')"/>
+ <xsl:with-param name="attribute" select="'linenumbering.width'"/>
+ </xsl:call-template>
+</xsl:template>
+
+<doc:pi xmlns="" name="dbhtml_list-presentation">
+ <refpurpose xmlns="http://www.w3.org/1999/xhtml">Specifies presentation style for a variablelist or
+ segmentedlist</refpurpose>
+ <refdescription xmlns="http://www.w3.org/1999/xhtml">
+ <para>Use the <tag class="xmlpi">dbhtml list-presentation</tag> PI as a child of
+ a <tag>variablelist</tag> or <tag>segmentedlist</tag> to
+ control the presentation style for the list (to cause it, for
+ example, to be displayed as a table).</para>
+ </refdescription>
+ <refsynopsisdiv xmlns="http://www.w3.org/1999/xhtml">
+ <synopsis><tag class="xmlpi">dbhtml list-presentation="list"|"table"</tag></synopsis>
+ </refsynopsisdiv>
+ <refparameter xmlns="http://www.w3.org/1999/xhtml">
+ <variablelist>
+ <varlistentry><term>list-presentation="list"</term>
+ <listitem>
+ <para>Displays the list as a list</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry><term>list-presentation="table"</term>
+ <listitem>
+ <para>Displays the list as a table</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+ <refsee xmlns="http://www.w3.org/1999/xhtml" role="params">
+ <itemizedlist>
+ <listitem>
+ <para><parameter>variablelist.as.table</parameter></para>
+ </listitem>
+ <listitem>
+ <para><parameter>segmentedlist.as.table</parameter></para>
+ </listitem>
+ </itemizedlist>
+ </refsee>
+ <refsee xmlns="http://www.w3.org/1999/xhtml" role="tcg">
+ <para><link role="tcg" xlink:href="Variablelists.html#VarListFormatting">Variable list formatting in HTML</link></para>
+ </refsee>
+</doc:pi>
+<xsl:template name="pi.dbhtml_list-presentation">
+ <xsl:param name="node" select="."/>
+ <xsl:call-template name="dbhtml-attribute">
+ <xsl:with-param name="pis" select="$node/processing-instruction('dbhtml')"/>
+ <xsl:with-param name="attribute" select="'list-presentation'"/>
+ </xsl:call-template>
+</xsl:template>
+
+<doc:pi xmlns="" name="dbhtml_list-width">
+ <refpurpose xmlns="http://www.w3.org/1999/xhtml">Specifies the width of a variablelist or simplelist</refpurpose>
+ <refdescription xmlns="http://www.w3.org/1999/xhtml">
+ <para>Use the <tag class="xmlpi">dbhtml list-width</tag> PI as a child of a
+ <tag>variablelist</tag> or a <tag>simplelist</tag> presented
+ as a table, to specify the output width.</para>
+ </refdescription>
+ <refsynopsisdiv xmlns="http://www.w3.org/1999/xhtml">
+ <synopsis><tag class="xmlpi">dbhtml list-width="<replaceable>width</replaceable>"</tag></synopsis>
+ </refsynopsisdiv>
+ <refparameter xmlns="http://www.w3.org/1999/xhtml">
+ <variablelist>
+ <varlistentry><term>list-width="<replaceable>width</replaceable>"</term>
+ <listitem>
+ <para>Specifies the output width (including units)</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+ <refsee xmlns="http://www.w3.org/1999/xhtml" role="tcg">
+ <para><link role="tcg" xlink:href="Variablelists.html#VarListFormatting">Variable list formatting in HTML</link></para>
+ </refsee>
+</doc:pi>
+<xsl:template name="pi.dbhtml_list-width">
+ <xsl:param name="node" select="."/>
+ <xsl:call-template name="dbhtml-attribute">
+ <xsl:with-param name="pis" select="$node/processing-instruction('dbhtml')"/>
+ <xsl:with-param name="attribute" select="'list-width'"/>
+ </xsl:call-template>
+</xsl:template>
+
+<doc:pi xmlns="" name="dbhtml_row-height">
+ <refpurpose xmlns="http://www.w3.org/1999/xhtml">Specifies the height for a CALS table row</refpurpose>
+ <refdescription xmlns="http://www.w3.org/1999/xhtml">
+ <para>Use the <tag class="xmlpi">dbhtml row-height</tag> PI as a child of a
+ <tag>row</tag> to specify the height of the row.</para>
+ </refdescription>
+ <refsynopsisdiv xmlns="http://www.w3.org/1999/xhtml">
+ <synopsis><tag class="xmlpi">dbhtml row-height="<replaceable>height</replaceable>"</tag></synopsis>
+ </refsynopsisdiv>
+ <refparameter xmlns="http://www.w3.org/1999/xhtml">
+ <variablelist>
+ <varlistentry><term>row-height="<replaceable>height</replaceable>"</term>
+ <listitem>
+ <para>Specifies the row height (including units)</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+ <refsee xmlns="http://www.w3.org/1999/xhtml" role="tcg">
+ <para><link role="tcg" xlink:href="RowHeight.html">Row height</link></para>
+ </refsee>
+</doc:pi>
+<xsl:template name="pi.dbhtml_row-height">
+ <xsl:param name="node" select="."/>
+ <xsl:call-template name="dbhtml-attribute">
+ <xsl:with-param name="pis" select="$node/processing-instruction('dbhtml')"/>
+ <xsl:with-param name="attribute" select="'row-height'"/>
+ </xsl:call-template>
+</xsl:template>
+
+<doc:pi xmlns="" name="dbhtml_start">
+ <refpurpose xmlns="http://www.w3.org/1999/xhtml">(obsolete) Sets the starting number on an ordered list</refpurpose>
+ <refdescription xmlns="http://www.w3.org/1999/xhtml">
+ <para><emphasis>This PI is obsolete</emphasis>. The intent of
+ this PI was to provide a means for setting a specific starting
+ number for an ordered list. Instead of this PI, set a value
+ for the <literal>override</literal> attribute on the first
+ <tag>listitem</tag> in the list; that will have the same
+ effect as what this PI was intended for.</para>
+ </refdescription>
+ <refsynopsisdiv xmlns="http://www.w3.org/1999/xhtml">
+ <synopsis><tag class="xmlpi">dbhtml start="<replaceable>character</replaceable>"</tag></synopsis>
+ </refsynopsisdiv>
+ <refparameter xmlns="http://www.w3.org/1999/xhtml">
+ <variablelist>
+ <varlistentry><term>start="<replaceable>character</replaceable>"</term>
+ <listitem>
+ <para>Specifies the character to use as the starting
+ number; use 0-9, a-z, A-Z, or lowercase or uppercase
+ Roman numerals</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+ <refsee xmlns="http://www.w3.org/1999/xhtml" role="tcg">
+ <para><link role="tcg" xlink:href="Orderedlists.html#ListStartNum">List starting number</link></para>
+ </refsee>
+</doc:pi>
+<xsl:template name="pi.dbhtml_start">
+ <xsl:param name="node" select="."/>
+ <xsl:call-template name="pi-attribute">
+ <xsl:with-param name="pis" select="$node/processing-instruction('dbhtml')"/>
+ <xsl:with-param name="attribute" select="'start'"/>
+ </xsl:call-template>
+</xsl:template>
+
+ <doc:pi xmlns="" name="dbhtml_stop-chunking">
+ <refpurpose xmlns="http://www.w3.org/1999/xhtml">Do not chunk any descendants of this element.</refpurpose>
+ <refdescription xmlns="http://www.w3.org/1999/xhtml">
+ <para>When generating chunked HTML output, adding this PI as the child of an element that contains elements that would normally be generated on separate pages if generating chunked output causes chunking to stop at this point. No descendants of the current element will be split into new HTML pages:
+<programlisting>&lt;section&gt;
+&lt;title&gt;Configuring pencil&lt;/title&gt;
+&lt;?dbhtml stop-chunking?&gt;
+
+...
+
+&lt;/section&gt;</programlisting>
+</para>
+ </refdescription>
+ <refsynopsisdiv xmlns="http://www.w3.org/1999/xhtml">
+ <synopsis><tag class="xmlpi">dbhtml stop-chunking</tag></synopsis>
+ </refsynopsisdiv>
+ <refsee xmlns="http://www.w3.org/1999/xhtml" role="tcg">
+ <para><link role="tcg" xlink:href="Chunking.html">Chunking into multiple HTML files</link></para>
+ </refsee>
+ </doc:pi>
+ <!-- The code that handles the stop-chunking pi is in chunk-common.xsl -->
+
+<doc:pi xmlns="" name="dbhtml_table-summary">
+ <refpurpose xmlns="http://www.w3.org/1999/xhtml">Specifies summary for CALS table, variablelist, segmentedlist, or qandaset output</refpurpose>
+ <refdescription xmlns="http://www.w3.org/1999/xhtml">
+ <para>Use the <tag class="xmlpi">dbhtml table-summary</tag> PI as a child of
+ a CALS <tag>table</tag>, <tag>variablelist</tag>,
+ <tag>segmentedlist</tag>, or <tag>qandaset</tag> to specify
+ the text for the HTML <literal>summary</literal> attribute
+ in the output HTML table.</para>
+ </refdescription>
+ <refsynopsisdiv xmlns="http://www.w3.org/1999/xhtml">
+ <synopsis><tag class="xmlpi">dbhtml table-summary="<replaceable>text</replaceable>"</tag></synopsis>
+ </refsynopsisdiv>
+ <refparameter xmlns="http://www.w3.org/1999/xhtml">
+ <variablelist>
+ <varlistentry><term>table-summary="<replaceable>text</replaceable>"</term>
+ <listitem>
+ <para>Specifies the summary text (zero or more characters)</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+ <refsee xmlns="http://www.w3.org/1999/xhtml" role="tcg">
+ <para><link role="tcg" xlink:href="Variablelists.html#VarListFormatting">Variable list formatting in HTML</link>,
+ <link role="tcg" xlink:href="TableSummary.html">Table summary text</link></para>
+ </refsee>
+</doc:pi>
+<xsl:template name="pi.dbhtml_table-summary">
+ <xsl:param name="node" select="."/>
+ <xsl:call-template name="dbhtml-attribute">
+ <xsl:with-param name="pis" select="$node/processing-instruction('dbhtml')"/>
+ <xsl:with-param name="attribute" select="'table-summary'"/>
+ </xsl:call-template>
+</xsl:template>
+
+<doc:pi xmlns="" name="dbhtml_table-width">
+ <refpurpose xmlns="http://www.w3.org/1999/xhtml">Specifies the width for a CALS table</refpurpose>
+ <refdescription xmlns="http://www.w3.org/1999/xhtml">
+ <para>Use the <tag class="xmlpi">dbhtml table-width</tag> PI as a child of a
+ CALS <tag>table</tag> to specify the width of the table in
+ output.</para>
+ </refdescription>
+ <refsynopsisdiv xmlns="http://www.w3.org/1999/xhtml">
+ <synopsis><tag class="xmlpi">dbhtml table-width="<replaceable>width</replaceable>"</tag></synopsis>
+ </refsynopsisdiv>
+ <refparameter xmlns="http://www.w3.org/1999/xhtml">
+ <variablelist>
+ <varlistentry><term>table-width="<replaceable>width</replaceable>"</term>
+ <listitem>
+ <para>Specifies the table width (including units or as a percentage)</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+ <refsee xmlns="http://www.w3.org/1999/xhtml" role="params">
+ <para><parameter>default.table.width</parameter></para>
+ </refsee>
+ <refsee xmlns="http://www.w3.org/1999/xhtml" role="tcg">
+ <para><link role="tcg" xlink:href="Tables.html#TableWidth">Table width</link></para>
+ </refsee>
+</doc:pi>
+<xsl:template name="pi.dbhtml_table-width">
+ <xsl:param name="node" select="."/>
+ <xsl:call-template name="dbhtml-attribute">
+ <xsl:with-param name="pis" select="$node/processing-instruction('dbhtml')"/>
+ <xsl:with-param name="attribute" select="'table-width'"/>
+ </xsl:call-template>
+</xsl:template>
+
+<doc:pi xmlns="" name="dbhtml_term-presentation">
+ <refpurpose xmlns="http://www.w3.org/1999/xhtml">Sets character formatting for terms in a variablelist</refpurpose>
+ <refdescription xmlns="http://www.w3.org/1999/xhtml">
+ <para>Use the <tag class="xmlpi">dbhtml term-presentation</tag> PI as a child
+ of a <tag>variablelist</tag> to set character formatting for
+ the <tag>term</tag> output of the list.</para>
+ </refdescription>
+ <refsynopsisdiv xmlns="http://www.w3.org/1999/xhtml">
+ <synopsis><tag class="xmlpi">dbhtml term-presentation="bold"|"italic"|"bold-italic"</tag></synopsis>
+ </refsynopsisdiv>
+ <refparameter xmlns="http://www.w3.org/1999/xhtml">
+ <variablelist>
+ <varlistentry><term>term-presentation="<replaceable>bold</replaceable>"</term>
+ <listitem>
+ <para>Specifies that terms are displayed in bold</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry><term>term-presentation="<replaceable>italic</replaceable>"</term>
+ <listitem>
+ <para>Specifies that terms are displayed in italic</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry><term>term-presentation="<replaceable>bold-italic</replaceable>"</term>
+ <listitem>
+ <para>Specifies that terms are displayed in bold-italic</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+ <refsee xmlns="http://www.w3.org/1999/xhtml" role="tcg">
+ <para><link role="tcg" xlink:href="Variablelists.html#VarListFormatting">Variable list formatting in HTML</link></para>
+ </refsee>
+</doc:pi>
+<xsl:template name="pi.dbhtml_term-presentation">
+ <xsl:param name="node" select="."/>
+ <xsl:call-template name="dbhtml-attribute">
+ <xsl:with-param name="pis" select="$node/processing-instruction('dbhtml')"/>
+ <xsl:with-param name="attribute" select="'term-presentation'"/>
+ </xsl:call-template>
+</xsl:template>
+
+<doc:pi xmlns="" name="dbhtml_term-separator">
+ <refpurpose xmlns="http://www.w3.org/1999/xhtml">Specifies separator text among terms in a varlistentry</refpurpose>
+ <refdescription xmlns="http://www.w3.org/1999/xhtml">
+ <para>Use the <tag class="xmlpi">dbhtml term-separator</tag> PI as a child
+ of a <tag>variablelist</tag> to specify the separator text
+ among <tag>term</tag> instances.</para>
+ </refdescription>
+ <refsynopsisdiv xmlns="http://www.w3.org/1999/xhtml">
+ <synopsis><tag class="xmlpi">dbhtml term-separator="<replaceable>text</replaceable>"</tag></synopsis>
+ </refsynopsisdiv>
+ <refparameter xmlns="http://www.w3.org/1999/xhtml">
+ <variablelist>
+ <varlistentry><term>term-separator="<replaceable>text</replaceable>"</term>
+ <listitem>
+ <para>Specifies the text (zero or more characters)</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+ <refsee xmlns="http://www.w3.org/1999/xhtml" role="params">
+ <para><parameter>variablelist.term.separator</parameter></para>
+ </refsee>
+ <refsee xmlns="http://www.w3.org/1999/xhtml" role="tcg">
+ <para><link role="tcg" xlink:href="Variablelists.html#VarListFormatting">Variable list formatting in HTML</link></para>
+ </refsee>
+</doc:pi>
+<xsl:template name="pi.dbhtml_term-separator">
+ <xsl:param name="node" select="."/>
+ <xsl:call-template name="dbhtml-attribute">
+ <xsl:with-param name="pis" select="$node/processing-instruction('dbhtml')"/>
+ <xsl:with-param name="attribute" select="'term-separator'"/>
+ </xsl:call-template>
+</xsl:template>
+
+<doc:pi xmlns="" name="dbhtml_term-width">
+ <refpurpose xmlns="http://www.w3.org/1999/xhtml">Specifies the term width for a variablelist</refpurpose>
+ <refdescription xmlns="http://www.w3.org/1999/xhtml">
+ <para>Use the <tag class="xmlpi">dbhtml term-width</tag> PI as a child of a
+ <tag>variablelist</tag> to specify the width for
+ <tag>term</tag> output.</para>
+ </refdescription>
+ <refsynopsisdiv xmlns="http://www.w3.org/1999/xhtml">
+ <synopsis><tag class="xmlpi">dbhtml term-width="<replaceable>width</replaceable>"</tag></synopsis>
+ </refsynopsisdiv>
+ <refparameter xmlns="http://www.w3.org/1999/xhtml">
+ <variablelist>
+ <varlistentry><term>term-width="<replaceable>width</replaceable>"</term>
+ <listitem>
+ <para>Specifies the term width (including units)</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+ <refsee xmlns="http://www.w3.org/1999/xhtml" role="tcg">
+ <para><link role="tcg" xlink:href="Variablelists.html#VarListFormatting">Variable list formatting in HTML</link></para>
+ </refsee>
+</doc:pi>
+<xsl:template name="pi.dbhtml_term-width">
+ <xsl:param name="node" select="."/>
+ <xsl:call-template name="dbhtml-attribute">
+ <xsl:with-param name="pis" select="$node/processing-instruction('dbhtml')"/>
+ <xsl:with-param name="attribute" select="'term-width'"/>
+ </xsl:call-template>
+</xsl:template>
+
+<doc:pi xmlns="" name="dbhtml_toc">
+ <refpurpose xmlns="http://www.w3.org/1999/xhtml">Specifies whether a TOC should be generated for a qandaset</refpurpose>
+ <refdescription xmlns="http://www.w3.org/1999/xhtml">
+ <para>Use the <tag class="xmlpi">dbhtml toc</tag> PI as a child of a
+ <tag>qandaset</tag> to specify whether a table of contents
+ (TOC) is generated for the <tag>qandaset</tag>.</para>
+ </refdescription>
+ <refsynopsisdiv xmlns="http://www.w3.org/1999/xhtml">
+ <synopsis><tag class="xmlpi">dbhtml toc="0"|"1"</tag></synopsis>
+ </refsynopsisdiv>
+ <refparameter xmlns="http://www.w3.org/1999/xhtml">
+ <variablelist>
+ <varlistentry><term>toc="0"</term>
+ <listitem>
+ <para>If zero, no TOC is generated</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry><term>toc="1"</term>
+ <listitem>
+ <para>If <code>1</code> (or any non-zero value),
+ a TOC is generated</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+ <refsee xmlns="http://www.w3.org/1999/xhtml" role="tcg">
+ <para><link role="tcg" xlink:href="QandAtoc.html">Q and A list of questions</link>,
+ <link role="tcg" xlink:href="QandAformat.html">Q and A formatting</link></para>
+ </refsee>
+</doc:pi>
+<xsl:template name="pi.dbhtml_toc">
+ <xsl:param name="node" select="."/>
+ <xsl:call-template name="dbhtml-attribute">
+ <xsl:with-param name="pis" select="$node/processing-instruction('dbhtml')"/>
+ <xsl:with-param name="attribute" select="'toc'"/>
+ </xsl:call-template>
+</xsl:template>
+
+<doc:pi xmlns="" name="dbcmdlist">
+ <refpurpose xmlns="http://www.w3.org/1999/xhtml">Generates a hyperlinked list of commands</refpurpose>
+ <refdescription xmlns="http://www.w3.org/1999/xhtml">
+ <para>Use the <tag class="xmlpi">dbcmdlist</tag> PI as the child of any
+ element (for example, <tag>refsynopsisdiv</tag>) containing multiple
+ <tag>cmdsynopsis</tag> instances; a hyperlinked navigational
+ &#8220;command list&#8221; will be generated at the top of output for that
+ element, enabling users to quickly jump
+ to each command synopsis.</para>
+ </refdescription>
+ <refsynopsisdiv xmlns="http://www.w3.org/1999/xhtml">
+ <synopsis><tag class="xmlpi">dbcmdlist</tag></synopsis>
+ </refsynopsisdiv>
+ <refparameter xmlns="http://www.w3.org/1999/xhtml">
+ <para>[No parameters]</para>
+ </refparameter>
+</doc:pi>
+<xsl:template name="pi.dbcmdlist">
+ <xsl:variable name="cmdsynopses" select="..//cmdsynopsis"/>
+ <xsl:if test="count($cmdsynopses)&lt;1">
+ <xsl:message><xsl:text>No cmdsynopsis elements matched dbcmdlist PI, perhaps it's nested too deep?</xsl:text>
+ </xsl:message>
+ </xsl:if>
+ <dl>
+ <xsl:call-template name="process.cmdsynopsis.list">
+ <xsl:with-param name="cmdsynopses" select="$cmdsynopses"/>
+ </xsl:call-template>
+ </dl>
+</xsl:template>
+
+<doc:pi xmlns="" name="dbfunclist">
+ <refpurpose xmlns="http://www.w3.org/1999/xhtml">Generates a hyperlinked list of functions</refpurpose>
+ <refdescription xmlns="http://www.w3.org/1999/xhtml">
+ <para>Use the <tag class="xmlpi">dbfunclist</tag> PI as the child of any
+ element (for example, <tag>refsynopsisdiv</tag>) containing multiple
+ <tag>funcsynopsis</tag> instances; a hyperlinked
+ navigational &#8220;function list&#8221; will be generated at the top of
+ output for that element, enabling users to quickly
+ jump to to each function synopsis.</para>
+ </refdescription>
+ <refsynopsisdiv xmlns="http://www.w3.org/1999/xhtml">
+ <synopsis><tag class="xmlpi">dbfunclist</tag></synopsis>
+ </refsynopsisdiv>
+ <refparameter xmlns="http://www.w3.org/1999/xhtml">
+ <para>[No parameters]</para>
+ </refparameter>
+</doc:pi>
+<xsl:template name="pi.dbfunclist">
+ <xsl:variable name="funcsynopses" select="..//funcsynopsis"/>
+ <xsl:if test="count($funcsynopses)&lt;1">
+ <xsl:message><xsl:text>No funcsynopsis elements matched dbfunclist PI, perhaps it's nested too deep?</xsl:text>
+ </xsl:message>
+ </xsl:if>
+ <dl>
+ <xsl:call-template name="process.funcsynopsis.list">
+ <xsl:with-param name="funcsynopses" select="$funcsynopses"/>
+ </xsl:call-template>
+ </dl>
+</xsl:template>
+
+<doc:pi xmlns="" name="dbhtml-include_href">
+ <refpurpose xmlns="http://www.w3.org/1999/xhtml">Copies an external well-formed HTML/XML file into current doc</refpurpose>
+ <refdescription xmlns="http://www.w3.org/1999/xhtml">
+ <para>Use the <tag class="xmlpi">dbhtml-include href</tag> PI anywhere in a
+ document to cause the contents of the file referenced by the
+ <code>href</code> pseudo-attribute to be copied/inserted &#8220;as
+ is&#8221; into your HTML output at the point in document order
+ where the PI occurs in the source.</para>
+ <note>
+ <para>The referenced file may contain plain text (as long as
+ it is &#8220;wrapped&#8221; in an <tag>html</tag> element &#8212; see the
+ note below) or markup in any arbitrary vocabulary,
+ including HTML &#8212; but it must conform to XML
+ well-formedness constraints (because the feature in XSLT
+ 1.0 for opening external files, the
+ <function>document()</function> function, can only handle
+ files that meet XML well-formedness constraints).</para>
+ <para>Among other things, XML well-formedness constraints
+ require a document to have <emphasis>a single root
+ element</emphasis>. So if the content you want to
+ include is plain text or is markup that does
+ <emphasis>not</emphasis> have a single root element,
+ <emphasis role="strong">wrap the content in an
+ <tag>html</tag> element</emphasis>. The stylesheets will
+ strip out that surrounding <tag>html</tag> &#8220;wrapper&#8221; when
+ they find it, leaving just the content you want to
+ insert.</para>
+ </note>
+ </refdescription>
+ <refsynopsisdiv xmlns="http://www.w3.org/1999/xhtml">
+ <synopsis><tag class="xmlpi">dbhtml-include href="<replaceable>URI</replaceable>"</tag></synopsis>
+ </refsynopsisdiv>
+ <refparameter xmlns="http://www.w3.org/1999/xhtml">
+ <variablelist>
+ <varlistentry><term>href="<replaceable>URI</replaceable>"</term>
+ <listitem>
+ <para>Specifies the URI for the file to include; the URI
+ can be, for example, a remote <literal>http:</literal>
+ URI, or a local filesystem <literal>file:</literal>
+ URI</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+ <refsee xmlns="http://www.w3.org/1999/xhtml" role="params">
+ <para><parameter>textinsert.extension</parameter></para>
+ </refsee>
+ <refsee xmlns="http://www.w3.org/1999/xhtml" role="tcg">
+ <para><link role="tcg" xlink:href="InsertExtHtml.html">Inserting external HTML code</link>,
+ <link role="tcg" xlink:href="ExternalCode.html">External code files</link></para>
+ </refsee>
+</doc:pi>
+<xsl:template name="pi.dbhtml-include">
+ <xsl:param name="href">
+ <xsl:call-template name="dbhtml-attribute">
+ <xsl:with-param name="pis" select="."/>
+ <xsl:with-param name="attribute">href</xsl:with-param>
+ </xsl:call-template>
+ </xsl:param>
+ <xsl:choose>
+ <xsl:when test="$href != ''">
+ <xsl:variable name="content" select="document($href,/)"/>
+ <xsl:choose>
+ <xsl:when test="$content/*">
+ <xsl:choose>
+ <xsl:when test="$content/*[1][self::html]">
+ <!-- include just the children of html wrapper -->
+ <xsl:copy-of select="$content/*[1]/node()"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:copy-of select="$content"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:message>
+ <xsl:text>ERROR: dbhtml-include processing instruction </xsl:text>
+ <xsl:text>href has no content.</xsl:text>
+ </xsl:message>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:message>
+ <xsl:text>ERROR: dbhtml-include processing instruction has </xsl:text>
+ <xsl:text>missing or empty href value.</xsl:text>
+ </xsl:message>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- There are two templates matching this PI in htmlhelp-common.xsl -->
+<doc:pi xmlns="" name="dbhh">
+ <refpurpose xmlns="http://www.w3.org/1999/xhtml">Sets topic name and topic id for context-sensitive HTML Help</refpurpose>
+ <refdescription xmlns="http://www.w3.org/1999/xhtml">
+ <para>Use the <tag class="xmlpi">dbhh</tag> PI as a child of components
+ that should be used as targets for context-sensitive help requests.</para>
+ </refdescription>
+ <refsynopsisdiv xmlns="http://www.w3.org/1999/xhtml">
+ <synopsis><tag class="xmlpi">dbhh topicname="<replaceable>name</replaceable>" topicid="<replaceable>id</replaceable>"</tag></synopsis>
+ </refsynopsisdiv>
+ <refparameter xmlns="http://www.w3.org/1999/xhtml">
+ <variablelist>
+ <varlistentry><term>topicname="<replaceable>name</replaceable>"</term>
+ <listitem>
+ <para>Specifies a unique string constant that identifies a help topic</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry><term>topicid="<replaceable>id</replaceable>"</term>
+ <listitem>
+ <para>Specifies a unique integer value for the <literal>topicname</literal> string</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+ <refsee xmlns="http://www.w3.org/1999/xhtml" role="tcg">
+ <para><link role="tcg" xlink:href="HtmlHelp.html#HHContextHelp">Context-sensitive help</link></para>
+ </refsee>
+</doc:pi>
+
+<!-- ==================================================================== -->
+
+<xsl:template name="dbhtml-attribute">
+ <!-- * dbhtml-attribute is an interal utility template for retrieving -->
+ <!-- * pseudo-attributes/parameters from PIs -->
+ <xsl:param name="pis" select="processing-instruction('dbhtml')"/>
+ <xsl:param name="attribute">filename</xsl:param>
+ <xsl:call-template name="pi-attribute">
+ <xsl:with-param name="pis" select="$pis"/>
+ <xsl:with-param name="attribute" select="$attribute"/>
+ </xsl:call-template>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="processing-instruction()">
+</xsl:template>
+
+<xsl:template match="processing-instruction('dbhtml')">
+ <!-- nop -->
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="processing-instruction('dbcmdlist')">
+ <xsl:call-template name="pi.dbcmdlist"/>
+</xsl:template>
+<xsl:template name="process.cmdsynopsis.list">
+ <xsl:param name="cmdsynopses"/><!-- empty node list by default -->
+ <xsl:param name="count" select="1"/>
+
+ <xsl:choose>
+ <xsl:when test="$count&gt;count($cmdsynopses)"/>
+ <xsl:otherwise>
+ <xsl:variable name="cmdsyn" select="$cmdsynopses[$count]"/>
+
+ <dt>
+ <a>
+ <xsl:attribute name="href">
+ <xsl:text>#</xsl:text>
+ <xsl:call-template name="object.id">
+ <xsl:with-param name="object" select="$cmdsyn"/>
+ </xsl:call-template>
+ </xsl:attribute>
+
+ <xsl:choose>
+ <xsl:when test="$cmdsyn/@xreflabel">
+ <xsl:call-template name="xref.xreflabel">
+ <xsl:with-param name="target" select="$cmdsyn"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="$cmdsyn" mode="xref-to">
+ <xsl:with-param name="target" select="$cmdsyn"/>
+ </xsl:apply-templates>
+ </xsl:otherwise>
+ </xsl:choose>
+ </a>
+ </dt>
+
+ <xsl:call-template name="process.cmdsynopsis.list">
+ <xsl:with-param name="cmdsynopses" select="$cmdsynopses"/>
+ <xsl:with-param name="count" select="$count+1"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="processing-instruction('dbfunclist')">
+ <xsl:call-template name="pi.dbfunclist"/>
+</xsl:template>
+<xsl:template name="process.funcsynopsis.list">
+ <xsl:param name="funcsynopses"/><!-- empty node list by default -->
+ <xsl:param name="count" select="1"/>
+
+ <xsl:choose>
+ <xsl:when test="$count&gt;count($funcsynopses)"/>
+ <xsl:otherwise>
+ <xsl:variable name="cmdsyn" select="$funcsynopses[$count]"/>
+
+ <dt>
+ <a>
+ <xsl:attribute name="href">
+ <xsl:text>#</xsl:text>
+ <xsl:call-template name="object.id">
+ <xsl:with-param name="object" select="$cmdsyn"/>
+ </xsl:call-template>
+ </xsl:attribute>
+
+ <xsl:choose>
+ <xsl:when test="$cmdsyn/@xreflabel">
+ <xsl:call-template name="xref.xreflabel">
+ <xsl:with-param name="target" select="$cmdsyn"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="$cmdsyn" mode="xref-to">
+ <xsl:with-param name="target" select="$cmdsyn"/>
+ </xsl:apply-templates>
+ </xsl:otherwise>
+ </xsl:choose>
+ </a>
+ </dt>
+
+ <xsl:call-template name="process.funcsynopsis.list">
+ <xsl:with-param name="funcsynopses" select="$funcsynopses"/>
+ <xsl:with-param name="count" select="$count+1"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="processing-instruction('dbhtml-include')">
+ <xsl:call-template name="pi.dbhtml-include"/>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template name="dbhtml-dir">
+ <xsl:param name="context" select="."/>
+ <!-- directories are now inherited from previous levels -->
+ <xsl:variable name="ppath">
+ <xsl:if test="$context/parent::*">
+ <xsl:call-template name="dbhtml-dir">
+ <xsl:with-param name="context" select="$context/parent::*"/>
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:variable>
+ <xsl:variable name="path">
+ <xsl:call-template name="pi.dbhtml_dir">
+ <xsl:with-param name="node" select="$context"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:choose>
+ <xsl:when test="$path = ''">
+ <xsl:if test="$ppath != ''">
+ <xsl:value-of select="$ppath"/>
+ </xsl:if>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:if test="$ppath != ''">
+ <xsl:value-of select="$ppath"/>
+ <xsl:if test="substring($ppath, string-length($ppath), 1) != '/'">
+ <xsl:text>/</xsl:text>
+ </xsl:if>
+ </xsl:if>
+ <xsl:value-of select="$path"/>
+ <xsl:text>/</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/profile-chunk-code.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/profile-chunk-code.xsl
new file mode 100644
index 0000000..05c10c6
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/profile-chunk-code.xsl
@@ -0,0 +1,617 @@
+<?xml version="1.0" encoding="ASCII"?>
+<!--This file was created automatically by html2xhtml-->
+<!--from the HTML stylesheets.-->
+<!--This file was created automatically by xsl2profile-->
+<!--from the DocBook XSL stylesheets.-->
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:exsl="http://exslt.org/common" xmlns:cf="http://docbook.sourceforge.net/xmlns/chunkfast/1.0" xmlns:ng="http://docbook.org/docbook-ng" xmlns:db="http://docbook.org/ns/docbook" xmlns:exslt="http://exslt.org/common" xmlns="http://www.w3.org/1999/xhtml" exslt:dummy="dummy" ng:dummy="dummy" db:dummy="dummy" extension-element-prefixes="exslt" exclude-result-prefixes="exsl cf ng db exslt" version="1.0">
+
+<!-- ********************************************************************
+ $Id: chunk-code.xsl 8596 2010-03-20 04:36:45Z bobstayton $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<!-- ==================================================================== -->
+
+
+<xsl:template match="*" mode="chunk-filename">
+ <!-- returns the filename of a chunk -->
+ <xsl:variable name="ischunk">
+ <xsl:call-template name="chunk"/>
+ </xsl:variable>
+
+ <xsl:variable name="fn">
+ <xsl:apply-templates select="." mode="recursive-chunk-filename"/>
+ </xsl:variable>
+
+ <!--
+ <xsl:message>
+ <xsl:value-of select="$ischunk"/>
+ <xsl:text> (</xsl:text>
+ <xsl:value-of select="local-name(.)"/>
+ <xsl:text>) </xsl:text>
+ <xsl:value-of select="$fn"/>
+ <xsl:text>, </xsl:text>
+ <xsl:call-template name="dbhtml-dir"/>
+ </xsl:message>
+ -->
+
+ <!-- 2003-11-25 by ndw:
+ The following test used to read test="$ischunk != 0 and $fn != ''"
+ I've removed the ischunk part of the test so that href.to.uri and
+ href.from.uri will be fully qualified even if the source or target
+ isn't a chunk. I *think* that if $fn != '' then it's appropriate
+ to put the directory on the front, even if the element isn't a
+ chunk. I could be wrong. -->
+
+ <xsl:if test="$fn != ''">
+ <xsl:call-template name="dbhtml-dir"/>
+ </xsl:if>
+
+ <xsl:value-of select="$fn"/>
+ <!-- You can't add the html.ext here because dbhtml filename= may already -->
+ <!-- have added it. It really does have to be handled in the recursive template -->
+</xsl:template>
+
+<xsl:template match="*" mode="recursive-chunk-filename">
+ <xsl:param name="recursive" select="false()"/>
+
+ <!-- returns the filename of a chunk -->
+ <xsl:variable name="ischunk">
+ <xsl:call-template name="chunk"/>
+ </xsl:variable>
+
+ <xsl:variable name="dbhtml-filename">
+ <xsl:call-template name="pi.dbhtml_filename"/>
+ </xsl:variable>
+
+ <xsl:variable name="filename">
+ <xsl:choose>
+ <xsl:when test="$dbhtml-filename != ''">
+ <xsl:value-of select="$dbhtml-filename"/>
+ </xsl:when>
+ <!-- if this is the root element, use the root.filename -->
+ <xsl:when test="not(parent::*) and $root.filename != ''">
+ <xsl:value-of select="$root.filename"/>
+ <xsl:value-of select="$html.ext"/>
+ </xsl:when>
+ <!-- Special case -->
+ <xsl:when test="self::legalnotice and not($generate.legalnotice.link = 0)">
+ <xsl:choose>
+ <xsl:when test="(@id or @xml:id) and not($use.id.as.filename = 0)">
+ <!-- * if this legalnotice has an ID, then go ahead and use -->
+ <!-- * just the value of that ID as the basename for the file -->
+ <!-- * (that is, without prepending an "ln-" too it) -->
+ <xsl:value-of select="(@id|@xml:id)[1]"/>
+ <xsl:value-of select="$html.ext"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <!-- * otherwise, if this legalnotice does not have an ID, -->
+ <!-- * then we generate an ID... -->
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+ <!-- * ...and then we take that generated ID, prepend an -->
+ <!-- * "ln-" to it, and use that as the basename for the file -->
+ <xsl:value-of select="concat('ln-',$id,$html.ext)"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <!-- if there's no dbhtml filename, and if we're to use IDs as -->
+ <!-- filenames, then use the ID to generate the filename. -->
+ <xsl:when test="(@id or @xml:id) and $use.id.as.filename != 0">
+ <xsl:value-of select="(@id|@xml:id)[1]"/>
+ <xsl:value-of select="$html.ext"/>
+ </xsl:when>
+ <xsl:otherwise/>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="$ischunk='0'">
+ <!-- if called on something that isn't a chunk, walk up... -->
+ <xsl:choose>
+ <xsl:when test="count(parent::*)&gt;0">
+ <xsl:apply-templates mode="recursive-chunk-filename" select="parent::*">
+ <xsl:with-param name="recursive" select="$recursive"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <!-- unless there is no up, in which case return "" -->
+ <xsl:otherwise/>
+ </xsl:choose>
+ </xsl:when>
+
+ <xsl:when test="not($recursive) and $filename != ''">
+ <!-- if this chunk has an explicit name, use it -->
+ <xsl:value-of select="$filename"/>
+ </xsl:when>
+
+ <xsl:when test="self::set">
+ <xsl:value-of select="$root.filename"/>
+ <xsl:if test="not($recursive)">
+ <xsl:value-of select="$html.ext"/>
+ </xsl:if>
+ </xsl:when>
+
+ <xsl:when test="self::book">
+ <xsl:text>bk</xsl:text>
+ <xsl:number level="any" format="01"/>
+ <xsl:if test="not($recursive)">
+ <xsl:value-of select="$html.ext"/>
+ </xsl:if>
+ </xsl:when>
+
+ <xsl:when test="self::article">
+ <xsl:if test="/set">
+ <!-- in a set, make sure we inherit the right book info... -->
+ <xsl:apply-templates mode="recursive-chunk-filename" select="parent::*">
+ <xsl:with-param name="recursive" select="true()"/>
+ </xsl:apply-templates>
+ </xsl:if>
+
+ <xsl:text>ar</xsl:text>
+ <xsl:number level="any" format="01" from="book"/>
+ <xsl:if test="not($recursive)">
+ <xsl:value-of select="$html.ext"/>
+ </xsl:if>
+ </xsl:when>
+
+ <xsl:when test="self::preface">
+ <xsl:if test="/set">
+ <!-- in a set, make sure we inherit the right book info... -->
+ <xsl:apply-templates mode="recursive-chunk-filename" select="parent::*">
+ <xsl:with-param name="recursive" select="true()"/>
+ </xsl:apply-templates>
+ </xsl:if>
+
+ <xsl:text>pr</xsl:text>
+ <xsl:number level="any" format="01" from="book"/>
+ <xsl:if test="not($recursive)">
+ <xsl:value-of select="$html.ext"/>
+ </xsl:if>
+ </xsl:when>
+
+ <xsl:when test="self::chapter">
+ <xsl:if test="/set">
+ <!-- in a set, make sure we inherit the right book info... -->
+ <xsl:apply-templates mode="recursive-chunk-filename" select="parent::*">
+ <xsl:with-param name="recursive" select="true()"/>
+ </xsl:apply-templates>
+ </xsl:if>
+
+ <xsl:text>ch</xsl:text>
+ <xsl:number level="any" format="01" from="book"/>
+ <xsl:if test="not($recursive)">
+ <xsl:value-of select="$html.ext"/>
+ </xsl:if>
+ </xsl:when>
+
+ <xsl:when test="self::appendix">
+ <xsl:if test="/set">
+ <!-- in a set, make sure we inherit the right book info... -->
+ <xsl:apply-templates mode="recursive-chunk-filename" select="parent::*">
+ <xsl:with-param name="recursive" select="true()"/>
+ </xsl:apply-templates>
+ </xsl:if>
+
+ <xsl:text>ap</xsl:text>
+ <xsl:number level="any" format="a" from="book"/>
+ <xsl:if test="not($recursive)">
+ <xsl:value-of select="$html.ext"/>
+ </xsl:if>
+ </xsl:when>
+
+ <xsl:when test="self::part">
+ <xsl:choose>
+ <xsl:when test="/set">
+ <!-- in a set, make sure we inherit the right book info... -->
+ <xsl:apply-templates mode="recursive-chunk-filename" select="parent::*">
+ <xsl:with-param name="recursive" select="true()"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:otherwise>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:text>pt</xsl:text>
+ <xsl:number level="any" format="01" from="book"/>
+ <xsl:if test="not($recursive)">
+ <xsl:value-of select="$html.ext"/>
+ </xsl:if>
+ </xsl:when>
+
+ <xsl:when test="self::reference">
+ <xsl:choose>
+ <xsl:when test="/set">
+ <!-- in a set, make sure we inherit the right book info... -->
+ <xsl:apply-templates mode="recursive-chunk-filename" select="parent::*">
+ <xsl:with-param name="recursive" select="true()"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:otherwise>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:text>rn</xsl:text>
+ <xsl:number level="any" format="01" from="book"/>
+ <xsl:if test="not($recursive)">
+ <xsl:value-of select="$html.ext"/>
+ </xsl:if>
+ </xsl:when>
+
+ <xsl:when test="self::refentry">
+ <xsl:choose>
+ <xsl:when test="parent::reference">
+ <xsl:apply-templates mode="recursive-chunk-filename" select="parent::*">
+ <xsl:with-param name="recursive" select="true()"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:if test="/set">
+ <!-- in a set, make sure we inherit the right book info... -->
+ <xsl:apply-templates mode="recursive-chunk-filename" select="parent::*">
+ <xsl:with-param name="recursive" select="true()"/>
+ </xsl:apply-templates>
+ </xsl:if>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:text>re</xsl:text>
+ <xsl:number level="any" format="01" from="book"/>
+ <xsl:if test="not($recursive)">
+ <xsl:value-of select="$html.ext"/>
+ </xsl:if>
+ </xsl:when>
+
+ <xsl:when test="self::colophon">
+ <xsl:choose>
+ <xsl:when test="/set">
+ <!-- in a set, make sure we inherit the right book info... -->
+ <xsl:apply-templates mode="recursive-chunk-filename" select="parent::*">
+ <xsl:with-param name="recursive" select="true()"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:otherwise>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:text>co</xsl:text>
+ <xsl:number level="any" format="01" from="book"/>
+ <xsl:if test="not($recursive)">
+ <xsl:value-of select="$html.ext"/>
+ </xsl:if>
+ </xsl:when>
+
+ <xsl:when test="self::sect1 or self::sect2 or self::sect3 or self::sect4 or self::sect5 or self::section">
+ <xsl:apply-templates mode="recursive-chunk-filename" select="parent::*">
+ <xsl:with-param name="recursive" select="true()"/>
+ </xsl:apply-templates>
+ <xsl:text>s</xsl:text>
+ <xsl:number format="01"/>
+ <xsl:if test="not($recursive)">
+ <xsl:value-of select="$html.ext"/>
+ </xsl:if>
+ </xsl:when>
+
+ <xsl:when test="self::bibliography">
+ <xsl:choose>
+ <xsl:when test="/set">
+ <!-- in a set, make sure we inherit the right book info... -->
+ <xsl:apply-templates mode="recursive-chunk-filename" select="parent::*">
+ <xsl:with-param name="recursive" select="true()"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:otherwise>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:text>bi</xsl:text>
+ <xsl:number level="any" format="01" from="book"/>
+ <xsl:if test="not($recursive)">
+ <xsl:value-of select="$html.ext"/>
+ </xsl:if>
+ </xsl:when>
+
+ <xsl:when test="self::glossary">
+ <xsl:choose>
+ <xsl:when test="/set">
+ <!-- in a set, make sure we inherit the right book info... -->
+ <xsl:apply-templates mode="recursive-chunk-filename" select="parent::*">
+ <xsl:with-param name="recursive" select="true()"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:otherwise>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:text>go</xsl:text>
+ <xsl:number level="any" format="01" from="book"/>
+ <xsl:if test="not($recursive)">
+ <xsl:value-of select="$html.ext"/>
+ </xsl:if>
+ </xsl:when>
+
+ <xsl:when test="self::index">
+ <xsl:choose>
+ <xsl:when test="/set">
+ <!-- in a set, make sure we inherit the right book info... -->
+ <xsl:apply-templates mode="recursive-chunk-filename" select="parent::*">
+ <xsl:with-param name="recursive" select="true()"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:otherwise>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:text>ix</xsl:text>
+ <xsl:number level="any" format="01" from="book"/>
+ <xsl:if test="not($recursive)">
+ <xsl:value-of select="$html.ext"/>
+ </xsl:if>
+ </xsl:when>
+
+ <xsl:when test="self::setindex">
+ <xsl:text>si</xsl:text>
+ <xsl:number level="any" format="01" from="set"/>
+ <xsl:if test="not($recursive)">
+ <xsl:value-of select="$html.ext"/>
+ </xsl:if>
+ </xsl:when>
+
+ <xsl:otherwise>
+ <xsl:text>chunk-filename-error-</xsl:text>
+ <xsl:value-of select="name(.)"/>
+ <xsl:number level="any" format="01" from="set"/>
+ <xsl:if test="not($recursive)">
+ <xsl:value-of select="$html.ext"/>
+ </xsl:if>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+
+
+<xsl:template match="processing-instruction('dbhtml')">
+ <!-- nop -->
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+
+<xsl:template match="*" mode="find.chunks">
+ <xsl:variable name="chunk">
+ <xsl:call-template name="chunk"/>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="$chunk != 0">
+ <cf:div id="{generate-id()}">
+ <xsl:apply-templates select="." mode="class.attribute"/>
+ <xsl:apply-templates select="*" mode="find.chunks"/>
+ </cf:div>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="*" mode="find.chunks"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xslo:include xmlns:xslo="http://www.w3.org/1999/XSL/Transform" href="../profiling/profile-mode.xsl"/><xslo:variable xmlns:xslo="http://www.w3.org/1999/XSL/Transform" name="profiled-content"><xslo:choose><xslo:when test="*/self::ng:* or */self::db:*"><xslo:message>Note: namesp. cut : stripped namespace before processing</xslo:message><xslo:variable name="stripped-content"><xslo:apply-templates select="/" mode="stripNS"/></xslo:variable><xslo:message>Note: namesp. cut : processing stripped document</xslo:message><xslo:apply-templates select="exslt:node-set($stripped-content)" mode="profile"/></xslo:when><xslo:otherwise><xslo:apply-templates select="/" mode="profile"/></xslo:otherwise></xslo:choose></xslo:variable><xslo:variable xmlns:xslo="http://www.w3.org/1999/XSL/Transform" name="profiled-nodes" select="exslt:node-set($profiled-content)"/><xsl:template match="/">
+ <!-- * Get a title for current doc so that we let the user -->
+ <!-- * know what document we are processing at this point. -->
+ <xsl:variable name="doc.title">
+ <xsl:call-template name="get.doc.title"/>
+ </xsl:variable>
+ <xsl:choose>
+ <!-- Hack! If someone hands us a DocBook V5.x or DocBook NG document,
+ toss the namespace and continue. Use the docbook5 namespaced
+ stylesheets for DocBook5 if you don't want to use this feature.-->
+ <xsl:when test="false()"/>
+ <!-- Can't process unless namespace removed -->
+ <xsl:when test="false()"/>
+ <xsl:otherwise>
+ <xsl:choose>
+ <xsl:when test="$rootid != ''">
+ <xsl:choose>
+ <xsl:when test="count($profiled-nodes//*[@id=$rootid]) = 0">
+ <xsl:message terminate="yes">
+ <xsl:text>ID '</xsl:text>
+ <xsl:value-of select="$rootid"/>
+ <xsl:text>' not found in document.</xsl:text>
+ </xsl:message>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:if test="$collect.xref.targets = 'yes' or $collect.xref.targets = 'only'">
+ <xsl:apply-templates select="key('id', $rootid)" mode="collect.targets"/>
+ </xsl:if>
+ <xsl:if test="$collect.xref.targets != 'only'">
+ <xsl:apply-templates select="$profiled-nodes//*[@id=$rootid]" mode="process.root"/>
+ <xsl:if test="$tex.math.in.alt != ''">
+ <xsl:apply-templates select="$profiled-nodes//*[@id=$rootid]" mode="collect.tex.math"/>
+ </xsl:if>
+ <xsl:if test="$generate.manifest != 0">
+ <xsl:call-template name="generate.manifest">
+ <xsl:with-param name="node" select="key('id',$rootid)"/>
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:if>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:if test="$collect.xref.targets = 'yes' or $collect.xref.targets = 'only'">
+ <xsl:apply-templates select="$profiled-nodes" mode="collect.targets"/>
+ </xsl:if>
+ <xsl:if test="$collect.xref.targets != 'only'">
+ <xsl:apply-templates select="$profiled-nodes" mode="process.root"/>
+ <xsl:if test="$tex.math.in.alt != ''">
+ <xsl:apply-templates select="$profiled-nodes" mode="collect.tex.math"/>
+ </xsl:if>
+ <xsl:if test="$generate.manifest != 0">
+ <xsl:call-template name="generate.manifest">
+ <xsl:with-param name="node" select="$profiled-nodes"/>
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:if>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="*" mode="process.root">
+ <xsl:apply-templates select="."/>
+ <xsl:call-template name="generate.css"/>
+</xsl:template>
+
+<!-- ====================================================================== -->
+
+<xsl:template match="set|book|part|preface|chapter|appendix |article |reference|refentry |book/glossary|article/glossary|part/glossary |book/bibliography|article/bibliography|part/bibliography |colophon">
+ <xsl:choose>
+ <xsl:when test="$onechunk != 0 and parent::*">
+ <xsl:apply-imports/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="process-chunk-element"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="sect1|sect2|sect3|sect4|sect5|section">
+ <xsl:variable name="ischunk">
+ <xsl:call-template name="chunk"/>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="not(parent::*)">
+ <xsl:call-template name="process-chunk-element"/>
+ </xsl:when>
+ <xsl:when test="$ischunk = 0">
+ <xsl:apply-imports/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="process-chunk-element"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="setindex |book/index |article/index |part/index">
+ <!-- some implementations use completely empty index tags to indicate -->
+ <!-- where an automatically generated index should be inserted. so -->
+ <!-- if the index is completely empty, skip it. -->
+ <xsl:if test="count(*)&gt;0 or $generate.index != '0'">
+ <xsl:call-template name="process-chunk-element"/>
+ </xsl:if>
+</xsl:template>
+
+<!-- Resolve xml:base attributes -->
+<xsl:template match="@fileref">
+ <!-- need a check for absolute urls -->
+ <xsl:choose>
+ <xsl:when test="contains(., ':')">
+ <!-- it has a uri scheme so it is an absolute uri -->
+ <xsl:value-of select="."/>
+ </xsl:when>
+ <xsl:when test="$keep.relative.image.uris != 0">
+ <!-- leave it alone -->
+ <xsl:value-of select="."/>
+ </xsl:when>
+ <xsl:otherwise>
+ <!-- its a relative uri -->
+ <xsl:call-template name="relative-uri">
+ <xsl:with-param name="destdir">
+ <xsl:call-template name="dbhtml-dir">
+ <xsl:with-param name="context" select=".."/>
+ </xsl:call-template>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ==================================================================== -->
+<xsl:template match="set|book|part|preface|chapter|appendix |article |reference|refentry |sect1|sect2|sect3|sect4|sect5 |section |book/glossary|article/glossary|part/glossary |book/bibliography|article/bibliography|part/bibliography |colophon" mode="enumerate-files">
+ <xsl:variable name="ischunk"><xsl:call-template name="chunk"/></xsl:variable>
+ <xsl:if test="$ischunk='1'">
+ <xsl:call-template name="make-relative-filename">
+ <xsl:with-param name="base.dir">
+ <xsl:if test="$manifest.in.base.dir = 0">
+ <xsl:value-of select="$base.dir"/>
+ </xsl:if>
+ </xsl:with-param>
+ <xsl:with-param name="base.name">
+ <xsl:apply-templates mode="chunk-filename" select="."/>
+ </xsl:with-param>
+ </xsl:call-template>
+ <xsl:text>
+</xsl:text>
+ </xsl:if>
+ <xsl:apply-templates select="*" mode="enumerate-files"/>
+</xsl:template>
+
+<xsl:template match="book/index|article/index|part/index" mode="enumerate-files">
+ <xsl:if test="$htmlhelp.output != 1">
+ <xsl:variable name="ischunk"><xsl:call-template name="chunk"/></xsl:variable>
+ <xsl:if test="$ischunk='1'">
+ <xsl:call-template name="make-relative-filename">
+ <xsl:with-param name="base.dir">
+ <xsl:if test="$manifest.in.base.dir = 0">
+ <xsl:value-of select="$base.dir"/>
+ </xsl:if>
+ </xsl:with-param>
+ <xsl:with-param name="base.name">
+ <xsl:apply-templates mode="chunk-filename" select="."/>
+ </xsl:with-param>
+ </xsl:call-template>
+ <xsl:text>
+</xsl:text>
+ </xsl:if>
+ <xsl:apply-templates select="*" mode="enumerate-files"/>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="legalnotice" mode="enumerate-files">
+ <xsl:variable name="id"><xsl:call-template name="object.id"/></xsl:variable>
+ <xsl:if test="$generate.legalnotice.link != 0">
+ <xsl:call-template name="make-relative-filename">
+ <xsl:with-param name="base.dir">
+ <xsl:if test="$manifest.in.base.dir = 0">
+ <xsl:value-of select="$base.dir"/>
+ </xsl:if>
+ </xsl:with-param>
+ <xsl:with-param name="base.name">
+ <xsl:apply-templates mode="chunk-filename" select="."/>
+ </xsl:with-param>
+ </xsl:call-template>
+ <xsl:text>
+</xsl:text>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="mediaobject[imageobject] | inlinemediaobject[imageobject]" mode="enumerate-files">
+ <xsl:variable name="longdesc.uri">
+ <xsl:call-template name="longdesc.uri">
+ <xsl:with-param name="mediaobject" select="."/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:variable name="mediaobject" select="."/>
+
+ <xsl:if test="$html.longdesc != 0 and $mediaobject/textobject[not(phrase)]">
+ <xsl:call-template name="longdesc.uri">
+ <xsl:with-param name="mediaobject" select="$mediaobject"/>
+ </xsl:call-template>
+ <xsl:text>
+</xsl:text>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="text()" mode="enumerate-files">
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/profile-chunk.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/profile-chunk.xsl
new file mode 100644
index 0000000..def7fff
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/profile-chunk.xsl
@@ -0,0 +1,52 @@
+<?xml version="1.0" encoding="ASCII"?>
+<!--This file was created automatically by html2xhtml-->
+<!--from the HTML stylesheets.-->
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:exsl="http://exslt.org/common" xmlns="http://www.w3.org/1999/xhtml" version="1.0" exclude-result-prefixes="exsl">
+
+<!-- ********************************************************************
+ $Id: profile-chunk.xsl 6910 2007-06-28 23:23:30Z xmldoc $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<!-- ==================================================================== -->
+
+<!-- First import the non-chunking templates that format elements
+ within each chunk file. In a customization, you should
+ create a separate non-chunking customization layer such
+ as mydocbook.xsl that imports the original docbook.xsl and
+ customizes any presentation templates. Then your chunking
+ customization should import mydocbook.xsl instead of
+ docbook.xsl. -->
+<xsl:import href="docbook.xsl"/>
+
+<!-- chunk-common.xsl contains all the named templates for chunking.
+ In a customization file, you import chunk-common.xsl, then
+ add any customized chunking templates of the same name.
+ They will have import precedence over the original
+ chunking templates in chunk-common.xsl. -->
+<xsl:import href="chunk-common.xsl"/>
+
+<!-- The manifest.xsl module is no longer imported because its
+ templates were moved into chunk-common and chunk-code -->
+
+<!-- chunk-code.xsl contains all the chunking templates that use
+ a match attribute. In a customization it should be referenced
+ using <xsl:include> instead of <xsl:import>, and then add
+ any customized chunking templates with match attributes. But be sure
+ to add a priority="1" to such customized templates to resolve
+ its conflict with the original, since they have the
+ same import precedence.
+
+ Using xsl:include prevents adding another layer
+ of import precedence, which would cause any
+ customizations that use xsl:apply-imports to wrongly
+ apply the chunking version instead of the original
+ non-chunking version to format an element. -->
+<xsl:include href="profile-chunk-code.xsl"/>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/profile-docbook.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/profile-docbook.xsl
new file mode 100644
index 0000000..7ac0219
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/profile-docbook.xsl
@@ -0,0 +1,408 @@
+<?xml version="1.0" encoding="ASCII"?>
+<!--This file was created automatically by html2xhtml-->
+<!--from the HTML stylesheets.-->
+<!--This file was created automatically by xsl2profile-->
+<!--from the DocBook XSL stylesheets.-->
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ng="http://docbook.org/docbook-ng" xmlns:db="http://docbook.org/ns/docbook" xmlns:exsl="http://exslt.org/common" xmlns:exslt="http://exslt.org/common" xmlns="http://www.w3.org/1999/xhtml" exslt:dummy="dummy" ng:dummy="dummy" db:dummy="dummy" extension-element-prefixes="exslt" exclude-result-prefixes="db ng exsl exslt exslt" version="1.0">
+
+<xsl:output method="xml" encoding="UTF-8" indent="no" doctype-public="-//W3C//DTD XHTML 1.1//EN" doctype-system="http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"/>
+
+<!-- ********************************************************************
+ $Id: docbook.xsl 8783 2010-07-28 10:59:39Z mzjn $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<!-- ==================================================================== -->
+
+<xsl:include href="../VERSION"/>
+<xsl:include href="param.xsl"/>
+<xsl:include href="../lib/lib.xsl"/>
+<xsl:include href="../common/l10n.xsl"/>
+<xsl:include href="../common/common.xsl"/>
+<xsl:include href="../common/utility.xsl"/>
+<xsl:include href="../common/labels.xsl"/>
+<xsl:include href="../common/titles.xsl"/>
+<xsl:include href="../common/subtitles.xsl"/>
+<xsl:include href="../common/gentext.xsl"/>
+<xsl:include href="../common/targets.xsl"/>
+<xsl:include href="../common/olink.xsl"/>
+<xsl:include href="../common/pi.xsl"/>
+<xsl:include href="autotoc.xsl"/>
+<xsl:include href="autoidx.xsl"/>
+<xsl:include href="lists.xsl"/>
+<xsl:include href="callout.xsl"/>
+<xsl:include href="verbatim.xsl"/>
+<xsl:include href="graphics.xsl"/>
+<xsl:include href="xref.xsl"/>
+<xsl:include href="formal.xsl"/>
+<xsl:include href="table.xsl"/>
+<xsl:include href="htmltbl.xsl"/>
+<xsl:include href="sections.xsl"/>
+<xsl:include href="inline.xsl"/>
+<xsl:include href="footnote.xsl"/>
+<xsl:include href="html.xsl"/>
+<xsl:include href="info.xsl"/>
+<xsl:include href="keywords.xsl"/>
+<xsl:include href="division.xsl"/>
+<xsl:include href="toc.xsl"/>
+<xsl:include href="index.xsl"/>
+<xsl:include href="refentry.xsl"/>
+<xsl:include href="math.xsl"/>
+<xsl:include href="admon.xsl"/>
+<xsl:include href="component.xsl"/>
+<xsl:include href="biblio.xsl"/>
+<xsl:include href="biblio-iso690.xsl"/>
+<xsl:include href="glossary.xsl"/>
+<xsl:include href="block.xsl"/>
+<xsl:include href="task.xsl"/>
+<xsl:include href="qandaset.xsl"/>
+<xsl:include href="synop.xsl"/>
+<xsl:include href="titlepage.xsl"/>
+<xsl:include href="titlepage.templates.xsl"/>
+<xsl:include href="pi.xsl"/>
+<xsl:include href="ebnf.xsl"/>
+<xsl:include href="chunker.xsl"/>
+<xsl:include href="html-rtf.xsl"/>
+<xsl:include href="annotations.xsl"/>
+<xsl:include href="../common/stripns.xsl"/>
+
+<xsl:param name="stylesheet.result.type" select="'xhtml'"/>
+<xsl:param name="htmlhelp.output" select="0"/>
+
+<!-- ==================================================================== -->
+
+<xsl:key name="id" match="*" use="@id|@xml:id"/>
+<xsl:key name="gid" match="*" use="generate-id()"/>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="*">
+ <xsl:message>
+ <xsl:text>Element </xsl:text>
+ <xsl:value-of select="local-name(.)"/>
+ <xsl:text> in namespace '</xsl:text>
+ <xsl:value-of select="namespace-uri(.)"/>
+ <xsl:text>' encountered</xsl:text>
+ <xsl:if test="parent::*">
+ <xsl:text> in </xsl:text>
+ <xsl:value-of select="name(parent::*)"/>
+ </xsl:if>
+ <xsl:text>, but no template matches.</xsl:text>
+ </xsl:message>
+
+ <span style="color: red">
+ <xsl:text>&lt;</xsl:text>
+ <xsl:value-of select="name(.)"/>
+ <xsl:text>&gt;</xsl:text>
+ <xsl:apply-templates/>
+ <xsl:text>&lt;/</xsl:text>
+ <xsl:value-of select="name(.)"/>
+ <xsl:text>&gt;</xsl:text>
+ </span>
+</xsl:template>
+
+<xsl:template match="text()">
+ <xsl:value-of select="."/>
+</xsl:template>
+
+<xsl:template name="body.attributes">
+<!-- no apply-templates; make it empty -->
+</xsl:template>
+
+<xsl:template name="head.content">
+ <xsl:param name="node" select="."/>
+ <xsl:param name="title">
+ <xsl:apply-templates select="$node" mode="object.title.markup.textonly"/>
+ </xsl:param>
+
+ <title>
+ <xsl:copy-of select="$title"/>
+ </title>
+
+ <xsl:if test="$html.base != ''">
+ <base href="{$html.base}"/>
+ </xsl:if>
+
+ <!-- Insert links to CSS files or insert literal style elements -->
+ <xsl:call-template name="generate.css"/>
+
+ <xsl:if test="$html.stylesheet != ''">
+ <xsl:call-template name="output.html.stylesheets">
+ <xsl:with-param name="stylesheets" select="normalize-space($html.stylesheet)"/>
+ </xsl:call-template>
+ </xsl:if>
+
+ <xsl:if test="$link.mailto.url != ''">
+ <link rev="made" href="{$link.mailto.url}"/>
+ </xsl:if>
+
+ <meta name="generator" content="DocBook {$DistroTitle} V{$VERSION}"/>
+
+ <xsl:if test="$generate.meta.abstract != 0">
+ <xsl:variable name="info" select="(articleinfo |bookinfo |prefaceinfo |chapterinfo |appendixinfo |sectioninfo |sect1info |sect2info |sect3info |sect4info |sect5info |referenceinfo |refentryinfo |partinfo |info |docinfo)[1]"/>
+ <xsl:if test="$info and $info/abstract">
+ <meta name="description">
+ <xsl:attribute name="content">
+ <xsl:for-each select="$info/abstract[1]/*">
+ <xsl:value-of select="normalize-space(.)"/>
+ <xsl:if test="position() &lt; last()">
+ <xsl:text> </xsl:text>
+ </xsl:if>
+ </xsl:for-each>
+ </xsl:attribute>
+ </meta>
+ </xsl:if>
+ </xsl:if>
+
+ <xsl:if test="($draft.mode = 'yes' or ($draft.mode = 'maybe' and ancestor-or-self::*[@status][1]/@status = 'draft')) and $draft.watermark.image != ''">
+ <style type="text/css"><xsl:text>
+body { background-image: url('</xsl:text>
+<xsl:value-of select="$draft.watermark.image"/><xsl:text>');
+ background-repeat: no-repeat;
+ background-position: top left;
+ /* The following properties make the watermark "fixed" on the page. */
+ /* I think that's just a bit too distracting for the reader... */
+ /* background-attachment: fixed; */
+ /* background-position: center center; */
+ }</xsl:text>
+ </style>
+ </xsl:if>
+ <xsl:apply-templates select="." mode="head.keywords.content"/>
+</xsl:template>
+
+<xsl:template name="output.html.stylesheets">
+ <xsl:param name="stylesheets" select="''"/>
+
+ <xsl:choose>
+ <xsl:when test="contains($stylesheets, ' ')">
+ <xsl:variable name="css.filename" select="substring-before($stylesheets, ' ')"/>
+
+ <xsl:call-template name="make.css.link">
+ <xsl:with-param name="css.filename" select="$css.filename"/>
+ </xsl:call-template>
+
+ <xsl:call-template name="output.html.stylesheets">
+ <xsl:with-param name="stylesheets" select="substring-after($stylesheets, ' ')"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="$stylesheets != ''">
+ <xsl:call-template name="make.css.link">
+ <xsl:with-param name="css.filename" select="$stylesheets"/>
+ </xsl:call-template>
+ </xsl:when>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ============================================================ -->
+
+<xsl:template match="*" mode="head.keywords.content">
+ <xsl:apply-templates select="chapterinfo/keywordset" mode="html.header"/>
+ <xsl:apply-templates select="appendixinfo/keywordset" mode="html.header"/>
+ <xsl:apply-templates select="prefaceinfo/keywordset" mode="html.header"/>
+ <xsl:apply-templates select="bookinfo/keywordset" mode="html.header"/>
+ <xsl:apply-templates select="setinfo/keywordset" mode="html.header"/>
+ <xsl:apply-templates select="articleinfo/keywordset" mode="html.header"/>
+ <xsl:apply-templates select="artheader/keywordset" mode="html.header"/>
+ <xsl:apply-templates select="sect1info/keywordset" mode="html.header"/>
+ <xsl:apply-templates select="sect2info/keywordset" mode="html.header"/>
+ <xsl:apply-templates select="sect3info/keywordset" mode="html.header"/>
+ <xsl:apply-templates select="sect4info/keywordset" mode="html.header"/>
+ <xsl:apply-templates select="sect5info/keywordset" mode="html.header"/>
+ <xsl:apply-templates select="sectioninfo/keywordset" mode="html.header"/>
+ <xsl:apply-templates select="refsect1info/keywordset" mode="html.header"/>
+ <xsl:apply-templates select="refsect2info/keywordset" mode="html.header"/>
+ <xsl:apply-templates select="refsect3info/keywordset" mode="html.header"/>
+ <xsl:apply-templates select="bibliographyinfo/keywordset" mode="html.header"/>
+ <xsl:apply-templates select="glossaryinfo/keywordset" mode="html.header"/>
+ <xsl:apply-templates select="indexinfo/keywordset" mode="html.header"/>
+ <xsl:apply-templates select="refentryinfo/keywordset" mode="html.header"/>
+ <xsl:apply-templates select="partinfo/keywordset" mode="html.header"/>
+ <xsl:apply-templates select="referenceinfo/keywordset" mode="html.header"/>
+ <xsl:apply-templates select="docinfo/keywordset" mode="html.header"/>
+ <xsl:apply-templates select="info/keywordset" mode="html.header"/>
+
+ <xsl:if test="$inherit.keywords != 0 and parent::*">
+ <xsl:apply-templates select="parent::*" mode="head.keywords.content"/>
+ </xsl:if>
+</xsl:template>
+
+<!-- ============================================================ -->
+
+<xsl:template name="system.head.content">
+ <xsl:param name="node" select="."/>
+
+ <!-- FIXME: When chunking, only the annotations actually used
+ in this chunk should be referenced. I don't think it
+ does any harm to reference them all, but it adds
+ unnecessary bloat to each chunk. -->
+ <xsl:if test="$annotation.support != 0 and //annotation">
+ <xsl:call-template name="add.annotation.links"/>
+ <script type="text/javascript">
+ <xsl:text>
+// Create PopupWindow objects</xsl:text>
+ <xsl:for-each select="//annotation">
+ <xsl:text>
+var popup_</xsl:text>
+ <xsl:value-of select="generate-id(.)"/>
+ <xsl:text> = new PopupWindow("popup-</xsl:text>
+ <xsl:value-of select="generate-id(.)"/>
+ <xsl:text>");
+</xsl:text>
+ <xsl:text>popup_</xsl:text>
+ <xsl:value-of select="generate-id(.)"/>
+ <xsl:text>.offsetY = 15;
+</xsl:text>
+ <xsl:text>popup_</xsl:text>
+ <xsl:value-of select="generate-id(.)"/>
+ <xsl:text>.autoHide();
+</xsl:text>
+ </xsl:for-each>
+ </script>
+
+ <style type="text/css">
+ <xsl:value-of select="$annotation.css"/>
+ </style>
+ </xsl:if>
+
+ <!-- system.head.content is like user.head.content, except that
+ it is called before head.content. This is important because it
+ means, for example, that <style> elements output by system.head.content
+ have a lower CSS precedence than the users stylesheet. -->
+</xsl:template>
+
+<!-- ============================================================ -->
+
+<xsl:template name="user.preroot">
+ <!-- Pre-root output, can be used to output comments and PIs. -->
+ <!-- This must not output any element content! -->
+</xsl:template>
+
+<xsl:template name="user.head.content">
+ <xsl:param name="node" select="."/>
+</xsl:template>
+
+<xsl:template name="user.header.navigation">
+ <xsl:param name="node" select="."/>
+</xsl:template>
+
+<xsl:template name="user.header.content">
+ <xsl:param name="node" select="."/>
+</xsl:template>
+
+<xsl:template name="user.footer.content">
+ <xsl:param name="node" select="."/>
+</xsl:template>
+
+<xsl:template name="user.footer.navigation">
+ <xsl:param name="node" select="."/>
+</xsl:template>
+
+<xslo:include xmlns:xslo="http://www.w3.org/1999/XSL/Transform" href="../profiling/profile-mode.xsl"/><xslo:variable xmlns:xslo="http://www.w3.org/1999/XSL/Transform" name="profiled-content"><xslo:choose><xslo:when test="*/self::ng:* or */self::db:*"><xslo:message>Note: namesp. cut : stripped namespace before processing</xslo:message><xslo:variable name="stripped-content"><xslo:apply-templates select="/" mode="stripNS"/></xslo:variable><xslo:message>Note: namesp. cut : processing stripped document</xslo:message><xslo:apply-templates select="exslt:node-set($stripped-content)" mode="profile"/></xslo:when><xslo:otherwise><xslo:apply-templates select="/" mode="profile"/></xslo:otherwise></xslo:choose></xslo:variable><xslo:variable xmlns:xslo="http://www.w3.org/1999/XSL/Transform" name="profiled-nodes" select="exslt:node-set($profiled-content)"/><xsl:template match="/">
+ <!-- * Get a title for current doc so that we let the user -->
+ <!-- * know what document we are processing at this point. -->
+ <xsl:variable name="doc.title">
+ <xsl:call-template name="get.doc.title"/>
+ </xsl:variable>
+ <xsl:choose>
+ <!-- Hack! If someone hands us a DocBook V5.x or DocBook NG document,
+ toss the namespace and continue. Use the docbook5 namespaced
+ stylesheets for DocBook5 if you don't want to use this feature.-->
+ <!-- include extra test for Xalan quirk -->
+ <xsl:when test="false()"/>
+ <!-- Can't process unless namespace removed -->
+ <xsl:when test="false()"/>
+ <xsl:otherwise>
+ <xsl:choose>
+ <xsl:when test="$rootid != ''">
+ <xsl:choose>
+ <xsl:when test="count($profiled-nodes//*[@id=$rootid]) = 0">
+ <xsl:message terminate="yes">
+ <xsl:text>ID '</xsl:text>
+ <xsl:value-of select="$rootid"/>
+ <xsl:text>' not found in document.</xsl:text>
+ </xsl:message>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:if test="$collect.xref.targets = 'yes' or $collect.xref.targets = 'only'">
+ <xsl:apply-templates select="key('id', $rootid)" mode="collect.targets"/>
+ </xsl:if>
+ <xsl:if test="$collect.xref.targets != 'only'">
+ <xsl:apply-templates select="$profiled-nodes//*[@id=$rootid]" mode="process.root"/>
+ <xsl:if test="$tex.math.in.alt != ''">
+ <xsl:apply-templates select="$profiled-nodes//*[@id=$rootid]" mode="collect.tex.math"/>
+ </xsl:if>
+ </xsl:if>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:if test="$collect.xref.targets = 'yes' or $collect.xref.targets = 'only'">
+ <xsl:apply-templates select="$profiled-nodes" mode="collect.targets"/>
+ </xsl:if>
+ <xsl:if test="$collect.xref.targets != 'only'">
+ <xsl:apply-templates select="$profiled-nodes" mode="process.root"/>
+ <xsl:if test="$tex.math.in.alt != ''">
+ <xsl:apply-templates select="$profiled-nodes" mode="collect.tex.math"/>
+ </xsl:if>
+ </xsl:if>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="*" mode="process.root">
+ <xsl:variable name="doc" select="self::*"/>
+
+ <xsl:call-template name="user.preroot"/>
+ <xsl:call-template name="root.messages"/>
+
+ <html>
+ <head>
+ <xsl:call-template name="system.head.content">
+ <xsl:with-param name="node" select="$doc"/>
+ </xsl:call-template>
+ <xsl:call-template name="head.content">
+ <xsl:with-param name="node" select="$doc"/>
+ </xsl:call-template>
+ <xsl:call-template name="user.head.content">
+ <xsl:with-param name="node" select="$doc"/>
+ </xsl:call-template>
+ </head>
+ <body>
+ <xsl:call-template name="body.attributes"/>
+ <xsl:call-template name="user.header.content">
+ <xsl:with-param name="node" select="$doc"/>
+ </xsl:call-template>
+ <xsl:apply-templates select="."/>
+ <xsl:call-template name="user.footer.content">
+ <xsl:with-param name="node" select="$doc"/>
+ </xsl:call-template>
+ </body>
+ </html>
+ <xsl:value-of select="$html.append"/>
+
+ <!-- Generate any css files only once, not once per chunk -->
+ <xsl:call-template name="generate.css.files"/>
+</xsl:template>
+
+<xsl:template name="root.messages">
+ <!-- redefine this any way you'd like to output messages -->
+ <!-- DO NOT OUTPUT ANYTHING FROM THIS TEMPLATE -->
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template name="chunk">
+ <xsl:param name="node" select="."/>
+
+ <!-- The default is that we are not chunking... -->
+ <xsl:text>0</xsl:text>
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/profile-onechunk.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/profile-onechunk.xsl
new file mode 100644
index 0000000..b84b3e9
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/profile-onechunk.xsl
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="ASCII"?>
+<!--This file was created automatically by html2xhtml-->
+<!--from the HTML stylesheets.-->
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:doc="http://nwalsh.com/xsl/documentation/1.0" xmlns="http://www.w3.org/1999/xhtml" version="1.0" exclude-result-prefixes="doc">
+
+<!-- ********************************************************************
+ $Id: profile-onechunk.xsl 6910 2007-06-28 23:23:30Z xmldoc $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<!-- ==================================================================== -->
+
+<xsl:import href="profile-chunk.xsl"/>
+
+<!-- Ok, using the onechunk parameter makes this all work again. -->
+<!-- It does have the disadvantage that it only works for documents that have -->
+<!-- a root element that is considered a chunk by the chunk.xsl stylesheet. -->
+<!-- Ideally, onechunk would let anything be a chunk. But not today. -->
+
+<xsl:param name="onechunk" select="1"/>
+<xsl:param name="suppress.navigation">1</xsl:param>
+
+<xsl:template name="href.target.uri">
+ <xsl:param name="object" select="."/>
+ <xsl:text>#</xsl:text>
+ <xsl:call-template name="object.id">
+ <xsl:with-param name="object" select="$object"/>
+ </xsl:call-template>
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/qandaset.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/qandaset.xsl
new file mode 100644
index 0000000..4a61c81
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/qandaset.xsl
@@ -0,0 +1,420 @@
+<?xml version="1.0" encoding="ASCII"?>
+<!--This file was created automatically by html2xhtml-->
+<!--from the HTML stylesheets.-->
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:doc="http://nwalsh.com/xsl/documentation/1.0" xmlns="http://www.w3.org/1999/xhtml" exclude-result-prefixes="doc" version="1.0">
+
+<!-- ********************************************************************
+ $Id: qandaset.xsl 8421 2009-05-04 07:49:49Z bobstayton $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<!-- ==================================================================== -->
+
+<xsl:template match="qandaset">
+ <xsl:variable name="title" select="(blockinfo/title|info/title|title)[1]"/>
+ <xsl:variable name="preamble" select="*[local-name(.) != 'title' and local-name(.) != 'titleabbrev' and local-name(.) != 'qandadiv' and local-name(.) != 'qandaentry']"/>
+ <xsl:variable name="toc">
+ <xsl:call-template name="pi.dbhtml_toc"/>
+ </xsl:variable>
+
+ <xsl:variable name="toc.params">
+ <xsl:call-template name="find.path.params">
+ <xsl:with-param name="table" select="normalize-space($generate.toc)"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <div>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates select="$title"/>
+ <xsl:if test="not($title)">
+ <!-- id is output on title if there is one -->
+ <xsl:call-template name="anchor">
+ <xsl:with-param name="conditional" select="0"/>
+ </xsl:call-template>
+ </xsl:if>
+ <xsl:if test="((contains($toc.params, 'toc') and $toc != '0') or $toc = '1') and not(ancestor::answer and not($qanda.nested.in.toc=0))">
+ <xsl:call-template name="process.qanda.toc"/>
+ </xsl:if>
+ <xsl:apply-templates select="$preamble"/>
+ <xsl:call-template name="process.qandaset"/>
+ </div>
+</xsl:template>
+
+<xsl:template match="qandaset/blockinfo/title| qandaset/info/title| qandaset/title">
+ <xsl:variable name="qalevel">
+ <xsl:call-template name="qanda.section.level"/>
+ </xsl:variable>
+ <xsl:element name="h{string(number($qalevel)+1)}" namespace="http://www.w3.org/1999/xhtml">
+ <xsl:attribute name="class">
+ <xsl:value-of select="local-name(.)"/>
+ </xsl:attribute>
+ <xsl:call-template name="anchor">
+ <xsl:with-param name="node" select=".."/>
+ <xsl:with-param name="conditional" select="0"/>
+ </xsl:call-template>
+ <xsl:apply-templates/>
+ </xsl:element>
+</xsl:template>
+
+<xsl:template match="qandaset/blockinfo|qandaset/info">
+ <!-- what should this template really do? -->
+ <xsl:apply-templates select="legalnotice" mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="qandadiv">
+ <xsl:variable name="preamble" select="*[local-name(.) != 'title' and local-name(.) != 'titleabbrev' and local-name(.) != 'qandadiv' and local-name(.) != 'qandaentry']"/>
+
+ <xsl:if test="blockinfo/title|info/title|title">
+ <tr class="qandadiv">
+ <td align="{$direction.align.start}" valign="top" colspan="2">
+ <xsl:apply-templates select="(blockinfo/title|info/title|title)[1]"/>
+ </td>
+ </tr>
+ </xsl:if>
+
+ <xsl:variable name="toc">
+ <xsl:call-template name="pi.dbhtml_toc"/>
+ </xsl:variable>
+
+ <xsl:variable name="toc.params">
+ <xsl:call-template name="find.path.params">
+ <xsl:with-param name="table" select="normalize-space($generate.toc)"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:if test="(contains($toc.params, 'toc') and $toc != '0') or $toc = '1'">
+ <tr class="toc">
+ <td align="{$direction.align.start}" valign="top" colspan="2">
+ <xsl:call-template name="process.qanda.toc"/>
+ </td>
+ </tr>
+ </xsl:if>
+ <xsl:if test="$preamble">
+ <tr class="toc">
+ <td align="{$direction.align.start}" valign="top" colspan="2">
+ <xsl:apply-templates select="$preamble"/>
+ </td>
+ </tr>
+ </xsl:if>
+ <xsl:apply-templates select="qandadiv|qandaentry"/>
+</xsl:template>
+
+<xsl:template match="qandadiv/blockinfo/title| qandadiv/info/title| qandadiv/title">
+ <xsl:variable name="qalevel">
+ <xsl:call-template name="qandadiv.section.level"/>
+ </xsl:variable>
+
+ <xsl:element name="h{string(number($qalevel)+1)}" namespace="http://www.w3.org/1999/xhtml">
+ <xsl:attribute name="class">
+ <xsl:value-of select="local-name(.)"/>
+ </xsl:attribute>
+ <xsl:call-template name="anchor">
+ <xsl:with-param name="node" select=".."/>
+ <xsl:with-param name="conditional" select="0"/>
+ </xsl:call-template>
+ <xsl:apply-templates select="parent::qandadiv" mode="label.markup"/>
+ <xsl:if test="$qandadiv.autolabel != 0">
+ <xsl:apply-templates select="." mode="intralabel.punctuation"/>
+ <xsl:text> </xsl:text>
+ </xsl:if>
+ <xsl:apply-templates/>
+ </xsl:element>
+</xsl:template>
+
+<xsl:template match="qandaentry">
+ <xsl:apply-templates/>
+</xsl:template>
+
+<xsl:template match="question">
+ <xsl:variable name="deflabel">
+ <xsl:apply-templates select="." mode="qanda.defaultlabel"/>
+ </xsl:variable>
+
+ <tr>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <td align="{$direction.align.start}" valign="top">
+ <xsl:call-template name="anchor">
+ <xsl:with-param name="node" select=".."/>
+ <xsl:with-param name="conditional" select="0"/>
+ </xsl:call-template>
+ <xsl:call-template name="anchor">
+ <xsl:with-param name="conditional" select="0"/>
+ </xsl:call-template>
+
+ <xsl:variable name="label.content">
+ <xsl:apply-templates select="." mode="qanda.label"/>
+ </xsl:variable>
+
+ <xsl:if test="string-length($label.content) &gt; 0">
+ <p><strong xmlns:xslo="http://www.w3.org/1999/XSL/Transform">
+ <xsl:copy-of select="$label.content"/>
+ </strong></p>
+ </xsl:if>
+ </td>
+ <td align="{$direction.align.start}" valign="top">
+ <xsl:choose>
+ <xsl:when test="$deflabel = 'none' and not(label)">
+ <strong xmlns:xslo="http://www.w3.org/1999/XSL/Transform"><xsl:apply-templates select="*[local-name(.) != 'label']"/></strong>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="*[local-name(.) != 'label']"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </td>
+ </tr>
+</xsl:template>
+
+<xsl:template match="*" mode="qanda.defaultlabel">
+ <xsl:choose>
+ <xsl:when test="ancestor-or-self::*[@defaultlabel]">
+ <xsl:value-of select="(ancestor-or-self::*[@defaultlabel])[last()] /@defaultlabel"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$qanda.defaultlabel"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="question" mode="qanda.label">
+ <xsl:variable name="deflabel">
+ <xsl:apply-templates select="." mode="qanda.defaultlabel"/>
+ </xsl:variable>
+ <xsl:apply-templates select="." mode="label.markup"/>
+ <xsl:if test="contains($deflabel, 'number') and not(label)">
+ <xsl:apply-templates select="." mode="intralabel.punctuation"/>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="answer">
+ <xsl:variable name="deflabel">
+ <xsl:apply-templates select="." mode="qanda.defaultlabel"/>
+ </xsl:variable>
+
+ <tr class="{local-name(.)}">
+ <td align="{$direction.align.start}" valign="top">
+ <xsl:call-template name="anchor"/>
+ <xsl:variable name="answer.label">
+ <xsl:apply-templates select="." mode="label.markup"/>
+ </xsl:variable>
+ <xsl:if test="string-length($answer.label) &gt; 0">
+ <p><strong xmlns:xslo="http://www.w3.org/1999/XSL/Transform">
+ <xsl:copy-of select="$answer.label"/>
+ </strong></p>
+ </xsl:if>
+ </td>
+ <td align="{$direction.align.start}" valign="top">
+ <xsl:apply-templates select="*[local-name(.) != 'label' and local-name(.) != 'qandaentry']"/>
+ <!-- * handle nested answer/qandaentry instances -->
+ <!-- * (bug 1509043 from Daniel Leidert) -->
+ <xsl:if test="descendant::question">
+ <xsl:call-template name="process.qandaset"/>
+ </xsl:if>
+ </td>
+ </tr>
+</xsl:template>
+
+<xsl:template match="answer" mode="qanda.label">
+ <xsl:apply-templates select="." mode="label.markup"/>
+</xsl:template>
+
+<xsl:template match="label">
+ <xsl:apply-templates/>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template name="process.qanda.toc">
+ <!-- * if user wants nested qandaset and qandaentry in main Qandaset TOC, -->
+ <!-- * then don't also include the nested stuff in the sub TOCs -->
+ <dl>
+ <xsl:apply-templates select="qandadiv" mode="qandatoc.mode"/>
+ <xsl:apply-templates select="qandaset|qandaentry" mode="qandatoc.mode"/>
+ </dl>
+</xsl:template>
+
+<xsl:template match="qandadiv" mode="qandatoc.mode">
+ <dt><xsl:apply-templates select="title" mode="qandatoc.mode"/></dt>
+ <dd><xsl:call-template name="process.qanda.toc"/></dd>
+</xsl:template>
+
+<xsl:template match="qandadiv/blockinfo/title| qandadiv/info/title| qandadiv/title" mode="qandatoc.mode">
+ <xsl:variable name="qalevel">
+ <xsl:call-template name="qandadiv.section.level"/>
+ </xsl:variable>
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id">
+ <xsl:with-param name="object" select="parent::*"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="div.label">
+ <xsl:apply-templates select="parent::qandadiv" mode="label.markup"/>
+ </xsl:variable>
+ <xsl:if test="string-length($div.label) != 0">
+ <xsl:copy-of select="$div.label"/>
+ <xsl:value-of select="$autotoc.label.separator"/>
+ </xsl:if>
+ <xsl:text> </xsl:text>
+ <a>
+ <xsl:attribute name="href">
+ <xsl:call-template name="href.target">
+ <xsl:with-param name="object" select="parent::*"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:apply-templates/>
+ </a>
+</xsl:template>
+
+<xsl:template match="qandaset" mode="qandatoc.mode">
+ <xsl:for-each select="qandaentry">
+ <xsl:apply-templates select="." mode="qandatoc.mode"/>
+ </xsl:for-each>
+</xsl:template>
+
+<xsl:template match="qandaentry" mode="qandatoc.mode">
+ <xsl:apply-templates select="question" mode="qandatoc.mode"/>
+</xsl:template>
+
+<xsl:template match="question" mode="qandatoc.mode">
+ <xsl:variable name="firstch">
+ <!-- Use a titleabbrev or title if available -->
+ <xsl:choose>
+ <xsl:when test="../blockinfo/titleabbrev">
+ <xsl:apply-templates select="../blockinfo/titleabbrev[1]/node()"/>
+ </xsl:when>
+ <xsl:when test="../blockinfo/title">
+ <xsl:apply-templates select="../blockinfo/title[1]/node()"/>
+ </xsl:when>
+ <xsl:when test="../info/titleabbrev">
+ <xsl:apply-templates select="../info/titleabbrev[1]/node()"/>
+ </xsl:when>
+ <xsl:when test="../titleabbrev">
+ <xsl:apply-templates select="../titleabbrev[1]/node()"/>
+ </xsl:when>
+ <xsl:when test="../info/title">
+ <xsl:apply-templates select="../info/title[1]/node()"/>
+ </xsl:when>
+ <xsl:when test="../title">
+ <xsl:apply-templates select="../title[1]/node()"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="(*[local-name(.)!='label'])[1]/node()"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:variable name="deflabel">
+ <xsl:choose>
+ <xsl:when test="ancestor-or-self::*[@defaultlabel]">
+ <xsl:value-of select="(ancestor-or-self::*[@defaultlabel])[last()] /@defaultlabel"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$qanda.defaultlabel"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <dt>
+ <xsl:apply-templates select="." mode="label.markup"/>
+ <xsl:if test="contains($deflabel,'number') and not(label)">
+ <xsl:apply-templates select="." mode="intralabel.punctuation"/>
+ </xsl:if>
+ <xsl:text> </xsl:text>
+ <a>
+ <xsl:attribute name="href">
+ <xsl:call-template name="href.target">
+ <xsl:with-param name="object" select=".."/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:value-of select="$firstch"/>
+ </a>
+ </dt>
+ <!-- * include nested qandaset/qandaentry in TOC if user wants it -->
+ <xsl:if test="not($qanda.nested.in.toc = 0)">
+ <xsl:apply-templates select="following-sibling::answer" mode="qandatoc.mode"/>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="answer" mode="qandatoc.mode">
+ <xsl:if test="descendant::question">
+ <dd>
+ <xsl:call-template name="process.qanda.toc"/>
+ </dd>
+ </xsl:if>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template name="process.qandaset">
+
+ <xsl:variable name="deflabel">
+ <xsl:apply-templates select="." mode="qanda.defaultlabel"/>
+ </xsl:variable>
+
+ <xsl:variable name="label-width">
+ <xsl:call-template name="pi.dbhtml_label-width"/>
+ </xsl:variable>
+
+ <xsl:variable name="table-summary">
+ <xsl:call-template name="pi.dbhtml_table-summary"/>
+ </xsl:variable>
+
+ <xsl:variable name="cellpadding">
+ <xsl:call-template name="pi.dbhtml_cellpadding"/>
+ </xsl:variable>
+
+ <xsl:variable name="cellspacing">
+ <xsl:call-template name="pi.dbhtml_cellspacing"/>
+ </xsl:variable>
+
+ <table border="0" width="100%" summary="Q and A Set">
+ <xsl:if test="$table-summary != ''">
+ <xsl:attribute name="summary">
+ <xsl:value-of select="$table-summary"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:if test="$cellpadding != ''">
+ <xsl:attribute name="cellpadding">
+ <xsl:value-of select="$cellpadding"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:if test="$cellspacing != ''">
+ <xsl:attribute name="cellspacing">
+ <xsl:value-of select="$cellspacing"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <col align="{$direction.align.start}">
+ <xsl:attribute name="width">
+ <xsl:choose>
+ <xsl:when test="$label-width != ''">
+ <xsl:value-of select="$label-width"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text>1%</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:attribute>
+ </col>
+ <col/>
+ <tbody>
+ <xsl:apply-templates select="qandaentry|qandadiv"/>
+ </tbody>
+ </table>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="*" mode="no.wrapper.mode">
+ <xsl:apply-templates/>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/refentry.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/refentry.xsl
new file mode 100644
index 0000000..dc2e57d
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/refentry.xsl
@@ -0,0 +1,299 @@
+<?xml version="1.0" encoding="ASCII"?>
+<!--This file was created automatically by html2xhtml-->
+<!--from the HTML stylesheets.-->
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1999/xhtml" version="1.0">
+
+<!-- ********************************************************************
+ $Id: refentry.xsl 8421 2009-05-04 07:49:49Z bobstayton $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<!-- ==================================================================== -->
+
+<xsl:template match="reference">
+ <xsl:call-template name="id.warning"/>
+
+ <div>
+ <xsl:call-template name="common.html.attributes">
+ <xsl:with-param name="inherit" select="1"/>
+ </xsl:call-template>
+ <xsl:if test="$generate.id.attributes != 0">
+ <xsl:attribute name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:call-template name="reference.titlepage"/>
+
+ <xsl:variable name="toc.params">
+ <xsl:call-template name="find.path.params">
+ <xsl:with-param name="table" select="normalize-space($generate.toc)"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:if test="not(partintro) and contains($toc.params, 'toc')">
+ <xsl:call-template name="division.toc"/>
+ </xsl:if>
+ <xsl:apply-templates/>
+ </div>
+</xsl:template>
+
+<xsl:template match="reference" mode="division.number">
+ <xsl:number from="book" count="reference" format="I."/>
+</xsl:template>
+
+<xsl:template match="reference/docinfo"/>
+<xsl:template match="reference/referenceinfo"/>
+<xsl:template match="reference/title"/>
+<xsl:template match="reference/subtitle"/>
+<xsl:template match="reference/titleabbrev"/>
+
+<!-- ==================================================================== -->
+
+<xsl:template name="refentry.title">
+ <xsl:param name="node" select="."/>
+ <xsl:variable name="refmeta" select="$node//refmeta"/>
+ <xsl:variable name="refentrytitle" select="$refmeta//refentrytitle"/>
+ <xsl:variable name="refnamediv" select="$node//refnamediv"/>
+ <xsl:variable name="refname" select="$refnamediv//refname"/>
+ <xsl:variable name="refdesc" select="$refnamediv//refdescriptor"/>
+ <xsl:variable name="title">
+ <xsl:choose>
+ <xsl:when test="$refentrytitle">
+ <xsl:apply-templates select="$refentrytitle[1]" mode="title"/>
+ </xsl:when>
+ <xsl:when test="$refdesc">
+ <xsl:apply-templates select="$refdesc[1]" mode="title"/>
+ </xsl:when>
+ <xsl:when test="$refname">
+ <xsl:apply-templates select="$refname[1]" mode="title"/>
+ </xsl:when>
+ <xsl:otherwise/>
+ </xsl:choose>
+ </xsl:variable>
+
+ <h1 class="title">
+ <xsl:copy-of select="$title"/>
+ </h1>
+</xsl:template>
+
+<xsl:template match="refentry">
+ <xsl:call-template name="id.warning"/>
+
+ <div>
+ <xsl:call-template name="common.html.attributes">
+ <xsl:with-param name="inherit" select="1"/>
+ </xsl:call-template>
+ <xsl:if test="$refentry.separator != 0 and preceding-sibling::refentry">
+ <div class="refentry.separator">
+ <hr/>
+ </div>
+ </xsl:if>
+ <xsl:call-template name="anchor">
+ <xsl:with-param name="conditional" select="0"/>
+ </xsl:call-template>
+ <xsl:call-template name="refentry.titlepage"/>
+ <xsl:apply-templates/>
+ <xsl:call-template name="process.footnotes"/>
+ </div>
+</xsl:template>
+
+<xsl:template match="refentry/docinfo|refentry/refentryinfo"/>
+<xsl:template match="refentry/info"/>
+
+<xsl:template match="refentrytitle|refname|refdescriptor" mode="title">
+ <xsl:apply-templates/>
+</xsl:template>
+
+<xsl:template match="refmeta">
+</xsl:template>
+
+<xsl:template match="manvolnum">
+ <xsl:if test="$refentry.xref.manvolnum != 0">
+ <xsl:text>(</xsl:text>
+ <xsl:apply-templates/>
+ <xsl:text>)</xsl:text>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="refmiscinfo">
+</xsl:template>
+
+<xsl:template match="refentrytitle">
+ <xsl:call-template name="inline.charseq"/>
+</xsl:template>
+
+<xsl:template match="refnamediv">
+ <div>
+ <xsl:call-template name="common.html.attributes">
+ <xsl:with-param name="inherit" select="1"/>
+ </xsl:call-template>
+ <xsl:call-template name="anchor"/>
+
+ <xsl:choose>
+ <xsl:when test="preceding-sibling::refnamediv">
+ <!-- no title on secondary refnamedivs! -->
+ </xsl:when>
+ <xsl:when test="$refentry.generate.name != 0">
+ <h2>
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'RefName'"/>
+ </xsl:call-template>
+ </h2>
+ </xsl:when>
+ <xsl:when test="$refentry.generate.title != 0">
+ <h2>
+ <xsl:choose>
+ <xsl:when test="../refmeta/refentrytitle">
+ <xsl:apply-templates select="../refmeta/refentrytitle"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="refname[1]"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </h2>
+ </xsl:when>
+ </xsl:choose>
+
+ <p>
+ <xsl:apply-templates/>
+ </p>
+ </div>
+</xsl:template>
+
+<xsl:template match="refname">
+ <xsl:if test="not(preceding-sibling::refdescriptor)">
+ <xsl:apply-templates/>
+ <xsl:if test="following-sibling::refname">
+ <xsl:text>, </xsl:text>
+ </xsl:if>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="refpurpose">
+ <xsl:if test="node()">
+ <xsl:text> </xsl:text>
+ <xsl:call-template name="dingbat">
+ <xsl:with-param name="dingbat">em-dash</xsl:with-param>
+ </xsl:call-template>
+ <xsl:text> </xsl:text>
+ <xsl:apply-templates/>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="refdescriptor">
+ <xsl:apply-templates/>
+</xsl:template>
+
+<xsl:template match="refclass">
+ <xsl:if test="$refclass.suppress = 0">
+ <strong xmlns:xslo="http://www.w3.org/1999/XSL/Transform">
+ <xsl:if test="@role">
+ <xsl:value-of select="@role"/>
+ <xsl:text>: </xsl:text>
+ </xsl:if>
+ <xsl:apply-templates/>
+ </strong>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="refsynopsisdiv">
+ <div>
+ <xsl:call-template name="common.html.attributes">
+ <xsl:with-param name="inherit" select="1"/>
+ </xsl:call-template>
+ <xsl:call-template name="anchor"/>
+ <h2>
+ <xsl:choose>
+ <xsl:when test="refsynopsisdiv/title|title">
+ <xsl:apply-templates select="(refsynopsisdiv/title|title)[1]" mode="titlepage.mode"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'RefSynopsisDiv'"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </h2>
+ <xsl:apply-templates/>
+ </div>
+</xsl:template>
+
+<xsl:template match="refsynopsisdivinfo"/>
+
+<xsl:template match="refsynopsisdiv/title">
+</xsl:template>
+
+<xsl:template match="refsynopsisdiv/title" mode="titlepage.mode">
+ <xsl:apply-templates/>
+</xsl:template>
+
+<xsl:template match="refsection|refsect1|refsect2|refsect3">
+ <div>
+ <xsl:call-template name="common.html.attributes">
+ <xsl:with-param name="inherit" select="1"/>
+ </xsl:call-template>
+ <xsl:call-template name="anchor">
+ <xsl:with-param name="conditional" select="0"/>
+ </xsl:call-template>
+ <!-- pick up info title -->
+ <xsl:apply-templates select="(title|info/title)[1]"/>
+ <xsl:apply-templates select="node()[not(self::title) and not(self::info)]"/>
+ </div>
+</xsl:template>
+
+<xsl:template match="refsection/title|refsection/info/title">
+ <!-- the ID is output in the block.object call for refsect1 -->
+ <xsl:variable name="level" select="count(ancestor-or-self::refsection)"/>
+ <xsl:variable name="refsynopsisdiv">
+ <xsl:text>0</xsl:text>
+ <xsl:if test="ancestor::refsynopsisdiv">1</xsl:if>
+ </xsl:variable>
+ <xsl:variable name="hlevel">
+ <xsl:choose>
+ <xsl:when test="$level+$refsynopsisdiv &gt; 5">6</xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$level+1+$refsynopsisdiv"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:element name="h{$hlevel}" namespace="http://www.w3.org/1999/xhtml">
+ <xsl:apply-templates/>
+ </xsl:element>
+</xsl:template>
+
+<xsl:template match="refsect1/title|refsect1/info/title">
+ <!-- the ID is output in the block.object call for refsect1 -->
+ <h2>
+ <xsl:apply-templates/>
+ </h2>
+</xsl:template>
+
+<xsl:template match="refsect2/title|refsect2/info/title">
+ <!-- the ID is output in the block.object call for refsect2 -->
+ <h3>
+ <xsl:apply-templates/>
+ </h3>
+</xsl:template>
+
+<xsl:template match="refsect3/title|refsect3/info/title">
+ <!-- the ID is output in the block.object call for refsect3 -->
+ <h4>
+ <xsl:apply-templates/>
+ </h4>
+</xsl:template>
+
+<xsl:template match="refsectioninfo|refsection/info"/>
+<xsl:template match="refsect1info|refsect1/info"/>
+<xsl:template match="refsect2info|refsect2/info"/>
+<xsl:template match="refsect3info|refsect3/info"/>
+
+
+<!-- ==================================================================== -->
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/sections.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/sections.xsl
new file mode 100644
index 0000000..aec647d
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/sections.xsl
@@ -0,0 +1,541 @@
+<?xml version="1.0" encoding="ASCII"?>
+<!--This file was created automatically by html2xhtml-->
+<!--from the HTML stylesheets.-->
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1999/xhtml" version="1.0">
+
+<!-- ********************************************************************
+ $Id: sections.xsl 8421 2009-05-04 07:49:49Z bobstayton $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<!-- ==================================================================== -->
+
+<xsl:template match="section">
+ <xsl:variable name="depth" select="count(ancestor::section)+1"/>
+
+ <xsl:call-template name="id.warning"/>
+
+ <div>
+ <xsl:call-template name="common.html.attributes">
+ <xsl:with-param name="inherit" select="1"/>
+ </xsl:call-template>
+ <xsl:call-template name="section.titlepage"/>
+
+ <xsl:variable name="toc.params">
+ <xsl:call-template name="find.path.params">
+ <xsl:with-param name="table" select="normalize-space($generate.toc)"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:if test="contains($toc.params, 'toc') and $depth &lt;= $generate.section.toc.level">
+ <xsl:call-template name="section.toc">
+ <xsl:with-param name="toc.title.p" select="contains($toc.params, 'title')"/>
+ </xsl:call-template>
+ <xsl:call-template name="section.toc.separator"/>
+ </xsl:if>
+ <xsl:apply-templates/>
+ <xsl:call-template name="process.chunk.footnotes"/>
+ </div>
+</xsl:template>
+
+<xsl:template name="section.title">
+ <!-- the context node should be the title of a section when called -->
+ <xsl:variable name="section" select="(ancestor::section |ancestor::simplesect |ancestor::sect1 |ancestor::sect2 |ancestor::sect3 |ancestor::sect4 |ancestor::sect5)[last()]"/>
+
+ <xsl:variable name="renderas">
+ <xsl:choose>
+ <xsl:when test="$section/@renderas = 'sect1'">1</xsl:when>
+ <xsl:when test="$section/@renderas = 'sect2'">2</xsl:when>
+ <xsl:when test="$section/@renderas = 'sect3'">3</xsl:when>
+ <xsl:when test="$section/@renderas = 'sect4'">4</xsl:when>
+ <xsl:when test="$section/@renderas = 'sect5'">5</xsl:when>
+ <xsl:otherwise><xsl:value-of select="''"/></xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="level">
+ <xsl:choose>
+ <xsl:when test="$renderas != ''">
+ <xsl:value-of select="$renderas"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="section.level">
+ <xsl:with-param name="node" select="$section"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:call-template name="section.heading">
+ <xsl:with-param name="section" select="$section"/>
+ <xsl:with-param name="level" select="$level"/>
+ <xsl:with-param name="title">
+ <xsl:apply-templates select="$section" mode="object.title.markup">
+ <xsl:with-param name="allow-anchors" select="1"/>
+ </xsl:apply-templates>
+ </xsl:with-param>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="section/title |section/info/title |sectioninfo/title" mode="titlepage.mode" priority="2">
+ <xsl:call-template name="section.title"/>
+</xsl:template>
+
+<xsl:template match="sect1">
+ <xsl:call-template name="id.warning"/>
+
+ <div>
+ <xsl:call-template name="common.html.attributes">
+ <xsl:with-param name="inherit" select="1"/>
+ </xsl:call-template>
+
+ <xsl:choose>
+ <xsl:when test="@renderas = 'sect2'">
+ <xsl:call-template name="sect2.titlepage"/>
+ </xsl:when>
+ <xsl:when test="@renderas = 'sect3'">
+ <xsl:call-template name="sect3.titlepage"/>
+ </xsl:when>
+ <xsl:when test="@renderas = 'sect4'">
+ <xsl:call-template name="sect4.titlepage"/>
+ </xsl:when>
+ <xsl:when test="@renderas = 'sect5'">
+ <xsl:call-template name="sect5.titlepage"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="sect1.titlepage"/>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:variable name="toc.params">
+ <xsl:call-template name="find.path.params">
+ <xsl:with-param name="table" select="normalize-space($generate.toc)"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:if test="contains($toc.params, 'toc') and $generate.section.toc.level &gt;= 1">
+ <xsl:call-template name="section.toc">
+ <xsl:with-param name="toc.title.p" select="contains($toc.params, 'title')"/>
+ </xsl:call-template>
+ <xsl:call-template name="section.toc.separator"/>
+ </xsl:if>
+ <xsl:apply-templates/>
+ <xsl:call-template name="process.chunk.footnotes"/>
+ </div>
+</xsl:template>
+
+<xsl:template match="sect1/title |sect1/info/title |sect1info/title" mode="titlepage.mode" priority="2">
+ <xsl:call-template name="section.title"/>
+</xsl:template>
+
+<xsl:template match="sect2">
+ <xsl:call-template name="id.warning"/>
+
+ <div>
+ <xsl:call-template name="common.html.attributes">
+ <xsl:with-param name="inherit" select="1"/>
+ </xsl:call-template>
+
+ <xsl:choose>
+ <xsl:when test="@renderas = 'sect1'">
+ <xsl:call-template name="sect1.titlepage"/>
+ </xsl:when>
+ <xsl:when test="@renderas = 'sect3'">
+ <xsl:call-template name="sect3.titlepage"/>
+ </xsl:when>
+ <xsl:when test="@renderas = 'sect4'">
+ <xsl:call-template name="sect4.titlepage"/>
+ </xsl:when>
+ <xsl:when test="@renderas = 'sect5'">
+ <xsl:call-template name="sect5.titlepage"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="sect2.titlepage"/>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:variable name="toc.params">
+ <xsl:call-template name="find.path.params">
+ <xsl:with-param name="table" select="normalize-space($generate.toc)"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:if test="contains($toc.params, 'toc') and $generate.section.toc.level &gt;= 2">
+ <xsl:call-template name="section.toc">
+ <xsl:with-param name="toc.title.p" select="contains($toc.params, 'title')"/>
+ </xsl:call-template>
+ <xsl:call-template name="section.toc.separator"/>
+ </xsl:if>
+ <xsl:apply-templates/>
+ <xsl:call-template name="process.chunk.footnotes"/>
+ </div>
+</xsl:template>
+
+<xsl:template match="sect2/title |sect2/info/title |sect2info/title" mode="titlepage.mode" priority="2">
+ <xsl:call-template name="section.title"/>
+</xsl:template>
+
+<xsl:template match="sect3">
+ <xsl:call-template name="id.warning"/>
+
+ <div>
+ <xsl:call-template name="common.html.attributes">
+ <xsl:with-param name="inherit" select="1"/>
+ </xsl:call-template>
+
+ <xsl:choose>
+ <xsl:when test="@renderas = 'sect1'">
+ <xsl:call-template name="sect1.titlepage"/>
+ </xsl:when>
+ <xsl:when test="@renderas = 'sect2'">
+ <xsl:call-template name="sect2.titlepage"/>
+ </xsl:when>
+ <xsl:when test="@renderas = 'sect4'">
+ <xsl:call-template name="sect4.titlepage"/>
+ </xsl:when>
+ <xsl:when test="@renderas = 'sect5'">
+ <xsl:call-template name="sect5.titlepage"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="sect3.titlepage"/>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:variable name="toc.params">
+ <xsl:call-template name="find.path.params">
+ <xsl:with-param name="table" select="normalize-space($generate.toc)"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:if test="contains($toc.params, 'toc') and $generate.section.toc.level &gt;= 3">
+ <xsl:call-template name="section.toc">
+ <xsl:with-param name="toc.title.p" select="contains($toc.params, 'title')"/>
+ </xsl:call-template>
+ <xsl:call-template name="section.toc.separator"/>
+ </xsl:if>
+ <xsl:apply-templates/>
+ <xsl:call-template name="process.chunk.footnotes"/>
+ </div>
+</xsl:template>
+
+<xsl:template match="sect3/title |sect3/info/title |sect3info/title" mode="titlepage.mode" priority="2">
+ <xsl:call-template name="section.title"/>
+</xsl:template>
+
+<xsl:template match="sect4">
+ <xsl:call-template name="id.warning"/>
+
+ <div>
+ <xsl:call-template name="common.html.attributes">
+ <xsl:with-param name="inherit" select="1"/>
+ </xsl:call-template>
+
+ <xsl:choose>
+ <xsl:when test="@renderas = 'sect1'">
+ <xsl:call-template name="sect1.titlepage"/>
+ </xsl:when>
+ <xsl:when test="@renderas = 'sect2'">
+ <xsl:call-template name="sect2.titlepage"/>
+ </xsl:when>
+ <xsl:when test="@renderas = 'sect3'">
+ <xsl:call-template name="sect3.titlepage"/>
+ </xsl:when>
+ <xsl:when test="@renderas = 'sect5'">
+ <xsl:call-template name="sect5.titlepage"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="sect4.titlepage"/>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:variable name="toc.params">
+ <xsl:call-template name="find.path.params">
+ <xsl:with-param name="table" select="normalize-space($generate.toc)"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:if test="contains($toc.params, 'toc') and $generate.section.toc.level &gt;= 4">
+ <xsl:call-template name="section.toc">
+ <xsl:with-param name="toc.title.p" select="contains($toc.params, 'title')"/>
+ </xsl:call-template>
+ <xsl:call-template name="section.toc.separator"/>
+ </xsl:if>
+ <xsl:apply-templates/>
+ <xsl:call-template name="process.chunk.footnotes"/>
+ </div>
+</xsl:template>
+
+<xsl:template match="sect4/title |sect4/info/title |sect4info/title" mode="titlepage.mode" priority="2">
+ <xsl:call-template name="section.title"/>
+</xsl:template>
+
+<xsl:template match="sect5">
+ <xsl:call-template name="id.warning"/>
+
+ <div>
+ <xsl:call-template name="common.html.attributes">
+ <xsl:with-param name="inherit" select="1"/>
+ </xsl:call-template>
+
+ <xsl:choose>
+ <xsl:when test="@renderas = 'sect1'">
+ <xsl:call-template name="sect1.titlepage"/>
+ </xsl:when>
+ <xsl:when test="@renderas = 'sect2'">
+ <xsl:call-template name="sect2.titlepage"/>
+ </xsl:when>
+ <xsl:when test="@renderas = 'sect3'">
+ <xsl:call-template name="sect3.titlepage"/>
+ </xsl:when>
+ <xsl:when test="@renderas = 'sect4'">
+ <xsl:call-template name="sect4.titlepage"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="sect5.titlepage"/>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:variable name="toc.params">
+ <xsl:call-template name="find.path.params">
+ <xsl:with-param name="table" select="normalize-space($generate.toc)"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:if test="contains($toc.params, 'toc') and $generate.section.toc.level &gt;= 5">
+ <xsl:call-template name="section.toc">
+ <xsl:with-param name="toc.title.p" select="contains($toc.params, 'title')"/>
+ </xsl:call-template>
+ <xsl:call-template name="section.toc.separator"/>
+ </xsl:if>
+ <xsl:apply-templates/>
+ <xsl:call-template name="process.chunk.footnotes"/>
+ </div>
+</xsl:template>
+
+<xsl:template match="sect5/title |sect5/info/title |sect5info/title" mode="titlepage.mode" priority="2">
+ <xsl:call-template name="section.title"/>
+</xsl:template>
+
+<xsl:template match="simplesect">
+ <xsl:call-template name="id.warning"/>
+
+ <div>
+ <xsl:call-template name="common.html.attributes">
+ <xsl:with-param name="inherit" select="1"/>
+ </xsl:call-template>
+
+ <xsl:call-template name="simplesect.titlepage"/>
+ <xsl:apply-templates/>
+ </div>
+</xsl:template>
+
+<xsl:template match="simplesect/title|simplesect/info/title" mode="titlepage.mode" priority="2">
+ <xsl:call-template name="section.title"/>
+</xsl:template>
+
+<xsl:template match="section/title"/>
+<xsl:template match="section/titleabbrev"/>
+<xsl:template match="section/subtitle"/>
+<xsl:template match="sectioninfo"/>
+<xsl:template match="section/info"/>
+
+<xsl:template match="sect1/title"/>
+<xsl:template match="sect1/titleabbrev"/>
+<xsl:template match="sect1/subtitle"/>
+<xsl:template match="sect1info"/>
+<xsl:template match="sect1/info"/>
+
+<xsl:template match="sect2/title"/>
+<xsl:template match="sect2/subtitle"/>
+<xsl:template match="sect2/titleabbrev"/>
+<xsl:template match="sect2info"/>
+<xsl:template match="sect2/info"/>
+
+<xsl:template match="sect3/title"/>
+<xsl:template match="sect3/subtitle"/>
+<xsl:template match="sect3/titleabbrev"/>
+<xsl:template match="sect3info"/>
+<xsl:template match="sect3/info"/>
+
+<xsl:template match="sect4/title"/>
+<xsl:template match="sect4/subtitle"/>
+<xsl:template match="sect4/titleabbrev"/>
+<xsl:template match="sect4info"/>
+<xsl:template match="sect4/info"/>
+
+<xsl:template match="sect5/title"/>
+<xsl:template match="sect5/subtitle"/>
+<xsl:template match="sect5/titleabbrev"/>
+<xsl:template match="sect5info"/>
+<xsl:template match="sect5/info"/>
+
+<xsl:template match="simplesect/title"/>
+<xsl:template match="simplesect/subtitle"/>
+<xsl:template match="simplesect/titleabbrev"/>
+<xsl:template match="simplesect/info"/>
+
+<!-- ==================================================================== -->
+
+<xsl:template name="section.heading">
+ <xsl:param name="section" select="."/>
+ <xsl:param name="level" select="1"/>
+ <xsl:param name="allow-anchors" select="1"/>
+ <xsl:param name="title"/>
+ <xsl:param name="class" select="'title'"/>
+
+ <xsl:variable name="id">
+ <xsl:choose>
+ <!-- Make sure the subtitle doesn't get the same id as the title -->
+ <xsl:when test="self::subtitle">
+ <xsl:call-template name="object.id">
+ <xsl:with-param name="object" select="."/>
+ </xsl:call-template>
+ </xsl:when>
+ <!-- if title is in an *info wrapper, get the grandparent -->
+ <xsl:when test="contains(local-name(..), 'info')">
+ <xsl:call-template name="object.id">
+ <xsl:with-param name="object" select="../.."/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="object.id">
+ <xsl:with-param name="object" select=".."/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <!-- HTML H level is one higher than section level -->
+ <xsl:variable name="hlevel">
+ <xsl:choose>
+ <!-- highest valid HTML H level is H6; so anything nested deeper
+ than 5 levels down just becomes H6 -->
+ <xsl:when test="$level &gt; 5">6</xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$level + 1"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:element name="h{$hlevel}" namespace="http://www.w3.org/1999/xhtml">
+ <xsl:attribute name="class"><xsl:value-of select="$class"/></xsl:attribute>
+ <xsl:if test="$css.decoration != '0'">
+ <xsl:if test="$hlevel&lt;3">
+ <xsl:attribute name="style">clear: both</xsl:attribute>
+ </xsl:if>
+ </xsl:if>
+ <xsl:if test="$allow-anchors != 0 and $generate.id.attributes = 0">
+ <xsl:call-template name="anchor">
+ <xsl:with-param name="node" select="$section"/>
+ <xsl:with-param name="conditional" select="0"/>
+ </xsl:call-template>
+ </xsl:if>
+ <xsl:if test="$generate.id.attributes != 0 and not(local-name(.) = 'appendix')">
+ <xsl:attribute name="id"><xsl:value-of select="$id"/></xsl:attribute>
+ </xsl:if>
+ <xsl:copy-of select="$title"/>
+ </xsl:element>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="bridgehead">
+ <xsl:variable name="container" select="(ancestor::appendix |ancestor::article |ancestor::bibliography |ancestor::chapter |ancestor::glossary |ancestor::glossdiv |ancestor::index |ancestor::partintro |ancestor::preface |ancestor::refsect1 |ancestor::refsect2 |ancestor::refsect3 |ancestor::sect1 |ancestor::sect2 |ancestor::sect3 |ancestor::sect4 |ancestor::sect5 |ancestor::section |ancestor::setindex |ancestor::simplesect)[last()]"/>
+
+ <xsl:variable name="clevel">
+ <xsl:choose>
+ <xsl:when test="local-name($container) = 'appendix' or local-name($container) = 'chapter' or local-name($container) = 'article' or local-name($container) = 'bibliography' or local-name($container) = 'glossary' or local-name($container) = 'index' or local-name($container) = 'partintro' or local-name($container) = 'preface' or local-name($container) = 'setindex'">1</xsl:when>
+ <xsl:when test="local-name($container) = 'glossdiv'">
+ <xsl:value-of select="count(ancestor::glossdiv)+1"/>
+ </xsl:when>
+ <xsl:when test="local-name($container) = 'sect1' or local-name($container) = 'sect2' or local-name($container) = 'sect3' or local-name($container) = 'sect4' or local-name($container) = 'sect5' or local-name($container) = 'refsect1' or local-name($container) = 'refsect2' or local-name($container) = 'refsect3' or local-name($container) = 'section' or local-name($container) = 'simplesect'">
+ <xsl:variable name="slevel">
+ <xsl:call-template name="section.level">
+ <xsl:with-param name="node" select="$container"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:value-of select="$slevel + 1"/>
+ </xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <!-- HTML H level is one higher than section level -->
+ <xsl:variable name="hlevel">
+ <xsl:choose>
+ <xsl:when test="@renderas = 'sect1'">2</xsl:when>
+ <xsl:when test="@renderas = 'sect2'">3</xsl:when>
+ <xsl:when test="@renderas = 'sect3'">4</xsl:when>
+ <xsl:when test="@renderas = 'sect4'">5</xsl:when>
+ <xsl:when test="@renderas = 'sect5'">6</xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$clevel + 1"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:element name="h{$hlevel}" namespace="http://www.w3.org/1999/xhtml">
+ <xsl:call-template name="anchor">
+ <xsl:with-param name="conditional" select="0"/>
+ </xsl:call-template>
+ <xsl:apply-templates/>
+ </xsl:element>
+</xsl:template>
+
+<xsl:template match="section/subtitle" mode="titlepage.mode" priority="2">
+ <xsl:call-template name="section.subtitle"/>
+</xsl:template>
+
+<xsl:template match="simplesect/subtitle" mode="titlepage.mode" priority="2">
+ <xsl:call-template name="section.subtitle"/>
+</xsl:template>
+
+<xsl:template match="sect1/subtitle" mode="titlepage.mode" priority="2">
+ <xsl:call-template name="section.subtitle"/>
+</xsl:template>
+
+<xsl:template match="sect2/subtitle" mode="titlepage.mode" priority="2">
+ <xsl:call-template name="section.subtitle"/>
+</xsl:template>
+
+<xsl:template match="sect3/subtitle" mode="titlepage.mode" priority="2">
+ <xsl:call-template name="section.subtitle"/>
+</xsl:template>
+
+<xsl:template match="sect4/subtitle" mode="titlepage.mode" priority="2">
+ <xsl:call-template name="section.subtitle"/>
+</xsl:template>
+
+<xsl:template match="sect5/subtitle" mode="titlepage.mode" priority="2">
+ <xsl:call-template name="section.subtitle"/>
+</xsl:template>
+
+<xsl:template name="section.subtitle">
+ <!-- the context node should be the subtitle of a section when called -->
+ <xsl:variable name="section" select="(ancestor::section |ancestor::simplesect |ancestor::sect1 |ancestor::sect2 |ancestor::sect3 |ancestor::sect4 |ancestor::sect5)[last()]"/>
+
+ <xsl:variable name="level">
+ <xsl:call-template name="section.level">
+ <xsl:with-param name="node" select="$section"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:call-template name="section.heading">
+ <xsl:with-param name="section" select=".."/>
+ <xsl:with-param name="allow-anchors" select="0"/>
+ <!-- subtitle heading level one higher than section level -->
+ <xsl:with-param name="level" select="$level + 1"/>
+ <xsl:with-param name="class" select="'subtitle'"/>
+ <xsl:with-param name="title">
+ <xsl:apply-templates select="$section" mode="object.subtitle.markup">
+ <xsl:with-param name="allow-anchors" select="0"/>
+ </xsl:apply-templates>
+ </xsl:with-param>
+ </xsl:call-template>
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/synop.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/synop.xsl
new file mode 100644
index 0000000..8506707
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/synop.xsl
@@ -0,0 +1,1513 @@
+<?xml version="1.0" encoding="ASCII"?>
+<!--This file was created automatically by html2xhtml-->
+<!--from the HTML stylesheets.-->
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1999/xhtml" version="1.0">
+
+<!-- ********************************************************************
+ $Id: synop.xsl 8421 2009-05-04 07:49:49Z bobstayton $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<!-- ==================================================================== -->
+
+<!-- synopsis is in verbatim -->
+
+<!-- ==================================================================== -->
+
+<xsl:template match="cmdsynopsis">
+ <div>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <p>
+ <xsl:if test="..//processing-instruction('dbcmdlist')">
+ <!-- * Placing a dbcmdlist PI as a child of a particular element -->
+ <!-- * creates a hyperlinked list of all cmdsynopsis instances -->
+ <!-- * that are descendants of that element; so for any -->
+ <!-- * cmdsynopsis that is a descendant of an element containing -->
+ <!-- * a dbcmdlist PI, we need to output an a@id instance so that -->
+ <!-- * we will have something to link to -->
+ <xsl:call-template name="anchor">
+ <xsl:with-param name="conditional" select="0"/>
+ </xsl:call-template>
+ </xsl:if>
+ <xsl:apply-templates/>
+ </p>
+ </div>
+</xsl:template>
+
+<xsl:template match="cmdsynopsis/command">
+ <br/>
+ <xsl:call-template name="inline.monoseq"/>
+ <xsl:text> </xsl:text>
+</xsl:template>
+
+<xsl:template match="cmdsynopsis/command[1]" priority="2">
+ <xsl:call-template name="inline.monoseq"/>
+ <xsl:text> </xsl:text>
+</xsl:template>
+
+<xsl:template match="group|arg" name="group-or-arg">
+ <xsl:variable name="choice" select="@choice"/>
+ <xsl:variable name="rep" select="@rep"/>
+ <xsl:variable name="sepchar">
+ <xsl:choose>
+ <xsl:when test="ancestor-or-self::*/@sepchar">
+ <xsl:value-of select="ancestor-or-self::*/@sepchar"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text> </xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:if test="preceding-sibling::*">
+ <xsl:value-of select="$sepchar"/>
+ </xsl:if>
+ <xsl:choose>
+ <xsl:when test="$choice='plain'">
+ <xsl:value-of select="$arg.choice.plain.open.str"/>
+ </xsl:when>
+ <xsl:when test="$choice='req'">
+ <xsl:value-of select="$arg.choice.req.open.str"/>
+ </xsl:when>
+ <xsl:when test="$choice='opt'">
+ <xsl:value-of select="$arg.choice.opt.open.str"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$arg.choice.def.open.str"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:apply-templates/>
+ <xsl:choose>
+ <xsl:when test="$rep='repeat'">
+ <xsl:value-of select="$arg.rep.repeat.str"/>
+ </xsl:when>
+ <xsl:when test="$rep='norepeat'">
+ <xsl:value-of select="$arg.rep.norepeat.str"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$arg.rep.def.str"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:choose>
+ <xsl:when test="$choice='plain'">
+ <xsl:value-of select="$arg.choice.plain.close.str"/>
+ </xsl:when>
+ <xsl:when test="$choice='req'">
+ <xsl:value-of select="$arg.choice.req.close.str"/>
+ </xsl:when>
+ <xsl:when test="$choice='opt'">
+ <xsl:value-of select="$arg.choice.opt.close.str"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$arg.choice.def.close.str"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="group/arg">
+ <xsl:variable name="choice" select="@choice"/>
+ <xsl:variable name="rep" select="@rep"/>
+ <xsl:if test="preceding-sibling::*">
+ <xsl:value-of select="$arg.or.sep"/>
+ </xsl:if>
+ <xsl:call-template name="group-or-arg"/>
+</xsl:template>
+
+<xsl:template match="sbr">
+ <br/>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="synopfragmentref">
+ <xsl:variable name="target" select="key('id',@linkend)"/>
+ <xsl:variable name="snum">
+ <xsl:apply-templates select="$target" mode="synopfragment.number"/>
+ </xsl:variable>
+ <em xmlns:xslo="http://www.w3.org/1999/XSL/Transform">
+ <a href="#{@linkend}">
+ <xsl:text>(</xsl:text>
+ <xsl:value-of select="$snum"/>
+ <xsl:text>)</xsl:text>
+ </a>
+ <xsl:text>&#160;</xsl:text>
+ <xsl:apply-templates/>
+ </em>
+</xsl:template>
+
+<xsl:template match="synopfragment" mode="synopfragment.number">
+ <xsl:number format="1"/>
+</xsl:template>
+
+<xsl:template match="synopfragment">
+ <xsl:variable name="snum">
+ <xsl:apply-templates select="." mode="synopfragment.number"/>
+ </xsl:variable>
+ <!-- You can't introduce another <p> here, because you're
+ already in a <p> from cmdsynopsis-->
+ <span>
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+ <a id="{$id}">
+ <xsl:text>(</xsl:text>
+ <xsl:value-of select="$snum"/>
+ <xsl:text>)</xsl:text>
+ </a>
+ <xsl:text> </xsl:text>
+ <xsl:apply-templates/>
+ </span>
+</xsl:template>
+
+<xsl:template match="funcsynopsis">
+ <xsl:if test="..//processing-instruction('dbfunclist')">
+ <!-- * Placing a dbfunclist PI as a child of a particular element -->
+ <!-- * creates a hyperlinked list of all funcsynopsis instances that -->
+ <!-- * are descendants of that element; so for any funcsynopsis that is -->
+ <!-- * a descendant of an element containing a dbfunclist PI, we need -->
+ <!-- * to output an a@id instance so that we will have something to -->
+ <!-- * link to -->
+ <xsl:call-template name="anchor">
+ <xsl:with-param name="conditional" select="0"/>
+ </xsl:call-template>
+ </xsl:if>
+ <xsl:call-template name="informal.object"/>
+</xsl:template>
+
+<xsl:template match="funcsynopsisinfo">
+ <pre>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates/>
+ </pre>
+</xsl:template>
+
+<!-- ====================================================================== -->
+<!-- funcprototype -->
+<!--
+
+funcprototype ::= (funcdef,
+ (void|varargs|paramdef+))
+
+funcdef ::= (#PCDATA|type|replaceable|function)*
+
+paramdef ::= (#PCDATA|type|replaceable|parameter|funcparams)*
+-->
+
+<xsl:template match="funcprototype">
+ <xsl:variable name="html-style">
+ <xsl:call-template name="pi.dbhtml_funcsynopsis-style">
+ <xsl:with-param name="node" select="ancestor::funcsynopsis/descendant-or-self::*"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="style">
+ <xsl:choose>
+ <xsl:when test="$html-style != ''">
+ <xsl:value-of select="$html-style"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$funcsynopsis.style"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+<!-- * 2008-02-17. the code no longer relies on the funcsynopsis.tabular.threshold -->
+<!-- * param at all (the stuff below has been commented out since mid -->
+<!-- * 2006), so I completely removed the funcsynopsis.tabular.threshold param -->
+<!-- * .. MikeSmith -->
+<!--
+ <xsl:variable name="tabular-p"
+ select="$funcsynopsis.tabular.threshold &gt; 0
+ and string-length(.) &gt; $funcsynopsis.tabular.threshold"/>
+-->
+
+ <xsl:variable name="tabular-p" select="true()"/>
+
+ <xsl:choose>
+ <xsl:when test="$style = 'kr' and $tabular-p">
+ <xsl:apply-templates select="." mode="kr-tabular"/>
+ </xsl:when>
+ <xsl:when test="$style = 'kr'">
+ <xsl:apply-templates select="." mode="kr-nontabular"/>
+ </xsl:when>
+ <xsl:when test="$style = 'ansi' and $tabular-p">
+ <xsl:apply-templates select="." mode="ansi-tabular"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="." mode="ansi-nontabular"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ====================================================================== -->
+<!-- funcprototype: kr, non-tabular -->
+
+<xsl:template match="funcprototype" mode="kr-nontabular">
+ <p>
+ <xsl:apply-templates mode="kr-nontabular"/>
+ <xsl:if test="paramdef">
+ <br/>
+ <xsl:apply-templates select="paramdef" mode="kr-funcsynopsis-mode"/>
+ </xsl:if>
+ </p>
+</xsl:template>
+
+<xsl:template match="funcdef" mode="kr-nontabular">
+ <code>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="kr-nontabular"/>
+ <xsl:text>(</xsl:text>
+ </code>
+</xsl:template>
+
+<xsl:template match="funcdef/function" mode="kr-nontabular">
+ <xsl:choose>
+ <xsl:when test="$funcsynopsis.decoration != 0">
+ <strong xmlns:xslo="http://www.w3.org/1999/XSL/Transform">fsfunc<xsl:apply-templates mode="kr-nontabular"/></strong>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates mode="kr-nontabular"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="void" mode="kr-nontabular">
+ <code>)</code>
+ <xsl:text>;</xsl:text>
+</xsl:template>
+
+<xsl:template match="varargs" mode="kr-nontabular">
+ <xsl:text>...</xsl:text>
+ <code>)</code>
+ <xsl:text>;</xsl:text>
+</xsl:template>
+
+<xsl:template match="paramdef" mode="kr-nontabular">
+ <xsl:apply-templates select="parameter" mode="kr-nontabular"/>
+ <xsl:choose>
+ <xsl:when test="following-sibling::*">
+ <xsl:text>, </xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <code>)</code>
+ <xsl:text>;</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="paramdef/parameter" mode="kr-nontabular">
+ <xsl:choose>
+ <xsl:when test="$funcsynopsis.decoration != 0">
+ <var class="pdparam">
+ <xsl:apply-templates mode="kr-nontabular"/>
+ </var>
+ </xsl:when>
+ <xsl:otherwise>
+ <code>
+ <xsl:apply-templates mode="kr-nontabular"/>
+ </code>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="paramdef" mode="kr-funcsynopsis-mode">
+ <xsl:if test="preceding-sibling::paramdef"><br/></xsl:if>
+ <code>
+ <xsl:apply-templates mode="kr-funcsynopsis-mode"/>
+ </code>
+ <xsl:text>;</xsl:text>
+</xsl:template>
+
+<xsl:template match="paramdef/parameter" mode="kr-funcsynopsis-mode">
+ <xsl:choose>
+ <xsl:when test="$funcsynopsis.decoration != 0">
+ <var class="pdparam">
+ <xsl:apply-templates mode="kr-funcsynopsis-mode"/>
+ </var>
+ </xsl:when>
+ <xsl:otherwise>
+ <code>
+ <xsl:apply-templates mode="kr-funcsynopsis-mode"/>
+ </code>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="funcparams" mode="kr-funcsynopsis-mode">
+ <code>(</code>
+ <xsl:apply-templates mode="kr-funcsynopsis-mode"/>
+ <code>)</code>
+</xsl:template>
+
+<!-- ====================================================================== -->
+<!-- funcprototype: kr, tabular -->
+
+<xsl:template match="funcprototype" mode="kr-tabular">
+ <table border="0" summary="Function synopsis" cellspacing="0" cellpadding="0" class="funcprototype-table">
+ <tr>
+ <td>
+ <xsl:apply-templates select="funcdef" mode="kr-tabular"/>
+ </td>
+ <xsl:apply-templates select="(void|varargs|paramdef)[1]" mode="kr-tabular"/>
+ </tr>
+ <xsl:for-each select="(void|varargs|paramdef)[preceding-sibling::*[not(self::funcdef)]]">
+ <tr>
+ <td>&#160;</td>
+ <xsl:apply-templates select="." mode="kr-tabular"/>
+ </tr>
+ </xsl:for-each>
+ </table>
+ <xsl:if test="paramdef">
+ <div class="paramdef-list">
+ <xsl:apply-templates select="paramdef" mode="kr-funcsynopsis-mode"/>
+ </div>
+ </xsl:if>
+ <div class="funcprototype-spacer">&#160;</div> <!-- hACk: blank div for vertical spacing -->
+</xsl:template>
+
+<xsl:template match="funcdef" mode="kr-tabular">
+ <code>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="kr-tabular"/>
+ <xsl:text>(</xsl:text>
+ </code>
+</xsl:template>
+
+<xsl:template match="funcdef/function" mode="kr-tabular">
+ <xsl:choose>
+ <xsl:when test="$funcsynopsis.decoration != 0">
+ <strong xmlns:xslo="http://www.w3.org/1999/XSL/Transform">fsfunc<xsl:apply-templates mode="kr-nontabular"/></strong>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates mode="kr-tabular"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="void" mode="kr-tabular">
+ <td>
+ <code>)</code>
+ <xsl:text>;</xsl:text>
+ </td>
+ <td>&#160;</td>
+</xsl:template>
+
+<xsl:template match="varargs" mode="kr-tabular">
+ <td>
+ <xsl:text>...</xsl:text>
+ <code>)</code>
+ <xsl:text>;</xsl:text>
+ </td>
+ <td>&#160;</td>
+</xsl:template>
+
+<xsl:template match="paramdef" mode="kr-tabular">
+ <td>
+ <xsl:apply-templates select="parameter" mode="kr-tabular"/>
+ <xsl:choose>
+ <xsl:when test="following-sibling::*">
+ <xsl:text>, </xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <code>)</code>
+ <xsl:text>;</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ </td>
+ <td>&#160;</td>
+</xsl:template>
+
+<xsl:template match="paramdef/parameter" mode="kr-tabular">
+ <xsl:choose>
+ <xsl:when test="$funcsynopsis.decoration != 0">
+ <var class="pdparam">
+ <xsl:apply-templates mode="kr-tabular"/>
+ </var>
+ </xsl:when>
+ <xsl:otherwise>
+ <code>
+ <xsl:apply-templates mode="kr-tabular"/>
+ </code>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="paramdef" mode="kr-tabular-funcsynopsis-mode">
+ <xsl:variable name="type">
+ <xsl:choose>
+ <xsl:when test="type">
+ <xsl:apply-templates select="type" mode="kr-tabular-funcsynopsis-mode"/>
+ </xsl:when>
+ <xsl:when test="normalize-space(parameter/preceding-sibling::node()[not(self::parameter)]) != ''">
+ <xsl:copy-of select="parameter/preceding-sibling::node()[not(self::parameter)]"/>
+ </xsl:when>
+ </xsl:choose>
+ </xsl:variable>
+
+ <tr>
+ <xsl:choose>
+ <xsl:when test="$type != '' and funcparams">
+ <td>
+ <code>
+ <xsl:copy-of select="$type"/>
+ </code>
+ <xsl:text>&#160;</xsl:text>
+ </td>
+ <td>
+ <code>
+ <xsl:choose>
+ <xsl:when test="type">
+ <xsl:apply-templates select="type/following-sibling::*" mode="kr-tabular-funcsynopsis-mode"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="*" mode="kr-tabular-funcsynopsis-mode"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </code>
+ </td>
+ </xsl:when>
+
+ <xsl:when test="funcparams">
+ <td colspan="2">
+ <code>
+ <xsl:apply-templates mode="kr-tabular-funcsynopsis-mode"/>
+ </code>
+ </td>
+ </xsl:when>
+
+ <xsl:otherwise>
+ <td>
+ <code>
+ <xsl:apply-templates select="parameter/preceding-sibling::node()[not(self::parameter)]" mode="kr-tabular-funcsynopsis-mode"/>
+ </code>
+ <xsl:text>&#160;</xsl:text>
+ </td>
+ <td>
+ <code>
+ <xsl:apply-templates select="parameter" mode="kr-tabular"/>
+ <xsl:apply-templates select="parameter/following-sibling::*[not(self::parameter)]" mode="kr-tabular-funcsynopsis-mode"/>
+ <xsl:text>;</xsl:text>
+ </code>
+ </td>
+ </xsl:otherwise>
+ </xsl:choose>
+ </tr>
+</xsl:template>
+
+<xsl:template match="paramdef/parameter" mode="kr-tabular-funcsynopsis-mode">
+ <xsl:choose>
+ <xsl:when test="$funcsynopsis.decoration != 0">
+ <var class="pdparam">
+ <xsl:apply-templates mode="kr-tabular-funcsynopsis-mode"/>
+ </var>
+ </xsl:when>
+ <xsl:otherwise>
+ <code>
+ <xsl:apply-templates mode="kr-tabular-funcsynopsis-mode"/>
+ </code>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="funcparams" mode="kr-tabular-funcsynopsis-mode">
+ <code>(</code>
+ <xsl:apply-templates mode="kr-tabular-funcsynopsis-mode"/>
+ <code>)</code>
+ <xsl:text>;</xsl:text>
+</xsl:template>
+
+<!-- ====================================================================== -->
+<!-- funcprototype: ansi, non-tabular -->
+
+<xsl:template match="funcprototype" mode="ansi-nontabular">
+ <p>
+ <xsl:apply-templates mode="ansi-nontabular"/>
+ </p>
+</xsl:template>
+
+<xsl:template match="funcdef" mode="ansi-nontabular">
+ <code>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="ansi-nontabular"/>
+ <xsl:text>(</xsl:text>
+ </code>
+</xsl:template>
+
+<xsl:template match="funcdef/function" mode="ansi-nontabular">
+ <xsl:choose>
+ <xsl:when test="$funcsynopsis.decoration != 0">
+ <strong xmlns:xslo="http://www.w3.org/1999/XSL/Transform">fsfunc<xsl:apply-templates mode="ansi-nontabular"/></strong>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates mode="ansi-nontabular"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="void" mode="ansi-nontabular">
+ <code>void)</code>
+ <xsl:text>;</xsl:text>
+</xsl:template>
+
+<xsl:template match="varargs" mode="ansi-nontabular">
+ <xsl:text>...</xsl:text>
+ <code>)</code>
+ <xsl:text>;</xsl:text>
+</xsl:template>
+
+<xsl:template match="paramdef" mode="ansi-nontabular">
+ <xsl:apply-templates mode="ansi-nontabular"/>
+ <xsl:choose>
+ <xsl:when test="following-sibling::*">
+ <xsl:text>, </xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <code>)</code>
+ <xsl:text>;</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="paramdef/parameter" mode="ansi-nontabular">
+ <xsl:choose>
+ <xsl:when test="$funcsynopsis.decoration != 0">
+ <var class="pdparam">
+ <xsl:apply-templates mode="ansi-nontabular"/>
+ </var>
+ </xsl:when>
+ <xsl:otherwise>
+ <code>
+ <xsl:apply-templates mode="ansi-nontabular"/>
+ </code>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="funcparams" mode="ansi-nontabular">
+ <code>(</code>
+ <xsl:apply-templates mode="ansi-nontabular"/>
+ <code>)</code>
+</xsl:template>
+
+<!-- ====================================================================== -->
+<!-- funcprototype: ansi, tabular -->
+
+<xsl:template match="funcprototype" mode="ansi-tabular">
+ <table border="0" summary="Function synopsis" cellspacing="0" cellpadding="0" class="funcprototype-table">
+ <tr>
+ <td>
+ <xsl:apply-templates select="funcdef" mode="ansi-tabular"/>
+ </td>
+ <xsl:apply-templates select="(void|varargs|paramdef)[1]" mode="ansi-tabular"/>
+ </tr>
+ <xsl:for-each select="(void|varargs|paramdef)[preceding-sibling::*[not(self::funcdef)]]">
+ <tr>
+ <td>&#160;</td>
+ <xsl:apply-templates select="." mode="ansi-tabular"/>
+ </tr>
+ </xsl:for-each>
+ </table>
+ <div class="funcprototype-spacer">&#160;</div> <!-- hACk: blank div for vertical spacing -->
+</xsl:template>
+
+<xsl:template match="funcdef" mode="ansi-tabular">
+ <code>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="ansi-tabular"/>
+ <xsl:text>(</xsl:text>
+ </code>
+</xsl:template>
+
+<xsl:template match="funcdef/function" mode="ansi-tabular">
+ <xsl:choose>
+ <xsl:when test="$funcsynopsis.decoration != 0">
+ <strong xmlns:xslo="http://www.w3.org/1999/XSL/Transform">fsfunc<xsl:apply-templates mode="ansi-nontabular"/></strong>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates mode="kr-tabular"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="void" mode="ansi-tabular">
+ <td>
+ <code>void)</code>
+ <xsl:text>;</xsl:text>
+ </td>
+ <td>&#160;</td>
+</xsl:template>
+
+<xsl:template match="varargs" mode="ansi-tabular">
+ <td>
+ <xsl:text>...</xsl:text>
+ <code>)</code>
+ <xsl:text>;</xsl:text>
+ </td>
+ <td>&#160;</td>
+</xsl:template>
+
+<xsl:template match="paramdef" mode="ansi-tabular">
+ <td>
+ <xsl:apply-templates mode="ansi-tabular"/>
+ <xsl:choose>
+ <xsl:when test="following-sibling::*">
+ <xsl:text>, </xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <code>)</code>
+ <xsl:text>;</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ </td>
+</xsl:template>
+
+<xsl:template match="paramdef/parameter" mode="ansi-tabular">
+ <xsl:choose>
+ <xsl:when test="$funcsynopsis.decoration != 0">
+ <var class="pdparam">
+ <xsl:apply-templates mode="ansi-tabular"/>
+ </var>
+ </xsl:when>
+ <xsl:otherwise>
+ <code>
+ <xsl:apply-templates mode="ansi-tabular"/>
+ </code>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="funcparams" mode="ansi-tabular">
+ <code>(</code>
+ <xsl:apply-templates/>
+ <code>)</code>
+</xsl:template>
+
+<!-- ====================================================================== -->
+
+<xsl:variable name="default-classsynopsis-language">java</xsl:variable>
+
+<xsl:template match="classsynopsis |fieldsynopsis |methodsynopsis |constructorsynopsis |destructorsynopsis">
+ <xsl:param name="language">
+ <xsl:choose>
+ <xsl:when test="@language">
+ <xsl:value-of select="@language"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$default-classsynopsis-language"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:param>
+
+ <xsl:choose>
+ <xsl:when test="$language='java' or $language='Java'">
+ <xsl:apply-templates select="." mode="java"/>
+ </xsl:when>
+ <xsl:when test="$language='perl' or $language='Perl'">
+ <xsl:apply-templates select="." mode="perl"/>
+ </xsl:when>
+ <xsl:when test="$language='idl' or $language='IDL'">
+ <xsl:apply-templates select="." mode="idl"/>
+ </xsl:when>
+ <xsl:when test="$language='cpp' or $language='c++' or $language='C++'">
+ <xsl:apply-templates select="." mode="cpp"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:message>
+ <xsl:text>Unrecognized language on </xsl:text>
+ <xsl:value-of select="local-name(.)"/>
+ <xsl:text>: </xsl:text>
+ <xsl:value-of select="$language"/>
+ </xsl:message>
+ <xsl:apply-templates select=".">
+ <xsl:with-param name="language" select="$default-classsynopsis-language"/>
+ </xsl:apply-templates>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="synop-break">
+ <xsl:if test="parent::classsynopsis or (following-sibling::fieldsynopsis |following-sibling::methodsynopsis |following-sibling::constructorsynopsis |following-sibling::destructorsynopsis)">
+ <br/>
+ </xsl:if>
+</xsl:template>
+
+
+<!-- ===== Java ======================================================== -->
+
+<xsl:template match="classsynopsis" mode="java">
+ <pre>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates select="ooclass[1]" mode="java"/>
+ <xsl:if test="ooclass[preceding-sibling::*]">
+ <xsl:text> extends</xsl:text>
+ <xsl:apply-templates select="ooclass[preceding-sibling::*]" mode="java"/>
+ <xsl:if test="oointerface|ooexception">
+ <br/>
+ <xsl:text>&#160;&#160;&#160;&#160;</xsl:text>
+ </xsl:if>
+ </xsl:if>
+ <xsl:if test="oointerface">
+ <xsl:text>implements</xsl:text>
+ <xsl:apply-templates select="oointerface" mode="java"/>
+ <xsl:if test="ooexception">
+ <br/>
+ <xsl:text>&#160;&#160;&#160;&#160;</xsl:text>
+ </xsl:if>
+ </xsl:if>
+ <xsl:if test="ooexception">
+ <xsl:text>throws</xsl:text>
+ <xsl:apply-templates select="ooexception" mode="java"/>
+ </xsl:if>
+ <xsl:text>&#160;{</xsl:text>
+ <br/>
+ <xsl:apply-templates select="constructorsynopsis |destructorsynopsis |fieldsynopsis |methodsynopsis |classsynopsisinfo" mode="java"/>
+ <xsl:text>}</xsl:text>
+ </pre>
+</xsl:template>
+
+<xsl:template match="classsynopsisinfo" mode="java">
+ <xsl:apply-templates mode="java"/>
+</xsl:template>
+
+<xsl:template match="ooclass|oointerface|ooexception" mode="java">
+ <xsl:choose>
+ <xsl:when test="preceding-sibling::*">
+ <xsl:text>, </xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text> </xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="java"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="modifier|package" mode="java">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="java"/>
+ <xsl:if test="following-sibling::*">
+ <xsl:text>&#160;</xsl:text>
+ </xsl:if>
+ </span>
+</xsl:template>
+
+<xsl:template match="classname" mode="java">
+ <xsl:if test="local-name(preceding-sibling::*[1]) = 'classname'">
+ <xsl:text>, </xsl:text>
+ </xsl:if>
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="java"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="interfacename" mode="java">
+ <xsl:if test="local-name(preceding-sibling::*[1]) = 'interfacename'">
+ <xsl:text>, </xsl:text>
+ </xsl:if>
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="java"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="exceptionname" mode="java">
+ <xsl:if test="local-name(preceding-sibling::*[1]) = 'exceptionname'">
+ <xsl:text>, </xsl:text>
+ </xsl:if>
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="java"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="fieldsynopsis" mode="java">
+ <code>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:if test="parent::classsynopsis">
+ <xsl:text>&#160;&#160;</xsl:text>
+ </xsl:if>
+ <xsl:apply-templates mode="java"/>
+ <xsl:text>;</xsl:text>
+ </code>
+ <xsl:call-template name="synop-break"/>
+</xsl:template>
+
+<xsl:template match="type" mode="java">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="java"/>
+ <xsl:text>&#160;</xsl:text>
+ </span>
+</xsl:template>
+
+<xsl:template match="varname" mode="java">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="java"/>
+ <xsl:text>&#160;</xsl:text>
+ </span>
+</xsl:template>
+
+<xsl:template match="initializer" mode="java">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:text>=&#160;</xsl:text>
+ <xsl:apply-templates mode="java"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="void" mode="java">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:text>void&#160;</xsl:text>
+ </span>
+</xsl:template>
+
+<xsl:template match="methodname" mode="java">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="java"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="methodparam" mode="java">
+ <xsl:param name="indent">0</xsl:param>
+ <xsl:if test="preceding-sibling::methodparam">
+ <xsl:text>,</xsl:text>
+ <br/>
+ <xsl:if test="$indent &gt; 0">
+ <xsl:call-template name="copy-string">
+ <xsl:with-param name="string">&#160;</xsl:with-param>
+ <xsl:with-param name="count" select="$indent + 1"/>
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:if>
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="java"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="parameter" mode="java">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="java"/>
+ </span>
+</xsl:template>
+
+<xsl:template mode="java" match="constructorsynopsis|destructorsynopsis|methodsynopsis">
+ <xsl:variable name="start-modifiers" select="modifier[following-sibling::*[local-name(.) != 'modifier']]"/>
+ <xsl:variable name="notmod" select="*[local-name(.) != 'modifier']"/>
+ <xsl:variable name="end-modifiers" select="modifier[preceding-sibling::*[local-name(.) != 'modifier']]"/>
+ <xsl:variable name="decl">
+ <xsl:if test="parent::classsynopsis">
+ <xsl:text>&#160;&#160;</xsl:text>
+ </xsl:if>
+ <xsl:apply-templates select="$start-modifiers" mode="java"/>
+
+ <!-- type -->
+ <xsl:if test="local-name($notmod[1]) != 'methodname'">
+ <xsl:apply-templates select="$notmod[1]" mode="java"/>
+ </xsl:if>
+
+ <xsl:apply-templates select="methodname" mode="java"/>
+ </xsl:variable>
+
+ <code>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:copy-of select="$decl"/>
+ <xsl:text>(</xsl:text>
+ <xsl:apply-templates select="methodparam" mode="java">
+ <xsl:with-param name="indent" select="string-length($decl)"/>
+ </xsl:apply-templates>
+ <xsl:text>)</xsl:text>
+ <xsl:if test="exceptionname">
+ <br/>
+ <xsl:text>&#160;&#160;&#160;&#160;throws&#160;</xsl:text>
+ <xsl:apply-templates select="exceptionname" mode="java"/>
+ </xsl:if>
+ <xsl:if test="modifier[preceding-sibling::*[local-name(.) != 'modifier']]">
+ <xsl:text> </xsl:text>
+ <xsl:apply-templates select="$end-modifiers" mode="java"/>
+ </xsl:if>
+ <xsl:text>;</xsl:text>
+ </code>
+ <xsl:call-template name="synop-break"/>
+</xsl:template>
+
+<!-- ===== C++ ========================================================= -->
+
+<xsl:template match="classsynopsis" mode="cpp">
+ <pre>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates select="ooclass[1]" mode="cpp"/>
+ <xsl:if test="ooclass[preceding-sibling::*]">
+ <xsl:text>: </xsl:text>
+ <xsl:apply-templates select="ooclass[preceding-sibling::*]" mode="cpp"/>
+ <xsl:if test="oointerface|ooexception">
+ <br/>
+ <xsl:text>&#160;&#160;&#160;&#160;</xsl:text>
+ </xsl:if>
+ </xsl:if>
+ <xsl:if test="oointerface">
+ <xsl:text> implements</xsl:text>
+ <xsl:apply-templates select="oointerface" mode="cpp"/>
+ <xsl:if test="ooexception">
+ <br/>
+ <xsl:text>&#160;&#160;&#160;&#160;</xsl:text>
+ </xsl:if>
+ </xsl:if>
+ <xsl:if test="ooexception">
+ <xsl:text> throws</xsl:text>
+ <xsl:apply-templates select="ooexception" mode="cpp"/>
+ </xsl:if>
+ <xsl:text>&#160;{</xsl:text>
+ <br/>
+ <xsl:apply-templates select="constructorsynopsis |destructorsynopsis |fieldsynopsis |methodsynopsis |classsynopsisinfo" mode="cpp"/>
+ <xsl:text>}</xsl:text>
+ </pre>
+</xsl:template>
+
+<xsl:template match="classsynopsisinfo" mode="cpp">
+ <xsl:apply-templates mode="cpp"/>
+</xsl:template>
+
+<xsl:template match="ooclass|oointerface|ooexception" mode="cpp">
+ <xsl:if test="preceding-sibling::*">
+ <xsl:text>, </xsl:text>
+ </xsl:if>
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="cpp"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="modifier|package" mode="cpp">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="cpp"/>
+ <xsl:if test="following-sibling::*">
+ <xsl:text>&#160;</xsl:text>
+ </xsl:if>
+ </span>
+</xsl:template>
+
+<xsl:template match="classname" mode="cpp">
+ <xsl:if test="local-name(preceding-sibling::*[1]) = 'classname'">
+ <xsl:text>, </xsl:text>
+ </xsl:if>
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="cpp"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="interfacename" mode="cpp">
+ <xsl:if test="local-name(preceding-sibling::*[1]) = 'interfacename'">
+ <xsl:text>, </xsl:text>
+ </xsl:if>
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="cpp"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="exceptionname" mode="cpp">
+ <xsl:if test="local-name(preceding-sibling::*[1]) = 'exceptionname'">
+ <xsl:text>, </xsl:text>
+ </xsl:if>
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="cpp"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="fieldsynopsis" mode="cpp">
+ <code>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:if test="parent::classsynopsis">
+ <xsl:text>&#160;&#160;</xsl:text>
+ </xsl:if>
+ <xsl:apply-templates mode="cpp"/>
+ <xsl:text>;</xsl:text>
+ </code>
+ <xsl:call-template name="synop-break"/>
+</xsl:template>
+
+<xsl:template match="type" mode="cpp">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="cpp"/>
+ <xsl:text>&#160;</xsl:text>
+ </span>
+</xsl:template>
+
+<xsl:template match="varname" mode="cpp">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="cpp"/>
+ <xsl:text>&#160;</xsl:text>
+ </span>
+</xsl:template>
+
+<xsl:template match="initializer" mode="cpp">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:text>=&#160;</xsl:text>
+ <xsl:apply-templates mode="cpp"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="void" mode="cpp">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:text>void&#160;</xsl:text>
+ </span>
+</xsl:template>
+
+<xsl:template match="methodname" mode="cpp">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="cpp"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="methodparam" mode="cpp">
+ <xsl:if test="preceding-sibling::methodparam">
+ <xsl:text>, </xsl:text>
+ </xsl:if>
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="cpp"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="parameter" mode="cpp">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="cpp"/>
+ </span>
+</xsl:template>
+
+<xsl:template mode="cpp" match="constructorsynopsis|destructorsynopsis|methodsynopsis">
+ <xsl:variable name="start-modifiers" select="modifier[following-sibling::*[local-name(.) != 'modifier']]"/>
+ <xsl:variable name="notmod" select="*[local-name(.) != 'modifier']"/>
+ <xsl:variable name="end-modifiers" select="modifier[preceding-sibling::*[local-name(.) != 'modifier']]"/>
+
+ <code>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:if test="parent::classsynopsis">
+ <xsl:text>&#160;&#160;</xsl:text>
+ </xsl:if>
+ <xsl:apply-templates select="$start-modifiers" mode="cpp"/>
+
+ <!-- type -->
+ <xsl:if test="local-name($notmod[1]) != 'methodname'">
+ <xsl:apply-templates select="$notmod[1]" mode="cpp"/>
+ </xsl:if>
+
+ <xsl:apply-templates select="methodname" mode="cpp"/>
+ <xsl:text>(</xsl:text>
+ <xsl:apply-templates select="methodparam" mode="cpp"/>
+ <xsl:text>)</xsl:text>
+ <xsl:if test="exceptionname">
+ <br/>
+ <xsl:text>&#160;&#160;&#160;&#160;throws&#160;</xsl:text>
+ <xsl:apply-templates select="exceptionname" mode="cpp"/>
+ </xsl:if>
+ <xsl:if test="modifier[preceding-sibling::*[local-name(.) != 'modifier']]">
+ <xsl:text> </xsl:text>
+ <xsl:apply-templates select="$end-modifiers" mode="cpp"/>
+ </xsl:if>
+ <xsl:text>;</xsl:text>
+ </code>
+ <xsl:call-template name="synop-break"/>
+</xsl:template>
+
+<!-- ===== IDL ========================================================= -->
+
+<xsl:template match="classsynopsis" mode="idl">
+ <pre>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:text>interface </xsl:text>
+ <xsl:apply-templates select="ooclass[1]" mode="idl"/>
+ <xsl:if test="ooclass[preceding-sibling::*]">
+ <xsl:text>: </xsl:text>
+ <xsl:apply-templates select="ooclass[preceding-sibling::*]" mode="idl"/>
+ <xsl:if test="oointerface|ooexception">
+ <br/>
+ <xsl:text>&#160;&#160;&#160;&#160;</xsl:text>
+ </xsl:if>
+ </xsl:if>
+ <xsl:if test="oointerface">
+ <xsl:text> implements</xsl:text>
+ <xsl:apply-templates select="oointerface" mode="idl"/>
+ <xsl:if test="ooexception">
+ <br/>
+ <xsl:text>&#160;&#160;&#160;&#160;</xsl:text>
+ </xsl:if>
+ </xsl:if>
+ <xsl:if test="ooexception">
+ <xsl:text> throws</xsl:text>
+ <xsl:apply-templates select="ooexception" mode="idl"/>
+ </xsl:if>
+ <xsl:text>&#160;{</xsl:text>
+ <br/>
+ <xsl:apply-templates select="constructorsynopsis |destructorsynopsis |fieldsynopsis |methodsynopsis |classsynopsisinfo" mode="idl"/>
+ <xsl:text>}</xsl:text>
+ </pre>
+</xsl:template>
+
+<xsl:template match="classsynopsisinfo" mode="idl">
+ <xsl:apply-templates mode="idl"/>
+</xsl:template>
+
+<xsl:template match="ooclass|oointerface|ooexception" mode="idl">
+ <xsl:if test="preceding-sibling::*">
+ <xsl:text>, </xsl:text>
+ </xsl:if>
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="idl"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="modifier|package" mode="idl">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="idl"/>
+ <xsl:if test="following-sibling::*">
+ <xsl:text>&#160;</xsl:text>
+ </xsl:if>
+ </span>
+</xsl:template>
+
+<xsl:template match="classname" mode="idl">
+ <xsl:if test="local-name(preceding-sibling::*[1]) = 'classname'">
+ <xsl:text>, </xsl:text>
+ </xsl:if>
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="idl"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="interfacename" mode="idl">
+ <xsl:if test="local-name(preceding-sibling::*[1]) = 'interfacename'">
+ <xsl:text>, </xsl:text>
+ </xsl:if>
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="idl"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="exceptionname" mode="idl">
+ <xsl:if test="local-name(preceding-sibling::*[1]) = 'exceptionname'">
+ <xsl:text>, </xsl:text>
+ </xsl:if>
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="idl"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="fieldsynopsis" mode="idl">
+ <code>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:if test="parent::classsynopsis">
+ <xsl:text>&#160;&#160;</xsl:text>
+ </xsl:if>
+ <xsl:apply-templates mode="idl"/>
+ <xsl:text>;</xsl:text>
+ </code>
+ <xsl:call-template name="synop-break"/>
+</xsl:template>
+
+<xsl:template match="type" mode="idl">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="idl"/>
+ <xsl:text>&#160;</xsl:text>
+ </span>
+</xsl:template>
+
+<xsl:template match="varname" mode="idl">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="idl"/>
+ <xsl:text>&#160;</xsl:text>
+ </span>
+</xsl:template>
+
+<xsl:template match="initializer" mode="idl">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:text>=&#160;</xsl:text>
+ <xsl:apply-templates mode="idl"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="void" mode="idl">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:text>void&#160;</xsl:text>
+ </span>
+</xsl:template>
+
+<xsl:template match="methodname" mode="idl">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="idl"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="methodparam" mode="idl">
+ <xsl:if test="preceding-sibling::methodparam">
+ <xsl:text>, </xsl:text>
+ </xsl:if>
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="idl"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="parameter" mode="idl">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="idl"/>
+ </span>
+</xsl:template>
+
+<xsl:template mode="idl" match="constructorsynopsis|destructorsynopsis|methodsynopsis">
+ <xsl:variable name="start-modifiers" select="modifier[following-sibling::*[local-name(.) != 'modifier']]"/>
+ <xsl:variable name="notmod" select="*[local-name(.) != 'modifier']"/>
+ <xsl:variable name="end-modifiers" select="modifier[preceding-sibling::*[local-name(.) != 'modifier']]"/>
+ <code>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:if test="parent::classsynopsis">
+ <xsl:text>&#160;&#160;</xsl:text>
+ </xsl:if>
+ <xsl:apply-templates select="$start-modifiers" mode="idl"/>
+
+ <!-- type -->
+ <xsl:if test="local-name($notmod[1]) != 'methodname'">
+ <xsl:apply-templates select="$notmod[1]" mode="idl"/>
+ </xsl:if>
+
+ <xsl:apply-templates select="methodname" mode="idl"/>
+ <xsl:text>(</xsl:text>
+ <xsl:apply-templates select="methodparam" mode="idl"/>
+ <xsl:text>)</xsl:text>
+ <xsl:if test="exceptionname">
+ <br/>
+ <xsl:text>&#160;&#160;&#160;&#160;raises(</xsl:text>
+ <xsl:apply-templates select="exceptionname" mode="idl"/>
+ <xsl:text>)</xsl:text>
+ </xsl:if>
+ <xsl:if test="modifier[preceding-sibling::*[local-name(.) != 'modifier']]">
+ <xsl:text> </xsl:text>
+ <xsl:apply-templates select="$end-modifiers" mode="idl"/>
+ </xsl:if>
+ <xsl:text>;</xsl:text>
+ </code>
+ <xsl:call-template name="synop-break"/>
+</xsl:template>
+
+<!-- ===== Perl ======================================================== -->
+
+<xsl:template match="classsynopsis" mode="perl">
+ <pre>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:text>package </xsl:text>
+ <xsl:apply-templates select="ooclass[1]" mode="perl"/>
+ <xsl:text>;</xsl:text>
+ <br/>
+
+ <xsl:if test="ooclass[preceding-sibling::*]">
+ <xsl:text>@ISA = (</xsl:text>
+ <xsl:apply-templates select="ooclass[preceding-sibling::*]" mode="perl"/>
+ <xsl:text>);</xsl:text>
+ <br/>
+ </xsl:if>
+
+ <xsl:apply-templates select="constructorsynopsis |destructorsynopsis |fieldsynopsis |methodsynopsis |classsynopsisinfo" mode="perl"/>
+ </pre>
+</xsl:template>
+
+<xsl:template match="classsynopsisinfo" mode="perl">
+ <xsl:apply-templates mode="perl"/>
+</xsl:template>
+
+<xsl:template match="ooclass|oointerface|ooexception" mode="perl">
+ <xsl:if test="preceding-sibling::*">
+ <xsl:text>, </xsl:text>
+ </xsl:if>
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="perl"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="modifier|package" mode="perl">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="perl"/>
+ <xsl:if test="following-sibling::*">
+ <xsl:text>&#160;</xsl:text>
+ </xsl:if>
+ </span>
+</xsl:template>
+
+<xsl:template match="classname" mode="perl">
+ <xsl:if test="local-name(preceding-sibling::*[1]) = 'classname'">
+ <xsl:text>, </xsl:text>
+ </xsl:if>
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="perl"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="interfacename" mode="perl">
+ <xsl:if test="local-name(preceding-sibling::*[1]) = 'interfacename'">
+ <xsl:text>, </xsl:text>
+ </xsl:if>
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="perl"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="exceptionname" mode="perl">
+ <xsl:if test="local-name(preceding-sibling::*[1]) = 'exceptionname'">
+ <xsl:text>, </xsl:text>
+ </xsl:if>
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="perl"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="fieldsynopsis" mode="perl">
+ <code>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:if test="parent::classsynopsis">
+ <xsl:text>&#160;&#160;</xsl:text>
+ </xsl:if>
+ <xsl:apply-templates mode="perl"/>
+ <xsl:text>;</xsl:text>
+ </code>
+ <xsl:call-template name="synop-break"/>
+</xsl:template>
+
+<xsl:template match="type" mode="perl">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="perl"/>
+ <xsl:text>&#160;</xsl:text>
+ </span>
+</xsl:template>
+
+<xsl:template match="varname" mode="perl">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="perl"/>
+ <xsl:text>&#160;</xsl:text>
+ </span>
+</xsl:template>
+
+<xsl:template match="initializer" mode="perl">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:text>=&#160;</xsl:text>
+ <xsl:apply-templates mode="perl"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="void" mode="perl">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:text>void&#160;</xsl:text>
+ </span>
+</xsl:template>
+
+<xsl:template match="methodname" mode="perl">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="perl"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="methodparam" mode="perl">
+ <xsl:if test="preceding-sibling::methodparam">
+ <xsl:text>, </xsl:text>
+ </xsl:if>
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="perl"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="parameter" mode="perl">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="perl"/>
+ </span>
+</xsl:template>
+
+<xsl:template mode="perl" match="constructorsynopsis|destructorsynopsis|methodsynopsis">
+ <xsl:variable name="start-modifiers" select="modifier[following-sibling::*[local-name(.) != 'modifier']]"/>
+ <xsl:variable name="notmod" select="*[local-name(.) != 'modifier']"/>
+ <xsl:variable name="end-modifiers" select="modifier[preceding-sibling::*[local-name(.) != 'modifier']]"/>
+
+ <code>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:text>sub </xsl:text>
+
+ <xsl:apply-templates select="methodname" mode="perl"/>
+ <xsl:text> { ... };</xsl:text>
+ </code>
+ <xsl:call-template name="synop-break"/>
+</xsl:template>
+
+<!-- Used when not occurring as a child of classsynopsis -->
+<xsl:template match="ooclass|oointerface|ooexception">
+ <xsl:apply-templates/>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<!-- * DocBook 5 allows linking elements (link, olink, and xref) -->
+<!-- * within the OO *synopsis elements (classsynopsis, fieldsynopsis, -->
+<!-- * methodsynopsis, constructorsynopsis, destructorsynopsis) and -->
+<!-- * their children. So we need to have mode="java|cpp|idl|perl" -->
+<!-- * per-mode matches for those linking elements in order for them -->
+<!-- * to be processed as expected. -->
+
+<xsl:template match="link|olink|xref" mode="java">
+ <xsl:apply-templates select="."/>
+</xsl:template>
+
+<xsl:template match="link|olink|xref" mode="cpp">
+ <xsl:apply-templates select="."/>
+</xsl:template>
+
+<xsl:template match="link|olink|xref" mode="idl">
+ <xsl:apply-templates select="."/>
+</xsl:template>
+
+<xsl:template match="link|olink|xref" mode="perl">
+ <xsl:apply-templates select="."/>
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/table.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/table.xsl
new file mode 100644
index 0000000..3146c09
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/table.xsl
@@ -0,0 +1,1168 @@
+<?xml version="1.0" encoding="ASCII"?>
+<!--This file was created automatically by html2xhtml-->
+<!--from the HTML stylesheets.-->
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:doc="http://nwalsh.com/xsl/documentation/1.0" xmlns:stbl="http://nwalsh.com/xslt/ext/com.nwalsh.saxon.Table" xmlns:xtbl="xalan://com.nwalsh.xalan.Table" xmlns:lxslt="http://xml.apache.org/xslt" xmlns:ptbl="http://nwalsh.com/xslt/ext/xsltproc/python/Table" xmlns="http://www.w3.org/1999/xhtml" exclude-result-prefixes="doc stbl xtbl lxslt ptbl" version="1.0">
+
+<xsl:include href="../common/table.xsl"/>
+
+<!-- ********************************************************************
+ $Id: table.xsl 8813 2010-08-09 21:18:23Z bobstayton $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<lxslt:component prefix="xtbl" functions="adjustColumnWidths"/>
+
+<xsl:template name="empty.table.cell">
+ <xsl:param name="colnum" select="0"/>
+
+ <xsl:variable name="rowsep">
+ <xsl:choose>
+ <!-- If this is the last row, rowsep never applies. -->
+ <xsl:when test="not(ancestor-or-self::row[1]/following-sibling::row or ancestor-or-self::thead/following-sibling::tbody or ancestor-or-self::tbody/preceding-sibling::tfoot)">
+ <xsl:value-of select="0"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="inherited.table.attribute">
+ <xsl:with-param name="entry" select="NOT-AN-ELEMENT-NAME"/>
+ <xsl:with-param name="row" select="ancestor-or-self::row[1]"/>
+ <xsl:with-param name="colnum" select="$colnum"/>
+ <xsl:with-param name="attribute" select="'rowsep'"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="colsep">
+ <xsl:choose>
+ <!-- If this is the last column, colsep never applies. -->
+ <xsl:when test="number($colnum) &gt;= ancestor::tgroup/@cols">0</xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="inherited.table.attribute">
+ <xsl:with-param name="entry" select="NOT-AN-ELEMENT-NAME"/>
+ <xsl:with-param name="row" select="ancestor-or-self::row[1]"/>
+ <xsl:with-param name="colnum" select="$colnum"/>
+ <xsl:with-param name="attribute" select="'colsep'"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <td class="auto-generated">
+ <xsl:if test="$table.borders.with.css != 0">
+ <xsl:attribute name="style">
+ <xsl:if test="$colsep &gt; 0">
+ <xsl:call-template name="border">
+ <xsl:with-param name="side" select="'right'"/>
+ </xsl:call-template>
+ </xsl:if>
+ <xsl:if test="$rowsep &gt; 0">
+ <xsl:call-template name="border">
+ <xsl:with-param name="side" select="'bottom'"/>
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:text>&#160;</xsl:text>
+ </td>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template name="border">
+ <xsl:param name="side" select="'left'"/>
+ <xsl:param name="padding" select="0"/>
+ <xsl:param name="style" select="$table.cell.border.style"/>
+ <xsl:param name="color" select="$table.cell.border.color"/>
+ <xsl:param name="thickness" select="$table.cell.border.thickness"/>
+
+ <!-- Note: Some browsers (mozilla) require at least a width and style. -->
+
+ <xsl:choose>
+ <xsl:when test="($thickness != '' and $style != '' and $color != '') or ($thickness != '' and $style != '') or ($thickness != '')">
+ <!-- use the compound property if we can: -->
+ <!-- it saves space and probably works more reliably -->
+ <xsl:text>border-</xsl:text>
+ <xsl:value-of select="$side"/>
+ <xsl:text>: </xsl:text>
+ <xsl:value-of select="$thickness"/>
+ <xsl:text> </xsl:text>
+ <xsl:value-of select="$style"/>
+ <xsl:text> </xsl:text>
+ <xsl:value-of select="$color"/>
+ <xsl:text>; </xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <!-- we need to specify the styles individually -->
+ <xsl:if test="$thickness != ''">
+ <xsl:text>border-</xsl:text>
+ <xsl:value-of select="$side"/>
+ <xsl:text>-width: </xsl:text>
+ <xsl:value-of select="$thickness"/>
+ <xsl:text>; </xsl:text>
+ </xsl:if>
+
+ <xsl:if test="$style != ''">
+ <xsl:text>border-</xsl:text>
+ <xsl:value-of select="$side"/>
+ <xsl:text>-style: </xsl:text>
+ <xsl:value-of select="$style"/>
+ <xsl:text>; </xsl:text>
+ </xsl:if>
+
+ <xsl:if test="$color != ''">
+ <xsl:text>border-</xsl:text>
+ <xsl:value-of select="$side"/>
+ <xsl:text>-color: </xsl:text>
+ <xsl:value-of select="$color"/>
+ <xsl:text>; </xsl:text>
+ </xsl:if>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="tgroup" name="tgroup">
+ <xsl:if test="not(@cols) or @cols = '' or string(number(@cols)) = 'NaN'">
+ <xsl:message terminate="yes">
+ <xsl:text>Error: CALS tables must specify the number of columns.</xsl:text>
+ </xsl:message>
+ </xsl:if>
+
+ <xsl:variable name="summary">
+ <xsl:call-template name="pi.dbhtml_table-summary"/>
+ </xsl:variable>
+
+ <xsl:variable name="cellspacing">
+ <xsl:call-template name="pi.dbhtml_cellspacing"/>
+ </xsl:variable>
+
+ <xsl:variable name="cellpadding">
+ <xsl:call-template name="pi.dbhtml_cellpadding"/>
+ </xsl:variable>
+
+ <table>
+ <xsl:choose>
+ <!-- If there's a textobject/phrase for the table summary, use it -->
+ <xsl:when test="../textobject/phrase">
+ <xsl:attribute name="summary">
+ <xsl:value-of select="../textobject/phrase"/>
+ </xsl:attribute>
+ </xsl:when>
+
+ <!-- If there's a <?dbhtml table-summary="foo"?> PI, use it for
+ the HTML table summary attribute -->
+ <xsl:when test="$summary != ''">
+ <xsl:attribute name="summary">
+ <xsl:value-of select="$summary"/>
+ </xsl:attribute>
+ </xsl:when>
+
+ <!-- Otherwise, if there's a title, use that -->
+ <xsl:when test="../title">
+ <xsl:attribute name="summary">
+ <!-- This screws up on inline markup and footnotes, oh well... -->
+ <xsl:value-of select="string(../title)"/>
+ </xsl:attribute>
+ </xsl:when>
+
+ <!-- Otherwise, forget the whole idea -->
+ <xsl:otherwise><!-- nevermind --></xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:if test="$cellspacing != '' or $html.cellspacing != ''">
+ <xsl:attribute name="cellspacing">
+ <xsl:choose>
+ <xsl:when test="$cellspacing != ''">
+ <xsl:value-of select="$cellspacing"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$html.cellspacing"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:if test="$cellpadding != '' or $html.cellpadding != ''">
+ <xsl:attribute name="cellpadding">
+ <xsl:choose>
+ <xsl:when test="$cellpadding != ''">
+ <xsl:value-of select="$cellpadding"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$html.cellpadding"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:if test="../@pgwide=1 or local-name(.) = 'entrytbl'">
+ <xsl:attribute name="width">100%</xsl:attribute>
+ </xsl:if>
+
+ <xsl:choose>
+ <xsl:when test="$table.borders.with.css != 0">
+ <xsl:choose>
+ <xsl:when test="../@frame='all' or (not(../@frame) and $default.table.frame='all')">
+ <xsl:attribute name="style">
+ <xsl:text>border-collapse: collapse;</xsl:text>
+ <xsl:call-template name="border">
+ <xsl:with-param name="side" select="'top'"/>
+ <xsl:with-param name="style" select="$table.frame.border.style"/>
+ <xsl:with-param name="color" select="$table.frame.border.color"/>
+ <xsl:with-param name="thickness" select="$table.frame.border.thickness"/>
+ </xsl:call-template>
+ <xsl:call-template name="border">
+ <xsl:with-param name="side" select="'bottom'"/>
+ <xsl:with-param name="style" select="$table.frame.border.style"/>
+ <xsl:with-param name="color" select="$table.frame.border.color"/>
+ <xsl:with-param name="thickness" select="$table.frame.border.thickness"/>
+ </xsl:call-template>
+ <xsl:call-template name="border">
+ <xsl:with-param name="side" select="'left'"/>
+ <xsl:with-param name="style" select="$table.frame.border.style"/>
+ <xsl:with-param name="color" select="$table.frame.border.color"/>
+ <xsl:with-param name="thickness" select="$table.frame.border.thickness"/>
+ </xsl:call-template>
+ <xsl:call-template name="border">
+ <xsl:with-param name="side" select="'right'"/>
+ <xsl:with-param name="style" select="$table.frame.border.style"/>
+ <xsl:with-param name="color" select="$table.frame.border.color"/>
+ <xsl:with-param name="thickness" select="$table.frame.border.thickness"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ </xsl:when>
+ <xsl:when test="../@frame='topbot' or (not(../@frame) and $default.table.frame='topbot')">
+ <xsl:attribute name="style">
+ <xsl:text>border-collapse: collapse;</xsl:text>
+ <xsl:call-template name="border">
+ <xsl:with-param name="side" select="'top'"/>
+ <xsl:with-param name="style" select="$table.frame.border.style"/>
+ <xsl:with-param name="color" select="$table.frame.border.color"/>
+ <xsl:with-param name="thickness" select="$table.frame.border.thickness"/>
+ </xsl:call-template>
+ <xsl:call-template name="border">
+ <xsl:with-param name="side" select="'bottom'"/>
+ <xsl:with-param name="style" select="$table.frame.border.style"/>
+ <xsl:with-param name="color" select="$table.frame.border.color"/>
+ <xsl:with-param name="thickness" select="$table.frame.border.thickness"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ </xsl:when>
+ <xsl:when test="../@frame='top' or (not(../@frame) and $default.table.frame='top')">
+ <xsl:attribute name="style">
+ <xsl:text>border-collapse: collapse;</xsl:text>
+ <xsl:call-template name="border">
+ <xsl:with-param name="side" select="'top'"/>
+ <xsl:with-param name="style" select="$table.frame.border.style"/>
+ <xsl:with-param name="color" select="$table.frame.border.color"/>
+ <xsl:with-param name="thickness" select="$table.frame.border.thickness"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ </xsl:when>
+ <xsl:when test="../@frame='bottom' or (not(../@frame) and $default.table.frame='bottom')">
+ <xsl:attribute name="style">
+ <xsl:text>border-collapse: collapse;</xsl:text>
+ <xsl:call-template name="border">
+ <xsl:with-param name="side" select="'bottom'"/>
+ <xsl:with-param name="style" select="$table.frame.border.style"/>
+ <xsl:with-param name="color" select="$table.frame.border.color"/>
+ <xsl:with-param name="thickness" select="$table.frame.border.thickness"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ </xsl:when>
+ <xsl:when test="../@frame='sides' or (not(../@frame) and $default.table.frame='sides')">
+ <xsl:attribute name="style">
+ <xsl:text>border-collapse: collapse;</xsl:text>
+ <xsl:call-template name="border">
+ <xsl:with-param name="side" select="'left'"/>
+ <xsl:with-param name="style" select="$table.frame.border.style"/>
+ <xsl:with-param name="color" select="$table.frame.border.color"/>
+ <xsl:with-param name="thickness" select="$table.frame.border.thickness"/>
+ </xsl:call-template>
+ <xsl:call-template name="border">
+ <xsl:with-param name="side" select="'right'"/>
+ <xsl:with-param name="style" select="$table.frame.border.style"/>
+ <xsl:with-param name="color" select="$table.frame.border.color"/>
+ <xsl:with-param name="thickness" select="$table.frame.border.thickness"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ </xsl:when>
+ <xsl:when test="../@frame='none'">
+ <xsl:attribute name="style">
+ <xsl:text>border: none;</xsl:text>
+ </xsl:attribute>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:attribute name="style">
+ <xsl:text>border-collapse: collapse;</xsl:text>
+ </xsl:attribute>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ </xsl:when>
+ <xsl:when test="../@frame='none' or (not(../@frame) and $default.table.frame='none') or local-name(.) = 'entrytbl'">
+ <xsl:attribute name="border">0</xsl:attribute>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:attribute name="border">1</xsl:attribute>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:variable name="colgroup">
+ <colgroup>
+ <xsl:call-template name="generate.colgroup">
+ <xsl:with-param name="cols" select="@cols"/>
+ </xsl:call-template>
+ </colgroup>
+ </xsl:variable>
+
+ <xsl:variable name="explicit.table.width">
+ <xsl:call-template name="pi.dbhtml_table-width">
+ <xsl:with-param name="node" select=".."/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="table.width">
+ <xsl:choose>
+ <xsl:when test="$explicit.table.width != ''">
+ <xsl:value-of select="$explicit.table.width"/>
+ </xsl:when>
+ <xsl:when test="$default.table.width = ''">
+ <xsl:text>100%</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$default.table.width"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:if test="$default.table.width != '' or $explicit.table.width != ''">
+ <xsl:attribute name="width">
+ <xsl:choose>
+ <xsl:when test="contains($table.width, '%')">
+ <xsl:value-of select="$table.width"/>
+ </xsl:when>
+ <xsl:when test="$use.extensions != 0 and $tablecolumns.extension != 0">
+ <xsl:choose>
+ <xsl:when test="function-available('stbl:convertLength')">
+ <xsl:value-of select="stbl:convertLength($table.width)"/>
+ </xsl:when>
+ <xsl:when test="function-available('xtbl:convertLength')">
+ <xsl:value-of select="xtbl:convertLength($table.width)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:message terminate="yes">
+ <xsl:text>No convertLength function available.</xsl:text>
+ </xsl:message>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$table.width"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:choose>
+ <xsl:when test="$use.extensions != 0 and $tablecolumns.extension != 0">
+ <xsl:choose>
+ <xsl:when test="function-available('stbl:adjustColumnWidths')">
+ <xsl:copy-of select="stbl:adjustColumnWidths($colgroup)"/>
+ </xsl:when>
+ <xsl:when test="function-available('xtbl:adjustColumnWidths')">
+ <xsl:copy-of select="xtbl:adjustColumnWidths($colgroup)"/>
+ </xsl:when>
+ <xsl:when test="function-available('ptbl:adjustColumnWidths')">
+ <xsl:copy-of select="ptbl:adjustColumnWidths($colgroup)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:message terminate="yes">
+ <xsl:text>No adjustColumnWidths function available.</xsl:text>
+ </xsl:message>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:copy-of select="$colgroup"/>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:apply-templates select="thead"/>
+ <xsl:apply-templates select="tfoot"/>
+ <xsl:apply-templates select="tbody"/>
+
+ <xsl:if test=".//footnote|../title//footnote">
+ <tbody class="footnotes">
+ <tr>
+ <td colspan="{@cols}">
+ <xsl:apply-templates select=".//footnote|../title//footnote" mode="table.footnote.mode"/>
+ </td>
+ </tr>
+ </tbody>
+ </xsl:if>
+ </table>
+</xsl:template>
+
+<xsl:template match="tgroup/processing-instruction('dbhtml')">
+ <xsl:variable name="summary">
+ <xsl:call-template name="pi.dbhtml_table-summary"/>
+ </xsl:variable>
+
+ <!-- Suppress the table-summary PI -->
+ <xsl:if test="$summary = ''">
+ <xsl:processing-instruction name="dbhtml">
+ <xsl:value-of select="."/>
+ </xsl:processing-instruction>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="colspec"/>
+
+<xsl:template match="spanspec"/>
+
+<xsl:template match="thead|tfoot">
+ <xsl:element name="{local-name(.)}" namespace="http://www.w3.org/1999/xhtml">
+ <xsl:if test="@align">
+ <xsl:attribute name="style"><xsl:text>text-align: </xsl:text>
+ <xsl:value-of select="@align"/>
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:if test="@char">
+ <xsl:attribute name="char">
+ <xsl:value-of select="@char"/>
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:if test="@charoff">
+ <xsl:attribute name="charoff">
+ <xsl:value-of select="@charoff"/>
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:if test="@valign">
+ <xsl:attribute name="valign">
+ <xsl:value-of select="@valign"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:choose>
+ <!-- recurse on rows only if @morerows is present -->
+ <xsl:when test="row/entry/@morerows|row/entrytbl/@morerows">
+ <xsl:apply-templates select="row[1]">
+ <xsl:with-param name="spans">
+ <xsl:call-template name="blank.spans">
+ <xsl:with-param name="cols" select="../@cols"/>
+ </xsl:call-template>
+ </xsl:with-param>
+ <xsl:with-param name="browserows" select="'recurse'"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="row">
+ <xsl:with-param name="spans">
+ <xsl:call-template name="blank.spans">
+ <xsl:with-param name="cols" select="../@cols"/>
+ </xsl:call-template>
+ </xsl:with-param>
+ <xsl:with-param name="browserows" select="'loop'"/>
+ </xsl:apply-templates>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ </xsl:element>
+</xsl:template>
+
+<xsl:template match="tbody">
+ <tbody>
+ <xsl:if test="@align">
+ <xsl:attribute name="style"><xsl:text>text-align: </xsl:text>
+ <xsl:value-of select="@align"/>
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:if test="@char">
+ <xsl:attribute name="char">
+ <xsl:value-of select="@char"/>
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:if test="@charoff">
+ <xsl:attribute name="charoff">
+ <xsl:value-of select="@charoff"/>
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:if test="@valign">
+ <xsl:attribute name="valign">
+ <xsl:value-of select="@valign"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:choose>
+ <xsl:when test="row/entry/@morerows|row/entrytbl/@morerows">
+ <xsl:apply-templates select="row[1]">
+ <xsl:with-param name="spans">
+ <xsl:call-template name="blank.spans">
+ <xsl:with-param name="cols" select="../@cols"/>
+ </xsl:call-template>
+ </xsl:with-param>
+ <xsl:with-param name="browserows" select="'recurse'"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="row">
+ <xsl:with-param name="spans">
+ <xsl:call-template name="blank.spans">
+ <xsl:with-param name="cols" select="../@cols"/>
+ </xsl:call-template>
+ </xsl:with-param>
+ <xsl:with-param name="browserows" select="'loop'"/>
+ </xsl:apply-templates>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ </tbody>
+</xsl:template>
+
+<xsl:template match="row">
+ <xsl:param name="spans"/>
+ <xsl:param name="browserows"/>
+
+ <xsl:choose>
+ <xsl:when test="contains($spans, '0')">
+ <xsl:call-template name="normal-row">
+ <xsl:with-param name="spans" select="$spans"/>
+ <xsl:with-param name="browserows" select="$browserows"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <!--
+ <xsl:message>
+ <xsl:text>Ignoring row: </xsl:text>
+ <xsl:value-of select="$spans"/>
+ <xsl:text> = </xsl:text>
+ <xsl:call-template name="consume-row">
+ <xsl:with-param name="spans" select="$spans"/>
+ </xsl:call-template>
+ </xsl:message>
+ -->
+
+ <xsl:if test="normalize-space(.//text()) != ''">
+ <xsl:message>Warning: overlapped row contains content!</xsl:message>
+ </xsl:if>
+
+ <tr><xsl:comment> This row intentionally left blank </xsl:comment></tr>
+
+ <xsl:if test="$browserows = 'recurse'">
+ <xsl:apply-templates select="following-sibling::row[1]">
+ <xsl:with-param name="spans">
+ <xsl:call-template name="consume-row">
+ <xsl:with-param name="spans" select="$spans"/>
+ </xsl:call-template>
+ </xsl:with-param>
+ <xsl:with-param name="browserows" select="$browserows"/>
+ </xsl:apply-templates>
+ </xsl:if>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="normal-row">
+ <xsl:param name="spans"/>
+ <xsl:param name="browserows"/>
+
+ <xsl:variable name="row-height">
+ <xsl:if test="processing-instruction('dbhtml')">
+ <xsl:call-template name="pi.dbhtml_row-height"/>
+ </xsl:if>
+ </xsl:variable>
+
+ <xsl:variable name="bgcolor">
+ <xsl:if test="processing-instruction('dbhtml')">
+ <xsl:call-template name="pi.dbhtml_bgcolor"/>
+ </xsl:if>
+ </xsl:variable>
+
+ <xsl:variable name="class">
+ <xsl:if test="processing-instruction('dbhtml')">
+ <xsl:call-template name="pi.dbhtml_class"/>
+ </xsl:if>
+ </xsl:variable>
+
+ <tr>
+ <xsl:call-template name="tr.attributes">
+ <xsl:with-param name="rownum">
+ <xsl:number from="tgroup" count="row"/>
+ </xsl:with-param>
+ </xsl:call-template>
+
+ <xsl:if test="$row-height != ''">
+ <xsl:attribute name="height">
+ <xsl:value-of select="$row-height"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:if test="$bgcolor != ''">
+ <xsl:attribute name="style"><xsl:text>background-color: </xsl:text>
+ <xsl:value-of select="$bgcolor"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:if test="$class != ''">
+ <xsl:attribute name="class">
+ <xsl:value-of select="$class"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:if test="$table.borders.with.css != 0">
+ <xsl:if test="@rowsep = 1 and following-sibling::row">
+ <xsl:attribute name="style">
+ <xsl:call-template name="border">
+ <xsl:with-param name="side" select="'bottom'"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ </xsl:if>
+ </xsl:if>
+
+ <xsl:if test="@align">
+ <xsl:attribute name="style"><xsl:text>text-align: </xsl:text>
+ <xsl:value-of select="@align"/>
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:if test="@char">
+ <xsl:attribute name="char">
+ <xsl:value-of select="@char"/>
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:if test="@charoff">
+ <xsl:attribute name="charoff">
+ <xsl:value-of select="@charoff"/>
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:if test="@valign">
+ <xsl:attribute name="valign">
+ <xsl:value-of select="@valign"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:apply-templates select="(entry|entrytbl)[1]">
+ <xsl:with-param name="spans" select="$spans"/>
+ </xsl:apply-templates>
+ </tr>
+
+ <xsl:if test="$browserows = 'recurse'">
+ <xsl:if test="following-sibling::row">
+ <xsl:variable name="nextspans">
+ <xsl:apply-templates select="(entry|entrytbl)[1]" mode="span">
+ <xsl:with-param name="spans" select="$spans"/>
+ </xsl:apply-templates>
+ </xsl:variable>
+
+ <xsl:apply-templates select="following-sibling::row[1]">
+ <xsl:with-param name="spans" select="$nextspans"/>
+ <xsl:with-param name="browserows" select="$browserows"/>
+ </xsl:apply-templates>
+ </xsl:if>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="entry|entrytbl" name="entry">
+ <xsl:param name="col">
+ <xsl:choose>
+ <xsl:when test="@revisionflag">
+ <xsl:number from="row"/>
+ </xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:param>
+
+ <xsl:param name="spans"/>
+
+ <xsl:variable name="cellgi">
+ <xsl:choose>
+ <xsl:when test="ancestor::thead">th</xsl:when>
+ <xsl:when test="ancestor::tfoot">th</xsl:when>
+ <xsl:when test="ancestor::tbody and (ancestor::table[@rowheader = 'firstcol'] or ancestor::informaltable[@rowheader = 'firstcol']) and ancestor-or-self::entry[1][count(preceding-sibling::entry) = 0]">
+ <xsl:text>th</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>td</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="empty.cell" select="count(node()) = 0"/>
+
+ <xsl:variable name="named.colnum">
+ <xsl:call-template name="entry.colnum"/>
+ </xsl:variable>
+
+ <xsl:variable name="entry.colnum">
+ <xsl:choose>
+ <xsl:when test="$named.colnum &gt; 0">
+ <xsl:value-of select="$named.colnum"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$col"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="entry.colspan">
+ <xsl:choose>
+ <xsl:when test="@spanname or @namest">
+ <xsl:call-template name="calculate.colspan"/>
+ </xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="following.spans">
+ <xsl:call-template name="calculate.following.spans">
+ <xsl:with-param name="colspan" select="$entry.colspan"/>
+ <xsl:with-param name="spans" select="$spans"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="rowsep">
+ <xsl:choose>
+ <!-- If this is the last row, rowsep never applies. -->
+ <xsl:when test="ancestor::entrytbl and not (ancestor-or-self::row[1]/following-sibling::row) and not (ancestor::thead)">
+ <xsl:value-of select="0"/>
+ </xsl:when>
+ <xsl:when test="not(ancestor-or-self::row[1]/following-sibling::row or ancestor-or-self::thead/following-sibling::tbody or ancestor-or-self::tbody/preceding-sibling::tfoot)">
+ <xsl:value-of select="0"/>
+ </xsl:when>
+ <xsl:when test="@morerows and not(@morerows &lt; count(ancestor-or-self::row[1]/following-sibling::row))">
+ <xsl:value-of select="0"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="inherited.table.attribute">
+ <xsl:with-param name="entry" select="."/>
+ <xsl:with-param name="colnum" select="$entry.colnum"/>
+ <xsl:with-param name="attribute" select="'rowsep'"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="colsep">
+ <xsl:choose>
+ <!-- If this is the last column, colsep never applies. -->
+ <xsl:when test="$following.spans = ''">0</xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="inherited.table.attribute">
+ <xsl:with-param name="entry" select="."/>
+ <xsl:with-param name="colnum" select="$entry.colnum"/>
+ <xsl:with-param name="attribute" select="'colsep'"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="valign">
+ <xsl:call-template name="inherited.table.attribute">
+ <xsl:with-param name="entry" select="."/>
+ <xsl:with-param name="colnum" select="$entry.colnum"/>
+ <xsl:with-param name="attribute" select="'valign'"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="align">
+ <xsl:call-template name="inherited.table.attribute">
+ <xsl:with-param name="entry" select="."/>
+ <xsl:with-param name="colnum" select="$entry.colnum"/>
+ <xsl:with-param name="attribute" select="'align'"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="char">
+ <xsl:call-template name="inherited.table.attribute">
+ <xsl:with-param name="entry" select="."/>
+ <xsl:with-param name="colnum" select="$entry.colnum"/>
+ <xsl:with-param name="attribute" select="'char'"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="charoff">
+ <xsl:call-template name="inherited.table.attribute">
+ <xsl:with-param name="entry" select="."/>
+ <xsl:with-param name="colnum" select="$entry.colnum"/>
+ <xsl:with-param name="attribute" select="'charoff'"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="$spans != '' and not(starts-with($spans,'0:'))">
+ <xsl:call-template name="entry">
+ <xsl:with-param name="col" select="$col+1"/>
+ <xsl:with-param name="spans" select="substring-after($spans,':')"/>
+ </xsl:call-template>
+ </xsl:when>
+
+ <xsl:when test="number($entry.colnum) &gt; $col">
+ <xsl:call-template name="empty.table.cell"/>
+ <xsl:call-template name="entry">
+ <xsl:with-param name="col" select="$col+1"/>
+ <xsl:with-param name="spans" select="substring-after($spans,':')"/>
+ </xsl:call-template>
+ </xsl:when>
+
+ <xsl:otherwise>
+ <xsl:variable name="bgcolor">
+ <xsl:if test="processing-instruction('dbhtml')">
+ <xsl:call-template name="pi.dbhtml_bgcolor"/>
+ </xsl:if>
+ </xsl:variable>
+
+ <xsl:element name="{$cellgi}" namespace="http://www.w3.org/1999/xhtml">
+ <xsl:if test="$bgcolor != ''">
+ <xsl:attribute name="style"><xsl:text>background-color: </xsl:text>
+ <xsl:value-of select="$bgcolor"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:call-template name="locale.html.attributes"/>
+ <xsl:if test="$entry.propagates.style != 0 and @role">
+ <xsl:apply-templates select="." mode="class.attribute">
+ <xsl:with-param name="class" select="@role"/>
+ </xsl:apply-templates>
+ </xsl:if>
+
+ <xsl:if test="$show.revisionflag and @revisionflag">
+ <xsl:attribute name="class">
+ <xsl:value-of select="@revisionflag"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:if test="$table.borders.with.css != 0">
+ <xsl:attribute name="style">
+ <xsl:if test="$colsep &gt; 0">
+ <xsl:call-template name="border">
+ <xsl:with-param name="side" select="'right'"/>
+ </xsl:call-template>
+ </xsl:if>
+ <xsl:if test="$rowsep &gt; 0">
+ <xsl:call-template name="border">
+ <xsl:with-param name="side" select="'bottom'"/>
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:if test="@morerows &gt; 0">
+ <xsl:attribute name="rowspan">
+ <xsl:value-of select="1+@morerows"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:if test="$entry.colspan &gt; 1">
+ <xsl:attribute name="colspan">
+ <xsl:value-of select="$entry.colspan"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:if test="$align != ''">
+ <xsl:attribute name="style"><xsl:text>text-align: </xsl:text>
+ <xsl:value-of select="$align"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:if test="$valign != ''">
+ <xsl:attribute name="valign">
+ <xsl:value-of select="$valign"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:if test="$char != ''">
+ <xsl:attribute name="char">
+ <xsl:value-of select="$char"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:if test="$charoff != ''">
+ <xsl:attribute name="charoff">
+ <xsl:value-of select="$charoff"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:if test="not(preceding-sibling::*) and (ancestor::row[1]/@id or ancestor::row[1]/@xml:id)">
+ <xsl:call-template name="anchor">
+ <xsl:with-param name="node" select="ancestor::row[1]"/>
+ </xsl:call-template>
+ </xsl:if>
+
+ <xsl:call-template name="anchor"/>
+
+ <xsl:choose>
+ <xsl:when test="$empty.cell">
+ <xsl:text>&#160;</xsl:text>
+ </xsl:when>
+ <xsl:when test="self::entrytbl">
+ <xsl:call-template name="tgroup"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:element>
+
+ <xsl:choose>
+ <xsl:when test="following-sibling::entry|following-sibling::entrytbl">
+ <xsl:apply-templates select="(following-sibling::entry |following-sibling::entrytbl)[1]">
+ <xsl:with-param name="col" select="$col+$entry.colspan"/>
+ <xsl:with-param name="spans" select="$following.spans"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="finaltd">
+ <xsl:with-param name="spans" select="$following.spans"/>
+ <xsl:with-param name="col" select="$col+$entry.colspan"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="entry|entrytbl" name="sentry" mode="span">
+ <xsl:param name="col" select="1"/>
+ <xsl:param name="spans"/>
+
+ <xsl:variable name="entry.colnum">
+ <xsl:call-template name="entry.colnum"/>
+ </xsl:variable>
+
+ <xsl:variable name="entry.colspan">
+ <xsl:choose>
+ <xsl:when test="@spanname or @namest">
+ <xsl:call-template name="calculate.colspan"/>
+ </xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="following.spans">
+ <xsl:call-template name="calculate.following.spans">
+ <xsl:with-param name="colspan" select="$entry.colspan"/>
+ <xsl:with-param name="spans" select="$spans"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="$spans != '' and not(starts-with($spans,'0:'))">
+ <xsl:value-of select="substring-before($spans,':')-1"/>
+ <xsl:text>:</xsl:text>
+ <xsl:call-template name="sentry">
+ <xsl:with-param name="col" select="$col+1"/>
+ <xsl:with-param name="spans" select="substring-after($spans,':')"/>
+ </xsl:call-template>
+ </xsl:when>
+
+ <xsl:when test="number($entry.colnum) &gt; $col">
+ <xsl:text>0:</xsl:text>
+ <xsl:call-template name="sentry">
+ <xsl:with-param name="col" select="$col + 1"/>
+ <xsl:with-param name="spans" select="substring-after($spans,':')"/>
+ </xsl:call-template>
+ </xsl:when>
+
+ <xsl:otherwise>
+ <xsl:call-template name="copy-string">
+ <xsl:with-param name="count" select="$entry.colspan"/>
+ <xsl:with-param name="string">
+ <xsl:choose>
+ <xsl:when test="@morerows">
+ <xsl:value-of select="@morerows"/>
+ </xsl:when>
+ <xsl:otherwise>0</xsl:otherwise>
+ </xsl:choose>
+ <xsl:text>:</xsl:text>
+ </xsl:with-param>
+ </xsl:call-template>
+
+ <xsl:choose>
+ <xsl:when test="following-sibling::entry|following-sibling::entrytbl">
+ <xsl:apply-templates select="(following-sibling::entry |following-sibling::entrytbl)[1]" mode="span">
+ <xsl:with-param name="col" select="$col+$entry.colspan"/>
+ <xsl:with-param name="spans" select="$following.spans"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="sfinaltd">
+ <xsl:with-param name="spans" select="$following.spans"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="generate.colgroup">
+ <xsl:param name="cols" select="1"/>
+ <xsl:param name="count" select="1"/>
+ <xsl:choose>
+ <xsl:when test="$count &gt; $cols"/>
+ <xsl:otherwise>
+ <xsl:call-template name="generate.col">
+ <xsl:with-param name="countcol" select="$count"/>
+ </xsl:call-template>
+ <xsl:call-template name="generate.colgroup">
+ <xsl:with-param name="cols" select="$cols"/>
+ <xsl:with-param name="count" select="$count+1"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="generate.col">
+ <xsl:param name="countcol">1</xsl:param>
+ <xsl:param name="colspecs" select="./colspec"/>
+ <xsl:param name="count">1</xsl:param>
+ <xsl:param name="colnum">1</xsl:param>
+
+ <xsl:choose>
+ <xsl:when test="$count&gt;count($colspecs)">
+ <col/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:variable name="colspec" select="$colspecs[$count=position()]"/>
+ <xsl:variable name="colspec.colnum">
+ <xsl:choose>
+ <xsl:when test="$colspec/@colnum">
+ <xsl:value-of select="$colspec/@colnum"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$colnum"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="$colspec.colnum=$countcol">
+ <col>
+ <xsl:choose>
+ <xsl:when test="$colspec/@colwidth and $use.extensions != 0 and $tablecolumns.extension != 0">
+ <xsl:attribute name="width">
+ <xsl:choose>
+ <xsl:when test="normalize-space($colspec/@colwidth) = '*'">
+ <xsl:value-of select="'1*'"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$colspec/@colwidth"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:attribute>
+ </xsl:when>
+ <!-- pass through to HTML if no * in colspecs -->
+ <xsl:when test="$colspec/@colwidth and not($colspec/parent::*/colspec/@colwidth[contains(.,'*')])">
+ <xsl:attribute name="width">
+ <xsl:choose>
+ <xsl:when test="normalize-space($colspec/@colwidth) = '*'">
+ <xsl:value-of select="'1*'"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$colspec/@colwidth"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:attribute>
+ </xsl:when>
+ </xsl:choose>
+
+ <xsl:choose>
+ <xsl:when test="$colspec/@align">
+ <xsl:attribute name="style"><xsl:text>text-align: </xsl:text>
+ <xsl:value-of select="$colspec/@align"/>
+ </xsl:attribute>
+ </xsl:when>
+ <!-- Suggested by Pavel ZAMPACH <zampach@nemcb.cz> -->
+ <xsl:when test="$colspecs/ancestor::tgroup/@align">
+ <xsl:attribute name="style"><xsl:text>text-align: </xsl:text>
+ <xsl:value-of select="$colspecs/ancestor::tgroup/@align"/>
+ </xsl:attribute>
+ </xsl:when>
+ </xsl:choose>
+
+ <xsl:if test="$colspec/@char">
+ <xsl:attribute name="char">
+ <xsl:value-of select="$colspec/@char"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:if test="$colspec/@charoff">
+ <xsl:attribute name="charoff">
+ <xsl:value-of select="$colspec/@charoff"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:if test="$colspec/@colname">
+ <xsl:attribute name="class">
+ <xsl:value-of select="$colspec/@colname"/>
+ </xsl:attribute>
+ </xsl:if>
+ </col>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="generate.col">
+ <xsl:with-param name="countcol" select="$countcol"/>
+ <xsl:with-param name="colspecs" select="$colspecs"/>
+ <xsl:with-param name="count" select="$count+1"/>
+ <xsl:with-param name="colnum">
+ <xsl:choose>
+ <xsl:when test="$colspec/@colnum">
+ <xsl:value-of select="$colspec/@colnum + 1"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$colnum + 1"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="colspec.colwidth">
+ <!-- when this macro is called, the current context must be an entry -->
+ <xsl:param name="colname"/>
+ <!-- .. = row, ../.. = thead|tbody, ../../.. = tgroup -->
+ <xsl:param name="colspecs" select="../../../../tgroup/colspec"/>
+ <xsl:param name="count">1</xsl:param>
+ <xsl:choose>
+ <xsl:when test="$count&gt;count($colspecs)"/>
+ <xsl:otherwise>
+ <xsl:variable name="colspec" select="$colspecs[$count=position()]"/>
+ <xsl:choose>
+ <xsl:when test="$colspec/@colname=$colname">
+ <xsl:value-of select="$colspec/@colwidth"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="colspec.colwidth">
+ <xsl:with-param name="colname" select="$colname"/>
+ <xsl:with-param name="colspecs" select="$colspecs"/>
+ <xsl:with-param name="count" select="$count+1"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ====================================================================== -->
+
+<xsl:template name="tr.attributes">
+ <xsl:param name="row" select="."/>
+ <xsl:param name="rownum" select="0"/>
+
+ <!-- by default, do nothing. But you might want to say:
+
+ <xsl:if test="$rownum mod 2 = 0">
+ <xsl:attribute name="class">oddrow</xsl:attribute>
+ </xsl:if>
+
+ -->
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/task.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/task.xsl
new file mode 100644
index 0000000..0a380d2
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/task.xsl
@@ -0,0 +1,73 @@
+<?xml version="1.0" encoding="ASCII"?>
+<!--This file was created automatically by html2xhtml-->
+<!--from the HTML stylesheets.-->
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1999/xhtml" version="1.0">
+
+<!-- ********************************************************************
+ $Id: task.xsl 8421 2009-05-04 07:49:49Z bobstayton $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<!-- ==================================================================== -->
+
+<xsl:template match="task">
+ <xsl:variable name="param.placement" select="substring-after(normalize-space($formal.title.placement), concat(local-name(.), ' '))"/>
+
+ <xsl:variable name="placement">
+ <xsl:choose>
+ <xsl:when test="contains($param.placement, ' ')">
+ <xsl:value-of select="substring-before($param.placement, ' ')"/>
+ </xsl:when>
+ <xsl:when test="$param.placement = ''">before</xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$param.placement"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="preamble" select="*[not(self::title or self::titleabbrev)]"/>
+
+ <div>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:call-template name="anchor"/>
+
+ <xsl:if test="title and $placement = 'before'">
+ <xsl:call-template name="formal.object.heading"/>
+ </xsl:if>
+
+ <xsl:apply-templates select="$preamble"/>
+
+ <xsl:if test="title and $placement != 'before'">
+ <xsl:call-template name="formal.object.heading"/>
+ </xsl:if>
+ </div>
+</xsl:template>
+
+<xsl:template match="task/title">
+ <!-- nop -->
+</xsl:template>
+
+<xsl:template match="tasksummary">
+ <xsl:call-template name="semiformal.object"/>
+</xsl:template>
+
+<xsl:template match="tasksummary/title"/>
+
+<xsl:template match="taskprerequisites">
+ <xsl:call-template name="semiformal.object"/>
+</xsl:template>
+
+<xsl:template match="taskprerequisites/title"/>
+
+<xsl:template match="taskrelated">
+ <xsl:call-template name="semiformal.object"/>
+</xsl:template>
+
+<xsl:template match="taskrelated/title"/>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/titlepage.templates.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/titlepage.templates.xsl
new file mode 100644
index 0000000..1f72e23
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/titlepage.templates.xsl
@@ -0,0 +1,3817 @@
+<?xml version="1.0" encoding="ASCII"?>
+<!--This file was created automatically by html2xhtml-->
+<!--from the HTML stylesheets.-->
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:exsl="http://exslt.org/common" xmlns="http://www.w3.org/1999/xhtml" version="1.0" exclude-result-prefixes="exsl">
+
+<!-- This stylesheet was created by template/titlepage.xsl-->
+
+<xsl:template name="article.titlepage.recto">
+ <xsl:choose>
+ <xsl:when test="articleinfo/title">
+ <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="articleinfo/title"/>
+ </xsl:when>
+ <xsl:when test="artheader/title">
+ <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="artheader/title"/>
+ </xsl:when>
+ <xsl:when test="info/title">
+ <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="info/title"/>
+ </xsl:when>
+ <xsl:when test="title">
+ <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="title"/>
+ </xsl:when>
+ </xsl:choose>
+
+ <xsl:choose>
+ <xsl:when test="articleinfo/subtitle">
+ <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="articleinfo/subtitle"/>
+ </xsl:when>
+ <xsl:when test="artheader/subtitle">
+ <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="artheader/subtitle"/>
+ </xsl:when>
+ <xsl:when test="info/subtitle">
+ <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="info/subtitle"/>
+ </xsl:when>
+ <xsl:when test="subtitle">
+ <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="subtitle"/>
+ </xsl:when>
+ </xsl:choose>
+
+ <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="articleinfo/corpauthor"/>
+ <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="artheader/corpauthor"/>
+ <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="info/corpauthor"/>
+ <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="articleinfo/authorgroup"/>
+ <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="artheader/authorgroup"/>
+ <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="info/authorgroup"/>
+ <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="articleinfo/author"/>
+ <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="artheader/author"/>
+ <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="info/author"/>
+ <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="articleinfo/othercredit"/>
+ <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="artheader/othercredit"/>
+ <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="info/othercredit"/>
+ <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="articleinfo/releaseinfo"/>
+ <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="artheader/releaseinfo"/>
+ <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="info/releaseinfo"/>
+ <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="articleinfo/copyright"/>
+ <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="artheader/copyright"/>
+ <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="info/copyright"/>
+ <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="articleinfo/legalnotice"/>
+ <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="artheader/legalnotice"/>
+ <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="info/legalnotice"/>
+ <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="articleinfo/pubdate"/>
+ <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="artheader/pubdate"/>
+ <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="info/pubdate"/>
+ <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="articleinfo/revision"/>
+ <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="artheader/revision"/>
+ <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="info/revision"/>
+ <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="articleinfo/revhistory"/>
+ <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="artheader/revhistory"/>
+ <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="info/revhistory"/>
+ <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="articleinfo/abstract"/>
+ <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="artheader/abstract"/>
+ <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="info/abstract"/>
+</xsl:template>
+
+<xsl:template name="article.titlepage.verso">
+</xsl:template>
+
+<xsl:template name="article.titlepage.separator"><hr/>
+</xsl:template>
+
+<xsl:template name="article.titlepage.before.recto">
+</xsl:template>
+
+<xsl:template name="article.titlepage.before.verso">
+</xsl:template>
+
+<xsl:template name="article.titlepage">
+ <div class="titlepage">
+ <xsl:variable name="recto.content">
+ <xsl:call-template name="article.titlepage.before.recto"/>
+ <xsl:call-template name="article.titlepage.recto"/>
+ </xsl:variable>
+ <xsl:variable name="recto.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($recto.content) != '') or ($recto.elements.count &gt; 0)">
+ <div><xsl:copy-of select="$recto.content"/></div>
+ </xsl:if>
+ <xsl:variable name="verso.content">
+ <xsl:call-template name="article.titlepage.before.verso"/>
+ <xsl:call-template name="article.titlepage.verso"/>
+ </xsl:variable>
+ <xsl:variable name="verso.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($verso.content) != '') or ($verso.elements.count &gt; 0)">
+ <div><xsl:copy-of select="$verso.content"/></div>
+ </xsl:if>
+ <xsl:call-template name="article.titlepage.separator"/>
+ </div>
+</xsl:template>
+
+<xsl:template match="*" mode="article.titlepage.recto.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="*" mode="article.titlepage.verso.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="title" mode="article.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="article.titlepage.recto.style">
+<xsl:apply-templates select="." mode="article.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="subtitle" mode="article.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="article.titlepage.recto.style">
+<xsl:apply-templates select="." mode="article.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="corpauthor" mode="article.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="article.titlepage.recto.style">
+<xsl:apply-templates select="." mode="article.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="authorgroup" mode="article.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="article.titlepage.recto.style">
+<xsl:apply-templates select="." mode="article.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="author" mode="article.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="article.titlepage.recto.style">
+<xsl:apply-templates select="." mode="article.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="othercredit" mode="article.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="article.titlepage.recto.style">
+<xsl:apply-templates select="." mode="article.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="releaseinfo" mode="article.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="article.titlepage.recto.style">
+<xsl:apply-templates select="." mode="article.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="copyright" mode="article.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="article.titlepage.recto.style">
+<xsl:apply-templates select="." mode="article.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="legalnotice" mode="article.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="article.titlepage.recto.style">
+<xsl:apply-templates select="." mode="article.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="pubdate" mode="article.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="article.titlepage.recto.style">
+<xsl:apply-templates select="." mode="article.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="revision" mode="article.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="article.titlepage.recto.style">
+<xsl:apply-templates select="." mode="article.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="revhistory" mode="article.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="article.titlepage.recto.style">
+<xsl:apply-templates select="." mode="article.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="abstract" mode="article.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="article.titlepage.recto.style">
+<xsl:apply-templates select="." mode="article.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template name="set.titlepage.recto">
+ <xsl:choose>
+ <xsl:when test="setinfo/title">
+ <xsl:apply-templates mode="set.titlepage.recto.auto.mode" select="setinfo/title"/>
+ </xsl:when>
+ <xsl:when test="info/title">
+ <xsl:apply-templates mode="set.titlepage.recto.auto.mode" select="info/title"/>
+ </xsl:when>
+ <xsl:when test="title">
+ <xsl:apply-templates mode="set.titlepage.recto.auto.mode" select="title"/>
+ </xsl:when>
+ </xsl:choose>
+
+ <xsl:choose>
+ <xsl:when test="setinfo/subtitle">
+ <xsl:apply-templates mode="set.titlepage.recto.auto.mode" select="setinfo/subtitle"/>
+ </xsl:when>
+ <xsl:when test="info/subtitle">
+ <xsl:apply-templates mode="set.titlepage.recto.auto.mode" select="info/subtitle"/>
+ </xsl:when>
+ <xsl:when test="subtitle">
+ <xsl:apply-templates mode="set.titlepage.recto.auto.mode" select="subtitle"/>
+ </xsl:when>
+ </xsl:choose>
+
+ <xsl:apply-templates mode="set.titlepage.recto.auto.mode" select="setinfo/corpauthor"/>
+ <xsl:apply-templates mode="set.titlepage.recto.auto.mode" select="info/corpauthor"/>
+ <xsl:apply-templates mode="set.titlepage.recto.auto.mode" select="setinfo/authorgroup"/>
+ <xsl:apply-templates mode="set.titlepage.recto.auto.mode" select="info/authorgroup"/>
+ <xsl:apply-templates mode="set.titlepage.recto.auto.mode" select="setinfo/author"/>
+ <xsl:apply-templates mode="set.titlepage.recto.auto.mode" select="info/author"/>
+ <xsl:apply-templates mode="set.titlepage.recto.auto.mode" select="setinfo/othercredit"/>
+ <xsl:apply-templates mode="set.titlepage.recto.auto.mode" select="info/othercredit"/>
+ <xsl:apply-templates mode="set.titlepage.recto.auto.mode" select="setinfo/releaseinfo"/>
+ <xsl:apply-templates mode="set.titlepage.recto.auto.mode" select="info/releaseinfo"/>
+ <xsl:apply-templates mode="set.titlepage.recto.auto.mode" select="setinfo/copyright"/>
+ <xsl:apply-templates mode="set.titlepage.recto.auto.mode" select="info/copyright"/>
+ <xsl:apply-templates mode="set.titlepage.recto.auto.mode" select="setinfo/legalnotice"/>
+ <xsl:apply-templates mode="set.titlepage.recto.auto.mode" select="info/legalnotice"/>
+ <xsl:apply-templates mode="set.titlepage.recto.auto.mode" select="setinfo/pubdate"/>
+ <xsl:apply-templates mode="set.titlepage.recto.auto.mode" select="info/pubdate"/>
+ <xsl:apply-templates mode="set.titlepage.recto.auto.mode" select="setinfo/revision"/>
+ <xsl:apply-templates mode="set.titlepage.recto.auto.mode" select="info/revision"/>
+ <xsl:apply-templates mode="set.titlepage.recto.auto.mode" select="setinfo/revhistory"/>
+ <xsl:apply-templates mode="set.titlepage.recto.auto.mode" select="info/revhistory"/>
+ <xsl:apply-templates mode="set.titlepage.recto.auto.mode" select="setinfo/abstract"/>
+ <xsl:apply-templates mode="set.titlepage.recto.auto.mode" select="info/abstract"/>
+</xsl:template>
+
+<xsl:template name="set.titlepage.verso">
+</xsl:template>
+
+<xsl:template name="set.titlepage.separator"><hr/>
+</xsl:template>
+
+<xsl:template name="set.titlepage.before.recto">
+</xsl:template>
+
+<xsl:template name="set.titlepage.before.verso">
+</xsl:template>
+
+<xsl:template name="set.titlepage">
+ <div class="titlepage">
+ <xsl:variable name="recto.content">
+ <xsl:call-template name="set.titlepage.before.recto"/>
+ <xsl:call-template name="set.titlepage.recto"/>
+ </xsl:variable>
+ <xsl:variable name="recto.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($recto.content) != '') or ($recto.elements.count &gt; 0)">
+ <div><xsl:copy-of select="$recto.content"/></div>
+ </xsl:if>
+ <xsl:variable name="verso.content">
+ <xsl:call-template name="set.titlepage.before.verso"/>
+ <xsl:call-template name="set.titlepage.verso"/>
+ </xsl:variable>
+ <xsl:variable name="verso.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($verso.content) != '') or ($verso.elements.count &gt; 0)">
+ <div><xsl:copy-of select="$verso.content"/></div>
+ </xsl:if>
+ <xsl:call-template name="set.titlepage.separator"/>
+ </div>
+</xsl:template>
+
+<xsl:template match="*" mode="set.titlepage.recto.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="*" mode="set.titlepage.verso.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="title" mode="set.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="set.titlepage.recto.style">
+<xsl:apply-templates select="." mode="set.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="subtitle" mode="set.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="set.titlepage.recto.style">
+<xsl:apply-templates select="." mode="set.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="corpauthor" mode="set.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="set.titlepage.recto.style">
+<xsl:apply-templates select="." mode="set.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="authorgroup" mode="set.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="set.titlepage.recto.style">
+<xsl:apply-templates select="." mode="set.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="author" mode="set.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="set.titlepage.recto.style">
+<xsl:apply-templates select="." mode="set.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="othercredit" mode="set.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="set.titlepage.recto.style">
+<xsl:apply-templates select="." mode="set.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="releaseinfo" mode="set.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="set.titlepage.recto.style">
+<xsl:apply-templates select="." mode="set.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="copyright" mode="set.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="set.titlepage.recto.style">
+<xsl:apply-templates select="." mode="set.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="legalnotice" mode="set.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="set.titlepage.recto.style">
+<xsl:apply-templates select="." mode="set.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="pubdate" mode="set.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="set.titlepage.recto.style">
+<xsl:apply-templates select="." mode="set.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="revision" mode="set.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="set.titlepage.recto.style">
+<xsl:apply-templates select="." mode="set.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="revhistory" mode="set.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="set.titlepage.recto.style">
+<xsl:apply-templates select="." mode="set.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="abstract" mode="set.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="set.titlepage.recto.style">
+<xsl:apply-templates select="." mode="set.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template name="book.titlepage.recto">
+ <xsl:choose>
+ <xsl:when test="bookinfo/title">
+ <xsl:apply-templates mode="book.titlepage.recto.auto.mode" select="bookinfo/title"/>
+ </xsl:when>
+ <xsl:when test="info/title">
+ <xsl:apply-templates mode="book.titlepage.recto.auto.mode" select="info/title"/>
+ </xsl:when>
+ <xsl:when test="title">
+ <xsl:apply-templates mode="book.titlepage.recto.auto.mode" select="title"/>
+ </xsl:when>
+ </xsl:choose>
+
+ <xsl:choose>
+ <xsl:when test="bookinfo/subtitle">
+ <xsl:apply-templates mode="book.titlepage.recto.auto.mode" select="bookinfo/subtitle"/>
+ </xsl:when>
+ <xsl:when test="info/subtitle">
+ <xsl:apply-templates mode="book.titlepage.recto.auto.mode" select="info/subtitle"/>
+ </xsl:when>
+ <xsl:when test="subtitle">
+ <xsl:apply-templates mode="book.titlepage.recto.auto.mode" select="subtitle"/>
+ </xsl:when>
+ </xsl:choose>
+
+ <xsl:apply-templates mode="book.titlepage.recto.auto.mode" select="bookinfo/corpauthor"/>
+ <xsl:apply-templates mode="book.titlepage.recto.auto.mode" select="info/corpauthor"/>
+ <xsl:apply-templates mode="book.titlepage.recto.auto.mode" select="bookinfo/authorgroup"/>
+ <xsl:apply-templates mode="book.titlepage.recto.auto.mode" select="info/authorgroup"/>
+ <xsl:apply-templates mode="book.titlepage.recto.auto.mode" select="bookinfo/author"/>
+ <xsl:apply-templates mode="book.titlepage.recto.auto.mode" select="info/author"/>
+ <xsl:apply-templates mode="book.titlepage.recto.auto.mode" select="bookinfo/othercredit"/>
+ <xsl:apply-templates mode="book.titlepage.recto.auto.mode" select="info/othercredit"/>
+ <xsl:apply-templates mode="book.titlepage.recto.auto.mode" select="bookinfo/releaseinfo"/>
+ <xsl:apply-templates mode="book.titlepage.recto.auto.mode" select="info/releaseinfo"/>
+ <xsl:apply-templates mode="book.titlepage.recto.auto.mode" select="bookinfo/copyright"/>
+ <xsl:apply-templates mode="book.titlepage.recto.auto.mode" select="info/copyright"/>
+ <xsl:apply-templates mode="book.titlepage.recto.auto.mode" select="bookinfo/legalnotice"/>
+ <xsl:apply-templates mode="book.titlepage.recto.auto.mode" select="info/legalnotice"/>
+ <xsl:apply-templates mode="book.titlepage.recto.auto.mode" select="bookinfo/pubdate"/>
+ <xsl:apply-templates mode="book.titlepage.recto.auto.mode" select="info/pubdate"/>
+ <xsl:apply-templates mode="book.titlepage.recto.auto.mode" select="bookinfo/revision"/>
+ <xsl:apply-templates mode="book.titlepage.recto.auto.mode" select="info/revision"/>
+ <xsl:apply-templates mode="book.titlepage.recto.auto.mode" select="bookinfo/revhistory"/>
+ <xsl:apply-templates mode="book.titlepage.recto.auto.mode" select="info/revhistory"/>
+ <xsl:apply-templates mode="book.titlepage.recto.auto.mode" select="bookinfo/abstract"/>
+ <xsl:apply-templates mode="book.titlepage.recto.auto.mode" select="info/abstract"/>
+</xsl:template>
+
+<xsl:template name="book.titlepage.verso">
+</xsl:template>
+
+<xsl:template name="book.titlepage.separator"><hr/>
+</xsl:template>
+
+<xsl:template name="book.titlepage.before.recto">
+</xsl:template>
+
+<xsl:template name="book.titlepage.before.verso">
+</xsl:template>
+
+<xsl:template name="book.titlepage">
+ <div class="titlepage">
+ <xsl:variable name="recto.content">
+ <xsl:call-template name="book.titlepage.before.recto"/>
+ <xsl:call-template name="book.titlepage.recto"/>
+ </xsl:variable>
+ <xsl:variable name="recto.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($recto.content) != '') or ($recto.elements.count &gt; 0)">
+ <div><xsl:copy-of select="$recto.content"/></div>
+ </xsl:if>
+ <xsl:variable name="verso.content">
+ <xsl:call-template name="book.titlepage.before.verso"/>
+ <xsl:call-template name="book.titlepage.verso"/>
+ </xsl:variable>
+ <xsl:variable name="verso.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($verso.content) != '') or ($verso.elements.count &gt; 0)">
+ <div><xsl:copy-of select="$verso.content"/></div>
+ </xsl:if>
+ <xsl:call-template name="book.titlepage.separator"/>
+ </div>
+</xsl:template>
+
+<xsl:template match="*" mode="book.titlepage.recto.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="*" mode="book.titlepage.verso.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="title" mode="book.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="book.titlepage.recto.style">
+<xsl:apply-templates select="." mode="book.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="subtitle" mode="book.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="book.titlepage.recto.style">
+<xsl:apply-templates select="." mode="book.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="corpauthor" mode="book.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="book.titlepage.recto.style">
+<xsl:apply-templates select="." mode="book.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="authorgroup" mode="book.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="book.titlepage.recto.style">
+<xsl:apply-templates select="." mode="book.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="author" mode="book.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="book.titlepage.recto.style">
+<xsl:apply-templates select="." mode="book.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="othercredit" mode="book.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="book.titlepage.recto.style">
+<xsl:apply-templates select="." mode="book.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="releaseinfo" mode="book.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="book.titlepage.recto.style">
+<xsl:apply-templates select="." mode="book.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="copyright" mode="book.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="book.titlepage.recto.style">
+<xsl:apply-templates select="." mode="book.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="legalnotice" mode="book.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="book.titlepage.recto.style">
+<xsl:apply-templates select="." mode="book.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="pubdate" mode="book.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="book.titlepage.recto.style">
+<xsl:apply-templates select="." mode="book.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="revision" mode="book.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="book.titlepage.recto.style">
+<xsl:apply-templates select="." mode="book.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="revhistory" mode="book.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="book.titlepage.recto.style">
+<xsl:apply-templates select="." mode="book.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="abstract" mode="book.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="book.titlepage.recto.style">
+<xsl:apply-templates select="." mode="book.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template name="part.titlepage.recto">
+ <div xsl:use-attribute-sets="part.titlepage.recto.style">
+<xsl:call-template name="division.title">
+<xsl:with-param name="node" select="ancestor-or-self::part[1]"/>
+</xsl:call-template></div>
+ <xsl:choose>
+ <xsl:when test="partinfo/subtitle">
+ <xsl:apply-templates mode="part.titlepage.recto.auto.mode" select="partinfo/subtitle"/>
+ </xsl:when>
+ <xsl:when test="docinfo/subtitle">
+ <xsl:apply-templates mode="part.titlepage.recto.auto.mode" select="docinfo/subtitle"/>
+ </xsl:when>
+ <xsl:when test="info/subtitle">
+ <xsl:apply-templates mode="part.titlepage.recto.auto.mode" select="info/subtitle"/>
+ </xsl:when>
+ <xsl:when test="subtitle">
+ <xsl:apply-templates mode="part.titlepage.recto.auto.mode" select="subtitle"/>
+ </xsl:when>
+ </xsl:choose>
+
+ <xsl:apply-templates mode="part.titlepage.recto.auto.mode" select="partinfo/corpauthor"/>
+ <xsl:apply-templates mode="part.titlepage.recto.auto.mode" select="docinfo/corpauthor"/>
+ <xsl:apply-templates mode="part.titlepage.recto.auto.mode" select="info/corpauthor"/>
+ <xsl:apply-templates mode="part.titlepage.recto.auto.mode" select="partinfo/authorgroup"/>
+ <xsl:apply-templates mode="part.titlepage.recto.auto.mode" select="docinfo/authorgroup"/>
+ <xsl:apply-templates mode="part.titlepage.recto.auto.mode" select="info/authorgroup"/>
+ <xsl:apply-templates mode="part.titlepage.recto.auto.mode" select="partinfo/author"/>
+ <xsl:apply-templates mode="part.titlepage.recto.auto.mode" select="docinfo/author"/>
+ <xsl:apply-templates mode="part.titlepage.recto.auto.mode" select="info/author"/>
+ <xsl:apply-templates mode="part.titlepage.recto.auto.mode" select="partinfo/othercredit"/>
+ <xsl:apply-templates mode="part.titlepage.recto.auto.mode" select="docinfo/othercredit"/>
+ <xsl:apply-templates mode="part.titlepage.recto.auto.mode" select="info/othercredit"/>
+ <xsl:apply-templates mode="part.titlepage.recto.auto.mode" select="partinfo/releaseinfo"/>
+ <xsl:apply-templates mode="part.titlepage.recto.auto.mode" select="docinfo/releaseinfo"/>
+ <xsl:apply-templates mode="part.titlepage.recto.auto.mode" select="info/releaseinfo"/>
+ <xsl:apply-templates mode="part.titlepage.recto.auto.mode" select="partinfo/copyright"/>
+ <xsl:apply-templates mode="part.titlepage.recto.auto.mode" select="docinfo/copyright"/>
+ <xsl:apply-templates mode="part.titlepage.recto.auto.mode" select="info/copyright"/>
+ <xsl:apply-templates mode="part.titlepage.recto.auto.mode" select="partinfo/legalnotice"/>
+ <xsl:apply-templates mode="part.titlepage.recto.auto.mode" select="docinfo/legalnotice"/>
+ <xsl:apply-templates mode="part.titlepage.recto.auto.mode" select="info/legalnotice"/>
+ <xsl:apply-templates mode="part.titlepage.recto.auto.mode" select="partinfo/pubdate"/>
+ <xsl:apply-templates mode="part.titlepage.recto.auto.mode" select="docinfo/pubdate"/>
+ <xsl:apply-templates mode="part.titlepage.recto.auto.mode" select="info/pubdate"/>
+ <xsl:apply-templates mode="part.titlepage.recto.auto.mode" select="partinfo/revision"/>
+ <xsl:apply-templates mode="part.titlepage.recto.auto.mode" select="docinfo/revision"/>
+ <xsl:apply-templates mode="part.titlepage.recto.auto.mode" select="info/revision"/>
+ <xsl:apply-templates mode="part.titlepage.recto.auto.mode" select="partinfo/revhistory"/>
+ <xsl:apply-templates mode="part.titlepage.recto.auto.mode" select="docinfo/revhistory"/>
+ <xsl:apply-templates mode="part.titlepage.recto.auto.mode" select="info/revhistory"/>
+ <xsl:apply-templates mode="part.titlepage.recto.auto.mode" select="partinfo/abstract"/>
+ <xsl:apply-templates mode="part.titlepage.recto.auto.mode" select="docinfo/abstract"/>
+ <xsl:apply-templates mode="part.titlepage.recto.auto.mode" select="info/abstract"/>
+</xsl:template>
+
+<xsl:template name="part.titlepage.verso">
+</xsl:template>
+
+<xsl:template name="part.titlepage.separator">
+</xsl:template>
+
+<xsl:template name="part.titlepage.before.recto">
+</xsl:template>
+
+<xsl:template name="part.titlepage.before.verso">
+</xsl:template>
+
+<xsl:template name="part.titlepage">
+ <div class="titlepage">
+ <xsl:variable name="recto.content">
+ <xsl:call-template name="part.titlepage.before.recto"/>
+ <xsl:call-template name="part.titlepage.recto"/>
+ </xsl:variable>
+ <xsl:variable name="recto.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($recto.content) != '') or ($recto.elements.count &gt; 0)">
+ <div><xsl:copy-of select="$recto.content"/></div>
+ </xsl:if>
+ <xsl:variable name="verso.content">
+ <xsl:call-template name="part.titlepage.before.verso"/>
+ <xsl:call-template name="part.titlepage.verso"/>
+ </xsl:variable>
+ <xsl:variable name="verso.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($verso.content) != '') or ($verso.elements.count &gt; 0)">
+ <div><xsl:copy-of select="$verso.content"/></div>
+ </xsl:if>
+ <xsl:call-template name="part.titlepage.separator"/>
+ </div>
+</xsl:template>
+
+<xsl:template match="*" mode="part.titlepage.recto.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="*" mode="part.titlepage.verso.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="subtitle" mode="part.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="part.titlepage.recto.style">
+<xsl:apply-templates select="." mode="part.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="corpauthor" mode="part.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="part.titlepage.recto.style">
+<xsl:apply-templates select="." mode="part.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="authorgroup" mode="part.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="part.titlepage.recto.style">
+<xsl:apply-templates select="." mode="part.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="author" mode="part.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="part.titlepage.recto.style">
+<xsl:apply-templates select="." mode="part.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="othercredit" mode="part.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="part.titlepage.recto.style">
+<xsl:apply-templates select="." mode="part.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="releaseinfo" mode="part.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="part.titlepage.recto.style">
+<xsl:apply-templates select="." mode="part.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="copyright" mode="part.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="part.titlepage.recto.style">
+<xsl:apply-templates select="." mode="part.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="legalnotice" mode="part.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="part.titlepage.recto.style">
+<xsl:apply-templates select="." mode="part.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="pubdate" mode="part.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="part.titlepage.recto.style">
+<xsl:apply-templates select="." mode="part.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="revision" mode="part.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="part.titlepage.recto.style">
+<xsl:apply-templates select="." mode="part.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="revhistory" mode="part.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="part.titlepage.recto.style">
+<xsl:apply-templates select="." mode="part.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="abstract" mode="part.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="part.titlepage.recto.style">
+<xsl:apply-templates select="." mode="part.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template name="partintro.titlepage.recto">
+ <xsl:choose>
+ <xsl:when test="partintroinfo/title">
+ <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="partintroinfo/title"/>
+ </xsl:when>
+ <xsl:when test="docinfo/title">
+ <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="docinfo/title"/>
+ </xsl:when>
+ <xsl:when test="info/title">
+ <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="info/title"/>
+ </xsl:when>
+ <xsl:when test="title">
+ <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="title"/>
+ </xsl:when>
+ </xsl:choose>
+
+ <xsl:choose>
+ <xsl:when test="partintroinfo/subtitle">
+ <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="partintroinfo/subtitle"/>
+ </xsl:when>
+ <xsl:when test="docinfo/subtitle">
+ <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="docinfo/subtitle"/>
+ </xsl:when>
+ <xsl:when test="info/subtitle">
+ <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="info/subtitle"/>
+ </xsl:when>
+ <xsl:when test="subtitle">
+ <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="subtitle"/>
+ </xsl:when>
+ </xsl:choose>
+
+ <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="partintroinfo/corpauthor"/>
+ <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="docinfo/corpauthor"/>
+ <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="info/corpauthor"/>
+ <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="partintroinfo/authorgroup"/>
+ <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="docinfo/authorgroup"/>
+ <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="info/authorgroup"/>
+ <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="partintroinfo/author"/>
+ <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="docinfo/author"/>
+ <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="info/author"/>
+ <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="partintroinfo/othercredit"/>
+ <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="docinfo/othercredit"/>
+ <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="info/othercredit"/>
+ <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="partintroinfo/releaseinfo"/>
+ <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="docinfo/releaseinfo"/>
+ <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="info/releaseinfo"/>
+ <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="partintroinfo/copyright"/>
+ <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="docinfo/copyright"/>
+ <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="info/copyright"/>
+ <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="partintroinfo/legalnotice"/>
+ <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="docinfo/legalnotice"/>
+ <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="info/legalnotice"/>
+ <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="partintroinfo/pubdate"/>
+ <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="docinfo/pubdate"/>
+ <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="info/pubdate"/>
+ <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="partintroinfo/revision"/>
+ <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="docinfo/revision"/>
+ <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="info/revision"/>
+ <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="partintroinfo/revhistory"/>
+ <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="docinfo/revhistory"/>
+ <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="info/revhistory"/>
+ <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="partintroinfo/abstract"/>
+ <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="docinfo/abstract"/>
+ <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="info/abstract"/>
+</xsl:template>
+
+<xsl:template name="partintro.titlepage.verso">
+</xsl:template>
+
+<xsl:template name="partintro.titlepage.separator">
+</xsl:template>
+
+<xsl:template name="partintro.titlepage.before.recto">
+</xsl:template>
+
+<xsl:template name="partintro.titlepage.before.verso">
+</xsl:template>
+
+<xsl:template name="partintro.titlepage">
+ <div>
+ <xsl:variable name="recto.content">
+ <xsl:call-template name="partintro.titlepage.before.recto"/>
+ <xsl:call-template name="partintro.titlepage.recto"/>
+ </xsl:variable>
+ <xsl:variable name="recto.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($recto.content) != '') or ($recto.elements.count &gt; 0)">
+ <div><xsl:copy-of select="$recto.content"/></div>
+ </xsl:if>
+ <xsl:variable name="verso.content">
+ <xsl:call-template name="partintro.titlepage.before.verso"/>
+ <xsl:call-template name="partintro.titlepage.verso"/>
+ </xsl:variable>
+ <xsl:variable name="verso.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($verso.content) != '') or ($verso.elements.count &gt; 0)">
+ <div><xsl:copy-of select="$verso.content"/></div>
+ </xsl:if>
+ <xsl:call-template name="partintro.titlepage.separator"/>
+ </div>
+</xsl:template>
+
+<xsl:template match="*" mode="partintro.titlepage.recto.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="*" mode="partintro.titlepage.verso.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="title" mode="partintro.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="partintro.titlepage.recto.style">
+<xsl:apply-templates select="." mode="partintro.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="subtitle" mode="partintro.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="partintro.titlepage.recto.style">
+<xsl:apply-templates select="." mode="partintro.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="corpauthor" mode="partintro.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="partintro.titlepage.recto.style">
+<xsl:apply-templates select="." mode="partintro.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="authorgroup" mode="partintro.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="partintro.titlepage.recto.style">
+<xsl:apply-templates select="." mode="partintro.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="author" mode="partintro.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="partintro.titlepage.recto.style">
+<xsl:apply-templates select="." mode="partintro.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="othercredit" mode="partintro.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="partintro.titlepage.recto.style">
+<xsl:apply-templates select="." mode="partintro.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="releaseinfo" mode="partintro.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="partintro.titlepage.recto.style">
+<xsl:apply-templates select="." mode="partintro.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="copyright" mode="partintro.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="partintro.titlepage.recto.style">
+<xsl:apply-templates select="." mode="partintro.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="legalnotice" mode="partintro.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="partintro.titlepage.recto.style">
+<xsl:apply-templates select="." mode="partintro.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="pubdate" mode="partintro.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="partintro.titlepage.recto.style">
+<xsl:apply-templates select="." mode="partintro.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="revision" mode="partintro.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="partintro.titlepage.recto.style">
+<xsl:apply-templates select="." mode="partintro.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="revhistory" mode="partintro.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="partintro.titlepage.recto.style">
+<xsl:apply-templates select="." mode="partintro.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="abstract" mode="partintro.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="partintro.titlepage.recto.style">
+<xsl:apply-templates select="." mode="partintro.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template name="reference.titlepage.recto">
+ <xsl:choose>
+ <xsl:when test="referenceinfo/title">
+ <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="referenceinfo/title"/>
+ </xsl:when>
+ <xsl:when test="docinfo/title">
+ <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="docinfo/title"/>
+ </xsl:when>
+ <xsl:when test="info/title">
+ <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="info/title"/>
+ </xsl:when>
+ <xsl:when test="title">
+ <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="title"/>
+ </xsl:when>
+ </xsl:choose>
+
+ <xsl:choose>
+ <xsl:when test="referenceinfo/subtitle">
+ <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="referenceinfo/subtitle"/>
+ </xsl:when>
+ <xsl:when test="docinfo/subtitle">
+ <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="docinfo/subtitle"/>
+ </xsl:when>
+ <xsl:when test="info/subtitle">
+ <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="info/subtitle"/>
+ </xsl:when>
+ <xsl:when test="subtitle">
+ <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="subtitle"/>
+ </xsl:when>
+ </xsl:choose>
+
+ <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="referenceinfo/corpauthor"/>
+ <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="docinfo/corpauthor"/>
+ <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="info/corpauthor"/>
+ <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="referenceinfo/authorgroup"/>
+ <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="docinfo/authorgroup"/>
+ <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="info/authorgroup"/>
+ <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="referenceinfo/author"/>
+ <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="docinfo/author"/>
+ <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="info/author"/>
+ <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="referenceinfo/othercredit"/>
+ <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="docinfo/othercredit"/>
+ <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="info/othercredit"/>
+ <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="referenceinfo/releaseinfo"/>
+ <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="docinfo/releaseinfo"/>
+ <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="info/releaseinfo"/>
+ <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="referenceinfo/copyright"/>
+ <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="docinfo/copyright"/>
+ <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="info/copyright"/>
+ <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="referenceinfo/legalnotice"/>
+ <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="docinfo/legalnotice"/>
+ <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="info/legalnotice"/>
+ <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="referenceinfo/pubdate"/>
+ <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="docinfo/pubdate"/>
+ <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="info/pubdate"/>
+ <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="referenceinfo/revision"/>
+ <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="docinfo/revision"/>
+ <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="info/revision"/>
+ <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="referenceinfo/revhistory"/>
+ <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="docinfo/revhistory"/>
+ <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="info/revhistory"/>
+ <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="referenceinfo/abstract"/>
+ <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="docinfo/abstract"/>
+ <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="info/abstract"/>
+</xsl:template>
+
+<xsl:template name="reference.titlepage.verso">
+</xsl:template>
+
+<xsl:template name="reference.titlepage.separator"><hr/>
+</xsl:template>
+
+<xsl:template name="reference.titlepage.before.recto">
+</xsl:template>
+
+<xsl:template name="reference.titlepage.before.verso">
+</xsl:template>
+
+<xsl:template name="reference.titlepage">
+ <div class="titlepage">
+ <xsl:variable name="recto.content">
+ <xsl:call-template name="reference.titlepage.before.recto"/>
+ <xsl:call-template name="reference.titlepage.recto"/>
+ </xsl:variable>
+ <xsl:variable name="recto.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($recto.content) != '') or ($recto.elements.count &gt; 0)">
+ <div><xsl:copy-of select="$recto.content"/></div>
+ </xsl:if>
+ <xsl:variable name="verso.content">
+ <xsl:call-template name="reference.titlepage.before.verso"/>
+ <xsl:call-template name="reference.titlepage.verso"/>
+ </xsl:variable>
+ <xsl:variable name="verso.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($verso.content) != '') or ($verso.elements.count &gt; 0)">
+ <div><xsl:copy-of select="$verso.content"/></div>
+ </xsl:if>
+ <xsl:call-template name="reference.titlepage.separator"/>
+ </div>
+</xsl:template>
+
+<xsl:template match="*" mode="reference.titlepage.recto.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="*" mode="reference.titlepage.verso.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="title" mode="reference.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="reference.titlepage.recto.style">
+<xsl:apply-templates select="." mode="reference.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="subtitle" mode="reference.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="reference.titlepage.recto.style">
+<xsl:apply-templates select="." mode="reference.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="corpauthor" mode="reference.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="reference.titlepage.recto.style">
+<xsl:apply-templates select="." mode="reference.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="authorgroup" mode="reference.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="reference.titlepage.recto.style">
+<xsl:apply-templates select="." mode="reference.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="author" mode="reference.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="reference.titlepage.recto.style">
+<xsl:apply-templates select="." mode="reference.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="othercredit" mode="reference.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="reference.titlepage.recto.style">
+<xsl:apply-templates select="." mode="reference.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="releaseinfo" mode="reference.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="reference.titlepage.recto.style">
+<xsl:apply-templates select="." mode="reference.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="copyright" mode="reference.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="reference.titlepage.recto.style">
+<xsl:apply-templates select="." mode="reference.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="legalnotice" mode="reference.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="reference.titlepage.recto.style">
+<xsl:apply-templates select="." mode="reference.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="pubdate" mode="reference.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="reference.titlepage.recto.style">
+<xsl:apply-templates select="." mode="reference.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="revision" mode="reference.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="reference.titlepage.recto.style">
+<xsl:apply-templates select="." mode="reference.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="revhistory" mode="reference.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="reference.titlepage.recto.style">
+<xsl:apply-templates select="." mode="reference.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="abstract" mode="reference.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="reference.titlepage.recto.style">
+<xsl:apply-templates select="." mode="reference.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template name="refentry.titlepage.recto">
+</xsl:template>
+
+<xsl:template name="refentry.titlepage.verso">
+</xsl:template>
+
+<xsl:template name="refentry.titlepage.separator">
+</xsl:template>
+
+<xsl:template name="refentry.titlepage.before.recto">
+</xsl:template>
+
+<xsl:template name="refentry.titlepage.before.verso">
+</xsl:template>
+
+<xsl:template name="refentry.titlepage">
+ <div class="titlepage">
+ <xsl:variable name="recto.content">
+ <xsl:call-template name="refentry.titlepage.before.recto"/>
+ <xsl:call-template name="refentry.titlepage.recto"/>
+ </xsl:variable>
+ <xsl:variable name="recto.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($recto.content) != '') or ($recto.elements.count &gt; 0)">
+ <div><xsl:copy-of select="$recto.content"/></div>
+ </xsl:if>
+ <xsl:variable name="verso.content">
+ <xsl:call-template name="refentry.titlepage.before.verso"/>
+ <xsl:call-template name="refentry.titlepage.verso"/>
+ </xsl:variable>
+ <xsl:variable name="verso.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($verso.content) != '') or ($verso.elements.count &gt; 0)">
+ <div><xsl:copy-of select="$verso.content"/></div>
+ </xsl:if>
+ <xsl:call-template name="refentry.titlepage.separator"/>
+ </div>
+</xsl:template>
+
+<xsl:template match="*" mode="refentry.titlepage.recto.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="*" mode="refentry.titlepage.verso.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template name="dedication.titlepage.recto">
+ <div xsl:use-attribute-sets="dedication.titlepage.recto.style">
+<xsl:call-template name="component.title">
+<xsl:with-param name="node" select="ancestor-or-self::dedication[1]"/>
+</xsl:call-template></div>
+ <xsl:choose>
+ <xsl:when test="dedicationinfo/subtitle">
+ <xsl:apply-templates mode="dedication.titlepage.recto.auto.mode" select="dedicationinfo/subtitle"/>
+ </xsl:when>
+ <xsl:when test="docinfo/subtitle">
+ <xsl:apply-templates mode="dedication.titlepage.recto.auto.mode" select="docinfo/subtitle"/>
+ </xsl:when>
+ <xsl:when test="info/subtitle">
+ <xsl:apply-templates mode="dedication.titlepage.recto.auto.mode" select="info/subtitle"/>
+ </xsl:when>
+ <xsl:when test="subtitle">
+ <xsl:apply-templates mode="dedication.titlepage.recto.auto.mode" select="subtitle"/>
+ </xsl:when>
+ </xsl:choose>
+
+</xsl:template>
+
+<xsl:template name="dedication.titlepage.verso">
+</xsl:template>
+
+<xsl:template name="dedication.titlepage.separator">
+</xsl:template>
+
+<xsl:template name="dedication.titlepage.before.recto">
+</xsl:template>
+
+<xsl:template name="dedication.titlepage.before.verso">
+</xsl:template>
+
+<xsl:template name="dedication.titlepage">
+ <div class="titlepage">
+ <xsl:variable name="recto.content">
+ <xsl:call-template name="dedication.titlepage.before.recto"/>
+ <xsl:call-template name="dedication.titlepage.recto"/>
+ </xsl:variable>
+ <xsl:variable name="recto.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($recto.content) != '') or ($recto.elements.count &gt; 0)">
+ <div><xsl:copy-of select="$recto.content"/></div>
+ </xsl:if>
+ <xsl:variable name="verso.content">
+ <xsl:call-template name="dedication.titlepage.before.verso"/>
+ <xsl:call-template name="dedication.titlepage.verso"/>
+ </xsl:variable>
+ <xsl:variable name="verso.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($verso.content) != '') or ($verso.elements.count &gt; 0)">
+ <div><xsl:copy-of select="$verso.content"/></div>
+ </xsl:if>
+ <xsl:call-template name="dedication.titlepage.separator"/>
+ </div>
+</xsl:template>
+
+<xsl:template match="*" mode="dedication.titlepage.recto.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="*" mode="dedication.titlepage.verso.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="subtitle" mode="dedication.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="dedication.titlepage.recto.style">
+<xsl:apply-templates select="." mode="dedication.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template name="acknowledgements.titlepage.recto">
+ <div xsl:use-attribute-sets="acknowledgements.titlepage.recto.style">
+<xsl:call-template name="component.title">
+<xsl:with-param name="node" select="ancestor-or-self::acknowledgements[1]"/>
+</xsl:call-template></div>
+ <xsl:choose>
+ <xsl:when test="acknowledgementsinfo/subtitle">
+ <xsl:apply-templates mode="acknowledgements.titlepage.recto.auto.mode" select="acknowledgementsinfo/subtitle"/>
+ </xsl:when>
+ <xsl:when test="docinfo/subtitle">
+ <xsl:apply-templates mode="acknowledgements.titlepage.recto.auto.mode" select="docinfo/subtitle"/>
+ </xsl:when>
+ <xsl:when test="info/subtitle">
+ <xsl:apply-templates mode="acknowledgements.titlepage.recto.auto.mode" select="info/subtitle"/>
+ </xsl:when>
+ <xsl:when test="subtitle">
+ <xsl:apply-templates mode="acknowledgements.titlepage.recto.auto.mode" select="subtitle"/>
+ </xsl:when>
+ </xsl:choose>
+
+</xsl:template>
+
+<xsl:template name="acknowledgements.titlepage.verso">
+</xsl:template>
+
+<xsl:template name="acknowledgements.titlepage.separator">
+</xsl:template>
+
+<xsl:template name="acknowledgements.titlepage.before.recto">
+</xsl:template>
+
+<xsl:template name="acknowledgements.titlepage.before.verso">
+</xsl:template>
+
+<xsl:template name="acknowledgements.titlepage">
+ <div class="titlepage">
+ <xsl:variable name="recto.content">
+ <xsl:call-template name="acknowledgements.titlepage.before.recto"/>
+ <xsl:call-template name="acknowledgements.titlepage.recto"/>
+ </xsl:variable>
+ <xsl:variable name="recto.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($recto.content) != '') or ($recto.elements.count &gt; 0)">
+ <div><xsl:copy-of select="$recto.content"/></div>
+ </xsl:if>
+ <xsl:variable name="verso.content">
+ <xsl:call-template name="acknowledgements.titlepage.before.verso"/>
+ <xsl:call-template name="acknowledgements.titlepage.verso"/>
+ </xsl:variable>
+ <xsl:variable name="verso.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($verso.content) != '') or ($verso.elements.count &gt; 0)">
+ <div><xsl:copy-of select="$verso.content"/></div>
+ </xsl:if>
+ <xsl:call-template name="acknowledgements.titlepage.separator"/>
+ </div>
+</xsl:template>
+
+<xsl:template match="*" mode="acknowledgements.titlepage.recto.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="*" mode="acknowledgements.titlepage.verso.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="subtitle" mode="acknowledgements.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="acknowledgements.titlepage.recto.style">
+<xsl:apply-templates select="." mode="acknowledgements.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template name="preface.titlepage.recto">
+ <xsl:choose>
+ <xsl:when test="prefaceinfo/title">
+ <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="prefaceinfo/title"/>
+ </xsl:when>
+ <xsl:when test="docinfo/title">
+ <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="docinfo/title"/>
+ </xsl:when>
+ <xsl:when test="info/title">
+ <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="info/title"/>
+ </xsl:when>
+ <xsl:when test="title">
+ <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="title"/>
+ </xsl:when>
+ </xsl:choose>
+
+ <xsl:choose>
+ <xsl:when test="prefaceinfo/subtitle">
+ <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="prefaceinfo/subtitle"/>
+ </xsl:when>
+ <xsl:when test="docinfo/subtitle">
+ <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="docinfo/subtitle"/>
+ </xsl:when>
+ <xsl:when test="info/subtitle">
+ <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="info/subtitle"/>
+ </xsl:when>
+ <xsl:when test="subtitle">
+ <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="subtitle"/>
+ </xsl:when>
+ </xsl:choose>
+
+ <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="prefaceinfo/corpauthor"/>
+ <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="docinfo/corpauthor"/>
+ <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="info/corpauthor"/>
+ <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="prefaceinfo/authorgroup"/>
+ <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="docinfo/authorgroup"/>
+ <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="info/authorgroup"/>
+ <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="prefaceinfo/author"/>
+ <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="docinfo/author"/>
+ <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="info/author"/>
+ <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="prefaceinfo/othercredit"/>
+ <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="docinfo/othercredit"/>
+ <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="info/othercredit"/>
+ <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="prefaceinfo/releaseinfo"/>
+ <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="docinfo/releaseinfo"/>
+ <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="info/releaseinfo"/>
+ <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="prefaceinfo/copyright"/>
+ <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="docinfo/copyright"/>
+ <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="info/copyright"/>
+ <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="prefaceinfo/legalnotice"/>
+ <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="docinfo/legalnotice"/>
+ <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="info/legalnotice"/>
+ <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="prefaceinfo/pubdate"/>
+ <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="docinfo/pubdate"/>
+ <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="info/pubdate"/>
+ <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="prefaceinfo/revision"/>
+ <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="docinfo/revision"/>
+ <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="info/revision"/>
+ <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="prefaceinfo/revhistory"/>
+ <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="docinfo/revhistory"/>
+ <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="info/revhistory"/>
+ <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="prefaceinfo/abstract"/>
+ <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="docinfo/abstract"/>
+ <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="info/abstract"/>
+</xsl:template>
+
+<xsl:template name="preface.titlepage.verso">
+</xsl:template>
+
+<xsl:template name="preface.titlepage.separator">
+</xsl:template>
+
+<xsl:template name="preface.titlepage.before.recto">
+</xsl:template>
+
+<xsl:template name="preface.titlepage.before.verso">
+</xsl:template>
+
+<xsl:template name="preface.titlepage">
+ <div class="titlepage">
+ <xsl:variable name="recto.content">
+ <xsl:call-template name="preface.titlepage.before.recto"/>
+ <xsl:call-template name="preface.titlepage.recto"/>
+ </xsl:variable>
+ <xsl:variable name="recto.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($recto.content) != '') or ($recto.elements.count &gt; 0)">
+ <div><xsl:copy-of select="$recto.content"/></div>
+ </xsl:if>
+ <xsl:variable name="verso.content">
+ <xsl:call-template name="preface.titlepage.before.verso"/>
+ <xsl:call-template name="preface.titlepage.verso"/>
+ </xsl:variable>
+ <xsl:variable name="verso.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($verso.content) != '') or ($verso.elements.count &gt; 0)">
+ <div><xsl:copy-of select="$verso.content"/></div>
+ </xsl:if>
+ <xsl:call-template name="preface.titlepage.separator"/>
+ </div>
+</xsl:template>
+
+<xsl:template match="*" mode="preface.titlepage.recto.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="*" mode="preface.titlepage.verso.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="title" mode="preface.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="preface.titlepage.recto.style">
+<xsl:apply-templates select="." mode="preface.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="subtitle" mode="preface.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="preface.titlepage.recto.style">
+<xsl:apply-templates select="." mode="preface.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="corpauthor" mode="preface.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="preface.titlepage.recto.style">
+<xsl:apply-templates select="." mode="preface.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="authorgroup" mode="preface.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="preface.titlepage.recto.style">
+<xsl:apply-templates select="." mode="preface.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="author" mode="preface.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="preface.titlepage.recto.style">
+<xsl:apply-templates select="." mode="preface.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="othercredit" mode="preface.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="preface.titlepage.recto.style">
+<xsl:apply-templates select="." mode="preface.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="releaseinfo" mode="preface.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="preface.titlepage.recto.style">
+<xsl:apply-templates select="." mode="preface.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="copyright" mode="preface.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="preface.titlepage.recto.style">
+<xsl:apply-templates select="." mode="preface.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="legalnotice" mode="preface.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="preface.titlepage.recto.style">
+<xsl:apply-templates select="." mode="preface.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="pubdate" mode="preface.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="preface.titlepage.recto.style">
+<xsl:apply-templates select="." mode="preface.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="revision" mode="preface.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="preface.titlepage.recto.style">
+<xsl:apply-templates select="." mode="preface.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="revhistory" mode="preface.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="preface.titlepage.recto.style">
+<xsl:apply-templates select="." mode="preface.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="abstract" mode="preface.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="preface.titlepage.recto.style">
+<xsl:apply-templates select="." mode="preface.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template name="chapter.titlepage.recto">
+ <xsl:choose>
+ <xsl:when test="chapterinfo/title">
+ <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="chapterinfo/title"/>
+ </xsl:when>
+ <xsl:when test="docinfo/title">
+ <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="docinfo/title"/>
+ </xsl:when>
+ <xsl:when test="info/title">
+ <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="info/title"/>
+ </xsl:when>
+ <xsl:when test="title">
+ <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="title"/>
+ </xsl:when>
+ </xsl:choose>
+
+ <xsl:choose>
+ <xsl:when test="chapterinfo/subtitle">
+ <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="chapterinfo/subtitle"/>
+ </xsl:when>
+ <xsl:when test="docinfo/subtitle">
+ <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="docinfo/subtitle"/>
+ </xsl:when>
+ <xsl:when test="info/subtitle">
+ <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="info/subtitle"/>
+ </xsl:when>
+ <xsl:when test="subtitle">
+ <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="subtitle"/>
+ </xsl:when>
+ </xsl:choose>
+
+ <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="chapterinfo/corpauthor"/>
+ <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="docinfo/corpauthor"/>
+ <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="info/corpauthor"/>
+ <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="chapterinfo/authorgroup"/>
+ <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="docinfo/authorgroup"/>
+ <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="info/authorgroup"/>
+ <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="chapterinfo/author"/>
+ <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="docinfo/author"/>
+ <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="info/author"/>
+ <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="chapterinfo/othercredit"/>
+ <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="docinfo/othercredit"/>
+ <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="info/othercredit"/>
+ <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="chapterinfo/releaseinfo"/>
+ <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="docinfo/releaseinfo"/>
+ <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="info/releaseinfo"/>
+ <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="chapterinfo/copyright"/>
+ <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="docinfo/copyright"/>
+ <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="info/copyright"/>
+ <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="chapterinfo/legalnotice"/>
+ <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="docinfo/legalnotice"/>
+ <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="info/legalnotice"/>
+ <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="chapterinfo/pubdate"/>
+ <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="docinfo/pubdate"/>
+ <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="info/pubdate"/>
+ <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="chapterinfo/revision"/>
+ <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="docinfo/revision"/>
+ <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="info/revision"/>
+ <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="chapterinfo/revhistory"/>
+ <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="docinfo/revhistory"/>
+ <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="info/revhistory"/>
+ <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="chapterinfo/abstract"/>
+ <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="docinfo/abstract"/>
+ <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="info/abstract"/>
+</xsl:template>
+
+<xsl:template name="chapter.titlepage.verso">
+</xsl:template>
+
+<xsl:template name="chapter.titlepage.separator">
+</xsl:template>
+
+<xsl:template name="chapter.titlepage.before.recto">
+</xsl:template>
+
+<xsl:template name="chapter.titlepage.before.verso">
+</xsl:template>
+
+<xsl:template name="chapter.titlepage">
+ <div class="titlepage">
+ <xsl:variable name="recto.content">
+ <xsl:call-template name="chapter.titlepage.before.recto"/>
+ <xsl:call-template name="chapter.titlepage.recto"/>
+ </xsl:variable>
+ <xsl:variable name="recto.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($recto.content) != '') or ($recto.elements.count &gt; 0)">
+ <div><xsl:copy-of select="$recto.content"/></div>
+ </xsl:if>
+ <xsl:variable name="verso.content">
+ <xsl:call-template name="chapter.titlepage.before.verso"/>
+ <xsl:call-template name="chapter.titlepage.verso"/>
+ </xsl:variable>
+ <xsl:variable name="verso.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($verso.content) != '') or ($verso.elements.count &gt; 0)">
+ <div><xsl:copy-of select="$verso.content"/></div>
+ </xsl:if>
+ <xsl:call-template name="chapter.titlepage.separator"/>
+ </div>
+</xsl:template>
+
+<xsl:template match="*" mode="chapter.titlepage.recto.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="*" mode="chapter.titlepage.verso.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="title" mode="chapter.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="chapter.titlepage.recto.style">
+<xsl:apply-templates select="." mode="chapter.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="subtitle" mode="chapter.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="chapter.titlepage.recto.style">
+<xsl:apply-templates select="." mode="chapter.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="corpauthor" mode="chapter.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="chapter.titlepage.recto.style">
+<xsl:apply-templates select="." mode="chapter.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="authorgroup" mode="chapter.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="chapter.titlepage.recto.style">
+<xsl:apply-templates select="." mode="chapter.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="author" mode="chapter.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="chapter.titlepage.recto.style">
+<xsl:apply-templates select="." mode="chapter.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="othercredit" mode="chapter.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="chapter.titlepage.recto.style">
+<xsl:apply-templates select="." mode="chapter.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="releaseinfo" mode="chapter.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="chapter.titlepage.recto.style">
+<xsl:apply-templates select="." mode="chapter.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="copyright" mode="chapter.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="chapter.titlepage.recto.style">
+<xsl:apply-templates select="." mode="chapter.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="legalnotice" mode="chapter.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="chapter.titlepage.recto.style">
+<xsl:apply-templates select="." mode="chapter.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="pubdate" mode="chapter.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="chapter.titlepage.recto.style">
+<xsl:apply-templates select="." mode="chapter.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="revision" mode="chapter.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="chapter.titlepage.recto.style">
+<xsl:apply-templates select="." mode="chapter.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="revhistory" mode="chapter.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="chapter.titlepage.recto.style">
+<xsl:apply-templates select="." mode="chapter.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="abstract" mode="chapter.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="chapter.titlepage.recto.style">
+<xsl:apply-templates select="." mode="chapter.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template name="appendix.titlepage.recto">
+ <xsl:choose>
+ <xsl:when test="appendixinfo/title">
+ <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="appendixinfo/title"/>
+ </xsl:when>
+ <xsl:when test="docinfo/title">
+ <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="docinfo/title"/>
+ </xsl:when>
+ <xsl:when test="info/title">
+ <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="info/title"/>
+ </xsl:when>
+ <xsl:when test="title">
+ <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="title"/>
+ </xsl:when>
+ </xsl:choose>
+
+ <xsl:choose>
+ <xsl:when test="appendixinfo/subtitle">
+ <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="appendixinfo/subtitle"/>
+ </xsl:when>
+ <xsl:when test="docinfo/subtitle">
+ <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="docinfo/subtitle"/>
+ </xsl:when>
+ <xsl:when test="info/subtitle">
+ <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="info/subtitle"/>
+ </xsl:when>
+ <xsl:when test="subtitle">
+ <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="subtitle"/>
+ </xsl:when>
+ </xsl:choose>
+
+ <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="appendixinfo/corpauthor"/>
+ <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="docinfo/corpauthor"/>
+ <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="info/corpauthor"/>
+ <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="appendixinfo/authorgroup"/>
+ <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="docinfo/authorgroup"/>
+ <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="info/authorgroup"/>
+ <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="appendixinfo/author"/>
+ <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="docinfo/author"/>
+ <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="info/author"/>
+ <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="appendixinfo/othercredit"/>
+ <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="docinfo/othercredit"/>
+ <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="info/othercredit"/>
+ <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="appendixinfo/releaseinfo"/>
+ <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="docinfo/releaseinfo"/>
+ <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="info/releaseinfo"/>
+ <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="appendixinfo/copyright"/>
+ <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="docinfo/copyright"/>
+ <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="info/copyright"/>
+ <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="appendixinfo/legalnotice"/>
+ <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="docinfo/legalnotice"/>
+ <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="info/legalnotice"/>
+ <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="appendixinfo/pubdate"/>
+ <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="docinfo/pubdate"/>
+ <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="info/pubdate"/>
+ <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="appendixinfo/revision"/>
+ <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="docinfo/revision"/>
+ <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="info/revision"/>
+ <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="appendixinfo/revhistory"/>
+ <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="docinfo/revhistory"/>
+ <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="info/revhistory"/>
+ <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="appendixinfo/abstract"/>
+ <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="docinfo/abstract"/>
+ <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="info/abstract"/>
+</xsl:template>
+
+<xsl:template name="appendix.titlepage.verso">
+</xsl:template>
+
+<xsl:template name="appendix.titlepage.separator">
+</xsl:template>
+
+<xsl:template name="appendix.titlepage.before.recto">
+</xsl:template>
+
+<xsl:template name="appendix.titlepage.before.verso">
+</xsl:template>
+
+<xsl:template name="appendix.titlepage">
+ <div class="titlepage">
+ <xsl:variable name="recto.content">
+ <xsl:call-template name="appendix.titlepage.before.recto"/>
+ <xsl:call-template name="appendix.titlepage.recto"/>
+ </xsl:variable>
+ <xsl:variable name="recto.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($recto.content) != '') or ($recto.elements.count &gt; 0)">
+ <div><xsl:copy-of select="$recto.content"/></div>
+ </xsl:if>
+ <xsl:variable name="verso.content">
+ <xsl:call-template name="appendix.titlepage.before.verso"/>
+ <xsl:call-template name="appendix.titlepage.verso"/>
+ </xsl:variable>
+ <xsl:variable name="verso.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($verso.content) != '') or ($verso.elements.count &gt; 0)">
+ <div><xsl:copy-of select="$verso.content"/></div>
+ </xsl:if>
+ <xsl:call-template name="appendix.titlepage.separator"/>
+ </div>
+</xsl:template>
+
+<xsl:template match="*" mode="appendix.titlepage.recto.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="*" mode="appendix.titlepage.verso.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="title" mode="appendix.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="appendix.titlepage.recto.style">
+<xsl:apply-templates select="." mode="appendix.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="subtitle" mode="appendix.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="appendix.titlepage.recto.style">
+<xsl:apply-templates select="." mode="appendix.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="corpauthor" mode="appendix.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="appendix.titlepage.recto.style">
+<xsl:apply-templates select="." mode="appendix.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="authorgroup" mode="appendix.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="appendix.titlepage.recto.style">
+<xsl:apply-templates select="." mode="appendix.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="author" mode="appendix.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="appendix.titlepage.recto.style">
+<xsl:apply-templates select="." mode="appendix.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="othercredit" mode="appendix.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="appendix.titlepage.recto.style">
+<xsl:apply-templates select="." mode="appendix.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="releaseinfo" mode="appendix.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="appendix.titlepage.recto.style">
+<xsl:apply-templates select="." mode="appendix.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="copyright" mode="appendix.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="appendix.titlepage.recto.style">
+<xsl:apply-templates select="." mode="appendix.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="legalnotice" mode="appendix.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="appendix.titlepage.recto.style">
+<xsl:apply-templates select="." mode="appendix.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="pubdate" mode="appendix.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="appendix.titlepage.recto.style">
+<xsl:apply-templates select="." mode="appendix.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="revision" mode="appendix.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="appendix.titlepage.recto.style">
+<xsl:apply-templates select="." mode="appendix.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="revhistory" mode="appendix.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="appendix.titlepage.recto.style">
+<xsl:apply-templates select="." mode="appendix.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="abstract" mode="appendix.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="appendix.titlepage.recto.style">
+<xsl:apply-templates select="." mode="appendix.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template name="section.titlepage.recto">
+ <xsl:choose>
+ <xsl:when test="sectioninfo/title">
+ <xsl:apply-templates mode="section.titlepage.recto.auto.mode" select="sectioninfo/title"/>
+ </xsl:when>
+ <xsl:when test="info/title">
+ <xsl:apply-templates mode="section.titlepage.recto.auto.mode" select="info/title"/>
+ </xsl:when>
+ <xsl:when test="title">
+ <xsl:apply-templates mode="section.titlepage.recto.auto.mode" select="title"/>
+ </xsl:when>
+ </xsl:choose>
+
+ <xsl:choose>
+ <xsl:when test="sectioninfo/subtitle">
+ <xsl:apply-templates mode="section.titlepage.recto.auto.mode" select="sectioninfo/subtitle"/>
+ </xsl:when>
+ <xsl:when test="info/subtitle">
+ <xsl:apply-templates mode="section.titlepage.recto.auto.mode" select="info/subtitle"/>
+ </xsl:when>
+ <xsl:when test="subtitle">
+ <xsl:apply-templates mode="section.titlepage.recto.auto.mode" select="subtitle"/>
+ </xsl:when>
+ </xsl:choose>
+
+ <xsl:apply-templates mode="section.titlepage.recto.auto.mode" select="sectioninfo/corpauthor"/>
+ <xsl:apply-templates mode="section.titlepage.recto.auto.mode" select="info/corpauthor"/>
+ <xsl:apply-templates mode="section.titlepage.recto.auto.mode" select="sectioninfo/authorgroup"/>
+ <xsl:apply-templates mode="section.titlepage.recto.auto.mode" select="info/authorgroup"/>
+ <xsl:apply-templates mode="section.titlepage.recto.auto.mode" select="sectioninfo/author"/>
+ <xsl:apply-templates mode="section.titlepage.recto.auto.mode" select="info/author"/>
+ <xsl:apply-templates mode="section.titlepage.recto.auto.mode" select="sectioninfo/othercredit"/>
+ <xsl:apply-templates mode="section.titlepage.recto.auto.mode" select="info/othercredit"/>
+ <xsl:apply-templates mode="section.titlepage.recto.auto.mode" select="sectioninfo/releaseinfo"/>
+ <xsl:apply-templates mode="section.titlepage.recto.auto.mode" select="info/releaseinfo"/>
+ <xsl:apply-templates mode="section.titlepage.recto.auto.mode" select="sectioninfo/copyright"/>
+ <xsl:apply-templates mode="section.titlepage.recto.auto.mode" select="info/copyright"/>
+ <xsl:apply-templates mode="section.titlepage.recto.auto.mode" select="sectioninfo/legalnotice"/>
+ <xsl:apply-templates mode="section.titlepage.recto.auto.mode" select="info/legalnotice"/>
+ <xsl:apply-templates mode="section.titlepage.recto.auto.mode" select="sectioninfo/pubdate"/>
+ <xsl:apply-templates mode="section.titlepage.recto.auto.mode" select="info/pubdate"/>
+ <xsl:apply-templates mode="section.titlepage.recto.auto.mode" select="sectioninfo/revision"/>
+ <xsl:apply-templates mode="section.titlepage.recto.auto.mode" select="info/revision"/>
+ <xsl:apply-templates mode="section.titlepage.recto.auto.mode" select="sectioninfo/revhistory"/>
+ <xsl:apply-templates mode="section.titlepage.recto.auto.mode" select="info/revhistory"/>
+ <xsl:apply-templates mode="section.titlepage.recto.auto.mode" select="sectioninfo/abstract"/>
+ <xsl:apply-templates mode="section.titlepage.recto.auto.mode" select="info/abstract"/>
+</xsl:template>
+
+<xsl:template name="section.titlepage.verso">
+</xsl:template>
+
+<xsl:template name="section.titlepage.separator"><xsl:if test="count(parent::*)='0'"><hr/></xsl:if>
+</xsl:template>
+
+<xsl:template name="section.titlepage.before.recto">
+</xsl:template>
+
+<xsl:template name="section.titlepage.before.verso">
+</xsl:template>
+
+<xsl:template name="section.titlepage">
+ <div class="titlepage">
+ <xsl:variable name="recto.content">
+ <xsl:call-template name="section.titlepage.before.recto"/>
+ <xsl:call-template name="section.titlepage.recto"/>
+ </xsl:variable>
+ <xsl:variable name="recto.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($recto.content) != '') or ($recto.elements.count &gt; 0)">
+ <div><xsl:copy-of select="$recto.content"/></div>
+ </xsl:if>
+ <xsl:variable name="verso.content">
+ <xsl:call-template name="section.titlepage.before.verso"/>
+ <xsl:call-template name="section.titlepage.verso"/>
+ </xsl:variable>
+ <xsl:variable name="verso.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($verso.content) != '') or ($verso.elements.count &gt; 0)">
+ <div><xsl:copy-of select="$verso.content"/></div>
+ </xsl:if>
+ <xsl:call-template name="section.titlepage.separator"/>
+ </div>
+</xsl:template>
+
+<xsl:template match="*" mode="section.titlepage.recto.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="*" mode="section.titlepage.verso.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="title" mode="section.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="section.titlepage.recto.style">
+<xsl:apply-templates select="." mode="section.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="subtitle" mode="section.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="section.titlepage.recto.style">
+<xsl:apply-templates select="." mode="section.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="corpauthor" mode="section.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="section.titlepage.recto.style">
+<xsl:apply-templates select="." mode="section.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="authorgroup" mode="section.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="section.titlepage.recto.style">
+<xsl:apply-templates select="." mode="section.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="author" mode="section.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="section.titlepage.recto.style">
+<xsl:apply-templates select="." mode="section.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="othercredit" mode="section.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="section.titlepage.recto.style">
+<xsl:apply-templates select="." mode="section.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="releaseinfo" mode="section.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="section.titlepage.recto.style">
+<xsl:apply-templates select="." mode="section.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="copyright" mode="section.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="section.titlepage.recto.style">
+<xsl:apply-templates select="." mode="section.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="legalnotice" mode="section.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="section.titlepage.recto.style">
+<xsl:apply-templates select="." mode="section.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="pubdate" mode="section.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="section.titlepage.recto.style">
+<xsl:apply-templates select="." mode="section.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="revision" mode="section.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="section.titlepage.recto.style">
+<xsl:apply-templates select="." mode="section.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="revhistory" mode="section.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="section.titlepage.recto.style">
+<xsl:apply-templates select="." mode="section.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="abstract" mode="section.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="section.titlepage.recto.style">
+<xsl:apply-templates select="." mode="section.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template name="sect1.titlepage.recto">
+ <xsl:choose>
+ <xsl:when test="sect1info/title">
+ <xsl:apply-templates mode="sect1.titlepage.recto.auto.mode" select="sect1info/title"/>
+ </xsl:when>
+ <xsl:when test="info/title">
+ <xsl:apply-templates mode="sect1.titlepage.recto.auto.mode" select="info/title"/>
+ </xsl:when>
+ <xsl:when test="title">
+ <xsl:apply-templates mode="sect1.titlepage.recto.auto.mode" select="title"/>
+ </xsl:when>
+ </xsl:choose>
+
+ <xsl:choose>
+ <xsl:when test="sect1info/subtitle">
+ <xsl:apply-templates mode="sect1.titlepage.recto.auto.mode" select="sect1info/subtitle"/>
+ </xsl:when>
+ <xsl:when test="info/subtitle">
+ <xsl:apply-templates mode="sect1.titlepage.recto.auto.mode" select="info/subtitle"/>
+ </xsl:when>
+ <xsl:when test="subtitle">
+ <xsl:apply-templates mode="sect1.titlepage.recto.auto.mode" select="subtitle"/>
+ </xsl:when>
+ </xsl:choose>
+
+ <xsl:apply-templates mode="sect1.titlepage.recto.auto.mode" select="sect1info/corpauthor"/>
+ <xsl:apply-templates mode="sect1.titlepage.recto.auto.mode" select="info/corpauthor"/>
+ <xsl:apply-templates mode="sect1.titlepage.recto.auto.mode" select="sect1info/authorgroup"/>
+ <xsl:apply-templates mode="sect1.titlepage.recto.auto.mode" select="info/authorgroup"/>
+ <xsl:apply-templates mode="sect1.titlepage.recto.auto.mode" select="sect1info/author"/>
+ <xsl:apply-templates mode="sect1.titlepage.recto.auto.mode" select="info/author"/>
+ <xsl:apply-templates mode="sect1.titlepage.recto.auto.mode" select="sect1info/othercredit"/>
+ <xsl:apply-templates mode="sect1.titlepage.recto.auto.mode" select="info/othercredit"/>
+ <xsl:apply-templates mode="sect1.titlepage.recto.auto.mode" select="sect1info/releaseinfo"/>
+ <xsl:apply-templates mode="sect1.titlepage.recto.auto.mode" select="info/releaseinfo"/>
+ <xsl:apply-templates mode="sect1.titlepage.recto.auto.mode" select="sect1info/copyright"/>
+ <xsl:apply-templates mode="sect1.titlepage.recto.auto.mode" select="info/copyright"/>
+ <xsl:apply-templates mode="sect1.titlepage.recto.auto.mode" select="sect1info/legalnotice"/>
+ <xsl:apply-templates mode="sect1.titlepage.recto.auto.mode" select="info/legalnotice"/>
+ <xsl:apply-templates mode="sect1.titlepage.recto.auto.mode" select="sect1info/pubdate"/>
+ <xsl:apply-templates mode="sect1.titlepage.recto.auto.mode" select="info/pubdate"/>
+ <xsl:apply-templates mode="sect1.titlepage.recto.auto.mode" select="sect1info/revision"/>
+ <xsl:apply-templates mode="sect1.titlepage.recto.auto.mode" select="info/revision"/>
+ <xsl:apply-templates mode="sect1.titlepage.recto.auto.mode" select="sect1info/revhistory"/>
+ <xsl:apply-templates mode="sect1.titlepage.recto.auto.mode" select="info/revhistory"/>
+ <xsl:apply-templates mode="sect1.titlepage.recto.auto.mode" select="sect1info/abstract"/>
+ <xsl:apply-templates mode="sect1.titlepage.recto.auto.mode" select="info/abstract"/>
+</xsl:template>
+
+<xsl:template name="sect1.titlepage.verso">
+</xsl:template>
+
+<xsl:template name="sect1.titlepage.separator"><xsl:if test="count(parent::*)='0'"><hr/></xsl:if>
+</xsl:template>
+
+<xsl:template name="sect1.titlepage.before.recto">
+</xsl:template>
+
+<xsl:template name="sect1.titlepage.before.verso">
+</xsl:template>
+
+<xsl:template name="sect1.titlepage">
+ <div class="titlepage">
+ <xsl:variable name="recto.content">
+ <xsl:call-template name="sect1.titlepage.before.recto"/>
+ <xsl:call-template name="sect1.titlepage.recto"/>
+ </xsl:variable>
+ <xsl:variable name="recto.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($recto.content) != '') or ($recto.elements.count &gt; 0)">
+ <div><xsl:copy-of select="$recto.content"/></div>
+ </xsl:if>
+ <xsl:variable name="verso.content">
+ <xsl:call-template name="sect1.titlepage.before.verso"/>
+ <xsl:call-template name="sect1.titlepage.verso"/>
+ </xsl:variable>
+ <xsl:variable name="verso.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($verso.content) != '') or ($verso.elements.count &gt; 0)">
+ <div><xsl:copy-of select="$verso.content"/></div>
+ </xsl:if>
+ <xsl:call-template name="sect1.titlepage.separator"/>
+ </div>
+</xsl:template>
+
+<xsl:template match="*" mode="sect1.titlepage.recto.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="*" mode="sect1.titlepage.verso.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="title" mode="sect1.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect1.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect1.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="subtitle" mode="sect1.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect1.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect1.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="corpauthor" mode="sect1.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect1.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect1.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="authorgroup" mode="sect1.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect1.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect1.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="author" mode="sect1.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect1.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect1.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="othercredit" mode="sect1.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect1.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect1.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="releaseinfo" mode="sect1.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect1.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect1.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="copyright" mode="sect1.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect1.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect1.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="legalnotice" mode="sect1.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect1.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect1.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="pubdate" mode="sect1.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect1.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect1.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="revision" mode="sect1.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect1.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect1.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="revhistory" mode="sect1.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect1.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect1.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="abstract" mode="sect1.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect1.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect1.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template name="sect2.titlepage.recto">
+ <xsl:choose>
+ <xsl:when test="sect2info/title">
+ <xsl:apply-templates mode="sect2.titlepage.recto.auto.mode" select="sect2info/title"/>
+ </xsl:when>
+ <xsl:when test="info/title">
+ <xsl:apply-templates mode="sect2.titlepage.recto.auto.mode" select="info/title"/>
+ </xsl:when>
+ <xsl:when test="title">
+ <xsl:apply-templates mode="sect2.titlepage.recto.auto.mode" select="title"/>
+ </xsl:when>
+ </xsl:choose>
+
+ <xsl:choose>
+ <xsl:when test="sect2info/subtitle">
+ <xsl:apply-templates mode="sect2.titlepage.recto.auto.mode" select="sect2info/subtitle"/>
+ </xsl:when>
+ <xsl:when test="info/subtitle">
+ <xsl:apply-templates mode="sect2.titlepage.recto.auto.mode" select="info/subtitle"/>
+ </xsl:when>
+ <xsl:when test="subtitle">
+ <xsl:apply-templates mode="sect2.titlepage.recto.auto.mode" select="subtitle"/>
+ </xsl:when>
+ </xsl:choose>
+
+ <xsl:apply-templates mode="sect2.titlepage.recto.auto.mode" select="sect2info/corpauthor"/>
+ <xsl:apply-templates mode="sect2.titlepage.recto.auto.mode" select="info/corpauthor"/>
+ <xsl:apply-templates mode="sect2.titlepage.recto.auto.mode" select="sect2info/authorgroup"/>
+ <xsl:apply-templates mode="sect2.titlepage.recto.auto.mode" select="info/authorgroup"/>
+ <xsl:apply-templates mode="sect2.titlepage.recto.auto.mode" select="sect2info/author"/>
+ <xsl:apply-templates mode="sect2.titlepage.recto.auto.mode" select="info/author"/>
+ <xsl:apply-templates mode="sect2.titlepage.recto.auto.mode" select="sect2info/othercredit"/>
+ <xsl:apply-templates mode="sect2.titlepage.recto.auto.mode" select="info/othercredit"/>
+ <xsl:apply-templates mode="sect2.titlepage.recto.auto.mode" select="sect2info/releaseinfo"/>
+ <xsl:apply-templates mode="sect2.titlepage.recto.auto.mode" select="info/releaseinfo"/>
+ <xsl:apply-templates mode="sect2.titlepage.recto.auto.mode" select="sect2info/copyright"/>
+ <xsl:apply-templates mode="sect2.titlepage.recto.auto.mode" select="info/copyright"/>
+ <xsl:apply-templates mode="sect2.titlepage.recto.auto.mode" select="sect2info/legalnotice"/>
+ <xsl:apply-templates mode="sect2.titlepage.recto.auto.mode" select="info/legalnotice"/>
+ <xsl:apply-templates mode="sect2.titlepage.recto.auto.mode" select="sect2info/pubdate"/>
+ <xsl:apply-templates mode="sect2.titlepage.recto.auto.mode" select="info/pubdate"/>
+ <xsl:apply-templates mode="sect2.titlepage.recto.auto.mode" select="sect2info/revision"/>
+ <xsl:apply-templates mode="sect2.titlepage.recto.auto.mode" select="info/revision"/>
+ <xsl:apply-templates mode="sect2.titlepage.recto.auto.mode" select="sect2info/revhistory"/>
+ <xsl:apply-templates mode="sect2.titlepage.recto.auto.mode" select="info/revhistory"/>
+ <xsl:apply-templates mode="sect2.titlepage.recto.auto.mode" select="sect2info/abstract"/>
+ <xsl:apply-templates mode="sect2.titlepage.recto.auto.mode" select="info/abstract"/>
+</xsl:template>
+
+<xsl:template name="sect2.titlepage.verso">
+</xsl:template>
+
+<xsl:template name="sect2.titlepage.separator"><xsl:if test="count(parent::*)='0'"><hr/></xsl:if>
+</xsl:template>
+
+<xsl:template name="sect2.titlepage.before.recto">
+</xsl:template>
+
+<xsl:template name="sect2.titlepage.before.verso">
+</xsl:template>
+
+<xsl:template name="sect2.titlepage">
+ <div class="titlepage">
+ <xsl:variable name="recto.content">
+ <xsl:call-template name="sect2.titlepage.before.recto"/>
+ <xsl:call-template name="sect2.titlepage.recto"/>
+ </xsl:variable>
+ <xsl:variable name="recto.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($recto.content) != '') or ($recto.elements.count &gt; 0)">
+ <div><xsl:copy-of select="$recto.content"/></div>
+ </xsl:if>
+ <xsl:variable name="verso.content">
+ <xsl:call-template name="sect2.titlepage.before.verso"/>
+ <xsl:call-template name="sect2.titlepage.verso"/>
+ </xsl:variable>
+ <xsl:variable name="verso.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($verso.content) != '') or ($verso.elements.count &gt; 0)">
+ <div><xsl:copy-of select="$verso.content"/></div>
+ </xsl:if>
+ <xsl:call-template name="sect2.titlepage.separator"/>
+ </div>
+</xsl:template>
+
+<xsl:template match="*" mode="sect2.titlepage.recto.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="*" mode="sect2.titlepage.verso.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="title" mode="sect2.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect2.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect2.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="subtitle" mode="sect2.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect2.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect2.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="corpauthor" mode="sect2.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect2.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect2.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="authorgroup" mode="sect2.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect2.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect2.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="author" mode="sect2.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect2.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect2.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="othercredit" mode="sect2.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect2.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect2.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="releaseinfo" mode="sect2.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect2.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect2.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="copyright" mode="sect2.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect2.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect2.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="legalnotice" mode="sect2.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect2.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect2.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="pubdate" mode="sect2.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect2.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect2.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="revision" mode="sect2.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect2.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect2.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="revhistory" mode="sect2.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect2.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect2.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="abstract" mode="sect2.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect2.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect2.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template name="sect3.titlepage.recto">
+ <xsl:choose>
+ <xsl:when test="sect3info/title">
+ <xsl:apply-templates mode="sect3.titlepage.recto.auto.mode" select="sect3info/title"/>
+ </xsl:when>
+ <xsl:when test="info/title">
+ <xsl:apply-templates mode="sect3.titlepage.recto.auto.mode" select="info/title"/>
+ </xsl:when>
+ <xsl:when test="title">
+ <xsl:apply-templates mode="sect3.titlepage.recto.auto.mode" select="title"/>
+ </xsl:when>
+ </xsl:choose>
+
+ <xsl:choose>
+ <xsl:when test="sect3info/subtitle">
+ <xsl:apply-templates mode="sect3.titlepage.recto.auto.mode" select="sect3info/subtitle"/>
+ </xsl:when>
+ <xsl:when test="info/subtitle">
+ <xsl:apply-templates mode="sect3.titlepage.recto.auto.mode" select="info/subtitle"/>
+ </xsl:when>
+ <xsl:when test="subtitle">
+ <xsl:apply-templates mode="sect3.titlepage.recto.auto.mode" select="subtitle"/>
+ </xsl:when>
+ </xsl:choose>
+
+ <xsl:apply-templates mode="sect3.titlepage.recto.auto.mode" select="sect3info/corpauthor"/>
+ <xsl:apply-templates mode="sect3.titlepage.recto.auto.mode" select="info/corpauthor"/>
+ <xsl:apply-templates mode="sect3.titlepage.recto.auto.mode" select="sect3info/authorgroup"/>
+ <xsl:apply-templates mode="sect3.titlepage.recto.auto.mode" select="info/authorgroup"/>
+ <xsl:apply-templates mode="sect3.titlepage.recto.auto.mode" select="sect3info/author"/>
+ <xsl:apply-templates mode="sect3.titlepage.recto.auto.mode" select="info/author"/>
+ <xsl:apply-templates mode="sect3.titlepage.recto.auto.mode" select="sect3info/othercredit"/>
+ <xsl:apply-templates mode="sect3.titlepage.recto.auto.mode" select="info/othercredit"/>
+ <xsl:apply-templates mode="sect3.titlepage.recto.auto.mode" select="sect3info/releaseinfo"/>
+ <xsl:apply-templates mode="sect3.titlepage.recto.auto.mode" select="info/releaseinfo"/>
+ <xsl:apply-templates mode="sect3.titlepage.recto.auto.mode" select="sect3info/copyright"/>
+ <xsl:apply-templates mode="sect3.titlepage.recto.auto.mode" select="info/copyright"/>
+ <xsl:apply-templates mode="sect3.titlepage.recto.auto.mode" select="sect3info/legalnotice"/>
+ <xsl:apply-templates mode="sect3.titlepage.recto.auto.mode" select="info/legalnotice"/>
+ <xsl:apply-templates mode="sect3.titlepage.recto.auto.mode" select="sect3info/pubdate"/>
+ <xsl:apply-templates mode="sect3.titlepage.recto.auto.mode" select="info/pubdate"/>
+ <xsl:apply-templates mode="sect3.titlepage.recto.auto.mode" select="sect3info/revision"/>
+ <xsl:apply-templates mode="sect3.titlepage.recto.auto.mode" select="info/revision"/>
+ <xsl:apply-templates mode="sect3.titlepage.recto.auto.mode" select="sect3info/revhistory"/>
+ <xsl:apply-templates mode="sect3.titlepage.recto.auto.mode" select="info/revhistory"/>
+ <xsl:apply-templates mode="sect3.titlepage.recto.auto.mode" select="sect3info/abstract"/>
+ <xsl:apply-templates mode="sect3.titlepage.recto.auto.mode" select="info/abstract"/>
+</xsl:template>
+
+<xsl:template name="sect3.titlepage.verso">
+</xsl:template>
+
+<xsl:template name="sect3.titlepage.separator"><xsl:if test="count(parent::*)='0'"><hr/></xsl:if>
+</xsl:template>
+
+<xsl:template name="sect3.titlepage.before.recto">
+</xsl:template>
+
+<xsl:template name="sect3.titlepage.before.verso">
+</xsl:template>
+
+<xsl:template name="sect3.titlepage">
+ <div class="titlepage">
+ <xsl:variable name="recto.content">
+ <xsl:call-template name="sect3.titlepage.before.recto"/>
+ <xsl:call-template name="sect3.titlepage.recto"/>
+ </xsl:variable>
+ <xsl:variable name="recto.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($recto.content) != '') or ($recto.elements.count &gt; 0)">
+ <div><xsl:copy-of select="$recto.content"/></div>
+ </xsl:if>
+ <xsl:variable name="verso.content">
+ <xsl:call-template name="sect3.titlepage.before.verso"/>
+ <xsl:call-template name="sect3.titlepage.verso"/>
+ </xsl:variable>
+ <xsl:variable name="verso.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($verso.content) != '') or ($verso.elements.count &gt; 0)">
+ <div><xsl:copy-of select="$verso.content"/></div>
+ </xsl:if>
+ <xsl:call-template name="sect3.titlepage.separator"/>
+ </div>
+</xsl:template>
+
+<xsl:template match="*" mode="sect3.titlepage.recto.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="*" mode="sect3.titlepage.verso.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="title" mode="sect3.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect3.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect3.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="subtitle" mode="sect3.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect3.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect3.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="corpauthor" mode="sect3.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect3.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect3.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="authorgroup" mode="sect3.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect3.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect3.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="author" mode="sect3.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect3.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect3.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="othercredit" mode="sect3.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect3.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect3.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="releaseinfo" mode="sect3.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect3.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect3.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="copyright" mode="sect3.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect3.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect3.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="legalnotice" mode="sect3.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect3.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect3.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="pubdate" mode="sect3.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect3.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect3.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="revision" mode="sect3.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect3.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect3.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="revhistory" mode="sect3.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect3.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect3.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="abstract" mode="sect3.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect3.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect3.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template name="sect4.titlepage.recto">
+ <xsl:choose>
+ <xsl:when test="sect4info/title">
+ <xsl:apply-templates mode="sect4.titlepage.recto.auto.mode" select="sect4info/title"/>
+ </xsl:when>
+ <xsl:when test="info/title">
+ <xsl:apply-templates mode="sect4.titlepage.recto.auto.mode" select="info/title"/>
+ </xsl:when>
+ <xsl:when test="title">
+ <xsl:apply-templates mode="sect4.titlepage.recto.auto.mode" select="title"/>
+ </xsl:when>
+ </xsl:choose>
+
+ <xsl:choose>
+ <xsl:when test="sect4info/subtitle">
+ <xsl:apply-templates mode="sect4.titlepage.recto.auto.mode" select="sect4info/subtitle"/>
+ </xsl:when>
+ <xsl:when test="info/subtitle">
+ <xsl:apply-templates mode="sect4.titlepage.recto.auto.mode" select="info/subtitle"/>
+ </xsl:when>
+ <xsl:when test="subtitle">
+ <xsl:apply-templates mode="sect4.titlepage.recto.auto.mode" select="subtitle"/>
+ </xsl:when>
+ </xsl:choose>
+
+ <xsl:apply-templates mode="sect4.titlepage.recto.auto.mode" select="sect4info/corpauthor"/>
+ <xsl:apply-templates mode="sect4.titlepage.recto.auto.mode" select="info/corpauthor"/>
+ <xsl:apply-templates mode="sect4.titlepage.recto.auto.mode" select="sect4info/authorgroup"/>
+ <xsl:apply-templates mode="sect4.titlepage.recto.auto.mode" select="info/authorgroup"/>
+ <xsl:apply-templates mode="sect4.titlepage.recto.auto.mode" select="sect4info/author"/>
+ <xsl:apply-templates mode="sect4.titlepage.recto.auto.mode" select="info/author"/>
+ <xsl:apply-templates mode="sect4.titlepage.recto.auto.mode" select="sect4info/othercredit"/>
+ <xsl:apply-templates mode="sect4.titlepage.recto.auto.mode" select="info/othercredit"/>
+ <xsl:apply-templates mode="sect4.titlepage.recto.auto.mode" select="sect4info/releaseinfo"/>
+ <xsl:apply-templates mode="sect4.titlepage.recto.auto.mode" select="info/releaseinfo"/>
+ <xsl:apply-templates mode="sect4.titlepage.recto.auto.mode" select="sect4info/copyright"/>
+ <xsl:apply-templates mode="sect4.titlepage.recto.auto.mode" select="info/copyright"/>
+ <xsl:apply-templates mode="sect4.titlepage.recto.auto.mode" select="sect4info/legalnotice"/>
+ <xsl:apply-templates mode="sect4.titlepage.recto.auto.mode" select="info/legalnotice"/>
+ <xsl:apply-templates mode="sect4.titlepage.recto.auto.mode" select="sect4info/pubdate"/>
+ <xsl:apply-templates mode="sect4.titlepage.recto.auto.mode" select="info/pubdate"/>
+ <xsl:apply-templates mode="sect4.titlepage.recto.auto.mode" select="sect4info/revision"/>
+ <xsl:apply-templates mode="sect4.titlepage.recto.auto.mode" select="info/revision"/>
+ <xsl:apply-templates mode="sect4.titlepage.recto.auto.mode" select="sect4info/revhistory"/>
+ <xsl:apply-templates mode="sect4.titlepage.recto.auto.mode" select="info/revhistory"/>
+ <xsl:apply-templates mode="sect4.titlepage.recto.auto.mode" select="sect4info/abstract"/>
+ <xsl:apply-templates mode="sect4.titlepage.recto.auto.mode" select="info/abstract"/>
+</xsl:template>
+
+<xsl:template name="sect4.titlepage.verso">
+</xsl:template>
+
+<xsl:template name="sect4.titlepage.separator"><xsl:if test="count(parent::*)='0'"><hr/></xsl:if>
+</xsl:template>
+
+<xsl:template name="sect4.titlepage.before.recto">
+</xsl:template>
+
+<xsl:template name="sect4.titlepage.before.verso">
+</xsl:template>
+
+<xsl:template name="sect4.titlepage">
+ <div class="titlepage">
+ <xsl:variable name="recto.content">
+ <xsl:call-template name="sect4.titlepage.before.recto"/>
+ <xsl:call-template name="sect4.titlepage.recto"/>
+ </xsl:variable>
+ <xsl:variable name="recto.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($recto.content) != '') or ($recto.elements.count &gt; 0)">
+ <div><xsl:copy-of select="$recto.content"/></div>
+ </xsl:if>
+ <xsl:variable name="verso.content">
+ <xsl:call-template name="sect4.titlepage.before.verso"/>
+ <xsl:call-template name="sect4.titlepage.verso"/>
+ </xsl:variable>
+ <xsl:variable name="verso.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($verso.content) != '') or ($verso.elements.count &gt; 0)">
+ <div><xsl:copy-of select="$verso.content"/></div>
+ </xsl:if>
+ <xsl:call-template name="sect4.titlepage.separator"/>
+ </div>
+</xsl:template>
+
+<xsl:template match="*" mode="sect4.titlepage.recto.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="*" mode="sect4.titlepage.verso.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="title" mode="sect4.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect4.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect4.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="subtitle" mode="sect4.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect4.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect4.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="corpauthor" mode="sect4.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect4.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect4.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="authorgroup" mode="sect4.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect4.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect4.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="author" mode="sect4.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect4.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect4.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="othercredit" mode="sect4.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect4.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect4.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="releaseinfo" mode="sect4.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect4.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect4.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="copyright" mode="sect4.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect4.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect4.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="legalnotice" mode="sect4.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect4.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect4.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="pubdate" mode="sect4.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect4.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect4.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="revision" mode="sect4.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect4.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect4.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="revhistory" mode="sect4.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect4.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect4.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="abstract" mode="sect4.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect4.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect4.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template name="sect5.titlepage.recto">
+ <xsl:choose>
+ <xsl:when test="sect5info/title">
+ <xsl:apply-templates mode="sect5.titlepage.recto.auto.mode" select="sect5info/title"/>
+ </xsl:when>
+ <xsl:when test="info/title">
+ <xsl:apply-templates mode="sect5.titlepage.recto.auto.mode" select="info/title"/>
+ </xsl:when>
+ <xsl:when test="title">
+ <xsl:apply-templates mode="sect5.titlepage.recto.auto.mode" select="title"/>
+ </xsl:when>
+ </xsl:choose>
+
+ <xsl:choose>
+ <xsl:when test="sect5info/subtitle">
+ <xsl:apply-templates mode="sect5.titlepage.recto.auto.mode" select="sect5info/subtitle"/>
+ </xsl:when>
+ <xsl:when test="info/subtitle">
+ <xsl:apply-templates mode="sect5.titlepage.recto.auto.mode" select="info/subtitle"/>
+ </xsl:when>
+ <xsl:when test="subtitle">
+ <xsl:apply-templates mode="sect5.titlepage.recto.auto.mode" select="subtitle"/>
+ </xsl:when>
+ </xsl:choose>
+
+ <xsl:apply-templates mode="sect5.titlepage.recto.auto.mode" select="sect5info/corpauthor"/>
+ <xsl:apply-templates mode="sect5.titlepage.recto.auto.mode" select="info/corpauthor"/>
+ <xsl:apply-templates mode="sect5.titlepage.recto.auto.mode" select="sect5info/authorgroup"/>
+ <xsl:apply-templates mode="sect5.titlepage.recto.auto.mode" select="info/authorgroup"/>
+ <xsl:apply-templates mode="sect5.titlepage.recto.auto.mode" select="sect5info/author"/>
+ <xsl:apply-templates mode="sect5.titlepage.recto.auto.mode" select="info/author"/>
+ <xsl:apply-templates mode="sect5.titlepage.recto.auto.mode" select="sect5info/othercredit"/>
+ <xsl:apply-templates mode="sect5.titlepage.recto.auto.mode" select="info/othercredit"/>
+ <xsl:apply-templates mode="sect5.titlepage.recto.auto.mode" select="sect5info/releaseinfo"/>
+ <xsl:apply-templates mode="sect5.titlepage.recto.auto.mode" select="info/releaseinfo"/>
+ <xsl:apply-templates mode="sect5.titlepage.recto.auto.mode" select="sect5info/copyright"/>
+ <xsl:apply-templates mode="sect5.titlepage.recto.auto.mode" select="info/copyright"/>
+ <xsl:apply-templates mode="sect5.titlepage.recto.auto.mode" select="sect5info/legalnotice"/>
+ <xsl:apply-templates mode="sect5.titlepage.recto.auto.mode" select="info/legalnotice"/>
+ <xsl:apply-templates mode="sect5.titlepage.recto.auto.mode" select="sect5info/pubdate"/>
+ <xsl:apply-templates mode="sect5.titlepage.recto.auto.mode" select="info/pubdate"/>
+ <xsl:apply-templates mode="sect5.titlepage.recto.auto.mode" select="sect5info/revision"/>
+ <xsl:apply-templates mode="sect5.titlepage.recto.auto.mode" select="info/revision"/>
+ <xsl:apply-templates mode="sect5.titlepage.recto.auto.mode" select="sect5info/revhistory"/>
+ <xsl:apply-templates mode="sect5.titlepage.recto.auto.mode" select="info/revhistory"/>
+ <xsl:apply-templates mode="sect5.titlepage.recto.auto.mode" select="sect5info/abstract"/>
+ <xsl:apply-templates mode="sect5.titlepage.recto.auto.mode" select="info/abstract"/>
+</xsl:template>
+
+<xsl:template name="sect5.titlepage.verso">
+</xsl:template>
+
+<xsl:template name="sect5.titlepage.separator"><xsl:if test="count(parent::*)='0'"><hr/></xsl:if>
+</xsl:template>
+
+<xsl:template name="sect5.titlepage.before.recto">
+</xsl:template>
+
+<xsl:template name="sect5.titlepage.before.verso">
+</xsl:template>
+
+<xsl:template name="sect5.titlepage">
+ <div class="titlepage">
+ <xsl:variable name="recto.content">
+ <xsl:call-template name="sect5.titlepage.before.recto"/>
+ <xsl:call-template name="sect5.titlepage.recto"/>
+ </xsl:variable>
+ <xsl:variable name="recto.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($recto.content) != '') or ($recto.elements.count &gt; 0)">
+ <div><xsl:copy-of select="$recto.content"/></div>
+ </xsl:if>
+ <xsl:variable name="verso.content">
+ <xsl:call-template name="sect5.titlepage.before.verso"/>
+ <xsl:call-template name="sect5.titlepage.verso"/>
+ </xsl:variable>
+ <xsl:variable name="verso.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($verso.content) != '') or ($verso.elements.count &gt; 0)">
+ <div><xsl:copy-of select="$verso.content"/></div>
+ </xsl:if>
+ <xsl:call-template name="sect5.titlepage.separator"/>
+ </div>
+</xsl:template>
+
+<xsl:template match="*" mode="sect5.titlepage.recto.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="*" mode="sect5.titlepage.verso.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="title" mode="sect5.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect5.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect5.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="subtitle" mode="sect5.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect5.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect5.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="corpauthor" mode="sect5.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect5.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect5.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="authorgroup" mode="sect5.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect5.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect5.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="author" mode="sect5.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect5.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect5.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="othercredit" mode="sect5.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect5.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect5.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="releaseinfo" mode="sect5.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect5.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect5.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="copyright" mode="sect5.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect5.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect5.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="legalnotice" mode="sect5.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect5.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect5.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="pubdate" mode="sect5.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect5.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect5.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="revision" mode="sect5.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect5.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect5.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="revhistory" mode="sect5.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect5.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect5.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="abstract" mode="sect5.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect5.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect5.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template name="simplesect.titlepage.recto">
+ <xsl:choose>
+ <xsl:when test="simplesectinfo/title">
+ <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="simplesectinfo/title"/>
+ </xsl:when>
+ <xsl:when test="docinfo/title">
+ <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="docinfo/title"/>
+ </xsl:when>
+ <xsl:when test="info/title">
+ <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="info/title"/>
+ </xsl:when>
+ <xsl:when test="title">
+ <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="title"/>
+ </xsl:when>
+ </xsl:choose>
+
+ <xsl:choose>
+ <xsl:when test="simplesectinfo/subtitle">
+ <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="simplesectinfo/subtitle"/>
+ </xsl:when>
+ <xsl:when test="docinfo/subtitle">
+ <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="docinfo/subtitle"/>
+ </xsl:when>
+ <xsl:when test="info/subtitle">
+ <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="info/subtitle"/>
+ </xsl:when>
+ <xsl:when test="subtitle">
+ <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="subtitle"/>
+ </xsl:when>
+ </xsl:choose>
+
+ <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="simplesectinfo/corpauthor"/>
+ <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="docinfo/corpauthor"/>
+ <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="info/corpauthor"/>
+ <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="simplesectinfo/authorgroup"/>
+ <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="docinfo/authorgroup"/>
+ <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="info/authorgroup"/>
+ <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="simplesectinfo/author"/>
+ <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="docinfo/author"/>
+ <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="info/author"/>
+ <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="simplesectinfo/othercredit"/>
+ <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="docinfo/othercredit"/>
+ <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="info/othercredit"/>
+ <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="simplesectinfo/releaseinfo"/>
+ <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="docinfo/releaseinfo"/>
+ <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="info/releaseinfo"/>
+ <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="simplesectinfo/copyright"/>
+ <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="docinfo/copyright"/>
+ <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="info/copyright"/>
+ <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="simplesectinfo/legalnotice"/>
+ <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="docinfo/legalnotice"/>
+ <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="info/legalnotice"/>
+ <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="simplesectinfo/pubdate"/>
+ <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="docinfo/pubdate"/>
+ <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="info/pubdate"/>
+ <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="simplesectinfo/revision"/>
+ <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="docinfo/revision"/>
+ <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="info/revision"/>
+ <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="simplesectinfo/revhistory"/>
+ <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="docinfo/revhistory"/>
+ <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="info/revhistory"/>
+ <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="simplesectinfo/abstract"/>
+ <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="docinfo/abstract"/>
+ <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="info/abstract"/>
+</xsl:template>
+
+<xsl:template name="simplesect.titlepage.verso">
+</xsl:template>
+
+<xsl:template name="simplesect.titlepage.separator"><xsl:if test="count(parent::*)='0'"><hr/></xsl:if>
+</xsl:template>
+
+<xsl:template name="simplesect.titlepage.before.recto">
+</xsl:template>
+
+<xsl:template name="simplesect.titlepage.before.verso">
+</xsl:template>
+
+<xsl:template name="simplesect.titlepage">
+ <div class="titlepage">
+ <xsl:variable name="recto.content">
+ <xsl:call-template name="simplesect.titlepage.before.recto"/>
+ <xsl:call-template name="simplesect.titlepage.recto"/>
+ </xsl:variable>
+ <xsl:variable name="recto.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($recto.content) != '') or ($recto.elements.count &gt; 0)">
+ <div><xsl:copy-of select="$recto.content"/></div>
+ </xsl:if>
+ <xsl:variable name="verso.content">
+ <xsl:call-template name="simplesect.titlepage.before.verso"/>
+ <xsl:call-template name="simplesect.titlepage.verso"/>
+ </xsl:variable>
+ <xsl:variable name="verso.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($verso.content) != '') or ($verso.elements.count &gt; 0)">
+ <div><xsl:copy-of select="$verso.content"/></div>
+ </xsl:if>
+ <xsl:call-template name="simplesect.titlepage.separator"/>
+ </div>
+</xsl:template>
+
+<xsl:template match="*" mode="simplesect.titlepage.recto.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="*" mode="simplesect.titlepage.verso.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="title" mode="simplesect.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="simplesect.titlepage.recto.style">
+<xsl:apply-templates select="." mode="simplesect.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="subtitle" mode="simplesect.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="simplesect.titlepage.recto.style">
+<xsl:apply-templates select="." mode="simplesect.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="corpauthor" mode="simplesect.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="simplesect.titlepage.recto.style">
+<xsl:apply-templates select="." mode="simplesect.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="authorgroup" mode="simplesect.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="simplesect.titlepage.recto.style">
+<xsl:apply-templates select="." mode="simplesect.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="author" mode="simplesect.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="simplesect.titlepage.recto.style">
+<xsl:apply-templates select="." mode="simplesect.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="othercredit" mode="simplesect.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="simplesect.titlepage.recto.style">
+<xsl:apply-templates select="." mode="simplesect.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="releaseinfo" mode="simplesect.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="simplesect.titlepage.recto.style">
+<xsl:apply-templates select="." mode="simplesect.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="copyright" mode="simplesect.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="simplesect.titlepage.recto.style">
+<xsl:apply-templates select="." mode="simplesect.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="legalnotice" mode="simplesect.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="simplesect.titlepage.recto.style">
+<xsl:apply-templates select="." mode="simplesect.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="pubdate" mode="simplesect.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="simplesect.titlepage.recto.style">
+<xsl:apply-templates select="." mode="simplesect.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="revision" mode="simplesect.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="simplesect.titlepage.recto.style">
+<xsl:apply-templates select="." mode="simplesect.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="revhistory" mode="simplesect.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="simplesect.titlepage.recto.style">
+<xsl:apply-templates select="." mode="simplesect.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="abstract" mode="simplesect.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="simplesect.titlepage.recto.style">
+<xsl:apply-templates select="." mode="simplesect.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template name="bibliography.titlepage.recto">
+ <div xsl:use-attribute-sets="bibliography.titlepage.recto.style">
+<xsl:call-template name="component.title">
+<xsl:with-param name="node" select="ancestor-or-self::bibliography[1]"/>
+</xsl:call-template></div>
+ <xsl:choose>
+ <xsl:when test="bibliographyinfo/subtitle">
+ <xsl:apply-templates mode="bibliography.titlepage.recto.auto.mode" select="bibliographyinfo/subtitle"/>
+ </xsl:when>
+ <xsl:when test="docinfo/subtitle">
+ <xsl:apply-templates mode="bibliography.titlepage.recto.auto.mode" select="docinfo/subtitle"/>
+ </xsl:when>
+ <xsl:when test="info/subtitle">
+ <xsl:apply-templates mode="bibliography.titlepage.recto.auto.mode" select="info/subtitle"/>
+ </xsl:when>
+ <xsl:when test="subtitle">
+ <xsl:apply-templates mode="bibliography.titlepage.recto.auto.mode" select="subtitle"/>
+ </xsl:when>
+ </xsl:choose>
+
+</xsl:template>
+
+<xsl:template name="bibliography.titlepage.verso">
+</xsl:template>
+
+<xsl:template name="bibliography.titlepage.separator">
+</xsl:template>
+
+<xsl:template name="bibliography.titlepage.before.recto">
+</xsl:template>
+
+<xsl:template name="bibliography.titlepage.before.verso">
+</xsl:template>
+
+<xsl:template name="bibliography.titlepage">
+ <div class="titlepage">
+ <xsl:variable name="recto.content">
+ <xsl:call-template name="bibliography.titlepage.before.recto"/>
+ <xsl:call-template name="bibliography.titlepage.recto"/>
+ </xsl:variable>
+ <xsl:variable name="recto.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($recto.content) != '') or ($recto.elements.count &gt; 0)">
+ <div><xsl:copy-of select="$recto.content"/></div>
+ </xsl:if>
+ <xsl:variable name="verso.content">
+ <xsl:call-template name="bibliography.titlepage.before.verso"/>
+ <xsl:call-template name="bibliography.titlepage.verso"/>
+ </xsl:variable>
+ <xsl:variable name="verso.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($verso.content) != '') or ($verso.elements.count &gt; 0)">
+ <div><xsl:copy-of select="$verso.content"/></div>
+ </xsl:if>
+ <xsl:call-template name="bibliography.titlepage.separator"/>
+ </div>
+</xsl:template>
+
+<xsl:template match="*" mode="bibliography.titlepage.recto.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="*" mode="bibliography.titlepage.verso.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="subtitle" mode="bibliography.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="bibliography.titlepage.recto.style">
+<xsl:apply-templates select="." mode="bibliography.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template name="glossary.titlepage.recto">
+ <div xsl:use-attribute-sets="glossary.titlepage.recto.style">
+<xsl:call-template name="component.title">
+<xsl:with-param name="node" select="ancestor-or-self::glossary[1]"/>
+</xsl:call-template></div>
+ <xsl:choose>
+ <xsl:when test="glossaryinfo/subtitle">
+ <xsl:apply-templates mode="glossary.titlepage.recto.auto.mode" select="glossaryinfo/subtitle"/>
+ </xsl:when>
+ <xsl:when test="docinfo/subtitle">
+ <xsl:apply-templates mode="glossary.titlepage.recto.auto.mode" select="docinfo/subtitle"/>
+ </xsl:when>
+ <xsl:when test="info/subtitle">
+ <xsl:apply-templates mode="glossary.titlepage.recto.auto.mode" select="info/subtitle"/>
+ </xsl:when>
+ <xsl:when test="subtitle">
+ <xsl:apply-templates mode="glossary.titlepage.recto.auto.mode" select="subtitle"/>
+ </xsl:when>
+ </xsl:choose>
+
+</xsl:template>
+
+<xsl:template name="glossary.titlepage.verso">
+</xsl:template>
+
+<xsl:template name="glossary.titlepage.separator">
+</xsl:template>
+
+<xsl:template name="glossary.titlepage.before.recto">
+</xsl:template>
+
+<xsl:template name="glossary.titlepage.before.verso">
+</xsl:template>
+
+<xsl:template name="glossary.titlepage">
+ <div class="titlepage">
+ <xsl:variable name="recto.content">
+ <xsl:call-template name="glossary.titlepage.before.recto"/>
+ <xsl:call-template name="glossary.titlepage.recto"/>
+ </xsl:variable>
+ <xsl:variable name="recto.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($recto.content) != '') or ($recto.elements.count &gt; 0)">
+ <div><xsl:copy-of select="$recto.content"/></div>
+ </xsl:if>
+ <xsl:variable name="verso.content">
+ <xsl:call-template name="glossary.titlepage.before.verso"/>
+ <xsl:call-template name="glossary.titlepage.verso"/>
+ </xsl:variable>
+ <xsl:variable name="verso.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($verso.content) != '') or ($verso.elements.count &gt; 0)">
+ <div><xsl:copy-of select="$verso.content"/></div>
+ </xsl:if>
+ <xsl:call-template name="glossary.titlepage.separator"/>
+ </div>
+</xsl:template>
+
+<xsl:template match="*" mode="glossary.titlepage.recto.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="*" mode="glossary.titlepage.verso.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="subtitle" mode="glossary.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="glossary.titlepage.recto.style">
+<xsl:apply-templates select="." mode="glossary.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template name="index.titlepage.recto">
+ <div xsl:use-attribute-sets="index.titlepage.recto.style">
+<xsl:call-template name="component.title">
+<xsl:with-param name="node" select="ancestor-or-self::index[1]"/>
+</xsl:call-template></div>
+ <xsl:choose>
+ <xsl:when test="indexinfo/subtitle">
+ <xsl:apply-templates mode="index.titlepage.recto.auto.mode" select="indexinfo/subtitle"/>
+ </xsl:when>
+ <xsl:when test="docinfo/subtitle">
+ <xsl:apply-templates mode="index.titlepage.recto.auto.mode" select="docinfo/subtitle"/>
+ </xsl:when>
+ <xsl:when test="info/subtitle">
+ <xsl:apply-templates mode="index.titlepage.recto.auto.mode" select="info/subtitle"/>
+ </xsl:when>
+ <xsl:when test="subtitle">
+ <xsl:apply-templates mode="index.titlepage.recto.auto.mode" select="subtitle"/>
+ </xsl:when>
+ </xsl:choose>
+
+</xsl:template>
+
+<xsl:template name="index.titlepage.verso">
+</xsl:template>
+
+<xsl:template name="index.titlepage.separator">
+</xsl:template>
+
+<xsl:template name="index.titlepage.before.recto">
+</xsl:template>
+
+<xsl:template name="index.titlepage.before.verso">
+</xsl:template>
+
+<xsl:template name="index.titlepage">
+ <div class="titlepage">
+ <xsl:variable name="recto.content">
+ <xsl:call-template name="index.titlepage.before.recto"/>
+ <xsl:call-template name="index.titlepage.recto"/>
+ </xsl:variable>
+ <xsl:variable name="recto.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($recto.content) != '') or ($recto.elements.count &gt; 0)">
+ <div><xsl:copy-of select="$recto.content"/></div>
+ </xsl:if>
+ <xsl:variable name="verso.content">
+ <xsl:call-template name="index.titlepage.before.verso"/>
+ <xsl:call-template name="index.titlepage.verso"/>
+ </xsl:variable>
+ <xsl:variable name="verso.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($verso.content) != '') or ($verso.elements.count &gt; 0)">
+ <div><xsl:copy-of select="$verso.content"/></div>
+ </xsl:if>
+ <xsl:call-template name="index.titlepage.separator"/>
+ </div>
+</xsl:template>
+
+<xsl:template match="*" mode="index.titlepage.recto.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="*" mode="index.titlepage.verso.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="subtitle" mode="index.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="index.titlepage.recto.style">
+<xsl:apply-templates select="." mode="index.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template name="setindex.titlepage.recto">
+ <div xsl:use-attribute-sets="setindex.titlepage.recto.style">
+<xsl:call-template name="component.title">
+<xsl:with-param name="node" select="ancestor-or-self::setindex[1]"/>
+</xsl:call-template></div>
+ <xsl:choose>
+ <xsl:when test="setindexinfo/subtitle">
+ <xsl:apply-templates mode="setindex.titlepage.recto.auto.mode" select="setindexinfo/subtitle"/>
+ </xsl:when>
+ <xsl:when test="docinfo/subtitle">
+ <xsl:apply-templates mode="setindex.titlepage.recto.auto.mode" select="docinfo/subtitle"/>
+ </xsl:when>
+ <xsl:when test="info/subtitle">
+ <xsl:apply-templates mode="setindex.titlepage.recto.auto.mode" select="info/subtitle"/>
+ </xsl:when>
+ <xsl:when test="subtitle">
+ <xsl:apply-templates mode="setindex.titlepage.recto.auto.mode" select="subtitle"/>
+ </xsl:when>
+ </xsl:choose>
+
+</xsl:template>
+
+<xsl:template name="setindex.titlepage.verso">
+</xsl:template>
+
+<xsl:template name="setindex.titlepage.separator">
+</xsl:template>
+
+<xsl:template name="setindex.titlepage.before.recto">
+</xsl:template>
+
+<xsl:template name="setindex.titlepage.before.verso">
+</xsl:template>
+
+<xsl:template name="setindex.titlepage">
+ <div class="titlepage">
+ <xsl:variable name="recto.content">
+ <xsl:call-template name="setindex.titlepage.before.recto"/>
+ <xsl:call-template name="setindex.titlepage.recto"/>
+ </xsl:variable>
+ <xsl:variable name="recto.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($recto.content) != '') or ($recto.elements.count &gt; 0)">
+ <div><xsl:copy-of select="$recto.content"/></div>
+ </xsl:if>
+ <xsl:variable name="verso.content">
+ <xsl:call-template name="setindex.titlepage.before.verso"/>
+ <xsl:call-template name="setindex.titlepage.verso"/>
+ </xsl:variable>
+ <xsl:variable name="verso.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($verso.content) != '') or ($verso.elements.count &gt; 0)">
+ <div><xsl:copy-of select="$verso.content"/></div>
+ </xsl:if>
+ <xsl:call-template name="setindex.titlepage.separator"/>
+ </div>
+</xsl:template>
+
+<xsl:template match="*" mode="setindex.titlepage.recto.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="*" mode="setindex.titlepage.verso.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="subtitle" mode="setindex.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="setindex.titlepage.recto.style">
+<xsl:apply-templates select="." mode="setindex.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template name="sidebar.titlepage.recto">
+ <xsl:choose>
+ <xsl:when test="sidebarinfo/title">
+ <xsl:apply-templates mode="sidebar.titlepage.recto.auto.mode" select="sidebarinfo/title"/>
+ </xsl:when>
+ <xsl:when test="docinfo/title">
+ <xsl:apply-templates mode="sidebar.titlepage.recto.auto.mode" select="docinfo/title"/>
+ </xsl:when>
+ <xsl:when test="info/title">
+ <xsl:apply-templates mode="sidebar.titlepage.recto.auto.mode" select="info/title"/>
+ </xsl:when>
+ <xsl:when test="title">
+ <xsl:apply-templates mode="sidebar.titlepage.recto.auto.mode" select="title"/>
+ </xsl:when>
+ </xsl:choose>
+
+ <xsl:choose>
+ <xsl:when test="sidebarinfo/subtitle">
+ <xsl:apply-templates mode="sidebar.titlepage.recto.auto.mode" select="sidebarinfo/subtitle"/>
+ </xsl:when>
+ <xsl:when test="docinfo/subtitle">
+ <xsl:apply-templates mode="sidebar.titlepage.recto.auto.mode" select="docinfo/subtitle"/>
+ </xsl:when>
+ <xsl:when test="info/subtitle">
+ <xsl:apply-templates mode="sidebar.titlepage.recto.auto.mode" select="info/subtitle"/>
+ </xsl:when>
+ <xsl:when test="subtitle">
+ <xsl:apply-templates mode="sidebar.titlepage.recto.auto.mode" select="subtitle"/>
+ </xsl:when>
+ </xsl:choose>
+
+</xsl:template>
+
+<xsl:template name="sidebar.titlepage.verso">
+</xsl:template>
+
+<xsl:template name="sidebar.titlepage.separator">
+</xsl:template>
+
+<xsl:template name="sidebar.titlepage.before.recto">
+</xsl:template>
+
+<xsl:template name="sidebar.titlepage.before.verso">
+</xsl:template>
+
+<xsl:template name="sidebar.titlepage">
+ <div class="titlepage">
+ <xsl:variable name="recto.content">
+ <xsl:call-template name="sidebar.titlepage.before.recto"/>
+ <xsl:call-template name="sidebar.titlepage.recto"/>
+ </xsl:variable>
+ <xsl:variable name="recto.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($recto.content) != '') or ($recto.elements.count &gt; 0)">
+ <div><xsl:copy-of select="$recto.content"/></div>
+ </xsl:if>
+ <xsl:variable name="verso.content">
+ <xsl:call-template name="sidebar.titlepage.before.verso"/>
+ <xsl:call-template name="sidebar.titlepage.verso"/>
+ </xsl:variable>
+ <xsl:variable name="verso.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($verso.content) != '') or ($verso.elements.count &gt; 0)">
+ <div><xsl:copy-of select="$verso.content"/></div>
+ </xsl:if>
+ <xsl:call-template name="sidebar.titlepage.separator"/>
+ </div>
+</xsl:template>
+
+<xsl:template match="*" mode="sidebar.titlepage.recto.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="*" mode="sidebar.titlepage.verso.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="title" mode="sidebar.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sidebar.titlepage.recto.style">
+<xsl:call-template name="formal.object.heading">
+<xsl:with-param name="object" select="ancestor-or-self::sidebar[1]"/>
+</xsl:call-template>
+</div>
+</xsl:template>
+
+<xsl:template match="subtitle" mode="sidebar.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sidebar.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sidebar.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/titlepage.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/titlepage.xsl
new file mode 100644
index 0000000..c3f8217
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/titlepage.xsl
@@ -0,0 +1,1030 @@
+<?xml version="1.0" encoding="ASCII"?>
+<!--This file was created automatically by html2xhtml-->
+<!--from the HTML stylesheets.-->
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1999/xhtml" version="1.0">
+
+<!-- ********************************************************************
+ $Id: titlepage.xsl 8816 2010-08-10 11:56:35Z mzjn $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<!-- ==================================================================== -->
+
+<xsl:attribute-set name="book.titlepage.recto.style"/>
+<xsl:attribute-set name="book.titlepage.verso.style"/>
+
+<xsl:attribute-set name="article.titlepage.recto.style"/>
+<xsl:attribute-set name="article.titlepage.verso.style"/>
+
+<xsl:attribute-set name="set.titlepage.recto.style"/>
+<xsl:attribute-set name="set.titlepage.verso.style"/>
+
+<xsl:attribute-set name="part.titlepage.recto.style"/>
+<xsl:attribute-set name="part.titlepage.verso.style"/>
+
+<xsl:attribute-set name="partintro.titlepage.recto.style"/>
+<xsl:attribute-set name="partintro.titlepage.verso.style"/>
+
+<xsl:attribute-set name="reference.titlepage.recto.style"/>
+<xsl:attribute-set name="reference.titlepage.verso.style"/>
+
+<xsl:attribute-set name="refentry.titlepage.recto.style"/>
+<xsl:attribute-set name="refentry.titlepage.verso.style"/>
+
+<xsl:attribute-set name="dedication.titlepage.recto.style"/>
+<xsl:attribute-set name="dedication.titlepage.verso.style"/>
+
+<xsl:attribute-set name="acknowledgements.titlepage.recto.style"/>
+<xsl:attribute-set name="acknowledgements.titlepage.verso.style"/>
+
+<xsl:attribute-set name="preface.titlepage.recto.style"/>
+<xsl:attribute-set name="preface.titlepage.verso.style"/>
+
+<xsl:attribute-set name="chapter.titlepage.recto.style"/>
+<xsl:attribute-set name="chapter.titlepage.verso.style"/>
+
+<xsl:attribute-set name="appendix.titlepage.recto.style"/>
+<xsl:attribute-set name="appendix.titlepage.verso.style"/>
+
+<xsl:attribute-set name="bibliography.titlepage.recto.style"/>
+<xsl:attribute-set name="bibliography.titlepage.verso.style"/>
+
+<xsl:attribute-set name="glossary.titlepage.recto.style"/>
+<xsl:attribute-set name="glossary.titlepage.verso.style"/>
+
+<xsl:attribute-set name="index.titlepage.recto.style"/>
+<xsl:attribute-set name="index.titlepage.verso.style"/>
+
+<xsl:attribute-set name="setindex.titlepage.recto.style"/>
+<xsl:attribute-set name="setindex.titlepage.verso.style"/>
+
+<xsl:attribute-set name="sidebar.titlepage.recto.style"/>
+<xsl:attribute-set name="sidebar.titlepage.verso.style"/>
+
+<xsl:attribute-set name="section.titlepage.recto.style"/>
+<xsl:attribute-set name="section.titlepage.verso.style"/>
+
+<xsl:attribute-set name="sect1.titlepage.recto.style" use-attribute-sets="section.titlepage.recto.style"/>
+<xsl:attribute-set name="sect1.titlepage.verso.style" use-attribute-sets="section.titlepage.verso.style"/>
+
+<xsl:attribute-set name="sect2.titlepage.recto.style" use-attribute-sets="section.titlepage.recto.style"/>
+<xsl:attribute-set name="sect2.titlepage.verso.style" use-attribute-sets="section.titlepage.verso.style"/>
+
+<xsl:attribute-set name="sect3.titlepage.recto.style" use-attribute-sets="section.titlepage.recto.style"/>
+<xsl:attribute-set name="sect3.titlepage.verso.style" use-attribute-sets="section.titlepage.verso.style"/>
+
+<xsl:attribute-set name="sect4.titlepage.recto.style" use-attribute-sets="section.titlepage.recto.style"/>
+<xsl:attribute-set name="sect4.titlepage.verso.style" use-attribute-sets="section.titlepage.verso.style"/>
+
+<xsl:attribute-set name="sect5.titlepage.recto.style" use-attribute-sets="section.titlepage.recto.style"/>
+<xsl:attribute-set name="sect5.titlepage.verso.style" use-attribute-sets="section.titlepage.verso.style"/>
+
+<xsl:attribute-set name="simplesect.titlepage.recto.style" use-attribute-sets="section.titlepage.recto.style"/>
+<xsl:attribute-set name="simplesect.titlepage.verso.style" use-attribute-sets="section.titlepage.verso.style"/>
+
+<xsl:attribute-set name="table.of.contents.titlepage.recto.style"/>
+<xsl:attribute-set name="table.of.contents.titlepage.verso.style"/>
+
+<xsl:attribute-set name="list.of.tables.titlepage.recto.style"/>
+<xsl:attribute-set name="list.of.tables.contents.titlepage.verso.style"/>
+
+<xsl:attribute-set name="list.of.figures.titlepage.recto.style"/>
+<xsl:attribute-set name="list.of.figures.contents.titlepage.verso.style"/>
+
+<xsl:attribute-set name="list.of.equations.titlepage.recto.style"/>
+<xsl:attribute-set name="list.of.equations.contents.titlepage.verso.style"/>
+
+<xsl:attribute-set name="list.of.examples.titlepage.recto.style"/>
+<xsl:attribute-set name="list.of.examples.contents.titlepage.verso.style"/>
+
+<xsl:attribute-set name="list.of.unknowns.titlepage.recto.style"/>
+<xsl:attribute-set name="list.of.unknowns.contents.titlepage.verso.style"/>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="*" mode="titlepage.mode">
+ <!-- if an element isn't found in this mode, try the default mode -->
+ <xsl:apply-templates select="."/>
+</xsl:template>
+
+<xsl:template match="abbrev" mode="titlepage.mode">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="titlepage.mode"/>
+ <br/>
+ </span>
+</xsl:template>
+
+<xsl:template match="abstract" mode="titlepage.mode">
+ <div>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:call-template name="anchor"/>
+ <xsl:if test="$abstract.notitle.enabled = 0">
+ <xsl:call-template name="formal.object.heading">
+ <xsl:with-param name="title">
+ <xsl:apply-templates select="." mode="title.markup"/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:if>
+ <xsl:apply-templates mode="titlepage.mode"/>
+ <xsl:call-template name="process.footnotes"/>
+ </div>
+</xsl:template>
+
+<xsl:template match="abstract/title" mode="titlepage.mode">
+</xsl:template>
+
+<xsl:template match="address" mode="titlepage.mode">
+ <xsl:param name="suppress-numbers" select="'0'"/>
+
+ <xsl:variable name="rtf">
+ <xsl:apply-templates mode="titlepage.mode"/>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="$suppress-numbers = '0' and @linenumbering = 'numbered' and $use.extensions != '0' and $linenumbering.extension != '0'">
+ <div>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:call-template name="paragraph">
+ <xsl:with-param name="content">
+ <xsl:call-template name="number.rtf.lines">
+ <xsl:with-param name="rtf" select="$rtf"/>
+ </xsl:call-template>
+ </xsl:with-param>
+ </xsl:call-template>
+ </div>
+ </xsl:when>
+
+ <xsl:otherwise>
+ <div>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:call-template name="paragraph">
+ <xsl:with-param name="content">
+ <xsl:call-template name="make-verbatim">
+ <xsl:with-param name="rtf" select="$rtf"/>
+ </xsl:call-template>
+ </xsl:with-param>
+ </xsl:call-template>
+ </div>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="affiliation" mode="titlepage.mode">
+ <div>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="titlepage.mode"/>
+ </div>
+</xsl:template>
+
+<xsl:template match="artpagenums" mode="titlepage.mode">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="titlepage.mode"/>
+ <br/>
+ </span>
+</xsl:template>
+
+<xsl:template match="author|editor" mode="titlepage.mode">
+ <xsl:call-template name="credits.div"/>
+</xsl:template>
+
+<xsl:template name="credits.div">
+ <div>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:if test="self::editor[position()=1] and not($editedby.enabled = 0)">
+ <h4 class="editedby"><xsl:call-template name="gentext.edited.by"/></h4>
+ </xsl:if>
+ <h3>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:choose>
+ <xsl:when test="orgname">
+ <xsl:apply-templates/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="person.name"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </h3>
+ <xsl:if test="not($contrib.inline.enabled = 0)">
+ <xsl:apply-templates mode="titlepage.mode" select="contrib"/>
+ </xsl:if>
+ <xsl:apply-templates mode="titlepage.mode" select="affiliation"/>
+ <xsl:apply-templates mode="titlepage.mode" select="email"/>
+ <xsl:if test="not($blurb.on.titlepage.enabled = 0)">
+ <xsl:choose>
+ <xsl:when test="$contrib.inline.enabled = 0">
+ <xsl:apply-templates mode="titlepage.mode" select="contrib|authorblurb|personblurb"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates mode="titlepage.mode" select="authorblurb|personblurb"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:if>
+ </div>
+</xsl:template>
+
+<xsl:template match="authorblurb|personblurb" mode="titlepage.mode">
+ <div>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="titlepage.mode"/>
+ </div>
+</xsl:template>
+
+<xsl:template match="authorgroup" mode="titlepage.mode">
+ <div>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:if test="parent::refentryinfo">
+ <h2>Authors</h2>
+ </xsl:if>
+
+ <xsl:call-template name="anchor"/>
+ <xsl:apply-templates mode="titlepage.mode"/>
+ </div>
+</xsl:template>
+
+<xsl:template match="authorinitials" mode="titlepage.mode">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="titlepage.mode"/>
+ <br/>
+ </span>
+</xsl:template>
+
+<xsl:template match="bibliomisc" mode="titlepage.mode">
+ <xsl:apply-templates mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="bibliomset" mode="titlepage.mode">
+ <xsl:apply-templates mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="collab" mode="titlepage.mode">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="titlepage.mode"/>
+ <br/>
+ </span>
+</xsl:template>
+
+<xsl:template match="collabname" mode="titlepage.mode">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="titlepage.mode"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="confgroup" mode="titlepage.mode">
+ <div>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="titlepage.mode"/>
+ </div>
+</xsl:template>
+
+<xsl:template match="confdates" mode="titlepage.mode">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="titlepage.mode"/>
+ <br/>
+ </span>
+</xsl:template>
+
+<xsl:template match="confsponsor" mode="titlepage.mode">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="titlepage.mode"/>
+ <br/>
+ </span>
+</xsl:template>
+
+<xsl:template match="conftitle" mode="titlepage.mode">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="titlepage.mode"/>
+ <br/>
+ </span>
+</xsl:template>
+
+<xsl:template match="confnum" mode="titlepage.mode">
+ <!-- suppress -->
+</xsl:template>
+
+<xsl:template match="contractnum" mode="titlepage.mode">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="titlepage.mode"/>
+ <br/>
+ </span>
+</xsl:template>
+
+<xsl:template match="contractsponsor" mode="titlepage.mode">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="titlepage.mode"/>
+ <br/>
+ </span>
+</xsl:template>
+
+<xsl:template match="contrib" mode="titlepage.mode">
+ <xsl:choose>
+ <xsl:when test="not($contrib.inline.enabled = 0)">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="titlepage.mode"/>
+ </span><xsl:text>&#160;</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <div>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <p><xsl:apply-templates mode="titlepage.mode"/></p>
+ </div>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="copyright" mode="titlepage.mode">
+
+ <xsl:if test="generate-id() = generate-id(//refentryinfo/copyright[1]) and ($stylesheet.result.type = 'html' or $stylesheet.result.type = 'xhtml')">
+ <h2>Copyright</h2>
+ </xsl:if>
+
+ <p>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'Copyright'"/>
+ </xsl:call-template>
+ <xsl:call-template name="gentext.space"/>
+ <xsl:call-template name="dingbat">
+ <xsl:with-param name="dingbat">copyright</xsl:with-param>
+ </xsl:call-template>
+ <xsl:call-template name="gentext.space"/>
+ <xsl:call-template name="copyright.years">
+ <xsl:with-param name="years" select="year"/>
+ <xsl:with-param name="print.ranges" select="$make.year.ranges"/>
+ <xsl:with-param name="single.year.ranges" select="$make.single.year.ranges"/>
+ </xsl:call-template>
+ <xsl:call-template name="gentext.space"/>
+ <xsl:apply-templates select="holder" mode="titlepage.mode"/>
+ </p>
+</xsl:template>
+
+<xsl:template match="year" mode="titlepage.mode">
+ <xsl:choose>
+ <xsl:when test="$show.revisionflag != 0 and @revisionflag">
+ <span class="{@revisionflag}">
+ <xsl:apply-templates mode="titlepage.mode"/>
+ </span>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates mode="titlepage.mode"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="holder" mode="titlepage.mode">
+ <xsl:choose>
+ <xsl:when test="$show.revisionflag != 0 and @revisionflag">
+ <span class="{@revisionflag}">
+ <xsl:apply-templates mode="titlepage.mode"/>
+ </span>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates mode="titlepage.mode"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:if test="position() &lt; last()">
+ <xsl:text>, </xsl:text>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="corpauthor" mode="titlepage.mode">
+ <h3>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="titlepage.mode"/>
+ </h3>
+</xsl:template>
+
+<xsl:template match="corpcredit" mode="titlepage.mode">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="titlepage.mode"/>
+ <br/>
+ </span>
+</xsl:template>
+
+<xsl:template match="corpname" mode="titlepage.mode">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="titlepage.mode"/>
+ <br/>
+ </span>
+</xsl:template>
+
+<xsl:template match="date" mode="titlepage.mode">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="titlepage.mode"/>
+ <br/>
+ </span>
+</xsl:template>
+
+<xsl:template match="edition" mode="titlepage.mode">
+ <p>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="titlepage.mode"/>
+ <xsl:call-template name="gentext.space"/>
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'Edition'"/>
+ </xsl:call-template>
+ </p>
+</xsl:template>
+
+<xsl:template match="email" mode="titlepage.mode">
+ <!-- use the normal e-mail handling code -->
+ <xsl:apply-templates select="."/>
+</xsl:template>
+
+<xsl:template match="firstname" mode="titlepage.mode">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="titlepage.mode"/>
+ <br/>
+ </span>
+</xsl:template>
+
+<xsl:template match="graphic" mode="titlepage.mode">
+ <!-- use the normal graphic handling code -->
+ <xsl:apply-templates select="."/>
+</xsl:template>
+
+<xsl:template match="honorific" mode="titlepage.mode">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="titlepage.mode"/>
+ <br/>
+ </span>
+</xsl:template>
+
+<xsl:template match="isbn" mode="titlepage.mode">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="titlepage.mode"/>
+ <br/>
+ </span>
+</xsl:template>
+
+<xsl:template match="issn" mode="titlepage.mode">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="titlepage.mode"/>
+ <br/>
+ </span>
+</xsl:template>
+
+<xsl:template match="biblioid" mode="titlepage.mode">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="titlepage.mode"/>
+ <br/>
+ </span>
+</xsl:template>
+
+<xsl:template match="itermset" mode="titlepage.mode">
+</xsl:template>
+
+<xsl:template match="invpartnumber" mode="titlepage.mode">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="titlepage.mode"/>
+ <br/>
+ </span>
+</xsl:template>
+
+<xsl:template match="issuenum" mode="titlepage.mode">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="titlepage.mode"/>
+ <br/>
+ </span>
+</xsl:template>
+
+<xsl:template match="jobtitle" mode="titlepage.mode">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="titlepage.mode"/>
+ <br/>
+ </span>
+</xsl:template>
+
+<xsl:template match="keywordset" mode="titlepage.mode">
+</xsl:template>
+
+<xsl:template match="legalnotice" mode="titlepage.mode">
+ <xsl:variable name="id"><xsl:call-template name="object.id"/></xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="$generate.legalnotice.link != 0">
+
+ <!-- Compute name of legalnotice file -->
+ <xsl:variable name="file">
+ <xsl:call-template name="ln.or.rh.filename"/>
+ </xsl:variable>
+
+ <xsl:variable name="filename">
+ <xsl:call-template name="make-relative-filename">
+ <xsl:with-param name="base.dir" select="$base.dir"/>
+ <xsl:with-param name="base.name" select="$file"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="title">
+ <xsl:apply-templates select="." mode="title.markup"/>
+ </xsl:variable>
+
+ <a href="{$file}">
+ <xsl:copy-of select="$title"/>
+ </a>
+
+ <xsl:call-template name="write.chunk">
+ <xsl:with-param name="filename" select="$filename"/>
+ <xsl:with-param name="quiet" select="$chunk.quietly"/>
+ <xsl:with-param name="content">
+ <xsl:call-template name="user.preroot"/>
+ <html>
+ <head>
+ <xsl:call-template name="system.head.content"/>
+ <xsl:call-template name="head.content"/>
+ <xsl:call-template name="user.head.content"/>
+ </head>
+ <body>
+ <xsl:call-template name="body.attributes"/>
+ <div>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="titlepage.mode"/>
+ </div>
+ </body>
+ </html>
+ <xsl:value-of select="$chunk.append"/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <div>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <a id="{$id}"/>
+ <xsl:apply-templates mode="titlepage.mode"/>
+ </div>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="legalnotice/title" mode="titlepage.mode">
+ <p class="legalnotice-title"><strong xmlns:xslo="http://www.w3.org/1999/XSL/Transform"><xsl:apply-templates/></strong></p>
+</xsl:template>
+
+<xsl:template match="lineage" mode="titlepage.mode">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="titlepage.mode"/>
+ <br/>
+ </span>
+</xsl:template>
+
+<xsl:template match="modespec" mode="titlepage.mode">
+</xsl:template>
+
+<xsl:template match="orgdiv" mode="titlepage.mode">
+ <xsl:if test="preceding-sibling::*[1][self::orgname]">
+ <xsl:text> </xsl:text>
+ </xsl:if>
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="titlepage.mode"/>
+ <br/>
+ </span>
+</xsl:template>
+
+<xsl:template match="orgname" mode="titlepage.mode">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="titlepage.mode"/>
+ <br/>
+ </span>
+</xsl:template>
+
+<xsl:template match="othercredit" mode="titlepage.mode">
+<xsl:choose>
+ <xsl:when test="not($othercredit.like.author.enabled = 0)">
+ <xsl:variable name="contrib" select="string(contrib)"/>
+ <xsl:choose>
+ <xsl:when test="contrib">
+ <xsl:if test="not(preceding-sibling::othercredit[string(contrib)=$contrib])">
+ <xsl:call-template name="paragraph">
+ <xsl:with-param name="class" select="local-name(.)"/>
+ <xsl:with-param name="content">
+ <xsl:apply-templates mode="titlepage.mode" select="contrib"/>
+ <xsl:text>: </xsl:text>
+ <xsl:call-template name="person.name"/>
+ <xsl:apply-templates mode="titlepage.mode" select="affiliation"/>
+ <xsl:apply-templates select="following-sibling::othercredit[string(contrib)=$contrib]" mode="titlepage.othercredits"/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="paragraph">
+ <xsl:with-param name="class" select="local-name(.)"/>
+ <xsl:with-param name="content">
+ <xsl:call-template name="person.name"/>
+ </xsl:with-param>
+ </xsl:call-template>
+ <xsl:apply-templates mode="titlepage.mode" select="affiliation"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="credits.div"/>
+ </xsl:otherwise>
+</xsl:choose>
+</xsl:template>
+
+<xsl:template match="othercredit" mode="titlepage.othercredits">
+ <xsl:text>, </xsl:text>
+ <xsl:call-template name="person.name"/>
+</xsl:template>
+
+<xsl:template match="othername" mode="titlepage.mode">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="titlepage.mode"/>
+ <br/>
+ </span>
+</xsl:template>
+
+<xsl:template match="pagenums" mode="titlepage.mode">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="titlepage.mode"/>
+ <br/>
+ </span>
+</xsl:template>
+
+<xsl:template match="printhistory" mode="titlepage.mode">
+ <div>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="titlepage.mode"/>
+ </div>
+</xsl:template>
+
+<xsl:template match="productname" mode="titlepage.mode">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="titlepage.mode"/>
+ <br/>
+ </span>
+</xsl:template>
+
+<xsl:template match="productnumber" mode="titlepage.mode">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="titlepage.mode"/>
+ <br/>
+ </span>
+</xsl:template>
+
+<xsl:template match="pubdate" mode="titlepage.mode">
+ <xsl:call-template name="paragraph">
+ <xsl:with-param name="class" select="local-name(.)"/>
+ <xsl:with-param name="content">
+ <xsl:apply-templates mode="titlepage.mode"/>
+ </xsl:with-param>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="publisher" mode="titlepage.mode">
+ <xsl:call-template name="paragraph">
+ <xsl:with-param name="class" select="local-name(.)"/>
+ <xsl:with-param name="content">
+ <xsl:apply-templates mode="titlepage.mode"/>
+ </xsl:with-param>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="publishername" mode="titlepage.mode">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="titlepage.mode"/>
+ <br/>
+ </span>
+</xsl:template>
+
+<xsl:template match="pubsnumber" mode="titlepage.mode">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="titlepage.mode"/>
+ <br/>
+ </span>
+</xsl:template>
+
+<xsl:template match="releaseinfo" mode="titlepage.mode">
+ <xsl:call-template name="paragraph">
+ <xsl:with-param name="class" select="local-name(.)"/>
+ <xsl:with-param name="content">
+ <xsl:apply-templates mode="titlepage.mode"/>
+ </xsl:with-param>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="revhistory" mode="titlepage.mode">
+ <xsl:variable name="numcols">
+ <xsl:choose>
+ <xsl:when test=".//authorinitials|.//author">3</xsl:when>
+ <xsl:otherwise>2</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="id"><xsl:call-template name="object.id"/></xsl:variable>
+
+ <xsl:variable name="title">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key">RevHistory</xsl:with-param>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="contents">
+ <div>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <table border="1" width="100%" summary="Revision history">
+ <tr>
+ <th align="{$direction.align.start}" valign="top" colspan="{$numcols}">
+ <strong xmlns:xslo="http://www.w3.org/1999/XSL/Transform">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'RevHistory'"/>
+ </xsl:call-template>
+ </strong>
+ </th>
+ </tr>
+ <xsl:apply-templates mode="titlepage.mode">
+ <xsl:with-param name="numcols" select="$numcols"/>
+ </xsl:apply-templates>
+ </table>
+ </div>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="$generate.revhistory.link != 0">
+
+ <!-- Compute name of revhistory file -->
+ <xsl:variable name="file">
+ <xsl:call-template name="ln.or.rh.filename">
+ <xsl:with-param name="is.ln" select="false()"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="filename">
+ <xsl:call-template name="make-relative-filename">
+ <xsl:with-param name="base.dir" select="$base.dir"/>
+ <xsl:with-param name="base.name" select="$file"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <a href="{$file}">
+ <xsl:copy-of select="$title"/>
+ </a>
+
+ <xsl:call-template name="write.chunk">
+ <xsl:with-param name="filename" select="$filename"/>
+ <xsl:with-param name="quiet" select="$chunk.quietly"/>
+ <xsl:with-param name="content">
+ <xsl:call-template name="user.preroot"/>
+ <html>
+ <head>
+ <xsl:call-template name="system.head.content"/>
+ <xsl:call-template name="head.content">
+ <xsl:with-param name="title">
+ <xsl:value-of select="$title"/>
+ <xsl:if test="../../title">
+ <xsl:value-of select="concat(' (', ../../title, ')')"/>
+ </xsl:if>
+ </xsl:with-param>
+ </xsl:call-template>
+ <xsl:call-template name="user.head.content"/>
+ </head>
+ <body>
+ <xsl:call-template name="body.attributes"/>
+ <xsl:copy-of select="$contents"/>
+ </body>
+ </html>
+ <xsl:text>
+</xsl:text>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:copy-of select="$contents"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="revhistory/revision" mode="titlepage.mode">
+ <xsl:param name="numcols" select="'3'"/>
+ <xsl:variable name="revnumber" select="revnumber"/>
+ <xsl:variable name="revdate" select="date"/>
+ <xsl:variable name="revauthor" select="authorinitials|author"/>
+ <xsl:variable name="revremark" select="revremark|revdescription"/>
+ <tr>
+ <td align="{$direction.align.start}">
+ <xsl:if test="$revnumber">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'Revision'"/>
+ </xsl:call-template>
+ <xsl:call-template name="gentext.space"/>
+ <xsl:apply-templates select="$revnumber[1]" mode="titlepage.mode"/>
+ </xsl:if>
+ </td>
+ <td align="{$direction.align.start}">
+ <xsl:apply-templates select="$revdate[1]" mode="titlepage.mode"/>
+ </td>
+ <xsl:choose>
+ <xsl:when test="$revauthor">
+ <td align="{$direction.align.start}">
+ <xsl:for-each select="$revauthor">
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+ <xsl:if test="position() != last()">
+ <xsl:text>, </xsl:text>
+ </xsl:if>
+ </xsl:for-each>
+ </td>
+ </xsl:when>
+ <xsl:when test="$numcols &gt; 2">
+ <td>&#160;</td>
+ </xsl:when>
+ <xsl:otherwise/>
+ </xsl:choose>
+ </tr>
+ <xsl:if test="$revremark">
+ <tr>
+ <td align="{$direction.align.start}" colspan="{$numcols}">
+ <xsl:apply-templates select="$revremark[1]" mode="titlepage.mode"/>
+ </td>
+ </tr>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="revision/revnumber" mode="titlepage.mode">
+ <xsl:apply-templates mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="revision/date" mode="titlepage.mode">
+ <xsl:apply-templates mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="revision/authorinitials" mode="titlepage.mode">
+ <xsl:apply-templates mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="revision/author" mode="titlepage.mode">
+ <xsl:apply-templates mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="revision/revremark" mode="titlepage.mode">
+ <xsl:apply-templates mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="revision/revdescription" mode="titlepage.mode">
+ <xsl:apply-templates mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="seriesvolnums" mode="titlepage.mode">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="titlepage.mode"/>
+ <br/>
+ </span>
+</xsl:template>
+
+<xsl:template match="shortaffil" mode="titlepage.mode">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="titlepage.mode"/>
+ <br/>
+ </span>
+</xsl:template>
+
+<xsl:template match="subjectset" mode="titlepage.mode">
+</xsl:template>
+
+<xsl:template match="subtitle" mode="titlepage.mode">
+ <h2>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="titlepage.mode"/>
+ </h2>
+</xsl:template>
+
+<xsl:template match="surname" mode="titlepage.mode">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="titlepage.mode"/>
+ <br/>
+ </span>
+</xsl:template>
+
+<xsl:template match="title" mode="titlepage.mode">
+ <xsl:variable name="id">
+ <xsl:choose>
+ <!-- if title is in an *info wrapper, get the grandparent -->
+ <xsl:when test="contains(local-name(..), 'info')">
+ <xsl:call-template name="object.id">
+ <xsl:with-param name="object" select="../.."/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="object.id">
+ <xsl:with-param name="object" select=".."/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <h1>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:if test="$generate.id.attributes = 0">
+ <a id="{$id}"/>
+ </xsl:if>
+ <xsl:choose>
+ <xsl:when test="$show.revisionflag != 0 and @revisionflag">
+ <span class="{@revisionflag}">
+ <xsl:apply-templates mode="titlepage.mode"/>
+ </span>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates mode="titlepage.mode"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </h1>
+</xsl:template>
+
+<xsl:template match="titleabbrev" mode="titlepage.mode">
+ <!-- nop; title abbreviations don't belong on the title page! -->
+</xsl:template>
+
+<xsl:template match="volumenum" mode="titlepage.mode">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="titlepage.mode"/>
+ <br/>
+ </span>
+</xsl:template>
+
+<!-- This template computes the filename for legalnotice and revhistory chunks -->
+<xsl:template name="ln.or.rh.filename">
+ <xsl:param name="node" select="."/>
+ <xsl:param name="is.ln" select="true()"/>
+
+ <xsl:variable name="dbhtml-filename">
+ <xsl:call-template name="pi.dbhtml_filename">
+ <xsl:with-param name="node" select="$node"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:choose>
+ <!-- 1. If there is a dbhtml_filename PI, use that -->
+ <xsl:when test="$dbhtml-filename != ''">
+ <xsl:value-of select="$dbhtml-filename"/>
+ </xsl:when>
+ <xsl:when test="($node/@id or $node/@xml:id) and not($use.id.as.filename = 0)">
+ <!-- * 2. If this legalnotice/revhistory has an ID, then go ahead and use -->
+ <!-- * just the value of that ID as the basename for the file -->
+ <!-- * (that is, without prepending an "ln-" or "rh-" to it) -->
+ <xsl:value-of select="($node/@id|$node/@xml:id)[1]"/>
+ <xsl:value-of select="$html.ext"/>
+ </xsl:when>
+ <xsl:when test="not ($node/@id or $node/@xml:id) or $use.id.as.filename = 0">
+ <!-- * 3. Otherwise, if this legalnotice/revhistory does not have an ID, or -->
+ <!-- * if $use.id.as.filename = 0 -->
+ <!-- * then we generate an ID... -->
+ <xsl:variable name="id">
+ <xsl:value-of select="generate-id($node)"/>
+ </xsl:variable>
+ <!-- * ...and then we take that generated ID, prepend a -->
+ <!-- * prefix to it, and use that as the basename for the file -->
+ <xsl:choose>
+ <xsl:when test="$is.ln">
+ <xsl:value-of select="concat('ln-',$id,$html.ext)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="concat('rh-',$id,$html.ext)"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/toc.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/toc.xsl
new file mode 100644
index 0000000..92b7b14
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/toc.xsl
@@ -0,0 +1,330 @@
+<?xml version="1.0" encoding="ASCII"?>
+<!--This file was created automatically by html2xhtml-->
+<!--from the HTML stylesheets.-->
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1999/xhtml" version="1.0">
+
+<!-- ********************************************************************
+ $Id: toc.xsl 8421 2009-05-04 07:49:49Z bobstayton $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<!-- ==================================================================== -->
+
+<xsl:template match="set/toc | book/toc | part/toc">
+ <xsl:variable name="toc.params">
+ <xsl:call-template name="find.path.params">
+ <xsl:with-param name="node" select="parent::*"/>
+ <xsl:with-param name="table" select="normalize-space($generate.toc)"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <!-- Do not output the toc element if one is already generated
+ by the use of $generate.toc parameter, or if
+ generating a source toc is turned off -->
+ <xsl:if test="not(contains($toc.params, 'toc')) and ($process.source.toc != 0 or $process.empty.source.toc != 0)">
+ <xsl:variable name="content">
+ <xsl:choose>
+ <xsl:when test="* and $process.source.toc != 0">
+ <xsl:apply-templates/>
+ </xsl:when>
+ <xsl:when test="count(*) = 0 and $process.empty.source.toc != 0">
+ <!-- trick to switch context node to parent element -->
+ <xsl:for-each select="parent::*">
+ <xsl:choose>
+ <xsl:when test="self::set">
+ <xsl:call-template name="set.toc">
+ <xsl:with-param name="toc.title.p" select="contains($toc.params, 'title')"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="self::book">
+ <xsl:call-template name="division.toc">
+ <xsl:with-param name="toc.title.p" select="contains($toc.params, 'title')"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="self::part">
+ <xsl:call-template name="division.toc">
+ <xsl:with-param name="toc.title.p" select="contains($toc.params, 'title')"/>
+ </xsl:call-template>
+ </xsl:when>
+ </xsl:choose>
+ </xsl:for-each>
+ </xsl:when>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:if test="string-length(normalize-space($content)) != 0">
+ <xsl:copy-of select="$content"/>
+ </xsl:if>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="chapter/toc | appendix/toc | preface/toc | article/toc">
+ <xsl:variable name="toc.params">
+ <xsl:call-template name="find.path.params">
+ <xsl:with-param name="node" select="parent::*"/>
+ <xsl:with-param name="table" select="normalize-space($generate.toc)"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <!-- Do not output the toc element if one is already generated
+ by the use of $generate.toc parameter, or if
+ generating a source toc is turned off -->
+ <xsl:if test="not(contains($toc.params, 'toc')) and ($process.source.toc != 0 or $process.empty.source.toc != 0)">
+ <xsl:choose>
+ <xsl:when test="* and $process.source.toc != 0">
+ <div>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates select="title"/>
+ <dl>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates select="*[not(self::title)]"/>
+ </dl>
+ </div>
+ <xsl:call-template name="component.toc.separator"/>
+ </xsl:when>
+ <xsl:when test="count(*) = 0 and $process.empty.source.toc != 0">
+ <!-- trick to switch context node to section element -->
+ <xsl:for-each select="parent::*">
+ <xsl:call-template name="component.toc">
+ <xsl:with-param name="toc.title.p" select="contains($toc.params, 'title')"/>
+ </xsl:call-template>
+ </xsl:for-each>
+ <xsl:call-template name="component.toc.separator"/>
+ </xsl:when>
+ </xsl:choose>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="section/toc |sect1/toc |sect2/toc |sect3/toc |sect4/toc |sect5/toc">
+
+ <xsl:variable name="toc.params">
+ <xsl:call-template name="find.path.params">
+ <xsl:with-param name="node" select="parent::*"/>
+ <xsl:with-param name="table" select="normalize-space($generate.toc)"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <!-- Do not output the toc element if one is already generated
+ by the use of $generate.toc parameter, or if
+ generating a source toc is turned off -->
+ <xsl:if test="not(contains($toc.params, 'toc')) and ($process.source.toc != 0 or $process.empty.source.toc != 0)">
+ <xsl:choose>
+ <xsl:when test="* and $process.source.toc != 0">
+ <div>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates select="title"/>
+ <dl>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates select="*[not(self::title)]"/>
+ </dl>
+ </div>
+ <xsl:call-template name="section.toc.separator"/>
+ </xsl:when>
+ <xsl:when test="count(*) = 0 and $process.empty.source.toc != 0">
+ <!-- trick to switch context node to section element -->
+ <xsl:for-each select="parent::*">
+ <xsl:call-template name="section.toc">
+ <xsl:with-param name="toc.title.p" select="contains($toc.params, 'title')"/>
+ </xsl:call-template>
+ </xsl:for-each>
+ <xsl:call-template name="section.toc.separator"/>
+ </xsl:when>
+ </xsl:choose>
+ </xsl:if>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="tocpart|tocchap |toclevel1|toclevel2|toclevel3|toclevel4|toclevel5">
+ <xsl:variable name="sub-toc">
+ <xsl:if test="tocchap|toclevel1|toclevel2|toclevel3|toclevel4|toclevel5">
+ <xsl:choose>
+ <xsl:when test="$toc.list.type = 'dl'">
+ <dd>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:element name="{$toc.list.type}" namespace="http://www.w3.org/1999/xhtml">
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates select="tocchap|toclevel1|toclevel2| toclevel3|toclevel4|toclevel5"/>
+ </xsl:element>
+ </dd>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:element name="{$toc.list.type}" namespace="http://www.w3.org/1999/xhtml">
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates select="tocchap|toclevel1|toclevel2| toclevel3|toclevel4|toclevel5"/>
+ </xsl:element>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:if>
+ </xsl:variable>
+
+ <xsl:apply-templates select="tocentry[position() != last()]"/>
+
+ <xsl:choose>
+ <xsl:when test="$toc.list.type = 'dl'">
+ <dt>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates select="tocentry[position() = last()]"/>
+ </dt>
+ <xsl:copy-of select="$sub-toc"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <li>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates select="tocentry[position() = last()]"/>
+ <xsl:copy-of select="$sub-toc"/>
+ </li>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="tocentry|tocdiv|lotentry|tocfront|tocback">
+ <xsl:choose>
+ <xsl:when test="$toc.list.type = 'dl'">
+ <dt>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:call-template name="tocentry-content"/>
+ </dt>
+ </xsl:when>
+ <xsl:otherwise>
+ <li>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:call-template name="tocentry-content"/>
+ </li>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="tocentry[position() = last()]" priority="2">
+ <xsl:call-template name="tocentry-content"/>
+</xsl:template>
+
+<xsl:template name="tocentry-content">
+ <xsl:variable name="targets" select="key('id',@linkend)"/>
+ <xsl:variable name="target" select="$targets[1]"/>
+
+ <xsl:choose>
+ <xsl:when test="@linkend">
+ <xsl:call-template name="check.id.unique">
+ <xsl:with-param name="linkend" select="@linkend"/>
+ </xsl:call-template>
+ <a>
+ <xsl:attribute name="href">
+ <xsl:call-template name="href.target">
+ <xsl:with-param name="object" select="$target"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:apply-templates/>
+ </a>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="toc/title">
+ <div>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates/>
+ </div>
+</xsl:template>
+
+<xsl:template match="toc/subtitle">
+ <div>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates/>
+ </div>
+</xsl:template>
+
+<xsl:template match="toc/titleabbrev">
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<!-- A lot element must have content, because there is no attribute
+ to select what kind of list should be generated -->
+<xsl:template match="book/lot | part/lot">
+ <!-- Don't generate a page sequence unless there is content -->
+ <xsl:variable name="content">
+ <xsl:choose>
+ <xsl:when test="* and $process.source.toc != 0">
+ <div>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates/>
+ </div>
+ </xsl:when>
+ <xsl:when test="not(child::*) and $process.empty.source.toc != 0">
+ <xsl:call-template name="process.empty.lot"/>
+ </xsl:when>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:if test="string-length(normalize-space($content)) != 0">
+ <xsl:copy-of select="$content"/>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="chapter/lot | appendix/lot | preface/lot | article/lot">
+ <xsl:choose>
+ <xsl:when test="* and $process.source.toc != 0">
+ <div>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates/>
+ </div>
+ <xsl:call-template name="component.toc.separator"/>
+ </xsl:when>
+ <xsl:when test="not(child::*) and $process.empty.source.toc != 0">
+ <xsl:call-template name="process.empty.lot"/>
+ </xsl:when>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="section/lot |sect1/lot |sect2/lot |sect3/lot |sect4/lot |sect5/lot">
+ <xsl:choose>
+ <xsl:when test="* and $process.source.toc != 0">
+ <div>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates/>
+ </div>
+ <xsl:call-template name="section.toc.separator"/>
+ </xsl:when>
+ <xsl:when test="not(child::*) and $process.empty.source.toc != 0">
+ <xsl:call-template name="process.empty.lot"/>
+ </xsl:when>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="process.empty.lot">
+ <!-- An empty lot element does not provide any information to indicate
+ what should be included in it. You can customize this
+ template to generate a lot based on @role or something -->
+ <xsl:message>
+ <xsl:text>Warning: don't know what to generate for </xsl:text>
+ <xsl:text>lot that has no children.</xsl:text>
+ </xsl:message>
+</xsl:template>
+
+<xsl:template match="lot/title">
+ <div>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates/>
+ </div>
+</xsl:template>
+
+<xsl:template match="lot/subtitle">
+ <div>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates/>
+ </div>
+</xsl:template>
+
+<xsl:template match="lot/titleabbrev">
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/verbatim.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/verbatim.xsl
new file mode 100644
index 0000000..c0bc69d
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/verbatim.xsl
@@ -0,0 +1,388 @@
+<?xml version="1.0" encoding="ASCII"?>
+<!--This file was created automatically by html2xhtml-->
+<!--from the HTML stylesheets.-->
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:sverb="http://nwalsh.com/xslt/ext/com.nwalsh.saxon.Verbatim" xmlns:xverb="xalan://com.nwalsh.xalan.Verbatim" xmlns:lxslt="http://xml.apache.org/xslt" xmlns:exsl="http://exslt.org/common" xmlns="http://www.w3.org/1999/xhtml" exclude-result-prefixes="sverb xverb lxslt exsl" version="1.0">
+
+<!-- ********************************************************************
+ $Id: verbatim.xsl 8807 2010-08-09 18:57:41Z bobstayton $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<!-- XSLTHL highlighting is turned off by default. See highlighting/README
+ for instructions on how to turn on XSLTHL -->
+<xsl:template name="apply-highlighting">
+ <xsl:apply-templates/>
+</xsl:template>
+
+<lxslt:component prefix="xverb" functions="numberLines"/>
+
+<xsl:template match="programlisting|screen|synopsis">
+ <xsl:param name="suppress-numbers" select="'0'"/>
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+
+ <xsl:call-template name="anchor"/>
+
+ <xsl:variable name="div.element">
+ <xsl:choose>
+ <xsl:when test="$make.clean.html != 0">div</xsl:when>
+ <xsl:otherwise>pre</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:if test="$shade.verbatim != 0">
+ <xsl:message>
+ <xsl:text>The shade.verbatim parameter is deprecated. </xsl:text>
+ <xsl:text>Use CSS instead,</xsl:text>
+ </xsl:message>
+ <xsl:message>
+ <xsl:text>for example: pre.</xsl:text>
+ <xsl:value-of select="local-name(.)"/>
+ <xsl:text> { background-color: #E0E0E0; }</xsl:text>
+ </xsl:message>
+ </xsl:if>
+
+ <xsl:choose>
+ <xsl:when test="$suppress-numbers = '0' and @linenumbering = 'numbered' and $use.extensions != '0' and $linenumbering.extension != '0'">
+ <xsl:variable name="rtf">
+ <xsl:choose>
+ <xsl:when test="$highlight.source != 0">
+ <xsl:call-template name="apply-highlighting"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:element name="{$div.element}" namespace="http://www.w3.org/1999/xhtml">
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:if test="@width != ''">
+ <xsl:attribute name="width">
+ <xsl:value-of select="@width"/>
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:call-template name="number.rtf.lines">
+ <xsl:with-param name="rtf" select="$rtf"/>
+ </xsl:call-template>
+ </xsl:element>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:element name="{$div.element}" namespace="http://www.w3.org/1999/xhtml">
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:if test="@width != ''">
+ <xsl:attribute name="width">
+ <xsl:value-of select="@width"/>
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:choose>
+ <xsl:when test="$highlight.source != 0">
+ <xsl:call-template name="apply-highlighting"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:element>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="literallayout">
+ <xsl:param name="suppress-numbers" select="'0'"/>
+
+ <xsl:variable name="rtf">
+ <xsl:apply-templates/>
+ </xsl:variable>
+
+ <xsl:if test="$shade.verbatim != 0 and @class='monospaced'">
+ <xsl:message>
+ <xsl:text>The shade.verbatim parameter is deprecated. </xsl:text>
+ <xsl:text>Use CSS instead,</xsl:text>
+ </xsl:message>
+ <xsl:message>
+ <xsl:text>for example: pre.</xsl:text>
+ <xsl:value-of select="local-name(.)"/>
+ <xsl:text> { background-color: #E0E0E0; }</xsl:text>
+ </xsl:message>
+ </xsl:if>
+
+ <xsl:choose>
+ <xsl:when test="$suppress-numbers = '0' and @linenumbering = 'numbered' and $use.extensions != '0' and $linenumbering.extension != '0'">
+ <xsl:choose>
+ <xsl:when test="@class='monospaced'">
+ <pre>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:call-template name="number.rtf.lines">
+ <xsl:with-param name="rtf" select="$rtf"/>
+ </xsl:call-template>
+ </pre>
+ </xsl:when>
+ <xsl:otherwise>
+ <div>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <p>
+ <xsl:call-template name="number.rtf.lines">
+ <xsl:with-param name="rtf" select="$rtf"/>
+ </xsl:call-template>
+ </p>
+ </div>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:choose>
+ <xsl:when test="@class='monospaced'">
+ <pre>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:copy-of select="$rtf"/>
+ </pre>
+ </xsl:when>
+ <xsl:otherwise>
+ <div>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <p>
+ <xsl:call-template name="make-verbatim">
+ <xsl:with-param name="rtf" select="$rtf"/>
+ </xsl:call-template>
+ </p>
+ </div>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="address">
+ <xsl:param name="suppress-numbers" select="'0'"/>
+
+ <xsl:variable name="rtf">
+ <xsl:apply-templates/>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="$suppress-numbers = '0' and @linenumbering = 'numbered' and $use.extensions != '0' and $linenumbering.extension != '0'">
+ <div>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <p>
+ <xsl:call-template name="number.rtf.lines">
+ <xsl:with-param name="rtf" select="$rtf"/>
+ </xsl:call-template>
+ </p>
+ </div>
+ </xsl:when>
+
+ <xsl:otherwise>
+ <div>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <p>
+ <xsl:call-template name="make-verbatim">
+ <xsl:with-param name="rtf" select="$rtf"/>
+ </xsl:call-template>
+ </p>
+ </div>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="number.rtf.lines">
+ <xsl:param name="rtf" select="''"/>
+ <xsl:param name="pi.context" select="."/>
+
+ <!-- Save the global values -->
+ <xsl:variable name="global.linenumbering.everyNth" select="$linenumbering.everyNth"/>
+
+ <xsl:variable name="global.linenumbering.separator" select="$linenumbering.separator"/>
+
+ <xsl:variable name="global.linenumbering.width" select="$linenumbering.width"/>
+
+ <!-- Extract the <?dbhtml linenumbering.*?> PI values -->
+ <xsl:variable name="pi.linenumbering.everyNth">
+ <xsl:call-template name="pi.dbhtml_linenumbering.everyNth">
+ <xsl:with-param name="node" select="$pi.context"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="pi.linenumbering.separator">
+ <xsl:call-template name="pi.dbhtml_linenumbering.separator">
+ <xsl:with-param name="node" select="$pi.context"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="pi.linenumbering.width">
+ <xsl:call-template name="pi.dbhtml_linenumbering.width">
+ <xsl:with-param name="node" select="$pi.context"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <!-- Construct the 'in-context' values -->
+ <xsl:variable name="linenumbering.everyNth">
+ <xsl:choose>
+ <xsl:when test="$pi.linenumbering.everyNth != ''">
+ <xsl:value-of select="$pi.linenumbering.everyNth"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$global.linenumbering.everyNth"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="linenumbering.separator">
+ <xsl:choose>
+ <xsl:when test="$pi.linenumbering.separator != ''">
+ <xsl:value-of select="$pi.linenumbering.separator"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$global.linenumbering.separator"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="linenumbering.width">
+ <xsl:choose>
+ <xsl:when test="$pi.linenumbering.width != ''">
+ <xsl:value-of select="$pi.linenumbering.width"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$global.linenumbering.width"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="linenumbering.startinglinenumber">
+ <xsl:choose>
+ <xsl:when test="$pi.context/@startinglinenumber">
+ <xsl:value-of select="$pi.context/@startinglinenumber"/>
+ </xsl:when>
+ <xsl:when test="$pi.context/@continuation='continues'">
+ <xsl:variable name="lastLine">
+ <xsl:choose>
+ <xsl:when test="$pi.context/self::programlisting">
+ <xsl:call-template name="lastLineNumber">
+ <xsl:with-param name="listings" select="preceding::programlisting[@linenumbering='numbered']"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="$pi.context/self::screen">
+ <xsl:call-template name="lastLineNumber">
+ <xsl:with-param name="listings" select="preceding::screen[@linenumbering='numbered']"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="$pi.context/self::literallayout">
+ <xsl:call-template name="lastLineNumber">
+ <xsl:with-param name="listings" select="preceding::literallayout[@linenumbering='numbered']"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="$pi.context/self::address">
+ <xsl:call-template name="lastLineNumber">
+ <xsl:with-param name="listings" select="preceding::address[@linenumbering='numbered']"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="$pi.context/self::synopsis">
+ <xsl:call-template name="lastLineNumber">
+ <xsl:with-param name="listings" select="preceding::synopsis[@linenumbering='numbered']"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:message>
+ <xsl:text>Unexpected verbatim environment: </xsl:text>
+ <xsl:value-of select="local-name($pi.context)"/>
+ </xsl:message>
+ <xsl:value-of select="0"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:value-of select="$lastLine + 1"/>
+ </xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="function-available('sverb:numberLines')">
+ <xsl:copy-of select="sverb:numberLines($rtf)"/>
+ </xsl:when>
+ <xsl:when test="function-available('xverb:numberLines')">
+ <xsl:copy-of select="xverb:numberLines($rtf)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:message terminate="yes">
+ <xsl:text>No numberLines function available.</xsl:text>
+ </xsl:message>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="make-verbatim">
+ <xsl:param name="rtf"/>
+
+ <!-- I want to make this RTF verbatim. There are two possibilities: either
+ I have access to the exsl:node-set extension function and I can "do it right"
+ or I have to rely on CSS. -->
+
+ <xsl:choose>
+ <xsl:when test="$exsl.node.set.available != 0">
+ <xsl:apply-templates select="exsl:node-set($rtf)" mode="make.verbatim.mode"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <span style="white-space: pre;">
+ <xsl:copy-of select="$rtf"/>
+ </span>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ======================================================================== -->
+
+<xsl:template name="lastLineNumber">
+ <xsl:param name="listings"/>
+ <xsl:param name="number" select="0"/>
+
+ <xsl:variable name="lines">
+ <xsl:call-template name="countLines">
+ <xsl:with-param name="listing" select="string($listings[1])"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="not($listings)">
+ <xsl:value-of select="$number"/>
+ </xsl:when>
+ <xsl:when test="$listings[1]/@startinglinenumber">
+ <xsl:value-of select="$number + $listings[1]/@startinglinenumber + $lines - 1"/>
+ </xsl:when>
+ <xsl:when test="$listings[1]/@continuation='continues'">
+ <xsl:call-template name="lastLineNumber">
+ <xsl:with-param name="listings" select="listings[position() &gt; 1]"/>
+ <xsl:with-param name="number" select="$number + $lines"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$lines"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="countLines">
+ <xsl:param name="listing"/>
+ <xsl:param name="count" select="1"/>
+
+ <xsl:choose>
+ <xsl:when test="contains($listing, '&#10;')">
+ <xsl:call-template name="countLines">
+ <xsl:with-param name="listing" select="substring-after($listing, '&#10;')"/>
+ <xsl:with-param name="count" select="$count + 1"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$count"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/xref.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/xref.xsl
new file mode 100644
index 0000000..74c6f20
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml-1_1/xref.xsl
@@ -0,0 +1,1316 @@
+<?xml version="1.0" encoding="ASCII"?>
+<!--This file was created automatically by html2xhtml-->
+<!--from the HTML stylesheets.-->
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:suwl="http://nwalsh.com/xslt/ext/com.nwalsh.saxon.UnwrapLinks" xmlns:exsl="http://exslt.org/common" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/1999/xhtml" exclude-result-prefixes="suwl exsl xlink" version="1.0">
+
+<!-- ********************************************************************
+ $Id: xref.xsl 8421 2009-05-04 07:49:49Z bobstayton $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<!-- Use internal variable for olink xlink role for consistency -->
+<xsl:variable name="xolink.role">http://docbook.org/xlink/role/olink</xsl:variable>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="anchor">
+ <xsl:call-template name="anchor"/>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="xref" name="xref">
+ <xsl:param name="xhref" select="@xlink:href"/>
+ <!-- is the @xlink:href a local idref link? -->
+ <xsl:param name="xlink.idref">
+ <xsl:if test="starts-with($xhref,'#') and (not(contains($xhref,'(')) or starts-with($xhref, '#xpointer(id('))">
+ <xsl:call-template name="xpointer.idref">
+ <xsl:with-param name="xpointer" select="$xhref"/>
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:param>
+ <xsl:param name="xlink.targets" select="key('id',$xlink.idref)"/>
+ <xsl:param name="linkend.targets" select="key('id',@linkend)"/>
+ <xsl:param name="target" select="($xlink.targets | $linkend.targets)[1]"/>
+
+ <xsl:variable name="xrefstyle">
+ <xsl:choose>
+ <xsl:when test="@role and not(@xrefstyle) and $use.role.as.xrefstyle != 0">
+ <xsl:value-of select="@role"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="@xrefstyle"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:call-template name="anchor"/>
+
+ <xsl:variable name="content">
+ <xsl:choose>
+
+ <xsl:when test="@endterm">
+ <xsl:variable name="etargets" select="key('id',@endterm)"/>
+ <xsl:variable name="etarget" select="$etargets[1]"/>
+ <xsl:choose>
+ <xsl:when test="count($etarget) = 0">
+ <xsl:message>
+ <xsl:value-of select="count($etargets)"/>
+ <xsl:text>Endterm points to nonexistent ID: </xsl:text>
+ <xsl:value-of select="@endterm"/>
+ </xsl:message>
+ <xsl:text>???</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="$etarget" mode="endterm"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+
+ <xsl:when test="$target/@xreflabel">
+ <xsl:call-template name="xref.xreflabel">
+ <xsl:with-param name="target" select="$target"/>
+ </xsl:call-template>
+ </xsl:when>
+
+ <xsl:when test="$target">
+ <xsl:if test="not(parent::citation)">
+ <xsl:apply-templates select="$target" mode="xref-to-prefix"/>
+ </xsl:if>
+
+ <xsl:apply-templates select="$target" mode="xref-to">
+ <xsl:with-param name="referrer" select="."/>
+ <xsl:with-param name="xrefstyle" select="$xrefstyle"/>
+ </xsl:apply-templates>
+
+ <xsl:if test="not(parent::citation)">
+ <xsl:apply-templates select="$target" mode="xref-to-suffix"/>
+ </xsl:if>
+ </xsl:when>
+
+ <xsl:otherwise>
+ <xsl:message>
+ <xsl:text>ERROR: xref linking to </xsl:text>
+ <xsl:value-of select="@linkend|@xlink:href"/>
+ <xsl:text> has no generated link text.</xsl:text>
+ </xsl:message>
+ <xsl:text>???</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:call-template name="simple.xlink">
+ <xsl:with-param name="content" select="$content"/>
+ </xsl:call-template>
+
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<!-- biblioref handled largely like an xref -->
+<!-- To be done: add support for begin, end, and units attributes -->
+<xsl:template match="biblioref">
+ <xsl:variable name="targets" select="key('id',@linkend)"/>
+ <xsl:variable name="target" select="$targets[1]"/>
+ <xsl:variable name="refelem" select="local-name($target)"/>
+
+ <xsl:call-template name="check.id.unique">
+ <xsl:with-param name="linkend" select="@linkend"/>
+ </xsl:call-template>
+
+ <xsl:call-template name="anchor"/>
+
+ <xsl:choose>
+ <xsl:when test="count($target) = 0">
+ <xsl:message>
+ <xsl:text>XRef to nonexistent id: </xsl:text>
+ <xsl:value-of select="@linkend"/>
+ </xsl:message>
+ <xsl:text>???</xsl:text>
+ </xsl:when>
+
+ <xsl:when test="@endterm">
+ <xsl:variable name="href">
+ <xsl:call-template name="href.target">
+ <xsl:with-param name="object" select="$target"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="etargets" select="key('id',@endterm)"/>
+ <xsl:variable name="etarget" select="$etargets[1]"/>
+ <xsl:choose>
+ <xsl:when test="count($etarget) = 0">
+ <xsl:message>
+ <xsl:value-of select="count($etargets)"/>
+ <xsl:text>Endterm points to nonexistent ID: </xsl:text>
+ <xsl:value-of select="@endterm"/>
+ </xsl:message>
+ <a href="{$href}">
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:text>???</xsl:text>
+ </a>
+ </xsl:when>
+ <xsl:otherwise>
+ <a href="{$href}">
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates select="$etarget" mode="endterm"/>
+ </a>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+
+ <xsl:when test="$target/@xreflabel">
+ <a>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:attribute name="href">
+ <xsl:call-template name="href.target">
+ <xsl:with-param name="object" select="$target"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:call-template name="xref.xreflabel">
+ <xsl:with-param name="target" select="$target"/>
+ </xsl:call-template>
+ </a>
+ </xsl:when>
+
+ <xsl:otherwise>
+ <xsl:variable name="href">
+ <xsl:call-template name="href.target">
+ <xsl:with-param name="object" select="$target"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:if test="not(parent::citation)">
+ <xsl:apply-templates select="$target" mode="xref-to-prefix"/>
+ </xsl:if>
+
+ <a href="{$href}">
+ <xsl:apply-templates select="." mode="class.attribute"/>
+ <xsl:if test="$target/title or $target/*/title">
+ <xsl:attribute name="title">
+ <xsl:apply-templates select="$target" mode="xref-title"/>
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:apply-templates select="$target" mode="xref-to">
+ <xsl:with-param name="referrer" select="."/>
+ <xsl:with-param name="xrefstyle">
+ <xsl:choose>
+ <xsl:when test="@role and not(@xrefstyle) and $use.role.as.xrefstyle != 0">
+ <xsl:value-of select="@role"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="@xrefstyle"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:with-param>
+ </xsl:apply-templates>
+ </a>
+
+ <xsl:if test="not(parent::citation)">
+ <xsl:apply-templates select="$target" mode="xref-to-suffix"/>
+ </xsl:if>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="*" mode="endterm">
+ <!-- Process the children of the endterm element -->
+ <xsl:variable name="endterm">
+ <xsl:apply-templates select="child::node()"/>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="$exsl.node.set.available != 0">
+ <xsl:apply-templates select="exsl:node-set($endterm)" mode="remove-ids"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:copy-of select="$endterm"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="*" mode="remove-ids">
+ <xsl:choose>
+ <!-- handle html or xhtml -->
+ <xsl:when test="local-name(.) = 'a' and (namespace-uri(.) = '' or namespace-uri(.) = 'http://www.w3.org/1999/xhtml')">
+ <xsl:choose>
+ <xsl:when test="(@name and count(@*) = 1) or (@id and count(@*) = 1) or (@xml:id and count(@*) = 1) or (@xml:id and @name and count(@*) = 2) or (@id and @name and count(@*) = 2)">
+ <xsl:message>suppress anchor</xsl:message>
+ <!-- suppress the whole thing -->
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:copy>
+ <xsl:for-each select="@*">
+ <xsl:choose>
+ <xsl:when test="local-name(.) != 'name' and local-name(.) != 'id'">
+ <xsl:copy/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:message>removing <xsl:value-of select="local-name(.)"/></xsl:message>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:for-each>
+ </xsl:copy>
+ <xsl:apply-templates mode="remove-ids"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:copy>
+ <xsl:for-each select="@*">
+ <xsl:choose>
+ <xsl:when test="local-name(.) != 'id'">
+ <xsl:copy/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:message>removing <xsl:value-of select="local-name(.)"/></xsl:message>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:for-each>
+ <xsl:apply-templates mode="remove-ids"/>
+ </xsl:copy>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="*" mode="xref-to-prefix"/>
+<xsl:template match="*" mode="xref-to-suffix"/>
+
+<xsl:template match="*" mode="xref-to">
+ <xsl:param name="referrer"/>
+ <xsl:param name="xrefstyle"/>
+ <xsl:param name="verbose" select="1"/>
+
+ <xsl:if test="$verbose">
+ <xsl:message>
+ <xsl:text>Don't know what gentext to create for xref to: "</xsl:text>
+ <xsl:value-of select="name(.)"/>
+ <xsl:text>", ("</xsl:text>
+ <xsl:value-of select="(@id|@xml:id)[1]"/>
+ <xsl:text>")</xsl:text>
+ </xsl:message>
+ </xsl:if>
+ <xsl:text>???</xsl:text>
+</xsl:template>
+
+<xsl:template match="title" mode="xref-to">
+ <xsl:param name="referrer"/>
+ <xsl:param name="xrefstyle"/>
+ <xsl:param name="verbose" select="1"/>
+
+ <!-- if you xref to a title, xref to the parent... -->
+ <xsl:choose>
+ <!-- FIXME: how reliable is this? -->
+ <xsl:when test="contains(local-name(parent::*), 'info')">
+ <xsl:apply-templates select="parent::*[2]" mode="xref-to">
+ <xsl:with-param name="referrer" select="$referrer"/>
+ <xsl:with-param name="xrefstyle" select="$xrefstyle"/>
+ <xsl:with-param name="verbose" select="$verbose"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="parent::*" mode="xref-to">
+ <xsl:with-param name="referrer" select="$referrer"/>
+ <xsl:with-param name="xrefstyle" select="$xrefstyle"/>
+ <xsl:with-param name="verbose" select="$verbose"/>
+ </xsl:apply-templates>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="abstract|authorblurb|personblurb|bibliodiv|bibliomset |biblioset|blockquote|calloutlist|caution|colophon |constraintdef|formalpara|glossdiv|important|indexdiv |itemizedlist|legalnotice|lot|msg|msgexplan|msgmain |msgrel|msgset|msgsub|note|orderedlist|partintro |productionset|qandadiv|refsynopsisdiv|segmentedlist |set|setindex|sidebar|tip|toc|variablelist|warning" mode="xref-to">
+ <xsl:param name="referrer"/>
+ <xsl:param name="xrefstyle"/>
+ <xsl:param name="verbose" select="1"/>
+
+ <!-- catch-all for things with (possibly optional) titles -->
+ <xsl:apply-templates select="." mode="object.xref.markup">
+ <xsl:with-param name="purpose" select="'xref'"/>
+ <xsl:with-param name="xrefstyle" select="$xrefstyle"/>
+ <xsl:with-param name="referrer" select="$referrer"/>
+ <xsl:with-param name="verbose" select="$verbose"/>
+ </xsl:apply-templates>
+</xsl:template>
+
+<xsl:template match="author|editor|othercredit|personname" mode="xref-to">
+ <xsl:param name="referrer"/>
+ <xsl:param name="xrefstyle"/>
+
+ <xsl:call-template name="person.name"/>
+</xsl:template>
+
+<xsl:template match="authorgroup" mode="xref-to">
+ <xsl:param name="referrer"/>
+ <xsl:param name="xrefstyle"/>
+
+ <xsl:call-template name="person.name.list"/>
+</xsl:template>
+
+<xsl:template match="figure|example|table|equation" mode="xref-to">
+ <xsl:param name="referrer"/>
+ <xsl:param name="xrefstyle"/>
+ <xsl:param name="verbose" select="1"/>
+
+ <xsl:apply-templates select="." mode="object.xref.markup">
+ <xsl:with-param name="purpose" select="'xref'"/>
+ <xsl:with-param name="xrefstyle" select="$xrefstyle"/>
+ <xsl:with-param name="referrer" select="$referrer"/>
+ <xsl:with-param name="verbose" select="$verbose"/>
+ </xsl:apply-templates>
+</xsl:template>
+
+<xsl:template match="procedure" mode="xref-to">
+ <xsl:param name="referrer"/>
+ <xsl:param name="xrefstyle"/>
+ <xsl:param name="verbose"/>
+
+ <xsl:apply-templates select="." mode="object.xref.markup">
+ <xsl:with-param name="purpose" select="'xref'"/>
+ <xsl:with-param name="xrefstyle" select="$xrefstyle"/>
+ <xsl:with-param name="referrer" select="$referrer"/>
+ <xsl:with-param name="verbose" select="$verbose"/>
+ </xsl:apply-templates>
+</xsl:template>
+
+<xsl:template match="task" mode="xref-to">
+ <xsl:param name="referrer"/>
+ <xsl:param name="xrefstyle"/>
+ <xsl:param name="verbose"/>
+
+ <xsl:apply-templates select="." mode="object.xref.markup">
+ <xsl:with-param name="purpose" select="'xref'"/>
+ <xsl:with-param name="xrefstyle" select="$xrefstyle"/>
+ <xsl:with-param name="referrer" select="$referrer"/>
+ <xsl:with-param name="verbose" select="$verbose"/>
+ </xsl:apply-templates>
+</xsl:template>
+
+<xsl:template match="cmdsynopsis" mode="xref-to">
+ <xsl:apply-templates select="(.//command)[1]" mode="xref"/>
+</xsl:template>
+
+<xsl:template match="funcsynopsis" mode="xref-to">
+ <xsl:apply-templates select="(.//function)[1]" mode="xref"/>
+</xsl:template>
+
+<xsl:template match="dedication|acknowledgements|preface|chapter|appendix|article" mode="xref-to">
+ <xsl:param name="referrer"/>
+ <xsl:param name="xrefstyle"/>
+ <xsl:param name="verbose" select="1"/>
+
+ <xsl:apply-templates select="." mode="object.xref.markup">
+ <xsl:with-param name="purpose" select="'xref'"/>
+ <xsl:with-param name="xrefstyle" select="$xrefstyle"/>
+ <xsl:with-param name="referrer" select="$referrer"/>
+ <xsl:with-param name="verbose" select="$verbose"/>
+ </xsl:apply-templates>
+</xsl:template>
+
+<xsl:template match="bibliography" mode="xref-to">
+ <xsl:param name="referrer"/>
+ <xsl:param name="xrefstyle"/>
+ <xsl:param name="verbose" select="1"/>
+
+ <xsl:apply-templates select="." mode="object.xref.markup">
+ <xsl:with-param name="purpose" select="'xref'"/>
+ <xsl:with-param name="xrefstyle" select="$xrefstyle"/>
+ <xsl:with-param name="referrer" select="$referrer"/>
+ <xsl:with-param name="verbose" select="$verbose"/>
+ </xsl:apply-templates>
+</xsl:template>
+
+<xsl:template match="biblioentry|bibliomixed" mode="xref-to-prefix">
+ <xsl:text>[</xsl:text>
+</xsl:template>
+
+<xsl:template match="biblioentry|bibliomixed" mode="xref-to-suffix">
+ <xsl:text>]</xsl:text>
+</xsl:template>
+
+<xsl:template match="biblioentry|bibliomixed" mode="xref-to">
+ <xsl:param name="referrer"/>
+ <xsl:param name="xrefstyle"/>
+ <xsl:param name="verbose" select="1"/>
+
+ <!-- handles both biblioentry and bibliomixed -->
+ <xsl:choose>
+ <xsl:when test="string(.) = ''">
+ <xsl:variable name="bib" select="document($bibliography.collection,.)"/>
+ <xsl:variable name="id" select="(@id|@xml:id)[1]"/>
+ <xsl:variable name="entry" select="$bib/bibliography/ *[@id=$id or @xml:id=$id][1]"/>
+ <xsl:choose>
+ <xsl:when test="$entry">
+ <xsl:choose>
+ <xsl:when test="$bibliography.numbered != 0">
+ <xsl:number from="bibliography" count="biblioentry|bibliomixed" level="any" format="1"/>
+ </xsl:when>
+ <xsl:when test="local-name($entry/*[1]) = 'abbrev'">
+ <xsl:apply-templates select="$entry/*[1]"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="(@id|@xml:id)[1]"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:message>
+ <xsl:text>No bibliography entry: </xsl:text>
+ <xsl:value-of select="$id"/>
+ <xsl:text> found in </xsl:text>
+ <xsl:value-of select="$bibliography.collection"/>
+ </xsl:message>
+ <xsl:value-of select="(@id|@xml:id)[1]"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:choose>
+ <xsl:when test="$bibliography.numbered != 0">
+ <xsl:number from="bibliography" count="biblioentry|bibliomixed" level="any" format="1"/>
+ </xsl:when>
+ <xsl:when test="local-name(*[1]) = 'abbrev'">
+ <xsl:apply-templates select="*[1]"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="(@id|@xml:id)[1]"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="glossary" mode="xref-to">
+ <xsl:param name="referrer"/>
+ <xsl:param name="xrefstyle"/>
+ <xsl:param name="verbose" select="1"/>
+
+ <xsl:apply-templates select="." mode="object.xref.markup">
+ <xsl:with-param name="purpose" select="'xref'"/>
+ <xsl:with-param name="xrefstyle" select="$xrefstyle"/>
+ <xsl:with-param name="referrer" select="$referrer"/>
+ <xsl:with-param name="verbose" select="$verbose"/>
+ </xsl:apply-templates>
+</xsl:template>
+
+<xsl:template match="glossentry" mode="xref-to">
+ <xsl:param name="referrer"/>
+ <xsl:param name="xrefstyle"/>
+ <xsl:param name="verbose" select="1"/>
+ <xsl:choose>
+ <xsl:when test="$glossentry.show.acronym = 'primary'">
+ <xsl:choose>
+ <xsl:when test="acronym|abbrev">
+ <xsl:apply-templates select="(acronym|abbrev)[1]"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="glossterm[1]" mode="xref-to">
+ <xsl:with-param name="xrefstyle" select="$xrefstyle"/>
+ <xsl:with-param name="referrer" select="$referrer"/>
+ <xsl:with-param name="verbose" select="$verbose"/>
+ </xsl:apply-templates>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="glossterm[1]" mode="xref-to">
+ <xsl:with-param name="xrefstyle" select="$xrefstyle"/>
+ <xsl:with-param name="referrer" select="$referrer"/>
+ <xsl:with-param name="verbose" select="$verbose"/>
+ </xsl:apply-templates>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="glossterm|firstterm" mode="xref-to">
+ <xsl:apply-templates/>
+</xsl:template>
+
+<xsl:template match="index" mode="xref-to">
+ <xsl:param name="referrer"/>
+ <xsl:param name="xrefstyle"/>
+ <xsl:param name="verbose" select="1"/>
+
+ <xsl:apply-templates select="." mode="object.xref.markup">
+ <xsl:with-param name="purpose" select="'xref'"/>
+ <xsl:with-param name="xrefstyle" select="$xrefstyle"/>
+ <xsl:with-param name="referrer" select="$referrer"/>
+ <xsl:with-param name="verbose" select="$verbose"/>
+ </xsl:apply-templates>
+</xsl:template>
+
+<xsl:template match="listitem" mode="xref-to">
+ <xsl:param name="referrer"/>
+ <xsl:param name="xrefstyle"/>
+ <xsl:param name="verbose"/>
+
+ <xsl:apply-templates select="." mode="object.xref.markup">
+ <xsl:with-param name="purpose" select="'xref'"/>
+ <xsl:with-param name="xrefstyle" select="$xrefstyle"/>
+ <xsl:with-param name="referrer" select="$referrer"/>
+ <xsl:with-param name="verbose" select="$verbose"/>
+ </xsl:apply-templates>
+</xsl:template>
+
+<xsl:template match="section|simplesect |sect1|sect2|sect3|sect4|sect5 |refsect1|refsect2|refsect3|refsection" mode="xref-to">
+ <xsl:param name="referrer"/>
+ <xsl:param name="xrefstyle"/>
+ <xsl:param name="verbose" select="1"/>
+
+ <xsl:apply-templates select="." mode="object.xref.markup">
+ <xsl:with-param name="purpose" select="'xref'"/>
+ <xsl:with-param name="xrefstyle" select="$xrefstyle"/>
+ <xsl:with-param name="referrer" select="$referrer"/>
+ <xsl:with-param name="verbose" select="$verbose"/>
+ </xsl:apply-templates>
+ <!-- FIXME: What about "in Chapter X"? -->
+</xsl:template>
+
+<xsl:template match="bridgehead" mode="xref-to">
+ <xsl:param name="referrer"/>
+ <xsl:param name="xrefstyle"/>
+ <xsl:param name="verbose" select="1"/>
+
+ <xsl:apply-templates select="." mode="object.xref.markup">
+ <xsl:with-param name="purpose" select="'xref'"/>
+ <xsl:with-param name="xrefstyle" select="$xrefstyle"/>
+ <xsl:with-param name="referrer" select="$referrer"/>
+ <xsl:with-param name="verbose" select="$verbose"/>
+ </xsl:apply-templates>
+ <!-- FIXME: What about "in Chapter X"? -->
+</xsl:template>
+
+<xsl:template match="qandaset" mode="xref-to">
+ <xsl:param name="referrer"/>
+ <xsl:param name="xrefstyle"/>
+ <xsl:param name="verbose" select="1"/>
+
+ <xsl:apply-templates select="." mode="object.xref.markup">
+ <xsl:with-param name="purpose" select="'xref'"/>
+ <xsl:with-param name="xrefstyle" select="$xrefstyle"/>
+ <xsl:with-param name="referrer" select="$referrer"/>
+ <xsl:with-param name="verbose" select="$verbose"/>
+ </xsl:apply-templates>
+</xsl:template>
+
+<xsl:template match="qandadiv" mode="xref-to">
+ <xsl:param name="referrer"/>
+ <xsl:param name="xrefstyle"/>
+ <xsl:param name="verbose" select="1"/>
+
+ <xsl:apply-templates select="." mode="object.xref.markup">
+ <xsl:with-param name="purpose" select="'xref'"/>
+ <xsl:with-param name="xrefstyle" select="$xrefstyle"/>
+ <xsl:with-param name="referrer" select="$referrer"/>
+ <xsl:with-param name="verbose" select="$verbose"/>
+ </xsl:apply-templates>
+</xsl:template>
+
+<xsl:template match="qandaentry" mode="xref-to">
+ <xsl:param name="referrer"/>
+ <xsl:param name="xrefstyle"/>
+ <xsl:param name="verbose" select="1"/>
+
+ <xsl:apply-templates select="question[1]" mode="xref-to">
+ <xsl:with-param name="xrefstyle" select="$xrefstyle"/>
+ <xsl:with-param name="referrer" select="$referrer"/>
+ <xsl:with-param name="verbose" select="$verbose"/>
+ </xsl:apply-templates>
+</xsl:template>
+
+<xsl:template match="question|answer" mode="xref-to">
+ <xsl:param name="referrer"/>
+ <xsl:param name="xrefstyle"/>
+ <xsl:param name="verbose" select="1"/>
+
+ <xsl:choose>
+ <xsl:when test="string-length(label) != 0">
+ <xsl:apply-templates select="." mode="label.markup"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="." mode="object.xref.markup">
+ <xsl:with-param name="purpose" select="'xref'"/>
+ <xsl:with-param name="xrefstyle" select="$xrefstyle"/>
+ <xsl:with-param name="referrer" select="$referrer"/>
+ <xsl:with-param name="verbose" select="$verbose"/>
+ </xsl:apply-templates>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="part|reference" mode="xref-to">
+ <xsl:param name="referrer"/>
+ <xsl:param name="xrefstyle"/>
+ <xsl:param name="verbose" select="1"/>
+
+ <xsl:apply-templates select="." mode="object.xref.markup">
+ <xsl:with-param name="purpose" select="'xref'"/>
+ <xsl:with-param name="xrefstyle" select="$xrefstyle"/>
+ <xsl:with-param name="referrer" select="$referrer"/>
+ <xsl:with-param name="verbose" select="$verbose"/>
+ </xsl:apply-templates>
+</xsl:template>
+
+<xsl:template match="refentry" mode="xref-to">
+ <xsl:param name="referrer"/>
+ <xsl:param name="xrefstyle"/>
+
+ <xsl:choose>
+ <xsl:when test="refmeta/refentrytitle">
+ <xsl:apply-templates select="refmeta/refentrytitle"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="refnamediv/refname[1]"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:apply-templates select="refmeta/manvolnum"/>
+</xsl:template>
+
+<xsl:template match="refnamediv" mode="xref-to">
+ <xsl:param name="referrer"/>
+ <xsl:param name="xrefstyle"/>
+ <xsl:param name="verbose" select="1"/>
+
+ <xsl:apply-templates select="refname[1]" mode="xref-to">
+ <xsl:with-param name="xrefstyle" select="$xrefstyle"/>
+ <xsl:with-param name="referrer" select="$referrer"/>
+ <xsl:with-param name="verbose" select="$verbose"/>
+ </xsl:apply-templates>
+</xsl:template>
+
+<xsl:template match="refname" mode="xref-to">
+ <xsl:param name="referrer"/>
+ <xsl:param name="xrefstyle"/>
+ <xsl:param name="verbose" select="1"/>
+
+ <xsl:apply-templates mode="xref-to"/>
+</xsl:template>
+
+<xsl:template match="step" mode="xref-to">
+ <xsl:param name="referrer"/>
+ <xsl:param name="xrefstyle"/>
+
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'Step'"/>
+ </xsl:call-template>
+ <xsl:text> </xsl:text>
+ <xsl:apply-templates select="." mode="number"/>
+</xsl:template>
+
+<xsl:template match="varlistentry" mode="xref-to">
+ <xsl:param name="referrer"/>
+ <xsl:param name="xrefstyle"/>
+ <xsl:param name="verbose" select="1"/>
+
+ <xsl:apply-templates select="term[1]" mode="xref-to">
+ <xsl:with-param name="xrefstyle" select="$xrefstyle"/>
+ <xsl:with-param name="referrer" select="$referrer"/>
+ <xsl:with-param name="verbose" select="$verbose"/>
+ </xsl:apply-templates>
+</xsl:template>
+
+<xsl:template match="primary|secondary|tertiary" mode="xref-to">
+ <xsl:value-of select="."/>
+</xsl:template>
+
+<xsl:template match="indexterm" mode="xref-to">
+ <xsl:value-of select="primary"/>
+</xsl:template>
+
+<xsl:template match="varlistentry/term" mode="xref-to">
+ <xsl:param name="referrer"/>
+ <xsl:param name="xrefstyle"/>
+
+ <!-- to avoid the comma that will be generated if there are several terms -->
+ <xsl:apply-templates/>
+</xsl:template>
+
+<xsl:template match="co" mode="xref-to">
+ <xsl:param name="referrer"/>
+ <xsl:param name="xrefstyle"/>
+
+ <xsl:apply-templates select="." mode="callout-bug"/>
+</xsl:template>
+
+<xsl:template match="area|areaset" mode="xref-to">
+ <xsl:param name="referrer"/>
+ <xsl:param name="xrefstyle"/>
+
+ <xsl:call-template name="callout-bug">
+ <xsl:with-param name="conum">
+ <xsl:apply-templates select="." mode="conumber"/>
+ </xsl:with-param>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="book" mode="xref-to">
+ <xsl:param name="referrer"/>
+ <xsl:param name="xrefstyle"/>
+ <xsl:param name="verbose" select="1"/>
+
+ <xsl:apply-templates select="." mode="object.xref.markup">
+ <xsl:with-param name="purpose" select="'xref'"/>
+ <xsl:with-param name="xrefstyle" select="$xrefstyle"/>
+ <xsl:with-param name="referrer" select="$referrer"/>
+ <xsl:with-param name="verbose" select="$verbose"/>
+ </xsl:apply-templates>
+</xsl:template>
+
+<!-- These are elements for which no link text exists, so an xref to one
+ uses the xrefstyle attribute if specified, or if not it falls back
+ to the container element's link text -->
+<xsl:template match="para|phrase|simpara|anchor|quote" mode="xref-to">
+ <xsl:param name="referrer"/>
+ <xsl:param name="xrefstyle"/>
+ <xsl:param name="verbose" select="1"/>
+
+ <xsl:variable name="context" select="(ancestor::simplesect |ancestor::section |ancestor::sect1 |ancestor::sect2 |ancestor::sect3 |ancestor::sect4 |ancestor::sect5 |ancestor::refsection |ancestor::refsect1 |ancestor::refsect2 |ancestor::refsect3 |ancestor::chapter |ancestor::appendix |ancestor::preface |ancestor::partintro |ancestor::dedication |ancestor::acknowledgements |ancestor::colophon |ancestor::bibliography |ancestor::index |ancestor::glossary |ancestor::glossentry |ancestor::listitem |ancestor::varlistentry)[last()]"/>
+
+ <xsl:choose>
+ <xsl:when test="$xrefstyle != ''">
+ <xsl:apply-templates select="." mode="object.xref.markup">
+ <xsl:with-param name="xrefstyle" select="$xrefstyle"/>
+ <xsl:with-param name="referrer" select="$referrer"/>
+ <xsl:with-param name="verbose" select="$verbose"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="$context" mode="xref-to">
+ <xsl:with-param name="purpose" select="'xref'"/>
+ <xsl:with-param name="xrefstyle" select="$xrefstyle"/>
+ <xsl:with-param name="referrer" select="$referrer"/>
+ <xsl:with-param name="verbose" select="$verbose"/>
+ </xsl:apply-templates>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="*" mode="xref-title">
+ <xsl:variable name="title">
+ <xsl:apply-templates select="." mode="object.title.markup"/>
+ </xsl:variable>
+
+ <xsl:value-of select="$title"/>
+</xsl:template>
+
+<xsl:template match="author" mode="xref-title">
+ <xsl:variable name="title">
+ <xsl:call-template name="person.name"/>
+ </xsl:variable>
+
+ <xsl:value-of select="$title"/>
+</xsl:template>
+
+<xsl:template match="authorgroup" mode="xref-title">
+ <xsl:variable name="title">
+ <xsl:call-template name="person.name.list"/>
+ </xsl:variable>
+
+ <xsl:value-of select="$title"/>
+</xsl:template>
+
+<xsl:template match="cmdsynopsis" mode="xref-title">
+ <xsl:variable name="title">
+ <xsl:apply-templates select="(.//command)[1]" mode="xref"/>
+ </xsl:variable>
+
+ <xsl:value-of select="$title"/>
+</xsl:template>
+
+<xsl:template match="funcsynopsis" mode="xref-title">
+ <xsl:variable name="title">
+ <xsl:apply-templates select="(.//function)[1]" mode="xref"/>
+ </xsl:variable>
+
+ <xsl:value-of select="$title"/>
+</xsl:template>
+
+<xsl:template match="biblioentry|bibliomixed" mode="xref-title">
+ <!-- handles both biblioentry and bibliomixed -->
+ <xsl:variable name="title">
+ <xsl:text>[</xsl:text>
+ <xsl:choose>
+ <xsl:when test="local-name(*[1]) = 'abbrev'">
+ <xsl:apply-templates select="*[1]"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="(@id|@xml:id)[1]"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:text>]</xsl:text>
+ </xsl:variable>
+
+ <xsl:value-of select="$title"/>
+</xsl:template>
+
+<xsl:template match="step" mode="xref-title">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'Step'"/>
+ </xsl:call-template>
+ <xsl:text> </xsl:text>
+ <xsl:apply-templates select="." mode="number"/>
+</xsl:template>
+
+<xsl:template match="step[not(./title)]" mode="title.markup">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'Step'"/>
+ </xsl:call-template>
+ <xsl:text> </xsl:text>
+ <xsl:apply-templates select="." mode="number"/>
+</xsl:template>
+
+<xsl:template match="co" mode="xref-title">
+ <xsl:variable name="title">
+ <xsl:apply-templates select="." mode="callout-bug"/>
+ </xsl:variable>
+
+ <xsl:value-of select="$title"/>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="link" name="link">
+ <xsl:param name="linkend" select="@linkend"/>
+ <xsl:param name="a.target"/>
+ <xsl:param name="xhref" select="@xlink:href"/>
+
+ <xsl:variable name="content">
+ <xsl:call-template name="anchor"/>
+ <xsl:choose>
+ <xsl:when test="count(child::node()) &gt; 0">
+ <!-- If it has content, use it -->
+ <xsl:apply-templates/>
+ </xsl:when>
+ <!-- else look for an endterm -->
+ <xsl:when test="@endterm">
+ <xsl:variable name="etargets" select="key('id',@endterm)"/>
+ <xsl:variable name="etarget" select="$etargets[1]"/>
+ <xsl:choose>
+ <xsl:when test="count($etarget) = 0">
+ <xsl:message>
+ <xsl:value-of select="count($etargets)"/>
+ <xsl:text>Endterm points to nonexistent ID: </xsl:text>
+ <xsl:value-of select="@endterm"/>
+ </xsl:message>
+ <xsl:text>???</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="$etarget" mode="endterm"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <!-- Use the xlink:href if no other text -->
+ <xsl:when test="@xlink:href">
+ <xsl:value-of select="@xlink:href"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:message>
+ <xsl:text>Link element has no content and no Endterm. </xsl:text>
+ <xsl:text>Nothing to show in the link to </xsl:text>
+ <xsl:value-of select="(@xlink:href|@linkend)[1]"/>
+ </xsl:message>
+ <xsl:text>???</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:call-template name="simple.xlink">
+ <xsl:with-param name="node" select="."/>
+ <xsl:with-param name="linkend" select="$linkend"/>
+ <xsl:with-param name="content" select="$content"/>
+ <xsl:with-param name="a.target" select="$a.target"/>
+ <xsl:with-param name="xhref" select="$xhref"/>
+ </xsl:call-template>
+
+</xsl:template>
+
+<xsl:template match="ulink" name="ulink">
+ <xsl:param name="url" select="@url"/>
+ <xsl:variable name="link">
+ <a>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:if test="@id or @xml:id">
+ <xsl:attribute name="id">
+ <xsl:value-of select="(@id|@xml:id)[1]"/>
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:attribute name="href"><xsl:value-of select="$url"/></xsl:attribute>
+ <xsl:if test="$ulink.target != ''">
+ <xsl:attribute name="target">
+ <xsl:value-of select="$ulink.target"/>
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:choose>
+ <xsl:when test="count(child::node())=0">
+ <xsl:value-of select="$url"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </a>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="function-available('suwl:unwrapLinks')">
+ <xsl:copy-of select="suwl:unwrapLinks($link)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:copy-of select="$link"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="olink" name="olink">
+ <!-- olink content may be passed in from xlink olink -->
+ <xsl:param name="content" select="NOTANELEMENT"/>
+
+ <xsl:call-template name="anchor"/>
+
+ <xsl:variable name="localinfo" select="@localinfo"/>
+
+ <xsl:choose>
+ <!-- olinks resolved by stylesheet and target database -->
+ <xsl:when test="@targetdoc or @targetptr or (@xlink:role=$xolink.role and contains(@xlink:href, '#') )">
+
+ <xsl:variable name="targetdoc.att">
+ <xsl:choose>
+ <xsl:when test="@targetdoc != ''">
+ <xsl:value-of select="@targetdoc"/>
+ </xsl:when>
+ <xsl:when test="@xlink:role=$xolink.role and contains(@xlink:href, '#')">
+ <xsl:value-of select="substring-before(@xlink:href, '#')"/>
+ </xsl:when>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="targetptr.att">
+ <xsl:choose>
+ <xsl:when test="@targetptr != ''">
+ <xsl:value-of select="@targetptr"/>
+ </xsl:when>
+ <xsl:when test="@xlink:role=$xolink.role and contains(@xlink:href, '#')">
+ <xsl:value-of select="substring-after(@xlink:href, '#')"/>
+ </xsl:when>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="olink.lang">
+ <xsl:call-template name="l10n.language">
+ <xsl:with-param name="xref-context" select="true()"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="target.database.filename">
+ <xsl:call-template name="select.target.database">
+ <xsl:with-param name="targetdoc.att" select="$targetdoc.att"/>
+ <xsl:with-param name="targetptr.att" select="$targetptr.att"/>
+ <xsl:with-param name="olink.lang" select="$olink.lang"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="target.database" select="document($target.database.filename,/)"/>
+
+ <xsl:if test="$olink.debug != 0">
+ <xsl:message>
+ <xsl:text>Olink debug: root element of target.database '</xsl:text>
+ <xsl:value-of select="$target.database.filename"/>
+ <xsl:text>' is '</xsl:text>
+ <xsl:value-of select="local-name($target.database/*[1])"/>
+ <xsl:text>'.</xsl:text>
+ </xsl:message>
+ </xsl:if>
+
+ <xsl:variable name="olink.key">
+ <xsl:call-template name="select.olink.key">
+ <xsl:with-param name="targetdoc.att" select="$targetdoc.att"/>
+ <xsl:with-param name="targetptr.att" select="$targetptr.att"/>
+ <xsl:with-param name="olink.lang" select="$olink.lang"/>
+ <xsl:with-param name="target.database" select="$target.database"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:if test="string-length($olink.key) = 0">
+ <xsl:message>
+ <xsl:text>Error: unresolved olink: </xsl:text>
+ <xsl:text>targetdoc/targetptr = '</xsl:text>
+ <xsl:value-of select="$targetdoc.att"/>
+ <xsl:text>/</xsl:text>
+ <xsl:value-of select="$targetptr.att"/>
+ <xsl:text>'.</xsl:text>
+ </xsl:message>
+ </xsl:if>
+
+ <xsl:variable name="href">
+ <xsl:call-template name="make.olink.href">
+ <xsl:with-param name="olink.key" select="$olink.key"/>
+ <xsl:with-param name="target.database" select="$target.database"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="hottext">
+ <xsl:choose>
+ <xsl:when test="string-length($content) != 0">
+ <xsl:copy-of select="$content"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="olink.hottext">
+ <xsl:with-param name="olink.key" select="$olink.key"/>
+ <xsl:with-param name="olink.lang" select="$olink.lang"/>
+ <xsl:with-param name="target.database" select="$target.database"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="olink.docname.citation">
+ <xsl:call-template name="olink.document.citation">
+ <xsl:with-param name="olink.key" select="$olink.key"/>
+ <xsl:with-param name="target.database" select="$target.database"/>
+ <xsl:with-param name="olink.lang" select="$olink.lang"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="olink.page.citation">
+ <xsl:call-template name="olink.page.citation">
+ <xsl:with-param name="olink.key" select="$olink.key"/>
+ <xsl:with-param name="target.database" select="$target.database"/>
+ <xsl:with-param name="olink.lang" select="$olink.lang"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="$href != ''">
+ <a href="{$href}">
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:copy-of select="$hottext"/>
+ </a>
+ <xsl:copy-of select="$olink.page.citation"/>
+ <xsl:copy-of select="$olink.docname.citation"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <span class="olink"><xsl:copy-of select="$hottext"/></span>
+ <xsl:copy-of select="$olink.page.citation"/>
+ <xsl:copy-of select="$olink.docname.citation"/>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ </xsl:when>
+
+ <!-- Or use old olink mechanism -->
+ <xsl:otherwise>
+ <xsl:variable name="href">
+ <xsl:choose>
+ <xsl:when test="@linkmode">
+ <!-- use the linkmode to get the base URI, use localinfo as fragid -->
+ <xsl:variable name="modespec" select="key('id',@linkmode)"/>
+ <xsl:if test="count($modespec) != 1 or local-name($modespec) != 'modespec'">
+ <xsl:message>Warning: olink linkmode pointer is wrong.</xsl:message>
+ </xsl:if>
+ <xsl:value-of select="$modespec"/>
+ <xsl:if test="@localinfo">
+ <xsl:text>#</xsl:text>
+ <xsl:value-of select="@localinfo"/>
+ </xsl:if>
+ </xsl:when>
+ <xsl:when test="@type = 'href'">
+ <xsl:call-template name="olink.outline">
+ <xsl:with-param name="outline.base.uri" select="unparsed-entity-uri(@targetdocent)"/>
+ <xsl:with-param name="localinfo" select="@localinfo"/>
+ <xsl:with-param name="return" select="'href'"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$olink.resolver"/>
+ <xsl:text>?</xsl:text>
+ <xsl:value-of select="$olink.sysid"/>
+ <xsl:value-of select="unparsed-entity-uri(@targetdocent)"/>
+ <!-- XSL gives no access to the public identifier (grumble...) -->
+ <xsl:if test="@localinfo">
+ <xsl:text>&amp;</xsl:text>
+ <xsl:value-of select="$olink.fragid"/>
+ <xsl:value-of select="@localinfo"/>
+ </xsl:if>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="$href != ''">
+ <a href="{$href}">
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:call-template name="olink.hottext"/>
+ </a>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="olink.hottext"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="*" mode="pagenumber.markup">
+ <!-- no-op in HTML -->
+</xsl:template>
+
+
+<xsl:template name="olink.outline">
+ <xsl:param name="outline.base.uri"/>
+ <xsl:param name="localinfo"/>
+ <xsl:param name="return" select="href"/>
+
+ <xsl:variable name="outline-file" select="concat($outline.base.uri, $olink.outline.ext)"/>
+
+ <xsl:variable name="outline" select="document($outline-file,.)/div"/>
+
+ <xsl:variable name="node-href">
+ <xsl:choose>
+ <xsl:when test="$localinfo != ''">
+ <xsl:variable name="node" select="$outline// *[@id=$localinfo or @xml:id=$localinfo]"/>
+ <xsl:value-of select="$node/@href"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$outline/@href"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="node-xref">
+ <xsl:choose>
+ <xsl:when test="$localinfo != ''">
+ <xsl:variable name="node" select="$outline// *[@id=$localinfo or @xml:id=$localinfo]"/>
+ <xsl:copy-of select="$node/xref"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$outline/xref"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="$return = 'href'">
+ <xsl:value-of select="$node-href"/>
+ </xsl:when>
+ <xsl:when test="$return = 'xref'">
+ <xsl:value-of select="$node-xref"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:copy-of select="$node-xref"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template name="xref.xreflabel">
+ <!-- called to process an xreflabel...you might use this to make -->
+ <!-- xreflabels come out in the right font for different targets, -->
+ <!-- for example. -->
+ <xsl:param name="target" select="."/>
+ <xsl:value-of select="$target/@xreflabel"/>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="title" mode="xref">
+ <xsl:apply-templates/>
+</xsl:template>
+
+<xsl:template match="command" mode="xref">
+ <xsl:call-template name="inline.boldseq"/>
+</xsl:template>
+
+<xsl:template match="function" mode="xref">
+ <xsl:call-template name="inline.monoseq"/>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="*" mode="insert.title.markup">
+ <xsl:param name="purpose"/>
+ <xsl:param name="xrefstyle"/>
+ <xsl:param name="title"/>
+
+ <xsl:choose>
+ <!-- FIXME: what about the case where titleabbrev is inside the info? -->
+ <xsl:when test="$purpose = 'xref' and titleabbrev">
+ <xsl:apply-templates select="." mode="titleabbrev.markup"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:copy-of select="$title"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="chapter|appendix" mode="insert.title.markup">
+ <xsl:param name="purpose"/>
+ <xsl:param name="xrefstyle"/>
+ <xsl:param name="title"/>
+
+ <xsl:choose>
+ <xsl:when test="$purpose = 'xref'">
+ <em xmlns:xslo="http://www.w3.org/1999/XSL/Transform">
+ <xsl:copy-of select="$title"/>
+ </em>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:copy-of select="$title"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="*" mode="insert.subtitle.markup">
+ <xsl:param name="purpose"/>
+ <xsl:param name="xrefstyle"/>
+ <xsl:param name="subtitle"/>
+
+ <xsl:copy-of select="$subtitle"/>
+</xsl:template>
+
+<xsl:template match="*" mode="insert.label.markup">
+ <xsl:param name="purpose"/>
+ <xsl:param name="xrefstyle"/>
+ <xsl:param name="label"/>
+
+ <xsl:copy-of select="$label"/>
+</xsl:template>
+
+<xsl:template match="*" mode="insert.pagenumber.markup">
+ <xsl:param name="purpose"/>
+ <xsl:param name="xrefstyle"/>
+ <xsl:param name="pagenumber"/>
+
+ <xsl:copy-of select="$pagenumber"/>
+</xsl:template>
+
+<xsl:template match="*" mode="insert.direction.markup">
+ <xsl:param name="purpose"/>
+ <xsl:param name="xrefstyle"/>
+ <xsl:param name="direction"/>
+
+ <xsl:copy-of select="$direction"/>
+</xsl:template>
+
+<xsl:template match="*" mode="insert.olink.docname.markup">
+ <xsl:param name="purpose"/>
+ <xsl:param name="xrefstyle"/>
+ <xsl:param name="docname"/>
+
+ <span class="olinkdocname">
+ <xsl:copy-of select="$docname"/>
+ </span>
+
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/admon.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/admon.xsl
new file mode 100644
index 0000000..6a0090a
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/admon.xsl
@@ -0,0 +1,135 @@
+<?xml version="1.0" encoding="ASCII"?>
+<!--This file was created automatically by html2xhtml-->
+<!--from the HTML stylesheets.-->
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1999/xhtml" version="1.0">
+
+<!-- ********************************************************************
+ $Id: admon.xsl 8421 2009-05-04 07:49:49Z bobstayton $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<xsl:template match="*" mode="admon.graphic.width">
+ <xsl:param name="node" select="."/>
+ <xsl:text>25</xsl:text>
+</xsl:template>
+
+<xsl:template match="note|important|warning|caution|tip">
+ <xsl:choose>
+ <xsl:when test="$admon.graphics != 0">
+ <xsl:call-template name="graphical.admonition"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="nongraphical.admonition"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="admon.graphic">
+ <xsl:param name="node" select="."/>
+ <xsl:value-of select="$admon.graphics.path"/>
+ <xsl:choose>
+ <xsl:when test="local-name($node)='note'">note</xsl:when>
+ <xsl:when test="local-name($node)='warning'">warning</xsl:when>
+ <xsl:when test="local-name($node)='caution'">caution</xsl:when>
+ <xsl:when test="local-name($node)='tip'">tip</xsl:when>
+ <xsl:when test="local-name($node)='important'">important</xsl:when>
+ <xsl:otherwise>note</xsl:otherwise>
+ </xsl:choose>
+ <xsl:value-of select="$admon.graphics.extension"/>
+</xsl:template>
+
+<xsl:template name="graphical.admonition">
+ <xsl:variable name="admon.type">
+ <xsl:choose>
+ <xsl:when test="local-name(.)='note'">Note</xsl:when>
+ <xsl:when test="local-name(.)='warning'">Warning</xsl:when>
+ <xsl:when test="local-name(.)='caution'">Caution</xsl:when>
+ <xsl:when test="local-name(.)='tip'">Tip</xsl:when>
+ <xsl:when test="local-name(.)='important'">Important</xsl:when>
+ <xsl:otherwise>Note</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="alt">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="$admon.type"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <div>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:if test="$admon.style != ''">
+ <xsl:attribute name="style">
+ <xsl:value-of select="$admon.style"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <table border="0">
+ <xsl:attribute name="summary">
+ <xsl:value-of select="$admon.type"/>
+ <xsl:if test="title|info/title">
+ <xsl:text>: </xsl:text>
+ <xsl:value-of select="(title|info/title)[1]"/>
+ </xsl:if>
+ </xsl:attribute>
+ <tr>
+ <td rowspan="2" align="center" valign="top">
+ <xsl:attribute name="width">
+ <xsl:apply-templates select="." mode="admon.graphic.width"/>
+ </xsl:attribute>
+ <img alt="[{$alt}]">
+ <xsl:attribute name="src">
+ <xsl:call-template name="admon.graphic"/>
+ </xsl:attribute>
+ </img>
+ </td>
+ <th align="{$direction.align.start}">
+ <xsl:call-template name="anchor"/>
+ <xsl:if test="$admon.textlabel != 0 or title or info/title">
+ <xsl:apply-templates select="." mode="object.title.markup"/>
+ </xsl:if>
+ </th>
+ </tr>
+ <tr>
+ <td align="{$direction.align.start}" valign="top">
+ <xsl:apply-templates/>
+ </td>
+ </tr>
+ </table>
+ </div>
+</xsl:template>
+
+<xsl:template name="nongraphical.admonition">
+ <div>
+ <xsl:call-template name="common.html.attributes">
+ <xsl:with-param name="inherit" select="1"/>
+ </xsl:call-template>
+ <xsl:if test="$admon.style">
+ <xsl:attribute name="style">
+ <xsl:value-of select="$admon.style"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:if test="$admon.textlabel != 0 or title or info/title">
+ <h3 class="title">
+ <xsl:call-template name="anchor"/>
+ <xsl:apply-templates select="." mode="object.title.markup"/>
+ </h3>
+ </xsl:if>
+
+ <xsl:apply-templates/>
+ </div>
+</xsl:template>
+
+<xsl:template match="note/title"/>
+<xsl:template match="important/title"/>
+<xsl:template match="warning/title"/>
+<xsl:template match="caution/title"/>
+<xsl:template match="tip/title"/>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/annotations.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/annotations.xsl
new file mode 100644
index 0000000..3e137e8
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/annotations.xsl
@@ -0,0 +1,158 @@
+<?xml version="1.0" encoding="ASCII"?>
+<!--This file was created automatically by html2xhtml-->
+<!--from the HTML stylesheets.-->
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1999/xhtml" version="1.0">
+
+<xsl:template name="add.annotation.links">
+ <xsl:param name="scripts" select="normalize-space($annotation.js)"/>
+ <xsl:choose>
+ <xsl:when test="contains($scripts, ' ')">
+ <script type="text/javascript" src="{substring-before($scripts, ' ')}"/>
+ <xsl:call-template name="add.annotation.links">
+ <xsl:with-param name="scripts" select="substring-after($scripts, ' ')"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <script type="text/javascript" src="{$scripts}"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="annotation"/>
+
+<xsl:template name="apply-annotations">
+ <xsl:if test="$annotation.support != 0">
+ <!-- do any annotations apply to the context node? -->
+ <xsl:variable name="id" select="(@id|@xml:id)[1]"/>
+
+ <xsl:variable name="aids">
+ <xsl:for-each select="//annotation">
+ <xsl:if test="@annotates=$id or starts-with(@annotates, concat($id, ' ')) or contains(@annotates, concat(' ', $id, ' ')) or substring(@annotates, string-length(@annotates)-3) = concat(' ', $id)">
+ <xsl:value-of select="generate-id()"/>
+ <xsl:text> </xsl:text>
+ </xsl:if>
+ </xsl:for-each>
+ <xsl:if test="normalize-space(@annotations) != ''">
+ <xsl:call-template name="annotations-pointed-to">
+ <xsl:with-param name="annotations" select="normalize-space(@annotations)"/>
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:variable>
+
+ <xsl:if test="$aids != ''">
+ <xsl:call-template name="apply-annotations-by-gid">
+ <xsl:with-param name="gids" select="normalize-space($aids)"/>
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template name="annotations-pointed-to">
+ <xsl:param name="annotations"/>
+ <xsl:choose>
+ <xsl:when test="contains($annotations, ' ')">
+ <xsl:variable name="a" select="key('id', substring-before($annotations, ' '))"/>
+ <xsl:if test="$a">
+ <xsl:value-of select="generate-id($a)"/>
+ <xsl:text> </xsl:text>
+ </xsl:if>
+ <xsl:call-template name="annotations-pointed-to">
+ <xsl:with-param name="annotations" select="substring-after($annotations, ' ')"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:variable name="a" select="key('id', $annotations)"/>
+ <xsl:if test="$a">
+ <xsl:value-of select="generate-id($a)"/>
+ <xsl:text> </xsl:text>
+ </xsl:if>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="apply-annotations-by-gid">
+ <xsl:param name="gids"/>
+
+ <xsl:choose>
+ <xsl:when test="contains($gids, ' ')">
+ <xsl:variable name="gid" select="substring-before($gids, ' ')"/>
+ <xsl:apply-templates select="key('gid', $gid)" mode="annotation-inline"/>
+ <xsl:call-template name="apply-annotations-by-gid">
+ <xsl:with-param name="gids" select="substring-after($gids, ' ')"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="key('gid', $gids)" mode="annotation-inline"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="annotation" mode="annotation-inline">
+ <xsl:variable name="title">
+ <xsl:choose>
+ <xsl:when test="title">
+ <xsl:value-of select="title"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text>[Annotation #</xsl:text>
+ <xsl:number count="annotation" level="any" format="1"/>
+ <xsl:text>]</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <a id="anch-{generate-id(.)}" href="#annot-{generate-id(.)}" title="{$title}">
+ <xsl:apply-templates select="." mode="class.attribute"/>
+ <xsl:attribute name="onClick">
+ <xsl:text>popup_</xsl:text>
+ <xsl:value-of select="generate-id(.)"/>
+ <xsl:text>.showPopup('anch-</xsl:text>
+ <xsl:value-of select="generate-id(.)"/>
+ <xsl:text>'); return false;</xsl:text>
+ </xsl:attribute>
+ <img src="{$annotation.graphic.open}" border="0" alt="{$title}"/>
+ </a>
+</xsl:template>
+
+<xsl:template match="annotation" mode="annotation-popup">
+ <div class="annotation-nocss">
+ <p>
+ <a id="annot-{generate-id(.)}"/>
+ <xsl:text>Annotation #</xsl:text>
+ <xsl:number count="annotation" level="any" format="1"/>
+ <xsl:text>:</xsl:text>
+ </p>
+ </div>
+
+ <div id="popup-{generate-id(.)}" class="annotation-popup">
+ <xsl:if test="string-length(.) &gt; 300">
+ <xsl:attribute name="style">width:400px</xsl:attribute>
+ </xsl:if>
+
+ <xsl:call-template name="annotation-title"/>
+ <div class="annotation-body">
+ <xsl:apply-templates select="*[local-name(.) != 'title']"/>
+ </div>
+ <div class="annotation-close">
+ <a href="#" onclick="popup_{generate-id(.)}.hidePopup();return false;">
+ <xsl:apply-templates select="." mode="class.attribute"/>
+ <img src="{$annotation.graphic.close}" alt="X" border="0"/>
+ </a>
+ </div>
+ </div>
+</xsl:template>
+
+<xsl:template name="annotation-title">
+ <div class="annotation-title">
+ <xsl:choose>
+ <xsl:when test="title">
+ <xsl:apply-templates select="title/node()"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text>Annotation</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ </div>
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/autoidx-kimber.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/autoidx-kimber.xsl
new file mode 100644
index 0000000..cfaa447
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/autoidx-kimber.xsl
@@ -0,0 +1,139 @@
+<?xml version="1.0" encoding="ASCII"?>
+<!--This file was created automatically by html2xhtml-->
+<!--from the HTML stylesheets.-->
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:k="http://www.isogen.com/functions/com.isogen.saxoni18n.Saxoni18nService" xmlns="http://www.w3.org/1999/xhtml" exclude-result-prefixes="k" version="1.0">
+
+<!-- ********************************************************************
+ $Id: autoidx-kimber.xsl 8729 2010-07-15 16:43:56Z bobstayton $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<!-- ==================================================================== -->
+<!-- The "kimber" method contributed by Eliot Kimber of Innodata Isogen. -->
+<!-- ==================================================================== -->
+<!-- *** THIS MODULE ONLY WORKS WITH SAXON 6 OR SAXON 8 *** -->
+<!-- ==================================================================== -->
+
+
+<xsl:include href="../common/autoidx-kimber.xsl"/>
+
+<!-- Java sort apparently works only on lang part, not country -->
+<xsl:param name="sort.lang">
+ <xsl:choose>
+ <xsl:when test="contains(concat(/*/@lang, /*/@xml:lang), '-')">
+ <xsl:value-of select="substring-before(concat(/*/@lang, /*/@xml:lang), '-')"/>
+ </xsl:when>
+ <xsl:when test="contains(concat(/*/@lang, /*/@xml:lang), '_')">
+ <xsl:value-of select="substring-before(concat(/*/@lang, /*/@xml:lang), '_')"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="concat(/*/@lang, /*/@xml:lang)"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:param>
+
+<xsl:template name="generate-kimber-index">
+ <xsl:param name="scope" select="NOTANODE"/>
+
+ <xsl:variable name="vendor" select="system-property('xsl:vendor')"/>
+ <xsl:if test="not(contains($vendor, 'SAXON '))">
+ <xsl:message terminate="yes">
+ <xsl:text>ERROR: the 'kimber' index method requires the </xsl:text>
+ <xsl:text>Saxon version 6 or 8 XSLT processor.</xsl:text>
+ </xsl:message>
+ </xsl:if>
+
+ <xsl:if test="not(function-available('k:getIndexGroupKey'))">
+ <xsl:message terminate="yes">
+ <xsl:text>ERROR: the 'kimber' index method requires the </xsl:text>
+ <xsl:text>Innodata Isogen
+Java extensions for </xsl:text>
+ <xsl:text>internationalized indexes.
+Install those </xsl:text>
+ <xsl:text>extensions, or use a different index method.
+</xsl:text>
+ <xsl:text>For more information, see:
+</xsl:text>
+ <xsl:text>http://www.innodata-isogen.com/knowledge_center/tools_downloads/i18nsupport</xsl:text>
+ </xsl:message>
+ </xsl:if>
+
+ <xsl:variable name="role">
+ <xsl:if test="$index.on.role != 0">
+ <xsl:value-of select="@role"/>
+ </xsl:if>
+ </xsl:variable>
+
+ <xsl:variable name="type">
+ <xsl:if test="$index.on.type != 0">
+ <xsl:value-of select="@type"/>
+ </xsl:if>
+ </xsl:variable>
+
+ <xsl:variable name="terms" select="//indexterm[count(.|key('k-group', k:getIndexGroupKey(concat(/*/@lang, /*/@xml:lang), normalize-space(concat(primary/@sortas, &quot; &quot;, primary))))[count(ancestor::node()|$scope) = count(ancestor::node()) and ($role = @role or $type = @type or (string-length($role) = 0 and string-length($type) = 0))][1]) = 1 and not(@class = 'endofrange')]"/>
+
+ <xsl:variable name="alphabetical" select="$terms[not(starts-with( k:getIndexGroupKey(concat(/*/@lang, /*/@xml:lang), normalize-space(concat(primary/@sortas, &quot; &quot;, primary))), '#NUMERIC' ))]"/>
+
+ <xsl:variable name="others" select="$terms[starts-with( k:getIndexGroupKey(concat(/*/@lang, /*/@xml:lang), normalize-space(concat(primary/@sortas, &quot; &quot;, primary))), '#NUMERIC' )]"/>
+
+ <div class="index">
+ <xsl:if test="$others">
+ <div class="indexdev">
+ <h3>
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'index symbols'"/>
+ </xsl:call-template>
+ </h3>
+ <dl>
+ <xsl:apply-templates select="$others" mode="index-symbol-div">
+ <xsl:with-param name="scope" select="$scope"/>
+ <xsl:with-param name="role" select="$role"/>
+ <xsl:with-param name="type" select="$type"/>
+ <xsl:sort lang="{$sort.lang}" select="k:getIndexGroupSortKey(concat(/*/@lang, /*/@xml:lang), k:getIndexGroupKey(concat(/*/@lang, /*/@xml:lang), normalize-space(concat(primary/@sortas, &quot; &quot;, primary))))"/>
+ </xsl:apply-templates>
+ </dl>
+ </div>
+ </xsl:if>
+
+ <xsl:apply-templates select="$alphabetical" mode="index-div-kimber">
+ <xsl:with-param name="scope" select="$scope"/>
+ <xsl:with-param name="role" select="$role"/>
+ <xsl:with-param name="type" select="$type"/>
+ <xsl:sort lang="{$sort.lang}" select="k:getIndexGroupSortKey(concat(/*/@lang, /*/@xml:lang), k:getIndexGroupKey(concat(/*/@lang, /*/@xml:lang), normalize-space(concat(primary/@sortas, &quot; &quot;, primary))))"/>
+ </xsl:apply-templates>
+ </div>
+
+</xsl:template>
+
+<xsl:template match="indexterm" mode="index-div-kimber">
+ <xsl:param name="scope" select="."/>
+ <xsl:param name="role" select="''"/>
+ <xsl:param name="type" select="''"/>
+
+ <xsl:variable name="key" select="k:getIndexGroupKey(concat(/*/@lang, /*/@xml:lang), normalize-space(concat(primary/@sortas, &quot; &quot;, primary)))"/>
+
+ <xsl:variable name="label" select="k:getIndexGroupLabel(concat(/*/@lang, /*/@xml:lang), $key)"/>
+
+ <xsl:if test="key('k-group', $label)[count(ancestor::node()|$scope) = count(ancestor::node()) and ($role = @role or $type = @type or (string-length($role) = 0 and string-length($type) = 0))][count(.|key('primary', normalize-space(concat(primary/@sortas, &quot; &quot;, primary)))[count(ancestor::node()|$scope) = count(ancestor::node()) and ($role = @role or $type = @type or (string-length($role) = 0 and string-length($type) = 0))][1]) = 1]">
+ <div class="indexdiv">
+ <h3>
+ <xsl:value-of select="$label"/>
+ </h3>
+ <dl>
+ <xsl:apply-templates select="key('k-group', $key)[count(ancestor::node()|$scope) = count(ancestor::node()) and ($role = @role or $type = @type or (string-length($role) = 0 and string-length($type) = 0))] [count(.|key('primary', normalize-space(concat(primary/@sortas, &quot; &quot;, primary)))[count(ancestor::node()|$scope) = count(ancestor::node()) and ($role = @role or $type = @type or (string-length($role) = 0 and string-length($type) = 0))] [1])=1]" mode="index-primary">
+ <xsl:sort select="normalize-space(concat(primary/@sortas, &quot; &quot;, primary))" lang="{$sort.lang}"/>
+ <xsl:with-param name="scope" select="$scope"/>
+ <xsl:with-param name="role" select="$role"/>
+ <xsl:with-param name="type" select="$type"/>
+ </xsl:apply-templates>
+ </dl>
+ </div>
+ </xsl:if>
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/autoidx-kosek.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/autoidx-kosek.xsl
new file mode 100644
index 0000000..de6eef5
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/autoidx-kosek.xsl
@@ -0,0 +1,109 @@
+<?xml version="1.0" encoding="ASCII"?>
+<!--This file was created automatically by html2xhtml-->
+<!--from the HTML stylesheets.-->
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:i="urn:cz-kosek:functions:index" xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0" xmlns:func="http://exslt.org/functions" xmlns:k="http://www.isogen.com/functions/com.isogen.saxoni18n.Saxoni18nService" xmlns:exslt="http://exslt.org/common" xmlns="http://www.w3.org/1999/xhtml" extension-element-prefixes="func exslt" exclude-result-prefixes="func exslt i l k" version="1.0">
+
+<!-- ********************************************************************
+ $Id: autoidx-kosek.xsl 8725 2010-07-15 08:08:04Z kosek $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<!-- ==================================================================== -->
+<!-- The "kosek" method contributed by Jirka Kosek. -->
+
+<xsl:include href="../common/autoidx-kosek.xsl"/>
+
+<xsl:template name="generate-kosek-index">
+ <xsl:param name="scope" select="(ancestor::book|/)[last()]"/>
+
+ <xsl:variable name="vendor" select="system-property('xsl:vendor')"/>
+ <xsl:if test="contains($vendor, 'libxslt')">
+ <xsl:message terminate="yes">
+ <xsl:text>ERROR: the 'kosek' index method does not </xsl:text>
+ <xsl:text>work with the xsltproc XSLT processor.</xsl:text>
+ </xsl:message>
+ </xsl:if>
+
+ <xsl:if test="contains($vendor, 'Saxonica')">
+ <xsl:message terminate="yes">
+ <xsl:text>ERROR: the 'kosek' index method does not </xsl:text>
+ <xsl:text>work with the Saxon 8 XSLT processor.</xsl:text>
+ </xsl:message>
+ </xsl:if>
+
+ <xsl:if test="$exsl.node.set.available = 0">
+ <xsl:message terminate="yes">
+ <xsl:text>ERROR: the 'kosek' index method requires the </xsl:text>
+ <xsl:text>exslt:node-set() function. Use a processor that </xsl:text>
+ <xsl:text>has it, or use a different index method.</xsl:text>
+ </xsl:message>
+ </xsl:if>
+
+ <xsl:if test="not(function-available('i:group-index'))">
+ <xsl:message terminate="yes">
+ <xsl:text>ERROR: the 'kosek' index method requires the
+</xsl:text>
+ <xsl:text>index extension functions be imported:
+</xsl:text>
+ <xsl:text> xsl:import href="common/autoidx-kosek.xsl"</xsl:text>
+ </xsl:message>
+ </xsl:if>
+
+ <xsl:variable name="role">
+ <xsl:if test="$index.on.role != 0">
+ <xsl:value-of select="@role"/>
+ </xsl:if>
+ </xsl:variable>
+
+ <xsl:variable name="type">
+ <xsl:if test="$index.on.type != 0">
+ <xsl:value-of select="@type"/>
+ </xsl:if>
+ </xsl:variable>
+
+ <xsl:variable name="terms" select="//indexterm[count(.|key('group-code', i:group-index(normalize-space(concat(primary/@sortas, &quot; &quot;, primary))))[count(ancestor::node()|$scope) = count(ancestor::node()) and ($role = @role or $type = @type or (string-length($role) = 0 and string-length($type) = 0))][1]) = 1 and not(@class = 'endofrange')]"/>
+
+ <div class="index">
+ <xsl:apply-templates select="$terms" mode="index-div-kosek">
+ <xsl:with-param name="scope" select="$scope"/>
+ <xsl:with-param name="role" select="$role"/>
+ <xsl:with-param name="type" select="$type"/>
+ <xsl:sort select="i:group-index(normalize-space(concat(primary/@sortas, &quot; &quot;, primary)))" data-type="number"/>
+ </xsl:apply-templates>
+ </div>
+</xsl:template>
+
+<xsl:template match="indexterm" mode="index-div-kosek">
+ <xsl:param name="scope" select="."/>
+ <xsl:param name="role" select="''"/>
+ <xsl:param name="type" select="''"/>
+
+ <xsl:variable name="key" select="i:group-index(normalize-space(concat(primary/@sortas, &quot; &quot;, primary)))"/>
+
+ <xsl:variable name="lang">
+ <xsl:call-template name="l10n.language"/>
+ </xsl:variable>
+
+ <xsl:if test="key('group-code', $key)[count(ancestor::node()|$scope) = count(ancestor::node()) and ($role = @role or $type = @type or (string-length($role) = 0 and string-length($type) = 0))][count(.|key('primary', normalize-space(concat(primary/@sortas, &quot; &quot;, primary)))[count(ancestor::node()|$scope) = count(ancestor::node()) and ($role = @role or $type = @type or (string-length($role) = 0 and string-length($type) = 0))][1]) = 1]">
+ <div class="indexdiv">
+ <h3>
+ <xsl:value-of select="i:group-letter($key)"/>
+ </h3>
+ <dl>
+ <xsl:apply-templates select="key('group-code', $key)[count(ancestor::node()|$scope) = count(ancestor::node()) and ($role = @role or $type = @type or (string-length($role) = 0 and string-length($type) = 0))][count(.|key('primary', normalize-space(concat(primary/@sortas, &quot; &quot;, primary)))[count(ancestor::node()|$scope) = count(ancestor::node()) and ($role = @role or $type = @type or (string-length($role) = 0 and string-length($type) = 0))][1])=1]" mode="index-primary">
+ <xsl:sort select="normalize-space(concat(primary/@sortas, &quot; &quot;, primary))" lang="{$lang}"/>
+ <xsl:with-param name="scope" select="$scope"/>
+ <xsl:with-param name="role" select="$role"/>
+ <xsl:with-param name="type" select="$type"/>
+ </xsl:apply-templates>
+ </dl>
+ </div>
+ </xsl:if>
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/autoidx-ng.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/autoidx-ng.xsl
new file mode 100644
index 0000000..5d08db6
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/autoidx-ng.xsl
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="ASCII"?>
+<!--This file was created automatically by html2xhtml-->
+<!--from the HTML stylesheets.-->
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1999/xhtml" version="1.0">
+
+<!-- ********************************************************************
+ $Id: autoidx-ng.xsl 6910 2007-06-28 23:23:30Z xmldoc $
+ ********************************************************************
+
+ This file is part of the DocBook XSL Stylesheet distribution.
+ See ../README or http://docbook.sf.net/ for copyright
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<!-- You should have this directly in your customization file. -->
+<!-- This file is there only to retain backward compatibility. -->
+<xsl:import href="autoidx-kosek.xsl"/>
+<xsl:param name="index.method">kosek</xsl:param>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/autoidx.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/autoidx.xsl
new file mode 100644
index 0000000..baf4a1d
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/autoidx.xsl
@@ -0,0 +1,681 @@
+<?xml version="1.0" encoding="ASCII"?>
+<!--This file was created automatically by html2xhtml-->
+<!--from the HTML stylesheets.-->
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:exslt="http://exslt.org/common" xmlns="http://www.w3.org/1999/xhtml" extension-element-prefixes="exslt" exclude-result-prefixes="exslt" version="1.0">
+
+<!-- ********************************************************************
+ $Id: autoidx.xsl 8516 2009-08-12 02:54:56Z abdelazer $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<!-- ==================================================================== -->
+<!-- The "basic" method derived from Jeni Tennison's work. -->
+<!-- The "kosek" method contributed by Jirka Kosek. -->
+<!-- The "kimber" method contributed by Eliot Kimber of Innodata Isogen. -->
+
+<xsl:variable name="kimber.imported" select="0"/>
+<xsl:variable name="kosek.imported" select="0"/>
+
+<xsl:key name="letter" match="indexterm" use="translate(substring(normalize-space(concat(primary/@sortas, &quot; &quot;, primary)), 1, 1),'Aa&#192;&#224;&#193;&#225;&#194;&#226;&#195;&#227;&#196;&#228;&#197;&#229;&#256;&#257;&#258;&#259;&#260;&#261;&#461;&#462;&#478;&#479;&#480;&#481;&#506;&#507;&#512;&#513;&#514;&#515;&#550;&#551;&#7680;&#7681;&#7834;&#7840;&#7841;&#7842;&#7843;&#7844;&#7845;&#7846;&#7847;&#7848;&#7849;&#7850;&#7851;&#7852;&#7853;&#7854;&#7855;&#7856;&#7857;&#7858;&#7859;&#7860;&#7861;&#7862;&#7863;Bb&#384;&#385;&#595;&#386;&#387;&#7682;&#7683;&#7684;&#7685;&#7686;&#7687;Cc&#199;&#231;&#262;&#263;&#264;&#265;&#266;&#267;&#268;&#269;&#391;&#392;&#597;&#7688;&#7689;Dd&#270;&#271;&#272;&#273;&#394;&#599;&#395;&#396;&#453;&#498;&#545;&#598;&#7690;&#7691;&#7692;&#7693;&#7694;&#7695;&#7696;&#7697;&#7698;&#7699;Ee&#200;&#232;&#201;&#233;&#202;&#234;&#203;&#235;&#274;&#275;&#276;&#277;&#278;&#279;&#280;&#281;&#282;&#283;&#516;&#517;&#518;&#519;&#552;&#553;&#7700;&#7701;&#7702;&#7703;&#7704;&#7705;&#7706;&#7707;&#7708;&#7709;&#7864;&#7865;&#7866;&#7867;&#7868;&#7869;&#7870;&#7871;&#7872;&#7873;&#7874;&#7875;&#7876;&#7877;&#7878;&#7879;Ff&#401;&#402;&#7710;&#7711;Gg&#284;&#285;&#286;&#287;&#288;&#289;&#290;&#291;&#403;&#608;&#484;&#485;&#486;&#487;&#500;&#501;&#7712;&#7713;Hh&#292;&#293;&#294;&#295;&#542;&#543;&#614;&#7714;&#7715;&#7716;&#7717;&#7718;&#7719;&#7720;&#7721;&#7722;&#7723;&#7830;Ii&#204;&#236;&#205;&#237;&#206;&#238;&#207;&#239;&#296;&#297;&#298;&#299;&#300;&#301;&#302;&#303;&#304;&#407;&#616;&#463;&#464;&#520;&#521;&#522;&#523;&#7724;&#7725;&#7726;&#7727;&#7880;&#7881;&#7882;&#7883;Jj&#308;&#309;&#496;&#669;Kk&#310;&#311;&#408;&#409;&#488;&#489;&#7728;&#7729;&#7730;&#7731;&#7732;&#7733;Ll&#313;&#314;&#315;&#316;&#317;&#318;&#319;&#320;&#321;&#322;&#410;&#456;&#564;&#619;&#620;&#621;&#7734;&#7735;&#7736;&#7737;&#7738;&#7739;&#7740;&#7741;Mm&#625;&#7742;&#7743;&#7744;&#7745;&#7746;&#7747;Nn&#209;&#241;&#323;&#324;&#325;&#326;&#327;&#328;&#413;&#626;&#414;&#544;&#459;&#504;&#505;&#565;&#627;&#7748;&#7749;&#7750;&#7751;&#7752;&#7753;&#7754;&#7755;Oo&#210;&#242;&#211;&#243;&#212;&#244;&#213;&#245;&#214;&#246;&#216;&#248;&#332;&#333;&#334;&#335;&#336;&#337;&#415;&#416;&#417;&#465;&#466;&#490;&#491;&#492;&#493;&#510;&#511;&#524;&#525;&#526;&#527;&#554;&#555;&#556;&#557;&#558;&#559;&#560;&#561;&#7756;&#7757;&#7758;&#7759;&#7760;&#7761;&#7762;&#7763;&#7884;&#7885;&#7886;&#7887;&#7888;&#7889;&#7890;&#7891;&#7892;&#7893;&#7894;&#7895;&#7896;&#7897;&#7898;&#7899;&#7900;&#7901;&#7902;&#7903;&#7904;&#7905;&#7906;&#7907;Pp&#420;&#421;&#7764;&#7765;&#7766;&#7767;Qq&#672;Rr&#340;&#341;&#342;&#343;&#344;&#345;&#528;&#529;&#530;&#531;&#636;&#637;&#638;&#7768;&#7769;&#7770;&#7771;&#7772;&#7773;&#7774;&#7775;Ss&#346;&#347;&#348;&#349;&#350;&#351;&#352;&#353;&#536;&#537;&#642;&#7776;&#7777;&#7778;&#7779;&#7780;&#7781;&#7782;&#7783;&#7784;&#7785;Tt&#354;&#355;&#356;&#357;&#358;&#359;&#427;&#428;&#429;&#430;&#648;&#538;&#539;&#566;&#7786;&#7787;&#7788;&#7789;&#7790;&#7791;&#7792;&#7793;&#7831;Uu&#217;&#249;&#218;&#250;&#219;&#251;&#220;&#252;&#360;&#361;&#362;&#363;&#364;&#365;&#366;&#367;&#368;&#369;&#370;&#371;&#431;&#432;&#467;&#468;&#469;&#470;&#471;&#472;&#473;&#474;&#475;&#476;&#532;&#533;&#534;&#535;&#7794;&#7795;&#7796;&#7797;&#7798;&#7799;&#7800;&#7801;&#7802;&#7803;&#7908;&#7909;&#7910;&#7911;&#7912;&#7913;&#7914;&#7915;&#7916;&#7917;&#7918;&#7919;&#7920;&#7921;Vv&#434;&#651;&#7804;&#7805;&#7806;&#7807;Ww&#372;&#373;&#7808;&#7809;&#7810;&#7811;&#7812;&#7813;&#7814;&#7815;&#7816;&#7817;&#7832;Xx&#7818;&#7819;&#7820;&#7821;Yy&#221;&#253;&#255;&#376;&#374;&#375;&#435;&#436;&#562;&#563;&#7822;&#7823;&#7833;&#7922;&#7923;&#7924;&#7925;&#7926;&#7927;&#7928;&#7929;Zz&#377;&#378;&#379;&#380;&#381;&#382;&#437;&#438;&#548;&#549;&#656;&#657;&#7824;&#7825;&#7826;&#7827;&#7828;&#7829;&#7829;','AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBCCCCCCCCCCCCCCCCCDDDDDDDDDDDDDDDDDDDDDDDDEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEFFFFFFGGGGGGGGGGGGGGGGGGGGHHHHHHHHHHHHHHHHHHHHIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIJJJJJJKKKKKKKKKKKKKKLLLLLLLLLLLLLLLLLLLLLLLLLLMMMMMMMMMNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOPPPPPPPPQQQRRRRRRRRRRRRRRRRRRRRRRRSSSSSSSSSSSSSSSSSSSSSSSTTTTTTTTTTTTTTTTTTTTTTTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUVVVVVVVVWWWWWWWWWWWWWWWXXXXXXYYYYYYYYYYYYYYYYYYYYYYYZZZZZZZZZZZZZZZZZZZZZ')"/>
+
+<xsl:key name="primary" match="indexterm" use="normalize-space(concat(primary/@sortas, &quot; &quot;, primary))"/>
+
+<xsl:key name="secondary" match="indexterm" use="concat(normalize-space(concat(primary/@sortas, &quot; &quot;, primary)), &quot; &quot;, normalize-space(concat(secondary/@sortas, &quot; &quot;, secondary)))"/>
+
+<xsl:key name="tertiary" match="indexterm" use="concat(normalize-space(concat(primary/@sortas, &quot; &quot;, primary)), &quot; &quot;, normalize-space(concat(secondary/@sortas, &quot; &quot;, secondary)), &quot; &quot;, normalize-space(concat(tertiary/@sortas, &quot; &quot;, tertiary)))"/>
+
+<xsl:key name="endofrange" match="indexterm[@class='endofrange']" use="@startref"/>
+
+<xsl:key name="primary-section" match="indexterm[not(secondary) and not(see)]" use="concat(normalize-space(concat(primary/@sortas, &quot; &quot;, primary)), &quot; &quot;, generate-id((ancestor-or-self::set|ancestor-or-self::book|ancestor-or-self::part|ancestor-or-self::reference|ancestor-or-self::partintro|ancestor-or-self::chapter|ancestor-or-self::appendix|ancestor-or-self::preface|ancestor-or-self::article|ancestor-or-self::section|ancestor-or-self::sect1|ancestor-or-self::sect2|ancestor-or-self::sect3|ancestor-or-self::sect4|ancestor-or-self::sect5|ancestor-or-self::refentry|ancestor-or-self::refsect1|ancestor-or-self::refsect2|ancestor-or-self::refsect3|ancestor-or-self::simplesect|ancestor-or-self::bibliography|ancestor-or-self::glossary|ancestor-or-self::index|ancestor-or-self::webpage)[last()]))"/>
+
+<xsl:key name="secondary-section" match="indexterm[not(tertiary) and not(see)]" use="concat(normalize-space(concat(primary/@sortas, &quot; &quot;, primary)), &quot; &quot;, normalize-space(concat(secondary/@sortas, &quot; &quot;, secondary)), &quot; &quot;, generate-id((ancestor-or-self::set|ancestor-or-self::book|ancestor-or-self::part|ancestor-or-self::reference|ancestor-or-self::partintro|ancestor-or-self::chapter|ancestor-or-self::appendix|ancestor-or-self::preface|ancestor-or-self::article|ancestor-or-self::section|ancestor-or-self::sect1|ancestor-or-self::sect2|ancestor-or-self::sect3|ancestor-or-self::sect4|ancestor-or-self::sect5|ancestor-or-self::refentry|ancestor-or-self::refsect1|ancestor-or-self::refsect2|ancestor-or-self::refsect3|ancestor-or-self::simplesect|ancestor-or-self::bibliography|ancestor-or-self::glossary|ancestor-or-self::index|ancestor-or-self::webpage)[last()]))"/>
+
+<xsl:key name="tertiary-section" match="indexterm[not(see)]" use="concat(normalize-space(concat(primary/@sortas, &quot; &quot;, primary)), &quot; &quot;, normalize-space(concat(secondary/@sortas, &quot; &quot;, secondary)), &quot; &quot;, normalize-space(concat(tertiary/@sortas, &quot; &quot;, tertiary)), &quot; &quot;, generate-id((ancestor-or-self::set|ancestor-or-self::book|ancestor-or-self::part|ancestor-or-self::reference|ancestor-or-self::partintro|ancestor-or-self::chapter|ancestor-or-self::appendix|ancestor-or-self::preface|ancestor-or-self::article|ancestor-or-self::section|ancestor-or-self::sect1|ancestor-or-self::sect2|ancestor-or-self::sect3|ancestor-or-self::sect4|ancestor-or-self::sect5|ancestor-or-self::refentry|ancestor-or-self::refsect1|ancestor-or-self::refsect2|ancestor-or-self::refsect3|ancestor-or-self::simplesect|ancestor-or-self::bibliography|ancestor-or-self::glossary|ancestor-or-self::index|ancestor-or-self::webpage)[last()]))"/>
+
+<xsl:key name="see-also" match="indexterm[seealso]" use="concat(normalize-space(concat(primary/@sortas, &quot; &quot;, primary)), &quot; &quot;, normalize-space(concat(secondary/@sortas, &quot; &quot;, secondary)), &quot; &quot;, normalize-space(concat(tertiary/@sortas, &quot; &quot;, tertiary)), &quot; &quot;, seealso)"/>
+
+<xsl:key name="see" match="indexterm[see]" use="concat(normalize-space(concat(primary/@sortas, &quot; &quot;, primary)), &quot; &quot;, normalize-space(concat(secondary/@sortas, &quot; &quot;, secondary)), &quot; &quot;, normalize-space(concat(tertiary/@sortas, &quot; &quot;, tertiary)), &quot; &quot;, see)"/>
+
+<xsl:key name="sections" match="*[@id or @xml:id]" use="@id|@xml:id"/>
+
+
+<xsl:template name="generate-index">
+ <xsl:param name="scope" select="(ancestor::book|/)[last()]"/>
+
+ <xsl:choose>
+ <xsl:when test="$index.method = 'kosek'">
+ <xsl:call-template name="generate-kosek-index">
+ <xsl:with-param name="scope" select="$scope"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="$index.method = 'kimber'">
+ <xsl:call-template name="generate-kimber-index">
+ <xsl:with-param name="scope" select="$scope"/>
+ </xsl:call-template>
+ </xsl:when>
+
+ <xsl:otherwise>
+ <xsl:call-template name="generate-basic-index">
+ <xsl:with-param name="scope" select="$scope"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="generate-basic-index">
+ <xsl:param name="scope" select="NOTANODE"/>
+
+ <xsl:variable name="role">
+ <xsl:if test="$index.on.role != 0">
+ <xsl:value-of select="@role"/>
+ </xsl:if>
+ </xsl:variable>
+
+ <xsl:variable name="type">
+ <xsl:if test="$index.on.type != 0">
+ <xsl:value-of select="@type"/>
+ </xsl:if>
+ </xsl:variable>
+
+ <xsl:variable name="terms" select="//indexterm [count(.|key('letter', translate(substring(normalize-space(concat(primary/@sortas, &quot; &quot;, primary)), 1, 1), 'Aa&#192;&#224;&#193;&#225;&#194;&#226;&#195;&#227;&#196;&#228;&#197;&#229;&#256;&#257;&#258;&#259;&#260;&#261;&#461;&#462;&#478;&#479;&#480;&#481;&#506;&#507;&#512;&#513;&#514;&#515;&#550;&#551;&#7680;&#7681;&#7834;&#7840;&#7841;&#7842;&#7843;&#7844;&#7845;&#7846;&#7847;&#7848;&#7849;&#7850;&#7851;&#7852;&#7853;&#7854;&#7855;&#7856;&#7857;&#7858;&#7859;&#7860;&#7861;&#7862;&#7863;Bb&#384;&#385;&#595;&#386;&#387;&#7682;&#7683;&#7684;&#7685;&#7686;&#7687;Cc&#199;&#231;&#262;&#263;&#264;&#265;&#266;&#267;&#268;&#269;&#391;&#392;&#597;&#7688;&#7689;Dd&#270;&#271;&#272;&#273;&#394;&#599;&#395;&#396;&#453;&#498;&#545;&#598;&#7690;&#7691;&#7692;&#7693;&#7694;&#7695;&#7696;&#7697;&#7698;&#7699;Ee&#200;&#232;&#201;&#233;&#202;&#234;&#203;&#235;&#274;&#275;&#276;&#277;&#278;&#279;&#280;&#281;&#282;&#283;&#516;&#517;&#518;&#519;&#552;&#553;&#7700;&#7701;&#7702;&#7703;&#7704;&#7705;&#7706;&#7707;&#7708;&#7709;&#7864;&#7865;&#7866;&#7867;&#7868;&#7869;&#7870;&#7871;&#7872;&#7873;&#7874;&#7875;&#7876;&#7877;&#7878;&#7879;Ff&#401;&#402;&#7710;&#7711;Gg&#284;&#285;&#286;&#287;&#288;&#289;&#290;&#291;&#403;&#608;&#484;&#485;&#486;&#487;&#500;&#501;&#7712;&#7713;Hh&#292;&#293;&#294;&#295;&#542;&#543;&#614;&#7714;&#7715;&#7716;&#7717;&#7718;&#7719;&#7720;&#7721;&#7722;&#7723;&#7830;Ii&#204;&#236;&#205;&#237;&#206;&#238;&#207;&#239;&#296;&#297;&#298;&#299;&#300;&#301;&#302;&#303;&#304;&#407;&#616;&#463;&#464;&#520;&#521;&#522;&#523;&#7724;&#7725;&#7726;&#7727;&#7880;&#7881;&#7882;&#7883;Jj&#308;&#309;&#496;&#669;Kk&#310;&#311;&#408;&#409;&#488;&#489;&#7728;&#7729;&#7730;&#7731;&#7732;&#7733;Ll&#313;&#314;&#315;&#316;&#317;&#318;&#319;&#320;&#321;&#322;&#410;&#456;&#564;&#619;&#620;&#621;&#7734;&#7735;&#7736;&#7737;&#7738;&#7739;&#7740;&#7741;Mm&#625;&#7742;&#7743;&#7744;&#7745;&#7746;&#7747;Nn&#209;&#241;&#323;&#324;&#325;&#326;&#327;&#328;&#413;&#626;&#414;&#544;&#459;&#504;&#505;&#565;&#627;&#7748;&#7749;&#7750;&#7751;&#7752;&#7753;&#7754;&#7755;Oo&#210;&#242;&#211;&#243;&#212;&#244;&#213;&#245;&#214;&#246;&#216;&#248;&#332;&#333;&#334;&#335;&#336;&#337;&#415;&#416;&#417;&#465;&#466;&#490;&#491;&#492;&#493;&#510;&#511;&#524;&#525;&#526;&#527;&#554;&#555;&#556;&#557;&#558;&#559;&#560;&#561;&#7756;&#7757;&#7758;&#7759;&#7760;&#7761;&#7762;&#7763;&#7884;&#7885;&#7886;&#7887;&#7888;&#7889;&#7890;&#7891;&#7892;&#7893;&#7894;&#7895;&#7896;&#7897;&#7898;&#7899;&#7900;&#7901;&#7902;&#7903;&#7904;&#7905;&#7906;&#7907;Pp&#420;&#421;&#7764;&#7765;&#7766;&#7767;Qq&#672;Rr&#340;&#341;&#342;&#343;&#344;&#345;&#528;&#529;&#530;&#531;&#636;&#637;&#638;&#7768;&#7769;&#7770;&#7771;&#7772;&#7773;&#7774;&#7775;Ss&#346;&#347;&#348;&#349;&#350;&#351;&#352;&#353;&#536;&#537;&#642;&#7776;&#7777;&#7778;&#7779;&#7780;&#7781;&#7782;&#7783;&#7784;&#7785;Tt&#354;&#355;&#356;&#357;&#358;&#359;&#427;&#428;&#429;&#430;&#648;&#538;&#539;&#566;&#7786;&#7787;&#7788;&#7789;&#7790;&#7791;&#7792;&#7793;&#7831;Uu&#217;&#249;&#218;&#250;&#219;&#251;&#220;&#252;&#360;&#361;&#362;&#363;&#364;&#365;&#366;&#367;&#368;&#369;&#370;&#371;&#431;&#432;&#467;&#468;&#469;&#470;&#471;&#472;&#473;&#474;&#475;&#476;&#532;&#533;&#534;&#535;&#7794;&#7795;&#7796;&#7797;&#7798;&#7799;&#7800;&#7801;&#7802;&#7803;&#7908;&#7909;&#7910;&#7911;&#7912;&#7913;&#7914;&#7915;&#7916;&#7917;&#7918;&#7919;&#7920;&#7921;Vv&#434;&#651;&#7804;&#7805;&#7806;&#7807;Ww&#372;&#373;&#7808;&#7809;&#7810;&#7811;&#7812;&#7813;&#7814;&#7815;&#7816;&#7817;&#7832;Xx&#7818;&#7819;&#7820;&#7821;Yy&#221;&#253;&#255;&#376;&#374;&#375;&#435;&#436;&#562;&#563;&#7822;&#7823;&#7833;&#7922;&#7923;&#7924;&#7925;&#7926;&#7927;&#7928;&#7929;Zz&#377;&#378;&#379;&#380;&#381;&#382;&#437;&#438;&#548;&#549;&#656;&#657;&#7824;&#7825;&#7826;&#7827;&#7828;&#7829;&#7829;', 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBCCCCCCCCCCCCCCCCCDDDDDDDDDDDDDDDDDDDDDDDDEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEFFFFFFGGGGGGGGGGGGGGGGGGGGHHHHHHHHHHHHHHHHHHHHIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIJJJJJJKKKKKKKKKKKKKKLLLLLLLLLLLLLLLLLLLLLLLLLLMMMMMMMMMNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOPPPPPPPPQQQRRRRRRRRRRRRRRRRRRRRRRRSSSSSSSSSSSSSSSSSSSSSSSTTTTTTTTTTTTTTTTTTTTTTTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUVVVVVVVVWWWWWWWWWWWWWWWXXXXXXYYYYYYYYYYYYYYYYYYYYYYYZZZZZZZZZZZZZZZZZZZZZ')) [count(ancestor::node()|$scope) = count(ancestor::node()) and ($role = @role or $type = @type or (string-length($role) = 0 and string-length($type) = 0))][1]) = 1 and not(@class = 'endofrange')]"/>
+
+ <xsl:variable name="alphabetical" select="$terms[contains(concat('Aa&#192;&#224;&#193;&#225;&#194;&#226;&#195;&#227;&#196;&#228;&#197;&#229;&#256;&#257;&#258;&#259;&#260;&#261;&#461;&#462;&#478;&#479;&#480;&#481;&#506;&#507;&#512;&#513;&#514;&#515;&#550;&#551;&#7680;&#7681;&#7834;&#7840;&#7841;&#7842;&#7843;&#7844;&#7845;&#7846;&#7847;&#7848;&#7849;&#7850;&#7851;&#7852;&#7853;&#7854;&#7855;&#7856;&#7857;&#7858;&#7859;&#7860;&#7861;&#7862;&#7863;Bb&#384;&#385;&#595;&#386;&#387;&#7682;&#7683;&#7684;&#7685;&#7686;&#7687;Cc&#199;&#231;&#262;&#263;&#264;&#265;&#266;&#267;&#268;&#269;&#391;&#392;&#597;&#7688;&#7689;Dd&#270;&#271;&#272;&#273;&#394;&#599;&#395;&#396;&#453;&#498;&#545;&#598;&#7690;&#7691;&#7692;&#7693;&#7694;&#7695;&#7696;&#7697;&#7698;&#7699;Ee&#200;&#232;&#201;&#233;&#202;&#234;&#203;&#235;&#274;&#275;&#276;&#277;&#278;&#279;&#280;&#281;&#282;&#283;&#516;&#517;&#518;&#519;&#552;&#553;&#7700;&#7701;&#7702;&#7703;&#7704;&#7705;&#7706;&#7707;&#7708;&#7709;&#7864;&#7865;&#7866;&#7867;&#7868;&#7869;&#7870;&#7871;&#7872;&#7873;&#7874;&#7875;&#7876;&#7877;&#7878;&#7879;Ff&#401;&#402;&#7710;&#7711;Gg&#284;&#285;&#286;&#287;&#288;&#289;&#290;&#291;&#403;&#608;&#484;&#485;&#486;&#487;&#500;&#501;&#7712;&#7713;Hh&#292;&#293;&#294;&#295;&#542;&#543;&#614;&#7714;&#7715;&#7716;&#7717;&#7718;&#7719;&#7720;&#7721;&#7722;&#7723;&#7830;Ii&#204;&#236;&#205;&#237;&#206;&#238;&#207;&#239;&#296;&#297;&#298;&#299;&#300;&#301;&#302;&#303;&#304;&#407;&#616;&#463;&#464;&#520;&#521;&#522;&#523;&#7724;&#7725;&#7726;&#7727;&#7880;&#7881;&#7882;&#7883;Jj&#308;&#309;&#496;&#669;Kk&#310;&#311;&#408;&#409;&#488;&#489;&#7728;&#7729;&#7730;&#7731;&#7732;&#7733;Ll&#313;&#314;&#315;&#316;&#317;&#318;&#319;&#320;&#321;&#322;&#410;&#456;&#564;&#619;&#620;&#621;&#7734;&#7735;&#7736;&#7737;&#7738;&#7739;&#7740;&#7741;Mm&#625;&#7742;&#7743;&#7744;&#7745;&#7746;&#7747;Nn&#209;&#241;&#323;&#324;&#325;&#326;&#327;&#328;&#413;&#626;&#414;&#544;&#459;&#504;&#505;&#565;&#627;&#7748;&#7749;&#7750;&#7751;&#7752;&#7753;&#7754;&#7755;Oo&#210;&#242;&#211;&#243;&#212;&#244;&#213;&#245;&#214;&#246;&#216;&#248;&#332;&#333;&#334;&#335;&#336;&#337;&#415;&#416;&#417;&#465;&#466;&#490;&#491;&#492;&#493;&#510;&#511;&#524;&#525;&#526;&#527;&#554;&#555;&#556;&#557;&#558;&#559;&#560;&#561;&#7756;&#7757;&#7758;&#7759;&#7760;&#7761;&#7762;&#7763;&#7884;&#7885;&#7886;&#7887;&#7888;&#7889;&#7890;&#7891;&#7892;&#7893;&#7894;&#7895;&#7896;&#7897;&#7898;&#7899;&#7900;&#7901;&#7902;&#7903;&#7904;&#7905;&#7906;&#7907;Pp&#420;&#421;&#7764;&#7765;&#7766;&#7767;Qq&#672;Rr&#340;&#341;&#342;&#343;&#344;&#345;&#528;&#529;&#530;&#531;&#636;&#637;&#638;&#7768;&#7769;&#7770;&#7771;&#7772;&#7773;&#7774;&#7775;Ss&#346;&#347;&#348;&#349;&#350;&#351;&#352;&#353;&#536;&#537;&#642;&#7776;&#7777;&#7778;&#7779;&#7780;&#7781;&#7782;&#7783;&#7784;&#7785;Tt&#354;&#355;&#356;&#357;&#358;&#359;&#427;&#428;&#429;&#430;&#648;&#538;&#539;&#566;&#7786;&#7787;&#7788;&#7789;&#7790;&#7791;&#7792;&#7793;&#7831;Uu&#217;&#249;&#218;&#250;&#219;&#251;&#220;&#252;&#360;&#361;&#362;&#363;&#364;&#365;&#366;&#367;&#368;&#369;&#370;&#371;&#431;&#432;&#467;&#468;&#469;&#470;&#471;&#472;&#473;&#474;&#475;&#476;&#532;&#533;&#534;&#535;&#7794;&#7795;&#7796;&#7797;&#7798;&#7799;&#7800;&#7801;&#7802;&#7803;&#7908;&#7909;&#7910;&#7911;&#7912;&#7913;&#7914;&#7915;&#7916;&#7917;&#7918;&#7919;&#7920;&#7921;Vv&#434;&#651;&#7804;&#7805;&#7806;&#7807;Ww&#372;&#373;&#7808;&#7809;&#7810;&#7811;&#7812;&#7813;&#7814;&#7815;&#7816;&#7817;&#7832;Xx&#7818;&#7819;&#7820;&#7821;Yy&#221;&#253;&#255;&#376;&#374;&#375;&#435;&#436;&#562;&#563;&#7822;&#7823;&#7833;&#7922;&#7923;&#7924;&#7925;&#7926;&#7927;&#7928;&#7929;Zz&#377;&#378;&#379;&#380;&#381;&#382;&#437;&#438;&#548;&#549;&#656;&#657;&#7824;&#7825;&#7826;&#7827;&#7828;&#7829;&#7829;', 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBCCCCCCCCCCCCCCCCCDDDDDDDDDDDDDDDDDDDDDDDDEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEFFFFFFGGGGGGGGGGGGGGGGGGGGHHHHHHHHHHHHHHHHHHHHIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIJJJJJJKKKKKKKKKKKKKKLLLLLLLLLLLLLLLLLLLLLLLLLLMMMMMMMMMNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOPPPPPPPPQQQRRRRRRRRRRRRRRRRRRRRRRRSSSSSSSSSSSSSSSSSSSSSSSTTTTTTTTTTTTTTTTTTTTTTTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUVVVVVVVVWWWWWWWWWWWWWWWXXXXXXYYYYYYYYYYYYYYYYYYYYYYYZZZZZZZZZZZZZZZZZZZZZ'), substring(normalize-space(concat(primary/@sortas, &quot; &quot;, primary)), 1, 1))]"/>
+
+ <xsl:variable name="others" select="$terms[not(contains(concat('Aa&#192;&#224;&#193;&#225;&#194;&#226;&#195;&#227;&#196;&#228;&#197;&#229;&#256;&#257;&#258;&#259;&#260;&#261;&#461;&#462;&#478;&#479;&#480;&#481;&#506;&#507;&#512;&#513;&#514;&#515;&#550;&#551;&#7680;&#7681;&#7834;&#7840;&#7841;&#7842;&#7843;&#7844;&#7845;&#7846;&#7847;&#7848;&#7849;&#7850;&#7851;&#7852;&#7853;&#7854;&#7855;&#7856;&#7857;&#7858;&#7859;&#7860;&#7861;&#7862;&#7863;Bb&#384;&#385;&#595;&#386;&#387;&#7682;&#7683;&#7684;&#7685;&#7686;&#7687;Cc&#199;&#231;&#262;&#263;&#264;&#265;&#266;&#267;&#268;&#269;&#391;&#392;&#597;&#7688;&#7689;Dd&#270;&#271;&#272;&#273;&#394;&#599;&#395;&#396;&#453;&#498;&#545;&#598;&#7690;&#7691;&#7692;&#7693;&#7694;&#7695;&#7696;&#7697;&#7698;&#7699;Ee&#200;&#232;&#201;&#233;&#202;&#234;&#203;&#235;&#274;&#275;&#276;&#277;&#278;&#279;&#280;&#281;&#282;&#283;&#516;&#517;&#518;&#519;&#552;&#553;&#7700;&#7701;&#7702;&#7703;&#7704;&#7705;&#7706;&#7707;&#7708;&#7709;&#7864;&#7865;&#7866;&#7867;&#7868;&#7869;&#7870;&#7871;&#7872;&#7873;&#7874;&#7875;&#7876;&#7877;&#7878;&#7879;Ff&#401;&#402;&#7710;&#7711;Gg&#284;&#285;&#286;&#287;&#288;&#289;&#290;&#291;&#403;&#608;&#484;&#485;&#486;&#487;&#500;&#501;&#7712;&#7713;Hh&#292;&#293;&#294;&#295;&#542;&#543;&#614;&#7714;&#7715;&#7716;&#7717;&#7718;&#7719;&#7720;&#7721;&#7722;&#7723;&#7830;Ii&#204;&#236;&#205;&#237;&#206;&#238;&#207;&#239;&#296;&#297;&#298;&#299;&#300;&#301;&#302;&#303;&#304;&#407;&#616;&#463;&#464;&#520;&#521;&#522;&#523;&#7724;&#7725;&#7726;&#7727;&#7880;&#7881;&#7882;&#7883;Jj&#308;&#309;&#496;&#669;Kk&#310;&#311;&#408;&#409;&#488;&#489;&#7728;&#7729;&#7730;&#7731;&#7732;&#7733;Ll&#313;&#314;&#315;&#316;&#317;&#318;&#319;&#320;&#321;&#322;&#410;&#456;&#564;&#619;&#620;&#621;&#7734;&#7735;&#7736;&#7737;&#7738;&#7739;&#7740;&#7741;Mm&#625;&#7742;&#7743;&#7744;&#7745;&#7746;&#7747;Nn&#209;&#241;&#323;&#324;&#325;&#326;&#327;&#328;&#413;&#626;&#414;&#544;&#459;&#504;&#505;&#565;&#627;&#7748;&#7749;&#7750;&#7751;&#7752;&#7753;&#7754;&#7755;Oo&#210;&#242;&#211;&#243;&#212;&#244;&#213;&#245;&#214;&#246;&#216;&#248;&#332;&#333;&#334;&#335;&#336;&#337;&#415;&#416;&#417;&#465;&#466;&#490;&#491;&#492;&#493;&#510;&#511;&#524;&#525;&#526;&#527;&#554;&#555;&#556;&#557;&#558;&#559;&#560;&#561;&#7756;&#7757;&#7758;&#7759;&#7760;&#7761;&#7762;&#7763;&#7884;&#7885;&#7886;&#7887;&#7888;&#7889;&#7890;&#7891;&#7892;&#7893;&#7894;&#7895;&#7896;&#7897;&#7898;&#7899;&#7900;&#7901;&#7902;&#7903;&#7904;&#7905;&#7906;&#7907;Pp&#420;&#421;&#7764;&#7765;&#7766;&#7767;Qq&#672;Rr&#340;&#341;&#342;&#343;&#344;&#345;&#528;&#529;&#530;&#531;&#636;&#637;&#638;&#7768;&#7769;&#7770;&#7771;&#7772;&#7773;&#7774;&#7775;Ss&#346;&#347;&#348;&#349;&#350;&#351;&#352;&#353;&#536;&#537;&#642;&#7776;&#7777;&#7778;&#7779;&#7780;&#7781;&#7782;&#7783;&#7784;&#7785;Tt&#354;&#355;&#356;&#357;&#358;&#359;&#427;&#428;&#429;&#430;&#648;&#538;&#539;&#566;&#7786;&#7787;&#7788;&#7789;&#7790;&#7791;&#7792;&#7793;&#7831;Uu&#217;&#249;&#218;&#250;&#219;&#251;&#220;&#252;&#360;&#361;&#362;&#363;&#364;&#365;&#366;&#367;&#368;&#369;&#370;&#371;&#431;&#432;&#467;&#468;&#469;&#470;&#471;&#472;&#473;&#474;&#475;&#476;&#532;&#533;&#534;&#535;&#7794;&#7795;&#7796;&#7797;&#7798;&#7799;&#7800;&#7801;&#7802;&#7803;&#7908;&#7909;&#7910;&#7911;&#7912;&#7913;&#7914;&#7915;&#7916;&#7917;&#7918;&#7919;&#7920;&#7921;Vv&#434;&#651;&#7804;&#7805;&#7806;&#7807;Ww&#372;&#373;&#7808;&#7809;&#7810;&#7811;&#7812;&#7813;&#7814;&#7815;&#7816;&#7817;&#7832;Xx&#7818;&#7819;&#7820;&#7821;Yy&#221;&#253;&#255;&#376;&#374;&#375;&#435;&#436;&#562;&#563;&#7822;&#7823;&#7833;&#7922;&#7923;&#7924;&#7925;&#7926;&#7927;&#7928;&#7929;Zz&#377;&#378;&#379;&#380;&#381;&#382;&#437;&#438;&#548;&#549;&#656;&#657;&#7824;&#7825;&#7826;&#7827;&#7828;&#7829;&#7829;', 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBCCCCCCCCCCCCCCCCCDDDDDDDDDDDDDDDDDDDDDDDDEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEFFFFFFGGGGGGGGGGGGGGGGGGGGHHHHHHHHHHHHHHHHHHHHIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIJJJJJJKKKKKKKKKKKKKKLLLLLLLLLLLLLLLLLLLLLLLLLLMMMMMMMMMNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOPPPPPPPPQQQRRRRRRRRRRRRRRRRRRRRRRRSSSSSSSSSSSSSSSSSSSSSSSTTTTTTTTTTTTTTTTTTTTTTTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUVVVVVVVVWWWWWWWWWWWWWWWXXXXXXYYYYYYYYYYYYYYYYYYYYYYYZZZZZZZZZZZZZZZZZZZZZ'), substring(normalize-space(concat(primary/@sortas, &quot; &quot;, primary)), 1, 1)))]"/>
+ <div class="index">
+ <xsl:if test="$others">
+ <xsl:choose>
+ <xsl:when test="normalize-space($type) != '' and $others[@type = $type][count(.|key('primary', normalize-space(concat(primary/@sortas, &quot; &quot;, primary)))[count(ancestor::node()|$scope) = count(ancestor::node()) and ($role = @role or $type = @type or (string-length($role) = 0 and string-length($type) = 0))][1]) = 1]">
+ <div class="indexdiv">
+ <h3>
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'index symbols'"/>
+ </xsl:call-template>
+ </h3>
+ <dl>
+ <xsl:apply-templates select="$others[count(.|key('primary', normalize-space(concat(primary/@sortas, &quot; &quot;, primary)))[count(ancestor::node()|$scope) = count(ancestor::node()) and ($role = @role or $type = @type or (string-length($role) = 0 and string-length($type) = 0))][1]) = 1]" mode="index-symbol-div">
+ <xsl:with-param name="position" select="position()"/>
+ <xsl:with-param name="scope" select="$scope"/>
+ <xsl:with-param name="role" select="$role"/>
+ <xsl:with-param name="type" select="$type"/>
+ <xsl:sort select="translate(normalize-space(concat(primary/@sortas, &quot; &quot;, primary)), 'Aa&#192;&#224;&#193;&#225;&#194;&#226;&#195;&#227;&#196;&#228;&#197;&#229;&#256;&#257;&#258;&#259;&#260;&#261;&#461;&#462;&#478;&#479;&#480;&#481;&#506;&#507;&#512;&#513;&#514;&#515;&#550;&#551;&#7680;&#7681;&#7834;&#7840;&#7841;&#7842;&#7843;&#7844;&#7845;&#7846;&#7847;&#7848;&#7849;&#7850;&#7851;&#7852;&#7853;&#7854;&#7855;&#7856;&#7857;&#7858;&#7859;&#7860;&#7861;&#7862;&#7863;Bb&#384;&#385;&#595;&#386;&#387;&#7682;&#7683;&#7684;&#7685;&#7686;&#7687;Cc&#199;&#231;&#262;&#263;&#264;&#265;&#266;&#267;&#268;&#269;&#391;&#392;&#597;&#7688;&#7689;Dd&#270;&#271;&#272;&#273;&#394;&#599;&#395;&#396;&#453;&#498;&#545;&#598;&#7690;&#7691;&#7692;&#7693;&#7694;&#7695;&#7696;&#7697;&#7698;&#7699;Ee&#200;&#232;&#201;&#233;&#202;&#234;&#203;&#235;&#274;&#275;&#276;&#277;&#278;&#279;&#280;&#281;&#282;&#283;&#516;&#517;&#518;&#519;&#552;&#553;&#7700;&#7701;&#7702;&#7703;&#7704;&#7705;&#7706;&#7707;&#7708;&#7709;&#7864;&#7865;&#7866;&#7867;&#7868;&#7869;&#7870;&#7871;&#7872;&#7873;&#7874;&#7875;&#7876;&#7877;&#7878;&#7879;Ff&#401;&#402;&#7710;&#7711;Gg&#284;&#285;&#286;&#287;&#288;&#289;&#290;&#291;&#403;&#608;&#484;&#485;&#486;&#487;&#500;&#501;&#7712;&#7713;Hh&#292;&#293;&#294;&#295;&#542;&#543;&#614;&#7714;&#7715;&#7716;&#7717;&#7718;&#7719;&#7720;&#7721;&#7722;&#7723;&#7830;Ii&#204;&#236;&#205;&#237;&#206;&#238;&#207;&#239;&#296;&#297;&#298;&#299;&#300;&#301;&#302;&#303;&#304;&#407;&#616;&#463;&#464;&#520;&#521;&#522;&#523;&#7724;&#7725;&#7726;&#7727;&#7880;&#7881;&#7882;&#7883;Jj&#308;&#309;&#496;&#669;Kk&#310;&#311;&#408;&#409;&#488;&#489;&#7728;&#7729;&#7730;&#7731;&#7732;&#7733;Ll&#313;&#314;&#315;&#316;&#317;&#318;&#319;&#320;&#321;&#322;&#410;&#456;&#564;&#619;&#620;&#621;&#7734;&#7735;&#7736;&#7737;&#7738;&#7739;&#7740;&#7741;Mm&#625;&#7742;&#7743;&#7744;&#7745;&#7746;&#7747;Nn&#209;&#241;&#323;&#324;&#325;&#326;&#327;&#328;&#413;&#626;&#414;&#544;&#459;&#504;&#505;&#565;&#627;&#7748;&#7749;&#7750;&#7751;&#7752;&#7753;&#7754;&#7755;Oo&#210;&#242;&#211;&#243;&#212;&#244;&#213;&#245;&#214;&#246;&#216;&#248;&#332;&#333;&#334;&#335;&#336;&#337;&#415;&#416;&#417;&#465;&#466;&#490;&#491;&#492;&#493;&#510;&#511;&#524;&#525;&#526;&#527;&#554;&#555;&#556;&#557;&#558;&#559;&#560;&#561;&#7756;&#7757;&#7758;&#7759;&#7760;&#7761;&#7762;&#7763;&#7884;&#7885;&#7886;&#7887;&#7888;&#7889;&#7890;&#7891;&#7892;&#7893;&#7894;&#7895;&#7896;&#7897;&#7898;&#7899;&#7900;&#7901;&#7902;&#7903;&#7904;&#7905;&#7906;&#7907;Pp&#420;&#421;&#7764;&#7765;&#7766;&#7767;Qq&#672;Rr&#340;&#341;&#342;&#343;&#344;&#345;&#528;&#529;&#530;&#531;&#636;&#637;&#638;&#7768;&#7769;&#7770;&#7771;&#7772;&#7773;&#7774;&#7775;Ss&#346;&#347;&#348;&#349;&#350;&#351;&#352;&#353;&#536;&#537;&#642;&#7776;&#7777;&#7778;&#7779;&#7780;&#7781;&#7782;&#7783;&#7784;&#7785;Tt&#354;&#355;&#356;&#357;&#358;&#359;&#427;&#428;&#429;&#430;&#648;&#538;&#539;&#566;&#7786;&#7787;&#7788;&#7789;&#7790;&#7791;&#7792;&#7793;&#7831;Uu&#217;&#249;&#218;&#250;&#219;&#251;&#220;&#252;&#360;&#361;&#362;&#363;&#364;&#365;&#366;&#367;&#368;&#369;&#370;&#371;&#431;&#432;&#467;&#468;&#469;&#470;&#471;&#472;&#473;&#474;&#475;&#476;&#532;&#533;&#534;&#535;&#7794;&#7795;&#7796;&#7797;&#7798;&#7799;&#7800;&#7801;&#7802;&#7803;&#7908;&#7909;&#7910;&#7911;&#7912;&#7913;&#7914;&#7915;&#7916;&#7917;&#7918;&#7919;&#7920;&#7921;Vv&#434;&#651;&#7804;&#7805;&#7806;&#7807;Ww&#372;&#373;&#7808;&#7809;&#7810;&#7811;&#7812;&#7813;&#7814;&#7815;&#7816;&#7817;&#7832;Xx&#7818;&#7819;&#7820;&#7821;Yy&#221;&#253;&#255;&#376;&#374;&#375;&#435;&#436;&#562;&#563;&#7822;&#7823;&#7833;&#7922;&#7923;&#7924;&#7925;&#7926;&#7927;&#7928;&#7929;Zz&#377;&#378;&#379;&#380;&#381;&#382;&#437;&#438;&#548;&#549;&#656;&#657;&#7824;&#7825;&#7826;&#7827;&#7828;&#7829;&#7829;', 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBCCCCCCCCCCCCCCCCCDDDDDDDDDDDDDDDDDDDDDDDDEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEFFFFFFGGGGGGGGGGGGGGGGGGGGHHHHHHHHHHHHHHHHHHHHIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIJJJJJJKKKKKKKKKKKKKKLLLLLLLLLLLLLLLLLLLLLLLLLLMMMMMMMMMNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOPPPPPPPPQQQRRRRRRRRRRRRRRRRRRRRRRRSSSSSSSSSSSSSSSSSSSSSSSTTTTTTTTTTTTTTTTTTTTTTTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUVVVVVVVVWWWWWWWWWWWWWWWXXXXXXYYYYYYYYYYYYYYYYYYYYYYYZZZZZZZZZZZZZZZZZZZZZ')"/>
+ </xsl:apply-templates>
+ </dl>
+ </div>
+ </xsl:when>
+ <xsl:when test="normalize-space($type) != ''">
+ <!-- Output nothing, as there isn't a match for $other using this $type -->
+ </xsl:when>
+ <xsl:otherwise>
+ <div class="indexdiv">
+ <h3>
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'index symbols'"/>
+ </xsl:call-template>
+ </h3>
+ <dl>
+ <xsl:apply-templates select="$others[count(.|key('primary', normalize-space(concat(primary/@sortas, &quot; &quot;, primary)))[count(ancestor::node()|$scope) = count(ancestor::node()) and ($role = @role or $type = @type or (string-length($role) = 0 and string-length($type) = 0))][1]) = 1]" mode="index-symbol-div">
+ <xsl:with-param name="position" select="position()"/>
+ <xsl:with-param name="scope" select="$scope"/>
+ <xsl:with-param name="role" select="$role"/>
+ <xsl:with-param name="type" select="$type"/>
+ <xsl:sort select="translate(normalize-space(concat(primary/@sortas, &quot; &quot;, primary)), 'Aa&#192;&#224;&#193;&#225;&#194;&#226;&#195;&#227;&#196;&#228;&#197;&#229;&#256;&#257;&#258;&#259;&#260;&#261;&#461;&#462;&#478;&#479;&#480;&#481;&#506;&#507;&#512;&#513;&#514;&#515;&#550;&#551;&#7680;&#7681;&#7834;&#7840;&#7841;&#7842;&#7843;&#7844;&#7845;&#7846;&#7847;&#7848;&#7849;&#7850;&#7851;&#7852;&#7853;&#7854;&#7855;&#7856;&#7857;&#7858;&#7859;&#7860;&#7861;&#7862;&#7863;Bb&#384;&#385;&#595;&#386;&#387;&#7682;&#7683;&#7684;&#7685;&#7686;&#7687;Cc&#199;&#231;&#262;&#263;&#264;&#265;&#266;&#267;&#268;&#269;&#391;&#392;&#597;&#7688;&#7689;Dd&#270;&#271;&#272;&#273;&#394;&#599;&#395;&#396;&#453;&#498;&#545;&#598;&#7690;&#7691;&#7692;&#7693;&#7694;&#7695;&#7696;&#7697;&#7698;&#7699;Ee&#200;&#232;&#201;&#233;&#202;&#234;&#203;&#235;&#274;&#275;&#276;&#277;&#278;&#279;&#280;&#281;&#282;&#283;&#516;&#517;&#518;&#519;&#552;&#553;&#7700;&#7701;&#7702;&#7703;&#7704;&#7705;&#7706;&#7707;&#7708;&#7709;&#7864;&#7865;&#7866;&#7867;&#7868;&#7869;&#7870;&#7871;&#7872;&#7873;&#7874;&#7875;&#7876;&#7877;&#7878;&#7879;Ff&#401;&#402;&#7710;&#7711;Gg&#284;&#285;&#286;&#287;&#288;&#289;&#290;&#291;&#403;&#608;&#484;&#485;&#486;&#487;&#500;&#501;&#7712;&#7713;Hh&#292;&#293;&#294;&#295;&#542;&#543;&#614;&#7714;&#7715;&#7716;&#7717;&#7718;&#7719;&#7720;&#7721;&#7722;&#7723;&#7830;Ii&#204;&#236;&#205;&#237;&#206;&#238;&#207;&#239;&#296;&#297;&#298;&#299;&#300;&#301;&#302;&#303;&#304;&#407;&#616;&#463;&#464;&#520;&#521;&#522;&#523;&#7724;&#7725;&#7726;&#7727;&#7880;&#7881;&#7882;&#7883;Jj&#308;&#309;&#496;&#669;Kk&#310;&#311;&#408;&#409;&#488;&#489;&#7728;&#7729;&#7730;&#7731;&#7732;&#7733;Ll&#313;&#314;&#315;&#316;&#317;&#318;&#319;&#320;&#321;&#322;&#410;&#456;&#564;&#619;&#620;&#621;&#7734;&#7735;&#7736;&#7737;&#7738;&#7739;&#7740;&#7741;Mm&#625;&#7742;&#7743;&#7744;&#7745;&#7746;&#7747;Nn&#209;&#241;&#323;&#324;&#325;&#326;&#327;&#328;&#413;&#626;&#414;&#544;&#459;&#504;&#505;&#565;&#627;&#7748;&#7749;&#7750;&#7751;&#7752;&#7753;&#7754;&#7755;Oo&#210;&#242;&#211;&#243;&#212;&#244;&#213;&#245;&#214;&#246;&#216;&#248;&#332;&#333;&#334;&#335;&#336;&#337;&#415;&#416;&#417;&#465;&#466;&#490;&#491;&#492;&#493;&#510;&#511;&#524;&#525;&#526;&#527;&#554;&#555;&#556;&#557;&#558;&#559;&#560;&#561;&#7756;&#7757;&#7758;&#7759;&#7760;&#7761;&#7762;&#7763;&#7884;&#7885;&#7886;&#7887;&#7888;&#7889;&#7890;&#7891;&#7892;&#7893;&#7894;&#7895;&#7896;&#7897;&#7898;&#7899;&#7900;&#7901;&#7902;&#7903;&#7904;&#7905;&#7906;&#7907;Pp&#420;&#421;&#7764;&#7765;&#7766;&#7767;Qq&#672;Rr&#340;&#341;&#342;&#343;&#344;&#345;&#528;&#529;&#530;&#531;&#636;&#637;&#638;&#7768;&#7769;&#7770;&#7771;&#7772;&#7773;&#7774;&#7775;Ss&#346;&#347;&#348;&#349;&#350;&#351;&#352;&#353;&#536;&#537;&#642;&#7776;&#7777;&#7778;&#7779;&#7780;&#7781;&#7782;&#7783;&#7784;&#7785;Tt&#354;&#355;&#356;&#357;&#358;&#359;&#427;&#428;&#429;&#430;&#648;&#538;&#539;&#566;&#7786;&#7787;&#7788;&#7789;&#7790;&#7791;&#7792;&#7793;&#7831;Uu&#217;&#249;&#218;&#250;&#219;&#251;&#220;&#252;&#360;&#361;&#362;&#363;&#364;&#365;&#366;&#367;&#368;&#369;&#370;&#371;&#431;&#432;&#467;&#468;&#469;&#470;&#471;&#472;&#473;&#474;&#475;&#476;&#532;&#533;&#534;&#535;&#7794;&#7795;&#7796;&#7797;&#7798;&#7799;&#7800;&#7801;&#7802;&#7803;&#7908;&#7909;&#7910;&#7911;&#7912;&#7913;&#7914;&#7915;&#7916;&#7917;&#7918;&#7919;&#7920;&#7921;Vv&#434;&#651;&#7804;&#7805;&#7806;&#7807;Ww&#372;&#373;&#7808;&#7809;&#7810;&#7811;&#7812;&#7813;&#7814;&#7815;&#7816;&#7817;&#7832;Xx&#7818;&#7819;&#7820;&#7821;Yy&#221;&#253;&#255;&#376;&#374;&#375;&#435;&#436;&#562;&#563;&#7822;&#7823;&#7833;&#7922;&#7923;&#7924;&#7925;&#7926;&#7927;&#7928;&#7929;Zz&#377;&#378;&#379;&#380;&#381;&#382;&#437;&#438;&#548;&#549;&#656;&#657;&#7824;&#7825;&#7826;&#7827;&#7828;&#7829;&#7829;', 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBCCCCCCCCCCCCCCCCCDDDDDDDDDDDDDDDDDDDDDDDDEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEFFFFFFGGGGGGGGGGGGGGGGGGGGHHHHHHHHHHHHHHHHHHHHIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIJJJJJJKKKKKKKKKKKKKKLLLLLLLLLLLLLLLLLLLLLLLLLLMMMMMMMMMNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOPPPPPPPPQQQRRRRRRRRRRRRRRRRRRRRRRRSSSSSSSSSSSSSSSSSSSSSSSTTTTTTTTTTTTTTTTTTTTTTTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUVVVVVVVVWWWWWWWWWWWWWWWXXXXXXYYYYYYYYYYYYYYYYYYYYYYYZZZZZZZZZZZZZZZZZZZZZ')"/>
+ </xsl:apply-templates>
+ </dl>
+ </div>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:if>
+
+ <xsl:apply-templates select="$alphabetical[count(.|key('letter', translate(substring(normalize-space(concat(primary/@sortas, &quot; &quot;, primary)), 1, 1), 'Aa&#192;&#224;&#193;&#225;&#194;&#226;&#195;&#227;&#196;&#228;&#197;&#229;&#256;&#257;&#258;&#259;&#260;&#261;&#461;&#462;&#478;&#479;&#480;&#481;&#506;&#507;&#512;&#513;&#514;&#515;&#550;&#551;&#7680;&#7681;&#7834;&#7840;&#7841;&#7842;&#7843;&#7844;&#7845;&#7846;&#7847;&#7848;&#7849;&#7850;&#7851;&#7852;&#7853;&#7854;&#7855;&#7856;&#7857;&#7858;&#7859;&#7860;&#7861;&#7862;&#7863;Bb&#384;&#385;&#595;&#386;&#387;&#7682;&#7683;&#7684;&#7685;&#7686;&#7687;Cc&#199;&#231;&#262;&#263;&#264;&#265;&#266;&#267;&#268;&#269;&#391;&#392;&#597;&#7688;&#7689;Dd&#270;&#271;&#272;&#273;&#394;&#599;&#395;&#396;&#453;&#498;&#545;&#598;&#7690;&#7691;&#7692;&#7693;&#7694;&#7695;&#7696;&#7697;&#7698;&#7699;Ee&#200;&#232;&#201;&#233;&#202;&#234;&#203;&#235;&#274;&#275;&#276;&#277;&#278;&#279;&#280;&#281;&#282;&#283;&#516;&#517;&#518;&#519;&#552;&#553;&#7700;&#7701;&#7702;&#7703;&#7704;&#7705;&#7706;&#7707;&#7708;&#7709;&#7864;&#7865;&#7866;&#7867;&#7868;&#7869;&#7870;&#7871;&#7872;&#7873;&#7874;&#7875;&#7876;&#7877;&#7878;&#7879;Ff&#401;&#402;&#7710;&#7711;Gg&#284;&#285;&#286;&#287;&#288;&#289;&#290;&#291;&#403;&#608;&#484;&#485;&#486;&#487;&#500;&#501;&#7712;&#7713;Hh&#292;&#293;&#294;&#295;&#542;&#543;&#614;&#7714;&#7715;&#7716;&#7717;&#7718;&#7719;&#7720;&#7721;&#7722;&#7723;&#7830;Ii&#204;&#236;&#205;&#237;&#206;&#238;&#207;&#239;&#296;&#297;&#298;&#299;&#300;&#301;&#302;&#303;&#304;&#407;&#616;&#463;&#464;&#520;&#521;&#522;&#523;&#7724;&#7725;&#7726;&#7727;&#7880;&#7881;&#7882;&#7883;Jj&#308;&#309;&#496;&#669;Kk&#310;&#311;&#408;&#409;&#488;&#489;&#7728;&#7729;&#7730;&#7731;&#7732;&#7733;Ll&#313;&#314;&#315;&#316;&#317;&#318;&#319;&#320;&#321;&#322;&#410;&#456;&#564;&#619;&#620;&#621;&#7734;&#7735;&#7736;&#7737;&#7738;&#7739;&#7740;&#7741;Mm&#625;&#7742;&#7743;&#7744;&#7745;&#7746;&#7747;Nn&#209;&#241;&#323;&#324;&#325;&#326;&#327;&#328;&#413;&#626;&#414;&#544;&#459;&#504;&#505;&#565;&#627;&#7748;&#7749;&#7750;&#7751;&#7752;&#7753;&#7754;&#7755;Oo&#210;&#242;&#211;&#243;&#212;&#244;&#213;&#245;&#214;&#246;&#216;&#248;&#332;&#333;&#334;&#335;&#336;&#337;&#415;&#416;&#417;&#465;&#466;&#490;&#491;&#492;&#493;&#510;&#511;&#524;&#525;&#526;&#527;&#554;&#555;&#556;&#557;&#558;&#559;&#560;&#561;&#7756;&#7757;&#7758;&#7759;&#7760;&#7761;&#7762;&#7763;&#7884;&#7885;&#7886;&#7887;&#7888;&#7889;&#7890;&#7891;&#7892;&#7893;&#7894;&#7895;&#7896;&#7897;&#7898;&#7899;&#7900;&#7901;&#7902;&#7903;&#7904;&#7905;&#7906;&#7907;Pp&#420;&#421;&#7764;&#7765;&#7766;&#7767;Qq&#672;Rr&#340;&#341;&#342;&#343;&#344;&#345;&#528;&#529;&#530;&#531;&#636;&#637;&#638;&#7768;&#7769;&#7770;&#7771;&#7772;&#7773;&#7774;&#7775;Ss&#346;&#347;&#348;&#349;&#350;&#351;&#352;&#353;&#536;&#537;&#642;&#7776;&#7777;&#7778;&#7779;&#7780;&#7781;&#7782;&#7783;&#7784;&#7785;Tt&#354;&#355;&#356;&#357;&#358;&#359;&#427;&#428;&#429;&#430;&#648;&#538;&#539;&#566;&#7786;&#7787;&#7788;&#7789;&#7790;&#7791;&#7792;&#7793;&#7831;Uu&#217;&#249;&#218;&#250;&#219;&#251;&#220;&#252;&#360;&#361;&#362;&#363;&#364;&#365;&#366;&#367;&#368;&#369;&#370;&#371;&#431;&#432;&#467;&#468;&#469;&#470;&#471;&#472;&#473;&#474;&#475;&#476;&#532;&#533;&#534;&#535;&#7794;&#7795;&#7796;&#7797;&#7798;&#7799;&#7800;&#7801;&#7802;&#7803;&#7908;&#7909;&#7910;&#7911;&#7912;&#7913;&#7914;&#7915;&#7916;&#7917;&#7918;&#7919;&#7920;&#7921;Vv&#434;&#651;&#7804;&#7805;&#7806;&#7807;Ww&#372;&#373;&#7808;&#7809;&#7810;&#7811;&#7812;&#7813;&#7814;&#7815;&#7816;&#7817;&#7832;Xx&#7818;&#7819;&#7820;&#7821;Yy&#221;&#253;&#255;&#376;&#374;&#375;&#435;&#436;&#562;&#563;&#7822;&#7823;&#7833;&#7922;&#7923;&#7924;&#7925;&#7926;&#7927;&#7928;&#7929;Zz&#377;&#378;&#379;&#380;&#381;&#382;&#437;&#438;&#548;&#549;&#656;&#657;&#7824;&#7825;&#7826;&#7827;&#7828;&#7829;&#7829;','AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBCCCCCCCCCCCCCCCCCDDDDDDDDDDDDDDDDDDDDDDDDEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEFFFFFFGGGGGGGGGGGGGGGGGGGGHHHHHHHHHHHHHHHHHHHHIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIJJJJJJKKKKKKKKKKKKKKLLLLLLLLLLLLLLLLLLLLLLLLLLMMMMMMMMMNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOPPPPPPPPQQQRRRRRRRRRRRRRRRRRRRRRRRSSSSSSSSSSSSSSSSSSSSSSSTTTTTTTTTTTTTTTTTTTTTTTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUVVVVVVVVWWWWWWWWWWWWWWWXXXXXXYYYYYYYYYYYYYYYYYYYYYYYZZZZZZZZZZZZZZZZZZZZZ'))[count(ancestor::node()|$scope) = count(ancestor::node()) and ($role = @role or $type = @type or (string-length($role) = 0 and string-length($type) = 0))][1]) = 1]" mode="index-div-basic">
+ <xsl:with-param name="position" select="position()"/>
+ <xsl:with-param name="scope" select="$scope"/>
+ <xsl:with-param name="role" select="$role"/>
+ <xsl:with-param name="type" select="$type"/>
+ <xsl:sort select="translate(normalize-space(concat(primary/@sortas, &quot; &quot;, primary)), 'Aa&#192;&#224;&#193;&#225;&#194;&#226;&#195;&#227;&#196;&#228;&#197;&#229;&#256;&#257;&#258;&#259;&#260;&#261;&#461;&#462;&#478;&#479;&#480;&#481;&#506;&#507;&#512;&#513;&#514;&#515;&#550;&#551;&#7680;&#7681;&#7834;&#7840;&#7841;&#7842;&#7843;&#7844;&#7845;&#7846;&#7847;&#7848;&#7849;&#7850;&#7851;&#7852;&#7853;&#7854;&#7855;&#7856;&#7857;&#7858;&#7859;&#7860;&#7861;&#7862;&#7863;Bb&#384;&#385;&#595;&#386;&#387;&#7682;&#7683;&#7684;&#7685;&#7686;&#7687;Cc&#199;&#231;&#262;&#263;&#264;&#265;&#266;&#267;&#268;&#269;&#391;&#392;&#597;&#7688;&#7689;Dd&#270;&#271;&#272;&#273;&#394;&#599;&#395;&#396;&#453;&#498;&#545;&#598;&#7690;&#7691;&#7692;&#7693;&#7694;&#7695;&#7696;&#7697;&#7698;&#7699;Ee&#200;&#232;&#201;&#233;&#202;&#234;&#203;&#235;&#274;&#275;&#276;&#277;&#278;&#279;&#280;&#281;&#282;&#283;&#516;&#517;&#518;&#519;&#552;&#553;&#7700;&#7701;&#7702;&#7703;&#7704;&#7705;&#7706;&#7707;&#7708;&#7709;&#7864;&#7865;&#7866;&#7867;&#7868;&#7869;&#7870;&#7871;&#7872;&#7873;&#7874;&#7875;&#7876;&#7877;&#7878;&#7879;Ff&#401;&#402;&#7710;&#7711;Gg&#284;&#285;&#286;&#287;&#288;&#289;&#290;&#291;&#403;&#608;&#484;&#485;&#486;&#487;&#500;&#501;&#7712;&#7713;Hh&#292;&#293;&#294;&#295;&#542;&#543;&#614;&#7714;&#7715;&#7716;&#7717;&#7718;&#7719;&#7720;&#7721;&#7722;&#7723;&#7830;Ii&#204;&#236;&#205;&#237;&#206;&#238;&#207;&#239;&#296;&#297;&#298;&#299;&#300;&#301;&#302;&#303;&#304;&#407;&#616;&#463;&#464;&#520;&#521;&#522;&#523;&#7724;&#7725;&#7726;&#7727;&#7880;&#7881;&#7882;&#7883;Jj&#308;&#309;&#496;&#669;Kk&#310;&#311;&#408;&#409;&#488;&#489;&#7728;&#7729;&#7730;&#7731;&#7732;&#7733;Ll&#313;&#314;&#315;&#316;&#317;&#318;&#319;&#320;&#321;&#322;&#410;&#456;&#564;&#619;&#620;&#621;&#7734;&#7735;&#7736;&#7737;&#7738;&#7739;&#7740;&#7741;Mm&#625;&#7742;&#7743;&#7744;&#7745;&#7746;&#7747;Nn&#209;&#241;&#323;&#324;&#325;&#326;&#327;&#328;&#413;&#626;&#414;&#544;&#459;&#504;&#505;&#565;&#627;&#7748;&#7749;&#7750;&#7751;&#7752;&#7753;&#7754;&#7755;Oo&#210;&#242;&#211;&#243;&#212;&#244;&#213;&#245;&#214;&#246;&#216;&#248;&#332;&#333;&#334;&#335;&#336;&#337;&#415;&#416;&#417;&#465;&#466;&#490;&#491;&#492;&#493;&#510;&#511;&#524;&#525;&#526;&#527;&#554;&#555;&#556;&#557;&#558;&#559;&#560;&#561;&#7756;&#7757;&#7758;&#7759;&#7760;&#7761;&#7762;&#7763;&#7884;&#7885;&#7886;&#7887;&#7888;&#7889;&#7890;&#7891;&#7892;&#7893;&#7894;&#7895;&#7896;&#7897;&#7898;&#7899;&#7900;&#7901;&#7902;&#7903;&#7904;&#7905;&#7906;&#7907;Pp&#420;&#421;&#7764;&#7765;&#7766;&#7767;Qq&#672;Rr&#340;&#341;&#342;&#343;&#344;&#345;&#528;&#529;&#530;&#531;&#636;&#637;&#638;&#7768;&#7769;&#7770;&#7771;&#7772;&#7773;&#7774;&#7775;Ss&#346;&#347;&#348;&#349;&#350;&#351;&#352;&#353;&#536;&#537;&#642;&#7776;&#7777;&#7778;&#7779;&#7780;&#7781;&#7782;&#7783;&#7784;&#7785;Tt&#354;&#355;&#356;&#357;&#358;&#359;&#427;&#428;&#429;&#430;&#648;&#538;&#539;&#566;&#7786;&#7787;&#7788;&#7789;&#7790;&#7791;&#7792;&#7793;&#7831;Uu&#217;&#249;&#218;&#250;&#219;&#251;&#220;&#252;&#360;&#361;&#362;&#363;&#364;&#365;&#366;&#367;&#368;&#369;&#370;&#371;&#431;&#432;&#467;&#468;&#469;&#470;&#471;&#472;&#473;&#474;&#475;&#476;&#532;&#533;&#534;&#535;&#7794;&#7795;&#7796;&#7797;&#7798;&#7799;&#7800;&#7801;&#7802;&#7803;&#7908;&#7909;&#7910;&#7911;&#7912;&#7913;&#7914;&#7915;&#7916;&#7917;&#7918;&#7919;&#7920;&#7921;Vv&#434;&#651;&#7804;&#7805;&#7806;&#7807;Ww&#372;&#373;&#7808;&#7809;&#7810;&#7811;&#7812;&#7813;&#7814;&#7815;&#7816;&#7817;&#7832;Xx&#7818;&#7819;&#7820;&#7821;Yy&#221;&#253;&#255;&#376;&#374;&#375;&#435;&#436;&#562;&#563;&#7822;&#7823;&#7833;&#7922;&#7923;&#7924;&#7925;&#7926;&#7927;&#7928;&#7929;Zz&#377;&#378;&#379;&#380;&#381;&#382;&#437;&#438;&#548;&#549;&#656;&#657;&#7824;&#7825;&#7826;&#7827;&#7828;&#7829;&#7829;', 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBCCCCCCCCCCCCCCCCCDDDDDDDDDDDDDDDDDDDDDDDDEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEFFFFFFGGGGGGGGGGGGGGGGGGGGHHHHHHHHHHHHHHHHHHHHIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIJJJJJJKKKKKKKKKKKKKKLLLLLLLLLLLLLLLLLLLLLLLLLLMMMMMMMMMNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOPPPPPPPPQQQRRRRRRRRRRRRRRRRRRRRRRRSSSSSSSSSSSSSSSSSSSSSSSTTTTTTTTTTTTTTTTTTTTTTTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUVVVVVVVVWWWWWWWWWWWWWWWXXXXXXYYYYYYYYYYYYYYYYYYYYYYYZZZZZZZZZZZZZZZZZZZZZ')"/>
+ </xsl:apply-templates>
+ </div>
+</xsl:template>
+
+<!-- This template not used if html/autoidx-kosek.xsl is imported -->
+<xsl:template name="generate-kosek-index">
+ <xsl:param name="scope" select="NOTANODE"/>
+
+ <xsl:variable name="vendor" select="system-property('xsl:vendor')"/>
+ <xsl:if test="contains($vendor, 'libxslt')">
+ <xsl:message terminate="yes">
+ <xsl:text>ERROR: the 'kosek' index method does not </xsl:text>
+ <xsl:text>work with the xsltproc XSLT processor.</xsl:text>
+ </xsl:message>
+ </xsl:if>
+
+
+ <xsl:if test="$exsl.node.set.available = 0">
+ <xsl:message terminate="yes">
+ <xsl:text>ERROR: the 'kosek' index method requires the </xsl:text>
+ <xsl:text>exslt:node-set() function. Use a processor that </xsl:text>
+ <xsl:text>has it, or use a different index method.</xsl:text>
+ </xsl:message>
+ </xsl:if>
+
+ <xsl:if test="$kosek.imported = 0">
+ <xsl:message terminate="yes">
+ <xsl:text>ERROR: the 'kosek' index method requires the
+</xsl:text>
+ <xsl:text>kosek index extensions be imported:
+</xsl:text>
+ <xsl:text> xsl:import href="html/autoidx-kosek.xsl"</xsl:text>
+ </xsl:message>
+ </xsl:if>
+
+</xsl:template>
+
+<!-- This template not used if html/autoidx-kimber.xsl is imported -->
+<xsl:template name="generate-kimber-index">
+ <xsl:param name="scope" select="NOTANODE"/>
+
+ <xsl:variable name="vendor" select="system-property('xsl:vendor')"/>
+ <xsl:if test="not(contains($vendor, 'SAXON '))">
+ <xsl:message terminate="yes">
+ <xsl:text>ERROR: the 'kimber' index method requires the </xsl:text>
+ <xsl:text>Saxon version 6 or 8 XSLT processor.</xsl:text>
+ </xsl:message>
+ </xsl:if>
+
+ <xsl:if test="$kimber.imported = 0">
+ <xsl:message terminate="yes">
+ <xsl:text>ERROR: the 'kimber' index method requires the
+</xsl:text>
+ <xsl:text>kimber index extensions be imported:
+</xsl:text>
+ <xsl:text> xsl:import href="html/autoidx-kimber.xsl"</xsl:text>
+ </xsl:message>
+ </xsl:if>
+
+</xsl:template>
+
+<xsl:template match="indexterm" mode="index-div-basic">
+ <xsl:param name="scope" select="."/>
+ <xsl:param name="role" select="''"/>
+ <xsl:param name="type" select="''"/>
+
+ <xsl:variable name="key" select="translate(substring(normalize-space(concat(primary/@sortas, &quot; &quot;, primary)), 1, 1), 'Aa&#192;&#224;&#193;&#225;&#194;&#226;&#195;&#227;&#196;&#228;&#197;&#229;&#256;&#257;&#258;&#259;&#260;&#261;&#461;&#462;&#478;&#479;&#480;&#481;&#506;&#507;&#512;&#513;&#514;&#515;&#550;&#551;&#7680;&#7681;&#7834;&#7840;&#7841;&#7842;&#7843;&#7844;&#7845;&#7846;&#7847;&#7848;&#7849;&#7850;&#7851;&#7852;&#7853;&#7854;&#7855;&#7856;&#7857;&#7858;&#7859;&#7860;&#7861;&#7862;&#7863;Bb&#384;&#385;&#595;&#386;&#387;&#7682;&#7683;&#7684;&#7685;&#7686;&#7687;Cc&#199;&#231;&#262;&#263;&#264;&#265;&#266;&#267;&#268;&#269;&#391;&#392;&#597;&#7688;&#7689;Dd&#270;&#271;&#272;&#273;&#394;&#599;&#395;&#396;&#453;&#498;&#545;&#598;&#7690;&#7691;&#7692;&#7693;&#7694;&#7695;&#7696;&#7697;&#7698;&#7699;Ee&#200;&#232;&#201;&#233;&#202;&#234;&#203;&#235;&#274;&#275;&#276;&#277;&#278;&#279;&#280;&#281;&#282;&#283;&#516;&#517;&#518;&#519;&#552;&#553;&#7700;&#7701;&#7702;&#7703;&#7704;&#7705;&#7706;&#7707;&#7708;&#7709;&#7864;&#7865;&#7866;&#7867;&#7868;&#7869;&#7870;&#7871;&#7872;&#7873;&#7874;&#7875;&#7876;&#7877;&#7878;&#7879;Ff&#401;&#402;&#7710;&#7711;Gg&#284;&#285;&#286;&#287;&#288;&#289;&#290;&#291;&#403;&#608;&#484;&#485;&#486;&#487;&#500;&#501;&#7712;&#7713;Hh&#292;&#293;&#294;&#295;&#542;&#543;&#614;&#7714;&#7715;&#7716;&#7717;&#7718;&#7719;&#7720;&#7721;&#7722;&#7723;&#7830;Ii&#204;&#236;&#205;&#237;&#206;&#238;&#207;&#239;&#296;&#297;&#298;&#299;&#300;&#301;&#302;&#303;&#304;&#407;&#616;&#463;&#464;&#520;&#521;&#522;&#523;&#7724;&#7725;&#7726;&#7727;&#7880;&#7881;&#7882;&#7883;Jj&#308;&#309;&#496;&#669;Kk&#310;&#311;&#408;&#409;&#488;&#489;&#7728;&#7729;&#7730;&#7731;&#7732;&#7733;Ll&#313;&#314;&#315;&#316;&#317;&#318;&#319;&#320;&#321;&#322;&#410;&#456;&#564;&#619;&#620;&#621;&#7734;&#7735;&#7736;&#7737;&#7738;&#7739;&#7740;&#7741;Mm&#625;&#7742;&#7743;&#7744;&#7745;&#7746;&#7747;Nn&#209;&#241;&#323;&#324;&#325;&#326;&#327;&#328;&#413;&#626;&#414;&#544;&#459;&#504;&#505;&#565;&#627;&#7748;&#7749;&#7750;&#7751;&#7752;&#7753;&#7754;&#7755;Oo&#210;&#242;&#211;&#243;&#212;&#244;&#213;&#245;&#214;&#246;&#216;&#248;&#332;&#333;&#334;&#335;&#336;&#337;&#415;&#416;&#417;&#465;&#466;&#490;&#491;&#492;&#493;&#510;&#511;&#524;&#525;&#526;&#527;&#554;&#555;&#556;&#557;&#558;&#559;&#560;&#561;&#7756;&#7757;&#7758;&#7759;&#7760;&#7761;&#7762;&#7763;&#7884;&#7885;&#7886;&#7887;&#7888;&#7889;&#7890;&#7891;&#7892;&#7893;&#7894;&#7895;&#7896;&#7897;&#7898;&#7899;&#7900;&#7901;&#7902;&#7903;&#7904;&#7905;&#7906;&#7907;Pp&#420;&#421;&#7764;&#7765;&#7766;&#7767;Qq&#672;Rr&#340;&#341;&#342;&#343;&#344;&#345;&#528;&#529;&#530;&#531;&#636;&#637;&#638;&#7768;&#7769;&#7770;&#7771;&#7772;&#7773;&#7774;&#7775;Ss&#346;&#347;&#348;&#349;&#350;&#351;&#352;&#353;&#536;&#537;&#642;&#7776;&#7777;&#7778;&#7779;&#7780;&#7781;&#7782;&#7783;&#7784;&#7785;Tt&#354;&#355;&#356;&#357;&#358;&#359;&#427;&#428;&#429;&#430;&#648;&#538;&#539;&#566;&#7786;&#7787;&#7788;&#7789;&#7790;&#7791;&#7792;&#7793;&#7831;Uu&#217;&#249;&#218;&#250;&#219;&#251;&#220;&#252;&#360;&#361;&#362;&#363;&#364;&#365;&#366;&#367;&#368;&#369;&#370;&#371;&#431;&#432;&#467;&#468;&#469;&#470;&#471;&#472;&#473;&#474;&#475;&#476;&#532;&#533;&#534;&#535;&#7794;&#7795;&#7796;&#7797;&#7798;&#7799;&#7800;&#7801;&#7802;&#7803;&#7908;&#7909;&#7910;&#7911;&#7912;&#7913;&#7914;&#7915;&#7916;&#7917;&#7918;&#7919;&#7920;&#7921;Vv&#434;&#651;&#7804;&#7805;&#7806;&#7807;Ww&#372;&#373;&#7808;&#7809;&#7810;&#7811;&#7812;&#7813;&#7814;&#7815;&#7816;&#7817;&#7832;Xx&#7818;&#7819;&#7820;&#7821;Yy&#221;&#253;&#255;&#376;&#374;&#375;&#435;&#436;&#562;&#563;&#7822;&#7823;&#7833;&#7922;&#7923;&#7924;&#7925;&#7926;&#7927;&#7928;&#7929;Zz&#377;&#378;&#379;&#380;&#381;&#382;&#437;&#438;&#548;&#549;&#656;&#657;&#7824;&#7825;&#7826;&#7827;&#7828;&#7829;&#7829;','AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBCCCCCCCCCCCCCCCCCDDDDDDDDDDDDDDDDDDDDDDDDEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEFFFFFFGGGGGGGGGGGGGGGGGGGGHHHHHHHHHHHHHHHHHHHHIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIJJJJJJKKKKKKKKKKKKKKLLLLLLLLLLLLLLLLLLLLLLLLLLMMMMMMMMMNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOPPPPPPPPQQQRRRRRRRRRRRRRRRRRRRRRRRSSSSSSSSSSSSSSSSSSSSSSSTTTTTTTTTTTTTTTTTTTTTTTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUVVVVVVVVWWWWWWWWWWWWWWWXXXXXXYYYYYYYYYYYYYYYYYYYYYYYZZZZZZZZZZZZZZZZZZZZZ')"/>
+
+ <xsl:if test="key('letter', $key)[count(ancestor::node()|$scope) = count(ancestor::node()) and ($role = @role or $type = @type or (string-length($role) = 0 and string-length($type) = 0))] [count(.|key('primary', normalize-space(concat(primary/@sortas, &quot; &quot;, primary)))[count(ancestor::node()|$scope) = count(ancestor::node()) and ($role = @role or $type = @type or (string-length($role) = 0 and string-length($type) = 0))][1]) = 1]">
+ <div class="indexdiv">
+ <xsl:if test="contains(concat('Aa&#192;&#224;&#193;&#225;&#194;&#226;&#195;&#227;&#196;&#228;&#197;&#229;&#256;&#257;&#258;&#259;&#260;&#261;&#461;&#462;&#478;&#479;&#480;&#481;&#506;&#507;&#512;&#513;&#514;&#515;&#550;&#551;&#7680;&#7681;&#7834;&#7840;&#7841;&#7842;&#7843;&#7844;&#7845;&#7846;&#7847;&#7848;&#7849;&#7850;&#7851;&#7852;&#7853;&#7854;&#7855;&#7856;&#7857;&#7858;&#7859;&#7860;&#7861;&#7862;&#7863;Bb&#384;&#385;&#595;&#386;&#387;&#7682;&#7683;&#7684;&#7685;&#7686;&#7687;Cc&#199;&#231;&#262;&#263;&#264;&#265;&#266;&#267;&#268;&#269;&#391;&#392;&#597;&#7688;&#7689;Dd&#270;&#271;&#272;&#273;&#394;&#599;&#395;&#396;&#453;&#498;&#545;&#598;&#7690;&#7691;&#7692;&#7693;&#7694;&#7695;&#7696;&#7697;&#7698;&#7699;Ee&#200;&#232;&#201;&#233;&#202;&#234;&#203;&#235;&#274;&#275;&#276;&#277;&#278;&#279;&#280;&#281;&#282;&#283;&#516;&#517;&#518;&#519;&#552;&#553;&#7700;&#7701;&#7702;&#7703;&#7704;&#7705;&#7706;&#7707;&#7708;&#7709;&#7864;&#7865;&#7866;&#7867;&#7868;&#7869;&#7870;&#7871;&#7872;&#7873;&#7874;&#7875;&#7876;&#7877;&#7878;&#7879;Ff&#401;&#402;&#7710;&#7711;Gg&#284;&#285;&#286;&#287;&#288;&#289;&#290;&#291;&#403;&#608;&#484;&#485;&#486;&#487;&#500;&#501;&#7712;&#7713;Hh&#292;&#293;&#294;&#295;&#542;&#543;&#614;&#7714;&#7715;&#7716;&#7717;&#7718;&#7719;&#7720;&#7721;&#7722;&#7723;&#7830;Ii&#204;&#236;&#205;&#237;&#206;&#238;&#207;&#239;&#296;&#297;&#298;&#299;&#300;&#301;&#302;&#303;&#304;&#407;&#616;&#463;&#464;&#520;&#521;&#522;&#523;&#7724;&#7725;&#7726;&#7727;&#7880;&#7881;&#7882;&#7883;Jj&#308;&#309;&#496;&#669;Kk&#310;&#311;&#408;&#409;&#488;&#489;&#7728;&#7729;&#7730;&#7731;&#7732;&#7733;Ll&#313;&#314;&#315;&#316;&#317;&#318;&#319;&#320;&#321;&#322;&#410;&#456;&#564;&#619;&#620;&#621;&#7734;&#7735;&#7736;&#7737;&#7738;&#7739;&#7740;&#7741;Mm&#625;&#7742;&#7743;&#7744;&#7745;&#7746;&#7747;Nn&#209;&#241;&#323;&#324;&#325;&#326;&#327;&#328;&#413;&#626;&#414;&#544;&#459;&#504;&#505;&#565;&#627;&#7748;&#7749;&#7750;&#7751;&#7752;&#7753;&#7754;&#7755;Oo&#210;&#242;&#211;&#243;&#212;&#244;&#213;&#245;&#214;&#246;&#216;&#248;&#332;&#333;&#334;&#335;&#336;&#337;&#415;&#416;&#417;&#465;&#466;&#490;&#491;&#492;&#493;&#510;&#511;&#524;&#525;&#526;&#527;&#554;&#555;&#556;&#557;&#558;&#559;&#560;&#561;&#7756;&#7757;&#7758;&#7759;&#7760;&#7761;&#7762;&#7763;&#7884;&#7885;&#7886;&#7887;&#7888;&#7889;&#7890;&#7891;&#7892;&#7893;&#7894;&#7895;&#7896;&#7897;&#7898;&#7899;&#7900;&#7901;&#7902;&#7903;&#7904;&#7905;&#7906;&#7907;Pp&#420;&#421;&#7764;&#7765;&#7766;&#7767;Qq&#672;Rr&#340;&#341;&#342;&#343;&#344;&#345;&#528;&#529;&#530;&#531;&#636;&#637;&#638;&#7768;&#7769;&#7770;&#7771;&#7772;&#7773;&#7774;&#7775;Ss&#346;&#347;&#348;&#349;&#350;&#351;&#352;&#353;&#536;&#537;&#642;&#7776;&#7777;&#7778;&#7779;&#7780;&#7781;&#7782;&#7783;&#7784;&#7785;Tt&#354;&#355;&#356;&#357;&#358;&#359;&#427;&#428;&#429;&#430;&#648;&#538;&#539;&#566;&#7786;&#7787;&#7788;&#7789;&#7790;&#7791;&#7792;&#7793;&#7831;Uu&#217;&#249;&#218;&#250;&#219;&#251;&#220;&#252;&#360;&#361;&#362;&#363;&#364;&#365;&#366;&#367;&#368;&#369;&#370;&#371;&#431;&#432;&#467;&#468;&#469;&#470;&#471;&#472;&#473;&#474;&#475;&#476;&#532;&#533;&#534;&#535;&#7794;&#7795;&#7796;&#7797;&#7798;&#7799;&#7800;&#7801;&#7802;&#7803;&#7908;&#7909;&#7910;&#7911;&#7912;&#7913;&#7914;&#7915;&#7916;&#7917;&#7918;&#7919;&#7920;&#7921;Vv&#434;&#651;&#7804;&#7805;&#7806;&#7807;Ww&#372;&#373;&#7808;&#7809;&#7810;&#7811;&#7812;&#7813;&#7814;&#7815;&#7816;&#7817;&#7832;Xx&#7818;&#7819;&#7820;&#7821;Yy&#221;&#253;&#255;&#376;&#374;&#375;&#435;&#436;&#562;&#563;&#7822;&#7823;&#7833;&#7922;&#7923;&#7924;&#7925;&#7926;&#7927;&#7928;&#7929;Zz&#377;&#378;&#379;&#380;&#381;&#382;&#437;&#438;&#548;&#549;&#656;&#657;&#7824;&#7825;&#7826;&#7827;&#7828;&#7829;&#7829;', 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBCCCCCCCCCCCCCCCCCDDDDDDDDDDDDDDDDDDDDDDDDEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEFFFFFFGGGGGGGGGGGGGGGGGGGGHHHHHHHHHHHHHHHHHHHHIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIJJJJJJKKKKKKKKKKKKKKLLLLLLLLLLLLLLLLLLLLLLLLLLMMMMMMMMMNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOPPPPPPPPQQQRRRRRRRRRRRRRRRRRRRRRRRSSSSSSSSSSSSSSSSSSSSSSSTTTTTTTTTTTTTTTTTTTTTTTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUVVVVVVVVWWWWWWWWWWWWWWWXXXXXXYYYYYYYYYYYYYYYYYYYYYYYZZZZZZZZZZZZZZZZZZZZZ'), $key)">
+ <h3>
+ <xsl:value-of select="translate($key, 'Aa&#192;&#224;&#193;&#225;&#194;&#226;&#195;&#227;&#196;&#228;&#197;&#229;&#256;&#257;&#258;&#259;&#260;&#261;&#461;&#462;&#478;&#479;&#480;&#481;&#506;&#507;&#512;&#513;&#514;&#515;&#550;&#551;&#7680;&#7681;&#7834;&#7840;&#7841;&#7842;&#7843;&#7844;&#7845;&#7846;&#7847;&#7848;&#7849;&#7850;&#7851;&#7852;&#7853;&#7854;&#7855;&#7856;&#7857;&#7858;&#7859;&#7860;&#7861;&#7862;&#7863;Bb&#384;&#385;&#595;&#386;&#387;&#7682;&#7683;&#7684;&#7685;&#7686;&#7687;Cc&#199;&#231;&#262;&#263;&#264;&#265;&#266;&#267;&#268;&#269;&#391;&#392;&#597;&#7688;&#7689;Dd&#270;&#271;&#272;&#273;&#394;&#599;&#395;&#396;&#453;&#498;&#545;&#598;&#7690;&#7691;&#7692;&#7693;&#7694;&#7695;&#7696;&#7697;&#7698;&#7699;Ee&#200;&#232;&#201;&#233;&#202;&#234;&#203;&#235;&#274;&#275;&#276;&#277;&#278;&#279;&#280;&#281;&#282;&#283;&#516;&#517;&#518;&#519;&#552;&#553;&#7700;&#7701;&#7702;&#7703;&#7704;&#7705;&#7706;&#7707;&#7708;&#7709;&#7864;&#7865;&#7866;&#7867;&#7868;&#7869;&#7870;&#7871;&#7872;&#7873;&#7874;&#7875;&#7876;&#7877;&#7878;&#7879;Ff&#401;&#402;&#7710;&#7711;Gg&#284;&#285;&#286;&#287;&#288;&#289;&#290;&#291;&#403;&#608;&#484;&#485;&#486;&#487;&#500;&#501;&#7712;&#7713;Hh&#292;&#293;&#294;&#295;&#542;&#543;&#614;&#7714;&#7715;&#7716;&#7717;&#7718;&#7719;&#7720;&#7721;&#7722;&#7723;&#7830;Ii&#204;&#236;&#205;&#237;&#206;&#238;&#207;&#239;&#296;&#297;&#298;&#299;&#300;&#301;&#302;&#303;&#304;&#407;&#616;&#463;&#464;&#520;&#521;&#522;&#523;&#7724;&#7725;&#7726;&#7727;&#7880;&#7881;&#7882;&#7883;Jj&#308;&#309;&#496;&#669;Kk&#310;&#311;&#408;&#409;&#488;&#489;&#7728;&#7729;&#7730;&#7731;&#7732;&#7733;Ll&#313;&#314;&#315;&#316;&#317;&#318;&#319;&#320;&#321;&#322;&#410;&#456;&#564;&#619;&#620;&#621;&#7734;&#7735;&#7736;&#7737;&#7738;&#7739;&#7740;&#7741;Mm&#625;&#7742;&#7743;&#7744;&#7745;&#7746;&#7747;Nn&#209;&#241;&#323;&#324;&#325;&#326;&#327;&#328;&#413;&#626;&#414;&#544;&#459;&#504;&#505;&#565;&#627;&#7748;&#7749;&#7750;&#7751;&#7752;&#7753;&#7754;&#7755;Oo&#210;&#242;&#211;&#243;&#212;&#244;&#213;&#245;&#214;&#246;&#216;&#248;&#332;&#333;&#334;&#335;&#336;&#337;&#415;&#416;&#417;&#465;&#466;&#490;&#491;&#492;&#493;&#510;&#511;&#524;&#525;&#526;&#527;&#554;&#555;&#556;&#557;&#558;&#559;&#560;&#561;&#7756;&#7757;&#7758;&#7759;&#7760;&#7761;&#7762;&#7763;&#7884;&#7885;&#7886;&#7887;&#7888;&#7889;&#7890;&#7891;&#7892;&#7893;&#7894;&#7895;&#7896;&#7897;&#7898;&#7899;&#7900;&#7901;&#7902;&#7903;&#7904;&#7905;&#7906;&#7907;Pp&#420;&#421;&#7764;&#7765;&#7766;&#7767;Qq&#672;Rr&#340;&#341;&#342;&#343;&#344;&#345;&#528;&#529;&#530;&#531;&#636;&#637;&#638;&#7768;&#7769;&#7770;&#7771;&#7772;&#7773;&#7774;&#7775;Ss&#346;&#347;&#348;&#349;&#350;&#351;&#352;&#353;&#536;&#537;&#642;&#7776;&#7777;&#7778;&#7779;&#7780;&#7781;&#7782;&#7783;&#7784;&#7785;Tt&#354;&#355;&#356;&#357;&#358;&#359;&#427;&#428;&#429;&#430;&#648;&#538;&#539;&#566;&#7786;&#7787;&#7788;&#7789;&#7790;&#7791;&#7792;&#7793;&#7831;Uu&#217;&#249;&#218;&#250;&#219;&#251;&#220;&#252;&#360;&#361;&#362;&#363;&#364;&#365;&#366;&#367;&#368;&#369;&#370;&#371;&#431;&#432;&#467;&#468;&#469;&#470;&#471;&#472;&#473;&#474;&#475;&#476;&#532;&#533;&#534;&#535;&#7794;&#7795;&#7796;&#7797;&#7798;&#7799;&#7800;&#7801;&#7802;&#7803;&#7908;&#7909;&#7910;&#7911;&#7912;&#7913;&#7914;&#7915;&#7916;&#7917;&#7918;&#7919;&#7920;&#7921;Vv&#434;&#651;&#7804;&#7805;&#7806;&#7807;Ww&#372;&#373;&#7808;&#7809;&#7810;&#7811;&#7812;&#7813;&#7814;&#7815;&#7816;&#7817;&#7832;Xx&#7818;&#7819;&#7820;&#7821;Yy&#221;&#253;&#255;&#376;&#374;&#375;&#435;&#436;&#562;&#563;&#7822;&#7823;&#7833;&#7922;&#7923;&#7924;&#7925;&#7926;&#7927;&#7928;&#7929;Zz&#377;&#378;&#379;&#380;&#381;&#382;&#437;&#438;&#548;&#549;&#656;&#657;&#7824;&#7825;&#7826;&#7827;&#7828;&#7829;&#7829;', 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBCCCCCCCCCCCCCCCCCDDDDDDDDDDDDDDDDDDDDDDDDEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEFFFFFFGGGGGGGGGGGGGGGGGGGGHHHHHHHHHHHHHHHHHHHHIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIJJJJJJKKKKKKKKKKKKKKLLLLLLLLLLLLLLLLLLLLLLLLLLMMMMMMMMMNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOPPPPPPPPQQQRRRRRRRRRRRRRRRRRRRRRRRSSSSSSSSSSSSSSSSSSSSSSSTTTTTTTTTTTTTTTTTTTTTTTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUVVVVVVVVWWWWWWWWWWWWWWWXXXXXXYYYYYYYYYYYYYYYYYYYYYYYZZZZZZZZZZZZZZZZZZZZZ')"/>
+ </h3>
+ </xsl:if>
+ <dl>
+ <xsl:apply-templates select="key('letter', $key)[count(ancestor::node()|$scope) = count(ancestor::node()) and ($role = @role or $type = @type or (string-length($role) = 0 and string-length($type) = 0))] [count(.|key('primary', normalize-space(concat(primary/@sortas, &quot; &quot;, primary))) [count(ancestor::node()|$scope) = count(ancestor::node()) and ($role = @role or $type = @type or (string-length($role) = 0 and string-length($type) = 0))][1])=1]" mode="index-primary">
+ <xsl:with-param name="position" select="position()"/>
+ <xsl:with-param name="scope" select="$scope"/>
+ <xsl:with-param name="role" select="$role"/>
+ <xsl:with-param name="type" select="$type"/>
+ <xsl:sort select="translate(normalize-space(concat(primary/@sortas, &quot; &quot;, primary)), 'Aa&#192;&#224;&#193;&#225;&#194;&#226;&#195;&#227;&#196;&#228;&#197;&#229;&#256;&#257;&#258;&#259;&#260;&#261;&#461;&#462;&#478;&#479;&#480;&#481;&#506;&#507;&#512;&#513;&#514;&#515;&#550;&#551;&#7680;&#7681;&#7834;&#7840;&#7841;&#7842;&#7843;&#7844;&#7845;&#7846;&#7847;&#7848;&#7849;&#7850;&#7851;&#7852;&#7853;&#7854;&#7855;&#7856;&#7857;&#7858;&#7859;&#7860;&#7861;&#7862;&#7863;Bb&#384;&#385;&#595;&#386;&#387;&#7682;&#7683;&#7684;&#7685;&#7686;&#7687;Cc&#199;&#231;&#262;&#263;&#264;&#265;&#266;&#267;&#268;&#269;&#391;&#392;&#597;&#7688;&#7689;Dd&#270;&#271;&#272;&#273;&#394;&#599;&#395;&#396;&#453;&#498;&#545;&#598;&#7690;&#7691;&#7692;&#7693;&#7694;&#7695;&#7696;&#7697;&#7698;&#7699;Ee&#200;&#232;&#201;&#233;&#202;&#234;&#203;&#235;&#274;&#275;&#276;&#277;&#278;&#279;&#280;&#281;&#282;&#283;&#516;&#517;&#518;&#519;&#552;&#553;&#7700;&#7701;&#7702;&#7703;&#7704;&#7705;&#7706;&#7707;&#7708;&#7709;&#7864;&#7865;&#7866;&#7867;&#7868;&#7869;&#7870;&#7871;&#7872;&#7873;&#7874;&#7875;&#7876;&#7877;&#7878;&#7879;Ff&#401;&#402;&#7710;&#7711;Gg&#284;&#285;&#286;&#287;&#288;&#289;&#290;&#291;&#403;&#608;&#484;&#485;&#486;&#487;&#500;&#501;&#7712;&#7713;Hh&#292;&#293;&#294;&#295;&#542;&#543;&#614;&#7714;&#7715;&#7716;&#7717;&#7718;&#7719;&#7720;&#7721;&#7722;&#7723;&#7830;Ii&#204;&#236;&#205;&#237;&#206;&#238;&#207;&#239;&#296;&#297;&#298;&#299;&#300;&#301;&#302;&#303;&#304;&#407;&#616;&#463;&#464;&#520;&#521;&#522;&#523;&#7724;&#7725;&#7726;&#7727;&#7880;&#7881;&#7882;&#7883;Jj&#308;&#309;&#496;&#669;Kk&#310;&#311;&#408;&#409;&#488;&#489;&#7728;&#7729;&#7730;&#7731;&#7732;&#7733;Ll&#313;&#314;&#315;&#316;&#317;&#318;&#319;&#320;&#321;&#322;&#410;&#456;&#564;&#619;&#620;&#621;&#7734;&#7735;&#7736;&#7737;&#7738;&#7739;&#7740;&#7741;Mm&#625;&#7742;&#7743;&#7744;&#7745;&#7746;&#7747;Nn&#209;&#241;&#323;&#324;&#325;&#326;&#327;&#328;&#413;&#626;&#414;&#544;&#459;&#504;&#505;&#565;&#627;&#7748;&#7749;&#7750;&#7751;&#7752;&#7753;&#7754;&#7755;Oo&#210;&#242;&#211;&#243;&#212;&#244;&#213;&#245;&#214;&#246;&#216;&#248;&#332;&#333;&#334;&#335;&#336;&#337;&#415;&#416;&#417;&#465;&#466;&#490;&#491;&#492;&#493;&#510;&#511;&#524;&#525;&#526;&#527;&#554;&#555;&#556;&#557;&#558;&#559;&#560;&#561;&#7756;&#7757;&#7758;&#7759;&#7760;&#7761;&#7762;&#7763;&#7884;&#7885;&#7886;&#7887;&#7888;&#7889;&#7890;&#7891;&#7892;&#7893;&#7894;&#7895;&#7896;&#7897;&#7898;&#7899;&#7900;&#7901;&#7902;&#7903;&#7904;&#7905;&#7906;&#7907;Pp&#420;&#421;&#7764;&#7765;&#7766;&#7767;Qq&#672;Rr&#340;&#341;&#342;&#343;&#344;&#345;&#528;&#529;&#530;&#531;&#636;&#637;&#638;&#7768;&#7769;&#7770;&#7771;&#7772;&#7773;&#7774;&#7775;Ss&#346;&#347;&#348;&#349;&#350;&#351;&#352;&#353;&#536;&#537;&#642;&#7776;&#7777;&#7778;&#7779;&#7780;&#7781;&#7782;&#7783;&#7784;&#7785;Tt&#354;&#355;&#356;&#357;&#358;&#359;&#427;&#428;&#429;&#430;&#648;&#538;&#539;&#566;&#7786;&#7787;&#7788;&#7789;&#7790;&#7791;&#7792;&#7793;&#7831;Uu&#217;&#249;&#218;&#250;&#219;&#251;&#220;&#252;&#360;&#361;&#362;&#363;&#364;&#365;&#366;&#367;&#368;&#369;&#370;&#371;&#431;&#432;&#467;&#468;&#469;&#470;&#471;&#472;&#473;&#474;&#475;&#476;&#532;&#533;&#534;&#535;&#7794;&#7795;&#7796;&#7797;&#7798;&#7799;&#7800;&#7801;&#7802;&#7803;&#7908;&#7909;&#7910;&#7911;&#7912;&#7913;&#7914;&#7915;&#7916;&#7917;&#7918;&#7919;&#7920;&#7921;Vv&#434;&#651;&#7804;&#7805;&#7806;&#7807;Ww&#372;&#373;&#7808;&#7809;&#7810;&#7811;&#7812;&#7813;&#7814;&#7815;&#7816;&#7817;&#7832;Xx&#7818;&#7819;&#7820;&#7821;Yy&#221;&#253;&#255;&#376;&#374;&#375;&#435;&#436;&#562;&#563;&#7822;&#7823;&#7833;&#7922;&#7923;&#7924;&#7925;&#7926;&#7927;&#7928;&#7929;Zz&#377;&#378;&#379;&#380;&#381;&#382;&#437;&#438;&#548;&#549;&#656;&#657;&#7824;&#7825;&#7826;&#7827;&#7828;&#7829;&#7829;', 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBCCCCCCCCCCCCCCCCCDDDDDDDDDDDDDDDDDDDDDDDDEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEFFFFFFGGGGGGGGGGGGGGGGGGGGHHHHHHHHHHHHHHHHHHHHIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIJJJJJJKKKKKKKKKKKKKKLLLLLLLLLLLLLLLLLLLLLLLLLLMMMMMMMMMNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOPPPPPPPPQQQRRRRRRRRRRRRRRRRRRRRRRRSSSSSSSSSSSSSSSSSSSSSSSTTTTTTTTTTTTTTTTTTTTTTTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUVVVVVVVVWWWWWWWWWWWWWWWXXXXXXYYYYYYYYYYYYYYYYYYYYYYYZZZZZZZZZZZZZZZZZZZZZ')"/>
+ </xsl:apply-templates>
+ </dl>
+ </div>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="indexterm" mode="index-symbol-div">
+ <xsl:param name="scope" select="/"/>
+ <xsl:param name="role" select="''"/>
+ <xsl:param name="type" select="''"/>
+
+ <xsl:variable name="key" select="translate(substring(normalize-space(concat(primary/@sortas, &quot; &quot;, primary)), 1, 1), 'Aa&#192;&#224;&#193;&#225;&#194;&#226;&#195;&#227;&#196;&#228;&#197;&#229;&#256;&#257;&#258;&#259;&#260;&#261;&#461;&#462;&#478;&#479;&#480;&#481;&#506;&#507;&#512;&#513;&#514;&#515;&#550;&#551;&#7680;&#7681;&#7834;&#7840;&#7841;&#7842;&#7843;&#7844;&#7845;&#7846;&#7847;&#7848;&#7849;&#7850;&#7851;&#7852;&#7853;&#7854;&#7855;&#7856;&#7857;&#7858;&#7859;&#7860;&#7861;&#7862;&#7863;Bb&#384;&#385;&#595;&#386;&#387;&#7682;&#7683;&#7684;&#7685;&#7686;&#7687;Cc&#199;&#231;&#262;&#263;&#264;&#265;&#266;&#267;&#268;&#269;&#391;&#392;&#597;&#7688;&#7689;Dd&#270;&#271;&#272;&#273;&#394;&#599;&#395;&#396;&#453;&#498;&#545;&#598;&#7690;&#7691;&#7692;&#7693;&#7694;&#7695;&#7696;&#7697;&#7698;&#7699;Ee&#200;&#232;&#201;&#233;&#202;&#234;&#203;&#235;&#274;&#275;&#276;&#277;&#278;&#279;&#280;&#281;&#282;&#283;&#516;&#517;&#518;&#519;&#552;&#553;&#7700;&#7701;&#7702;&#7703;&#7704;&#7705;&#7706;&#7707;&#7708;&#7709;&#7864;&#7865;&#7866;&#7867;&#7868;&#7869;&#7870;&#7871;&#7872;&#7873;&#7874;&#7875;&#7876;&#7877;&#7878;&#7879;Ff&#401;&#402;&#7710;&#7711;Gg&#284;&#285;&#286;&#287;&#288;&#289;&#290;&#291;&#403;&#608;&#484;&#485;&#486;&#487;&#500;&#501;&#7712;&#7713;Hh&#292;&#293;&#294;&#295;&#542;&#543;&#614;&#7714;&#7715;&#7716;&#7717;&#7718;&#7719;&#7720;&#7721;&#7722;&#7723;&#7830;Ii&#204;&#236;&#205;&#237;&#206;&#238;&#207;&#239;&#296;&#297;&#298;&#299;&#300;&#301;&#302;&#303;&#304;&#407;&#616;&#463;&#464;&#520;&#521;&#522;&#523;&#7724;&#7725;&#7726;&#7727;&#7880;&#7881;&#7882;&#7883;Jj&#308;&#309;&#496;&#669;Kk&#310;&#311;&#408;&#409;&#488;&#489;&#7728;&#7729;&#7730;&#7731;&#7732;&#7733;Ll&#313;&#314;&#315;&#316;&#317;&#318;&#319;&#320;&#321;&#322;&#410;&#456;&#564;&#619;&#620;&#621;&#7734;&#7735;&#7736;&#7737;&#7738;&#7739;&#7740;&#7741;Mm&#625;&#7742;&#7743;&#7744;&#7745;&#7746;&#7747;Nn&#209;&#241;&#323;&#324;&#325;&#326;&#327;&#328;&#413;&#626;&#414;&#544;&#459;&#504;&#505;&#565;&#627;&#7748;&#7749;&#7750;&#7751;&#7752;&#7753;&#7754;&#7755;Oo&#210;&#242;&#211;&#243;&#212;&#244;&#213;&#245;&#214;&#246;&#216;&#248;&#332;&#333;&#334;&#335;&#336;&#337;&#415;&#416;&#417;&#465;&#466;&#490;&#491;&#492;&#493;&#510;&#511;&#524;&#525;&#526;&#527;&#554;&#555;&#556;&#557;&#558;&#559;&#560;&#561;&#7756;&#7757;&#7758;&#7759;&#7760;&#7761;&#7762;&#7763;&#7884;&#7885;&#7886;&#7887;&#7888;&#7889;&#7890;&#7891;&#7892;&#7893;&#7894;&#7895;&#7896;&#7897;&#7898;&#7899;&#7900;&#7901;&#7902;&#7903;&#7904;&#7905;&#7906;&#7907;Pp&#420;&#421;&#7764;&#7765;&#7766;&#7767;Qq&#672;Rr&#340;&#341;&#342;&#343;&#344;&#345;&#528;&#529;&#530;&#531;&#636;&#637;&#638;&#7768;&#7769;&#7770;&#7771;&#7772;&#7773;&#7774;&#7775;Ss&#346;&#347;&#348;&#349;&#350;&#351;&#352;&#353;&#536;&#537;&#642;&#7776;&#7777;&#7778;&#7779;&#7780;&#7781;&#7782;&#7783;&#7784;&#7785;Tt&#354;&#355;&#356;&#357;&#358;&#359;&#427;&#428;&#429;&#430;&#648;&#538;&#539;&#566;&#7786;&#7787;&#7788;&#7789;&#7790;&#7791;&#7792;&#7793;&#7831;Uu&#217;&#249;&#218;&#250;&#219;&#251;&#220;&#252;&#360;&#361;&#362;&#363;&#364;&#365;&#366;&#367;&#368;&#369;&#370;&#371;&#431;&#432;&#467;&#468;&#469;&#470;&#471;&#472;&#473;&#474;&#475;&#476;&#532;&#533;&#534;&#535;&#7794;&#7795;&#7796;&#7797;&#7798;&#7799;&#7800;&#7801;&#7802;&#7803;&#7908;&#7909;&#7910;&#7911;&#7912;&#7913;&#7914;&#7915;&#7916;&#7917;&#7918;&#7919;&#7920;&#7921;Vv&#434;&#651;&#7804;&#7805;&#7806;&#7807;Ww&#372;&#373;&#7808;&#7809;&#7810;&#7811;&#7812;&#7813;&#7814;&#7815;&#7816;&#7817;&#7832;Xx&#7818;&#7819;&#7820;&#7821;Yy&#221;&#253;&#255;&#376;&#374;&#375;&#435;&#436;&#562;&#563;&#7822;&#7823;&#7833;&#7922;&#7923;&#7924;&#7925;&#7926;&#7927;&#7928;&#7929;Zz&#377;&#378;&#379;&#380;&#381;&#382;&#437;&#438;&#548;&#549;&#656;&#657;&#7824;&#7825;&#7826;&#7827;&#7828;&#7829;&#7829;','AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBCCCCCCCCCCCCCCCCCDDDDDDDDDDDDDDDDDDDDDDDDEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEFFFFFFGGGGGGGGGGGGGGGGGGGGHHHHHHHHHHHHHHHHHHHHIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIJJJJJJKKKKKKKKKKKKKKLLLLLLLLLLLLLLLLLLLLLLLLLLMMMMMMMMMNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOPPPPPPPPQQQRRRRRRRRRRRRRRRRRRRRRRRSSSSSSSSSSSSSSSSSSSSSSSTTTTTTTTTTTTTTTTTTTTTTTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUVVVVVVVVWWWWWWWWWWWWWWWXXXXXXYYYYYYYYYYYYYYYYYYYYYYYZZZZZZZZZZZZZZZZZZZZZ')"/>
+
+ <xsl:apply-templates select="key('letter', $key) [count(ancestor::node()|$scope) = count(ancestor::node()) and ($role = @role or $type = @type or (string-length($role) = 0 and string-length($type) = 0))][count(.|key('primary', normalize-space(concat(primary/@sortas, &quot; &quot;, primary)))[1]) = 1]" mode="index-primary">
+ <xsl:with-param name="position" select="position()"/>
+ <xsl:with-param name="scope" select="$scope"/>
+ <xsl:with-param name="role" select="$role"/>
+ <xsl:with-param name="type" select="$type"/>
+ <xsl:sort select="translate(normalize-space(concat(primary/@sortas, &quot; &quot;, primary)), 'Aa&#192;&#224;&#193;&#225;&#194;&#226;&#195;&#227;&#196;&#228;&#197;&#229;&#256;&#257;&#258;&#259;&#260;&#261;&#461;&#462;&#478;&#479;&#480;&#481;&#506;&#507;&#512;&#513;&#514;&#515;&#550;&#551;&#7680;&#7681;&#7834;&#7840;&#7841;&#7842;&#7843;&#7844;&#7845;&#7846;&#7847;&#7848;&#7849;&#7850;&#7851;&#7852;&#7853;&#7854;&#7855;&#7856;&#7857;&#7858;&#7859;&#7860;&#7861;&#7862;&#7863;Bb&#384;&#385;&#595;&#386;&#387;&#7682;&#7683;&#7684;&#7685;&#7686;&#7687;Cc&#199;&#231;&#262;&#263;&#264;&#265;&#266;&#267;&#268;&#269;&#391;&#392;&#597;&#7688;&#7689;Dd&#270;&#271;&#272;&#273;&#394;&#599;&#395;&#396;&#453;&#498;&#545;&#598;&#7690;&#7691;&#7692;&#7693;&#7694;&#7695;&#7696;&#7697;&#7698;&#7699;Ee&#200;&#232;&#201;&#233;&#202;&#234;&#203;&#235;&#274;&#275;&#276;&#277;&#278;&#279;&#280;&#281;&#282;&#283;&#516;&#517;&#518;&#519;&#552;&#553;&#7700;&#7701;&#7702;&#7703;&#7704;&#7705;&#7706;&#7707;&#7708;&#7709;&#7864;&#7865;&#7866;&#7867;&#7868;&#7869;&#7870;&#7871;&#7872;&#7873;&#7874;&#7875;&#7876;&#7877;&#7878;&#7879;Ff&#401;&#402;&#7710;&#7711;Gg&#284;&#285;&#286;&#287;&#288;&#289;&#290;&#291;&#403;&#608;&#484;&#485;&#486;&#487;&#500;&#501;&#7712;&#7713;Hh&#292;&#293;&#294;&#295;&#542;&#543;&#614;&#7714;&#7715;&#7716;&#7717;&#7718;&#7719;&#7720;&#7721;&#7722;&#7723;&#7830;Ii&#204;&#236;&#205;&#237;&#206;&#238;&#207;&#239;&#296;&#297;&#298;&#299;&#300;&#301;&#302;&#303;&#304;&#407;&#616;&#463;&#464;&#520;&#521;&#522;&#523;&#7724;&#7725;&#7726;&#7727;&#7880;&#7881;&#7882;&#7883;Jj&#308;&#309;&#496;&#669;Kk&#310;&#311;&#408;&#409;&#488;&#489;&#7728;&#7729;&#7730;&#7731;&#7732;&#7733;Ll&#313;&#314;&#315;&#316;&#317;&#318;&#319;&#320;&#321;&#322;&#410;&#456;&#564;&#619;&#620;&#621;&#7734;&#7735;&#7736;&#7737;&#7738;&#7739;&#7740;&#7741;Mm&#625;&#7742;&#7743;&#7744;&#7745;&#7746;&#7747;Nn&#209;&#241;&#323;&#324;&#325;&#326;&#327;&#328;&#413;&#626;&#414;&#544;&#459;&#504;&#505;&#565;&#627;&#7748;&#7749;&#7750;&#7751;&#7752;&#7753;&#7754;&#7755;Oo&#210;&#242;&#211;&#243;&#212;&#244;&#213;&#245;&#214;&#246;&#216;&#248;&#332;&#333;&#334;&#335;&#336;&#337;&#415;&#416;&#417;&#465;&#466;&#490;&#491;&#492;&#493;&#510;&#511;&#524;&#525;&#526;&#527;&#554;&#555;&#556;&#557;&#558;&#559;&#560;&#561;&#7756;&#7757;&#7758;&#7759;&#7760;&#7761;&#7762;&#7763;&#7884;&#7885;&#7886;&#7887;&#7888;&#7889;&#7890;&#7891;&#7892;&#7893;&#7894;&#7895;&#7896;&#7897;&#7898;&#7899;&#7900;&#7901;&#7902;&#7903;&#7904;&#7905;&#7906;&#7907;Pp&#420;&#421;&#7764;&#7765;&#7766;&#7767;Qq&#672;Rr&#340;&#341;&#342;&#343;&#344;&#345;&#528;&#529;&#530;&#531;&#636;&#637;&#638;&#7768;&#7769;&#7770;&#7771;&#7772;&#7773;&#7774;&#7775;Ss&#346;&#347;&#348;&#349;&#350;&#351;&#352;&#353;&#536;&#537;&#642;&#7776;&#7777;&#7778;&#7779;&#7780;&#7781;&#7782;&#7783;&#7784;&#7785;Tt&#354;&#355;&#356;&#357;&#358;&#359;&#427;&#428;&#429;&#430;&#648;&#538;&#539;&#566;&#7786;&#7787;&#7788;&#7789;&#7790;&#7791;&#7792;&#7793;&#7831;Uu&#217;&#249;&#218;&#250;&#219;&#251;&#220;&#252;&#360;&#361;&#362;&#363;&#364;&#365;&#366;&#367;&#368;&#369;&#370;&#371;&#431;&#432;&#467;&#468;&#469;&#470;&#471;&#472;&#473;&#474;&#475;&#476;&#532;&#533;&#534;&#535;&#7794;&#7795;&#7796;&#7797;&#7798;&#7799;&#7800;&#7801;&#7802;&#7803;&#7908;&#7909;&#7910;&#7911;&#7912;&#7913;&#7914;&#7915;&#7916;&#7917;&#7918;&#7919;&#7920;&#7921;Vv&#434;&#651;&#7804;&#7805;&#7806;&#7807;Ww&#372;&#373;&#7808;&#7809;&#7810;&#7811;&#7812;&#7813;&#7814;&#7815;&#7816;&#7817;&#7832;Xx&#7818;&#7819;&#7820;&#7821;Yy&#221;&#253;&#255;&#376;&#374;&#375;&#435;&#436;&#562;&#563;&#7822;&#7823;&#7833;&#7922;&#7923;&#7924;&#7925;&#7926;&#7927;&#7928;&#7929;Zz&#377;&#378;&#379;&#380;&#381;&#382;&#437;&#438;&#548;&#549;&#656;&#657;&#7824;&#7825;&#7826;&#7827;&#7828;&#7829;&#7829;', 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBCCCCCCCCCCCCCCCCCDDDDDDDDDDDDDDDDDDDDDDDDEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEFFFFFFGGGGGGGGGGGGGGGGGGGGHHHHHHHHHHHHHHHHHHHHIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIJJJJJJKKKKKKKKKKKKKKLLLLLLLLLLLLLLLLLLLLLLLLLLMMMMMMMMMNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOPPPPPPPPQQQRRRRRRRRRRRRRRRRRRRRRRRSSSSSSSSSSSSSSSSSSSSSSSTTTTTTTTTTTTTTTTTTTTTTTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUVVVVVVVVWWWWWWWWWWWWWWWXXXXXXYYYYYYYYYYYYYYYYYYYYYYYZZZZZZZZZZZZZZZZZZZZZ')"/>
+ </xsl:apply-templates>
+</xsl:template>
+
+<xsl:template match="indexterm" mode="index-primary">
+ <xsl:param name="scope" select="."/>
+ <xsl:param name="role" select="''"/>
+ <xsl:param name="type" select="''"/>
+
+ <xsl:variable name="key" select="normalize-space(concat(primary/@sortas, &quot; &quot;, primary))"/>
+ <xsl:variable name="refs" select="key('primary', $key)[count(ancestor::node()|$scope) = count(ancestor::node()) and ($role = @role or $type = @type or (string-length($role) = 0 and string-length($type) = 0))]"/>
+ <dt>
+ <xsl:for-each select="$refs/primary">
+ <xsl:if test="@id or @xml:id">
+ <a id="{(@id|@xml:id)[1]}"/>
+ </xsl:if>
+ </xsl:for-each>
+ <xsl:value-of select="primary"/>
+ <xsl:choose>
+ <xsl:when test="$index.links.to.section = 1">
+ <xsl:for-each select="$refs[generate-id() = generate-id(key('primary-section', concat($key, &quot; &quot;, generate-id((ancestor-or-self::set|ancestor-or-self::book|ancestor-or-self::part|ancestor-or-self::reference|ancestor-or-self::partintro|ancestor-or-self::chapter|ancestor-or-self::appendix|ancestor-or-self::preface|ancestor-or-self::article|ancestor-or-self::section|ancestor-or-self::sect1|ancestor-or-self::sect2|ancestor-or-self::sect3|ancestor-or-self::sect4|ancestor-or-self::sect5|ancestor-or-self::refentry|ancestor-or-self::refsect1|ancestor-or-self::refsect2|ancestor-or-self::refsect3|ancestor-or-self::simplesect|ancestor-or-self::bibliography|ancestor-or-self::glossary|ancestor-or-self::index|ancestor-or-self::webpage)[last()])))[count(ancestor::node()|$scope) = count(ancestor::node()) and ($role = @role or $type = @type or (string-length($role) = 0 and string-length($type) = 0))][1])]">
+ <xsl:apply-templates select="." mode="reference">
+ <xsl:with-param name="position" select="position()"/>
+ <xsl:with-param name="scope" select="$scope"/>
+ <xsl:with-param name="role" select="$role"/>
+ <xsl:with-param name="type" select="$type"/>
+ </xsl:apply-templates>
+ </xsl:for-each>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:for-each select="$refs[count(ancestor::node()|$scope) = count(ancestor::node()) and ($role = @role or $type = @type or (string-length($role) = 0 and string-length($type) = 0))]">
+ <xsl:apply-templates select="." mode="reference">
+ <xsl:with-param name="position" select="position()"/>
+ <xsl:with-param name="scope" select="$scope"/>
+ <xsl:with-param name="role" select="$role"/>
+ <xsl:with-param name="type" select="$type"/>
+ </xsl:apply-templates>
+ </xsl:for-each>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:if test="$refs[not(secondary)]/*[self::see]">
+ <xsl:apply-templates select="$refs[generate-id() = generate-id(key('see', concat(normalize-space(concat(primary/@sortas, &quot; &quot;, primary)), &quot; &quot;, &quot; &quot;, &quot; &quot;, see))[count(ancestor::node()|$scope) = count(ancestor::node()) and ($role = @role or $type = @type or (string-length($role) = 0 and string-length($type) = 0))][1])]" mode="index-see">
+ <xsl:with-param name="position" select="position()"/>
+ <xsl:with-param name="scope" select="$scope"/>
+ <xsl:with-param name="role" select="$role"/>
+ <xsl:with-param name="type" select="$type"/>
+ <xsl:sort select="translate(see, 'Aa&#192;&#224;&#193;&#225;&#194;&#226;&#195;&#227;&#196;&#228;&#197;&#229;&#256;&#257;&#258;&#259;&#260;&#261;&#461;&#462;&#478;&#479;&#480;&#481;&#506;&#507;&#512;&#513;&#514;&#515;&#550;&#551;&#7680;&#7681;&#7834;&#7840;&#7841;&#7842;&#7843;&#7844;&#7845;&#7846;&#7847;&#7848;&#7849;&#7850;&#7851;&#7852;&#7853;&#7854;&#7855;&#7856;&#7857;&#7858;&#7859;&#7860;&#7861;&#7862;&#7863;Bb&#384;&#385;&#595;&#386;&#387;&#7682;&#7683;&#7684;&#7685;&#7686;&#7687;Cc&#199;&#231;&#262;&#263;&#264;&#265;&#266;&#267;&#268;&#269;&#391;&#392;&#597;&#7688;&#7689;Dd&#270;&#271;&#272;&#273;&#394;&#599;&#395;&#396;&#453;&#498;&#545;&#598;&#7690;&#7691;&#7692;&#7693;&#7694;&#7695;&#7696;&#7697;&#7698;&#7699;Ee&#200;&#232;&#201;&#233;&#202;&#234;&#203;&#235;&#274;&#275;&#276;&#277;&#278;&#279;&#280;&#281;&#282;&#283;&#516;&#517;&#518;&#519;&#552;&#553;&#7700;&#7701;&#7702;&#7703;&#7704;&#7705;&#7706;&#7707;&#7708;&#7709;&#7864;&#7865;&#7866;&#7867;&#7868;&#7869;&#7870;&#7871;&#7872;&#7873;&#7874;&#7875;&#7876;&#7877;&#7878;&#7879;Ff&#401;&#402;&#7710;&#7711;Gg&#284;&#285;&#286;&#287;&#288;&#289;&#290;&#291;&#403;&#608;&#484;&#485;&#486;&#487;&#500;&#501;&#7712;&#7713;Hh&#292;&#293;&#294;&#295;&#542;&#543;&#614;&#7714;&#7715;&#7716;&#7717;&#7718;&#7719;&#7720;&#7721;&#7722;&#7723;&#7830;Ii&#204;&#236;&#205;&#237;&#206;&#238;&#207;&#239;&#296;&#297;&#298;&#299;&#300;&#301;&#302;&#303;&#304;&#407;&#616;&#463;&#464;&#520;&#521;&#522;&#523;&#7724;&#7725;&#7726;&#7727;&#7880;&#7881;&#7882;&#7883;Jj&#308;&#309;&#496;&#669;Kk&#310;&#311;&#408;&#409;&#488;&#489;&#7728;&#7729;&#7730;&#7731;&#7732;&#7733;Ll&#313;&#314;&#315;&#316;&#317;&#318;&#319;&#320;&#321;&#322;&#410;&#456;&#564;&#619;&#620;&#621;&#7734;&#7735;&#7736;&#7737;&#7738;&#7739;&#7740;&#7741;Mm&#625;&#7742;&#7743;&#7744;&#7745;&#7746;&#7747;Nn&#209;&#241;&#323;&#324;&#325;&#326;&#327;&#328;&#413;&#626;&#414;&#544;&#459;&#504;&#505;&#565;&#627;&#7748;&#7749;&#7750;&#7751;&#7752;&#7753;&#7754;&#7755;Oo&#210;&#242;&#211;&#243;&#212;&#244;&#213;&#245;&#214;&#246;&#216;&#248;&#332;&#333;&#334;&#335;&#336;&#337;&#415;&#416;&#417;&#465;&#466;&#490;&#491;&#492;&#493;&#510;&#511;&#524;&#525;&#526;&#527;&#554;&#555;&#556;&#557;&#558;&#559;&#560;&#561;&#7756;&#7757;&#7758;&#7759;&#7760;&#7761;&#7762;&#7763;&#7884;&#7885;&#7886;&#7887;&#7888;&#7889;&#7890;&#7891;&#7892;&#7893;&#7894;&#7895;&#7896;&#7897;&#7898;&#7899;&#7900;&#7901;&#7902;&#7903;&#7904;&#7905;&#7906;&#7907;Pp&#420;&#421;&#7764;&#7765;&#7766;&#7767;Qq&#672;Rr&#340;&#341;&#342;&#343;&#344;&#345;&#528;&#529;&#530;&#531;&#636;&#637;&#638;&#7768;&#7769;&#7770;&#7771;&#7772;&#7773;&#7774;&#7775;Ss&#346;&#347;&#348;&#349;&#350;&#351;&#352;&#353;&#536;&#537;&#642;&#7776;&#7777;&#7778;&#7779;&#7780;&#7781;&#7782;&#7783;&#7784;&#7785;Tt&#354;&#355;&#356;&#357;&#358;&#359;&#427;&#428;&#429;&#430;&#648;&#538;&#539;&#566;&#7786;&#7787;&#7788;&#7789;&#7790;&#7791;&#7792;&#7793;&#7831;Uu&#217;&#249;&#218;&#250;&#219;&#251;&#220;&#252;&#360;&#361;&#362;&#363;&#364;&#365;&#366;&#367;&#368;&#369;&#370;&#371;&#431;&#432;&#467;&#468;&#469;&#470;&#471;&#472;&#473;&#474;&#475;&#476;&#532;&#533;&#534;&#535;&#7794;&#7795;&#7796;&#7797;&#7798;&#7799;&#7800;&#7801;&#7802;&#7803;&#7908;&#7909;&#7910;&#7911;&#7912;&#7913;&#7914;&#7915;&#7916;&#7917;&#7918;&#7919;&#7920;&#7921;Vv&#434;&#651;&#7804;&#7805;&#7806;&#7807;Ww&#372;&#373;&#7808;&#7809;&#7810;&#7811;&#7812;&#7813;&#7814;&#7815;&#7816;&#7817;&#7832;Xx&#7818;&#7819;&#7820;&#7821;Yy&#221;&#253;&#255;&#376;&#374;&#375;&#435;&#436;&#562;&#563;&#7822;&#7823;&#7833;&#7922;&#7923;&#7924;&#7925;&#7926;&#7927;&#7928;&#7929;Zz&#377;&#378;&#379;&#380;&#381;&#382;&#437;&#438;&#548;&#549;&#656;&#657;&#7824;&#7825;&#7826;&#7827;&#7828;&#7829;&#7829;', 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBCCCCCCCCCCCCCCCCCDDDDDDDDDDDDDDDDDDDDDDDDEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEFFFFFFGGGGGGGGGGGGGGGGGGGGHHHHHHHHHHHHHHHHHHHHIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIJJJJJJKKKKKKKKKKKKKKLLLLLLLLLLLLLLLLLLLLLLLLLLMMMMMMMMMNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOPPPPPPPPQQQRRRRRRRRRRRRRRRRRRRRRRRSSSSSSSSSSSSSSSSSSSSSSSTTTTTTTTTTTTTTTTTTTTTTTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUVVVVVVVVWWWWWWWWWWWWWWWXXXXXXYYYYYYYYYYYYYYYYYYYYYYYZZZZZZZZZZZZZZZZZZZZZ')"/>
+ </xsl:apply-templates>
+ </xsl:if>
+ </dt>
+ <xsl:if test="$refs/secondary or $refs[not(secondary)]/*[self::seealso]">
+ <dd>
+ <dl>
+ <xsl:apply-templates select="$refs[generate-id() = generate-id(key('see-also', concat(normalize-space(concat(primary/@sortas, &quot; &quot;, primary)), &quot; &quot;, &quot; &quot;, &quot; &quot;, seealso))[count(ancestor::node()|$scope) = count(ancestor::node()) and ($role = @role or $type = @type or (string-length($role) = 0 and string-length($type) = 0))][1])]" mode="index-seealso">
+ <xsl:with-param name="position" select="position()"/>
+ <xsl:with-param name="scope" select="$scope"/>
+ <xsl:with-param name="role" select="$role"/>
+ <xsl:with-param name="type" select="$type"/>
+ <xsl:sort select="translate(seealso, 'Aa&#192;&#224;&#193;&#225;&#194;&#226;&#195;&#227;&#196;&#228;&#197;&#229;&#256;&#257;&#258;&#259;&#260;&#261;&#461;&#462;&#478;&#479;&#480;&#481;&#506;&#507;&#512;&#513;&#514;&#515;&#550;&#551;&#7680;&#7681;&#7834;&#7840;&#7841;&#7842;&#7843;&#7844;&#7845;&#7846;&#7847;&#7848;&#7849;&#7850;&#7851;&#7852;&#7853;&#7854;&#7855;&#7856;&#7857;&#7858;&#7859;&#7860;&#7861;&#7862;&#7863;Bb&#384;&#385;&#595;&#386;&#387;&#7682;&#7683;&#7684;&#7685;&#7686;&#7687;Cc&#199;&#231;&#262;&#263;&#264;&#265;&#266;&#267;&#268;&#269;&#391;&#392;&#597;&#7688;&#7689;Dd&#270;&#271;&#272;&#273;&#394;&#599;&#395;&#396;&#453;&#498;&#545;&#598;&#7690;&#7691;&#7692;&#7693;&#7694;&#7695;&#7696;&#7697;&#7698;&#7699;Ee&#200;&#232;&#201;&#233;&#202;&#234;&#203;&#235;&#274;&#275;&#276;&#277;&#278;&#279;&#280;&#281;&#282;&#283;&#516;&#517;&#518;&#519;&#552;&#553;&#7700;&#7701;&#7702;&#7703;&#7704;&#7705;&#7706;&#7707;&#7708;&#7709;&#7864;&#7865;&#7866;&#7867;&#7868;&#7869;&#7870;&#7871;&#7872;&#7873;&#7874;&#7875;&#7876;&#7877;&#7878;&#7879;Ff&#401;&#402;&#7710;&#7711;Gg&#284;&#285;&#286;&#287;&#288;&#289;&#290;&#291;&#403;&#608;&#484;&#485;&#486;&#487;&#500;&#501;&#7712;&#7713;Hh&#292;&#293;&#294;&#295;&#542;&#543;&#614;&#7714;&#7715;&#7716;&#7717;&#7718;&#7719;&#7720;&#7721;&#7722;&#7723;&#7830;Ii&#204;&#236;&#205;&#237;&#206;&#238;&#207;&#239;&#296;&#297;&#298;&#299;&#300;&#301;&#302;&#303;&#304;&#407;&#616;&#463;&#464;&#520;&#521;&#522;&#523;&#7724;&#7725;&#7726;&#7727;&#7880;&#7881;&#7882;&#7883;Jj&#308;&#309;&#496;&#669;Kk&#310;&#311;&#408;&#409;&#488;&#489;&#7728;&#7729;&#7730;&#7731;&#7732;&#7733;Ll&#313;&#314;&#315;&#316;&#317;&#318;&#319;&#320;&#321;&#322;&#410;&#456;&#564;&#619;&#620;&#621;&#7734;&#7735;&#7736;&#7737;&#7738;&#7739;&#7740;&#7741;Mm&#625;&#7742;&#7743;&#7744;&#7745;&#7746;&#7747;Nn&#209;&#241;&#323;&#324;&#325;&#326;&#327;&#328;&#413;&#626;&#414;&#544;&#459;&#504;&#505;&#565;&#627;&#7748;&#7749;&#7750;&#7751;&#7752;&#7753;&#7754;&#7755;Oo&#210;&#242;&#211;&#243;&#212;&#244;&#213;&#245;&#214;&#246;&#216;&#248;&#332;&#333;&#334;&#335;&#336;&#337;&#415;&#416;&#417;&#465;&#466;&#490;&#491;&#492;&#493;&#510;&#511;&#524;&#525;&#526;&#527;&#554;&#555;&#556;&#557;&#558;&#559;&#560;&#561;&#7756;&#7757;&#7758;&#7759;&#7760;&#7761;&#7762;&#7763;&#7884;&#7885;&#7886;&#7887;&#7888;&#7889;&#7890;&#7891;&#7892;&#7893;&#7894;&#7895;&#7896;&#7897;&#7898;&#7899;&#7900;&#7901;&#7902;&#7903;&#7904;&#7905;&#7906;&#7907;Pp&#420;&#421;&#7764;&#7765;&#7766;&#7767;Qq&#672;Rr&#340;&#341;&#342;&#343;&#344;&#345;&#528;&#529;&#530;&#531;&#636;&#637;&#638;&#7768;&#7769;&#7770;&#7771;&#7772;&#7773;&#7774;&#7775;Ss&#346;&#347;&#348;&#349;&#350;&#351;&#352;&#353;&#536;&#537;&#642;&#7776;&#7777;&#7778;&#7779;&#7780;&#7781;&#7782;&#7783;&#7784;&#7785;Tt&#354;&#355;&#356;&#357;&#358;&#359;&#427;&#428;&#429;&#430;&#648;&#538;&#539;&#566;&#7786;&#7787;&#7788;&#7789;&#7790;&#7791;&#7792;&#7793;&#7831;Uu&#217;&#249;&#218;&#250;&#219;&#251;&#220;&#252;&#360;&#361;&#362;&#363;&#364;&#365;&#366;&#367;&#368;&#369;&#370;&#371;&#431;&#432;&#467;&#468;&#469;&#470;&#471;&#472;&#473;&#474;&#475;&#476;&#532;&#533;&#534;&#535;&#7794;&#7795;&#7796;&#7797;&#7798;&#7799;&#7800;&#7801;&#7802;&#7803;&#7908;&#7909;&#7910;&#7911;&#7912;&#7913;&#7914;&#7915;&#7916;&#7917;&#7918;&#7919;&#7920;&#7921;Vv&#434;&#651;&#7804;&#7805;&#7806;&#7807;Ww&#372;&#373;&#7808;&#7809;&#7810;&#7811;&#7812;&#7813;&#7814;&#7815;&#7816;&#7817;&#7832;Xx&#7818;&#7819;&#7820;&#7821;Yy&#221;&#253;&#255;&#376;&#374;&#375;&#435;&#436;&#562;&#563;&#7822;&#7823;&#7833;&#7922;&#7923;&#7924;&#7925;&#7926;&#7927;&#7928;&#7929;Zz&#377;&#378;&#379;&#380;&#381;&#382;&#437;&#438;&#548;&#549;&#656;&#657;&#7824;&#7825;&#7826;&#7827;&#7828;&#7829;&#7829;', 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBCCCCCCCCCCCCCCCCCDDDDDDDDDDDDDDDDDDDDDDDDEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEFFFFFFGGGGGGGGGGGGGGGGGGGGHHHHHHHHHHHHHHHHHHHHIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIJJJJJJKKKKKKKKKKKKKKLLLLLLLLLLLLLLLLLLLLLLLLLLMMMMMMMMMNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOPPPPPPPPQQQRRRRRRRRRRRRRRRRRRRRRRRSSSSSSSSSSSSSSSSSSSSSSSTTTTTTTTTTTTTTTTTTTTTTTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUVVVVVVVVWWWWWWWWWWWWWWWXXXXXXYYYYYYYYYYYYYYYYYYYYYYYZZZZZZZZZZZZZZZZZZZZZ')"/>
+ </xsl:apply-templates>
+ <xsl:apply-templates select="$refs[secondary and count(.|key('secondary', concat($key, &quot; &quot;, normalize-space(concat(secondary/@sortas, &quot; &quot;, secondary))))[count(ancestor::node()|$scope) = count(ancestor::node()) and ($role = @role or $type = @type or (string-length($role) = 0 and string-length($type) = 0))][1]) = 1]" mode="index-secondary">
+ <xsl:with-param name="position" select="position()"/>
+ <xsl:with-param name="scope" select="$scope"/>
+ <xsl:with-param name="role" select="$role"/>
+ <xsl:with-param name="type" select="$type"/>
+ <xsl:sort select="translate(normalize-space(concat(secondary/@sortas, &quot; &quot;, secondary)), 'Aa&#192;&#224;&#193;&#225;&#194;&#226;&#195;&#227;&#196;&#228;&#197;&#229;&#256;&#257;&#258;&#259;&#260;&#261;&#461;&#462;&#478;&#479;&#480;&#481;&#506;&#507;&#512;&#513;&#514;&#515;&#550;&#551;&#7680;&#7681;&#7834;&#7840;&#7841;&#7842;&#7843;&#7844;&#7845;&#7846;&#7847;&#7848;&#7849;&#7850;&#7851;&#7852;&#7853;&#7854;&#7855;&#7856;&#7857;&#7858;&#7859;&#7860;&#7861;&#7862;&#7863;Bb&#384;&#385;&#595;&#386;&#387;&#7682;&#7683;&#7684;&#7685;&#7686;&#7687;Cc&#199;&#231;&#262;&#263;&#264;&#265;&#266;&#267;&#268;&#269;&#391;&#392;&#597;&#7688;&#7689;Dd&#270;&#271;&#272;&#273;&#394;&#599;&#395;&#396;&#453;&#498;&#545;&#598;&#7690;&#7691;&#7692;&#7693;&#7694;&#7695;&#7696;&#7697;&#7698;&#7699;Ee&#200;&#232;&#201;&#233;&#202;&#234;&#203;&#235;&#274;&#275;&#276;&#277;&#278;&#279;&#280;&#281;&#282;&#283;&#516;&#517;&#518;&#519;&#552;&#553;&#7700;&#7701;&#7702;&#7703;&#7704;&#7705;&#7706;&#7707;&#7708;&#7709;&#7864;&#7865;&#7866;&#7867;&#7868;&#7869;&#7870;&#7871;&#7872;&#7873;&#7874;&#7875;&#7876;&#7877;&#7878;&#7879;Ff&#401;&#402;&#7710;&#7711;Gg&#284;&#285;&#286;&#287;&#288;&#289;&#290;&#291;&#403;&#608;&#484;&#485;&#486;&#487;&#500;&#501;&#7712;&#7713;Hh&#292;&#293;&#294;&#295;&#542;&#543;&#614;&#7714;&#7715;&#7716;&#7717;&#7718;&#7719;&#7720;&#7721;&#7722;&#7723;&#7830;Ii&#204;&#236;&#205;&#237;&#206;&#238;&#207;&#239;&#296;&#297;&#298;&#299;&#300;&#301;&#302;&#303;&#304;&#407;&#616;&#463;&#464;&#520;&#521;&#522;&#523;&#7724;&#7725;&#7726;&#7727;&#7880;&#7881;&#7882;&#7883;Jj&#308;&#309;&#496;&#669;Kk&#310;&#311;&#408;&#409;&#488;&#489;&#7728;&#7729;&#7730;&#7731;&#7732;&#7733;Ll&#313;&#314;&#315;&#316;&#317;&#318;&#319;&#320;&#321;&#322;&#410;&#456;&#564;&#619;&#620;&#621;&#7734;&#7735;&#7736;&#7737;&#7738;&#7739;&#7740;&#7741;Mm&#625;&#7742;&#7743;&#7744;&#7745;&#7746;&#7747;Nn&#209;&#241;&#323;&#324;&#325;&#326;&#327;&#328;&#413;&#626;&#414;&#544;&#459;&#504;&#505;&#565;&#627;&#7748;&#7749;&#7750;&#7751;&#7752;&#7753;&#7754;&#7755;Oo&#210;&#242;&#211;&#243;&#212;&#244;&#213;&#245;&#214;&#246;&#216;&#248;&#332;&#333;&#334;&#335;&#336;&#337;&#415;&#416;&#417;&#465;&#466;&#490;&#491;&#492;&#493;&#510;&#511;&#524;&#525;&#526;&#527;&#554;&#555;&#556;&#557;&#558;&#559;&#560;&#561;&#7756;&#7757;&#7758;&#7759;&#7760;&#7761;&#7762;&#7763;&#7884;&#7885;&#7886;&#7887;&#7888;&#7889;&#7890;&#7891;&#7892;&#7893;&#7894;&#7895;&#7896;&#7897;&#7898;&#7899;&#7900;&#7901;&#7902;&#7903;&#7904;&#7905;&#7906;&#7907;Pp&#420;&#421;&#7764;&#7765;&#7766;&#7767;Qq&#672;Rr&#340;&#341;&#342;&#343;&#344;&#345;&#528;&#529;&#530;&#531;&#636;&#637;&#638;&#7768;&#7769;&#7770;&#7771;&#7772;&#7773;&#7774;&#7775;Ss&#346;&#347;&#348;&#349;&#350;&#351;&#352;&#353;&#536;&#537;&#642;&#7776;&#7777;&#7778;&#7779;&#7780;&#7781;&#7782;&#7783;&#7784;&#7785;Tt&#354;&#355;&#356;&#357;&#358;&#359;&#427;&#428;&#429;&#430;&#648;&#538;&#539;&#566;&#7786;&#7787;&#7788;&#7789;&#7790;&#7791;&#7792;&#7793;&#7831;Uu&#217;&#249;&#218;&#250;&#219;&#251;&#220;&#252;&#360;&#361;&#362;&#363;&#364;&#365;&#366;&#367;&#368;&#369;&#370;&#371;&#431;&#432;&#467;&#468;&#469;&#470;&#471;&#472;&#473;&#474;&#475;&#476;&#532;&#533;&#534;&#535;&#7794;&#7795;&#7796;&#7797;&#7798;&#7799;&#7800;&#7801;&#7802;&#7803;&#7908;&#7909;&#7910;&#7911;&#7912;&#7913;&#7914;&#7915;&#7916;&#7917;&#7918;&#7919;&#7920;&#7921;Vv&#434;&#651;&#7804;&#7805;&#7806;&#7807;Ww&#372;&#373;&#7808;&#7809;&#7810;&#7811;&#7812;&#7813;&#7814;&#7815;&#7816;&#7817;&#7832;Xx&#7818;&#7819;&#7820;&#7821;Yy&#221;&#253;&#255;&#376;&#374;&#375;&#435;&#436;&#562;&#563;&#7822;&#7823;&#7833;&#7922;&#7923;&#7924;&#7925;&#7926;&#7927;&#7928;&#7929;Zz&#377;&#378;&#379;&#380;&#381;&#382;&#437;&#438;&#548;&#549;&#656;&#657;&#7824;&#7825;&#7826;&#7827;&#7828;&#7829;&#7829;', 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBCCCCCCCCCCCCCCCCCDDDDDDDDDDDDDDDDDDDDDDDDEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEFFFFFFGGGGGGGGGGGGGGGGGGGGHHHHHHHHHHHHHHHHHHHHIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIJJJJJJKKKKKKKKKKKKKKLLLLLLLLLLLLLLLLLLLLLLLLLLMMMMMMMMMNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOPPPPPPPPQQQRRRRRRRRRRRRRRRRRRRRRRRSSSSSSSSSSSSSSSSSSSSSSSTTTTTTTTTTTTTTTTTTTTTTTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUVVVVVVVVWWWWWWWWWWWWWWWXXXXXXYYYYYYYYYYYYYYYYYYYYYYYZZZZZZZZZZZZZZZZZZZZZ')"/>
+ </xsl:apply-templates>
+ </dl>
+ </dd>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="indexterm" mode="index-secondary">
+ <xsl:param name="scope" select="."/>
+ <xsl:param name="role" select="''"/>
+ <xsl:param name="type" select="''"/>
+
+ <xsl:variable name="key" select="concat(normalize-space(concat(primary/@sortas, &quot; &quot;, primary)), &quot; &quot;, normalize-space(concat(secondary/@sortas, &quot; &quot;, secondary)))"/>
+ <xsl:variable name="refs" select="key('secondary', $key)[count(ancestor::node()|$scope) = count(ancestor::node()) and ($role = @role or $type = @type or (string-length($role) = 0 and string-length($type) = 0))]"/>
+ <dt>
+ <xsl:for-each select="$refs/secondary">
+ <xsl:if test="@id or @xml:id">
+ <a id="{(@id|@xml:id)[1]}"/>
+ </xsl:if>
+ </xsl:for-each>
+ <xsl:value-of select="secondary"/>
+ <xsl:choose>
+ <xsl:when test="$index.links.to.section = 1">
+ <xsl:for-each select="$refs[generate-id() = generate-id(key('secondary-section', concat($key, &quot; &quot;, generate-id((ancestor-or-self::set|ancestor-or-self::book|ancestor-or-self::part|ancestor-or-self::reference|ancestor-or-self::partintro|ancestor-or-self::chapter|ancestor-or-self::appendix|ancestor-or-self::preface|ancestor-or-self::article|ancestor-or-self::section|ancestor-or-self::sect1|ancestor-or-self::sect2|ancestor-or-self::sect3|ancestor-or-self::sect4|ancestor-or-self::sect5|ancestor-or-self::refentry|ancestor-or-self::refsect1|ancestor-or-self::refsect2|ancestor-or-self::refsect3|ancestor-or-self::simplesect|ancestor-or-self::bibliography|ancestor-or-self::glossary|ancestor-or-self::index|ancestor-or-self::webpage)[last()])))[count(ancestor::node()|$scope) = count(ancestor::node()) and ($role = @role or $type = @type or (string-length($role) = 0 and string-length($type) = 0))][1])]">
+ <xsl:apply-templates select="." mode="reference">
+ <xsl:with-param name="position" select="position()"/>
+ <xsl:with-param name="scope" select="$scope"/>
+ <xsl:with-param name="role" select="$role"/>
+ <xsl:with-param name="type" select="$type"/>
+ </xsl:apply-templates>
+ </xsl:for-each>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:for-each select="$refs[count(ancestor::node()|$scope) = count(ancestor::node()) and ($role = @role or $type = @type or (string-length($role) = 0 and string-length($type) = 0))]">
+ <xsl:apply-templates select="." mode="reference">
+ <xsl:with-param name="position" select="position()"/>
+ <xsl:with-param name="scope" select="$scope"/>
+ <xsl:with-param name="role" select="$role"/>
+ <xsl:with-param name="type" select="$type"/>
+ </xsl:apply-templates>
+ </xsl:for-each>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:if test="$refs[not(tertiary)]/*[self::see]">
+ <xsl:apply-templates select="$refs[generate-id() = generate-id(key('see', concat(normalize-space(concat(primary/@sortas, &quot; &quot;, primary)), &quot; &quot;, normalize-space(concat(secondary/@sortas, &quot; &quot;, secondary)), &quot; &quot;, &quot; &quot;, see))[count(ancestor::node()|$scope) = count(ancestor::node()) and ($role = @role or $type = @type or (string-length($role) = 0 and string-length($type) = 0))][1])]" mode="index-see">
+ <xsl:with-param name="position" select="position()"/>
+ <xsl:with-param name="scope" select="$scope"/>
+ <xsl:with-param name="role" select="$role"/>
+ <xsl:with-param name="type" select="$type"/>
+ <xsl:sort select="translate(see, 'Aa&#192;&#224;&#193;&#225;&#194;&#226;&#195;&#227;&#196;&#228;&#197;&#229;&#256;&#257;&#258;&#259;&#260;&#261;&#461;&#462;&#478;&#479;&#480;&#481;&#506;&#507;&#512;&#513;&#514;&#515;&#550;&#551;&#7680;&#7681;&#7834;&#7840;&#7841;&#7842;&#7843;&#7844;&#7845;&#7846;&#7847;&#7848;&#7849;&#7850;&#7851;&#7852;&#7853;&#7854;&#7855;&#7856;&#7857;&#7858;&#7859;&#7860;&#7861;&#7862;&#7863;Bb&#384;&#385;&#595;&#386;&#387;&#7682;&#7683;&#7684;&#7685;&#7686;&#7687;Cc&#199;&#231;&#262;&#263;&#264;&#265;&#266;&#267;&#268;&#269;&#391;&#392;&#597;&#7688;&#7689;Dd&#270;&#271;&#272;&#273;&#394;&#599;&#395;&#396;&#453;&#498;&#545;&#598;&#7690;&#7691;&#7692;&#7693;&#7694;&#7695;&#7696;&#7697;&#7698;&#7699;Ee&#200;&#232;&#201;&#233;&#202;&#234;&#203;&#235;&#274;&#275;&#276;&#277;&#278;&#279;&#280;&#281;&#282;&#283;&#516;&#517;&#518;&#519;&#552;&#553;&#7700;&#7701;&#7702;&#7703;&#7704;&#7705;&#7706;&#7707;&#7708;&#7709;&#7864;&#7865;&#7866;&#7867;&#7868;&#7869;&#7870;&#7871;&#7872;&#7873;&#7874;&#7875;&#7876;&#7877;&#7878;&#7879;Ff&#401;&#402;&#7710;&#7711;Gg&#284;&#285;&#286;&#287;&#288;&#289;&#290;&#291;&#403;&#608;&#484;&#485;&#486;&#487;&#500;&#501;&#7712;&#7713;Hh&#292;&#293;&#294;&#295;&#542;&#543;&#614;&#7714;&#7715;&#7716;&#7717;&#7718;&#7719;&#7720;&#7721;&#7722;&#7723;&#7830;Ii&#204;&#236;&#205;&#237;&#206;&#238;&#207;&#239;&#296;&#297;&#298;&#299;&#300;&#301;&#302;&#303;&#304;&#407;&#616;&#463;&#464;&#520;&#521;&#522;&#523;&#7724;&#7725;&#7726;&#7727;&#7880;&#7881;&#7882;&#7883;Jj&#308;&#309;&#496;&#669;Kk&#310;&#311;&#408;&#409;&#488;&#489;&#7728;&#7729;&#7730;&#7731;&#7732;&#7733;Ll&#313;&#314;&#315;&#316;&#317;&#318;&#319;&#320;&#321;&#322;&#410;&#456;&#564;&#619;&#620;&#621;&#7734;&#7735;&#7736;&#7737;&#7738;&#7739;&#7740;&#7741;Mm&#625;&#7742;&#7743;&#7744;&#7745;&#7746;&#7747;Nn&#209;&#241;&#323;&#324;&#325;&#326;&#327;&#328;&#413;&#626;&#414;&#544;&#459;&#504;&#505;&#565;&#627;&#7748;&#7749;&#7750;&#7751;&#7752;&#7753;&#7754;&#7755;Oo&#210;&#242;&#211;&#243;&#212;&#244;&#213;&#245;&#214;&#246;&#216;&#248;&#332;&#333;&#334;&#335;&#336;&#337;&#415;&#416;&#417;&#465;&#466;&#490;&#491;&#492;&#493;&#510;&#511;&#524;&#525;&#526;&#527;&#554;&#555;&#556;&#557;&#558;&#559;&#560;&#561;&#7756;&#7757;&#7758;&#7759;&#7760;&#7761;&#7762;&#7763;&#7884;&#7885;&#7886;&#7887;&#7888;&#7889;&#7890;&#7891;&#7892;&#7893;&#7894;&#7895;&#7896;&#7897;&#7898;&#7899;&#7900;&#7901;&#7902;&#7903;&#7904;&#7905;&#7906;&#7907;Pp&#420;&#421;&#7764;&#7765;&#7766;&#7767;Qq&#672;Rr&#340;&#341;&#342;&#343;&#344;&#345;&#528;&#529;&#530;&#531;&#636;&#637;&#638;&#7768;&#7769;&#7770;&#7771;&#7772;&#7773;&#7774;&#7775;Ss&#346;&#347;&#348;&#349;&#350;&#351;&#352;&#353;&#536;&#537;&#642;&#7776;&#7777;&#7778;&#7779;&#7780;&#7781;&#7782;&#7783;&#7784;&#7785;Tt&#354;&#355;&#356;&#357;&#358;&#359;&#427;&#428;&#429;&#430;&#648;&#538;&#539;&#566;&#7786;&#7787;&#7788;&#7789;&#7790;&#7791;&#7792;&#7793;&#7831;Uu&#217;&#249;&#218;&#250;&#219;&#251;&#220;&#252;&#360;&#361;&#362;&#363;&#364;&#365;&#366;&#367;&#368;&#369;&#370;&#371;&#431;&#432;&#467;&#468;&#469;&#470;&#471;&#472;&#473;&#474;&#475;&#476;&#532;&#533;&#534;&#535;&#7794;&#7795;&#7796;&#7797;&#7798;&#7799;&#7800;&#7801;&#7802;&#7803;&#7908;&#7909;&#7910;&#7911;&#7912;&#7913;&#7914;&#7915;&#7916;&#7917;&#7918;&#7919;&#7920;&#7921;Vv&#434;&#651;&#7804;&#7805;&#7806;&#7807;Ww&#372;&#373;&#7808;&#7809;&#7810;&#7811;&#7812;&#7813;&#7814;&#7815;&#7816;&#7817;&#7832;Xx&#7818;&#7819;&#7820;&#7821;Yy&#221;&#253;&#255;&#376;&#374;&#375;&#435;&#436;&#562;&#563;&#7822;&#7823;&#7833;&#7922;&#7923;&#7924;&#7925;&#7926;&#7927;&#7928;&#7929;Zz&#377;&#378;&#379;&#380;&#381;&#382;&#437;&#438;&#548;&#549;&#656;&#657;&#7824;&#7825;&#7826;&#7827;&#7828;&#7829;&#7829;', 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBCCCCCCCCCCCCCCCCCDDDDDDDDDDDDDDDDDDDDDDDDEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEFFFFFFGGGGGGGGGGGGGGGGGGGGHHHHHHHHHHHHHHHHHHHHIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIJJJJJJKKKKKKKKKKKKKKLLLLLLLLLLLLLLLLLLLLLLLLLLMMMMMMMMMNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOPPPPPPPPQQQRRRRRRRRRRRRRRRRRRRRRRRSSSSSSSSSSSSSSSSSSSSSSSTTTTTTTTTTTTTTTTTTTTTTTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUVVVVVVVVWWWWWWWWWWWWWWWXXXXXXYYYYYYYYYYYYYYYYYYYYYYYZZZZZZZZZZZZZZZZZZZZZ')"/>
+ </xsl:apply-templates>
+ </xsl:if>
+ </dt>
+ <xsl:if test="$refs/tertiary or $refs[not(tertiary)]/*[self::seealso]">
+ <dd>
+ <dl>
+ <xsl:apply-templates select="$refs[generate-id() = generate-id(key('see-also', concat(normalize-space(concat(primary/@sortas, &quot; &quot;, primary)), &quot; &quot;, normalize-space(concat(secondary/@sortas, &quot; &quot;, secondary)), &quot; &quot;, &quot; &quot;, seealso))[count(ancestor::node()|$scope) = count(ancestor::node()) and ($role = @role or $type = @type or (string-length($role) = 0 and string-length($type) = 0))][1])]" mode="index-seealso">
+ <xsl:with-param name="position" select="position()"/>
+ <xsl:with-param name="scope" select="$scope"/>
+ <xsl:with-param name="role" select="$role"/>
+ <xsl:with-param name="type" select="$type"/>
+ <xsl:sort select="translate(seealso, 'Aa&#192;&#224;&#193;&#225;&#194;&#226;&#195;&#227;&#196;&#228;&#197;&#229;&#256;&#257;&#258;&#259;&#260;&#261;&#461;&#462;&#478;&#479;&#480;&#481;&#506;&#507;&#512;&#513;&#514;&#515;&#550;&#551;&#7680;&#7681;&#7834;&#7840;&#7841;&#7842;&#7843;&#7844;&#7845;&#7846;&#7847;&#7848;&#7849;&#7850;&#7851;&#7852;&#7853;&#7854;&#7855;&#7856;&#7857;&#7858;&#7859;&#7860;&#7861;&#7862;&#7863;Bb&#384;&#385;&#595;&#386;&#387;&#7682;&#7683;&#7684;&#7685;&#7686;&#7687;Cc&#199;&#231;&#262;&#263;&#264;&#265;&#266;&#267;&#268;&#269;&#391;&#392;&#597;&#7688;&#7689;Dd&#270;&#271;&#272;&#273;&#394;&#599;&#395;&#396;&#453;&#498;&#545;&#598;&#7690;&#7691;&#7692;&#7693;&#7694;&#7695;&#7696;&#7697;&#7698;&#7699;Ee&#200;&#232;&#201;&#233;&#202;&#234;&#203;&#235;&#274;&#275;&#276;&#277;&#278;&#279;&#280;&#281;&#282;&#283;&#516;&#517;&#518;&#519;&#552;&#553;&#7700;&#7701;&#7702;&#7703;&#7704;&#7705;&#7706;&#7707;&#7708;&#7709;&#7864;&#7865;&#7866;&#7867;&#7868;&#7869;&#7870;&#7871;&#7872;&#7873;&#7874;&#7875;&#7876;&#7877;&#7878;&#7879;Ff&#401;&#402;&#7710;&#7711;Gg&#284;&#285;&#286;&#287;&#288;&#289;&#290;&#291;&#403;&#608;&#484;&#485;&#486;&#487;&#500;&#501;&#7712;&#7713;Hh&#292;&#293;&#294;&#295;&#542;&#543;&#614;&#7714;&#7715;&#7716;&#7717;&#7718;&#7719;&#7720;&#7721;&#7722;&#7723;&#7830;Ii&#204;&#236;&#205;&#237;&#206;&#238;&#207;&#239;&#296;&#297;&#298;&#299;&#300;&#301;&#302;&#303;&#304;&#407;&#616;&#463;&#464;&#520;&#521;&#522;&#523;&#7724;&#7725;&#7726;&#7727;&#7880;&#7881;&#7882;&#7883;Jj&#308;&#309;&#496;&#669;Kk&#310;&#311;&#408;&#409;&#488;&#489;&#7728;&#7729;&#7730;&#7731;&#7732;&#7733;Ll&#313;&#314;&#315;&#316;&#317;&#318;&#319;&#320;&#321;&#322;&#410;&#456;&#564;&#619;&#620;&#621;&#7734;&#7735;&#7736;&#7737;&#7738;&#7739;&#7740;&#7741;Mm&#625;&#7742;&#7743;&#7744;&#7745;&#7746;&#7747;Nn&#209;&#241;&#323;&#324;&#325;&#326;&#327;&#328;&#413;&#626;&#414;&#544;&#459;&#504;&#505;&#565;&#627;&#7748;&#7749;&#7750;&#7751;&#7752;&#7753;&#7754;&#7755;Oo&#210;&#242;&#211;&#243;&#212;&#244;&#213;&#245;&#214;&#246;&#216;&#248;&#332;&#333;&#334;&#335;&#336;&#337;&#415;&#416;&#417;&#465;&#466;&#490;&#491;&#492;&#493;&#510;&#511;&#524;&#525;&#526;&#527;&#554;&#555;&#556;&#557;&#558;&#559;&#560;&#561;&#7756;&#7757;&#7758;&#7759;&#7760;&#7761;&#7762;&#7763;&#7884;&#7885;&#7886;&#7887;&#7888;&#7889;&#7890;&#7891;&#7892;&#7893;&#7894;&#7895;&#7896;&#7897;&#7898;&#7899;&#7900;&#7901;&#7902;&#7903;&#7904;&#7905;&#7906;&#7907;Pp&#420;&#421;&#7764;&#7765;&#7766;&#7767;Qq&#672;Rr&#340;&#341;&#342;&#343;&#344;&#345;&#528;&#529;&#530;&#531;&#636;&#637;&#638;&#7768;&#7769;&#7770;&#7771;&#7772;&#7773;&#7774;&#7775;Ss&#346;&#347;&#348;&#349;&#350;&#351;&#352;&#353;&#536;&#537;&#642;&#7776;&#7777;&#7778;&#7779;&#7780;&#7781;&#7782;&#7783;&#7784;&#7785;Tt&#354;&#355;&#356;&#357;&#358;&#359;&#427;&#428;&#429;&#430;&#648;&#538;&#539;&#566;&#7786;&#7787;&#7788;&#7789;&#7790;&#7791;&#7792;&#7793;&#7831;Uu&#217;&#249;&#218;&#250;&#219;&#251;&#220;&#252;&#360;&#361;&#362;&#363;&#364;&#365;&#366;&#367;&#368;&#369;&#370;&#371;&#431;&#432;&#467;&#468;&#469;&#470;&#471;&#472;&#473;&#474;&#475;&#476;&#532;&#533;&#534;&#535;&#7794;&#7795;&#7796;&#7797;&#7798;&#7799;&#7800;&#7801;&#7802;&#7803;&#7908;&#7909;&#7910;&#7911;&#7912;&#7913;&#7914;&#7915;&#7916;&#7917;&#7918;&#7919;&#7920;&#7921;Vv&#434;&#651;&#7804;&#7805;&#7806;&#7807;Ww&#372;&#373;&#7808;&#7809;&#7810;&#7811;&#7812;&#7813;&#7814;&#7815;&#7816;&#7817;&#7832;Xx&#7818;&#7819;&#7820;&#7821;Yy&#221;&#253;&#255;&#376;&#374;&#375;&#435;&#436;&#562;&#563;&#7822;&#7823;&#7833;&#7922;&#7923;&#7924;&#7925;&#7926;&#7927;&#7928;&#7929;Zz&#377;&#378;&#379;&#380;&#381;&#382;&#437;&#438;&#548;&#549;&#656;&#657;&#7824;&#7825;&#7826;&#7827;&#7828;&#7829;&#7829;', 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBCCCCCCCCCCCCCCCCCDDDDDDDDDDDDDDDDDDDDDDDDEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEFFFFFFGGGGGGGGGGGGGGGGGGGGHHHHHHHHHHHHHHHHHHHHIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIJJJJJJKKKKKKKKKKKKKKLLLLLLLLLLLLLLLLLLLLLLLLLLMMMMMMMMMNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOPPPPPPPPQQQRRRRRRRRRRRRRRRRRRRRRRRSSSSSSSSSSSSSSSSSSSSSSSTTTTTTTTTTTTTTTTTTTTTTTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUVVVVVVVVWWWWWWWWWWWWWWWXXXXXXYYYYYYYYYYYYYYYYYYYYYYYZZZZZZZZZZZZZZZZZZZZZ')"/>
+ </xsl:apply-templates>
+ <xsl:apply-templates select="$refs[tertiary and count(.|key('tertiary', concat($key, &quot; &quot;, normalize-space(concat(tertiary/@sortas, &quot; &quot;, tertiary))))[count(ancestor::node()|$scope) = count(ancestor::node()) and ($role = @role or $type = @type or (string-length($role) = 0 and string-length($type) = 0))][1]) = 1]" mode="index-tertiary">
+ <xsl:with-param name="position" select="position()"/>
+ <xsl:with-param name="scope" select="$scope"/>
+ <xsl:with-param name="role" select="$role"/>
+ <xsl:with-param name="type" select="$type"/>
+ <xsl:sort select="translate(normalize-space(concat(tertiary/@sortas, &quot; &quot;, tertiary)), 'Aa&#192;&#224;&#193;&#225;&#194;&#226;&#195;&#227;&#196;&#228;&#197;&#229;&#256;&#257;&#258;&#259;&#260;&#261;&#461;&#462;&#478;&#479;&#480;&#481;&#506;&#507;&#512;&#513;&#514;&#515;&#550;&#551;&#7680;&#7681;&#7834;&#7840;&#7841;&#7842;&#7843;&#7844;&#7845;&#7846;&#7847;&#7848;&#7849;&#7850;&#7851;&#7852;&#7853;&#7854;&#7855;&#7856;&#7857;&#7858;&#7859;&#7860;&#7861;&#7862;&#7863;Bb&#384;&#385;&#595;&#386;&#387;&#7682;&#7683;&#7684;&#7685;&#7686;&#7687;Cc&#199;&#231;&#262;&#263;&#264;&#265;&#266;&#267;&#268;&#269;&#391;&#392;&#597;&#7688;&#7689;Dd&#270;&#271;&#272;&#273;&#394;&#599;&#395;&#396;&#453;&#498;&#545;&#598;&#7690;&#7691;&#7692;&#7693;&#7694;&#7695;&#7696;&#7697;&#7698;&#7699;Ee&#200;&#232;&#201;&#233;&#202;&#234;&#203;&#235;&#274;&#275;&#276;&#277;&#278;&#279;&#280;&#281;&#282;&#283;&#516;&#517;&#518;&#519;&#552;&#553;&#7700;&#7701;&#7702;&#7703;&#7704;&#7705;&#7706;&#7707;&#7708;&#7709;&#7864;&#7865;&#7866;&#7867;&#7868;&#7869;&#7870;&#7871;&#7872;&#7873;&#7874;&#7875;&#7876;&#7877;&#7878;&#7879;Ff&#401;&#402;&#7710;&#7711;Gg&#284;&#285;&#286;&#287;&#288;&#289;&#290;&#291;&#403;&#608;&#484;&#485;&#486;&#487;&#500;&#501;&#7712;&#7713;Hh&#292;&#293;&#294;&#295;&#542;&#543;&#614;&#7714;&#7715;&#7716;&#7717;&#7718;&#7719;&#7720;&#7721;&#7722;&#7723;&#7830;Ii&#204;&#236;&#205;&#237;&#206;&#238;&#207;&#239;&#296;&#297;&#298;&#299;&#300;&#301;&#302;&#303;&#304;&#407;&#616;&#463;&#464;&#520;&#521;&#522;&#523;&#7724;&#7725;&#7726;&#7727;&#7880;&#7881;&#7882;&#7883;Jj&#308;&#309;&#496;&#669;Kk&#310;&#311;&#408;&#409;&#488;&#489;&#7728;&#7729;&#7730;&#7731;&#7732;&#7733;Ll&#313;&#314;&#315;&#316;&#317;&#318;&#319;&#320;&#321;&#322;&#410;&#456;&#564;&#619;&#620;&#621;&#7734;&#7735;&#7736;&#7737;&#7738;&#7739;&#7740;&#7741;Mm&#625;&#7742;&#7743;&#7744;&#7745;&#7746;&#7747;Nn&#209;&#241;&#323;&#324;&#325;&#326;&#327;&#328;&#413;&#626;&#414;&#544;&#459;&#504;&#505;&#565;&#627;&#7748;&#7749;&#7750;&#7751;&#7752;&#7753;&#7754;&#7755;Oo&#210;&#242;&#211;&#243;&#212;&#244;&#213;&#245;&#214;&#246;&#216;&#248;&#332;&#333;&#334;&#335;&#336;&#337;&#415;&#416;&#417;&#465;&#466;&#490;&#491;&#492;&#493;&#510;&#511;&#524;&#525;&#526;&#527;&#554;&#555;&#556;&#557;&#558;&#559;&#560;&#561;&#7756;&#7757;&#7758;&#7759;&#7760;&#7761;&#7762;&#7763;&#7884;&#7885;&#7886;&#7887;&#7888;&#7889;&#7890;&#7891;&#7892;&#7893;&#7894;&#7895;&#7896;&#7897;&#7898;&#7899;&#7900;&#7901;&#7902;&#7903;&#7904;&#7905;&#7906;&#7907;Pp&#420;&#421;&#7764;&#7765;&#7766;&#7767;Qq&#672;Rr&#340;&#341;&#342;&#343;&#344;&#345;&#528;&#529;&#530;&#531;&#636;&#637;&#638;&#7768;&#7769;&#7770;&#7771;&#7772;&#7773;&#7774;&#7775;Ss&#346;&#347;&#348;&#349;&#350;&#351;&#352;&#353;&#536;&#537;&#642;&#7776;&#7777;&#7778;&#7779;&#7780;&#7781;&#7782;&#7783;&#7784;&#7785;Tt&#354;&#355;&#356;&#357;&#358;&#359;&#427;&#428;&#429;&#430;&#648;&#538;&#539;&#566;&#7786;&#7787;&#7788;&#7789;&#7790;&#7791;&#7792;&#7793;&#7831;Uu&#217;&#249;&#218;&#250;&#219;&#251;&#220;&#252;&#360;&#361;&#362;&#363;&#364;&#365;&#366;&#367;&#368;&#369;&#370;&#371;&#431;&#432;&#467;&#468;&#469;&#470;&#471;&#472;&#473;&#474;&#475;&#476;&#532;&#533;&#534;&#535;&#7794;&#7795;&#7796;&#7797;&#7798;&#7799;&#7800;&#7801;&#7802;&#7803;&#7908;&#7909;&#7910;&#7911;&#7912;&#7913;&#7914;&#7915;&#7916;&#7917;&#7918;&#7919;&#7920;&#7921;Vv&#434;&#651;&#7804;&#7805;&#7806;&#7807;Ww&#372;&#373;&#7808;&#7809;&#7810;&#7811;&#7812;&#7813;&#7814;&#7815;&#7816;&#7817;&#7832;Xx&#7818;&#7819;&#7820;&#7821;Yy&#221;&#253;&#255;&#376;&#374;&#375;&#435;&#436;&#562;&#563;&#7822;&#7823;&#7833;&#7922;&#7923;&#7924;&#7925;&#7926;&#7927;&#7928;&#7929;Zz&#377;&#378;&#379;&#380;&#381;&#382;&#437;&#438;&#548;&#549;&#656;&#657;&#7824;&#7825;&#7826;&#7827;&#7828;&#7829;&#7829;', 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBCCCCCCCCCCCCCCCCCDDDDDDDDDDDDDDDDDDDDDDDDEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEFFFFFFGGGGGGGGGGGGGGGGGGGGHHHHHHHHHHHHHHHHHHHHIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIJJJJJJKKKKKKKKKKKKKKLLLLLLLLLLLLLLLLLLLLLLLLLLMMMMMMMMMNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOPPPPPPPPQQQRRRRRRRRRRRRRRRRRRRRRRRSSSSSSSSSSSSSSSSSSSSSSSTTTTTTTTTTTTTTTTTTTTTTTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUVVVVVVVVWWWWWWWWWWWWWWWXXXXXXYYYYYYYYYYYYYYYYYYYYYYYZZZZZZZZZZZZZZZZZZZZZ')"/>
+ </xsl:apply-templates>
+ </dl>
+ </dd>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="indexterm" mode="index-tertiary">
+ <xsl:param name="scope" select="."/>
+ <xsl:param name="role" select="''"/>
+ <xsl:param name="type" select="''"/>
+
+ <xsl:variable name="key" select="concat(normalize-space(concat(primary/@sortas, &quot; &quot;, primary)), &quot; &quot;, normalize-space(concat(secondary/@sortas, &quot; &quot;, secondary)), &quot; &quot;, normalize-space(concat(tertiary/@sortas, &quot; &quot;, tertiary)))"/>
+ <xsl:variable name="refs" select="key('tertiary', $key)[count(ancestor::node()|$scope) = count(ancestor::node()) and ($role = @role or $type = @type or (string-length($role) = 0 and string-length($type) = 0))]"/>
+ <dt>
+ <xsl:for-each select="$refs/tertiary">
+ <xsl:if test="@id or @xml:id">
+ <a id="{(@id|@xml:id)[1]}"/>
+ </xsl:if>
+ </xsl:for-each>
+ <xsl:value-of select="tertiary"/>
+ <xsl:choose>
+ <xsl:when test="$index.links.to.section = 1">
+ <xsl:for-each select="$refs[generate-id() = generate-id(key('tertiary-section', concat($key, &quot; &quot;, generate-id((ancestor-or-self::set|ancestor-or-self::book|ancestor-or-self::part|ancestor-or-self::reference|ancestor-or-self::partintro|ancestor-or-self::chapter|ancestor-or-self::appendix|ancestor-or-self::preface|ancestor-or-self::article|ancestor-or-self::section|ancestor-or-self::sect1|ancestor-or-self::sect2|ancestor-or-self::sect3|ancestor-or-self::sect4|ancestor-or-self::sect5|ancestor-or-self::refentry|ancestor-or-self::refsect1|ancestor-or-self::refsect2|ancestor-or-self::refsect3|ancestor-or-self::simplesect|ancestor-or-self::bibliography|ancestor-or-self::glossary|ancestor-or-self::index|ancestor-or-self::webpage)[last()])))[count(ancestor::node()|$scope) = count(ancestor::node()) and ($role = @role or $type = @type or (string-length($role) = 0 and string-length($type) = 0))][1])]">
+ <xsl:apply-templates select="." mode="reference">
+ <xsl:with-param name="position" select="position()"/>
+ <xsl:with-param name="scope" select="$scope"/>
+ <xsl:with-param name="role" select="$role"/>
+ <xsl:with-param name="type" select="$type"/>
+ </xsl:apply-templates>
+ </xsl:for-each>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:for-each select="$refs[count(ancestor::node()|$scope) = count(ancestor::node()) and ($role = @role or $type = @type or (string-length($role) = 0 and string-length($type) = 0))]">
+ <xsl:apply-templates select="." mode="reference">
+ <xsl:with-param name="position" select="position()"/>
+ <xsl:with-param name="scope" select="$scope"/>
+ <xsl:with-param name="role" select="$role"/>
+ <xsl:with-param name="type" select="$type"/>
+ </xsl:apply-templates>
+ </xsl:for-each>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:if test="$refs/see">
+ <xsl:apply-templates select="$refs[generate-id() = generate-id(key('see', concat(normalize-space(concat(primary/@sortas, &quot; &quot;, primary)), &quot; &quot;, normalize-space(concat(secondary/@sortas, &quot; &quot;, secondary)), &quot; &quot;, normalize-space(concat(tertiary/@sortas, &quot; &quot;, tertiary)), &quot; &quot;, see))[count(ancestor::node()|$scope) = count(ancestor::node()) and ($role = @role or $type = @type or (string-length($role) = 0 and string-length($type) = 0))][1])]" mode="index-see">
+ <xsl:with-param name="position" select="position()"/>
+ <xsl:with-param name="scope" select="$scope"/>
+ <xsl:with-param name="role" select="$role"/>
+ <xsl:with-param name="type" select="$type"/>
+ <xsl:sort select="translate(see, 'Aa&#192;&#224;&#193;&#225;&#194;&#226;&#195;&#227;&#196;&#228;&#197;&#229;&#256;&#257;&#258;&#259;&#260;&#261;&#461;&#462;&#478;&#479;&#480;&#481;&#506;&#507;&#512;&#513;&#514;&#515;&#550;&#551;&#7680;&#7681;&#7834;&#7840;&#7841;&#7842;&#7843;&#7844;&#7845;&#7846;&#7847;&#7848;&#7849;&#7850;&#7851;&#7852;&#7853;&#7854;&#7855;&#7856;&#7857;&#7858;&#7859;&#7860;&#7861;&#7862;&#7863;Bb&#384;&#385;&#595;&#386;&#387;&#7682;&#7683;&#7684;&#7685;&#7686;&#7687;Cc&#199;&#231;&#262;&#263;&#264;&#265;&#266;&#267;&#268;&#269;&#391;&#392;&#597;&#7688;&#7689;Dd&#270;&#271;&#272;&#273;&#394;&#599;&#395;&#396;&#453;&#498;&#545;&#598;&#7690;&#7691;&#7692;&#7693;&#7694;&#7695;&#7696;&#7697;&#7698;&#7699;Ee&#200;&#232;&#201;&#233;&#202;&#234;&#203;&#235;&#274;&#275;&#276;&#277;&#278;&#279;&#280;&#281;&#282;&#283;&#516;&#517;&#518;&#519;&#552;&#553;&#7700;&#7701;&#7702;&#7703;&#7704;&#7705;&#7706;&#7707;&#7708;&#7709;&#7864;&#7865;&#7866;&#7867;&#7868;&#7869;&#7870;&#7871;&#7872;&#7873;&#7874;&#7875;&#7876;&#7877;&#7878;&#7879;Ff&#401;&#402;&#7710;&#7711;Gg&#284;&#285;&#286;&#287;&#288;&#289;&#290;&#291;&#403;&#608;&#484;&#485;&#486;&#487;&#500;&#501;&#7712;&#7713;Hh&#292;&#293;&#294;&#295;&#542;&#543;&#614;&#7714;&#7715;&#7716;&#7717;&#7718;&#7719;&#7720;&#7721;&#7722;&#7723;&#7830;Ii&#204;&#236;&#205;&#237;&#206;&#238;&#207;&#239;&#296;&#297;&#298;&#299;&#300;&#301;&#302;&#303;&#304;&#407;&#616;&#463;&#464;&#520;&#521;&#522;&#523;&#7724;&#7725;&#7726;&#7727;&#7880;&#7881;&#7882;&#7883;Jj&#308;&#309;&#496;&#669;Kk&#310;&#311;&#408;&#409;&#488;&#489;&#7728;&#7729;&#7730;&#7731;&#7732;&#7733;Ll&#313;&#314;&#315;&#316;&#317;&#318;&#319;&#320;&#321;&#322;&#410;&#456;&#564;&#619;&#620;&#621;&#7734;&#7735;&#7736;&#7737;&#7738;&#7739;&#7740;&#7741;Mm&#625;&#7742;&#7743;&#7744;&#7745;&#7746;&#7747;Nn&#209;&#241;&#323;&#324;&#325;&#326;&#327;&#328;&#413;&#626;&#414;&#544;&#459;&#504;&#505;&#565;&#627;&#7748;&#7749;&#7750;&#7751;&#7752;&#7753;&#7754;&#7755;Oo&#210;&#242;&#211;&#243;&#212;&#244;&#213;&#245;&#214;&#246;&#216;&#248;&#332;&#333;&#334;&#335;&#336;&#337;&#415;&#416;&#417;&#465;&#466;&#490;&#491;&#492;&#493;&#510;&#511;&#524;&#525;&#526;&#527;&#554;&#555;&#556;&#557;&#558;&#559;&#560;&#561;&#7756;&#7757;&#7758;&#7759;&#7760;&#7761;&#7762;&#7763;&#7884;&#7885;&#7886;&#7887;&#7888;&#7889;&#7890;&#7891;&#7892;&#7893;&#7894;&#7895;&#7896;&#7897;&#7898;&#7899;&#7900;&#7901;&#7902;&#7903;&#7904;&#7905;&#7906;&#7907;Pp&#420;&#421;&#7764;&#7765;&#7766;&#7767;Qq&#672;Rr&#340;&#341;&#342;&#343;&#344;&#345;&#528;&#529;&#530;&#531;&#636;&#637;&#638;&#7768;&#7769;&#7770;&#7771;&#7772;&#7773;&#7774;&#7775;Ss&#346;&#347;&#348;&#349;&#350;&#351;&#352;&#353;&#536;&#537;&#642;&#7776;&#7777;&#7778;&#7779;&#7780;&#7781;&#7782;&#7783;&#7784;&#7785;Tt&#354;&#355;&#356;&#357;&#358;&#359;&#427;&#428;&#429;&#430;&#648;&#538;&#539;&#566;&#7786;&#7787;&#7788;&#7789;&#7790;&#7791;&#7792;&#7793;&#7831;Uu&#217;&#249;&#218;&#250;&#219;&#251;&#220;&#252;&#360;&#361;&#362;&#363;&#364;&#365;&#366;&#367;&#368;&#369;&#370;&#371;&#431;&#432;&#467;&#468;&#469;&#470;&#471;&#472;&#473;&#474;&#475;&#476;&#532;&#533;&#534;&#535;&#7794;&#7795;&#7796;&#7797;&#7798;&#7799;&#7800;&#7801;&#7802;&#7803;&#7908;&#7909;&#7910;&#7911;&#7912;&#7913;&#7914;&#7915;&#7916;&#7917;&#7918;&#7919;&#7920;&#7921;Vv&#434;&#651;&#7804;&#7805;&#7806;&#7807;Ww&#372;&#373;&#7808;&#7809;&#7810;&#7811;&#7812;&#7813;&#7814;&#7815;&#7816;&#7817;&#7832;Xx&#7818;&#7819;&#7820;&#7821;Yy&#221;&#253;&#255;&#376;&#374;&#375;&#435;&#436;&#562;&#563;&#7822;&#7823;&#7833;&#7922;&#7923;&#7924;&#7925;&#7926;&#7927;&#7928;&#7929;Zz&#377;&#378;&#379;&#380;&#381;&#382;&#437;&#438;&#548;&#549;&#656;&#657;&#7824;&#7825;&#7826;&#7827;&#7828;&#7829;&#7829;', 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBCCCCCCCCCCCCCCCCCDDDDDDDDDDDDDDDDDDDDDDDDEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEFFFFFFGGGGGGGGGGGGGGGGGGGGHHHHHHHHHHHHHHHHHHHHIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIJJJJJJKKKKKKKKKKKKKKLLLLLLLLLLLLLLLLLLLLLLLLLLMMMMMMMMMNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOPPPPPPPPQQQRRRRRRRRRRRRRRRRRRRRRRRSSSSSSSSSSSSSSSSSSSSSSSTTTTTTTTTTTTTTTTTTTTTTTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUVVVVVVVVWWWWWWWWWWWWWWWXXXXXXYYYYYYYYYYYYYYYYYYYYYYYZZZZZZZZZZZZZZZZZZZZZ')"/>
+ </xsl:apply-templates>
+ </xsl:if>
+ </dt>
+ <xsl:if test="$refs/seealso">
+ <dd>
+ <dl>
+ <xsl:apply-templates select="$refs[generate-id() = generate-id(key('see-also', concat(normalize-space(concat(primary/@sortas, &quot; &quot;, primary)), &quot; &quot;, normalize-space(concat(secondary/@sortas, &quot; &quot;, secondary)), &quot; &quot;, normalize-space(concat(tertiary/@sortas, &quot; &quot;, tertiary)), &quot; &quot;, seealso))[count(ancestor::node()|$scope) = count(ancestor::node()) and ($role = @role or $type = @type or (string-length($role) = 0 and string-length($type) = 0))][1])]" mode="index-seealso">
+ <xsl:with-param name="position" select="position()"/>
+ <xsl:with-param name="scope" select="$scope"/>
+ <xsl:with-param name="role" select="$role"/>
+ <xsl:with-param name="type" select="$type"/>
+ <xsl:sort select="translate(seealso, 'Aa&#192;&#224;&#193;&#225;&#194;&#226;&#195;&#227;&#196;&#228;&#197;&#229;&#256;&#257;&#258;&#259;&#260;&#261;&#461;&#462;&#478;&#479;&#480;&#481;&#506;&#507;&#512;&#513;&#514;&#515;&#550;&#551;&#7680;&#7681;&#7834;&#7840;&#7841;&#7842;&#7843;&#7844;&#7845;&#7846;&#7847;&#7848;&#7849;&#7850;&#7851;&#7852;&#7853;&#7854;&#7855;&#7856;&#7857;&#7858;&#7859;&#7860;&#7861;&#7862;&#7863;Bb&#384;&#385;&#595;&#386;&#387;&#7682;&#7683;&#7684;&#7685;&#7686;&#7687;Cc&#199;&#231;&#262;&#263;&#264;&#265;&#266;&#267;&#268;&#269;&#391;&#392;&#597;&#7688;&#7689;Dd&#270;&#271;&#272;&#273;&#394;&#599;&#395;&#396;&#453;&#498;&#545;&#598;&#7690;&#7691;&#7692;&#7693;&#7694;&#7695;&#7696;&#7697;&#7698;&#7699;Ee&#200;&#232;&#201;&#233;&#202;&#234;&#203;&#235;&#274;&#275;&#276;&#277;&#278;&#279;&#280;&#281;&#282;&#283;&#516;&#517;&#518;&#519;&#552;&#553;&#7700;&#7701;&#7702;&#7703;&#7704;&#7705;&#7706;&#7707;&#7708;&#7709;&#7864;&#7865;&#7866;&#7867;&#7868;&#7869;&#7870;&#7871;&#7872;&#7873;&#7874;&#7875;&#7876;&#7877;&#7878;&#7879;Ff&#401;&#402;&#7710;&#7711;Gg&#284;&#285;&#286;&#287;&#288;&#289;&#290;&#291;&#403;&#608;&#484;&#485;&#486;&#487;&#500;&#501;&#7712;&#7713;Hh&#292;&#293;&#294;&#295;&#542;&#543;&#614;&#7714;&#7715;&#7716;&#7717;&#7718;&#7719;&#7720;&#7721;&#7722;&#7723;&#7830;Ii&#204;&#236;&#205;&#237;&#206;&#238;&#207;&#239;&#296;&#297;&#298;&#299;&#300;&#301;&#302;&#303;&#304;&#407;&#616;&#463;&#464;&#520;&#521;&#522;&#523;&#7724;&#7725;&#7726;&#7727;&#7880;&#7881;&#7882;&#7883;Jj&#308;&#309;&#496;&#669;Kk&#310;&#311;&#408;&#409;&#488;&#489;&#7728;&#7729;&#7730;&#7731;&#7732;&#7733;Ll&#313;&#314;&#315;&#316;&#317;&#318;&#319;&#320;&#321;&#322;&#410;&#456;&#564;&#619;&#620;&#621;&#7734;&#7735;&#7736;&#7737;&#7738;&#7739;&#7740;&#7741;Mm&#625;&#7742;&#7743;&#7744;&#7745;&#7746;&#7747;Nn&#209;&#241;&#323;&#324;&#325;&#326;&#327;&#328;&#413;&#626;&#414;&#544;&#459;&#504;&#505;&#565;&#627;&#7748;&#7749;&#7750;&#7751;&#7752;&#7753;&#7754;&#7755;Oo&#210;&#242;&#211;&#243;&#212;&#244;&#213;&#245;&#214;&#246;&#216;&#248;&#332;&#333;&#334;&#335;&#336;&#337;&#415;&#416;&#417;&#465;&#466;&#490;&#491;&#492;&#493;&#510;&#511;&#524;&#525;&#526;&#527;&#554;&#555;&#556;&#557;&#558;&#559;&#560;&#561;&#7756;&#7757;&#7758;&#7759;&#7760;&#7761;&#7762;&#7763;&#7884;&#7885;&#7886;&#7887;&#7888;&#7889;&#7890;&#7891;&#7892;&#7893;&#7894;&#7895;&#7896;&#7897;&#7898;&#7899;&#7900;&#7901;&#7902;&#7903;&#7904;&#7905;&#7906;&#7907;Pp&#420;&#421;&#7764;&#7765;&#7766;&#7767;Qq&#672;Rr&#340;&#341;&#342;&#343;&#344;&#345;&#528;&#529;&#530;&#531;&#636;&#637;&#638;&#7768;&#7769;&#7770;&#7771;&#7772;&#7773;&#7774;&#7775;Ss&#346;&#347;&#348;&#349;&#350;&#351;&#352;&#353;&#536;&#537;&#642;&#7776;&#7777;&#7778;&#7779;&#7780;&#7781;&#7782;&#7783;&#7784;&#7785;Tt&#354;&#355;&#356;&#357;&#358;&#359;&#427;&#428;&#429;&#430;&#648;&#538;&#539;&#566;&#7786;&#7787;&#7788;&#7789;&#7790;&#7791;&#7792;&#7793;&#7831;Uu&#217;&#249;&#218;&#250;&#219;&#251;&#220;&#252;&#360;&#361;&#362;&#363;&#364;&#365;&#366;&#367;&#368;&#369;&#370;&#371;&#431;&#432;&#467;&#468;&#469;&#470;&#471;&#472;&#473;&#474;&#475;&#476;&#532;&#533;&#534;&#535;&#7794;&#7795;&#7796;&#7797;&#7798;&#7799;&#7800;&#7801;&#7802;&#7803;&#7908;&#7909;&#7910;&#7911;&#7912;&#7913;&#7914;&#7915;&#7916;&#7917;&#7918;&#7919;&#7920;&#7921;Vv&#434;&#651;&#7804;&#7805;&#7806;&#7807;Ww&#372;&#373;&#7808;&#7809;&#7810;&#7811;&#7812;&#7813;&#7814;&#7815;&#7816;&#7817;&#7832;Xx&#7818;&#7819;&#7820;&#7821;Yy&#221;&#253;&#255;&#376;&#374;&#375;&#435;&#436;&#562;&#563;&#7822;&#7823;&#7833;&#7922;&#7923;&#7924;&#7925;&#7926;&#7927;&#7928;&#7929;Zz&#377;&#378;&#379;&#380;&#381;&#382;&#437;&#438;&#548;&#549;&#656;&#657;&#7824;&#7825;&#7826;&#7827;&#7828;&#7829;&#7829;', 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBCCCCCCCCCCCCCCCCCDDDDDDDDDDDDDDDDDDDDDDDDEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEFFFFFFGGGGGGGGGGGGGGGGGGGGHHHHHHHHHHHHHHHHHHHHIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIJJJJJJKKKKKKKKKKKKKKLLLLLLLLLLLLLLLLLLLLLLLLLLMMMMMMMMMNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOPPPPPPPPQQQRRRRRRRRRRRRRRRRRRRRRRRSSSSSSSSSSSSSSSSSSSSSSSTTTTTTTTTTTTTTTTTTTTTTTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUVVVVVVVVWWWWWWWWWWWWWWWXXXXXXYYYYYYYYYYYYYYYYYYYYYYYZZZZZZZZZZZZZZZZZZZZZ')"/>
+ </xsl:apply-templates>
+ </dl>
+ </dd>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="indexterm" mode="reference">
+ <xsl:param name="scope" select="."/>
+ <xsl:param name="role" select="''"/>
+ <xsl:param name="type" select="''"/>
+ <xsl:param name="position"/>
+
+ <xsl:variable name="term.separator">
+ <xsl:call-template name="index.separator">
+ <xsl:with-param name="key" select="'index.term.separator'"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="number.separator">
+ <xsl:call-template name="index.separator">
+ <xsl:with-param name="key" select="'index.number.separator'"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="range.separator">
+ <xsl:call-template name="index.separator">
+ <xsl:with-param name="key" select="'index.range.separator'"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="$position = 1">
+ <xsl:value-of select="$term.separator"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$number.separator"/>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:choose>
+ <xsl:when test="@zone and string(@zone)">
+ <xsl:call-template name="reference">
+ <xsl:with-param name="zones" select="normalize-space(@zone)"/>
+ <xsl:with-param name="position" select="position()"/>
+ <xsl:with-param name="scope" select="$scope"/>
+ <xsl:with-param name="role" select="$role"/>
+ <xsl:with-param name="type" select="$type"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <a>
+ <xsl:apply-templates select="." mode="class.attribute"/>
+ <xsl:variable name="title">
+ <xsl:choose>
+ <xsl:when test="(ancestor-or-self::set|ancestor-or-self::book|ancestor-or-self::part|ancestor-or-self::reference|ancestor-or-self::partintro|ancestor-or-self::chapter|ancestor-or-self::appendix|ancestor-or-self::preface|ancestor-or-self::article|ancestor-or-self::section|ancestor-or-self::sect1|ancestor-or-self::sect2|ancestor-or-self::sect3|ancestor-or-self::sect4|ancestor-or-self::sect5|ancestor-or-self::refentry|ancestor-or-self::refsect1|ancestor-or-self::refsect2|ancestor-or-self::refsect3|ancestor-or-self::simplesect|ancestor-or-self::bibliography|ancestor-or-self::glossary|ancestor-or-self::index|ancestor-or-self::webpage)[last()]/titleabbrev and $index.prefer.titleabbrev != 0">
+ <xsl:apply-templates select="(ancestor-or-self::set|ancestor-or-self::book|ancestor-or-self::part|ancestor-or-self::reference|ancestor-or-self::partintro|ancestor-or-self::chapter|ancestor-or-self::appendix|ancestor-or-self::preface|ancestor-or-self::article|ancestor-or-self::section|ancestor-or-self::sect1|ancestor-or-self::sect2|ancestor-or-self::sect3|ancestor-or-self::sect4|ancestor-or-self::sect5|ancestor-or-self::refentry|ancestor-or-self::refsect1|ancestor-or-self::refsect2|ancestor-or-self::refsect3|ancestor-or-self::simplesect|ancestor-or-self::bibliography|ancestor-or-self::glossary|ancestor-or-self::index|ancestor-or-self::webpage)[last()]" mode="titleabbrev.markup"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="(ancestor-or-self::set|ancestor-or-self::book|ancestor-or-self::part|ancestor-or-self::reference|ancestor-or-self::partintro|ancestor-or-self::chapter|ancestor-or-self::appendix|ancestor-or-self::preface|ancestor-or-self::article|ancestor-or-self::section|ancestor-or-self::sect1|ancestor-or-self::sect2|ancestor-or-self::sect3|ancestor-or-self::sect4|ancestor-or-self::sect5|ancestor-or-self::refentry|ancestor-or-self::refsect1|ancestor-or-self::refsect2|ancestor-or-self::refsect3|ancestor-or-self::simplesect|ancestor-or-self::bibliography|ancestor-or-self::glossary|ancestor-or-self::index|ancestor-or-self::webpage)[last()]" mode="title.markup"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:attribute name="href">
+ <xsl:choose>
+ <xsl:when test="$index.links.to.section = 1">
+ <xsl:call-template name="href.target">
+ <xsl:with-param name="object" select="(ancestor-or-self::set|ancestor-or-self::book|ancestor-or-self::part|ancestor-or-self::reference|ancestor-or-self::partintro|ancestor-or-self::chapter|ancestor-or-self::appendix|ancestor-or-self::preface|ancestor-or-self::article|ancestor-or-self::section|ancestor-or-self::sect1|ancestor-or-self::sect2|ancestor-or-self::sect3|ancestor-or-self::sect4|ancestor-or-self::sect5|ancestor-or-self::refentry|ancestor-or-self::refsect1|ancestor-or-self::refsect2|ancestor-or-self::refsect3|ancestor-or-self::simplesect|ancestor-or-self::bibliography|ancestor-or-self::glossary|ancestor-or-self::index|ancestor-or-self::webpage)[last()]"/>
+ <xsl:with-param name="context" select="//index[count(ancestor::node()|$scope) = count(ancestor::node()) and ($role = @role or $type = @type or (string-length($role) = 0 and string-length($type) = 0))][1]"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="href.target">
+ <xsl:with-param name="object" select="."/>
+ <xsl:with-param name="context" select="//index[count(ancestor::node()|$scope) = count(ancestor::node()) and ($role = @role or $type = @type or (string-length($role) = 0 and string-length($type) = 0))][1]"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ </xsl:attribute>
+
+ <xsl:value-of select="$title"/> <!-- text only -->
+ </a>
+
+ <xsl:variable name="id" select="(@id|@xml:id)[1]"/>
+ <xsl:if test="key('endofrange', $id)[count(ancestor::node()|$scope) = count(ancestor::node()) and ($role = @role or $type = @type or (string-length($role) = 0 and string-length($type) = 0))]">
+ <xsl:apply-templates select="key('endofrange', $id)[count(ancestor::node()|$scope) = count(ancestor::node()) and ($role = @role or $type = @type or (string-length($role) = 0 and string-length($type) = 0))][last()]" mode="reference">
+ <xsl:with-param name="position" select="position()"/>
+ <xsl:with-param name="scope" select="$scope"/>
+ <xsl:with-param name="role" select="$role"/>
+ <xsl:with-param name="type" select="$type"/>
+ <xsl:with-param name="separator" select="$range.separator"/>
+ </xsl:apply-templates>
+ </xsl:if>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="reference">
+ <xsl:param name="scope" select="."/>
+ <xsl:param name="role" select="''"/>
+ <xsl:param name="type" select="''"/>
+ <xsl:param name="zones"/>
+
+ <xsl:choose>
+ <xsl:when test="contains($zones, ' ')">
+ <xsl:variable name="zone" select="substring-before($zones, ' ')"/>
+ <xsl:variable name="target" select="key('sections', $zone)"/>
+
+ <a>
+ <xsl:apply-templates select="." mode="class.attribute"/>
+ <xsl:attribute name="href">
+ <xsl:call-template name="href.target">
+ <xsl:with-param name="object" select="$target[1]"/>
+ <xsl:with-param name="context" select="//index[count(ancestor::node()|$scope) = count(ancestor::node()) and ($role = @role or $type = @type or (string-length($role) = 0 and string-length($type) = 0))][1]"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:apply-templates select="$target[1]" mode="index-title-content"/>
+ </a>
+ <xsl:text>, </xsl:text>
+ <xsl:call-template name="reference">
+ <xsl:with-param name="zones" select="substring-after($zones, ' ')"/>
+ <xsl:with-param name="position" select="position()"/>
+ <xsl:with-param name="scope" select="$scope"/>
+ <xsl:with-param name="role" select="$role"/>
+ <xsl:with-param name="type" select="$type"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:variable name="zone" select="$zones"/>
+ <xsl:variable name="target" select="key('sections', $zone)"/>
+
+ <a>
+ <xsl:apply-templates select="." mode="class.attribute"/>
+ <xsl:attribute name="href">
+ <xsl:call-template name="href.target">
+ <xsl:with-param name="object" select="$target[1]"/>
+ <xsl:with-param name="context" select="//index[count(ancestor::node()|$scope) = count(ancestor::node()) and ($role = @role or $type = @type or (string-length($role) = 0 and string-length($type) = 0))][1]"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:apply-templates select="$target[1]" mode="index-title-content"/>
+ </a>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="indexterm" mode="index-see">
+ <xsl:param name="scope" select="."/>
+ <xsl:param name="role" select="''"/>
+ <xsl:param name="type" select="''"/>
+
+ <xsl:text> (</xsl:text>
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'see'"/>
+ </xsl:call-template>
+ <xsl:text> </xsl:text>
+ <xsl:value-of select="see"/>
+ <xsl:text>)</xsl:text>
+</xsl:template>
+
+<xsl:template match="indexterm" mode="index-seealso">
+ <xsl:param name="scope" select="."/>
+ <xsl:param name="role" select="''"/>
+ <xsl:param name="type" select="''"/>
+
+ <xsl:for-each select="seealso">
+ <xsl:sort select="translate(., 'Aa&#192;&#224;&#193;&#225;&#194;&#226;&#195;&#227;&#196;&#228;&#197;&#229;&#256;&#257;&#258;&#259;&#260;&#261;&#461;&#462;&#478;&#479;&#480;&#481;&#506;&#507;&#512;&#513;&#514;&#515;&#550;&#551;&#7680;&#7681;&#7834;&#7840;&#7841;&#7842;&#7843;&#7844;&#7845;&#7846;&#7847;&#7848;&#7849;&#7850;&#7851;&#7852;&#7853;&#7854;&#7855;&#7856;&#7857;&#7858;&#7859;&#7860;&#7861;&#7862;&#7863;Bb&#384;&#385;&#595;&#386;&#387;&#7682;&#7683;&#7684;&#7685;&#7686;&#7687;Cc&#199;&#231;&#262;&#263;&#264;&#265;&#266;&#267;&#268;&#269;&#391;&#392;&#597;&#7688;&#7689;Dd&#270;&#271;&#272;&#273;&#394;&#599;&#395;&#396;&#453;&#498;&#545;&#598;&#7690;&#7691;&#7692;&#7693;&#7694;&#7695;&#7696;&#7697;&#7698;&#7699;Ee&#200;&#232;&#201;&#233;&#202;&#234;&#203;&#235;&#274;&#275;&#276;&#277;&#278;&#279;&#280;&#281;&#282;&#283;&#516;&#517;&#518;&#519;&#552;&#553;&#7700;&#7701;&#7702;&#7703;&#7704;&#7705;&#7706;&#7707;&#7708;&#7709;&#7864;&#7865;&#7866;&#7867;&#7868;&#7869;&#7870;&#7871;&#7872;&#7873;&#7874;&#7875;&#7876;&#7877;&#7878;&#7879;Ff&#401;&#402;&#7710;&#7711;Gg&#284;&#285;&#286;&#287;&#288;&#289;&#290;&#291;&#403;&#608;&#484;&#485;&#486;&#487;&#500;&#501;&#7712;&#7713;Hh&#292;&#293;&#294;&#295;&#542;&#543;&#614;&#7714;&#7715;&#7716;&#7717;&#7718;&#7719;&#7720;&#7721;&#7722;&#7723;&#7830;Ii&#204;&#236;&#205;&#237;&#206;&#238;&#207;&#239;&#296;&#297;&#298;&#299;&#300;&#301;&#302;&#303;&#304;&#407;&#616;&#463;&#464;&#520;&#521;&#522;&#523;&#7724;&#7725;&#7726;&#7727;&#7880;&#7881;&#7882;&#7883;Jj&#308;&#309;&#496;&#669;Kk&#310;&#311;&#408;&#409;&#488;&#489;&#7728;&#7729;&#7730;&#7731;&#7732;&#7733;Ll&#313;&#314;&#315;&#316;&#317;&#318;&#319;&#320;&#321;&#322;&#410;&#456;&#564;&#619;&#620;&#621;&#7734;&#7735;&#7736;&#7737;&#7738;&#7739;&#7740;&#7741;Mm&#625;&#7742;&#7743;&#7744;&#7745;&#7746;&#7747;Nn&#209;&#241;&#323;&#324;&#325;&#326;&#327;&#328;&#413;&#626;&#414;&#544;&#459;&#504;&#505;&#565;&#627;&#7748;&#7749;&#7750;&#7751;&#7752;&#7753;&#7754;&#7755;Oo&#210;&#242;&#211;&#243;&#212;&#244;&#213;&#245;&#214;&#246;&#216;&#248;&#332;&#333;&#334;&#335;&#336;&#337;&#415;&#416;&#417;&#465;&#466;&#490;&#491;&#492;&#493;&#510;&#511;&#524;&#525;&#526;&#527;&#554;&#555;&#556;&#557;&#558;&#559;&#560;&#561;&#7756;&#7757;&#7758;&#7759;&#7760;&#7761;&#7762;&#7763;&#7884;&#7885;&#7886;&#7887;&#7888;&#7889;&#7890;&#7891;&#7892;&#7893;&#7894;&#7895;&#7896;&#7897;&#7898;&#7899;&#7900;&#7901;&#7902;&#7903;&#7904;&#7905;&#7906;&#7907;Pp&#420;&#421;&#7764;&#7765;&#7766;&#7767;Qq&#672;Rr&#340;&#341;&#342;&#343;&#344;&#345;&#528;&#529;&#530;&#531;&#636;&#637;&#638;&#7768;&#7769;&#7770;&#7771;&#7772;&#7773;&#7774;&#7775;Ss&#346;&#347;&#348;&#349;&#350;&#351;&#352;&#353;&#536;&#537;&#642;&#7776;&#7777;&#7778;&#7779;&#7780;&#7781;&#7782;&#7783;&#7784;&#7785;Tt&#354;&#355;&#356;&#357;&#358;&#359;&#427;&#428;&#429;&#430;&#648;&#538;&#539;&#566;&#7786;&#7787;&#7788;&#7789;&#7790;&#7791;&#7792;&#7793;&#7831;Uu&#217;&#249;&#218;&#250;&#219;&#251;&#220;&#252;&#360;&#361;&#362;&#363;&#364;&#365;&#366;&#367;&#368;&#369;&#370;&#371;&#431;&#432;&#467;&#468;&#469;&#470;&#471;&#472;&#473;&#474;&#475;&#476;&#532;&#533;&#534;&#535;&#7794;&#7795;&#7796;&#7797;&#7798;&#7799;&#7800;&#7801;&#7802;&#7803;&#7908;&#7909;&#7910;&#7911;&#7912;&#7913;&#7914;&#7915;&#7916;&#7917;&#7918;&#7919;&#7920;&#7921;Vv&#434;&#651;&#7804;&#7805;&#7806;&#7807;Ww&#372;&#373;&#7808;&#7809;&#7810;&#7811;&#7812;&#7813;&#7814;&#7815;&#7816;&#7817;&#7832;Xx&#7818;&#7819;&#7820;&#7821;Yy&#221;&#253;&#255;&#376;&#374;&#375;&#435;&#436;&#562;&#563;&#7822;&#7823;&#7833;&#7922;&#7923;&#7924;&#7925;&#7926;&#7927;&#7928;&#7929;Zz&#377;&#378;&#379;&#380;&#381;&#382;&#437;&#438;&#548;&#549;&#656;&#657;&#7824;&#7825;&#7826;&#7827;&#7828;&#7829;&#7829;', 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBCCCCCCCCCCCCCCCCCDDDDDDDDDDDDDDDDDDDDDDDDEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEFFFFFFGGGGGGGGGGGGGGGGGGGGHHHHHHHHHHHHHHHHHHHHIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIJJJJJJKKKKKKKKKKKKKKLLLLLLLLLLLLLLLLLLLLLLLLLLMMMMMMMMMNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOPPPPPPPPQQQRRRRRRRRRRRRRRRRRRRRRRRSSSSSSSSSSSSSSSSSSSSSSSTTTTTTTTTTTTTTTTTTTTTTTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUVVVVVVVVWWWWWWWWWWWWWWWXXXXXXYYYYYYYYYYYYYYYYYYYYYYYZZZZZZZZZZZZZZZZZZZZZ')"/>
+ <dt>
+ <xsl:text>(</xsl:text>
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'seealso'"/>
+ </xsl:call-template>
+ <xsl:text> </xsl:text>
+ <xsl:value-of select="."/>
+ <xsl:text>)</xsl:text>
+ </dt>
+ </xsl:for-each>
+</xsl:template>
+
+<xsl:template match="*" mode="index-title-content">
+ <xsl:variable name="title">
+ <xsl:apply-templates select="(ancestor-or-self::set|ancestor-or-self::book|ancestor-or-self::part|ancestor-or-self::reference|ancestor-or-self::partintro|ancestor-or-self::chapter|ancestor-or-self::appendix|ancestor-or-self::preface|ancestor-or-self::article|ancestor-or-self::section|ancestor-or-self::sect1|ancestor-or-self::sect2|ancestor-or-self::sect3|ancestor-or-self::sect4|ancestor-or-self::sect5|ancestor-or-self::refentry|ancestor-or-self::refsect1|ancestor-or-self::refsect2|ancestor-or-self::refsect3|ancestor-or-self::simplesect|ancestor-or-self::bibliography|ancestor-or-self::glossary|ancestor-or-self::index|ancestor-or-self::webpage)[last()]" mode="title.markup"/>
+ </xsl:variable>
+
+ <xsl:value-of select="$title"/>
+</xsl:template>
+
+<xsl:template name="index.separator">
+ <xsl:param name="key" select="''"/>
+ <xsl:param name="lang">
+ <xsl:call-template name="l10n.language"/>
+ </xsl:param>
+
+ <xsl:choose>
+ <xsl:when test="$key = 'index.term.separator'">
+ <xsl:choose>
+ <!-- Use the override if not blank -->
+ <xsl:when test="$index.term.separator != ''">
+ <xsl:copy-of select="$index.term.separator"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="gentext.template">
+ <xsl:with-param name="lang" select="$lang"/>
+ <xsl:with-param name="context">index</xsl:with-param>
+ <xsl:with-param name="name">term-separator</xsl:with-param>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:when test="$key = 'index.number.separator'">
+ <xsl:choose>
+ <!-- Use the override if not blank -->
+ <xsl:when test="$index.number.separator != ''">
+ <xsl:copy-of select="$index.number.separator"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="gentext.template">
+ <xsl:with-param name="lang" select="$lang"/>
+ <xsl:with-param name="context">index</xsl:with-param>
+ <xsl:with-param name="name">number-separator</xsl:with-param>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:when test="$key = 'index.range.separator'">
+ <xsl:choose>
+ <!-- Use the override if not blank -->
+ <xsl:when test="$index.range.separator != ''">
+ <xsl:copy-of select="$index.range.separator"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="gentext.template">
+ <xsl:with-param name="lang" select="$lang"/>
+ <xsl:with-param name="context">index</xsl:with-param>
+ <xsl:with-param name="name">range-separator</xsl:with-param>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ </xsl:choose>
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/autotoc.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/autotoc.xsl
new file mode 100644
index 0000000..a337ec5
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/autotoc.xsl
@@ -0,0 +1,663 @@
+<?xml version="1.0" encoding="ASCII"?>
+<!--This file was created automatically by html2xhtml-->
+<!--from the HTML stylesheets.-->
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1999/xhtml" version="1.0">
+
+<!-- ********************************************************************
+ $Id: autotoc.xsl 8558 2009-12-11 00:33:17Z bobstayton $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<xsl:variable name="toc.listitem.type">
+ <xsl:choose>
+ <xsl:when test="$toc.list.type = 'dl'">dt</xsl:when>
+ <xsl:otherwise>li</xsl:otherwise>
+ </xsl:choose>
+</xsl:variable>
+
+<!-- this is just hack because dl and ul aren't completely isomorphic -->
+<xsl:variable name="toc.dd.type">
+ <xsl:choose>
+ <xsl:when test="$toc.list.type = 'dl'">dd</xsl:when>
+ <xsl:otherwise/>
+ </xsl:choose>
+</xsl:variable>
+
+<xsl:template name="make.toc">
+ <xsl:param name="toc-context" select="."/>
+ <xsl:param name="toc.title.p" select="true()"/>
+ <xsl:param name="nodes" select="/NOT-AN-ELEMENT"/>
+
+ <xsl:variable name="nodes.plus" select="$nodes | qandaset"/>
+
+ <xsl:variable name="toc.title">
+ <xsl:if test="$toc.title.p">
+ <xsl:choose>
+ <xsl:when test="$make.clean.html != 0">
+ <div class="toc-title">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key">TableofContents</xsl:with-param>
+ </xsl:call-template>
+ </div>
+ </xsl:when>
+ <xsl:otherwise>
+ <p>
+ <strong xmlns:xslo="http://www.w3.org/1999/XSL/Transform">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key">TableofContents</xsl:with-param>
+ </xsl:call-template>
+ </strong>
+ </p>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:if>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="$manual.toc != ''">
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+ <xsl:variable name="toc" select="document($manual.toc, .)"/>
+ <xsl:variable name="tocentry" select="$toc//tocentry[@linkend=$id]"/>
+ <xsl:if test="$tocentry and $tocentry/*">
+ <div class="toc">
+ <xsl:copy-of select="$toc.title"/>
+ <xsl:element name="{$toc.list.type}" namespace="http://www.w3.org/1999/xhtml">
+ <xsl:call-template name="manual-toc">
+ <xsl:with-param name="tocentry" select="$tocentry/*[1]"/>
+ </xsl:call-template>
+ </xsl:element>
+ </div>
+ </xsl:if>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:choose>
+ <xsl:when test="$qanda.in.toc != 0">
+ <xsl:if test="$nodes.plus">
+ <div class="toc">
+ <xsl:copy-of select="$toc.title"/>
+ <xsl:element name="{$toc.list.type}" namespace="http://www.w3.org/1999/xhtml">
+ <xsl:apply-templates select="$nodes.plus" mode="toc">
+ <xsl:with-param name="toc-context" select="$toc-context"/>
+ </xsl:apply-templates>
+ </xsl:element>
+ </div>
+ </xsl:if>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:if test="$nodes">
+ <div class="toc">
+ <xsl:copy-of select="$toc.title"/>
+ <xsl:element name="{$toc.list.type}" namespace="http://www.w3.org/1999/xhtml">
+ <xsl:apply-templates select="$nodes" mode="toc">
+ <xsl:with-param name="toc-context" select="$toc-context"/>
+ </xsl:apply-templates>
+ </xsl:element>
+ </div>
+ </xsl:if>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="make.lots">
+ <xsl:param name="toc.params" select="''"/>
+ <xsl:param name="toc"/>
+
+ <xsl:if test="contains($toc.params, 'toc')">
+ <xsl:copy-of select="$toc"/>
+ </xsl:if>
+
+ <xsl:if test="contains($toc.params, 'figure')">
+ <xsl:call-template name="list.of.titles">
+ <xsl:with-param name="titles" select="'figure'"/>
+ <xsl:with-param name="nodes" select=".//figure"/>
+ </xsl:call-template>
+ </xsl:if>
+
+ <xsl:if test="contains($toc.params, 'table')">
+ <xsl:call-template name="list.of.titles">
+ <xsl:with-param name="titles" select="'table'"/>
+ <xsl:with-param name="nodes" select=".//table"/>
+ </xsl:call-template>
+ </xsl:if>
+
+ <xsl:if test="contains($toc.params, 'example')">
+ <xsl:call-template name="list.of.titles">
+ <xsl:with-param name="titles" select="'example'"/>
+ <xsl:with-param name="nodes" select=".//example"/>
+ </xsl:call-template>
+ </xsl:if>
+
+ <xsl:if test="contains($toc.params, 'equation')">
+ <xsl:call-template name="list.of.titles">
+ <xsl:with-param name="titles" select="'equation'"/>
+ <xsl:with-param name="nodes" select=".//equation[title or info/title]"/>
+ </xsl:call-template>
+ </xsl:if>
+
+ <xsl:if test="contains($toc.params, 'procedure')">
+ <xsl:call-template name="list.of.titles">
+ <xsl:with-param name="titles" select="'procedure'"/>
+ <xsl:with-param name="nodes" select=".//procedure[title]"/>
+ </xsl:call-template>
+ </xsl:if>
+</xsl:template>
+
+<!-- ====================================================================== -->
+
+<xsl:template name="set.toc">
+ <xsl:param name="toc-context" select="."/>
+ <xsl:param name="toc.title.p" select="true()"/>
+
+ <xsl:call-template name="make.toc">
+ <xsl:with-param name="toc-context" select="$toc-context"/>
+ <xsl:with-param name="toc.title.p" select="$toc.title.p"/>
+ <xsl:with-param name="nodes" select="book|setindex"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template name="division.toc">
+ <xsl:param name="toc-context" select="."/>
+ <xsl:param name="toc.title.p" select="true()"/>
+
+ <xsl:call-template name="make.toc">
+ <xsl:with-param name="toc-context" select="$toc-context"/>
+ <xsl:with-param name="toc.title.p" select="$toc.title.p"/>
+ <xsl:with-param name="nodes" select="part|reference |preface|chapter|appendix |article |bibliography|glossary|index |refentry |bridgehead[$bridgehead.in.toc != 0]"/>
+
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template name="component.toc">
+ <xsl:param name="toc-context" select="."/>
+ <xsl:param name="toc.title.p" select="true()"/>
+
+ <xsl:call-template name="make.toc">
+ <xsl:with-param name="toc-context" select="$toc-context"/>
+ <xsl:with-param name="toc.title.p" select="$toc.title.p"/>
+ <xsl:with-param name="nodes" select="section|sect1 |simplesect[$simplesect.in.toc != 0] |refentry |article|bibliography|glossary |appendix|index |bridgehead[not(@renderas) and $bridgehead.in.toc != 0] |.//bridgehead[@renderas='sect1' and $bridgehead.in.toc != 0]"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template name="component.toc.separator">
+ <!-- Customize to output something between
+ component.toc and first output -->
+</xsl:template>
+
+<xsl:template name="section.toc">
+ <xsl:param name="toc-context" select="."/>
+ <xsl:param name="toc.title.p" select="true()"/>
+
+ <xsl:call-template name="make.toc">
+ <xsl:with-param name="toc-context" select="$toc-context"/>
+ <xsl:with-param name="toc.title.p" select="$toc.title.p"/>
+ <xsl:with-param name="nodes" select="section|sect1|sect2|sect3|sect4|sect5|refentry |bridgehead[$bridgehead.in.toc != 0]"/>
+
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template name="section.toc.separator">
+ <!-- Customize to output something between
+ section.toc and first output -->
+</xsl:template>
+<!-- ==================================================================== -->
+
+<xsl:template name="subtoc">
+ <xsl:param name="toc-context" select="."/>
+ <xsl:param name="nodes" select="NOT-AN-ELEMENT"/>
+
+ <xsl:variable name="nodes.plus" select="$nodes | qandaset"/>
+
+ <xsl:variable name="subtoc">
+ <xsl:element name="{$toc.list.type}" namespace="http://www.w3.org/1999/xhtml">
+ <xsl:choose>
+ <xsl:when test="$qanda.in.toc != 0">
+ <xsl:apply-templates mode="toc" select="$nodes.plus">
+ <xsl:with-param name="toc-context" select="$toc-context"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates mode="toc" select="$nodes">
+ <xsl:with-param name="toc-context" select="$toc-context"/>
+ </xsl:apply-templates>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:element>
+ </xsl:variable>
+
+ <xsl:variable name="depth">
+ <xsl:choose>
+ <xsl:when test="local-name(.) = 'section'">
+ <xsl:value-of select="count(ancestor::section) + 1"/>
+ </xsl:when>
+ <xsl:when test="local-name(.) = 'sect1'">1</xsl:when>
+ <xsl:when test="local-name(.) = 'sect2'">2</xsl:when>
+ <xsl:when test="local-name(.) = 'sect3'">3</xsl:when>
+ <xsl:when test="local-name(.) = 'sect4'">4</xsl:when>
+ <xsl:when test="local-name(.) = 'sect5'">5</xsl:when>
+ <xsl:when test="local-name(.) = 'refsect1'">1</xsl:when>
+ <xsl:when test="local-name(.) = 'refsect2'">2</xsl:when>
+ <xsl:when test="local-name(.) = 'refsect3'">3</xsl:when>
+ <xsl:when test="local-name(.) = 'simplesect'">
+ <!-- sigh... -->
+ <xsl:choose>
+ <xsl:when test="local-name(..) = 'section'">
+ <xsl:value-of select="count(ancestor::section)"/>
+ </xsl:when>
+ <xsl:when test="local-name(..) = 'sect1'">2</xsl:when>
+ <xsl:when test="local-name(..) = 'sect2'">3</xsl:when>
+ <xsl:when test="local-name(..) = 'sect3'">4</xsl:when>
+ <xsl:when test="local-name(..) = 'sect4'">5</xsl:when>
+ <xsl:when test="local-name(..) = 'sect5'">6</xsl:when>
+ <xsl:when test="local-name(..) = 'refsect1'">2</xsl:when>
+ <xsl:when test="local-name(..) = 'refsect2'">3</xsl:when>
+ <xsl:when test="local-name(..) = 'refsect3'">4</xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>0</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="depth.from.context" select="count(ancestor::*)-count($toc-context/ancestor::*)"/>
+
+ <xsl:variable name="subtoc.list">
+ <xsl:choose>
+ <xsl:when test="$toc.dd.type = ''">
+ <xsl:copy-of select="$subtoc"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:element name="{$toc.dd.type}" namespace="http://www.w3.org/1999/xhtml">
+ <xsl:copy-of select="$subtoc"/>
+ </xsl:element>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:element name="{$toc.listitem.type}" namespace="http://www.w3.org/1999/xhtml">
+ <xsl:call-template name="toc.line">
+ <xsl:with-param name="toc-context" select="$toc-context"/>
+ </xsl:call-template>
+ <xsl:if test="$toc.listitem.type = 'li' and $toc.section.depth &gt; $depth and ( ($qanda.in.toc = 0 and count($nodes)&gt;0) or ($qanda.in.toc != 0 and count($nodes.plus)&gt;0) ) and $toc.max.depth &gt; $depth.from.context">
+ <xsl:copy-of select="$subtoc.list"/>
+ </xsl:if>
+ </xsl:element>
+ <xsl:if test="$toc.listitem.type != 'li' and $toc.section.depth &gt; $depth and ( ($qanda.in.toc = 0 and count($nodes)&gt;0) or ($qanda.in.toc != 0 and count($nodes.plus)&gt;0) ) and $toc.max.depth &gt; $depth.from.context">
+ <xsl:copy-of select="$subtoc.list"/>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template name="toc.line">
+ <xsl:param name="toc-context" select="."/>
+ <xsl:param name="depth" select="1"/>
+ <xsl:param name="depth.from.context" select="8"/>
+
+ <span>
+ <xsl:attribute name="class"><xsl:value-of select="local-name(.)"/></xsl:attribute>
+
+ <!-- * if $autotoc.label.in.hyperlink is zero, then output the label -->
+ <!-- * before the hyperlinked title (as the DSSSL stylesheet does) -->
+ <xsl:if test="$autotoc.label.in.hyperlink = 0">
+ <xsl:variable name="label">
+ <xsl:apply-templates select="." mode="label.markup"/>
+ </xsl:variable>
+ <xsl:copy-of select="$label"/>
+ <xsl:if test="$label != ''">
+ <xsl:value-of select="$autotoc.label.separator"/>
+ </xsl:if>
+ </xsl:if>
+
+ <a>
+ <xsl:attribute name="href">
+ <xsl:call-template name="href.target">
+ <xsl:with-param name="context" select="$toc-context"/>
+ <xsl:with-param name="toc-context" select="$toc-context"/>
+ </xsl:call-template>
+ </xsl:attribute>
+
+ <!-- * if $autotoc.label.in.hyperlink is non-zero, then output the label -->
+ <!-- * as part of the hyperlinked title -->
+ <xsl:if test="not($autotoc.label.in.hyperlink = 0)">
+ <xsl:variable name="label">
+ <xsl:apply-templates select="." mode="label.markup"/>
+ </xsl:variable>
+ <xsl:copy-of select="$label"/>
+ <xsl:if test="$label != ''">
+ <xsl:value-of select="$autotoc.label.separator"/>
+ </xsl:if>
+ </xsl:if>
+
+ <xsl:apply-templates select="." mode="titleabbrev.markup"/>
+ </a>
+ </span>
+</xsl:template>
+
+<xsl:template match="book" mode="toc">
+ <xsl:param name="toc-context" select="."/>
+
+ <xsl:call-template name="subtoc">
+ <xsl:with-param name="toc-context" select="$toc-context"/>
+ <xsl:with-param name="nodes" select="part|reference |preface|chapter|appendix |article |bibliography|glossary|index |refentry |bridgehead[$bridgehead.in.toc != 0]"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="setindex" mode="toc">
+ <xsl:param name="toc-context" select="."/>
+
+ <!-- If the setindex tag is not empty, it should be it in the TOC -->
+ <xsl:if test="* or $generate.index != 0">
+ <xsl:call-template name="subtoc">
+ <xsl:with-param name="toc-context" select="$toc-context"/>
+ </xsl:call-template>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="part|reference" mode="toc">
+ <xsl:param name="toc-context" select="."/>
+
+ <xsl:call-template name="subtoc">
+ <xsl:with-param name="toc-context" select="$toc-context"/>
+ <xsl:with-param name="nodes" select="appendix|chapter|article |index|glossary|bibliography |preface|reference|refentry |bridgehead[$bridgehead.in.toc != 0]"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="preface|chapter|appendix|article" mode="toc">
+ <xsl:param name="toc-context" select="."/>
+
+ <xsl:call-template name="subtoc">
+ <xsl:with-param name="toc-context" select="$toc-context"/>
+ <xsl:with-param name="nodes" select="section|sect1 |simplesect[$simplesect.in.toc != 0] |refentry |glossary|bibliography|index |bridgehead[$bridgehead.in.toc != 0]"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="sect1" mode="toc">
+ <xsl:param name="toc-context" select="."/>
+ <xsl:call-template name="subtoc">
+ <xsl:with-param name="toc-context" select="$toc-context"/>
+ <xsl:with-param name="nodes" select="sect2 |bridgehead[$bridgehead.in.toc != 0]"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="sect2" mode="toc">
+ <xsl:param name="toc-context" select="."/>
+
+ <xsl:call-template name="subtoc">
+ <xsl:with-param name="toc-context" select="$toc-context"/>
+ <xsl:with-param name="nodes" select="sect3 |bridgehead[$bridgehead.in.toc != 0]"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="sect3" mode="toc">
+ <xsl:param name="toc-context" select="."/>
+
+ <xsl:call-template name="subtoc">
+ <xsl:with-param name="toc-context" select="$toc-context"/>
+ <xsl:with-param name="nodes" select="sect4 |bridgehead[$bridgehead.in.toc != 0]"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="sect4" mode="toc">
+ <xsl:param name="toc-context" select="."/>
+
+ <xsl:call-template name="subtoc">
+ <xsl:with-param name="toc-context" select="$toc-context"/>
+ <xsl:with-param name="nodes" select="sect5 |bridgehead[$bridgehead.in.toc != 0]"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="sect5" mode="toc">
+ <xsl:param name="toc-context" select="."/>
+
+ <xsl:call-template name="subtoc">
+ <xsl:with-param name="toc-context" select="$toc-context"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="simplesect" mode="toc">
+ <xsl:param name="toc-context" select="."/>
+
+ <xsl:call-template name="subtoc">
+ <xsl:with-param name="toc-context" select="$toc-context"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="section" mode="toc">
+ <xsl:param name="toc-context" select="."/>
+
+ <xsl:call-template name="subtoc">
+ <xsl:with-param name="toc-context" select="$toc-context"/>
+ <xsl:with-param name="nodes" select="section|refentry |simplesect[$simplesect.in.toc != 0] |bridgehead[$bridgehead.in.toc != 0]"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="bridgehead" mode="toc">
+ <xsl:param name="toc-context" select="."/>
+
+ <xsl:if test="$bridgehead.in.toc != 0">
+ <xsl:call-template name="subtoc">
+ <xsl:with-param name="toc-context" select="$toc-context"/>
+ </xsl:call-template>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="bibliography|glossary" mode="toc">
+ <xsl:param name="toc-context" select="."/>
+
+ <xsl:call-template name="subtoc">
+ <xsl:with-param name="toc-context" select="$toc-context"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="index" mode="toc">
+ <xsl:param name="toc-context" select="."/>
+
+ <!-- If the index tag is not empty, it should be it in the TOC -->
+ <xsl:if test="* or $generate.index != 0">
+ <xsl:call-template name="subtoc">
+ <xsl:with-param name="toc-context" select="$toc-context"/>
+ </xsl:call-template>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="refentry" mode="toc">
+ <xsl:param name="toc-context" select="."/>
+
+ <xsl:variable name="refmeta" select=".//refmeta"/>
+ <xsl:variable name="refentrytitle" select="$refmeta//refentrytitle"/>
+ <xsl:variable name="refnamediv" select=".//refnamediv"/>
+ <xsl:variable name="refname" select="$refnamediv//refname"/>
+ <xsl:variable name="refdesc" select="$refnamediv//refdescriptor"/>
+ <xsl:variable name="title">
+ <xsl:choose>
+ <xsl:when test="$refentrytitle">
+ <xsl:apply-templates select="$refentrytitle[1]" mode="titleabbrev.markup"/>
+ </xsl:when>
+ <xsl:when test="$refdesc">
+ <xsl:apply-templates select="$refdesc" mode="titleabbrev.markup"/>
+ </xsl:when>
+ <xsl:when test="$refname">
+ <xsl:apply-templates select="$refname[1]" mode="titleabbrev.markup"/>
+ </xsl:when>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:element name="{$toc.listitem.type}" namespace="http://www.w3.org/1999/xhtml">
+ <span class="refentrytitle">
+ <a>
+ <xsl:attribute name="href">
+ <xsl:call-template name="href.target">
+ <xsl:with-param name="toc-context" select="$toc-context"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:copy-of select="$title"/>
+ </a>
+ </span>
+ <span class="refpurpose">
+ <xsl:if test="$annotate.toc != 0">
+ <!-- * DocBook 5 says inlinemediaobject (among other things) -->
+ <!-- * is allowed in refpurpose; so we need to run -->
+ <!-- * apply-templates on refpurpose here, instead of value-of -->
+ <xsl:apply-templates select="refnamediv/refpurpose"/>
+ </xsl:if>
+ </span>
+ </xsl:element>
+</xsl:template>
+
+<xsl:template match="title" mode="toc">
+ <xsl:param name="toc-context" select="."/>
+
+ <a>
+ <xsl:attribute name="href">
+ <xsl:call-template name="href.target">
+ <xsl:with-param name="object" select=".."/>
+ <xsl:with-param name="toc-context" select="$toc-context"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:apply-templates/>
+ </a>
+</xsl:template>
+
+<xsl:template name="manual-toc">
+ <xsl:param name="toc-context" select="."/>
+ <xsl:param name="tocentry"/>
+
+ <!-- be careful, we don't want to change the current document to the other tree! -->
+
+ <xsl:if test="$tocentry">
+ <xsl:variable name="node" select="key('id', $tocentry/@linkend)"/>
+
+ <xsl:element name="{$toc.listitem.type}" namespace="http://www.w3.org/1999/xhtml">
+ <xsl:variable name="label">
+ <xsl:apply-templates select="$node" mode="label.markup"/>
+ </xsl:variable>
+ <xsl:copy-of select="$label"/>
+ <xsl:if test="$label != ''">
+ <xsl:value-of select="$autotoc.label.separator"/>
+ </xsl:if>
+ <a>
+ <xsl:attribute name="href">
+ <xsl:call-template name="href.target">
+ <xsl:with-param name="object" select="$node"/>
+ <xsl:with-param name="toc-context" select="$toc-context"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:apply-templates select="$node" mode="titleabbrev.markup"/>
+ </a>
+ </xsl:element>
+
+ <xsl:if test="$tocentry/*">
+ <xsl:element name="{$toc.list.type}" namespace="http://www.w3.org/1999/xhtml">
+ <xsl:call-template name="manual-toc">
+ <xsl:with-param name="tocentry" select="$tocentry/*[1]"/>
+ </xsl:call-template>
+ </xsl:element>
+ </xsl:if>
+
+ <xsl:if test="$tocentry/following-sibling::*">
+ <xsl:call-template name="manual-toc">
+ <xsl:with-param name="tocentry" select="$tocentry/following-sibling::*[1]"/>
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:if>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template name="list.of.titles">
+ <xsl:param name="toc-context" select="."/>
+ <xsl:param name="titles" select="'table'"/>
+ <xsl:param name="nodes" select=".//table"/>
+
+ <xsl:if test="$nodes">
+ <div class="list-of-{$titles}s">
+ <xsl:choose>
+ <xsl:when test="$make.clean.html != 0">
+ <div class="toc-title">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key">
+ <xsl:choose>
+ <xsl:when test="$titles='table'">ListofTables</xsl:when>
+ <xsl:when test="$titles='figure'">ListofFigures</xsl:when>
+ <xsl:when test="$titles='equation'">ListofEquations</xsl:when>
+ <xsl:when test="$titles='example'">ListofExamples</xsl:when>
+ <xsl:when test="$titles='procedure'">ListofProcedures</xsl:when>
+ <xsl:otherwise>ListofUnknown</xsl:otherwise>
+ </xsl:choose>
+ </xsl:with-param>
+ </xsl:call-template>
+ </div>
+ </xsl:when>
+ <xsl:otherwise>
+ <p>
+ <strong xmlns:xslo="http://www.w3.org/1999/XSL/Transform">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key">
+ <xsl:choose>
+ <xsl:when test="$titles='table'">ListofTables</xsl:when>
+ <xsl:when test="$titles='figure'">ListofFigures</xsl:when>
+ <xsl:when test="$titles='equation'">ListofEquations</xsl:when>
+ <xsl:when test="$titles='example'">ListofExamples</xsl:when>
+ <xsl:when test="$titles='procedure'">ListofProcedures</xsl:when>
+ <xsl:otherwise>ListofUnknown</xsl:otherwise>
+ </xsl:choose>
+ </xsl:with-param>
+ </xsl:call-template>
+ </strong>
+ </p>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:element name="{$toc.list.type}" namespace="http://www.w3.org/1999/xhtml">
+ <xsl:apply-templates select="$nodes" mode="toc">
+ <xsl:with-param name="toc-context" select="$toc-context"/>
+ </xsl:apply-templates>
+ </xsl:element>
+ </div>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="figure|table|example|equation|procedure" mode="toc">
+ <xsl:param name="toc-context" select="."/>
+
+ <xsl:element name="{$toc.listitem.type}" namespace="http://www.w3.org/1999/xhtml">
+ <xsl:variable name="label">
+ <xsl:apply-templates select="." mode="label.markup"/>
+ </xsl:variable>
+ <xsl:copy-of select="$label"/>
+ <xsl:if test="$label != ''">
+ <xsl:value-of select="$autotoc.label.separator"/>
+ </xsl:if>
+ <a>
+ <xsl:attribute name="href">
+ <xsl:call-template name="href.target">
+ <xsl:with-param name="toc-context" select="$toc-context"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:apply-templates select="." mode="titleabbrev.markup"/>
+ </a>
+ </xsl:element>
+</xsl:template>
+
+<!-- Used only if qanda.in.toc parameter is non-zero -->
+<xsl:template match="qandaset" mode="toc">
+ <xsl:param name="toc-context" select="."/>
+ <xsl:call-template name="subtoc">
+ <xsl:with-param name="toc-context" select="$toc-context"/>
+ <xsl:with-param name="nodes" select="qandadiv | qandaentry"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="qandadiv|qandaentry" mode="toc">
+ <xsl:apply-templates select="." mode="qandatoc.mode"/>
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/biblio-iso690.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/biblio-iso690.xsl
new file mode 100644
index 0000000..7713409
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/biblio-iso690.xsl
@@ -0,0 +1,1300 @@
+<?xml version="1.0" encoding="ASCII"?>
+<!--This file was created automatically by html2xhtml-->
+<!--from the HTML stylesheets.-->
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1999/xhtml" version="1.0">
+
+
+<!-- ********************************************************************
+ $Id: biblio.xsl 6402 2006-11-12 08:23:21Z bobstayton $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ The original code for processing bibliography in ISO690 style
+ was provided by Jana Dvorakova <jana4u@seznam.cz>
+
+ ******************************************************************** -->
+
+<!-- ==================================================================== -->
+
+<!-- if biblioentry.alt.primary.seps is set to nonzero value then use alternative separators for primary responsibility - $alt.person.two.sep, $alt.person.last.sep, $alt.person.more.sep -->
+<xsl:param name="biblioentry.alt.primary.seps" select="0"/>
+
+<!-- how many authors will be printed if there is more than three authors - set to number 1 (default value), 2 or 3 -->
+<xsl:param name="biblioentry.primary.count" select="1"/>
+
+<!-- ==================================================================== -->
+
+<xsl:template name="iso690.makecitation">
+<!-- Types of resources -->
+ <xsl:choose>
+
+ <!-- SYSTEMS OF ELECTRONIC COMMUNICATION : ENTIRE MESSAGE SYSTEM -->
+ <!-- same as Monographs -->
+ <xsl:when test="./@role='messagesystem'">
+ <xsl:call-template name="iso690.monogr"/>
+ </xsl:when>
+
+ <!-- SYSTEMS OF ELECTRONIC COMMUNICATION : ELECTRONIC MESSAGES -->
+ <!-- same as Contributions to Monographs -->
+ <xsl:when test="./@role='message'">
+ <xsl:call-template name="iso690.paper.mon"/>
+ </xsl:when>
+
+ <!-- SERIALS -->
+ <xsl:when test="./@role='serial' or ./biblioid/@class='issn' or ./issn">
+ <xsl:call-template name="iso690.serial"/>
+ </xsl:when>
+
+ <!-- PARTS OF MONOGRAPHS -->
+ <xsl:when test="./@role='part' or (./bibliomisc[@role='secnum']|./bibliomisc[@role='sectitle'])">
+ <xsl:call-template name="iso690.monogr.part"/>
+ </xsl:when>
+
+ <!-- CONTRIBUTIONS TO MONOGRAPHS -->
+ <xsl:when test="./@role='contribution' or (./biblioset/@relation='part' and ./biblioset/@relation='book')">
+ <xsl:call-template name="iso690.paper.mon"/>
+ </xsl:when>
+
+ <!-- ARTICLES, ETC., IN SERIALS -->
+ <xsl:when test="./@role='article' or (./biblioset/@relation='journal' and ./biblioset/@relation='article')">
+ <xsl:call-template name="iso690.article"/>
+ </xsl:when>
+
+ <!-- PATENT DOCUMENTS -->
+ <xsl:when test="./@role='patent' or (./bibliomisc[@role='patenttype'] and ./bibliomisc[@role='patentnum'])">
+ <xsl:call-template name="iso690.patent"/>
+ </xsl:when>
+
+ <!-- MONOGRAPHS -->
+ <xsl:otherwise>
+ <xsl:call-template name="iso690.monogr"/>
+ </xsl:otherwise>
+
+ </xsl:choose>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<!-- MONOGRAPHS -->
+<xsl:template name="iso690.monogr">
+ <!-- Primary responsibility -->
+ <xsl:call-template name="iso690.primary"/>
+ <!-- Title and Type of medium -->
+ <xsl:call-template name="iso690.title"/>
+ <!-- Subordinate responsibility -->
+ <xsl:call-template name="iso690.secondary"/>
+ <!-- Edition -->
+ <xsl:call-template name="iso690.edition"/>
+ <!-- Place of publication, Publisher, Year/Date of publication, Date of update/revision, Date of citation -->
+ <xsl:call-template name="iso690.pub"/>
+ <!-- Extent -->
+ <xsl:call-template name="iso690.extent"/>
+ <!-- Series -->
+ <xsl:call-template name="iso690.serie"/>
+ <!-- Notes -->
+ <xsl:call-template name="iso690.notice"/>
+ <!-- Avaibility and access -->
+ <xsl:call-template name="iso690.access"/>
+ <!-- Standard number -->
+ <xsl:call-template name="iso690.isbn"/>
+</xsl:template>
+
+<!-- SERIALS -->
+<xsl:template name="iso690.serial">
+ <!-- Title and Type of medium -->
+ <xsl:call-template name="iso690.title"/>
+ <!-- Responsibility [nonEL] -->
+ <xsl:if test="not(./bibliomisc[@role='medium'])">
+ <xsl:call-template name="iso690.secondary"/>
+ </xsl:if>
+ <!-- Edition -->
+ <xsl:call-template name="iso690.edition">
+ <xsl:with-param name="after" select="./bibliomisc[@role='issuing']"/>
+ </xsl:call-template>
+ <!-- Issue designation (date and/or num) [nonEL] -->
+ <xsl:if test="not(./bibliomisc[@role='medium'])">
+ <xsl:call-template name="iso690.issuing"/>
+ </xsl:if>
+ <!-- Place of publication, Publisher, Year/Date of publication, Date of update/revision, Date of citation -->
+ <xsl:call-template name="iso690.pub"/>
+ <!-- Series -->
+ <xsl:call-template name="iso690.serie"/>
+ <!-- Notes -->
+ <xsl:call-template name="iso690.notice"/>
+ <!-- Avaibility and access -->
+ <xsl:call-template name="iso690.access"/>
+ <!-- Standard number -->
+ <xsl:call-template name="iso690.issn"/>
+</xsl:template>
+
+<!-- PARTS OF MONOGRAPHS -->
+<xsl:template name="iso690.monogr.part">
+ <!-- Primary responsibility of host document -->
+ <xsl:call-template name="iso690.primary"/>
+ <!-- Title and Type of medium of host document -->
+ <xsl:call-template name="iso690.title"/>
+ <!-- Subordinate responsibility of host document [EL] -->
+ <xsl:if test="./bibliomisc[@role='medium']">
+ <xsl:call-template name="iso690.secondary"/>
+ </xsl:if>
+ <!-- Edition -->
+ <xsl:call-template name="iso690.edition">
+ <xsl:with-param name="after" select="./volumenum"/>
+ </xsl:call-template>
+ <!-- Numeration of the part [nonEL]-->
+ <xsl:if test="not(./bibliomisc[@role='medium'])">
+ <xsl:call-template name="iso690.partnr"/>
+ <!-- Subordinate responsibility [nonEL] -->
+ <xsl:call-template name="iso690.secondary"/>
+ </xsl:if>
+ <!-- Place of publication, Publisher, Year/Date of publication, Date of update/revision, Date of citation -->
+ <xsl:call-template name="iso690.pub"/>
+ <!-- Location within host -->
+ <xsl:call-template name="iso690.part.location"/>
+ <xsl:if test="./bibliomisc[@role='medium']">
+ <!-- Numeration within host document [EL] -->
+ <!-- Notes [EL] -->
+ <xsl:call-template name="iso690.notice"/>
+ <!-- Avaibility and access [EL] -->
+ <xsl:call-template name="iso690.access"/>
+ <!-- Standard number [EL] -->
+ <xsl:call-template name="iso690.isbn"/>
+ </xsl:if>
+</xsl:template>
+
+<!-- CONTRIBUTIONS TO MONOGRAPHS -->
+<xsl:template name="iso690.paper.mon">
+<!-- Contribution -->
+ <xsl:apply-templates mode="iso690.paper.part" select="./biblioset[@relation='part']"/>
+<!-- In -->
+ <xsl:text>In </xsl:text>
+<!-- Host -->
+ <xsl:apply-templates mode="iso690.paper.book" select="./biblioset[@relation='book']"/>
+</xsl:template>
+
+<xsl:template match="biblioset" mode="iso690.paper.part">
+<!-- Contribution -->
+ <!-- Primary responsibility -->
+ <xsl:call-template name="iso690.primary"/>
+ <!-- Title -->
+ <xsl:call-template name="iso690.title">
+ <xsl:with-param name="italic" select="0"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="biblioset" mode="iso690.paper.book">
+<!-- Host -->
+ <!-- Primary responsibility -->
+ <xsl:call-template name="iso690.primary"/>
+ <!-- Title and Type of medium -->
+ <xsl:call-template name="iso690.title"/>
+ <!-- Subordinate responsibility [EL] -->
+ <xsl:if test="./bibliomisc[@role='medium']">
+ <xsl:call-template name="iso690.secondary"/>
+ </xsl:if>
+ <!-- Edition -->
+ <xsl:call-template name="iso690.edition"/>
+ <!-- Place of publication, Publisher, Year/Date of publication, Date of update/revision, Date of citation -->
+ <xsl:call-template name="iso690.paper.pub"/>
+ <!-- Numeration within host document [EL] -->
+ <!-- Location within host -->
+ <xsl:call-template name="iso690.location"/>
+ <xsl:if test="./bibliomisc[@role='medium']">
+ <!-- Notes [EL] -->
+ <xsl:call-template name="iso690.notice"/>
+ <!-- Avaibility and access [EL] -->
+ <xsl:call-template name="iso690.access"/>
+ <!-- Standard number [EL] -->
+ <xsl:call-template name="iso690.isbn"/>
+ </xsl:if>
+</xsl:template>
+
+<!-- ARTICLES, ETC., IN SERIALS -->
+<xsl:template name="iso690.article">
+<!-- Article -->
+ <xsl:apply-templates mode="iso690.article.art" select="./biblioset[@relation='article']"/>
+<!-- Serial -->
+ <xsl:apply-templates mode="iso690.article.jour" select="./biblioset[@relation='journal']"/>
+</xsl:template>
+
+<xsl:template match="biblioset" mode="iso690.article.art">
+<!-- Article -->
+ <!-- Primary responsibility -->
+ <xsl:call-template name="iso690.primary"/>
+ <!-- Title -->
+ <xsl:call-template name="iso690.title">
+ <xsl:with-param name="italic" select="0"/>
+ </xsl:call-template>
+ <!-- Subordinate responsibility [nonEL] -->
+ <xsl:if test="not(../*/bibliomisc[@role='medium'])">
+ <xsl:call-template name="iso690.secondary"/>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="biblioset" mode="iso690.article.jour">
+<!-- Serial -->
+ <!-- Title and Type of medium -->
+ <xsl:call-template name="iso690.title"/>
+ <!-- Edition -->
+ <xsl:call-template name="iso690.edition">
+ <xsl:with-param name="after" select="./pubdate[not(@role='issuing')]|./volumenum|./issuenum|./pagenums"/>
+ </xsl:call-template>
+ <!-- Number designation [EL] -->
+ <!-- Location within host -->
+ <xsl:call-template name="iso690.article.location"/>
+ <xsl:if test="./bibliomisc[@role='medium']">
+ <!-- Notes [EL] -->
+ <xsl:call-template name="iso690.notice"/>
+ <!-- Avaibility and access [EL] -->
+ <xsl:call-template name="iso690.access"/>
+ <!-- Standard number [EL] -->
+ <xsl:call-template name="iso690.issn"/>
+ </xsl:if>
+</xsl:template>
+
+<!-- PATENT DOCUMENTS -->
+<xsl:template name="iso690.patent">
+ <!-- Primary responsibility (applicant) -->
+ <xsl:call-template name="iso690.primary"/>
+ <!-- Title of the invention -->
+ <xsl:call-template name="iso690.title"/>
+ <!-- Subordinate responsibility -->
+ <xsl:call-template name="iso690.secondary"/>
+ <!-- Notes -->
+ <xsl:call-template name="iso690.notice"/>
+ <!-- Identification -->
+ <xsl:call-template name="iso690.pat.ident"/>
+</xsl:template>
+
+<!-- ==================================================================== -->
+<!-- Elements -->
+
+<!-- Primary responsibility -->
+<xsl:template name="iso690.primary">
+ <xsl:param name="primary.sep">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'primary.sep'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:choose>
+ <xsl:when test="./authorgroup/author|./author">
+ <xsl:call-template name="iso690.author.list">
+ <xsl:with-param name="person.list" select=".//authorgroup/author|.//author"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="./authorgroup/editor|./editor">
+ <xsl:call-template name="iso690.author.list">
+ <xsl:with-param name="person.list" select=".//authorgroup/editor|.//editor"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="./authorgroup/corpauthor|./corpauthor">
+ <xsl:call-template name="iso690.author.list">
+ <xsl:with-param name="person.list" select=".//authorgroup/corpauthor|.//corpauthor"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:if test="(./firstname)and(./surname)">
+ <xsl:call-template name="iso690.author"/>
+ <xsl:call-template name="iso690.endsep">
+ <xsl:with-param name="text" select="string(./firstname[1])"/>
+ <xsl:with-param name="sep" select="$primary.sep"/>
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="iso690.author.list">
+ <xsl:param name="person.list" select="author|corpauthor|editor"/>
+ <xsl:param name="person.count" select="count($person.list)"/>
+ <xsl:param name="count" select="1"/>
+ <xsl:param name="group" select="./authorgroup[@role='many']"/>
+ <xsl:param name="many" select="0"/>
+
+ <xsl:param name="primary.many">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'primary.many'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:param name="primary.editor">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'primary.editor'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:param name="primary.sep">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'primary.sep'"/></xsl:call-template>
+ </xsl:param>
+
+ <xsl:choose>
+ <xsl:when test="$count &gt; $person.count"/>
+ <xsl:otherwise>
+ <xsl:choose>
+ <xsl:when test="$person.count &lt; 4 and not($group)">
+ <xsl:call-template name="iso690.author">
+ <xsl:with-param name="node" select="$person.list[position()=$count]"/>
+ </xsl:call-template>
+ <xsl:choose>
+ <xsl:when test="$person.count = 2 and $count = 1 and $biblioentry.alt.primary.seps != 0">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'alt.person.two.sep'"/></xsl:call-template>
+ </xsl:when>
+ <xsl:when test="$person.count = 2 and $count = 1">
+ <xsl:call-template name="gentext.template">
+ <xsl:with-param name="context" select="'authorgroup'"/>
+ <xsl:with-param name="name" select="'sep2'"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="$person.count &gt; 2 and $count+1 = $person.count and $biblioentry.alt.primary.seps != 0">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'alt.person.last.sep'"/></xsl:call-template>
+ </xsl:when>
+ <xsl:when test="$person.count &gt; 2 and $count+1 = $person.count">
+ <xsl:call-template name="gentext.template">
+ <xsl:with-param name="context" select="'authorgroup'"/>
+ <xsl:with-param name="name" select="'seplast'"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="$count &lt; $person.count and $biblioentry.alt.primary.seps != 0">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'alt.person.more.sep'"/></xsl:call-template>
+ </xsl:when>
+ <xsl:when test="$count &lt; $person.count">
+ <xsl:call-template name="gentext.template">
+ <xsl:with-param name="context" select="'authorgroup'"/>
+ <xsl:with-param name="name" select="'sep'"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="($count = $person.count)">
+ <xsl:choose>
+ <xsl:when test="$many!=0">
+ <xsl:if test="name($person.list[position()=$count])='editor'">
+ <xsl:value-of select="$primary.editor"/>
+ </xsl:if>
+ <xsl:value-of select="$primary.many"/>
+ <xsl:call-template name="iso690.endsep">
+ <xsl:with-param name="text" select="$primary.many"/>
+ <xsl:with-param name="sep" select="$primary.sep"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="name($person.list[position()=$count])='editor'">
+ <xsl:value-of select="$primary.editor"/>
+ <xsl:value-of select="$primary.sep"/>
+ </xsl:when>
+ <xsl:when test="name($person.list[position()=$count])='corpauthor'">
+ <xsl:call-template name="iso690.endsep">
+ <xsl:with-param name="text" select="string($person.list[position()=$count])"/>
+ <xsl:with-param name="sep" select="$primary.sep"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="iso690.endsep">
+ <xsl:with-param name="text" select="string($person.list[position()=$count]//firstname[1])"/>
+ <xsl:with-param name="sep" select="$primary.sep"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ </xsl:choose>
+
+ <xsl:call-template name="iso690.author.list">
+ <xsl:with-param name="person.list" select="$person.list"/>
+ <xsl:with-param name="person.count" select="$person.count"/>
+ <xsl:with-param name="count" select="$count+1"/>
+ <xsl:with-param name="many" select="$many"/>
+ <xsl:with-param name="group"/>
+ </xsl:call-template>
+ </xsl:when>
+
+ <xsl:otherwise>
+ <xsl:choose>
+ <xsl:when test="($biblioentry.primary.count&gt;=3) and ($person.count&gt;=3)">
+ <xsl:call-template name="iso690.author.list">
+ <xsl:with-param name="person.list" select="$person.list[1]|$person.list[2]|$person.list[3]"/>
+ <xsl:with-param name="person.count" select="3"/>
+ <xsl:with-param name="count" select="1"/>
+ <xsl:with-param name="many" select="1"/>
+ <xsl:with-param name="group"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="($biblioentry.primary.count&gt;1) and ($person.count&gt;1)">
+ <xsl:call-template name="iso690.author.list">
+ <xsl:with-param name="person.list" select="$person.list[1]|$person.list[2]"/>
+ <xsl:with-param name="person.count" select="2"/>
+ <xsl:with-param name="count" select="1"/>
+ <xsl:with-param name="many" select="1"/>
+ <xsl:with-param name="group"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="iso690.author.list">
+ <xsl:with-param name="person.list" select="$person.list[1]"/>
+ <xsl:with-param name="person.count" select="1"/>
+ <xsl:with-param name="count" select="1"/>
+ <xsl:with-param name="many" select="1"/>
+ <xsl:with-param name="group"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="iso690.author">
+ <xsl:param name="node" select="."/>
+ <xsl:param name="lastfirst.sep">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'lastfirst.sep'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:choose>
+ <xsl:when test="name($node)!='corpauthor'">
+ <span style="text-transform:uppercase">
+ <xsl:apply-templates mode="iso690.mode" select="$node//surname[1]"/>
+ </span>
+ <xsl:if test="$node//surname and $node//firstname">
+ <xsl:value-of select="$lastfirst.sep"/>
+ </xsl:if>
+ <xsl:apply-templates mode="iso690.mode" select="$node//firstname[1]"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <span style="text-transform:uppercase">
+ <xsl:apply-templates mode="iso690.mode" select="$node"/>
+ </span>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="corpauthor|firstname|surname" mode="iso690.mode">
+ <xsl:apply-templates mode="iso690.mode"/>
+</xsl:template>
+
+<!-- Title and Type of medium -->
+<xsl:template name="iso690.title">
+ <xsl:param name="medium" select="./bibliomisc[@role='medium']"/>
+ <xsl:param name="italic" select="1"/>
+ <xsl:param name="sep">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'title.sep'"/></xsl:call-template>
+ </xsl:param>
+
+ <xsl:apply-templates mode="iso690.mode" select="./title">
+ <xsl:with-param name="medium" select="$medium"/>
+ <xsl:with-param name="italic" select="$italic"/>
+ <xsl:with-param name="sep" select="$sep"/>
+ </xsl:apply-templates>
+</xsl:template>
+
+<xsl:template match="title" mode="iso690.mode">
+ <xsl:param name="medium"/>
+ <xsl:param name="italic" select="1"/>
+ <xsl:param name="sep">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'title.sep'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:param name="medium1">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'medium1'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:param name="medium2">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'medium2'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:choose>
+ <xsl:when test="$italic=1">
+ <xsl:call-template name="iso690.italic.title"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="iso690.make.title"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:if test="$medium">
+ <xsl:value-of select="$medium1"/>
+ <xsl:apply-templates mode="iso690.mode" select="$medium"/>
+ <xsl:value-of select="$medium2"/>
+ </xsl:if>
+ <xsl:call-template name="iso690.endsep">
+ <xsl:with-param name="text" select="concat(string(.),string(../subtitle))"/>
+ <xsl:with-param name="sep" select="$sep"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template name="iso690.italic.title">
+ <em xmlns:xslo="http://www.w3.org/1999/XSL/Transform">
+ <xsl:call-template name="iso690.make.title"/>
+ </em>
+</xsl:template>
+
+<xsl:template name="iso690.make.title">
+ <xsl:param name="submaintitle.sep">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'submaintitle.sep'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:apply-templates mode="iso690.mode"/>
+ <xsl:if test="../subtitle">
+ <xsl:value-of select="$submaintitle.sep"/>
+ <xsl:apply-templates mode="iso690.mode" select="../subtitle"/>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="subtitle" mode="iso690.mode">
+ <xsl:apply-templates mode="iso690.mode"/>
+</xsl:template>
+
+<xsl:template match="bibliomisc[@role='medium']" mode="iso690.mode">
+ <xsl:apply-templates mode="iso690.mode"/>
+</xsl:template>
+
+<!-- Subordinate responsibility -->
+<xsl:template name="iso690.secondary">
+ <xsl:param name="secondary.sep">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'secondary.sep'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:param name="secondary.person.sep">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'secondary.person.sep'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:for-each select="./bibliomisc[@role='secondary']">
+ <xsl:apply-templates mode="iso690.mode" select="."/>
+ <xsl:choose>
+ <xsl:when test="position()=count(../bibliomisc[@role='secondary'])">
+ <xsl:call-template name="iso690.endsep">
+ <xsl:with-param name="text" select="string(.)"/>
+ <xsl:with-param name="sep" select="$secondary.sep"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$secondary.person.sep"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:for-each>
+</xsl:template>
+
+<xsl:template match="bibliomisc[@role='secondary']" mode="iso690.mode">
+ <xsl:apply-templates mode="iso690.mode"/>
+</xsl:template>
+
+<!-- Edition -->
+<xsl:template name="iso690.edition">
+ <xsl:param name="after"/>
+ <xsl:param name="edition.serial.sep">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'edition.serial.sep'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:choose>
+ <xsl:when test="string($after)!=''">
+ <xsl:apply-templates mode="iso690.mode" select="./edition">
+ <xsl:with-param name="sep" select="$edition.serial.sep"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates mode="iso690.mode" select="./edition"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="edition" mode="iso690.mode">
+ <xsl:param name="sep">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'edition.sep'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:apply-templates mode="iso690.mode"/>
+ <xsl:call-template name="iso690.endsep">
+ <xsl:with-param name="text" select="string(.)"/>
+ <xsl:with-param name="sep" select="$sep"/>
+ </xsl:call-template>
+</xsl:template>
+
+<!-- Issue designation (date and/or num) -->
+<xsl:template name="iso690.issuing">
+ <xsl:param name="issuing.div">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'issuing.div'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:param name="issuing.range">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'issuing.range'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:param name="issuing.sep">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'issuing.sep'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:choose>
+ <xsl:when test="./pubdate[@role='issuing'] and ./volumenum[2] and ./issuenum[2]">
+ <xsl:call-template name="iso690.issuedate"/>
+ <xsl:apply-templates mode="iso690.mode" select="./volumenum[1]">
+ <xsl:with-param name="sep" select="$issuing.div"/>
+ </xsl:apply-templates>
+ <xsl:apply-templates mode="iso690.mode" select="./issuenum[1]">
+ <xsl:with-param name="sep" select="$issuing.range"/>
+ </xsl:apply-templates>
+ <xsl:apply-templates mode="iso690.mode" select="./volumenum[2]">
+ <xsl:with-param name="sep" select="$issuing.div"/>
+ </xsl:apply-templates>
+ <xsl:apply-templates mode="iso690.mode" select="./issuenum[2]">
+ <xsl:with-param name="sep" select="$issuing.sep"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:when test="./pubdate[@role='issuing'] and ./volumenum[2]">
+ <xsl:call-template name="iso690.issuedate"/>
+ <xsl:apply-templates mode="iso690.mode" select="./volumenum[1]">
+ <xsl:with-param name="sep" select="$issuing.range"/>
+ </xsl:apply-templates>
+ <xsl:apply-templates mode="iso690.mode" select="./volumenum[2]">
+ <xsl:with-param name="sep" select="$issuing.sep"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:when test="./pubdate[@role='issuing'] and ./volumenum and ./issuenum">
+ <xsl:apply-templates mode="iso690.mode" select="./pubdate[@role='issuing']">
+ <xsl:with-param name="sep" select="$issuing.div"/>
+ </xsl:apply-templates>
+ <xsl:apply-templates mode="iso690.mode" select="./volumenum">
+ <xsl:with-param name="sep" select="$issuing.div"/>
+ </xsl:apply-templates>
+ <xsl:apply-templates mode="iso690.mode" select="./issuenum">
+ <xsl:with-param name="sep" select="$issuing.sep"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:when test="./pubdate[@role='issuing']">
+ <xsl:apply-templates mode="iso690.mode" select="./pubdate[@role='issuing']">
+ <xsl:with-param name="sep" select="$issuing.sep"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:when test="./volumenum">
+ <xsl:apply-templates mode="iso690.mode" select="./volumenum">
+ <xsl:with-param name="sep" select="$issuing.sep"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:when test="./issuenum">
+ <xsl:apply-templates mode="iso690.mode" select="./issuenum">
+ <xsl:with-param name="sep" select="$issuing.sep"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="iso690.issuedate">
+ <xsl:param name="issuing.div">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'issuing.div'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:param name="issuing.range">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'issuing.range'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:param name="issuing.sep">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'issuing.sep'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:choose>
+ <xsl:when test="./pubdate[@role='issuing'][2]">
+ <xsl:apply-templates mode="iso690.mode" select="./pubdate[@role='issuing'][1]">
+ <xsl:with-param name="sep" select="$issuing.range"/>
+ </xsl:apply-templates>
+ <xsl:apply-templates mode="iso690.mode" select="./pubdate[@role='issuing'][2]">
+ <xsl:with-param name="sep" select="$issuing.div"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates mode="iso690.mode" select="./pubdate[@role='issuing']">
+ <xsl:with-param name="sep" select="$issuing.div"/>
+ </xsl:apply-templates>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="pubdate[@role='issuing']" mode="iso690.mode">
+ <xsl:param name="sep"/>
+ <xsl:variable name="substr" select="substring(string(.),string-length(string(.)))"/>
+ <xsl:apply-templates mode="iso690.mode"/>
+ <xsl:call-template name="iso690.space">
+ <xsl:with-param name="text" select="$substr"/>
+ </xsl:call-template>
+ <xsl:choose>
+ <xsl:when test="$substr='-'">
+ <xsl:call-template name="iso690.endsep">
+ <xsl:with-param name="text" select="' '"/>
+ <xsl:with-param name="sep" select="$sep"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="iso690.endsep">
+ <xsl:with-param name="text" select="string(.)"/>
+ <xsl:with-param name="sep" select="$sep"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- Numeration of the part -->
+<xsl:template name="iso690.partnr">
+ <xsl:param name="partnr.sep">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'partnr.sep'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:apply-templates mode="iso690.mode" select="./volumenum">
+ <xsl:with-param name="sep" select="$partnr.sep"/>
+ </xsl:apply-templates>
+</xsl:template>
+
+<!-- Place of publication, Publisher, Year/Date of publication, Date of update/revision, Date of citation -->
+<xsl:template name="iso690.pub">
+ <xsl:param name="onlydate" select="0"/>
+ <xsl:param name="placesep">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'placepubl.sep'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:param name="pubsep">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'publyear.sep'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:param name="endsep">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'pubinfo.sep'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:choose>
+ <xsl:when test="(./publisher/publishername|./publishername|./publisher/address/city)and($onlydate=0)and(./pubdate[not(@role='issuing')]|./copyright/year|./date[@role='upd']|./date[@role='upd'])">
+ <xsl:apply-templates mode="iso690.mode" select="./publisher/address/city">
+ <xsl:with-param name="sep" select="$placesep"/>
+ </xsl:apply-templates>
+ <xsl:apply-templates mode="iso690.mode" select="./publisher/publishername|./publishername">
+ <xsl:with-param name="sep" select="$pubsep"/>
+ </xsl:apply-templates>
+ <xsl:apply-templates mode="iso690.mode" select="./pubdate[not(@role='issuing')]|./copyright/year">
+ <xsl:with-param name="sep" select="$endsep"/>
+ </xsl:apply-templates>
+ <xsl:if test="not(./pubdate[not(@role='issuing')]|./copyright/year)">
+ <xsl:call-template name="iso690.data">
+ <xsl:with-param name="sep" select="$endsep"/>
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:when>
+ <xsl:when test="(./publisher/publishername|./publishername)and(./publisher/address/city)and($onlydate=0)">
+ <xsl:apply-templates mode="iso690.mode" select="./publisher/address/city">
+ <xsl:with-param name="sep" select="$placesep"/>
+ </xsl:apply-templates>
+ <xsl:apply-templates mode="iso690.mode" select="./publisher/publishername|./publishername">
+ <xsl:with-param name="sep" select="$endsep"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:when test="($onlydate=1)or(./pubdate[not(@role='issuing')]|./copyright/year)">
+ <xsl:apply-templates mode="iso690.mode" select="./pubdate[not(@role='issuing')]|./copyright/year">
+ <xsl:with-param name="sep" select="$endsep"/>
+ </xsl:apply-templates>
+ <xsl:if test="$onlydate=1">
+ <xsl:call-template name="iso690.location">
+ <xsl:with-param name="onlypages" select="1"/>
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:when>
+ <xsl:when test="not(./pubdate[not(@role='issuing')]|./copyright/year)">
+ <xsl:call-template name="iso690.data">
+ <xsl:with-param name="sep" select="$endsep"/>
+ </xsl:call-template>
+ </xsl:when>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="iso690.paper.pub">
+ <xsl:param name="spec.pubinfo.sep">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'spec.pubinfo.sep'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:choose>
+ <xsl:when test="./volumnum|./issuenum|./pagenums">
+ <xsl:call-template name="iso690.pub">
+ <xsl:with-param name="endsep" select="$spec.pubinfo.sep"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="iso690.pub"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="iso690.data">
+ <xsl:param name="sep"/>
+ <xsl:param name="datecit2">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'datecit2'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:apply-templates mode="iso690.mode" select="./date[@role='upd']">
+ <xsl:with-param name="sep"/>
+ </xsl:apply-templates>
+ <xsl:apply-templates mode="iso690.mode" select="./date[@role='cit']"/>
+ <xsl:choose>
+ <xsl:when test="./date[@role='cit']">
+ <xsl:call-template name="iso690.endsep">
+ <xsl:with-param name="text" select="$datecit2"/>
+ <xsl:with-param name="sep" select="$sep"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="./date[@role='upd']">
+ <xsl:call-template name="iso690.endsep">
+ <xsl:with-param name="text" select="string(./date[@role='upd'])"/>
+ <xsl:with-param name="sep" select="$sep"/>
+ </xsl:call-template>
+ </xsl:when>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="publisher/address/city|publishername" mode="iso690.mode">
+ <xsl:param name="sep"/>
+ <xsl:param name="upd" select="0"/>
+ <xsl:apply-templates mode="iso690.mode"/>
+ <xsl:call-template name="iso690.endsep">
+ <xsl:with-param name="text" select="string(.)"/>
+ <xsl:with-param name="sep" select="$sep"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="pubdate|copyright/year" mode="iso690.mode">
+ <xsl:param name="sep"/>
+ <xsl:param name="upd" select="1"/>
+ <xsl:param name="datecit2">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'datecit2'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:variable name="substr" select="substring(string(.),string-length(string(.)))"/>
+ <xsl:if test="name(.)!='pubdate'">
+ <xsl:value-of select="'&#169;'"/><!-- copyright -->
+ </xsl:if>
+ <xsl:apply-templates mode="iso690.mode"/>
+ <xsl:call-template name="iso690.space">
+ <xsl:with-param name="text" select="$substr"/>
+ </xsl:call-template>
+ <xsl:if test="$upd!=0">
+ <xsl:choose>
+ <xsl:when test="name(.)='pubdate'">
+ <xsl:apply-templates mode="iso690.mode" select="../date[@role='upd']"/>
+ <xsl:apply-templates mode="iso690.mode" select="../date[@role='cit']"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates mode="iso690.mode" select="../../date[@role='upd']"/>
+ <xsl:apply-templates mode="iso690.mode" select="../../date[@role='cit']"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:if>
+ <xsl:choose>
+ <xsl:when test="../date[@role='cit']|../../date[@role='cit'] and $upd!=0">
+ <xsl:call-template name="iso690.endsep">
+ <xsl:with-param name="text" select="$datecit2"/>
+ <xsl:with-param name="sep" select="$sep"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="../date[@role='upd']|../../date[@role='upd'] and $upd!=0">
+ <xsl:call-template name="iso690.endsep">
+ <xsl:with-param name="text" select="string(../date[@role='upd'])"/>
+ <xsl:with-param name="sep" select="$sep"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="$substr='-'">
+ <xsl:call-template name="iso690.endsep">
+ <xsl:with-param name="text" select="' '"/>
+ <xsl:with-param name="sep" select="$sep"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="iso690.endsep">
+ <xsl:with-param name="text" select="string(.)"/>
+ <xsl:with-param name="sep" select="$sep"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="iso690.space">
+ <xsl:param name="text" select="substring(string(.),string-length(string(.)))"/>
+ <xsl:if test="$text='-'">
+ <xsl:value-of select="' '"/>
+ </xsl:if>
+</xsl:template>
+
+<!-- Date of update/revision -->
+<xsl:template match="date[@role='upd']" mode="iso690.mode">
+ <xsl:param name="sep">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'upd.sep'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:value-of select="$sep"/>
+ <xsl:apply-templates mode="iso690.mode"/>
+</xsl:template>
+
+<!-- Date of citation -->
+<xsl:template match="date[@role='cit']" mode="iso690.mode">
+ <xsl:param name="datecit1">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'datecit1'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:param name="datecit2">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'datecit2'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:value-of select="$datecit1"/>
+ <xsl:apply-templates mode="iso690.mode"/>
+ <xsl:value-of select="$datecit2"/>
+</xsl:template>
+
+<!-- Extent -->
+<xsl:template name="iso690.extent">
+ <xsl:param name="extent.sep">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'extent.sep'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:apply-templates mode="iso690.mode" select="./pagenums">
+ <xsl:with-param name="sep" select="$extent.sep"/>
+ </xsl:apply-templates>
+</xsl:template>
+
+<!-- Location within host -->
+<xsl:template name="iso690.part.location">
+ <xsl:param name="location.sep">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'location.sep'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:choose>
+ <xsl:when test="./pagenums">
+ <xsl:apply-templates mode="iso690.mode" select="./bibliomisc[@role='secnum']"/>
+ <xsl:apply-templates mode="iso690.mode" select="./bibliomisc[@role='sectitle']"/>
+ <xsl:apply-templates mode="iso690.mode" select="./pagenums"/>
+ </xsl:when>
+ <xsl:when test="./bibliomisc[@role='sectitle']">
+ <xsl:apply-templates mode="iso690.mode" select="./bibliomisc[@role='secnum']"/>
+ <xsl:apply-templates mode="iso690.mode" select="./bibliomisc[@role='sectitle']">
+ <xsl:with-param name="sep" select="$location.sep"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates mode="iso690.mode" select="./bibliomisc[@role='secnum']">
+ <xsl:with-param name="sep" select="$location.sep"/>
+ </xsl:apply-templates>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="iso690.article.location">
+ <xsl:param name="location.sep">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'location.sep'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:param name="locs.sep">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'locs.sep'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:choose>
+ <xsl:when test="not(./date[@role='upd']|./date[@role='cit'])">
+ <xsl:choose>
+ <xsl:when test="./volumenum|./issuenum|./pagenums">
+ <xsl:apply-templates mode="iso690.mode" select="./pubdate[not(@role='issuing')]">
+ <xsl:with-param name="upd" select="0"/>
+ <xsl:with-param name="sep" select="$locs.sep"/>
+ </xsl:apply-templates>
+ <xsl:call-template name="iso690.location"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates mode="iso690.mode" select="./pubdate[not(@role='issuing')]">
+ <xsl:with-param name="sep" select="$location.sep"/>
+ </xsl:apply-templates>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:choose>
+ <xsl:when test="./volumenum|./issuenum|./pagenums">
+ <xsl:apply-templates mode="iso690.mode" select="./pubdate[not(@role='issuing')]">
+ <xsl:with-param name="upd" select="0"/>
+ <xsl:with-param name="sep" select="$locs.sep"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates mode="iso690.mode" select="./pubdate[not(@role='issuing')]">
+ <xsl:with-param name="upd" select="0"/>
+ <xsl:with-param name="sep" select="$location.sep"/>
+ </xsl:apply-templates>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:choose>
+ <xsl:when test="./issuenum">
+ <xsl:apply-templates mode="iso690.mode" select="./volumenum"/>
+ <xsl:apply-templates mode="iso690.mode" select="./issuenum">
+ <xsl:with-param name="sep"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates mode="iso690.mode" select="./volumenum">
+ <xsl:with-param name="sep"/>
+ </xsl:apply-templates>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:choose>
+ <xsl:when test="./pagenums">
+ <xsl:call-template name="iso690.data">
+ <xsl:with-param name="sep" select="$locs.sep"/>
+ </xsl:call-template>
+ <xsl:apply-templates mode="iso690.mode" select="./pagenums"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="iso690.data">
+ <xsl:with-param name="sep" select="$location.sep"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="iso690.location">
+ <xsl:param name="location.sep">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'location.sep'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:choose>
+ <xsl:when test="./volumenum and not(./issuenum) and not(./pagenums)">
+ <xsl:apply-templates mode="iso690.mode" select="./volumenum">
+ <xsl:with-param name="sep" select="$location.sep"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:when test="./issuenum and not(./pagenums)">
+ <xsl:apply-templates mode="iso690.mode" select="./volumenum"/>
+ <xsl:apply-templates mode="iso690.mode" select="./issuenum">
+ <xsl:with-param name="sep" select="$location.sep"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:when test="./pagenums">
+ <xsl:apply-templates mode="iso690.mode" select="./volumenum"/>
+ <xsl:apply-templates mode="iso690.mode" select="./issuenum"/>
+ <xsl:apply-templates mode="iso690.mode" select="./pagenums"/>
+ </xsl:when>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="bibliomisc[@role='secnum']|bibliomisc[@role='sectitle']" mode="iso690.mode">
+ <xsl:param name="sep">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'locs.sep'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:apply-templates mode="iso690.mode"/>
+ <xsl:call-template name="iso690.endsep">
+ <xsl:with-param name="text" select="string(.)"/>
+ <xsl:with-param name="sep" select="$sep"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="volumenum|issuenum" mode="iso690.mode">
+ <xsl:param name="sep">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'locs.sep'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:apply-templates mode="iso690.mode"/>
+ <xsl:call-template name="iso690.endsep">
+ <xsl:with-param name="text" select="string(.)"/>
+ <xsl:with-param name="sep" select="$sep"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="pagenums" mode="iso690.mode">
+ <xsl:param name="sep">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'location.sep'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:apply-templates mode="iso690.mode"/>
+ <xsl:call-template name="iso690.endsep">
+ <xsl:with-param name="text" select="string(.)"/>
+ <xsl:with-param name="sep" select="$sep"/>
+ </xsl:call-template>
+</xsl:template>
+
+<!-- Series -->
+<xsl:template name="iso690.serie">
+ <xsl:apply-templates mode="iso690.mode" select=".//bibliomisc[@role='serie']"/>
+</xsl:template>
+
+<!-- Notes -->
+<xsl:template name="iso690.notice">
+ <xsl:apply-templates mode="iso690.mode" select=".//bibliomisc[not(@role)]"/>
+</xsl:template>
+
+<xsl:template match="bibliomisc[not(@role)]|bibliomisc[@role='serie']" mode="iso690.mode">
+ <xsl:param name="notice.sep">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'notice.sep'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:apply-templates mode="iso690.mode"/>
+ <xsl:call-template name="iso690.endsep">
+ <xsl:with-param name="text" select="string(.)"/>
+ <xsl:with-param name="sep" select="$notice.sep"/>
+ </xsl:call-template>
+</xsl:template>
+
+<!-- Avaibility and access -->
+<xsl:template name="iso690.access">
+ <xsl:for-each select="./biblioid[@class='uri']|./bibliomisc[@role='access']">
+ <xsl:choose>
+ <xsl:when test="position()=1">
+ <xsl:apply-templates mode="iso690.mode" select="."/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates mode="iso690.mode" select=".">
+ <xsl:with-param name="firstacc" select="0"/>
+ </xsl:apply-templates>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:for-each>
+</xsl:template>
+
+<xsl:template match="biblioid[@class='uri']/ulink|bibliomisc[@role='access']/ulink" mode="iso690.mode">
+ <xsl:param name="link1">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'link1'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:param name="link2">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'link2'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:value-of select="$link1"/>
+ <xsl:call-template name="ulink"/>
+ <xsl:value-of select="$link2"/>
+</xsl:template>
+
+<xsl:template match="biblioid[@class='uri']|bibliomisc[@role='access']" mode="iso690.mode">
+ <xsl:param name="firstacc" select="1"/>
+ <xsl:param name="access">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'access'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:param name="acctoo">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'acctoo'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:param name="onwww">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'onwww'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:param name="oninet">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'oninet'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:param name="access.end">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'access.end'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:param name="access.sep">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'access.sep'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:choose>
+ <xsl:when test="$firstacc=1">
+ <xsl:value-of select="$access"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$acctoo"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:choose>
+ <xsl:when test="(./ulink)and(string(./ulink)=string(.))">
+ <xsl:choose>
+ <xsl:when test="(starts-with(./ulink/@url,'http://')or(starts-with(./ulink/@url,'https://')))">
+ <xsl:value-of select="$onwww"/>
+ <xsl:value-of select="$access.end"/>
+ <xsl:apply-templates mode="iso690.mode" select="./ulink"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$oninet"/>
+ <xsl:value-of select="$access.end"/>
+ <xsl:apply-templates mode="iso690.mode" select="./ulink"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:when test="(./ulink)and(string(./ulink)!=string(.))">
+ <xsl:value-of select="text()[1]"/>
+ <xsl:call-template name="iso690.endsep">
+ <xsl:with-param name="text" select="text()[1]"/>
+ <xsl:with-param name="sep" select="$access.end"/>
+ </xsl:call-template>
+ <xsl:apply-templates mode="iso690.mode" select="./ulink"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates mode="iso690.mode"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:value-of select="$access.sep"/>
+</xsl:template>
+
+<!-- Standard number - ISBN -->
+<xsl:template name="iso690.isbn">
+ <xsl:choose>
+ <xsl:when test="./biblioid/@class='isbn'">
+ <xsl:apply-templates mode="iso690.mode" select="./biblioid[@class='isbn']"/>
+ </xsl:when>
+ <xsl:when test="./isbn">
+ <xsl:apply-templates mode="iso690.mode" select="./isbn"/>
+ </xsl:when>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="isbn|biblioid[@class='isbn']" mode="iso690.mode">
+ <xsl:param name="isbn">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'isbn'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:param name="stdnum.sep">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'stdnum.sep'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:value-of select="$isbn"/>
+ <xsl:apply-templates mode="iso690.mode"/>
+ <xsl:value-of select="$stdnum.sep"/>
+</xsl:template>
+
+<!-- Standard number - ISSN -->
+<xsl:template name="iso690.issn">
+ <xsl:choose>
+ <xsl:when test="./biblioid/@class='issn'">
+ <xsl:apply-templates mode="iso690.mode" select="./biblioid[@class='issn']"/>
+ </xsl:when>
+ <xsl:when test="./issn">
+ <xsl:apply-templates mode="iso690.mode" select="./issn"/>
+ </xsl:when>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="issn|biblioid[@class='issn']" mode="iso690.mode">
+ <xsl:param name="issn">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'issn'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:param name="stdnum.sep">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'stdnum.sep'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:value-of select="$issn"/>
+ <xsl:apply-templates mode="iso690.mode"/>
+ <xsl:value-of select="$stdnum.sep"/>
+</xsl:template>
+
+<!-- Identification of patent document -->
+<xsl:template name="iso690.pat.ident">
+ <xsl:param name="patdate.sep">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'patdate.sep'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:apply-templates mode="iso690.mode" select="./address/country"/>
+ <xsl:apply-templates mode="iso690.mode" select="./bibliomisc[@role='patenttype']"/>
+ <xsl:choose>
+ <xsl:when test="./biblioid[@class='other' and @otherclass='patentnum']">
+ <xsl:apply-templates mode="iso690.mode" select="./biblioid[@class='other' and @otherclass='patentnum']"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates mode="iso690.mode" select="./bibliomisc[@role='patentnum']"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:apply-templates mode="iso690.mode" select="./pubdate[not(@role='issuing')]">
+ <xsl:with-param name="sep" select="$patdate.sep"/>
+ </xsl:apply-templates>
+</xsl:template>
+
+<!-- Country or issuing office -->
+<xsl:template match="address/country" mode="iso690.mode">
+ <xsl:param name="patcountry.sep">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'patcountry.sep'"/></xsl:call-template>
+ </xsl:param>
+ <em xmlns:xslo="http://www.w3.org/1999/XSL/Transform">
+ <xsl:apply-templates mode="iso690.mode"/>
+ </em>
+ <xsl:value-of select="$patcountry.sep"/>
+</xsl:template>
+
+<!-- Kind of patent document -->
+<xsl:template match="bibliomisc[@role='patenttype']" mode="iso690.mode">
+ <xsl:param name="pattype.sep">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'pattype.sep'"/></xsl:call-template>
+ </xsl:param>
+ <em xmlns:xslo="http://www.w3.org/1999/XSL/Transform">
+ <xsl:apply-templates mode="iso690.mode"/>
+ </em>
+ <xsl:value-of select="$pattype.sep"/>
+</xsl:template>
+
+<!-- Number -->
+<xsl:template match="biblioid[@class='other' and @otherclass='patentnum']|bibliomisc[@role='patentnum']" mode="iso690.mode">
+ <xsl:param name="patnum.sep">
+ <xsl:call-template name="gentext.template"><xsl:with-param name="context" select="'iso690'"/><xsl:with-param name="name" select="'patnum.sep'"/></xsl:call-template>
+ </xsl:param>
+ <xsl:apply-templates mode="iso690.mode"/>
+ <xsl:value-of select="$patnum.sep"/>
+</xsl:template>
+
+<!-- ==================================================================== -->
+<!-- Supplementary templates -->
+
+<xsl:template name="iso690.endsep">
+ <xsl:param name="text"/>
+ <xsl:param name="sep" select=". "/>
+ <xsl:choose>
+ <xsl:when test="substring($text,string-length($text))!=substring($sep,1,1)">
+ <xsl:value-of select="$sep"/>
+ </xsl:when>
+ <xsl:when test="substring($text,string-length($text))=' '">
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="' '"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="*" mode="iso690.mode">
+ <xsl:apply-templates select="."/><!-- try the default mode -->
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/biblio.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/biblio.xsl
new file mode 100644
index 0000000..18ee8e2
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/biblio.xsl
@@ -0,0 +1,1240 @@
+<?xml version="1.0" encoding="ASCII"?>
+<!--This file was created automatically by html2xhtml-->
+<!--from the HTML stylesheets.-->
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1999/xhtml" version="1.0">
+
+<!-- ********************************************************************
+ $Id: biblio.xsl 8421 2009-05-04 07:49:49Z bobstayton $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<!-- ==================================================================== -->
+
+<xsl:template match="bibliography">
+ <xsl:call-template name="id.warning"/>
+
+ <div>
+ <xsl:call-template name="common.html.attributes">
+ <xsl:with-param name="inherit" select="1"/>
+ </xsl:call-template>
+ <xsl:if test="$generate.id.attributes != 0">
+ <xsl:attribute name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:call-template name="bibliography.titlepage"/>
+
+ <xsl:apply-templates/>
+
+ <xsl:if test="not(parent::article)">
+ <xsl:call-template name="process.footnotes"/>
+ </xsl:if>
+ </div>
+</xsl:template>
+
+<xsl:template match="bibliography/bibliographyinfo"/>
+<xsl:template match="bibliography/info"/>
+<xsl:template match="bibliography/title"/>
+<xsl:template match="bibliography/subtitle"/>
+<xsl:template match="bibliography/titleabbrev"/>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="bibliodiv">
+ <xsl:call-template name="id.warning"/>
+
+ <div>
+ <xsl:call-template name="common.html.attributes">
+ <xsl:with-param name="inherit" select="0"/>
+ </xsl:call-template>
+ <xsl:apply-templates/>
+ </div>
+</xsl:template>
+
+<xsl:template match="bibliodiv/title">
+ <h3>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:call-template name="anchor">
+ <xsl:with-param name="node" select=".."/>
+ <xsl:with-param name="conditional" select="0"/>
+ </xsl:call-template>
+ <xsl:apply-templates/>
+ </h3>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="bibliolist">
+ <div>
+ <xsl:call-template name="common.html.attributes">
+ <xsl:with-param name="inherit" select="0"/>
+ </xsl:call-template>
+ <xsl:call-template name="anchor"/>
+ <xsl:if test="blockinfo/title|info/title|title">
+ <xsl:call-template name="formal.object.heading"/>
+ </xsl:if>
+ <xsl:apply-templates select="*[not(self::blockinfo) and not(self::info) and not(self::title) and not(self::titleabbrev) and not(self::biblioentry) and not(self::bibliomixed)]"/>
+ <xsl:apply-templates select="biblioentry|bibliomixed"/>
+ </div>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="biblioentry">
+ <xsl:param name="label">
+ <xsl:call-template name="biblioentry.label"/>
+ </xsl:param>
+
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="string(.) = ''">
+ <xsl:variable name="bib" select="document($bibliography.collection,.)"/>
+ <xsl:variable name="entry" select="$bib/bibliography// *[@id=$id or @xml:id=$id][1]"/>
+ <xsl:choose>
+ <xsl:when test="$entry">
+ <xsl:choose>
+ <xsl:when test="$bibliography.numbered != 0">
+ <xsl:apply-templates select="$entry">
+ <xsl:with-param name="label" select="$label"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="$entry"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:message>
+ <xsl:text>No bibliography entry: </xsl:text>
+ <xsl:value-of select="$id"/>
+ <xsl:text> found in </xsl:text>
+ <xsl:value-of select="$bibliography.collection"/>
+ </xsl:message>
+ <div>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:call-template name="anchor"/>
+ <p>
+ <xsl:copy-of select="$label"/>
+ <xsl:text>Error: no bibliography entry: </xsl:text>
+ <xsl:value-of select="$id"/>
+ <xsl:text> found in </xsl:text>
+ <xsl:value-of select="$bibliography.collection"/>
+ </p>
+ </div>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <div>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:call-template name="anchor">
+ <xsl:with-param name="conditional" select="0"/>
+ </xsl:call-template>
+ <p>
+ <xsl:copy-of select="$label"/>
+ <xsl:choose>
+ <xsl:when test="$bibliography.style = 'iso690'">
+ <xsl:call-template name="iso690.makecitation"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </p>
+ </div>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="bibliomixed">
+ <xsl:param name="label">
+ <xsl:call-template name="biblioentry.label"/>
+ </xsl:param>
+
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="string(.) = ''">
+ <xsl:variable name="bib" select="document($bibliography.collection,.)"/>
+ <xsl:variable name="entry" select="$bib/bibliography// *[@id=$id or @xml:id=$id][1]"/>
+ <xsl:choose>
+ <xsl:when test="$entry">
+ <xsl:choose>
+ <xsl:when test="$bibliography.numbered != 0">
+ <xsl:apply-templates select="$entry">
+ <xsl:with-param name="label" select="$label"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="$entry"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:message>
+ <xsl:text>No bibliography entry: </xsl:text>
+ <xsl:value-of select="$id"/>
+ <xsl:text> found in </xsl:text>
+ <xsl:value-of select="$bibliography.collection"/>
+ </xsl:message>
+ <div>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:call-template name="anchor"/>
+ <p>
+ <xsl:copy-of select="$label"/>
+ <xsl:text>Error: no bibliography entry: </xsl:text>
+ <xsl:value-of select="$id"/>
+ <xsl:text> found in </xsl:text>
+ <xsl:value-of select="$bibliography.collection"/>
+ </p>
+ </div>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <div>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:call-template name="anchor">
+ <xsl:with-param name="conditional" select="0"/>
+ </xsl:call-template>
+ <p>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:copy-of select="$label"/>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </p>
+ </div>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="biblioentry.label">
+ <xsl:param name="node" select="."/>
+
+ <xsl:choose>
+ <xsl:when test="$bibliography.numbered != 0">
+ <xsl:text>[</xsl:text>
+ <xsl:number from="bibliography" count="biblioentry|bibliomixed" level="any" format="1"/>
+ <xsl:text>] </xsl:text>
+ </xsl:when>
+ <xsl:when test="local-name($node/child::*[1]) = 'abbrev'">
+ <xsl:text>[</xsl:text>
+ <xsl:apply-templates select="$node/abbrev[1]"/>
+ <xsl:text>] </xsl:text>
+ </xsl:when>
+ <xsl:when test="$node/@xreflabel">
+ <xsl:text>[</xsl:text>
+ <xsl:value-of select="$node/@xreflabel"/>
+ <xsl:text>] </xsl:text>
+ </xsl:when>
+ <xsl:when test="$node/@id">
+ <xsl:text>[</xsl:text>
+ <xsl:value-of select="$node/@id"/>
+ <xsl:text>] </xsl:text>
+ </xsl:when>
+ <xsl:when test="$node/@xml:id">
+ <xsl:text>[</xsl:text>
+ <xsl:value-of select="$node/@xml:id"/>
+ <xsl:text>] </xsl:text>
+ </xsl:when>
+ <xsl:otherwise><!-- nop --></xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="*" mode="bibliography.mode">
+ <xsl:apply-templates select="."/><!-- try the default mode -->
+</xsl:template>
+
+<xsl:template match="abbrev" mode="bibliography.mode">
+ <xsl:if test="preceding-sibling::*">
+ <xsl:apply-templates mode="bibliography.mode"/>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="abstract" mode="bibliography.mode">
+ <!-- suppressed -->
+</xsl:template>
+
+<xsl:template match="address" mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:copy-of select="$biblioentry.item.separator"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="affiliation" mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:copy-of select="$biblioentry.item.separator"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="shortaffil" mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:copy-of select="$biblioentry.item.separator"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="jobtitle" mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:copy-of select="$biblioentry.item.separator"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="artheader|articleinfo|info" mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:copy-of select="$biblioentry.item.separator"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="artpagenums" mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:copy-of select="$biblioentry.item.separator"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="author" mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:call-template name="person.name"/>
+ <xsl:copy-of select="$biblioentry.item.separator"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="authorblurb|personblurb" mode="bibliography.mode">
+ <!-- suppressed -->
+</xsl:template>
+
+<xsl:template match="authorgroup" mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:call-template name="person.name.list"/>
+ <xsl:copy-of select="$biblioentry.item.separator"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="authorinitials" mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:copy-of select="$biblioentry.item.separator"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="bibliomisc" mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:copy-of select="$biblioentry.item.separator"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="bibliomset" mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:copy-of select="$biblioentry.item.separator"/>
+ </span>
+</xsl:template>
+
+<!-- ================================================== -->
+
+<xsl:template match="biblioset" mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="biblioset/title|biblioset/citetitle" mode="bibliography.mode">
+ <xsl:variable name="relation" select="../@relation"/>
+ <xsl:choose>
+ <xsl:when test="$relation='article' or @pubwork='article'">
+ <xsl:call-template name="gentext.startquote"/>
+ <xsl:apply-templates/>
+ <xsl:call-template name="gentext.endquote"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <em xmlns:xslo="http://www.w3.org/1999/XSL/Transform"><xsl:apply-templates/></em>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:copy-of select="$biblioentry.item.separator"/>
+</xsl:template>
+
+<!-- ================================================== -->
+
+<xsl:template match="bookbiblio" mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:copy-of select="$biblioentry.item.separator"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="citetitle" mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:choose>
+ <xsl:when test="@pubwork = 'article'">
+ <xsl:call-template name="gentext.startquote"/>
+ <xsl:call-template name="inline.charseq"/>
+ <xsl:call-template name="gentext.endquote"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="inline.italicseq"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:copy-of select="$biblioentry.item.separator"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="collab" mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:copy-of select="$biblioentry.item.separator"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="collabname" mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:copy-of select="$biblioentry.item.separator"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="confgroup" mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:copy-of select="$biblioentry.item.separator"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="confdates" mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:copy-of select="$biblioentry.item.separator"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="conftitle" mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:copy-of select="$biblioentry.item.separator"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="confnum" mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:copy-of select="$biblioentry.item.separator"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="confsponsor" mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:copy-of select="$biblioentry.item.separator"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="contractnum" mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:copy-of select="$biblioentry.item.separator"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="contractsponsor" mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:copy-of select="$biblioentry.item.separator"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="contrib" mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:copy-of select="$biblioentry.item.separator"/>
+ </span>
+</xsl:template>
+
+<!-- ================================================== -->
+
+<xsl:template match="copyright" mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'Copyright'"/>
+ </xsl:call-template>
+ <xsl:call-template name="gentext.space"/>
+ <xsl:call-template name="dingbat">
+ <xsl:with-param name="dingbat">copyright</xsl:with-param>
+ </xsl:call-template>
+ <xsl:call-template name="gentext.space"/>
+ <xsl:apply-templates select="year" mode="bibliography.mode"/>
+ <xsl:if test="holder">
+ <xsl:call-template name="gentext.space"/>
+ <xsl:apply-templates select="holder" mode="bibliography.mode"/>
+ </xsl:if>
+ <xsl:copy-of select="$biblioentry.item.separator"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="year" mode="bibliography.mode">
+ <xsl:apply-templates/><xsl:text>, </xsl:text>
+</xsl:template>
+
+<xsl:template match="year[position()=last()]" mode="bibliography.mode">
+ <xsl:apply-templates/>
+</xsl:template>
+
+<xsl:template match="holder" mode="bibliography.mode">
+ <xsl:apply-templates/>
+</xsl:template>
+
+<!-- ================================================== -->
+
+<xsl:template match="corpauthor" mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:copy-of select="$biblioentry.item.separator"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="corpcredit" mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:copy-of select="$biblioentry.item.separator"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="corpname" mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:copy-of select="$biblioentry.item.separator"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="date" mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:copy-of select="$biblioentry.item.separator"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="edition" mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:copy-of select="$biblioentry.item.separator"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="editor" mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:call-template name="person.name"/>
+ <xsl:copy-of select="$biblioentry.item.separator"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="firstname" mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:copy-of select="$biblioentry.item.separator"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="honorific" mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:copy-of select="$biblioentry.item.separator"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="indexterm" mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:copy-of select="$biblioentry.item.separator"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="invpartnumber" mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:copy-of select="$biblioentry.item.separator"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="isbn" mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:copy-of select="$biblioentry.item.separator"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="issn" mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:copy-of select="$biblioentry.item.separator"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="issuenum" mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:copy-of select="$biblioentry.item.separator"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="lineage" mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:copy-of select="$biblioentry.item.separator"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="orgname" mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:copy-of select="$biblioentry.item.separator"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="orgdiv" mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:copy-of select="$biblioentry.item.separator"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="othercredit" mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:copy-of select="$biblioentry.item.separator"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="othername" mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:copy-of select="$biblioentry.item.separator"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="pagenums" mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:copy-of select="$biblioentry.item.separator"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="printhistory" mode="bibliography.mode">
+ <!-- suppressed -->
+</xsl:template>
+
+<xsl:template match="productname" mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:copy-of select="$biblioentry.item.separator"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="productnumber" mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:copy-of select="$biblioentry.item.separator"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="pubdate" mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:copy-of select="$biblioentry.item.separator"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="publisher" mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="publishername" mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:copy-of select="$biblioentry.item.separator"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="pubsnumber" mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:copy-of select="$biblioentry.item.separator"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="releaseinfo" mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:copy-of select="$biblioentry.item.separator"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="revhistory" mode="bibliography.mode">
+ <!-- suppressed; how could this be represented? -->
+</xsl:template>
+
+<xsl:template match="seriesinfo" mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="seriesvolnums" mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:copy-of select="$biblioentry.item.separator"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="subtitle" mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:copy-of select="$biblioentry.item.separator"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="surname" mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:copy-of select="$biblioentry.item.separator"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="title" mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <em xmlns:xslo="http://www.w3.org/1999/XSL/Transform"><xsl:apply-templates mode="bibliography.mode"/></em>
+ <xsl:copy-of select="$biblioentry.item.separator"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="titleabbrev" mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:copy-of select="$biblioentry.item.separator"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="volumenum" mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:copy-of select="$biblioentry.item.separator"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="bibliocoverage|biblioid|bibliorelation|bibliosource" mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliography.mode"/>
+ <xsl:copy-of select="$biblioentry.item.separator"/>
+ </span>
+</xsl:template>
+
+<!-- See FR #1934434 and http://doi.org -->
+<xsl:template match="biblioid[@class='doi']" mode="bibliography.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <a href="{concat('http://dx.doi.org/', .)}">doi:<xsl:value-of select="."/></a>
+ </span>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="*" mode="bibliomixed.mode">
+ <xsl:apply-templates select="."/><!-- try the default mode -->
+</xsl:template>
+
+<xsl:template match="abbrev" mode="bibliomixed.mode">
+ <xsl:if test="preceding-sibling::*">
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="abstract" mode="bibliomixed.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="address" mode="bibliomixed.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="affiliation" mode="bibliomixed.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="shortaffil" mode="bibliomixed.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="jobtitle" mode="bibliomixed.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="artpagenums" mode="bibliomixed.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="author" mode="bibliomixed.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="authorblurb|personblurb" mode="bibliomixed.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="authorgroup" mode="bibliomixed.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="authorinitials" mode="bibliomixed.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="bibliomisc" mode="bibliomixed.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </span>
+</xsl:template>
+
+<!-- ================================================== -->
+
+<xsl:template match="bibliomset" mode="bibliomixed.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="bibliomset/title|bibliomset/citetitle" mode="bibliomixed.mode">
+ <xsl:variable name="relation" select="../@relation"/>
+ <xsl:choose>
+ <xsl:when test="$relation='article' or @pubwork='article'">
+ <xsl:call-template name="gentext.startquote"/>
+ <xsl:apply-templates/>
+ <xsl:call-template name="gentext.endquote"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <em xmlns:xslo="http://www.w3.org/1999/XSL/Transform"><xsl:apply-templates/></em>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ================================================== -->
+
+<xsl:template match="biblioset" mode="bibliomixed.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="citetitle" mode="bibliomixed.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:choose>
+ <xsl:when test="@pubwork = 'article'">
+ <xsl:call-template name="gentext.startquote"/>
+ <xsl:call-template name="inline.charseq"/>
+ <xsl:call-template name="gentext.endquote"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="inline.italicseq"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </span>
+</xsl:template>
+
+
+<xsl:template match="collab" mode="bibliomixed.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="confgroup" mode="bibliomixed.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="contractnum" mode="bibliomixed.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="contractsponsor" mode="bibliomixed.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="contrib" mode="bibliomixed.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="copyright" mode="bibliomixed.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="corpauthor" mode="bibliomixed.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="corpcredit" mode="bibliomixed.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="corpname" mode="bibliomixed.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="date" mode="bibliomixed.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="edition" mode="bibliomixed.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="editor" mode="bibliomixed.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="firstname" mode="bibliomixed.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="honorific" mode="bibliomixed.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="indexterm" mode="bibliomixed.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="invpartnumber" mode="bibliomixed.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="isbn" mode="bibliomixed.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="issn" mode="bibliomixed.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="issuenum" mode="bibliomixed.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="lineage" mode="bibliomixed.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="orgname" mode="bibliomixed.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="othercredit" mode="bibliomixed.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="othername" mode="bibliomixed.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="pagenums" mode="bibliomixed.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="printhistory" mode="bibliomixed.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="productname" mode="bibliomixed.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="productnumber" mode="bibliomixed.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="pubdate" mode="bibliomixed.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="publisher" mode="bibliomixed.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="publishername" mode="bibliomixed.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="pubsnumber" mode="bibliomixed.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="releaseinfo" mode="bibliomixed.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="revhistory" mode="bibliomixed.mode">
+ <!-- suppressed; how could this be represented? -->
+</xsl:template>
+
+<xsl:template match="seriesvolnums" mode="bibliomixed.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="subtitle" mode="bibliomixed.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="surname" mode="bibliomixed.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="title" mode="bibliomixed.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="titleabbrev" mode="bibliomixed.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="volumenum" mode="bibliomixed.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="bibliocoverage|biblioid|bibliorelation|bibliosource" mode="bibliomixed.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates mode="bibliomixed.mode"/>
+ </span>
+</xsl:template>
+
+<!-- See FR #1934434 and http://doi.org -->
+<xsl:template match="biblioid[@class='doi']" mode="bibliomixed.mode">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <a href="{concat('http://dx.doi.org/', .)}">doi:<xsl:value-of select="."/></a>
+ </span>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/block.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/block.xsl
new file mode 100644
index 0000000..125b784
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/block.xsl
@@ -0,0 +1,535 @@
+<?xml version="1.0" encoding="ASCII"?>
+<!--This file was created automatically by html2xhtml-->
+<!--from the HTML stylesheets.-->
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1999/xhtml" version="1.0">
+
+<!-- ********************************************************************
+ $Id: block.xsl 8831 2010-08-13 17:08:49Z mzjn $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<!-- ==================================================================== -->
+<!-- What should we do about styling blockinfo? -->
+
+<xsl:template match="blockinfo|info">
+ <!-- suppress -->
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template name="block.object">
+ <div>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:call-template name="anchor"/>
+ <xsl:apply-templates/>
+ </div>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="para">
+ <xsl:call-template name="paragraph">
+ <xsl:with-param name="class">
+ <xsl:if test="@role and $para.propagates.style != 0">
+ <xsl:value-of select="@role"/>
+ </xsl:if>
+ </xsl:with-param>
+ <xsl:with-param name="content">
+ <xsl:if test="position() = 1 and parent::listitem">
+ <xsl:call-template name="anchor">
+ <xsl:with-param name="node" select="parent::listitem"/>
+ </xsl:call-template>
+ </xsl:if>
+
+ <xsl:call-template name="anchor"/>
+ <xsl:apply-templates/>
+ </xsl:with-param>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template name="paragraph">
+ <xsl:param name="class" select="''"/>
+ <xsl:param name="content"/>
+
+ <xsl:variable name="p">
+ <p>
+ <xsl:choose>
+ <xsl:when test="$class != ''">
+ <xsl:call-template name="common.html.attributes">
+ <xsl:with-param name="class" select="$class"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="locale.html.attributes"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:copy-of select="$content"/>
+ </p>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="$html.cleanup != 0">
+ <xsl:call-template name="unwrap.p">
+ <xsl:with-param name="p" select="$p"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:copy-of select="$p"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="simpara">
+ <!-- see also listitem/simpara in lists.xsl -->
+ <p>
+ <xsl:call-template name="locale.html.attributes"/>
+ <xsl:if test="@role and $para.propagates.style != 0">
+ <xsl:apply-templates select="." mode="class.attribute">
+ <xsl:with-param name="class" select="@role"/>
+ </xsl:apply-templates>
+ </xsl:if>
+
+ <xsl:call-template name="anchor"/>
+ <xsl:apply-templates/>
+ </p>
+</xsl:template>
+
+<xsl:template match="formalpara">
+ <xsl:call-template name="paragraph">
+ <xsl:with-param name="class">
+ <xsl:if test="@role and $para.propagates.style != 0">
+ <xsl:value-of select="@role"/>
+ </xsl:if>
+ </xsl:with-param>
+ <xsl:with-param name="content">
+ <xsl:call-template name="anchor"/>
+ <xsl:apply-templates/>
+ </xsl:with-param>
+ </xsl:call-template>
+</xsl:template>
+
+<!-- Only use title from info -->
+<xsl:template match="formalpara/info">
+ <xsl:apply-templates select="title"/>
+</xsl:template>
+
+<xsl:template match="formalpara/title|formalpara/info/title">
+ <xsl:variable name="titleStr">
+ <xsl:apply-templates/>
+ </xsl:variable>
+ <xsl:variable name="lastChar">
+ <xsl:if test="$titleStr != ''">
+ <xsl:value-of select="substring($titleStr,string-length($titleStr),1)"/>
+ </xsl:if>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="$make.clean.html != 0">
+ <span class="formalpara-title">
+ <xsl:copy-of select="$titleStr"/>
+ <xsl:if test="$lastChar != '' and not(contains($runinhead.title.end.punct, $lastChar))">
+ <xsl:value-of select="$runinhead.default.title.end.punct"/>
+ </xsl:if>
+ <xsl:text>&#160;</xsl:text>
+ </span>
+ </xsl:when>
+ <xsl:otherwise>
+ <strong xmlns:xslo="http://www.w3.org/1999/XSL/Transform">
+ <xsl:copy-of select="$titleStr"/>
+ <xsl:if test="$lastChar != '' and not(contains($runinhead.title.end.punct, $lastChar))">
+ <xsl:value-of select="$runinhead.default.title.end.punct"/>
+ </xsl:if>
+ <xsl:text>&#160;</xsl:text>
+ </strong>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="formalpara/para">
+ <xsl:apply-templates/>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="blockquote">
+ <div>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:call-template name="anchor"/>
+
+ <xsl:choose>
+ <xsl:when test="attribution">
+ <table border="0" width="100%" cellspacing="0" cellpadding="0" class="blockquote" summary="Block quote">
+ <tr>
+ <td width="10%" valign="top">&#160;</td>
+ <td width="80%" valign="top">
+ <xsl:apply-templates select="child::*[local-name(.)!='attribution']"/>
+ </td>
+ <td width="10%" valign="top">&#160;</td>
+ </tr>
+ <tr>
+ <td width="10%" valign="top">&#160;</td>
+ <td colspan="2" align="{$direction.align.end}" valign="top">
+ <xsl:text>--</xsl:text>
+ <xsl:apply-templates select="attribution"/>
+ </td>
+ </tr>
+ </table>
+ </xsl:when>
+ <xsl:otherwise>
+ <blockquote>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates/>
+ </blockquote>
+ </xsl:otherwise>
+ </xsl:choose>
+ </div>
+</xsl:template>
+
+<xsl:template match="blockquote/title|blockquote/info/title">
+ <xsl:choose>
+ <xsl:when test="$make.clean.html != 0">
+ <div class="blockquote-title">
+ <xsl:apply-templates/>
+ </div>
+ </xsl:when>
+ <xsl:otherwise>
+ <div class="blockquote-title">
+ <p>
+ <strong xmlns:xslo="http://www.w3.org/1999/XSL/Transform">
+ <xsl:apply-templates/>
+ </strong>
+ </p>
+ </div>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- Use an em dash per Chicago Manual of Style and https://sourceforge.net/tracker/index.php?func=detail&aid=2793878&group_id=21935&atid=373747 -->
+<xsl:template match="epigraph">
+ <div>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates select="para|simpara|formalpara|literallayout"/>
+ <xsl:if test="attribution">
+ <div class="attribution">
+ <span>&#8212;<xsl:apply-templates select="attribution"/></span>
+ </div>
+ </xsl:if>
+ </div>
+</xsl:template>
+
+<xsl:template match="attribution">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates/>
+ </span>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="abstract|sidebar">
+ <div>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:call-template name="anchor"/>
+ <xsl:call-template name="sidebar.titlepage"/>
+ <xsl:apply-templates/>
+ </div>
+</xsl:template>
+
+<xsl:template match="abstract/title|sidebar/title">
+</xsl:template>
+
+<xsl:template match="sidebar/sidebarinfo|sidebar/info"/>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="msgset">
+ <xsl:apply-templates/>
+</xsl:template>
+
+<xsl:template match="msgentry">
+ <xsl:call-template name="block.object"/>
+</xsl:template>
+
+<xsl:template match="simplemsgentry">
+ <xsl:call-template name="block.object"/>
+</xsl:template>
+
+<xsl:template match="msg">
+ <xsl:call-template name="block.object"/>
+</xsl:template>
+
+<xsl:template match="msgmain">
+ <xsl:apply-templates/>
+</xsl:template>
+
+<xsl:template match="msgmain/title">
+ <xsl:choose>
+ <xsl:when test="$make.clean.html != 0">
+ <span class="msgmain-title">
+ <xsl:apply-templates/>
+ </span>
+ </xsl:when>
+ <xsl:otherwise>
+ <strong xmlns:xslo="http://www.w3.org/1999/XSL/Transform"><xsl:apply-templates/></strong>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="msgsub">
+ <xsl:apply-templates/>
+</xsl:template>
+
+<xsl:template match="msgsub/title">
+ <xsl:choose>
+ <xsl:when test="$make.clean.html != 0">
+ <span class="msgsub-title">
+ <xsl:apply-templates/>
+ </span>
+ </xsl:when>
+ <xsl:otherwise>
+ <strong xmlns:xslo="http://www.w3.org/1999/XSL/Transform"><xsl:apply-templates/></strong>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="msgrel">
+ <xsl:apply-templates/>
+</xsl:template>
+
+<xsl:template match="msgrel/title">
+ <xsl:choose>
+ <xsl:when test="$make.clean.html != 0">
+ <span class="msgrel-title">
+ <xsl:apply-templates/>
+ </span>
+ </xsl:when>
+ <xsl:otherwise>
+ <strong xmlns:xslo="http://www.w3.org/1999/XSL/Transform"><xsl:apply-templates/></strong>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="msgtext">
+ <xsl:apply-templates/>
+</xsl:template>
+
+<xsl:template match="msginfo">
+ <xsl:call-template name="block.object"/>
+</xsl:template>
+
+<xsl:template match="msglevel">
+ <xsl:choose>
+ <xsl:when test="$make.clean.html != 0">
+ <div class="msglevel">
+ <span class="msglevel-title">
+ <xsl:call-template name="gentext.template">
+ <xsl:with-param name="context" select="'msgset'"/>
+ <xsl:with-param name="name" select="'MsgLevel'"/>
+ </xsl:call-template>
+ </span>
+ <xsl:apply-templates/>
+ </div>
+ </xsl:when>
+ <xsl:otherwise>
+ <p>
+ <strong xmlns:xslo="http://www.w3.org/1999/XSL/Transform">
+ <xsl:call-template name="gentext.template">
+ <xsl:with-param name="context" select="'msgset'"/>
+ <xsl:with-param name="name" select="'MsgLevel'"/>
+ </xsl:call-template>
+ </strong>
+ <xsl:apply-templates/>
+ </p>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="msgorig">
+ <xsl:choose>
+ <xsl:when test="$make.clean.html != 0">
+ <div class="msgorig">
+ <span class="msgorig-title">
+ <xsl:call-template name="gentext.template">
+ <xsl:with-param name="context" select="'msgset'"/>
+ <xsl:with-param name="name" select="'MsgOrig'"/>
+ </xsl:call-template>
+ </span>
+ <xsl:apply-templates/>
+ </div>
+ </xsl:when>
+ <xsl:otherwise>
+ <p>
+ <strong xmlns:xslo="http://www.w3.org/1999/XSL/Transform">
+ <xsl:call-template name="gentext.template">
+ <xsl:with-param name="context" select="'msgset'"/>
+ <xsl:with-param name="name" select="'MsgOrig'"/>
+ </xsl:call-template>
+ </strong>
+ <xsl:apply-templates/>
+ </p>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="msgaud">
+ <xsl:choose>
+ <xsl:when test="$make.clean.html != 0">
+ <div class="msgaud">
+ <span class="msgaud-title">
+ <xsl:call-template name="gentext.template">
+ <xsl:with-param name="context" select="'msgset'"/>
+ <xsl:with-param name="name" select="'MsgAud'"/>
+ </xsl:call-template>
+ </span>
+ <xsl:apply-templates/>
+ </div>
+ </xsl:when>
+ <xsl:otherwise>
+ <p>
+ <strong xmlns:xslo="http://www.w3.org/1999/XSL/Transform">
+ <xsl:call-template name="gentext.template">
+ <xsl:with-param name="context" select="'msgset'"/>
+ <xsl:with-param name="name" select="'MsgAud'"/>
+ </xsl:call-template>
+ </strong>
+ <xsl:apply-templates/>
+ </p>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="msgexplan">
+ <xsl:call-template name="block.object"/>
+</xsl:template>
+
+<xsl:template match="msgexplan/title">
+ <xsl:choose>
+ <xsl:when test="$make.clean.html != 0">
+ <div class="msgexplan">
+ <span class="msgexplan-title">
+ <xsl:apply-templates/>
+ </span>
+ </div>
+ </xsl:when>
+ <xsl:otherwise>
+ <p>
+ <strong xmlns:xslo="http://www.w3.org/1999/XSL/Transform">
+ <xsl:apply-templates/>
+ </strong>
+ </p>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="revhistory">
+ <div>
+ <xsl:call-template name="common.html.attributes"/>
+ <table border="0" width="100%" summary="Revision history">
+ <tr>
+ <th align="{$direction.align.start}" valign="top" colspan="3">
+ <strong xmlns:xslo="http://www.w3.org/1999/XSL/Transform">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'RevHistory'"/>
+ </xsl:call-template>
+ </strong>
+ </th>
+ </tr>
+ <xsl:apply-templates/>
+ </table>
+ </div>
+</xsl:template>
+
+<xsl:template match="revhistory/revision">
+ <xsl:variable name="revnumber" select="revnumber"/>
+ <xsl:variable name="revdate" select="date"/>
+ <xsl:variable name="revauthor" select="authorinitials|author"/>
+ <xsl:variable name="revremark" select="revremark|revdescription"/>
+ <tr>
+ <td align="{$direction.align.start}">
+ <xsl:if test="$revnumber">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'Revision'"/>
+ </xsl:call-template>
+ <xsl:call-template name="gentext.space"/>
+ <xsl:apply-templates select="$revnumber"/>
+ </xsl:if>
+ </td>
+ <td align="{$direction.align.start}">
+ <xsl:apply-templates select="$revdate"/>
+ </td>
+ <xsl:choose>
+ <xsl:when test="count($revauthor)=0">
+ <td align="{$direction.align.start}">
+ <xsl:call-template name="dingbat">
+ <xsl:with-param name="dingbat">nbsp</xsl:with-param>
+ </xsl:call-template>
+ </td>
+ </xsl:when>
+ <xsl:otherwise>
+ <td align="{$direction.align.start}">
+ <xsl:for-each select="$revauthor">
+ <xsl:apply-templates select="."/>
+ <xsl:if test="position() != last()">
+ <xsl:text>, </xsl:text>
+ </xsl:if>
+ </xsl:for-each>
+ </td>
+ </xsl:otherwise>
+ </xsl:choose>
+ </tr>
+ <xsl:if test="$revremark">
+ <tr>
+ <td align="{$direction.align.start}" colspan="3">
+ <xsl:apply-templates select="$revremark"/>
+ </td>
+ </tr>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="revision/revnumber">
+ <xsl:apply-templates/>
+</xsl:template>
+
+<xsl:template match="revision/date">
+ <xsl:apply-templates/>
+</xsl:template>
+
+<xsl:template match="revision/authorinitials">
+ <xsl:text>, </xsl:text>
+ <xsl:apply-templates/>
+</xsl:template>
+
+<xsl:template match="revision/authorinitials[1]" priority="2">
+ <xsl:apply-templates/>
+</xsl:template>
+
+<xsl:template match="revision/revremark">
+ <xsl:apply-templates/>
+</xsl:template>
+
+<xsl:template match="revision/revdescription">
+ <xsl:apply-templates/>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="ackno|acknowledgements[parent::article]">
+ <xsl:call-template name="block.object"/>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="highlights">
+ <xsl:call-template name="block.object"/>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/callout.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/callout.xsl
new file mode 100644
index 0000000..beb162e
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/callout.xsl
@@ -0,0 +1,188 @@
+<?xml version="1.0" encoding="ASCII"?>
+<!--This file was created automatically by html2xhtml-->
+<!--from the HTML stylesheets.-->
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:sverb="http://nwalsh.com/xslt/ext/com.nwalsh.saxon.Verbatim" xmlns:xverb="xalan://com.nwalsh.xalan.Verbatim" xmlns:lxslt="http://xml.apache.org/xslt" xmlns="http://www.w3.org/1999/xhtml" exclude-result-prefixes="sverb xverb lxslt" version="1.0">
+
+<!-- ********************************************************************
+ $Id: callout.xsl 8421 2009-05-04 07:49:49Z bobstayton $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<lxslt:component prefix="xverb" functions="insertCallouts"/>
+
+<xsl:template match="programlistingco|screenco">
+ <xsl:variable name="verbatim" select="programlisting|screen"/>
+
+ <xsl:choose>
+ <xsl:when test="$use.extensions != '0' and $callouts.extension != '0'">
+ <xsl:variable name="rtf">
+ <xsl:apply-templates select="$verbatim">
+ <xsl:with-param name="suppress-numbers" select="'1'"/>
+ </xsl:apply-templates>
+ </xsl:variable>
+
+ <xsl:variable name="rtf-with-callouts">
+ <xsl:choose>
+ <xsl:when test="function-available('sverb:insertCallouts')">
+ <xsl:copy-of select="sverb:insertCallouts(areaspec,$rtf)"/>
+ </xsl:when>
+ <xsl:when test="function-available('xverb:insertCallouts')">
+ <xsl:copy-of select="xverb:insertCallouts(areaspec,$rtf)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:message terminate="yes">
+ <xsl:text>No insertCallouts function is available.</xsl:text>
+ </xsl:message>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="$verbatim/@linenumbering = 'numbered' and $linenumbering.extension != '0'">
+ <div>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:call-template name="number.rtf.lines">
+ <xsl:with-param name="rtf" select="$rtf-with-callouts"/>
+ <xsl:with-param name="pi.context" select="programlisting|screen"/>
+ </xsl:call-template>
+ <xsl:apply-templates select="calloutlist"/>
+ </div>
+ </xsl:when>
+ <xsl:otherwise>
+ <div>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:copy-of select="$rtf-with-callouts"/>
+ <xsl:apply-templates select="calloutlist"/>
+ </div>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <div>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates/>
+ </div>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="areaspec|areaset|area">
+</xsl:template>
+
+<xsl:template match="areaset" mode="conumber">
+ <xsl:number count="area|areaset" format="1"/>
+</xsl:template>
+
+<xsl:template match="area" mode="conumber">
+ <xsl:number count="area|areaset" format="1"/>
+</xsl:template>
+
+<xsl:template match="co" name="co">
+ <!-- Support a single linkend in HTML -->
+ <xsl:variable name="targets" select="key('id', @linkends)"/>
+ <xsl:variable name="target" select="$targets[1]"/>
+ <xsl:choose>
+ <xsl:when test="$target">
+ <a>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:if test="@id or @xml:id">
+ <xsl:attribute name="id">
+ <xsl:value-of select="(@id|@xml:id)[1]"/>
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:attribute name="href">
+ <xsl:call-template name="href.target">
+ <xsl:with-param name="object" select="$target"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:apply-templates select="." mode="callout-bug"/>
+ </a>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="anchor"/>
+ <xsl:apply-templates select="." mode="callout-bug"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="coref">
+ <!-- tricky; this relies on the fact that we can process the "co" that's -->
+ <!-- "over there" as if it were "right here" -->
+
+ <xsl:variable name="co" select="key('id', @linkend)"/>
+ <xsl:choose>
+ <xsl:when test="not($co)">
+ <xsl:message>
+ <xsl:text>Error: coref link is broken: </xsl:text>
+ <xsl:value-of select="@linkend"/>
+ </xsl:message>
+ </xsl:when>
+ <xsl:when test="local-name($co) != 'co'">
+ <xsl:message>
+ <xsl:text>Error: coref doesn't point to a co: </xsl:text>
+ <xsl:value-of select="@linkend"/>
+ </xsl:message>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="$co"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="co" mode="callout-bug">
+ <xsl:call-template name="callout-bug">
+ <xsl:with-param name="conum">
+ <xsl:number count="co" level="any" from="programlisting|screen|literallayout|synopsis" format="1"/>
+ </xsl:with-param>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template name="callout-bug">
+ <xsl:param name="conum" select="1"/>
+
+ <xsl:choose>
+ <xsl:when test="$callout.graphics != 0 and $conum &lt;= $callout.graphics.number.limit">
+ <img src="{$callout.graphics.path}{$conum}{$callout.graphics.extension}" alt="{$conum}" border="0"/>
+ </xsl:when>
+ <xsl:when test="$callout.unicode != 0 and $conum &lt;= $callout.unicode.number.limit">
+ <xsl:choose>
+ <xsl:when test="$callout.unicode.start.character = 10102">
+ <xsl:choose>
+ <xsl:when test="$conum = 1">&#10102;</xsl:when>
+ <xsl:when test="$conum = 2">&#10103;</xsl:when>
+ <xsl:when test="$conum = 3">&#10104;</xsl:when>
+ <xsl:when test="$conum = 4">&#10105;</xsl:when>
+ <xsl:when test="$conum = 5">&#10106;</xsl:when>
+ <xsl:when test="$conum = 6">&#10107;</xsl:when>
+ <xsl:when test="$conum = 7">&#10108;</xsl:when>
+ <xsl:when test="$conum = 8">&#10109;</xsl:when>
+ <xsl:when test="$conum = 9">&#10110;</xsl:when>
+ <xsl:when test="$conum = 10">&#10111;</xsl:when>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:message>
+ <xsl:text>Don't know how to generate Unicode callouts </xsl:text>
+ <xsl:text>when $callout.unicode.start.character is </xsl:text>
+ <xsl:value-of select="$callout.unicode.start.character"/>
+ </xsl:message>
+ <xsl:text>(</xsl:text>
+ <xsl:value-of select="$conum"/>
+ <xsl:text>)</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text>(</xsl:text>
+ <xsl:value-of select="$conum"/>
+ <xsl:text>)</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/changebars.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/changebars.xsl
new file mode 100644
index 0000000..2e70e0e
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/changebars.xsl
@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="ASCII"?>
+<!--This file was created automatically by html2xhtml-->
+<!--from the HTML stylesheets.-->
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1999/xhtml" version="1.0">
+
+<!-- ********************************************************************
+ $Id: changebars.xsl 8128 2008-09-29 17:16:10Z mzjn $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<!-- ==================================================================== -->
+<xsl:import href="docbook.xsl"/>
+
+<xsl:param name="show.revisionflag" select="'1'"/>
+
+<xsl:template name="system.head.content">
+<xsl:param name="node" select="."/>
+
+<style type="text/css">
+<xsl:text>
+div.added { background-color: #ffff99;
+ text-decoration: underline; }
+div.deleted { text-decoration: line-through;
+ background-color: #FF7F7F; }
+div.changed { background-color: #99ff99; }
+div.off { }
+
+span.added { background-color: #ffff99;
+ text-decoration: underline; }
+span.deleted { text-decoration: line-through;
+ background-color: #FF7F7F; }
+span.changed { background-color: #99ff99; }
+span.off { }
+</xsl:text>
+</style>
+</xsl:template>
+
+<xsl:template match="*[@revisionflag]">
+ <xsl:call-template name="block.or.inline.revision"/>
+</xsl:template>
+
+<xsl:template name="block.or.inline.revision">
+ <xsl:param name="revisionflag" select="@revisionflag"/>
+
+ <xsl:choose>
+ <xsl:when test="local-name(.) = 'para' or local-name(.) = 'formalpara' or local-name(.) = 'simpara' or local-name(.) = 'simplesect' or local-name(.) = 'section' or local-name(.) = 'sect1' or local-name(.) = 'sect2' or local-name(.) = 'sect3' or local-name(.) = 'sect4' or local-name(.) = 'sect5' or local-name(.) = 'chapter' or local-name(.) = 'preface' or local-name(.) = 'itemizedlist' or local-name(.) = 'orderedlist' or local-name(.) = 'variablelist' or local-name(.) = 'varlistentry' or local-name(.) = 'informaltable' or local-name(.) = 'informalexample' or local-name(.) = 'note' or local-name(.) = 'example' or local-name(.) = 'mediaobject' or local-name(.) = 'sidebar' or local-name(.) = 'glossary' or local-name(.) = 'glossentry' or local-name(.) = 'bibliography' or local-name(.) = 'index' or local-name(.) = 'appendix'">
+ <div class="{$revisionflag}">
+ <xsl:apply-imports/>
+ </div>
+ </xsl:when>
+ <xsl:when test="local-name(.) = 'phrase' or local-name(.) = 'ulink' or local-name(.) = 'link' or local-name(.) = 'olink' or local-name(.) = 'inlinemediaobject' or local-name(.) = 'filename' or local-name(.) = 'literal' or local-name(.) = 'member' or local-name(.) = 'term' or local-name(.) = 'guilabel' or local-name(.) = 'glossterm' or local-name(.) = 'sgmltag' or local-name(.) = 'tag' or local-name(.) = 'quote' or local-name(.) = 'emphasis' or local-name(.) = 'command' or local-name(.) = 'xref'">
+ <span class="{$revisionflag}">
+ <xsl:apply-imports/>
+ </span>
+ </xsl:when>
+ <xsl:when test="local-name(.) = 'listitem' or local-name(.) = 'entry' or local-name(.) = 'title'">
+ <!-- nop; these are handled directly in the stylesheet -->
+ <xsl:apply-imports/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:message>
+ <xsl:text>Revisionflag on unexpected element: </xsl:text>
+ <xsl:value-of select="local-name(.)"/>
+ <xsl:text> (Assuming block)</xsl:text>
+ </xsl:message>
+ <div class="{$revisionflag}">
+ <xsl:apply-imports/>
+ </div>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/chunk-changebars.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/chunk-changebars.xsl
new file mode 100644
index 0000000..7c0e81a
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/chunk-changebars.xsl
@@ -0,0 +1,96 @@
+<?xml version="1.0" encoding="ASCII"?>
+<!--This file was created automatically by html2xhtml-->
+<!--from the HTML stylesheets.-->
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:exsl="http://exslt.org/common" xmlns:cf="http://docbook.sourceforge.net/xmlns/chunkfast/1.0" xmlns="http://www.w3.org/1999/xhtml" version="1.0" exclude-result-prefixes="exsl cf">
+
+<!-- ********************************************************************
+ $Id: chunk-changebars.xsl 8399 2009-04-08 07:37:42Z bobstayton $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<!-- ==================================================================== -->
+
+<!-- This file is a variant of chunk.xsl, to be used for generating chunked
+ output with highlighting based on change markup. -->
+
+<xsl:import href="changebars.xsl"/>
+<xsl:import href="chunk-common.xsl"/>
+
+<!-- This customization of "process-chunk-element" is needed in order to make change
+ highlighting be inherited by chunked children of an element with change markup. -->
+<xsl:template name="process-chunk-element">
+ <xsl:param name="content">
+ <xsl:choose>
+
+ <xsl:when test="ancestor-or-self::*[@revisionflag] and $show.revisionflag != 0">
+ <xsl:variable name="revisionflag" select="ancestor-or-self::*[@revisionflag][1]/@revisionflag"/>
+ <xsl:call-template name="block.or.inline.revision">
+ <xsl:with-param name="revisionflag" select="$revisionflag"/>
+ </xsl:call-template>
+ </xsl:when>
+
+ <xsl:otherwise>
+ <xsl:apply-imports/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:param>
+
+ <xsl:choose>
+ <xsl:when test="$chunk.fast != 0 and $exsl.node.set.available != 0">
+ <xsl:variable name="chunks" select="exsl:node-set($chunk.hierarchy)//cf:div"/>
+ <xsl:variable name="genid" select="generate-id()"/>
+
+ <xsl:variable name="div" select="$chunks[@id=$genid or @xml:id=$genid]"/>
+
+ <xsl:variable name="prevdiv" select="($div/preceding-sibling::cf:div|$div/preceding::cf:div|$div/parent::cf:div)[last()]"/>
+ <xsl:variable name="prev" select="key('genid', ($prevdiv/@id|$prevdiv/@xml:id)[1])"/>
+
+ <xsl:variable name="nextdiv" select="($div/following-sibling::cf:div|$div/following::cf:div|$div/cf:div)[1]"/>
+ <xsl:variable name="next" select="key('genid', ($nextdiv/@id|$nextdiv/@xml:id)[1])"/>
+
+ <xsl:choose>
+ <xsl:when test="$onechunk != 0 and parent::*">
+ <xsl:copy-of select="$content"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="process-chunk">
+ <xsl:with-param name="prev" select="$prev"/>
+ <xsl:with-param name="next" select="$next"/>
+ <xsl:with-param name="content" select="$content"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:choose>
+ <xsl:when test="$onechunk != 0 and not(parent::*)">
+ <xsl:call-template name="chunk-all-sections">
+ <xsl:with-param name="content" select="$content"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="$onechunk != 0">
+ <xsl:copy-of select="$content"/>
+ </xsl:when>
+ <xsl:when test="$chunk.first.sections = 0">
+ <xsl:call-template name="chunk-first-section-with-parent">
+ <xsl:with-param name="content" select="$content"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="chunk-all-sections">
+ <xsl:with-param name="content" select="$content"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:include href="chunk-code.xsl"/>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/chunk-code.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/chunk-code.xsl
new file mode 100644
index 0000000..4682df5
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/chunk-code.xsl
@@ -0,0 +1,645 @@
+<?xml version="1.0" encoding="ASCII"?>
+<!--This file was created automatically by html2xhtml-->
+<!--from the HTML stylesheets.-->
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:exsl="http://exslt.org/common" xmlns:cf="http://docbook.sourceforge.net/xmlns/chunkfast/1.0" xmlns:ng="http://docbook.org/docbook-ng" xmlns:db="http://docbook.org/ns/docbook" xmlns="http://www.w3.org/1999/xhtml" exclude-result-prefixes="exsl cf ng db" version="1.0">
+
+<!-- ********************************************************************
+ $Id: chunk-code.xsl 8596 2010-03-20 04:36:45Z bobstayton $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<!-- ==================================================================== -->
+
+
+<xsl:template match="*" mode="chunk-filename">
+ <!-- returns the filename of a chunk -->
+ <xsl:variable name="ischunk">
+ <xsl:call-template name="chunk"/>
+ </xsl:variable>
+
+ <xsl:variable name="fn">
+ <xsl:apply-templates select="." mode="recursive-chunk-filename"/>
+ </xsl:variable>
+
+ <!--
+ <xsl:message>
+ <xsl:value-of select="$ischunk"/>
+ <xsl:text> (</xsl:text>
+ <xsl:value-of select="local-name(.)"/>
+ <xsl:text>) </xsl:text>
+ <xsl:value-of select="$fn"/>
+ <xsl:text>, </xsl:text>
+ <xsl:call-template name="dbhtml-dir"/>
+ </xsl:message>
+ -->
+
+ <!-- 2003-11-25 by ndw:
+ The following test used to read test="$ischunk != 0 and $fn != ''"
+ I've removed the ischunk part of the test so that href.to.uri and
+ href.from.uri will be fully qualified even if the source or target
+ isn't a chunk. I *think* that if $fn != '' then it's appropriate
+ to put the directory on the front, even if the element isn't a
+ chunk. I could be wrong. -->
+
+ <xsl:if test="$fn != ''">
+ <xsl:call-template name="dbhtml-dir"/>
+ </xsl:if>
+
+ <xsl:value-of select="$fn"/>
+ <!-- You can't add the html.ext here because dbhtml filename= may already -->
+ <!-- have added it. It really does have to be handled in the recursive template -->
+</xsl:template>
+
+<xsl:template match="*" mode="recursive-chunk-filename">
+ <xsl:param name="recursive" select="false()"/>
+
+ <!-- returns the filename of a chunk -->
+ <xsl:variable name="ischunk">
+ <xsl:call-template name="chunk"/>
+ </xsl:variable>
+
+ <xsl:variable name="dbhtml-filename">
+ <xsl:call-template name="pi.dbhtml_filename"/>
+ </xsl:variable>
+
+ <xsl:variable name="filename">
+ <xsl:choose>
+ <xsl:when test="$dbhtml-filename != ''">
+ <xsl:value-of select="$dbhtml-filename"/>
+ </xsl:when>
+ <!-- if this is the root element, use the root.filename -->
+ <xsl:when test="not(parent::*) and $root.filename != ''">
+ <xsl:value-of select="$root.filename"/>
+ <xsl:value-of select="$html.ext"/>
+ </xsl:when>
+ <!-- Special case -->
+ <xsl:when test="self::legalnotice and not($generate.legalnotice.link = 0)">
+ <xsl:choose>
+ <xsl:when test="(@id or @xml:id) and not($use.id.as.filename = 0)">
+ <!-- * if this legalnotice has an ID, then go ahead and use -->
+ <!-- * just the value of that ID as the basename for the file -->
+ <!-- * (that is, without prepending an "ln-" too it) -->
+ <xsl:value-of select="(@id|@xml:id)[1]"/>
+ <xsl:value-of select="$html.ext"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <!-- * otherwise, if this legalnotice does not have an ID, -->
+ <!-- * then we generate an ID... -->
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+ <!-- * ...and then we take that generated ID, prepend an -->
+ <!-- * "ln-" to it, and use that as the basename for the file -->
+ <xsl:value-of select="concat('ln-',$id,$html.ext)"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <!-- if there's no dbhtml filename, and if we're to use IDs as -->
+ <!-- filenames, then use the ID to generate the filename. -->
+ <xsl:when test="(@id or @xml:id) and $use.id.as.filename != 0">
+ <xsl:value-of select="(@id|@xml:id)[1]"/>
+ <xsl:value-of select="$html.ext"/>
+ </xsl:when>
+ <xsl:otherwise/>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="$ischunk='0'">
+ <!-- if called on something that isn't a chunk, walk up... -->
+ <xsl:choose>
+ <xsl:when test="count(parent::*)&gt;0">
+ <xsl:apply-templates mode="recursive-chunk-filename" select="parent::*">
+ <xsl:with-param name="recursive" select="$recursive"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <!-- unless there is no up, in which case return "" -->
+ <xsl:otherwise/>
+ </xsl:choose>
+ </xsl:when>
+
+ <xsl:when test="not($recursive) and $filename != ''">
+ <!-- if this chunk has an explicit name, use it -->
+ <xsl:value-of select="$filename"/>
+ </xsl:when>
+
+ <xsl:when test="self::set">
+ <xsl:value-of select="$root.filename"/>
+ <xsl:if test="not($recursive)">
+ <xsl:value-of select="$html.ext"/>
+ </xsl:if>
+ </xsl:when>
+
+ <xsl:when test="self::book">
+ <xsl:text>bk</xsl:text>
+ <xsl:number level="any" format="01"/>
+ <xsl:if test="not($recursive)">
+ <xsl:value-of select="$html.ext"/>
+ </xsl:if>
+ </xsl:when>
+
+ <xsl:when test="self::article">
+ <xsl:if test="/set">
+ <!-- in a set, make sure we inherit the right book info... -->
+ <xsl:apply-templates mode="recursive-chunk-filename" select="parent::*">
+ <xsl:with-param name="recursive" select="true()"/>
+ </xsl:apply-templates>
+ </xsl:if>
+
+ <xsl:text>ar</xsl:text>
+ <xsl:number level="any" format="01" from="book"/>
+ <xsl:if test="not($recursive)">
+ <xsl:value-of select="$html.ext"/>
+ </xsl:if>
+ </xsl:when>
+
+ <xsl:when test="self::preface">
+ <xsl:if test="/set">
+ <!-- in a set, make sure we inherit the right book info... -->
+ <xsl:apply-templates mode="recursive-chunk-filename" select="parent::*">
+ <xsl:with-param name="recursive" select="true()"/>
+ </xsl:apply-templates>
+ </xsl:if>
+
+ <xsl:text>pr</xsl:text>
+ <xsl:number level="any" format="01" from="book"/>
+ <xsl:if test="not($recursive)">
+ <xsl:value-of select="$html.ext"/>
+ </xsl:if>
+ </xsl:when>
+
+ <xsl:when test="self::chapter">
+ <xsl:if test="/set">
+ <!-- in a set, make sure we inherit the right book info... -->
+ <xsl:apply-templates mode="recursive-chunk-filename" select="parent::*">
+ <xsl:with-param name="recursive" select="true()"/>
+ </xsl:apply-templates>
+ </xsl:if>
+
+ <xsl:text>ch</xsl:text>
+ <xsl:number level="any" format="01" from="book"/>
+ <xsl:if test="not($recursive)">
+ <xsl:value-of select="$html.ext"/>
+ </xsl:if>
+ </xsl:when>
+
+ <xsl:when test="self::appendix">
+ <xsl:if test="/set">
+ <!-- in a set, make sure we inherit the right book info... -->
+ <xsl:apply-templates mode="recursive-chunk-filename" select="parent::*">
+ <xsl:with-param name="recursive" select="true()"/>
+ </xsl:apply-templates>
+ </xsl:if>
+
+ <xsl:text>ap</xsl:text>
+ <xsl:number level="any" format="a" from="book"/>
+ <xsl:if test="not($recursive)">
+ <xsl:value-of select="$html.ext"/>
+ </xsl:if>
+ </xsl:when>
+
+ <xsl:when test="self::part">
+ <xsl:choose>
+ <xsl:when test="/set">
+ <!-- in a set, make sure we inherit the right book info... -->
+ <xsl:apply-templates mode="recursive-chunk-filename" select="parent::*">
+ <xsl:with-param name="recursive" select="true()"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:otherwise>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:text>pt</xsl:text>
+ <xsl:number level="any" format="01" from="book"/>
+ <xsl:if test="not($recursive)">
+ <xsl:value-of select="$html.ext"/>
+ </xsl:if>
+ </xsl:when>
+
+ <xsl:when test="self::reference">
+ <xsl:choose>
+ <xsl:when test="/set">
+ <!-- in a set, make sure we inherit the right book info... -->
+ <xsl:apply-templates mode="recursive-chunk-filename" select="parent::*">
+ <xsl:with-param name="recursive" select="true()"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:otherwise>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:text>rn</xsl:text>
+ <xsl:number level="any" format="01" from="book"/>
+ <xsl:if test="not($recursive)">
+ <xsl:value-of select="$html.ext"/>
+ </xsl:if>
+ </xsl:when>
+
+ <xsl:when test="self::refentry">
+ <xsl:choose>
+ <xsl:when test="parent::reference">
+ <xsl:apply-templates mode="recursive-chunk-filename" select="parent::*">
+ <xsl:with-param name="recursive" select="true()"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:if test="/set">
+ <!-- in a set, make sure we inherit the right book info... -->
+ <xsl:apply-templates mode="recursive-chunk-filename" select="parent::*">
+ <xsl:with-param name="recursive" select="true()"/>
+ </xsl:apply-templates>
+ </xsl:if>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:text>re</xsl:text>
+ <xsl:number level="any" format="01" from="book"/>
+ <xsl:if test="not($recursive)">
+ <xsl:value-of select="$html.ext"/>
+ </xsl:if>
+ </xsl:when>
+
+ <xsl:when test="self::colophon">
+ <xsl:choose>
+ <xsl:when test="/set">
+ <!-- in a set, make sure we inherit the right book info... -->
+ <xsl:apply-templates mode="recursive-chunk-filename" select="parent::*">
+ <xsl:with-param name="recursive" select="true()"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:otherwise>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:text>co</xsl:text>
+ <xsl:number level="any" format="01" from="book"/>
+ <xsl:if test="not($recursive)">
+ <xsl:value-of select="$html.ext"/>
+ </xsl:if>
+ </xsl:when>
+
+ <xsl:when test="self::sect1 or self::sect2 or self::sect3 or self::sect4 or self::sect5 or self::section">
+ <xsl:apply-templates mode="recursive-chunk-filename" select="parent::*">
+ <xsl:with-param name="recursive" select="true()"/>
+ </xsl:apply-templates>
+ <xsl:text>s</xsl:text>
+ <xsl:number format="01"/>
+ <xsl:if test="not($recursive)">
+ <xsl:value-of select="$html.ext"/>
+ </xsl:if>
+ </xsl:when>
+
+ <xsl:when test="self::bibliography">
+ <xsl:choose>
+ <xsl:when test="/set">
+ <!-- in a set, make sure we inherit the right book info... -->
+ <xsl:apply-templates mode="recursive-chunk-filename" select="parent::*">
+ <xsl:with-param name="recursive" select="true()"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:otherwise>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:text>bi</xsl:text>
+ <xsl:number level="any" format="01" from="book"/>
+ <xsl:if test="not($recursive)">
+ <xsl:value-of select="$html.ext"/>
+ </xsl:if>
+ </xsl:when>
+
+ <xsl:when test="self::glossary">
+ <xsl:choose>
+ <xsl:when test="/set">
+ <!-- in a set, make sure we inherit the right book info... -->
+ <xsl:apply-templates mode="recursive-chunk-filename" select="parent::*">
+ <xsl:with-param name="recursive" select="true()"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:otherwise>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:text>go</xsl:text>
+ <xsl:number level="any" format="01" from="book"/>
+ <xsl:if test="not($recursive)">
+ <xsl:value-of select="$html.ext"/>
+ </xsl:if>
+ </xsl:when>
+
+ <xsl:when test="self::index">
+ <xsl:choose>
+ <xsl:when test="/set">
+ <!-- in a set, make sure we inherit the right book info... -->
+ <xsl:apply-templates mode="recursive-chunk-filename" select="parent::*">
+ <xsl:with-param name="recursive" select="true()"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:otherwise>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:text>ix</xsl:text>
+ <xsl:number level="any" format="01" from="book"/>
+ <xsl:if test="not($recursive)">
+ <xsl:value-of select="$html.ext"/>
+ </xsl:if>
+ </xsl:when>
+
+ <xsl:when test="self::setindex">
+ <xsl:text>si</xsl:text>
+ <xsl:number level="any" format="01" from="set"/>
+ <xsl:if test="not($recursive)">
+ <xsl:value-of select="$html.ext"/>
+ </xsl:if>
+ </xsl:when>
+
+ <xsl:otherwise>
+ <xsl:text>chunk-filename-error-</xsl:text>
+ <xsl:value-of select="name(.)"/>
+ <xsl:number level="any" format="01" from="set"/>
+ <xsl:if test="not($recursive)">
+ <xsl:value-of select="$html.ext"/>
+ </xsl:if>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+
+
+<xsl:template match="processing-instruction('dbhtml')">
+ <!-- nop -->
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+
+<xsl:template match="*" mode="find.chunks">
+ <xsl:variable name="chunk">
+ <xsl:call-template name="chunk"/>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="$chunk != 0">
+ <cf:div id="{generate-id()}">
+ <xsl:apply-templates select="." mode="class.attribute"/>
+ <xsl:apply-templates select="*" mode="find.chunks"/>
+ </cf:div>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="*" mode="find.chunks"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="/">
+ <!-- * Get a title for current doc so that we let the user -->
+ <!-- * know what document we are processing at this point. -->
+ <xsl:variable name="doc.title">
+ <xsl:call-template name="get.doc.title"/>
+ </xsl:variable>
+ <xsl:choose>
+ <!-- Hack! If someone hands us a DocBook V5.x or DocBook NG document,
+ toss the namespace and continue. Use the docbook5 namespaced
+ stylesheets for DocBook5 if you don't want to use this feature.-->
+ <xsl:when test="$exsl.node.set.available != 0 and (*/self::ng:* or */self::db:*)">
+ <xsl:call-template name="log.message">
+ <xsl:with-param name="level">Note</xsl:with-param>
+ <xsl:with-param name="source" select="$doc.title"/>
+ <xsl:with-param name="context-desc">
+ <xsl:text>namesp. cut</xsl:text>
+ </xsl:with-param>
+ <xsl:with-param name="message">
+ <xsl:text>stripped namespace before processing</xsl:text>
+ </xsl:with-param>
+ </xsl:call-template>
+ <xsl:variable name="nons">
+ <xsl:apply-templates mode="stripNS"/>
+ </xsl:variable>
+ <xsl:call-template name="log.message">
+ <xsl:with-param name="level">Note</xsl:with-param>
+ <xsl:with-param name="source" select="$doc.title"/>
+ <xsl:with-param name="context-desc">
+ <xsl:text>namesp. cut</xsl:text>
+ </xsl:with-param>
+ <xsl:with-param name="message">
+ <xsl:text>processing stripped document</xsl:text>
+ </xsl:with-param>
+ </xsl:call-template>
+ <xsl:apply-templates select="exsl:node-set($nons)"/>
+ </xsl:when>
+ <!-- Can't process unless namespace removed -->
+ <xsl:when test="*/self::ng:* or */self::db:*">
+ <xsl:message terminate="yes">
+ <xsl:text>Unable to strip the namespace from DB5 document,</xsl:text>
+ <xsl:text> cannot proceed.</xsl:text>
+ </xsl:message>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:choose>
+ <xsl:when test="$rootid != ''">
+ <xsl:choose>
+ <xsl:when test="count(key('id',$rootid)) = 0">
+ <xsl:message terminate="yes">
+ <xsl:text>ID '</xsl:text>
+ <xsl:value-of select="$rootid"/>
+ <xsl:text>' not found in document.</xsl:text>
+ </xsl:message>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:if test="$collect.xref.targets = 'yes' or $collect.xref.targets = 'only'">
+ <xsl:apply-templates select="key('id', $rootid)" mode="collect.targets"/>
+ </xsl:if>
+ <xsl:if test="$collect.xref.targets != 'only'">
+ <xsl:apply-templates select="key('id',$rootid)" mode="process.root"/>
+ <xsl:if test="$tex.math.in.alt != ''">
+ <xsl:apply-templates select="key('id',$rootid)" mode="collect.tex.math"/>
+ </xsl:if>
+ <xsl:if test="$generate.manifest != 0">
+ <xsl:call-template name="generate.manifest">
+ <xsl:with-param name="node" select="key('id',$rootid)"/>
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:if>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:if test="$collect.xref.targets = 'yes' or $collect.xref.targets = 'only'">
+ <xsl:apply-templates select="/" mode="collect.targets"/>
+ </xsl:if>
+ <xsl:if test="$collect.xref.targets != 'only'">
+ <xsl:apply-templates select="/" mode="process.root"/>
+ <xsl:if test="$tex.math.in.alt != ''">
+ <xsl:apply-templates select="/" mode="collect.tex.math"/>
+ </xsl:if>
+ <xsl:if test="$generate.manifest != 0">
+ <xsl:call-template name="generate.manifest">
+ <xsl:with-param name="node" select="/"/>
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:if>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="*" mode="process.root">
+ <xsl:apply-templates select="."/>
+ <xsl:call-template name="generate.css"/>
+</xsl:template>
+
+<!-- ====================================================================== -->
+
+<xsl:template match="set|book|part|preface|chapter|appendix |article |reference|refentry |book/glossary|article/glossary|part/glossary |book/bibliography|article/bibliography|part/bibliography |colophon">
+ <xsl:choose>
+ <xsl:when test="$onechunk != 0 and parent::*">
+ <xsl:apply-imports/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="process-chunk-element"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="sect1|sect2|sect3|sect4|sect5|section">
+ <xsl:variable name="ischunk">
+ <xsl:call-template name="chunk"/>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="not(parent::*)">
+ <xsl:call-template name="process-chunk-element"/>
+ </xsl:when>
+ <xsl:when test="$ischunk = 0">
+ <xsl:apply-imports/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="process-chunk-element"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="setindex |book/index |article/index |part/index">
+ <!-- some implementations use completely empty index tags to indicate -->
+ <!-- where an automatically generated index should be inserted. so -->
+ <!-- if the index is completely empty, skip it. -->
+ <xsl:if test="count(*)&gt;0 or $generate.index != '0'">
+ <xsl:call-template name="process-chunk-element"/>
+ </xsl:if>
+</xsl:template>
+
+<!-- Resolve xml:base attributes -->
+<xsl:template match="@fileref">
+ <!-- need a check for absolute urls -->
+ <xsl:choose>
+ <xsl:when test="contains(., ':')">
+ <!-- it has a uri scheme so it is an absolute uri -->
+ <xsl:value-of select="."/>
+ </xsl:when>
+ <xsl:when test="$keep.relative.image.uris != 0">
+ <!-- leave it alone -->
+ <xsl:value-of select="."/>
+ </xsl:when>
+ <xsl:otherwise>
+ <!-- its a relative uri -->
+ <xsl:call-template name="relative-uri">
+ <xsl:with-param name="destdir">
+ <xsl:call-template name="dbhtml-dir">
+ <xsl:with-param name="context" select=".."/>
+ </xsl:call-template>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ==================================================================== -->
+<xsl:template match="set|book|part|preface|chapter|appendix |article |reference|refentry |sect1|sect2|sect3|sect4|sect5 |section |book/glossary|article/glossary|part/glossary |book/bibliography|article/bibliography|part/bibliography |colophon" mode="enumerate-files">
+ <xsl:variable name="ischunk"><xsl:call-template name="chunk"/></xsl:variable>
+ <xsl:if test="$ischunk='1'">
+ <xsl:call-template name="make-relative-filename">
+ <xsl:with-param name="base.dir">
+ <xsl:if test="$manifest.in.base.dir = 0">
+ <xsl:value-of select="$base.dir"/>
+ </xsl:if>
+ </xsl:with-param>
+ <xsl:with-param name="base.name">
+ <xsl:apply-templates mode="chunk-filename" select="."/>
+ </xsl:with-param>
+ </xsl:call-template>
+ <xsl:text>
+</xsl:text>
+ </xsl:if>
+ <xsl:apply-templates select="*" mode="enumerate-files"/>
+</xsl:template>
+
+<xsl:template match="book/index|article/index|part/index" mode="enumerate-files">
+ <xsl:if test="$htmlhelp.output != 1">
+ <xsl:variable name="ischunk"><xsl:call-template name="chunk"/></xsl:variable>
+ <xsl:if test="$ischunk='1'">
+ <xsl:call-template name="make-relative-filename">
+ <xsl:with-param name="base.dir">
+ <xsl:if test="$manifest.in.base.dir = 0">
+ <xsl:value-of select="$base.dir"/>
+ </xsl:if>
+ </xsl:with-param>
+ <xsl:with-param name="base.name">
+ <xsl:apply-templates mode="chunk-filename" select="."/>
+ </xsl:with-param>
+ </xsl:call-template>
+ <xsl:text>
+</xsl:text>
+ </xsl:if>
+ <xsl:apply-templates select="*" mode="enumerate-files"/>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="legalnotice" mode="enumerate-files">
+ <xsl:variable name="id"><xsl:call-template name="object.id"/></xsl:variable>
+ <xsl:if test="$generate.legalnotice.link != 0">
+ <xsl:call-template name="make-relative-filename">
+ <xsl:with-param name="base.dir">
+ <xsl:if test="$manifest.in.base.dir = 0">
+ <xsl:value-of select="$base.dir"/>
+ </xsl:if>
+ </xsl:with-param>
+ <xsl:with-param name="base.name">
+ <xsl:apply-templates mode="chunk-filename" select="."/>
+ </xsl:with-param>
+ </xsl:call-template>
+ <xsl:text>
+</xsl:text>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="mediaobject[imageobject] | inlinemediaobject[imageobject]" mode="enumerate-files">
+ <xsl:variable name="longdesc.uri">
+ <xsl:call-template name="longdesc.uri">
+ <xsl:with-param name="mediaobject" select="."/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:variable name="mediaobject" select="."/>
+
+ <xsl:if test="$html.longdesc != 0 and $mediaobject/textobject[not(phrase)]">
+ <xsl:call-template name="longdesc.uri">
+ <xsl:with-param name="mediaobject" select="$mediaobject"/>
+ </xsl:call-template>
+ <xsl:text>
+</xsl:text>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="text()" mode="enumerate-files">
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/chunk-common.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/chunk-common.xsl
new file mode 100644
index 0000000..4b41a16
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/chunk-common.xsl
@@ -0,0 +1,1561 @@
+<?xml version="1.0" encoding="ASCII"?>
+<!--This file was created automatically by html2xhtml-->
+<!--from the HTML stylesheets.-->
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:exsl="http://exslt.org/common" xmlns:cf="http://docbook.sourceforge.net/xmlns/chunkfast/1.0" xmlns:ng="http://docbook.org/docbook-ng" xmlns:db="http://docbook.org/ns/docbook" xmlns="http://www.w3.org/1999/xhtml" version="1.0" exclude-result-prefixes="exsl cf ng db">
+
+<!-- ********************************************************************
+ $Id: chunk-common.xsl 8551 2009-12-07 06:03:50Z bobstayton $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<!-- ==================================================================== -->
+
+<xsl:param name="onechunk" select="0"/>
+<xsl:param name="refentry.separator" select="0"/>
+<xsl:param name="chunk.fast" select="0"/>
+
+<xsl:key name="genid" match="*" use="generate-id()"/>
+
+<!-- ==================================================================== -->
+
+<xsl:variable name="chunk.hierarchy">
+ <xsl:if test="$chunk.fast != 0">
+ <xsl:choose>
+ <xsl:when test="$exsl.node.set.available != 0">
+ <xsl:message>Computing chunks...</xsl:message>
+ <xsl:apply-templates select="/*" mode="find.chunks"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:message>
+ <xsl:text>Fast chunking requires exsl:node-set(). </xsl:text>
+ <xsl:text>Using "slow" chunking.</xsl:text>
+ </xsl:message>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:if>
+</xsl:variable>
+
+<!-- ==================================================================== -->
+
+<xsl:template name="process-chunk-element">
+ <xsl:param name="content">
+ <xsl:apply-imports/>
+ </xsl:param>
+
+ <xsl:choose>
+ <xsl:when test="$chunk.fast != 0 and $exsl.node.set.available != 0">
+ <xsl:variable name="chunks" select="exsl:node-set($chunk.hierarchy)//cf:div"/>
+ <xsl:variable name="genid" select="generate-id()"/>
+
+ <xsl:variable name="div" select="$chunks[@id=$genid or @xml:id=$genid]"/>
+
+ <xsl:variable name="prevdiv" select="($div/preceding-sibling::cf:div|$div/preceding::cf:div|$div/parent::cf:div)[last()]"/>
+ <xsl:variable name="prev" select="key('genid', ($prevdiv/@id|$prevdiv/@xml:id)[1])"/>
+
+ <xsl:variable name="nextdiv" select="($div/following-sibling::cf:div|$div/following::cf:div|$div/cf:div)[1]"/>
+ <xsl:variable name="next" select="key('genid', ($nextdiv/@id|$nextdiv/@xml:id)[1])"/>
+
+ <xsl:choose>
+ <xsl:when test="$onechunk != 0 and parent::*">
+ <xsl:copy-of select="$content"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="process-chunk">
+ <xsl:with-param name="prev" select="$prev"/>
+ <xsl:with-param name="next" select="$next"/>
+ <xsl:with-param name="content" select="$content"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:choose>
+ <xsl:when test="$onechunk != 0 and not(parent::*)">
+ <xsl:call-template name="chunk-all-sections">
+ <xsl:with-param name="content" select="$content"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="$onechunk != 0">
+ <xsl:copy-of select="$content"/>
+ </xsl:when>
+ <xsl:when test="$chunk.first.sections = 0">
+ <xsl:call-template name="chunk-first-section-with-parent">
+ <xsl:with-param name="content" select="$content"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="chunk-all-sections">
+ <xsl:with-param name="content" select="$content"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="process-chunk">
+ <xsl:param name="prev" select="."/>
+ <xsl:param name="next" select="."/>
+ <xsl:param name="content">
+ <xsl:apply-imports/>
+ </xsl:param>
+
+ <xsl:variable name="ischunk">
+ <xsl:call-template name="chunk"/>
+ </xsl:variable>
+
+ <xsl:variable name="chunkfn">
+ <xsl:if test="$ischunk='1'">
+ <xsl:apply-templates mode="chunk-filename" select="."/>
+ </xsl:if>
+ </xsl:variable>
+
+ <xsl:if test="$ischunk='0'">
+ <xsl:message>
+ <xsl:text>Error </xsl:text>
+ <xsl:value-of select="name(.)"/>
+ <xsl:text> is not a chunk!</xsl:text>
+ </xsl:message>
+ </xsl:if>
+
+ <xsl:variable name="filename">
+ <xsl:call-template name="make-relative-filename">
+ <xsl:with-param name="base.dir" select="$base.dir"/>
+ <xsl:with-param name="base.name" select="$chunkfn"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:call-template name="write.chunk">
+ <xsl:with-param name="filename" select="$filename"/>
+ <xsl:with-param name="content">
+ <xsl:call-template name="chunk-element-content">
+ <xsl:with-param name="prev" select="$prev"/>
+ <xsl:with-param name="next" select="$next"/>
+ <xsl:with-param name="content" select="$content"/>
+ </xsl:call-template>
+ </xsl:with-param>
+ <xsl:with-param name="quiet" select="$chunk.quietly"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template name="chunk-first-section-with-parent">
+ <xsl:param name="content">
+ <xsl:apply-imports/>
+ </xsl:param>
+
+ <!-- These xpath expressions are really hairy. The trick is to pick sections -->
+ <!-- that are not first children and are not the children of first children -->
+
+ <!-- Break these variables into pieces to work around
+ http://nagoya.apache.org/bugzilla/show_bug.cgi?id=6063 -->
+
+ <xsl:variable name="prev-v1" select="(ancestor::sect1[$chunk.section.depth &gt; 0 and not(ancestor::*/processing-instruction('dbhtml')[normalize-space(.) ='stop-chunking']) and preceding-sibling::sect1][1] |ancestor::sect2[$chunk.section.depth &gt; 1 and not(ancestor::*/processing-instruction('dbhtml')[normalize-space(.) ='stop-chunking']) and preceding-sibling::sect2 and parent::sect1[preceding-sibling::sect1]][1] |ancestor::sect3[$chunk.section.depth &gt; 2 and not(ancestor::*/processing-instruction('dbhtml')[normalize-space(.) ='stop-chunking']) and preceding-sibling::sect3 and parent::sect2[preceding-sibling::sect2] and ancestor::sect1[preceding-sibling::sect1]][1] |ancestor::sect4[$chunk.section.depth &gt; 3 and not(ancestor::*/processing-instruction('dbhtml')[normalize-space(.) ='stop-chunking']) and preceding-sibling::sect4 and parent::sect3[preceding-sibling::sect3] and ancestor::sect2[preceding-sibling::sect2] and ancestor::sect1[preceding-sibling::sect1]][1] |ancestor::sect5[$chunk.section.depth &gt; 4 and not(ancestor::*/processing-instruction('dbhtml')[normalize-space(.) ='stop-chunking']) and preceding-sibling::sect5 and parent::sect4[preceding-sibling::sect4] and ancestor::sect3[preceding-sibling::sect3] and ancestor::sect2[preceding-sibling::sect2] and ancestor::sect1[preceding-sibling::sect1]][1] |ancestor::section[$chunk.section.depth &gt; count(ancestor::section) and not(ancestor::*/processing-instruction('dbhtml')[normalize-space(.) ='stop-chunking']) and not(ancestor::section[not(preceding-sibling::section)])][1])[last()]"/>
+
+ <xsl:variable name="prev-v2" select="(preceding::sect1[$chunk.section.depth &gt; 0 and not(ancestor::*/processing-instruction('dbhtml')[normalize-space(.) ='stop-chunking']) and preceding-sibling::sect1][1] |preceding::sect2[$chunk.section.depth &gt; 1 and not(ancestor::*/processing-instruction('dbhtml')[normalize-space(.) ='stop-chunking']) and preceding-sibling::sect2 and parent::sect1[preceding-sibling::sect1]][1] |preceding::sect3[$chunk.section.depth &gt; 2 and not(ancestor::*/processing-instruction('dbhtml')[normalize-space(.) ='stop-chunking']) and preceding-sibling::sect3 and parent::sect2[preceding-sibling::sect2] and ancestor::sect1[preceding-sibling::sect1]][1] |preceding::sect4[$chunk.section.depth &gt; 3 and not(ancestor::*/processing-instruction('dbhtml')[normalize-space(.) ='stop-chunking']) and preceding-sibling::sect4 and parent::sect3[preceding-sibling::sect3] and ancestor::sect2[preceding-sibling::sect2] and ancestor::sect1[preceding-sibling::sect1]][1] |preceding::sect5[$chunk.section.depth &gt; 4 and not(ancestor::*/processing-instruction('dbhtml')[normalize-space(.) ='stop-chunking']) and preceding-sibling::sect5 and parent::sect4[preceding-sibling::sect4] and ancestor::sect3[preceding-sibling::sect3] and ancestor::sect2[preceding-sibling::sect2] and ancestor::sect1[preceding-sibling::sect1]][1] |preceding::section[$chunk.section.depth &gt; count(ancestor::section) and not(ancestor::*/processing-instruction('dbhtml')[normalize-space(.) ='stop-chunking']) and preceding-sibling::section and not(ancestor::section[not(preceding-sibling::section)])][1])[last()]"/>
+
+ <xsl:variable name="prev" select="(preceding::book[1] |preceding::preface[1] |preceding::chapter[1] |preceding::appendix[1] |preceding::part[1] |preceding::reference[1] |preceding::refentry[1] |preceding::colophon[1] |preceding::article[1] |preceding::bibliography[parent::article or parent::book or parent::part][1] |preceding::glossary[parent::article or parent::book or parent::part][1] |preceding::index[$generate.index != 0] [parent::article or parent::book or parent::part][1] |preceding::setindex[$generate.index != 0][1] |ancestor::set |ancestor::book[1] |ancestor::preface[1] |ancestor::chapter[1] |ancestor::appendix[1] |ancestor::part[1] |ancestor::reference[1] |ancestor::article[1] |$prev-v1 |$prev-v2)[last()]"/>
+
+ <xsl:variable name="next-v1" select="(following::sect1[$chunk.section.depth &gt; 0 and not(ancestor::*/processing-instruction('dbhtml')[normalize-space(.) ='stop-chunking']) and preceding-sibling::sect1][1] |following::sect2[$chunk.section.depth &gt; 1 and not(ancestor::*/processing-instruction('dbhtml')[normalize-space(.) ='stop-chunking']) and preceding-sibling::sect2 and parent::sect1[preceding-sibling::sect1]][1] |following::sect3[$chunk.section.depth &gt; 2 and not(ancestor::*/processing-instruction('dbhtml')[normalize-space(.) ='stop-chunking']) and preceding-sibling::sect3 and parent::sect2[preceding-sibling::sect2] and ancestor::sect1[preceding-sibling::sect1]][1] |following::sect4[$chunk.section.depth &gt; 3 and not(ancestor::*/processing-instruction('dbhtml')[normalize-space(.) ='stop-chunking']) and preceding-sibling::sect4 and parent::sect3[preceding-sibling::sect3] and ancestor::sect2[preceding-sibling::sect2] and ancestor::sect1[preceding-sibling::sect1]][1] |following::sect5[$chunk.section.depth &gt; 4 and not(ancestor::*/processing-instruction('dbhtml')[normalize-space(.) ='stop-chunking']) and preceding-sibling::sect5 and parent::sect4[preceding-sibling::sect4] and ancestor::sect3[preceding-sibling::sect3] and ancestor::sect2[preceding-sibling::sect2] and ancestor::sect1[preceding-sibling::sect1]][1] |following::section[$chunk.section.depth &gt; count(ancestor::section) and not(ancestor::*/processing-instruction('dbhtml')[normalize-space(.) ='stop-chunking']) and preceding-sibling::section and not(ancestor::section[not(preceding-sibling::section)])][1])[1]"/>
+
+ <xsl:variable name="next-v2" select="(descendant::sect1[$chunk.section.depth &gt; 0 and not(ancestor::*/processing-instruction('dbhtml')[normalize-space(.) ='stop-chunking']) and preceding-sibling::sect1][1] |descendant::sect2[$chunk.section.depth &gt; 1 and not(ancestor::*/processing-instruction('dbhtml')[normalize-space(.) ='stop-chunking']) and preceding-sibling::sect2 and parent::sect1[preceding-sibling::sect1]][1] |descendant::sect3[$chunk.section.depth &gt; 2 and not(ancestor::*/processing-instruction('dbhtml')[normalize-space(.) ='stop-chunking']) and preceding-sibling::sect3 and parent::sect2[preceding-sibling::sect2] and ancestor::sect1[preceding-sibling::sect1]][1] |descendant::sect4[$chunk.section.depth &gt; 3 and not(ancestor::*/processing-instruction('dbhtml')[normalize-space(.) ='stop-chunking']) and preceding-sibling::sect4 and parent::sect3[preceding-sibling::sect3] and ancestor::sect2[preceding-sibling::sect2] and ancestor::sect1[preceding-sibling::sect1]][1] |descendant::sect5[$chunk.section.depth &gt; 4 and not(ancestor::*/processing-instruction('dbhtml')[normalize-space(.) ='stop-chunking']) and preceding-sibling::sect5 and parent::sect4[preceding-sibling::sect4] and ancestor::sect3[preceding-sibling::sect3] and ancestor::sect2[preceding-sibling::sect2] and ancestor::sect1[preceding-sibling::sect1]][1] |descendant::section[$chunk.section.depth &gt; count(ancestor::section) and not(ancestor::*/processing-instruction('dbhtml')[normalize-space(.) ='stop-chunking']) and preceding-sibling::section and not(ancestor::section[not(preceding-sibling::section)])])[1]"/>
+
+ <xsl:variable name="next" select="(following::book[1] |following::preface[1] |following::chapter[1] |following::appendix[1] |following::part[1] |following::reference[1] |following::refentry[1] |following::colophon[1] |following::bibliography[parent::article or parent::book or parent::part][1] |following::glossary[parent::article or parent::book or parent::part][1] |following::index[$generate.index != 0] [parent::article or parent::book or parent::part][1] |following::article[1] |following::setindex[$generate.index != 0][1] |descendant::book[1] |descendant::preface[1] |descendant::chapter[1] |descendant::appendix[1] |descendant::article[1] |descendant::bibliography[parent::article or parent::book or parent::part][1] |descendant::glossary[parent::article or parent::book or parent::part][1] |descendant::index[$generate.index != 0] [parent::article or parent::book or parent::part][1] |descendant::colophon[1] |descendant::setindex[$generate.index != 0][1] |descendant::part[1] |descendant::reference[1] |descendant::refentry[1] |$next-v1 |$next-v2)[1]"/>
+
+ <xsl:call-template name="process-chunk">
+ <xsl:with-param name="prev" select="$prev"/>
+ <xsl:with-param name="next" select="$next"/>
+ <xsl:with-param name="content" select="$content"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template name="chunk-all-sections">
+ <xsl:param name="content">
+ <xsl:apply-imports/>
+ </xsl:param>
+
+ <xsl:variable name="prev-v1" select="(preceding::sect1[$chunk.section.depth &gt; 0 and not(ancestor::*/processing-instruction('dbhtml')[normalize-space(.) ='stop-chunking'])][1] |preceding::sect2[$chunk.section.depth &gt; 1 and not(ancestor::*/processing-instruction('dbhtml')[normalize-space(.) ='stop-chunking'])][1] |preceding::sect3[$chunk.section.depth &gt; 2 and not(ancestor::*/processing-instruction('dbhtml')[normalize-space(.) ='stop-chunking'])][1] |preceding::sect4[$chunk.section.depth &gt; 3 and not(ancestor::*/processing-instruction('dbhtml')[normalize-space(.) ='stop-chunking'])][1] |preceding::sect5[$chunk.section.depth &gt; 4 and not(ancestor::*/processing-instruction('dbhtml')[normalize-space(.) ='stop-chunking'])][1] |preceding::section[$chunk.section.depth &gt; count(ancestor::section) and not(ancestor::*/processing-instruction('dbhtml')[normalize-space(.) ='stop-chunking'])][1])[last()]"/>
+
+ <xsl:variable name="prev-v2" select="(ancestor::sect1[$chunk.section.depth &gt; 0 and not(ancestor::*/processing-instruction('dbhtml')[normalize-space(.) ='stop-chunking'])][1] |ancestor::sect2[$chunk.section.depth &gt; 1 and not(ancestor::*/processing-instruction('dbhtml')[normalize-space(.) ='stop-chunking'])][1] |ancestor::sect3[$chunk.section.depth &gt; 2 and not(ancestor::*/processing-instruction('dbhtml')[normalize-space(.) ='stop-chunking'])][1] |ancestor::sect4[$chunk.section.depth &gt; 3 and not(ancestor::*/processing-instruction('dbhtml')[normalize-space(.) ='stop-chunking'])][1] |ancestor::sect5[$chunk.section.depth &gt; 4 and not(ancestor::*/processing-instruction('dbhtml')[normalize-space(.) ='stop-chunking'])][1] |ancestor::section[$chunk.section.depth &gt; count(ancestor::section) and not(ancestor::*/processing-instruction('dbhtml')[normalize-space(.) ='stop-chunking'])][1])[last()]"/>
+
+ <xsl:variable name="prev" select="(preceding::book[1] |preceding::preface[1] |preceding::chapter[1] |preceding::appendix[1] |preceding::part[1] |preceding::reference[1] |preceding::refentry[1] |preceding::colophon[1] |preceding::article[1] |preceding::bibliography[parent::article or parent::book or parent::part][1] |preceding::glossary[parent::article or parent::book or parent::part][1] |preceding::index[$generate.index != 0] [parent::article or parent::book or parent::part][1] |preceding::setindex[$generate.index != 0][1] |ancestor::set |ancestor::book[1] |ancestor::preface[1] |ancestor::chapter[1] |ancestor::appendix[1] |ancestor::part[1] |ancestor::reference[1] |ancestor::article[1] |$prev-v1 |$prev-v2)[last()]"/>
+
+ <xsl:variable name="next-v1" select="(following::sect1[$chunk.section.depth &gt; 0 and not(ancestor::*/processing-instruction('dbhtml')[normalize-space(.) ='stop-chunking'])][1] |following::sect2[$chunk.section.depth &gt; 1 and not(ancestor::*/processing-instruction('dbhtml')[normalize-space(.) ='stop-chunking'])][1] |following::sect3[$chunk.section.depth &gt; 2 and not(ancestor::*/processing-instruction('dbhtml')[normalize-space(.) ='stop-chunking'])][1] |following::sect4[$chunk.section.depth &gt; 3 and not(ancestor::*/processing-instruction('dbhtml')[normalize-space(.) ='stop-chunking'])][1] |following::sect5[$chunk.section.depth &gt; 4 and not(ancestor::*/processing-instruction('dbhtml')[normalize-space(.) ='stop-chunking'])][1] |following::section[$chunk.section.depth &gt; count(ancestor::section) and not(ancestor::*/processing-instruction('dbhtml')[normalize-space(.) ='stop-chunking'])][1])[1]"/>
+
+ <xsl:variable name="next-v2" select="(descendant::sect1[$chunk.section.depth &gt; 0 and not(ancestor::*/processing-instruction('dbhtml')[normalize-space(.) ='stop-chunking'])][1] |descendant::sect2[$chunk.section.depth &gt; 1 and not(ancestor::*/processing-instruction('dbhtml')[normalize-space(.) ='stop-chunking'])][1] |descendant::sect3[$chunk.section.depth &gt; 2 and not(ancestor::*/processing-instruction('dbhtml')[normalize-space(.) ='stop-chunking'])][1] |descendant::sect4[$chunk.section.depth &gt; 3 and not(ancestor::*/processing-instruction('dbhtml')[normalize-space(.) ='stop-chunking'])][1] |descendant::sect5[$chunk.section.depth &gt; 4 and not(ancestor::*/processing-instruction('dbhtml')[normalize-space(.) ='stop-chunking'])][1] |descendant::section[$chunk.section.depth &gt; count(ancestor::section) and not(ancestor::*/processing-instruction('dbhtml')[normalize-space(.) ='stop-chunking'])][1])[1]"/>
+
+ <xsl:variable name="next" select="(following::book[1] |following::preface[1] |following::chapter[1] |following::appendix[1] |following::part[1] |following::reference[1] |following::refentry[1] |following::colophon[1] |following::bibliography[parent::article or parent::book or parent::part][1] |following::glossary[parent::article or parent::book or parent::part][1] |following::index[$generate.index != 0] [parent::article or parent::book][1] |following::article[1] |following::setindex[$generate.index != 0][1] |descendant::book[1] |descendant::preface[1] |descendant::chapter[1] |descendant::appendix[1] |descendant::article[1] |descendant::bibliography[parent::article or parent::book][1] |descendant::glossary[parent::article or parent::book or parent::part][1] |descendant::index[$generate.index != 0] [parent::article or parent::book][1] |descendant::colophon[1] |descendant::setindex[$generate.index != 0][1] |descendant::part[1] |descendant::reference[1] |descendant::refentry[1] |$next-v1 |$next-v2)[1]"/>
+
+ <xsl:call-template name="process-chunk">
+ <xsl:with-param name="prev" select="$prev"/>
+ <xsl:with-param name="next" select="$next"/>
+ <xsl:with-param name="content" select="$content"/>
+ </xsl:call-template>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<!-- ==================================================================== -->
+
+<xsl:template name="make.lots">
+ <xsl:param name="toc.params" select="''"/>
+ <xsl:param name="toc"/>
+
+ <xsl:variable name="lots">
+ <xsl:if test="contains($toc.params, 'toc')">
+ <xsl:copy-of select="$toc"/>
+ </xsl:if>
+
+ <xsl:if test="contains($toc.params, 'figure')">
+ <xsl:choose>
+ <xsl:when test="$chunk.separate.lots != '0'">
+ <xsl:call-template name="make.lot.chunk">
+ <xsl:with-param name="type" select="'figure'"/>
+ <xsl:with-param name="lot">
+ <xsl:call-template name="list.of.titles">
+ <xsl:with-param name="titles" select="'figure'"/>
+ <xsl:with-param name="nodes" select=".//figure"/>
+ </xsl:call-template>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="list.of.titles">
+ <xsl:with-param name="titles" select="'figure'"/>
+ <xsl:with-param name="nodes" select=".//figure"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:if>
+
+ <xsl:if test="contains($toc.params, 'table')">
+ <xsl:choose>
+ <xsl:when test="$chunk.separate.lots != '0'">
+ <xsl:call-template name="make.lot.chunk">
+ <xsl:with-param name="type" select="'table'"/>
+ <xsl:with-param name="lot">
+ <xsl:call-template name="list.of.titles">
+ <xsl:with-param name="titles" select="'table'"/>
+ <xsl:with-param name="nodes" select=".//table"/>
+ </xsl:call-template>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="list.of.titles">
+ <xsl:with-param name="titles" select="'table'"/>
+ <xsl:with-param name="nodes" select=".//table"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:if>
+
+ <xsl:if test="contains($toc.params, 'example')">
+ <xsl:choose>
+ <xsl:when test="$chunk.separate.lots != '0'">
+ <xsl:call-template name="make.lot.chunk">
+ <xsl:with-param name="type" select="'example'"/>
+ <xsl:with-param name="lot">
+ <xsl:call-template name="list.of.titles">
+ <xsl:with-param name="titles" select="'example'"/>
+ <xsl:with-param name="nodes" select=".//example"/>
+ </xsl:call-template>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="list.of.titles">
+ <xsl:with-param name="titles" select="'example'"/>
+ <xsl:with-param name="nodes" select=".//example"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:if>
+
+ <xsl:if test="contains($toc.params, 'equation')">
+ <xsl:choose>
+ <xsl:when test="$chunk.separate.lots != '0'">
+ <xsl:call-template name="make.lot.chunk">
+ <xsl:with-param name="type" select="'equation'"/>
+ <xsl:with-param name="lot">
+ <xsl:call-template name="list.of.titles">
+ <xsl:with-param name="titles" select="'equation'"/>
+ <xsl:with-param name="nodes" select=".//equation[title or info/title]"/>
+ </xsl:call-template>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="list.of.titles">
+ <xsl:with-param name="titles" select="'equation'"/>
+ <xsl:with-param name="nodes" select=".//equation[title or info/title]"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:if>
+
+ <xsl:if test="contains($toc.params, 'procedure')">
+ <xsl:choose>
+ <xsl:when test="$chunk.separate.lots != '0'">
+ <xsl:call-template name="make.lot.chunk">
+ <xsl:with-param name="type" select="'procedure'"/>
+ <xsl:with-param name="lot">
+ <xsl:call-template name="list.of.titles">
+ <xsl:with-param name="titles" select="'procedure'"/>
+ <xsl:with-param name="nodes" select=".//procedure[title]"/>
+ </xsl:call-template>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="list.of.titles">
+ <xsl:with-param name="titles" select="'procedure'"/>
+ <xsl:with-param name="nodes" select=".//procedure[title]"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:if>
+ </xsl:variable>
+
+ <xsl:if test="string($lots) != ''">
+ <xsl:choose>
+ <xsl:when test="$chunk.tocs.and.lots != 0 and not(parent::*)">
+ <xsl:call-template name="write.chunk">
+ <xsl:with-param name="filename">
+ <xsl:call-template name="make-relative-filename">
+ <xsl:with-param name="base.dir" select="$base.dir"/>
+ <xsl:with-param name="base.name">
+ <xsl:call-template name="dbhtml-dir"/>
+ <xsl:apply-templates select="." mode="recursive-chunk-filename">
+ <xsl:with-param name="recursive" select="true()"/>
+ </xsl:apply-templates>
+ <xsl:text>-toc</xsl:text>
+ <xsl:value-of select="$html.ext"/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:with-param>
+ <xsl:with-param name="content">
+ <xsl:call-template name="chunk-element-content">
+ <xsl:with-param name="prev" select="/foo"/>
+ <xsl:with-param name="next" select="/foo"/>
+ <xsl:with-param name="nav.context" select="'toc'"/>
+ <xsl:with-param name="content">
+ <xsl:if test="$chunk.tocs.and.lots.has.title != 0">
+ <h1>
+ <xsl:apply-templates select="." mode="object.title.markup"/>
+ </h1>
+ </xsl:if>
+ <xsl:copy-of select="$lots"/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:with-param>
+ <xsl:with-param name="quiet" select="$chunk.quietly"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:copy-of select="$lots"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template name="make.lot.chunk">
+ <xsl:param name="type" select="''"/>
+ <xsl:param name="lot"/>
+
+ <xsl:if test="string($lot) != ''">
+ <xsl:variable name="filename">
+ <xsl:call-template name="make-relative-filename">
+ <xsl:with-param name="base.dir" select="$base.dir"/>
+ <xsl:with-param name="base.name">
+ <xsl:call-template name="dbhtml-dir"/>
+ <xsl:value-of select="$type"/>
+ <xsl:text>-toc</xsl:text>
+ <xsl:value-of select="$html.ext"/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="href">
+ <xsl:call-template name="make-relative-filename">
+ <xsl:with-param name="base.name">
+ <xsl:call-template name="dbhtml-dir"/>
+ <xsl:value-of select="$type"/>
+ <xsl:text>-toc</xsl:text>
+ <xsl:value-of select="$html.ext"/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:call-template name="write.chunk">
+ <xsl:with-param name="filename" select="$filename"/>
+ <xsl:with-param name="content">
+ <xsl:call-template name="chunk-element-content">
+ <xsl:with-param name="prev" select="/foo"/>
+ <xsl:with-param name="next" select="/foo"/>
+ <xsl:with-param name="nav.context" select="'toc'"/>
+ <xsl:with-param name="content">
+ <xsl:copy-of select="$lot"/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:with-param>
+ <xsl:with-param name="quiet" select="$chunk.quietly"/>
+ </xsl:call-template>
+ <!-- And output a link to this file -->
+ <div>
+ <xsl:attribute name="class">
+ <xsl:text>ListofTitles</xsl:text>
+ </xsl:attribute>
+ <a href="{$href}">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key">
+ <xsl:choose>
+ <xsl:when test="$type='table'">ListofTables</xsl:when>
+ <xsl:when test="$type='figure'">ListofFigures</xsl:when>
+ <xsl:when test="$type='equation'">ListofEquations</xsl:when>
+ <xsl:when test="$type='example'">ListofExamples</xsl:when>
+ <xsl:when test="$type='procedure'">ListofProcedures</xsl:when>
+ <xsl:otherwise>ListofUnknown</xsl:otherwise>
+ </xsl:choose>
+ </xsl:with-param>
+ </xsl:call-template>
+ </a>
+ </div>
+ </xsl:if>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template name="in.other.chunk">
+ <xsl:param name="chunk" select="."/>
+ <xsl:param name="node" select="."/>
+
+ <xsl:variable name="is.chunk">
+ <xsl:call-template name="chunk">
+ <xsl:with-param name="node" select="$node"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+<!--
+ <xsl:message>
+ <xsl:text>in.other.chunk: </xsl:text>
+ <xsl:value-of select="name($chunk)"/>
+ <xsl:text> </xsl:text>
+ <xsl:value-of select="name($node)"/>
+ <xsl:text> </xsl:text>
+ <xsl:value-of select="$chunk = $node"/>
+ <xsl:text> </xsl:text>
+ <xsl:value-of select="$is.chunk"/>
+ </xsl:message>
+-->
+
+ <xsl:choose>
+ <xsl:when test="$chunk = $node">0</xsl:when>
+ <xsl:when test="$is.chunk = 1">1</xsl:when>
+ <xsl:when test="count($node) = 0">0</xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="in.other.chunk">
+ <xsl:with-param name="chunk" select="$chunk"/>
+ <xsl:with-param name="node" select="$node/parent::*"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="count.footnotes.in.this.chunk">
+ <xsl:param name="node" select="."/>
+ <xsl:param name="footnotes" select="$node//footnote"/>
+ <xsl:param name="count" select="0"/>
+
+<!--
+ <xsl:message>
+ <xsl:text>count.footnotes.in.this.chunk: </xsl:text>
+ <xsl:value-of select="name($node)"/>
+ </xsl:message>
+-->
+
+ <xsl:variable name="in.other.chunk">
+ <xsl:call-template name="in.other.chunk">
+ <xsl:with-param name="chunk" select="$node"/>
+ <xsl:with-param name="node" select="$footnotes[1]"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="count($footnotes) = 0">
+ <xsl:value-of select="$count"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:choose>
+ <xsl:when test="$in.other.chunk != 0">
+ <xsl:call-template name="count.footnotes.in.this.chunk">
+ <xsl:with-param name="node" select="$node"/>
+ <xsl:with-param name="footnotes" select="$footnotes[position() &gt; 1]"/>
+ <xsl:with-param name="count" select="$count"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="$footnotes[1]/ancestor::table |$footnotes[1]/ancestor::informaltable">
+ <xsl:call-template name="count.footnotes.in.this.chunk">
+ <xsl:with-param name="node" select="$node"/>
+ <xsl:with-param name="footnotes" select="$footnotes[position() &gt; 1]"/>
+ <xsl:with-param name="count" select="$count"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="count.footnotes.in.this.chunk">
+ <xsl:with-param name="node" select="$node"/>
+ <xsl:with-param name="footnotes" select="$footnotes[position() &gt; 1]"/>
+ <xsl:with-param name="count" select="$count + 1"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="process.footnotes.in.this.chunk">
+ <xsl:param name="node" select="."/>
+ <xsl:param name="footnotes" select="$node//footnote"/>
+
+<!--
+ <xsl:message>process.footnotes.in.this.chunk</xsl:message>
+-->
+
+ <xsl:variable name="in.other.chunk">
+ <xsl:call-template name="in.other.chunk">
+ <xsl:with-param name="chunk" select="$node"/>
+ <xsl:with-param name="node" select="$footnotes[1]"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="count($footnotes) = 0">
+ <!-- nop -->
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:choose>
+ <xsl:when test="$in.other.chunk != 0">
+ <xsl:call-template name="process.footnotes.in.this.chunk">
+ <xsl:with-param name="node" select="$node"/>
+ <xsl:with-param name="footnotes" select="$footnotes[position() &gt; 1]"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="$footnotes[1]/ancestor::table |$footnotes[1]/ancestor::informaltable">
+ <xsl:call-template name="process.footnotes.in.this.chunk">
+ <xsl:with-param name="node" select="$node"/>
+ <xsl:with-param name="footnotes" select="$footnotes[position() &gt; 1]"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="$footnotes[1]" mode="process.footnote.mode"/>
+ <xsl:call-template name="process.footnotes.in.this.chunk">
+ <xsl:with-param name="node" select="$node"/>
+ <xsl:with-param name="footnotes" select="$footnotes[position() &gt; 1]"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="process.footnotes">
+ <xsl:variable name="footnotes" select=".//footnote"/>
+ <xsl:variable name="fcount">
+ <xsl:call-template name="count.footnotes.in.this.chunk">
+ <xsl:with-param name="node" select="."/>
+ <xsl:with-param name="footnotes" select="$footnotes"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+<!--
+ <xsl:message>
+ <xsl:value-of select="name(.)"/>
+ <xsl:text> fcount: </xsl:text>
+ <xsl:value-of select="$fcount"/>
+ </xsl:message>
+-->
+
+ <!-- Only bother to do this if there's at least one non-table footnote -->
+ <xsl:if test="$fcount &gt; 0">
+ <div class="footnotes">
+ <br/>
+ <hr width="100" align="{$direction.align.start}"/>
+ <xsl:call-template name="process.footnotes.in.this.chunk">
+ <xsl:with-param name="node" select="."/>
+ <xsl:with-param name="footnotes" select="$footnotes"/>
+ </xsl:call-template>
+ </div>
+ </xsl:if>
+
+ <!-- FIXME: When chunking, only the annotations actually used
+ in this chunk should be referenced. I don't think it
+ does any harm to reference them all, but it adds
+ unnecessary bloat to each chunk. -->
+ <xsl:if test="$annotation.support != 0 and //annotation">
+ <div class="annotation-list">
+ <div class="annotation-nocss">
+ <p>The following annotations are from this essay. You are seeing
+ them here because your browser doesn&#8217;t support the user-interface
+ techniques used to make them appear as &#8216;popups&#8217; on modern browsers.</p>
+ </div>
+
+ <xsl:apply-templates select="//annotation" mode="annotation-popup"/>
+ </div>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template name="process.chunk.footnotes">
+ <xsl:variable name="is.chunk">
+ <xsl:call-template name="chunk"/>
+ </xsl:variable>
+ <xsl:if test="$is.chunk = 1">
+ <xsl:call-template name="process.footnotes"/>
+ </xsl:if>
+</xsl:template>
+
+<!-- ====================================================================== -->
+
+<xsl:template name="chunk">
+ <xsl:param name="node" select="."/>
+ <!-- returns 1 if $node is a chunk -->
+
+ <!-- ==================================================================== -->
+ <!-- What's a chunk?
+
+ The root element
+ appendix
+ article
+ bibliography in article or part or book
+ book
+ chapter
+ colophon
+ glossary in article or part or book
+ index in article or part or book
+ part
+ preface
+ refentry
+ reference
+ sect{1,2,3,4,5} if position()>1 && depth < chunk.section.depth
+ section if position()>1 && depth < chunk.section.depth
+ set
+ setindex
+ -->
+ <!-- ==================================================================== -->
+
+<!--
+ <xsl:message>
+ <xsl:text>chunk: </xsl:text>
+ <xsl:value-of select="name($node)"/>
+ <xsl:text>(</xsl:text>
+ <xsl:value-of select="$node/@id"/>
+ <xsl:text>)</xsl:text>
+ <xsl:text> csd: </xsl:text>
+ <xsl:value-of select="$chunk.section.depth"/>
+ <xsl:text> cfs: </xsl:text>
+ <xsl:value-of select="$chunk.first.sections"/>
+ <xsl:text> ps: </xsl:text>
+ <xsl:value-of select="count($node/parent::section)"/>
+ <xsl:text> prs: </xsl:text>
+ <xsl:value-of select="count($node/preceding-sibling::section)"/>
+ </xsl:message>
+-->
+
+ <xsl:choose>
+ <xsl:when test="$node/parent::*/processing-instruction('dbhtml')[normalize-space(.) = 'stop-chunking']">0</xsl:when>
+ <xsl:when test="not($node/parent::*)">1</xsl:when>
+
+ <xsl:when test="local-name($node) = 'sect1' and $chunk.section.depth &gt;= 1 and ($chunk.first.sections != 0 or count($node/preceding-sibling::sect1) &gt; 0)">
+ <xsl:text>1</xsl:text>
+ </xsl:when>
+ <xsl:when test="local-name($node) = 'sect2' and $chunk.section.depth &gt;= 2 and ($chunk.first.sections != 0 or count($node/preceding-sibling::sect2) &gt; 0)">
+ <xsl:call-template name="chunk">
+ <xsl:with-param name="node" select="$node/parent::*"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="local-name($node) = 'sect3' and $chunk.section.depth &gt;= 3 and ($chunk.first.sections != 0 or count($node/preceding-sibling::sect3) &gt; 0)">
+ <xsl:call-template name="chunk">
+ <xsl:with-param name="node" select="$node/parent::*"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="local-name($node) = 'sect4' and $chunk.section.depth &gt;= 4 and ($chunk.first.sections != 0 or count($node/preceding-sibling::sect4) &gt; 0)">
+ <xsl:call-template name="chunk">
+ <xsl:with-param name="node" select="$node/parent::*"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="local-name($node) = 'sect5' and $chunk.section.depth &gt;= 5 and ($chunk.first.sections != 0 or count($node/preceding-sibling::sect5) &gt; 0)">
+ <xsl:call-template name="chunk">
+ <xsl:with-param name="node" select="$node/parent::*"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="local-name($node) = 'section' and $chunk.section.depth &gt;= count($node/ancestor::section)+1 and ($chunk.first.sections != 0 or count($node/preceding-sibling::section) &gt; 0)">
+ <xsl:call-template name="chunk">
+ <xsl:with-param name="node" select="$node/parent::*"/>
+ </xsl:call-template>
+ </xsl:when>
+
+ <xsl:when test="local-name($node)='preface'">1</xsl:when>
+ <xsl:when test="local-name($node)='chapter'">1</xsl:when>
+ <xsl:when test="local-name($node)='appendix'">1</xsl:when>
+ <xsl:when test="local-name($node)='article'">1</xsl:when>
+ <xsl:when test="local-name($node)='part'">1</xsl:when>
+ <xsl:when test="local-name($node)='reference'">1</xsl:when>
+ <xsl:when test="local-name($node)='refentry'">1</xsl:when>
+ <xsl:when test="local-name($node)='index' and ($generate.index != 0 or count($node/*) &gt; 0) and (local-name($node/parent::*) = 'article' or local-name($node/parent::*) = 'book' or local-name($node/parent::*) = 'part' )">1</xsl:when>
+ <xsl:when test="local-name($node)='bibliography' and (local-name($node/parent::*) = 'article' or local-name($node/parent::*) = 'book' or local-name($node/parent::*) = 'part' )">1</xsl:when>
+ <xsl:when test="local-name($node)='glossary' and (local-name($node/parent::*) = 'article' or local-name($node/parent::*) = 'book' or local-name($node/parent::*) = 'part' )">1</xsl:when>
+ <xsl:when test="local-name($node)='colophon'">1</xsl:when>
+ <xsl:when test="local-name($node)='book'">1</xsl:when>
+ <xsl:when test="local-name($node)='set'">1</xsl:when>
+ <xsl:when test="local-name($node)='setindex'">1</xsl:when>
+ <xsl:when test="local-name($node)='legalnotice' and $generate.legalnotice.link != 0">1</xsl:when>
+ <xsl:otherwise>0</xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ==================================================================== -->
+<xsl:template name="href.target.uri">
+ <xsl:param name="object" select="."/>
+ <xsl:variable name="ischunk">
+ <xsl:call-template name="chunk">
+ <xsl:with-param name="node" select="$object"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:apply-templates mode="chunk-filename" select="$object"/>
+
+ <xsl:if test="$ischunk='0'">
+ <xsl:text>#</xsl:text>
+ <xsl:call-template name="object.id">
+ <xsl:with-param name="object" select="$object"/>
+ </xsl:call-template>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template name="href.target">
+ <xsl:param name="context" select="."/>
+ <xsl:param name="object" select="."/>
+ <xsl:param name="toc-context" select="."/>
+ <!-- * If $toc-context contains some node other than the current node, -->
+ <!-- * it means we're processing a link in a TOC. In that case, to -->
+ <!-- * ensure the link will work correctly, we need to take a look at -->
+ <!-- * where the file containing the TOC will get written, and where -->
+ <!-- * the file that's being linked to will get written. -->
+ <xsl:variable name="toc-output-dir">
+ <xsl:if test="not($toc-context = .)">
+ <!-- * Get the $toc-context node and all its ancestors, look down -->
+ <!-- * through them to find the last/closest node to the -->
+ <!-- * toc-context node that has a "dbhtml dir" PI, and get the -->
+ <!-- * directory name from that. That's the name of the directory -->
+ <!-- * to which the current toc output file will get written. -->
+ <xsl:call-template name="dbhtml-dir">
+ <xsl:with-param name="context" select="$toc-context/ancestor-or-self::*[processing-instruction('dbhtml')[contains(.,'dir')]][last()]"/>
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:variable>
+ <xsl:variable name="linked-file-output-dir">
+ <xsl:if test="not($toc-context = .)">
+ <!-- * Get the current node and all its ancestors, look down -->
+ <!-- * through them to find the last/closest node to the current -->
+ <!-- * node that has a "dbhtml dir" PI, and get the directory name -->
+ <!-- * from that. That's the name of the directory to which the -->
+ <!-- * file that's being linked to will get written. -->
+ <xsl:call-template name="dbhtml-dir">
+ <xsl:with-param name="context" select="ancestor-or-self::*[processing-instruction('dbhtml')[contains(.,'dir')]][last()]"/>
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:variable>
+ <xsl:variable name="href.to.uri">
+ <xsl:call-template name="href.target.uri">
+ <xsl:with-param name="object" select="$object"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:variable name="href.from.uri">
+ <xsl:choose>
+ <xsl:when test="not($toc-context = .)">
+ <xsl:call-template name="href.target.uri">
+ <xsl:with-param name="object" select="$toc-context"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="href.target.uri">
+ <xsl:with-param name="object" select="$context"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <!-- * <xsl:message>toc-context: <xsl:value-of select="local-name($toc-context)"/></xsl:message> -->
+ <!-- * <xsl:message>node: <xsl:value-of select="local-name(.)"/></xsl:message> -->
+ <!-- * <xsl:message>context: <xsl:value-of select="local-name($context)"/></xsl:message> -->
+ <!-- * <xsl:message>object: <xsl:value-of select="local-name($object)"/></xsl:message> -->
+ <!-- * <xsl:message>toc-output-dir: <xsl:value-of select="$toc-output-dir"/></xsl:message> -->
+ <!-- * <xsl:message>linked-file-output-dir: <xsl:value-of select="$linked-file-output-dir"/></xsl:message> -->
+ <!-- * <xsl:message>href.to.uri: <xsl:value-of select="$href.to.uri"/></xsl:message> -->
+ <!-- * <xsl:message>href.from.uri: <xsl:value-of select="$href.from.uri"/></xsl:message> -->
+ <xsl:variable name="href.to">
+ <xsl:choose>
+ <!-- * 2007-07-19, MikeSmith: Added the following conditional to -->
+ <!-- * deal with a problem case for links in TOCs. It checks to see -->
+ <!-- * if the output dir that a TOC will get written to is -->
+ <!-- * different from the output dir of the file being linked to. -->
+ <!-- * If it is different, we do not call trim.common.uri.paths. -->
+ <!-- * -->
+ <!-- * Reason why I added that conditional is: I ran into a bug for -->
+ <!-- * this case: -->
+ <!-- * -->
+ <!-- * 1. we are chunking into separate dirs -->
+ <!-- * -->
+ <!-- * 2. output for the TOC is written to current dir, but the file -->
+ <!-- * being linked to is written to some subdir "foo". -->
+ <!-- * -->
+ <!-- * For that case, links to that file in that TOC did not show -->
+ <!-- * the correct path - they omitted the "foo". -->
+ <!-- * -->
+ <!-- * The cause of that problem was that the trim.common.uri.paths -->
+ <!-- * template[1] was being called under all conditions. But it's -->
+ <!-- * apparent that we don't want to call trim.common.uri.paths in -->
+ <!-- * the case where a linked file is being written to a different -->
+ <!-- * directory than the TOC that contains the link, because doing -->
+ <!-- * so will cause a necessary (not redundant) directory-name -->
+ <!-- * part of the link to get inadvertently trimmed, resulting in -->
+ <!-- * a broken link to that file. Thus, added the conditional. -->
+ <!-- * -->
+ <!-- * [1] The purpose of the trim.common.uri.paths template is to -->
+ <!-- * prevent cases where, if we didn't call it, we end up with -->
+ <!-- * unnecessary, redundant directory names getting output; for -->
+ <!-- * example, "foo/foo/refname.html". -->
+ <xsl:when test="not($toc-output-dir = $linked-file-output-dir)">
+ <xsl:value-of select="$href.to.uri"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="trim.common.uri.paths">
+ <xsl:with-param name="uriA" select="$href.to.uri"/>
+ <xsl:with-param name="uriB" select="$href.from.uri"/>
+ <xsl:with-param name="return" select="'A'"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:variable name="href.from">
+ <xsl:call-template name="trim.common.uri.paths">
+ <xsl:with-param name="uriA" select="$href.to.uri"/>
+ <xsl:with-param name="uriB" select="$href.from.uri"/>
+ <xsl:with-param name="return" select="'B'"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:variable name="depth">
+ <xsl:call-template name="count.uri.path.depth">
+ <xsl:with-param name="filename" select="$href.from"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:variable name="href">
+ <xsl:call-template name="copy-string">
+ <xsl:with-param name="string" select="'../'"/>
+ <xsl:with-param name="count" select="$depth"/>
+ </xsl:call-template>
+ <xsl:value-of select="$href.to"/>
+ </xsl:variable>
+ <!--
+ <xsl:message>
+ <xsl:text>In </xsl:text>
+ <xsl:value-of select="name(.)"/>
+ <xsl:text> (</xsl:text>
+ <xsl:value-of select="$href.from"/>
+ <xsl:text>,</xsl:text>
+ <xsl:value-of select="$depth"/>
+ <xsl:text>) </xsl:text>
+ <xsl:value-of select="name($object)"/>
+ <xsl:text> href=</xsl:text>
+ <xsl:value-of select="$href"/>
+ </xsl:message>
+ -->
+ <xsl:value-of select="$href"/>
+</xsl:template>
+
+<!-- Returns the complete olink href value if found -->
+<!-- Must take into account any dbhtml dir of the chunk containing the olink -->
+<xsl:template name="make.olink.href">
+ <xsl:param name="olink.key" select="''"/>
+ <xsl:param name="target.database"/>
+
+ <xsl:if test="$olink.key != ''">
+ <xsl:variable name="target.href">
+ <xsl:for-each select="$target.database">
+ <xsl:value-of select="key('targetptr-key', $olink.key)[1]/@href"/>
+ </xsl:for-each>
+ </xsl:variable>
+
+ <!-- an olink starting point may be in a subdirectory, so need
+ the "from" reference point to compute a relative path -->
+
+ <xsl:variable name="from.href">
+ <xsl:call-template name="olink.from.uri">
+ <xsl:with-param name="target.database" select="$target.database"/>
+ <xsl:with-param name="object" select="."/>
+ <xsl:with-param name="object.targetdoc" select="$current.docid"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <!-- If the from.href has directory path, then must "../" upward
+ to document level -->
+ <xsl:variable name="upward.from.path">
+ <xsl:call-template name="upward.path">
+ <xsl:with-param name="path" select="$from.href"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="targetdoc">
+ <xsl:value-of select="substring-before($olink.key, '/')"/>
+ </xsl:variable>
+
+ <!-- Does the target database use a sitemap? -->
+ <xsl:variable name="use.sitemap">
+ <xsl:choose>
+ <xsl:when test="$target.database//sitemap">1</xsl:when>
+ <xsl:otherwise>0</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+
+ <!-- Get the baseuri for this targetptr -->
+ <xsl:variable name="baseuri">
+ <xsl:choose>
+ <!-- Does the database use a sitemap? -->
+ <xsl:when test="$use.sitemap != 0">
+ <xsl:choose>
+ <!-- Was current.docid parameter set? -->
+ <xsl:when test="$current.docid != ''">
+ <!-- Was it found in the database? -->
+ <xsl:variable name="currentdoc.key">
+ <xsl:for-each select="$target.database">
+ <xsl:value-of select="key('targetdoc-key', $current.docid)/@targetdoc"/>
+ </xsl:for-each>
+ </xsl:variable>
+ <xsl:choose>
+ <xsl:when test="$currentdoc.key != ''">
+ <xsl:for-each select="$target.database">
+ <xsl:call-template name="targetpath">
+ <xsl:with-param name="dirnode" select="key('targetdoc-key', $current.docid)/parent::dir"/>
+ <xsl:with-param name="targetdoc" select="$targetdoc"/>
+ </xsl:call-template>
+ </xsl:for-each>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:message>
+ <xsl:text>Olink error: cannot compute relative </xsl:text>
+ <xsl:text>sitemap path because $current.docid '</xsl:text>
+ <xsl:value-of select="$current.docid"/>
+ <xsl:text>' not found in target database.</xsl:text>
+ </xsl:message>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:message>
+ <xsl:text>Olink warning: cannot compute relative </xsl:text>
+ <xsl:text>sitemap path without $current.docid parameter</xsl:text>
+ </xsl:message>
+ </xsl:otherwise>
+ </xsl:choose>
+ <!-- In either case, add baseuri from its document entry-->
+ <xsl:variable name="docbaseuri">
+ <xsl:for-each select="$target.database">
+ <xsl:value-of select="key('targetdoc-key', $targetdoc)/@baseuri"/>
+ </xsl:for-each>
+ </xsl:variable>
+ <xsl:if test="$docbaseuri != ''">
+ <xsl:value-of select="$docbaseuri"/>
+ </xsl:if>
+ </xsl:when>
+ <!-- No database sitemap in use -->
+ <xsl:otherwise>
+ <!-- Just use any baseuri from its document entry -->
+ <xsl:variable name="docbaseuri">
+ <xsl:for-each select="$target.database">
+ <xsl:value-of select="key('targetdoc-key', $targetdoc)/@baseuri"/>
+ </xsl:for-each>
+ </xsl:variable>
+ <xsl:if test="$docbaseuri != ''">
+ <xsl:value-of select="$docbaseuri"/>
+ </xsl:if>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <!-- Form the href information -->
+ <xsl:if test="not(contains($baseuri, ':'))">
+ <!-- if not an absolute uri, add upward path from olink chunk -->
+ <xsl:value-of select="$upward.from.path"/>
+ </xsl:if>
+
+ <xsl:if test="$baseuri != ''">
+ <xsl:value-of select="$baseuri"/>
+ <xsl:if test="substring($target.href,1,1) != '#'">
+ <!--xsl:text>/</xsl:text-->
+ </xsl:if>
+ </xsl:if>
+ <!-- optionally turn off frag for PDF references -->
+ <xsl:if test="not($insert.olink.pdf.frag = 0 and translate(substring($baseuri, string-length($baseuri) - 3), 'PDF', 'pdf') = '.pdf' and starts-with($target.href, '#') )">
+ <xsl:value-of select="$target.href"/>
+ </xsl:if>
+ </xsl:if>
+</xsl:template>
+
+<!-- Computes "../" to reach top -->
+<xsl:template name="upward.path">
+ <xsl:param name="path" select="''"/>
+ <xsl:choose>
+ <!-- Don't bother with absolute uris -->
+ <xsl:when test="contains($path, ':')"/>
+ <xsl:when test="starts-with($path, '/')"/>
+ <xsl:when test="contains($path, '/')">
+ <xsl:text>../</xsl:text>
+ <xsl:call-template name="upward.path">
+ <xsl:with-param name="path" select="substring-after($path, '/')"/>
+ </xsl:call-template>
+ </xsl:when>
+ </xsl:choose>
+
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template name="html.head">
+ <xsl:param name="prev" select="/foo"/>
+ <xsl:param name="next" select="/foo"/>
+ <xsl:variable name="this" select="."/>
+ <xsl:variable name="home" select="/*[1]"/>
+ <xsl:variable name="up" select="parent::*"/>
+
+ <head>
+ <xsl:call-template name="system.head.content"/>
+ <xsl:call-template name="head.content"/>
+
+ <xsl:if test="$home">
+ <link rel="home">
+ <xsl:attribute name="href">
+ <xsl:call-template name="href.target">
+ <xsl:with-param name="object" select="$home"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:attribute name="title">
+ <xsl:apply-templates select="$home" mode="object.title.markup.textonly"/>
+ </xsl:attribute>
+ </link>
+ </xsl:if>
+
+ <xsl:if test="$up">
+ <link rel="up">
+ <xsl:attribute name="href">
+ <xsl:call-template name="href.target">
+ <xsl:with-param name="object" select="$up"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:attribute name="title">
+ <xsl:apply-templates select="$up" mode="object.title.markup.textonly"/>
+ </xsl:attribute>
+ </link>
+ </xsl:if>
+
+ <xsl:if test="$prev">
+ <link rel="prev">
+ <xsl:attribute name="href">
+ <xsl:call-template name="href.target">
+ <xsl:with-param name="object" select="$prev"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:attribute name="title">
+ <xsl:apply-templates select="$prev" mode="object.title.markup.textonly"/>
+ </xsl:attribute>
+ </link>
+ </xsl:if>
+
+ <xsl:if test="$next">
+ <link rel="next">
+ <xsl:attribute name="href">
+ <xsl:call-template name="href.target">
+ <xsl:with-param name="object" select="$next"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:attribute name="title">
+ <xsl:apply-templates select="$next" mode="object.title.markup.textonly"/>
+ </xsl:attribute>
+ </link>
+ </xsl:if>
+
+ <xsl:if test="$html.extra.head.links != 0">
+ <xsl:for-each select="//part |//reference |//preface |//chapter |//article |//refentry |//appendix[not(parent::article)]|appendix |//glossary[not(parent::article)]|glossary |//index[not(parent::article)]|index">
+ <link rel="{local-name(.)}">
+ <xsl:attribute name="href">
+ <xsl:call-template name="href.target">
+ <xsl:with-param name="context" select="$this"/>
+ <xsl:with-param name="object" select="."/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:attribute name="title">
+ <xsl:apply-templates select="." mode="object.title.markup.textonly"/>
+ </xsl:attribute>
+ </link>
+ </xsl:for-each>
+
+ <xsl:for-each select="section|sect1|refsection|refsect1">
+ <link>
+ <xsl:attribute name="rel">
+ <xsl:choose>
+ <xsl:when test="local-name($this) = 'section' or local-name($this) = 'refsection'">
+ <xsl:value-of select="'subsection'"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="'section'"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:attribute>
+ <xsl:attribute name="href">
+ <xsl:call-template name="href.target">
+ <xsl:with-param name="context" select="$this"/>
+ <xsl:with-param name="object" select="."/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:attribute name="title">
+ <xsl:apply-templates select="." mode="object.title.markup.textonly"/>
+ </xsl:attribute>
+ </link>
+ </xsl:for-each>
+
+ <xsl:for-each select="sect2|sect3|sect4|sect5|refsect2|refsect3">
+ <link rel="subsection">
+ <xsl:attribute name="href">
+ <xsl:call-template name="href.target">
+ <xsl:with-param name="context" select="$this"/>
+ <xsl:with-param name="object" select="."/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:attribute name="title">
+ <xsl:apply-templates select="." mode="object.title.markup.textonly"/>
+ </xsl:attribute>
+ </link>
+ </xsl:for-each>
+ </xsl:if>
+
+ <!-- * if we have a legalnotice and user wants it output as a -->
+ <!-- * separate page and $html.head.legalnotice.link.types is -->
+ <!-- * non-empty, we generate a link or links for each value in -->
+ <!-- * $html.head.legalnotice.link.types -->
+ <xsl:if test="//legalnotice and not($generate.legalnotice.link = 0) and not($html.head.legalnotice.link.types = '')">
+ <xsl:call-template name="make.legalnotice.head.links"/>
+ </xsl:if>
+
+ <xsl:call-template name="user.head.content"/>
+ </head>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template name="header.navigation">
+ <xsl:param name="prev" select="/foo"/>
+ <xsl:param name="next" select="/foo"/>
+ <xsl:param name="nav.context"/>
+
+ <xsl:variable name="home" select="/*[1]"/>
+ <xsl:variable name="up" select="parent::*"/>
+
+ <xsl:variable name="row1" select="$navig.showtitles != 0"/>
+ <xsl:variable name="row2" select="count($prev) &gt; 0 or (count($up) &gt; 0 and generate-id($up) != generate-id($home) and $navig.showtitles != 0) or count($next) &gt; 0"/>
+
+ <xsl:if test="$suppress.navigation = '0' and $suppress.header.navigation = '0'">
+ <div class="navheader">
+ <xsl:if test="$row1 or $row2">
+ <table width="100%" summary="Navigation header">
+ <xsl:if test="$row1">
+ <tr>
+ <th colspan="3" align="center">
+ <xsl:apply-templates select="." mode="object.title.markup"/>
+ </th>
+ </tr>
+ </xsl:if>
+
+ <xsl:if test="$row2">
+ <tr>
+ <td width="20%" align="{$direction.align.start}">
+ <xsl:if test="count($prev)&gt;0">
+ <a accesskey="p">
+ <xsl:attribute name="href">
+ <xsl:call-template name="href.target">
+ <xsl:with-param name="object" select="$prev"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:call-template name="navig.content">
+ <xsl:with-param name="direction" select="'prev'"/>
+ </xsl:call-template>
+ </a>
+ </xsl:if>
+ <xsl:text>&#160;</xsl:text>
+ </td>
+ <th width="60%" align="center">
+ <xsl:choose>
+ <xsl:when test="count($up) &gt; 0 and generate-id($up) != generate-id($home) and $navig.showtitles != 0">
+ <xsl:apply-templates select="$up" mode="object.title.markup"/>
+ </xsl:when>
+ <xsl:otherwise>&#160;</xsl:otherwise>
+ </xsl:choose>
+ </th>
+ <td width="20%" align="{$direction.align.end}">
+ <xsl:text>&#160;</xsl:text>
+ <xsl:if test="count($next)&gt;0">
+ <a accesskey="n">
+ <xsl:attribute name="href">
+ <xsl:call-template name="href.target">
+ <xsl:with-param name="object" select="$next"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:call-template name="navig.content">
+ <xsl:with-param name="direction" select="'next'"/>
+ </xsl:call-template>
+ </a>
+ </xsl:if>
+ </td>
+ </tr>
+ </xsl:if>
+ </table>
+ </xsl:if>
+ <xsl:if test="$header.rule != 0">
+ <hr/>
+ </xsl:if>
+ </div>
+ </xsl:if>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template name="footer.navigation">
+ <xsl:param name="prev" select="/foo"/>
+ <xsl:param name="next" select="/foo"/>
+ <xsl:param name="nav.context"/>
+
+ <xsl:variable name="home" select="/*[1]"/>
+ <xsl:variable name="up" select="parent::*"/>
+
+ <xsl:variable name="row1" select="count($prev) &gt; 0 or count($up) &gt; 0 or count($next) &gt; 0"/>
+
+ <xsl:variable name="row2" select="($prev and $navig.showtitles != 0) or (generate-id($home) != generate-id(.) or $nav.context = 'toc') or ($chunk.tocs.and.lots != 0 and $nav.context != 'toc') or ($next and $navig.showtitles != 0)"/>
+
+ <xsl:if test="$suppress.navigation = '0' and $suppress.footer.navigation = '0'">
+ <div class="navfooter">
+ <xsl:if test="$footer.rule != 0">
+ <hr/>
+ </xsl:if>
+
+ <xsl:if test="$row1 or $row2">
+ <table width="100%" summary="Navigation footer">
+ <xsl:if test="$row1">
+ <tr>
+ <td width="40%" align="{$direction.align.start}">
+ <xsl:if test="count($prev)&gt;0">
+ <a accesskey="p">
+ <xsl:attribute name="href">
+ <xsl:call-template name="href.target">
+ <xsl:with-param name="object" select="$prev"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:call-template name="navig.content">
+ <xsl:with-param name="direction" select="'prev'"/>
+ </xsl:call-template>
+ </a>
+ </xsl:if>
+ <xsl:text>&#160;</xsl:text>
+ </td>
+ <td width="20%" align="center">
+ <xsl:choose>
+ <xsl:when test="count($up)&gt;0 and generate-id($up) != generate-id($home)">
+ <a accesskey="u">
+ <xsl:attribute name="href">
+ <xsl:call-template name="href.target">
+ <xsl:with-param name="object" select="$up"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:call-template name="navig.content">
+ <xsl:with-param name="direction" select="'up'"/>
+ </xsl:call-template>
+ </a>
+ </xsl:when>
+ <xsl:otherwise>&#160;</xsl:otherwise>
+ </xsl:choose>
+ </td>
+ <td width="40%" align="{$direction.align.end}">
+ <xsl:text>&#160;</xsl:text>
+ <xsl:if test="count($next)&gt;0">
+ <a accesskey="n">
+ <xsl:attribute name="href">
+ <xsl:call-template name="href.target">
+ <xsl:with-param name="object" select="$next"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:call-template name="navig.content">
+ <xsl:with-param name="direction" select="'next'"/>
+ </xsl:call-template>
+ </a>
+ </xsl:if>
+ </td>
+ </tr>
+ </xsl:if>
+
+ <xsl:if test="$row2">
+ <tr>
+ <td width="40%" align="{$direction.align.start}" valign="top">
+ <xsl:if test="$navig.showtitles != 0">
+ <xsl:apply-templates select="$prev" mode="object.title.markup"/>
+ </xsl:if>
+ <xsl:text>&#160;</xsl:text>
+ </td>
+ <td width="20%" align="center">
+ <xsl:choose>
+ <xsl:when test="$home != . or $nav.context = 'toc'">
+ <a accesskey="h">
+ <xsl:attribute name="href">
+ <xsl:call-template name="href.target">
+ <xsl:with-param name="object" select="$home"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:call-template name="navig.content">
+ <xsl:with-param name="direction" select="'home'"/>
+ </xsl:call-template>
+ </a>
+ <xsl:if test="$chunk.tocs.and.lots != 0 and $nav.context != 'toc'">
+ <xsl:text>&#160;|&#160;</xsl:text>
+ </xsl:if>
+ </xsl:when>
+ <xsl:otherwise>&#160;</xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:if test="$chunk.tocs.and.lots != 0 and $nav.context != 'toc'">
+ <a accesskey="t">
+ <xsl:attribute name="href">
+ <xsl:apply-templates select="/*[1]" mode="recursive-chunk-filename">
+ <xsl:with-param name="recursive" select="true()"/>
+ </xsl:apply-templates>
+ <xsl:text>-toc</xsl:text>
+ <xsl:value-of select="$html.ext"/>
+ </xsl:attribute>
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'nav-toc'"/>
+ </xsl:call-template>
+ </a>
+ </xsl:if>
+ </td>
+ <td width="40%" align="{$direction.align.end}" valign="top">
+ <xsl:text>&#160;</xsl:text>
+ <xsl:if test="$navig.showtitles != 0">
+ <xsl:apply-templates select="$next" mode="object.title.markup"/>
+ </xsl:if>
+ </td>
+ </tr>
+ </xsl:if>
+ </table>
+ </xsl:if>
+ </div>
+ </xsl:if>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template name="navig.content">
+ <xsl:param name="direction" select="next"/>
+ <xsl:variable name="navtext">
+ <xsl:choose>
+ <xsl:when test="$direction = 'prev'">
+ <xsl:call-template name="gentext.nav.prev"/>
+ </xsl:when>
+ <xsl:when test="$direction = 'next'">
+ <xsl:call-template name="gentext.nav.next"/>
+ </xsl:when>
+ <xsl:when test="$direction = 'up'">
+ <xsl:call-template name="gentext.nav.up"/>
+ </xsl:when>
+ <xsl:when test="$direction = 'home'">
+ <xsl:call-template name="gentext.nav.home"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text>xxx</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="$navig.graphics != 0">
+ <img>
+ <xsl:attribute name="src">
+ <xsl:value-of select="$navig.graphics.path"/>
+ <xsl:value-of select="$direction"/>
+ <xsl:value-of select="$navig.graphics.extension"/>
+ </xsl:attribute>
+ <xsl:attribute name="alt">
+ <xsl:value-of select="$navtext"/>
+ </xsl:attribute>
+ </img>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$navtext"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<!-- * The following template assumes that the first legalnotice -->
+<!-- * instance found in a document applies to the contents of the -->
+<!-- * entire document. It generates an HTML link in each chunk, back -->
+<!-- * to the file containing the contents of the first legalnotice. -->
+<!-- * -->
+<!-- * Actually, it may generate multiple link instances in each chunk, -->
+<!-- * because it walks through the space-separated list of link -->
+<!-- * types specified in the $html.head.legalnotice.link.types param, -->
+<!-- * popping off link types and generating links for them until it -->
+<!-- * depletes the list. -->
+
+<xsl:template name="make.legalnotice.head.links">
+ <!-- * the following ID is used as part of the legalnotice filename; -->
+ <!-- * we need it in order to construct the filename for use in the -->
+ <!-- * value of the href attribute on the link -->
+
+ <xsl:param name="ln-node" select="(//legalnotice)[1]"/>
+
+ <xsl:param name="linktype">
+ <xsl:choose>
+ <xsl:when test="contains($html.head.legalnotice.link.types, ' ')">
+ <xsl:value-of select="normalize-space( substring-before($html.head.legalnotice.link.types, ' '))"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$html.head.legalnotice.link.types"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:param>
+ <xsl:param name="remaining.linktypes" select="concat( normalize-space( substring-after($html.head.legalnotice.link.types, ' ')),' ')"/>
+ <xsl:if test="not($linktype = '')">
+
+ <!-- Compute name of legalnotice file (see titlepage.xsl) -->
+ <xsl:variable name="file">
+ <xsl:call-template name="ln.or.rh.filename">
+ <xsl:with-param name="node" select="$ln-node"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <link rel="{$linktype}">
+ <xsl:attribute name="href">
+ <xsl:value-of select="$file"/>
+ </xsl:attribute>
+ <xsl:attribute name="title">
+ <xsl:apply-templates select="(//legalnotice)[1]" mode="object.title.markup.textonly"/>
+ </xsl:attribute>
+ </link>
+ <xsl:call-template name="make.legalnotice.head.links">
+ <!-- * pop the next value off the list of link types -->
+ <xsl:with-param name="linktype" select="substring-before($remaining.linktypes, ' ')"/>
+ <!-- * remove the link type from the list of remaining link types -->
+ <xsl:with-param name="remaining.linktypes" select="substring-after($remaining.linktypes, ' ')"/>
+ </xsl:call-template>
+ </xsl:if>
+</xsl:template>
+
+<!-- ==================================================================== -->
+<xsl:template name="chunk-element-content">
+ <xsl:param name="prev"/>
+ <xsl:param name="next"/>
+ <xsl:param name="nav.context"/>
+ <xsl:param name="content">
+ <xsl:apply-imports/>
+ </xsl:param>
+
+ <xsl:call-template name="user.preroot"/>
+
+ <html>
+ <xsl:call-template name="html.head">
+ <xsl:with-param name="prev" select="$prev"/>
+ <xsl:with-param name="next" select="$next"/>
+ </xsl:call-template>
+
+ <body>
+ <xsl:call-template name="body.attributes"/>
+ <xsl:call-template name="user.header.navigation"/>
+
+ <xsl:call-template name="header.navigation">
+ <xsl:with-param name="prev" select="$prev"/>
+ <xsl:with-param name="next" select="$next"/>
+ <xsl:with-param name="nav.context" select="$nav.context"/>
+ </xsl:call-template>
+
+ <xsl:call-template name="user.header.content"/>
+
+ <xsl:copy-of select="$content"/>
+
+ <xsl:call-template name="user.footer.content"/>
+
+ <xsl:call-template name="footer.navigation">
+ <xsl:with-param name="prev" select="$prev"/>
+ <xsl:with-param name="next" select="$next"/>
+ <xsl:with-param name="nav.context" select="$nav.context"/>
+ </xsl:call-template>
+
+ <xsl:call-template name="user.footer.navigation"/>
+ </body>
+ </html>
+ <xsl:value-of select="$chunk.append"/>
+</xsl:template>
+
+<!-- ==================================================================== -->
+<xsl:template name="generate.manifest">
+ <xsl:param name="node" select="/"/>
+ <xsl:call-template name="write.text.chunk">
+ <xsl:with-param name="filename">
+ <xsl:if test="$manifest.in.base.dir != 0">
+ <xsl:value-of select="$base.dir"/>
+ </xsl:if>
+ <xsl:value-of select="$manifest"/>
+ </xsl:with-param>
+ <xsl:with-param name="method" select="'text'"/>
+ <xsl:with-param name="content">
+ <xsl:apply-templates select="$node" mode="enumerate-files"/>
+ </xsl:with-param>
+ <xsl:with-param name="encoding" select="$chunker.output.encoding"/>
+ </xsl:call-template>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template name="dbhtml-dir">
+ <xsl:param name="context" select="."/>
+ <!-- directories are now inherited from previous levels -->
+ <xsl:variable name="ppath">
+ <xsl:if test="$context/parent::*">
+ <xsl:call-template name="dbhtml-dir">
+ <xsl:with-param name="context" select="$context/parent::*"/>
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:variable>
+ <xsl:variable name="path">
+ <xsl:call-template name="pi.dbhtml_dir">
+ <xsl:with-param name="node" select="$context"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:choose>
+ <xsl:when test="$path = ''">
+ <xsl:if test="$ppath != ''">
+ <xsl:value-of select="$ppath"/>
+ </xsl:if>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:if test="$ppath != ''">
+ <xsl:value-of select="$ppath"/>
+ <xsl:if test="substring($ppath, string-length($ppath), 1) != '/'">
+ <xsl:text>/</xsl:text>
+ </xsl:if>
+ </xsl:if>
+ <xsl:value-of select="$path"/>
+ <xsl:text>/</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/chunk.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/chunk.xsl
new file mode 100644
index 0000000..6b74923
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/chunk.xsl
@@ -0,0 +1,52 @@
+<?xml version="1.0" encoding="ASCII"?>
+<!--This file was created automatically by html2xhtml-->
+<!--from the HTML stylesheets.-->
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:exsl="http://exslt.org/common" xmlns="http://www.w3.org/1999/xhtml" version="1.0" exclude-result-prefixes="exsl">
+
+<!-- ********************************************************************
+ $Id: chunk.xsl 6910 2007-06-28 23:23:30Z xmldoc $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<!-- ==================================================================== -->
+
+<!-- First import the non-chunking templates that format elements
+ within each chunk file. In a customization, you should
+ create a separate non-chunking customization layer such
+ as mydocbook.xsl that imports the original docbook.xsl and
+ customizes any presentation templates. Then your chunking
+ customization should import mydocbook.xsl instead of
+ docbook.xsl. -->
+<xsl:import href="docbook.xsl"/>
+
+<!-- chunk-common.xsl contains all the named templates for chunking.
+ In a customization file, you import chunk-common.xsl, then
+ add any customized chunking templates of the same name.
+ They will have import precedence over the original
+ chunking templates in chunk-common.xsl. -->
+<xsl:import href="chunk-common.xsl"/>
+
+<!-- The manifest.xsl module is no longer imported because its
+ templates were moved into chunk-common and chunk-code -->
+
+<!-- chunk-code.xsl contains all the chunking templates that use
+ a match attribute. In a customization it should be referenced
+ using <xsl:include> instead of <xsl:import>, and then add
+ any customized chunking templates with match attributes. But be sure
+ to add a priority="1" to such customized templates to resolve
+ its conflict with the original, since they have the
+ same import precedence.
+
+ Using xsl:include prevents adding another layer
+ of import precedence, which would cause any
+ customizations that use xsl:apply-imports to wrongly
+ apply the chunking version instead of the original
+ non-chunking version to format an element. -->
+<xsl:include href="chunk-code.xsl"/>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/chunker.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/chunker.xsl
new file mode 100644
index 0000000..8ce2d2a
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/chunker.xsl
@@ -0,0 +1,302 @@
+<?xml version="1.0" encoding="ASCII"?>
+<!--This file was created automatically by html2xhtml-->
+<!--from the HTML stylesheets.-->
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:saxon="http://icl.com/saxon" xmlns:lxslt="http://xml.apache.org/xslt" xmlns:redirect="http://xml.apache.org/xalan/redirect" xmlns:exsl="http://exslt.org/common" xmlns:doc="http://nwalsh.com/xsl/documentation/1.0" xmlns="http://www.w3.org/1999/xhtml" version="1.0" exclude-result-prefixes="saxon lxslt redirect exsl doc" extension-element-prefixes="saxon redirect lxslt exsl">
+
+<!-- ********************************************************************
+ $Id: chunker.xsl 8526 2009-10-14 18:59:40Z bobstayton $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<!-- ==================================================================== -->
+
+<!-- This stylesheet works with XSLT implementations that support -->
+<!-- exsl:document, saxon:output, or Xalan's redirect:write -->
+<!-- Note: Only Saxon 6.4.2 or later is supported. -->
+
+<xsl:param name="chunker.output.method" select="'xml'"/>
+<xsl:param name="chunker.output.encoding" select="'UTF-8'"/>
+<xsl:param name="chunker.output.indent" select="'no'"/>
+<xsl:param name="chunker.output.omit-xml-declaration" select="'no'"/>
+<xsl:param name="chunker.output.standalone" select="'no'"/>
+<xsl:param name="chunker.output.doctype-public" select="'-//W3C//DTD XHTML 1.0 Transitional//EN'"/>
+<xsl:param name="chunker.output.doctype-system" select="'http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd'"/>
+<xsl:param name="chunker.output.media-type" select="''"/>
+<xsl:param name="chunker.output.cdata-section-elements" select="''"/>
+<xsl:param name="chunker.output.quiet" select="0"/>
+
+<xsl:param name="saxon.character.representation" select="'entity;decimal'"/>
+
+<!-- ==================================================================== -->
+
+<xsl:template name="make-relative-filename">
+ <xsl:param name="base.dir" select="'./'"/>
+ <xsl:param name="base.name" select="''"/>
+
+ <xsl:choose>
+ <!-- put Saxon first to work around a bug in libxslt -->
+ <xsl:when test="element-available('saxon:output')">
+ <!-- Saxon doesn't make the chunks relative -->
+ <xsl:value-of select="concat($base.dir,$base.name)"/>
+ </xsl:when>
+ <xsl:when test="element-available('exsl:document')">
+ <!-- EXSL document does make the chunks relative, I think -->
+ <xsl:choose>
+ <xsl:when test="count(parent::*) = 0">
+ <xsl:value-of select="concat($base.dir,$base.name)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$base.name"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:when test="element-available('redirect:write')">
+ <!-- Xalan doesn't make the chunks relative -->
+ <xsl:value-of select="concat($base.dir,$base.name)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:message terminate="yes">
+ <xsl:text>Don't know how to chunk with </xsl:text>
+ <xsl:value-of select="system-property('xsl:vendor')"/>
+ </xsl:message>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="write.chunk">
+ <xsl:param name="filename" select="''"/>
+ <xsl:param name="quiet" select="$chunker.output.quiet"/>
+ <xsl:param name="suppress-context-node-name" select="0"/>
+ <xsl:param name="message-prolog"/>
+ <xsl:param name="message-epilog"/>
+
+ <xsl:param name="method" select="$chunker.output.method"/>
+ <xsl:param name="encoding" select="$chunker.output.encoding"/>
+ <xsl:param name="indent" select="$chunker.output.indent"/>
+ <xsl:param name="omit-xml-declaration" select="$chunker.output.omit-xml-declaration"/>
+ <xsl:param name="standalone" select="$chunker.output.standalone"/>
+ <xsl:param name="doctype-public" select="$chunker.output.doctype-public"/>
+ <xsl:param name="doctype-system" select="$chunker.output.doctype-system"/>
+ <xsl:param name="media-type" select="$chunker.output.media-type"/>
+ <xsl:param name="cdata-section-elements" select="$chunker.output.cdata-section-elements"/>
+
+ <xsl:param name="content"/>
+
+ <xsl:if test="$quiet = 0">
+ <xsl:message>
+ <xsl:if test="not($message-prolog = '')">
+ <xsl:value-of select="$message-prolog"/>
+ </xsl:if>
+ <xsl:text>Writing </xsl:text>
+ <xsl:value-of select="$filename"/>
+ <xsl:if test="name(.) != '' and $suppress-context-node-name = 0">
+ <xsl:text> for </xsl:text>
+ <xsl:value-of select="name(.)"/>
+ <xsl:if test="@id or @xml:id">
+ <xsl:text>(</xsl:text>
+ <xsl:value-of select="(@id|@xml:id)[1]"/>
+ <xsl:text>)</xsl:text>
+ </xsl:if>
+ </xsl:if>
+ <xsl:if test="not($message-epilog = '')">
+ <xsl:value-of select="$message-epilog"/>
+ </xsl:if>
+ </xsl:message>
+ </xsl:if>
+
+ <xsl:choose>
+ <xsl:when test="element-available('exsl:document')">
+ <xsl:choose>
+ <!-- Handle the permutations ... -->
+ <xsl:when test="$media-type != ''">
+ <xsl:choose>
+ <xsl:when test="$doctype-public != '' and $doctype-system != ''">
+ <exsl:document href="{$filename}" method="{$method}" encoding="{$encoding}" indent="{$indent}" omit-xml-declaration="{$omit-xml-declaration}" cdata-section-elements="{$cdata-section-elements}" media-type="{$media-type}" doctype-public="{$doctype-public}" doctype-system="{$doctype-system}" standalone="{$standalone}">
+ <xsl:copy-of select="$content"/>
+ </exsl:document>
+ </xsl:when>
+ <xsl:when test="$doctype-public != '' and $doctype-system = ''">
+ <exsl:document href="{$filename}" method="{$method}" encoding="{$encoding}" indent="{$indent}" omit-xml-declaration="{$omit-xml-declaration}" cdata-section-elements="{$cdata-section-elements}" media-type="{$media-type}" doctype-public="{$doctype-public}" standalone="{$standalone}">
+ <xsl:copy-of select="$content"/>
+ </exsl:document>
+ </xsl:when>
+ <xsl:when test="$doctype-public = '' and $doctype-system != ''">
+ <exsl:document href="{$filename}" method="{$method}" encoding="{$encoding}" indent="{$indent}" omit-xml-declaration="{$omit-xml-declaration}" cdata-section-elements="{$cdata-section-elements}" media-type="{$media-type}" doctype-system="{$doctype-system}" standalone="{$standalone}">
+ <xsl:copy-of select="$content"/>
+ </exsl:document>
+ </xsl:when>
+ <xsl:otherwise><!-- $doctype-public = '' and $doctype-system = ''"> -->
+ <exsl:document href="{$filename}" method="{$method}" encoding="{$encoding}" indent="{$indent}" omit-xml-declaration="{$omit-xml-declaration}" cdata-section-elements="{$cdata-section-elements}" media-type="{$media-type}" standalone="{$standalone}">
+ <xsl:copy-of select="$content"/>
+ </exsl:document>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:choose>
+ <xsl:when test="$doctype-public != '' and $doctype-system != ''">
+ <exsl:document href="{$filename}" method="{$method}" encoding="{$encoding}" indent="{$indent}" omit-xml-declaration="{$omit-xml-declaration}" cdata-section-elements="{$cdata-section-elements}" doctype-public="{$doctype-public}" doctype-system="{$doctype-system}" standalone="{$standalone}">
+ <xsl:copy-of select="$content"/>
+ </exsl:document>
+ </xsl:when>
+ <xsl:when test="$doctype-public != '' and $doctype-system = ''">
+ <exsl:document href="{$filename}" method="{$method}" encoding="{$encoding}" indent="{$indent}" omit-xml-declaration="{$omit-xml-declaration}" cdata-section-elements="{$cdata-section-elements}" doctype-public="{$doctype-public}" standalone="{$standalone}">
+ <xsl:copy-of select="$content"/>
+ </exsl:document>
+ </xsl:when>
+ <xsl:when test="$doctype-public = '' and $doctype-system != ''">
+ <exsl:document href="{$filename}" method="{$method}" encoding="{$encoding}" indent="{$indent}" omit-xml-declaration="{$omit-xml-declaration}" cdata-section-elements="{$cdata-section-elements}" doctype-system="{$doctype-system}" standalone="{$standalone}">
+ <xsl:copy-of select="$content"/>
+ </exsl:document>
+ </xsl:when>
+ <xsl:otherwise><!-- $doctype-public = '' and $doctype-system = ''"> -->
+ <exsl:document href="{$filename}" method="{$method}" encoding="{$encoding}" indent="{$indent}" omit-xml-declaration="{$omit-xml-declaration}" cdata-section-elements="{$cdata-section-elements}" standalone="{$standalone}">
+ <xsl:copy-of select="$content"/>
+ </exsl:document>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+
+ <xsl:when test="element-available('saxon:output')">
+ <xsl:choose>
+ <!-- Handle the permutations ... -->
+ <xsl:when test="$media-type != ''">
+ <xsl:choose>
+ <xsl:when test="$doctype-public != '' and $doctype-system != ''">
+ <saxon:output saxon:character-representation="{$saxon.character.representation}" href="{$filename}" method="{$method}" encoding="{$encoding}" indent="{$indent}" omit-xml-declaration="{$omit-xml-declaration}" cdata-section-elements="{$cdata-section-elements}" media-type="{$media-type}" doctype-public="{$doctype-public}" doctype-system="{$doctype-system}" standalone="{$standalone}">
+ <xsl:copy-of select="$content"/>
+ </saxon:output>
+ </xsl:when>
+ <xsl:when test="$doctype-public != '' and $doctype-system = ''">
+ <saxon:output saxon:character-representation="{$saxon.character.representation}" href="{$filename}" method="{$method}" encoding="{$encoding}" indent="{$indent}" omit-xml-declaration="{$omit-xml-declaration}" cdata-section-elements="{$cdata-section-elements}" media-type="{$media-type}" doctype-public="{$doctype-public}" standalone="{$standalone}">
+ <xsl:copy-of select="$content"/>
+ </saxon:output>
+ </xsl:when>
+ <xsl:when test="$doctype-public = '' and $doctype-system != ''">
+ <saxon:output saxon:character-representation="{$saxon.character.representation}" href="{$filename}" method="{$method}" encoding="{$encoding}" indent="{$indent}" omit-xml-declaration="{$omit-xml-declaration}" cdata-section-elements="{$cdata-section-elements}" media-type="{$media-type}" doctype-system="{$doctype-system}" standalone="{$standalone}">
+ <xsl:copy-of select="$content"/>
+ </saxon:output>
+ </xsl:when>
+ <xsl:otherwise><!-- $doctype-public = '' and $doctype-system = ''"> -->
+ <saxon:output saxon:character-representation="{$saxon.character.representation}" href="{$filename}" method="{$method}" encoding="{$encoding}" indent="{$indent}" omit-xml-declaration="{$omit-xml-declaration}" cdata-section-elements="{$cdata-section-elements}" media-type="{$media-type}" standalone="{$standalone}">
+ <xsl:copy-of select="$content"/>
+ </saxon:output>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:choose>
+ <xsl:when test="$doctype-public != '' and $doctype-system != ''">
+ <saxon:output saxon:character-representation="{$saxon.character.representation}" href="{$filename}" method="{$method}" encoding="{$encoding}" indent="{$indent}" omit-xml-declaration="{$omit-xml-declaration}" cdata-section-elements="{$cdata-section-elements}" doctype-public="{$doctype-public}" doctype-system="{$doctype-system}" standalone="{$standalone}">
+ <xsl:copy-of select="$content"/>
+ </saxon:output>
+ </xsl:when>
+ <xsl:when test="$doctype-public != '' and $doctype-system = ''">
+ <saxon:output saxon:character-representation="{$saxon.character.representation}" href="{$filename}" method="{$method}" encoding="{$encoding}" indent="{$indent}" omit-xml-declaration="{$omit-xml-declaration}" cdata-section-elements="{$cdata-section-elements}" doctype-public="{$doctype-public}" standalone="{$standalone}">
+ <xsl:copy-of select="$content"/>
+ </saxon:output>
+ </xsl:when>
+ <xsl:when test="$doctype-public = '' and $doctype-system != ''">
+ <saxon:output saxon:character-representation="{$saxon.character.representation}" href="{$filename}" method="{$method}" encoding="{$encoding}" indent="{$indent}" omit-xml-declaration="{$omit-xml-declaration}" cdata-section-elements="{$cdata-section-elements}" doctype-system="{$doctype-system}" standalone="{$standalone}">
+ <xsl:copy-of select="$content"/>
+ </saxon:output>
+ </xsl:when>
+ <xsl:otherwise><!-- $doctype-public = '' and $doctype-system = ''"> -->
+ <saxon:output saxon:character-representation="{$saxon.character.representation}" href="{$filename}" method="{$method}" encoding="{$encoding}" indent="{$indent}" omit-xml-declaration="{$omit-xml-declaration}" cdata-section-elements="{$cdata-section-elements}" standalone="{$standalone}">
+ <xsl:copy-of select="$content"/>
+ </saxon:output>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+
+ <xsl:when test="element-available('redirect:write')">
+ <!-- Xalan uses redirect -->
+ <redirect:write file="{$filename}">
+ <xsl:copy-of select="$content"/>
+ </redirect:write>
+ </xsl:when>
+
+ <xsl:otherwise>
+ <!-- it doesn't matter since we won't be making chunks... -->
+ <xsl:message terminate="yes">
+ <xsl:text>Can't make chunks with </xsl:text>
+ <xsl:value-of select="system-property('xsl:vendor')"/>
+ <xsl:text>'s processor.</xsl:text>
+ </xsl:message>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="write.chunk.with.doctype">
+ <xsl:param name="filename" select="''"/>
+ <xsl:param name="quiet" select="$chunker.output.quiet"/>
+
+ <xsl:param name="method" select="$chunker.output.method"/>
+ <xsl:param name="encoding" select="$chunker.output.encoding"/>
+ <xsl:param name="indent" select="$chunker.output.indent"/>
+ <xsl:param name="omit-xml-declaration" select="$chunker.output.omit-xml-declaration"/>
+ <xsl:param name="standalone" select="$chunker.output.standalone"/>
+ <xsl:param name="doctype-public" select="$chunker.output.doctype-public"/>
+ <xsl:param name="doctype-system" select="$chunker.output.doctype-system"/>
+ <xsl:param name="media-type" select="$chunker.output.media-type"/>
+ <xsl:param name="cdata-section-elements" select="$chunker.output.cdata-section-elements"/>
+
+ <xsl:param name="content"/>
+
+ <xsl:call-template name="write.chunk">
+ <xsl:with-param name="filename" select="$filename"/>
+ <xsl:with-param name="quiet" select="$quiet"/>
+ <xsl:with-param name="method" select="$method"/>
+ <xsl:with-param name="encoding" select="$encoding"/>
+ <xsl:with-param name="indent" select="$indent"/>
+ <xsl:with-param name="omit-xml-declaration" select="$omit-xml-declaration"/>
+ <xsl:with-param name="standalone" select="$standalone"/>
+ <xsl:with-param name="doctype-public" select="$doctype-public"/>
+ <xsl:with-param name="doctype-system" select="$doctype-system"/>
+ <xsl:with-param name="media-type" select="$media-type"/>
+ <xsl:with-param name="cdata-section-elements" select="$cdata-section-elements"/>
+ <xsl:with-param name="content" select="$content"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template name="write.text.chunk">
+ <xsl:param name="filename" select="''"/>
+ <xsl:param name="quiet" select="$chunker.output.quiet"/>
+ <xsl:param name="suppress-context-node-name" select="0"/>
+ <xsl:param name="message-prolog"/>
+ <xsl:param name="message-epilog"/>
+ <xsl:param name="method" select="'text'"/>
+ <xsl:param name="encoding" select="$chunker.output.encoding"/>
+ <xsl:param name="media-type" select="$chunker.output.media-type"/>
+ <xsl:param name="content"/>
+
+ <xsl:call-template name="write.chunk">
+ <xsl:with-param name="filename" select="$filename"/>
+ <xsl:with-param name="quiet" select="$quiet"/>
+ <xsl:with-param name="suppress-context-node-name" select="$suppress-context-node-name"/>
+ <xsl:with-param name="message-prolog" select="$message-prolog"/>
+ <xsl:with-param name="message-epilog" select="$message-epilog"/>
+ <xsl:with-param name="method" select="$method"/>
+ <xsl:with-param name="encoding" select="$encoding"/>
+ <xsl:with-param name="indent" select="'no'"/>
+ <xsl:with-param name="omit-xml-declaration" select="'no'"/>
+ <xsl:with-param name="standalone" select="'no'"/>
+ <xsl:with-param name="doctype-public"/>
+ <xsl:with-param name="doctype-system"/>
+ <xsl:with-param name="media-type" select="$media-type"/>
+ <xsl:with-param name="cdata-section-elements"/>
+ <xsl:with-param name="content" select="$content"/>
+ </xsl:call-template>
+</xsl:template>
+
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/chunkfast.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/chunkfast.xsl
new file mode 100644
index 0000000..ba7c287
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/chunkfast.xsl
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="ASCII"?>
+<!--This file was created automatically by html2xhtml-->
+<!--from the HTML stylesheets.-->
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:exsl="http://exslt.org/common" xmlns:cf="http://docbook.sourceforge.net/xmlns/chunkfast/1.0" xmlns="http://www.w3.org/1999/xhtml" version="1.0" exclude-result-prefixes="cf exsl">
+
+<!-- ********************************************************************
+ $Id: chunkfast.xsl 8345 2009-03-16 06:44:07Z bobstayton $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<!-- ==================================================================== -->
+
+<xsl:import href="chunk.xsl"/>
+<xsl:param name="chunk.fast" select="1"/>
+
+<xsl:variable name="chunks" select="exsl:node-set($chunk.hierarchy)//cf:div"/>
+
+<!-- ==================================================================== -->
+
+<xsl:template name="process-chunk-element">
+ <xsl:choose>
+ <xsl:when test="$chunk.fast != 0 and $exsl.node.set.available != 0">
+ <xsl:variable name="genid" select="generate-id()"/>
+
+ <xsl:variable name="div" select="$chunks[@id=$genid or @xml:id=$genid]"/>
+
+ <xsl:variable name="prevdiv" select="($div/preceding-sibling::cf:div|$div/preceding::cf:div|$div/parent::cf:div)[last()]"/>
+ <xsl:variable name="prev" select="key('genid', ($prevdiv/@id|$prevdiv/@xml:id)[1])"/>
+
+ <xsl:variable name="nextdiv" select="($div/following-sibling::cf:div|$div/following::cf:div|$div/cf:div)[1]"/>
+ <xsl:variable name="next" select="key('genid', ($nextdiv/@id|$nextdiv/@xml:id)[1])"/>
+
+ <xsl:choose>
+ <xsl:when test="$onechunk != 0 and parent::*">
+ <xsl:apply-imports/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="process-chunk">
+ <xsl:with-param name="prev" select="$prev"/>
+ <xsl:with-param name="next" select="$next"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:choose>
+ <xsl:when test="$onechunk != 0 and not(parent::*)">
+ <xsl:call-template name="chunk-all-sections"/>
+ </xsl:when>
+ <xsl:when test="$onechunk != 0">
+ <xsl:apply-imports/>
+ </xsl:when>
+ <xsl:when test="$chunk.first.sections = 0">
+ <xsl:call-template name="chunk-first-section-with-parent"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="chunk-all-sections"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/chunktoc.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/chunktoc.xsl
new file mode 100644
index 0000000..400fd6a
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/chunktoc.xsl
@@ -0,0 +1,528 @@
+<?xml version="1.0" encoding="ASCII"?>
+<!--This file was created automatically by html2xhtml-->
+<!--from the HTML stylesheets.-->
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:doc="http://nwalsh.com/xsl/documentation/1.0" xmlns:exsl="http://exslt.org/common" xmlns:ng="http://docbook.org/docbook-ng" xmlns:db="http://docbook.org/ns/docbook" xmlns="http://www.w3.org/1999/xhtml" version="1.0" exclude-result-prefixes="doc exsl ng db">
+
+<!-- ********************************************************************
+ $Id: chunktoc.xsl 8545 2009-12-02 07:22:10Z bobstayton $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<!-- ==================================================================== -->
+
+<xsl:import href="docbook.xsl"/>
+<xsl:import href="chunk-common.xsl"/>
+
+<xsl:template name="chunk">
+ <xsl:param name="node" select="."/>
+ <!-- returns 1 if $node is a chunk -->
+
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id">
+ <xsl:with-param name="object" select="$node"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="chunks" select="document($chunk.toc,/)"/>
+
+ <xsl:choose>
+ <xsl:when test="$chunks//tocentry[@linkend=$id]">1</xsl:when>
+ <xsl:otherwise>0</xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="*" mode="chunk-filename">
+ <!-- returns the filename of a chunk -->
+
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+
+ <xsl:variable name="chunks" select="document($chunk.toc,/)"/>
+
+ <xsl:variable name="chunk" select="$chunks//tocentry[@linkend=$id]"/>
+ <xsl:variable name="filename">
+ <xsl:call-template name="pi.dbhtml_filename">
+ <xsl:with-param name="node" select="$chunk"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="$chunk">
+ <xsl:value-of select="$filename"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="parent::*" mode="chunk-filename"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template name="process-chunk">
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+
+ <xsl:variable name="chunks" select="document($chunk.toc,/)"/>
+
+ <xsl:variable name="chunk" select="$chunks//tocentry[@linkend=$id]"/>
+ <xsl:variable name="prev-id" select="($chunk/preceding::tocentry |$chunk/ancestor::tocentry)[last()]/@linkend"/>
+ <xsl:variable name="next-id" select="($chunk/following::tocentry |$chunk/child::tocentry)[1]/@linkend"/>
+
+ <xsl:variable name="prev" select="key('id',$prev-id)"/>
+ <xsl:variable name="next" select="key('id',$next-id)"/>
+
+ <xsl:variable name="ischunk">
+ <xsl:call-template name="chunk"/>
+ </xsl:variable>
+
+ <xsl:variable name="chunkfn">
+ <xsl:if test="$ischunk='1'">
+ <xsl:apply-templates mode="chunk-filename" select="."/>
+ </xsl:if>
+ </xsl:variable>
+
+ <xsl:variable name="filename">
+ <xsl:call-template name="make-relative-filename">
+ <xsl:with-param name="base.dir" select="$base.dir"/>
+ <xsl:with-param name="base.name" select="$chunkfn"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="$ischunk = 0">
+ <xsl:apply-imports/>
+ </xsl:when>
+
+ <xsl:otherwise>
+ <xsl:call-template name="write.chunk">
+ <xsl:with-param name="filename" select="$filename"/>
+ <xsl:with-param name="content">
+ <xsl:call-template name="chunk-element-content">
+ <xsl:with-param name="prev" select="$prev"/>
+ <xsl:with-param name="next" select="$next"/>
+ </xsl:call-template>
+ </xsl:with-param>
+ <xsl:with-param name="quiet" select="$chunk.quietly"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="set">
+ <xsl:call-template name="process-chunk"/>
+</xsl:template>
+
+<xsl:template match="book">
+ <xsl:call-template name="process-chunk"/>
+</xsl:template>
+
+<xsl:template match="appendix">
+ <xsl:call-template name="process-chunk"/>
+</xsl:template>
+
+<xsl:template match="book/glossary">
+ <xsl:call-template name="process-chunk"/>
+</xsl:template>
+
+<xsl:template match="book/bibliography">
+ <xsl:call-template name="process-chunk"/>
+</xsl:template>
+
+<xsl:template match="dedication" mode="dedication">
+ <xsl:call-template name="process-chunk"/>
+</xsl:template>
+
+<xsl:template match="preface|chapter">
+ <xsl:call-template name="process-chunk"/>
+</xsl:template>
+
+<xsl:template match="part|reference">
+ <xsl:call-template name="process-chunk"/>
+</xsl:template>
+
+<xsl:template match="refentry">
+ <xsl:call-template name="process-chunk"/>
+</xsl:template>
+
+<xsl:template match="colophon">
+ <xsl:call-template name="process-chunk"/>
+</xsl:template>
+
+<xsl:template match="article">
+ <xsl:call-template name="process-chunk"/>
+</xsl:template>
+
+<xsl:template match="article/glossary">
+ <xsl:call-template name="process-chunk"/>
+</xsl:template>
+
+<xsl:template match="article/bibliography">
+ <xsl:call-template name="process-chunk"/>
+</xsl:template>
+
+<xsl:template match="sect1|sect2|sect3|sect4|sect5|section">
+ <xsl:variable name="ischunk">
+ <xsl:call-template name="chunk"/>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="$ischunk != 0">
+ <xsl:call-template name="process-chunk"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-imports/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="setindex |book/index |article/index">
+ <!-- some implementations use completely empty index tags to indicate -->
+ <!-- where an automatically generated index should be inserted. so -->
+ <!-- if the index is completely empty, skip it. -->
+ <xsl:if test="count(*)&gt;0 or $generate.index != '0'">
+ <xsl:call-template name="process-chunk"/>
+ </xsl:if>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="/">
+ <!-- * Get a title for current doc so that we let the user -->
+ <!-- * know what document we are processing at this point. -->
+ <xsl:variable name="doc.title">
+ <xsl:call-template name="get.doc.title"/>
+ </xsl:variable>
+ <xsl:choose>
+ <xsl:when test="$chunk.toc = ''">
+ <xsl:message terminate="yes">
+ <xsl:text>The chunk.toc file is not set.</xsl:text>
+ </xsl:message>
+ </xsl:when>
+ <!-- Hack! If someone hands us a DocBook V5.x or DocBook NG document,
+ toss the namespace and continue. Use the docbook5 namespaced
+ stylesheets for DocBook5 if you don't want to use this feature.-->
+ <!-- include extra test for Xalan quirk -->
+ <xsl:when test="$exsl.node.set.available != 0 and (*/self::ng:* or */self::db:*)">
+ <xsl:call-template name="log.message">
+ <xsl:with-param name="level">Note</xsl:with-param>
+ <xsl:with-param name="source" select="$doc.title"/>
+ <xsl:with-param name="context-desc">
+ <xsl:text>namesp. cut</xsl:text>
+ </xsl:with-param>
+ <xsl:with-param name="message">
+ <xsl:text>stripped namespace before processing</xsl:text>
+ </xsl:with-param>
+ </xsl:call-template>
+ <xsl:variable name="nons">
+ <xsl:apply-templates mode="stripNS"/>
+ </xsl:variable>
+ <xsl:call-template name="log.message">
+ <xsl:with-param name="level">Note</xsl:with-param>
+ <xsl:with-param name="source" select="$doc.title"/>
+ <xsl:with-param name="context-desc">
+ <xsl:text>namesp. cut</xsl:text>
+ </xsl:with-param>
+ <xsl:with-param name="message">
+ <xsl:text>processing stripped document</xsl:text>
+ </xsl:with-param>
+ </xsl:call-template>
+ <xsl:apply-templates select="exsl:node-set($nons)"/>
+ </xsl:when>
+ <!-- Can't process unless namespace removed -->
+ <xsl:when test="*/self::ng:* or */self::db:*">
+ <xsl:message terminate="yes">
+ <xsl:text>Unable to strip the namespace from DB5 document,</xsl:text>
+ <xsl:text> cannot proceed.</xsl:text>
+ </xsl:message>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:choose>
+ <xsl:when test="$rootid != ''">
+ <xsl:choose>
+ <xsl:when test="count(key('id',$rootid)) = 0">
+ <xsl:message terminate="yes">
+ <xsl:text>ID '</xsl:text>
+ <xsl:value-of select="$rootid"/>
+ <xsl:text>' not found in document.</xsl:text>
+ </xsl:message>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:if test="$collect.xref.targets = 'yes' or $collect.xref.targets = 'only'">
+ <xsl:apply-templates select="key('id', $rootid)" mode="collect.targets"/>
+ </xsl:if>
+ <xsl:if test="$collect.xref.targets != 'only'">
+ <xsl:apply-templates select="key('id',$rootid)" mode="process.root"/>
+ <xsl:if test="$tex.math.in.alt != ''">
+ <xsl:apply-templates select="key('id',$rootid)" mode="collect.tex.math"/>
+ </xsl:if>
+ <xsl:if test="$generate.manifest != 0">
+ <xsl:call-template name="generate.manifest">
+ <xsl:with-param name="node" select="key('id',$rootid)"/>
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:if>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:if test="$collect.xref.targets = 'yes' or $collect.xref.targets = 'only'">
+ <xsl:apply-templates select="/" mode="collect.targets"/>
+ </xsl:if>
+ <xsl:if test="$collect.xref.targets != 'only'">
+ <xsl:apply-templates select="/" mode="process.root"/>
+ <xsl:if test="$tex.math.in.alt != ''">
+ <xsl:apply-templates select="/" mode="collect.tex.math"/>
+ </xsl:if>
+ <xsl:if test="$generate.manifest != 0">
+ <xsl:call-template name="generate.manifest">
+ <xsl:with-param name="node" select="/"/>
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:if>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="*" mode="process.root">
+ <xsl:apply-templates select="."/>
+</xsl:template>
+
+<xsl:template name="make.lots">
+ <xsl:param name="toc.params" select="''"/>
+ <xsl:param name="toc"/>
+
+ <xsl:variable name="lots">
+ <xsl:if test="contains($toc.params, 'toc')">
+ <xsl:copy-of select="$toc"/>
+ </xsl:if>
+
+ <xsl:if test="contains($toc.params, 'figure')">
+ <xsl:choose>
+ <xsl:when test="$chunk.separate.lots != '0'">
+ <xsl:call-template name="make.lot.chunk">
+ <xsl:with-param name="type" select="'figure'"/>
+ <xsl:with-param name="lot">
+ <xsl:call-template name="list.of.titles">
+ <xsl:with-param name="titles" select="'figure'"/>
+ <xsl:with-param name="nodes" select=".//figure"/>
+ </xsl:call-template>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="list.of.titles">
+ <xsl:with-param name="titles" select="'figure'"/>
+ <xsl:with-param name="nodes" select=".//figure"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:if>
+
+ <xsl:if test="contains($toc.params, 'table')">
+ <xsl:choose>
+ <xsl:when test="$chunk.separate.lots != '0'">
+ <xsl:call-template name="make.lot.chunk">
+ <xsl:with-param name="type" select="'table'"/>
+ <xsl:with-param name="lot">
+ <xsl:call-template name="list.of.titles">
+ <xsl:with-param name="titles" select="'table'"/>
+ <xsl:with-param name="nodes" select=".//table"/>
+ </xsl:call-template>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="list.of.titles">
+ <xsl:with-param name="titles" select="'table'"/>
+ <xsl:with-param name="nodes" select=".//table"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:if>
+
+ <xsl:if test="contains($toc.params, 'example')">
+ <xsl:choose>
+ <xsl:when test="$chunk.separate.lots != '0'">
+ <xsl:call-template name="make.lot.chunk">
+ <xsl:with-param name="type" select="'example'"/>
+ <xsl:with-param name="lot">
+ <xsl:call-template name="list.of.titles">
+ <xsl:with-param name="titles" select="'example'"/>
+ <xsl:with-param name="nodes" select=".//example"/>
+ </xsl:call-template>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="list.of.titles">
+ <xsl:with-param name="titles" select="'example'"/>
+ <xsl:with-param name="nodes" select=".//example"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:if>
+
+ <xsl:if test="contains($toc.params, 'equation')">
+ <xsl:choose>
+ <xsl:when test="$chunk.separate.lots != '0'">
+ <xsl:call-template name="make.lot.chunk">
+ <xsl:with-param name="type" select="'equation'"/>
+ <xsl:with-param name="lot">
+ <xsl:call-template name="list.of.titles">
+ <xsl:with-param name="titles" select="'equation'"/>
+ <xsl:with-param name="nodes" select=".//equation"/>
+ </xsl:call-template>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="list.of.titles">
+ <xsl:with-param name="titles" select="'equation'"/>
+ <xsl:with-param name="nodes" select=".//equation"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:if>
+
+ <xsl:if test="contains($toc.params, 'procedure')">
+ <xsl:choose>
+ <xsl:when test="$chunk.separate.lots != '0'">
+ <xsl:call-template name="make.lot.chunk">
+ <xsl:with-param name="type" select="'procedure'"/>
+ <xsl:with-param name="lot">
+ <xsl:call-template name="list.of.titles">
+ <xsl:with-param name="titles" select="'procedure'"/>
+ <xsl:with-param name="nodes" select=".//procedure[title]"/>
+ </xsl:call-template>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="list.of.titles">
+ <xsl:with-param name="titles" select="'procedure'"/>
+ <xsl:with-param name="nodes" select=".//procedure[title]"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:if>
+ </xsl:variable>
+
+ <xsl:if test="string($lots) != ''">
+ <xsl:choose>
+ <xsl:when test="$chunk.tocs.and.lots != 0 and not(parent::*)">
+ <xsl:call-template name="write.chunk">
+ <xsl:with-param name="filename">
+ <xsl:call-template name="make-relative-filename">
+ <xsl:with-param name="base.dir" select="$base.dir"/>
+ <xsl:with-param name="base.name">
+ <xsl:call-template name="dbhtml-dir"/>
+ <xsl:apply-templates select="." mode="recursive-chunk-filename">
+ <xsl:with-param name="recursive" select="true()"/>
+ </xsl:apply-templates>
+ <xsl:text>-toc</xsl:text>
+ <xsl:value-of select="$html.ext"/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:with-param>
+ <xsl:with-param name="content">
+ <xsl:call-template name="chunk-element-content">
+ <xsl:with-param name="prev" select="/foo"/>
+ <xsl:with-param name="next" select="/foo"/>
+ <xsl:with-param name="nav.context" select="'toc'"/>
+ <xsl:with-param name="content">
+ <h1>
+ <xsl:apply-templates select="." mode="object.title.markup"/>
+ </h1>
+ <xsl:copy-of select="$lots"/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:with-param>
+ <xsl:with-param name="quiet" select="$chunk.quietly"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:copy-of select="$lots"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template name="make.lot.chunk">
+ <xsl:param name="type" select="''"/>
+ <xsl:param name="lot"/>
+
+ <xsl:if test="string($lot) != ''">
+ <xsl:variable name="filename">
+ <xsl:call-template name="make-relative-filename">
+ <xsl:with-param name="base.dir" select="$base.dir"/>
+ <xsl:with-param name="base.name">
+ <xsl:call-template name="dbhtml-dir"/>
+ <xsl:value-of select="$type"/>
+ <xsl:text>-toc</xsl:text>
+ <xsl:value-of select="$html.ext"/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="href">
+ <xsl:call-template name="make-relative-filename">
+ <xsl:with-param name="base.name">
+ <xsl:call-template name="dbhtml-dir"/>
+ <xsl:value-of select="$type"/>
+ <xsl:text>-toc</xsl:text>
+ <xsl:value-of select="$html.ext"/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:call-template name="write.chunk">
+ <xsl:with-param name="filename" select="$filename"/>
+ <xsl:with-param name="content">
+ <xsl:call-template name="chunk-element-content">
+ <xsl:with-param name="prev" select="/foo"/>
+ <xsl:with-param name="next" select="/foo"/>
+ <xsl:with-param name="nav.context" select="'toc'"/>
+ <xsl:with-param name="content">
+ <xsl:copy-of select="$lot"/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:with-param>
+ <xsl:with-param name="quiet" select="$chunk.quietly"/>
+ </xsl:call-template>
+ <!-- And output a link to this file -->
+ <div>
+ <xsl:attribute name="class">
+ <xsl:text>ListofTitles</xsl:text>
+ </xsl:attribute>
+ <a href="{$href}">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key">
+ <xsl:choose>
+ <xsl:when test="$type='table'">ListofTables</xsl:when>
+ <xsl:when test="$type='figure'">ListofFigures</xsl:when>
+ <xsl:when test="$type='equation'">ListofEquations</xsl:when>
+ <xsl:when test="$type='example'">ListofExamples</xsl:when>
+ <xsl:when test="$type='procedure'">ListofProcedures</xsl:when>
+ <xsl:otherwise>ListofUnknown</xsl:otherwise>
+ </xsl:choose>
+ </xsl:with-param>
+ </xsl:call-template>
+ </a>
+ </div>
+ </xsl:if>
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/component.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/component.xsl
new file mode 100644
index 0000000..b18d533
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/component.xsl
@@ -0,0 +1,395 @@
+<?xml version="1.0" encoding="ASCII"?>
+<!--This file was created automatically by html2xhtml-->
+<!--from the HTML stylesheets.-->
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1999/xhtml" version="1.0">
+
+<!-- ********************************************************************
+ $Id: component.xsl 8568 2010-01-11 03:16:56Z bobstayton $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<!-- ==================================================================== -->
+
+<xsl:template name="component.title">
+ <xsl:param name="node" select="."/>
+
+ <xsl:variable name="level">
+ <xsl:choose>
+ <xsl:when test="ancestor::section">
+ <xsl:value-of select="count(ancestor::section)+1"/>
+ </xsl:when>
+ <xsl:when test="ancestor::sect5">6</xsl:when>
+ <xsl:when test="ancestor::sect4">5</xsl:when>
+ <xsl:when test="ancestor::sect3">4</xsl:when>
+ <xsl:when test="ancestor::sect2">3</xsl:when>
+ <xsl:when test="ancestor::sect1">2</xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <!-- Let's handle the case where a component (bibliography, for example)
+ occurs inside a section; will we need parameters for this? -->
+
+ <xsl:element name="h{$level+1}" namespace="http://www.w3.org/1999/xhtml">
+ <xsl:attribute name="class">title</xsl:attribute>
+ <xsl:if test="$generate.id.attributes = 0">
+ <xsl:call-template name="anchor">
+ <xsl:with-param name="node" select="$node"/>
+ <xsl:with-param name="conditional" select="0"/>
+ </xsl:call-template>
+ </xsl:if>
+ <xsl:apply-templates select="$node" mode="object.title.markup">
+ <xsl:with-param name="allow-anchors" select="1"/>
+ </xsl:apply-templates>
+ </xsl:element>
+</xsl:template>
+
+<xsl:template name="component.subtitle">
+ <xsl:param name="node" select="."/>
+ <xsl:variable name="subtitle" select="($node/docinfo/subtitle |$node/info/subtitle |$node/prefaceinfo/subtitle |$node/chapterinfo/subtitle |$node/appendixinfo/subtitle |$node/articleinfo/subtitle |$node/artheader/subtitle |$node/subtitle)[1]"/>
+
+ <xsl:if test="$subtitle">
+ <h3 class="subtitle">
+ <em xmlns:xslo="http://www.w3.org/1999/XSL/Transform">
+ <xsl:apply-templates select="$node" mode="object.subtitle.markup"/>
+ </em>
+ </h3>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template name="component.separator">
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="dedication" mode="dedication">
+ <xsl:call-template name="id.warning"/>
+
+ <div>
+ <xsl:call-template name="common.html.attributes">
+ <xsl:with-param name="inherit" select="1"/>
+ </xsl:call-template>
+ <xsl:call-template name="dedication.titlepage"/>
+ <xsl:apply-templates/>
+ <xsl:call-template name="process.footnotes"/>
+ </div>
+</xsl:template>
+
+<xsl:template match="dedication/title|dedication/info/title" mode="titlepage.mode" priority="2">
+ <xsl:call-template name="component.title">
+ <xsl:with-param name="node" select="ancestor::dedication[1]"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="dedication/subtitle|dedication/info/subtitle" mode="titlepage.mode" priority="2">
+ <xsl:call-template name="component.subtitle">
+ <xsl:with-param name="node" select="ancestor::dedication[1]"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="dedication"/> <!-- see mode="dedication" -->
+<xsl:template match="dedication/title"/>
+<xsl:template match="dedication/subtitle"/>
+<xsl:template match="dedication/titleabbrev"/>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="acknowledgements" mode="acknowledgements">
+ <xsl:call-template name="id.warning"/>
+
+ <div>
+ <xsl:call-template name="common.html.attributes">
+ <xsl:with-param name="inherit" select="1"/>
+ </xsl:call-template>
+ <xsl:call-template name="acknowledgements.titlepage"/>
+ <xsl:apply-templates/>
+ <xsl:call-template name="process.footnotes"/>
+ </div>
+</xsl:template>
+
+<xsl:template match="acknowledgements/title|acknowledgements/info/title" mode="titlepage.mode" priority="2">
+ <xsl:call-template name="component.title">
+ <xsl:with-param name="node" select="ancestor::acknowledgements[1]"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="acknowledgements/subtitle|acknowledgements/info/subtitle" mode="titlepage.mode" priority="2">
+ <xsl:call-template name="component.subtitle">
+ <xsl:with-param name="node" select="ancestor::acknowledgements[1]"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="acknowledgements"/> <!-- see mode="acknowledgements" -->
+<xsl:template match="acknowledgements/title"/>
+<xsl:template match="acknowledgements/subtitle"/>
+<xsl:template match="acknowledgements/titleabbrev"/>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="colophon">
+ <xsl:call-template name="id.warning"/>
+
+ <div>
+ <xsl:call-template name="common.html.attributes">
+ <xsl:with-param name="inherit" select="1"/>
+ </xsl:call-template>
+ <xsl:if test="$generate.id.attributes != 0">
+ <xsl:attribute name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:call-template name="component.separator"/>
+ <xsl:call-template name="component.title"/>
+ <xsl:call-template name="component.subtitle"/>
+
+ <xsl:apply-templates/>
+ <xsl:call-template name="process.footnotes"/>
+ </div>
+</xsl:template>
+
+<xsl:template match="colophon/title"/>
+<xsl:template match="colophon/subtitle"/>
+<xsl:template match="colophon/titleabbrev"/>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="preface">
+ <xsl:call-template name="id.warning"/>
+
+ <div>
+ <xsl:call-template name="common.html.attributes">
+ <xsl:with-param name="inherit" select="1"/>
+ </xsl:call-template>
+ <xsl:if test="$generate.id.attributes != 0">
+ <xsl:attribute name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:call-template name="component.separator"/>
+ <xsl:call-template name="preface.titlepage"/>
+
+ <xsl:variable name="toc.params">
+ <xsl:call-template name="find.path.params">
+ <xsl:with-param name="table" select="normalize-space($generate.toc)"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:if test="contains($toc.params, 'toc')">
+ <xsl:call-template name="component.toc">
+ <xsl:with-param name="toc.title.p" select="contains($toc.params, 'title')"/>
+ </xsl:call-template>
+ <xsl:call-template name="component.toc.separator"/>
+ </xsl:if>
+ <xsl:apply-templates/>
+ <xsl:call-template name="process.footnotes"/>
+ </div>
+</xsl:template>
+
+<xsl:template match="preface/title" mode="titlepage.mode" priority="2">
+ <xsl:call-template name="component.title">
+ <xsl:with-param name="node" select="ancestor::preface[1]"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="preface/subtitle |preface/prefaceinfo/subtitle |preface/info/subtitle |preface/docinfo/subtitle" mode="titlepage.mode" priority="2">
+ <xsl:call-template name="component.subtitle">
+ <xsl:with-param name="node" select="ancestor::preface[1]"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="preface/docinfo|prefaceinfo"/>
+<xsl:template match="preface/info"/>
+<xsl:template match="preface/title"/>
+<xsl:template match="preface/titleabbrev"/>
+<xsl:template match="preface/subtitle"/>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="chapter">
+ <xsl:call-template name="id.warning"/>
+
+ <div>
+ <xsl:call-template name="common.html.attributes">
+ <xsl:with-param name="inherit" select="1"/>
+ </xsl:call-template>
+ <xsl:if test="$generate.id.attributes != 0">
+ <xsl:attribute name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:call-template name="component.separator"/>
+ <xsl:call-template name="chapter.titlepage"/>
+
+ <xsl:variable name="toc.params">
+ <xsl:call-template name="find.path.params">
+ <xsl:with-param name="table" select="normalize-space($generate.toc)"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:if test="contains($toc.params, 'toc')">
+ <xsl:call-template name="component.toc">
+ <xsl:with-param name="toc.title.p" select="contains($toc.params, 'title')"/>
+ </xsl:call-template>
+ <xsl:call-template name="component.toc.separator"/>
+ </xsl:if>
+ <xsl:apply-templates/>
+ <xsl:call-template name="process.footnotes"/>
+ </div>
+</xsl:template>
+
+<xsl:template match="chapter/title|chapter/chapterinfo/title|chapter/info/title" mode="titlepage.mode" priority="2">
+ <xsl:call-template name="component.title">
+ <xsl:with-param name="node" select="ancestor::chapter[1]"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="chapter/subtitle |chapter/chapterinfo/subtitle |chapter/info/subtitle |chapter/docinfo/subtitle" mode="titlepage.mode" priority="2">
+ <xsl:call-template name="component.subtitle">
+ <xsl:with-param name="node" select="ancestor::chapter[1]"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="chapter/docinfo|chapterinfo"/>
+<xsl:template match="chapter/info"/>
+<xsl:template match="chapter/title"/>
+<xsl:template match="chapter/titleabbrev"/>
+<xsl:template match="chapter/subtitle"/>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="appendix">
+ <xsl:variable name="ischunk">
+ <xsl:call-template name="chunk"/>
+ </xsl:variable>
+
+ <xsl:call-template name="id.warning"/>
+
+ <div>
+ <xsl:call-template name="common.html.attributes">
+ <xsl:with-param name="inherit" select="1"/>
+ </xsl:call-template>
+ <xsl:if test="$generate.id.attributes != 0">
+ <xsl:attribute name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:choose>
+ <xsl:when test="parent::article and $ischunk = 0">
+ <xsl:call-template name="section.heading">
+ <xsl:with-param name="level" select="1"/>
+ <xsl:with-param name="title">
+ <xsl:apply-templates select="." mode="object.title.markup"/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="component.separator"/>
+ <xsl:call-template name="appendix.titlepage"/>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:variable name="toc.params">
+ <xsl:call-template name="find.path.params">
+ <xsl:with-param name="table" select="normalize-space($generate.toc)"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:if test="contains($toc.params, 'toc')">
+ <xsl:call-template name="component.toc">
+ <xsl:with-param name="toc.title.p" select="contains($toc.params, 'title')"/>
+ </xsl:call-template>
+ <xsl:call-template name="component.toc.separator"/>
+ </xsl:if>
+
+ <xsl:apply-templates/>
+
+ <xsl:if test="not(parent::article) or $ischunk != 0">
+ <xsl:call-template name="process.footnotes"/>
+ </xsl:if>
+ </div>
+</xsl:template>
+
+<xsl:template match="appendix/title|appendix/appendixinfo/title" mode="titlepage.mode" priority="2">
+ <xsl:call-template name="component.title">
+ <xsl:with-param name="node" select="ancestor::appendix[1]"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="appendix/subtitle |appendix/appendixinfo/subtitle |appendix/info/subtitle |appendix/docinfo/subtitle" mode="titlepage.mode" priority="2">
+ <xsl:call-template name="component.subtitle">
+ <xsl:with-param name="node" select="ancestor::appendix[1]"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="appendix/docinfo|appendixinfo"/>
+<xsl:template match="appendix/info"/>
+<xsl:template match="appendix/title"/>
+<xsl:template match="appendix/titleabbrev"/>
+<xsl:template match="appendix/subtitle"/>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="article">
+ <xsl:call-template name="id.warning"/>
+
+ <div>
+ <xsl:call-template name="common.html.attributes">
+ <xsl:with-param name="inherit" select="1"/>
+ </xsl:call-template>
+ <xsl:if test="$generate.id.attributes != 0">
+ <xsl:attribute name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:call-template name="article.titlepage"/>
+
+ <xsl:variable name="toc.params">
+ <xsl:call-template name="find.path.params">
+ <xsl:with-param name="table" select="normalize-space($generate.toc)"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:call-template name="make.lots">
+ <xsl:with-param name="toc.params" select="$toc.params"/>
+ <xsl:with-param name="toc">
+ <xsl:call-template name="component.toc">
+ <xsl:with-param name="toc.title.p" select="contains($toc.params, 'title')"/>
+ </xsl:call-template>
+ </xsl:with-param>
+ </xsl:call-template>
+
+ <xsl:apply-templates/>
+ <xsl:call-template name="process.footnotes"/>
+ </div>
+</xsl:template>
+
+<xsl:template match="article/title|article/articleinfo/title" mode="titlepage.mode" priority="2">
+ <xsl:call-template name="component.title">
+ <xsl:with-param name="node" select="ancestor::article[1]"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="article/subtitle |article/articleinfo/subtitle |article/info/subtitle |article/artheader/subtitle" mode="titlepage.mode" priority="2">
+ <xsl:call-template name="component.subtitle">
+ <xsl:with-param name="node" select="ancestor::article[1]"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="article/artheader|article/articleinfo"/>
+<xsl:template match="article/info"/>
+<xsl:template match="article/title"/>
+<xsl:template match="article/titleabbrev"/>
+<xsl:template match="article/subtitle"/>
+
+<!-- ==================================================================== -->
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/division.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/division.xsl
new file mode 100644
index 0000000..48c17cf
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/division.xsl
@@ -0,0 +1,217 @@
+<?xml version="1.0" encoding="ASCII"?>
+<!--This file was created automatically by html2xhtml-->
+<!--from the HTML stylesheets.-->
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1999/xhtml" version="1.0">
+
+<!-- ********************************************************************
+ $Id: division.xsl 8421 2009-05-04 07:49:49Z bobstayton $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<!-- ==================================================================== -->
+
+<xsl:template match="set">
+ <xsl:call-template name="id.warning"/>
+
+ <div>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:call-template name="dir">
+ <xsl:with-param name="inherit" select="1"/>
+ </xsl:call-template>
+ <xsl:call-template name="language.attribute"/>
+ <xsl:if test="$generate.id.attributes != 0">
+ <xsl:attribute name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:call-template name="set.titlepage"/>
+
+ <xsl:variable name="toc.params">
+ <xsl:call-template name="find.path.params">
+ <xsl:with-param name="table" select="normalize-space($generate.toc)"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:call-template name="make.lots">
+ <xsl:with-param name="toc.params" select="$toc.params"/>
+ <xsl:with-param name="toc">
+ <xsl:call-template name="set.toc">
+ <xsl:with-param name="toc.title.p" select="contains($toc.params, 'title')"/>
+ </xsl:call-template>
+ </xsl:with-param>
+ </xsl:call-template>
+
+ <xsl:apply-templates/>
+ </div>
+</xsl:template>
+
+<xsl:template match="set/setinfo"/>
+<xsl:template match="set/title"/>
+<xsl:template match="set/titleabbrev"/>
+<xsl:template match="set/subtitle"/>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="book">
+ <xsl:call-template name="id.warning"/>
+
+ <div>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:if test="$generate.id.attributes != 0">
+ <xsl:attribute name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:call-template name="book.titlepage"/>
+
+ <xsl:apply-templates select="dedication" mode="dedication"/>
+ <xsl:apply-templates select="acknowledgements" mode="acknowledgements"/>
+
+ <xsl:variable name="toc.params">
+ <xsl:call-template name="find.path.params">
+ <xsl:with-param name="table" select="normalize-space($generate.toc)"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:call-template name="make.lots">
+ <xsl:with-param name="toc.params" select="$toc.params"/>
+ <xsl:with-param name="toc">
+ <xsl:call-template name="division.toc">
+ <xsl:with-param name="toc.title.p" select="contains($toc.params, 'title')"/>
+ </xsl:call-template>
+ </xsl:with-param>
+ </xsl:call-template>
+
+ <xsl:apply-templates/>
+ </div>
+</xsl:template>
+
+<xsl:template match="book/bookinfo"/>
+<xsl:template match="book/info"/>
+<xsl:template match="book/title"/>
+<xsl:template match="book/titleabbrev"/>
+<xsl:template match="book/subtitle"/>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="part">
+ <xsl:call-template name="id.warning"/>
+
+ <div>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:if test="$generate.id.attributes != 0">
+ <xsl:attribute name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:call-template name="part.titlepage"/>
+
+ <xsl:variable name="toc.params">
+ <xsl:call-template name="find.path.params">
+ <xsl:with-param name="table" select="normalize-space($generate.toc)"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:if test="not(partintro) and contains($toc.params, 'toc')">
+ <xsl:call-template name="division.toc"/>
+ </xsl:if>
+ <xsl:apply-templates/>
+ </div>
+</xsl:template>
+
+<xsl:template match="part" mode="make.part.toc">
+ <xsl:call-template name="division.toc"/>
+</xsl:template>
+
+<xsl:template match="reference" mode="make.part.toc">
+ <xsl:call-template name="division.toc"/>
+</xsl:template>
+
+<xsl:template match="part/docinfo"/>
+<xsl:template match="part/partinfo"/>
+<xsl:template match="part/info"/>
+<xsl:template match="part/title"/>
+<xsl:template match="part/titleabbrev"/>
+<xsl:template match="part/subtitle"/>
+
+<xsl:template match="partintro">
+ <xsl:call-template name="id.warning"/>
+
+ <div>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:if test="$generate.id.attributes != 0">
+ <xsl:attribute name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:call-template name="partintro.titlepage"/>
+ <xsl:apply-templates/>
+
+ <xsl:variable name="toc.params">
+ <xsl:call-template name="find.path.params">
+ <xsl:with-param name="node" select="parent::*"/>
+ <xsl:with-param name="table" select="normalize-space($generate.toc)"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:if test="contains($toc.params, 'toc')">
+ <!-- not ancestor::part because partintro appears in reference -->
+ <xsl:apply-templates select="parent::*" mode="make.part.toc"/>
+ </xsl:if>
+ <xsl:call-template name="process.footnotes"/>
+ </div>
+</xsl:template>
+
+<xsl:template match="partintro/title"/>
+<xsl:template match="partintro/titleabbrev"/>
+<xsl:template match="partintro/subtitle"/>
+
+<xsl:template match="partintro/title" mode="partintro.title.mode">
+ <h2>
+ <xsl:apply-templates/>
+ </h2>
+</xsl:template>
+
+<xsl:template match="partintro/subtitle" mode="partintro.title.mode">
+ <h3>
+ <em xmlns:xslo="http://www.w3.org/1999/XSL/Transform"><xsl:apply-templates/></em>
+ </h3>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="book" mode="division.number">
+ <xsl:number from="set" count="book" format="1."/>
+</xsl:template>
+
+<xsl:template match="part" mode="division.number">
+ <xsl:number from="book" count="part" format="I."/>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template name="division.title">
+ <xsl:param name="node" select="."/>
+
+ <h1>
+ <xsl:attribute name="class">title</xsl:attribute>
+ <xsl:if test="$generate.id.attributes = 0">
+ <xsl:call-template name="anchor">
+ <xsl:with-param name="node" select="$node"/>
+ <xsl:with-param name="conditional" select="0"/>
+ </xsl:call-template>
+ </xsl:if>
+ <xsl:apply-templates select="$node" mode="object.title.markup">
+ <xsl:with-param name="allow-anchors" select="1"/>
+ </xsl:apply-templates>
+ </h1>
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/docbook.css.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/docbook.css.xml
new file mode 100644
index 0000000..d93a25c
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/docbook.css.xml
@@ -0,0 +1,109 @@
+<?xml version="1.0"?>
+<style>
+
+/********************************/
+/* start of styles in block.xsl */
+
+.formalpara-title {
+ font-weight: bold;
+}
+
+div.blockquote-title {
+ font-weight: bold;
+ margin-top: 1em;
+ margin-bottom: 1em;
+}
+
+span.msgmain-title {
+ font-weight: bold;
+}
+
+span.msgsub-title {
+ font-weight: bold;
+}
+
+span.msgrel-title {
+ font-weight: bold;
+}
+
+div.msglevel, div.msgorig, div.msgaud {
+ margin-top: 1em;
+ margin-bottom: 1em;
+}
+
+span.msglevel-title, span.msgorig-title, span.msgaud-title {
+ font-weight: bold;
+}
+
+div.msgexplan {
+ margin-top: 1em;
+ margin-bottom: 1em;
+}
+
+span.msgexplan-title {
+ font-weight: bold;
+}
+
+/* end of styles in block.xsl */
+/********************************/
+
+/********************************/
+/* start of styles in autotoc.xsl */
+
+ font-weight: bold;
+ margin-top: 1em;
+ margin-bottom: 1em;
+}
+
+
+/* end of styles in autotoc.xsl */
+/********************************/
+
+/********************************/
+/* start of styles in formal.xsl */
+
+div.figure-title {
+ font-weight: bold;
+}
+
+div.example-title {
+ font-weight: bold;
+}
+
+div.equation-title {
+ font-weight: bold;
+}
+
+div.table-title {
+ font-weight: bold;
+}
+
+div.sidebar-title {
+ font-weight: bold;
+}
+
+
+/* end of styles in formal.xsl */
+/********************************/
+
+/********************************/
+/* start of styles in verbatim.xsl */
+
+div.programlisting {
+ white-space: pre;
+ font-family: monospace;
+}
+
+div.screen {
+ white-space: pre;
+ font-family: monospace;
+}
+
+div.synopsis {
+ white-space: pre;
+ font-family: monospace;
+}
+
+/* end of styles in verbatim.xsl */
+/********************************/
+</style>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/docbook.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/docbook.xsl
new file mode 100644
index 0000000..c9aa381
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/docbook.xsl
@@ -0,0 +1,446 @@
+<?xml version="1.0" encoding="ASCII"?>
+<!--This file was created automatically by html2xhtml-->
+<!--from the HTML stylesheets.-->
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ng="http://docbook.org/docbook-ng" xmlns:db="http://docbook.org/ns/docbook" xmlns:exsl="http://exslt.org/common" xmlns:exslt="http://exslt.org/common" xmlns="http://www.w3.org/1999/xhtml" exclude-result-prefixes="db ng exsl exslt" version="1.0">
+
+<xsl:output method="xml" encoding="UTF-8" indent="no" doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN" doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"/>
+
+<!-- ********************************************************************
+ $Id: docbook.xsl 8783 2010-07-28 10:59:39Z mzjn $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<!-- ==================================================================== -->
+
+<xsl:include href="../VERSION"/>
+<xsl:include href="param.xsl"/>
+<xsl:include href="../lib/lib.xsl"/>
+<xsl:include href="../common/l10n.xsl"/>
+<xsl:include href="../common/common.xsl"/>
+<xsl:include href="../common/utility.xsl"/>
+<xsl:include href="../common/labels.xsl"/>
+<xsl:include href="../common/titles.xsl"/>
+<xsl:include href="../common/subtitles.xsl"/>
+<xsl:include href="../common/gentext.xsl"/>
+<xsl:include href="../common/targets.xsl"/>
+<xsl:include href="../common/olink.xsl"/>
+<xsl:include href="../common/pi.xsl"/>
+<xsl:include href="autotoc.xsl"/>
+<xsl:include href="autoidx.xsl"/>
+<xsl:include href="lists.xsl"/>
+<xsl:include href="callout.xsl"/>
+<xsl:include href="verbatim.xsl"/>
+<xsl:include href="graphics.xsl"/>
+<xsl:include href="xref.xsl"/>
+<xsl:include href="formal.xsl"/>
+<xsl:include href="table.xsl"/>
+<xsl:include href="htmltbl.xsl"/>
+<xsl:include href="sections.xsl"/>
+<xsl:include href="inline.xsl"/>
+<xsl:include href="footnote.xsl"/>
+<xsl:include href="html.xsl"/>
+<xsl:include href="info.xsl"/>
+<xsl:include href="keywords.xsl"/>
+<xsl:include href="division.xsl"/>
+<xsl:include href="toc.xsl"/>
+<xsl:include href="index.xsl"/>
+<xsl:include href="refentry.xsl"/>
+<xsl:include href="math.xsl"/>
+<xsl:include href="admon.xsl"/>
+<xsl:include href="component.xsl"/>
+<xsl:include href="biblio.xsl"/>
+<xsl:include href="biblio-iso690.xsl"/>
+<xsl:include href="glossary.xsl"/>
+<xsl:include href="block.xsl"/>
+<xsl:include href="task.xsl"/>
+<xsl:include href="qandaset.xsl"/>
+<xsl:include href="synop.xsl"/>
+<xsl:include href="titlepage.xsl"/>
+<xsl:include href="titlepage.templates.xsl"/>
+<xsl:include href="pi.xsl"/>
+<xsl:include href="ebnf.xsl"/>
+<xsl:include href="chunker.xsl"/>
+<xsl:include href="html-rtf.xsl"/>
+<xsl:include href="annotations.xsl"/>
+<xsl:include href="../common/stripns.xsl"/>
+
+<xsl:param name="stylesheet.result.type" select="'xhtml'"/>
+<xsl:param name="htmlhelp.output" select="0"/>
+
+<!-- ==================================================================== -->
+
+<xsl:key name="id" match="*" use="@id|@xml:id"/>
+<xsl:key name="gid" match="*" use="generate-id()"/>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="*">
+ <xsl:message>
+ <xsl:text>Element </xsl:text>
+ <xsl:value-of select="local-name(.)"/>
+ <xsl:text> in namespace '</xsl:text>
+ <xsl:value-of select="namespace-uri(.)"/>
+ <xsl:text>' encountered</xsl:text>
+ <xsl:if test="parent::*">
+ <xsl:text> in </xsl:text>
+ <xsl:value-of select="name(parent::*)"/>
+ </xsl:if>
+ <xsl:text>, but no template matches.</xsl:text>
+ </xsl:message>
+
+ <span style="color: red">
+ <xsl:text>&lt;</xsl:text>
+ <xsl:value-of select="name(.)"/>
+ <xsl:text>&gt;</xsl:text>
+ <xsl:apply-templates/>
+ <xsl:text>&lt;/</xsl:text>
+ <xsl:value-of select="name(.)"/>
+ <xsl:text>&gt;</xsl:text>
+ </span>
+</xsl:template>
+
+<xsl:template match="text()">
+ <xsl:value-of select="."/>
+</xsl:template>
+
+<xsl:template name="body.attributes"><xslo:if xmlns:xslo="http://www.w3.org/1999/XSL/Transform" test="starts-with($writing.mode, 'rl')"><xslo:attribute name="dir">rtl</xslo:attribute></xslo:if>
+<!-- no apply-templates; make it empty except for dir for rtl-->
+</xsl:template>
+
+<xsl:template name="head.content">
+ <xsl:param name="node" select="."/>
+ <xsl:param name="title">
+ <xsl:apply-templates select="$node" mode="object.title.markup.textonly"/>
+ </xsl:param>
+
+ <title>
+ <xsl:copy-of select="$title"/>
+ </title>
+
+ <xsl:if test="$html.base != ''">
+ <base href="{$html.base}"/>
+ </xsl:if>
+
+ <!-- Insert links to CSS files or insert literal style elements -->
+ <xsl:call-template name="generate.css"/>
+
+ <xsl:if test="$html.stylesheet != ''">
+ <xsl:call-template name="output.html.stylesheets">
+ <xsl:with-param name="stylesheets" select="normalize-space($html.stylesheet)"/>
+ </xsl:call-template>
+ </xsl:if>
+
+ <xsl:if test="$link.mailto.url != ''">
+ <link rev="made" href="{$link.mailto.url}"/>
+ </xsl:if>
+
+ <meta name="generator" content="DocBook {$DistroTitle} V{$VERSION}"/>
+
+ <xsl:if test="$generate.meta.abstract != 0">
+ <xsl:variable name="info" select="(articleinfo |bookinfo |prefaceinfo |chapterinfo |appendixinfo |sectioninfo |sect1info |sect2info |sect3info |sect4info |sect5info |referenceinfo |refentryinfo |partinfo |info |docinfo)[1]"/>
+ <xsl:if test="$info and $info/abstract">
+ <meta name="description">
+ <xsl:attribute name="content">
+ <xsl:for-each select="$info/abstract[1]/*">
+ <xsl:value-of select="normalize-space(.)"/>
+ <xsl:if test="position() &lt; last()">
+ <xsl:text> </xsl:text>
+ </xsl:if>
+ </xsl:for-each>
+ </xsl:attribute>
+ </meta>
+ </xsl:if>
+ </xsl:if>
+
+ <xsl:if test="($draft.mode = 'yes' or ($draft.mode = 'maybe' and ancestor-or-self::*[@status][1]/@status = 'draft')) and $draft.watermark.image != ''">
+ <style type="text/css"><xsl:text>
+body { background-image: url('</xsl:text>
+<xsl:value-of select="$draft.watermark.image"/><xsl:text>');
+ background-repeat: no-repeat;
+ background-position: top left;
+ /* The following properties make the watermark "fixed" on the page. */
+ /* I think that's just a bit too distracting for the reader... */
+ /* background-attachment: fixed; */
+ /* background-position: center center; */
+ }</xsl:text>
+ </style>
+ </xsl:if>
+ <xsl:apply-templates select="." mode="head.keywords.content"/>
+</xsl:template>
+
+<xsl:template name="output.html.stylesheets">
+ <xsl:param name="stylesheets" select="''"/>
+
+ <xsl:choose>
+ <xsl:when test="contains($stylesheets, ' ')">
+ <xsl:variable name="css.filename" select="substring-before($stylesheets, ' ')"/>
+
+ <xsl:call-template name="make.css.link">
+ <xsl:with-param name="css.filename" select="$css.filename"/>
+ </xsl:call-template>
+
+ <xsl:call-template name="output.html.stylesheets">
+ <xsl:with-param name="stylesheets" select="substring-after($stylesheets, ' ')"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="$stylesheets != ''">
+ <xsl:call-template name="make.css.link">
+ <xsl:with-param name="css.filename" select="$stylesheets"/>
+ </xsl:call-template>
+ </xsl:when>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ============================================================ -->
+
+<xsl:template match="*" mode="head.keywords.content">
+ <xsl:apply-templates select="chapterinfo/keywordset" mode="html.header"/>
+ <xsl:apply-templates select="appendixinfo/keywordset" mode="html.header"/>
+ <xsl:apply-templates select="prefaceinfo/keywordset" mode="html.header"/>
+ <xsl:apply-templates select="bookinfo/keywordset" mode="html.header"/>
+ <xsl:apply-templates select="setinfo/keywordset" mode="html.header"/>
+ <xsl:apply-templates select="articleinfo/keywordset" mode="html.header"/>
+ <xsl:apply-templates select="artheader/keywordset" mode="html.header"/>
+ <xsl:apply-templates select="sect1info/keywordset" mode="html.header"/>
+ <xsl:apply-templates select="sect2info/keywordset" mode="html.header"/>
+ <xsl:apply-templates select="sect3info/keywordset" mode="html.header"/>
+ <xsl:apply-templates select="sect4info/keywordset" mode="html.header"/>
+ <xsl:apply-templates select="sect5info/keywordset" mode="html.header"/>
+ <xsl:apply-templates select="sectioninfo/keywordset" mode="html.header"/>
+ <xsl:apply-templates select="refsect1info/keywordset" mode="html.header"/>
+ <xsl:apply-templates select="refsect2info/keywordset" mode="html.header"/>
+ <xsl:apply-templates select="refsect3info/keywordset" mode="html.header"/>
+ <xsl:apply-templates select="bibliographyinfo/keywordset" mode="html.header"/>
+ <xsl:apply-templates select="glossaryinfo/keywordset" mode="html.header"/>
+ <xsl:apply-templates select="indexinfo/keywordset" mode="html.header"/>
+ <xsl:apply-templates select="refentryinfo/keywordset" mode="html.header"/>
+ <xsl:apply-templates select="partinfo/keywordset" mode="html.header"/>
+ <xsl:apply-templates select="referenceinfo/keywordset" mode="html.header"/>
+ <xsl:apply-templates select="docinfo/keywordset" mode="html.header"/>
+ <xsl:apply-templates select="info/keywordset" mode="html.header"/>
+
+ <xsl:if test="$inherit.keywords != 0 and parent::*">
+ <xsl:apply-templates select="parent::*" mode="head.keywords.content"/>
+ </xsl:if>
+</xsl:template>
+
+<!-- ============================================================ -->
+
+<xsl:template name="system.head.content">
+ <xsl:param name="node" select="."/>
+
+ <!-- FIXME: When chunking, only the annotations actually used
+ in this chunk should be referenced. I don't think it
+ does any harm to reference them all, but it adds
+ unnecessary bloat to each chunk. -->
+ <xsl:if test="$annotation.support != 0 and //annotation">
+ <xsl:call-template name="add.annotation.links"/>
+ <script type="text/javascript">
+ <xsl:text>
+// Create PopupWindow objects</xsl:text>
+ <xsl:for-each select="//annotation">
+ <xsl:text>
+var popup_</xsl:text>
+ <xsl:value-of select="generate-id(.)"/>
+ <xsl:text> = new PopupWindow("popup-</xsl:text>
+ <xsl:value-of select="generate-id(.)"/>
+ <xsl:text>");
+</xsl:text>
+ <xsl:text>popup_</xsl:text>
+ <xsl:value-of select="generate-id(.)"/>
+ <xsl:text>.offsetY = 15;
+</xsl:text>
+ <xsl:text>popup_</xsl:text>
+ <xsl:value-of select="generate-id(.)"/>
+ <xsl:text>.autoHide();
+</xsl:text>
+ </xsl:for-each>
+ </script>
+
+ <style type="text/css">
+ <xsl:value-of select="$annotation.css"/>
+ </style>
+ </xsl:if>
+
+ <!-- system.head.content is like user.head.content, except that
+ it is called before head.content. This is important because it
+ means, for example, that <style> elements output by system.head.content
+ have a lower CSS precedence than the users stylesheet. -->
+</xsl:template>
+
+<!-- ============================================================ -->
+
+<xsl:template name="user.preroot">
+ <!-- Pre-root output, can be used to output comments and PIs. -->
+ <!-- This must not output any element content! -->
+</xsl:template>
+
+<xsl:template name="user.head.content">
+ <xsl:param name="node" select="."/>
+</xsl:template>
+
+<xsl:template name="user.header.navigation">
+ <xsl:param name="node" select="."/>
+</xsl:template>
+
+<xsl:template name="user.header.content">
+ <xsl:param name="node" select="."/>
+</xsl:template>
+
+<xsl:template name="user.footer.content">
+ <xsl:param name="node" select="."/>
+</xsl:template>
+
+<xsl:template name="user.footer.navigation">
+ <xsl:param name="node" select="."/>
+</xsl:template>
+
+<xsl:template match="/">
+ <!-- * Get a title for current doc so that we let the user -->
+ <!-- * know what document we are processing at this point. -->
+ <xsl:variable name="doc.title">
+ <xsl:call-template name="get.doc.title"/>
+ </xsl:variable>
+ <xsl:choose>
+ <!-- Hack! If someone hands us a DocBook V5.x or DocBook NG document,
+ toss the namespace and continue. Use the docbook5 namespaced
+ stylesheets for DocBook5 if you don't want to use this feature.-->
+ <!-- include extra test for Xalan quirk -->
+ <xsl:when test="$exsl.node.set.available != 0 and (*/self::ng:* or */self::db:*)">
+ <xsl:call-template name="log.message">
+ <xsl:with-param name="level">Note</xsl:with-param>
+ <xsl:with-param name="source" select="$doc.title"/>
+ <xsl:with-param name="context-desc">
+ <xsl:text>namesp. cut</xsl:text>
+ </xsl:with-param>
+ <xsl:with-param name="message">
+ <xsl:text>stripped namespace before processing</xsl:text>
+ </xsl:with-param>
+ </xsl:call-template>
+ <xsl:variable name="nons">
+ <xsl:apply-templates mode="stripNS"/>
+ </xsl:variable>
+ <!--
+ <xsl:message>Saving stripped document.</xsl:message>
+ <xsl:call-template name="write.chunk">
+ <xsl:with-param name="filename" select="'/tmp/stripped.xml'"/>
+ <xsl:with-param name="method" select="'xml'"/>
+ <xsl:with-param name="content">
+ <xsl:copy-of select="exsl:node-set($nons)"/>
+ </xsl:with-param>
+ </xsl:call-template>
+ -->
+ <xsl:call-template name="log.message">
+ <xsl:with-param name="level">Note</xsl:with-param>
+ <xsl:with-param name="source" select="$doc.title"/>
+ <xsl:with-param name="context-desc">
+ <xsl:text>namesp. cut</xsl:text>
+ </xsl:with-param>
+ <xsl:with-param name="message">
+ <xsl:text>processing stripped document</xsl:text>
+ </xsl:with-param>
+ </xsl:call-template>
+ <xsl:apply-templates select="exsl:node-set($nons)"/>
+ </xsl:when>
+ <!-- Can't process unless namespace removed -->
+ <xsl:when test="*/self::ng:* or */self::db:*">
+ <xsl:message terminate="yes">
+ <xsl:text>Unable to strip the namespace from DB5 document,</xsl:text>
+ <xsl:text> cannot proceed.</xsl:text>
+ </xsl:message>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:choose>
+ <xsl:when test="$rootid != ''">
+ <xsl:choose>
+ <xsl:when test="count(key('id',$rootid)) = 0">
+ <xsl:message terminate="yes">
+ <xsl:text>ID '</xsl:text>
+ <xsl:value-of select="$rootid"/>
+ <xsl:text>' not found in document.</xsl:text>
+ </xsl:message>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:if test="$collect.xref.targets = 'yes' or $collect.xref.targets = 'only'">
+ <xsl:apply-templates select="key('id', $rootid)" mode="collect.targets"/>
+ </xsl:if>
+ <xsl:if test="$collect.xref.targets != 'only'">
+ <xsl:apply-templates select="key('id',$rootid)" mode="process.root"/>
+ <xsl:if test="$tex.math.in.alt != ''">
+ <xsl:apply-templates select="key('id',$rootid)" mode="collect.tex.math"/>
+ </xsl:if>
+ </xsl:if>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:if test="$collect.xref.targets = 'yes' or $collect.xref.targets = 'only'">
+ <xsl:apply-templates select="/" mode="collect.targets"/>
+ </xsl:if>
+ <xsl:if test="$collect.xref.targets != 'only'">
+ <xsl:apply-templates select="/" mode="process.root"/>
+ <xsl:if test="$tex.math.in.alt != ''">
+ <xsl:apply-templates select="/" mode="collect.tex.math"/>
+ </xsl:if>
+ </xsl:if>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="*" mode="process.root">
+ <xsl:variable name="doc" select="self::*"/>
+
+ <xsl:call-template name="user.preroot"/>
+ <xsl:call-template name="root.messages"/>
+
+ <html>
+ <head>
+ <xsl:call-template name="system.head.content">
+ <xsl:with-param name="node" select="$doc"/>
+ </xsl:call-template>
+ <xsl:call-template name="head.content">
+ <xsl:with-param name="node" select="$doc"/>
+ </xsl:call-template>
+ <xsl:call-template name="user.head.content">
+ <xsl:with-param name="node" select="$doc"/>
+ </xsl:call-template>
+ </head>
+ <body>
+ <xsl:call-template name="body.attributes"/>
+ <xsl:call-template name="user.header.content">
+ <xsl:with-param name="node" select="$doc"/>
+ </xsl:call-template>
+ <xsl:apply-templates select="."/>
+ <xsl:call-template name="user.footer.content">
+ <xsl:with-param name="node" select="$doc"/>
+ </xsl:call-template>
+ </body>
+ </html>
+ <xsl:value-of select="$html.append"/>
+
+ <!-- Generate any css files only once, not once per chunk -->
+ <xsl:call-template name="generate.css.files"/>
+</xsl:template>
+
+<xsl:template name="root.messages">
+ <!-- redefine this any way you'd like to output messages -->
+ <!-- DO NOT OUTPUT ANYTHING FROM THIS TEMPLATE -->
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template name="chunk">
+ <xsl:param name="node" select="."/>
+
+ <!-- The default is that we are not chunking... -->
+ <xsl:text>0</xsl:text>
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/ebnf.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/ebnf.xsl
new file mode 100644
index 0000000..d228cfb
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/ebnf.xsl
@@ -0,0 +1,328 @@
+<?xml version="1.0" encoding="ASCII"?>
+<!--This file was created automatically by html2xhtml-->
+<!--from the HTML stylesheets.-->
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:doc="http://nwalsh.com/xsl/documentation/1.0" xmlns="http://www.w3.org/1999/xhtml" exclude-result-prefixes="doc" version="1.0">
+
+<!-- ********************************************************************
+ $Id: ebnf.xsl 8178 2008-12-15 22:26:38Z bobstayton $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<doc:reference xmlns="">
+<referenceinfo xmlns="http://www.w3.org/1999/xhtml">
+<releaseinfo role="meta">
+$Id: ebnf.xsl 8178 2008-12-15 22:26:38Z bobstayton $
+</releaseinfo>
+<author><surname>Walsh</surname>
+<firstname>Norman</firstname></author>
+<copyright><year>1999</year><year>2000</year>
+<holder>Norman Walsh</holder>
+</copyright>
+</referenceinfo>
+<title xmlns="http://www.w3.org/1999/xhtml">HTML EBNF Reference</title>
+
+<partintro xmlns="http://www.w3.org/1999/xhtml">
+<section><title>Introduction</title>
+
+<para>This is technical reference documentation for the DocBook XSL
+Stylesheets; it documents (some of) the parameters, templates, and
+other elements of the stylesheets.</para>
+
+<para>This reference describes the templates and parameters relevant
+to formatting EBNF markup.</para>
+
+<para>This is not intended to be <quote>user</quote> documentation.
+It is provided for developers writing customization layers for the
+stylesheets, and for anyone who's interested in <quote>how it
+works</quote>.</para>
+
+<para>Although I am trying to be thorough, this documentation is known
+to be incomplete. Don't forget to read the source, too :-)</para>
+</section>
+</partintro>
+</doc:reference>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="productionset">
+ <table width="100%" cellpadding="5">
+ <xsl:if test="$ebnf.table.bgcolor != ''">
+ <xsl:attribute name="bgcolor">
+ <xsl:value-of select="$ebnf.table.bgcolor"/>
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:if test="$ebnf.table.border != 0">
+ <xsl:attribute name="border">1</xsl:attribute>
+ </xsl:if>
+ <xsl:attribute name="class">
+ <xsl:value-of select="local-name(.)"/>
+ </xsl:attribute>
+ <xsl:attribute name="summary">
+ <xsl:text>EBNF</xsl:text>
+ <xsl:if test="title">
+ <xsl:text> for </xsl:text>
+ <xsl:value-of select="title"/>
+ </xsl:if>
+ </xsl:attribute>
+
+ <xsl:if test="title">
+ <tr>
+ <th align="{$direction.align.start}" valign="top">
+ <xsl:apply-templates select="." mode="class.attribute"/>
+ <xsl:apply-templates select="title"/>
+ </th>
+ </tr>
+ </xsl:if>
+ <tr>
+ <td>
+ <table border="0" width="99%" cellpadding="0">
+ <xsl:if test="$ebnf.table.bgcolor != ''">
+ <xsl:attribute name="bgcolor">
+ <xsl:value-of select="$ebnf.table.bgcolor"/>
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:attribute name="class">
+ <xsl:value-of select="local-name(.)"/>
+ </xsl:attribute>
+ <xsl:attribute name="summary">EBNF productions</xsl:attribute>
+ <xsl:apply-templates select="production|productionrecap"/>
+ </table>
+ </td>
+ </tr>
+ </table>
+</xsl:template>
+
+<xsl:template match="productionset/title">
+ <xsl:apply-templates/>
+</xsl:template>
+
+<xsl:template match="production">
+ <xsl:param name="recap" select="false()"/>
+ <tr>
+ <td align="{$direction.align.start}" valign="top" width="3%">
+ <xsl:text>[</xsl:text>
+ <xsl:number count="production" level="any"/>
+ <xsl:text>]</xsl:text>
+ </td>
+ <td align="{$direction.align.end}" valign="top" width="10%">
+ <xsl:choose>
+ <xsl:when test="$recap">
+ <a>
+ <xsl:attribute name="href">
+ <xsl:call-template name="href.target">
+ <xsl:with-param name="object" select="."/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:apply-templates select="lhs"/>
+ </a>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="anchor"/>
+ <xsl:apply-templates select="lhs"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </td>
+ <td valign="top" width="5%" align="center">
+ <xsl:copy-of select="$ebnf.assignment"/>
+ </td>
+ <td valign="top" width="52%">
+ <xsl:apply-templates select="rhs"/>
+ <xsl:copy-of select="$ebnf.statement.terminator"/>
+ </td>
+ <td align="{$direction.align.start}" valign="top" width="30%">
+ <xsl:choose>
+ <xsl:when test="rhs/lineannotation|constraint">
+ <xsl:apply-templates select="rhs/lineannotation" mode="rhslo"/>
+ <xsl:apply-templates select="constraint"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text>&#160;</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ </td>
+ </tr>
+</xsl:template>
+
+<xsl:template match="productionrecap">
+ <xsl:variable name="targets" select="key('id',@linkend)"/>
+ <xsl:variable name="target" select="$targets[1]"/>
+
+ <xsl:if test="count($targets)=0">
+ <xsl:message>
+ <xsl:text>Error: no ID for productionrecap linkend: </xsl:text>
+ <xsl:value-of select="@linkend"/>
+ <xsl:text>.</xsl:text>
+ </xsl:message>
+ </xsl:if>
+
+ <xsl:if test="count($targets)&gt;1">
+ <xsl:message>
+ <xsl:text>Warning: multiple "IDs" for productionrecap linkend: </xsl:text>
+ <xsl:value-of select="@linkend"/>
+ <xsl:text>.</xsl:text>
+ </xsl:message>
+ </xsl:if>
+
+ <xsl:apply-templates select="$target">
+ <xsl:with-param name="recap" select="true()"/>
+ </xsl:apply-templates>
+</xsl:template>
+
+<xsl:template match="lhs">
+ <xsl:apply-templates/>
+</xsl:template>
+
+<xsl:template match="rhs">
+ <xsl:apply-templates/>
+ <xsl:if test="following-sibling::rhs">
+ <xsl:text> |</xsl:text>
+ <br/>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="nonterminal">
+ <xsl:variable name="linkend">
+ <xsl:call-template name="xpointer.idref">
+ <xsl:with-param name="xpointer" select="@def"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:call-template name="check.id.unique">
+ <xsl:with-param name="linkend" select="$linkend"/>
+ </xsl:call-template>
+
+ <xsl:call-template name="check.idref.targets">
+ <xsl:with-param name="linkend" select="$linkend"/>
+ <xsl:with-param name="element-list">production</xsl:with-param>
+ </xsl:call-template>
+
+ <!-- If you don't provide content, you can't point outside this doc. -->
+ <xsl:choose>
+ <xsl:when test="*|text()"><!--nop--></xsl:when>
+ <xsl:otherwise>
+ <xsl:if test="$linkend = ''">
+ <xsl:message>
+ <xsl:text>Non-terminals with no content must point to </xsl:text>
+ <xsl:text>production elements in the current document.</xsl:text>
+ </xsl:message>
+ <xsl:message>
+ <xsl:text>Invalid xpointer for empty nt: </xsl:text>
+ <xsl:value-of select="@def"/>
+ </xsl:message>
+ </xsl:if>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:variable name="href">
+ <xsl:choose>
+ <xsl:when test="$linkend != ''">
+ <xsl:variable name="targets" select="key('id',$linkend)"/>
+ <xsl:variable name="target" select="$targets[1]"/>
+ <xsl:call-template name="href.target">
+ <xsl:with-param name="object" select="$target"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="@def"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <a href="{$href}">
+ <xsl:choose>
+ <xsl:when test="*|text()">
+ <xsl:apply-templates/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:choose>
+ <xsl:when test="$linkend != ''">
+ <xsl:variable name="targets" select="key('id',$linkend)"/>
+ <xsl:variable name="target" select="$targets[1]"/>
+ <xsl:apply-templates select="$target/lhs"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text>???</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+ </a>
+</xsl:template>
+
+<xsl:template match="rhs/lineannotation">
+ <!--nop-->
+</xsl:template>
+
+<xsl:template match="rhs/lineannotation" mode="rhslo">
+ <xsl:text>/*&#160;</xsl:text>
+ <xsl:apply-templates/>
+ <xsl:text>&#160;*/</xsl:text>
+ <br/>
+</xsl:template>
+
+<xsl:template match="constraint">
+ <xsl:call-template name="check.id.unique">
+ <xsl:with-param name="linkend" select="@linkend"/>
+ </xsl:call-template>
+
+ <xsl:call-template name="check.idref.targets">
+ <xsl:with-param name="linkend" select="@linkend"/>
+ <xsl:with-param name="element-list">constraintdef</xsl:with-param>
+ </xsl:call-template>
+
+ <xsl:variable name="href">
+ <xsl:variable name="targets" select="key('id',@linkend)"/>
+ <xsl:variable name="target" select="$targets[1]"/>
+ <xsl:call-template name="href.target">
+ <xsl:with-param name="object" select="$target"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:text>[&#160;</xsl:text>
+
+ <xsl:choose>
+ <xsl:when test="@role">
+ <xsl:value-of select="@role"/>
+ <xsl:text>: </xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:variable name="targets" select="key('id',@linkend)"/>
+ <xsl:variable name="target" select="$targets[1]"/>
+ <xsl:if test="$target/@role">
+ <xsl:value-of select="$target/@role"/>
+ <xsl:text>: </xsl:text>
+ </xsl:if>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <a href="{$href}">
+ <xsl:variable name="targets" select="key('id',@linkend)"/>
+ <xsl:variable name="target" select="$targets[1]"/>
+ <xsl:apply-templates select="$target" mode="title.markup"/>
+ </a>
+ <xsl:text>&#160;]</xsl:text>
+ <xsl:if test="following-sibling::constraint">
+ <br/>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="constraintdef">
+ <div>
+ <xsl:apply-templates select="." mode="class.attribute"/>
+ <xsl:call-template name="anchor"/>
+ <xsl:apply-templates/>
+ </div>
+</xsl:template>
+
+<xsl:template match="constraintdef/title">
+ <p><strong xmlns:xslo="http://www.w3.org/1999/XSL/Transform"><xsl:apply-templates/></strong></p>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/footnote.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/footnote.xsl
new file mode 100644
index 0000000..6d81fa9
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/footnote.xsl
@@ -0,0 +1,305 @@
+<?xml version="1.0" encoding="ASCII"?>
+<!--This file was created automatically by html2xhtml-->
+<!--from the HTML stylesheets.-->
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:exsl="http://exslt.org/common" xmlns="http://www.w3.org/1999/xhtml" exclude-result-prefixes="exsl" version="1.0">
+
+<!-- ********************************************************************
+ $Id: footnote.xsl 8812 2010-08-09 20:51:51Z bobstayton $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<xsl:template match="footnote">
+ <xsl:variable name="name">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+ <xsl:variable name="href">
+ <xsl:text>#ftn.</xsl:text>
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="ancestor::table or ancestor::informaltable">
+ <sup>
+ <xsl:text>[</xsl:text>
+ <a id="{$name}" href="{$href}">
+ <xsl:apply-templates select="." mode="class.attribute"/>
+ <xsl:apply-templates select="." mode="footnote.number"/>
+ </a>
+ <xsl:text>]</xsl:text>
+ </sup>
+ </xsl:when>
+ <xsl:otherwise>
+ <sup>
+ <xsl:text>[</xsl:text>
+ <a id="{$name}" href="{$href}">
+ <xsl:apply-templates select="." mode="class.attribute"/>
+ <xsl:apply-templates select="." mode="footnote.number"/>
+ </a>
+ <xsl:text>]</xsl:text>
+ </sup>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="footnoteref">
+ <xsl:variable name="targets" select="key('id',@linkend)"/>
+ <xsl:variable name="footnote" select="$targets[1]"/>
+
+ <xsl:if test="not(local-name($footnote) = 'footnote')">
+ <xsl:message terminate="yes">
+ERROR: A footnoteref element has a linkend that points to an element that is not a footnote.
+Typically this happens when an id attribute is accidentally applied to the child of a footnote element.
+target element: <xsl:value-of select="local-name($footnote)"/>
+linkend/id: <xsl:value-of select="@linkend"/>
+ </xsl:message>
+ </xsl:if>
+
+ <xsl:variable name="target.href">
+ <xsl:call-template name="href.target">
+ <xsl:with-param name="object" select="$footnote"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="href">
+ <xsl:value-of select="substring-before($target.href, '#')"/>
+ <xsl:text>#ftn.</xsl:text>
+ <xsl:value-of select="substring-after($target.href, '#')"/>
+ </xsl:variable>
+
+ <sup>
+ <xsl:text>[</xsl:text>
+ <a href="{$href}">
+ <xsl:apply-templates select="." mode="class.attribute"/>
+ <xsl:apply-templates select="$footnote" mode="footnote.number"/>
+ </a>
+ <xsl:text>]</xsl:text>
+ </sup>
+</xsl:template>
+
+<xsl:template match="footnote" mode="footnote.number">
+ <xsl:choose>
+ <xsl:when test="string-length(@label) != 0">
+ <xsl:value-of select="@label"/>
+ </xsl:when>
+ <xsl:when test="ancestor::table or ancestor::informaltable">
+ <xsl:variable name="tfnum">
+ <xsl:number level="any" from="table|informaltable" format="1"/>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="string-length($table.footnote.number.symbols) &gt;= $tfnum">
+ <xsl:value-of select="substring($table.footnote.number.symbols, $tfnum, 1)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:number level="any" from="table | informaltable" format="{$table.footnote.number.format}"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:variable name="pfoot" select="preceding::footnote[not(@label)]"/>
+ <xsl:variable name="ptfoot" select="preceding::table//footnote | preceding::informaltable//footnote"/>
+ <xsl:variable name="fnum" select="count($pfoot) - count($ptfoot) + 1"/>
+
+ <xsl:choose>
+ <xsl:when test="string-length($footnote.number.symbols) &gt;= $fnum">
+ <xsl:value-of select="substring($footnote.number.symbols, $fnum, 1)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:number value="$fnum" format="{$footnote.number.format}"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="footnote/para[1]|footnote/simpara[1]" priority="2">
+ <!-- this only works if the first thing in a footnote is a para, -->
+ <!-- which is ok, because it usually is. -->
+ <xsl:variable name="name">
+ <xsl:text>ftn.</xsl:text>
+ <xsl:call-template name="object.id">
+ <xsl:with-param name="object" select="ancestor::footnote"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:variable name="href">
+ <xsl:text>#</xsl:text>
+ <xsl:call-template name="object.id">
+ <xsl:with-param name="object" select="ancestor::footnote"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:call-template name="paragraph">
+ <xsl:with-param name="class">
+ <xsl:if test="@role and $para.propagates.style != 0">
+ <xsl:value-of select="@role"/>
+ </xsl:if>
+ </xsl:with-param>
+ <xsl:with-param name="content">
+ <sup>
+ <xsl:text>[</xsl:text>
+ <a id="{$name}" href="{$href}">
+ <xsl:apply-templates select="." mode="class.attribute"/>
+ <xsl:apply-templates select="ancestor::footnote" mode="footnote.number"/>
+ </a>
+ <xsl:text>] </xsl:text>
+ </sup>
+ <xsl:apply-templates/>
+ </xsl:with-param>
+ </xsl:call-template>
+
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="*" mode="footnote.body.number">
+ <xsl:variable name="name">
+ <xsl:text>ftn.</xsl:text>
+ <xsl:call-template name="object.id">
+ <xsl:with-param name="object" select="ancestor::footnote"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:variable name="href">
+ <xsl:text>#</xsl:text>
+ <xsl:call-template name="object.id">
+ <xsl:with-param name="object" select="ancestor::footnote"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:variable name="footnote.mark">
+ <sup>
+ <xsl:text>[</xsl:text>
+ <a id="{$name}" href="{$href}">
+ <xsl:apply-templates select="." mode="class.attribute"/>
+ <xsl:apply-templates select="ancestor::footnote" mode="footnote.number"/>
+ </a>
+ <xsl:text>] </xsl:text>
+ </sup>
+ </xsl:variable>
+
+ <xsl:variable name="html">
+ <xsl:apply-templates select="."/>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="$exsl.node.set.available != 0">
+ <xsl:variable name="html-nodes" select="exsl:node-set($html)"/>
+ <xsl:choose>
+ <xsl:when test="$html-nodes//p">
+ <xsl:apply-templates select="$html-nodes" mode="insert.html.p">
+ <xsl:with-param name="mark" select="$footnote.mark"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="$html-nodes" mode="insert.html.text">
+ <xsl:with-param name="mark" select="$footnote.mark"/>
+ </xsl:apply-templates>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:copy-of select="$html"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<!--
+<xsl:template name="count-element-from">
+ <xsl:param name="from" select=".."/>
+ <xsl:param name="to" select="."/>
+ <xsl:param name="count" select="0"/>
+ <xsl:param name="list" select="$from/following::*[local-name(.)=local-name($to)]
+ |$from/descendant-or-self::*[local-name(.)=local-name($to)]"/>
+
+ <xsl:choose>
+ <xsl:when test="not($list)">
+ <xsl:text>-1</xsl:text>
+ </xsl:when>
+ <xsl:when test="$list[1] = $to">
+ <xsl:value-of select="$count + 1"/>
+ </xsl:when>
+ <xsl:otherwise>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+-->
+
+<!-- ==================================================================== -->
+
+<xsl:template name="process.footnotes">
+ <xsl:variable name="footnotes" select=".//footnote"/>
+ <xsl:variable name="table.footnotes" select=".//table//footnote | .//informaltable//footnote"/>
+
+ <!-- Only bother to do this if there's at least one non-table footnote -->
+ <xsl:if test="count($footnotes)&gt;count($table.footnotes)">
+ <div class="footnotes">
+ <br/>
+ <hr width="100" align="{$direction.align.start}"/>
+ <xsl:apply-templates select="$footnotes" mode="process.footnote.mode"/>
+ </div>
+ </xsl:if>
+
+ <xsl:if test="$annotation.support != 0 and //annotation">
+ <div class="annotation-list">
+ <div class="annotation-nocss">
+ <p>The following annotations are from this essay. You are seeing
+ them here because your browser doesn&#8217;t support the user-interface
+ techniques used to make them appear as &#8216;popups&#8217; on modern browsers.</p>
+ </div>
+
+ <xsl:apply-templates select="//annotation" mode="annotation-popup"/>
+ </div>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template name="process.chunk.footnotes">
+ <!-- nop -->
+</xsl:template>
+
+<xsl:template match="footnote" name="process.footnote" mode="process.footnote.mode">
+ <xsl:choose>
+ <xsl:when test="local-name(*[1]) = 'para' or local-name(*[1]) = 'simpara'">
+ <div>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates/>
+ </div>
+ </xsl:when>
+
+ <xsl:when test="$html.cleanup != 0 and $exsl.node.set.available != 0">
+ <div>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates select="*[1]" mode="footnote.body.number"/>
+ <xsl:apply-templates select="*[position() &gt; 1]"/>
+ </div>
+ </xsl:when>
+
+ <xsl:otherwise>
+ <xsl:message>
+ <xsl:text>Warning: footnote number may not be generated </xsl:text>
+ <xsl:text>correctly; </xsl:text>
+ <xsl:value-of select="local-name(*[1])"/>
+ <xsl:text> unexpected as first child of footnote.</xsl:text>
+ </xsl:message>
+ <div>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates/>
+ </div>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="table//footnote | informaltable//footnote" mode="process.footnote.mode">
+</xsl:template>
+
+<xsl:template match="footnote" mode="table.footnote.mode">
+ <xsl:call-template name="process.footnote"/>
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/formal.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/formal.xsl
new file mode 100644
index 0000000..57c98f3
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/formal.xsl
@@ -0,0 +1,411 @@
+<?xml version="1.0" encoding="ASCII"?>
+<!--This file was created automatically by html2xhtml-->
+<!--from the HTML stylesheets.-->
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1999/xhtml" version="1.0">
+
+<!-- ********************************************************************
+ $Id: formal.xsl 8806 2010-08-09 18:25:58Z bobstayton $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<xsl:param name="formal.object.break.after">1</xsl:param>
+
+<xsl:template name="formal.object">
+ <xsl:param name="placement" select="'before'"/>
+ <xsl:param name="class">
+ <xsl:apply-templates select="." mode="class.value"/>
+ </xsl:param>
+
+ <xsl:call-template name="id.warning"/>
+
+ <xsl:variable name="content">
+ <div class="{$class}">
+ <xsl:call-template name="anchor">
+ <xsl:with-param name="conditional" select="0"/>
+ </xsl:call-template>
+
+ <xsl:choose>
+ <xsl:when test="$placement = 'before'">
+ <xsl:call-template name="formal.object.heading"/>
+ <div class="{$class}-contents">
+ <xsl:apply-templates/>
+ </div>
+ <!-- HACK: This doesn't belong inside formal.object; it
+ should be done by the table template, but I want
+ the link to be inside the DIV, so... -->
+ <xsl:if test="local-name(.) = 'table'">
+ <xsl:call-template name="table.longdesc"/>
+ </xsl:if>
+
+ <xsl:if test="$spacing.paras != 0"><p/></xsl:if>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:if test="$spacing.paras != 0"><p/></xsl:if>
+ <div class="{$class}-contents"><xsl:apply-templates/></div>
+ <!-- HACK: This doesn't belong inside formal.object; it
+ should be done by the table template, but I want
+ the link to be inside the DIV, so... -->
+ <xsl:if test="local-name(.) = 'table'">
+ <xsl:call-template name="table.longdesc"/>
+ </xsl:if>
+
+ <xsl:call-template name="formal.object.heading"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </div>
+ <xsl:if test="not($formal.object.break.after = '0')">
+ <br class="{$class}-break"/>
+ </xsl:if>
+ </xsl:variable>
+
+ <xsl:variable name="floatstyle">
+ <xsl:call-template name="floatstyle"/>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="$floatstyle != ''">
+ <xsl:call-template name="floater">
+ <xsl:with-param name="class"><xsl:value-of select="$class"/>-float</xsl:with-param>
+ <xsl:with-param name="floatstyle" select="$floatstyle"/>
+ <xsl:with-param name="content" select="$content"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:copy-of select="$content"/>
+ </xsl:otherwise>
+ </xsl:choose>
+
+</xsl:template>
+
+<xsl:template name="formal.object.heading">
+ <xsl:param name="object" select="."/>
+ <xsl:param name="title">
+ <xsl:apply-templates select="$object" mode="object.title.markup">
+ <xsl:with-param name="allow-anchors" select="1"/>
+ </xsl:apply-templates>
+ </xsl:param>
+
+
+ <xsl:choose>
+ <xsl:when test="$make.clean.html != 0">
+ <xsl:variable name="html.class" select="concat(local-name($object),'-title')"/>
+ <div class="{$html.class}">
+ <xsl:copy-of select="$title"/>
+ </div>
+ </xsl:when>
+ <xsl:otherwise>
+ <p class="title">
+ <strong xmlns:xslo="http://www.w3.org/1999/XSL/Transform">
+ <xsl:copy-of select="$title"/>
+ </strong>
+ </p>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="informal.object">
+ <xsl:param name="class" select="local-name(.)"/>
+
+ <xsl:variable name="content">
+ <div class="{$class}">
+ <xsl:if test="$spacing.paras != 0"><p/></xsl:if>
+ <xsl:call-template name="anchor"/>
+ <xsl:apply-templates/>
+
+ <!-- HACK: This doesn't belong inside formal.object; it
+ should be done by the table template, but I want
+ the link to be inside the DIV, so... -->
+ <xsl:if test="local-name(.) = 'informaltable'">
+ <xsl:call-template name="table.longdesc"/>
+ </xsl:if>
+
+ <xsl:if test="$spacing.paras != 0"><p/></xsl:if>
+ </div>
+ </xsl:variable>
+
+ <xsl:variable name="floatstyle">
+ <xsl:call-template name="floatstyle"/>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="$floatstyle != ''">
+ <xsl:call-template name="floater">
+ <xsl:with-param name="class"><xsl:value-of select="$class"/>-float</xsl:with-param>
+ <xsl:with-param name="floatstyle" select="$floatstyle"/>
+ <xsl:with-param name="content" select="$content"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:copy-of select="$content"/>
+ </xsl:otherwise>
+ </xsl:choose>
+
+</xsl:template>
+
+<xsl:template name="semiformal.object">
+ <xsl:param name="placement" select="'before'"/>
+ <xsl:param name="class" select="local-name(.)"/>
+
+ <xsl:choose>
+ <xsl:when test="title or info/title">
+ <xsl:call-template name="formal.object">
+ <xsl:with-param name="placement" select="$placement"/>
+ <xsl:with-param name="class" select="$class"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="informal.object">
+ <xsl:with-param name="class" select="$class"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="figure">
+ <xsl:variable name="param.placement" select="substring-after(normalize-space($formal.title.placement), concat(local-name(.), ' '))"/>
+
+ <xsl:variable name="placement">
+ <xsl:choose>
+ <xsl:when test="contains($param.placement, ' ')">
+ <xsl:value-of select="substring-before($param.placement, ' ')"/>
+ </xsl:when>
+ <xsl:when test="$param.placement = ''">before</xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$param.placement"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:call-template name="formal.object">
+ <xsl:with-param name="placement" select="$placement"/>
+ </xsl:call-template>
+
+</xsl:template>
+
+<xsl:template match="table">
+ <xsl:choose>
+ <xsl:when test="tgroup|mediaobject|graphic">
+ <xsl:call-template name="calsTable"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <!-- do not use xsl:copy because of XHTML's needs -->
+ <xsl:element name="table" namespace="http://www.w3.org/1999/xhtml">
+ <xsl:apply-templates select="@*" mode="htmlTableAtt"/>
+ <xsl:attribute name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:attribute>
+ <xsl:call-template name="htmlTable"/>
+ </xsl:element>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="calsTable">
+ <xsl:if test="tgroup/tbody/tr |tgroup/thead/tr |tgroup/tfoot/tr">
+ <xsl:message terminate="yes">Broken table: tr descendent of CALS Table.</xsl:message>
+ </xsl:if>
+
+ <xsl:variable name="param.placement" select="substring-after(normalize-space($formal.title.placement), concat(local-name(.), ' '))"/>
+
+ <xsl:variable name="placement">
+ <xsl:choose>
+ <xsl:when test="contains($param.placement, ' ')">
+ <xsl:value-of select="substring-before($param.placement, ' ')"/>
+ </xsl:when>
+ <xsl:when test="$param.placement = ''">before</xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$param.placement"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:call-template name="formal.object">
+ <xsl:with-param name="placement" select="$placement"/>
+ <xsl:with-param name="class">
+ <xsl:choose>
+ <xsl:when test="@tabstyle">
+ <!-- hack, this will only ever occur on table, not example -->
+ <xsl:value-of select="@tabstyle"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="local-name(.)"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:with-param>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template name="htmlTable">
+ <xsl:if test="tgroup/tbody/row |tgroup/thead/row |tgroup/tfoot/row">
+ <xsl:message terminate="yes">Broken table: row descendent of HTML table.</xsl:message>
+ </xsl:if>
+
+ <xsl:apply-templates mode="htmlTable"/>
+
+ <xsl:if test=".//footnote|../title//footnote">
+ <tbody class="footnotes">
+ <tr>
+ <td colspan="50">
+ <xsl:apply-templates select=".//footnote|../title//footnote" mode="table.footnote.mode"/>
+ </td>
+ </tr>
+ </tbody>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="example">
+ <xsl:variable name="param.placement" select="substring-after(normalize-space($formal.title.placement), concat(local-name(.), ' '))"/>
+
+ <xsl:variable name="placement">
+ <xsl:choose>
+ <xsl:when test="contains($param.placement, ' ')">
+ <xsl:value-of select="substring-before($param.placement, ' ')"/>
+ </xsl:when>
+ <xsl:when test="$param.placement = ''">before</xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$param.placement"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:call-template name="formal.object">
+ <xsl:with-param name="placement" select="$placement"/>
+ </xsl:call-template>
+
+</xsl:template>
+
+<xsl:template match="equation">
+ <xsl:variable name="param.placement" select="substring-after(normalize-space($formal.title.placement), concat(local-name(.), ' '))"/>
+
+ <xsl:variable name="placement">
+ <xsl:choose>
+ <xsl:when test="contains($param.placement, ' ')">
+ <xsl:value-of select="substring-before($param.placement, ' ')"/>
+ </xsl:when>
+ <xsl:when test="$param.placement = ''">before</xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$param.placement"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:call-template name="formal.object">
+ <xsl:with-param name="placement" select="$placement"/>
+ </xsl:call-template>
+
+</xsl:template>
+
+<xsl:template match="figure/title"/>
+<xsl:template match="figure/titleabbrev"/>
+<xsl:template match="table/title"/>
+<xsl:template match="table/titleabbrev"/>
+<xsl:template match="table/textobject"/>
+<xsl:template match="example/title"/>
+<xsl:template match="example/titleabbrev"/>
+<xsl:template match="equation/title"/>
+<xsl:template match="equation/titleabbrev"/>
+
+<xsl:template match="informalfigure">
+ <xsl:call-template name="informal.object"/>
+</xsl:template>
+
+<xsl:template match="informalexample">
+ <xsl:call-template name="informal.object"/>
+</xsl:template>
+
+<xsl:template match="informaltable">
+ <xsl:choose>
+ <xsl:when test="tgroup|mediaobject|graphic">
+ <xsl:call-template name="informal.object">
+ <xsl:with-param name="class">
+ <xsl:choose>
+ <xsl:when test="@tabstyle">
+ <xsl:value-of select="@tabstyle"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="local-name(.)"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:element name="table" namespace="http://www.w3.org/1999/xhtml">
+ <xsl:apply-templates select="@*" mode="htmlTableAtt"/>
+ <xsl:attribute name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:attribute>
+ <xsl:call-template name="htmlTable"/>
+ </xsl:element>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="informaltable/textobject"/>
+
+<xsl:template name="table.longdesc">
+ <!-- HACK: This doesn't belong inside formal.objectt; it should be done by -->
+ <!-- the table template, but I want the link to be inside the DIV, so... -->
+ <xsl:variable name="longdesc.uri">
+ <xsl:call-template name="longdesc.uri">
+ <xsl:with-param name="mediaobject" select="."/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="irrelevant">
+ <!-- write.longdesc returns the filename ... -->
+ <xsl:call-template name="write.longdesc">
+ <xsl:with-param name="mediaobject" select="."/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:if test="$html.longdesc != 0 and $html.longdesc.link != 0 and textobject[not(phrase)]">
+ <xsl:call-template name="longdesc.link">
+ <xsl:with-param name="longdesc.uri" select="$longdesc.uri"/>
+ </xsl:call-template>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="informalequation">
+ <xsl:call-template name="informal.object"/>
+</xsl:template>
+
+<xsl:template name="floatstyle">
+ <xsl:if test="(@float and @float != '0') or @floatstyle != ''">
+ <xsl:choose>
+ <xsl:when test="@floatstyle != ''">
+ <xsl:value-of select="@floatstyle"/>
+ </xsl:when>
+ <xsl:when test="@float = '1'">
+ <xsl:value-of select="$default.float.class"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="@float"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template name="floater">
+ <xsl:param name="content"/>
+ <xsl:param name="class" select="'float'"/>
+ <xsl:param name="floatstyle" select="'left'"/>
+
+ <div class="{$class}">
+ <xsl:if test="$floatstyle = 'left' or $floatstyle = 'right'">
+ <xsl:attribute name="style">
+ <xsl:text>float: </xsl:text>
+ <xsl:value-of select="$floatstyle"/>
+ <xsl:text>;</xsl:text>
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:copy-of select="$content"/>
+ </div>
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/glossary.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/glossary.xsl
new file mode 100644
index 0000000..d22b6c5
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/glossary.xsl
@@ -0,0 +1,564 @@
+<?xml version="1.0" encoding="ASCII"?>
+<!--This file was created automatically by html2xhtml-->
+<!--from the HTML stylesheets.-->
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/1999/xhtml" exclude-result-prefixes="xlink" version="1.0">
+
+<!-- ********************************************************************
+ $Id: glossary.xsl 8421 2009-05-04 07:49:49Z bobstayton $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<!-- ==================================================================== -->
+
+<xsl:template match="glossary">
+
+<xsl:variable name="language">
+ <xsl:call-template name="l10n.language"/>
+</xsl:variable>
+
+<xsl:variable name="lowercase">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key">normalize.sort.input</xsl:with-param>
+ </xsl:call-template>
+</xsl:variable>
+
+<xsl:variable name="uppercase">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key">normalize.sort.output</xsl:with-param>
+ </xsl:call-template>
+</xsl:variable>
+
+ <xsl:call-template name="id.warning"/>
+
+ <div>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:if test="$generate.id.attributes != 0">
+ <xsl:attribute name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:call-template name="glossary.titlepage"/>
+
+ <xsl:choose>
+ <xsl:when test="glossdiv">
+ <xsl:apply-templates select="(glossdiv[1]/preceding-sibling::*)"/>
+ </xsl:when>
+ <xsl:when test="glossentry">
+ <xsl:apply-templates select="(glossentry[1]/preceding-sibling::*)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates/>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:choose>
+ <xsl:when test="glossdiv">
+ <xsl:apply-templates select="glossdiv"/>
+ </xsl:when>
+ <xsl:when test="glossentry">
+ <dl>
+ <xsl:choose>
+ <xsl:when test="$glossary.sort != 0">
+ <xsl:apply-templates select="glossentry">
+ <xsl:sort lang="{$language}" select="normalize-space(translate(concat(@sortas, glossterm[not(parent::glossentry/@sortas) or parent::glossentry/@sortas = '']), 'Aa&#192;&#224;&#193;&#225;&#194;&#226;&#195;&#227;&#196;&#228;&#197;&#229;&#256;&#257;&#258;&#259;&#260;&#261;&#461;&#462;&#478;&#479;&#480;&#481;&#506;&#507;&#512;&#513;&#514;&#515;&#550;&#551;&#7680;&#7681;&#7834;&#7840;&#7841;&#7842;&#7843;&#7844;&#7845;&#7846;&#7847;&#7848;&#7849;&#7850;&#7851;&#7852;&#7853;&#7854;&#7855;&#7856;&#7857;&#7858;&#7859;&#7860;&#7861;&#7862;&#7863;Bb&#384;&#385;&#595;&#386;&#387;&#7682;&#7683;&#7684;&#7685;&#7686;&#7687;Cc&#199;&#231;&#262;&#263;&#264;&#265;&#266;&#267;&#268;&#269;&#391;&#392;&#597;&#7688;&#7689;Dd&#270;&#271;&#272;&#273;&#394;&#599;&#395;&#396;&#453;&#498;&#545;&#598;&#7690;&#7691;&#7692;&#7693;&#7694;&#7695;&#7696;&#7697;&#7698;&#7699;Ee&#200;&#232;&#201;&#233;&#202;&#234;&#203;&#235;&#274;&#275;&#276;&#277;&#278;&#279;&#280;&#281;&#282;&#283;&#516;&#517;&#518;&#519;&#552;&#553;&#7700;&#7701;&#7702;&#7703;&#7704;&#7705;&#7706;&#7707;&#7708;&#7709;&#7864;&#7865;&#7866;&#7867;&#7868;&#7869;&#7870;&#7871;&#7872;&#7873;&#7874;&#7875;&#7876;&#7877;&#7878;&#7879;Ff&#401;&#402;&#7710;&#7711;Gg&#284;&#285;&#286;&#287;&#288;&#289;&#290;&#291;&#403;&#608;&#484;&#485;&#486;&#487;&#500;&#501;&#7712;&#7713;Hh&#292;&#293;&#294;&#295;&#542;&#543;&#614;&#7714;&#7715;&#7716;&#7717;&#7718;&#7719;&#7720;&#7721;&#7722;&#7723;&#7830;Ii&#204;&#236;&#205;&#237;&#206;&#238;&#207;&#239;&#296;&#297;&#298;&#299;&#300;&#301;&#302;&#303;&#304;&#407;&#616;&#463;&#464;&#520;&#521;&#522;&#523;&#7724;&#7725;&#7726;&#7727;&#7880;&#7881;&#7882;&#7883;Jj&#308;&#309;&#496;&#669;Kk&#310;&#311;&#408;&#409;&#488;&#489;&#7728;&#7729;&#7730;&#7731;&#7732;&#7733;Ll&#313;&#314;&#315;&#316;&#317;&#318;&#319;&#320;&#321;&#322;&#410;&#456;&#564;&#619;&#620;&#621;&#7734;&#7735;&#7736;&#7737;&#7738;&#7739;&#7740;&#7741;Mm&#625;&#7742;&#7743;&#7744;&#7745;&#7746;&#7747;Nn&#209;&#241;&#323;&#324;&#325;&#326;&#327;&#328;&#413;&#626;&#414;&#544;&#459;&#504;&#505;&#565;&#627;&#7748;&#7749;&#7750;&#7751;&#7752;&#7753;&#7754;&#7755;Oo&#210;&#242;&#211;&#243;&#212;&#244;&#213;&#245;&#214;&#246;&#216;&#248;&#332;&#333;&#334;&#335;&#336;&#337;&#415;&#416;&#417;&#465;&#466;&#490;&#491;&#492;&#493;&#510;&#511;&#524;&#525;&#526;&#527;&#554;&#555;&#556;&#557;&#558;&#559;&#560;&#561;&#7756;&#7757;&#7758;&#7759;&#7760;&#7761;&#7762;&#7763;&#7884;&#7885;&#7886;&#7887;&#7888;&#7889;&#7890;&#7891;&#7892;&#7893;&#7894;&#7895;&#7896;&#7897;&#7898;&#7899;&#7900;&#7901;&#7902;&#7903;&#7904;&#7905;&#7906;&#7907;Pp&#420;&#421;&#7764;&#7765;&#7766;&#7767;Qq&#672;Rr&#340;&#341;&#342;&#343;&#344;&#345;&#528;&#529;&#530;&#531;&#636;&#637;&#638;&#7768;&#7769;&#7770;&#7771;&#7772;&#7773;&#7774;&#7775;Ss&#346;&#347;&#348;&#349;&#350;&#351;&#352;&#353;&#536;&#537;&#642;&#7776;&#7777;&#7778;&#7779;&#7780;&#7781;&#7782;&#7783;&#7784;&#7785;Tt&#354;&#355;&#356;&#357;&#358;&#359;&#427;&#428;&#429;&#430;&#648;&#538;&#539;&#566;&#7786;&#7787;&#7788;&#7789;&#7790;&#7791;&#7792;&#7793;&#7831;Uu&#217;&#249;&#218;&#250;&#219;&#251;&#220;&#252;&#360;&#361;&#362;&#363;&#364;&#365;&#366;&#367;&#368;&#369;&#370;&#371;&#431;&#432;&#467;&#468;&#469;&#470;&#471;&#472;&#473;&#474;&#475;&#476;&#532;&#533;&#534;&#535;&#7794;&#7795;&#7796;&#7797;&#7798;&#7799;&#7800;&#7801;&#7802;&#7803;&#7908;&#7909;&#7910;&#7911;&#7912;&#7913;&#7914;&#7915;&#7916;&#7917;&#7918;&#7919;&#7920;&#7921;Vv&#434;&#651;&#7804;&#7805;&#7806;&#7807;Ww&#372;&#373;&#7808;&#7809;&#7810;&#7811;&#7812;&#7813;&#7814;&#7815;&#7816;&#7817;&#7832;Xx&#7818;&#7819;&#7820;&#7821;Yy&#221;&#253;&#255;&#376;&#374;&#375;&#435;&#436;&#562;&#563;&#7822;&#7823;&#7833;&#7922;&#7923;&#7924;&#7925;&#7926;&#7927;&#7928;&#7929;Zz&#377;&#378;&#379;&#380;&#381;&#382;&#437;&#438;&#548;&#549;&#656;&#657;&#7824;&#7825;&#7826;&#7827;&#7828;&#7829;&#7829;', 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBCCCCCCCCCCCCCCCCCDDDDDDDDDDDDDDDDDDDDDDDDEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEFFFFFFGGGGGGGGGGGGGGGGGGGGHHHHHHHHHHHHHHHHHHHHIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIJJJJJJKKKKKKKKKKKKKKLLLLLLLLLLLLLLLLLLLLLLLLLLMMMMMMMMMNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOPPPPPPPPQQQRRRRRRRRRRRRRRRRRRRRRRRSSSSSSSSSSSSSSSSSSSSSSSTTTTTTTTTTTTTTTTTTTTTTTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUVVVVVVVVWWWWWWWWWWWWWWWXXXXXXYYYYYYYYYYYYYYYYYYYYYYYZZZZZZZZZZZZZZZZZZZZZ'))"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="glossentry"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </dl>
+ </xsl:when>
+ <xsl:otherwise>
+ <!-- empty glossary -->
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:if test="not(parent::article)">
+ <xsl:call-template name="process.footnotes"/>
+ </xsl:if>
+ </div>
+</xsl:template>
+
+<xsl:template match="glossary/glossaryinfo"/>
+<xsl:template match="glossary/info"/>
+<xsl:template match="glossary/title"/>
+<xsl:template match="glossary/subtitle"/>
+<xsl:template match="glossary/titleabbrev"/>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="glosslist">
+
+<xsl:variable name="language">
+ <xsl:call-template name="l10n.language"/>
+</xsl:variable>
+
+<xsl:variable name="lowercase">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key">normalize.sort.input</xsl:with-param>
+ </xsl:call-template>
+</xsl:variable>
+
+<xsl:variable name="uppercase">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key">normalize.sort.output</xsl:with-param>
+ </xsl:call-template>
+</xsl:variable>
+
+ <div>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:call-template name="anchor"/>
+ <xsl:if test="blockinfo/title|info/title|title">
+ <xsl:call-template name="formal.object.heading"/>
+ </xsl:if>
+ <dl>
+ <xsl:choose>
+ <xsl:when test="$glossary.sort != 0">
+ <xsl:apply-templates select="glossentry">
+ <xsl:sort lang="{$language}" select="normalize-space(translate(concat(@sortas, glossterm[not(parent::glossentry/@sortas) or parent::glossentry/@sortas = '']), 'Aa&#192;&#224;&#193;&#225;&#194;&#226;&#195;&#227;&#196;&#228;&#197;&#229;&#256;&#257;&#258;&#259;&#260;&#261;&#461;&#462;&#478;&#479;&#480;&#481;&#506;&#507;&#512;&#513;&#514;&#515;&#550;&#551;&#7680;&#7681;&#7834;&#7840;&#7841;&#7842;&#7843;&#7844;&#7845;&#7846;&#7847;&#7848;&#7849;&#7850;&#7851;&#7852;&#7853;&#7854;&#7855;&#7856;&#7857;&#7858;&#7859;&#7860;&#7861;&#7862;&#7863;Bb&#384;&#385;&#595;&#386;&#387;&#7682;&#7683;&#7684;&#7685;&#7686;&#7687;Cc&#199;&#231;&#262;&#263;&#264;&#265;&#266;&#267;&#268;&#269;&#391;&#392;&#597;&#7688;&#7689;Dd&#270;&#271;&#272;&#273;&#394;&#599;&#395;&#396;&#453;&#498;&#545;&#598;&#7690;&#7691;&#7692;&#7693;&#7694;&#7695;&#7696;&#7697;&#7698;&#7699;Ee&#200;&#232;&#201;&#233;&#202;&#234;&#203;&#235;&#274;&#275;&#276;&#277;&#278;&#279;&#280;&#281;&#282;&#283;&#516;&#517;&#518;&#519;&#552;&#553;&#7700;&#7701;&#7702;&#7703;&#7704;&#7705;&#7706;&#7707;&#7708;&#7709;&#7864;&#7865;&#7866;&#7867;&#7868;&#7869;&#7870;&#7871;&#7872;&#7873;&#7874;&#7875;&#7876;&#7877;&#7878;&#7879;Ff&#401;&#402;&#7710;&#7711;Gg&#284;&#285;&#286;&#287;&#288;&#289;&#290;&#291;&#403;&#608;&#484;&#485;&#486;&#487;&#500;&#501;&#7712;&#7713;Hh&#292;&#293;&#294;&#295;&#542;&#543;&#614;&#7714;&#7715;&#7716;&#7717;&#7718;&#7719;&#7720;&#7721;&#7722;&#7723;&#7830;Ii&#204;&#236;&#205;&#237;&#206;&#238;&#207;&#239;&#296;&#297;&#298;&#299;&#300;&#301;&#302;&#303;&#304;&#407;&#616;&#463;&#464;&#520;&#521;&#522;&#523;&#7724;&#7725;&#7726;&#7727;&#7880;&#7881;&#7882;&#7883;Jj&#308;&#309;&#496;&#669;Kk&#310;&#311;&#408;&#409;&#488;&#489;&#7728;&#7729;&#7730;&#7731;&#7732;&#7733;Ll&#313;&#314;&#315;&#316;&#317;&#318;&#319;&#320;&#321;&#322;&#410;&#456;&#564;&#619;&#620;&#621;&#7734;&#7735;&#7736;&#7737;&#7738;&#7739;&#7740;&#7741;Mm&#625;&#7742;&#7743;&#7744;&#7745;&#7746;&#7747;Nn&#209;&#241;&#323;&#324;&#325;&#326;&#327;&#328;&#413;&#626;&#414;&#544;&#459;&#504;&#505;&#565;&#627;&#7748;&#7749;&#7750;&#7751;&#7752;&#7753;&#7754;&#7755;Oo&#210;&#242;&#211;&#243;&#212;&#244;&#213;&#245;&#214;&#246;&#216;&#248;&#332;&#333;&#334;&#335;&#336;&#337;&#415;&#416;&#417;&#465;&#466;&#490;&#491;&#492;&#493;&#510;&#511;&#524;&#525;&#526;&#527;&#554;&#555;&#556;&#557;&#558;&#559;&#560;&#561;&#7756;&#7757;&#7758;&#7759;&#7760;&#7761;&#7762;&#7763;&#7884;&#7885;&#7886;&#7887;&#7888;&#7889;&#7890;&#7891;&#7892;&#7893;&#7894;&#7895;&#7896;&#7897;&#7898;&#7899;&#7900;&#7901;&#7902;&#7903;&#7904;&#7905;&#7906;&#7907;Pp&#420;&#421;&#7764;&#7765;&#7766;&#7767;Qq&#672;Rr&#340;&#341;&#342;&#343;&#344;&#345;&#528;&#529;&#530;&#531;&#636;&#637;&#638;&#7768;&#7769;&#7770;&#7771;&#7772;&#7773;&#7774;&#7775;Ss&#346;&#347;&#348;&#349;&#350;&#351;&#352;&#353;&#536;&#537;&#642;&#7776;&#7777;&#7778;&#7779;&#7780;&#7781;&#7782;&#7783;&#7784;&#7785;Tt&#354;&#355;&#356;&#357;&#358;&#359;&#427;&#428;&#429;&#430;&#648;&#538;&#539;&#566;&#7786;&#7787;&#7788;&#7789;&#7790;&#7791;&#7792;&#7793;&#7831;Uu&#217;&#249;&#218;&#250;&#219;&#251;&#220;&#252;&#360;&#361;&#362;&#363;&#364;&#365;&#366;&#367;&#368;&#369;&#370;&#371;&#431;&#432;&#467;&#468;&#469;&#470;&#471;&#472;&#473;&#474;&#475;&#476;&#532;&#533;&#534;&#535;&#7794;&#7795;&#7796;&#7797;&#7798;&#7799;&#7800;&#7801;&#7802;&#7803;&#7908;&#7909;&#7910;&#7911;&#7912;&#7913;&#7914;&#7915;&#7916;&#7917;&#7918;&#7919;&#7920;&#7921;Vv&#434;&#651;&#7804;&#7805;&#7806;&#7807;Ww&#372;&#373;&#7808;&#7809;&#7810;&#7811;&#7812;&#7813;&#7814;&#7815;&#7816;&#7817;&#7832;Xx&#7818;&#7819;&#7820;&#7821;Yy&#221;&#253;&#255;&#376;&#374;&#375;&#435;&#436;&#562;&#563;&#7822;&#7823;&#7833;&#7922;&#7923;&#7924;&#7925;&#7926;&#7927;&#7928;&#7929;Zz&#377;&#378;&#379;&#380;&#381;&#382;&#437;&#438;&#548;&#549;&#656;&#657;&#7824;&#7825;&#7826;&#7827;&#7828;&#7829;&#7829;', 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBCCCCCCCCCCCCCCCCCDDDDDDDDDDDDDDDDDDDDDDDDEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEFFFFFFGGGGGGGGGGGGGGGGGGGGHHHHHHHHHHHHHHHHHHHHIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIJJJJJJKKKKKKKKKKKKKKLLLLLLLLLLLLLLLLLLLLLLLLLLMMMMMMMMMNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOPPPPPPPPQQQRRRRRRRRRRRRRRRRRRRRRRRSSSSSSSSSSSSSSSSSSSSSSSTTTTTTTTTTTTTTTTTTTTTTTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUVVVVVVVVWWWWWWWWWWWWWWWXXXXXXYYYYYYYYYYYYYYYYYYYYYYYZZZZZZZZZZZZZZZZZZZZZ'))"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="glossentry"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </dl>
+ </div>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="glossdiv">
+
+<xsl:variable name="language">
+ <xsl:call-template name="l10n.language"/>
+</xsl:variable>
+
+<xsl:variable name="lowercase">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key">normalize.sort.input</xsl:with-param>
+ </xsl:call-template>
+</xsl:variable>
+
+<xsl:variable name="uppercase">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key">normalize.sort.output</xsl:with-param>
+ </xsl:call-template>
+</xsl:variable>
+
+ <xsl:call-template name="id.warning"/>
+
+ <div>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates select="(glossentry[1]/preceding-sibling::*)"/>
+
+ <dl>
+ <xsl:choose>
+ <xsl:when test="$glossary.sort != 0">
+ <xsl:apply-templates select="glossentry">
+ <xsl:sort lang="{$language}" select="translate(glossterm, $lowercase, $uppercase)"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="glossentry"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </dl>
+ </div>
+</xsl:template>
+
+<xsl:template match="glossdiv/title">
+ <h3>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates/>
+ </h3>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<!--
+GlossEntry ::=
+ GlossTerm, Acronym?, Abbrev?,
+ (IndexTerm)*,
+ RevHistory?,
+ (GlossSee | GlossDef+)
+-->
+
+<xsl:template match="glossentry">
+ <xsl:choose>
+ <xsl:when test="$glossentry.show.acronym = 'primary'">
+ <dt>
+ <xsl:call-template name="anchor">
+ <xsl:with-param name="conditional">
+ <xsl:choose>
+ <xsl:when test="$glossterm.auto.link != 0">0</xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:with-param>
+ </xsl:call-template>
+
+ <xsl:choose>
+ <xsl:when test="acronym|abbrev">
+ <xsl:apply-templates select="acronym|abbrev"/>
+ <xsl:text> (</xsl:text>
+ <xsl:apply-templates select="glossterm"/>
+ <xsl:text>)</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="glossterm"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </dt>
+ </xsl:when>
+ <xsl:when test="$glossentry.show.acronym = 'yes'">
+ <dt>
+ <xsl:call-template name="anchor">
+ <xsl:with-param name="conditional">
+ <xsl:choose>
+ <xsl:when test="$glossterm.auto.link != 0">0</xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:with-param>
+ </xsl:call-template>
+
+ <xsl:apply-templates select="glossterm"/>
+
+ <xsl:if test="acronym|abbrev">
+ <xsl:text> (</xsl:text>
+ <xsl:apply-templates select="acronym|abbrev"/>
+ <xsl:text>)</xsl:text>
+ </xsl:if>
+ </dt>
+ </xsl:when>
+ <xsl:otherwise>
+ <dt>
+ <xsl:call-template name="anchor">
+ <xsl:with-param name="conditional">
+ <xsl:choose>
+ <xsl:when test="$glossterm.auto.link != 0">0</xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:with-param>
+ </xsl:call-template>
+
+ <xsl:apply-templates select="glossterm"/>
+ </dt>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:apply-templates select="indexterm|revhistory|glosssee|glossdef"/>
+</xsl:template>
+
+<xsl:template match="glossentry/glossterm">
+ <xsl:apply-templates/>
+ <xsl:if test="following-sibling::glossterm">, </xsl:if>
+</xsl:template>
+
+<xsl:template match="glossentry/acronym">
+ <xsl:apply-templates/>
+ <xsl:if test="following-sibling::acronym|following-sibling::abbrev">, </xsl:if>
+</xsl:template>
+
+<xsl:template match="glossentry/abbrev">
+ <xsl:apply-templates/>
+ <xsl:if test="following-sibling::acronym|following-sibling::abbrev">, </xsl:if>
+</xsl:template>
+
+<xsl:template match="glossentry/revhistory">
+</xsl:template>
+
+<xsl:template match="glossentry/glosssee">
+ <xsl:variable name="otherterm" select="@otherterm"/>
+ <xsl:variable name="targets" select="key('id', $otherterm)"/>
+ <xsl:variable name="target" select="$targets[1]"/>
+ <xsl:variable name="xlink" select="@xlink:href"/>
+
+ <dd>
+ <p>
+ <xsl:variable name="template">
+ <xsl:call-template name="gentext.template">
+ <xsl:with-param name="context" select="'glossary'"/>
+ <xsl:with-param name="name" select="'see'"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="title">
+ <xsl:choose>
+ <xsl:when test="$target">
+ <a>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:attribute name="href">
+ <xsl:call-template name="href.target">
+ <xsl:with-param name="object" select="$target"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:apply-templates select="$target" mode="xref-to"/>
+ </a>
+ </xsl:when>
+ <xsl:when test="$xlink">
+ <xsl:call-template name="simple.xlink">
+ <xsl:with-param name="content">
+ <xsl:apply-templates/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="$otherterm != '' and not($target)">
+ <xsl:message>
+ <xsl:text>Warning: glosssee @otherterm reference not found: </xsl:text>
+ <xsl:value-of select="$otherterm"/>
+ </xsl:message>
+ <xsl:apply-templates/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:call-template name="substitute-markup">
+ <xsl:with-param name="template" select="$template"/>
+ <xsl:with-param name="title" select="$title"/>
+ </xsl:call-template>
+ </p>
+ </dd>
+</xsl:template>
+
+<xsl:template match="glossentry/glossdef">
+ <dd>
+ <xsl:apply-templates select="*[local-name(.) != 'glossseealso']"/>
+ <xsl:if test="glossseealso">
+ <p>
+ <xsl:variable name="template">
+ <xsl:call-template name="gentext.template">
+ <xsl:with-param name="context" select="'glossary'"/>
+ <xsl:with-param name="name" select="'seealso'"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:variable name="title">
+ <xsl:apply-templates select="glossseealso"/>
+ </xsl:variable>
+ <xsl:call-template name="substitute-markup">
+ <xsl:with-param name="template" select="$template"/>
+ <xsl:with-param name="title" select="$title"/>
+ </xsl:call-template>
+ </p>
+ </xsl:if>
+ </dd>
+</xsl:template>
+
+<xsl:template match="glossseealso">
+ <xsl:variable name="otherterm" select="@otherterm"/>
+ <xsl:variable name="targets" select="key('id', $otherterm)"/>
+ <xsl:variable name="target" select="$targets[1]"/>
+ <xsl:variable name="xlink" select="@xlink:href"/>
+
+ <xsl:choose>
+ <xsl:when test="$target">
+ <a>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:attribute name="href">
+ <xsl:call-template name="href.target">
+ <xsl:with-param name="object" select="$target"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:apply-templates select="$target" mode="xref-to"/>
+ </a>
+ </xsl:when>
+ <xsl:when test="$xlink">
+ <xsl:call-template name="simple.xlink">
+ <xsl:with-param name="content">
+ <xsl:apply-templates/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="$otherterm != '' and not($target)">
+ <xsl:message>
+ <xsl:text>Warning: glossseealso @otherterm reference not found: </xsl:text>
+ <xsl:value-of select="$otherterm"/>
+ </xsl:message>
+ <xsl:apply-templates/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates/>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:choose>
+ <xsl:when test="position() = last()"/>
+ <xsl:otherwise>
+ <xsl:call-template name="gentext.template">
+ <xsl:with-param name="context" select="'glossary'"/>
+ <xsl:with-param name="name" select="'seealso-separator'"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<!-- Glossary collection -->
+
+<xsl:template match="glossary[@role='auto']" priority="2">
+
+<xsl:variable name="language">
+ <xsl:call-template name="l10n.language"/>
+</xsl:variable>
+
+<xsl:variable name="lowercase">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key">normalize.sort.input</xsl:with-param>
+ </xsl:call-template>
+</xsl:variable>
+
+<xsl:variable name="uppercase">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key">normalize.sort.output</xsl:with-param>
+ </xsl:call-template>
+</xsl:variable>
+
+ <xsl:variable name="terms" select="//glossterm[not(parent::glossdef)]|//firstterm"/>
+ <xsl:variable name="collection" select="document($glossary.collection, .)"/>
+
+ <xsl:call-template name="id.warning"/>
+
+ <xsl:if test="$glossary.collection = ''">
+ <xsl:message>
+ <xsl:text>Warning: processing automatic glossary </xsl:text>
+ <xsl:text>without a glossary.collection file.</xsl:text>
+ </xsl:message>
+ </xsl:if>
+
+ <xsl:if test="not($collection) and $glossary.collection != ''">
+ <xsl:message>
+ <xsl:text>Warning: processing automatic glossary but unable to </xsl:text>
+ <xsl:text>open glossary.collection file '</xsl:text>
+ <xsl:value-of select="$glossary.collection"/>
+ <xsl:text>'</xsl:text>
+ </xsl:message>
+ </xsl:if>
+
+ <div>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:if test="$generate.id.attributes != 0">
+ <xsl:attribute name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:call-template name="glossary.titlepage"/>
+
+ <xsl:choose>
+ <xsl:when test="glossdiv and $collection//glossdiv">
+ <xsl:for-each select="$collection//glossdiv">
+ <!-- first see if there are any in this div -->
+ <xsl:variable name="exist.test">
+ <xsl:for-each select="glossentry">
+ <xsl:variable name="cterm" select="glossterm"/>
+ <xsl:if test="$terms[@baseform = $cterm or . = $cterm]">
+ <xsl:value-of select="glossterm"/>
+ </xsl:if>
+ </xsl:for-each>
+ </xsl:variable>
+
+ <xsl:if test="$exist.test != ''">
+ <xsl:apply-templates select="." mode="auto-glossary">
+ <xsl:with-param name="terms" select="$terms"/>
+ </xsl:apply-templates>
+ </xsl:if>
+ </xsl:for-each>
+ </xsl:when>
+ <xsl:otherwise>
+ <dl>
+ <xsl:choose>
+ <xsl:when test="$glossary.sort != 0">
+ <xsl:for-each select="$collection//glossentry">
+ <xsl:sort lang="{$language}" select="normalize-space(translate(concat(@sortas, glossterm[not(parent::glossentry/@sortas) or parent::glossentry/@sortas = '']), 'Aa&#192;&#224;&#193;&#225;&#194;&#226;&#195;&#227;&#196;&#228;&#197;&#229;&#256;&#257;&#258;&#259;&#260;&#261;&#461;&#462;&#478;&#479;&#480;&#481;&#506;&#507;&#512;&#513;&#514;&#515;&#550;&#551;&#7680;&#7681;&#7834;&#7840;&#7841;&#7842;&#7843;&#7844;&#7845;&#7846;&#7847;&#7848;&#7849;&#7850;&#7851;&#7852;&#7853;&#7854;&#7855;&#7856;&#7857;&#7858;&#7859;&#7860;&#7861;&#7862;&#7863;Bb&#384;&#385;&#595;&#386;&#387;&#7682;&#7683;&#7684;&#7685;&#7686;&#7687;Cc&#199;&#231;&#262;&#263;&#264;&#265;&#266;&#267;&#268;&#269;&#391;&#392;&#597;&#7688;&#7689;Dd&#270;&#271;&#272;&#273;&#394;&#599;&#395;&#396;&#453;&#498;&#545;&#598;&#7690;&#7691;&#7692;&#7693;&#7694;&#7695;&#7696;&#7697;&#7698;&#7699;Ee&#200;&#232;&#201;&#233;&#202;&#234;&#203;&#235;&#274;&#275;&#276;&#277;&#278;&#279;&#280;&#281;&#282;&#283;&#516;&#517;&#518;&#519;&#552;&#553;&#7700;&#7701;&#7702;&#7703;&#7704;&#7705;&#7706;&#7707;&#7708;&#7709;&#7864;&#7865;&#7866;&#7867;&#7868;&#7869;&#7870;&#7871;&#7872;&#7873;&#7874;&#7875;&#7876;&#7877;&#7878;&#7879;Ff&#401;&#402;&#7710;&#7711;Gg&#284;&#285;&#286;&#287;&#288;&#289;&#290;&#291;&#403;&#608;&#484;&#485;&#486;&#487;&#500;&#501;&#7712;&#7713;Hh&#292;&#293;&#294;&#295;&#542;&#543;&#614;&#7714;&#7715;&#7716;&#7717;&#7718;&#7719;&#7720;&#7721;&#7722;&#7723;&#7830;Ii&#204;&#236;&#205;&#237;&#206;&#238;&#207;&#239;&#296;&#297;&#298;&#299;&#300;&#301;&#302;&#303;&#304;&#407;&#616;&#463;&#464;&#520;&#521;&#522;&#523;&#7724;&#7725;&#7726;&#7727;&#7880;&#7881;&#7882;&#7883;Jj&#308;&#309;&#496;&#669;Kk&#310;&#311;&#408;&#409;&#488;&#489;&#7728;&#7729;&#7730;&#7731;&#7732;&#7733;Ll&#313;&#314;&#315;&#316;&#317;&#318;&#319;&#320;&#321;&#322;&#410;&#456;&#564;&#619;&#620;&#621;&#7734;&#7735;&#7736;&#7737;&#7738;&#7739;&#7740;&#7741;Mm&#625;&#7742;&#7743;&#7744;&#7745;&#7746;&#7747;Nn&#209;&#241;&#323;&#324;&#325;&#326;&#327;&#328;&#413;&#626;&#414;&#544;&#459;&#504;&#505;&#565;&#627;&#7748;&#7749;&#7750;&#7751;&#7752;&#7753;&#7754;&#7755;Oo&#210;&#242;&#211;&#243;&#212;&#244;&#213;&#245;&#214;&#246;&#216;&#248;&#332;&#333;&#334;&#335;&#336;&#337;&#415;&#416;&#417;&#465;&#466;&#490;&#491;&#492;&#493;&#510;&#511;&#524;&#525;&#526;&#527;&#554;&#555;&#556;&#557;&#558;&#559;&#560;&#561;&#7756;&#7757;&#7758;&#7759;&#7760;&#7761;&#7762;&#7763;&#7884;&#7885;&#7886;&#7887;&#7888;&#7889;&#7890;&#7891;&#7892;&#7893;&#7894;&#7895;&#7896;&#7897;&#7898;&#7899;&#7900;&#7901;&#7902;&#7903;&#7904;&#7905;&#7906;&#7907;Pp&#420;&#421;&#7764;&#7765;&#7766;&#7767;Qq&#672;Rr&#340;&#341;&#342;&#343;&#344;&#345;&#528;&#529;&#530;&#531;&#636;&#637;&#638;&#7768;&#7769;&#7770;&#7771;&#7772;&#7773;&#7774;&#7775;Ss&#346;&#347;&#348;&#349;&#350;&#351;&#352;&#353;&#536;&#537;&#642;&#7776;&#7777;&#7778;&#7779;&#7780;&#7781;&#7782;&#7783;&#7784;&#7785;Tt&#354;&#355;&#356;&#357;&#358;&#359;&#427;&#428;&#429;&#430;&#648;&#538;&#539;&#566;&#7786;&#7787;&#7788;&#7789;&#7790;&#7791;&#7792;&#7793;&#7831;Uu&#217;&#249;&#218;&#250;&#219;&#251;&#220;&#252;&#360;&#361;&#362;&#363;&#364;&#365;&#366;&#367;&#368;&#369;&#370;&#371;&#431;&#432;&#467;&#468;&#469;&#470;&#471;&#472;&#473;&#474;&#475;&#476;&#532;&#533;&#534;&#535;&#7794;&#7795;&#7796;&#7797;&#7798;&#7799;&#7800;&#7801;&#7802;&#7803;&#7908;&#7909;&#7910;&#7911;&#7912;&#7913;&#7914;&#7915;&#7916;&#7917;&#7918;&#7919;&#7920;&#7921;Vv&#434;&#651;&#7804;&#7805;&#7806;&#7807;Ww&#372;&#373;&#7808;&#7809;&#7810;&#7811;&#7812;&#7813;&#7814;&#7815;&#7816;&#7817;&#7832;Xx&#7818;&#7819;&#7820;&#7821;Yy&#221;&#253;&#255;&#376;&#374;&#375;&#435;&#436;&#562;&#563;&#7822;&#7823;&#7833;&#7922;&#7923;&#7924;&#7925;&#7926;&#7927;&#7928;&#7929;Zz&#377;&#378;&#379;&#380;&#381;&#382;&#437;&#438;&#548;&#549;&#656;&#657;&#7824;&#7825;&#7826;&#7827;&#7828;&#7829;&#7829;', 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBCCCCCCCCCCCCCCCCCDDDDDDDDDDDDDDDDDDDDDDDDEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEFFFFFFGGGGGGGGGGGGGGGGGGGGHHHHHHHHHHHHHHHHHHHHIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIJJJJJJKKKKKKKKKKKKKKLLLLLLLLLLLLLLLLLLLLLLLLLLMMMMMMMMMNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOPPPPPPPPQQQRRRRRRRRRRRRRRRRRRRRRRRSSSSSSSSSSSSSSSSSSSSSSSTTTTTTTTTTTTTTTTTTTTTTTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUVVVVVVVVWWWWWWWWWWWWWWWXXXXXXYYYYYYYYYYYYYYYYYYYYYYYZZZZZZZZZZZZZZZZZZZZZ'))"/>
+ <xsl:variable name="cterm" select="glossterm"/>
+ <xsl:if test="$terms[@baseform = $cterm or . = $cterm]">
+ <xsl:apply-templates select="." mode="auto-glossary"/>
+ </xsl:if>
+ </xsl:for-each>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:for-each select="$collection//glossentry">
+ <xsl:variable name="cterm" select="glossterm"/>
+ <xsl:if test="$terms[@baseform = $cterm or . = $cterm]">
+ <xsl:apply-templates select="." mode="auto-glossary"/>
+ </xsl:if>
+ </xsl:for-each>
+ </xsl:otherwise>
+ </xsl:choose>
+ </dl>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:if test="not(parent::article)">
+ <xsl:call-template name="process.footnotes"/>
+ </xsl:if>
+ </div>
+</xsl:template>
+
+<xsl:template match="*" mode="auto-glossary">
+ <!-- pop back out to the default mode for most elements -->
+ <xsl:apply-templates select="."/>
+</xsl:template>
+
+<xsl:template match="glossdiv" mode="auto-glossary">
+ <xsl:param name="terms" select="."/>
+
+
+<xsl:variable name="language">
+ <xsl:call-template name="l10n.language"/>
+</xsl:variable>
+
+<xsl:variable name="lowercase">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key">normalize.sort.input</xsl:with-param>
+ </xsl:call-template>
+</xsl:variable>
+
+<xsl:variable name="uppercase">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key">normalize.sort.output</xsl:with-param>
+ </xsl:call-template>
+</xsl:variable>
+
+
+ <div>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates select="(glossentry[1]/preceding-sibling::*)"/>
+
+ <dl>
+ <xsl:choose>
+ <xsl:when test="$glossary.sort != 0">
+ <xsl:for-each select="glossentry">
+ <xsl:sort lang="{$language}" select="normalize-space(translate(concat(@sortas, glossterm[not(parent::glossentry/@sortas) or parent::glossentry/@sortas = '']), 'Aa&#192;&#224;&#193;&#225;&#194;&#226;&#195;&#227;&#196;&#228;&#197;&#229;&#256;&#257;&#258;&#259;&#260;&#261;&#461;&#462;&#478;&#479;&#480;&#481;&#506;&#507;&#512;&#513;&#514;&#515;&#550;&#551;&#7680;&#7681;&#7834;&#7840;&#7841;&#7842;&#7843;&#7844;&#7845;&#7846;&#7847;&#7848;&#7849;&#7850;&#7851;&#7852;&#7853;&#7854;&#7855;&#7856;&#7857;&#7858;&#7859;&#7860;&#7861;&#7862;&#7863;Bb&#384;&#385;&#595;&#386;&#387;&#7682;&#7683;&#7684;&#7685;&#7686;&#7687;Cc&#199;&#231;&#262;&#263;&#264;&#265;&#266;&#267;&#268;&#269;&#391;&#392;&#597;&#7688;&#7689;Dd&#270;&#271;&#272;&#273;&#394;&#599;&#395;&#396;&#453;&#498;&#545;&#598;&#7690;&#7691;&#7692;&#7693;&#7694;&#7695;&#7696;&#7697;&#7698;&#7699;Ee&#200;&#232;&#201;&#233;&#202;&#234;&#203;&#235;&#274;&#275;&#276;&#277;&#278;&#279;&#280;&#281;&#282;&#283;&#516;&#517;&#518;&#519;&#552;&#553;&#7700;&#7701;&#7702;&#7703;&#7704;&#7705;&#7706;&#7707;&#7708;&#7709;&#7864;&#7865;&#7866;&#7867;&#7868;&#7869;&#7870;&#7871;&#7872;&#7873;&#7874;&#7875;&#7876;&#7877;&#7878;&#7879;Ff&#401;&#402;&#7710;&#7711;Gg&#284;&#285;&#286;&#287;&#288;&#289;&#290;&#291;&#403;&#608;&#484;&#485;&#486;&#487;&#500;&#501;&#7712;&#7713;Hh&#292;&#293;&#294;&#295;&#542;&#543;&#614;&#7714;&#7715;&#7716;&#7717;&#7718;&#7719;&#7720;&#7721;&#7722;&#7723;&#7830;Ii&#204;&#236;&#205;&#237;&#206;&#238;&#207;&#239;&#296;&#297;&#298;&#299;&#300;&#301;&#302;&#303;&#304;&#407;&#616;&#463;&#464;&#520;&#521;&#522;&#523;&#7724;&#7725;&#7726;&#7727;&#7880;&#7881;&#7882;&#7883;Jj&#308;&#309;&#496;&#669;Kk&#310;&#311;&#408;&#409;&#488;&#489;&#7728;&#7729;&#7730;&#7731;&#7732;&#7733;Ll&#313;&#314;&#315;&#316;&#317;&#318;&#319;&#320;&#321;&#322;&#410;&#456;&#564;&#619;&#620;&#621;&#7734;&#7735;&#7736;&#7737;&#7738;&#7739;&#7740;&#7741;Mm&#625;&#7742;&#7743;&#7744;&#7745;&#7746;&#7747;Nn&#209;&#241;&#323;&#324;&#325;&#326;&#327;&#328;&#413;&#626;&#414;&#544;&#459;&#504;&#505;&#565;&#627;&#7748;&#7749;&#7750;&#7751;&#7752;&#7753;&#7754;&#7755;Oo&#210;&#242;&#211;&#243;&#212;&#244;&#213;&#245;&#214;&#246;&#216;&#248;&#332;&#333;&#334;&#335;&#336;&#337;&#415;&#416;&#417;&#465;&#466;&#490;&#491;&#492;&#493;&#510;&#511;&#524;&#525;&#526;&#527;&#554;&#555;&#556;&#557;&#558;&#559;&#560;&#561;&#7756;&#7757;&#7758;&#7759;&#7760;&#7761;&#7762;&#7763;&#7884;&#7885;&#7886;&#7887;&#7888;&#7889;&#7890;&#7891;&#7892;&#7893;&#7894;&#7895;&#7896;&#7897;&#7898;&#7899;&#7900;&#7901;&#7902;&#7903;&#7904;&#7905;&#7906;&#7907;Pp&#420;&#421;&#7764;&#7765;&#7766;&#7767;Qq&#672;Rr&#340;&#341;&#342;&#343;&#344;&#345;&#528;&#529;&#530;&#531;&#636;&#637;&#638;&#7768;&#7769;&#7770;&#7771;&#7772;&#7773;&#7774;&#7775;Ss&#346;&#347;&#348;&#349;&#350;&#351;&#352;&#353;&#536;&#537;&#642;&#7776;&#7777;&#7778;&#7779;&#7780;&#7781;&#7782;&#7783;&#7784;&#7785;Tt&#354;&#355;&#356;&#357;&#358;&#359;&#427;&#428;&#429;&#430;&#648;&#538;&#539;&#566;&#7786;&#7787;&#7788;&#7789;&#7790;&#7791;&#7792;&#7793;&#7831;Uu&#217;&#249;&#218;&#250;&#219;&#251;&#220;&#252;&#360;&#361;&#362;&#363;&#364;&#365;&#366;&#367;&#368;&#369;&#370;&#371;&#431;&#432;&#467;&#468;&#469;&#470;&#471;&#472;&#473;&#474;&#475;&#476;&#532;&#533;&#534;&#535;&#7794;&#7795;&#7796;&#7797;&#7798;&#7799;&#7800;&#7801;&#7802;&#7803;&#7908;&#7909;&#7910;&#7911;&#7912;&#7913;&#7914;&#7915;&#7916;&#7917;&#7918;&#7919;&#7920;&#7921;Vv&#434;&#651;&#7804;&#7805;&#7806;&#7807;Ww&#372;&#373;&#7808;&#7809;&#7810;&#7811;&#7812;&#7813;&#7814;&#7815;&#7816;&#7817;&#7832;Xx&#7818;&#7819;&#7820;&#7821;Yy&#221;&#253;&#255;&#376;&#374;&#375;&#435;&#436;&#562;&#563;&#7822;&#7823;&#7833;&#7922;&#7923;&#7924;&#7925;&#7926;&#7927;&#7928;&#7929;Zz&#377;&#378;&#379;&#380;&#381;&#382;&#437;&#438;&#548;&#549;&#656;&#657;&#7824;&#7825;&#7826;&#7827;&#7828;&#7829;&#7829;', 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBCCCCCCCCCCCCCCCCCDDDDDDDDDDDDDDDDDDDDDDDDEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEFFFFFFGGGGGGGGGGGGGGGGGGGGHHHHHHHHHHHHHHHHHHHHIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIJJJJJJKKKKKKKKKKKKKKLLLLLLLLLLLLLLLLLLLLLLLLLLMMMMMMMMMNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOPPPPPPPPQQQRRRRRRRRRRRRRRRRRRRRRRRSSSSSSSSSSSSSSSSSSSSSSSTTTTTTTTTTTTTTTTTTTTTTTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUVVVVVVVVWWWWWWWWWWWWWWWXXXXXXYYYYYYYYYYYYYYYYYYYYYYYZZZZZZZZZZZZZZZZZZZZZ'))"/>!
+ <xsl:variable name="cterm" select="glossterm"/>
+ <xsl:if test="$terms[@baseform = $cterm or . = $cterm]">
+ <xsl:apply-templates select="." mode="auto-glossary"/>
+ </xsl:if>
+ </xsl:for-each>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:for-each select="glossentry">
+ <xsl:variable name="cterm" select="glossterm"/>
+ <xsl:if test="$terms[@baseform = $cterm or . = $cterm]">
+ <xsl:apply-templates select="." mode="auto-glossary"/>
+ </xsl:if>
+ </xsl:for-each>
+ </xsl:otherwise>
+ </xsl:choose>
+ </dl>
+ </div>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/graphics.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/graphics.xsl
new file mode 100644
index 0000000..d1c04fb
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/graphics.xsl
@@ -0,0 +1,1436 @@
+<?xml version="1.0" encoding="ASCII"?>
+<!--This file was created automatically by html2xhtml-->
+<!--from the HTML stylesheets.-->
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:stext="http://nwalsh.com/xslt/ext/com.nwalsh.saxon.TextFactory" xmlns:simg="http://nwalsh.com/xslt/ext/com.nwalsh.saxon.ImageIntrinsics" xmlns:ximg="xalan://com.nwalsh.xalan.ImageIntrinsics" xmlns:xtext="xalan://com.nwalsh.xalan.Text" xmlns:lxslt="http://xml.apache.org/xslt" xmlns="http://www.w3.org/1999/xhtml" exclude-result-prefixes="xlink stext xtext lxslt simg ximg" extension-element-prefixes="stext xtext" version="1.0">
+
+<!-- ********************************************************************
+ $Id: graphics.xsl 8421 2009-05-04 07:49:49Z bobstayton $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ Contributors:
+ Colin Paul Adams, <colin@colina.demon.co.uk>
+
+ ******************************************************************** -->
+
+<lxslt:component prefix="xtext" elements="insertfile"/>
+<lxslt:component prefix="ximg" functions="new getWidth getDepth"/>
+
+<!-- ==================================================================== -->
+<!-- Graphic format tests for the HTML backend -->
+
+<xsl:template name="is.graphic.format">
+ <xsl:param name="format"/>
+ <xsl:if test="$format = 'SVG' or $format = 'PNG' or $format = 'JPG' or $format = 'JPEG' or $format = 'linespecific' or $format = 'GIF' or $format = 'GIF87a' or $format = 'GIF89a' or $format = 'BMP'">1</xsl:if>
+</xsl:template>
+
+<xsl:template name="is.graphic.extension">
+ <xsl:param name="ext"/>
+ <xsl:variable name="lcext" select="translate($ext, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')"/>
+ <xsl:if test="$lcext = 'svg' or $lcext = 'png' or $lcext = 'jpeg' or $lcext = 'jpg' or $lcext = 'avi' or $lcext = 'mpg' or $lcext = 'mpeg' or $lcext = 'qt' or $lcext = 'gif' or $lcext = 'bmp'">1</xsl:if>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="screenshot">
+ <div>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates/>
+ </div>
+</xsl:template>
+
+<xsl:template match="screeninfo">
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template name="process.image">
+ <!-- When this template is called, the current node should be -->
+ <!-- a graphic, inlinegraphic, imagedata, or videodata. All -->
+ <!-- those elements have the same set of attributes, so we can -->
+ <!-- handle them all in one place. -->
+ <xsl:param name="tag" select="'img'"/>
+ <xsl:param name="alt"/>
+ <xsl:param name="longdesc"/>
+
+ <!-- The HTML img element only supports the notion of content-area
+ scaling; it doesn't support the distinction between a
+ content-area and a viewport-area, so we have to make some
+ compromises.
+
+ 1. If only the content-area is specified, everything is fine.
+ (If you ask for a three inch image, that's what you'll get.)
+
+ 2. If only the viewport-area is provided:
+ - If scalefit=1, treat it as both the content-area and
+ the viewport-area. (If you ask for an image in a five inch
+ area, we'll make the image five inches to fill that area.)
+ - If scalefit=0, ignore the viewport-area specification.
+
+ Note: this is not quite the right semantic and has the additional
+ problem that it can result in anamorphic scaling, which scalefit
+ should never cause.
+
+ 3. If both the content-area and the viewport-area is specified
+ on a graphic element, ignore the viewport-area.
+ (If you ask for a three inch image in a five inch area, we'll assume
+ it's better to give you a three inch image in an unspecified area
+ than a five inch image in a five inch area.
+
+ Relative units also cause problems. As a general rule, the stylesheets
+ are operating too early and too loosely coupled with the rendering engine
+ to know things like the current font size or the actual dimensions of
+ an image. Therefore:
+
+ 1. We use a fixed size for pixels, $pixels.per.inch
+
+ 2. We use a fixed size for "em"s, $points.per.em
+
+ Percentages are problematic. In the following discussion, we speak
+ of width and contentwidth, but the same issues apply to depth and
+ contentdepth
+
+ 1. A width of 50% means "half of the available space for the image."
+ That's fine. But note that in HTML, this is a dynamic property and
+ the image size will vary if the browser window is resized.
+
+ 2. A contentwidth of 50% means "half of the actual image width". But
+ the stylesheets have no way to assess the image's actual size. Treating
+ this as a width of 50% is one possibility, but it produces behavior
+ (dynamic scaling) that seems entirely out of character with the
+ meaning.
+
+ Instead, the stylesheets define a $nominal.image.width
+ and convert percentages to actual values based on that nominal size.
+
+ Scale can be problematic. Scale applies to the contentwidth, so
+ a scale of 50 when a contentwidth is not specified is analagous to a
+ width of 50%. (If a contentwidth is specified, the scaling factor can
+ be applied to that value and no problem exists.)
+
+ If scale is specified but contentwidth is not supplied, the
+ nominal.image.width is used to calculate a base size
+ for scaling.
+
+ Warning: as a consequence of these decisions, unless the aspect ratio
+ of your image happens to be exactly the same as (nominal width / nominal height),
+ specifying contentwidth="50%" and contentdepth="50%" is NOT going to
+ scale the way you expect (or really, the way it should).
+
+ Don't do that. In fact, a percentage value is not recommended for content
+ size at all. Use scale instead.
+
+ Finally, align and valign are troublesome. Horizontal alignment is now
+ supported by wrapping the image in a <div align="{@align}"> (in block
+ contexts!). I can't think of anything (practical) to do about vertical
+ alignment.
+ -->
+
+ <xsl:variable name="width-units">
+ <xsl:choose>
+ <xsl:when test="$ignore.image.scaling != 0"/>
+ <xsl:when test="@width">
+ <xsl:call-template name="length-units">
+ <xsl:with-param name="length" select="@width"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="not(@depth) and $default.image.width != ''">
+ <xsl:call-template name="length-units">
+ <xsl:with-param name="length" select="$default.image.width"/>
+ </xsl:call-template>
+ </xsl:when>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="width">
+ <xsl:choose>
+ <xsl:when test="$ignore.image.scaling != 0"/>
+ <xsl:when test="@width">
+ <xsl:choose>
+ <xsl:when test="$width-units = '%'">
+ <xsl:value-of select="@width"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="length-spec">
+ <xsl:with-param name="length" select="@width"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:when test="not(@depth) and $default.image.width != ''">
+ <xsl:value-of select="$default.image.width"/>
+ </xsl:when>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="scalefit">
+ <xsl:choose>
+ <xsl:when test="$ignore.image.scaling != 0">0</xsl:when>
+ <xsl:when test="@contentwidth or @contentdepth">0</xsl:when>
+ <xsl:when test="@scale">0</xsl:when>
+ <xsl:when test="@scalefit"><xsl:value-of select="@scalefit"/></xsl:when>
+ <xsl:when test="$width != '' or @depth">1</xsl:when>
+ <xsl:otherwise>0</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="scale">
+ <xsl:choose>
+ <xsl:when test="$ignore.image.scaling != 0">1.0</xsl:when>
+ <xsl:when test="@contentwidth or @contentdepth">1.0</xsl:when>
+ <xsl:when test="@scale">
+ <xsl:value-of select="@scale div 100.0"/>
+ </xsl:when>
+ <xsl:otherwise>1.0</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="filename">
+ <xsl:choose>
+ <xsl:when test="local-name(.) = 'graphic' or local-name(.) = 'inlinegraphic'">
+ <!-- handle legacy graphic and inlinegraphic by new template -->
+ <xsl:call-template name="mediaobject.filename">
+ <xsl:with-param name="object" select="."/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <!-- imagedata, videodata, audiodata -->
+ <xsl:call-template name="mediaobject.filename">
+ <xsl:with-param name="object" select=".."/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="output_filename">
+ <xsl:choose>
+ <xsl:when test="@entityref">
+ <xsl:value-of select="$filename"/>
+ </xsl:when>
+ <!--
+ Moved test for $keep.relative.image.uris to template below:
+ <xsl:template match="@fileref">
+ -->
+ <xsl:otherwise>
+ <xsl:value-of select="$filename"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="img.src.path.pi">
+ <xsl:call-template name="pi.dbhtml_img.src.path">
+ <xsl:with-param name="node" select=".."/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="filename.for.graphicsize">
+ <xsl:choose>
+ <xsl:when test="$img.src.path.pi != ''">
+ <xsl:value-of select="concat($img.src.path.pi, $filename)"/>
+ </xsl:when>
+ <xsl:when test="$img.src.path != '' and $graphicsize.use.img.src.path != 0 and $tag = 'img' and not(starts-with($filename, '/')) and not(contains($filename, '://'))">
+ <xsl:value-of select="concat($img.src.path, $filename)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$filename"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="realintrinsicwidth">
+ <!-- This funny compound test works around a bug in XSLTC -->
+ <xsl:choose>
+ <xsl:when test="$use.extensions != 0 and $graphicsize.extension != 0">
+ <xsl:choose>
+ <xsl:when test="function-available('simg:getWidth')">
+ <xsl:value-of select="simg:getWidth(simg:new($filename.for.graphicsize), $nominal.image.width)"/>
+ </xsl:when>
+ <xsl:when test="function-available('ximg:getWidth')">
+ <xsl:value-of select="ximg:getWidth(ximg:new($filename.for.graphicsize), $nominal.image.width)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="0"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="0"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="intrinsicwidth">
+ <xsl:choose>
+ <xsl:when test="$realintrinsicwidth = 0">
+ <xsl:value-of select="$nominal.image.width"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$realintrinsicwidth"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="intrinsicdepth">
+ <!-- This funny compound test works around a bug in XSLTC -->
+ <xsl:choose>
+ <xsl:when test="$use.extensions != 0 and $graphicsize.extension != 0">
+ <xsl:choose>
+ <xsl:when test="function-available('simg:getDepth')">
+ <xsl:value-of select="simg:getDepth(simg:new($filename.for.graphicsize), $nominal.image.depth)"/>
+ </xsl:when>
+ <xsl:when test="function-available('ximg:getDepth')">
+ <xsl:value-of select="ximg:getDepth(ximg:new($filename.for.graphicsize), $nominal.image.depth)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$nominal.image.depth"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$nominal.image.depth"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="contentwidth">
+ <xsl:choose>
+ <xsl:when test="$ignore.image.scaling != 0"/>
+ <xsl:when test="@contentwidth">
+ <xsl:variable name="units">
+ <xsl:call-template name="length-units">
+ <xsl:with-param name="length" select="@contentwidth"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="$units = '%'">
+ <xsl:variable name="cmagnitude">
+ <xsl:call-template name="length-magnitude">
+ <xsl:with-param name="length" select="@contentwidth"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:value-of select="$intrinsicwidth * $cmagnitude div 100.0"/>
+ <xsl:text>px</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="length-spec">
+ <xsl:with-param name="length" select="@contentwidth"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$intrinsicwidth"/>
+ <xsl:text>px</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="scaled.contentwidth">
+ <xsl:if test="$contentwidth != ''">
+ <xsl:variable name="cwidth.in.points">
+ <xsl:call-template name="length-in-points">
+ <xsl:with-param name="length" select="$contentwidth"/>
+ <xsl:with-param name="pixels.per.inch" select="$pixels.per.inch"/>
+ <xsl:with-param name="em.size" select="$points.per.em"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:value-of select="$cwidth.in.points div 72.0 * $pixels.per.inch * $scale"/>
+ </xsl:if>
+ </xsl:variable>
+
+ <xsl:variable name="html.width">
+ <xsl:choose>
+ <xsl:when test="$ignore.image.scaling != 0"/>
+ <xsl:when test="$width-units = '%'">
+ <xsl:value-of select="$width"/>
+ </xsl:when>
+ <xsl:when test="$width != ''">
+ <xsl:variable name="width.in.points">
+ <xsl:call-template name="length-in-points">
+ <xsl:with-param name="length" select="$width"/>
+ <xsl:with-param name="pixels.per.inch" select="$pixels.per.inch"/>
+ <xsl:with-param name="em.size" select="$points.per.em"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:value-of select="round($width.in.points div 72.0 * $pixels.per.inch)"/>
+ </xsl:when>
+ <xsl:otherwise/>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="contentdepth">
+ <xsl:choose>
+ <xsl:when test="$ignore.image.scaling != 0"/>
+ <xsl:when test="@contentdepth">
+ <xsl:variable name="units">
+ <xsl:call-template name="length-units">
+ <xsl:with-param name="length" select="@contentdepth"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="$units = '%'">
+ <xsl:variable name="cmagnitude">
+ <xsl:call-template name="length-magnitude">
+ <xsl:with-param name="length" select="@contentdepth"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:value-of select="$intrinsicdepth * $cmagnitude div 100.0"/>
+ <xsl:text>px</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="length-spec">
+ <xsl:with-param name="length" select="@contentdepth"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$intrinsicdepth"/>
+ <xsl:text>px</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="scaled.contentdepth">
+ <xsl:if test="$contentdepth != ''">
+ <xsl:variable name="cdepth.in.points">
+ <xsl:call-template name="length-in-points">
+ <xsl:with-param name="length" select="$contentdepth"/>
+ <xsl:with-param name="pixels.per.inch" select="$pixels.per.inch"/>
+ <xsl:with-param name="em.size" select="$points.per.em"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:value-of select="$cdepth.in.points div 72.0 * $pixels.per.inch * $scale"/>
+ </xsl:if>
+ </xsl:variable>
+
+ <xsl:variable name="depth-units">
+ <xsl:if test="@depth">
+ <xsl:call-template name="length-units">
+ <xsl:with-param name="length" select="@depth"/>
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:variable>
+
+ <xsl:variable name="depth">
+ <xsl:if test="@depth">
+ <xsl:choose>
+ <xsl:when test="$depth-units = '%'">
+ <xsl:value-of select="@depth"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="length-spec">
+ <xsl:with-param name="length" select="@depth"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:if>
+ </xsl:variable>
+
+ <xsl:variable name="html.depth">
+ <xsl:choose>
+ <xsl:when test="$ignore.image.scaling != 0"/>
+ <xsl:when test="$depth-units = '%'">
+ <xsl:value-of select="$depth"/>
+ </xsl:when>
+ <xsl:when test="@depth and @depth != ''">
+ <xsl:variable name="depth.in.points">
+ <xsl:call-template name="length-in-points">
+ <xsl:with-param name="length" select="$depth"/>
+ <xsl:with-param name="pixels.per.inch" select="$pixels.per.inch"/>
+ <xsl:with-param name="em.size" select="$points.per.em"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:value-of select="round($depth.in.points div 72.0 * $pixels.per.inch)"/>
+ </xsl:when>
+ <xsl:otherwise/>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="viewport">
+ <xsl:choose>
+ <xsl:when test="$ignore.image.scaling != 0">0</xsl:when>
+ <xsl:when test="local-name(.) = 'inlinegraphic' or ancestor::inlinemediaobject or ancestor::inlineequation">0</xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$make.graphic.viewport"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+<!--
+ <xsl:message>=====================================
+scale: <xsl:value-of select="$scale"/>, <xsl:value-of select="$scalefit"/>
+@contentwidth <xsl:value-of select="@contentwidth"/>
+$contentwidth <xsl:value-of select="$contentwidth"/>
+scaled.contentwidth: <xsl:value-of select="$scaled.contentwidth"/>
+@width: <xsl:value-of select="@width"/>
+width: <xsl:value-of select="$width"/>
+html.width: <xsl:value-of select="$html.width"/>
+@contentdepth <xsl:value-of select="@contentdepth"/>
+$contentdepth <xsl:value-of select="$contentdepth"/>
+scaled.contentdepth: <xsl:value-of select="$scaled.contentdepth"/>
+@depth: <xsl:value-of select="@depth"/>
+depth: <xsl:value-of select="$depth"/>
+html.depth: <xsl:value-of select="$html.depth"/>
+align: <xsl:value-of select="@align"/>
+valign: <xsl:value-of select="@valign"/></xsl:message>
+-->
+
+ <xsl:variable name="scaled" select="@width|@depth|@contentwidth|@contentdepth |@scale|@scalefit"/>
+
+ <xsl:variable name="img">
+ <xsl:choose>
+ <xsl:when test="@format = 'SVG'">
+ <object type="image/svg+xml">
+ <xsl:attribute name="data">
+ <xsl:choose>
+ <xsl:when test="$img.src.path != '' and $tag = 'img' and not(starts-with($output_filename, '/')) and not(contains($output_filename, '://'))">
+ <xsl:value-of select="$img.src.path"/>
+ </xsl:when>
+ </xsl:choose>
+ <xsl:value-of select="$output_filename"/>
+ </xsl:attribute>
+ <xsl:call-template name="process.image.attributes">
+ <!--xsl:with-param name="alt" select="$alt"/ there's no alt here-->
+ <xsl:with-param name="html.depth" select="$html.depth"/>
+ <xsl:with-param name="html.width" select="$html.width"/>
+ <xsl:with-param name="longdesc" select="$longdesc"/>
+ <xsl:with-param name="scale" select="$scale"/>
+ <xsl:with-param name="scalefit" select="$scalefit"/>
+ <xsl:with-param name="scaled.contentdepth" select="$scaled.contentdepth"/>
+ <xsl:with-param name="scaled.contentwidth" select="$scaled.contentwidth"/>
+ <xsl:with-param name="viewport" select="$viewport"/>
+ </xsl:call-template>
+ <xsl:if test="@align">
+ <xsl:attribute name="align">
+ <xsl:choose>
+ <xsl:when test="@align = 'center'">middle</xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="@align"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:if test="$use.embed.for.svg != 0">
+ <embed type="image/svg+xml">
+ <xsl:attribute name="src">
+ <xsl:choose>
+ <xsl:when test="$img.src.path != '' and $tag = 'img' and not(starts-with($output_filename, '/')) and not(contains($output_filename, '://'))">
+ <xsl:value-of select="$img.src.path"/>
+ </xsl:when>
+ </xsl:choose>
+ <xsl:value-of select="$output_filename"/>
+ </xsl:attribute>
+ <xsl:call-template name="process.image.attributes">
+ <!--xsl:with-param name="alt" select="$alt"/ there's no alt here -->
+ <xsl:with-param name="html.depth" select="$html.depth"/>
+ <xsl:with-param name="html.width" select="$html.width"/>
+ <xsl:with-param name="longdesc" select="$longdesc"/>
+ <xsl:with-param name="scale" select="$scale"/>
+ <xsl:with-param name="scalefit" select="$scalefit"/>
+ <xsl:with-param name="scaled.contentdepth" select="$scaled.contentdepth"/>
+ <xsl:with-param name="scaled.contentwidth" select="$scaled.contentwidth"/>
+ <xsl:with-param name="viewport" select="$viewport"/>
+ </xsl:call-template>
+ </embed>
+ </xsl:if>
+ </object>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:element name="{$tag}" namespace="http://www.w3.org/1999/xhtml">
+ <xsl:if test="$tag = 'img' and ../../self::imageobjectco">
+ <xsl:variable name="mapname">
+ <xsl:call-template name="object.id">
+ <xsl:with-param name="object" select="../../areaspec"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:choose>
+ <xsl:when test="$scaled">
+ <!-- It might be possible to handle some scaling; needs -->
+ <!-- more investigation -->
+ <xsl:message>
+ <xsl:text>Warning: imagemaps not supported </xsl:text>
+ <xsl:text>on scaled images</xsl:text>
+ </xsl:message>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:attribute name="border">0</xsl:attribute>
+ <xsl:attribute name="usemap">
+ <xsl:value-of select="concat('#', $mapname)"/>
+ </xsl:attribute>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:if>
+
+ <xsl:attribute name="src">
+ <xsl:choose>
+ <xsl:when test="$img.src.path != '' and $tag = 'img' and not(starts-with($output_filename, '/')) and not(contains($output_filename, '://'))">
+ <xsl:value-of select="$img.src.path"/>
+ </xsl:when>
+ </xsl:choose>
+ <xsl:value-of select="$output_filename"/>
+ </xsl:attribute>
+
+ <xsl:if test="@align">
+ <xsl:attribute name="align">
+ <xsl:choose>
+ <xsl:when test="@align = 'center'">middle</xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="@align"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:call-template name="process.image.attributes">
+ <xsl:with-param name="alt">
+ <xsl:choose>
+ <xsl:when test="$alt != ''">
+ <xsl:copy-of select="$alt"/>
+ </xsl:when>
+ <xsl:when test="ancestor::figure">
+ <xsl:value-of select="normalize-space(ancestor::figure/title)"/>
+ </xsl:when>
+ </xsl:choose>
+ </xsl:with-param>
+ <xsl:with-param name="html.depth" select="$html.depth"/>
+ <xsl:with-param name="html.width" select="$html.width"/>
+ <xsl:with-param name="longdesc" select="$longdesc"/>
+ <xsl:with-param name="scale" select="$scale"/>
+ <xsl:with-param name="scalefit" select="$scalefit"/>
+ <xsl:with-param name="scaled.contentdepth" select="$scaled.contentdepth"/>
+ <xsl:with-param name="scaled.contentwidth" select="$scaled.contentwidth"/>
+ <xsl:with-param name="viewport" select="$viewport"/>
+ </xsl:call-template>
+ </xsl:element>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="bgcolor">
+ <xsl:call-template name="pi.dbhtml_background-color">
+ <xsl:with-param name="node" select=".."/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="use.viewport" select="$viewport != 0 and ($html.width != '' or ($html.depth != '' and $depth-units != '%') or $bgcolor != '' or @valign)"/>
+
+ <xsl:choose>
+ <xsl:when test="$use.viewport">
+ <table border="0" summary="manufactured viewport for HTML img" cellspacing="0" cellpadding="0">
+ <xsl:if test="$html.width != ''">
+ <xsl:attribute name="width">
+ <xsl:value-of select="$html.width"/>
+ </xsl:attribute>
+ </xsl:if>
+ <tr>
+ <xsl:if test="$html.depth != '' and $depth-units != '%'">
+ <!-- don't do this for percentages because browsers get confused -->
+ <xsl:choose>
+ <xsl:when test="$css.decoration != 0">
+ <xsl:attribute name="style">
+ <xsl:text>height: </xsl:text>
+ <xsl:value-of select="$html.depth"/>
+ <xsl:text>px</xsl:text>
+ </xsl:attribute>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:attribute name="height">
+ <xsl:value-of select="$html.depth"/>
+ </xsl:attribute>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:if>
+ <td>
+ <xsl:if test="$bgcolor != ''">
+ <xsl:choose>
+ <xsl:when test="$css.decoration != 0">
+ <xsl:attribute name="style">
+ <xsl:text>background-color: </xsl:text>
+ <xsl:value-of select="$bgcolor"/>
+ </xsl:attribute>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:attribute name="bgcolor">
+ <xsl:value-of select="$bgcolor"/>
+ </xsl:attribute>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:if>
+ <xsl:if test="@align">
+ <xsl:attribute name="align">
+ <xsl:value-of select="@align"/>
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:if test="@valign">
+ <xsl:attribute name="valign">
+ <xsl:value-of select="@valign"/>
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:copy-of select="$img"/>
+ </td>
+ </tr>
+ </table>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:copy-of select="$img"/>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:if test="$tag = 'img' and ../../self::imageobjectco and not($scaled)">
+ <xsl:variable name="mapname">
+ <xsl:call-template name="object.id">
+ <xsl:with-param name="object" select="../../areaspec"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <map name="{$mapname}">
+ <xsl:for-each select="../../areaspec//area">
+ <xsl:variable name="units">
+ <xsl:choose>
+ <xsl:when test="@units = 'other' and @otherunits">
+ <xsl:value-of select="@otherunits"/>
+ </xsl:when>
+ <xsl:when test="@units">
+ <xsl:value-of select="@units"/>
+ </xsl:when>
+ <!-- areaspec|areaset/area -->
+ <xsl:when test="../@units = 'other' and ../@otherunits">
+ <xsl:value-of select="../@otherunits"/>
+ </xsl:when>
+ <xsl:when test="../@units">
+ <xsl:value-of select="../@units"/>
+ </xsl:when>
+ <!-- areaspec/areaset/area -->
+ <xsl:when test="../../@units = 'other' and ../../@otherunits">
+ <xsl:value-of select="../@otherunits"/>
+ </xsl:when>
+ <xsl:when test="../../@units">
+ <xsl:value-of select="../../@units"/>
+ </xsl:when>
+ <xsl:otherwise>calspair</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="$units = 'calspair' or $units = 'imagemap'">
+ <xsl:variable name="coords" select="normalize-space(@coords)"/>
+
+ <area shape="rect">
+ <xsl:variable name="linkends">
+ <xsl:choose>
+ <xsl:when test="@linkends">
+ <xsl:value-of select="normalize-space(@linkends)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="normalize-space(../@linkends)"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="href">
+ <xsl:choose>
+ <xsl:when test="@xlink:href">
+ <xsl:value-of select="@xlink:href"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="../@xlink:href"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="$linkends != ''">
+ <xsl:variable name="linkend">
+ <xsl:choose>
+ <xsl:when test="contains($linkends, ' ')">
+ <xsl:value-of select="substring-before($linkends, ' ')"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$linkends"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="target" select="key('id', $linkend)[1]"/>
+
+ <xsl:if test="$target">
+ <xsl:attribute name="href">
+ <xsl:call-template name="href.target">
+ <xsl:with-param name="object" select="$target"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ </xsl:if>
+ </xsl:when>
+ <xsl:when test="$href != ''">
+ <xsl:attribute name="href">
+ <xsl:value-of select="$href"/>
+ </xsl:attribute>
+ </xsl:when>
+ </xsl:choose>
+
+ <xsl:if test="alt">
+ <xsl:attribute name="alt">
+ <xsl:value-of select="alt[1]"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:attribute name="coords">
+ <xsl:choose>
+ <xsl:when test="$units = 'calspair'">
+
+ <xsl:variable name="p1" select="substring-before($coords, ' ')"/>
+ <xsl:variable name="p2" select="substring-after($coords, ' ')"/>
+
+ <xsl:variable name="x1" select="substring-before($p1,',')"/>
+ <xsl:variable name="y1" select="substring-after($p1,',')"/>
+ <xsl:variable name="x2" select="substring-before($p2,',')"/>
+ <xsl:variable name="y2" select="substring-after($p2,',')"/>
+
+ <xsl:variable name="x1p" select="$x1 div 100.0"/>
+ <xsl:variable name="y1p" select="$y1 div 100.0"/>
+ <xsl:variable name="x2p" select="$x2 div 100.0"/>
+ <xsl:variable name="y2p" select="$y2 div 100.0"/>
+
+ <!--
+ <xsl:message>
+ <xsl:text>units: </xsl:text>
+ <xsl:value-of select="$units"/>
+ <xsl:text> </xsl:text>
+ <xsl:value-of select="$x1p"/><xsl:text>, </xsl:text>
+ <xsl:value-of select="$y1p"/><xsl:text>, </xsl:text>
+ <xsl:value-of select="$x2p"/><xsl:text>, </xsl:text>
+ <xsl:value-of select="$y2p"/><xsl:text>, </xsl:text>
+ </xsl:message>
+
+ <xsl:message>
+ <xsl:text> </xsl:text>
+ <xsl:value-of select="$intrinsicwidth"/>
+ <xsl:text>, </xsl:text>
+ <xsl:value-of select="$intrinsicdepth"/>
+ </xsl:message>
+
+ <xsl:message>
+ <xsl:text> </xsl:text>
+ <xsl:value-of select="$units"/>
+ <xsl:text> </xsl:text>
+ <xsl:value-of
+ select="round($x1p * $intrinsicwidth div 100.0)"/>
+ <xsl:text>,</xsl:text>
+ <xsl:value-of select="round($intrinsicdepth
+ - ($y2p * $intrinsicdepth div 100.0))"/>
+ <xsl:text>,</xsl:text>
+ <xsl:value-of select="round($x2p *
+ $intrinsicwidth div 100.0)"/>
+ <xsl:text>,</xsl:text>
+ <xsl:value-of select="round($intrinsicdepth
+ - ($y1p * $intrinsicdepth div 100.0))"/>
+ </xsl:message>
+ -->
+ <xsl:value-of select="round($x1p * $intrinsicwidth div 100.0)"/>
+ <xsl:text>,</xsl:text>
+ <xsl:value-of select="round($intrinsicdepth - ($y2p * $intrinsicdepth div 100.0))"/>
+ <xsl:text>,</xsl:text>
+ <xsl:value-of select="round($x2p * $intrinsicwidth div 100.0)"/>
+ <xsl:text>,</xsl:text>
+ <xsl:value-of select="round($intrinsicdepth - ($y1p * $intrinsicdepth div 100.0))"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:copy-of select="$coords"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:attribute>
+ </area>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:message>
+ <xsl:text>Warning: only calspair or </xsl:text>
+ <xsl:text>otherunits='imagemap' supported </xsl:text>
+ <xsl:text>in imageobjectco</xsl:text>
+ </xsl:message>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:for-each>
+ </map>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template name="process.image.attributes">
+ <xsl:param name="alt"/>
+ <xsl:param name="html.width"/>
+ <xsl:param name="html.depth"/>
+ <xsl:param name="longdesc"/>
+ <xsl:param name="scale"/>
+ <xsl:param name="scalefit"/>
+ <xsl:param name="scaled.contentdepth"/>
+ <xsl:param name="scaled.contentwidth"/>
+ <xsl:param name="viewport"/>
+
+ <xsl:choose>
+ <xsl:when test="@contentwidth or @contentdepth">
+ <!-- ignore @width/@depth, @scale, and @scalefit if specified -->
+ <xsl:if test="@contentwidth and $scaled.contentwidth != ''">
+ <xsl:attribute name="width">
+ <xsl:value-of select="$scaled.contentwidth"/>
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:if test="@contentdepth and $scaled.contentdepth != ''">
+ <xsl:attribute name="height">
+ <xsl:value-of select="$scaled.contentdepth"/>
+ </xsl:attribute>
+ </xsl:if>
+ </xsl:when>
+
+ <xsl:when test="number($scale) != 1.0">
+ <!-- scaling is always uniform, so we only have to specify one dimension -->
+ <!-- ignore @scalefit if specified -->
+ <xsl:attribute name="width">
+ <xsl:value-of select="$scaled.contentwidth"/>
+ </xsl:attribute>
+ </xsl:when>
+
+ <xsl:when test="$scalefit != 0">
+ <xsl:choose>
+ <xsl:when test="contains($html.width, '%')">
+ <xsl:choose>
+ <xsl:when test="$viewport != 0">
+ <!-- The *viewport* will be scaled, so use 100% here! -->
+ <xsl:attribute name="width">
+ <xsl:value-of select="'100%'"/>
+ </xsl:attribute>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:attribute name="width">
+ <xsl:value-of select="$html.width"/>
+ </xsl:attribute>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+
+ <xsl:when test="contains($html.depth, '%')">
+ <!-- HTML doesn't deal with this case very well...do nothing -->
+ </xsl:when>
+
+ <xsl:when test="$scaled.contentwidth != '' and $html.width != '' and $scaled.contentdepth != '' and $html.depth != ''">
+ <!-- scalefit should not be anamorphic; figure out which direction -->
+ <!-- has the limiting scale factor and scale in that direction -->
+ <xsl:choose>
+ <xsl:when test="$html.width div $scaled.contentwidth &gt; $html.depth div $scaled.contentdepth">
+ <xsl:attribute name="height">
+ <xsl:value-of select="$html.depth"/>
+ </xsl:attribute>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:attribute name="width">
+ <xsl:value-of select="$html.width"/>
+ </xsl:attribute>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+
+ <xsl:when test="$scaled.contentwidth != '' and $html.width != ''">
+ <xsl:attribute name="width">
+ <xsl:value-of select="$html.width"/>
+ </xsl:attribute>
+ </xsl:when>
+
+ <xsl:when test="$scaled.contentdepth != '' and $html.depth != ''">
+ <xsl:attribute name="height">
+ <xsl:value-of select="$html.depth"/>
+ </xsl:attribute>
+ </xsl:when>
+ </xsl:choose>
+ </xsl:when>
+ </xsl:choose>
+
+ <xsl:if test="$alt != ''">
+ <xsl:attribute name="alt">
+ <xsl:value-of select="normalize-space($alt)"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:if test="$longdesc != ''">
+ <xsl:attribute name="longdesc">
+ <xsl:value-of select="$longdesc"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:if test="@align and $viewport = 0">
+ <xsl:attribute name="align">
+ <xsl:choose>
+ <xsl:when test="@align = 'center'">middle</xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="@align"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:attribute>
+ </xsl:if>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="graphic">
+ <xsl:choose>
+ <xsl:when test="parent::inlineequation">
+ <xsl:call-template name="anchor"/>
+ <xsl:call-template name="process.image"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <div>
+ <xsl:if test="@align">
+ <xsl:attribute name="align">
+ <xsl:value-of select="@align"/>
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:call-template name="anchor"/>
+ <xsl:call-template name="process.image"/>
+ </div>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="inlinegraphic">
+ <xsl:variable name="filename">
+ <xsl:choose>
+ <xsl:when test="@entityref">
+ <xsl:value-of select="unparsed-entity-uri(@entityref)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="@fileref"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:call-template name="anchor"/>
+
+ <xsl:choose>
+ <xsl:when test="@format='linespecific'">
+ <xsl:choose>
+ <xsl:when test="$use.extensions != '0' and $textinsert.extension != '0'">
+ <xsl:choose>
+ <xsl:when test="element-available('stext:insertfile')">
+ <stext:insertfile href="{$filename}" encoding="{$textdata.default.encoding}"/>
+ </xsl:when>
+ <xsl:when test="element-available('xtext:insertfile')">
+ <xtext:insertfile href="{$filename}"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:message terminate="yes">
+ <xsl:text>No insertfile extension available.</xsl:text>
+ </xsl:message>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:message terminate="yes">
+ <xsl:text>Cannot insert </xsl:text><xsl:value-of select="$filename"/>
+ <xsl:text>. Check use.extensions and textinsert.extension parameters.</xsl:text>
+ </xsl:message>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="process.image"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="mediaobject|mediaobjectco">
+
+ <xsl:variable name="olist" select="imageobject|imageobjectco |videoobject|audioobject |textobject"/>
+
+ <xsl:variable name="object.index">
+ <xsl:call-template name="select.mediaobject.index">
+ <xsl:with-param name="olist" select="$olist"/>
+ <xsl:with-param name="count" select="1"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="object" select="$olist[position() = $object.index]"/>
+
+ <xsl:variable name="align">
+ <xsl:value-of select="$object/descendant::imagedata[@align][1]/@align"/>
+ </xsl:variable>
+
+ <div>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:if test="$align != '' ">
+ <xsl:attribute name="align">
+ <xsl:value-of select="$align"/>
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:call-template name="anchor"/>
+
+ <xsl:apply-templates select="$object"/>
+ <xsl:apply-templates select="caption"/>
+ </div>
+</xsl:template>
+
+<xsl:template match="inlinemediaobject">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:call-template name="anchor"/>
+ <xsl:call-template name="select.mediaobject"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="programlisting/inlinemediaobject |screen/inlinemediaobject" priority="2">
+ <!-- the additional span causes problems in some cases -->
+ <xsl:call-template name="select.mediaobject"/>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="imageobjectco">
+ <xsl:call-template name="anchor"/>
+ <xsl:apply-templates select="imageobject"/>
+ <xsl:apply-templates select="calloutlist"/>
+</xsl:template>
+
+<xsl:template match="imageobject">
+ <xsl:apply-templates select="imagedata"/>
+</xsl:template>
+
+<xsl:template match="imagedata">
+ <xsl:variable name="filename">
+ <xsl:call-template name="mediaobject.filename">
+ <xsl:with-param name="object" select=".."/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:choose>
+ <!-- Handle MathML and SVG markup in imagedata -->
+ <xsl:when xmlns:mml="http://www.w3.org/1998/Math/MathML" test="mml:*">
+ <xsl:apply-templates/>
+ </xsl:when>
+
+ <xsl:when xmlns:svg="http://www.w3.org/2000/svg" test="svg:*">
+ <xsl:apply-templates/>
+ </xsl:when>
+
+ <xsl:when test="@format='linespecific'">
+ <xsl:choose>
+ <xsl:when test="$use.extensions != '0' and $textinsert.extension != '0'">
+ <xsl:choose>
+ <xsl:when test="element-available('stext:insertfile')">
+ <stext:insertfile href="{$filename}" encoding="{$textdata.default.encoding}"/>
+ </xsl:when>
+ <xsl:when test="element-available('xtext:insertfile')">
+ <xtext:insertfile href="{$filename}"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:message terminate="yes">
+ <xsl:text>No insertfile extension available.</xsl:text>
+ </xsl:message>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <a xlink:type="simple" xlink:show="embed" xlink:actuate="onLoad" href="{$filename}"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:variable name="longdesc.uri">
+ <xsl:call-template name="longdesc.uri">
+ <xsl:with-param name="mediaobject" select="ancestor::imageobject/parent::*"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="phrases" select="ancestor::mediaobject/textobject[phrase] |ancestor::inlinemediaobject/textobject[phrase] |ancestor::mediaobjectco/textobject[phrase]"/>
+
+ <xsl:call-template name="process.image">
+ <xsl:with-param name="alt">
+ <xsl:apply-templates select="$phrases[not(@role) or @role!='tex'][1]"/>
+ </xsl:with-param>
+ <xsl:with-param name="longdesc">
+ <xsl:call-template name="write.longdesc">
+ <xsl:with-param name="mediaobject" select="ancestor::imageobject/parent::*"/>
+ </xsl:call-template>
+ </xsl:with-param>
+ </xsl:call-template>
+
+ <xsl:if test="$html.longdesc != 0 and $html.longdesc.link != 0 and ancestor::imageobject/parent::*/textobject[not(phrase)]">
+ <xsl:call-template name="longdesc.link">
+ <xsl:with-param name="longdesc.uri" select="$longdesc.uri"/>
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template name="longdesc.uri">
+ <xsl:param name="mediaobject" select="."/>
+ <xsl:if test="$html.longdesc">
+ <xsl:if test="$mediaobject/textobject[not(phrase)]">
+ <xsl:variable name="dbhtml.dir">
+ <xsl:call-template name="dbhtml-dir"/>
+ </xsl:variable>
+ <xsl:variable name="filename">
+ <xsl:call-template name="make-relative-filename">
+ <xsl:with-param name="base.dir">
+ <xsl:choose>
+ <xsl:when test="$dbhtml.dir != ''">
+ <xsl:value-of select="$dbhtml.dir"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$base.dir"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:with-param>
+ <xsl:with-param name="base.name">
+ <xsl:choose>
+ <xsl:when test=" $mediaobject/@*[local-name() = 'id'] and not($use.id.as.filename = 0)">
+ <!-- * if this mediaobject has an ID, then we use the -->
+ <!-- * value of that ID as basename for the "longdesc" -->
+ <!-- * file (that is, without prepending an "ld-" too it) -->
+ <xsl:value-of select="$mediaobject/@*[local-name() = 'id']"/>
+ <xsl:value-of select="$html.ext"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <!-- * otherwise, if this mediaobject does not have an -->
+ <!-- * ID, then we generate an ID... -->
+ <xsl:variable name="image-id">
+ <xsl:call-template name="object.id">
+ <xsl:with-param name="object" select="$mediaobject"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <!-- * ...and then we take that generated ID, prepend an -->
+ <!-- * "ld-" to it, and use that as the basename for the file -->
+ <xsl:value-of select="concat('ld-',$image-id,$html.ext)"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:value-of select="$filename"/>
+ </xsl:if>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template name="write.longdesc">
+ <xsl:param name="mediaobject" select="."/>
+ <xsl:if test="$html.longdesc != 0 and $mediaobject/textobject[not(phrase)]">
+ <xsl:variable name="filename">
+ <xsl:call-template name="longdesc.uri">
+ <xsl:with-param name="mediaobject" select="$mediaobject"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:value-of select="$filename"/>
+
+ <xsl:call-template name="write.chunk">
+ <xsl:with-param name="filename" select="$filename"/>
+ <xsl:with-param name="quiet" select="$chunk.quietly"/>
+ <xsl:with-param name="content">
+ <xsl:call-template name="user.preroot"/>
+ <html>
+ <head>
+ <xsl:call-template name="system.head.content"/>
+ <xsl:call-template name="head.content">
+ <xsl:with-param name="title" select="'Long Description'"/>
+ </xsl:call-template>
+ <xsl:call-template name="user.head.content"/>
+ </head>
+ <body>
+ <xsl:call-template name="body.attributes"/>
+ <xsl:for-each select="$mediaobject/textobject[not(phrase)]">
+ <xsl:apply-templates select="./*"/>
+ </xsl:for-each>
+ </body>
+ </html>
+ <xsl:value-of select="$chunk.append"/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template name="longdesc.link">
+ <xsl:param name="longdesc.uri" select="''"/>
+
+ <xsl:variable name="this.uri">
+ <xsl:call-template name="make-relative-filename">
+ <xsl:with-param name="base.dir" select="$base.dir"/>
+ <xsl:with-param name="base.name">
+ <xsl:call-template name="href.target.uri"/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="href.to">
+ <xsl:call-template name="trim.common.uri.paths">
+ <xsl:with-param name="uriA" select="$longdesc.uri"/>
+ <xsl:with-param name="uriB" select="$this.uri"/>
+ <xsl:with-param name="return" select="'A'"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <div class="longdesc-link" align="{$direction.align.end}">
+ <br clear="all"/>
+ <span class="longdesc-link">
+ <xsl:text>[</xsl:text>
+ <a href="{$href.to}" target="longdesc">D</a>
+ <xsl:text>]</xsl:text>
+ </span>
+ </div>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="videoobject">
+ <xsl:apply-templates select="videodata"/>
+</xsl:template>
+
+<xsl:template match="videodata">
+ <xsl:call-template name="process.image">
+ <xsl:with-param name="tag" select="'embed'"/>
+ <xsl:with-param name="alt">
+ <xsl:apply-templates select="(../../textobject/phrase)[1]"/>
+ </xsl:with-param>
+ </xsl:call-template>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="audioobject">
+ <xsl:apply-templates select="audiodata"/>
+</xsl:template>
+
+<xsl:template match="audiodata">
+ <xsl:call-template name="process.image">
+ <xsl:with-param name="tag" select="'embed'"/>
+ <xsl:with-param name="alt">
+ <xsl:apply-templates select="(../../textobject/phrase)[1]"/>
+ </xsl:with-param>
+ </xsl:call-template>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="textobject">
+ <xsl:apply-templates/>
+</xsl:template>
+
+<xsl:template match="textdata">
+ <xsl:variable name="filename">
+ <xsl:choose>
+ <xsl:when test="@entityref">
+ <xsl:value-of select="unparsed-entity-uri(@entityref)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="@fileref"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="encoding">
+ <xsl:choose>
+ <xsl:when test="@encoding">
+ <xsl:value-of select="@encoding"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$textdata.default.encoding"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="$use.extensions != '0' and $textinsert.extension != '0'">
+ <xsl:choose>
+ <xsl:when test="element-available('stext:insertfile')">
+ <stext:insertfile href="{$filename}" encoding="{$encoding}"/>
+ </xsl:when>
+ <xsl:when test="element-available('xtext:insertfile')">
+ <xtext:insertfile href="{$filename}"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:message terminate="yes">
+ <xsl:text>No insertfile extension available.</xsl:text>
+ </xsl:message>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:message terminate="yes">
+ <xsl:text>Cannot insert </xsl:text><xsl:value-of select="$filename"/>
+ <xsl:text>. Check use.extensions and textinsert.extension parameters.</xsl:text>
+ </xsl:message>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="caption">
+ <div>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:if test="@align = 'right' or @align = 'left' or @align='center'">
+ <xsl:attribute name="align"><xsl:value-of select="@align"/></xsl:attribute>
+ </xsl:if>
+ <xsl:apply-templates/>
+ </div>
+</xsl:template>
+
+<!-- ==================================================================== -->
+<!-- "Support" for SVG -->
+
+<xsl:template xmlns:svg="http://www.w3.org/2000/svg" match="svg:*">
+ <xsl:copy>
+ <xsl:copy-of select="@*"/>
+ <xsl:apply-templates/>
+ </xsl:copy>
+</xsl:template>
+
+
+<!-- The following works sometimes, but needs to take into account
+ 1. When there is no /*/@xml:base
+ 2. When the chunks are going somewhere else
+<xsl:variable name="relpath">
+ <xsl:call-template name="relative-uri">
+ <xsl:with-param name="filename" select="@fileref"/>
+ </xsl:call-template>
+</xsl:variable>
+
+<xsl:choose>
+ <xsl:when test="/*/@xml:base
+ and starts-with($relpath,/*/@xml:base)">
+ <xsl:value-of select="substring-after($relpath,/*/@xml:base)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="@fileref"/>
+ </xsl:otherwise>
+</xsl:choose>
+<xsl:value-of select="@fileref"/>
+ </xsl:when>
+-->
+<!-- Resolve xml:base attributes -->
+<xsl:template match="@fileref">
+ <!-- need a check for absolute urls -->
+ <xsl:choose>
+ <xsl:when test="contains(., ':')">
+ <!-- it has a uri scheme so it is an absolute uri -->
+ <xsl:value-of select="."/>
+ </xsl:when>
+ <xsl:when test="$keep.relative.image.uris != 0">
+ <!-- leave it alone -->
+ <xsl:value-of select="."/>
+ </xsl:when>
+ <xsl:otherwise>
+ <!-- its a relative uri that needs xml:base processing -->
+ <xsl:call-template name="relative-uri">
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/highlight.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/highlight.xsl
new file mode 100644
index 0000000..222a055
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/highlight.xsl
@@ -0,0 +1,88 @@
+<?xml version="1.0" encoding="ASCII"?>
+<!--This file was created automatically by html2xhtml-->
+<!--from the HTML stylesheets.-->
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xslthl="http://xslthl.sf.net" xmlns="http://www.w3.org/1999/xhtml" exclude-result-prefixes="xslthl" version="1.0">
+ <!-- ********************************************************************
+ $Id: highlight.xsl 8911 2010-09-28 17:02:06Z abdelazer $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ and other information.
+
+ ******************************************************************** -->
+ <xsl:import href="../highlighting/common.xsl"/>
+ <xsl:template match="xslthl:keyword" mode="xslthl">
+ <strong class="hl-keyword">
+ <xsl:apply-templates mode="xslthl"/>
+ </strong>
+ </xsl:template>
+ <xsl:template match="xslthl:string" mode="xslthl">
+ <strong class="hl-string">
+ <em style="color:red">
+ <xsl:apply-templates mode="xslthl"/>
+ </em>
+ </strong>
+ </xsl:template>
+ <xsl:template match="xslthl:comment" mode="xslthl">
+ <em class="hl-comment" style="color: silver">
+ <xsl:apply-templates mode="xslthl"/>
+ </em>
+ </xsl:template>
+ <xsl:template match="xslthl:directive" mode="xslthl">
+ <span class="hl-directive" style="color: maroon">
+ <xsl:apply-templates mode="xslthl"/>
+ </span>
+ </xsl:template>
+ <xsl:template match="xslthl:tag" mode="xslthl">
+ <strong class="hl-tag" style="color: #000096">
+ <xsl:apply-templates mode="xslthl"/>
+ </strong>
+ </xsl:template>
+ <xsl:template match="xslthl:attribute" mode="xslthl">
+ <span class="hl-attribute" style="color: #F5844C">
+ <xsl:apply-templates mode="xslthl"/>
+ </span>
+ </xsl:template>
+ <xsl:template match="xslthl:value" mode="xslthl">
+ <span class="hl-value" style="color: #993300">
+ <xsl:apply-templates mode="xslthl"/>
+ </span>
+ </xsl:template>
+ <xsl:template match="xslthl:html" mode="xslthl">
+ <strong>
+ <em style="color: red">
+ <xsl:apply-templates mode="xslthl"/>
+ </em>
+ </strong>
+ </xsl:template>
+ <xsl:template match="xslthl:xslt" mode="xslthl">
+ <strong style="color: #0066FF">
+ <xsl:apply-templates mode="xslthl"/>
+ </strong>
+ </xsl:template>
+ <!-- Not emitted since XSLTHL 2.0 -->
+ <xsl:template match="xslthl:section" mode="xslthl">
+ <strong>
+ <xsl:apply-templates mode="xslthl"/>
+ </strong>
+ </xsl:template>
+ <xsl:template match="xslthl:number" mode="xslthl">
+ <span class="hl-number">
+ <xsl:apply-templates mode="xslthl"/>
+ </span>
+ </xsl:template>
+ <xsl:template match="xslthl:annotation" mode="xslthl">
+ <em>
+ <span class="hl-annotation" style="color: gray">
+ <xsl:apply-templates mode="xslthl"/>
+ </span>
+ </em>
+ </xsl:template>
+ <!-- Not sure which element will be in final XSLTHL 2.0 -->
+ <xsl:template match="xslthl:doccomment|xslthl:doctype" mode="xslthl">
+ <strong class="hl-tag" style="color: blue">
+ <xsl:apply-templates mode="xslthl"/>
+ </strong>
+ </xsl:template>
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/html-rtf.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/html-rtf.xsl
new file mode 100644
index 0000000..e079a73
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/html-rtf.xsl
@@ -0,0 +1,321 @@
+<?xml version="1.0" encoding="ASCII"?>
+<!--This file was created automatically by html2xhtml-->
+<!--from the HTML stylesheets.-->
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:exsl="http://exslt.org/common" xmlns:set="http://exslt.org/sets" xmlns="http://www.w3.org/1999/xhtml" exclude-result-prefixes="exsl set" version="1.0">
+
+<!-- ********************************************************************
+ $Id: html-rtf.xsl 8345 2009-03-16 06:44:07Z bobstayton $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<!-- ==================================================================== -->
+
+<!-- This module contains templates that match against HTML nodes. It is used
+ to post-process result tree fragments for some sorts of cleanup.
+ These templates can only ever be fired by a processor that supports
+ exslt:node-set(). -->
+
+<!-- ==================================================================== -->
+
+<!-- insert.html.p mode templates insert a particular RTF at the beginning
+ of the first paragraph in the primary RTF. -->
+
+<xsl:template match="/" mode="insert.html.p">
+ <xsl:param name="mark" select="'?'"/>
+ <xsl:apply-templates mode="insert.html.p">
+ <xsl:with-param name="mark" select="$mark"/>
+ </xsl:apply-templates>
+</xsl:template>
+
+<xsl:template match="*" mode="insert.html.p">
+ <xsl:param name="mark" select="'?'"/>
+ <xsl:copy>
+ <xsl:copy-of select="@*"/>
+ <xsl:apply-templates mode="insert.html.p">
+ <xsl:with-param name="mark" select="$mark"/>
+ </xsl:apply-templates>
+ </xsl:copy>
+</xsl:template>
+
+<xsl:template xmlns:html="http://www.w3.org/1999/xhtml" match="html:p|p" mode="insert.html.p">
+ <xsl:param name="mark" select="'?'"/>
+ <xsl:copy>
+ <xsl:copy-of select="@*"/>
+ <xsl:if test="not(preceding::p|preceding::html:p)">
+ <xsl:copy-of select="$mark"/>
+ </xsl:if>
+ <xsl:apply-templates mode="insert.html.p">
+ <xsl:with-param name="mark" select="$mark"/>
+ </xsl:apply-templates>
+ </xsl:copy>
+</xsl:template>
+
+<xsl:template match="text()|processing-instruction()|comment()" mode="insert.html.p">
+ <xsl:param name="mark" select="'?'"/>
+ <xsl:copy/>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<!-- insert.html.text mode templates insert a particular RTF at the beginning
+ of the first text-node in the primary RTF. -->
+
+<xsl:template match="/" mode="insert.html.text">
+ <xsl:param name="mark" select="'?'"/>
+ <xsl:apply-templates mode="insert.html.text">
+ <xsl:with-param name="mark" select="$mark"/>
+ </xsl:apply-templates>
+</xsl:template>
+
+<xsl:template match="*" mode="insert.html.text">
+ <xsl:param name="mark" select="'?'"/>
+ <xsl:copy>
+ <xsl:copy-of select="@*"/>
+ <xsl:apply-templates mode="insert.html.text">
+ <xsl:with-param name="mark" select="$mark"/>
+ </xsl:apply-templates>
+ </xsl:copy>
+</xsl:template>
+
+<xsl:template match="text()|processing-instruction()|comment()" mode="insert.html.text">
+ <xsl:param name="mark" select="'?'"/>
+
+ <xsl:if test="not(preceding::text())">
+ <xsl:copy-of select="$mark"/>
+ </xsl:if>
+
+ <xsl:copy/>
+</xsl:template>
+
+<xsl:template match="processing-instruction()|comment()" mode="insert.html.text">
+ <xsl:param name="mark" select="'?'"/>
+ <xsl:copy/>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<!-- unwrap.p mode templates remove blocks from HTML p elements (and
+ other places where blocks aren't allowed) -->
+
+<xsl:template name="unwrap.p">
+ <xsl:param name="p"/>
+ <xsl:choose>
+ <xsl:when test="$exsl.node.set.available != 0 and function-available('set:leading') and function-available('set:trailing')">
+ <xsl:apply-templates select="exsl:node-set($p)" mode="unwrap.p"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:copy-of select="$p"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template xmlns:html="http://www.w3.org/1999/xhtml" match="html:p|p" mode="unwrap.p">
+ <!-- xmlns:html is necessary for the xhtml stylesheet case -->
+ <xsl:variable name="blocks" select="address|blockquote|div|hr|h1|h2|h3|h4|h5|h6 |layer|p|pre|table|dl|menu|ol|ul|form |html:address|html:blockquote|html:div|html:hr |html:h1|html:h2|html:h3|html:h4|html:h5|html:h6 |html:layer|html:p|html:pre|html:table|html:dl |html:menu|html:ol|html:ul|html:form"/>
+ <xsl:choose>
+ <xsl:when test="$blocks">
+ <xsl:call-template name="unwrap.p.nodes">
+ <xsl:with-param name="wrap" select="."/>
+ <xsl:with-param name="first" select="1"/>
+ <xsl:with-param name="nodes" select="node()"/>
+ <xsl:with-param name="blocks" select="$blocks"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:copy>
+ <xsl:copy-of select="@*"/>
+ <xsl:apply-templates mode="unwrap.p"/>
+ </xsl:copy>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="*" mode="unwrap.p">
+ <xsl:copy>
+ <xsl:copy-of select="@*"/>
+ <xsl:apply-templates mode="unwrap.p"/>
+ </xsl:copy>
+</xsl:template>
+
+<xsl:template match="text()|processing-instruction()|comment()" mode="unwrap.p">
+ <xsl:copy/>
+</xsl:template>
+
+<xsl:template name="unwrap.p.nodes">
+ <xsl:param name="wrap" select="."/>
+ <xsl:param name="first" select="0"/>
+ <xsl:param name="nodes"/>
+ <xsl:param name="blocks"/>
+ <xsl:variable name="block" select="$blocks[1]"/>
+
+ <!-- This template should never get called if these functions aren't available -->
+ <!-- but this test is still necessary so that processors don't choke on the -->
+ <!-- function calls if they don't support the set: functions -->
+ <xsl:if test="function-available('set:leading') and function-available('set:trailing')">
+ <xsl:choose>
+ <xsl:when test="$blocks">
+ <xsl:variable name="leading" select="set:leading($nodes,$block)"/>
+ <xsl:variable name="trailing" select="set:trailing($nodes,$block)"/>
+
+ <xsl:if test="(($wrap/@id or $wrap/@xml:id) and $first = 1) or $leading">
+ <xsl:element name="{local-name($wrap)}" namespace="http://www.w3.org/1999/xhtml">
+ <xsl:for-each select="$wrap/@*">
+ <xsl:if test="$first != 0 or local-name(.) != 'id'">
+ <xsl:copy/>
+ </xsl:if>
+ </xsl:for-each>
+ <xsl:apply-templates select="$leading" mode="unwrap.p"/>
+ </xsl:element>
+ </xsl:if>
+
+ <xsl:apply-templates select="$block" mode="unwrap.p"/>
+
+ <xsl:if test="$trailing">
+ <xsl:call-template name="unwrap.p.nodes">
+ <xsl:with-param name="wrap" select="$wrap"/>
+ <xsl:with-param name="nodes" select="$trailing"/>
+ <xsl:with-param name="blocks" select="$blocks[position() &gt; 1]"/>
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:when>
+
+ <xsl:otherwise>
+ <xsl:if test="(($wrap/@id or $wrap/@xml:id) and $first = 1) or $nodes">
+ <xsl:element name="{local-name($wrap)}" namespace="http://www.w3.org/1999/xhtml">
+ <xsl:for-each select="$wrap/@*">
+ <xsl:if test="$first != 0 or local-name(.) != 'id'">
+ <xsl:copy/>
+ </xsl:if>
+ </xsl:for-each>
+ <xsl:apply-templates select="$nodes" mode="unwrap.p"/>
+ </xsl:element>
+ </xsl:if>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:if>
+</xsl:template>
+
+<!-- ==================================================================== -->
+<!-- make.verbatim.mode replaces spaces and newlines -->
+
+<xsl:template match="/" mode="make.verbatim.mode">
+ <xsl:apply-templates mode="make.verbatim.mode"/>
+</xsl:template>
+
+<xsl:template match="*" mode="make.verbatim.mode">
+ <xsl:copy>
+ <xsl:copy-of select="@*"/>
+ <xsl:apply-templates mode="make.verbatim.mode"/>
+ </xsl:copy>
+</xsl:template>
+
+<xsl:template match="processing-instruction()|comment()" mode="make.verbatim.mode">
+ <xsl:copy/>
+</xsl:template>
+
+<xsl:template match="text()" mode="make.verbatim.mode">
+ <xsl:variable name="text" select="translate(., ' ', '&#160;')"/>
+
+ <xsl:choose>
+ <xsl:when test="not(contains($text, '&#10;'))">
+ <xsl:value-of select="$text"/>
+ </xsl:when>
+
+ <xsl:otherwise>
+ <xsl:variable name="len" select="string-length($text)"/>
+
+ <xsl:choose>
+ <xsl:when test="$len = 1">
+ <br/><xsl:text>
+</xsl:text>
+ </xsl:when>
+
+ <xsl:otherwise>
+ <xsl:variable name="half" select="$len div 2"/>
+ <xsl:call-template name="make-verbatim-recursive">
+ <xsl:with-param name="text" select="substring($text, 1, $half)"/>
+ </xsl:call-template>
+ <xsl:call-template name="make-verbatim-recursive">
+ <xsl:with-param name="text" select="substring($text, ($half + 1), $len)"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="make-verbatim-recursive">
+ <xsl:param name="text" select="''"/>
+
+ <xsl:choose>
+ <xsl:when test="not(contains($text, '&#10;'))">
+ <xsl:value-of select="$text"/>
+ </xsl:when>
+
+ <xsl:otherwise>
+ <xsl:variable name="len" select="string-length($text)"/>
+
+ <xsl:choose>
+ <xsl:when test="$len = 1">
+ <br/><xsl:text>
+</xsl:text>
+ </xsl:when>
+
+ <xsl:otherwise>
+ <xsl:variable name="half" select="$len div 2"/>
+ <xsl:call-template name="make-verbatim-recursive">
+ <xsl:with-param name="text" select="substring($text, 1, $half)"/>
+ </xsl:call-template>
+ <xsl:call-template name="make-verbatim-recursive">
+ <xsl:with-param name="text" select="substring($text, ($half + 1), $len)"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<!-- remove.empty.div mode templates remove empty blocks -->
+
+<xsl:template name="remove.empty.div">
+ <xsl:param name="div"/>
+ <xsl:choose>
+ <xsl:when test="$exsl.node.set.available != 0">
+ <xsl:apply-templates select="exsl:node-set($div)" mode="remove.empty.div"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:copy-of select="$div"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template xmlns:html="http://www.w3.org/1999/xhtml" match="html:p|p|html:div|div" mode="remove.empty.div">
+ <xsl:if test="node()">
+ <xsl:copy>
+ <xsl:copy-of select="@*"/>
+ <xsl:apply-templates mode="remove.empty.div"/>
+ </xsl:copy>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="*" mode="remove.empty.div">
+ <xsl:copy>
+ <xsl:copy-of select="@*"/>
+ <xsl:apply-templates mode="remove.empty.div"/>
+ </xsl:copy>
+</xsl:template>
+
+<xsl:template match="text()|processing-instruction()|comment()" mode="remove.empty.div">
+ <xsl:copy/>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/html.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/html.xsl
new file mode 100644
index 0000000..154a645
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/html.xsl
@@ -0,0 +1,598 @@
+<?xml version="1.0" encoding="ASCII"?>
+<!--This file was created automatically by html2xhtml-->
+<!--from the HTML stylesheets.-->
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1999/xhtml" version="1.0">
+
+<!-- ********************************************************************
+ $Id: html.xsl 8556 2009-12-11 00:05:45Z bobstayton $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<!-- These variables set the align attribute value for HTML output based on
+ the writing-mode specified in the gentext file for the document's lang. -->
+
+<xsl:variable name="direction.align.start">
+ <xsl:choose>
+ <xsl:when test="starts-with($writing.mode, 'lr')">left</xsl:when>
+ <xsl:when test="starts-with($writing.mode, 'rl')">right</xsl:when>
+ <xsl:otherwise>left</xsl:otherwise>
+ </xsl:choose>
+</xsl:variable>
+
+<xsl:variable name="direction.align.end">
+ <xsl:choose>
+ <xsl:when test="starts-with($writing.mode, 'lr')">right</xsl:when>
+ <xsl:when test="starts-with($writing.mode, 'rl')">left</xsl:when>
+ <xsl:otherwise>right</xsl:otherwise>
+ </xsl:choose>
+</xsl:variable>
+
+<xsl:variable name="direction.mode">
+ <xsl:choose>
+ <xsl:when test="starts-with($writing.mode, 'lr')">ltr</xsl:when>
+ <xsl:when test="starts-with($writing.mode, 'rl')">rtl</xsl:when>
+ <xsl:otherwise>ltr</xsl:otherwise>
+ </xsl:choose>
+</xsl:variable>
+
+<!-- The generate.html.title template is currently used for generating HTML -->
+<!-- "title" attributes for some inline elements only, but not for any -->
+<!-- block elements. It is called in eleven places in the inline.xsl -->
+<!-- file. But it's called by all the inline.* templates (e.g., -->
+<!-- inline.boldseq), which in turn are called by other (element) -->
+<!-- templates, so it results, currently, in supporting generation of the -->
+<!-- HTML "title" attribute for a total of about 92 elements. -->
+<!-- You can use mode="html.title.attribute" to get a title for -->
+<!-- an element specified by a param, including targets of cross references. -->
+<xsl:template name="generate.html.title">
+ <xsl:apply-templates select="." mode="html.title.attribute"/>
+</xsl:template>
+
+<!-- Generate a title attribute for the context node -->
+<xsl:template match="*" mode="html.title.attribute">
+ <xsl:variable name="is.title">
+ <xsl:call-template name="gentext.template.exists">
+ <xsl:with-param name="context" select="'title'"/>
+ <xsl:with-param name="name" select="local-name(.)"/>
+ <xsl:with-param name="lang">
+ <xsl:call-template name="l10n.language"/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="is.title-numbered">
+ <xsl:call-template name="gentext.template.exists">
+ <xsl:with-param name="context" select="'title-numbered'"/>
+ <xsl:with-param name="name" select="local-name(.)"/>
+ <xsl:with-param name="lang">
+ <xsl:call-template name="l10n.language"/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="is.title-unnumbered">
+ <xsl:call-template name="gentext.template.exists">
+ <xsl:with-param name="context" select="'title-unnumbered'"/>
+ <xsl:with-param name="name" select="local-name(.)"/>
+ <xsl:with-param name="lang">
+ <xsl:call-template name="l10n.language"/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="has.title.markup">
+ <xsl:apply-templates select="." mode="title.markup">
+ <xsl:with-param name="verbose" select="0"/>
+ </xsl:apply-templates>
+ </xsl:variable>
+
+ <xsl:variable name="gentext.title">
+ <xsl:if test="$has.title.markup != '???TITLE???' and ($is.title != 0 or $is.title-numbered != 0 or $is.title-unnumbered != 0)">
+ <xsl:apply-templates select="." mode="object.title.markup.textonly"/>
+ </xsl:if>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="string-length($gentext.title) != 0">
+ <xsl:attribute name="title">
+ <xsl:value-of select="$gentext.title"/>
+ </xsl:attribute>
+ </xsl:when>
+ <!-- Fall back to alt if available -->
+ <xsl:when test="alt">
+ <xsl:attribute name="title">
+ <xsl:value-of select="normalize-space(alt)"/>
+ </xsl:attribute>
+ </xsl:when>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="qandaentry" mode="html.title.attribute">
+ <xsl:apply-templates select="question" mode="html.title.attribute"/>
+</xsl:template>
+
+<xsl:template match="question" mode="html.title.attribute">
+ <xsl:variable name="label.text">
+ <xsl:apply-templates select="." mode="qanda.label"/>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="string-length($label.text) != 0">
+ <xsl:attribute name="title">
+ <xsl:value-of select="$label.text"/>
+ </xsl:attribute>
+ </xsl:when>
+ <!-- Fall back to alt if available -->
+ <xsl:when test="alt">
+ <xsl:attribute name="title">
+ <xsl:value-of select="normalize-space(alt)"/>
+ </xsl:attribute>
+ </xsl:when>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="dir">
+ <xsl:param name="inherit" select="0"/>
+
+ <xsl:variable name="dir">
+ <xsl:choose>
+ <xsl:when test="@dir">
+ <xsl:value-of select="@dir"/>
+ </xsl:when>
+ <xsl:when test="$inherit != 0">
+ <xsl:value-of select="ancestor::*/@dir[1]"/>
+ </xsl:when>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:if test="$dir != ''">
+ <xsl:attribute name="dir">
+ <xsl:value-of select="$dir"/>
+ </xsl:attribute>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template name="anchor">
+ <xsl:param name="node" select="."/>
+ <xsl:param name="conditional" select="1"/>
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id">
+ <xsl:with-param name="object" select="$node"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xslo:if xmlns:xslo="http://www.w3.org/1999/XSL/Transform" test="not($node[parent::blockquote])"><xsl:if test="$conditional = 0 or $node/@id or $node/@xml:id">
+ <a id="{$id}"/>
+ </xsl:if></xslo:if>
+</xsl:template>
+
+<xsl:template name="href.target.uri">
+ <xsl:param name="context" select="."/>
+ <xsl:param name="object" select="."/>
+ <xsl:text>#</xsl:text>
+ <xsl:call-template name="object.id">
+ <xsl:with-param name="object" select="$object"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template name="href.target">
+ <xsl:param name="context" select="."/>
+ <xsl:param name="object" select="."/>
+ <xsl:text>#</xsl:text>
+ <xsl:call-template name="object.id">
+ <xsl:with-param name="object" select="$object"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template name="href.target.with.base.dir">
+ <xsl:param name="context" select="."/>
+ <xsl:param name="object" select="."/>
+ <xsl:if test="$manifest.in.base.dir = 0">
+ <xsl:value-of select="$base.dir"/>
+ </xsl:if>
+ <xsl:call-template name="href.target">
+ <xsl:with-param name="context" select="$context"/>
+ <xsl:with-param name="object" select="$object"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template name="dingbat">
+ <xsl:param name="dingbat">bullet</xsl:param>
+ <xsl:call-template name="dingbat.characters">
+ <xsl:with-param name="dingbat" select="$dingbat"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template name="dingbat.characters">
+ <!-- now that I'm using the real serializer, all that dingbat malarky -->
+ <!-- isn't necessary anymore... -->
+ <xsl:param name="dingbat">bullet</xsl:param>
+ <xsl:choose>
+ <xsl:when test="$dingbat='bullet'">&#8226;</xsl:when>
+ <xsl:when test="$dingbat='copyright'">&#169;</xsl:when>
+ <xsl:when test="$dingbat='trademark'">&#8482;</xsl:when>
+ <xsl:when test="$dingbat='trade'">&#8482;</xsl:when>
+ <xsl:when test="$dingbat='registered'">&#174;</xsl:when>
+ <xsl:when test="$dingbat='service'">(SM)</xsl:when>
+ <xsl:when test="$dingbat='nbsp'">&#160;</xsl:when>
+ <xsl:when test="$dingbat='ldquo'">&#8220;</xsl:when>
+ <xsl:when test="$dingbat='rdquo'">&#8221;</xsl:when>
+ <xsl:when test="$dingbat='lsquo'">&#8216;</xsl:when>
+ <xsl:when test="$dingbat='rsquo'">&#8217;</xsl:when>
+ <xsl:when test="$dingbat='em-dash'">&#8212;</xsl:when>
+ <xsl:when test="$dingbat='mdash'">&#8212;</xsl:when>
+ <xsl:when test="$dingbat='en-dash'">&#8211;</xsl:when>
+ <xsl:when test="$dingbat='ndash'">&#8211;</xsl:when>
+ <xsl:otherwise>
+ <xsl:text>&#8226;</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="id.warning">
+ <xsl:if test="$id.warnings != 0 and not(@id) and not(@xml:id) and parent::*">
+ <xsl:variable name="title">
+ <xsl:choose>
+ <xsl:when test="title">
+ <xsl:value-of select="title[1]"/>
+ </xsl:when>
+ <xsl:when test="substring(local-name(*[1]), string-length(local-name(*[1])-3) = 'info') and *[1]/title">
+ <xsl:value-of select="*[1]/title[1]"/>
+ </xsl:when>
+ <xsl:when test="refmeta/refentrytitle">
+ <xsl:value-of select="refmeta/refentrytitle"/>
+ </xsl:when>
+ <xsl:when test="refnamediv/refname">
+ <xsl:value-of select="refnamediv/refname[1]"/>
+ </xsl:when>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:message>
+ <xsl:text>ID recommended on </xsl:text>
+ <xsl:value-of select="local-name(.)"/>
+ <xsl:if test="$title != ''">
+ <xsl:text>: </xsl:text>
+ <xsl:choose>
+ <xsl:when test="string-length($title) &gt; 40">
+ <xsl:value-of select="substring($title,1,40)"/>
+ <xsl:text>...</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$title"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:if>
+ </xsl:message>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template name="generate.class.attribute">
+ <xsl:param name="class" select="local-name(.)"/>
+ <xsl:apply-templates select="." mode="class.attribute">
+ <xsl:with-param name="class" select="$class"/>
+ </xsl:apply-templates>
+</xsl:template>
+
+<xsl:template match="*" mode="class.attribute">
+ <xsl:param name="class" select="local-name(.)"/>
+ <!-- permit customization of class attributes -->
+ <!-- Use element name by default -->
+ <xsl:attribute name="class">
+ <xsl:apply-templates select="." mode="class.value">
+ <xsl:with-param name="class" select="$class"/>
+ </xsl:apply-templates>
+ </xsl:attribute>
+</xsl:template>
+
+<xsl:template match="*" mode="class.value">
+ <xsl:param name="class" select="local-name(.)"/>
+ <!-- permit customization of class value only -->
+ <!-- Use element name by default -->
+ <xsl:value-of select="$class"/>
+</xsl:template>
+
+<!-- Apply common attributes such as class, lang, dir -->
+<xsl:template name="common.html.attributes">
+ <xsl:param name="inherit" select="0"/>
+ <xsl:param name="class" select="local-name(.)"/>
+ <xsl:apply-templates select="." mode="common.html.attributes">
+ <xsl:with-param name="class" select="$class"/>
+ <xsl:with-param name="inherit" select="$inherit"/>
+ </xsl:apply-templates>
+</xsl:template>
+
+<xsl:template match="*" mode="common.html.attributes">
+ <xsl:param name="class" select="local-name(.)"/>
+ <xsl:param name="inherit" select="0"/>
+ <xsl:call-template name="generate.html.lang"/>
+ <xsl:call-template name="dir">
+ <xsl:with-param name="inherit" select="$inherit"/>
+ </xsl:call-template>
+ <xsl:apply-templates select="." mode="class.attribute">
+ <xsl:with-param name="class" select="$class"/>
+ </xsl:apply-templates>
+ <xsl:call-template name="generate.html.title"/>
+</xsl:template>
+
+<!-- Apply common attributes not including class -->
+<xsl:template name="locale.html.attributes">
+ <xsl:apply-templates select="." mode="locale.html.attributes"/>
+</xsl:template>
+
+<xsl:template match="*" mode="locale.html.attributes">
+ <xsl:call-template name="generate.html.lang"/>
+ <xsl:call-template name="dir"/>
+ <xsl:call-template name="generate.html.title"/>
+</xsl:template>
+
+<!-- Pass through any lang attributes -->
+<xsl:template name="generate.html.lang">
+ <xsl:apply-templates select="." mode="html.lang.attribute"/>
+</xsl:template>
+
+<xsl:template match="*" mode="html.lang.attribute">
+ <!-- match the attribute name to the output type -->
+ <xsl:choose>
+ <xsl:when test="@lang and $stylesheet.result.type = 'html'">
+ <xsl:attribute name="lang">
+ <xsl:value-of select="@lang"/>
+ </xsl:attribute>
+ </xsl:when>
+ <xsl:when test="@lang and $stylesheet.result.type = 'xhtml'">
+ <xsl:attribute name="xml:lang">
+ <xsl:value-of select="@lang"/>
+ </xsl:attribute>
+ </xsl:when>
+ <xsl:when test="@xml:lang and $stylesheet.result.type = 'html'">
+ <xsl:attribute name="lang">
+ <xsl:value-of select="@xml:lang"/>
+ </xsl:attribute>
+ </xsl:when>
+ <xsl:when test="@xml:lang and $stylesheet.result.type = 'xhtml'">
+ <xsl:attribute name="xml:lang">
+ <xsl:value-of select="@xml:lang"/>
+ </xsl:attribute>
+ </xsl:when>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ==================================================================== -->
+<!-- Insert link to css or insert literal CSS in head element -->
+<xsl:template name="generate.css">
+ <xsl:choose>
+ <xsl:when test="$generate.css.header = 0">
+ <xsl:call-template name="generate.css.links"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="generate.css.headers"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="generate.css.headers">
+ <xsl:call-template name="generate.default.css.header"/>
+ <xsl:call-template name="generate.custom.css.header"/>
+</xsl:template>
+
+<xsl:template name="generate.default.css.header">
+ <xsl:if test="$make.clean.html != 0 and $docbook.css.source != ''">
+ <!-- Select default file relative to stylesheet -->
+ <xsl:variable name="css.node" select="document($docbook.css.source)/*[1]"/>
+
+ <xsl:call-template name="output.css.header">
+ <xsl:with-param name="css.node" select="$css.node"/>
+ </xsl:call-template>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template name="generate.custom.css.header">
+ <xsl:if test="$custom.css.source != ''">
+ <!-- Select custom file relative to document -->
+ <xsl:variable name="css.node" select="document($custom.css.source,.)/*[1]"/>
+
+ <xsl:call-template name="output.css.header">
+ <xsl:with-param name="css.node" select="$css.node"/>
+ </xsl:call-template>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template name="output.css.header">
+ <xsl:param name="css.node"/>
+
+ <xsl:choose>
+ <xsl:when test="count($css.node) = 0">
+ </xsl:when>
+ <xsl:otherwise>
+ <style type="text/css">
+ <xsl:copy-of select="$css.node/text()"/>
+ </style>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ==================================================================== -->
+<xsl:template name="generate.css.links">
+ <xsl:call-template name="generate.default.css.link"/>
+ <xsl:call-template name="generate.custom.css.link"/>
+</xsl:template>
+
+<xsl:template name="generate.default.css.link">
+ <xsl:if test="$make.clean.html != 0 and $docbook.css.link != 0 and $docbook.css.source != ''">
+ <xsl:variable name="filename">
+ <xsl:call-template name="css.output.filename">
+ <xsl:with-param name="src" select="$docbook.css.source"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:call-template name="make.css.link">
+ <xsl:with-param name="css.filename" select="$filename"/>
+ </xsl:call-template>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template name="generate.custom.css.link">
+ <xsl:if test="$custom.css.source != ''">
+ <xsl:variable name="filename">
+ <xsl:call-template name="css.output.filename">
+ <xsl:with-param name="src" select="$custom.css.source"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:call-template name="make.css.link">
+ <xsl:with-param name="css.filename" select="$filename"/>
+ </xsl:call-template>
+ </xsl:if>
+</xsl:template>
+
+<!-- a CSS link reference must take into account the relative
+ path to a CSS file when chunked HTML is output to more than one directory -->
+<xsl:template name="make.css.link">
+ <xsl:param name="css.filename" select="''"/>
+
+ <xsl:variable name="href.to.uri" select="$css.filename"/>
+
+ <xsl:variable name="href.from.uri">
+ <xsl:call-template name="href.target.uri">
+ <xsl:with-param name="object" select="."/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="href.to">
+ <xsl:call-template name="trim.common.uri.paths">
+ <xsl:with-param name="uriA" select="$href.to.uri"/>
+ <xsl:with-param name="uriB" select="$href.from.uri"/>
+ <xsl:with-param name="return" select="'A'"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="href.from">
+ <xsl:call-template name="trim.common.uri.paths">
+ <xsl:with-param name="uriA" select="$href.to.uri"/>
+ <xsl:with-param name="uriB" select="$href.from.uri"/>
+ <xsl:with-param name="return" select="'B'"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:variable name="depth">
+ <xsl:call-template name="count.uri.path.depth">
+ <xsl:with-param name="filename" select="$href.from"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:variable name="href">
+ <xsl:call-template name="copy-string">
+ <xsl:with-param name="string" select="'../'"/>
+ <xsl:with-param name="count" select="$depth"/>
+ </xsl:call-template>
+ <xsl:value-of select="$href.to"/>
+ </xsl:variable>
+
+ <xsl:if test="string-length($css.filename) != 0">
+ <link rel="stylesheet" type="text/css" href="{$href}"/>
+ </xsl:if>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template name="generate.css.files">
+ <xsl:call-template name="generate.default.css.file"/>
+ <xsl:call-template name="generate.custom.css.file"/>
+</xsl:template>
+
+<xsl:template name="generate.default.css.file">
+ <xsl:if test="$make.clean.html != 0 and $generate.css.header = 0 and $docbook.css.source != ''">
+ <!-- Select default file relative to stylesheet -->
+ <xsl:variable name="css.node" select="document($docbook.css.source)/*[1]"/>
+
+ <xsl:call-template name="generate.css.file">
+ <xsl:with-param name="src" select="$docbook.css.source"/>
+ <xsl:with-param name="css.node" select="$css.node"/>
+ </xsl:call-template>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template name="generate.custom.css.file">
+ <xsl:if test="$custom.css.source != '' and $generate.css.header = 0">
+ <!-- Select custom file relative to document -->
+ <xsl:variable name="css.node" select="document($custom.css.source,.)/*[1]"/>
+
+ <xsl:call-template name="generate.css.file">
+ <xsl:with-param name="src" select="$custom.css.source"/>
+ <xsl:with-param name="css.node" select="$css.node"/>
+ </xsl:call-template>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template name="generate.css.file">
+ <xsl:param name="css.node"/>
+ <xsl:param name="src" select="''"/>
+
+ <xsl:variable name="css.text" select="$css.node/text()"/>
+
+ <xsl:choose>
+ <xsl:when test="count($css.node) = 0">
+ <xsl:message>
+ <xsl:text>ERROR: no root element for CSS source file'</xsl:text>
+ <xsl:value-of select="$src"/>
+ <xsl:text>'.</xsl:text>
+ </xsl:message>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:variable name="filename">
+ <xsl:call-template name="css.output.pathname">
+ <xsl:with-param name="src" select="$src"/>
+ <xsl:with-param name="content" select="$css.node"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:call-template name="write.text.chunk">
+ <xsl:with-param name="filename" select="$filename"/>
+ <xsl:with-param name="content" select="$css.text"/>
+ </xsl:call-template>
+
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="css.output.filename">
+ <xsl:param name="content"/>
+ <xsl:param name="src" select="''"/>
+
+ <xsl:variable name="candidate">
+ <xsl:choose>
+ <xsl:when test="string-length($src) = 0">
+ <xsl:message>
+ <xsl:text>ERROR: missing CSS input filename.</xsl:text>
+ </xsl:message>
+ </xsl:when>
+ <xsl:when test="substring($src,string-length($src)-3) = '.xml'">
+ <xsl:value-of select="substring($src, 1, string-length($src) - 4)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$src"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:value-of select="$candidate"/>
+</xsl:template>
+
+<xsl:template name="css.output.pathname">
+ <xsl:param name="content"/>
+ <xsl:param name="src" select="''"/>
+
+ <xsl:variable name="file">
+ <xsl:call-template name="css.output.filename">
+ <xsl:with-param name="content" select="$content"/>
+ <xsl:with-param name="src" select="$src"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="path" select="concat($base.dir, $file)"/>
+ <xsl:value-of select="$path"/>
+
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/htmltbl.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/htmltbl.xsl
new file mode 100644
index 0000000..47c9a98
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/htmltbl.xsl
@@ -0,0 +1,102 @@
+<?xml version="1.0" encoding="ASCII"?>
+<!--This file was created automatically by html2xhtml-->
+<!--from the HTML stylesheets.-->
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1999/xhtml" version="1.0">
+
+<!-- ********************************************************************
+ $Id: htmltbl.xsl 8477 2009-07-13 11:38:55Z nwalsh $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<!-- ==================================================================== -->
+
+<xsl:template match="colgroup" mode="htmlTable">
+ <xsl:element name="{local-name()}" namespace="http://www.w3.org/1999/xhtml">
+ <xsl:apply-templates select="@*" mode="htmlTableAtt"/>
+ <xsl:apply-templates mode="htmlTable"/>
+ </xsl:element>
+</xsl:template>
+
+<xsl:template match="col" mode="htmlTable">
+ <xsl:element name="{local-name()}" namespace="http://www.w3.org/1999/xhtml">
+ <xsl:apply-templates select="@*" mode="htmlTableAtt"/>
+ </xsl:element>
+</xsl:template>
+
+<xsl:template match="caption" mode="htmlTable">
+ <!-- do not use xsl:copy because of XHTML's needs -->
+ <caption>
+ <xsl:apply-templates select="@*" mode="htmlTableAtt"/>
+
+ <xsl:apply-templates select=".." mode="object.title.markup">
+ <xsl:with-param name="allow-anchors" select="1"/>
+ </xsl:apply-templates>
+
+ </caption>
+</xsl:template>
+
+<xsl:template match="tbody|thead|tfoot|tr" mode="htmlTable">
+ <xsl:element name="{local-name(.)}" namespace="http://www.w3.org/1999/xhtml">
+ <xsl:apply-templates select="@*" mode="htmlTableAtt"/>
+ <xsl:apply-templates mode="htmlTable"/>
+ </xsl:element>
+</xsl:template>
+
+<xsl:template match="th|td" mode="htmlTable">
+ <xsl:element name="{local-name(.)}" namespace="http://www.w3.org/1999/xhtml">
+ <xsl:apply-templates select="@*" mode="htmlTableAtt"/>
+ <xsl:apply-templates/> <!-- *not* mode=htmlTable -->
+ </xsl:element>
+</xsl:template>
+
+<!-- don't copy through DocBook-specific attributes on HTML table markup -->
+<!-- default behavior is to not copy through because there are more
+ DocBook attributes than HTML attributes -->
+<xsl:template mode="htmlTableAtt" match="@*"/>
+
+<!-- copy these through -->
+<xsl:template mode="htmlTableAtt" match="@abbr | @align | @axis | @bgcolor | @border | @cellpadding | @cellspacing | @char | @charoff | @class | @dir | @frame | @headers | @height | @lang | @nowrap | @onclick | @ondblclick | @onkeydown | @onkeypress | @onkeyup | @onmousedown | @onmousemove | @onmouseout | @onmouseover | @onmouseup | @rules | @style | @summary | @title | @valign | @valign | @width | @xml:lang">
+ <xsl:copy-of select="."/>
+</xsl:template>
+
+<xsl:template match="@span|@rowspan|@colspan" mode="htmlTableAtt">
+ <!-- No need to copy through the DTD's default value "1" of the attribute -->
+ <xsl:if test="number(.) != 1">
+ <xsl:attribute name="{local-name(.)}">
+ <xsl:value-of select="."/>
+ </xsl:attribute>
+ </xsl:if>
+</xsl:template>
+
+<!-- map floatstyle to HTML float values -->
+<xsl:template match="@floatstyle" mode="htmlTableAtt">
+ <xsl:attribute name="style">
+ <xsl:text>float: </xsl:text>
+ <xsl:choose>
+ <xsl:when test="contains(., 'left')">left</xsl:when>
+ <xsl:when test="contains(., 'right')">right</xsl:when>
+ <xsl:when test="contains(., 'start')">
+ <xsl:value-of select="$direction.align.start"/>
+ </xsl:when>
+ <xsl:when test="contains(., 'end')">
+ <xsl:value-of select="$direction.align.end"/>
+ </xsl:when>
+ <xsl:when test="contains(., 'inside')">
+ <xsl:value-of select="$direction.align.start"/>
+ </xsl:when>
+ <xsl:when test="contains(., 'outside')">
+ <xsl:value-of select="$direction.align.end"/>
+ </xsl:when>
+ <xsl:when test="contains(., 'before')">none</xsl:when>
+ <xsl:when test="contains(., 'none')">none</xsl:when>
+ </xsl:choose>
+ <xsl:text>;</xsl:text>
+ </xsl:attribute>
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/index.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/index.xsl
new file mode 100644
index 0000000..2c39f4f
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/index.xsl
@@ -0,0 +1,264 @@
+<?xml version="1.0" encoding="ASCII"?>
+<!--This file was created automatically by html2xhtml-->
+<!--from the HTML stylesheets.-->
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1999/xhtml" version="1.0">
+
+<!-- ********************************************************************
+ $Id: index.xsl 8421 2009-05-04 07:49:49Z bobstayton $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<!-- ==================================================================== -->
+
+<xsl:template match="index">
+ <!-- some implementations use completely empty index tags to indicate -->
+ <!-- where an automatically generated index should be inserted. so -->
+ <!-- if the index is completely empty, skip it. Unless generate.index -->
+ <!-- is non-zero, in which case, this is where the automatically -->
+ <!-- generated index should go. -->
+
+ <xsl:call-template name="id.warning"/>
+
+ <xsl:if test="count(*)&gt;0 or $generate.index != '0'">
+ <div>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:if test="$generate.id.attributes != 0">
+ <xsl:attribute name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:call-template name="index.titlepage"/>
+ <xsl:choose>
+ <xsl:when test="indexdiv">
+ <xsl:apply-templates/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="*[not(self::indexentry)]"/>
+ <!-- Because it's actually valid for Index to have neither any -->
+ <!-- Indexdivs nor any Indexentries, we need to check and make -->
+ <!-- sure that at least one Indexentry exists, and generate a -->
+ <!-- wrapper dl if there is at least one; otherwise, do nothing. -->
+ <xsl:if test="indexentry">
+ <!-- The indexentry template assumes a parent dl wrapper has -->
+ <!-- been generated; for Indexes that have Indexdivs, the dl -->
+ <!-- wrapper is generated by the indexdiv template; however, -->
+ <!-- for Indexes that lack Indexdivs, if we don't generate a -->
+ <!-- dl here, HTML output will not be valid. -->
+ <dl>
+ <xsl:apply-templates select="indexentry"/>
+ </dl>
+ </xsl:if>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:if test="count(indexentry) = 0 and count(indexdiv) = 0">
+ <xsl:call-template name="generate-index">
+ <xsl:with-param name="scope" select="(ancestor::book|/)[last()]"/>
+ </xsl:call-template>
+ </xsl:if>
+
+ <xsl:if test="not(parent::article)">
+ <xsl:call-template name="process.footnotes"/>
+ </xsl:if>
+ </div>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="setindex">
+ <!-- some implementations use completely empty index tags to indicate -->
+ <!-- where an automatically generated index should be inserted. so -->
+ <!-- if the index is completely empty, skip it. Unless generate.index -->
+ <!-- is non-zero, in which case, this is where the automatically -->
+ <!-- generated index should go. -->
+
+ <xsl:call-template name="id.warning"/>
+
+ <xsl:if test="count(*)&gt;0 or $generate.index != '0'">
+ <div>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:if test="$generate.id.attributes != 0">
+ <xsl:attribute name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:call-template name="setindex.titlepage"/>
+ <xsl:apply-templates/>
+
+ <xsl:if test="count(indexentry) = 0 and count(indexdiv) = 0">
+ <xsl:call-template name="generate-index">
+ <xsl:with-param name="scope" select="/"/>
+ </xsl:call-template>
+ </xsl:if>
+
+ <xsl:if test="not(parent::article)">
+ <xsl:call-template name="process.footnotes"/>
+ </xsl:if>
+ </div>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="index/indexinfo"/>
+<xsl:template match="index/info"/>
+<xsl:template match="index/title"/>
+<xsl:template match="index/subtitle"/>
+<xsl:template match="index/titleabbrev"/>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="indexdiv">
+ <xsl:call-template name="id.warning"/>
+
+ <div>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:if test="$generate.id.attributes != 0">
+ <xsl:attribute name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:call-template name="anchor"/>
+ <xsl:apply-templates select="*[not(self::indexentry)]"/>
+ <dl>
+ <xsl:apply-templates select="indexentry"/>
+ </dl>
+ </div>
+</xsl:template>
+
+<xsl:template match="indexdiv/title">
+ <h3>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates/>
+ </h3>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="indexterm">
+ <!-- this one must have a name, even if it doesn't have an ID -->
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+
+ <a id="{$id}" class="indexterm"/>
+</xsl:template>
+
+<xsl:template match="primary|secondary|tertiary|see|seealso">
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="indexentry">
+ <xsl:apply-templates select="primaryie"/>
+</xsl:template>
+
+<xsl:template match="primaryie">
+ <dt>
+ <xsl:apply-templates/>
+ </dt>
+ <dd>
+ <xsl:apply-templates select="following-sibling::seeie [not(preceding-sibling::secondaryie)]" mode="indexentry"/>
+ <xsl:apply-templates select="following-sibling::seealsoie [not(preceding-sibling::secondaryie)]" mode="indexentry"/>
+ <xsl:apply-templates select="following-sibling::secondaryie" mode="indexentry"/>
+ </dd>
+</xsl:template>
+
+<!-- Handled in mode to convert flat list to structured output -->
+<xsl:template match="secondaryie">
+</xsl:template>
+<xsl:template match="tertiaryie">
+</xsl:template>
+<xsl:template match="seeie|seealsoie">
+</xsl:template>
+
+<xsl:template match="secondaryie" mode="indexentry">
+ <dl>
+ <dt>
+ <xsl:apply-templates/>
+ </dt>
+ <dd>
+ <!-- select following see* elements up to next secondaryie or tertiary or end -->
+ <xsl:variable name="after.this" select="following-sibling::*"/>
+ <xsl:variable name="next.entry" select="(following-sibling::secondaryie|following-sibling::tertiaryie)[1]"/>
+ <xsl:variable name="before.entry" select="$next.entry/preceding-sibling::*"/>
+ <xsl:variable name="see.intersection" select="$after.this[count(.|$before.entry) = count($before.entry)] [self::seeie or self::seealsoie]"/>
+ <xsl:choose>
+ <xsl:when test="count($see.intersection) != 0">
+ <xsl:apply-templates select="$see.intersection" mode="indexentry"/>
+ </xsl:when>
+ <xsl:when test="count($next.entry) = 0">
+ <xsl:apply-templates select="following-sibling::seeie" mode="indexentry"/>
+ <xsl:apply-templates select="following-sibling::seealsoie" mode="indexentry"/>
+ </xsl:when>
+ </xsl:choose>
+
+ <!-- now process any tertiaryie before the next secondaryie -->
+ <xsl:variable name="before.next.secondary" select="following-sibling::secondaryie[1]/preceding-sibling::*"/>
+ <xsl:variable name="tertiary.intersection" select="$after.this[count(.|$before.next.secondary) = count($before.next.secondary)] [not(self::seeie) and not(self::seealsoie)]"/>
+ <xsl:choose>
+ <xsl:when test="count($tertiary.intersection) != 0">
+ <xsl:apply-templates select="$tertiary.intersection" mode="indexentry"/>
+ </xsl:when>
+ <xsl:when test="not(following-sibling::secondaryie)">
+ <xsl:apply-templates select="following-sibling::tertiaryie" mode="indexentry"/>
+ </xsl:when>
+ </xsl:choose>
+ </dd>
+ </dl>
+</xsl:template>
+
+<xsl:template match="tertiaryie" mode="indexentry">
+ <dl>
+ <dt>
+ <xsl:apply-templates/>
+ </dt>
+ <dd>
+ <!-- select following see* elements up to next secondaryie or tertiary or end -->
+ <xsl:variable name="after.this" select="following-sibling::*"/>
+ <xsl:variable name="next.entry" select="(following-sibling::secondaryie|following-sibling::tertiaryie)[1]"/>
+ <xsl:variable name="before.entry" select="$next.entry/preceding-sibling::*"/>
+ <xsl:variable name="see.intersection" select="$after.this[count(.|$before.entry) = count($before.entry)] [self::seeie or self::seealsoie]"/>
+ <xsl:choose>
+ <xsl:when test="count($see.intersection) != 0">
+ <xsl:apply-templates select="$see.intersection" mode="indexentry"/>
+ </xsl:when>
+ <xsl:when test="count($next.entry) = 0">
+ <xsl:apply-templates select="following-sibling::seeie" mode="indexentry"/>
+ <xsl:apply-templates select="following-sibling::seealsoie" mode="indexentry"/>
+ </xsl:when>
+ </xsl:choose>
+ </dd>
+ </dl>
+</xsl:template>
+
+<xsl:template match="seeie" mode="indexentry">
+ <dt>
+ <xsl:text>(</xsl:text>
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'see'"/>
+ </xsl:call-template>
+ <xsl:text> </xsl:text>
+ <xsl:apply-templates/>
+ <xsl:text>)</xsl:text>
+ </dt>
+</xsl:template>
+
+<xsl:template match="seealsoie" mode="indexentry">
+ <div>
+ <xsl:text>(</xsl:text>
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'seealso'"/>
+ </xsl:call-template>
+ <xsl:text> </xsl:text>
+ <xsl:apply-templates/>
+ <xsl:text>)</xsl:text>
+ </div>
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/info.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/info.xsl
new file mode 100644
index 0000000..76285ab
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/info.xsl
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="ASCII"?>
+<!--This file was created automatically by html2xhtml-->
+<!--from the HTML stylesheets.-->
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1999/xhtml" version="1.0">
+
+<!-- ********************************************************************
+ $Id: info.xsl 8421 2009-05-04 07:49:49Z bobstayton $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<!-- These templates define the "default behavior" for info
+ elements. Even if you don't process the *info wrappers,
+ some of these elements are needed because the elements are
+ processed from named templates that are called with modes.
+ Since modes aren't sticky, these rules apply.
+ (TODO: clarify this comment) -->
+
+<!-- ==================================================================== -->
+<!-- called from named templates in a given mode -->
+
+<xsl:template match="corpauthor">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates/>
+ </span>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="jobtitle">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates/>
+ </span>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/inline.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/inline.xsl
new file mode 100644
index 0000000..da72226
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/inline.xsl
@@ -0,0 +1,1451 @@
+<?xml version="1.0" encoding="ASCII"?>
+<!--This file was created automatically by html2xhtml-->
+<!--from the HTML stylesheets.-->
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:suwl="http://nwalsh.com/xslt/ext/com.nwalsh.saxon.UnwrapLinks" xmlns="http://www.w3.org/1999/xhtml" exclude-result-prefixes="xlink suwl" version="1.0">
+
+<!-- ********************************************************************
+ $Id: inline.xsl 8811 2010-08-09 20:24:45Z mzjn $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<xsl:key name="glossentries" match="glossentry" use="normalize-space(glossterm)"/>
+<xsl:key name="glossentries" match="glossentry" use="normalize-space(glossterm/@baseform)"/>
+
+<xsl:template name="simple.xlink">
+ <xsl:param name="node" select="."/>
+ <xsl:param name="content">
+ <xsl:apply-templates/>
+ </xsl:param>
+ <xsl:param name="linkend" select="$node/@linkend"/>
+ <xsl:param name="xhref" select="$node/@xlink:href"/>
+
+ <!-- Support for @xlink:show -->
+ <xsl:variable name="target.show">
+ <xsl:choose>
+ <xsl:when test="$node/@xlink:show = 'new'">_blank</xsl:when>
+ <xsl:when test="$node/@xlink:show = 'replace'">_top</xsl:when>
+ <xsl:otherwise/>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="link">
+ <xsl:choose>
+ <xsl:when test="$xhref and (not($node/@xlink:type) or $node/@xlink:type='simple')">
+
+ <!-- Is it a local idref or a uri? -->
+ <xsl:variable name="is.idref">
+ <xsl:choose>
+ <!-- if the href starts with # and does not contain an "(" -->
+ <!-- or if the href starts with #xpointer(id(, it's just an ID -->
+ <xsl:when test="starts-with($xhref,'#') and (not(contains($xhref,'(')) or starts-with($xhref, '#xpointer(id('))">1</xsl:when>
+ <xsl:otherwise>0</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <!-- Is it an olink ? -->
+ <xsl:variable name="is.olink">
+ <xsl:choose>
+ <!-- If xlink:role="http://docbook.org/xlink/role/olink" -->
+ <!-- and if the href contains # -->
+ <xsl:when test="contains($xhref,'#') and @xlink:role = $xolink.role">1</xsl:when>
+ <xsl:otherwise>0</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="$is.olink = 1">
+ <xsl:call-template name="olink">
+ <xsl:with-param name="content" select="$content"/>
+ </xsl:call-template>
+ </xsl:when>
+
+ <xsl:when test="$is.idref = 1">
+
+ <xsl:variable name="idref">
+ <xsl:call-template name="xpointer.idref">
+ <xsl:with-param name="xpointer" select="$xhref"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="targets" select="key('id',$idref)"/>
+ <xsl:variable name="target" select="$targets[1]"/>
+
+ <xsl:call-template name="check.id.unique">
+ <xsl:with-param name="linkend" select="$idref"/>
+ </xsl:call-template>
+
+ <xsl:choose>
+ <xsl:when test="count($target) = 0">
+ <xsl:message>
+ <xsl:text>XLink to nonexistent id: </xsl:text>
+ <xsl:value-of select="$idref"/>
+ </xsl:message>
+ <xsl:copy-of select="$content"/>
+ </xsl:when>
+
+ <xsl:otherwise>
+ <a>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+
+ <xsl:attribute name="href">
+ <xsl:call-template name="href.target">
+ <xsl:with-param name="object" select="$target"/>
+ </xsl:call-template>
+ </xsl:attribute>
+
+ <xsl:choose>
+ <xsl:when test="$node/@xlink:title">
+ <xsl:attribute name="title">
+ <xsl:value-of select="$node/@xlink:title"/>
+ </xsl:attribute>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="$target" mode="html.title.attribute"/>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:if test="$target.show !=''">
+ <xsl:attribute name="target">
+ <xsl:value-of select="$target.show"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:copy-of select="$content"/>
+
+ </a>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+
+ <!-- otherwise it's a URI -->
+ <xsl:otherwise>
+ <a>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:attribute name="href">
+ <xsl:value-of select="$xhref"/>
+ </xsl:attribute>
+ <xsl:if test="$node/@xlink:title">
+ <xsl:attribute name="title">
+ <xsl:value-of select="$node/@xlink:title"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <!-- For URIs, use @xlink:show if defined, otherwise use ulink.target -->
+ <xsl:choose>
+ <xsl:when test="$target.show !=''">
+ <xsl:attribute name="target">
+ <xsl:value-of select="$target.show"/>
+ </xsl:attribute>
+ </xsl:when>
+ <xsl:when test="$ulink.target !=''">
+ <xsl:attribute name="target">
+ <xsl:value-of select="$ulink.target"/>
+ </xsl:attribute>
+ </xsl:when>
+ </xsl:choose>
+
+ <xsl:copy-of select="$content"/>
+ </a>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+
+ <xsl:when test="$linkend">
+ <xsl:variable name="targets" select="key('id',$linkend)"/>
+ <xsl:variable name="target" select="$targets[1]"/>
+
+ <xsl:call-template name="check.id.unique">
+ <xsl:with-param name="linkend" select="$linkend"/>
+ </xsl:call-template>
+
+ <a>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:attribute name="href">
+ <xsl:call-template name="href.target">
+ <xsl:with-param name="object" select="$target"/>
+ </xsl:call-template>
+ </xsl:attribute>
+
+ <xsl:apply-templates select="$target" mode="html.title.attribute"/>
+
+ <xsl:copy-of select="$content"/>
+
+ </a>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:copy-of select="$content"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="function-available('suwl:unwrapLinks')">
+ <xsl:copy-of select="suwl:unwrapLinks($link)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:copy-of select="$link"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="inline.charseq">
+ <xsl:param name="content">
+ <xsl:call-template name="anchor"/>
+ <xsl:call-template name="simple.xlink">
+ <xsl:with-param name="content">
+ <xsl:apply-templates/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:param>
+ <!-- * if you want output from the inline.charseq template wrapped in -->
+ <!-- * something other than a Span, call the template with some value -->
+ <!-- * for the 'wrapper-name' param -->
+ <xsl:param name="wrapper-name">span</xsl:param>
+ <xsl:element name="{$wrapper-name}" namespace="http://www.w3.org/1999/xhtml">
+ <xsl:attribute name="class">
+ <xsl:value-of select="local-name(.)"/>
+ </xsl:attribute>
+ <xsl:call-template name="dir"/>
+ <xsl:call-template name="generate.html.title"/>
+ <xsl:copy-of select="$content"/>
+ <xsl:call-template name="apply-annotations"/>
+ </xsl:element>
+</xsl:template>
+
+<xsl:template name="inline.monoseq">
+ <xsl:param name="content">
+ <xsl:call-template name="anchor"/>
+ <xsl:call-template name="simple.xlink">
+ <xsl:with-param name="content">
+ <xsl:apply-templates/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:param>
+ <code>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:copy-of select="$content"/>
+ <xsl:call-template name="apply-annotations"/>
+ </code>
+</xsl:template>
+
+<xsl:template name="inline.boldseq">
+ <xsl:param name="content">
+ <xsl:call-template name="anchor"/>
+ <xsl:call-template name="simple.xlink">
+ <xsl:with-param name="content">
+ <xsl:apply-templates/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:param>
+
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+
+ <!-- don't put <strong> inside figure, example, or table titles -->
+ <xsl:choose>
+ <xsl:when test="local-name(..) = 'title' and (local-name(../..) = 'figure' or local-name(../..) = 'example' or local-name(../..) = 'table')">
+ <xsl:copy-of select="$content"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <strong>
+ <xsl:copy-of select="$content"/>
+ </strong>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:call-template name="apply-annotations"/>
+ </span>
+</xsl:template>
+
+<xsl:template name="inline.italicseq">
+ <xsl:param name="content">
+ <xsl:call-template name="anchor"/>
+ <xsl:call-template name="simple.xlink">
+ <xsl:with-param name="content">
+ <xsl:apply-templates/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:param>
+ <em>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:copy-of select="$content"/>
+ <xsl:call-template name="apply-annotations"/>
+ </em>
+</xsl:template>
+
+<xsl:template name="inline.boldmonoseq">
+ <xsl:param name="content">
+ <xsl:call-template name="anchor"/>
+ <xsl:call-template name="simple.xlink">
+ <xsl:with-param name="content">
+ <xsl:apply-templates/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:param>
+ <!-- don't put <strong> inside figure, example, or table titles -->
+ <!-- or other titles that may already be represented with <strong>'s. -->
+ <xsl:choose>
+ <xsl:when test="local-name(..) = 'title' and (local-name(../..) = 'figure' or local-name(../..) = 'example' or local-name(../..) = 'table' or local-name(../..) = 'formalpara')">
+ <code>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:copy-of select="$content"/>
+ <xsl:call-template name="apply-annotations"/>
+ </code>
+ </xsl:when>
+ <xsl:otherwise>
+ <strong>
+ <xsl:call-template name="common.html.attributes"/>
+ <code>
+ <xsl:call-template name="generate.html.title"/>
+ <xsl:call-template name="dir"/>
+ <xsl:copy-of select="$content"/>
+ </code>
+ <xsl:call-template name="apply-annotations"/>
+ </strong>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="inline.italicmonoseq">
+ <xsl:param name="content">
+ <xsl:call-template name="anchor"/>
+ <xsl:call-template name="simple.xlink">
+ <xsl:with-param name="content">
+ <xsl:apply-templates/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:param>
+ <em>
+ <xsl:call-template name="common.html.attributes"/>
+ <code>
+ <xsl:call-template name="generate.html.title"/>
+ <xsl:call-template name="dir"/>
+ <xsl:copy-of select="$content"/>
+ <xsl:call-template name="apply-annotations"/>
+ </code>
+ </em>
+</xsl:template>
+
+<xsl:template name="inline.superscriptseq">
+ <xsl:param name="content">
+ <xsl:call-template name="anchor"/>
+ <xsl:call-template name="simple.xlink">
+ <xsl:with-param name="content">
+ <xsl:apply-templates/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:param>
+ <sup>
+ <xsl:call-template name="generate.html.title"/>
+ <xsl:call-template name="dir"/>
+ <xsl:copy-of select="$content"/>
+ <xsl:call-template name="apply-annotations"/>
+ </sup>
+</xsl:template>
+
+<xsl:template name="inline.subscriptseq">
+ <xsl:param name="content">
+ <xsl:call-template name="anchor"/>
+ <xsl:call-template name="simple.xlink">
+ <xsl:with-param name="content">
+ <xsl:apply-templates/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:param>
+ <sub>
+ <xsl:call-template name="generate.html.title"/>
+ <xsl:call-template name="dir"/>
+ <xsl:copy-of select="$content"/>
+ <xsl:call-template name="apply-annotations"/>
+ </sub>
+</xsl:template>
+
+<!-- ==================================================================== -->
+<!-- some special cases -->
+
+<xsl:template match="author">
+ <xsl:param name="content">
+ <xsl:call-template name="anchor"/>
+ <xsl:call-template name="simple.xlink">
+ <xsl:with-param name="content">
+ <xsl:call-template name="person.name"/>
+ </xsl:with-param>
+ </xsl:call-template>
+ <xsl:call-template name="apply-annotations"/>
+ </xsl:param>
+
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:copy-of select="$content"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="editor">
+ <xsl:param name="content">
+ <xsl:call-template name="anchor"/>
+ <xsl:call-template name="simple.xlink">
+ <xsl:with-param name="content">
+ <xsl:call-template name="person.name"/>
+ </xsl:with-param>
+ </xsl:call-template>
+ <xsl:call-template name="apply-annotations"/>
+ </xsl:param>
+
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:copy-of select="$content"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="othercredit">
+ <xsl:param name="content">
+ <xsl:call-template name="anchor"/>
+ <xsl:call-template name="simple.xlink">
+ <xsl:with-param name="content">
+ <xsl:call-template name="person.name"/>
+ </xsl:with-param>
+ </xsl:call-template>
+ <xsl:call-template name="apply-annotations"/>
+ </xsl:param>
+
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:copy-of select="$content"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="authorinitials">
+ <xsl:call-template name="inline.charseq"/>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="accel">
+ <xsl:call-template name="inline.charseq"/>
+</xsl:template>
+
+<xsl:template match="action">
+ <xsl:call-template name="inline.charseq"/>
+</xsl:template>
+
+<xsl:template match="application">
+ <xsl:call-template name="inline.charseq"/>
+</xsl:template>
+
+<xsl:template match="classname">
+ <xsl:call-template name="inline.monoseq"/>
+</xsl:template>
+
+<xsl:template match="exceptionname">
+ <xsl:call-template name="inline.monoseq"/>
+</xsl:template>
+
+<xsl:template match="interfacename">
+ <xsl:call-template name="inline.monoseq"/>
+</xsl:template>
+
+<xsl:template match="methodname">
+ <xsl:call-template name="inline.monoseq"/>
+</xsl:template>
+
+<xsl:template match="command">
+ <xsl:call-template name="inline.boldseq"/>
+</xsl:template>
+
+<xsl:template match="computeroutput">
+ <xsl:call-template name="inline.monoseq"/>
+</xsl:template>
+
+<xsl:template match="constant">
+ <xsl:call-template name="inline.monoseq"/>
+</xsl:template>
+
+<xsl:template match="database">
+ <xsl:call-template name="inline.charseq"/>
+</xsl:template>
+
+<xsl:template match="date">
+ <!-- should this support locale-specific formatting? how? -->
+ <xsl:call-template name="inline.charseq"/>
+</xsl:template>
+
+<xsl:template match="errorcode">
+ <xsl:call-template name="inline.charseq"/>
+</xsl:template>
+
+<xsl:template match="errorname">
+ <xsl:call-template name="inline.charseq"/>
+</xsl:template>
+
+<xsl:template match="errortype">
+ <xsl:call-template name="inline.charseq"/>
+</xsl:template>
+
+<xsl:template match="errortext">
+ <xsl:call-template name="inline.charseq"/>
+</xsl:template>
+
+<xsl:template match="envar">
+ <xsl:call-template name="inline.monoseq"/>
+</xsl:template>
+
+<xsl:template match="filename">
+ <xsl:call-template name="inline.monoseq"/>
+</xsl:template>
+
+<xsl:template match="function">
+ <xsl:choose>
+ <xsl:when test="$function.parens != '0' and (parameter or function or replaceable)">
+ <xsl:variable name="nodes" select="text()|*"/>
+ <xsl:call-template name="inline.monoseq">
+ <xsl:with-param name="content">
+ <xsl:call-template name="simple.xlink">
+ <xsl:with-param name="content">
+ <xsl:apply-templates select="$nodes[1]"/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:with-param>
+ </xsl:call-template>
+ <xsl:text>(</xsl:text>
+ <xsl:apply-templates select="$nodes[position()&gt;1]"/>
+ <xsl:text>)</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="inline.monoseq"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="function/parameter" priority="2">
+ <xsl:call-template name="inline.italicmonoseq"/>
+ <xsl:if test="following-sibling::*">
+ <xsl:text>, </xsl:text>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="function/replaceable" priority="2">
+ <xsl:call-template name="inline.italicmonoseq"/>
+ <xsl:if test="following-sibling::*">
+ <xsl:text>, </xsl:text>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="guibutton">
+ <xsl:call-template name="inline.charseq"/>
+</xsl:template>
+
+<xsl:template match="guiicon">
+ <xsl:call-template name="inline.charseq"/>
+</xsl:template>
+
+<xsl:template match="guilabel">
+ <xsl:call-template name="inline.charseq"/>
+</xsl:template>
+
+<xsl:template match="guimenu">
+ <xsl:call-template name="inline.charseq"/>
+</xsl:template>
+
+<xsl:template match="guimenuitem">
+ <xsl:call-template name="inline.charseq"/>
+</xsl:template>
+
+<xsl:template match="guisubmenu">
+ <xsl:call-template name="inline.charseq"/>
+</xsl:template>
+
+<xsl:template match="hardware">
+ <xsl:call-template name="inline.charseq"/>
+</xsl:template>
+
+<xsl:template match="interface">
+ <xsl:call-template name="inline.charseq"/>
+</xsl:template>
+
+<xsl:template match="interfacedefinition">
+ <xsl:call-template name="inline.charseq"/>
+</xsl:template>
+
+<xsl:template match="keycap">
+ <xsl:call-template name="inline.boldseq"/>
+</xsl:template>
+
+<xsl:template match="keycode">
+ <xsl:call-template name="inline.charseq"/>
+</xsl:template>
+
+<xsl:template match="keysym">
+ <xsl:call-template name="inline.charseq"/>
+</xsl:template>
+
+<xsl:template match="literal">
+ <xsl:call-template name="inline.monoseq"/>
+</xsl:template>
+
+<xsl:template match="code">
+ <xsl:call-template name="inline.monoseq"/>
+</xsl:template>
+
+<xsl:template match="medialabel">
+ <xsl:call-template name="inline.italicseq"/>
+</xsl:template>
+
+<xsl:template match="shortcut">
+ <xsl:call-template name="inline.boldseq"/>
+</xsl:template>
+
+<xsl:template match="mousebutton">
+ <xsl:call-template name="inline.charseq"/>
+</xsl:template>
+
+<xsl:template match="option">
+ <xsl:call-template name="inline.monoseq"/>
+</xsl:template>
+
+<xsl:template match="package">
+ <xsl:call-template name="inline.charseq"/>
+</xsl:template>
+
+<xsl:template match="parameter">
+ <xsl:call-template name="inline.italicmonoseq"/>
+</xsl:template>
+
+<xsl:template match="property">
+ <xsl:call-template name="inline.charseq"/>
+</xsl:template>
+
+<xsl:template match="prompt">
+ <xsl:call-template name="inline.monoseq"/>
+</xsl:template>
+
+<xsl:template match="replaceable" priority="1">
+ <xsl:call-template name="inline.italicmonoseq"/>
+</xsl:template>
+
+<xsl:template match="returnvalue">
+ <xsl:call-template name="inline.charseq"/>
+</xsl:template>
+
+<xsl:template match="structfield">
+ <xsl:call-template name="inline.italicmonoseq"/>
+</xsl:template>
+
+<xsl:template match="structname">
+ <xsl:call-template name="inline.charseq"/>
+</xsl:template>
+
+<xsl:template match="symbol">
+ <xsl:call-template name="inline.charseq"/>
+</xsl:template>
+
+<xsl:template match="systemitem">
+ <xsl:call-template name="inline.monoseq"/>
+</xsl:template>
+
+<xsl:template match="token">
+ <xsl:call-template name="inline.charseq"/>
+</xsl:template>
+
+<xsl:template match="type">
+ <xsl:call-template name="inline.charseq"/>
+</xsl:template>
+
+<xsl:template match="userinput">
+ <xsl:call-template name="inline.boldmonoseq"/>
+</xsl:template>
+
+<xsl:template match="abbrev">
+ <xsl:call-template name="inline.charseq">
+ <xsl:with-param name="wrapper-name">abbr</xsl:with-param>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="acronym">
+ <xsl:call-template name="inline.charseq">
+ <xsl:with-param name="wrapper-name">acronym</xsl:with-param>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="citerefentry">
+ <xsl:choose>
+ <xsl:when test="$citerefentry.link != '0'">
+ <a>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:attribute name="href">
+ <xsl:call-template name="generate.citerefentry.link"/>
+ </xsl:attribute>
+ <xsl:call-template name="inline.charseq"/>
+ </a>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="inline.charseq"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="generate.citerefentry.link">
+ <!-- nop -->
+</xsl:template>
+
+<xsl:template name="x.generate.citerefentry.link">
+ <xsl:text>http://example.com/cgi-bin/man.cgi?</xsl:text>
+ <xsl:value-of select="refentrytitle"/>
+ <xsl:text>(</xsl:text>
+ <xsl:value-of select="manvolnum"/>
+ <xsl:text>)</xsl:text>
+</xsl:template>
+
+<xsl:template match="citetitle">
+ <xsl:choose>
+ <xsl:when test="@pubwork = 'article'">
+ <xsl:call-template name="gentext.startquote"/>
+ <xsl:call-template name="inline.charseq"/>
+ <xsl:call-template name="gentext.endquote"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="inline.italicseq"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="emphasis">
+ <span>
+ <xsl:choose>
+ <!-- We don't want empty @class values, so do not propagate empty @roles -->
+ <xsl:when test="@role and normalize-space(@role) != '' and $emphasis.propagates.style != 0">
+ <xsl:apply-templates select="." mode="common.html.attributes">
+ <xsl:with-param name="class" select="@role"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:call-template name="anchor"/>
+
+ <xsl:call-template name="simple.xlink">
+ <xsl:with-param name="content">
+ <xsl:choose>
+ <xsl:when test="@role = 'bold' or @role='strong'">
+ <!-- backwards compatibility: make bold into b elements, but -->
+ <!-- don't put bold inside figure, example, or table titles -->
+ <xsl:choose>
+ <xsl:when test="local-name(..) = 'title' and (local-name(../..) = 'figure' or local-name(../..) = 'example' or local-name(../..) = 'table')">
+ <xsl:apply-templates/>
+ </xsl:when>
+ <xsl:otherwise>
+ <strong><xsl:apply-templates/></strong>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:when test="@role and $emphasis.propagates.style != 0">
+ <xsl:apply-templates/>
+ </xsl:when>
+ <xsl:otherwise>
+ <em><xsl:apply-templates/></em>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:with-param>
+ </xsl:call-template>
+ </span>
+</xsl:template>
+
+<xsl:template match="foreignphrase">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:call-template name="inline.italicseq"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="markup">
+ <xsl:call-template name="inline.charseq"/>
+</xsl:template>
+
+<xsl:template match="phrase">
+ <span>
+ <xsl:call-template name="locale.html.attributes"/>
+ <!-- We don't want empty @class values, so do not propagate empty @roles -->
+ <xsl:if test="@role and normalize-space(@role) != '' and $phrase.propagates.style != 0">
+ <xsl:apply-templates select="." mode="class.attribute">
+ <xsl:with-param name="class" select="@role"/>
+ </xsl:apply-templates>
+ </xsl:if>
+ <xsl:call-template name="dir"/>
+ <xsl:call-template name="anchor"/>
+ <xsl:call-template name="simple.xlink">
+ <xsl:with-param name="content">
+ <xsl:apply-templates/>
+ </xsl:with-param>
+ </xsl:call-template>
+ <xsl:call-template name="apply-annotations"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="quote">
+ <xsl:variable name="depth">
+ <xsl:call-template name="dot.count">
+ <xsl:with-param name="string">
+ <xsl:number level="multiple"/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:variable>
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:call-template name="anchor"/>
+ <xsl:choose>
+ <xsl:when test="$depth mod 2 = 0">
+ <xsl:call-template name="gentext.startquote"/>
+ <xsl:call-template name="inline.charseq"/>
+ <xsl:call-template name="gentext.endquote"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="gentext.nestedstartquote"/>
+ <xsl:call-template name="inline.charseq"/>
+ <xsl:call-template name="gentext.nestedendquote"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </span>
+</xsl:template>
+
+<xsl:template match="varname">
+ <xsl:call-template name="inline.monoseq"/>
+</xsl:template>
+
+<xsl:template match="wordasword">
+ <xsl:call-template name="inline.italicseq"/>
+</xsl:template>
+
+<xsl:template match="lineannotation">
+ <em>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:call-template name="inline.charseq"/>
+ </em>
+</xsl:template>
+
+<xsl:template match="superscript">
+ <xsl:call-template name="inline.superscriptseq"/>
+</xsl:template>
+
+<xsl:template match="subscript">
+ <xsl:call-template name="inline.subscriptseq"/>
+</xsl:template>
+
+<xsl:template match="trademark">
+ <xsl:call-template name="inline.charseq"/>
+ <xsl:choose>
+ <xsl:when test="@class = 'copyright' or @class = 'registered'">
+ <xsl:call-template name="dingbat">
+ <xsl:with-param name="dingbat" select="@class"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="@class = 'service'">
+ <sup>SM</sup>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="dingbat">
+ <xsl:with-param name="dingbat" select="'trademark'"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="firstterm">
+ <xsl:call-template name="glossterm">
+ <xsl:with-param name="firstterm" select="1"/>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="glossterm" name="glossterm">
+ <xsl:param name="firstterm" select="0"/>
+
+ <!-- To avoid extra <a name=""> anchor from inline.italicseq -->
+ <xsl:variable name="content">
+ <xsl:apply-templates/>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="($firstterm.only.link = 0 or $firstterm = 1) and @linkend">
+ <xsl:variable name="targets" select="key('id',@linkend)"/>
+ <xsl:variable name="target" select="$targets[1]"/>
+
+ <xsl:call-template name="check.id.unique">
+ <xsl:with-param name="linkend" select="@linkend"/>
+ </xsl:call-template>
+
+ <xsl:choose>
+ <xsl:when test="$target">
+ <a>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:if test="@id or @xml:id">
+ <xsl:attribute name="id">
+ <xsl:value-of select="(@id|@xml:id)[1]"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:attribute name="href">
+ <xsl:call-template name="href.target">
+ <xsl:with-param name="object" select="$target"/>
+ </xsl:call-template>
+ </xsl:attribute>
+
+ <xsl:call-template name="inline.italicseq">
+ <xsl:with-param name="content" select="$content"/>
+ </xsl:call-template>
+ </a>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="inline.italicseq">
+ <xsl:with-param name="content" select="$content"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+
+ <xsl:when test="not(@linkend) and ($firstterm.only.link = 0 or $firstterm = 1) and ($glossterm.auto.link != 0) and $glossary.collection != ''">
+ <xsl:variable name="term">
+ <xsl:choose>
+ <xsl:when test="@baseform"><xsl:value-of select="@baseform"/></xsl:when>
+ <xsl:otherwise><xsl:value-of select="."/></xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="cterm" select="(document($glossary.collection,.)//glossentry[glossterm=$term])[1]"/>
+
+ <!-- HACK HACK HACK! But it works... -->
+ <!-- You'd need to do more work if you wanted to chunk on glossdiv, though -->
+
+ <xsl:variable name="glossary" select="//glossary[@role='auto']"/>
+
+ <xsl:if test="count($glossary) != 1">
+ <xsl:message>
+ <xsl:text>Warning: glossary.collection specified, but there are </xsl:text>
+ <xsl:value-of select="count($glossary)"/>
+ <xsl:text> automatic glossaries</xsl:text>
+ </xsl:message>
+ </xsl:if>
+
+ <xsl:variable name="glosschunk">
+ <xsl:call-template name="href.target">
+ <xsl:with-param name="object" select="$glossary"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="chunkbase">
+ <xsl:choose>
+ <xsl:when test="contains($glosschunk, '#')">
+ <xsl:value-of select="substring-before($glosschunk, '#')"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$glosschunk"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="not($cterm)">
+ <xsl:message>
+ <xsl:text>There's no entry for </xsl:text>
+ <xsl:value-of select="$term"/>
+ <xsl:text> in </xsl:text>
+ <xsl:value-of select="$glossary.collection"/>
+ </xsl:message>
+ <xsl:call-template name="inline.italicseq"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id">
+ <xsl:with-param name="object" select="$cterm"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <a href="{$chunkbase}#{$id}">
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:call-template name="inline.italicseq">
+ <xsl:with-param name="content" select="$content"/>
+ </xsl:call-template>
+ </a>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+
+ <xsl:when test="not(@linkend) and ($firstterm.only.link = 0 or $firstterm = 1) and $glossterm.auto.link != 0">
+ <xsl:variable name="term">
+ <xsl:choose>
+ <xsl:when test="@baseform">
+ <xsl:value-of select="normalize-space(@baseform)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="normalize-space(.)"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:variable name="targets" select="key('glossentries', $term)"/>
+ <xsl:variable name="target" select="$targets[1]"/>
+
+ <xsl:choose>
+ <xsl:when test="count($targets)=0">
+ <xsl:message>
+ <xsl:text>Error: no glossentry for glossterm: </xsl:text>
+ <xsl:value-of select="."/>
+ <xsl:text>.</xsl:text>
+ </xsl:message>
+ <xsl:call-template name="inline.italicseq"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <a>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:if test="@id or @xml:id">
+ <xsl:attribute name="id">
+ <xsl:value-of select="(@id|@xml:id)[1]"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:attribute name="href">
+ <xsl:call-template name="href.target">
+ <xsl:with-param name="object" select="$target"/>
+ </xsl:call-template>
+ </xsl:attribute>
+
+ <xsl:call-template name="inline.italicseq">
+ <xsl:with-param name="content" select="$content"/>
+ </xsl:call-template>
+ </a>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+
+ <xsl:otherwise>
+ <xsl:call-template name="inline.italicseq"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="termdef">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:call-template name="gentext.template">
+ <xsl:with-param name="context" select="'termdef'"/>
+ <xsl:with-param name="name" select="'prefix'"/>
+ </xsl:call-template>
+ <xsl:apply-templates/>
+ <xsl:call-template name="gentext.template">
+ <xsl:with-param name="context" select="'termdef'"/>
+ <xsl:with-param name="name" select="'suffix'"/>
+ </xsl:call-template>
+ </span>
+</xsl:template>
+
+<xsl:template match="sgmltag|tag">
+ <xsl:call-template name="format.sgmltag"/>
+</xsl:template>
+
+<xsl:template name="format.sgmltag">
+ <xsl:param name="class">
+ <xsl:choose>
+ <xsl:when test="@class">
+ <xsl:value-of select="@class"/>
+ </xsl:when>
+ <xsl:otherwise>element</xsl:otherwise>
+ </xsl:choose>
+ </xsl:param>
+
+ <xsl:variable name="content">
+ <xsl:choose>
+ <xsl:when test="$class='attribute'">
+ <xsl:apply-templates/>
+ </xsl:when>
+ <xsl:when test="$class='attvalue'">
+ <xsl:apply-templates/>
+ </xsl:when>
+ <xsl:when test="$class='element'">
+ <xsl:apply-templates/>
+ </xsl:when>
+ <xsl:when test="$class='endtag'">
+ <xsl:text>&lt;/</xsl:text>
+ <xsl:apply-templates/>
+ <xsl:text>&gt;</xsl:text>
+ </xsl:when>
+ <xsl:when test="$class='genentity'">
+ <xsl:text>&amp;</xsl:text>
+ <xsl:apply-templates/>
+ <xsl:text>;</xsl:text>
+ </xsl:when>
+ <xsl:when test="$class='numcharref'">
+ <xsl:text>&amp;#</xsl:text>
+ <xsl:apply-templates/>
+ <xsl:text>;</xsl:text>
+ </xsl:when>
+ <xsl:when test="$class='paramentity'">
+ <xsl:text>%</xsl:text>
+ <xsl:apply-templates/>
+ <xsl:text>;</xsl:text>
+ </xsl:when>
+ <xsl:when test="$class='pi'">
+ <xsl:text>&lt;?</xsl:text>
+ <xsl:apply-templates/>
+ <xsl:text>&gt;</xsl:text>
+ </xsl:when>
+ <xsl:when test="$class='xmlpi'">
+ <xsl:text>&lt;?</xsl:text>
+ <xsl:apply-templates/>
+ <xsl:text>?&gt;</xsl:text>
+ </xsl:when>
+ <xsl:when test="$class='starttag'">
+ <xsl:text>&lt;</xsl:text>
+ <xsl:apply-templates/>
+ <xsl:text>&gt;</xsl:text>
+ </xsl:when>
+ <xsl:when test="$class='emptytag'">
+ <xsl:text>&lt;</xsl:text>
+ <xsl:apply-templates/>
+ <xsl:text>/&gt;</xsl:text>
+ </xsl:when>
+ <xsl:when test="$class='sgmlcomment' or $class='comment'">
+ <xsl:text>&lt;!--</xsl:text>
+ <xsl:apply-templates/>
+ <xsl:text>--&gt;</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <code>
+ <xsl:apply-templates select="." mode="common.html.attributes">
+ <xsl:with-param name="class" select="concat('sgmltag-', $class)"/>
+ </xsl:apply-templates>
+ <xsl:call-template name="simple.xlink">
+ <xsl:with-param name="content" select="$content"/>
+ </xsl:call-template>
+ </code>
+</xsl:template>
+
+<xsl:template match="email">
+ <xsl:call-template name="inline.monoseq">
+ <xsl:with-param name="content">
+ <xsl:if test="not($email.delimiters.enabled = 0)">
+ <xsl:text>&lt;</xsl:text>
+ </xsl:if>
+ <a>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:attribute name="href">
+ <xsl:text>mailto:</xsl:text>
+ <xsl:value-of select="."/>
+ </xsl:attribute>
+ <xsl:apply-templates/>
+ </a>
+ <xsl:if test="not($email.delimiters.enabled = 0)">
+ <xsl:text>&gt;</xsl:text>
+ </xsl:if>
+ </xsl:with-param>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="keycombo">
+ <xsl:variable name="action" select="@action"/>
+ <xsl:variable name="joinchar">
+ <xsl:choose>
+ <xsl:when test="$action='seq'"><xsl:text> </xsl:text></xsl:when>
+ <xsl:when test="$action='simul'">+</xsl:when>
+ <xsl:when test="$action='press'">-</xsl:when>
+ <xsl:when test="$action='click'">-</xsl:when>
+ <xsl:when test="$action='double-click'">-</xsl:when>
+ <xsl:when test="$action='other'"/>
+ <xsl:otherwise>+</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:for-each select="*">
+ <xsl:if test="position()&gt;1"><xsl:value-of select="$joinchar"/></xsl:if>
+ <xsl:apply-templates select="."/>
+ </xsl:for-each>
+</xsl:template>
+
+<xsl:template match="uri">
+ <xsl:call-template name="inline.monoseq"/>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="menuchoice">
+ <xsl:variable name="shortcut" select="./shortcut"/>
+ <xsl:call-template name="process.menuchoice"/>
+ <xsl:if test="$shortcut">
+ <xsl:text> (</xsl:text>
+ <xsl:apply-templates select="$shortcut"/>
+ <xsl:text>)</xsl:text>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template name="process.menuchoice">
+ <xsl:param name="nodelist" select="guibutton|guiicon|guilabel|guimenu|guimenuitem|guisubmenu|interface"/><!-- not(shortcut) -->
+ <xsl:param name="count" select="1"/>
+
+ <xsl:choose>
+ <xsl:when test="$count&gt;count($nodelist)"/>
+ <xsl:when test="$count=1">
+ <xsl:apply-templates select="$nodelist[$count=position()]"/>
+ <xsl:call-template name="process.menuchoice">
+ <xsl:with-param name="nodelist" select="$nodelist"/>
+ <xsl:with-param name="count" select="$count+1"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:variable name="node" select="$nodelist[$count=position()]"/>
+ <xsl:choose>
+ <xsl:when test="local-name($node)='guimenuitem' or local-name($node)='guisubmenu'">
+ <xsl:value-of select="$menuchoice.menu.separator"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$menuchoice.separator"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:apply-templates select="$node"/>
+ <xsl:call-template name="process.menuchoice">
+ <xsl:with-param name="nodelist" select="$nodelist"/>
+ <xsl:with-param name="count" select="$count+1"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="optional">
+ <xsl:value-of select="$arg.choice.opt.open.str"/>
+ <xsl:call-template name="inline.charseq"/>
+ <xsl:value-of select="$arg.choice.opt.close.str"/>
+</xsl:template>
+
+<xsl:template match="citation">
+ <!-- todo: integrate with bibliography collection -->
+ <xsl:variable name="targets" select="(//biblioentry | //bibliomixed)[abbrev = string(current())]"/>
+ <xsl:variable name="target" select="$targets[1]"/>
+
+ <xsl:choose>
+ <!-- try automatic linking based on match to abbrev -->
+ <xsl:when test="$target and not(xref) and not(link)">
+
+ <xsl:text>[</xsl:text>
+ <a>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:attribute name="href">
+ <xsl:call-template name="href.target">
+ <xsl:with-param name="object" select="$target"/>
+ </xsl:call-template>
+ </xsl:attribute>
+
+ <xsl:choose>
+ <xsl:when test="$bibliography.numbered != 0">
+ <xsl:apply-templates select="$target" mode="citation"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="inline.charseq"/>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ </a>
+ <xsl:text>]</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text>[</xsl:text>
+ <xsl:call-template name="inline.charseq"/>
+ <xsl:text>]</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="citebiblioid">
+ <xsl:variable name="targets" select="//*[biblioid = string(current())]"/>
+ <xsl:variable name="target" select="$targets[1]"/>
+
+ <xsl:choose>
+ <!-- try automatic linking based on match to parent of biblioid -->
+ <xsl:when test="$target and not(xref) and not(link)">
+
+ <xsl:text>[</xsl:text>
+ <a>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:attribute name="href">
+ <xsl:call-template name="href.target">
+ <xsl:with-param name="object" select="$target"/>
+ </xsl:call-template>
+ </xsl:attribute>
+
+ <xsl:call-template name="inline.charseq"/>
+
+ </a>
+ <xsl:text>]</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text>[</xsl:text>
+ <xsl:call-template name="inline.charseq"/>
+ <xsl:text>]</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="biblioentry|bibliomixed" mode="citation">
+ <xsl:number from="bibliography" count="biblioentry|bibliomixed" level="any" format="1"/>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="comment[parent::answer|parent::appendix|parent::article|parent::bibliodiv|&#10; parent::bibliography|parent::blockquote|parent::caution|parent::chapter|&#10; parent::glossary|parent::glossdiv|parent::important|parent::index|&#10; parent::indexdiv|parent::listitem|parent::note|parent::orderedlist|&#10; parent::partintro|parent::preface|parent::procedure|parent::qandadiv|&#10; parent::qandaset|parent::question|parent::refentry|parent::refnamediv|&#10; parent::refsect1|parent::refsect2|parent::refsect3|parent::refsection|&#10; parent::refsynopsisdiv|parent::sect1|parent::sect2|parent::sect3|parent::sect4|&#10; parent::sect5|parent::section|parent::setindex|parent::sidebar|&#10; parent::simplesect|parent::taskprerequisites|parent::taskrelated|&#10; parent::tasksummary|parent::warning]|remark[parent::answer|parent::appendix|parent::article|parent::bibliodiv|&#10; parent::bibliography|parent::blockquote|parent::caution|parent::chapter|&#10; parent::glossary|parent::glossdiv|parent::important|parent::index|&#10; parent::indexdiv|parent::listitem|parent::note|parent::orderedlist|&#10; parent::partintro|parent::preface|parent::procedure|parent::qandadiv|&#10; parent::qandaset|parent::question|parent::refentry|parent::refnamediv|&#10; parent::refsect1|parent::refsect2|parent::refsect3|parent::refsection|&#10; parent::refsynopsisdiv|parent::sect1|parent::sect2|parent::sect3|parent::sect4|&#10; parent::sect5|parent::section|parent::setindex|parent::sidebar|&#10; parent::simplesect|parent::taskprerequisites|parent::taskrelated|&#10; parent::tasksummary|parent::warning]">
+ <xsl:if test="$show.comments != 0">
+ <p class="remark"><em><xsl:call-template name="inline.charseq"/></em></p>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="comment|remark">
+ <xsl:if test="$show.comments != 0">
+ <em><xsl:call-template name="inline.charseq"/></em>
+ </xsl:if>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="productname">
+ <xsl:call-template name="inline.charseq"/>
+ <xsl:if test="@class">
+ <xsl:call-template name="dingbat">
+ <xsl:with-param name="dingbat" select="@class"/>
+ </xsl:call-template>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="productnumber">
+ <xsl:call-template name="inline.charseq"/>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="pob|street|city|state|postcode|country|otheraddr">
+ <xsl:call-template name="inline.charseq"/>
+</xsl:template>
+
+<xsl:template match="phone|fax">
+ <xsl:call-template name="inline.charseq"/>
+</xsl:template>
+
+<!-- in Addresses, for example -->
+<xsl:template match="honorific|firstname|surname|lineage|othername">
+ <xsl:call-template name="inline.charseq"/>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="person">
+ <xsl:param name="content">
+ <xsl:call-template name="anchor"/>
+ <xsl:call-template name="simple.xlink">
+ <xsl:with-param name="content">
+ <xsl:apply-templates select="personname"/>
+ </xsl:with-param>
+ </xsl:call-template>
+ <xsl:call-template name="apply-annotations"/>
+ </xsl:param>
+
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:copy-of select="$content"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="personname">
+ <xsl:param name="content">
+ <xsl:call-template name="anchor"/>
+ <xsl:call-template name="simple.xlink">
+ <xsl:with-param name="content">
+ <xsl:call-template name="person.name"/>
+ </xsl:with-param>
+ </xsl:call-template>
+ <xsl:call-template name="apply-annotations"/>
+ </xsl:param>
+
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:copy-of select="$content"/>
+ </span>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="org">
+ <xsl:param name="content">
+ <xsl:call-template name="anchor"/>
+ <xsl:call-template name="simple.xlink">
+ <xsl:with-param name="content">
+ <xsl:apply-templates/>
+ </xsl:with-param>
+ </xsl:call-template>
+ <xsl:call-template name="apply-annotations"/>
+ </xsl:param>
+
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:copy-of select="$content"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="orgname">
+ <xsl:param name="content">
+ <xsl:call-template name="anchor"/>
+ <xsl:call-template name="simple.xlink">
+ <xsl:with-param name="content">
+ <xsl:apply-templates/>
+ </xsl:with-param>
+ </xsl:call-template>
+ <xsl:call-template name="apply-annotations"/>
+ </xsl:param>
+
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:copy-of select="$content"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="orgdiv">
+ <xsl:param name="content">
+ <xsl:call-template name="anchor"/>
+ <xsl:call-template name="simple.xlink">
+ <xsl:with-param name="content">
+ <xsl:apply-templates/>
+ </xsl:with-param>
+ </xsl:call-template>
+ <xsl:call-template name="apply-annotations"/>
+ </xsl:param>
+
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:copy-of select="$content"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="affiliation">
+ <xsl:param name="content">
+ <xsl:call-template name="anchor"/>
+ <xsl:call-template name="simple.xlink">
+ <xsl:with-param name="content">
+ <xsl:call-template name="person.name"/>
+ </xsl:with-param>
+ </xsl:call-template>
+ <xsl:call-template name="apply-annotations"/>
+ </xsl:param>
+
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:copy-of select="$content"/>
+ </span>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="beginpage">
+ <!-- does nothing; this *is not* markup to force a page break. -->
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/keywords.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/keywords.xsl
new file mode 100644
index 0000000..5f6b4fb
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/keywords.xsl
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="ASCII"?>
+<!--This file was created automatically by html2xhtml-->
+<!--from the HTML stylesheets.-->
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1999/xhtml" version="1.0">
+
+<!-- ********************************************************************
+ $Id: keywords.xsl 6910 2007-06-28 23:23:30Z xmldoc $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<xsl:template match="keywordset"/>
+<xsl:template match="subjectset"/>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="keywordset" mode="html.header">
+ <meta name="keywords">
+ <xsl:attribute name="content">
+ <xsl:apply-templates select="keyword" mode="html.header"/>
+ </xsl:attribute>
+ </meta>
+</xsl:template>
+
+<xsl:template match="keyword" mode="html.header">
+ <xsl:apply-templates/>
+ <xsl:if test="following-sibling::keyword">, </xsl:if>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/lists.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/lists.xsl
new file mode 100644
index 0000000..58916e5
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/lists.xsl
@@ -0,0 +1,1121 @@
+<?xml version="1.0" encoding="ASCII"?>
+<!--This file was created automatically by html2xhtml-->
+<!--from the HTML stylesheets.-->
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1999/xhtml" version="1.0">
+
+<!-- ********************************************************************
+ $Id: lists.xsl 8524 2009-10-10 02:45:47Z abdelazer $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<!-- ==================================================================== -->
+
+<xsl:template match="itemizedlist">
+ <div>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:call-template name="anchor"/>
+ <xsl:if test="title">
+ <xsl:call-template name="formal.object.heading"/>
+ </xsl:if>
+
+ <!-- Preserve order of PIs and comments -->
+ <xsl:apply-templates select="*[not(self::listitem or self::title or self::titleabbrev)] |comment()[not(preceding-sibling::listitem)] |processing-instruction()[not(preceding-sibling::listitem)]"/>
+
+ <ul>
+ <xsl:call-template name="generate.class.attribute"/>
+ <xsl:if test="$css.decoration != 0">
+ <xsl:attribute name="type">
+ <xsl:call-template name="list.itemsymbol"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:if test="@spacing='compact'">
+ <xsl:attribute name="compact">
+ <xsl:value-of select="@spacing"/>
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:apply-templates select="listitem |comment()[preceding-sibling::listitem] |processing-instruction()[preceding-sibling::listitem]"/>
+ </ul>
+ </div>
+</xsl:template>
+
+<xsl:template match="itemizedlist/title">
+ <!-- nop -->
+</xsl:template>
+
+<xsl:template match="itemizedlist/listitem">
+ <xsl:variable name="mark" select="../@mark"/>
+ <xsl:variable name="override" select="@override"/>
+
+ <xsl:variable name="usemark">
+ <xsl:choose>
+ <xsl:when test="$override != ''">
+ <xsl:value-of select="$override"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$mark"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="cssmark">
+ <xsl:choose>
+ <xsl:when test="$usemark = 'opencircle'">circle</xsl:when>
+ <xsl:when test="$usemark = 'bullet'">disc</xsl:when>
+ <xsl:when test="$usemark = 'box'">square</xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$usemark"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <li>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:if test="$css.decoration = '1' and $cssmark != ''">
+ <xsl:attribute name="style">
+ <xsl:text>list-style-type: </xsl:text>
+ <xsl:value-of select="$cssmark"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <!-- we can't just drop the anchor in since some browsers (Opera)
+ get confused about line breaks if we do. So if the first child
+ is a para, assume the para will put in the anchor. Otherwise,
+ put the anchor in anyway. -->
+ <xsl:if test="local-name(child::*[1]) != 'para'">
+ <xsl:call-template name="anchor"/>
+ </xsl:if>
+
+ <xsl:choose>
+ <xsl:when test="$show.revisionflag != 0 and @revisionflag">
+ <div class="{@revisionflag}">
+ <xsl:apply-templates/>
+ </div>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </li>
+</xsl:template>
+
+<xsl:template match="orderedlist">
+ <xsl:variable name="start">
+ <xsl:call-template name="orderedlist-starting-number"/>
+ </xsl:variable>
+
+ <xsl:variable name="numeration">
+ <xsl:call-template name="list.numeration"/>
+ </xsl:variable>
+
+ <xsl:variable name="type">
+ <xsl:choose>
+ <xsl:when test="$numeration='arabic'">1</xsl:when>
+ <xsl:when test="$numeration='loweralpha'">a</xsl:when>
+ <xsl:when test="$numeration='lowerroman'">i</xsl:when>
+ <xsl:when test="$numeration='upperalpha'">A</xsl:when>
+ <xsl:when test="$numeration='upperroman'">I</xsl:when>
+ <!-- What!? This should never happen -->
+ <xsl:otherwise>
+ <xsl:message>
+ <xsl:text>Unexpected numeration: </xsl:text>
+ <xsl:value-of select="$numeration"/>
+ </xsl:message>
+ <xsl:value-of select="1"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <div>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:call-template name="anchor"/>
+
+ <xsl:if test="title">
+ <xsl:call-template name="formal.object.heading"/>
+ </xsl:if>
+
+ <!-- Preserve order of PIs and comments -->
+ <xsl:apply-templates select="*[not(self::listitem or self::title or self::titleabbrev)] |comment()[not(preceding-sibling::listitem)] |processing-instruction()[not(preceding-sibling::listitem)]"/>
+
+ <xsl:choose>
+ <xsl:when test="@inheritnum='inherit' and ancestor::listitem[parent::orderedlist]">
+ <table border="0">
+ <xsl:call-template name="generate.class.attribute"/>
+ <col align="{$direction.align.start}" valign="top"/>
+ <tbody>
+ <xsl:apply-templates mode="orderedlist-table" select="listitem |comment()[preceding-sibling::listitem] |processing-instruction()[preceding-sibling::listitem]"/>
+ </tbody>
+ </table>
+ </xsl:when>
+ <xsl:otherwise>
+ <ol>
+ <xsl:call-template name="generate.class.attribute"/>
+ <xsl:if test="$start != '1'">
+ <xsl:attribute name="start">
+ <xsl:value-of select="$start"/>
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:if test="$numeration != ''">
+ <xsl:attribute name="type">
+ <xsl:value-of select="$type"/>
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:if test="@spacing='compact'">
+ <xsl:attribute name="compact">
+ <xsl:value-of select="@spacing"/>
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:apply-templates select="listitem |comment()[preceding-sibling::listitem] |processing-instruction()[preceding-sibling::listitem]"/>
+ </ol>
+ </xsl:otherwise>
+ </xsl:choose>
+ </div>
+</xsl:template>
+
+<xsl:template match="orderedlist/title">
+ <!-- nop -->
+</xsl:template>
+
+<xsl:template match="orderedlist/listitem">
+ <li>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:if test="@override">
+ <xsl:attribute name="value">
+ <xsl:value-of select="@override"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <!-- we can't just drop the anchor in since some browsers (Opera)
+ get confused about line breaks if we do. So if the first child
+ is a para, assume the para will put in the anchor. Otherwise,
+ put the anchor in anyway. -->
+ <xsl:if test="local-name(child::*[1]) != 'para'">
+ <xsl:call-template name="anchor"/>
+ </xsl:if>
+
+ <xsl:choose>
+ <xsl:when test="$show.revisionflag != 0 and @revisionflag">
+ <div class="{@revisionflag}">
+ <xsl:apply-templates/>
+ </div>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </li>
+</xsl:template>
+
+<xsl:template match="orderedlist/listitem" mode="orderedlist-table">
+ <tr>
+ <td>
+ <xsl:apply-templates select="." mode="item-number"/>
+ </td>
+ <td>
+ <xsl:if test="local-name(child::*[1]) != 'para'">
+ <xsl:call-template name="anchor"/>
+ </xsl:if>
+
+ <xsl:choose>
+ <xsl:when test="$show.revisionflag != 0 and @revisionflag">
+ <div class="{@revisionflag}">
+ <xsl:apply-templates/>
+ </div>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </td>
+ </tr>
+</xsl:template>
+
+<xsl:template match="variablelist">
+ <xsl:variable name="pi-presentation">
+ <xsl:call-template name="pi.dbhtml_list-presentation"/>
+ </xsl:variable>
+
+ <xsl:variable name="presentation">
+ <xsl:choose>
+ <xsl:when test="$pi-presentation != ''">
+ <xsl:value-of select="$pi-presentation"/>
+ </xsl:when>
+ <xsl:when test="$variablelist.as.table != 0">
+ <xsl:value-of select="'table'"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="'list'"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="list-width">
+ <xsl:call-template name="pi.dbhtml_list-width"/>
+ </xsl:variable>
+
+ <xsl:variable name="term-width">
+ <xsl:call-template name="pi.dbhtml_term-width"/>
+ </xsl:variable>
+
+ <xsl:variable name="table-summary">
+ <xsl:call-template name="pi.dbhtml_table-summary"/>
+ </xsl:variable>
+
+ <div>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:call-template name="anchor"/>
+ <xsl:if test="title">
+ <xsl:call-template name="formal.object.heading"/>
+ </xsl:if>
+
+ <xsl:choose>
+ <xsl:when test="$presentation = 'table'">
+ <!-- Preserve order of PIs and comments -->
+ <xsl:apply-templates select="*[not(self::varlistentry or self::title or self::titleabbrev)] |comment()[not(preceding-sibling::varlistentry)] |processing-instruction()[not(preceding-sibling::varlistentry)]"/>
+ <table border="0">
+ <xsl:if test="$list-width != ''">
+ <xsl:attribute name="width">
+ <xsl:value-of select="$list-width"/>
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:if test="$table-summary != ''">
+ <xsl:attribute name="summary">
+ <xsl:value-of select="$table-summary"/>
+ </xsl:attribute>
+ </xsl:if>
+ <col align="{$direction.align.start}" valign="top">
+ <xsl:if test="$term-width != ''">
+ <xsl:attribute name="width">
+ <xsl:value-of select="$term-width"/>
+ </xsl:attribute>
+ </xsl:if>
+ </col>
+ <tbody>
+ <xsl:apply-templates mode="varlist-table" select="varlistentry |comment()[preceding-sibling::varlistentry] |processing-instruction()[preceding-sibling::varlistentry]"/>
+ </tbody>
+ </table>
+ </xsl:when>
+ <xsl:otherwise>
+ <!-- Preserve order of PIs and comments -->
+ <xsl:apply-templates select="*[not(self::varlistentry or self::title or self::titleabbrev)] |comment()[not(preceding-sibling::varlistentry)] |processing-instruction()[not(preceding-sibling::varlistentry)]"/>
+ <dl>
+ <xsl:apply-templates select="varlistentry |comment()[preceding-sibling::varlistentry] |processing-instruction()[preceding-sibling::varlistentry]"/>
+ </dl>
+ </xsl:otherwise>
+ </xsl:choose>
+ </div>
+</xsl:template>
+
+<xsl:template match="variablelist/title">
+ <!-- nop -->
+</xsl:template>
+
+<xsl:template match="itemizedlist/titleabbrev|orderedlist/titleabbrev">
+ <!--nop-->
+</xsl:template>
+
+<xsl:template match="variablelist/titleabbrev">
+ <!--nop-->
+</xsl:template>
+
+<xsl:template match="listitem" mode="xref">
+ <xsl:number format="1"/>
+</xsl:template>
+
+<xsl:template match="listitem/simpara" priority="2">
+ <!-- If a listitem contains only a single simpara, don't output
+ the <p> wrapper; this has the effect of creating an li
+ with simple text content. -->
+ <xsl:choose>
+ <xsl:when test="not(preceding-sibling::*) and not (following-sibling::*)">
+ <xsl:call-template name="anchor"/>
+ <xsl:apply-templates/>
+ </xsl:when>
+ <xsl:otherwise>
+ <p>
+ <xsl:choose>
+ <xsl:when test="@role and $para.propagates.style != 0">
+ <xsl:call-template name="common.html.attributes">
+ <xsl:with-param name="class" select="@role"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="common.html.attributes"/>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:call-template name="anchor"/>
+ <xsl:apply-templates/>
+ </p>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="varlistentry">
+ <dt>
+ <xsl:call-template name="anchor"/>
+ <xsl:apply-templates select="term"/>
+ </dt>
+ <dd>
+ <xsl:apply-templates select="listitem"/>
+ </dd>
+</xsl:template>
+
+<xsl:template match="varlistentry" mode="varlist-table">
+ <xsl:variable name="presentation">
+ <xsl:call-template name="pi.dbhtml_term-presentation">
+ <xsl:with-param name="node" select=".."/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="separator">
+ <xsl:call-template name="pi.dbhtml_term-separator">
+ <xsl:with-param name="node" select=".."/>
+ </xsl:call-template>
+ </xsl:variable>
+ <tr>
+ <xsl:call-template name="tr.attributes">
+ <xsl:with-param name="rownum">
+ <xsl:number from="variablelist" count="varlistentry"/>
+ </xsl:with-param>
+ </xsl:call-template>
+
+ <td>
+ <p>
+ <xsl:call-template name="anchor"/>
+ <xsl:choose>
+ <xsl:when test="$presentation = 'bold'">
+ <strong>
+ <xsl:apply-templates select="term"/>
+ <xsl:value-of select="$separator"/>
+ </strong>
+ </xsl:when>
+ <xsl:when test="$presentation = 'italic'">
+ <em>
+ <xsl:apply-templates select="term"/>
+ <xsl:value-of select="$separator"/>
+ </em>
+ </xsl:when>
+ <xsl:when test="$presentation = 'bold-italic'">
+ <strong>
+ <em>
+ <xsl:apply-templates select="term"/>
+ <xsl:value-of select="$separator"/>
+ </em>
+ </strong>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="term"/>
+ <xsl:value-of select="$separator"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </p>
+ </td>
+ <td>
+ <xsl:apply-templates select="listitem"/>
+ </td>
+ </tr>
+</xsl:template>
+
+<xsl:template match="varlistentry/term">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:call-template name="anchor"/>
+ <xsl:call-template name="simple.xlink">
+ <xsl:with-param name="content">
+ <xsl:apply-templates/>
+ </xsl:with-param>
+ </xsl:call-template>
+ <xsl:choose>
+ <xsl:when test="position() = last()"/> <!-- do nothing -->
+ <xsl:otherwise>
+ <!-- * if we have multiple terms in the same varlistentry, generate -->
+ <!-- * a separator (", " by default) and/or an additional line -->
+ <!-- * break after each one except the last -->
+ <xsl:value-of select="$variablelist.term.separator"/>
+ <xsl:if test="not($variablelist.term.break.after = '0')">
+ <br/>
+ </xsl:if>
+ </xsl:otherwise>
+ </xsl:choose>
+ </span>
+</xsl:template>
+
+<xsl:template match="varlistentry/listitem">
+ <!-- we can't just drop the anchor in since some browsers (Opera)
+ get confused about line breaks if we do. So if the first child
+ is a para, assume the para will put in the anchor. Otherwise,
+ put the anchor in anyway. -->
+ <xsl:if test="local-name(child::*[1]) != 'para'">
+ <xsl:call-template name="anchor"/>
+ </xsl:if>
+
+ <xsl:choose>
+ <xsl:when test="$show.revisionflag != 0 and @revisionflag">
+ <div class="{@revisionflag}">
+ <xsl:apply-templates/>
+ </div>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="simplelist">
+ <!-- with no type specified, the default is 'vert' -->
+ <xsl:call-template name="anchor"/>
+ <table border="0" summary="Simple list">
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:call-template name="simplelist.vert">
+ <xsl:with-param name="cols">
+ <xsl:choose>
+ <xsl:when test="@columns">
+ <xsl:value-of select="@columns"/>
+ </xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:with-param>
+ </xsl:call-template>
+ </table>
+</xsl:template>
+
+<xsl:template match="simplelist[@type='inline']">
+ <span>
+ <xsl:call-template name="common.html.attributes"/>
+ <!-- if dbchoice PI exists, use that to determine the choice separator -->
+ <!-- (that is, equivalent of "and" or "or" in current locale), or literal -->
+ <!-- value of "choice" otherwise -->
+ <xsl:variable name="localized-choice-separator">
+ <xsl:choose>
+ <xsl:when test="processing-instruction('dbchoice')">
+ <xsl:call-template name="select.choice.separator"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <!-- empty -->
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:for-each select="member">
+ <xsl:call-template name="simple.xlink">
+ <xsl:with-param name="content">
+ <xsl:apply-templates/>
+ </xsl:with-param>
+ </xsl:call-template>
+ <xsl:choose>
+ <xsl:when test="position() = last()"/> <!-- do nothing -->
+ <xsl:otherwise>
+ <xsl:text>, </xsl:text>
+ <xsl:if test="position() = last() - 1">
+ <xsl:if test="$localized-choice-separator != ''">
+ <xsl:value-of select="$localized-choice-separator"/>
+ <xsl:text> </xsl:text>
+ </xsl:if>
+ </xsl:if>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:for-each>
+ </span>
+</xsl:template>
+
+<xsl:template match="simplelist[@type='horiz']">
+ <xsl:call-template name="anchor"/>
+ <table border="0" summary="Simple list">
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:call-template name="simplelist.horiz">
+ <xsl:with-param name="cols">
+ <xsl:choose>
+ <xsl:when test="@columns">
+ <xsl:value-of select="@columns"/>
+ </xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:with-param>
+ </xsl:call-template>
+ </table>
+</xsl:template>
+
+<xsl:template match="simplelist[@type='vert']">
+ <xsl:call-template name="anchor"/>
+ <table border="0" summary="Simple list">
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:call-template name="simplelist.vert">
+ <xsl:with-param name="cols">
+ <xsl:choose>
+ <xsl:when test="@columns">
+ <xsl:value-of select="@columns"/>
+ </xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:with-param>
+ </xsl:call-template>
+ </table>
+</xsl:template>
+
+<xsl:template name="simplelist.horiz">
+ <xsl:param name="cols">1</xsl:param>
+ <xsl:param name="cell">1</xsl:param>
+ <xsl:param name="members" select="./member"/>
+
+ <xsl:if test="$cell &lt;= count($members)">
+ <tr>
+ <xsl:call-template name="tr.attributes">
+ <xsl:with-param name="row" select="$members[1]"/>
+ <xsl:with-param name="rownum" select="(($cell - 1) div $cols) + 1"/>
+ </xsl:call-template>
+
+ <xsl:call-template name="simplelist.horiz.row">
+ <xsl:with-param name="cols" select="$cols"/>
+ <xsl:with-param name="cell" select="$cell"/>
+ <xsl:with-param name="members" select="$members"/>
+ </xsl:call-template>
+ </tr>
+ <xsl:call-template name="simplelist.horiz">
+ <xsl:with-param name="cols" select="$cols"/>
+ <xsl:with-param name="cell" select="$cell + $cols"/>
+ <xsl:with-param name="members" select="$members"/>
+ </xsl:call-template>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template name="simplelist.horiz.row">
+ <xsl:param name="cols">1</xsl:param>
+ <xsl:param name="cell">1</xsl:param>
+ <xsl:param name="members" select="./member"/>
+ <xsl:param name="curcol">1</xsl:param>
+
+ <xsl:if test="$curcol &lt;= $cols">
+ <td>
+ <xsl:choose>
+ <xsl:when test="$members[position()=$cell]">
+ <xsl:apply-templates select="$members[position()=$cell]"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text>&#160;</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ </td>
+ <xsl:call-template name="simplelist.horiz.row">
+ <xsl:with-param name="cols" select="$cols"/>
+ <xsl:with-param name="cell" select="$cell+1"/>
+ <xsl:with-param name="members" select="$members"/>
+ <xsl:with-param name="curcol" select="$curcol+1"/>
+ </xsl:call-template>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template name="simplelist.vert">
+ <xsl:param name="cols">1</xsl:param>
+ <xsl:param name="cell">1</xsl:param>
+ <xsl:param name="members" select="./member"/>
+ <xsl:param name="rows" select="floor((count($members)+$cols - 1) div $cols)"/>
+
+ <xsl:if test="$cell &lt;= $rows">
+ <tr>
+ <xsl:call-template name="tr.attributes">
+ <xsl:with-param name="row" select="$members[1]"/>
+ <xsl:with-param name="rownum" select="$cell"/>
+ </xsl:call-template>
+
+ <xsl:call-template name="simplelist.vert.row">
+ <xsl:with-param name="cols" select="$cols"/>
+ <xsl:with-param name="rows" select="$rows"/>
+ <xsl:with-param name="cell" select="$cell"/>
+ <xsl:with-param name="members" select="$members"/>
+ </xsl:call-template>
+ </tr>
+ <xsl:call-template name="simplelist.vert">
+ <xsl:with-param name="cols" select="$cols"/>
+ <xsl:with-param name="cell" select="$cell+1"/>
+ <xsl:with-param name="members" select="$members"/>
+ <xsl:with-param name="rows" select="$rows"/>
+ </xsl:call-template>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template name="simplelist.vert.row">
+ <xsl:param name="cols">1</xsl:param>
+ <xsl:param name="rows">1</xsl:param>
+ <xsl:param name="cell">1</xsl:param>
+ <xsl:param name="members" select="./member"/>
+ <xsl:param name="curcol">1</xsl:param>
+
+ <xsl:if test="$curcol &lt;= $cols">
+ <td>
+ <xsl:choose>
+ <xsl:when test="$members[position()=$cell]">
+ <xsl:apply-templates select="$members[position()=$cell]"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text>&#160;</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ </td>
+ <xsl:call-template name="simplelist.vert.row">
+ <xsl:with-param name="cols" select="$cols"/>
+ <xsl:with-param name="rows" select="$rows"/>
+ <xsl:with-param name="cell" select="$cell+$rows"/>
+ <xsl:with-param name="members" select="$members"/>
+ <xsl:with-param name="curcol" select="$curcol+1"/>
+ </xsl:call-template>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="member">
+ <xsl:call-template name="anchor"/>
+ <xsl:call-template name="simple.xlink">
+ <xsl:with-param name="content">
+ <xsl:apply-templates/>
+ </xsl:with-param>
+ </xsl:call-template>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="procedure">
+ <xsl:variable name="param.placement" select="substring-after(normalize-space($formal.title.placement), concat(local-name(.), ' '))"/>
+
+ <xsl:variable name="placement">
+ <xsl:choose>
+ <xsl:when test="contains($param.placement, ' ')">
+ <xsl:value-of select="substring-before($param.placement, ' ')"/>
+ </xsl:when>
+ <xsl:when test="$param.placement = ''">before</xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$param.placement"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <!-- Preserve order of PIs and comments -->
+ <xsl:variable name="preamble" select="*[not(self::step or self::title or self::titleabbrev)] |comment()[not(preceding-sibling::step)] |processing-instruction()[not(preceding-sibling::step)]"/>
+
+ <div>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:call-template name="anchor">
+ <xsl:with-param name="conditional">
+ <xsl:choose>
+ <xsl:when test="title">0</xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:with-param>
+ </xsl:call-template>
+
+ <xsl:if test="title and $placement = 'before'">
+ <xsl:call-template name="formal.object.heading"/>
+ </xsl:if>
+
+ <xsl:apply-templates select="$preamble"/>
+
+ <xsl:choose>
+ <xsl:when test="count(step) = 1">
+ <ul>
+ <xsl:call-template name="generate.class.attribute"/>
+ <xsl:apply-templates select="step |comment()[preceding-sibling::step] |processing-instruction()[preceding-sibling::step]"/>
+ </ul>
+ </xsl:when>
+ <xsl:otherwise>
+ <ol>
+ <xsl:call-template name="generate.class.attribute"/>
+ <xsl:attribute name="type">
+ <xsl:value-of select="substring($procedure.step.numeration.formats,1,1)"/>
+ </xsl:attribute>
+ <xsl:apply-templates select="step |comment()[preceding-sibling::step] |processing-instruction()[preceding-sibling::step]"/>
+ </ol>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:if test="title and $placement != 'before'">
+ <xsl:call-template name="formal.object.heading"/>
+ </xsl:if>
+ </div>
+</xsl:template>
+
+<xsl:template match="procedure/title">
+ <!-- nop -->
+</xsl:template>
+
+<xsl:template match="substeps">
+ <xsl:variable name="numeration">
+ <xsl:call-template name="procedure.step.numeration"/>
+ </xsl:variable>
+
+ <xsl:call-template name="anchor"/>
+
+ <ol type="{$numeration}">
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates/>
+ </ol>
+</xsl:template>
+
+<xsl:template match="step">
+ <li>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:call-template name="anchor"/>
+ <xsl:apply-templates/>
+ </li>
+</xsl:template>
+
+<xsl:template match="stepalternatives">
+ <xsl:call-template name="anchor"/>
+ <ul>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates/>
+ </ul>
+</xsl:template>
+
+<xsl:template match="step/title">
+ <p>
+ <xsl:call-template name="common.html.attributes"/>
+ <strong xmlns:xslo="http://www.w3.org/1999/XSL/Transform">
+ <xsl:apply-templates/>
+ </strong>
+ </p>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="segmentedlist">
+ <xsl:variable name="presentation">
+ <xsl:call-template name="pi.dbhtml_list-presentation"/>
+ </xsl:variable>
+
+ <div>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:call-template name="anchor"/>
+
+ <xsl:choose>
+ <xsl:when test="$presentation = 'table'">
+ <xsl:apply-templates select="." mode="seglist-table"/>
+ </xsl:when>
+ <xsl:when test="$presentation = 'list'">
+ <xsl:apply-templates/>
+ </xsl:when>
+ <xsl:when test="$segmentedlist.as.table != 0">
+ <xsl:apply-templates select="." mode="seglist-table"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </div>
+</xsl:template>
+
+<xsl:template match="segmentedlist/title">
+ <div>
+ <xsl:call-template name="common.html.attributes"/>
+ <strong>
+ <span>
+ <xsl:call-template name="generate.class.attribute"/>
+ <xsl:apply-templates/>
+ </span>
+ </strong>
+ </div>
+</xsl:template>
+
+<xsl:template match="segtitle">
+</xsl:template>
+
+<xsl:template match="segtitle" mode="segtitle-in-seg">
+ <xsl:apply-templates/>
+</xsl:template>
+
+<xsl:template match="seglistitem">
+ <div>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:call-template name="anchor"/>
+ <xsl:apply-templates/>
+ </div>
+</xsl:template>
+
+<xsl:template match="seg">
+ <xsl:variable name="segnum" select="count(preceding-sibling::seg)+1"/>
+ <xsl:variable name="seglist" select="ancestor::segmentedlist"/>
+ <xsl:variable name="segtitles" select="$seglist/segtitle"/>
+
+ <!--
+ Note: segtitle is only going to be the right thing in a well formed
+ SegmentedList. If there are too many Segs or too few SegTitles,
+ you'll get something odd...maybe an error
+ -->
+
+ <div>
+ <xsl:call-template name="common.html.attributes"/>
+ <strong>
+ <span class="segtitle">
+ <xsl:apply-templates select="$segtitles[$segnum=position()]" mode="segtitle-in-seg"/>
+ <xsl:text>: </xsl:text>
+ </span>
+ </strong>
+ <xsl:apply-templates/>
+ </div>
+</xsl:template>
+
+<xsl:template match="segmentedlist" mode="seglist-table">
+ <xsl:variable name="table-summary">
+ <xsl:call-template name="pi.dbhtml_table-summary"/>
+ </xsl:variable>
+
+ <xsl:variable name="list-width">
+ <xsl:call-template name="pi.dbhtml_list-width"/>
+ </xsl:variable>
+
+ <xsl:apply-templates select="title"/>
+
+ <table border="0">
+ <xsl:if test="$list-width != ''">
+ <xsl:attribute name="width">
+ <xsl:value-of select="$list-width"/>
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:if test="$table-summary != ''">
+ <xsl:attribute name="summary">
+ <xsl:value-of select="$table-summary"/>
+ </xsl:attribute>
+ </xsl:if>
+ <thead>
+ <tr class="segtitle">
+ <xsl:call-template name="tr.attributes">
+ <xsl:with-param name="row" select="segtitle[1]"/>
+ <xsl:with-param name="rownum" select="1"/>
+ </xsl:call-template>
+ <xsl:apply-templates select="segtitle" mode="seglist-table"/>
+ </tr>
+ </thead>
+ <tbody>
+ <xsl:apply-templates select="seglistitem" mode="seglist-table"/>
+ </tbody>
+ </table>
+</xsl:template>
+
+<xsl:template match="segtitle" mode="seglist-table">
+ <th><xsl:apply-templates/></th>
+</xsl:template>
+
+<xsl:template match="seglistitem" mode="seglist-table">
+ <xsl:variable name="seglinum">
+ <xsl:number from="segmentedlist" count="seglistitem"/>
+ </xsl:variable>
+
+ <tr>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:call-template name="tr.attributes">
+ <xsl:with-param name="rownum" select="$seglinum + 1"/>
+ </xsl:call-template>
+ <xsl:apply-templates mode="seglist-table"/>
+ </tr>
+</xsl:template>
+
+<xsl:template match="seg" mode="seglist-table">
+ <td>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:apply-templates/>
+ </td>
+</xsl:template>
+
+<xsl:template match="seg[1]" mode="seglist-table">
+ <td>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:call-template name="anchor">
+ <xsl:with-param name="node" select="ancestor::seglistitem"/>
+ </xsl:call-template>
+ <xsl:apply-templates/>
+ </td>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="calloutlist">
+ <div>
+ <xsl:call-template name="common.html.attributes"/>
+ <xsl:call-template name="anchor"/>
+ <xsl:if test="title|info/title">
+ <xsl:call-template name="formal.object.heading"/>
+ </xsl:if>
+
+ <!-- Preserve order of PIs and comments -->
+ <xsl:apply-templates select="*[not(self::callout or self::title or self::titleabbrev)] |comment()[not(preceding-sibling::callout)] |processing-instruction()[not(preceding-sibling::callout)]"/>
+
+ <xsl:choose>
+ <xsl:when test="$callout.list.table != 0">
+ <table border="0" summary="Callout list">
+ <xsl:apply-templates select="callout |comment()[preceding-sibling::callout] |processing-instruction()[preceding-sibling::callout]"/>
+ </table>
+ </xsl:when>
+ <xsl:otherwise>
+ <dl compact="compact">
+ <xsl:apply-templates select="callout |comment()[preceding-sibling::callout] |processing-instruction()[preceding-sibling::callout]"/>
+ </dl>
+ </xsl:otherwise>
+ </xsl:choose>
+ </div>
+</xsl:template>
+
+<xsl:template match="calloutlist/title">
+</xsl:template>
+
+<xsl:template match="callout">
+ <xsl:choose>
+ <xsl:when test="$callout.list.table != 0">
+ <tr>
+ <xsl:call-template name="tr.attributes">
+ <xsl:with-param name="rownum">
+ <xsl:number from="calloutlist" count="callout"/>
+ </xsl:with-param>
+ </xsl:call-template>
+
+ <td width="5%" valign="top" align="{$direction.align.start}">
+ <p>
+ <xsl:call-template name="anchor"/>
+ <xsl:call-template name="callout.arearefs">
+ <xsl:with-param name="arearefs" select="@arearefs"/>
+ </xsl:call-template>
+ </p>
+ </td>
+ <td valign="top" align="{$direction.align.start}">
+ <xsl:apply-templates/>
+ </td>
+ </tr>
+ </xsl:when>
+ <xsl:otherwise>
+ <dt>
+ <xsl:call-template name="anchor"/>
+ <xsl:call-template name="callout.arearefs">
+ <xsl:with-param name="arearefs" select="@arearefs"/>
+ </xsl:call-template>
+ </dt>
+ <dd><xsl:apply-templates/></dd>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="callout/simpara" priority="2">
+ <!-- If a callout contains only a single simpara, don't output
+ the <p> wrapper; this has the effect of creating an li
+ with simple text content. -->
+ <xsl:choose>
+ <xsl:when test="not(preceding-sibling::*) and not (following-sibling::*)">
+ <xsl:call-template name="anchor"/>
+ <xsl:apply-templates/>
+ </xsl:when>
+ <xsl:otherwise>
+ <p>
+ <xsl:if test="@role and $para.propagates.style != 0">
+ <xsl:choose>
+ <xsl:when test="@role and $para.propagates.style != 0">
+ <xsl:call-template name="common.html.attributes">
+ <xsl:with-param name="class" select="@role"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="common.html.attributes"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:if>
+
+ <xsl:call-template name="anchor"/>
+ <xsl:apply-templates/>
+ </p>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="callout.arearefs">
+ <xsl:param name="arearefs"/>
+ <xsl:if test="$arearefs!=''">
+ <xsl:choose>
+ <xsl:when test="substring-before($arearefs,' ')=''">
+ <xsl:call-template name="callout.arearef">
+ <xsl:with-param name="arearef" select="$arearefs"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="callout.arearef">
+ <xsl:with-param name="arearef" select="substring-before($arearefs,' ')"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:call-template name="callout.arearefs">
+ <xsl:with-param name="arearefs" select="substring-after($arearefs,' ')"/>
+ </xsl:call-template>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template name="callout.arearef">
+ <xsl:param name="arearef"/>
+ <xsl:variable name="targets" select="key('id',$arearef)"/>
+ <xsl:variable name="target" select="$targets[1]"/>
+
+ <xsl:call-template name="check.id.unique">
+ <xsl:with-param name="linkend" select="$arearef"/>
+ </xsl:call-template>
+
+ <xsl:choose>
+ <xsl:when test="count($target)=0">
+ <xsl:text>???</xsl:text>
+ </xsl:when>
+ <xsl:when test="local-name($target)='co'">
+ <a>
+ <xsl:attribute name="href">
+ <xsl:text>#</xsl:text>
+ <xsl:value-of select="$arearef"/>
+ </xsl:attribute>
+ <xsl:apply-templates select="$target" mode="callout-bug"/>
+ </a>
+ <xsl:text> </xsl:text>
+ </xsl:when>
+ <xsl:when test="local-name($target)='areaset'">
+ <xsl:call-template name="callout-bug">
+ <xsl:with-param name="conum">
+ <xsl:apply-templates select="$target" mode="conumber"/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="local-name($target)='area'">
+ <xsl:choose>
+ <xsl:when test="$target/parent::areaset">
+ <xsl:call-template name="callout-bug">
+ <xsl:with-param name="conum">
+ <xsl:apply-templates select="$target/parent::areaset" mode="conumber"/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="callout-bug">
+ <xsl:with-param name="conum">
+ <xsl:apply-templates select="$target" mode="conumber"/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text>???</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template name="orderedlist-starting-number">
+ <xsl:param name="list" select="."/>
+ <xsl:variable name="pi-start">
+ <xsl:call-template name="pi.dbhtml_start">
+ <xsl:with-param name="node" select="$list"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:call-template name="output-orderedlist-starting-number">
+ <xsl:with-param name="list" select="$list"/>
+ <xsl:with-param name="pi-start" select="$pi-start"/>
+ </xsl:call-template>
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/maketoc.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/maketoc.xsl
new file mode 100644
index 0000000..0ae8055
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/maketoc.xsl
@@ -0,0 +1,91 @@
+<?xml version="1.0" encoding="ASCII"?>
+<!--This file was created automatically by html2xhtml-->
+<!--from the HTML stylesheets.-->
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:doc="http://nwalsh.com/xsl/documentation/1.0" xmlns="http://www.w3.org/1999/xhtml" version="1.0" exclude-result-prefixes="doc">
+
+<!-- ********************************************************************
+ $Id: maketoc.xsl 6910 2007-06-28 23:23:30Z xmldoc $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<!-- ==================================================================== -->
+
+<xsl:import href="docbook.xsl"/>
+<xsl:import href="chunk.xsl"/>
+
+<xsl:output method="xml" indent="no" encoding="UTF-8" doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN" doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"/>
+
+<xsl:param name="toc.list.type" select="'tocentry'"/>
+
+<!-- refentry in autotoc.xsl does not use subtoc, so must
+ handle it explicitly here. -->
+<xsl:template match="refentry" mode="toc">
+ <xsl:param name="toc-context" select="."/>
+
+ <xsl:call-template name="subtoc">
+ <xsl:with-param name="toc-context" select="$toc-context"/>
+ </xsl:call-template>
+</xsl:template>
+
+
+<xsl:template name="subtoc">
+ <xsl:param name="nodes" select="NOT-AN-ELEMENT"/>
+ <xsl:variable name="filename">
+ <xsl:apply-templates select="." mode="chunk-filename"/>
+ </xsl:variable>
+
+ <xsl:variable name="chunk">
+ <xsl:call-template name="chunk"/>
+ </xsl:variable>
+
+ <xsl:if test="$chunk != 0">
+ <xsl:call-template name="indent-spaces"/>
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+ <tocentry linkend="{$id}">
+ <xsl:processing-instruction name="dbhtml">
+ <xsl:text>filename="</xsl:text>
+ <xsl:value-of select="$filename"/>
+ <xsl:text>"</xsl:text>
+ </xsl:processing-instruction>
+ <xsl:text>
+</xsl:text>
+ <xsl:apply-templates mode="toc" select="$nodes"/>
+ <xsl:call-template name="indent-spaces"/>
+ </tocentry>
+ <xsl:text>
+</xsl:text>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template name="indent-spaces">
+ <xsl:param name="node" select="."/>
+ <xsl:text> </xsl:text>
+ <xsl:if test="$node/parent::*">
+ <xsl:call-template name="indent-spaces">
+ <xsl:with-param name="node" select="$node/parent::*"/>
+ </xsl:call-template>
+ </xsl:if>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="/" priority="-1">
+ <xsl:text>
+</xsl:text>
+ <toc role="chunk-toc">
+ <xsl:text>
+</xsl:text>
+ <xsl:apply-templates select="/" mode="toc"/>
+ </toc>
+ <xsl:text>
+</xsl:text>
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/manifest.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/manifest.xsl
new file mode 100644
index 0000000..26b51d0
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/manifest.xsl
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="ASCII"?>
+<!--This file was created automatically by html2xhtml-->
+<!--from the HTML stylesheets.-->
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:doc="http://nwalsh.com/xsl/documentation/1.0" xmlns="http://www.w3.org/1999/xhtml" version="1.0" exclude-result-prefixes="doc">
+
+<!-- ********************************************************************
+ $Id: manifest.xsl 6910 2007-06-28 23:23:30Z xmldoc $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<!-- ==================================================================== -->
+<!-- OBSOLETE. The templates from this file were moved to -->
+<!-- chunk-common.xsl and chunk-code.xsl. -->
+<!-- ==================================================================== -->
+
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/math.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/math.xsl
new file mode 100644
index 0000000..b2cac2d
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/math.xsl
@@ -0,0 +1,284 @@
+<?xml version="1.0" encoding="ASCII"?>
+<!--This file was created automatically by html2xhtml-->
+<!--from the HTML stylesheets.-->
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns="http://www.w3.org/1999/xhtml" exclude-result-prefixes="mml" version="1.0">
+
+<!-- ********************************************************************
+ $Id: math.xsl 8421 2009-05-04 07:49:49Z bobstayton $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<xsl:template match="inlineequation">
+ <xsl:apply-templates/>
+</xsl:template>
+
+<xsl:template match="alt">
+</xsl:template>
+
+<xsl:template match="mathphrase">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates/>
+ </span>
+</xsl:template>
+
+<!-- "Support" for MathML -->
+
+<xsl:template match="mml:*">
+ <xsl:copy>
+ <xsl:copy-of select="@*"/>
+ <xsl:apply-templates/>
+ </xsl:copy>
+</xsl:template>
+
+<!-- Support for TeX math in alt -->
+
+<xsl:template match="*" mode="collect.tex.math">
+ <xsl:call-template name="write.text.chunk">
+ <xsl:with-param name="filename" select="$tex.math.file"/>
+ <xsl:with-param name="method" select="'text'"/>
+ <xsl:with-param name="content">
+ <xsl:choose>
+ <xsl:when test="$tex.math.in.alt = 'plain'">
+ <xsl:call-template name="tex.math.plain.head"/>
+ <xsl:apply-templates select="." mode="collect.tex.math.plain"/>
+ <xsl:call-template name="tex.math.plain.tail"/>
+ </xsl:when>
+ <xsl:when test="$tex.math.in.alt = 'latex'">
+ <xsl:call-template name="tex.math.latex.head"/>
+ <xsl:apply-templates select="." mode="collect.tex.math.latex"/>
+ <xsl:call-template name="tex.math.latex.tail"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:message>
+ Unsupported TeX math notation:
+ <xsl:value-of select="$tex.math.in.alt"/>
+ </xsl:message>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:with-param>
+ <xsl:with-param name="encoding" select="$chunker.output.encoding"/>
+ </xsl:call-template>
+</xsl:template>
+
+<!-- PlainTeX -->
+
+<xsl:template name="tex.math.plain.head">
+ <xsl:text>\nopagenumbers
+</xsl:text>
+</xsl:template>
+
+<xsl:template name="tex.math.plain.tail">
+ <xsl:text>\bye
+</xsl:text>
+</xsl:template>
+
+<xsl:template match="inlineequation" mode="collect.tex.math.plain">
+ <xsl:variable name="filename">
+ <xsl:choose>
+ <xsl:when test="graphic">
+ <xsl:call-template name="mediaobject.filename">
+ <xsl:with-param name="object" select="graphic"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="select.mediaobject.filename">
+ <xsl:with-param name="olist" select="inlinemediaobject/*"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:variable name="output.delims">
+ <xsl:call-template name="tex.math.output.delims"/>
+ </xsl:variable>
+ <xsl:variable name="tex" select="alt[@role='tex'] | inlinemediaobject/textobject[@role='tex']"/>
+ <xsl:if test="$tex">
+ <xsl:text>\special{dvi2bitmap outputfile </xsl:text>
+ <xsl:value-of select="$filename"/>
+ <xsl:text>}
+</xsl:text>
+ <xsl:if test="$output.delims != 0">
+ <xsl:text>$</xsl:text>
+ </xsl:if>
+ <xsl:value-of select="$tex"/>
+ <xsl:if test="$output.delims != 0">
+ <xsl:text>$
+</xsl:text>
+ </xsl:if>
+ <xsl:text>\vfill\eject
+</xsl:text>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="equation|informalequation" mode="collect.tex.math.plain">
+ <xsl:variable name="filename">
+ <xsl:choose>
+ <xsl:when test="graphic">
+ <xsl:call-template name="mediaobject.filename">
+ <xsl:with-param name="object" select="graphic"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="select.mediaobject.filename">
+ <xsl:with-param name="olist" select="mediaobject/*"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:variable name="output.delims">
+ <xsl:call-template name="tex.math.output.delims"/>
+ </xsl:variable>
+ <xsl:variable name="tex" select="alt[@role='tex'] | mediaobject/textobject[@role='tex']"/>
+ <xsl:if test="$tex">
+ <xsl:text>\special{dvi2bitmap outputfile </xsl:text>
+ <xsl:value-of select="$filename"/>
+ <xsl:text>}
+</xsl:text>
+ <xsl:if test="$output.delims != 0">
+ <xsl:text>$$</xsl:text>
+ </xsl:if>
+ <xsl:value-of select="$tex"/>
+ <xsl:if test="$output.delims != 0">
+ <xsl:text>$$
+</xsl:text>
+ </xsl:if>
+ <xsl:text>\vfill\eject
+</xsl:text>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="text()" mode="collect.tex.math.plain"/>
+
+<!-- LaTeX -->
+
+<xsl:template name="tex.math.latex.head">
+ <xsl:text>\documentclass{article}
+</xsl:text>
+ <xsl:text>\pagestyle{empty}
+</xsl:text>
+ <xsl:text>\begin{document}
+</xsl:text>
+</xsl:template>
+
+<xsl:template name="tex.math.latex.tail">
+ <xsl:text>\end{document}
+</xsl:text>
+</xsl:template>
+
+<xsl:template match="inlineequation" mode="collect.tex.math.latex">
+ <xsl:variable name="filename">
+ <xsl:choose>
+ <xsl:when test="graphic">
+ <xsl:call-template name="mediaobject.filename">
+ <xsl:with-param name="object" select="graphic"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="select.mediaobject.filename">
+ <xsl:with-param name="olist" select="inlinemediaobject/*"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:variable name="output.delims">
+ <xsl:call-template name="tex.math.output.delims"/>
+ </xsl:variable>
+ <xsl:variable name="tex" select="alt[@role='tex'] | inlinemediaobject/textobject[@role='tex']"/>
+ <xsl:if test="$tex">
+ <xsl:text>\special{dvi2bitmap outputfile </xsl:text>
+ <xsl:value-of select="$filename"/>
+ <xsl:text>}
+</xsl:text>
+ <xsl:if test="$output.delims != 0">
+ <xsl:text>$</xsl:text>
+ </xsl:if>
+ <xsl:value-of select="$tex"/>
+ <xsl:if test="$output.delims != 0">
+ <xsl:text>$
+</xsl:text>
+ </xsl:if>
+ <xsl:text>\newpage
+</xsl:text>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="equation|informalequation" mode="collect.tex.math.latex">
+ <xsl:variable name="filename">
+ <xsl:choose>
+ <xsl:when test="graphic">
+ <xsl:call-template name="mediaobject.filename">
+ <xsl:with-param name="object" select="graphic"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="select.mediaobject.filename">
+ <xsl:with-param name="olist" select="mediaobject/*"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:variable name="output.delims">
+ <xsl:call-template name="tex.math.output.delims"/>
+ </xsl:variable>
+ <xsl:variable name="tex" select="alt[@role='tex'] | mediaobject/textobject[@role='tex']"/>
+ <xsl:if test="$tex">
+ <xsl:text>\special{dvi2bitmap outputfile </xsl:text>
+ <xsl:value-of select="$filename"/>
+ <xsl:text>}
+</xsl:text>
+ <xsl:if test="$output.delims != 0">
+ <xsl:text>$$</xsl:text>
+ </xsl:if>
+ <xsl:value-of select="$tex"/>
+ <xsl:if test="$output.delims != 0">
+ <xsl:text>$$
+</xsl:text>
+ </xsl:if>
+ <xsl:text>\newpage
+</xsl:text>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="text()" mode="collect.tex.math.latex"/>
+
+<!-- Extracting image filename from mediaobject and graphic elements -->
+
+<xsl:template name="select.mediaobject.filename">
+ <xsl:param name="olist" select="imageobject|imageobjectco |videoobject|audioobject|textobject"/>
+
+ <xsl:variable name="mediaobject.index">
+ <xsl:call-template name="select.mediaobject.index">
+ <xsl:with-param name="olist" select="$olist"/>
+ <xsl:with-param name="count" select="1"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:if test="$mediaobject.index != ''">
+ <xsl:call-template name="mediaobject.filename">
+ <xsl:with-param name="object" select="$olist[position() = $mediaobject.index]"/>
+ </xsl:call-template>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template name="tex.math.output.delims">
+ <xsl:variable name="pi.delims">
+ <xsl:call-template name="pi.dbtex_delims">
+ <xsl:with-param name="node" select="descendant-or-self::*"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:variable name="result">
+ <xsl:choose>
+ <xsl:when test="$pi.delims = 'no'">0</xsl:when>
+ <xsl:when test="$pi.delims = '' and $tex.math.delims = 0">0</xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:value-of select="$result"/>
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/oldchunker.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/oldchunker.xsl
new file mode 100644
index 0000000..e727bf1
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/oldchunker.xsl
@@ -0,0 +1,176 @@
+<?xml version="1.0" encoding="ASCII"?>
+<!--This file was created automatically by html2xhtml-->
+<!--from the HTML stylesheets.-->
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:saxon="http://icl.com/saxon" xmlns:lxslt="http://xml.apache.org/xslt" xmlns:redirect="http://xml.apache.org/xalan/redirect" xmlns:doc="http://nwalsh.com/xsl/documentation/1.0" xmlns="http://www.w3.org/1999/xhtml" version="1.1" exclude-result-prefixes="doc" extension-element-prefixes="saxon redirect lxslt">
+
+<!-- ********************************************************************
+ $Id: oldchunker.xsl 6910 2007-06-28 23:23:30Z xmldoc $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<!-- ==================================================================== -->
+
+<!-- This stylesheet works with Saxon and Xalan; for XT use xtchunker.xsl -->
+
+<!-- ==================================================================== -->
+
+<xsl:param name="default.encoding" select="'ISO-8859-1'" doc:type="string"/>
+
+<doc:param xmlns="" name="default.encoding">
+<refpurpose xmlns="http://www.w3.org/1999/xhtml">Encoding used in generated HTML pages</refpurpose>
+<refdescription xmlns="http://www.w3.org/1999/xhtml">
+<para>This encoding is used in files generated by chunking stylesheet. Currently
+only Saxon is able to change output encoding.
+</para>
+</refdescription>
+</doc:param>
+
+<!-- ==================================================================== -->
+
+<xsl:param name="saxon.character.representation" select="'entity;decimal'" doc:type="string"/>
+
+<doc:param xmlns="" name="saxon.character.representation">
+<refpurpose xmlns="http://www.w3.org/1999/xhtml">Saxon character representation used in generated HTML pages</refpurpose>
+<refdescription xmlns="http://www.w3.org/1999/xhtml">
+<para>This character representation is used in files generated by chunking stylesheet. If
+you want to suppress entity references for characters with direct representation
+in default.encoding, set this parameter to value <literal>native</literal>.
+</para>
+</refdescription>
+</doc:param>
+
+<!-- ==================================================================== -->
+
+<xsl:template name="make-relative-filename">
+ <xsl:param name="base.dir" select="'./'"/>
+ <xsl:param name="base.name" select="''"/>
+
+ <xsl:variable name="vendor" select="system-property('xsl:vendor')"/>
+
+ <xsl:choose>
+ <xsl:when test="contains($vendor, 'SAXON')">
+ <!-- Saxon doesn't make the chunks relative -->
+ <xsl:value-of select="concat($base.dir,$base.name)"/>
+ </xsl:when>
+ <xsl:when test="contains($vendor, 'Apache')">
+ <!-- Xalan doesn't make the chunks relative -->
+ <xsl:value-of select="concat($base.dir,$base.name)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:message terminate="yes">
+ <xsl:text>Chunking isn't supported with </xsl:text>
+ <xsl:value-of select="$vendor"/>
+ </xsl:message>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="write.chunk">
+ <xsl:param name="filename" select="''"/>
+ <xsl:param name="method" select="'html'"/>
+ <xsl:param name="encoding" select="$default.encoding"/>
+ <xsl:param name="indent" select="'no'"/>
+ <xsl:param name="content" select="''"/>
+
+ <xsl:message>
+ <xsl:text>Writing </xsl:text>
+ <xsl:value-of select="$filename"/>
+ <xsl:if test="name(.) != ''">
+ <xsl:text> for </xsl:text>
+ <xsl:value-of select="name(.)"/>
+ <xsl:if test="@id">
+ <xsl:text>(</xsl:text>
+ <xsl:value-of select="@id"/>
+ <xsl:text>)</xsl:text>
+ </xsl:if>
+ </xsl:if>
+ </xsl:message>
+
+ <xsl:variable name="vendor" select="system-property('xsl:vendor')"/>
+
+ <xsl:choose>
+ <xsl:when test="contains($vendor, 'SAXON 6.2')">
+ <!-- Saxon 6.2.x uses xsl:document -->
+ <xsl:document href="{$filename}" method="{$method}" encoding="{$encoding}" indent="{$indent}" saxon:character-representation="{$saxon.character.representation}">
+ <xsl:copy-of select="$content"/>
+ </xsl:document>
+ </xsl:when>
+ <xsl:when test="contains($vendor, 'SAXON')">
+ <!-- Saxon uses saxon:output -->
+ <saxon:output file="{$filename}" href="{$filename}" method="{$method}" encoding="{$encoding}" indent="{$indent}" saxon:character-representation="{$saxon.character.representation}">
+ <xsl:copy-of select="$content"/>
+ </saxon:output>
+ </xsl:when>
+ <xsl:when test="contains($vendor, 'Apache')">
+ <!-- Xalan uses redirect -->
+ <redirect:write file="{$filename}">
+ <xsl:copy-of select="$content"/>
+ </redirect:write>
+ </xsl:when>
+ <xsl:otherwise>
+ <!-- it doesn't matter since we won't be making chunks... -->
+ <xsl:message terminate="yes">
+ <xsl:text>Can't make chunks with </xsl:text>
+ <xsl:value-of select="$vendor"/>
+ <xsl:text>'s processor.</xsl:text>
+ </xsl:message>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="write.chunk.with.doctype">
+ <xsl:param name="filename" select="''"/>
+ <xsl:param name="method" select="'html'"/>
+ <xsl:param name="encoding" select="$default.encoding"/>
+ <xsl:param name="indent" select="'no'"/>
+ <xsl:param name="doctype-public" select="''"/>
+ <xsl:param name="doctype-system" select="''"/>
+ <xsl:param name="content" select="''"/>
+
+ <xsl:message>
+ <xsl:text>Writing </xsl:text>
+ <xsl:value-of select="$filename"/>
+ <xsl:if test="name(.) != ''">
+ <xsl:text> for </xsl:text>
+ <xsl:value-of select="name(.)"/>
+ </xsl:if>
+ </xsl:message>
+
+ <xsl:variable name="vendor" select="system-property('xsl:vendor')"/>
+
+ <xsl:choose>
+ <xsl:when test="contains($vendor, 'SAXON 6.2')">
+ <!-- Saxon 6.2.x uses xsl:document -->
+ <xsl:document href="{$filename}" method="{$method}" encoding="{$encoding}" indent="{$indent}" doctype-public="{$doctype-public}" doctype-system="{$doctype-system}" saxon:character-representation="{$saxon.character.representation}">
+ <xsl:copy-of select="$content"/>
+ </xsl:document>
+ </xsl:when>
+ <xsl:when test="contains($vendor, 'SAXON')">
+ <!-- Saxon uses saxon:output -->
+ <saxon:output file="{$filename}" href="{$filename}" method="{$method}" encoding="{$encoding}" indent="{$indent}" doctype-public="{$doctype-public}" doctype-system="{$doctype-system}" saxon:character-representation="{$saxon.character.representation}">
+ <xsl:copy-of select="$content"/>
+ </saxon:output>
+ </xsl:when>
+ <xsl:when test="contains($vendor, 'Apache')">
+ <!-- Xalan uses redirect -->
+ <redirect:write file="{$filename}">
+ <xsl:copy-of select="$content"/>
+ </redirect:write>
+ </xsl:when>
+ <xsl:otherwise>
+ <!-- it doesn't matter since we won't be making chunks... -->
+ <xsl:message terminate="yes">
+ <xsl:text>Can't make chunks with </xsl:text>
+ <xsl:value-of select="$vendor"/>
+ <xsl:text>'s processor.</xsl:text>
+ </xsl:message>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/onechunk.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/onechunk.xsl
new file mode 100644
index 0000000..15a04e1
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/onechunk.xsl
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="ASCII"?>
+<!--This file was created automatically by html2xhtml-->
+<!--from the HTML stylesheets.-->
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:doc="http://nwalsh.com/xsl/documentation/1.0" xmlns="http://www.w3.org/1999/xhtml" version="1.0" exclude-result-prefixes="doc">
+
+<!-- ********************************************************************
+ $Id: onechunk.xsl 6910 2007-06-28 23:23:30Z xmldoc $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<!-- ==================================================================== -->
+
+<xsl:import href="chunk.xsl"/>
+
+<!-- Ok, using the onechunk parameter makes this all work again. -->
+<!-- It does have the disadvantage that it only works for documents that have -->
+<!-- a root element that is considered a chunk by the chunk.xsl stylesheet. -->
+<!-- Ideally, onechunk would let anything be a chunk. But not today. -->
+
+<xsl:param name="onechunk" select="1"/>
+<xsl:param name="suppress.navigation">1</xsl:param>
+
+<xsl:template name="href.target.uri">
+ <xsl:param name="object" select="."/>
+ <xsl:text>#</xsl:text>
+ <xsl:call-template name="object.id">
+ <xsl:with-param name="object" select="$object"/>
+ </xsl:call-template>
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/param.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/param.xsl
new file mode 100644
index 0000000..bebab47
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/param.xsl
@@ -0,0 +1,436 @@
+<?xml version="1.0" encoding="ASCII"?>
+<!--This file was created automatically by html2xhtml-->
+<!--from the HTML stylesheets.-->
+<!-- This file is generated from param.xweb -->
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1999/xhtml" version="1.0">
+
+<!-- ********************************************************************
+ $Id: param.xweb 8552 2009-12-07 17:45:26Z bobstayton $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<xsl:param name="abstract.notitle.enabled" select="0"/>
+<xsl:param name="admon.graphics.extension">.png</xsl:param>
+<xsl:param name="admon.graphics" select="0"/>
+<xsl:param name="admon.graphics.path">images/</xsl:param>
+<xsl:param name="admon.style">
+ <xsl:value-of select="concat('margin-', $direction.align.start, ': 0.5in; margin-', $direction.align.end, ': 0.5in;')"/>
+</xsl:param>
+<xsl:param name="admon.textlabel" select="1"/>
+<xsl:param name="annotate.toc" select="1"/>
+<xsl:param name="annotation.css">
+/* ======================================================================
+ Annotations
+*/
+
+div.annotation-list { visibility: hidden;
+ }
+
+div.annotation-nocss { position: absolute;
+ visibility: hidden;
+ }
+
+div.annotation-popup { position: absolute;
+ z-index: 4;
+ visibility: hidden;
+ padding: 0px;
+ margin: 2px;
+ border-style: solid;
+ border-width: 1px;
+ width: 200px;
+ background-color: white;
+ }
+
+div.annotation-title { padding: 1px;
+ font-weight: bold;
+ border-bottom-style: solid;
+ border-bottom-width: 1px;
+ color: white;
+ background-color: black;
+ }
+
+div.annotation-body { padding: 2px;
+ }
+
+div.annotation-body p { margin-top: 0px;
+ padding-top: 0px;
+ }
+
+div.annotation-close { position: absolute;
+ top: 2px;
+ right: 2px;
+ }
+</xsl:param>
+<xsl:param name="annotation.graphic.close">
+http://docbook.sourceforge.net/release/images/annot-close.png</xsl:param>
+<xsl:param name="annotation.graphic.open">http://docbook.sourceforge.net/release/images/annot-open.png</xsl:param>
+
+<xsl:param name="annotation.js">
+<xsl:text>http://docbook.sourceforge.net/release/script/AnchorPosition.js http://docbook.sourceforge.net/release/script/PopupWindow.js</xsl:text></xsl:param>
+
+<xsl:param name="annotation.support" select="0"/>
+<xsl:param name="appendix.autolabel">A</xsl:param>
+<xsl:param name="author.othername.in.middle" select="1"/>
+<xsl:param name="autotoc.label.in.hyperlink" select="1"/>
+<xsl:param name="autotoc.label.separator">. </xsl:param>
+<xsl:param name="base.dir"/>
+<xsl:param name="biblioentry.item.separator">. </xsl:param>
+<xsl:param name="bibliography.collection">http://docbook.sourceforge.net/release/bibliography/bibliography.xml</xsl:param>
+
+<xsl:param name="bibliography.numbered" select="0"/>
+<xsl:param name="bibliography.style">normal</xsl:param>
+<xsl:param name="blurb.on.titlepage.enabled" select="0"/>
+<xsl:param name="bridgehead.in.toc" select="0"/>
+<xsl:param name="callout.defaultcolumn">60</xsl:param>
+<xsl:param name="callout.graphics.extension">.png</xsl:param>
+
+<xsl:param name="callout.graphics" select="1"/>
+<xsl:param name="callout.graphics.number.limit">15</xsl:param>
+
+<xsl:param name="callout.graphics.path">images/callouts/</xsl:param>
+<xsl:param name="callout.list.table" select="1"/>
+<xsl:param name="callout.unicode" select="0"/>
+<xsl:param name="callout.unicode.number.limit">10</xsl:param>
+<xsl:param name="callout.unicode.start.character">10102</xsl:param>
+<xsl:param name="callouts.extension" select="1"/>
+<xsl:param name="chapter.autolabel" select="1"/>
+<xsl:param name="chunk.append"/>
+<xsl:param name="chunk.first.sections" select="0"/>
+<xsl:param name="chunk.quietly" select="0"/>
+<xsl:param name="chunk.section.depth" select="1"/>
+<xsl:param name="chunk.separate.lots" select="0"/>
+<xsl:param name="chunk.toc"/>
+<xsl:param name="chunk.tocs.and.lots" select="0"/>
+<xsl:param name="chunk.tocs.and.lots.has.title" select="1"/>
+<xsl:param name="citerefentry.link" select="0"/>
+<xsl:param name="collect.xref.targets">no</xsl:param>
+<xsl:param name="component.label.includes.part.label" select="0"/>
+<xsl:param name="contrib.inline.enabled">1</xsl:param>
+<xsl:param name="css.decoration" select="1"/>
+<xsl:param name="current.docid"/>
+<xsl:param name="custom.css.source"/>
+<xsl:param name="default.float.class">
+ <xsl:choose>
+ <xsl:when test="contains($stylesheet.result.type,'html')">left</xsl:when>
+ <xsl:otherwise>before</xsl:otherwise>
+ </xsl:choose>
+</xsl:param>
+<xsl:param name="default.image.width"/>
+<xsl:param name="default.table.frame">all</xsl:param>
+<xsl:param name="default.table.width"/>
+<xsl:param name="docbook.css.link" select="1"/>
+<xsl:param name="docbook.css.source">docbook.css.xml</xsl:param>
+<xsl:param name="draft.mode">no</xsl:param>
+<xsl:param name="draft.watermark.image">images/draft.png</xsl:param>
+<xsl:param name="ebnf.assignment">
+<code>::=</code>
+</xsl:param>
+
+<xsl:param name="ebnf.statement.terminator"/>
+
+<xsl:param name="ebnf.table.bgcolor">#F5DCB3</xsl:param>
+<xsl:param name="ebnf.table.border" select="1"/>
+<xsl:param name="eclipse.autolabel" select="0"/>
+<xsl:param name="eclipse.plugin.id">com.example.help</xsl:param>
+<xsl:param name="eclipse.plugin.name">DocBook Online Help Sample</xsl:param>
+<xsl:param name="eclipse.plugin.provider">Example provider</xsl:param>
+<xsl:param name="editedby.enabled">1</xsl:param>
+<xsl:param name="email.delimiters.enabled" select="1"/>
+<xsl:param name="emphasis.propagates.style" select="1"/>
+<xsl:param name="entry.propagates.style" select="1"/>
+<xsl:param name="exsl.node.set.available">
+ <xsl:choose>
+ <xsl:when xmlns:exsl="http://exslt.org/common" exsl:foo="" test="function-available('exsl:node-set') or contains(system-property('xsl:vendor'), 'Apache Software Foundation')">1</xsl:when>
+ <xsl:otherwise>0</xsl:otherwise>
+ </xsl:choose>
+</xsl:param>
+<xsl:param name="firstterm.only.link" select="0"/>
+<xsl:param name="footer.rule" select="1"/>
+<xsl:param name="footnote.number.format">1</xsl:param>
+<xsl:param name="footnote.number.symbols"/>
+<xsl:param name="formal.procedures" select="1"/>
+<xsl:param name="formal.title.placement">
+figure before
+example before
+equation before
+table before
+procedure before
+task before
+</xsl:param>
+<xsl:param name="funcsynopsis.decoration" select="1"/>
+<xsl:param name="funcsynopsis.style">kr</xsl:param>
+<xsl:param name="function.parens" select="0"/>
+<xsl:param name="generate.css.header" select="0"/>
+<xsl:param name="generate.id.attributes" select="0"/>
+<xsl:param name="generate.index" select="1"/>
+<xsl:param name="generate.legalnotice.link" select="0"/>
+<xsl:param name="generate.manifest" select="0"/>
+<xsl:param name="generate.meta.abstract" select="1"/>
+<xsl:param name="generate.revhistory.link" select="0"/>
+<xsl:param name="generate.section.toc.level" select="0"/>
+<xsl:param name="generate.toc">
+appendix toc,title
+article/appendix nop
+article toc,title
+book toc,title,figure,table,example,equation
+chapter toc,title
+part toc,title
+preface toc,title
+qandadiv toc
+qandaset toc
+reference toc,title
+sect1 toc
+sect2 toc
+sect3 toc
+sect4 toc
+sect5 toc
+section toc
+set toc,title
+</xsl:param>
+
+<xsl:param name="glossary.collection"/>
+<xsl:param name="glossary.sort" select="0"/>
+<xsl:param name="glossentry.show.acronym">no</xsl:param>
+<xsl:param name="glossterm.auto.link" select="0"/>
+<xsl:param name="graphic.default.extension"/>
+<xsl:param name="graphicsize.extension" select="1"/>
+<xsl:param name="graphicsize.use.img.src.path" select="0"/>
+<xsl:param name="header.rule" select="1"/>
+<xsl:param name="highlight.default.language"/>
+<xsl:param name="highlight.source" select="0"/>
+<xsl:param name="highlight.xslthl.config"/>
+<xsl:param name="html.append"/>
+<xsl:param name="html.base"/>
+<xsl:param name="html.cellpadding"/>
+<xsl:param name="html.cellspacing"/>
+<xsl:param name="html.cleanup" select="1"/>
+<xsl:param name="html.ext">.html</xsl:param>
+<xsl:param name="html.extra.head.links" select="0"/>
+<xsl:param name="html.head.legalnotice.link.multiple" select="1"/>
+<xsl:param name="html.head.legalnotice.link.types">copyright</xsl:param>
+<xsl:param name="html.longdesc" select="1"/>
+<xsl:param name="html.longdesc.link" select="$html.longdesc"/>
+<xsl:param name="html.stylesheet"/>
+<xsl:param name="html.stylesheet.type">text/css</xsl:param>
+<xsl:param name="htmlhelp.alias.file">alias.h</xsl:param>
+<xsl:param name="htmlhelp.autolabel" select="0"/>
+<xsl:param name="htmlhelp.button.back" select="1"/>
+<xsl:param name="htmlhelp.button.forward" select="0"/>
+<xsl:param name="htmlhelp.button.hideshow" select="1"/>
+<xsl:param name="htmlhelp.button.home" select="0"/>
+<xsl:param name="htmlhelp.button.home.url"/>
+<xsl:param name="htmlhelp.button.jump1" select="0"/>
+<xsl:param name="htmlhelp.button.jump1.title">User1</xsl:param>
+<xsl:param name="htmlhelp.button.jump1.url"/>
+<xsl:param name="htmlhelp.button.jump2" select="0"/>
+<xsl:param name="htmlhelp.button.jump2.title">User2</xsl:param>
+<xsl:param name="htmlhelp.button.jump2.url"/>
+<xsl:param name="htmlhelp.button.locate" select="0"/>
+<xsl:param name="htmlhelp.button.next" select="1"/>
+<xsl:param name="htmlhelp.button.options" select="1"/>
+<xsl:param name="htmlhelp.button.prev" select="1"/>
+<xsl:param name="htmlhelp.button.print" select="1"/>
+<xsl:param name="htmlhelp.button.refresh" select="0"/>
+<xsl:param name="htmlhelp.button.stop" select="0"/>
+<xsl:param name="htmlhelp.button.zoom" select="0"/>
+<xsl:param name="htmlhelp.chm">htmlhelp.chm</xsl:param>
+<xsl:param name="htmlhelp.default.topic"/>
+<xsl:param name="htmlhelp.display.progress" select="1"/>
+<xsl:param name="htmlhelp.encoding">iso-8859-1</xsl:param>
+<xsl:param name="htmlhelp.enhanced.decompilation" select="0"/>
+<xsl:param name="htmlhelp.enumerate.images" select="0"/>
+<xsl:param name="htmlhelp.force.map.and.alias" select="0"/>
+<xsl:param name="htmlhelp.hhc.binary" select="1"/>
+<xsl:param name="htmlhelp.hhc.folders.instead.books" select="1"/>
+<xsl:param name="htmlhelp.hhc">toc.hhc</xsl:param>
+<xsl:param name="htmlhelp.hhc.section.depth">5</xsl:param>
+<xsl:param name="htmlhelp.hhc.show.root" select="1"/>
+<xsl:param name="htmlhelp.hhc.width"/>
+<xsl:param name="htmlhelp.hhk">index.hhk</xsl:param>
+<xsl:param name="htmlhelp.hhp">htmlhelp.hhp</xsl:param>
+<xsl:param name="htmlhelp.hhp.tail"/>
+<xsl:param name="htmlhelp.hhp.window">Main</xsl:param>
+<xsl:param name="htmlhelp.hhp.windows"/>
+<xsl:param name="htmlhelp.map.file">context.h</xsl:param>
+<xsl:param name="htmlhelp.only" select="0"/>
+<xsl:param name="htmlhelp.remember.window.position" select="0"/>
+<xsl:param name="htmlhelp.show.advanced.search" select="0"/>
+<xsl:param name="htmlhelp.show.favorities" select="0"/>
+<xsl:param name="htmlhelp.show.menu" select="0"/>
+<xsl:param name="htmlhelp.show.toolbar.text" select="1"/>
+<xsl:param name="htmlhelp.title"/>
+<xsl:param name="htmlhelp.use.hhk" select="0"/>
+<xsl:param name="htmlhelp.window.geometry"/>
+<xsl:param name="id.warnings" select="0"/>
+<xsl:param name="ignore.image.scaling" select="0"/>
+<xsl:param name="img.src.path"/>
+<xsl:param name="index.links.to.section" select="1"/>
+<xsl:param name="index.method">basic</xsl:param>
+<xsl:param name="index.number.separator"/>
+<xsl:param name="index.on.role" select="0"/>
+<xsl:param name="index.on.type" select="0"/>
+<xsl:param name="index.prefer.titleabbrev" select="0"/>
+<xsl:param name="index.range.separator"/>
+<xsl:param name="index.term.separator"/>
+<xsl:param name="inherit.keywords" select="1"/>
+<xsl:param name="insert.olink.page.number">no</xsl:param>
+<xsl:param name="insert.olink.pdf.frag" select="0"/>
+<xsl:param name="insert.xref.page.number">no</xsl:param>
+<xsl:param name="javahelp.encoding">iso-8859-1</xsl:param>
+<xsl:param name="keep.relative.image.uris" select="1"/>
+
+<xsl:param name="l10n.gentext.default.language">en</xsl:param>
+<xsl:param name="l10n.gentext.language"/>
+<xsl:param name="l10n.gentext.use.xref.language" select="0"/>
+<xsl:param name="l10n.lang.value.rfc.compliant" select="1"/>
+<xsl:param name="label.from.part" select="0"/>
+<xsl:param name="linenumbering.everyNth">5</xsl:param>
+<xsl:param name="linenumbering.extension" select="1"/>
+<xsl:param name="linenumbering.separator"><xsl:text> </xsl:text></xsl:param>
+<xsl:param name="linenumbering.width">3</xsl:param>
+<xsl:param name="link.mailto.url"/>
+<xsl:param name="make.clean.html" select="0"/>
+<xsl:param name="make.graphic.viewport" select="1"/>
+<xsl:param name="make.single.year.ranges" select="0"/>
+<xsl:param name="make.valid.html" select="1"/>
+<xsl:param name="make.year.ranges" select="0"/>
+ <xsl:param name="manifest">HTML.manifest</xsl:param>
+
+<xsl:param name="manifest.in.base.dir" select="0"/>
+<xsl:param name="manual.toc"/>
+<xsl:param name="menuchoice.menu.separator"> &#8594; </xsl:param>
+<xsl:param name="menuchoice.separator">+</xsl:param>
+<xsl:param name="navig.graphics.extension">.gif</xsl:param>
+<xsl:param name="navig.graphics" select="0"/>
+<xsl:param name="navig.graphics.path">images/</xsl:param>
+<xsl:param name="navig.showtitles">1</xsl:param>
+<xsl:param name="nominal.image.depth" select="4 * $pixels.per.inch"/>
+<xsl:param name="nominal.image.width" select="6 * $pixels.per.inch"/>
+<xsl:param name="nominal.table.width">6in</xsl:param>
+<xsl:param name="olink.base.uri"/>
+<xsl:param name="olink.debug" select="0"/>
+<xsl:param name="olink.doctitle">no</xsl:param>
+<xsl:param name="olink.fragid">fragid=</xsl:param>
+<xsl:param name="olink.lang.fallback.sequence"/>
+<xsl:param name="olink.outline.ext">.olink</xsl:param>
+<xsl:attribute-set name="olink.properties">
+ <xsl:attribute name="show-destination">replace</xsl:attribute>
+</xsl:attribute-set>
+<xsl:param name="olink.pubid">pubid</xsl:param>
+ <xsl:param name="olink.resolver">/cgi-bin/olink</xsl:param>
+<xsl:param name="olink.sysid">sysid</xsl:param>
+<xsl:param name="othercredit.like.author.enabled">0</xsl:param>
+<xsl:param name="para.propagates.style" select="1"/>
+<xsl:param name="part.autolabel">I</xsl:param>
+<xsl:param name="phrase.propagates.style" select="1"/>
+<xsl:param name="pixels.per.inch">90</xsl:param>
+<xsl:param name="points.per.em">10</xsl:param>
+<xsl:param name="preface.autolabel" select="0"/>
+<xsl:param name="prefer.internal.olink" select="0"/>
+<xsl:param name="preferred.mediaobject.role"/>
+<xsl:param name="process.empty.source.toc" select="0"/>
+<xsl:param name="process.source.toc" select="0"/>
+<xsl:param name="profile.arch"/>
+<xsl:param name="profile.attribute"/>
+<xsl:param name="profile.audience"/>
+<xsl:param name="profile.condition"/>
+<xsl:param name="profile.conformance"/>
+<xsl:param name="profile.lang"/>
+<xsl:param name="profile.os"/>
+<xsl:param name="profile.revision"/>
+<xsl:param name="profile.revisionflag"/>
+<xsl:param name="profile.role"/>
+<xsl:param name="profile.security"/>
+<xsl:param name="profile.separator">;</xsl:param>
+<xsl:param name="profile.status"/>
+<xsl:param name="profile.userlevel"/>
+<xsl:param name="profile.value"/>
+<xsl:param name="profile.vendor"/>
+<xsl:param name="profile.wordsize"/>
+<xsl:param name="punct.honorific">.</xsl:param>
+<xsl:param name="qanda.defaultlabel">number</xsl:param>
+<xsl:param name="qanda.in.toc" select="0"/>
+<xsl:param name="qanda.inherit.numeration" select="1"/>
+<xsl:param name="qanda.nested.in.toc" select="0"/>
+<xsl:param name="qandadiv.autolabel" select="1"/>
+<xsl:param name="refclass.suppress" select="0"/>
+<xsl:param name="refentry.generate.name" select="1"/>
+<xsl:param name="refentry.generate.title" select="0"/>
+<xsl:param name="refentry.separator" select="1"/>
+<xsl:param name="refentry.xref.manvolnum" select="1"/>
+ <xsl:param name="reference.autolabel">I</xsl:param>
+<xsl:param name="root.filename">index</xsl:param>
+<xsl:param name="rootid"/>
+<xsl:param name="runinhead.default.title.end.punct">.</xsl:param>
+<xsl:param name="runinhead.title.end.punct">.!?:</xsl:param>
+<xsl:param name="section.autolabel" select="0"/>
+<xsl:param name="section.autolabel.max.depth">8</xsl:param>
+<xsl:param name="section.label.includes.component.label" select="0"/>
+<xsl:param name="segmentedlist.as.table" select="0"/>
+<xsl:param name="shade.verbatim" select="0"/>
+<xsl:attribute-set name="shade.verbatim.style">
+ <xsl:attribute name="border">0</xsl:attribute>
+ <xsl:attribute name="bgcolor">#E0E0E0</xsl:attribute>
+</xsl:attribute-set>
+
+<xsl:param name="show.comments" select="1"/>
+<xsl:param name="show.revisionflag" select="0"/>
+<xsl:param name="simplesect.in.toc" select="0"/>
+<xsl:param name="spacing.paras" select="0"/>
+<xsl:param name="suppress.footer.navigation">0</xsl:param>
+<xsl:param name="suppress.header.navigation" select="0"/>
+<xsl:param name="suppress.navigation" select="0"/>
+<xsl:param name="table.borders.with.css" select="0"/>
+<xsl:param name="table.cell.border.color"/>
+
+<xsl:param name="table.cell.border.style">solid</xsl:param>
+<xsl:param name="table.cell.border.thickness">0.5pt</xsl:param>
+<xsl:param name="table.footnote.number.format">a</xsl:param>
+<xsl:param name="table.footnote.number.symbols"/>
+<xsl:param name="table.frame.border.color"/>
+
+<xsl:param name="table.frame.border.style">solid</xsl:param>
+<xsl:param name="table.frame.border.thickness">0.5pt</xsl:param>
+<xsl:param name="tablecolumns.extension" select="1"/>
+ <xsl:param name="target.database.document">olinkdb.xml</xsl:param>
+<xsl:param name="targets.filename">target.db</xsl:param>
+<xsl:param name="tex.math.delims" select="1"/>
+<xsl:param name="tex.math.file">tex-math-equations.tex</xsl:param>
+<xsl:param name="tex.math.in.alt"/>
+<xsl:param name="textdata.default.encoding"/>
+ <xsl:param name="textinsert.extension" select="1"/>
+<xsl:param name="toc.list.type">dl</xsl:param>
+<xsl:param name="toc.max.depth">8</xsl:param>
+<xsl:param name="toc.section.depth">2</xsl:param>
+<xsl:param name="ulink.target">_top</xsl:param>
+<xsl:param name="use.embed.for.svg" select="0"/>
+<xsl:param name="use.extensions" select="0"/>
+<xsl:param name="use.id.as.filename" select="0"/>
+<xsl:param name="use.local.olink.style" select="0"/>
+<xsl:param name="use.role.as.xrefstyle" select="1"/>
+<xsl:param name="use.role.for.mediaobject" select="1"/>
+<xsl:param name="use.svg" select="1"/>
+<xsl:param name="variablelist.as.table" select="0"/>
+<xsl:param name="variablelist.term.break.after">0</xsl:param>
+<xsl:param name="variablelist.term.separator">, </xsl:param>
+<xsl:param name="writing.mode">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key">writing-mode</xsl:with-param>
+ <xsl:with-param name="lang">
+ <xsl:call-template name="l10n.language">
+ <xsl:with-param name="target" select="/*[1]"/>
+ </xsl:call-template>
+ </xsl:with-param>
+ </xsl:call-template>
+</xsl:param>
+<xsl:param name="xref.label-page.separator"><xsl:text> </xsl:text></xsl:param>
+<xsl:param name="xref.label-title.separator">: </xsl:param>
+<xsl:param name="xref.title-page.separator"><xsl:text> </xsl:text></xsl:param>
+<xsl:param name="xref.with.number.and.title" select="1"/>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/pi.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/pi.xsl
new file mode 100644
index 0000000..28f9efe
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/pi.xsl
@@ -0,0 +1,1203 @@
+<?xml version="1.0" encoding="ASCII"?>
+<!--This file was created automatically by html2xhtml-->
+<!--from the HTML stylesheets.-->
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:doc="http://nwalsh.com/xsl/documentation/1.0" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/1999/xhtml" exclude-result-prefixes="doc" version="1.0">
+
+<!-- ********************************************************************
+ $Id: pi.xsl 8394 2009-04-02 20:31:30Z mzjn $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<doc:reference xmlns=""><info xmlns="http://www.w3.org/1999/xhtml"><title>HTML Processing Instruction Reference</title>
+ <releaseinfo role="meta">
+ $Id: pi.xsl 8394 2009-04-02 20:31:30Z mzjn $
+ </releaseinfo>
+ </info>
+ <partintro xmlns="http://www.w3.org/1999/xhtml" xml:id="partintro">
+ <title>Introduction</title>
+ <para>This is generated reference documentation for all
+ user-specifiable processing instructions (PIs) in the DocBook
+ XSL stylesheets for HTML output.
+ <note>
+ <para>You add these PIs at particular points in a document to
+ cause specific &#8220;exceptions&#8221; to formatting/output behavior. To
+ make global changes in formatting/output behavior across an
+ entire document, it&#8217;s better to do it by setting an
+ appropriate stylesheet parameter (if there is one).</para>
+ </note>
+ </para>
+ </partintro>
+</doc:reference>
+
+<!-- ==================================================================== -->
+
+<doc:pi xmlns="" name="dbhtml_background-color">
+ <refpurpose xmlns="http://www.w3.org/1999/xhtml">Sets background color for an image</refpurpose>
+ <refdescription xmlns="http://www.w3.org/1999/xhtml">
+ <para>Use the <tag class="xmlpi">dbhtml background-color</tag> PI before or
+ after an image (<tag>graphic</tag>, <tag>inlinegraphic</tag>,
+ <tag>imagedata</tag>, or <tag>videodata</tag> element) as a
+ sibling to the element, to set a background color for the
+ image.</para>
+ </refdescription>
+ <refsynopsisdiv xmlns="http://www.w3.org/1999/xhtml">
+ <synopsis><tag class="xmlpi">dbhtml background-color="<replaceable>color</replaceable>"</tag></synopsis>
+ </refsynopsisdiv>
+ <refparameter xmlns="http://www.w3.org/1999/xhtml">
+ <variablelist>
+ <varlistentry><term>background-color="<replaceable>color</replaceable>"</term>
+ <listitem>
+ <para>An HTML color value</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+ <refsee xmlns="http://www.w3.org/1999/xhtml" role="tcg">
+ <para><link role="tcg" xlink:href="BGcolor.html">Background color</link></para>
+ </refsee>
+</doc:pi>
+<xsl:template name="pi.dbhtml_background-color">
+ <xsl:param name="node" select="."/>
+ <xsl:call-template name="dbhtml-attribute">
+ <xsl:with-param name="pis" select="$node/processing-instruction('dbhtml')"/>
+ <xsl:with-param name="attribute" select="'background-color'"/>
+ </xsl:call-template>
+</xsl:template>
+
+<doc:pi xmlns="" name="dbhtml_bgcolor">
+ <refpurpose xmlns="http://www.w3.org/1999/xhtml">Sets background color on a CALS table row or table cell</refpurpose>
+ <refdescription xmlns="http://www.w3.org/1999/xhtml">
+ <para>Use the <tag class="xmlpi">dbhtml bgcolor</tag> PI as child of a CALS table row
+ or cell to set a background color for that table row or cell.</para>
+ </refdescription>
+ <refsynopsisdiv xmlns="http://www.w3.org/1999/xhtml">
+ <synopsis><tag class="xmlpi">dbhtml bgcolor="<replaceable>color</replaceable>"</tag></synopsis>
+ </refsynopsisdiv>
+ <refparameter xmlns="http://www.w3.org/1999/xhtml">
+ <variablelist>
+ <varlistentry><term>bgcolor="<replaceable>color</replaceable>"</term>
+ <listitem>
+ <para>An HTML color value</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+ <refsee xmlns="http://www.w3.org/1999/xhtml" role="tcg">
+ <para><link role="tcg" xlink:href="BGtableColor.html#CellBGColor">Cell background color</link></para>
+ </refsee>
+</doc:pi>
+<xsl:template name="pi.dbhtml_bgcolor">
+ <xsl:param name="node" select="."/>
+ <xsl:call-template name="dbhtml-attribute">
+ <xsl:with-param name="pis" select="$node/processing-instruction('dbhtml')"/>
+ <xsl:with-param name="attribute" select="'bgcolor'"/>
+ </xsl:call-template>
+</xsl:template>
+
+<doc:pi xmlns="" name="dbhtml_cellpadding">
+ <refpurpose xmlns="http://www.w3.org/1999/xhtml">Specifies cellpadding in CALS table or qandaset output</refpurpose>
+ <refdescription xmlns="http://www.w3.org/1999/xhtml">
+ <para>Use the <tag class="xmlpi">dbhtml cellpadding</tag> PI as a child of a
+ CALS <tag>table</tag> or <tag>qandaset</tag> to specify the value
+ for the HTML <literal>cellpadding</literal> attribute in the
+ output HTML table.</para>
+ </refdescription>
+ <refsynopsisdiv xmlns="http://www.w3.org/1999/xhtml">
+ <synopsis><tag class="xmlpi">dbhtml cellpadding="<replaceable>number</replaceable>"</tag></synopsis>
+ </refsynopsisdiv>
+ <refparameter xmlns="http://www.w3.org/1999/xhtml">
+ <variablelist>
+ <varlistentry><term>cellpadding="<replaceable>number</replaceable>"</term>
+ <listitem>
+ <para>Specifies the cellpadding</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+ <refsee xmlns="http://www.w3.org/1999/xhtml" role="params">
+ <para><parameter>html.cellpadding</parameter></para>
+ </refsee>
+ <refsee xmlns="http://www.w3.org/1999/xhtml" role="tcg">
+ <para><link role="tcg" xlink:href="CellSpacing.html">Cell spacing and cell padding</link>,
+ <link role="tcg" xlink:href="QandAformat.html">Q and A formatting</link></para>
+ </refsee>
+</doc:pi>
+<xsl:template name="pi.dbhtml_cellpadding">
+ <xsl:param name="node" select="."/>
+ <xsl:call-template name="dbhtml-attribute">
+ <xsl:with-param name="pis" select="$node/processing-instruction('dbhtml')"/>
+ <xsl:with-param name="attribute" select="'cellpadding'"/>
+ </xsl:call-template>
+</xsl:template>
+
+<doc:pi xmlns="" name="dbhtml_cellspacing">
+ <refpurpose xmlns="http://www.w3.org/1999/xhtml">Specifies cellspacing in CALS table or qandaset output</refpurpose>
+ <refdescription xmlns="http://www.w3.org/1999/xhtml">
+ <para>Use the <tag class="xmlpi">dbhtml cellspacing</tag> PI as a child of a
+ CALS <tag>table</tag> or <tag>qandaset</tag> to specify the value
+ for the HTML <literal>cellspacing</literal> attribute in the
+ output HTML table.</para>
+ </refdescription>
+ <refsynopsisdiv xmlns="http://www.w3.org/1999/xhtml">
+ <synopsis><tag class="xmlpi">dbhtml cellspacing="<replaceable>number</replaceable>"</tag></synopsis>
+ </refsynopsisdiv>
+ <refparameter xmlns="http://www.w3.org/1999/xhtml">
+ <variablelist>
+ <varlistentry><term>cellspacing="<replaceable>number</replaceable>"</term>
+ <listitem>
+ <para>Specifies the cellspacing</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+ <refsee xmlns="http://www.w3.org/1999/xhtml" role="params">
+ <para><parameter>html.cellspacing</parameter></para>
+ </refsee>
+ <refsee xmlns="http://www.w3.org/1999/xhtml" role="tcg">
+ <para><link role="tcg" xlink:href="CellSpacing.html">Cell spacing and cell padding</link>,
+ <link role="tcg" xlink:href="QandAformat.html">Q and A formatting</link></para>
+ </refsee>
+</doc:pi>
+<xsl:template name="pi.dbhtml_cellspacing">
+ <xsl:param name="node" select="."/>
+ <xsl:call-template name="dbhtml-attribute">
+ <xsl:with-param name="pis" select="$node/processing-instruction('dbhtml')"/>
+ <xsl:with-param name="attribute" select="'cellspacing'"/>
+ </xsl:call-template>
+</xsl:template>
+
+<doc:pi xmlns="" name="dbhtml_class">
+ <refpurpose xmlns="http://www.w3.org/1999/xhtml">Set value of the class attribute for a CALS table row</refpurpose>
+ <refdescription xmlns="http://www.w3.org/1999/xhtml">
+ <para>Use the <tag class="xmlpi">dbhtml class</tag> PI as a child of a
+ <tag>row</tag> to specify a <literal>class</literal>
+ attribute and value in the HTML output for that row.</para>
+ </refdescription>
+ <refsynopsisdiv xmlns="http://www.w3.org/1999/xhtml">
+ <synopsis><tag class="xmlpi">dbhtml class="<replaceable>name</replaceable>"</tag></synopsis>
+ </refsynopsisdiv>
+ <refparameter xmlns="http://www.w3.org/1999/xhtml">
+ <variablelist>
+ <varlistentry><term>class="<replaceable>name</replaceable>"</term>
+ <listitem>
+ <para>Specifies the class name</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+ <refsee xmlns="http://www.w3.org/1999/xhtml" role="tcg">
+ <para><link role="tcg" xlink:href="CSSTableCells.html">Table styles in HTML output</link></para>
+ </refsee>
+</doc:pi>
+<xsl:template name="pi.dbhtml_class">
+ <xsl:param name="node" select="."/>
+ <xsl:call-template name="dbhtml-attribute">
+ <xsl:with-param name="pis" select="$node/processing-instruction('dbhtml')"/>
+ <xsl:with-param name="attribute" select="'class'"/>
+ </xsl:call-template>
+</xsl:template>
+
+<doc:pi xmlns="" name="dbhtml_dir">
+ <refpurpose xmlns="http://www.w3.org/1999/xhtml">Specifies a directory name in which to write files</refpurpose>
+ <refdescription xmlns="http://www.w3.org/1999/xhtml">
+ <para>When chunking output, use the <tag class="xmlpi">dbhtml dir</tag> PI
+ as a child of a chunk source to cause the output of that
+ chunk to be written to the specified directory; also, use it
+ as a child of a <tag>mediaobject</tag> to specify a
+ directory into which any long-description files for that
+ <tag>mediaobject</tag> will be written.</para>
+ </refdescription>
+ <refsynopsisdiv xmlns="http://www.w3.org/1999/xhtml">
+ <synopsis><tag class="xmlpi">dbhtml dir="<replaceable>path</replaceable>"</tag></synopsis>
+ </refsynopsisdiv>
+ <refparameter xmlns="http://www.w3.org/1999/xhtml">
+ <variablelist>
+ <varlistentry><term>dir="<replaceable>path</replaceable>"</term>
+ <listitem>
+ <para>Specifies the pathname for the directory</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+ <refsee xmlns="http://www.w3.org/1999/xhtml" role="params">
+ <para><parameter>base.dir</parameter></para>
+ </refsee>
+ <refsee xmlns="http://www.w3.org/1999/xhtml" role="tcg">
+ <para><link role="tcg" xlink:href="Chunking.html#dbhtmlDirPI">dbhtml dir processing instruction</link></para>
+ </refsee>
+</doc:pi>
+<xsl:template name="pi.dbhtml_dir">
+ <xsl:param name="node" select="."/>
+ <xsl:call-template name="dbhtml-attribute">
+ <xsl:with-param name="pis" select="$node/processing-instruction('dbhtml')"/>
+ <xsl:with-param name="attribute" select="'dir'"/>
+ </xsl:call-template>
+</xsl:template>
+
+<doc:pi xmlns="" name="dbhtml_filename">
+ <refpurpose xmlns="http://www.w3.org/1999/xhtml">Specifies a filename for a chunk</refpurpose>
+ <refdescription xmlns="http://www.w3.org/1999/xhtml">
+ <para>When chunking output, use the <tag class="xmlpi">dbhtml filename</tag>
+ PI as a child of a chunk source to specify a filename for
+ the output file for that chunk.</para>
+ </refdescription>
+ <refsynopsisdiv xmlns="http://www.w3.org/1999/xhtml">
+ <synopsis><tag class="xmlpi">dbhtml filename="<replaceable>filename</replaceable>"</tag></synopsis>
+ </refsynopsisdiv>
+ <refparameter xmlns="http://www.w3.org/1999/xhtml">
+ <variablelist>
+ <varlistentry><term>filename="<replaceable>path</replaceable>"</term>
+ <listitem>
+ <para>Specifies the filename for the file</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+ <refsee xmlns="http://www.w3.org/1999/xhtml" role="params">
+ <para><parameter>use.id.as.filename</parameter></para>
+ </refsee>
+ <refsee xmlns="http://www.w3.org/1999/xhtml" role="tcg">
+ <para><link role="tcg" xlink:href="Chunking.html#DbhtmlFilenames">dbhtml filenames</link></para>
+ </refsee>
+</doc:pi>
+<xsl:template name="pi.dbhtml_filename">
+ <xsl:param name="node" select="."/>
+ <xsl:call-template name="dbhtml-attribute">
+ <xsl:with-param name="pis" select="$node/processing-instruction('dbhtml')"/>
+ <xsl:with-param name="attribute" select="'filename'"/>
+ </xsl:call-template>
+</xsl:template>
+
+<doc:pi xmlns="" name="dbhtml_funcsynopsis-style">
+ <refpurpose xmlns="http://www.w3.org/1999/xhtml">Specifies presentation style for a funcsynopsis</refpurpose>
+ <refdescription xmlns="http://www.w3.org/1999/xhtml">
+ <para>Use the <tag class="xmlpi">dbhtml funcsynopsis-style</tag> PI as a child of
+ a <tag>funcsynopsis</tag> or anywhere within a funcsynopsis
+ to control the presentation style for output of all
+ <tag>funcprototype</tag> instances within that funcsynopsis.</para>
+ </refdescription>
+ <refsynopsisdiv xmlns="http://www.w3.org/1999/xhtml">
+ <synopsis><tag class="xmlpi">dbhtml funcsynopsis-style="kr"|"ansi"</tag></synopsis>
+ </refsynopsisdiv>
+ <refparameter xmlns="http://www.w3.org/1999/xhtml">
+ <variablelist>
+ <varlistentry><term>funcsynopsis-style="kr"</term>
+ <listitem>
+ <para>Displays <tag>funcprototype</tag> output in K&amp;R style</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry><term>funcsynopsis-style="ansi"</term>
+ <listitem>
+ <para>Displays <tag>funcprototype</tag> output in ANSI style</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+ <refsee xmlns="http://www.w3.org/1999/xhtml" role="params">
+ <para><parameter>funcsynopsis.style</parameter></para>
+ </refsee>
+</doc:pi>
+<xsl:template name="pi.dbhtml_funcsynopsis-style">
+ <xsl:param name="node" select="."/>
+ <xsl:call-template name="dbhtml-attribute">
+ <xsl:with-param name="pis" select="$node/processing-instruction('dbhtml')"/>
+ <xsl:with-param name="attribute" select="'funcsynopsis-style'"/>
+ </xsl:call-template>
+</xsl:template>
+
+<doc:pi xmlns="" name="dbhtml_img.src.path">
+ <refpurpose xmlns="http://www.w3.org/1999/xhtml">Specifies a path to the location of an image file</refpurpose>
+ <refdescription xmlns="http://www.w3.org/1999/xhtml">
+ <para>Use the <tag class="xmlpi">dbhtml img.src.path</tag> PI before or
+ after an image (<tag>graphic</tag>,
+ <tag>inlinegraphic</tag>, <tag>imagedata</tag>, or
+ <tag>videodata</tag> element) as a sibling to the element,
+ to specify a path to the location of the image; in HTML
+ output, the value specified for the
+ <code>img.src.path</code> attribute is prepended to the
+ filename.</para>
+ </refdescription>
+ <refsynopsisdiv xmlns="http://www.w3.org/1999/xhtml">
+ <synopsis><tag class="xmlpi">dbhtml img.src.path="<replaceable>path</replaceable>"</tag></synopsis>
+ </refsynopsisdiv>
+ <refparameter xmlns="http://www.w3.org/1999/xhtml">
+ <variablelist>
+ <varlistentry><term>img.src.path="<replaceable>path</replaceable>"</term>
+ <listitem>
+ <para>Specifies the pathname to prepend to the name of the image file</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+ <refsee xmlns="http://www.w3.org/1999/xhtml" role="params">
+ <para><parameter>img.src.path</parameter></para>
+ </refsee>
+ <refsee xmlns="http://www.w3.org/1999/xhtml" role="tcg">
+ <para><link role="tcg" xlink:href="GraphicsLocations.html#UsingFileref">Using fileref</link></para>
+ </refsee>
+</doc:pi>
+<xsl:template name="pi.dbhtml_img.src.path">
+ <xsl:param name="node" select="."/>
+ <xsl:call-template name="dbhtml-attribute">
+ <xsl:with-param name="pis" select="$node/processing-instruction('dbhtml')"/>
+ <xsl:with-param name="attribute" select="'img.src.path'"/>
+ </xsl:call-template>
+</xsl:template>
+
+<doc:pi xmlns="" name="dbhtml_label-width">
+ <refpurpose xmlns="http://www.w3.org/1999/xhtml">Specifies the label width for a qandaset</refpurpose>
+ <refdescription xmlns="http://www.w3.org/1999/xhtml">
+ <para>Use the <tag class="xmlpi">dbhtml label-width</tag> PI as a child of a
+ <tag>qandaset</tag> to specify the width of labels.</para>
+ </refdescription>
+ <refsynopsisdiv xmlns="http://www.w3.org/1999/xhtml">
+ <synopsis><tag class="xmlpi">dbhtml label-width="<replaceable>width</replaceable>"</tag></synopsis>
+ </refsynopsisdiv>
+ <refparameter xmlns="http://www.w3.org/1999/xhtml">
+ <variablelist>
+ <varlistentry><term>label-width="<replaceable>width</replaceable>"</term>
+ <listitem>
+ <para>Specifies the label width (including units)</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+ <refsee xmlns="http://www.w3.org/1999/xhtml" role="tcg">
+ <para><link role="tcg" xlink:href="QandAformat.html">Q and A formatting</link></para>
+ </refsee>
+</doc:pi>
+<xsl:template name="pi.dbhtml_label-width">
+ <xsl:param name="node" select="."/>
+ <xsl:call-template name="dbhtml-attribute">
+ <xsl:with-param name="pis" select="$node/processing-instruction('dbhtml')"/>
+ <xsl:with-param name="attribute" select="'label-width'"/>
+ </xsl:call-template>
+</xsl:template>
+
+<doc:pi xmlns="" name="dbhtml_linenumbering.everyNth">
+ <refpurpose xmlns="http://www.w3.org/1999/xhtml">Specifies interval for line numbers in verbatims</refpurpose>
+ <refdescription xmlns="http://www.w3.org/1999/xhtml">
+ <para>Use the <tag class="xmlpi">dbhtml linenumbering.everyNth</tag> PI as a child
+ of a &#8220;verbatim&#8221; element &#8211; <tag>programlisting</tag>,
+ <tag>screen</tag>, <tag>synopsis</tag> &#8212; to specify
+ the interval at which lines are numbered.</para>
+ </refdescription>
+ <refsynopsisdiv xmlns="http://www.w3.org/1999/xhtml">
+ <synopsis><tag class="xmlpi">dbhtml linenumbering.everyNth="<replaceable>N</replaceable>"</tag></synopsis>
+ </refsynopsisdiv>
+ <refparameter xmlns="http://www.w3.org/1999/xhtml">
+ <variablelist>
+ <varlistentry><term>linenumbering.everyNth="<replaceable>N</replaceable>"</term>
+ <listitem>
+ <para>Specifies numbering interval; a number is output
+ before every <replaceable>N</replaceable>th line</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+ <refsee xmlns="http://www.w3.org/1999/xhtml" role="params">
+ <para><parameter>linenumbering.everyNth</parameter></para>
+ </refsee>
+ <refsee xmlns="http://www.w3.org/1999/xhtml" role="tcg">
+ <para><link role="tcg" xlink:href="AnnotateListing.html#LineNumbering">Line numbering</link></para>
+ </refsee>
+</doc:pi>
+<xsl:template name="pi.dbhtml_linenumbering.everyNth">
+ <xsl:param name="node" select="."/>
+ <xsl:call-template name="dbhtml-attribute">
+ <xsl:with-param name="pis" select="$node/processing-instruction('dbhtml')"/>
+ <xsl:with-param name="attribute" select="'linenumbering.everyNth'"/>
+ </xsl:call-template>
+</xsl:template>
+
+<doc:pi xmlns="" name="dbhtml_linenumbering.separator">
+ <refpurpose xmlns="http://www.w3.org/1999/xhtml">Specifies separator text for line numbers in verbatims</refpurpose>
+ <refdescription xmlns="http://www.w3.org/1999/xhtml">
+ <para>Use the <tag class="xmlpi">dbhtml linenumbering.separator</tag> PI as a child
+ of a &#8220;verbatim&#8221; element &#8211; <tag>programlisting</tag>,
+ <tag>screen</tag>, <tag>synopsis</tag> &#8212; to specify
+ the separator text output between the line numbers and content.</para>
+ </refdescription>
+ <refsynopsisdiv xmlns="http://www.w3.org/1999/xhtml">
+ <synopsis><tag class="xmlpi">dbhtml linenumbering.separator="<replaceable>text</replaceable>"</tag></synopsis>
+ </refsynopsisdiv>
+ <refparameter xmlns="http://www.w3.org/1999/xhtml">
+ <variablelist>
+ <varlistentry><term>linenumbering.separator="<replaceable>text</replaceable>"</term>
+ <listitem>
+ <para>Specifies the text (zero or more characters)</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+ <refsee xmlns="http://www.w3.org/1999/xhtml" role="params">
+ <para><parameter>linenumbering.separator</parameter></para>
+ </refsee>
+ <refsee xmlns="http://www.w3.org/1999/xhtml" role="tcg">
+ <para><link role="tcg" xlink:href="AnnotateListing.html#LineNumbering">Line numbering</link></para>
+ </refsee>
+</doc:pi>
+<xsl:template name="pi.dbhtml_linenumbering.separator">
+ <xsl:param name="node" select="."/>
+ <xsl:call-template name="dbhtml-attribute">
+ <xsl:with-param name="pis" select="$node/processing-instruction('dbhtml')"/>
+ <xsl:with-param name="attribute" select="'linenumbering.separator'"/>
+ </xsl:call-template>
+</xsl:template>
+
+<doc:pi xmlns="" name="dbhtml_linenumbering.width">
+ <refpurpose xmlns="http://www.w3.org/1999/xhtml">Specifies width for line numbers in verbatims</refpurpose>
+ <refdescription xmlns="http://www.w3.org/1999/xhtml">
+ <para>Use the <tag class="xmlpi">dbhtml linenumbering.width</tag> PI as a child
+ of a &#8220;verbatim&#8221; element &#8211; <tag>programlisting</tag>,
+ <tag>screen</tag>, <tag>synopsis</tag> &#8212; to specify
+ the width set aside for line numbers.</para>
+ </refdescription>
+ <refsynopsisdiv xmlns="http://www.w3.org/1999/xhtml">
+ <synopsis><tag class="xmlpi">dbhtml linenumbering.width="<replaceable>width</replaceable>"</tag></synopsis>
+ </refsynopsisdiv>
+ <refparameter xmlns="http://www.w3.org/1999/xhtml">
+ <variablelist>
+ <varlistentry><term>linenumbering.width="<replaceable>width</replaceable>"</term>
+ <listitem>
+ <para>Specifies the width (inluding units)</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+ <refsee xmlns="http://www.w3.org/1999/xhtml" role="params">
+ <para><parameter>linenumbering.width</parameter></para>
+ </refsee>
+ <refsee xmlns="http://www.w3.org/1999/xhtml" role="tcg">
+ <para><link role="tcg" xlink:href="AnnotateListing.html#LineNumbering">Line numbering</link></para>
+ </refsee>
+</doc:pi>
+<xsl:template name="pi.dbhtml_linenumbering.width">
+ <xsl:param name="node" select="."/>
+ <xsl:call-template name="dbhtml-attribute">
+ <xsl:with-param name="pis" select="$node/processing-instruction('dbhtml')"/>
+ <xsl:with-param name="attribute" select="'linenumbering.width'"/>
+ </xsl:call-template>
+</xsl:template>
+
+<doc:pi xmlns="" name="dbhtml_list-presentation">
+ <refpurpose xmlns="http://www.w3.org/1999/xhtml">Specifies presentation style for a variablelist or
+ segmentedlist</refpurpose>
+ <refdescription xmlns="http://www.w3.org/1999/xhtml">
+ <para>Use the <tag class="xmlpi">dbhtml list-presentation</tag> PI as a child of
+ a <tag>variablelist</tag> or <tag>segmentedlist</tag> to
+ control the presentation style for the list (to cause it, for
+ example, to be displayed as a table).</para>
+ </refdescription>
+ <refsynopsisdiv xmlns="http://www.w3.org/1999/xhtml">
+ <synopsis><tag class="xmlpi">dbhtml list-presentation="list"|"table"</tag></synopsis>
+ </refsynopsisdiv>
+ <refparameter xmlns="http://www.w3.org/1999/xhtml">
+ <variablelist>
+ <varlistentry><term>list-presentation="list"</term>
+ <listitem>
+ <para>Displays the list as a list</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry><term>list-presentation="table"</term>
+ <listitem>
+ <para>Displays the list as a table</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+ <refsee xmlns="http://www.w3.org/1999/xhtml" role="params">
+ <itemizedlist>
+ <listitem>
+ <para><parameter>variablelist.as.table</parameter></para>
+ </listitem>
+ <listitem>
+ <para><parameter>segmentedlist.as.table</parameter></para>
+ </listitem>
+ </itemizedlist>
+ </refsee>
+ <refsee xmlns="http://www.w3.org/1999/xhtml" role="tcg">
+ <para><link role="tcg" xlink:href="Variablelists.html#VarListFormatting">Variable list formatting in HTML</link></para>
+ </refsee>
+</doc:pi>
+<xsl:template name="pi.dbhtml_list-presentation">
+ <xsl:param name="node" select="."/>
+ <xsl:call-template name="dbhtml-attribute">
+ <xsl:with-param name="pis" select="$node/processing-instruction('dbhtml')"/>
+ <xsl:with-param name="attribute" select="'list-presentation'"/>
+ </xsl:call-template>
+</xsl:template>
+
+<doc:pi xmlns="" name="dbhtml_list-width">
+ <refpurpose xmlns="http://www.w3.org/1999/xhtml">Specifies the width of a variablelist or simplelist</refpurpose>
+ <refdescription xmlns="http://www.w3.org/1999/xhtml">
+ <para>Use the <tag class="xmlpi">dbhtml list-width</tag> PI as a child of a
+ <tag>variablelist</tag> or a <tag>simplelist</tag> presented
+ as a table, to specify the output width.</para>
+ </refdescription>
+ <refsynopsisdiv xmlns="http://www.w3.org/1999/xhtml">
+ <synopsis><tag class="xmlpi">dbhtml list-width="<replaceable>width</replaceable>"</tag></synopsis>
+ </refsynopsisdiv>
+ <refparameter xmlns="http://www.w3.org/1999/xhtml">
+ <variablelist>
+ <varlistentry><term>list-width="<replaceable>width</replaceable>"</term>
+ <listitem>
+ <para>Specifies the output width (including units)</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+ <refsee xmlns="http://www.w3.org/1999/xhtml" role="tcg">
+ <para><link role="tcg" xlink:href="Variablelists.html#VarListFormatting">Variable list formatting in HTML</link></para>
+ </refsee>
+</doc:pi>
+<xsl:template name="pi.dbhtml_list-width">
+ <xsl:param name="node" select="."/>
+ <xsl:call-template name="dbhtml-attribute">
+ <xsl:with-param name="pis" select="$node/processing-instruction('dbhtml')"/>
+ <xsl:with-param name="attribute" select="'list-width'"/>
+ </xsl:call-template>
+</xsl:template>
+
+<doc:pi xmlns="" name="dbhtml_row-height">
+ <refpurpose xmlns="http://www.w3.org/1999/xhtml">Specifies the height for a CALS table row</refpurpose>
+ <refdescription xmlns="http://www.w3.org/1999/xhtml">
+ <para>Use the <tag class="xmlpi">dbhtml row-height</tag> PI as a child of a
+ <tag>row</tag> to specify the height of the row.</para>
+ </refdescription>
+ <refsynopsisdiv xmlns="http://www.w3.org/1999/xhtml">
+ <synopsis><tag class="xmlpi">dbhtml row-height="<replaceable>height</replaceable>"</tag></synopsis>
+ </refsynopsisdiv>
+ <refparameter xmlns="http://www.w3.org/1999/xhtml">
+ <variablelist>
+ <varlistentry><term>row-height="<replaceable>height</replaceable>"</term>
+ <listitem>
+ <para>Specifies the row height (including units)</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+ <refsee xmlns="http://www.w3.org/1999/xhtml" role="tcg">
+ <para><link role="tcg" xlink:href="RowHeight.html">Row height</link></para>
+ </refsee>
+</doc:pi>
+<xsl:template name="pi.dbhtml_row-height">
+ <xsl:param name="node" select="."/>
+ <xsl:call-template name="dbhtml-attribute">
+ <xsl:with-param name="pis" select="$node/processing-instruction('dbhtml')"/>
+ <xsl:with-param name="attribute" select="'row-height'"/>
+ </xsl:call-template>
+</xsl:template>
+
+<doc:pi xmlns="" name="dbhtml_start">
+ <refpurpose xmlns="http://www.w3.org/1999/xhtml">(obsolete) Sets the starting number on an ordered list</refpurpose>
+ <refdescription xmlns="http://www.w3.org/1999/xhtml">
+ <para><emphasis>This PI is obsolete</emphasis>. The intent of
+ this PI was to provide a means for setting a specific starting
+ number for an ordered list. Instead of this PI, set a value
+ for the <literal>override</literal> attribute on the first
+ <tag>listitem</tag> in the list; that will have the same
+ effect as what this PI was intended for.</para>
+ </refdescription>
+ <refsynopsisdiv xmlns="http://www.w3.org/1999/xhtml">
+ <synopsis><tag class="xmlpi">dbhtml start="<replaceable>character</replaceable>"</tag></synopsis>
+ </refsynopsisdiv>
+ <refparameter xmlns="http://www.w3.org/1999/xhtml">
+ <variablelist>
+ <varlistentry><term>start="<replaceable>character</replaceable>"</term>
+ <listitem>
+ <para>Specifies the character to use as the starting
+ number; use 0-9, a-z, A-Z, or lowercase or uppercase
+ Roman numerals</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+ <refsee xmlns="http://www.w3.org/1999/xhtml" role="tcg">
+ <para><link role="tcg" xlink:href="Orderedlists.html#ListStartNum">List starting number</link></para>
+ </refsee>
+</doc:pi>
+<xsl:template name="pi.dbhtml_start">
+ <xsl:param name="node" select="."/>
+ <xsl:call-template name="pi-attribute">
+ <xsl:with-param name="pis" select="$node/processing-instruction('dbhtml')"/>
+ <xsl:with-param name="attribute" select="'start'"/>
+ </xsl:call-template>
+</xsl:template>
+
+ <doc:pi xmlns="" name="dbhtml_stop-chunking">
+ <refpurpose xmlns="http://www.w3.org/1999/xhtml">Do not chunk any descendants of this element.</refpurpose>
+ <refdescription xmlns="http://www.w3.org/1999/xhtml">
+ <para>When generating chunked HTML output, adding this PI as the child of an element that contains elements that would normally be generated on separate pages if generating chunked output causes chunking to stop at this point. No descendants of the current element will be split into new HTML pages:
+<programlisting>&lt;section&gt;
+&lt;title&gt;Configuring pencil&lt;/title&gt;
+&lt;?dbhtml stop-chunking?&gt;
+
+...
+
+&lt;/section&gt;</programlisting>
+</para>
+ </refdescription>
+ <refsynopsisdiv xmlns="http://www.w3.org/1999/xhtml">
+ <synopsis><tag class="xmlpi">dbhtml stop-chunking</tag></synopsis>
+ </refsynopsisdiv>
+ <refsee xmlns="http://www.w3.org/1999/xhtml" role="tcg">
+ <para><link role="tcg" xlink:href="Chunking.html">Chunking into multiple HTML files</link></para>
+ </refsee>
+ </doc:pi>
+ <!-- The code that handles the stop-chunking pi is in chunk-common.xsl -->
+
+<doc:pi xmlns="" name="dbhtml_table-summary">
+ <refpurpose xmlns="http://www.w3.org/1999/xhtml">Specifies summary for CALS table, variablelist, segmentedlist, or qandaset output</refpurpose>
+ <refdescription xmlns="http://www.w3.org/1999/xhtml">
+ <para>Use the <tag class="xmlpi">dbhtml table-summary</tag> PI as a child of
+ a CALS <tag>table</tag>, <tag>variablelist</tag>,
+ <tag>segmentedlist</tag>, or <tag>qandaset</tag> to specify
+ the text for the HTML <literal>summary</literal> attribute
+ in the output HTML table.</para>
+ </refdescription>
+ <refsynopsisdiv xmlns="http://www.w3.org/1999/xhtml">
+ <synopsis><tag class="xmlpi">dbhtml table-summary="<replaceable>text</replaceable>"</tag></synopsis>
+ </refsynopsisdiv>
+ <refparameter xmlns="http://www.w3.org/1999/xhtml">
+ <variablelist>
+ <varlistentry><term>table-summary="<replaceable>text</replaceable>"</term>
+ <listitem>
+ <para>Specifies the summary text (zero or more characters)</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+ <refsee xmlns="http://www.w3.org/1999/xhtml" role="tcg">
+ <para><link role="tcg" xlink:href="Variablelists.html#VarListFormatting">Variable list formatting in HTML</link>,
+ <link role="tcg" xlink:href="TableSummary.html">Table summary text</link></para>
+ </refsee>
+</doc:pi>
+<xsl:template name="pi.dbhtml_table-summary">
+ <xsl:param name="node" select="."/>
+ <xsl:call-template name="dbhtml-attribute">
+ <xsl:with-param name="pis" select="$node/processing-instruction('dbhtml')"/>
+ <xsl:with-param name="attribute" select="'table-summary'"/>
+ </xsl:call-template>
+</xsl:template>
+
+<doc:pi xmlns="" name="dbhtml_table-width">
+ <refpurpose xmlns="http://www.w3.org/1999/xhtml">Specifies the width for a CALS table</refpurpose>
+ <refdescription xmlns="http://www.w3.org/1999/xhtml">
+ <para>Use the <tag class="xmlpi">dbhtml table-width</tag> PI as a child of a
+ CALS <tag>table</tag> to specify the width of the table in
+ output.</para>
+ </refdescription>
+ <refsynopsisdiv xmlns="http://www.w3.org/1999/xhtml">
+ <synopsis><tag class="xmlpi">dbhtml table-width="<replaceable>width</replaceable>"</tag></synopsis>
+ </refsynopsisdiv>
+ <refparameter xmlns="http://www.w3.org/1999/xhtml">
+ <variablelist>
+ <varlistentry><term>table-width="<replaceable>width</replaceable>"</term>
+ <listitem>
+ <para>Specifies the table width (including units or as a percentage)</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+ <refsee xmlns="http://www.w3.org/1999/xhtml" role="params">
+ <para><parameter>default.table.width</parameter></para>
+ </refsee>
+ <refsee xmlns="http://www.w3.org/1999/xhtml" role="tcg">
+ <para><link role="tcg" xlink:href="Tables.html#TableWidth">Table width</link></para>
+ </refsee>
+</doc:pi>
+<xsl:template name="pi.dbhtml_table-width">
+ <xsl:param name="node" select="."/>
+ <xsl:call-template name="dbhtml-attribute">
+ <xsl:with-param name="pis" select="$node/processing-instruction('dbhtml')"/>
+ <xsl:with-param name="attribute" select="'table-width'"/>
+ </xsl:call-template>
+</xsl:template>
+
+<doc:pi xmlns="" name="dbhtml_term-presentation">
+ <refpurpose xmlns="http://www.w3.org/1999/xhtml">Sets character formatting for terms in a variablelist</refpurpose>
+ <refdescription xmlns="http://www.w3.org/1999/xhtml">
+ <para>Use the <tag class="xmlpi">dbhtml term-presentation</tag> PI as a child
+ of a <tag>variablelist</tag> to set character formatting for
+ the <tag>term</tag> output of the list.</para>
+ </refdescription>
+ <refsynopsisdiv xmlns="http://www.w3.org/1999/xhtml">
+ <synopsis><tag class="xmlpi">dbhtml term-presentation="bold"|"italic"|"bold-italic"</tag></synopsis>
+ </refsynopsisdiv>
+ <refparameter xmlns="http://www.w3.org/1999/xhtml">
+ <variablelist>
+ <varlistentry><term>term-presentation="<replaceable>bold</replaceable>"</term>
+ <listitem>
+ <para>Specifies that terms are displayed in bold</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry><term>term-presentation="<replaceable>italic</replaceable>"</term>
+ <listitem>
+ <para>Specifies that terms are displayed in italic</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry><term>term-presentation="<replaceable>bold-italic</replaceable>"</term>
+ <listitem>
+ <para>Specifies that terms are displayed in bold-italic</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+ <refsee xmlns="http://www.w3.org/1999/xhtml" role="tcg">
+ <para><link role="tcg" xlink:href="Variablelists.html#VarListFormatting">Variable list formatting in HTML</link></para>
+ </refsee>
+</doc:pi>
+<xsl:template name="pi.dbhtml_term-presentation">
+ <xsl:param name="node" select="."/>
+ <xsl:call-template name="dbhtml-attribute">
+ <xsl:with-param name="pis" select="$node/processing-instruction('dbhtml')"/>
+ <xsl:with-param name="attribute" select="'term-presentation'"/>
+ </xsl:call-template>
+</xsl:template>
+
+<doc:pi xmlns="" name="dbhtml_term-separator">
+ <refpurpose xmlns="http://www.w3.org/1999/xhtml">Specifies separator text among terms in a varlistentry</refpurpose>
+ <refdescription xmlns="http://www.w3.org/1999/xhtml">
+ <para>Use the <tag class="xmlpi">dbhtml term-separator</tag> PI as a child
+ of a <tag>variablelist</tag> to specify the separator text
+ among <tag>term</tag> instances.</para>
+ </refdescription>
+ <refsynopsisdiv xmlns="http://www.w3.org/1999/xhtml">
+ <synopsis><tag class="xmlpi">dbhtml term-separator="<replaceable>text</replaceable>"</tag></synopsis>
+ </refsynopsisdiv>
+ <refparameter xmlns="http://www.w3.org/1999/xhtml">
+ <variablelist>
+ <varlistentry><term>term-separator="<replaceable>text</replaceable>"</term>
+ <listitem>
+ <para>Specifies the text (zero or more characters)</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+ <refsee xmlns="http://www.w3.org/1999/xhtml" role="params">
+ <para><parameter>variablelist.term.separator</parameter></para>
+ </refsee>
+ <refsee xmlns="http://www.w3.org/1999/xhtml" role="tcg">
+ <para><link role="tcg" xlink:href="Variablelists.html#VarListFormatting">Variable list formatting in HTML</link></para>
+ </refsee>
+</doc:pi>
+<xsl:template name="pi.dbhtml_term-separator">
+ <xsl:param name="node" select="."/>
+ <xsl:call-template name="dbhtml-attribute">
+ <xsl:with-param name="pis" select="$node/processing-instruction('dbhtml')"/>
+ <xsl:with-param name="attribute" select="'term-separator'"/>
+ </xsl:call-template>
+</xsl:template>
+
+<doc:pi xmlns="" name="dbhtml_term-width">
+ <refpurpose xmlns="http://www.w3.org/1999/xhtml">Specifies the term width for a variablelist</refpurpose>
+ <refdescription xmlns="http://www.w3.org/1999/xhtml">
+ <para>Use the <tag class="xmlpi">dbhtml term-width</tag> PI as a child of a
+ <tag>variablelist</tag> to specify the width for
+ <tag>term</tag> output.</para>
+ </refdescription>
+ <refsynopsisdiv xmlns="http://www.w3.org/1999/xhtml">
+ <synopsis><tag class="xmlpi">dbhtml term-width="<replaceable>width</replaceable>"</tag></synopsis>
+ </refsynopsisdiv>
+ <refparameter xmlns="http://www.w3.org/1999/xhtml">
+ <variablelist>
+ <varlistentry><term>term-width="<replaceable>width</replaceable>"</term>
+ <listitem>
+ <para>Specifies the term width (including units)</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+ <refsee xmlns="http://www.w3.org/1999/xhtml" role="tcg">
+ <para><link role="tcg" xlink:href="Variablelists.html#VarListFormatting">Variable list formatting in HTML</link></para>
+ </refsee>
+</doc:pi>
+<xsl:template name="pi.dbhtml_term-width">
+ <xsl:param name="node" select="."/>
+ <xsl:call-template name="dbhtml-attribute">
+ <xsl:with-param name="pis" select="$node/processing-instruction('dbhtml')"/>
+ <xsl:with-param name="attribute" select="'term-width'"/>
+ </xsl:call-template>
+</xsl:template>
+
+<doc:pi xmlns="" name="dbhtml_toc">
+ <refpurpose xmlns="http://www.w3.org/1999/xhtml">Specifies whether a TOC should be generated for a qandaset</refpurpose>
+ <refdescription xmlns="http://www.w3.org/1999/xhtml">
+ <para>Use the <tag class="xmlpi">dbhtml toc</tag> PI as a child of a
+ <tag>qandaset</tag> to specify whether a table of contents
+ (TOC) is generated for the <tag>qandaset</tag>.</para>
+ </refdescription>
+ <refsynopsisdiv xmlns="http://www.w3.org/1999/xhtml">
+ <synopsis><tag class="xmlpi">dbhtml toc="0"|"1"</tag></synopsis>
+ </refsynopsisdiv>
+ <refparameter xmlns="http://www.w3.org/1999/xhtml">
+ <variablelist>
+ <varlistentry><term>toc="0"</term>
+ <listitem>
+ <para>If zero, no TOC is generated</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry><term>toc="1"</term>
+ <listitem>
+ <para>If <code>1</code> (or any non-zero value),
+ a TOC is generated</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+ <refsee xmlns="http://www.w3.org/1999/xhtml" role="tcg">
+ <para><link role="tcg" xlink:href="QandAtoc.html">Q and A list of questions</link>,
+ <link role="tcg" xlink:href="QandAformat.html">Q and A formatting</link></para>
+ </refsee>
+</doc:pi>
+<xsl:template name="pi.dbhtml_toc">
+ <xsl:param name="node" select="."/>
+ <xsl:call-template name="dbhtml-attribute">
+ <xsl:with-param name="pis" select="$node/processing-instruction('dbhtml')"/>
+ <xsl:with-param name="attribute" select="'toc'"/>
+ </xsl:call-template>
+</xsl:template>
+
+<doc:pi xmlns="" name="dbcmdlist">
+ <refpurpose xmlns="http://www.w3.org/1999/xhtml">Generates a hyperlinked list of commands</refpurpose>
+ <refdescription xmlns="http://www.w3.org/1999/xhtml">
+ <para>Use the <tag class="xmlpi">dbcmdlist</tag> PI as the child of any
+ element (for example, <tag>refsynopsisdiv</tag>) containing multiple
+ <tag>cmdsynopsis</tag> instances; a hyperlinked navigational
+ &#8220;command list&#8221; will be generated at the top of output for that
+ element, enabling users to quickly jump
+ to each command synopsis.</para>
+ </refdescription>
+ <refsynopsisdiv xmlns="http://www.w3.org/1999/xhtml">
+ <synopsis><tag class="xmlpi">dbcmdlist</tag></synopsis>
+ </refsynopsisdiv>
+ <refparameter xmlns="http://www.w3.org/1999/xhtml">
+ <para>[No parameters]</para>
+ </refparameter>
+</doc:pi>
+<xsl:template name="pi.dbcmdlist">
+ <xsl:variable name="cmdsynopses" select="..//cmdsynopsis"/>
+ <xsl:if test="count($cmdsynopses)&lt;1">
+ <xsl:message><xsl:text>No cmdsynopsis elements matched dbcmdlist PI, perhaps it's nested too deep?</xsl:text>
+ </xsl:message>
+ </xsl:if>
+ <dl>
+ <xsl:call-template name="process.cmdsynopsis.list">
+ <xsl:with-param name="cmdsynopses" select="$cmdsynopses"/>
+ </xsl:call-template>
+ </dl>
+</xsl:template>
+
+<doc:pi xmlns="" name="dbfunclist">
+ <refpurpose xmlns="http://www.w3.org/1999/xhtml">Generates a hyperlinked list of functions</refpurpose>
+ <refdescription xmlns="http://www.w3.org/1999/xhtml">
+ <para>Use the <tag class="xmlpi">dbfunclist</tag> PI as the child of any
+ element (for example, <tag>refsynopsisdiv</tag>) containing multiple
+ <tag>funcsynopsis</tag> instances; a hyperlinked
+ navigational &#8220;function list&#8221; will be generated at the top of
+ output for that element, enabling users to quickly
+ jump to to each function synopsis.</para>
+ </refdescription>
+ <refsynopsisdiv xmlns="http://www.w3.org/1999/xhtml">
+ <synopsis><tag class="xmlpi">dbfunclist</tag></synopsis>
+ </refsynopsisdiv>
+ <refparameter xmlns="http://www.w3.org/1999/xhtml">
+ <para>[No parameters]</para>
+ </refparameter>
+</doc:pi>
+<xsl:template name="pi.dbfunclist">
+ <xsl:variable name="funcsynopses" select="..//funcsynopsis"/>
+ <xsl:if test="count($funcsynopses)&lt;1">
+ <xsl:message><xsl:text>No funcsynopsis elements matched dbfunclist PI, perhaps it's nested too deep?</xsl:text>
+ </xsl:message>
+ </xsl:if>
+ <dl>
+ <xsl:call-template name="process.funcsynopsis.list">
+ <xsl:with-param name="funcsynopses" select="$funcsynopses"/>
+ </xsl:call-template>
+ </dl>
+</xsl:template>
+
+<doc:pi xmlns="" name="dbhtml-include_href">
+ <refpurpose xmlns="http://www.w3.org/1999/xhtml">Copies an external well-formed HTML/XML file into current doc</refpurpose>
+ <refdescription xmlns="http://www.w3.org/1999/xhtml">
+ <para>Use the <tag class="xmlpi">dbhtml-include href</tag> PI anywhere in a
+ document to cause the contents of the file referenced by the
+ <code>href</code> pseudo-attribute to be copied/inserted &#8220;as
+ is&#8221; into your HTML output at the point in document order
+ where the PI occurs in the source.</para>
+ <note>
+ <para>The referenced file may contain plain text (as long as
+ it is &#8220;wrapped&#8221; in an <tag>html</tag> element &#8212; see the
+ note below) or markup in any arbitrary vocabulary,
+ including HTML &#8212; but it must conform to XML
+ well-formedness constraints (because the feature in XSLT
+ 1.0 for opening external files, the
+ <function>document()</function> function, can only handle
+ files that meet XML well-formedness constraints).</para>
+ <para>Among other things, XML well-formedness constraints
+ require a document to have <emphasis>a single root
+ element</emphasis>. So if the content you want to
+ include is plain text or is markup that does
+ <emphasis>not</emphasis> have a single root element,
+ <emphasis role="strong">wrap the content in an
+ <tag>html</tag> element</emphasis>. The stylesheets will
+ strip out that surrounding <tag>html</tag> &#8220;wrapper&#8221; when
+ they find it, leaving just the content you want to
+ insert.</para>
+ </note>
+ </refdescription>
+ <refsynopsisdiv xmlns="http://www.w3.org/1999/xhtml">
+ <synopsis><tag class="xmlpi">dbhtml-include href="<replaceable>URI</replaceable>"</tag></synopsis>
+ </refsynopsisdiv>
+ <refparameter xmlns="http://www.w3.org/1999/xhtml">
+ <variablelist>
+ <varlistentry><term>href="<replaceable>URI</replaceable>"</term>
+ <listitem>
+ <para>Specifies the URI for the file to include; the URI
+ can be, for example, a remote <literal>http:</literal>
+ URI, or a local filesystem <literal>file:</literal>
+ URI</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+ <refsee xmlns="http://www.w3.org/1999/xhtml" role="params">
+ <para><parameter>textinsert.extension</parameter></para>
+ </refsee>
+ <refsee xmlns="http://www.w3.org/1999/xhtml" role="tcg">
+ <para><link role="tcg" xlink:href="InsertExtHtml.html">Inserting external HTML code</link>,
+ <link role="tcg" xlink:href="ExternalCode.html">External code files</link></para>
+ </refsee>
+</doc:pi>
+<xsl:template name="pi.dbhtml-include">
+ <xsl:param name="href">
+ <xsl:call-template name="dbhtml-attribute">
+ <xsl:with-param name="pis" select="."/>
+ <xsl:with-param name="attribute">href</xsl:with-param>
+ </xsl:call-template>
+ </xsl:param>
+ <xsl:choose>
+ <xsl:when test="$href != ''">
+ <xsl:variable name="content" select="document($href,/)"/>
+ <xsl:choose>
+ <xsl:when test="$content/*">
+ <xsl:choose>
+ <xsl:when test="$content/*[1][self::html]">
+ <!-- include just the children of html wrapper -->
+ <xsl:copy-of select="$content/*[1]/node()"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:copy-of select="$content"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:message>
+ <xsl:text>ERROR: dbhtml-include processing instruction </xsl:text>
+ <xsl:text>href has no content.</xsl:text>
+ </xsl:message>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:message>
+ <xsl:text>ERROR: dbhtml-include processing instruction has </xsl:text>
+ <xsl:text>missing or empty href value.</xsl:text>
+ </xsl:message>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- There are two templates matching this PI in htmlhelp-common.xsl -->
+<doc:pi xmlns="" name="dbhh">
+ <refpurpose xmlns="http://www.w3.org/1999/xhtml">Sets topic name and topic id for context-sensitive HTML Help</refpurpose>
+ <refdescription xmlns="http://www.w3.org/1999/xhtml">
+ <para>Use the <tag class="xmlpi">dbhh</tag> PI as a child of components
+ that should be used as targets for context-sensitive help requests.</para>
+ </refdescription>
+ <refsynopsisdiv xmlns="http://www.w3.org/1999/xhtml">
+ <synopsis><tag class="xmlpi">dbhh topicname="<replaceable>name</replaceable>" topicid="<replaceable>id</replaceable>"</tag></synopsis>
+ </refsynopsisdiv>
+ <refparameter xmlns="http://www.w3.org/1999/xhtml">
+ <variablelist>
+ <varlistentry><term>topicname="<replaceable>name</replaceable>"</term>
+ <listitem>
+ <para>Specifies a unique string constant that identifies a help topic</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry><term>topicid="<replaceable>id</replaceable>"</term>
+ <listitem>
+ <para>Specifies a unique integer value for the <literal>topicname</literal> string</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refparameter>
+ <refsee xmlns="http://www.w3.org/1999/xhtml" role="tcg">
+ <para><link role="tcg" xlink:href="HtmlHelp.html#HHContextHelp">Context-sensitive help</link></para>
+ </refsee>
+</doc:pi>
+
+<!-- ==================================================================== -->
+
+<xsl:template name="dbhtml-attribute">
+ <!-- * dbhtml-attribute is an interal utility template for retrieving -->
+ <!-- * pseudo-attributes/parameters from PIs -->
+ <xsl:param name="pis" select="processing-instruction('dbhtml')"/>
+ <xsl:param name="attribute">filename</xsl:param>
+ <xsl:call-template name="pi-attribute">
+ <xsl:with-param name="pis" select="$pis"/>
+ <xsl:with-param name="attribute" select="$attribute"/>
+ </xsl:call-template>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="processing-instruction()">
+</xsl:template>
+
+<xsl:template match="processing-instruction('dbhtml')">
+ <!-- nop -->
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="processing-instruction('dbcmdlist')">
+ <xsl:call-template name="pi.dbcmdlist"/>
+</xsl:template>
+<xsl:template name="process.cmdsynopsis.list">
+ <xsl:param name="cmdsynopses"/><!-- empty node list by default -->
+ <xsl:param name="count" select="1"/>
+
+ <xsl:choose>
+ <xsl:when test="$count&gt;count($cmdsynopses)"/>
+ <xsl:otherwise>
+ <xsl:variable name="cmdsyn" select="$cmdsynopses[$count]"/>
+
+ <dt>
+ <a>
+ <xsl:attribute name="href">
+ <xsl:text>#</xsl:text>
+ <xsl:call-template name="object.id">
+ <xsl:with-param name="object" select="$cmdsyn"/>
+ </xsl:call-template>
+ </xsl:attribute>
+
+ <xsl:choose>
+ <xsl:when test="$cmdsyn/@xreflabel">
+ <xsl:call-template name="xref.xreflabel">
+ <xsl:with-param name="target" select="$cmdsyn"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="$cmdsyn" mode="xref-to">
+ <xsl:with-param name="target" select="$cmdsyn"/>
+ </xsl:apply-templates>
+ </xsl:otherwise>
+ </xsl:choose>
+ </a>
+ </dt>
+
+ <xsl:call-template name="process.cmdsynopsis.list">
+ <xsl:with-param name="cmdsynopses" select="$cmdsynopses"/>
+ <xsl:with-param name="count" select="$count+1"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="processing-instruction('dbfunclist')">
+ <xsl:call-template name="pi.dbfunclist"/>
+</xsl:template>
+<xsl:template name="process.funcsynopsis.list">
+ <xsl:param name="funcsynopses"/><!-- empty node list by default -->
+ <xsl:param name="count" select="1"/>
+
+ <xsl:choose>
+ <xsl:when test="$count&gt;count($funcsynopses)"/>
+ <xsl:otherwise>
+ <xsl:variable name="cmdsyn" select="$funcsynopses[$count]"/>
+
+ <dt>
+ <a>
+ <xsl:attribute name="href">
+ <xsl:text>#</xsl:text>
+ <xsl:call-template name="object.id">
+ <xsl:with-param name="object" select="$cmdsyn"/>
+ </xsl:call-template>
+ </xsl:attribute>
+
+ <xsl:choose>
+ <xsl:when test="$cmdsyn/@xreflabel">
+ <xsl:call-template name="xref.xreflabel">
+ <xsl:with-param name="target" select="$cmdsyn"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="$cmdsyn" mode="xref-to">
+ <xsl:with-param name="target" select="$cmdsyn"/>
+ </xsl:apply-templates>
+ </xsl:otherwise>
+ </xsl:choose>
+ </a>
+ </dt>
+
+ <xsl:call-template name="process.funcsynopsis.list">
+ <xsl:with-param name="funcsynopses" select="$funcsynopses"/>
+ <xsl:with-param name="count" select="$count+1"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="processing-instruction('dbhtml-include')">
+ <xsl:call-template name="pi.dbhtml-include"/>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template name="dbhtml-dir">
+ <xsl:param name="context" select="."/>
+ <!-- directories are now inherited from previous levels -->
+ <xsl:variable name="ppath">
+ <xsl:if test="$context/parent::*">
+ <xsl:call-template name="dbhtml-dir">
+ <xsl:with-param name="context" select="$context/parent::*"/>
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:variable>
+ <xsl:variable name="path">
+ <xsl:call-template name="pi.dbhtml_dir">
+ <xsl:with-param name="node" select="$context"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:choose>
+ <xsl:when test="$path = ''">
+ <xsl:if test="$ppath != ''">
+ <xsl:value-of select="$ppath"/>
+ </xsl:if>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:if test="$ppath != ''">
+ <xsl:value-of select="$ppath"/>
+ <xsl:if test="substring($ppath, string-length($ppath), 1) != '/'">
+ <xsl:text>/</xsl:text>
+ </xsl:if>
+ </xsl:if>
+ <xsl:value-of select="$path"/>
+ <xsl:text>/</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/profile-chunk-code.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/profile-chunk-code.xsl
new file mode 100644
index 0000000..05c10c6
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/profile-chunk-code.xsl
@@ -0,0 +1,617 @@
+<?xml version="1.0" encoding="ASCII"?>
+<!--This file was created automatically by html2xhtml-->
+<!--from the HTML stylesheets.-->
+<!--This file was created automatically by xsl2profile-->
+<!--from the DocBook XSL stylesheets.-->
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:exsl="http://exslt.org/common" xmlns:cf="http://docbook.sourceforge.net/xmlns/chunkfast/1.0" xmlns:ng="http://docbook.org/docbook-ng" xmlns:db="http://docbook.org/ns/docbook" xmlns:exslt="http://exslt.org/common" xmlns="http://www.w3.org/1999/xhtml" exslt:dummy="dummy" ng:dummy="dummy" db:dummy="dummy" extension-element-prefixes="exslt" exclude-result-prefixes="exsl cf ng db exslt" version="1.0">
+
+<!-- ********************************************************************
+ $Id: chunk-code.xsl 8596 2010-03-20 04:36:45Z bobstayton $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<!-- ==================================================================== -->
+
+
+<xsl:template match="*" mode="chunk-filename">
+ <!-- returns the filename of a chunk -->
+ <xsl:variable name="ischunk">
+ <xsl:call-template name="chunk"/>
+ </xsl:variable>
+
+ <xsl:variable name="fn">
+ <xsl:apply-templates select="." mode="recursive-chunk-filename"/>
+ </xsl:variable>
+
+ <!--
+ <xsl:message>
+ <xsl:value-of select="$ischunk"/>
+ <xsl:text> (</xsl:text>
+ <xsl:value-of select="local-name(.)"/>
+ <xsl:text>) </xsl:text>
+ <xsl:value-of select="$fn"/>
+ <xsl:text>, </xsl:text>
+ <xsl:call-template name="dbhtml-dir"/>
+ </xsl:message>
+ -->
+
+ <!-- 2003-11-25 by ndw:
+ The following test used to read test="$ischunk != 0 and $fn != ''"
+ I've removed the ischunk part of the test so that href.to.uri and
+ href.from.uri will be fully qualified even if the source or target
+ isn't a chunk. I *think* that if $fn != '' then it's appropriate
+ to put the directory on the front, even if the element isn't a
+ chunk. I could be wrong. -->
+
+ <xsl:if test="$fn != ''">
+ <xsl:call-template name="dbhtml-dir"/>
+ </xsl:if>
+
+ <xsl:value-of select="$fn"/>
+ <!-- You can't add the html.ext here because dbhtml filename= may already -->
+ <!-- have added it. It really does have to be handled in the recursive template -->
+</xsl:template>
+
+<xsl:template match="*" mode="recursive-chunk-filename">
+ <xsl:param name="recursive" select="false()"/>
+
+ <!-- returns the filename of a chunk -->
+ <xsl:variable name="ischunk">
+ <xsl:call-template name="chunk"/>
+ </xsl:variable>
+
+ <xsl:variable name="dbhtml-filename">
+ <xsl:call-template name="pi.dbhtml_filename"/>
+ </xsl:variable>
+
+ <xsl:variable name="filename">
+ <xsl:choose>
+ <xsl:when test="$dbhtml-filename != ''">
+ <xsl:value-of select="$dbhtml-filename"/>
+ </xsl:when>
+ <!-- if this is the root element, use the root.filename -->
+ <xsl:when test="not(parent::*) and $root.filename != ''">
+ <xsl:value-of select="$root.filename"/>
+ <xsl:value-of select="$html.ext"/>
+ </xsl:when>
+ <!-- Special case -->
+ <xsl:when test="self::legalnotice and not($generate.legalnotice.link = 0)">
+ <xsl:choose>
+ <xsl:when test="(@id or @xml:id) and not($use.id.as.filename = 0)">
+ <!-- * if this legalnotice has an ID, then go ahead and use -->
+ <!-- * just the value of that ID as the basename for the file -->
+ <!-- * (that is, without prepending an "ln-" too it) -->
+ <xsl:value-of select="(@id|@xml:id)[1]"/>
+ <xsl:value-of select="$html.ext"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <!-- * otherwise, if this legalnotice does not have an ID, -->
+ <!-- * then we generate an ID... -->
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+ <!-- * ...and then we take that generated ID, prepend an -->
+ <!-- * "ln-" to it, and use that as the basename for the file -->
+ <xsl:value-of select="concat('ln-',$id,$html.ext)"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <!-- if there's no dbhtml filename, and if we're to use IDs as -->
+ <!-- filenames, then use the ID to generate the filename. -->
+ <xsl:when test="(@id or @xml:id) and $use.id.as.filename != 0">
+ <xsl:value-of select="(@id|@xml:id)[1]"/>
+ <xsl:value-of select="$html.ext"/>
+ </xsl:when>
+ <xsl:otherwise/>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="$ischunk='0'">
+ <!-- if called on something that isn't a chunk, walk up... -->
+ <xsl:choose>
+ <xsl:when test="count(parent::*)&gt;0">
+ <xsl:apply-templates mode="recursive-chunk-filename" select="parent::*">
+ <xsl:with-param name="recursive" select="$recursive"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <!-- unless there is no up, in which case return "" -->
+ <xsl:otherwise/>
+ </xsl:choose>
+ </xsl:when>
+
+ <xsl:when test="not($recursive) and $filename != ''">
+ <!-- if this chunk has an explicit name, use it -->
+ <xsl:value-of select="$filename"/>
+ </xsl:when>
+
+ <xsl:when test="self::set">
+ <xsl:value-of select="$root.filename"/>
+ <xsl:if test="not($recursive)">
+ <xsl:value-of select="$html.ext"/>
+ </xsl:if>
+ </xsl:when>
+
+ <xsl:when test="self::book">
+ <xsl:text>bk</xsl:text>
+ <xsl:number level="any" format="01"/>
+ <xsl:if test="not($recursive)">
+ <xsl:value-of select="$html.ext"/>
+ </xsl:if>
+ </xsl:when>
+
+ <xsl:when test="self::article">
+ <xsl:if test="/set">
+ <!-- in a set, make sure we inherit the right book info... -->
+ <xsl:apply-templates mode="recursive-chunk-filename" select="parent::*">
+ <xsl:with-param name="recursive" select="true()"/>
+ </xsl:apply-templates>
+ </xsl:if>
+
+ <xsl:text>ar</xsl:text>
+ <xsl:number level="any" format="01" from="book"/>
+ <xsl:if test="not($recursive)">
+ <xsl:value-of select="$html.ext"/>
+ </xsl:if>
+ </xsl:when>
+
+ <xsl:when test="self::preface">
+ <xsl:if test="/set">
+ <!-- in a set, make sure we inherit the right book info... -->
+ <xsl:apply-templates mode="recursive-chunk-filename" select="parent::*">
+ <xsl:with-param name="recursive" select="true()"/>
+ </xsl:apply-templates>
+ </xsl:if>
+
+ <xsl:text>pr</xsl:text>
+ <xsl:number level="any" format="01" from="book"/>
+ <xsl:if test="not($recursive)">
+ <xsl:value-of select="$html.ext"/>
+ </xsl:if>
+ </xsl:when>
+
+ <xsl:when test="self::chapter">
+ <xsl:if test="/set">
+ <!-- in a set, make sure we inherit the right book info... -->
+ <xsl:apply-templates mode="recursive-chunk-filename" select="parent::*">
+ <xsl:with-param name="recursive" select="true()"/>
+ </xsl:apply-templates>
+ </xsl:if>
+
+ <xsl:text>ch</xsl:text>
+ <xsl:number level="any" format="01" from="book"/>
+ <xsl:if test="not($recursive)">
+ <xsl:value-of select="$html.ext"/>
+ </xsl:if>
+ </xsl:when>
+
+ <xsl:when test="self::appendix">
+ <xsl:if test="/set">
+ <!-- in a set, make sure we inherit the right book info... -->
+ <xsl:apply-templates mode="recursive-chunk-filename" select="parent::*">
+ <xsl:with-param name="recursive" select="true()"/>
+ </xsl:apply-templates>
+ </xsl:if>
+
+ <xsl:text>ap</xsl:text>
+ <xsl:number level="any" format="a" from="book"/>
+ <xsl:if test="not($recursive)">
+ <xsl:value-of select="$html.ext"/>
+ </xsl:if>
+ </xsl:when>
+
+ <xsl:when test="self::part">
+ <xsl:choose>
+ <xsl:when test="/set">
+ <!-- in a set, make sure we inherit the right book info... -->
+ <xsl:apply-templates mode="recursive-chunk-filename" select="parent::*">
+ <xsl:with-param name="recursive" select="true()"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:otherwise>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:text>pt</xsl:text>
+ <xsl:number level="any" format="01" from="book"/>
+ <xsl:if test="not($recursive)">
+ <xsl:value-of select="$html.ext"/>
+ </xsl:if>
+ </xsl:when>
+
+ <xsl:when test="self::reference">
+ <xsl:choose>
+ <xsl:when test="/set">
+ <!-- in a set, make sure we inherit the right book info... -->
+ <xsl:apply-templates mode="recursive-chunk-filename" select="parent::*">
+ <xsl:with-param name="recursive" select="true()"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:otherwise>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:text>rn</xsl:text>
+ <xsl:number level="any" format="01" from="book"/>
+ <xsl:if test="not($recursive)">
+ <xsl:value-of select="$html.ext"/>
+ </xsl:if>
+ </xsl:when>
+
+ <xsl:when test="self::refentry">
+ <xsl:choose>
+ <xsl:when test="parent::reference">
+ <xsl:apply-templates mode="recursive-chunk-filename" select="parent::*">
+ <xsl:with-param name="recursive" select="true()"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:if test="/set">
+ <!-- in a set, make sure we inherit the right book info... -->
+ <xsl:apply-templates mode="recursive-chunk-filename" select="parent::*">
+ <xsl:with-param name="recursive" select="true()"/>
+ </xsl:apply-templates>
+ </xsl:if>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:text>re</xsl:text>
+ <xsl:number level="any" format="01" from="book"/>
+ <xsl:if test="not($recursive)">
+ <xsl:value-of select="$html.ext"/>
+ </xsl:if>
+ </xsl:when>
+
+ <xsl:when test="self::colophon">
+ <xsl:choose>
+ <xsl:when test="/set">
+ <!-- in a set, make sure we inherit the right book info... -->
+ <xsl:apply-templates mode="recursive-chunk-filename" select="parent::*">
+ <xsl:with-param name="recursive" select="true()"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:otherwise>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:text>co</xsl:text>
+ <xsl:number level="any" format="01" from="book"/>
+ <xsl:if test="not($recursive)">
+ <xsl:value-of select="$html.ext"/>
+ </xsl:if>
+ </xsl:when>
+
+ <xsl:when test="self::sect1 or self::sect2 or self::sect3 or self::sect4 or self::sect5 or self::section">
+ <xsl:apply-templates mode="recursive-chunk-filename" select="parent::*">
+ <xsl:with-param name="recursive" select="true()"/>
+ </xsl:apply-templates>
+ <xsl:text>s</xsl:text>
+ <xsl:number format="01"/>
+ <xsl:if test="not($recursive)">
+ <xsl:value-of select="$html.ext"/>
+ </xsl:if>
+ </xsl:when>
+
+ <xsl:when test="self::bibliography">
+ <xsl:choose>
+ <xsl:when test="/set">
+ <!-- in a set, make sure we inherit the right book info... -->
+ <xsl:apply-templates mode="recursive-chunk-filename" select="parent::*">
+ <xsl:with-param name="recursive" select="true()"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:otherwise>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:text>bi</xsl:text>
+ <xsl:number level="any" format="01" from="book"/>
+ <xsl:if test="not($recursive)">
+ <xsl:value-of select="$html.ext"/>
+ </xsl:if>
+ </xsl:when>
+
+ <xsl:when test="self::glossary">
+ <xsl:choose>
+ <xsl:when test="/set">
+ <!-- in a set, make sure we inherit the right book info... -->
+ <xsl:apply-templates mode="recursive-chunk-filename" select="parent::*">
+ <xsl:with-param name="recursive" select="true()"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:otherwise>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:text>go</xsl:text>
+ <xsl:number level="any" format="01" from="book"/>
+ <xsl:if test="not($recursive)">
+ <xsl:value-of select="$html.ext"/>
+ </xsl:if>
+ </xsl:when>
+
+ <xsl:when test="self::index">
+ <xsl:choose>
+ <xsl:when test="/set">
+ <!-- in a set, make sure we inherit the right book info... -->
+ <xsl:apply-templates mode="recursive-chunk-filename" select="parent::*">
+ <xsl:with-param name="recursive" select="true()"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:otherwise>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:text>ix</xsl:text>
+ <xsl:number level="any" format="01" from="book"/>
+ <xsl:if test="not($recursive)">
+ <xsl:value-of select="$html.ext"/>
+ </xsl:if>
+ </xsl:when>
+
+ <xsl:when test="self::setindex">
+ <xsl:text>si</xsl:text>
+ <xsl:number level="any" format="01" from="set"/>
+ <xsl:if test="not($recursive)">
+ <xsl:value-of select="$html.ext"/>
+ </xsl:if>
+ </xsl:when>
+
+ <xsl:otherwise>
+ <xsl:text>chunk-filename-error-</xsl:text>
+ <xsl:value-of select="name(.)"/>
+ <xsl:number level="any" format="01" from="set"/>
+ <xsl:if test="not($recursive)">
+ <xsl:value-of select="$html.ext"/>
+ </xsl:if>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+
+
+<xsl:template match="processing-instruction('dbhtml')">
+ <!-- nop -->
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+
+<xsl:template match="*" mode="find.chunks">
+ <xsl:variable name="chunk">
+ <xsl:call-template name="chunk"/>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="$chunk != 0">
+ <cf:div id="{generate-id()}">
+ <xsl:apply-templates select="." mode="class.attribute"/>
+ <xsl:apply-templates select="*" mode="find.chunks"/>
+ </cf:div>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="*" mode="find.chunks"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xslo:include xmlns:xslo="http://www.w3.org/1999/XSL/Transform" href="../profiling/profile-mode.xsl"/><xslo:variable xmlns:xslo="http://www.w3.org/1999/XSL/Transform" name="profiled-content"><xslo:choose><xslo:when test="*/self::ng:* or */self::db:*"><xslo:message>Note: namesp. cut : stripped namespace before processing</xslo:message><xslo:variable name="stripped-content"><xslo:apply-templates select="/" mode="stripNS"/></xslo:variable><xslo:message>Note: namesp. cut : processing stripped document</xslo:message><xslo:apply-templates select="exslt:node-set($stripped-content)" mode="profile"/></xslo:when><xslo:otherwise><xslo:apply-templates select="/" mode="profile"/></xslo:otherwise></xslo:choose></xslo:variable><xslo:variable xmlns:xslo="http://www.w3.org/1999/XSL/Transform" name="profiled-nodes" select="exslt:node-set($profiled-content)"/><xsl:template match="/">
+ <!-- * Get a title for current doc so that we let the user -->
+ <!-- * know what document we are processing at this point. -->
+ <xsl:variable name="doc.title">
+ <xsl:call-template name="get.doc.title"/>
+ </xsl:variable>
+ <xsl:choose>
+ <!-- Hack! If someone hands us a DocBook V5.x or DocBook NG document,
+ toss the namespace and continue. Use the docbook5 namespaced
+ stylesheets for DocBook5 if you don't want to use this feature.-->
+ <xsl:when test="false()"/>
+ <!-- Can't process unless namespace removed -->
+ <xsl:when test="false()"/>
+ <xsl:otherwise>
+ <xsl:choose>
+ <xsl:when test="$rootid != ''">
+ <xsl:choose>
+ <xsl:when test="count($profiled-nodes//*[@id=$rootid]) = 0">
+ <xsl:message terminate="yes">
+ <xsl:text>ID '</xsl:text>
+ <xsl:value-of select="$rootid"/>
+ <xsl:text>' not found in document.</xsl:text>
+ </xsl:message>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:if test="$collect.xref.targets = 'yes' or $collect.xref.targets = 'only'">
+ <xsl:apply-templates select="key('id', $rootid)" mode="collect.targets"/>
+ </xsl:if>
+ <xsl:if test="$collect.xref.targets != 'only'">
+ <xsl:apply-templates select="$profiled-nodes//*[@id=$rootid]" mode="process.root"/>
+ <xsl:if test="$tex.math.in.alt != ''">
+ <xsl:apply-templates select="$profiled-nodes//*[@id=$rootid]" mode="collect.tex.math"/>
+ </xsl:if>
+ <xsl:if test="$generate.manifest != 0">
+ <xsl:call-template name="generate.manifest">
+ <xsl:with-param name="node" select="key('id',$rootid)"/>
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:if>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:if test="$collect.xref.targets = 'yes' or $collect.xref.targets = 'only'">
+ <xsl:apply-templates select="$profiled-nodes" mode="collect.targets"/>
+ </xsl:if>
+ <xsl:if test="$collect.xref.targets != 'only'">
+ <xsl:apply-templates select="$profiled-nodes" mode="process.root"/>
+ <xsl:if test="$tex.math.in.alt != ''">
+ <xsl:apply-templates select="$profiled-nodes" mode="collect.tex.math"/>
+ </xsl:if>
+ <xsl:if test="$generate.manifest != 0">
+ <xsl:call-template name="generate.manifest">
+ <xsl:with-param name="node" select="$profiled-nodes"/>
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:if>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="*" mode="process.root">
+ <xsl:apply-templates select="."/>
+ <xsl:call-template name="generate.css"/>
+</xsl:template>
+
+<!-- ====================================================================== -->
+
+<xsl:template match="set|book|part|preface|chapter|appendix |article |reference|refentry |book/glossary|article/glossary|part/glossary |book/bibliography|article/bibliography|part/bibliography |colophon">
+ <xsl:choose>
+ <xsl:when test="$onechunk != 0 and parent::*">
+ <xsl:apply-imports/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="process-chunk-element"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="sect1|sect2|sect3|sect4|sect5|section">
+ <xsl:variable name="ischunk">
+ <xsl:call-template name="chunk"/>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="not(parent::*)">
+ <xsl:call-template name="process-chunk-element"/>
+ </xsl:when>
+ <xsl:when test="$ischunk = 0">
+ <xsl:apply-imports/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="process-chunk-element"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="setindex |book/index |article/index |part/index">
+ <!-- some implementations use completely empty index tags to indicate -->
+ <!-- where an automatically generated index should be inserted. so -->
+ <!-- if the index is completely empty, skip it. -->
+ <xsl:if test="count(*)&gt;0 or $generate.index != '0'">
+ <xsl:call-template name="process-chunk-element"/>
+ </xsl:if>
+</xsl:template>
+
+<!-- Resolve xml:base attributes -->
+<xsl:template match="@fileref">
+ <!-- need a check for absolute urls -->
+ <xsl:choose>
+ <xsl:when test="contains(., ':')">
+ <!-- it has a uri scheme so it is an absolute uri -->
+ <xsl:value-of select="."/>
+ </xsl:when>
+ <xsl:when test="$keep.relative.image.uris != 0">
+ <!-- leave it alone -->
+ <xsl:value-of select="."/>
+ </xsl:when>
+ <xsl:otherwise>
+ <!-- its a relative uri -->
+ <xsl:call-template name="relative-uri">
+ <xsl:with-param name="destdir">
+ <xsl:call-template name="dbhtml-dir">
+ <xsl:with-param name="context" select=".."/>
+ </xsl:call-template>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ==================================================================== -->
+<xsl:template match="set|book|part|preface|chapter|appendix |article |reference|refentry |sect1|sect2|sect3|sect4|sect5 |section |book/glossary|article/glossary|part/glossary |book/bibliography|article/bibliography|part/bibliography |colophon" mode="enumerate-files">
+ <xsl:variable name="ischunk"><xsl:call-template name="chunk"/></xsl:variable>
+ <xsl:if test="$ischunk='1'">
+ <xsl:call-template name="make-relative-filename">
+ <xsl:with-param name="base.dir">
+ <xsl:if test="$manifest.in.base.dir = 0">
+ <xsl:value-of select="$base.dir"/>
+ </xsl:if>
+ </xsl:with-param>
+ <xsl:with-param name="base.name">
+ <xsl:apply-templates mode="chunk-filename" select="."/>
+ </xsl:with-param>
+ </xsl:call-template>
+ <xsl:text>
+</xsl:text>
+ </xsl:if>
+ <xsl:apply-templates select="*" mode="enumerate-files"/>
+</xsl:template>
+
+<xsl:template match="book/index|article/index|part/index" mode="enumerate-files">
+ <xsl:if test="$htmlhelp.output != 1">
+ <xsl:variable name="ischunk"><xsl:call-template name="chunk"/></xsl:variable>
+ <xsl:if test="$ischunk='1'">
+ <xsl:call-template name="make-relative-filename">
+ <xsl:with-param name="base.dir">
+ <xsl:if test="$manifest.in.base.dir = 0">
+ <xsl:value-of select="$base.dir"/>
+ </xsl:if>
+ </xsl:with-param>
+ <xsl:with-param name="base.name">
+ <xsl:apply-templates mode="chunk-filename" select="."/>
+ </xsl:with-param>
+ </xsl:call-template>
+ <xsl:text>
+</xsl:text>
+ </xsl:if>
+ <xsl:apply-templates select="*" mode="enumerate-files"/>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="legalnotice" mode="enumerate-files">
+ <xsl:variable name="id"><xsl:call-template name="object.id"/></xsl:variable>
+ <xsl:if test="$generate.legalnotice.link != 0">
+ <xsl:call-template name="make-relative-filename">
+ <xsl:with-param name="base.dir">
+ <xsl:if test="$manifest.in.base.dir = 0">
+ <xsl:value-of select="$base.dir"/>
+ </xsl:if>
+ </xsl:with-param>
+ <xsl:with-param name="base.name">
+ <xsl:apply-templates mode="chunk-filename" select="."/>
+ </xsl:with-param>
+ </xsl:call-template>
+ <xsl:text>
+</xsl:text>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="mediaobject[imageobject] | inlinemediaobject[imageobject]" mode="enumerate-files">
+ <xsl:variable name="longdesc.uri">
+ <xsl:call-template name="longdesc.uri">
+ <xsl:with-param name="mediaobject" select="."/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:variable name="mediaobject" select="."/>
+
+ <xsl:if test="$html.longdesc != 0 and $mediaobject/textobject[not(phrase)]">
+ <xsl:call-template name="longdesc.uri">
+ <xsl:with-param name="mediaobject" select="$mediaobject"/>
+ </xsl:call-template>
+ <xsl:text>
+</xsl:text>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="text()" mode="enumerate-files">
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/profile-chunk.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/profile-chunk.xsl
new file mode 100644
index 0000000..def7fff
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/profile-chunk.xsl
@@ -0,0 +1,52 @@
+<?xml version="1.0" encoding="ASCII"?>
+<!--This file was created automatically by html2xhtml-->
+<!--from the HTML stylesheets.-->
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:exsl="http://exslt.org/common" xmlns="http://www.w3.org/1999/xhtml" version="1.0" exclude-result-prefixes="exsl">
+
+<!-- ********************************************************************
+ $Id: profile-chunk.xsl 6910 2007-06-28 23:23:30Z xmldoc $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<!-- ==================================================================== -->
+
+<!-- First import the non-chunking templates that format elements
+ within each chunk file. In a customization, you should
+ create a separate non-chunking customization layer such
+ as mydocbook.xsl that imports the original docbook.xsl and
+ customizes any presentation templates. Then your chunking
+ customization should import mydocbook.xsl instead of
+ docbook.xsl. -->
+<xsl:import href="docbook.xsl"/>
+
+<!-- chunk-common.xsl contains all the named templates for chunking.
+ In a customization file, you import chunk-common.xsl, then
+ add any customized chunking templates of the same name.
+ They will have import precedence over the original
+ chunking templates in chunk-common.xsl. -->
+<xsl:import href="chunk-common.xsl"/>
+
+<!-- The manifest.xsl module is no longer imported because its
+ templates were moved into chunk-common and chunk-code -->
+
+<!-- chunk-code.xsl contains all the chunking templates that use
+ a match attribute. In a customization it should be referenced
+ using <xsl:include> instead of <xsl:import>, and then add
+ any customized chunking templates with match attributes. But be sure
+ to add a priority="1" to such customized templates to resolve
+ its conflict with the original, since they have the
+ same import precedence.
+
+ Using xsl:include prevents adding another layer
+ of import precedence, which would cause any
+ customizations that use xsl:apply-imports to wrongly
+ apply the chunking version instead of the original
+ non-chunking version to format an element. -->
+<xsl:include href="profile-chunk-code.xsl"/>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/profile-docbook.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/profile-docbook.xsl
new file mode 100644
index 0000000..652fbb7
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/profile-docbook.xsl
@@ -0,0 +1,408 @@
+<?xml version="1.0" encoding="ASCII"?>
+<!--This file was created automatically by html2xhtml-->
+<!--from the HTML stylesheets.-->
+<!--This file was created automatically by xsl2profile-->
+<!--from the DocBook XSL stylesheets.-->
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ng="http://docbook.org/docbook-ng" xmlns:db="http://docbook.org/ns/docbook" xmlns:exsl="http://exslt.org/common" xmlns:exslt="http://exslt.org/common" xmlns="http://www.w3.org/1999/xhtml" exslt:dummy="dummy" ng:dummy="dummy" db:dummy="dummy" extension-element-prefixes="exslt" exclude-result-prefixes="db ng exsl exslt exslt" version="1.0">
+
+<xsl:output method="xml" encoding="UTF-8" indent="no" doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN" doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"/>
+
+<!-- ********************************************************************
+ $Id: docbook.xsl 8783 2010-07-28 10:59:39Z mzjn $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<!-- ==================================================================== -->
+
+<xsl:include href="../VERSION"/>
+<xsl:include href="param.xsl"/>
+<xsl:include href="../lib/lib.xsl"/>
+<xsl:include href="../common/l10n.xsl"/>
+<xsl:include href="../common/common.xsl"/>
+<xsl:include href="../common/utility.xsl"/>
+<xsl:include href="../common/labels.xsl"/>
+<xsl:include href="../common/titles.xsl"/>
+<xsl:include href="../common/subtitles.xsl"/>
+<xsl:include href="../common/gentext.xsl"/>
+<xsl:include href="../common/targets.xsl"/>
+<xsl:include href="../common/olink.xsl"/>
+<xsl:include href="../common/pi.xsl"/>
+<xsl:include href="autotoc.xsl"/>
+<xsl:include href="autoidx.xsl"/>
+<xsl:include href="lists.xsl"/>
+<xsl:include href="callout.xsl"/>
+<xsl:include href="verbatim.xsl"/>
+<xsl:include href="graphics.xsl"/>
+<xsl:include href="xref.xsl"/>
+<xsl:include href="formal.xsl"/>
+<xsl:include href="table.xsl"/>
+<xsl:include href="htmltbl.xsl"/>
+<xsl:include href="sections.xsl"/>
+<xsl:include href="inline.xsl"/>
+<xsl:include href="footnote.xsl"/>
+<xsl:include href="html.xsl"/>
+<xsl:include href="info.xsl"/>
+<xsl:include href="keywords.xsl"/>
+<xsl:include href="division.xsl"/>
+<xsl:include href="toc.xsl"/>
+<xsl:include href="index.xsl"/>
+<xsl:include href="refentry.xsl"/>
+<xsl:include href="math.xsl"/>
+<xsl:include href="admon.xsl"/>
+<xsl:include href="component.xsl"/>
+<xsl:include href="biblio.xsl"/>
+<xsl:include href="biblio-iso690.xsl"/>
+<xsl:include href="glossary.xsl"/>
+<xsl:include href="block.xsl"/>
+<xsl:include href="task.xsl"/>
+<xsl:include href="qandaset.xsl"/>
+<xsl:include href="synop.xsl"/>
+<xsl:include href="titlepage.xsl"/>
+<xsl:include href="titlepage.templates.xsl"/>
+<xsl:include href="pi.xsl"/>
+<xsl:include href="ebnf.xsl"/>
+<xsl:include href="chunker.xsl"/>
+<xsl:include href="html-rtf.xsl"/>
+<xsl:include href="annotations.xsl"/>
+<xsl:include href="../common/stripns.xsl"/>
+
+<xsl:param name="stylesheet.result.type" select="'xhtml'"/>
+<xsl:param name="htmlhelp.output" select="0"/>
+
+<!-- ==================================================================== -->
+
+<xsl:key name="id" match="*" use="@id|@xml:id"/>
+<xsl:key name="gid" match="*" use="generate-id()"/>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="*">
+ <xsl:message>
+ <xsl:text>Element </xsl:text>
+ <xsl:value-of select="local-name(.)"/>
+ <xsl:text> in namespace '</xsl:text>
+ <xsl:value-of select="namespace-uri(.)"/>
+ <xsl:text>' encountered</xsl:text>
+ <xsl:if test="parent::*">
+ <xsl:text> in </xsl:text>
+ <xsl:value-of select="name(parent::*)"/>
+ </xsl:if>
+ <xsl:text>, but no template matches.</xsl:text>
+ </xsl:message>
+
+ <span style="color: red">
+ <xsl:text>&lt;</xsl:text>
+ <xsl:value-of select="name(.)"/>
+ <xsl:text>&gt;</xsl:text>
+ <xsl:apply-templates/>
+ <xsl:text>&lt;/</xsl:text>
+ <xsl:value-of select="name(.)"/>
+ <xsl:text>&gt;</xsl:text>
+ </span>
+</xsl:template>
+
+<xsl:template match="text()">
+ <xsl:value-of select="."/>
+</xsl:template>
+
+<xsl:template name="body.attributes"><xslo:if xmlns:xslo="http://www.w3.org/1999/XSL/Transform" test="starts-with($writing.mode, 'rl')"><xslo:attribute name="dir">rtl</xslo:attribute></xslo:if>
+<!-- no apply-templates; make it empty except for dir for rtl-->
+</xsl:template>
+
+<xsl:template name="head.content">
+ <xsl:param name="node" select="."/>
+ <xsl:param name="title">
+ <xsl:apply-templates select="$node" mode="object.title.markup.textonly"/>
+ </xsl:param>
+
+ <title>
+ <xsl:copy-of select="$title"/>
+ </title>
+
+ <xsl:if test="$html.base != ''">
+ <base href="{$html.base}"/>
+ </xsl:if>
+
+ <!-- Insert links to CSS files or insert literal style elements -->
+ <xsl:call-template name="generate.css"/>
+
+ <xsl:if test="$html.stylesheet != ''">
+ <xsl:call-template name="output.html.stylesheets">
+ <xsl:with-param name="stylesheets" select="normalize-space($html.stylesheet)"/>
+ </xsl:call-template>
+ </xsl:if>
+
+ <xsl:if test="$link.mailto.url != ''">
+ <link rev="made" href="{$link.mailto.url}"/>
+ </xsl:if>
+
+ <meta name="generator" content="DocBook {$DistroTitle} V{$VERSION}"/>
+
+ <xsl:if test="$generate.meta.abstract != 0">
+ <xsl:variable name="info" select="(articleinfo |bookinfo |prefaceinfo |chapterinfo |appendixinfo |sectioninfo |sect1info |sect2info |sect3info |sect4info |sect5info |referenceinfo |refentryinfo |partinfo |info |docinfo)[1]"/>
+ <xsl:if test="$info and $info/abstract">
+ <meta name="description">
+ <xsl:attribute name="content">
+ <xsl:for-each select="$info/abstract[1]/*">
+ <xsl:value-of select="normalize-space(.)"/>
+ <xsl:if test="position() &lt; last()">
+ <xsl:text> </xsl:text>
+ </xsl:if>
+ </xsl:for-each>
+ </xsl:attribute>
+ </meta>
+ </xsl:if>
+ </xsl:if>
+
+ <xsl:if test="($draft.mode = 'yes' or ($draft.mode = 'maybe' and ancestor-or-self::*[@status][1]/@status = 'draft')) and $draft.watermark.image != ''">
+ <style type="text/css"><xsl:text>
+body { background-image: url('</xsl:text>
+<xsl:value-of select="$draft.watermark.image"/><xsl:text>');
+ background-repeat: no-repeat;
+ background-position: top left;
+ /* The following properties make the watermark "fixed" on the page. */
+ /* I think that's just a bit too distracting for the reader... */
+ /* background-attachment: fixed; */
+ /* background-position: center center; */
+ }</xsl:text>
+ </style>
+ </xsl:if>
+ <xsl:apply-templates select="." mode="head.keywords.content"/>
+</xsl:template>
+
+<xsl:template name="output.html.stylesheets">
+ <xsl:param name="stylesheets" select="''"/>
+
+ <xsl:choose>
+ <xsl:when test="contains($stylesheets, ' ')">
+ <xsl:variable name="css.filename" select="substring-before($stylesheets, ' ')"/>
+
+ <xsl:call-template name="make.css.link">
+ <xsl:with-param name="css.filename" select="$css.filename"/>
+ </xsl:call-template>
+
+ <xsl:call-template name="output.html.stylesheets">
+ <xsl:with-param name="stylesheets" select="substring-after($stylesheets, ' ')"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="$stylesheets != ''">
+ <xsl:call-template name="make.css.link">
+ <xsl:with-param name="css.filename" select="$stylesheets"/>
+ </xsl:call-template>
+ </xsl:when>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ============================================================ -->
+
+<xsl:template match="*" mode="head.keywords.content">
+ <xsl:apply-templates select="chapterinfo/keywordset" mode="html.header"/>
+ <xsl:apply-templates select="appendixinfo/keywordset" mode="html.header"/>
+ <xsl:apply-templates select="prefaceinfo/keywordset" mode="html.header"/>
+ <xsl:apply-templates select="bookinfo/keywordset" mode="html.header"/>
+ <xsl:apply-templates select="setinfo/keywordset" mode="html.header"/>
+ <xsl:apply-templates select="articleinfo/keywordset" mode="html.header"/>
+ <xsl:apply-templates select="artheader/keywordset" mode="html.header"/>
+ <xsl:apply-templates select="sect1info/keywordset" mode="html.header"/>
+ <xsl:apply-templates select="sect2info/keywordset" mode="html.header"/>
+ <xsl:apply-templates select="sect3info/keywordset" mode="html.header"/>
+ <xsl:apply-templates select="sect4info/keywordset" mode="html.header"/>
+ <xsl:apply-templates select="sect5info/keywordset" mode="html.header"/>
+ <xsl:apply-templates select="sectioninfo/keywordset" mode="html.header"/>
+ <xsl:apply-templates select="refsect1info/keywordset" mode="html.header"/>
+ <xsl:apply-templates select="refsect2info/keywordset" mode="html.header"/>
+ <xsl:apply-templates select="refsect3info/keywordset" mode="html.header"/>
+ <xsl:apply-templates select="bibliographyinfo/keywordset" mode="html.header"/>
+ <xsl:apply-templates select="glossaryinfo/keywordset" mode="html.header"/>
+ <xsl:apply-templates select="indexinfo/keywordset" mode="html.header"/>
+ <xsl:apply-templates select="refentryinfo/keywordset" mode="html.header"/>
+ <xsl:apply-templates select="partinfo/keywordset" mode="html.header"/>
+ <xsl:apply-templates select="referenceinfo/keywordset" mode="html.header"/>
+ <xsl:apply-templates select="docinfo/keywordset" mode="html.header"/>
+ <xsl:apply-templates select="info/keywordset" mode="html.header"/>
+
+ <xsl:if test="$inherit.keywords != 0 and parent::*">
+ <xsl:apply-templates select="parent::*" mode="head.keywords.content"/>
+ </xsl:if>
+</xsl:template>
+
+<!-- ============================================================ -->
+
+<xsl:template name="system.head.content">
+ <xsl:param name="node" select="."/>
+
+ <!-- FIXME: When chunking, only the annotations actually used
+ in this chunk should be referenced. I don't think it
+ does any harm to reference them all, but it adds
+ unnecessary bloat to each chunk. -->
+ <xsl:if test="$annotation.support != 0 and //annotation">
+ <xsl:call-template name="add.annotation.links"/>
+ <script type="text/javascript">
+ <xsl:text>
+// Create PopupWindow objects</xsl:text>
+ <xsl:for-each select="//annotation">
+ <xsl:text>
+var popup_</xsl:text>
+ <xsl:value-of select="generate-id(.)"/>
+ <xsl:text> = new PopupWindow("popup-</xsl:text>
+ <xsl:value-of select="generate-id(.)"/>
+ <xsl:text>");
+</xsl:text>
+ <xsl:text>popup_</xsl:text>
+ <xsl:value-of select="generate-id(.)"/>
+ <xsl:text>.offsetY = 15;
+</xsl:text>
+ <xsl:text>popup_</xsl:text>
+ <xsl:value-of select="generate-id(.)"/>
+ <xsl:text>.autoHide();
+</xsl:text>
+ </xsl:for-each>
+ </script>
+
+ <style type="text/css">
+ <xsl:value-of select="$annotation.css"/>
+ </style>
+ </xsl:if>
+
+ <!-- system.head.content is like user.head.content, except that
+ it is called before head.content. This is important because it
+ means, for example, that <style> elements output by system.head.content
+ have a lower CSS precedence than the users stylesheet. -->
+</xsl:template>
+
+<!-- ============================================================ -->
+
+<xsl:template name="user.preroot">
+ <!-- Pre-root output, can be used to output comments and PIs. -->
+ <!-- This must not output any element content! -->
+</xsl:template>
+
+<xsl:template name="user.head.content">
+ <xsl:param name="node" select="."/>
+</xsl:template>
+
+<xsl:template name="user.header.navigation">
+ <xsl:param name="node" select="."/>
+</xsl:template>
+
+<xsl:template name="user.header.content">
+ <xsl:param name="node" select="."/>
+</xsl:template>
+
+<xsl:template name="user.footer.content">
+ <xsl:param name="node" select="."/>
+</xsl:template>
+
+<xsl:template name="user.footer.navigation">
+ <xsl:param name="node" select="."/>
+</xsl:template>
+
+<xslo:include xmlns:xslo="http://www.w3.org/1999/XSL/Transform" href="../profiling/profile-mode.xsl"/><xslo:variable xmlns:xslo="http://www.w3.org/1999/XSL/Transform" name="profiled-content"><xslo:choose><xslo:when test="*/self::ng:* or */self::db:*"><xslo:message>Note: namesp. cut : stripped namespace before processing</xslo:message><xslo:variable name="stripped-content"><xslo:apply-templates select="/" mode="stripNS"/></xslo:variable><xslo:message>Note: namesp. cut : processing stripped document</xslo:message><xslo:apply-templates select="exslt:node-set($stripped-content)" mode="profile"/></xslo:when><xslo:otherwise><xslo:apply-templates select="/" mode="profile"/></xslo:otherwise></xslo:choose></xslo:variable><xslo:variable xmlns:xslo="http://www.w3.org/1999/XSL/Transform" name="profiled-nodes" select="exslt:node-set($profiled-content)"/><xsl:template match="/">
+ <!-- * Get a title for current doc so that we let the user -->
+ <!-- * know what document we are processing at this point. -->
+ <xsl:variable name="doc.title">
+ <xsl:call-template name="get.doc.title"/>
+ </xsl:variable>
+ <xsl:choose>
+ <!-- Hack! If someone hands us a DocBook V5.x or DocBook NG document,
+ toss the namespace and continue. Use the docbook5 namespaced
+ stylesheets for DocBook5 if you don't want to use this feature.-->
+ <!-- include extra test for Xalan quirk -->
+ <xsl:when test="false()"/>
+ <!-- Can't process unless namespace removed -->
+ <xsl:when test="false()"/>
+ <xsl:otherwise>
+ <xsl:choose>
+ <xsl:when test="$rootid != ''">
+ <xsl:choose>
+ <xsl:when test="count($profiled-nodes//*[@id=$rootid]) = 0">
+ <xsl:message terminate="yes">
+ <xsl:text>ID '</xsl:text>
+ <xsl:value-of select="$rootid"/>
+ <xsl:text>' not found in document.</xsl:text>
+ </xsl:message>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:if test="$collect.xref.targets = 'yes' or $collect.xref.targets = 'only'">
+ <xsl:apply-templates select="key('id', $rootid)" mode="collect.targets"/>
+ </xsl:if>
+ <xsl:if test="$collect.xref.targets != 'only'">
+ <xsl:apply-templates select="$profiled-nodes//*[@id=$rootid]" mode="process.root"/>
+ <xsl:if test="$tex.math.in.alt != ''">
+ <xsl:apply-templates select="$profiled-nodes//*[@id=$rootid]" mode="collect.tex.math"/>
+ </xsl:if>
+ </xsl:if>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:if test="$collect.xref.targets = 'yes' or $collect.xref.targets = 'only'">
+ <xsl:apply-templates select="$profiled-nodes" mode="collect.targets"/>
+ </xsl:if>
+ <xsl:if test="$collect.xref.targets != 'only'">
+ <xsl:apply-templates select="$profiled-nodes" mode="process.root"/>
+ <xsl:if test="$tex.math.in.alt != ''">
+ <xsl:apply-templates select="$profiled-nodes" mode="collect.tex.math"/>
+ </xsl:if>
+ </xsl:if>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="*" mode="process.root">
+ <xsl:variable name="doc" select="self::*"/>
+
+ <xsl:call-template name="user.preroot"/>
+ <xsl:call-template name="root.messages"/>
+
+ <html>
+ <head>
+ <xsl:call-template name="system.head.content">
+ <xsl:with-param name="node" select="$doc"/>
+ </xsl:call-template>
+ <xsl:call-template name="head.content">
+ <xsl:with-param name="node" select="$doc"/>
+ </xsl:call-template>
+ <xsl:call-template name="user.head.content">
+ <xsl:with-param name="node" select="$doc"/>
+ </xsl:call-template>
+ </head>
+ <body>
+ <xsl:call-template name="body.attributes"/>
+ <xsl:call-template name="user.header.content">
+ <xsl:with-param name="node" select="$doc"/>
+ </xsl:call-template>
+ <xsl:apply-templates select="."/>
+ <xsl:call-template name="user.footer.content">
+ <xsl:with-param name="node" select="$doc"/>
+ </xsl:call-template>
+ </body>
+ </html>
+ <xsl:value-of select="$html.append"/>
+
+ <!-- Generate any css files only once, not once per chunk -->
+ <xsl:call-template name="generate.css.files"/>
+</xsl:template>
+
+<xsl:template name="root.messages">
+ <!-- redefine this any way you'd like to output messages -->
+ <!-- DO NOT OUTPUT ANYTHING FROM THIS TEMPLATE -->
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template name="chunk">
+ <xsl:param name="node" select="."/>
+
+ <!-- The default is that we are not chunking... -->
+ <xsl:text>0</xsl:text>
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/profile-onechunk.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/profile-onechunk.xsl
new file mode 100644
index 0000000..b84b3e9
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/profile-onechunk.xsl
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="ASCII"?>
+<!--This file was created automatically by html2xhtml-->
+<!--from the HTML stylesheets.-->
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:doc="http://nwalsh.com/xsl/documentation/1.0" xmlns="http://www.w3.org/1999/xhtml" version="1.0" exclude-result-prefixes="doc">
+
+<!-- ********************************************************************
+ $Id: profile-onechunk.xsl 6910 2007-06-28 23:23:30Z xmldoc $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<!-- ==================================================================== -->
+
+<xsl:import href="profile-chunk.xsl"/>
+
+<!-- Ok, using the onechunk parameter makes this all work again. -->
+<!-- It does have the disadvantage that it only works for documents that have -->
+<!-- a root element that is considered a chunk by the chunk.xsl stylesheet. -->
+<!-- Ideally, onechunk would let anything be a chunk. But not today. -->
+
+<xsl:param name="onechunk" select="1"/>
+<xsl:param name="suppress.navigation">1</xsl:param>
+
+<xsl:template name="href.target.uri">
+ <xsl:param name="object" select="."/>
+ <xsl:text>#</xsl:text>
+ <xsl:call-template name="object.id">
+ <xsl:with-param name="object" select="$object"/>
+ </xsl:call-template>
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/qandaset.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/qandaset.xsl
new file mode 100644
index 0000000..4a61c81
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/qandaset.xsl
@@ -0,0 +1,420 @@
+<?xml version="1.0" encoding="ASCII"?>
+<!--This file was created automatically by html2xhtml-->
+<!--from the HTML stylesheets.-->
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:doc="http://nwalsh.com/xsl/documentation/1.0" xmlns="http://www.w3.org/1999/xhtml" exclude-result-prefixes="doc" version="1.0">
+
+<!-- ********************************************************************
+ $Id: qandaset.xsl 8421 2009-05-04 07:49:49Z bobstayton $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<!-- ==================================================================== -->
+
+<xsl:template match="qandaset">
+ <xsl:variable name="title" select="(blockinfo/title|info/title|title)[1]"/>
+ <xsl:variable name="preamble" select="*[local-name(.) != 'title' and local-name(.) != 'titleabbrev' and local-name(.) != 'qandadiv' and local-name(.) != 'qandaentry']"/>
+ <xsl:variable name="toc">
+ <xsl:call-template name="pi.dbhtml_toc"/>
+ </xsl:variable>
+
+ <xsl:variable name="toc.params">
+ <xsl:call-template name="find.path.params">
+ <xsl:with-param name="table" select="normalize-space($generate.toc)"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <div>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates select="$title"/>
+ <xsl:if test="not($title)">
+ <!-- id is output on title if there is one -->
+ <xsl:call-template name="anchor">
+ <xsl:with-param name="conditional" select="0"/>
+ </xsl:call-template>
+ </xsl:if>
+ <xsl:if test="((contains($toc.params, 'toc') and $toc != '0') or $toc = '1') and not(ancestor::answer and not($qanda.nested.in.toc=0))">
+ <xsl:call-template name="process.qanda.toc"/>
+ </xsl:if>
+ <xsl:apply-templates select="$preamble"/>
+ <xsl:call-template name="process.qandaset"/>
+ </div>
+</xsl:template>
+
+<xsl:template match="qandaset/blockinfo/title| qandaset/info/title| qandaset/title">
+ <xsl:variable name="qalevel">
+ <xsl:call-template name="qanda.section.level"/>
+ </xsl:variable>
+ <xsl:element name="h{string(number($qalevel)+1)}" namespace="http://www.w3.org/1999/xhtml">
+ <xsl:attribute name="class">
+ <xsl:value-of select="local-name(.)"/>
+ </xsl:attribute>
+ <xsl:call-template name="anchor">
+ <xsl:with-param name="node" select=".."/>
+ <xsl:with-param name="conditional" select="0"/>
+ </xsl:call-template>
+ <xsl:apply-templates/>
+ </xsl:element>
+</xsl:template>
+
+<xsl:template match="qandaset/blockinfo|qandaset/info">
+ <!-- what should this template really do? -->
+ <xsl:apply-templates select="legalnotice" mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="qandadiv">
+ <xsl:variable name="preamble" select="*[local-name(.) != 'title' and local-name(.) != 'titleabbrev' and local-name(.) != 'qandadiv' and local-name(.) != 'qandaentry']"/>
+
+ <xsl:if test="blockinfo/title|info/title|title">
+ <tr class="qandadiv">
+ <td align="{$direction.align.start}" valign="top" colspan="2">
+ <xsl:apply-templates select="(blockinfo/title|info/title|title)[1]"/>
+ </td>
+ </tr>
+ </xsl:if>
+
+ <xsl:variable name="toc">
+ <xsl:call-template name="pi.dbhtml_toc"/>
+ </xsl:variable>
+
+ <xsl:variable name="toc.params">
+ <xsl:call-template name="find.path.params">
+ <xsl:with-param name="table" select="normalize-space($generate.toc)"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:if test="(contains($toc.params, 'toc') and $toc != '0') or $toc = '1'">
+ <tr class="toc">
+ <td align="{$direction.align.start}" valign="top" colspan="2">
+ <xsl:call-template name="process.qanda.toc"/>
+ </td>
+ </tr>
+ </xsl:if>
+ <xsl:if test="$preamble">
+ <tr class="toc">
+ <td align="{$direction.align.start}" valign="top" colspan="2">
+ <xsl:apply-templates select="$preamble"/>
+ </td>
+ </tr>
+ </xsl:if>
+ <xsl:apply-templates select="qandadiv|qandaentry"/>
+</xsl:template>
+
+<xsl:template match="qandadiv/blockinfo/title| qandadiv/info/title| qandadiv/title">
+ <xsl:variable name="qalevel">
+ <xsl:call-template name="qandadiv.section.level"/>
+ </xsl:variable>
+
+ <xsl:element name="h{string(number($qalevel)+1)}" namespace="http://www.w3.org/1999/xhtml">
+ <xsl:attribute name="class">
+ <xsl:value-of select="local-name(.)"/>
+ </xsl:attribute>
+ <xsl:call-template name="anchor">
+ <xsl:with-param name="node" select=".."/>
+ <xsl:with-param name="conditional" select="0"/>
+ </xsl:call-template>
+ <xsl:apply-templates select="parent::qandadiv" mode="label.markup"/>
+ <xsl:if test="$qandadiv.autolabel != 0">
+ <xsl:apply-templates select="." mode="intralabel.punctuation"/>
+ <xsl:text> </xsl:text>
+ </xsl:if>
+ <xsl:apply-templates/>
+ </xsl:element>
+</xsl:template>
+
+<xsl:template match="qandaentry">
+ <xsl:apply-templates/>
+</xsl:template>
+
+<xsl:template match="question">
+ <xsl:variable name="deflabel">
+ <xsl:apply-templates select="." mode="qanda.defaultlabel"/>
+ </xsl:variable>
+
+ <tr>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <td align="{$direction.align.start}" valign="top">
+ <xsl:call-template name="anchor">
+ <xsl:with-param name="node" select=".."/>
+ <xsl:with-param name="conditional" select="0"/>
+ </xsl:call-template>
+ <xsl:call-template name="anchor">
+ <xsl:with-param name="conditional" select="0"/>
+ </xsl:call-template>
+
+ <xsl:variable name="label.content">
+ <xsl:apply-templates select="." mode="qanda.label"/>
+ </xsl:variable>
+
+ <xsl:if test="string-length($label.content) &gt; 0">
+ <p><strong xmlns:xslo="http://www.w3.org/1999/XSL/Transform">
+ <xsl:copy-of select="$label.content"/>
+ </strong></p>
+ </xsl:if>
+ </td>
+ <td align="{$direction.align.start}" valign="top">
+ <xsl:choose>
+ <xsl:when test="$deflabel = 'none' and not(label)">
+ <strong xmlns:xslo="http://www.w3.org/1999/XSL/Transform"><xsl:apply-templates select="*[local-name(.) != 'label']"/></strong>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="*[local-name(.) != 'label']"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </td>
+ </tr>
+</xsl:template>
+
+<xsl:template match="*" mode="qanda.defaultlabel">
+ <xsl:choose>
+ <xsl:when test="ancestor-or-self::*[@defaultlabel]">
+ <xsl:value-of select="(ancestor-or-self::*[@defaultlabel])[last()] /@defaultlabel"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$qanda.defaultlabel"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="question" mode="qanda.label">
+ <xsl:variable name="deflabel">
+ <xsl:apply-templates select="." mode="qanda.defaultlabel"/>
+ </xsl:variable>
+ <xsl:apply-templates select="." mode="label.markup"/>
+ <xsl:if test="contains($deflabel, 'number') and not(label)">
+ <xsl:apply-templates select="." mode="intralabel.punctuation"/>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="answer">
+ <xsl:variable name="deflabel">
+ <xsl:apply-templates select="." mode="qanda.defaultlabel"/>
+ </xsl:variable>
+
+ <tr class="{local-name(.)}">
+ <td align="{$direction.align.start}" valign="top">
+ <xsl:call-template name="anchor"/>
+ <xsl:variable name="answer.label">
+ <xsl:apply-templates select="." mode="label.markup"/>
+ </xsl:variable>
+ <xsl:if test="string-length($answer.label) &gt; 0">
+ <p><strong xmlns:xslo="http://www.w3.org/1999/XSL/Transform">
+ <xsl:copy-of select="$answer.label"/>
+ </strong></p>
+ </xsl:if>
+ </td>
+ <td align="{$direction.align.start}" valign="top">
+ <xsl:apply-templates select="*[local-name(.) != 'label' and local-name(.) != 'qandaentry']"/>
+ <!-- * handle nested answer/qandaentry instances -->
+ <!-- * (bug 1509043 from Daniel Leidert) -->
+ <xsl:if test="descendant::question">
+ <xsl:call-template name="process.qandaset"/>
+ </xsl:if>
+ </td>
+ </tr>
+</xsl:template>
+
+<xsl:template match="answer" mode="qanda.label">
+ <xsl:apply-templates select="." mode="label.markup"/>
+</xsl:template>
+
+<xsl:template match="label">
+ <xsl:apply-templates/>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template name="process.qanda.toc">
+ <!-- * if user wants nested qandaset and qandaentry in main Qandaset TOC, -->
+ <!-- * then don't also include the nested stuff in the sub TOCs -->
+ <dl>
+ <xsl:apply-templates select="qandadiv" mode="qandatoc.mode"/>
+ <xsl:apply-templates select="qandaset|qandaentry" mode="qandatoc.mode"/>
+ </dl>
+</xsl:template>
+
+<xsl:template match="qandadiv" mode="qandatoc.mode">
+ <dt><xsl:apply-templates select="title" mode="qandatoc.mode"/></dt>
+ <dd><xsl:call-template name="process.qanda.toc"/></dd>
+</xsl:template>
+
+<xsl:template match="qandadiv/blockinfo/title| qandadiv/info/title| qandadiv/title" mode="qandatoc.mode">
+ <xsl:variable name="qalevel">
+ <xsl:call-template name="qandadiv.section.level"/>
+ </xsl:variable>
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id">
+ <xsl:with-param name="object" select="parent::*"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="div.label">
+ <xsl:apply-templates select="parent::qandadiv" mode="label.markup"/>
+ </xsl:variable>
+ <xsl:if test="string-length($div.label) != 0">
+ <xsl:copy-of select="$div.label"/>
+ <xsl:value-of select="$autotoc.label.separator"/>
+ </xsl:if>
+ <xsl:text> </xsl:text>
+ <a>
+ <xsl:attribute name="href">
+ <xsl:call-template name="href.target">
+ <xsl:with-param name="object" select="parent::*"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:apply-templates/>
+ </a>
+</xsl:template>
+
+<xsl:template match="qandaset" mode="qandatoc.mode">
+ <xsl:for-each select="qandaentry">
+ <xsl:apply-templates select="." mode="qandatoc.mode"/>
+ </xsl:for-each>
+</xsl:template>
+
+<xsl:template match="qandaentry" mode="qandatoc.mode">
+ <xsl:apply-templates select="question" mode="qandatoc.mode"/>
+</xsl:template>
+
+<xsl:template match="question" mode="qandatoc.mode">
+ <xsl:variable name="firstch">
+ <!-- Use a titleabbrev or title if available -->
+ <xsl:choose>
+ <xsl:when test="../blockinfo/titleabbrev">
+ <xsl:apply-templates select="../blockinfo/titleabbrev[1]/node()"/>
+ </xsl:when>
+ <xsl:when test="../blockinfo/title">
+ <xsl:apply-templates select="../blockinfo/title[1]/node()"/>
+ </xsl:when>
+ <xsl:when test="../info/titleabbrev">
+ <xsl:apply-templates select="../info/titleabbrev[1]/node()"/>
+ </xsl:when>
+ <xsl:when test="../titleabbrev">
+ <xsl:apply-templates select="../titleabbrev[1]/node()"/>
+ </xsl:when>
+ <xsl:when test="../info/title">
+ <xsl:apply-templates select="../info/title[1]/node()"/>
+ </xsl:when>
+ <xsl:when test="../title">
+ <xsl:apply-templates select="../title[1]/node()"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="(*[local-name(.)!='label'])[1]/node()"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:variable name="deflabel">
+ <xsl:choose>
+ <xsl:when test="ancestor-or-self::*[@defaultlabel]">
+ <xsl:value-of select="(ancestor-or-self::*[@defaultlabel])[last()] /@defaultlabel"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$qanda.defaultlabel"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <dt>
+ <xsl:apply-templates select="." mode="label.markup"/>
+ <xsl:if test="contains($deflabel,'number') and not(label)">
+ <xsl:apply-templates select="." mode="intralabel.punctuation"/>
+ </xsl:if>
+ <xsl:text> </xsl:text>
+ <a>
+ <xsl:attribute name="href">
+ <xsl:call-template name="href.target">
+ <xsl:with-param name="object" select=".."/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:value-of select="$firstch"/>
+ </a>
+ </dt>
+ <!-- * include nested qandaset/qandaentry in TOC if user wants it -->
+ <xsl:if test="not($qanda.nested.in.toc = 0)">
+ <xsl:apply-templates select="following-sibling::answer" mode="qandatoc.mode"/>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="answer" mode="qandatoc.mode">
+ <xsl:if test="descendant::question">
+ <dd>
+ <xsl:call-template name="process.qanda.toc"/>
+ </dd>
+ </xsl:if>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template name="process.qandaset">
+
+ <xsl:variable name="deflabel">
+ <xsl:apply-templates select="." mode="qanda.defaultlabel"/>
+ </xsl:variable>
+
+ <xsl:variable name="label-width">
+ <xsl:call-template name="pi.dbhtml_label-width"/>
+ </xsl:variable>
+
+ <xsl:variable name="table-summary">
+ <xsl:call-template name="pi.dbhtml_table-summary"/>
+ </xsl:variable>
+
+ <xsl:variable name="cellpadding">
+ <xsl:call-template name="pi.dbhtml_cellpadding"/>
+ </xsl:variable>
+
+ <xsl:variable name="cellspacing">
+ <xsl:call-template name="pi.dbhtml_cellspacing"/>
+ </xsl:variable>
+
+ <table border="0" width="100%" summary="Q and A Set">
+ <xsl:if test="$table-summary != ''">
+ <xsl:attribute name="summary">
+ <xsl:value-of select="$table-summary"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:if test="$cellpadding != ''">
+ <xsl:attribute name="cellpadding">
+ <xsl:value-of select="$cellpadding"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:if test="$cellspacing != ''">
+ <xsl:attribute name="cellspacing">
+ <xsl:value-of select="$cellspacing"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <col align="{$direction.align.start}">
+ <xsl:attribute name="width">
+ <xsl:choose>
+ <xsl:when test="$label-width != ''">
+ <xsl:value-of select="$label-width"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text>1%</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:attribute>
+ </col>
+ <col/>
+ <tbody>
+ <xsl:apply-templates select="qandaentry|qandadiv"/>
+ </tbody>
+ </table>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="*" mode="no.wrapper.mode">
+ <xsl:apply-templates/>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/refentry.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/refentry.xsl
new file mode 100644
index 0000000..dc2e57d
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/refentry.xsl
@@ -0,0 +1,299 @@
+<?xml version="1.0" encoding="ASCII"?>
+<!--This file was created automatically by html2xhtml-->
+<!--from the HTML stylesheets.-->
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1999/xhtml" version="1.0">
+
+<!-- ********************************************************************
+ $Id: refentry.xsl 8421 2009-05-04 07:49:49Z bobstayton $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<!-- ==================================================================== -->
+
+<xsl:template match="reference">
+ <xsl:call-template name="id.warning"/>
+
+ <div>
+ <xsl:call-template name="common.html.attributes">
+ <xsl:with-param name="inherit" select="1"/>
+ </xsl:call-template>
+ <xsl:if test="$generate.id.attributes != 0">
+ <xsl:attribute name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:call-template name="reference.titlepage"/>
+
+ <xsl:variable name="toc.params">
+ <xsl:call-template name="find.path.params">
+ <xsl:with-param name="table" select="normalize-space($generate.toc)"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:if test="not(partintro) and contains($toc.params, 'toc')">
+ <xsl:call-template name="division.toc"/>
+ </xsl:if>
+ <xsl:apply-templates/>
+ </div>
+</xsl:template>
+
+<xsl:template match="reference" mode="division.number">
+ <xsl:number from="book" count="reference" format="I."/>
+</xsl:template>
+
+<xsl:template match="reference/docinfo"/>
+<xsl:template match="reference/referenceinfo"/>
+<xsl:template match="reference/title"/>
+<xsl:template match="reference/subtitle"/>
+<xsl:template match="reference/titleabbrev"/>
+
+<!-- ==================================================================== -->
+
+<xsl:template name="refentry.title">
+ <xsl:param name="node" select="."/>
+ <xsl:variable name="refmeta" select="$node//refmeta"/>
+ <xsl:variable name="refentrytitle" select="$refmeta//refentrytitle"/>
+ <xsl:variable name="refnamediv" select="$node//refnamediv"/>
+ <xsl:variable name="refname" select="$refnamediv//refname"/>
+ <xsl:variable name="refdesc" select="$refnamediv//refdescriptor"/>
+ <xsl:variable name="title">
+ <xsl:choose>
+ <xsl:when test="$refentrytitle">
+ <xsl:apply-templates select="$refentrytitle[1]" mode="title"/>
+ </xsl:when>
+ <xsl:when test="$refdesc">
+ <xsl:apply-templates select="$refdesc[1]" mode="title"/>
+ </xsl:when>
+ <xsl:when test="$refname">
+ <xsl:apply-templates select="$refname[1]" mode="title"/>
+ </xsl:when>
+ <xsl:otherwise/>
+ </xsl:choose>
+ </xsl:variable>
+
+ <h1 class="title">
+ <xsl:copy-of select="$title"/>
+ </h1>
+</xsl:template>
+
+<xsl:template match="refentry">
+ <xsl:call-template name="id.warning"/>
+
+ <div>
+ <xsl:call-template name="common.html.attributes">
+ <xsl:with-param name="inherit" select="1"/>
+ </xsl:call-template>
+ <xsl:if test="$refentry.separator != 0 and preceding-sibling::refentry">
+ <div class="refentry.separator">
+ <hr/>
+ </div>
+ </xsl:if>
+ <xsl:call-template name="anchor">
+ <xsl:with-param name="conditional" select="0"/>
+ </xsl:call-template>
+ <xsl:call-template name="refentry.titlepage"/>
+ <xsl:apply-templates/>
+ <xsl:call-template name="process.footnotes"/>
+ </div>
+</xsl:template>
+
+<xsl:template match="refentry/docinfo|refentry/refentryinfo"/>
+<xsl:template match="refentry/info"/>
+
+<xsl:template match="refentrytitle|refname|refdescriptor" mode="title">
+ <xsl:apply-templates/>
+</xsl:template>
+
+<xsl:template match="refmeta">
+</xsl:template>
+
+<xsl:template match="manvolnum">
+ <xsl:if test="$refentry.xref.manvolnum != 0">
+ <xsl:text>(</xsl:text>
+ <xsl:apply-templates/>
+ <xsl:text>)</xsl:text>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="refmiscinfo">
+</xsl:template>
+
+<xsl:template match="refentrytitle">
+ <xsl:call-template name="inline.charseq"/>
+</xsl:template>
+
+<xsl:template match="refnamediv">
+ <div>
+ <xsl:call-template name="common.html.attributes">
+ <xsl:with-param name="inherit" select="1"/>
+ </xsl:call-template>
+ <xsl:call-template name="anchor"/>
+
+ <xsl:choose>
+ <xsl:when test="preceding-sibling::refnamediv">
+ <!-- no title on secondary refnamedivs! -->
+ </xsl:when>
+ <xsl:when test="$refentry.generate.name != 0">
+ <h2>
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'RefName'"/>
+ </xsl:call-template>
+ </h2>
+ </xsl:when>
+ <xsl:when test="$refentry.generate.title != 0">
+ <h2>
+ <xsl:choose>
+ <xsl:when test="../refmeta/refentrytitle">
+ <xsl:apply-templates select="../refmeta/refentrytitle"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="refname[1]"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </h2>
+ </xsl:when>
+ </xsl:choose>
+
+ <p>
+ <xsl:apply-templates/>
+ </p>
+ </div>
+</xsl:template>
+
+<xsl:template match="refname">
+ <xsl:if test="not(preceding-sibling::refdescriptor)">
+ <xsl:apply-templates/>
+ <xsl:if test="following-sibling::refname">
+ <xsl:text>, </xsl:text>
+ </xsl:if>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="refpurpose">
+ <xsl:if test="node()">
+ <xsl:text> </xsl:text>
+ <xsl:call-template name="dingbat">
+ <xsl:with-param name="dingbat">em-dash</xsl:with-param>
+ </xsl:call-template>
+ <xsl:text> </xsl:text>
+ <xsl:apply-templates/>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="refdescriptor">
+ <xsl:apply-templates/>
+</xsl:template>
+
+<xsl:template match="refclass">
+ <xsl:if test="$refclass.suppress = 0">
+ <strong xmlns:xslo="http://www.w3.org/1999/XSL/Transform">
+ <xsl:if test="@role">
+ <xsl:value-of select="@role"/>
+ <xsl:text>: </xsl:text>
+ </xsl:if>
+ <xsl:apply-templates/>
+ </strong>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="refsynopsisdiv">
+ <div>
+ <xsl:call-template name="common.html.attributes">
+ <xsl:with-param name="inherit" select="1"/>
+ </xsl:call-template>
+ <xsl:call-template name="anchor"/>
+ <h2>
+ <xsl:choose>
+ <xsl:when test="refsynopsisdiv/title|title">
+ <xsl:apply-templates select="(refsynopsisdiv/title|title)[1]" mode="titlepage.mode"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'RefSynopsisDiv'"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </h2>
+ <xsl:apply-templates/>
+ </div>
+</xsl:template>
+
+<xsl:template match="refsynopsisdivinfo"/>
+
+<xsl:template match="refsynopsisdiv/title">
+</xsl:template>
+
+<xsl:template match="refsynopsisdiv/title" mode="titlepage.mode">
+ <xsl:apply-templates/>
+</xsl:template>
+
+<xsl:template match="refsection|refsect1|refsect2|refsect3">
+ <div>
+ <xsl:call-template name="common.html.attributes">
+ <xsl:with-param name="inherit" select="1"/>
+ </xsl:call-template>
+ <xsl:call-template name="anchor">
+ <xsl:with-param name="conditional" select="0"/>
+ </xsl:call-template>
+ <!-- pick up info title -->
+ <xsl:apply-templates select="(title|info/title)[1]"/>
+ <xsl:apply-templates select="node()[not(self::title) and not(self::info)]"/>
+ </div>
+</xsl:template>
+
+<xsl:template match="refsection/title|refsection/info/title">
+ <!-- the ID is output in the block.object call for refsect1 -->
+ <xsl:variable name="level" select="count(ancestor-or-self::refsection)"/>
+ <xsl:variable name="refsynopsisdiv">
+ <xsl:text>0</xsl:text>
+ <xsl:if test="ancestor::refsynopsisdiv">1</xsl:if>
+ </xsl:variable>
+ <xsl:variable name="hlevel">
+ <xsl:choose>
+ <xsl:when test="$level+$refsynopsisdiv &gt; 5">6</xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$level+1+$refsynopsisdiv"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:element name="h{$hlevel}" namespace="http://www.w3.org/1999/xhtml">
+ <xsl:apply-templates/>
+ </xsl:element>
+</xsl:template>
+
+<xsl:template match="refsect1/title|refsect1/info/title">
+ <!-- the ID is output in the block.object call for refsect1 -->
+ <h2>
+ <xsl:apply-templates/>
+ </h2>
+</xsl:template>
+
+<xsl:template match="refsect2/title|refsect2/info/title">
+ <!-- the ID is output in the block.object call for refsect2 -->
+ <h3>
+ <xsl:apply-templates/>
+ </h3>
+</xsl:template>
+
+<xsl:template match="refsect3/title|refsect3/info/title">
+ <!-- the ID is output in the block.object call for refsect3 -->
+ <h4>
+ <xsl:apply-templates/>
+ </h4>
+</xsl:template>
+
+<xsl:template match="refsectioninfo|refsection/info"/>
+<xsl:template match="refsect1info|refsect1/info"/>
+<xsl:template match="refsect2info|refsect2/info"/>
+<xsl:template match="refsect3info|refsect3/info"/>
+
+
+<!-- ==================================================================== -->
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/sections.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/sections.xsl
new file mode 100644
index 0000000..aec647d
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/sections.xsl
@@ -0,0 +1,541 @@
+<?xml version="1.0" encoding="ASCII"?>
+<!--This file was created automatically by html2xhtml-->
+<!--from the HTML stylesheets.-->
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1999/xhtml" version="1.0">
+
+<!-- ********************************************************************
+ $Id: sections.xsl 8421 2009-05-04 07:49:49Z bobstayton $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<!-- ==================================================================== -->
+
+<xsl:template match="section">
+ <xsl:variable name="depth" select="count(ancestor::section)+1"/>
+
+ <xsl:call-template name="id.warning"/>
+
+ <div>
+ <xsl:call-template name="common.html.attributes">
+ <xsl:with-param name="inherit" select="1"/>
+ </xsl:call-template>
+ <xsl:call-template name="section.titlepage"/>
+
+ <xsl:variable name="toc.params">
+ <xsl:call-template name="find.path.params">
+ <xsl:with-param name="table" select="normalize-space($generate.toc)"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:if test="contains($toc.params, 'toc') and $depth &lt;= $generate.section.toc.level">
+ <xsl:call-template name="section.toc">
+ <xsl:with-param name="toc.title.p" select="contains($toc.params, 'title')"/>
+ </xsl:call-template>
+ <xsl:call-template name="section.toc.separator"/>
+ </xsl:if>
+ <xsl:apply-templates/>
+ <xsl:call-template name="process.chunk.footnotes"/>
+ </div>
+</xsl:template>
+
+<xsl:template name="section.title">
+ <!-- the context node should be the title of a section when called -->
+ <xsl:variable name="section" select="(ancestor::section |ancestor::simplesect |ancestor::sect1 |ancestor::sect2 |ancestor::sect3 |ancestor::sect4 |ancestor::sect5)[last()]"/>
+
+ <xsl:variable name="renderas">
+ <xsl:choose>
+ <xsl:when test="$section/@renderas = 'sect1'">1</xsl:when>
+ <xsl:when test="$section/@renderas = 'sect2'">2</xsl:when>
+ <xsl:when test="$section/@renderas = 'sect3'">3</xsl:when>
+ <xsl:when test="$section/@renderas = 'sect4'">4</xsl:when>
+ <xsl:when test="$section/@renderas = 'sect5'">5</xsl:when>
+ <xsl:otherwise><xsl:value-of select="''"/></xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="level">
+ <xsl:choose>
+ <xsl:when test="$renderas != ''">
+ <xsl:value-of select="$renderas"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="section.level">
+ <xsl:with-param name="node" select="$section"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:call-template name="section.heading">
+ <xsl:with-param name="section" select="$section"/>
+ <xsl:with-param name="level" select="$level"/>
+ <xsl:with-param name="title">
+ <xsl:apply-templates select="$section" mode="object.title.markup">
+ <xsl:with-param name="allow-anchors" select="1"/>
+ </xsl:apply-templates>
+ </xsl:with-param>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="section/title |section/info/title |sectioninfo/title" mode="titlepage.mode" priority="2">
+ <xsl:call-template name="section.title"/>
+</xsl:template>
+
+<xsl:template match="sect1">
+ <xsl:call-template name="id.warning"/>
+
+ <div>
+ <xsl:call-template name="common.html.attributes">
+ <xsl:with-param name="inherit" select="1"/>
+ </xsl:call-template>
+
+ <xsl:choose>
+ <xsl:when test="@renderas = 'sect2'">
+ <xsl:call-template name="sect2.titlepage"/>
+ </xsl:when>
+ <xsl:when test="@renderas = 'sect3'">
+ <xsl:call-template name="sect3.titlepage"/>
+ </xsl:when>
+ <xsl:when test="@renderas = 'sect4'">
+ <xsl:call-template name="sect4.titlepage"/>
+ </xsl:when>
+ <xsl:when test="@renderas = 'sect5'">
+ <xsl:call-template name="sect5.titlepage"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="sect1.titlepage"/>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:variable name="toc.params">
+ <xsl:call-template name="find.path.params">
+ <xsl:with-param name="table" select="normalize-space($generate.toc)"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:if test="contains($toc.params, 'toc') and $generate.section.toc.level &gt;= 1">
+ <xsl:call-template name="section.toc">
+ <xsl:with-param name="toc.title.p" select="contains($toc.params, 'title')"/>
+ </xsl:call-template>
+ <xsl:call-template name="section.toc.separator"/>
+ </xsl:if>
+ <xsl:apply-templates/>
+ <xsl:call-template name="process.chunk.footnotes"/>
+ </div>
+</xsl:template>
+
+<xsl:template match="sect1/title |sect1/info/title |sect1info/title" mode="titlepage.mode" priority="2">
+ <xsl:call-template name="section.title"/>
+</xsl:template>
+
+<xsl:template match="sect2">
+ <xsl:call-template name="id.warning"/>
+
+ <div>
+ <xsl:call-template name="common.html.attributes">
+ <xsl:with-param name="inherit" select="1"/>
+ </xsl:call-template>
+
+ <xsl:choose>
+ <xsl:when test="@renderas = 'sect1'">
+ <xsl:call-template name="sect1.titlepage"/>
+ </xsl:when>
+ <xsl:when test="@renderas = 'sect3'">
+ <xsl:call-template name="sect3.titlepage"/>
+ </xsl:when>
+ <xsl:when test="@renderas = 'sect4'">
+ <xsl:call-template name="sect4.titlepage"/>
+ </xsl:when>
+ <xsl:when test="@renderas = 'sect5'">
+ <xsl:call-template name="sect5.titlepage"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="sect2.titlepage"/>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:variable name="toc.params">
+ <xsl:call-template name="find.path.params">
+ <xsl:with-param name="table" select="normalize-space($generate.toc)"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:if test="contains($toc.params, 'toc') and $generate.section.toc.level &gt;= 2">
+ <xsl:call-template name="section.toc">
+ <xsl:with-param name="toc.title.p" select="contains($toc.params, 'title')"/>
+ </xsl:call-template>
+ <xsl:call-template name="section.toc.separator"/>
+ </xsl:if>
+ <xsl:apply-templates/>
+ <xsl:call-template name="process.chunk.footnotes"/>
+ </div>
+</xsl:template>
+
+<xsl:template match="sect2/title |sect2/info/title |sect2info/title" mode="titlepage.mode" priority="2">
+ <xsl:call-template name="section.title"/>
+</xsl:template>
+
+<xsl:template match="sect3">
+ <xsl:call-template name="id.warning"/>
+
+ <div>
+ <xsl:call-template name="common.html.attributes">
+ <xsl:with-param name="inherit" select="1"/>
+ </xsl:call-template>
+
+ <xsl:choose>
+ <xsl:when test="@renderas = 'sect1'">
+ <xsl:call-template name="sect1.titlepage"/>
+ </xsl:when>
+ <xsl:when test="@renderas = 'sect2'">
+ <xsl:call-template name="sect2.titlepage"/>
+ </xsl:when>
+ <xsl:when test="@renderas = 'sect4'">
+ <xsl:call-template name="sect4.titlepage"/>
+ </xsl:when>
+ <xsl:when test="@renderas = 'sect5'">
+ <xsl:call-template name="sect5.titlepage"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="sect3.titlepage"/>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:variable name="toc.params">
+ <xsl:call-template name="find.path.params">
+ <xsl:with-param name="table" select="normalize-space($generate.toc)"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:if test="contains($toc.params, 'toc') and $generate.section.toc.level &gt;= 3">
+ <xsl:call-template name="section.toc">
+ <xsl:with-param name="toc.title.p" select="contains($toc.params, 'title')"/>
+ </xsl:call-template>
+ <xsl:call-template name="section.toc.separator"/>
+ </xsl:if>
+ <xsl:apply-templates/>
+ <xsl:call-template name="process.chunk.footnotes"/>
+ </div>
+</xsl:template>
+
+<xsl:template match="sect3/title |sect3/info/title |sect3info/title" mode="titlepage.mode" priority="2">
+ <xsl:call-template name="section.title"/>
+</xsl:template>
+
+<xsl:template match="sect4">
+ <xsl:call-template name="id.warning"/>
+
+ <div>
+ <xsl:call-template name="common.html.attributes">
+ <xsl:with-param name="inherit" select="1"/>
+ </xsl:call-template>
+
+ <xsl:choose>
+ <xsl:when test="@renderas = 'sect1'">
+ <xsl:call-template name="sect1.titlepage"/>
+ </xsl:when>
+ <xsl:when test="@renderas = 'sect2'">
+ <xsl:call-template name="sect2.titlepage"/>
+ </xsl:when>
+ <xsl:when test="@renderas = 'sect3'">
+ <xsl:call-template name="sect3.titlepage"/>
+ </xsl:when>
+ <xsl:when test="@renderas = 'sect5'">
+ <xsl:call-template name="sect5.titlepage"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="sect4.titlepage"/>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:variable name="toc.params">
+ <xsl:call-template name="find.path.params">
+ <xsl:with-param name="table" select="normalize-space($generate.toc)"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:if test="contains($toc.params, 'toc') and $generate.section.toc.level &gt;= 4">
+ <xsl:call-template name="section.toc">
+ <xsl:with-param name="toc.title.p" select="contains($toc.params, 'title')"/>
+ </xsl:call-template>
+ <xsl:call-template name="section.toc.separator"/>
+ </xsl:if>
+ <xsl:apply-templates/>
+ <xsl:call-template name="process.chunk.footnotes"/>
+ </div>
+</xsl:template>
+
+<xsl:template match="sect4/title |sect4/info/title |sect4info/title" mode="titlepage.mode" priority="2">
+ <xsl:call-template name="section.title"/>
+</xsl:template>
+
+<xsl:template match="sect5">
+ <xsl:call-template name="id.warning"/>
+
+ <div>
+ <xsl:call-template name="common.html.attributes">
+ <xsl:with-param name="inherit" select="1"/>
+ </xsl:call-template>
+
+ <xsl:choose>
+ <xsl:when test="@renderas = 'sect1'">
+ <xsl:call-template name="sect1.titlepage"/>
+ </xsl:when>
+ <xsl:when test="@renderas = 'sect2'">
+ <xsl:call-template name="sect2.titlepage"/>
+ </xsl:when>
+ <xsl:when test="@renderas = 'sect3'">
+ <xsl:call-template name="sect3.titlepage"/>
+ </xsl:when>
+ <xsl:when test="@renderas = 'sect4'">
+ <xsl:call-template name="sect4.titlepage"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="sect5.titlepage"/>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:variable name="toc.params">
+ <xsl:call-template name="find.path.params">
+ <xsl:with-param name="table" select="normalize-space($generate.toc)"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:if test="contains($toc.params, 'toc') and $generate.section.toc.level &gt;= 5">
+ <xsl:call-template name="section.toc">
+ <xsl:with-param name="toc.title.p" select="contains($toc.params, 'title')"/>
+ </xsl:call-template>
+ <xsl:call-template name="section.toc.separator"/>
+ </xsl:if>
+ <xsl:apply-templates/>
+ <xsl:call-template name="process.chunk.footnotes"/>
+ </div>
+</xsl:template>
+
+<xsl:template match="sect5/title |sect5/info/title |sect5info/title" mode="titlepage.mode" priority="2">
+ <xsl:call-template name="section.title"/>
+</xsl:template>
+
+<xsl:template match="simplesect">
+ <xsl:call-template name="id.warning"/>
+
+ <div>
+ <xsl:call-template name="common.html.attributes">
+ <xsl:with-param name="inherit" select="1"/>
+ </xsl:call-template>
+
+ <xsl:call-template name="simplesect.titlepage"/>
+ <xsl:apply-templates/>
+ </div>
+</xsl:template>
+
+<xsl:template match="simplesect/title|simplesect/info/title" mode="titlepage.mode" priority="2">
+ <xsl:call-template name="section.title"/>
+</xsl:template>
+
+<xsl:template match="section/title"/>
+<xsl:template match="section/titleabbrev"/>
+<xsl:template match="section/subtitle"/>
+<xsl:template match="sectioninfo"/>
+<xsl:template match="section/info"/>
+
+<xsl:template match="sect1/title"/>
+<xsl:template match="sect1/titleabbrev"/>
+<xsl:template match="sect1/subtitle"/>
+<xsl:template match="sect1info"/>
+<xsl:template match="sect1/info"/>
+
+<xsl:template match="sect2/title"/>
+<xsl:template match="sect2/subtitle"/>
+<xsl:template match="sect2/titleabbrev"/>
+<xsl:template match="sect2info"/>
+<xsl:template match="sect2/info"/>
+
+<xsl:template match="sect3/title"/>
+<xsl:template match="sect3/subtitle"/>
+<xsl:template match="sect3/titleabbrev"/>
+<xsl:template match="sect3info"/>
+<xsl:template match="sect3/info"/>
+
+<xsl:template match="sect4/title"/>
+<xsl:template match="sect4/subtitle"/>
+<xsl:template match="sect4/titleabbrev"/>
+<xsl:template match="sect4info"/>
+<xsl:template match="sect4/info"/>
+
+<xsl:template match="sect5/title"/>
+<xsl:template match="sect5/subtitle"/>
+<xsl:template match="sect5/titleabbrev"/>
+<xsl:template match="sect5info"/>
+<xsl:template match="sect5/info"/>
+
+<xsl:template match="simplesect/title"/>
+<xsl:template match="simplesect/subtitle"/>
+<xsl:template match="simplesect/titleabbrev"/>
+<xsl:template match="simplesect/info"/>
+
+<!-- ==================================================================== -->
+
+<xsl:template name="section.heading">
+ <xsl:param name="section" select="."/>
+ <xsl:param name="level" select="1"/>
+ <xsl:param name="allow-anchors" select="1"/>
+ <xsl:param name="title"/>
+ <xsl:param name="class" select="'title'"/>
+
+ <xsl:variable name="id">
+ <xsl:choose>
+ <!-- Make sure the subtitle doesn't get the same id as the title -->
+ <xsl:when test="self::subtitle">
+ <xsl:call-template name="object.id">
+ <xsl:with-param name="object" select="."/>
+ </xsl:call-template>
+ </xsl:when>
+ <!-- if title is in an *info wrapper, get the grandparent -->
+ <xsl:when test="contains(local-name(..), 'info')">
+ <xsl:call-template name="object.id">
+ <xsl:with-param name="object" select="../.."/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="object.id">
+ <xsl:with-param name="object" select=".."/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <!-- HTML H level is one higher than section level -->
+ <xsl:variable name="hlevel">
+ <xsl:choose>
+ <!-- highest valid HTML H level is H6; so anything nested deeper
+ than 5 levels down just becomes H6 -->
+ <xsl:when test="$level &gt; 5">6</xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$level + 1"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:element name="h{$hlevel}" namespace="http://www.w3.org/1999/xhtml">
+ <xsl:attribute name="class"><xsl:value-of select="$class"/></xsl:attribute>
+ <xsl:if test="$css.decoration != '0'">
+ <xsl:if test="$hlevel&lt;3">
+ <xsl:attribute name="style">clear: both</xsl:attribute>
+ </xsl:if>
+ </xsl:if>
+ <xsl:if test="$allow-anchors != 0 and $generate.id.attributes = 0">
+ <xsl:call-template name="anchor">
+ <xsl:with-param name="node" select="$section"/>
+ <xsl:with-param name="conditional" select="0"/>
+ </xsl:call-template>
+ </xsl:if>
+ <xsl:if test="$generate.id.attributes != 0 and not(local-name(.) = 'appendix')">
+ <xsl:attribute name="id"><xsl:value-of select="$id"/></xsl:attribute>
+ </xsl:if>
+ <xsl:copy-of select="$title"/>
+ </xsl:element>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="bridgehead">
+ <xsl:variable name="container" select="(ancestor::appendix |ancestor::article |ancestor::bibliography |ancestor::chapter |ancestor::glossary |ancestor::glossdiv |ancestor::index |ancestor::partintro |ancestor::preface |ancestor::refsect1 |ancestor::refsect2 |ancestor::refsect3 |ancestor::sect1 |ancestor::sect2 |ancestor::sect3 |ancestor::sect4 |ancestor::sect5 |ancestor::section |ancestor::setindex |ancestor::simplesect)[last()]"/>
+
+ <xsl:variable name="clevel">
+ <xsl:choose>
+ <xsl:when test="local-name($container) = 'appendix' or local-name($container) = 'chapter' or local-name($container) = 'article' or local-name($container) = 'bibliography' or local-name($container) = 'glossary' or local-name($container) = 'index' or local-name($container) = 'partintro' or local-name($container) = 'preface' or local-name($container) = 'setindex'">1</xsl:when>
+ <xsl:when test="local-name($container) = 'glossdiv'">
+ <xsl:value-of select="count(ancestor::glossdiv)+1"/>
+ </xsl:when>
+ <xsl:when test="local-name($container) = 'sect1' or local-name($container) = 'sect2' or local-name($container) = 'sect3' or local-name($container) = 'sect4' or local-name($container) = 'sect5' or local-name($container) = 'refsect1' or local-name($container) = 'refsect2' or local-name($container) = 'refsect3' or local-name($container) = 'section' or local-name($container) = 'simplesect'">
+ <xsl:variable name="slevel">
+ <xsl:call-template name="section.level">
+ <xsl:with-param name="node" select="$container"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:value-of select="$slevel + 1"/>
+ </xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <!-- HTML H level is one higher than section level -->
+ <xsl:variable name="hlevel">
+ <xsl:choose>
+ <xsl:when test="@renderas = 'sect1'">2</xsl:when>
+ <xsl:when test="@renderas = 'sect2'">3</xsl:when>
+ <xsl:when test="@renderas = 'sect3'">4</xsl:when>
+ <xsl:when test="@renderas = 'sect4'">5</xsl:when>
+ <xsl:when test="@renderas = 'sect5'">6</xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$clevel + 1"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:element name="h{$hlevel}" namespace="http://www.w3.org/1999/xhtml">
+ <xsl:call-template name="anchor">
+ <xsl:with-param name="conditional" select="0"/>
+ </xsl:call-template>
+ <xsl:apply-templates/>
+ </xsl:element>
+</xsl:template>
+
+<xsl:template match="section/subtitle" mode="titlepage.mode" priority="2">
+ <xsl:call-template name="section.subtitle"/>
+</xsl:template>
+
+<xsl:template match="simplesect/subtitle" mode="titlepage.mode" priority="2">
+ <xsl:call-template name="section.subtitle"/>
+</xsl:template>
+
+<xsl:template match="sect1/subtitle" mode="titlepage.mode" priority="2">
+ <xsl:call-template name="section.subtitle"/>
+</xsl:template>
+
+<xsl:template match="sect2/subtitle" mode="titlepage.mode" priority="2">
+ <xsl:call-template name="section.subtitle"/>
+</xsl:template>
+
+<xsl:template match="sect3/subtitle" mode="titlepage.mode" priority="2">
+ <xsl:call-template name="section.subtitle"/>
+</xsl:template>
+
+<xsl:template match="sect4/subtitle" mode="titlepage.mode" priority="2">
+ <xsl:call-template name="section.subtitle"/>
+</xsl:template>
+
+<xsl:template match="sect5/subtitle" mode="titlepage.mode" priority="2">
+ <xsl:call-template name="section.subtitle"/>
+</xsl:template>
+
+<xsl:template name="section.subtitle">
+ <!-- the context node should be the subtitle of a section when called -->
+ <xsl:variable name="section" select="(ancestor::section |ancestor::simplesect |ancestor::sect1 |ancestor::sect2 |ancestor::sect3 |ancestor::sect4 |ancestor::sect5)[last()]"/>
+
+ <xsl:variable name="level">
+ <xsl:call-template name="section.level">
+ <xsl:with-param name="node" select="$section"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:call-template name="section.heading">
+ <xsl:with-param name="section" select=".."/>
+ <xsl:with-param name="allow-anchors" select="0"/>
+ <!-- subtitle heading level one higher than section level -->
+ <xsl:with-param name="level" select="$level + 1"/>
+ <xsl:with-param name="class" select="'subtitle'"/>
+ <xsl:with-param name="title">
+ <xsl:apply-templates select="$section" mode="object.subtitle.markup">
+ <xsl:with-param name="allow-anchors" select="0"/>
+ </xsl:apply-templates>
+ </xsl:with-param>
+ </xsl:call-template>
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/synop.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/synop.xsl
new file mode 100644
index 0000000..8506707
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/synop.xsl
@@ -0,0 +1,1513 @@
+<?xml version="1.0" encoding="ASCII"?>
+<!--This file was created automatically by html2xhtml-->
+<!--from the HTML stylesheets.-->
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1999/xhtml" version="1.0">
+
+<!-- ********************************************************************
+ $Id: synop.xsl 8421 2009-05-04 07:49:49Z bobstayton $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<!-- ==================================================================== -->
+
+<!-- synopsis is in verbatim -->
+
+<!-- ==================================================================== -->
+
+<xsl:template match="cmdsynopsis">
+ <div>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <p>
+ <xsl:if test="..//processing-instruction('dbcmdlist')">
+ <!-- * Placing a dbcmdlist PI as a child of a particular element -->
+ <!-- * creates a hyperlinked list of all cmdsynopsis instances -->
+ <!-- * that are descendants of that element; so for any -->
+ <!-- * cmdsynopsis that is a descendant of an element containing -->
+ <!-- * a dbcmdlist PI, we need to output an a@id instance so that -->
+ <!-- * we will have something to link to -->
+ <xsl:call-template name="anchor">
+ <xsl:with-param name="conditional" select="0"/>
+ </xsl:call-template>
+ </xsl:if>
+ <xsl:apply-templates/>
+ </p>
+ </div>
+</xsl:template>
+
+<xsl:template match="cmdsynopsis/command">
+ <br/>
+ <xsl:call-template name="inline.monoseq"/>
+ <xsl:text> </xsl:text>
+</xsl:template>
+
+<xsl:template match="cmdsynopsis/command[1]" priority="2">
+ <xsl:call-template name="inline.monoseq"/>
+ <xsl:text> </xsl:text>
+</xsl:template>
+
+<xsl:template match="group|arg" name="group-or-arg">
+ <xsl:variable name="choice" select="@choice"/>
+ <xsl:variable name="rep" select="@rep"/>
+ <xsl:variable name="sepchar">
+ <xsl:choose>
+ <xsl:when test="ancestor-or-self::*/@sepchar">
+ <xsl:value-of select="ancestor-or-self::*/@sepchar"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text> </xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:if test="preceding-sibling::*">
+ <xsl:value-of select="$sepchar"/>
+ </xsl:if>
+ <xsl:choose>
+ <xsl:when test="$choice='plain'">
+ <xsl:value-of select="$arg.choice.plain.open.str"/>
+ </xsl:when>
+ <xsl:when test="$choice='req'">
+ <xsl:value-of select="$arg.choice.req.open.str"/>
+ </xsl:when>
+ <xsl:when test="$choice='opt'">
+ <xsl:value-of select="$arg.choice.opt.open.str"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$arg.choice.def.open.str"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:apply-templates/>
+ <xsl:choose>
+ <xsl:when test="$rep='repeat'">
+ <xsl:value-of select="$arg.rep.repeat.str"/>
+ </xsl:when>
+ <xsl:when test="$rep='norepeat'">
+ <xsl:value-of select="$arg.rep.norepeat.str"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$arg.rep.def.str"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:choose>
+ <xsl:when test="$choice='plain'">
+ <xsl:value-of select="$arg.choice.plain.close.str"/>
+ </xsl:when>
+ <xsl:when test="$choice='req'">
+ <xsl:value-of select="$arg.choice.req.close.str"/>
+ </xsl:when>
+ <xsl:when test="$choice='opt'">
+ <xsl:value-of select="$arg.choice.opt.close.str"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$arg.choice.def.close.str"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="group/arg">
+ <xsl:variable name="choice" select="@choice"/>
+ <xsl:variable name="rep" select="@rep"/>
+ <xsl:if test="preceding-sibling::*">
+ <xsl:value-of select="$arg.or.sep"/>
+ </xsl:if>
+ <xsl:call-template name="group-or-arg"/>
+</xsl:template>
+
+<xsl:template match="sbr">
+ <br/>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="synopfragmentref">
+ <xsl:variable name="target" select="key('id',@linkend)"/>
+ <xsl:variable name="snum">
+ <xsl:apply-templates select="$target" mode="synopfragment.number"/>
+ </xsl:variable>
+ <em xmlns:xslo="http://www.w3.org/1999/XSL/Transform">
+ <a href="#{@linkend}">
+ <xsl:text>(</xsl:text>
+ <xsl:value-of select="$snum"/>
+ <xsl:text>)</xsl:text>
+ </a>
+ <xsl:text>&#160;</xsl:text>
+ <xsl:apply-templates/>
+ </em>
+</xsl:template>
+
+<xsl:template match="synopfragment" mode="synopfragment.number">
+ <xsl:number format="1"/>
+</xsl:template>
+
+<xsl:template match="synopfragment">
+ <xsl:variable name="snum">
+ <xsl:apply-templates select="." mode="synopfragment.number"/>
+ </xsl:variable>
+ <!-- You can't introduce another <p> here, because you're
+ already in a <p> from cmdsynopsis-->
+ <span>
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+ <a id="{$id}">
+ <xsl:text>(</xsl:text>
+ <xsl:value-of select="$snum"/>
+ <xsl:text>)</xsl:text>
+ </a>
+ <xsl:text> </xsl:text>
+ <xsl:apply-templates/>
+ </span>
+</xsl:template>
+
+<xsl:template match="funcsynopsis">
+ <xsl:if test="..//processing-instruction('dbfunclist')">
+ <!-- * Placing a dbfunclist PI as a child of a particular element -->
+ <!-- * creates a hyperlinked list of all funcsynopsis instances that -->
+ <!-- * are descendants of that element; so for any funcsynopsis that is -->
+ <!-- * a descendant of an element containing a dbfunclist PI, we need -->
+ <!-- * to output an a@id instance so that we will have something to -->
+ <!-- * link to -->
+ <xsl:call-template name="anchor">
+ <xsl:with-param name="conditional" select="0"/>
+ </xsl:call-template>
+ </xsl:if>
+ <xsl:call-template name="informal.object"/>
+</xsl:template>
+
+<xsl:template match="funcsynopsisinfo">
+ <pre>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates/>
+ </pre>
+</xsl:template>
+
+<!-- ====================================================================== -->
+<!-- funcprototype -->
+<!--
+
+funcprototype ::= (funcdef,
+ (void|varargs|paramdef+))
+
+funcdef ::= (#PCDATA|type|replaceable|function)*
+
+paramdef ::= (#PCDATA|type|replaceable|parameter|funcparams)*
+-->
+
+<xsl:template match="funcprototype">
+ <xsl:variable name="html-style">
+ <xsl:call-template name="pi.dbhtml_funcsynopsis-style">
+ <xsl:with-param name="node" select="ancestor::funcsynopsis/descendant-or-self::*"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="style">
+ <xsl:choose>
+ <xsl:when test="$html-style != ''">
+ <xsl:value-of select="$html-style"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$funcsynopsis.style"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+<!-- * 2008-02-17. the code no longer relies on the funcsynopsis.tabular.threshold -->
+<!-- * param at all (the stuff below has been commented out since mid -->
+<!-- * 2006), so I completely removed the funcsynopsis.tabular.threshold param -->
+<!-- * .. MikeSmith -->
+<!--
+ <xsl:variable name="tabular-p"
+ select="$funcsynopsis.tabular.threshold &gt; 0
+ and string-length(.) &gt; $funcsynopsis.tabular.threshold"/>
+-->
+
+ <xsl:variable name="tabular-p" select="true()"/>
+
+ <xsl:choose>
+ <xsl:when test="$style = 'kr' and $tabular-p">
+ <xsl:apply-templates select="." mode="kr-tabular"/>
+ </xsl:when>
+ <xsl:when test="$style = 'kr'">
+ <xsl:apply-templates select="." mode="kr-nontabular"/>
+ </xsl:when>
+ <xsl:when test="$style = 'ansi' and $tabular-p">
+ <xsl:apply-templates select="." mode="ansi-tabular"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="." mode="ansi-nontabular"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ====================================================================== -->
+<!-- funcprototype: kr, non-tabular -->
+
+<xsl:template match="funcprototype" mode="kr-nontabular">
+ <p>
+ <xsl:apply-templates mode="kr-nontabular"/>
+ <xsl:if test="paramdef">
+ <br/>
+ <xsl:apply-templates select="paramdef" mode="kr-funcsynopsis-mode"/>
+ </xsl:if>
+ </p>
+</xsl:template>
+
+<xsl:template match="funcdef" mode="kr-nontabular">
+ <code>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="kr-nontabular"/>
+ <xsl:text>(</xsl:text>
+ </code>
+</xsl:template>
+
+<xsl:template match="funcdef/function" mode="kr-nontabular">
+ <xsl:choose>
+ <xsl:when test="$funcsynopsis.decoration != 0">
+ <strong xmlns:xslo="http://www.w3.org/1999/XSL/Transform">fsfunc<xsl:apply-templates mode="kr-nontabular"/></strong>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates mode="kr-nontabular"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="void" mode="kr-nontabular">
+ <code>)</code>
+ <xsl:text>;</xsl:text>
+</xsl:template>
+
+<xsl:template match="varargs" mode="kr-nontabular">
+ <xsl:text>...</xsl:text>
+ <code>)</code>
+ <xsl:text>;</xsl:text>
+</xsl:template>
+
+<xsl:template match="paramdef" mode="kr-nontabular">
+ <xsl:apply-templates select="parameter" mode="kr-nontabular"/>
+ <xsl:choose>
+ <xsl:when test="following-sibling::*">
+ <xsl:text>, </xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <code>)</code>
+ <xsl:text>;</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="paramdef/parameter" mode="kr-nontabular">
+ <xsl:choose>
+ <xsl:when test="$funcsynopsis.decoration != 0">
+ <var class="pdparam">
+ <xsl:apply-templates mode="kr-nontabular"/>
+ </var>
+ </xsl:when>
+ <xsl:otherwise>
+ <code>
+ <xsl:apply-templates mode="kr-nontabular"/>
+ </code>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="paramdef" mode="kr-funcsynopsis-mode">
+ <xsl:if test="preceding-sibling::paramdef"><br/></xsl:if>
+ <code>
+ <xsl:apply-templates mode="kr-funcsynopsis-mode"/>
+ </code>
+ <xsl:text>;</xsl:text>
+</xsl:template>
+
+<xsl:template match="paramdef/parameter" mode="kr-funcsynopsis-mode">
+ <xsl:choose>
+ <xsl:when test="$funcsynopsis.decoration != 0">
+ <var class="pdparam">
+ <xsl:apply-templates mode="kr-funcsynopsis-mode"/>
+ </var>
+ </xsl:when>
+ <xsl:otherwise>
+ <code>
+ <xsl:apply-templates mode="kr-funcsynopsis-mode"/>
+ </code>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="funcparams" mode="kr-funcsynopsis-mode">
+ <code>(</code>
+ <xsl:apply-templates mode="kr-funcsynopsis-mode"/>
+ <code>)</code>
+</xsl:template>
+
+<!-- ====================================================================== -->
+<!-- funcprototype: kr, tabular -->
+
+<xsl:template match="funcprototype" mode="kr-tabular">
+ <table border="0" summary="Function synopsis" cellspacing="0" cellpadding="0" class="funcprototype-table">
+ <tr>
+ <td>
+ <xsl:apply-templates select="funcdef" mode="kr-tabular"/>
+ </td>
+ <xsl:apply-templates select="(void|varargs|paramdef)[1]" mode="kr-tabular"/>
+ </tr>
+ <xsl:for-each select="(void|varargs|paramdef)[preceding-sibling::*[not(self::funcdef)]]">
+ <tr>
+ <td>&#160;</td>
+ <xsl:apply-templates select="." mode="kr-tabular"/>
+ </tr>
+ </xsl:for-each>
+ </table>
+ <xsl:if test="paramdef">
+ <div class="paramdef-list">
+ <xsl:apply-templates select="paramdef" mode="kr-funcsynopsis-mode"/>
+ </div>
+ </xsl:if>
+ <div class="funcprototype-spacer">&#160;</div> <!-- hACk: blank div for vertical spacing -->
+</xsl:template>
+
+<xsl:template match="funcdef" mode="kr-tabular">
+ <code>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="kr-tabular"/>
+ <xsl:text>(</xsl:text>
+ </code>
+</xsl:template>
+
+<xsl:template match="funcdef/function" mode="kr-tabular">
+ <xsl:choose>
+ <xsl:when test="$funcsynopsis.decoration != 0">
+ <strong xmlns:xslo="http://www.w3.org/1999/XSL/Transform">fsfunc<xsl:apply-templates mode="kr-nontabular"/></strong>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates mode="kr-tabular"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="void" mode="kr-tabular">
+ <td>
+ <code>)</code>
+ <xsl:text>;</xsl:text>
+ </td>
+ <td>&#160;</td>
+</xsl:template>
+
+<xsl:template match="varargs" mode="kr-tabular">
+ <td>
+ <xsl:text>...</xsl:text>
+ <code>)</code>
+ <xsl:text>;</xsl:text>
+ </td>
+ <td>&#160;</td>
+</xsl:template>
+
+<xsl:template match="paramdef" mode="kr-tabular">
+ <td>
+ <xsl:apply-templates select="parameter" mode="kr-tabular"/>
+ <xsl:choose>
+ <xsl:when test="following-sibling::*">
+ <xsl:text>, </xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <code>)</code>
+ <xsl:text>;</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ </td>
+ <td>&#160;</td>
+</xsl:template>
+
+<xsl:template match="paramdef/parameter" mode="kr-tabular">
+ <xsl:choose>
+ <xsl:when test="$funcsynopsis.decoration != 0">
+ <var class="pdparam">
+ <xsl:apply-templates mode="kr-tabular"/>
+ </var>
+ </xsl:when>
+ <xsl:otherwise>
+ <code>
+ <xsl:apply-templates mode="kr-tabular"/>
+ </code>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="paramdef" mode="kr-tabular-funcsynopsis-mode">
+ <xsl:variable name="type">
+ <xsl:choose>
+ <xsl:when test="type">
+ <xsl:apply-templates select="type" mode="kr-tabular-funcsynopsis-mode"/>
+ </xsl:when>
+ <xsl:when test="normalize-space(parameter/preceding-sibling::node()[not(self::parameter)]) != ''">
+ <xsl:copy-of select="parameter/preceding-sibling::node()[not(self::parameter)]"/>
+ </xsl:when>
+ </xsl:choose>
+ </xsl:variable>
+
+ <tr>
+ <xsl:choose>
+ <xsl:when test="$type != '' and funcparams">
+ <td>
+ <code>
+ <xsl:copy-of select="$type"/>
+ </code>
+ <xsl:text>&#160;</xsl:text>
+ </td>
+ <td>
+ <code>
+ <xsl:choose>
+ <xsl:when test="type">
+ <xsl:apply-templates select="type/following-sibling::*" mode="kr-tabular-funcsynopsis-mode"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="*" mode="kr-tabular-funcsynopsis-mode"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </code>
+ </td>
+ </xsl:when>
+
+ <xsl:when test="funcparams">
+ <td colspan="2">
+ <code>
+ <xsl:apply-templates mode="kr-tabular-funcsynopsis-mode"/>
+ </code>
+ </td>
+ </xsl:when>
+
+ <xsl:otherwise>
+ <td>
+ <code>
+ <xsl:apply-templates select="parameter/preceding-sibling::node()[not(self::parameter)]" mode="kr-tabular-funcsynopsis-mode"/>
+ </code>
+ <xsl:text>&#160;</xsl:text>
+ </td>
+ <td>
+ <code>
+ <xsl:apply-templates select="parameter" mode="kr-tabular"/>
+ <xsl:apply-templates select="parameter/following-sibling::*[not(self::parameter)]" mode="kr-tabular-funcsynopsis-mode"/>
+ <xsl:text>;</xsl:text>
+ </code>
+ </td>
+ </xsl:otherwise>
+ </xsl:choose>
+ </tr>
+</xsl:template>
+
+<xsl:template match="paramdef/parameter" mode="kr-tabular-funcsynopsis-mode">
+ <xsl:choose>
+ <xsl:when test="$funcsynopsis.decoration != 0">
+ <var class="pdparam">
+ <xsl:apply-templates mode="kr-tabular-funcsynopsis-mode"/>
+ </var>
+ </xsl:when>
+ <xsl:otherwise>
+ <code>
+ <xsl:apply-templates mode="kr-tabular-funcsynopsis-mode"/>
+ </code>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="funcparams" mode="kr-tabular-funcsynopsis-mode">
+ <code>(</code>
+ <xsl:apply-templates mode="kr-tabular-funcsynopsis-mode"/>
+ <code>)</code>
+ <xsl:text>;</xsl:text>
+</xsl:template>
+
+<!-- ====================================================================== -->
+<!-- funcprototype: ansi, non-tabular -->
+
+<xsl:template match="funcprototype" mode="ansi-nontabular">
+ <p>
+ <xsl:apply-templates mode="ansi-nontabular"/>
+ </p>
+</xsl:template>
+
+<xsl:template match="funcdef" mode="ansi-nontabular">
+ <code>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="ansi-nontabular"/>
+ <xsl:text>(</xsl:text>
+ </code>
+</xsl:template>
+
+<xsl:template match="funcdef/function" mode="ansi-nontabular">
+ <xsl:choose>
+ <xsl:when test="$funcsynopsis.decoration != 0">
+ <strong xmlns:xslo="http://www.w3.org/1999/XSL/Transform">fsfunc<xsl:apply-templates mode="ansi-nontabular"/></strong>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates mode="ansi-nontabular"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="void" mode="ansi-nontabular">
+ <code>void)</code>
+ <xsl:text>;</xsl:text>
+</xsl:template>
+
+<xsl:template match="varargs" mode="ansi-nontabular">
+ <xsl:text>...</xsl:text>
+ <code>)</code>
+ <xsl:text>;</xsl:text>
+</xsl:template>
+
+<xsl:template match="paramdef" mode="ansi-nontabular">
+ <xsl:apply-templates mode="ansi-nontabular"/>
+ <xsl:choose>
+ <xsl:when test="following-sibling::*">
+ <xsl:text>, </xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <code>)</code>
+ <xsl:text>;</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="paramdef/parameter" mode="ansi-nontabular">
+ <xsl:choose>
+ <xsl:when test="$funcsynopsis.decoration != 0">
+ <var class="pdparam">
+ <xsl:apply-templates mode="ansi-nontabular"/>
+ </var>
+ </xsl:when>
+ <xsl:otherwise>
+ <code>
+ <xsl:apply-templates mode="ansi-nontabular"/>
+ </code>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="funcparams" mode="ansi-nontabular">
+ <code>(</code>
+ <xsl:apply-templates mode="ansi-nontabular"/>
+ <code>)</code>
+</xsl:template>
+
+<!-- ====================================================================== -->
+<!-- funcprototype: ansi, tabular -->
+
+<xsl:template match="funcprototype" mode="ansi-tabular">
+ <table border="0" summary="Function synopsis" cellspacing="0" cellpadding="0" class="funcprototype-table">
+ <tr>
+ <td>
+ <xsl:apply-templates select="funcdef" mode="ansi-tabular"/>
+ </td>
+ <xsl:apply-templates select="(void|varargs|paramdef)[1]" mode="ansi-tabular"/>
+ </tr>
+ <xsl:for-each select="(void|varargs|paramdef)[preceding-sibling::*[not(self::funcdef)]]">
+ <tr>
+ <td>&#160;</td>
+ <xsl:apply-templates select="." mode="ansi-tabular"/>
+ </tr>
+ </xsl:for-each>
+ </table>
+ <div class="funcprototype-spacer">&#160;</div> <!-- hACk: blank div for vertical spacing -->
+</xsl:template>
+
+<xsl:template match="funcdef" mode="ansi-tabular">
+ <code>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="ansi-tabular"/>
+ <xsl:text>(</xsl:text>
+ </code>
+</xsl:template>
+
+<xsl:template match="funcdef/function" mode="ansi-tabular">
+ <xsl:choose>
+ <xsl:when test="$funcsynopsis.decoration != 0">
+ <strong xmlns:xslo="http://www.w3.org/1999/XSL/Transform">fsfunc<xsl:apply-templates mode="ansi-nontabular"/></strong>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates mode="kr-tabular"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="void" mode="ansi-tabular">
+ <td>
+ <code>void)</code>
+ <xsl:text>;</xsl:text>
+ </td>
+ <td>&#160;</td>
+</xsl:template>
+
+<xsl:template match="varargs" mode="ansi-tabular">
+ <td>
+ <xsl:text>...</xsl:text>
+ <code>)</code>
+ <xsl:text>;</xsl:text>
+ </td>
+ <td>&#160;</td>
+</xsl:template>
+
+<xsl:template match="paramdef" mode="ansi-tabular">
+ <td>
+ <xsl:apply-templates mode="ansi-tabular"/>
+ <xsl:choose>
+ <xsl:when test="following-sibling::*">
+ <xsl:text>, </xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <code>)</code>
+ <xsl:text>;</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ </td>
+</xsl:template>
+
+<xsl:template match="paramdef/parameter" mode="ansi-tabular">
+ <xsl:choose>
+ <xsl:when test="$funcsynopsis.decoration != 0">
+ <var class="pdparam">
+ <xsl:apply-templates mode="ansi-tabular"/>
+ </var>
+ </xsl:when>
+ <xsl:otherwise>
+ <code>
+ <xsl:apply-templates mode="ansi-tabular"/>
+ </code>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="funcparams" mode="ansi-tabular">
+ <code>(</code>
+ <xsl:apply-templates/>
+ <code>)</code>
+</xsl:template>
+
+<!-- ====================================================================== -->
+
+<xsl:variable name="default-classsynopsis-language">java</xsl:variable>
+
+<xsl:template match="classsynopsis |fieldsynopsis |methodsynopsis |constructorsynopsis |destructorsynopsis">
+ <xsl:param name="language">
+ <xsl:choose>
+ <xsl:when test="@language">
+ <xsl:value-of select="@language"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$default-classsynopsis-language"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:param>
+
+ <xsl:choose>
+ <xsl:when test="$language='java' or $language='Java'">
+ <xsl:apply-templates select="." mode="java"/>
+ </xsl:when>
+ <xsl:when test="$language='perl' or $language='Perl'">
+ <xsl:apply-templates select="." mode="perl"/>
+ </xsl:when>
+ <xsl:when test="$language='idl' or $language='IDL'">
+ <xsl:apply-templates select="." mode="idl"/>
+ </xsl:when>
+ <xsl:when test="$language='cpp' or $language='c++' or $language='C++'">
+ <xsl:apply-templates select="." mode="cpp"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:message>
+ <xsl:text>Unrecognized language on </xsl:text>
+ <xsl:value-of select="local-name(.)"/>
+ <xsl:text>: </xsl:text>
+ <xsl:value-of select="$language"/>
+ </xsl:message>
+ <xsl:apply-templates select=".">
+ <xsl:with-param name="language" select="$default-classsynopsis-language"/>
+ </xsl:apply-templates>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="synop-break">
+ <xsl:if test="parent::classsynopsis or (following-sibling::fieldsynopsis |following-sibling::methodsynopsis |following-sibling::constructorsynopsis |following-sibling::destructorsynopsis)">
+ <br/>
+ </xsl:if>
+</xsl:template>
+
+
+<!-- ===== Java ======================================================== -->
+
+<xsl:template match="classsynopsis" mode="java">
+ <pre>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates select="ooclass[1]" mode="java"/>
+ <xsl:if test="ooclass[preceding-sibling::*]">
+ <xsl:text> extends</xsl:text>
+ <xsl:apply-templates select="ooclass[preceding-sibling::*]" mode="java"/>
+ <xsl:if test="oointerface|ooexception">
+ <br/>
+ <xsl:text>&#160;&#160;&#160;&#160;</xsl:text>
+ </xsl:if>
+ </xsl:if>
+ <xsl:if test="oointerface">
+ <xsl:text>implements</xsl:text>
+ <xsl:apply-templates select="oointerface" mode="java"/>
+ <xsl:if test="ooexception">
+ <br/>
+ <xsl:text>&#160;&#160;&#160;&#160;</xsl:text>
+ </xsl:if>
+ </xsl:if>
+ <xsl:if test="ooexception">
+ <xsl:text>throws</xsl:text>
+ <xsl:apply-templates select="ooexception" mode="java"/>
+ </xsl:if>
+ <xsl:text>&#160;{</xsl:text>
+ <br/>
+ <xsl:apply-templates select="constructorsynopsis |destructorsynopsis |fieldsynopsis |methodsynopsis |classsynopsisinfo" mode="java"/>
+ <xsl:text>}</xsl:text>
+ </pre>
+</xsl:template>
+
+<xsl:template match="classsynopsisinfo" mode="java">
+ <xsl:apply-templates mode="java"/>
+</xsl:template>
+
+<xsl:template match="ooclass|oointerface|ooexception" mode="java">
+ <xsl:choose>
+ <xsl:when test="preceding-sibling::*">
+ <xsl:text>, </xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text> </xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="java"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="modifier|package" mode="java">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="java"/>
+ <xsl:if test="following-sibling::*">
+ <xsl:text>&#160;</xsl:text>
+ </xsl:if>
+ </span>
+</xsl:template>
+
+<xsl:template match="classname" mode="java">
+ <xsl:if test="local-name(preceding-sibling::*[1]) = 'classname'">
+ <xsl:text>, </xsl:text>
+ </xsl:if>
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="java"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="interfacename" mode="java">
+ <xsl:if test="local-name(preceding-sibling::*[1]) = 'interfacename'">
+ <xsl:text>, </xsl:text>
+ </xsl:if>
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="java"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="exceptionname" mode="java">
+ <xsl:if test="local-name(preceding-sibling::*[1]) = 'exceptionname'">
+ <xsl:text>, </xsl:text>
+ </xsl:if>
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="java"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="fieldsynopsis" mode="java">
+ <code>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:if test="parent::classsynopsis">
+ <xsl:text>&#160;&#160;</xsl:text>
+ </xsl:if>
+ <xsl:apply-templates mode="java"/>
+ <xsl:text>;</xsl:text>
+ </code>
+ <xsl:call-template name="synop-break"/>
+</xsl:template>
+
+<xsl:template match="type" mode="java">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="java"/>
+ <xsl:text>&#160;</xsl:text>
+ </span>
+</xsl:template>
+
+<xsl:template match="varname" mode="java">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="java"/>
+ <xsl:text>&#160;</xsl:text>
+ </span>
+</xsl:template>
+
+<xsl:template match="initializer" mode="java">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:text>=&#160;</xsl:text>
+ <xsl:apply-templates mode="java"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="void" mode="java">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:text>void&#160;</xsl:text>
+ </span>
+</xsl:template>
+
+<xsl:template match="methodname" mode="java">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="java"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="methodparam" mode="java">
+ <xsl:param name="indent">0</xsl:param>
+ <xsl:if test="preceding-sibling::methodparam">
+ <xsl:text>,</xsl:text>
+ <br/>
+ <xsl:if test="$indent &gt; 0">
+ <xsl:call-template name="copy-string">
+ <xsl:with-param name="string">&#160;</xsl:with-param>
+ <xsl:with-param name="count" select="$indent + 1"/>
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:if>
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="java"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="parameter" mode="java">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="java"/>
+ </span>
+</xsl:template>
+
+<xsl:template mode="java" match="constructorsynopsis|destructorsynopsis|methodsynopsis">
+ <xsl:variable name="start-modifiers" select="modifier[following-sibling::*[local-name(.) != 'modifier']]"/>
+ <xsl:variable name="notmod" select="*[local-name(.) != 'modifier']"/>
+ <xsl:variable name="end-modifiers" select="modifier[preceding-sibling::*[local-name(.) != 'modifier']]"/>
+ <xsl:variable name="decl">
+ <xsl:if test="parent::classsynopsis">
+ <xsl:text>&#160;&#160;</xsl:text>
+ </xsl:if>
+ <xsl:apply-templates select="$start-modifiers" mode="java"/>
+
+ <!-- type -->
+ <xsl:if test="local-name($notmod[1]) != 'methodname'">
+ <xsl:apply-templates select="$notmod[1]" mode="java"/>
+ </xsl:if>
+
+ <xsl:apply-templates select="methodname" mode="java"/>
+ </xsl:variable>
+
+ <code>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:copy-of select="$decl"/>
+ <xsl:text>(</xsl:text>
+ <xsl:apply-templates select="methodparam" mode="java">
+ <xsl:with-param name="indent" select="string-length($decl)"/>
+ </xsl:apply-templates>
+ <xsl:text>)</xsl:text>
+ <xsl:if test="exceptionname">
+ <br/>
+ <xsl:text>&#160;&#160;&#160;&#160;throws&#160;</xsl:text>
+ <xsl:apply-templates select="exceptionname" mode="java"/>
+ </xsl:if>
+ <xsl:if test="modifier[preceding-sibling::*[local-name(.) != 'modifier']]">
+ <xsl:text> </xsl:text>
+ <xsl:apply-templates select="$end-modifiers" mode="java"/>
+ </xsl:if>
+ <xsl:text>;</xsl:text>
+ </code>
+ <xsl:call-template name="synop-break"/>
+</xsl:template>
+
+<!-- ===== C++ ========================================================= -->
+
+<xsl:template match="classsynopsis" mode="cpp">
+ <pre>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates select="ooclass[1]" mode="cpp"/>
+ <xsl:if test="ooclass[preceding-sibling::*]">
+ <xsl:text>: </xsl:text>
+ <xsl:apply-templates select="ooclass[preceding-sibling::*]" mode="cpp"/>
+ <xsl:if test="oointerface|ooexception">
+ <br/>
+ <xsl:text>&#160;&#160;&#160;&#160;</xsl:text>
+ </xsl:if>
+ </xsl:if>
+ <xsl:if test="oointerface">
+ <xsl:text> implements</xsl:text>
+ <xsl:apply-templates select="oointerface" mode="cpp"/>
+ <xsl:if test="ooexception">
+ <br/>
+ <xsl:text>&#160;&#160;&#160;&#160;</xsl:text>
+ </xsl:if>
+ </xsl:if>
+ <xsl:if test="ooexception">
+ <xsl:text> throws</xsl:text>
+ <xsl:apply-templates select="ooexception" mode="cpp"/>
+ </xsl:if>
+ <xsl:text>&#160;{</xsl:text>
+ <br/>
+ <xsl:apply-templates select="constructorsynopsis |destructorsynopsis |fieldsynopsis |methodsynopsis |classsynopsisinfo" mode="cpp"/>
+ <xsl:text>}</xsl:text>
+ </pre>
+</xsl:template>
+
+<xsl:template match="classsynopsisinfo" mode="cpp">
+ <xsl:apply-templates mode="cpp"/>
+</xsl:template>
+
+<xsl:template match="ooclass|oointerface|ooexception" mode="cpp">
+ <xsl:if test="preceding-sibling::*">
+ <xsl:text>, </xsl:text>
+ </xsl:if>
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="cpp"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="modifier|package" mode="cpp">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="cpp"/>
+ <xsl:if test="following-sibling::*">
+ <xsl:text>&#160;</xsl:text>
+ </xsl:if>
+ </span>
+</xsl:template>
+
+<xsl:template match="classname" mode="cpp">
+ <xsl:if test="local-name(preceding-sibling::*[1]) = 'classname'">
+ <xsl:text>, </xsl:text>
+ </xsl:if>
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="cpp"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="interfacename" mode="cpp">
+ <xsl:if test="local-name(preceding-sibling::*[1]) = 'interfacename'">
+ <xsl:text>, </xsl:text>
+ </xsl:if>
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="cpp"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="exceptionname" mode="cpp">
+ <xsl:if test="local-name(preceding-sibling::*[1]) = 'exceptionname'">
+ <xsl:text>, </xsl:text>
+ </xsl:if>
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="cpp"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="fieldsynopsis" mode="cpp">
+ <code>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:if test="parent::classsynopsis">
+ <xsl:text>&#160;&#160;</xsl:text>
+ </xsl:if>
+ <xsl:apply-templates mode="cpp"/>
+ <xsl:text>;</xsl:text>
+ </code>
+ <xsl:call-template name="synop-break"/>
+</xsl:template>
+
+<xsl:template match="type" mode="cpp">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="cpp"/>
+ <xsl:text>&#160;</xsl:text>
+ </span>
+</xsl:template>
+
+<xsl:template match="varname" mode="cpp">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="cpp"/>
+ <xsl:text>&#160;</xsl:text>
+ </span>
+</xsl:template>
+
+<xsl:template match="initializer" mode="cpp">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:text>=&#160;</xsl:text>
+ <xsl:apply-templates mode="cpp"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="void" mode="cpp">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:text>void&#160;</xsl:text>
+ </span>
+</xsl:template>
+
+<xsl:template match="methodname" mode="cpp">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="cpp"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="methodparam" mode="cpp">
+ <xsl:if test="preceding-sibling::methodparam">
+ <xsl:text>, </xsl:text>
+ </xsl:if>
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="cpp"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="parameter" mode="cpp">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="cpp"/>
+ </span>
+</xsl:template>
+
+<xsl:template mode="cpp" match="constructorsynopsis|destructorsynopsis|methodsynopsis">
+ <xsl:variable name="start-modifiers" select="modifier[following-sibling::*[local-name(.) != 'modifier']]"/>
+ <xsl:variable name="notmod" select="*[local-name(.) != 'modifier']"/>
+ <xsl:variable name="end-modifiers" select="modifier[preceding-sibling::*[local-name(.) != 'modifier']]"/>
+
+ <code>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:if test="parent::classsynopsis">
+ <xsl:text>&#160;&#160;</xsl:text>
+ </xsl:if>
+ <xsl:apply-templates select="$start-modifiers" mode="cpp"/>
+
+ <!-- type -->
+ <xsl:if test="local-name($notmod[1]) != 'methodname'">
+ <xsl:apply-templates select="$notmod[1]" mode="cpp"/>
+ </xsl:if>
+
+ <xsl:apply-templates select="methodname" mode="cpp"/>
+ <xsl:text>(</xsl:text>
+ <xsl:apply-templates select="methodparam" mode="cpp"/>
+ <xsl:text>)</xsl:text>
+ <xsl:if test="exceptionname">
+ <br/>
+ <xsl:text>&#160;&#160;&#160;&#160;throws&#160;</xsl:text>
+ <xsl:apply-templates select="exceptionname" mode="cpp"/>
+ </xsl:if>
+ <xsl:if test="modifier[preceding-sibling::*[local-name(.) != 'modifier']]">
+ <xsl:text> </xsl:text>
+ <xsl:apply-templates select="$end-modifiers" mode="cpp"/>
+ </xsl:if>
+ <xsl:text>;</xsl:text>
+ </code>
+ <xsl:call-template name="synop-break"/>
+</xsl:template>
+
+<!-- ===== IDL ========================================================= -->
+
+<xsl:template match="classsynopsis" mode="idl">
+ <pre>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:text>interface </xsl:text>
+ <xsl:apply-templates select="ooclass[1]" mode="idl"/>
+ <xsl:if test="ooclass[preceding-sibling::*]">
+ <xsl:text>: </xsl:text>
+ <xsl:apply-templates select="ooclass[preceding-sibling::*]" mode="idl"/>
+ <xsl:if test="oointerface|ooexception">
+ <br/>
+ <xsl:text>&#160;&#160;&#160;&#160;</xsl:text>
+ </xsl:if>
+ </xsl:if>
+ <xsl:if test="oointerface">
+ <xsl:text> implements</xsl:text>
+ <xsl:apply-templates select="oointerface" mode="idl"/>
+ <xsl:if test="ooexception">
+ <br/>
+ <xsl:text>&#160;&#160;&#160;&#160;</xsl:text>
+ </xsl:if>
+ </xsl:if>
+ <xsl:if test="ooexception">
+ <xsl:text> throws</xsl:text>
+ <xsl:apply-templates select="ooexception" mode="idl"/>
+ </xsl:if>
+ <xsl:text>&#160;{</xsl:text>
+ <br/>
+ <xsl:apply-templates select="constructorsynopsis |destructorsynopsis |fieldsynopsis |methodsynopsis |classsynopsisinfo" mode="idl"/>
+ <xsl:text>}</xsl:text>
+ </pre>
+</xsl:template>
+
+<xsl:template match="classsynopsisinfo" mode="idl">
+ <xsl:apply-templates mode="idl"/>
+</xsl:template>
+
+<xsl:template match="ooclass|oointerface|ooexception" mode="idl">
+ <xsl:if test="preceding-sibling::*">
+ <xsl:text>, </xsl:text>
+ </xsl:if>
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="idl"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="modifier|package" mode="idl">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="idl"/>
+ <xsl:if test="following-sibling::*">
+ <xsl:text>&#160;</xsl:text>
+ </xsl:if>
+ </span>
+</xsl:template>
+
+<xsl:template match="classname" mode="idl">
+ <xsl:if test="local-name(preceding-sibling::*[1]) = 'classname'">
+ <xsl:text>, </xsl:text>
+ </xsl:if>
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="idl"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="interfacename" mode="idl">
+ <xsl:if test="local-name(preceding-sibling::*[1]) = 'interfacename'">
+ <xsl:text>, </xsl:text>
+ </xsl:if>
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="idl"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="exceptionname" mode="idl">
+ <xsl:if test="local-name(preceding-sibling::*[1]) = 'exceptionname'">
+ <xsl:text>, </xsl:text>
+ </xsl:if>
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="idl"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="fieldsynopsis" mode="idl">
+ <code>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:if test="parent::classsynopsis">
+ <xsl:text>&#160;&#160;</xsl:text>
+ </xsl:if>
+ <xsl:apply-templates mode="idl"/>
+ <xsl:text>;</xsl:text>
+ </code>
+ <xsl:call-template name="synop-break"/>
+</xsl:template>
+
+<xsl:template match="type" mode="idl">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="idl"/>
+ <xsl:text>&#160;</xsl:text>
+ </span>
+</xsl:template>
+
+<xsl:template match="varname" mode="idl">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="idl"/>
+ <xsl:text>&#160;</xsl:text>
+ </span>
+</xsl:template>
+
+<xsl:template match="initializer" mode="idl">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:text>=&#160;</xsl:text>
+ <xsl:apply-templates mode="idl"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="void" mode="idl">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:text>void&#160;</xsl:text>
+ </span>
+</xsl:template>
+
+<xsl:template match="methodname" mode="idl">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="idl"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="methodparam" mode="idl">
+ <xsl:if test="preceding-sibling::methodparam">
+ <xsl:text>, </xsl:text>
+ </xsl:if>
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="idl"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="parameter" mode="idl">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="idl"/>
+ </span>
+</xsl:template>
+
+<xsl:template mode="idl" match="constructorsynopsis|destructorsynopsis|methodsynopsis">
+ <xsl:variable name="start-modifiers" select="modifier[following-sibling::*[local-name(.) != 'modifier']]"/>
+ <xsl:variable name="notmod" select="*[local-name(.) != 'modifier']"/>
+ <xsl:variable name="end-modifiers" select="modifier[preceding-sibling::*[local-name(.) != 'modifier']]"/>
+ <code>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:if test="parent::classsynopsis">
+ <xsl:text>&#160;&#160;</xsl:text>
+ </xsl:if>
+ <xsl:apply-templates select="$start-modifiers" mode="idl"/>
+
+ <!-- type -->
+ <xsl:if test="local-name($notmod[1]) != 'methodname'">
+ <xsl:apply-templates select="$notmod[1]" mode="idl"/>
+ </xsl:if>
+
+ <xsl:apply-templates select="methodname" mode="idl"/>
+ <xsl:text>(</xsl:text>
+ <xsl:apply-templates select="methodparam" mode="idl"/>
+ <xsl:text>)</xsl:text>
+ <xsl:if test="exceptionname">
+ <br/>
+ <xsl:text>&#160;&#160;&#160;&#160;raises(</xsl:text>
+ <xsl:apply-templates select="exceptionname" mode="idl"/>
+ <xsl:text>)</xsl:text>
+ </xsl:if>
+ <xsl:if test="modifier[preceding-sibling::*[local-name(.) != 'modifier']]">
+ <xsl:text> </xsl:text>
+ <xsl:apply-templates select="$end-modifiers" mode="idl"/>
+ </xsl:if>
+ <xsl:text>;</xsl:text>
+ </code>
+ <xsl:call-template name="synop-break"/>
+</xsl:template>
+
+<!-- ===== Perl ======================================================== -->
+
+<xsl:template match="classsynopsis" mode="perl">
+ <pre>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:text>package </xsl:text>
+ <xsl:apply-templates select="ooclass[1]" mode="perl"/>
+ <xsl:text>;</xsl:text>
+ <br/>
+
+ <xsl:if test="ooclass[preceding-sibling::*]">
+ <xsl:text>@ISA = (</xsl:text>
+ <xsl:apply-templates select="ooclass[preceding-sibling::*]" mode="perl"/>
+ <xsl:text>);</xsl:text>
+ <br/>
+ </xsl:if>
+
+ <xsl:apply-templates select="constructorsynopsis |destructorsynopsis |fieldsynopsis |methodsynopsis |classsynopsisinfo" mode="perl"/>
+ </pre>
+</xsl:template>
+
+<xsl:template match="classsynopsisinfo" mode="perl">
+ <xsl:apply-templates mode="perl"/>
+</xsl:template>
+
+<xsl:template match="ooclass|oointerface|ooexception" mode="perl">
+ <xsl:if test="preceding-sibling::*">
+ <xsl:text>, </xsl:text>
+ </xsl:if>
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="perl"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="modifier|package" mode="perl">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="perl"/>
+ <xsl:if test="following-sibling::*">
+ <xsl:text>&#160;</xsl:text>
+ </xsl:if>
+ </span>
+</xsl:template>
+
+<xsl:template match="classname" mode="perl">
+ <xsl:if test="local-name(preceding-sibling::*[1]) = 'classname'">
+ <xsl:text>, </xsl:text>
+ </xsl:if>
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="perl"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="interfacename" mode="perl">
+ <xsl:if test="local-name(preceding-sibling::*[1]) = 'interfacename'">
+ <xsl:text>, </xsl:text>
+ </xsl:if>
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="perl"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="exceptionname" mode="perl">
+ <xsl:if test="local-name(preceding-sibling::*[1]) = 'exceptionname'">
+ <xsl:text>, </xsl:text>
+ </xsl:if>
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="perl"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="fieldsynopsis" mode="perl">
+ <code>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:if test="parent::classsynopsis">
+ <xsl:text>&#160;&#160;</xsl:text>
+ </xsl:if>
+ <xsl:apply-templates mode="perl"/>
+ <xsl:text>;</xsl:text>
+ </code>
+ <xsl:call-template name="synop-break"/>
+</xsl:template>
+
+<xsl:template match="type" mode="perl">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="perl"/>
+ <xsl:text>&#160;</xsl:text>
+ </span>
+</xsl:template>
+
+<xsl:template match="varname" mode="perl">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="perl"/>
+ <xsl:text>&#160;</xsl:text>
+ </span>
+</xsl:template>
+
+<xsl:template match="initializer" mode="perl">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:text>=&#160;</xsl:text>
+ <xsl:apply-templates mode="perl"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="void" mode="perl">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:text>void&#160;</xsl:text>
+ </span>
+</xsl:template>
+
+<xsl:template match="methodname" mode="perl">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="perl"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="methodparam" mode="perl">
+ <xsl:if test="preceding-sibling::methodparam">
+ <xsl:text>, </xsl:text>
+ </xsl:if>
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="perl"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="parameter" mode="perl">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="perl"/>
+ </span>
+</xsl:template>
+
+<xsl:template mode="perl" match="constructorsynopsis|destructorsynopsis|methodsynopsis">
+ <xsl:variable name="start-modifiers" select="modifier[following-sibling::*[local-name(.) != 'modifier']]"/>
+ <xsl:variable name="notmod" select="*[local-name(.) != 'modifier']"/>
+ <xsl:variable name="end-modifiers" select="modifier[preceding-sibling::*[local-name(.) != 'modifier']]"/>
+
+ <code>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:text>sub </xsl:text>
+
+ <xsl:apply-templates select="methodname" mode="perl"/>
+ <xsl:text> { ... };</xsl:text>
+ </code>
+ <xsl:call-template name="synop-break"/>
+</xsl:template>
+
+<!-- Used when not occurring as a child of classsynopsis -->
+<xsl:template match="ooclass|oointerface|ooexception">
+ <xsl:apply-templates/>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<!-- * DocBook 5 allows linking elements (link, olink, and xref) -->
+<!-- * within the OO *synopsis elements (classsynopsis, fieldsynopsis, -->
+<!-- * methodsynopsis, constructorsynopsis, destructorsynopsis) and -->
+<!-- * their children. So we need to have mode="java|cpp|idl|perl" -->
+<!-- * per-mode matches for those linking elements in order for them -->
+<!-- * to be processed as expected. -->
+
+<xsl:template match="link|olink|xref" mode="java">
+ <xsl:apply-templates select="."/>
+</xsl:template>
+
+<xsl:template match="link|olink|xref" mode="cpp">
+ <xsl:apply-templates select="."/>
+</xsl:template>
+
+<xsl:template match="link|olink|xref" mode="idl">
+ <xsl:apply-templates select="."/>
+</xsl:template>
+
+<xsl:template match="link|olink|xref" mode="perl">
+ <xsl:apply-templates select="."/>
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/table.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/table.xsl
new file mode 100644
index 0000000..42fe259
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/table.xsl
@@ -0,0 +1,1168 @@
+<?xml version="1.0" encoding="ASCII"?>
+<!--This file was created automatically by html2xhtml-->
+<!--from the HTML stylesheets.-->
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:doc="http://nwalsh.com/xsl/documentation/1.0" xmlns:stbl="http://nwalsh.com/xslt/ext/com.nwalsh.saxon.Table" xmlns:xtbl="xalan://com.nwalsh.xalan.Table" xmlns:lxslt="http://xml.apache.org/xslt" xmlns:ptbl="http://nwalsh.com/xslt/ext/xsltproc/python/Table" xmlns="http://www.w3.org/1999/xhtml" exclude-result-prefixes="doc stbl xtbl lxslt ptbl" version="1.0">
+
+<xsl:include href="../common/table.xsl"/>
+
+<!-- ********************************************************************
+ $Id: table.xsl 8813 2010-08-09 21:18:23Z bobstayton $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<lxslt:component prefix="xtbl" functions="adjustColumnWidths"/>
+
+<xsl:template name="empty.table.cell">
+ <xsl:param name="colnum" select="0"/>
+
+ <xsl:variable name="rowsep">
+ <xsl:choose>
+ <!-- If this is the last row, rowsep never applies. -->
+ <xsl:when test="not(ancestor-or-self::row[1]/following-sibling::row or ancestor-or-self::thead/following-sibling::tbody or ancestor-or-self::tbody/preceding-sibling::tfoot)">
+ <xsl:value-of select="0"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="inherited.table.attribute">
+ <xsl:with-param name="entry" select="NOT-AN-ELEMENT-NAME"/>
+ <xsl:with-param name="row" select="ancestor-or-self::row[1]"/>
+ <xsl:with-param name="colnum" select="$colnum"/>
+ <xsl:with-param name="attribute" select="'rowsep'"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="colsep">
+ <xsl:choose>
+ <!-- If this is the last column, colsep never applies. -->
+ <xsl:when test="number($colnum) &gt;= ancestor::tgroup/@cols">0</xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="inherited.table.attribute">
+ <xsl:with-param name="entry" select="NOT-AN-ELEMENT-NAME"/>
+ <xsl:with-param name="row" select="ancestor-or-self::row[1]"/>
+ <xsl:with-param name="colnum" select="$colnum"/>
+ <xsl:with-param name="attribute" select="'colsep'"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <td class="auto-generated">
+ <xsl:if test="$table.borders.with.css != 0">
+ <xsl:attribute name="style">
+ <xsl:if test="$colsep &gt; 0">
+ <xsl:call-template name="border">
+ <xsl:with-param name="side" select="'right'"/>
+ </xsl:call-template>
+ </xsl:if>
+ <xsl:if test="$rowsep &gt; 0">
+ <xsl:call-template name="border">
+ <xsl:with-param name="side" select="'bottom'"/>
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:text>&#160;</xsl:text>
+ </td>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template name="border">
+ <xsl:param name="side" select="'left'"/>
+ <xsl:param name="padding" select="0"/>
+ <xsl:param name="style" select="$table.cell.border.style"/>
+ <xsl:param name="color" select="$table.cell.border.color"/>
+ <xsl:param name="thickness" select="$table.cell.border.thickness"/>
+
+ <!-- Note: Some browsers (mozilla) require at least a width and style. -->
+
+ <xsl:choose>
+ <xsl:when test="($thickness != '' and $style != '' and $color != '') or ($thickness != '' and $style != '') or ($thickness != '')">
+ <!-- use the compound property if we can: -->
+ <!-- it saves space and probably works more reliably -->
+ <xsl:text>border-</xsl:text>
+ <xsl:value-of select="$side"/>
+ <xsl:text>: </xsl:text>
+ <xsl:value-of select="$thickness"/>
+ <xsl:text> </xsl:text>
+ <xsl:value-of select="$style"/>
+ <xsl:text> </xsl:text>
+ <xsl:value-of select="$color"/>
+ <xsl:text>; </xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <!-- we need to specify the styles individually -->
+ <xsl:if test="$thickness != ''">
+ <xsl:text>border-</xsl:text>
+ <xsl:value-of select="$side"/>
+ <xsl:text>-width: </xsl:text>
+ <xsl:value-of select="$thickness"/>
+ <xsl:text>; </xsl:text>
+ </xsl:if>
+
+ <xsl:if test="$style != ''">
+ <xsl:text>border-</xsl:text>
+ <xsl:value-of select="$side"/>
+ <xsl:text>-style: </xsl:text>
+ <xsl:value-of select="$style"/>
+ <xsl:text>; </xsl:text>
+ </xsl:if>
+
+ <xsl:if test="$color != ''">
+ <xsl:text>border-</xsl:text>
+ <xsl:value-of select="$side"/>
+ <xsl:text>-color: </xsl:text>
+ <xsl:value-of select="$color"/>
+ <xsl:text>; </xsl:text>
+ </xsl:if>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="tgroup" name="tgroup">
+ <xsl:if test="not(@cols) or @cols = '' or string(number(@cols)) = 'NaN'">
+ <xsl:message terminate="yes">
+ <xsl:text>Error: CALS tables must specify the number of columns.</xsl:text>
+ </xsl:message>
+ </xsl:if>
+
+ <xsl:variable name="summary">
+ <xsl:call-template name="pi.dbhtml_table-summary"/>
+ </xsl:variable>
+
+ <xsl:variable name="cellspacing">
+ <xsl:call-template name="pi.dbhtml_cellspacing"/>
+ </xsl:variable>
+
+ <xsl:variable name="cellpadding">
+ <xsl:call-template name="pi.dbhtml_cellpadding"/>
+ </xsl:variable>
+
+ <table>
+ <xsl:choose>
+ <!-- If there's a textobject/phrase for the table summary, use it -->
+ <xsl:when test="../textobject/phrase">
+ <xsl:attribute name="summary">
+ <xsl:value-of select="../textobject/phrase"/>
+ </xsl:attribute>
+ </xsl:when>
+
+ <!-- If there's a <?dbhtml table-summary="foo"?> PI, use it for
+ the HTML table summary attribute -->
+ <xsl:when test="$summary != ''">
+ <xsl:attribute name="summary">
+ <xsl:value-of select="$summary"/>
+ </xsl:attribute>
+ </xsl:when>
+
+ <!-- Otherwise, if there's a title, use that -->
+ <xsl:when test="../title">
+ <xsl:attribute name="summary">
+ <!-- This screws up on inline markup and footnotes, oh well... -->
+ <xsl:value-of select="string(../title)"/>
+ </xsl:attribute>
+ </xsl:when>
+
+ <!-- Otherwise, forget the whole idea -->
+ <xsl:otherwise><!-- nevermind --></xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:if test="$cellspacing != '' or $html.cellspacing != ''">
+ <xsl:attribute name="cellspacing">
+ <xsl:choose>
+ <xsl:when test="$cellspacing != ''">
+ <xsl:value-of select="$cellspacing"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$html.cellspacing"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:if test="$cellpadding != '' or $html.cellpadding != ''">
+ <xsl:attribute name="cellpadding">
+ <xsl:choose>
+ <xsl:when test="$cellpadding != ''">
+ <xsl:value-of select="$cellpadding"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$html.cellpadding"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:if test="../@pgwide=1 or local-name(.) = 'entrytbl'">
+ <xsl:attribute name="width">100%</xsl:attribute>
+ </xsl:if>
+
+ <xsl:choose>
+ <xsl:when test="$table.borders.with.css != 0">
+ <xsl:choose>
+ <xsl:when test="../@frame='all' or (not(../@frame) and $default.table.frame='all')">
+ <xsl:attribute name="style">
+ <xsl:text>border-collapse: collapse;</xsl:text>
+ <xsl:call-template name="border">
+ <xsl:with-param name="side" select="'top'"/>
+ <xsl:with-param name="style" select="$table.frame.border.style"/>
+ <xsl:with-param name="color" select="$table.frame.border.color"/>
+ <xsl:with-param name="thickness" select="$table.frame.border.thickness"/>
+ </xsl:call-template>
+ <xsl:call-template name="border">
+ <xsl:with-param name="side" select="'bottom'"/>
+ <xsl:with-param name="style" select="$table.frame.border.style"/>
+ <xsl:with-param name="color" select="$table.frame.border.color"/>
+ <xsl:with-param name="thickness" select="$table.frame.border.thickness"/>
+ </xsl:call-template>
+ <xsl:call-template name="border">
+ <xsl:with-param name="side" select="'left'"/>
+ <xsl:with-param name="style" select="$table.frame.border.style"/>
+ <xsl:with-param name="color" select="$table.frame.border.color"/>
+ <xsl:with-param name="thickness" select="$table.frame.border.thickness"/>
+ </xsl:call-template>
+ <xsl:call-template name="border">
+ <xsl:with-param name="side" select="'right'"/>
+ <xsl:with-param name="style" select="$table.frame.border.style"/>
+ <xsl:with-param name="color" select="$table.frame.border.color"/>
+ <xsl:with-param name="thickness" select="$table.frame.border.thickness"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ </xsl:when>
+ <xsl:when test="../@frame='topbot' or (not(../@frame) and $default.table.frame='topbot')">
+ <xsl:attribute name="style">
+ <xsl:text>border-collapse: collapse;</xsl:text>
+ <xsl:call-template name="border">
+ <xsl:with-param name="side" select="'top'"/>
+ <xsl:with-param name="style" select="$table.frame.border.style"/>
+ <xsl:with-param name="color" select="$table.frame.border.color"/>
+ <xsl:with-param name="thickness" select="$table.frame.border.thickness"/>
+ </xsl:call-template>
+ <xsl:call-template name="border">
+ <xsl:with-param name="side" select="'bottom'"/>
+ <xsl:with-param name="style" select="$table.frame.border.style"/>
+ <xsl:with-param name="color" select="$table.frame.border.color"/>
+ <xsl:with-param name="thickness" select="$table.frame.border.thickness"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ </xsl:when>
+ <xsl:when test="../@frame='top' or (not(../@frame) and $default.table.frame='top')">
+ <xsl:attribute name="style">
+ <xsl:text>border-collapse: collapse;</xsl:text>
+ <xsl:call-template name="border">
+ <xsl:with-param name="side" select="'top'"/>
+ <xsl:with-param name="style" select="$table.frame.border.style"/>
+ <xsl:with-param name="color" select="$table.frame.border.color"/>
+ <xsl:with-param name="thickness" select="$table.frame.border.thickness"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ </xsl:when>
+ <xsl:when test="../@frame='bottom' or (not(../@frame) and $default.table.frame='bottom')">
+ <xsl:attribute name="style">
+ <xsl:text>border-collapse: collapse;</xsl:text>
+ <xsl:call-template name="border">
+ <xsl:with-param name="side" select="'bottom'"/>
+ <xsl:with-param name="style" select="$table.frame.border.style"/>
+ <xsl:with-param name="color" select="$table.frame.border.color"/>
+ <xsl:with-param name="thickness" select="$table.frame.border.thickness"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ </xsl:when>
+ <xsl:when test="../@frame='sides' or (not(../@frame) and $default.table.frame='sides')">
+ <xsl:attribute name="style">
+ <xsl:text>border-collapse: collapse;</xsl:text>
+ <xsl:call-template name="border">
+ <xsl:with-param name="side" select="'left'"/>
+ <xsl:with-param name="style" select="$table.frame.border.style"/>
+ <xsl:with-param name="color" select="$table.frame.border.color"/>
+ <xsl:with-param name="thickness" select="$table.frame.border.thickness"/>
+ </xsl:call-template>
+ <xsl:call-template name="border">
+ <xsl:with-param name="side" select="'right'"/>
+ <xsl:with-param name="style" select="$table.frame.border.style"/>
+ <xsl:with-param name="color" select="$table.frame.border.color"/>
+ <xsl:with-param name="thickness" select="$table.frame.border.thickness"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ </xsl:when>
+ <xsl:when test="../@frame='none'">
+ <xsl:attribute name="style">
+ <xsl:text>border: none;</xsl:text>
+ </xsl:attribute>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:attribute name="style">
+ <xsl:text>border-collapse: collapse;</xsl:text>
+ </xsl:attribute>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ </xsl:when>
+ <xsl:when test="../@frame='none' or (not(../@frame) and $default.table.frame='none') or local-name(.) = 'entrytbl'">
+ <xsl:attribute name="border">0</xsl:attribute>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:attribute name="border">1</xsl:attribute>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:variable name="colgroup">
+ <colgroup>
+ <xsl:call-template name="generate.colgroup">
+ <xsl:with-param name="cols" select="@cols"/>
+ </xsl:call-template>
+ </colgroup>
+ </xsl:variable>
+
+ <xsl:variable name="explicit.table.width">
+ <xsl:call-template name="pi.dbhtml_table-width">
+ <xsl:with-param name="node" select=".."/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="table.width">
+ <xsl:choose>
+ <xsl:when test="$explicit.table.width != ''">
+ <xsl:value-of select="$explicit.table.width"/>
+ </xsl:when>
+ <xsl:when test="$default.table.width = ''">
+ <xsl:text>100%</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$default.table.width"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:if test="$default.table.width != '' or $explicit.table.width != ''">
+ <xsl:attribute name="width">
+ <xsl:choose>
+ <xsl:when test="contains($table.width, '%')">
+ <xsl:value-of select="$table.width"/>
+ </xsl:when>
+ <xsl:when test="$use.extensions != 0 and $tablecolumns.extension != 0">
+ <xsl:choose>
+ <xsl:when test="function-available('stbl:convertLength')">
+ <xsl:value-of select="stbl:convertLength($table.width)"/>
+ </xsl:when>
+ <xsl:when test="function-available('xtbl:convertLength')">
+ <xsl:value-of select="xtbl:convertLength($table.width)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:message terminate="yes">
+ <xsl:text>No convertLength function available.</xsl:text>
+ </xsl:message>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$table.width"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:choose>
+ <xsl:when test="$use.extensions != 0 and $tablecolumns.extension != 0">
+ <xsl:choose>
+ <xsl:when test="function-available('stbl:adjustColumnWidths')">
+ <xsl:copy-of select="stbl:adjustColumnWidths($colgroup)"/>
+ </xsl:when>
+ <xsl:when test="function-available('xtbl:adjustColumnWidths')">
+ <xsl:copy-of select="xtbl:adjustColumnWidths($colgroup)"/>
+ </xsl:when>
+ <xsl:when test="function-available('ptbl:adjustColumnWidths')">
+ <xsl:copy-of select="ptbl:adjustColumnWidths($colgroup)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:message terminate="yes">
+ <xsl:text>No adjustColumnWidths function available.</xsl:text>
+ </xsl:message>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:copy-of select="$colgroup"/>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ <xsl:apply-templates select="thead"/>
+ <xsl:apply-templates select="tfoot"/>
+ <xsl:apply-templates select="tbody"/>
+
+ <xsl:if test=".//footnote|../title//footnote">
+ <tbody class="footnotes">
+ <tr>
+ <td colspan="{@cols}">
+ <xsl:apply-templates select=".//footnote|../title//footnote" mode="table.footnote.mode"/>
+ </td>
+ </tr>
+ </tbody>
+ </xsl:if>
+ </table>
+</xsl:template>
+
+<xsl:template match="tgroup/processing-instruction('dbhtml')">
+ <xsl:variable name="summary">
+ <xsl:call-template name="pi.dbhtml_table-summary"/>
+ </xsl:variable>
+
+ <!-- Suppress the table-summary PI -->
+ <xsl:if test="$summary = ''">
+ <xsl:processing-instruction name="dbhtml">
+ <xsl:value-of select="."/>
+ </xsl:processing-instruction>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="colspec"/>
+
+<xsl:template match="spanspec"/>
+
+<xsl:template match="thead|tfoot">
+ <xsl:element name="{local-name(.)}" namespace="http://www.w3.org/1999/xhtml">
+ <xsl:if test="@align">
+ <xsl:attribute name="align">
+ <xsl:value-of select="@align"/>
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:if test="@char">
+ <xsl:attribute name="char">
+ <xsl:value-of select="@char"/>
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:if test="@charoff">
+ <xsl:attribute name="charoff">
+ <xsl:value-of select="@charoff"/>
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:if test="@valign">
+ <xsl:attribute name="valign">
+ <xsl:value-of select="@valign"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:choose>
+ <!-- recurse on rows only if @morerows is present -->
+ <xsl:when test="row/entry/@morerows|row/entrytbl/@morerows">
+ <xsl:apply-templates select="row[1]">
+ <xsl:with-param name="spans">
+ <xsl:call-template name="blank.spans">
+ <xsl:with-param name="cols" select="../@cols"/>
+ </xsl:call-template>
+ </xsl:with-param>
+ <xsl:with-param name="browserows" select="'recurse'"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="row">
+ <xsl:with-param name="spans">
+ <xsl:call-template name="blank.spans">
+ <xsl:with-param name="cols" select="../@cols"/>
+ </xsl:call-template>
+ </xsl:with-param>
+ <xsl:with-param name="browserows" select="'loop'"/>
+ </xsl:apply-templates>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ </xsl:element>
+</xsl:template>
+
+<xsl:template match="tbody">
+ <tbody>
+ <xsl:if test="@align">
+ <xsl:attribute name="align">
+ <xsl:value-of select="@align"/>
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:if test="@char">
+ <xsl:attribute name="char">
+ <xsl:value-of select="@char"/>
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:if test="@charoff">
+ <xsl:attribute name="charoff">
+ <xsl:value-of select="@charoff"/>
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:if test="@valign">
+ <xsl:attribute name="valign">
+ <xsl:value-of select="@valign"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:choose>
+ <xsl:when test="row/entry/@morerows|row/entrytbl/@morerows">
+ <xsl:apply-templates select="row[1]">
+ <xsl:with-param name="spans">
+ <xsl:call-template name="blank.spans">
+ <xsl:with-param name="cols" select="../@cols"/>
+ </xsl:call-template>
+ </xsl:with-param>
+ <xsl:with-param name="browserows" select="'recurse'"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="row">
+ <xsl:with-param name="spans">
+ <xsl:call-template name="blank.spans">
+ <xsl:with-param name="cols" select="../@cols"/>
+ </xsl:call-template>
+ </xsl:with-param>
+ <xsl:with-param name="browserows" select="'loop'"/>
+ </xsl:apply-templates>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ </tbody>
+</xsl:template>
+
+<xsl:template match="row">
+ <xsl:param name="spans"/>
+ <xsl:param name="browserows"/>
+
+ <xsl:choose>
+ <xsl:when test="contains($spans, '0')">
+ <xsl:call-template name="normal-row">
+ <xsl:with-param name="spans" select="$spans"/>
+ <xsl:with-param name="browserows" select="$browserows"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <!--
+ <xsl:message>
+ <xsl:text>Ignoring row: </xsl:text>
+ <xsl:value-of select="$spans"/>
+ <xsl:text> = </xsl:text>
+ <xsl:call-template name="consume-row">
+ <xsl:with-param name="spans" select="$spans"/>
+ </xsl:call-template>
+ </xsl:message>
+ -->
+
+ <xsl:if test="normalize-space(.//text()) != ''">
+ <xsl:message>Warning: overlapped row contains content!</xsl:message>
+ </xsl:if>
+
+ <tr><xsl:comment> This row intentionally left blank </xsl:comment></tr>
+
+ <xsl:if test="$browserows = 'recurse'">
+ <xsl:apply-templates select="following-sibling::row[1]">
+ <xsl:with-param name="spans">
+ <xsl:call-template name="consume-row">
+ <xsl:with-param name="spans" select="$spans"/>
+ </xsl:call-template>
+ </xsl:with-param>
+ <xsl:with-param name="browserows" select="$browserows"/>
+ </xsl:apply-templates>
+ </xsl:if>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="normal-row">
+ <xsl:param name="spans"/>
+ <xsl:param name="browserows"/>
+
+ <xsl:variable name="row-height">
+ <xsl:if test="processing-instruction('dbhtml')">
+ <xsl:call-template name="pi.dbhtml_row-height"/>
+ </xsl:if>
+ </xsl:variable>
+
+ <xsl:variable name="bgcolor">
+ <xsl:if test="processing-instruction('dbhtml')">
+ <xsl:call-template name="pi.dbhtml_bgcolor"/>
+ </xsl:if>
+ </xsl:variable>
+
+ <xsl:variable name="class">
+ <xsl:if test="processing-instruction('dbhtml')">
+ <xsl:call-template name="pi.dbhtml_class"/>
+ </xsl:if>
+ </xsl:variable>
+
+ <tr>
+ <xsl:call-template name="tr.attributes">
+ <xsl:with-param name="rownum">
+ <xsl:number from="tgroup" count="row"/>
+ </xsl:with-param>
+ </xsl:call-template>
+
+ <xsl:if test="$row-height != ''">
+ <xsl:attribute name="height">
+ <xsl:value-of select="$row-height"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:if test="$bgcolor != ''">
+ <xsl:attribute name="bgcolor">
+ <xsl:value-of select="$bgcolor"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:if test="$class != ''">
+ <xsl:attribute name="class">
+ <xsl:value-of select="$class"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:if test="$table.borders.with.css != 0">
+ <xsl:if test="@rowsep = 1 and following-sibling::row">
+ <xsl:attribute name="style">
+ <xsl:call-template name="border">
+ <xsl:with-param name="side" select="'bottom'"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ </xsl:if>
+ </xsl:if>
+
+ <xsl:if test="@align">
+ <xsl:attribute name="align">
+ <xsl:value-of select="@align"/>
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:if test="@char">
+ <xsl:attribute name="char">
+ <xsl:value-of select="@char"/>
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:if test="@charoff">
+ <xsl:attribute name="charoff">
+ <xsl:value-of select="@charoff"/>
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:if test="@valign">
+ <xsl:attribute name="valign">
+ <xsl:value-of select="@valign"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:apply-templates select="(entry|entrytbl)[1]">
+ <xsl:with-param name="spans" select="$spans"/>
+ </xsl:apply-templates>
+ </tr>
+
+ <xsl:if test="$browserows = 'recurse'">
+ <xsl:if test="following-sibling::row">
+ <xsl:variable name="nextspans">
+ <xsl:apply-templates select="(entry|entrytbl)[1]" mode="span">
+ <xsl:with-param name="spans" select="$spans"/>
+ </xsl:apply-templates>
+ </xsl:variable>
+
+ <xsl:apply-templates select="following-sibling::row[1]">
+ <xsl:with-param name="spans" select="$nextspans"/>
+ <xsl:with-param name="browserows" select="$browserows"/>
+ </xsl:apply-templates>
+ </xsl:if>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="entry|entrytbl" name="entry">
+ <xsl:param name="col">
+ <xsl:choose>
+ <xsl:when test="@revisionflag">
+ <xsl:number from="row"/>
+ </xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:param>
+
+ <xsl:param name="spans"/>
+
+ <xsl:variable name="cellgi">
+ <xsl:choose>
+ <xsl:when test="ancestor::thead">th</xsl:when>
+ <xsl:when test="ancestor::tfoot">th</xsl:when>
+ <xsl:when test="ancestor::tbody and (ancestor::table[@rowheader = 'firstcol'] or ancestor::informaltable[@rowheader = 'firstcol']) and ancestor-or-self::entry[1][count(preceding-sibling::entry) = 0]">
+ <xsl:text>th</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>td</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="empty.cell" select="count(node()) = 0"/>
+
+ <xsl:variable name="named.colnum">
+ <xsl:call-template name="entry.colnum"/>
+ </xsl:variable>
+
+ <xsl:variable name="entry.colnum">
+ <xsl:choose>
+ <xsl:when test="$named.colnum &gt; 0">
+ <xsl:value-of select="$named.colnum"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$col"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="entry.colspan">
+ <xsl:choose>
+ <xsl:when test="@spanname or @namest">
+ <xsl:call-template name="calculate.colspan"/>
+ </xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="following.spans">
+ <xsl:call-template name="calculate.following.spans">
+ <xsl:with-param name="colspan" select="$entry.colspan"/>
+ <xsl:with-param name="spans" select="$spans"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="rowsep">
+ <xsl:choose>
+ <!-- If this is the last row, rowsep never applies. -->
+ <xsl:when test="ancestor::entrytbl and not (ancestor-or-self::row[1]/following-sibling::row) and not (ancestor::thead)">
+ <xsl:value-of select="0"/>
+ </xsl:when>
+ <xsl:when test="not(ancestor-or-self::row[1]/following-sibling::row or ancestor-or-self::thead/following-sibling::tbody or ancestor-or-self::tbody/preceding-sibling::tfoot)">
+ <xsl:value-of select="0"/>
+ </xsl:when>
+ <xsl:when test="@morerows and not(@morerows &lt; count(ancestor-or-self::row[1]/following-sibling::row))">
+ <xsl:value-of select="0"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="inherited.table.attribute">
+ <xsl:with-param name="entry" select="."/>
+ <xsl:with-param name="colnum" select="$entry.colnum"/>
+ <xsl:with-param name="attribute" select="'rowsep'"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="colsep">
+ <xsl:choose>
+ <!-- If this is the last column, colsep never applies. -->
+ <xsl:when test="$following.spans = ''">0</xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="inherited.table.attribute">
+ <xsl:with-param name="entry" select="."/>
+ <xsl:with-param name="colnum" select="$entry.colnum"/>
+ <xsl:with-param name="attribute" select="'colsep'"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="valign">
+ <xsl:call-template name="inherited.table.attribute">
+ <xsl:with-param name="entry" select="."/>
+ <xsl:with-param name="colnum" select="$entry.colnum"/>
+ <xsl:with-param name="attribute" select="'valign'"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="align">
+ <xsl:call-template name="inherited.table.attribute">
+ <xsl:with-param name="entry" select="."/>
+ <xsl:with-param name="colnum" select="$entry.colnum"/>
+ <xsl:with-param name="attribute" select="'align'"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="char">
+ <xsl:call-template name="inherited.table.attribute">
+ <xsl:with-param name="entry" select="."/>
+ <xsl:with-param name="colnum" select="$entry.colnum"/>
+ <xsl:with-param name="attribute" select="'char'"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="charoff">
+ <xsl:call-template name="inherited.table.attribute">
+ <xsl:with-param name="entry" select="."/>
+ <xsl:with-param name="colnum" select="$entry.colnum"/>
+ <xsl:with-param name="attribute" select="'charoff'"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="$spans != '' and not(starts-with($spans,'0:'))">
+ <xsl:call-template name="entry">
+ <xsl:with-param name="col" select="$col+1"/>
+ <xsl:with-param name="spans" select="substring-after($spans,':')"/>
+ </xsl:call-template>
+ </xsl:when>
+
+ <xsl:when test="number($entry.colnum) &gt; $col">
+ <xsl:call-template name="empty.table.cell"/>
+ <xsl:call-template name="entry">
+ <xsl:with-param name="col" select="$col+1"/>
+ <xsl:with-param name="spans" select="substring-after($spans,':')"/>
+ </xsl:call-template>
+ </xsl:when>
+
+ <xsl:otherwise>
+ <xsl:variable name="bgcolor">
+ <xsl:if test="processing-instruction('dbhtml')">
+ <xsl:call-template name="pi.dbhtml_bgcolor"/>
+ </xsl:if>
+ </xsl:variable>
+
+ <xsl:element name="{$cellgi}" namespace="http://www.w3.org/1999/xhtml">
+ <xsl:if test="$bgcolor != ''">
+ <xsl:attribute name="bgcolor">
+ <xsl:value-of select="$bgcolor"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:call-template name="locale.html.attributes"/>
+ <xsl:if test="$entry.propagates.style != 0 and @role">
+ <xsl:apply-templates select="." mode="class.attribute">
+ <xsl:with-param name="class" select="@role"/>
+ </xsl:apply-templates>
+ </xsl:if>
+
+ <xsl:if test="$show.revisionflag and @revisionflag">
+ <xsl:attribute name="class">
+ <xsl:value-of select="@revisionflag"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:if test="$table.borders.with.css != 0">
+ <xsl:attribute name="style">
+ <xsl:if test="$colsep &gt; 0">
+ <xsl:call-template name="border">
+ <xsl:with-param name="side" select="'right'"/>
+ </xsl:call-template>
+ </xsl:if>
+ <xsl:if test="$rowsep &gt; 0">
+ <xsl:call-template name="border">
+ <xsl:with-param name="side" select="'bottom'"/>
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:if test="@morerows &gt; 0">
+ <xsl:attribute name="rowspan">
+ <xsl:value-of select="1+@morerows"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:if test="$entry.colspan &gt; 1">
+ <xsl:attribute name="colspan">
+ <xsl:value-of select="$entry.colspan"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:if test="$align != ''">
+ <xsl:attribute name="align">
+ <xsl:value-of select="$align"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:if test="$valign != ''">
+ <xsl:attribute name="valign">
+ <xsl:value-of select="$valign"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:if test="$char != ''">
+ <xsl:attribute name="char">
+ <xsl:value-of select="$char"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:if test="$charoff != ''">
+ <xsl:attribute name="charoff">
+ <xsl:value-of select="$charoff"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:if test="not(preceding-sibling::*) and (ancestor::row[1]/@id or ancestor::row[1]/@xml:id)">
+ <xsl:call-template name="anchor">
+ <xsl:with-param name="node" select="ancestor::row[1]"/>
+ </xsl:call-template>
+ </xsl:if>
+
+ <xsl:call-template name="anchor"/>
+
+ <xsl:choose>
+ <xsl:when test="$empty.cell">
+ <xsl:text>&#160;</xsl:text>
+ </xsl:when>
+ <xsl:when test="self::entrytbl">
+ <xsl:call-template name="tgroup"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:element>
+
+ <xsl:choose>
+ <xsl:when test="following-sibling::entry|following-sibling::entrytbl">
+ <xsl:apply-templates select="(following-sibling::entry |following-sibling::entrytbl)[1]">
+ <xsl:with-param name="col" select="$col+$entry.colspan"/>
+ <xsl:with-param name="spans" select="$following.spans"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="finaltd">
+ <xsl:with-param name="spans" select="$following.spans"/>
+ <xsl:with-param name="col" select="$col+$entry.colspan"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="entry|entrytbl" name="sentry" mode="span">
+ <xsl:param name="col" select="1"/>
+ <xsl:param name="spans"/>
+
+ <xsl:variable name="entry.colnum">
+ <xsl:call-template name="entry.colnum"/>
+ </xsl:variable>
+
+ <xsl:variable name="entry.colspan">
+ <xsl:choose>
+ <xsl:when test="@spanname or @namest">
+ <xsl:call-template name="calculate.colspan"/>
+ </xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="following.spans">
+ <xsl:call-template name="calculate.following.spans">
+ <xsl:with-param name="colspan" select="$entry.colspan"/>
+ <xsl:with-param name="spans" select="$spans"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="$spans != '' and not(starts-with($spans,'0:'))">
+ <xsl:value-of select="substring-before($spans,':')-1"/>
+ <xsl:text>:</xsl:text>
+ <xsl:call-template name="sentry">
+ <xsl:with-param name="col" select="$col+1"/>
+ <xsl:with-param name="spans" select="substring-after($spans,':')"/>
+ </xsl:call-template>
+ </xsl:when>
+
+ <xsl:when test="number($entry.colnum) &gt; $col">
+ <xsl:text>0:</xsl:text>
+ <xsl:call-template name="sentry">
+ <xsl:with-param name="col" select="$col + 1"/>
+ <xsl:with-param name="spans" select="substring-after($spans,':')"/>
+ </xsl:call-template>
+ </xsl:when>
+
+ <xsl:otherwise>
+ <xsl:call-template name="copy-string">
+ <xsl:with-param name="count" select="$entry.colspan"/>
+ <xsl:with-param name="string">
+ <xsl:choose>
+ <xsl:when test="@morerows">
+ <xsl:value-of select="@morerows"/>
+ </xsl:when>
+ <xsl:otherwise>0</xsl:otherwise>
+ </xsl:choose>
+ <xsl:text>:</xsl:text>
+ </xsl:with-param>
+ </xsl:call-template>
+
+ <xsl:choose>
+ <xsl:when test="following-sibling::entry|following-sibling::entrytbl">
+ <xsl:apply-templates select="(following-sibling::entry |following-sibling::entrytbl)[1]" mode="span">
+ <xsl:with-param name="col" select="$col+$entry.colspan"/>
+ <xsl:with-param name="spans" select="$following.spans"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="sfinaltd">
+ <xsl:with-param name="spans" select="$following.spans"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="generate.colgroup">
+ <xsl:param name="cols" select="1"/>
+ <xsl:param name="count" select="1"/>
+ <xsl:choose>
+ <xsl:when test="$count &gt; $cols"/>
+ <xsl:otherwise>
+ <xsl:call-template name="generate.col">
+ <xsl:with-param name="countcol" select="$count"/>
+ </xsl:call-template>
+ <xsl:call-template name="generate.colgroup">
+ <xsl:with-param name="cols" select="$cols"/>
+ <xsl:with-param name="count" select="$count+1"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="generate.col">
+ <xsl:param name="countcol">1</xsl:param>
+ <xsl:param name="colspecs" select="./colspec"/>
+ <xsl:param name="count">1</xsl:param>
+ <xsl:param name="colnum">1</xsl:param>
+
+ <xsl:choose>
+ <xsl:when test="$count&gt;count($colspecs)">
+ <col/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:variable name="colspec" select="$colspecs[$count=position()]"/>
+ <xsl:variable name="colspec.colnum">
+ <xsl:choose>
+ <xsl:when test="$colspec/@colnum">
+ <xsl:value-of select="$colspec/@colnum"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$colnum"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="$colspec.colnum=$countcol">
+ <col>
+ <xsl:choose>
+ <xsl:when test="$colspec/@colwidth and $use.extensions != 0 and $tablecolumns.extension != 0">
+ <xsl:attribute name="width">
+ <xsl:choose>
+ <xsl:when test="normalize-space($colspec/@colwidth) = '*'">
+ <xsl:value-of select="'1*'"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$colspec/@colwidth"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:attribute>
+ </xsl:when>
+ <!-- pass through to HTML if no * in colspecs -->
+ <xsl:when test="$colspec/@colwidth and not($colspec/parent::*/colspec/@colwidth[contains(.,'*')])">
+ <xsl:attribute name="width">
+ <xsl:choose>
+ <xsl:when test="normalize-space($colspec/@colwidth) = '*'">
+ <xsl:value-of select="'1*'"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$colspec/@colwidth"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:attribute>
+ </xsl:when>
+ </xsl:choose>
+
+ <xsl:choose>
+ <xsl:when test="$colspec/@align">
+ <xsl:attribute name="align">
+ <xsl:value-of select="$colspec/@align"/>
+ </xsl:attribute>
+ </xsl:when>
+ <!-- Suggested by Pavel ZAMPACH <zampach@nemcb.cz> -->
+ <xsl:when test="$colspecs/ancestor::tgroup/@align">
+ <xsl:attribute name="align">
+ <xsl:value-of select="$colspecs/ancestor::tgroup/@align"/>
+ </xsl:attribute>
+ </xsl:when>
+ </xsl:choose>
+
+ <xsl:if test="$colspec/@char">
+ <xsl:attribute name="char">
+ <xsl:value-of select="$colspec/@char"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:if test="$colspec/@charoff">
+ <xsl:attribute name="charoff">
+ <xsl:value-of select="$colspec/@charoff"/>
+ </xsl:attribute>
+ </xsl:if>
+
+ <xsl:if test="$colspec/@colname">
+ <xsl:attribute name="class">
+ <xsl:value-of select="$colspec/@colname"/>
+ </xsl:attribute>
+ </xsl:if>
+ </col>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="generate.col">
+ <xsl:with-param name="countcol" select="$countcol"/>
+ <xsl:with-param name="colspecs" select="$colspecs"/>
+ <xsl:with-param name="count" select="$count+1"/>
+ <xsl:with-param name="colnum">
+ <xsl:choose>
+ <xsl:when test="$colspec/@colnum">
+ <xsl:value-of select="$colspec/@colnum + 1"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$colnum + 1"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="colspec.colwidth">
+ <!-- when this macro is called, the current context must be an entry -->
+ <xsl:param name="colname"/>
+ <!-- .. = row, ../.. = thead|tbody, ../../.. = tgroup -->
+ <xsl:param name="colspecs" select="../../../../tgroup/colspec"/>
+ <xsl:param name="count">1</xsl:param>
+ <xsl:choose>
+ <xsl:when test="$count&gt;count($colspecs)"/>
+ <xsl:otherwise>
+ <xsl:variable name="colspec" select="$colspecs[$count=position()]"/>
+ <xsl:choose>
+ <xsl:when test="$colspec/@colname=$colname">
+ <xsl:value-of select="$colspec/@colwidth"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="colspec.colwidth">
+ <xsl:with-param name="colname" select="$colname"/>
+ <xsl:with-param name="colspecs" select="$colspecs"/>
+ <xsl:with-param name="count" select="$count+1"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ====================================================================== -->
+
+<xsl:template name="tr.attributes">
+ <xsl:param name="row" select="."/>
+ <xsl:param name="rownum" select="0"/>
+
+ <!-- by default, do nothing. But you might want to say:
+
+ <xsl:if test="$rownum mod 2 = 0">
+ <xsl:attribute name="class">oddrow</xsl:attribute>
+ </xsl:if>
+
+ -->
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/task.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/task.xsl
new file mode 100644
index 0000000..0a380d2
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/task.xsl
@@ -0,0 +1,73 @@
+<?xml version="1.0" encoding="ASCII"?>
+<!--This file was created automatically by html2xhtml-->
+<!--from the HTML stylesheets.-->
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1999/xhtml" version="1.0">
+
+<!-- ********************************************************************
+ $Id: task.xsl 8421 2009-05-04 07:49:49Z bobstayton $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<!-- ==================================================================== -->
+
+<xsl:template match="task">
+ <xsl:variable name="param.placement" select="substring-after(normalize-space($formal.title.placement), concat(local-name(.), ' '))"/>
+
+ <xsl:variable name="placement">
+ <xsl:choose>
+ <xsl:when test="contains($param.placement, ' ')">
+ <xsl:value-of select="substring-before($param.placement, ' ')"/>
+ </xsl:when>
+ <xsl:when test="$param.placement = ''">before</xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$param.placement"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="preamble" select="*[not(self::title or self::titleabbrev)]"/>
+
+ <div>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:call-template name="anchor"/>
+
+ <xsl:if test="title and $placement = 'before'">
+ <xsl:call-template name="formal.object.heading"/>
+ </xsl:if>
+
+ <xsl:apply-templates select="$preamble"/>
+
+ <xsl:if test="title and $placement != 'before'">
+ <xsl:call-template name="formal.object.heading"/>
+ </xsl:if>
+ </div>
+</xsl:template>
+
+<xsl:template match="task/title">
+ <!-- nop -->
+</xsl:template>
+
+<xsl:template match="tasksummary">
+ <xsl:call-template name="semiformal.object"/>
+</xsl:template>
+
+<xsl:template match="tasksummary/title"/>
+
+<xsl:template match="taskprerequisites">
+ <xsl:call-template name="semiformal.object"/>
+</xsl:template>
+
+<xsl:template match="taskprerequisites/title"/>
+
+<xsl:template match="taskrelated">
+ <xsl:call-template name="semiformal.object"/>
+</xsl:template>
+
+<xsl:template match="taskrelated/title"/>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/titlepage.templates.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/titlepage.templates.xsl
new file mode 100644
index 0000000..1f72e23
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/titlepage.templates.xsl
@@ -0,0 +1,3817 @@
+<?xml version="1.0" encoding="ASCII"?>
+<!--This file was created automatically by html2xhtml-->
+<!--from the HTML stylesheets.-->
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:exsl="http://exslt.org/common" xmlns="http://www.w3.org/1999/xhtml" version="1.0" exclude-result-prefixes="exsl">
+
+<!-- This stylesheet was created by template/titlepage.xsl-->
+
+<xsl:template name="article.titlepage.recto">
+ <xsl:choose>
+ <xsl:when test="articleinfo/title">
+ <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="articleinfo/title"/>
+ </xsl:when>
+ <xsl:when test="artheader/title">
+ <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="artheader/title"/>
+ </xsl:when>
+ <xsl:when test="info/title">
+ <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="info/title"/>
+ </xsl:when>
+ <xsl:when test="title">
+ <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="title"/>
+ </xsl:when>
+ </xsl:choose>
+
+ <xsl:choose>
+ <xsl:when test="articleinfo/subtitle">
+ <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="articleinfo/subtitle"/>
+ </xsl:when>
+ <xsl:when test="artheader/subtitle">
+ <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="artheader/subtitle"/>
+ </xsl:when>
+ <xsl:when test="info/subtitle">
+ <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="info/subtitle"/>
+ </xsl:when>
+ <xsl:when test="subtitle">
+ <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="subtitle"/>
+ </xsl:when>
+ </xsl:choose>
+
+ <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="articleinfo/corpauthor"/>
+ <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="artheader/corpauthor"/>
+ <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="info/corpauthor"/>
+ <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="articleinfo/authorgroup"/>
+ <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="artheader/authorgroup"/>
+ <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="info/authorgroup"/>
+ <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="articleinfo/author"/>
+ <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="artheader/author"/>
+ <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="info/author"/>
+ <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="articleinfo/othercredit"/>
+ <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="artheader/othercredit"/>
+ <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="info/othercredit"/>
+ <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="articleinfo/releaseinfo"/>
+ <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="artheader/releaseinfo"/>
+ <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="info/releaseinfo"/>
+ <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="articleinfo/copyright"/>
+ <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="artheader/copyright"/>
+ <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="info/copyright"/>
+ <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="articleinfo/legalnotice"/>
+ <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="artheader/legalnotice"/>
+ <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="info/legalnotice"/>
+ <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="articleinfo/pubdate"/>
+ <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="artheader/pubdate"/>
+ <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="info/pubdate"/>
+ <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="articleinfo/revision"/>
+ <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="artheader/revision"/>
+ <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="info/revision"/>
+ <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="articleinfo/revhistory"/>
+ <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="artheader/revhistory"/>
+ <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="info/revhistory"/>
+ <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="articleinfo/abstract"/>
+ <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="artheader/abstract"/>
+ <xsl:apply-templates mode="article.titlepage.recto.auto.mode" select="info/abstract"/>
+</xsl:template>
+
+<xsl:template name="article.titlepage.verso">
+</xsl:template>
+
+<xsl:template name="article.titlepage.separator"><hr/>
+</xsl:template>
+
+<xsl:template name="article.titlepage.before.recto">
+</xsl:template>
+
+<xsl:template name="article.titlepage.before.verso">
+</xsl:template>
+
+<xsl:template name="article.titlepage">
+ <div class="titlepage">
+ <xsl:variable name="recto.content">
+ <xsl:call-template name="article.titlepage.before.recto"/>
+ <xsl:call-template name="article.titlepage.recto"/>
+ </xsl:variable>
+ <xsl:variable name="recto.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($recto.content) != '') or ($recto.elements.count &gt; 0)">
+ <div><xsl:copy-of select="$recto.content"/></div>
+ </xsl:if>
+ <xsl:variable name="verso.content">
+ <xsl:call-template name="article.titlepage.before.verso"/>
+ <xsl:call-template name="article.titlepage.verso"/>
+ </xsl:variable>
+ <xsl:variable name="verso.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($verso.content) != '') or ($verso.elements.count &gt; 0)">
+ <div><xsl:copy-of select="$verso.content"/></div>
+ </xsl:if>
+ <xsl:call-template name="article.titlepage.separator"/>
+ </div>
+</xsl:template>
+
+<xsl:template match="*" mode="article.titlepage.recto.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="*" mode="article.titlepage.verso.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="title" mode="article.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="article.titlepage.recto.style">
+<xsl:apply-templates select="." mode="article.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="subtitle" mode="article.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="article.titlepage.recto.style">
+<xsl:apply-templates select="." mode="article.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="corpauthor" mode="article.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="article.titlepage.recto.style">
+<xsl:apply-templates select="." mode="article.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="authorgroup" mode="article.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="article.titlepage.recto.style">
+<xsl:apply-templates select="." mode="article.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="author" mode="article.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="article.titlepage.recto.style">
+<xsl:apply-templates select="." mode="article.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="othercredit" mode="article.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="article.titlepage.recto.style">
+<xsl:apply-templates select="." mode="article.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="releaseinfo" mode="article.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="article.titlepage.recto.style">
+<xsl:apply-templates select="." mode="article.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="copyright" mode="article.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="article.titlepage.recto.style">
+<xsl:apply-templates select="." mode="article.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="legalnotice" mode="article.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="article.titlepage.recto.style">
+<xsl:apply-templates select="." mode="article.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="pubdate" mode="article.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="article.titlepage.recto.style">
+<xsl:apply-templates select="." mode="article.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="revision" mode="article.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="article.titlepage.recto.style">
+<xsl:apply-templates select="." mode="article.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="revhistory" mode="article.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="article.titlepage.recto.style">
+<xsl:apply-templates select="." mode="article.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="abstract" mode="article.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="article.titlepage.recto.style">
+<xsl:apply-templates select="." mode="article.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template name="set.titlepage.recto">
+ <xsl:choose>
+ <xsl:when test="setinfo/title">
+ <xsl:apply-templates mode="set.titlepage.recto.auto.mode" select="setinfo/title"/>
+ </xsl:when>
+ <xsl:when test="info/title">
+ <xsl:apply-templates mode="set.titlepage.recto.auto.mode" select="info/title"/>
+ </xsl:when>
+ <xsl:when test="title">
+ <xsl:apply-templates mode="set.titlepage.recto.auto.mode" select="title"/>
+ </xsl:when>
+ </xsl:choose>
+
+ <xsl:choose>
+ <xsl:when test="setinfo/subtitle">
+ <xsl:apply-templates mode="set.titlepage.recto.auto.mode" select="setinfo/subtitle"/>
+ </xsl:when>
+ <xsl:when test="info/subtitle">
+ <xsl:apply-templates mode="set.titlepage.recto.auto.mode" select="info/subtitle"/>
+ </xsl:when>
+ <xsl:when test="subtitle">
+ <xsl:apply-templates mode="set.titlepage.recto.auto.mode" select="subtitle"/>
+ </xsl:when>
+ </xsl:choose>
+
+ <xsl:apply-templates mode="set.titlepage.recto.auto.mode" select="setinfo/corpauthor"/>
+ <xsl:apply-templates mode="set.titlepage.recto.auto.mode" select="info/corpauthor"/>
+ <xsl:apply-templates mode="set.titlepage.recto.auto.mode" select="setinfo/authorgroup"/>
+ <xsl:apply-templates mode="set.titlepage.recto.auto.mode" select="info/authorgroup"/>
+ <xsl:apply-templates mode="set.titlepage.recto.auto.mode" select="setinfo/author"/>
+ <xsl:apply-templates mode="set.titlepage.recto.auto.mode" select="info/author"/>
+ <xsl:apply-templates mode="set.titlepage.recto.auto.mode" select="setinfo/othercredit"/>
+ <xsl:apply-templates mode="set.titlepage.recto.auto.mode" select="info/othercredit"/>
+ <xsl:apply-templates mode="set.titlepage.recto.auto.mode" select="setinfo/releaseinfo"/>
+ <xsl:apply-templates mode="set.titlepage.recto.auto.mode" select="info/releaseinfo"/>
+ <xsl:apply-templates mode="set.titlepage.recto.auto.mode" select="setinfo/copyright"/>
+ <xsl:apply-templates mode="set.titlepage.recto.auto.mode" select="info/copyright"/>
+ <xsl:apply-templates mode="set.titlepage.recto.auto.mode" select="setinfo/legalnotice"/>
+ <xsl:apply-templates mode="set.titlepage.recto.auto.mode" select="info/legalnotice"/>
+ <xsl:apply-templates mode="set.titlepage.recto.auto.mode" select="setinfo/pubdate"/>
+ <xsl:apply-templates mode="set.titlepage.recto.auto.mode" select="info/pubdate"/>
+ <xsl:apply-templates mode="set.titlepage.recto.auto.mode" select="setinfo/revision"/>
+ <xsl:apply-templates mode="set.titlepage.recto.auto.mode" select="info/revision"/>
+ <xsl:apply-templates mode="set.titlepage.recto.auto.mode" select="setinfo/revhistory"/>
+ <xsl:apply-templates mode="set.titlepage.recto.auto.mode" select="info/revhistory"/>
+ <xsl:apply-templates mode="set.titlepage.recto.auto.mode" select="setinfo/abstract"/>
+ <xsl:apply-templates mode="set.titlepage.recto.auto.mode" select="info/abstract"/>
+</xsl:template>
+
+<xsl:template name="set.titlepage.verso">
+</xsl:template>
+
+<xsl:template name="set.titlepage.separator"><hr/>
+</xsl:template>
+
+<xsl:template name="set.titlepage.before.recto">
+</xsl:template>
+
+<xsl:template name="set.titlepage.before.verso">
+</xsl:template>
+
+<xsl:template name="set.titlepage">
+ <div class="titlepage">
+ <xsl:variable name="recto.content">
+ <xsl:call-template name="set.titlepage.before.recto"/>
+ <xsl:call-template name="set.titlepage.recto"/>
+ </xsl:variable>
+ <xsl:variable name="recto.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($recto.content) != '') or ($recto.elements.count &gt; 0)">
+ <div><xsl:copy-of select="$recto.content"/></div>
+ </xsl:if>
+ <xsl:variable name="verso.content">
+ <xsl:call-template name="set.titlepage.before.verso"/>
+ <xsl:call-template name="set.titlepage.verso"/>
+ </xsl:variable>
+ <xsl:variable name="verso.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($verso.content) != '') or ($verso.elements.count &gt; 0)">
+ <div><xsl:copy-of select="$verso.content"/></div>
+ </xsl:if>
+ <xsl:call-template name="set.titlepage.separator"/>
+ </div>
+</xsl:template>
+
+<xsl:template match="*" mode="set.titlepage.recto.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="*" mode="set.titlepage.verso.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="title" mode="set.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="set.titlepage.recto.style">
+<xsl:apply-templates select="." mode="set.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="subtitle" mode="set.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="set.titlepage.recto.style">
+<xsl:apply-templates select="." mode="set.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="corpauthor" mode="set.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="set.titlepage.recto.style">
+<xsl:apply-templates select="." mode="set.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="authorgroup" mode="set.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="set.titlepage.recto.style">
+<xsl:apply-templates select="." mode="set.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="author" mode="set.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="set.titlepage.recto.style">
+<xsl:apply-templates select="." mode="set.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="othercredit" mode="set.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="set.titlepage.recto.style">
+<xsl:apply-templates select="." mode="set.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="releaseinfo" mode="set.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="set.titlepage.recto.style">
+<xsl:apply-templates select="." mode="set.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="copyright" mode="set.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="set.titlepage.recto.style">
+<xsl:apply-templates select="." mode="set.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="legalnotice" mode="set.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="set.titlepage.recto.style">
+<xsl:apply-templates select="." mode="set.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="pubdate" mode="set.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="set.titlepage.recto.style">
+<xsl:apply-templates select="." mode="set.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="revision" mode="set.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="set.titlepage.recto.style">
+<xsl:apply-templates select="." mode="set.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="revhistory" mode="set.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="set.titlepage.recto.style">
+<xsl:apply-templates select="." mode="set.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="abstract" mode="set.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="set.titlepage.recto.style">
+<xsl:apply-templates select="." mode="set.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template name="book.titlepage.recto">
+ <xsl:choose>
+ <xsl:when test="bookinfo/title">
+ <xsl:apply-templates mode="book.titlepage.recto.auto.mode" select="bookinfo/title"/>
+ </xsl:when>
+ <xsl:when test="info/title">
+ <xsl:apply-templates mode="book.titlepage.recto.auto.mode" select="info/title"/>
+ </xsl:when>
+ <xsl:when test="title">
+ <xsl:apply-templates mode="book.titlepage.recto.auto.mode" select="title"/>
+ </xsl:when>
+ </xsl:choose>
+
+ <xsl:choose>
+ <xsl:when test="bookinfo/subtitle">
+ <xsl:apply-templates mode="book.titlepage.recto.auto.mode" select="bookinfo/subtitle"/>
+ </xsl:when>
+ <xsl:when test="info/subtitle">
+ <xsl:apply-templates mode="book.titlepage.recto.auto.mode" select="info/subtitle"/>
+ </xsl:when>
+ <xsl:when test="subtitle">
+ <xsl:apply-templates mode="book.titlepage.recto.auto.mode" select="subtitle"/>
+ </xsl:when>
+ </xsl:choose>
+
+ <xsl:apply-templates mode="book.titlepage.recto.auto.mode" select="bookinfo/corpauthor"/>
+ <xsl:apply-templates mode="book.titlepage.recto.auto.mode" select="info/corpauthor"/>
+ <xsl:apply-templates mode="book.titlepage.recto.auto.mode" select="bookinfo/authorgroup"/>
+ <xsl:apply-templates mode="book.titlepage.recto.auto.mode" select="info/authorgroup"/>
+ <xsl:apply-templates mode="book.titlepage.recto.auto.mode" select="bookinfo/author"/>
+ <xsl:apply-templates mode="book.titlepage.recto.auto.mode" select="info/author"/>
+ <xsl:apply-templates mode="book.titlepage.recto.auto.mode" select="bookinfo/othercredit"/>
+ <xsl:apply-templates mode="book.titlepage.recto.auto.mode" select="info/othercredit"/>
+ <xsl:apply-templates mode="book.titlepage.recto.auto.mode" select="bookinfo/releaseinfo"/>
+ <xsl:apply-templates mode="book.titlepage.recto.auto.mode" select="info/releaseinfo"/>
+ <xsl:apply-templates mode="book.titlepage.recto.auto.mode" select="bookinfo/copyright"/>
+ <xsl:apply-templates mode="book.titlepage.recto.auto.mode" select="info/copyright"/>
+ <xsl:apply-templates mode="book.titlepage.recto.auto.mode" select="bookinfo/legalnotice"/>
+ <xsl:apply-templates mode="book.titlepage.recto.auto.mode" select="info/legalnotice"/>
+ <xsl:apply-templates mode="book.titlepage.recto.auto.mode" select="bookinfo/pubdate"/>
+ <xsl:apply-templates mode="book.titlepage.recto.auto.mode" select="info/pubdate"/>
+ <xsl:apply-templates mode="book.titlepage.recto.auto.mode" select="bookinfo/revision"/>
+ <xsl:apply-templates mode="book.titlepage.recto.auto.mode" select="info/revision"/>
+ <xsl:apply-templates mode="book.titlepage.recto.auto.mode" select="bookinfo/revhistory"/>
+ <xsl:apply-templates mode="book.titlepage.recto.auto.mode" select="info/revhistory"/>
+ <xsl:apply-templates mode="book.titlepage.recto.auto.mode" select="bookinfo/abstract"/>
+ <xsl:apply-templates mode="book.titlepage.recto.auto.mode" select="info/abstract"/>
+</xsl:template>
+
+<xsl:template name="book.titlepage.verso">
+</xsl:template>
+
+<xsl:template name="book.titlepage.separator"><hr/>
+</xsl:template>
+
+<xsl:template name="book.titlepage.before.recto">
+</xsl:template>
+
+<xsl:template name="book.titlepage.before.verso">
+</xsl:template>
+
+<xsl:template name="book.titlepage">
+ <div class="titlepage">
+ <xsl:variable name="recto.content">
+ <xsl:call-template name="book.titlepage.before.recto"/>
+ <xsl:call-template name="book.titlepage.recto"/>
+ </xsl:variable>
+ <xsl:variable name="recto.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($recto.content) != '') or ($recto.elements.count &gt; 0)">
+ <div><xsl:copy-of select="$recto.content"/></div>
+ </xsl:if>
+ <xsl:variable name="verso.content">
+ <xsl:call-template name="book.titlepage.before.verso"/>
+ <xsl:call-template name="book.titlepage.verso"/>
+ </xsl:variable>
+ <xsl:variable name="verso.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($verso.content) != '') or ($verso.elements.count &gt; 0)">
+ <div><xsl:copy-of select="$verso.content"/></div>
+ </xsl:if>
+ <xsl:call-template name="book.titlepage.separator"/>
+ </div>
+</xsl:template>
+
+<xsl:template match="*" mode="book.titlepage.recto.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="*" mode="book.titlepage.verso.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="title" mode="book.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="book.titlepage.recto.style">
+<xsl:apply-templates select="." mode="book.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="subtitle" mode="book.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="book.titlepage.recto.style">
+<xsl:apply-templates select="." mode="book.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="corpauthor" mode="book.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="book.titlepage.recto.style">
+<xsl:apply-templates select="." mode="book.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="authorgroup" mode="book.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="book.titlepage.recto.style">
+<xsl:apply-templates select="." mode="book.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="author" mode="book.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="book.titlepage.recto.style">
+<xsl:apply-templates select="." mode="book.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="othercredit" mode="book.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="book.titlepage.recto.style">
+<xsl:apply-templates select="." mode="book.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="releaseinfo" mode="book.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="book.titlepage.recto.style">
+<xsl:apply-templates select="." mode="book.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="copyright" mode="book.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="book.titlepage.recto.style">
+<xsl:apply-templates select="." mode="book.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="legalnotice" mode="book.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="book.titlepage.recto.style">
+<xsl:apply-templates select="." mode="book.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="pubdate" mode="book.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="book.titlepage.recto.style">
+<xsl:apply-templates select="." mode="book.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="revision" mode="book.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="book.titlepage.recto.style">
+<xsl:apply-templates select="." mode="book.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="revhistory" mode="book.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="book.titlepage.recto.style">
+<xsl:apply-templates select="." mode="book.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="abstract" mode="book.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="book.titlepage.recto.style">
+<xsl:apply-templates select="." mode="book.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template name="part.titlepage.recto">
+ <div xsl:use-attribute-sets="part.titlepage.recto.style">
+<xsl:call-template name="division.title">
+<xsl:with-param name="node" select="ancestor-or-self::part[1]"/>
+</xsl:call-template></div>
+ <xsl:choose>
+ <xsl:when test="partinfo/subtitle">
+ <xsl:apply-templates mode="part.titlepage.recto.auto.mode" select="partinfo/subtitle"/>
+ </xsl:when>
+ <xsl:when test="docinfo/subtitle">
+ <xsl:apply-templates mode="part.titlepage.recto.auto.mode" select="docinfo/subtitle"/>
+ </xsl:when>
+ <xsl:when test="info/subtitle">
+ <xsl:apply-templates mode="part.titlepage.recto.auto.mode" select="info/subtitle"/>
+ </xsl:when>
+ <xsl:when test="subtitle">
+ <xsl:apply-templates mode="part.titlepage.recto.auto.mode" select="subtitle"/>
+ </xsl:when>
+ </xsl:choose>
+
+ <xsl:apply-templates mode="part.titlepage.recto.auto.mode" select="partinfo/corpauthor"/>
+ <xsl:apply-templates mode="part.titlepage.recto.auto.mode" select="docinfo/corpauthor"/>
+ <xsl:apply-templates mode="part.titlepage.recto.auto.mode" select="info/corpauthor"/>
+ <xsl:apply-templates mode="part.titlepage.recto.auto.mode" select="partinfo/authorgroup"/>
+ <xsl:apply-templates mode="part.titlepage.recto.auto.mode" select="docinfo/authorgroup"/>
+ <xsl:apply-templates mode="part.titlepage.recto.auto.mode" select="info/authorgroup"/>
+ <xsl:apply-templates mode="part.titlepage.recto.auto.mode" select="partinfo/author"/>
+ <xsl:apply-templates mode="part.titlepage.recto.auto.mode" select="docinfo/author"/>
+ <xsl:apply-templates mode="part.titlepage.recto.auto.mode" select="info/author"/>
+ <xsl:apply-templates mode="part.titlepage.recto.auto.mode" select="partinfo/othercredit"/>
+ <xsl:apply-templates mode="part.titlepage.recto.auto.mode" select="docinfo/othercredit"/>
+ <xsl:apply-templates mode="part.titlepage.recto.auto.mode" select="info/othercredit"/>
+ <xsl:apply-templates mode="part.titlepage.recto.auto.mode" select="partinfo/releaseinfo"/>
+ <xsl:apply-templates mode="part.titlepage.recto.auto.mode" select="docinfo/releaseinfo"/>
+ <xsl:apply-templates mode="part.titlepage.recto.auto.mode" select="info/releaseinfo"/>
+ <xsl:apply-templates mode="part.titlepage.recto.auto.mode" select="partinfo/copyright"/>
+ <xsl:apply-templates mode="part.titlepage.recto.auto.mode" select="docinfo/copyright"/>
+ <xsl:apply-templates mode="part.titlepage.recto.auto.mode" select="info/copyright"/>
+ <xsl:apply-templates mode="part.titlepage.recto.auto.mode" select="partinfo/legalnotice"/>
+ <xsl:apply-templates mode="part.titlepage.recto.auto.mode" select="docinfo/legalnotice"/>
+ <xsl:apply-templates mode="part.titlepage.recto.auto.mode" select="info/legalnotice"/>
+ <xsl:apply-templates mode="part.titlepage.recto.auto.mode" select="partinfo/pubdate"/>
+ <xsl:apply-templates mode="part.titlepage.recto.auto.mode" select="docinfo/pubdate"/>
+ <xsl:apply-templates mode="part.titlepage.recto.auto.mode" select="info/pubdate"/>
+ <xsl:apply-templates mode="part.titlepage.recto.auto.mode" select="partinfo/revision"/>
+ <xsl:apply-templates mode="part.titlepage.recto.auto.mode" select="docinfo/revision"/>
+ <xsl:apply-templates mode="part.titlepage.recto.auto.mode" select="info/revision"/>
+ <xsl:apply-templates mode="part.titlepage.recto.auto.mode" select="partinfo/revhistory"/>
+ <xsl:apply-templates mode="part.titlepage.recto.auto.mode" select="docinfo/revhistory"/>
+ <xsl:apply-templates mode="part.titlepage.recto.auto.mode" select="info/revhistory"/>
+ <xsl:apply-templates mode="part.titlepage.recto.auto.mode" select="partinfo/abstract"/>
+ <xsl:apply-templates mode="part.titlepage.recto.auto.mode" select="docinfo/abstract"/>
+ <xsl:apply-templates mode="part.titlepage.recto.auto.mode" select="info/abstract"/>
+</xsl:template>
+
+<xsl:template name="part.titlepage.verso">
+</xsl:template>
+
+<xsl:template name="part.titlepage.separator">
+</xsl:template>
+
+<xsl:template name="part.titlepage.before.recto">
+</xsl:template>
+
+<xsl:template name="part.titlepage.before.verso">
+</xsl:template>
+
+<xsl:template name="part.titlepage">
+ <div class="titlepage">
+ <xsl:variable name="recto.content">
+ <xsl:call-template name="part.titlepage.before.recto"/>
+ <xsl:call-template name="part.titlepage.recto"/>
+ </xsl:variable>
+ <xsl:variable name="recto.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($recto.content) != '') or ($recto.elements.count &gt; 0)">
+ <div><xsl:copy-of select="$recto.content"/></div>
+ </xsl:if>
+ <xsl:variable name="verso.content">
+ <xsl:call-template name="part.titlepage.before.verso"/>
+ <xsl:call-template name="part.titlepage.verso"/>
+ </xsl:variable>
+ <xsl:variable name="verso.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($verso.content) != '') or ($verso.elements.count &gt; 0)">
+ <div><xsl:copy-of select="$verso.content"/></div>
+ </xsl:if>
+ <xsl:call-template name="part.titlepage.separator"/>
+ </div>
+</xsl:template>
+
+<xsl:template match="*" mode="part.titlepage.recto.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="*" mode="part.titlepage.verso.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="subtitle" mode="part.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="part.titlepage.recto.style">
+<xsl:apply-templates select="." mode="part.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="corpauthor" mode="part.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="part.titlepage.recto.style">
+<xsl:apply-templates select="." mode="part.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="authorgroup" mode="part.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="part.titlepage.recto.style">
+<xsl:apply-templates select="." mode="part.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="author" mode="part.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="part.titlepage.recto.style">
+<xsl:apply-templates select="." mode="part.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="othercredit" mode="part.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="part.titlepage.recto.style">
+<xsl:apply-templates select="." mode="part.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="releaseinfo" mode="part.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="part.titlepage.recto.style">
+<xsl:apply-templates select="." mode="part.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="copyright" mode="part.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="part.titlepage.recto.style">
+<xsl:apply-templates select="." mode="part.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="legalnotice" mode="part.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="part.titlepage.recto.style">
+<xsl:apply-templates select="." mode="part.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="pubdate" mode="part.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="part.titlepage.recto.style">
+<xsl:apply-templates select="." mode="part.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="revision" mode="part.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="part.titlepage.recto.style">
+<xsl:apply-templates select="." mode="part.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="revhistory" mode="part.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="part.titlepage.recto.style">
+<xsl:apply-templates select="." mode="part.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="abstract" mode="part.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="part.titlepage.recto.style">
+<xsl:apply-templates select="." mode="part.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template name="partintro.titlepage.recto">
+ <xsl:choose>
+ <xsl:when test="partintroinfo/title">
+ <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="partintroinfo/title"/>
+ </xsl:when>
+ <xsl:when test="docinfo/title">
+ <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="docinfo/title"/>
+ </xsl:when>
+ <xsl:when test="info/title">
+ <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="info/title"/>
+ </xsl:when>
+ <xsl:when test="title">
+ <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="title"/>
+ </xsl:when>
+ </xsl:choose>
+
+ <xsl:choose>
+ <xsl:when test="partintroinfo/subtitle">
+ <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="partintroinfo/subtitle"/>
+ </xsl:when>
+ <xsl:when test="docinfo/subtitle">
+ <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="docinfo/subtitle"/>
+ </xsl:when>
+ <xsl:when test="info/subtitle">
+ <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="info/subtitle"/>
+ </xsl:when>
+ <xsl:when test="subtitle">
+ <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="subtitle"/>
+ </xsl:when>
+ </xsl:choose>
+
+ <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="partintroinfo/corpauthor"/>
+ <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="docinfo/corpauthor"/>
+ <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="info/corpauthor"/>
+ <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="partintroinfo/authorgroup"/>
+ <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="docinfo/authorgroup"/>
+ <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="info/authorgroup"/>
+ <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="partintroinfo/author"/>
+ <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="docinfo/author"/>
+ <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="info/author"/>
+ <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="partintroinfo/othercredit"/>
+ <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="docinfo/othercredit"/>
+ <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="info/othercredit"/>
+ <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="partintroinfo/releaseinfo"/>
+ <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="docinfo/releaseinfo"/>
+ <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="info/releaseinfo"/>
+ <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="partintroinfo/copyright"/>
+ <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="docinfo/copyright"/>
+ <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="info/copyright"/>
+ <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="partintroinfo/legalnotice"/>
+ <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="docinfo/legalnotice"/>
+ <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="info/legalnotice"/>
+ <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="partintroinfo/pubdate"/>
+ <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="docinfo/pubdate"/>
+ <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="info/pubdate"/>
+ <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="partintroinfo/revision"/>
+ <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="docinfo/revision"/>
+ <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="info/revision"/>
+ <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="partintroinfo/revhistory"/>
+ <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="docinfo/revhistory"/>
+ <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="info/revhistory"/>
+ <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="partintroinfo/abstract"/>
+ <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="docinfo/abstract"/>
+ <xsl:apply-templates mode="partintro.titlepage.recto.auto.mode" select="info/abstract"/>
+</xsl:template>
+
+<xsl:template name="partintro.titlepage.verso">
+</xsl:template>
+
+<xsl:template name="partintro.titlepage.separator">
+</xsl:template>
+
+<xsl:template name="partintro.titlepage.before.recto">
+</xsl:template>
+
+<xsl:template name="partintro.titlepage.before.verso">
+</xsl:template>
+
+<xsl:template name="partintro.titlepage">
+ <div>
+ <xsl:variable name="recto.content">
+ <xsl:call-template name="partintro.titlepage.before.recto"/>
+ <xsl:call-template name="partintro.titlepage.recto"/>
+ </xsl:variable>
+ <xsl:variable name="recto.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($recto.content) != '') or ($recto.elements.count &gt; 0)">
+ <div><xsl:copy-of select="$recto.content"/></div>
+ </xsl:if>
+ <xsl:variable name="verso.content">
+ <xsl:call-template name="partintro.titlepage.before.verso"/>
+ <xsl:call-template name="partintro.titlepage.verso"/>
+ </xsl:variable>
+ <xsl:variable name="verso.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($verso.content) != '') or ($verso.elements.count &gt; 0)">
+ <div><xsl:copy-of select="$verso.content"/></div>
+ </xsl:if>
+ <xsl:call-template name="partintro.titlepage.separator"/>
+ </div>
+</xsl:template>
+
+<xsl:template match="*" mode="partintro.titlepage.recto.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="*" mode="partintro.titlepage.verso.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="title" mode="partintro.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="partintro.titlepage.recto.style">
+<xsl:apply-templates select="." mode="partintro.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="subtitle" mode="partintro.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="partintro.titlepage.recto.style">
+<xsl:apply-templates select="." mode="partintro.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="corpauthor" mode="partintro.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="partintro.titlepage.recto.style">
+<xsl:apply-templates select="." mode="partintro.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="authorgroup" mode="partintro.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="partintro.titlepage.recto.style">
+<xsl:apply-templates select="." mode="partintro.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="author" mode="partintro.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="partintro.titlepage.recto.style">
+<xsl:apply-templates select="." mode="partintro.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="othercredit" mode="partintro.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="partintro.titlepage.recto.style">
+<xsl:apply-templates select="." mode="partintro.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="releaseinfo" mode="partintro.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="partintro.titlepage.recto.style">
+<xsl:apply-templates select="." mode="partintro.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="copyright" mode="partintro.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="partintro.titlepage.recto.style">
+<xsl:apply-templates select="." mode="partintro.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="legalnotice" mode="partintro.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="partintro.titlepage.recto.style">
+<xsl:apply-templates select="." mode="partintro.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="pubdate" mode="partintro.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="partintro.titlepage.recto.style">
+<xsl:apply-templates select="." mode="partintro.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="revision" mode="partintro.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="partintro.titlepage.recto.style">
+<xsl:apply-templates select="." mode="partintro.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="revhistory" mode="partintro.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="partintro.titlepage.recto.style">
+<xsl:apply-templates select="." mode="partintro.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="abstract" mode="partintro.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="partintro.titlepage.recto.style">
+<xsl:apply-templates select="." mode="partintro.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template name="reference.titlepage.recto">
+ <xsl:choose>
+ <xsl:when test="referenceinfo/title">
+ <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="referenceinfo/title"/>
+ </xsl:when>
+ <xsl:when test="docinfo/title">
+ <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="docinfo/title"/>
+ </xsl:when>
+ <xsl:when test="info/title">
+ <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="info/title"/>
+ </xsl:when>
+ <xsl:when test="title">
+ <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="title"/>
+ </xsl:when>
+ </xsl:choose>
+
+ <xsl:choose>
+ <xsl:when test="referenceinfo/subtitle">
+ <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="referenceinfo/subtitle"/>
+ </xsl:when>
+ <xsl:when test="docinfo/subtitle">
+ <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="docinfo/subtitle"/>
+ </xsl:when>
+ <xsl:when test="info/subtitle">
+ <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="info/subtitle"/>
+ </xsl:when>
+ <xsl:when test="subtitle">
+ <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="subtitle"/>
+ </xsl:when>
+ </xsl:choose>
+
+ <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="referenceinfo/corpauthor"/>
+ <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="docinfo/corpauthor"/>
+ <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="info/corpauthor"/>
+ <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="referenceinfo/authorgroup"/>
+ <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="docinfo/authorgroup"/>
+ <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="info/authorgroup"/>
+ <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="referenceinfo/author"/>
+ <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="docinfo/author"/>
+ <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="info/author"/>
+ <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="referenceinfo/othercredit"/>
+ <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="docinfo/othercredit"/>
+ <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="info/othercredit"/>
+ <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="referenceinfo/releaseinfo"/>
+ <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="docinfo/releaseinfo"/>
+ <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="info/releaseinfo"/>
+ <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="referenceinfo/copyright"/>
+ <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="docinfo/copyright"/>
+ <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="info/copyright"/>
+ <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="referenceinfo/legalnotice"/>
+ <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="docinfo/legalnotice"/>
+ <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="info/legalnotice"/>
+ <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="referenceinfo/pubdate"/>
+ <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="docinfo/pubdate"/>
+ <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="info/pubdate"/>
+ <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="referenceinfo/revision"/>
+ <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="docinfo/revision"/>
+ <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="info/revision"/>
+ <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="referenceinfo/revhistory"/>
+ <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="docinfo/revhistory"/>
+ <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="info/revhistory"/>
+ <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="referenceinfo/abstract"/>
+ <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="docinfo/abstract"/>
+ <xsl:apply-templates mode="reference.titlepage.recto.auto.mode" select="info/abstract"/>
+</xsl:template>
+
+<xsl:template name="reference.titlepage.verso">
+</xsl:template>
+
+<xsl:template name="reference.titlepage.separator"><hr/>
+</xsl:template>
+
+<xsl:template name="reference.titlepage.before.recto">
+</xsl:template>
+
+<xsl:template name="reference.titlepage.before.verso">
+</xsl:template>
+
+<xsl:template name="reference.titlepage">
+ <div class="titlepage">
+ <xsl:variable name="recto.content">
+ <xsl:call-template name="reference.titlepage.before.recto"/>
+ <xsl:call-template name="reference.titlepage.recto"/>
+ </xsl:variable>
+ <xsl:variable name="recto.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($recto.content) != '') or ($recto.elements.count &gt; 0)">
+ <div><xsl:copy-of select="$recto.content"/></div>
+ </xsl:if>
+ <xsl:variable name="verso.content">
+ <xsl:call-template name="reference.titlepage.before.verso"/>
+ <xsl:call-template name="reference.titlepage.verso"/>
+ </xsl:variable>
+ <xsl:variable name="verso.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($verso.content) != '') or ($verso.elements.count &gt; 0)">
+ <div><xsl:copy-of select="$verso.content"/></div>
+ </xsl:if>
+ <xsl:call-template name="reference.titlepage.separator"/>
+ </div>
+</xsl:template>
+
+<xsl:template match="*" mode="reference.titlepage.recto.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="*" mode="reference.titlepage.verso.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="title" mode="reference.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="reference.titlepage.recto.style">
+<xsl:apply-templates select="." mode="reference.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="subtitle" mode="reference.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="reference.titlepage.recto.style">
+<xsl:apply-templates select="." mode="reference.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="corpauthor" mode="reference.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="reference.titlepage.recto.style">
+<xsl:apply-templates select="." mode="reference.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="authorgroup" mode="reference.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="reference.titlepage.recto.style">
+<xsl:apply-templates select="." mode="reference.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="author" mode="reference.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="reference.titlepage.recto.style">
+<xsl:apply-templates select="." mode="reference.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="othercredit" mode="reference.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="reference.titlepage.recto.style">
+<xsl:apply-templates select="." mode="reference.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="releaseinfo" mode="reference.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="reference.titlepage.recto.style">
+<xsl:apply-templates select="." mode="reference.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="copyright" mode="reference.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="reference.titlepage.recto.style">
+<xsl:apply-templates select="." mode="reference.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="legalnotice" mode="reference.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="reference.titlepage.recto.style">
+<xsl:apply-templates select="." mode="reference.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="pubdate" mode="reference.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="reference.titlepage.recto.style">
+<xsl:apply-templates select="." mode="reference.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="revision" mode="reference.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="reference.titlepage.recto.style">
+<xsl:apply-templates select="." mode="reference.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="revhistory" mode="reference.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="reference.titlepage.recto.style">
+<xsl:apply-templates select="." mode="reference.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="abstract" mode="reference.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="reference.titlepage.recto.style">
+<xsl:apply-templates select="." mode="reference.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template name="refentry.titlepage.recto">
+</xsl:template>
+
+<xsl:template name="refentry.titlepage.verso">
+</xsl:template>
+
+<xsl:template name="refentry.titlepage.separator">
+</xsl:template>
+
+<xsl:template name="refentry.titlepage.before.recto">
+</xsl:template>
+
+<xsl:template name="refentry.titlepage.before.verso">
+</xsl:template>
+
+<xsl:template name="refentry.titlepage">
+ <div class="titlepage">
+ <xsl:variable name="recto.content">
+ <xsl:call-template name="refentry.titlepage.before.recto"/>
+ <xsl:call-template name="refentry.titlepage.recto"/>
+ </xsl:variable>
+ <xsl:variable name="recto.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($recto.content) != '') or ($recto.elements.count &gt; 0)">
+ <div><xsl:copy-of select="$recto.content"/></div>
+ </xsl:if>
+ <xsl:variable name="verso.content">
+ <xsl:call-template name="refentry.titlepage.before.verso"/>
+ <xsl:call-template name="refentry.titlepage.verso"/>
+ </xsl:variable>
+ <xsl:variable name="verso.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($verso.content) != '') or ($verso.elements.count &gt; 0)">
+ <div><xsl:copy-of select="$verso.content"/></div>
+ </xsl:if>
+ <xsl:call-template name="refentry.titlepage.separator"/>
+ </div>
+</xsl:template>
+
+<xsl:template match="*" mode="refentry.titlepage.recto.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="*" mode="refentry.titlepage.verso.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template name="dedication.titlepage.recto">
+ <div xsl:use-attribute-sets="dedication.titlepage.recto.style">
+<xsl:call-template name="component.title">
+<xsl:with-param name="node" select="ancestor-or-self::dedication[1]"/>
+</xsl:call-template></div>
+ <xsl:choose>
+ <xsl:when test="dedicationinfo/subtitle">
+ <xsl:apply-templates mode="dedication.titlepage.recto.auto.mode" select="dedicationinfo/subtitle"/>
+ </xsl:when>
+ <xsl:when test="docinfo/subtitle">
+ <xsl:apply-templates mode="dedication.titlepage.recto.auto.mode" select="docinfo/subtitle"/>
+ </xsl:when>
+ <xsl:when test="info/subtitle">
+ <xsl:apply-templates mode="dedication.titlepage.recto.auto.mode" select="info/subtitle"/>
+ </xsl:when>
+ <xsl:when test="subtitle">
+ <xsl:apply-templates mode="dedication.titlepage.recto.auto.mode" select="subtitle"/>
+ </xsl:when>
+ </xsl:choose>
+
+</xsl:template>
+
+<xsl:template name="dedication.titlepage.verso">
+</xsl:template>
+
+<xsl:template name="dedication.titlepage.separator">
+</xsl:template>
+
+<xsl:template name="dedication.titlepage.before.recto">
+</xsl:template>
+
+<xsl:template name="dedication.titlepage.before.verso">
+</xsl:template>
+
+<xsl:template name="dedication.titlepage">
+ <div class="titlepage">
+ <xsl:variable name="recto.content">
+ <xsl:call-template name="dedication.titlepage.before.recto"/>
+ <xsl:call-template name="dedication.titlepage.recto"/>
+ </xsl:variable>
+ <xsl:variable name="recto.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($recto.content) != '') or ($recto.elements.count &gt; 0)">
+ <div><xsl:copy-of select="$recto.content"/></div>
+ </xsl:if>
+ <xsl:variable name="verso.content">
+ <xsl:call-template name="dedication.titlepage.before.verso"/>
+ <xsl:call-template name="dedication.titlepage.verso"/>
+ </xsl:variable>
+ <xsl:variable name="verso.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($verso.content) != '') or ($verso.elements.count &gt; 0)">
+ <div><xsl:copy-of select="$verso.content"/></div>
+ </xsl:if>
+ <xsl:call-template name="dedication.titlepage.separator"/>
+ </div>
+</xsl:template>
+
+<xsl:template match="*" mode="dedication.titlepage.recto.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="*" mode="dedication.titlepage.verso.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="subtitle" mode="dedication.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="dedication.titlepage.recto.style">
+<xsl:apply-templates select="." mode="dedication.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template name="acknowledgements.titlepage.recto">
+ <div xsl:use-attribute-sets="acknowledgements.titlepage.recto.style">
+<xsl:call-template name="component.title">
+<xsl:with-param name="node" select="ancestor-or-self::acknowledgements[1]"/>
+</xsl:call-template></div>
+ <xsl:choose>
+ <xsl:when test="acknowledgementsinfo/subtitle">
+ <xsl:apply-templates mode="acknowledgements.titlepage.recto.auto.mode" select="acknowledgementsinfo/subtitle"/>
+ </xsl:when>
+ <xsl:when test="docinfo/subtitle">
+ <xsl:apply-templates mode="acknowledgements.titlepage.recto.auto.mode" select="docinfo/subtitle"/>
+ </xsl:when>
+ <xsl:when test="info/subtitle">
+ <xsl:apply-templates mode="acknowledgements.titlepage.recto.auto.mode" select="info/subtitle"/>
+ </xsl:when>
+ <xsl:when test="subtitle">
+ <xsl:apply-templates mode="acknowledgements.titlepage.recto.auto.mode" select="subtitle"/>
+ </xsl:when>
+ </xsl:choose>
+
+</xsl:template>
+
+<xsl:template name="acknowledgements.titlepage.verso">
+</xsl:template>
+
+<xsl:template name="acknowledgements.titlepage.separator">
+</xsl:template>
+
+<xsl:template name="acknowledgements.titlepage.before.recto">
+</xsl:template>
+
+<xsl:template name="acknowledgements.titlepage.before.verso">
+</xsl:template>
+
+<xsl:template name="acknowledgements.titlepage">
+ <div class="titlepage">
+ <xsl:variable name="recto.content">
+ <xsl:call-template name="acknowledgements.titlepage.before.recto"/>
+ <xsl:call-template name="acknowledgements.titlepage.recto"/>
+ </xsl:variable>
+ <xsl:variable name="recto.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($recto.content) != '') or ($recto.elements.count &gt; 0)">
+ <div><xsl:copy-of select="$recto.content"/></div>
+ </xsl:if>
+ <xsl:variable name="verso.content">
+ <xsl:call-template name="acknowledgements.titlepage.before.verso"/>
+ <xsl:call-template name="acknowledgements.titlepage.verso"/>
+ </xsl:variable>
+ <xsl:variable name="verso.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($verso.content) != '') or ($verso.elements.count &gt; 0)">
+ <div><xsl:copy-of select="$verso.content"/></div>
+ </xsl:if>
+ <xsl:call-template name="acknowledgements.titlepage.separator"/>
+ </div>
+</xsl:template>
+
+<xsl:template match="*" mode="acknowledgements.titlepage.recto.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="*" mode="acknowledgements.titlepage.verso.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="subtitle" mode="acknowledgements.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="acknowledgements.titlepage.recto.style">
+<xsl:apply-templates select="." mode="acknowledgements.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template name="preface.titlepage.recto">
+ <xsl:choose>
+ <xsl:when test="prefaceinfo/title">
+ <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="prefaceinfo/title"/>
+ </xsl:when>
+ <xsl:when test="docinfo/title">
+ <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="docinfo/title"/>
+ </xsl:when>
+ <xsl:when test="info/title">
+ <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="info/title"/>
+ </xsl:when>
+ <xsl:when test="title">
+ <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="title"/>
+ </xsl:when>
+ </xsl:choose>
+
+ <xsl:choose>
+ <xsl:when test="prefaceinfo/subtitle">
+ <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="prefaceinfo/subtitle"/>
+ </xsl:when>
+ <xsl:when test="docinfo/subtitle">
+ <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="docinfo/subtitle"/>
+ </xsl:when>
+ <xsl:when test="info/subtitle">
+ <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="info/subtitle"/>
+ </xsl:when>
+ <xsl:when test="subtitle">
+ <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="subtitle"/>
+ </xsl:when>
+ </xsl:choose>
+
+ <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="prefaceinfo/corpauthor"/>
+ <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="docinfo/corpauthor"/>
+ <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="info/corpauthor"/>
+ <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="prefaceinfo/authorgroup"/>
+ <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="docinfo/authorgroup"/>
+ <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="info/authorgroup"/>
+ <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="prefaceinfo/author"/>
+ <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="docinfo/author"/>
+ <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="info/author"/>
+ <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="prefaceinfo/othercredit"/>
+ <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="docinfo/othercredit"/>
+ <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="info/othercredit"/>
+ <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="prefaceinfo/releaseinfo"/>
+ <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="docinfo/releaseinfo"/>
+ <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="info/releaseinfo"/>
+ <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="prefaceinfo/copyright"/>
+ <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="docinfo/copyright"/>
+ <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="info/copyright"/>
+ <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="prefaceinfo/legalnotice"/>
+ <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="docinfo/legalnotice"/>
+ <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="info/legalnotice"/>
+ <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="prefaceinfo/pubdate"/>
+ <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="docinfo/pubdate"/>
+ <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="info/pubdate"/>
+ <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="prefaceinfo/revision"/>
+ <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="docinfo/revision"/>
+ <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="info/revision"/>
+ <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="prefaceinfo/revhistory"/>
+ <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="docinfo/revhistory"/>
+ <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="info/revhistory"/>
+ <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="prefaceinfo/abstract"/>
+ <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="docinfo/abstract"/>
+ <xsl:apply-templates mode="preface.titlepage.recto.auto.mode" select="info/abstract"/>
+</xsl:template>
+
+<xsl:template name="preface.titlepage.verso">
+</xsl:template>
+
+<xsl:template name="preface.titlepage.separator">
+</xsl:template>
+
+<xsl:template name="preface.titlepage.before.recto">
+</xsl:template>
+
+<xsl:template name="preface.titlepage.before.verso">
+</xsl:template>
+
+<xsl:template name="preface.titlepage">
+ <div class="titlepage">
+ <xsl:variable name="recto.content">
+ <xsl:call-template name="preface.titlepage.before.recto"/>
+ <xsl:call-template name="preface.titlepage.recto"/>
+ </xsl:variable>
+ <xsl:variable name="recto.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($recto.content) != '') or ($recto.elements.count &gt; 0)">
+ <div><xsl:copy-of select="$recto.content"/></div>
+ </xsl:if>
+ <xsl:variable name="verso.content">
+ <xsl:call-template name="preface.titlepage.before.verso"/>
+ <xsl:call-template name="preface.titlepage.verso"/>
+ </xsl:variable>
+ <xsl:variable name="verso.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($verso.content) != '') or ($verso.elements.count &gt; 0)">
+ <div><xsl:copy-of select="$verso.content"/></div>
+ </xsl:if>
+ <xsl:call-template name="preface.titlepage.separator"/>
+ </div>
+</xsl:template>
+
+<xsl:template match="*" mode="preface.titlepage.recto.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="*" mode="preface.titlepage.verso.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="title" mode="preface.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="preface.titlepage.recto.style">
+<xsl:apply-templates select="." mode="preface.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="subtitle" mode="preface.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="preface.titlepage.recto.style">
+<xsl:apply-templates select="." mode="preface.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="corpauthor" mode="preface.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="preface.titlepage.recto.style">
+<xsl:apply-templates select="." mode="preface.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="authorgroup" mode="preface.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="preface.titlepage.recto.style">
+<xsl:apply-templates select="." mode="preface.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="author" mode="preface.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="preface.titlepage.recto.style">
+<xsl:apply-templates select="." mode="preface.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="othercredit" mode="preface.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="preface.titlepage.recto.style">
+<xsl:apply-templates select="." mode="preface.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="releaseinfo" mode="preface.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="preface.titlepage.recto.style">
+<xsl:apply-templates select="." mode="preface.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="copyright" mode="preface.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="preface.titlepage.recto.style">
+<xsl:apply-templates select="." mode="preface.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="legalnotice" mode="preface.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="preface.titlepage.recto.style">
+<xsl:apply-templates select="." mode="preface.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="pubdate" mode="preface.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="preface.titlepage.recto.style">
+<xsl:apply-templates select="." mode="preface.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="revision" mode="preface.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="preface.titlepage.recto.style">
+<xsl:apply-templates select="." mode="preface.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="revhistory" mode="preface.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="preface.titlepage.recto.style">
+<xsl:apply-templates select="." mode="preface.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="abstract" mode="preface.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="preface.titlepage.recto.style">
+<xsl:apply-templates select="." mode="preface.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template name="chapter.titlepage.recto">
+ <xsl:choose>
+ <xsl:when test="chapterinfo/title">
+ <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="chapterinfo/title"/>
+ </xsl:when>
+ <xsl:when test="docinfo/title">
+ <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="docinfo/title"/>
+ </xsl:when>
+ <xsl:when test="info/title">
+ <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="info/title"/>
+ </xsl:when>
+ <xsl:when test="title">
+ <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="title"/>
+ </xsl:when>
+ </xsl:choose>
+
+ <xsl:choose>
+ <xsl:when test="chapterinfo/subtitle">
+ <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="chapterinfo/subtitle"/>
+ </xsl:when>
+ <xsl:when test="docinfo/subtitle">
+ <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="docinfo/subtitle"/>
+ </xsl:when>
+ <xsl:when test="info/subtitle">
+ <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="info/subtitle"/>
+ </xsl:when>
+ <xsl:when test="subtitle">
+ <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="subtitle"/>
+ </xsl:when>
+ </xsl:choose>
+
+ <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="chapterinfo/corpauthor"/>
+ <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="docinfo/corpauthor"/>
+ <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="info/corpauthor"/>
+ <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="chapterinfo/authorgroup"/>
+ <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="docinfo/authorgroup"/>
+ <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="info/authorgroup"/>
+ <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="chapterinfo/author"/>
+ <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="docinfo/author"/>
+ <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="info/author"/>
+ <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="chapterinfo/othercredit"/>
+ <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="docinfo/othercredit"/>
+ <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="info/othercredit"/>
+ <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="chapterinfo/releaseinfo"/>
+ <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="docinfo/releaseinfo"/>
+ <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="info/releaseinfo"/>
+ <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="chapterinfo/copyright"/>
+ <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="docinfo/copyright"/>
+ <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="info/copyright"/>
+ <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="chapterinfo/legalnotice"/>
+ <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="docinfo/legalnotice"/>
+ <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="info/legalnotice"/>
+ <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="chapterinfo/pubdate"/>
+ <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="docinfo/pubdate"/>
+ <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="info/pubdate"/>
+ <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="chapterinfo/revision"/>
+ <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="docinfo/revision"/>
+ <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="info/revision"/>
+ <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="chapterinfo/revhistory"/>
+ <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="docinfo/revhistory"/>
+ <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="info/revhistory"/>
+ <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="chapterinfo/abstract"/>
+ <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="docinfo/abstract"/>
+ <xsl:apply-templates mode="chapter.titlepage.recto.auto.mode" select="info/abstract"/>
+</xsl:template>
+
+<xsl:template name="chapter.titlepage.verso">
+</xsl:template>
+
+<xsl:template name="chapter.titlepage.separator">
+</xsl:template>
+
+<xsl:template name="chapter.titlepage.before.recto">
+</xsl:template>
+
+<xsl:template name="chapter.titlepage.before.verso">
+</xsl:template>
+
+<xsl:template name="chapter.titlepage">
+ <div class="titlepage">
+ <xsl:variable name="recto.content">
+ <xsl:call-template name="chapter.titlepage.before.recto"/>
+ <xsl:call-template name="chapter.titlepage.recto"/>
+ </xsl:variable>
+ <xsl:variable name="recto.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($recto.content) != '') or ($recto.elements.count &gt; 0)">
+ <div><xsl:copy-of select="$recto.content"/></div>
+ </xsl:if>
+ <xsl:variable name="verso.content">
+ <xsl:call-template name="chapter.titlepage.before.verso"/>
+ <xsl:call-template name="chapter.titlepage.verso"/>
+ </xsl:variable>
+ <xsl:variable name="verso.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($verso.content) != '') or ($verso.elements.count &gt; 0)">
+ <div><xsl:copy-of select="$verso.content"/></div>
+ </xsl:if>
+ <xsl:call-template name="chapter.titlepage.separator"/>
+ </div>
+</xsl:template>
+
+<xsl:template match="*" mode="chapter.titlepage.recto.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="*" mode="chapter.titlepage.verso.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="title" mode="chapter.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="chapter.titlepage.recto.style">
+<xsl:apply-templates select="." mode="chapter.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="subtitle" mode="chapter.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="chapter.titlepage.recto.style">
+<xsl:apply-templates select="." mode="chapter.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="corpauthor" mode="chapter.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="chapter.titlepage.recto.style">
+<xsl:apply-templates select="." mode="chapter.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="authorgroup" mode="chapter.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="chapter.titlepage.recto.style">
+<xsl:apply-templates select="." mode="chapter.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="author" mode="chapter.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="chapter.titlepage.recto.style">
+<xsl:apply-templates select="." mode="chapter.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="othercredit" mode="chapter.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="chapter.titlepage.recto.style">
+<xsl:apply-templates select="." mode="chapter.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="releaseinfo" mode="chapter.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="chapter.titlepage.recto.style">
+<xsl:apply-templates select="." mode="chapter.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="copyright" mode="chapter.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="chapter.titlepage.recto.style">
+<xsl:apply-templates select="." mode="chapter.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="legalnotice" mode="chapter.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="chapter.titlepage.recto.style">
+<xsl:apply-templates select="." mode="chapter.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="pubdate" mode="chapter.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="chapter.titlepage.recto.style">
+<xsl:apply-templates select="." mode="chapter.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="revision" mode="chapter.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="chapter.titlepage.recto.style">
+<xsl:apply-templates select="." mode="chapter.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="revhistory" mode="chapter.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="chapter.titlepage.recto.style">
+<xsl:apply-templates select="." mode="chapter.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="abstract" mode="chapter.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="chapter.titlepage.recto.style">
+<xsl:apply-templates select="." mode="chapter.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template name="appendix.titlepage.recto">
+ <xsl:choose>
+ <xsl:when test="appendixinfo/title">
+ <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="appendixinfo/title"/>
+ </xsl:when>
+ <xsl:when test="docinfo/title">
+ <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="docinfo/title"/>
+ </xsl:when>
+ <xsl:when test="info/title">
+ <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="info/title"/>
+ </xsl:when>
+ <xsl:when test="title">
+ <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="title"/>
+ </xsl:when>
+ </xsl:choose>
+
+ <xsl:choose>
+ <xsl:when test="appendixinfo/subtitle">
+ <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="appendixinfo/subtitle"/>
+ </xsl:when>
+ <xsl:when test="docinfo/subtitle">
+ <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="docinfo/subtitle"/>
+ </xsl:when>
+ <xsl:when test="info/subtitle">
+ <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="info/subtitle"/>
+ </xsl:when>
+ <xsl:when test="subtitle">
+ <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="subtitle"/>
+ </xsl:when>
+ </xsl:choose>
+
+ <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="appendixinfo/corpauthor"/>
+ <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="docinfo/corpauthor"/>
+ <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="info/corpauthor"/>
+ <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="appendixinfo/authorgroup"/>
+ <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="docinfo/authorgroup"/>
+ <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="info/authorgroup"/>
+ <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="appendixinfo/author"/>
+ <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="docinfo/author"/>
+ <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="info/author"/>
+ <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="appendixinfo/othercredit"/>
+ <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="docinfo/othercredit"/>
+ <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="info/othercredit"/>
+ <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="appendixinfo/releaseinfo"/>
+ <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="docinfo/releaseinfo"/>
+ <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="info/releaseinfo"/>
+ <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="appendixinfo/copyright"/>
+ <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="docinfo/copyright"/>
+ <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="info/copyright"/>
+ <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="appendixinfo/legalnotice"/>
+ <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="docinfo/legalnotice"/>
+ <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="info/legalnotice"/>
+ <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="appendixinfo/pubdate"/>
+ <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="docinfo/pubdate"/>
+ <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="info/pubdate"/>
+ <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="appendixinfo/revision"/>
+ <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="docinfo/revision"/>
+ <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="info/revision"/>
+ <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="appendixinfo/revhistory"/>
+ <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="docinfo/revhistory"/>
+ <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="info/revhistory"/>
+ <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="appendixinfo/abstract"/>
+ <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="docinfo/abstract"/>
+ <xsl:apply-templates mode="appendix.titlepage.recto.auto.mode" select="info/abstract"/>
+</xsl:template>
+
+<xsl:template name="appendix.titlepage.verso">
+</xsl:template>
+
+<xsl:template name="appendix.titlepage.separator">
+</xsl:template>
+
+<xsl:template name="appendix.titlepage.before.recto">
+</xsl:template>
+
+<xsl:template name="appendix.titlepage.before.verso">
+</xsl:template>
+
+<xsl:template name="appendix.titlepage">
+ <div class="titlepage">
+ <xsl:variable name="recto.content">
+ <xsl:call-template name="appendix.titlepage.before.recto"/>
+ <xsl:call-template name="appendix.titlepage.recto"/>
+ </xsl:variable>
+ <xsl:variable name="recto.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($recto.content) != '') or ($recto.elements.count &gt; 0)">
+ <div><xsl:copy-of select="$recto.content"/></div>
+ </xsl:if>
+ <xsl:variable name="verso.content">
+ <xsl:call-template name="appendix.titlepage.before.verso"/>
+ <xsl:call-template name="appendix.titlepage.verso"/>
+ </xsl:variable>
+ <xsl:variable name="verso.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($verso.content) != '') or ($verso.elements.count &gt; 0)">
+ <div><xsl:copy-of select="$verso.content"/></div>
+ </xsl:if>
+ <xsl:call-template name="appendix.titlepage.separator"/>
+ </div>
+</xsl:template>
+
+<xsl:template match="*" mode="appendix.titlepage.recto.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="*" mode="appendix.titlepage.verso.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="title" mode="appendix.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="appendix.titlepage.recto.style">
+<xsl:apply-templates select="." mode="appendix.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="subtitle" mode="appendix.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="appendix.titlepage.recto.style">
+<xsl:apply-templates select="." mode="appendix.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="corpauthor" mode="appendix.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="appendix.titlepage.recto.style">
+<xsl:apply-templates select="." mode="appendix.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="authorgroup" mode="appendix.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="appendix.titlepage.recto.style">
+<xsl:apply-templates select="." mode="appendix.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="author" mode="appendix.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="appendix.titlepage.recto.style">
+<xsl:apply-templates select="." mode="appendix.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="othercredit" mode="appendix.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="appendix.titlepage.recto.style">
+<xsl:apply-templates select="." mode="appendix.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="releaseinfo" mode="appendix.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="appendix.titlepage.recto.style">
+<xsl:apply-templates select="." mode="appendix.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="copyright" mode="appendix.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="appendix.titlepage.recto.style">
+<xsl:apply-templates select="." mode="appendix.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="legalnotice" mode="appendix.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="appendix.titlepage.recto.style">
+<xsl:apply-templates select="." mode="appendix.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="pubdate" mode="appendix.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="appendix.titlepage.recto.style">
+<xsl:apply-templates select="." mode="appendix.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="revision" mode="appendix.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="appendix.titlepage.recto.style">
+<xsl:apply-templates select="." mode="appendix.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="revhistory" mode="appendix.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="appendix.titlepage.recto.style">
+<xsl:apply-templates select="." mode="appendix.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="abstract" mode="appendix.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="appendix.titlepage.recto.style">
+<xsl:apply-templates select="." mode="appendix.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template name="section.titlepage.recto">
+ <xsl:choose>
+ <xsl:when test="sectioninfo/title">
+ <xsl:apply-templates mode="section.titlepage.recto.auto.mode" select="sectioninfo/title"/>
+ </xsl:when>
+ <xsl:when test="info/title">
+ <xsl:apply-templates mode="section.titlepage.recto.auto.mode" select="info/title"/>
+ </xsl:when>
+ <xsl:when test="title">
+ <xsl:apply-templates mode="section.titlepage.recto.auto.mode" select="title"/>
+ </xsl:when>
+ </xsl:choose>
+
+ <xsl:choose>
+ <xsl:when test="sectioninfo/subtitle">
+ <xsl:apply-templates mode="section.titlepage.recto.auto.mode" select="sectioninfo/subtitle"/>
+ </xsl:when>
+ <xsl:when test="info/subtitle">
+ <xsl:apply-templates mode="section.titlepage.recto.auto.mode" select="info/subtitle"/>
+ </xsl:when>
+ <xsl:when test="subtitle">
+ <xsl:apply-templates mode="section.titlepage.recto.auto.mode" select="subtitle"/>
+ </xsl:when>
+ </xsl:choose>
+
+ <xsl:apply-templates mode="section.titlepage.recto.auto.mode" select="sectioninfo/corpauthor"/>
+ <xsl:apply-templates mode="section.titlepage.recto.auto.mode" select="info/corpauthor"/>
+ <xsl:apply-templates mode="section.titlepage.recto.auto.mode" select="sectioninfo/authorgroup"/>
+ <xsl:apply-templates mode="section.titlepage.recto.auto.mode" select="info/authorgroup"/>
+ <xsl:apply-templates mode="section.titlepage.recto.auto.mode" select="sectioninfo/author"/>
+ <xsl:apply-templates mode="section.titlepage.recto.auto.mode" select="info/author"/>
+ <xsl:apply-templates mode="section.titlepage.recto.auto.mode" select="sectioninfo/othercredit"/>
+ <xsl:apply-templates mode="section.titlepage.recto.auto.mode" select="info/othercredit"/>
+ <xsl:apply-templates mode="section.titlepage.recto.auto.mode" select="sectioninfo/releaseinfo"/>
+ <xsl:apply-templates mode="section.titlepage.recto.auto.mode" select="info/releaseinfo"/>
+ <xsl:apply-templates mode="section.titlepage.recto.auto.mode" select="sectioninfo/copyright"/>
+ <xsl:apply-templates mode="section.titlepage.recto.auto.mode" select="info/copyright"/>
+ <xsl:apply-templates mode="section.titlepage.recto.auto.mode" select="sectioninfo/legalnotice"/>
+ <xsl:apply-templates mode="section.titlepage.recto.auto.mode" select="info/legalnotice"/>
+ <xsl:apply-templates mode="section.titlepage.recto.auto.mode" select="sectioninfo/pubdate"/>
+ <xsl:apply-templates mode="section.titlepage.recto.auto.mode" select="info/pubdate"/>
+ <xsl:apply-templates mode="section.titlepage.recto.auto.mode" select="sectioninfo/revision"/>
+ <xsl:apply-templates mode="section.titlepage.recto.auto.mode" select="info/revision"/>
+ <xsl:apply-templates mode="section.titlepage.recto.auto.mode" select="sectioninfo/revhistory"/>
+ <xsl:apply-templates mode="section.titlepage.recto.auto.mode" select="info/revhistory"/>
+ <xsl:apply-templates mode="section.titlepage.recto.auto.mode" select="sectioninfo/abstract"/>
+ <xsl:apply-templates mode="section.titlepage.recto.auto.mode" select="info/abstract"/>
+</xsl:template>
+
+<xsl:template name="section.titlepage.verso">
+</xsl:template>
+
+<xsl:template name="section.titlepage.separator"><xsl:if test="count(parent::*)='0'"><hr/></xsl:if>
+</xsl:template>
+
+<xsl:template name="section.titlepage.before.recto">
+</xsl:template>
+
+<xsl:template name="section.titlepage.before.verso">
+</xsl:template>
+
+<xsl:template name="section.titlepage">
+ <div class="titlepage">
+ <xsl:variable name="recto.content">
+ <xsl:call-template name="section.titlepage.before.recto"/>
+ <xsl:call-template name="section.titlepage.recto"/>
+ </xsl:variable>
+ <xsl:variable name="recto.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($recto.content) != '') or ($recto.elements.count &gt; 0)">
+ <div><xsl:copy-of select="$recto.content"/></div>
+ </xsl:if>
+ <xsl:variable name="verso.content">
+ <xsl:call-template name="section.titlepage.before.verso"/>
+ <xsl:call-template name="section.titlepage.verso"/>
+ </xsl:variable>
+ <xsl:variable name="verso.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($verso.content) != '') or ($verso.elements.count &gt; 0)">
+ <div><xsl:copy-of select="$verso.content"/></div>
+ </xsl:if>
+ <xsl:call-template name="section.titlepage.separator"/>
+ </div>
+</xsl:template>
+
+<xsl:template match="*" mode="section.titlepage.recto.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="*" mode="section.titlepage.verso.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="title" mode="section.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="section.titlepage.recto.style">
+<xsl:apply-templates select="." mode="section.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="subtitle" mode="section.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="section.titlepage.recto.style">
+<xsl:apply-templates select="." mode="section.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="corpauthor" mode="section.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="section.titlepage.recto.style">
+<xsl:apply-templates select="." mode="section.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="authorgroup" mode="section.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="section.titlepage.recto.style">
+<xsl:apply-templates select="." mode="section.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="author" mode="section.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="section.titlepage.recto.style">
+<xsl:apply-templates select="." mode="section.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="othercredit" mode="section.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="section.titlepage.recto.style">
+<xsl:apply-templates select="." mode="section.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="releaseinfo" mode="section.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="section.titlepage.recto.style">
+<xsl:apply-templates select="." mode="section.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="copyright" mode="section.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="section.titlepage.recto.style">
+<xsl:apply-templates select="." mode="section.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="legalnotice" mode="section.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="section.titlepage.recto.style">
+<xsl:apply-templates select="." mode="section.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="pubdate" mode="section.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="section.titlepage.recto.style">
+<xsl:apply-templates select="." mode="section.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="revision" mode="section.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="section.titlepage.recto.style">
+<xsl:apply-templates select="." mode="section.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="revhistory" mode="section.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="section.titlepage.recto.style">
+<xsl:apply-templates select="." mode="section.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="abstract" mode="section.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="section.titlepage.recto.style">
+<xsl:apply-templates select="." mode="section.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template name="sect1.titlepage.recto">
+ <xsl:choose>
+ <xsl:when test="sect1info/title">
+ <xsl:apply-templates mode="sect1.titlepage.recto.auto.mode" select="sect1info/title"/>
+ </xsl:when>
+ <xsl:when test="info/title">
+ <xsl:apply-templates mode="sect1.titlepage.recto.auto.mode" select="info/title"/>
+ </xsl:when>
+ <xsl:when test="title">
+ <xsl:apply-templates mode="sect1.titlepage.recto.auto.mode" select="title"/>
+ </xsl:when>
+ </xsl:choose>
+
+ <xsl:choose>
+ <xsl:when test="sect1info/subtitle">
+ <xsl:apply-templates mode="sect1.titlepage.recto.auto.mode" select="sect1info/subtitle"/>
+ </xsl:when>
+ <xsl:when test="info/subtitle">
+ <xsl:apply-templates mode="sect1.titlepage.recto.auto.mode" select="info/subtitle"/>
+ </xsl:when>
+ <xsl:when test="subtitle">
+ <xsl:apply-templates mode="sect1.titlepage.recto.auto.mode" select="subtitle"/>
+ </xsl:when>
+ </xsl:choose>
+
+ <xsl:apply-templates mode="sect1.titlepage.recto.auto.mode" select="sect1info/corpauthor"/>
+ <xsl:apply-templates mode="sect1.titlepage.recto.auto.mode" select="info/corpauthor"/>
+ <xsl:apply-templates mode="sect1.titlepage.recto.auto.mode" select="sect1info/authorgroup"/>
+ <xsl:apply-templates mode="sect1.titlepage.recto.auto.mode" select="info/authorgroup"/>
+ <xsl:apply-templates mode="sect1.titlepage.recto.auto.mode" select="sect1info/author"/>
+ <xsl:apply-templates mode="sect1.titlepage.recto.auto.mode" select="info/author"/>
+ <xsl:apply-templates mode="sect1.titlepage.recto.auto.mode" select="sect1info/othercredit"/>
+ <xsl:apply-templates mode="sect1.titlepage.recto.auto.mode" select="info/othercredit"/>
+ <xsl:apply-templates mode="sect1.titlepage.recto.auto.mode" select="sect1info/releaseinfo"/>
+ <xsl:apply-templates mode="sect1.titlepage.recto.auto.mode" select="info/releaseinfo"/>
+ <xsl:apply-templates mode="sect1.titlepage.recto.auto.mode" select="sect1info/copyright"/>
+ <xsl:apply-templates mode="sect1.titlepage.recto.auto.mode" select="info/copyright"/>
+ <xsl:apply-templates mode="sect1.titlepage.recto.auto.mode" select="sect1info/legalnotice"/>
+ <xsl:apply-templates mode="sect1.titlepage.recto.auto.mode" select="info/legalnotice"/>
+ <xsl:apply-templates mode="sect1.titlepage.recto.auto.mode" select="sect1info/pubdate"/>
+ <xsl:apply-templates mode="sect1.titlepage.recto.auto.mode" select="info/pubdate"/>
+ <xsl:apply-templates mode="sect1.titlepage.recto.auto.mode" select="sect1info/revision"/>
+ <xsl:apply-templates mode="sect1.titlepage.recto.auto.mode" select="info/revision"/>
+ <xsl:apply-templates mode="sect1.titlepage.recto.auto.mode" select="sect1info/revhistory"/>
+ <xsl:apply-templates mode="sect1.titlepage.recto.auto.mode" select="info/revhistory"/>
+ <xsl:apply-templates mode="sect1.titlepage.recto.auto.mode" select="sect1info/abstract"/>
+ <xsl:apply-templates mode="sect1.titlepage.recto.auto.mode" select="info/abstract"/>
+</xsl:template>
+
+<xsl:template name="sect1.titlepage.verso">
+</xsl:template>
+
+<xsl:template name="sect1.titlepage.separator"><xsl:if test="count(parent::*)='0'"><hr/></xsl:if>
+</xsl:template>
+
+<xsl:template name="sect1.titlepage.before.recto">
+</xsl:template>
+
+<xsl:template name="sect1.titlepage.before.verso">
+</xsl:template>
+
+<xsl:template name="sect1.titlepage">
+ <div class="titlepage">
+ <xsl:variable name="recto.content">
+ <xsl:call-template name="sect1.titlepage.before.recto"/>
+ <xsl:call-template name="sect1.titlepage.recto"/>
+ </xsl:variable>
+ <xsl:variable name="recto.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($recto.content) != '') or ($recto.elements.count &gt; 0)">
+ <div><xsl:copy-of select="$recto.content"/></div>
+ </xsl:if>
+ <xsl:variable name="verso.content">
+ <xsl:call-template name="sect1.titlepage.before.verso"/>
+ <xsl:call-template name="sect1.titlepage.verso"/>
+ </xsl:variable>
+ <xsl:variable name="verso.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($verso.content) != '') or ($verso.elements.count &gt; 0)">
+ <div><xsl:copy-of select="$verso.content"/></div>
+ </xsl:if>
+ <xsl:call-template name="sect1.titlepage.separator"/>
+ </div>
+</xsl:template>
+
+<xsl:template match="*" mode="sect1.titlepage.recto.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="*" mode="sect1.titlepage.verso.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="title" mode="sect1.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect1.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect1.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="subtitle" mode="sect1.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect1.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect1.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="corpauthor" mode="sect1.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect1.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect1.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="authorgroup" mode="sect1.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect1.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect1.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="author" mode="sect1.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect1.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect1.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="othercredit" mode="sect1.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect1.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect1.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="releaseinfo" mode="sect1.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect1.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect1.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="copyright" mode="sect1.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect1.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect1.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="legalnotice" mode="sect1.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect1.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect1.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="pubdate" mode="sect1.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect1.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect1.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="revision" mode="sect1.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect1.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect1.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="revhistory" mode="sect1.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect1.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect1.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="abstract" mode="sect1.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect1.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect1.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template name="sect2.titlepage.recto">
+ <xsl:choose>
+ <xsl:when test="sect2info/title">
+ <xsl:apply-templates mode="sect2.titlepage.recto.auto.mode" select="sect2info/title"/>
+ </xsl:when>
+ <xsl:when test="info/title">
+ <xsl:apply-templates mode="sect2.titlepage.recto.auto.mode" select="info/title"/>
+ </xsl:when>
+ <xsl:when test="title">
+ <xsl:apply-templates mode="sect2.titlepage.recto.auto.mode" select="title"/>
+ </xsl:when>
+ </xsl:choose>
+
+ <xsl:choose>
+ <xsl:when test="sect2info/subtitle">
+ <xsl:apply-templates mode="sect2.titlepage.recto.auto.mode" select="sect2info/subtitle"/>
+ </xsl:when>
+ <xsl:when test="info/subtitle">
+ <xsl:apply-templates mode="sect2.titlepage.recto.auto.mode" select="info/subtitle"/>
+ </xsl:when>
+ <xsl:when test="subtitle">
+ <xsl:apply-templates mode="sect2.titlepage.recto.auto.mode" select="subtitle"/>
+ </xsl:when>
+ </xsl:choose>
+
+ <xsl:apply-templates mode="sect2.titlepage.recto.auto.mode" select="sect2info/corpauthor"/>
+ <xsl:apply-templates mode="sect2.titlepage.recto.auto.mode" select="info/corpauthor"/>
+ <xsl:apply-templates mode="sect2.titlepage.recto.auto.mode" select="sect2info/authorgroup"/>
+ <xsl:apply-templates mode="sect2.titlepage.recto.auto.mode" select="info/authorgroup"/>
+ <xsl:apply-templates mode="sect2.titlepage.recto.auto.mode" select="sect2info/author"/>
+ <xsl:apply-templates mode="sect2.titlepage.recto.auto.mode" select="info/author"/>
+ <xsl:apply-templates mode="sect2.titlepage.recto.auto.mode" select="sect2info/othercredit"/>
+ <xsl:apply-templates mode="sect2.titlepage.recto.auto.mode" select="info/othercredit"/>
+ <xsl:apply-templates mode="sect2.titlepage.recto.auto.mode" select="sect2info/releaseinfo"/>
+ <xsl:apply-templates mode="sect2.titlepage.recto.auto.mode" select="info/releaseinfo"/>
+ <xsl:apply-templates mode="sect2.titlepage.recto.auto.mode" select="sect2info/copyright"/>
+ <xsl:apply-templates mode="sect2.titlepage.recto.auto.mode" select="info/copyright"/>
+ <xsl:apply-templates mode="sect2.titlepage.recto.auto.mode" select="sect2info/legalnotice"/>
+ <xsl:apply-templates mode="sect2.titlepage.recto.auto.mode" select="info/legalnotice"/>
+ <xsl:apply-templates mode="sect2.titlepage.recto.auto.mode" select="sect2info/pubdate"/>
+ <xsl:apply-templates mode="sect2.titlepage.recto.auto.mode" select="info/pubdate"/>
+ <xsl:apply-templates mode="sect2.titlepage.recto.auto.mode" select="sect2info/revision"/>
+ <xsl:apply-templates mode="sect2.titlepage.recto.auto.mode" select="info/revision"/>
+ <xsl:apply-templates mode="sect2.titlepage.recto.auto.mode" select="sect2info/revhistory"/>
+ <xsl:apply-templates mode="sect2.titlepage.recto.auto.mode" select="info/revhistory"/>
+ <xsl:apply-templates mode="sect2.titlepage.recto.auto.mode" select="sect2info/abstract"/>
+ <xsl:apply-templates mode="sect2.titlepage.recto.auto.mode" select="info/abstract"/>
+</xsl:template>
+
+<xsl:template name="sect2.titlepage.verso">
+</xsl:template>
+
+<xsl:template name="sect2.titlepage.separator"><xsl:if test="count(parent::*)='0'"><hr/></xsl:if>
+</xsl:template>
+
+<xsl:template name="sect2.titlepage.before.recto">
+</xsl:template>
+
+<xsl:template name="sect2.titlepage.before.verso">
+</xsl:template>
+
+<xsl:template name="sect2.titlepage">
+ <div class="titlepage">
+ <xsl:variable name="recto.content">
+ <xsl:call-template name="sect2.titlepage.before.recto"/>
+ <xsl:call-template name="sect2.titlepage.recto"/>
+ </xsl:variable>
+ <xsl:variable name="recto.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($recto.content) != '') or ($recto.elements.count &gt; 0)">
+ <div><xsl:copy-of select="$recto.content"/></div>
+ </xsl:if>
+ <xsl:variable name="verso.content">
+ <xsl:call-template name="sect2.titlepage.before.verso"/>
+ <xsl:call-template name="sect2.titlepage.verso"/>
+ </xsl:variable>
+ <xsl:variable name="verso.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($verso.content) != '') or ($verso.elements.count &gt; 0)">
+ <div><xsl:copy-of select="$verso.content"/></div>
+ </xsl:if>
+ <xsl:call-template name="sect2.titlepage.separator"/>
+ </div>
+</xsl:template>
+
+<xsl:template match="*" mode="sect2.titlepage.recto.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="*" mode="sect2.titlepage.verso.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="title" mode="sect2.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect2.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect2.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="subtitle" mode="sect2.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect2.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect2.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="corpauthor" mode="sect2.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect2.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect2.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="authorgroup" mode="sect2.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect2.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect2.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="author" mode="sect2.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect2.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect2.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="othercredit" mode="sect2.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect2.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect2.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="releaseinfo" mode="sect2.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect2.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect2.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="copyright" mode="sect2.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect2.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect2.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="legalnotice" mode="sect2.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect2.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect2.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="pubdate" mode="sect2.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect2.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect2.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="revision" mode="sect2.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect2.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect2.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="revhistory" mode="sect2.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect2.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect2.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="abstract" mode="sect2.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect2.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect2.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template name="sect3.titlepage.recto">
+ <xsl:choose>
+ <xsl:when test="sect3info/title">
+ <xsl:apply-templates mode="sect3.titlepage.recto.auto.mode" select="sect3info/title"/>
+ </xsl:when>
+ <xsl:when test="info/title">
+ <xsl:apply-templates mode="sect3.titlepage.recto.auto.mode" select="info/title"/>
+ </xsl:when>
+ <xsl:when test="title">
+ <xsl:apply-templates mode="sect3.titlepage.recto.auto.mode" select="title"/>
+ </xsl:when>
+ </xsl:choose>
+
+ <xsl:choose>
+ <xsl:when test="sect3info/subtitle">
+ <xsl:apply-templates mode="sect3.titlepage.recto.auto.mode" select="sect3info/subtitle"/>
+ </xsl:when>
+ <xsl:when test="info/subtitle">
+ <xsl:apply-templates mode="sect3.titlepage.recto.auto.mode" select="info/subtitle"/>
+ </xsl:when>
+ <xsl:when test="subtitle">
+ <xsl:apply-templates mode="sect3.titlepage.recto.auto.mode" select="subtitle"/>
+ </xsl:when>
+ </xsl:choose>
+
+ <xsl:apply-templates mode="sect3.titlepage.recto.auto.mode" select="sect3info/corpauthor"/>
+ <xsl:apply-templates mode="sect3.titlepage.recto.auto.mode" select="info/corpauthor"/>
+ <xsl:apply-templates mode="sect3.titlepage.recto.auto.mode" select="sect3info/authorgroup"/>
+ <xsl:apply-templates mode="sect3.titlepage.recto.auto.mode" select="info/authorgroup"/>
+ <xsl:apply-templates mode="sect3.titlepage.recto.auto.mode" select="sect3info/author"/>
+ <xsl:apply-templates mode="sect3.titlepage.recto.auto.mode" select="info/author"/>
+ <xsl:apply-templates mode="sect3.titlepage.recto.auto.mode" select="sect3info/othercredit"/>
+ <xsl:apply-templates mode="sect3.titlepage.recto.auto.mode" select="info/othercredit"/>
+ <xsl:apply-templates mode="sect3.titlepage.recto.auto.mode" select="sect3info/releaseinfo"/>
+ <xsl:apply-templates mode="sect3.titlepage.recto.auto.mode" select="info/releaseinfo"/>
+ <xsl:apply-templates mode="sect3.titlepage.recto.auto.mode" select="sect3info/copyright"/>
+ <xsl:apply-templates mode="sect3.titlepage.recto.auto.mode" select="info/copyright"/>
+ <xsl:apply-templates mode="sect3.titlepage.recto.auto.mode" select="sect3info/legalnotice"/>
+ <xsl:apply-templates mode="sect3.titlepage.recto.auto.mode" select="info/legalnotice"/>
+ <xsl:apply-templates mode="sect3.titlepage.recto.auto.mode" select="sect3info/pubdate"/>
+ <xsl:apply-templates mode="sect3.titlepage.recto.auto.mode" select="info/pubdate"/>
+ <xsl:apply-templates mode="sect3.titlepage.recto.auto.mode" select="sect3info/revision"/>
+ <xsl:apply-templates mode="sect3.titlepage.recto.auto.mode" select="info/revision"/>
+ <xsl:apply-templates mode="sect3.titlepage.recto.auto.mode" select="sect3info/revhistory"/>
+ <xsl:apply-templates mode="sect3.titlepage.recto.auto.mode" select="info/revhistory"/>
+ <xsl:apply-templates mode="sect3.titlepage.recto.auto.mode" select="sect3info/abstract"/>
+ <xsl:apply-templates mode="sect3.titlepage.recto.auto.mode" select="info/abstract"/>
+</xsl:template>
+
+<xsl:template name="sect3.titlepage.verso">
+</xsl:template>
+
+<xsl:template name="sect3.titlepage.separator"><xsl:if test="count(parent::*)='0'"><hr/></xsl:if>
+</xsl:template>
+
+<xsl:template name="sect3.titlepage.before.recto">
+</xsl:template>
+
+<xsl:template name="sect3.titlepage.before.verso">
+</xsl:template>
+
+<xsl:template name="sect3.titlepage">
+ <div class="titlepage">
+ <xsl:variable name="recto.content">
+ <xsl:call-template name="sect3.titlepage.before.recto"/>
+ <xsl:call-template name="sect3.titlepage.recto"/>
+ </xsl:variable>
+ <xsl:variable name="recto.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($recto.content) != '') or ($recto.elements.count &gt; 0)">
+ <div><xsl:copy-of select="$recto.content"/></div>
+ </xsl:if>
+ <xsl:variable name="verso.content">
+ <xsl:call-template name="sect3.titlepage.before.verso"/>
+ <xsl:call-template name="sect3.titlepage.verso"/>
+ </xsl:variable>
+ <xsl:variable name="verso.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($verso.content) != '') or ($verso.elements.count &gt; 0)">
+ <div><xsl:copy-of select="$verso.content"/></div>
+ </xsl:if>
+ <xsl:call-template name="sect3.titlepage.separator"/>
+ </div>
+</xsl:template>
+
+<xsl:template match="*" mode="sect3.titlepage.recto.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="*" mode="sect3.titlepage.verso.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="title" mode="sect3.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect3.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect3.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="subtitle" mode="sect3.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect3.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect3.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="corpauthor" mode="sect3.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect3.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect3.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="authorgroup" mode="sect3.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect3.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect3.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="author" mode="sect3.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect3.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect3.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="othercredit" mode="sect3.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect3.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect3.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="releaseinfo" mode="sect3.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect3.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect3.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="copyright" mode="sect3.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect3.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect3.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="legalnotice" mode="sect3.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect3.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect3.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="pubdate" mode="sect3.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect3.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect3.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="revision" mode="sect3.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect3.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect3.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="revhistory" mode="sect3.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect3.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect3.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="abstract" mode="sect3.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect3.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect3.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template name="sect4.titlepage.recto">
+ <xsl:choose>
+ <xsl:when test="sect4info/title">
+ <xsl:apply-templates mode="sect4.titlepage.recto.auto.mode" select="sect4info/title"/>
+ </xsl:when>
+ <xsl:when test="info/title">
+ <xsl:apply-templates mode="sect4.titlepage.recto.auto.mode" select="info/title"/>
+ </xsl:when>
+ <xsl:when test="title">
+ <xsl:apply-templates mode="sect4.titlepage.recto.auto.mode" select="title"/>
+ </xsl:when>
+ </xsl:choose>
+
+ <xsl:choose>
+ <xsl:when test="sect4info/subtitle">
+ <xsl:apply-templates mode="sect4.titlepage.recto.auto.mode" select="sect4info/subtitle"/>
+ </xsl:when>
+ <xsl:when test="info/subtitle">
+ <xsl:apply-templates mode="sect4.titlepage.recto.auto.mode" select="info/subtitle"/>
+ </xsl:when>
+ <xsl:when test="subtitle">
+ <xsl:apply-templates mode="sect4.titlepage.recto.auto.mode" select="subtitle"/>
+ </xsl:when>
+ </xsl:choose>
+
+ <xsl:apply-templates mode="sect4.titlepage.recto.auto.mode" select="sect4info/corpauthor"/>
+ <xsl:apply-templates mode="sect4.titlepage.recto.auto.mode" select="info/corpauthor"/>
+ <xsl:apply-templates mode="sect4.titlepage.recto.auto.mode" select="sect4info/authorgroup"/>
+ <xsl:apply-templates mode="sect4.titlepage.recto.auto.mode" select="info/authorgroup"/>
+ <xsl:apply-templates mode="sect4.titlepage.recto.auto.mode" select="sect4info/author"/>
+ <xsl:apply-templates mode="sect4.titlepage.recto.auto.mode" select="info/author"/>
+ <xsl:apply-templates mode="sect4.titlepage.recto.auto.mode" select="sect4info/othercredit"/>
+ <xsl:apply-templates mode="sect4.titlepage.recto.auto.mode" select="info/othercredit"/>
+ <xsl:apply-templates mode="sect4.titlepage.recto.auto.mode" select="sect4info/releaseinfo"/>
+ <xsl:apply-templates mode="sect4.titlepage.recto.auto.mode" select="info/releaseinfo"/>
+ <xsl:apply-templates mode="sect4.titlepage.recto.auto.mode" select="sect4info/copyright"/>
+ <xsl:apply-templates mode="sect4.titlepage.recto.auto.mode" select="info/copyright"/>
+ <xsl:apply-templates mode="sect4.titlepage.recto.auto.mode" select="sect4info/legalnotice"/>
+ <xsl:apply-templates mode="sect4.titlepage.recto.auto.mode" select="info/legalnotice"/>
+ <xsl:apply-templates mode="sect4.titlepage.recto.auto.mode" select="sect4info/pubdate"/>
+ <xsl:apply-templates mode="sect4.titlepage.recto.auto.mode" select="info/pubdate"/>
+ <xsl:apply-templates mode="sect4.titlepage.recto.auto.mode" select="sect4info/revision"/>
+ <xsl:apply-templates mode="sect4.titlepage.recto.auto.mode" select="info/revision"/>
+ <xsl:apply-templates mode="sect4.titlepage.recto.auto.mode" select="sect4info/revhistory"/>
+ <xsl:apply-templates mode="sect4.titlepage.recto.auto.mode" select="info/revhistory"/>
+ <xsl:apply-templates mode="sect4.titlepage.recto.auto.mode" select="sect4info/abstract"/>
+ <xsl:apply-templates mode="sect4.titlepage.recto.auto.mode" select="info/abstract"/>
+</xsl:template>
+
+<xsl:template name="sect4.titlepage.verso">
+</xsl:template>
+
+<xsl:template name="sect4.titlepage.separator"><xsl:if test="count(parent::*)='0'"><hr/></xsl:if>
+</xsl:template>
+
+<xsl:template name="sect4.titlepage.before.recto">
+</xsl:template>
+
+<xsl:template name="sect4.titlepage.before.verso">
+</xsl:template>
+
+<xsl:template name="sect4.titlepage">
+ <div class="titlepage">
+ <xsl:variable name="recto.content">
+ <xsl:call-template name="sect4.titlepage.before.recto"/>
+ <xsl:call-template name="sect4.titlepage.recto"/>
+ </xsl:variable>
+ <xsl:variable name="recto.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($recto.content) != '') or ($recto.elements.count &gt; 0)">
+ <div><xsl:copy-of select="$recto.content"/></div>
+ </xsl:if>
+ <xsl:variable name="verso.content">
+ <xsl:call-template name="sect4.titlepage.before.verso"/>
+ <xsl:call-template name="sect4.titlepage.verso"/>
+ </xsl:variable>
+ <xsl:variable name="verso.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($verso.content) != '') or ($verso.elements.count &gt; 0)">
+ <div><xsl:copy-of select="$verso.content"/></div>
+ </xsl:if>
+ <xsl:call-template name="sect4.titlepage.separator"/>
+ </div>
+</xsl:template>
+
+<xsl:template match="*" mode="sect4.titlepage.recto.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="*" mode="sect4.titlepage.verso.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="title" mode="sect4.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect4.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect4.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="subtitle" mode="sect4.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect4.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect4.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="corpauthor" mode="sect4.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect4.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect4.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="authorgroup" mode="sect4.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect4.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect4.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="author" mode="sect4.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect4.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect4.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="othercredit" mode="sect4.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect4.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect4.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="releaseinfo" mode="sect4.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect4.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect4.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="copyright" mode="sect4.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect4.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect4.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="legalnotice" mode="sect4.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect4.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect4.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="pubdate" mode="sect4.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect4.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect4.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="revision" mode="sect4.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect4.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect4.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="revhistory" mode="sect4.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect4.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect4.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="abstract" mode="sect4.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect4.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect4.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template name="sect5.titlepage.recto">
+ <xsl:choose>
+ <xsl:when test="sect5info/title">
+ <xsl:apply-templates mode="sect5.titlepage.recto.auto.mode" select="sect5info/title"/>
+ </xsl:when>
+ <xsl:when test="info/title">
+ <xsl:apply-templates mode="sect5.titlepage.recto.auto.mode" select="info/title"/>
+ </xsl:when>
+ <xsl:when test="title">
+ <xsl:apply-templates mode="sect5.titlepage.recto.auto.mode" select="title"/>
+ </xsl:when>
+ </xsl:choose>
+
+ <xsl:choose>
+ <xsl:when test="sect5info/subtitle">
+ <xsl:apply-templates mode="sect5.titlepage.recto.auto.mode" select="sect5info/subtitle"/>
+ </xsl:when>
+ <xsl:when test="info/subtitle">
+ <xsl:apply-templates mode="sect5.titlepage.recto.auto.mode" select="info/subtitle"/>
+ </xsl:when>
+ <xsl:when test="subtitle">
+ <xsl:apply-templates mode="sect5.titlepage.recto.auto.mode" select="subtitle"/>
+ </xsl:when>
+ </xsl:choose>
+
+ <xsl:apply-templates mode="sect5.titlepage.recto.auto.mode" select="sect5info/corpauthor"/>
+ <xsl:apply-templates mode="sect5.titlepage.recto.auto.mode" select="info/corpauthor"/>
+ <xsl:apply-templates mode="sect5.titlepage.recto.auto.mode" select="sect5info/authorgroup"/>
+ <xsl:apply-templates mode="sect5.titlepage.recto.auto.mode" select="info/authorgroup"/>
+ <xsl:apply-templates mode="sect5.titlepage.recto.auto.mode" select="sect5info/author"/>
+ <xsl:apply-templates mode="sect5.titlepage.recto.auto.mode" select="info/author"/>
+ <xsl:apply-templates mode="sect5.titlepage.recto.auto.mode" select="sect5info/othercredit"/>
+ <xsl:apply-templates mode="sect5.titlepage.recto.auto.mode" select="info/othercredit"/>
+ <xsl:apply-templates mode="sect5.titlepage.recto.auto.mode" select="sect5info/releaseinfo"/>
+ <xsl:apply-templates mode="sect5.titlepage.recto.auto.mode" select="info/releaseinfo"/>
+ <xsl:apply-templates mode="sect5.titlepage.recto.auto.mode" select="sect5info/copyright"/>
+ <xsl:apply-templates mode="sect5.titlepage.recto.auto.mode" select="info/copyright"/>
+ <xsl:apply-templates mode="sect5.titlepage.recto.auto.mode" select="sect5info/legalnotice"/>
+ <xsl:apply-templates mode="sect5.titlepage.recto.auto.mode" select="info/legalnotice"/>
+ <xsl:apply-templates mode="sect5.titlepage.recto.auto.mode" select="sect5info/pubdate"/>
+ <xsl:apply-templates mode="sect5.titlepage.recto.auto.mode" select="info/pubdate"/>
+ <xsl:apply-templates mode="sect5.titlepage.recto.auto.mode" select="sect5info/revision"/>
+ <xsl:apply-templates mode="sect5.titlepage.recto.auto.mode" select="info/revision"/>
+ <xsl:apply-templates mode="sect5.titlepage.recto.auto.mode" select="sect5info/revhistory"/>
+ <xsl:apply-templates mode="sect5.titlepage.recto.auto.mode" select="info/revhistory"/>
+ <xsl:apply-templates mode="sect5.titlepage.recto.auto.mode" select="sect5info/abstract"/>
+ <xsl:apply-templates mode="sect5.titlepage.recto.auto.mode" select="info/abstract"/>
+</xsl:template>
+
+<xsl:template name="sect5.titlepage.verso">
+</xsl:template>
+
+<xsl:template name="sect5.titlepage.separator"><xsl:if test="count(parent::*)='0'"><hr/></xsl:if>
+</xsl:template>
+
+<xsl:template name="sect5.titlepage.before.recto">
+</xsl:template>
+
+<xsl:template name="sect5.titlepage.before.verso">
+</xsl:template>
+
+<xsl:template name="sect5.titlepage">
+ <div class="titlepage">
+ <xsl:variable name="recto.content">
+ <xsl:call-template name="sect5.titlepage.before.recto"/>
+ <xsl:call-template name="sect5.titlepage.recto"/>
+ </xsl:variable>
+ <xsl:variable name="recto.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($recto.content) != '') or ($recto.elements.count &gt; 0)">
+ <div><xsl:copy-of select="$recto.content"/></div>
+ </xsl:if>
+ <xsl:variable name="verso.content">
+ <xsl:call-template name="sect5.titlepage.before.verso"/>
+ <xsl:call-template name="sect5.titlepage.verso"/>
+ </xsl:variable>
+ <xsl:variable name="verso.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($verso.content) != '') or ($verso.elements.count &gt; 0)">
+ <div><xsl:copy-of select="$verso.content"/></div>
+ </xsl:if>
+ <xsl:call-template name="sect5.titlepage.separator"/>
+ </div>
+</xsl:template>
+
+<xsl:template match="*" mode="sect5.titlepage.recto.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="*" mode="sect5.titlepage.verso.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="title" mode="sect5.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect5.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect5.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="subtitle" mode="sect5.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect5.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect5.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="corpauthor" mode="sect5.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect5.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect5.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="authorgroup" mode="sect5.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect5.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect5.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="author" mode="sect5.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect5.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect5.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="othercredit" mode="sect5.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect5.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect5.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="releaseinfo" mode="sect5.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect5.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect5.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="copyright" mode="sect5.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect5.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect5.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="legalnotice" mode="sect5.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect5.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect5.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="pubdate" mode="sect5.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect5.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect5.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="revision" mode="sect5.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect5.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect5.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="revhistory" mode="sect5.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect5.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect5.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="abstract" mode="sect5.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sect5.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sect5.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template name="simplesect.titlepage.recto">
+ <xsl:choose>
+ <xsl:when test="simplesectinfo/title">
+ <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="simplesectinfo/title"/>
+ </xsl:when>
+ <xsl:when test="docinfo/title">
+ <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="docinfo/title"/>
+ </xsl:when>
+ <xsl:when test="info/title">
+ <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="info/title"/>
+ </xsl:when>
+ <xsl:when test="title">
+ <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="title"/>
+ </xsl:when>
+ </xsl:choose>
+
+ <xsl:choose>
+ <xsl:when test="simplesectinfo/subtitle">
+ <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="simplesectinfo/subtitle"/>
+ </xsl:when>
+ <xsl:when test="docinfo/subtitle">
+ <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="docinfo/subtitle"/>
+ </xsl:when>
+ <xsl:when test="info/subtitle">
+ <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="info/subtitle"/>
+ </xsl:when>
+ <xsl:when test="subtitle">
+ <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="subtitle"/>
+ </xsl:when>
+ </xsl:choose>
+
+ <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="simplesectinfo/corpauthor"/>
+ <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="docinfo/corpauthor"/>
+ <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="info/corpauthor"/>
+ <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="simplesectinfo/authorgroup"/>
+ <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="docinfo/authorgroup"/>
+ <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="info/authorgroup"/>
+ <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="simplesectinfo/author"/>
+ <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="docinfo/author"/>
+ <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="info/author"/>
+ <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="simplesectinfo/othercredit"/>
+ <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="docinfo/othercredit"/>
+ <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="info/othercredit"/>
+ <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="simplesectinfo/releaseinfo"/>
+ <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="docinfo/releaseinfo"/>
+ <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="info/releaseinfo"/>
+ <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="simplesectinfo/copyright"/>
+ <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="docinfo/copyright"/>
+ <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="info/copyright"/>
+ <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="simplesectinfo/legalnotice"/>
+ <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="docinfo/legalnotice"/>
+ <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="info/legalnotice"/>
+ <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="simplesectinfo/pubdate"/>
+ <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="docinfo/pubdate"/>
+ <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="info/pubdate"/>
+ <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="simplesectinfo/revision"/>
+ <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="docinfo/revision"/>
+ <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="info/revision"/>
+ <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="simplesectinfo/revhistory"/>
+ <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="docinfo/revhistory"/>
+ <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="info/revhistory"/>
+ <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="simplesectinfo/abstract"/>
+ <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="docinfo/abstract"/>
+ <xsl:apply-templates mode="simplesect.titlepage.recto.auto.mode" select="info/abstract"/>
+</xsl:template>
+
+<xsl:template name="simplesect.titlepage.verso">
+</xsl:template>
+
+<xsl:template name="simplesect.titlepage.separator"><xsl:if test="count(parent::*)='0'"><hr/></xsl:if>
+</xsl:template>
+
+<xsl:template name="simplesect.titlepage.before.recto">
+</xsl:template>
+
+<xsl:template name="simplesect.titlepage.before.verso">
+</xsl:template>
+
+<xsl:template name="simplesect.titlepage">
+ <div class="titlepage">
+ <xsl:variable name="recto.content">
+ <xsl:call-template name="simplesect.titlepage.before.recto"/>
+ <xsl:call-template name="simplesect.titlepage.recto"/>
+ </xsl:variable>
+ <xsl:variable name="recto.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($recto.content) != '') or ($recto.elements.count &gt; 0)">
+ <div><xsl:copy-of select="$recto.content"/></div>
+ </xsl:if>
+ <xsl:variable name="verso.content">
+ <xsl:call-template name="simplesect.titlepage.before.verso"/>
+ <xsl:call-template name="simplesect.titlepage.verso"/>
+ </xsl:variable>
+ <xsl:variable name="verso.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($verso.content) != '') or ($verso.elements.count &gt; 0)">
+ <div><xsl:copy-of select="$verso.content"/></div>
+ </xsl:if>
+ <xsl:call-template name="simplesect.titlepage.separator"/>
+ </div>
+</xsl:template>
+
+<xsl:template match="*" mode="simplesect.titlepage.recto.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="*" mode="simplesect.titlepage.verso.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="title" mode="simplesect.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="simplesect.titlepage.recto.style">
+<xsl:apply-templates select="." mode="simplesect.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="subtitle" mode="simplesect.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="simplesect.titlepage.recto.style">
+<xsl:apply-templates select="." mode="simplesect.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="corpauthor" mode="simplesect.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="simplesect.titlepage.recto.style">
+<xsl:apply-templates select="." mode="simplesect.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="authorgroup" mode="simplesect.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="simplesect.titlepage.recto.style">
+<xsl:apply-templates select="." mode="simplesect.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="author" mode="simplesect.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="simplesect.titlepage.recto.style">
+<xsl:apply-templates select="." mode="simplesect.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="othercredit" mode="simplesect.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="simplesect.titlepage.recto.style">
+<xsl:apply-templates select="." mode="simplesect.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="releaseinfo" mode="simplesect.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="simplesect.titlepage.recto.style">
+<xsl:apply-templates select="." mode="simplesect.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="copyright" mode="simplesect.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="simplesect.titlepage.recto.style">
+<xsl:apply-templates select="." mode="simplesect.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="legalnotice" mode="simplesect.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="simplesect.titlepage.recto.style">
+<xsl:apply-templates select="." mode="simplesect.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="pubdate" mode="simplesect.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="simplesect.titlepage.recto.style">
+<xsl:apply-templates select="." mode="simplesect.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="revision" mode="simplesect.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="simplesect.titlepage.recto.style">
+<xsl:apply-templates select="." mode="simplesect.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="revhistory" mode="simplesect.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="simplesect.titlepage.recto.style">
+<xsl:apply-templates select="." mode="simplesect.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template match="abstract" mode="simplesect.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="simplesect.titlepage.recto.style">
+<xsl:apply-templates select="." mode="simplesect.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template name="bibliography.titlepage.recto">
+ <div xsl:use-attribute-sets="bibliography.titlepage.recto.style">
+<xsl:call-template name="component.title">
+<xsl:with-param name="node" select="ancestor-or-self::bibliography[1]"/>
+</xsl:call-template></div>
+ <xsl:choose>
+ <xsl:when test="bibliographyinfo/subtitle">
+ <xsl:apply-templates mode="bibliography.titlepage.recto.auto.mode" select="bibliographyinfo/subtitle"/>
+ </xsl:when>
+ <xsl:when test="docinfo/subtitle">
+ <xsl:apply-templates mode="bibliography.titlepage.recto.auto.mode" select="docinfo/subtitle"/>
+ </xsl:when>
+ <xsl:when test="info/subtitle">
+ <xsl:apply-templates mode="bibliography.titlepage.recto.auto.mode" select="info/subtitle"/>
+ </xsl:when>
+ <xsl:when test="subtitle">
+ <xsl:apply-templates mode="bibliography.titlepage.recto.auto.mode" select="subtitle"/>
+ </xsl:when>
+ </xsl:choose>
+
+</xsl:template>
+
+<xsl:template name="bibliography.titlepage.verso">
+</xsl:template>
+
+<xsl:template name="bibliography.titlepage.separator">
+</xsl:template>
+
+<xsl:template name="bibliography.titlepage.before.recto">
+</xsl:template>
+
+<xsl:template name="bibliography.titlepage.before.verso">
+</xsl:template>
+
+<xsl:template name="bibliography.titlepage">
+ <div class="titlepage">
+ <xsl:variable name="recto.content">
+ <xsl:call-template name="bibliography.titlepage.before.recto"/>
+ <xsl:call-template name="bibliography.titlepage.recto"/>
+ </xsl:variable>
+ <xsl:variable name="recto.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($recto.content) != '') or ($recto.elements.count &gt; 0)">
+ <div><xsl:copy-of select="$recto.content"/></div>
+ </xsl:if>
+ <xsl:variable name="verso.content">
+ <xsl:call-template name="bibliography.titlepage.before.verso"/>
+ <xsl:call-template name="bibliography.titlepage.verso"/>
+ </xsl:variable>
+ <xsl:variable name="verso.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($verso.content) != '') or ($verso.elements.count &gt; 0)">
+ <div><xsl:copy-of select="$verso.content"/></div>
+ </xsl:if>
+ <xsl:call-template name="bibliography.titlepage.separator"/>
+ </div>
+</xsl:template>
+
+<xsl:template match="*" mode="bibliography.titlepage.recto.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="*" mode="bibliography.titlepage.verso.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="subtitle" mode="bibliography.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="bibliography.titlepage.recto.style">
+<xsl:apply-templates select="." mode="bibliography.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template name="glossary.titlepage.recto">
+ <div xsl:use-attribute-sets="glossary.titlepage.recto.style">
+<xsl:call-template name="component.title">
+<xsl:with-param name="node" select="ancestor-or-self::glossary[1]"/>
+</xsl:call-template></div>
+ <xsl:choose>
+ <xsl:when test="glossaryinfo/subtitle">
+ <xsl:apply-templates mode="glossary.titlepage.recto.auto.mode" select="glossaryinfo/subtitle"/>
+ </xsl:when>
+ <xsl:when test="docinfo/subtitle">
+ <xsl:apply-templates mode="glossary.titlepage.recto.auto.mode" select="docinfo/subtitle"/>
+ </xsl:when>
+ <xsl:when test="info/subtitle">
+ <xsl:apply-templates mode="glossary.titlepage.recto.auto.mode" select="info/subtitle"/>
+ </xsl:when>
+ <xsl:when test="subtitle">
+ <xsl:apply-templates mode="glossary.titlepage.recto.auto.mode" select="subtitle"/>
+ </xsl:when>
+ </xsl:choose>
+
+</xsl:template>
+
+<xsl:template name="glossary.titlepage.verso">
+</xsl:template>
+
+<xsl:template name="glossary.titlepage.separator">
+</xsl:template>
+
+<xsl:template name="glossary.titlepage.before.recto">
+</xsl:template>
+
+<xsl:template name="glossary.titlepage.before.verso">
+</xsl:template>
+
+<xsl:template name="glossary.titlepage">
+ <div class="titlepage">
+ <xsl:variable name="recto.content">
+ <xsl:call-template name="glossary.titlepage.before.recto"/>
+ <xsl:call-template name="glossary.titlepage.recto"/>
+ </xsl:variable>
+ <xsl:variable name="recto.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($recto.content) != '') or ($recto.elements.count &gt; 0)">
+ <div><xsl:copy-of select="$recto.content"/></div>
+ </xsl:if>
+ <xsl:variable name="verso.content">
+ <xsl:call-template name="glossary.titlepage.before.verso"/>
+ <xsl:call-template name="glossary.titlepage.verso"/>
+ </xsl:variable>
+ <xsl:variable name="verso.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($verso.content) != '') or ($verso.elements.count &gt; 0)">
+ <div><xsl:copy-of select="$verso.content"/></div>
+ </xsl:if>
+ <xsl:call-template name="glossary.titlepage.separator"/>
+ </div>
+</xsl:template>
+
+<xsl:template match="*" mode="glossary.titlepage.recto.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="*" mode="glossary.titlepage.verso.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="subtitle" mode="glossary.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="glossary.titlepage.recto.style">
+<xsl:apply-templates select="." mode="glossary.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template name="index.titlepage.recto">
+ <div xsl:use-attribute-sets="index.titlepage.recto.style">
+<xsl:call-template name="component.title">
+<xsl:with-param name="node" select="ancestor-or-self::index[1]"/>
+</xsl:call-template></div>
+ <xsl:choose>
+ <xsl:when test="indexinfo/subtitle">
+ <xsl:apply-templates mode="index.titlepage.recto.auto.mode" select="indexinfo/subtitle"/>
+ </xsl:when>
+ <xsl:when test="docinfo/subtitle">
+ <xsl:apply-templates mode="index.titlepage.recto.auto.mode" select="docinfo/subtitle"/>
+ </xsl:when>
+ <xsl:when test="info/subtitle">
+ <xsl:apply-templates mode="index.titlepage.recto.auto.mode" select="info/subtitle"/>
+ </xsl:when>
+ <xsl:when test="subtitle">
+ <xsl:apply-templates mode="index.titlepage.recto.auto.mode" select="subtitle"/>
+ </xsl:when>
+ </xsl:choose>
+
+</xsl:template>
+
+<xsl:template name="index.titlepage.verso">
+</xsl:template>
+
+<xsl:template name="index.titlepage.separator">
+</xsl:template>
+
+<xsl:template name="index.titlepage.before.recto">
+</xsl:template>
+
+<xsl:template name="index.titlepage.before.verso">
+</xsl:template>
+
+<xsl:template name="index.titlepage">
+ <div class="titlepage">
+ <xsl:variable name="recto.content">
+ <xsl:call-template name="index.titlepage.before.recto"/>
+ <xsl:call-template name="index.titlepage.recto"/>
+ </xsl:variable>
+ <xsl:variable name="recto.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($recto.content) != '') or ($recto.elements.count &gt; 0)">
+ <div><xsl:copy-of select="$recto.content"/></div>
+ </xsl:if>
+ <xsl:variable name="verso.content">
+ <xsl:call-template name="index.titlepage.before.verso"/>
+ <xsl:call-template name="index.titlepage.verso"/>
+ </xsl:variable>
+ <xsl:variable name="verso.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($verso.content) != '') or ($verso.elements.count &gt; 0)">
+ <div><xsl:copy-of select="$verso.content"/></div>
+ </xsl:if>
+ <xsl:call-template name="index.titlepage.separator"/>
+ </div>
+</xsl:template>
+
+<xsl:template match="*" mode="index.titlepage.recto.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="*" mode="index.titlepage.verso.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="subtitle" mode="index.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="index.titlepage.recto.style">
+<xsl:apply-templates select="." mode="index.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template name="setindex.titlepage.recto">
+ <div xsl:use-attribute-sets="setindex.titlepage.recto.style">
+<xsl:call-template name="component.title">
+<xsl:with-param name="node" select="ancestor-or-self::setindex[1]"/>
+</xsl:call-template></div>
+ <xsl:choose>
+ <xsl:when test="setindexinfo/subtitle">
+ <xsl:apply-templates mode="setindex.titlepage.recto.auto.mode" select="setindexinfo/subtitle"/>
+ </xsl:when>
+ <xsl:when test="docinfo/subtitle">
+ <xsl:apply-templates mode="setindex.titlepage.recto.auto.mode" select="docinfo/subtitle"/>
+ </xsl:when>
+ <xsl:when test="info/subtitle">
+ <xsl:apply-templates mode="setindex.titlepage.recto.auto.mode" select="info/subtitle"/>
+ </xsl:when>
+ <xsl:when test="subtitle">
+ <xsl:apply-templates mode="setindex.titlepage.recto.auto.mode" select="subtitle"/>
+ </xsl:when>
+ </xsl:choose>
+
+</xsl:template>
+
+<xsl:template name="setindex.titlepage.verso">
+</xsl:template>
+
+<xsl:template name="setindex.titlepage.separator">
+</xsl:template>
+
+<xsl:template name="setindex.titlepage.before.recto">
+</xsl:template>
+
+<xsl:template name="setindex.titlepage.before.verso">
+</xsl:template>
+
+<xsl:template name="setindex.titlepage">
+ <div class="titlepage">
+ <xsl:variable name="recto.content">
+ <xsl:call-template name="setindex.titlepage.before.recto"/>
+ <xsl:call-template name="setindex.titlepage.recto"/>
+ </xsl:variable>
+ <xsl:variable name="recto.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($recto.content) != '') or ($recto.elements.count &gt; 0)">
+ <div><xsl:copy-of select="$recto.content"/></div>
+ </xsl:if>
+ <xsl:variable name="verso.content">
+ <xsl:call-template name="setindex.titlepage.before.verso"/>
+ <xsl:call-template name="setindex.titlepage.verso"/>
+ </xsl:variable>
+ <xsl:variable name="verso.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($verso.content) != '') or ($verso.elements.count &gt; 0)">
+ <div><xsl:copy-of select="$verso.content"/></div>
+ </xsl:if>
+ <xsl:call-template name="setindex.titlepage.separator"/>
+ </div>
+</xsl:template>
+
+<xsl:template match="*" mode="setindex.titlepage.recto.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="*" mode="setindex.titlepage.verso.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="subtitle" mode="setindex.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="setindex.titlepage.recto.style">
+<xsl:apply-templates select="." mode="setindex.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+<xsl:template name="sidebar.titlepage.recto">
+ <xsl:choose>
+ <xsl:when test="sidebarinfo/title">
+ <xsl:apply-templates mode="sidebar.titlepage.recto.auto.mode" select="sidebarinfo/title"/>
+ </xsl:when>
+ <xsl:when test="docinfo/title">
+ <xsl:apply-templates mode="sidebar.titlepage.recto.auto.mode" select="docinfo/title"/>
+ </xsl:when>
+ <xsl:when test="info/title">
+ <xsl:apply-templates mode="sidebar.titlepage.recto.auto.mode" select="info/title"/>
+ </xsl:when>
+ <xsl:when test="title">
+ <xsl:apply-templates mode="sidebar.titlepage.recto.auto.mode" select="title"/>
+ </xsl:when>
+ </xsl:choose>
+
+ <xsl:choose>
+ <xsl:when test="sidebarinfo/subtitle">
+ <xsl:apply-templates mode="sidebar.titlepage.recto.auto.mode" select="sidebarinfo/subtitle"/>
+ </xsl:when>
+ <xsl:when test="docinfo/subtitle">
+ <xsl:apply-templates mode="sidebar.titlepage.recto.auto.mode" select="docinfo/subtitle"/>
+ </xsl:when>
+ <xsl:when test="info/subtitle">
+ <xsl:apply-templates mode="sidebar.titlepage.recto.auto.mode" select="info/subtitle"/>
+ </xsl:when>
+ <xsl:when test="subtitle">
+ <xsl:apply-templates mode="sidebar.titlepage.recto.auto.mode" select="subtitle"/>
+ </xsl:when>
+ </xsl:choose>
+
+</xsl:template>
+
+<xsl:template name="sidebar.titlepage.verso">
+</xsl:template>
+
+<xsl:template name="sidebar.titlepage.separator">
+</xsl:template>
+
+<xsl:template name="sidebar.titlepage.before.recto">
+</xsl:template>
+
+<xsl:template name="sidebar.titlepage.before.verso">
+</xsl:template>
+
+<xsl:template name="sidebar.titlepage">
+ <div class="titlepage">
+ <xsl:variable name="recto.content">
+ <xsl:call-template name="sidebar.titlepage.before.recto"/>
+ <xsl:call-template name="sidebar.titlepage.recto"/>
+ </xsl:variable>
+ <xsl:variable name="recto.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($recto.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($recto.content) != '') or ($recto.elements.count &gt; 0)">
+ <div><xsl:copy-of select="$recto.content"/></div>
+ </xsl:if>
+ <xsl:variable name="verso.content">
+ <xsl:call-template name="sidebar.titlepage.before.verso"/>
+ <xsl:call-template name="sidebar.titlepage.verso"/>
+ </xsl:variable>
+ <xsl:variable name="verso.elements.count">
+ <xsl:choose>
+ <xsl:when test="function-available('exsl:node-set')"><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:when test="contains(system-property('xsl:vendor'), 'Apache Software Foundation')">
+ <!--Xalan quirk--><xsl:value-of select="count(exsl:node-set($verso.content)/*)"/></xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:if test="(normalize-space($verso.content) != '') or ($verso.elements.count &gt; 0)">
+ <div><xsl:copy-of select="$verso.content"/></div>
+ </xsl:if>
+ <xsl:call-template name="sidebar.titlepage.separator"/>
+ </div>
+</xsl:template>
+
+<xsl:template match="*" mode="sidebar.titlepage.recto.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="*" mode="sidebar.titlepage.verso.mode">
+ <!-- if an element isn't found in this mode, -->
+ <!-- try the generic titlepage.mode -->
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="title" mode="sidebar.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sidebar.titlepage.recto.style">
+<xsl:call-template name="formal.object.heading">
+<xsl:with-param name="object" select="ancestor-or-self::sidebar[1]"/>
+</xsl:call-template>
+</div>
+</xsl:template>
+
+<xsl:template match="subtitle" mode="sidebar.titlepage.recto.auto.mode">
+<div xsl:use-attribute-sets="sidebar.titlepage.recto.style">
+<xsl:apply-templates select="." mode="sidebar.titlepage.recto.mode"/>
+</div>
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/titlepage.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/titlepage.xsl
new file mode 100644
index 0000000..c3f8217
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/titlepage.xsl
@@ -0,0 +1,1030 @@
+<?xml version="1.0" encoding="ASCII"?>
+<!--This file was created automatically by html2xhtml-->
+<!--from the HTML stylesheets.-->
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1999/xhtml" version="1.0">
+
+<!-- ********************************************************************
+ $Id: titlepage.xsl 8816 2010-08-10 11:56:35Z mzjn $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<!-- ==================================================================== -->
+
+<xsl:attribute-set name="book.titlepage.recto.style"/>
+<xsl:attribute-set name="book.titlepage.verso.style"/>
+
+<xsl:attribute-set name="article.titlepage.recto.style"/>
+<xsl:attribute-set name="article.titlepage.verso.style"/>
+
+<xsl:attribute-set name="set.titlepage.recto.style"/>
+<xsl:attribute-set name="set.titlepage.verso.style"/>
+
+<xsl:attribute-set name="part.titlepage.recto.style"/>
+<xsl:attribute-set name="part.titlepage.verso.style"/>
+
+<xsl:attribute-set name="partintro.titlepage.recto.style"/>
+<xsl:attribute-set name="partintro.titlepage.verso.style"/>
+
+<xsl:attribute-set name="reference.titlepage.recto.style"/>
+<xsl:attribute-set name="reference.titlepage.verso.style"/>
+
+<xsl:attribute-set name="refentry.titlepage.recto.style"/>
+<xsl:attribute-set name="refentry.titlepage.verso.style"/>
+
+<xsl:attribute-set name="dedication.titlepage.recto.style"/>
+<xsl:attribute-set name="dedication.titlepage.verso.style"/>
+
+<xsl:attribute-set name="acknowledgements.titlepage.recto.style"/>
+<xsl:attribute-set name="acknowledgements.titlepage.verso.style"/>
+
+<xsl:attribute-set name="preface.titlepage.recto.style"/>
+<xsl:attribute-set name="preface.titlepage.verso.style"/>
+
+<xsl:attribute-set name="chapter.titlepage.recto.style"/>
+<xsl:attribute-set name="chapter.titlepage.verso.style"/>
+
+<xsl:attribute-set name="appendix.titlepage.recto.style"/>
+<xsl:attribute-set name="appendix.titlepage.verso.style"/>
+
+<xsl:attribute-set name="bibliography.titlepage.recto.style"/>
+<xsl:attribute-set name="bibliography.titlepage.verso.style"/>
+
+<xsl:attribute-set name="glossary.titlepage.recto.style"/>
+<xsl:attribute-set name="glossary.titlepage.verso.style"/>
+
+<xsl:attribute-set name="index.titlepage.recto.style"/>
+<xsl:attribute-set name="index.titlepage.verso.style"/>
+
+<xsl:attribute-set name="setindex.titlepage.recto.style"/>
+<xsl:attribute-set name="setindex.titlepage.verso.style"/>
+
+<xsl:attribute-set name="sidebar.titlepage.recto.style"/>
+<xsl:attribute-set name="sidebar.titlepage.verso.style"/>
+
+<xsl:attribute-set name="section.titlepage.recto.style"/>
+<xsl:attribute-set name="section.titlepage.verso.style"/>
+
+<xsl:attribute-set name="sect1.titlepage.recto.style" use-attribute-sets="section.titlepage.recto.style"/>
+<xsl:attribute-set name="sect1.titlepage.verso.style" use-attribute-sets="section.titlepage.verso.style"/>
+
+<xsl:attribute-set name="sect2.titlepage.recto.style" use-attribute-sets="section.titlepage.recto.style"/>
+<xsl:attribute-set name="sect2.titlepage.verso.style" use-attribute-sets="section.titlepage.verso.style"/>
+
+<xsl:attribute-set name="sect3.titlepage.recto.style" use-attribute-sets="section.titlepage.recto.style"/>
+<xsl:attribute-set name="sect3.titlepage.verso.style" use-attribute-sets="section.titlepage.verso.style"/>
+
+<xsl:attribute-set name="sect4.titlepage.recto.style" use-attribute-sets="section.titlepage.recto.style"/>
+<xsl:attribute-set name="sect4.titlepage.verso.style" use-attribute-sets="section.titlepage.verso.style"/>
+
+<xsl:attribute-set name="sect5.titlepage.recto.style" use-attribute-sets="section.titlepage.recto.style"/>
+<xsl:attribute-set name="sect5.titlepage.verso.style" use-attribute-sets="section.titlepage.verso.style"/>
+
+<xsl:attribute-set name="simplesect.titlepage.recto.style" use-attribute-sets="section.titlepage.recto.style"/>
+<xsl:attribute-set name="simplesect.titlepage.verso.style" use-attribute-sets="section.titlepage.verso.style"/>
+
+<xsl:attribute-set name="table.of.contents.titlepage.recto.style"/>
+<xsl:attribute-set name="table.of.contents.titlepage.verso.style"/>
+
+<xsl:attribute-set name="list.of.tables.titlepage.recto.style"/>
+<xsl:attribute-set name="list.of.tables.contents.titlepage.verso.style"/>
+
+<xsl:attribute-set name="list.of.figures.titlepage.recto.style"/>
+<xsl:attribute-set name="list.of.figures.contents.titlepage.verso.style"/>
+
+<xsl:attribute-set name="list.of.equations.titlepage.recto.style"/>
+<xsl:attribute-set name="list.of.equations.contents.titlepage.verso.style"/>
+
+<xsl:attribute-set name="list.of.examples.titlepage.recto.style"/>
+<xsl:attribute-set name="list.of.examples.contents.titlepage.verso.style"/>
+
+<xsl:attribute-set name="list.of.unknowns.titlepage.recto.style"/>
+<xsl:attribute-set name="list.of.unknowns.contents.titlepage.verso.style"/>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="*" mode="titlepage.mode">
+ <!-- if an element isn't found in this mode, try the default mode -->
+ <xsl:apply-templates select="."/>
+</xsl:template>
+
+<xsl:template match="abbrev" mode="titlepage.mode">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="titlepage.mode"/>
+ <br/>
+ </span>
+</xsl:template>
+
+<xsl:template match="abstract" mode="titlepage.mode">
+ <div>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:call-template name="anchor"/>
+ <xsl:if test="$abstract.notitle.enabled = 0">
+ <xsl:call-template name="formal.object.heading">
+ <xsl:with-param name="title">
+ <xsl:apply-templates select="." mode="title.markup"/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:if>
+ <xsl:apply-templates mode="titlepage.mode"/>
+ <xsl:call-template name="process.footnotes"/>
+ </div>
+</xsl:template>
+
+<xsl:template match="abstract/title" mode="titlepage.mode">
+</xsl:template>
+
+<xsl:template match="address" mode="titlepage.mode">
+ <xsl:param name="suppress-numbers" select="'0'"/>
+
+ <xsl:variable name="rtf">
+ <xsl:apply-templates mode="titlepage.mode"/>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="$suppress-numbers = '0' and @linenumbering = 'numbered' and $use.extensions != '0' and $linenumbering.extension != '0'">
+ <div>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:call-template name="paragraph">
+ <xsl:with-param name="content">
+ <xsl:call-template name="number.rtf.lines">
+ <xsl:with-param name="rtf" select="$rtf"/>
+ </xsl:call-template>
+ </xsl:with-param>
+ </xsl:call-template>
+ </div>
+ </xsl:when>
+
+ <xsl:otherwise>
+ <div>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:call-template name="paragraph">
+ <xsl:with-param name="content">
+ <xsl:call-template name="make-verbatim">
+ <xsl:with-param name="rtf" select="$rtf"/>
+ </xsl:call-template>
+ </xsl:with-param>
+ </xsl:call-template>
+ </div>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="affiliation" mode="titlepage.mode">
+ <div>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="titlepage.mode"/>
+ </div>
+</xsl:template>
+
+<xsl:template match="artpagenums" mode="titlepage.mode">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="titlepage.mode"/>
+ <br/>
+ </span>
+</xsl:template>
+
+<xsl:template match="author|editor" mode="titlepage.mode">
+ <xsl:call-template name="credits.div"/>
+</xsl:template>
+
+<xsl:template name="credits.div">
+ <div>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:if test="self::editor[position()=1] and not($editedby.enabled = 0)">
+ <h4 class="editedby"><xsl:call-template name="gentext.edited.by"/></h4>
+ </xsl:if>
+ <h3>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:choose>
+ <xsl:when test="orgname">
+ <xsl:apply-templates/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="person.name"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </h3>
+ <xsl:if test="not($contrib.inline.enabled = 0)">
+ <xsl:apply-templates mode="titlepage.mode" select="contrib"/>
+ </xsl:if>
+ <xsl:apply-templates mode="titlepage.mode" select="affiliation"/>
+ <xsl:apply-templates mode="titlepage.mode" select="email"/>
+ <xsl:if test="not($blurb.on.titlepage.enabled = 0)">
+ <xsl:choose>
+ <xsl:when test="$contrib.inline.enabled = 0">
+ <xsl:apply-templates mode="titlepage.mode" select="contrib|authorblurb|personblurb"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates mode="titlepage.mode" select="authorblurb|personblurb"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:if>
+ </div>
+</xsl:template>
+
+<xsl:template match="authorblurb|personblurb" mode="titlepage.mode">
+ <div>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="titlepage.mode"/>
+ </div>
+</xsl:template>
+
+<xsl:template match="authorgroup" mode="titlepage.mode">
+ <div>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:if test="parent::refentryinfo">
+ <h2>Authors</h2>
+ </xsl:if>
+
+ <xsl:call-template name="anchor"/>
+ <xsl:apply-templates mode="titlepage.mode"/>
+ </div>
+</xsl:template>
+
+<xsl:template match="authorinitials" mode="titlepage.mode">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="titlepage.mode"/>
+ <br/>
+ </span>
+</xsl:template>
+
+<xsl:template match="bibliomisc" mode="titlepage.mode">
+ <xsl:apply-templates mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="bibliomset" mode="titlepage.mode">
+ <xsl:apply-templates mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="collab" mode="titlepage.mode">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="titlepage.mode"/>
+ <br/>
+ </span>
+</xsl:template>
+
+<xsl:template match="collabname" mode="titlepage.mode">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="titlepage.mode"/>
+ </span>
+</xsl:template>
+
+<xsl:template match="confgroup" mode="titlepage.mode">
+ <div>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="titlepage.mode"/>
+ </div>
+</xsl:template>
+
+<xsl:template match="confdates" mode="titlepage.mode">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="titlepage.mode"/>
+ <br/>
+ </span>
+</xsl:template>
+
+<xsl:template match="confsponsor" mode="titlepage.mode">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="titlepage.mode"/>
+ <br/>
+ </span>
+</xsl:template>
+
+<xsl:template match="conftitle" mode="titlepage.mode">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="titlepage.mode"/>
+ <br/>
+ </span>
+</xsl:template>
+
+<xsl:template match="confnum" mode="titlepage.mode">
+ <!-- suppress -->
+</xsl:template>
+
+<xsl:template match="contractnum" mode="titlepage.mode">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="titlepage.mode"/>
+ <br/>
+ </span>
+</xsl:template>
+
+<xsl:template match="contractsponsor" mode="titlepage.mode">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="titlepage.mode"/>
+ <br/>
+ </span>
+</xsl:template>
+
+<xsl:template match="contrib" mode="titlepage.mode">
+ <xsl:choose>
+ <xsl:when test="not($contrib.inline.enabled = 0)">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="titlepage.mode"/>
+ </span><xsl:text>&#160;</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <div>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <p><xsl:apply-templates mode="titlepage.mode"/></p>
+ </div>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="copyright" mode="titlepage.mode">
+
+ <xsl:if test="generate-id() = generate-id(//refentryinfo/copyright[1]) and ($stylesheet.result.type = 'html' or $stylesheet.result.type = 'xhtml')">
+ <h2>Copyright</h2>
+ </xsl:if>
+
+ <p>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'Copyright'"/>
+ </xsl:call-template>
+ <xsl:call-template name="gentext.space"/>
+ <xsl:call-template name="dingbat">
+ <xsl:with-param name="dingbat">copyright</xsl:with-param>
+ </xsl:call-template>
+ <xsl:call-template name="gentext.space"/>
+ <xsl:call-template name="copyright.years">
+ <xsl:with-param name="years" select="year"/>
+ <xsl:with-param name="print.ranges" select="$make.year.ranges"/>
+ <xsl:with-param name="single.year.ranges" select="$make.single.year.ranges"/>
+ </xsl:call-template>
+ <xsl:call-template name="gentext.space"/>
+ <xsl:apply-templates select="holder" mode="titlepage.mode"/>
+ </p>
+</xsl:template>
+
+<xsl:template match="year" mode="titlepage.mode">
+ <xsl:choose>
+ <xsl:when test="$show.revisionflag != 0 and @revisionflag">
+ <span class="{@revisionflag}">
+ <xsl:apply-templates mode="titlepage.mode"/>
+ </span>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates mode="titlepage.mode"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="holder" mode="titlepage.mode">
+ <xsl:choose>
+ <xsl:when test="$show.revisionflag != 0 and @revisionflag">
+ <span class="{@revisionflag}">
+ <xsl:apply-templates mode="titlepage.mode"/>
+ </span>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates mode="titlepage.mode"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:if test="position() &lt; last()">
+ <xsl:text>, </xsl:text>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="corpauthor" mode="titlepage.mode">
+ <h3>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="titlepage.mode"/>
+ </h3>
+</xsl:template>
+
+<xsl:template match="corpcredit" mode="titlepage.mode">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="titlepage.mode"/>
+ <br/>
+ </span>
+</xsl:template>
+
+<xsl:template match="corpname" mode="titlepage.mode">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="titlepage.mode"/>
+ <br/>
+ </span>
+</xsl:template>
+
+<xsl:template match="date" mode="titlepage.mode">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="titlepage.mode"/>
+ <br/>
+ </span>
+</xsl:template>
+
+<xsl:template match="edition" mode="titlepage.mode">
+ <p>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="titlepage.mode"/>
+ <xsl:call-template name="gentext.space"/>
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'Edition'"/>
+ </xsl:call-template>
+ </p>
+</xsl:template>
+
+<xsl:template match="email" mode="titlepage.mode">
+ <!-- use the normal e-mail handling code -->
+ <xsl:apply-templates select="."/>
+</xsl:template>
+
+<xsl:template match="firstname" mode="titlepage.mode">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="titlepage.mode"/>
+ <br/>
+ </span>
+</xsl:template>
+
+<xsl:template match="graphic" mode="titlepage.mode">
+ <!-- use the normal graphic handling code -->
+ <xsl:apply-templates select="."/>
+</xsl:template>
+
+<xsl:template match="honorific" mode="titlepage.mode">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="titlepage.mode"/>
+ <br/>
+ </span>
+</xsl:template>
+
+<xsl:template match="isbn" mode="titlepage.mode">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="titlepage.mode"/>
+ <br/>
+ </span>
+</xsl:template>
+
+<xsl:template match="issn" mode="titlepage.mode">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="titlepage.mode"/>
+ <br/>
+ </span>
+</xsl:template>
+
+<xsl:template match="biblioid" mode="titlepage.mode">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="titlepage.mode"/>
+ <br/>
+ </span>
+</xsl:template>
+
+<xsl:template match="itermset" mode="titlepage.mode">
+</xsl:template>
+
+<xsl:template match="invpartnumber" mode="titlepage.mode">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="titlepage.mode"/>
+ <br/>
+ </span>
+</xsl:template>
+
+<xsl:template match="issuenum" mode="titlepage.mode">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="titlepage.mode"/>
+ <br/>
+ </span>
+</xsl:template>
+
+<xsl:template match="jobtitle" mode="titlepage.mode">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="titlepage.mode"/>
+ <br/>
+ </span>
+</xsl:template>
+
+<xsl:template match="keywordset" mode="titlepage.mode">
+</xsl:template>
+
+<xsl:template match="legalnotice" mode="titlepage.mode">
+ <xsl:variable name="id"><xsl:call-template name="object.id"/></xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="$generate.legalnotice.link != 0">
+
+ <!-- Compute name of legalnotice file -->
+ <xsl:variable name="file">
+ <xsl:call-template name="ln.or.rh.filename"/>
+ </xsl:variable>
+
+ <xsl:variable name="filename">
+ <xsl:call-template name="make-relative-filename">
+ <xsl:with-param name="base.dir" select="$base.dir"/>
+ <xsl:with-param name="base.name" select="$file"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="title">
+ <xsl:apply-templates select="." mode="title.markup"/>
+ </xsl:variable>
+
+ <a href="{$file}">
+ <xsl:copy-of select="$title"/>
+ </a>
+
+ <xsl:call-template name="write.chunk">
+ <xsl:with-param name="filename" select="$filename"/>
+ <xsl:with-param name="quiet" select="$chunk.quietly"/>
+ <xsl:with-param name="content">
+ <xsl:call-template name="user.preroot"/>
+ <html>
+ <head>
+ <xsl:call-template name="system.head.content"/>
+ <xsl:call-template name="head.content"/>
+ <xsl:call-template name="user.head.content"/>
+ </head>
+ <body>
+ <xsl:call-template name="body.attributes"/>
+ <div>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="titlepage.mode"/>
+ </div>
+ </body>
+ </html>
+ <xsl:value-of select="$chunk.append"/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <div>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <a id="{$id}"/>
+ <xsl:apply-templates mode="titlepage.mode"/>
+ </div>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="legalnotice/title" mode="titlepage.mode">
+ <p class="legalnotice-title"><strong xmlns:xslo="http://www.w3.org/1999/XSL/Transform"><xsl:apply-templates/></strong></p>
+</xsl:template>
+
+<xsl:template match="lineage" mode="titlepage.mode">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="titlepage.mode"/>
+ <br/>
+ </span>
+</xsl:template>
+
+<xsl:template match="modespec" mode="titlepage.mode">
+</xsl:template>
+
+<xsl:template match="orgdiv" mode="titlepage.mode">
+ <xsl:if test="preceding-sibling::*[1][self::orgname]">
+ <xsl:text> </xsl:text>
+ </xsl:if>
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="titlepage.mode"/>
+ <br/>
+ </span>
+</xsl:template>
+
+<xsl:template match="orgname" mode="titlepage.mode">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="titlepage.mode"/>
+ <br/>
+ </span>
+</xsl:template>
+
+<xsl:template match="othercredit" mode="titlepage.mode">
+<xsl:choose>
+ <xsl:when test="not($othercredit.like.author.enabled = 0)">
+ <xsl:variable name="contrib" select="string(contrib)"/>
+ <xsl:choose>
+ <xsl:when test="contrib">
+ <xsl:if test="not(preceding-sibling::othercredit[string(contrib)=$contrib])">
+ <xsl:call-template name="paragraph">
+ <xsl:with-param name="class" select="local-name(.)"/>
+ <xsl:with-param name="content">
+ <xsl:apply-templates mode="titlepage.mode" select="contrib"/>
+ <xsl:text>: </xsl:text>
+ <xsl:call-template name="person.name"/>
+ <xsl:apply-templates mode="titlepage.mode" select="affiliation"/>
+ <xsl:apply-templates select="following-sibling::othercredit[string(contrib)=$contrib]" mode="titlepage.othercredits"/>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="paragraph">
+ <xsl:with-param name="class" select="local-name(.)"/>
+ <xsl:with-param name="content">
+ <xsl:call-template name="person.name"/>
+ </xsl:with-param>
+ </xsl:call-template>
+ <xsl:apply-templates mode="titlepage.mode" select="affiliation"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="credits.div"/>
+ </xsl:otherwise>
+</xsl:choose>
+</xsl:template>
+
+<xsl:template match="othercredit" mode="titlepage.othercredits">
+ <xsl:text>, </xsl:text>
+ <xsl:call-template name="person.name"/>
+</xsl:template>
+
+<xsl:template match="othername" mode="titlepage.mode">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="titlepage.mode"/>
+ <br/>
+ </span>
+</xsl:template>
+
+<xsl:template match="pagenums" mode="titlepage.mode">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="titlepage.mode"/>
+ <br/>
+ </span>
+</xsl:template>
+
+<xsl:template match="printhistory" mode="titlepage.mode">
+ <div>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="titlepage.mode"/>
+ </div>
+</xsl:template>
+
+<xsl:template match="productname" mode="titlepage.mode">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="titlepage.mode"/>
+ <br/>
+ </span>
+</xsl:template>
+
+<xsl:template match="productnumber" mode="titlepage.mode">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="titlepage.mode"/>
+ <br/>
+ </span>
+</xsl:template>
+
+<xsl:template match="pubdate" mode="titlepage.mode">
+ <xsl:call-template name="paragraph">
+ <xsl:with-param name="class" select="local-name(.)"/>
+ <xsl:with-param name="content">
+ <xsl:apply-templates mode="titlepage.mode"/>
+ </xsl:with-param>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="publisher" mode="titlepage.mode">
+ <xsl:call-template name="paragraph">
+ <xsl:with-param name="class" select="local-name(.)"/>
+ <xsl:with-param name="content">
+ <xsl:apply-templates mode="titlepage.mode"/>
+ </xsl:with-param>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="publishername" mode="titlepage.mode">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="titlepage.mode"/>
+ <br/>
+ </span>
+</xsl:template>
+
+<xsl:template match="pubsnumber" mode="titlepage.mode">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="titlepage.mode"/>
+ <br/>
+ </span>
+</xsl:template>
+
+<xsl:template match="releaseinfo" mode="titlepage.mode">
+ <xsl:call-template name="paragraph">
+ <xsl:with-param name="class" select="local-name(.)"/>
+ <xsl:with-param name="content">
+ <xsl:apply-templates mode="titlepage.mode"/>
+ </xsl:with-param>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="revhistory" mode="titlepage.mode">
+ <xsl:variable name="numcols">
+ <xsl:choose>
+ <xsl:when test=".//authorinitials|.//author">3</xsl:when>
+ <xsl:otherwise>2</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="id"><xsl:call-template name="object.id"/></xsl:variable>
+
+ <xsl:variable name="title">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key">RevHistory</xsl:with-param>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="contents">
+ <div>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <table border="1" width="100%" summary="Revision history">
+ <tr>
+ <th align="{$direction.align.start}" valign="top" colspan="{$numcols}">
+ <strong xmlns:xslo="http://www.w3.org/1999/XSL/Transform">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'RevHistory'"/>
+ </xsl:call-template>
+ </strong>
+ </th>
+ </tr>
+ <xsl:apply-templates mode="titlepage.mode">
+ <xsl:with-param name="numcols" select="$numcols"/>
+ </xsl:apply-templates>
+ </table>
+ </div>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="$generate.revhistory.link != 0">
+
+ <!-- Compute name of revhistory file -->
+ <xsl:variable name="file">
+ <xsl:call-template name="ln.or.rh.filename">
+ <xsl:with-param name="is.ln" select="false()"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="filename">
+ <xsl:call-template name="make-relative-filename">
+ <xsl:with-param name="base.dir" select="$base.dir"/>
+ <xsl:with-param name="base.name" select="$file"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <a href="{$file}">
+ <xsl:copy-of select="$title"/>
+ </a>
+
+ <xsl:call-template name="write.chunk">
+ <xsl:with-param name="filename" select="$filename"/>
+ <xsl:with-param name="quiet" select="$chunk.quietly"/>
+ <xsl:with-param name="content">
+ <xsl:call-template name="user.preroot"/>
+ <html>
+ <head>
+ <xsl:call-template name="system.head.content"/>
+ <xsl:call-template name="head.content">
+ <xsl:with-param name="title">
+ <xsl:value-of select="$title"/>
+ <xsl:if test="../../title">
+ <xsl:value-of select="concat(' (', ../../title, ')')"/>
+ </xsl:if>
+ </xsl:with-param>
+ </xsl:call-template>
+ <xsl:call-template name="user.head.content"/>
+ </head>
+ <body>
+ <xsl:call-template name="body.attributes"/>
+ <xsl:copy-of select="$contents"/>
+ </body>
+ </html>
+ <xsl:text>
+</xsl:text>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:copy-of select="$contents"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="revhistory/revision" mode="titlepage.mode">
+ <xsl:param name="numcols" select="'3'"/>
+ <xsl:variable name="revnumber" select="revnumber"/>
+ <xsl:variable name="revdate" select="date"/>
+ <xsl:variable name="revauthor" select="authorinitials|author"/>
+ <xsl:variable name="revremark" select="revremark|revdescription"/>
+ <tr>
+ <td align="{$direction.align.start}">
+ <xsl:if test="$revnumber">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'Revision'"/>
+ </xsl:call-template>
+ <xsl:call-template name="gentext.space"/>
+ <xsl:apply-templates select="$revnumber[1]" mode="titlepage.mode"/>
+ </xsl:if>
+ </td>
+ <td align="{$direction.align.start}">
+ <xsl:apply-templates select="$revdate[1]" mode="titlepage.mode"/>
+ </td>
+ <xsl:choose>
+ <xsl:when test="$revauthor">
+ <td align="{$direction.align.start}">
+ <xsl:for-each select="$revauthor">
+ <xsl:apply-templates select="." mode="titlepage.mode"/>
+ <xsl:if test="position() != last()">
+ <xsl:text>, </xsl:text>
+ </xsl:if>
+ </xsl:for-each>
+ </td>
+ </xsl:when>
+ <xsl:when test="$numcols &gt; 2">
+ <td>&#160;</td>
+ </xsl:when>
+ <xsl:otherwise/>
+ </xsl:choose>
+ </tr>
+ <xsl:if test="$revremark">
+ <tr>
+ <td align="{$direction.align.start}" colspan="{$numcols}">
+ <xsl:apply-templates select="$revremark[1]" mode="titlepage.mode"/>
+ </td>
+ </tr>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="revision/revnumber" mode="titlepage.mode">
+ <xsl:apply-templates mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="revision/date" mode="titlepage.mode">
+ <xsl:apply-templates mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="revision/authorinitials" mode="titlepage.mode">
+ <xsl:apply-templates mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="revision/author" mode="titlepage.mode">
+ <xsl:apply-templates mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="revision/revremark" mode="titlepage.mode">
+ <xsl:apply-templates mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="revision/revdescription" mode="titlepage.mode">
+ <xsl:apply-templates mode="titlepage.mode"/>
+</xsl:template>
+
+<xsl:template match="seriesvolnums" mode="titlepage.mode">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="titlepage.mode"/>
+ <br/>
+ </span>
+</xsl:template>
+
+<xsl:template match="shortaffil" mode="titlepage.mode">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="titlepage.mode"/>
+ <br/>
+ </span>
+</xsl:template>
+
+<xsl:template match="subjectset" mode="titlepage.mode">
+</xsl:template>
+
+<xsl:template match="subtitle" mode="titlepage.mode">
+ <h2>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="titlepage.mode"/>
+ </h2>
+</xsl:template>
+
+<xsl:template match="surname" mode="titlepage.mode">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="titlepage.mode"/>
+ <br/>
+ </span>
+</xsl:template>
+
+<xsl:template match="title" mode="titlepage.mode">
+ <xsl:variable name="id">
+ <xsl:choose>
+ <!-- if title is in an *info wrapper, get the grandparent -->
+ <xsl:when test="contains(local-name(..), 'info')">
+ <xsl:call-template name="object.id">
+ <xsl:with-param name="object" select="../.."/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="object.id">
+ <xsl:with-param name="object" select=".."/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <h1>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:if test="$generate.id.attributes = 0">
+ <a id="{$id}"/>
+ </xsl:if>
+ <xsl:choose>
+ <xsl:when test="$show.revisionflag != 0 and @revisionflag">
+ <span class="{@revisionflag}">
+ <xsl:apply-templates mode="titlepage.mode"/>
+ </span>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates mode="titlepage.mode"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </h1>
+</xsl:template>
+
+<xsl:template match="titleabbrev" mode="titlepage.mode">
+ <!-- nop; title abbreviations don't belong on the title page! -->
+</xsl:template>
+
+<xsl:template match="volumenum" mode="titlepage.mode">
+ <span>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates mode="titlepage.mode"/>
+ <br/>
+ </span>
+</xsl:template>
+
+<!-- This template computes the filename for legalnotice and revhistory chunks -->
+<xsl:template name="ln.or.rh.filename">
+ <xsl:param name="node" select="."/>
+ <xsl:param name="is.ln" select="true()"/>
+
+ <xsl:variable name="dbhtml-filename">
+ <xsl:call-template name="pi.dbhtml_filename">
+ <xsl:with-param name="node" select="$node"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:choose>
+ <!-- 1. If there is a dbhtml_filename PI, use that -->
+ <xsl:when test="$dbhtml-filename != ''">
+ <xsl:value-of select="$dbhtml-filename"/>
+ </xsl:when>
+ <xsl:when test="($node/@id or $node/@xml:id) and not($use.id.as.filename = 0)">
+ <!-- * 2. If this legalnotice/revhistory has an ID, then go ahead and use -->
+ <!-- * just the value of that ID as the basename for the file -->
+ <!-- * (that is, without prepending an "ln-" or "rh-" to it) -->
+ <xsl:value-of select="($node/@id|$node/@xml:id)[1]"/>
+ <xsl:value-of select="$html.ext"/>
+ </xsl:when>
+ <xsl:when test="not ($node/@id or $node/@xml:id) or $use.id.as.filename = 0">
+ <!-- * 3. Otherwise, if this legalnotice/revhistory does not have an ID, or -->
+ <!-- * if $use.id.as.filename = 0 -->
+ <!-- * then we generate an ID... -->
+ <xsl:variable name="id">
+ <xsl:value-of select="generate-id($node)"/>
+ </xsl:variable>
+ <!-- * ...and then we take that generated ID, prepend a -->
+ <!-- * prefix to it, and use that as the basename for the file -->
+ <xsl:choose>
+ <xsl:when test="$is.ln">
+ <xsl:value-of select="concat('ln-',$id,$html.ext)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="concat('rh-',$id,$html.ext)"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/toc.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/toc.xsl
new file mode 100644
index 0000000..92b7b14
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/toc.xsl
@@ -0,0 +1,330 @@
+<?xml version="1.0" encoding="ASCII"?>
+<!--This file was created automatically by html2xhtml-->
+<!--from the HTML stylesheets.-->
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1999/xhtml" version="1.0">
+
+<!-- ********************************************************************
+ $Id: toc.xsl 8421 2009-05-04 07:49:49Z bobstayton $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<!-- ==================================================================== -->
+
+<xsl:template match="set/toc | book/toc | part/toc">
+ <xsl:variable name="toc.params">
+ <xsl:call-template name="find.path.params">
+ <xsl:with-param name="node" select="parent::*"/>
+ <xsl:with-param name="table" select="normalize-space($generate.toc)"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <!-- Do not output the toc element if one is already generated
+ by the use of $generate.toc parameter, or if
+ generating a source toc is turned off -->
+ <xsl:if test="not(contains($toc.params, 'toc')) and ($process.source.toc != 0 or $process.empty.source.toc != 0)">
+ <xsl:variable name="content">
+ <xsl:choose>
+ <xsl:when test="* and $process.source.toc != 0">
+ <xsl:apply-templates/>
+ </xsl:when>
+ <xsl:when test="count(*) = 0 and $process.empty.source.toc != 0">
+ <!-- trick to switch context node to parent element -->
+ <xsl:for-each select="parent::*">
+ <xsl:choose>
+ <xsl:when test="self::set">
+ <xsl:call-template name="set.toc">
+ <xsl:with-param name="toc.title.p" select="contains($toc.params, 'title')"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="self::book">
+ <xsl:call-template name="division.toc">
+ <xsl:with-param name="toc.title.p" select="contains($toc.params, 'title')"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="self::part">
+ <xsl:call-template name="division.toc">
+ <xsl:with-param name="toc.title.p" select="contains($toc.params, 'title')"/>
+ </xsl:call-template>
+ </xsl:when>
+ </xsl:choose>
+ </xsl:for-each>
+ </xsl:when>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:if test="string-length(normalize-space($content)) != 0">
+ <xsl:copy-of select="$content"/>
+ </xsl:if>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="chapter/toc | appendix/toc | preface/toc | article/toc">
+ <xsl:variable name="toc.params">
+ <xsl:call-template name="find.path.params">
+ <xsl:with-param name="node" select="parent::*"/>
+ <xsl:with-param name="table" select="normalize-space($generate.toc)"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <!-- Do not output the toc element if one is already generated
+ by the use of $generate.toc parameter, or if
+ generating a source toc is turned off -->
+ <xsl:if test="not(contains($toc.params, 'toc')) and ($process.source.toc != 0 or $process.empty.source.toc != 0)">
+ <xsl:choose>
+ <xsl:when test="* and $process.source.toc != 0">
+ <div>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates select="title"/>
+ <dl>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates select="*[not(self::title)]"/>
+ </dl>
+ </div>
+ <xsl:call-template name="component.toc.separator"/>
+ </xsl:when>
+ <xsl:when test="count(*) = 0 and $process.empty.source.toc != 0">
+ <!-- trick to switch context node to section element -->
+ <xsl:for-each select="parent::*">
+ <xsl:call-template name="component.toc">
+ <xsl:with-param name="toc.title.p" select="contains($toc.params, 'title')"/>
+ </xsl:call-template>
+ </xsl:for-each>
+ <xsl:call-template name="component.toc.separator"/>
+ </xsl:when>
+ </xsl:choose>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="section/toc |sect1/toc |sect2/toc |sect3/toc |sect4/toc |sect5/toc">
+
+ <xsl:variable name="toc.params">
+ <xsl:call-template name="find.path.params">
+ <xsl:with-param name="node" select="parent::*"/>
+ <xsl:with-param name="table" select="normalize-space($generate.toc)"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <!-- Do not output the toc element if one is already generated
+ by the use of $generate.toc parameter, or if
+ generating a source toc is turned off -->
+ <xsl:if test="not(contains($toc.params, 'toc')) and ($process.source.toc != 0 or $process.empty.source.toc != 0)">
+ <xsl:choose>
+ <xsl:when test="* and $process.source.toc != 0">
+ <div>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates select="title"/>
+ <dl>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates select="*[not(self::title)]"/>
+ </dl>
+ </div>
+ <xsl:call-template name="section.toc.separator"/>
+ </xsl:when>
+ <xsl:when test="count(*) = 0 and $process.empty.source.toc != 0">
+ <!-- trick to switch context node to section element -->
+ <xsl:for-each select="parent::*">
+ <xsl:call-template name="section.toc">
+ <xsl:with-param name="toc.title.p" select="contains($toc.params, 'title')"/>
+ </xsl:call-template>
+ </xsl:for-each>
+ <xsl:call-template name="section.toc.separator"/>
+ </xsl:when>
+ </xsl:choose>
+ </xsl:if>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="tocpart|tocchap |toclevel1|toclevel2|toclevel3|toclevel4|toclevel5">
+ <xsl:variable name="sub-toc">
+ <xsl:if test="tocchap|toclevel1|toclevel2|toclevel3|toclevel4|toclevel5">
+ <xsl:choose>
+ <xsl:when test="$toc.list.type = 'dl'">
+ <dd>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:element name="{$toc.list.type}" namespace="http://www.w3.org/1999/xhtml">
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates select="tocchap|toclevel1|toclevel2| toclevel3|toclevel4|toclevel5"/>
+ </xsl:element>
+ </dd>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:element name="{$toc.list.type}" namespace="http://www.w3.org/1999/xhtml">
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates select="tocchap|toclevel1|toclevel2| toclevel3|toclevel4|toclevel5"/>
+ </xsl:element>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:if>
+ </xsl:variable>
+
+ <xsl:apply-templates select="tocentry[position() != last()]"/>
+
+ <xsl:choose>
+ <xsl:when test="$toc.list.type = 'dl'">
+ <dt>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates select="tocentry[position() = last()]"/>
+ </dt>
+ <xsl:copy-of select="$sub-toc"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <li>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates select="tocentry[position() = last()]"/>
+ <xsl:copy-of select="$sub-toc"/>
+ </li>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="tocentry|tocdiv|lotentry|tocfront|tocback">
+ <xsl:choose>
+ <xsl:when test="$toc.list.type = 'dl'">
+ <dt>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:call-template name="tocentry-content"/>
+ </dt>
+ </xsl:when>
+ <xsl:otherwise>
+ <li>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:call-template name="tocentry-content"/>
+ </li>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="tocentry[position() = last()]" priority="2">
+ <xsl:call-template name="tocentry-content"/>
+</xsl:template>
+
+<xsl:template name="tocentry-content">
+ <xsl:variable name="targets" select="key('id',@linkend)"/>
+ <xsl:variable name="target" select="$targets[1]"/>
+
+ <xsl:choose>
+ <xsl:when test="@linkend">
+ <xsl:call-template name="check.id.unique">
+ <xsl:with-param name="linkend" select="@linkend"/>
+ </xsl:call-template>
+ <a>
+ <xsl:attribute name="href">
+ <xsl:call-template name="href.target">
+ <xsl:with-param name="object" select="$target"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:apply-templates/>
+ </a>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="toc/title">
+ <div>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates/>
+ </div>
+</xsl:template>
+
+<xsl:template match="toc/subtitle">
+ <div>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates/>
+ </div>
+</xsl:template>
+
+<xsl:template match="toc/titleabbrev">
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<!-- A lot element must have content, because there is no attribute
+ to select what kind of list should be generated -->
+<xsl:template match="book/lot | part/lot">
+ <!-- Don't generate a page sequence unless there is content -->
+ <xsl:variable name="content">
+ <xsl:choose>
+ <xsl:when test="* and $process.source.toc != 0">
+ <div>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates/>
+ </div>
+ </xsl:when>
+ <xsl:when test="not(child::*) and $process.empty.source.toc != 0">
+ <xsl:call-template name="process.empty.lot"/>
+ </xsl:when>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:if test="string-length(normalize-space($content)) != 0">
+ <xsl:copy-of select="$content"/>
+ </xsl:if>
+</xsl:template>
+
+<xsl:template match="chapter/lot | appendix/lot | preface/lot | article/lot">
+ <xsl:choose>
+ <xsl:when test="* and $process.source.toc != 0">
+ <div>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates/>
+ </div>
+ <xsl:call-template name="component.toc.separator"/>
+ </xsl:when>
+ <xsl:when test="not(child::*) and $process.empty.source.toc != 0">
+ <xsl:call-template name="process.empty.lot"/>
+ </xsl:when>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="section/lot |sect1/lot |sect2/lot |sect3/lot |sect4/lot |sect5/lot">
+ <xsl:choose>
+ <xsl:when test="* and $process.source.toc != 0">
+ <div>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates/>
+ </div>
+ <xsl:call-template name="section.toc.separator"/>
+ </xsl:when>
+ <xsl:when test="not(child::*) and $process.empty.source.toc != 0">
+ <xsl:call-template name="process.empty.lot"/>
+ </xsl:when>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="process.empty.lot">
+ <!-- An empty lot element does not provide any information to indicate
+ what should be included in it. You can customize this
+ template to generate a lot based on @role or something -->
+ <xsl:message>
+ <xsl:text>Warning: don't know what to generate for </xsl:text>
+ <xsl:text>lot that has no children.</xsl:text>
+ </xsl:message>
+</xsl:template>
+
+<xsl:template match="lot/title">
+ <div>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates/>
+ </div>
+</xsl:template>
+
+<xsl:template match="lot/subtitle">
+ <div>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates/>
+ </div>
+</xsl:template>
+
+<xsl:template match="lot/titleabbrev">
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/verbatim.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/verbatim.xsl
new file mode 100644
index 0000000..c0bc69d
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/verbatim.xsl
@@ -0,0 +1,388 @@
+<?xml version="1.0" encoding="ASCII"?>
+<!--This file was created automatically by html2xhtml-->
+<!--from the HTML stylesheets.-->
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:sverb="http://nwalsh.com/xslt/ext/com.nwalsh.saxon.Verbatim" xmlns:xverb="xalan://com.nwalsh.xalan.Verbatim" xmlns:lxslt="http://xml.apache.org/xslt" xmlns:exsl="http://exslt.org/common" xmlns="http://www.w3.org/1999/xhtml" exclude-result-prefixes="sverb xverb lxslt exsl" version="1.0">
+
+<!-- ********************************************************************
+ $Id: verbatim.xsl 8807 2010-08-09 18:57:41Z bobstayton $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<!-- XSLTHL highlighting is turned off by default. See highlighting/README
+ for instructions on how to turn on XSLTHL -->
+<xsl:template name="apply-highlighting">
+ <xsl:apply-templates/>
+</xsl:template>
+
+<lxslt:component prefix="xverb" functions="numberLines"/>
+
+<xsl:template match="programlisting|screen|synopsis">
+ <xsl:param name="suppress-numbers" select="'0'"/>
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+
+ <xsl:call-template name="anchor"/>
+
+ <xsl:variable name="div.element">
+ <xsl:choose>
+ <xsl:when test="$make.clean.html != 0">div</xsl:when>
+ <xsl:otherwise>pre</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:if test="$shade.verbatim != 0">
+ <xsl:message>
+ <xsl:text>The shade.verbatim parameter is deprecated. </xsl:text>
+ <xsl:text>Use CSS instead,</xsl:text>
+ </xsl:message>
+ <xsl:message>
+ <xsl:text>for example: pre.</xsl:text>
+ <xsl:value-of select="local-name(.)"/>
+ <xsl:text> { background-color: #E0E0E0; }</xsl:text>
+ </xsl:message>
+ </xsl:if>
+
+ <xsl:choose>
+ <xsl:when test="$suppress-numbers = '0' and @linenumbering = 'numbered' and $use.extensions != '0' and $linenumbering.extension != '0'">
+ <xsl:variable name="rtf">
+ <xsl:choose>
+ <xsl:when test="$highlight.source != 0">
+ <xsl:call-template name="apply-highlighting"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:element name="{$div.element}" namespace="http://www.w3.org/1999/xhtml">
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:if test="@width != ''">
+ <xsl:attribute name="width">
+ <xsl:value-of select="@width"/>
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:call-template name="number.rtf.lines">
+ <xsl:with-param name="rtf" select="$rtf"/>
+ </xsl:call-template>
+ </xsl:element>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:element name="{$div.element}" namespace="http://www.w3.org/1999/xhtml">
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:if test="@width != ''">
+ <xsl:attribute name="width">
+ <xsl:value-of select="@width"/>
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:choose>
+ <xsl:when test="$highlight.source != 0">
+ <xsl:call-template name="apply-highlighting"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:element>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="literallayout">
+ <xsl:param name="suppress-numbers" select="'0'"/>
+
+ <xsl:variable name="rtf">
+ <xsl:apply-templates/>
+ </xsl:variable>
+
+ <xsl:if test="$shade.verbatim != 0 and @class='monospaced'">
+ <xsl:message>
+ <xsl:text>The shade.verbatim parameter is deprecated. </xsl:text>
+ <xsl:text>Use CSS instead,</xsl:text>
+ </xsl:message>
+ <xsl:message>
+ <xsl:text>for example: pre.</xsl:text>
+ <xsl:value-of select="local-name(.)"/>
+ <xsl:text> { background-color: #E0E0E0; }</xsl:text>
+ </xsl:message>
+ </xsl:if>
+
+ <xsl:choose>
+ <xsl:when test="$suppress-numbers = '0' and @linenumbering = 'numbered' and $use.extensions != '0' and $linenumbering.extension != '0'">
+ <xsl:choose>
+ <xsl:when test="@class='monospaced'">
+ <pre>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:call-template name="number.rtf.lines">
+ <xsl:with-param name="rtf" select="$rtf"/>
+ </xsl:call-template>
+ </pre>
+ </xsl:when>
+ <xsl:otherwise>
+ <div>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <p>
+ <xsl:call-template name="number.rtf.lines">
+ <xsl:with-param name="rtf" select="$rtf"/>
+ </xsl:call-template>
+ </p>
+ </div>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:choose>
+ <xsl:when test="@class='monospaced'">
+ <pre>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:copy-of select="$rtf"/>
+ </pre>
+ </xsl:when>
+ <xsl:otherwise>
+ <div>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <p>
+ <xsl:call-template name="make-verbatim">
+ <xsl:with-param name="rtf" select="$rtf"/>
+ </xsl:call-template>
+ </p>
+ </div>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="address">
+ <xsl:param name="suppress-numbers" select="'0'"/>
+
+ <xsl:variable name="rtf">
+ <xsl:apply-templates/>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="$suppress-numbers = '0' and @linenumbering = 'numbered' and $use.extensions != '0' and $linenumbering.extension != '0'">
+ <div>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <p>
+ <xsl:call-template name="number.rtf.lines">
+ <xsl:with-param name="rtf" select="$rtf"/>
+ </xsl:call-template>
+ </p>
+ </div>
+ </xsl:when>
+
+ <xsl:otherwise>
+ <div>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <p>
+ <xsl:call-template name="make-verbatim">
+ <xsl:with-param name="rtf" select="$rtf"/>
+ </xsl:call-template>
+ </p>
+ </div>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="number.rtf.lines">
+ <xsl:param name="rtf" select="''"/>
+ <xsl:param name="pi.context" select="."/>
+
+ <!-- Save the global values -->
+ <xsl:variable name="global.linenumbering.everyNth" select="$linenumbering.everyNth"/>
+
+ <xsl:variable name="global.linenumbering.separator" select="$linenumbering.separator"/>
+
+ <xsl:variable name="global.linenumbering.width" select="$linenumbering.width"/>
+
+ <!-- Extract the <?dbhtml linenumbering.*?> PI values -->
+ <xsl:variable name="pi.linenumbering.everyNth">
+ <xsl:call-template name="pi.dbhtml_linenumbering.everyNth">
+ <xsl:with-param name="node" select="$pi.context"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="pi.linenumbering.separator">
+ <xsl:call-template name="pi.dbhtml_linenumbering.separator">
+ <xsl:with-param name="node" select="$pi.context"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="pi.linenumbering.width">
+ <xsl:call-template name="pi.dbhtml_linenumbering.width">
+ <xsl:with-param name="node" select="$pi.context"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <!-- Construct the 'in-context' values -->
+ <xsl:variable name="linenumbering.everyNth">
+ <xsl:choose>
+ <xsl:when test="$pi.linenumbering.everyNth != ''">
+ <xsl:value-of select="$pi.linenumbering.everyNth"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$global.linenumbering.everyNth"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="linenumbering.separator">
+ <xsl:choose>
+ <xsl:when test="$pi.linenumbering.separator != ''">
+ <xsl:value-of select="$pi.linenumbering.separator"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$global.linenumbering.separator"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="linenumbering.width">
+ <xsl:choose>
+ <xsl:when test="$pi.linenumbering.width != ''">
+ <xsl:value-of select="$pi.linenumbering.width"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$global.linenumbering.width"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="linenumbering.startinglinenumber">
+ <xsl:choose>
+ <xsl:when test="$pi.context/@startinglinenumber">
+ <xsl:value-of select="$pi.context/@startinglinenumber"/>
+ </xsl:when>
+ <xsl:when test="$pi.context/@continuation='continues'">
+ <xsl:variable name="lastLine">
+ <xsl:choose>
+ <xsl:when test="$pi.context/self::programlisting">
+ <xsl:call-template name="lastLineNumber">
+ <xsl:with-param name="listings" select="preceding::programlisting[@linenumbering='numbered']"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="$pi.context/self::screen">
+ <xsl:call-template name="lastLineNumber">
+ <xsl:with-param name="listings" select="preceding::screen[@linenumbering='numbered']"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="$pi.context/self::literallayout">
+ <xsl:call-template name="lastLineNumber">
+ <xsl:with-param name="listings" select="preceding::literallayout[@linenumbering='numbered']"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="$pi.context/self::address">
+ <xsl:call-template name="lastLineNumber">
+ <xsl:with-param name="listings" select="preceding::address[@linenumbering='numbered']"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="$pi.context/self::synopsis">
+ <xsl:call-template name="lastLineNumber">
+ <xsl:with-param name="listings" select="preceding::synopsis[@linenumbering='numbered']"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:message>
+ <xsl:text>Unexpected verbatim environment: </xsl:text>
+ <xsl:value-of select="local-name($pi.context)"/>
+ </xsl:message>
+ <xsl:value-of select="0"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:value-of select="$lastLine + 1"/>
+ </xsl:when>
+ <xsl:otherwise>1</xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="function-available('sverb:numberLines')">
+ <xsl:copy-of select="sverb:numberLines($rtf)"/>
+ </xsl:when>
+ <xsl:when test="function-available('xverb:numberLines')">
+ <xsl:copy-of select="xverb:numberLines($rtf)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:message terminate="yes">
+ <xsl:text>No numberLines function available.</xsl:text>
+ </xsl:message>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="make-verbatim">
+ <xsl:param name="rtf"/>
+
+ <!-- I want to make this RTF verbatim. There are two possibilities: either
+ I have access to the exsl:node-set extension function and I can "do it right"
+ or I have to rely on CSS. -->
+
+ <xsl:choose>
+ <xsl:when test="$exsl.node.set.available != 0">
+ <xsl:apply-templates select="exsl:node-set($rtf)" mode="make.verbatim.mode"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <span style="white-space: pre;">
+ <xsl:copy-of select="$rtf"/>
+ </span>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ======================================================================== -->
+
+<xsl:template name="lastLineNumber">
+ <xsl:param name="listings"/>
+ <xsl:param name="number" select="0"/>
+
+ <xsl:variable name="lines">
+ <xsl:call-template name="countLines">
+ <xsl:with-param name="listing" select="string($listings[1])"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="not($listings)">
+ <xsl:value-of select="$number"/>
+ </xsl:when>
+ <xsl:when test="$listings[1]/@startinglinenumber">
+ <xsl:value-of select="$number + $listings[1]/@startinglinenumber + $lines - 1"/>
+ </xsl:when>
+ <xsl:when test="$listings[1]/@continuation='continues'">
+ <xsl:call-template name="lastLineNumber">
+ <xsl:with-param name="listings" select="listings[position() &gt; 1]"/>
+ <xsl:with-param name="number" select="$number + $lines"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$lines"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="countLines">
+ <xsl:param name="listing"/>
+ <xsl:param name="count" select="1"/>
+
+ <xsl:choose>
+ <xsl:when test="contains($listing, '&#10;')">
+ <xsl:call-template name="countLines">
+ <xsl:with-param name="listing" select="substring-after($listing, '&#10;')"/>
+ <xsl:with-param name="count" select="$count + 1"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$count"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/xref.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/xref.xsl
new file mode 100644
index 0000000..74c6f20
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docbook-xsl-1.76.1/xhtml/xref.xsl
@@ -0,0 +1,1316 @@
+<?xml version="1.0" encoding="ASCII"?>
+<!--This file was created automatically by html2xhtml-->
+<!--from the HTML stylesheets.-->
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:suwl="http://nwalsh.com/xslt/ext/com.nwalsh.saxon.UnwrapLinks" xmlns:exsl="http://exslt.org/common" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/1999/xhtml" exclude-result-prefixes="suwl exsl xlink" version="1.0">
+
+<!-- ********************************************************************
+ $Id: xref.xsl 8421 2009-05-04 07:49:49Z bobstayton $
+ ********************************************************************
+
+ This file is part of the XSL DocBook Stylesheet distribution.
+ See ../README or http://docbook.sf.net/release/xsl/current/ for
+ copyright and other information.
+
+ ******************************************************************** -->
+
+<!-- Use internal variable for olink xlink role for consistency -->
+<xsl:variable name="xolink.role">http://docbook.org/xlink/role/olink</xsl:variable>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="anchor">
+ <xsl:call-template name="anchor"/>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="xref" name="xref">
+ <xsl:param name="xhref" select="@xlink:href"/>
+ <!-- is the @xlink:href a local idref link? -->
+ <xsl:param name="xlink.idref">
+ <xsl:if test="starts-with($xhref,'#') and (not(contains($xhref,'(')) or starts-with($xhref, '#xpointer(id('))">
+ <xsl:call-template name="xpointer.idref">
+ <xsl:with-param name="xpointer" select="$xhref"/>
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:param>
+ <xsl:param name="xlink.targets" select="key('id',$xlink.idref)"/>
+ <xsl:param name="linkend.targets" select="key('id',@linkend)"/>
+ <xsl:param name="target" select="($xlink.targets | $linkend.targets)[1]"/>
+
+ <xsl:variable name="xrefstyle">
+ <xsl:choose>
+ <xsl:when test="@role and not(@xrefstyle) and $use.role.as.xrefstyle != 0">
+ <xsl:value-of select="@role"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="@xrefstyle"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:call-template name="anchor"/>
+
+ <xsl:variable name="content">
+ <xsl:choose>
+
+ <xsl:when test="@endterm">
+ <xsl:variable name="etargets" select="key('id',@endterm)"/>
+ <xsl:variable name="etarget" select="$etargets[1]"/>
+ <xsl:choose>
+ <xsl:when test="count($etarget) = 0">
+ <xsl:message>
+ <xsl:value-of select="count($etargets)"/>
+ <xsl:text>Endterm points to nonexistent ID: </xsl:text>
+ <xsl:value-of select="@endterm"/>
+ </xsl:message>
+ <xsl:text>???</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="$etarget" mode="endterm"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+
+ <xsl:when test="$target/@xreflabel">
+ <xsl:call-template name="xref.xreflabel">
+ <xsl:with-param name="target" select="$target"/>
+ </xsl:call-template>
+ </xsl:when>
+
+ <xsl:when test="$target">
+ <xsl:if test="not(parent::citation)">
+ <xsl:apply-templates select="$target" mode="xref-to-prefix"/>
+ </xsl:if>
+
+ <xsl:apply-templates select="$target" mode="xref-to">
+ <xsl:with-param name="referrer" select="."/>
+ <xsl:with-param name="xrefstyle" select="$xrefstyle"/>
+ </xsl:apply-templates>
+
+ <xsl:if test="not(parent::citation)">
+ <xsl:apply-templates select="$target" mode="xref-to-suffix"/>
+ </xsl:if>
+ </xsl:when>
+
+ <xsl:otherwise>
+ <xsl:message>
+ <xsl:text>ERROR: xref linking to </xsl:text>
+ <xsl:value-of select="@linkend|@xlink:href"/>
+ <xsl:text> has no generated link text.</xsl:text>
+ </xsl:message>
+ <xsl:text>???</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:call-template name="simple.xlink">
+ <xsl:with-param name="content" select="$content"/>
+ </xsl:call-template>
+
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<!-- biblioref handled largely like an xref -->
+<!-- To be done: add support for begin, end, and units attributes -->
+<xsl:template match="biblioref">
+ <xsl:variable name="targets" select="key('id',@linkend)"/>
+ <xsl:variable name="target" select="$targets[1]"/>
+ <xsl:variable name="refelem" select="local-name($target)"/>
+
+ <xsl:call-template name="check.id.unique">
+ <xsl:with-param name="linkend" select="@linkend"/>
+ </xsl:call-template>
+
+ <xsl:call-template name="anchor"/>
+
+ <xsl:choose>
+ <xsl:when test="count($target) = 0">
+ <xsl:message>
+ <xsl:text>XRef to nonexistent id: </xsl:text>
+ <xsl:value-of select="@linkend"/>
+ </xsl:message>
+ <xsl:text>???</xsl:text>
+ </xsl:when>
+
+ <xsl:when test="@endterm">
+ <xsl:variable name="href">
+ <xsl:call-template name="href.target">
+ <xsl:with-param name="object" select="$target"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="etargets" select="key('id',@endterm)"/>
+ <xsl:variable name="etarget" select="$etargets[1]"/>
+ <xsl:choose>
+ <xsl:when test="count($etarget) = 0">
+ <xsl:message>
+ <xsl:value-of select="count($etargets)"/>
+ <xsl:text>Endterm points to nonexistent ID: </xsl:text>
+ <xsl:value-of select="@endterm"/>
+ </xsl:message>
+ <a href="{$href}">
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:text>???</xsl:text>
+ </a>
+ </xsl:when>
+ <xsl:otherwise>
+ <a href="{$href}">
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:apply-templates select="$etarget" mode="endterm"/>
+ </a>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+
+ <xsl:when test="$target/@xreflabel">
+ <a>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:attribute name="href">
+ <xsl:call-template name="href.target">
+ <xsl:with-param name="object" select="$target"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:call-template name="xref.xreflabel">
+ <xsl:with-param name="target" select="$target"/>
+ </xsl:call-template>
+ </a>
+ </xsl:when>
+
+ <xsl:otherwise>
+ <xsl:variable name="href">
+ <xsl:call-template name="href.target">
+ <xsl:with-param name="object" select="$target"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:if test="not(parent::citation)">
+ <xsl:apply-templates select="$target" mode="xref-to-prefix"/>
+ </xsl:if>
+
+ <a href="{$href}">
+ <xsl:apply-templates select="." mode="class.attribute"/>
+ <xsl:if test="$target/title or $target/*/title">
+ <xsl:attribute name="title">
+ <xsl:apply-templates select="$target" mode="xref-title"/>
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:apply-templates select="$target" mode="xref-to">
+ <xsl:with-param name="referrer" select="."/>
+ <xsl:with-param name="xrefstyle">
+ <xsl:choose>
+ <xsl:when test="@role and not(@xrefstyle) and $use.role.as.xrefstyle != 0">
+ <xsl:value-of select="@role"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="@xrefstyle"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:with-param>
+ </xsl:apply-templates>
+ </a>
+
+ <xsl:if test="not(parent::citation)">
+ <xsl:apply-templates select="$target" mode="xref-to-suffix"/>
+ </xsl:if>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="*" mode="endterm">
+ <!-- Process the children of the endterm element -->
+ <xsl:variable name="endterm">
+ <xsl:apply-templates select="child::node()"/>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="$exsl.node.set.available != 0">
+ <xsl:apply-templates select="exsl:node-set($endterm)" mode="remove-ids"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:copy-of select="$endterm"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="*" mode="remove-ids">
+ <xsl:choose>
+ <!-- handle html or xhtml -->
+ <xsl:when test="local-name(.) = 'a' and (namespace-uri(.) = '' or namespace-uri(.) = 'http://www.w3.org/1999/xhtml')">
+ <xsl:choose>
+ <xsl:when test="(@name and count(@*) = 1) or (@id and count(@*) = 1) or (@xml:id and count(@*) = 1) or (@xml:id and @name and count(@*) = 2) or (@id and @name and count(@*) = 2)">
+ <xsl:message>suppress anchor</xsl:message>
+ <!-- suppress the whole thing -->
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:copy>
+ <xsl:for-each select="@*">
+ <xsl:choose>
+ <xsl:when test="local-name(.) != 'name' and local-name(.) != 'id'">
+ <xsl:copy/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:message>removing <xsl:value-of select="local-name(.)"/></xsl:message>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:for-each>
+ </xsl:copy>
+ <xsl:apply-templates mode="remove-ids"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:copy>
+ <xsl:for-each select="@*">
+ <xsl:choose>
+ <xsl:when test="local-name(.) != 'id'">
+ <xsl:copy/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:message>removing <xsl:value-of select="local-name(.)"/></xsl:message>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:for-each>
+ <xsl:apply-templates mode="remove-ids"/>
+ </xsl:copy>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="*" mode="xref-to-prefix"/>
+<xsl:template match="*" mode="xref-to-suffix"/>
+
+<xsl:template match="*" mode="xref-to">
+ <xsl:param name="referrer"/>
+ <xsl:param name="xrefstyle"/>
+ <xsl:param name="verbose" select="1"/>
+
+ <xsl:if test="$verbose">
+ <xsl:message>
+ <xsl:text>Don't know what gentext to create for xref to: "</xsl:text>
+ <xsl:value-of select="name(.)"/>
+ <xsl:text>", ("</xsl:text>
+ <xsl:value-of select="(@id|@xml:id)[1]"/>
+ <xsl:text>")</xsl:text>
+ </xsl:message>
+ </xsl:if>
+ <xsl:text>???</xsl:text>
+</xsl:template>
+
+<xsl:template match="title" mode="xref-to">
+ <xsl:param name="referrer"/>
+ <xsl:param name="xrefstyle"/>
+ <xsl:param name="verbose" select="1"/>
+
+ <!-- if you xref to a title, xref to the parent... -->
+ <xsl:choose>
+ <!-- FIXME: how reliable is this? -->
+ <xsl:when test="contains(local-name(parent::*), 'info')">
+ <xsl:apply-templates select="parent::*[2]" mode="xref-to">
+ <xsl:with-param name="referrer" select="$referrer"/>
+ <xsl:with-param name="xrefstyle" select="$xrefstyle"/>
+ <xsl:with-param name="verbose" select="$verbose"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="parent::*" mode="xref-to">
+ <xsl:with-param name="referrer" select="$referrer"/>
+ <xsl:with-param name="xrefstyle" select="$xrefstyle"/>
+ <xsl:with-param name="verbose" select="$verbose"/>
+ </xsl:apply-templates>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="abstract|authorblurb|personblurb|bibliodiv|bibliomset |biblioset|blockquote|calloutlist|caution|colophon |constraintdef|formalpara|glossdiv|important|indexdiv |itemizedlist|legalnotice|lot|msg|msgexplan|msgmain |msgrel|msgset|msgsub|note|orderedlist|partintro |productionset|qandadiv|refsynopsisdiv|segmentedlist |set|setindex|sidebar|tip|toc|variablelist|warning" mode="xref-to">
+ <xsl:param name="referrer"/>
+ <xsl:param name="xrefstyle"/>
+ <xsl:param name="verbose" select="1"/>
+
+ <!-- catch-all for things with (possibly optional) titles -->
+ <xsl:apply-templates select="." mode="object.xref.markup">
+ <xsl:with-param name="purpose" select="'xref'"/>
+ <xsl:with-param name="xrefstyle" select="$xrefstyle"/>
+ <xsl:with-param name="referrer" select="$referrer"/>
+ <xsl:with-param name="verbose" select="$verbose"/>
+ </xsl:apply-templates>
+</xsl:template>
+
+<xsl:template match="author|editor|othercredit|personname" mode="xref-to">
+ <xsl:param name="referrer"/>
+ <xsl:param name="xrefstyle"/>
+
+ <xsl:call-template name="person.name"/>
+</xsl:template>
+
+<xsl:template match="authorgroup" mode="xref-to">
+ <xsl:param name="referrer"/>
+ <xsl:param name="xrefstyle"/>
+
+ <xsl:call-template name="person.name.list"/>
+</xsl:template>
+
+<xsl:template match="figure|example|table|equation" mode="xref-to">
+ <xsl:param name="referrer"/>
+ <xsl:param name="xrefstyle"/>
+ <xsl:param name="verbose" select="1"/>
+
+ <xsl:apply-templates select="." mode="object.xref.markup">
+ <xsl:with-param name="purpose" select="'xref'"/>
+ <xsl:with-param name="xrefstyle" select="$xrefstyle"/>
+ <xsl:with-param name="referrer" select="$referrer"/>
+ <xsl:with-param name="verbose" select="$verbose"/>
+ </xsl:apply-templates>
+</xsl:template>
+
+<xsl:template match="procedure" mode="xref-to">
+ <xsl:param name="referrer"/>
+ <xsl:param name="xrefstyle"/>
+ <xsl:param name="verbose"/>
+
+ <xsl:apply-templates select="." mode="object.xref.markup">
+ <xsl:with-param name="purpose" select="'xref'"/>
+ <xsl:with-param name="xrefstyle" select="$xrefstyle"/>
+ <xsl:with-param name="referrer" select="$referrer"/>
+ <xsl:with-param name="verbose" select="$verbose"/>
+ </xsl:apply-templates>
+</xsl:template>
+
+<xsl:template match="task" mode="xref-to">
+ <xsl:param name="referrer"/>
+ <xsl:param name="xrefstyle"/>
+ <xsl:param name="verbose"/>
+
+ <xsl:apply-templates select="." mode="object.xref.markup">
+ <xsl:with-param name="purpose" select="'xref'"/>
+ <xsl:with-param name="xrefstyle" select="$xrefstyle"/>
+ <xsl:with-param name="referrer" select="$referrer"/>
+ <xsl:with-param name="verbose" select="$verbose"/>
+ </xsl:apply-templates>
+</xsl:template>
+
+<xsl:template match="cmdsynopsis" mode="xref-to">
+ <xsl:apply-templates select="(.//command)[1]" mode="xref"/>
+</xsl:template>
+
+<xsl:template match="funcsynopsis" mode="xref-to">
+ <xsl:apply-templates select="(.//function)[1]" mode="xref"/>
+</xsl:template>
+
+<xsl:template match="dedication|acknowledgements|preface|chapter|appendix|article" mode="xref-to">
+ <xsl:param name="referrer"/>
+ <xsl:param name="xrefstyle"/>
+ <xsl:param name="verbose" select="1"/>
+
+ <xsl:apply-templates select="." mode="object.xref.markup">
+ <xsl:with-param name="purpose" select="'xref'"/>
+ <xsl:with-param name="xrefstyle" select="$xrefstyle"/>
+ <xsl:with-param name="referrer" select="$referrer"/>
+ <xsl:with-param name="verbose" select="$verbose"/>
+ </xsl:apply-templates>
+</xsl:template>
+
+<xsl:template match="bibliography" mode="xref-to">
+ <xsl:param name="referrer"/>
+ <xsl:param name="xrefstyle"/>
+ <xsl:param name="verbose" select="1"/>
+
+ <xsl:apply-templates select="." mode="object.xref.markup">
+ <xsl:with-param name="purpose" select="'xref'"/>
+ <xsl:with-param name="xrefstyle" select="$xrefstyle"/>
+ <xsl:with-param name="referrer" select="$referrer"/>
+ <xsl:with-param name="verbose" select="$verbose"/>
+ </xsl:apply-templates>
+</xsl:template>
+
+<xsl:template match="biblioentry|bibliomixed" mode="xref-to-prefix">
+ <xsl:text>[</xsl:text>
+</xsl:template>
+
+<xsl:template match="biblioentry|bibliomixed" mode="xref-to-suffix">
+ <xsl:text>]</xsl:text>
+</xsl:template>
+
+<xsl:template match="biblioentry|bibliomixed" mode="xref-to">
+ <xsl:param name="referrer"/>
+ <xsl:param name="xrefstyle"/>
+ <xsl:param name="verbose" select="1"/>
+
+ <!-- handles both biblioentry and bibliomixed -->
+ <xsl:choose>
+ <xsl:when test="string(.) = ''">
+ <xsl:variable name="bib" select="document($bibliography.collection,.)"/>
+ <xsl:variable name="id" select="(@id|@xml:id)[1]"/>
+ <xsl:variable name="entry" select="$bib/bibliography/ *[@id=$id or @xml:id=$id][1]"/>
+ <xsl:choose>
+ <xsl:when test="$entry">
+ <xsl:choose>
+ <xsl:when test="$bibliography.numbered != 0">
+ <xsl:number from="bibliography" count="biblioentry|bibliomixed" level="any" format="1"/>
+ </xsl:when>
+ <xsl:when test="local-name($entry/*[1]) = 'abbrev'">
+ <xsl:apply-templates select="$entry/*[1]"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="(@id|@xml:id)[1]"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:message>
+ <xsl:text>No bibliography entry: </xsl:text>
+ <xsl:value-of select="$id"/>
+ <xsl:text> found in </xsl:text>
+ <xsl:value-of select="$bibliography.collection"/>
+ </xsl:message>
+ <xsl:value-of select="(@id|@xml:id)[1]"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:choose>
+ <xsl:when test="$bibliography.numbered != 0">
+ <xsl:number from="bibliography" count="biblioentry|bibliomixed" level="any" format="1"/>
+ </xsl:when>
+ <xsl:when test="local-name(*[1]) = 'abbrev'">
+ <xsl:apply-templates select="*[1]"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="(@id|@xml:id)[1]"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="glossary" mode="xref-to">
+ <xsl:param name="referrer"/>
+ <xsl:param name="xrefstyle"/>
+ <xsl:param name="verbose" select="1"/>
+
+ <xsl:apply-templates select="." mode="object.xref.markup">
+ <xsl:with-param name="purpose" select="'xref'"/>
+ <xsl:with-param name="xrefstyle" select="$xrefstyle"/>
+ <xsl:with-param name="referrer" select="$referrer"/>
+ <xsl:with-param name="verbose" select="$verbose"/>
+ </xsl:apply-templates>
+</xsl:template>
+
+<xsl:template match="glossentry" mode="xref-to">
+ <xsl:param name="referrer"/>
+ <xsl:param name="xrefstyle"/>
+ <xsl:param name="verbose" select="1"/>
+ <xsl:choose>
+ <xsl:when test="$glossentry.show.acronym = 'primary'">
+ <xsl:choose>
+ <xsl:when test="acronym|abbrev">
+ <xsl:apply-templates select="(acronym|abbrev)[1]"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="glossterm[1]" mode="xref-to">
+ <xsl:with-param name="xrefstyle" select="$xrefstyle"/>
+ <xsl:with-param name="referrer" select="$referrer"/>
+ <xsl:with-param name="verbose" select="$verbose"/>
+ </xsl:apply-templates>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="glossterm[1]" mode="xref-to">
+ <xsl:with-param name="xrefstyle" select="$xrefstyle"/>
+ <xsl:with-param name="referrer" select="$referrer"/>
+ <xsl:with-param name="verbose" select="$verbose"/>
+ </xsl:apply-templates>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="glossterm|firstterm" mode="xref-to">
+ <xsl:apply-templates/>
+</xsl:template>
+
+<xsl:template match="index" mode="xref-to">
+ <xsl:param name="referrer"/>
+ <xsl:param name="xrefstyle"/>
+ <xsl:param name="verbose" select="1"/>
+
+ <xsl:apply-templates select="." mode="object.xref.markup">
+ <xsl:with-param name="purpose" select="'xref'"/>
+ <xsl:with-param name="xrefstyle" select="$xrefstyle"/>
+ <xsl:with-param name="referrer" select="$referrer"/>
+ <xsl:with-param name="verbose" select="$verbose"/>
+ </xsl:apply-templates>
+</xsl:template>
+
+<xsl:template match="listitem" mode="xref-to">
+ <xsl:param name="referrer"/>
+ <xsl:param name="xrefstyle"/>
+ <xsl:param name="verbose"/>
+
+ <xsl:apply-templates select="." mode="object.xref.markup">
+ <xsl:with-param name="purpose" select="'xref'"/>
+ <xsl:with-param name="xrefstyle" select="$xrefstyle"/>
+ <xsl:with-param name="referrer" select="$referrer"/>
+ <xsl:with-param name="verbose" select="$verbose"/>
+ </xsl:apply-templates>
+</xsl:template>
+
+<xsl:template match="section|simplesect |sect1|sect2|sect3|sect4|sect5 |refsect1|refsect2|refsect3|refsection" mode="xref-to">
+ <xsl:param name="referrer"/>
+ <xsl:param name="xrefstyle"/>
+ <xsl:param name="verbose" select="1"/>
+
+ <xsl:apply-templates select="." mode="object.xref.markup">
+ <xsl:with-param name="purpose" select="'xref'"/>
+ <xsl:with-param name="xrefstyle" select="$xrefstyle"/>
+ <xsl:with-param name="referrer" select="$referrer"/>
+ <xsl:with-param name="verbose" select="$verbose"/>
+ </xsl:apply-templates>
+ <!-- FIXME: What about "in Chapter X"? -->
+</xsl:template>
+
+<xsl:template match="bridgehead" mode="xref-to">
+ <xsl:param name="referrer"/>
+ <xsl:param name="xrefstyle"/>
+ <xsl:param name="verbose" select="1"/>
+
+ <xsl:apply-templates select="." mode="object.xref.markup">
+ <xsl:with-param name="purpose" select="'xref'"/>
+ <xsl:with-param name="xrefstyle" select="$xrefstyle"/>
+ <xsl:with-param name="referrer" select="$referrer"/>
+ <xsl:with-param name="verbose" select="$verbose"/>
+ </xsl:apply-templates>
+ <!-- FIXME: What about "in Chapter X"? -->
+</xsl:template>
+
+<xsl:template match="qandaset" mode="xref-to">
+ <xsl:param name="referrer"/>
+ <xsl:param name="xrefstyle"/>
+ <xsl:param name="verbose" select="1"/>
+
+ <xsl:apply-templates select="." mode="object.xref.markup">
+ <xsl:with-param name="purpose" select="'xref'"/>
+ <xsl:with-param name="xrefstyle" select="$xrefstyle"/>
+ <xsl:with-param name="referrer" select="$referrer"/>
+ <xsl:with-param name="verbose" select="$verbose"/>
+ </xsl:apply-templates>
+</xsl:template>
+
+<xsl:template match="qandadiv" mode="xref-to">
+ <xsl:param name="referrer"/>
+ <xsl:param name="xrefstyle"/>
+ <xsl:param name="verbose" select="1"/>
+
+ <xsl:apply-templates select="." mode="object.xref.markup">
+ <xsl:with-param name="purpose" select="'xref'"/>
+ <xsl:with-param name="xrefstyle" select="$xrefstyle"/>
+ <xsl:with-param name="referrer" select="$referrer"/>
+ <xsl:with-param name="verbose" select="$verbose"/>
+ </xsl:apply-templates>
+</xsl:template>
+
+<xsl:template match="qandaentry" mode="xref-to">
+ <xsl:param name="referrer"/>
+ <xsl:param name="xrefstyle"/>
+ <xsl:param name="verbose" select="1"/>
+
+ <xsl:apply-templates select="question[1]" mode="xref-to">
+ <xsl:with-param name="xrefstyle" select="$xrefstyle"/>
+ <xsl:with-param name="referrer" select="$referrer"/>
+ <xsl:with-param name="verbose" select="$verbose"/>
+ </xsl:apply-templates>
+</xsl:template>
+
+<xsl:template match="question|answer" mode="xref-to">
+ <xsl:param name="referrer"/>
+ <xsl:param name="xrefstyle"/>
+ <xsl:param name="verbose" select="1"/>
+
+ <xsl:choose>
+ <xsl:when test="string-length(label) != 0">
+ <xsl:apply-templates select="." mode="label.markup"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="." mode="object.xref.markup">
+ <xsl:with-param name="purpose" select="'xref'"/>
+ <xsl:with-param name="xrefstyle" select="$xrefstyle"/>
+ <xsl:with-param name="referrer" select="$referrer"/>
+ <xsl:with-param name="verbose" select="$verbose"/>
+ </xsl:apply-templates>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="part|reference" mode="xref-to">
+ <xsl:param name="referrer"/>
+ <xsl:param name="xrefstyle"/>
+ <xsl:param name="verbose" select="1"/>
+
+ <xsl:apply-templates select="." mode="object.xref.markup">
+ <xsl:with-param name="purpose" select="'xref'"/>
+ <xsl:with-param name="xrefstyle" select="$xrefstyle"/>
+ <xsl:with-param name="referrer" select="$referrer"/>
+ <xsl:with-param name="verbose" select="$verbose"/>
+ </xsl:apply-templates>
+</xsl:template>
+
+<xsl:template match="refentry" mode="xref-to">
+ <xsl:param name="referrer"/>
+ <xsl:param name="xrefstyle"/>
+
+ <xsl:choose>
+ <xsl:when test="refmeta/refentrytitle">
+ <xsl:apply-templates select="refmeta/refentrytitle"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="refnamediv/refname[1]"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:apply-templates select="refmeta/manvolnum"/>
+</xsl:template>
+
+<xsl:template match="refnamediv" mode="xref-to">
+ <xsl:param name="referrer"/>
+ <xsl:param name="xrefstyle"/>
+ <xsl:param name="verbose" select="1"/>
+
+ <xsl:apply-templates select="refname[1]" mode="xref-to">
+ <xsl:with-param name="xrefstyle" select="$xrefstyle"/>
+ <xsl:with-param name="referrer" select="$referrer"/>
+ <xsl:with-param name="verbose" select="$verbose"/>
+ </xsl:apply-templates>
+</xsl:template>
+
+<xsl:template match="refname" mode="xref-to">
+ <xsl:param name="referrer"/>
+ <xsl:param name="xrefstyle"/>
+ <xsl:param name="verbose" select="1"/>
+
+ <xsl:apply-templates mode="xref-to"/>
+</xsl:template>
+
+<xsl:template match="step" mode="xref-to">
+ <xsl:param name="referrer"/>
+ <xsl:param name="xrefstyle"/>
+
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'Step'"/>
+ </xsl:call-template>
+ <xsl:text> </xsl:text>
+ <xsl:apply-templates select="." mode="number"/>
+</xsl:template>
+
+<xsl:template match="varlistentry" mode="xref-to">
+ <xsl:param name="referrer"/>
+ <xsl:param name="xrefstyle"/>
+ <xsl:param name="verbose" select="1"/>
+
+ <xsl:apply-templates select="term[1]" mode="xref-to">
+ <xsl:with-param name="xrefstyle" select="$xrefstyle"/>
+ <xsl:with-param name="referrer" select="$referrer"/>
+ <xsl:with-param name="verbose" select="$verbose"/>
+ </xsl:apply-templates>
+</xsl:template>
+
+<xsl:template match="primary|secondary|tertiary" mode="xref-to">
+ <xsl:value-of select="."/>
+</xsl:template>
+
+<xsl:template match="indexterm" mode="xref-to">
+ <xsl:value-of select="primary"/>
+</xsl:template>
+
+<xsl:template match="varlistentry/term" mode="xref-to">
+ <xsl:param name="referrer"/>
+ <xsl:param name="xrefstyle"/>
+
+ <!-- to avoid the comma that will be generated if there are several terms -->
+ <xsl:apply-templates/>
+</xsl:template>
+
+<xsl:template match="co" mode="xref-to">
+ <xsl:param name="referrer"/>
+ <xsl:param name="xrefstyle"/>
+
+ <xsl:apply-templates select="." mode="callout-bug"/>
+</xsl:template>
+
+<xsl:template match="area|areaset" mode="xref-to">
+ <xsl:param name="referrer"/>
+ <xsl:param name="xrefstyle"/>
+
+ <xsl:call-template name="callout-bug">
+ <xsl:with-param name="conum">
+ <xsl:apply-templates select="." mode="conumber"/>
+ </xsl:with-param>
+ </xsl:call-template>
+</xsl:template>
+
+<xsl:template match="book" mode="xref-to">
+ <xsl:param name="referrer"/>
+ <xsl:param name="xrefstyle"/>
+ <xsl:param name="verbose" select="1"/>
+
+ <xsl:apply-templates select="." mode="object.xref.markup">
+ <xsl:with-param name="purpose" select="'xref'"/>
+ <xsl:with-param name="xrefstyle" select="$xrefstyle"/>
+ <xsl:with-param name="referrer" select="$referrer"/>
+ <xsl:with-param name="verbose" select="$verbose"/>
+ </xsl:apply-templates>
+</xsl:template>
+
+<!-- These are elements for which no link text exists, so an xref to one
+ uses the xrefstyle attribute if specified, or if not it falls back
+ to the container element's link text -->
+<xsl:template match="para|phrase|simpara|anchor|quote" mode="xref-to">
+ <xsl:param name="referrer"/>
+ <xsl:param name="xrefstyle"/>
+ <xsl:param name="verbose" select="1"/>
+
+ <xsl:variable name="context" select="(ancestor::simplesect |ancestor::section |ancestor::sect1 |ancestor::sect2 |ancestor::sect3 |ancestor::sect4 |ancestor::sect5 |ancestor::refsection |ancestor::refsect1 |ancestor::refsect2 |ancestor::refsect3 |ancestor::chapter |ancestor::appendix |ancestor::preface |ancestor::partintro |ancestor::dedication |ancestor::acknowledgements |ancestor::colophon |ancestor::bibliography |ancestor::index |ancestor::glossary |ancestor::glossentry |ancestor::listitem |ancestor::varlistentry)[last()]"/>
+
+ <xsl:choose>
+ <xsl:when test="$xrefstyle != ''">
+ <xsl:apply-templates select="." mode="object.xref.markup">
+ <xsl:with-param name="xrefstyle" select="$xrefstyle"/>
+ <xsl:with-param name="referrer" select="$referrer"/>
+ <xsl:with-param name="verbose" select="$verbose"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="$context" mode="xref-to">
+ <xsl:with-param name="purpose" select="'xref'"/>
+ <xsl:with-param name="xrefstyle" select="$xrefstyle"/>
+ <xsl:with-param name="referrer" select="$referrer"/>
+ <xsl:with-param name="verbose" select="$verbose"/>
+ </xsl:apply-templates>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="*" mode="xref-title">
+ <xsl:variable name="title">
+ <xsl:apply-templates select="." mode="object.title.markup"/>
+ </xsl:variable>
+
+ <xsl:value-of select="$title"/>
+</xsl:template>
+
+<xsl:template match="author" mode="xref-title">
+ <xsl:variable name="title">
+ <xsl:call-template name="person.name"/>
+ </xsl:variable>
+
+ <xsl:value-of select="$title"/>
+</xsl:template>
+
+<xsl:template match="authorgroup" mode="xref-title">
+ <xsl:variable name="title">
+ <xsl:call-template name="person.name.list"/>
+ </xsl:variable>
+
+ <xsl:value-of select="$title"/>
+</xsl:template>
+
+<xsl:template match="cmdsynopsis" mode="xref-title">
+ <xsl:variable name="title">
+ <xsl:apply-templates select="(.//command)[1]" mode="xref"/>
+ </xsl:variable>
+
+ <xsl:value-of select="$title"/>
+</xsl:template>
+
+<xsl:template match="funcsynopsis" mode="xref-title">
+ <xsl:variable name="title">
+ <xsl:apply-templates select="(.//function)[1]" mode="xref"/>
+ </xsl:variable>
+
+ <xsl:value-of select="$title"/>
+</xsl:template>
+
+<xsl:template match="biblioentry|bibliomixed" mode="xref-title">
+ <!-- handles both biblioentry and bibliomixed -->
+ <xsl:variable name="title">
+ <xsl:text>[</xsl:text>
+ <xsl:choose>
+ <xsl:when test="local-name(*[1]) = 'abbrev'">
+ <xsl:apply-templates select="*[1]"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="(@id|@xml:id)[1]"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:text>]</xsl:text>
+ </xsl:variable>
+
+ <xsl:value-of select="$title"/>
+</xsl:template>
+
+<xsl:template match="step" mode="xref-title">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'Step'"/>
+ </xsl:call-template>
+ <xsl:text> </xsl:text>
+ <xsl:apply-templates select="." mode="number"/>
+</xsl:template>
+
+<xsl:template match="step[not(./title)]" mode="title.markup">
+ <xsl:call-template name="gentext">
+ <xsl:with-param name="key" select="'Step'"/>
+ </xsl:call-template>
+ <xsl:text> </xsl:text>
+ <xsl:apply-templates select="." mode="number"/>
+</xsl:template>
+
+<xsl:template match="co" mode="xref-title">
+ <xsl:variable name="title">
+ <xsl:apply-templates select="." mode="callout-bug"/>
+ </xsl:variable>
+
+ <xsl:value-of select="$title"/>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="link" name="link">
+ <xsl:param name="linkend" select="@linkend"/>
+ <xsl:param name="a.target"/>
+ <xsl:param name="xhref" select="@xlink:href"/>
+
+ <xsl:variable name="content">
+ <xsl:call-template name="anchor"/>
+ <xsl:choose>
+ <xsl:when test="count(child::node()) &gt; 0">
+ <!-- If it has content, use it -->
+ <xsl:apply-templates/>
+ </xsl:when>
+ <!-- else look for an endterm -->
+ <xsl:when test="@endterm">
+ <xsl:variable name="etargets" select="key('id',@endterm)"/>
+ <xsl:variable name="etarget" select="$etargets[1]"/>
+ <xsl:choose>
+ <xsl:when test="count($etarget) = 0">
+ <xsl:message>
+ <xsl:value-of select="count($etargets)"/>
+ <xsl:text>Endterm points to nonexistent ID: </xsl:text>
+ <xsl:value-of select="@endterm"/>
+ </xsl:message>
+ <xsl:text>???</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="$etarget" mode="endterm"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <!-- Use the xlink:href if no other text -->
+ <xsl:when test="@xlink:href">
+ <xsl:value-of select="@xlink:href"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:message>
+ <xsl:text>Link element has no content and no Endterm. </xsl:text>
+ <xsl:text>Nothing to show in the link to </xsl:text>
+ <xsl:value-of select="(@xlink:href|@linkend)[1]"/>
+ </xsl:message>
+ <xsl:text>???</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:call-template name="simple.xlink">
+ <xsl:with-param name="node" select="."/>
+ <xsl:with-param name="linkend" select="$linkend"/>
+ <xsl:with-param name="content" select="$content"/>
+ <xsl:with-param name="a.target" select="$a.target"/>
+ <xsl:with-param name="xhref" select="$xhref"/>
+ </xsl:call-template>
+
+</xsl:template>
+
+<xsl:template match="ulink" name="ulink">
+ <xsl:param name="url" select="@url"/>
+ <xsl:variable name="link">
+ <a>
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:if test="@id or @xml:id">
+ <xsl:attribute name="id">
+ <xsl:value-of select="(@id|@xml:id)[1]"/>
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:attribute name="href"><xsl:value-of select="$url"/></xsl:attribute>
+ <xsl:if test="$ulink.target != ''">
+ <xsl:attribute name="target">
+ <xsl:value-of select="$ulink.target"/>
+ </xsl:attribute>
+ </xsl:if>
+ <xsl:choose>
+ <xsl:when test="count(child::node())=0">
+ <xsl:value-of select="$url"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </a>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="function-available('suwl:unwrapLinks')">
+ <xsl:copy-of select="suwl:unwrapLinks($link)"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:copy-of select="$link"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="olink" name="olink">
+ <!-- olink content may be passed in from xlink olink -->
+ <xsl:param name="content" select="NOTANELEMENT"/>
+
+ <xsl:call-template name="anchor"/>
+
+ <xsl:variable name="localinfo" select="@localinfo"/>
+
+ <xsl:choose>
+ <!-- olinks resolved by stylesheet and target database -->
+ <xsl:when test="@targetdoc or @targetptr or (@xlink:role=$xolink.role and contains(@xlink:href, '#') )">
+
+ <xsl:variable name="targetdoc.att">
+ <xsl:choose>
+ <xsl:when test="@targetdoc != ''">
+ <xsl:value-of select="@targetdoc"/>
+ </xsl:when>
+ <xsl:when test="@xlink:role=$xolink.role and contains(@xlink:href, '#')">
+ <xsl:value-of select="substring-before(@xlink:href, '#')"/>
+ </xsl:when>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="targetptr.att">
+ <xsl:choose>
+ <xsl:when test="@targetptr != ''">
+ <xsl:value-of select="@targetptr"/>
+ </xsl:when>
+ <xsl:when test="@xlink:role=$xolink.role and contains(@xlink:href, '#')">
+ <xsl:value-of select="substring-after(@xlink:href, '#')"/>
+ </xsl:when>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="olink.lang">
+ <xsl:call-template name="l10n.language">
+ <xsl:with-param name="xref-context" select="true()"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="target.database.filename">
+ <xsl:call-template name="select.target.database">
+ <xsl:with-param name="targetdoc.att" select="$targetdoc.att"/>
+ <xsl:with-param name="targetptr.att" select="$targetptr.att"/>
+ <xsl:with-param name="olink.lang" select="$olink.lang"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="target.database" select="document($target.database.filename,/)"/>
+
+ <xsl:if test="$olink.debug != 0">
+ <xsl:message>
+ <xsl:text>Olink debug: root element of target.database '</xsl:text>
+ <xsl:value-of select="$target.database.filename"/>
+ <xsl:text>' is '</xsl:text>
+ <xsl:value-of select="local-name($target.database/*[1])"/>
+ <xsl:text>'.</xsl:text>
+ </xsl:message>
+ </xsl:if>
+
+ <xsl:variable name="olink.key">
+ <xsl:call-template name="select.olink.key">
+ <xsl:with-param name="targetdoc.att" select="$targetdoc.att"/>
+ <xsl:with-param name="targetptr.att" select="$targetptr.att"/>
+ <xsl:with-param name="olink.lang" select="$olink.lang"/>
+ <xsl:with-param name="target.database" select="$target.database"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:if test="string-length($olink.key) = 0">
+ <xsl:message>
+ <xsl:text>Error: unresolved olink: </xsl:text>
+ <xsl:text>targetdoc/targetptr = '</xsl:text>
+ <xsl:value-of select="$targetdoc.att"/>
+ <xsl:text>/</xsl:text>
+ <xsl:value-of select="$targetptr.att"/>
+ <xsl:text>'.</xsl:text>
+ </xsl:message>
+ </xsl:if>
+
+ <xsl:variable name="href">
+ <xsl:call-template name="make.olink.href">
+ <xsl:with-param name="olink.key" select="$olink.key"/>
+ <xsl:with-param name="target.database" select="$target.database"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="hottext">
+ <xsl:choose>
+ <xsl:when test="string-length($content) != 0">
+ <xsl:copy-of select="$content"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="olink.hottext">
+ <xsl:with-param name="olink.key" select="$olink.key"/>
+ <xsl:with-param name="olink.lang" select="$olink.lang"/>
+ <xsl:with-param name="target.database" select="$target.database"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="olink.docname.citation">
+ <xsl:call-template name="olink.document.citation">
+ <xsl:with-param name="olink.key" select="$olink.key"/>
+ <xsl:with-param name="target.database" select="$target.database"/>
+ <xsl:with-param name="olink.lang" select="$olink.lang"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="olink.page.citation">
+ <xsl:call-template name="olink.page.citation">
+ <xsl:with-param name="olink.key" select="$olink.key"/>
+ <xsl:with-param name="target.database" select="$target.database"/>
+ <xsl:with-param name="olink.lang" select="$olink.lang"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="$href != ''">
+ <a href="{$href}">
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:copy-of select="$hottext"/>
+ </a>
+ <xsl:copy-of select="$olink.page.citation"/>
+ <xsl:copy-of select="$olink.docname.citation"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <span class="olink"><xsl:copy-of select="$hottext"/></span>
+ <xsl:copy-of select="$olink.page.citation"/>
+ <xsl:copy-of select="$olink.docname.citation"/>
+ </xsl:otherwise>
+ </xsl:choose>
+
+ </xsl:when>
+
+ <!-- Or use old olink mechanism -->
+ <xsl:otherwise>
+ <xsl:variable name="href">
+ <xsl:choose>
+ <xsl:when test="@linkmode">
+ <!-- use the linkmode to get the base URI, use localinfo as fragid -->
+ <xsl:variable name="modespec" select="key('id',@linkmode)"/>
+ <xsl:if test="count($modespec) != 1 or local-name($modespec) != 'modespec'">
+ <xsl:message>Warning: olink linkmode pointer is wrong.</xsl:message>
+ </xsl:if>
+ <xsl:value-of select="$modespec"/>
+ <xsl:if test="@localinfo">
+ <xsl:text>#</xsl:text>
+ <xsl:value-of select="@localinfo"/>
+ </xsl:if>
+ </xsl:when>
+ <xsl:when test="@type = 'href'">
+ <xsl:call-template name="olink.outline">
+ <xsl:with-param name="outline.base.uri" select="unparsed-entity-uri(@targetdocent)"/>
+ <xsl:with-param name="localinfo" select="@localinfo"/>
+ <xsl:with-param name="return" select="'href'"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$olink.resolver"/>
+ <xsl:text>?</xsl:text>
+ <xsl:value-of select="$olink.sysid"/>
+ <xsl:value-of select="unparsed-entity-uri(@targetdocent)"/>
+ <!-- XSL gives no access to the public identifier (grumble...) -->
+ <xsl:if test="@localinfo">
+ <xsl:text>&amp;</xsl:text>
+ <xsl:value-of select="$olink.fragid"/>
+ <xsl:value-of select="@localinfo"/>
+ </xsl:if>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="$href != ''">
+ <a href="{$href}">
+ <xsl:apply-templates select="." mode="common.html.attributes"/>
+ <xsl:call-template name="olink.hottext"/>
+ </a>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="olink.hottext"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="*" mode="pagenumber.markup">
+ <!-- no-op in HTML -->
+</xsl:template>
+
+
+<xsl:template name="olink.outline">
+ <xsl:param name="outline.base.uri"/>
+ <xsl:param name="localinfo"/>
+ <xsl:param name="return" select="href"/>
+
+ <xsl:variable name="outline-file" select="concat($outline.base.uri, $olink.outline.ext)"/>
+
+ <xsl:variable name="outline" select="document($outline-file,.)/div"/>
+
+ <xsl:variable name="node-href">
+ <xsl:choose>
+ <xsl:when test="$localinfo != ''">
+ <xsl:variable name="node" select="$outline// *[@id=$localinfo or @xml:id=$localinfo]"/>
+ <xsl:value-of select="$node/@href"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$outline/@href"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:variable name="node-xref">
+ <xsl:choose>
+ <xsl:when test="$localinfo != ''">
+ <xsl:variable name="node" select="$outline// *[@id=$localinfo or @xml:id=$localinfo]"/>
+ <xsl:copy-of select="$node/xref"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$outline/xref"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="$return = 'href'">
+ <xsl:value-of select="$node-href"/>
+ </xsl:when>
+ <xsl:when test="$return = 'xref'">
+ <xsl:value-of select="$node-xref"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:copy-of select="$node-xref"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template name="xref.xreflabel">
+ <!-- called to process an xreflabel...you might use this to make -->
+ <!-- xreflabels come out in the right font for different targets, -->
+ <!-- for example. -->
+ <xsl:param name="target" select="."/>
+ <xsl:value-of select="$target/@xreflabel"/>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="title" mode="xref">
+ <xsl:apply-templates/>
+</xsl:template>
+
+<xsl:template match="command" mode="xref">
+ <xsl:call-template name="inline.boldseq"/>
+</xsl:template>
+
+<xsl:template match="function" mode="xref">
+ <xsl:call-template name="inline.monoseq"/>
+</xsl:template>
+
+<!-- ==================================================================== -->
+
+<xsl:template match="*" mode="insert.title.markup">
+ <xsl:param name="purpose"/>
+ <xsl:param name="xrefstyle"/>
+ <xsl:param name="title"/>
+
+ <xsl:choose>
+ <!-- FIXME: what about the case where titleabbrev is inside the info? -->
+ <xsl:when test="$purpose = 'xref' and titleabbrev">
+ <xsl:apply-templates select="." mode="titleabbrev.markup"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:copy-of select="$title"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="chapter|appendix" mode="insert.title.markup">
+ <xsl:param name="purpose"/>
+ <xsl:param name="xrefstyle"/>
+ <xsl:param name="title"/>
+
+ <xsl:choose>
+ <xsl:when test="$purpose = 'xref'">
+ <em xmlns:xslo="http://www.w3.org/1999/XSL/Transform">
+ <xsl:copy-of select="$title"/>
+ </em>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:copy-of select="$title"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template match="*" mode="insert.subtitle.markup">
+ <xsl:param name="purpose"/>
+ <xsl:param name="xrefstyle"/>
+ <xsl:param name="subtitle"/>
+
+ <xsl:copy-of select="$subtitle"/>
+</xsl:template>
+
+<xsl:template match="*" mode="insert.label.markup">
+ <xsl:param name="purpose"/>
+ <xsl:param name="xrefstyle"/>
+ <xsl:param name="label"/>
+
+ <xsl:copy-of select="$label"/>
+</xsl:template>
+
+<xsl:template match="*" mode="insert.pagenumber.markup">
+ <xsl:param name="purpose"/>
+ <xsl:param name="xrefstyle"/>
+ <xsl:param name="pagenumber"/>
+
+ <xsl:copy-of select="$pagenumber"/>
+</xsl:template>
+
+<xsl:template match="*" mode="insert.direction.markup">
+ <xsl:param name="purpose"/>
+ <xsl:param name="xrefstyle"/>
+ <xsl:param name="direction"/>
+
+ <xsl:copy-of select="$direction"/>
+</xsl:template>
+
+<xsl:template match="*" mode="insert.olink.docname.markup">
+ <xsl:param name="purpose"/>
+ <xsl:param name="xrefstyle"/>
+ <xsl:param name="docname"/>
+
+ <span class="olinkdocname">
+ <xsl:copy-of select="$docname"/>
+ </span>
+
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docs/SConstruct b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docs/SConstruct
new file mode 100644
index 0000000..4c048d5
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docs/SConstruct
@@ -0,0 +1,34 @@
+#
+# Copyright (c) 2001-2010 The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+
+import os
+
+env = Environment(ENV = os.environ,
+ tools = ['docbook'])
+
+env.DocbookPdf('manual', xsl='pdf.xsl')
+#env.DocbookPdf('reference', xsl='pdf.xsl')
+
+env.DocbookHtml('manual', xsl='html.xsl')
+#env.DocbookHtml('reference', xsl='html.xsl')
+
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docs/html.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docs/html.xsl
new file mode 100644
index 0000000..f53e1b3
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docs/html.xsl
@@ -0,0 +1,55 @@
+<?xml version='1.0'?>
+<!--
+
+ Copyright (c) 2001-2010 The SCons Foundation
+
+ Permission is hereby granted, free of charge, to any person obtaining
+ a copy of this software and associated documentation files (the
+ "Software"), to deal in the Software without restriction, including
+ without limitation the rights to use, copy, modify, merge, publish,
+ distribute, sublicense, and/or sell copies of the Software, and to
+ permit persons to whom the Software is furnished to do so, subject to
+ the following conditions:
+
+ The above copyright notice and this permission notice shall be included
+ in all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+ KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+ WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+-->
+<xsl:stylesheet
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:fo="http://www.w3.org/1999/XSL/Format"
+ version="1.0">
+
+ <xsl:import href="file:///usr/share/xml/docbook/stylesheet/docbook-xsl/html/docbook.xsl"/>
+
+<xsl:param name="l10n.gentext.default.language" select="'en'"/>
+<xsl:param name="section.autolabel" select="1"/>
+<xsl:param name="html.stylesheet" select="'scons.css'"/>
+<xsl:param name="generate.toc">
+/appendix toc,title
+article/appendix nop
+/article toc,title
+book toc,title,figure,table,example,equation
+/chapter toc,title
+part toc,title
+/preface toc,title
+reference toc,title
+/sect1 toc
+/sect2 toc
+/sect3 toc
+/sect4 toc
+/sect5 toc
+/section toc
+set toc,title
+</xsl:param>
+
+</xsl:stylesheet>
+
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docs/manual.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docs/manual.xml
new file mode 100644
index 0000000..c129753
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docs/manual.xml
@@ -0,0 +1,270 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+ Copyright (c) 2001-2010 The SCons Foundation
+
+ Permission is hereby granted, free of charge, to any person obtaining
+ a copy of this software and associated documentation files (the
+ "Software"), to deal in the Software without restriction, including
+ without limitation the rights to use, copy, modify, merge, publish,
+ distribute, sublicense, and/or sell copies of the Software, and to
+ permit persons to whom the Software is furnished to do so, subject to
+ the following conditions:
+
+ The above copyright notice and this permission notice shall be included
+ in all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+ KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+ WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+-->
+<!DOCTYPE article PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
+"http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd">
+<article>
+ <title>The SCons Docbook tool</title>
+ <articleinfo>
+ <author>
+ <surname>Dirk Baechle</surname>
+ </author>
+ <pubdate>2010-12-30</pubdate>
+ </articleinfo>
+<section id="basics"><title>Basics</title>
+<para>This tool tries to make working with Docbook in SCons a little easier.
+It provides several toolchains for creating different output formats,
+like HTML or PDF. Contained in the package is
+a distribution of the Docbook XSL stylesheets as of version 1.76.1.
+As long as you don't specify your own stylesheets for customization (see <link linkend="stylesheet">Selecting stylesheet</link>),
+these official versions are picked as default...which should reduce
+the inevitable setup hassles for you.
+</para>
+<para>Implicit dependencies to images and XIncludes are detected automatically
+if you meet the HTML requirements (see <link linkend="requirements">Requirements</link>). The additional
+stylesheet <literal>utils/xmldepend.xsl</literal> by Paul DuBois is used for this purpose.
+</para>
+<para>Note, that there is no support for XML catalog resolving offered! This tool calls
+the XSLT processors and PDF renderers with the stylesheets you specified, that's it.
+The rest lies in your hands and you still have to know what you're doing when
+resolving names via a catalog.
+</para>
+<section id="install"><title>Install</title>
+<para>Installing it, requires you to copy (or, even better: checkout) the contents of the
+package's <literal>docbook</literal> folder to
+</para>
+<orderedlist><listitem><para><quote><literal>/path_to_your_project/site_scons/site_tools/docbook</literal></quote>, if you need the Docbook Tool in one project only, or
+</para>
+</listitem>
+<listitem><para><quote><literal>~/.scons/site_scons/site_tools/docbook</literal></quote>, for a system-wide installation under your current login.
+</para>
+</listitem>
+</orderedlist>
+<para>For more infos about this, please refer to
+</para>
+<itemizedlist><listitem><para>the SCons User's Guide, chap. 19.7 "Where to put your custom Builders and Tools" and
+</para>
+</listitem>
+<listitem><para>the SCons Tools Wiki page at <ulink url="http://scons.org/wiki/ToolsIndex">http://scons.org/wiki/ToolsIndex</ulink>.
+</para>
+</listitem>
+</itemizedlist>
+</section>
+<section id="activation"><title>How to activate</title>
+<para>For activating the tool "docbook", you have to add its name to the Environment constructor,
+like this
+</para>
+<screen>env = Environment(tools=['docbook'])
+</screen>
+<para>On its startup, the Docbook tool tries to find a required <literal>xsltproc</literal> processor, and
+a PDF renderer, e.g. <literal>fop</literal>. So make sure that these are added to your system's environment
+<literal>PATH</literal> and can be called directly, without specifying their full path.
+</para>
+</section>
+<section id="requirements"><title>Requirements</title>
+<para>For the most basic processing of Docbook to HTML, you need to have installed
+</para>
+<itemizedlist><listitem><para>the Python <literal>lxml</literal> binding to <literal>libxml2</literal>, or
+</para>
+</listitem>
+<listitem><para>the direct Python bindings for <literal>libxml2/libxslt</literal>, or
+</para>
+</listitem>
+<listitem><para>a standalone XSLT processor, currently detected are <literal>xsltproc</literal>, <literal>saxon</literal>, <literal>saxon-xslt</literal>
+and <literal>xalan</literal>.
+</para>
+</listitem>
+</itemizedlist>
+<para>Rendering to PDF requires you to have one of the applications <literal>fop</literal>, <literal>xep</literal> or <literal>jw</literal>
+installed.
+</para>
+</section>
+</section>
+<section id="process"><title>Processing documents</title>
+<para>Creating a HTML or PDF document is very simple and straightforward. Say
+</para>
+<screen>env = Environment(tools=['docbook'])
+env.DocbookHtml('manual.html', 'manual.xml')
+env.DocbookPdf('manual.pdf', 'manual.xml')
+</screen>
+<para>to get both outputs from your XML source <literal>manual.xml</literal>. As a shortcut, you can
+give the stem of the filenames alone, like this:
+</para>
+<screen>env = Environment(tools=['docbook'])
+env.DocbookHtml('manual')
+env.DocbookPdf('manual')
+</screen>
+<para>and get the same result. Target and source lists are also supported:
+</para>
+<screen>env = Environment(tools=['docbook'])
+env.DocbookHtml(['manual.html','reference.html'], ['manual.xml','reference.xml'])
+</screen>
+<para>or even
+</para>
+<screen>env = Environment(tools=['docbook'])
+env.DocbookHtml(['manual','reference'])
+</screen>
+<important><para>Whenever you leave out the list of sources, you may not specify a file extension! The
+Tool uses the given names as file stems, and adds the suffixes for target and source files
+accordingly.
+</para>
+</important>
+<para>The rules given above are valid for the Builders <literal>DocbookHtml</literal>, <literal>DocbookPdf</literal>,
+<literal>DocbookSlidePdf</literal> and <literal>DocbookXInclude</literal>. For the <literal>DocbookMan</literal> transformation you
+can specify a target name, but the actual output names are automatically set from
+the <literal>refname</literal> entries in your XML source.
+</para>
+<para>Please refer to <link linkend="chunked">the section Chunked output</link> for more infos about the other Builders.
+</para>
+</section>
+<section id="stylesheet"><title>Selecting your own stylesheet</title>
+<para>If you want to use a specific XSL file, you can set the additional <literal>xsl</literal> parameter to your
+Builder call as follows:
+</para>
+<screen>env.DocbookHtml('other.html', 'manual.xml', xsl='html.xsl')
+</screen>
+<para>Since this may get tedious if you always use the same local naming for your customized XSL files,
+e.g. <literal>html.xsl</literal> for HTML and <literal>pdf.xsl</literal> for PDF output, a set of variables for setting the
+default XSL name is provided. These are:
+</para>
+<screen>DOCBOOK_DEFAULT_XSL_HTML
+DOCBOOK_DEFAULT_XSL_HTMLCHUNKED
+DOCBOOK_DEFAULT_XSL_HTMLHELP
+DOCBOOK_DEFAULT_XSL_PDF
+DOCBOOK_DEFAULT_XSL_MAN
+DOCBOOK_DEFAULT_XSL_SLIDESPDF
+DOCBOOK_DEFAULT_XSL_SLIDESHTML
+</screen>
+<para>and you can set them when constructing your environment:
+</para>
+<screen>env = Environment(tools=['docbook'],
+ DOCBOOK_DEFAULT_XSL_HTML='html.xsl',
+ DOCBOOK_DEFAULT_XSL_PDF='pdf.xsl')
+env.DocbookHtml('manual') # now uses html.xsl
+</screen>
+</section>
+<section id="chunked"><title>Chunked output</title>
+<para>The Builders <literal>DocbookHtmlChunked</literal>, <literal>DocbookHtmlhelp</literal> and <literal>DocbookSlidesHtml</literal>
+are special, in that:
+</para>
+<orderedlist><listitem><para>they create a large set of files, where the exact names and their number depend
+on the content of the source file, and
+</para>
+</listitem>
+<listitem><para>the main target is always named <literal>index.html</literal>, i.e. the output name for the
+XSL transformation is not picked up by the stylesheets.
+</para>
+</listitem>
+</orderedlist>
+<para>As a result, there is simply no use in specifying a target HTML name.
+So the basic syntax for these builders is:
+</para>
+<screen>env = Environment(tools=['docbook'])
+env.DocbookHtmlhelp('manual')
+</screen>
+<para>Only if you use the <literal>root.filename</literal> (<literal>titlefoil.html</literal> for slides) parameter in
+your own stylesheets you have to give the new target name. This ensures that the
+dependencies get correct, especially for the cleanup via <quote><literal>scons -c</literal></quote>:
+</para>
+<screen>env = Environment(tools=['docbook'])
+env.DocbookHtmlhelp('mymanual.html','manual', xsl='htmlhelp.xsl')
+</screen>
+<para>Some basic support for the <literal>base.dir</literal> is added (this has not been properly tested
+with variant dirs, yet!). You can add the <literal>base_dir</literal> keyword to your Builder
+call, and the given prefix gets prepended to all the created filenames:
+</para>
+<screen>env = Environment(tools=['docbook'])
+env.DocbookHtmlhelp('manual', xsl='htmlhelp.xsl', base_dir='output/')
+</screen>
+<para>Make sure that you don't forget the trailing slash for the base folder, else
+your files get renamed only!
+</para>
+</section>
+<section id="builders"><title>All builders</title>
+<para>A simple list of all builders currently available:
+</para>
+<variablelist><varlistentry><term>DocbookHtml
+</term>
+<listitem><para>Single HTML file.
+</para>
+</listitem>
+</varlistentry>
+<varlistentry><term>DocbookHtmlChunked
+</term>
+<listitem><para>Chunked HTML files, with support for the <literal>base.dir</literal> parameter. The <literal>chunkfast.xsl</literal>
+file (requires "EXSLT") is used as the default stylesheet.
+</para>
+</listitem>
+</varlistentry>
+<varlistentry><term>DocbookHtmlhelp
+</term>
+<listitem><para>Htmlhelp files, with support for <literal>base.dir</literal>.
+</para>
+</listitem>
+</varlistentry>
+<varlistentry><term>DocbookPdf
+</term>
+<listitem><para>PDF output.
+</para>
+</listitem>
+</varlistentry>
+<varlistentry><term>DocbookMan
+</term>
+<listitem><para>Man pages.
+</para>
+</listitem>
+</varlistentry>
+<varlistentry><term>DocbookSlidesPdf
+</term>
+<listitem><para>Slides in PDF format.
+</para>
+</listitem>
+</varlistentry>
+<varlistentry><term>DocbookSlidesHtml
+</term>
+<listitem><para>Slides in HTML format, with support for <literal>base.dir</literal>.
+</para>
+</listitem>
+</varlistentry>
+<varlistentry><term>DocbookXInclude
+</term>
+<listitem><para>Can be used to resolve XIncludes in a preprocessing step.
+</para>
+</listitem>
+</varlistentry>
+</variablelist>
+</section>
+<section id="more"><title>Need more?</title>
+<para>This work is still in a very basic state and hasn't been tested well
+with things like variant dirs, yet. Unicode problems and poor performance
+with large input files may occur. There will definitely arise the need for
+adding features, or a variable. Let us know if you can think of a nice
+improvement or have worked on a bugfix/patch with success. Enter your issues at the
+Launchpad bug tracker for the Docbook Tool, or write to the User General Discussion
+list of SCons at <literal>scons-users@scons.org</literal>.
+</para>
+</section>
+
+</article>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docs/pdf.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docs/pdf.xsl
new file mode 100644
index 0000000..25b4433
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/docs/pdf.xsl
@@ -0,0 +1,62 @@
+<?xml version='1.0'?>
+<!--
+
+ Copyright (c) 2001-2010 The SCons Foundation
+
+ Permission is hereby granted, free of charge, to any person obtaining
+ a copy of this software and associated documentation files (the
+ "Software"), to deal in the Software without restriction, including
+ without limitation the rights to use, copy, modify, merge, publish,
+ distribute, sublicense, and/or sell copies of the Software, and to
+ permit persons to whom the Software is furnished to do so, subject to
+ the following conditions:
+
+ The above copyright notice and this permission notice shall be included
+ in all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+ KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+ WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+-->
+
+<xsl:stylesheet
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:fo="http://www.w3.org/1999/XSL/Format"
+ version="1.0">
+
+ <xsl:import href="file:///usr/share/xml/docbook/stylesheet/docbook-xsl/fo/docbook.xsl"/>
+
+<xsl:param name="l10n.gentext.default.language" select="'en'"/>
+<xsl:param name="section.autolabel" select="1"></xsl:param>
+<xsl:param name="toc.indent.width" select="0"></xsl:param>
+<xsl:param name="body.start.indent">0pt</xsl:param>
+<xsl:param name="shade.verbatim" select="1"></xsl:param>
+<xsl:param name="generate.toc">
+/appendix toc,title
+article/appendix nop
+/article toc,title
+book toc,title,figure,table,example,equation
+/chapter toc,title
+part toc,title
+/preface toc,title
+reference toc,title
+/sect1 toc
+/sect2 toc
+/sect3 toc
+/sect4 toc
+/sect5 toc
+/section toc
+set toc,title
+</xsl:param>
+
+<xsl:template match="varlistentry/term">
+ <xsl:call-template name="inline.boldseq"/>
+</xsl:template>
+
+</xsl:stylesheet>
+
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/utils/xmldepend.xsl b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/utils/xmldepend.xsl
new file mode 100644
index 0000000..e70e1b5
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/docbook/utils/xmldepend.xsl
@@ -0,0 +1,156 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+
+<!--
+xmldepend.xsl - Find files that an XML document refers to/depends on.
+
+This stylesheet can be used to build Makefile dependency lists.
+
+Dependencies are defined as:
+- Files named in <xi:xinclude> elements. These must be traversed to
+ find any subdependencies, unless parse attribute is "text".
+- Files named by the fileref attribute of any other element.
+
+Who-to-blame:
+Paul DuBois
+paul@kitebird.com
+2005-08-16
+
+Change history:
+2005-08-16
+- Version 1.00.
+
+TODO:
+- add params for whether to produce debugging output, etc.
+-->
+
+<xsl:output method="text" indent="no"/>
+
+<!-- BEGIN PARAMETERS -->
+
+<xsl:param name="xmldepend.terminator" select="'&#10;'"/>
+
+<!-- END PARAMETERS -->
+
+<!-- BEGIN UTILITY TEMPLATES -->
+
+<!--
+ Given a pathname, return the basename (part after last '/'):
+ - If path contains no '/' separators, return entire value
+ - If path contains '/' separator, recurse using part after first one
+-->
+
+<xsl:template name="path-basename">
+ <xsl:param name="path"/>
+ <xsl:choose>
+ <xsl:when test="not(contains($path,'/'))">
+ <xsl:value-of select="$path"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="path-basename">
+ <xsl:with-param name="path" select="substring-after($path,'/')"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!--
+ Given a pathname, return the dirname (part up through last '/'):
+ - If path contains no '/' separators, return empty string
+ - If path contains '/' separator, return part up through last one
+ (which is the same as the part before the basename)
+-->
+
+<xsl:template name="path-dirname">
+ <xsl:param name="path"/>
+ <xsl:choose>
+ <xsl:when test="not(contains($path,'/'))">
+ <!-- return nothing -->
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:variable name="basename">
+ <xsl:call-template name="path-basename">
+ <xsl:with-param name="path" select="$path"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:value-of select="substring( $path,1,string-length($path) - string-length($basename) )"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<!-- END UTILITY TEMPLATES -->
+
+<!--
+ Find XInclude directives, spit out the href value that names
+ the included file, and process the file recursively if it's
+ an XML file.
+-->
+
+<xsl:template match="xi:include" xmlns:xi="http://www.w3.org/2001/XInclude">
+ <xsl:param name="curdir"/>
+
+ <xsl:variable name="href-dir">
+ <xsl:call-template name="path-dirname">
+ <xsl:with-param name="path" select="@href"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <!--
+ Display pathname of included file. It should be prefixed by
+ the directory of the referring file unless the included file
+ is an absolute pathname.
+ -->
+
+ <xsl:if test="not(starts-with(@href,'/'))">
+ <xsl:value-of select="$curdir"/>
+ </xsl:if>
+ <xsl:value-of select="@href"/>
+ <xsl:value-of select="$xmldepend.terminator"/>
+
+ <!--
+ Process included file (unless parse="text").
+ Pass directory of included file while processing it
+ so that relative pathnames referenced in the document
+ can be resolved properly.
+ -->
+
+ <xsl:if test="not(@parse = 'text')">
+ <xsl:for-each select="document(@href)">
+ <xsl:apply-templates>
+ <xsl:with-param name="curdir">
+ <xsl:if test="not(starts-with(@href,'/'))">
+ <xsl:value-of select="$curdir"/>
+ </xsl:if>
+ <xsl:value-of select="$href-dir"/>
+ </xsl:with-param>
+ </xsl:apply-templates>
+ </xsl:for-each>
+ </xsl:if>
+</xsl:template>
+
+<!--
+ Several elements have a fileref attribute. Spit out the file named
+ by any of them. Resolve the filename relative to the directory of
+ the referencing file unless the name is an absolute pathname.
+-->
+
+<xsl:template match="*[@fileref]">
+ <xsl:param name="curdir"/>
+
+ <xsl:if test="not(starts-with(@fileref,'/'))">
+ <xsl:value-of select="$curdir"/>
+ </xsl:if>
+ <xsl:value-of select="@fileref"/>
+ <xsl:value-of select="$xmldepend.terminator"/>
+</xsl:template>
+
+<!-- Identity transform, but keep track of current document directory -->
+
+<xsl:template match="*">
+ <xsl:param name="curdir"/>
+ <xsl:apply-templates select="*">
+ <xsl:with-param name="curdir" select="$curdir"/>
+ </xsl:apply-templates>
+</xsl:template>
+
+</xsl:stylesheet> \ No newline at end of file
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/dvi.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/dvi.py
new file mode 100644
index 0000000..4067b2a
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/dvi.py
@@ -0,0 +1,64 @@
+"""SCons.Tool.dvi
+
+Common DVI Builder definition for various other Tool modules that use it.
+
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import SCons.Builder
+import SCons.Tool
+
+DVIBuilder = None
+
+def generate(env):
+ try:
+ env['BUILDERS']['DVI']
+ except KeyError:
+ global DVIBuilder
+
+ if DVIBuilder is None:
+ # The suffix is hard-coded to '.dvi', not configurable via a
+ # construction variable like $DVISUFFIX, because the output
+ # file name is hard-coded within TeX.
+ DVIBuilder = SCons.Builder.Builder(action = {},
+ source_scanner = SCons.Tool.LaTeXScanner,
+ suffix = '.dvi',
+ emitter = {},
+ source_ext_match = None)
+
+ env['BUILDERS']['DVI'] = DVIBuilder
+
+def exists(env):
+ # This only puts a skeleton Builder in place, so if someone
+ # references this Tool directly, it's always "available."
+ return 1
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/dvi.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/dvi.xml
new file mode 100644
index 0000000..bfffc33
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/dvi.xml
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+__COPYRIGHT__
+
+This file is processed by the bin/SConsDoc.py module.
+See its __doc__ string for a discussion of the format.
+-->
+
+<!DOCTYPE sconsdoc [
+<!ENTITY % scons SYSTEM '../../../../doc/scons.mod'>
+%scons;
+<!ENTITY % builders-mod SYSTEM '../../../../doc/generated/builders.mod'>
+%builders-mod;
+<!ENTITY % functions-mod SYSTEM '../../../../doc/generated/functions.mod'>
+%functions-mod;
+<!ENTITY % tools-mod SYSTEM '../../../../doc/generated/tools.mod'>
+%tools-mod;
+<!ENTITY % variables-mod SYSTEM '../../../../doc/generated/variables.mod'>
+%variables-mod;
+]>
+
+<sconsdoc xmlns="http://www.scons.org/dbxsd/v1.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://www.scons.org/dbxsd/v1.0 http://www.scons.org/dbxsd/v1.0/scons.xsd">
+
+<tool name="dvi">
+<summary>
+<para>
+Attaches the &b-DVI; builder to the
+construction environment.
+</para>
+</summary>
+<sets>
+</sets>
+<uses>
+</uses>
+</tool>
+
+<builder name="DVI">
+<summary>
+<para>
+Builds a <filename>.dvi</filename> file
+from a <filename>.tex</filename>,
+<filename>.ltx</filename> or <filename>.latex</filename> input file.
+If the source file suffix is <filename>.tex</filename>,
+&scons;
+will examine the contents of the file;
+if the string
+<literal>\documentclass</literal>
+or
+<literal>\documentstyle</literal>
+is found, the file is assumed to be a LaTeX file and
+the target is built by invoking the &cv-link-LATEXCOM; command line;
+otherwise, the &cv-link-TEXCOM; command line is used.
+If the file is a LaTeX file,
+the
+&b-DVI;
+builder method will also examine the contents
+of the
+<filename>.aux</filename>
+file and invoke the &cv-link-BIBTEX; command line
+if the string
+<literal>bibdata</literal>
+is found,
+start &cv-link-MAKEINDEX; to generate an index if a
+<filename>.ind</filename>
+file is found
+and will examine the contents
+<filename>.log</filename>
+file and re-run the &cv-link-LATEXCOM; command
+if the log file says it is necessary.
+</para>
+
+<para>
+The suffix <filename>.dvi</filename>
+(hard-coded within TeX itself)
+is automatically added to the target
+if it is not already present.
+Examples:
+</para>
+
+<example_commands>
+# builds from aaa.tex
+env.DVI(target = 'aaa.dvi', source = 'aaa.tex')
+# builds bbb.dvi
+env.DVI(target = 'bbb', source = 'bbb.ltx')
+# builds from ccc.latex
+env.DVI(target = 'ccc.dvi', source = 'ccc.latex')
+</example_commands>
+</summary>
+</builder>
+
+
+</sconsdoc>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/dvipdf.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/dvipdf.py
new file mode 100644
index 0000000..f1e9513
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/dvipdf.py
@@ -0,0 +1,125 @@
+"""SCons.Tool.dvipdf
+
+Tool-specific initialization for dvipdf.
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import SCons.Action
+import SCons.Defaults
+import SCons.Tool.pdf
+import SCons.Tool.tex
+import SCons.Util
+
+_null = SCons.Scanner.LaTeX._null
+
+def DviPdfPsFunction(XXXDviAction, target = None, source= None, env=None):
+ """A builder for DVI files that sets the TEXPICTS environment
+ variable before running dvi2ps or dvipdf."""
+
+ try:
+ abspath = source[0].attributes.path
+ except AttributeError :
+ abspath = ''
+
+ saved_env = SCons.Scanner.LaTeX.modify_env_var(env, 'TEXPICTS', abspath)
+
+ result = XXXDviAction(target, source, env)
+
+ if saved_env is _null:
+ try:
+ del env['ENV']['TEXPICTS']
+ except KeyError:
+ pass # was never set
+ else:
+ env['ENV']['TEXPICTS'] = saved_env
+
+ return result
+
+def DviPdfFunction(target = None, source= None, env=None):
+ result = DviPdfPsFunction(PDFAction,target,source,env)
+ return result
+
+def DviPdfStrFunction(target = None, source= None, env=None):
+ """A strfunction for dvipdf that returns the appropriate
+ command string for the no_exec options."""
+ if env.GetOption("no_exec"):
+ result = env.subst('$DVIPDFCOM',0,target,source)
+ else:
+ result = ''
+ return result
+
+PDFAction = None
+DVIPDFAction = None
+
+def PDFEmitter(target, source, env):
+ """Strips any .aux or .log files from the input source list.
+ These are created by the TeX Builder that in all likelihood was
+ used to generate the .dvi file we're using as input, and we only
+ care about the .dvi file.
+ """
+ def strip_suffixes(n):
+ return not SCons.Util.splitext(str(n))[1] in ['.aux', '.log']
+ source = [src for src in source if strip_suffixes(src)]
+ return (target, source)
+
+def generate(env):
+ """Add Builders and construction variables for dvipdf to an Environment."""
+ global PDFAction
+ if PDFAction is None:
+ PDFAction = SCons.Action.Action('$DVIPDFCOM', '$DVIPDFCOMSTR')
+
+ global DVIPDFAction
+ if DVIPDFAction is None:
+ DVIPDFAction = SCons.Action.Action(DviPdfFunction, strfunction = DviPdfStrFunction)
+
+ from . import pdf
+ pdf.generate(env)
+
+ bld = env['BUILDERS']['PDF']
+ bld.add_action('.dvi', DVIPDFAction)
+ bld.add_emitter('.dvi', PDFEmitter)
+
+ env['DVIPDF'] = 'dvipdf'
+ env['DVIPDFFLAGS'] = SCons.Util.CLVar('')
+ env['DVIPDFCOM'] = 'cd ${TARGET.dir} && $DVIPDF $DVIPDFFLAGS ${SOURCE.file} ${TARGET.file}'
+
+ # Deprecated synonym.
+ env['PDFCOM'] = ['$DVIPDFCOM']
+
+def exists(env):
+ SCons.Tool.tex.generate_darwin(env)
+ return env.Detect('dvipdf')
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/dvipdf.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/dvipdf.xml
new file mode 100644
index 0000000..c0df409
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/dvipdf.xml
@@ -0,0 +1,84 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+__COPYRIGHT__
+
+This file is processed by the bin/SConsDoc.py module.
+See its __doc__ string for a discussion of the format.
+-->
+
+<!DOCTYPE sconsdoc [
+<!ENTITY % scons SYSTEM '../../../../doc/scons.mod'>
+%scons;
+<!ENTITY % builders-mod SYSTEM '../../../../doc/generated/builders.mod'>
+%builders-mod;
+<!ENTITY % functions-mod SYSTEM '../../../../doc/generated/functions.mod'>
+%functions-mod;
+<!ENTITY % tools-mod SYSTEM '../../../../doc/generated/tools.mod'>
+%tools-mod;
+<!ENTITY % variables-mod SYSTEM '../../../../doc/generated/variables.mod'>
+%variables-mod;
+]>
+
+<sconsdoc xmlns="http://www.scons.org/dbxsd/v1.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://www.scons.org/dbxsd/v1.0 http://www.scons.org/dbxsd/v1.0/scons.xsd">
+
+<tool name="dvipdf">
+<summary>
+<para>
+Sets construction variables for the dvipdf utility.
+</para>
+</summary>
+<sets>
+<item>DVIPDF</item>
+<item>DVIPDFFLAGS</item>
+<item>DVIPDFCOM</item>
+</sets>
+<uses>
+<item>DVIPDFCOMSTR</item>
+</uses>
+</tool>
+
+<cvar name="DVIPDF">
+<summary>
+<para>
+The TeX DVI file to PDF file converter.
+</para>
+</summary>
+</cvar>
+
+<cvar name="DVIPDFFLAGS">
+<summary>
+<para>
+General options passed to the TeX DVI file to PDF file converter.
+</para>
+</summary>
+</cvar>
+
+<cvar name="DVIPDFCOM">
+<summary>
+<para>
+The command line used to convert TeX DVI files into a PDF file.
+</para>
+</summary>
+</cvar>
+
+<cvar name="DVIPDFCOMSTR">
+<summary>
+<para>
+The string displayed when a TeX DVI file
+is converted into a PDF file.
+If this is not set, then &cv-link-DVIPDFCOM; (the command line) is displayed.
+</para>
+</summary>
+</cvar>
+
+<cvar name="PDFCOM">
+<summary>
+<para>
+A deprecated synonym for &cv-link-DVIPDFCOM;.
+</para>
+</summary>
+</cvar>
+
+</sconsdoc>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/dvips.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/dvips.py
new file mode 100644
index 0000000..198bda0
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/dvips.py
@@ -0,0 +1,95 @@
+"""SCons.Tool.dvips
+
+Tool-specific initialization for dvips.
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import SCons.Action
+import SCons.Builder
+import SCons.Tool.dvipdf
+import SCons.Util
+
+def DviPsFunction(target = None, source= None, env=None):
+ result = SCons.Tool.dvipdf.DviPdfPsFunction(PSAction,target,source,env)
+ return result
+
+def DviPsStrFunction(target = None, source= None, env=None):
+ """A strfunction for dvipdf that returns the appropriate
+ command string for the no_exec options."""
+ if env.GetOption("no_exec"):
+ result = env.subst('$PSCOM',0,target,source)
+ else:
+ result = ''
+ return result
+
+PSAction = None
+DVIPSAction = None
+PSBuilder = None
+
+def generate(env):
+ """Add Builders and construction variables for dvips to an Environment."""
+ global PSAction
+ if PSAction is None:
+ PSAction = SCons.Action.Action('$PSCOM', '$PSCOMSTR')
+
+ global DVIPSAction
+ if DVIPSAction is None:
+ DVIPSAction = SCons.Action.Action(DviPsFunction, strfunction = DviPsStrFunction)
+
+ global PSBuilder
+ if PSBuilder is None:
+ PSBuilder = SCons.Builder.Builder(action = PSAction,
+ prefix = '$PSPREFIX',
+ suffix = '$PSSUFFIX',
+ src_suffix = '.dvi',
+ src_builder = 'DVI',
+ single_source=True)
+
+ env['BUILDERS']['PostScript'] = PSBuilder
+
+ env['DVIPS'] = 'dvips'
+ env['DVIPSFLAGS'] = SCons.Util.CLVar('')
+ # I'm not quite sure I got the directories and filenames right for variant_dir
+ # We need to be in the correct directory for the sake of latex \includegraphics eps included files.
+ env['PSCOM'] = 'cd ${TARGET.dir} && $DVIPS $DVIPSFLAGS -o ${TARGET.file} ${SOURCE.file}'
+ env['PSPREFIX'] = ''
+ env['PSSUFFIX'] = '.ps'
+
+def exists(env):
+ SCons.Tool.tex.generate_darwin(env)
+ return env.Detect('dvips')
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/dvips.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/dvips.xml
new file mode 100644
index 0000000..5d4a29f
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/dvips.xml
@@ -0,0 +1,118 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+__COPYRIGHT__
+
+This file is processed by the bin/SConsDoc.py module.
+See its __doc__ string for a discussion of the format.
+-->
+
+<!DOCTYPE sconsdoc [
+<!ENTITY % scons SYSTEM '../../../../doc/scons.mod'>
+%scons;
+<!ENTITY % builders-mod SYSTEM '../../../../doc/generated/builders.mod'>
+%builders-mod;
+<!ENTITY % functions-mod SYSTEM '../../../../doc/generated/functions.mod'>
+%functions-mod;
+<!ENTITY % tools-mod SYSTEM '../../../../doc/generated/tools.mod'>
+%tools-mod;
+<!ENTITY % variables-mod SYSTEM '../../../../doc/generated/variables.mod'>
+%variables-mod;
+]>
+
+<sconsdoc xmlns="http://www.scons.org/dbxsd/v1.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://www.scons.org/dbxsd/v1.0 http://www.scons.org/dbxsd/v1.0/scons.xsd">
+
+<tool name="dvips">
+<summary>
+<para>
+Sets construction variables for the dvips utility.
+</para>
+</summary>
+<sets>
+<item>DVIPS</item>
+<item>DVIPSFLAGS</item>
+<item>PSCOM</item>
+<item>PSPREFIX</item>
+<item>PSSUFFIX</item>
+</sets>
+<uses>
+<item>PSCOMSTR</item>
+</uses>
+</tool>
+
+<builder name="PostScript">
+<summary>
+<para>
+Builds a <filename>.ps</filename> file
+from a <filename>.dvi</filename> input file
+(or, by extension, a <filename>.tex</filename>,
+<filename>.ltx</filename>,
+or
+<filename>.latex</filename> input file).
+The suffix specified by the &cv-link-PSSUFFIX; construction variable
+(<filename>.ps</filename> by default)
+is added automatically to the target
+if it is not already present. Example:
+</para>
+
+<example_commands>
+# builds from aaa.tex
+env.PostScript(target = 'aaa.ps', source = 'aaa.tex')
+# builds bbb.ps from bbb.dvi
+env.PostScript(target = 'bbb', source = 'bbb.dvi')
+</example_commands>
+</summary>
+</builder>
+
+<cvar name="DVIPS">
+<summary>
+<para>
+The TeX DVI file to PostScript converter.
+</para>
+</summary>
+</cvar>
+
+<cvar name="DVIPSFLAGS">
+<summary>
+<para>
+General options passed to the TeX DVI file to PostScript converter.
+</para>
+</summary>
+</cvar>
+
+<cvar name="PSCOM">
+<summary>
+<para>
+The command line used to convert TeX DVI files into a PostScript file.
+</para>
+</summary>
+</cvar>
+
+<cvar name="PSCOMSTR">
+<summary>
+<para>
+The string displayed when a TeX DVI file
+is converted into a PostScript file.
+If this is not set, then &cv-link-PSCOM; (the command line) is displayed.
+</para>
+</summary>
+</cvar>
+
+<cvar name="PSPREFIX">
+<summary>
+<para>
+The prefix used for PostScript file names.
+</para>
+</summary>
+</cvar>
+
+<cvar name="PSSUFFIX">
+<summary>
+<para>
+The prefix used for PostScript file names.
+</para>
+</summary>
+</cvar>
+
+</sconsdoc>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/f03.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/f03.py
new file mode 100644
index 0000000..6c30971
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/f03.py
@@ -0,0 +1,63 @@
+"""engine.SCons.Tool.f03
+
+Tool-specific initialization for the generic Posix f03 Fortran compiler.
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import SCons.Defaults
+import SCons.Tool
+import SCons.Util
+from . import fortran
+from SCons.Tool.FortranCommon import add_all_to_env, add_f03_to_env
+
+compilers = ['f03']
+
+def generate(env):
+ add_all_to_env(env)
+ add_f03_to_env(env)
+
+ fcomp = env.Detect(compilers) or 'f03'
+ env['F03'] = fcomp
+ env['SHF03'] = fcomp
+
+ env['FORTRAN'] = fcomp
+ env['SHFORTRAN'] = fcomp
+
+
+def exists(env):
+ return env.Detect(compilers)
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/f03.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/f03.xml
new file mode 100644
index 0000000..0b3f786
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/f03.xml
@@ -0,0 +1,311 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+__COPYRIGHT__
+
+This file is processed by the bin/SConsDoc.py module.
+See its __doc__ string for a discussion of the format.
+-->
+
+<!DOCTYPE sconsdoc [
+<!ENTITY % scons SYSTEM '../../../../doc/scons.mod'>
+%scons;
+<!ENTITY % builders-mod SYSTEM '../../../../doc/generated/builders.mod'>
+%builders-mod;
+<!ENTITY % functions-mod SYSTEM '../../../../doc/generated/functions.mod'>
+%functions-mod;
+<!ENTITY % tools-mod SYSTEM '../../../../doc/generated/tools.mod'>
+%tools-mod;
+<!ENTITY % variables-mod SYSTEM '../../../../doc/generated/variables.mod'>
+%variables-mod;
+]>
+
+<sconsdoc xmlns="http://www.scons.org/dbxsd/v1.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://www.scons.org/dbxsd/v1.0 http://www.scons.org/dbxsd/v1.0/scons.xsd">
+
+<tool name="f03">
+<summary>
+<para>
+Set construction variables for generic POSIX Fortran 03 compilers.
+</para>
+</summary>
+<sets>
+<item>F03</item>
+<item>F03FLAGS</item>
+<item>F03COM</item>
+<item>F03PPCOM</item>
+<item>SHF03</item>
+<item>SHF03FLAGS</item>
+<item>SHF03COM</item>
+<item>SHF03PPCOM</item>
+<item>_F03INCFLAGS</item>
+</sets>
+<uses>
+<item>F03COMSTR</item>
+<item>F03PPCOMSTR</item>
+<item>SHF03COMSTR</item>
+<item>SHF03PPCOMSTR</item>
+</uses>
+</tool>
+
+<cvar name="F03">
+<summary>
+<para>
+The Fortran 03 compiler.
+You should normally set the &cv-link-FORTRAN; variable,
+which specifies the default Fortran compiler
+for all Fortran versions.
+You only need to set &cv-link-F03; if you need to use a specific compiler
+or compiler version for Fortran 03 files.
+</para>
+</summary>
+</cvar>
+
+<cvar name="F03COM">
+<summary>
+<para>
+The command line used to compile a Fortran 03 source file to an object file.
+You only need to set &cv-link-F03COM; if you need to use a specific
+command line for Fortran 03 files.
+You should normally set the &cv-link-FORTRANCOM; variable,
+which specifies the default command line
+for all Fortran versions.
+</para>
+</summary>
+</cvar>
+
+<cvar name="F03COMSTR">
+<summary>
+<para>
+The string displayed when a Fortran 03 source file
+is compiled to an object file.
+If this is not set, then &cv-link-F03COM; or &cv-link-FORTRANCOM;
+(the command line) is displayed.
+</para>
+</summary>
+</cvar>
+
+<cvar name="F03FILESUFFIXES">
+<summary>
+<para>
+The list of file extensions for which the F03 dialect will be used. By
+default, this is ['.f03']
+</para>
+</summary>
+</cvar>
+
+<cvar name="F03PPFILESUFFIXES">
+<summary>
+<para>
+The list of file extensions for which the compilation + preprocessor pass for
+F03 dialect will be used. By default, this is empty
+</para>
+</summary>
+</cvar>
+
+<cvar name="F03FLAGS">
+<summary>
+<para>
+General user-specified options that are passed to the Fortran 03 compiler.
+Note that this variable does
+<emphasis>not</emphasis>
+contain
+<option>-I</option>
+(or similar) include search path options
+that scons generates automatically from &cv-link-F03PATH;.
+See
+&cv-link-_F03INCFLAGS;
+below,
+for the variable that expands to those options.
+You only need to set &cv-link-F03FLAGS; if you need to define specific
+user options for Fortran 03 files.
+You should normally set the &cv-link-FORTRANFLAGS; variable,
+which specifies the user-specified options
+passed to the default Fortran compiler
+for all Fortran versions.
+</para>
+</summary>
+</cvar>
+
+<cvar name="_F03INCFLAGS">
+<summary>
+<para>
+An automatically-generated construction variable
+containing the Fortran 03 compiler command-line options
+for specifying directories to be searched for include files.
+The value of &cv-link-_F03INCFLAGS; is created
+by appending &cv-link-INCPREFIX; and &cv-link-INCSUFFIX;
+to the beginning and end
+of each directory in &cv-link-F03PATH;.
+</para>
+</summary>
+</cvar>
+
+<cvar name="F03PATH">
+<summary>
+<para>
+The list of directories that the Fortran 03 compiler will search for include
+directories. The implicit dependency scanner will search these
+directories for include files. Don't explicitly put include directory
+arguments in &cv-link-F03FLAGS; because the result will be non-portable
+and the directories will not be searched by the dependency scanner. Note:
+directory names in &cv-link-F03PATH; will be looked-up relative to the SConscript
+directory when they are used in a command. To force
+&scons;
+to look-up a directory relative to the root of the source tree use #:
+You only need to set &cv-link-F03PATH; if you need to define a specific
+include path for Fortran 03 files.
+You should normally set the &cv-link-FORTRANPATH; variable,
+which specifies the include path
+for the default Fortran compiler
+for all Fortran versions.
+</para>
+
+<example_commands>
+env = Environment(F03PATH='#/include')
+</example_commands>
+
+<para>
+The directory look-up can also be forced using the
+&Dir;()
+function:
+</para>
+
+<example_commands>
+include = Dir('include')
+env = Environment(F03PATH=include)
+</example_commands>
+
+<para>
+The directory list will be added to command lines
+through the automatically-generated
+&cv-link-_F03INCFLAGS;
+construction variable,
+which is constructed by
+appending the values of the
+&cv-link-INCPREFIX; and &cv-link-INCSUFFIX;
+construction variables
+to the beginning and end
+of each directory in &cv-link-F03PATH;.
+Any command lines you define that need
+the F03PATH directory list should
+include &cv-link-_F03INCFLAGS;:
+</para>
+
+<example_commands>
+env = Environment(F03COM="my_compiler $_F03INCFLAGS -c -o $TARGET $SOURCE")
+</example_commands>
+</summary>
+</cvar>
+
+<cvar name="F03PPCOM">
+<summary>
+<para>
+The command line used to compile a Fortran 03 source file to an object file
+after first running the file through the C preprocessor.
+Any options specified in the &cv-link-F03FLAGS; and &cv-link-CPPFLAGS; construction variables
+are included on this command line.
+You only need to set &cv-link-F03PPCOM; if you need to use a specific
+C-preprocessor command line for Fortran 03 files.
+You should normally set the &cv-link-FORTRANPPCOM; variable,
+which specifies the default C-preprocessor command line
+for all Fortran versions.
+</para>
+</summary>
+</cvar>
+
+<cvar name="F03PPCOMSTR">
+<summary>
+<para>
+The string displayed when a Fortran 03 source file
+is compiled to an object file
+after first running the file through the C preprocessor.
+If this is not set, then &cv-link-F03PPCOM; or &cv-link-FORTRANPPCOM;
+(the command line) is displayed.
+</para>
+</summary>
+</cvar>
+
+<cvar name="SHF03">
+<summary>
+<para>
+The Fortran 03 compiler used for generating shared-library objects.
+You should normally set the &cv-link-SHFORTRAN; variable,
+which specifies the default Fortran compiler
+for all Fortran versions.
+You only need to set &cv-link-SHF03; if you need to use a specific compiler
+or compiler version for Fortran 03 files.
+</para>
+</summary>
+</cvar>
+
+<cvar name="SHF03COM">
+<summary>
+<para>
+The command line used to compile a Fortran 03 source file
+to a shared-library object file.
+You only need to set &cv-link-SHF03COM; if you need to use a specific
+command line for Fortran 03 files.
+You should normally set the &cv-link-SHFORTRANCOM; variable,
+which specifies the default command line
+for all Fortran versions.
+</para>
+</summary>
+</cvar>
+
+<cvar name="SHF03COMSTR">
+<summary>
+<para>
+The string displayed when a Fortran 03 source file
+is compiled to a shared-library object file.
+If this is not set, then &cv-link-SHF03COM; or &cv-link-SHFORTRANCOM;
+(the command line) is displayed.
+</para>
+</summary>
+</cvar>
+
+<cvar name="SHF03FLAGS">
+<summary>
+<para>
+Options that are passed to the Fortran 03 compiler
+to generated shared-library objects.
+You only need to set &cv-link-SHF03FLAGS; if you need to define specific
+user options for Fortran 03 files.
+You should normally set the &cv-link-SHFORTRANFLAGS; variable,
+which specifies the user-specified options
+passed to the default Fortran compiler
+for all Fortran versions.
+</para>
+</summary>
+</cvar>
+
+<cvar name="SHF03PPCOM">
+<summary>
+<para>
+The command line used to compile a Fortran 03 source file to a
+shared-library object file
+after first running the file through the C preprocessor.
+Any options specified in the &cv-link-SHF03FLAGS; and &cv-link-CPPFLAGS; construction variables
+are included on this command line.
+You only need to set &cv-link-SHF03PPCOM; if you need to use a specific
+C-preprocessor command line for Fortran 03 files.
+You should normally set the &cv-link-SHFORTRANPPCOM; variable,
+which specifies the default C-preprocessor command line
+for all Fortran versions.
+</para>
+</summary>
+</cvar>
+
+<cvar name="SHF03PPCOMSTR">
+<summary>
+<para>
+The string displayed when a Fortran 03 source file
+is compiled to a shared-library object file
+after first running the file through the C preprocessor.
+If this is not set, then &cv-link-SHF03PPCOM; or &cv-link-SHFORTRANPPCOM;
+(the command line) is displayed.
+</para>
+</summary>
+</cvar>
+
+</sconsdoc>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/f08.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/f08.py
new file mode 100644
index 0000000..7fa5872
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/f08.py
@@ -0,0 +1,65 @@
+"""engine.SCons.Tool.f08
+
+Tool-specific initialization for the generic Posix f08 Fortran compiler.
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+
+"""
+
+from __future__ import absolute_import
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import SCons.Defaults
+import SCons.Tool
+import SCons.Util
+from . import fortran
+from SCons.Tool.FortranCommon import add_all_to_env, add_f08_to_env
+
+compilers = ['f08']
+
+def generate(env):
+ add_all_to_env(env)
+ add_f08_to_env(env)
+
+ fcomp = env.Detect(compilers) or 'f08'
+ env['F08'] = fcomp
+ env['SHF08'] = fcomp
+
+ env['FORTRAN'] = fcomp
+ env['SHFORTRAN'] = fcomp
+
+
+def exists(env):
+ return env.Detect(compilers)
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/f08.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/f08.xml
new file mode 100644
index 0000000..6a49c75
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/f08.xml
@@ -0,0 +1,311 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+__COPYRIGHT__
+
+This file is processed by the bin/SConsDoc.py module.
+See its __doc__ string for a discussion of the format.
+-->
+
+<!DOCTYPE sconsdoc [
+<!ENTITY % scons SYSTEM '../../../../doc/scons.mod'>
+%scons;
+<!ENTITY % builders-mod SYSTEM '../../../../doc/generated/builders.mod'>
+%builders-mod;
+<!ENTITY % functions-mod SYSTEM '../../../../doc/generated/functions.mod'>
+%functions-mod;
+<!ENTITY % tools-mod SYSTEM '../../../../doc/generated/tools.mod'>
+%tools-mod;
+<!ENTITY % variables-mod SYSTEM '../../../../doc/generated/variables.mod'>
+%variables-mod;
+]>
+
+<sconsdoc xmlns="http://www.scons.org/dbxsd/v1.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://www.scons.org/dbxsd/v1.0 http://www.scons.org/dbxsd/v1.0/scons.xsd">
+
+<tool name="f08">
+<summary>
+<para>
+Set construction variables for generic POSIX Fortran 08 compilers.
+</para>
+</summary>
+<sets>
+<item>F08</item>
+<item>F08FLAGS</item>
+<item>F08COM</item>
+<item>F08PPCOM</item>
+<item>SHF08</item>
+<item>SHF08FLAGS</item>
+<item>SHF08COM</item>
+<item>SHF08PPCOM</item>
+<item>_F08INCFLAGS</item>
+</sets>
+<uses>
+<item>F08COMSTR</item>
+<item>F08PPCOMSTR</item>
+<item>SHF08COMSTR</item>
+<item>SHF08PPCOMSTR</item>
+</uses>
+</tool>
+
+<cvar name="F08">
+<summary>
+<para>
+The Fortran 08 compiler.
+You should normally set the &cv-link-FORTRAN; variable,
+which specifies the default Fortran compiler
+for all Fortran versions.
+You only need to set &cv-link-F08; if you need to use a specific compiler
+or compiler version for Fortran 08 files.
+</para>
+</summary>
+</cvar>
+
+<cvar name="F08COM">
+<summary>
+<para>
+The command line used to compile a Fortran 08 source file to an object file.
+You only need to set &cv-link-F08COM; if you need to use a specific
+command line for Fortran 08 files.
+You should normally set the &cv-link-FORTRANCOM; variable,
+which specifies the default command line
+for all Fortran versions.
+</para>
+</summary>
+</cvar>
+
+<cvar name="F08COMSTR">
+<summary>
+<para>
+The string displayed when a Fortran 08 source file
+is compiled to an object file.
+If this is not set, then &cv-link-F08COM; or &cv-link-FORTRANCOM;
+(the command line) is displayed.
+</para>
+</summary>
+</cvar>
+
+<cvar name="F08FILESUFFIXES">
+<summary>
+<para>
+The list of file extensions for which the F08 dialect will be used. By
+default, this is ['.f08']
+</para>
+</summary>
+</cvar>
+
+<cvar name="F08PPFILESUFFIXES">
+<summary>
+<para>
+The list of file extensions for which the compilation + preprocessor pass for
+F08 dialect will be used. By default, this is empty
+</para>
+</summary>
+</cvar>
+
+<cvar name="F08FLAGS">
+<summary>
+<para>
+General user-specified options that are passed to the Fortran 08 compiler.
+Note that this variable does
+<emphasis>not</emphasis>
+contain
+<option>-I</option>
+(or similar) include search path options
+that scons generates automatically from &cv-link-F08PATH;.
+See
+&cv-link-_F08INCFLAGS;
+below,
+for the variable that expands to those options.
+You only need to set &cv-link-F08FLAGS; if you need to define specific
+user options for Fortran 08 files.
+You should normally set the &cv-link-FORTRANFLAGS; variable,
+which specifies the user-specified options
+passed to the default Fortran compiler
+for all Fortran versions.
+</para>
+</summary>
+</cvar>
+
+<cvar name="_F08INCFLAGS">
+<summary>
+<para>
+An automatically-generated construction variable
+containing the Fortran 08 compiler command-line options
+for specifying directories to be searched for include files.
+The value of &cv-link-_F08INCFLAGS; is created
+by appending &cv-link-INCPREFIX; and &cv-link-INCSUFFIX;
+to the beginning and end
+of each directory in &cv-link-F08PATH;.
+</para>
+</summary>
+</cvar>
+
+<cvar name="F08PATH">
+<summary>
+<para>
+The list of directories that the Fortran 08 compiler will search for include
+directories. The implicit dependency scanner will search these
+directories for include files. Don't explicitly put include directory
+arguments in &cv-link-F08FLAGS; because the result will be non-portable
+and the directories will not be searched by the dependency scanner. Note:
+directory names in &cv-link-F08PATH; will be looked-up relative to the SConscript
+directory when they are used in a command. To force
+&scons;
+to look-up a directory relative to the root of the source tree use #:
+You only need to set &cv-link-F08PATH; if you need to define a specific
+include path for Fortran 08 files.
+You should normally set the &cv-link-FORTRANPATH; variable,
+which specifies the include path
+for the default Fortran compiler
+for all Fortran versions.
+</para>
+
+<example_commands>
+env = Environment(F08PATH='#/include')
+</example_commands>
+
+<para>
+The directory look-up can also be forced using the
+&Dir;()
+function:
+</para>
+
+<example_commands>
+include = Dir('include')
+env = Environment(F08PATH=include)
+</example_commands>
+
+<para>
+The directory list will be added to command lines
+through the automatically-generated
+&cv-link-_F08INCFLAGS;
+construction variable,
+which is constructed by
+appending the values of the
+&cv-link-INCPREFIX; and &cv-link-INCSUFFIX;
+construction variables
+to the beginning and end
+of each directory in &cv-link-F08PATH;.
+Any command lines you define that need
+the F08PATH directory list should
+include &cv-link-_F08INCFLAGS;:
+</para>
+
+<example_commands>
+env = Environment(F08COM="my_compiler $_F08INCFLAGS -c -o $TARGET $SOURCE")
+</example_commands>
+</summary>
+</cvar>
+
+<cvar name="F08PPCOM">
+<summary>
+<para>
+The command line used to compile a Fortran 08 source file to an object file
+after first running the file through the C preprocessor.
+Any options specified in the &cv-link-F08FLAGS; and &cv-link-CPPFLAGS; construction variables
+are included on this command line.
+You only need to set &cv-link-F08PPCOM; if you need to use a specific
+C-preprocessor command line for Fortran 08 files.
+You should normally set the &cv-link-FORTRANPPCOM; variable,
+which specifies the default C-preprocessor command line
+for all Fortran versions.
+</para>
+</summary>
+</cvar>
+
+<cvar name="F08PPCOMSTR">
+<summary>
+<para>
+The string displayed when a Fortran 08 source file
+is compiled to an object file
+after first running the file through the C preprocessor.
+If this is not set, then &cv-link-F08PPCOM; or &cv-link-FORTRANPPCOM;
+(the command line) is displayed.
+</para>
+</summary>
+</cvar>
+
+<cvar name="SHF08">
+<summary>
+<para>
+The Fortran 08 compiler used for generating shared-library objects.
+You should normally set the &cv-link-SHFORTRAN; variable,
+which specifies the default Fortran compiler
+for all Fortran versions.
+You only need to set &cv-link-SHF08; if you need to use a specific compiler
+or compiler version for Fortran 08 files.
+</para>
+</summary>
+</cvar>
+
+<cvar name="SHF08COM">
+<summary>
+<para>
+The command line used to compile a Fortran 08 source file
+to a shared-library object file.
+You only need to set &cv-link-SHF08COM; if you need to use a specific
+command line for Fortran 08 files.
+You should normally set the &cv-link-SHFORTRANCOM; variable,
+which specifies the default command line
+for all Fortran versions.
+</para>
+</summary>
+</cvar>
+
+<cvar name="SHF08COMSTR">
+<summary>
+<para>
+The string displayed when a Fortran 08 source file
+is compiled to a shared-library object file.
+If this is not set, then &cv-link-SHF08COM; or &cv-link-SHFORTRANCOM;
+(the command line) is displayed.
+</para>
+</summary>
+</cvar>
+
+<cvar name="SHF08FLAGS">
+<summary>
+<para>
+Options that are passed to the Fortran 08 compiler
+to generated shared-library objects.
+You only need to set &cv-link-SHF08FLAGS; if you need to define specific
+user options for Fortran 08 files.
+You should normally set the &cv-link-SHFORTRANFLAGS; variable,
+which specifies the user-specified options
+passed to the default Fortran compiler
+for all Fortran versions.
+</para>
+</summary>
+</cvar>
+
+<cvar name="SHF08PPCOM">
+<summary>
+<para>
+The command line used to compile a Fortran 08 source file to a
+shared-library object file
+after first running the file through the C preprocessor.
+Any options specified in the &cv-link-SHF08FLAGS; and &cv-link-CPPFLAGS; construction variables
+are included on this command line.
+You only need to set &cv-link-SHF08PPCOM; if you need to use a specific
+C-preprocessor command line for Fortran 08 files.
+You should normally set the &cv-link-SHFORTRANPPCOM; variable,
+which specifies the default C-preprocessor command line
+for all Fortran versions.
+</para>
+</summary>
+</cvar>
+
+<cvar name="SHF08PPCOMSTR">
+<summary>
+<para>
+The string displayed when a Fortran 08 source file
+is compiled to a shared-library object file
+after first running the file through the C preprocessor.
+If this is not set, then &cv-link-SHF08PPCOM; or &cv-link-SHFORTRANPPCOM;
+(the command line) is displayed.
+</para>
+</summary>
+</cvar>
+
+</sconsdoc>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/f77.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/f77.py
new file mode 100644
index 0000000..af47024
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/f77.py
@@ -0,0 +1,62 @@
+"""engine.SCons.Tool.f77
+
+Tool-specific initialization for the generic Posix f77 Fortran compiler.
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import SCons.Defaults
+import SCons.Scanner.Fortran
+import SCons.Tool
+import SCons.Util
+from SCons.Tool.FortranCommon import add_all_to_env, add_f77_to_env
+
+compilers = ['f77']
+
+def generate(env):
+ add_all_to_env(env)
+ add_f77_to_env(env)
+
+ fcomp = env.Detect(compilers) or 'f77'
+ env['F77'] = fcomp
+ env['SHF77'] = fcomp
+
+ env['FORTRAN'] = fcomp
+ env['SHFORTRAN'] = fcomp
+
+def exists(env):
+ return env.Detect(compilers)
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/f77.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/f77.xml
new file mode 100644
index 0000000..d07931b
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/f77.xml
@@ -0,0 +1,324 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+__COPYRIGHT__
+
+This file is processed by the bin/SConsDoc.py module.
+See its __doc__ string for a discussion of the format.
+-->
+
+<!DOCTYPE sconsdoc [
+<!ENTITY % scons SYSTEM '../../../../doc/scons.mod'>
+%scons;
+<!ENTITY % builders-mod SYSTEM '../../../../doc/generated/builders.mod'>
+%builders-mod;
+<!ENTITY % functions-mod SYSTEM '../../../../doc/generated/functions.mod'>
+%functions-mod;
+<!ENTITY % tools-mod SYSTEM '../../../../doc/generated/tools.mod'>
+%tools-mod;
+<!ENTITY % variables-mod SYSTEM '../../../../doc/generated/variables.mod'>
+%variables-mod;
+]>
+
+<sconsdoc xmlns="http://www.scons.org/dbxsd/v1.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://www.scons.org/dbxsd/v1.0 http://www.scons.org/dbxsd/v1.0/scons.xsd">
+
+<tool name="f77">
+<summary>
+<para>
+Set construction variables for generic POSIX Fortran 77 compilers.
+</para>
+</summary>
+<sets>
+<item>F77</item>
+<item>F77FLAGS</item>
+<item>F77COM</item>
+<item>F77PPCOM</item>
+<item>F77FILESUFFIXES</item>
+<item>F77PPFILESUFFIXES</item>
+<item>FORTRAN</item>
+<item>FORTRANFLAGS</item>
+<item>FORTRANCOM</item>
+<item>SHF77</item>
+<item>SHF77FLAGS</item>
+<item>SHF77COM</item>
+<item>SHF77PPCOM</item>
+<item>SHFORTRAN</item>
+<item>SHFORTRANFLAGS</item>
+<item>SHFORTRANCOM</item>
+<item>SHFORTRANPPCOM</item>
+<item>_F77INCFLAGS</item>
+</sets>
+<uses>
+<item>F77COMSTR</item>
+<item>F77PPCOMSTR</item>
+<item>FORTRANCOMSTR</item>
+<item>FORTRANPPCOMSTR</item>
+<item>SHF77COMSTR</item>
+<item>SHF77PPCOMSTR</item>
+<item>SHFORTRANCOMSTR</item>
+<item>SHFORTRANPPCOMSTR</item>
+</uses>
+</tool>
+
+<cvar name="F77">
+<summary>
+<para>
+The Fortran 77 compiler.
+You should normally set the &cv-link-FORTRAN; variable,
+which specifies the default Fortran compiler
+for all Fortran versions.
+You only need to set &cv-link-F77; if you need to use a specific compiler
+or compiler version for Fortran 77 files.
+</para>
+</summary>
+</cvar>
+
+<cvar name="F77COM">
+<summary>
+<para>
+The command line used to compile a Fortran 77 source file to an object file.
+You only need to set &cv-link-F77COM; if you need to use a specific
+command line for Fortran 77 files.
+You should normally set the &cv-link-FORTRANCOM; variable,
+which specifies the default command line
+for all Fortran versions.
+</para>
+</summary>
+</cvar>
+
+<cvar name="F77FILESUFFIXES">
+<summary>
+<para>
+The list of file extensions for which the F77 dialect will be used. By
+default, this is ['.f77']
+</para>
+</summary>
+</cvar>
+
+<cvar name="F77PPFILESUFFIXES">
+<summary>
+<para>
+The list of file extensions for which the compilation + preprocessor pass for
+F77 dialect will be used. By default, this is empty
+</para>
+</summary>
+</cvar>
+
+<cvar name="F77COMSTR">
+<summary>
+<para>
+The string displayed when a Fortran 77 source file
+is compiled to an object file.
+If this is not set, then &cv-link-F77COM; or &cv-link-FORTRANCOM;
+(the command line) is displayed.
+</para>
+</summary>
+</cvar>
+
+<cvar name="F77FLAGS">
+<summary>
+<para>
+General user-specified options that are passed to the Fortran 77 compiler.
+Note that this variable does
+<emphasis>not</emphasis>
+contain
+<option>-I</option>
+(or similar) include search path options
+that scons generates automatically from &cv-link-F77PATH;.
+See
+&cv-link-_F77INCFLAGS;
+below,
+for the variable that expands to those options.
+You only need to set &cv-link-F77FLAGS; if you need to define specific
+user options for Fortran 77 files.
+You should normally set the &cv-link-FORTRANFLAGS; variable,
+which specifies the user-specified options
+passed to the default Fortran compiler
+for all Fortran versions.
+</para>
+</summary>
+</cvar>
+
+<cvar name="_F77INCFLAGS">
+<summary>
+<para>
+An automatically-generated construction variable
+containing the Fortran 77 compiler command-line options
+for specifying directories to be searched for include files.
+The value of &cv-link-_F77INCFLAGS; is created
+by appending &cv-link-INCPREFIX; and &cv-link-INCSUFFIX;
+to the beginning and end
+of each directory in &cv-link-F77PATH;.
+</para>
+</summary>
+</cvar>
+
+<cvar name="F77PATH">
+<summary>
+<para>
+The list of directories that the Fortran 77 compiler will search for include
+directories. The implicit dependency scanner will search these
+directories for include files. Don't explicitly put include directory
+arguments in &cv-link-F77FLAGS; because the result will be non-portable
+and the directories will not be searched by the dependency scanner. Note:
+directory names in &cv-link-F77PATH; will be looked-up relative to the SConscript
+directory when they are used in a command. To force
+&scons;
+to look-up a directory relative to the root of the source tree use #:
+You only need to set &cv-link-F77PATH; if you need to define a specific
+include path for Fortran 77 files.
+You should normally set the &cv-link-FORTRANPATH; variable,
+which specifies the include path
+for the default Fortran compiler
+for all Fortran versions.
+</para>
+
+<example_commands>
+env = Environment(F77PATH='#/include')
+</example_commands>
+
+<para>
+The directory look-up can also be forced using the
+&Dir;()
+function:
+</para>
+
+<example_commands>
+include = Dir('include')
+env = Environment(F77PATH=include)
+</example_commands>
+
+<para>
+The directory list will be added to command lines
+through the automatically-generated
+&cv-link-_F77INCFLAGS;
+construction variable,
+which is constructed by
+appending the values of the
+&cv-link-INCPREFIX; and &cv-link-INCSUFFIX;
+construction variables
+to the beginning and end
+of each directory in &cv-link-F77PATH;.
+Any command lines you define that need
+the F77PATH directory list should
+include &cv-link-_F77INCFLAGS;:
+</para>
+
+<example_commands>
+env = Environment(F77COM="my_compiler $_F77INCFLAGS -c -o $TARGET $SOURCE")
+</example_commands>
+</summary>
+</cvar>
+
+<cvar name="F77PPCOM">
+<summary>
+<para>
+The command line used to compile a Fortran 77 source file to an object file
+after first running the file through the C preprocessor.
+Any options specified in the &cv-link-F77FLAGS; and &cv-link-CPPFLAGS; construction variables
+are included on this command line.
+You only need to set &cv-link-F77PPCOM; if you need to use a specific
+C-preprocessor command line for Fortran 77 files.
+You should normally set the &cv-link-FORTRANPPCOM; variable,
+which specifies the default C-preprocessor command line
+for all Fortran versions.
+</para>
+</summary>
+</cvar>
+
+<cvar name="F77PPCOMSTR">
+<summary>
+<para>
+The string displayed when a Fortran 77 source file
+is compiled to an object file
+after first running the file through the C preprocessor.
+If this is not set, then &cv-link-F77PPCOM; or &cv-link-FORTRANPPCOM;
+(the command line) is displayed.
+</para>
+</summary>
+</cvar>
+
+<cvar name="SHF77">
+<summary>
+<para>
+The Fortran 77 compiler used for generating shared-library objects.
+You should normally set the &cv-link-SHFORTRAN; variable,
+which specifies the default Fortran compiler
+for all Fortran versions.
+You only need to set &cv-link-SHF77; if you need to use a specific compiler
+or compiler version for Fortran 77 files.
+</para>
+</summary>
+</cvar>
+
+<cvar name="SHF77COM">
+<summary>
+<para>
+The command line used to compile a Fortran 77 source file
+to a shared-library object file.
+You only need to set &cv-link-SHF77COM; if you need to use a specific
+command line for Fortran 77 files.
+You should normally set the &cv-link-SHFORTRANCOM; variable,
+which specifies the default command line
+for all Fortran versions.
+</para>
+</summary>
+</cvar>
+
+<cvar name="SHF77COMSTR">
+<summary>
+<para>
+The string displayed when a Fortran 77 source file
+is compiled to a shared-library object file.
+If this is not set, then &cv-link-SHF77COM; or &cv-link-SHFORTRANCOM;
+(the command line) is displayed.
+</para>
+</summary>
+</cvar>
+
+<cvar name="SHF77FLAGS">
+<summary>
+<para>
+Options that are passed to the Fortran 77 compiler
+to generated shared-library objects.
+You only need to set &cv-link-SHF77FLAGS; if you need to define specific
+user options for Fortran 77 files.
+You should normally set the &cv-link-SHFORTRANFLAGS; variable,
+which specifies the user-specified options
+passed to the default Fortran compiler
+for all Fortran versions.
+</para>
+</summary>
+</cvar>
+
+<cvar name="SHF77PPCOM">
+<summary>
+<para>
+The command line used to compile a Fortran 77 source file to a
+shared-library object file
+after first running the file through the C preprocessor.
+Any options specified in the &cv-link-SHF77FLAGS; and &cv-link-CPPFLAGS; construction variables
+are included on this command line.
+You only need to set &cv-link-SHF77PPCOM; if you need to use a specific
+C-preprocessor command line for Fortran 77 files.
+You should normally set the &cv-link-SHFORTRANPPCOM; variable,
+which specifies the default C-preprocessor command line
+for all Fortran versions.
+</para>
+</summary>
+</cvar>
+
+<cvar name="SHF77PPCOMSTR">
+<summary>
+<para>
+The string displayed when a Fortran 77 source file
+is compiled to a shared-library object file
+after first running the file through the C preprocessor.
+If this is not set, then &cv-link-SHF77PPCOM; or &cv-link-SHFORTRANPPCOM;
+(the command line) is displayed.
+</para>
+</summary>
+</cvar>
+
+</sconsdoc>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/f90.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/f90.py
new file mode 100644
index 0000000..16b8f84
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/f90.py
@@ -0,0 +1,62 @@
+"""engine.SCons.Tool.f90
+
+Tool-specific initialization for the generic Posix f90 Fortran compiler.
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import SCons.Defaults
+import SCons.Scanner.Fortran
+import SCons.Tool
+import SCons.Util
+from SCons.Tool.FortranCommon import add_all_to_env, add_f90_to_env
+
+compilers = ['f90']
+
+def generate(env):
+ add_all_to_env(env)
+ add_f90_to_env(env)
+
+ fc = env.Detect(compilers) or 'f90'
+ env['F90'] = fc
+ env['SHF90'] = fc
+
+ env['FORTRAN'] = fc
+ env['SHFORTRAN'] = fc
+
+def exists(env):
+ return env.Detect(compilers)
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/f90.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/f90.xml
new file mode 100644
index 0000000..8f1da95
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/f90.xml
@@ -0,0 +1,310 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+__COPYRIGHT__
+
+This file is processed by the bin/SConsDoc.py module.
+See its __doc__ string for a discussion of the format.
+-->
+
+<!DOCTYPE sconsdoc [
+<!ENTITY % scons SYSTEM '../../../../doc/scons.mod'>
+%scons;
+<!ENTITY % builders-mod SYSTEM '../../../../doc/generated/builders.mod'>
+%builders-mod;
+<!ENTITY % functions-mod SYSTEM '../../../../doc/generated/functions.mod'>
+%functions-mod;
+<!ENTITY % tools-mod SYSTEM '../../../../doc/generated/tools.mod'>
+%tools-mod;
+<!ENTITY % variables-mod SYSTEM '../../../../doc/generated/variables.mod'>
+%variables-mod;
+]>
+
+<sconsdoc xmlns="http://www.scons.org/dbxsd/v1.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://www.scons.org/dbxsd/v1.0 http://www.scons.org/dbxsd/v1.0/scons.xsd">
+
+<tool name="f90">
+<summary>
+<para>
+Set construction variables for generic POSIX Fortran 90 compilers.
+</para>
+</summary>
+<sets>
+<item>F90</item>
+<item>F90FLAGS</item>
+<item>F90COM</item>
+<item>F90PPCOM</item>
+<item>SHF90</item>
+<item>SHF90FLAGS</item>
+<item>SHF90COM</item>
+<item>SHF90PPCOM</item>
+<item>_F90INCFLAGS</item>
+</sets>
+<uses>
+<item>F90COMSTR</item>
+<item>F90PPCOMSTR</item>
+<item>SHF90COMSTR</item>
+<item>SHF90PPCOMSTR</item>
+</uses>
+</tool>
+
+<cvar name="F90">
+<summary>
+<para>
+The Fortran 90 compiler.
+You should normally set the &cv-link-FORTRAN; variable,
+which specifies the default Fortran compiler
+for all Fortran versions.
+You only need to set &cv-link-F90; if you need to use a specific compiler
+or compiler version for Fortran 90 files.
+</para>
+</summary>
+</cvar>
+
+<cvar name="F90COM">
+<summary>
+<para>
+The command line used to compile a Fortran 90 source file to an object file.
+You only need to set &cv-link-F90COM; if you need to use a specific
+command line for Fortran 90 files.
+You should normally set the &cv-link-FORTRANCOM; variable,
+which specifies the default command line
+for all Fortran versions.
+</para>
+</summary>
+</cvar>
+
+<cvar name="F90COMSTR">
+<summary>
+<para>
+The string displayed when a Fortran 90 source file
+is compiled to an object file.
+If this is not set, then &cv-link-F90COM; or &cv-link-FORTRANCOM;
+(the command line) is displayed.
+</para>
+</summary>
+</cvar>
+
+<cvar name="F90FILESUFFIXES">
+<summary>
+<para>
+The list of file extensions for which the F90 dialect will be used. By
+default, this is ['.f90']
+</para>
+</summary>
+</cvar>
+
+<cvar name="F90PPFILESUFFIXES">
+<summary>
+<para>
+The list of file extensions for which the compilation + preprocessor pass for
+F90 dialect will be used. By default, this is empty
+</para>
+</summary>
+</cvar>
+
+<cvar name="F90FLAGS">
+<summary>
+<para>
+General user-specified options that are passed to the Fortran 90 compiler.
+Note that this variable does
+<emphasis>not</emphasis>
+contain
+<option>-I</option>
+(or similar) include search path options
+that scons generates automatically from &cv-link-F90PATH;.
+See
+&cv-link-_F90INCFLAGS;
+below,
+for the variable that expands to those options.
+You only need to set &cv-link-F90FLAGS; if you need to define specific
+user options for Fortran 90 files.
+You should normally set the &cv-link-FORTRANFLAGS; variable,
+which specifies the user-specified options
+passed to the default Fortran compiler
+for all Fortran versions.
+</para>
+</summary>
+</cvar>
+
+<cvar name="_F90INCFLAGS">
+<summary>
+<para>
+An automatically-generated construction variable
+containing the Fortran 90 compiler command-line options
+for specifying directories to be searched for include files.
+The value of &cv-link-_F90INCFLAGS; is created
+by appending &cv-link-INCPREFIX; and &cv-link-INCSUFFIX;
+to the beginning and end
+of each directory in &cv-link-F90PATH;.
+</para>
+</summary>
+</cvar>
+
+<cvar name="F90PATH">
+<summary>
+<para>
+The list of directories that the Fortran 90 compiler will search for include
+directories. The implicit dependency scanner will search these
+directories for include files. Don't explicitly put include directory
+arguments in &cv-link-F90FLAGS; because the result will be non-portable
+and the directories will not be searched by the dependency scanner. Note:
+directory names in &cv-link-F90PATH; will be looked-up relative to the SConscript
+directory when they are used in a command. To force
+&scons;
+to look-up a directory relative to the root of the source tree use #:
+You only need to set &cv-link-F90PATH; if you need to define a specific
+include path for Fortran 90 files.
+You should normally set the &cv-link-FORTRANPATH; variable,
+which specifies the include path
+for the default Fortran compiler
+for all Fortran versions.
+</para>
+
+<example_commands>
+env = Environment(F90PATH='#/include')
+</example_commands>
+
+<para>
+The directory look-up can also be forced using the
+&Dir;()
+function:
+</para>
+
+<example_commands>
+include = Dir('include')
+env = Environment(F90PATH=include)
+</example_commands>
+
+<para>
+The directory list will be added to command lines
+through the automatically-generated
+&cv-link-_F90INCFLAGS;
+construction variable,
+which is constructed by
+appending the values of the
+&cv-link-INCPREFIX; and &cv-link-INCSUFFIX;
+construction variables
+to the beginning and end
+of each directory in &cv-link-F90PATH;.
+Any command lines you define that need
+the F90PATH directory list should
+include &cv-link-_F90INCFLAGS;:
+</para>
+
+<example_commands>
+env = Environment(F90COM="my_compiler $_F90INCFLAGS -c -o $TARGET $SOURCE")
+</example_commands>
+</summary>
+</cvar>
+
+<cvar name="F90PPCOM">
+<summary>
+<para>
+The command line used to compile a Fortran 90 source file to an object file
+after first running the file through the C preprocessor.
+Any options specified in the &cv-link-F90FLAGS; and &cv-link-CPPFLAGS; construction variables
+are included on this command line.
+You only need to set &cv-link-F90PPCOM; if you need to use a specific
+C-preprocessor command line for Fortran 90 files.
+You should normally set the &cv-link-FORTRANPPCOM; variable,
+which specifies the default C-preprocessor command line
+for all Fortran versions.
+</para>
+</summary>
+</cvar>
+
+<cvar name="F90PPCOMSTR">
+<summary>
+<para>
+The string displayed when a Fortran 90 source file
+is compiled after first running the file through the C preprocessor.
+If this is not set, then &cv-link-F90PPCOM; or &cv-link-FORTRANPPCOM;
+(the command line) is displayed.
+</para>
+</summary>
+</cvar>
+
+<cvar name="SHF90">
+<summary>
+<para>
+The Fortran 90 compiler used for generating shared-library objects.
+You should normally set the &cv-link-SHFORTRAN; variable,
+which specifies the default Fortran compiler
+for all Fortran versions.
+You only need to set &cv-link-SHF90; if you need to use a specific compiler
+or compiler version for Fortran 90 files.
+</para>
+</summary>
+</cvar>
+
+<cvar name="SHF90COM">
+<summary>
+<para>
+The command line used to compile a Fortran 90 source file
+to a shared-library object file.
+You only need to set &cv-link-SHF90COM; if you need to use a specific
+command line for Fortran 90 files.
+You should normally set the &cv-link-SHFORTRANCOM; variable,
+which specifies the default command line
+for all Fortran versions.
+</para>
+</summary>
+</cvar>
+
+<cvar name="SHF90COMSTR">
+<summary>
+<para>
+The string displayed when a Fortran 90 source file
+is compiled to a shared-library object file.
+If this is not set, then &cv-link-SHF90COM; or &cv-link-SHFORTRANCOM;
+(the command line) is displayed.
+</para>
+</summary>
+</cvar>
+
+<cvar name="SHF90FLAGS">
+<summary>
+<para>
+Options that are passed to the Fortran 90 compiler
+to generated shared-library objects.
+You only need to set &cv-link-SHF90FLAGS; if you need to define specific
+user options for Fortran 90 files.
+You should normally set the &cv-link-SHFORTRANFLAGS; variable,
+which specifies the user-specified options
+passed to the default Fortran compiler
+for all Fortran versions.
+</para>
+</summary>
+</cvar>
+
+<cvar name="SHF90PPCOM">
+<summary>
+<para>
+The command line used to compile a Fortran 90 source file to a
+shared-library object file
+after first running the file through the C preprocessor.
+Any options specified in the &cv-link-SHF90FLAGS; and &cv-link-CPPFLAGS; construction variables
+are included on this command line.
+You only need to set &cv-link-SHF90PPCOM; if you need to use a specific
+C-preprocessor command line for Fortran 90 files.
+You should normally set the &cv-link-SHFORTRANPPCOM; variable,
+which specifies the default C-preprocessor command line
+for all Fortran versions.
+</para>
+</summary>
+</cvar>
+
+<cvar name="SHF90PPCOMSTR">
+<summary>
+<para>
+The string displayed when a Fortran 90 source file
+is compiled to a shared-library object file
+after first running the file through the C preprocessor.
+If this is not set, then &cv-link-SHF90PPCOM; or &cv-link-SHFORTRANPPCOM;
+(the command line) is displayed.
+</para>
+</summary>
+</cvar>
+
+</sconsdoc>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/f95.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/f95.py
new file mode 100644
index 0000000..5baa31e
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/f95.py
@@ -0,0 +1,63 @@
+"""engine.SCons.Tool.f95
+
+Tool-specific initialization for the generic Posix f95 Fortran compiler.
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import SCons.Defaults
+import SCons.Tool
+import SCons.Util
+from . import fortran
+from SCons.Tool.FortranCommon import add_all_to_env, add_f95_to_env
+
+compilers = ['f95']
+
+def generate(env):
+ add_all_to_env(env)
+ add_f95_to_env(env)
+
+ fcomp = env.Detect(compilers) or 'f95'
+ env['F95'] = fcomp
+ env['SHF95'] = fcomp
+
+ env['FORTRAN'] = fcomp
+ env['SHFORTRAN'] = fcomp
+
+
+def exists(env):
+ return env.Detect(compilers)
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/f95.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/f95.xml
new file mode 100644
index 0000000..1cce442
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/f95.xml
@@ -0,0 +1,311 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+__COPYRIGHT__
+
+This file is processed by the bin/SConsDoc.py module.
+See its __doc__ string for a discussion of the format.
+-->
+
+<!DOCTYPE sconsdoc [
+<!ENTITY % scons SYSTEM '../../../../doc/scons.mod'>
+%scons;
+<!ENTITY % builders-mod SYSTEM '../../../../doc/generated/builders.mod'>
+%builders-mod;
+<!ENTITY % functions-mod SYSTEM '../../../../doc/generated/functions.mod'>
+%functions-mod;
+<!ENTITY % tools-mod SYSTEM '../../../../doc/generated/tools.mod'>
+%tools-mod;
+<!ENTITY % variables-mod SYSTEM '../../../../doc/generated/variables.mod'>
+%variables-mod;
+]>
+
+<sconsdoc xmlns="http://www.scons.org/dbxsd/v1.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://www.scons.org/dbxsd/v1.0 http://www.scons.org/dbxsd/v1.0/scons.xsd">
+
+<tool name="f95">
+<summary>
+<para>
+Set construction variables for generic POSIX Fortran 95 compilers.
+</para>
+</summary>
+<sets>
+<item>F95</item>
+<item>F95FLAGS</item>
+<item>F95COM</item>
+<item>F95PPCOM</item>
+<item>SHF95</item>
+<item>SHF95FLAGS</item>
+<item>SHF95COM</item>
+<item>SHF95PPCOM</item>
+<item>_F95INCFLAGS</item>
+</sets>
+<uses>
+<item>F95COMSTR</item>
+<item>F95PPCOMSTR</item>
+<item>SHF95COMSTR</item>
+<item>SHF95PPCOMSTR</item>
+</uses>
+</tool>
+
+<cvar name="F95">
+<summary>
+<para>
+The Fortran 95 compiler.
+You should normally set the &cv-link-FORTRAN; variable,
+which specifies the default Fortran compiler
+for all Fortran versions.
+You only need to set &cv-link-F95; if you need to use a specific compiler
+or compiler version for Fortran 95 files.
+</para>
+</summary>
+</cvar>
+
+<cvar name="F95COM">
+<summary>
+<para>
+The command line used to compile a Fortran 95 source file to an object file.
+You only need to set &cv-link-F95COM; if you need to use a specific
+command line for Fortran 95 files.
+You should normally set the &cv-link-FORTRANCOM; variable,
+which specifies the default command line
+for all Fortran versions.
+</para>
+</summary>
+</cvar>
+
+<cvar name="F95COMSTR">
+<summary>
+<para>
+The string displayed when a Fortran 95 source file
+is compiled to an object file.
+If this is not set, then &cv-link-F95COM; or &cv-link-FORTRANCOM;
+(the command line) is displayed.
+</para>
+</summary>
+</cvar>
+
+<cvar name="F95FILESUFFIXES">
+<summary>
+<para>
+The list of file extensions for which the F95 dialect will be used. By
+default, this is ['.f95']
+</para>
+</summary>
+</cvar>
+
+<cvar name="F95PPFILESUFFIXES">
+<summary>
+<para>
+The list of file extensions for which the compilation + preprocessor pass for
+F95 dialect will be used. By default, this is empty
+</para>
+</summary>
+</cvar>
+
+<cvar name="F95FLAGS">
+<summary>
+<para>
+General user-specified options that are passed to the Fortran 95 compiler.
+Note that this variable does
+<emphasis>not</emphasis>
+contain
+<option>-I</option>
+(or similar) include search path options
+that scons generates automatically from &cv-link-F95PATH;.
+See
+&cv-link-_F95INCFLAGS;
+below,
+for the variable that expands to those options.
+You only need to set &cv-link-F95FLAGS; if you need to define specific
+user options for Fortran 95 files.
+You should normally set the &cv-link-FORTRANFLAGS; variable,
+which specifies the user-specified options
+passed to the default Fortran compiler
+for all Fortran versions.
+</para>
+</summary>
+</cvar>
+
+<cvar name="_F95INCFLAGS">
+<summary>
+<para>
+An automatically-generated construction variable
+containing the Fortran 95 compiler command-line options
+for specifying directories to be searched for include files.
+The value of &cv-link-_F95INCFLAGS; is created
+by appending &cv-link-INCPREFIX; and &cv-link-INCSUFFIX;
+to the beginning and end
+of each directory in &cv-link-F95PATH;.
+</para>
+</summary>
+</cvar>
+
+<cvar name="F95PATH">
+<summary>
+<para>
+The list of directories that the Fortran 95 compiler will search for include
+directories. The implicit dependency scanner will search these
+directories for include files. Don't explicitly put include directory
+arguments in &cv-link-F95FLAGS; because the result will be non-portable
+and the directories will not be searched by the dependency scanner. Note:
+directory names in &cv-link-F95PATH; will be looked-up relative to the SConscript
+directory when they are used in a command. To force
+&scons;
+to look-up a directory relative to the root of the source tree use #:
+You only need to set &cv-link-F95PATH; if you need to define a specific
+include path for Fortran 95 files.
+You should normally set the &cv-link-FORTRANPATH; variable,
+which specifies the include path
+for the default Fortran compiler
+for all Fortran versions.
+</para>
+
+<example_commands>
+env = Environment(F95PATH='#/include')
+</example_commands>
+
+<para>
+The directory look-up can also be forced using the
+&Dir;()
+function:
+</para>
+
+<example_commands>
+include = Dir('include')
+env = Environment(F95PATH=include)
+</example_commands>
+
+<para>
+The directory list will be added to command lines
+through the automatically-generated
+&cv-link-_F95INCFLAGS;
+construction variable,
+which is constructed by
+appending the values of the
+&cv-link-INCPREFIX; and &cv-link-INCSUFFIX;
+construction variables
+to the beginning and end
+of each directory in &cv-link-F95PATH;.
+Any command lines you define that need
+the F95PATH directory list should
+include &cv-link-_F95INCFLAGS;:
+</para>
+
+<example_commands>
+env = Environment(F95COM="my_compiler $_F95INCFLAGS -c -o $TARGET $SOURCE")
+</example_commands>
+</summary>
+</cvar>
+
+<cvar name="F95PPCOM">
+<summary>
+<para>
+The command line used to compile a Fortran 95 source file to an object file
+after first running the file through the C preprocessor.
+Any options specified in the &cv-link-F95FLAGS; and &cv-link-CPPFLAGS; construction variables
+are included on this command line.
+You only need to set &cv-link-F95PPCOM; if you need to use a specific
+C-preprocessor command line for Fortran 95 files.
+You should normally set the &cv-link-FORTRANPPCOM; variable,
+which specifies the default C-preprocessor command line
+for all Fortran versions.
+</para>
+</summary>
+</cvar>
+
+<cvar name="F95PPCOMSTR">
+<summary>
+<para>
+The string displayed when a Fortran 95 source file
+is compiled to an object file
+after first running the file through the C preprocessor.
+If this is not set, then &cv-link-F95PPCOM; or &cv-link-FORTRANPPCOM;
+(the command line) is displayed.
+</para>
+</summary>
+</cvar>
+
+<cvar name="SHF95">
+<summary>
+<para>
+The Fortran 95 compiler used for generating shared-library objects.
+You should normally set the &cv-link-SHFORTRAN; variable,
+which specifies the default Fortran compiler
+for all Fortran versions.
+You only need to set &cv-link-SHF95; if you need to use a specific compiler
+or compiler version for Fortran 95 files.
+</para>
+</summary>
+</cvar>
+
+<cvar name="SHF95COM">
+<summary>
+<para>
+The command line used to compile a Fortran 95 source file
+to a shared-library object file.
+You only need to set &cv-link-SHF95COM; if you need to use a specific
+command line for Fortran 95 files.
+You should normally set the &cv-link-SHFORTRANCOM; variable,
+which specifies the default command line
+for all Fortran versions.
+</para>
+</summary>
+</cvar>
+
+<cvar name="SHF95COMSTR">
+<summary>
+<para>
+The string displayed when a Fortran 95 source file
+is compiled to a shared-library object file.
+If this is not set, then &cv-link-SHF95COM; or &cv-link-SHFORTRANCOM;
+(the command line) is displayed.
+</para>
+</summary>
+</cvar>
+
+<cvar name="SHF95FLAGS">
+<summary>
+<para>
+Options that are passed to the Fortran 95 compiler
+to generated shared-library objects.
+You only need to set &cv-link-SHF95FLAGS; if you need to define specific
+user options for Fortran 95 files.
+You should normally set the &cv-link-SHFORTRANFLAGS; variable,
+which specifies the user-specified options
+passed to the default Fortran compiler
+for all Fortran versions.
+</para>
+</summary>
+</cvar>
+
+<cvar name="SHF95PPCOM">
+<summary>
+<para>
+The command line used to compile a Fortran 95 source file to a
+shared-library object file
+after first running the file through the C preprocessor.
+Any options specified in the &cv-link-SHF95FLAGS; and &cv-link-CPPFLAGS; construction variables
+are included on this command line.
+You only need to set &cv-link-SHF95PPCOM; if you need to use a specific
+C-preprocessor command line for Fortran 95 files.
+You should normally set the &cv-link-SHFORTRANPPCOM; variable,
+which specifies the default C-preprocessor command line
+for all Fortran versions.
+</para>
+</summary>
+</cvar>
+
+<cvar name="SHF95PPCOMSTR">
+<summary>
+<para>
+The string displayed when a Fortran 95 source file
+is compiled to a shared-library object file
+after first running the file through the C preprocessor.
+If this is not set, then &cv-link-SHF95PPCOM; or &cv-link-SHFORTRANPPCOM;
+(the command line) is displayed.
+</para>
+</summary>
+</cvar>
+
+</sconsdoc>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/filesystem.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/filesystem.py
new file mode 100644
index 0000000..3b8ee4c
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/filesystem.py
@@ -0,0 +1,98 @@
+"""SCons.Tool.filesystem
+
+Tool-specific initialization for the filesystem tools.
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import SCons
+from SCons.Tool.install import copyFunc
+
+copyToBuilder, copyAsBuilder = None, None
+
+def copyto_emitter(target, source, env):
+ """ changes the path of the source to be under the target (which
+ are assumed to be directories.
+ """
+ n_target = []
+
+ for t in target:
+ n_target = n_target + [t.File( str( s ) ) for s in source]
+
+ return (n_target, source)
+
+def copy_action_func(target, source, env):
+ assert( len(target) == len(source) ), "\ntarget: %s\nsource: %s" %(list(map(str, target)),list(map(str, source)))
+
+ for t, s in zip(target, source):
+ if copyFunc(t.get_path(), s.get_path(), env):
+ return 1
+
+ return 0
+
+def copy_action_str(target, source, env):
+ return env.subst_target_source(env['COPYSTR'], 0, target, source)
+
+copy_action = SCons.Action.Action( copy_action_func, copy_action_str )
+
+def generate(env):
+ try:
+ env['BUILDERS']['CopyTo']
+ env['BUILDERS']['CopyAs']
+ except KeyError as e:
+ global copyToBuilder
+ if copyToBuilder is None:
+ copyToBuilder = SCons.Builder.Builder(
+ action = copy_action,
+ target_factory = env.fs.Dir,
+ source_factory = env.fs.Entry,
+ multi = 1,
+ emitter = [ copyto_emitter, ] )
+
+ global copyAsBuilder
+ if copyAsBuilder is None:
+ copyAsBuilder = SCons.Builder.Builder(
+ action = copy_action,
+ target_factory = env.fs.Entry,
+ source_factory = env.fs.Entry )
+
+ env['BUILDERS']['CopyTo'] = copyToBuilder
+ env['BUILDERS']['CopyAs'] = copyAsBuilder
+
+ env['COPYSTR'] = 'Copy file(s): "$SOURCES" to "$TARGETS"'
+
+def exists(env):
+ return 1
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/fortran.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/fortran.py
new file mode 100644
index 0000000..26c6ff5
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/fortran.py
@@ -0,0 +1,62 @@
+"""SCons.Tool.fortran
+
+Tool-specific initialization for a generic Posix f77/f90 Fortran compiler.
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import re
+
+import SCons.Action
+import SCons.Defaults
+import SCons.Scanner.Fortran
+import SCons.Tool
+import SCons.Util
+from SCons.Tool.FortranCommon import add_all_to_env, add_fortran_to_env
+
+compilers = ['f95', 'f90', 'f77']
+
+def generate(env):
+ add_all_to_env(env)
+ add_fortran_to_env(env)
+
+ fc = env.Detect(compilers) or 'f77'
+ env['SHFORTRAN'] = fc
+ env['FORTRAN'] = fc
+
+def exists(env):
+ return env.Detect(compilers)
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/fortran.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/fortran.xml
new file mode 100644
index 0000000..5383d5f
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/fortran.xml
@@ -0,0 +1,375 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+__COPYRIGHT__
+
+This file is processed by the bin/SConsDoc.py module.
+See its __doc__ string for a discussion of the format.
+-->
+
+<!DOCTYPE sconsdoc [
+<!ENTITY % scons SYSTEM '../../../../doc/scons.mod'>
+%scons;
+<!ENTITY % builders-mod SYSTEM '../../../../doc/generated/builders.mod'>
+%builders-mod;
+<!ENTITY % functions-mod SYSTEM '../../../../doc/generated/functions.mod'>
+%functions-mod;
+<!ENTITY % tools-mod SYSTEM '../../../../doc/generated/tools.mod'>
+%tools-mod;
+<!ENTITY % variables-mod SYSTEM '../../../../doc/generated/variables.mod'>
+%variables-mod;
+]>
+
+<sconsdoc xmlns="http://www.scons.org/dbxsd/v1.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://www.scons.org/dbxsd/v1.0 http://www.scons.org/dbxsd/v1.0/scons.xsd">
+
+<tool name="fortran">
+<summary>
+<para>
+Set construction variables for generic POSIX Fortran compilers.
+</para>
+</summary>
+<sets>
+<item>FORTRAN</item>
+<item>FORTRANFLAGS</item>
+<item>FORTRANCOM</item>
+<item>SHFORTRAN</item>
+<item>SHFORTRANFLAGS</item>
+<item>SHFORTRANCOM</item>
+<item>SHFORTRANPPCOM</item>
+</sets>
+<uses>
+<item>FORTRANCOMSTR</item>
+<item>FORTRANPPCOMSTR</item>
+<item>SHFORTRANCOMSTR</item>
+<item>SHFORTRANPPCOMSTR</item>
+</uses>
+</tool>
+
+<cvar name="FORTRAN">
+<summary>
+<para>
+The default Fortran compiler
+for all versions of Fortran.
+</para>
+</summary>
+</cvar>
+
+<cvar name="FORTRANCOM">
+<summary>
+<para>
+The command line used to compile a Fortran source file to an object file.
+By default, any options specified
+in the &cv-link-FORTRANFLAGS;,
+&cv-link-CPPFLAGS;,
+&cv-link-_CPPDEFFLAGS;,
+&cv-link-_FORTRANMODFLAG;, and
+&cv-link-_FORTRANINCFLAGS; construction variables
+are included on this command line.
+</para>
+</summary>
+</cvar>
+
+<cvar name="FORTRANCOMSTR">
+<summary>
+<para>
+The string displayed when a Fortran source file
+is compiled to an object file.
+If this is not set, then &cv-link-FORTRANCOM;
+(the command line) is displayed.
+</para>
+</summary>
+</cvar>
+
+<cvar name="FORTRANFILESUFFIXES">
+<summary>
+<para>
+The list of file extensions for which the FORTRAN dialect will be used. By
+default, this is ['.f', '.for', '.ftn']
+</para>
+</summary>
+</cvar>
+
+<cvar name="FORTRANPPFILESUFFIXES">
+<summary>
+<para>
+The list of file extensions for which the compilation + preprocessor pass for
+FORTRAN dialect will be used. By default, this is ['.fpp', '.FPP']
+</para>
+</summary>
+</cvar>
+
+<cvar name="FORTRANFLAGS">
+<summary>
+<para>
+General user-specified options that are passed to the Fortran compiler.
+Note that this variable does
+<emphasis>not</emphasis>
+contain
+<option>-I</option>
+(or similar) include or module search path options
+that scons generates automatically from &cv-link-FORTRANPATH;.
+See
+&cv-link-_FORTRANINCFLAGS; and &cv-link-_FORTRANMODFLAG;,
+below,
+for the variables that expand those options.
+</para>
+</summary>
+</cvar>
+
+<cvar name="_FORTRANINCFLAGS">
+<summary>
+<para>
+An automatically-generated construction variable
+containing the Fortran compiler command-line options
+for specifying directories to be searched for include
+files and module files.
+The value of &cv-link-_FORTRANINCFLAGS; is created
+by prepending/appending &cv-link-INCPREFIX; and &cv-link-INCSUFFIX;
+to the beginning and end
+of each directory in &cv-link-FORTRANPATH;.
+</para>
+</summary>
+</cvar>
+
+<cvar name="FORTRANMODDIR">
+<summary>
+<para>
+Directory location where the Fortran compiler should place
+any module files it generates. This variable is empty, by default. Some
+Fortran compilers will internally append this directory in the search path
+for module files, as well.
+</para>
+</summary>
+</cvar>
+
+<cvar name="FORTRANMODDIRPREFIX">
+<summary>
+<para>
+The prefix used to specify a module directory on the Fortran compiler command
+line.
+This will be appended to the beginning of the directory
+in the &cv-link-FORTRANMODDIR; construction variables
+when the &cv-link-_FORTRANMODFLAG; variables is automatically generated.
+</para>
+</summary>
+</cvar>
+
+<cvar name="FORTRANMODDIRSUFFIX">
+<summary>
+<para>
+The suffix used to specify a module directory on the Fortran compiler command
+line.
+This will be appended to the beginning of the directory
+in the &cv-link-FORTRANMODDIR; construction variables
+when the &cv-link-_FORTRANMODFLAG; variables is automatically generated.
+</para>
+</summary>
+</cvar>
+
+<cvar name="_FORTRANMODFLAG">
+<summary>
+<para>
+An automatically-generated construction variable
+containing the Fortran compiler command-line option
+for specifying the directory location where the Fortran
+compiler should place any module files that happen to get
+generated during compilation.
+The value of &cv-link-_FORTRANMODFLAG; is created
+by prepending/appending &cv-link-FORTRANMODDIRPREFIX; and
+&cv-link-FORTRANMODDIRSUFFIX;
+to the beginning and end of the directory in &cv-link-FORTRANMODDIR;.
+</para>
+</summary>
+</cvar>
+
+<cvar name="FORTRANMODPREFIX">
+<summary>
+<para>
+The module file prefix used by the Fortran compiler. SCons assumes that
+the Fortran compiler follows the quasi-standard naming convention for
+module files of
+<filename>module_name.mod</filename>.
+As a result, this variable is left empty, by default. For situations in
+which the compiler does not necessarily follow the normal convention,
+the user may use this variable. Its value will be appended to every
+module file name as scons attempts to resolve dependencies.
+</para>
+</summary>
+</cvar>
+
+<cvar name="FORTRANMODSUFFIX">
+<summary>
+<para>
+The module file suffix used by the Fortran compiler. SCons assumes that
+the Fortran compiler follows the quasi-standard naming convention for
+module files of
+<filename>module_name.mod</filename>.
+As a result, this variable is set to ".mod", by default. For situations
+in which the compiler does not necessarily follow the normal convention,
+the user may use this variable. Its value will be appended to every
+module file name as scons attempts to resolve dependencies.
+</para>
+</summary>
+</cvar>
+
+<cvar name="FORTRANPATH">
+<summary>
+<para>
+The list of directories that the Fortran compiler will search for
+include files and (for some compilers) module files. The Fortran implicit
+dependency scanner will search these directories for include files (but
+not module files since they are autogenerated and, as such, may not
+actually exist at the time the scan takes place). Don't explicitly put
+include directory arguments in FORTRANFLAGS because the result will be
+non-portable and the directories will not be searched by the dependency
+scanner. Note: directory names in FORTRANPATH will be looked-up relative
+to the SConscript directory when they are used in a command. To force
+&scons;
+to look-up a directory relative to the root of the source tree use #:
+</para>
+
+<example_commands>
+env = Environment(FORTRANPATH='#/include')
+</example_commands>
+
+<para>
+The directory look-up can also be forced using the
+&Dir;()
+function:
+</para>
+
+<example_commands>
+include = Dir('include')
+env = Environment(FORTRANPATH=include)
+</example_commands>
+
+<para>
+The directory list will be added to command lines
+through the automatically-generated
+&cv-link-_FORTRANINCFLAGS;
+construction variable,
+which is constructed by
+appending the values of the
+&cv-link-INCPREFIX; and &cv-link-INCSUFFIX;
+construction variables
+to the beginning and end
+of each directory in &cv-link-FORTRANPATH;.
+Any command lines you define that need
+the FORTRANPATH directory list should
+include &cv-link-_FORTRANINCFLAGS;:
+</para>
+
+<example_commands>
+env = Environment(FORTRANCOM="my_compiler $_FORTRANINCFLAGS -c -o $TARGET $SOURCE")
+</example_commands>
+</summary>
+</cvar>
+
+<cvar name="FORTRANPPCOM">
+<summary>
+<para>
+The command line used to compile a Fortran source file to an object file
+after first running the file through the C preprocessor.
+By default, any options specified in the &cv-link-FORTRANFLAGS;,
+&cv-link-CPPFLAGS;,
+&cv-link-_CPPDEFFLAGS;,
+&cv-link-_FORTRANMODFLAG;, and
+&cv-link-_FORTRANINCFLAGS;
+construction variables are included on this command line.
+</para>
+</summary>
+</cvar>
+
+<cvar name="FORTRANPPCOMSTR">
+<summary>
+<para>
+The string displayed when a Fortran source file
+is compiled to an object file
+after first running the file through the C preprocessor.
+If this is not set, then &cv-link-FORTRANPPCOM;
+(the command line) is displayed.
+</para>
+</summary>
+</cvar>
+
+<cvar name="FORTRANSUFFIXES">
+<summary>
+<para>
+The list of suffixes of files that will be scanned
+for Fortran implicit dependencies
+(INCLUDE lines and USE statements).
+The default list is:
+</para>
+
+<example_commands>
+[".f", ".F", ".for", ".FOR", ".ftn", ".FTN", ".fpp", ".FPP",
+".f77", ".F77", ".f90", ".F90", ".f95", ".F95"]
+</example_commands>
+</summary>
+</cvar>
+
+<cvar name="SHFORTRAN">
+<summary>
+<para>
+The default Fortran compiler used for generating shared-library objects.
+</para>
+</summary>
+</cvar>
+
+<cvar name="SHFORTRANCOM">
+<summary>
+<para>
+The command line used to compile a Fortran source file
+to a shared-library object file.
+</para>
+</summary>
+</cvar>
+
+<cvar name="SHFORTRANCOMSTR">
+<summary>
+<para>
+The string displayed when a Fortran source file
+is compiled to a shared-library object file.
+If this is not set, then &cv-link-SHFORTRANCOM;
+(the command line) is displayed.
+</para>
+</summary>
+</cvar>
+
+<cvar name="SHFORTRANFLAGS">
+<summary>
+<para>
+Options that are passed to the Fortran compiler
+to generate shared-library objects.
+</para>
+</summary>
+</cvar>
+
+<cvar name="SHFORTRANPPCOM">
+<summary>
+<para>
+The command line used to compile a Fortran source file to a
+shared-library object file
+after first running the file through the C preprocessor.
+Any options specified
+in the &cv-link-SHFORTRANFLAGS; and
+&cv-link-CPPFLAGS; construction variables
+are included on this command line.
+</para>
+</summary>
+</cvar>
+
+<cvar name="SHFORTRANPPCOMSTR">
+<summary>
+<para>
+The string displayed when a Fortran source file
+is compiled to a shared-library object file
+after first running the file through the C preprocessor.
+If this is not set, then &cv-link-SHFORTRANPPCOM;
+(the command line) is displayed.
+</para>
+</summary>
+</cvar>
+
+</sconsdoc>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/g++.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/g++.py
new file mode 100644
index 0000000..88d88ca
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/g++.py
@@ -0,0 +1,45 @@
+"""SCons.Tool.g++
+
+Tool-specific initialization for g++.
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+
+#forward proxy to the preffered cxx version
+from SCons.Tool.gxx import *
+
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/g++.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/g++.xml
new file mode 100644
index 0000000..dadb4aa
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/g++.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+__COPYRIGHT__
+
+This file is processed by the bin/SConsDoc.py module.
+See its __doc__ string for a discussion of the format.
+-->
+
+<!DOCTYPE sconsdoc [
+<!ENTITY % scons SYSTEM '../../../../doc/scons.mod'>
+%scons;
+<!ENTITY % builders-mod SYSTEM '../../../../doc/generated/builders.mod'>
+%builders-mod;
+<!ENTITY % functions-mod SYSTEM '../../../../doc/generated/functions.mod'>
+%functions-mod;
+<!ENTITY % tools-mod SYSTEM '../../../../doc/generated/tools.mod'>
+%tools-mod;
+<!ENTITY % variables-mod SYSTEM '../../../../doc/generated/variables.mod'>
+%variables-mod;
+]>
+
+<sconsdoc xmlns="http://www.scons.org/dbxsd/v1.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://www.scons.org/dbxsd/v1.0 http://www.scons.org/dbxsd/v1.0/scons.xsd">
+
+<tool name="g++">
+<summary>
+<para>
+Set construction variables for the &gXX; C++ compiler.
+</para>
+</summary>
+<sets>
+<item>CXX</item>
+<item>SHCXXFLAGS</item>
+<item><!--STATIC_AND_SHARED_OBJECTS_ARE_THE_SAME--></item>
+<item>SHOBJSUFFIX</item>
+<item>CXXVERSION</item>
+</sets>
+</tool>
+
+</sconsdoc>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/g77.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/g77.py
new file mode 100644
index 0000000..9dc3ba5
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/g77.py
@@ -0,0 +1,73 @@
+"""engine.SCons.Tool.g77
+
+Tool-specific initialization for g77.
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import SCons.Util
+from SCons.Tool.FortranCommon import add_all_to_env, add_f77_to_env
+
+compilers = ['g77', 'f77']
+
+def generate(env):
+ """Add Builders and construction variables for g77 to an Environment."""
+ add_all_to_env(env)
+ add_f77_to_env(env)
+
+ fcomp = env.Detect(compilers) or 'g77'
+ if env['PLATFORM'] in ['cygwin', 'win32']:
+ env['SHFORTRANFLAGS'] = SCons.Util.CLVar('$FORTRANFLAGS')
+ env['SHF77FLAGS'] = SCons.Util.CLVar('$F77FLAGS')
+ else:
+ env['SHFORTRANFLAGS'] = SCons.Util.CLVar('$FORTRANFLAGS -fPIC')
+ env['SHF77FLAGS'] = SCons.Util.CLVar('$F77FLAGS -fPIC')
+
+ env['FORTRAN'] = fcomp
+ env['SHFORTRAN'] = '$FORTRAN'
+
+ env['F77'] = fcomp
+ env['SHF77'] = '$F77'
+
+ env['INCFORTRANPREFIX'] = "-I"
+ env['INCFORTRANSUFFIX'] = ""
+
+ env['INCF77PREFIX'] = "-I"
+ env['INCF77SUFFIX'] = ""
+
+def exists(env):
+ return env.Detect(compilers)
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/g77.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/g77.xml
new file mode 100644
index 0000000..b7f8368
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/g77.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+__COPYRIGHT__
+
+This file is processed by the bin/SConsDoc.py module.
+See its __doc__ string for a discussion of the format.
+-->
+
+<!DOCTYPE sconsdoc [
+<!ENTITY % scons SYSTEM '../../../../doc/scons.mod'>
+%scons;
+<!ENTITY % builders-mod SYSTEM '../../../../doc/generated/builders.mod'>
+%builders-mod;
+<!ENTITY % functions-mod SYSTEM '../../../../doc/generated/functions.mod'>
+%functions-mod;
+<!ENTITY % tools-mod SYSTEM '../../../../doc/generated/tools.mod'>
+%tools-mod;
+<!ENTITY % variables-mod SYSTEM '../../../../doc/generated/variables.mod'>
+%variables-mod;
+]>
+
+<sconsdoc xmlns="http://www.scons.org/dbxsd/v1.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://www.scons.org/dbxsd/v1.0 http://www.scons.org/dbxsd/v1.0/scons.xsd">
+
+<tool name="g77">
+<summary>
+<para>
+Set construction variables for the &g77; Fortran compiler.
+Calls the &t-f77; Tool module
+to set variables.
+</para>
+</summary>
+</tool>
+
+</sconsdoc>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/gas.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/gas.py
new file mode 100644
index 0000000..d01bd60
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/gas.py
@@ -0,0 +1,56 @@
+"""SCons.Tool.gas
+
+Tool-specific initialization for as, the Gnu assembler.
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+try:
+ as_module = __import__('as', globals(), locals(), [])
+except:
+ as_module = __import__(__package__+'.as', globals(), locals(), ['*'])
+
+assemblers = ['as', 'gas']
+
+def generate(env):
+ """Add Builders and construction variables for as to an Environment."""
+ as_module.generate(env)
+
+ env['AS'] = env.Detect(assemblers) or 'as'
+
+def exists(env):
+ return env.Detect(assemblers)
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/gas.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/gas.xml
new file mode 100644
index 0000000..6e0de94
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/gas.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+__COPYRIGHT__
+
+This file is processed by the bin/SConsDoc.py module.
+See its __doc__ string for a discussion of the format.
+-->
+
+<!DOCTYPE sconsdoc [
+<!ENTITY % scons SYSTEM '../../../../doc/scons.mod'>
+%scons;
+<!ENTITY % builders-mod SYSTEM '../../../../doc/generated/builders.mod'>
+%builders-mod;
+<!ENTITY % functions-mod SYSTEM '../../../../doc/generated/functions.mod'>
+%functions-mod;
+<!ENTITY % tools-mod SYSTEM '../../../../doc/generated/tools.mod'>
+%tools-mod;
+<!ENTITY % variables-mod SYSTEM '../../../../doc/generated/variables.mod'>
+%variables-mod;
+]>
+
+<sconsdoc xmlns="http://www.scons.org/dbxsd/v1.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://www.scons.org/dbxsd/v1.0 http://www.scons.org/dbxsd/v1.0/scons.xsd">
+
+<tool name="gas">
+<summary>
+<para>
+Sets construction variables for the &gas; assembler.
+Calls the &t-as; module.
+</para>
+</summary>
+<sets>
+<item>AS</item>
+</sets>
+</tool>
+
+</sconsdoc>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/gcc.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/gcc.py
new file mode 100644
index 0000000..998e35b
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/gcc.py
@@ -0,0 +1,100 @@
+"""SCons.Tool.gcc
+
+Tool-specific initialization for gcc.
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+from . import cc
+import os
+import re
+import subprocess
+
+import SCons.Util
+
+compilers = ['gcc', 'cc']
+
+def generate(env):
+ """Add Builders and construction variables for gcc to an Environment."""
+
+ if 'CC' not in env:
+ env['CC'] = env.Detect(compilers) or compilers[0]
+
+ cc.generate(env)
+
+ if env['PLATFORM'] in ['cygwin', 'win32']:
+ env['SHCCFLAGS'] = SCons.Util.CLVar('$CCFLAGS')
+ else:
+ env['SHCCFLAGS'] = SCons.Util.CLVar('$CCFLAGS -fPIC')
+ # determine compiler version
+ version = detect_version(env, env['CC'])
+ if version:
+ env['CCVERSION'] = version
+
+def exists(env):
+ # is executable, and is a GNU compiler (or accepts '--version' at least)
+ return detect_version(env, env.Detect(env.get('CC', compilers)))
+
+def detect_version(env, cc):
+ """Return the version of the GNU compiler, or None if it is not a GNU compiler."""
+ cc = env.subst(cc)
+ if not cc:
+ return None
+ version = None
+ #pipe = SCons.Action._subproc(env, SCons.Util.CLVar(cc) + ['-dumpversion'],
+ pipe = SCons.Action._subproc(env, SCons.Util.CLVar(cc) + ['--version'],
+ stdin = 'devnull',
+ stderr = 'devnull',
+ stdout = subprocess.PIPE)
+ # -dumpversion was added in GCC 3.0. As long as we're supporting
+ # GCC versions older than that, we should use --version and a
+ # regular expression.
+ #line = pipe.stdout.read().strip()
+ #if line:
+ # version = line
+ line = SCons.Util.to_str(pipe.stdout.readline())
+ match = re.search(r'[0-9]+(\.[0-9]+)+', line)
+ if match:
+ version = match.group(0)
+ # Non-GNU compiler's output (like AIX xlc's) may exceed the stdout buffer:
+ # So continue with reading to let the child process actually terminate.
+ while SCons.Util.to_str(pipe.stdout.readline()):
+ pass
+ ret = pipe.wait()
+ if ret != 0:
+ return None
+ return version
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/gcc.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/gcc.xml
new file mode 100644
index 0000000..d6b9b41
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/gcc.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+__COPYRIGHT__
+
+This file is processed by the bin/SConsDoc.py module.
+See its __doc__ string for a discussion of the format.
+-->
+
+<!DOCTYPE sconsdoc [
+<!ENTITY % scons SYSTEM '../../../../doc/scons.mod'>
+%scons;
+<!ENTITY % builders-mod SYSTEM '../../../../doc/generated/builders.mod'>
+%builders-mod;
+<!ENTITY % functions-mod SYSTEM '../../../../doc/generated/functions.mod'>
+%functions-mod;
+<!ENTITY % tools-mod SYSTEM '../../../../doc/generated/tools.mod'>
+%tools-mod;
+<!ENTITY % variables-mod SYSTEM '../../../../doc/generated/variables.mod'>
+%variables-mod;
+]>
+
+<sconsdoc xmlns="http://www.scons.org/dbxsd/v1.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://www.scons.org/dbxsd/v1.0 http://www.scons.org/dbxsd/v1.0/scons.xsd">
+
+<tool name="gcc">
+<summary>
+<para>
+Set construction variables for the &gcc; C compiler.
+</para>
+</summary>
+<sets>
+<item>CC</item>
+<item>SHCCFLAGS</item>
+<item>CCVERSION</item>
+</sets>
+</tool>
+
+</sconsdoc>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/gdc.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/gdc.py
new file mode 100644
index 0000000..0c6a8ab
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/gdc.py
@@ -0,0 +1,145 @@
+from __future__ import print_function
+
+"""SCons.Tool.gdc
+
+Tool-specific initialization for the GDC compiler.
+(https://github.com/D-Programming-GDC/GDC)
+
+Developed by Russel Winder (russel@winder.org.uk)
+2012-05-09 onwards
+
+Compiler variables:
+ DC - The name of the D compiler to use. Defaults to gdc.
+ DPATH - List of paths to search for import modules.
+ DVERSIONS - List of version tags to enable when compiling.
+ DDEBUG - List of debug tags to enable when compiling.
+
+Linker related variables:
+ LIBS - List of library files to link in.
+ DLINK - Name of the linker to use. Defaults to gdc.
+ DLINKFLAGS - List of linker flags.
+
+Lib tool variables:
+ DLIB - Name of the lib tool to use. Defaults to lib.
+ DLIBFLAGS - List of flags to pass to the lib tool.
+ LIBS - Same as for the linker. (libraries to pull into the .lib)
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import SCons.Action
+import SCons.Defaults
+import SCons.Tool
+
+import SCons.Tool.DCommon as DCommon
+
+
+def generate(env):
+ static_obj, shared_obj = SCons.Tool.createObjBuilders(env)
+
+ static_obj.add_action('.d', SCons.Defaults.DAction)
+ shared_obj.add_action('.d', SCons.Defaults.ShDAction)
+ static_obj.add_emitter('.d', SCons.Defaults.StaticObjectEmitter)
+ shared_obj.add_emitter('.d', SCons.Defaults.SharedObjectEmitter)
+
+ env['DC'] = env.Detect('gdc') or 'gdc'
+ env['DCOM'] = '$DC $_DINCFLAGS $_DVERFLAGS $_DDEBUGFLAGS $_DFLAGS -c -o $TARGET $SOURCES'
+ env['_DINCFLAGS'] = '${_concat(DINCPREFIX, DPATH, DINCSUFFIX, __env__, RDirs, TARGET, SOURCE)}'
+ env['_DVERFLAGS'] = '${_concat(DVERPREFIX, DVERSIONS, DVERSUFFIX, __env__)}'
+ env['_DDEBUGFLAGS'] = '${_concat(DDEBUGPREFIX, DDEBUG, DDEBUGSUFFIX, __env__)}'
+ env['_DFLAGS'] = '${_concat(DFLAGPREFIX, DFLAGS, DFLAGSUFFIX, __env__)}'
+
+ env['SHDC'] = '$DC'
+ env['SHDCOM'] = '$SHDC $_DINCFLAGS $_DVERFLAGS $_DDEBUGFLAGS $_DFLAGS -fPIC -c -o $TARGET $SOURCES'
+
+ env['DPATH'] = ['#/']
+ env['DFLAGS'] = []
+ env['DVERSIONS'] = []
+ env['DDEBUG'] = []
+
+ if env['DC']:
+ DCommon.addDPATHToEnv(env, env['DC'])
+
+ env['DINCPREFIX'] = '-I'
+ env['DINCSUFFIX'] = ''
+ env['DVERPREFIX'] = '-version='
+ env['DVERSUFFIX'] = ''
+ env['DDEBUGPREFIX'] = '-debug='
+ env['DDEBUGSUFFIX'] = ''
+ env['DFLAGPREFIX'] = '-'
+ env['DFLAGSUFFIX'] = ''
+ env['DFILESUFFIX'] = '.d'
+
+ env['DLINK'] = '$DC'
+ env['DLINKFLAGS'] = SCons.Util.CLVar('')
+ env['DLINKCOM'] = '$DLINK -o $TARGET $DLINKFLAGS $__RPATH $SOURCES $_LIBDIRFLAGS $_LIBFLAGS'
+
+ env['SHDLINK'] = '$DC'
+ env['SHDLINKFLAGS'] = SCons.Util.CLVar('$DLINKFLAGS -shared -shared-libphobos')
+ env['SHDLINKCOM'] = '$DLINK -o $TARGET $SHDLINKFLAGS $__SHDLIBVERSIONFLAGS $__RPATH $SOURCES $_LIBDIRFLAGS $_LIBFLAGS'
+
+ env['DLIB'] = 'lib' if env['PLATFORM'] == 'win32' else 'ar cr'
+ env['DLIBCOM'] = '$DLIB $_DLIBFLAGS {0}$TARGET $SOURCES $_DLINKLIBFLAGS'.format('-c ' if env['PLATFORM'] == 'win32' else '')
+
+ env['_DLIBFLAGS'] = '${_concat(DLIBFLAGPREFIX, DLIBFLAGS, DLIBFLAGSUFFIX, __env__)}'
+
+ env['DLIBFLAGPREFIX'] = '-'
+ env['DLIBFLAGSUFFIX'] = ''
+ env['DLINKFLAGPREFIX'] = '-'
+ env['DLINKFLAGSUFFIX'] = ''
+
+ # __RPATH is set to $_RPATH in the platform specification if that
+ # platform supports it.
+ env['RPATHPREFIX'] = '-Wl,-rpath='
+ env['RPATHSUFFIX'] = ''
+ env['_RPATH'] = '${_concat(RPATHPREFIX, RPATH, RPATHSUFFIX, __env__)}'
+
+ # Support for versioned libraries
+ env['_SHDLIBVERSIONFLAGS'] = '$SHDLIBVERSIONFLAGS -Wl,-soname=$_SHDLIBSONAME'
+ env['_SHDLIBSONAME'] = '${DShLibSonameGenerator(__env__,TARGET)}'
+ # NOTE: this is a quick hack, the soname will only work if there is
+ # c/c++ linker loaded which provides callback for the ShLibSonameGenerator
+ env['DShLibSonameGenerator'] = SCons.Tool.ShLibSonameGenerator
+ # NOTE: this is only for further reference, currently $SHDLIBVERSION does
+ # not work, the user must use $SHLIBVERSION
+ env['SHDLIBVERSION'] = '$SHLIBVERSION'
+ env['SHDLIBVERSIONFLAGS'] = '$SHLIBVERSIONFLAGS'
+
+ env['BUILDERS']['ProgramAllAtOnce'] = SCons.Builder.Builder(
+ action='$DC $_DINCFLAGS $_DVERFLAGS $_DDEBUGFLAGS $_DFLAGS -o $TARGET $DLINKFLAGS $__DRPATH $SOURCES $_DLIBDIRFLAGS $_DLIBFLAGS',
+ emitter=DCommon.allAtOnceEmitter,
+ )
+
+
+def exists(env):
+ return env.Detect('gdc')
+
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/gdc.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/gdc.xml
new file mode 100644
index 0000000..d44489e
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/gdc.xml
@@ -0,0 +1,371 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+__COPYRIGHT__
+
+This file is processed by the bin/SConsDoc.py module.
+See its __doc__ string for a discussion of the format.
+-->
+
+<!DOCTYPE sconsdoc [
+<!ENTITY % scons SYSTEM '../../../../doc/scons.mod'>
+%scons;
+<!ENTITY % builders-mod SYSTEM '../../../../doc/generated/builders.mod'>
+%builders-mod;
+<!ENTITY % functions-mod SYSTEM '../../../../doc/generated/functions.mod'>
+%functions-mod;
+<!ENTITY % tools-mod SYSTEM '../../../../doc/generated/tools.mod'>
+%tools-mod;
+<!ENTITY % variables-mod SYSTEM '../../../../doc/generated/variables.mod'>
+%variables-mod;
+]>
+
+<sconsdoc xmlns="http://www.scons.org/dbxsd/v1.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://www.scons.org/dbxsd/v1.0/scons.xsd">
+
+<tool name="gdc">
+<summary>
+<para>
+Sets construction variables for the D language compiler GDC.
+</para>
+</summary>
+<sets>
+<item>DC</item>
+<item>DCOM</item>
+<item>SHDC</item>
+<item>SHDCOM</item>
+<item>DPATH</item>
+<item>DFLAGS</item>
+<item>DVERSIONS</item>
+<item>DDEBUG</item>
+<item>DINCPREFIX</item>
+<item>DINCSUFFIX</item>
+<item>DVERPREFIX</item>
+<item>DVERSUFFIX</item>
+<item>DDEBUGPREFIX</item>
+<item>DDEBUGSUFFIX</item>
+<item>DFLAGPREFIX</item>
+<item>DFLAGSUFFIX</item>
+<item>DFILESUFFIX</item>
+<item>DLINK</item>
+<item>DLINKFLAGS</item>
+<item>DLINKCOM</item>
+<item>SHDLINK</item>
+<item>SHDLINKFLAGS</item>
+<item>SHDLINKCOM</item>
+<item>DLIBLINKPREFIX</item>
+<item>DLIBLINKSUFFIX</item>
+<item>DLIBDIRPREFIX</item>
+<item>DLIBDIRSUFFIX</item>
+<item>DLIB</item>
+<item>DLIBCOM</item>
+<item>DLIBFLAGPREFIX</item>
+<item>DLIBFLAGSUFFIX</item>
+<item>DLINKFLAGPREFIX</item>
+<item>DLINKFLAGSUFFIX</item>
+<item>DRPATHPREFIX</item>
+<item>DRPATHSUFFIX</item>
+<item>DShLibSonameGenerator</item>
+<item>SHDLIBVERSION</item>
+<item>SHDLIBVERSIONFLAGS</item>
+</sets>
+<uses>
+</uses>
+</tool>
+
+<cvar name="DC">
+<summary>
+<para>
+The D compiler to use.
+</para>
+</summary>
+</cvar>
+
+<cvar name="DCOM">
+<summary>
+<para>
+ The command line used to compile a D file to an object file.
+ Any options specified in the &cv-link-DFLAGS; construction variable
+ is included on this command line.
+</para>
+</summary>
+</cvar>
+
+<cvar name="DDEBUG">
+<summary>
+<para>
+ List of debug tags to enable when compiling.
+</para>
+</summary>
+</cvar>
+
+<cvar name="DFLAGS">
+<summary>
+<para>
+ General options that are passed to the D compiler.
+</para>
+</summary>
+</cvar>
+
+<cvar name="DLIB">
+<summary>
+<para>
+ Name of the lib tool to use for D codes.
+</para>
+</summary>
+</cvar>
+
+<cvar name="DLIBCOM">
+<summary>
+<para>
+ The command line to use when creating libraries.
+</para>
+</summary>
+</cvar>
+
+<cvar name="DLINK">
+<summary>
+<para>
+ Name of the linker to use for linking systems including D sources.
+</para>
+</summary>
+</cvar>
+
+<cvar name="DLINKCOM">
+<summary>
+<para>
+ The command line to use when linking systems including D sources.
+</para>
+</summary>
+</cvar>
+
+<cvar name="DLINKFLAGS">
+<summary>
+<para>
+List of linker flags.
+</para>
+</summary>
+</cvar>
+
+<cvar name="DPATH">
+<summary>
+<para>
+ List of paths to search for import modules.
+</para>
+</summary>
+</cvar>
+
+<cvar name="DVERSIONS">
+<summary>
+<para>
+ List of version tags to enable when compiling.
+</para>
+</summary>
+</cvar>
+
+<cvar name="SHDC">
+<summary>
+<para>
+ The name of the compiler to use when compiling D source
+ destined to be in a shared objects.
+</para>
+</summary>
+</cvar>
+
+<cvar name="SHDCOM">
+<summary>
+<para>
+ The command line to use when compiling code to be part of shared objects.
+</para>
+</summary>
+</cvar>
+
+<cvar name="SHDLINK">
+<summary>
+<para>
+ The linker to use when creating shared objects for code bases
+ include D sources.
+</para>
+</summary>
+</cvar>
+
+<cvar name="SHDLINKCOM">
+<summary>
+<para>
+ The command line to use when generating shared objects.
+</para>
+</summary>
+</cvar>
+
+<cvar name="SHDLINKFLAGS">
+<summary>
+<para>
+ The list of flags to use when generating a shared object.
+</para>
+</summary>
+</cvar>
+
+<cvar name="DVERSUFFIX">
+ <summary>
+ <para>
+ DVERSUFFIX.
+ </para>
+ </summary>
+</cvar>
+
+<cvar name="DVERPREFIX">
+ <summary>
+ <para>
+ DVERPREFIX.
+ </para>
+ </summary>
+</cvar>
+
+<cvar name="DLINKFLAGSUFFIX">
+ <summary>
+ <para>
+ DLINKFLAGSUFFIX.
+ </para>
+ </summary>
+</cvar>
+
+<cvar name="DLINKFLAGPREFIX">
+ <summary>
+ <para>
+ DLINKFLAGPREFIX.
+ </para>
+ </summary>
+</cvar>
+
+<cvar name="DLIBLINKSUFFIX">
+ <summary>
+ <para>
+ DLIBLINKSUFFIX.
+ </para>
+ </summary>
+</cvar>
+
+<cvar name="DLIBLINKPREFIX">
+ <summary>
+ <para>
+ DLIBLINKPREFIX.
+ </para>
+ </summary>
+</cvar>
+
+<cvar name="DLIBFLAGSUFFIX">
+ <summary>
+ <para>
+ DLIBFLAGSUFFIX.
+ </para>
+ </summary>
+</cvar>
+
+<cvar name="DLIBFLAGPREFIX">
+ <summary>
+ <para>
+ DLIBFLAGPREFIX.
+ </para>
+ </summary>
+</cvar>
+
+<cvar name="DLIBDIRSUFFIX">
+ <summary>
+ <para>
+ DLIBLINKSUFFIX.
+ </para>
+ </summary>
+</cvar>
+
+<cvar name="DLIBDIRPREFIX">
+ <summary>
+ <para>
+ DLIBLINKPREFIX.
+ </para>
+ </summary>
+</cvar>
+
+<cvar name="DINCSUFFIX">
+ <summary>
+ <para>
+ DLIBFLAGSUFFIX.
+ </para>
+ </summary>
+</cvar>
+
+
+<cvar name="DINCPREFIX">
+ <summary>
+ <para>
+ DINCPREFIX.
+ </para>
+ </summary>
+</cvar>
+
+<cvar name="DFLAGSUFFIX">
+ <summary>
+ <para>
+ DFLAGSUFFIX.
+ </para>
+ </summary>
+</cvar>
+
+<cvar name="DFLAGPREFIX">
+ <summary>
+ <para>
+ DFLAGPREFIX.
+ </para>
+ </summary>
+</cvar>
+
+<cvar name="DFILESUFFIX">
+ <summary>
+ <para>
+ DFILESUFFIX.
+ </para>
+ </summary>
+</cvar>
+
+<cvar name="DDEBUGPREFIX">
+ <summary>
+ <para>
+ DDEBUGPREFIX.
+ </para>
+ </summary>
+</cvar>
+
+<cvar name="DDEBUGSUFFIX">
+ <summary>
+ <para>
+ DDEBUGSUFFIX.
+ </para>
+ </summary>
+</cvar>
+
+<builder name="ProgramAllAtOnce">
+ <summary>
+ <para>
+ Builds an executable from D sources without first creating individual
+ objects for each file.
+ </para>
+ <para>
+ D sources can be compiled file-by-file as C and C++ source are, and
+ D is integrated into the &scons; Object and Program builders for
+ this model of build. D codes can though do whole source
+ meta-programming (some of the testing frameworks do this). For this
+ it is imperative that all sources are compiled and linked in a single call of
+ the D compiler. This builder serves that purpose.
+ </para>
+ <example_commands>
+ env.ProgramAllAtOnce('executable', ['mod_a.d, mod_b.d', 'mod_c.d'])
+ </example_commands>
+ <para>
+ This command will compile the modules mod_a, mod_b, and mod_c in a
+ single compilation process without first creating object files for
+ the modules. Some of the D compilers will create executable.o others
+ will not.
+ </para>
+ </summary>
+</builder>
+
+</sconsdoc>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/gettext.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/gettext.xml
new file mode 100644
index 0000000..f9f8b81
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/gettext.xml
@@ -0,0 +1,257 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+__COPYRIGHT__
+
+This file is processed by the bin/SConsDoc.py module.
+See its __doc__ string for a discussion of the format.
+-->
+
+<!DOCTYPE sconsdoc [
+<!ENTITY % scons SYSTEM '../../../../doc/scons.mod'>
+%scons;
+<!ENTITY % builders-mod SYSTEM '../../../../doc/generated/builders.mod'>
+%builders-mod;
+<!ENTITY % functions-mod SYSTEM '../../../../doc/generated/functions.mod'>
+%functions-mod;
+<!ENTITY % tools-mod SYSTEM '../../../../doc/generated/tools.mod'>
+%tools-mod;
+<!ENTITY % variables-mod SYSTEM '../../../../doc/generated/variables.mod'>
+%variables-mod;
+]>
+
+<sconsdoc xmlns="http://www.scons.org/dbxsd/v1.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://www.scons.org/dbxsd/v1.0 http://www.scons.org/dbxsd/v1.0/scons.xsd">
+
+<tool name="gettext">
+<summary>
+<para>
+This is actually a toolset, which supports internationalization and
+localization of software being constructed with SCons. The toolset loads
+following tools:
+</para>
+
+<para>
+<itemizedlist mark='opencircle'>
+ <listitem><para>
+ &t-link-xgettext; - to extract internationalized messages from source code to
+ <literal>POT</literal> file(s),
+ </para></listitem>
+ <listitem><para>
+ &t-link-msginit; - may be optionally used to initialize <literal>PO</literal>
+ files,
+ </para></listitem>
+ <listitem><para>
+ &t-link-msgmerge; - to update <literal>PO</literal> files, that already contain
+ translated messages,</para></listitem>
+ <listitem><para>
+ &t-link-msgfmt; - to compile textual <literal>PO</literal> file to binary
+ installable <literal>MO</literal> file.
+ </para></listitem>
+</itemizedlist>
+</para>
+
+<para>
+When you enable &t-gettext;, it internally loads all abovementioned tools,
+so you're encouraged to see their individual documentation.
+</para>
+
+<para>
+Each of the above tools provides its own builder(s) which may be used to
+perform particular activities related to software internationalization. You
+may be however interested in <emphasis>top-level</emphasis> builder
+&b-Translate; described few paragraphs later.
+</para>
+
+<para>
+To use &t-gettext; tools add <literal>'gettext'</literal> tool to your
+environment:
+</para>
+<example_commands>
+ env = Environment( tools = ['default', 'gettext'] )
+</example_commands>
+</summary>
+<sets>
+</sets>
+<uses>
+<item><!-- PLATFORM --></item>
+</uses>
+</tool>
+
+<builder name="Translate">
+<summary>
+<para>
+This pseudo-builder belongs to &t-link-gettext; toolset. The builder extracts
+internationalized messages from source files, updates <literal>POT</literal>
+template (if necessary) and then updates <literal>PO</literal> translations (if
+necessary). If &cv-link-POAUTOINIT; is set, missing <literal>PO</literal> files
+will be automatically created (i.e. without translator person intervention).
+The variables &cv-link-LINGUAS_FILE; and &cv-link-POTDOMAIN; are taken into
+acount too. All other construction variables used by &b-link-POTUpdate;, and
+&b-link-POUpdate; work here too.
+</para>
+
+<para>
+<emphasis>Example 1</emphasis>.
+The simplest way is to specify input files and output languages inline in
+a SCons script when invoking &b-Translate;
+</para>
+<example_commands>
+# SConscript in 'po/' directory
+env = Environment( tools = ["default", "gettext"] )
+env['POAUTOINIT'] = 1
+env.Translate(['en','pl'], ['../a.cpp','../b.cpp'])
+</example_commands>
+
+<para>
+<emphasis>Example 2</emphasis>.
+If you wish, you may also stick to conventional style known from
+<productname>autotools</productname>, i.e. using
+<filename>POTFILES.in</filename> and <filename>LINGUAS</filename> files
+</para>
+<example_commands>
+# LINGUAS
+en pl
+#end
+</example_commands>
+
+<example_commands>
+# POTFILES.in
+a.cpp
+b.cpp
+# end
+</example_commands>
+
+<example_commands>
+# SConscript
+env = Environment( tools = ["default", "gettext"] )
+env['POAUTOINIT'] = 1
+env['XGETTEXTPATH'] = ['../']
+env.Translate(LINGUAS_FILE = 1, XGETTEXTFROM = 'POTFILES.in')
+</example_commands>
+
+<para>
+The last approach is perhaps the recommended one. It allows easily split
+internationalization/localization onto separate SCons scripts, where a script
+in source tree is responsible for translations (from sources to
+<literal>PO</literal> files) and script(s) under variant directories are
+responsible for compilation of <literal>PO</literal> to <literal>MO</literal>
+files to and for installation of <literal>MO</literal> files. The "gluing
+factor" synchronizing these two scripts is then the content of
+<filename>LINGUAS</filename> file. Note, that the updated
+<literal>POT</literal> and <literal>PO</literal> files are usually going to be
+committed back to the repository, so they must be updated within the source
+directory (and not in variant directories). Additionaly, the file listing of
+<filename>po/</filename> directory contains <filename>LINGUAS</filename> file,
+so the source tree looks familiar to translators, and they may work with the
+project in their usual way.
+</para>
+
+<para>
+<emphasis>Example 3</emphasis>.
+Let's prepare a development tree as below
+</para>
+<example_commands>
+ project/
+ + SConstruct
+ + build/
+ + src/
+ + po/
+ + SConscript
+ + SConscript.i18n
+ + POTFILES.in
+ + LINGUAS
+</example_commands>
+<para>
+with <filename>build</filename> being variant directory. Write the top-level
+<filename>SConstruct</filename> script as follows
+</para>
+<example_commands>
+ # SConstruct
+ env = Environment( tools = ["default", "gettext"] )
+ VariantDir('build', 'src', duplicate = 0)
+ env['POAUTOINIT'] = 1
+ SConscript('src/po/SConscript.i18n', exports = 'env')
+ SConscript('build/po/SConscript', exports = 'env')
+</example_commands>
+<para>
+the <filename>src/po/SConscript.i18n</filename> as
+</para>
+<example_commands>
+ # src/po/SConscript.i18n
+ Import('env')
+ env.Translate(LINGUAS_FILE=1, XGETTEXTFROM='POTFILES.in', XGETTEXTPATH=['../'])
+</example_commands>
+<para>
+and the <filename>src/po/SConscript</filename>
+</para>
+<example_commands>
+ # src/po/SConscript
+ Import('env')
+ env.MOFiles(LINGUAS_FILE = 1)
+</example_commands>
+<para>
+Such setup produces <literal>POT</literal> and <literal>PO</literal> files
+under source tree in <filename>src/po/</filename> and binary
+<literal>MO</literal> files under variant tree in
+<filename>build/po/</filename>. This way the <literal>POT</literal> and
+<literal>PO</literal> files are separated from other output files, which must
+not be committed back to source repositories (e.g. <literal>MO</literal>
+files).
+</para>
+
+<para>
+<note><para>In above example, the <literal>PO</literal> files are not updated,
+nor created automatically when you issue <command>scons '.'</command> command.
+The files must be updated (created) by hand via <command>scons
+po-update</command> and then <literal>MO</literal> files can be compiled by
+running <command>scons '.'</command>.</para></note>
+</para>
+
+</summary>
+</builder>
+
+<cvar name="POTDOMAIN">
+<summary>
+<para>
+The &cv-POTDOMAIN; defines default domain, used to generate
+<literal>POT</literal> filename as <filename>&cv-POTDOMAIN;.pot</filename> when
+no <literal>POT</literal> file name is provided by the user. This applies to
+&b-link-POTUpdate;, &b-link-POInit; and &b-link-POUpdate; builders (and
+builders, that use them, e.g. &b-Translate;). Normally (if &cv-POTDOMAIN; is
+not defined), the builders use <filename>messages.pot</filename> as default
+<literal>POT</literal> file name.
+</para>
+</summary>
+</cvar>
+
+<cvar name="POAUTOINIT">
+<summary>
+<para>
+The &cv-POAUTOINIT; variable, if set to <literal>True</literal> (on non-zero
+numeric value), let the &t-link-msginit; tool to automatically initialize
+<emphasis>missing</emphasis> <literal>PO</literal> files with
+<command>msginit(1)</command>. This applies to both,
+&b-link-POInit; and &b-link-POUpdate; builders (and others that use any of
+them).
+</para>
+</summary>
+</cvar>
+
+<cvar name="LINGUAS_FILE">
+<summary>
+<para>
+The &cv-LINGUAS_FILE; defines file(s) containing list of additional linguas
+to be processed by &b-link-POInit;, &b-link-POUpdate; or &b-link-MOFiles;
+builders. It also affects &b-link-Translate; builder. If the variable contains
+a string, it defines name of the list file. The &cv-LINGUAS_FILE; may be a
+list of file names as well. If &cv-LINGUAS_FILE; is set to
+<literal>True</literal> (or non-zero numeric value), the list will be read from
+default file named
+<filename>LINGUAS</filename>.
+</para>
+
+</summary>
+</cvar>
+
+</sconsdoc>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/gettext_tool.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/gettext_tool.py
new file mode 100644
index 0000000..6031e49
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/gettext_tool.py
@@ -0,0 +1,48 @@
+"""gettext tool
+"""
+
+
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+#############################################################################
+def generate(env,**kw):
+ import SCons.Tool
+ from SCons.Tool.GettextCommon \
+ import _translate, tool_list
+ for t in tool_list(env['PLATFORM'], env):
+ env.Tool(t)
+ env.AddMethod(_translate, 'Translate')
+#############################################################################
+
+#############################################################################
+def exists(env):
+ from SCons.Tool.GettextCommon \
+ import _xgettext_exists, _msginit_exists, \
+ _msgmerge_exists, _msgfmt_exists
+ try:
+ return _xgettext_exists(env) and _msginit_exists(env) \
+ and _msgmerge_exists(env) and _msgfmt_exists(env)
+ except:
+ return False
+#############################################################################
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/gfortran.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/gfortran.py
new file mode 100644
index 0000000..d33bf52
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/gfortran.py
@@ -0,0 +1,64 @@
+"""SCons.Tool.gfortran
+
+Tool-specific initialization for gfortran, the GNU Fortran 95/Fortran
+2003 compiler.
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import SCons.Util
+
+from . import fortran
+
+def generate(env):
+ """Add Builders and construction variables for gfortran to an
+ Environment."""
+ fortran.generate(env)
+
+ for dialect in ['F77', 'F90', 'FORTRAN', 'F95', 'F03', 'F08']:
+ env['%s' % dialect] = 'gfortran'
+ env['SH%s' % dialect] = '$%s' % dialect
+ if env['PLATFORM'] in ['cygwin', 'win32']:
+ env['SH%sFLAGS' % dialect] = SCons.Util.CLVar('$%sFLAGS' % dialect)
+ else:
+ env['SH%sFLAGS' % dialect] = SCons.Util.CLVar('$%sFLAGS -fPIC' % dialect)
+
+ env['INC%sPREFIX' % dialect] = "-I"
+ env['INC%sSUFFIX' % dialect] = ""
+
+def exists(env):
+ return env.Detect('gfortran')
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/gfortran.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/gfortran.xml
new file mode 100644
index 0000000..aa32e01
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/gfortran.xml
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+__COPYRIGHT__
+
+This file is processed by the bin/SConsDoc.py module.
+See its __doc__ string for a discussion of the format.
+-->
+
+<!DOCTYPE sconsdoc [
+<!ENTITY % scons SYSTEM '../../../../doc/scons.mod'>
+%scons;
+<!ENTITY % builders-mod SYSTEM '../../../../doc/generated/builders.mod'>
+%builders-mod;
+<!ENTITY % functions-mod SYSTEM '../../../../doc/generated/functions.mod'>
+%functions-mod;
+<!ENTITY % tools-mod SYSTEM '../../../../doc/generated/tools.mod'>
+%tools-mod;
+<!ENTITY % variables-mod SYSTEM '../../../../doc/generated/variables.mod'>
+%variables-mod;
+]>
+
+<sconsdoc xmlns="http://www.scons.org/dbxsd/v1.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://www.scons.org/dbxsd/v1.0 http://www.scons.org/dbxsd/v1.0/scons.xsd">
+
+<tool name="gfortran">
+<summary>
+<para>
+Sets construction variables for the GNU F95/F2003 GNU compiler.
+</para>
+</summary>
+<sets>
+<item>FORTRAN</item>
+<item>F77</item>
+<item>F90</item>
+<item>F95</item>
+<item>SHFORTRAN</item>
+<item>SHF77</item>
+<item>SHF90</item>
+<item>SHF95</item>
+<item>SHFORTRANFLAGS</item>
+<item>SHF77FLAGS</item>
+<item>SHF90FLAGS</item>
+<item>SHF95FLAGS</item>
+</sets>
+</tool>
+
+</sconsdoc>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/gnulink.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/gnulink.py
new file mode 100644
index 0000000..b1d5088
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/gnulink.py
@@ -0,0 +1,80 @@
+"""SCons.Tool.gnulink
+
+Tool-specific initialization for the gnu linker.
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import SCons.Util
+import SCons.Tool
+import os
+import sys
+import re
+
+from . import link
+
+
+def generate(env):
+ """Add Builders and construction variables for gnulink to an Environment."""
+ link.generate(env)
+
+ if env['PLATFORM'] == 'hpux':
+ env['SHLINKFLAGS'] = SCons.Util.CLVar('$LINKFLAGS -shared -fPIC')
+
+ # __RPATH is set to $_RPATH in the platform specification if that
+ # platform supports it.
+ env['RPATHPREFIX'] = '-Wl,-rpath='
+ env['RPATHSUFFIX'] = ''
+ env['_RPATH'] = '${_concat(RPATHPREFIX, RPATH, RPATHSUFFIX, __env__)}'
+
+ # OpenBSD doesn't usually use SONAME for libraries
+ use_soname = not sys.platform.startswith('openbsd')
+ link._setup_versioned_lib_variables(env, tool = 'gnulink', use_soname = use_soname)
+ env['LINKCALLBACKS'] = link._versioned_lib_callbacks()
+
+ # For backward-compatibility with older SCons versions
+ env['SHLIBVERSIONFLAGS'] = SCons.Util.CLVar('-Wl,-Bsymbolic')
+
+def exists(env):
+ # TODO: sync with link.smart_link() to choose a linker
+ linkers = { 'CXX': ['g++'], 'CC': ['gcc'] }
+ alltools = []
+ for langvar, linktools in linkers.items():
+ if langvar in env: # use CC over CXX when user specified CC but not CXX
+ return SCons.Tool.FindTool(linktools, env)
+ alltools.extend(linktools)
+ return SCons.Tool.FindTool(alltools, env) # find CXX or CC
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/gnulink.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/gnulink.xml
new file mode 100644
index 0000000..0e055c7
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/gnulink.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+__COPYRIGHT__
+
+This file is processed by the bin/SConsDoc.py module.
+See its __doc__ string for a discussion of the format.
+-->
+
+<!DOCTYPE sconsdoc [
+<!ENTITY % scons SYSTEM '../../../../doc/scons.mod'>
+%scons;
+<!ENTITY % builders-mod SYSTEM '../../../../doc/generated/builders.mod'>
+%builders-mod;
+<!ENTITY % functions-mod SYSTEM '../../../../doc/generated/functions.mod'>
+%functions-mod;
+<!ENTITY % tools-mod SYSTEM '../../../../doc/generated/tools.mod'>
+%tools-mod;
+<!ENTITY % variables-mod SYSTEM '../../../../doc/generated/variables.mod'>
+%variables-mod;
+]>
+
+<sconsdoc xmlns="http://www.scons.org/dbxsd/v1.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://www.scons.org/dbxsd/v1.0 http://www.scons.org/dbxsd/v1.0/scons.xsd">
+
+<tool name="gnulink">
+<summary>
+<para>
+Set construction variables for GNU linker/loader.
+</para>
+</summary>
+<sets>
+<item>SHLINKFLAGS</item>
+<item>RPATHPREFIX</item>
+<item>RPATHSUFFIX</item>
+<item>_LDMODULESONAME</item>
+<item>_SHLIBSONAME</item>
+<item>LDMODULEVERSIONFLAGS</item>
+<item>SHLIBVERSIONFLAGS</item>
+</sets>
+</tool>
+
+</sconsdoc>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/gs.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/gs.py
new file mode 100644
index 0000000..25359a8
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/gs.py
@@ -0,0 +1,91 @@
+"""SCons.Tool.gs
+
+Tool-specific initialization for Ghostscript.
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import SCons.Action
+import SCons.Builder
+import SCons.Platform
+import SCons.Util
+
+# Ghostscript goes by different names on different platforms...
+platform = SCons.Platform.platform_default()
+
+if platform == 'os2':
+ gs = 'gsos2'
+elif platform == 'win32':
+ gs = 'gswin32c'
+else:
+ gs = 'gs'
+
+GhostscriptAction = None
+
+def generate(env):
+ """Add Builders and construction variables for Ghostscript to an
+ Environment."""
+ global GhostscriptAction
+ # The following try-except block enables us to use the Tool
+ # in standalone mode (without the accompanying pdf.py),
+ # whenever we need an explicit call of gs via the Gs()
+ # Builder ...
+ try:
+ if GhostscriptAction is None:
+ GhostscriptAction = SCons.Action.Action('$GSCOM', '$GSCOMSTR')
+
+ from SCons.Tool import pdf
+ pdf.generate(env)
+
+ bld = env['BUILDERS']['PDF']
+ bld.add_action('.ps', GhostscriptAction)
+ except ImportError as e:
+ pass
+
+ gsbuilder = SCons.Builder.Builder(action = SCons.Action.Action('$GSCOM', '$GSCOMSTR'))
+ env['BUILDERS']['Gs'] = gsbuilder
+
+ env['GS'] = gs
+ env['GSFLAGS'] = SCons.Util.CLVar('-dNOPAUSE -dBATCH -sDEVICE=pdfwrite')
+ env['GSCOM'] = '$GS $GSFLAGS -sOutputFile=$TARGET $SOURCES'
+
+
+def exists(env):
+ if 'PS2PDF' in env:
+ return env.Detect(env['PS2PDF'])
+ else:
+ return env.Detect(gs) or SCons.Util.WhereIs(gs)
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/gs.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/gs.xml
new file mode 100644
index 0000000..898f077
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/gs.xml
@@ -0,0 +1,100 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+__COPYRIGHT__
+
+This file is processed by the bin/SConsDoc.py module.
+See its __doc__ string for a discussion of the format.
+-->
+
+<!DOCTYPE sconsdoc [
+<!ENTITY % scons SYSTEM '../../../../doc/scons.mod'>
+%scons;
+<!ENTITY % builders-mod SYSTEM '../../../../doc/generated/builders.mod'>
+%builders-mod;
+<!ENTITY % functions-mod SYSTEM '../../../../doc/generated/functions.mod'>
+%functions-mod;
+<!ENTITY % tools-mod SYSTEM '../../../../doc/generated/tools.mod'>
+%tools-mod;
+<!ENTITY % variables-mod SYSTEM '../../../../doc/generated/variables.mod'>
+%variables-mod;
+]>
+
+<sconsdoc xmlns="http://www.scons.org/dbxsd/v1.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://www.scons.org/dbxsd/v1.0 http://www.scons.org/dbxsd/v1.0/scons.xsd">
+
+<tool name="gs">
+<summary>
+<para>
+This Tool sets the required construction variables for working with
+the Ghostscript command. It also registers an appropriate Action
+with the PDF Builder (&b-link-PDF;), such that the conversion from
+PS/EPS to PDF happens automatically for the TeX/LaTeX toolchain.
+Finally, it adds an explicit Ghostscript Builder (&b-link-Gs;) to the
+environment.
+</para>
+</summary>
+<sets>
+<item>GS</item>
+<item>GSFLAGS</item>
+<item>GSCOM</item>
+</sets>
+<uses>
+<item>GSCOMSTR</item>
+</uses>
+</tool>
+
+<cvar name="GS">
+<summary>
+<para>
+The Ghostscript program used, e.g. to convert PostScript to PDF files.
+</para>
+</summary>
+</cvar>
+
+<cvar name="GSCOM">
+<summary>
+<para>
+The full Ghostscript command line used for the conversion process. Its default
+value is <quote><literal>$GS $GSFLAGS -sOutputFile=$TARGET $SOURCES</literal></quote>.
+</para>
+</summary>
+</cvar>
+
+<cvar name="GSCOMSTR">
+<summary>
+<para>
+The string displayed when
+Ghostscript is called for the conversion process.
+If this is not set (the default), then &cv-link-GSCOM; (the command line) is displayed.
+</para>
+</summary>
+</cvar>
+
+<cvar name="GSFLAGS">
+<summary>
+<para>
+General options passed to the Ghostscript program,
+when converting PostScript to PDF files for example. Its default value
+is <quote><literal>-dNOPAUSE -dBATCH -sDEVICE=pdfwrite</literal></quote>
+</para>
+</summary>
+</cvar>
+
+<builder name="Gs">
+<summary>
+<para>
+A Builder for explicitly calling the <literal>gs</literal> executable.
+Depending on the underlying OS, the different names <literal>gs</literal>,
+<literal>gsos2</literal> and <literal>gswin32c</literal>
+are tried.
+</para>
+<example_commands>env = Environment(tools=['gs'])
+env.Gs('cover.jpg','scons-scons.pdf',
+ GSFLAGS='-dNOPAUSE -dBATCH -sDEVICE=jpeg -dFirstPage=1 -dLastPage=1 -q')
+ )
+</example_commands>
+</summary>
+</builder>
+
+</sconsdoc>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/gxx.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/gxx.py
new file mode 100644
index 0000000..574fd8e
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/gxx.py
@@ -0,0 +1,79 @@
+"""SCons.Tool.g++
+
+Tool-specific initialization for g++.
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import os.path
+import re
+import subprocess
+
+import SCons.Tool
+import SCons.Util
+
+from . import gcc
+from . import cxx
+
+compilers = ['g++']
+
+def generate(env):
+ """Add Builders and construction variables for g++ to an Environment."""
+ static_obj, shared_obj = SCons.Tool.createObjBuilders(env)
+
+ if 'CXX' not in env:
+ env['CXX'] = env.Detect(compilers) or compilers[0]
+
+ cxx.generate(env)
+
+ # platform specific settings
+ if env['PLATFORM'] == 'aix':
+ env['SHCXXFLAGS'] = SCons.Util.CLVar('$CXXFLAGS -mminimal-toc')
+ env['STATIC_AND_SHARED_OBJECTS_ARE_THE_SAME'] = 1
+ env['SHOBJSUFFIX'] = '$OBJSUFFIX'
+ elif env['PLATFORM'] == 'hpux':
+ env['SHOBJSUFFIX'] = '.pic.o'
+ elif env['PLATFORM'] == 'sunos':
+ env['SHOBJSUFFIX'] = '.pic.o'
+ # determine compiler version
+ version = gcc.detect_version(env, env['CXX'])
+ if version:
+ env['CXXVERSION'] = version
+
+def exists(env):
+ # is executable, and is a GNU compiler (or accepts '--version' at least)
+ return gcc.detect_version(env, env.Detect(env.get('CXX', compilers)))
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/hpc++.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/hpc++.py
new file mode 100644
index 0000000..9631277
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/hpc++.py
@@ -0,0 +1,45 @@
+"""SCons.Tool.hpc++
+
+Tool-specific initialization for c++ on HP/UX.
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+
+#forward proxy to the preffered cxx version
+from SCons.Tool.hpcxx import *
+
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/hpc++.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/hpc++.xml
new file mode 100644
index 0000000..bfc9411
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/hpc++.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+__COPYRIGHT__
+
+This file is processed by the bin/SConsDoc.py module.
+See its __doc__ string for a discussion of the format.
+-->
+
+<!DOCTYPE sconsdoc [
+<!ENTITY % scons SYSTEM '../../../../doc/scons.mod'>
+%scons;
+<!ENTITY % builders-mod SYSTEM '../../../../doc/generated/builders.mod'>
+%builders-mod;
+<!ENTITY % functions-mod SYSTEM '../../../../doc/generated/functions.mod'>
+%functions-mod;
+<!ENTITY % tools-mod SYSTEM '../../../../doc/generated/tools.mod'>
+%tools-mod;
+<!ENTITY % variables-mod SYSTEM '../../../../doc/generated/variables.mod'>
+%variables-mod;
+]>
+
+<sconsdoc xmlns="http://www.scons.org/dbxsd/v1.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://www.scons.org/dbxsd/v1.0 http://www.scons.org/dbxsd/v1.0/scons.xsd">
+
+<tool name="hpc++">
+<summary>
+<para>
+Set construction variables for the compilers aCC on HP/UX systems.
+</para>
+</summary>
+</tool>
+
+</sconsdoc>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/hpcc.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/hpcc.py
new file mode 100644
index 0000000..51d2e38
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/hpcc.py
@@ -0,0 +1,53 @@
+"""SCons.Tool.hpcc
+
+Tool-specific initialization for HP aCC and cc.
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import SCons.Util
+
+from . import cc
+
+def generate(env):
+ """Add Builders and construction variables for aCC & cc to an Environment."""
+ cc.generate(env)
+
+ env['CXX'] = 'aCC'
+ env['SHCCFLAGS'] = SCons.Util.CLVar('$CCFLAGS +Z')
+
+def exists(env):
+ return env.Detect('aCC')
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/hpcc.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/hpcc.xml
new file mode 100644
index 0000000..f304b90
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/hpcc.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+__COPYRIGHT__
+
+This file is processed by the bin/SConsDoc.py module.
+See its __doc__ string for a discussion of the format.
+-->
+
+<!DOCTYPE sconsdoc [
+<!ENTITY % scons SYSTEM '../../../../doc/scons.mod'>
+%scons;
+<!ENTITY % builders-mod SYSTEM '../../../../doc/generated/builders.mod'>
+%builders-mod;
+<!ENTITY % functions-mod SYSTEM '../../../../doc/generated/functions.mod'>
+%functions-mod;
+<!ENTITY % tools-mod SYSTEM '../../../../doc/generated/tools.mod'>
+%tools-mod;
+<!ENTITY % variables-mod SYSTEM '../../../../doc/generated/variables.mod'>
+%variables-mod;
+]>
+
+<sconsdoc xmlns="http://www.scons.org/dbxsd/v1.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://www.scons.org/dbxsd/v1.0 http://www.scons.org/dbxsd/v1.0/scons.xsd">
+
+<tool name="hpcc">
+<summary>
+<para>
+Set construction variables for the
+<application>aCC</application> on HP/UX systems.
+Calls the &t-cXX; tool for additional variables.
+</para>
+</summary>
+<sets>
+<item>CXX</item>
+<item>SHCXXFLAGS</item>
+<item>CXXVERSION</item>
+</sets>
+</tool>
+
+</sconsdoc>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/hpcxx.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/hpcxx.py
new file mode 100644
index 0000000..1ba9198
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/hpcxx.py
@@ -0,0 +1,87 @@
+"""SCons.Tool.hpc++
+
+Tool-specific initialization for c++ on HP/UX.
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import os.path
+
+import SCons.Util
+
+import SCons.Tool.cxx
+cplusplus = SCons.Tool.cxx
+#cplusplus = __import__('cxx', globals(), locals(), [])
+
+
+acc = None
+
+# search for the acc compiler and linker front end
+
+try:
+ dirs = os.listdir('/opt')
+except (IOError, OSError):
+ # Not being able to read the directory because it doesn't exist
+ # (IOError) or isn't readable (OSError) is okay.
+ dirs = []
+
+for dir in dirs:
+ cc = '/opt/' + dir + '/bin/aCC'
+ if os.path.exists(cc):
+ acc = cc
+ break
+
+
+def generate(env):
+ """Add Builders and construction variables for g++ to an Environment."""
+ cplusplus.generate(env)
+
+ if acc:
+ env['CXX'] = acc or 'aCC'
+ env['SHCXXFLAGS'] = SCons.Util.CLVar('$CXXFLAGS +Z')
+ # determine version of aCC
+ line = os.popen(acc + ' -V 2>&1').readline().rstrip()
+ if line.find('aCC: HP ANSI C++') == 0:
+ env['CXXVERSION'] = line.split()[-1]
+
+ if env['PLATFORM'] == 'cygwin':
+ env['SHCXXFLAGS'] = SCons.Util.CLVar('$CXXFLAGS')
+ else:
+ env['SHCXXFLAGS'] = SCons.Util.CLVar('$CXXFLAGS +Z')
+
+def exists(env):
+ return acc
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/hplink.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/hplink.py
new file mode 100644
index 0000000..10ef30b
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/hplink.py
@@ -0,0 +1,77 @@
+"""SCons.Tool.hplink
+
+Tool-specific initialization for the HP linker.
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import os
+import os.path
+
+import SCons.Util
+
+from . import link
+
+ccLinker = None
+
+# search for the acc compiler and linker front end
+
+try:
+ dirs = os.listdir('/opt')
+except (IOError, OSError):
+ # Not being able to read the directory because it doesn't exist
+ # (IOError) or isn't readable (OSError) is okay.
+ dirs = []
+
+for dir in dirs:
+ linker = '/opt/' + dir + '/bin/aCC'
+ if os.path.exists(linker):
+ ccLinker = linker
+ break
+
+def generate(env):
+ """
+ Add Builders and construction variables for Visual Age linker to
+ an Environment.
+ """
+ link.generate(env)
+
+ env['LINKFLAGS'] = SCons.Util.CLVar('-Wl,+s -Wl,+vnocompatwarnings')
+ env['SHLINKFLAGS'] = SCons.Util.CLVar('$LINKFLAGS -b')
+ env['SHLIBSUFFIX'] = '.sl'
+
+def exists(env):
+ return ccLinker
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/hplink.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/hplink.xml
new file mode 100644
index 0000000..07d9bb9
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/hplink.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+__COPYRIGHT__
+
+This file is processed by the bin/SConsDoc.py module.
+See its __doc__ string for a discussion of the format.
+-->
+
+<!DOCTYPE sconsdoc [
+<!ENTITY % scons SYSTEM '../../../../doc/scons.mod'>
+%scons;
+<!ENTITY % builders-mod SYSTEM '../../../../doc/generated/builders.mod'>
+%builders-mod;
+<!ENTITY % functions-mod SYSTEM '../../../../doc/generated/functions.mod'>
+%functions-mod;
+<!ENTITY % tools-mod SYSTEM '../../../../doc/generated/tools.mod'>
+%tools-mod;
+<!ENTITY % variables-mod SYSTEM '../../../../doc/generated/variables.mod'>
+%variables-mod;
+]>
+
+<sconsdoc xmlns="http://www.scons.org/dbxsd/v1.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://www.scons.org/dbxsd/v1.0 http://www.scons.org/dbxsd/v1.0/scons.xsd">
+
+<tool name="hplink">
+<summary>
+<para>
+Sets construction variables for the linker on HP/UX systems.
+</para>
+</summary>
+<sets>
+<item>LINKFLAGS</item>
+<item>SHLINKFLAGS</item>
+<item>SHLIBSUFFIX</item>
+</sets>
+</tool>
+
+</sconsdoc>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/icc.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/icc.py
new file mode 100644
index 0000000..11ea075
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/icc.py
@@ -0,0 +1,59 @@
+"""engine.SCons.Tool.icc
+
+Tool-specific initialization for the OS/2 icc compiler.
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+from . import cc
+
+def generate(env):
+ """Add Builders and construction variables for the OS/2 to an Environment."""
+ cc.generate(env)
+
+ env['CC'] = 'icc'
+ env['CCCOM'] = '$CC $CFLAGS $CCFLAGS $CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS /c $SOURCES /Fo$TARGET'
+ env['CXXCOM'] = '$CXX $CXXFLAGS $CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS /c $SOURCES /Fo$TARGET'
+ env['CPPDEFPREFIX'] = '/D'
+ env['CPPDEFSUFFIX'] = ''
+ env['INCPREFIX'] = '/I'
+ env['INCSUFFIX'] = ''
+ env['CFILESUFFIX'] = '.c'
+ env['CXXFILESUFFIX'] = '.cc'
+
+def exists(env):
+ return env.Detect('icc')
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/icc.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/icc.xml
new file mode 100644
index 0000000..f4c3dda
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/icc.xml
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+__COPYRIGHT__
+
+This file is processed by the bin/SConsDoc.py module.
+See its __doc__ string for a discussion of the format.
+-->
+
+<!DOCTYPE sconsdoc [
+<!ENTITY % scons SYSTEM '../../../../doc/scons.mod'>
+%scons;
+<!ENTITY % builders-mod SYSTEM '../../../../doc/generated/builders.mod'>
+%builders-mod;
+<!ENTITY % functions-mod SYSTEM '../../../../doc/generated/functions.mod'>
+%functions-mod;
+<!ENTITY % tools-mod SYSTEM '../../../../doc/generated/tools.mod'>
+%tools-mod;
+<!ENTITY % variables-mod SYSTEM '../../../../doc/generated/variables.mod'>
+%variables-mod;
+]>
+
+<sconsdoc xmlns="http://www.scons.org/dbxsd/v1.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://www.scons.org/dbxsd/v1.0 http://www.scons.org/dbxsd/v1.0/scons.xsd">
+
+<tool name="icc">
+<summary>
+<para>
+Sets construction variables for the
+<application>icc</application> compiler on OS/2 systems.
+</para>
+</summary>
+<sets>
+<item>CC</item>
+<item>CCCOM</item>
+<item>CXXCOM</item>
+<item>CPPDEFPREFIX</item>
+<item>CPPDEFSUFFIX</item>
+<item>INCPREFIX</item>
+<item>INCSUFFIX</item>
+<item>CFILESUFFIX</item>
+<item>CXXFILESUFFIX</item>
+</sets>
+<uses>
+<item>CFLAGS</item>
+<item>CCFLAGS</item>
+<item>CPPFLAGS</item>
+<item>_CPPDEFFLAGS</item>
+<item>_CPPINCFLAGS</item>
+</uses>
+</tool>
+
+</sconsdoc>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/icl.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/icl.py
new file mode 100644
index 0000000..a0bad31
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/icl.py
@@ -0,0 +1,52 @@
+"""engine.SCons.Tool.icl
+
+Tool-specific initialization for the Intel C/C++ compiler.
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import SCons.Tool.intelc
+
+# This has been completely superseded by intelc.py, which can
+# handle both Windows and Linux versions.
+
+def generate(*args, **kw):
+ """Add Builders and construction variables for icl to an Environment."""
+ return SCons.Tool.intelc.generate(*args, **kw)
+
+def exists(*args, **kw):
+ return SCons.Tool.intelc.exists(*args, **kw)
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/icl.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/icl.xml
new file mode 100644
index 0000000..d6c9723
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/icl.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+__COPYRIGHT__
+
+This file is processed by the bin/SConsDoc.py module.
+See its __doc__ string for a discussion of the format.
+-->
+
+<!DOCTYPE sconsdoc [
+<!ENTITY % scons SYSTEM '../../../../doc/scons.mod'>
+%scons;
+<!ENTITY % builders-mod SYSTEM '../../../../doc/generated/builders.mod'>
+%builders-mod;
+<!ENTITY % functions-mod SYSTEM '../../../../doc/generated/functions.mod'>
+%functions-mod;
+<!ENTITY % tools-mod SYSTEM '../../../../doc/generated/tools.mod'>
+%tools-mod;
+<!ENTITY % variables-mod SYSTEM '../../../../doc/generated/variables.mod'>
+%variables-mod;
+]>
+
+<sconsdoc xmlns="http://www.scons.org/dbxsd/v1.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://www.scons.org/dbxsd/v1.0 http://www.scons.org/dbxsd/v1.0/scons.xsd">
+
+<tool name="icl">
+<summary>
+<para>
+Sets construction variables for the Intel C/C++ compiler.
+Calls the &t-intelc; Tool module to set its variables.
+</para>
+</summary>
+</tool>
+
+</sconsdoc>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/ifl.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/ifl.py
new file mode 100644
index 0000000..865d2ba
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/ifl.py
@@ -0,0 +1,72 @@
+"""SCons.Tool.ifl
+
+Tool-specific initialization for the Intel Fortran compiler.
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import SCons.Defaults
+from SCons.Scanner.Fortran import FortranScan
+from .FortranCommon import add_all_to_env
+
+def generate(env):
+ """Add Builders and construction variables for ifl to an Environment."""
+ fscan = FortranScan("FORTRANPATH")
+ SCons.Tool.SourceFileScanner.add_scanner('.i', fscan)
+ SCons.Tool.SourceFileScanner.add_scanner('.i90', fscan)
+
+ if 'FORTRANFILESUFFIXES' not in env:
+ env['FORTRANFILESUFFIXES'] = ['.i']
+ else:
+ env['FORTRANFILESUFFIXES'].append('.i')
+
+ if 'F90FILESUFFIXES' not in env:
+ env['F90FILESUFFIXES'] = ['.i90']
+ else:
+ env['F90FILESUFFIXES'].append('.i90')
+
+ add_all_to_env(env)
+
+ env['FORTRAN'] = 'ifl'
+ env['SHFORTRAN'] = '$FORTRAN'
+ env['FORTRANCOM'] = '$FORTRAN $FORTRANFLAGS $_FORTRANINCFLAGS /c $SOURCES /Fo$TARGET'
+ env['FORTRANPPCOM'] = '$FORTRAN $FORTRANFLAGS $CPPFLAGS $_CPPDEFFLAGS $_FORTRANINCFLAGS /c $SOURCES /Fo$TARGET'
+ env['SHFORTRANCOM'] = '$SHFORTRAN $SHFORTRANFLAGS $_FORTRANINCFLAGS /c $SOURCES /Fo$TARGET'
+ env['SHFORTRANPPCOM'] = '$SHFORTRAN $SHFORTRANFLAGS $CPPFLAGS $_CPPDEFFLAGS $_FORTRANINCFLAGS /c $SOURCES /Fo$TARGET'
+
+def exists(env):
+ return env.Detect('ifl')
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/ifl.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/ifl.xml
new file mode 100644
index 0000000..7f7a7d4
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/ifl.xml
@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+__COPYRIGHT__
+
+This file is processed by the bin/SConsDoc.py module.
+See its __doc__ string for a discussion of the format.
+-->
+
+<!DOCTYPE sconsdoc [
+<!ENTITY % scons SYSTEM '../../../../doc/scons.mod'>
+%scons;
+<!ENTITY % builders-mod SYSTEM '../../../../doc/generated/builders.mod'>
+%builders-mod;
+<!ENTITY % functions-mod SYSTEM '../../../../doc/generated/functions.mod'>
+%functions-mod;
+<!ENTITY % tools-mod SYSTEM '../../../../doc/generated/tools.mod'>
+%tools-mod;
+<!ENTITY % variables-mod SYSTEM '../../../../doc/generated/variables.mod'>
+%variables-mod;
+]>
+
+<sconsdoc xmlns="http://www.scons.org/dbxsd/v1.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://www.scons.org/dbxsd/v1.0 http://www.scons.org/dbxsd/v1.0/scons.xsd">
+
+<tool name="ifl">
+<summary>
+<para>
+Sets construction variables for the Intel Fortran compiler.
+</para>
+</summary>
+<sets>
+<item>FORTRAN</item>
+<item>FORTRANCOM</item>
+<item>FORTRANPPCOM</item>
+<item>SHFORTRANCOM</item>
+<item>SHFORTRANPPCOM</item>
+</sets>
+<uses>
+<item>FORTRANFLAGS</item>
+<item>_FORTRANINCFLAGS</item>
+<item>CPPFLAGS</item>
+<item>_CPPDEFFLAGS</item>
+</uses>
+</tool>
+
+</sconsdoc>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/ifort.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/ifort.py
new file mode 100644
index 0000000..638bd12
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/ifort.py
@@ -0,0 +1,88 @@
+"""SCons.Tool.ifort
+
+Tool-specific initialization for newer versions of the Intel Fortran Compiler
+for Linux/Windows (and possibly Mac OS X).
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import SCons.Defaults
+from SCons.Scanner.Fortran import FortranScan
+from .FortranCommon import add_all_to_env
+
+def generate(env):
+ """Add Builders and construction variables for ifort to an Environment."""
+ # ifort supports Fortran 90 and Fortran 95
+ # Additionally, ifort recognizes more file extensions.
+ fscan = FortranScan("FORTRANPATH")
+ SCons.Tool.SourceFileScanner.add_scanner('.i', fscan)
+ SCons.Tool.SourceFileScanner.add_scanner('.i90', fscan)
+
+ if 'FORTRANFILESUFFIXES' not in env:
+ env['FORTRANFILESUFFIXES'] = ['.i']
+ else:
+ env['FORTRANFILESUFFIXES'].append('.i')
+
+ if 'F90FILESUFFIXES' not in env:
+ env['F90FILESUFFIXES'] = ['.i90']
+ else:
+ env['F90FILESUFFIXES'].append('.i90')
+
+ add_all_to_env(env)
+
+ fc = 'ifort'
+
+ for dialect in ['F77', 'F90', 'FORTRAN', 'F95']:
+ env['%s' % dialect] = fc
+ env['SH%s' % dialect] = '$%s' % dialect
+ if env['PLATFORM'] == 'posix':
+ env['SH%sFLAGS' % dialect] = SCons.Util.CLVar('$%sFLAGS -fPIC' % dialect)
+
+ if env['PLATFORM'] == 'win32':
+ # On Windows, the ifort compiler specifies the object on the
+ # command line with -object:, not -o. Massage the necessary
+ # command-line construction variables.
+ for dialect in ['F77', 'F90', 'FORTRAN', 'F95']:
+ for var in ['%sCOM' % dialect, '%sPPCOM' % dialect,
+ 'SH%sCOM' % dialect, 'SH%sPPCOM' % dialect]:
+ env[var] = env[var].replace('-o $TARGET', '-object:$TARGET')
+ env['FORTRANMODDIRPREFIX'] = "/module:"
+ else:
+ env['FORTRANMODDIRPREFIX'] = "-module "
+
+def exists(env):
+ return env.Detect('ifort')
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/ifort.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/ifort.xml
new file mode 100644
index 0000000..7b05b7d
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/ifort.xml
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+__COPYRIGHT__
+
+This file is processed by the bin/SConsDoc.py module.
+See its __doc__ string for a discussion of the format.
+-->
+
+<!DOCTYPE sconsdoc [
+<!ENTITY % scons SYSTEM '../../../../doc/scons.mod'>
+%scons;
+<!ENTITY % builders-mod SYSTEM '../../../../doc/generated/builders.mod'>
+%builders-mod;
+<!ENTITY % functions-mod SYSTEM '../../../../doc/generated/functions.mod'>
+%functions-mod;
+<!ENTITY % tools-mod SYSTEM '../../../../doc/generated/tools.mod'>
+%tools-mod;
+<!ENTITY % variables-mod SYSTEM '../../../../doc/generated/variables.mod'>
+%variables-mod;
+]>
+
+<sconsdoc xmlns="http://www.scons.org/dbxsd/v1.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://www.scons.org/dbxsd/v1.0 http://www.scons.org/dbxsd/v1.0/scons.xsd">
+
+<tool name="ifort">
+<summary>
+<para>
+Sets construction variables for newer versions
+of the Intel Fortran compiler for Linux.
+</para>
+</summary>
+<sets>
+<item>FORTRAN</item>
+<item>F77</item>
+<item>F90</item>
+<item>F95</item>
+<item>SHFORTRAN</item>
+<item>SHF77</item>
+<item>SHF90</item>
+<item>SHF95</item>
+<item>SHFORTRANFLAGS</item>
+<item>SHF77FLAGS</item>
+<item>SHF90FLAGS</item>
+<item>SHF95FLAGS</item>
+</sets>
+</tool>
+
+</sconsdoc>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/ilink.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/ilink.py
new file mode 100644
index 0000000..aa6bcaa
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/ilink.py
@@ -0,0 +1,59 @@
+"""SCons.Tool.ilink
+
+Tool-specific initialization for the OS/2 ilink linker.
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import SCons.Defaults
+import SCons.Tool
+import SCons.Util
+
+def generate(env):
+ """Add Builders and construction variables for ilink to an Environment."""
+ SCons.Tool.createProgBuilder(env)
+
+ env['LINK'] = 'ilink'
+ env['LINKFLAGS'] = SCons.Util.CLVar('')
+ env['LINKCOM'] = '$LINK $LINKFLAGS /O:$TARGET $SOURCES $_LIBDIRFLAGS $_LIBFLAGS'
+ env['LIBDIRPREFIX']='/LIBPATH:'
+ env['LIBDIRSUFFIX']=''
+ env['LIBLINKPREFIX']=''
+ env['LIBLINKSUFFIX']='$LIBSUFFIX'
+
+def exists(env):
+ return env.Detect('ilink')
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/ilink.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/ilink.xml
new file mode 100644
index 0000000..e5f818f
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/ilink.xml
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+__COPYRIGHT__
+
+This file is processed by the bin/SConsDoc.py module.
+See its __doc__ string for a discussion of the format.
+-->
+
+<!DOCTYPE sconsdoc [
+<!ENTITY % scons SYSTEM '../../../../doc/scons.mod'>
+%scons;
+<!ENTITY % builders-mod SYSTEM '../../../../doc/generated/builders.mod'>
+%builders-mod;
+<!ENTITY % functions-mod SYSTEM '../../../../doc/generated/functions.mod'>
+%functions-mod;
+<!ENTITY % tools-mod SYSTEM '../../../../doc/generated/tools.mod'>
+%tools-mod;
+<!ENTITY % variables-mod SYSTEM '../../../../doc/generated/variables.mod'>
+%variables-mod;
+]>
+
+<sconsdoc xmlns="http://www.scons.org/dbxsd/v1.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://www.scons.org/dbxsd/v1.0 http://www.scons.org/dbxsd/v1.0/scons.xsd">
+
+<tool name="ilink">
+<summary>
+<para>
+Sets construction variables for the
+<application>ilink</application> linker on OS/2 systems.
+</para>
+</summary>
+<sets>
+<item>LINK</item>
+<item>LINKFLAGS</item>
+<item>LINKCOM</item>
+<item>LIBDIRPREFIX</item>
+<item>LIBDIRSUFFIX</item>
+<item>LIBLINKPREFIX</item>
+<item>LIBLINKSUFFIX</item>
+</sets>
+<uses>
+</uses>
+</tool>
+
+</sconsdoc>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/ilink32.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/ilink32.py
new file mode 100644
index 0000000..1452fd5
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/ilink32.py
@@ -0,0 +1,60 @@
+"""SCons.Tool.ilink32
+
+XXX
+
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import SCons.Tool
+import SCons.Tool.bcc32
+import SCons.Util
+
+def generate(env):
+ """Add Builders and construction variables for Borland ilink to an
+ Environment."""
+ SCons.Tool.createSharedLibBuilder(env)
+ SCons.Tool.createProgBuilder(env)
+
+ env['LINK'] = '$CC'
+ env['LINKFLAGS'] = SCons.Util.CLVar('')
+ env['LINKCOM'] = '$LINK -q $LINKFLAGS -e$TARGET $SOURCES $LIBS'
+ env['LIBDIRPREFIX']=''
+ env['LIBDIRSUFFIX']=''
+ env['LIBLINKPREFIX']=''
+ env['LIBLINKSUFFIX']='$LIBSUFFIX'
+
+
+def exists(env):
+ # Uses bcc32 to do linking as it generally knows where the standard
+ # LIBS are and set up the linking correctly
+ return SCons.Tool.bcc32.findIt('bcc32', env)
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/ilink32.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/ilink32.xml
new file mode 100644
index 0000000..0ae6f2b
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/ilink32.xml
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+__COPYRIGHT__
+
+This file is processed by the bin/SConsDoc.py module.
+See its __doc__ string for a discussion of the format.
+-->
+
+<!DOCTYPE sconsdoc [
+<!ENTITY % scons SYSTEM '../../../../doc/scons.mod'>
+%scons;
+<!ENTITY % builders-mod SYSTEM '../../../../doc/generated/builders.mod'>
+%builders-mod;
+<!ENTITY % functions-mod SYSTEM '../../../../doc/generated/functions.mod'>
+%functions-mod;
+<!ENTITY % tools-mod SYSTEM '../../../../doc/generated/tools.mod'>
+%tools-mod;
+<!ENTITY % variables-mod SYSTEM '../../../../doc/generated/variables.mod'>
+%variables-mod;
+]>
+
+<sconsdoc xmlns="http://www.scons.org/dbxsd/v1.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://www.scons.org/dbxsd/v1.0 http://www.scons.org/dbxsd/v1.0/scons.xsd">
+
+<tool name="ilink32">
+<summary>
+<para>
+Sets construction variables for the Borland
+<application>ilink32</application> linker.
+</para>
+</summary>
+<sets>
+<item>LINK</item>
+<item>LINKFLAGS</item>
+<item>LINKCOM</item>
+<item>LIBDIRPREFIX</item>
+<item>LIBDIRSUFFIX</item>
+<item>LIBLINKPREFIX</item>
+<item>LIBLINKSUFFIX</item>
+</sets>
+<uses>
+</uses>
+</tool>
+
+</sconsdoc>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/install.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/install.py
new file mode 100644
index 0000000..c0a193b
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/install.py
@@ -0,0 +1,428 @@
+"""SCons.Tool.install
+
+Tool-specific initialization for the install tool.
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+from __future__ import print_function
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import os
+import re
+import shutil
+import stat
+
+import SCons.Action
+import SCons.Tool
+import SCons.Util
+
+#
+# We keep track of *all* installed files.
+_INSTALLED_FILES = []
+_UNIQUE_INSTALLED_FILES = None
+
+class CopytreeError(EnvironmentError):
+ pass
+
+# This is a patched version of shutil.copytree from python 2.5. It
+# doesn't fail if the dir exists, which regular copytree does
+# (annoyingly). Note the XXX comment in the docstring.
+def scons_copytree(src, dst, symlinks=False):
+ """Recursively copy a directory tree using copy2().
+
+ The destination directory must not already exist.
+ If exception(s) occur, an CopytreeError is raised with a list of reasons.
+
+ If the optional symlinks flag is true, symbolic links in the
+ source tree result in symbolic links in the destination tree; if
+ it is false, the contents of the files pointed to by symbolic
+ links are copied.
+
+ XXX Consider this example code rather than the ultimate tool.
+
+ """
+ names = os.listdir(src)
+ # garyo@genarts.com fix: check for dir before making dirs.
+ if not os.path.exists(dst):
+ os.makedirs(dst)
+ errors = []
+ for name in names:
+ srcname = os.path.join(src, name)
+ dstname = os.path.join(dst, name)
+ try:
+ if symlinks and os.path.islink(srcname):
+ linkto = os.readlink(srcname)
+ os.symlink(linkto, dstname)
+ elif os.path.isdir(srcname):
+ scons_copytree(srcname, dstname, symlinks)
+ else:
+ shutil.copy2(srcname, dstname)
+ # XXX What about devices, sockets etc.?
+ except (IOError, os.error) as why:
+ errors.append((srcname, dstname, str(why)))
+ # catch the CopytreeError from the recursive copytree so that we can
+ # continue with other files
+ except CopytreeError as err:
+ errors.extend(err.args[0])
+ try:
+ shutil.copystat(src, dst)
+ except SCons.Util.WinError:
+ # can't copy file access times on Windows
+ pass
+ except OSError as why:
+ errors.extend((src, dst, str(why)))
+ if errors:
+ raise CopytreeError(errors)
+
+
+#
+# Functions doing the actual work of the Install Builder.
+#
+def copyFunc(dest, source, env):
+ """Install a source file or directory into a destination by copying,
+ (including copying permission/mode bits)."""
+
+ if os.path.isdir(source):
+ if os.path.exists(dest):
+ if not os.path.isdir(dest):
+ raise SCons.Errors.UserError("cannot overwrite non-directory `%s' with a directory `%s'" % (str(dest), str(source)))
+ else:
+ parent = os.path.split(dest)[0]
+ if not os.path.exists(parent):
+ os.makedirs(parent)
+ scons_copytree(source, dest)
+ else:
+ shutil.copy2(source, dest)
+ st = os.stat(source)
+ os.chmod(dest, stat.S_IMODE(st[stat.ST_MODE]) | stat.S_IWRITE)
+
+ return 0
+
+#
+# Functions doing the actual work of the InstallVersionedLib Builder.
+#
+def copyFuncVersionedLib(dest, source, env):
+ """Install a versioned library into a destination by copying,
+ (including copying permission/mode bits) and then creating
+ required symlinks."""
+
+ if os.path.isdir(source):
+ raise SCons.Errors.UserError("cannot install directory `%s' as a version library" % str(source) )
+ else:
+ # remove the link if it is already there
+ try:
+ os.remove(dest)
+ except:
+ pass
+ shutil.copy2(source, dest)
+ st = os.stat(source)
+ os.chmod(dest, stat.S_IMODE(st[stat.ST_MODE]) | stat.S_IWRITE)
+ installShlibLinks(dest, source, env)
+
+ return 0
+
+def listShlibLinksToInstall(dest, source, env):
+ install_links = []
+ source = env.arg2nodes(source)
+ dest = env.fs.File(dest)
+ install_dir = dest.get_dir()
+ for src in source:
+ symlinks = getattr(getattr(src,'attributes',None), 'shliblinks', None)
+ if symlinks:
+ for link, linktgt in symlinks:
+ link_base = os.path.basename(link.get_path())
+ linktgt_base = os.path.basename(linktgt.get_path())
+ install_link = env.fs.File(link_base, install_dir)
+ install_linktgt = env.fs.File(linktgt_base, install_dir)
+ install_links.append((install_link, install_linktgt))
+ return install_links
+
+def installShlibLinks(dest, source, env):
+ """If we are installing a versioned shared library create the required links."""
+ Verbose = False
+ symlinks = listShlibLinksToInstall(dest, source, env)
+ if Verbose:
+ print('installShlibLinks: symlinks={:r}'.format(SCons.Tool.StringizeLibSymlinks(symlinks)))
+ if symlinks:
+ SCons.Tool.CreateLibSymlinks(env, symlinks)
+ return
+
+def installFunc(target, source, env):
+ """Install a source file into a target using the function specified
+ as the INSTALL construction variable."""
+ try:
+ install = env['INSTALL']
+ except KeyError:
+ raise SCons.Errors.UserError('Missing INSTALL construction variable.')
+
+ assert len(target)==len(source), \
+ "Installing source %s into target %s: target and source lists must have same length."%(list(map(str, source)), list(map(str, target)))
+ for t,s in zip(target,source):
+ if install(t.get_path(),s.get_path(),env):
+ return 1
+
+ return 0
+
+def installFuncVersionedLib(target, source, env):
+ """Install a versioned library into a target using the function specified
+ as the INSTALLVERSIONEDLIB construction variable."""
+ try:
+ install = env['INSTALLVERSIONEDLIB']
+ except KeyError:
+ raise SCons.Errors.UserError('Missing INSTALLVERSIONEDLIB construction variable.')
+
+ assert len(target)==len(source), \
+ "Installing source %s into target %s: target and source lists must have same length."%(list(map(str, source)), list(map(str, target)))
+ for t,s in zip(target,source):
+ if hasattr(t.attributes, 'shlibname'):
+ tpath = os.path.join(t.get_dir(), t.attributes.shlibname)
+ else:
+ tpath = t.get_path()
+ if install(tpath,s.get_path(),env):
+ return 1
+
+ return 0
+
+def stringFunc(target, source, env):
+ installstr = env.get('INSTALLSTR')
+ if installstr:
+ return env.subst_target_source(installstr, 0, target, source)
+ target = str(target[0])
+ source = str(source[0])
+ if os.path.isdir(source):
+ type = 'directory'
+ else:
+ type = 'file'
+ return 'Install %s: "%s" as "%s"' % (type, source, target)
+
+#
+# Emitter functions
+#
+def add_targets_to_INSTALLED_FILES(target, source, env):
+ """ An emitter that adds all target files to the list stored in the
+ _INSTALLED_FILES global variable. This way all installed files of one
+ scons call will be collected.
+ """
+ global _INSTALLED_FILES, _UNIQUE_INSTALLED_FILES
+ _INSTALLED_FILES.extend(target)
+
+ _UNIQUE_INSTALLED_FILES = None
+ return (target, source)
+
+def add_versioned_targets_to_INSTALLED_FILES(target, source, env):
+ """ An emitter that adds all target files to the list stored in the
+ _INSTALLED_FILES global variable. This way all installed files of one
+ scons call will be collected.
+ """
+ global _INSTALLED_FILES, _UNIQUE_INSTALLED_FILES
+ Verbose = False
+ _INSTALLED_FILES.extend(target)
+ if Verbose:
+ print("add_versioned_targets_to_INSTALLED_FILES: target={:r}".format(list(map(str, target))))
+ symlinks = listShlibLinksToInstall(target[0], source, env)
+ if symlinks:
+ SCons.Tool.EmitLibSymlinks(env, symlinks, target[0])
+ _UNIQUE_INSTALLED_FILES = None
+ return (target, source)
+
+class DESTDIR_factory(object):
+ """ A node factory, where all files will be relative to the dir supplied
+ in the constructor.
+ """
+ def __init__(self, env, dir):
+ self.env = env
+ self.dir = env.arg2nodes( dir, env.fs.Dir )[0]
+
+ def Entry(self, name):
+ name = SCons.Util.make_path_relative(name)
+ return self.dir.Entry(name)
+
+ def Dir(self, name):
+ name = SCons.Util.make_path_relative(name)
+ return self.dir.Dir(name)
+
+#
+# The Builder Definition
+#
+install_action = SCons.Action.Action(installFunc, stringFunc)
+installas_action = SCons.Action.Action(installFunc, stringFunc)
+installVerLib_action = SCons.Action.Action(installFuncVersionedLib, stringFunc)
+
+BaseInstallBuilder = None
+
+def InstallBuilderWrapper(env, target=None, source=None, dir=None, **kw):
+ if target and dir:
+ import SCons.Errors
+ raise SCons.Errors.UserError("Both target and dir defined for Install(), only one may be defined.")
+ if not dir:
+ dir=target
+
+ import SCons.Script
+ install_sandbox = SCons.Script.GetOption('install_sandbox')
+ if install_sandbox:
+ target_factory = DESTDIR_factory(env, install_sandbox)
+ else:
+ target_factory = env.fs
+
+ try:
+ dnodes = env.arg2nodes(dir, target_factory.Dir)
+ except TypeError:
+ raise SCons.Errors.UserError("Target `%s' of Install() is a file, but should be a directory. Perhaps you have the Install() arguments backwards?" % str(dir))
+ sources = env.arg2nodes(source, env.fs.Entry)
+ tgt = []
+ for dnode in dnodes:
+ for src in sources:
+ # Prepend './' so the lookup doesn't interpret an initial
+ # '#' on the file name portion as meaning the Node should
+ # be relative to the top-level SConstruct directory.
+ target = env.fs.Entry('.'+os.sep+src.name, dnode)
+ tgt.extend(BaseInstallBuilder(env, target, src, **kw))
+ return tgt
+
+
+def InstallAsBuilderWrapper(env, target=None, source=None, **kw):
+ result = []
+ for src, tgt in map(lambda x, y: (x, y), source, target):
+ result.extend(BaseInstallBuilder(env, tgt, src, **kw))
+ return result
+
+BaseVersionedInstallBuilder = None
+
+
+def InstallVersionedBuilderWrapper(env, target=None, source=None, dir=None, **kw):
+ if target and dir:
+ import SCons.Errors
+ raise SCons.Errors.UserError("Both target and dir defined for Install(), only one may be defined.")
+ if not dir:
+ dir=target
+
+ import SCons.Script
+ install_sandbox = SCons.Script.GetOption('install_sandbox')
+ if install_sandbox:
+ target_factory = DESTDIR_factory(env, install_sandbox)
+ else:
+ target_factory = env.fs
+
+ try:
+ dnodes = env.arg2nodes(dir, target_factory.Dir)
+ except TypeError:
+ raise SCons.Errors.UserError("Target `%s' of Install() is a file, but should be a directory. Perhaps you have the Install() arguments backwards?" % str(dir))
+ sources = env.arg2nodes(source, env.fs.Entry)
+ tgt = []
+ for dnode in dnodes:
+ for src in sources:
+ # Prepend './' so the lookup doesn't interpret an initial
+ # '#' on the file name portion as meaning the Node should
+ # be relative to the top-level SConstruct directory.
+ target = env.fs.Entry('.'+os.sep+src.name, dnode)
+ tgt.extend(BaseVersionedInstallBuilder(env, target, src, **kw))
+ return tgt
+
+added = None
+
+
+def generate(env):
+
+ from SCons.Script import AddOption, GetOption
+ global added
+ if not added:
+ added = 1
+ AddOption('--install-sandbox',
+ dest='install_sandbox',
+ type="string",
+ action="store",
+ help='A directory under which all installed files will be placed.')
+
+ global BaseInstallBuilder
+ if BaseInstallBuilder is None:
+ install_sandbox = GetOption('install_sandbox')
+ if install_sandbox:
+ target_factory = DESTDIR_factory(env, install_sandbox)
+ else:
+ target_factory = env.fs
+
+ BaseInstallBuilder = SCons.Builder.Builder(
+ action = install_action,
+ target_factory = target_factory.Entry,
+ source_factory = env.fs.Entry,
+ multi = 1,
+ emitter = [ add_targets_to_INSTALLED_FILES, ],
+ source_scanner = SCons.Scanner.Base( {}, name = 'Install', recursive = False ),
+ name = 'InstallBuilder')
+
+ global BaseVersionedInstallBuilder
+ if BaseVersionedInstallBuilder is None:
+ install_sandbox = GetOption('install_sandbox')
+ if install_sandbox:
+ target_factory = DESTDIR_factory(env, install_sandbox)
+ else:
+ target_factory = env.fs
+
+ BaseVersionedInstallBuilder = SCons.Builder.Builder(
+ action = installVerLib_action,
+ target_factory = target_factory.Entry,
+ source_factory = env.fs.Entry,
+ multi = 1,
+ emitter = [ add_versioned_targets_to_INSTALLED_FILES, ],
+ name = 'InstallVersionedBuilder')
+
+ env['BUILDERS']['_InternalInstall'] = InstallBuilderWrapper
+ env['BUILDERS']['_InternalInstallAs'] = InstallAsBuilderWrapper
+ env['BUILDERS']['_InternalInstallVersionedLib'] = InstallVersionedBuilderWrapper
+
+ # We'd like to initialize this doing something like the following,
+ # but there isn't yet support for a ${SOURCE.type} expansion that
+ # will print "file" or "directory" depending on what's being
+ # installed. For now we punt by not initializing it, and letting
+ # the stringFunc() that we put in the action fall back to the
+ # hand-crafted default string if it's not set.
+ #
+ #try:
+ # env['INSTALLSTR']
+ #except KeyError:
+ # env['INSTALLSTR'] = 'Install ${SOURCE.type}: "$SOURCES" as "$TARGETS"'
+
+ try:
+ env['INSTALL']
+ except KeyError:
+ env['INSTALL'] = copyFunc
+
+ try:
+ env['INSTALLVERSIONEDLIB']
+ except KeyError:
+ env['INSTALLVERSIONEDLIB'] = copyFuncVersionedLib
+
+def exists(env):
+ return 1
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/install.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/install.xml
new file mode 100644
index 0000000..6ae3e30
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/install.xml
@@ -0,0 +1,96 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+__COPYRIGHT__
+
+This file is processed by the bin/SConsDoc.py module.
+See its __doc__ string for a discussion of the format.
+-->
+
+<!DOCTYPE sconsdoc [
+<!ENTITY % scons SYSTEM '../../../../doc/scons.mod'>
+%scons;
+<!ENTITY % builders-mod SYSTEM '../../../../doc/generated/builders.mod'>
+%builders-mod;
+<!ENTITY % functions-mod SYSTEM '../../../../doc/generated/functions.mod'>
+%functions-mod;
+<!ENTITY % tools-mod SYSTEM '../../../../doc/generated/tools.mod'>
+%tools-mod;
+<!ENTITY % variables-mod SYSTEM '../../../../doc/generated/variables.mod'>
+%variables-mod;
+]>
+
+<sconsdoc xmlns="http://www.scons.org/dbxsd/v1.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://www.scons.org/dbxsd/v1.0 http://www.scons.org/dbxsd/v1.0/scons.xsd">
+
+
+<tool name="install">
+<summary>
+<para>
+Sets construction variables for file
+and directory installation.
+</para>
+</summary>
+<sets>
+<item>INSTALL</item>
+<item>INSTALLSTR</item>
+</sets>
+</tool>
+
+<builder name="Install">
+<summary>
+<para>
+Installs one or more source files or directories
+in the specified target,
+which must be a directory.
+The names of the specified source files or directories
+remain the same within the destination directory. The
+sources may be given as a string or as a node returned by
+a builder.
+</para>
+
+<example_commands>
+env.Install('/usr/local/bin', source = ['foo', 'bar'])
+</example_commands>
+</summary>
+</builder>
+
+<builder name="InstallAs">
+<summary>
+<para>
+Installs one or more source files or directories
+to specific names,
+allowing changing a file or directory name
+as part of the installation.
+It is an error if the
+target
+and
+source
+arguments list different numbers of files or directories.
+</para>
+
+<example_commands>
+env.InstallAs(target = '/usr/local/bin/foo',
+ source = 'foo_debug')
+env.InstallAs(target = ['../lib/libfoo.a', '../lib/libbar.a'],
+ source = ['libFOO.a', 'libBAR.a'])
+</example_commands>
+
+</summary>
+</builder>
+
+<builder name="InstallVersionedLib">
+<summary>
+<para>
+Installs a versioned shared library. The symlinks appropriate to the
+architecture will be generated based on symlinks of the source library.
+</para>
+
+<example_commands>
+env.InstallVersionedLib(target = '/usr/local/bin/foo',
+ source = 'libxyz.1.5.2.so')
+</example_commands>
+</summary>
+</builder>
+
+</sconsdoc>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/intelc.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/intelc.py
new file mode 100644
index 0000000..02da912
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/intelc.py
@@ -0,0 +1,613 @@
+"""SCons.Tool.icl
+
+Tool-specific initialization for the Intel C/C++ compiler.
+Supports Linux and Windows compilers, v7 and up.
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+from __future__ import division, print_function
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import math, sys, os.path, glob, string, re
+
+is_windows = sys.platform == 'win32'
+is_win64 = is_windows and (os.environ['PROCESSOR_ARCHITECTURE'] == 'AMD64' or
+ ('PROCESSOR_ARCHITEW6432' in os.environ and
+ os.environ['PROCESSOR_ARCHITEW6432'] == 'AMD64'))
+is_linux = sys.platform.startswith('linux')
+is_mac = sys.platform == 'darwin'
+
+if is_windows:
+ import SCons.Tool.msvc
+elif is_linux:
+ import SCons.Tool.gcc
+elif is_mac:
+ import SCons.Tool.gcc
+import SCons.Util
+import SCons.Warnings
+
+# Exceptions for this tool
+class IntelCError(SCons.Errors.InternalError):
+ pass
+class MissingRegistryError(IntelCError): # missing registry entry
+ pass
+class MissingDirError(IntelCError): # dir not found
+ pass
+class NoRegistryModuleError(IntelCError): # can't read registry at all
+ pass
+
+def linux_ver_normalize(vstr):
+ """Normalize a Linux compiler version number.
+ Intel changed from "80" to "9.0" in 2005, so we assume if the number
+ is greater than 60 it's an old-style number and otherwise new-style.
+ Always returns an old-style float like 80 or 90 for compatibility with Windows.
+ Shades of Y2K!"""
+ # Check for version number like 9.1.026: return 91.026
+ # XXX needs to be updated for 2011+ versions (like 2011.11.344 which is compiler v12.1.5)
+ m = re.match(r'([0-9]+)\.([0-9]+)\.([0-9]+)', vstr)
+ if m:
+ vmaj,vmin,build = m.groups()
+ return float(vmaj) * 10. + float(vmin) + float(build) / 1000.;
+ else:
+ f = float(vstr)
+ if is_windows:
+ return f
+ else:
+ if f < 60: return f * 10.0
+ else: return f
+
+def check_abi(abi):
+ """Check for valid ABI (application binary interface) name,
+ and map into canonical one"""
+ if not abi:
+ return None
+ abi = abi.lower()
+ # valid_abis maps input name to canonical name
+ if is_windows:
+ valid_abis = {'ia32' : 'ia32',
+ 'x86' : 'ia32',
+ 'ia64' : 'ia64',
+ 'em64t' : 'em64t',
+ 'amd64' : 'em64t'}
+ if is_linux:
+ valid_abis = {'ia32' : 'ia32',
+ 'x86' : 'ia32',
+ 'x86_64' : 'x86_64',
+ 'em64t' : 'x86_64',
+ 'amd64' : 'x86_64'}
+ if is_mac:
+ valid_abis = {'ia32' : 'ia32',
+ 'x86' : 'ia32',
+ 'x86_64' : 'x86_64',
+ 'em64t' : 'x86_64'}
+ try:
+ abi = valid_abis[abi]
+ except KeyError:
+ raise SCons.Errors.UserError("Intel compiler: Invalid ABI %s, valid values are %s"% \
+ (abi, list(valid_abis.keys())))
+ return abi
+
+def vercmp(a, b):
+ """Compare strings as floats,
+ but Intel changed Linux naming convention at 9.0"""
+ return cmp(linux_ver_normalize(b), linux_ver_normalize(a))
+
+def get_version_from_list(v, vlist):
+ """See if we can match v (string) in vlist (list of strings)
+ Linux has to match in a fuzzy way."""
+ if is_windows:
+ # Simple case, just find it in the list
+ if v in vlist: return v
+ else: return None
+ else:
+ # Fuzzy match: normalize version number first, but still return
+ # original non-normalized form.
+ fuzz = 0.001
+ for vi in vlist:
+ if math.fabs(linux_ver_normalize(vi) - linux_ver_normalize(v)) < fuzz:
+ return vi
+ # Not found
+ return None
+
+def get_intel_registry_value(valuename, version=None, abi=None):
+ """
+ Return a value from the Intel compiler registry tree. (Windows only)
+ """
+ # Open the key:
+ if is_win64:
+ K = 'Software\\Wow6432Node\\Intel\\Compilers\\C++\\' + version + '\\'+abi.upper()
+ else:
+ K = 'Software\\Intel\\Compilers\\C++\\' + version + '\\'+abi.upper()
+ try:
+ k = SCons.Util.RegOpenKeyEx(SCons.Util.HKEY_LOCAL_MACHINE, K)
+ except SCons.Util.RegError:
+ # For version 13 and later, check UUID subkeys for valuename
+ if is_win64:
+ K = 'Software\\Wow6432Node\\Intel\\Suites\\' + version + "\\Defaults\\C++\\" + abi.upper()
+ else:
+ K = 'Software\\Intel\\Suites\\' + version + "\\Defaults\\C++\\" + abi.upper()
+ try:
+ k = SCons.Util.RegOpenKeyEx(SCons.Util.HKEY_LOCAL_MACHINE, K)
+ uuid = SCons.Util.RegQueryValueEx(k, 'SubKey')[0]
+
+ if is_win64:
+ K = 'Software\\Wow6432Node\\Intel\\Suites\\' + version + "\\" + uuid + "\\C++"
+ else:
+ K = 'Software\\Intel\\Suites\\' + version + "\\" + uuid + "\\C++"
+ k = SCons.Util.RegOpenKeyEx(SCons.Util.HKEY_LOCAL_MACHINE, K)
+
+ try:
+ v = SCons.Util.RegQueryValueEx(k, valuename)[0]
+ return v # or v.encode('iso-8859-1', 'replace') to remove unicode?
+ except SCons.Util.RegError:
+ if abi.upper() == 'EM64T':
+ abi = 'em64t_native'
+ if is_win64:
+ K = 'Software\\Wow6432Node\\Intel\\Suites\\' + version + "\\" + uuid + "\\C++\\" + abi.upper()
+ else:
+ K = 'Software\\Intel\\Suites\\' + version + "\\" + uuid + "\\C++\\" + abi.upper()
+ k = SCons.Util.RegOpenKeyEx(SCons.Util.HKEY_LOCAL_MACHINE, K)
+
+ try:
+ v = SCons.Util.RegQueryValueEx(k, valuename)[0]
+ return v # or v.encode('iso-8859-1', 'replace') to remove unicode?
+ except SCons.Util.RegError:
+ raise MissingRegistryError("%s was not found in the registry, for Intel compiler version %s, abi='%s'"%(K, version,abi))
+
+ except SCons.Util.RegError:
+ raise MissingRegistryError("%s was not found in the registry, for Intel compiler version %s, abi='%s'"%(K, version,abi))
+ except SCons.Util.WinError:
+ raise MissingRegistryError("%s was not found in the registry, for Intel compiler version %s, abi='%s'"%(K, version,abi))
+
+ # Get the value:
+ try:
+ v = SCons.Util.RegQueryValueEx(k, valuename)[0]
+ return v # or v.encode('iso-8859-1', 'replace') to remove unicode?
+ except SCons.Util.RegError:
+ raise MissingRegistryError("%s\\%s was not found in the registry."%(K, valuename))
+
+
+def get_all_compiler_versions():
+ """Returns a sorted list of strings, like "70" or "80" or "9.0"
+ with most recent compiler version first.
+ """
+ versions=[]
+ if is_windows:
+ if is_win64:
+ keyname = 'Software\\WoW6432Node\\Intel\\Compilers\\C++'
+ else:
+ keyname = 'Software\\Intel\\Compilers\\C++'
+ try:
+ k = SCons.Util.RegOpenKeyEx(SCons.Util.HKEY_LOCAL_MACHINE,
+ keyname)
+ except SCons.Util.WinError:
+ # For version 13 or later, check for default instance UUID
+ if is_win64:
+ keyname = 'Software\\WoW6432Node\\Intel\\Suites'
+ else:
+ keyname = 'Software\\Intel\\Suites'
+ try:
+ k = SCons.Util.RegOpenKeyEx(SCons.Util.HKEY_LOCAL_MACHINE,
+ keyname)
+ except SCons.Util.WinError:
+ return []
+ i = 0
+ versions = []
+ try:
+ while i < 100:
+ subkey = SCons.Util.RegEnumKey(k, i) # raises EnvironmentError
+ # Check that this refers to an existing dir.
+ # This is not 100% perfect but should catch common
+ # installation issues like when the compiler was installed
+ # and then the install directory deleted or moved (rather
+ # than uninstalling properly), so the registry values
+ # are still there.
+ if subkey == 'Defaults': # Ignore default instances
+ i = i + 1
+ continue
+ ok = False
+ for try_abi in ('IA32', 'IA32e', 'IA64', 'EM64T'):
+ try:
+ d = get_intel_registry_value('ProductDir', subkey, try_abi)
+ except MissingRegistryError:
+ continue # not found in reg, keep going
+ if os.path.exists(d): ok = True
+ if ok:
+ versions.append(subkey)
+ else:
+ try:
+ # Registry points to nonexistent dir. Ignore this
+ # version.
+ value = get_intel_registry_value('ProductDir', subkey, 'IA32')
+ except MissingRegistryError as e:
+
+ # Registry key is left dangling (potentially
+ # after uninstalling).
+
+ print("scons: *** Ignoring the registry key for the Intel compiler version %s.\n" \
+ "scons: *** It seems that the compiler was uninstalled and that the registry\n" \
+ "scons: *** was not cleaned up properly.\n" % subkey)
+ else:
+ print("scons: *** Ignoring "+str(value))
+
+ i = i + 1
+ except EnvironmentError:
+ # no more subkeys
+ pass
+ elif is_linux or is_mac:
+ for d in glob.glob('/opt/intel_cc_*'):
+ # Typical dir here is /opt/intel_cc_80.
+ m = re.search(r'cc_(.*)$', d)
+ if m:
+ versions.append(m.group(1))
+ for d in glob.glob('/opt/intel/cc*/*'):
+ # Typical dir here is /opt/intel/cc/9.0 for IA32,
+ # /opt/intel/cce/9.0 for EMT64 (AMD64)
+ m = re.search(r'([0-9][0-9.]*)$', d)
+ if m:
+ versions.append(m.group(1))
+ for d in glob.glob('/opt/intel/Compiler/*'):
+ # Typical dir here is /opt/intel/Compiler/11.1
+ m = re.search(r'([0-9][0-9.]*)$', d)
+ if m:
+ versions.append(m.group(1))
+ for d in glob.glob('/opt/intel/composerxe-*'):
+ # Typical dir here is /opt/intel/composerxe-2011.4.184
+ m = re.search(r'([0-9][0-9.]*)$', d)
+ if m:
+ versions.append(m.group(1))
+ for d in glob.glob('/opt/intel/composer_xe_*'):
+ # Typical dir here is /opt/intel/composer_xe_2011_sp1.11.344
+ # The _sp1 is useless, the installers are named 2011.9.x, 2011.10.x, 2011.11.x
+ m = re.search(r'([0-9]{0,4})(?:_sp\d*)?\.([0-9][0-9.]*)$', d)
+ if m:
+ versions.append("%s.%s"%(m.group(1), m.group(2)))
+ for d in glob.glob('/opt/intel/compilers_and_libraries_*'):
+ # JPA: For the new version of Intel compiler 2016.1.
+ m = re.search(r'([0-9]{0,4})(?:_sp\d*)?\.([0-9][0-9.]*)$', d)
+ if m:
+ versions.append("%s.%s"%(m.group(1), m.group(2)))
+
+ def keyfunc(str):
+ """Given a dot-separated version string, return a tuple of ints representing it."""
+ return [int(x) for x in str.split('.')]
+ # split into ints, sort, then remove dups
+ return sorted(SCons.Util.unique(versions), key=keyfunc, reverse=True)
+
+def get_intel_compiler_top(version, abi):
+ """
+ Return the main path to the top-level dir of the Intel compiler,
+ using the given version.
+ The compiler will be in <top>/bin/icl.exe (icc on linux),
+ the include dir is <top>/include, etc.
+ """
+
+ if is_windows:
+ if not SCons.Util.can_read_reg:
+ raise NoRegistryModuleError("No Windows registry module was found")
+ top = get_intel_registry_value('ProductDir', version, abi)
+ archdir={'x86_64': 'intel64',
+ 'amd64' : 'intel64',
+ 'em64t' : 'intel64',
+ 'x86' : 'ia32',
+ 'i386' : 'ia32',
+ 'ia32' : 'ia32'
+ }[abi] # for v11 and greater
+ # pre-11, icl was in Bin. 11 and later, it's in Bin/<abi> apparently.
+ if not os.path.exists(os.path.join(top, "Bin", "icl.exe")) \
+ and not os.path.exists(os.path.join(top, "Bin", abi, "icl.exe")) \
+ and not os.path.exists(os.path.join(top, "Bin", archdir, "icl.exe")):
+ raise MissingDirError("Can't find Intel compiler in %s"%(top))
+ elif is_mac or is_linux:
+ def find_in_2008style_dir(version):
+ # first dir is new (>=9.0) style, second is old (8.0) style.
+ dirs=('/opt/intel/cc/%s', '/opt/intel_cc_%s')
+ if abi == 'x86_64':
+ dirs=('/opt/intel/cce/%s',) # 'e' stands for 'em64t', aka x86_64 aka amd64
+ top=None
+ for d in dirs:
+ if os.path.exists(os.path.join(d%version, "bin", "icc")):
+ top = d%version
+ break
+ return top
+ def find_in_2010style_dir(version):
+ dirs=('/opt/intel/Compiler/%s/*'%version)
+ # typically /opt/intel/Compiler/11.1/064 (then bin/intel64/icc)
+ dirs=glob.glob(dirs)
+ # find highest sub-version number by reverse sorting and picking first existing one.
+ dirs.sort()
+ dirs.reverse()
+ top=None
+ for d in dirs:
+ if (os.path.exists(os.path.join(d, "bin", "ia32", "icc")) or
+ os.path.exists(os.path.join(d, "bin", "intel64", "icc"))):
+ top = d
+ break
+ return top
+ def find_in_2011style_dir(version):
+ # The 2011 (compiler v12) dirs are inconsistent, so just redo the search from
+ # get_all_compiler_versions and look for a match (search the newest form first)
+ top=None
+ for d in glob.glob('/opt/intel/composer_xe_*'):
+ # Typical dir here is /opt/intel/composer_xe_2011_sp1.11.344
+ # The _sp1 is useless, the installers are named 2011.9.x, 2011.10.x, 2011.11.x
+ m = re.search(r'([0-9]{0,4})(?:_sp\d*)?\.([0-9][0-9.]*)$', d)
+ if m:
+ cur_ver = "%s.%s"%(m.group(1), m.group(2))
+ if cur_ver == version and \
+ (os.path.exists(os.path.join(d, "bin", "ia32", "icc")) or
+ os.path.exists(os.path.join(d, "bin", "intel64", "icc"))):
+ top = d
+ break
+ if not top:
+ for d in glob.glob('/opt/intel/composerxe-*'):
+ # Typical dir here is /opt/intel/composerxe-2011.4.184
+ m = re.search(r'([0-9][0-9.]*)$', d)
+ if m and m.group(1) == version and \
+ (os.path.exists(os.path.join(d, "bin", "ia32", "icc")) or
+ os.path.exists(os.path.join(d, "bin", "intel64", "icc"))):
+ top = d
+ break
+ return top
+ def find_in_2016style_dir(version):
+ # The 2016 (compiler v16) dirs are inconsistent from previous.
+ top = None
+ for d in glob.glob('/opt/intel/compilers_and_libraries_%s/linux'%version):
+ if os.path.exists(os.path.join(d, "bin", "ia32", "icc")) or os.path.exists(os.path.join(d, "bin", "intel64", "icc")):
+ top = d
+ break
+ return top
+
+ top = find_in_2016style_dir(version) or find_in_2011style_dir(version) or find_in_2010style_dir(version) or find_in_2008style_dir(version)
+ # print "INTELC: top=",top
+ if not top:
+ raise MissingDirError("Can't find version %s Intel compiler in %s (abi='%s')"%(version,top, abi))
+ return top
+
+
+def generate(env, version=None, abi=None, topdir=None, verbose=0):
+ """Add Builders and construction variables for Intel C/C++ compiler
+ to an Environment.
+ args:
+ version: (string) compiler version to use, like "80"
+ abi: (string) 'win32' or whatever Itanium version wants
+ topdir: (string) compiler top dir, like
+ "c:\Program Files\Intel\Compiler70"
+ If topdir is used, version and abi are ignored.
+ verbose: (int) if >0, prints compiler version used.
+ """
+ if not (is_mac or is_linux or is_windows):
+ # can't handle this platform
+ return
+
+ if is_windows:
+ SCons.Tool.msvc.generate(env)
+ elif is_linux:
+ SCons.Tool.gcc.generate(env)
+ elif is_mac:
+ SCons.Tool.gcc.generate(env)
+
+ # if version is unspecified, use latest
+ vlist = get_all_compiler_versions()
+ if not version:
+ if vlist:
+ version = vlist[0]
+ else:
+ # User may have specified '90' but we need to get actual dirname '9.0'.
+ # get_version_from_list does that mapping.
+ v = get_version_from_list(version, vlist)
+ if not v:
+ raise SCons.Errors.UserError("Invalid Intel compiler version %s: "%version + \
+ "installed versions are %s"%(', '.join(vlist)))
+ version = v
+
+ # if abi is unspecified, use ia32
+ # alternatives are ia64 for Itanium, or amd64 or em64t or x86_64 (all synonyms here)
+ abi = check_abi(abi)
+ if abi is None:
+ if is_mac or is_linux:
+ # Check if we are on 64-bit linux, default to 64 then.
+ uname_m = os.uname()[4]
+ if uname_m == 'x86_64':
+ abi = 'x86_64'
+ else:
+ abi = 'ia32'
+ else:
+ if is_win64:
+ abi = 'em64t'
+ else:
+ abi = 'ia32'
+
+ if version and not topdir:
+ try:
+ topdir = get_intel_compiler_top(version, abi)
+ except (SCons.Util.RegError, IntelCError):
+ topdir = None
+
+ if not topdir:
+ # Normally this is an error, but it might not be if the compiler is
+ # on $PATH and the user is importing their env.
+ class ICLTopDirWarning(SCons.Warnings.Warning):
+ pass
+ if (is_mac or is_linux) and not env.Detect('icc') or \
+ is_windows and not env.Detect('icl'):
+
+ SCons.Warnings.enableWarningClass(ICLTopDirWarning)
+ SCons.Warnings.warn(ICLTopDirWarning,
+ "Failed to find Intel compiler for version='%s', abi='%s'"%
+ (str(version), str(abi)))
+ else:
+ # should be cleaned up to say what this other version is
+ # since in this case we have some other Intel compiler installed
+ SCons.Warnings.enableWarningClass(ICLTopDirWarning)
+ SCons.Warnings.warn(ICLTopDirWarning,
+ "Can't find Intel compiler top dir for version='%s', abi='%s'"%
+ (str(version), str(abi)))
+
+ if topdir:
+ archdir={'x86_64': 'intel64',
+ 'amd64' : 'intel64',
+ 'em64t' : 'intel64',
+ 'x86' : 'ia32',
+ 'i386' : 'ia32',
+ 'ia32' : 'ia32'
+ }[abi] # for v11 and greater
+ if os.path.exists(os.path.join(topdir, 'bin', archdir)):
+ bindir="bin/%s"%archdir
+ libdir="lib/%s"%archdir
+ else:
+ bindir="bin"
+ libdir="lib"
+ if verbose:
+ print("Intel C compiler: using version %s (%g), abi %s, in '%s/%s'"%\
+ (repr(version), linux_ver_normalize(version),abi,topdir,bindir))
+ if is_linux:
+ # Show the actual compiler version by running the compiler.
+ os.system('%s/%s/icc --version'%(topdir,bindir))
+ if is_mac:
+ # Show the actual compiler version by running the compiler.
+ os.system('%s/%s/icc --version'%(topdir,bindir))
+
+ env['INTEL_C_COMPILER_TOP'] = topdir
+ if is_linux:
+ paths={'INCLUDE' : 'include',
+ 'LIB' : libdir,
+ 'PATH' : bindir,
+ 'LD_LIBRARY_PATH' : libdir}
+ for p in list(paths.keys()):
+ env.PrependENVPath(p, os.path.join(topdir, paths[p]))
+ if is_mac:
+ paths={'INCLUDE' : 'include',
+ 'LIB' : libdir,
+ 'PATH' : bindir,
+ 'LD_LIBRARY_PATH' : libdir}
+ for p in list(paths.keys()):
+ env.PrependENVPath(p, os.path.join(topdir, paths[p]))
+ if is_windows:
+ # env key reg valname default subdir of top
+ paths=(('INCLUDE', 'IncludeDir', 'Include'),
+ ('LIB' , 'LibDir', 'Lib'),
+ ('PATH' , 'BinDir', 'Bin'))
+ # We are supposed to ignore version if topdir is set, so set
+ # it to the emptry string if it's not already set.
+ if version is None:
+ version = ''
+ # Each path has a registry entry, use that or default to subdir
+ for p in paths:
+ try:
+ path=get_intel_registry_value(p[1], version, abi)
+ # These paths may have $(ICInstallDir)
+ # which needs to be substituted with the topdir.
+ path=path.replace('$(ICInstallDir)', topdir + os.sep)
+ except IntelCError:
+ # Couldn't get it from registry: use default subdir of topdir
+ env.PrependENVPath(p[0], os.path.join(topdir, p[2]))
+ else:
+ env.PrependENVPath(p[0], path.split(os.pathsep))
+ # print "ICL %s: %s, final=%s"%(p[0], path, str(env['ENV'][p[0]]))
+
+ if is_windows:
+ env['CC'] = 'icl'
+ env['CXX'] = 'icl'
+ env['LINK'] = 'xilink'
+ else:
+ env['CC'] = 'icc'
+ env['CXX'] = 'icpc'
+ # Don't reset LINK here;
+ # use smart_link which should already be here from link.py.
+ #env['LINK'] = '$CC'
+ env['AR'] = 'xiar'
+ env['LD'] = 'xild' # not used by default
+
+ # This is not the exact (detailed) compiler version,
+ # just the major version as determined above or specified
+ # by the user. It is a float like 80 or 90, in normalized form for Linux
+ # (i.e. even for Linux 9.0 compiler, still returns 90 rather than 9.0)
+ if version:
+ env['INTEL_C_COMPILER_VERSION']=linux_ver_normalize(version)
+
+ if is_windows:
+ # Look for license file dir
+ # in system environment, registry, and default location.
+ envlicdir = os.environ.get("INTEL_LICENSE_FILE", '')
+ K = ('SOFTWARE\Intel\Licenses')
+ try:
+ k = SCons.Util.RegOpenKeyEx(SCons.Util.HKEY_LOCAL_MACHINE, K)
+ reglicdir = SCons.Util.RegQueryValueEx(k, "w_cpp")[0]
+ except (AttributeError, SCons.Util.RegError):
+ reglicdir = ""
+ defaultlicdir = r'C:\Program Files\Common Files\Intel\Licenses'
+
+ licdir = None
+ for ld in [envlicdir, reglicdir]:
+ # If the string contains an '@', then assume it's a network
+ # license (port@system) and good by definition.
+ if ld and (ld.find('@') != -1 or os.path.exists(ld)):
+ licdir = ld
+ break
+ if not licdir:
+ licdir = defaultlicdir
+ if not os.path.exists(licdir):
+ class ICLLicenseDirWarning(SCons.Warnings.Warning):
+ pass
+ SCons.Warnings.enableWarningClass(ICLLicenseDirWarning)
+ SCons.Warnings.warn(ICLLicenseDirWarning,
+ "Intel license dir was not found."
+ " Tried using the INTEL_LICENSE_FILE environment variable (%s), the registry (%s) and the default path (%s)."
+ " Using the default path as a last resort."
+ % (envlicdir, reglicdir, defaultlicdir))
+ env['ENV']['INTEL_LICENSE_FILE'] = licdir
+
+def exists(env):
+ if not (is_mac or is_linux or is_windows):
+ # can't handle this platform
+ return 0
+
+ try:
+ versions = get_all_compiler_versions()
+ except (SCons.Util.RegError, IntelCError):
+ versions = None
+ detected = versions is not None and len(versions) > 0
+ if not detected:
+ # try env.Detect, maybe that will work
+ if is_windows:
+ return env.Detect('icl')
+ elif is_linux:
+ return env.Detect('icc')
+ elif is_mac:
+ return env.Detect('icc')
+ return detected
+
+# end of file
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/intelc.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/intelc.xml
new file mode 100644
index 0000000..391d1c3
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/intelc.xml
@@ -0,0 +1,58 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+__COPYRIGHT__
+
+This file is processed by the bin/SConsDoc.py module.
+See its __doc__ string for a discussion of the format.
+-->
+
+<!DOCTYPE sconsdoc [
+<!ENTITY % scons SYSTEM '../../../../doc/scons.mod'>
+%scons;
+<!ENTITY % builders-mod SYSTEM '../../../../doc/generated/builders.mod'>
+%builders-mod;
+<!ENTITY % functions-mod SYSTEM '../../../../doc/generated/functions.mod'>
+%functions-mod;
+<!ENTITY % tools-mod SYSTEM '../../../../doc/generated/tools.mod'>
+%tools-mod;
+<!ENTITY % variables-mod SYSTEM '../../../../doc/generated/variables.mod'>
+%variables-mod;
+]>
+
+<sconsdoc xmlns="http://www.scons.org/dbxsd/v1.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://www.scons.org/dbxsd/v1.0 http://www.scons.org/dbxsd/v1.0/scons.xsd">
+
+<tool name="intelc">
+<summary>
+<para>
+Sets construction variables for the Intel C/C++ compiler
+(Linux and Windows, version 7 and later).
+Calls the &t-gcc; or &t-msvc;
+(on Linux and Windows, respectively)
+to set underlying variables.
+</para>
+</summary>
+<sets>
+<item>CC</item>
+<item>CXX</item>
+<item>LINK</item>
+<item>AR</item>
+<item><!--LD--></item>
+<item>INTEL_C_COMPILER_VERSION</item>
+</sets>
+<uses>
+</uses>
+</tool>
+
+<cvar name="INTEL_C_COMPILER_VERSION">
+<summary>
+<para>
+Set by the "intelc" Tool
+to the major version number of the Intel C compiler
+selected for use.
+</para>
+</summary>
+</cvar>
+
+</sconsdoc>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/ipkg.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/ipkg.py
new file mode 100644
index 0000000..df77eea
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/ipkg.py
@@ -0,0 +1,73 @@
+"""SCons.Tool.ipkg
+
+Tool-specific initialization for ipkg.
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+
+The ipkg tool calls the ipkg-build. Its only argument should be the
+packages fake_root.
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import os
+
+import SCons.Builder
+
+def generate(env):
+ """Add Builders and construction variables for ipkg to an Environment."""
+ try:
+ bld = env['BUILDERS']['Ipkg']
+ except KeyError:
+ bld = SCons.Builder.Builder(action='$IPKGCOM',
+ suffix='$IPKGSUFFIX',
+ source_scanner=None,
+ target_scanner=None)
+ env['BUILDERS']['Ipkg'] = bld
+
+
+ env['IPKG'] = 'ipkg-build'
+ env['IPKGCOM'] = '$IPKG $IPKGFLAGS ${SOURCE}'
+
+ if env.WhereIs('id'):
+ env['IPKGUSER'] = os.popen('id -un').read().strip()
+ env['IPKGGROUP'] = os.popen('id -gn').read().strip()
+ env['IPKGFLAGS'] = SCons.Util.CLVar('-o $IPKGUSER -g $IPKGGROUP')
+ env['IPKGSUFFIX'] = '.ipk'
+
+def exists(env):
+ """
+ Can we find the tool
+ """
+ return env.Detect('ipkg-build')
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/jar.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/jar.py
new file mode 100644
index 0000000..49600e0
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/jar.py
@@ -0,0 +1,231 @@
+"""SCons.Tool.jar
+
+Tool-specific initialization for jar.
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import SCons.Subst
+import SCons.Util
+from SCons.Node.FS import _my_normcase
+import os
+
+def jarSources(target, source, env, for_signature):
+ """Only include sources that are not a manifest file."""
+ try:
+ env['JARCHDIR']
+ except KeyError:
+ jarchdir_set = False
+ else:
+ jarchdir_set = True
+ jarchdir = env.subst('$JARCHDIR', target=target, source=source)
+ if jarchdir:
+ jarchdir = env.fs.Dir(jarchdir)
+ result = []
+ for src in source:
+ contents = src.get_text_contents()
+ if contents[:16] != "Manifest-Version":
+ if jarchdir_set:
+ _chdir = jarchdir
+ else:
+ try:
+ _chdir = src.attributes.java_classdir
+ except AttributeError:
+ _chdir = None
+ if _chdir:
+ # If we are changing the dir with -C, then sources should
+ # be relative to that directory.
+ src = SCons.Subst.Literal(src.get_path(_chdir))
+ result.append('-C')
+ result.append(_chdir)
+ result.append(src)
+ return result
+
+def jarManifest(target, source, env, for_signature):
+ """Look in sources for a manifest file, if any."""
+ for src in source:
+ contents = src.get_text_contents()
+ if contents[:16] == "Manifest-Version":
+ return src
+ return ''
+
+def jarFlags(target, source, env, for_signature):
+ """If we have a manifest, make sure that the 'm'
+ flag is specified."""
+ jarflags = env.subst('$JARFLAGS', target=target, source=source)
+ for src in source:
+ contents = src.get_text_contents()
+ if contents[:16] == "Manifest-Version":
+ if not 'm' in jarflags:
+ return jarflags + 'm'
+ break
+ return jarflags
+
+def Jar(env, target = None, source = [], *args, **kw):
+ """
+ A pseudo-Builder wrapper around the separate Jar sources{File,Dir}
+ Builders.
+ """
+
+ # jar target should not be a list so assume they passed
+ # no target and want implicit target to be made and the arg
+ # was actaully the list of sources
+ if SCons.Util.is_List(target) and source == []:
+ SCons.Warnings.Warning("Making implicit target jar file, " +
+ "and treating the list as sources")
+ source = target
+ target = None
+
+ # mutiple targets pass so build each target the same from the
+ # same source
+ #TODO Maybe this should only be done once, and the result copied
+ # for each target since it should result in the same?
+ if SCons.Util.is_List(target) and SCons.Util.is_List(source):
+ jars = []
+ for single_target in target:
+ jars += env.Jar( target = single_target, source = source, *args, **kw)
+ return jars
+
+ # they passed no target so make a target implicitly
+ if target == None:
+ try:
+ # make target from the first source file
+ target = os.path.splitext(str(source[0]))[0] + env.subst('$JARSUFFIX')
+ except:
+ # something strange is happening but attempt anyways
+ SCons.Warnings.Warning("Could not make implicit target from sources, using directory")
+ target = os.path.basename(str(env.Dir('.'))) + env.subst('$JARSUFFIX')
+
+ # make lists out of our target and sources
+ if not SCons.Util.is_List(target):
+ target = [target]
+ if not SCons.Util.is_List(source):
+ source = [source]
+
+ # setup for checking through all the sources and handle accordingly
+ java_class_suffix = env.subst('$JAVACLASSSUFFIX')
+ java_suffix = env.subst('$JAVASUFFIX')
+ target_classes = []
+
+ # function for determining what to do with a file and not a directory
+ # if its already a class file then it can be used as a
+ # source for jar, otherwise turn it into a class file then
+ # return the source
+ def file_to_class(s):
+ if(str(_my_normcase(s)).endswith(java_suffix)):
+ return env.JavaClassFile(source = s, *args, **kw)
+ else:
+ return [env.fs.File(s)]
+
+ # In the case that we are passed just string to a node which is directory
+ # but does not exist, we need to check all the current targets to see if
+ # that directory is going to exist so we can add it as a source to Jar builder
+ def get_all_targets(env, node='.'):
+ def get_all_targets_iter(env, node):
+ if node.has_builder():
+ yield node
+ for kid in node.all_children():
+ for kid in get_all_targets(env, kid):
+ yield kid
+ node = env.arg2nodes(node, env.fs.Entry)[0]
+ return list(get_all_targets_iter(env, node))
+
+ # loop through the sources and handle each accordingly
+ # the goal here is to get all the source files into a class
+ # file or a directory that contains class files
+ for s in source:
+ s = env.subst(s)
+ if isinstance(s, SCons.Node.FS.Base):
+ if isinstance(s, SCons.Node.FS.File):
+ # found a file so make sure its a class file
+ target_classes.extend(file_to_class(s))
+ else:
+ # found a dir so make sure its a dir of class files
+ target_classes.extend(env.JavaClassDir(source = env.fs.Dir(s), *args, **kw))
+ else:
+ if os.path.isfile(s):
+ # found a file that exists on the FS, make sure its a class file
+ target_classes.extend(file_to_class(s))
+ elif os.path.isdir(s):
+ # found a dir on the FS, add it as a dir of class files
+ target_classes.append(env.fs.Dir(s))
+ elif s[-len(java_suffix):] == java_suffix or s[-len(java_class_suffix):] == java_class_suffix:
+ # found a file that may not exists and is only a string
+ # so add it after converting it to a class file
+ target_classes.extend(file_to_class(s))
+ else:
+ # found a swig file so add it after converting it to class files
+ if(os.path.splitext(str(s))[1] == ".i"):
+ target_classes.extend(env.JavaClassFile(source = s, *args, **kw))
+ else:
+ # found a directory that does not yet exist, but can exist as a node
+ # check the target nodes to make sure it will be built, then add
+ # it as a source
+ for node in get_all_targets(env):
+ if(s in str(node) and os.path.splitext(str(node))[1] == ""):
+ target_classes.append(node)
+ # at this point all our sources have been converted to classes or directories of class
+ # so pass it to the Jar builder
+ return env.JarFile(target = target, source = target_classes, *args, **kw)
+
+def generate(env):
+ """Add Builders and construction variables for jar to an Environment."""
+ SCons.Tool.CreateJarBuilder(env)
+
+ SCons.Tool.CreateJavaFileBuilder(env)
+ SCons.Tool.CreateJavaClassFileBuilder(env)
+ SCons.Tool.CreateJavaClassDirBuilder(env)
+
+ env.AddMethod(Jar)
+
+ env['JAR'] = 'jar'
+ env['JARFLAGS'] = SCons.Util.CLVar('cf')
+ env['_JARFLAGS'] = jarFlags
+ env['_JARMANIFEST'] = jarManifest
+ env['_JARSOURCES'] = jarSources
+ env['_JARCOM'] = '$JAR $_JARFLAGS $TARGET $_JARMANIFEST $_JARSOURCES'
+ env['JARCOM'] = "${TEMPFILE('$_JARCOM','$JARCOMSTR')}"
+ env['JARSUFFIX'] = '.jar'
+
+def exists(env):
+ # As reported by Jan Nijtmans in issue #2730, the simple
+ # return env.Detect('jar')
+ # doesn't always work during initialization. For now, we
+ # stop trying to detect an executable (analogous to the
+ # javac Builder).
+ # TODO: Come up with a proper detect() routine...and enable it.
+ return 1
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/jar.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/jar.xml
new file mode 100644
index 0000000..1197b62
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/jar.xml
@@ -0,0 +1,151 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+__COPYRIGHT__
+
+This file is processed by the bin/SConsDoc.py module.
+See its __doc__ string for a discussion of the format.
+-->
+
+<!DOCTYPE sconsdoc [
+<!ENTITY % scons SYSTEM '../../../../doc/scons.mod'>
+%scons;
+<!ENTITY % builders-mod SYSTEM '../../../../doc/generated/builders.mod'>
+%builders-mod;
+<!ENTITY % functions-mod SYSTEM '../../../../doc/generated/functions.mod'>
+%functions-mod;
+<!ENTITY % tools-mod SYSTEM '../../../../doc/generated/tools.mod'>
+%tools-mod;
+<!ENTITY % variables-mod SYSTEM '../../../../doc/generated/variables.mod'>
+%variables-mod;
+]>
+
+<sconsdoc xmlns="http://www.scons.org/dbxsd/v1.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://www.scons.org/dbxsd/v1.0 http://www.scons.org/dbxsd/v1.0/scons.xsd">
+
+<tool name="jar">
+<summary>
+<para>
+Sets construction variables for the &jar; utility.
+</para>
+</summary>
+<sets>
+<item>JAR</item>
+<item>JARFLAGS</item>
+<item>JARCOM</item>
+<item>JARSUFFIX</item>
+</sets>
+<uses>
+<item>JARCOMSTR</item>
+</uses>
+</tool>
+
+<builder name="Jar">
+<summary>
+<para>
+Builds a Java archive (<filename>.jar</filename>) file
+from the specified list of sources.
+Any directories in the source list
+will be searched for <filename>.class</filename> files).
+Any <filename>.java</filename> files in the source list
+will be compiled to <filename>.class</filename> files
+by calling the &b-link-Java; Builder.
+</para>
+
+<para>
+If the &cv-link-JARCHDIR; value is set, the
+&jar;
+command will change to the specified directory using the
+<option>-C</option>
+option.
+If &cv-JARCHDIR; is not set explicitly,
+&SCons; will use the top of any subdirectory tree
+in which Java <filename>.class</filename>
+were built by the &b-link-Java; Builder.
+</para>
+
+<para>
+If the contents any of the source files begin with the string
+<literal>Manifest-Version</literal>,
+the file is assumed to be a manifest
+and is passed to the
+&jar;
+command with the
+<option>m</option>
+option set.
+</para>
+
+<example_commands>
+env.Jar(target = 'foo.jar', source = 'classes')
+
+env.Jar(target = 'bar.jar',
+ source = ['bar1.java', 'bar2.java'])
+</example_commands>
+</summary>
+</builder>
+
+<cvar name="JAR">
+<summary>
+<para>
+The Java archive tool.
+</para>
+</summary>
+</cvar>
+
+<cvar name="JARCHDIR">
+<summary>
+<para>
+The directory to which the Java archive tool should change
+(using the
+<option>-C</option>
+option).
+</para>
+</summary>
+</cvar>
+
+<cvar name="JARCOM">
+<summary>
+<para>
+The command line used to call the Java archive tool.
+</para>
+</summary>
+</cvar>
+
+<cvar name="JARCOMSTR">
+<summary>
+<para>
+The string displayed when the Java archive tool
+is called
+If this is not set, then &cv-link-JARCOM; (the command line) is displayed.
+</para>
+
+<example_commands>
+env = Environment(JARCOMSTR = "JARchiving $SOURCES into $TARGET")
+</example_commands>
+</summary>
+</cvar>
+
+<cvar name="JARFLAGS">
+<summary>
+<para>
+General options passed to the Java archive tool.
+By default this is set to
+<option>cf</option>
+to create the necessary
+<command>jar</command>
+file.
+</para>
+</summary>
+</cvar>
+
+<cvar name="JARSUFFIX">
+<summary>
+<para>
+The suffix for Java archives:
+<filename>.jar</filename>
+by default.
+</para>
+</summary>
+</cvar>
+
+</sconsdoc>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/javac.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/javac.py
new file mode 100644
index 0000000..b26c0b3
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/javac.py
@@ -0,0 +1,232 @@
+"""SCons.Tool.javac
+
+Tool-specific initialization for javac.
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import os
+import os.path
+
+import SCons.Action
+import SCons.Builder
+from SCons.Node.FS import _my_normcase
+from SCons.Tool.JavaCommon import parse_java_file
+import SCons.Util
+
+def classname(path):
+ """Turn a string (path name) into a Java class name."""
+ return os.path.normpath(path).replace(os.sep, '.')
+
+def emit_java_classes(target, source, env):
+ """Create and return lists of source java files
+ and their corresponding target class files.
+ """
+ java_suffix = env.get('JAVASUFFIX', '.java')
+ class_suffix = env.get('JAVACLASSSUFFIX', '.class')
+
+ target[0].must_be_same(SCons.Node.FS.Dir)
+ classdir = target[0]
+
+ s = source[0].rentry().disambiguate()
+ if isinstance(s, SCons.Node.FS.File):
+ sourcedir = s.dir.rdir()
+ elif isinstance(s, SCons.Node.FS.Dir):
+ sourcedir = s.rdir()
+ else:
+ raise SCons.Errors.UserError("Java source must be File or Dir, not '%s'" % s.__class__)
+
+ slist = []
+ js = _my_normcase(java_suffix)
+ for entry in source:
+ entry = entry.rentry().disambiguate()
+ if isinstance(entry, SCons.Node.FS.File):
+ slist.append(entry)
+ elif isinstance(entry, SCons.Node.FS.Dir):
+ result = SCons.Util.OrderedDict()
+ dirnode = entry.rdir()
+ def find_java_files(arg, dirpath, filenames):
+ java_files = sorted([n for n in filenames
+ if _my_normcase(n).endswith(js)])
+ mydir = dirnode.Dir(dirpath)
+ java_paths = [mydir.File(f) for f in java_files]
+ for jp in java_paths:
+ arg[jp] = True
+ for dirpath, dirnames, filenames in os.walk(dirnode.get_abspath()):
+ find_java_files(result, dirpath, filenames)
+ entry.walk(find_java_files, result)
+
+ slist.extend(list(result.keys()))
+ else:
+ raise SCons.Errors.UserError("Java source must be File or Dir, not '%s'" % entry.__class__)
+
+ version = env.get('JAVAVERSION', '1.4')
+ full_tlist = []
+ for f in slist:
+ tlist = []
+ source_file_based = True
+ pkg_dir = None
+ if not f.is_derived():
+ pkg_dir, classes = parse_java_file(f.rfile().get_abspath(), version)
+ if classes:
+ source_file_based = False
+ if pkg_dir:
+ d = target[0].Dir(pkg_dir)
+ p = pkg_dir + os.sep
+ else:
+ d = target[0]
+ p = ''
+ for c in classes:
+ t = d.File(c + class_suffix)
+ t.attributes.java_classdir = classdir
+ t.attributes.java_sourcedir = sourcedir
+ t.attributes.java_classname = classname(p + c)
+ tlist.append(t)
+
+ if source_file_based:
+ base = f.name[:-len(java_suffix)]
+ if pkg_dir:
+ t = target[0].Dir(pkg_dir).File(base + class_suffix)
+ else:
+ t = target[0].File(base + class_suffix)
+ t.attributes.java_classdir = classdir
+ t.attributes.java_sourcedir = f.dir
+ t.attributes.java_classname = classname(base)
+ tlist.append(t)
+
+ for t in tlist:
+ t.set_specific_source([f])
+
+ full_tlist.extend(tlist)
+
+ return full_tlist, slist
+
+JavaAction = SCons.Action.Action('$JAVACCOM', '$JAVACCOMSTR')
+
+JavaBuilder = SCons.Builder.Builder(action = JavaAction,
+ emitter = emit_java_classes,
+ target_factory = SCons.Node.FS.Entry,
+ source_factory = SCons.Node.FS.Entry)
+
+class pathopt(object):
+ """
+ Callable object for generating javac-style path options from
+ a construction variable (e.g. -classpath, -sourcepath).
+ """
+ def __init__(self, opt, var, default=None):
+ self.opt = opt
+ self.var = var
+ self.default = default
+
+ def __call__(self, target, source, env, for_signature):
+ path = env[self.var]
+ if path and not SCons.Util.is_List(path):
+ path = [path]
+ if self.default:
+ default = env[self.default]
+ if default:
+ if not SCons.Util.is_List(default):
+ default = [default]
+ path = path + default
+ if path:
+ return [self.opt, os.pathsep.join(map(str, path))]
+ else:
+ return []
+
+def Java(env, target, source, *args, **kw):
+ """
+ A pseudo-Builder wrapper around the separate JavaClass{File,Dir}
+ Builders.
+ """
+ if not SCons.Util.is_List(target):
+ target = [target]
+ if not SCons.Util.is_List(source):
+ source = [source]
+
+ # Pad the target list with repetitions of the last element in the
+ # list so we have a target for every source element.
+ target = target + ([target[-1]] * (len(source) - len(target)))
+
+ java_suffix = env.subst('$JAVASUFFIX')
+ result = []
+
+ for t, s in zip(target, source):
+ if isinstance(s, SCons.Node.FS.Base):
+ if isinstance(s, SCons.Node.FS.File):
+ b = env.JavaClassFile
+ else:
+ b = env.JavaClassDir
+ else:
+ if os.path.isfile(s):
+ b = env.JavaClassFile
+ elif os.path.isdir(s):
+ b = env.JavaClassDir
+ elif s[-len(java_suffix):] == java_suffix:
+ b = env.JavaClassFile
+ else:
+ b = env.JavaClassDir
+ result.extend(b(t, s, *args, **kw))
+
+ return result
+
+def generate(env):
+ """Add Builders and construction variables for javac to an Environment."""
+ java_file = SCons.Tool.CreateJavaFileBuilder(env)
+ java_class = SCons.Tool.CreateJavaClassFileBuilder(env)
+ java_class_dir = SCons.Tool.CreateJavaClassDirBuilder(env)
+ java_class.add_emitter(None, emit_java_classes)
+ java_class.add_emitter(env.subst('$JAVASUFFIX'), emit_java_classes)
+ java_class_dir.emitter = emit_java_classes
+
+ env.AddMethod(Java)
+
+ env['JAVAC'] = 'javac'
+ env['JAVACFLAGS'] = SCons.Util.CLVar('')
+ env['JAVABOOTCLASSPATH'] = []
+ env['JAVACLASSPATH'] = []
+ env['JAVASOURCEPATH'] = []
+ env['_javapathopt'] = pathopt
+ env['_JAVABOOTCLASSPATH'] = '${_javapathopt("-bootclasspath", "JAVABOOTCLASSPATH")} '
+ env['_JAVACLASSPATH'] = '${_javapathopt("-classpath", "JAVACLASSPATH")} '
+ env['_JAVASOURCEPATH'] = '${_javapathopt("-sourcepath", "JAVASOURCEPATH", "_JAVASOURCEPATHDEFAULT")} '
+ env['_JAVASOURCEPATHDEFAULT'] = '${TARGET.attributes.java_sourcedir}'
+ env['_JAVACCOM'] = '$JAVAC $JAVACFLAGS $_JAVABOOTCLASSPATH $_JAVACLASSPATH -d ${TARGET.attributes.java_classdir} $_JAVASOURCEPATH $SOURCES'
+ env['JAVACCOM'] = "${TEMPFILE('$_JAVACCOM','$JAVACCOMSTR')}"
+ env['JAVACLASSSUFFIX'] = '.class'
+ env['JAVASUFFIX'] = '.java'
+
+def exists(env):
+ return 1
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/javac.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/javac.xml
new file mode 100644
index 0000000..543d669
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/javac.xml
@@ -0,0 +1,285 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+__COPYRIGHT__
+
+This file is processed by the bin/SConsDoc.py module.
+See its __doc__ string for a discussion of the format.
+-->
+
+<!DOCTYPE sconsdoc [
+<!ENTITY % scons SYSTEM '../../../../doc/scons.mod'>
+%scons;
+<!ENTITY % builders-mod SYSTEM '../../../../doc/generated/builders.mod'>
+%builders-mod;
+<!ENTITY % functions-mod SYSTEM '../../../../doc/generated/functions.mod'>
+%functions-mod;
+<!ENTITY % tools-mod SYSTEM '../../../../doc/generated/tools.mod'>
+%tools-mod;
+<!ENTITY % variables-mod SYSTEM '../../../../doc/generated/variables.mod'>
+%variables-mod;
+]>
+
+<sconsdoc xmlns="http://www.scons.org/dbxsd/v1.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://www.scons.org/dbxsd/v1.0 http://www.scons.org/dbxsd/v1.0/scons.xsd">
+
+<tool name="javac">
+<summary>
+<para>
+Sets construction variables for the &javac; compiler.
+</para>
+</summary>
+<sets>
+<item>JAVAC</item>
+<item>JAVACFLAGS</item>
+<item>JAVACCOM</item>
+<item>JAVACLASSSUFFIX</item>
+<item>JAVASUFFIX</item>
+<item>JAVABOOTCLASSPATH</item>
+<item>JAVACLASSPATH</item>
+<item>JAVASOURCEPATH</item>
+</sets>
+<uses>
+<item>JAVACCOMSTR</item>
+</uses>
+</tool>
+
+<builder name="Java">
+<summary>
+<para>
+Builds one or more Java class files.
+The sources may be any combination of explicit
+<filename>.java</filename> files,
+or directory trees which will be scanned
+for <filename>.java</filename> files.
+</para>
+
+<para>
+SCons will parse each source <filename>.java</filename> file
+to find the classes
+(including inner classes)
+defined within that file,
+and from that figure out the
+target <filename>.class</filename> files that will be created.
+The class files will be placed underneath
+the specified target directory.
+</para>
+
+<para>
+SCons will also search each Java file
+for the Java package name,
+which it assumes can be found on a line
+beginning with the string
+<literal>package</literal>
+in the first column;
+the resulting <filename>.class</filename> files
+will be placed in a directory reflecting
+the specified package name.
+For example,
+the file
+<filename>Foo.java</filename>
+defining a single public
+<classname>Foo</classname>
+class and
+containing a package name of
+<classname>sub.dir</classname>
+will generate a corresponding
+<filename>sub/dir/Foo.class</filename>
+class file.
+</para>
+
+<para>
+Examples:
+</para>
+
+<example_commands>
+env.Java(target = 'classes', source = 'src')
+env.Java(target = 'classes', source = ['src1', 'src2'])
+env.Java(target = 'classes', source = ['File1.java', 'File2.java'])
+</example_commands>
+
+<para>
+Java source files can use the native encoding for the underlying OS.
+Since SCons compiles in simple ASCII mode by default,
+the compiler will generate warnings about unmappable characters,
+which may lead to errors as the file is processed further.
+In this case, the user must specify the <literal>LANG</literal>
+environment variable to tell the compiler what encoding is used.
+For portibility, it's best if the encoding is hard-coded
+so that the compile will work if it is done on a system
+with a different encoding.
+</para>
+
+<example_commands>
+env = Environment()
+env['ENV']['LANG'] = 'en_GB.UTF-8'
+</example_commands>
+</summary>
+</builder>
+
+<cvar name="JAVABOOTCLASSPATH">
+<summary>
+<para>
+Specifies the list of directories that
+will be added to the
+&javac; command line
+via the <option>-bootclasspath</option> option.
+The individual directory names will be
+separated by the operating system's path separate character
+(<filename>:</filename> on UNIX/Linux/POSIX,
+<filename>;</filename> on Windows).
+</para>
+</summary>
+</cvar>
+
+<cvar name="JAVAC">
+<summary>
+<para>
+The Java compiler.
+</para>
+</summary>
+</cvar>
+
+<cvar name="JAVACCOM">
+<summary>
+<para>
+The command line used to compile a directory tree containing
+Java source files to
+corresponding Java class files.
+Any options specified in the &cv-link-JAVACFLAGS; construction variable
+are included on this command line.
+</para>
+</summary>
+</cvar>
+
+<cvar name="JAVACCOMSTR">
+<summary>
+<para>
+The string displayed when compiling
+a directory tree of Java source files to
+corresponding Java class files.
+If this is not set, then &cv-link-JAVACCOM; (the command line) is displayed.
+</para>
+
+<example_commands>
+env = Environment(JAVACCOMSTR = "Compiling class files $TARGETS from $SOURCES")
+</example_commands>
+</summary>
+</cvar>
+
+<cvar name="JAVACFLAGS">
+<summary>
+<para>
+General options that are passed to the Java compiler.
+</para>
+</summary>
+</cvar>
+
+<cvar name="JAVACLASSDIR">
+<summary>
+<para>
+The directory in which Java class files may be found.
+This is stripped from the beginning of any Java .class
+file names supplied to the
+<literal>JavaH</literal>
+builder.
+</para>
+</summary>
+</cvar>
+
+<cvar name="JAVACLASSPATH">
+<summary>
+<para>
+Specifies the list of directories that
+will be searched for Java
+<filename>.class</filename> file.
+The directories in this list will be added to the
+&javac; and &javah; command lines
+via the <option>-classpath</option> option.
+The individual directory names will be
+separated by the operating system's path separate character
+(<filename>:</filename> on UNIX/Linux/POSIX,
+<filename>;</filename> on Windows).
+</para>
+
+<para>
+Note that this currently just adds the specified
+directory via the <option>-classpath</option> option.
+&SCons; does not currently search the
+&cv-JAVACLASSPATH; directories for dependency
+<filename>.class</filename> files.
+</para>
+</summary>
+</cvar>
+
+<cvar name="JAVACLASSSUFFIX">
+<summary>
+<para>
+The suffix for Java class files;
+<filename>.class</filename>
+by default.
+</para>
+</summary>
+</cvar>
+
+<cvar name="JAVASOURCEPATH">
+<summary>
+<para>
+Specifies the list of directories that
+will be searched for input
+<filename>.java</filename> file.
+The directories in this list will be added to the
+&javac; command line
+via the <option>-sourcepath</option> option.
+The individual directory names will be
+separated by the operating system's path separate character
+(<filename>:</filename> on UNIX/Linux/POSIX,
+<filename>;</filename> on Windows).
+</para>
+
+<para>
+Note that this currently just adds the specified
+directory via the <option>-sourcepath</option> option.
+&SCons; does not currently search the
+&cv-JAVASOURCEPATH; directories for dependency
+<filename>.java</filename> files.
+</para>
+</summary>
+</cvar>
+
+<cvar name="JAVASUFFIX">
+<summary>
+<para>
+The suffix for Java files;
+<filename>.java</filename>
+by default.
+</para>
+</summary>
+</cvar>
+
+<cvar name="JAVAVERSION">
+<summary>
+<para>
+Specifies the Java version being used by the &b-Java; builder.
+This is <emphasis>not</emphasis> currently used to select one
+version of the Java compiler vs. another.
+Instead, you should set this to specify the version of Java
+supported by your &javac; compiler.
+The default is <literal>1.4</literal>.
+</para>
+
+<para>
+This is sometimes necessary because
+Java 1.5 changed the file names that are created
+for nested anonymous inner classes,
+which can cause a mismatch with the files
+that &SCons; expects will be generated by the &javac; compiler.
+Setting &cv-JAVAVERSION; to <literal>1.5</literal>
+(or <literal>1.6</literal>, as appropriate)
+can make &SCons; realize that a Java 1.5 or 1.6
+build is actually up to date.
+</para>
+</summary>
+</cvar>
+
+</sconsdoc>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/javacTests.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/javacTests.py
new file mode 100644
index 0000000..bf75d8a
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/javacTests.py
@@ -0,0 +1,105 @@
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+import os
+import unittest
+
+import TestUnit
+
+import SCons.Tool.javac
+
+class DummyNode(object):
+ def __init__(self, val):
+ self.val = val
+
+ def __str__(self):
+ return str(self.val)
+
+class pathoptTestCase(unittest.TestCase):
+ def assert_pathopt(self, expect, path):
+ popt = SCons.Tool.javac.pathopt('-foopath', 'FOOPATH')
+ env = {'FOOPATH': path}
+ actual = popt(None, None, env, None)
+ self.assertEquals(expect, actual)
+
+ def assert_pathopt_default(self, expect, path, default):
+ popt = SCons.Tool.javac.pathopt('-foopath', 'FOOPATH', default='DPATH')
+ env = {'FOOPATH': path,
+ 'DPATH': default}
+ actual = popt(None, None, env, None)
+ self.assertEquals(expect, actual)
+
+ def test_unset(self):
+ self.assert_pathopt([], None)
+ self.assert_pathopt([], '')
+
+ def test_str(self):
+ self.assert_pathopt(['-foopath', '/foo/bar'],
+ '/foo/bar')
+
+ def test_list_str(self):
+ self.assert_pathopt(['-foopath', '/foo%s/bar' % os.pathsep],
+ ['/foo', '/bar'])
+
+ def test_uses_pathsep(self):
+ save = os.pathsep
+ try:
+ os.pathsep = '!'
+ self.assert_pathopt(['-foopath', 'foo!bar'],
+ ['foo', 'bar'])
+ finally:
+ os.pathsep = save
+
+ def test_node(self):
+ self.assert_pathopt(['-foopath', '/foo'],
+ DummyNode('/foo'))
+
+ def test_list_node(self):
+ self.assert_pathopt(['-foopath', os.pathsep.join(['/foo','/bar'])],
+ ['/foo', DummyNode('/bar')])
+
+ def test_default_str(self):
+ self.assert_pathopt_default(
+ ['-foopath', os.pathsep.join(['/foo','/bar','/baz'])],
+ ['/foo', '/bar'],
+ '/baz')
+
+ def test_default_list(self):
+ self.assert_pathopt_default(
+ ['-foopath', os.pathsep.join(['/foo','/bar','/baz'])],
+ ['/foo', '/bar'],
+ ['/baz'])
+
+ def test_default_unset(self):
+ self.assert_pathopt_default(
+ ['-foopath', '/foo'],
+ '/foo',
+ None)
+ self.assert_pathopt_default(
+ ['-foopath', '/foo'],
+ '/foo',
+ '')
+
+if __name__ == "__main__":
+ suite = unittest.makeSuite(pathoptTestCase, 'test_')
+ TestUnit.run(suite)
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/javah.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/javah.py
new file mode 100644
index 0000000..c092273
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/javah.py
@@ -0,0 +1,137 @@
+"""SCons.Tool.javah
+
+Tool-specific initialization for javah.
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import os.path
+
+import SCons.Action
+import SCons.Builder
+import SCons.Node.FS
+import SCons.Tool.javac
+import SCons.Util
+
+def emit_java_headers(target, source, env):
+ """Create and return lists of Java stub header files that will
+ be created from a set of class files.
+ """
+ class_suffix = env.get('JAVACLASSSUFFIX', '.class')
+ classdir = env.get('JAVACLASSDIR')
+
+ if not classdir:
+ try:
+ s = source[0]
+ except IndexError:
+ classdir = '.'
+ else:
+ try:
+ classdir = s.attributes.java_classdir
+ except AttributeError:
+ classdir = '.'
+ classdir = env.Dir(classdir).rdir()
+
+ if str(classdir) == '.':
+ c_ = None
+ else:
+ c_ = str(classdir) + os.sep
+
+ slist = []
+ for src in source:
+ try:
+ classname = src.attributes.java_classname
+ except AttributeError:
+ classname = str(src)
+ if c_ and classname[:len(c_)] == c_:
+ classname = classname[len(c_):]
+ if class_suffix and classname[-len(class_suffix):] == class_suffix:
+ classname = classname[:-len(class_suffix)]
+ classname = SCons.Tool.javac.classname(classname)
+ s = src.rfile()
+ s.attributes.java_classname = classname
+ slist.append(s)
+
+ s = source[0].rfile()
+ if not hasattr(s.attributes, 'java_classdir'):
+ s.attributes.java_classdir = classdir
+
+ if target[0].__class__ is SCons.Node.FS.File:
+ tlist = target
+ else:
+ if not isinstance(target[0], SCons.Node.FS.Dir):
+ target[0].__class__ = SCons.Node.FS.Dir
+ target[0]._morph()
+ tlist = []
+ for s in source:
+ fname = s.attributes.java_classname.replace('.', '_') + '.h'
+ t = target[0].File(fname)
+ t.attributes.java_lookupdir = target[0]
+ tlist.append(t)
+
+ return tlist, source
+
+def JavaHOutFlagGenerator(target, source, env, for_signature):
+ try:
+ t = target[0]
+ except (AttributeError, IndexError, TypeError):
+ t = target
+ try:
+ return '-d ' + str(t.attributes.java_lookupdir)
+ except AttributeError:
+ return '-o ' + str(t)
+
+def getJavaHClassPath(env,target, source, for_signature):
+ path = "${SOURCE.attributes.java_classdir}"
+ if 'JAVACLASSPATH' in env and env['JAVACLASSPATH']:
+ path = SCons.Util.AppendPath(path, env['JAVACLASSPATH'])
+ return "-classpath %s" % (path)
+
+def generate(env):
+ """Add Builders and construction variables for javah to an Environment."""
+ java_javah = SCons.Tool.CreateJavaHBuilder(env)
+ java_javah.emitter = emit_java_headers
+
+ env['_JAVAHOUTFLAG'] = JavaHOutFlagGenerator
+ env['JAVAH'] = 'javah'
+ env['JAVAHFLAGS'] = SCons.Util.CLVar('')
+ env['_JAVAHCLASSPATH'] = getJavaHClassPath
+ env['JAVAHCOM'] = '$JAVAH $JAVAHFLAGS $_JAVAHOUTFLAG $_JAVAHCLASSPATH ${SOURCES.attributes.java_classname}'
+ env['JAVACLASSSUFFIX'] = '.class'
+
+def exists(env):
+ return env.Detect('javah')
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/javah.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/javah.xml
new file mode 100644
index 0000000..d944a48
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/javah.xml
@@ -0,0 +1,137 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+__COPYRIGHT__
+
+This file is processed by the bin/SConsDoc.py module.
+See its __doc__ string for a discussion of the format.
+-->
+
+<!DOCTYPE sconsdoc [
+<!ENTITY % scons SYSTEM '../../../../doc/scons.mod'>
+%scons;
+<!ENTITY % builders-mod SYSTEM '../../../../doc/generated/builders.mod'>
+%builders-mod;
+<!ENTITY % functions-mod SYSTEM '../../../../doc/generated/functions.mod'>
+%functions-mod;
+<!ENTITY % tools-mod SYSTEM '../../../../doc/generated/tools.mod'>
+%tools-mod;
+<!ENTITY % variables-mod SYSTEM '../../../../doc/generated/variables.mod'>
+%variables-mod;
+]>
+
+<sconsdoc xmlns="http://www.scons.org/dbxsd/v1.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://www.scons.org/dbxsd/v1.0 http://www.scons.org/dbxsd/v1.0/scons.xsd">
+
+<tool name="javah">
+<summary>
+<para>
+Sets construction variables for the &javah; tool.
+</para>
+</summary>
+<sets>
+<item>JAVAH</item>
+<item>JAVAHFLAGS</item>
+<item>JAVAHCOM</item>
+<item>JAVACLASSSUFFIX</item>
+</sets>
+<uses>
+<item>JAVAHCOMSTR</item>
+<item>JAVACLASSPATH</item>
+</uses>
+</tool>
+
+<builder name="JavaH">
+<summary>
+<para>
+Builds C header and source files for
+implementing Java native methods.
+The target can be either a directory
+in which the header files will be written,
+or a header file name which
+will contain all of the definitions.
+The source can be the names of <filename>.class</filename> files,
+the names of <filename>.java</filename> files
+to be compiled into <filename>.class</filename> files
+by calling the &b-link-Java; builder method,
+or the objects returned from the
+&b-Java;
+builder method.
+</para>
+
+<para>
+If the construction variable
+&cv-link-JAVACLASSDIR;
+is set, either in the environment
+or in the call to the
+&b-JavaH;
+builder method itself,
+then the value of the variable
+will be stripped from the
+beginning of any <filename>.class</filename> file names.
+</para>
+
+<para>
+Examples:
+</para>
+
+<example_commands>
+# builds java_native.h
+classes = env.Java(target = 'classdir', source = 'src')
+env.JavaH(target = 'java_native.h', source = classes)
+
+# builds include/package_foo.h and include/package_bar.h
+env.JavaH(target = 'include',
+ source = ['package/foo.class', 'package/bar.class'])
+
+# builds export/foo.h and export/bar.h
+env.JavaH(target = 'export',
+ source = ['classes/foo.class', 'classes/bar.class'],
+ JAVACLASSDIR = 'classes')
+</example_commands>
+</summary>
+</builder>
+
+<cvar name="JAVAH">
+<summary>
+<para>
+The Java generator for C header and stub files.
+</para>
+</summary>
+</cvar>
+
+<cvar name="JAVAHCOM">
+<summary>
+<para>
+The command line used to generate C header and stub files
+from Java classes.
+Any options specified in the &cv-link-JAVAHFLAGS; construction variable
+are included on this command line.
+</para>
+</summary>
+</cvar>
+
+<cvar name="JAVAHCOMSTR">
+<summary>
+<para>
+The string displayed when C header and stub files
+are generated from Java classes.
+If this is not set, then &cv-link-JAVAHCOM; (the command line) is displayed.
+</para>
+
+<example_commands>
+env = Environment(JAVAHCOMSTR = "Generating header/stub file(s) $TARGETS from $SOURCES")
+</example_commands>
+</summary>
+</cvar>
+
+<cvar name="JAVAHFLAGS">
+<summary>
+<para>
+General options passed to the C header and stub file generator
+for Java classes.
+</para>
+</summary>
+</cvar>
+
+</sconsdoc>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/latex.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/latex.py
new file mode 100644
index 0000000..f30356b
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/latex.py
@@ -0,0 +1,80 @@
+"""SCons.Tool.latex
+
+Tool-specific initialization for LaTeX.
+Generates .dvi files from .latex or .ltx files
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import SCons.Action
+import SCons.Defaults
+import SCons.Scanner.LaTeX
+import SCons.Util
+import SCons.Tool
+import SCons.Tool.tex
+
+def LaTeXAuxFunction(target = None, source= None, env=None):
+ result = SCons.Tool.tex.InternalLaTeXAuxAction( SCons.Tool.tex.LaTeXAction, target, source, env )
+ if result != 0:
+ SCons.Tool.tex.check_file_error_message(env['LATEX'])
+ return result
+
+LaTeXAuxAction = SCons.Action.Action(LaTeXAuxFunction,
+ strfunction=SCons.Tool.tex.TeXLaTeXStrFunction)
+
+def generate(env):
+ """Add Builders and construction variables for LaTeX to an Environment."""
+
+ env.AppendUnique(LATEXSUFFIXES=SCons.Tool.LaTeXSuffixes)
+
+ from . import dvi
+ dvi.generate(env)
+
+ from . import pdf
+ pdf.generate(env)
+
+ bld = env['BUILDERS']['DVI']
+ bld.add_action('.ltx', LaTeXAuxAction)
+ bld.add_action('.latex', LaTeXAuxAction)
+ bld.add_emitter('.ltx', SCons.Tool.tex.tex_eps_emitter)
+ bld.add_emitter('.latex', SCons.Tool.tex.tex_eps_emitter)
+
+ SCons.Tool.tex.generate_common(env)
+
+def exists(env):
+ SCons.Tool.tex.generate_darwin(env)
+ return env.Detect('latex')
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/latex.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/latex.xml
new file mode 100644
index 0000000..4a2760d
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/latex.xml
@@ -0,0 +1,106 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+__COPYRIGHT__
+
+This file is processed by the bin/SConsDoc.py module.
+See its __doc__ string for a discussion of the format.
+-->
+
+<!DOCTYPE sconsdoc [
+<!ENTITY % scons SYSTEM '../../../../doc/scons.mod'>
+%scons;
+<!ENTITY % builders-mod SYSTEM '../../../../doc/generated/builders.mod'>
+%builders-mod;
+<!ENTITY % functions-mod SYSTEM '../../../../doc/generated/functions.mod'>
+%functions-mod;
+<!ENTITY % tools-mod SYSTEM '../../../../doc/generated/tools.mod'>
+%tools-mod;
+<!ENTITY % variables-mod SYSTEM '../../../../doc/generated/variables.mod'>
+%variables-mod;
+]>
+
+<sconsdoc xmlns="http://www.scons.org/dbxsd/v1.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://www.scons.org/dbxsd/v1.0 http://www.scons.org/dbxsd/v1.0/scons.xsd">
+
+<tool name="latex">
+<summary>
+<para>
+Sets construction variables for the &latex; utility.
+</para>
+</summary>
+<sets>
+<item>LATEX</item>
+<item>LATEXFLAGS</item>
+<item>LATEXCOM</item>
+</sets>
+<uses>
+<item>LATEXCOMSTR</item>
+</uses>
+</tool>
+
+<cvar name="LATEX">
+<summary>
+<para>
+The LaTeX structured formatter and typesetter.
+</para>
+</summary>
+</cvar>
+
+<cvar name="LATEXCOM">
+<summary>
+<para>
+The command line used to call the LaTeX structured formatter and typesetter.
+</para>
+</summary>
+</cvar>
+
+<cvar name="LATEXCOMSTR">
+<summary>
+<para>
+The string displayed when calling
+the LaTeX structured formatter and typesetter.
+If this is not set, then &cv-link-LATEXCOM; (the command line) is displayed.
+</para>
+
+<example_commands>
+env = Environment(LATEXCOMSTR = "Building $TARGET from LaTeX input $SOURCES")
+</example_commands>
+</summary>
+</cvar>
+
+<cvar name="LATEXFLAGS">
+<summary>
+<para>
+General options passed to the LaTeX structured formatter and typesetter.
+</para>
+</summary>
+</cvar>
+
+<cvar name="LATEXRETRIES">
+<summary>
+<para>
+The maximum number of times that LaTeX
+will be re-run if the
+<filename>.log</filename>
+generated by the &cv-link-LATEXCOM; command
+indicates that there are undefined references.
+The default is to try to resolve undefined references
+by re-running LaTeX up to three times.
+</para>
+</summary>
+</cvar>
+
+<cvar name="TEXINPUTS">
+<summary>
+<para>
+List of directories that the LaTeX program will search
+for include directories.
+The LaTeX implicit dependency scanner will search these
+directories for \include and \import files.
+</para>
+</summary>
+</cvar>
+
+
+</sconsdoc>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/ldc.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/ldc.py
new file mode 100644
index 0000000..3e12199
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/ldc.py
@@ -0,0 +1,158 @@
+from __future__ import print_function
+
+"""SCons.Tool.ldc
+
+Tool-specific initialization for the LDC compiler.
+(https://github.com/ldc-developers/ldc)
+
+Developed by Russel Winder (russel@winder.org.uk)
+2012-05-09 onwards
+
+Compiler variables:
+ DC - The name of the D compiler to use. Defaults to ldc2.
+ DPATH - List of paths to search for import modules.
+ DVERSIONS - List of version tags to enable when compiling.
+ DDEBUG - List of debug tags to enable when compiling.
+
+Linker related variables:
+ LIBS - List of library files to link in.
+ DLINK - Name of the linker to use. Defaults to ldc2.
+ DLINKFLAGS - List of linker flags.
+
+Lib tool variables:
+ DLIB - Name of the lib tool to use. Defaults to lib.
+ DLIBFLAGS - List of flags to pass to the lib tool.
+ LIBS - Same as for the linker. (libraries to pull into the .lib)
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import os
+import subprocess
+
+import SCons.Action
+import SCons.Builder
+import SCons.Defaults
+import SCons.Scanner.D
+import SCons.Tool
+
+import SCons.Tool.DCommon as DCommon
+
+
+def generate(env):
+ static_obj, shared_obj = SCons.Tool.createObjBuilders(env)
+
+ static_obj.add_action('.d', SCons.Defaults.DAction)
+ shared_obj.add_action('.d', SCons.Defaults.ShDAction)
+ static_obj.add_emitter('.d', SCons.Defaults.StaticObjectEmitter)
+ shared_obj.add_emitter('.d', SCons.Defaults.SharedObjectEmitter)
+
+ env['DC'] = env.Detect('ldc2') or 'ldc2'
+ env['DCOM'] = '$DC $_DINCFLAGS $_DVERFLAGS $_DDEBUGFLAGS $_DFLAGS -c -of=$TARGET $SOURCES'
+ env['_DINCFLAGS'] = '${_concat(DINCPREFIX, DPATH, DINCSUFFIX, __env__, RDirs, TARGET, SOURCE)}'
+ env['_DVERFLAGS'] = '${_concat(DVERPREFIX, DVERSIONS, DVERSUFFIX, __env__)}'
+ env['_DDEBUGFLAGS'] = '${_concat(DDEBUGPREFIX, DDEBUG, DDEBUGSUFFIX, __env__)}'
+ env['_DFLAGS'] = '${_concat(DFLAGPREFIX, DFLAGS, DFLAGSUFFIX, __env__)}'
+
+ env['SHDC'] = '$DC'
+ env['SHDCOM'] = '$DC $_DINCFLAGS $_DVERFLAGS $_DDEBUGFLAGS $_DFLAGS -c -relocation-model=pic -of=$TARGET $SOURCES'
+
+ env['DPATH'] = ['#/']
+ env['DFLAGS'] = []
+ env['DVERSIONS'] = []
+ env['DDEBUG'] = []
+
+ if env['DC']:
+ DCommon.addDPATHToEnv(env, env['DC'])
+
+ env['DINCPREFIX'] = '-I='
+ env['DINCSUFFIX'] = ''
+ env['DVERPREFIX'] = '-version='
+ env['DVERSUFFIX'] = ''
+ env['DDEBUGPREFIX'] = '-debug='
+ env['DDEBUGSUFFIX'] = ''
+ env['DFLAGPREFIX'] = '-'
+ env['DFLAGSUFFIX'] = ''
+ env['DFILESUFFIX'] = '.d'
+
+ env['DLINK'] = '$DC'
+ env['DLINKFLAGS'] = SCons.Util.CLVar('')
+ env['DLINKCOM'] = '$DLINK -of=$TARGET $DLINKFLAGS $__DRPATH $SOURCES $_DLIBDIRFLAGS $_DLIBFLAGS'
+
+ env['SHDLINK'] = '$DC'
+ env['SHDLINKFLAGS'] = SCons.Util.CLVar('$DLINKFLAGS -shared -defaultlib=phobos2-ldc')
+
+ env['SHDLINKCOM'] = '$DLINK -of=$TARGET $SHDLINKFLAGS $__SHDLIBVERSIONFLAGS $__DRPATH $SOURCES $_DLIBDIRFLAGS $_DLIBFLAGS -L-ldruntime-ldc'
+
+ env['DLIBLINKPREFIX'] = '' if env['PLATFORM'] == 'win32' else '-L-l'
+ env['DLIBLINKSUFFIX'] = '.lib' if env['PLATFORM'] == 'win32' else ''
+ # env['_DLIBFLAGS'] = '${_concat(DLIBLINKPREFIX, LIBS, DLIBLINKSUFFIX, __env__, RDirs, TARGET, SOURCE)}'
+ env['_DLIBFLAGS'] = '${_stripixes(DLIBLINKPREFIX, LIBS, DLIBLINKSUFFIX, LIBPREFIXES, LIBSUFFIXES, __env__)}'
+
+ env['DLIBDIRPREFIX'] = '-L-L'
+ env['DLIBDIRSUFFIX'] = ''
+ env['_DLIBDIRFLAGS'] = '${_concat(DLIBDIRPREFIX, LIBPATH, DLIBDIRSUFFIX, __env__, RDirs, TARGET, SOURCE)}'
+
+ env['DLIB'] = 'lib' if env['PLATFORM'] == 'win32' else 'ar cr'
+ env['DLIBCOM'] = '$DLIB $_DLIBFLAGS {0}$TARGET $SOURCES $_DLIBFLAGS'.format('-c ' if env['PLATFORM'] == 'win32' else '')
+
+ # env['_DLIBFLAGS'] = '${_concat(DLIBFLAGPREFIX, DLIBFLAGS, DLIBFLAGSUFFIX, __env__)}'
+
+ env['DLIBFLAGPREFIX'] = '-'
+ env['DLIBFLAGSUFFIX'] = ''
+
+ # __RPATH is set to $_RPATH in the platform specification if that
+ # platform supports it.
+ env['DRPATHPREFIX'] = '-L-Wl,-rpath,' if env['PLATFORM'] == 'darwin' else '-L-rpath='
+ env['DRPATHSUFFIX'] = ''
+ env['_DRPATH'] = '${_concat(DRPATHPREFIX, RPATH, DRPATHSUFFIX, __env__)}'
+
+ # Support for versioned libraries
+ env['_SHDLIBVERSIONFLAGS'] = '$SHDLIBVERSIONFLAGS -L-soname=$_SHDLIBSONAME'
+ env['_SHDLIBSONAME'] = '${DShLibSonameGenerator(__env__,TARGET)}'
+ # NOTE: this is a quick hack, the soname will only work if there is
+ # c/c++ linker loaded which provides callback for the ShLibSonameGenerator
+ env['DShLibSonameGenerator'] = SCons.Tool.ShLibSonameGenerator
+ # NOTE: this is only for further reference, currently $SHDLIBVERSION does
+ # not work, the user must use $SHLIBVERSION
+ env['SHDLIBVERSION'] = '$SHLIBVERSION'
+ env['SHDLIBVERSIONFLAGS'] = []
+
+ env['BUILDERS']['ProgramAllAtOnce'] = SCons.Builder.Builder(
+ action='$DC $_DINCFLAGS $_DVERFLAGS $_DDEBUGFLAGS $_DFLAGS -of=$TARGET $DLINKFLAGS $__DRPATH $SOURCES $_DLIBDIRFLAGS $_DLIBFLAGS',
+ emitter=DCommon.allAtOnceEmitter,
+ )
+
+
+def exists(env):
+ return env.Detect('ldc2')
+
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/ldc.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/ldc.xml
new file mode 100644
index 0000000..495b8bc
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/ldc.xml
@@ -0,0 +1,371 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+__COPYRIGHT__
+
+This file is processed by the bin/SConsDoc.py module.
+See its __doc__ string for a discussion of the format.
+-->
+
+<!DOCTYPE sconsdoc [
+<!ENTITY % scons SYSTEM '../../../../doc/scons.mod'>
+%scons;
+<!ENTITY % builders-mod SYSTEM '../../../../doc/generated/builders.mod'>
+%builders-mod;
+<!ENTITY % functions-mod SYSTEM '../../../../doc/generated/functions.mod'>
+%functions-mod;
+<!ENTITY % tools-mod SYSTEM '../../../../doc/generated/tools.mod'>
+%tools-mod;
+<!ENTITY % variables-mod SYSTEM '../../../../doc/generated/variables.mod'>
+%variables-mod;
+]>
+
+<sconsdoc xmlns="http://www.scons.org/dbxsd/v1.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://www.scons.org/dbxsd/v1.0/scons.xsd">
+
+<tool name="ldc">
+<summary>
+<para>
+Sets construction variables for the D language compiler LDC2.
+</para>
+</summary>
+<sets>
+<item>DC</item>
+<item>DCOM</item>
+<item>SHDC</item>
+<item>SHDCOM</item>
+<item>DPATH</item>
+<item>DFLAGS</item>
+<item>DVERSIONS</item>
+<item>DDEBUG</item>
+<item>DINCPREFIX</item>
+<item>DINCSUFFIX</item>
+<item>DVERPREFIX</item>
+<item>DVERSUFFIX</item>
+<item>DDEBUGPREFIX</item>
+<item>DDEBUGSUFFIX</item>
+<item>DFLAGPREFIX</item>
+<item>DFLAGSUFFIX</item>
+<item>DFILESUFFIX</item>
+<item>DLINK</item>
+<item>DLINKFLAGS</item>
+<item>DLINKCOM</item>
+<item>SHDLINK</item>
+<item>SHDLINKFLAGS</item>
+<item>SHDLINKCOM</item>
+<item>DLIBLINKPREFIX</item>
+<item>DLIBLINKSUFFIX</item>
+<item>DLIBDIRPREFIX</item>
+<item>DLIBDIRSUFFIX</item>
+<item>DLIB</item>
+<item>DLIBCOM</item>
+<item>DLIBFLAGPREFIX</item>
+<item>DLIBFLAGSUFFIX</item>
+<item>DLINKFLAGPREFIX</item>
+<item>DLINKFLAGSUFFIX</item>
+<item>DRPATHPREFIX</item>
+<item>DRPATHSUFFIX</item>
+<item>DShLibSonameGenerator</item>
+<item>SHDLIBVERSION</item>
+<item>SHDLIBVERSIONFLAGS</item>
+</sets>
+<uses>
+</uses>
+</tool>
+
+<cvar name="DC">
+<summary>
+<para>
+The D compiler to use.
+</para>
+</summary>
+</cvar>
+
+<cvar name="DCOM">
+<summary>
+<para>
+ The command line used to compile a D file to an object file.
+ Any options specified in the &cv-link-DFLAGS; construction variable
+ is included on this command line.
+</para>
+</summary>
+</cvar>
+
+<cvar name="DDEBUG">
+<summary>
+<para>
+ List of debug tags to enable when compiling.
+</para>
+</summary>
+</cvar>
+
+<cvar name="DFLAGS">
+<summary>
+<para>
+ General options that are passed to the D compiler.
+</para>
+</summary>
+</cvar>
+
+<cvar name="DLIB">
+<summary>
+<para>
+ Name of the lib tool to use for D codes.
+</para>
+</summary>
+</cvar>
+
+<cvar name="DLIBCOM">
+<summary>
+<para>
+ The command line to use when creating libraries.
+</para>
+</summary>
+</cvar>
+
+<cvar name="DLINK">
+<summary>
+<para>
+ Name of the linker to use for linking systems including D sources.
+</para>
+</summary>
+</cvar>
+
+<cvar name="DLINKCOM">
+<summary>
+<para>
+ The command line to use when linking systems including D sources.
+</para>
+</summary>
+</cvar>
+
+<cvar name="DLINKFLAGS">
+<summary>
+<para>
+List of linker flags.
+</para>
+</summary>
+</cvar>
+
+<cvar name="DPATH">
+<summary>
+<para>
+ List of paths to search for import modules.
+</para>
+</summary>
+</cvar>
+
+<cvar name="DVERSIONS">
+<summary>
+<para>
+ List of version tags to enable when compiling.
+</para>
+</summary>
+</cvar>
+
+<cvar name="SHDC">
+<summary>
+<para>
+ The name of the compiler to use when compiling D source
+ destined to be in a shared objects.
+</para>
+</summary>
+</cvar>
+
+<cvar name="SHDCOM">
+<summary>
+<para>
+ The command line to use when compiling code to be part of shared objects.
+</para>
+</summary>
+</cvar>
+
+<cvar name="SHDLINK">
+<summary>
+<para>
+ The linker to use when creating shared objects for code bases
+ include D sources.
+</para>
+</summary>
+</cvar>
+
+<cvar name="SHDLINKCOM">
+<summary>
+<para>
+ The command line to use when generating shared objects.
+</para>
+</summary>
+</cvar>
+
+<cvar name="SHDLINKFLAGS">
+<summary>
+<para>
+ The list of flags to use when generating a shared object.
+</para>
+</summary>
+</cvar>
+
+<cvar name="DVERSUFFIX">
+ <summary>
+ <para>
+ DVERSUFFIX.
+ </para>
+ </summary>
+</cvar>
+
+<cvar name="DVERPREFIX">
+ <summary>
+ <para>
+ DVERPREFIX.
+ </para>
+ </summary>
+</cvar>
+
+<cvar name="DLINKFLAGSUFFIX">
+ <summary>
+ <para>
+ DLINKFLAGSUFFIX.
+ </para>
+ </summary>
+</cvar>
+
+<cvar name="DLINKFLAGPREFIX">
+ <summary>
+ <para>
+ DLINKFLAGPREFIX.
+ </para>
+ </summary>
+</cvar>
+
+<cvar name="DLIBLINKSUFFIX">
+ <summary>
+ <para>
+ DLIBLINKSUFFIX.
+ </para>
+ </summary>
+</cvar>
+
+<cvar name="DLIBLINKPREFIX">
+ <summary>
+ <para>
+ DLIBLINKPREFIX.
+ </para>
+ </summary>
+</cvar>
+
+<cvar name="DLIBFLAGSUFFIX">
+ <summary>
+ <para>
+ DLIBFLAGSUFFIX.
+ </para>
+ </summary>
+</cvar>
+
+<cvar name="DLIBFLAGPREFIX">
+ <summary>
+ <para>
+ DLIBFLAGPREFIX.
+ </para>
+ </summary>
+</cvar>
+
+<cvar name="DLIBDIRSUFFIX">
+ <summary>
+ <para>
+ DLIBLINKSUFFIX.
+ </para>
+ </summary>
+</cvar>
+
+<cvar name="DLIBDIRPREFIX">
+ <summary>
+ <para>
+ DLIBLINKPREFIX.
+ </para>
+ </summary>
+</cvar>
+
+<cvar name="DINCSUFFIX">
+ <summary>
+ <para>
+ DLIBFLAGSUFFIX.
+ </para>
+ </summary>
+</cvar>
+
+
+<cvar name="DINCPREFIX">
+ <summary>
+ <para>
+ DINCPREFIX.
+ </para>
+ </summary>
+</cvar>
+
+<cvar name="DFLAGSUFFIX">
+ <summary>
+ <para>
+ DFLAGSUFFIX.
+ </para>
+ </summary>
+</cvar>
+
+<cvar name="DFLAGPREFIX">
+ <summary>
+ <para>
+ DFLAGPREFIX.
+ </para>
+ </summary>
+</cvar>
+
+<cvar name="DFILESUFFIX">
+ <summary>
+ <para>
+ DFILESUFFIX.
+ </para>
+ </summary>
+</cvar>
+
+<cvar name="DDEBUGPREFIX">
+ <summary>
+ <para>
+ DDEBUGPREFIX.
+ </para>
+ </summary>
+</cvar>
+
+<cvar name="DDEBUGSUFFIX">
+ <summary>
+ <para>
+ DDEBUGSUFFIX.
+ </para>
+ </summary>
+</cvar>
+
+<builder name="ProgramAllAtOnce">
+ <summary>
+ <para>
+ Builds an executable from D sources without first creating individual
+ objects for each file.
+ </para>
+ <para>
+ D sources can be compiled file-by-file as C and C++ source are, and
+ D is integrated into the &scons; Object and Program builders for
+ this model of build. D codes can though do whole source
+ meta-programming (some of the testing frameworks do this). For this
+ it is imperative that all sources are compiled and linked in a single call of
+ the D compiler. This builder serves that purpose.
+ </para>
+ <example_commands>
+ env.ProgramAllAtOnce('executable', ['mod_a.d, mod_b.d', 'mod_c.d'])
+ </example_commands>
+ <para>
+ This command will compile the modules mod_a, mod_b, and mod_c in a
+ single compilation process without first creating object files for
+ the modules. Some of the D compilers will create executable.o others
+ will not.
+ </para>
+ </summary>
+</builder>
+
+</sconsdoc>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/lex.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/lex.py
new file mode 100644
index 0000000..280c768
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/lex.py
@@ -0,0 +1,97 @@
+"""SCons.Tool.lex
+
+Tool-specific initialization for lex.
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import os.path
+
+import SCons.Action
+import SCons.Tool
+import SCons.Util
+
+LexAction = SCons.Action.Action("$LEXCOM", "$LEXCOMSTR")
+
+def lexEmitter(target, source, env):
+ sourceBase, sourceExt = os.path.splitext(SCons.Util.to_String(source[0]))
+
+ if sourceExt == ".lm": # If using Objective-C
+ target = [sourceBase + ".m"] # the extension is ".m".
+
+ # This emitter essentially tries to add to the target all extra
+ # files generated by flex.
+
+ # Different options that are used to trigger the creation of extra files.
+ fileGenOptions = ["--header-file=", "--tables-file="]
+
+ lexflags = env.subst("$LEXFLAGS", target=target, source=source)
+ for option in SCons.Util.CLVar(lexflags):
+ for fileGenOption in fileGenOptions:
+ l = len(fileGenOption)
+ if option[:l] == fileGenOption:
+ # A file generating option is present, so add the
+ # file name to the target list.
+ fileName = option[l:].strip()
+ target.append(fileName)
+ return (target, source)
+
+def generate(env):
+ """Add Builders and construction variables for lex to an Environment."""
+ c_file, cxx_file = SCons.Tool.createCFileBuilders(env)
+
+ # C
+ c_file.add_action(".l", LexAction)
+ c_file.add_emitter(".l", lexEmitter)
+
+ c_file.add_action(".lex", LexAction)
+ c_file.add_emitter(".lex", lexEmitter)
+
+ # Objective-C
+ cxx_file.add_action(".lm", LexAction)
+ cxx_file.add_emitter(".lm", lexEmitter)
+
+ # C++
+ cxx_file.add_action(".ll", LexAction)
+ cxx_file.add_emitter(".ll", lexEmitter)
+
+ env["LEX"] = env.Detect("flex") or "lex"
+ env["LEXFLAGS"] = SCons.Util.CLVar("")
+ env["LEXCOM"] = "$LEX $LEXFLAGS -t $SOURCES > $TARGET"
+
+def exists(env):
+ return env.Detect(["flex", "lex"])
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/lex.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/lex.xml
new file mode 100644
index 0000000..0388ee3
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/lex.xml
@@ -0,0 +1,81 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+__COPYRIGHT__
+
+This file is processed by the bin/SConsDoc.py module.
+See its __doc__ string for a discussion of the format.
+-->
+
+<!DOCTYPE sconsdoc [
+<!ENTITY % scons SYSTEM '../../../../doc/scons.mod'>
+%scons;
+<!ENTITY % builders-mod SYSTEM '../../../../doc/generated/builders.mod'>
+%builders-mod;
+<!ENTITY % functions-mod SYSTEM '../../../../doc/generated/functions.mod'>
+%functions-mod;
+<!ENTITY % tools-mod SYSTEM '../../../../doc/generated/tools.mod'>
+%tools-mod;
+<!ENTITY % variables-mod SYSTEM '../../../../doc/generated/variables.mod'>
+%variables-mod;
+]>
+
+<sconsdoc xmlns="http://www.scons.org/dbxsd/v1.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://www.scons.org/dbxsd/v1.0 http://www.scons.org/dbxsd/v1.0/scons.xsd">
+
+<tool name="lex">
+<summary>
+<para>
+Sets construction variables for the &lex; lexical analyser.
+</para>
+</summary>
+<sets>
+<item>LEX</item>
+<item>LEXFLAGS</item>
+<item>LEXCOM</item>
+</sets>
+<uses>
+<item>LEXCOMSTR</item>
+</uses>
+</tool>
+
+<cvar name="LEX">
+<summary>
+<para>
+The lexical analyzer generator.
+</para>
+</summary>
+</cvar>
+
+<cvar name="LEXCOM">
+<summary>
+<para>
+The command line used to call the lexical analyzer generator
+to generate a source file.
+</para>
+</summary>
+</cvar>
+
+<cvar name="LEXCOMSTR">
+<summary>
+<para>
+The string displayed when generating a source file
+using the lexical analyzer generator.
+If this is not set, then &cv-link-LEXCOM; (the command line) is displayed.
+</para>
+
+<example_commands>
+env = Environment(LEXCOMSTR = "Lex'ing $TARGET from $SOURCES")
+</example_commands>
+</summary>
+</cvar>
+
+<cvar name="LEXFLAGS">
+<summary>
+<para>
+General options passed to the lexical analyzer generator.
+</para>
+</summary>
+</cvar>
+
+</sconsdoc>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/link.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/link.py
new file mode 100644
index 0000000..07e9250
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/link.py
@@ -0,0 +1,331 @@
+
+"""SCons.Tool.link
+
+Tool-specific initialization for the generic Posix linker.
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+from __future__ import print_function
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import sys
+import re
+import os
+
+import SCons.Tool
+import SCons.Util
+import SCons.Warnings
+
+from SCons.Tool.FortranCommon import isfortran
+
+from SCons.Tool.DCommon import isD
+
+import SCons.Tool.cxx
+cplusplus = SCons.Tool.cxx
+# cplusplus = __import__(__package__+'.cxx', globals(), locals(), ['*'])
+
+issued_mixed_link_warning = False
+
+def smart_link(source, target, env, for_signature):
+ has_cplusplus = cplusplus.iscplusplus(source)
+ has_fortran = isfortran(env, source)
+ has_d = isD(env, source)
+ if has_cplusplus and has_fortran and not has_d:
+ global issued_mixed_link_warning
+ if not issued_mixed_link_warning:
+ msg = "Using $CXX to link Fortran and C++ code together.\n\t" + \
+ "This may generate a buggy executable if the '%s'\n\t" + \
+ "compiler does not know how to deal with Fortran runtimes."
+ SCons.Warnings.warn(SCons.Warnings.FortranCxxMixWarning,
+ msg % env.subst('$CXX'))
+ issued_mixed_link_warning = True
+ return '$CXX'
+ elif has_d:
+ env['LINKCOM'] = env['DLINKCOM']
+ env['SHLINKCOM'] = env['SHDLINKCOM']
+ return '$DC'
+ elif has_fortran:
+ return '$FORTRAN'
+ elif has_cplusplus:
+ return '$CXX'
+ return '$CC'
+
+def _lib_emitter(target, source, env, **kw):
+ Verbose = False
+ if Verbose:
+ print("_lib_emitter: target[0]={:r}".format(target[0].get_path()))
+ for tgt in target:
+ tgt.attributes.shared = 1
+
+ try:
+ symlink_generator = kw['symlink_generator']
+ except KeyError:
+ pass
+ else:
+ if Verbose:
+ print("_lib_emitter: symlink_generator={:r}".format(symlink_generator))
+ symlinks = symlink_generator(env, target[0])
+ if Verbose:
+ print("_lib_emitter: symlinks={:r}".format(symlinks))
+
+ if symlinks:
+ SCons.Tool.EmitLibSymlinks(env, symlinks, target[0])
+ target[0].attributes.shliblinks = symlinks
+ return (target, source)
+
+def shlib_emitter(target, source, env):
+ return _lib_emitter(target, source, env, symlink_generator = SCons.Tool.ShLibSymlinkGenerator)
+
+def ldmod_emitter(target, source, env):
+ return _lib_emitter(target, source, env, symlink_generator = SCons.Tool.LdModSymlinkGenerator)
+
+# This is generic enough to be included here...
+def _versioned_lib_name(env, libnode, version, prefix, suffix, prefix_generator, suffix_generator, **kw):
+ """For libnode='/optional/dir/libfoo.so.X.Y.Z' it returns 'libfoo.so'"""
+ Verbose = False
+
+ if Verbose:
+ print("_versioned_lib_name: libnode={:r}".format(libnode.get_path()))
+ print("_versioned_lib_name: version={:r}".format(version))
+ print("_versioned_lib_name: prefix={:r}".format(prefix))
+ print("_versioned_lib_name: suffix={:r}".format(suffix))
+ print("_versioned_lib_name: suffix_generator={:r}".format(suffix_generator))
+
+ versioned_name = os.path.basename(libnode.get_path())
+ if Verbose:
+ print("_versioned_lib_name: versioned_name={:r}".format(versioned_name))
+
+ versioned_prefix = prefix_generator(env, **kw)
+ versioned_suffix = suffix_generator(env, **kw)
+ if Verbose:
+ print("_versioned_lib_name: versioned_prefix={:r}".format(versioned_prefix))
+ print("_versioned_lib_name: versioned_suffix={:r}".format(versioned_suffix))
+
+ versioned_prefix_re = '^' + re.escape(versioned_prefix)
+ versioned_suffix_re = re.escape(versioned_suffix) + '$'
+ name = re.sub(versioned_prefix_re, prefix, versioned_name)
+ name = re.sub(versioned_suffix_re, suffix, name)
+ if Verbose:
+ print("_versioned_lib_name: name={:r}".format(name))
+ return name
+
+def _versioned_shlib_name(env, libnode, version, prefix, suffix, **kw):
+ pg = SCons.Tool.ShLibPrefixGenerator
+ sg = SCons.Tool.ShLibSuffixGenerator
+ return _versioned_lib_name(env, libnode, version, prefix, suffix, pg, sg, **kw)
+
+def _versioned_ldmod_name(env, libnode, version, prefix, suffix, **kw):
+ pg = SCons.Tool.LdModPrefixGenerator
+ sg = SCons.Tool.LdModSuffixGenerator
+ return _versioned_lib_name(env, libnode, version, prefix, suffix, pg, sg, **kw)
+
+def _versioned_lib_suffix(env, suffix, version):
+ """For suffix='.so' and version='0.1.2' it returns '.so.0.1.2'"""
+ Verbose = False
+ if Verbose:
+ print("_versioned_lib_suffix: suffix={:r}".format(suffix))
+ print("_versioned_lib_suffix: version={:r}".format(version))
+ if not suffix.endswith(version):
+ suffix = suffix + '.' + version
+ if Verbose:
+ print("_versioned_lib_suffix: return suffix={:r}".format(suffix))
+ return suffix
+
+def _versioned_lib_soname(env, libnode, version, prefix, suffix, name_func):
+ """For libnode='/optional/dir/libfoo.so.X.Y.Z' it returns 'libfoo.so.X'"""
+ Verbose = False
+ if Verbose:
+ print("_versioned_lib_soname: version={:r}".format(version))
+ name = name_func(env, libnode, version, prefix, suffix)
+ if Verbose:
+ print("_versioned_lib_soname: name={:r}".format(name))
+ major = version.split('.')[0]
+ soname = name + '.' + major
+ if Verbose:
+ print("_versioned_lib_soname: soname={:r}".format(soname))
+ return soname
+
+def _versioned_shlib_soname(env, libnode, version, prefix, suffix):
+ return _versioned_lib_soname(env, libnode, version, prefix, suffix, _versioned_shlib_name)
+
+def _versioned_ldmod_soname(env, libnode, version, prefix, suffix):
+ return _versioned_lib_soname(env, libnode, version, prefix, suffix, _versioned_ldmod_name)
+
+def _versioned_lib_symlinks(env, libnode, version, prefix, suffix, name_func, soname_func):
+ """Generate link names that should be created for a versioned shared lirbrary.
+ Returns a dictionary in the form { linkname : linktarget }
+ """
+ Verbose = False
+
+ if Verbose:
+ print("_versioned_lib_symlinks: libnode={:r}".format(libnode.get_path()))
+ print("_versioned_lib_symlinks: version={:r}".format(version))
+
+ if sys.platform.startswith('openbsd'):
+ # OpenBSD uses x.y shared library versioning numbering convention
+ # and doesn't use symlinks to backwards-compatible libraries
+ if Verbose:
+ print("_versioned_lib_symlinks: return symlinks={:r}".format(None))
+ return None
+
+ linkdir = libnode.get_dir()
+ if Verbose:
+ print("_versioned_lib_symlinks: linkdir={:r}".format(linkdir.get_path()))
+
+ name = name_func(env, libnode, version, prefix, suffix)
+ if Verbose:
+ print("_versioned_lib_symlinks: name={:r}".format(name))
+
+ soname = soname_func(env, libnode, version, prefix, suffix)
+
+ link0 = env.fs.File(soname, linkdir)
+ link1 = env.fs.File(name, linkdir)
+
+ # We create direct symlinks, not daisy-chained.
+ if link0 == libnode:
+ # This enables SHLIBVERSION without periods (e.g. SHLIBVERSION=1)
+ symlinks = [ (link1, libnode) ]
+ else:
+ # This handles usual SHLIBVERSION, i.e. '1.2', '1.2.3', etc.
+ symlinks = [ (link0, libnode), (link1, libnode) ]
+
+ if Verbose:
+ print("_versioned_lib_symlinks: return symlinks={:r}".format(SCons.Tool.StringizeLibSymlinks(symlinks)))
+
+ return symlinks
+
+def _versioned_shlib_symlinks(env, libnode, version, prefix, suffix):
+ nf = _versioned_shlib_name
+ sf = _versioned_shlib_soname
+ return _versioned_lib_symlinks(env, libnode, version, prefix, suffix, nf, sf)
+
+def _versioned_ldmod_symlinks(env, libnode, version, prefix, suffix):
+ nf = _versioned_ldmod_name
+ sf = _versioned_ldmod_soname
+ return _versioned_lib_symlinks(env, libnode, version, prefix, suffix, nf, sf)
+
+def _versioned_lib_callbacks():
+ return {
+ 'VersionedShLibSuffix' : _versioned_lib_suffix,
+ 'VersionedLdModSuffix' : _versioned_lib_suffix,
+ 'VersionedShLibSymlinks' : _versioned_shlib_symlinks,
+ 'VersionedLdModSymlinks' : _versioned_ldmod_symlinks,
+ 'VersionedShLibName' : _versioned_shlib_name,
+ 'VersionedLdModName' : _versioned_ldmod_name,
+ 'VersionedShLibSoname' : _versioned_shlib_soname,
+ 'VersionedLdModSoname' : _versioned_ldmod_soname,
+ }.copy()
+
+def _setup_versioned_lib_variables(env, **kw):
+ """
+ Setup all variables required by the versioning machinery
+ """
+
+ tool = None
+ try: tool = kw['tool']
+ except KeyError: pass
+
+ use_soname = False
+ try: use_soname = kw['use_soname']
+ except KeyError: pass
+
+ # The $_SHLIBVERSIONFLAGS define extra commandline flags used when
+ # building VERSIONED shared libraries. It's always set, but used only
+ # when VERSIONED library is built (see __SHLIBVERSIONFLAGS in SCons/Defaults.py).
+ if use_soname:
+ # If the linker uses SONAME, then we need this little automata
+ if tool == 'sunlink':
+ env['_SHLIBVERSIONFLAGS'] = '$SHLIBVERSIONFLAGS -h $_SHLIBSONAME'
+ env['_LDMODULEVERSIONFLAGS'] = '$LDMODULEVERSIONFLAGS -h $_LDMODULESONAME'
+ else:
+ env['_SHLIBVERSIONFLAGS'] = '$SHLIBVERSIONFLAGS -Wl,-soname=$_SHLIBSONAME'
+ env['_LDMODULEVERSIONFLAGS'] = '$LDMODULEVERSIONFLAGS -Wl,-soname=$_LDMODULESONAME'
+ env['_SHLIBSONAME'] = '${ShLibSonameGenerator(__env__,TARGET)}'
+ env['_LDMODULESONAME'] = '${LdModSonameGenerator(__env__,TARGET)}'
+ env['ShLibSonameGenerator'] = SCons.Tool.ShLibSonameGenerator
+ env['LdModSonameGenerator'] = SCons.Tool.LdModSonameGenerator
+ else:
+ env['_SHLIBVERSIONFLAGS'] = '$SHLIBVERSIONFLAGS'
+ env['_LDMODULEVERSIONFLAGS'] = '$LDMODULEVERSIONFLAGS'
+
+ # LDOMDULVERSIONFLAGS should always default to $SHLIBVERSIONFLAGS
+ env['LDMODULEVERSIONFLAGS'] = '$SHLIBVERSIONFLAGS'
+
+
+def generate(env):
+ """Add Builders and construction variables for gnulink to an Environment."""
+ SCons.Tool.createSharedLibBuilder(env)
+ SCons.Tool.createProgBuilder(env)
+
+ env['SHLINK'] = '$LINK'
+ env['SHLINKFLAGS'] = SCons.Util.CLVar('$LINKFLAGS -shared')
+ env['SHLINKCOM'] = '$SHLINK -o $TARGET $SHLINKFLAGS $__SHLIBVERSIONFLAGS $__RPATH $SOURCES $_LIBDIRFLAGS $_LIBFLAGS'
+ # don't set up the emitter, cause AppendUnique will generate a list
+ # starting with None :-(
+ env.Append(SHLIBEMITTER = [shlib_emitter])
+ env['SMARTLINK'] = smart_link
+ env['LINK'] = "$SMARTLINK"
+ env['LINKFLAGS'] = SCons.Util.CLVar('')
+ # __RPATH is only set to something ($_RPATH typically) on platforms that support it.
+ env['LINKCOM'] = '$LINK -o $TARGET $LINKFLAGS $__RPATH $SOURCES $_LIBDIRFLAGS $_LIBFLAGS'
+ env['LIBDIRPREFIX']='-L'
+ env['LIBDIRSUFFIX']=''
+ env['_LIBFLAGS']='${_stripixes(LIBLINKPREFIX, LIBS, LIBLINKSUFFIX, LIBPREFIXES, LIBSUFFIXES, __env__)}'
+ env['LIBLINKPREFIX']='-l'
+ env['LIBLINKSUFFIX']=''
+
+ if env['PLATFORM'] == 'hpux':
+ env['SHLIBSUFFIX'] = '.sl'
+ elif env['PLATFORM'] == 'aix':
+ env['SHLIBSUFFIX'] = '.a'
+
+ # For most platforms, a loadable module is the same as a shared
+ # library. Platforms which are different can override these, but
+ # setting them the same means that LoadableModule works everywhere.
+ SCons.Tool.createLoadableModuleBuilder(env)
+ env['LDMODULE'] = '$SHLINK'
+ env.Append(LDMODULEEMITTER = [ldmod_emitter])
+ env['LDMODULEPREFIX'] = '$SHLIBPREFIX'
+ env['LDMODULESUFFIX'] = '$SHLIBSUFFIX'
+ env['LDMODULEFLAGS'] = '$SHLINKFLAGS'
+ env['LDMODULECOM'] = '$LDMODULE -o $TARGET $LDMODULEFLAGS $__LDMODULEVERSIONFLAGS $__RPATH $SOURCES $_LIBDIRFLAGS $_LIBFLAGS'
+ env['LDMODULEVERSION'] = '$SHLIBVERSION'
+ env['LDMODULENOVERSIONSYMLINKS'] = '$SHLIBNOVERSIONSYMLINKS'
+
+def exists(env):
+ # This module isn't really a Tool on its own, it's common logic for
+ # other linkers.
+ return None
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/link.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/link.xml
new file mode 100644
index 0000000..2f913fe
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/link.xml
@@ -0,0 +1,389 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+__COPYRIGHT__
+
+This file is processed by the bin/SConsDoc.py module.
+See its __doc__ string for a discussion of the format.
+-->
+
+<!DOCTYPE sconsdoc [
+<!ENTITY % scons SYSTEM '../../../../doc/scons.mod'>
+%scons;
+<!ENTITY % builders-mod SYSTEM '../../../../doc/generated/builders.mod'>
+%builders-mod;
+<!ENTITY % functions-mod SYSTEM '../../../../doc/generated/functions.mod'>
+%functions-mod;
+<!ENTITY % tools-mod SYSTEM '../../../../doc/generated/tools.mod'>
+%tools-mod;
+<!ENTITY % variables-mod SYSTEM '../../../../doc/generated/variables.mod'>
+%variables-mod;
+]>
+
+<sconsdoc xmlns="http://www.scons.org/dbxsd/v1.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://www.scons.org/dbxsd/v1.0 http://www.scons.org/dbxsd/v1.0/scons.xsd">
+
+<tool name="link">
+<summary>
+<para>
+Sets construction variables for generic POSIX linkers.
+</para>
+</summary>
+<sets>
+<item>SHLINK</item>
+<item>SHLINKFLAGS</item>
+<item>SHLINKCOM</item>
+<item>LINK</item>
+<item>LINKFLAGS</item>
+<item>LINKCOM</item>
+<item>LIBDIRPREFIX</item>
+<item>LIBDIRSUFFIX</item>
+<item>LIBLINKPREFIX</item>
+<item>LIBLINKSUFFIX</item>
+<item>SHLIBSUFFIX</item>
+<item>__SHLIBVERSIONFLAGS</item>
+<item>LDMODULE</item>
+<item>LDMODULEPREFIX</item>
+<item>LDMODULESUFFIX</item>
+<item>LDMODULEFLAGS</item>
+<item>LDMODULECOM</item>
+<item>LDMODULEVERSION</item>
+<item>LDMODULENOVERSIONSYMLINKS</item>
+<item>LDMODULEVERSIONFLAGS</item>
+<item>__LDMODULEVERSIONFLAGS</item>
+</sets>
+<uses>
+<item>SHLINKCOMSTR</item>
+<item>LINKCOMSTR</item>
+<item>LDMODULECOMSTR</item>
+</uses>
+</tool>
+
+<cvar name="__LDMODULEVERSIONFLAGS">
+<summary>
+<para>
+This construction variable automatically introduces &cv-link-_LDMODULEVERSIONFLAGS;
+if &cv-link-LDMODULEVERSION; is set. Othervise it evaluates to an empty string.
+</para>
+</summary>
+</cvar>
+
+<cvar name="__SHLIBVERSIONFLAGS">
+<summary>
+<para>
+This construction variable automatically introduces &cv-link-_SHLIBVERSIONFLAGS;
+if &cv-link-SHLIBVERSION; is set. Othervise it evaluates to an empty string.
+</para>
+</summary>
+</cvar>
+
+<cvar name="_LDMODULESONAME">
+<summary>
+<para>
+A macro that automatically generates loadable module's SONAME based on $TARGET,
+$LDMODULEVERSION and $LDMODULESUFFIX. Used by &b-link-LoadableModule; builder
+when the linker tool supports SONAME (e.g. &t-link-gnulink;).
+</para>
+</summary>
+</cvar>
+
+<cvar name="_LDMODULEVERSIONFLAGS">
+<summary>
+<para>
+This macro automatically introduces extra flags to &cv-link-LDMODULECOM; when
+building versioned &b-link-LoadableModule; (that is when
+&cv-link-LDMODULEVERSION; is set). <literal>_LDMODULEVERSIONFLAGS</literal>
+usually adds &cv-link-SHLIBVERSIONFLAGS; and some extra dynamically generated
+options (such as <literal>-Wl,-soname=$_LDMODULESONAME</literal>). It is unused
+by plain (unversioned) loadable modules.
+</para>
+</summary>
+</cvar>
+
+<cvar name="_SHLIBVERSIONFLAGS">
+<summary>
+<para>
+This macro automatically introduces extra flags to &cv-link-SHLINKCOM; when
+building versioned &b-link-SharedLibrary; (that is when &cv-link-SHLIBVERSION;
+is set). <literal>_SHLIBVERSIONFLAGS</literal> usually adds &cv-link-SHLIBVERSIONFLAGS;
+and some extra dynamically generated options (such as
+<literal>-Wl,-soname=$_SHLIBSONAME</literal>. It is unused by "plain"
+(unversioned) shared libraries.
+</para>
+</summary>
+</cvar>
+
+<cvar name="_SHLIBSONAME">
+<summary>
+<para>
+A macro that automatically generates shared library's SONAME based on $TARGET,
+$SHLIBVERSION and $SHLIBSUFFIX. Used by &b-link-SharedLibrary; builder when
+the linker tool supports SONAME (e.g. &t-link-gnulink;).
+</para>
+</summary>
+</cvar>
+
+<cvar name="IMPLIBPREFIX">
+<summary>
+<para>
+The prefix used for import library names. For example, cygwin uses import
+libraries (<literal>libfoo.dll.a</literal>) in pair with dynamic libraries
+(<literal>cygfoo.dll</literal>). The &t-link-cyglink; linker sets
+&cv-link-IMPLIBPREFIX; to <literal>'lib'</literal> and &cv-link-SHLIBPREFIX;
+to <literal>'cyg'</literal>.
+</para>
+</summary>
+</cvar>
+
+<cvar name="IMPLIBSUFFIX">
+<summary>
+<para>
+The suffix used for import library names. For example, cygwin uses import
+libraries (<literal>libfoo.dll.a</literal>) in pair with dynamic libraries
+(<literal>cygfoo.dll</literal>). The &t-link-cyglink; linker sets
+&cv-link-IMPLIBSUFFIX; to <literal>'.dll.a'</literal> and &cv-link-SHLIBSUFFIX;
+to <literal>'.dll'</literal>.
+</para>
+</summary>
+</cvar>
+
+<cvar name="IMPLIBNOVERSIONSYMLINKS">
+<summary>
+<para>
+Used to override &cv-link-SHLIBNOVERSIONSYMLINKS;/&cv-link-LDMODULENOVERSIONSYMLINKS; when
+creating versioned import library for a shared library/loadable module. If not defined,
+then &cv-link-SHLIBNOVERSIONSYMLINKS;/&cv-link-LDMODULENOVERSIONSYMLINKS; is used to determine
+whether to disable symlink generation or not.
+</para>
+</summary>
+</cvar>
+
+<cvar name="LDMODULE">
+<summary>
+<para>
+The linker for building loadable modules.
+By default, this is the same as &cv-link-SHLINK;.
+</para>
+</summary>
+</cvar>
+
+<cvar name="LDMODULECOM">
+<summary>
+<para>
+The command line for building loadable modules.
+On Mac OS X, this uses the &cv-link-LDMODULE;,
+&cv-link-LDMODULEFLAGS; and
+&cv-link-FRAMEWORKSFLAGS; variables.
+On other systems, this is the same as &cv-link-SHLINK;.
+</para>
+</summary>
+</cvar>
+
+<cvar name="LDMODULECOMSTR">
+<summary>
+<para>
+The string displayed when building loadable modules.
+If this is not set, then &cv-link-LDMODULECOM; (the command line) is displayed.
+</para>
+</summary>
+</cvar>
+
+<cvar name="LDMODULEFLAGS">
+<summary>
+<para>
+General user options passed to the linker for building loadable modules.
+</para>
+</summary>
+</cvar>
+
+<cvar name="LDMODULENOVERSIONSYMLINKS">
+<summary>
+<para>
+Instructs the &b-link-LoadableModule; builder to not automatically create symlinks
+for versioned modules. Defaults to <literal>$SHLIBNOVERSIONSYMLINKS</literal>
+</para>
+</summary>
+</cvar>
+
+<cvar name="LDMODULEPREFIX">
+<summary>
+<para>
+The prefix used for loadable module file names.
+On Mac OS X, this is null;
+on other systems, this is
+the same as &cv-link-SHLIBPREFIX;.
+</para>
+</summary>
+</cvar>
+
+<cvar name="LDMODULESUFFIX">
+<summary>
+<para>
+The suffix used for loadable module file names.
+On Mac OS X, this is null;
+on other systems, this is
+the same as $SHLIBSUFFIX.
+</para>
+</summary>
+</cvar>
+
+<cvar name="LDMODULEVERSIONFLAGS">
+<summary>
+<para>
+Extra flags added to &cv-link-LDMODULECOM; when building versioned
+&b-link-LoadableModule;. These flags are only used when &cv-link-LDMODULEVERSION; is
+set.
+</para>
+</summary>
+</cvar>
+
+<cvar name="LINK">
+<summary>
+<para>
+The linker.
+</para>
+</summary>
+</cvar>
+
+<cvar name="LINKCOM">
+<summary>
+<para>
+The command line used to link object files into an executable.
+</para>
+</summary>
+</cvar>
+
+<cvar name="LINKCOMSTR">
+<summary>
+<para>
+The string displayed when object files
+are linked into an executable.
+If this is not set, then &cv-link-LINKCOM; (the command line) is displayed.
+</para>
+
+<example_commands>
+env = Environment(LINKCOMSTR = "Linking $TARGET")
+</example_commands>
+</summary>
+</cvar>
+
+<cvar name="LINKFLAGS">
+<summary>
+<para>
+General user options passed to the linker.
+Note that this variable should
+<emphasis>not</emphasis>
+contain
+<option>-l</option>
+(or similar) options for linking with the libraries listed in &cv-link-LIBS;,
+nor
+<option>-L</option>
+(or similar) library search path options
+that scons generates automatically from &cv-link-LIBPATH;.
+See
+&cv-link-_LIBFLAGS;
+above,
+for the variable that expands to library-link options,
+and
+&cv-link-_LIBDIRFLAGS;
+above,
+for the variable that expands to library search path options.
+</para>
+</summary>
+</cvar>
+
+<cvar name="SHLIBNOVERSIONSYMLINKS">
+<summary>
+<para>
+Instructs the &b-link-SharedLibrary; builder to not create symlinks for versioned
+shared libraries.
+</para>
+</summary>
+</cvar>
+
+<cvar name="SHLIBVERSIONFLAGS">
+<summary>
+<para>
+Extra flags added to &cv-link-SHLINKCOM; when building versioned
+&b-link-SharedLibrary;. These flags are only used when &cv-link-SHLIBVERSION; is
+set.
+</para>
+</summary>
+</cvar>
+
+<cvar name="SHLINK">
+<summary>
+<para>
+The linker for programs that use shared libraries.
+</para>
+</summary>
+</cvar>
+
+<cvar name="SHLINKCOM">
+<summary>
+<para>
+The command line used to link programs using shared libraries.
+</para>
+</summary>
+</cvar>
+
+<cvar name="SHLINKCOMSTR">
+<summary>
+<para>
+The string displayed when programs using shared libraries are linked.
+If this is not set, then &cv-link-SHLINKCOM; (the command line) is displayed.
+</para>
+
+<example_commands>
+env = Environment(SHLINKCOMSTR = "Linking shared $TARGET")
+</example_commands>
+</summary>
+</cvar>
+
+<cvar name="SHLINKFLAGS">
+<summary>
+<para>
+General user options passed to the linker for programs using shared libraries.
+Note that this variable should
+<emphasis>not</emphasis>
+contain
+<option>-l</option>
+(or similar) options for linking with the libraries listed in &cv-link-LIBS;,
+nor
+<option>-L</option>
+(or similar) include search path options
+that scons generates automatically from &cv-link-LIBPATH;.
+See
+&cv-link-_LIBFLAGS;
+above,
+for the variable that expands to library-link options,
+and
+&cv-link-_LIBDIRFLAGS;
+above,
+for the variable that expands to library search path options.
+</para>
+</summary>
+</cvar>
+
+<cvar name="SONAME">
+<summary>
+<para>
+Variable used to hard-code SONAME for versioned shared library/loadable module.
+<example_commands>
+env.SharedLibrary('test', 'test.c', SHLIBVERSION='0.1.2', SONAME='libtest.so.2')
+</example_commands>
+The variable is used, for example, by &t-link-gnulink; linker tool.
+</para>
+</summary>
+</cvar>
+
+<cvar name="STATIC_AND_SHARED_OBJECTS_ARE_THE_SAME">
+ <summary>
+ <para>
+ When this variable is true, static objects and shared objects are assumed to be the same; that is, SCons does not check for linking static objects into a shared library.
+ </para>
+ </summary>
+</cvar>
+
+
+</sconsdoc>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/linkloc.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/linkloc.py
new file mode 100644
index 0000000..c73852b
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/linkloc.py
@@ -0,0 +1,113 @@
+"""SCons.Tool.linkloc
+
+Tool specification for the LinkLoc linker for the Phar Lap ETS embedded
+operating system.
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import os.path
+import re
+
+import SCons.Action
+import SCons.Defaults
+import SCons.Errors
+import SCons.Tool
+import SCons.Util
+
+from SCons.Tool.MSCommon import msvs_exists, merge_default_version
+from SCons.Tool.PharLapCommon import addPharLapPaths
+
+_re_linker_command = re.compile(r'(\s)@\s*([^\s]+)')
+
+def repl_linker_command(m):
+ # Replaces any linker command file directives (e.g. "@foo.lnk") with
+ # the actual contents of the file.
+ try:
+ with open(m.group(2), "r") as f:
+ return m.group(1) + f.read()
+ except IOError:
+ # the linker should return an error if it can't
+ # find the linker command file so we will remain quiet.
+ # However, we will replace the @ with a # so we will not continue
+ # to find it with recursive substitution
+ return m.group(1) + '#' + m.group(2)
+
+class LinklocGenerator(object):
+ def __init__(self, cmdline):
+ self.cmdline = cmdline
+
+ def __call__(self, env, target, source, for_signature):
+ if for_signature:
+ # Expand the contents of any linker command files recursively
+ subs = 1
+ strsub = env.subst(self.cmdline, target=target, source=source)
+ while subs:
+ strsub, subs = _re_linker_command.subn(repl_linker_command, strsub)
+ return strsub
+ else:
+ return "${TEMPFILE('" + self.cmdline + "')}"
+
+def generate(env):
+ """Add Builders and construction variables for ar to an Environment."""
+ SCons.Tool.createSharedLibBuilder(env)
+ SCons.Tool.createProgBuilder(env)
+
+ env['SUBST_CMD_FILE'] = LinklocGenerator
+ env['SHLINK'] = '$LINK'
+ env['SHLINKFLAGS'] = SCons.Util.CLVar('$LINKFLAGS')
+ env['SHLINKCOM'] = '${SUBST_CMD_FILE("$SHLINK $SHLINKFLAGS $_LIBDIRFLAGS $_LIBFLAGS -dll $TARGET $SOURCES")}'
+ env['SHLIBEMITTER']= None
+ env['LDMODULEEMITTER']= None
+ env['LINK'] = "linkloc"
+ env['LINKFLAGS'] = SCons.Util.CLVar('')
+ env['LINKCOM'] = '${SUBST_CMD_FILE("$LINK $LINKFLAGS $_LIBDIRFLAGS $_LIBFLAGS -exe $TARGET $SOURCES")}'
+ env['LIBDIRPREFIX']='-libpath '
+ env['LIBDIRSUFFIX']=''
+ env['LIBLINKPREFIX']='-lib '
+ env['LIBLINKSUFFIX']='$LIBSUFFIX'
+
+ # Set-up ms tools paths for default version
+ merge_default_version(env)
+
+ addPharLapPaths(env)
+
+def exists(env):
+ if msvs_exists():
+ return env.Detect('linkloc')
+ else:
+ return 0
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/linkloc.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/linkloc.xml
new file mode 100644
index 0000000..aa17ae0
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/linkloc.xml
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+__COPYRIGHT__
+
+This file is processed by the bin/SConsDoc.py module.
+See its __doc__ string for a discussion of the format.
+-->
+
+<!DOCTYPE sconsdoc [
+<!ENTITY % scons SYSTEM '../../../../doc/scons.mod'>
+%scons;
+<!ENTITY % builders-mod SYSTEM '../../../../doc/generated/builders.mod'>
+%builders-mod;
+<!ENTITY % functions-mod SYSTEM '../../../../doc/generated/functions.mod'>
+%functions-mod;
+<!ENTITY % tools-mod SYSTEM '../../../../doc/generated/tools.mod'>
+%tools-mod;
+<!ENTITY % variables-mod SYSTEM '../../../../doc/generated/variables.mod'>
+%variables-mod;
+]>
+
+<sconsdoc xmlns="http://www.scons.org/dbxsd/v1.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://www.scons.org/dbxsd/v1.0 http://www.scons.org/dbxsd/v1.0/scons.xsd">
+
+<tool name="linkloc">
+<summary>
+<para>
+Sets construction variables for the
+<application>LinkLoc</application>
+linker for the Phar Lap ETS embedded operating system.
+</para>
+</summary>
+<sets>
+<item><!--SUBST_CMD_FILE--></item>
+<item>SHLINK</item>
+<item>SHLINKFLAGS</item>
+<item>SHLINKCOM</item>
+<item><!--SHLINKEMITTER--></item>
+<item>LINK</item>
+<item>LINKFLAGS</item>
+<item>LINKCOM</item>
+<item>LIBDIRPREFIX</item>
+<item>LIBDIRSUFFIX</item>
+<item>LIBLINKPREFIX</item>
+<item>LIBLINKSUFFIX</item>
+</sets>
+<uses>
+<item>SHLINKCOMSTR</item>
+<item>LINKCOMSTR</item>
+</uses>
+</tool>
+
+</sconsdoc>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/m4.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/m4.py
new file mode 100644
index 0000000..8506784
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/m4.py
@@ -0,0 +1,63 @@
+"""SCons.Tool.m4
+
+Tool-specific initialization for m4.
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import SCons.Action
+import SCons.Builder
+import SCons.Util
+
+def generate(env):
+ """Add Builders and construction variables for m4 to an Environment."""
+ M4Action = SCons.Action.Action('$M4COM', '$M4COMSTR')
+ bld = SCons.Builder.Builder(action = M4Action, src_suffix = '.m4')
+
+ env['BUILDERS']['M4'] = bld
+
+ # .m4 files might include other files, and it would be pretty hard
+ # to write a scanner for it, so let's just cd to the dir of the m4
+ # file and run from there.
+ # The src_suffix setup is like so: file.c.m4 -> file.c,
+ # file.cpp.m4 -> file.cpp etc.
+ env['M4'] = 'm4'
+ env['M4FLAGS'] = SCons.Util.CLVar('-E')
+ env['M4COM'] = 'cd ${SOURCE.rsrcdir} && $M4 $M4FLAGS < ${SOURCE.file} > ${TARGET.abspath}'
+
+def exists(env):
+ return env.Detect('m4')
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/m4.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/m4.xml
new file mode 100644
index 0000000..1957dc9
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/m4.xml
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+__COPYRIGHT__
+
+This file is processed by the bin/SConsDoc.py module.
+See its __doc__ string for a discussion of the format.
+-->
+
+<!DOCTYPE sconsdoc [
+<!ENTITY % scons SYSTEM '../../../../doc/scons.mod'>
+%scons;
+<!ENTITY % builders-mod SYSTEM '../../../../doc/generated/builders.mod'>
+%builders-mod;
+<!ENTITY % functions-mod SYSTEM '../../../../doc/generated/functions.mod'>
+%functions-mod;
+<!ENTITY % tools-mod SYSTEM '../../../../doc/generated/tools.mod'>
+%tools-mod;
+<!ENTITY % variables-mod SYSTEM '../../../../doc/generated/variables.mod'>
+%variables-mod;
+]>
+
+<sconsdoc xmlns="http://www.scons.org/dbxsd/v1.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://www.scons.org/dbxsd/v1.0 http://www.scons.org/dbxsd/v1.0/scons.xsd">
+
+<tool name="m4">
+<summary>
+<para>
+Sets construction variables for the &m4; macro processor.
+</para>
+</summary>
+<sets>
+<item>M4</item>
+<item>M4FLAGS</item>
+<item>M4COM</item>
+</sets>
+<uses>
+<item>M4COMSTR</item>
+</uses>
+</tool>
+
+<builder name="M4">
+<summary>
+<para>
+Builds an output file from an M4 input file.
+This uses a default &cv-link-M4FLAGS; value of
+<option>-E</option>,
+which considers all warnings to be fatal
+and stops on the first warning
+when using the GNU version of m4.
+Example:
+</para>
+
+<example_commands>
+env.M4(target = 'foo.c', source = 'foo.c.m4')
+</example_commands>
+</summary>
+</builder>
+
+<cvar name="M4">
+<summary>
+<para>
+The M4 macro preprocessor.
+</para>
+</summary>
+</cvar>
+
+<cvar name="M4COM">
+<summary>
+<para>
+The command line used to pass files through the M4 macro preprocessor.
+</para>
+</summary>
+</cvar>
+
+<cvar name="M4COMSTR">
+<summary>
+<para>
+The string displayed when
+a file is passed through the M4 macro preprocessor.
+If this is not set, then &cv-link-M4COM; (the command line) is displayed.
+</para>
+</summary>
+</cvar>
+
+<cvar name="M4FLAGS">
+<summary>
+<para>
+General options passed to the M4 macro preprocessor.
+</para>
+</summary>
+</cvar>
+
+</sconsdoc>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/masm.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/masm.py
new file mode 100644
index 0000000..b9d88cd
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/masm.py
@@ -0,0 +1,77 @@
+"""SCons.Tool.masm
+
+Tool-specific initialization for the Microsoft Assembler.
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import SCons.Defaults
+import SCons.Tool
+import SCons.Util
+
+ASSuffixes = ['.s', '.asm', '.ASM']
+ASPPSuffixes = ['.spp', '.SPP', '.sx']
+if SCons.Util.case_sensitive_suffixes('.s', '.S'):
+ ASPPSuffixes.extend(['.S'])
+else:
+ ASSuffixes.extend(['.S'])
+
+def generate(env):
+ """Add Builders and construction variables for masm to an Environment."""
+ static_obj, shared_obj = SCons.Tool.createObjBuilders(env)
+
+ for suffix in ASSuffixes:
+ static_obj.add_action(suffix, SCons.Defaults.ASAction)
+ shared_obj.add_action(suffix, SCons.Defaults.ASAction)
+ static_obj.add_emitter(suffix, SCons.Defaults.StaticObjectEmitter)
+ shared_obj.add_emitter(suffix, SCons.Defaults.SharedObjectEmitter)
+
+ for suffix in ASPPSuffixes:
+ static_obj.add_action(suffix, SCons.Defaults.ASPPAction)
+ shared_obj.add_action(suffix, SCons.Defaults.ASPPAction)
+ static_obj.add_emitter(suffix, SCons.Defaults.StaticObjectEmitter)
+ shared_obj.add_emitter(suffix, SCons.Defaults.SharedObjectEmitter)
+
+ env['AS'] = 'ml'
+ env['ASFLAGS'] = SCons.Util.CLVar('/nologo')
+ env['ASPPFLAGS'] = '$ASFLAGS'
+ env['ASCOM'] = '$AS $ASFLAGS /c /Fo$TARGET $SOURCES'
+ env['ASPPCOM'] = '$CC $ASPPFLAGS $CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS /c /Fo$TARGET $SOURCES'
+ env['STATIC_AND_SHARED_OBJECTS_ARE_THE_SAME'] = 1
+
+def exists(env):
+ return env.Detect('ml')
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/masm.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/masm.xml
new file mode 100644
index 0000000..b3a6a7a
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/masm.xml
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+__COPYRIGHT__
+
+This file is processed by the bin/SConsDoc.py module.
+See its __doc__ string for a discussion of the format.
+-->
+
+<!DOCTYPE sconsdoc [
+<!ENTITY % scons SYSTEM '../../../../doc/scons.mod'>
+%scons;
+<!ENTITY % builders-mod SYSTEM '../../../../doc/generated/builders.mod'>
+%builders-mod;
+<!ENTITY % functions-mod SYSTEM '../../../../doc/generated/functions.mod'>
+%functions-mod;
+<!ENTITY % tools-mod SYSTEM '../../../../doc/generated/tools.mod'>
+%tools-mod;
+<!ENTITY % variables-mod SYSTEM '../../../../doc/generated/variables.mod'>
+%variables-mod;
+]>
+
+<sconsdoc xmlns="http://www.scons.org/dbxsd/v1.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://www.scons.org/dbxsd/v1.0 http://www.scons.org/dbxsd/v1.0/scons.xsd">
+
+<tool name="masm">
+<summary>
+<para>
+Sets construction variables for the Microsoft assembler.
+</para>
+</summary>
+<sets>
+<item>AS</item>
+<item>ASFLAGS</item>
+<item>ASPPFLAGS</item>
+<item>ASCOM</item>
+<item>ASPPCOM</item>
+<item><!--STATIC_AND_SHARED_OBJECTS_ARE_THE_SAME--></item>
+</sets>
+<uses>
+<item>ASCOMSTR</item>
+<item>ASPPCOMSTR</item>
+<item>CPPFLAGS</item>
+<item>_CPPDEFFLAGS</item>
+<item>_CPPINCFLAGS</item>
+</uses>
+</tool>
+
+</sconsdoc>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/midl.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/midl.py
new file mode 100644
index 0000000..ed9ea94
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/midl.py
@@ -0,0 +1,88 @@
+"""SCons.Tool.midl
+
+Tool-specific initialization for midl (Microsoft IDL compiler).
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import SCons.Action
+import SCons.Builder
+import SCons.Defaults
+import SCons.Scanner.IDL
+import SCons.Util
+
+from .MSCommon import msvc_exists
+
+def midl_emitter(target, source, env):
+ """Produces a list of outputs from the MIDL compiler"""
+ base, _ = SCons.Util.splitext(str(target[0]))
+ tlb = target[0]
+ incl = base + '.h'
+ interface = base + '_i.c'
+ targets = [tlb, incl, interface]
+
+ midlcom = env['MIDLCOM']
+
+ if midlcom.find('/proxy') != -1:
+ proxy = base + '_p.c'
+ targets.append(proxy)
+ if midlcom.find('/dlldata') != -1:
+ dlldata = base + '_data.c'
+ targets.append(dlldata)
+
+ return (targets, source)
+
+idl_scanner = SCons.Scanner.IDL.IDLScan()
+
+midl_action = SCons.Action.Action('$MIDLCOM', '$MIDLCOMSTR')
+
+midl_builder = SCons.Builder.Builder(action = midl_action,
+ src_suffix = '.idl',
+ suffix='.tlb',
+ emitter = midl_emitter,
+ source_scanner = idl_scanner)
+
+def generate(env):
+ """Add Builders and construction variables for midl to an Environment."""
+
+ env['MIDL'] = 'MIDL.EXE'
+ env['MIDLFLAGS'] = SCons.Util.CLVar('/nologo')
+ env['MIDLCOM'] = '$MIDL $MIDLFLAGS /tlb ${TARGETS[0]} /h ${TARGETS[1]} /iid ${TARGETS[2]} /proxy ${TARGETS[3]} /dlldata ${TARGETS[4]} $SOURCE 2> NUL'
+ env['BUILDERS']['TypeLibrary'] = midl_builder
+
+def exists(env):
+ return msvc_exists()
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/midl.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/midl.xml
new file mode 100644
index 0000000..efd83cc
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/midl.xml
@@ -0,0 +1,103 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+__COPYRIGHT__
+
+This file is processed by the bin/SConsDoc.py module.
+See its __doc__ string for a discussion of the format.
+-->
+
+<!DOCTYPE sconsdoc [
+<!ENTITY % scons SYSTEM '../../../../doc/scons.mod'>
+%scons;
+<!ENTITY % builders-mod SYSTEM '../../../../doc/generated/builders.mod'>
+%builders-mod;
+<!ENTITY % functions-mod SYSTEM '../../../../doc/generated/functions.mod'>
+%functions-mod;
+<!ENTITY % tools-mod SYSTEM '../../../../doc/generated/tools.mod'>
+%tools-mod;
+<!ENTITY % variables-mod SYSTEM '../../../../doc/generated/variables.mod'>
+%variables-mod;
+]>
+
+<sconsdoc xmlns="http://www.scons.org/dbxsd/v1.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://www.scons.org/dbxsd/v1.0 http://www.scons.org/dbxsd/v1.0/scons.xsd">
+
+<tool name="midl">
+<summary>
+<para>
+Sets construction variables for the Microsoft IDL compiler.
+</para>
+</summary>
+<sets>
+<item>MIDL</item>
+<item>MIDLFLAGS</item>
+<item>MIDLCOM</item>
+</sets>
+<uses>
+<item>MIDLCOMSTR</item>
+</uses>
+</tool>
+
+<builder name="TypeLibrary">
+<summary>
+<para>
+Builds a Windows type library (<filename>.tlb</filename>)
+file from an input IDL file (<filename>.idl</filename>).
+In addition, it will build the associated interface stub and
+proxy source files,
+naming them according to the base name of the <filename>.idl</filename> file.
+For example,
+</para>
+
+<example_commands>
+env.TypeLibrary(source="foo.idl")
+</example_commands>
+
+<para>
+Will create <filename>foo.tlb</filename>,
+<filename>foo.h</filename>,
+<filename>foo_i.c</filename>,
+<filename>foo_p.c</filename>
+and
+<filename>foo_data.c</filename>
+files.
+</para>
+</summary>
+</builder>
+
+<cvar name="MIDL">
+<summary>
+<para>
+The Microsoft IDL compiler.
+</para>
+</summary>
+</cvar>
+
+<cvar name="MIDLCOM">
+<summary>
+<para>
+The command line used to pass files to the Microsoft IDL compiler.
+</para>
+</summary>
+</cvar>
+
+<cvar name="MIDLCOMSTR">
+<summary>
+<para>
+The string displayed when
+the Microsoft IDL copmiler is called.
+If this is not set, then &cv-link-MIDLCOM; (the command line) is displayed.
+</para>
+</summary>
+</cvar>
+
+<cvar name="MIDLFLAGS">
+<summary>
+<para>
+General options passed to the Microsoft IDL compiler.
+</para>
+</summary>
+</cvar>
+
+</sconsdoc>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/mingw.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/mingw.py
new file mode 100644
index 0000000..778db3c
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/mingw.py
@@ -0,0 +1,182 @@
+"""SCons.Tool.gcc
+
+Tool-specific initialization for MinGW (http://www.mingw.org/)
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import os
+import os.path
+
+import SCons.Action
+import SCons.Builder
+import SCons.Defaults
+import SCons.Tool
+import SCons.Util
+
+# This is what we search for to find mingw:
+key_program = 'mingw32-gcc'
+
+def find(env):
+ # First search in the SCons path
+ path=env.WhereIs(key_program)
+ if (path):
+ return path
+ # then the OS path:
+ path=SCons.Util.WhereIs(key_program)
+ if (path):
+ return path
+
+ # If that doesn't work try default location for mingw
+ save_path=env['ENV']['PATH']
+ env.AppendENVPath('PATH',r'c:\MinGW\bin')
+ path =env.WhereIs(key_program)
+ if not path:
+ env['ENV']['PATH']=save_path
+ return path
+
+def shlib_generator(target, source, env, for_signature):
+ cmd = SCons.Util.CLVar(['$SHLINK', '$SHLINKFLAGS'])
+
+ dll = env.FindIxes(target, 'SHLIBPREFIX', 'SHLIBSUFFIX')
+ if dll: cmd.extend(['-o', dll])
+
+ cmd.extend(['$SOURCES', '$_LIBDIRFLAGS', '$_LIBFLAGS'])
+
+ implib = env.FindIxes(target, 'LIBPREFIX', 'LIBSUFFIX')
+ if implib: cmd.append('-Wl,--out-implib,'+implib.get_string(for_signature))
+
+ def_target = env.FindIxes(target, 'WINDOWSDEFPREFIX', 'WINDOWSDEFSUFFIX')
+ insert_def = env.subst("$WINDOWS_INSERT_DEF")
+ if not insert_def in ['', '0', 0] and def_target: \
+ cmd.append('-Wl,--output-def,'+def_target.get_string(for_signature))
+
+ return [cmd]
+
+def shlib_emitter(target, source, env):
+ dll = env.FindIxes(target, 'SHLIBPREFIX', 'SHLIBSUFFIX')
+ no_import_lib = env.get('no_import_lib', 0)
+
+ if not dll:
+ raise SCons.Errors.UserError("A shared library should have exactly one target with the suffix: %s Target(s) are:%s" % \
+ (env.subst("$SHLIBSUFFIX"), ",".join([str(t) for t in target])))
+
+ if not no_import_lib and \
+ not env.FindIxes(target, 'LIBPREFIX', 'LIBSUFFIX'):
+
+ # Create list of target libraries as strings
+ targetStrings=env.ReplaceIxes(dll,
+ 'SHLIBPREFIX', 'SHLIBSUFFIX',
+ 'LIBPREFIX', 'LIBSUFFIX')
+
+ # Now add file nodes to target list
+ target.append(env.fs.File(targetStrings))
+
+ # Append a def file target if there isn't already a def file target
+ # or a def file source or the user has explicitly asked for the target
+ # to be emitted.
+ def_source = env.FindIxes(source, 'WINDOWSDEFPREFIX', 'WINDOWSDEFSUFFIX')
+ def_target = env.FindIxes(target, 'WINDOWSDEFPREFIX', 'WINDOWSDEFSUFFIX')
+ skip_def_insert = env.subst("$WINDOWS_INSERT_DEF") in ['', '0', 0]
+ if not def_source and not def_target and not skip_def_insert:
+ # Create list of target libraries and def files as strings
+ targetStrings=env.ReplaceIxes(dll,
+ 'SHLIBPREFIX', 'SHLIBSUFFIX',
+ 'WINDOWSDEFPREFIX', 'WINDOWSDEFSUFFIX')
+
+ # Now add file nodes to target list
+ target.append(env.fs.File(targetStrings))
+
+ return (target, source)
+
+
+shlib_action = SCons.Action.Action(shlib_generator, generator=1)
+
+res_action = SCons.Action.Action('$RCCOM', '$RCCOMSTR')
+
+res_builder = SCons.Builder.Builder(action=res_action, suffix='.o',
+ source_scanner=SCons.Tool.SourceFileScanner)
+SCons.Tool.SourceFileScanner.add_scanner('.rc', SCons.Defaults.CScan)
+
+def generate(env):
+ mingw = find(env)
+ if mingw:
+ dir = os.path.dirname(mingw)
+ env.PrependENVPath('PATH', dir )
+
+
+ # Most of mingw is the same as gcc and friends...
+ gnu_tools = ['gcc', 'g++', 'gnulink', 'ar', 'gas', 'gfortran', 'm4']
+ for tool in gnu_tools:
+ SCons.Tool.Tool(tool)(env)
+
+ #... but a few things differ:
+ env['CC'] = 'gcc'
+ env['SHCCFLAGS'] = SCons.Util.CLVar('$CCFLAGS')
+ env['CXX'] = 'g++'
+ env['SHCXXFLAGS'] = SCons.Util.CLVar('$CXXFLAGS')
+ env['SHLINKFLAGS'] = SCons.Util.CLVar('$LINKFLAGS -shared')
+ env['SHLINKCOM'] = shlib_action
+ env['LDMODULECOM'] = shlib_action
+ env.Append(SHLIBEMITTER = [shlib_emitter])
+ env.Append(LDMODULEEMITTER = [shlib_emitter])
+ env['AS'] = 'as'
+
+ env['WIN32DEFPREFIX'] = ''
+ env['WIN32DEFSUFFIX'] = '.def'
+ env['WINDOWSDEFPREFIX'] = '${WIN32DEFPREFIX}'
+ env['WINDOWSDEFSUFFIX'] = '${WIN32DEFSUFFIX}'
+
+ env['SHOBJSUFFIX'] = '.o'
+ env['STATIC_AND_SHARED_OBJECTS_ARE_THE_SAME'] = 1
+
+ env['RC'] = 'windres'
+ env['RCFLAGS'] = SCons.Util.CLVar('')
+ env['RCINCFLAGS'] = '$( ${_concat(RCINCPREFIX, CPPPATH, RCINCSUFFIX, __env__, RDirs, TARGET, SOURCE)} $)'
+ env['RCINCPREFIX'] = '--include-dir '
+ env['RCINCSUFFIX'] = ''
+ env['RCCOM'] = '$RC $_CPPDEFFLAGS $RCINCFLAGS ${RCINCPREFIX} ${SOURCE.dir} $RCFLAGS -i $SOURCE -o $TARGET'
+ env['BUILDERS']['RES'] = res_builder
+
+ # Some setting from the platform also have to be overridden:
+ env['OBJSUFFIX'] = '.o'
+ env['LIBPREFIX'] = 'lib'
+ env['LIBSUFFIX'] = '.a'
+ env['PROGSUFFIX'] = '.exe'
+
+def exists(env):
+ return find(env)
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/mingw.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/mingw.xml
new file mode 100644
index 0000000..0ad7e95
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/mingw.xml
@@ -0,0 +1,61 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+__COPYRIGHT__
+
+This file is processed by the bin/SConsDoc.py module.
+See its __doc__ string for a discussion of the format.
+-->
+
+<!DOCTYPE sconsdoc [
+<!ENTITY % scons SYSTEM '../../../../doc/scons.mod'>
+%scons;
+<!ENTITY % builders-mod SYSTEM '../../../../doc/generated/builders.mod'>
+%builders-mod;
+<!ENTITY % functions-mod SYSTEM '../../../../doc/generated/functions.mod'>
+%functions-mod;
+<!ENTITY % tools-mod SYSTEM '../../../../doc/generated/tools.mod'>
+%tools-mod;
+<!ENTITY % variables-mod SYSTEM '../../../../doc/generated/variables.mod'>
+%variables-mod;
+]>
+
+<sconsdoc xmlns="http://www.scons.org/dbxsd/v1.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://www.scons.org/dbxsd/v1.0 http://www.scons.org/dbxsd/v1.0/scons.xsd">
+
+<tool name="mingw">
+<summary>
+<para>
+Sets construction variables for MinGW (Minimal Gnu on Windows).
+</para>
+</summary>
+<sets>
+<item>CC</item>
+<item>SHCCFLAGS</item>
+<item>CXX</item>
+<item>SHCXXFLAGS</item>
+<item>SHLINKFLAGS</item>
+<item>SHLINKCOM</item>
+<item>LDMODULECOM</item>
+<item>AS</item>
+<item>WINDOWSDEFPREFIX</item>
+<item>WINDOWSDEFSUFFIX</item>
+<item>SHOBJSUFFIX</item>
+<item><!--STATIC_AND_SHARED_OBJECTS_ARE_THE_SAME--></item>
+<item>RC</item>
+<item>RCFLAGS</item>
+<item>RCINCFLAGS</item>
+<item>RCINCPREFIX</item>
+<item>RCINCSUFFIX</item>
+<item>RCCOM</item>
+<item>OBJSUFFIX</item>
+<item>LIBPREFIX</item>
+<item>LIBSUFFIX</item>
+</sets>
+<uses>
+<item>SHLINKCOMSTR</item>
+<item>RCCOMSTR</item>
+</uses>
+</tool>
+
+</sconsdoc>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/msgfmt.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/msgfmt.py
new file mode 100644
index 0000000..4fe6afd
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/msgfmt.py
@@ -0,0 +1,108 @@
+""" msgfmt tool """
+
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+from SCons.Builder import BuilderBase
+#############################################################################
+class _MOFileBuilder(BuilderBase):
+ """ The builder class for `MO` files.
+
+ The reason for this builder to exists and its purpose is quite simillar
+ as for `_POFileBuilder`. This time, we extend list of sources, not targets,
+ and call `BuilderBase._execute()` only once (as we assume single-target
+ here).
+ """
+
+ def _execute(self, env, target, source, *args, **kw):
+ # Here we add support for 'LINGUAS_FILE' keyword. Emitter is not suitable
+ # in this case, as it is called too late (after multiple sources
+ # are handled single_source builder.
+ import SCons.Util
+ from SCons.Tool.GettextCommon import _read_linguas_from_files
+ linguas_files = None
+ if 'LINGUAS_FILE' in env and env['LINGUAS_FILE'] is not None:
+ linguas_files = env['LINGUAS_FILE']
+ # This should prevent from endless recursion.
+ env['LINGUAS_FILE'] = None
+ # We read only languages. Suffixes shall be added automatically.
+ linguas = _read_linguas_from_files(env, linguas_files)
+ if SCons.Util.is_List(source):
+ source.extend(linguas)
+ elif source is not None:
+ source = [source] + linguas
+ else:
+ source = linguas
+ result = BuilderBase._execute(self,env,target,source,*args, **kw)
+ if linguas_files is not None:
+ env['LINGUAS_FILE'] = linguas_files
+ return result
+#############################################################################
+
+#############################################################################
+def _create_mo_file_builder(env, **kw):
+ """ Create builder object for `MOFiles` builder """
+ import SCons.Action
+ # FIXME: What factory use for source? Ours or their?
+ kw['action'] = SCons.Action.Action('$MSGFMTCOM','$MSGFMTCOMSTR')
+ kw['suffix'] = '$MOSUFFIX'
+ kw['src_suffix'] = '$POSUFFIX'
+ kw['src_builder'] = '_POUpdateBuilder'
+ kw['single_source'] = True
+ return _MOFileBuilder(**kw)
+#############################################################################
+
+#############################################################################
+def generate(env,**kw):
+ """ Generate `msgfmt` tool """
+ import SCons.Util
+ from SCons.Tool.GettextCommon import _detect_msgfmt
+ try:
+ env['MSGFMT'] = _detect_msgfmt(env)
+ except:
+ env['MSGFMT'] = 'msgfmt'
+ env.SetDefault(
+ MSGFMTFLAGS = [ SCons.Util.CLVar('-c') ],
+ MSGFMTCOM = '$MSGFMT $MSGFMTFLAGS -o $TARGET $SOURCE',
+ MSGFMTCOMSTR = '',
+ MOSUFFIX = ['.mo'],
+ POSUFFIX = ['.po']
+ )
+ env.Append( BUILDERS = { 'MOFiles' : _create_mo_file_builder(env) } )
+#############################################################################
+
+#############################################################################
+def exists(env):
+ """ Check if the tool exists """
+ from SCons.Tool.GettextCommon import _msgfmt_exists
+ try:
+ return _msgfmt_exists(env)
+ except:
+ return False
+#############################################################################
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/msgfmt.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/msgfmt.xml
new file mode 100644
index 0000000..77a1498
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/msgfmt.xml
@@ -0,0 +1,145 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+__COPYRIGHT__
+
+This file is processed by the bin/SConsDoc.py module.
+See its __doc__ string for a discussion of the format.
+-->
+
+<!DOCTYPE sconsdoc [
+<!ENTITY % scons SYSTEM '../../../../doc/scons.mod'>
+%scons;
+<!ENTITY % builders-mod SYSTEM '../../../../doc/generated/builders.mod'>
+%builders-mod;
+<!ENTITY % functions-mod SYSTEM '../../../../doc/generated/functions.mod'>
+%functions-mod;
+<!ENTITY % tools-mod SYSTEM '../../../../doc/generated/tools.mod'>
+%tools-mod;
+<!ENTITY % variables-mod SYSTEM '../../../../doc/generated/variables.mod'>
+%variables-mod;
+]>
+
+<sconsdoc xmlns="http://www.scons.org/dbxsd/v1.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://www.scons.org/dbxsd/v1.0 http://www.scons.org/dbxsd/v1.0/scons.xsd">
+
+<tool name="msgfmt">
+<summary>
+<para>
+This scons tool is a part of scons &t-link-gettext; toolset. It provides scons
+interface to <command>msgfmt(1)</command> command, which generates binary
+message catalog (<literal>MO</literal>) from a textual translation description
+(<literal>PO</literal>).
+</para>
+</summary>
+<sets>
+<item>MOSUFFIX</item>
+<item>MSGFMT</item>
+<item>MSGFMTCOM</item>
+<item>MSGFMTCOMSTR</item>
+<item>MSGFMTFLAGS</item>
+<item>POSUFFIX</item>
+</sets>
+<uses>
+<item>LINGUAS_FILE</item>
+</uses>
+</tool>
+
+<builder name="MOFiles">
+<summary>
+<para>
+This builder belongs to &t-link-msgfmt; tool. The builder compiles
+<literal>PO</literal> files to <literal>MO</literal> files.
+</para>
+
+<para>
+<emphasis>Example 1</emphasis>.
+Create <filename>pl.mo</filename> and <filename>en.mo</filename> by compiling
+<filename>pl.po</filename> and <filename>en.po</filename>:
+</para>
+<example_commands>
+ # ...
+ env.MOFiles(['pl', 'en'])
+</example_commands>
+
+<para>
+<emphasis>Example 2</emphasis>.
+Compile files for languages defined in <filename>LINGUAS</filename> file:
+</para>
+<example_commands>
+ # ...
+ env.MOFiles(LINGUAS_FILE = 1)
+</example_commands>
+
+<para>
+<emphasis>Example 3</emphasis>.
+Create <filename>pl.mo</filename> and <filename>en.mo</filename> by compiling
+<filename>pl.po</filename> and <filename>en.po</filename> plus files for
+languages defined in <filename>LINGUAS</filename> file:
+</para>
+<example_commands>
+ # ...
+ env.MOFiles(['pl', 'en'], LINGUAS_FILE = 1)
+</example_commands>
+
+<para>
+<emphasis>Example 4</emphasis>.
+Compile files for languages defined in <filename>LINGUAS</filename> file
+(another version):
+</para>
+<example_commands>
+ # ...
+ env['LINGUAS_FILE'] = 1
+ env.MOFiles()
+</example_commands>
+</summary>
+</builder>
+<!-- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -->
+<cvar name="MOSUFFIX">
+<summary>
+<para>
+Suffix used for <literal>MO</literal> files (default: <literal>'.mo'</literal>).
+See &t-link-msgfmt; tool and &b-link-MOFiles; builder.
+</para>
+</summary>
+</cvar>
+<!-- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -->
+<cvar name="MSGFMT">
+<summary>
+<para>
+Absolute path to <command>msgfmt(1)</command> binary, found by
+<function>Detect()</function>.
+See &t-link-msgfmt; tool and &b-link-MOFiles; builder.
+</para>
+</summary>
+</cvar>
+<!-- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -->
+<cvar name="MSGFMTCOM">
+<summary>
+<para>
+Complete command line to run <command>msgfmt(1)</command> program.
+See &t-link-msgfmt; tool and &b-link-MOFiles; builder.
+</para>
+</summary>
+</cvar>
+<!-- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -->
+<cvar name="MSGFMTCOMSTR">
+<summary>
+<para>
+String to display when <command>msgfmt(1)</command> is invoked
+(default: <literal>''</literal>, which means ``print &cv-link-MSGFMTCOM;'').
+See &t-link-msgfmt; tool and &b-link-MOFiles; builder.
+</para>
+</summary>
+</cvar>
+<!-- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -->
+<cvar name="MSGFMTFLAGS">
+<summary>
+<para>
+Additional flags to <command>msgfmt(1)</command>.
+See &t-link-msgfmt; tool and &b-link-MOFiles; builder.
+</para>
+</summary>
+</cvar>
+
+</sconsdoc>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/msginit.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/msginit.py
new file mode 100644
index 0000000..39f460d
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/msginit.py
@@ -0,0 +1,120 @@
+""" msginit tool
+
+Tool specific initialization of msginit tool.
+"""
+
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import SCons.Warnings
+import SCons.Builder
+import re
+
+#############################################################################
+def _optional_no_translator_flag(env):
+ """ Return '--no-translator' flag if we run *msginit(1)* in non-interactive
+ mode."""
+ import SCons.Util
+ if 'POAUTOINIT' in env:
+ autoinit = env['POAUTOINIT']
+ else:
+ autoinit = False
+ if autoinit:
+ return [SCons.Util.CLVar('--no-translator')]
+ else:
+ return [SCons.Util.CLVar('')]
+#############################################################################
+
+#############################################################################
+def _POInitBuilder(env, **kw):
+ """ Create builder object for `POInit` builder. """
+ import SCons.Action
+ from SCons.Tool.GettextCommon import _init_po_files, _POFileBuilder
+ action = SCons.Action.Action(_init_po_files, None)
+ return _POFileBuilder(env, action=action, target_alias='$POCREATE_ALIAS')
+#############################################################################
+
+#############################################################################
+from SCons.Environment import _null
+#############################################################################
+def _POInitBuilderWrapper(env, target=None, source=_null, **kw):
+ """ Wrapper for _POFileBuilder. We use it to make user's life easier.
+
+ This wrapper checks for `$POTDOMAIN` construction variable (or override in
+ `**kw`) and treats it appropriatelly.
+ """
+ if source is _null:
+ if 'POTDOMAIN' in kw:
+ domain = kw['POTDOMAIN']
+ elif 'POTDOMAIN' in env:
+ domain = env['POTDOMAIN']
+ else:
+ domain = 'messages'
+ source = [ domain ] # NOTE: Suffix shall be appended automatically
+ return env._POInitBuilder(target, source, **kw)
+#############################################################################
+
+#############################################################################
+def generate(env,**kw):
+ """ Generate the `msginit` tool """
+ import SCons.Util
+ from SCons.Tool.GettextCommon import _detect_msginit
+ try:
+ env['MSGINIT'] = _detect_msginit(env)
+ except:
+ env['MSGINIT'] = 'msginit'
+ msginitcom = '$MSGINIT ${_MSGNoTranslator(__env__)} -l ${_MSGINITLOCALE}' \
+ + ' $MSGINITFLAGS -i $SOURCE -o $TARGET'
+ # NOTE: We set POTSUFFIX here, in case the 'xgettext' is not loaded
+ # (sometimes we really don't need it)
+ env.SetDefault(
+ POSUFFIX = ['.po'],
+ POTSUFFIX = ['.pot'],
+ _MSGINITLOCALE = '${TARGET.filebase}',
+ _MSGNoTranslator = _optional_no_translator_flag,
+ MSGINITCOM = msginitcom,
+ MSGINITCOMSTR = '',
+ MSGINITFLAGS = [ ],
+ POAUTOINIT = False,
+ POCREATE_ALIAS = 'po-create'
+ )
+ env.Append( BUILDERS = { '_POInitBuilder' : _POInitBuilder(env) } )
+ env.AddMethod(_POInitBuilderWrapper, 'POInit')
+ env.AlwaysBuild(env.Alias('$POCREATE_ALIAS'))
+#############################################################################
+
+#############################################################################
+def exists(env):
+ """ Check if the tool exists """
+ from SCons.Tool.GettextCommon import _msginit_exists
+ try:
+ return _msginit_exists(env)
+ except:
+ return False
+#############################################################################
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/msginit.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/msginit.xml
new file mode 100644
index 0000000..0099b29
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/msginit.xml
@@ -0,0 +1,225 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+__COPYRIGHT__
+
+This file is processed by the bin/SConsDoc.py module.
+See its __doc__ string for a discussion of the format.
+-->
+
+<!DOCTYPE sconsdoc [
+<!ENTITY % scons SYSTEM '../../../../doc/scons.mod'>
+%scons;
+<!ENTITY % builders-mod SYSTEM '../../../../doc/generated/builders.mod'>
+%builders-mod;
+<!ENTITY % functions-mod SYSTEM '../../../../doc/generated/functions.mod'>
+%functions-mod;
+<!ENTITY % tools-mod SYSTEM '../../../../doc/generated/tools.mod'>
+%tools-mod;
+<!ENTITY % variables-mod SYSTEM '../../../../doc/generated/variables.mod'>
+%variables-mod;
+]>
+
+<sconsdoc xmlns="http://www.scons.org/dbxsd/v1.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://www.scons.org/dbxsd/v1.0 http://www.scons.org/dbxsd/v1.0/scons.xsd">
+
+<tool name="msginit">
+<summary>
+<para>
+This scons tool is a part of scons &t-link-gettext; toolset. It provides
+scons interface to <command>msginit(1)</command> program, which creates new
+<literal>PO</literal> file, initializing the meta information with values from
+user's environment (or options).
+</para>
+</summary>
+<sets>
+<item>MSGINIT</item>
+<item>MSGINITCOM</item>
+<item>MSGINITCOMSTR</item>
+<item>MSGINITFLAGS</item>
+<item>POAUTOINIT</item>
+<item>POCREATE_ALIAS</item>
+<item>POSUFFIX</item>
+<item>POTSUFFIX</item>
+<item>_MSGINITLOCALE</item>
+</sets>
+<uses>
+<item>POTDOMAIN</item>
+<item>LINGUAS_FILE</item>
+<item>POAUTOINIT</item>
+</uses>
+</tool>
+
+<builder name="POInit">
+<summary>
+<para>
+This builder belongs to &t-link-msginit; tool. The builder initializes missing
+<literal>PO</literal> file(s) if &cv-link-POAUTOINIT; is set. If
+&cv-link-POAUTOINIT; is not set (default), &b-POInit; prints instruction for
+user (that is supposed to be a translator), telling how the
+<literal>PO</literal> file should be initialized. In normal projects
+<emphasis>you should not use &b-POInit; and use &b-link-POUpdate;
+instead</emphasis>. &b-link-POUpdate; chooses intelligently between
+<command>msgmerge(1)</command> and <command>msginit(1)</command>. &b-POInit;
+always uses <command>msginit(1)</command> and should be regarded as builder for
+special purposes or for temporary use (e.g. for quick, one time initialization
+of a bunch of <literal>PO</literal> files) or for tests.
+</para>
+
+<para>
+Target nodes defined through &b-POInit; are not built by default (they're
+<literal>Ignore</literal>d from <literal>'.'</literal> node) but are added to
+special <literal>Alias</literal> (<literal>'po-create'</literal> by default).
+The alias name may be changed through the &cv-link-POCREATE_ALIAS;
+construction variable. All <literal>PO</literal> files defined through
+&b-POInit; may be easily initialized by <command>scons po-create</command>.
+</para>
+
+<para>
+<emphasis>Example 1</emphasis>.
+Initialize <filename>en.po</filename> and <filename>pl.po</filename> from
+<filename>messages.pot</filename>:
+</para>
+<example_commands>
+ # ...
+ env.POInit(['en', 'pl']) # messages.pot --&gt; [en.po, pl.po]
+</example_commands>
+
+<para>
+<emphasis>Example 2</emphasis>.
+Initialize <filename>en.po</filename> and <filename>pl.po</filename> from
+<filename>foo.pot</filename>:
+</para>
+<example_commands>
+ # ...
+ env.POInit(['en', 'pl'], ['foo']) # foo.pot --&gt; [en.po, pl.po]
+</example_commands>
+
+<para>
+<emphasis>Example 3</emphasis>.
+Initialize <filename>en.po</filename> and <filename>pl.po</filename> from
+<filename>foo.pot</filename> but using &cv-link-POTDOMAIN; construction
+variable:
+</para>
+<example_commands>
+ # ...
+ env.POInit(['en', 'pl'], POTDOMAIN='foo') # foo.pot --&gt; [en.po, pl.po]
+</example_commands>
+
+<para>
+<emphasis>Example 4</emphasis>.
+Initialize <literal>PO</literal> files for languages defined in
+<filename>LINGUAS</filename> file. The files will be initialized from template
+<filename>messages.pot</filename>:
+</para>
+<example_commands>
+ # ...
+ env.POInit(LINGUAS_FILE = 1) # needs 'LINGUAS' file
+</example_commands>
+
+<para>
+<emphasis>Example 5</emphasis>.
+Initialize <filename>en.po</filename> and <filename>pl.pl</filename>
+<literal>PO</literal> files plus files for languages defined in
+<filename>LINGUAS</filename> file. The files will be initialized from template
+<filename>messages.pot</filename>:
+</para>
+<example_commands>
+ # ...
+ env.POInit(['en', 'pl'], LINGUAS_FILE = 1)
+</example_commands>
+
+<para>
+<emphasis>Example 6</emphasis>.
+You may preconfigure your environment first, and then initialize
+<literal>PO</literal> files:
+</para>
+<example_commands>
+ # ...
+ env['POAUTOINIT'] = 1
+ env['LINGUAS_FILE'] = 1
+ env['POTDOMAIN'] = 'foo'
+ env.POInit()
+</example_commands>
+<para>
+which has same efect as:
+</para>
+<example_commands>
+ # ...
+ env.POInit(POAUTOINIT = 1, LINGUAS_FILE = 1, POTDOMAIN = 'foo')
+</example_commands>
+</summary>
+</builder>
+
+<!-- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -->
+<cvar name="POCREATE_ALIAS">
+<summary>
+<para>
+Common alias for all <literal>PO</literal> files created with &b-POInit;
+builder (default: <literal>'po-create'</literal>).
+See &t-link-msginit; tool and &b-link-POInit; builder.
+</para>
+</summary>
+</cvar>
+<!-- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -->
+<cvar name="POSUFFIX">
+<summary>
+<para>
+Suffix used for <literal>PO</literal> files (default: <literal>'.po'</literal>)
+See &t-link-msginit; tool and &b-link-POInit; builder.
+</para>
+</summary>
+</cvar>
+<!-- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -->
+<cvar name="MSGINIT">
+<summary>
+<para>
+Path to <command>msginit(1)</command> program (found via
+<literal>Detect()</literal>).
+See &t-link-msginit; tool and &b-link-POInit; builder.
+</para>
+</summary>
+</cvar>
+<!-- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -->
+<cvar name="MSGINITCOM">
+<summary>
+<para>
+Complete command line to run <command>msginit(1)</command> program.
+See &t-link-msginit; tool and &b-link-POInit; builder.
+</para>
+</summary>
+</cvar>
+<!-- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -->
+<cvar name="MSGINITCOMSTR">
+<summary>
+<para>
+String to display when <command>msginit(1)</command> is invoked
+(default: <literal>''</literal>, which means ``print &cv-link-MSGINITCOM;'').
+See &t-link-msginit; tool and &b-link-POInit; builder.
+</para>
+</summary>
+</cvar>
+<!-- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -->
+<cvar name="MSGINITFLAGS">
+<summary>
+<para>
+List of additional flags to <command>msginit(1)</command> (default:
+<literal>[]</literal>).
+See &t-link-msginit; tool and &b-link-POInit; builder.
+</para>
+</summary>
+</cvar>
+<!-- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -->
+<cvar name="_MSGINITLOCALE">
+<summary>
+<para>
+Internal ``macro''. Computes locale (language) name based on target filename
+(default: <literal>'${TARGET.filebase}' </literal>).
+</para>
+<para>
+See &t-link-msginit; tool and &b-link-POInit; builder.
+</para>
+</summary>
+</cvar>
+
+</sconsdoc>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/msgmerge.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/msgmerge.py
new file mode 100644
index 0000000..11d7b48
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/msgmerge.py
@@ -0,0 +1,104 @@
+""" msgmerget tool
+
+Tool specific initialization for `msgmerge` tool.
+"""
+
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+#############################################################################
+def _update_or_init_po_files(target, source, env):
+ """ Action function for `POUpdate` builder """
+ import SCons.Action
+ from SCons.Tool.GettextCommon import _init_po_files
+ for tgt in target:
+ if tgt.rexists():
+ action = SCons.Action.Action('$MSGMERGECOM', '$MSGMERGECOMSTR')
+ else:
+ action = _init_po_files
+ status = action([tgt], source, env)
+ if status : return status
+ return 0
+#############################################################################
+
+#############################################################################
+def _POUpdateBuilder(env, **kw):
+ """ Create an object of `POUpdate` builder """
+ import SCons.Action
+ from SCons.Tool.GettextCommon import _POFileBuilder
+ action = SCons.Action.Action(_update_or_init_po_files, None)
+ return _POFileBuilder(env, action=action, target_alias='$POUPDATE_ALIAS')
+#############################################################################
+
+#############################################################################
+from SCons.Environment import _null
+#############################################################################
+def _POUpdateBuilderWrapper(env, target=None, source=_null, **kw):
+ """ Wrapper for `POUpdate` builder - make user's life easier """
+ if source is _null:
+ if 'POTDOMAIN' in kw:
+ domain = kw['POTDOMAIN']
+ elif 'POTDOMAIN' in env and env['POTDOMAIN']:
+ domain = env['POTDOMAIN']
+ else:
+ domain = 'messages'
+ source = [ domain ] # NOTE: Suffix shall be appended automatically
+ return env._POUpdateBuilder(target, source, **kw)
+#############################################################################
+
+#############################################################################
+def generate(env,**kw):
+ """ Generate the `xgettext` tool """
+ from SCons.Tool.GettextCommon import _detect_msgmerge
+ try:
+ env['MSGMERGE'] = _detect_msgmerge(env)
+ except:
+ env['MSGMERGE'] = 'msgmerge'
+ env.SetDefault(
+ POTSUFFIX = ['.pot'],
+ POSUFFIX = ['.po'],
+ MSGMERGECOM = '$MSGMERGE $MSGMERGEFLAGS --update $TARGET $SOURCE',
+ MSGMERGECOMSTR = '',
+ MSGMERGEFLAGS = [ ],
+ POUPDATE_ALIAS = 'po-update'
+ )
+ env.Append(BUILDERS = { '_POUpdateBuilder':_POUpdateBuilder(env) })
+ env.AddMethod(_POUpdateBuilderWrapper, 'POUpdate')
+ env.AlwaysBuild(env.Alias('$POUPDATE_ALIAS'))
+#############################################################################
+
+#############################################################################
+def exists(env):
+ """ Check if the tool exists """
+ from SCons.Tool.GettextCommon import _msgmerge_exists
+ try:
+ return _msgmerge_exists(env)
+ except:
+ return False
+#############################################################################
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/msgmerge.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/msgmerge.xml
new file mode 100644
index 0000000..139b21c
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/msgmerge.xml
@@ -0,0 +1,211 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+__COPYRIGHT__
+
+This file is processed by the bin/SConsDoc.py module.
+See its __doc__ string for a discussion of the format.
+-->
+
+<!DOCTYPE sconsdoc [
+<!ENTITY % scons SYSTEM '../../../../doc/scons.mod'>
+%scons;
+<!ENTITY % builders-mod SYSTEM '../../../../doc/generated/builders.mod'>
+%builders-mod;
+<!ENTITY % functions-mod SYSTEM '../../../../doc/generated/functions.mod'>
+%functions-mod;
+<!ENTITY % tools-mod SYSTEM '../../../../doc/generated/tools.mod'>
+%tools-mod;
+<!ENTITY % variables-mod SYSTEM '../../../../doc/generated/variables.mod'>
+%variables-mod;
+]>
+
+<sconsdoc xmlns="http://www.scons.org/dbxsd/v1.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://www.scons.org/dbxsd/v1.0 http://www.scons.org/dbxsd/v1.0/scons.xsd">
+
+<tool name="msgmerge">
+<summary>
+<para>
+This scons tool is a part of scons &t-link-gettext; toolset. It provides
+scons interface to <command>msgmerge(1)</command> command, which merges two
+Uniform style <filename>.po</filename> files together.
+</para>
+</summary>
+<sets>
+<item>MSGMERGE</item>
+<item>MSGMERGECOM </item>
+<item>MSGMERGECOMSTR</item>
+<item>MSGMERGEFLAGS</item>
+<item>POSUFFIX </item>
+<item>POTSUFFIX</item>
+<item>POUPDATE_ALIAS</item>
+</sets>
+<uses>
+<item>POTDOMAIN</item>
+<item>LINGUAS_FILE</item>
+<item>POAUTOINIT</item>
+</uses>
+</tool>
+
+<builder name="POUpdate">
+<summary>
+<para>
+The builder belongs to &t-link-msgmerge; tool. The builder updates
+<literal>PO</literal> files with <command>msgmerge(1)</command>, or initializes
+missing <literal>PO</literal> files as described in documentation of
+&t-link-msginit; tool and &b-link-POInit; builder (see also
+&cv-link-POAUTOINIT;). Note, that &b-POUpdate; <emphasis>does not add its
+targets to <literal>po-create</literal> alias</emphasis> as &b-link-POInit;
+does.
+</para>
+
+<para>
+Target nodes defined through &b-POUpdate; are not built by default
+(they're <literal>Ignore</literal>d from <literal>'.'</literal> node). Instead,
+they are added automatically to special <literal>Alias</literal>
+(<literal>'po-update'</literal> by default). The alias name may be changed
+through the &cv-link-POUPDATE_ALIAS; construction variable. You can easily
+update <literal>PO</literal> files in your project by <command>scons
+po-update</command>.
+</para>
+
+<para>
+<emphasis>Example 1.</emphasis>
+Update <filename>en.po</filename> and <filename>pl.po</filename> from
+<filename>messages.pot</filename> template (see also &cv-link-POTDOMAIN;),
+assuming that the later one exists or there is rule to build it (see
+&b-link-POTUpdate;):
+</para>
+<example_commands>
+ # ...
+ env.POUpdate(['en','pl']) # messages.pot --&gt; [en.po, pl.po]
+</example_commands>
+
+<para>
+<emphasis>Example 2.</emphasis>
+Update <filename>en.po</filename> and <filename>pl.po</filename> from
+<filename>foo.pot</filename> template:
+</para>
+<example_commands>
+ # ...
+ env.POUpdate(['en', 'pl'], ['foo']) # foo.pot --&gt; [en.po, pl.pl]
+</example_commands>
+
+<para>
+<emphasis>Example 3.</emphasis>
+Update <filename>en.po</filename> and <filename>pl.po</filename> from
+<filename>foo.pot</filename> (another version):
+</para>
+<example_commands>
+ # ...
+ env.POUpdate(['en', 'pl'], POTDOMAIN='foo') # foo.pot -- &gt; [en.po, pl.pl]
+</example_commands>
+
+<para>
+<emphasis>Example 4.</emphasis>
+Update files for languages defined in <filename>LINGUAS</filename> file. The
+files are updated from <filename>messages.pot</filename> template:
+</para>
+<example_commands>
+ # ...
+ env.POUpdate(LINGUAS_FILE = 1) # needs 'LINGUAS' file
+</example_commands>
+
+<para>
+<emphasis>Example 5.</emphasis>
+Same as above, but update from <filename>foo.pot</filename> template:
+</para>
+<example_commands>
+ # ...
+ env.POUpdate(LINGUAS_FILE = 1, source = ['foo'])
+</example_commands>
+
+<para>
+<emphasis>Example 6.</emphasis>
+Update <filename>en.po</filename> and <filename>pl.po</filename> plus files for
+languages defined in <filename>LINGUAS</filename> file. The files are updated
+from <filename>messages.pot</filename> template:
+</para>
+<example_commands>
+ # produce 'en.po', 'pl.po' + files defined in 'LINGUAS':
+ env.POUpdate(['en', 'pl' ], LINGUAS_FILE = 1)
+</example_commands>
+
+<para>
+<emphasis>Example 7.</emphasis>
+Use &cv-link-POAUTOINIT; to automatically initialize <literal>PO</literal> file
+if it doesn't exist:
+</para>
+<example_commands>
+ # ...
+ env.POUpdate(LINGUAS_FILE = 1, POAUTOINIT = 1)
+</example_commands>
+
+<para>
+<emphasis>Example 8.</emphasis>
+Update <literal>PO</literal> files for languages defined in
+<filename>LINGUAS</filename> file. The files are updated from
+<filename>foo.pot</filename> template. All necessary settings are
+pre-configured via environment.
+</para>
+<example_commands>
+ # ...
+ env['POAUTOINIT'] = 1
+ env['LINGUAS_FILE'] = 1
+ env['POTDOMAIN'] = 'foo'
+ env.POUpdate()
+</example_commands>
+
+</summary>
+</builder>
+
+<!-- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -->
+<cvar name="POUPDATE_ALIAS">
+<summary>
+<para>
+Common alias for all <literal>PO</literal> files being defined with
+&b-link-POUpdate; builder (default: <literal>'po-update'</literal>).
+See &t-link-msgmerge; tool and &b-link-POUpdate; builder.
+</para>
+</summary>
+</cvar>
+<!-- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -->
+<cvar name="MSGMERGE">
+<summary>
+<para>
+Absolute path to <command>msgmerge(1)</command> binary as found by
+<function>Detect()</function>.
+See &t-link-msgmerge; tool and &b-link-POUpdate; builder.
+</para>
+</summary>
+</cvar>
+<!-- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -->
+<cvar name="MSGMERGECOM">
+<summary>
+<para>
+Complete command line to run <command>msgmerge(1)</command> command.
+See &t-link-msgmerge; tool and &b-link-POUpdate; builder.
+</para>
+</summary>
+</cvar>
+<!-- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -->
+<cvar name="MSGMERGECOMSTR">
+<summary>
+<para>
+String to be displayed when <command>msgmerge(1)</command> is invoked
+(default: <literal>''</literal>, which means ``print &cv-link-MSGMERGECOM;'').
+See &t-link-msgmerge; tool and &b-link-POUpdate; builder.
+</para>
+</summary>
+</cvar>
+<!-- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -->
+<cvar name="MSGMERGEFLAGS">
+<summary>
+<para>
+Additional flags to <command>msgmerge(1)</command> command.
+See &t-link-msgmerge; tool and &b-link-POUpdate; builder.
+</para>
+</summary>
+</cvar>
+
+</sconsdoc>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/mslib.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/mslib.py
new file mode 100644
index 0000000..c5a7a32
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/mslib.py
@@ -0,0 +1,64 @@
+"""SCons.Tool.mslib
+
+Tool-specific initialization for lib (MicroSoft library archiver).
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import SCons.Defaults
+import SCons.Tool
+import SCons.Tool.msvs
+import SCons.Tool.msvc
+import SCons.Util
+
+from .MSCommon import msvc_exists, msvc_setup_env_once
+
+def generate(env):
+ """Add Builders and construction variables for lib to an Environment."""
+ SCons.Tool.createStaticLibBuilder(env)
+
+ # Set-up ms tools paths
+ msvc_setup_env_once(env)
+
+ env['AR'] = 'lib'
+ env['ARFLAGS'] = SCons.Util.CLVar('/nologo')
+ env['ARCOM'] = "${TEMPFILE('$AR $ARFLAGS /OUT:$TARGET $SOURCES','$ARCOMSTR')}"
+ env['LIBPREFIX'] = ''
+ env['LIBSUFFIX'] = '.lib'
+
+def exists(env):
+ return msvc_exists()
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/mslib.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/mslib.xml
new file mode 100644
index 0000000..d65bf48
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/mslib.xml
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+__COPYRIGHT__
+
+This file is processed by the bin/SConsDoc.py module.
+See its __doc__ string for a discussion of the format.
+-->
+
+<!DOCTYPE sconsdoc [
+<!ENTITY % scons SYSTEM '../../../../doc/scons.mod'>
+%scons;
+<!ENTITY % builders-mod SYSTEM '../../../../doc/generated/builders.mod'>
+%builders-mod;
+<!ENTITY % functions-mod SYSTEM '../../../../doc/generated/functions.mod'>
+%functions-mod;
+<!ENTITY % tools-mod SYSTEM '../../../../doc/generated/tools.mod'>
+%tools-mod;
+<!ENTITY % variables-mod SYSTEM '../../../../doc/generated/variables.mod'>
+%variables-mod;
+]>
+
+<sconsdoc xmlns="http://www.scons.org/dbxsd/v1.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://www.scons.org/dbxsd/v1.0 http://www.scons.org/dbxsd/v1.0/scons.xsd">
+
+<tool name="mslib">
+<summary>
+<para>
+Sets construction variables for the Microsoft
+<application>mslib</application>
+library archiver.
+</para>
+</summary>
+<sets>
+<item>AR</item>
+<item>ARFLAGS</item>
+<item>ARCOM</item>
+<item>LIBPREFIX</item>
+<item>LIBSUFFIX</item>
+</sets>
+<uses>
+<item>ARCOMSTR</item>
+</uses>
+</tool>
+
+</sconsdoc>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/mslink.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/mslink.py
new file mode 100644
index 0000000..55cf33f
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/mslink.py
@@ -0,0 +1,337 @@
+"""SCons.Tool.mslink
+
+Tool-specific initialization for the Microsoft linker.
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+from __future__ import print_function
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import os.path
+
+import SCons.Action
+import SCons.Defaults
+import SCons.Errors
+import SCons.Platform.win32
+import SCons.Tool
+import SCons.Tool.msvc
+import SCons.Tool.msvs
+import SCons.Util
+
+from .MSCommon import msvc_setup_env_once, msvc_exists
+
+def pdbGenerator(env, target, source, for_signature):
+ try:
+ return ['/PDB:%s' % target[0].attributes.pdb, '/DEBUG']
+ except (AttributeError, IndexError):
+ return None
+
+def _dllTargets(target, source, env, for_signature, paramtp):
+ listCmd = []
+ dll = env.FindIxes(target, '%sPREFIX' % paramtp, '%sSUFFIX' % paramtp)
+ if dll: listCmd.append("/out:%s"%dll.get_string(for_signature))
+
+ implib = env.FindIxes(target, 'LIBPREFIX', 'LIBSUFFIX')
+ if implib: listCmd.append("/implib:%s"%implib.get_string(for_signature))
+
+ return listCmd
+
+def _dllSources(target, source, env, for_signature, paramtp):
+ listCmd = []
+
+ deffile = env.FindIxes(source, "WINDOWSDEFPREFIX", "WINDOWSDEFSUFFIX")
+ for src in source:
+ # Check explicitly for a non-None deffile so that the __cmp__
+ # method of the base SCons.Util.Proxy class used for some Node
+ # proxies doesn't try to use a non-existent __dict__ attribute.
+ if deffile and src == deffile:
+ # Treat this source as a .def file.
+ listCmd.append("/def:%s" % src.get_string(for_signature))
+ else:
+ # Just treat it as a generic source file.
+ listCmd.append(src)
+ return listCmd
+
+def windowsShlinkTargets(target, source, env, for_signature):
+ return _dllTargets(target, source, env, for_signature, 'SHLIB')
+
+def windowsShlinkSources(target, source, env, for_signature):
+ return _dllSources(target, source, env, for_signature, 'SHLIB')
+
+def _windowsLdmodTargets(target, source, env, for_signature):
+ """Get targets for loadable modules."""
+ return _dllTargets(target, source, env, for_signature, 'LDMODULE')
+
+def _windowsLdmodSources(target, source, env, for_signature):
+ """Get sources for loadable modules."""
+ return _dllSources(target, source, env, for_signature, 'LDMODULE')
+
+def _dllEmitter(target, source, env, paramtp):
+ """Common implementation of dll emitter."""
+ SCons.Tool.msvc.validate_vars(env)
+
+ extratargets = []
+ extrasources = []
+
+ dll = env.FindIxes(target, '%sPREFIX' % paramtp, '%sSUFFIX' % paramtp)
+ no_import_lib = env.get('no_import_lib', 0)
+
+ if not dll:
+ raise SCons.Errors.UserError('A shared library should have exactly one target with the suffix: %s' % env.subst('$%sSUFFIX' % paramtp))
+
+ insert_def = env.subst("$WINDOWS_INSERT_DEF")
+ if not insert_def in ['', '0', 0] and \
+ not env.FindIxes(source, "WINDOWSDEFPREFIX", "WINDOWSDEFSUFFIX"):
+
+ # append a def file to the list of sources
+ extrasources.append(
+ env.ReplaceIxes(dll,
+ '%sPREFIX' % paramtp, '%sSUFFIX' % paramtp,
+ "WINDOWSDEFPREFIX", "WINDOWSDEFSUFFIX"))
+
+ version_num, suite = SCons.Tool.msvs.msvs_parse_version(env.get('MSVS_VERSION', '6.0'))
+ if version_num >= 8.0 and \
+ (env.get('WINDOWS_INSERT_MANIFEST', 0) or env.get('WINDOWS_EMBED_MANIFEST', 0)):
+ # MSVC 8 and above automatically generate .manifest files that must be installed
+ extratargets.append(
+ env.ReplaceIxes(dll,
+ '%sPREFIX' % paramtp, '%sSUFFIX' % paramtp,
+ "WINDOWSSHLIBMANIFESTPREFIX", "WINDOWSSHLIBMANIFESTSUFFIX"))
+
+ if 'PDB' in env and env['PDB']:
+ pdb = env.arg2nodes('$PDB', target=target, source=source)[0]
+ extratargets.append(pdb)
+ target[0].attributes.pdb = pdb
+
+ if version_num >= 11.0 and env.get('PCH', 0):
+ # MSVC 11 and above need the PCH object file to be added to the link line,
+ # otherwise you get link error LNK2011.
+ pchobj = SCons.Util.splitext(str(env['PCH']))[0] + '.obj'
+ # print "prog_emitter, version %s, appending pchobj %s"%(version_num, pchobj)
+ if pchobj not in extrasources:
+ extrasources.append(pchobj)
+
+ if not no_import_lib and \
+ not env.FindIxes(target, "LIBPREFIX", "LIBSUFFIX"):
+ # Append an import library to the list of targets.
+ extratargets.append(
+ env.ReplaceIxes(dll,
+ '%sPREFIX' % paramtp, '%sSUFFIX' % paramtp,
+ "LIBPREFIX", "LIBSUFFIX"))
+ # and .exp file is created if there are exports from a DLL
+ extratargets.append(
+ env.ReplaceIxes(dll,
+ '%sPREFIX' % paramtp, '%sSUFFIX' % paramtp,
+ "WINDOWSEXPPREFIX", "WINDOWSEXPSUFFIX"))
+
+ return (target+extratargets, source+extrasources)
+
+def windowsLibEmitter(target, source, env):
+ return _dllEmitter(target, source, env, 'SHLIB')
+
+def ldmodEmitter(target, source, env):
+ """Emitter for loadable modules.
+
+ Loadable modules are identical to shared libraries on Windows, but building
+ them is subject to different parameters (LDMODULE*).
+ """
+ return _dllEmitter(target, source, env, 'LDMODULE')
+
+def prog_emitter(target, source, env):
+ SCons.Tool.msvc.validate_vars(env)
+
+ extratargets = []
+ extrasources = []
+
+ exe = env.FindIxes(target, "PROGPREFIX", "PROGSUFFIX")
+ if not exe:
+ raise SCons.Errors.UserError("An executable should have exactly one target with the suffix: %s" % env.subst("$PROGSUFFIX"))
+
+ version_num, suite = SCons.Tool.msvs.msvs_parse_version(env.get('MSVS_VERSION', '6.0'))
+ if version_num >= 8.0 and \
+ (env.get('WINDOWS_INSERT_MANIFEST', 0) or env.get('WINDOWS_EMBED_MANIFEST', 0)):
+ # MSVC 8 and above automatically generate .manifest files that have to be installed
+ extratargets.append(
+ env.ReplaceIxes(exe,
+ "PROGPREFIX", "PROGSUFFIX",
+ "WINDOWSPROGMANIFESTPREFIX", "WINDOWSPROGMANIFESTSUFFIX"))
+
+ if 'PDB' in env and env['PDB']:
+ pdb = env.arg2nodes('$PDB', target=target, source=source)[0]
+ extratargets.append(pdb)
+ target[0].attributes.pdb = pdb
+
+ if version_num >= 11.0 and env.get('PCH', 0):
+ # MSVC 11 and above need the PCH object file to be added to the link line,
+ # otherwise you get link error LNK2011.
+ pchobj = SCons.Util.splitext(str(env['PCH']))[0] + '.obj'
+ # print("prog_emitter, version %s, appending pchobj %s"%(version_num, pchobj))
+ if pchobj not in extrasources:
+ extrasources.append(pchobj)
+
+ return (target+extratargets,source+extrasources)
+
+def RegServerFunc(target, source, env):
+ if 'register' in env and env['register']:
+ ret = regServerAction([target[0]], [source[0]], env)
+ if ret:
+ raise SCons.Errors.UserError("Unable to register %s" % target[0])
+ else:
+ print("Registered %s sucessfully" % target[0])
+ return ret
+ return 0
+
+# These are the actual actions run to embed the manifest.
+# They are only called from the Check versions below.
+embedManifestExeAction = SCons.Action.Action('$MTEXECOM')
+embedManifestDllAction = SCons.Action.Action('$MTSHLIBCOM')
+
+def embedManifestDllCheck(target, source, env):
+ """Function run by embedManifestDllCheckAction to check for existence of manifest
+ and other conditions, and embed the manifest by calling embedManifestDllAction if so."""
+ if env.get('WINDOWS_EMBED_MANIFEST', 0):
+ manifestSrc = target[0].get_abspath() + '.manifest'
+ if os.path.exists(manifestSrc):
+ ret = (embedManifestDllAction) ([target[0]],None,env)
+ if ret:
+ raise SCons.Errors.UserError("Unable to embed manifest into %s" % (target[0]))
+ return ret
+ else:
+ print('(embed: no %s.manifest found; not embedding.)'%str(target[0]))
+ return 0
+
+def embedManifestExeCheck(target, source, env):
+ """Function run by embedManifestExeCheckAction to check for existence of manifest
+ and other conditions, and embed the manifest by calling embedManifestExeAction if so."""
+ if env.get('WINDOWS_EMBED_MANIFEST', 0):
+ manifestSrc = target[0].get_abspath() + '.manifest'
+ if os.path.exists(manifestSrc):
+ ret = (embedManifestExeAction) ([target[0]],None,env)
+ if ret:
+ raise SCons.Errors.UserError("Unable to embed manifest into %s" % (target[0]))
+ return ret
+ else:
+ print('(embed: no %s.manifest found; not embedding.)'%str(target[0]))
+ return 0
+
+embedManifestDllCheckAction = SCons.Action.Action(embedManifestDllCheck, None)
+embedManifestExeCheckAction = SCons.Action.Action(embedManifestExeCheck, None)
+
+regServerAction = SCons.Action.Action("$REGSVRCOM", "$REGSVRCOMSTR")
+regServerCheck = SCons.Action.Action(RegServerFunc, None)
+shlibLinkAction = SCons.Action.Action('${TEMPFILE("$SHLINK $SHLINKFLAGS $_SHLINK_TARGETS $_LIBDIRFLAGS $_LIBFLAGS $_PDB $_SHLINK_SOURCES", "$SHLINKCOMSTR")}', '$SHLINKCOMSTR')
+compositeShLinkAction = shlibLinkAction + regServerCheck + embedManifestDllCheckAction
+ldmodLinkAction = SCons.Action.Action('${TEMPFILE("$LDMODULE $LDMODULEFLAGS $_LDMODULE_TARGETS $_LIBDIRFLAGS $_LIBFLAGS $_PDB $_LDMODULE_SOURCES", "$LDMODULECOMSTR")}', '$LDMODULECOMSTR')
+compositeLdmodAction = ldmodLinkAction + regServerCheck + embedManifestDllCheckAction
+exeLinkAction = SCons.Action.Action('${TEMPFILE("$LINK $LINKFLAGS /OUT:$TARGET.windows $_LIBDIRFLAGS $_LIBFLAGS $_PDB $SOURCES.windows", "$LINKCOMSTR")}', '$LINKCOMSTR')
+compositeLinkAction = exeLinkAction + embedManifestExeCheckAction
+
+def generate(env):
+ """Add Builders and construction variables for ar to an Environment."""
+ SCons.Tool.createSharedLibBuilder(env)
+ SCons.Tool.createProgBuilder(env)
+
+ env['SHLINK'] = '$LINK'
+ env['SHLINKFLAGS'] = SCons.Util.CLVar('$LINKFLAGS /dll')
+ env['_SHLINK_TARGETS'] = windowsShlinkTargets
+ env['_SHLINK_SOURCES'] = windowsShlinkSources
+ env['SHLINKCOM'] = compositeShLinkAction
+ env.Append(SHLIBEMITTER = [windowsLibEmitter])
+ env.Append(LDMODULEEMITTER = [windowsLibEmitter])
+ env['LINK'] = 'link'
+ env['LINKFLAGS'] = SCons.Util.CLVar('/nologo')
+ env['_PDB'] = pdbGenerator
+ env['LINKCOM'] = compositeLinkAction
+ env.Append(PROGEMITTER = [prog_emitter])
+ env['LIBDIRPREFIX']='/LIBPATH:'
+ env['LIBDIRSUFFIX']=''
+ env['LIBLINKPREFIX']=''
+ env['LIBLINKSUFFIX']='$LIBSUFFIX'
+
+ env['WIN32DEFPREFIX'] = ''
+ env['WIN32DEFSUFFIX'] = '.def'
+ env['WIN32_INSERT_DEF'] = 0
+ env['WINDOWSDEFPREFIX'] = '${WIN32DEFPREFIX}'
+ env['WINDOWSDEFSUFFIX'] = '${WIN32DEFSUFFIX}'
+ env['WINDOWS_INSERT_DEF'] = '${WIN32_INSERT_DEF}'
+
+ env['WIN32EXPPREFIX'] = ''
+ env['WIN32EXPSUFFIX'] = '.exp'
+ env['WINDOWSEXPPREFIX'] = '${WIN32EXPPREFIX}'
+ env['WINDOWSEXPSUFFIX'] = '${WIN32EXPSUFFIX}'
+
+ env['WINDOWSSHLIBMANIFESTPREFIX'] = ''
+ env['WINDOWSSHLIBMANIFESTSUFFIX'] = '${SHLIBSUFFIX}.manifest'
+ env['WINDOWSPROGMANIFESTPREFIX'] = ''
+ env['WINDOWSPROGMANIFESTSUFFIX'] = '${PROGSUFFIX}.manifest'
+
+ env['REGSVRACTION'] = regServerCheck
+ env['REGSVR'] = os.path.join(SCons.Platform.win32.get_system_root(),'System32','regsvr32')
+ env['REGSVRFLAGS'] = '/s '
+ env['REGSVRCOM'] = '$REGSVR $REGSVRFLAGS ${TARGET.windows}'
+
+ env['WINDOWS_EMBED_MANIFEST'] = 0
+ env['MT'] = 'mt'
+ #env['MTFLAGS'] = ['-hashupdate']
+ env['MTFLAGS'] = SCons.Util.CLVar('/nologo')
+ # Note: use - here to prevent build failure if no manifest produced.
+ # This seems much simpler than a fancy system using a function action to see
+ # if the manifest actually exists before trying to run mt with it.
+ env['MTEXECOM'] = '-$MT $MTFLAGS -manifest ${TARGET}.manifest $_MANIFEST_SOURCES -outputresource:$TARGET;1'
+ env['MTSHLIBCOM'] = '-$MT $MTFLAGS -manifest ${TARGET}.manifest $_MANIFEST_SOURCES -outputresource:$TARGET;2'
+ # TODO Future work garyo 27-Feb-11
+ env['_MANIFEST_SOURCES'] = None # _windowsManifestSources
+
+ # Set-up ms tools paths
+ msvc_setup_env_once(env)
+
+
+ # Loadable modules are on Windows the same as shared libraries, but they
+ # are subject to different build parameters (LDMODULE* variables).
+ # Therefore LDMODULE* variables correspond as much as possible to
+ # SHLINK*/SHLIB* ones.
+ SCons.Tool.createLoadableModuleBuilder(env)
+ env['LDMODULE'] = '$SHLINK'
+ env['LDMODULEPREFIX'] = '$SHLIBPREFIX'
+ env['LDMODULESUFFIX'] = '$SHLIBSUFFIX'
+ env['LDMODULEFLAGS'] = '$SHLINKFLAGS'
+ env['_LDMODULE_TARGETS'] = _windowsLdmodTargets
+ env['_LDMODULE_SOURCES'] = _windowsLdmodSources
+ env['LDMODULEEMITTER'] = [ldmodEmitter]
+ env['LDMODULECOM'] = compositeLdmodAction
+
+def exists(env):
+ return msvc_exists()
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/mslink.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/mslink.xml
new file mode 100644
index 0000000..87e1768
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/mslink.xml
@@ -0,0 +1,350 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+__COPYRIGHT__
+
+This file is processed by the bin/SConsDoc.py module.
+See its __doc__ string for a discussion of the format.
+-->
+
+<!DOCTYPE sconsdoc [
+<!ENTITY % scons SYSTEM '../../../../doc/scons.mod'>
+%scons;
+<!ENTITY % builders-mod SYSTEM '../../../../doc/generated/builders.mod'>
+%builders-mod;
+<!ENTITY % functions-mod SYSTEM '../../../../doc/generated/functions.mod'>
+%functions-mod;
+<!ENTITY % tools-mod SYSTEM '../../../../doc/generated/tools.mod'>
+%tools-mod;
+<!ENTITY % variables-mod SYSTEM '../../../../doc/generated/variables.mod'>
+%variables-mod;
+]>
+
+<sconsdoc xmlns="http://www.scons.org/dbxsd/v1.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://www.scons.org/dbxsd/v1.0 http://www.scons.org/dbxsd/v1.0/scons.xsd">
+
+<tool name="mslink">
+<summary>
+<para>
+Sets construction variables for the Microsoft linker.
+</para>
+</summary>
+<sets>
+<item>SHLINK</item>
+<item>SHLINKFLAGS</item>
+<item>SHLINKCOM</item>
+<item>LINK</item>
+<item>LINKFLAGS</item>
+<item>LINKCOM</item>
+<item>LIBDIRPREFIX</item>
+<item>LIBDIRSUFFIX</item>
+<item>LIBLINKPREFIX</item>
+<item>LIBLINKSUFFIX</item>
+<item>WIN32DEFPREFIX</item>
+<item>WIN32DEFSUFFIX</item>
+<item>WINDOWSDEFPREFIX</item>
+<item>WINDOWSDEFSUFFIX</item>
+<item>WINDOWS_INSERT_DEF</item>
+<item>WIN32EXPPREFIX</item>
+<item>WIN32EXPSUFFIX</item>
+<item>WINDOWSEXPPREFIX</item>
+<item>WINDOWSEXPSUFFIX</item>
+<item>WINDOWSSHLIBMANIFESTPREFIX</item>
+<item>WINDOWSSHLIBMANIFESTSUFFIX</item>
+<item>WINDOWSPROGMANIFESTPREFIX</item>
+<item>WINDOWSPROGMANIFESTSUFFIX</item>
+<item><!--REGSVRACTION--></item>
+<item>REGSVR</item>
+<item>REGSVRFLAGS</item>
+<item>REGSVRCOM</item>
+<item>LDMODULE</item>
+<item>LDMODULEPREFIX</item>
+<item>LDMODULESUFFIX</item>
+<item>LDMODULEFLAGS</item>
+<item>LDMODULECOM</item>
+</sets>
+<uses>
+<item>SHLINKCOMSTR</item>
+<item>LINKCOMSTR</item>
+<item>REGSVRCOMSTR</item>
+<item>LDMODULECOMSTR</item>
+</uses>
+</tool>
+
+<cvar name="no_import_lib">
+<summary>
+<para>
+When set to non-zero,
+suppresses creation of a corresponding Windows static import lib by the
+<literal>SharedLibrary</literal>
+builder when used with
+MinGW, Microsoft Visual Studio or Metrowerks.
+This also suppresses creation
+of an export (.exp) file
+when using Microsoft Visual Studio.
+</para>
+</summary>
+</cvar>
+
+<cvar name="PDB">
+<summary>
+<para>
+The Microsoft Visual C++ PDB file that will store debugging information for
+object files, shared libraries, and programs. This variable is ignored by
+tools other than Microsoft Visual C++.
+When this variable is
+defined SCons will add options to the compiler and linker command line to
+cause them to generate external debugging information, and will also set up the
+dependencies for the PDB file.
+Example:
+</para>
+
+<example_commands>
+env['PDB'] = 'hello.pdb'
+</example_commands>
+
+<para>
+The Visual C++ compiler switch that SCons uses by default
+to generate PDB information is <option>/Z7</option>.
+This works correctly with parallel (<option>-j</option>) builds
+because it embeds the debug information in the intermediate object files,
+as opposed to sharing a single PDB file between multiple object files.
+This is also the only way to get debug information
+embedded into a static library.
+Using the <option>/Zi</option> instead may yield improved
+link-time performance,
+although parallel builds will no longer work.
+You can generate PDB files with the <option>/Zi</option>
+switch by overriding the default &cv-link-CCPDBFLAGS; variable;
+see the entry for that variable for specific examples.
+</para>
+</summary>
+</cvar>
+
+<cvar name="WINDOWS_EMBED_MANIFEST">
+<summary>
+<para>
+Set this variable to True or 1 to embed the compiler-generated manifest
+(normally <literal>${TARGET}.manifest</literal>)
+into all Windows exes and DLLs built with this environment,
+as a resource during their link step.
+This is done using &cv-link-MT; and &cv-link-MTEXECOM; and &cv-link-MTSHLIBCOM;.
+</para>
+</summary>
+</cvar>
+
+<cvar name="MT">
+<summary>
+<para>
+The program used on Windows systems to embed manifests into DLLs and EXEs.
+See also &cv-link-WINDOWS_EMBED_MANIFEST;.
+</para>
+</summary>
+</cvar>
+
+<cvar name="MTFLAGS">
+<summary>
+<para>
+Flags passed to the &cv-link-MT; manifest embedding program (Windows only).
+</para>
+</summary>
+</cvar>
+
+<cvar name="MTEXECOM">
+<summary>
+<para>
+The Windows command line used to embed manifests into executables.
+See also &cv-link-MTSHLIBCOM;.
+</para>
+</summary>
+</cvar>
+
+<cvar name="MTSHLIBCOM">
+<summary>
+<para>
+The Windows command line used to embed manifests into shared libraries (DLLs).
+See also &cv-link-MTEXECOM;.
+</para>
+</summary>
+</cvar>
+
+<cvar name="REGSVR">
+<summary>
+<para>
+The program used on Windows systems
+to register a newly-built DLL library
+whenever the &b-SharedLibrary; builder
+is passed a keyword argument of <literal>register=1</literal>.
+</para>
+</summary>
+</cvar>
+
+<cvar name="REGSVRCOM">
+<summary>
+<para>
+The command line used on Windows systems
+to register a newly-built DLL library
+whenever the &b-SharedLibrary; builder
+is passed a keyword argument of <literal>register=1</literal>.
+</para>
+</summary>
+</cvar>
+
+<cvar name="REGSVRCOMSTR">
+<summary>
+<para>
+The string displayed when registering a newly-built DLL file.
+If this is not set, then &cv-link-REGSVRCOM; (the command line) is displayed.
+</para>
+</summary>
+</cvar>
+
+<cvar name="REGSVRFLAGS">
+<summary>
+<para>
+Flags passed to the DLL registration program
+on Windows systems when a newly-built DLL library is registered.
+By default,
+this includes the <option>/s</option>
+that prevents dialog boxes from popping up
+and requiring user attention.
+</para>
+</summary>
+</cvar>
+
+<cvar name="WIN32_INSERT_DEF">
+<summary>
+<para>
+A deprecated synonym for &cv-link-WINDOWS_INSERT_DEF;.
+</para>
+</summary>
+</cvar>
+
+<cvar name="WIN32DEFPREFIX">
+<summary>
+<para>
+A deprecated synonym for &cv-link-WINDOWSDEFPREFIX;.
+</para>
+</summary>
+</cvar>
+
+<cvar name="WIN32DEFSUFFIX">
+<summary>
+<para>
+A deprecated synonym for &cv-link-WINDOWSDEFSUFFIX;.
+</para>
+</summary>
+</cvar>
+
+<cvar name="WIN32EXPPREFIX">
+<summary>
+<para>
+A deprecated synonym for &cv-link-WINDOWSEXPSUFFIX;.
+</para>
+</summary>
+</cvar>
+
+<cvar name="WIN32EXPSUFFIX">
+<summary>
+<para>
+A deprecated synonym for &cv-link-WINDOWSEXPSUFFIX;.
+</para>
+</summary>
+</cvar>
+
+<cvar name="WINDOWS_INSERT_DEF">
+<summary>
+<para>
+When this is set to true,
+a library build of a Windows shared library
+(<filename>.dll</filename> file)
+will also build a corresponding <filename>.def</filename> file
+at the same time,
+if a <filename>.def</filename> file
+is not already listed as a build target.
+The default is 0 (do not build a <filename>.def</filename> file).
+</para>
+</summary>
+</cvar>
+
+<cvar name="WINDOWS_INSERT_MANIFEST">
+<summary>
+<para>
+When this is set to true,
+&scons;
+will be aware of the
+<filename>.manifest</filename>
+files generated by Microsoft Visua C/C++ 8.
+</para>
+</summary>
+</cvar>
+
+<cvar name="WINDOWSDEFPREFIX">
+<summary>
+<para>
+The prefix used for Windows <filename>.def</filename> file names.
+</para>
+</summary>
+</cvar>
+
+<cvar name="WINDOWSDEFSUFFIX">
+<summary>
+<para>
+The suffix used for Windows <filename>.def</filename> file names.
+</para>
+</summary>
+</cvar>
+
+<cvar name="WINDOWSEXPPREFIX">
+<summary>
+<para>
+The prefix used for Windows <filename>.exp</filename> file names.
+</para>
+</summary>
+</cvar>
+
+<cvar name="WINDOWSEXPSUFFIX">
+<summary>
+<para>
+The suffix used for Windows <filename>.exp</filename> file names.
+</para>
+</summary>
+</cvar>
+
+<cvar name="WINDOWSPROGMANIFESTPREFIX">
+<summary>
+<para>
+The prefix used for executable program <filename>.manifest</filename> files
+generated by Microsoft Visual C/C++.
+</para>
+</summary>
+</cvar>
+
+<cvar name="WINDOWSPROGMANIFESTSUFFIX">
+<summary>
+<para>
+The suffix used for executable program <filename>.manifest</filename> files
+generated by Microsoft Visual C/C++.
+</para>
+</summary>
+</cvar>
+
+<cvar name="WINDOWSSHLIBMANIFESTPREFIX">
+<summary>
+<para>
+The prefix used for shared library <filename>.manifest</filename> files
+generated by Microsoft Visual C/C++.
+</para>
+</summary>
+</cvar>
+
+<cvar name="WINDOWSSHLIBMANIFESTSUFFIX">
+<summary>
+<para>
+The suffix used for shared library <filename>.manifest</filename> files
+generated by Microsoft Visual C/C++.
+</para>
+</summary>
+</cvar>
+
+</sconsdoc>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/mssdk.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/mssdk.py
new file mode 100644
index 0000000..f373002
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/mssdk.py
@@ -0,0 +1,50 @@
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+"""engine.SCons.Tool.mssdk
+
+Tool-specific initialization for Microsoft SDKs, both Platform
+SDKs and Windows SDKs.
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+"""
+
+from .MSCommon import mssdk_exists, \
+ mssdk_setup_env
+
+def generate(env):
+ """Add construction variables for an MS SDK to an Environment."""
+ mssdk_setup_env(env)
+
+def exists(env):
+ return mssdk_exists()
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/mssdk.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/mssdk.xml
new file mode 100644
index 0000000..4444793
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/mssdk.xml
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+__COPYRIGHT__
+
+This file is processed by the bin/SConsDoc.py module.
+See its __doc__ string for a discussion of the format.
+-->
+
+<!DOCTYPE sconsdoc [
+<!ENTITY % scons SYSTEM '../../../../doc/scons.mod'>
+%scons;
+<!ENTITY % builders-mod SYSTEM '../../../../doc/generated/builders.mod'>
+%builders-mod;
+<!ENTITY % functions-mod SYSTEM '../../../../doc/generated/functions.mod'>
+%functions-mod;
+<!ENTITY % tools-mod SYSTEM '../../../../doc/generated/tools.mod'>
+%tools-mod;
+<!ENTITY % variables-mod SYSTEM '../../../../doc/generated/variables.mod'>
+%variables-mod;
+]>
+
+<sconsdoc xmlns="http://www.scons.org/dbxsd/v1.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://www.scons.org/dbxsd/v1.0 http://www.scons.org/dbxsd/v1.0/scons.xsd">
+
+<tool name="mssdk">
+<summary>
+<para>
+Sets variables for Microsoft Platform SDK and/or Windows SDK.
+Note that unlike most other Tool modules,
+mssdk does not set construction variables,
+but sets the <emphasis>environment variables</emphasis>
+in the environment &SCons; uses to execute
+the Microsoft toolchain:
+<literal>%INCLUDE%</literal>,
+<literal>%LIB%</literal>,
+<literal>%LIBPATH%</literal> and
+<literal>%PATH%</literal>.
+</para>
+</summary>
+<sets>
+</sets>
+<uses>
+<item>MSSDK_DIR</item>
+<item>MSSDK_VERSION</item>
+<item>MSVS_VERSION</item>
+</uses>
+</tool>
+
+<cvar name="MSSDK_DIR">
+<summary>
+<para>
+The directory containing the Microsoft SDK
+(either Platform SDK or Windows SDK)
+to be used for compilation.
+</para>
+</summary>
+</cvar>
+
+<cvar name="MSSDK_VERSION">
+<summary>
+<para>
+The version string of the Microsoft SDK
+(either Platform SDK or Windows SDK)
+to be used for compilation.
+Supported versions include
+<literal>6.1</literal>,
+<literal>6.0A</literal>,
+<literal>6.0</literal>,
+<literal>2003R2</literal>
+and
+<literal>2003R1</literal>.
+</para>
+</summary>
+</cvar>
+
+</sconsdoc>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/msvc.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/msvc.py
new file mode 100644
index 0000000..e1b0536
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/msvc.py
@@ -0,0 +1,295 @@
+"""engine.SCons.Tool.msvc
+
+Tool-specific initialization for Microsoft Visual C/C++.
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import os.path
+import re
+import sys
+
+import SCons.Action
+import SCons.Builder
+import SCons.Errors
+import SCons.Platform.win32
+import SCons.Tool
+import SCons.Tool.msvs
+import SCons.Util
+import SCons.Warnings
+import SCons.Scanner.RC
+
+from .MSCommon import msvc_exists, msvc_setup_env_once, msvc_version_to_maj_min
+
+CSuffixes = ['.c', '.C']
+CXXSuffixes = ['.cc', '.cpp', '.cxx', '.c++', '.C++']
+
+def validate_vars(env):
+ """Validate the PCH and PCHSTOP construction variables."""
+ if 'PCH' in env and env['PCH']:
+ if 'PCHSTOP' not in env:
+ raise SCons.Errors.UserError("The PCHSTOP construction must be defined if PCH is defined.")
+ if not SCons.Util.is_String(env['PCHSTOP']):
+ raise SCons.Errors.UserError("The PCHSTOP construction variable must be a string: %r"%env['PCHSTOP'])
+
+def msvc_set_PCHPDBFLAGS(env):
+ """
+ Set appropriate PCHPDBFLAGS for the MSVC version being used.
+ """
+ if env.get('MSVC_VERSION',False):
+ maj, min = msvc_version_to_maj_min(env['MSVC_VERSION'])
+ if maj < 8:
+ env['PCHPDBFLAGS'] = SCons.Util.CLVar(['${(PDB and "/Yd") or ""}'])
+ else:
+ env['PCHPDBFLAGS'] = ''
+ else:
+ # Default if we can't determine which version of MSVC we're using
+ env['PCHPDBFLAGS'] = SCons.Util.CLVar(['${(PDB and "/Yd") or ""}'])
+
+
+def pch_emitter(target, source, env):
+ """Adds the object file target."""
+
+ validate_vars(env)
+
+ pch = None
+ obj = None
+
+ for t in target:
+ if SCons.Util.splitext(str(t))[1] == '.pch':
+ pch = t
+ if SCons.Util.splitext(str(t))[1] == '.obj':
+ obj = t
+
+ if not obj:
+ obj = SCons.Util.splitext(str(pch))[0]+'.obj'
+
+ target = [pch, obj] # pch must be first, and obj second for the PCHCOM to work
+
+ return (target, source)
+
+def object_emitter(target, source, env, parent_emitter):
+ """Sets up the PCH dependencies for an object file."""
+
+ validate_vars(env)
+
+ parent_emitter(target, source, env)
+
+ # Add a dependency, but only if the target (e.g. 'Source1.obj')
+ # doesn't correspond to the pre-compiled header ('Source1.pch').
+ # If the basenames match, then this was most likely caused by
+ # someone adding the source file to both the env.PCH() and the
+ # env.Program() calls, and adding the explicit dependency would
+ # cause a cycle on the .pch file itself.
+ #
+ # See issue #2505 for a discussion of what to do if it turns
+ # out this assumption causes trouble in the wild:
+ # http://scons.tigris.org/issues/show_bug.cgi?id=2505
+ if 'PCH' in env:
+ pch = env['PCH']
+ if str(target[0]) != SCons.Util.splitext(str(pch))[0] + '.obj':
+ env.Depends(target, pch)
+
+ return (target, source)
+
+def static_object_emitter(target, source, env):
+ return object_emitter(target, source, env,
+ SCons.Defaults.StaticObjectEmitter)
+
+def shared_object_emitter(target, source, env):
+ return object_emitter(target, source, env,
+ SCons.Defaults.SharedObjectEmitter)
+
+pch_action = SCons.Action.Action('$PCHCOM', '$PCHCOMSTR')
+pch_builder = SCons.Builder.Builder(action=pch_action, suffix='.pch',
+ emitter=pch_emitter,
+ source_scanner=SCons.Tool.SourceFileScanner)
+
+
+# Logic to build .rc files into .res files (resource files)
+res_scanner = SCons.Scanner.RC.RCScan()
+res_action = SCons.Action.Action('$RCCOM', '$RCCOMSTR')
+res_builder = SCons.Builder.Builder(action=res_action,
+ src_suffix='.rc',
+ suffix='.res',
+ src_builder=[],
+ source_scanner=res_scanner)
+
+def msvc_batch_key(action, env, target, source):
+ """
+ Returns a key to identify unique batches of sources for compilation.
+
+ If batching is enabled (via the $MSVC_BATCH setting), then all
+ target+source pairs that use the same action, defined by the same
+ environment, and have the same target and source directories, will
+ be batched.
+
+ Returning None specifies that the specified target+source should not
+ be batched with other compilations.
+ """
+
+ # Fixing MSVC_BATCH mode. Previous if did not work when MSVC_BATCH
+ # was set to False. This new version should work better.
+ # Note we need to do the env.subst so $MSVC_BATCH can be a reference to
+ # another construction variable, which is why we test for False and 0
+ # as strings.
+ if not 'MSVC_BATCH' in env or env.subst('$MSVC_BATCH') in ('0', 'False', '', None):
+ # We're not using batching; return no key.
+ return None
+ t = target[0]
+ s = source[0]
+ if os.path.splitext(t.name)[0] != os.path.splitext(s.name)[0]:
+ # The base names are different, so this *must* be compiled
+ # separately; return no key.
+ return None
+ return (id(action), id(env), t.dir, s.dir)
+
+def msvc_output_flag(target, source, env, for_signature):
+ """
+ Returns the correct /Fo flag for batching.
+
+ If batching is disabled or there's only one source file, then we
+ return an /Fo string that specifies the target explicitly. Otherwise,
+ we return an /Fo string that just specifies the first target's
+ directory (where the Visual C/C++ compiler will put the .obj files).
+ """
+
+ # Fixing MSVC_BATCH mode. Previous if did not work when MSVC_BATCH
+ # was set to False. This new version should work better. Removed
+ # len(source)==1 as batch mode can compile only one file
+ # (and it also fixed problem with compiling only one changed file
+ # with batch mode enabled)
+ if not 'MSVC_BATCH' in env or env.subst('$MSVC_BATCH') in ('0', 'False', '', None):
+ return '/Fo$TARGET'
+ else:
+ # The Visual C/C++ compiler requires a \ at the end of the /Fo
+ # option to indicate an output directory. We use os.sep here so
+ # that the test(s) for this can be run on non-Windows systems
+ # without having a hard-coded backslash mess up command-line
+ # argument parsing.
+ return '/Fo${TARGET.dir}' + os.sep
+
+CAction = SCons.Action.Action("$CCCOM", "$CCCOMSTR",
+ batch_key=msvc_batch_key,
+ targets='$CHANGED_TARGETS')
+ShCAction = SCons.Action.Action("$SHCCCOM", "$SHCCCOMSTR",
+ batch_key=msvc_batch_key,
+ targets='$CHANGED_TARGETS')
+CXXAction = SCons.Action.Action("$CXXCOM", "$CXXCOMSTR",
+ batch_key=msvc_batch_key,
+ targets='$CHANGED_TARGETS')
+ShCXXAction = SCons.Action.Action("$SHCXXCOM", "$SHCXXCOMSTR",
+ batch_key=msvc_batch_key,
+ targets='$CHANGED_TARGETS')
+
+def generate(env):
+ """Add Builders and construction variables for MSVC++ to an Environment."""
+ static_obj, shared_obj = SCons.Tool.createObjBuilders(env)
+
+ # TODO(batch): shouldn't reach in to cmdgen this way; necessary
+ # for now to bypass the checks in Builder.DictCmdGenerator.__call__()
+ # and allow .cc and .cpp to be compiled in the same command line.
+ static_obj.cmdgen.source_ext_match = False
+ shared_obj.cmdgen.source_ext_match = False
+
+ for suffix in CSuffixes:
+ static_obj.add_action(suffix, CAction)
+ shared_obj.add_action(suffix, ShCAction)
+ static_obj.add_emitter(suffix, static_object_emitter)
+ shared_obj.add_emitter(suffix, shared_object_emitter)
+
+ for suffix in CXXSuffixes:
+ static_obj.add_action(suffix, CXXAction)
+ shared_obj.add_action(suffix, ShCXXAction)
+ static_obj.add_emitter(suffix, static_object_emitter)
+ shared_obj.add_emitter(suffix, shared_object_emitter)
+
+ env['CCPDBFLAGS'] = SCons.Util.CLVar(['${(PDB and "/Z7") or ""}'])
+ env['CCPCHFLAGS'] = SCons.Util.CLVar(['${(PCH and "/Yu%s \\\"/Fp%s\\\""%(PCHSTOP or "",File(PCH))) or ""}'])
+ env['_MSVC_OUTPUT_FLAG'] = msvc_output_flag
+ env['_CCCOMCOM'] = '$CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS $CCPCHFLAGS $CCPDBFLAGS'
+ env['CC'] = 'cl'
+ env['CCFLAGS'] = SCons.Util.CLVar('/nologo')
+ env['CFLAGS'] = SCons.Util.CLVar('')
+ env['CCCOM'] = '${TEMPFILE("$CC $_MSVC_OUTPUT_FLAG /c $CHANGED_SOURCES $CFLAGS $CCFLAGS $_CCCOMCOM","$CCCOMSTR")}'
+ env['SHCC'] = '$CC'
+ env['SHCCFLAGS'] = SCons.Util.CLVar('$CCFLAGS')
+ env['SHCFLAGS'] = SCons.Util.CLVar('$CFLAGS')
+ env['SHCCCOM'] = '${TEMPFILE("$SHCC $_MSVC_OUTPUT_FLAG /c $CHANGED_SOURCES $SHCFLAGS $SHCCFLAGS $_CCCOMCOM","$SHCCCOMSTR")}'
+ env['CXX'] = '$CC'
+ env['CXXFLAGS'] = SCons.Util.CLVar('$( /TP $)')
+ env['CXXCOM'] = '${TEMPFILE("$CXX $_MSVC_OUTPUT_FLAG /c $CHANGED_SOURCES $CXXFLAGS $CCFLAGS $_CCCOMCOM","$CXXCOMSTR")}'
+ env['SHCXX'] = '$CXX'
+ env['SHCXXFLAGS'] = SCons.Util.CLVar('$CXXFLAGS')
+ env['SHCXXCOM'] = '${TEMPFILE("$SHCXX $_MSVC_OUTPUT_FLAG /c $CHANGED_SOURCES $SHCXXFLAGS $SHCCFLAGS $_CCCOMCOM","$SHCXXCOMSTR")}'
+ env['CPPDEFPREFIX'] = '/D'
+ env['CPPDEFSUFFIX'] = ''
+ env['INCPREFIX'] = '/I'
+ env['INCSUFFIX'] = ''
+# env.Append(OBJEMITTER = [static_object_emitter])
+# env.Append(SHOBJEMITTER = [shared_object_emitter])
+ env['STATIC_AND_SHARED_OBJECTS_ARE_THE_SAME'] = 1
+
+ env['RC'] = 'rc'
+ env['RCFLAGS'] = SCons.Util.CLVar('')
+ env['RCSUFFIXES']=['.rc','.rc2']
+ env['RCCOM'] = '$RC $_CPPDEFFLAGS $_CPPINCFLAGS $RCFLAGS /fo$TARGET $SOURCES'
+ env['BUILDERS']['RES'] = res_builder
+ env['OBJPREFIX'] = ''
+ env['OBJSUFFIX'] = '.obj'
+ env['SHOBJPREFIX'] = '$OBJPREFIX'
+ env['SHOBJSUFFIX'] = '$OBJSUFFIX'
+
+ # Set-up ms tools paths
+ msvc_setup_env_once(env)
+
+ env['CFILESUFFIX'] = '.c'
+ env['CXXFILESUFFIX'] = '.cc'
+
+ msvc_set_PCHPDBFLAGS(env)
+
+
+ env['PCHCOM'] = '$CXX /Fo${TARGETS[1]} $CXXFLAGS $CCFLAGS $CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS /c $SOURCES /Yc$PCHSTOP /Fp${TARGETS[0]} $CCPDBFLAGS $PCHPDBFLAGS'
+ env['BUILDERS']['PCH'] = pch_builder
+
+ if 'ENV' not in env:
+ env['ENV'] = {}
+ if 'SystemRoot' not in env['ENV']: # required for dlls in the winsxs folders
+ env['ENV']['SystemRoot'] = SCons.Platform.win32.get_system_root()
+
+def exists(env):
+ return msvc_exists()
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/msvc.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/msvc.xml
new file mode 100644
index 0000000..1823a89
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/msvc.xml
@@ -0,0 +1,468 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+__COPYRIGHT__
+
+This file is processed by the bin/SConsDoc.py module.
+See its __doc__ string for a discussion of the format.
+-->
+
+<!DOCTYPE sconsdoc [
+<!ENTITY % scons SYSTEM '../../../../doc/scons.mod'>
+%scons;
+<!ENTITY % builders-mod SYSTEM '../../../../doc/generated/builders.mod'>
+%builders-mod;
+<!ENTITY % functions-mod SYSTEM '../../../../doc/generated/functions.mod'>
+%functions-mod;
+<!ENTITY % tools-mod SYSTEM '../../../../doc/generated/tools.mod'>
+%tools-mod;
+<!ENTITY % variables-mod SYSTEM '../../../../doc/generated/variables.mod'>
+%variables-mod;
+]>
+
+<sconsdoc xmlns="http://www.scons.org/dbxsd/v1.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://www.scons.org/dbxsd/v1.0 http://www.scons.org/dbxsd/v1.0/scons.xsd">
+
+<tool name="msvc">
+<summary>
+<para>
+Sets construction variables for the Microsoft Visual C/C++ compiler.
+</para>
+</summary>
+<sets>
+<item>CCPDBFLAGS</item>
+<item>CCPCHFLAGS</item>
+<item><!--CCCOMFLAGS--></item>
+<item>CC</item>
+<item>CCFLAGS</item>
+<item>CFLAGS</item>
+<item>CCCOM</item>
+<item>SHCC</item>
+<item>SHCCFLAGS</item>
+<item>SHCFLAGS</item>
+<item>SHCCCOM</item>
+<item>CXX</item>
+<item>CXXFLAGS</item>
+<item>CXXCOM</item>
+<item>SHCXX</item>
+<item>SHCXXFLAGS</item>
+<item>SHCXXCOM</item>
+<item>CPPDEFPREFIX</item>
+<item>CPPDEFSUFFIX</item>
+<item>INCPREFIX</item>
+<item>INCSUFFIX</item>
+<item><!--STATIC_AND_SHARED_OBJECTS_ARE_THE_SAME--></item>
+<item>RC</item>
+<item>RCFLAGS</item>
+<item>RCCOM</item>
+<item>BUILDERS</item>
+<item>OBJPREFIX</item>
+<item>OBJSUFFIX</item>
+<item>SHOBJPREFIX</item>
+<item>SHOBJSUFFIX</item>
+<item>CFILESUFFIX</item>
+<item>CXXFILESUFFIX</item>
+<item>PCHPDBFLAGS</item>
+<item>PCHCOM</item>
+</sets>
+<uses>
+<item>CCCOMSTR</item>
+<item>SHCCCOMSTR</item>
+<item>CXXCOMSTR</item>
+<item>SHCXXCOMSTR</item>
+<item>PCH</item>
+<item>PCHSTOP</item>
+<item>PDB</item>
+</uses>
+</tool>
+
+<builder name="PCH">
+<summary>
+<para>
+Builds a Microsoft Visual C++ precompiled header.
+Calling this builder method
+returns a list of two targets: the PCH as the first element, and the object
+file as the second element. Normally the object file is ignored.
+This builder method is only
+provided when Microsoft Visual C++ is being used as the compiler.
+The PCH builder method is generally used in
+conjunction with the PCH construction variable to force object files to use
+the precompiled header:
+</para>
+
+<example_commands>
+env['PCH'] = env.PCH('StdAfx.cpp')[0]
+</example_commands>
+</summary>
+</builder>
+
+<builder name="RES">
+<summary>
+<para>
+Builds a Microsoft Visual C++ resource file.
+This builder method is only provided
+when Microsoft Visual C++ or MinGW is being used as the compiler. The
+<filename>.res</filename>
+(or
+<filename>.o</filename>
+for MinGW) suffix is added to the target name if no other suffix is given.
+The source
+file is scanned for implicit dependencies as though it were a C file.
+Example:
+</para>
+
+<example_commands>
+env.RES('resource.rc')
+</example_commands>
+</summary>
+</builder>
+
+<cvar name="CCPCHFLAGS">
+<summary>
+<para>
+Options added to the compiler command line
+to support building with precompiled headers.
+The default value expands expands to the appropriate
+Microsoft Visual C++ command-line options
+when the &cv-link-PCH; construction variable is set.
+</para>
+</summary>
+</cvar>
+
+<cvar name="CCPDBFLAGS">
+<summary>
+<para>
+Options added to the compiler command line
+to support storing debugging information in a
+Microsoft Visual C++ PDB file.
+The default value expands expands to appropriate
+Microsoft Visual C++ command-line options
+when the &cv-link-PDB; construction variable is set.
+</para>
+
+<para>
+The Visual C++ compiler option that SCons uses by default
+to generate PDB information is <option>/Z7</option>.
+This works correctly with parallel (<option>-j</option>) builds
+because it embeds the debug information in the intermediate object files,
+as opposed to sharing a single PDB file between multiple object files.
+This is also the only way to get debug information
+embedded into a static library.
+Using the <option>/Zi</option> instead may yield improved
+link-time performance,
+although parallel builds will no longer work.
+</para>
+
+<para>
+You can generate PDB files with the <option>/Zi</option>
+switch by overriding the default &cv-link-CCPDBFLAGS; variable as follows:
+</para>
+
+<example_commands>
+env['CCPDBFLAGS'] = ['${(PDB and "/Zi /Fd%s" % File(PDB)) or ""}']
+</example_commands>
+
+<para>
+An alternative would be to use the <option>/Zi</option>
+to put the debugging information in a separate <filename>.pdb</filename>
+file for each object file by overriding
+the &cv-link-CCPDBFLAGS; variable as follows:
+</para>
+
+<example_commands>
+env['CCPDBFLAGS'] = '/Zi /Fd${TARGET}.pdb'
+</example_commands>
+</summary>
+</cvar>
+
+<cvar name="MSVC_BATCH">
+<summary>
+<para>
+When set to any true value,
+specifies that SCons should batch
+compilation of object files
+when calling the Microsoft Visual C/C++ compiler.
+All compilations of source files from the same source directory
+that generate target files in a same output directory
+and were configured in SCons using the same construction environment
+will be built in a single call to the compiler.
+Only source files that have changed since their
+object files were built will be passed to each compiler invocation
+(via the &cv-link-CHANGED_SOURCES; construction variable).
+Any compilations where the object (target) file base name
+(minus the <filename>.obj</filename>)
+does not match the source file base name
+will be compiled separately.
+</para>
+</summary>
+</cvar>
+
+<cvar name="PCH">
+<summary>
+<para>
+The Microsoft Visual C++ precompiled header that will be used when compiling
+object files. This variable is ignored by tools other than Microsoft Visual C++.
+When this variable is
+defined SCons will add options to the compiler command line to
+cause it to use the precompiled header, and will also set up the
+dependencies for the PCH file.
+Example:
+</para>
+
+<example_commands>
+env['PCH'] = 'StdAfx.pch'
+</example_commands>
+</summary>
+</cvar>
+
+<cvar name="PCHCOM">
+<summary>
+<para>
+The command line used by the
+&b-PCH;
+builder to generated a precompiled header.
+</para>
+</summary>
+</cvar>
+
+<cvar name="PCHCOMSTR">
+<summary>
+<para>
+The string displayed when generating a precompiled header.
+If this is not set, then &cv-link-PCHCOM; (the command line) is displayed.
+</para>
+</summary>
+</cvar>
+
+<cvar name="PCHPDBFLAGS">
+<summary>
+<para>
+A construction variable that, when expanded,
+adds the <literal>/yD</literal> flag to the command line
+only if the &cv-PDB; construction variable is set.
+</para>
+</summary>
+</cvar>
+
+<cvar name="PCHSTOP">
+<summary>
+<para>
+This variable specifies how much of a source file is precompiled. This
+variable is ignored by tools other than Microsoft Visual C++, or when
+the PCH variable is not being used. When this variable is define it
+must be a string that is the name of the header that
+is included at the end of the precompiled portion of the source files, or
+the empty string if the "#pragma hrdstop" construct is being used:
+</para>
+
+<example_commands>
+env['PCHSTOP'] = 'StdAfx.h'
+</example_commands>
+</summary>
+</cvar>
+
+<cvar name="RC">
+<summary>
+<para>
+The resource compiler used to build
+a Microsoft Visual C++ resource file.
+</para>
+</summary>
+</cvar>
+
+<cvar name="RCCOM">
+<summary>
+<para>
+The command line used to build
+a Microsoft Visual C++ resource file.
+</para>
+</summary>
+</cvar>
+
+<cvar name="RCCOMSTR">
+<summary>
+<para>
+The string displayed when invoking the resource compiler
+to build a Microsoft Visual C++ resource file.
+If this is not set, then &cv-link-RCCOM; (the command line) is displayed.
+</para>
+</summary>
+</cvar>
+
+<cvar name="RCFLAGS">
+<summary>
+<para>
+The flags passed to the resource compiler by the RES builder.
+</para>
+</summary>
+</cvar>
+
+<cvar name="RCINCFLAGS">
+<summary>
+<para>
+An automatically-generated construction variable
+containing the command-line options
+for specifying directories to be searched
+by the resource compiler.
+The value of &cv-RCINCFLAGS; is created
+by appending &cv-RCINCPREFIX; and &cv-RCINCSUFFIX;
+to the beginning and end
+of each directory in &cv-CPPPATH;.
+</para>
+</summary>
+</cvar>
+
+<cvar name="RCINCPREFIX">
+<summary>
+<para>
+The prefix (flag) used to specify an include directory
+on the resource compiler command line.
+This will be appended to the beginning of each directory
+in the &cv-CPPPATH; construction variable
+when the &cv-RCINCFLAGS; variable is expanded.
+</para>
+</summary>
+</cvar>
+
+<cvar name="RCINCSUFFIX">
+<summary>
+<para>
+The suffix used to specify an include directory
+on the resource compiler command line.
+This will be appended to the end of each directory
+in the &cv-CPPPATH; construction variable
+when the &cv-RCINCFLAGS; variable is expanded.
+</para>
+</summary>
+</cvar>
+
+<cvar name="MSVC_VERSION">
+<summary>
+<para>
+Sets the preferred version of Microsoft Visual C/C++ to use.
+</para>
+
+<para>
+If &cv-MSVC_VERSION; is not set, SCons will (by default) select the
+latest version of Visual C/C++ installed on your system. If the
+specified version isn't installed, tool initialization will fail.
+This variable must be passed as an argument to the Environment()
+constructor; setting it later has no effect.
+</para>
+
+<para>
+Valid values for Windows are
+<literal>14.0</literal>,
+<literal>14.0Exp</literal>,
+<literal>12.0</literal>,
+<literal>12.0Exp</literal>,
+<literal>11.0</literal>,
+<literal>11.0Exp</literal>,
+<literal>10.0</literal>,
+<literal>10.0Exp</literal>,
+<literal>9.0</literal>,
+<literal>9.0Exp</literal>,
+<literal>8.0</literal>,
+<literal>8.0Exp</literal>,
+<literal>7.1</literal>,
+<literal>7.0</literal>,
+and <literal>6.0</literal>.
+Versions ending in <literal>Exp</literal> refer to "Express" or
+"Express for Desktop" editions.
+</para>
+
+</summary>
+</cvar>
+
+<cvar name="MSVC_USE_SCRIPT">
+<summary>
+<para>
+Use a batch script to set up Microsoft Visual Studio compiler
+</para>
+
+<para>
+&cv-MSVC_USE_SCRIPT; overrides &cv-MSVC_VERSION; and &cv-TARGET_ARCH;.
+If set to the name of a Visual Studio .bat file (e.g. vcvars.bat),
+SCons will run that bat file and extract the relevant variables from
+the result (typically %INCLUDE%, %LIB%, and %PATH%). Setting
+MSVC_USE_SCRIPT to None bypasses the Visual Studio autodetection
+entirely; use this if you are running SCons in a Visual Studio cmd
+window and importing the shell's environment variables.
+</para>
+</summary>
+</cvar>
+
+<cvar name="HOST_ARCH">
+<summary>
+<para>
+Sets the host architecture for Visual Studio compiler. If not set,
+default to the detected host architecture: note that this may depend
+on the python you are using.
+This variable must be passed as an argument to the Environment()
+constructor; setting it later has no effect.
+</para>
+
+<para>
+Valid values are the same as for &cv-TARGET_ARCH;.
+</para>
+
+<para>
+This is currently only used on Windows, but in the future it will be
+used on other OSes as well.
+</para>
+</summary>
+</cvar>
+<cvar name="TARGET_ARCH">
+<summary>
+<para>
+Sets the target architecture for Visual Studio compiler (i.e. the arch
+of the binaries generated by the compiler). If not set, default to
+&cv-HOST_ARCH;, or, if that is unset, to the architecture of the
+running machine's OS (note that the python build or architecture has no
+effect).
+This variable must be passed as an argument to the Environment()
+constructor; setting it later has no effect.
+This is currently only used on Windows, but in the future it will be
+used on other OSes as well.
+</para>
+
+<para>
+Valid values for Windows are
+<literal>x86</literal>,
+<literal>i386</literal>
+(for 32 bits);
+<literal>amd64</literal>,
+<literal>emt64</literal>,
+<literal>x86_64</literal>
+(for 64 bits);
+and <literal>ia64</literal> (Itanium).
+For example, if you want to compile 64-bit binaries, you would set
+<literal>TARGET_ARCH='x86_64'</literal> in your SCons environment.
+</para>
+</summary>
+</cvar>
+
+<cvar name="MSVC_UWP_APP">
+<summary>
+<para>
+Build libraries for a Universal Windows Platform (UWP) Application.
+</para>
+
+<para>
+If &cv-MSVC_UWP_APP; is set, the Visual Studio environment will be set up to point
+to the Windows Store compatible libraries and Visual Studio runtimes. In doing so,
+any libraries that are built will be able to be used in a UWP App and published
+to the Windows Store.
+This flag will only have an effect with Visual Studio 2015+.
+This variable must be passed as an argument to the Environment()
+constructor; setting it later has no effect.
+</para>
+
+<para>
+Valid values are '1' or '0'
+</para>
+
+</summary>
+</cvar>
+
+</sconsdoc>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/msvs.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/msvs.py
new file mode 100644
index 0000000..e1175e0
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/msvs.py
@@ -0,0 +1,1999 @@
+"""SCons.Tool.msvs
+
+Tool-specific initialization for Microsoft Visual Studio project files.
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+from __future__ import print_function
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import SCons.compat
+
+import base64
+import hashlib
+import ntpath
+import os
+import pickle
+import re
+import sys
+
+import SCons.Builder
+import SCons.Node.FS
+import SCons.Platform.win32
+import SCons.Script.SConscript
+import SCons.PathList
+import SCons.Util
+import SCons.Warnings
+
+from .MSCommon import msvc_exists, msvc_setup_env_once
+from SCons.Defaults import processDefines
+from SCons.compat import PICKLE_PROTOCOL
+
+##############################################################################
+# Below here are the classes and functions for generation of
+# DSP/DSW/SLN/VCPROJ files.
+##############################################################################
+
+def xmlify(s):
+ s = s.replace("&", "&amp;") # do this first
+ s = s.replace("'", "&apos;")
+ s = s.replace('"', "&quot;")
+ s = s.replace('<', "&lt;")
+ s = s.replace('>', "&gt;")
+ s = s.replace('\n', '&#x0A;')
+ return s
+
+# Process a CPPPATH list in includes, given the env, target and source.
+# Returns a tuple of nodes.
+def processIncludes(includes, env, target, source):
+ return SCons.PathList.PathList(includes).subst_path(env, target, source)
+
+
+external_makefile_guid = '{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}'
+
+def _generateGUID(slnfile, name):
+ """This generates a dummy GUID for the sln file to use. It is
+ based on the MD5 signatures of the sln filename plus the name of
+ the project. It basically just needs to be unique, and not
+ change with each invocation."""
+ m = hashlib.md5()
+ # Normalize the slnfile path to a Windows path (\ separators) so
+ # the generated file has a consistent GUID even if we generate
+ # it on a non-Windows platform.
+ m.update(bytearray(ntpath.normpath(str(slnfile)) + str(name),'utf-8'))
+ solution = m.hexdigest().upper()
+ # convert most of the signature to GUID form (discard the rest)
+ solution = "{" + solution[:8] + "-" + solution[8:12] + "-" + solution[12:16] + "-" + solution[16:20] + "-" + solution[20:32] + "}"
+ return solution
+
+version_re = re.compile(r'(\d+\.\d+)(.*)')
+
+def msvs_parse_version(s):
+ """
+ Split a Visual Studio version, which may in fact be something like
+ '7.0Exp', into is version number (returned as a float) and trailing
+ "suite" portion.
+ """
+ num, suite = version_re.match(s).groups()
+ return float(num), suite
+
+# This is how we re-invoke SCons from inside MSVS Project files.
+# The problem is that we might have been invoked as either scons.bat
+# or scons.py. If we were invoked directly as scons.py, then we could
+# use sys.argv[0] to find the SCons "executable," but that doesn't work
+# if we were invoked as scons.bat, which uses "python -c" to execute
+# things and ends up with "-c" as sys.argv[0]. Consequently, we have
+# the MSVS Project file invoke SCons the same way that scons.bat does,
+# which works regardless of how we were invoked.
+def getExecScriptMain(env, xml=None):
+ scons_home = env.get('SCONS_HOME')
+ if not scons_home and 'SCONS_LIB_DIR' in os.environ:
+ scons_home = os.environ['SCONS_LIB_DIR']
+ if scons_home:
+ exec_script_main = "from os.path import join; import sys; sys.path = [ r'%s' ] + sys.path; import SCons.Script; SCons.Script.main()" % scons_home
+ else:
+ version = SCons.__version__
+ exec_script_main = "from os.path import join; import sys; sys.path = [ join(sys.prefix, 'Lib', 'site-packages', 'scons-%(version)s'), join(sys.prefix, 'scons-%(version)s'), join(sys.prefix, 'Lib', 'site-packages', 'scons'), join(sys.prefix, 'scons') ] + sys.path; import SCons.Script; SCons.Script.main()" % locals()
+ if xml:
+ exec_script_main = xmlify(exec_script_main)
+ return exec_script_main
+
+# The string for the Python executable we tell the Project file to use
+# is either sys.executable or, if an external PYTHON_ROOT environment
+# variable exists, $(PYTHON)ROOT\\python.exe (generalized a little to
+# pluck the actual executable name from sys.executable).
+try:
+ python_root = os.environ['PYTHON_ROOT']
+except KeyError:
+ python_executable = sys.executable
+else:
+ python_executable = os.path.join('$$(PYTHON_ROOT)',
+ os.path.split(sys.executable)[1])
+
+class Config(object):
+ pass
+
+def splitFully(path):
+ dir, base = os.path.split(path)
+ if dir and dir != '' and dir != path:
+ return splitFully(dir)+[base]
+ if base == '':
+ return []
+ return [base]
+
+def makeHierarchy(sources):
+ '''Break a list of files into a hierarchy; for each value, if it is a string,
+ then it is a file. If it is a dictionary, it is a folder. The string is
+ the original path of the file.'''
+
+ hierarchy = {}
+ for file in sources:
+ path = splitFully(file)
+ if len(path):
+ dict = hierarchy
+ for part in path[:-1]:
+ if part not in dict:
+ dict[part] = {}
+ dict = dict[part]
+ dict[path[-1]] = file
+ #else:
+ # print 'Warning: failed to decompose path for '+str(file)
+ return hierarchy
+
+class _UserGenerator(object):
+ '''
+ Base class for .dsp.user file generator
+ '''
+ # Default instance values.
+ # Ok ... a bit defensive, but it does not seem reasonable to crash the
+ # build for a workspace user file. :-)
+ usrhead = None
+ usrdebg = None
+ usrconf = None
+ createfile = False
+ def __init__(self, dspfile, source, env):
+ # DebugSettings should be a list of debug dictionary sorted in the same order
+ # as the target list and variants
+ if 'variant' not in env:
+ raise SCons.Errors.InternalError("You must specify a 'variant' argument (i.e. 'Debug' or " +\
+ "'Release') to create an MSVSProject.")
+ elif SCons.Util.is_String(env['variant']):
+ variants = [env['variant']]
+ elif SCons.Util.is_List(env['variant']):
+ variants = env['variant']
+
+ if 'DebugSettings' not in env or env['DebugSettings'] == None:
+ dbg_settings = []
+ elif SCons.Util.is_Dict(env['DebugSettings']):
+ dbg_settings = [env['DebugSettings']]
+ elif SCons.Util.is_List(env['DebugSettings']):
+ if len(env['DebugSettings']) != len(variants):
+ raise SCons.Errors.InternalError("Sizes of 'DebugSettings' and 'variant' lists must be the same.")
+ dbg_settings = []
+ for ds in env['DebugSettings']:
+ if SCons.Util.is_Dict(ds):
+ dbg_settings.append(ds)
+ else:
+ dbg_settings.append({})
+ else:
+ dbg_settings = []
+
+ if len(dbg_settings) == 1:
+ dbg_settings = dbg_settings * len(variants)
+
+ self.createfile = self.usrhead and self.usrdebg and self.usrconf and \
+ dbg_settings and bool([ds for ds in dbg_settings if ds])
+
+ if self.createfile:
+ dbg_settings = dict(list(zip(variants, dbg_settings)))
+ for var, src in dbg_settings.items():
+ # Update only expected keys
+ trg = {}
+ for key in [k for k in list(self.usrdebg.keys()) if k in src]:
+ trg[key] = str(src[key])
+ self.configs[var].debug = trg
+
+ def UserHeader(self):
+ encoding = self.env.subst('$MSVSENCODING')
+ versionstr = self.versionstr
+ self.usrfile.write(self.usrhead % locals())
+
+ def UserProject(self):
+ pass
+
+ def Build(self):
+ if not self.createfile:
+ return
+ try:
+ filename = self.dspabs +'.user'
+ self.usrfile = open(filename, 'w')
+ except IOError as detail:
+ raise SCons.Errors.InternalError('Unable to open "' + filename + '" for writing:' + str(detail))
+ else:
+ self.UserHeader()
+ self.UserProject()
+ self.usrfile.close()
+
+V9UserHeader = """\
+<?xml version="1.0" encoding="%(encoding)s"?>
+<VisualStudioUserFile
+\tProjectType="Visual C++"
+\tVersion="%(versionstr)s"
+\tShowAllFiles="false"
+\t>
+\t<Configurations>
+"""
+
+V9UserConfiguration = """\
+\t\t<Configuration
+\t\t\tName="%(variant)s|%(platform)s"
+\t\t\t>
+\t\t\t<DebugSettings
+%(debug_settings)s
+\t\t\t/>
+\t\t</Configuration>
+"""
+
+V9DebugSettings = {
+'Command':'$(TargetPath)',
+'WorkingDirectory': None,
+'CommandArguments': None,
+'Attach':'false',
+'DebuggerType':'3',
+'Remote':'1',
+'RemoteMachine': None,
+'RemoteCommand': None,
+'HttpUrl': None,
+'PDBPath': None,
+'SQLDebugging': None,
+'Environment': None,
+'EnvironmentMerge':'true',
+'DebuggerFlavor': None,
+'MPIRunCommand': None,
+'MPIRunArguments': None,
+'MPIRunWorkingDirectory': None,
+'ApplicationCommand': None,
+'ApplicationArguments': None,
+'ShimCommand': None,
+'MPIAcceptMode': None,
+'MPIAcceptFilter': None,
+}
+
+class _GenerateV7User(_UserGenerator):
+ """Generates a Project file for MSVS .NET"""
+ def __init__(self, dspfile, source, env):
+ if self.version_num >= 9.0:
+ self.usrhead = V9UserHeader
+ self.usrconf = V9UserConfiguration
+ self.usrdebg = V9DebugSettings
+ _UserGenerator.__init__(self, dspfile, source, env)
+
+ def UserProject(self):
+ confkeys = sorted(self.configs.keys())
+ for kind in confkeys:
+ variant = self.configs[kind].variant
+ platform = self.configs[kind].platform
+ debug = self.configs[kind].debug
+ if debug:
+ debug_settings = '\n'.join(['\t\t\t\t%s="%s"' % (key, xmlify(value))
+ for key, value in debug.items()
+ if value is not None])
+ self.usrfile.write(self.usrconf % locals())
+ self.usrfile.write('\t</Configurations>\n</VisualStudioUserFile>')
+
+V10UserHeader = """\
+<?xml version="1.0" encoding="%(encoding)s"?>
+<Project ToolsVersion="%(versionstr)s" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+"""
+
+V10UserConfiguration = """\
+\t<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='%(variant)s|%(platform)s'">
+%(debug_settings)s
+\t</PropertyGroup>
+"""
+
+V10DebugSettings = {
+'LocalDebuggerCommand': None,
+'LocalDebuggerCommandArguments': None,
+'LocalDebuggerEnvironment': None,
+'DebuggerFlavor': 'WindowsLocalDebugger',
+'LocalDebuggerWorkingDirectory': None,
+'LocalDebuggerAttach': None,
+'LocalDebuggerDebuggerType': None,
+'LocalDebuggerMergeEnvironment': None,
+'LocalDebuggerSQLDebugging': None,
+'RemoteDebuggerCommand': None,
+'RemoteDebuggerCommandArguments': None,
+'RemoteDebuggerWorkingDirectory': None,
+'RemoteDebuggerServerName': None,
+'RemoteDebuggerConnection': None,
+'RemoteDebuggerDebuggerType': None,
+'RemoteDebuggerAttach': None,
+'RemoteDebuggerSQLDebugging': None,
+'DeploymentDirectory': None,
+'AdditionalFiles': None,
+'RemoteDebuggerDeployDebugCppRuntime': None,
+'WebBrowserDebuggerHttpUrl': None,
+'WebBrowserDebuggerDebuggerType': None,
+'WebServiceDebuggerHttpUrl': None,
+'WebServiceDebuggerDebuggerType': None,
+'WebServiceDebuggerSQLDebugging': None,
+}
+
+class _GenerateV10User(_UserGenerator):
+ """Generates a Project'user file for MSVS 2010"""
+
+ def __init__(self, dspfile, source, env):
+ self.versionstr = '4.0'
+ self.usrhead = V10UserHeader
+ self.usrconf = V10UserConfiguration
+ self.usrdebg = V10DebugSettings
+ _UserGenerator.__init__(self, dspfile, source, env)
+
+ def UserProject(self):
+ confkeys = sorted(self.configs.keys())
+ for kind in confkeys:
+ variant = self.configs[kind].variant
+ platform = self.configs[kind].platform
+ debug = self.configs[kind].debug
+ if debug:
+ debug_settings = '\n'.join(['\t\t<%s>%s</%s>' % (key, xmlify(value), key)
+ for key, value in debug.items()
+ if value is not None])
+ self.usrfile.write(self.usrconf % locals())
+ self.usrfile.write('</Project>')
+
+class _DSPGenerator(object):
+ """ Base class for DSP generators """
+
+ srcargs = [
+ 'srcs',
+ 'incs',
+ 'localincs',
+ 'resources',
+ 'misc']
+
+ def __init__(self, dspfile, source, env):
+ self.dspfile = str(dspfile)
+ try:
+ get_abspath = dspfile.get_abspath
+ except AttributeError:
+ self.dspabs = os.path.abspath(dspfile)
+ else:
+ self.dspabs = get_abspath()
+
+ if 'variant' not in env:
+ raise SCons.Errors.InternalError("You must specify a 'variant' argument (i.e. 'Debug' or " +\
+ "'Release') to create an MSVSProject.")
+ elif SCons.Util.is_String(env['variant']):
+ variants = [env['variant']]
+ elif SCons.Util.is_List(env['variant']):
+ variants = env['variant']
+
+ if 'buildtarget' not in env or env['buildtarget'] == None:
+ buildtarget = ['']
+ elif SCons.Util.is_String(env['buildtarget']):
+ buildtarget = [env['buildtarget']]
+ elif SCons.Util.is_List(env['buildtarget']):
+ if len(env['buildtarget']) != len(variants):
+ raise SCons.Errors.InternalError("Sizes of 'buildtarget' and 'variant' lists must be the same.")
+ buildtarget = []
+ for bt in env['buildtarget']:
+ if SCons.Util.is_String(bt):
+ buildtarget.append(bt)
+ else:
+ buildtarget.append(bt.get_abspath())
+ else:
+ buildtarget = [env['buildtarget'].get_abspath()]
+ if len(buildtarget) == 1:
+ bt = buildtarget[0]
+ buildtarget = []
+ for _ in variants:
+ buildtarget.append(bt)
+
+ if 'outdir' not in env or env['outdir'] == None:
+ outdir = ['']
+ elif SCons.Util.is_String(env['outdir']):
+ outdir = [env['outdir']]
+ elif SCons.Util.is_List(env['outdir']):
+ if len(env['outdir']) != len(variants):
+ raise SCons.Errors.InternalError("Sizes of 'outdir' and 'variant' lists must be the same.")
+ outdir = []
+ for s in env['outdir']:
+ if SCons.Util.is_String(s):
+ outdir.append(s)
+ else:
+ outdir.append(s.get_abspath())
+ else:
+ outdir = [env['outdir'].get_abspath()]
+ if len(outdir) == 1:
+ s = outdir[0]
+ outdir = []
+ for v in variants:
+ outdir.append(s)
+
+ if 'runfile' not in env or env['runfile'] == None:
+ runfile = buildtarget[-1:]
+ elif SCons.Util.is_String(env['runfile']):
+ runfile = [env['runfile']]
+ elif SCons.Util.is_List(env['runfile']):
+ if len(env['runfile']) != len(variants):
+ raise SCons.Errors.InternalError("Sizes of 'runfile' and 'variant' lists must be the same.")
+ runfile = []
+ for s in env['runfile']:
+ if SCons.Util.is_String(s):
+ runfile.append(s)
+ else:
+ runfile.append(s.get_abspath())
+ else:
+ runfile = [env['runfile'].get_abspath()]
+ if len(runfile) == 1:
+ s = runfile[0]
+ runfile = []
+ for v in variants:
+ runfile.append(s)
+
+ self.sconscript = env['MSVSSCONSCRIPT']
+
+ if 'cmdargs' not in env or env['cmdargs'] == None:
+ cmdargs = [''] * len(variants)
+ elif SCons.Util.is_String(env['cmdargs']):
+ cmdargs = [env['cmdargs']] * len(variants)
+ elif SCons.Util.is_List(env['cmdargs']):
+ if len(env['cmdargs']) != len(variants):
+ raise SCons.Errors.InternalError("Sizes of 'cmdargs' and 'variant' lists must be the same.")
+ else:
+ cmdargs = env['cmdargs']
+
+ self.env = env
+
+ if 'name' in self.env:
+ self.name = self.env['name']
+ else:
+ self.name = os.path.basename(SCons.Util.splitext(self.dspfile)[0])
+ self.name = self.env.subst(self.name)
+
+ sourcenames = [
+ 'Source Files',
+ 'Header Files',
+ 'Local Headers',
+ 'Resource Files',
+ 'Other Files']
+
+ self.sources = {}
+ for n in sourcenames:
+ self.sources[n] = []
+
+ self.configs = {}
+
+ self.nokeep = 0
+ if 'nokeep' in env and env['variant'] != 0:
+ self.nokeep = 1
+
+ if self.nokeep == 0 and os.path.exists(self.dspabs):
+ self.Parse()
+
+ for t in zip(sourcenames,self.srcargs):
+ if t[1] in self.env:
+ if SCons.Util.is_List(self.env[t[1]]):
+ for i in self.env[t[1]]:
+ if not i in self.sources[t[0]]:
+ self.sources[t[0]].append(i)
+ else:
+ if not self.env[t[1]] in self.sources[t[0]]:
+ self.sources[t[0]].append(self.env[t[1]])
+
+ for n in sourcenames:
+ self.sources[n].sort(key=lambda a: a.lower())
+
+ def AddConfig(self, variant, buildtarget, outdir, runfile, cmdargs, dspfile=dspfile):
+ config = Config()
+ config.buildtarget = buildtarget
+ config.outdir = outdir
+ config.cmdargs = cmdargs
+ config.runfile = runfile
+
+ match = re.match('(.*)\|(.*)', variant)
+ if match:
+ config.variant = match.group(1)
+ config.platform = match.group(2)
+ else:
+ config.variant = variant
+ config.platform = 'Win32'
+
+ self.configs[variant] = config
+ print("Adding '" + self.name + ' - ' + config.variant + '|' + config.platform + "' to '" + str(dspfile) + "'")
+
+ for i in range(len(variants)):
+ AddConfig(self, variants[i], buildtarget[i], outdir[i], runfile[i], cmdargs[i])
+
+ self.platforms = []
+ for key in list(self.configs.keys()):
+ platform = self.configs[key].platform
+ if not platform in self.platforms:
+ self.platforms.append(platform)
+
+ def Build(self):
+ pass
+
+V6DSPHeader = """\
+# Microsoft Developer Studio Project File - Name="%(name)s" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) External Target" 0x0106
+
+CFG=%(name)s - Win32 %(confkey)s
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE
+!MESSAGE NMAKE /f "%(name)s.mak".
+!MESSAGE
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE
+!MESSAGE NMAKE /f "%(name)s.mak" CFG="%(name)s - Win32 %(confkey)s"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+"""
+
+class _GenerateV6DSP(_DSPGenerator):
+ """Generates a Project file for MSVS 6.0"""
+
+ def PrintHeader(self):
+ # pick a default config
+ confkeys = sorted(self.configs.keys())
+
+ name = self.name
+ confkey = confkeys[0]
+
+ self.file.write(V6DSPHeader % locals())
+
+ for kind in confkeys:
+ self.file.write('!MESSAGE "%s - Win32 %s" (based on "Win32 (x86) External Target")\n' % (name, kind))
+
+ self.file.write('!MESSAGE \n\n')
+
+ def PrintProject(self):
+ name = self.name
+ self.file.write('# Begin Project\n'
+ '# PROP AllowPerConfigDependencies 0\n'
+ '# PROP Scc_ProjName ""\n'
+ '# PROP Scc_LocalPath ""\n\n')
+
+ first = 1
+ confkeys = sorted(self.configs.keys())
+ for kind in confkeys:
+ outdir = self.configs[kind].outdir
+ buildtarget = self.configs[kind].buildtarget
+ if first == 1:
+ self.file.write('!IF "$(CFG)" == "%s - Win32 %s"\n\n' % (name, kind))
+ first = 0
+ else:
+ self.file.write('\n!ELSEIF "$(CFG)" == "%s - Win32 %s"\n\n' % (name, kind))
+
+ env_has_buildtarget = 'MSVSBUILDTARGET' in self.env
+ if not env_has_buildtarget:
+ self.env['MSVSBUILDTARGET'] = buildtarget
+
+ # have to write this twice, once with the BASE settings, and once without
+ for base in ("BASE ",""):
+ self.file.write('# PROP %sUse_MFC 0\n'
+ '# PROP %sUse_Debug_Libraries ' % (base, base))
+ if kind.lower().find('debug') < 0:
+ self.file.write('0\n')
+ else:
+ self.file.write('1\n')
+ self.file.write('# PROP %sOutput_Dir "%s"\n'
+ '# PROP %sIntermediate_Dir "%s"\n' % (base,outdir,base,outdir))
+ cmd = 'echo Starting SCons && ' + self.env.subst('$MSVSBUILDCOM', 1)
+ self.file.write('# PROP %sCmd_Line "%s"\n'
+ '# PROP %sRebuild_Opt "-c && %s"\n'
+ '# PROP %sTarget_File "%s"\n'
+ '# PROP %sBsc_Name ""\n'
+ '# PROP %sTarget_Dir ""\n'\
+ %(base,cmd,base,cmd,base,buildtarget,base,base))
+
+ if not env_has_buildtarget:
+ del self.env['MSVSBUILDTARGET']
+
+ self.file.write('\n!ENDIF\n\n'
+ '# Begin Target\n\n')
+ for kind in confkeys:
+ self.file.write('# Name "%s - Win32 %s"\n' % (name,kind))
+ self.file.write('\n')
+ first = 0
+ for kind in confkeys:
+ if first == 0:
+ self.file.write('!IF "$(CFG)" == "%s - Win32 %s"\n\n' % (name,kind))
+ first = 1
+ else:
+ self.file.write('!ELSEIF "$(CFG)" == "%s - Win32 %s"\n\n' % (name,kind))
+ self.file.write('!ENDIF \n\n')
+ self.PrintSourceFiles()
+ self.file.write('# End Target\n'
+ '# End Project\n')
+
+ if self.nokeep == 0:
+ # now we pickle some data and add it to the file -- MSDEV will ignore it.
+ pdata = pickle.dumps(self.configs,PICKLE_PROTOCOL)
+ pdata = base64.encodestring(pdata).decode()
+ self.file.write(pdata + '\n')
+ pdata = pickle.dumps(self.sources,PICKLE_PROTOCOL)
+ pdata = base64.encodestring(pdata).decode()
+ self.file.write(pdata + '\n')
+
+ def PrintSourceFiles(self):
+ categories = {'Source Files': 'cpp|c|cxx|l|y|def|odl|idl|hpj|bat',
+ 'Header Files': 'h|hpp|hxx|hm|inl',
+ 'Local Headers': 'h|hpp|hxx|hm|inl',
+ 'Resource Files': 'r|rc|ico|cur|bmp|dlg|rc2|rct|bin|cnt|rtf|gif|jpg|jpeg|jpe',
+ 'Other Files': ''}
+
+ for kind in sorted(list(categories.keys()), key=lambda a: a.lower()):
+ if not self.sources[kind]:
+ continue # skip empty groups
+
+ self.file.write('# Begin Group "' + kind + '"\n\n')
+ typelist = categories[kind].replace('|', ';')
+ self.file.write('# PROP Default_Filter "' + typelist + '"\n')
+
+ for file in self.sources[kind]:
+ file = os.path.normpath(file)
+ self.file.write('# Begin Source File\n\n'
+ 'SOURCE="' + file + '"\n'
+ '# End Source File\n')
+ self.file.write('# End Group\n')
+
+ # add the SConscript file outside of the groups
+ self.file.write('# Begin Source File\n\n'
+ 'SOURCE="' + str(self.sconscript) + '"\n'
+ '# End Source File\n')
+
+ def Parse(self):
+ try:
+ dspfile = open(self.dspabs,'r')
+ except IOError:
+ return # doesn't exist yet, so can't add anything to configs.
+
+ line = dspfile.readline()
+ while line:
+ if line.find("# End Project") > -1:
+ break
+ line = dspfile.readline()
+
+ line = dspfile.readline()
+ datas = line
+ while line and line != '\n':
+ line = dspfile.readline()
+ datas = datas + line
+
+ # OK, we've found our little pickled cache of data.
+ try:
+ datas = base64.decodestring(datas)
+ data = pickle.loads(datas)
+ except KeyboardInterrupt:
+ raise
+ except:
+ return # unable to unpickle any data for some reason
+
+ self.configs.update(data)
+
+ data = None
+ line = dspfile.readline()
+ datas = line
+ while line and line != '\n':
+ line = dspfile.readline()
+ datas = datas + line
+
+ # OK, we've found our little pickled cache of data.
+ # it has a "# " in front of it, so we strip that.
+ try:
+ datas = base64.decodestring(datas)
+ data = pickle.loads(datas)
+ except KeyboardInterrupt:
+ raise
+ except:
+ return # unable to unpickle any data for some reason
+
+ self.sources.update(data)
+
+ def Build(self):
+ try:
+ self.file = open(self.dspabs,'w')
+ except IOError as detail:
+ raise SCons.Errors.InternalError('Unable to open "' + self.dspabs + '" for writing:' + str(detail))
+ else:
+ self.PrintHeader()
+ self.PrintProject()
+ self.file.close()
+
+V7DSPHeader = """\
+<?xml version="1.0" encoding="%(encoding)s"?>
+<VisualStudioProject
+\tProjectType="Visual C++"
+\tVersion="%(versionstr)s"
+\tName="%(name)s"
+\tProjectGUID="%(project_guid)s"
+%(scc_attrs)s
+\tKeyword="MakeFileProj">
+"""
+
+V7DSPConfiguration = """\
+\t\t<Configuration
+\t\t\tName="%(variant)s|%(platform)s"
+\t\t\tOutputDirectory="%(outdir)s"
+\t\t\tIntermediateDirectory="%(outdir)s"
+\t\t\tConfigurationType="0"
+\t\t\tUseOfMFC="0"
+\t\t\tATLMinimizesCRunTimeLibraryUsage="FALSE">
+\t\t\t<Tool
+\t\t\t\tName="VCNMakeTool"
+\t\t\t\tBuildCommandLine="%(buildcmd)s"
+\t\t\t\tReBuildCommandLine="%(rebuildcmd)s"
+\t\t\t\tCleanCommandLine="%(cleancmd)s"
+\t\t\t\tOutput="%(runfile)s"/>
+\t\t</Configuration>
+"""
+
+V8DSPHeader = """\
+<?xml version="1.0" encoding="%(encoding)s"?>
+<VisualStudioProject
+\tProjectType="Visual C++"
+\tVersion="%(versionstr)s"
+\tName="%(name)s"
+\tProjectGUID="%(project_guid)s"
+\tRootNamespace="%(name)s"
+%(scc_attrs)s
+\tKeyword="MakeFileProj">
+"""
+
+V8DSPConfiguration = """\
+\t\t<Configuration
+\t\t\tName="%(variant)s|%(platform)s"
+\t\t\tConfigurationType="0"
+\t\t\tUseOfMFC="0"
+\t\t\tATLMinimizesCRunTimeLibraryUsage="false"
+\t\t\t>
+\t\t\t<Tool
+\t\t\t\tName="VCNMakeTool"
+\t\t\t\tBuildCommandLine="%(buildcmd)s"
+\t\t\t\tReBuildCommandLine="%(rebuildcmd)s"
+\t\t\t\tCleanCommandLine="%(cleancmd)s"
+\t\t\t\tOutput="%(runfile)s"
+\t\t\t\tPreprocessorDefinitions="%(preprocdefs)s"
+\t\t\t\tIncludeSearchPath="%(includepath)s"
+\t\t\t\tForcedIncludes=""
+\t\t\t\tAssemblySearchPath=""
+\t\t\t\tForcedUsingAssemblies=""
+\t\t\t\tCompileAsManaged=""
+\t\t\t/>
+\t\t</Configuration>
+"""
+class _GenerateV7DSP(_DSPGenerator, _GenerateV7User):
+ """Generates a Project file for MSVS .NET"""
+
+ def __init__(self, dspfile, source, env):
+ _DSPGenerator.__init__(self, dspfile, source, env)
+ self.version = env['MSVS_VERSION']
+ self.version_num, self.suite = msvs_parse_version(self.version)
+ if self.version_num >= 9.0:
+ self.versionstr = '9.00'
+ self.dspheader = V8DSPHeader
+ self.dspconfiguration = V8DSPConfiguration
+ elif self.version_num >= 8.0:
+ self.versionstr = '8.00'
+ self.dspheader = V8DSPHeader
+ self.dspconfiguration = V8DSPConfiguration
+ else:
+ if self.version_num >= 7.1:
+ self.versionstr = '7.10'
+ else:
+ self.versionstr = '7.00'
+ self.dspheader = V7DSPHeader
+ self.dspconfiguration = V7DSPConfiguration
+ self.file = None
+
+ _GenerateV7User.__init__(self, dspfile, source, env)
+
+ def PrintHeader(self):
+ env = self.env
+ versionstr = self.versionstr
+ name = self.name
+ encoding = self.env.subst('$MSVSENCODING')
+ scc_provider = env.get('MSVS_SCC_PROVIDER', '')
+ scc_project_name = env.get('MSVS_SCC_PROJECT_NAME', '')
+ scc_aux_path = env.get('MSVS_SCC_AUX_PATH', '')
+ # MSVS_SCC_LOCAL_PATH is kept for backwards compatibility purpose and should
+ # be deprecated as soon as possible.
+ scc_local_path_legacy = env.get('MSVS_SCC_LOCAL_PATH', '')
+ scc_connection_root = env.get('MSVS_SCC_CONNECTION_ROOT', os.curdir)
+ scc_local_path = os.path.relpath(scc_connection_root, os.path.dirname(self.dspabs))
+ project_guid = env.get('MSVS_PROJECT_GUID', '')
+ if not project_guid:
+ project_guid = _generateGUID(self.dspfile, '')
+ if scc_provider != '':
+ scc_attrs = '\tSccProjectName="%s"\n' % scc_project_name
+ if scc_aux_path != '':
+ scc_attrs += '\tSccAuxPath="%s"\n' % scc_aux_path
+ scc_attrs += ('\tSccLocalPath="%s"\n'
+ '\tSccProvider="%s"' % (scc_local_path, scc_provider))
+ elif scc_local_path_legacy != '':
+ # This case is kept for backwards compatibility purpose and should
+ # be deprecated as soon as possible.
+ scc_attrs = ('\tSccProjectName="%s"\n'
+ '\tSccLocalPath="%s"' % (scc_project_name, scc_local_path_legacy))
+ else:
+ self.dspheader = self.dspheader.replace('%(scc_attrs)s\n', '')
+
+ self.file.write(self.dspheader % locals())
+
+ self.file.write('\t<Platforms>\n')
+ for platform in self.platforms:
+ self.file.write(
+ '\t\t<Platform\n'
+ '\t\t\tName="%s"/>\n' % platform)
+ self.file.write('\t</Platforms>\n')
+
+ if self.version_num >= 8.0:
+ self.file.write('\t<ToolFiles>\n'
+ '\t</ToolFiles>\n')
+
+ def PrintProject(self):
+ self.file.write('\t<Configurations>\n')
+
+ confkeys = sorted(self.configs.keys())
+ for kind in confkeys:
+ variant = self.configs[kind].variant
+ platform = self.configs[kind].platform
+ outdir = self.configs[kind].outdir
+ buildtarget = self.configs[kind].buildtarget
+ runfile = self.configs[kind].runfile
+ cmdargs = self.configs[kind].cmdargs
+
+ env_has_buildtarget = 'MSVSBUILDTARGET' in self.env
+ if not env_has_buildtarget:
+ self.env['MSVSBUILDTARGET'] = buildtarget
+
+ starting = 'echo Starting SCons && '
+ if cmdargs:
+ cmdargs = ' ' + cmdargs
+ else:
+ cmdargs = ''
+ buildcmd = xmlify(starting + self.env.subst('$MSVSBUILDCOM', 1) + cmdargs)
+ rebuildcmd = xmlify(starting + self.env.subst('$MSVSREBUILDCOM', 1) + cmdargs)
+ cleancmd = xmlify(starting + self.env.subst('$MSVSCLEANCOM', 1) + cmdargs)
+
+ # This isn't perfect; CPPDEFINES and CPPPATH can contain $TARGET and $SOURCE,
+ # so they could vary depending on the command being generated. This code
+ # assumes they don't.
+ preprocdefs = xmlify(';'.join(processDefines(self.env.get('CPPDEFINES', []))))
+ includepath_Dirs = processIncludes(self.env.get('CPPPATH', []), self.env, None, None)
+ includepath = xmlify(';'.join([str(x) for x in includepath_Dirs]))
+
+ if not env_has_buildtarget:
+ del self.env['MSVSBUILDTARGET']
+
+ self.file.write(self.dspconfiguration % locals())
+
+ self.file.write('\t</Configurations>\n')
+
+ if self.version_num >= 7.1:
+ self.file.write('\t<References>\n'
+ '\t</References>\n')
+
+ self.PrintSourceFiles()
+
+ self.file.write('</VisualStudioProject>\n')
+
+ if self.nokeep == 0:
+ # now we pickle some data and add it to the file -- MSDEV will ignore it.
+ pdata = pickle.dumps(self.configs,PICKLE_PROTOCOL)
+ pdata = base64.encodestring(pdata).decode()
+ self.file.write('<!-- SCons Data:\n' + pdata + '\n')
+ pdata = pickle.dumps(self.sources,PICKLE_PROTOCOL)
+ pdata = base64.encodestring(pdata).decode()
+ self.file.write(pdata + '-->\n')
+
+ def printSources(self, hierarchy, commonprefix):
+ sorteditems = sorted(hierarchy.items(), key=lambda a: a[0].lower())
+
+ # First folders, then files
+ for key, value in sorteditems:
+ if SCons.Util.is_Dict(value):
+ self.file.write('\t\t\t<Filter\n'
+ '\t\t\t\tName="%s"\n'
+ '\t\t\t\tFilter="">\n' % (key))
+ self.printSources(value, commonprefix)
+ self.file.write('\t\t\t</Filter>\n')
+
+ for key, value in sorteditems:
+ if SCons.Util.is_String(value):
+ file = value
+ if commonprefix:
+ file = os.path.join(commonprefix, value)
+ file = os.path.normpath(file)
+ self.file.write('\t\t\t<File\n'
+ '\t\t\t\tRelativePath="%s">\n'
+ '\t\t\t</File>\n' % (file))
+
+ def PrintSourceFiles(self):
+ categories = {'Source Files': 'cpp;c;cxx;l;y;def;odl;idl;hpj;bat',
+ 'Header Files': 'h;hpp;hxx;hm;inl',
+ 'Local Headers': 'h;hpp;hxx;hm;inl',
+ 'Resource Files': 'r;rc;ico;cur;bmp;dlg;rc2;rct;bin;cnt;rtf;gif;jpg;jpeg;jpe',
+ 'Other Files': ''}
+
+ self.file.write('\t<Files>\n')
+
+ cats = sorted([k for k in list(categories.keys()) if self.sources[k]],
+ key=lambda a: a.lower())
+ for kind in cats:
+ if len(cats) > 1:
+ self.file.write('\t\t<Filter\n'
+ '\t\t\tName="%s"\n'
+ '\t\t\tFilter="%s">\n' % (kind, categories[kind]))
+
+ sources = self.sources[kind]
+
+ # First remove any common prefix
+ commonprefix = None
+ s = list(map(os.path.normpath, sources))
+ # take the dirname because the prefix may include parts
+ # of the filenames (e.g. if you have 'dir\abcd' and
+ # 'dir\acde' then the cp will be 'dir\a' )
+ cp = os.path.dirname( os.path.commonprefix(s) )
+ if cp and s[0][len(cp)] == os.sep:
+ # +1 because the filename starts after the separator
+ sources = [s[len(cp)+1:] for s in sources]
+ commonprefix = cp
+
+ hierarchy = makeHierarchy(sources)
+ self.printSources(hierarchy, commonprefix=commonprefix)
+
+ if len(cats)>1:
+ self.file.write('\t\t</Filter>\n')
+
+ # add the SConscript file outside of the groups
+ self.file.write('\t\t<File\n'
+ '\t\t\tRelativePath="%s">\n'
+ '\t\t</File>\n' % str(self.sconscript))
+
+ self.file.write('\t</Files>\n'
+ '\t<Globals>\n'
+ '\t</Globals>\n')
+
+ def Parse(self):
+ try:
+ dspfile = open(self.dspabs,'r')
+ except IOError:
+ return # doesn't exist yet, so can't add anything to configs.
+
+ line = dspfile.readline()
+ while line:
+ if line.find('<!-- SCons Data:') > -1:
+ break
+ line = dspfile.readline()
+
+ line = dspfile.readline()
+ datas = line
+ while line and line != '\n':
+ line = dspfile.readline()
+ datas = datas + line
+
+ # OK, we've found our little pickled cache of data.
+ try:
+ datas = base64.decodestring(datas)
+ data = pickle.loads(datas)
+ except KeyboardInterrupt:
+ raise
+ except:
+ return # unable to unpickle any data for some reason
+
+ self.configs.update(data)
+
+ data = None
+ line = dspfile.readline()
+ datas = line
+ while line and line != '\n':
+ line = dspfile.readline()
+ datas = datas + line
+
+ # OK, we've found our little pickled cache of data.
+ try:
+ datas = base64.decodestring(datas)
+ data = pickle.loads(datas)
+ except KeyboardInterrupt:
+ raise
+ except:
+ return # unable to unpickle any data for some reason
+
+ self.sources.update(data)
+
+ def Build(self):
+ try:
+ self.file = open(self.dspabs,'w')
+ except IOError as detail:
+ raise SCons.Errors.InternalError('Unable to open "' + self.dspabs + '" for writing:' + str(detail))
+ else:
+ self.PrintHeader()
+ self.PrintProject()
+ self.file.close()
+
+ _GenerateV7User.Build(self)
+
+V10DSPHeader = """\
+<?xml version="1.0" encoding="%(encoding)s"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+"""
+
+V10DSPProjectConfiguration = """\
+\t\t<ProjectConfiguration Include="%(variant)s|%(platform)s">
+\t\t\t<Configuration>%(variant)s</Configuration>
+\t\t\t<Platform>%(platform)s</Platform>
+\t\t</ProjectConfiguration>
+"""
+
+V10DSPGlobals = """\
+\t<PropertyGroup Label="Globals">
+\t\t<ProjectGuid>%(project_guid)s</ProjectGuid>
+%(scc_attrs)s\t\t<RootNamespace>%(name)s</RootNamespace>
+\t\t<Keyword>MakeFileProj</Keyword>
+\t</PropertyGroup>
+"""
+
+V10DSPPropertyGroupCondition = """\
+\t<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='%(variant)s|%(platform)s'" Label="Configuration">
+\t\t<ConfigurationType>Makefile</ConfigurationType>
+\t\t<UseOfMfc>false</UseOfMfc>
+\t\t<PlatformToolset>%(toolset)s</PlatformToolset>
+\t</PropertyGroup>
+"""
+
+V10DSPImportGroupCondition = """\
+\t<ImportGroup Condition="'$(Configuration)|$(Platform)'=='%(variant)s|%(platform)s'" Label="PropertySheets">
+\t\t<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+\t</ImportGroup>
+"""
+
+V10DSPCommandLine = """\
+\t\t<NMakeBuildCommandLine Condition="'$(Configuration)|$(Platform)'=='%(variant)s|%(platform)s'">%(buildcmd)s</NMakeBuildCommandLine>
+\t\t<NMakeReBuildCommandLine Condition="'$(Configuration)|$(Platform)'=='%(variant)s|%(platform)s'">%(rebuildcmd)s</NMakeReBuildCommandLine>
+\t\t<NMakeCleanCommandLine Condition="'$(Configuration)|$(Platform)'=='%(variant)s|%(platform)s'">%(cleancmd)s</NMakeCleanCommandLine>
+\t\t<NMakeOutput Condition="'$(Configuration)|$(Platform)'=='%(variant)s|%(platform)s'">%(runfile)s</NMakeOutput>
+\t\t<NMakePreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='%(variant)s|%(platform)s'">%(preprocdefs)s</NMakePreprocessorDefinitions>
+\t\t<NMakeIncludeSearchPath Condition="'$(Configuration)|$(Platform)'=='%(variant)s|%(platform)s'">%(includepath)s</NMakeIncludeSearchPath>
+\t\t<NMakeForcedIncludes Condition="'$(Configuration)|$(Platform)'=='%(variant)s|%(platform)s'">$(NMakeForcedIncludes)</NMakeForcedIncludes>
+\t\t<NMakeAssemblySearchPath Condition="'$(Configuration)|$(Platform)'=='%(variant)s|%(platform)s'">$(NMakeAssemblySearchPath)</NMakeAssemblySearchPath>
+\t\t<NMakeForcedUsingAssemblies Condition="'$(Configuration)|$(Platform)'=='%(variant)s|%(platform)s'">$(NMakeForcedUsingAssemblies)</NMakeForcedUsingAssemblies>
+"""
+
+class _GenerateV10DSP(_DSPGenerator, _GenerateV10User):
+ """Generates a Project file for MSVS 2010"""
+
+ def __init__(self, dspfile, source, env):
+ _DSPGenerator.__init__(self, dspfile, source, env)
+ self.dspheader = V10DSPHeader
+ self.dspconfiguration = V10DSPProjectConfiguration
+ self.dspglobals = V10DSPGlobals
+
+ _GenerateV10User.__init__(self, dspfile, source, env)
+
+ def PrintHeader(self):
+ env = self.env
+ name = self.name
+ encoding = env.subst('$MSVSENCODING')
+ project_guid = env.get('MSVS_PROJECT_GUID', '')
+ scc_provider = env.get('MSVS_SCC_PROVIDER', '')
+ scc_project_name = env.get('MSVS_SCC_PROJECT_NAME', '')
+ scc_aux_path = env.get('MSVS_SCC_AUX_PATH', '')
+ # MSVS_SCC_LOCAL_PATH is kept for backwards compatibility purpose and should
+ # be deprecated as soon as possible.
+ scc_local_path_legacy = env.get('MSVS_SCC_LOCAL_PATH', '')
+ scc_connection_root = env.get('MSVS_SCC_CONNECTION_ROOT', os.curdir)
+ scc_local_path = os.path.relpath(scc_connection_root, os.path.dirname(self.dspabs))
+ if not project_guid:
+ project_guid = _generateGUID(self.dspfile, '')
+ if scc_provider != '':
+ scc_attrs = '\t\t<SccProjectName>%s</SccProjectName>\n' % scc_project_name
+ if scc_aux_path != '':
+ scc_attrs += '\t\t<SccAuxPath>%s</SccAuxPath>\n' % scc_aux_path
+ scc_attrs += ('\t\t<SccLocalPath>%s</SccLocalPath>\n'
+ '\t\t<SccProvider>%s</SccProvider>\n' % (scc_local_path, scc_provider))
+ elif scc_local_path_legacy != '':
+ # This case is kept for backwards compatibility purpose and should
+ # be deprecated as soon as possible.
+ scc_attrs = ('\t\t<SccProjectName>%s</SccProjectName>\n'
+ '\t\t<SccLocalPath>%s</SccLocalPath>\n' % (scc_project_name, scc_local_path_legacy))
+ else:
+ self.dspglobals = self.dspglobals.replace('%(scc_attrs)s', '')
+
+ self.file.write(self.dspheader % locals())
+
+ self.file.write('\t<ItemGroup Label="ProjectConfigurations">\n')
+
+ confkeys = sorted(self.configs.keys())
+ for kind in confkeys:
+ variant = self.configs[kind].variant
+ platform = self.configs[kind].platform
+ self.file.write(self.dspconfiguration % locals())
+
+ self.file.write('\t</ItemGroup>\n')
+
+ self.file.write(self.dspglobals % locals())
+
+ def PrintProject(self):
+ name = self.name
+ confkeys = sorted(self.configs.keys())
+
+ self.file.write('\t<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />\n')
+
+ toolset = ''
+ if 'MSVC_VERSION' in self.env:
+ version_num, suite = msvs_parse_version(self.env['MSVC_VERSION'])
+ toolset = 'v%d' % (version_num * 10)
+ for kind in confkeys:
+ variant = self.configs[kind].variant
+ platform = self.configs[kind].platform
+ self.file.write(V10DSPPropertyGroupCondition % locals())
+
+ self.file.write('\t<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />\n')
+ self.file.write('\t<ImportGroup Label="ExtensionSettings">\n')
+ self.file.write('\t</ImportGroup>\n')
+
+ for kind in confkeys:
+ variant = self.configs[kind].variant
+ platform = self.configs[kind].platform
+ self.file.write(V10DSPImportGroupCondition % locals())
+
+ self.file.write('\t<PropertyGroup Label="UserMacros" />\n')
+ self.file.write('\t<PropertyGroup>\n')
+ self.file.write('\t<_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>\n')
+
+ for kind in confkeys:
+ variant = self.configs[kind].variant
+ platform = self.configs[kind].platform
+ outdir = self.configs[kind].outdir
+ buildtarget = self.configs[kind].buildtarget
+ runfile = self.configs[kind].runfile
+ cmdargs = self.configs[kind].cmdargs
+
+ env_has_buildtarget = 'MSVSBUILDTARGET' in self.env
+ if not env_has_buildtarget:
+ self.env['MSVSBUILDTARGET'] = buildtarget
+
+ starting = 'echo Starting SCons && '
+ if cmdargs:
+ cmdargs = ' ' + cmdargs
+ else:
+ cmdargs = ''
+ buildcmd = xmlify(starting + self.env.subst('$MSVSBUILDCOM', 1) + cmdargs)
+ rebuildcmd = xmlify(starting + self.env.subst('$MSVSREBUILDCOM', 1) + cmdargs)
+ cleancmd = xmlify(starting + self.env.subst('$MSVSCLEANCOM', 1) + cmdargs)
+
+ # This isn't perfect; CPPDEFINES and CPPPATH can contain $TARGET and $SOURCE,
+ # so they could vary depending on the command being generated. This code
+ # assumes they don't.
+ preprocdefs = xmlify(';'.join(processDefines(self.env.get('CPPDEFINES', []))))
+ includepath_Dirs = processIncludes(self.env.get('CPPPATH', []), self.env, None, None)
+ includepath = xmlify(';'.join([str(x) for x in includepath_Dirs]))
+
+ if not env_has_buildtarget:
+ del self.env['MSVSBUILDTARGET']
+
+ self.file.write(V10DSPCommandLine % locals())
+
+ self.file.write('\t</PropertyGroup>\n')
+
+ #filter settings in MSVS 2010 are stored in separate file
+ self.filtersabs = self.dspabs + '.filters'
+ try:
+ self.filters_file = open(self.filtersabs, 'w')
+ except IOError as detail:
+ raise SCons.Errors.InternalError('Unable to open "' + self.filtersabs + '" for writing:' + str(detail))
+
+ self.filters_file.write('<?xml version="1.0" encoding="utf-8"?>\n'
+ '<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">\n')
+
+ self.PrintSourceFiles()
+
+ self.filters_file.write('</Project>')
+ self.filters_file.close()
+
+ self.file.write('\t<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />\n'
+ '\t<ImportGroup Label="ExtensionTargets">\n'
+ '\t</ImportGroup>\n'
+ '</Project>\n')
+
+ if self.nokeep == 0:
+ # now we pickle some data and add it to the file -- MSDEV will ignore it.
+ pdata = pickle.dumps(self.configs,PICKLE_PROTOCOL)
+ pdata = base64.encodestring(pdata).decode()
+ self.file.write('<!-- SCons Data:\n' + pdata + '\n')
+ pdata = pickle.dumps(self.sources,PICKLE_PROTOCOL)
+ pdata = base64.encodestring(pdata).decode()
+ self.file.write(pdata + '-->\n')
+
+ def printFilters(self, hierarchy, name):
+ sorteditems = sorted(hierarchy.items(), key = lambda a: a[0].lower())
+
+ for key, value in sorteditems:
+ if SCons.Util.is_Dict(value):
+ filter_name = name + '\\' + key
+ self.filters_file.write('\t\t<Filter Include="%s">\n'
+ '\t\t\t<UniqueIdentifier>%s</UniqueIdentifier>\n'
+ '\t\t</Filter>\n' % (filter_name, _generateGUID(self.dspabs, filter_name)))
+ self.printFilters(value, filter_name)
+
+ def printSources(self, hierarchy, kind, commonprefix, filter_name):
+ keywords = {'Source Files': 'ClCompile',
+ 'Header Files': 'ClInclude',
+ 'Local Headers': 'ClInclude',
+ 'Resource Files': 'None',
+ 'Other Files': 'None'}
+
+ sorteditems = sorted(hierarchy.items(), key = lambda a: a[0].lower())
+
+ # First folders, then files
+ for key, value in sorteditems:
+ if SCons.Util.is_Dict(value):
+ self.printSources(value, kind, commonprefix, filter_name + '\\' + key)
+
+ for key, value in sorteditems:
+ if SCons.Util.is_String(value):
+ file = value
+ if commonprefix:
+ file = os.path.join(commonprefix, value)
+ file = os.path.normpath(file)
+
+ self.file.write('\t\t<%s Include="%s" />\n' % (keywords[kind], file))
+ self.filters_file.write('\t\t<%s Include="%s">\n'
+ '\t\t\t<Filter>%s</Filter>\n'
+ '\t\t</%s>\n' % (keywords[kind], file, filter_name, keywords[kind]))
+
+ def PrintSourceFiles(self):
+ categories = {'Source Files': 'cpp;c;cxx;l;y;def;odl;idl;hpj;bat',
+ 'Header Files': 'h;hpp;hxx;hm;inl',
+ 'Local Headers': 'h;hpp;hxx;hm;inl',
+ 'Resource Files': 'r;rc;ico;cur;bmp;dlg;rc2;rct;bin;cnt;rtf;gif;jpg;jpeg;jpe',
+ 'Other Files': ''}
+
+ cats = sorted([k for k in list(categories.keys()) if self.sources[k]],
+ key = lambda a: a.lower())
+
+ # print vcxproj.filters file first
+ self.filters_file.write('\t<ItemGroup>\n')
+ for kind in cats:
+ self.filters_file.write('\t\t<Filter Include="%s">\n'
+ '\t\t\t<UniqueIdentifier>{7b42d31d-d53c-4868-8b92-ca2bc9fc052f}</UniqueIdentifier>\n'
+ '\t\t\t<Extensions>%s</Extensions>\n'
+ '\t\t</Filter>\n' % (kind, categories[kind]))
+
+ # First remove any common prefix
+ sources = self.sources[kind]
+ commonprefix = None
+ s = list(map(os.path.normpath, sources))
+ # take the dirname because the prefix may include parts
+ # of the filenames (e.g. if you have 'dir\abcd' and
+ # 'dir\acde' then the cp will be 'dir\a' )
+ cp = os.path.dirname( os.path.commonprefix(s) )
+ if cp and s[0][len(cp)] == os.sep:
+ # +1 because the filename starts after the separator
+ sources = [s[len(cp)+1:] for s in sources]
+ commonprefix = cp
+
+ hierarchy = makeHierarchy(sources)
+ self.printFilters(hierarchy, kind)
+
+ self.filters_file.write('\t</ItemGroup>\n')
+
+ # then print files and filters
+ for kind in cats:
+ self.file.write('\t<ItemGroup>\n')
+ self.filters_file.write('\t<ItemGroup>\n')
+
+ # First remove any common prefix
+ sources = self.sources[kind]
+ commonprefix = None
+ s = list(map(os.path.normpath, sources))
+ # take the dirname because the prefix may include parts
+ # of the filenames (e.g. if you have 'dir\abcd' and
+ # 'dir\acde' then the cp will be 'dir\a' )
+ cp = os.path.dirname( os.path.commonprefix(s) )
+ if cp and s[0][len(cp)] == os.sep:
+ # +1 because the filename starts after the separator
+ sources = [s[len(cp)+1:] for s in sources]
+ commonprefix = cp
+
+ hierarchy = makeHierarchy(sources)
+ self.printSources(hierarchy, kind, commonprefix, kind)
+
+ self.file.write('\t</ItemGroup>\n')
+ self.filters_file.write('\t</ItemGroup>\n')
+
+ # add the SConscript file outside of the groups
+ self.file.write('\t<ItemGroup>\n'
+ '\t\t<None Include="%s" />\n'
+ #'\t\t<None Include="SConstruct" />\n'
+ '\t</ItemGroup>\n' % str(self.sconscript))
+
+ def Parse(self):
+ print("_GenerateV10DSP.Parse()")
+
+ def Build(self):
+ try:
+ self.file = open(self.dspabs, 'w')
+ except IOError as detail:
+ raise SCons.Errors.InternalError('Unable to open "' + self.dspabs + '" for writing:' + str(detail))
+ else:
+ self.PrintHeader()
+ self.PrintProject()
+ self.file.close()
+
+ _GenerateV10User.Build(self)
+
+class _DSWGenerator(object):
+ """ Base class for DSW generators """
+ def __init__(self, dswfile, source, env):
+ self.dswfile = os.path.normpath(str(dswfile))
+ self.dsw_folder_path = os.path.dirname(os.path.abspath(self.dswfile))
+ self.env = env
+
+ if 'projects' not in env:
+ raise SCons.Errors.UserError("You must specify a 'projects' argument to create an MSVSSolution.")
+ projects = env['projects']
+ if not SCons.Util.is_List(projects):
+ raise SCons.Errors.InternalError("The 'projects' argument must be a list of nodes.")
+ projects = SCons.Util.flatten(projects)
+ if len(projects) < 1:
+ raise SCons.Errors.UserError("You must specify at least one project to create an MSVSSolution.")
+ self.dspfiles = list(map(str, projects))
+
+ if 'name' in self.env:
+ self.name = self.env['name']
+ else:
+ self.name = os.path.basename(SCons.Util.splitext(self.dswfile)[0])
+ self.name = self.env.subst(self.name)
+
+ def Build(self):
+ pass
+
+class _GenerateV7DSW(_DSWGenerator):
+ """Generates a Solution file for MSVS .NET"""
+ def __init__(self, dswfile, source, env):
+ _DSWGenerator.__init__(self, dswfile, source, env)
+
+ self.file = None
+ self.version = self.env['MSVS_VERSION']
+ self.version_num, self.suite = msvs_parse_version(self.version)
+ self.versionstr = '7.00'
+ if self.version_num >= 11.0:
+ self.versionstr = '12.00'
+ elif self.version_num >= 10.0:
+ self.versionstr = '11.00'
+ elif self.version_num >= 9.0:
+ self.versionstr = '10.00'
+ elif self.version_num >= 8.0:
+ self.versionstr = '9.00'
+ elif self.version_num >= 7.1:
+ self.versionstr = '8.00'
+
+ if 'slnguid' in env and env['slnguid']:
+ self.slnguid = env['slnguid']
+ else:
+ self.slnguid = _generateGUID(dswfile, self.name)
+
+ self.configs = {}
+
+ self.nokeep = 0
+ if 'nokeep' in env and env['variant'] != 0:
+ self.nokeep = 1
+
+ if self.nokeep == 0 and os.path.exists(self.dswfile):
+ self.Parse()
+
+ def AddConfig(self, variant, dswfile=dswfile):
+ config = Config()
+
+ match = re.match('(.*)\|(.*)', variant)
+ if match:
+ config.variant = match.group(1)
+ config.platform = match.group(2)
+ else:
+ config.variant = variant
+ config.platform = 'Win32'
+
+ self.configs[variant] = config
+ print("Adding '" + self.name + ' - ' + config.variant + '|' + config.platform + "' to '" + str(dswfile) + "'")
+
+ if 'variant' not in env:
+ raise SCons.Errors.InternalError("You must specify a 'variant' argument (i.e. 'Debug' or " +\
+ "'Release') to create an MSVS Solution File.")
+ elif SCons.Util.is_String(env['variant']):
+ AddConfig(self, env['variant'])
+ elif SCons.Util.is_List(env['variant']):
+ for variant in env['variant']:
+ AddConfig(self, variant)
+
+ self.platforms = []
+ for key in list(self.configs.keys()):
+ platform = self.configs[key].platform
+ if not platform in self.platforms:
+ self.platforms.append(platform)
+
+ def GenerateProjectFilesInfo(self):
+ for dspfile in self.dspfiles:
+ dsp_folder_path, name = os.path.split(dspfile)
+ dsp_folder_path = os.path.abspath(dsp_folder_path)
+ dsp_relative_folder_path = os.path.relpath(dsp_folder_path, self.dsw_folder_path)
+ if dsp_relative_folder_path == os.curdir:
+ dsp_relative_file_path = name
+ else:
+ dsp_relative_file_path = os.path.join(dsp_relative_folder_path, name)
+ dspfile_info = {'NAME': name,
+ 'GUID': _generateGUID(dspfile, ''),
+ 'FOLDER_PATH': dsp_folder_path,
+ 'FILE_PATH': dspfile,
+ 'SLN_RELATIVE_FOLDER_PATH': dsp_relative_folder_path,
+ 'SLN_RELATIVE_FILE_PATH': dsp_relative_file_path}
+ self.dspfiles_info.append(dspfile_info)
+
+ self.dspfiles_info = []
+ GenerateProjectFilesInfo(self)
+
+ def Parse(self):
+ try:
+ dswfile = open(self.dswfile,'r')
+ except IOError:
+ return # doesn't exist yet, so can't add anything to configs.
+
+ line = dswfile.readline()
+ while line:
+ if line[:9] == "EndGlobal":
+ break
+ line = dswfile.readline()
+
+ line = dswfile.readline()
+ datas = line
+ while line:
+ line = dswfile.readline()
+ datas = datas + line
+
+ # OK, we've found our little pickled cache of data.
+ try:
+ datas = base64.decodestring(datas)
+ data = pickle.loads(datas)
+ except KeyboardInterrupt:
+ raise
+ except:
+ return # unable to unpickle any data for some reason
+
+ self.configs.update(data)
+
+ def PrintSolution(self):
+ """Writes a solution file"""
+ self.file.write('Microsoft Visual Studio Solution File, Format Version %s\n' % self.versionstr)
+ if self.version_num >= 12.0:
+ self.file.write('# Visual Studio 14\n')
+ elif self.version_num >= 11.0:
+ self.file.write('# Visual Studio 11\n')
+ elif self.version_num >= 10.0:
+ self.file.write('# Visual Studio 2010\n')
+ elif self.version_num >= 9.0:
+ self.file.write('# Visual Studio 2008\n')
+ elif self.version_num >= 8.0:
+ self.file.write('# Visual Studio 2005\n')
+
+ for dspinfo in self.dspfiles_info:
+ name = dspinfo['NAME']
+ base, suffix = SCons.Util.splitext(name)
+ if suffix == '.vcproj':
+ name = base
+ self.file.write('Project("%s") = "%s", "%s", "%s"\n'
+ % (external_makefile_guid, name, dspinfo['SLN_RELATIVE_FILE_PATH'], dspinfo['GUID']))
+ if self.version_num >= 7.1 and self.version_num < 8.0:
+ self.file.write('\tProjectSection(ProjectDependencies) = postProject\n'
+ '\tEndProjectSection\n')
+ self.file.write('EndProject\n')
+
+ self.file.write('Global\n')
+
+ env = self.env
+ if 'MSVS_SCC_PROVIDER' in env:
+ scc_number_of_projects = len(self.dspfiles) + 1
+ slnguid = self.slnguid
+ scc_provider = env.get('MSVS_SCC_PROVIDER', '').replace(' ', r'\u0020')
+ scc_project_name = env.get('MSVS_SCC_PROJECT_NAME', '').replace(' ', r'\u0020')
+ scc_connection_root = env.get('MSVS_SCC_CONNECTION_ROOT', os.curdir)
+ scc_local_path = os.path.relpath(scc_connection_root, self.dsw_folder_path).replace('\\', '\\\\')
+ self.file.write('\tGlobalSection(SourceCodeControl) = preSolution\n'
+ '\t\tSccNumberOfProjects = %(scc_number_of_projects)d\n'
+ '\t\tSccProjectName0 = %(scc_project_name)s\n'
+ '\t\tSccLocalPath0 = %(scc_local_path)s\n'
+ '\t\tSccProvider0 = %(scc_provider)s\n'
+ '\t\tCanCheckoutShared = true\n' % locals())
+ sln_relative_path_from_scc = os.path.relpath(self.dsw_folder_path, scc_connection_root)
+ if sln_relative_path_from_scc != os.curdir:
+ self.file.write('\t\tSccProjectFilePathRelativizedFromConnection0 = %s\\\\\n'
+ % sln_relative_path_from_scc.replace('\\', '\\\\'))
+ if self.version_num < 8.0:
+ # When present, SolutionUniqueID is automatically removed by VS 2005
+ # TODO: check for Visual Studio versions newer than 2005
+ self.file.write('\t\tSolutionUniqueID = %s\n' % slnguid)
+ for dspinfo in self.dspfiles_info:
+ i = self.dspfiles_info.index(dspinfo) + 1
+ dsp_relative_file_path = dspinfo['SLN_RELATIVE_FILE_PATH'].replace('\\', '\\\\')
+ dsp_scc_relative_folder_path = os.path.relpath(dspinfo['FOLDER_PATH'], scc_connection_root).replace('\\', '\\\\')
+ self.file.write('\t\tSccProjectUniqueName%(i)s = %(dsp_relative_file_path)s\n'
+ '\t\tSccLocalPath%(i)d = %(scc_local_path)s\n'
+ '\t\tCanCheckoutShared = true\n'
+ '\t\tSccProjectFilePathRelativizedFromConnection%(i)s = %(dsp_scc_relative_folder_path)s\\\\\n'
+ % locals())
+ self.file.write('\tEndGlobalSection\n')
+ if self.version_num >= 8.0:
+ self.file.write('\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n')
+ else:
+ self.file.write('\tGlobalSection(SolutionConfiguration) = preSolution\n')
+
+ confkeys = sorted(self.configs.keys())
+ cnt = 0
+ for name in confkeys:
+ variant = self.configs[name].variant
+ platform = self.configs[name].platform
+ if self.version_num >= 8.0:
+ self.file.write('\t\t%s|%s = %s|%s\n' % (variant, platform, variant, platform))
+ else:
+ self.file.write('\t\tConfigName.%d = %s\n' % (cnt, variant))
+ cnt = cnt + 1
+ self.file.write('\tEndGlobalSection\n')
+ if self.version_num <= 7.1:
+ self.file.write('\tGlobalSection(ProjectDependencies) = postSolution\n'
+ '\tEndGlobalSection\n')
+ if self.version_num >= 8.0:
+ self.file.write('\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n')
+ else:
+ self.file.write('\tGlobalSection(ProjectConfiguration) = postSolution\n')
+
+ for name in confkeys:
+ variant = self.configs[name].variant
+ platform = self.configs[name].platform
+ if self.version_num >= 8.0:
+ for dspinfo in self.dspfiles_info:
+ guid = dspinfo['GUID']
+ self.file.write('\t\t%s.%s|%s.ActiveCfg = %s|%s\n'
+ '\t\t%s.%s|%s.Build.0 = %s|%s\n' % (guid,variant,platform,variant,platform,guid,variant,platform,variant,platform))
+ else:
+ for dspinfo in self.dspfiles_info:
+ guid = dspinfo['GUID']
+ self.file.write('\t\t%s.%s.ActiveCfg = %s|%s\n'
+ '\t\t%s.%s.Build.0 = %s|%s\n' %(guid,variant,variant,platform,guid,variant,variant,platform))
+
+ self.file.write('\tEndGlobalSection\n')
+
+ if self.version_num >= 8.0:
+ self.file.write('\tGlobalSection(SolutionProperties) = preSolution\n'
+ '\t\tHideSolutionNode = FALSE\n'
+ '\tEndGlobalSection\n')
+ else:
+ self.file.write('\tGlobalSection(ExtensibilityGlobals) = postSolution\n'
+ '\tEndGlobalSection\n'
+ '\tGlobalSection(ExtensibilityAddIns) = postSolution\n'
+ '\tEndGlobalSection\n')
+ self.file.write('EndGlobal\n')
+ if self.nokeep == 0:
+ pdata = pickle.dumps(self.configs,PICKLE_PROTOCOL)
+ pdata = base64.encodestring(pdata).decode()
+ self.file.write(pdata)
+ self.file.write('\n')
+
+ def Build(self):
+ try:
+ self.file = open(self.dswfile,'w')
+ except IOError as detail:
+ raise SCons.Errors.InternalError('Unable to open "' + self.dswfile + '" for writing:' + str(detail))
+ else:
+ self.PrintSolution()
+ self.file.close()
+
+V6DSWHeader = """\
+Microsoft Developer Studio Workspace File, Format Version 6.00
+# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
+
+###############################################################################
+
+Project: "%(name)s"="%(dspfile)s" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Global:
+
+Package=<5>
+{{{
+}}}
+
+Package=<3>
+{{{
+}}}
+
+###############################################################################
+"""
+
+class _GenerateV6DSW(_DSWGenerator):
+ """Generates a Workspace file for MSVS 6.0"""
+
+ def PrintWorkspace(self):
+ """ writes a DSW file """
+ name = self.name
+ dspfile = os.path.relpath(self.dspfiles[0], self.dsw_folder_path)
+ self.file.write(V6DSWHeader % locals())
+
+ def Build(self):
+ try:
+ self.file = open(self.dswfile,'w')
+ except IOError as detail:
+ raise SCons.Errors.InternalError('Unable to open "' + self.dswfile + '" for writing:' + str(detail))
+ else:
+ self.PrintWorkspace()
+ self.file.close()
+
+
+def GenerateDSP(dspfile, source, env):
+ """Generates a Project file based on the version of MSVS that is being used"""
+
+ version_num = 6.0
+ if 'MSVS_VERSION' in env:
+ version_num, suite = msvs_parse_version(env['MSVS_VERSION'])
+ if version_num >= 10.0:
+ g = _GenerateV10DSP(dspfile, source, env)
+ g.Build()
+ elif version_num >= 7.0:
+ g = _GenerateV7DSP(dspfile, source, env)
+ g.Build()
+ else:
+ g = _GenerateV6DSP(dspfile, source, env)
+ g.Build()
+
+def GenerateDSW(dswfile, source, env):
+ """Generates a Solution/Workspace file based on the version of MSVS that is being used"""
+
+ version_num = 6.0
+ if 'MSVS_VERSION' in env:
+ version_num, suite = msvs_parse_version(env['MSVS_VERSION'])
+ if version_num >= 7.0:
+ g = _GenerateV7DSW(dswfile, source, env)
+ g.Build()
+ else:
+ g = _GenerateV6DSW(dswfile, source, env)
+ g.Build()
+
+
+##############################################################################
+# Above here are the classes and functions for generation of
+# DSP/DSW/SLN/VCPROJ files.
+##############################################################################
+
+def GetMSVSProjectSuffix(target, source, env, for_signature):
+ return env['MSVS']['PROJECTSUFFIX']
+
+def GetMSVSSolutionSuffix(target, source, env, for_signature):
+ return env['MSVS']['SOLUTIONSUFFIX']
+
+def GenerateProject(target, source, env):
+ # generate the dsp file, according to the version of MSVS.
+ builddspfile = target[0]
+ dspfile = builddspfile.srcnode()
+
+ # this detects whether or not we're using a VariantDir
+ if not dspfile is builddspfile:
+ try:
+ bdsp = open(str(builddspfile), "w+")
+ except IOError as detail:
+ print('Unable to open "' + str(dspfile) + '" for writing:',detail,'\n')
+ raise
+
+ bdsp.write("This is just a placeholder file.\nThe real project file is here:\n%s\n" % dspfile.get_abspath())
+
+ GenerateDSP(dspfile, source, env)
+
+ if env.get('auto_build_solution', 1):
+ builddswfile = target[1]
+ dswfile = builddswfile.srcnode()
+
+ if not dswfile is builddswfile:
+
+ try:
+ bdsw = open(str(builddswfile), "w+")
+ except IOError as detail:
+ print('Unable to open "' + str(dspfile) + '" for writing:',detail,'\n')
+ raise
+
+ bdsw.write("This is just a placeholder file.\nThe real workspace file is here:\n%s\n" % dswfile.get_abspath())
+
+ GenerateDSW(dswfile, source, env)
+
+def GenerateSolution(target, source, env):
+ GenerateDSW(target[0], source, env)
+
+def projectEmitter(target, source, env):
+ """Sets up the DSP dependencies."""
+
+ # todo: Not sure what sets source to what user has passed as target,
+ # but this is what happens. When that is fixed, we also won't have
+ # to make the user always append env['MSVSPROJECTSUFFIX'] to target.
+ if source[0] == target[0]:
+ source = []
+
+ # make sure the suffix is correct for the version of MSVS we're running.
+ (base, suff) = SCons.Util.splitext(str(target[0]))
+ suff = env.subst('$MSVSPROJECTSUFFIX')
+ target[0] = base + suff
+
+ if not source:
+ source = 'prj_inputs:'
+ source = source + env.subst('$MSVSSCONSCOM', 1)
+ source = source + env.subst('$MSVSENCODING', 1)
+
+ # Project file depends on CPPDEFINES and CPPPATH
+ preprocdefs = xmlify(';'.join(processDefines(env.get('CPPDEFINES', []))))
+ includepath_Dirs = processIncludes(env.get('CPPPATH', []), env, None, None)
+ includepath = xmlify(';'.join([str(x) for x in includepath_Dirs]))
+ source = source + "; ppdefs:%s incpath:%s"%(preprocdefs, includepath)
+
+ if 'buildtarget' in env and env['buildtarget'] != None:
+ if SCons.Util.is_String(env['buildtarget']):
+ source = source + ' "%s"' % env['buildtarget']
+ elif SCons.Util.is_List(env['buildtarget']):
+ for bt in env['buildtarget']:
+ if SCons.Util.is_String(bt):
+ source = source + ' "%s"' % bt
+ else:
+ try: source = source + ' "%s"' % bt.get_abspath()
+ except AttributeError: raise SCons.Errors.InternalError("buildtarget can be a string, a node, a list of strings or nodes, or None")
+ else:
+ try: source = source + ' "%s"' % env['buildtarget'].get_abspath()
+ except AttributeError: raise SCons.Errors.InternalError("buildtarget can be a string, a node, a list of strings or nodes, or None")
+
+ if 'outdir' in env and env['outdir'] != None:
+ if SCons.Util.is_String(env['outdir']):
+ source = source + ' "%s"' % env['outdir']
+ elif SCons.Util.is_List(env['outdir']):
+ for s in env['outdir']:
+ if SCons.Util.is_String(s):
+ source = source + ' "%s"' % s
+ else:
+ try: source = source + ' "%s"' % s.get_abspath()
+ except AttributeError: raise SCons.Errors.InternalError("outdir can be a string, a node, a list of strings or nodes, or None")
+ else:
+ try: source = source + ' "%s"' % env['outdir'].get_abspath()
+ except AttributeError: raise SCons.Errors.InternalError("outdir can be a string, a node, a list of strings or nodes, or None")
+
+ if 'name' in env:
+ if SCons.Util.is_String(env['name']):
+ source = source + ' "%s"' % env['name']
+ else:
+ raise SCons.Errors.InternalError("name must be a string")
+
+ if 'variant' in env:
+ if SCons.Util.is_String(env['variant']):
+ source = source + ' "%s"' % env['variant']
+ elif SCons.Util.is_List(env['variant']):
+ for variant in env['variant']:
+ if SCons.Util.is_String(variant):
+ source = source + ' "%s"' % variant
+ else:
+ raise SCons.Errors.InternalError("name must be a string or a list of strings")
+ else:
+ raise SCons.Errors.InternalError("variant must be a string or a list of strings")
+ else:
+ raise SCons.Errors.InternalError("variant must be specified")
+
+ for s in _DSPGenerator.srcargs:
+ if s in env:
+ if SCons.Util.is_String(env[s]):
+ source = source + ' "%s' % env[s]
+ elif SCons.Util.is_List(env[s]):
+ for t in env[s]:
+ if SCons.Util.is_String(t):
+ source = source + ' "%s"' % t
+ else:
+ raise SCons.Errors.InternalError(s + " must be a string or a list of strings")
+ else:
+ raise SCons.Errors.InternalError(s + " must be a string or a list of strings")
+
+ source = source + ' "%s"' % str(target[0])
+ source = [SCons.Node.Python.Value(source)]
+
+ targetlist = [target[0]]
+ sourcelist = source
+
+ if env.get('auto_build_solution', 1):
+ env['projects'] = [env.File(t).srcnode() for t in targetlist]
+ t, s = solutionEmitter(target, target, env)
+ targetlist = targetlist + t
+
+ # Beginning with Visual Studio 2010 for each project file (.vcxproj) we have additional file (.vcxproj.filters)
+ version_num = 6.0
+ if 'MSVS_VERSION' in env:
+ version_num, suite = msvs_parse_version(env['MSVS_VERSION'])
+ if version_num >= 10.0:
+ targetlist.append(targetlist[0] + '.filters')
+
+ return (targetlist, sourcelist)
+
+def solutionEmitter(target, source, env):
+ """Sets up the DSW dependencies."""
+
+ # todo: Not sure what sets source to what user has passed as target,
+ # but this is what happens. When that is fixed, we also won't have
+ # to make the user always append env['MSVSSOLUTIONSUFFIX'] to target.
+ if source[0] == target[0]:
+ source = []
+
+ # make sure the suffix is correct for the version of MSVS we're running.
+ (base, suff) = SCons.Util.splitext(str(target[0]))
+ suff = env.subst('$MSVSSOLUTIONSUFFIX')
+ target[0] = base + suff
+
+ if not source:
+ source = 'sln_inputs:'
+
+ if 'name' in env:
+ if SCons.Util.is_String(env['name']):
+ source = source + ' "%s"' % env['name']
+ else:
+ raise SCons.Errors.InternalError("name must be a string")
+
+ if 'variant' in env:
+ if SCons.Util.is_String(env['variant']):
+ source = source + ' "%s"' % env['variant']
+ elif SCons.Util.is_List(env['variant']):
+ for variant in env['variant']:
+ if SCons.Util.is_String(variant):
+ source = source + ' "%s"' % variant
+ else:
+ raise SCons.Errors.InternalError("name must be a string or a list of strings")
+ else:
+ raise SCons.Errors.InternalError("variant must be a string or a list of strings")
+ else:
+ raise SCons.Errors.InternalError("variant must be specified")
+
+ if 'slnguid' in env:
+ if SCons.Util.is_String(env['slnguid']):
+ source = source + ' "%s"' % env['slnguid']
+ else:
+ raise SCons.Errors.InternalError("slnguid must be a string")
+
+ if 'projects' in env:
+ if SCons.Util.is_String(env['projects']):
+ source = source + ' "%s"' % env['projects']
+ elif SCons.Util.is_List(env['projects']):
+ for t in env['projects']:
+ if SCons.Util.is_String(t):
+ source = source + ' "%s"' % t
+
+ source = source + ' "%s"' % str(target[0])
+ source = [SCons.Node.Python.Value(source)]
+
+ return ([target[0]], source)
+
+projectAction = SCons.Action.Action(GenerateProject, None)
+
+solutionAction = SCons.Action.Action(GenerateSolution, None)
+
+projectBuilder = SCons.Builder.Builder(action = '$MSVSPROJECTCOM',
+ suffix = '$MSVSPROJECTSUFFIX',
+ emitter = projectEmitter)
+
+solutionBuilder = SCons.Builder.Builder(action = '$MSVSSOLUTIONCOM',
+ suffix = '$MSVSSOLUTIONSUFFIX',
+ emitter = solutionEmitter)
+
+default_MSVS_SConscript = None
+
+def generate(env):
+ """Add Builders and construction variables for Microsoft Visual
+ Studio project files to an Environment."""
+ try:
+ env['BUILDERS']['MSVSProject']
+ except KeyError:
+ env['BUILDERS']['MSVSProject'] = projectBuilder
+
+ try:
+ env['BUILDERS']['MSVSSolution']
+ except KeyError:
+ env['BUILDERS']['MSVSSolution'] = solutionBuilder
+
+ env['MSVSPROJECTCOM'] = projectAction
+ env['MSVSSOLUTIONCOM'] = solutionAction
+
+ if SCons.Script.call_stack:
+ # XXX Need to find a way to abstract this; the build engine
+ # shouldn't depend on anything in SCons.Script.
+ env['MSVSSCONSCRIPT'] = SCons.Script.call_stack[0].sconscript
+ else:
+ global default_MSVS_SConscript
+ if default_MSVS_SConscript is None:
+ default_MSVS_SConscript = env.File('SConstruct')
+ env['MSVSSCONSCRIPT'] = default_MSVS_SConscript
+
+ env['MSVSSCONS'] = '"%s" -c "%s"' % (python_executable, getExecScriptMain(env))
+ env['MSVSSCONSFLAGS'] = '-C "${MSVSSCONSCRIPT.dir.get_abspath()}" -f ${MSVSSCONSCRIPT.name}'
+ env['MSVSSCONSCOM'] = '$MSVSSCONS $MSVSSCONSFLAGS'
+ env['MSVSBUILDCOM'] = '$MSVSSCONSCOM "$MSVSBUILDTARGET"'
+ env['MSVSREBUILDCOM'] = '$MSVSSCONSCOM "$MSVSBUILDTARGET"'
+ env['MSVSCLEANCOM'] = '$MSVSSCONSCOM -c "$MSVSBUILDTARGET"'
+
+ # Set-up ms tools paths for default version
+ msvc_setup_env_once(env)
+
+ if 'MSVS_VERSION' in env:
+ version_num, suite = msvs_parse_version(env['MSVS_VERSION'])
+ else:
+ (version_num, suite) = (7.0, None) # guess at a default
+ if 'MSVS' not in env:
+ env['MSVS'] = {}
+ if (version_num < 7.0):
+ env['MSVS']['PROJECTSUFFIX'] = '.dsp'
+ env['MSVS']['SOLUTIONSUFFIX'] = '.dsw'
+ elif (version_num < 10.0):
+ env['MSVS']['PROJECTSUFFIX'] = '.vcproj'
+ env['MSVS']['SOLUTIONSUFFIX'] = '.sln'
+ else:
+ env['MSVS']['PROJECTSUFFIX'] = '.vcxproj'
+ env['MSVS']['SOLUTIONSUFFIX'] = '.sln'
+
+ if (version_num >= 10.0):
+ env['MSVSENCODING'] = 'utf-8'
+ else:
+ env['MSVSENCODING'] = 'Windows-1252'
+
+ env['GET_MSVSPROJECTSUFFIX'] = GetMSVSProjectSuffix
+ env['GET_MSVSSOLUTIONSUFFIX'] = GetMSVSSolutionSuffix
+ env['MSVSPROJECTSUFFIX'] = '${GET_MSVSPROJECTSUFFIX}'
+ env['MSVSSOLUTIONSUFFIX'] = '${GET_MSVSSOLUTIONSUFFIX}'
+ env['SCONS_HOME'] = os.environ.get('SCONS_HOME')
+
+def exists(env):
+ return msvc_exists()
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/msvs.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/msvs.xml
new file mode 100644
index 0000000..c4701e1
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/msvs.xml
@@ -0,0 +1,520 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+__COPYRIGHT__
+
+This file is processed by the bin/SConsDoc.py module.
+See its __doc__ string for a discussion of the format.
+-->
+<!DOCTYPE sconsdoc [
+<!ENTITY % scons SYSTEM "../../../../doc/scons.mod">
+%scons;
+<!ENTITY % builders-mod SYSTEM "../../../../doc/generated/builders.mod">
+%builders-mod;
+<!ENTITY % functions-mod SYSTEM "../../../../doc/generated/functions.mod">
+%functions-mod;
+<!ENTITY % tools-mod SYSTEM "../../../../doc/generated/tools.mod">
+%tools-mod;
+<!ENTITY % variables-mod SYSTEM "../../../../doc/generated/variables.mod">
+%variables-mod;
+]>
+<sconsdoc
+xsi:schemaLocation="http://www.scons.org/dbxsd/v1.0 http://www.scons.org/dbxsd/v1.0/scons.xsd"
+xmlns="http://www.scons.org/dbxsd/v1.0"
+xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+xmlns:xs="http://www.w3.org/2001/XMLSchema"
+xmlns:ns="http://www.scons.org/dbxsd/v1.0"><tool name="msvs"> <summary> <para>
+Sets construction variables for Microsoft Visual Studio. </para> </summary>
+<sets> <item>MSVSPROJECTCOM</item> <item>MSVSSOLUTIONCOM</item>
+<item>MSVSSCONSCRIPT</item> <item>MSVSSCONS</item> <item>MSVSSCONSFLAGS</item>
+<item>MSVSSCONSCOM</item> <item>MSVSBUILDCOM</item>
+<item>MSVSREBUILDCOM</item> <item>MSVSCLEANCOM</item>
+<item>MSVSENCODING</item> </sets> <uses> </uses> </tool> <builder
+name="MSVSProject"> <summary> <para> Builds a Microsoft Visual Studio project
+file, and by default builds a solution file as well. </para> <para> This
+builds a Visual Studio project file, based on the version of Visual Studio
+that is configured (either the latest installed version, or the version
+specified by &cv-link-MSVS_VERSION; in the Environment constructor). For
+Visual Studio 6, it will generate a <filename>.dsp</filename> file. For Visual
+Studio 7 (.NET) and later versions, it will generate a
+<filename>.vcproj</filename> file. </para> <para> By default, this also
+generates a solution file for the specified project, a
+<filename>.dsw</filename> file for Visual Studio 6 or a
+<filename>.sln</filename> file for Visual Studio 7 (.NET). This behavior may
+be disabled by specifying <literal>auto_build_solution=0</literal> when you
+call &b-MSVSProject;, in which case you presumably want to build the solution
+file(s) by calling the &b-MSVSSolution; Builder (see below). </para> <para>
+The &b-MSVSProject; builder takes several lists of filenames to be placed into
+the project file. These are currently limited to <literal>srcs</literal>,
+<literal>incs</literal>, <literal>localincs</literal>,
+<literal>resources</literal>, and <literal>misc</literal>. These are pretty
+self-explanatory, but it should be noted that these lists are added to the
+&cv-link-SOURCES; construction variable as strings, NOT as SCons File Nodes.
+This is because they represent file names to be added to the project file, not
+the source files used to build the project file. </para> <para> The above
+filename lists are all optional, although at least one must be specified for
+the resulting project file to be non-empty. </para> <para> In addition to the
+above lists of values, the following values may be specified:
+</para><variablelist>
+ <varlistentry>
+ <term>target</term>
+
+ <listitem>
+ <para>The name of the target <filename>.dsp</filename> or
+ <filename>.vcproj</filename> file. The correct suffix for the version
+ of Visual Studio must be used, but the &cv-link-MSVSPROJECTSUFFIX;
+ construction variable will be defined to the correct value (see
+ example below).</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>variant</term>
+
+ <listitem>
+ <para>The name of this particular variant. For Visual Studio 7
+ projects, this can also be a list of variant names. These are
+ typically things like "Debug" or "Release", but really can be anything
+ you want. For Visual Studio 7 projects, they may also specify a target
+ platform separated from the variant name by a <literal>|</literal>
+ (vertical pipe) character: <literal>Debug|Xbox</literal>. The default
+ target platform is Win32. Multiple calls to &b-MSVSProject; with
+ different variants are allowed; all variants will be added to the
+ project file with their appropriate build targets and
+ sources.</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>cmdargs</term>
+
+ <listitem>
+ <para>Additional command line arguments for the different
+ variants. The number of <literal>cmdargs</literal> entries must match
+ the number of <literal>variant</literal> entries, or be empty (not
+ specified). If you give only one, it will automatically be propagated
+ to all variants.</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>buildtarget</term>
+
+ <listitem>
+ <para>An optional string, node, or list of strings or nodes (one
+ per build variant), to tell the Visual Studio debugger what output
+ target to use in what build variant. The number of
+ <literal>buildtarget</literal> entries must match the number of
+ <literal>variant</literal> entries.</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>runfile</term>
+
+ <listitem>
+ <para>The name of the file that Visual Studio 7 and later will
+ run and debug. This appears as the value of the
+ <literal>Output</literal> field in the resulting Visual Studio project
+ file. If this is not specified, the default is the same as the
+ specified <literal>buildtarget</literal> value.</para>
+ </listitem>
+ </varlistentry>
+ </variablelist><para> Note that because &SCons; always executes its build
+commands from the directory in which the &SConstruct; file is located, if you
+generate a project file in a different directory than the &SConstruct;
+directory, users will not be able to double-click on the file name in
+compilation error messages displayed in the Visual Studio console output
+window. This can be remedied by adding the Visual C/C++ <literal>/FC</literal>
+compiler option to the &cv-link-CCFLAGS; variable so that the compiler will
+print the full path name of any files that cause compilation errors. </para>
+<para> Example usage: </para>
+ <example_commands>
+barsrcs = ['bar.cpp']
+barincs = ['bar.h']
+barlocalincs = ['StdAfx.h']
+barresources = ['bar.rc','resource.h']
+barmisc = ['bar_readme.txt']
+
+dll = env.SharedLibrary(target = 'bar.dll',
+ source = barsrcs)
+buildtarget = [s for s in dll if str(s).endswith('dll')]
+env.MSVSProject(target = 'Bar' + env['MSVSPROJECTSUFFIX'],
+ srcs = barsrcs,
+ incs = barincs,
+ localincs = barlocalincs,
+ resources = barresources,
+ misc = barmisc,
+ buildtarget = buildtarget,
+ variant = 'Release')
+</example_commands>
+<para>Starting with version 2.4 of
+SCons it's also possible to specify the optional argument
+<parameter>DebugSettings</parameter>, which creates files for debugging under
+Visual Studio:</para><variablelist>
+ <varlistentry>
+ <term>DebugSettings</term>
+
+ <listitem>
+ <para>A dictionary of debug settings that get written to the
+ <filename>.vcproj.user</filename> or the
+ <filename>.vcxproj.user</filename> file, depending on the version
+ installed. As it is done for cmdargs (see above), you can specify a
+ <parameter>DebugSettings</parameter> dictionary per variant. If you
+ give only one, it will be propagated to all variants.</para>
+ </listitem>
+ </varlistentry>
+ </variablelist><para>Currently, only Visual Studio v9.0 and Visual Studio
+version v11 are implemented, for other versions no file is generated. To
+generate the user file, you just need to add a
+<parameter>DebugSettings</parameter> dictionary to the environment with the
+right parameters for your MSVS version. If the dictionary is empty, or does
+not contain any good value, no file will be generated.</para><para>Following
+is a more contrived example, involving the setup of a project for variants and
+DebugSettings:</para><example_commands># Assuming you store your defaults in a file
+vars = Variables('variables.py')
+msvcver = vars.args.get('vc', '9')
+
+# Check command args to force one Microsoft Visual Studio version
+if msvcver == '9' or msvcver == '11':
+ env = Environment(MSVC_VERSION=msvcver+'.0', MSVC_BATCH=False)
+else:
+ env = Environment()
+
+AddOption('--userfile', action='store_true', dest='userfile', default=False,
+ help="Create Visual Studio Project user file")
+
+#
+# 1. Configure your Debug Setting dictionary with options you want in the list
+# of allowed options, for instance if you want to create a user file to launch
+# a specific application for testing your dll with Microsoft Visual Studio 2008 (v9):
+#
+V9DebugSettings = {
+ 'Command':'c:\\myapp\\using\\thisdll.exe',
+ 'WorkingDirectory': 'c:\\myapp\\using\\',
+ 'CommandArguments': '-p password',
+# 'Attach':'false',
+# 'DebuggerType':'3',
+# 'Remote':'1',
+# 'RemoteMachine': None,
+# 'RemoteCommand': None,
+# 'HttpUrl': None,
+# 'PDBPath': None,
+# 'SQLDebugging': None,
+# 'Environment': '',
+# 'EnvironmentMerge':'true',
+# 'DebuggerFlavor': None,
+# 'MPIRunCommand': None,
+# 'MPIRunArguments': None,
+# 'MPIRunWorkingDirectory': None,
+# 'ApplicationCommand': None,
+# 'ApplicationArguments': None,
+# 'ShimCommand': None,
+# 'MPIAcceptMode': None,
+# 'MPIAcceptFilter': None,
+}
+
+#
+# 2. Because there are a lot of different options depending on the Microsoft
+# Visual Studio version, if you use more than one version you have to
+# define a dictionary per version, for instance if you want to create a user
+# file to launch a specific application for testing your dll with Microsoft
+# Visual Studio 2012 (v11):
+#
+V10DebugSettings = {
+ 'LocalDebuggerCommand': 'c:\\myapp\\using\\thisdll.exe',
+ 'LocalDebuggerWorkingDirectory': 'c:\\myapp\\using\\',
+ 'LocalDebuggerCommandArguments': '-p password',
+# 'LocalDebuggerEnvironment': None,
+# 'DebuggerFlavor': 'WindowsLocalDebugger',
+# 'LocalDebuggerAttach': None,
+# 'LocalDebuggerDebuggerType': None,
+# 'LocalDebuggerMergeEnvironment': None,
+# 'LocalDebuggerSQLDebugging': None,
+# 'RemoteDebuggerCommand': None,
+# 'RemoteDebuggerCommandArguments': None,
+# 'RemoteDebuggerWorkingDirectory': None,
+# 'RemoteDebuggerServerName': None,
+# 'RemoteDebuggerConnection': None,
+# 'RemoteDebuggerDebuggerType': None,
+# 'RemoteDebuggerAttach': None,
+# 'RemoteDebuggerSQLDebugging': None,
+# 'DeploymentDirectory': None,
+# 'AdditionalFiles': None,
+# 'RemoteDebuggerDeployDebugCppRuntime': None,
+# 'WebBrowserDebuggerHttpUrl': None,
+# 'WebBrowserDebuggerDebuggerType': None,
+# 'WebServiceDebuggerHttpUrl': None,
+# 'WebServiceDebuggerDebuggerType': None,
+# 'WebServiceDebuggerSQLDebugging': None,
+}
+
+#
+# 3. Select the dictionary you want depending on the version of visual Studio
+# Files you want to generate.
+#
+if not env.GetOption('userfile'):
+ dbgSettings = None
+elif env.get('MSVC_VERSION', None) == '9.0':
+ dbgSettings = V9DebugSettings
+elif env.get('MSVC_VERSION', None) == '11.0':
+ dbgSettings = V10DebugSettings
+else:
+ dbgSettings = None
+
+#
+# 4. Add the dictionary to the DebugSettings keyword.
+#
+barsrcs = ['bar.cpp', 'dllmain.cpp', 'stdafx.cpp']
+barincs = ['targetver.h']
+barlocalincs = ['StdAfx.h']
+barresources = ['bar.rc','resource.h']
+barmisc = ['ReadMe.txt']
+
+dll = env.SharedLibrary(target = 'bar.dll',
+ source = barsrcs)
+
+env.MSVSProject(target = 'Bar' + env['MSVSPROJECTSUFFIX'],
+ srcs = barsrcs,
+ incs = barincs,
+ localincs = barlocalincs,
+ resources = barresources,
+ misc = barmisc,
+ buildtarget = [dll[0]] * 2,
+ variant = ('Debug|Win32', 'Release|Win32'),
+ cmdargs = 'vc=%s' % msvcver,
+ DebugSettings = (dbgSettings, {}))
+</example_commands> </summary> </builder> <builder
+name="MSVSSolution"> <summary> <para>Builds a Microsoft Visual Studio solution
+file. </para> <para>This builds a Visual Studio solution file, based on the
+version of Visual Studio that is configured (either the latest installed
+version, or the version specified by &cv-link-MSVS_VERSION; in the
+construction environment). For Visual Studio 6, it will generate a
+<filename>.dsw</filename> file. For Visual Studio 7 (.NET), it will generate a
+<filename>.sln</filename> file. </para> <para> The following values must be
+specified: </para><variablelist>
+ <varlistentry>
+ <term>target</term>
+
+ <listitem>
+ <para>The name of the target .dsw or .sln file. The correct
+ suffix for the version of Visual Studio must be used, but the value
+ &cv-link-MSVSSOLUTIONSUFFIX; will be defined to the correct value (see
+ example below).</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>variant</term>
+
+ <listitem>
+ <para>The name of this particular variant, or a list of variant
+ names (the latter is only supported for MSVS 7 solutions). These are
+ typically things like "Debug" or "Release", but really can be anything
+ you want. For MSVS 7 they may also specify target platform, like this
+ "Debug|Xbox". Default platform is Win32.</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>projects</term>
+
+ <listitem>
+ <para>A list of project file names, or Project nodes returned by
+ calls to the &b-MSVSProject; Builder, to be placed into the solution
+ file. It should be noted that these file names are NOT added to the
+ $SOURCES environment variable in form of files, but rather as strings.
+ This is because they represent file names to be added to the solution
+ file, not the source files used to build the solution
+ file.</para>
+ </listitem>
+ </varlistentry>
+ </variablelist> <para> Example Usage: </para> <example_commands>
+env.MSVSSolution(target = 'Bar' + env['MSVSSOLUTIONSUFFIX'], projects = ['bar'
++ env['MSVSPROJECTSUFFIX']], variant = 'Release')
+</example_commands></summary></builder> <cvar name="MSVS"> <summary> <para>
+When the Microsoft Visual Studio tools are initialized, they set up this
+dictionary with the following keys: </para><variablelist>
+ <varlistentry>
+ <term>VERSION</term>
+
+ <listitem>
+ <para>the version of MSVS being used (can be set via
+ &cv-link-MSVS_VERSION;)</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>VERSIONS</term>
+
+ <listitem>
+ <para>the available versions of MSVS installed</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>VCINSTALLDIR</term>
+
+ <listitem>
+ <para>installed directory of Visual C++</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>VSINSTALLDIR</term>
+
+ <listitem>
+ <para>installed directory of Visual Studio</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>FRAMEWORKDIR</term>
+
+ <listitem>
+ <para>installed directory of the .NET framework</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>FRAMEWORKVERSIONS</term>
+
+ <listitem>
+ <para>list of installed versions of the .NET framework, sorted
+ latest to oldest.</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>FRAMEWORKVERSION</term>
+
+ <listitem>
+ <para>latest installed version of the .NET
+ framework</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>FRAMEWORKSDKDIR</term>
+
+ <listitem>
+ <para>installed location of the .NET SDK.</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>PLATFORMSDKDIR</term>
+
+ <listitem>
+ <para>installed location of the Platform SDK.</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>PLATFORMSDK_MODULES</term>
+
+ <listitem>
+ <para>dictionary of installed Platform SDK modules, where the
+ dictionary keys are keywords for the various modules, and the values
+ are 2-tuples where the first is the release date, and the second is
+ the version number.</para>
+ </listitem>
+ </varlistentry>
+ </variablelist><para>If a value isn't set, it wasn't available in the
+registry.</para></summary></cvar> <cvar name="MSVS_ARCH"> <summary> <para>Sets
+the architecture for which the generated project(s) should build. </para>
+<para>The default value is <literal>x86</literal>. <literal>amd64</literal> is
+also supported by &SCons; for some Visual Studio versions. Trying to set
+&cv-MSVS_ARCH; to an architecture that's not supported for a given Visual
+Studio version will generate an error. </para> </summary> </cvar> <cvar
+name="MSVS_PROJECT_GUID"> <summary> <para>The string placed in a generated
+Microsoft Visual Studio project file as the value of the
+<literal>ProjectGUID</literal> attribute. There is no default value. If not
+defined, a new GUID is generated. </para> </summary> </cvar> <cvar
+name="MSVS_SCC_AUX_PATH"> <summary> <para>The path name placed in a generated
+Microsoft Visual Studio project file as the value of the
+<literal>SccAuxPath</literal> attribute if the
+<envar>MSVS_SCC_PROVIDER</envar> construction variable is also set. There is
+no default value. </para> </summary> </cvar> <cvar
+name="MSVS_SCC_CONNECTION_ROOT"> <summary> <para>The root path of projects in
+your SCC workspace, i.e the path under which all project and solution files
+will be generated. It is used as a reference path from which the relative
+paths of the generated Microsoft Visual Studio project and solution files are
+computed. The relative project file path is placed as the value of the
+<literal>SccLocalPath</literal> attribute of the project file and as the
+values of the
+<literal>SccProjectFilePathRelativizedFromConnection[i]</literal> (where [i]
+ranges from 0 to the number of projects in the solution) attributes of the
+<literal>GlobalSection(SourceCodeControl)</literal> section of the Microsoft
+Visual Studio solution file. Similarly the relative solution file path is
+placed as the values of the <literal>SccLocalPath[i]</literal> (where [i]
+ranges from 0 to the number of projects in the solution) attributes of the
+<literal>GlobalSection(SourceCodeControl)</literal> section of the Microsoft
+Visual Studio solution file. This is used only if the
+<envar>MSVS_SCC_PROVIDER</envar> construction variable is also set. The
+default value is the current working directory. </para> </summary> </cvar>
+<cvar name="MSVS_SCC_PROJECT_NAME"> <summary> <para>The project name placed in
+a generated Microsoft Visual Studio project file as the value of the
+<literal>SccProjectName</literal> attribute if the
+<envar>MSVS_SCC_PROVIDER</envar> construction variable is also set. In this
+case the string is also placed in the <literal>SccProjectName0</literal>
+attribute of the <literal>GlobalSection(SourceCodeControl)</literal> section
+of the Microsoft Visual Studio solution file. There is no default value.
+</para> </summary> </cvar> <cvar name="MSVS_SCC_PROVIDER"> <summary> <para>The
+string placed in a generated Microsoft Visual Studio project file as the value
+of the <literal>SccProvider</literal> attribute. The string is also placed in
+the <literal>SccProvider0</literal> attribute of the
+<literal>GlobalSection(SourceCodeControl)</literal> section of the Microsoft
+Visual Studio solution file. There is no default value. </para> </summary>
+</cvar> <cvar name="MSVS_VERSION"> <summary> <para>Sets the preferred version
+of Microsoft Visual Studio to use. </para> <para>If &cv-MSVS_VERSION; is not
+set, &SCons; will (by default) select the latest version of Visual Studio
+installed on your system. So, if you have version 6 and version 7 (MSVS .NET)
+installed, it will prefer version 7. You can override this by specifying the
+<envar>MSVS_VERSION</envar> variable in the Environment initialization,
+setting it to the appropriate version ('6.0' or '7.0', for example). If the
+specified version isn't installed, tool initialization will fail. </para>
+<para>This is obsolete: use &cv-MSVC_VERSION; instead. If &cv-MSVS_VERSION; is
+set and &cv-MSVC_VERSION; is not, &cv-MSVC_VERSION; will be set automatically
+to &cv-MSVS_VERSION;. If both are set to different values, scons will raise an
+error. </para> </summary> </cvar> <cvar name="MSVSBUILDCOM"> <summary>
+<para>The build command line placed in a generated Microsoft Visual Studio
+project file. The default is to have Visual Studio invoke SCons with any
+specified build targets. </para> </summary> </cvar> <cvar name="MSVSCLEANCOM">
+<summary> <para>The clean command line placed in a generated Microsoft Visual
+Studio project file. The default is to have Visual Studio invoke SCons with
+the -c option to remove any specified targets. </para> </summary> </cvar>
+<cvar name="MSVSENCODING"> <summary> <para>The encoding string placed in a
+generated Microsoft Visual Studio project file. The default is encoding
+<literal>Windows-1252</literal>. </para> </summary> </cvar> <cvar
+name="MSVSPROJECTCOM"> <summary> <para>The action used to generate Microsoft
+Visual Studio project files. </para> </summary> </cvar> <cvar
+name="MSVSPROJECTSUFFIX"> <summary> <para>The suffix used for Microsoft Visual
+Studio project (DSP) files. The default value is <filename>.vcproj</filename>
+when using Visual Studio version 7.x (.NET) or later version, and
+<filename>.dsp</filename> when using earlier versions of Visual Studio.
+</para> </summary> </cvar> <cvar name="MSVSREBUILDCOM"> <summary> <para>The
+rebuild command line placed in a generated Microsoft Visual Studio project
+file. The default is to have Visual Studio invoke SCons with any specified
+rebuild targets. </para> </summary> </cvar> <cvar name="MSVSSCONS"> <summary>
+<para>The SCons used in generated Microsoft Visual Studio project files. The
+default is the version of SCons being used to generate the project file.
+</para> </summary> </cvar> <cvar name="MSVSSCONSFLAGS"> <summary> <para>The
+SCons flags used in generated Microsoft Visual Studio project files. </para>
+</summary> </cvar> <cvar name="MSVSSCONSCOM"> <summary> <para>The default
+SCons command used in generated Microsoft Visual Studio project files. </para>
+</summary> </cvar> <cvar name="MSVSSCONSCRIPT"> <summary> <para>The sconscript
+file (that is, &SConstruct; or &SConscript; file) that will be invoked by
+Visual Studio project files (through the &cv-link-MSVSSCONSCOM; variable). The
+default is the same sconscript file that contains the call to &b-MSVSProject;
+to build the project file. </para> </summary> </cvar> <cvar
+name="MSVSSOLUTIONCOM"> <summary> <para>The action used to generate Microsoft
+Visual Studio solution files. </para> </summary> </cvar> <cvar
+name="MSVSSOLUTIONSUFFIX"> <summary> <para>The suffix used for Microsoft
+Visual Studio solution (DSW) files. The default value is
+<filename>.sln</filename> when using Visual Studio version 7.x (.NET), and
+<filename>.dsw</filename> when using earlier versions of Visual Studio.
+</para> </summary> </cvar> <cvar name="SCONS_HOME"> <summary> <para>The
+(optional) path to the SCons library directory, initialized from the external
+environment. If set, this is used to construct a shorter and more efficient
+search path in the &cv-link-MSVSSCONS; command line executed from Microsoft
+Visual Studio project files. </para> </summary> </cvar></sconsdoc>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/msvsTests.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/msvsTests.py
new file mode 100644
index 0000000..bf82114
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/msvsTests.py
@@ -0,0 +1,855 @@
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+from __future__ import print_function
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import os
+import sys
+import unittest
+import copy
+
+import TestCmd
+import TestUnit
+
+from SCons.Tool.msvs import *
+from SCons.Tool.MSCommon.vs import SupportedVSList
+import SCons.Util
+import SCons.Warnings
+
+from SCons.Tool.MSCommon.common import debug
+
+from SCons.Tool.MSCommon import get_default_version, \
+ query_versions
+from SCons.Tool.msvs import _GenerateV6DSP, _GenerateV7DSP, _GenerateV10DSP
+
+regdata_6a = r'''[HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio]
+[HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio\6.0]
+[HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio\6.0\ServicePacks]
+"sp3"=""
+[HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio\6.0\Setup]
+"VsCommonDir"="C:\Program Files\Microsoft Visual Studio\Common"
+[HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio\6.0\Setup\Microsoft Developer Network Library - Visual Studio 6.0a]
+"ProductDir"="C:\Program Files\Microsoft Visual Studio\MSDN98\98VSa\1033"
+[HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio\6.0\Setup\Microsoft Visual C++]
+"ProductDir"="C:\Program Files\Microsoft Visual Studio\VC98"
+'''.split('\n')
+
+regdata_6b = r'''[HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio]
+[HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio\6.0]
+"InstallDir"="C:\VS6\Common\IDE\IDE98"
+[HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio\6.0\ServicePacks]
+"sp5"=""
+"latest"=dword:00000005
+[HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio\6.0\Setup]
+"VsCommonDir"="C:\VS6\Common"
+[HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio\6.0\Setup\Microsoft Visual Basic]
+"ProductDir"="C:\VS6\VB98"
+[HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio\6.0\Setup\Microsoft Visual C++]
+"ProductDir"="C:\VS6\VC98"
+[HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio\6.0\Setup\Microsoft Visual Studio]
+"ProductDir"="C:\VS6"
+[HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio\6.0\Setup\Microsoft VSEE Client]
+"ProductDir"="C:\VS6\Common\Tools"
+[HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio\6.0\Setup\Visual Studio 98]
+'''.split('\n')
+
+regdata_7 = r'''
+[HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio\7.0]
+"InstallDir"="C:\Program Files\Microsoft Visual Studio .NET\Common7\IDE\"
+"Source Directories"="C:\Program Files\Microsoft Visual Studio .NET\Vc7\crt\;C:\Program Files\Microsoft Visual Studio .NET\Vc7\atlmfc\src\mfc\;C:\Program Files\Microsoft Visual Studio .NET\Vc7\atlmfc\src\atl\"
+[HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio\7.0\InstalledProducts]
+[HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio\7.0\InstalledProducts\CrystalReports]
+@="#15007"
+"Package"="{F05E92C6-8346-11D3-B4AD-00A0C9B04E7B}"
+"ProductDetails"="#15009"
+"LogoID"="0"
+"PID"="#15008"
+"UseInterface"=dword:00000001
+[HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio\7.0\InstalledProducts\Visual Basic.NET]
+@=""
+"DefaultProductAttribute"="VB"
+"Package"="{164B10B9-B200-11D0-8C61-00A0C91E29D5}"
+"UseInterface"=dword:00000001
+[HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio\7.0\InstalledProducts\Visual C#]
+@=""
+"Package"="{FAE04EC1-301F-11d3-BF4B-00C04F79EFBC}"
+"UseInterface"=dword:00000001
+"DefaultProductAttribute"="C#"
+[HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio\7.0\InstalledProducts\VisualC++]
+"UseInterface"=dword:00000001
+"Package"="{F1C25864-3097-11D2-A5C5-00C04F7968B4}"
+"DefaultProductAttribute"="VC"
+[HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio\7.0\Setup]
+"Dbghelp_path"="C:\Program Files\Microsoft Visual Studio .NET\Common7\IDE\"
+"dw_dir"="C:\Program Files\Microsoft Visual Studio .NET\Common7\IDE\"
+[HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio\7.0\Setup\MSDN]
+"ProductDir"="C:\Program Files\Microsoft Visual Studio .NET\Msdn\1033\"
+[HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio\7.0\Setup\Servicing\SKU]
+"Visual Studio .NET Professional - English"="{D0610409-7D65-11D5-A54F-0090278A1BB8}"
+[HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio\7.0\Setup\VB]
+"ProductDir"="C:\Program Files\Microsoft Visual Studio .NET\Vb7\"
+[HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio\7.0\Setup\VC]
+"ProductDir"="C:\Program Files\Microsoft Visual Studio .NET\Vc7\"
+[HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio\7.0\Setup\VC#]
+"ProductDir"="C:\Program Files\Microsoft Visual Studio .NET\VC#\"
+[HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio\7.0\Setup\Visual Studio .NET Professional - English]
+"InstallSuccess"=dword:00000001
+[HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio\7.0\Setup\VS]
+"EnvironmentDirectory"="C:\Program Files\Microsoft Visual Studio .NET\Common7\IDE\"
+"EnvironmentPath"="C:\Program Files\Microsoft Visual Studio .NET\Common7\IDE\devenv.exe"
+"VS7EnvironmentLocation"="C:\Program Files\Microsoft Visual Studio .NET\Common7\IDE\devenv.exe"
+"MSMDir"="C:\Program Files\Common Files\Merge Modules\"
+"ProductDir"="C:\Program Files\Microsoft Visual Studio .NET\"
+"VS7CommonBinDir"="C:\Program Files\Microsoft Visual Studio .NET\Common7\Tools\"
+"VS7CommonDir"="C:\Program Files\Microsoft Visual Studio .NET\Common7\"
+"VSUpdateDir"="C:\Program Files\Microsoft Visual Studio .NET\Setup\VSUpdate\"
+[HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio\7.0\Setup\VS\BuildNumber]
+"1033"="7.0.9466"
+[HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio\7.0\Setup\VS\Pro]
+"ProductDir"="C:\Program Files\Microsoft Visual Studio .NET\"
+[HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio\7.0\VC]
+[HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio\7.0\VC\VC_OBJECTS_PLATFORM_INFO]
+[HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio\7.0\VC\VC_OBJECTS_PLATFORM_INFO\Win32]
+@="{A54AAE91-30C2-11D3-87BF-A04A4CC10000}"
+[HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio\7.0\VC\VC_OBJECTS_PLATFORM_INFO\Win32\Directories]
+"Path Dirs"="$(VCInstallDir)bin;$(VSInstallDir)Common7\Tools\bin\prerelease;$(VSInstallDir)Common7\Tools\bin;$(VSInstallDir)Common7\tools;$(VSInstallDir)Common7\ide;C:\Program Files\HTML Help Workshop\;$(FrameworkSDKDir)bin;$(FrameworkDir)$(FrameworkVersion);C:\perl\bin;C:\cygwin\bin;c:\cygwin\usr\bin;C:\bin;C:\program files\perforce;C:\cygwin\usr\local\bin\i686-pc-cygwin;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem"
+"Library Dirs"="$(VCInstallDir)lib;$(VCInstallDir)atlmfc\lib;$(VCInstallDir)PlatformSDK\lib\prerelease;$(VCInstallDir)PlatformSDK\lib;$(FrameworkSDKDir)lib"
+"Include Dirs"="$(VCInstallDir)include;$(VCInstallDir)atlmfc\include;$(VCInstallDir)PlatformSDK\include\prerelease;$(VCInstallDir)PlatformSDK\include;$(FrameworkSDKDir)include"
+"Source Dirs"="$(VCInstallDir)atlmfc\src\mfc;$(VCInstallDir)atlmfc\src\atl;$(VCInstallDir)crt\src"
+"Reference Dirs"=""
+'''.split('\n')
+
+regdata_7_1 = r'''
+[HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio\7.1]
+@=""
+"Source Directories"="C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\crt\src\;C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\atlmfc\src\mfc\;C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\atlmfc\src\atl\"
+"ThisVersionSolutionCLSID"="{246C57AE-40DD-4d6b-9E8D-B0F5757BB2A8}"
+"ThisVersionDTECLSID"="{8CD2DD97-4EC1-4bc4-9359-89A3EEDD57A6}"
+"InstallDir"="C:\Program Files\Microsoft Visual Studio .NET 2003\Common7\IDE\"
+"CLR Version"="v1.1.4322"
+[HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio\7.1\InstalledProducts]
+[HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio\7.1\InstalledProducts\Smart Device Extensions]
+"UseInterface"=dword:00000001
+"VS7InstallDir"="C:\Program Files\Microsoft Visual Studio .NET 2003\"
+"VBDeviceInstallDir"="C:\Program Files\Microsoft Visual Studio .NET 2003\VB7\"
+"CSharpDeviceInstallDir"="C:\Program Files\Microsoft Visual Studio .NET 2003\VC#\"
+[HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio\7.1\InstalledProducts\Visual Basic.NET]
+"UseInterface"=dword:00000001
+"Package"="{164B10B9-B200-11D0-8C61-00A0C91E29D5}"
+"DefaultProductAttribute"="VB"
+@=""
+[HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio\7.1\InstalledProducts\Visual C#]
+"DefaultProductAttribute"="C#"
+"UseInterface"=dword:00000001
+"Package"="{FAE04EC1-301F-11D3-BF4B-00C04F79EFBC}"
+@=""
+[HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio\7.1\InstalledProducts\Visual JSharp]
+@=""
+"Package"="{E6FDF8B0-F3D1-11D4-8576-0002A516ECE8}"
+"UseInterface"=dword:00000001
+"DefaultProductAttribute"="Visual JSharp"
+[HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio\7.1\InstalledProducts\VisualC++]
+"UseInterface"=dword:00000001
+"Package"="{F1C25864-3097-11D2-A5C5-00C04F7968B4}"
+"DefaultProductAttribute"="VC"
+[HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio\7.1\Setup]
+"Dbghelp_path"="C:\Program Files\Microsoft Visual Studio .NET 2003\Common7\IDE\"
+"dw_dir"="C:\Program Files\Microsoft Visual Studio .NET 2003\Common7\IDE\"
+[HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio\7.1\Setup\CSDPROJ]
+"ProductDir"="C:\Program Files\Microsoft Visual Studio .NET 2003\VC#\"
+[HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio\7.1\Setup\JSHPROJ]
+"ProductDir"="C:\Program Files\Microsoft Visual Studio .NET 2003\VJ#\"
+[HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio\7.1\Setup\Servicing]
+"CurrentSULevel"=dword:00000000
+"CurrentSPLevel"=dword:00000000
+"Server Path"=""
+[HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio\7.1\Setup\Servicing\Package]
+"FxSDK"=""
+"VB"=""
+"VC"=""
+"VCS"=""
+[HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio\7.1\Setup\Servicing\SKU]
+"Visual Studio .NET Professional 2003 - English"="{20610409-CA18-41A6-9E21-A93AE82EE7C5}"
+[HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio\7.1\Setup\VB]
+"ProductDir"="C:\Program Files\Microsoft Visual Studio .NET 2003\Vb7\"
+[HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio\7.1\Setup\VBDPROJ]
+"ProductDir"="C:\Program Files\Microsoft Visual Studio .NET 2003\Vb7\"
+[HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio\7.1\Setup\VC]
+"ProductDir"="C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\"
+[HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio\7.1\Setup\VC#]
+"ProductDir"="C:\Program Files\Microsoft Visual Studio .NET 2003\VC#\"
+[HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio\7.1\Setup\Visual Studio .NET Professional 2003 - English]
+"InstallSuccess"=dword:00000001
+[HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio\7.1\Setup\VS]
+"EnvironmentDirectory"="C:\Program Files\Microsoft Visual Studio .NET 2003\Common7\IDE\"
+"EnvironmentPath"="C:\Program Files\Microsoft Visual Studio .NET 2003\Common7\IDE\devenv.exe"
+"VS7EnvironmentLocation"="C:\Program Files\Microsoft Visual Studio .NET 2003\Common7\IDE\devenv.exe"
+"MSMDir"="C:\Program Files\Common Files\Merge Modules\"
+"VS7CommonBinDir"="C:\Program Files\Microsoft Visual Studio .NET 2003\Common7\Tools\"
+"VS7CommonDir"="C:\Program Files\Microsoft Visual Studio .NET 2003\Common7\"
+"ProductDir"="C:\Program Files\Microsoft Visual Studio .NET 2003\"
+"VSUpdateDir"="C:\Program Files\Microsoft Visual Studio .NET 2003\Setup\VSUpdate\"
+[HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio\7.1\Setup\VS\BuildNumber]
+"1033"="7.1.3088"
+[HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio\7.1\Setup\VS\Pro]
+"ProductDir"="C:\Program Files\Microsoft Visual Studio .NET 2003\"
+[HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio\7.1\VC]
+[HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio\7.1\VC\VC_OBJECTS_PLATFORM_INFO]
+[HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio\7.1\VC\VC_OBJECTS_PLATFORM_INFO\Win32]
+@="{759354D0-6B42-4705-AFFB-56E34D2BC3D4}"
+[HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio\7.1\VC\VC_OBJECTS_PLATFORM_INFO\Win32\Directories]
+"Path Dirs"="$(VCInstallDir)bin;$(VSInstallDir)Common7\Tools\bin\prerelease;$(VSInstallDir)Common7\Tools\bin;$(VSInstallDir)Common7\tools;$(VSInstallDir)Common7\ide;C:\Program Files\HTML Help Workshop\;$(FrameworkSDKDir)bin;$(FrameworkDir)$(FrameworkVersion);C:\Perl\bin\;c:\bin;c:\cygwin\bin;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\Program Files\Common Files\Avid;C:\Program Files\backburner 2\;C:\Program Files\cvsnt;C:\Program Files\Subversion\bin;C:\Program Files\Common Files\Adobe\AGL;C:\Program Files\HTMLDoc"
+"Library Dirs"="$(VCInstallDir)lib;$(VCInstallDir)atlmfc\lib;$(VCInstallDir)PlatformSDK\lib\prerelease;$(VCInstallDir)PlatformSDK\lib;$(FrameworkSDKDir)lib"
+"Include Dirs"="$(VCInstallDir)include;$(VCInstallDir)atlmfc\include;$(VCInstallDir)PlatformSDK\include\prerelease;$(VCInstallDir)PlatformSDK\include;$(FrameworkSDKDir)include"
+"Source Dirs"="$(VCInstallDir)atlmfc\src\mfc;$(VCInstallDir)atlmfc\src\atl;$(VCInstallDir)crt\src"
+"Reference Dirs"="$(FrameWorkDir)$(FrameWorkVersion)"
+[HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio\7.1\VC\VC_OBJECTS_PLATFORM_INFO\Win32\ToolDefaultExtensionLists]
+"VCCLCompilerTool"="*.cpp;*.cxx;*.cc;*.c"
+"VCLinkerTool"="*.obj;*.res;*.lib;*.rsc"
+"VCLibrarianTool"="*.obj;*.res;*.lib;*.rsc"
+"VCMIDLTool"="*.idl;*.odl"
+"VCCustomBuildTool"="*.bat"
+"VCResourceCompilerTool"="*.rc"
+"VCPreBuildEventTool"="*.bat"
+"VCPreLinkEventTool"="*.bat"
+"VCPostBuildEventTool"="*.bat"
+"VCBscMakeTool"="*.sbr"
+"VCNMakeTool"=""
+"VCWebServiceProxyGeneratorTool"="*.discomap"
+"VCWebDeploymentTool"=""
+"VCALinkTool"="*.resources"
+"VCManagedResourceCompilerTool"="*.resx"
+"VCXMLDataGeneratorTool"="*.xsd"
+"VCManagedWrapperGeneratorTool"=""
+"VCAuxiliaryManagedWrapperGeneratorTool"=""
+"VCPrimaryInteropTool"=""
+'''.split('\n')
+
+regdata_8exp = r'''
+[HKEY_LOCAL_MACHINE\Software\Microsoft\VCExpress\8.0]
+"CLR Version"="v2.0.50727"
+"ApplicationID"="VCExpress"
+"SecurityAppID"="{741726F6-1EAE-4680-86A6-6085E8872CF8}"
+"InstallDir"="C:\Program Files\Microsoft Visual Studio 8\Common7\IDE\"
+"EnablePreloadCLR"=dword:00000001
+"RestoreAppPath"=dword:00000001
+[HKEY_LOCAL_MACHINE\Software\Microsoft\VCExpress\8.0\InstalledProducts]
+[HKEY_LOCAL_MACHINE\Software\Microsoft\VCExpress\8.0\InstalledProducts\Microsoft Visual C++]
+"UseInterface"=dword:00000001
+"Package"="{F1C25864-3097-11D2-A5C5-00C04F7968B4}"
+"DefaultProductAttribute"="VC"
+[HKEY_LOCAL_MACHINE\Software\Microsoft\VCExpress\8.0\Setup]
+[HKEY_LOCAL_MACHINE\Software\Microsoft\VCExpress\8.0\Setup\VC]
+"ProductDir"="C:\Program Files\Microsoft Visual Studio 8\VC\"
+[HKEY_LOCAL_MACHINE\Software\Microsoft\VCExpress\8.0\Setup\VS]
+"ProductDir"="C:\Program Files\Microsoft Visual Studio 8\"
+[HKEY_LOCAL_MACHINE\Software\Microsoft\VCExpress\8.0\VC]
+[HKEY_LOCAL_MACHINE\Software\Microsoft\VCExpress\8.0\VC\VC_OBJECTS_PLATFORM_INFO]
+[HKEY_LOCAL_MACHINE\Software\Microsoft\VCExpress\8.0\VC\VC_OBJECTS_PLATFORM_INFO\Win32]
+@="{72f11281-2429-11d7-8bf6-00b0d03daa06}"
+[HKEY_LOCAL_MACHINE\Software\Microsoft\VCExpress\8.0\VC\VC_OBJECTS_PLATFORM_INFO\Win32\ToolDefaultExtensionLists]
+"VCCLCompilerTool"="*.cpp;*.cxx;*.cc;*.c"
+"VCLinkerTool"="*.obj;*.res;*.lib;*.rsc;*.licenses"
+"VCLibrarianTool"="*.obj;*.res;*.lib;*.rsc"
+"VCMIDLTool"="*.idl;*.odl"
+"VCCustomBuildTool"="*.bat"
+"VCResourceCompilerTool"="*.rc"
+"VCPreBuildEventTool"="*.bat"
+"VCPreLinkEventTool"="*.bat"
+"VCPostBuildEventTool"="*.bat"
+"VCBscMakeTool"="*.sbr"
+"VCFxCopTool"="*.dll;*.exe"
+"VCNMakeTool"=""
+"VCWebServiceProxyGeneratorTool"="*.discomap"
+"VCWebDeploymentTool"=""
+"VCALinkTool"="*.resources"
+"VCManagedResourceCompilerTool"="*.resx"
+"VCXMLDataGeneratorTool"="*.xsd"
+"VCManifestTool"="*.manifest"
+"VCXDCMakeTool"="*.xdc"
+'''.split('\n')
+
+regdata_80 = r'''
+[HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio\8.0]
+"CLR Version"="v2.0.50727"
+"ApplicationID"="VisualStudio"
+"ThisVersionDTECLSID"="{BA018599-1DB3-44f9-83B4-461454C84BF8}"
+"ThisVersionSolutionCLSID"="{1B2EEDD6-C203-4d04-BD59-78906E3E8AAB}"
+"SecurityAppID"="{DF99D4F5-9F04-4CEF-9D39-095821B49C77}"
+"InstallDir"="C:\Program Files\Microsoft Visual Studio 8\Common7\IDE\"
+"EnablePreloadCLR"=dword:00000001
+"RestoreAppPath"=dword:00000001
+"Source Directories"="C:\Program Files\Microsoft Visual Studio 8\VC\crt\src\;C:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\src\mfc\;C:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\src\atl\;C:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\include\"
+[HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio\8.0\InstalledProducts]
+[HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio\8.0\InstalledProducts\Microsoft Visual C++]
+"UseInterface"=dword:00000001
+"Package"="{F1C25864-3097-11D2-A5C5-00C04F7968B4}"
+"DefaultProductAttribute"="VC"
+[HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio\8.0\Setup]
+"Dbghelp_path"="C:\Program Files\Microsoft Visual Studio 8\Common7\IDE\"
+[HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio\8.0\Setup\EF]
+"ProductDir"="C:\Program Files\Microsoft Visual Studio 8\EnterpriseFrameworks\"
+[HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio\8.0\Setup\Microsoft Visual Studio 2005 Professional Edition - ENU]
+"SrcPath"="d:\vs\"
+"InstallSuccess"=dword:00000001
+[HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio\8.0\Setup\VC]
+"ProductDir"="C:\Program Files\Microsoft Visual Studio 8\VC\"
+[HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio\8.0\Setup\VS]
+"ProductDir"="C:\Program Files\Microsoft Visual Studio 8\"
+"VS7EnvironmentLocation"="C:\Program Files\Microsoft Visual Studio 8\Common7\IDE\devenv.exe"
+"EnvironmentPath"="C:\Program Files\Microsoft Visual Studio 8\Common7\IDE\devenv.exe"
+"EnvironmentDirectory"="C:\Program Files\Microsoft Visual Studio 8\Common7\IDE\"
+"VS7CommonDir"="C:\Program Files\Microsoft Visual Studio 8\Common7\"
+"VS7CommonBinDir"="C:\Program Files\Microsoft Visual Studio 8\Common7\Tools\"
+[HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio\8.0\Setup\VS\BuildNumber]
+"1033"="8.0.50727.42"
+[HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio\8.0\Setup\VS\Pro]
+"ProductDir"="C:\Program Files\Microsoft Visual Studio 8\"
+[HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio\8.0\VC]
+[HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio\8.0\VC\VC_OBJECTS_PLATFORM_INFO]
+[HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio\8.0\VC\VC_OBJECTS_PLATFORM_INFO\Win32]
+@="{72f11281-2429-11d7-8bf6-00b0d03daa06}"
+[HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio\8.0\VC\VC_OBJECTS_PLATFORM_INFO\Win32\ToolDefaultExtensionLists]
+"VCCLCompilerTool"="*.cpp;*.cxx;*.cc;*.c"
+"VCLinkerTool"="*.obj;*.res;*.lib;*.rsc;*.licenses"
+"VCLibrarianTool"="*.obj;*.res;*.lib;*.rsc"
+"VCMIDLTool"="*.idl;*.odl"
+"VCCustomBuildTool"="*.bat"
+"VCResourceCompilerTool"="*.rc"
+"VCPreBuildEventTool"="*.bat"
+"VCPreLinkEventTool"="*.bat"
+"VCPostBuildEventTool"="*.bat"
+"VCBscMakeTool"="*.sbr"
+"VCFxCopTool"="*.dll;*.exe"
+"VCNMakeTool"=""
+"VCWebServiceProxyGeneratorTool"="*.discomap"
+"VCWebDeploymentTool"=""
+"VCALinkTool"="*.resources"
+"VCManagedResourceCompilerTool"="*.resx"
+"VCXMLDataGeneratorTool"="*.xsd"
+"VCManifestTool"="*.manifest"
+"VCXDCMakeTool"="*.xdc"
+'''.split('\n')
+
+regdata_cv = r'''[HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion]
+"ProgramFilesDir"="C:\Program Files"
+"CommonFilesDir"="C:\Program Files\Common Files"
+"MediaPath"="C:\WINDOWS\Media"
+'''.split('\n')
+
+
+regdata_none = []
+
+class DummyEnv(object):
+ def __init__(self, dict=None):
+ if dict:
+ self.dict = dict
+ else:
+ self.dict = {}
+
+ def Dictionary(self, key = None):
+ if not key:
+ return self.dict
+ return self.dict[key]
+
+ def __setitem__(self,key,value):
+ self.dict[key] = value
+
+ def __getitem__(self,key):
+ return self.dict[key]
+
+ def __contains__(self,key):
+ return key in self.dict
+
+ def has_key(self,name):
+ return name in self.dict
+
+class RegKey(object):
+ """key class for storing an 'open' registry key"""
+ def __init__(self,key):
+ self.key = key
+
+# Warning: this is NOT case-insensitive, unlike the Windows registry.
+# So e.g. HKLM\Software is NOT the same key as HKLM\SOFTWARE.
+class RegNode(object):
+ """node in the dummy registry"""
+ def __init__(self,name):
+ self.valdict = {}
+ self.keydict = {}
+ self.keyarray = []
+ self.valarray = []
+ self.name = name
+
+ def value(self,val):
+ if val in self.valdict:
+ return (self.valdict[val],1)
+ else:
+ raise SCons.Util.RegError
+
+ def addValue(self,name,val):
+ self.valdict[name] = val
+ self.valarray.append(name)
+
+ def valindex(self,index):
+ rv = None
+ try:
+ rv = (self.valarray[index],self.valdict[self.valarray[index]],1)
+ except KeyError:
+ raise SCons.Util.RegError
+ return rv
+
+ def key(self,key,sep = '\\'):
+ if key.find(sep) != -1:
+ keyname, subkeys = key.split(sep,1)
+ else:
+ keyname = key
+ subkeys = ""
+ try:
+ # recurse, and return the lowest level key node
+ if subkeys:
+ return self.keydict[keyname].key(subkeys)
+ else:
+ return self.keydict[keyname]
+ except KeyError:
+ raise SCons.Util.RegError
+
+ def addKey(self,name,sep = '\\'):
+ if name.find(sep) != -1:
+ keyname, subkeys = name.split(sep, 1)
+ else:
+ keyname = name
+ subkeys = ""
+
+ if keyname not in self.keydict:
+ self.keydict[keyname] = RegNode(keyname)
+ self.keyarray.append(keyname)
+
+ # recurse, and return the lowest level key node
+ if subkeys:
+ return self.keydict[keyname].addKey(subkeys)
+ else:
+ return self.keydict[keyname]
+
+ def keyindex(self,index):
+ return self.keydict[self.keyarray[index]]
+
+ def __str__(self):
+ return self._doStr()
+
+ def _doStr(self, indent = ''):
+ rv = ""
+ for value in self.valarray:
+ rv = rv + '%s"%s" = "%s"\n' % (indent, value, self.valdict[value])
+ for key in self.keyarray:
+ rv = rv + "%s%s: {\n"%(indent, key)
+ rv = rv + self.keydict[key]._doStr(indent + ' ')
+ rv = rv + indent + '}\n'
+ return rv
+
+class DummyRegistry(object):
+ """registry class for storing fake registry attributes"""
+ def __init__(self,data):
+ """parse input data into the fake registry"""
+ self.root = RegNode('REGISTRY')
+ self.root.addKey('HKEY_LOCAL_MACHINE')
+ self.root.addKey('HKEY_CURRENT_USER')
+ self.root.addKey('HKEY_USERS')
+ self.root.addKey('HKEY_CLASSES_ROOT')
+
+ self.parse(data)
+
+ def parse(self, data):
+ parents = [None, None]
+ parents[0] = self.root
+ keymatch = re.compile('^\[(.*)\]$')
+ valmatch = re.compile('^(?:"(.*)"|[@])="(.*)"$')
+ for line in data:
+ m1 = keymatch.match(line)
+ if m1:
+ # add a key, set it to current parent.
+ # Also create subkey for Wow6432Node of HKLM\Software;
+ # that's where it looks on a 64-bit machine (tests will fail w/o this)
+ parents[0] = self.root.addKey(m1.group(1))
+ if 'HKEY_LOCAL_MACHINE\\Software' in m1.group(1):
+ p1 = m1.group(1).replace('HKEY_LOCAL_MACHINE\\Software', 'HKEY_LOCAL_MACHINE\\Software\\Wow6432Node')
+ parents[1] = self.root.addKey(p1)
+ else:
+ parents[1] = None
+ else:
+ m2 = valmatch.match(line)
+ if m2:
+ for p in parents:
+ if p:
+ p.addValue(m2.group(1),m2.group(2))
+
+ def OpenKeyEx(self,root,key):
+ if root == SCons.Util.HKEY_CLASSES_ROOT:
+ mykey = 'HKEY_CLASSES_ROOT\\' + key
+ if root == SCons.Util.HKEY_USERS:
+ mykey = 'HKEY_USERS\\' + key
+ if root == SCons.Util.HKEY_CURRENT_USER:
+ mykey = 'HKEY_CURRENT_USER\\' + key
+ if root == SCons.Util.HKEY_LOCAL_MACHINE:
+ mykey = 'HKEY_LOCAL_MACHINE\\' + key
+ debug("Open Key:%s"%mykey)
+ return self.root.key(mykey)
+
+def DummyOpenKeyEx(root, key):
+ return registry.OpenKeyEx(root,key)
+
+def DummyEnumKey(key, index):
+ rv = None
+ try:
+ rv = key.keyarray[index]
+ except IndexError:
+ raise SCons.Util.RegError
+# print "Enum Key",key.name,"[",index,"] =>",rv
+ return rv
+
+def DummyEnumValue(key, index):
+ rv = key.valindex(index)
+# print "Enum Value",key.name,"[",index,"] =>",rv
+ return rv
+
+def DummyQueryValue(key, value):
+ rv = key.value(value)
+# print "Query Value",key.name+"\\"+value,"=>",rv
+ return rv
+
+def DummyExists(path):
+ return 1
+
+class msvsTestCase(unittest.TestCase):
+ """This test case is run several times with different defaults.
+ See its subclasses below."""
+ def setUp(self):
+ debug("THIS TYPE :%s"%self)
+ global registry
+ registry = self.registry
+ from SCons.Tool.MSCommon.vs import reset_installed_visual_studios
+ reset_installed_visual_studios()
+
+ def test_get_default_version(self):
+ """Test retrieval of the default visual studio version"""
+
+ debug("Testing for default version %s"%self.default_version)
+ env = DummyEnv()
+ v1 = get_default_version(env)
+ if v1:
+ assert env['MSVS_VERSION'] == self.default_version, \
+ ("env['MSVS_VERSION'] != self.default_version",
+ env['MSVS_VERSION'],self.default_version)
+ assert env['MSVS']['VERSION'] == self.default_version, \
+ ("env['MSVS']['VERSION'] != self.default_version",
+ env['MSVS']['VERSION'], self.default_version)
+ assert v1 == self.default_version, (self.default_version, v1)
+
+ env = DummyEnv({'MSVS_VERSION':'7.0'})
+ v2 = get_default_version(env)
+ assert env['MSVS_VERSION'] == '7.0', env['MSVS_VERSION']
+ assert env['MSVS']['VERSION'] == '7.0', env['MSVS']['VERSION']
+ assert v2 == '7.0', v2
+
+ env = DummyEnv()
+ v3 = get_default_version(env)
+ if v3 == '7.1':
+ override = '7.0'
+ else:
+ override = '7.1'
+ env['MSVS_VERSION'] = override
+ v3 = get_default_version(env)
+ assert env['MSVS_VERSION'] == override, env['MSVS_VERSION']
+ assert env['MSVS']['VERSION'] == override, env['MSVS']['VERSION']
+ assert v3 == override, v3
+
+ def _TODO_test_merge_default_version(self):
+ """Test the merge_default_version() function"""
+ pass
+
+ def test_query_versions(self):
+ """Test retrieval of the list of visual studio versions"""
+ v1 = query_versions()
+ assert not v1 or str(v1[0]) == self.highest_version, \
+ (v1, self.highest_version)
+ assert len(v1) == self.number_of_versions, v1
+
+ def test_config_generation(self):
+ """Test _DSPGenerator.__init__(...)"""
+ if not self.highest_version :
+ return
+
+ # Initialize 'static' variables
+ version_num, suite = msvs_parse_version(self.highest_version)
+ if version_num >= 10.0:
+ function_test = _GenerateV10DSP
+ elif version_num >= 7.0:
+ function_test = _GenerateV7DSP
+ else:
+ function_test = _GenerateV6DSP
+
+ str_function_test = str(function_test.__init__)
+ dspfile = 'test.dsp'
+ source = 'test.cpp'
+
+ # Create the cmdargs test list
+ list_variant = ['Debug|Win32','Release|Win32',
+ 'Debug|x64', 'Release|x64']
+ list_cmdargs = ['debug=True target_arch=32',
+ 'debug=False target_arch=32',
+ 'debug=True target_arch=x64',
+ 'debug=False target_arch=x64']
+
+ # Tuple list : (parameter, dictionary of expected result per variant)
+ tests_cmdargs = [(None, dict.fromkeys(list_variant, '')),
+ ('', dict.fromkeys(list_variant, '')),
+ (list_cmdargs[0], dict.fromkeys(list_variant, list_cmdargs[0])),
+ (list_cmdargs, dict(list(zip(list_variant, list_cmdargs))))]
+
+ # Run the test for each test case
+ for param_cmdargs, expected_cmdargs in tests_cmdargs:
+ debug('Testing %s. with :\n variant = %s \n cmdargs = "%s"' % \
+ (str_function_test, list_variant, param_cmdargs))
+ param_configs = []
+ expected_configs = {}
+ for platform in ['Win32', 'x64']:
+ for variant in ['Debug', 'Release']:
+ variant_platform = '%s|%s' % (variant, platform)
+ runfile = '%s\\%s\\test.exe' % (platform, variant)
+ buildtarget = '%s\\%s\\test.exe' % (platform, variant)
+ outdir = '%s\\%s' % (platform, variant)
+
+ # Create parameter list for this variant_platform
+ param_configs.append([variant_platform, runfile, buildtarget, outdir])
+
+ # Create expected dictionary result for this variant_platform
+ expected_configs[variant_platform] = \
+ {'variant': variant, 'platform': platform,
+ 'runfile': runfile,
+ 'buildtarget': buildtarget,
+ 'outdir': outdir,
+ 'cmdargs': expected_cmdargs[variant_platform]}
+
+ # Create parameter environment with final parameter dictionary
+ param_dict = dict(list(zip(('variant', 'runfile', 'buildtarget', 'outdir'),
+ [list(l) for l in zip(*param_configs)])))
+ param_dict['cmdargs'] = param_cmdargs
+
+ # Hack to be able to run the test with a 'DummyEnv'
+ class _DummyEnv(DummyEnv):
+ def subst(self, string) :
+ return string
+
+ env = _DummyEnv(param_dict)
+ env['MSVSSCONSCRIPT'] = ''
+ env['MSVS_VERSION'] = self.highest_version
+
+ # Call function to test
+ genDSP = function_test(dspfile, source, env)
+
+ # Check expected result
+ self.assertListEqual(list(genDSP.configs.keys()), list(expected_configs.keys()))
+ for key in list(genDSP.configs.keys()):
+ self.assertDictEqual(genDSP.configs[key].__dict__, expected_configs[key])
+
+class msvs6aTestCase(msvsTestCase):
+ """Test MSVS 6 Registry"""
+ registry = DummyRegistry(regdata_6a + regdata_cv)
+ default_version = '6.0'
+ highest_version = '6.0'
+ number_of_versions = 1
+ install_locs = {
+ '6.0' : {'VSINSTALLDIR': 'C:\\Program Files\\Microsoft Visual Studio\\VC98', 'VCINSTALLDIR': 'C:\\Program Files\\Microsoft Visual Studio\\VC98\\Bin'},
+ '7.0' : {},
+ '7.1' : {},
+ '8.0' : {},
+ '8.0Exp' : {},
+ }
+ default_install_loc = install_locs['6.0']
+
+class msvs6bTestCase(msvsTestCase):
+ """Test Other MSVS 6 Registry"""
+ registry = DummyRegistry(regdata_6b + regdata_cv)
+ default_version = '6.0'
+ highest_version = '6.0'
+ number_of_versions = 1
+ install_locs = {
+ '6.0' : {'VSINSTALLDIR': 'C:\\VS6\\VC98', 'VCINSTALLDIR': 'C:\\VS6\\VC98\\Bin'},
+ '7.0' : {},
+ '7.1' : {},
+ '8.0' : {},
+ '8.0Exp' : {},
+ }
+ default_install_loc = install_locs['6.0']
+
+class msvs6and7TestCase(msvsTestCase):
+ """Test MSVS 6 & 7 Registry"""
+ registry = DummyRegistry(regdata_6b + regdata_7 + regdata_cv)
+ default_version = '7.0'
+ highest_version = '7.0'
+ number_of_versions = 2
+ install_locs = {
+ '6.0' : {'VSINSTALLDIR': 'C:\\VS6\\VC98',
+ 'VCINSTALLDIR': 'C:\\VS6\\VC98\\Bin'},
+ '7.0' : {'VSINSTALLDIR': 'C:\\Program Files\\Microsoft Visual Studio .NET\\Common7',
+ 'VCINSTALLDIR': 'C:\\Program Files\\Microsoft Visual Studio .NET\\Common7\\Tools'},
+ '7.1' : {},
+ '8.0' : {},
+ '8.0Exp' : {},
+ }
+ default_install_loc = install_locs['7.0']
+
+class msvs7TestCase(msvsTestCase):
+ """Test MSVS 7 Registry"""
+ registry = DummyRegistry(regdata_7 + regdata_cv)
+ default_version = '7.0'
+ highest_version = '7.0'
+ number_of_versions = 1
+ install_locs = {
+ '6.0' : {},
+ '7.0' : {'VSINSTALLDIR': 'C:\\Program Files\\Microsoft Visual Studio .NET\\Common7',
+ 'VCINSTALLDIR': 'C:\\Program Files\\Microsoft Visual Studio .NET\\Common7\\Tools'},
+ '7.1' : {},
+ '8.0' : {},
+ '8.0Exp' : {},
+ }
+ default_install_loc = install_locs['7.0']
+
+class msvs71TestCase(msvsTestCase):
+ """Test MSVS 7.1 Registry"""
+ registry = DummyRegistry(regdata_7_1 + regdata_cv)
+ default_version = '7.1'
+ highest_version = '7.1'
+ number_of_versions = 1
+ install_locs = {
+ '6.0' : {},
+ '7.0' : {},
+ '7.1' : {'VSINSTALLDIR': 'C:\\Program Files\\Microsoft Visual Studio .NET 2003\\Common7',
+ 'VCINSTALLDIR': 'C:\\Program Files\\Microsoft Visual Studio .NET 2003\\Common7\\Tools'},
+ '8.0' : {},
+ '8.0Exp' : {},
+ }
+ default_install_loc = install_locs['7.1']
+
+class msvs8ExpTestCase(msvsTestCase): # XXX: only one still not working
+ """Test MSVS 8 Express Registry"""
+ registry = DummyRegistry(regdata_8exp + regdata_cv)
+ default_version = '8.0Exp'
+ highest_version = '8.0Exp'
+ number_of_versions = 1
+ install_locs = {
+ '6.0' : {},
+ '7.0' : {},
+ '7.1' : {},
+ '8.0' : {},
+ '8.0Exp' : {'VSINSTALLDIR': 'C:\\Program Files\\Microsoft Visual Studio 8',
+ 'VCINSTALLDIR': 'C:\\Program Files\\Microsoft Visual Studio 8\\VC'},
+ }
+ default_install_loc = install_locs['8.0Exp']
+
+class msvs80TestCase(msvsTestCase):
+ """Test MSVS 8 Registry"""
+ registry = DummyRegistry(regdata_80 + regdata_cv)
+ default_version = '8.0'
+ highest_version = '8.0'
+ number_of_versions = 1
+ install_locs = {
+ '6.0' : {},
+ '7.0' : {},
+ '7.1' : {},
+ '8.0' : {'VSINSTALLDIR': 'C:\\Program Files\\Microsoft Visual Studio 8',
+ 'VCINSTALLDIR': 'C:\\Program Files\\Microsoft Visual Studio 8\\VC'},
+ '8.0Exp' : {},
+ }
+ default_install_loc = install_locs['8.0']
+
+class msvsEmptyTestCase(msvsTestCase):
+ """Test Empty Registry"""
+ registry = DummyRegistry(regdata_none)
+ default_version = SupportedVSList[0].version
+ highest_version = None
+ number_of_versions = 0
+ install_locs = {
+ '6.0' : {},
+ '7.0' : {},
+ '7.1' : {},
+ '8.0' : {},
+ '8.0Exp' : {},
+ }
+ default_install_loc = install_locs['8.0Exp']
+
+if __name__ == "__main__":
+
+ # only makes sense to test this on win32
+ if sys.platform != 'win32':
+ sys.stdout.write("NO RESULT for msvsTests.py: '%s' is not win32\n" % sys.platform)
+ sys.exit(0)
+
+ SCons.Util.RegOpenKeyEx = DummyOpenKeyEx
+ SCons.Util.RegEnumKey = DummyEnumKey
+ SCons.Util.RegEnumValue = DummyEnumValue
+ SCons.Util.RegQueryValueEx = DummyQueryValue
+
+ os.path.exists = DummyExists # make sure all files exist :-)
+ os.path.isfile = DummyExists # make sure all files are files :-)
+ os.path.isdir = DummyExists # make sure all dirs are dirs :-)
+
+ exit_val = 0
+
+ test_classes = [
+ msvs6aTestCase,
+ msvs6bTestCase,
+ msvs6and7TestCase,
+ msvs7TestCase,
+ msvs71TestCase,
+ msvs8ExpTestCase,
+ msvs80TestCase,
+ msvsEmptyTestCase,
+ ]
+
+ for test_class in test_classes:
+ print("TEST: ", test_class.__doc__)
+ back_osenv = copy.deepcopy(os.environ)
+ try:
+ # XXX: overriding the os.environ is bad, but doing it
+ # correctly is too complicated for now. Those tests should
+ # be fixed
+ for k in ['VS71COMNTOOLS',
+ 'VS80COMNTOOLS',
+ 'VS90COMNTOOLS']:
+ if k in os.environ:
+ del os.environ[k]
+
+ suite = unittest.makeSuite(test_class, 'test_')
+ if not TestUnit.cli.get_runner()().run(suite).wasSuccessful():
+ exit_val = 1
+ finally:
+ os.env = back_osenv
+
+ sys.exit(exit_val)
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/mwcc.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/mwcc.py
new file mode 100644
index 0000000..1455166
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/mwcc.py
@@ -0,0 +1,207 @@
+"""SCons.Tool.mwcc
+
+Tool-specific initialization for the Metrowerks CodeWarrior compiler.
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import os
+import os.path
+
+import SCons.Util
+
+def set_vars(env):
+ """Set MWCW_VERSION, MWCW_VERSIONS, and some codewarrior environment vars
+
+ MWCW_VERSIONS is set to a list of objects representing installed versions
+
+ MWCW_VERSION is set to the version object that will be used for building.
+ MWCW_VERSION can be set to a string during Environment
+ construction to influence which version is chosen, otherwise
+ the latest one from MWCW_VERSIONS is used.
+
+ Returns true if at least one version is found, false otherwise
+ """
+ desired = env.get('MWCW_VERSION', '')
+
+ # return right away if the variables are already set
+ if isinstance(desired, MWVersion):
+ return 1
+ elif desired is None:
+ return 0
+
+ versions = find_versions()
+ version = None
+
+ if desired:
+ for v in versions:
+ if str(v) == desired:
+ version = v
+ elif versions:
+ version = versions[-1]
+
+ env['MWCW_VERSIONS'] = versions
+ env['MWCW_VERSION'] = version
+
+ if version is None:
+ return 0
+
+ env.PrependENVPath('PATH', version.clpath)
+ env.PrependENVPath('PATH', version.dllpath)
+ ENV = env['ENV']
+ ENV['CWFolder'] = version.path
+ ENV['LM_LICENSE_FILE'] = version.license
+ plus = lambda x: '+%s' % x
+ ENV['MWCIncludes'] = os.pathsep.join(map(plus, version.includes))
+ ENV['MWLibraries'] = os.pathsep.join(map(plus, version.libs))
+ return 1
+
+
+def find_versions():
+ """Return a list of MWVersion objects representing installed versions"""
+ versions = []
+
+ ### This function finds CodeWarrior by reading from the registry on
+ ### Windows. Some other method needs to be implemented for other
+ ### platforms, maybe something that calls env.WhereIs('mwcc')
+
+ if SCons.Util.can_read_reg:
+ try:
+ HLM = SCons.Util.HKEY_LOCAL_MACHINE
+ product = 'SOFTWARE\\Metrowerks\\CodeWarrior\\Product Versions'
+ product_key = SCons.Util.RegOpenKeyEx(HLM, product)
+
+ i = 0
+ while True:
+ name = product + '\\' + SCons.Util.RegEnumKey(product_key, i)
+ name_key = SCons.Util.RegOpenKeyEx(HLM, name)
+
+ try:
+ version = SCons.Util.RegQueryValueEx(name_key, 'VERSION')
+ path = SCons.Util.RegQueryValueEx(name_key, 'PATH')
+ mwv = MWVersion(version[0], path[0], 'Win32-X86')
+ versions.append(mwv)
+ except SCons.Util.RegError:
+ pass
+
+ i = i + 1
+
+ except SCons.Util.RegError:
+ pass
+
+ return versions
+
+
+class MWVersion(object):
+ def __init__(self, version, path, platform):
+ self.version = version
+ self.path = path
+ self.platform = platform
+ self.clpath = os.path.join(path, 'Other Metrowerks Tools',
+ 'Command Line Tools')
+ self.dllpath = os.path.join(path, 'Bin')
+
+ # The Metrowerks tools don't store any configuration data so they
+ # are totally dumb when it comes to locating standard headers,
+ # libraries, and other files, expecting all the information
+ # to be handed to them in environment variables. The members set
+ # below control what information scons injects into the environment
+
+ ### The paths below give a normal build environment in CodeWarrior for
+ ### Windows, other versions of CodeWarrior might need different paths.
+
+ msl = os.path.join(path, 'MSL')
+ support = os.path.join(path, '%s Support' % platform)
+
+ self.license = os.path.join(path, 'license.dat')
+ self.includes = [msl, support]
+ self.libs = [msl, support]
+
+ def __str__(self):
+ return self.version
+
+
+CSuffixes = ['.c', '.C']
+CXXSuffixes = ['.cc', '.cpp', '.cxx', '.c++', '.C++']
+
+
+def generate(env):
+ """Add Builders and construction variables for the mwcc to an Environment."""
+ import SCons.Defaults
+ import SCons.Tool
+
+ set_vars(env)
+
+ static_obj, shared_obj = SCons.Tool.createObjBuilders(env)
+
+ for suffix in CSuffixes:
+ static_obj.add_action(suffix, SCons.Defaults.CAction)
+ shared_obj.add_action(suffix, SCons.Defaults.ShCAction)
+
+ for suffix in CXXSuffixes:
+ static_obj.add_action(suffix, SCons.Defaults.CXXAction)
+ shared_obj.add_action(suffix, SCons.Defaults.ShCXXAction)
+
+ env['CCCOMFLAGS'] = '$CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS -nolink -o $TARGET $SOURCES'
+
+ env['CC'] = 'mwcc'
+ env['CCCOM'] = '$CC $CFLAGS $CCFLAGS $CCCOMFLAGS'
+
+ env['CXX'] = 'mwcc'
+ env['CXXCOM'] = '$CXX $CXXFLAGS $CCCOMFLAGS'
+
+ env['SHCC'] = '$CC'
+ env['SHCCFLAGS'] = '$CCFLAGS'
+ env['SHCFLAGS'] = '$CFLAGS'
+ env['SHCCCOM'] = '$SHCC $SHCFLAGS $SHCCFLAGS $CCCOMFLAGS'
+
+ env['SHCXX'] = '$CXX'
+ env['SHCXXFLAGS'] = '$CXXFLAGS'
+ env['SHCXXCOM'] = '$SHCXX $SHCXXFLAGS $CCCOMFLAGS'
+
+ env['CFILESUFFIX'] = '.c'
+ env['CXXFILESUFFIX'] = '.cpp'
+ env['CPPDEFPREFIX'] = '-D'
+ env['CPPDEFSUFFIX'] = ''
+ env['INCPREFIX'] = '-I'
+ env['INCSUFFIX'] = ''
+
+ #env['PCH'] = ?
+ #env['PCHSTOP'] = ?
+
+
+def exists(env):
+ return set_vars(env)
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/mwcc.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/mwcc.xml
new file mode 100644
index 0000000..4073dd5
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/mwcc.xml
@@ -0,0 +1,80 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+__COPYRIGHT__
+
+This file is processed by the bin/SConsDoc.py module.
+See its __doc__ string for a discussion of the format.
+-->
+
+<!DOCTYPE sconsdoc [
+<!ENTITY % scons SYSTEM '../../../../doc/scons.mod'>
+%scons;
+<!ENTITY % builders-mod SYSTEM '../../../../doc/generated/builders.mod'>
+%builders-mod;
+<!ENTITY % functions-mod SYSTEM '../../../../doc/generated/functions.mod'>
+%functions-mod;
+<!ENTITY % tools-mod SYSTEM '../../../../doc/generated/tools.mod'>
+%tools-mod;
+<!ENTITY % variables-mod SYSTEM '../../../../doc/generated/variables.mod'>
+%variables-mod;
+]>
+
+<sconsdoc xmlns="http://www.scons.org/dbxsd/v1.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://www.scons.org/dbxsd/v1.0 http://www.scons.org/dbxsd/v1.0/scons.xsd">
+
+<tool name="mwcc">
+<summary>
+<para>
+Sets construction variables for the Metrowerks CodeWarrior compiler.
+</para>
+</summary>
+<sets>
+<item>MWCW_VERSIONS</item>
+<item>MWCW_VERSION</item>
+<item><!--CCCOMFLAGS--></item>
+<item>CC</item>
+<item>CCCOM</item>
+<item>CXX</item>
+<item>CXXCOM</item>
+<item>SHCC</item>
+<item>SHCCFLAGS</item>
+<item>SHCFLAGS</item>
+<item>SHCCCOM</item>
+<item>SHCXX</item>
+<item>SHCXXFLAGS</item>
+<item>SHCXXCOM</item>
+<item>CFILESUFFIX</item>
+<item>CXXFILESUFFIX</item>
+<item>CPPDEFPREFIX</item>
+<item>CPPDEFSUFFIX</item>
+<item>INCPREFIX</item>
+<item>INCSUFFIX</item>
+</sets>
+<uses>
+<item>CCCOMSTR</item>
+<item>CXXCOMSTR</item>
+<item>SHCCCOMSTR</item>
+<item>SHCXXCOMSTR</item>
+</uses>
+</tool>
+
+<cvar name="MWCW_VERSION">
+<summary>
+<para>
+The version number of the MetroWerks CodeWarrior C compiler
+to be used.
+</para>
+</summary>
+</cvar>
+
+<cvar name="MWCW_VERSIONS">
+<summary>
+<para>
+A list of installed versions of the MetroWerks CodeWarrior C compiler
+on this system.
+</para>
+</summary>
+</cvar>
+
+</sconsdoc>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/mwld.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/mwld.py
new file mode 100644
index 0000000..2067660
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/mwld.py
@@ -0,0 +1,108 @@
+"""SCons.Tool.mwld
+
+Tool-specific initialization for the Metrowerks CodeWarrior linker.
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import SCons.Tool
+
+
+def generate(env):
+ """Add Builders and construction variables for lib to an Environment."""
+ SCons.Tool.createStaticLibBuilder(env)
+ SCons.Tool.createSharedLibBuilder(env)
+ SCons.Tool.createProgBuilder(env)
+
+ env['AR'] = 'mwld'
+ env['ARCOM'] = '$AR $ARFLAGS -library -o $TARGET $SOURCES'
+
+ env['LIBDIRPREFIX'] = '-L'
+ env['LIBDIRSUFFIX'] = ''
+ env['LIBLINKPREFIX'] = '-l'
+ env['LIBLINKSUFFIX'] = '.lib'
+
+ env['LINK'] = 'mwld'
+ env['LINKCOM'] = '$LINK $LINKFLAGS -o $TARGET $SOURCES $_LIBDIRFLAGS $_LIBFLAGS'
+
+ env['SHLINK'] = '$LINK'
+ env['SHLINKFLAGS'] = '$LINKFLAGS'
+ env['SHLINKCOM'] = shlib_action
+ env['SHLIBEMITTER']= shlib_emitter
+ env['LDMODULEEMITTER']= shlib_emitter
+
+
+def exists(env):
+ import SCons.Tool.mwcc
+ return SCons.Tool.mwcc.set_vars(env)
+
+
+def shlib_generator(target, source, env, for_signature):
+ cmd = ['$SHLINK', '$SHLINKFLAGS', '-shared']
+
+ no_import_lib = env.get('no_import_lib', 0)
+ if no_import_lib: cmd.extend('-noimplib')
+
+ dll = env.FindIxes(target, 'SHLIBPREFIX', 'SHLIBSUFFIX')
+ if dll: cmd.extend(['-o', dll])
+
+ implib = env.FindIxes(target, 'LIBPREFIX', 'LIBSUFFIX')
+ if implib: cmd.extend(['-implib', implib.get_string(for_signature)])
+
+ cmd.extend(['$SOURCES', '$_LIBDIRFLAGS', '$_LIBFLAGS'])
+
+ return [cmd]
+
+
+def shlib_emitter(target, source, env):
+ dll = env.FindIxes(target, 'SHLIBPREFIX', 'SHLIBSUFFIX')
+ no_import_lib = env.get('no_import_lib', 0)
+
+ if not dll:
+ raise SCons.Errors.UserError("A shared library should have exactly one target with the suffix: %s" % env.subst("$SHLIBSUFFIX"))
+
+ if not no_import_lib and \
+ not env.FindIxes(target, 'LIBPREFIX', 'LIBSUFFIX'):
+
+ # Append an import library to the list of targets.
+ target.append(env.ReplaceIxes(dll,
+ 'SHLIBPREFIX', 'SHLIBSUFFIX',
+ 'LIBPREFIX', 'LIBSUFFIX'))
+
+ return target, source
+
+
+shlib_action = SCons.Action.Action(shlib_generator, generator=1)
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/mwld.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/mwld.xml
new file mode 100644
index 0000000..a683794
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/mwld.xml
@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+__COPYRIGHT__
+
+This file is processed by the bin/SConsDoc.py module.
+See its __doc__ string for a discussion of the format.
+-->
+
+<!DOCTYPE sconsdoc [
+<!ENTITY % scons SYSTEM '../../../../doc/scons.mod'>
+%scons;
+<!ENTITY % builders-mod SYSTEM '../../../../doc/generated/builders.mod'>
+%builders-mod;
+<!ENTITY % functions-mod SYSTEM '../../../../doc/generated/functions.mod'>
+%functions-mod;
+<!ENTITY % tools-mod SYSTEM '../../../../doc/generated/tools.mod'>
+%tools-mod;
+<!ENTITY % variables-mod SYSTEM '../../../../doc/generated/variables.mod'>
+%variables-mod;
+]>
+
+<sconsdoc xmlns="http://www.scons.org/dbxsd/v1.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://www.scons.org/dbxsd/v1.0 http://www.scons.org/dbxsd/v1.0/scons.xsd">
+
+<tool name="mwld">
+<summary>
+<para>
+Sets construction variables for the Metrowerks CodeWarrior linker.
+</para>
+</summary>
+<sets>
+<item>AR</item>
+<item>ARCOM</item>
+<item>LIBDIRPREFIX</item>
+<item>LIBDIRSUFFIX</item>
+<item>LIBLINKPREFIX</item>
+<item>LIBLINKSUFFIX</item>
+<item>LINK</item>
+<item>LINKCOM</item>
+<item>SHLINK</item>
+<item>SHLINKFLAGS</item>
+<item>SHLINKCOM</item>
+<item><!--SHLIBEMITTER--></item>
+</sets>
+<uses>
+</uses>
+</tool>
+
+</sconsdoc>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/nasm.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/nasm.py
new file mode 100644
index 0000000..ff0bc61
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/nasm.py
@@ -0,0 +1,72 @@
+"""SCons.Tool.nasm
+
+Tool-specific initialization for nasm, the famous Netwide Assembler.
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import SCons.Defaults
+import SCons.Tool
+import SCons.Util
+
+ASSuffixes = ['.s', '.asm', '.ASM']
+ASPPSuffixes = ['.spp', '.SPP', '.sx']
+if SCons.Util.case_sensitive_suffixes('.s', '.S'):
+ ASPPSuffixes.extend(['.S'])
+else:
+ ASSuffixes.extend(['.S'])
+
+def generate(env):
+ """Add Builders and construction variables for nasm to an Environment."""
+ static_obj, shared_obj = SCons.Tool.createObjBuilders(env)
+
+ for suffix in ASSuffixes:
+ static_obj.add_action(suffix, SCons.Defaults.ASAction)
+ static_obj.add_emitter(suffix, SCons.Defaults.StaticObjectEmitter)
+
+ for suffix in ASPPSuffixes:
+ static_obj.add_action(suffix, SCons.Defaults.ASPPAction)
+ static_obj.add_emitter(suffix, SCons.Defaults.StaticObjectEmitter)
+
+ env['AS'] = 'nasm'
+ env['ASFLAGS'] = SCons.Util.CLVar('')
+ env['ASPPFLAGS'] = '$ASFLAGS'
+ env['ASCOM'] = '$AS $ASFLAGS -o $TARGET $SOURCES'
+ env['ASPPCOM'] = '$CC $ASPPFLAGS $CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS -c -o $TARGET $SOURCES'
+
+def exists(env):
+ return env.Detect('nasm')
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/nasm.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/nasm.xml
new file mode 100644
index 0000000..f26eb78
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/nasm.xml
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+__COPYRIGHT__
+
+This file is processed by the bin/SConsDoc.py module.
+See its __doc__ string for a discussion of the format.
+-->
+
+<!DOCTYPE sconsdoc [
+<!ENTITY % scons SYSTEM '../../../../doc/scons.mod'>
+%scons;
+<!ENTITY % builders-mod SYSTEM '../../../../doc/generated/builders.mod'>
+%builders-mod;
+<!ENTITY % functions-mod SYSTEM '../../../../doc/generated/functions.mod'>
+%functions-mod;
+<!ENTITY % tools-mod SYSTEM '../../../../doc/generated/tools.mod'>
+%tools-mod;
+<!ENTITY % variables-mod SYSTEM '../../../../doc/generated/variables.mod'>
+%variables-mod;
+]>
+
+<sconsdoc xmlns="http://www.scons.org/dbxsd/v1.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://www.scons.org/dbxsd/v1.0 http://www.scons.org/dbxsd/v1.0/scons.xsd">
+
+<tool name="nasm">
+<summary>
+<para>
+Sets construction variables for the
+<application>nasm</application> Netwide Assembler.
+</para>
+</summary>
+<sets>
+<item>AS</item>
+<item>ASFLAGS</item>
+<item>ASPPFLAGS</item>
+<item>ASCOM</item>
+<item>ASPPCOM</item>
+</sets>
+<uses>
+<item>ASCOMSTR</item>
+<item>ASPPCOMSTR</item>
+</uses>
+</tool>
+
+</sconsdoc>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/packaging.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/packaging.xml
new file mode 100644
index 0000000..877b88f
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/packaging.xml
@@ -0,0 +1,110 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+__COPYRIGHT__
+
+This file is processed by the bin/SConsDoc.py module.
+See its __doc__ string for a discussion of the format.
+-->
+
+<!DOCTYPE sconsdoc [
+<!ENTITY % scons SYSTEM '../../../../doc/scons.mod'>
+%scons;
+<!ENTITY % builders-mod SYSTEM '../../../../doc/generated/builders.mod'>
+%builders-mod;
+<!ENTITY % functions-mod SYSTEM '../../../../doc/generated/functions.mod'>
+%functions-mod;
+<!ENTITY % tools-mod SYSTEM '../../../../doc/generated/tools.mod'>
+%tools-mod;
+<!ENTITY % variables-mod SYSTEM '../../../../doc/generated/variables.mod'>
+%variables-mod;
+]>
+
+<sconsdoc xmlns="http://www.scons.org/dbxsd/v1.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://www.scons.org/dbxsd/v1.0 http://www.scons.org/dbxsd/v1.0/scons.xsd">
+
+<tool name="packaging">
+<summary>
+<para>
+A framework for building binary and source packages.
+</para>
+</summary>
+</tool>
+
+<builder name="Package">
+<summary>
+<para>
+Builds a Binary Package of the given source files.
+</para>
+
+<example_commands>
+env.Package(source = FindInstalledFiles())
+</example_commands>
+</summary>
+</builder>
+
+<cvar name="JAR">
+<summary>
+<para>
+The Java archive tool.
+</para>
+</summary>
+</cvar>
+
+<cvar name="JARCHDIR">
+<summary>
+<para>
+The directory to which the Java archive tool should change
+(using the
+<option>-C</option>
+option).
+</para>
+</summary>
+</cvar>
+
+<cvar name="JARCOM">
+<summary>
+<para>
+The command line used to call the Java archive tool.
+</para>
+</summary>
+</cvar>
+
+<cvar name="JARCOMSTR">
+<summary>
+<para>
+The string displayed when the Java archive tool
+is called
+If this is not set, then &cv-JARCOM; (the command line) is displayed.
+</para>
+
+<example_commands>
+env = Environment(JARCOMSTR = "JARchiving $SOURCES into $TARGET")
+</example_commands>
+</summary>
+</cvar>
+
+<cvar name="JARFLAGS">
+<summary>
+<para>
+General options passed to the Java archive tool.
+By default this is set to
+<option>cf</option>
+to create the necessary
+<command>jar</command>
+file.
+</para>
+</summary>
+</cvar>
+
+<cvar name="JARSUFFIX">
+<summary>
+<para>
+The suffix for Java archives:
+<filename>.jar</filename>
+by default.
+</para>
+</summary>
+</cvar>
+
+</sconsdoc>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/packaging/__init__.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/packaging/__init__.py
new file mode 100644
index 0000000..dc4b80d
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/packaging/__init__.py
@@ -0,0 +1,311 @@
+"""SCons.Tool.Packaging
+
+SCons Packaging Tool.
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import SCons.Environment
+from SCons.Variables import *
+from SCons.Errors import *
+from SCons.Util import is_List, make_path_relative
+from SCons.Warnings import warn, Warning
+
+import os, imp
+import SCons.Defaults
+
+__all__ = [ 'src_targz', 'src_tarbz2', 'src_zip', 'tarbz2', 'targz', 'zip', 'rpm', 'msi', 'ipk' ]
+
+#
+# Utility and Builder function
+#
+def Tag(env, target, source, *more_tags, **kw_tags):
+ """ Tag a file with the given arguments, just sets the accordingly named
+ attribute on the file object.
+
+ TODO: FIXME
+ """
+ if not target:
+ target=source
+ first_tag=None
+ else:
+ first_tag=source
+
+ if first_tag:
+ kw_tags[first_tag[0]] = ''
+
+ if len(kw_tags) == 0 and len(more_tags) == 0:
+ raise UserError("No tags given.")
+
+ # XXX: sanity checks
+ for x in more_tags:
+ kw_tags[x] = ''
+
+ if not SCons.Util.is_List(target):
+ target=[target]
+ else:
+ # hmm, sometimes the target list, is a list of a list
+ # make sure it is flattened prior to processing.
+ # TODO: perhaps some bug ?!?
+ target=env.Flatten(target)
+
+ for t in target:
+ for (k,v) in kw_tags.items():
+ # all file tags have to start with PACKAGING_, so we can later
+ # differentiate between "normal" object attributes and the
+ # packaging attributes. As the user should not be bothered with
+ # that, the prefix will be added here if missing.
+ if k[:10] != 'PACKAGING_':
+ k='PACKAGING_'+k
+ t.Tag(k, v)
+
+def Package(env, target=None, source=None, **kw):
+ """ Entry point for the package tool.
+ """
+ # check if we need to find the source files ourself
+ if not source:
+ source = env.FindInstalledFiles()
+
+ if len(source)==0:
+ raise UserError("No source for Package() given")
+
+ # decide which types of packages shall be built. Can be defined through
+ # four mechanisms: command line argument, keyword argument,
+ # environment argument and default selection( zip or tar.gz ) in that
+ # order.
+ try: kw['PACKAGETYPE']=env['PACKAGETYPE']
+ except KeyError: pass
+
+ if not kw.get('PACKAGETYPE'):
+ from SCons.Script import GetOption
+ kw['PACKAGETYPE'] = GetOption('package_type')
+
+ if kw['PACKAGETYPE'] == None:
+ if 'Tar' in env['BUILDERS']:
+ kw['PACKAGETYPE']='targz'
+ elif 'Zip' in env['BUILDERS']:
+ kw['PACKAGETYPE']='zip'
+ else:
+ raise UserError("No type for Package() given")
+
+ PACKAGETYPE=kw['PACKAGETYPE']
+ if not is_List(PACKAGETYPE):
+ PACKAGETYPE=PACKAGETYPE.split(',')
+
+ # load the needed packagers.
+ def load_packager(type):
+ try:
+ file,path,desc=imp.find_module(type, __path__)
+ return imp.load_module(type, file, path, desc)
+ except ImportError as e:
+ raise EnvironmentError("packager %s not available: %s"%(type,str(e)))
+
+ packagers=list(map(load_packager, PACKAGETYPE))
+
+ # set up targets and the PACKAGEROOT
+ try:
+ # fill up the target list with a default target name until the PACKAGETYPE
+ # list is of the same size as the target list.
+ if not target: target = []
+
+ size_diff = len(PACKAGETYPE)-len(target)
+ default_name = "%(NAME)s-%(VERSION)s"
+
+ if size_diff>0:
+ default_target = default_name%kw
+ target.extend( [default_target]*size_diff )
+
+ if 'PACKAGEROOT' not in kw:
+ kw['PACKAGEROOT'] = default_name%kw
+
+ except KeyError as e:
+ raise SCons.Errors.UserError( "Missing Packagetag '%s'"%e.args[0] )
+
+ # setup the source files
+ source=env.arg2nodes(source, env.fs.Entry)
+
+ # call the packager to setup the dependencies.
+ targets=[]
+ try:
+ for packager in packagers:
+ t=[target.pop(0)]
+ t=packager.package(env,t,source, **kw)
+ targets.extend(t)
+
+ assert( len(target) == 0 )
+
+ except KeyError as e:
+ raise SCons.Errors.UserError( "Missing Packagetag '%s' for %s packager"\
+ % (e.args[0],packager.__name__) )
+ except TypeError as e:
+ # this exception means that a needed argument for the packager is
+ # missing. As our packagers get their "tags" as named function
+ # arguments we need to find out which one is missing.
+ from inspect import getargspec
+ args,varargs,varkw,defaults=getargspec(packager.package)
+ if defaults!=None:
+ args=args[:-len(defaults)] # throw away arguments with default values
+ args.remove('env')
+ args.remove('target')
+ args.remove('source')
+ # now remove any args for which we have a value in kw.
+ args=[x for x in args if x not in kw]
+
+ if len(args)==0:
+ raise # must be a different error, so re-raise
+ elif len(args)==1:
+ raise SCons.Errors.UserError( "Missing Packagetag '%s' for %s packager"\
+ % (args[0],packager.__name__) )
+ else:
+ raise SCons.Errors.UserError( "Missing Packagetags '%s' for %s packager"\
+ % (", ".join(args),packager.__name__) )
+
+ target=env.arg2nodes(target, env.fs.Entry)
+ targets.extend(env.Alias( 'package', targets ))
+ return targets
+
+#
+# SCons tool initialization functions
+#
+
+added = None
+
+def generate(env):
+ from SCons.Script import AddOption
+ global added
+ if not added:
+ added = 1
+ AddOption('--package-type',
+ dest='package_type',
+ default=None,
+ type="string",
+ action="store",
+ help='The type of package to create.')
+
+ try:
+ env['BUILDERS']['Package']
+ env['BUILDERS']['Tag']
+ except KeyError:
+ env['BUILDERS']['Package'] = Package
+ env['BUILDERS']['Tag'] = Tag
+
+def exists(env):
+ return 1
+
+# XXX
+def options(opts):
+ opts.AddVariables(
+ EnumVariable( 'PACKAGETYPE',
+ 'the type of package to create.',
+ None, allowed_values=list(map( str, __all__ )),
+ ignorecase=2
+ )
+ )
+
+#
+# Internal utility functions
+#
+
+def copy_attr(f1, f2):
+ """ copies the special packaging file attributes from f1 to f2.
+ """
+ copyit = lambda x: not hasattr(f2, x) and x[:10] == 'PACKAGING_'
+ if f1._tags:
+ pattrs = [tag for tag in f1._tags if copyit(tag)]
+ for attr in pattrs:
+ f2.Tag(attr, f1.GetTag(attr))
+
+def putintopackageroot(target, source, env, pkgroot, honor_install_location=1):
+ """ Uses the CopyAs builder to copy all source files to the directory given
+ in pkgroot.
+
+ If honor_install_location is set and the copied source file has an
+ PACKAGING_INSTALL_LOCATION attribute, the PACKAGING_INSTALL_LOCATION is
+ used as the new name of the source file under pkgroot.
+
+ The source file will not be copied if it is already under the the pkgroot
+ directory.
+
+ All attributes of the source file will be copied to the new file.
+ """
+ # make sure the packageroot is a Dir object.
+ if SCons.Util.is_String(pkgroot): pkgroot=env.Dir(pkgroot)
+ if not SCons.Util.is_List(source): source=[source]
+
+ new_source = []
+ for file in source:
+ if SCons.Util.is_String(file): file = env.File(file)
+
+ if file.is_under(pkgroot):
+ new_source.append(file)
+ else:
+ if file.GetTag('PACKAGING_INSTALL_LOCATION') and\
+ honor_install_location:
+ new_name=make_path_relative(file.GetTag('PACKAGING_INSTALL_LOCATION'))
+ else:
+ new_name=make_path_relative(file.get_path())
+
+ new_file=pkgroot.File(new_name)
+ new_file=env.CopyAs(new_file, file)[0]
+ copy_attr(file, new_file)
+ new_source.append(new_file)
+
+ return (target, new_source)
+
+def stripinstallbuilder(target, source, env):
+ """ Strips the install builder action from the source list and stores
+ the final installation location as the "PACKAGING_INSTALL_LOCATION" of
+ the source of the source file. This effectively removes the final installed
+ files from the source list while remembering the installation location.
+
+ It also warns about files which have no install builder attached.
+ """
+ def has_no_install_location(file):
+ return not (file.has_builder() and\
+ hasattr(file.builder, 'name') and\
+ (file.builder.name=="InstallBuilder" or\
+ file.builder.name=="InstallAsBuilder"))
+
+ if len([src for src in source if has_no_install_location(src)]):
+ warn(Warning, "there are files to package which have no\
+ InstallBuilder attached, this might lead to irreproducible packages")
+
+ n_source=[]
+ for s in source:
+ if has_no_install_location(s):
+ n_source.append(s)
+ else:
+ for ss in s.sources:
+ n_source.append(ss)
+ copy_attr(s, ss)
+ ss.Tag('PACKAGING_INSTALL_LOCATION', s.get_path())
+
+ return (target, n_source)
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/packaging/__init__.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/packaging/__init__.xml
new file mode 100644
index 0000000..e4b1865
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/packaging/__init__.xml
@@ -0,0 +1,845 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+__COPYRIGHT__
+
+This file is processed by the bin/SConsDoc.py module.
+See its __doc__ string for a discussion of the format.
+-->
+
+<!DOCTYPE sconsdoc [
+<!ENTITY % scons SYSTEM '../../../../../doc/scons.mod'>
+%scons;
+<!ENTITY % builders-mod SYSTEM '../../../../../doc/generated/builders.mod'>
+%builders-mod;
+<!ENTITY % functions-mod SYSTEM '../../../../../doc/generated/functions.mod'>
+%functions-mod;
+<!ENTITY % tools-mod SYSTEM '../../../../../doc/generated/tools.mod'>
+%tools-mod;
+<!ENTITY % variables-mod SYSTEM '../../../../../doc/generated/variables.mod'>
+%variables-mod;
+]>
+
+<sconsdoc xmlns="http://www.scons.org/dbxsd/v1.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://www.scons.org/dbxsd/v1.0 http://www.scons.org/dbxsd/v1.0/scons.xsd">
+
+<tool name="Packaging">
+<summary>
+<para>
+Sets construction variables for the &b-Package; Builder.
+</para>
+</summary>
+<sets>
+</sets>
+<uses>
+</uses>
+</tool>
+
+<builder name="Package">
+<summary>
+<para>
+Builds software distribution packages.
+Packages consist of files to install and packaging information.
+The former may be specified with the &source; parameter and may be left out,
+in which case the &FindInstalledFiles; function will collect
+all files that have an &b-Install; or &b-InstallAs; Builder attached.
+If the &target; is not specified
+it will be deduced from additional information given to this Builder.
+</para>
+
+<para>
+The packaging information is specified
+with the help of construction variables documented below.
+This information is called a tag to stress that
+some of them can also be attached to files with the &Tag; function.
+The mandatory ones will complain if they were not specified.
+They vary depending on chosen target packager.
+</para>
+
+<para>
+The target packager may be selected with the "PACKAGETYPE" command line
+option or with the &cv-PACKAGETYPE; construction variable. Currently
+the following packagers available:
+</para>
+
+<para>
+ * msi - Microsoft Installer
+ * rpm - Redhat Package Manger
+ * ipkg - Itsy Package Management System
+ * tarbz2 - compressed tar
+ * targz - compressed tar
+ * zip - zip file
+ * src_tarbz2 - compressed tar source
+ * src_targz - compressed tar source
+ * src_zip - zip file source
+</para>
+
+<para>
+An updated list is always available under the "package_type" option when
+running "scons --help" on a project that has packaging activated.
+</para>
+<example_commands>
+env = Environment(tools=['default', 'packaging'])
+env.Install('/bin/', 'my_program')
+env.Package( NAME = 'foo',
+ VERSION = '1.2.3',
+ PACKAGEVERSION = 0,
+ PACKAGETYPE = 'rpm',
+ LICENSE = 'gpl',
+ SUMMARY = 'balalalalal',
+ DESCRIPTION = 'this should be really really long',
+ X_RPM_GROUP = 'Application/fu',
+ SOURCE_URL = 'http://foo.org/foo-1.2.3.tar.gz'
+ )
+</example_commands>
+</summary>
+</builder>
+
+<cvar name="ARCHITECTURE">
+<summary>
+<para>
+Specifies the system architecture for which
+the package is being built.
+The default is the system architecture
+of the machine on which SCons is running.
+This is used to fill in the
+<literal>Architecture:</literal>
+field in an Ipkg
+<filename>control</filename> file,
+and as part of the name of a generated RPM file.
+</para>
+</summary>
+</cvar>
+
+<cvar name="CHANGE_SPECFILE">
+<summary>
+<para>
+A hook for modifying the file that controls the packaging build
+(the <filename>.spec</filename> for RPM,
+the <filename>control</filename> for Ipkg,
+the <filename>.wxs</filename> for MSI).
+If set, the function will be called
+after the SCons template for the file has been written.
+XXX
+</para>
+</summary>
+</cvar>
+
+<cvar name="CHANGELOG">
+<summary>
+<para>
+The name of a file containing the change log text
+to be included in the package.
+This is included as the
+<literal>%changelog</literal>
+section of the RPM
+<filename>.spec</filename> file.
+</para>
+</summary>
+</cvar>
+
+<cvar name="DESCRIPTION">
+<summary>
+<para>
+A long description of the project being packaged.
+This is included in the relevant section
+of the file that controls the packaging build.
+</para>
+</summary>
+</cvar>
+
+<cvar name="DESCRIPTION_lang">
+<summary>
+<para>
+A language-specific long description for
+the specified <varname>lang</varname>.
+This is used to populate a
+<literal>%description -l</literal>
+section of an RPM
+<filename>.spec</filename> file.
+</para>
+</summary>
+</cvar>
+
+<cvar name="LICENSE">
+<summary>
+<para>
+The abbreviated name of the license under which
+this project is released (gpl, lpgl, bsd etc.).
+See http://www.opensource.org/licenses/alphabetical
+for a list of license names.
+</para>
+</summary>
+</cvar>
+
+<cvar name="NAME">
+<summary>
+<para>
+Specfies the name of the project to package.
+</para>
+</summary>
+</cvar>
+
+<cvar name="PACKAGEROOT">
+<summary>
+<para>
+Specifies the directory where all files in resulting archive will be
+placed if applicable. The default value is "$NAME-$VERSION".
+</para>
+</summary>
+</cvar>
+
+<cvar name="PACKAGETYPE">
+<summary>
+<para>
+Selects the package type to build. Currently these are available:
+</para>
+
+<para>
+ * msi - Microsoft Installer
+ * rpm - Redhat Package Manger
+ * ipkg - Itsy Package Management System
+ * tarbz2 - compressed tar
+ * targz - compressed tar
+ * zip - zip file
+ * src_tarbz2 - compressed tar source
+ * src_targz - compressed tar source
+ * src_zip - zip file source
+</para>
+
+<para>
+This may be overridden with the "package_type" command line option.
+</para>
+</summary>
+</cvar>
+
+<cvar name="PACKAGEVERSION">
+<summary>
+<para>
+The version of the package (not the underlying project).
+This is currently only used by the rpm packager
+and should reflect changes in the packaging,
+not the underlying project code itself.
+</para>
+</summary>
+</cvar>
+
+<cvar name="SOURCE_URL">
+<summary>
+<para>
+The URL
+(web address)
+of the location from which the project was retrieved.
+This is used to fill in the
+<literal>Source:</literal>
+field in the controlling information for Ipkg and RPM packages.
+</para>
+</summary>
+</cvar>
+
+<cvar name="SUMMARY">
+<summary>
+<para>
+A short summary of what the project is about.
+This is used to fill in the
+<literal>Summary:</literal>
+field in the controlling information for Ipkg and RPM packages,
+and as the
+<literal>Description:</literal>
+field in MSI packages.
+</para>
+</summary>
+</cvar>
+
+<cvar name="VENDOR">
+<summary>
+<para>
+The person or organization who supply the packaged software.
+This is used to fill in the
+<literal>Vendor:</literal>
+field in the controlling information for RPM packages,
+and the
+<literal>Manufacturer:</literal>
+field in the controlling information for MSI packages.
+</para>
+</summary>
+</cvar>
+
+<cvar name="VERSION">
+<summary>
+<para>
+The version of the project, specified as a string.
+</para>
+</summary>
+</cvar>
+
+
+<cvar name="X_IPK_DEPENDS">
+<summary>
+<para>
+This is used to fill in the
+<literal>Depends:</literal>
+field in the controlling information for Ipkg packages.
+</para>
+</summary>
+</cvar>
+
+<cvar name="X_IPK_DESCRIPTION">
+<summary>
+<para>
+This is used to fill in the
+<literal>Description:</literal>
+field in the controlling information for Ipkg packages.
+The default value is
+<literal>$SUMMARY\n$DESCRIPTION</literal>
+</para>
+</summary>
+</cvar>
+
+<cvar name="X_IPK_MAINTAINER">
+<summary>
+<para>
+This is used to fill in the
+<literal>Maintainer:</literal>
+field in the controlling information for Ipkg packages.
+</para>
+</summary>
+</cvar>
+
+<cvar name="X_IPK_PRIORITY">
+<summary>
+<para>
+This is used to fill in the
+<literal>Priority:</literal>
+field in the controlling information for Ipkg packages.
+</para>
+</summary>
+</cvar>
+
+<cvar name="X_IPK_SECTION">
+<summary>
+<para>
+This is used to fill in the
+<literal>Section:</literal>
+field in the controlling information for Ipkg packages.
+</para>
+</summary>
+</cvar>
+
+
+
+<cvar name="X_MSI_LANGUAGE">
+<summary>
+<para>
+This is used to fill in the
+<literal>Language:</literal>
+attribute in the controlling information for MSI packages.
+</para>
+</summary>
+</cvar>
+
+<cvar name="X_MSI_LICENSE_TEXT">
+<summary>
+<para>
+The text of the software license in RTF format.
+Carriage return characters will be
+replaced with the RTF equivalent \\par.
+</para>
+</summary>
+</cvar>
+
+<cvar name="X_MSI_UPGRADE_CODE">
+<summary>
+<para>
+TODO
+</para>
+</summary>
+</cvar>
+
+
+<cvar name="X_RPM_AUTOREQPROV">
+<summary>
+<para>
+This is used to fill in the
+<literal>AutoReqProv:</literal>
+field in the RPM
+<filename>.spec</filename> file.
+</para>
+</summary>
+</cvar>
+
+<cvar name="X_RPM_BUILD">
+<summary>
+<para>
+internal, but overridable
+</para>
+</summary>
+</cvar>
+
+<cvar name="X_RPM_BUILDREQUIRES">
+<summary>
+<para>
+This is used to fill in the
+<literal>BuildRequires:</literal>
+field in the RPM
+<filename>.spec</filename> file.
+</para>
+</summary>
+</cvar>
+
+<cvar name="X_RPM_BUILDROOT">
+<summary>
+<para>
+internal, but overridable
+</para>
+</summary>
+</cvar>
+
+<cvar name="X_RPM_CLEAN">
+<summary>
+<para>
+internal, but overridable
+</para>
+</summary>
+</cvar>
+
+<cvar name="X_RPM_CONFLICTS">
+<summary>
+<para>
+This is used to fill in the
+<literal>Conflicts:</literal>
+field in the RPM
+<filename>.spec</filename> file.
+</para>
+</summary>
+</cvar>
+
+<cvar name="X_RPM_DEFATTR">
+<summary>
+<para>
+This value is used as the default attributes
+for the files in the RPM package.
+The default value is
+<literal>(-,root,root)</literal>.
+</para>
+</summary>
+</cvar>
+
+<cvar name="X_RPM_DISTRIBUTION">
+<summary>
+<para>
+This is used to fill in the
+<literal>Distribution:</literal>
+field in the RPM
+<filename>.spec</filename> file.
+</para>
+</summary>
+</cvar>
+
+<cvar name="X_RPM_EPOCH">
+<summary>
+<para>
+This is used to fill in the
+<literal>Epoch:</literal>
+field in the controlling information for RPM packages.
+</para>
+</summary>
+</cvar>
+
+<cvar name="X_RPM_EXCLUDEARCH">
+<summary>
+<para>
+This is used to fill in the
+<literal>ExcludeArch:</literal>
+field in the RPM
+<filename>.spec</filename> file.
+</para>
+</summary>
+</cvar>
+
+<cvar name="X_RPM_EXLUSIVEARCH">
+<summary>
+<para>
+This is used to fill in the
+<literal>ExclusiveArch:</literal>
+field in the RPM
+<filename>.spec</filename> file.
+</para>
+</summary>
+</cvar>
+
+<cvar name="X_RPM_GROUP">
+<summary>
+<para>
+This is used to fill in the
+<literal>Group:</literal>
+field in the RPM
+<filename>.spec</filename> file.
+</para>
+</summary>
+</cvar>
+
+<cvar name="X_RPM_GROUP_lang">
+<summary>
+<para>
+This is used to fill in the
+<literal>Group(lang):</literal>
+field in the RPM
+<filename>.spec</filename> file.
+Note that
+<varname>lang</varname>
+is not literal
+and should be replaced by
+the appropriate language code.
+</para>
+</summary>
+</cvar>
+
+<cvar name="X_RPM_ICON">
+<summary>
+<para>
+This is used to fill in the
+<literal>Icon:</literal>
+field in the RPM
+<filename>.spec</filename> file.
+</para>
+</summary>
+</cvar>
+
+<cvar name="X_RPM_INSTALL">
+<summary>
+<para>
+internal, but overridable
+</para>
+</summary>
+</cvar>
+
+<cvar name="X_RPM_PACKAGER">
+<summary>
+<para>
+This is used to fill in the
+<literal>Packager:</literal>
+field in the RPM
+<filename>.spec</filename> file.
+</para>
+</summary>
+</cvar>
+
+<cvar name="X_RPM_PROVIDES">
+<summary>
+<para>
+This is used to fill in the
+<literal>Provides:</literal>
+field in the RPM
+<filename>.spec</filename> file.
+</para>
+</summary>
+</cvar>
+
+<cvar name="X_RPM_POSTINSTALL">
+<summary>
+<para>
+This is used to fill in the
+<literal>%post:</literal>
+section in the RPM
+<filename>.spec</filename> file.
+</para>
+</summary>
+</cvar>
+
+<cvar name="X_RPM_PREINSTALL">
+<summary>
+<para>
+This is used to fill in the
+<literal>%pre:</literal>
+section in the RPM
+<filename>.spec</filename> file.
+</para>
+</summary>
+</cvar>
+
+<cvar name="X_RPM_PREFIX">
+<summary>
+<para>
+This is used to fill in the
+<literal>Prefix:</literal>
+field in the RPM
+<filename>.spec</filename> file.
+</para>
+</summary>
+</cvar>
+
+<cvar name="X_RPM_PREP">
+<summary>
+<para>
+internal, but overridable
+</para>
+</summary>
+</cvar>
+
+<cvar name="X_RPM_POSTUNINSTALL">
+<summary>
+<para>
+This is used to fill in the
+<literal>%postun:</literal>
+section in the RPM
+<filename>.spec</filename> file.
+</para>
+</summary>
+</cvar>
+
+<cvar name="X_RPM_PREUNINSTALL">
+<summary>
+<para>
+This is used to fill in the
+<literal>%preun:</literal>
+section in the RPM
+<filename>.spec</filename> file.
+</para>
+</summary>
+</cvar>
+
+<cvar name="X_RPM_REQUIRES">
+<summary>
+<para>
+This is used to fill in the
+<literal>Requires:</literal>
+field in the RPM
+<filename>.spec</filename> file.
+</para>
+</summary>
+</cvar>
+
+<cvar name="X_RPM_SERIAL">
+<summary>
+<para>
+This is used to fill in the
+<literal>Serial:</literal>
+field in the RPM
+<filename>.spec</filename> file.
+</para>
+</summary>
+</cvar>
+
+<cvar name="X_RPM_URL">
+<summary>
+<para>
+This is used to fill in the
+<literal>Url:</literal>
+field in the RPM
+<filename>.spec</filename> file.
+</para>
+</summary>
+</cvar>
+
+
+<!--
+
+THE FOLLOWING AREN'T CONSTRUCTION VARIABLES,
+THEY'RE "TAGS" THAT CAN BE ATTACHED
+TO DIFFERENT FILES OR DIRECTORIES.
+NOT SURE YET WHAT TO DO ABOUT THESE.
+
+<cvar name="CONFIG">
+<summary>
+<para>
+TODO
+</para>
+</summary>
+</cvar>
+
+<cvar name="CONFIG_NOREPLACE">
+<summary>
+<para>
+TODO
+</para>
+</summary>
+</cvar>
+
+<cvar name="DOC">
+<summary>
+<para>
+TODO
+</para>
+</summary>
+</cvar>
+
+<cvar name="INSTALL_LOCATION">
+<summary>
+<para>
+internal, but overridable, TODO
+</para>
+</summary>
+</cvar>
+
+<cvar name="LANG_lang">
+<summary>
+<para>
+TODO
+</para>
+</summary>
+</cvar>
+
+<cvar name="UNIX_ATTR">
+<summary>
+<para>
+TODO
+</para>
+</summary>
+</cvar>
+
+<cvar name="X_IPK_POSTINST">
+<summary>
+<para>
+TODO
+</para>
+</summary>
+</cvar>
+
+<cvar name="X_IPK_POSTRM">
+<summary>
+<para>
+TODO
+</para>
+</summary>
+</cvar>
+
+<cvar name="X_IPK_PREINST">
+<summary>
+<para>
+TODO
+</para>
+</summary>
+</cvar>
+
+<cvar name="X_IPK_PRERM">
+<summary>
+<para>
+TODO
+</para>
+</summary>
+</cvar>
+
+<cvar name="X_MSI_FEATURE">
+<summary>
+<para>
+TODO
+</para>
+</summary>
+</cvar>
+
+<cvar name="X_MSI_FILEID">
+<summary>
+<para>
+TODO
+</para>
+</summary>
+</cvar>
+
+<cvar name="X_MSI_LONGNAME">
+<summary>
+<para>
+TODO
+</para>
+</summary>
+</cvar>
+
+<cvar name="X_MSI_SHORTNAME">
+<summary>
+<para>
+TODO
+</para>
+</summary>
+</cvar>
+
+<cvar name="X_MSI_VITAL">
+<summary>
+<para>
+TODO
+</para>
+</summary>
+</cvar>
+
+<cvar name="X_RPM_DIR">
+<summary>
+<para>
+TODO
+</para>
+</summary>
+</cvar>
+
+<cvar name="X_RPM_DOCDIR">
+<summary>
+<para>
+TODO
+</para>
+</summary>
+</cvar>
+
+<cvar name="X_RPM_GHOST">
+<summary>
+<para>
+TODO
+</para>
+</summary>
+</cvar>
+
+<cvar name="X_RPM_VERIFY">
+<summary>
+<para>
+TODO
+</para>
+</summary>
+</cvar>
+
+-->
+
+
+<scons_function name="Tag">
+<arguments signature="global">
+(node, tags)
+</arguments>
+<summary>
+<para>
+Annotates file or directory Nodes with
+information about how the
+&b-link-Package;
+Builder should package those files or directories.
+All tags are optional.
+</para>
+
+<para>
+Examples:
+</para>
+
+<example_commands>
+# makes sure the built library will be installed with 0644 file
+# access mode
+Tag( Library( 'lib.c' ), UNIX_ATTR="0644" )
+
+# marks file2.txt to be a documentation file
+Tag( 'file2.txt', DOC )
+</example_commands>
+</summary>
+</scons_function>
+
+
+<!--
+<function name="FindSourceFiles">
+<summary>
+<para>
+A convenience function which returns all leaves of the build tree.
+</para>
+</summary>
+</function>
+
+<builder name="FindInstalledFiles">
+<summary>
+<para>
+Returns all files "built" by the &b-Install; or &b-InstallAs; builders.
+</para>
+</summary>
+</function>
+-->
+
+</sconsdoc>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/packaging/ipk.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/packaging/ipk.py
new file mode 100644
index 0000000..ad4fe0f
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/packaging/ipk.py
@@ -0,0 +1,185 @@
+"""SCons.Tool.Packaging.ipk
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import SCons.Builder
+import SCons.Node.FS
+import os
+
+from SCons.Tool.packaging import stripinstallbuilder, putintopackageroot
+
+def package(env, target, source, PACKAGEROOT, NAME, VERSION, DESCRIPTION,
+ SUMMARY, X_IPK_PRIORITY, X_IPK_SECTION, SOURCE_URL,
+ X_IPK_MAINTAINER, X_IPK_DEPENDS, **kw):
+ """ This function prepares the packageroot directory for packaging with the
+ ipkg builder.
+ """
+ SCons.Tool.Tool('ipkg').generate(env)
+
+ # setup the Ipkg builder
+ bld = env['BUILDERS']['Ipkg']
+ target, source = stripinstallbuilder(target, source, env)
+ target, source = putintopackageroot(target, source, env, PACKAGEROOT)
+
+ # This should be overrideable from the construction environment,
+ # which it is by using ARCHITECTURE=.
+ # Guessing based on what os.uname() returns at least allows it
+ # to work for both i386 and x86_64 Linux systems.
+ archmap = {
+ 'i686' : 'i386',
+ 'i586' : 'i386',
+ 'i486' : 'i386',
+ }
+
+ buildarchitecture = os.uname()[4]
+ buildarchitecture = archmap.get(buildarchitecture, buildarchitecture)
+
+ if 'ARCHITECTURE' in kw:
+ buildarchitecture = kw['ARCHITECTURE']
+
+ # setup the kw to contain the mandatory arguments to this function.
+ # do this before calling any builder or setup function
+ loc=locals()
+ del loc['kw']
+ kw.update(loc)
+ del kw['source'], kw['target'], kw['env']
+
+ # generate the specfile
+ specfile = gen_ipk_dir(PACKAGEROOT, source, env, kw)
+
+ # override the default target.
+ if str(target[0])=="%s-%s"%(NAME, VERSION):
+ target=[ "%s_%s_%s.ipk"%(NAME, VERSION, buildarchitecture) ]
+
+ # now apply the Ipkg builder
+ return bld(env, target, specfile, **kw)
+
+def gen_ipk_dir(proot, source, env, kw):
+ # make sure the packageroot is a Dir object.
+ if SCons.Util.is_String(proot): proot=env.Dir(proot)
+
+ # create the specfile builder
+ s_bld=SCons.Builder.Builder(
+ action = build_specfiles,
+ )
+
+ # create the specfile targets
+ spec_target=[]
+ control=proot.Dir('CONTROL')
+ spec_target.append(control.File('control'))
+ spec_target.append(control.File('conffiles'))
+ spec_target.append(control.File('postrm'))
+ spec_target.append(control.File('prerm'))
+ spec_target.append(control.File('postinst'))
+ spec_target.append(control.File('preinst'))
+
+ # apply the builder to the specfile targets
+ s_bld(env, spec_target, source, **kw)
+
+ # the packageroot directory does now contain the specfiles.
+ return proot
+
+def build_specfiles(source, target, env):
+ """ Filter the targets for the needed files and use the variables in env
+ to create the specfile.
+ """
+ #
+ # At first we care for the CONTROL/control file, which is the main file for ipk.
+ #
+ # For this we need to open multiple files in random order, so we store into
+ # a dict so they can be easily accessed.
+ #
+ #
+ opened_files={}
+ def open_file(needle, haystack):
+ try:
+ return opened_files[needle]
+ except KeyError:
+ file=filter(lambda x: x.get_path().rfind(needle)!=-1, haystack)[0]
+ opened_files[needle]=open(file.get_abspath(), 'w')
+ return opened_files[needle]
+
+ control_file=open_file('control', target)
+
+ if 'X_IPK_DESCRIPTION' not in env:
+ env['X_IPK_DESCRIPTION']="%s\n %s"%(env['SUMMARY'],
+ env['DESCRIPTION'].replace('\n', '\n '))
+
+
+ content = """
+Package: $NAME
+Version: $VERSION
+Priority: $X_IPK_PRIORITY
+Section: $X_IPK_SECTION
+Source: $SOURCE_URL
+Architecture: $ARCHITECTURE
+Maintainer: $X_IPK_MAINTAINER
+Depends: $X_IPK_DEPENDS
+Description: $X_IPK_DESCRIPTION
+"""
+
+ control_file.write(env.subst(content))
+
+ #
+ # now handle the various other files, which purpose it is to set post-,
+ # pre-scripts and mark files as config files.
+ #
+ # We do so by filtering the source files for files which are marked with
+ # the "config" tag and afterwards we do the same for x_ipk_postrm,
+ # x_ipk_prerm, x_ipk_postinst and x_ipk_preinst tags.
+ #
+ # The first one will write the name of the file into the file
+ # CONTROL/configfiles, the latter add the content of the x_ipk_* variable
+ # into the same named file.
+ #
+ for f in [x for x in source if 'PACKAGING_CONFIG' in dir(x)]:
+ config=open_file('conffiles')
+ config.write(f.PACKAGING_INSTALL_LOCATION)
+ config.write('\n')
+
+ for str in 'POSTRM PRERM POSTINST PREINST'.split():
+ name="PACKAGING_X_IPK_%s"%str
+ for f in [x for x in source if name in dir(x)]:
+ file=open_file(name)
+ file.write(env[str])
+
+ #
+ # close all opened files
+ for f in list(opened_files.values()):
+ f.close()
+
+ # call a user specified function
+ if 'CHANGE_SPECFILE' in env:
+ content += env['CHANGE_SPECFILE'](target)
+
+ return 0
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/packaging/msi.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/packaging/msi.py
new file mode 100644
index 0000000..c25f856
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/packaging/msi.py
@@ -0,0 +1,527 @@
+"""SCons.Tool.packaging.msi
+
+The msi packager.
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import os
+import SCons
+from SCons.Action import Action
+from SCons.Builder import Builder
+
+from xml.dom.minidom import *
+from xml.sax.saxutils import escape
+
+from SCons.Tool.packaging import stripinstallbuilder
+
+#
+# Utility functions
+#
+def convert_to_id(s, id_set):
+ """ Some parts of .wxs need an Id attribute (for example: The File and
+ Directory directives. The charset is limited to A-Z, a-z, digits,
+ underscores, periods. Each Id must begin with a letter or with a
+ underscore. Google for "CNDL0015" for information about this.
+
+ Requirements:
+ * the string created must only contain chars from the target charset.
+ * the string created must have a minimal editing distance from the
+ original string.
+ * the string created must be unique for the whole .wxs file.
+
+ Observation:
+ * There are 62 chars in the charset.
+
+ Idea:
+ * filter out forbidden characters. Check for a collision with the help
+ of the id_set. Add the number of the number of the collision at the
+ end of the created string. Furthermore care for a correct start of
+ the string.
+ """
+ charset = 'ABCDEFGHIJKLMNOPQRSTUVWXYabcdefghijklmnopqrstuvwxyz0123456789_.'
+ if s[0] in '0123456789.':
+ s += '_'+s
+ id = [c for c in s if c in charset]
+
+ # did we already generate an id for this file?
+ try:
+ return id_set[id][s]
+ except KeyError:
+ # no we did not, so initialize with the id
+ if id not in id_set: id_set[id] = { s : id }
+ # there is a collision, generate an id which is unique by appending
+ # the collision number
+ else: id_set[id][s] = id + str(len(id_set[id]))
+
+ return id_set[id][s]
+
+def is_dos_short_file_name(file):
+ """ Examine if the given file is in the 8.3 form.
+ """
+ fname, ext = os.path.splitext(file)
+ proper_ext = len(ext) == 0 or (2 <= len(ext) <= 4) # the ext contains the dot
+ proper_fname = file.isupper() and len(fname) <= 8
+
+ return proper_ext and proper_fname
+
+def gen_dos_short_file_name(file, filename_set):
+ """ See http://support.microsoft.com/default.aspx?scid=kb;en-us;Q142982
+
+ These are no complete 8.3 dos short names. The ~ char is missing and
+ replaced with one character from the filename. WiX warns about such
+ filenames, since a collision might occur. Google for "CNDL1014" for
+ more information.
+ """
+ # guard this to not confuse the generation
+ if is_dos_short_file_name(file):
+ return file
+
+ fname, ext = os.path.splitext(file) # ext contains the dot
+
+ # first try if it suffices to convert to upper
+ file = file.upper()
+ if is_dos_short_file_name(file):
+ return file
+
+ # strip forbidden characters.
+ forbidden = '."/[]:;=, '
+ fname = [c for c in fname if c not in forbidden]
+
+ # check if we already generated a filename with the same number:
+ # thisis1.txt, thisis2.txt etc.
+ duplicate, num = not None, 1
+ while duplicate:
+ shortname = "%s%s" % (fname[:8-len(str(num))].upper(),\
+ str(num))
+ if len(ext) >= 2:
+ shortname = "%s%s" % (shortname, ext[:4].upper())
+
+ duplicate, num = shortname in filename_set, num+1
+
+ assert( is_dos_short_file_name(shortname) ), 'shortname is %s, longname is %s' % (shortname, file)
+ filename_set.append(shortname)
+ return shortname
+
+def create_feature_dict(files):
+ """ X_MSI_FEATURE and doc FileTag's can be used to collect files in a
+ hierarchy. This function collects the files into this hierarchy.
+ """
+ dict = {}
+
+ def add_to_dict( feature, file ):
+ if not SCons.Util.is_List( feature ):
+ feature = [ feature ]
+
+ for f in feature:
+ if f not in dict:
+ dict[ f ] = [ file ]
+ else:
+ dict[ f ].append( file )
+
+ for file in files:
+ if hasattr( file, 'PACKAGING_X_MSI_FEATURE' ):
+ add_to_dict(file.PACKAGING_X_MSI_FEATURE, file)
+ elif hasattr( file, 'PACKAGING_DOC' ):
+ add_to_dict( 'PACKAGING_DOC', file )
+ else:
+ add_to_dict( 'default', file )
+
+ return dict
+
+def generate_guids(root):
+ """ generates globally unique identifiers for parts of the xml which need
+ them.
+
+ Component tags have a special requirement. Their UUID is only allowed to
+ change if the list of their contained resources has changed. This allows
+ for clean removal and proper updates.
+
+ To handle this requirement, the uuid is generated with an md5 hashing the
+ whole subtree of a xml node.
+ """
+ from hashlib import md5
+
+ # specify which tags need a guid and in which attribute this should be stored.
+ needs_id = { 'Product' : 'Id',
+ 'Package' : 'Id',
+ 'Component' : 'Guid',
+ }
+
+ # find all XMl nodes matching the key, retrieve their attribute, hash their
+ # subtree, convert hash to string and add as a attribute to the xml node.
+ for (key,value) in needs_id.items():
+ node_list = root.getElementsByTagName(key)
+ attribute = value
+ for node in node_list:
+ hash = md5(node.toxml()).hexdigest()
+ hash_str = '%s-%s-%s-%s-%s' % ( hash[:8], hash[8:12], hash[12:16], hash[16:20], hash[20:] )
+ node.attributes[attribute] = hash_str
+
+
+
+def string_wxsfile(target, source, env):
+ return "building WiX file %s"%( target[0].path )
+
+def build_wxsfile(target, source, env):
+ """ Compiles a .wxs file from the keywords given in env['msi_spec'] and
+ by analyzing the tree of source nodes and their tags.
+ """
+ file = open(target[0].get_abspath(), 'w')
+
+ try:
+ # Create a document with the Wix root tag
+ doc = Document()
+ root = doc.createElement( 'Wix' )
+ root.attributes['xmlns']='http://schemas.microsoft.com/wix/2003/01/wi'
+ doc.appendChild( root )
+
+ filename_set = [] # this is to circumvent duplicates in the shortnames
+ id_set = {} # this is to circumvent duplicates in the ids
+
+ # Create the content
+ build_wxsfile_header_section(root, env)
+ build_wxsfile_file_section(root, source, env['NAME'], env['VERSION'], env['VENDOR'], filename_set, id_set)
+ generate_guids(root)
+ build_wxsfile_features_section(root, source, env['NAME'], env['VERSION'], env['SUMMARY'], id_set)
+ build_wxsfile_default_gui(root)
+ build_license_file(target[0].get_dir(), env)
+
+ # write the xml to a file
+ file.write( doc.toprettyxml() )
+
+ # call a user specified function
+ if 'CHANGE_SPECFILE' in env:
+ env['CHANGE_SPECFILE'](target, source)
+
+ except KeyError as e:
+ raise SCons.Errors.UserError( '"%s" package field for MSI is missing.' % e.args[0] )
+
+#
+# setup function
+#
+def create_default_directory_layout(root, NAME, VERSION, VENDOR, filename_set):
+ """ Create the wix default target directory layout and return the innermost
+ directory.
+
+ We assume that the XML tree delivered in the root argument already contains
+ the Product tag.
+
+ Everything is put under the PFiles directory property defined by WiX.
+ After that a directory with the 'VENDOR' tag is placed and then a
+ directory with the name of the project and its VERSION. This leads to the
+ following TARGET Directory Layout:
+ C:\<PFiles>\<Vendor>\<Projectname-Version>\
+ Example: C:\Programme\Company\Product-1.2\
+ """
+ doc = Document()
+ d1 = doc.createElement( 'Directory' )
+ d1.attributes['Id'] = 'TARGETDIR'
+ d1.attributes['Name'] = 'SourceDir'
+
+ d2 = doc.createElement( 'Directory' )
+ d2.attributes['Id'] = 'ProgramFilesFolder'
+ d2.attributes['Name'] = 'PFiles'
+
+ d3 = doc.createElement( 'Directory' )
+ d3.attributes['Id'] = 'VENDOR_folder'
+ d3.attributes['Name'] = escape( gen_dos_short_file_name( VENDOR, filename_set ) )
+ d3.attributes['LongName'] = escape( VENDOR )
+
+ d4 = doc.createElement( 'Directory' )
+ project_folder = "%s-%s" % ( NAME, VERSION )
+ d4.attributes['Id'] = 'MY_DEFAULT_FOLDER'
+ d4.attributes['Name'] = escape( gen_dos_short_file_name( project_folder, filename_set ) )
+ d4.attributes['LongName'] = escape( project_folder )
+
+ d1.childNodes.append( d2 )
+ d2.childNodes.append( d3 )
+ d3.childNodes.append( d4 )
+
+ root.getElementsByTagName('Product')[0].childNodes.append( d1 )
+
+ return d4
+
+#
+# mandatory and optional file tags
+#
+def build_wxsfile_file_section(root, files, NAME, VERSION, VENDOR, filename_set, id_set):
+ """ Builds the Component sections of the wxs file with their included files.
+
+ Files need to be specified in 8.3 format and in the long name format, long
+ filenames will be converted automatically.
+
+ Features are specficied with the 'X_MSI_FEATURE' or 'DOC' FileTag.
+ """
+ root = create_default_directory_layout( root, NAME, VERSION, VENDOR, filename_set )
+ components = create_feature_dict( files )
+ factory = Document()
+
+ def get_directory( node, dir ):
+ """ Returns the node under the given node representing the directory.
+
+ Returns the component node if dir is None or empty.
+ """
+ if dir == '' or not dir:
+ return node
+
+ Directory = node
+ dir_parts = dir.split(os.path.sep)
+
+ # to make sure that our directory ids are unique, the parent folders are
+ # consecutively added to upper_dir
+ upper_dir = ''
+
+ # walk down the xml tree finding parts of the directory
+ dir_parts = [d for d in dir_parts if d != '']
+ for d in dir_parts[:]:
+ already_created = [c for c in Directory.childNodes
+ if c.nodeName == 'Directory'
+ and c.attributes['LongName'].value == escape(d)]
+
+ if already_created != []:
+ Directory = already_created[0]
+ dir_parts.remove(d)
+ upper_dir += d
+ else:
+ break
+
+ for d in dir_parts:
+ nDirectory = factory.createElement( 'Directory' )
+ nDirectory.attributes['LongName'] = escape( d )
+ nDirectory.attributes['Name'] = escape( gen_dos_short_file_name( d, filename_set ) )
+ upper_dir += d
+ nDirectory.attributes['Id'] = convert_to_id( upper_dir, id_set )
+
+ Directory.childNodes.append( nDirectory )
+ Directory = nDirectory
+
+ return Directory
+
+ for file in files:
+ drive, path = os.path.splitdrive( file.PACKAGING_INSTALL_LOCATION )
+ filename = os.path.basename( path )
+ dirname = os.path.dirname( path )
+
+ h = {
+ # tagname : default value
+ 'PACKAGING_X_MSI_VITAL' : 'yes',
+ 'PACKAGING_X_MSI_FILEID' : convert_to_id(filename, id_set),
+ 'PACKAGING_X_MSI_LONGNAME' : filename,
+ 'PACKAGING_X_MSI_SHORTNAME' : gen_dos_short_file_name(filename, filename_set),
+ 'PACKAGING_X_MSI_SOURCE' : file.get_path(),
+ }
+
+ # fill in the default tags given above.
+ for k,v in [ (k, v) for (k,v) in h.items() if not hasattr(file, k) ]:
+ setattr( file, k, v )
+
+ File = factory.createElement( 'File' )
+ File.attributes['LongName'] = escape( file.PACKAGING_X_MSI_LONGNAME )
+ File.attributes['Name'] = escape( file.PACKAGING_X_MSI_SHORTNAME )
+ File.attributes['Source'] = escape( file.PACKAGING_X_MSI_SOURCE )
+ File.attributes['Id'] = escape( file.PACKAGING_X_MSI_FILEID )
+ File.attributes['Vital'] = escape( file.PACKAGING_X_MSI_VITAL )
+
+ # create the <Component> Tag under which this file should appear
+ Component = factory.createElement('Component')
+ Component.attributes['DiskId'] = '1'
+ Component.attributes['Id'] = convert_to_id( filename, id_set )
+
+ # hang the component node under the root node and the file node
+ # under the component node.
+ Directory = get_directory( root, dirname )
+ Directory.childNodes.append( Component )
+ Component.childNodes.append( File )
+
+#
+# additional functions
+#
+def build_wxsfile_features_section(root, files, NAME, VERSION, SUMMARY, id_set):
+ """ This function creates the <features> tag based on the supplied xml tree.
+
+ This is achieved by finding all <component>s and adding them to a default target.
+
+ It should be called after the tree has been built completly. We assume
+ that a MY_DEFAULT_FOLDER Property is defined in the wxs file tree.
+
+ Furthermore a top-level with the name and VERSION of the software will be created.
+
+ An PACKAGING_X_MSI_FEATURE can either be a string, where the feature
+ DESCRIPTION will be the same as its title or a Tuple, where the first
+ part will be its title and the second its DESCRIPTION.
+ """
+ factory = Document()
+ Feature = factory.createElement('Feature')
+ Feature.attributes['Id'] = 'complete'
+ Feature.attributes['ConfigurableDirectory'] = 'MY_DEFAULT_FOLDER'
+ Feature.attributes['Level'] = '1'
+ Feature.attributes['Title'] = escape( '%s %s' % (NAME, VERSION) )
+ Feature.attributes['Description'] = escape( SUMMARY )
+ Feature.attributes['Display'] = 'expand'
+
+ for (feature, files) in create_feature_dict(files).items():
+ SubFeature = factory.createElement('Feature')
+ SubFeature.attributes['Level'] = '1'
+
+ if SCons.Util.is_Tuple(feature):
+ SubFeature.attributes['Id'] = convert_to_id( feature[0], id_set )
+ SubFeature.attributes['Title'] = escape(feature[0])
+ SubFeature.attributes['Description'] = escape(feature[1])
+ else:
+ SubFeature.attributes['Id'] = convert_to_id( feature, id_set )
+ if feature=='default':
+ SubFeature.attributes['Description'] = 'Main Part'
+ SubFeature.attributes['Title'] = 'Main Part'
+ elif feature=='PACKAGING_DOC':
+ SubFeature.attributes['Description'] = 'Documentation'
+ SubFeature.attributes['Title'] = 'Documentation'
+ else:
+ SubFeature.attributes['Description'] = escape(feature)
+ SubFeature.attributes['Title'] = escape(feature)
+
+ # build the componentrefs. As one of the design decision is that every
+ # file is also a component we walk the list of files and create a
+ # reference.
+ for f in files:
+ ComponentRef = factory.createElement('ComponentRef')
+ ComponentRef.attributes['Id'] = convert_to_id( os.path.basename(f.get_path()), id_set )
+ SubFeature.childNodes.append(ComponentRef)
+
+ Feature.childNodes.append(SubFeature)
+
+ root.getElementsByTagName('Product')[0].childNodes.append(Feature)
+
+def build_wxsfile_default_gui(root):
+ """ This function adds a default GUI to the wxs file
+ """
+ factory = Document()
+ Product = root.getElementsByTagName('Product')[0]
+
+ UIRef = factory.createElement('UIRef')
+ UIRef.attributes['Id'] = 'WixUI_Mondo'
+ Product.childNodes.append(UIRef)
+
+ UIRef = factory.createElement('UIRef')
+ UIRef.attributes['Id'] = 'WixUI_ErrorProgressText'
+ Product.childNodes.append(UIRef)
+
+def build_license_file(directory, spec):
+ """ Creates a License.rtf file with the content of "X_MSI_LICENSE_TEXT"
+ in the given directory
+ """
+ name, text = '', ''
+
+ try:
+ name = spec['LICENSE']
+ text = spec['X_MSI_LICENSE_TEXT']
+ except KeyError:
+ pass # ignore this as X_MSI_LICENSE_TEXT is optional
+
+ if name!='' or text!='':
+ file = open( os.path.join(directory.get_path(), 'License.rtf'), 'w' )
+ file.write('{\\rtf')
+ if text!='':
+ file.write(text.replace('\n', '\\par '))
+ else:
+ file.write(name+'\\par\\par')
+ file.write('}')
+ file.close()
+
+#
+# mandatory and optional package tags
+#
+def build_wxsfile_header_section(root, spec):
+ """ Adds the xml file node which define the package meta-data.
+ """
+ # Create the needed DOM nodes and add them at the correct position in the tree.
+ factory = Document()
+ Product = factory.createElement( 'Product' )
+ Package = factory.createElement( 'Package' )
+
+ root.childNodes.append( Product )
+ Product.childNodes.append( Package )
+
+ # set "mandatory" default values
+ if 'X_MSI_LANGUAGE' not in spec:
+ spec['X_MSI_LANGUAGE'] = '1033' # select english
+
+ # mandatory sections, will throw a KeyError if the tag is not available
+ Product.attributes['Name'] = escape( spec['NAME'] )
+ Product.attributes['Version'] = escape( spec['VERSION'] )
+ Product.attributes['Manufacturer'] = escape( spec['VENDOR'] )
+ Product.attributes['Language'] = escape( spec['X_MSI_LANGUAGE'] )
+ Package.attributes['Description'] = escape( spec['SUMMARY'] )
+
+ # now the optional tags, for which we avoid the KeyErrror exception
+ if 'DESCRIPTION' in spec:
+ Package.attributes['Comments'] = escape( spec['DESCRIPTION'] )
+
+ if 'X_MSI_UPGRADE_CODE' in spec:
+ Package.attributes['X_MSI_UPGRADE_CODE'] = escape( spec['X_MSI_UPGRADE_CODE'] )
+
+ # We hardcode the media tag as our current model cannot handle it.
+ Media = factory.createElement('Media')
+ Media.attributes['Id'] = '1'
+ Media.attributes['Cabinet'] = 'default.cab'
+ Media.attributes['EmbedCab'] = 'yes'
+ root.getElementsByTagName('Product')[0].childNodes.append(Media)
+
+# this builder is the entry-point for .wxs file compiler.
+wxs_builder = Builder(
+ action = Action( build_wxsfile, string_wxsfile ),
+ ensure_suffix = '.wxs' )
+
+def package(env, target, source, PACKAGEROOT, NAME, VERSION,
+ DESCRIPTION, SUMMARY, VENDOR, X_MSI_LANGUAGE, **kw):
+ # make sure that the Wix Builder is in the environment
+ SCons.Tool.Tool('wix').generate(env)
+
+ # get put the keywords for the specfile compiler. These are the arguments
+ # given to the package function and all optional ones stored in kw, minus
+ # the the source, target and env one.
+ loc = locals()
+ del loc['kw']
+ kw.update(loc)
+ del kw['source'], kw['target'], kw['env']
+
+ # strip the install builder from the source files
+ target, source = stripinstallbuilder(target, source, env)
+
+ # put the arguments into the env and call the specfile builder.
+ env['msi_spec'] = kw
+ specfile = wxs_builder(* [env, target, source], **kw)
+
+ # now call the WiX Tool with the built specfile added as a source.
+ msifile = env.WiX(target, specfile)
+
+ # return the target and source tuple.
+ return (msifile, source+[specfile])
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/packaging/rpm.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/packaging/rpm.py
new file mode 100644
index 0000000..a3481a4
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/packaging/rpm.py
@@ -0,0 +1,349 @@
+"""SCons.Tool.Packaging.rpm
+
+The rpm packager.
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import os
+
+import SCons.Builder
+import SCons.Tool.rpmutils
+
+from SCons.Environment import OverrideEnvironment
+from SCons.Tool.packaging import stripinstallbuilder, src_targz
+from SCons.Errors import UserError
+
+def package(env, target, source, PACKAGEROOT, NAME, VERSION,
+ PACKAGEVERSION, DESCRIPTION, SUMMARY, X_RPM_GROUP, LICENSE,
+ **kw):
+ # initialize the rpm tool
+ SCons.Tool.Tool('rpm').generate(env)
+
+ bld = env['BUILDERS']['Rpm']
+
+ # Generate a UserError whenever the target name has been set explicitly,
+ # since rpm does not allow for controlling it. This is detected by
+ # checking if the target has been set to the default by the Package()
+ # Environment function.
+ if str(target[0])!="%s-%s"%(NAME, VERSION):
+ raise UserError( "Setting target is not supported for rpm." )
+ else:
+ # This should be overridable from the construction environment,
+ # which it is by using ARCHITECTURE=.
+ buildarchitecture = SCons.Tool.rpmutils.defaultMachine()
+
+ if 'ARCHITECTURE' in kw:
+ buildarchitecture = kw['ARCHITECTURE']
+
+ fmt = '%s-%s-%s.%s.rpm'
+ srcrpm = fmt % (NAME, VERSION, PACKAGEVERSION, 'src')
+ binrpm = fmt % (NAME, VERSION, PACKAGEVERSION, buildarchitecture)
+
+ target = [ srcrpm, binrpm ]
+
+ # get the correct arguments into the kw hash
+ loc=locals()
+ del loc['kw']
+ kw.update(loc)
+ del kw['source'], kw['target'], kw['env']
+
+ # if no "SOURCE_URL" tag is given add a default one.
+ if 'SOURCE_URL' not in kw:
+ kw['SOURCE_URL']=(str(target[0])+".tar.gz").replace('.rpm', '')
+
+ # mangle the source and target list for the rpmbuild
+ env = OverrideEnvironment(env, kw)
+ target, source = stripinstallbuilder(target, source, env)
+ target, source = addspecfile(target, source, env)
+ target, source = collectintargz(target, source, env)
+
+ # now call the rpm builder to actually build the packet.
+ return bld(env, target, source, **kw)
+
+def collectintargz(target, source, env):
+ """ Puts all source files into a tar.gz file. """
+ # the rpm tool depends on a source package, until this is changed
+ # this hack needs to be here that tries to pack all sources in.
+ sources = env.FindSourceFiles()
+
+ # filter out the target we are building the source list for.
+ sources = [s for s in sources if s not in target]
+
+ # find the .spec file for rpm and add it since it is not necessarily found
+ # by the FindSourceFiles function.
+ sources.extend( [s for s in source if str(s).rfind('.spec')!=-1] )
+ # sort to keep sources from changing order across builds
+ sources.sort()
+
+ # as the source contains the url of the source package this rpm package
+ # is built from, we extract the target name
+ tarball = (str(target[0])+".tar.gz").replace('.rpm', '')
+ try:
+ tarball = env['SOURCE_URL'].split('/')[-1]
+ except KeyError as e:
+ raise SCons.Errors.UserError( "Missing PackageTag '%s' for RPM packager" % e.args[0] )
+
+ tarball = src_targz.package(env, source=sources, target=tarball,
+ PACKAGEROOT=env['PACKAGEROOT'], )
+
+ return (target, tarball)
+
+def addspecfile(target, source, env):
+ specfile = "%s-%s" % (env['NAME'], env['VERSION'])
+
+ bld = SCons.Builder.Builder(action = build_specfile,
+ suffix = '.spec',
+ target_factory = SCons.Node.FS.File)
+
+ source.extend(bld(env, specfile, source))
+
+ return (target,source)
+
+def build_specfile(target, source, env):
+ """ Builds a RPM specfile from a dictionary with string metadata and
+ by analyzing a tree of nodes.
+ """
+ file = open(target[0].get_abspath(), 'w')
+
+ try:
+ file.write( build_specfile_header(env) )
+ file.write( build_specfile_sections(env) )
+ file.write( build_specfile_filesection(env, source) )
+ file.close()
+
+ # call a user specified function
+ if 'CHANGE_SPECFILE' in env:
+ env['CHANGE_SPECFILE'](target, source)
+
+ except KeyError as e:
+ raise SCons.Errors.UserError( '"%s" package field for RPM is missing.' % e.args[0] )
+
+
+#
+# mandatory and optional package tag section
+#
+def build_specfile_sections(spec):
+ """ Builds the sections of a rpm specfile.
+ """
+ str = ""
+
+ mandatory_sections = {
+ 'DESCRIPTION' : '\n%%description\n%s\n\n', }
+
+ str = str + SimpleTagCompiler(mandatory_sections).compile( spec )
+
+ optional_sections = {
+ 'DESCRIPTION_' : '%%description -l %s\n%s\n\n',
+ 'CHANGELOG' : '%%changelog\n%s\n\n',
+ 'X_RPM_PREINSTALL' : '%%pre\n%s\n\n',
+ 'X_RPM_POSTINSTALL' : '%%post\n%s\n\n',
+ 'X_RPM_PREUNINSTALL' : '%%preun\n%s\n\n',
+ 'X_RPM_POSTUNINSTALL' : '%%postun\n%s\n\n',
+ 'X_RPM_VERIFY' : '%%verify\n%s\n\n',
+
+ # These are for internal use but could possibly be overridden
+ 'X_RPM_PREP' : '%%prep\n%s\n\n',
+ 'X_RPM_BUILD' : '%%build\n%s\n\n',
+ 'X_RPM_INSTALL' : '%%install\n%s\n\n',
+ 'X_RPM_CLEAN' : '%%clean\n%s\n\n',
+ }
+
+ # Default prep, build, install and clean rules
+ # TODO: optimize those build steps, to not compile the project a second time
+ if 'X_RPM_PREP' not in spec:
+ spec['X_RPM_PREP'] = '[ -n "$RPM_BUILD_ROOT" -a "$RPM_BUILD_ROOT" != / ] && rm -rf "$RPM_BUILD_ROOT"' + '\n%setup -q'
+
+ if 'X_RPM_BUILD' not in spec:
+ spec['X_RPM_BUILD'] = '[ ! -e "$RPM_BUILD_ROOT" -a "$RPM_BUILD_ROOT" != / ] && mkdir "$RPM_BUILD_ROOT"'
+
+ if 'X_RPM_INSTALL' not in spec:
+ spec['X_RPM_INSTALL'] = 'scons --install-sandbox="$RPM_BUILD_ROOT" "$RPM_BUILD_ROOT"'
+
+ if 'X_RPM_CLEAN' not in spec:
+ spec['X_RPM_CLEAN'] = '[ -n "$RPM_BUILD_ROOT" -a "$RPM_BUILD_ROOT" != / ] && rm -rf "$RPM_BUILD_ROOT"'
+
+ str = str + SimpleTagCompiler(optional_sections, mandatory=0).compile( spec )
+
+ return str
+
+def build_specfile_header(spec):
+ """ Builds all sections but the %file of a rpm specfile
+ """
+ str = ""
+
+ # first the mandatory sections
+ mandatory_header_fields = {
+ 'NAME' : '%%define name %s\nName: %%{name}\n',
+ 'VERSION' : '%%define version %s\nVersion: %%{version}\n',
+ 'PACKAGEVERSION' : '%%define release %s\nRelease: %%{release}\n',
+ 'X_RPM_GROUP' : 'Group: %s\n',
+ 'SUMMARY' : 'Summary: %s\n',
+ 'LICENSE' : 'License: %s\n', }
+
+ str = str + SimpleTagCompiler(mandatory_header_fields).compile( spec )
+
+ # now the optional tags
+ optional_header_fields = {
+ 'VENDOR' : 'Vendor: %s\n',
+ 'X_RPM_URL' : 'Url: %s\n',
+ 'SOURCE_URL' : 'Source: %s\n',
+ 'SUMMARY_' : 'Summary(%s): %s\n',
+ 'X_RPM_DISTRIBUTION' : 'Distribution: %s\n',
+ 'X_RPM_ICON' : 'Icon: %s\n',
+ 'X_RPM_PACKAGER' : 'Packager: %s\n',
+ 'X_RPM_GROUP_' : 'Group(%s): %s\n',
+
+ 'X_RPM_REQUIRES' : 'Requires: %s\n',
+ 'X_RPM_PROVIDES' : 'Provides: %s\n',
+ 'X_RPM_CONFLICTS' : 'Conflicts: %s\n',
+ 'X_RPM_BUILDREQUIRES' : 'BuildRequires: %s\n',
+
+ 'X_RPM_SERIAL' : 'Serial: %s\n',
+ 'X_RPM_EPOCH' : 'Epoch: %s\n',
+ 'X_RPM_AUTOREQPROV' : 'AutoReqProv: %s\n',
+ 'X_RPM_EXCLUDEARCH' : 'ExcludeArch: %s\n',
+ 'X_RPM_EXCLUSIVEARCH' : 'ExclusiveArch: %s\n',
+ 'X_RPM_PREFIX' : 'Prefix: %s\n',
+
+ # internal use
+ 'X_RPM_BUILDROOT' : 'BuildRoot: %s\n', }
+
+ # fill in default values:
+ # Adding a BuildRequires renders the .rpm unbuildable under System, which
+ # are not managed by rpm, since the database to resolve this dependency is
+ # missing (take Gentoo as an example)
+# if not s.has_key('x_rpm_BuildRequires'):
+# s['x_rpm_BuildRequires'] = 'scons'
+
+ if 'X_RPM_BUILDROOT' not in spec:
+ spec['X_RPM_BUILDROOT'] = '%{_tmppath}/%{name}-%{version}-%{release}'
+
+ str = str + SimpleTagCompiler(optional_header_fields, mandatory=0).compile( spec )
+ return str
+
+#
+# mandatory and optional file tags
+#
+def build_specfile_filesection(spec, files):
+ """ builds the %file section of the specfile
+ """
+ str = '%files\n'
+
+ if 'X_RPM_DEFATTR' not in spec:
+ spec['X_RPM_DEFATTR'] = '(-,root,root)'
+
+ str = str + '%%defattr %s\n' % spec['X_RPM_DEFATTR']
+
+ supported_tags = {
+ 'PACKAGING_CONFIG' : '%%config %s',
+ 'PACKAGING_CONFIG_NOREPLACE' : '%%config(noreplace) %s',
+ 'PACKAGING_DOC' : '%%doc %s',
+ 'PACKAGING_UNIX_ATTR' : '%%attr %s',
+ 'PACKAGING_LANG_' : '%%lang(%s) %s',
+ 'PACKAGING_X_RPM_VERIFY' : '%%verify %s',
+ 'PACKAGING_X_RPM_DIR' : '%%dir %s',
+ 'PACKAGING_X_RPM_DOCDIR' : '%%docdir %s',
+ 'PACKAGING_X_RPM_GHOST' : '%%ghost %s', }
+
+ for file in files:
+ # build the tagset
+ tags = {}
+ for k in list(supported_tags.keys()):
+ try:
+ v = file.GetTag(k)
+ if v:
+ tags[k] = v
+ except AttributeError:
+ pass
+
+ # compile the tagset
+ str = str + SimpleTagCompiler(supported_tags, mandatory=0).compile( tags )
+
+ str = str + ' '
+ str = str + file.GetTag('PACKAGING_INSTALL_LOCATION')
+ str = str + '\n\n'
+
+ return str
+
+class SimpleTagCompiler(object):
+ """ This class is a simple string substition utility:
+ the replacement specfication is stored in the tagset dictionary, something
+ like:
+ { "abc" : "cdef %s ",
+ "abc_" : "cdef %s %s" }
+
+ the compile function gets a value dictionary, which may look like:
+ { "abc" : "ghij",
+ "abc_gh" : "ij" }
+
+ The resulting string will be:
+ "cdef ghij cdef gh ij"
+ """
+ def __init__(self, tagset, mandatory=1):
+ self.tagset = tagset
+ self.mandatory = mandatory
+
+ def compile(self, values):
+ """ Compiles the tagset and returns a str containing the result
+ """
+ def is_international(tag):
+ return tag.endswith('_')
+
+ def get_country_code(tag):
+ return tag[-2:]
+
+ def strip_country_code(tag):
+ return tag[:-2]
+
+ replacements = list(self.tagset.items())
+
+ str = ""
+ domestic = [t for t in replacements if not is_international(t[0])]
+ for key, replacement in domestic:
+ try:
+ str = str + replacement % values[key]
+ except KeyError as e:
+ if self.mandatory:
+ raise e
+
+ international = [t for t in replacements if is_international(t[0])]
+ for key, replacement in international:
+ try:
+ x = [t for t in values.items() if strip_country_code(t[0]) == key]
+ int_values_for_key = [(get_country_code(t[0]),t[1]) for t in x]
+ for v in int_values_for_key:
+ str = str + replacement % v
+ except KeyError as e:
+ if self.mandatory:
+ raise e
+
+ return str
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/packaging/src_tarbz2.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/packaging/src_tarbz2.py
new file mode 100644
index 0000000..04ea71b
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/packaging/src_tarbz2.py
@@ -0,0 +1,43 @@
+"""SCons.Tool.Packaging.tarbz2
+
+The tarbz2 SRC packager.
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+from SCons.Tool.packaging import putintopackageroot
+
+def package(env, target, source, PACKAGEROOT, **kw):
+ bld = env['BUILDERS']['Tar']
+ bld.set_suffix('.tar.bz2')
+ target, source = putintopackageroot(target, source, env, PACKAGEROOT, honor_install_location=0)
+ return bld(env, target, source, TARFLAGS='-jc')
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/packaging/src_targz.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/packaging/src_targz.py
new file mode 100644
index 0000000..62d6f5d
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/packaging/src_targz.py
@@ -0,0 +1,43 @@
+"""SCons.Tool.Packaging.targz
+
+The targz SRC packager.
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+from SCons.Tool.packaging import putintopackageroot
+
+def package(env, target, source, PACKAGEROOT, **kw):
+ bld = env['BUILDERS']['Tar']
+ bld.set_suffix('.tar.gz')
+ target, source = putintopackageroot(target, source, env, PACKAGEROOT, honor_install_location=0)
+ return bld(env, target, source, TARFLAGS='-zc')
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/packaging/src_zip.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/packaging/src_zip.py
new file mode 100644
index 0000000..3df7397
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/packaging/src_zip.py
@@ -0,0 +1,43 @@
+"""SCons.Tool.Packaging.zip
+
+The zip SRC packager.
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+from SCons.Tool.packaging import putintopackageroot
+
+def package(env, target, source, PACKAGEROOT, **kw):
+ bld = env['BUILDERS']['Zip']
+ bld.set_suffix('.zip')
+ target, source = putintopackageroot(target, source, env, PACKAGEROOT, honor_install_location=0)
+ return bld(env, target, source)
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/packaging/tarbz2.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/packaging/tarbz2.py
new file mode 100644
index 0000000..2e38da2
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/packaging/tarbz2.py
@@ -0,0 +1,44 @@
+"""SCons.Tool.Packaging.tarbz2
+
+The tarbz2 SRC packager.
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+from SCons.Tool.packaging import stripinstallbuilder, putintopackageroot
+
+def package(env, target, source, PACKAGEROOT, **kw):
+ bld = env['BUILDERS']['Tar']
+ bld.set_suffix('.tar.gz')
+ target, source = putintopackageroot(target, source, env, PACKAGEROOT)
+ target, source = stripinstallbuilder(target, source, env)
+ return bld(env, target, source, TARFLAGS='-jc')
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/packaging/targz.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/packaging/targz.py
new file mode 100644
index 0000000..acb6344
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/packaging/targz.py
@@ -0,0 +1,44 @@
+"""SCons.Tool.Packaging.targz
+
+The targz SRC packager.
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+from SCons.Tool.packaging import stripinstallbuilder, putintopackageroot
+
+def package(env, target, source, PACKAGEROOT, **kw):
+ bld = env['BUILDERS']['Tar']
+ bld.set_suffix('.tar.gz')
+ target, source = stripinstallbuilder(target, source, env)
+ target, source = putintopackageroot(target, source, env, PACKAGEROOT)
+ return bld(env, target, source, TARFLAGS='-zc')
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/packaging/zip.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/packaging/zip.py
new file mode 100644
index 0000000..1f76f16
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/packaging/zip.py
@@ -0,0 +1,44 @@
+"""SCons.Tool.Packaging.zip
+
+The zip SRC packager.
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+from SCons.Tool.packaging import stripinstallbuilder, putintopackageroot
+
+def package(env, target, source, PACKAGEROOT, **kw):
+ bld = env['BUILDERS']['Zip']
+ bld.set_suffix('.zip')
+ target, source = stripinstallbuilder(target, source, env)
+ target, source = putintopackageroot(target, source, env, PACKAGEROOT)
+ return bld(env, target, source)
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/pdf.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/pdf.py
new file mode 100644
index 0000000..050f1a5
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/pdf.py
@@ -0,0 +1,78 @@
+"""SCons.Tool.pdf
+
+Common PDF Builder definition for various other Tool modules that use it.
+Add an explicit action to run epstopdf to convert .eps files to .pdf
+
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import SCons.Builder
+import SCons.Tool
+
+PDFBuilder = None
+
+EpsPdfAction = SCons.Action.Action('$EPSTOPDFCOM', '$EPSTOPDFCOMSTR')
+
+def generate(env):
+ try:
+ env['BUILDERS']['PDF']
+ except KeyError:
+ global PDFBuilder
+ if PDFBuilder is None:
+ PDFBuilder = SCons.Builder.Builder(action = {},
+ source_scanner = SCons.Tool.PDFLaTeXScanner,
+ prefix = '$PDFPREFIX',
+ suffix = '$PDFSUFFIX',
+ emitter = {},
+ source_ext_match = None,
+ single_source=True)
+ env['BUILDERS']['PDF'] = PDFBuilder
+
+ env['PDFPREFIX'] = ''
+ env['PDFSUFFIX'] = '.pdf'
+
+# put the epstopdf builder in this routine so we can add it after
+# the pdftex builder so that one is the default for no source suffix
+def generate2(env):
+ bld = env['BUILDERS']['PDF']
+ #bld.add_action('.ps', EpsPdfAction) # this is covered by direct Ghostcript action in gs.py
+ bld.add_action('.eps', EpsPdfAction)
+
+ env['EPSTOPDF'] = 'epstopdf'
+ env['EPSTOPDFFLAGS'] = SCons.Util.CLVar('')
+ env['EPSTOPDFCOM'] = '$EPSTOPDF $EPSTOPDFFLAGS ${SOURCE} --outfile=${TARGET}'
+
+def exists(env):
+ # This only puts a skeleton Builder in place, so if someone
+ # references this Tool directly, it's always "available."
+ return 1
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/pdf.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/pdf.xml
new file mode 100644
index 0000000..037494b
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/pdf.xml
@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+__COPYRIGHT__
+
+This file is processed by the bin/SConsDoc.py module.
+See its __doc__ string for a discussion of the format.
+-->
+
+<!DOCTYPE sconsdoc [
+<!ENTITY % scons SYSTEM '../../../../doc/scons.mod'>
+%scons;
+<!ENTITY % builders-mod SYSTEM '../../../../doc/generated/builders.mod'>
+%builders-mod;
+<!ENTITY % functions-mod SYSTEM '../../../../doc/generated/functions.mod'>
+%functions-mod;
+<!ENTITY % tools-mod SYSTEM '../../../../doc/generated/tools.mod'>
+%tools-mod;
+<!ENTITY % variables-mod SYSTEM '../../../../doc/generated/variables.mod'>
+%variables-mod;
+]>
+
+<sconsdoc xmlns="http://www.scons.org/dbxsd/v1.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://www.scons.org/dbxsd/v1.0 http://www.scons.org/dbxsd/v1.0/scons.xsd">
+
+<tool name="pdf">
+<summary>
+<para>
+Sets construction variables for the Portable Document Format builder.
+</para>
+</summary>
+<sets>
+<item>PDFPREFIX</item>
+<item>PDFSUFFIX</item>
+</sets>
+</tool>
+
+<builder name="PDF">
+<summary>
+<para>
+Builds a <filename>.pdf</filename> file
+from a <filename>.dvi</filename> input file
+(or, by extension, a <filename>.tex</filename>,
+<filename>.ltx</filename>,
+or
+<filename>.latex</filename> input file).
+The suffix specified by the &cv-link-PDFSUFFIX; construction variable
+(<filename>.pdf</filename> by default)
+is added automatically to the target
+if it is not already present. Example:
+</para>
+
+<example_commands>
+# builds from aaa.tex
+env.PDF(target = 'aaa.pdf', source = 'aaa.tex')
+# builds bbb.pdf from bbb.dvi
+env.PDF(target = 'bbb', source = 'bbb.dvi')
+</example_commands>
+</summary>
+</builder>
+
+<cvar name="PDFPREFIX">
+<summary>
+<para>
+The prefix used for PDF file names.
+</para>
+</summary>
+</cvar>
+
+<cvar name="PDFSUFFIX">
+<summary>
+<para>
+The suffix used for PDF file names.
+</para>
+</summary>
+</cvar>
+
+</sconsdoc>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/pdflatex.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/pdflatex.py
new file mode 100644
index 0000000..fbffb23
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/pdflatex.py
@@ -0,0 +1,84 @@
+"""SCons.Tool.pdflatex
+
+Tool-specific initialization for pdflatex.
+Generates .pdf files from .latex or .ltx files
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import SCons.Action
+import SCons.Util
+import SCons.Tool.pdf
+import SCons.Tool.tex
+
+PDFLaTeXAction = None
+
+def PDFLaTeXAuxFunction(target = None, source= None, env=None):
+ result = SCons.Tool.tex.InternalLaTeXAuxAction( PDFLaTeXAction, target, source, env )
+ if result != 0:
+ SCons.Tool.tex.check_file_error_message(env['PDFLATEX'])
+ return result
+
+PDFLaTeXAuxAction = None
+
+def generate(env):
+ """Add Builders and construction variables for pdflatex to an Environment."""
+ global PDFLaTeXAction
+ if PDFLaTeXAction is None:
+ PDFLaTeXAction = SCons.Action.Action('$PDFLATEXCOM', '$PDFLATEXCOMSTR')
+
+ global PDFLaTeXAuxAction
+ if PDFLaTeXAuxAction is None:
+ PDFLaTeXAuxAction = SCons.Action.Action(PDFLaTeXAuxFunction,
+ strfunction=SCons.Tool.tex.TeXLaTeXStrFunction)
+
+ env.AppendUnique(LATEXSUFFIXES=SCons.Tool.LaTeXSuffixes)
+
+ from . import pdf
+ pdf.generate(env)
+
+ bld = env['BUILDERS']['PDF']
+ bld.add_action('.ltx', PDFLaTeXAuxAction)
+ bld.add_action('.latex', PDFLaTeXAuxAction)
+ bld.add_emitter('.ltx', SCons.Tool.tex.tex_pdf_emitter)
+ bld.add_emitter('.latex', SCons.Tool.tex.tex_pdf_emitter)
+
+ SCons.Tool.tex.generate_common(env)
+
+def exists(env):
+ SCons.Tool.tex.generate_darwin(env)
+ return env.Detect('pdflatex')
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/pdflatex.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/pdflatex.xml
new file mode 100644
index 0000000..af4970c
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/pdflatex.xml
@@ -0,0 +1,80 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+__COPYRIGHT__
+
+This file is processed by the bin/SConsDoc.py module.
+See its __doc__ string for a discussion of the format.
+-->
+
+<!DOCTYPE sconsdoc [
+<!ENTITY % scons SYSTEM '../../../../doc/scons.mod'>
+%scons;
+<!ENTITY % builders-mod SYSTEM '../../../../doc/generated/builders.mod'>
+%builders-mod;
+<!ENTITY % functions-mod SYSTEM '../../../../doc/generated/functions.mod'>
+%functions-mod;
+<!ENTITY % tools-mod SYSTEM '../../../../doc/generated/tools.mod'>
+%tools-mod;
+<!ENTITY % variables-mod SYSTEM '../../../../doc/generated/variables.mod'>
+%variables-mod;
+]>
+
+<sconsdoc xmlns="http://www.scons.org/dbxsd/v1.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://www.scons.org/dbxsd/v1.0 http://www.scons.org/dbxsd/v1.0/scons.xsd">
+
+<tool name="pdflatex">
+<summary>
+<para>
+Sets construction variables for the &pdflatex; utility.
+</para>
+</summary>
+<sets>
+<item>PDFLATEX</item>
+<item>PDFLATEXFLAGS</item>
+<item>PDFLATEXCOM</item>
+<item>LATEXRETRIES</item>
+</sets>
+<uses>
+<item>PDFLATEXCOMSTR</item>
+</uses>
+</tool>
+
+<cvar name="PDFLATEX">
+<summary>
+<para>
+The &pdflatex; utility.
+</para>
+</summary>
+</cvar>
+
+<cvar name="PDFLATEXCOM">
+<summary>
+<para>
+The command line used to call the &pdflatex; utility.
+</para>
+</summary>
+</cvar>
+
+<cvar name="PDFLATEXCOMSTR">
+<summary>
+<para>
+The string displayed when calling the &pdflatex; utility.
+If this is not set, then &cv-link-PDFLATEXCOM; (the command line) is displayed.
+</para>
+
+<example_commands>
+env = Environment(PDFLATEX;COMSTR = "Building $TARGET from LaTeX input $SOURCES")
+</example_commands>
+</summary>
+</cvar>
+
+<cvar name="PDFLATEXFLAGS">
+<summary>
+<para>
+General options passed to the &pdflatex; utility.
+</para>
+</summary>
+</cvar>
+
+</sconsdoc>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/pdftex.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/pdftex.py
new file mode 100644
index 0000000..e9a0bda
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/pdftex.py
@@ -0,0 +1,109 @@
+"""SCons.Tool.pdftex
+
+Tool-specific initialization for pdftex.
+Generates .pdf files from .tex files
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import os
+import SCons.Action
+import SCons.Util
+import SCons.Tool.tex
+
+PDFTeXAction = None
+
+# This action might be needed more than once if we are dealing with
+# labels and bibtex.
+PDFLaTeXAction = None
+
+def PDFLaTeXAuxAction(target = None, source= None, env=None):
+ result = SCons.Tool.tex.InternalLaTeXAuxAction( PDFLaTeXAction, target, source, env )
+ return result
+
+def PDFTeXLaTeXFunction(target = None, source= None, env=None):
+ """A builder for TeX and LaTeX that scans the source file to
+ decide the "flavor" of the source and then executes the appropriate
+ program."""
+ basedir = os.path.split(str(source[0]))[0]
+ abspath = os.path.abspath(basedir)
+
+ if SCons.Tool.tex.is_LaTeX(source,env,abspath):
+ result = PDFLaTeXAuxAction(target,source,env)
+ if result != 0:
+ SCons.Tool.tex.check_file_error_message(env['PDFLATEX'])
+ else:
+ result = PDFTeXAction(target,source,env)
+ if result != 0:
+ SCons.Tool.tex.check_file_error_message(env['PDFTEX'])
+ return result
+
+PDFTeXLaTeXAction = None
+
+def generate(env):
+ """Add Builders and construction variables for pdftex to an Environment."""
+ global PDFTeXAction
+ if PDFTeXAction is None:
+ PDFTeXAction = SCons.Action.Action('$PDFTEXCOM', '$PDFTEXCOMSTR')
+
+ global PDFLaTeXAction
+ if PDFLaTeXAction is None:
+ PDFLaTeXAction = SCons.Action.Action("$PDFLATEXCOM", "$PDFLATEXCOMSTR")
+
+ global PDFTeXLaTeXAction
+ if PDFTeXLaTeXAction is None:
+ PDFTeXLaTeXAction = SCons.Action.Action(PDFTeXLaTeXFunction,
+ strfunction=SCons.Tool.tex.TeXLaTeXStrFunction)
+
+ env.AppendUnique(LATEXSUFFIXES=SCons.Tool.LaTeXSuffixes)
+
+ from . import pdf
+ pdf.generate(env)
+
+ bld = env['BUILDERS']['PDF']
+ bld.add_action('.tex', PDFTeXLaTeXAction)
+ bld.add_emitter('.tex', SCons.Tool.tex.tex_pdf_emitter)
+
+ # Add the epstopdf builder after the pdftex builder
+ # so pdftex is the default for no source suffix
+ pdf.generate2(env)
+
+ SCons.Tool.tex.generate_common(env)
+
+def exists(env):
+ SCons.Tool.tex.generate_darwin(env)
+ return env.Detect('pdftex')
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/pdftex.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/pdftex.xml
new file mode 100644
index 0000000..cf7e70c
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/pdftex.xml
@@ -0,0 +1,84 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+__COPYRIGHT__
+
+This file is processed by the bin/SConsDoc.py module.
+See its __doc__ string for a discussion of the format.
+-->
+
+<!DOCTYPE sconsdoc [
+<!ENTITY % scons SYSTEM '../../../../doc/scons.mod'>
+%scons;
+<!ENTITY % builders-mod SYSTEM '../../../../doc/generated/builders.mod'>
+%builders-mod;
+<!ENTITY % functions-mod SYSTEM '../../../../doc/generated/functions.mod'>
+%functions-mod;
+<!ENTITY % tools-mod SYSTEM '../../../../doc/generated/tools.mod'>
+%tools-mod;
+<!ENTITY % variables-mod SYSTEM '../../../../doc/generated/variables.mod'>
+%variables-mod;
+]>
+
+<sconsdoc xmlns="http://www.scons.org/dbxsd/v1.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://www.scons.org/dbxsd/v1.0 http://www.scons.org/dbxsd/v1.0/scons.xsd">
+
+<tool name="pdftex">
+<summary>
+<para>
+Sets construction variables for the &pdftex; utility.
+</para>
+</summary>
+<sets>
+<item>PDFTEX</item>
+<item>PDFTEXFLAGS</item>
+<item>PDFTEXCOM</item>
+<item>PDFLATEX</item>
+<item>PDFLATEXFLAGS</item>
+<item>PDFLATEXCOM</item>
+<item>LATEXRETRIES</item>
+</sets>
+<uses>
+<item>PDFTEXCOMSTR</item>
+<item>PDFLATEXCOMSTR</item>
+</uses>
+</tool>
+
+<cvar name="PDFTEX">
+<summary>
+<para>
+The &pdftex; utility.
+</para>
+</summary>
+</cvar>
+
+<cvar name="PDFTEXCOM">
+<summary>
+<para>
+The command line used to call the &pdftex; utility.
+</para>
+</summary>
+</cvar>
+
+<cvar name="PDFTEXCOMSTR">
+<summary>
+<para>
+The string displayed when calling the &pdftex; utility.
+If this is not set, then &cv-link-PDFTEXCOM; (the command line) is displayed.
+</para>
+
+<example_commands>
+env = Environment(PDFTEXCOMSTR = "Building $TARGET from TeX input $SOURCES")
+</example_commands>
+</summary>
+</cvar>
+
+<cvar name="PDFTEXFLAGS">
+<summary>
+<para>
+General options passed to the &pdftex; utility.
+</para>
+</summary>
+</cvar>
+
+</sconsdoc>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/qt.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/qt.py
new file mode 100644
index 0000000..77269a8
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/qt.py
@@ -0,0 +1,344 @@
+
+"""SCons.Tool.qt
+
+Tool-specific initialization for Qt.
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+from __future__ import print_function
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import os.path
+import re
+
+import SCons.Action
+import SCons.Builder
+import SCons.Defaults
+import SCons.Scanner
+import SCons.Tool
+import SCons.Util
+
+class ToolQtWarning(SCons.Warnings.Warning):
+ pass
+
+class GeneratedMocFileNotIncluded(ToolQtWarning):
+ pass
+
+class QtdirNotFound(ToolQtWarning):
+ pass
+
+SCons.Warnings.enableWarningClass(ToolQtWarning)
+
+header_extensions = [".h", ".hxx", ".hpp", ".hh"]
+if SCons.Util.case_sensitive_suffixes('.h', '.H'):
+ header_extensions.append('.H')
+
+import SCons.Tool.cxx
+cplusplus = SCons.Tool.cxx
+#cplusplus = __import__('cxx', globals(), locals(), [])
+
+cxx_suffixes = cplusplus.CXXSuffixes
+
+def checkMocIncluded(target, source, env):
+ moc = target[0]
+ cpp = source[0]
+ # looks like cpp.includes is cleared before the build stage :-(
+ # not really sure about the path transformations (moc.cwd? cpp.cwd?) :-/
+ path = SCons.Defaults.CScan.path(env, moc.cwd)
+ includes = SCons.Defaults.CScan(cpp, env, path)
+ if not moc in includes:
+ SCons.Warnings.warn(
+ GeneratedMocFileNotIncluded,
+ "Generated moc file '%s' is not included by '%s'" %
+ (str(moc), str(cpp)))
+
+def find_file(filename, paths, node_factory):
+ for dir in paths:
+ node = node_factory(filename, dir)
+ if node.rexists():
+ return node
+ return None
+
+class _Automoc(object):
+ """
+ Callable class, which works as an emitter for Programs, SharedLibraries and
+ StaticLibraries.
+ """
+
+ def __init__(self, objBuilderName):
+ self.objBuilderName = objBuilderName
+
+ def __call__(self, target, source, env):
+ """
+ Smart autoscan function. Gets the list of objects for the Program
+ or Lib. Adds objects and builders for the special qt files.
+ """
+ try:
+ if int(env.subst('$QT_AUTOSCAN')) == 0:
+ return target, source
+ except ValueError:
+ pass
+ try:
+ debug = int(env.subst('$QT_DEBUG'))
+ except ValueError:
+ debug = 0
+
+ # some shortcuts used in the scanner
+ splitext = SCons.Util.splitext
+ objBuilder = getattr(env, self.objBuilderName)
+
+ # some regular expressions:
+ # Q_OBJECT detection
+ q_object_search = re.compile(r'[^A-Za-z0-9]Q_OBJECT[^A-Za-z0-9]')
+ # cxx and c comment 'eater'
+ #comment = re.compile(r'(//.*)|(/\*(([^*])|(\*[^/]))*\*/)')
+ # CW: something must be wrong with the regexp. See also bug #998222
+ # CURRENTLY THERE IS NO TEST CASE FOR THAT
+
+ # The following is kind of hacky to get builders working properly (FIXME)
+ objBuilderEnv = objBuilder.env
+ objBuilder.env = env
+ mocBuilderEnv = env.Moc.env
+ env.Moc.env = env
+
+ # make a deep copy for the result; MocH objects will be appended
+ out_sources = source[:]
+
+ for obj in source:
+ if not obj.has_builder():
+ # binary obj file provided
+ if debug:
+ print("scons: qt: '%s' seems to be a binary. Discarded." % str(obj))
+ continue
+ cpp = obj.sources[0]
+ if not splitext(str(cpp))[1] in cxx_suffixes:
+ if debug:
+ print("scons: qt: '%s' is no cxx file. Discarded." % str(cpp))
+ # c or fortran source
+ continue
+ #cpp_contents = comment.sub('', cpp.get_text_contents())
+ if debug:
+ print("scons: qt: Getting contents of %s" % cpp)
+ cpp_contents = cpp.get_text_contents()
+ h=None
+ for h_ext in header_extensions:
+ # try to find the header file in the corresponding source
+ # directory
+ hname = splitext(cpp.name)[0] + h_ext
+ h = find_file(hname, (cpp.get_dir(),), env.File)
+ if h:
+ if debug:
+ print("scons: qt: Scanning '%s' (header of '%s')" % (str(h), str(cpp)))
+ #h_contents = comment.sub('', h.get_text_contents())
+ h_contents = h.get_text_contents()
+ break
+ if not h and debug:
+ print("scons: qt: no header for '%s'." % (str(cpp)))
+ if h and q_object_search.search(h_contents):
+ # h file with the Q_OBJECT macro found -> add moc_cpp
+ moc_cpp = env.Moc(h)
+ moc_o = objBuilder(moc_cpp)
+ out_sources.append(moc_o)
+ #moc_cpp.target_scanner = SCons.Defaults.CScan
+ if debug:
+ print("scons: qt: found Q_OBJECT macro in '%s', moc'ing to '%s'" % (str(h), str(moc_cpp)))
+ if cpp and q_object_search.search(cpp_contents):
+ # cpp file with Q_OBJECT macro found -> add moc
+ # (to be included in cpp)
+ moc = env.Moc(cpp)
+ env.Ignore(moc, moc)
+ if debug:
+ print("scons: qt: found Q_OBJECT macro in '%s', moc'ing to '%s'" % (str(cpp), str(moc)))
+ #moc.source_scanner = SCons.Defaults.CScan
+ # restore the original env attributes (FIXME)
+ objBuilder.env = objBuilderEnv
+ env.Moc.env = mocBuilderEnv
+
+ return (target, out_sources)
+
+AutomocShared = _Automoc('SharedObject')
+AutomocStatic = _Automoc('StaticObject')
+
+def _detect(env):
+ """Not really safe, but fast method to detect the QT library"""
+ QTDIR = None
+ if not QTDIR:
+ QTDIR = env.get('QTDIR',None)
+ if not QTDIR:
+ QTDIR = os.environ.get('QTDIR',None)
+ if not QTDIR:
+ moc = env.WhereIs('moc')
+ if moc:
+ QTDIR = os.path.dirname(os.path.dirname(moc))
+ SCons.Warnings.warn(
+ QtdirNotFound,
+ "Could not detect qt, using moc executable as a hint (QTDIR=%s)" % QTDIR)
+ else:
+ QTDIR = None
+ SCons.Warnings.warn(
+ QtdirNotFound,
+ "Could not detect qt, using empty QTDIR")
+ return QTDIR
+
+def uicEmitter(target, source, env):
+ adjustixes = SCons.Util.adjustixes
+ bs = SCons.Util.splitext(str(source[0].name))[0]
+ bs = os.path.join(str(target[0].get_dir()),bs)
+ # first target (header) is automatically added by builder
+ if len(target) < 2:
+ # second target is implementation
+ target.append(adjustixes(bs,
+ env.subst('$QT_UICIMPLPREFIX'),
+ env.subst('$QT_UICIMPLSUFFIX')))
+ if len(target) < 3:
+ # third target is moc file
+ target.append(adjustixes(bs,
+ env.subst('$QT_MOCHPREFIX'),
+ env.subst('$QT_MOCHSUFFIX')))
+ return target, source
+
+def uicScannerFunc(node, env, path):
+ lookout = []
+ lookout.extend(env['CPPPATH'])
+ lookout.append(str(node.rfile().dir))
+ includes = re.findall("<include.*?>(.*?)</include>", node.get_text_contents())
+ result = []
+ for incFile in includes:
+ dep = env.FindFile(incFile,lookout)
+ if dep:
+ result.append(dep)
+ return result
+
+uicScanner = SCons.Scanner.Base(uicScannerFunc,
+ name = "UicScanner",
+ node_class = SCons.Node.FS.File,
+ node_factory = SCons.Node.FS.File,
+ recursive = 0)
+
+def generate(env):
+ """Add Builders and construction variables for qt to an Environment."""
+ CLVar = SCons.Util.CLVar
+ Action = SCons.Action.Action
+ Builder = SCons.Builder.Builder
+
+ env.SetDefault(QTDIR = _detect(env),
+ QT_BINPATH = os.path.join('$QTDIR', 'bin'),
+ QT_CPPPATH = os.path.join('$QTDIR', 'include'),
+ QT_LIBPATH = os.path.join('$QTDIR', 'lib'),
+ QT_MOC = os.path.join('$QT_BINPATH','moc'),
+ QT_UIC = os.path.join('$QT_BINPATH','uic'),
+ QT_LIB = 'qt', # may be set to qt-mt
+
+ QT_AUTOSCAN = 1, # scan for moc'able sources
+
+ # Some QT specific flags. I don't expect someone wants to
+ # manipulate those ...
+ QT_UICIMPLFLAGS = CLVar(''),
+ QT_UICDECLFLAGS = CLVar(''),
+ QT_MOCFROMHFLAGS = CLVar(''),
+ QT_MOCFROMCXXFLAGS = CLVar('-i'),
+
+ # suffixes/prefixes for the headers / sources to generate
+ QT_UICDECLPREFIX = '',
+ QT_UICDECLSUFFIX = '.h',
+ QT_UICIMPLPREFIX = 'uic_',
+ QT_UICIMPLSUFFIX = '$CXXFILESUFFIX',
+ QT_MOCHPREFIX = 'moc_',
+ QT_MOCHSUFFIX = '$CXXFILESUFFIX',
+ QT_MOCCXXPREFIX = '',
+ QT_MOCCXXSUFFIX = '.moc',
+ QT_UISUFFIX = '.ui',
+
+ # Commands for the qt support ...
+ # command to generate header, implementation and moc-file
+ # from a .ui file
+ QT_UICCOM = [
+ CLVar('$QT_UIC $QT_UICDECLFLAGS -o ${TARGETS[0]} $SOURCE'),
+ CLVar('$QT_UIC $QT_UICIMPLFLAGS -impl ${TARGETS[0].file} '
+ '-o ${TARGETS[1]} $SOURCE'),
+ CLVar('$QT_MOC $QT_MOCFROMHFLAGS -o ${TARGETS[2]} ${TARGETS[0]}')],
+ # command to generate meta object information for a class
+ # declarated in a header
+ QT_MOCFROMHCOM = (
+ '$QT_MOC $QT_MOCFROMHFLAGS -o ${TARGETS[0]} $SOURCE'),
+ # command to generate meta object information for a class
+ # declarated in a cpp file
+ QT_MOCFROMCXXCOM = [
+ CLVar('$QT_MOC $QT_MOCFROMCXXFLAGS -o ${TARGETS[0]} $SOURCE'),
+ Action(checkMocIncluded,None)])
+
+ # ... and the corresponding builders
+ uicBld = Builder(action=SCons.Action.Action('$QT_UICCOM', '$QT_UICCOMSTR'),
+ emitter=uicEmitter,
+ src_suffix='$QT_UISUFFIX',
+ suffix='$QT_UICDECLSUFFIX',
+ prefix='$QT_UICDECLPREFIX',
+ source_scanner=uicScanner)
+ mocBld = Builder(action={}, prefix={}, suffix={})
+ for h in header_extensions:
+ act = SCons.Action.Action('$QT_MOCFROMHCOM', '$QT_MOCFROMHCOMSTR')
+ mocBld.add_action(h, act)
+ mocBld.prefix[h] = '$QT_MOCHPREFIX'
+ mocBld.suffix[h] = '$QT_MOCHSUFFIX'
+ for cxx in cxx_suffixes:
+ act = SCons.Action.Action('$QT_MOCFROMCXXCOM', '$QT_MOCFROMCXXCOMSTR')
+ mocBld.add_action(cxx, act)
+ mocBld.prefix[cxx] = '$QT_MOCCXXPREFIX'
+ mocBld.suffix[cxx] = '$QT_MOCCXXSUFFIX'
+
+ # register the builders
+ env['BUILDERS']['Uic'] = uicBld
+ env['BUILDERS']['Moc'] = mocBld
+ static_obj, shared_obj = SCons.Tool.createObjBuilders(env)
+ static_obj.add_src_builder('Uic')
+ shared_obj.add_src_builder('Uic')
+
+ # We use the emitters of Program / StaticLibrary / SharedLibrary
+ # to scan for moc'able files
+ # We can't refer to the builders directly, we have to fetch them
+ # as Environment attributes because that sets them up to be called
+ # correctly later by our emitter.
+ env.AppendUnique(PROGEMITTER =[AutomocStatic],
+ SHLIBEMITTER=[AutomocShared],
+ LDMODULEEMITTER=[AutomocShared],
+ LIBEMITTER =[AutomocStatic],
+ # Of course, we need to link against the qt libraries
+ CPPPATH=["$QT_CPPPATH"],
+ LIBPATH=["$QT_LIBPATH"],
+ LIBS=['$QT_LIB'])
+
+def exists(env):
+ return _detect(env)
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/qt.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/qt.xml
new file mode 100644
index 0000000..6f8d668
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/qt.xml
@@ -0,0 +1,406 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+__COPYRIGHT__
+
+This file is processed by the bin/SConsDoc.py module.
+See its __doc__ string for a discussion of the format.
+-->
+
+<!DOCTYPE sconsdoc [
+<!ENTITY % scons SYSTEM '../../../../doc/scons.mod'>
+%scons;
+<!ENTITY % builders-mod SYSTEM '../../../../doc/generated/builders.mod'>
+%builders-mod;
+<!ENTITY % functions-mod SYSTEM '../../../../doc/generated/functions.mod'>
+%functions-mod;
+<!ENTITY % tools-mod SYSTEM '../../../../doc/generated/tools.mod'>
+%tools-mod;
+<!ENTITY % variables-mod SYSTEM '../../../../doc/generated/variables.mod'>
+%variables-mod;
+]>
+
+<sconsdoc xmlns="http://www.scons.org/dbxsd/v1.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://www.scons.org/dbxsd/v1.0 http://www.scons.org/dbxsd/v1.0/scons.xsd">
+
+<tool name="qt">
+<summary>
+<para>
+Sets construction variables for building Qt applications.
+</para>
+</summary>
+<sets>
+<item>QTDIR</item>
+<item>QT_BINPATH</item>
+<item>QT_CPPPATH</item>
+<item>QT_LIBPATH</item>
+<item>QT_MOC</item>
+<item>QT_UIC</item>
+<item>QT_LIB</item>
+<item>QT_AUTOSCAN</item>
+<item>QT_UICIMPLFLAGS</item>
+<item>QT_UICDECLFLAGS</item>
+<item>QT_MOCFROMHFLAGS</item>
+<item>QT_MOCFROMCXXFLAGS</item>
+<item>QT_UICDECLPREFIX</item>
+<item>QT_UICDECLSUFFIX</item>
+<item>QT_UICIMPLPREFIX</item>
+<item>QT_UICIMPLSUFFIX</item>
+<item>QT_MOCHPREFIX</item>
+<item>QT_MOCHSUFFIX</item>
+<item>QT_MOCCXXPREFIX</item>
+<item>QT_MOCCXXSUFFIX</item>
+<item>QT_UISUFFIX</item>
+<item>QT_UICCOM</item>
+<item>QT_MOCFROMHCOM</item>
+<item>QT_MOCFROMCXXCOM</item>
+</sets>
+<uses>
+</uses>
+</tool>
+
+<builder name="Moc">
+<summary>
+<para>
+Builds an output file from a moc input file. Moc input files are either
+header files or cxx files. This builder is only available after using the
+tool 'qt'. See the &cv-link-QTDIR; variable for more information.
+Example:
+</para>
+
+<example_commands>
+env.Moc('foo.h') # generates moc_foo.cc
+env.Moc('foo.cpp') # generates foo.moc
+</example_commands>
+</summary>
+</builder>
+
+<builder name="Uic">
+<summary>
+<para>
+Builds a header file, an implementation file and a moc file from an ui file.
+and returns the corresponding nodes in the above order.
+This builder is only available after using the tool 'qt'. Note: you can
+specify <filename>.ui</filename> files directly as source
+files to the &b-Program;,
+&b-Library; and &b-SharedLibrary; builders
+without using this builder. Using this builder lets you override the standard
+naming conventions (be careful: prefixes are always prepended to names of
+built files; if you don't want prefixes, you may set them to ``).
+See the &cv-link-QTDIR; variable for more information.
+Example:
+</para>
+
+<example_commands>
+env.Uic('foo.ui') # -> ['foo.h', 'uic_foo.cc', 'moc_foo.cc']
+env.Uic(target = Split('include/foo.h gen/uicfoo.cc gen/mocfoo.cc'),
+ source = 'foo.ui') # -> ['include/foo.h', 'gen/uicfoo.cc', 'gen/mocfoo.cc']
+</example_commands>
+</summary>
+</builder>
+
+<cvar name="QTDIR">
+<summary>
+<para>
+The qt tool tries to take this from os.environ.
+It also initializes all QT_*
+construction variables listed below.
+(Note that all paths are constructed
+with python's os.path.join() method,
+but are listed here with the '/' separator
+for easier reading.)
+In addition, the construction environment
+variables &cv-link-CPPPATH;,
+&cv-link-LIBPATH; and
+&cv-link-LIBS; may be modified
+and the variables
+&cv-link-PROGEMITTER;, &cv-link-SHLIBEMITTER; and &cv-link-LIBEMITTER;
+are modified. Because the build-performance is affected when using this tool,
+you have to explicitly specify it at Environment creation:
+</para>
+
+<example_commands>
+Environment(tools=['default','qt'])
+</example_commands>
+
+<para>
+The qt tool supports the following operations:
+</para>
+
+<para>
+<emphasis role="strong">Automatic moc file generation from header files.</emphasis>
+You do not have to specify moc files explicitly, the tool does it for you.
+However, there are a few preconditions to do so: Your header file must have
+the same filebase as your implementation file and must stay in the same
+directory. It must have one of the suffixes .h, .hpp, .H, .hxx, .hh. You
+can turn off automatic moc file generation by setting QT_AUTOSCAN to 0.
+See also the corresponding
+&b-Moc;()
+builder method.
+</para>
+
+<para>
+<emphasis role="strong">Automatic moc file generation from cxx files.</emphasis>
+As stated in the qt documentation, include the moc file at the end of
+the cxx file. Note that you have to include the file, which is generated
+by the transformation ${QT_MOCCXXPREFIX}&lt;basename&gt;${QT_MOCCXXSUFFIX}, by default
+&lt;basename&gt;.moc. A warning is generated after building the moc file, if you
+do not include the correct file. If you are using VariantDir, you may
+need to specify duplicate=1. You can turn off automatic moc file generation
+by setting QT_AUTOSCAN to 0. See also the corresponding
+&b-Moc;
+builder method.
+</para>
+
+<para>
+<emphasis role="strong">Automatic handling of .ui files.</emphasis>
+The implementation files generated from .ui files are handled much the same
+as yacc or lex files. Each .ui file given as a source of Program, Library or
+SharedLibrary will generate three files, the declaration file, the
+implementation file and a moc file. Because there are also generated headers,
+you may need to specify duplicate=1 in calls to VariantDir.
+See also the corresponding
+&b-Uic;
+builder method.
+</para>
+</summary>
+</cvar>
+
+<cvar name="QT_AUTOSCAN">
+<summary>
+<para>
+Turn off scanning for mocable files. Use the Moc Builder to explicitly
+specify files to run moc on.
+</para>
+</summary>
+</cvar>
+
+<cvar name="QT_BINPATH">
+<summary>
+<para>
+The path where the qt binaries are installed.
+The default value is '&cv-link-QTDIR;/bin'.
+</para>
+</summary>
+</cvar>
+
+<cvar name="QT_CPPPATH">
+<summary>
+<para>
+The path where the qt header files are installed.
+The default value is '&cv-link-QTDIR;/include'.
+Note: If you set this variable to None,
+the tool won't change the &cv-link-CPPPATH;
+construction variable.
+</para>
+</summary>
+</cvar>
+
+<cvar name="QT_DEBUG">
+<summary>
+<para>
+Prints lots of debugging information while scanning for moc files.
+</para>
+</summary>
+</cvar>
+
+<cvar name="QT_LIB">
+<summary>
+<para>
+Default value is 'qt'. You may want to set this to 'qt-mt'. Note: If you set
+this variable to None, the tool won't change the &cv-link-LIBS; variable.
+</para>
+</summary>
+</cvar>
+
+<cvar name="QT_LIBPATH">
+<summary>
+<para>
+The path where the qt libraries are installed.
+The default value is '&cv-link-QTDIR;/lib'.
+Note: If you set this variable to None,
+the tool won't change the &cv-link-LIBPATH;
+construction variable.
+</para>
+</summary>
+</cvar>
+
+<cvar name="QT_MOC">
+<summary>
+<para>
+Default value is '&cv-link-QT_BINPATH;/moc'.
+</para>
+</summary>
+</cvar>
+
+<cvar name="QT_MOCCXXPREFIX">
+<summary>
+<para>
+Default value is ''. Prefix for moc output files, when source is a cxx file.
+</para>
+</summary>
+</cvar>
+
+<cvar name="QT_MOCCXXSUFFIX">
+<summary>
+<para>
+Default value is '.moc'. Suffix for moc output files, when source is a cxx
+file.
+</para>
+</summary>
+</cvar>
+
+<cvar name="QT_MOCFROMCXXFLAGS">
+<summary>
+<para>
+Default value is '-i'. These flags are passed to moc, when moccing a
+C++ file.
+</para>
+</summary>
+</cvar>
+
+<cvar name="QT_MOCFROMCXXCOM">
+<summary>
+<para>
+Command to generate a moc file from a cpp file.
+</para>
+</summary>
+</cvar>
+
+<cvar name="QT_MOCFROMCXXCOMSTR">
+<summary>
+<para>
+The string displayed when generating a moc file from a cpp file.
+If this is not set, then &cv-link-QT_MOCFROMCXXCOM; (the command line) is displayed.
+</para>
+</summary>
+</cvar>
+
+<cvar name="QT_MOCFROMHCOM">
+<summary>
+<para>
+Command to generate a moc file from a header.
+</para>
+</summary>
+</cvar>
+
+<cvar name="QT_MOCFROMHCOMSTR">
+<summary>
+<para>
+The string displayed when generating a moc file from a cpp file.
+If this is not set, then &cv-link-QT_MOCFROMHCOM; (the command line) is displayed.
+</para>
+</summary>
+</cvar>
+
+<cvar name="QT_MOCFROMHFLAGS">
+<summary>
+<para>
+Default value is ''. These flags are passed to moc, when moccing a header
+file.
+</para>
+</summary>
+</cvar>
+
+<cvar name="QT_MOCHPREFIX">
+<summary>
+<para>
+Default value is 'moc_'. Prefix for moc output files, when source is a header.
+</para>
+</summary>
+</cvar>
+
+<cvar name="QT_MOCHSUFFIX">
+<summary>
+<para>
+Default value is '&cv-link-CXXFILESUFFIX;'. Suffix for moc output files, when source is
+a header.
+</para>
+</summary>
+</cvar>
+
+<cvar name="QT_UIC">
+<summary>
+<para>
+Default value is '&cv-link-QT_BINPATH;/uic'.
+</para>
+</summary>
+</cvar>
+
+<cvar name="QT_UICCOM">
+<summary>
+<para>
+Command to generate header files from .ui files.
+</para>
+</summary>
+</cvar>
+
+<cvar name="QT_UICCOMSTR">
+<summary>
+<para>
+The string displayed when generating header files from .ui files.
+If this is not set, then &cv-link-QT_UICCOM; (the command line) is displayed.
+</para>
+</summary>
+</cvar>
+
+<cvar name="QT_UICDECLFLAGS">
+<summary>
+<para>
+Default value is ''. These flags are passed to uic, when creating a a h
+file from a .ui file.
+</para>
+</summary>
+</cvar>
+
+<cvar name="QT_UICDECLPREFIX">
+<summary>
+<para>
+Default value is ''. Prefix for uic generated header files.
+</para>
+</summary>
+</cvar>
+
+<cvar name="QT_UICDECLSUFFIX">
+<summary>
+<para>
+Default value is '.h'. Suffix for uic generated header files.
+</para>
+</summary>
+</cvar>
+
+<cvar name="QT_UICIMPLFLAGS">
+<summary>
+<para>
+Default value is ''. These flags are passed to uic, when creating a cxx
+file from a .ui file.
+</para>
+</summary>
+</cvar>
+
+<cvar name="QT_UICIMPLPREFIX">
+<summary>
+<para>
+Default value is 'uic_'. Prefix for uic generated implementation files.
+</para>
+</summary>
+</cvar>
+
+<cvar name="QT_UICIMPLSUFFIX">
+<summary>
+<para>
+Default value is '&cv-link-CXXFILESUFFIX;'. Suffix for uic generated implementation
+files.
+</para>
+</summary>
+</cvar>
+
+<cvar name="QT_UISUFFIX">
+<summary>
+<para>
+Default value is '.ui'. Suffix of designer input files.
+</para>
+</summary>
+</cvar>
+
+</sconsdoc>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/rmic.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/rmic.py
new file mode 100644
index 0000000..4d1bd28
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/rmic.py
@@ -0,0 +1,126 @@
+"""SCons.Tool.rmic
+
+Tool-specific initialization for rmic.
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import os.path
+
+import SCons.Action
+import SCons.Builder
+import SCons.Node.FS
+import SCons.Util
+
+def emit_rmic_classes(target, source, env):
+ """Create and return lists of Java RMI stub and skeleton
+ class files to be created from a set of class files.
+ """
+ class_suffix = env.get('JAVACLASSSUFFIX', '.class')
+ classdir = env.get('JAVACLASSDIR')
+
+ if not classdir:
+ try:
+ s = source[0]
+ except IndexError:
+ classdir = '.'
+ else:
+ try:
+ classdir = s.attributes.java_classdir
+ except AttributeError:
+ classdir = '.'
+ classdir = env.Dir(classdir).rdir()
+ if str(classdir) == '.':
+ c_ = None
+ else:
+ c_ = str(classdir) + os.sep
+
+ slist = []
+ for src in source:
+ try:
+ classname = src.attributes.java_classname
+ except AttributeError:
+ classname = str(src)
+ if c_ and classname[:len(c_)] == c_:
+ classname = classname[len(c_):]
+ if class_suffix and classname[:-len(class_suffix)] == class_suffix:
+ classname = classname[-len(class_suffix):]
+ s = src.rfile()
+ s.attributes.java_classdir = classdir
+ s.attributes.java_classname = classname
+ slist.append(s)
+
+ stub_suffixes = ['_Stub']
+ if env.get('JAVAVERSION') == '1.4':
+ stub_suffixes.append('_Skel')
+
+ tlist = []
+ for s in source:
+ for suff in stub_suffixes:
+ fname = s.attributes.java_classname.replace('.', os.sep) + \
+ suff + class_suffix
+ t = target[0].File(fname)
+ t.attributes.java_lookupdir = target[0]
+ tlist.append(t)
+
+ return tlist, source
+
+RMICAction = SCons.Action.Action('$RMICCOM', '$RMICCOMSTR')
+
+RMICBuilder = SCons.Builder.Builder(action = RMICAction,
+ emitter = emit_rmic_classes,
+ src_suffix = '$JAVACLASSSUFFIX',
+ target_factory = SCons.Node.FS.Dir,
+ source_factory = SCons.Node.FS.File)
+
+def generate(env):
+ """Add Builders and construction variables for rmic to an Environment."""
+ env['BUILDERS']['RMIC'] = RMICBuilder
+
+ env['RMIC'] = 'rmic'
+ env['RMICFLAGS'] = SCons.Util.CLVar('')
+ env['RMICCOM'] = '$RMIC $RMICFLAGS -d ${TARGET.attributes.java_lookupdir} -classpath ${SOURCE.attributes.java_classdir} ${SOURCES.attributes.java_classname}'
+ env['JAVACLASSSUFFIX'] = '.class'
+
+def exists(env):
+ # As reported by Jan Nijtmans in issue #2730, the simple
+ # return env.Detect('rmic')
+ # doesn't always work during initialization. For now, we
+ # stop trying to detect an executable (analogous to the
+ # javac Builder).
+ # TODO: Come up with a proper detect() routine...and enable it.
+ return 1
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/rmic.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/rmic.xml
new file mode 100644
index 0000000..bc9e2ba
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/rmic.xml
@@ -0,0 +1,128 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+__COPYRIGHT__
+
+This file is processed by the bin/SConsDoc.py module.
+See its __doc__ string for a discussion of the format.
+-->
+
+<!DOCTYPE sconsdoc [
+<!ENTITY % scons SYSTEM '../../../../doc/scons.mod'>
+%scons;
+<!ENTITY % builders-mod SYSTEM '../../../../doc/generated/builders.mod'>
+%builders-mod;
+<!ENTITY % functions-mod SYSTEM '../../../../doc/generated/functions.mod'>
+%functions-mod;
+<!ENTITY % tools-mod SYSTEM '../../../../doc/generated/tools.mod'>
+%tools-mod;
+<!ENTITY % variables-mod SYSTEM '../../../../doc/generated/variables.mod'>
+%variables-mod;
+]>
+
+<sconsdoc xmlns="http://www.scons.org/dbxsd/v1.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://www.scons.org/dbxsd/v1.0 http://www.scons.org/dbxsd/v1.0/scons.xsd">
+
+<tool name="rmic">
+<summary>
+<para>
+Sets construction variables for the &rmic; utility.
+</para>
+</summary>
+<sets>
+<item>RMIC</item>
+<item>RMICFLAGS</item>
+<item>RMICCOM</item>
+<item>JAVACLASSSUFFIX</item>
+</sets>
+<uses>
+<item>RMICCOMSTR</item>
+</uses>
+</tool>
+
+<builder name="RMIC">
+<summary>
+<para>
+Builds stub and skeleton class files
+for remote objects
+from Java <filename>.class</filename> files.
+The target is a directory
+relative to which the stub
+and skeleton class files will be written.
+The source can be the names of <filename>.class</filename> files,
+or the objects return from the
+&b-Java;
+builder method.
+</para>
+
+<para>
+If the construction variable
+&cv-link-JAVACLASSDIR;
+is set, either in the environment
+or in the call to the
+&b-RMIC;
+builder method itself,
+then the value of the variable
+will be stripped from the
+beginning of any <filename>.class </filename>
+file names.
+</para>
+
+<example_commands>
+classes = env.Java(target = 'classdir', source = 'src')
+env.RMIC(target = 'outdir1', source = classes)
+
+env.RMIC(target = 'outdir2',
+ source = ['package/foo.class', 'package/bar.class'])
+
+env.RMIC(target = 'outdir3',
+ source = ['classes/foo.class', 'classes/bar.class'],
+ JAVACLASSDIR = 'classes')
+</example_commands>
+</summary>
+</builder>
+
+<cvar name="RMIC">
+<summary>
+<para>
+The Java RMI stub compiler.
+</para>
+</summary>
+</cvar>
+
+<cvar name="RMICCOM">
+<summary>
+<para>
+The command line used to compile stub
+and skeleton class files
+from Java classes that contain RMI implementations.
+Any options specified in the &cv-link-RMICFLAGS; construction variable
+are included on this command line.
+</para>
+</summary>
+</cvar>
+
+<cvar name="RMICCOMSTR">
+<summary>
+<para>
+The string displayed when compiling
+stub and skeleton class files
+from Java classes that contain RMI implementations.
+If this is not set, then &cv-link-RMICCOM; (the command line) is displayed.
+</para>
+
+<example_commands>
+env = Environment(RMICCOMSTR = "Generating stub/skeleton class files $TARGETS from $SOURCES")
+</example_commands>
+</summary>
+</cvar>
+
+<cvar name="RMICFLAGS">
+<summary>
+<para>
+General options passed to the Java RMI stub compiler.
+</para>
+</summary>
+</cvar>
+
+</sconsdoc>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/rpcgen.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/rpcgen.py
new file mode 100644
index 0000000..4af5965
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/rpcgen.py
@@ -0,0 +1,70 @@
+"""SCons.Tool.rpcgen
+
+Tool-specific initialization for RPCGEN tools.
+
+Three normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+from SCons.Builder import Builder
+import SCons.Util
+
+cmd = "cd ${SOURCE.dir} && $RPCGEN -%s $RPCGENFLAGS %s -o ${TARGET.abspath} ${SOURCE.file}"
+
+rpcgen_client = cmd % ('l', '$RPCGENCLIENTFLAGS')
+rpcgen_header = cmd % ('h', '$RPCGENHEADERFLAGS')
+rpcgen_service = cmd % ('m', '$RPCGENSERVICEFLAGS')
+rpcgen_xdr = cmd % ('c', '$RPCGENXDRFLAGS')
+
+def generate(env):
+ "Add RPCGEN Builders and construction variables for an Environment."
+
+ client = Builder(action=rpcgen_client, suffix='_clnt.c', src_suffix='.x')
+ header = Builder(action=rpcgen_header, suffix='.h', src_suffix='.x')
+ service = Builder(action=rpcgen_service, suffix='_svc.c', src_suffix='.x')
+ xdr = Builder(action=rpcgen_xdr, suffix='_xdr.c', src_suffix='.x')
+ env.Append(BUILDERS={'RPCGenClient' : client,
+ 'RPCGenHeader' : header,
+ 'RPCGenService' : service,
+ 'RPCGenXDR' : xdr})
+ env['RPCGEN'] = 'rpcgen'
+ env['RPCGENFLAGS'] = SCons.Util.CLVar('')
+ env['RPCGENCLIENTFLAGS'] = SCons.Util.CLVar('')
+ env['RPCGENHEADERFLAGS'] = SCons.Util.CLVar('')
+ env['RPCGENSERVICEFLAGS'] = SCons.Util.CLVar('')
+ env['RPCGENXDRFLAGS'] = SCons.Util.CLVar('')
+
+def exists(env):
+ return env.Detect('rpcgen')
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/rpcgen.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/rpcgen.xml
new file mode 100644
index 0000000..087bf38
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/rpcgen.xml
@@ -0,0 +1,180 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+__COPYRIGHT__
+
+This file is processed by the bin/SConsDoc.py module.
+See its __doc__ string for a discussion of the format.
+-->
+
+<!DOCTYPE sconsdoc [
+<!ENTITY % scons SYSTEM '../../../../doc/scons.mod'>
+%scons;
+<!ENTITY % builders-mod SYSTEM '../../../../doc/generated/builders.mod'>
+%builders-mod;
+<!ENTITY % functions-mod SYSTEM '../../../../doc/generated/functions.mod'>
+%functions-mod;
+<!ENTITY % tools-mod SYSTEM '../../../../doc/generated/tools.mod'>
+%tools-mod;
+<!ENTITY % variables-mod SYSTEM '../../../../doc/generated/variables.mod'>
+%variables-mod;
+]>
+
+<sconsdoc xmlns="http://www.scons.org/dbxsd/v1.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://www.scons.org/dbxsd/v1.0 http://www.scons.org/dbxsd/v1.0/scons.xsd">
+
+<tool name="rpcgen">
+<summary>
+<para>
+Sets construction variables for building with RPCGEN.
+</para>
+</summary>
+<sets>
+<item>RPCGEN</item>
+<item>RPCGENFLAGS</item>
+<item>RPCGENCLIENTFLAGS</item>
+<item>RPCGENHEADERFLAGS</item>
+<item>RPCGENSERVICEFLAGS</item>
+<item>RPCGENXDRFLAGS</item>
+</sets>
+<uses>
+</uses>
+</tool>
+
+<builder name="RPCGenClient">
+<summary>
+<para>
+Generates an RPC client stub (<filename>_clnt.c</filename>) file
+from a specified RPC (<filename>.x</filename>) source file.
+Because rpcgen only builds output files
+in the local directory,
+the command will be executed
+in the source file's directory by default.
+</para>
+
+<example_commands>
+# Builds src/rpcif_clnt.c
+env.RPCGenClient('src/rpcif.x')
+</example_commands>
+</summary>
+</builder>
+
+<builder name="RPCGenHeader">
+<summary>
+<para>
+Generates an RPC header (<filename>.h</filename>) file
+from a specified RPC (<filename>.x</filename>) source file.
+Because rpcgen only builds output files
+in the local directory,
+the command will be executed
+in the source file's directory by default.
+</para>
+
+<example_commands>
+# Builds src/rpcif.h
+env.RPCGenHeader('src/rpcif.x')
+</example_commands>
+</summary>
+</builder>
+
+<builder name="RPCGenService">
+<summary>
+<para>
+Generates an RPC server-skeleton (<filename>_svc.c</filename>) file
+from a specified RPC (<filename>.x</filename>) source file.
+Because rpcgen only builds output files
+in the local directory,
+the command will be executed
+in the source file's directory by default.
+</para>
+
+<example_commands>
+# Builds src/rpcif_svc.c
+env.RPCGenClient('src/rpcif.x')
+</example_commands>
+</summary>
+</builder>
+
+<builder name="RPCGenXDR">
+<summary>
+<para>
+Generates an RPC XDR routine (<filename>_xdr.c</filename>) file
+from a specified RPC (<filename>.x</filename>) source file.
+Because rpcgen only builds output files
+in the local directory,
+the command will be executed
+in the source file's directory by default.
+</para>
+
+<example_commands>
+# Builds src/rpcif_xdr.c
+env.RPCGenClient('src/rpcif.x')
+</example_commands>
+</summary>
+</builder>
+
+<cvar name="RPCGEN">
+<summary>
+<para>
+The RPC protocol compiler.
+</para>
+</summary>
+</cvar>
+
+<cvar name="RPCGENCLIENTFLAGS">
+<summary>
+<para>
+Options passed to the RPC protocol compiler
+when generating client side stubs.
+These are in addition to any flags specified in the
+&cv-link-RPCGENFLAGS;
+construction variable.
+</para>
+</summary>
+</cvar>
+
+<cvar name="RPCGENFLAGS">
+<summary>
+<para>
+General options passed to the RPC protocol compiler.
+</para>
+</summary>
+</cvar>
+
+<cvar name="RPCGENHEADERFLAGS">
+<summary>
+<para>
+Options passed to the RPC protocol compiler
+when generating a header file.
+These are in addition to any flags specified in the
+&cv-link-RPCGENFLAGS;
+construction variable.
+</para>
+</summary>
+</cvar>
+
+<cvar name="RPCGENSERVICEFLAGS">
+<summary>
+<para>
+Options passed to the RPC protocol compiler
+when generating server side stubs.
+These are in addition to any flags specified in the
+&cv-link-RPCGENFLAGS;
+construction variable.
+</para>
+</summary>
+</cvar>
+
+<cvar name="RPCGENXDRFLAGS">
+<summary>
+<para>
+Options passed to the RPC protocol compiler
+when generating XDR routines.
+These are in addition to any flags specified in the
+&cv-link-RPCGENFLAGS;
+construction variable.
+</para>
+</summary>
+</cvar>
+
+</sconsdoc>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/rpm.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/rpm.py
new file mode 100644
index 0000000..5198f84
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/rpm.py
@@ -0,0 +1,132 @@
+"""SCons.Tool.rpm
+
+Tool-specific initialization for rpm.
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+
+The rpm tool calls the rpmbuild command. The first and only argument should a
+tar.gz consisting of the source file and a specfile.
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import os
+import re
+import shutil
+import subprocess
+
+import SCons.Builder
+import SCons.Node.FS
+import SCons.Util
+import SCons.Action
+import SCons.Defaults
+
+def get_cmd(source, env):
+ tar_file_with_included_specfile = source
+ if SCons.Util.is_List(source):
+ tar_file_with_included_specfile = source[0]
+ return "%s %s %s"%(env['RPM'], env['RPMFLAGS'],
+ tar_file_with_included_specfile.get_abspath() )
+
+def build_rpm(target, source, env):
+ # create a temporary rpm build root.
+ tmpdir = os.path.join( os.path.dirname( target[0].get_abspath() ), 'rpmtemp' )
+ if os.path.exists(tmpdir):
+ shutil.rmtree(tmpdir)
+
+ # now create the mandatory rpm directory structure.
+ for d in ['RPMS', 'SRPMS', 'SPECS', 'BUILD']:
+ os.makedirs( os.path.join( tmpdir, d ) )
+
+ # set the topdir as an rpmflag.
+ env.Prepend( RPMFLAGS = '--define \'_topdir %s\'' % tmpdir )
+
+ # now call rpmbuild to create the rpm package.
+ handle = subprocess.Popen(get_cmd(source, env),
+ stdout=subprocess.PIPE,
+ stderr=subprocess.STDOUT,
+ shell=True)
+ output = SCons.Util.to_str(handle.stdout.read())
+ status = handle.wait()
+
+ if status:
+ raise SCons.Errors.BuildError( node=target[0],
+ errstr=output,
+ filename=str(target[0]) )
+ else:
+ # XXX: assume that LC_ALL=C is set while running rpmbuild
+ output_files = re.compile( 'Wrote: (.*)' ).findall( output )
+
+ for output, input in zip( output_files, target ):
+ rpm_output = os.path.basename(output)
+ expected = os.path.basename(input.get_path())
+
+ assert expected == rpm_output, "got %s but expected %s" % (rpm_output, expected)
+ shutil.copy( output, input.get_abspath() )
+
+
+ # cleanup before leaving.
+ shutil.rmtree(tmpdir)
+
+ return status
+
+def string_rpm(target, source, env):
+ try:
+ return env['RPMCOMSTR']
+ except KeyError:
+ return get_cmd(source, env)
+
+rpmAction = SCons.Action.Action(build_rpm, string_rpm)
+
+RpmBuilder = SCons.Builder.Builder(action = SCons.Action.Action('$RPMCOM', '$RPMCOMSTR'),
+ source_scanner = SCons.Defaults.DirScanner,
+ suffix = '$RPMSUFFIX')
+
+
+
+def generate(env):
+ """Add Builders and construction variables for rpm to an Environment."""
+ try:
+ bld = env['BUILDERS']['Rpm']
+ except KeyError:
+ bld = RpmBuilder
+ env['BUILDERS']['Rpm'] = bld
+
+ env.SetDefault(RPM = 'LC_ALL=C rpmbuild')
+ env.SetDefault(RPMFLAGS = SCons.Util.CLVar('-ta'))
+ env.SetDefault(RPMCOM = rpmAction)
+ env.SetDefault(RPMSUFFIX = '.rpm')
+
+def exists(env):
+ return env.Detect('rpmbuild')
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/rpmutils.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/rpmutils.py
new file mode 100644
index 0000000..e2d6997
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/rpmutils.py
@@ -0,0 +1,547 @@
+"""SCons.Tool.rpmutils.py
+
+RPM specific helper routines for general usage in the test framework
+and SCons core modules.
+
+Since we check for the RPM package target name in several places,
+we have to know which machine/system name RPM will use for the current
+hardware setup. The following dictionaries and functions try to
+mimic the exact naming rules of the RPM source code.
+They were directly derived from the file "rpmrc.in" of the version
+rpm-4.9.1.3. For updating to a more recent version of RPM, this Python
+script can be used standalone. The usage() function below shows the
+exact syntax.
+
+"""
+
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+from __future__ import print_function
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+
+import platform
+import subprocess
+
+import SCons.Util
+
+# Start of rpmrc dictionaries (Marker, don't change or remove!)
+os_canon = {
+ 'AIX' : ['AIX','5'],
+ 'AmigaOS' : ['AmigaOS','5'],
+ 'BSD_OS' : ['bsdi','12'],
+ 'CYGWIN32_95' : ['cygwin32','15'],
+ 'CYGWIN32_NT' : ['cygwin32','14'],
+ 'Darwin' : ['darwin','21'],
+ 'FreeBSD' : ['FreeBSD','8'],
+ 'HP-UX' : ['hpux10','6'],
+ 'IRIX' : ['Irix','2'],
+ 'IRIX64' : ['Irix64','10'],
+ 'Linux' : ['Linux','1'],
+ 'Linux/390' : ['OS/390','20'],
+ 'Linux/ESA' : ['VM/ESA','20'],
+ 'MacOSX' : ['macosx','21'],
+ 'MiNT' : ['FreeMiNT','17'],
+ 'NEXTSTEP' : ['NextStep','11'],
+ 'OS/390' : ['OS/390','18'],
+ 'OSF1' : ['osf1','7'],
+ 'SCO_SV' : ['SCO_SV3.2v5.0.2','9'],
+ 'SunOS4' : ['SunOS','4'],
+ 'SunOS5' : ['solaris','3'],
+ 'UNIX_SV' : ['MP_RAS','16'],
+ 'VM/ESA' : ['VM/ESA','19'],
+ 'machten' : ['machten','13'],
+ 'osf3.2' : ['osf1','7'],
+ 'osf4.0' : ['osf1','7'],
+}
+
+buildarch_compat = {
+ 'alpha' : ['noarch'],
+ 'alphaev5' : ['alpha'],
+ 'alphaev56' : ['alphaev5'],
+ 'alphaev6' : ['alphapca56'],
+ 'alphaev67' : ['alphaev6'],
+ 'alphapca56' : ['alphaev56'],
+ 'amd64' : ['x86_64'],
+ 'armv3l' : ['noarch'],
+ 'armv4b' : ['noarch'],
+ 'armv4l' : ['armv3l'],
+ 'armv4tl' : ['armv4l'],
+ 'armv5tejl' : ['armv5tel'],
+ 'armv5tel' : ['armv4tl'],
+ 'armv6l' : ['armv5tejl'],
+ 'armv7l' : ['armv6l'],
+ 'atariclone' : ['m68kmint','noarch'],
+ 'atarist' : ['m68kmint','noarch'],
+ 'atariste' : ['m68kmint','noarch'],
+ 'ataritt' : ['m68kmint','noarch'],
+ 'athlon' : ['i686'],
+ 'falcon' : ['m68kmint','noarch'],
+ 'geode' : ['i586'],
+ 'hades' : ['m68kmint','noarch'],
+ 'hppa1.0' : ['parisc'],
+ 'hppa1.1' : ['hppa1.0'],
+ 'hppa1.2' : ['hppa1.1'],
+ 'hppa2.0' : ['hppa1.2'],
+ 'i386' : ['noarch','fat'],
+ 'i486' : ['i386'],
+ 'i586' : ['i486'],
+ 'i686' : ['i586'],
+ 'ia32e' : ['x86_64'],
+ 'ia64' : ['noarch'],
+ 'm68k' : ['noarch'],
+ 'milan' : ['m68kmint','noarch'],
+ 'mips' : ['noarch'],
+ 'mipsel' : ['noarch'],
+ 'parisc' : ['noarch'],
+ 'pentium3' : ['i686'],
+ 'pentium4' : ['pentium3'],
+ 'ppc' : ['noarch','fat'],
+ 'ppc32dy4' : ['noarch'],
+ 'ppc64' : ['noarch','fat'],
+ 'ppc64iseries' : ['ppc64'],
+ 'ppc64pseries' : ['ppc64'],
+ 'ppc8260' : ['noarch'],
+ 'ppc8560' : ['noarch'],
+ 'ppciseries' : ['noarch'],
+ 'ppcpseries' : ['noarch'],
+ 's390' : ['noarch'],
+ 's390x' : ['noarch'],
+ 'sh3' : ['noarch'],
+ 'sh4' : ['noarch'],
+ 'sh4a' : ['sh4'],
+ 'sparc' : ['noarch'],
+ 'sparc64' : ['sparcv9v'],
+ 'sparc64v' : ['sparc64'],
+ 'sparcv8' : ['sparc'],
+ 'sparcv9' : ['sparcv8'],
+ 'sparcv9v' : ['sparcv9'],
+ 'sun4c' : ['noarch'],
+ 'sun4d' : ['noarch'],
+ 'sun4m' : ['noarch'],
+ 'sun4u' : ['noarch'],
+ 'x86_64' : ['noarch'],
+}
+
+os_compat = {
+ 'BSD_OS' : ['bsdi'],
+ 'Darwin' : ['MacOSX'],
+ 'FreeMiNT' : ['mint','MiNT','TOS'],
+ 'IRIX64' : ['IRIX'],
+ 'MiNT' : ['FreeMiNT','mint','TOS'],
+ 'TOS' : ['FreeMiNT','MiNT','mint'],
+ 'bsdi4.0' : ['bsdi'],
+ 'hpux10.00' : ['hpux9.07'],
+ 'hpux10.01' : ['hpux10.00'],
+ 'hpux10.10' : ['hpux10.01'],
+ 'hpux10.20' : ['hpux10.10'],
+ 'hpux10.30' : ['hpux10.20'],
+ 'hpux11.00' : ['hpux10.30'],
+ 'hpux9.05' : ['hpux9.04'],
+ 'hpux9.07' : ['hpux9.05'],
+ 'mint' : ['FreeMiNT','MiNT','TOS'],
+ 'ncr-sysv4.3' : ['ncr-sysv4.2'],
+ 'osf4.0' : ['osf3.2','osf1'],
+ 'solaris2.4' : ['solaris2.3'],
+ 'solaris2.5' : ['solaris2.3','solaris2.4'],
+ 'solaris2.6' : ['solaris2.3','solaris2.4','solaris2.5'],
+ 'solaris2.7' : ['solaris2.3','solaris2.4','solaris2.5','solaris2.6'],
+}
+
+arch_compat = {
+ 'alpha' : ['axp','noarch'],
+ 'alphaev5' : ['alpha'],
+ 'alphaev56' : ['alphaev5'],
+ 'alphaev6' : ['alphapca56'],
+ 'alphaev67' : ['alphaev6'],
+ 'alphapca56' : ['alphaev56'],
+ 'amd64' : ['x86_64','athlon','noarch'],
+ 'armv3l' : ['noarch'],
+ 'armv4b' : ['noarch'],
+ 'armv4l' : ['armv3l'],
+ 'armv4tl' : ['armv4l'],
+ 'armv5tejl' : ['armv5tel'],
+ 'armv5tel' : ['armv4tl'],
+ 'armv6l' : ['armv5tejl'],
+ 'armv7l' : ['armv6l'],
+ 'atariclone' : ['m68kmint','noarch'],
+ 'atarist' : ['m68kmint','noarch'],
+ 'atariste' : ['m68kmint','noarch'],
+ 'ataritt' : ['m68kmint','noarch'],
+ 'athlon' : ['i686'],
+ 'falcon' : ['m68kmint','noarch'],
+ 'geode' : ['i586'],
+ 'hades' : ['m68kmint','noarch'],
+ 'hppa1.0' : ['parisc'],
+ 'hppa1.1' : ['hppa1.0'],
+ 'hppa1.2' : ['hppa1.1'],
+ 'hppa2.0' : ['hppa1.2'],
+ 'i370' : ['noarch'],
+ 'i386' : ['noarch','fat'],
+ 'i486' : ['i386'],
+ 'i586' : ['i486'],
+ 'i686' : ['i586'],
+ 'ia32e' : ['x86_64','athlon','noarch'],
+ 'ia64' : ['noarch'],
+ 'milan' : ['m68kmint','noarch'],
+ 'mips' : ['noarch'],
+ 'mipsel' : ['noarch'],
+ 'osfmach3_i386' : ['i486'],
+ 'osfmach3_i486' : ['i486','osfmach3_i386'],
+ 'osfmach3_i586' : ['i586','osfmach3_i486'],
+ 'osfmach3_i686' : ['i686','osfmach3_i586'],
+ 'osfmach3_ppc' : ['ppc'],
+ 'parisc' : ['noarch'],
+ 'pentium3' : ['i686'],
+ 'pentium4' : ['pentium3'],
+ 'powerpc' : ['ppc'],
+ 'powerppc' : ['ppc'],
+ 'ppc' : ['rs6000'],
+ 'ppc32dy4' : ['ppc'],
+ 'ppc64' : ['ppc'],
+ 'ppc64iseries' : ['ppc64'],
+ 'ppc64pseries' : ['ppc64'],
+ 'ppc8260' : ['ppc'],
+ 'ppc8560' : ['ppc'],
+ 'ppciseries' : ['ppc'],
+ 'ppcpseries' : ['ppc'],
+ 'rs6000' : ['noarch','fat'],
+ 's390' : ['noarch'],
+ 's390x' : ['s390','noarch'],
+ 'sh3' : ['noarch'],
+ 'sh4' : ['noarch'],
+ 'sh4a' : ['sh4'],
+ 'sparc' : ['noarch'],
+ 'sparc64' : ['sparcv9'],
+ 'sparc64v' : ['sparc64'],
+ 'sparcv8' : ['sparc'],
+ 'sparcv9' : ['sparcv8'],
+ 'sparcv9v' : ['sparcv9'],
+ 'sun4c' : ['sparc'],
+ 'sun4d' : ['sparc'],
+ 'sun4m' : ['sparc'],
+ 'sun4u' : ['sparc64'],
+ 'x86_64' : ['amd64','athlon','noarch'],
+}
+
+buildarchtranslate = {
+ 'alphaev5' : ['alpha'],
+ 'alphaev56' : ['alpha'],
+ 'alphaev6' : ['alpha'],
+ 'alphaev67' : ['alpha'],
+ 'alphapca56' : ['alpha'],
+ 'amd64' : ['x86_64'],
+ 'armv3l' : ['armv3l'],
+ 'armv4b' : ['armv4b'],
+ 'armv4l' : ['armv4l'],
+ 'armv4tl' : ['armv4tl'],
+ 'armv5tejl' : ['armv5tejl'],
+ 'armv5tel' : ['armv5tel'],
+ 'armv6l' : ['armv6l'],
+ 'armv7l' : ['armv7l'],
+ 'atariclone' : ['m68kmint'],
+ 'atarist' : ['m68kmint'],
+ 'atariste' : ['m68kmint'],
+ 'ataritt' : ['m68kmint'],
+ 'athlon' : ['i386'],
+ 'falcon' : ['m68kmint'],
+ 'geode' : ['i386'],
+ 'hades' : ['m68kmint'],
+ 'i386' : ['i386'],
+ 'i486' : ['i386'],
+ 'i586' : ['i386'],
+ 'i686' : ['i386'],
+ 'ia32e' : ['x86_64'],
+ 'ia64' : ['ia64'],
+ 'milan' : ['m68kmint'],
+ 'osfmach3_i386' : ['i386'],
+ 'osfmach3_i486' : ['i386'],
+ 'osfmach3_i586' : ['i386'],
+ 'osfmach3_i686' : ['i386'],
+ 'osfmach3_ppc' : ['ppc'],
+ 'pentium3' : ['i386'],
+ 'pentium4' : ['i386'],
+ 'powerpc' : ['ppc'],
+ 'powerppc' : ['ppc'],
+ 'ppc32dy4' : ['ppc'],
+ 'ppc64iseries' : ['ppc64'],
+ 'ppc64pseries' : ['ppc64'],
+ 'ppc8260' : ['ppc'],
+ 'ppc8560' : ['ppc'],
+ 'ppciseries' : ['ppc'],
+ 'ppcpseries' : ['ppc'],
+ 's390' : ['s390'],
+ 's390x' : ['s390x'],
+ 'sh3' : ['sh3'],
+ 'sh4' : ['sh4'],
+ 'sh4a' : ['sh4'],
+ 'sparc64v' : ['sparc64'],
+ 'sparcv8' : ['sparc'],
+ 'sparcv9' : ['sparc'],
+ 'sparcv9v' : ['sparc'],
+ 'sun4c' : ['sparc'],
+ 'sun4d' : ['sparc'],
+ 'sun4m' : ['sparc'],
+ 'sun4u' : ['sparc64'],
+ 'x86_64' : ['x86_64'],
+}
+
+optflags = {
+ 'alpha' : ['-O2','-g','-mieee'],
+ 'alphaev5' : ['-O2','-g','-mieee','-mtune=ev5'],
+ 'alphaev56' : ['-O2','-g','-mieee','-mtune=ev56'],
+ 'alphaev6' : ['-O2','-g','-mieee','-mtune=ev6'],
+ 'alphaev67' : ['-O2','-g','-mieee','-mtune=ev67'],
+ 'alphapca56' : ['-O2','-g','-mieee','-mtune=pca56'],
+ 'amd64' : ['-O2','-g'],
+ 'armv3l' : ['-O2','-g','-march=armv3'],
+ 'armv4b' : ['-O2','-g','-march=armv4'],
+ 'armv4l' : ['-O2','-g','-march=armv4'],
+ 'armv4tl' : ['-O2','-g','-march=armv4t'],
+ 'armv5tejl' : ['-O2','-g','-march=armv5te'],
+ 'armv5tel' : ['-O2','-g','-march=armv5te'],
+ 'armv6l' : ['-O2','-g','-march=armv6'],
+ 'armv7l' : ['-O2','-g','-march=armv7'],
+ 'atariclone' : ['-O2','-g','-fomit-frame-pointer'],
+ 'atarist' : ['-O2','-g','-fomit-frame-pointer'],
+ 'atariste' : ['-O2','-g','-fomit-frame-pointer'],
+ 'ataritt' : ['-O2','-g','-fomit-frame-pointer'],
+ 'athlon' : ['-O2','-g','-march=athlon'],
+ 'falcon' : ['-O2','-g','-fomit-frame-pointer'],
+ 'fat' : ['-O2','-g','-arch','i386','-arch','ppc'],
+ 'geode' : ['-Os','-g','-m32','-march=geode'],
+ 'hades' : ['-O2','-g','-fomit-frame-pointer'],
+ 'hppa1.0' : ['-O2','-g','-mpa-risc-1-0'],
+ 'hppa1.1' : ['-O2','-g','-mpa-risc-1-0'],
+ 'hppa1.2' : ['-O2','-g','-mpa-risc-1-0'],
+ 'hppa2.0' : ['-O2','-g','-mpa-risc-1-0'],
+ 'i386' : ['-O2','-g','-march=i386','-mtune=i686'],
+ 'i486' : ['-O2','-g','-march=i486'],
+ 'i586' : ['-O2','-g','-march=i586'],
+ 'i686' : ['-O2','-g','-march=i686'],
+ 'ia32e' : ['-O2','-g'],
+ 'ia64' : ['-O2','-g'],
+ 'm68k' : ['-O2','-g','-fomit-frame-pointer'],
+ 'milan' : ['-O2','-g','-fomit-frame-pointer'],
+ 'mips' : ['-O2','-g'],
+ 'mipsel' : ['-O2','-g'],
+ 'parisc' : ['-O2','-g','-mpa-risc-1-0'],
+ 'pentium3' : ['-O2','-g','-march=pentium3'],
+ 'pentium4' : ['-O2','-g','-march=pentium4'],
+ 'ppc' : ['-O2','-g','-fsigned-char'],
+ 'ppc32dy4' : ['-O2','-g','-fsigned-char'],
+ 'ppc64' : ['-O2','-g','-fsigned-char'],
+ 'ppc8260' : ['-O2','-g','-fsigned-char'],
+ 'ppc8560' : ['-O2','-g','-fsigned-char'],
+ 'ppciseries' : ['-O2','-g','-fsigned-char'],
+ 'ppcpseries' : ['-O2','-g','-fsigned-char'],
+ 's390' : ['-O2','-g'],
+ 's390x' : ['-O2','-g'],
+ 'sh3' : ['-O2','-g'],
+ 'sh4' : ['-O2','-g','-mieee'],
+ 'sh4a' : ['-O2','-g','-mieee'],
+ 'sparc' : ['-O2','-g','-m32','-mtune=ultrasparc'],
+ 'sparc64' : ['-O2','-g','-m64','-mtune=ultrasparc'],
+ 'sparc64v' : ['-O2','-g','-m64','-mtune=niagara'],
+ 'sparcv8' : ['-O2','-g','-m32','-mtune=ultrasparc','-mv8'],
+ 'sparcv9' : ['-O2','-g','-m32','-mtune=ultrasparc'],
+ 'sparcv9v' : ['-O2','-g','-m32','-mtune=niagara'],
+ 'x86_64' : ['-O2','-g'],
+}
+
+arch_canon = {
+ 'IP' : ['sgi','7'],
+ 'alpha' : ['alpha','2'],
+ 'alphaev5' : ['alphaev5','2'],
+ 'alphaev56' : ['alphaev56','2'],
+ 'alphaev6' : ['alphaev6','2'],
+ 'alphaev67' : ['alphaev67','2'],
+ 'alphapca56' : ['alphapca56','2'],
+ 'amd64' : ['amd64','1'],
+ 'armv3l' : ['armv3l','12'],
+ 'armv4b' : ['armv4b','12'],
+ 'armv4l' : ['armv4l','12'],
+ 'armv5tejl' : ['armv5tejl','12'],
+ 'armv5tel' : ['armv5tel','12'],
+ 'armv6l' : ['armv6l','12'],
+ 'armv7l' : ['armv7l','12'],
+ 'atariclone' : ['m68kmint','13'],
+ 'atarist' : ['m68kmint','13'],
+ 'atariste' : ['m68kmint','13'],
+ 'ataritt' : ['m68kmint','13'],
+ 'athlon' : ['athlon','1'],
+ 'falcon' : ['m68kmint','13'],
+ 'geode' : ['geode','1'],
+ 'hades' : ['m68kmint','13'],
+ 'i370' : ['i370','14'],
+ 'i386' : ['i386','1'],
+ 'i486' : ['i486','1'],
+ 'i586' : ['i586','1'],
+ 'i686' : ['i686','1'],
+ 'ia32e' : ['ia32e','1'],
+ 'ia64' : ['ia64','9'],
+ 'm68k' : ['m68k','6'],
+ 'm68kmint' : ['m68kmint','13'],
+ 'milan' : ['m68kmint','13'],
+ 'mips' : ['mips','4'],
+ 'mipsel' : ['mipsel','11'],
+ 'pentium3' : ['pentium3','1'],
+ 'pentium4' : ['pentium4','1'],
+ 'ppc' : ['ppc','5'],
+ 'ppc32dy4' : ['ppc32dy4','5'],
+ 'ppc64' : ['ppc64','16'],
+ 'ppc64iseries' : ['ppc64iseries','16'],
+ 'ppc64pseries' : ['ppc64pseries','16'],
+ 'ppc8260' : ['ppc8260','5'],
+ 'ppc8560' : ['ppc8560','5'],
+ 'ppciseries' : ['ppciseries','5'],
+ 'ppcpseries' : ['ppcpseries','5'],
+ 'rs6000' : ['rs6000','8'],
+ 's390' : ['s390','14'],
+ 's390x' : ['s390x','15'],
+ 'sh' : ['sh','17'],
+ 'sh3' : ['sh3','17'],
+ 'sh4' : ['sh4','17'],
+ 'sh4a' : ['sh4a','17'],
+ 'sparc' : ['sparc','3'],
+ 'sparc64' : ['sparc64','2'],
+ 'sparc64v' : ['sparc64v','2'],
+ 'sparcv8' : ['sparcv8','3'],
+ 'sparcv9' : ['sparcv9','3'],
+ 'sparcv9v' : ['sparcv9v','3'],
+ 'sun4' : ['sparc','3'],
+ 'sun4c' : ['sparc','3'],
+ 'sun4d' : ['sparc','3'],
+ 'sun4m' : ['sparc','3'],
+ 'sun4u' : ['sparc64','2'],
+ 'x86_64' : ['x86_64','1'],
+ 'xtensa' : ['xtensa','18'],
+}
+
+# End of rpmrc dictionaries (Marker, don't change or remove!)
+
+def defaultMachine(use_rpm_default=True):
+ """ Return the canonicalized machine name. """
+
+ if use_rpm_default:
+ try:
+ # This should be the most reliable way to get the default arch
+ rmachine = subprocess.check_output(['rpm', '--eval=%_target_cpu'], shell=False).rstrip()
+ rmachine = SCons.Util.to_str(rmachine)
+ except Exception as e:
+ # Something went wrong, try again by looking up platform.machine()
+ return defaultMachine(False)
+ else:
+ rmachine = platform.machine()
+
+ # Try to lookup the string in the canon table
+ if rmachine in arch_canon:
+ rmachine = arch_canon[rmachine][0]
+
+ return rmachine
+
+def defaultSystem():
+ """ Return the canonicalized system name. """
+ rsystem = platform.system()
+
+ # Try to lookup the string in the canon tables
+ if rsystem in os_canon:
+ rsystem = os_canon[rsystem][0]
+
+ return rsystem
+
+def defaultNames():
+ """ Return the canonicalized machine and system name. """
+ return defaultMachine(), defaultSystem()
+
+def updateRpmDicts(rpmrc, pyfile):
+ """ Read the given rpmrc file with RPM definitions and update the
+ info dictionaries in the file pyfile with it.
+ The arguments will usually be 'rpmrc.in' from a recent RPM source
+ tree, and 'rpmutils.py' referring to this script itself.
+ See also usage() below.
+ """
+ try:
+ # Read old rpmutils.py file
+ oldpy = open(pyfile,"r").readlines()
+ # Read current rpmrc.in file
+ rpm = open(rpmrc,"r").readlines()
+ # Parse for data
+ data = {}
+ # Allowed section names that get parsed
+ sections = ['optflags',
+ 'arch_canon',
+ 'os_canon',
+ 'buildarchtranslate',
+ 'arch_compat',
+ 'os_compat',
+ 'buildarch_compat']
+ for l in rpm:
+ l = l.rstrip('\n').replace(':',' ')
+ # Skip comments
+ if l.lstrip().startswith('#'):
+ continue
+ tokens = l.strip().split()
+ if len(tokens):
+ key = tokens[0]
+ if key in sections:
+ # Have we met this section before?
+ if tokens[0] not in data:
+ # No, so insert it
+ data[key] = {}
+ # Insert data
+ data[key][tokens[1]] = tokens[2:]
+ # Write new rpmutils.py file
+ out = open(pyfile,"w")
+ pm = 0
+ for l in oldpy:
+ if pm:
+ if l.startswith('# End of rpmrc dictionaries'):
+ pm = 0
+ out.write(l)
+ else:
+ out.write(l)
+ if l.startswith('# Start of rpmrc dictionaries'):
+ pm = 1
+ # Write data sections to single dictionaries
+ for key, entries in data.items():
+ out.write("%s = {\n" % key)
+ for arch in sorted(entries.keys()):
+ out.write(" '%s' : ['%s'],\n" % (arch, "','".join(entries[arch])))
+ out.write("}\n\n")
+ out.close()
+ except:
+ pass
+
+def usage():
+ print("rpmutils.py rpmrc.in rpmutils.py")
+
+def main():
+ import sys
+
+ if len(sys.argv) < 3:
+ usage()
+ sys.exit(0)
+ updateRpmDicts(sys.argv[1], sys.argv[2])
+
+if __name__ == "__main__":
+ main()
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/sgiar.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/sgiar.py
new file mode 100644
index 0000000..54f8b7b
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/sgiar.py
@@ -0,0 +1,68 @@
+"""SCons.Tool.sgiar
+
+Tool-specific initialization for SGI ar (library archive). If CC
+exists, static libraries should be built with it, so the prelinker has
+a chance to resolve C++ template instantiations.
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import SCons.Defaults
+import SCons.Tool
+import SCons.Util
+
+def generate(env):
+ """Add Builders and construction variables for ar to an Environment."""
+ SCons.Tool.createStaticLibBuilder(env)
+
+ if env.Detect('CC'):
+ env['AR'] = 'CC'
+ env['ARFLAGS'] = SCons.Util.CLVar('-ar')
+ env['ARCOM'] = '$AR $ARFLAGS -o $TARGET $SOURCES'
+ else:
+ env['AR'] = 'ar'
+ env['ARFLAGS'] = SCons.Util.CLVar('r')
+ env['ARCOM'] = '$AR $ARFLAGS $TARGET $SOURCES'
+
+ env['SHLINK'] = '$LINK'
+ env['SHLINKFLAGS'] = SCons.Util.CLVar('$LINKFLAGS -shared')
+ env['SHLINKCOM'] = '$SHLINK $SHLINKFLAGS -o $TARGET $SOURCES $_LIBDIRFLAGS $_LIBFLAGS'
+ env['LIBPREFIX'] = 'lib'
+ env['LIBSUFFIX'] = '.a'
+
+def exists(env):
+ return env.Detect('CC') or env.Detect('ar')
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/sgiar.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/sgiar.xml
new file mode 100644
index 0000000..d964bee
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/sgiar.xml
@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+__COPYRIGHT__
+
+This file is processed by the bin/SConsDoc.py module.
+See its __doc__ string for a discussion of the format.
+-->
+
+<!DOCTYPE sconsdoc [
+<!ENTITY % scons SYSTEM '../../../../doc/scons.mod'>
+%scons;
+<!ENTITY % builders-mod SYSTEM '../../../../doc/generated/builders.mod'>
+%builders-mod;
+<!ENTITY % functions-mod SYSTEM '../../../../doc/generated/functions.mod'>
+%functions-mod;
+<!ENTITY % tools-mod SYSTEM '../../../../doc/generated/tools.mod'>
+%tools-mod;
+<!ENTITY % variables-mod SYSTEM '../../../../doc/generated/variables.mod'>
+%variables-mod;
+]>
+
+<sconsdoc xmlns="http://www.scons.org/dbxsd/v1.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://www.scons.org/dbxsd/v1.0 http://www.scons.org/dbxsd/v1.0/scons.xsd">
+
+<tool name="sgiar">
+<summary>
+<para>
+Sets construction variables for the SGI library archiver.
+</para>
+</summary>
+<sets>
+<item>AR</item>
+<item>ARFLAGS</item>
+<item>ARCOMSTR</item>
+<item>SHLINK</item>
+<item>SHLINKFLAGS</item>
+<item>LIBPREFIX</item>
+<item>LIBSUFFIX</item>
+</sets>
+<uses>
+<item>ARCOMSTR</item>
+<item>SHLINKCOMSTR</item>
+</uses>
+</tool>
+
+</sconsdoc>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/sgic++.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/sgic++.py
new file mode 100644
index 0000000..63c66e2
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/sgic++.py
@@ -0,0 +1,43 @@
+"""SCons.Tool.sgic++
+
+Tool-specific initialization for MIPSpro C++ on SGI.
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+#forward proxy to the preffered cxx version
+from SCons.Tool.sgicxx import *
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/sgic++.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/sgic++.xml
new file mode 100644
index 0000000..2fea7b3
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/sgic++.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+__COPYRIGHT__
+
+This file is processed by the bin/SConsDoc.py module.
+See its __doc__ string for a discussion of the format.
+-->
+
+<!DOCTYPE sconsdoc [
+<!ENTITY % scons SYSTEM '../../../../doc/scons.mod'>
+%scons;
+<!ENTITY % builders-mod SYSTEM '../../../../doc/generated/builders.mod'>
+%builders-mod;
+<!ENTITY % functions-mod SYSTEM '../../../../doc/generated/functions.mod'>
+%functions-mod;
+<!ENTITY % tools-mod SYSTEM '../../../../doc/generated/tools.mod'>
+%tools-mod;
+<!ENTITY % variables-mod SYSTEM '../../../../doc/generated/variables.mod'>
+%variables-mod;
+]>
+
+<sconsdoc xmlns="http://www.scons.org/dbxsd/v1.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://www.scons.org/dbxsd/v1.0 http://www.scons.org/dbxsd/v1.0/scons.xsd">
+
+<tool name="sgic++">
+<summary>
+<para>
+Sets construction variables for the SGI C++ compiler.
+</para>
+</summary>
+<sets>
+<item>CXX</item>
+<item>CXXFLAGS</item>
+<item>SHCXX</item>
+<item>SHOBJSUFFIX</item>
+<item><!--STATIC_AND_SHARED_OBJECTS_ARE_THE_SAME--></item>
+</sets>
+</tool>
+
+</sconsdoc>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/sgicc.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/sgicc.py
new file mode 100644
index 0000000..94a0497
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/sgicc.py
@@ -0,0 +1,53 @@
+"""SCons.Tool.sgicc
+
+Tool-specific initialization for MIPSPro cc on SGI.
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+from . import cc
+
+def generate(env):
+ """Add Builders and construction variables for gcc to an Environment."""
+ cc.generate(env)
+
+ env['CXX'] = 'CC'
+ env['SHOBJSUFFIX'] = '.o'
+ env['STATIC_AND_SHARED_OBJECTS_ARE_THE_SAME'] = 1
+
+def exists(env):
+ return env.Detect('cc')
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/sgicc.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/sgicc.xml
new file mode 100644
index 0000000..ecf2b66
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/sgicc.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+__COPYRIGHT__
+
+This file is processed by the bin/SConsDoc.py module.
+See its __doc__ string for a discussion of the format.
+-->
+
+<!DOCTYPE sconsdoc [
+<!ENTITY % scons SYSTEM '../../../../doc/scons.mod'>
+%scons;
+<!ENTITY % builders-mod SYSTEM '../../../../doc/generated/builders.mod'>
+%builders-mod;
+<!ENTITY % functions-mod SYSTEM '../../../../doc/generated/functions.mod'>
+%functions-mod;
+<!ENTITY % tools-mod SYSTEM '../../../../doc/generated/tools.mod'>
+%tools-mod;
+<!ENTITY % variables-mod SYSTEM '../../../../doc/generated/variables.mod'>
+%variables-mod;
+]>
+
+<sconsdoc xmlns="http://www.scons.org/dbxsd/v1.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://www.scons.org/dbxsd/v1.0 http://www.scons.org/dbxsd/v1.0/scons.xsd">
+
+<tool name="sgicc">
+<summary>
+<para>
+Sets construction variables for the SGI C compiler.
+</para>
+</summary>
+<sets>
+<item>CXX</item>
+<item>SHOBJSUFFIX</item>
+<item><!--STATIC_AND_SHARED_OBJECTS_ARE_THE_SAME--></item>
+</sets>
+<uses>
+</uses>
+</tool>
+
+</sconsdoc>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/sgicxx.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/sgicxx.py
new file mode 100644
index 0000000..48b04ea
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/sgicxx.py
@@ -0,0 +1,61 @@
+"""SCons.Tool.sgic++
+
+Tool-specific initialization for MIPSpro C++ on SGI.
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import SCons.Util
+
+import SCons.Tool.cxx
+cplusplus = SCons.Tool.cxx
+#cplusplus = __import__('cxx', globals(), locals(), [])
+
+
+def generate(env):
+ """Add Builders and construction variables for SGI MIPS C++ to an Environment."""
+
+ cplusplus.generate(env)
+
+ env['CXX'] = 'CC'
+ env['CXXFLAGS'] = SCons.Util.CLVar('-LANG:std')
+ env['SHCXX'] = '$CXX'
+ env['SHOBJSUFFIX'] = '.o'
+ env['STATIC_AND_SHARED_OBJECTS_ARE_THE_SAME'] = 1
+
+def exists(env):
+ return env.Detect('CC')
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/sgilink.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/sgilink.py
new file mode 100644
index 0000000..b1e7921
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/sgilink.py
@@ -0,0 +1,62 @@
+"""SCons.Tool.sgilink
+
+Tool-specific initialization for the SGI MIPSPro linker on SGI.
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import SCons.Util
+
+from . import link
+
+linkers = ['CC', 'cc']
+
+def generate(env):
+ """Add Builders and construction variables for MIPSPro to an Environment."""
+ link.generate(env)
+
+ env['LINK'] = env.Detect(linkers) or 'cc'
+ env['SHLINKFLAGS'] = SCons.Util.CLVar('$LINKFLAGS -shared')
+
+ # __RPATH is set to $_RPATH in the platform specification if that
+ # platform supports it.
+ env['RPATHPREFIX'] = '-rpath '
+ env['RPATHSUFFIX'] = ''
+ env['_RPATH'] = '${_concat(RPATHPREFIX, RPATH, RPATHSUFFIX, __env__)}'
+
+def exists(env):
+ return env.Detect(linkers)
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/sgilink.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/sgilink.xml
new file mode 100644
index 0000000..7a15562
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/sgilink.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+__COPYRIGHT__
+
+This file is processed by the bin/SConsDoc.py module.
+See its __doc__ string for a discussion of the format.
+-->
+
+<!DOCTYPE sconsdoc [
+<!ENTITY % scons SYSTEM '../../../../doc/scons.mod'>
+%scons;
+<!ENTITY % builders-mod SYSTEM '../../../../doc/generated/builders.mod'>
+%builders-mod;
+<!ENTITY % functions-mod SYSTEM '../../../../doc/generated/functions.mod'>
+%functions-mod;
+<!ENTITY % tools-mod SYSTEM '../../../../doc/generated/tools.mod'>
+%tools-mod;
+<!ENTITY % variables-mod SYSTEM '../../../../doc/generated/variables.mod'>
+%variables-mod;
+]>
+
+<sconsdoc xmlns="http://www.scons.org/dbxsd/v1.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://www.scons.org/dbxsd/v1.0 http://www.scons.org/dbxsd/v1.0/scons.xsd">
+
+<tool name="sgilink">
+<summary>
+<para>
+Sets construction variables for the SGI linker.
+</para>
+</summary>
+<sets>
+<item>LINK</item>
+<item>SHLINKFLAGS</item>
+<item>RPATHPREFIX</item>
+<item>RPATHSUFFIX</item>
+</sets>
+</tool>
+
+</sconsdoc>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/sunar.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/sunar.py
new file mode 100644
index 0000000..ec076c8
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/sunar.py
@@ -0,0 +1,64 @@
+"""engine.SCons.Tool.sunar
+
+Tool-specific initialization for Solaris (Forte) ar (library archive). If CC
+exists, static libraries should be built with it, so that template
+instantiations can be resolved.
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import SCons.Defaults
+import SCons.Tool
+import SCons.Util
+
+def generate(env):
+ """Add Builders and construction variables for ar to an Environment."""
+ SCons.Tool.createStaticLibBuilder(env)
+
+ if env.Detect('CC'):
+ env['AR'] = 'CC'
+ env['ARFLAGS'] = SCons.Util.CLVar('-xar')
+ env['ARCOM'] = '$AR $ARFLAGS -o $TARGET $SOURCES'
+ else:
+ env['AR'] = 'ar'
+ env['ARFLAGS'] = SCons.Util.CLVar('r')
+ env['ARCOM'] = '$AR $ARFLAGS $TARGET $SOURCES'
+
+ env['LIBPREFIX'] = 'lib'
+ env['LIBSUFFIX'] = '.a'
+
+def exists(env):
+ return env.Detect('CC') or env.Detect('ar')
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/sunar.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/sunar.xml
new file mode 100644
index 0000000..f875217
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/sunar.xml
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+__COPYRIGHT__
+
+This file is processed by the bin/SConsDoc.py module.
+See its __doc__ string for a discussion of the format.
+-->
+
+<!DOCTYPE sconsdoc [
+<!ENTITY % scons SYSTEM '../../../../doc/scons.mod'>
+%scons;
+<!ENTITY % builders-mod SYSTEM '../../../../doc/generated/builders.mod'>
+%builders-mod;
+<!ENTITY % functions-mod SYSTEM '../../../../doc/generated/functions.mod'>
+%functions-mod;
+<!ENTITY % tools-mod SYSTEM '../../../../doc/generated/tools.mod'>
+%tools-mod;
+<!ENTITY % variables-mod SYSTEM '../../../../doc/generated/variables.mod'>
+%variables-mod;
+]>
+
+<sconsdoc xmlns="http://www.scons.org/dbxsd/v1.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://www.scons.org/dbxsd/v1.0 http://www.scons.org/dbxsd/v1.0/scons.xsd">
+
+<tool name="sunar">
+<summary>
+<para>
+Sets construction variables for the Sun library archiver.
+</para>
+</summary>
+<sets>
+<item>AR</item>
+<item>ARFLAGS</item>
+<item>ARCOM</item>
+<item>LIBPREFIX</item>
+<item>LIBSUFFIX</item>
+</sets>
+<uses>
+<item>ARCOMSTR</item>
+</uses>
+</tool>
+
+</sconsdoc>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/sunc++.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/sunc++.py
new file mode 100644
index 0000000..3304f80
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/sunc++.py
@@ -0,0 +1,45 @@
+"""SCons.Tool.sunc++
+
+Tool-specific initialization for C++ on SunOS / Solaris.
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+
+#forward proxy to the preffered cxx version
+from SCons.Tool.suncxx import *
+
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/sunc++.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/sunc++.xml
new file mode 100644
index 0000000..4d28f29
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/sunc++.xml
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+__COPYRIGHT__
+
+This file is processed by the bin/SConsDoc.py module.
+See its __doc__ string for a discussion of the format.
+-->
+
+<!DOCTYPE sconsdoc [
+<!ENTITY % scons SYSTEM '../../../../doc/scons.mod'>
+%scons;
+<!ENTITY % builders-mod SYSTEM '../../../../doc/generated/builders.mod'>
+%builders-mod;
+<!ENTITY % functions-mod SYSTEM '../../../../doc/generated/functions.mod'>
+%functions-mod;
+<!ENTITY % tools-mod SYSTEM '../../../../doc/generated/tools.mod'>
+%tools-mod;
+<!ENTITY % variables-mod SYSTEM '../../../../doc/generated/variables.mod'>
+%variables-mod;
+]>
+
+<sconsdoc xmlns="http://www.scons.org/dbxsd/v1.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://www.scons.org/dbxsd/v1.0 http://www.scons.org/dbxsd/v1.0/scons.xsd">
+
+<tool name="sunc++">
+<summary>
+<para>
+Sets construction variables for the Sun C++ compiler.
+</para>
+</summary>
+<sets>
+<item>CXX</item>
+<item>SHCXX</item>
+<item>CXXVERSION</item>
+<item>SHCXXFLAGS</item>
+<item>SHOBJPREFIX</item>
+<item>SHOBJSUFFIX</item>
+</sets>
+</tool>
+
+</sconsdoc>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/suncc.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/suncc.py
new file mode 100644
index 0000000..4651219
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/suncc.py
@@ -0,0 +1,58 @@
+"""SCons.Tool.suncc
+
+Tool-specific initialization for Sun Solaris (Forte) CC and cc.
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import SCons.Util
+
+from . import cc
+
+def generate(env):
+ """
+ Add Builders and construction variables for Forte C and C++ compilers
+ to an Environment.
+ """
+ cc.generate(env)
+
+ env['CXX'] = 'CC'
+ env['SHCCFLAGS'] = SCons.Util.CLVar('$CCFLAGS -KPIC')
+ env['SHOBJPREFIX'] = 'so_'
+ env['SHOBJSUFFIX'] = '.o'
+
+def exists(env):
+ return env.Detect('CC')
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/suncc.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/suncc.xml
new file mode 100644
index 0000000..f64adc4
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/suncc.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+__COPYRIGHT__
+
+This file is processed by the bin/SConsDoc.py module.
+See its __doc__ string for a discussion of the format.
+-->
+
+<!DOCTYPE sconsdoc [
+<!ENTITY % scons SYSTEM '../../../../doc/scons.mod'>
+%scons;
+<!ENTITY % builders-mod SYSTEM '../../../../doc/generated/builders.mod'>
+%builders-mod;
+<!ENTITY % functions-mod SYSTEM '../../../../doc/generated/functions.mod'>
+%functions-mod;
+<!ENTITY % tools-mod SYSTEM '../../../../doc/generated/tools.mod'>
+%tools-mod;
+<!ENTITY % variables-mod SYSTEM '../../../../doc/generated/variables.mod'>
+%variables-mod;
+]>
+
+<sconsdoc xmlns="http://www.scons.org/dbxsd/v1.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://www.scons.org/dbxsd/v1.0 http://www.scons.org/dbxsd/v1.0/scons.xsd">
+
+<tool name="suncc">
+<summary>
+<para>
+Sets construction variables for the Sun C compiler.
+</para>
+</summary>
+<sets>
+<item>CXX</item>
+<item>SHCCFLAGS</item>
+<item>SHOBJPREFIX</item>
+<item>SHOBJSUFFIX</item>
+</sets>
+</tool>
+
+</sconsdoc>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/suncxx.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/suncxx.py
new file mode 100644
index 0000000..29226ea
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/suncxx.py
@@ -0,0 +1,144 @@
+"""SCons.Tool.sunc++
+
+Tool-specific initialization for C++ on SunOS / Solaris.
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import SCons
+
+import os
+import re
+import subprocess
+
+import SCons.Tool.cxx
+cplusplus = SCons.Tool.cxx
+#cplusplus = __import__('c++', globals(), locals(), [])
+
+package_info = {}
+
+def get_package_info(package_name, pkginfo, pkgchk):
+ try:
+ return package_info[package_name]
+ except KeyError:
+ version = None
+ pathname = None
+ try:
+ sadm_contents = open('/var/sadm/install/contents', 'r').read()
+ except EnvironmentError:
+ pass
+ else:
+ sadm_re = re.compile('^(\S*/bin/CC)(=\S*)? %s$' % package_name, re.M)
+ sadm_match = sadm_re.search(sadm_contents)
+ if sadm_match:
+ pathname = os.path.dirname(sadm_match.group(1))
+
+ try:
+ p = subprocess.Popen([pkginfo, '-l', package_name],
+ stdout=subprocess.PIPE,
+ stderr=open('/dev/null', 'w'))
+ except EnvironmentError:
+ pass
+ else:
+ pkginfo_contents = p.communicate()[0]
+ version_re = re.compile('^ *VERSION:\s*(.*)$', re.M)
+ version_match = version_re.search(pkginfo_contents)
+ if version_match:
+ version = version_match.group(1)
+
+ if pathname is None:
+ try:
+ p = subprocess.Popen([pkgchk, '-l', package_name],
+ stdout=subprocess.PIPE,
+ stderr=open('/dev/null', 'w'))
+ except EnvironmentError:
+ pass
+ else:
+ pkgchk_contents = p.communicate()[0]
+ pathname_re = re.compile(r'^Pathname:\s*(.*/bin/CC)$', re.M)
+ pathname_match = pathname_re.search(pkgchk_contents)
+ if pathname_match:
+ pathname = os.path.dirname(pathname_match.group(1))
+
+ package_info[package_name] = (pathname, version)
+ return package_info[package_name]
+
+# use the package installer tool lslpp to figure out where cppc and what
+# version of it is installed
+def get_cppc(env):
+ cxx = env.subst('$CXX')
+ if cxx:
+ cppcPath = os.path.dirname(cxx)
+ else:
+ cppcPath = None
+
+ cppcVersion = None
+
+ pkginfo = env.subst('$PKGINFO')
+ pkgchk = env.subst('$PKGCHK')
+
+ for package in ['SPROcpl']:
+ path, version = get_package_info(package, pkginfo, pkgchk)
+ if path and version:
+ cppcPath, cppcVersion = path, version
+ break
+
+ return (cppcPath, 'CC', 'CC', cppcVersion)
+
+def generate(env):
+ """Add Builders and construction variables for SunPRO C++."""
+ path, cxx, shcxx, version = get_cppc(env)
+ if path:
+ cxx = os.path.join(path, cxx)
+ shcxx = os.path.join(path, shcxx)
+
+ cplusplus.generate(env)
+
+ env['CXX'] = cxx
+ env['SHCXX'] = shcxx
+ env['CXXVERSION'] = version
+ env['SHCXXFLAGS'] = SCons.Util.CLVar('$CXXFLAGS -KPIC')
+ env['SHOBJPREFIX'] = 'so_'
+ env['SHOBJSUFFIX'] = '.o'
+
+def exists(env):
+ path, cxx, shcxx, version = get_cppc(env)
+ if path and cxx:
+ cppc = os.path.join(path, cxx)
+ if os.path.exists(cppc):
+ return cppc
+ return None
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/sunf77.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/sunf77.py
new file mode 100644
index 0000000..20d1893
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/sunf77.py
@@ -0,0 +1,63 @@
+"""SCons.Tool.sunf77
+
+Tool-specific initialization for sunf77, the Sun Studio F77 compiler.
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import SCons.Util
+
+from .FortranCommon import add_all_to_env
+
+compilers = ['sunf77', 'f77']
+
+def generate(env):
+ """Add Builders and construction variables for sunf77 to an Environment."""
+ add_all_to_env(env)
+
+ fcomp = env.Detect(compilers) or 'f77'
+ env['FORTRAN'] = fcomp
+ env['F77'] = fcomp
+
+ env['SHFORTRAN'] = '$FORTRAN'
+ env['SHF77'] = '$F77'
+
+ env['SHFORTRANFLAGS'] = SCons.Util.CLVar('$FORTRANFLAGS -KPIC')
+ env['SHF77FLAGS'] = SCons.Util.CLVar('$F77FLAGS -KPIC')
+
+def exists(env):
+ return env.Detect(compilers)
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/sunf77.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/sunf77.xml
new file mode 100644
index 0000000..ebbddfc
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/sunf77.xml
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+__COPYRIGHT__
+
+This file is processed by the bin/SConsDoc.py module.
+See its __doc__ string for a discussion of the format.
+-->
+
+<!DOCTYPE sconsdoc [
+<!ENTITY % scons SYSTEM '../../../../doc/scons.mod'>
+%scons;
+<!ENTITY % builders-mod SYSTEM '../../../../doc/generated/builders.mod'>
+%builders-mod;
+<!ENTITY % functions-mod SYSTEM '../../../../doc/generated/functions.mod'>
+%functions-mod;
+<!ENTITY % tools-mod SYSTEM '../../../../doc/generated/tools.mod'>
+%tools-mod;
+<!ENTITY % variables-mod SYSTEM '../../../../doc/generated/variables.mod'>
+%variables-mod;
+]>
+
+<sconsdoc xmlns="http://www.scons.org/dbxsd/v1.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://www.scons.org/dbxsd/v1.0 http://www.scons.org/dbxsd/v1.0/scons.xsd">
+
+<tool name="sunf77">
+<summary>
+<para>
+Set construction variables for the Sun &f77; Fortran compiler.
+</para>
+</summary>
+<sets>
+<item>FORTRAN</item>
+<item>F77</item>
+<item>SHFORTRAN</item>
+<item>SHF77</item>
+<item>SHFORTRANFLAGS</item>
+<item>SHF77FLAGS</item>
+</sets>
+</tool>
+
+</sconsdoc>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/sunf90.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/sunf90.py
new file mode 100644
index 0000000..ce1697c
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/sunf90.py
@@ -0,0 +1,64 @@
+"""SCons.Tool.sunf90
+
+Tool-specific initialization for sunf90, the Sun Studio F90 compiler.
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import SCons.Util
+
+from .FortranCommon import add_all_to_env
+
+compilers = ['sunf90', 'f90']
+
+def generate(env):
+ """Add Builders and construction variables for sun f90 compiler to an
+ Environment."""
+ add_all_to_env(env)
+
+ fcomp = env.Detect(compilers) or 'f90'
+ env['FORTRAN'] = fcomp
+ env['F90'] = fcomp
+
+ env['SHFORTRAN'] = '$FORTRAN'
+ env['SHF90'] = '$F90'
+
+ env['SHFORTRANFLAGS'] = SCons.Util.CLVar('$FORTRANFLAGS -KPIC')
+ env['SHF90FLAGS'] = SCons.Util.CLVar('$F90FLAGS -KPIC')
+
+def exists(env):
+ return env.Detect(compilers)
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/sunf90.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/sunf90.xml
new file mode 100644
index 0000000..82a220b
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/sunf90.xml
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+__COPYRIGHT__
+
+This file is processed by the bin/SConsDoc.py module.
+See its __doc__ string for a discussion of the format.
+-->
+
+<!DOCTYPE sconsdoc [
+<!ENTITY % scons SYSTEM '../../../../doc/scons.mod'>
+%scons;
+<!ENTITY % builders-mod SYSTEM '../../../../doc/generated/builders.mod'>
+%builders-mod;
+<!ENTITY % functions-mod SYSTEM '../../../../doc/generated/functions.mod'>
+%functions-mod;
+<!ENTITY % tools-mod SYSTEM '../../../../doc/generated/tools.mod'>
+%tools-mod;
+<!ENTITY % variables-mod SYSTEM '../../../../doc/generated/variables.mod'>
+%variables-mod;
+]>
+
+<sconsdoc xmlns="http://www.scons.org/dbxsd/v1.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://www.scons.org/dbxsd/v1.0 http://www.scons.org/dbxsd/v1.0/scons.xsd">
+
+<tool name="sunf90">
+<summary>
+<para>
+Set construction variables for the Sun &f90; Fortran compiler.
+</para>
+</summary>
+<sets>
+<item>FORTRAN</item>
+<item>F90</item>
+<item>SHFORTRAN</item>
+<item>SHF90</item>
+<item>SHFORTRANFLAGS</item>
+<item>SHF90FLAGS</item>
+</sets>
+</tool>
+
+</sconsdoc>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/sunf95.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/sunf95.py
new file mode 100644
index 0000000..218569c
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/sunf95.py
@@ -0,0 +1,64 @@
+"""SCons.Tool.sunf95
+
+Tool-specific initialization for sunf95, the Sun Studio F95 compiler.
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import SCons.Util
+
+from .FortranCommon import add_all_to_env
+
+compilers = ['sunf95', 'f95']
+
+def generate(env):
+ """Add Builders and construction variables for sunf95 to an
+ Environment."""
+ add_all_to_env(env)
+
+ fcomp = env.Detect(compilers) or 'f95'
+ env['FORTRAN'] = fcomp
+ env['F95'] = fcomp
+
+ env['SHFORTRAN'] = '$FORTRAN'
+ env['SHF95'] = '$F95'
+
+ env['SHFORTRANFLAGS'] = SCons.Util.CLVar('$FORTRANFLAGS -KPIC')
+ env['SHF95FLAGS'] = SCons.Util.CLVar('$F95FLAGS -KPIC')
+
+def exists(env):
+ return env.Detect(compilers)
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/sunf95.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/sunf95.xml
new file mode 100644
index 0000000..2e9a191
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/sunf95.xml
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+__COPYRIGHT__
+
+This file is processed by the bin/SConsDoc.py module.
+See its __doc__ string for a discussion of the format.
+-->
+
+<!DOCTYPE sconsdoc [
+<!ENTITY % scons SYSTEM '../../../../doc/scons.mod'>
+%scons;
+<!ENTITY % builders-mod SYSTEM '../../../../doc/generated/builders.mod'>
+%builders-mod;
+<!ENTITY % functions-mod SYSTEM '../../../../doc/generated/functions.mod'>
+%functions-mod;
+<!ENTITY % tools-mod SYSTEM '../../../../doc/generated/tools.mod'>
+%tools-mod;
+<!ENTITY % variables-mod SYSTEM '../../../../doc/generated/variables.mod'>
+%variables-mod;
+]>
+
+<sconsdoc xmlns="http://www.scons.org/dbxsd/v1.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://www.scons.org/dbxsd/v1.0 http://www.scons.org/dbxsd/v1.0/scons.xsd">
+
+<tool name="sunf95">
+<summary>
+<para>
+Set construction variables for the Sun &f95; Fortran compiler.
+</para>
+</summary>
+<sets>
+<item>FORTRAN</item>
+<item>F95</item>
+<item>SHFORTRAN</item>
+<item>SHF95</item>
+<item>SHFORTRANFLAGS</item>
+<item>SHF95FLAGS</item>
+</sets>
+</tool>
+
+</sconsdoc>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/sunlink.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/sunlink.py
new file mode 100644
index 0000000..39d9ec2
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/sunlink.py
@@ -0,0 +1,80 @@
+"""SCons.Tool.sunlink
+
+Tool-specific initialization for the Sun Solaris (Forte) linker.
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import os
+import os.path
+
+import SCons.Util
+
+from . import link
+
+ccLinker = None
+
+# search for the acc compiler and linker front end
+
+try:
+ dirs = os.listdir('/opt')
+except (IOError, OSError):
+ # Not being able to read the directory because it doesn't exist
+ # (IOError) or isn't readable (OSError) is okay.
+ dirs = []
+
+for d in dirs:
+ linker = '/opt/' + d + '/bin/CC'
+ if os.path.exists(linker):
+ ccLinker = linker
+ break
+
+def generate(env):
+ """Add Builders and construction variables for Forte to an Environment."""
+ link.generate(env)
+
+ env['SHLINKFLAGS'] = SCons.Util.CLVar('$LINKFLAGS -G')
+
+ env['RPATHPREFIX'] = '-R'
+ env['RPATHSUFFIX'] = ''
+ env['_RPATH'] = '${_concat(RPATHPREFIX, RPATH, RPATHSUFFIX, __env__)}'
+
+ # Support for versioned libraries
+ link._setup_versioned_lib_variables(env, tool = 'sunlink', use_soname = True)
+ env['LINKCALLBACKS'] = link._versioned_lib_callbacks()
+
+def exists(env):
+ return ccLinker
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/sunlink.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/sunlink.xml
new file mode 100644
index 0000000..7e92acc
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/sunlink.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+__COPYRIGHT__
+
+This file is processed by the bin/SConsDoc.py module.
+See its __doc__ string for a discussion of the format.
+-->
+
+<!DOCTYPE sconsdoc [
+<!ENTITY % scons SYSTEM '../../../../doc/scons.mod'>
+%scons;
+<!ENTITY % builders-mod SYSTEM '../../../../doc/generated/builders.mod'>
+%builders-mod;
+<!ENTITY % functions-mod SYSTEM '../../../../doc/generated/functions.mod'>
+%functions-mod;
+<!ENTITY % tools-mod SYSTEM '../../../../doc/generated/tools.mod'>
+%tools-mod;
+<!ENTITY % variables-mod SYSTEM '../../../../doc/generated/variables.mod'>
+%variables-mod;
+]>
+
+<sconsdoc xmlns="http://www.scons.org/dbxsd/v1.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://www.scons.org/dbxsd/v1.0 http://www.scons.org/dbxsd/v1.0/scons.xsd">
+
+<tool name="sunlink">
+<summary>
+<para>
+Sets construction variables for the Sun linker.
+</para>
+</summary>
+<sets>
+<item>SHLINKFLAGS</item>
+<item>RPATHPREFIX</item>
+<item>RPATHSUFFIX</item>
+</sets>
+</tool>
+
+</sconsdoc>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/swig.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/swig.py
new file mode 100644
index 0000000..da4472f
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/swig.py
@@ -0,0 +1,194 @@
+"""SCons.Tool.swig
+
+Tool-specific initialization for swig.
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+
+"""
+from __future__ import print_function
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import os.path
+import re
+import subprocess
+
+import SCons.Action
+import SCons.Defaults
+import SCons.Tool
+import SCons.Util
+import SCons.Node
+
+verbose = False
+
+swigs = [ 'swig', 'swig3.0', 'swig2.0' ]
+
+SwigAction = SCons.Action.Action('$SWIGCOM', '$SWIGCOMSTR')
+
+def swigSuffixEmitter(env, source):
+ if '-c++' in SCons.Util.CLVar(env.subst("$SWIGFLAGS", source=source)):
+ return '$SWIGCXXFILESUFFIX'
+ else:
+ return '$SWIGCFILESUFFIX'
+
+# Match '%module test', as well as '%module(directors="1") test'
+# Also allow for test to be quoted (SWIG permits double quotes, but not single)
+# Also allow for the line to have spaces after test if not quoted
+_reModule = re.compile(r'%module(\s*\(.*\))?\s+("?)(\S+)\2')
+
+def _find_modules(src):
+ """Find all modules referenced by %module lines in `src`, a SWIG .i file.
+ Returns a list of all modules, and a flag set if SWIG directors have
+ been requested (SWIG will generate an additional header file in this
+ case.)"""
+ directors = 0
+ mnames = []
+ try:
+ matches = _reModule.findall(open(src).read())
+ except IOError:
+ # If the file's not yet generated, guess the module name from the file stem
+ matches = []
+ mnames.append(os.path.splitext(os.path.basename(src))[0])
+
+ for m in matches:
+ mnames.append(m[2])
+ directors = directors or m[0].find('directors') >= 0
+ return mnames, directors
+
+def _add_director_header_targets(target, env):
+ # Directors only work with C++ code, not C
+ suffix = env.subst(env['SWIGCXXFILESUFFIX'])
+ # For each file ending in SWIGCXXFILESUFFIX, add a new target director
+ # header by replacing the ending with SWIGDIRECTORSUFFIX.
+ for x in target[:]:
+ n = x.name
+ d = x.dir
+ if n[-len(suffix):] == suffix:
+ target.append(d.File(n[:-len(suffix)] + env['SWIGDIRECTORSUFFIX']))
+
+def _swigEmitter(target, source, env):
+ swigflags = env.subst("$SWIGFLAGS", target=target, source=source)
+ flags = SCons.Util.CLVar(swigflags)
+ for src in source:
+ src = str(src.rfile())
+ mnames = None
+ if "-python" in flags and "-noproxy" not in flags:
+ if mnames is None:
+ mnames, directors = _find_modules(src)
+ if directors:
+ _add_director_header_targets(target, env)
+ python_files = [m + ".py" for m in mnames]
+ outdir = env.subst('$SWIGOUTDIR', target=target, source=source)
+ # .py files should be generated in SWIGOUTDIR if specified,
+ # otherwise in the same directory as the target
+ if outdir:
+ python_files = [env.fs.File(os.path.join(outdir, j)) for j in python_files]
+ else:
+ python_files = [target[0].dir.File(m) for m in python_files]
+ target.extend(python_files)
+ if "-java" in flags:
+ if mnames is None:
+ mnames, directors = _find_modules(src)
+ if directors:
+ _add_director_header_targets(target, env)
+ java_files = [[m + ".java", m + "JNI.java"] for m in mnames]
+ java_files = SCons.Util.flatten(java_files)
+ outdir = env.subst('$SWIGOUTDIR', target=target, source=source)
+ if outdir:
+ java_files = [os.path.join(outdir, j) for j in java_files]
+ java_files = list(map(env.fs.File, java_files))
+ def t_from_s(t, p, s, x):
+ return t.dir
+ tsm = SCons.Node._target_from_source_map
+ tkey = len(tsm)
+ tsm[tkey] = t_from_s
+ for jf in java_files:
+ jf._func_target_from_source = tkey
+ target.extend(java_files)
+ return (target, source)
+
+def _get_swig_version(env, swig):
+ """Run the SWIG command line tool to get and return the version number"""
+ swig = env.subst(swig)
+ pipe = SCons.Action._subproc(env, SCons.Util.CLVar(swig) + ['-version'],
+ stdin = 'devnull',
+ stderr = 'devnull',
+ stdout = subprocess.PIPE)
+ if pipe.wait() != 0: return
+
+ # MAYBE: out = SCons.Util.to_str (pipe.stdout.read())
+ out = SCons.Util.to_str(pipe.stdout.read())
+ match = re.search('SWIG Version\s+(\S+).*', out, re.MULTILINE)
+ if match:
+ if verbose: print("Version is:%s"%match.group(1))
+ return match.group(1)
+ else:
+ if verbose: print("Unable to detect version: [%s]"%out)
+
+def generate(env):
+ """Add Builders and construction variables for swig to an Environment."""
+ c_file, cxx_file = SCons.Tool.createCFileBuilders(env)
+
+ c_file.suffix['.i'] = swigSuffixEmitter
+ cxx_file.suffix['.i'] = swigSuffixEmitter
+
+ c_file.add_action('.i', SwigAction)
+ c_file.add_emitter('.i', _swigEmitter)
+ cxx_file.add_action('.i', SwigAction)
+ cxx_file.add_emitter('.i', _swigEmitter)
+
+ java_file = SCons.Tool.CreateJavaFileBuilder(env)
+
+ java_file.suffix['.i'] = swigSuffixEmitter
+
+ java_file.add_action('.i', SwigAction)
+ java_file.add_emitter('.i', _swigEmitter)
+
+ if 'SWIG' not in env:
+ env['SWIG'] = env.Detect(swigs) or swigs[0]
+ env['SWIGVERSION'] = _get_swig_version(env, env['SWIG'])
+ env['SWIGFLAGS'] = SCons.Util.CLVar('')
+ env['SWIGDIRECTORSUFFIX'] = '_wrap.h'
+ env['SWIGCFILESUFFIX'] = '_wrap$CFILESUFFIX'
+ env['SWIGCXXFILESUFFIX'] = '_wrap$CXXFILESUFFIX'
+ env['_SWIGOUTDIR'] = r'${"-outdir \"%s\"" % SWIGOUTDIR}'
+ env['SWIGPATH'] = []
+ env['SWIGINCPREFIX'] = '-I'
+ env['SWIGINCSUFFIX'] = ''
+ env['_SWIGINCFLAGS'] = '$( ${_concat(SWIGINCPREFIX, SWIGPATH, SWIGINCSUFFIX, __env__, RDirs, TARGET, SOURCE)} $)'
+ env['SWIGCOM'] = '$SWIG -o $TARGET ${_SWIGOUTDIR} ${_SWIGINCFLAGS} $SWIGFLAGS $SOURCES'
+
+def exists(env):
+ swig = env.get('SWIG') or env.Detect(['swig'])
+ return swig
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/swig.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/swig.xml
new file mode 100644
index 0000000..1160804
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/swig.xml
@@ -0,0 +1,265 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+__COPYRIGHT__
+
+This file is processed by the bin/SConsDoc.py module.
+See its __doc__ string for a discussion of the format.
+-->
+
+<!DOCTYPE sconsdoc [
+<!ENTITY % scons SYSTEM '../../../../doc/scons.mod'>
+%scons;
+<!ENTITY % builders-mod SYSTEM '../../../../doc/generated/builders.mod'>
+%builders-mod;
+<!ENTITY % functions-mod SYSTEM '../../../../doc/generated/functions.mod'>
+%functions-mod;
+<!ENTITY % tools-mod SYSTEM '../../../../doc/generated/tools.mod'>
+%tools-mod;
+<!ENTITY % variables-mod SYSTEM '../../../../doc/generated/variables.mod'>
+%variables-mod;
+]>
+
+<sconsdoc xmlns="http://www.scons.org/dbxsd/v1.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://www.scons.org/dbxsd/v1.0 http://www.scons.org/dbxsd/v1.0/scons.xsd">
+
+<tool name="swig">
+<summary>
+<para>
+Sets construction variables for the SWIG interface generator.
+</para>
+</summary>
+<sets>
+<item>SWIG</item>
+<item>SWIGFLAGS</item>
+<item>SWIGDIRECTORSUFFIX</item>
+<item>SWIGCFILESUFFIX</item>
+<item>SWIGCXXFILESUFFIX</item>
+<item>_SWIGINCFLAGS</item>
+<item>SWIGINCPREFIX</item>
+<item>SWIGINCSUFFIX</item>
+<item>SWIGCOM</item>
+<item>SWIGPATH</item>
+<item>SWIGVERSION</item>
+</sets>
+<uses>
+<item>SWIGCOMSTR</item>
+</uses>
+</tool>
+
+<cvar name="SWIG">
+<summary>
+<para>
+The scripting language wrapper and interface generator.
+</para>
+</summary>
+</cvar>
+
+<cvar name="SWIGCFILESUFFIX">
+<summary>
+<para>
+The suffix that will be used for intermediate C
+source files generated by
+the scripting language wrapper and interface generator.
+The default value is
+<filename>_wrap</filename>&cv-link-CFILESUFFIX;.
+By default, this value is used whenever the
+<option>-c++</option>
+option is
+<emphasis>not</emphasis>
+specified as part of the
+&cv-link-SWIGFLAGS;
+construction variable.
+</para>
+</summary>
+</cvar>
+
+<cvar name="SWIGDIRECTORSUFFIX">
+<summary>
+<para>
+The suffix that will be used for intermediate C++ header
+files generated by the scripting language wrapper and interface generator.
+These are only generated for C++ code when the SWIG 'directors' feature is
+turned on.
+The default value is
+<filename>_wrap.h</filename>.
+</para>
+</summary>
+</cvar>
+
+<cvar name="SWIGCOM">
+<summary>
+<para>
+The command line used to call
+the scripting language wrapper and interface generator.
+</para>
+</summary>
+</cvar>
+
+<cvar name="SWIGCOMSTR">
+<summary>
+<para>
+The string displayed when calling
+the scripting language wrapper and interface generator.
+If this is not set, then &cv-link-SWIGCOM; (the command line) is displayed.
+</para>
+</summary>
+</cvar>
+
+<cvar name="SWIGCXXFILESUFFIX">
+<summary>
+<para>
+The suffix that will be used for intermediate C++
+source files generated by
+the scripting language wrapper and interface generator.
+The default value is
+<filename>_wrap</filename>&cv-link-CFILESUFFIX;.
+By default, this value is used whenever the
+<filename>-c++</filename>
+option is specified as part of the
+&cv-link-SWIGFLAGS;
+construction variable.
+</para>
+</summary>
+</cvar>
+
+<cvar name="SWIGFLAGS">
+<summary>
+<para>
+General options passed to
+the scripting language wrapper and interface generator.
+This is where you should set
+<option>-python</option>,
+<option>-perl5</option>,
+<option>-tcl</option>,
+or whatever other options you want to specify to SWIG.
+If you set the
+<option>-c++</option>
+option in this variable,
+&scons;
+will, by default,
+generate a C++ intermediate source file
+with the extension that is specified as the
+&cv-link-CXXFILESUFFIX;
+variable.
+</para>
+</summary>
+</cvar>
+
+<cvar name="_SWIGINCFLAGS">
+<summary>
+<para>
+An automatically-generated construction variable
+containing the SWIG command-line options
+for specifying directories to be searched for included files.
+The value of &cv-_SWIGINCFLAGS; is created
+by appending &cv-SWIGINCPREFIX; and &cv-SWIGINCSUFFIX;
+to the beginning and end
+of each directory in &cv-SWIGPATH;.
+</para>
+</summary>
+</cvar>
+
+<cvar name="SWIGINCPREFIX">
+<summary>
+<para>
+The prefix used to specify an include directory on the SWIG command line.
+This will be appended to the beginning of each directory
+in the &cv-SWIGPATH; construction variable
+when the &cv-_SWIGINCFLAGS; variable is automatically generated.
+</para>
+</summary>
+</cvar>
+
+<cvar name="SWIGINCSUFFIX">
+<summary>
+<para>
+The suffix used to specify an include directory on the SWIG command line.
+This will be appended to the end of each directory
+in the &cv-SWIGPATH; construction variable
+when the &cv-_SWIGINCFLAGS; variable is automatically generated.
+</para>
+</summary>
+</cvar>
+
+<cvar name="SWIGOUTDIR">
+<summary>
+<para>
+Specifies the output directory in which
+the scripting language wrapper and interface generator
+should place generated language-specific files.
+This will be used by SCons to identify
+the files that will be generated by the &swig; call,
+and translated into the
+<literal>swig -outdir</literal> option on the command line.
+</para>
+</summary>
+</cvar>
+
+<cvar name="SWIGPATH">
+<summary>
+<para>
+The list of directories that the scripting language wrapper
+and interface generate will search for included files.
+The SWIG implicit dependency scanner will search these
+directories for include files. The default value is an empty list.
+</para>
+
+<para>
+Don't explicitly put include directory
+arguments in SWIGFLAGS;
+the result will be non-portable
+and the directories will not be searched by the dependency scanner.
+Note: directory names in SWIGPATH will be looked-up relative to the SConscript
+directory when they are used in a command.
+To force
+&scons;
+to look-up a directory relative to the root of the source tree use #:
+</para>
+
+<example_commands>
+env = Environment(SWIGPATH='#/include')
+</example_commands>
+
+<para>
+The directory look-up can also be forced using the
+&Dir;()
+function:
+</para>
+
+<example_commands>
+include = Dir('include')
+env = Environment(SWIGPATH=include)
+</example_commands>
+
+<para>
+The directory list will be added to command lines
+through the automatically-generated
+&cv-_SWIGINCFLAGS;
+construction variable,
+which is constructed by
+appending the values of the
+&cv-SWIGINCPREFIX; and &cv-SWIGINCSUFFIX;
+construction variables
+to the beginning and end
+of each directory in &cv-SWIGPATH;.
+Any command lines you define that need
+the SWIGPATH directory list should
+include &cv-_SWIGINCFLAGS;:
+</para>
+
+<example_commands>
+env = Environment(SWIGCOM="my_swig -o $TARGET $_SWIGINCFLAGS $SOURCES")
+</example_commands>
+</summary>
+</cvar>
+
+<cvar name="SWIGVERSION">
+<summary>
+<para>
+The version number of the SWIG tool.
+</para>
+</summary>
+</cvar>
+
+</sconsdoc>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/tar.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/tar.py
new file mode 100644
index 0000000..2593781
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/tar.py
@@ -0,0 +1,73 @@
+"""SCons.Tool.tar
+
+Tool-specific initialization for tar.
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import SCons.Action
+import SCons.Builder
+import SCons.Defaults
+import SCons.Node.FS
+import SCons.Util
+
+tars = ['tar', 'gtar']
+
+TarAction = SCons.Action.Action('$TARCOM', '$TARCOMSTR')
+
+TarBuilder = SCons.Builder.Builder(action = TarAction,
+ source_factory = SCons.Node.FS.Entry,
+ source_scanner = SCons.Defaults.DirScanner,
+ suffix = '$TARSUFFIX',
+ multi = 1)
+
+
+def generate(env):
+ """Add Builders and construction variables for tar to an Environment."""
+ try:
+ bld = env['BUILDERS']['Tar']
+ except KeyError:
+ bld = TarBuilder
+ env['BUILDERS']['Tar'] = bld
+
+ env['TAR'] = env.Detect(tars) or 'gtar'
+ env['TARFLAGS'] = SCons.Util.CLVar('-c')
+ env['TARCOM'] = '$TAR $TARFLAGS -f $TARGET $SOURCES'
+ env['TARSUFFIX'] = '.tar'
+
+def exists(env):
+ return env.Detect(tars)
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/tar.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/tar.xml
new file mode 100644
index 0000000..c65317a
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/tar.xml
@@ -0,0 +1,130 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+__COPYRIGHT__
+
+This file is processed by the bin/SConsDoc.py module.
+See its __doc__ string for a discussion of the format.
+-->
+
+<!DOCTYPE sconsdoc [
+<!ENTITY % scons SYSTEM '../../../../doc/scons.mod'>
+%scons;
+<!ENTITY % builders-mod SYSTEM '../../../../doc/generated/builders.mod'>
+%builders-mod;
+<!ENTITY % functions-mod SYSTEM '../../../../doc/generated/functions.mod'>
+%functions-mod;
+<!ENTITY % tools-mod SYSTEM '../../../../doc/generated/tools.mod'>
+%tools-mod;
+<!ENTITY % variables-mod SYSTEM '../../../../doc/generated/variables.mod'>
+%variables-mod;
+]>
+
+<sconsdoc xmlns="http://www.scons.org/dbxsd/v1.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://www.scons.org/dbxsd/v1.0 http://www.scons.org/dbxsd/v1.0/scons.xsd">
+
+<tool name="tar">
+<summary>
+<para>
+Sets construction variables for the &tar; archiver.
+</para>
+</summary>
+<sets>
+<item>TAR</item>
+<item>TARFLAGS</item>
+<item>TARCOM</item>
+<item>TARSUFFIX</item>
+</sets>
+<uses>
+<item>TARCOMSTR</item>
+</uses>
+</tool>
+
+<builder name="Tar">
+<summary>
+<para>
+Builds a tar archive of the specified files
+and/or directories.
+Unlike most builder methods,
+the
+&b-Tar;
+builder method may be called multiple times
+for a given target;
+each additional call
+adds to the list of entries
+that will be built into the archive.
+Any source directories will
+be scanned for changes to
+any on-disk files,
+regardless of whether or not
+&scons;
+knows about them from other Builder or function calls.
+</para>
+
+<example_commands>
+env.Tar('src.tar', 'src')
+
+# Create the stuff.tar file.
+env.Tar('stuff', ['subdir1', 'subdir2'])
+# Also add "another" to the stuff.tar file.
+env.Tar('stuff', 'another')
+
+# Set TARFLAGS to create a gzip-filtered archive.
+env = Environment(TARFLAGS = '-c -z')
+env.Tar('foo.tar.gz', 'foo')
+
+# Also set the suffix to .tgz.
+env = Environment(TARFLAGS = '-c -z',
+ TARSUFFIX = '.tgz')
+env.Tar('foo')
+</example_commands>
+</summary>
+</builder>
+
+<cvar name="TAR">
+<summary>
+<para>
+The tar archiver.
+</para>
+</summary>
+</cvar>
+
+<cvar name="TARCOM">
+<summary>
+<para>
+The command line used to call the tar archiver.
+</para>
+</summary>
+</cvar>
+
+<cvar name="TARCOMSTR">
+<summary>
+<para>
+The string displayed when archiving files
+using the tar archiver.
+If this is not set, then &cv-link-TARCOM; (the command line) is displayed.
+</para>
+
+<example_commands>
+env = Environment(TARCOMSTR = "Archiving $TARGET")
+</example_commands>
+</summary>
+</cvar>
+
+<cvar name="TARFLAGS">
+<summary>
+<para>
+General options passed to the tar archiver.
+</para>
+</summary>
+</cvar>
+
+<cvar name="TARSUFFIX">
+<summary>
+<para>
+The suffix used for tar file names.
+</para>
+</summary>
+</cvar>
+
+</sconsdoc>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/tex.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/tex.py
new file mode 100644
index 0000000..8e09d56
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/tex.py
@@ -0,0 +1,987 @@
+"""SCons.Tool.tex
+
+Tool-specific initialization for TeX.
+Generates .dvi files from .tex files
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+from __future__ import print_function
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import os.path
+import re
+import shutil
+import sys
+import platform
+import glob
+
+import SCons.Action
+import SCons.Node
+import SCons.Node.FS
+import SCons.Util
+import SCons.Scanner.LaTeX
+
+Verbose = False
+
+must_rerun_latex = True
+
+# these are files that just need to be checked for changes and then rerun latex
+check_suffixes = ['.toc', '.lof', '.lot', '.out', '.nav', '.snm']
+
+# these are files that require bibtex or makeindex to be run when they change
+all_suffixes = check_suffixes + ['.bbl', '.idx', '.nlo', '.glo', '.acn', '.bcf']
+
+#
+# regular expressions used to search for Latex features
+# or outputs that require rerunning latex
+#
+# search for all .aux files opened by latex (recorded in the .fls file)
+openout_aux_re = re.compile(r"OUTPUT *(.*\.aux)")
+
+# search for all .bcf files opened by latex (recorded in the .fls file)
+# for use by biber
+openout_bcf_re = re.compile(r"OUTPUT *(.*\.bcf)")
+
+#printindex_re = re.compile(r"^[^%]*\\printindex", re.MULTILINE)
+#printnomenclature_re = re.compile(r"^[^%]*\\printnomenclature", re.MULTILINE)
+#printglossary_re = re.compile(r"^[^%]*\\printglossary", re.MULTILINE)
+
+# search to find rerun warnings
+warning_rerun_str = '(^LaTeX Warning:.*Rerun)|(^Package \w+ Warning:.*Rerun)'
+warning_rerun_re = re.compile(warning_rerun_str, re.MULTILINE)
+
+# search to find citation rerun warnings
+rerun_citations_str = "^LaTeX Warning:.*\n.*Rerun to get citations correct"
+rerun_citations_re = re.compile(rerun_citations_str, re.MULTILINE)
+
+# search to find undefined references or citations warnings
+undefined_references_str = '(^LaTeX Warning:.*undefined references)|(^Package \w+ Warning:.*undefined citations)'
+undefined_references_re = re.compile(undefined_references_str, re.MULTILINE)
+
+# used by the emitter
+auxfile_re = re.compile(r".", re.MULTILINE)
+tableofcontents_re = re.compile(r"^[^%\n]*\\tableofcontents", re.MULTILINE)
+makeindex_re = re.compile(r"^[^%\n]*\\makeindex", re.MULTILINE)
+bibliography_re = re.compile(r"^[^%\n]*\\bibliography", re.MULTILINE)
+bibunit_re = re.compile(r"^[^%\n]*\\begin\{bibunit\}", re.MULTILINE)
+multibib_re = re.compile(r"^[^%\n]*\\newcites\{([^\}]*)\}", re.MULTILINE)
+addbibresource_re = re.compile(r"^[^%\n]*\\(addbibresource|addglobalbib|addsectionbib)", re.MULTILINE)
+listoffigures_re = re.compile(r"^[^%\n]*\\listoffigures", re.MULTILINE)
+listoftables_re = re.compile(r"^[^%\n]*\\listoftables", re.MULTILINE)
+hyperref_re = re.compile(r"^[^%\n]*\\usepackage.*\{hyperref\}", re.MULTILINE)
+makenomenclature_re = re.compile(r"^[^%\n]*\\makenomenclature", re.MULTILINE)
+makeglossary_re = re.compile(r"^[^%\n]*\\makeglossary", re.MULTILINE)
+makeglossaries_re = re.compile(r"^[^%\n]*\\makeglossaries", re.MULTILINE)
+makeacronyms_re = re.compile(r"^[^%\n]*\\makeglossaries", re.MULTILINE)
+beamer_re = re.compile(r"^[^%\n]*\\documentclass\{beamer\}", re.MULTILINE)
+regex = r'^[^%\n]*\\newglossary\s*\[([^\]]+)\]?\s*\{([^}]*)\}\s*\{([^}]*)\}\s*\{([^}]*)\}\s*\{([^}]*)\}'
+newglossary_re = re.compile(regex, re.MULTILINE)
+biblatex_re = re.compile(r"^[^%\n]*\\usepackage.*\{biblatex\}", re.MULTILINE)
+
+newglossary_suffix = []
+
+# search to find all files included by Latex
+include_re = re.compile(r'^[^%\n]*\\(?:include|input){([^}]*)}', re.MULTILINE)
+includeOnly_re = re.compile(r'^[^%\n]*\\(?:include){([^}]*)}', re.MULTILINE)
+
+# search to find all graphics files included by Latex
+includegraphics_re = re.compile(r'^[^%\n]*\\(?:includegraphics(?:\[[^\]]+\])?){([^}]*)}', re.MULTILINE)
+
+# search to find all files opened by Latex (recorded in .log file)
+openout_re = re.compile(r"OUTPUT *(.*)")
+
+# list of graphics file extensions for TeX and LaTeX
+TexGraphics = SCons.Scanner.LaTeX.TexGraphics
+LatexGraphics = SCons.Scanner.LaTeX.LatexGraphics
+
+# An Action sufficient to build any generic tex file.
+TeXAction = None
+
+# An action to build a latex file. This action might be needed more
+# than once if we are dealing with labels and bibtex.
+LaTeXAction = None
+
+# An action to run BibTeX on a file.
+BibTeXAction = None
+
+# An action to run Biber on a file.
+BiberAction = None
+
+# An action to run MakeIndex on a file.
+MakeIndexAction = None
+
+# An action to run MakeIndex (for nomencl) on a file.
+MakeNclAction = None
+
+# An action to run MakeIndex (for glossary) on a file.
+MakeGlossaryAction = None
+
+# An action to run MakeIndex (for acronyms) on a file.
+MakeAcronymsAction = None
+
+# An action to run MakeIndex (for newglossary commands) on a file.
+MakeNewGlossaryAction = None
+
+# Used as a return value of modify_env_var if the variable is not set.
+_null = SCons.Scanner.LaTeX._null
+
+modify_env_var = SCons.Scanner.LaTeX.modify_env_var
+
+def check_file_error_message(utility, filename='log'):
+ msg = '%s returned an error, check the %s file\n' % (utility, filename)
+ sys.stdout.write(msg)
+
+def FindFile(name,suffixes,paths,env,requireExt=False):
+ if requireExt:
+ name,ext = SCons.Util.splitext(name)
+ # if the user gave an extension use it.
+ if ext:
+ name = name + ext
+ if Verbose:
+ print(" searching for '%s' with extensions: " % name,suffixes)
+
+ for path in paths:
+ testName = os.path.join(path,name)
+ if Verbose:
+ print(" look for '%s'" % testName)
+ if os.path.isfile(testName):
+ if Verbose:
+ print(" found '%s'" % testName)
+ return env.fs.File(testName)
+ else:
+ name_ext = SCons.Util.splitext(testName)[1]
+ if name_ext:
+ continue
+
+ # if no suffix try adding those passed in
+ for suffix in suffixes:
+ testNameExt = testName + suffix
+ if Verbose:
+ print(" look for '%s'" % testNameExt)
+
+ if os.path.isfile(testNameExt):
+ if Verbose:
+ print(" found '%s'" % testNameExt)
+ return env.fs.File(testNameExt)
+ if Verbose:
+ print(" did not find '%s'" % name)
+ return None
+
+def InternalLaTeXAuxAction(XXXLaTeXAction, target = None, source= None, env=None):
+ """A builder for LaTeX files that checks the output in the aux file
+ and decides how many times to use LaTeXAction, and BibTeXAction."""
+
+ global must_rerun_latex
+
+ # This routine is called with two actions. In this file for DVI builds
+ # with LaTeXAction and from the pdflatex.py with PDFLaTeXAction
+ # set this up now for the case where the user requests a different extension
+ # for the target filename
+ if (XXXLaTeXAction == LaTeXAction):
+ callerSuffix = ".dvi"
+ else:
+ callerSuffix = env['PDFSUFFIX']
+
+ basename = SCons.Util.splitext(str(source[0]))[0]
+ basedir = os.path.split(str(source[0]))[0]
+ basefile = os.path.split(str(basename))[1]
+ abspath = os.path.abspath(basedir)
+
+ targetext = os.path.splitext(str(target[0]))[1]
+ targetdir = os.path.split(str(target[0]))[0]
+
+ saved_env = {}
+ for var in SCons.Scanner.LaTeX.LaTeX.env_variables:
+ saved_env[var] = modify_env_var(env, var, abspath)
+
+ # Create base file names with the target directory since the auxiliary files
+ # will be made there. That's because the *COM variables have the cd
+ # command in the prolog. We check
+ # for the existence of files before opening them--even ones like the
+ # aux file that TeX always creates--to make it possible to write tests
+ # with stubs that don't necessarily generate all of the same files.
+
+ targetbase = os.path.join(targetdir, basefile)
+
+ # if there is a \makeindex there will be a .idx and thus
+ # we have to run makeindex at least once to keep the build
+ # happy even if there is no index.
+ # Same for glossaries, nomenclature, and acronyms
+ src_content = source[0].get_text_contents()
+ run_makeindex = makeindex_re.search(src_content) and not os.path.isfile(targetbase + '.idx')
+ run_nomenclature = makenomenclature_re.search(src_content) and not os.path.isfile(targetbase + '.nlo')
+ run_glossary = makeglossary_re.search(src_content) and not os.path.isfile(targetbase + '.glo')
+ run_glossaries = makeglossaries_re.search(src_content) and not os.path.isfile(targetbase + '.glo')
+ run_acronyms = makeacronyms_re.search(src_content) and not os.path.isfile(targetbase + '.acn')
+
+ saved_hashes = {}
+ suffix_nodes = {}
+
+
+ for suffix in all_suffixes+sum(newglossary_suffix, []):
+ theNode = env.fs.File(targetbase + suffix)
+ suffix_nodes[suffix] = theNode
+ saved_hashes[suffix] = theNode.get_csig()
+
+ if Verbose:
+ print("hashes: ",saved_hashes)
+
+ must_rerun_latex = True
+
+ # .aux files already processed by BibTex
+ already_bibtexed = []
+
+ #
+ # routine to update MD5 hash and compare
+ #
+ def check_MD5(filenode, suffix):
+ global must_rerun_latex
+ # two calls to clear old csig
+ filenode.clear_memoized_values()
+ filenode.ninfo = filenode.new_ninfo()
+ new_md5 = filenode.get_csig()
+
+ if saved_hashes[suffix] == new_md5:
+ if Verbose:
+ print("file %s not changed" % (targetbase+suffix))
+ return False # unchanged
+ saved_hashes[suffix] = new_md5
+ must_rerun_latex = True
+ if Verbose:
+ print("file %s changed, rerunning Latex, new hash = " % (targetbase+suffix), new_md5)
+ return True # changed
+
+ # generate the file name that latex will generate
+ resultfilename = targetbase + callerSuffix
+
+ count = 0
+
+ while (must_rerun_latex and count < int(env.subst('$LATEXRETRIES'))) :
+ result = XXXLaTeXAction(target, source, env)
+ if result != 0:
+ return result
+
+ count = count + 1
+
+ must_rerun_latex = False
+ # Decide if various things need to be run, or run again.
+
+ # Read the log file to find warnings/errors
+ logfilename = targetbase + '.log'
+ logContent = ''
+ if os.path.isfile(logfilename):
+ logContent = open(logfilename, "r").read()
+
+
+ # Read the fls file to find all .aux files
+ flsfilename = targetbase + '.fls'
+ flsContent = ''
+ auxfiles = []
+ if os.path.isfile(flsfilename):
+ flsContent = open(flsfilename, "r").read()
+ auxfiles = openout_aux_re.findall(flsContent)
+ # remove duplicates
+ dups = {}
+ for x in auxfiles:
+ dups[x] = 1
+ auxfiles = list(dups.keys())
+
+ bcffiles = []
+ if os.path.isfile(flsfilename):
+ flsContent = open(flsfilename, "r").read()
+ bcffiles = openout_bcf_re.findall(flsContent)
+ # remove duplicates
+ dups = {}
+ for x in bcffiles:
+ dups[x] = 1
+ bcffiles = list(dups.keys())
+
+ if Verbose:
+ print("auxfiles ",auxfiles)
+ print("bcffiles ",bcffiles)
+
+ # Now decide if bibtex will need to be run.
+ # The information that bibtex reads from the .aux file is
+ # pass-independent. If we find (below) that the .bbl file is unchanged,
+ # then the last latex saw a correct bibliography.
+ # Therefore only do this once
+ # Go through all .aux files and remember the files already done.
+ for auxfilename in auxfiles:
+ if auxfilename not in already_bibtexed:
+ already_bibtexed.append(auxfilename)
+ target_aux = os.path.join(targetdir, auxfilename)
+ if os.path.isfile(target_aux):
+ content = open(target_aux, "r").read()
+ if content.find("bibdata") != -1:
+ if Verbose:
+ print("Need to run bibtex on ",auxfilename)
+ bibfile = env.fs.File(SCons.Util.splitext(target_aux)[0])
+ result = BibTeXAction(bibfile, bibfile, env)
+ if result != 0:
+ check_file_error_message(env['BIBTEX'], 'blg')
+ must_rerun_latex = True
+
+ # Now decide if biber will need to be run.
+ # When the backend for biblatex is biber (by choice or default) the
+ # citation information is put in the .bcf file.
+ # The information that biber reads from the .bcf file is
+ # pass-independent. If we find (below) that the .bbl file is unchanged,
+ # then the last latex saw a correct bibliography.
+ # Therefore only do this once
+ # Go through all .bcf files and remember the files already done.
+ for bcffilename in bcffiles:
+ if bcffilename not in already_bibtexed:
+ already_bibtexed.append(bcffilename)
+ target_bcf = os.path.join(targetdir, bcffilename)
+ if os.path.isfile(target_bcf):
+ content = open(target_bcf, "r").read()
+ if content.find("bibdata") != -1:
+ if Verbose:
+ print("Need to run biber on ",bcffilename)
+ bibfile = env.fs.File(SCons.Util.splitext(target_bcf)[0])
+ result = BiberAction(bibfile, bibfile, env)
+ if result != 0:
+ check_file_error_message(env['BIBER'], 'blg')
+ must_rerun_latex = True
+
+ # Now decide if latex will need to be run again due to index.
+ if check_MD5(suffix_nodes['.idx'],'.idx') or (count == 1 and run_makeindex):
+ # We must run makeindex
+ if Verbose:
+ print("Need to run makeindex")
+ idxfile = suffix_nodes['.idx']
+ result = MakeIndexAction(idxfile, idxfile, env)
+ if result != 0:
+ check_file_error_message(env['MAKEINDEX'], 'ilg')
+ return result
+
+ # TO-DO: need to add a way for the user to extend this list for whatever
+ # auxiliary files they create in other (or their own) packages
+ # Harder is case is where an action needs to be called -- that should be rare (I hope?)
+
+ for index in check_suffixes:
+ check_MD5(suffix_nodes[index],index)
+
+ # Now decide if latex will need to be run again due to nomenclature.
+ if check_MD5(suffix_nodes['.nlo'],'.nlo') or (count == 1 and run_nomenclature):
+ # We must run makeindex
+ if Verbose:
+ print("Need to run makeindex for nomenclature")
+ nclfile = suffix_nodes['.nlo']
+ result = MakeNclAction(nclfile, nclfile, env)
+ if result != 0:
+ check_file_error_message('%s (nomenclature)' % env['MAKENCL'],
+ 'nlg')
+ #return result
+
+ # Now decide if latex will need to be run again due to glossary.
+ if check_MD5(suffix_nodes['.glo'],'.glo') or (count == 1 and run_glossaries) or (count == 1 and run_glossary):
+ # We must run makeindex
+ if Verbose:
+ print("Need to run makeindex for glossary")
+ glofile = suffix_nodes['.glo']
+ result = MakeGlossaryAction(glofile, glofile, env)
+ if result != 0:
+ check_file_error_message('%s (glossary)' % env['MAKEGLOSSARY'],
+ 'glg')
+ #return result
+
+ # Now decide if latex will need to be run again due to acronyms.
+ if check_MD5(suffix_nodes['.acn'],'.acn') or (count == 1 and run_acronyms):
+ # We must run makeindex
+ if Verbose:
+ print("Need to run makeindex for acronyms")
+ acrfile = suffix_nodes['.acn']
+ result = MakeAcronymsAction(acrfile, acrfile, env)
+ if result != 0:
+ check_file_error_message('%s (acronyms)' % env['MAKEACRONYMS'],
+ 'alg')
+ return result
+
+ # Now decide if latex will need to be run again due to newglossary command.
+ for ig in range(len(newglossary_suffix)):
+ if check_MD5(suffix_nodes[newglossary_suffix[ig][2]],newglossary_suffix[ig][2]) or (count == 1):
+ # We must run makeindex
+ if Verbose:
+ print("Need to run makeindex for newglossary")
+ newglfile = suffix_nodes[newglossary_suffix[ig][2]]
+ MakeNewGlossaryAction = SCons.Action.Action("$MAKENEWGLOSSARYCOM ${SOURCE.filebase}%s -s ${SOURCE.filebase}.ist -t ${SOURCE.filebase}%s -o ${SOURCE.filebase}%s" % (newglossary_suffix[ig][2],newglossary_suffix[ig][0],newglossary_suffix[ig][1]), "$MAKENEWGLOSSARYCOMSTR")
+
+ result = MakeNewGlossaryAction(newglfile, newglfile, env)
+ if result != 0:
+ check_file_error_message('%s (newglossary)' % env['MAKENEWGLOSSARY'],
+ newglossary_suffix[ig][0])
+ return result
+
+ # Now decide if latex needs to be run yet again to resolve warnings.
+ if warning_rerun_re.search(logContent):
+ must_rerun_latex = True
+ if Verbose:
+ print("rerun Latex due to latex or package rerun warning")
+
+ if rerun_citations_re.search(logContent):
+ must_rerun_latex = True
+ if Verbose:
+ print("rerun Latex due to 'Rerun to get citations correct' warning")
+
+ if undefined_references_re.search(logContent):
+ must_rerun_latex = True
+ if Verbose:
+ print("rerun Latex due to undefined references or citations")
+
+ if (count >= int(env.subst('$LATEXRETRIES')) and must_rerun_latex):
+ print("reached max number of retries on Latex ,",int(env.subst('$LATEXRETRIES')))
+# end of while loop
+
+ # rename Latex's output to what the target name is
+ if not (str(target[0]) == resultfilename and os.path.isfile(resultfilename)):
+ if os.path.isfile(resultfilename):
+ print("move %s to %s" % (resultfilename, str(target[0]), ))
+ shutil.move(resultfilename,str(target[0]))
+
+ # Original comment (when TEXPICTS was not restored):
+ # The TEXPICTS enviroment variable is needed by a dvi -> pdf step
+ # later on Mac OSX so leave it
+ #
+ # It is also used when searching for pictures (implicit dependencies).
+ # Why not set the variable again in the respective builder instead
+ # of leaving local modifications in the environment? What if multiple
+ # latex builds in different directories need different TEXPICTS?
+ for var in SCons.Scanner.LaTeX.LaTeX.env_variables:
+ if var == 'TEXPICTS':
+ continue
+ if saved_env[var] is _null:
+ try:
+ del env['ENV'][var]
+ except KeyError:
+ pass # was never set
+ else:
+ env['ENV'][var] = saved_env[var]
+
+ return result
+
+def LaTeXAuxAction(target = None, source= None, env=None):
+ result = InternalLaTeXAuxAction( LaTeXAction, target, source, env )
+ return result
+
+LaTeX_re = re.compile("\\\\document(style|class)")
+
+def is_LaTeX(flist,env,abspath):
+ """Scan a file list to decide if it's TeX- or LaTeX-flavored."""
+
+ # We need to scan files that are included in case the
+ # \documentclass command is in them.
+
+ # get path list from both env['TEXINPUTS'] and env['ENV']['TEXINPUTS']
+ savedpath = modify_env_var(env, 'TEXINPUTS', abspath)
+ paths = env['ENV']['TEXINPUTS']
+ if SCons.Util.is_List(paths):
+ pass
+ else:
+ # Split at os.pathsep to convert into absolute path
+ paths = paths.split(os.pathsep)
+
+ # now that we have the path list restore the env
+ if savedpath is _null:
+ try:
+ del env['ENV']['TEXINPUTS']
+ except KeyError:
+ pass # was never set
+ else:
+ env['ENV']['TEXINPUTS'] = savedpath
+ if Verbose:
+ print("is_LaTeX search path ",paths)
+ print("files to search :",flist)
+
+ # Now that we have the search path and file list, check each one
+ for f in flist:
+ if Verbose:
+ print(" checking for Latex source ",str(f))
+
+ content = f.get_text_contents()
+ if LaTeX_re.search(content):
+ if Verbose:
+ print("file %s is a LaTeX file" % str(f))
+ return 1
+ if Verbose:
+ print("file %s is not a LaTeX file" % str(f))
+
+ # now find included files
+ inc_files = [ ]
+ inc_files.extend( include_re.findall(content) )
+ if Verbose:
+ print("files included by '%s': "%str(f),inc_files)
+ # inc_files is list of file names as given. need to find them
+ # using TEXINPUTS paths.
+
+ # search the included files
+ for src in inc_files:
+ srcNode = FindFile(src,['.tex','.ltx','.latex'],paths,env,requireExt=False)
+ # make this a list since is_LaTeX takes a list.
+ fileList = [srcNode,]
+ if Verbose:
+ print("FindFile found ",srcNode)
+ if srcNode is not None:
+ file_test = is_LaTeX(fileList, env, abspath)
+
+ # return on first file that finds latex is needed.
+ if file_test:
+ return file_test
+
+ if Verbose:
+ print(" done scanning ",str(f))
+
+ return 0
+
+def TeXLaTeXFunction(target = None, source= None, env=None):
+ """A builder for TeX and LaTeX that scans the source file to
+ decide the "flavor" of the source and then executes the appropriate
+ program."""
+
+ # find these paths for use in is_LaTeX to search for included files
+ basedir = os.path.split(str(source[0]))[0]
+ abspath = os.path.abspath(basedir)
+
+ if is_LaTeX(source,env,abspath):
+ result = LaTeXAuxAction(target,source,env)
+ if result != 0:
+ check_file_error_message(env['LATEX'])
+ else:
+ result = TeXAction(target,source,env)
+ if result != 0:
+ check_file_error_message(env['TEX'])
+ return result
+
+def TeXLaTeXStrFunction(target = None, source= None, env=None):
+ """A strfunction for TeX and LaTeX that scans the source file to
+ decide the "flavor" of the source and then returns the appropriate
+ command string."""
+ if env.GetOption("no_exec"):
+
+ # find these paths for use in is_LaTeX to search for included files
+ basedir = os.path.split(str(source[0]))[0]
+ abspath = os.path.abspath(basedir)
+
+ if is_LaTeX(source,env,abspath):
+ result = env.subst('$LATEXCOM',0,target,source)+" ..."
+ else:
+ result = env.subst("$TEXCOM",0,target,source)+" ..."
+ else:
+ result = ''
+ return result
+
+def tex_eps_emitter(target, source, env):
+ """An emitter for TeX and LaTeX sources when
+ executing tex or latex. It will accept .ps and .eps
+ graphics files
+ """
+ (target, source) = tex_emitter_core(target, source, env, TexGraphics)
+
+ return (target, source)
+
+def tex_pdf_emitter(target, source, env):
+ """An emitter for TeX and LaTeX sources when
+ executing pdftex or pdflatex. It will accept graphics
+ files of types .pdf, .jpg, .png, .gif, and .tif
+ """
+ (target, source) = tex_emitter_core(target, source, env, LatexGraphics)
+
+ return (target, source)
+
+def ScanFiles(theFile, target, paths, file_tests, file_tests_search, env, graphics_extensions, targetdir, aux_files):
+ """ For theFile (a Node) update any file_tests and search for graphics files
+ then find all included files and call ScanFiles recursively for each of them"""
+
+ content = theFile.get_text_contents()
+ if Verbose:
+ print(" scanning ",str(theFile))
+
+ for i in range(len(file_tests_search)):
+ if file_tests[i][0] is None:
+ if Verbose:
+ print("scan i ",i," files_tests[i] ",file_tests[i], file_tests[i][1])
+ file_tests[i][0] = file_tests_search[i].search(content)
+ if Verbose and file_tests[i][0]:
+ print(" found match for ",file_tests[i][1][-1])
+ # for newglossary insert the suffixes in file_tests[i]
+ if file_tests[i][0] and file_tests[i][1][-1] == 'newglossary':
+ findresult = file_tests_search[i].findall(content)
+ for l in range(len(findresult)) :
+ (file_tests[i][1]).insert(0,'.'+findresult[l][3])
+ (file_tests[i][1]).insert(0,'.'+findresult[l][2])
+ (file_tests[i][1]).insert(0,'.'+findresult[l][0])
+ suffix_list = ['.'+findresult[l][0],'.'+findresult[l][2],'.'+findresult[l][3] ]
+ newglossary_suffix.append(suffix_list)
+ if Verbose:
+ print(" new suffixes for newglossary ",newglossary_suffix)
+
+
+ incResult = includeOnly_re.search(content)
+ if incResult:
+ aux_files.append(os.path.join(targetdir, incResult.group(1)))
+ if Verbose:
+ print("\include file names : ", aux_files)
+ # recursively call this on each of the included files
+ inc_files = [ ]
+ inc_files.extend( include_re.findall(content) )
+ if Verbose:
+ print("files included by '%s': "%str(theFile),inc_files)
+ # inc_files is list of file names as given. need to find them
+ # using TEXINPUTS paths.
+
+ for src in inc_files:
+ srcNode = FindFile(src,['.tex','.ltx','.latex'],paths,env,requireExt=False)
+ if srcNode is not None:
+ file_tests = ScanFiles(srcNode, target, paths, file_tests, file_tests_search, env, graphics_extensions, targetdir, aux_files)
+ if Verbose:
+ print(" done scanning ",str(theFile))
+ return file_tests
+
+def tex_emitter_core(target, source, env, graphics_extensions):
+ """An emitter for TeX and LaTeX sources.
+ For LaTeX sources we try and find the common created files that
+ are needed on subsequent runs of latex to finish tables of contents,
+ bibliographies, indices, lists of figures, and hyperlink references.
+ """
+ basename = SCons.Util.splitext(str(source[0]))[0]
+ basefile = os.path.split(str(basename))[1]
+ targetdir = os.path.split(str(target[0]))[0]
+ targetbase = os.path.join(targetdir, basefile)
+
+ basedir = os.path.split(str(source[0]))[0]
+ abspath = os.path.abspath(basedir)
+ target[0].attributes.path = abspath
+
+ #
+ # file names we will make use of in searching the sources and log file
+ #
+ emit_suffixes = ['.aux', '.log', '.ilg', '.blg', '.nls', '.nlg', '.gls', '.glg', '.alg'] + all_suffixes
+ auxfilename = targetbase + '.aux'
+ logfilename = targetbase + '.log'
+ flsfilename = targetbase + '.fls'
+ syncfilename = targetbase + '.synctex.gz'
+
+ env.SideEffect(auxfilename,target[0])
+ env.SideEffect(logfilename,target[0])
+ env.SideEffect(flsfilename,target[0])
+ env.SideEffect(syncfilename,target[0])
+ if Verbose:
+ print("side effect :",auxfilename,logfilename,flsfilename,syncfilename)
+ env.Clean(target[0],auxfilename)
+ env.Clean(target[0],logfilename)
+ env.Clean(target[0],flsfilename)
+ env.Clean(target[0],syncfilename)
+
+ content = source[0].get_text_contents()
+
+ # set up list with the regular expressions
+ # we use to find features used
+ file_tests_search = [auxfile_re,
+ makeindex_re,
+ bibliography_re,
+ bibunit_re,
+ multibib_re,
+ addbibresource_re,
+ tableofcontents_re,
+ listoffigures_re,
+ listoftables_re,
+ hyperref_re,
+ makenomenclature_re,
+ makeglossary_re,
+ makeglossaries_re,
+ makeacronyms_re,
+ beamer_re,
+ newglossary_re,
+ biblatex_re ]
+ # set up list with the file suffixes that need emitting
+ # when a feature is found
+ file_tests_suff = [['.aux','aux_file'],
+ ['.idx', '.ind', '.ilg','makeindex'],
+ ['.bbl', '.blg','bibliography'],
+ ['.bbl', '.blg','bibunit'],
+ ['.bbl', '.blg','multibib'],
+ ['.bbl', '.blg','.bcf','addbibresource'],
+ ['.toc','contents'],
+ ['.lof','figures'],
+ ['.lot','tables'],
+ ['.out','hyperref'],
+ ['.nlo', '.nls', '.nlg','nomenclature'],
+ ['.glo', '.gls', '.glg','glossary'],
+ ['.glo', '.gls', '.glg','glossaries'],
+ ['.acn', '.acr', '.alg','acronyms'],
+ ['.nav', '.snm', '.out', '.toc','beamer'],
+ ['newglossary',],
+ ['.bcf', '.blg','biblatex'] ]
+ # for newglossary the suffixes are added as we find the command
+ # build the list of lists
+ file_tests = []
+ for i in range(len(file_tests_search)):
+ file_tests.append( [None, file_tests_suff[i]] )
+
+ # TO-DO: need to add a way for the user to extend this list for whatever
+ # auxiliary files they create in other (or their own) packages
+
+ # get path list from both env['TEXINPUTS'] and env['ENV']['TEXINPUTS']
+ savedpath = modify_env_var(env, 'TEXINPUTS', abspath)
+ paths = env['ENV']['TEXINPUTS']
+ if SCons.Util.is_List(paths):
+ pass
+ else:
+ # Split at os.pathsep to convert into absolute path
+ paths = paths.split(os.pathsep)
+
+ # now that we have the path list restore the env
+ if savedpath is _null:
+ try:
+ del env['ENV']['TEXINPUTS']
+ except KeyError:
+ pass # was never set
+ else:
+ env['ENV']['TEXINPUTS'] = savedpath
+ if Verbose:
+ print("search path ",paths)
+
+ # scan all sources for side effect files
+ aux_files = []
+ file_tests = ScanFiles(source[0], target, paths, file_tests, file_tests_search, env, graphics_extensions, targetdir, aux_files)
+
+ for (theSearch,suffix_list) in file_tests:
+ # add side effects if feature is present.If file is to be generated,add all side effects
+ if Verbose and theSearch:
+ print("check side effects for ",suffix_list[-1])
+ if (theSearch != None) or (not source[0].exists() ):
+ file_list = [targetbase,]
+ # for bibunit we need a list of files
+ if suffix_list[-1] == 'bibunit':
+ file_basename = os.path.join(targetdir, 'bu*.aux')
+ file_list = glob.glob(file_basename)
+ # remove the suffix '.aux'
+ for i in range(len(file_list)):
+ file_list.append(SCons.Util.splitext(file_list[i])[0])
+ # for multibib we need a list of files
+ if suffix_list[-1] == 'multibib':
+ for multibibmatch in multibib_re.finditer(content):
+ if Verbose:
+ print("multibib match ",multibibmatch.group(1))
+ if multibibmatch != None:
+ baselist = multibibmatch.group(1).split(',')
+ if Verbose:
+ print("multibib list ", baselist)
+ for i in range(len(baselist)):
+ file_list.append(os.path.join(targetdir, baselist[i]))
+ # now define the side effects
+ for file_name in file_list:
+ for suffix in suffix_list[:-1]:
+ env.SideEffect(file_name + suffix,target[0])
+ if Verbose:
+ print("side effect tst :",file_name + suffix, " target is ",str(target[0]))
+ env.Clean(target[0],file_name + suffix)
+
+ for aFile in aux_files:
+ aFile_base = SCons.Util.splitext(aFile)[0]
+ env.SideEffect(aFile_base + '.aux',target[0])
+ if Verbose:
+ print("side effect aux :",aFile_base + '.aux')
+ env.Clean(target[0],aFile_base + '.aux')
+ # read fls file to get all other files that latex creates and will read on the next pass
+ # remove files from list that we explicitly dealt with above
+ if os.path.isfile(flsfilename):
+ content = open(flsfilename, "r").read()
+ out_files = openout_re.findall(content)
+ myfiles = [auxfilename, logfilename, flsfilename, targetbase+'.dvi',targetbase+'.pdf']
+ for filename in out_files[:]:
+ if filename in myfiles:
+ out_files.remove(filename)
+ env.SideEffect(out_files,target[0])
+ if Verbose:
+ print("side effect fls :",out_files)
+ env.Clean(target[0],out_files)
+
+ return (target, source)
+
+
+TeXLaTeXAction = None
+
+def generate(env):
+ """Add Builders and construction variables for TeX to an Environment."""
+
+ global TeXLaTeXAction
+ if TeXLaTeXAction is None:
+ TeXLaTeXAction = SCons.Action.Action(TeXLaTeXFunction,
+ strfunction=TeXLaTeXStrFunction)
+
+ env.AppendUnique(LATEXSUFFIXES=SCons.Tool.LaTeXSuffixes)
+
+ generate_common(env)
+
+ from . import dvi
+ dvi.generate(env)
+
+ bld = env['BUILDERS']['DVI']
+ bld.add_action('.tex', TeXLaTeXAction)
+ bld.add_emitter('.tex', tex_eps_emitter)
+
+def generate_darwin(env):
+ try:
+ environ = env['ENV']
+ except KeyError:
+ environ = {}
+ env['ENV'] = environ
+
+ if (platform.system() == 'Darwin'):
+ try:
+ ospath = env['ENV']['PATHOSX']
+ except:
+ ospath = None
+ if ospath:
+ env.AppendENVPath('PATH', ospath)
+
+def generate_common(env):
+ """Add internal Builders and construction variables for LaTeX to an Environment."""
+
+ # Add OSX system paths so TeX tools can be found
+ # when a list of tools is given the exists() method is not called
+ generate_darwin(env)
+
+ # A generic tex file Action, sufficient for all tex files.
+ global TeXAction
+ if TeXAction is None:
+ TeXAction = SCons.Action.Action("$TEXCOM", "$TEXCOMSTR")
+
+ # An Action to build a latex file. This might be needed more
+ # than once if we are dealing with labels and bibtex.
+ global LaTeXAction
+ if LaTeXAction is None:
+ LaTeXAction = SCons.Action.Action("$LATEXCOM", "$LATEXCOMSTR")
+
+ # Define an action to run BibTeX on a file.
+ global BibTeXAction
+ if BibTeXAction is None:
+ BibTeXAction = SCons.Action.Action("$BIBTEXCOM", "$BIBTEXCOMSTR")
+
+ # Define an action to run Biber on a file.
+ global BiberAction
+ if BiberAction is None:
+ BiberAction = SCons.Action.Action("$BIBERCOM", "$BIBERCOMSTR")
+
+ # Define an action to run MakeIndex on a file.
+ global MakeIndexAction
+ if MakeIndexAction is None:
+ MakeIndexAction = SCons.Action.Action("$MAKEINDEXCOM", "$MAKEINDEXCOMSTR")
+
+ # Define an action to run MakeIndex on a file for nomenclatures.
+ global MakeNclAction
+ if MakeNclAction is None:
+ MakeNclAction = SCons.Action.Action("$MAKENCLCOM", "$MAKENCLCOMSTR")
+
+ # Define an action to run MakeIndex on a file for glossaries.
+ global MakeGlossaryAction
+ if MakeGlossaryAction is None:
+ MakeGlossaryAction = SCons.Action.Action("$MAKEGLOSSARYCOM", "$MAKEGLOSSARYCOMSTR")
+
+ # Define an action to run MakeIndex on a file for acronyms.
+ global MakeAcronymsAction
+ if MakeAcronymsAction is None:
+ MakeAcronymsAction = SCons.Action.Action("$MAKEACRONYMSCOM", "$MAKEACRONYMSCOMSTR")
+
+ try:
+ environ = env['ENV']
+ except KeyError:
+ environ = {}
+ env['ENV'] = environ
+
+ # Some Linux platforms have pdflatex set up in a way
+ # that requires that the HOME environment variable be set.
+ # Add it here if defined.
+ v = os.environ.get('HOME')
+ if v:
+ environ['HOME'] = v
+
+ CDCOM = 'cd '
+ if platform.system() == 'Windows':
+ # allow cd command to change drives on Windows
+ CDCOM = 'cd /D '
+
+ env['TEX'] = 'tex'
+ env['TEXFLAGS'] = SCons.Util.CLVar('-interaction=nonstopmode -recorder')
+ env['TEXCOM'] = CDCOM + '${TARGET.dir} && $TEX $TEXFLAGS ${SOURCE.file}'
+
+ env['PDFTEX'] = 'pdftex'
+ env['PDFTEXFLAGS'] = SCons.Util.CLVar('-interaction=nonstopmode -recorder')
+ env['PDFTEXCOM'] = CDCOM + '${TARGET.dir} && $PDFTEX $PDFTEXFLAGS ${SOURCE.file}'
+
+ env['LATEX'] = 'latex'
+ env['LATEXFLAGS'] = SCons.Util.CLVar('-interaction=nonstopmode -recorder')
+ env['LATEXCOM'] = CDCOM + '${TARGET.dir} && $LATEX $LATEXFLAGS ${SOURCE.file}'
+ env['LATEXRETRIES'] = 4
+
+ env['PDFLATEX'] = 'pdflatex'
+ env['PDFLATEXFLAGS'] = SCons.Util.CLVar('-interaction=nonstopmode -recorder')
+ env['PDFLATEXCOM'] = CDCOM + '${TARGET.dir} && $PDFLATEX $PDFLATEXFLAGS ${SOURCE.file}'
+
+ env['BIBTEX'] = 'bibtex'
+ env['BIBTEXFLAGS'] = SCons.Util.CLVar('')
+ env['BIBTEXCOM'] = CDCOM + '${TARGET.dir} && $BIBTEX $BIBTEXFLAGS ${SOURCE.filebase}'
+
+ env['BIBER'] = 'biber'
+ env['BIBERFLAGS'] = SCons.Util.CLVar('')
+ env['BIBERCOM'] = CDCOM + '${TARGET.dir} && $BIBER $BIBERFLAGS ${SOURCE.filebase}'
+
+ env['MAKEINDEX'] = 'makeindex'
+ env['MAKEINDEXFLAGS'] = SCons.Util.CLVar('')
+ env['MAKEINDEXCOM'] = CDCOM + '${TARGET.dir} && $MAKEINDEX $MAKEINDEXFLAGS ${SOURCE.file}'
+
+ env['MAKEGLOSSARY'] = 'makeindex'
+ env['MAKEGLOSSARYSTYLE'] = '${SOURCE.filebase}.ist'
+ env['MAKEGLOSSARYFLAGS'] = SCons.Util.CLVar('-s ${MAKEGLOSSARYSTYLE} -t ${SOURCE.filebase}.glg')
+ env['MAKEGLOSSARYCOM'] = CDCOM + '${TARGET.dir} && $MAKEGLOSSARY ${SOURCE.filebase}.glo $MAKEGLOSSARYFLAGS -o ${SOURCE.filebase}.gls'
+
+ env['MAKEACRONYMS'] = 'makeindex'
+ env['MAKEACRONYMSSTYLE'] = '${SOURCE.filebase}.ist'
+ env['MAKEACRONYMSFLAGS'] = SCons.Util.CLVar('-s ${MAKEACRONYMSSTYLE} -t ${SOURCE.filebase}.alg')
+ env['MAKEACRONYMSCOM'] = CDCOM + '${TARGET.dir} && $MAKEACRONYMS ${SOURCE.filebase}.acn $MAKEACRONYMSFLAGS -o ${SOURCE.filebase}.acr'
+
+ env['MAKENCL'] = 'makeindex'
+ env['MAKENCLSTYLE'] = 'nomencl.ist'
+ env['MAKENCLFLAGS'] = '-s ${MAKENCLSTYLE} -t ${SOURCE.filebase}.nlg'
+ env['MAKENCLCOM'] = CDCOM + '${TARGET.dir} && $MAKENCL ${SOURCE.filebase}.nlo $MAKENCLFLAGS -o ${SOURCE.filebase}.nls'
+
+ env['MAKENEWGLOSSARY'] = 'makeindex'
+ env['MAKENEWGLOSSARYCOM'] = CDCOM + '${TARGET.dir} && $MAKENEWGLOSSARY '
+
+def exists(env):
+ generate_darwin(env)
+ return env.Detect('tex')
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/tex.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/tex.xml
new file mode 100644
index 0000000..8965daf
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/tex.xml
@@ -0,0 +1,173 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+__COPYRIGHT__
+
+This file is processed by the bin/SConsDoc.py module.
+See its __doc__ string for a discussion of the format.
+-->
+
+<!DOCTYPE sconsdoc [
+<!ENTITY % scons SYSTEM '../../../../doc/scons.mod'>
+%scons;
+<!ENTITY % builders-mod SYSTEM '../../../../doc/generated/builders.mod'>
+%builders-mod;
+<!ENTITY % functions-mod SYSTEM '../../../../doc/generated/functions.mod'>
+%functions-mod;
+<!ENTITY % tools-mod SYSTEM '../../../../doc/generated/tools.mod'>
+%tools-mod;
+<!ENTITY % variables-mod SYSTEM '../../../../doc/generated/variables.mod'>
+%variables-mod;
+]>
+
+<sconsdoc xmlns="http://www.scons.org/dbxsd/v1.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://www.scons.org/dbxsd/v1.0 http://www.scons.org/dbxsd/v1.0/scons.xsd">
+
+<tool name="tex">
+<summary>
+<para>
+Sets construction variables for the TeX formatter and typesetter.
+</para>
+</summary>
+<sets>
+<item>TEX</item>
+<item>TEXFLAGS</item>
+<item>TEXCOM</item>
+<item>LATEX</item>
+<item>LATEXFLAGS</item>
+<item>LATEXCOM</item>
+<item>BIBTEX</item>
+<item>BIBTEXFLAGS</item>
+<item>BIBTEXCOM</item>
+<item>MAKEINDEX</item>
+<item>MAKEINDEXFLAGS</item>
+<item>MAKEINDEXCOM</item>
+</sets>
+<uses>
+<item>TEXCOMSTR</item>
+<item>LATEXCOMSTR</item>
+<item>BIBTEXCOMSTR</item>
+<item>MAKEINDEXCOMSTR</item>
+</uses>
+</tool>
+
+<cvar name="BIBTEX">
+<summary>
+<para>
+The bibliography generator for the TeX formatter and typesetter and the
+LaTeX structured formatter and typesetter.
+</para>
+</summary>
+</cvar>
+
+<cvar name="BIBTEXCOM">
+<summary>
+<para>
+The command line used to call the bibliography generator for the
+TeX formatter and typesetter and the LaTeX structured formatter and
+typesetter.
+</para>
+</summary>
+</cvar>
+
+<cvar name="BIBTEXCOMSTR">
+<summary>
+<para>
+The string displayed when generating a bibliography
+for TeX or LaTeX.
+If this is not set, then &cv-link-BIBTEXCOM; (the command line) is displayed.
+</para>
+
+<example_commands>
+env = Environment(BIBTEXCOMSTR = "Generating bibliography $TARGET")
+</example_commands>
+</summary>
+</cvar>
+
+<cvar name="BIBTEXFLAGS">
+<summary>
+<para>
+General options passed to the bibliography generator for the TeX formatter
+and typesetter and the LaTeX structured formatter and typesetter.
+</para>
+</summary>
+</cvar>
+
+<cvar name="MAKEINDEX">
+<summary>
+<para>
+The makeindex generator for the TeX formatter and typesetter and the
+LaTeX structured formatter and typesetter.
+</para>
+</summary>
+</cvar>
+
+<cvar name="MAKEINDEXCOM">
+<summary>
+<para>
+The command line used to call the makeindex generator for the
+TeX formatter and typesetter and the LaTeX structured formatter and
+typesetter.
+</para>
+</summary>
+</cvar>
+
+<cvar name="MAKEINDEXCOMSTR">
+<summary>
+<para>
+The string displayed when calling the makeindex generator for the
+TeX formatter and typesetter
+and the LaTeX structured formatter and typesetter.
+If this is not set, then &cv-link-MAKEINDEXCOM; (the command line) is displayed.
+</para>
+</summary>
+</cvar>
+
+<cvar name="MAKEINDEXFLAGS">
+<summary>
+<para>
+General options passed to the makeindex generator for the TeX formatter
+and typesetter and the LaTeX structured formatter and typesetter.
+</para>
+</summary>
+</cvar>
+
+<cvar name="TEX">
+<summary>
+<para>
+The TeX formatter and typesetter.
+</para>
+</summary>
+</cvar>
+
+<cvar name="TEXCOM">
+<summary>
+<para>
+The command line used to call the TeX formatter and typesetter.
+</para>
+</summary>
+</cvar>
+
+<cvar name="TEXCOMSTR">
+<summary>
+<para>
+The string displayed when calling
+the TeX formatter and typesetter.
+If this is not set, then &cv-link-TEXCOM; (the command line) is displayed.
+</para>
+
+<example_commands>
+env = Environment(TEXCOMSTR = "Building $TARGET from TeX input $SOURCES")
+</example_commands>
+</summary>
+</cvar>
+
+<cvar name="TEXFLAGS">
+<summary>
+<para>
+General options passed to the TeX formatter and typesetter.
+</para>
+</summary>
+</cvar>
+
+</sconsdoc>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/textfile.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/textfile.py
new file mode 100644
index 0000000..46176ad
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/textfile.py
@@ -0,0 +1,208 @@
+# -*- python -*-
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__doc__ = """
+Textfile/Substfile builder for SCons.
+
+ Create file 'target' which typically is a textfile. The 'source'
+ may be any combination of strings, Nodes, or lists of same. A
+ 'linesep' will be put between any part written and defaults to
+ os.linesep.
+
+ The only difference between the Textfile builder and the Substfile
+ builder is that strings are converted to Value() nodes for the
+ former and File() nodes for the latter. To insert files in the
+ former or strings in the latter, wrap them in a File() or Value(),
+ respectively.
+
+ The values of SUBST_DICT first have any construction variables
+ expanded (its keys are not expanded). If a value of SUBST_DICT is
+ a python callable function, it is called and the result is expanded
+ as the value. Values are substituted in a "random" order; if any
+ substitution could be further expanded by another substitution, it
+ is unpredictable whether the expansion will occur.
+"""
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import SCons
+
+import os
+import re
+
+from SCons.Node import Node
+from SCons.Node.Python import Value
+from SCons.Util import is_String, is_Sequence, is_Dict, to_bytes, PY3
+
+
+if PY3:
+ TEXTFILE_FILE_WRITE_MODE = 'w'
+else:
+ TEXTFILE_FILE_WRITE_MODE = 'wb'
+
+LINESEP = '\n'
+
+def _do_subst(node, subs):
+ """
+ Fetch the node contents and replace all instances of the keys with
+ their values. For example, if subs is
+ {'%VERSION%': '1.2345', '%BASE%': 'MyProg', '%prefix%': '/bin'},
+ then all instances of %VERSION% in the file will be replaced with
+ 1.2345 and so forth.
+ """
+ contents = node.get_text_contents()
+ if subs:
+ for (k, val) in subs:
+ contents = re.sub(k, val, contents)
+
+ if 'b' in TEXTFILE_FILE_WRITE_MODE:
+ try:
+ contents = bytearray(contents, 'utf-8')
+ except UnicodeDecodeError:
+ # contents is already utf-8 encoded python 2 str i.e. a byte array
+ contents = bytearray(contents)
+
+ return contents
+
+
+def _action(target, source, env):
+
+ # prepare the line separator
+ linesep = env['LINESEPARATOR']
+ if linesep is None:
+ linesep = LINESEP # os.linesep
+ elif is_String(linesep):
+ pass
+ elif isinstance(linesep, Value):
+ linesep = linesep.get_text_contents()
+ else:
+ raise SCons.Errors.UserError('unexpected type/class for LINESEPARATOR: %s'
+ % repr(linesep), None)
+
+ if 'b' in TEXTFILE_FILE_WRITE_MODE:
+ linesep = to_bytes(linesep)
+
+ # create a dictionary to use for the substitutions
+ if 'SUBST_DICT' not in env:
+ subs = None # no substitutions
+ else:
+ subst_dict = env['SUBST_DICT']
+ if is_Dict(subst_dict):
+ subst_dict = list(subst_dict.items())
+ elif is_Sequence(subst_dict):
+ pass
+ else:
+ raise SCons.Errors.UserError('SUBST_DICT must be dict or sequence')
+ subs = []
+ for (k, value) in subst_dict:
+ if callable(value):
+ value = value()
+ if is_String(value):
+ value = env.subst(value)
+ else:
+ value = str(value)
+ subs.append((k, value))
+
+ # write the file
+ try:
+ if SCons.Util.PY3:
+ target_file = open(target[0].get_path(), TEXTFILE_FILE_WRITE_MODE, newline='', encoding="utf8")
+ else:
+ target_file = open(target[0].get_path(), TEXTFILE_FILE_WRITE_MODE)
+ except (OSError, IOError):
+ raise SCons.Errors.UserError("Can't write target file %s" % target[0])
+
+ # separate lines by 'linesep' only if linesep is not empty
+ lsep = None
+ for line in source:
+ if lsep:
+ target_file.write(lsep)
+
+ target_file.write(_do_subst(line, subs))
+ lsep = linesep
+ target_file.close()
+
+
+def _strfunc(target, source, env):
+ return "Creating '%s'" % target[0]
+
+
+def _convert_list_R(newlist, sources):
+ for elem in sources:
+ if is_Sequence(elem):
+ _convert_list_R(newlist, elem)
+ elif isinstance(elem, Node):
+ newlist.append(elem)
+ else:
+ newlist.append(Value(elem))
+
+
+def _convert_list(target, source, env):
+ if len(target) != 1:
+ raise SCons.Errors.UserError("Only one target file allowed")
+ newlist = []
+ _convert_list_R(newlist, source)
+ return target, newlist
+
+
+_common_varlist = ['SUBST_DICT', 'LINESEPARATOR']
+
+_text_varlist = _common_varlist + ['TEXTFILEPREFIX', 'TEXTFILESUFFIX']
+_text_builder = SCons.Builder.Builder(
+ action=SCons.Action.Action(_action, _strfunc, varlist=_text_varlist),
+ source_factory=Value,
+ emitter=_convert_list,
+ prefix='$TEXTFILEPREFIX',
+ suffix='$TEXTFILESUFFIX',
+)
+
+_subst_varlist = _common_varlist + ['SUBSTFILEPREFIX', 'TEXTFILESUFFIX']
+_subst_builder = SCons.Builder.Builder(
+ action=SCons.Action.Action(_action, _strfunc, varlist=_subst_varlist),
+ source_factory=SCons.Node.FS.File,
+ emitter=_convert_list,
+ prefix='$SUBSTFILEPREFIX',
+ suffix='$SUBSTFILESUFFIX',
+ src_suffix=['.in'],
+)
+
+
+def generate(env):
+ env['LINESEPARATOR'] = LINESEP # os.linesep
+ env['BUILDERS']['Textfile'] = _text_builder
+ env['TEXTFILEPREFIX'] = ''
+ env['TEXTFILESUFFIX'] = '.txt'
+ env['BUILDERS']['Substfile'] = _subst_builder
+ env['SUBSTFILEPREFIX'] = ''
+ env['SUBSTFILESUFFIX'] = ''
+
+
+def exists(env):
+ return 1
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/textfile.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/textfile.xml
new file mode 100644
index 0000000..08bbb76
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/textfile.xml
@@ -0,0 +1,253 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+__COPYRIGHT__
+
+This file is processed by the bin/SConsDoc.py module.
+See its __doc__ string for a discussion of the format.
+-->
+
+<!DOCTYPE sconsdoc [
+<!ENTITY % scons SYSTEM '../../../../doc/scons.mod'>
+%scons;
+<!ENTITY % builders-mod SYSTEM '../../../../doc/generated/builders.mod'>
+%builders-mod;
+<!ENTITY % functions-mod SYSTEM '../../../../doc/generated/functions.mod'>
+%functions-mod;
+<!ENTITY % tools-mod SYSTEM '../../../../doc/generated/tools.mod'>
+%tools-mod;
+<!ENTITY % variables-mod SYSTEM '../../../../doc/generated/variables.mod'>
+%variables-mod;
+]>
+
+<sconsdoc xmlns="http://www.scons.org/dbxsd/v1.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://www.scons.org/dbxsd/v1.0 http://www.scons.org/dbxsd/v1.0/scons.xsd">
+
+<tool name="textfile">
+<summary>
+<para>
+Set construction variables for the &b-Textfile; and &b-Substfile; builders.
+</para>
+</summary>
+<sets>
+<item>LINESEPARATOR</item>
+<item>SUBSTFILEPREFIX</item>
+<item>SUBSTFILESUFFIX</item>
+<item>TEXTFILEPREFIX</item>
+<item>TEXTFILESUFFIX</item>
+</sets>
+<uses>
+<item>SUBST_DICT</item>
+</uses>
+</tool>
+
+<builder name="Textfile">
+<summary>
+<para>
+The &b-Textfile; builder generates a single text file.
+The source strings constitute the lines;
+nested lists of sources are flattened.
+&cv-LINESEPARATOR; is used to separate the strings.
+</para>
+
+<para>
+If present, the &cv-SUBST_DICT; construction variable
+is used to modify the strings before they are written;
+see the &b-Substfile; description for details.
+</para>
+
+<para>
+The prefix and suffix specified by the &cv-TEXTFILEPREFIX;
+and &cv-TEXTFILESUFFIX; construction variables
+(the null string and <filename>.txt</filename> by default, respectively)
+are automatically added to the target if they are not already present.
+Examples:
+</para>
+
+<example_commands>
+# builds/writes foo.txt
+env.Textfile(target = 'foo.txt', source = ['Goethe', 42, 'Schiller'])
+
+# builds/writes bar.txt
+env.Textfile(target = 'bar',
+ source = ['lalala', 'tanteratei'],
+ LINESEPARATOR='|*')
+
+# nested lists are flattened automatically
+env.Textfile(target = 'blob',
+ source = ['lalala', ['Goethe', 42 'Schiller'], 'tanteratei'])
+
+# files may be used as input by wraping them in File()
+env.Textfile(target = 'concat', # concatenate files with a marker between
+ source = [File('concat1'), File('concat2')],
+ LINESEPARATOR = '====================\n')
+
+Results are:
+foo.txt
+ ....8&lt;----
+ Goethe
+ 42
+ Schiller
+ ....8&lt;---- (no linefeed at the end)
+
+bar.txt:
+ ....8&lt;----
+ lalala|*tanteratei
+ ....8&lt;---- (no linefeed at the end)
+
+blob.txt
+ ....8&lt;----
+ lalala
+ Goethe
+ 42
+ Schiller
+ tanteratei
+ ....8&lt;---- (no linefeed at the end)
+</example_commands>
+</summary>
+</builder>
+
+<builder name="Substfile">
+<summary>
+<para>
+The &b-Substfile; builder creates a single text file from another file or set of
+files by concatenating them with &cv-LINESEPARATOR; and replacing text
+using the &cv-SUBST_DICT; construction variable. Nested lists of source files
+are flattened. See also &b-Textfile;.
+</para>
+
+<para>
+If a single source file is present with an <filename>.in</filename> suffix,
+the suffix is stripped and the remainder is used as the default target name.
+</para>
+
+<para>
+The prefix and suffix specified by the &cv-SUBSTFILEPREFIX;
+and &cv-SUBSTFILESUFFIX; construction variables
+(the null string by default in both cases)
+are automatically added to the target if they are not already present.
+</para>
+
+<para>
+If a construction variable named &cv-SUBST_DICT; is present,
+it may be either a Python dictionary or a sequence of (key,value) tuples.
+If it is a dictionary it is converted into a list of tuples in an arbitrary order,
+so if one key is a prefix of another key
+or if one substitution could be further expanded by another subsitition,
+it is unpredictable whether the expansion will occur.
+</para>
+
+<para>
+Any occurrences of a key in the source
+are replaced by the corresponding value,
+which may be a Python callable function or a string.
+If the value is a callable, it is called with no arguments to get a string.
+Strings are <emphasis>subst</emphasis>-expanded
+and the result replaces the key.
+</para>
+
+<example_commands>
+env = Environment(tools = ['default', 'textfile'])
+
+env['prefix'] = '/usr/bin'
+script_dict = {'@prefix@': '/bin', '@exec_prefix@': '$prefix'}
+env.Substfile('script.in', SUBST_DICT = script_dict)
+
+conf_dict = {'%VERSION%': '1.2.3', '%BASE%': 'MyProg'}
+env.Substfile('config.h.in', conf_dict, SUBST_DICT = conf_dict)
+
+# UNPREDICTABLE - one key is a prefix of another
+bad_foo = {'$foo': '$foo', '$foobar': '$foobar'}
+env.Substfile('foo.in', SUBST_DICT = bad_foo)
+
+# PREDICTABLE - keys are applied longest first
+good_foo = [('$foobar', '$foobar'), ('$foo', '$foo')]
+env.Substfile('foo.in', SUBST_DICT = good_foo)
+
+# UNPREDICTABLE - one substitution could be futher expanded
+bad_bar = {'@bar@': '@soap@', '@soap@': 'lye'}
+env.Substfile('bar.in', SUBST_DICT = bad_bar)
+
+# PREDICTABLE - substitutions are expanded in order
+good_bar = (('@bar@', '@soap@'), ('@soap@', 'lye'))
+env.Substfile('bar.in', SUBST_DICT = good_bar)
+
+# the SUBST_DICT may be in common (and not an override)
+substutions = {}
+subst = Environment(tools = ['textfile'], SUBST_DICT = substitutions)
+substitutions['@foo@'] = 'foo'
+subst['SUBST_DICT']['@bar@'] = 'bar'
+subst.Substfile('pgm1.c', [Value('#include "@foo@.h"'),
+ Value('#include "@bar@.h"'),
+ "common.in",
+ "pgm1.in"
+ ])
+subst.Substfile('pgm2.c', [Value('#include "@foo@.h"'),
+ Value('#include "@bar@.h"'),
+ "common.in",
+ "pgm2.in"
+ ])
+
+</example_commands>
+</summary>
+</builder>
+
+<cvar name="LINESEPARATOR">
+<summary>
+<para>
+The separator used by the &b-Substfile; and &b-Textfile; builders.
+This value is used between sources when constructing the target.
+It defaults to the current system line separator.
+</para>
+</summary>
+</cvar>
+
+<cvar name="SUBST_DICT">
+<summary>
+<para>
+The dictionary used by the &b-Substfile; or &b-Textfile; builders
+for substitution values.
+It can be anything acceptable to the dict() constructor,
+so in addition to a dictionary,
+lists of tuples are also acceptable.
+</para>
+</summary>
+</cvar>
+
+<cvar name="SUBSTFILEPREFIX">
+<summary>
+<para>
+The prefix used for &b-Substfile; file names,
+the null string by default.
+</para>
+</summary>
+</cvar>
+
+<cvar name="SUBSTFILESUFFIX">
+<summary>
+<para>
+The suffix used for &b-Substfile; file names,
+the null string by default.
+</para>
+</summary>
+</cvar>
+
+<cvar name="TEXTFILEPREFIX">
+<summary>
+<para>
+The prefix used for &b-Textfile; file names,
+the null string by default.
+</para>
+</summary>
+</cvar>
+
+<cvar name="TEXTFILESUFFIX">
+<summary>
+<para>
+The suffix used for &b-Textfile; file names;
+<filename>.txt</filename> by default.
+</para>
+</summary>
+</cvar>
+
+</sconsdoc>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/tlib.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/tlib.py
new file mode 100644
index 0000000..33adb57
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/tlib.py
@@ -0,0 +1,53 @@
+"""SCons.Tool.tlib
+
+XXX
+
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import SCons.Tool
+import SCons.Tool.bcc32
+import SCons.Util
+
+def generate(env):
+ SCons.Tool.bcc32.findIt('tlib', env)
+ """Add Builders and construction variables for ar to an Environment."""
+ SCons.Tool.createStaticLibBuilder(env)
+ env['AR'] = 'tlib'
+ env['ARFLAGS'] = SCons.Util.CLVar('')
+ env['ARCOM'] = '$AR $TARGET $ARFLAGS /a $SOURCES'
+ env['LIBPREFIX'] = ''
+ env['LIBSUFFIX'] = '.lib'
+
+def exists(env):
+ return SCons.Tool.bcc32.findIt('tlib', env)
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/tlib.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/tlib.xml
new file mode 100644
index 0000000..b9afef4
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/tlib.xml
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+__COPYRIGHT__
+
+This file is processed by the bin/SConsDoc.py module.
+See its __doc__ string for a discussion of the format.
+-->
+
+<!DOCTYPE sconsdoc [
+<!ENTITY % scons SYSTEM '../../../../doc/scons.mod'>
+%scons;
+<!ENTITY % builders-mod SYSTEM '../../../../doc/generated/builders.mod'>
+%builders-mod;
+<!ENTITY % functions-mod SYSTEM '../../../../doc/generated/functions.mod'>
+%functions-mod;
+<!ENTITY % tools-mod SYSTEM '../../../../doc/generated/tools.mod'>
+%tools-mod;
+<!ENTITY % variables-mod SYSTEM '../../../../doc/generated/variables.mod'>
+%variables-mod;
+]>
+
+<sconsdoc xmlns="http://www.scons.org/dbxsd/v1.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://www.scons.org/dbxsd/v1.0 http://www.scons.org/dbxsd/v1.0/scons.xsd">
+
+<tool name="tlib">
+<summary>
+<para>
+Sets construction variables for the Borlan
+<application>tib</application> library archiver.
+</para>
+</summary>
+<sets>
+<item>AR</item>
+<item>ARFLAGS</item>
+<item>ARCOM</item>
+<item>LIBPREFIX</item>
+<item>LIBSUFFIX</item>
+</sets>
+<uses>
+<item>ARCOMSTR</item>
+</uses>
+</tool>
+
+</sconsdoc>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/wix.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/wix.py
new file mode 100644
index 0000000..04136ce
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/wix.py
@@ -0,0 +1,104 @@
+"""SCons.Tool.wix
+
+Tool-specific initialization for wix, the Windows Installer XML Tool.
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import SCons.Builder
+import SCons.Action
+import os
+
+def generate(env):
+ """Add Builders and construction variables for WiX to an Environment."""
+ if not exists(env):
+ return
+
+ env['WIXCANDLEFLAGS'] = ['-nologo']
+ env['WIXCANDLEINCLUDE'] = []
+ env['WIXCANDLECOM'] = '$WIXCANDLE $WIXCANDLEFLAGS -I $WIXCANDLEINCLUDE -o ${TARGET} ${SOURCE}'
+
+ env['WIXLIGHTFLAGS'].append( '-nologo' )
+ env['WIXLIGHTCOM'] = "$WIXLIGHT $WIXLIGHTFLAGS -out ${TARGET} ${SOURCES}"
+ env['WIXSRCSUF'] = '.wxs'
+ env['WIXOBJSUF'] = '.wixobj'
+
+ object_builder = SCons.Builder.Builder(
+ action = '$WIXCANDLECOM',
+ suffix = '$WIXOBJSUF',
+ src_suffix = '$WIXSRCSUF')
+
+ linker_builder = SCons.Builder.Builder(
+ action = '$WIXLIGHTCOM',
+ src_suffix = '$WIXOBJSUF',
+ src_builder = object_builder)
+
+ env['BUILDERS']['WiX'] = linker_builder
+
+def exists(env):
+ env['WIXCANDLE'] = 'candle.exe'
+ env['WIXLIGHT'] = 'light.exe'
+
+ # try to find the candle.exe and light.exe tools and
+ # add the install directory to light libpath.
+ for path in os.environ['PATH'].split(os.pathsep):
+ if not path:
+ continue
+
+ # workaround for some weird python win32 bug.
+ if path[0] == '"' and path[-1:]=='"':
+ path = path[1:-1]
+
+ # normalize the path
+ path = os.path.normpath(path)
+
+ # search for the tools in the PATH environment variable
+ try:
+ files = os.listdir(path)
+ if env['WIXCANDLE'] in files and env['WIXLIGHT'] in files:
+ env.PrependENVPath('PATH', path)
+ # include appropriate flags if running WiX 2.0
+ if 'wixui.wixlib' in files and 'WixUI_en-us.wxl' in files:
+ env['WIXLIGHTFLAGS'] = [ os.path.join( path, 'wixui.wixlib' ),
+ '-loc',
+ os.path.join( path, 'WixUI_en-us.wxl' ) ]
+ else:
+ env['WIXLIGHTFLAGS'] = []
+ return 1
+ except OSError:
+ pass # ignore this, could be a stale PATH entry.
+
+ return None
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/wixTests.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/wixTests.py
new file mode 100644
index 0000000..c683e98
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/wixTests.py
@@ -0,0 +1,63 @@
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import unittest
+import os.path
+import os
+import sys
+
+import SCons.Errors
+from SCons.Tool.wix import *
+from SCons.Environment import Environment
+
+import TestCmd
+import TestUnit
+
+
+# create fake candle and light, so the tool's exists() method will succeed
+test = TestCmd.TestCmd(workdir = '')
+test.write('candle.exe', 'rem this is candle')
+test.write('light.exe', 'rem this is light')
+os.environ['PATH'] += os.pathsep + test.workdir
+
+class WixTestCase(unittest.TestCase):
+ def test_vars(self):
+ """Test that WiX tool adds vars"""
+ env = Environment(tools=['wix'])
+ assert env['WIXCANDLE'] is not None
+ assert env['WIXCANDLEFLAGS'] is not None
+ assert env['WIXLIGHTFLAGS'] is not None
+ assert env.subst('$WIXOBJSUF') == '.wixobj'
+ assert env.subst('$WIXSRCSUF') == '.wxs'
+
+if __name__ == "__main__":
+ suite = unittest.makeSuite(WixTestCase, 'test_')
+ TestUnit.run(suite)
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/xgettext.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/xgettext.py
new file mode 100644
index 0000000..2c0ce40
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/xgettext.py
@@ -0,0 +1,362 @@
+""" xgettext tool
+
+Tool specific initialization of `xgettext` tool.
+"""
+
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+
+#############################################################################
+class _CmdRunner(object):
+ """ Callable object, which runs shell command storing its stdout and stderr to
+ variables. It also provides `strfunction()` method, which shall be used by
+ scons Action objects to print command string. """
+
+ def __init__(self, command, commandstr=None):
+ self.out = None
+ self.err = None
+ self.status = None
+ self.command = command
+ self.commandstr = commandstr
+
+ def __call__(self, target, source, env):
+ import SCons.Action
+ import subprocess
+ import os
+ import sys
+ kw = {
+ 'stdin': 'devnull',
+ 'stdout': subprocess.PIPE,
+ 'stderr': subprocess.PIPE,
+ 'universal_newlines': True,
+ 'shell': True
+ }
+ command = env.subst(self.command, target=target, source=source)
+ proc = SCons.Action._subproc(env, command, **kw)
+ self.out, self.err = proc.communicate()
+ self.status = proc.wait()
+ if self.err:
+ sys.stderr.write(unicode(self.err))
+ return self.status
+
+ def strfunction(self, target, source, env):
+ import os
+ comstr = self.commandstr
+ if env.subst(comstr, target=target, source=source) == "":
+ comstr = self.command
+ s = env.subst(comstr, target=target, source=source)
+ return s
+
+
+#############################################################################
+
+#############################################################################
+def _update_pot_file(target, source, env):
+ """ Action function for `POTUpdate` builder """
+ import re
+ import os
+ import SCons.Action
+ nop = lambda target, source, env: 0
+
+ # Save scons cwd and os cwd (NOTE: they may be different. After the job, we
+ # revert each one to its original state).
+ save_cwd = env.fs.getcwd()
+ save_os_cwd = os.getcwd()
+ chdir = target[0].dir
+ chdir_str = repr(chdir.get_abspath())
+ # Print chdir message (employ SCons.Action.Action for that. It knows better
+ # than me how to to this correctly).
+ env.Execute(SCons.Action.Action(nop, "Entering " + chdir_str))
+ # Go to target's directory and do our job
+ env.fs.chdir(chdir, 1) # Go into target's directory
+ try:
+ cmd = _CmdRunner('$XGETTEXTCOM', '$XGETTEXTCOMSTR')
+ action = SCons.Action.Action(cmd, strfunction=cmd.strfunction)
+ status = action([target[0]], source, env)
+ except:
+ # Something went wrong.
+ env.Execute(SCons.Action.Action(nop, "Leaving " + chdir_str))
+ # Revert working dirs to previous state and re-throw exception.
+ env.fs.chdir(save_cwd, 0)
+ os.chdir(save_os_cwd)
+ raise
+ # Print chdir message.
+ env.Execute(SCons.Action.Action(nop, "Leaving " + chdir_str))
+ # Revert working dirs to previous state.
+ env.fs.chdir(save_cwd, 0)
+ os.chdir(save_os_cwd)
+ # If the command was not successfull, return error code.
+ if status: return status
+
+ new_content = cmd.out
+
+ if not new_content:
+ # When xgettext finds no internationalized messages, no *.pot is created
+ # (because we don't want to bother translators with empty POT files).
+ needs_update = False
+ explain = "no internationalized messages encountered"
+ else:
+ if target[0].exists():
+ # If the file already exists, it's left unaltered unless its messages
+ # are outdated (w.r.t. to these recovered by xgettext from sources).
+ old_content = target[0].get_text_contents()
+ re_cdate = re.compile(r'^"POT-Creation-Date: .*"$[\r\n]?', re.M)
+ old_content_nocdate = re.sub(re_cdate, "", old_content)
+ new_content_nocdate = re.sub(re_cdate, "", new_content)
+ if (old_content_nocdate == new_content_nocdate):
+ # Messages are up-to-date
+ needs_update = False
+ explain = "messages in file found to be up-to-date"
+ else:
+ # Messages are outdated
+ needs_update = True
+ explain = "messages in file were outdated"
+ else:
+ # No POT file found, create new one
+ needs_update = True
+ explain = "new file"
+ if needs_update:
+ # Print message employing SCons.Action.Action for that.
+ msg = "Writing " + repr(str(target[0])) + " (" + explain + ")"
+ env.Execute(SCons.Action.Action(nop, msg))
+ f = open(str(target[0]), "w")
+ f.write(new_content)
+ f.close()
+ return 0
+ else:
+ # Print message employing SCons.Action.Action for that.
+ msg = "Not writing " + repr(str(target[0])) + " (" + explain + ")"
+ env.Execute(SCons.Action.Action(nop, msg))
+ return 0
+
+
+#############################################################################
+
+#############################################################################
+from SCons.Builder import BuilderBase
+
+
+#############################################################################
+class _POTBuilder(BuilderBase):
+ def _execute(self, env, target, source, *args):
+ if not target:
+ if 'POTDOMAIN' in env and env['POTDOMAIN']:
+ domain = env['POTDOMAIN']
+ else:
+ domain = 'messages'
+ target = [domain]
+ return BuilderBase._execute(self, env, target, source, *args)
+
+
+#############################################################################
+
+#############################################################################
+def _scan_xgettext_from_files(target, source, env, files=None, path=None):
+ """ Parses `POTFILES.in`-like file and returns list of extracted file names.
+ """
+ import re
+ import SCons.Util
+ import SCons.Node.FS
+
+ if files is None:
+ return 0
+ if not SCons.Util.is_List(files):
+ files = [files]
+
+ if path is None:
+ if 'XGETTEXTPATH' in env:
+ path = env['XGETTEXTPATH']
+ else:
+ path = []
+ if not SCons.Util.is_List(path):
+ path = [path]
+
+ path = SCons.Util.flatten(path)
+
+ dirs = ()
+ for p in path:
+ if not isinstance(p, SCons.Node.FS.Base):
+ if SCons.Util.is_String(p):
+ p = env.subst(p, source=source, target=target)
+ p = env.arg2nodes(p, env.fs.Dir)
+ dirs += tuple(p)
+ # cwd is the default search path (when no path is defined by user)
+ if not dirs:
+ dirs = (env.fs.getcwd(),)
+
+ # Parse 'POTFILE.in' files.
+ re_comment = re.compile(r'^#[^\n\r]*$\r?\n?', re.M)
+ re_emptyln = re.compile(r'^[ \t\r]*$\r?\n?', re.M)
+ re_trailws = re.compile(r'[ \t\r]+$')
+ for f in files:
+ # Find files in search path $XGETTEXTPATH
+ if isinstance(f, SCons.Node.FS.Base) and f.rexists():
+ contents = f.get_text_contents()
+ contents = re_comment.sub("", contents)
+ contents = re_emptyln.sub("", contents)
+ contents = re_trailws.sub("", contents)
+ depnames = contents.splitlines()
+ for depname in depnames:
+ depfile = SCons.Node.FS.find_file(depname, dirs)
+ if not depfile:
+ depfile = env.arg2nodes(depname, dirs[0].File)
+ env.Depends(target, depfile)
+ return 0
+
+
+#############################################################################
+
+#############################################################################
+def _pot_update_emitter(target, source, env):
+ """ Emitter function for `POTUpdate` builder """
+ from SCons.Tool.GettextCommon import _POTargetFactory
+ import SCons.Util
+ import SCons.Node.FS
+
+ if 'XGETTEXTFROM' in env:
+ xfrom = env['XGETTEXTFROM']
+ else:
+ return target, source
+ if not SCons.Util.is_List(xfrom):
+ xfrom = [xfrom]
+
+ xfrom = SCons.Util.flatten(xfrom)
+
+ # Prepare list of 'POTFILE.in' files.
+ files = []
+ for xf in xfrom:
+ if not isinstance(xf, SCons.Node.FS.Base):
+ if SCons.Util.is_String(xf):
+ # Interpolate variables in strings
+ xf = env.subst(xf, source=source, target=target)
+ xf = env.arg2nodes(xf)
+ files.extend(xf)
+ if files:
+ env.Depends(target, files)
+ _scan_xgettext_from_files(target, source, env, files)
+ return target, source
+
+
+#############################################################################
+
+#############################################################################
+from SCons.Environment import _null
+
+
+#############################################################################
+def _POTUpdateBuilderWrapper(env, target=None, source=_null, **kw):
+ return env._POTUpdateBuilder(target, source, **kw)
+
+
+#############################################################################
+
+#############################################################################
+def _POTUpdateBuilder(env, **kw):
+ """ Creates `POTUpdate` builder object """
+ import SCons.Action
+ from SCons.Tool.GettextCommon import _POTargetFactory
+ kw['action'] = SCons.Action.Action(_update_pot_file, None)
+ kw['suffix'] = '$POTSUFFIX'
+ kw['target_factory'] = _POTargetFactory(env, alias='$POTUPDATE_ALIAS').File
+ kw['emitter'] = _pot_update_emitter
+ return _POTBuilder(**kw)
+
+
+#############################################################################
+
+#############################################################################
+def generate(env, **kw):
+ """ Generate `xgettext` tool """
+ import SCons.Util
+ from SCons.Tool.GettextCommon import RPaths, _detect_xgettext
+
+ try:
+ env['XGETTEXT'] = _detect_xgettext(env)
+ except:
+ env['XGETTEXT'] = 'xgettext'
+ # NOTE: sources="$SOURCES" would work as well. However, we use following
+ # construction to convert absolute paths provided by scons onto paths
+ # relative to current working dir. Note, that scons expands $SOURCE(S) to
+ # absolute paths for sources $SOURCE(s) outside of current subtree (e.g. in
+ # "../"). With source=$SOURCE these absolute paths would be written to the
+ # resultant *.pot file (and its derived *.po files) as references to lines in
+ # source code (e.g. referring lines in *.c files). Such references would be
+ # correct (e.g. in poedit) only on machine on which *.pot was generated and
+ # would be of no use on other hosts (having a copy of source code located
+ # in different place in filesystem).
+ sources = '$( ${_concat( "", SOURCES, "", __env__, XgettextRPaths, TARGET' \
+ + ', SOURCES)} $)'
+
+ # NOTE: the output from $XGETTEXTCOM command must go to stdout, not to a file.
+ # This is required by the POTUpdate builder's action.
+ xgettextcom = '$XGETTEXT $XGETTEXTFLAGS $_XGETTEXTPATHFLAGS' \
+ + ' $_XGETTEXTFROMFLAGS -o - ' + sources
+
+ xgettextpathflags = '$( ${_concat( XGETTEXTPATHPREFIX, XGETTEXTPATH' \
+ + ', XGETTEXTPATHSUFFIX, __env__, RDirs, TARGET, SOURCES)} $)'
+ xgettextfromflags = '$( ${_concat( XGETTEXTFROMPREFIX, XGETTEXTFROM' \
+ + ', XGETTEXTFROMSUFFIX, __env__, target=TARGET, source=SOURCES)} $)'
+
+ env.SetDefault(
+ _XGETTEXTDOMAIN='${TARGET.filebase}',
+ XGETTEXTFLAGS=[],
+ XGETTEXTCOM=xgettextcom,
+ XGETTEXTCOMSTR='',
+ XGETTEXTPATH=[],
+ XGETTEXTPATHPREFIX='-D',
+ XGETTEXTPATHSUFFIX='',
+ XGETTEXTFROM=None,
+ XGETTEXTFROMPREFIX='-f',
+ XGETTEXTFROMSUFFIX='',
+ _XGETTEXTPATHFLAGS=xgettextpathflags,
+ _XGETTEXTFROMFLAGS=xgettextfromflags,
+ POTSUFFIX=['.pot'],
+ POTUPDATE_ALIAS='pot-update',
+ XgettextRPaths=RPaths(env)
+ )
+ env.Append(BUILDERS={
+ '_POTUpdateBuilder': _POTUpdateBuilder(env)
+ })
+ env.AddMethod(_POTUpdateBuilderWrapper, 'POTUpdate')
+ env.AlwaysBuild(env.Alias('$POTUPDATE_ALIAS'))
+
+
+#############################################################################
+
+#############################################################################
+def exists(env):
+ """ Check, whether the tool exists """
+ from SCons.Tool.GettextCommon import _xgettext_exists
+ try:
+ return _xgettext_exists(env)
+ except:
+ return False
+
+#############################################################################
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/xgettext.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/xgettext.xml
new file mode 100644
index 0000000..380f92a
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/xgettext.xml
@@ -0,0 +1,373 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+__COPYRIGHT__
+
+This file is processed by the bin/SConsDoc.py module.
+See its __doc__ string for a discussion of the format.
+-->
+
+<!DOCTYPE sconsdoc [
+<!ENTITY % scons SYSTEM '../../../../doc/scons.mod'>
+%scons;
+<!ENTITY % builders-mod SYSTEM '../../../../doc/generated/builders.mod'>
+%builders-mod;
+<!ENTITY % functions-mod SYSTEM '../../../../doc/generated/functions.mod'>
+%functions-mod;
+<!ENTITY % tools-mod SYSTEM '../../../../doc/generated/tools.mod'>
+%tools-mod;
+<!ENTITY % variables-mod SYSTEM '../../../../doc/generated/variables.mod'>
+%variables-mod;
+]>
+
+<sconsdoc xmlns="http://www.scons.org/dbxsd/v1.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://www.scons.org/dbxsd/v1.0 http://www.scons.org/dbxsd/v1.0/scons.xsd">
+
+<tool name="xgettext">
+<summary>
+<para>
+This scons tool is a part of scons &t-link-gettext; toolset. It provides
+scons interface to <command>xgettext(1)</command>
+program, which extracts internationalized messages from source code. The tool
+provides &b-POTUpdate; builder to make <literal>PO</literal>
+<emphasis>Template</emphasis> files.
+</para>
+</summary>
+<sets>
+<item>POTSUFFIX</item>
+<item>POTUPDATE_ALIAS</item>
+<item>XGETTEXTCOM</item>
+<item>XGETTEXTCOMSTR</item>
+<item>XGETTEXTFLAGS</item>
+<item>XGETTEXTFROM</item>
+<item>XGETTEXTFROMPREFIX</item>
+<item>XGETTEXTFROMSUFFIX</item>
+<item>XGETTEXTPATH</item>
+<item>XGETTEXTPATHPREFIX</item>
+<item>XGETTEXTPATHSUFFIX</item>
+<item>_XGETTEXTDOMAIN</item>
+<item>_XGETTEXTFROMFLAGS</item>
+<item>_XGETTEXTPATHFLAGS</item>
+</sets>
+<uses>
+<item>POTDOMAIN</item>
+</uses>
+</tool>
+
+<builder name="POTUpdate">
+<summary>
+<para>
+The builder belongs to &t-link-xgettext; tool. The builder updates target
+<literal>POT</literal> file if exists or creates one if it doesn't. The node is
+not built by default (i.e. it is <literal>Ignore</literal>d from
+<literal>'.'</literal>), but only on demand (i.e. when given
+<literal>POT</literal> file is required or when special alias is invoked). This
+builder adds its targe node (<filename>messages.pot</filename>, say) to a
+special alias (<literal>pot-update</literal> by default, see
+&cv-link-POTUPDATE_ALIAS;) so you can update/create them easily with
+<command>scons pot-update</command>. The file is not written until there is no
+real change in internationalized messages (or in comments that enter
+<literal>POT</literal> file).
+</para>
+
+<para>
+<note> <para>You may see <command>xgettext(1)</command> being invoked by the
+&t-link-xgettext; tool even if there is no real change in internationalized
+messages (so the <literal>POT</literal> file is not being updated). This
+happens every time a source file has changed. In such case we invoke
+<command>xgettext(1)</command> and compare its output with the content of
+<literal>POT</literal> file to decide whether the file should be updated or
+not.</para></note>
+</para>
+
+<para>
+<emphasis>Example 1.</emphasis>
+Let's create <filename>po/</filename> directory and place following
+<filename>SConstruct</filename> script there:
+</para>
+<example_commands>
+ # SConstruct in 'po/' subdir
+ env = Environment( tools = ['default', 'xgettext'] )
+ env.POTUpdate(['foo'], ['../a.cpp', '../b.cpp'])
+ env.POTUpdate(['bar'], ['../c.cpp', '../d.cpp'])
+</example_commands>
+<para>
+Then invoke scons few times:
+</para>
+<example_commands>
+ user@host:$ scons # Does not create foo.pot nor bar.pot
+ user@host:$ scons foo.pot # Updates or creates foo.pot
+ user@host:$ scons pot-update # Updates or creates foo.pot and bar.pot
+ user@host:$ scons -c # Does not clean foo.pot nor bar.pot.
+</example_commands>
+<para>
+the results shall be as the comments above say.
+</para>
+
+<para>
+<emphasis>Example 2.</emphasis>
+The &b-POTUpdate; builder may be used with no target specified, in which
+case default target <filename>messages.pot</filename> will be used. The
+default target may also be overridden by setting &cv-link-POTDOMAIN; construction
+variable or providing it as an override to &b-POTUpdate; builder:
+</para>
+<example_commands>
+ # SConstruct script
+ env = Environment( tools = ['default', 'xgettext'] )
+ env['POTDOMAIN'] = "foo"
+ env.POTUpdate(source = ["a.cpp", "b.cpp"]) # Creates foo.pot ...
+ env.POTUpdate(POTDOMAIN = "bar", source = ["c.cpp", "d.cpp"]) # and bar.pot
+</example_commands>
+
+<para>
+<emphasis>Example 3.</emphasis>
+The sources may be specified within separate file, for example
+<filename>POTFILES.in</filename>:
+</para>
+<example_commands>
+ # POTFILES.in in 'po/' subdirectory
+ ../a.cpp
+ ../b.cpp
+ # end of file
+</example_commands>
+<para>
+The name of the file (<filename>POTFILES.in</filename>) containing the list of
+sources is provided via &cv-link-XGETTEXTFROM;:
+</para>
+<example_commands>
+ # SConstruct file in 'po/' subdirectory
+ env = Environment( tools = ['default', 'xgettext'] )
+ env.POTUpdate(XGETTEXTFROM = 'POTFILES.in')
+</example_commands>
+
+<para>
+<emphasis>Example 4.</emphasis>
+You may use &cv-link-XGETTEXTPATH; to define source search path. Assume, for
+example, that you have files <filename>a.cpp</filename>,
+<filename>b.cpp</filename>, <filename>po/SConstruct</filename>,
+<filename>po/POTFILES.in</filename>. Then your <literal>POT</literal>-related
+files could look as below:
+</para>
+<example_commands>
+ # POTFILES.in in 'po/' subdirectory
+ a.cpp
+ b.cpp
+ # end of file
+</example_commands>
+
+<example_commands>
+ # SConstruct file in 'po/' subdirectory
+ env = Environment( tools = ['default', 'xgettext'] )
+ env.POTUpdate(XGETTEXTFROM = 'POTFILES.in', XGETTEXTPATH='../')
+</example_commands>
+
+<para>
+<emphasis>Example 5.</emphasis>
+Multiple search directories may be defined within a list, i.e.
+<literal>XGETTEXTPATH = ['dir1', 'dir2', ...]</literal>. The order in the list
+determines the search order of source files. The path to the first file found
+is used.
+</para>
+
+<para>
+Let's create <filename>0/1/po/SConstruct</filename> script:
+</para>
+<example_commands>
+ # SConstruct file in '0/1/po/' subdirectory
+ env = Environment( tools = ['default', 'xgettext'] )
+ env.POTUpdate(XGETTEXTFROM = 'POTFILES.in', XGETTEXTPATH=['../', '../../'])
+</example_commands>
+<para>
+and <filename>0/1/po/POTFILES.in</filename>:
+</para>
+<example_commands>
+ # POTFILES.in in '0/1/po/' subdirectory
+ a.cpp
+ # end of file
+</example_commands>
+<para>
+Write two <filename>*.cpp</filename> files, the first one is
+<filename>0/a.cpp</filename>:
+</para>
+<example_commands>
+ /* 0/a.cpp */
+ gettext("Hello from ../../a.cpp")
+</example_commands>
+<para>
+and the second is <filename>0/1/a.cpp</filename>:
+</para>
+<example_commands>
+ /* 0/1/a.cpp */
+ gettext("Hello from ../a.cpp")
+</example_commands>
+<para>
+then run scons. You'll obtain <literal>0/1/po/messages.pot</literal> with the
+message <literal>"Hello from ../a.cpp"</literal>. When you reverse order in
+<varname>$XGETTEXTFOM</varname>, i.e. when you write SConscript as
+</para>
+<example_commands>
+ # SConstruct file in '0/1/po/' subdirectory
+ env = Environment( tools = ['default', 'xgettext'] )
+ env.POTUpdate(XGETTEXTFROM = 'POTFILES.in', XGETTEXTPATH=['../../', '../'])
+</example_commands>
+<para>
+then the <filename>messages.pot</filename> will contain
+<literal>msgid "Hello from ../../a.cpp"</literal> line and not
+<literal>msgid "Hello from ../a.cpp"</literal>.
+</para>
+
+</summary>
+</builder>
+
+<!-- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -->
+<cvar name="POTSUFFIX">
+<summary>
+<para>
+Suffix used for PO Template files (default: <literal>'.pot'</literal>).
+See &t-link-xgettext; tool and &b-link-POTUpdate; builder.
+</para>
+</summary>
+</cvar>
+<!-- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -->
+<cvar name="POTUPDATE_ALIAS">
+<summary>
+<para>
+Name of the common phony target for all PO Templates created with
+&b-link-POUpdate; (default: <literal>'pot-update'</literal>).
+See &t-link-xgettext; tool and &b-link-POTUpdate; builder.
+</para>
+</summary>
+</cvar>
+<!-- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -->
+<cvar name="XGETTEXT">
+<summary>
+<para>
+Path to <command>xgettext(1)</command> program (found via
+<function>Detect()</function>).
+See &t-link-xgettext; tool and &b-link-POTUpdate; builder.
+</para>
+</summary>
+</cvar>
+<!-- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -->
+<cvar name="XGETTEXTCOM">
+<summary>
+<para>
+Complete xgettext command line.
+See &t-link-xgettext; tool and &b-link-POTUpdate; builder.
+</para>
+</summary>
+</cvar>
+<!-- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -->
+<cvar name="XGETTEXTCOMSTR">
+<summary>
+<para>
+A string that is shown when <command>xgettext(1)</command> command is invoked
+(default: <literal>''</literal>, which means "print &cv-link-XGETTEXTCOM;").
+See &t-link-xgettext; tool and &b-link-POTUpdate; builder.
+</para>
+</summary>
+</cvar>
+<!-- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -->
+<cvar name="XGETTEXTFLAGS">
+<summary>
+<para>
+Additional flags to <command>xgettext(1)</command>.
+See &t-link-xgettext; tool and &b-link-POTUpdate; builder.
+</para>
+</summary>
+</cvar>
+<!-- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -->
+<cvar name="XGETTEXTFROM">
+<summary>
+<para>
+Name of file containing list of <command>xgettext(1)</command>'s source
+files. Autotools' users know this as <filename>POTFILES.in</filename> so they
+will in most cases set <literal>XGETTEXTFROM="POTFILES.in"</literal> here.
+The &cv-XGETTEXTFROM; files have same syntax and semantics as the well known
+GNU <filename>POTFILES.in</filename>.
+See &t-link-xgettext; tool and &b-link-POTUpdate; builder.
+</para>
+</summary>
+</cvar>
+<!-- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -->
+<cvar name="XGETTEXTPATH">
+<summary>
+<para>
+List of directories, there <command>xgettext(1)</command> will look for
+source files (default: <literal>[]</literal>).
+<note><para>
+This variable works only together with &cv-link-XGETTEXTFROM;
+</para></note>
+See also &t-link-xgettext; tool and &b-link-POTUpdate; builder.
+</para>
+</summary>
+</cvar>
+<!-- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -->
+<cvar name="XGETTEXTPATHPREFIX">
+<summary>
+<para>
+This flag is used to add single search path to
+<command>xgettext(1)</command>'s commandline (default:
+<literal>'-D'</literal>).
+</para>
+</summary>
+</cvar>
+<!-- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -->
+<cvar name="XGETTEXTPATHSUFFIX">
+<summary>
+<para>
+(default: <literal>''</literal>)
+</para>
+</summary>
+</cvar>
+<!-- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -->
+<cvar name="XGETTEXTFROMPREFIX">
+<summary>
+<para>
+This flag is used to add single &cv-link-XGETTEXTFROM; file to
+<command>xgettext(1)</command>'s commandline (default:
+<literal>'-f'</literal>).
+</para>
+</summary>
+</cvar>
+<!-- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -->
+<cvar name="XGETTEXTFROMSUFFIX">
+<summary>
+<para>
+(default: <literal>''</literal>)
+</para>
+</summary>
+</cvar>
+<!-- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -->
+<cvar name="_XGETTEXTDOMAIN">
+<summary>
+<para>
+Internal "macro". Generates <command>xgettext</command> domain name
+form source and target (default: <literal>'${TARGET.filebase}'</literal>).
+</para>
+</summary>
+</cvar>
+<!-- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -->
+<cvar name="_XGETTEXTFROMFLAGS">
+<summary>
+<para>
+Internal "macro". Genrates list of <literal>-D&lt;dir&gt;</literal> flags
+from the &cv-link-XGETTEXTPATH; list.
+</para>
+</summary>
+</cvar>
+<!-- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -->
+<cvar name="_XGETTEXTPATHFLAGS">
+<summary>
+<para>
+Internal "macro". Generates list of <literal>-f&lt;file&gt;</literal> flags
+from &cv-link-XGETTEXTFROM;.
+</para>
+</summary>
+</cvar>
+
+<!--
+
+-->
+
+</sconsdoc>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/yacc.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/yacc.py
new file mode 100644
index 0000000..648433b
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/yacc.py
@@ -0,0 +1,132 @@
+"""SCons.Tool.yacc
+
+Tool-specific initialization for yacc.
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import os.path
+
+import SCons.Defaults
+import SCons.Tool
+import SCons.Util
+
+YaccAction = SCons.Action.Action("$YACCCOM", "$YACCCOMSTR")
+
+def _yaccEmitter(target, source, env, ysuf, hsuf):
+ yaccflags = env.subst("$YACCFLAGS", target=target, source=source)
+ flags = SCons.Util.CLVar(yaccflags)
+ targetBase, targetExt = os.path.splitext(SCons.Util.to_String(target[0]))
+
+ if '.ym' in ysuf: # If using Objective-C
+ target = [targetBase + ".m"] # the extension is ".m".
+
+
+ # If -d is specified on the command line, yacc will emit a .h
+ # or .hpp file with the same name as the .c or .cpp output file.
+ if '-d' in flags:
+ target.append(targetBase + env.subst(hsuf, target=target, source=source))
+
+ # If -g is specified on the command line, yacc will emit a .vcg
+ # file with the same base name as the .y, .yacc, .ym or .yy file.
+ if "-g" in flags:
+ base, ext = os.path.splitext(SCons.Util.to_String(source[0]))
+ target.append(base + env.subst("$YACCVCGFILESUFFIX"))
+
+ # If -v is specified yacc will create the output debug file
+ # which is not really source for any process, but should
+ # be noted and also be cleaned
+ # Bug #2558
+ if "-v" in flags:
+ env.SideEffect(targetBase+'.output',target[0])
+ env.Clean(target[0],targetBase+'.output')
+
+
+
+ # With --defines and --graph, the name of the file is totally defined
+ # in the options.
+ fileGenOptions = ["--defines=", "--graph="]
+ for option in flags:
+ for fileGenOption in fileGenOptions:
+ l = len(fileGenOption)
+ if option[:l] == fileGenOption:
+ # A file generating option is present, so add the file
+ # name to the list of targets.
+ fileName = option[l:].strip()
+ target.append(fileName)
+
+ return (target, source)
+
+def yEmitter(target, source, env):
+ return _yaccEmitter(target, source, env, ['.y', '.yacc'], '$YACCHFILESUFFIX')
+
+def ymEmitter(target, source, env):
+ return _yaccEmitter(target, source, env, ['.ym'], '$YACCHFILESUFFIX')
+
+def yyEmitter(target, source, env):
+ return _yaccEmitter(target, source, env, ['.yy'], '$YACCHXXFILESUFFIX')
+
+def generate(env):
+ """Add Builders and construction variables for yacc to an Environment."""
+ c_file, cxx_file = SCons.Tool.createCFileBuilders(env)
+
+ # C
+ c_file.add_action('.y', YaccAction)
+ c_file.add_emitter('.y', yEmitter)
+
+ c_file.add_action('.yacc', YaccAction)
+ c_file.add_emitter('.yacc', yEmitter)
+
+ # Objective-C
+ c_file.add_action('.ym', YaccAction)
+ c_file.add_emitter('.ym', ymEmitter)
+
+ # C++
+ cxx_file.add_action('.yy', YaccAction)
+ cxx_file.add_emitter('.yy', yyEmitter)
+
+ env['YACC'] = env.Detect('bison') or 'yacc'
+ env['YACCFLAGS'] = SCons.Util.CLVar('')
+ env['YACCCOM'] = '$YACC $YACCFLAGS -o $TARGET $SOURCES'
+ env['YACCHFILESUFFIX'] = '.h'
+
+ env['YACCHXXFILESUFFIX'] = '.hpp'
+
+ env['YACCVCGFILESUFFIX'] = '.vcg'
+
+def exists(env):
+ return env.Detect(['bison', 'yacc'])
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/yacc.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/yacc.xml
new file mode 100644
index 0000000..48ec4b0
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/yacc.xml
@@ -0,0 +1,152 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+__COPYRIGHT__
+
+This file is processed by the bin/SConsDoc.py module.
+See its __doc__ string for a discussion of the format.
+-->
+
+<!DOCTYPE sconsdoc [
+<!ENTITY % scons SYSTEM '../../../../doc/scons.mod'>
+%scons;
+<!ENTITY % builders-mod SYSTEM '../../../../doc/generated/builders.mod'>
+%builders-mod;
+<!ENTITY % functions-mod SYSTEM '../../../../doc/generated/functions.mod'>
+%functions-mod;
+<!ENTITY % tools-mod SYSTEM '../../../../doc/generated/tools.mod'>
+%tools-mod;
+<!ENTITY % variables-mod SYSTEM '../../../../doc/generated/variables.mod'>
+%variables-mod;
+]>
+
+<sconsdoc xmlns="http://www.scons.org/dbxsd/v1.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://www.scons.org/dbxsd/v1.0 http://www.scons.org/dbxsd/v1.0/scons.xsd">
+
+<tool name="yacc">
+<summary>
+<para>
+Sets construction variables for the &yacc; parse generator.
+</para>
+</summary>
+<sets>
+<item>YACC</item>
+<item>YACCFLAGS</item>
+<item>YACCCOM</item>
+<item>YACCHFILESUFFIX</item>
+<item>YACCHXXFILESUFFIX</item>
+<item>YACCVCGFILESUFFIX</item>
+</sets>
+<uses>
+<item>YACCCOMSTR</item>
+</uses>
+</tool>
+
+<cvar name="YACC">
+<summary>
+<para>
+The parser generator.
+</para>
+</summary>
+</cvar>
+
+<cvar name="YACCCOM">
+<summary>
+<para>
+The command line used to call the parser generator
+to generate a source file.
+</para>
+</summary>
+</cvar>
+
+<cvar name="YACCCOMSTR">
+<summary>
+<para>
+The string displayed when generating a source file
+using the parser generator.
+If this is not set, then &cv-link-YACCCOM; (the command line) is displayed.
+</para>
+
+<example_commands>
+env = Environment(YACCCOMSTR = "Yacc'ing $TARGET from $SOURCES")
+</example_commands>
+</summary>
+</cvar>
+
+<cvar name="YACCFLAGS">
+<summary>
+<para>
+General options passed to the parser generator.
+If &cv-link-YACCFLAGS; contains a <option>-d</option> option,
+SCons assumes that the call will also create a .h file
+(if the yacc source file ends in a .y suffix)
+or a .hpp file
+(if the yacc source file ends in a .yy suffix)
+</para>
+</summary>
+</cvar>
+
+<cvar name="YACCHFILESUFFIX">
+<summary>
+<para>
+The suffix of the C
+header file generated by the parser generator
+when the
+<option>-d</option>
+option is used.
+Note that setting this variable does not cause
+the parser generator to generate a header
+file with the specified suffix,
+it exists to allow you to specify
+what suffix the parser generator will use of its own accord.
+The default value is
+<filename>.h</filename>.
+</para>
+</summary>
+</cvar>
+
+<cvar name="YACCHXXFILESUFFIX">
+<summary>
+<para>
+The suffix of the C++
+header file generated by the parser generator
+when the
+<option>-d</option>
+option is used.
+Note that setting this variable does not cause
+the parser generator to generate a header
+file with the specified suffix,
+it exists to allow you to specify
+what suffix the parser generator will use of its own accord.
+The default value is
+<filename>.hpp</filename>,
+except on Mac OS X,
+where the default is
+<filename>${TARGET.suffix}.h</filename>.
+because the default &bison; parser generator just
+appends <filename>.h</filename>
+to the name of the generated C++ file.
+</para>
+</summary>
+</cvar>
+
+<cvar name="YACCVCGFILESUFFIX">
+<summary>
+<para>
+The suffix of the file
+containing the VCG grammar automaton definition
+when the
+<option>--graph=</option>
+option is used.
+Note that setting this variable does not cause
+the parser generator to generate a VCG
+file with the specified suffix,
+it exists to allow you to specify
+what suffix the parser generator will use of its own accord.
+The default value is
+<filename>.vcg</filename>.
+</para>
+</summary>
+</cvar>
+
+</sconsdoc>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/zip.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/zip.py
new file mode 100644
index 0000000..23d540f
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/zip.py
@@ -0,0 +1,92 @@
+"""SCons.Tool.zip
+
+Tool-specific initialization for zip.
+
+There normally shouldn't be any need to import this module directly.
+It will usually be imported through the generic SCons.Tool.Tool()
+selection method.
+
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import os.path
+
+import SCons.Builder
+import SCons.Defaults
+import SCons.Node.FS
+import SCons.Util
+
+import zipfile
+
+zipcompression = zipfile.ZIP_DEFLATED
+def zip(target, source, env):
+ compression = env.get('ZIPCOMPRESSION', 0)
+ zf = zipfile.ZipFile(str(target[0]), 'w', compression)
+ for s in source:
+ if s.isdir():
+ for dirpath, dirnames, filenames in os.walk(str(s)):
+ for fname in filenames:
+ path = os.path.join(dirpath, fname)
+ if os.path.isfile(path):
+
+ zf.write(path, os.path.relpath(path, str(env.get('ZIPROOT', ''))))
+ else:
+ zf.write(str(s), os.path.relpath(str(s), str(env.get('ZIPROOT', ''))))
+ zf.close()
+
+zipAction = SCons.Action.Action(zip, varlist=['ZIPCOMPRESSION'])
+
+ZipBuilder = SCons.Builder.Builder(action = SCons.Action.Action('$ZIPCOM', '$ZIPCOMSTR'),
+ source_factory = SCons.Node.FS.Entry,
+ source_scanner = SCons.Defaults.DirScanner,
+ suffix = '$ZIPSUFFIX',
+ multi = 1)
+
+
+def generate(env):
+ """Add Builders and construction variables for zip to an Environment."""
+ try:
+ bld = env['BUILDERS']['Zip']
+ except KeyError:
+ bld = ZipBuilder
+ env['BUILDERS']['Zip'] = bld
+
+ env['ZIP'] = 'zip'
+ env['ZIPFLAGS'] = SCons.Util.CLVar('')
+ env['ZIPCOM'] = zipAction
+ env['ZIPCOMPRESSION'] = zipcompression
+ env['ZIPSUFFIX'] = '.zip'
+ env['ZIPROOT'] = SCons.Util.CLVar('')
+
+def exists(env):
+ return True
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/zip.xml b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/zip.xml
new file mode 100644
index 0000000..2791909
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Tool/zip.xml
@@ -0,0 +1,167 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+__COPYRIGHT__
+
+This file is processed by the bin/SConsDoc.py module.
+See its __doc__ string for a discussion of the format.
+-->
+
+<!DOCTYPE sconsdoc [
+<!ENTITY % scons SYSTEM '../../../../doc/scons.mod'>
+%scons;
+<!ENTITY % builders-mod SYSTEM '../../../../doc/generated/builders.mod'>
+%builders-mod;
+<!ENTITY % functions-mod SYSTEM '../../../../doc/generated/functions.mod'>
+%functions-mod;
+<!ENTITY % tools-mod SYSTEM '../../../../doc/generated/tools.mod'>
+%tools-mod;
+<!ENTITY % variables-mod SYSTEM '../../../../doc/generated/variables.mod'>
+%variables-mod;
+]>
+
+<sconsdoc xmlns="http://www.scons.org/dbxsd/v1.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://www.scons.org/dbxsd/v1.0 http://www.scons.org/dbxsd/v1.0/scons.xsd">
+
+<tool name="zip">
+<summary>
+<para>
+Sets construction variables for the &zip; archiver.
+</para>
+</summary>
+<sets>
+<item>ZIP</item>
+<item>ZIPFLAGS</item>
+<item>ZIPCOM</item>
+<item>ZIPCOMPRESSION</item>
+<item>ZIPSUFFIX</item>
+</sets>
+<uses>
+<item>ZIPCOMSTR</item>
+</uses>
+</tool>
+
+<builder name="Zip">
+<summary>
+<para>
+Builds a zip archive of the specified files
+and/or directories.
+Unlike most builder methods,
+the
+&b-Zip;
+builder method may be called multiple times
+for a given target;
+each additional call
+adds to the list of entries
+that will be built into the archive.
+Any source directories will
+be scanned for changes to
+any on-disk files,
+regardless of whether or not
+&scons;
+knows about them from other Builder or function calls.
+</para>
+
+<example_commands>
+env.Zip('src.zip', 'src')
+
+# Create the stuff.zip file.
+env.Zip('stuff', ['subdir1', 'subdir2'])
+# Also add "another" to the stuff.tar file.
+env.Zip('stuff', 'another')
+</example_commands>
+</summary>
+</builder>
+
+<cvar name="ZIP">
+<summary>
+<para>
+The zip compression and file packaging utility.
+</para>
+</summary>
+</cvar>
+
+<cvar name="ZIPCOM">
+<summary>
+<para>
+The command line used to call the zip utility,
+or the internal Python function used to create a
+zip archive.
+</para>
+</summary>
+</cvar>
+
+<cvar name="ZIPCOMSTR">
+<summary>
+<para>
+The string displayed when archiving files
+using the zip utility.
+If this is not set, then &cv-link-ZIPCOM;
+(the command line or internal Python function) is displayed.
+</para>
+
+<example_commands>
+env = Environment(ZIPCOMSTR = "Zipping $TARGET")
+</example_commands>
+</summary>
+</cvar>
+
+<cvar name="ZIPCOMPRESSION">
+<summary>
+<para>
+The
+<varname>compression</varname>
+flag
+from the Python
+<filename>zipfile</filename>
+module used by the internal Python function
+to control whether the zip archive
+is compressed or not.
+The default value is
+<literal>zipfile.ZIP_DEFLATED</literal>,
+which creates a compressed zip archive.
+This value has no effect if the
+<literal>zipfile</literal>
+module is unavailable.
+</para>
+</summary>
+</cvar>
+
+<cvar name="ZIPFLAGS">
+<summary>
+<para>
+General options passed to the zip utility.
+</para>
+</summary>
+</cvar>
+
+<cvar name="ZIPSUFFIX">
+<summary>
+<para>
+The suffix used for zip file names.
+</para>
+</summary>
+</cvar>
+
+<cvar name="ZIPROOT">
+<summary>
+<para>
+An optional zip root directory (default empty). The filenames stored
+in the zip file will be relative to this directory, if given.
+Otherwise the filenames are relative to the current directory of the
+command.
+For instance:
+</para>
+<example_commands>
+env = Environment()
+env.Zip('foo.zip', 'subdir1/subdir2/file1', ZIPROOT='subdir1')
+</example_commands>
+<para>
+will produce a zip file <literal>foo.zip</literal>
+containing a file with the name
+<literal>subdir2/file1</literal> rather than
+<literal>subdir1/subdir2/file1</literal>.
+</para>
+</summary>
+</cvar>
+</sconsdoc>
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Util.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Util.py
new file mode 100644
index 0000000..98c9e85
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Util.py
@@ -0,0 +1,1637 @@
+"""SCons.Util
+
+Various utility functions go here.
+"""
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import os
+import sys
+import copy
+import re
+import types
+import codecs
+import pprint
+
+PY3 = sys.version_info[0] == 3
+
+try:
+ from UserDict import UserDict
+except ImportError as e:
+ from collections import UserDict
+
+try:
+ from UserList import UserList
+except ImportError as e:
+ from collections import UserList
+
+from collections import Iterable
+
+try:
+ from UserString import UserString
+except ImportError as e:
+ from collections import UserString
+
+# Don't "from types import ..." these because we need to get at the
+# types module later to look for UnicodeType.
+
+# Below not used?
+# InstanceType = types.InstanceType
+
+MethodType = types.MethodType
+FunctionType = types.FunctionType
+
+try:
+ unicode
+except NameError:
+ UnicodeType = str
+else:
+ UnicodeType = unicode
+
+def dictify(keys, values, result={}):
+ for k, v in zip(keys, values):
+ result[k] = v
+ return result
+
+_altsep = os.altsep
+if _altsep is None and sys.platform == 'win32':
+ # My ActivePython 2.0.1 doesn't set os.altsep! What gives?
+ _altsep = '/'
+if _altsep:
+ def rightmost_separator(path, sep):
+ return max(path.rfind(sep), path.rfind(_altsep))
+else:
+ def rightmost_separator(path, sep):
+ return path.rfind(sep)
+
+# First two from the Python Cookbook, just for completeness.
+# (Yeah, yeah, YAGNI...)
+def containsAny(str, set):
+ """Check whether sequence str contains ANY of the items in set."""
+ for c in set:
+ if c in str: return 1
+ return 0
+
+def containsAll(str, set):
+ """Check whether sequence str contains ALL of the items in set."""
+ for c in set:
+ if c not in str: return 0
+ return 1
+
+def containsOnly(str, set):
+ """Check whether sequence str contains ONLY items in set."""
+ for c in str:
+ if c not in set: return 0
+ return 1
+
+def splitext(path):
+ "Same as os.path.splitext() but faster."
+ sep = rightmost_separator(path, os.sep)
+ dot = path.rfind('.')
+ # An ext is only real if it has at least one non-digit char
+ if dot > sep and not containsOnly(path[dot:], "0123456789."):
+ return path[:dot],path[dot:]
+ else:
+ return path,""
+
+def updrive(path):
+ """
+ Make the drive letter (if any) upper case.
+ This is useful because Windows is inconsistent on the case
+ of the drive letter, which can cause inconsistencies when
+ calculating command signatures.
+ """
+ drive, rest = os.path.splitdrive(path)
+ if drive:
+ path = drive.upper() + rest
+ return path
+
+class NodeList(UserList):
+ """This class is almost exactly like a regular list of Nodes
+ (actually it can hold any object), with one important difference.
+ If you try to get an attribute from this list, it will return that
+ attribute from every item in the list. For example:
+
+ >>> someList = NodeList([ ' foo ', ' bar ' ])
+ >>> someList.strip()
+ [ 'foo', 'bar' ]
+ """
+
+# def __init__(self, initlist=None):
+# self.data = []
+# # print("TYPE:%s"%type(initlist))
+# if initlist is not None:
+# # XXX should this accept an arbitrary sequence?
+# if type(initlist) == type(self.data):
+# self.data[:] = initlist
+# elif isinstance(initlist, (UserList, NodeList)):
+# self.data[:] = initlist.data[:]
+# elif isinstance(initlist, Iterable):
+# self.data = list(initlist)
+# else:
+# self.data = [ initlist,]
+
+
+ def __nonzero__(self):
+ return len(self.data) != 0
+
+ def __bool__(self):
+ return self.__nonzero__()
+
+ def __str__(self):
+ return ' '.join(map(str, self.data))
+
+ def __iter__(self):
+ return iter(self.data)
+
+ def __call__(self, *args, **kwargs):
+ result = [x(*args, **kwargs) for x in self.data]
+ return self.__class__(result)
+
+ def __getattr__(self, name):
+ result = [getattr(x, name) for x in self.data]
+ return self.__class__(result)
+
+ def __getitem__(self, index):
+ """
+ This comes for free on py2,
+ but py3 slices of NodeList are returning a list
+ breaking slicing nodelist and refering to
+ properties and methods on contained object
+ """
+# return self.__class__(self.data[index])
+
+ if isinstance(index, slice):
+ # Expand the slice object using range()
+ # limited by number of items in self.data
+ indices = index.indices(len(self.data))
+ return self.__class__([self[x] for x in
+ range(*indices)])
+ else:
+ # Return one item of the tart
+ return self.data[index]
+
+
+_get_env_var = re.compile(r'^\$([_a-zA-Z]\w*|{[_a-zA-Z]\w*})$')
+
+def get_environment_var(varstr):
+ """Given a string, first determine if it looks like a reference
+ to a single environment variable, like "$FOO" or "${FOO}".
+ If so, return that variable with no decorations ("FOO").
+ If not, return None."""
+ mo=_get_env_var.match(to_String(varstr))
+ if mo:
+ var = mo.group(1)
+ if var[0] == '{':
+ return var[1:-1]
+ else:
+ return var
+ else:
+ return None
+
+class DisplayEngine(object):
+ print_it = True
+ def __call__(self, text, append_newline=1):
+ if not self.print_it:
+ return
+ if append_newline: text = text + '\n'
+ try:
+ sys.stdout.write(UnicodeType(text))
+ except IOError:
+ # Stdout might be connected to a pipe that has been closed
+ # by now. The most likely reason for the pipe being closed
+ # is that the user has press ctrl-c. It this is the case,
+ # then SCons is currently shutdown. We therefore ignore
+ # IOError's here so that SCons can continue and shutdown
+ # properly so that the .sconsign is correctly written
+ # before SCons exits.
+ pass
+
+ def set_mode(self, mode):
+ self.print_it = mode
+
+
+def render_tree(root, child_func, prune=0, margin=[0], visited=None):
+ """
+ Render a tree of nodes into an ASCII tree view.
+
+ :Parameters:
+ - `root`: the root node of the tree
+ - `child_func`: the function called to get the children of a node
+ - `prune`: don't visit the same node twice
+ - `margin`: the format of the left margin to use for children of root. 1 results in a pipe, and 0 results in no pipe.
+ - `visited`: a dictionary of visited nodes in the current branch if not prune, or in the whole tree if prune.
+ """
+
+ rname = repr(str(root))
+
+ # Initialize 'visited' dict, if required
+ if visited is None:
+ visited = {}
+
+ children = child_func(root)
+ retval = ""
+ for pipe in margin[:-1]:
+ if pipe:
+ retval = retval + "| "
+ else:
+ retval = retval + " "
+
+ if rname in visited:
+ return retval + "+-[" + rname + "]\n"
+
+ retval = retval + "+-" + rname + "\n"
+ if not prune:
+ visited = copy.copy(visited)
+ visited[rname] = 1
+
+ for i in range(len(children)):
+ margin.append(i < len(children)-1)
+ retval = retval + render_tree(children[i], child_func, prune, margin, visited)
+ margin.pop()
+
+ return retval
+
+IDX = lambda N: N and 1 or 0
+
+
+def print_tree(root, child_func, prune=0, showtags=0, margin=[0], visited=None):
+ """
+ Print a tree of nodes. This is like render_tree, except it prints
+ lines directly instead of creating a string representation in memory,
+ so that huge trees can be printed.
+
+ :Parameters:
+ - `root` - the root node of the tree
+ - `child_func` - the function called to get the children of a node
+ - `prune` - don't visit the same node twice
+ - `showtags` - print status information to the left of each node line
+ - `margin` - the format of the left margin to use for children of root. 1 results in a pipe, and 0 results in no pipe.
+ - `visited` - a dictionary of visited nodes in the current branch if not prune, or in the whole tree if prune.
+ """
+
+ rname = repr(str(root))
+
+
+ # Initialize 'visited' dict, if required
+ if visited is None:
+ visited = {}
+
+ if showtags:
+
+ if showtags == 2:
+ legend = (' E = exists\n' +
+ ' R = exists in repository only\n' +
+ ' b = implicit builder\n' +
+ ' B = explicit builder\n' +
+ ' S = side effect\n' +
+ ' P = precious\n' +
+ ' A = always build\n' +
+ ' C = current\n' +
+ ' N = no clean\n' +
+ ' H = no cache\n' +
+ '\n')
+ sys.stdout.write(legend)
+
+ tags = ['[']
+ tags.append(' E'[IDX(root.exists())])
+ tags.append(' R'[IDX(root.rexists() and not root.exists())])
+ tags.append(' BbB'[[0,1][IDX(root.has_explicit_builder())] +
+ [0,2][IDX(root.has_builder())]])
+ tags.append(' S'[IDX(root.side_effect)])
+ tags.append(' P'[IDX(root.precious)])
+ tags.append(' A'[IDX(root.always_build)])
+ tags.append(' C'[IDX(root.is_up_to_date())])
+ tags.append(' N'[IDX(root.noclean)])
+ tags.append(' H'[IDX(root.nocache)])
+ tags.append(']')
+
+ else:
+ tags = []
+
+ def MMM(m):
+ return [" ","| "][m]
+ margins = list(map(MMM, margin[:-1]))
+
+ children = child_func(root)
+
+ if prune and rname in visited and children:
+ sys.stdout.write(''.join(tags + margins + ['+-[', rname, ']']) + '\n')
+ return
+
+ sys.stdout.write(''.join(tags + margins + ['+-', rname]) + '\n')
+
+ visited[rname] = 1
+
+ if children:
+ margin.append(1)
+ idx = IDX(showtags)
+ for C in children[:-1]:
+ print_tree(C, child_func, prune, idx, margin, visited)
+ margin[-1] = 0
+ print_tree(children[-1], child_func, prune, idx, margin, visited)
+ margin.pop()
+
+
+
+# Functions for deciding if things are like various types, mainly to
+# handle UserDict, UserList and UserString like their underlying types.
+#
+# Yes, all of this manual testing breaks polymorphism, and the real
+# Pythonic way to do all of this would be to just try it and handle the
+# exception, but handling the exception when it's not the right type is
+# often too slow.
+
+# We are using the following trick to speed up these
+# functions. Default arguments are used to take a snapshot of
+# the global functions and constants used by these functions. This
+# transforms accesses to global variable into local variables
+# accesses (i.e. LOAD_FAST instead of LOAD_GLOBAL).
+
+DictTypes = (dict, UserDict)
+ListTypes = (list, UserList)
+SequenceTypes = (list, tuple, UserList)
+
+# Note that profiling data shows a speed-up when comparing
+# explicitly with str and unicode instead of simply comparing
+# with basestring. (at least on Python 2.5.1)
+try:
+ StringTypes = (str, unicode, UserString)
+except NameError:
+ StringTypes = (str, UserString)
+
+# Empirically, it is faster to check explicitly for str and
+# unicode than for basestring.
+try:
+ BaseStringTypes = (str, unicode)
+except NameError:
+ BaseStringTypes = (str)
+
+def is_Dict(obj, isinstance=isinstance, DictTypes=DictTypes):
+ return isinstance(obj, DictTypes)
+
+def is_List(obj, isinstance=isinstance, ListTypes=ListTypes):
+ return isinstance(obj, ListTypes)
+
+def is_Sequence(obj, isinstance=isinstance, SequenceTypes=SequenceTypes):
+ return isinstance(obj, SequenceTypes)
+
+def is_Tuple(obj, isinstance=isinstance, tuple=tuple):
+ return isinstance(obj, tuple)
+
+def is_String(obj, isinstance=isinstance, StringTypes=StringTypes):
+ return isinstance(obj, StringTypes)
+
+def is_Scalar(obj, isinstance=isinstance, StringTypes=StringTypes, SequenceTypes=SequenceTypes):
+ # Profiling shows that there is an impressive speed-up of 2x
+ # when explicitly checking for strings instead of just not
+ # sequence when the argument (i.e. obj) is already a string.
+ # But, if obj is a not string then it is twice as fast to
+ # check only for 'not sequence'. The following code therefore
+ # assumes that the obj argument is a string most of the time.
+ return isinstance(obj, StringTypes) or not isinstance(obj, SequenceTypes)
+
+def do_flatten(sequence, result, isinstance=isinstance,
+ StringTypes=StringTypes, SequenceTypes=SequenceTypes):
+ for item in sequence:
+ if isinstance(item, StringTypes) or not isinstance(item, SequenceTypes):
+ result.append(item)
+ else:
+ do_flatten(item, result)
+
+def flatten(obj, isinstance=isinstance, StringTypes=StringTypes,
+ SequenceTypes=SequenceTypes, do_flatten=do_flatten):
+ """Flatten a sequence to a non-nested list.
+
+ Flatten() converts either a single scalar or a nested sequence
+ to a non-nested list. Note that flatten() considers strings
+ to be scalars instead of sequences like Python would.
+ """
+ if isinstance(obj, StringTypes) or not isinstance(obj, SequenceTypes):
+ return [obj]
+ result = []
+ for item in obj:
+ if isinstance(item, StringTypes) or not isinstance(item, SequenceTypes):
+ result.append(item)
+ else:
+ do_flatten(item, result)
+ return result
+
+def flatten_sequence(sequence, isinstance=isinstance, StringTypes=StringTypes,
+ SequenceTypes=SequenceTypes, do_flatten=do_flatten):
+ """Flatten a sequence to a non-nested list.
+
+ Same as flatten(), but it does not handle the single scalar
+ case. This is slightly more efficient when one knows that
+ the sequence to flatten can not be a scalar.
+ """
+ result = []
+ for item in sequence:
+ if isinstance(item, StringTypes) or not isinstance(item, SequenceTypes):
+ result.append(item)
+ else:
+ do_flatten(item, result)
+ return result
+
+# Generic convert-to-string functions that abstract away whether or
+# not the Python we're executing has Unicode support. The wrapper
+# to_String_for_signature() will use a for_signature() method if the
+# specified object has one.
+#
+def to_String(s,
+ isinstance=isinstance, str=str,
+ UserString=UserString, BaseStringTypes=BaseStringTypes):
+ if isinstance(s,BaseStringTypes):
+ # Early out when already a string!
+ return s
+ elif isinstance(s, UserString):
+ # s.data can only be either a unicode or a regular
+ # string. Please see the UserString initializer.
+ return s.data
+ else:
+ return str(s)
+
+def to_String_for_subst(s,
+ isinstance=isinstance, str=str, to_String=to_String,
+ BaseStringTypes=BaseStringTypes, SequenceTypes=SequenceTypes,
+ UserString=UserString):
+
+ # Note that the test cases are sorted by order of probability.
+ if isinstance(s, BaseStringTypes):
+ return s
+ elif isinstance(s, SequenceTypes):
+ return ' '.join([to_String_for_subst(e) for e in s])
+ elif isinstance(s, UserString):
+ # s.data can only be either a unicode or a regular
+ # string. Please see the UserString initializer.
+ return s.data
+ else:
+ return str(s)
+
+def to_String_for_signature(obj, to_String_for_subst=to_String_for_subst,
+ AttributeError=AttributeError):
+ try:
+ f = obj.for_signature
+ except AttributeError:
+ if isinstance(obj, dict):
+ # pprint will output dictionary in key sorted order
+ # with py3.5 the order was randomized. In general depending on dictionary order
+ # which was undefined until py3.6 (where it's by insertion order) was not wise.
+ return pprint.pformat(obj, width=1000000)
+ else:
+ return to_String_for_subst(obj)
+ else:
+ return f()
+
+
+# The SCons "semi-deep" copy.
+#
+# This makes separate copies of lists (including UserList objects)
+# dictionaries (including UserDict objects) and tuples, but just copies
+# references to anything else it finds.
+#
+# A special case is any object that has a __semi_deepcopy__() method,
+# which we invoke to create the copy. Currently only used by
+# BuilderDict to actually prevent the copy operation (as invalid on that object).
+#
+# The dispatch table approach used here is a direct rip-off from the
+# normal Python copy module.
+
+_semi_deepcopy_dispatch = d = {}
+
+def semi_deepcopy_dict(x, exclude = [] ):
+ copy = {}
+ for key, val in x.items():
+ # The regular Python copy.deepcopy() also deepcopies the key,
+ # as follows:
+ #
+ # copy[semi_deepcopy(key)] = semi_deepcopy(val)
+ #
+ # Doesn't seem like we need to, but we'll comment it just in case.
+ if key not in exclude:
+ copy[key] = semi_deepcopy(val)
+ return copy
+d[dict] = semi_deepcopy_dict
+
+def _semi_deepcopy_list(x):
+ return list(map(semi_deepcopy, x))
+d[list] = _semi_deepcopy_list
+
+def _semi_deepcopy_tuple(x):
+ return tuple(map(semi_deepcopy, x))
+d[tuple] = _semi_deepcopy_tuple
+
+def semi_deepcopy(x):
+ copier = _semi_deepcopy_dispatch.get(type(x))
+ if copier:
+ return copier(x)
+ else:
+ if hasattr(x, '__semi_deepcopy__') and callable(x.__semi_deepcopy__):
+ return x.__semi_deepcopy__()
+ elif isinstance(x, UserDict):
+ return x.__class__(semi_deepcopy_dict(x))
+ elif isinstance(x, UserList):
+ return x.__class__(_semi_deepcopy_list(x))
+
+ return x
+
+
+class Proxy(object):
+ """A simple generic Proxy class, forwarding all calls to
+ subject. So, for the benefit of the python newbie, what does
+ this really mean? Well, it means that you can take an object, let's
+ call it 'objA', and wrap it in this Proxy class, with a statement
+ like this
+
+ proxyObj = Proxy(objA),
+
+ Then, if in the future, you do something like this
+
+ x = proxyObj.var1,
+
+ since Proxy does not have a 'var1' attribute (but presumably objA does),
+ the request actually is equivalent to saying
+
+ x = objA.var1
+
+ Inherit from this class to create a Proxy.
+
+ Note that, with new-style classes, this does *not* work transparently
+ for Proxy subclasses that use special .__*__() method names, because
+ those names are now bound to the class, not the individual instances.
+ You now need to know in advance which .__*__() method names you want
+ to pass on to the underlying Proxy object, and specifically delegate
+ their calls like this:
+
+ class Foo(Proxy):
+ __str__ = Delegate('__str__')
+ """
+
+ def __init__(self, subject):
+ """Wrap an object as a Proxy object"""
+ self._subject = subject
+
+ def __getattr__(self, name):
+ """Retrieve an attribute from the wrapped object. If the named
+ attribute doesn't exist, AttributeError is raised"""
+ return getattr(self._subject, name)
+
+ def get(self):
+ """Retrieve the entire wrapped object"""
+ return self._subject
+
+ def __eq__(self, other):
+ if issubclass(other.__class__, self._subject.__class__):
+ return self._subject == other
+ return self.__dict__ == other.__dict__
+
+class Delegate(object):
+ """A Python Descriptor class that delegates attribute fetches
+ to an underlying wrapped subject of a Proxy. Typical use:
+
+ class Foo(Proxy):
+ __str__ = Delegate('__str__')
+ """
+ def __init__(self, attribute):
+ self.attribute = attribute
+ def __get__(self, obj, cls):
+ if isinstance(obj, cls):
+ return getattr(obj._subject, self.attribute)
+ else:
+ return self
+
+# attempt to load the windows registry module:
+can_read_reg = 0
+try:
+ import winreg
+
+ can_read_reg = 1
+ hkey_mod = winreg
+
+ RegOpenKeyEx = winreg.OpenKeyEx
+ RegEnumKey = winreg.EnumKey
+ RegEnumValue = winreg.EnumValue
+ RegQueryValueEx = winreg.QueryValueEx
+ RegError = winreg.error
+
+except ImportError:
+ try:
+ import win32api
+ import win32con
+ can_read_reg = 1
+ hkey_mod = win32con
+
+ RegOpenKeyEx = win32api.RegOpenKeyEx
+ RegEnumKey = win32api.RegEnumKey
+ RegEnumValue = win32api.RegEnumValue
+ RegQueryValueEx = win32api.RegQueryValueEx
+ RegError = win32api.error
+
+ except ImportError:
+ class _NoError(Exception):
+ pass
+ RegError = _NoError
+
+WinError = None
+# Make sure we have a definition of WindowsError so we can
+# run platform-independent tests of Windows functionality on
+# platforms other than Windows. (WindowsError is, in fact, an
+# OSError subclass on Windows.)
+class PlainWindowsError(OSError):
+ pass
+try:
+ WinError = WindowsError
+except NameError:
+ WinError = PlainWindowsError
+
+
+if can_read_reg:
+ HKEY_CLASSES_ROOT = hkey_mod.HKEY_CLASSES_ROOT
+ HKEY_LOCAL_MACHINE = hkey_mod.HKEY_LOCAL_MACHINE
+ HKEY_CURRENT_USER = hkey_mod.HKEY_CURRENT_USER
+ HKEY_USERS = hkey_mod.HKEY_USERS
+
+ def RegGetValue(root, key):
+ """This utility function returns a value in the registry
+ without having to open the key first. Only available on
+ Windows platforms with a version of Python that can read the
+ registry. Returns the same thing as
+ SCons.Util.RegQueryValueEx, except you just specify the entire
+ path to the value, and don't have to bother opening the key
+ first. So:
+
+ Instead of:
+ k = SCons.Util.RegOpenKeyEx(SCons.Util.HKEY_LOCAL_MACHINE,
+ r'SOFTWARE\Microsoft\Windows\CurrentVersion')
+ out = SCons.Util.RegQueryValueEx(k,
+ 'ProgramFilesDir')
+
+ You can write:
+ out = SCons.Util.RegGetValue(SCons.Util.HKEY_LOCAL_MACHINE,
+ r'SOFTWARE\Microsoft\Windows\CurrentVersion\ProgramFilesDir')
+ """
+ # I would use os.path.split here, but it's not a filesystem
+ # path...
+ p = key.rfind('\\') + 1
+ keyp = key[:p-1] # -1 to omit trailing slash
+ val = key[p:]
+ k = RegOpenKeyEx(root, keyp)
+ return RegQueryValueEx(k,val)
+else:
+ HKEY_CLASSES_ROOT = None
+ HKEY_LOCAL_MACHINE = None
+ HKEY_CURRENT_USER = None
+ HKEY_USERS = None
+
+ def RegGetValue(root, key):
+ raise WinError
+
+ def RegOpenKeyEx(root, key):
+ raise WinError
+
+if sys.platform == 'win32':
+
+ def WhereIs(file, path=None, pathext=None, reject=[]):
+ if path is None:
+ try:
+ path = os.environ['PATH']
+ except KeyError:
+ return None
+ if is_String(path):
+ path = path.split(os.pathsep)
+ if pathext is None:
+ try:
+ pathext = os.environ['PATHEXT']
+ except KeyError:
+ pathext = '.COM;.EXE;.BAT;.CMD'
+ if is_String(pathext):
+ pathext = pathext.split(os.pathsep)
+ for ext in pathext:
+ if ext.lower() == file[-len(ext):].lower():
+ pathext = ['']
+ break
+ if not is_List(reject) and not is_Tuple(reject):
+ reject = [reject]
+ for dir in path:
+ f = os.path.join(dir, file)
+ for ext in pathext:
+ fext = f + ext
+ if os.path.isfile(fext):
+ try:
+ reject.index(fext)
+ except ValueError:
+ return os.path.normpath(fext)
+ continue
+ return None
+
+elif os.name == 'os2':
+
+ def WhereIs(file, path=None, pathext=None, reject=[]):
+ if path is None:
+ try:
+ path = os.environ['PATH']
+ except KeyError:
+ return None
+ if is_String(path):
+ path = path.split(os.pathsep)
+ if pathext is None:
+ pathext = ['.exe', '.cmd']
+ for ext in pathext:
+ if ext.lower() == file[-len(ext):].lower():
+ pathext = ['']
+ break
+ if not is_List(reject) and not is_Tuple(reject):
+ reject = [reject]
+ for dir in path:
+ f = os.path.join(dir, file)
+ for ext in pathext:
+ fext = f + ext
+ if os.path.isfile(fext):
+ try:
+ reject.index(fext)
+ except ValueError:
+ return os.path.normpath(fext)
+ continue
+ return None
+
+else:
+
+ def WhereIs(file, path=None, pathext=None, reject=[]):
+ import stat
+ if path is None:
+ try:
+ path = os.environ['PATH']
+ except KeyError:
+ return None
+ if is_String(path):
+ path = path.split(os.pathsep)
+ if not is_List(reject) and not is_Tuple(reject):
+ reject = [reject]
+ for d in path:
+ f = os.path.join(d, file)
+ if os.path.isfile(f):
+ try:
+ st = os.stat(f)
+ except OSError:
+ # os.stat() raises OSError, not IOError if the file
+ # doesn't exist, so in this case we let IOError get
+ # raised so as to not mask possibly serious disk or
+ # network issues.
+ continue
+ if stat.S_IMODE(st[stat.ST_MODE]) & 0o111:
+ try:
+ reject.index(f)
+ except ValueError:
+ return os.path.normpath(f)
+ continue
+ return None
+
+def PrependPath(oldpath, newpath, sep = os.pathsep,
+ delete_existing=1, canonicalize=None):
+ """This prepends newpath elements to the given oldpath. Will only
+ add any particular path once (leaving the first one it encounters
+ and ignoring the rest, to preserve path order), and will
+ os.path.normpath and os.path.normcase all paths to help assure
+ this. This can also handle the case where the given old path
+ variable is a list instead of a string, in which case a list will
+ be returned instead of a string.
+
+ Example:
+ Old Path: "/foo/bar:/foo"
+ New Path: "/biz/boom:/foo"
+ Result: "/biz/boom:/foo:/foo/bar"
+
+ If delete_existing is 0, then adding a path that exists will
+ not move it to the beginning; it will stay where it is in the
+ list.
+
+ If canonicalize is not None, it is applied to each element of
+ newpath before use.
+ """
+
+ orig = oldpath
+ is_list = 1
+ paths = orig
+ if not is_List(orig) and not is_Tuple(orig):
+ paths = paths.split(sep)
+ is_list = 0
+
+ if is_String(newpath):
+ newpaths = newpath.split(sep)
+ elif not is_List(newpath) and not is_Tuple(newpath):
+ newpaths = [ newpath ] # might be a Dir
+ else:
+ newpaths = newpath
+
+ if canonicalize:
+ newpaths=list(map(canonicalize, newpaths))
+
+ if not delete_existing:
+ # First uniquify the old paths, making sure to
+ # preserve the first instance (in Unix/Linux,
+ # the first one wins), and remembering them in normpaths.
+ # Then insert the new paths at the head of the list
+ # if they're not already in the normpaths list.
+ result = []
+ normpaths = []
+ for path in paths:
+ if not path:
+ continue
+ normpath = os.path.normpath(os.path.normcase(path))
+ if normpath not in normpaths:
+ result.append(path)
+ normpaths.append(normpath)
+ newpaths.reverse() # since we're inserting at the head
+ for path in newpaths:
+ if not path:
+ continue
+ normpath = os.path.normpath(os.path.normcase(path))
+ if normpath not in normpaths:
+ result.insert(0, path)
+ normpaths.append(normpath)
+ paths = result
+
+ else:
+ newpaths = newpaths + paths # prepend new paths
+
+ normpaths = []
+ paths = []
+ # now we add them only if they are unique
+ for path in newpaths:
+ normpath = os.path.normpath(os.path.normcase(path))
+ if path and not normpath in normpaths:
+ paths.append(path)
+ normpaths.append(normpath)
+
+ if is_list:
+ return paths
+ else:
+ return sep.join(paths)
+
+def AppendPath(oldpath, newpath, sep = os.pathsep,
+ delete_existing=1, canonicalize=None):
+ """This appends new path elements to the given old path. Will
+ only add any particular path once (leaving the last one it
+ encounters and ignoring the rest, to preserve path order), and
+ will os.path.normpath and os.path.normcase all paths to help
+ assure this. This can also handle the case where the given old
+ path variable is a list instead of a string, in which case a list
+ will be returned instead of a string.
+
+ Example:
+ Old Path: "/foo/bar:/foo"
+ New Path: "/biz/boom:/foo"
+ Result: "/foo/bar:/biz/boom:/foo"
+
+ If delete_existing is 0, then adding a path that exists
+ will not move it to the end; it will stay where it is in the list.
+
+ If canonicalize is not None, it is applied to each element of
+ newpath before use.
+ """
+
+ orig = oldpath
+ is_list = 1
+ paths = orig
+ if not is_List(orig) and not is_Tuple(orig):
+ paths = paths.split(sep)
+ is_list = 0
+
+ if is_String(newpath):
+ newpaths = newpath.split(sep)
+ elif not is_List(newpath) and not is_Tuple(newpath):
+ newpaths = [ newpath ] # might be a Dir
+ else:
+ newpaths = newpath
+
+ if canonicalize:
+ newpaths=list(map(canonicalize, newpaths))
+
+ if not delete_existing:
+ # add old paths to result, then
+ # add new paths if not already present
+ # (I thought about using a dict for normpaths for speed,
+ # but it's not clear hashing the strings would be faster
+ # than linear searching these typically short lists.)
+ result = []
+ normpaths = []
+ for path in paths:
+ if not path:
+ continue
+ result.append(path)
+ normpaths.append(os.path.normpath(os.path.normcase(path)))
+ for path in newpaths:
+ if not path:
+ continue
+ normpath = os.path.normpath(os.path.normcase(path))
+ if normpath not in normpaths:
+ result.append(path)
+ normpaths.append(normpath)
+ paths = result
+ else:
+ # start w/ new paths, add old ones if not present,
+ # then reverse.
+ newpaths = paths + newpaths # append new paths
+ newpaths.reverse()
+
+ normpaths = []
+ paths = []
+ # now we add them only if they are unique
+ for path in newpaths:
+ normpath = os.path.normpath(os.path.normcase(path))
+ if path and not normpath in normpaths:
+ paths.append(path)
+ normpaths.append(normpath)
+ paths.reverse()
+
+ if is_list:
+ return paths
+ else:
+ return sep.join(paths)
+
+def AddPathIfNotExists(env_dict, key, path, sep=os.pathsep):
+ """This function will take 'key' out of the dictionary
+ 'env_dict', then add the path 'path' to that key if it is not
+ already there. This treats the value of env_dict[key] as if it
+ has a similar format to the PATH variable...a list of paths
+ separated by tokens. The 'path' will get added to the list if it
+ is not already there."""
+ try:
+ is_list = 1
+ paths = env_dict[key]
+ if not is_List(env_dict[key]):
+ paths = paths.split(sep)
+ is_list = 0
+ if os.path.normcase(path) not in list(map(os.path.normcase, paths)):
+ paths = [ path ] + paths
+ if is_list:
+ env_dict[key] = paths
+ else:
+ env_dict[key] = sep.join(paths)
+ except KeyError:
+ env_dict[key] = path
+
+if sys.platform == 'cygwin':
+ def get_native_path(path):
+ """Transforms an absolute path into a native path for the system. In
+ Cygwin, this converts from a Cygwin path to a Windows one."""
+ return os.popen('cygpath -w ' + path).read().replace('\n', '')
+else:
+ def get_native_path(path):
+ """Transforms an absolute path into a native path for the system.
+ Non-Cygwin version, just leave the path alone."""
+ return path
+
+display = DisplayEngine()
+
+def Split(arg):
+ if is_List(arg) or is_Tuple(arg):
+ return arg
+ elif is_String(arg):
+ return arg.split()
+ else:
+ return [arg]
+
+class CLVar(UserList):
+ """A class for command-line construction variables.
+
+ This is a list that uses Split() to split an initial string along
+ white-space arguments, and similarly to split any strings that get
+ added. This allows us to Do the Right Thing with Append() and
+ Prepend() (as well as straight Python foo = env['VAR'] + 'arg1
+ arg2') regardless of whether a user adds a list or a string to a
+ command-line construction variable.
+ """
+ def __init__(self, seq = []):
+ UserList.__init__(self, Split(seq))
+ def __add__(self, other):
+ return UserList.__add__(self, CLVar(other))
+ def __radd__(self, other):
+ return UserList.__radd__(self, CLVar(other))
+ def __coerce__(self, other):
+ return (self, CLVar(other))
+ def __str__(self):
+ return ' '.join(self.data)
+
+# A dictionary that preserves the order in which items are added.
+# Submitted by David Benjamin to ActiveState's Python Cookbook web site:
+# http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/107747
+# Including fixes/enhancements from the follow-on discussions.
+class OrderedDict(UserDict):
+ def __init__(self, dict = None):
+ self._keys = []
+ UserDict.__init__(self, dict)
+
+ def __delitem__(self, key):
+ UserDict.__delitem__(self, key)
+ self._keys.remove(key)
+
+ def __setitem__(self, key, item):
+ UserDict.__setitem__(self, key, item)
+ if key not in self._keys: self._keys.append(key)
+
+ def clear(self):
+ UserDict.clear(self)
+ self._keys = []
+
+ def copy(self):
+ dict = OrderedDict()
+ dict.update(self)
+ return dict
+
+ def items(self):
+ return list(zip(self._keys, list(self.values())))
+
+ def keys(self):
+ return self._keys[:]
+
+ def popitem(self):
+ try:
+ key = self._keys[-1]
+ except IndexError:
+ raise KeyError('dictionary is empty')
+
+ val = self[key]
+ del self[key]
+
+ return (key, val)
+
+ def setdefault(self, key, failobj = None):
+ UserDict.setdefault(self, key, failobj)
+ if key not in self._keys: self._keys.append(key)
+
+ def update(self, dict):
+ for (key, val) in dict.items():
+ self.__setitem__(key, val)
+
+ def values(self):
+ return list(map(self.get, self._keys))
+
+class Selector(OrderedDict):
+ """A callable ordered dictionary that maps file suffixes to
+ dictionary values. We preserve the order in which items are added
+ so that get_suffix() calls always return the first suffix added."""
+ def __call__(self, env, source, ext=None):
+ if ext is None:
+ try:
+ ext = source[0].get_suffix()
+ except IndexError:
+ ext = ""
+ try:
+ return self[ext]
+ except KeyError:
+ # Try to perform Environment substitution on the keys of
+ # the dictionary before giving up.
+ s_dict = {}
+ for (k,v) in self.items():
+ if k is not None:
+ s_k = env.subst(k)
+ if s_k in s_dict:
+ # We only raise an error when variables point
+ # to the same suffix. If one suffix is literal
+ # and a variable suffix contains this literal,
+ # the literal wins and we don't raise an error.
+ raise KeyError(s_dict[s_k][0], k, s_k)
+ s_dict[s_k] = (k,v)
+ try:
+ return s_dict[ext][1]
+ except KeyError:
+ try:
+ return self[None]
+ except KeyError:
+ return None
+
+
+if sys.platform == 'cygwin':
+ # On Cygwin, os.path.normcase() lies, so just report back the
+ # fact that the underlying Windows OS is case-insensitive.
+ def case_sensitive_suffixes(s1, s2):
+ return 0
+else:
+ def case_sensitive_suffixes(s1, s2):
+ return (os.path.normcase(s1) != os.path.normcase(s2))
+
+def adjustixes(fname, pre, suf, ensure_suffix=False):
+ if pre:
+ path, fn = os.path.split(os.path.normpath(fname))
+ if fn[:len(pre)] != pre:
+ fname = os.path.join(path, pre + fn)
+ # Only append a suffix if the suffix we're going to add isn't already
+ # there, and if either we've been asked to ensure the specific suffix
+ # is present or there's no suffix on it at all.
+ if suf and fname[-len(suf):] != suf and \
+ (ensure_suffix or not splitext(fname)[1]):
+ fname = fname + suf
+ return fname
+
+
+
+# From Tim Peters,
+# http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/52560
+# ASPN: Python Cookbook: Remove duplicates from a sequence
+# (Also in the printed Python Cookbook.)
+
+def unique(s):
+ """Return a list of the elements in s, but without duplicates.
+
+ For example, unique([1,2,3,1,2,3]) is some permutation of [1,2,3],
+ unique("abcabc") some permutation of ["a", "b", "c"], and
+ unique(([1, 2], [2, 3], [1, 2])) some permutation of
+ [[2, 3], [1, 2]].
+
+ For best speed, all sequence elements should be hashable. Then
+ unique() will usually work in linear time.
+
+ If not possible, the sequence elements should enjoy a total
+ ordering, and if list(s).sort() doesn't raise TypeError it's
+ assumed that they do enjoy a total ordering. Then unique() will
+ usually work in O(N*log2(N)) time.
+
+ If that's not possible either, the sequence elements must support
+ equality-testing. Then unique() will usually work in quadratic
+ time.
+ """
+
+ n = len(s)
+ if n == 0:
+ return []
+
+ # Try using a dict first, as that's the fastest and will usually
+ # work. If it doesn't work, it will usually fail quickly, so it
+ # usually doesn't cost much to *try* it. It requires that all the
+ # sequence elements be hashable, and support equality comparison.
+ u = {}
+ try:
+ for x in s:
+ u[x] = 1
+ except TypeError:
+ pass # move on to the next method
+ else:
+ return list(u.keys())
+ del u
+
+ # We can't hash all the elements. Second fastest is to sort,
+ # which brings the equal elements together; then duplicates are
+ # easy to weed out in a single pass.
+ # NOTE: Python's list.sort() was designed to be efficient in the
+ # presence of many duplicate elements. This isn't true of all
+ # sort functions in all languages or libraries, so this approach
+ # is more effective in Python than it may be elsewhere.
+ try:
+ t = sorted(s)
+ except TypeError:
+ pass # move on to the next method
+ else:
+ assert n > 0
+ last = t[0]
+ lasti = i = 1
+ while i < n:
+ if t[i] != last:
+ t[lasti] = last = t[i]
+ lasti = lasti + 1
+ i = i + 1
+ return t[:lasti]
+ del t
+
+ # Brute force is all that's left.
+ u = []
+ for x in s:
+ if x not in u:
+ u.append(x)
+ return u
+
+
+
+# From Alex Martelli,
+# http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/52560
+# ASPN: Python Cookbook: Remove duplicates from a sequence
+# First comment, dated 2001/10/13.
+# (Also in the printed Python Cookbook.)
+
+def uniquer(seq, idfun=None):
+ if idfun is None:
+ def idfun(x): return x
+ seen = {}
+ result = []
+ for item in seq:
+ marker = idfun(item)
+ # in old Python versions:
+ # if seen.has_key(marker)
+ # but in new ones:
+ if marker in seen: continue
+ seen[marker] = 1
+ result.append(item)
+ return result
+
+# A more efficient implementation of Alex's uniquer(), this avoids the
+# idfun() argument and function-call overhead by assuming that all
+# items in the sequence are hashable.
+
+def uniquer_hashables(seq):
+ seen = {}
+ result = []
+ for item in seq:
+ #if not item in seen:
+ if item not in seen:
+ seen[item] = 1
+ result.append(item)
+ return result
+
+
+# Recipe 19.11 "Reading Lines with Continuation Characters",
+# by Alex Martelli, straight from the Python CookBook (2nd edition).
+def logical_lines(physical_lines, joiner=''.join):
+ logical_line = []
+ for line in physical_lines:
+ stripped = line.rstrip()
+ if stripped.endswith('\\'):
+ # a line which continues w/the next physical line
+ logical_line.append(stripped[:-1])
+ else:
+ # a line which does not continue, end of logical line
+ logical_line.append(line)
+ yield joiner(logical_line)
+ logical_line = []
+ if logical_line:
+ # end of sequence implies end of last logical line
+ yield joiner(logical_line)
+
+
+class LogicalLines(object):
+ """ Wrapper class for the logical_lines method.
+
+ Allows us to read all "logical" lines at once from a
+ given file object.
+ """
+
+ def __init__(self, fileobj):
+ self.fileobj = fileobj
+
+ def readlines(self):
+ result = [l for l in logical_lines(self.fileobj)]
+ return result
+
+
+class UniqueList(UserList):
+ def __init__(self, seq = []):
+ UserList.__init__(self, seq)
+ self.unique = True
+ def __make_unique(self):
+ if not self.unique:
+ self.data = uniquer_hashables(self.data)
+ self.unique = True
+ def __lt__(self, other):
+ self.__make_unique()
+ return UserList.__lt__(self, other)
+ def __le__(self, other):
+ self.__make_unique()
+ return UserList.__le__(self, other)
+ def __eq__(self, other):
+ self.__make_unique()
+ return UserList.__eq__(self, other)
+ def __ne__(self, other):
+ self.__make_unique()
+ return UserList.__ne__(self, other)
+ def __gt__(self, other):
+ self.__make_unique()
+ return UserList.__gt__(self, other)
+ def __ge__(self, other):
+ self.__make_unique()
+ return UserList.__ge__(self, other)
+ def __cmp__(self, other):
+ self.__make_unique()
+ return UserList.__cmp__(self, other)
+ def __len__(self):
+ self.__make_unique()
+ return UserList.__len__(self)
+ def __getitem__(self, i):
+ self.__make_unique()
+ return UserList.__getitem__(self, i)
+ def __setitem__(self, i, item):
+ UserList.__setitem__(self, i, item)
+ self.unique = False
+ def __getslice__(self, i, j):
+ self.__make_unique()
+ return UserList.__getslice__(self, i, j)
+ def __setslice__(self, i, j, other):
+ UserList.__setslice__(self, i, j, other)
+ self.unique = False
+ def __add__(self, other):
+ result = UserList.__add__(self, other)
+ result.unique = False
+ return result
+ def __radd__(self, other):
+ result = UserList.__radd__(self, other)
+ result.unique = False
+ return result
+ def __iadd__(self, other):
+ result = UserList.__iadd__(self, other)
+ result.unique = False
+ return result
+ def __mul__(self, other):
+ result = UserList.__mul__(self, other)
+ result.unique = False
+ return result
+ def __rmul__(self, other):
+ result = UserList.__rmul__(self, other)
+ result.unique = False
+ return result
+ def __imul__(self, other):
+ result = UserList.__imul__(self, other)
+ result.unique = False
+ return result
+ def append(self, item):
+ UserList.append(self, item)
+ self.unique = False
+ def insert(self, i):
+ UserList.insert(self, i)
+ self.unique = False
+ def count(self, item):
+ self.__make_unique()
+ return UserList.count(self, item)
+ def index(self, item):
+ self.__make_unique()
+ return UserList.index(self, item)
+ def reverse(self):
+ self.__make_unique()
+ UserList.reverse(self)
+ def sort(self, *args, **kwds):
+ self.__make_unique()
+ return UserList.sort(self, *args, **kwds)
+ def extend(self, other):
+ UserList.extend(self, other)
+ self.unique = False
+
+
+class Unbuffered(object):
+ """
+ A proxy class that wraps a file object, flushing after every write,
+ and delegating everything else to the wrapped object.
+ """
+ def __init__(self, file):
+ self.file = file
+ self.softspace = 0 ## backward compatibility; not supported in Py3k
+ def write(self, arg):
+ try:
+ self.file.write(arg)
+ self.file.flush()
+ except IOError:
+ # Stdout might be connected to a pipe that has been closed
+ # by now. The most likely reason for the pipe being closed
+ # is that the user has press ctrl-c. It this is the case,
+ # then SCons is currently shutdown. We therefore ignore
+ # IOError's here so that SCons can continue and shutdown
+ # properly so that the .sconsign is correctly written
+ # before SCons exits.
+ pass
+ def __getattr__(self, attr):
+ return getattr(self.file, attr)
+
+def make_path_relative(path):
+ """ makes an absolute path name to a relative pathname.
+ """
+ if os.path.isabs(path):
+ drive_s,path = os.path.splitdrive(path)
+
+ import re
+ if not drive_s:
+ path=re.compile("/*(.*)").findall(path)[0]
+ else:
+ path=path[1:]
+
+ assert( not os.path.isabs( path ) ), path
+ return path
+
+
+
+# The original idea for AddMethod() and RenameFunction() come from the
+# following post to the ActiveState Python Cookbook:
+#
+# ASPN: Python Cookbook : Install bound methods in an instance
+# http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/223613
+#
+# That code was a little fragile, though, so the following changes
+# have been wrung on it:
+#
+# * Switched the installmethod() "object" and "function" arguments,
+# so the order reflects that the left-hand side is the thing being
+# "assigned to" and the right-hand side is the value being assigned.
+#
+# * Changed explicit type-checking to the "try: klass = object.__class__"
+# block in installmethod() below so that it still works with the
+# old-style classes that SCons uses.
+#
+# * Replaced the by-hand creation of methods and functions with use of
+# the "new" module, as alluded to in Alex Martelli's response to the
+# following Cookbook post:
+#
+# ASPN: Python Cookbook : Dynamically added methods to a class
+# http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/81732
+
+def AddMethod(obj, function, name=None):
+ """
+ Adds either a bound method to an instance or the function itself (or an unbound method in Python 2) to a class.
+ If name is ommited the name of the specified function
+ is used by default.
+
+ Example::
+
+ a = A()
+ def f(self, x, y):
+ self.z = x + y
+ AddMethod(f, A, "add")
+ a.add(2, 4)
+ print(a.z)
+ AddMethod(lambda self, i: self.l[i], a, "listIndex")
+ print(a.listIndex(5))
+ """
+ if name is None:
+ name = function.__name__
+ else:
+ function = RenameFunction(function, name)
+
+ # Note the Python version checks - WLB
+ # Python 3.3 dropped the 3rd parameter from types.MethodType
+ if hasattr(obj, '__class__') and obj.__class__ is not type:
+ # "obj" is an instance, so it gets a bound method.
+ if sys.version_info[:2] > (3, 2):
+ method = MethodType(function, obj)
+ else:
+ method = MethodType(function, obj, obj.__class__)
+ else:
+ # Handle classes
+ method = function
+
+ setattr(obj, name, method)
+
+def RenameFunction(function, name):
+ """
+ Returns a function identical to the specified function, but with
+ the specified name.
+ """
+ return FunctionType(function.__code__,
+ function.__globals__,
+ name,
+ function.__defaults__)
+
+
+md5 = False
+
+
+def MD5signature(s):
+ return str(s)
+
+
+def MD5filesignature(fname, chunksize=65536):
+ with open(fname, "rb") as f:
+ result = f.read()
+ return result
+
+try:
+ import hashlib
+except ImportError:
+ pass
+else:
+ if hasattr(hashlib, 'md5'):
+ md5 = True
+
+ def MD5signature(s):
+ m = hashlib.md5()
+
+ try:
+ m.update(to_bytes(s))
+ except TypeError as e:
+ m.update(to_bytes(str(s)))
+
+ return m.hexdigest()
+
+ def MD5filesignature(fname, chunksize=65536):
+ m = hashlib.md5()
+ f = open(fname, "rb")
+ while True:
+ blck = f.read(chunksize)
+ if not blck:
+ break
+ m.update(to_bytes(blck))
+ f.close()
+ return m.hexdigest()
+
+def MD5collect(signatures):
+ """
+ Collects a list of signatures into an aggregate signature.
+
+ signatures - a list of signatures
+ returns - the aggregate signature
+ """
+ if len(signatures) == 1:
+ return signatures[0]
+ else:
+ return MD5signature(', '.join(signatures))
+
+
+
+def silent_intern(x):
+ """
+ Perform sys.intern() on the passed argument and return the result.
+ If the input is ineligible (e.g. a unicode string) the original argument is
+ returned and no exception is thrown.
+ """
+ try:
+ return sys.intern(x)
+ except TypeError:
+ return x
+
+
+
+# From Dinu C. Gherman,
+# Python Cookbook, second edition, recipe 6.17, p. 277.
+# Also:
+# http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/68205
+# ASPN: Python Cookbook: Null Object Design Pattern
+
+#TODO??? class Null(object):
+class Null(object):
+ """ Null objects always and reliably "do nothing." """
+ def __new__(cls, *args, **kwargs):
+ if not '_instance' in vars(cls):
+ cls._instance = super(Null, cls).__new__(cls, *args, **kwargs)
+ return cls._instance
+ def __init__(self, *args, **kwargs):
+ pass
+ def __call__(self, *args, **kwargs):
+ return self
+ def __repr__(self):
+ return "Null(0x%08X)" % id(self)
+ def __nonzero__(self):
+ return False
+ def __bool__(self):
+ return False
+ def __getattr__(self, name):
+ return self
+ def __setattr__(self, name, value):
+ return self
+ def __delattr__(self, name):
+ return self
+
+class NullSeq(Null):
+ def __len__(self):
+ return 0
+ def __iter__(self):
+ return iter(())
+ def __getitem__(self, i):
+ return self
+ def __delitem__(self, i):
+ return self
+ def __setitem__(self, i, v):
+ return self
+
+
+del __revision__
+
+def to_bytes (s):
+ if isinstance (s, (bytes, bytearray)) or bytes is str:
+ return s
+ return bytes (s, 'utf-8')
+
+def to_str (s):
+ if bytes is str or is_String(s):
+ return s
+ return str (s, 'utf-8')
+
+
+
+# No cmp in py3, so we'll define it.
+def cmp(a, b):
+ """
+ Define cmp because it's no longer available in python3
+ Works under python 2 as well
+ """
+ return (a > b) - (a < b)
+
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/UtilTests.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/UtilTests.py
new file mode 100644
index 0000000..0d1b7bb
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/UtilTests.py
@@ -0,0 +1,858 @@
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import SCons.compat
+
+import io
+import os
+import sys
+import unittest
+from collections import UserDict, UserList, UserString
+
+import TestCmd
+import TestUnit
+
+import SCons.Errors
+
+from SCons.Util import *
+
+try: eval('unicode')
+except NameError: HasUnicode = False
+else: HasUnicode = True
+
+class OutBuffer(object):
+ def __init__(self):
+ self.buffer = ""
+
+ def write(self, str):
+ self.buffer = self.buffer + str
+
+class dictifyTestCase(unittest.TestCase):
+ def test_dictify(self):
+ """Test the dictify() function"""
+ r = SCons.Util.dictify(['a', 'b', 'c'], [1, 2, 3])
+ assert r == {'a':1, 'b':2, 'c':3}, r
+
+ r = {}
+ SCons.Util.dictify(['a'], [1], r)
+ SCons.Util.dictify(['b'], [2], r)
+ SCons.Util.dictify(['c'], [3], r)
+ assert r == {'a':1, 'b':2, 'c':3}, r
+
+class UtilTestCase(unittest.TestCase):
+ def test_splitext(self):
+ assert splitext('foo') == ('foo','')
+ assert splitext('foo.bar') == ('foo','.bar')
+ assert splitext(os.path.join('foo.bar', 'blat')) == (os.path.join('foo.bar', 'blat'),'')
+
+ class Node(object):
+ def __init__(self, name, children=[]):
+ self.children = children
+ self.name = name
+ self.nocache = None
+ def __str__(self):
+ return self.name
+ def exists(self):
+ return 1
+ def rexists(self):
+ return 1
+ def has_builder(self):
+ return 1
+ def has_explicit_builder(self):
+ return 1
+ def side_effect(self):
+ return 1
+ def precious(self):
+ return 1
+ def always_build(self):
+ return 1
+ def is_up_to_date(self):
+ return 1
+ def noclean(self):
+ return 1
+
+ def tree_case_1(self):
+ """Fixture for the render_tree() and print_tree() tests."""
+ windows_h = self.Node("windows.h")
+ stdlib_h = self.Node("stdlib.h")
+ stdio_h = self.Node("stdio.h")
+ bar_c = self.Node("bar.c", [stdlib_h, windows_h])
+ bar_o = self.Node("bar.o", [bar_c])
+ foo_c = self.Node("foo.c", [stdio_h])
+ foo_o = self.Node("foo.o", [foo_c])
+ foo = self.Node("foo", [foo_o, bar_o])
+
+ expect = """\
++-foo
+ +-foo.o
+ | +-foo.c
+ | +-stdio.h
+ +-bar.o
+ +-bar.c
+ +-stdlib.h
+ +-windows.h
+"""
+
+ lines = expect.split('\n')[:-1]
+ lines = ['[E BSPACN ]'+l for l in lines]
+ withtags = '\n'.join(lines) + '\n'
+
+ return foo, expect, withtags
+
+ def tree_case_2(self, prune=1):
+ """Fixture for the render_tree() and print_tree() tests."""
+
+ types_h = self.Node('types.h')
+ malloc_h = self.Node('malloc.h')
+ stdlib_h = self.Node('stdlib.h', [types_h, malloc_h])
+ bar_h = self.Node('bar.h', [stdlib_h])
+ blat_h = self.Node('blat.h', [stdlib_h])
+ blat_c = self.Node('blat.c', [blat_h, bar_h])
+ blat_o = self.Node('blat.o', [blat_c])
+
+ expect = """\
++-blat.o
+ +-blat.c
+ +-blat.h
+ | +-stdlib.h
+ | +-types.h
+ | +-malloc.h
+ +-bar.h
+"""
+ if prune:
+ expect += """ +-[stdlib.h]
+"""
+ else:
+ expect += """ +-stdlib.h
+ +-types.h
+ +-malloc.h
+"""
+
+ lines = expect.split('\n')[:-1]
+ lines = ['[E BSPACN ]'+l for l in lines]
+ withtags = '\n'.join(lines) + '\n'
+
+ return blat_o, expect, withtags
+
+ def test_render_tree(self):
+ """Test the render_tree() function"""
+ def get_children(node):
+ return node.children
+
+ node, expect, withtags = self.tree_case_1()
+ actual = render_tree(node, get_children)
+ assert expect == actual, (expect, actual)
+
+ node, expect, withtags = self.tree_case_2()
+ actual = render_tree(node, get_children, 1)
+ assert expect == actual, (expect, actual)
+
+ # Ensure that we can call render_tree on the same Node
+ # again. This wasn't possible in version 2.4.1 and earlier
+ # due to a bug in render_tree (visited was set to {} as default
+ # parameter)
+ actual = render_tree(node, get_children, 1)
+ assert expect == actual, (expect, actual)
+
+ def test_print_tree(self):
+ """Test the print_tree() function"""
+ def get_children(node):
+ return node.children
+
+ save_stdout = sys.stdout
+
+ try:
+ node, expect, withtags = self.tree_case_1()
+
+ if sys.version_info.major < 3:
+ IOStream = io.BytesIO
+ else:
+ IOStream = io.StringIO
+
+ sys.stdout = IOStream()
+ print_tree(node, get_children)
+ actual = sys.stdout.getvalue()
+ assert expect == actual, (expect, actual)
+
+ sys.stdout = IOStream()
+ print_tree(node, get_children, showtags=1)
+ actual = sys.stdout.getvalue()
+ assert withtags == actual, (withtags, actual)
+
+ # Test that explicitly setting prune to zero works
+ # the same as the default (see above)
+ node, expect, withtags = self.tree_case_2(prune=0)
+
+ sys.stdout = IOStream()
+ print_tree(node, get_children, 0)
+ actual = sys.stdout.getvalue()
+ assert expect == actual, (expect, actual)
+
+ sys.stdout = IOStream()
+ print_tree(node, get_children, 0, showtags=1)
+ actual = sys.stdout.getvalue()
+ assert withtags == actual, (withtags, actual)
+
+ # Test output with prune=1
+ node, expect, withtags = self.tree_case_2(prune=1)
+
+ sys.stdout = IOStream()
+ print_tree(node, get_children, 1)
+ actual = sys.stdout.getvalue()
+ assert expect == actual, (expect, actual)
+
+ # Ensure that we can call print_tree on the same Node
+ # again. This wasn't possible in version 2.4.1 and earlier
+ # due to a bug in print_tree (visited was set to {} as default
+ # parameter)
+ sys.stdout = IOStream()
+ print_tree(node, get_children, 1)
+ actual = sys.stdout.getvalue()
+ assert expect == actual, (expect, actual)
+
+ sys.stdout = IOStream()
+ print_tree(node, get_children, 1, showtags=1)
+ actual = sys.stdout.getvalue()
+ assert withtags == actual, (withtags, actual)
+ finally:
+ sys.stdout = save_stdout
+
+ def test_is_Dict(self):
+ assert is_Dict({})
+ assert is_Dict(UserDict())
+
+ # os.environ is not a dictionary in python 3
+ if sys.version_info < (3,0):
+ assert is_Dict(os.environ)
+
+ try:
+ class mydict(dict):
+ pass
+ except TypeError:
+ pass
+ else:
+ assert is_Dict(mydict({}))
+ assert not is_Dict([])
+ assert not is_Dict(())
+ assert not is_Dict("")
+ if HasUnicode:
+ exec("assert not is_Dict(u'')")
+
+ def test_is_List(self):
+ assert is_List([])
+ assert is_List(UserList())
+ try:
+ class mylist(list):
+ pass
+ except TypeError:
+ pass
+ else:
+ assert is_List(mylist([]))
+ assert not is_List(())
+ assert not is_List({})
+ assert not is_List("")
+ if HasUnicode:
+ exec("assert not is_List(u'')")
+
+ def test_is_String(self):
+ assert is_String("")
+ if HasUnicode:
+ exec("assert is_String(u'')")
+ assert is_String(UserString(''))
+ try:
+ class mystr(str):
+ pass
+ except TypeError:
+ pass
+ else:
+ assert is_String(mystr(''))
+ assert not is_String({})
+ assert not is_String([])
+ assert not is_String(())
+
+ def test_is_Tuple(self):
+ assert is_Tuple(())
+ try:
+ class mytuple(tuple):
+ pass
+ except TypeError:
+ pass
+ else:
+ assert is_Tuple(mytuple(()))
+ assert not is_Tuple([])
+ assert not is_Tuple({})
+ assert not is_Tuple("")
+ if HasUnicode:
+ exec("assert not is_Tuple(u'')")
+
+ def test_to_String(self):
+ """Test the to_String() method."""
+ assert to_String(1) == "1", to_String(1)
+ assert to_String([ 1, 2, 3]) == str([1, 2, 3]), to_String([1,2,3])
+ assert to_String("foo") == "foo", to_String("foo")
+
+ s1=UserString('blah')
+ assert to_String(s1) == s1, s1
+ assert to_String(s1) == 'blah', s1
+
+ class Derived(UserString):
+ pass
+ s2 = Derived('foo')
+ assert to_String(s2) == s2, s2
+ assert to_String(s2) == 'foo', s2
+
+ if HasUnicode:
+ s3=UserString(unicode('bar'))
+ assert to_String(s3) == s3, s3
+ assert to_String(s3) == unicode('bar'), s3
+ assert isinstance(to_String(s3), unicode), \
+ type(to_String(s3))
+
+ if HasUnicode:
+ s4 = unicode('baz')
+ assert to_String(s4) == unicode('baz'), to_String(s4)
+ assert isinstance(to_String(s4), unicode), \
+ type(to_String(s4))
+
+ def test_WhereIs(self):
+ test = TestCmd.TestCmd(workdir = '')
+
+ sub1_xxx_exe = test.workpath('sub1', 'xxx.exe')
+ sub2_xxx_exe = test.workpath('sub2', 'xxx.exe')
+ sub3_xxx_exe = test.workpath('sub3', 'xxx.exe')
+ sub4_xxx_exe = test.workpath('sub4', 'xxx.exe')
+
+ test.subdir('subdir', 'sub1', 'sub2', 'sub3', 'sub4')
+
+ if sys.platform != 'win32':
+ test.write(sub1_xxx_exe, "\n")
+
+ os.mkdir(sub2_xxx_exe)
+
+ test.write(sub3_xxx_exe, "\n")
+ os.chmod(sub3_xxx_exe, 0o777)
+
+ test.write(sub4_xxx_exe, "\n")
+ os.chmod(sub4_xxx_exe, 0o777)
+
+ env_path = os.environ['PATH']
+
+ try:
+ pathdirs_1234 = [ test.workpath('sub1'),
+ test.workpath('sub2'),
+ test.workpath('sub3'),
+ test.workpath('sub4'),
+ ] + env_path.split(os.pathsep)
+
+ pathdirs_1243 = [ test.workpath('sub1'),
+ test.workpath('sub2'),
+ test.workpath('sub4'),
+ test.workpath('sub3'),
+ ] + env_path.split(os.pathsep)
+
+ os.environ['PATH'] = os.pathsep.join(pathdirs_1234)
+ wi = WhereIs('xxx.exe')
+ assert wi == test.workpath(sub3_xxx_exe), wi
+ wi = WhereIs('xxx.exe', pathdirs_1243)
+ assert wi == test.workpath(sub4_xxx_exe), wi
+ wi = WhereIs('xxx.exe', os.pathsep.join(pathdirs_1243))
+ assert wi == test.workpath(sub4_xxx_exe), wi
+
+ wi = WhereIs('xxx.exe',reject = sub3_xxx_exe)
+ assert wi == test.workpath(sub4_xxx_exe), wi
+ wi = WhereIs('xxx.exe', pathdirs_1243, reject = sub3_xxx_exe)
+ assert wi == test.workpath(sub4_xxx_exe), wi
+
+ os.environ['PATH'] = os.pathsep.join(pathdirs_1243)
+ wi = WhereIs('xxx.exe')
+ assert wi == test.workpath(sub4_xxx_exe), wi
+ wi = WhereIs('xxx.exe', pathdirs_1234)
+ assert wi == test.workpath(sub3_xxx_exe), wi
+ wi = WhereIs('xxx.exe', os.pathsep.join(pathdirs_1234))
+ assert wi == test.workpath(sub3_xxx_exe), wi
+
+ if sys.platform == 'win32':
+ wi = WhereIs('xxx', pathext = '')
+ assert wi is None, wi
+
+ wi = WhereIs('xxx', pathext = '.exe')
+ assert wi == test.workpath(sub4_xxx_exe), wi
+
+ wi = WhereIs('xxx', path = pathdirs_1234, pathext = '.BAT;.EXE')
+ assert wi.lower() == test.workpath(sub3_xxx_exe).lower(), wi
+
+ # Test that we return a normalized path even when
+ # the path contains forward slashes.
+ forward_slash = test.workpath('') + '/sub3'
+ wi = WhereIs('xxx', path = forward_slash, pathext = '.EXE')
+ assert wi.lower() == test.workpath(sub3_xxx_exe).lower(), wi
+
+ del os.environ['PATH']
+ wi = WhereIs('xxx.exe')
+ assert wi is None, wi
+
+ finally:
+ os.environ['PATH'] = env_path
+
+ def test_get_env_var(self):
+ """Testing get_environment_var()."""
+ assert get_environment_var("$FOO") == "FOO", get_environment_var("$FOO")
+ assert get_environment_var("${BAR}") == "BAR", get_environment_var("${BAR}")
+ assert get_environment_var("$FOO_BAR1234") == "FOO_BAR1234", get_environment_var("$FOO_BAR1234")
+ assert get_environment_var("${BAR_FOO1234}") == "BAR_FOO1234", get_environment_var("${BAR_FOO1234}")
+ assert get_environment_var("${BAR}FOO") == None, get_environment_var("${BAR}FOO")
+ assert get_environment_var("$BAR ") == None, get_environment_var("$BAR ")
+ assert get_environment_var("FOO$BAR") == None, get_environment_var("FOO$BAR")
+ assert get_environment_var("$FOO[0]") == None, get_environment_var("$FOO[0]")
+ assert get_environment_var("${some('complex expression')}") == None, get_environment_var("${some('complex expression')}")
+
+ def test_Proxy(self):
+ """Test generic Proxy class."""
+ class Subject(object):
+ def foo(self):
+ return 1
+ def bar(self):
+ return 2
+
+ s=Subject()
+ s.baz = 3
+
+ class ProxyTest(Proxy):
+ def bar(self):
+ return 4
+
+ p=ProxyTest(s)
+
+ assert p.foo() == 1, p.foo()
+ assert p.bar() == 4, p.bar()
+ assert p.baz == 3, p.baz
+
+ p.baz = 5
+ s.baz = 6
+
+ assert p.baz == 5, p.baz
+ assert p.get() == s, p.get()
+
+ def test_display(self):
+ old_stdout = sys.stdout
+ sys.stdout = OutBuffer()
+ display("line1")
+ display.set_mode(0)
+ display("line2")
+ display.set_mode(1)
+ display("line3")
+ display("line4\n", append_newline=0)
+ display.set_mode(0)
+ display("dont print1")
+ display("dont print2\n", append_newline=0)
+ display.set_mode(1)
+ assert sys.stdout.buffer == "line1\nline3\nline4\n"
+ sys.stdout = old_stdout
+
+ def test_get_native_path(self):
+ """Test the get_native_path() function."""
+ import tempfile
+ filename = tempfile.mktemp()
+ str = '1234567890 ' + filename
+ try:
+ open(filename, 'w').write(str)
+ assert open(get_native_path(filename)).read() == str
+ finally:
+ try:
+ os.unlink(filename)
+ except OSError:
+ pass
+
+ def test_PrependPath(self):
+ """Test prepending to a path"""
+ p1 = r'C:\dir\num\one;C:\dir\num\two'
+ p2 = r'C:\mydir\num\one;C:\mydir\num\two'
+ # have to include the pathsep here so that the test will work on UNIX too.
+ p1 = PrependPath(p1,r'C:\dir\num\two',sep = ';')
+ p1 = PrependPath(p1,r'C:\dir\num\three',sep = ';')
+ p2 = PrependPath(p2,r'C:\mydir\num\three',sep = ';')
+ p2 = PrependPath(p2,r'C:\mydir\num\one',sep = ';')
+ assert(p1 == r'C:\dir\num\three;C:\dir\num\two;C:\dir\num\one')
+ assert(p2 == r'C:\mydir\num\one;C:\mydir\num\three;C:\mydir\num\two')
+
+ def test_AppendPath(self):
+ """Test appending to a path."""
+ p1 = r'C:\dir\num\one;C:\dir\num\two'
+ p2 = r'C:\mydir\num\one;C:\mydir\num\two'
+ # have to include the pathsep here so that the test will work on UNIX too.
+ p1 = AppendPath(p1,r'C:\dir\num\two',sep = ';')
+ p1 = AppendPath(p1,r'C:\dir\num\three',sep = ';')
+ p2 = AppendPath(p2,r'C:\mydir\num\three',sep = ';')
+ p2 = AppendPath(p2,r'C:\mydir\num\one',sep = ';')
+ assert(p1 == r'C:\dir\num\one;C:\dir\num\two;C:\dir\num\three')
+ assert(p2 == r'C:\mydir\num\two;C:\mydir\num\three;C:\mydir\num\one')
+
+ def test_PrependPathPreserveOld(self):
+ """Test prepending to a path while preserving old paths"""
+ p1 = r'C:\dir\num\one;C:\dir\num\two'
+ # have to include the pathsep here so that the test will work on UNIX too.
+ p1 = PrependPath(p1,r'C:\dir\num\two',sep = ';', delete_existing=0)
+ p1 = PrependPath(p1,r'C:\dir\num\three',sep = ';')
+ assert(p1 == r'C:\dir\num\three;C:\dir\num\one;C:\dir\num\two')
+
+ def test_AppendPathPreserveOld(self):
+ """Test appending to a path while preserving old paths"""
+ p1 = r'C:\dir\num\one;C:\dir\num\two'
+ # have to include the pathsep here so that the test will work on UNIX too.
+ p1 = AppendPath(p1,r'C:\dir\num\one',sep = ';', delete_existing=0)
+ p1 = AppendPath(p1,r'C:\dir\num\three',sep = ';')
+ assert(p1 == r'C:\dir\num\one;C:\dir\num\two;C:\dir\num\three')
+
+ def test_addPathIfNotExists(self):
+ """Test the AddPathIfNotExists() function"""
+ env_dict = { 'FOO' : os.path.normpath('/foo/bar') + os.pathsep + \
+ os.path.normpath('/baz/blat'),
+ 'BAR' : os.path.normpath('/foo/bar') + os.pathsep + \
+ os.path.normpath('/baz/blat'),
+ 'BLAT' : [ os.path.normpath('/foo/bar'),
+ os.path.normpath('/baz/blat') ] }
+ AddPathIfNotExists(env_dict, 'FOO', os.path.normpath('/foo/bar'))
+ AddPathIfNotExists(env_dict, 'BAR', os.path.normpath('/bar/foo'))
+ AddPathIfNotExists(env_dict, 'BAZ', os.path.normpath('/foo/baz'))
+ AddPathIfNotExists(env_dict, 'BLAT', os.path.normpath('/baz/blat'))
+ AddPathIfNotExists(env_dict, 'BLAT', os.path.normpath('/baz/foo'))
+
+ assert env_dict['FOO'] == os.path.normpath('/foo/bar') + os.pathsep + \
+ os.path.normpath('/baz/blat'), env_dict['FOO']
+ assert env_dict['BAR'] == os.path.normpath('/bar/foo') + os.pathsep + \
+ os.path.normpath('/foo/bar') + os.pathsep + \
+ os.path.normpath('/baz/blat'), env_dict['BAR']
+ assert env_dict['BAZ'] == os.path.normpath('/foo/baz'), env_dict['BAZ']
+ assert env_dict['BLAT'] == [ os.path.normpath('/baz/foo'),
+ os.path.normpath('/foo/bar'),
+ os.path.normpath('/baz/blat') ], env_dict['BLAT' ]
+
+ def test_CLVar(self):
+ """Test the command-line construction variable class"""
+ f = SCons.Util.CLVar('a b')
+
+ r = f + 'c d'
+ assert isinstance(r, SCons.Util.CLVar), type(r)
+ assert r.data == ['a', 'b', 'c', 'd'], r.data
+ assert str(r) == 'a b c d', str(r)
+
+ r = f + ' c d'
+ assert isinstance(r, SCons.Util.CLVar), type(r)
+ assert r.data == ['a', 'b', 'c', 'd'], r.data
+ assert str(r) == 'a b c d', str(r)
+
+ r = f + ['c d']
+ assert isinstance(r, SCons.Util.CLVar), type(r)
+ assert r.data == ['a', 'b', 'c d'], r.data
+ assert str(r) == 'a b c d', str(r)
+
+ r = f + [' c d']
+ assert isinstance(r, SCons.Util.CLVar), type(r)
+ assert r.data == ['a', 'b', ' c d'], r.data
+ assert str(r) == 'a b c d', str(r)
+
+ r = f + ['c', 'd']
+ assert isinstance(r, SCons.Util.CLVar), type(r)
+ assert r.data == ['a', 'b', 'c', 'd'], r.data
+ assert str(r) == 'a b c d', str(r)
+
+ r = f + [' c', 'd']
+ assert isinstance(r, SCons.Util.CLVar), type(r)
+ assert r.data == ['a', 'b', ' c', 'd'], r.data
+ assert str(r) == 'a b c d', str(r)
+
+ f = SCons.Util.CLVar(['a b'])
+
+ r = f + 'c d'
+ assert isinstance(r, SCons.Util.CLVar), type(r)
+ assert r.data == ['a b', 'c', 'd'], r.data
+ assert str(r) == 'a b c d', str(r)
+
+ r = f + ' c d'
+ assert isinstance(r, SCons.Util.CLVar), type(r)
+ assert r.data == ['a b', 'c', 'd'], r.data
+ assert str(r) == 'a b c d', str(r)
+
+ r = f + ['c d']
+ assert isinstance(r, SCons.Util.CLVar), type(r)
+ assert r.data == ['a b', 'c d'], r.data
+ assert str(r) == 'a b c d', str(r)
+
+ r = f + [' c d']
+ assert isinstance(r, SCons.Util.CLVar), type(r)
+ assert r.data == ['a b', ' c d'], r.data
+ assert str(r) == 'a b c d', str(r)
+
+ r = f + ['c', 'd']
+ assert isinstance(r, SCons.Util.CLVar), type(r)
+ assert r.data == ['a b', 'c', 'd'], r.data
+ assert str(r) == 'a b c d', str(r)
+
+ r = f + [' c', 'd']
+ assert isinstance(r, SCons.Util.CLVar), type(r)
+ assert r.data == ['a b', ' c', 'd'], r.data
+ assert str(r) == 'a b c d', str(r)
+
+ f = SCons.Util.CLVar(['a', 'b'])
+
+ r = f + 'c d'
+ assert isinstance(r, SCons.Util.CLVar), type(r)
+ assert r.data == ['a', 'b', 'c', 'd'], r.data
+ assert str(r) == 'a b c d', str(r)
+
+ r = f + ' c d'
+ assert isinstance(r, SCons.Util.CLVar), type(r)
+ assert r.data == ['a', 'b', 'c', 'd'], r.data
+ assert str(r) == 'a b c d', str(r)
+
+ r = f + ['c d']
+ assert isinstance(r, SCons.Util.CLVar), type(r)
+ assert r.data == ['a', 'b', 'c d'], r.data
+ assert str(r) == 'a b c d', str(r)
+
+ r = f + [' c d']
+ assert isinstance(r, SCons.Util.CLVar), type(r)
+ assert r.data == ['a', 'b', ' c d'], r.data
+ assert str(r) == 'a b c d', str(r)
+
+ r = f + ['c', 'd']
+ assert isinstance(r, SCons.Util.CLVar), type(r)
+ assert r.data == ['a', 'b', 'c', 'd'], r.data
+ assert str(r) == 'a b c d', str(r)
+
+ r = f + [' c', 'd']
+ assert isinstance(r, SCons.Util.CLVar), type(r)
+ assert r.data == ['a', 'b', ' c', 'd'], r.data
+ assert str(r) == 'a b c d', str(r)
+
+ def test_Selector(self):
+ """Test the Selector class"""
+
+ class MyNode(object):
+ def __init__(self, name):
+ self.name = name
+
+ def __str__(self):
+ return self.name
+ def get_suffix(self):
+ return os.path.splitext(self.name)[1]
+
+ s = Selector({'a' : 'AAA', 'b' : 'BBB'})
+ assert s['a'] == 'AAA', s['a']
+ assert s['b'] == 'BBB', s['b']
+ exc_caught = None
+ try:
+ x = s['c']
+ except KeyError:
+ exc_caught = 1
+ assert exc_caught, "should have caught a KeyError"
+ s['c'] = 'CCC'
+ assert s['c'] == 'CCC', s['c']
+
+ class DummyEnv(UserDict):
+ def subst(self, key):
+ if key[0] == '$':
+ return self[key[1:]]
+ return key
+
+ env = DummyEnv()
+
+ s = Selector({'.d' : 'DDD', '.e' : 'EEE'})
+ ret = s(env, [])
+ assert ret is None, ret
+ ret = s(env, [MyNode('foo.d')])
+ assert ret == 'DDD', ret
+ ret = s(env, [MyNode('bar.e')])
+ assert ret == 'EEE', ret
+ ret = s(env, [MyNode('bar.x')])
+ assert ret is None, ret
+ s[None] = 'XXX'
+ ret = s(env, [MyNode('bar.x')])
+ assert ret == 'XXX', ret
+
+ env = DummyEnv({'FSUFF' : '.f', 'GSUFF' : '.g'})
+
+ s = Selector({'$FSUFF' : 'FFF', '$GSUFF' : 'GGG'})
+ ret = s(env, [MyNode('foo.f')])
+ assert ret == 'FFF', ret
+ ret = s(env, [MyNode('bar.g')])
+ assert ret == 'GGG', ret
+
+ def test_adjustixes(self):
+ """Test the adjustixes() function"""
+ r = adjustixes('file', 'pre-', '-suf')
+ assert r == 'pre-file-suf', r
+ r = adjustixes('pre-file', 'pre-', '-suf')
+ assert r == 'pre-file-suf', r
+ r = adjustixes('file-suf', 'pre-', '-suf')
+ assert r == 'pre-file-suf', r
+ r = adjustixes('pre-file-suf', 'pre-', '-suf')
+ assert r == 'pre-file-suf', r
+ r = adjustixes('pre-file.xxx', 'pre-', '-suf')
+ assert r == 'pre-file.xxx', r
+ r = adjustixes('dir/file', 'pre-', '-suf')
+ assert r == os.path.join('dir', 'pre-file-suf'), r
+
+ def test_containsAny(self):
+ """Test the containsAny() function"""
+ assert containsAny('*.py', '*?[]')
+ assert not containsAny('file.txt', '*?[]')
+
+ def test_containsAll(self):
+ """Test the containsAll() function"""
+ assert containsAll('43221', '123')
+ assert not containsAll('134', '123')
+
+ def test_containsOnly(self):
+ """Test the containsOnly() function"""
+ assert containsOnly('.83', '0123456789.')
+ assert not containsOnly('43221', '123')
+
+ def test_LogicalLines(self):
+ """Test the LogicalLines class"""
+ content = u"""
+foo \
+bar \
+baz
+foo
+bling \
+bling \ bling
+bling
+"""
+ fobj = io.StringIO(content)
+ lines = LogicalLines(fobj).readlines()
+ assert lines == [
+ '\n',
+ 'foo bar baz\n',
+ 'foo\n',
+ 'bling bling \\ bling\n',
+ 'bling\n',
+ ], lines
+
+ def test_intern(self):
+ s1 = silent_intern("spam")
+ # TODO: Python 3.x does not have a unicode() global function
+ if sys.version[0] == '2':
+ s2 = silent_intern(unicode("unicode spam"))
+ s3 = silent_intern(42)
+ s4 = silent_intern("spam")
+ assert id(s1) == id(s4)
+
+
+class MD5TestCase(unittest.TestCase):
+
+ def test_collect(self):
+ """Test collecting a list of signatures into a new signature value
+ """
+ s = list(map(MD5signature, ('111', '222', '333')))
+
+ assert '698d51a19d8a121ce581499d7b701668' == MD5collect(s[0:1])
+ assert '8980c988edc2c78cc43ccb718c06efd5' == MD5collect(s[0:2])
+ assert '53fd88c84ff8a285eb6e0a687e55b8c7' == MD5collect(s)
+
+ def test_MD5signature(self):
+ """Test generating a signature"""
+ s = MD5signature('111')
+ assert '698d51a19d8a121ce581499d7b701668' == s, s
+
+ s = MD5signature('222')
+ assert 'bcbe3365e6ac95ea2c0343a2395834dd' == s, s
+
+class NodeListTestCase(unittest.TestCase):
+ def test_simple_attributes(self):
+ """Test simple attributes of a NodeList class"""
+ class TestClass(object):
+ def __init__(self, name, child=None):
+ self.child = child
+ self.bar = name
+
+ t1 = TestClass('t1', TestClass('t1child'))
+ t2 = TestClass('t2', TestClass('t2child'))
+ t3 = TestClass('t3')
+
+ nl = NodeList([t1, t2, t3])
+ assert nl.bar == [ 't1', 't2', 't3' ], nl.bar
+ assert nl[0:2].child.bar == [ 't1child', 't2child' ], \
+ nl[0:2].child.bar
+
+ def test_callable_attributes(self):
+ """Test callable attributes of a NodeList class"""
+ class TestClass(object):
+ def __init__(self, name, child=None):
+ self.child = child
+ self.bar = name
+ def foo(self):
+ return self.bar + "foo"
+ def getself(self):
+ return self
+
+ t1 = TestClass('t1', TestClass('t1child'))
+ t2 = TestClass('t2', TestClass('t2child'))
+ t3 = TestClass('t3')
+
+ nl = NodeList([t1, t2, t3])
+ assert nl.foo() == [ 't1foo', 't2foo', 't3foo' ], nl.foo()
+ assert nl.bar == [ 't1', 't2', 't3' ], nl.bar
+ assert nl.getself().bar == [ 't1', 't2', 't3' ], nl.getself().bar
+ assert nl[0:2].child.foo() == [ 't1childfoo', 't2childfoo' ], \
+ nl[0:2].child.foo()
+ assert nl[0:2].child.bar == [ 't1child', 't2child' ], \
+ nl[0:2].child.bar
+
+ def test_null(self):
+ """Test a null NodeList"""
+ nl = NodeList([])
+ r = str(nl)
+ assert r == '', r
+ for node in nl:
+ raise Exception("should not enter this loop")
+
+
+class flattenTestCase(unittest.TestCase):
+
+ def test_scalar(self):
+ """Test flattening a scalar"""
+ result = flatten('xyz')
+ assert result == ['xyz'], result
+
+
+if __name__ == "__main__":
+ suite = unittest.TestSuite()
+ tclasses = [ dictifyTestCase,
+ flattenTestCase,
+ MD5TestCase,
+ NodeListTestCase,
+ UtilTestCase,
+ ]
+ for tclass in tclasses:
+ names = unittest.getTestCaseNames(tclass, 'test_')
+ suite.addTests(list(map(tclass, names)))
+ TestUnit.run(suite)
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Variables/BoolVariable.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Variables/BoolVariable.py
new file mode 100644
index 0000000..ce46eda
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Variables/BoolVariable.py
@@ -0,0 +1,89 @@
+"""engine.SCons.Variables.BoolVariable
+
+This file defines the option type for SCons implementing true/false values.
+
+Usage example::
+
+ opts = Variables()
+ opts.Add(BoolVariable('embedded', 'build for an embedded system', 0))
+ ...
+ if env['embedded'] == 1:
+ ...
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+__all__ = ['BoolVariable',]
+
+import SCons.Errors
+
+__true_strings = ('y', 'yes', 'true', 't', '1', 'on' , 'all' )
+__false_strings = ('n', 'no', 'false', 'f', '0', 'off', 'none')
+
+
+def _text2bool(val):
+ """
+ Converts strings to True/False depending on the 'truth' expressed by
+ the string. If the string can't be converted, the original value
+ will be returned.
+
+ See '__true_strings' and '__false_strings' for values considered
+ 'true' or 'false respectively.
+
+ This is usable as 'converter' for SCons' Variables.
+ """
+ lval = val.lower()
+ if lval in __true_strings: return True
+ if lval in __false_strings: return False
+ raise ValueError("Invalid value for boolean option: %s" % val)
+
+
+def _validator(key, val, env):
+ """
+ Validates the given value to be either '0' or '1'.
+
+ This is usable as 'validator' for SCons' Variables.
+ """
+ if not env[key] in (True, False):
+ raise SCons.Errors.UserError(
+ 'Invalid value for boolean option %s: %s' % (key, env[key]))
+
+
+def BoolVariable(key, help, default):
+ """
+ The input parameters describe a boolean option, thus they are
+ returned with the correct converter and validator appended. The
+ 'help' text will by appended by '(yes|no) to show the valid
+ valued. The result is usable for input to opts.Add().
+ """
+ return (key, '%s (yes|no)' % help, default,
+ _validator, _text2bool)
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Variables/BoolVariableTests.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Variables/BoolVariableTests.py
new file mode 100644
index 0000000..7110f6f
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Variables/BoolVariableTests.py
@@ -0,0 +1,128 @@
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import sys
+import unittest
+
+import TestUnit
+
+import SCons.Errors
+import SCons.Variables
+
+class BoolVariableTestCase(unittest.TestCase):
+ def test_BoolVariable(self):
+ """Test BoolVariable creation"""
+ opts = SCons.Variables.Variables()
+ opts.Add(SCons.Variables.BoolVariable('test', 'test option help', 0))
+
+ o = opts.options[0]
+ assert o.key == 'test', o.key
+ assert o.help == 'test option help (yes|no)', o.help
+ assert o.default == 0, o.default
+ assert o.validator is not None, o.validator
+ assert o.converter is not None, o.converter
+
+ def test_converter(self):
+ """Test the BoolVariable converter"""
+ opts = SCons.Variables.Variables()
+ opts.Add(SCons.Variables.BoolVariable('test', 'test option help', 0))
+
+ o = opts.options[0]
+
+ true_values = [
+ 'y', 'Y',
+ 'yes', 'YES',
+ 't', 'T',
+ 'true', 'TRUE',
+ 'on', 'ON',
+ 'all', 'ALL',
+ '1',
+ ]
+ false_values = [
+ 'n', 'N',
+ 'no', 'NO',
+ 'f', 'F',
+ 'false', 'FALSE',
+ 'off', 'OFF',
+ 'none', 'NONE',
+ '0',
+ ]
+
+ for t in true_values:
+ x = o.converter(t)
+ assert x, "converter returned false for '%s'" % t
+
+ for f in false_values:
+ x = o.converter(f)
+ assert not x, "converter returned true for '%s'" % f
+
+ caught = None
+ try:
+ o.converter('x')
+ except ValueError:
+ caught = 1
+ assert caught, "did not catch expected ValueError"
+
+ def test_validator(self):
+ """Test the BoolVariable validator"""
+ opts = SCons.Variables.Variables()
+ opts.Add(SCons.Variables.BoolVariable('test', 'test option help', 0))
+
+ o = opts.options[0]
+
+ env = {
+ 'T' : True,
+ 'F' : False,
+ 'N' : 'xyzzy',
+ }
+
+ o.validator('T', 0, env)
+
+ o.validator('F', 0, env)
+
+ caught = None
+ try:
+ o.validator('N', 0, env)
+ except SCons.Errors.UserError:
+ caught = 1
+ assert caught, "did not catch expected UserError for N"
+
+ caught = None
+ try:
+ o.validator('NOSUCHKEY', 0, env)
+ except KeyError:
+ caught = 1
+ assert caught, "did not catch expected KeyError for NOSUCHKEY"
+
+
+if __name__ == "__main__":
+ suite = unittest.makeSuite(BoolVariableTestCase, 'test_')
+ TestUnit.run(suite)
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Variables/EnumVariable.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Variables/EnumVariable.py
new file mode 100644
index 0000000..a9fb100
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Variables/EnumVariable.py
@@ -0,0 +1,101 @@
+"""engine.SCons.Variables.EnumVariable
+
+This file defines the option type for SCons allowing only specified
+input-values.
+
+Usage example::
+
+ opts = Variables()
+ opts.Add(EnumVariable('debug', 'debug output and symbols', 'no',
+ allowed_values=('yes', 'no', 'full'),
+ map={}, ignorecase=2))
+ ...
+ if env['debug'] == 'full':
+ ...
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+__all__ = ['EnumVariable',]
+
+
+import SCons.Errors
+
+def _validator(key, val, env, vals):
+ if not val in vals:
+ raise SCons.Errors.UserError(
+ 'Invalid value for option %s: %s. Valid values are: %s' % (key, val, vals))
+
+
+def EnumVariable(key, help, default, allowed_values, map={}, ignorecase=0):
+ """
+ The input parameters describe an option with only certain values
+ allowed. They are returned with an appropriate converter and
+ validator appended. The result is usable for input to
+ Variables.Add().
+
+ 'key' and 'default' are the values to be passed on to Variables.Add().
+
+ 'help' will be appended by the allowed values automatically
+
+ 'allowed_values' is a list of strings, which are allowed as values
+ for this option.
+
+ The 'map'-dictionary may be used for converting the input value
+ into canonical values (e.g. for aliases).
+
+ 'ignorecase' defines the behaviour of the validator:
+
+ If ignorecase == 0, the validator/converter are case-sensitive.
+ If ignorecase == 1, the validator/converter are case-insensitive.
+ If ignorecase == 2, the validator/converter is case-insensitive and the converted value will always be lower-case.
+
+ The 'validator' tests whether the value is in the list of allowed values. The 'converter' converts input values
+ according to the given 'map'-dictionary (unmapped input values are returned unchanged).
+ """
+
+ help = '%s (%s)' % (help, '|'.join(allowed_values))
+ # define validator
+ if ignorecase >= 1:
+ validator = lambda key, val, env: \
+ _validator(key, val.lower(), env, allowed_values)
+ else:
+ validator = lambda key, val, env: \
+ _validator(key, val, env, allowed_values)
+ # define converter
+ if ignorecase == 2:
+ converter = lambda val: map.get(val.lower(), val).lower()
+ elif ignorecase == 1:
+ converter = lambda val: map.get(val.lower(), val)
+ else:
+ converter = lambda val: map.get(val, val)
+ return (key, help, default, validator, converter)
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Variables/EnumVariableTests.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Variables/EnumVariableTests.py
new file mode 100644
index 0000000..931dfe2
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Variables/EnumVariableTests.py
@@ -0,0 +1,205 @@
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import sys
+import unittest
+
+import TestUnit
+
+import SCons.Errors
+import SCons.Variables
+
+class EnumVariableTestCase(unittest.TestCase):
+ def test_EnumVariable(self):
+ """Test EnumVariable creation"""
+ opts = SCons.Variables.Variables()
+ opts.Add(SCons.Variables.EnumVariable('test', 'test option help', 0,
+ ['one', 'two', 'three'],
+ {}))
+
+ o = opts.options[0]
+ assert o.key == 'test', o.key
+ assert o.help == 'test option help (one|two|three)', o.help
+ assert o.default == 0, o.default
+ assert o.validator is not None, o.validator
+ assert o.converter is not None, o.converter
+
+ def test_converter(self):
+ """Test the EnumVariable converter"""
+ opts = SCons.Variables.Variables()
+ opts.Add(SCons.Variables.EnumVariable('test', 'test option help', 0,
+ ['one', 'two', 'three']))
+
+ o = opts.options[0]
+
+ for a in ['one', 'two', 'three', 'no_match']:
+ x = o.converter(a)
+ assert x == a, x
+
+ opts = SCons.Variables.Variables()
+ opts.Add(SCons.Variables.EnumVariable('test', 'test option help', 0,
+ ['one', 'two', 'three'],
+ {'1' : 'one',
+ '2' : 'two',
+ '3' : 'three'}))
+
+ o = opts.options[0]
+
+ x = o.converter('one')
+ assert x == 'one', x
+ x = o.converter('1')
+ assert x == 'one', x
+
+ x = o.converter('two')
+ assert x == 'two', x
+ x = o.converter('2')
+ assert x == 'two', x
+
+ x = o.converter('three')
+ assert x == 'three', x
+ x = o.converter('3')
+ assert x == 'three', x
+
+ opts = SCons.Variables.Variables()
+ opts.Add(SCons.Variables.EnumVariable('test0', 'test option help', 0,
+ ['one', 'two', 'three'],
+ {'a' : 'one',
+ 'b' : 'two',
+ 'c' : 'three'},
+ ignorecase=0))
+ opts.Add(SCons.Variables.EnumVariable('test1', 'test option help', 0,
+ ['one', 'two', 'three'],
+ {'a' : 'one',
+ 'b' : 'two',
+ 'c' : 'three'},
+ ignorecase=1))
+ opts.Add(SCons.Variables.EnumVariable('test2', 'test option help', 0,
+ ['one', 'two', 'three'],
+ {'a' : 'one',
+ 'b' : 'two',
+ 'c' : 'three'},
+ ignorecase=2))
+
+ o0 = opts.options[0]
+ o1 = opts.options[1]
+ o2 = opts.options[2]
+
+ table = {
+ 'one' : ['one', 'one', 'one'],
+ 'One' : ['One', 'One', 'one'],
+ 'ONE' : ['ONE', 'ONE', 'one'],
+ 'two' : ['two', 'two', 'two'],
+ 'twO' : ['twO', 'twO', 'two'],
+ 'TWO' : ['TWO', 'TWO', 'two'],
+ 'three' : ['three', 'three', 'three'],
+ 'thRee' : ['thRee', 'thRee', 'three'],
+ 'THREE' : ['THREE', 'THREE', 'three'],
+ 'a' : ['one', 'one', 'one'],
+ 'A' : ['A', 'one', 'one'],
+ 'b' : ['two', 'two', 'two'],
+ 'B' : ['B', 'two', 'two'],
+ 'c' : ['three', 'three', 'three'],
+ 'C' : ['C', 'three', 'three'],
+ }
+
+ for k, l in table.items():
+ x = o0.converter(k)
+ assert x == l[0], "o0 got %s, expected %s" % (x, l[0])
+ x = o1.converter(k)
+ assert x == l[1], "o1 got %s, expected %s" % (x, l[1])
+ x = o2.converter(k)
+ assert x == l[2], "o2 got %s, expected %s" % (x, l[2])
+
+ def test_validator(self):
+ """Test the EnumVariable validator"""
+ opts = SCons.Variables.Variables()
+ opts.Add(SCons.Variables.EnumVariable('test0', 'test option help', 0,
+ ['one', 'two', 'three'],
+ {'a' : 'one',
+ 'b' : 'two',
+ 'c' : 'three'},
+ ignorecase=0))
+ opts.Add(SCons.Variables.EnumVariable('test1', 'test option help', 0,
+ ['one', 'two', 'three'],
+ {'a' : 'one',
+ 'b' : 'two',
+ 'c' : 'three'},
+ ignorecase=1))
+ opts.Add(SCons.Variables.EnumVariable('test2', 'test option help', 0,
+ ['one', 'two', 'three'],
+ {'a' : 'one',
+ 'b' : 'two',
+ 'c' : 'three'},
+ ignorecase=2))
+
+ o0 = opts.options[0]
+ o1 = opts.options[1]
+ o2 = opts.options[2]
+
+ def valid(o, v):
+ o.validator('X', v, {})
+
+ def invalid(o, v):
+ caught = None
+ try:
+ o.validator('X', v, {})
+ except SCons.Errors.UserError:
+ caught = 1
+ assert caught, "did not catch expected UserError for o = %s, v = %s" % (o.key, v)
+
+ table = {
+ 'one' : [ valid, valid, valid],
+ 'One' : [invalid, valid, valid],
+ 'ONE' : [invalid, valid, valid],
+ 'two' : [ valid, valid, valid],
+ 'twO' : [invalid, valid, valid],
+ 'TWO' : [invalid, valid, valid],
+ 'three' : [ valid, valid, valid],
+ 'thRee' : [invalid, valid, valid],
+ 'THREE' : [invalid, valid, valid],
+ 'a' : [invalid, invalid, invalid],
+ 'A' : [invalid, invalid, invalid],
+ 'b' : [invalid, invalid, invalid],
+ 'B' : [invalid, invalid, invalid],
+ 'c' : [invalid, invalid, invalid],
+ 'C' : [invalid, invalid, invalid],
+ 'no_v' : [invalid, invalid, invalid],
+ }
+
+ for v, l in table.items():
+ l[0](o0, v)
+ l[1](o1, v)
+ l[2](o2, v)
+
+
+if __name__ == "__main__":
+ suite = unittest.makeSuite(EnumVariableTestCase, 'test_')
+ TestUnit.run(suite)
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Variables/ListVariable.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Variables/ListVariable.py
new file mode 100644
index 0000000..9024867
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Variables/ListVariable.py
@@ -0,0 +1,135 @@
+"""engine.SCons.Variables.ListVariable
+
+This file defines the option type for SCons implementing 'lists'.
+
+A 'list' option may either be 'all', 'none' or a list of names
+separated by comma. After the option has been processed, the option
+value holds either the named list elements, all list elements or no
+list elements at all.
+
+Usage example::
+
+ list_of_libs = Split('x11 gl qt ical')
+
+ opts = Variables()
+ opts.Add(ListVariable('shared',
+ 'libraries to build as shared libraries',
+ 'all',
+ elems = list_of_libs))
+ ...
+ for lib in list_of_libs:
+ if lib in env['shared']:
+ env.SharedObject(...)
+ else:
+ env.Object(...)
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+# Known Bug: This should behave like a Set-Type, but does not really,
+# since elements can occur twice.
+
+__all__ = ['ListVariable',]
+
+import collections
+
+import SCons.Util
+
+
+class _ListVariable(collections.UserList):
+ def __init__(self, initlist=[], allowedElems=[]):
+ collections.UserList.__init__(self, [_f for _f in initlist if _f])
+ self.allowedElems = sorted(allowedElems)
+
+ def __cmp__(self, other):
+ raise NotImplementedError
+ def __eq__(self, other):
+ raise NotImplementedError
+ def __ge__(self, other):
+ raise NotImplementedError
+ def __gt__(self, other):
+ raise NotImplementedError
+ def __le__(self, other):
+ raise NotImplementedError
+ def __lt__(self, other):
+ raise NotImplementedError
+ def __str__(self):
+ if len(self) == 0:
+ return 'none'
+ self.data.sort()
+ if self.data == self.allowedElems:
+ return 'all'
+ else:
+ return ','.join(self)
+ def prepare_to_store(self):
+ return self.__str__()
+
+def _converter(val, allowedElems, mapdict):
+ """
+ """
+ if val == 'none':
+ val = []
+ elif val == 'all':
+ val = allowedElems
+ else:
+ val = [_f for _f in val.split(',') if _f]
+ val = [mapdict.get(v, v) for v in val]
+ notAllowed = [v for v in val if not v in allowedElems]
+ if notAllowed:
+ raise ValueError("Invalid value(s) for option: %s" %
+ ','.join(notAllowed))
+ return _ListVariable(val, allowedElems)
+
+
+## def _validator(key, val, env):
+## """
+## """
+## # todo: write validator for pgk list
+## return 1
+
+
+def ListVariable(key, help, default, names, map={}):
+ """
+ The input parameters describe a 'package list' option, thus they
+ are returned with the correct converter and validator appended. The
+ result is usable for input to opts.Add() .
+
+ A 'package list' option may either be 'all', 'none' or a list of
+ package names (separated by space).
+ """
+ names_str = 'allowed names: %s' % ' '.join(names)
+ if SCons.Util.is_List(default):
+ default = ','.join(default)
+ help = '\n '.join(
+ (help, '(all|none|comma-separated list of names)', names_str))
+ return (key, help, default,
+ None, #_validator,
+ lambda val: _converter(val, names, map))
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Variables/ListVariableTests.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Variables/ListVariableTests.py
new file mode 100644
index 0000000..adfd353
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Variables/ListVariableTests.py
@@ -0,0 +1,135 @@
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import copy
+import sys
+import unittest
+
+import TestUnit
+
+import SCons.Errors
+import SCons.Variables
+
+class ListVariableTestCase(unittest.TestCase):
+ def test_ListVariable(self):
+ """Test ListVariable creation"""
+ opts = SCons.Variables.Variables()
+ opts.Add(SCons.Variables.ListVariable('test', 'test option help', 'all',
+ ['one', 'two', 'three']))
+
+ o = opts.options[0]
+ assert o.key == 'test', o.key
+ assert o.help == 'test option help\n (all|none|comma-separated list of names)\n allowed names: one two three', repr(o.help)
+ assert o.default == 'all', o.default
+ assert o.validator is None, o.validator
+ assert not o.converter is None, o.converter
+
+ opts = SCons.Variables.Variables()
+ opts.Add(SCons.Variables.ListVariable('test2', 'test2 help',
+ ['one', 'three'],
+ ['one', 'two', 'three']))
+
+ o = opts.options[0]
+ assert o.default == 'one,three'
+
+ def test_converter(self):
+ """Test the ListVariable converter"""
+ opts = SCons.Variables.Variables()
+ opts.Add(SCons.Variables.ListVariable('test', 'test option help', 'all',
+ ['one', 'two', 'three'],
+ {'ONE':'one', 'TWO':'two'}))
+
+ o = opts.options[0]
+
+ x = o.converter('all')
+ assert str(x) == 'all', x
+
+ x = o.converter('none')
+ assert str(x) == 'none', x
+
+ x = o.converter('one')
+ assert str(x) == 'one', x
+ x = o.converter('ONE')
+ assert str(x) == 'one', x
+
+ x = o.converter('two')
+ assert str(x) == 'two', x
+ x = o.converter('TWO')
+ assert str(x) == 'two', x
+
+ x = o.converter('three')
+ assert str(x) == 'three', x
+
+ x = o.converter('one,two')
+ assert str(x) == 'one,two', x
+ x = o.converter('two,one')
+ assert str(x) == 'one,two', x
+
+ x = o.converter('one,three')
+ assert str(x) == 'one,three', x
+ x = o.converter('three,one')
+ assert str(x) == 'one,three', x
+
+ x = o.converter('two,three')
+ assert str(x) == 'three,two', x
+ x = o.converter('three,two')
+ assert str(x) == 'three,two', x
+
+ x = o.converter('one,two,three')
+ assert str(x) == 'all', x
+
+ x = o.converter('three,two,one')
+ assert str(x) == 'all', x
+
+ x = o.converter('three,ONE,TWO')
+ assert str(x) == 'all', x
+
+ caught = None
+ try:
+ x = o.converter('no_match')
+ except ValueError:
+ caught = 1
+ assert caught, "did not catch expected ValueError"
+
+ def test_copy(self):
+ """Test copying a ListVariable like an Environment would"""
+ opts = SCons.Variables.Variables()
+ opts.Add(SCons.Variables.ListVariable('test', 'test option help', 'all',
+ ['one', 'two', 'three']))
+
+ o = opts.options[0]
+
+ l = o.converter('all')
+ n = l.__class__(copy.copy(l))
+
+if __name__ == "__main__":
+ suite = unittest.makeSuite(ListVariableTestCase, 'test_')
+ TestUnit.run(suite)
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Variables/PackageVariable.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Variables/PackageVariable.py
new file mode 100644
index 0000000..a0ace25
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Variables/PackageVariable.py
@@ -0,0 +1,106 @@
+"""engine.SCons.Variables.PackageVariable
+
+This file defines the option type for SCons implementing 'package
+activation'.
+
+To be used whenever a 'package' may be enabled/disabled and the
+package path may be specified.
+
+Usage example:
+
+ Examples:
+ x11=no (disables X11 support)
+ x11=yes (will search for the package installation dir)
+ x11=/usr/local/X11 (will check this path for existence)
+
+ To replace autoconf's --with-xxx=yyy ::
+
+ opts = Variables()
+ opts.Add(PackageVariable('x11',
+ 'use X11 installed here (yes = search some places',
+ 'yes'))
+ ...
+ if env['x11'] == True:
+ dir = ... search X11 in some standard places ...
+ env['x11'] = dir
+ if env['x11']:
+ ... build with x11 ...
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+__all__ = ['PackageVariable',]
+
+import SCons.Errors
+
+__enable_strings = ('1', 'yes', 'true', 'on', 'enable', 'search')
+__disable_strings = ('0', 'no', 'false', 'off', 'disable')
+
+def _converter(val):
+ """
+ """
+ lval = val.lower()
+ if lval in __enable_strings: return True
+ if lval in __disable_strings: return False
+ #raise ValueError("Invalid value for boolean option: %s" % val)
+ return val
+
+
+def _validator(key, val, env, searchfunc):
+ # NB: searchfunc is currently undocumented and unsupported
+ """
+ """
+ # TODO write validator, check for path
+ import os
+ if env[key] is True:
+ if searchfunc:
+ env[key] = searchfunc(key, val)
+ elif env[key] and not os.path.exists(val):
+ raise SCons.Errors.UserError(
+ 'Path does not exist for option %s: %s' % (key, val))
+
+
+def PackageVariable(key, help, default, searchfunc=None):
+ # NB: searchfunc is currently undocumented and unsupported
+ """
+ The input parameters describe a 'package list' option, thus they
+ are returned with the correct converter and validator appended. The
+ result is usable for input to opts.Add() .
+
+ A 'package list' option may either be 'all', 'none' or a list of
+ package names (separated by space).
+ """
+ help = '\n '.join(
+ (help, '( yes | no | /path/to/%s )' % key))
+ return (key, help, default,
+ lambda k, v, e: _validator(k,v,e,searchfunc),
+ _converter)
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Variables/PackageVariableTests.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Variables/PackageVariableTests.py
new file mode 100644
index 0000000..3aa411d
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Variables/PackageVariableTests.py
@@ -0,0 +1,125 @@
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import sys
+import unittest
+
+import SCons.Errors
+import SCons.Variables
+
+import TestCmd
+import TestUnit
+
+
+class PackageVariableTestCase(unittest.TestCase):
+ def test_PackageVariable(self):
+ """Test PackageVariable creation"""
+ opts = SCons.Variables.Variables()
+ opts.Add(SCons.Variables.PackageVariable('test', 'test option help', '/default/path'))
+
+ o = opts.options[0]
+ assert o.key == 'test', o.key
+ assert o.help == 'test option help\n ( yes | no | /path/to/test )', repr(o.help)
+ assert o.default == '/default/path', o.default
+ assert o.validator is not None, o.validator
+ assert o.converter is not None, o.converter
+
+ def test_converter(self):
+ """Test the PackageVariable converter"""
+ opts = SCons.Variables.Variables()
+ opts.Add(SCons.Variables.PackageVariable('test', 'test option help', '/default/path'))
+
+ o = opts.options[0]
+
+ true_values = [
+ 'yes', 'YES',
+ 'true', 'TRUE',
+ 'on', 'ON',
+ 'enable', 'ENABLE',
+ 'search', 'SEARCH',
+ ]
+ false_values = [
+ 'no', 'NO',
+ 'false', 'FALSE',
+ 'off', 'OFF',
+ 'disable', 'DISABLE',
+ ]
+
+ for t in true_values:
+ x = o.converter(t)
+ assert x, "converter returned false for '%s'" % t
+
+ for f in false_values:
+ x = o.converter(f)
+ assert not x, "converter returned true for '%s'" % f
+
+ x = o.converter('/explicit/path')
+ assert x == '/explicit/path', x
+
+ # Make sure the converter returns True if we give it str(True) and
+ # False when we give it str(False). This assures consistent operation
+ # through a cycle of Variables.Save(<file>) -> Variables(<file>).
+ x = o.converter(str(True))
+ assert x == True, "converter returned a string when given str(True)"
+
+ x = o.converter(str(False))
+ assert x == False, "converter returned a string when given str(False)"
+
+ def test_validator(self):
+ """Test the PackageVariable validator"""
+ opts = SCons.Variables.Variables()
+ opts.Add(SCons.Variables.PackageVariable('test', 'test option help', '/default/path'))
+
+ test = TestCmd.TestCmd(workdir='')
+ test.write('exists', 'exists\n')
+
+ o = opts.options[0]
+
+ env = {'F':False, 'T':True, 'X':'x'}
+
+ exists = test.workpath('exists')
+ does_not_exist = test.workpath('does_not_exist')
+
+ o.validator('F', '/path', env)
+ o.validator('T', '/path', env)
+ o.validator('X', exists, env)
+
+ caught = None
+ try:
+ o.validator('X', does_not_exist, env)
+ except SCons.Errors.UserError:
+ caught = 1
+ assert caught, "did not catch expected UserError"
+
+
+if __name__ == "__main__":
+ suite = unittest.makeSuite(PackageVariableTestCase, 'test_')
+ TestUnit.run(suite)
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Variables/PathVariable.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Variables/PathVariable.py
new file mode 100644
index 0000000..0ffcbc5
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Variables/PathVariable.py
@@ -0,0 +1,145 @@
+"""SCons.Variables.PathVariable
+
+This file defines an option type for SCons implementing path settings.
+
+To be used whenever a user-specified path override should be allowed.
+
+Arguments to PathVariable are:
+ option-name = name of this option on the command line (e.g. "prefix")
+ option-help = help string for option
+ option-dflt = default value for this option
+ validator = [optional] validator for option value. Predefined validators are:
+
+ PathAccept -- accepts any path setting; no validation
+ PathIsDir -- path must be an existing directory
+ PathIsDirCreate -- path must be a dir; will create
+ PathIsFile -- path must be a file
+ PathExists -- path must exist (any type) [default]
+
+ The validator is a function that is called and which
+ should return True or False to indicate if the path
+ is valid. The arguments to the validator function
+ are: (key, val, env). The key is the name of the
+ option, the val is the path specified for the option,
+ and the env is the env to which the Options have been
+ added.
+
+Usage example::
+
+ Examples:
+ prefix=/usr/local
+
+ opts = Variables()
+
+ opts = Variables()
+ opts.Add(PathVariable('qtdir',
+ 'where the root of Qt is installed',
+ qtdir, PathIsDir))
+ opts.Add(PathVariable('qt_includes',
+ 'where the Qt includes are installed',
+ '$qtdir/includes', PathIsDirCreate))
+ opts.Add(PathVariable('qt_libraries',
+ 'where the Qt library is installed',
+ '$qtdir/lib'))
+
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+__all__ = ['PathVariable',]
+
+import os
+import os.path
+
+import SCons.Errors
+
+class _PathVariableClass(object):
+
+ def PathAccept(self, key, val, env):
+ """Accepts any path, no checking done."""
+ pass
+
+ def PathIsDir(self, key, val, env):
+ """Validator to check if Path is a directory."""
+ if not os.path.isdir(val):
+ if os.path.isfile(val):
+ m = 'Directory path for option %s is a file: %s'
+ else:
+ m = 'Directory path for option %s does not exist: %s'
+ raise SCons.Errors.UserError(m % (key, val))
+
+ def PathIsDirCreate(self, key, val, env):
+ """Validator to check if Path is a directory,
+ creating it if it does not exist."""
+ if os.path.isfile(val):
+ m = 'Path for option %s is a file, not a directory: %s'
+ raise SCons.Errors.UserError(m % (key, val))
+ if not os.path.isdir(val):
+ os.makedirs(val)
+
+ def PathIsFile(self, key, val, env):
+ """Validator to check if Path is a file"""
+ if not os.path.isfile(val):
+ if os.path.isdir(val):
+ m = 'File path for option %s is a directory: %s'
+ else:
+ m = 'File path for option %s does not exist: %s'
+ raise SCons.Errors.UserError(m % (key, val))
+
+ def PathExists(self, key, val, env):
+ """Validator to check if Path exists"""
+ if not os.path.exists(val):
+ m = 'Path for option %s does not exist: %s'
+ raise SCons.Errors.UserError(m % (key, val))
+
+ def __call__(self, key, help, default, validator=None):
+ """
+ The input parameters describe a 'path list' option, thus they
+ are returned with the correct converter and validator appended. The
+ result is usable for input to opts.Add() .
+
+ The 'default' option specifies the default path to use if the
+ user does not specify an override with this option.
+
+ validator is a validator, see this file for examples
+ """
+ if validator is None:
+ validator = self.PathExists
+
+ if SCons.Util.is_List(key) or SCons.Util.is_Tuple(key):
+ return (key, '%s ( /path/to/%s )' % (help, key[0]), default,
+ validator, None)
+ else:
+ return (key, '%s ( /path/to/%s )' % (help, key), default,
+ validator, None)
+
+PathVariable = _PathVariableClass()
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Variables/PathVariableTests.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Variables/PathVariableTests.py
new file mode 100644
index 0000000..3d9d25c
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Variables/PathVariableTests.py
@@ -0,0 +1,238 @@
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import os.path
+import sys
+import unittest
+
+import SCons.Errors
+import SCons.Variables
+
+import TestCmd
+import TestUnit
+
+
+class PathVariableTestCase(unittest.TestCase):
+ def test_PathVariable(self):
+ """Test PathVariable creation"""
+ opts = SCons.Variables.Variables()
+ opts.Add(SCons.Variables.PathVariable('test',
+ 'test option help',
+ '/default/path'))
+
+ o = opts.options[0]
+ assert o.key == 'test', o.key
+ assert o.help == 'test option help ( /path/to/test )', repr(o.help)
+ assert o.default == '/default/path', o.default
+ assert o.validator is not None, o.validator
+ assert o.converter is None, o.converter
+
+ def test_PathExists(self):
+ """Test the PathExists validator"""
+ opts = SCons.Variables.Variables()
+ opts.Add(SCons.Variables.PathVariable('test',
+ 'test option help',
+ '/default/path',
+ SCons.Variables.PathVariable.PathExists))
+
+ test = TestCmd.TestCmd(workdir='')
+ test.write('exists', 'exists\n')
+
+ o = opts.options[0]
+
+ o.validator('X', test.workpath('exists'), {})
+
+ dne = test.workpath('does_not_exist')
+ try:
+ o.validator('X', dne, {})
+ except SCons.Errors.UserError as e:
+ assert str(e) == 'Path for option X does not exist: %s' % dne, e
+ except:
+ raise Exception("did not catch expected UserError")
+
+ def test_PathIsDir(self):
+ """Test the PathIsDir validator"""
+ opts = SCons.Variables.Variables()
+ opts.Add(SCons.Variables.PathVariable('test',
+ 'test option help',
+ '/default/path',
+ SCons.Variables.PathVariable.PathIsDir))
+
+ test = TestCmd.TestCmd(workdir='')
+ test.subdir('dir')
+ test.write('file', "file\n")
+
+ o = opts.options[0]
+
+ o.validator('X', test.workpath('dir'), {})
+
+ f = test.workpath('file')
+ try:
+ o.validator('X', f, {})
+ except SCons.Errors.UserError as e:
+ assert str(e) == 'Directory path for option X is a file: %s' % f, e
+ except:
+ raise Exception("did not catch expected UserError")
+
+ dne = test.workpath('does_not_exist')
+ try:
+ o.validator('X', dne, {})
+ except SCons.Errors.UserError as e:
+ assert str(e) == 'Directory path for option X does not exist: %s' % dne, e
+ except:
+ raise Exception("did not catch expected UserError")
+
+ def test_PathIsDirCreate(self):
+ """Test the PathIsDirCreate validator"""
+ opts = SCons.Variables.Variables()
+ opts.Add(SCons.Variables.PathVariable('test',
+ 'test option help',
+ '/default/path',
+ SCons.Variables.PathVariable.PathIsDirCreate))
+
+ test = TestCmd.TestCmd(workdir='')
+ test.write('file', "file\n")
+
+ o = opts.options[0]
+
+ d = test.workpath('dir')
+ o.validator('X', d, {})
+ assert os.path.isdir(d)
+
+ f = test.workpath('file')
+ try:
+ o.validator('X', f, {})
+ except SCons.Errors.UserError as e:
+ assert str(e) == 'Path for option X is a file, not a directory: %s' % f, e
+ except:
+ raise Exception("did not catch expected UserError")
+
+ def test_PathIsFile(self):
+ """Test the PathIsFile validator"""
+ opts = SCons.Variables.Variables()
+ opts.Add(SCons.Variables.PathVariable('test',
+ 'test option help',
+ '/default/path',
+ SCons.Variables.PathVariable.PathIsFile))
+
+ test = TestCmd.TestCmd(workdir='')
+ test.subdir('dir')
+ test.write('file', "file\n")
+
+ o = opts.options[0]
+
+ o.validator('X', test.workpath('file'), {})
+
+ d = test.workpath('d')
+ try:
+ o.validator('X', d, {})
+ except SCons.Errors.UserError as e:
+ assert str(e) == 'File path for option X does not exist: %s' % d, e
+ except:
+ raise Exception("did not catch expected UserError")
+
+ dne = test.workpath('does_not_exist')
+ try:
+ o.validator('X', dne, {})
+ except SCons.Errors.UserError as e:
+ assert str(e) == 'File path for option X does not exist: %s' % dne, e
+ except:
+ raise Exception("did not catch expected UserError")
+
+ def test_PathAccept(self):
+ """Test the PathAccept validator"""
+ opts = SCons.Variables.Variables()
+ opts.Add(SCons.Variables.PathVariable('test',
+ 'test option help',
+ '/default/path',
+ SCons.Variables.PathVariable.PathAccept))
+
+ test = TestCmd.TestCmd(workdir='')
+ test.subdir('dir')
+ test.write('file', "file\n")
+
+ o = opts.options[0]
+
+ o.validator('X', test.workpath('file'), {})
+
+ d = test.workpath('d')
+ o.validator('X', d, {})
+
+ dne = test.workpath('does_not_exist')
+ o.validator('X', dne, {})
+
+ def test_validator(self):
+ """Test the PathVariable validator argument"""
+ opts = SCons.Variables.Variables()
+ opts.Add(SCons.Variables.PathVariable('test',
+ 'test option help',
+ '/default/path'))
+
+ test = TestCmd.TestCmd(workdir='')
+ test.write('exists', 'exists\n')
+
+ o = opts.options[0]
+
+ o.validator('X', test.workpath('exists'), {})
+
+ dne = test.workpath('does_not_exist')
+ try:
+ o.validator('X', dne, {})
+ except SCons.Errors.UserError as e:
+ expect = 'Path for option X does not exist: %s' % dne
+ assert str(e) == expect, e
+ else:
+ raise Exception("did not catch expected UserError")
+
+ def my_validator(key, val, env):
+ raise Exception("my_validator() got called for %s, %s!" % (key, val))
+
+ opts = SCons.Variables.Variables()
+ opts.Add(SCons.Variables.PathVariable('test2',
+ 'more help',
+ '/default/path/again',
+ my_validator))
+
+ o = opts.options[0]
+
+ try:
+ o.validator('Y', 'value', {})
+ except Exception as e:
+ assert str(e) == 'my_validator() got called for Y, value!', e
+ else:
+ raise Exception("did not catch expected exception from my_validator()")
+
+
+
+
+if __name__ == "__main__":
+ suite = unittest.makeSuite(PathVariableTestCase, 'test_')
+ TestUnit.run(suite)
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Variables/VariablesTests.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Variables/VariablesTests.py
new file mode 100644
index 0000000..175a14b
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Variables/VariablesTests.py
@@ -0,0 +1,705 @@
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import sys
+import unittest
+
+import TestSCons
+import TestUnit
+
+import SCons.Variables
+import SCons.Subst
+import SCons.Warnings
+from SCons.Util import cmp
+
+
+class Environment(object):
+ def __init__(self):
+ self.dict = {}
+ def subst(self, x):
+ return SCons.Subst.scons_subst(x, self, gvars=self.dict)
+ def __setitem__(self, key, value):
+ self.dict[key] = value
+ def __getitem__(self, key):
+ return self.dict[key]
+ def __contains__(self, key):
+ return self.dict.__contains__(key)
+ def has_key(self, key):
+ return key in self.dict
+
+
+
+
+def check(key, value, env):
+ assert int(value) == 6 * 9, "key %s = %s" % (key, repr(value))
+
+# Check saved option file by executing and comparing against
+# the expected dictionary
+def checkSave(file, expected):
+ gdict = {}
+ ldict = {}
+ exec(open(file, 'r').read(), gdict, ldict)
+ assert expected == ldict, "%s\n...not equal to...\n%s" % (expected, ldict)
+
+class VariablesTestCase(unittest.TestCase):
+
+ def test_keys(self):
+ """Test the Variables.keys() method"""
+ opts = SCons.Variables.Variables()
+
+ opts.Add('VAR1')
+ opts.Add('VAR2',
+ 'THE answer to THE question',
+ "42",
+ check,
+ lambda x: int(x) + 12)
+ keys = list(opts.keys())
+ assert keys == ['VAR1', 'VAR2'], keys
+
+ def test_Add(self):
+ """Test adding to a Variables object"""
+ opts = SCons.Variables.Variables()
+
+ opts.Add('VAR')
+ opts.Add('ANSWER',
+ 'THE answer to THE question',
+ "42",
+ check,
+ lambda x: int(x) + 12)
+
+ o = opts.options[0]
+ assert o.key == 'VAR'
+ assert o.help == ''
+ assert o.default is None
+ assert o.validator is None
+ assert o.converter is None
+
+ o = opts.options[1]
+ assert o.key == 'ANSWER'
+ assert o.help == 'THE answer to THE question'
+ assert o.default == "42"
+ o.validator(o.key, o.converter(o.default), {})
+
+ def test_it(var, opts=opts):
+ exc_caught = None
+ try:
+ opts.Add(var)
+ except SCons.Errors.UserError:
+ exc_caught = 1
+ assert exc_caught, "did not catch UserError for '%s'" % var
+ test_it('foo/bar')
+ test_it('foo-bar')
+ test_it('foo.bar')
+
+ def test_AddVariables(self):
+ """Test adding a list of options to a Variables object"""
+ opts = SCons.Variables.Variables()
+
+ opts.AddVariables(('VAR2',),
+ ('ANSWER2',
+ 'THE answer to THE question',
+ "42",
+ check,
+ lambda x: int(x) + 12))
+
+ o = opts.options[0]
+ assert o.key == 'VAR2', o.key
+ assert o.help == '', o.help
+ assert o.default is None, o.default
+ assert o.validator is None, o.validator
+ assert o.converter is None, o.converter
+
+ o = opts.options[1]
+ assert o.key == 'ANSWER2', o.key
+ assert o.help == 'THE answer to THE question', o.help
+ assert o.default == "42", o.default
+ o.validator(o.key, o.converter(o.default), {})
+
+ def test_Update(self):
+ """Test updating an Environment"""
+
+ # Test that a default value is validated correctly.
+ test = TestSCons.TestSCons()
+ file = test.workpath('custom.py')
+ opts = SCons.Variables.Variables(file)
+
+ opts.Add('ANSWER',
+ 'THE answer to THE question',
+ "42",
+ check,
+ lambda x: int(x) + 12)
+
+ env = Environment()
+ opts.Update(env)
+ assert env['ANSWER'] == 54
+
+ env = Environment()
+ opts.Update(env, {})
+ assert env['ANSWER'] == 54
+
+ # Test that a bad value from the file is used and
+ # validation fails correctly.
+ test = TestSCons.TestSCons()
+ file = test.workpath('custom.py')
+ test.write('custom.py', 'ANSWER=54')
+ opts = SCons.Variables.Variables(file)
+
+ opts.Add('ANSWER',
+ 'THE answer to THE question',
+ "42",
+ check,
+ lambda x: int(x) + 12)
+
+ env = Environment()
+ exc_caught = None
+ try:
+ opts.Update(env)
+ except AssertionError:
+ exc_caught = 1
+ assert exc_caught, "did not catch expected assertion"
+
+ env = Environment()
+ exc_caught = None
+ try:
+ opts.Update(env, {})
+ except AssertionError:
+ exc_caught = 1
+ assert exc_caught, "did not catch expected assertion"
+
+ # Test that a good value from the file is used and validated.
+ test = TestSCons.TestSCons()
+ file = test.workpath('custom.py')
+ test.write('custom.py', 'ANSWER=42')
+ opts = SCons.Variables.Variables(file)
+
+ opts.Add('ANSWER',
+ 'THE answer to THE question',
+ "10",
+ check,
+ lambda x: int(x) + 12)
+
+ env = Environment()
+ opts.Update(env)
+ assert env['ANSWER'] == 54
+
+ env = Environment()
+ opts.Update(env, {})
+ assert env['ANSWER'] == 54
+
+ # Test that a bad value from an args dictionary passed to
+ # Update() is used and validation fails correctly.
+ test = TestSCons.TestSCons()
+ file = test.workpath('custom.py')
+ test.write('custom.py', 'ANSWER=10')
+ opts = SCons.Variables.Variables(file)
+
+ opts.Add('ANSWER',
+ 'THE answer to THE question',
+ "12",
+ check,
+ lambda x: int(x) + 12)
+
+ env = Environment()
+ exc_caught = None
+ try:
+ opts.Update(env, {'ANSWER':'54'})
+ except AssertionError:
+ exc_caught = 1
+ assert exc_caught, "did not catch expected assertion"
+
+ # Test that a good value from an args dictionary
+ # passed to Update() is used and validated.
+ test = TestSCons.TestSCons()
+ file = test.workpath('custom.py')
+ test.write('custom.py', 'ANSWER=10')
+ opts = SCons.Variables.Variables(file)
+
+ opts.Add('ANSWER',
+ 'THE answer to THE question',
+ "12",
+ check,
+ lambda x: int(x) + 12)
+
+ env = Environment()
+ opts.Update(env, {'ANSWER':'42'})
+ assert env['ANSWER'] == 54
+
+ # Test against a former bug. If we supply a converter,
+ # but no default, the value should *not* appear in the
+ # Environment if no value is specified in the options file
+ # or args.
+ test = TestSCons.TestSCons()
+ file = test.workpath('custom.py')
+ opts = SCons.Variables.Variables(file)
+
+ opts.Add('ANSWER',
+ help='THE answer to THE question',
+ converter=str)
+
+ env = Environment()
+ opts.Update(env, {})
+ assert 'ANSWER' not in env
+
+ # Test that a default value of None is all right.
+ test = TestSCons.TestSCons()
+ file = test.workpath('custom.py')
+ opts = SCons.Variables.Variables(file)
+
+ opts.Add('ANSWER',
+ "This is the answer",
+ None,
+ check)
+
+ env = Environment()
+ opts.Update(env, {})
+ assert 'ANSWER' not in env
+
+ def test_noaggregation(self):
+ """Test that the 'files' and 'args' attributes of the Variables class
+ don't aggregate entries from one instance to another.
+ This used to be a bug in SCons version 2.4.1 and earlier.
+ """
+
+ opts = SCons.Variables.Variables()
+ opts.files.append('custom.py')
+ opts.args['ANSWER'] = 54
+ nopts = SCons.Variables.Variables()
+
+ # Ensure that both attributes are initialized to
+ # an empty list and dict, respectively.
+ assert len(nopts.files) == 0
+ assert len(nopts.args) == 0
+
+ def test_args(self):
+ """Test updating an Environment with arguments overridden"""
+
+ # Test that a bad (command-line) argument is used
+ # and the validation fails correctly.
+ test = TestSCons.TestSCons()
+ file = test.workpath('custom.py')
+ test.write('custom.py', 'ANSWER=42')
+ opts = SCons.Variables.Variables(file, {'ANSWER':54})
+
+ opts.Add('ANSWER',
+ 'THE answer to THE question',
+ "42",
+ check,
+ lambda x: int(x) + 12)
+
+ env = Environment()
+ exc_caught = None
+ try:
+ opts.Update(env)
+ except AssertionError:
+ exc_caught = 1
+ assert exc_caught, "did not catch expected assertion"
+
+ # Test that a good (command-line) argument is used and validated.
+ test = TestSCons.TestSCons()
+ file = test.workpath('custom.py')
+ test.write('custom.py', 'ANSWER=54')
+ opts = SCons.Variables.Variables(file, {'ANSWER':42})
+
+ opts.Add('ANSWER',
+ 'THE answer to THE question',
+ "54",
+ check,
+ lambda x: int(x) + 12)
+
+ env = Environment()
+ opts.Update(env)
+ assert env['ANSWER'] == 54
+
+ # Test that a (command-line) argument is overridden by a dictionary
+ # supplied to Update() and the dictionary value is validated correctly.
+ test = TestSCons.TestSCons()
+ file = test.workpath('custom.py')
+ test.write('custom.py', 'ANSWER=54')
+ opts = SCons.Variables.Variables(file, {'ANSWER':54})
+
+ opts.Add('ANSWER',
+ 'THE answer to THE question',
+ "54",
+ check,
+ lambda x: int(x) + 12)
+
+ env = Environment()
+ opts.Update(env, {'ANSWER':42})
+ assert env['ANSWER'] == 54
+
+ def test_Save(self):
+ """Testing saving Variables"""
+
+ test = TestSCons.TestSCons()
+ cache_file = test.workpath('cached.options')
+ opts = SCons.Variables.Variables()
+
+ def bool_converter(val):
+ if val in [1, 'y']: val = 1
+ if val in [0, 'n']: val = 0
+ return val
+
+ # test saving out empty file
+ opts.Add('OPT_VAL',
+ 'An option to test',
+ 21,
+ None,
+ None)
+ opts.Add('OPT_VAL_2',
+ default='foo')
+ opts.Add('OPT_VAL_3',
+ default=1)
+ opts.Add('OPT_BOOL_0',
+ default='n',
+ converter=bool_converter)
+ opts.Add('OPT_BOOL_1',
+ default='y',
+ converter=bool_converter)
+ opts.Add('OPT_BOOL_2',
+ default=0,
+ converter=bool_converter)
+
+ env = Environment()
+ opts.Update(env, {'OPT_VAL_3' : 2})
+ assert env['OPT_VAL'] == 21, env['OPT_VAL']
+ assert env['OPT_VAL_2'] == 'foo', env['OPT_VAL_2']
+ assert env['OPT_VAL_3'] == 2, env['OPT_VAL_3']
+ assert env['OPT_BOOL_0'] == 0, env['OPT_BOOL_0']
+ assert env['OPT_BOOL_1'] == 1, env['OPT_BOOL_1']
+ assert env['OPT_BOOL_2'] == '0', env['OPT_BOOL_2']
+
+ env['OPT_VAL_2'] = 'bar'
+ env['OPT_BOOL_0'] = 0
+ env['OPT_BOOL_1'] = 1
+ env['OPT_BOOL_2'] = 2
+
+ opts.Save(cache_file, env)
+ checkSave(cache_file, { 'OPT_VAL_2' : 'bar',
+ 'OPT_VAL_3' : 2,
+ 'OPT_BOOL_2' : 2})
+
+ # Test against some old bugs
+ class Foo(object):
+ def __init__(self, x):
+ self.x = x
+ def __str__(self):
+ return self.x
+
+ test = TestSCons.TestSCons()
+ cache_file = test.workpath('cached.options')
+ opts = SCons.Variables.Variables()
+
+ opts.Add('THIS_USED_TO_BREAK',
+ 'An option to test',
+ "Default")
+
+ opts.Add('THIS_ALSO_BROKE',
+ 'An option to test',
+ "Default2")
+
+ opts.Add('THIS_SHOULD_WORK',
+ 'An option to test',
+ Foo('bar'))
+
+ env = Environment()
+ opts.Update(env, { 'THIS_USED_TO_BREAK' : "Single'Quotes'In'String",
+ 'THIS_ALSO_BROKE' : "\\Escape\nSequences\t",
+ 'THIS_SHOULD_WORK' : Foo('baz') })
+ opts.Save(cache_file, env)
+ checkSave(cache_file, { 'THIS_USED_TO_BREAK' : "Single'Quotes'In'String",
+ 'THIS_ALSO_BROKE' : "\\Escape\nSequences\t",
+ 'THIS_SHOULD_WORK' : 'baz' })
+
+ def test_GenerateHelpText(self):
+ """Test generating the default format help text"""
+ opts = SCons.Variables.Variables()
+
+ opts.Add('ANSWER',
+ 'THE answer to THE question',
+ "42",
+ check,
+ lambda x: int(x) + 12)
+
+ opts.Add('B',
+ 'b - alpha test',
+ "42",
+ check,
+ lambda x: int(x) + 12)
+
+ opts.Add('A',
+ 'a - alpha test',
+ "42",
+ check,
+ lambda x: int(x) + 12)
+
+ env = Environment()
+ opts.Update(env, {})
+
+ expect = """
+ANSWER: THE answer to THE question
+ default: 42
+ actual: 54
+
+B: b - alpha test
+ default: 42
+ actual: 54
+
+A: a - alpha test
+ default: 42
+ actual: 54
+"""
+
+ text = opts.GenerateHelpText(env)
+ assert text == expect, text
+
+ expectAlpha = """
+A: a - alpha test
+ default: 42
+ actual: 54
+
+ANSWER: THE answer to THE question
+ default: 42
+ actual: 54
+
+B: b - alpha test
+ default: 42
+ actual: 54
+"""
+
+ expectBackwards = """
+B: b - alpha test
+ default: 42
+ actual: 54
+
+ANSWER: THE answer to THE question
+ default: 42
+ actual: 54
+
+A: a - alpha test
+ default: 42
+ actual: 54
+"""
+ text = opts.GenerateHelpText(env, sort=cmp)
+ assert text == expectAlpha, text
+
+ textBool = opts.GenerateHelpText(env, sort=True)
+ assert text == expectAlpha, text
+
+ textBackwards = opts.GenerateHelpText(env, sort=lambda x, y: cmp(y, x))
+ assert textBackwards == expectBackwards, "Expected:\n%s\nGot:\n%s\n"%(textBackwards, expectBackwards)
+
+ def test_FormatVariableHelpText(self):
+ """Test generating custom format help text"""
+ opts = SCons.Variables.Variables()
+
+ def my_format(env, opt, help, default, actual, aliases):
+ return '%s %s %s %s %s\n' % (opt, default, actual, help, aliases)
+
+ opts.FormatVariableHelpText = my_format
+
+ opts.Add('ANSWER',
+ 'THE answer to THE question',
+ "42",
+ check,
+ lambda x: int(x) + 12)
+
+ opts.Add('B',
+ 'b - alpha test',
+ "42",
+ check,
+ lambda x: int(x) + 12)
+
+ opts.Add('A',
+ 'a - alpha test',
+ "42",
+ check,
+ lambda x: int(x) + 12)
+
+ env = Environment()
+ opts.Update(env, {})
+
+ expect = """\
+ANSWER 42 54 THE answer to THE question ['ANSWER']
+B 42 54 b - alpha test ['B']
+A 42 54 a - alpha test ['A']
+"""
+
+ text = opts.GenerateHelpText(env)
+ assert text == expect, text
+
+ expectAlpha = """\
+A 42 54 a - alpha test ['A']
+ANSWER 42 54 THE answer to THE question ['ANSWER']
+B 42 54 b - alpha test ['B']
+"""
+ text = opts.GenerateHelpText(env, sort=cmp)
+ assert text == expectAlpha, text
+
+ def test_Aliases(self):
+ """Test option aliases"""
+ # test alias as a tuple
+ opts = SCons.Variables.Variables()
+ opts.AddVariables(
+ (('ANSWER', 'ANSWERALIAS'),
+ 'THE answer to THE question',
+ "42"),
+ )
+
+ env = Environment()
+ opts.Update(env, {'ANSWER' : 'answer'})
+
+ assert 'ANSWER' in env
+
+ env = Environment()
+ opts.Update(env, {'ANSWERALIAS' : 'answer'})
+
+ assert 'ANSWER' in env and 'ANSWERALIAS' not in env
+
+ # test alias as a list
+ opts = SCons.Variables.Variables()
+ opts.AddVariables(
+ (['ANSWER', 'ANSWERALIAS'],
+ 'THE answer to THE question',
+ "42"),
+ )
+
+ env = Environment()
+ opts.Update(env, {'ANSWER' : 'answer'})
+
+ assert 'ANSWER' in env
+
+ env = Environment()
+ opts.Update(env, {'ANSWERALIAS' : 'answer'})
+
+ assert 'ANSWER' in env and 'ANSWERALIAS' not in env
+
+
+
+class UnknownVariablesTestCase(unittest.TestCase):
+
+ def test_unknown(self):
+ """Test the UnknownVariables() method"""
+ opts = SCons.Variables.Variables()
+
+ opts.Add('ANSWER',
+ 'THE answer to THE question',
+ "42")
+
+ args = {
+ 'ANSWER' : 'answer',
+ 'UNKNOWN' : 'unknown',
+ }
+
+ env = Environment()
+ opts.Update(env, args)
+
+ r = opts.UnknownVariables()
+ assert r == {'UNKNOWN' : 'unknown'}, r
+ assert env['ANSWER'] == 'answer', env['ANSWER']
+
+ def test_AddOptionUpdatesUnknown(self):
+ """Test updating of the 'unknown' dict"""
+ opts = SCons.Variables.Variables()
+
+ opts.Add('A',
+ 'A test variable',
+ "1")
+
+ args = {
+ 'A' : 'a',
+ 'ADDEDLATER' : 'notaddedyet',
+ }
+
+ env = Environment()
+ opts.Update(env,args)
+
+ r = opts.UnknownVariables()
+ assert r == {'ADDEDLATER' : 'notaddedyet'}, r
+ assert env['A'] == 'a', env['A']
+
+ opts.Add('ADDEDLATER',
+ 'An option not present initially',
+ "1")
+
+ args = {
+ 'A' : 'a',
+ 'ADDEDLATER' : 'added',
+ }
+
+ opts.Update(env, args)
+
+ r = opts.UnknownVariables()
+ assert len(r) == 0, r
+ assert env['ADDEDLATER'] == 'added', env['ADDEDLATER']
+
+ def test_AddOptionWithAliasUpdatesUnknown(self):
+ """Test updating of the 'unknown' dict (with aliases)"""
+ opts = SCons.Variables.Variables()
+
+ opts.Add('A',
+ 'A test variable',
+ "1")
+
+ args = {
+ 'A' : 'a',
+ 'ADDEDLATERALIAS' : 'notaddedyet',
+ }
+
+ env = Environment()
+ opts.Update(env,args)
+
+ r = opts.UnknownVariables()
+ assert r == {'ADDEDLATERALIAS' : 'notaddedyet'}, r
+ assert env['A'] == 'a', env['A']
+
+ opts.AddVariables(
+ (('ADDEDLATER', 'ADDEDLATERALIAS'),
+ 'An option not present initially',
+ "1"),
+ )
+
+ args['ADDEDLATERALIAS'] = 'added'
+
+ opts.Update(env, args)
+
+ r = opts.UnknownVariables()
+ assert len(r) == 0, r
+ assert env['ADDEDLATER'] == 'added', env['ADDEDLATER']
+
+
+if __name__ == "__main__":
+ suite = unittest.TestSuite()
+ tclasses = [ VariablesTestCase,
+ UnknownVariablesTestCase ]
+ for tclass in tclasses:
+ names = unittest.getTestCaseNames(tclass, 'test_')
+ suite.addTests(list(map(tclass, names)))
+ TestUnit.run(suite)
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Variables/__init__.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Variables/__init__.py
new file mode 100644
index 0000000..6ad40ed
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Variables/__init__.py
@@ -0,0 +1,327 @@
+"""engine.SCons.Variables
+
+This file defines the Variables class that is used to add user-friendly
+customizable variables to an SCons build.
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import os.path
+import sys
+from functools import cmp_to_key
+
+import SCons.Environment
+import SCons.Errors
+import SCons.Util
+import SCons.Warnings
+
+from .BoolVariable import BoolVariable # okay
+from .EnumVariable import EnumVariable # okay
+from .ListVariable import ListVariable # naja
+from .PackageVariable import PackageVariable # naja
+from .PathVariable import PathVariable # okay
+
+
+class Variables(object):
+ instance=None
+
+ """
+ Holds all the options, updates the environment with the variables,
+ and renders the help text.
+ """
+ def __init__(self, files=None, args=None, is_global=1):
+ """
+ files - [optional] List of option configuration files to load
+ (backward compatibility) If a single string is passed it is
+ automatically placed in a file list
+ """
+ # initialize arguments
+ if files is None:
+ files = []
+ if args is None:
+ args = {}
+ self.options = []
+ self.args = args
+ if not SCons.Util.is_List(files):
+ if files:
+ files = [ files ]
+ else:
+ files = []
+ self.files = files
+ self.unknown = {}
+
+ # create the singleton instance
+ if is_global:
+ self=Variables.instance
+
+ if not Variables.instance:
+ Variables.instance=self
+
+ def _do_add(self, key, help="", default=None, validator=None, converter=None):
+ class Variable(object):
+ pass
+
+ option = Variable()
+
+ # if we get a list or a tuple, we take the first element as the
+ # option key and store the remaining in aliases.
+ if SCons.Util.is_List(key) or SCons.Util.is_Tuple(key):
+ option.key = key[0]
+ option.aliases = key[1:]
+ else:
+ option.key = key
+ option.aliases = [ key ]
+ option.help = help
+ option.default = default
+ option.validator = validator
+ option.converter = converter
+
+ self.options.append(option)
+
+ # options might be added after the 'unknown' dict has been set up,
+ # so we remove the key and all its aliases from that dict
+ for alias in list(option.aliases) + [ option.key ]:
+ if alias in self.unknown:
+ del self.unknown[alias]
+
+ def keys(self):
+ """
+ Returns the keywords for the options
+ """
+ return [o.key for o in self.options]
+
+ def Add(self, key, help="", default=None, validator=None, converter=None, **kw):
+ """
+ Add an option.
+
+
+ @param key: the name of the variable, or a list or tuple of arguments
+ @param help: optional help text for the options
+ @param default: optional default value
+ @param validator: optional function that is called to validate the option's value
+ @type validator: Called with (key, value, environment)
+ @param converter: optional function that is called to convert the option's value before putting it in the environment.
+ """
+
+ if SCons.Util.is_List(key) or isinstance(key, tuple):
+ self._do_add(*key)
+ return
+
+ if not SCons.Util.is_String(key) or \
+ not SCons.Environment.is_valid_construction_var(key):
+ raise SCons.Errors.UserError("Illegal Variables.Add() key `%s'" % str(key))
+
+ self._do_add(key, help, default, validator, converter)
+
+ def AddVariables(self, *optlist):
+ """
+ Add a list of options.
+
+ Each list element is a tuple/list of arguments to be passed on
+ to the underlying method for adding options.
+
+ Example::
+
+ opt.AddVariables(
+ ('debug', '', 0),
+ ('CC', 'The C compiler'),
+ ('VALIDATE', 'An option for testing validation', 'notset',
+ validator, None),
+ )
+
+ """
+
+ for o in optlist:
+ self._do_add(*o)
+
+
+ def Update(self, env, args=None):
+ """
+ Update an environment with the option variables.
+
+ env - the environment to update.
+ """
+
+ values = {}
+
+ # first set the defaults:
+ for option in self.options:
+ if not option.default is None:
+ values[option.key] = option.default
+
+ # next set the value specified in the options file
+ for filename in self.files:
+ if os.path.exists(filename):
+ dir = os.path.split(os.path.abspath(filename))[0]
+ if dir:
+ sys.path.insert(0, dir)
+ try:
+ values['__name__'] = filename
+ with open(filename, 'r') as f:
+ contents = f.read()
+ exec(contents, {}, values)
+ finally:
+ if dir:
+ del sys.path[0]
+ del values['__name__']
+
+ # set the values specified on the command line
+ if args is None:
+ args = self.args
+
+ for arg, value in args.items():
+ added = False
+ for option in self.options:
+ if arg in list(option.aliases) + [ option.key ]:
+ values[option.key] = value
+ added = True
+ if not added:
+ self.unknown[arg] = value
+
+ # put the variables in the environment:
+ # (don't copy over variables that are not declared as options)
+ for option in self.options:
+ try:
+ env[option.key] = values[option.key]
+ except KeyError:
+ pass
+
+ # Call the convert functions:
+ for option in self.options:
+ if option.converter and option.key in values:
+ value = env.subst('${%s}'%option.key)
+ try:
+ try:
+ env[option.key] = option.converter(value)
+ except TypeError:
+ env[option.key] = option.converter(value, env)
+ except ValueError as x:
+ raise SCons.Errors.UserError('Error converting option: %s\n%s'%(option.key, x))
+
+
+ # Finally validate the values:
+ for option in self.options:
+ if option.validator and option.key in values:
+ option.validator(option.key, env.subst('${%s}'%option.key), env)
+
+ def UnknownVariables(self):
+ """
+ Returns any options in the specified arguments lists that
+ were not known, declared options in this object.
+ """
+ return self.unknown
+
+ def Save(self, filename, env):
+ """
+ Saves all the options in the given file. This file can
+ then be used to load the options next run. This can be used
+ to create an option cache file.
+
+ filename - Name of the file to save into
+ env - the environment get the option values from
+ """
+
+ # Create the file and write out the header
+ try:
+ fh = open(filename, 'w')
+
+ try:
+ # Make an assignment in the file for each option
+ # within the environment that was assigned a value
+ # other than the default.
+ for option in self.options:
+ try:
+ value = env[option.key]
+ try:
+ prepare = value.prepare_to_store
+ except AttributeError:
+ try:
+ eval(repr(value))
+ except KeyboardInterrupt:
+ raise
+ except:
+ # Convert stuff that has a repr() that
+ # cannot be evaluated into a string
+ value = SCons.Util.to_String(value)
+ else:
+ value = prepare()
+
+ defaultVal = env.subst(SCons.Util.to_String(option.default))
+ if option.converter:
+ defaultVal = option.converter(defaultVal)
+
+ if str(env.subst('${%s}' % option.key)) != str(defaultVal):
+ fh.write('%s = %s\n' % (option.key, repr(value)))
+ except KeyError:
+ pass
+ finally:
+ fh.close()
+
+ except IOError as x:
+ raise SCons.Errors.UserError('Error writing options to file: %s\n%s' % (filename, x))
+
+ def GenerateHelpText(self, env, sort=None):
+ """
+ Generate the help text for the options.
+
+ env - an environment that is used to get the current values
+ of the options.
+ cmp - Either a function as follows: The specific sort function should take two arguments and return -1, 0 or 1
+ or a boolean to indicate if it should be sorted.
+ """
+
+ if callable(sort):
+ options = sorted(self.options, key=cmp_to_key(lambda x,y: sort(x.key,y.key)))
+ elif sort is True:
+ options = sorted(self.options, key=lambda x: x.key)
+ else:
+ options = self.options
+
+ def format(opt, self=self, env=env):
+ if opt.key in env:
+ actual = env.subst('${%s}' % opt.key)
+ else:
+ actual = None
+ return self.FormatVariableHelpText(env, opt.key, opt.help, opt.default, actual, opt.aliases)
+ lines = [_f for _f in map(format, options) if _f]
+
+ return ''.join(lines)
+
+ format = '\n%s: %s\n default: %s\n actual: %s\n'
+ format_ = '\n%s: %s\n default: %s\n actual: %s\n aliases: %s\n'
+
+ def FormatVariableHelpText(self, env, key, help, default, actual, aliases=[]):
+ # Don't display the key name itself as an alias.
+ aliases = [a for a in aliases if a != key]
+ if len(aliases)==0:
+ return self.format % (key, help, default, actual)
+ else:
+ return self.format_ % (key, help, default, actual, aliases)
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/Warnings.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/Warnings.py
new file mode 100644
index 0000000..2495b89
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/Warnings.py
@@ -0,0 +1,254 @@
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+"""SCons.Warnings
+
+This file implements the warnings framework for SCons.
+
+"""
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import sys
+
+import SCons.Errors
+
+class Warning(SCons.Errors.UserError):
+ pass
+
+class WarningOnByDefault(Warning):
+ pass
+
+
+# NOTE: If you add a new warning class, add it to the man page, too!
+class TargetNotBuiltWarning(Warning): # Should go to OnByDefault
+ pass
+
+class CacheVersionWarning(WarningOnByDefault):
+ pass
+
+class CacheWriteErrorWarning(Warning):
+ pass
+
+class CorruptSConsignWarning(WarningOnByDefault):
+ pass
+
+class DependencyWarning(Warning):
+ pass
+
+class DevelopmentVersionWarning(WarningOnByDefault):
+ pass
+
+class DuplicateEnvironmentWarning(WarningOnByDefault):
+ pass
+
+class FutureReservedVariableWarning(WarningOnByDefault):
+ pass
+
+class LinkWarning(WarningOnByDefault):
+ pass
+
+class MisleadingKeywordsWarning(WarningOnByDefault):
+ pass
+
+class MissingSConscriptWarning(WarningOnByDefault):
+ pass
+
+class NoMD5ModuleWarning(WarningOnByDefault):
+ pass
+
+class NoMetaclassSupportWarning(WarningOnByDefault):
+ pass
+
+class NoObjectCountWarning(WarningOnByDefault):
+ pass
+
+class NoParallelSupportWarning(WarningOnByDefault):
+ pass
+
+class ReservedVariableWarning(WarningOnByDefault):
+ pass
+
+class StackSizeWarning(WarningOnByDefault):
+ pass
+
+class VisualCMissingWarning(WarningOnByDefault):
+ pass
+
+# Used when MSVC_VERSION and MSVS_VERSION do not point to the
+# same version (MSVS_VERSION is deprecated)
+class VisualVersionMismatch(WarningOnByDefault):
+ pass
+
+class VisualStudioMissingWarning(Warning):
+ pass
+
+class FortranCxxMixWarning(LinkWarning):
+ pass
+
+
+# Deprecation warnings
+
+class FutureDeprecatedWarning(Warning):
+ pass
+
+class DeprecatedWarning(Warning):
+ pass
+
+class MandatoryDeprecatedWarning(DeprecatedWarning):
+ pass
+
+
+# Special case; base always stays DeprecatedWarning
+class PythonVersionWarning(DeprecatedWarning):
+ pass
+
+class DeprecatedSourceCodeWarning(FutureDeprecatedWarning):
+ pass
+
+class DeprecatedBuildDirWarning(DeprecatedWarning):
+ pass
+
+class TaskmasterNeedsExecuteWarning(DeprecatedWarning):
+ pass
+
+class DeprecatedCopyWarning(MandatoryDeprecatedWarning):
+ pass
+
+class DeprecatedOptionsWarning(MandatoryDeprecatedWarning):
+ pass
+
+class DeprecatedSourceSignaturesWarning(MandatoryDeprecatedWarning):
+ pass
+
+class DeprecatedTargetSignaturesWarning(MandatoryDeprecatedWarning):
+ pass
+
+class DeprecatedDebugOptionsWarning(MandatoryDeprecatedWarning):
+ pass
+
+class DeprecatedSigModuleWarning(MandatoryDeprecatedWarning):
+ pass
+
+class DeprecatedBuilderKeywordsWarning(MandatoryDeprecatedWarning):
+ pass
+
+
+# The below is a list of 2-tuples. The first element is a class object.
+# The second element is true if that class is enabled, false if it is disabled.
+_enabled = []
+
+# If set, raise the warning as an exception
+_warningAsException = 0
+
+# If not None, a function to call with the warning
+_warningOut = None
+
+def suppressWarningClass(clazz):
+ """Suppresses all warnings that are of type clazz or
+ derived from clazz."""
+ _enabled.insert(0, (clazz, 0))
+
+def enableWarningClass(clazz):
+ """Enables all warnings that are of type clazz or
+ derived from clazz."""
+ _enabled.insert(0, (clazz, 1))
+
+def warningAsException(flag=1):
+ """Turn warnings into exceptions. Returns the old value of the flag."""
+ global _warningAsException
+ old = _warningAsException
+ _warningAsException = flag
+ return old
+
+def warn(clazz, *args):
+ global _enabled, _warningAsException, _warningOut
+
+ warning = clazz(args)
+ for clazz, flag in _enabled:
+ if isinstance(warning, clazz):
+ if flag:
+ if _warningAsException:
+ raise warning
+
+ if _warningOut:
+ _warningOut(warning)
+ break
+
+def process_warn_strings(arguments):
+ """Process string specifications of enabling/disabling warnings,
+ as passed to the --warn option or the SetOption('warn') function.
+
+
+ An argument to this option should be of the form <warning-class>
+ or no-<warning-class>. The warning class is munged in order
+ to get an actual class name from the classes above, which we
+ need to pass to the {enable,disable}WarningClass() functions.
+ The supplied <warning-class> is split on hyphens, each element
+ is capitalized, then smushed back together. Then the string
+ "Warning" is appended to get the class name.
+
+ For example, 'deprecated' will enable the DeprecatedWarning
+ class. 'no-dependency' will disable the DependencyWarning class.
+
+ As a special case, --warn=all and --warn=no-all will enable or
+ disable (respectively) the base Warning class of all warnings.
+
+ """
+
+ def _capitalize(s):
+ if s[:5] == "scons":
+ return "SCons" + s[5:]
+ else:
+ return s.capitalize()
+
+ for arg in arguments:
+
+ elems = arg.lower().split('-')
+ enable = 1
+ if elems[0] == 'no':
+ enable = 0
+ del elems[0]
+
+ if len(elems) == 1 and elems[0] == 'all':
+ class_name = "Warning"
+ else:
+ class_name = ''.join(map(_capitalize, elems)) + "Warning"
+ try:
+ clazz = globals()[class_name]
+ except KeyError:
+ sys.stderr.write("No warning type: '%s'\n" % arg)
+ else:
+ if enable:
+ enableWarningClass(clazz)
+ elif issubclass(clazz, MandatoryDeprecatedWarning):
+ fmt = "Can not disable mandataory warning: '%s'\n"
+ sys.stderr.write(fmt % arg)
+ else:
+ suppressWarningClass(clazz)
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/WarningsTests.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/WarningsTests.py
new file mode 100644
index 0000000..7b8d00d
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/WarningsTests.py
@@ -0,0 +1,137 @@
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import sys
+import unittest
+
+import TestUnit
+
+import SCons.Warnings
+
+class TestOutput(object):
+ def __call__(self, x):
+ args = x.args[0]
+ if len(args) == 1:
+ args = args[0]
+ self.out = str(args)
+
+class WarningsTestCase(unittest.TestCase):
+ def test_Warning(self):
+ """Test warn function."""
+
+ # Reset global state
+ SCons.Warnings._enabled = []
+ SCons.Warnings._warningAsException = 0
+
+ to = TestOutput()
+ SCons.Warnings._warningOut=to
+ SCons.Warnings.enableWarningClass(SCons.Warnings.Warning)
+ SCons.Warnings.warn(SCons.Warnings.DeprecatedWarning,
+ "Foo")
+ assert to.out == "Foo", to.out
+ SCons.Warnings.warn(SCons.Warnings.DependencyWarning,
+ "Foo", 1)
+ assert to.out == "('Foo', 1)", to.out
+
+ def test_WarningAsExc(self):
+ """Test warnings as exceptions."""
+
+ # Reset global state
+ SCons.Warnings._enabled = []
+ SCons.Warnings._warningAsException = 0
+
+ SCons.Warnings.enableWarningClass(SCons.Warnings.Warning)
+ old = SCons.Warnings.warningAsException()
+ assert old == 0, old
+ exc_caught = 0
+ try:
+ SCons.Warnings.warn(SCons.Warnings.Warning, "Foo")
+ except:
+ exc_caught = 1
+ assert exc_caught == 1
+
+ old = SCons.Warnings.warningAsException(old)
+ assert old == 1, old
+ exc_caught = 0
+ try:
+ SCons.Warnings.warn(SCons.Warnings.Warning, "Foo")
+ except:
+ exc_caught = 1
+ assert exc_caught == 0
+
+ def test_Disable(self):
+ """Test disabling/enabling warnings."""
+
+ # Reset global state
+ SCons.Warnings._enabled = []
+ SCons.Warnings._warningAsException = 0
+
+ to = TestOutput()
+ SCons.Warnings._warningOut=to
+ to.out = None
+
+ # No warnings by default
+ SCons.Warnings.warn(SCons.Warnings.DeprecatedWarning,
+ "Foo")
+ assert to.out is None, to.out
+
+ SCons.Warnings.enableWarningClass(SCons.Warnings.Warning)
+ SCons.Warnings.warn(SCons.Warnings.DeprecatedWarning,
+ "Foo")
+ assert to.out == "Foo", to.out
+
+ to.out = None
+ SCons.Warnings.suppressWarningClass(SCons.Warnings.DeprecatedWarning)
+ SCons.Warnings.warn(SCons.Warnings.DeprecatedWarning,
+ "Foo")
+ assert to.out is None, to.out
+
+ SCons.Warnings.warn(SCons.Warnings.MandatoryDeprecatedWarning,
+ "Foo")
+ assert to.out is None, to.out
+
+ # Dependency warnings should still be enabled though
+ SCons.Warnings.enableWarningClass(SCons.Warnings.Warning)
+ SCons.Warnings.warn(SCons.Warnings.DependencyWarning,
+ "Foo")
+ assert to.out == "Foo", to.out
+
+ # Try reenabling all warnings...
+ SCons.Warnings.enableWarningClass(SCons.Warnings.Warning)
+
+ SCons.Warnings.enableWarningClass(SCons.Warnings.Warning)
+ SCons.Warnings.warn(SCons.Warnings.DeprecatedWarning,
+ "Foo")
+ assert to.out == "Foo", to.out
+
+if __name__ == "__main__":
+ suite = unittest.makeSuite(WarningsTestCase, 'test_')
+ TestUnit.run(suite)
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/__init__.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/__init__.py
new file mode 100644
index 0000000..1cbe18b
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/__init__.py
@@ -0,0 +1,49 @@
+"""SCons
+
+The main package for the SCons software construction utility.
+
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+__version__ = "__VERSION__"
+
+__build__ = "__BUILD__"
+
+__buildsys__ = "__BUILDSYS__"
+
+__date__ = "__DATE__"
+
+__developer__ = "__DEVELOPER__"
+
+# make sure compatibility is always in place
+import SCons.compat
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/__main__.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/__main__.py
new file mode 100644
index 0000000..0dfbb9d
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/__main__.py
@@ -0,0 +1,4 @@
+import SCons.Script
+# this does all the work, and calls sys.exit
+# with the proper exit status when done.
+SCons.Script.main()
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/compat/__init__.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/compat/__init__.py
new file mode 100644
index 0000000..0b6c016
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/compat/__init__.py
@@ -0,0 +1,212 @@
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__doc__ = """
+SCons compatibility package for old Python versions
+
+This subpackage holds modules that provide backwards-compatible
+implementations of various things that we'd like to use in SCons but which
+only show up in later versions of Python than the early, old version(s)
+we still support.
+
+Other code will not generally reference things in this package through
+the SCons.compat namespace. The modules included here add things to
+the builtins namespace or the global module list so that the rest
+of our code can use the objects and names imported here regardless of
+Python version.
+
+The rest of the things here will be in individual compatibility modules
+that are either: 1) suitably modified copies of the future modules that
+we want to use; or 2) backwards compatible re-implementations of the
+specific portions of a future module's API that we want to use.
+
+GENERAL WARNINGS: Implementations of functions in the SCons.compat
+modules are *NOT* guaranteed to be fully compliant with these functions in
+later versions of Python. We are only concerned with adding functionality
+that we actually use in SCons, so be wary if you lift this code for
+other uses. (That said, making these more nearly the same as later,
+official versions is still a desirable goal, we just don't need to be
+obsessive about it.)
+
+We name the compatibility modules with an initial '_scons_' (for example,
+_scons_subprocess.py is our compatibility module for subprocess) so
+that we can still try to import the real module name and fall back to
+our compatibility module if we get an ImportError. The import_as()
+function defined below loads the module as the "real" name (without the
+'_scons'), after which all of the "import {module}" statements in the
+rest of our code will find our pre-loaded compatibility module.
+"""
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import os
+import sys
+import imp # Use the "imp" module to protect imports from fixers.
+
+PYPY = hasattr(sys, 'pypy_translation_info')
+
+
+def import_as(module, name):
+ """
+ Imports the specified module (from our local directory) as the
+ specified name, returning the loaded module object.
+ """
+ dir = os.path.split(__file__)[0]
+ return imp.load_module(name, *imp.find_module(module, [dir]))
+
+
+def rename_module(new, old):
+ """
+ Attempts to import the old module and load it under the new name.
+ Used for purely cosmetic name changes in Python 3.x.
+ """
+ try:
+ sys.modules[new] = imp.load_module(old, *imp.find_module(old))
+ return True
+ except ImportError:
+ return False
+
+
+# TODO: FIXME
+# In 3.x, 'pickle' automatically loads the fast version if available.
+rename_module('pickle', 'cPickle')
+
+# Default pickle protocol. Higher protocols are more efficient/featureful
+# but incompatible with older Python versions. On Python 2.7 this is 2.
+# Negative numbers choose the highest available protocol.
+import pickle
+
+# Was pickle.HIGHEST_PROTOCOL
+# Changed to 2 so py3.5+'s pickle will be compatible with py2.7.
+PICKLE_PROTOCOL = 2
+
+# TODO: FIXME
+# In 3.x, 'profile' automatically loads the fast version if available.
+rename_module('profile', 'cProfile')
+
+# TODO: FIXME
+# Before Python 3.0, the 'queue' module was named 'Queue'.
+rename_module('queue', 'Queue')
+
+# TODO: FIXME
+# Before Python 3.0, the 'winreg' module was named '_winreg'
+rename_module('winreg', '_winreg')
+
+# Python 3 moved builtin intern() to sys package
+# To make porting easier, make intern always live
+# in sys package (for python 2.7.x)
+try:
+ sys.intern
+except AttributeError:
+ # We must be using python 2.7.x so monkey patch
+ # intern into the sys package
+ sys.intern = intern
+
+# Preparing for 3.x. UserDict, UserList, UserString are in
+# collections for 3.x, but standalone in 2.7.x
+import collections
+
+try:
+ collections.UserDict
+except AttributeError:
+ exec ('from UserDict import UserDict as _UserDict')
+ collections.UserDict = _UserDict
+ del _UserDict
+
+try:
+ collections.UserList
+except AttributeError:
+ exec ('from UserList import UserList as _UserList')
+ collections.UserList = _UserList
+ del _UserList
+
+try:
+ collections.UserString
+except AttributeError:
+ exec ('from UserString import UserString as _UserString')
+ collections.UserString = _UserString
+ del _UserString
+
+
+import shutil
+try:
+ shutil.SameFileError
+except AttributeError:
+ class SameFileError(Exception):
+ pass
+
+ shutil.SameFileError = SameFileError
+
+def with_metaclass(meta, *bases):
+ """
+ Function from jinja2/_compat.py. License: BSD.
+
+ Use it like this::
+
+ class BaseForm(object):
+ pass
+
+ class FormType(type):
+ pass
+
+ class Form(with_metaclass(FormType, BaseForm)):
+ pass
+
+ This requires a bit of explanation: the basic idea is to make a
+ dummy metaclass for one level of class instantiation that replaces
+ itself with the actual metaclass. Because of internal type checks
+ we also need to make sure that we downgrade the custom metaclass
+ for one level to something closer to type (that's why __call__ and
+ __init__ comes back from type etc.).
+
+ This has the advantage over six.with_metaclass of not introducing
+ dummy classes into the final MRO.
+ """
+
+ class metaclass(meta):
+ __call__ = type.__call__
+ __init__ = type.__init__
+
+ def __new__(cls, name, this_bases, d):
+ if this_bases is None:
+ return type.__new__(cls, name, (), d)
+ return meta(name, bases, d)
+
+ return metaclass('temporary_class', None, {})
+
+
+class NoSlotsPyPy(type):
+ """
+ Workaround for PyPy not working well with __slots__ and __class__ assignment.
+ """
+
+ def __new__(meta, name, bases, dct):
+ if PYPY and '__slots__' in dct:
+ dct.pop('__slots__')
+ return super(NoSlotsPyPy, meta).__new__(meta, name, bases, dct)
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/compat/_scons_dbm.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/compat/_scons_dbm.py
new file mode 100644
index 0000000..edfe6fd
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/compat/_scons_dbm.py
@@ -0,0 +1,45 @@
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__doc__ = """
+dbm compatibility module for Python versions that don't have dbm.
+
+This does not not NOT (repeat, *NOT*) provide complete dbm functionality.
+It's just a stub on which to hang just enough pieces of dbm functionality
+that the whichdb.whichdb() implementstation in the various 2.X versions of
+Python won't blow up even if dbm wasn't compiled in.
+"""
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+class error(Exception):
+ pass
+
+def open(*args, **kw):
+ raise error()
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/cpp.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/cpp.py
new file mode 100644
index 0000000..161f070
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/cpp.py
@@ -0,0 +1,592 @@
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+__doc__ = """
+SCons C Pre-Processor module
+"""
+import SCons.compat
+
+import os
+import re
+
+#
+# First "subsystem" of regular expressions that we set up:
+#
+# Stuff to turn the C preprocessor directives in a file's contents into
+# a list of tuples that we can process easily.
+#
+
+# A table of regular expressions that fetch the arguments from the rest of
+# a C preprocessor line. Different directives have different arguments
+# that we want to fetch, using the regular expressions to which the lists
+# of preprocessor directives map.
+cpp_lines_dict = {
+ # Fetch the rest of a #if/#elif/#ifdef/#ifndef as one argument,
+ # separated from the keyword by white space.
+ ('if', 'elif', 'ifdef', 'ifndef',)
+ : '\s+(.+)',
+
+ # Fetch the rest of a #import/#include/#include_next line as one
+ # argument, with white space optional.
+ ('import', 'include', 'include_next',)
+ : '\s*(.+)',
+
+ # We don't care what comes after a #else or #endif line.
+ ('else', 'endif',) : '',
+
+ # Fetch three arguments from a #define line:
+ # 1) The #defined keyword.
+ # 2) The optional parentheses and arguments (if it's a function-like
+ # macro, '' if it's not).
+ # 3) The expansion value.
+ ('define',) : '\s+([_A-Za-z][_A-Za-z0-9_]*)(\([^)]*\))?\s*(.*)',
+
+ # Fetch the #undefed keyword from a #undef line.
+ ('undef',) : '\s+([_A-Za-z][A-Za-z0-9_]*)',
+}
+
+# Create a table that maps each individual C preprocessor directive to
+# the corresponding compiled regular expression that fetches the arguments
+# we care about.
+Table = {}
+for op_list, expr in cpp_lines_dict.items():
+ e = re.compile(expr)
+ for op in op_list:
+ Table[op] = e
+del e
+del op
+del op_list
+
+# Create a list of the expressions we'll use to match all of the
+# preprocessor directives. These are the same as the directives
+# themselves *except* that we must use a negative lookahead assertion
+# when matching "if" so it doesn't match the "if" in "ifdef."
+override = {
+ 'if' : 'if(?!def)',
+}
+l = [override.get(x, x) for x in list(Table.keys())]
+
+
+# Turn the list of expressions into one big honkin' regular expression
+# that will match all the preprocessor lines at once. This will return
+# a list of tuples, one for each preprocessor line. The preprocessor
+# directive will be the first element in each tuple, and the rest of
+# the line will be the second element.
+e = '^\s*#\s*(' + '|'.join(l) + ')(.*)$'
+
+# And last but not least, compile the expression.
+CPP_Expression = re.compile(e, re.M)
+
+
+
+
+#
+# Second "subsystem" of regular expressions that we set up:
+#
+# Stuff to translate a C preprocessor expression (as found on a #if or
+# #elif line) into an equivalent Python expression that we can eval().
+#
+
+# A dictionary that maps the C representation of Boolean operators
+# to their Python equivalents.
+CPP_to_Python_Ops_Dict = {
+ '!' : ' not ',
+ '!=' : ' != ',
+ '&&' : ' and ',
+ '||' : ' or ',
+ '?' : ' and ',
+ ':' : ' or ',
+ '\r' : '',
+}
+
+CPP_to_Python_Ops_Sub = lambda m: CPP_to_Python_Ops_Dict[m.group(0)]
+
+# We have to sort the keys by length so that longer expressions
+# come *before* shorter expressions--in particular, "!=" must
+# come before "!" in the alternation. Without this, the Python
+# re module, as late as version 2.2.2, empirically matches the
+# "!" in "!=" first, instead of finding the longest match.
+# What's up with that?
+l = sorted(list(CPP_to_Python_Ops_Dict.keys()), key=lambda a: len(a), reverse=True)
+
+# Turn the list of keys into one regular expression that will allow us
+# to substitute all of the operators at once.
+expr = '|'.join(map(re.escape, l))
+
+# ...and compile the expression.
+CPP_to_Python_Ops_Expression = re.compile(expr)
+
+# A separate list of expressions to be evaluated and substituted
+# sequentially, not all at once.
+CPP_to_Python_Eval_List = [
+ ['defined\s+(\w+)', '"\\1" in __dict__'],
+ ['defined\s*\((\w+)\)', '"\\1" in __dict__'],
+ ['/\*.*\*/', ''],
+ ['/\*.*', ''],
+ ['//.*', ''],
+ ['(0x[0-9A-Fa-f]*)[UL]+', '\\1'],
+]
+
+# Replace the string representations of the regular expressions in the
+# list with compiled versions.
+for l in CPP_to_Python_Eval_List:
+ l[0] = re.compile(l[0])
+
+# Wrap up all of the above into a handy function.
+def CPP_to_Python(s):
+ """
+ Converts a C pre-processor expression into an equivalent
+ Python expression that can be evaluated.
+ """
+ s = CPP_to_Python_Ops_Expression.sub(CPP_to_Python_Ops_Sub, s)
+ for expr, repl in CPP_to_Python_Eval_List:
+ s = expr.sub(repl, s)
+ return s
+
+
+
+del expr
+del l
+del override
+
+
+
+class FunctionEvaluator(object):
+ """
+ Handles delayed evaluation of a #define function call.
+ """
+ def __init__(self, name, args, expansion):
+ """
+ Squirrels away the arguments and expansion value of a #define
+ macro function for later evaluation when we must actually expand
+ a value that uses it.
+ """
+ self.name = name
+ self.args = function_arg_separator.split(args)
+ try:
+ expansion = expansion.split('##')
+ except AttributeError:
+ pass
+ self.expansion = expansion
+ def __call__(self, *values):
+ """
+ Evaluates the expansion of a #define macro function called
+ with the specified values.
+ """
+ if len(self.args) != len(values):
+ raise ValueError("Incorrect number of arguments to `%s'" % self.name)
+ # Create a dictionary that maps the macro arguments to the
+ # corresponding values in this "call." We'll use this when we
+ # eval() the expansion so that arguments will get expanded to
+ # the right values.
+ locals = {}
+ for k, v in zip(self.args, values):
+ locals[k] = v
+
+ parts = []
+ for s in self.expansion:
+ if not s in self.args:
+ s = repr(s)
+ parts.append(s)
+ statement = ' + '.join(parts)
+
+ return eval(statement, globals(), locals)
+
+
+
+# Find line continuations.
+line_continuations = re.compile('\\\\\r?\n')
+
+# Search for a "function call" macro on an expansion. Returns the
+# two-tuple of the "function" name itself, and a string containing the
+# arguments within the call parentheses.
+function_name = re.compile('(\S+)\(([^)]*)\)')
+
+# Split a string containing comma-separated function call arguments into
+# the separate arguments.
+function_arg_separator = re.compile(',\s*')
+
+
+
+class PreProcessor(object):
+ """
+ The main workhorse class for handling C pre-processing.
+ """
+ def __init__(self, current=os.curdir, cpppath=(), dict={}, all=0):
+ global Table
+
+ cpppath = tuple(cpppath)
+
+ self.searchpath = {
+ '"' : (current,) + cpppath,
+ '<' : cpppath + (current,),
+ }
+
+ # Initialize our C preprocessor namespace for tracking the
+ # values of #defined keywords. We use this namespace to look
+ # for keywords on #ifdef/#ifndef lines, and to eval() the
+ # expressions on #if/#elif lines (after massaging them from C to
+ # Python).
+ self.cpp_namespace = dict.copy()
+ self.cpp_namespace['__dict__'] = self.cpp_namespace
+
+ if all:
+ self.do_include = self.all_include
+
+ # For efficiency, a dispatch table maps each C preprocessor
+ # directive (#if, #define, etc.) to the method that should be
+ # called when we see it. We accomodate state changes (#if,
+ # #ifdef, #ifndef) by pushing the current dispatch table on a
+ # stack and changing what method gets called for each relevant
+ # directive we might see next at this level (#else, #elif).
+ # #endif will simply pop the stack.
+ d = {
+ 'scons_current_file' : self.scons_current_file
+ }
+ for op in list(Table.keys()):
+ d[op] = getattr(self, 'do_' + op)
+ self.default_table = d
+
+ # Controlling methods.
+
+ def tupleize(self, contents):
+ """
+ Turns the contents of a file into a list of easily-processed
+ tuples describing the CPP lines in the file.
+
+ The first element of each tuple is the line's preprocessor
+ directive (#if, #include, #define, etc., minus the initial '#').
+ The remaining elements are specific to the type of directive, as
+ pulled apart by the regular expression.
+ """
+ global CPP_Expression, Table
+ contents = line_continuations.sub('', contents)
+ cpp_tuples = CPP_Expression.findall(contents)
+ return [(m[0],) + Table[m[0]].match(m[1]).groups() for m in cpp_tuples]
+
+ def __call__(self, file):
+ """
+ Pre-processes a file.
+
+ This is the main public entry point.
+ """
+ self.current_file = file
+ return self.process_contents(self.read_file(file), file)
+
+ def process_contents(self, contents, fname=None):
+ """
+ Pre-processes a file contents.
+
+ This is the main internal entry point.
+ """
+ self.stack = []
+ self.dispatch_table = self.default_table.copy()
+ self.current_file = fname
+ self.tuples = self.tupleize(contents)
+
+ self.initialize_result(fname)
+ while self.tuples:
+ t = self.tuples.pop(0)
+ # Uncomment to see the list of tuples being processed (e.g.,
+ # to validate the CPP lines are being translated correctly).
+ #print(t)
+ self.dispatch_table[t[0]](t)
+ return self.finalize_result(fname)
+
+ # Dispatch table stack manipulation methods.
+
+ def save(self):
+ """
+ Pushes the current dispatch table on the stack and re-initializes
+ the current dispatch table to the default.
+ """
+ self.stack.append(self.dispatch_table)
+ self.dispatch_table = self.default_table.copy()
+
+ def restore(self):
+ """
+ Pops the previous dispatch table off the stack and makes it the
+ current one.
+ """
+ try: self.dispatch_table = self.stack.pop()
+ except IndexError: pass
+
+ # Utility methods.
+
+ def do_nothing(self, t):
+ """
+ Null method for when we explicitly want the action for a
+ specific preprocessor directive to do nothing.
+ """
+ pass
+
+ def scons_current_file(self, t):
+ self.current_file = t[1]
+
+ def eval_expression(self, t):
+ """
+ Evaluates a C preprocessor expression.
+
+ This is done by converting it to a Python equivalent and
+ eval()ing it in the C preprocessor namespace we use to
+ track #define values.
+ """
+ t = CPP_to_Python(' '.join(t[1:]))
+ try: return eval(t, self.cpp_namespace)
+ except (NameError, TypeError): return 0
+
+ def initialize_result(self, fname):
+ self.result = [fname]
+
+ def finalize_result(self, fname):
+ return self.result[1:]
+
+ def find_include_file(self, t):
+ """
+ Finds the #include file for a given preprocessor tuple.
+ """
+ fname = t[2]
+ for d in self.searchpath[t[1]]:
+ if d == os.curdir:
+ f = fname
+ else:
+ f = os.path.join(d, fname)
+ if os.path.isfile(f):
+ return f
+ return None
+
+ def read_file(self, file):
+ with open(file) as f:
+ return f.read()
+
+ # Start and stop processing include lines.
+
+ def start_handling_includes(self, t=None):
+ """
+ Causes the PreProcessor object to start processing #import,
+ #include and #include_next lines.
+
+ This method will be called when a #if, #ifdef, #ifndef or #elif
+ evaluates True, or when we reach the #else in a #if, #ifdef,
+ #ifndef or #elif block where a condition already evaluated
+ False.
+
+ """
+ d = self.dispatch_table
+ p = self.stack[-1] if self.stack else self.default_table
+
+ for k in ('import', 'include', 'include_next'):
+ d[k] = p[k]
+
+ def stop_handling_includes(self, t=None):
+ """
+ Causes the PreProcessor object to stop processing #import,
+ #include and #include_next lines.
+
+ This method will be called when a #if, #ifdef, #ifndef or #elif
+ evaluates False, or when we reach the #else in a #if, #ifdef,
+ #ifndef or #elif block where a condition already evaluated True.
+ """
+ d = self.dispatch_table
+ d['import'] = self.do_nothing
+ d['include'] = self.do_nothing
+ d['include_next'] = self.do_nothing
+
+ # Default methods for handling all of the preprocessor directives.
+ # (Note that what actually gets called for a given directive at any
+ # point in time is really controlled by the dispatch_table.)
+
+ def _do_if_else_condition(self, condition):
+ """
+ Common logic for evaluating the conditions on #if, #ifdef and
+ #ifndef lines.
+ """
+ self.save()
+ d = self.dispatch_table
+ if condition:
+ self.start_handling_includes()
+ d['elif'] = self.stop_handling_includes
+ d['else'] = self.stop_handling_includes
+ else:
+ self.stop_handling_includes()
+ d['elif'] = self.do_elif
+ d['else'] = self.start_handling_includes
+
+ def do_ifdef(self, t):
+ """
+ Default handling of a #ifdef line.
+ """
+ self._do_if_else_condition(t[1] in self.cpp_namespace)
+
+ def do_ifndef(self, t):
+ """
+ Default handling of a #ifndef line.
+ """
+ self._do_if_else_condition(t[1] not in self.cpp_namespace)
+
+ def do_if(self, t):
+ """
+ Default handling of a #if line.
+ """
+ self._do_if_else_condition(self.eval_expression(t))
+
+ def do_elif(self, t):
+ """
+ Default handling of a #elif line.
+ """
+ d = self.dispatch_table
+ if self.eval_expression(t):
+ self.start_handling_includes()
+ d['elif'] = self.stop_handling_includes
+ d['else'] = self.stop_handling_includes
+
+ def do_else(self, t):
+ """
+ Default handling of a #else line.
+ """
+ pass
+
+ def do_endif(self, t):
+ """
+ Default handling of a #endif line.
+ """
+ self.restore()
+
+ def do_define(self, t):
+ """
+ Default handling of a #define line.
+ """
+ _, name, args, expansion = t
+ try:
+ expansion = int(expansion)
+ except (TypeError, ValueError):
+ pass
+ if args:
+ evaluator = FunctionEvaluator(name, args[1:-1], expansion)
+ self.cpp_namespace[name] = evaluator
+ else:
+ self.cpp_namespace[name] = expansion
+
+ def do_undef(self, t):
+ """
+ Default handling of a #undef line.
+ """
+ try: del self.cpp_namespace[t[1]]
+ except KeyError: pass
+
+ def do_import(self, t):
+ """
+ Default handling of a #import line.
+ """
+ # XXX finish this -- maybe borrow/share logic from do_include()...?
+ pass
+
+ def do_include(self, t):
+ """
+ Default handling of a #include line.
+ """
+ t = self.resolve_include(t)
+ include_file = self.find_include_file(t)
+ if include_file:
+ #print("include_file =", include_file)
+ self.result.append(include_file)
+ contents = self.read_file(include_file)
+ new_tuples = [('scons_current_file', include_file)] + \
+ self.tupleize(contents) + \
+ [('scons_current_file', self.current_file)]
+ self.tuples[:] = new_tuples + self.tuples
+
+ # Date: Tue, 22 Nov 2005 20:26:09 -0500
+ # From: Stefan Seefeld <seefeld@sympatico.ca>
+ #
+ # By the way, #include_next is not the same as #include. The difference
+ # being that #include_next starts its search in the path following the
+ # path that let to the including file. In other words, if your system
+ # include paths are ['/foo', '/bar'], and you are looking at a header
+ # '/foo/baz.h', it might issue an '#include_next <baz.h>' which would
+ # correctly resolve to '/bar/baz.h' (if that exists), but *not* see
+ # '/foo/baz.h' again. See http://www.delorie.com/gnu/docs/gcc/cpp_11.html
+ # for more reasoning.
+ #
+ # I have no idea in what context 'import' might be used.
+
+ # XXX is #include_next really the same as #include ?
+ do_include_next = do_include
+
+ # Utility methods for handling resolution of include files.
+
+ def resolve_include(self, t):
+ """Resolve a tuple-ized #include line.
+
+ This handles recursive expansion of values without "" or <>
+ surrounding the name until an initial " or < is found, to handle
+
+ #include FILE
+
+ where FILE is a #define somewhere else."""
+
+ s = t[1]
+ while not s[0] in '<"':
+ #print("s =", s)
+ try:
+ s = self.cpp_namespace[s]
+ except KeyError:
+ m = function_name.search(s)
+ s = self.cpp_namespace[m.group(1)]
+ if callable(s):
+ args = function_arg_separator.split(m.group(2))
+ s = s(*args)
+ if not s:
+ return None
+ return (t[0], s[0], s[1:-1])
+
+ def all_include(self, t):
+ """
+ """
+ self.result.append(self.resolve_include(t))
+
+class DumbPreProcessor(PreProcessor):
+ """A preprocessor that ignores all #if/#elif/#else/#endif directives
+ and just reports back *all* of the #include files (like the classic
+ SCons scanner did).
+
+ This is functionally equivalent to using a regular expression to
+ find all of the #include lines, only slower. It exists mainly as
+ an example of how the main PreProcessor class can be sub-classed
+ to tailor its behavior.
+ """
+ def __init__(self, *args, **kw):
+ PreProcessor.__init__(self, *args, **kw)
+ d = self.default_table
+ for func in ['if', 'elif', 'else', 'endif', 'ifdef', 'ifndef']:
+ d[func] = d[func] = self.do_nothing
+
+del __revision__
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/cppTests.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/cppTests.py
new file mode 100644
index 0000000..40236e4
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/cppTests.py
@@ -0,0 +1,747 @@
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+from __future__ import absolute_import
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import atexit
+import sys
+import unittest
+
+import TestUnit
+
+import cpp
+
+
+
+basic_input = """
+#include "file1-yes"
+#include <file2-yes>
+"""
+
+
+substitution_input = """
+#define FILE3 "file3-yes"
+#define FILE4 <file4-yes>
+
+#include FILE3
+#include FILE4
+
+#define XXX_FILE5 YYY_FILE5
+#define YYY_FILE5 ZZZ_FILE5
+#define ZZZ_FILE5 FILE5
+
+#define FILE5 "file5-yes"
+#define FILE6 <file6-yes>
+
+#define XXX_FILE6 YYY_FILE6
+#define YYY_FILE6 ZZZ_FILE6
+#define ZZZ_FILE6 FILE6
+
+#include XXX_FILE5
+#include XXX_FILE6
+"""
+
+
+ifdef_input = """
+#define DEFINED 0
+
+#ifdef DEFINED
+#include "file7-yes"
+#else
+#include "file7-no"
+#endif
+
+#ifdef NOT_DEFINED
+#include <file8-no>
+#else
+#include <file8-yes>
+#endif
+"""
+
+
+if_boolean_input = """
+#define ZERO 0
+#define ONE 1
+
+#if ZERO
+#include "file9-no"
+#else
+#include "file9-yes"
+#endif
+
+#if ONE
+#include <file10-yes>
+#else
+#include <file10-no>
+#endif
+
+#if ZERO
+#include "file11-no-1"
+#elif ZERO
+#include "file11-no-2"
+#else
+#include "file11-yes"
+#endif
+
+#if ZERO
+#include <file12-no-1>
+#elif ONE
+#include <file12-yes>
+#else
+#include <file12-no-2>
+#endif
+
+#if ONE
+#include "file13-yes"
+#elif ZERO
+#include "file13-no-1"
+#else
+#include "file13-no-2"
+#endif
+
+#if ONE
+#include <file14-yes>
+#elif ONE
+#include <file14-no-1>
+#else
+#include <file14-no-2>
+#endif
+"""
+
+
+if_defined_input = """
+#define DEFINED 0
+
+#if defined(DEFINED)
+#include "file15-yes"
+#endif
+
+#if ! defined(DEFINED)
+#include <file16-no>
+#else
+#include <file16-yes>
+#endif
+
+#if defined DEFINED
+#include "file17-yes"
+#endif
+
+#if ! defined DEFINED
+#include <file18-no>
+#else
+#include <file18-yes>
+#endif
+"""
+
+
+expression_input = """
+#define ZERO 0
+#define ONE 1
+
+#if ZERO && ZERO
+#include "file19-no"
+#else
+#include "file19-yes"
+#endif
+
+#if ZERO && ONE
+#include <file20-no>
+#else
+#include <file20-yes>
+#endif
+
+#if ONE && ZERO
+#include "file21-no"
+#else
+#include "file21-yes"
+#endif
+
+#if ONE && ONE
+#include <file22-yes>
+#else
+#include <file22-no>
+#endif
+
+#if ZERO || ZERO
+#include "file23-no"
+#else
+#include "file23-yes"
+#endif
+
+#if ZERO || ONE
+#include <file24-yes>
+#else
+#include <file24-no>
+#endif
+
+#if ONE || ZERO
+#include "file25-yes"
+#else
+#include "file25-no"
+#endif
+
+#if ONE || ONE
+#include <file26-yes>
+#else
+#include <file26-no>
+#endif
+
+#if ONE == ONE
+#include "file27-yes"
+#else
+#include "file27-no"
+#endif
+
+#if ONE != ONE
+#include <file28-no>
+#else
+#include <file28-yes>
+#endif
+
+#if ! (ONE == ONE)
+#include "file29-no"
+#else
+#include "file29-yes"
+#endif
+
+#if ! (ONE != ONE)
+#include <file30-yes>
+#else
+#include <file30-no>
+#endif
+"""
+
+
+undef_input = """
+#define UNDEFINE 0
+
+#ifdef UNDEFINE
+#include "file31-yes"
+#else
+#include "file31-no"
+#endif
+
+#undef UNDEFINE
+
+#ifdef UNDEFINE
+#include <file32-no>
+#else
+#include <file32-yes>
+#endif
+"""
+
+
+macro_function_input = """
+#define ZERO 0
+#define ONE 1
+
+#define FUNC33(x) "file33-yes"
+#define FUNC34(x) <file34-yes>
+
+#include FUNC33(ZERO)
+#include FUNC34(ZERO)
+
+#define FILE35 "file35-yes"
+#define FILE36 <file36-yes>
+
+#define FUNC35(x, y) FILE35
+#define FUNC36(x, y) FILE36
+
+#include FUNC35(ZERO, ONE)
+#include FUNC36(ZERO, ONE)
+
+#define FILE37 "file37-yes"
+#define FILE38 <file38-yes>
+
+#define FUNC37a(x, y) FILE37
+#define FUNC38a(x, y) FILE38
+
+#define FUNC37b(x, y) FUNC37a(x, y)
+#define FUNC38b(x, y) FUNC38a(x, y)
+
+#define FUNC37c(x, y) FUNC37b(x, y)
+#define FUNC38c(x, y) FUNC38b(x, y)
+
+#include FUNC37c(ZERO, ONE)
+#include FUNC38c(ZERO, ONE)
+
+#define FILE39 "file39-yes"
+#define FILE40 <file40-yes>
+
+#define FUNC39a(x0, y0) FILE39
+#define FUNC40a(x0, y0) FILE40
+
+#define FUNC39b(x1, y2) FUNC39a(x1, y1)
+#define FUNC40b(x1, y2) FUNC40a(x1, y1)
+
+#define FUNC39c(x2, y2) FUNC39b(x2, y2)
+#define FUNC40c(x2, y2) FUNC40b(x2, y2)
+
+#include FUNC39c(ZERO, ONE)
+#include FUNC40c(ZERO, ONE)
+
+/* Make sure we don't die if the expansion isn't a string. */
+#define FUNC_INTEGER(x) 1
+
+/* Make sure one-character names are recognized. */
+#define _(x) translate(x)
+#undef _
+"""
+
+
+token_pasting_input = """
+#define PASTE_QUOTE(q, name) q##name##-yes##q
+#define PASTE_ANGLE(name) <##name##-yes>
+
+#define FUNC41 PASTE_QUOTE(", file41)
+#define FUNC42 PASTE_ANGLE(file42)
+
+#include FUNC41
+#include FUNC42
+"""
+
+
+no_space_input = """
+#include<file43-yes>
+#include"file44-yes"
+"""
+
+
+nested_ifs_input = """
+#define DEFINED
+
+#ifdef NOT_DEFINED
+ #include "file7-no"
+ #ifdef DEFINED
+ #include "file8-no"
+ #else
+ #include "file9-no"
+ #endif
+#else
+ #include "file7-yes"
+#endif
+"""
+
+
+
+# pp_class = PreProcessor
+# #pp_class = DumbPreProcessor
+
+# pp = pp_class(current = ".",
+# cpppath = ['/usr/include'],
+# print_all = 1)
+# #pp(open(sys.argv[1]).read())
+# pp(input)
+
+
+class cppTestCase(unittest.TestCase):
+ def setUp(self):
+ self.cpp = self.cpp_class(current = ".",
+ cpppath = ['/usr/include'])
+
+ def test_basic(self):
+ """Test basic #include scanning"""
+ expect = self.basic_expect
+ result = self.cpp.process_contents(basic_input)
+ assert expect == result, (expect, result)
+
+ def test_substitution(self):
+ """Test substitution of #include files using CPP variables"""
+ expect = self.substitution_expect
+ result = self.cpp.process_contents(substitution_input)
+ assert expect == result, (expect, result)
+
+ def test_ifdef(self):
+ """Test basic #ifdef processing"""
+ expect = self.ifdef_expect
+ result = self.cpp.process_contents(ifdef_input)
+ assert expect == result, (expect, result)
+
+ def test_if_boolean(self):
+ """Test #if with Boolean values"""
+ expect = self.if_boolean_expect
+ result = self.cpp.process_contents(if_boolean_input)
+ assert expect == result, (expect, result)
+
+ def test_if_defined(self):
+ """Test #if defined() idioms"""
+ expect = self.if_defined_expect
+ result = self.cpp.process_contents(if_defined_input)
+ assert expect == result, (expect, result)
+
+ def test_expression(self):
+ """Test #if with arithmetic expressions"""
+ expect = self.expression_expect
+ result = self.cpp.process_contents(expression_input)
+ assert expect == result, (expect, result)
+
+ def test_undef(self):
+ """Test #undef handling"""
+ expect = self.undef_expect
+ result = self.cpp.process_contents(undef_input)
+ assert expect == result, (expect, result)
+
+ def test_macro_function(self):
+ """Test using macro functions to express file names"""
+ expect = self.macro_function_expect
+ result = self.cpp.process_contents(macro_function_input)
+ assert expect == result, (expect, result)
+
+ def test_token_pasting(self):
+ """Test token-pasting to construct file names"""
+ expect = self.token_pasting_expect
+ result = self.cpp.process_contents(token_pasting_input)
+ assert expect == result, (expect, result)
+
+ def test_no_space(self):
+ """Test no space between #include and the quote"""
+ expect = self.no_space_expect
+ result = self.cpp.process_contents(no_space_input)
+ assert expect == result, (expect, result)
+
+ def test_nested_ifs(self):
+ expect = self.nested_ifs_expect
+ result = self.cpp.process_contents(nested_ifs_input)
+ assert expect == result, (expect, result)
+
+class cppAllTestCase(cppTestCase):
+ def setUp(self):
+ self.cpp = self.cpp_class(current = ".",
+ cpppath = ['/usr/include'],
+ all=1)
+
+class PreProcessorTestCase(cppAllTestCase):
+ cpp_class = cpp.PreProcessor
+
+ basic_expect = [
+ ('include', '"', 'file1-yes'),
+ ('include', '<', 'file2-yes'),
+ ]
+
+ substitution_expect = [
+ ('include', '"', 'file3-yes'),
+ ('include', '<', 'file4-yes'),
+ ('include', '"', 'file5-yes'),
+ ('include', '<', 'file6-yes'),
+ ]
+
+ ifdef_expect = [
+ ('include', '"', 'file7-yes'),
+ ('include', '<', 'file8-yes'),
+ ]
+
+ if_boolean_expect = [
+ ('include', '"', 'file9-yes'),
+ ('include', '<', 'file10-yes'),
+ ('include', '"', 'file11-yes'),
+ ('include', '<', 'file12-yes'),
+ ('include', '"', 'file13-yes'),
+ ('include', '<', 'file14-yes'),
+ ]
+
+ if_defined_expect = [
+ ('include', '"', 'file15-yes'),
+ ('include', '<', 'file16-yes'),
+ ('include', '"', 'file17-yes'),
+ ('include', '<', 'file18-yes'),
+ ]
+
+ expression_expect = [
+ ('include', '"', 'file19-yes'),
+ ('include', '<', 'file20-yes'),
+ ('include', '"', 'file21-yes'),
+ ('include', '<', 'file22-yes'),
+ ('include', '"', 'file23-yes'),
+ ('include', '<', 'file24-yes'),
+ ('include', '"', 'file25-yes'),
+ ('include', '<', 'file26-yes'),
+ ('include', '"', 'file27-yes'),
+ ('include', '<', 'file28-yes'),
+ ('include', '"', 'file29-yes'),
+ ('include', '<', 'file30-yes'),
+ ]
+
+ undef_expect = [
+ ('include', '"', 'file31-yes'),
+ ('include', '<', 'file32-yes'),
+ ]
+
+ macro_function_expect = [
+ ('include', '"', 'file33-yes'),
+ ('include', '<', 'file34-yes'),
+ ('include', '"', 'file35-yes'),
+ ('include', '<', 'file36-yes'),
+ ('include', '"', 'file37-yes'),
+ ('include', '<', 'file38-yes'),
+ ('include', '"', 'file39-yes'),
+ ('include', '<', 'file40-yes'),
+ ]
+
+ token_pasting_expect = [
+ ('include', '"', 'file41-yes'),
+ ('include', '<', 'file42-yes'),
+ ]
+
+ no_space_expect = [
+ ('include', '<', 'file43-yes'),
+ ('include', '"', 'file44-yes'),
+ ]
+
+ nested_ifs_expect = [
+ ('include', '"', 'file7-yes'),
+ ]
+
+class DumbPreProcessorTestCase(cppAllTestCase):
+ cpp_class = cpp.DumbPreProcessor
+
+ basic_expect = [
+ ('include', '"', 'file1-yes'),
+ ('include', '<', 'file2-yes'),
+ ]
+
+ substitution_expect = [
+ ('include', '"', 'file3-yes'),
+ ('include', '<', 'file4-yes'),
+ ('include', '"', 'file5-yes'),
+ ('include', '<', 'file6-yes'),
+ ]
+
+ ifdef_expect = [
+ ('include', '"', 'file7-yes'),
+ ('include', '"', 'file7-no'),
+ ('include', '<', 'file8-no'),
+ ('include', '<', 'file8-yes'),
+ ]
+
+ if_boolean_expect = [
+ ('include', '"', 'file9-no'),
+ ('include', '"', 'file9-yes'),
+ ('include', '<', 'file10-yes'),
+ ('include', '<', 'file10-no'),
+ ('include', '"', 'file11-no-1'),
+ ('include', '"', 'file11-no-2'),
+ ('include', '"', 'file11-yes'),
+ ('include', '<', 'file12-no-1'),
+ ('include', '<', 'file12-yes'),
+ ('include', '<', 'file12-no-2'),
+ ('include', '"', 'file13-yes'),
+ ('include', '"', 'file13-no-1'),
+ ('include', '"', 'file13-no-2'),
+ ('include', '<', 'file14-yes'),
+ ('include', '<', 'file14-no-1'),
+ ('include', '<', 'file14-no-2'),
+ ]
+
+ if_defined_expect = [
+ ('include', '"', 'file15-yes'),
+ ('include', '<', 'file16-no'),
+ ('include', '<', 'file16-yes'),
+ ('include', '"', 'file17-yes'),
+ ('include', '<', 'file18-no'),
+ ('include', '<', 'file18-yes'),
+ ]
+
+ expression_expect = [
+ ('include', '"', 'file19-no'),
+ ('include', '"', 'file19-yes'),
+ ('include', '<', 'file20-no'),
+ ('include', '<', 'file20-yes'),
+ ('include', '"', 'file21-no'),
+ ('include', '"', 'file21-yes'),
+ ('include', '<', 'file22-yes'),
+ ('include', '<', 'file22-no'),
+ ('include', '"', 'file23-no'),
+ ('include', '"', 'file23-yes'),
+ ('include', '<', 'file24-yes'),
+ ('include', '<', 'file24-no'),
+ ('include', '"', 'file25-yes'),
+ ('include', '"', 'file25-no'),
+ ('include', '<', 'file26-yes'),
+ ('include', '<', 'file26-no'),
+ ('include', '"', 'file27-yes'),
+ ('include', '"', 'file27-no'),
+ ('include', '<', 'file28-no'),
+ ('include', '<', 'file28-yes'),
+ ('include', '"', 'file29-no'),
+ ('include', '"', 'file29-yes'),
+ ('include', '<', 'file30-yes'),
+ ('include', '<', 'file30-no'),
+ ]
+
+ undef_expect = [
+ ('include', '"', 'file31-yes'),
+ ('include', '"', 'file31-no'),
+ ('include', '<', 'file32-no'),
+ ('include', '<', 'file32-yes'),
+ ]
+
+ macro_function_expect = [
+ ('include', '"', 'file33-yes'),
+ ('include', '<', 'file34-yes'),
+ ('include', '"', 'file35-yes'),
+ ('include', '<', 'file36-yes'),
+ ('include', '"', 'file37-yes'),
+ ('include', '<', 'file38-yes'),
+ ('include', '"', 'file39-yes'),
+ ('include', '<', 'file40-yes'),
+ ]
+
+ token_pasting_expect = [
+ ('include', '"', 'file41-yes'),
+ ('include', '<', 'file42-yes'),
+ ]
+
+ no_space_expect = [
+ ('include', '<', 'file43-yes'),
+ ('include', '"', 'file44-yes'),
+ ]
+
+ nested_ifs_expect = [
+ ('include', '"', 'file7-no'),
+ ('include', '"', 'file8-no'),
+ ('include', '"', 'file9-no'),
+ ('include', '"', 'file7-yes')
+ ]
+
+
+
+import os
+import re
+import shutil
+import tempfile
+
+tempfile.template = 'cppTests.'
+if os.name in ('posix', 'nt'):
+ tempfile.template = 'cppTests.' + str(os.getpid()) + '.'
+else:
+ tempfile.template = 'cppTests.'
+
+_Cleanup = []
+
+def _clean():
+ for dir in _Cleanup:
+ if os.path.exists(dir):
+ shutil.rmtree(dir)
+
+atexit.register(_clean)
+
+class fileTestCase(unittest.TestCase):
+ cpp_class = cpp.DumbPreProcessor
+
+ def setUp(self):
+ try:
+ path = tempfile.mktemp(prefix=tempfile.template)
+ except TypeError:
+ # The tempfile.mktemp() function in earlier versions of Python
+ # has no prefix argument, but uses the tempfile.template
+ # value that we set above.
+ path = tempfile.mktemp()
+ _Cleanup.append(path)
+ os.mkdir(path)
+ self.tempdir = path
+ self.orig_cwd = os.getcwd()
+ os.chdir(path)
+
+ def tearDown(self):
+ os.chdir(self.orig_cwd)
+ shutil.rmtree(self.tempdir)
+ _Cleanup.remove(self.tempdir)
+
+ def strip_initial_spaces(self, s):
+ lines = s.split('\n')
+ spaces = re.match(' *', lines[0]).group(0)
+ def strip_spaces(l, spaces=spaces):
+ if l[:len(spaces)] == spaces:
+ l = l[len(spaces):]
+ return l
+ return '\n'.join(map(strip_spaces, lines))
+
+ def write(self, file, contents):
+ open(file, 'w').write(self.strip_initial_spaces(contents))
+
+ def test_basic(self):
+ """Test basic file inclusion"""
+ self.write('f1.h', """\
+ #include "f2.h"
+ """)
+ self.write('f2.h', """\
+ #include <f3.h>
+ """)
+ self.write('f3.h', """\
+ """)
+ p = cpp.DumbPreProcessor(current = os.curdir,
+ cpppath = [os.curdir])
+ result = p('f1.h')
+ assert result == ['f2.h', 'f3.h'], result
+
+ def test_current_file(self):
+ """Test use of the .current_file attribute"""
+ self.write('f1.h', """\
+ #include <f2.h>
+ """)
+ self.write('f2.h', """\
+ #include "f3.h"
+ """)
+ self.write('f3.h', """\
+ """)
+ class MyPreProcessor(cpp.DumbPreProcessor):
+ def __init__(self, *args, **kw):
+ cpp.DumbPreProcessor.__init__(self, *args, **kw)
+ self.files = []
+ def __call__(self, file):
+ self.files.append(file)
+ return cpp.DumbPreProcessor.__call__(self, file)
+ def scons_current_file(self, t):
+ r = cpp.DumbPreProcessor.scons_current_file(self, t)
+ self.files.append(self.current_file)
+ return r
+ p = MyPreProcessor(current = os.curdir, cpppath = [os.curdir])
+ result = p('f1.h')
+ assert result == ['f2.h', 'f3.h'], result
+ assert p.files == ['f1.h', 'f2.h', 'f3.h', 'f2.h', 'f1.h'], p.files
+
+
+
+if __name__ == '__main__':
+ suite = unittest.TestSuite()
+ tclasses = [ PreProcessorTestCase,
+ DumbPreProcessorTestCase,
+ fileTestCase,
+ ]
+ for tclass in tclasses:
+ names = unittest.getTestCaseNames(tclass, 'test_')
+ try:
+ names = list(set(names))
+ except NameError:
+ pass
+ names.sort()
+ suite.addTests(list(map(tclass, names)))
+ TestUnit.run(suite)
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/dblite.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/dblite.py
new file mode 100644
index 0000000..87a1763
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/dblite.py
@@ -0,0 +1,286 @@
+# dblite.py module contributed by Ralf W. Grosse-Kunstleve.
+# Extended for Unicode by Steven Knight.
+from __future__ import print_function
+
+import os
+import pickle
+import shutil
+import time
+
+from SCons.compat import PICKLE_PROTOCOL
+
+keep_all_files = 00000
+ignore_corrupt_dbfiles = 0
+
+
+def corruption_warning(filename):
+ print("Warning: Discarding corrupt database:", filename)
+
+
+try:
+ unicode
+except NameError:
+ def is_string(s):
+ return isinstance(s, str)
+else:
+ def is_string(s):
+ return type(s) in (str, unicode)
+
+
+def is_bytes(s):
+ return isinstance(s, bytes)
+
+
+try:
+ unicode('a')
+except NameError:
+ def unicode(s):
+ return s
+
+dblite_suffix = '.dblite'
+
+# TODO: Does commenting this out break switching from py2/3?
+# if bytes is not str:
+# dblite_suffix += '.p3'
+tmp_suffix = '.tmp'
+
+
+class dblite(object):
+ """
+ Squirrel away references to the functions in various modules
+ that we'll use when our __del__() method calls our sync() method
+ during shutdown. We might get destroyed when Python is in the midst
+ of tearing down the different modules we import in an essentially
+ arbitrary order, and some of the various modules's global attributes
+ may already be wiped out from under us.
+
+ See the discussion at:
+ http://mail.python.org/pipermail/python-bugs-list/2003-March/016877.html
+ """
+
+ _open = open
+ _pickle_dump = staticmethod(pickle.dump)
+ _pickle_protocol = PICKLE_PROTOCOL
+ _os_chmod = os.chmod
+
+ try:
+ _os_chown = os.chown
+ except AttributeError:
+ _os_chown = None
+
+ _os_rename = os.rename
+ _os_unlink = os.unlink
+ _shutil_copyfile = shutil.copyfile
+ _time_time = time.time
+
+ def __init__(self, file_base_name, flag, mode):
+ assert flag in (None, "r", "w", "c", "n")
+ if (flag is None): flag = "r"
+
+ base, ext = os.path.splitext(file_base_name)
+ if ext == dblite_suffix:
+ # There's already a suffix on the file name, don't add one.
+ self._file_name = file_base_name
+ self._tmp_name = base + tmp_suffix
+ else:
+ self._file_name = file_base_name + dblite_suffix
+ self._tmp_name = file_base_name + tmp_suffix
+
+ self._flag = flag
+ self._mode = mode
+ self._dict = {}
+ self._needs_sync = 00000
+
+ if self._os_chown is not None and (os.geteuid() == 0 or os.getuid() == 0):
+ # running as root; chown back to current owner/group when done
+ try:
+ statinfo = os.stat(self._file_name)
+ self._chown_to = statinfo.st_uid
+ self._chgrp_to = statinfo.st_gid
+ except OSError as e:
+ # db file doesn't exist yet.
+ # Check os.environ for SUDO_UID, use if set
+ self._chown_to = int(os.environ.get('SUDO_UID', -1))
+ self._chgrp_to = int(os.environ.get('SUDO_GID', -1))
+ else:
+ self._chown_to = -1 # don't chown
+ self._chgrp_to = -1 # don't chgrp
+
+ if (self._flag == "n"):
+ self._open(self._file_name, "wb", self._mode)
+ else:
+ try:
+ f = self._open(self._file_name, "rb")
+ except IOError as e:
+ if (self._flag != "c"):
+ raise e
+ self._open(self._file_name, "wb", self._mode)
+ else:
+ p = f.read()
+ if len(p) > 0:
+ try:
+ if bytes is not str:
+ self._dict = pickle.loads(p, encoding='bytes')
+ else:
+ self._dict = pickle.loads(p)
+ except (pickle.UnpicklingError, EOFError, KeyError):
+ # Note how we catch KeyErrors too here, which might happen
+ # when we don't have cPickle available (default pickle
+ # throws it).
+ if (ignore_corrupt_dbfiles == 0): raise
+ if (ignore_corrupt_dbfiles == 1):
+ corruption_warning(self._file_name)
+
+ def close(self):
+ if (self._needs_sync):
+ self.sync()
+
+ def __del__(self):
+ self.close()
+
+ def sync(self):
+ self._check_writable()
+ f = self._open(self._tmp_name, "wb", self._mode)
+ self._pickle_dump(self._dict, f, self._pickle_protocol)
+ f.close()
+
+ # Windows doesn't allow renaming if the file exists, so unlink
+ # it first, chmod'ing it to make sure we can do so. On UNIX, we
+ # may not be able to chmod the file if it's owned by someone else
+ # (e.g. from a previous run as root). We should still be able to
+ # unlink() the file if the directory's writable, though, so ignore
+ # any OSError exception thrown by the chmod() call.
+ try:
+ self._os_chmod(self._file_name, 0o777)
+ except OSError:
+ pass
+ self._os_unlink(self._file_name)
+ self._os_rename(self._tmp_name, self._file_name)
+ if self._os_chown is not None and self._chown_to > 0: # don't chown to root or -1
+ try:
+ self._os_chown(self._file_name, self._chown_to, self._chgrp_to)
+ except OSError:
+ pass
+ self._needs_sync = 00000
+ if (keep_all_files):
+ self._shutil_copyfile(
+ self._file_name,
+ self._file_name + "_" + str(int(self._time_time())))
+
+ def _check_writable(self):
+ if (self._flag == "r"):
+ raise IOError("Read-only database: %s" % self._file_name)
+
+ def __getitem__(self, key):
+ return self._dict[key]
+
+ def __setitem__(self, key, value):
+ self._check_writable()
+ if (not is_string(key)):
+ raise TypeError("key `%s' must be a string but is %s" % (key, type(key)))
+ if (not is_bytes(value)):
+ raise TypeError("value `%s' must be a bytes but is %s" % (value, type(value)))
+ self._dict[key] = value
+ self._needs_sync = 0o001
+
+ def keys(self):
+ return list(self._dict.keys())
+
+ def has_key(self, key):
+ return key in self._dict
+
+ def __contains__(self, key):
+ return key in self._dict
+
+ def iterkeys(self):
+ # Wrapping name in () prevents fixer from "fixing" this
+ return (self._dict.iterkeys)()
+
+ __iter__ = iterkeys
+
+ def __len__(self):
+ return len(self._dict)
+
+
+def open(file, flag=None, mode=0o666):
+ return dblite(file, flag, mode)
+
+
+def _exercise():
+ db = open("tmp", "n")
+ assert len(db) == 0
+ db["foo"] = "bar"
+ assert db["foo"] == "bar"
+ db[unicode("ufoo")] = unicode("ubar")
+ assert db[unicode("ufoo")] == unicode("ubar")
+ db.sync()
+ db = open("tmp", "c")
+ assert len(db) == 2, len(db)
+ assert db["foo"] == "bar"
+ db["bar"] = "foo"
+ assert db["bar"] == "foo"
+ db[unicode("ubar")] = unicode("ufoo")
+ assert db[unicode("ubar")] == unicode("ufoo")
+ db.sync()
+ db = open("tmp", "r")
+ assert len(db) == 4, len(db)
+ assert db["foo"] == "bar"
+ assert db["bar"] == "foo"
+ assert db[unicode("ufoo")] == unicode("ubar")
+ assert db[unicode("ubar")] == unicode("ufoo")
+ try:
+ db.sync()
+ except IOError as e:
+ assert str(e) == "Read-only database: tmp.dblite"
+ else:
+ raise RuntimeError("IOError expected.")
+ db = open("tmp", "w")
+ assert len(db) == 4
+ db["ping"] = "pong"
+ db.sync()
+ try:
+ db[(1, 2)] = "tuple"
+ except TypeError as e:
+ assert str(e) == "key `(1, 2)' must be a string but is <type 'tuple'>", str(e)
+ else:
+ raise RuntimeError("TypeError exception expected")
+ try:
+ db["list"] = [1, 2]
+ except TypeError as e:
+ assert str(e) == "value `[1, 2]' must be a string but is <type 'list'>", str(e)
+ else:
+ raise RuntimeError("TypeError exception expected")
+ db = open("tmp", "r")
+ assert len(db) == 5
+ db = open("tmp", "n")
+ assert len(db) == 0
+ dblite._open("tmp.dblite", "w")
+ db = open("tmp", "r")
+ dblite._open("tmp.dblite", "w").write("x")
+ try:
+ db = open("tmp", "r")
+ except pickle.UnpicklingError:
+ pass
+ else:
+ raise RuntimeError("pickle exception expected.")
+ global ignore_corrupt_dbfiles
+ ignore_corrupt_dbfiles = 2
+ db = open("tmp", "r")
+ assert len(db) == 0
+ os.unlink("tmp.dblite")
+ try:
+ db = open("tmp", "w")
+ except IOError as e:
+ assert str(e) == "[Errno 2] No such file or directory: 'tmp.dblite'", str(e)
+ else:
+ raise RuntimeError("IOError expected.")
+
+
+if (__name__ == "__main__"):
+ _exercise()
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/engine/SCons/exitfuncs.py b/3rdParty/SCons/scons-3.0.1/engine/SCons/exitfuncs.py
new file mode 100644
index 0000000..7d00df7
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/engine/SCons/exitfuncs.py
@@ -0,0 +1,64 @@
+"""SCons.exitfuncs
+
+Register functions which are executed when SCons exits for any reason.
+
+"""
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+
+import atexit
+
+_exithandlers = []
+def _run_exitfuncs():
+ """run any registered exit functions
+
+ _exithandlers is traversed in reverse order so functions are executed
+ last in, first out.
+ """
+
+ while _exithandlers:
+ func, targs, kargs = _exithandlers.pop()
+ func(*targs, **kargs)
+
+def register(func, *targs, **kargs):
+ """register a function to be executed upon normal program termination
+
+ func - function to be called at exit
+ targs - optional arguments to pass to func
+ kargs - optional keyword arguments to pass to func
+ """
+ _exithandlers.append((func, targs, kargs))
+
+
+# make our exit function get run by python when it exits
+atexit.register(_run_exitfuncs)
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/script/MANIFEST.in b/3rdParty/SCons/scons-3.0.1/script/MANIFEST.in
new file mode 100644
index 0000000..d10cc82
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/script/MANIFEST.in
@@ -0,0 +1,4 @@
+scons
+sconsign
+scons-time
+scons-configure-cache
diff --git a/3rdParty/SCons/scons-3.0.1/script/scons-configure-cache.py b/3rdParty/SCons/scons-3.0.1/script/scons-configure-cache.py
new file mode 100644
index 0000000..0fc7b48
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/script/scons-configure-cache.py
@@ -0,0 +1,141 @@
+#! /usr/bin/env python
+#
+# SCons - a Software Constructor
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+from __future__ import print_function
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+__version__ = "__VERSION__"
+
+__build__ = "__BUILD__"
+
+__buildsys__ = "__BUILDSYS__"
+
+__date__ = "__DATE__"
+
+__developer__ = "__DEVELOPER__"
+
+import argparse
+import glob
+import json
+import os
+
+def rearrange_cache_entries(current_prefix_len, new_prefix_len):
+ print('Changing prefix length from', current_prefix_len, 'to', new_prefix_len)
+ dirs = set()
+ old_dirs = set()
+ for file in glob.iglob(os.path.join('*', '*')):
+ name = os.path.basename(file)
+ dir = name[:current_prefix_len].upper()
+ if dir not in old_dirs:
+ print('Migrating', dir)
+ old_dirs.add(dir)
+ dir = name[:new_prefix_len].upper()
+ if dir not in dirs:
+ os.mkdir(dir)
+ dirs.add(dir)
+ os.rename(file, os.path.join(dir, name))
+
+ # Now delete the original directories
+ for dir in old_dirs:
+ os.rmdir(dir)
+
+# This dictionary should have one entry per entry in the cache config
+# Each entry should have the following:
+# implicit - (optional) This is to allow adding a new config entry and also
+# changing the behaviour of the system at the same time. This
+# indicates the value the config entry would have had if it had been
+# specified.
+# default - The value the config entry should have if it wasn't previously
+# specified
+# command-line - parameters to pass to ArgumentParser.add_argument
+# converter - (optional) Function to call if it's necessary to do some work
+# if this configuration entry changes
+config_entries = {
+ 'prefix_len' : {
+ 'implicit' : 1,
+ 'default' : 2 ,
+ 'command-line' : {
+ 'help' : 'Length of cache file name used as subdirectory prefix',
+ 'metavar' : '<number>',
+ 'type' : int
+ },
+ 'converter' : rearrange_cache_entries
+ }
+}
+parser = argparse.ArgumentParser(
+ description = 'Modify the configuration of an scons cache directory',
+ epilog = '''
+ Unless you specify an option, it will not be changed (if it is
+ already set in the cache config), or changed to an appropriate
+ default (it it is not set).
+ '''
+ )
+
+parser.add_argument('cache-dir', help='Path to scons cache directory')
+for param in config_entries:
+ parser.add_argument('--' + param.replace('_', '-'),
+ **config_entries[param]['command-line'])
+parser.add_argument('--version', action='version', version='%(prog)s 1.0')
+
+# Get the command line as a dict without any of the unspecified entries.
+args = dict([x for x in vars(parser.parse_args()).items() if x[1]])
+
+# It seems somewhat strange to me, but positional arguments don't get the -
+# in the name changed to _, whereas optional arguments do...
+os.chdir(args['cache-dir'])
+del args['cache-dir']
+
+if not os.path.exists('config'):
+ # Validate the only files in the directory are directories 0-9, a-f
+ expected = [ '{:X}'.format(x) for x in range(0, 16) ]
+ if not set(os.listdir('.')).issubset(expected):
+ raise RuntimeError("This doesn't look like a version 1 cache directory")
+ config = dict()
+else:
+ with open('config') as conf:
+ config = json.load(conf)
+
+# Find any keys that aren't currently set but should be
+for key in config_entries:
+ if key not in config:
+ if 'implicit' in config_entries[key]:
+ config[key] = config_entries[key]['implicit']
+ else:
+ config[key] = config_entries[key]['default']
+ if key not in args:
+ args[key] = config_entries[key]['default']
+
+#Now we go through each entry in args to see if it changes an existing config
+#setting.
+for key in args:
+ if args[key] != config[key]:
+ if 'converter' in config_entries[key]:
+ config_entries[key]['converter'](config[key], args[key])
+ config[key] = args[key]
+
+# and write the updated config file
+with open('config', 'w') as conf:
+ json.dump(config, conf)
diff --git a/3rdParty/SCons/scons-3.0.1/script/scons-time.py b/3rdParty/SCons/scons-3.0.1/script/scons-time.py
new file mode 100644
index 0000000..aa875f1
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/script/scons-time.py
@@ -0,0 +1,1502 @@
+#!/usr/bin/env python
+#
+# scons-time - run SCons timings and collect statistics
+#
+# A script for running a configuration through SCons with a standard
+# set of invocations to collect timing and memory statistics and to
+# capture the results in a consistent set of output files for display
+# and analysis.
+#
+
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+from __future__ import division, print_function
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import getopt
+import glob
+import os
+import re
+import shutil
+import sys
+import tempfile
+import time
+
+def make_temp_file(**kw):
+ try:
+ result = tempfile.mktemp(**kw)
+ result = os.path.realpath(result)
+ except TypeError:
+ try:
+ save_template = tempfile.template
+ prefix = kw['prefix']
+ del kw['prefix']
+ tempfile.template = prefix
+ result = tempfile.mktemp(**kw)
+ finally:
+ tempfile.template = save_template
+ return result
+
+def HACK_for_exec(cmd, *args):
+ '''
+ For some reason, Python won't allow an exec() within a function
+ that also declares an internal function (including lambda functions).
+ This function is a hack that calls exec() in a function with no
+ internal functions.
+ '''
+ if not args: exec(cmd)
+ elif len(args) == 1: exec(cmd, args[0])
+ else: exec(cmd, args[0], args[1])
+
+class Plotter(object):
+ def increment_size(self, largest):
+ """
+ Return the size of each horizontal increment line for a specified
+ maximum value. This returns a value that will provide somewhere
+ between 5 and 9 horizontal lines on the graph, on some set of
+ boundaries that are multiples of 10/100/1000/etc.
+ """
+ i = largest // 5
+ if not i:
+ return largest
+ multiplier = 1
+ while i >= 10:
+ i = i // 10
+ multiplier = multiplier * 10
+ return i * multiplier
+
+ def max_graph_value(self, largest):
+ # Round up to next integer.
+ largest = int(largest) + 1
+ increment = self.increment_size(largest)
+ return ((largest + increment - 1) // increment) * increment
+
+class Line(object):
+ def __init__(self, points, type, title, label, comment, fmt="%s %s"):
+ self.points = points
+ self.type = type
+ self.title = title
+ self.label = label
+ self.comment = comment
+ self.fmt = fmt
+
+ def print_label(self, inx, x, y):
+ if self.label:
+ print('set label %s "%s" at %0.1f,%0.1f right' % (inx, self.label, x, y))
+
+ def plot_string(self):
+ if self.title:
+ title_string = 'title "%s"' % self.title
+ else:
+ title_string = 'notitle'
+ return "'-' %s with lines lt %s" % (title_string, self.type)
+
+ def print_points(self, fmt=None):
+ if fmt is None:
+ fmt = self.fmt
+ if self.comment:
+ print('# %s' % self.comment)
+ for x, y in self.points:
+ # If y is None, it usually represents some kind of break
+ # in the line's index number. We might want to represent
+ # this some way rather than just drawing the line straight
+ # between the two points on either side.
+ if not y is None:
+ print(fmt % (x, y))
+ print('e')
+
+ def get_x_values(self):
+ return [ p[0] for p in self.points ]
+
+ def get_y_values(self):
+ return [ p[1] for p in self.points ]
+
+class Gnuplotter(Plotter):
+
+ def __init__(self, title, key_location):
+ self.lines = []
+ self.title = title
+ self.key_location = key_location
+
+ def line(self, points, type, title=None, label=None, comment=None, fmt='%s %s'):
+ if points:
+ line = Line(points, type, title, label, comment, fmt)
+ self.lines.append(line)
+
+ def plot_string(self, line):
+ return line.plot_string()
+
+ def vertical_bar(self, x, type, label, comment):
+ if self.get_min_x() <= x and x <= self.get_max_x():
+ points = [(x, 0), (x, self.max_graph_value(self.get_max_y()))]
+ self.line(points, type, label, comment)
+
+ def get_all_x_values(self):
+ result = []
+ for line in self.lines:
+ result.extend(line.get_x_values())
+ return [r for r in result if not r is None]
+
+ def get_all_y_values(self):
+ result = []
+ for line in self.lines:
+ result.extend(line.get_y_values())
+ return [r for r in result if not r is None]
+
+ def get_min_x(self):
+ try:
+ return self.min_x
+ except AttributeError:
+ try:
+ self.min_x = min(self.get_all_x_values())
+ except ValueError:
+ self.min_x = 0
+ return self.min_x
+
+ def get_max_x(self):
+ try:
+ return self.max_x
+ except AttributeError:
+ try:
+ self.max_x = max(self.get_all_x_values())
+ except ValueError:
+ self.max_x = 0
+ return self.max_x
+
+ def get_min_y(self):
+ try:
+ return self.min_y
+ except AttributeError:
+ try:
+ self.min_y = min(self.get_all_y_values())
+ except ValueError:
+ self.min_y = 0
+ return self.min_y
+
+ def get_max_y(self):
+ try:
+ return self.max_y
+ except AttributeError:
+ try:
+ self.max_y = max(self.get_all_y_values())
+ except ValueError:
+ self.max_y = 0
+ return self.max_y
+
+ def draw(self):
+
+ if not self.lines:
+ return
+
+ if self.title:
+ print('set title "%s"' % self.title)
+ print('set key %s' % self.key_location)
+
+ min_y = self.get_min_y()
+ max_y = self.max_graph_value(self.get_max_y())
+ incr = (max_y - min_y) / 10.0
+ start = min_y + (max_y / 2.0) + (2.0 * incr)
+ position = [ start - (i * incr) for i in range(5) ]
+
+ inx = 1
+ for line in self.lines:
+ line.print_label(inx, line.points[0][0]-1,
+ position[(inx-1) % len(position)])
+ inx += 1
+
+ plot_strings = [ self.plot_string(l) for l in self.lines ]
+ print('plot ' + ', \\\n '.join(plot_strings))
+
+ for line in self.lines:
+ line.print_points()
+
+
+
+def untar(fname):
+ import tarfile
+ tar = tarfile.open(name=fname, mode='r')
+ for tarinfo in tar:
+ tar.extract(tarinfo)
+ tar.close()
+
+def unzip(fname):
+ import zipfile
+ zf = zipfile.ZipFile(fname, 'r')
+ for name in zf.namelist():
+ dir = os.path.dirname(name)
+ try:
+ os.makedirs(dir)
+ except:
+ pass
+ open(name, 'wb').write(zf.read(name))
+
+def read_tree(dir):
+ for dirpath, dirnames, filenames in os.walk(dir):
+ for fn in filenames:
+ fn = os.path.join(dirpath, fn)
+ if os.path.isfile(fn):
+ open(fn, 'rb').read()
+
+def redirect_to_file(command, log):
+ return '%s > %s 2>&1' % (command, log)
+
+def tee_to_file(command, log):
+ return '%s 2>&1 | tee %s' % (command, log)
+
+
+
+class SConsTimer(object):
+ """
+ Usage: scons-time SUBCOMMAND [ARGUMENTS]
+ Type "scons-time help SUBCOMMAND" for help on a specific subcommand.
+
+ Available subcommands:
+ func Extract test-run data for a function
+ help Provides help
+ mem Extract --debug=memory data from test runs
+ obj Extract --debug=count data from test runs
+ time Extract --debug=time data from test runs
+ run Runs a test configuration
+ """
+
+ name = 'scons-time'
+ name_spaces = ' '*len(name)
+
+ def makedict(**kw):
+ return kw
+
+ default_settings = makedict(
+ aegis = 'aegis',
+ aegis_project = None,
+ chdir = None,
+ config_file = None,
+ initial_commands = [],
+ key_location = 'bottom left',
+ orig_cwd = os.getcwd(),
+ outdir = None,
+ prefix = '',
+ python = '"%s"' % sys.executable,
+ redirect = redirect_to_file,
+ scons = None,
+ scons_flags = '--debug=count --debug=memory --debug=time --debug=memoizer',
+ scons_lib_dir = None,
+ scons_wrapper = None,
+ startup_targets = '--help',
+ subdir = None,
+ subversion_url = None,
+ svn = 'svn',
+ svn_co_flag = '-q',
+ tar = 'tar',
+ targets = '',
+ targets0 = None,
+ targets1 = None,
+ targets2 = None,
+ title = None,
+ unzip = 'unzip',
+ verbose = False,
+ vertical_bars = [],
+
+ unpack_map = {
+ '.tar.gz' : (untar, '%(tar)s xzf %%s'),
+ '.tgz' : (untar, '%(tar)s xzf %%s'),
+ '.tar' : (untar, '%(tar)s xf %%s'),
+ '.zip' : (unzip, '%(unzip)s %%s'),
+ },
+ )
+
+ run_titles = [
+ 'Startup',
+ 'Full build',
+ 'Up-to-date build',
+ ]
+
+ run_commands = [
+ '%(python)s %(scons_wrapper)s %(scons_flags)s --profile=%(prof0)s %(targets0)s',
+ '%(python)s %(scons_wrapper)s %(scons_flags)s --profile=%(prof1)s %(targets1)s',
+ '%(python)s %(scons_wrapper)s %(scons_flags)s --profile=%(prof2)s %(targets2)s',
+ ]
+
+ stages = [
+ 'pre-read',
+ 'post-read',
+ 'pre-build',
+ 'post-build',
+ ]
+
+ stage_strings = {
+ 'pre-read' : 'Memory before reading SConscript files:',
+ 'post-read' : 'Memory after reading SConscript files:',
+ 'pre-build' : 'Memory before building targets:',
+ 'post-build' : 'Memory after building targets:',
+ }
+
+ memory_string_all = 'Memory '
+
+ default_stage = stages[-1]
+
+ time_strings = {
+ 'total' : 'Total build time',
+ 'SConscripts' : 'Total SConscript file execution time',
+ 'SCons' : 'Total SCons execution time',
+ 'commands' : 'Total command execution time',
+ }
+
+ time_string_all = 'Total .* time'
+
+ #
+
+ def __init__(self):
+ self.__dict__.update(self.default_settings)
+
+ # Functions for displaying and executing commands.
+
+ def subst(self, x, dictionary):
+ try:
+ return x % dictionary
+ except TypeError:
+ # x isn't a string (it's probably a Python function),
+ # so just return it.
+ return x
+
+ def subst_variables(self, command, dictionary):
+ """
+ Substitutes (via the format operator) the values in the specified
+ dictionary into the specified command.
+
+ The command can be an (action, string) tuple. In all cases, we
+ perform substitution on strings and don't worry if something isn't
+ a string. (It's probably a Python function to be executed.)
+ """
+ try:
+ command + ''
+ except TypeError:
+ action = command[0]
+ string = command[1]
+ args = command[2:]
+ else:
+ action = command
+ string = action
+ args = (())
+ action = self.subst(action, dictionary)
+ string = self.subst(string, dictionary)
+ return (action, string, args)
+
+ def _do_not_display(self, msg, *args):
+ pass
+
+ def display(self, msg, *args):
+ """
+ Displays the specified message.
+
+ Each message is prepended with a standard prefix of our name
+ plus the time.
+ """
+ if callable(msg):
+ msg = msg(*args)
+ else:
+ msg = msg % args
+ if msg is None:
+ return
+ fmt = '%s[%s]: %s\n'
+ sys.stdout.write(fmt % (self.name, time.strftime('%H:%M:%S'), msg))
+
+ def _do_not_execute(self, action, *args):
+ pass
+
+ def execute(self, action, *args):
+ """
+ Executes the specified action.
+
+ The action is called if it's a callable Python function, and
+ otherwise passed to os.system().
+ """
+ if callable(action):
+ action(*args)
+ else:
+ os.system(action % args)
+
+ def run_command_list(self, commands, dict):
+ """
+ Executes a list of commands, substituting values from the
+ specified dictionary.
+ """
+ commands = [ self.subst_variables(c, dict) for c in commands ]
+ for action, string, args in commands:
+ self.display(string, *args)
+ sys.stdout.flush()
+ status = self.execute(action, *args)
+ if status:
+ sys.exit(status)
+
+ def log_display(self, command, log):
+ command = self.subst(command, self.__dict__)
+ if log:
+ command = self.redirect(command, log)
+ return command
+
+ def log_execute(self, command, log):
+ command = self.subst(command, self.__dict__)
+ output = os.popen(command).read()
+ if self.verbose:
+ sys.stdout.write(output)
+ # TODO: Figure out
+ # Not sure we need to write binary here
+ open(log, 'w').write(output)
+
+ #
+
+ def archive_splitext(self, path):
+ """
+ Splits an archive name into a filename base and extension.
+
+ This is like os.path.splitext() (which it calls) except that it
+ also looks for '.tar.gz' and treats it as an atomic extensions.
+ """
+ if path.endswith('.tar.gz'):
+ return path[:-7], path[-7:]
+ else:
+ return os.path.splitext(path)
+
+ def args_to_files(self, args, tail=None):
+ """
+ Takes a list of arguments, expands any glob patterns, and
+ returns the last "tail" files from the list.
+ """
+ files = []
+ for a in args:
+ files.extend(sorted(glob.glob(a)))
+
+ if tail:
+ files = files[-tail:]
+
+ return files
+
+ def ascii_table(self, files, columns,
+ line_function, file_function=lambda x: x,
+ *args, **kw):
+
+ header_fmt = ' '.join(['%12s'] * len(columns))
+ line_fmt = header_fmt + ' %s'
+
+ print(header_fmt % columns)
+
+ for file in files:
+ t = line_function(file, *args, **kw)
+ if t is None:
+ t = []
+ diff = len(columns) - len(t)
+ if diff > 0:
+ t += [''] * diff
+ t.append(file_function(file))
+ print(line_fmt % tuple(t))
+
+ def collect_results(self, files, function, *args, **kw):
+ results = {}
+
+ for file in files:
+ base = os.path.splitext(file)[0]
+ run, index = base.split('-')[-2:]
+
+ run = int(run)
+ index = int(index)
+
+ value = function(file, *args, **kw)
+
+ try:
+ r = results[index]
+ except KeyError:
+ r = []
+ results[index] = r
+ r.append((run, value))
+
+ return results
+
+ def doc_to_help(self, obj):
+ """
+ Translates an object's __doc__ string into help text.
+
+ This strips a consistent number of spaces from each line in the
+ help text, essentially "outdenting" the text to the left-most
+ column.
+ """
+ doc = obj.__doc__
+ if doc is None:
+ return ''
+ return self.outdent(doc)
+
+ def find_next_run_number(self, dir, prefix):
+ """
+ Returns the next run number in a directory for the specified prefix.
+
+ Examines the contents the specified directory for files with the
+ specified prefix, extracts the run numbers from each file name,
+ and returns the next run number after the largest it finds.
+ """
+ x = re.compile(re.escape(prefix) + '-([0-9]+).*')
+ matches = [x.match(e) for e in os.listdir(dir)]
+ matches = [_f for _f in matches if _f]
+ if not matches:
+ return 0
+ run_numbers = [int(m.group(1)) for m in matches]
+ return int(max(run_numbers)) + 1
+
+ def gnuplot_results(self, results, fmt='%s %.3f'):
+ """
+ Prints out a set of results in Gnuplot format.
+ """
+ gp = Gnuplotter(self.title, self.key_location)
+
+ for i in sorted(results.keys()):
+ try:
+ t = self.run_titles[i]
+ except IndexError:
+ t = '??? %s ???' % i
+ results[i].sort()
+ gp.line(results[i], i+1, t, None, t, fmt=fmt)
+
+ for bar_tuple in self.vertical_bars:
+ try:
+ x, type, label, comment = bar_tuple
+ except ValueError:
+ x, type, label = bar_tuple
+ comment = label
+ gp.vertical_bar(x, type, label, comment)
+
+ gp.draw()
+
+ def logfile_name(self, invocation):
+ """
+ Returns the absolute path of a log file for the specificed
+ invocation number.
+ """
+ name = self.prefix_run + '-%d.log' % invocation
+ return os.path.join(self.outdir, name)
+
+ def outdent(self, s):
+ """
+ Strip as many spaces from each line as are found at the beginning
+ of the first line in the list.
+ """
+ lines = s.split('\n')
+ if lines[0] == '':
+ lines = lines[1:]
+ spaces = re.match(' *', lines[0]).group(0)
+ def strip_initial_spaces(l, s=spaces):
+ if l.startswith(spaces):
+ l = l[len(spaces):]
+ return l
+ return '\n'.join([ strip_initial_spaces(l) for l in lines ]) + '\n'
+
+ def profile_name(self, invocation):
+ """
+ Returns the absolute path of a profile file for the specified
+ invocation number.
+ """
+ name = self.prefix_run + '-%d.prof' % invocation
+ return os.path.join(self.outdir, name)
+
+ def set_env(self, key, value):
+ os.environ[key] = value
+
+ #
+
+ def get_debug_times(self, file, time_string=None):
+ """
+ Fetch times from the --debug=time strings in the specified file.
+ """
+ if time_string is None:
+ search_string = self.time_string_all
+ else:
+ search_string = time_string
+ contents = open(file).read()
+ if not contents:
+ sys.stderr.write('file %s has no contents!\n' % repr(file))
+ return None
+ result = re.findall(r'%s: ([\d\.]*)' % search_string, contents)[-4:]
+ result = [ float(r) for r in result ]
+ if not time_string is None:
+ try:
+ result = result[0]
+ except IndexError:
+ sys.stderr.write('file %s has no results!\n' % repr(file))
+ return None
+ return result
+
+ def get_function_profile(self, file, function):
+ """
+ Returns the file, line number, function name, and cumulative time.
+ """
+ try:
+ import pstats
+ except ImportError as e:
+ sys.stderr.write('%s: func: %s\n' % (self.name, e))
+ sys.stderr.write('%s This version of Python is missing the profiler.\n' % self.name_spaces)
+ sys.stderr.write('%s Cannot use the "func" subcommand.\n' % self.name_spaces)
+ sys.exit(1)
+ statistics = pstats.Stats(file).stats
+ matches = [ e for e in statistics.items() if e[0][2] == function ]
+ r = matches[0]
+ return r[0][0], r[0][1], r[0][2], r[1][3]
+
+ def get_function_time(self, file, function):
+ """
+ Returns just the cumulative time for the specified function.
+ """
+ return self.get_function_profile(file, function)[3]
+
+ def get_memory(self, file, memory_string=None):
+ """
+ Returns a list of integers of the amount of memory used. The
+ default behavior is to return all the stages.
+ """
+ if memory_string is None:
+ search_string = self.memory_string_all
+ else:
+ search_string = memory_string
+ lines = open(file).readlines()
+ lines = [ l for l in lines if l.startswith(search_string) ][-4:]
+ result = [ int(l.split()[-1]) for l in lines[-4:] ]
+ if len(result) == 1:
+ result = result[0]
+ return result
+
+ def get_object_counts(self, file, object_name, index=None):
+ """
+ Returns the counts of the specified object_name.
+ """
+ object_string = ' ' + object_name + '\n'
+ lines = open(file).readlines()
+ line = [ l for l in lines if l.endswith(object_string) ][0]
+ result = [ int(field) for field in line.split()[:4] ]
+ if index is not None:
+ result = result[index]
+ return result
+
+ #
+
+ command_alias = {}
+
+ def execute_subcommand(self, argv):
+ """
+ Executes the do_*() function for the specified subcommand (argv[0]).
+ """
+ if not argv:
+ return
+ cmdName = self.command_alias.get(argv[0], argv[0])
+ try:
+ func = getattr(self, 'do_' + cmdName)
+ except AttributeError:
+ return self.default(argv)
+ try:
+ return func(argv)
+ except TypeError as e:
+ sys.stderr.write("%s %s: %s\n" % (self.name, cmdName, e))
+ import traceback
+ traceback.print_exc(file=sys.stderr)
+ sys.stderr.write("Try '%s help %s'\n" % (self.name, cmdName))
+
+ def default(self, argv):
+ """
+ The default behavior for an unknown subcommand. Prints an
+ error message and exits.
+ """
+ sys.stderr.write('%s: Unknown subcommand "%s".\n' % (self.name, argv[0]))
+ sys.stderr.write('Type "%s help" for usage.\n' % self.name)
+ sys.exit(1)
+
+ #
+
+ def do_help(self, argv):
+ """
+ """
+ if argv[1:]:
+ for arg in argv[1:]:
+ try:
+ func = getattr(self, 'do_' + arg)
+ except AttributeError:
+ sys.stderr.write('%s: No help for "%s"\n' % (self.name, arg))
+ else:
+ try:
+ help = getattr(self, 'help_' + arg)
+ except AttributeError:
+ sys.stdout.write(self.doc_to_help(func))
+ sys.stdout.flush()
+ else:
+ help()
+ else:
+ doc = self.doc_to_help(self.__class__)
+ if doc:
+ sys.stdout.write(doc)
+ sys.stdout.flush()
+ return None
+
+ #
+
+ def help_func(self):
+ help = """\
+ Usage: scons-time func [OPTIONS] FILE [...]
+
+ -C DIR, --chdir=DIR Change to DIR before looking for files
+ -f FILE, --file=FILE Read configuration from specified FILE
+ --fmt=FORMAT, --format=FORMAT Print data in specified FORMAT
+ --func=NAME, --function=NAME Report time for function NAME
+ -h, --help Print this help and exit
+ -p STRING, --prefix=STRING Use STRING as log file/profile prefix
+ -t NUMBER, --tail=NUMBER Only report the last NUMBER files
+ --title=TITLE Specify the output plot TITLE
+ """
+ sys.stdout.write(self.outdent(help))
+ sys.stdout.flush()
+
+ def do_func(self, argv):
+ """
+ """
+ format = 'ascii'
+ function_name = '_main'
+ tail = None
+
+ short_opts = '?C:f:hp:t:'
+
+ long_opts = [
+ 'chdir=',
+ 'file=',
+ 'fmt=',
+ 'format=',
+ 'func=',
+ 'function=',
+ 'help',
+ 'prefix=',
+ 'tail=',
+ 'title=',
+ ]
+
+ opts, args = getopt.getopt(argv[1:], short_opts, long_opts)
+
+ for o, a in opts:
+ if o in ('-C', '--chdir'):
+ self.chdir = a
+ elif o in ('-f', '--file'):
+ self.config_file = a
+ elif o in ('--fmt', '--format'):
+ format = a
+ elif o in ('--func', '--function'):
+ function_name = a
+ elif o in ('-?', '-h', '--help'):
+ self.do_help(['help', 'func'])
+ sys.exit(0)
+ elif o in ('--max',):
+ max_time = int(a)
+ elif o in ('-p', '--prefix'):
+ self.prefix = a
+ elif o in ('-t', '--tail'):
+ tail = int(a)
+ elif o in ('--title',):
+ self.title = a
+
+ if self.config_file:
+ exec(open(self.config_file, 'r').read(), self.__dict__)
+
+ if self.chdir:
+ os.chdir(self.chdir)
+
+ if not args:
+
+ pattern = '%s*.prof' % self.prefix
+ args = self.args_to_files([pattern], tail)
+
+ if not args:
+ if self.chdir:
+ directory = self.chdir
+ else:
+ directory = os.getcwd()
+
+ sys.stderr.write('%s: func: No arguments specified.\n' % self.name)
+ sys.stderr.write('%s No %s*.prof files found in "%s".\n' % (self.name_spaces, self.prefix, directory))
+ sys.stderr.write('%s Type "%s help func" for help.\n' % (self.name_spaces, self.name))
+ sys.exit(1)
+
+ else:
+
+ args = self.args_to_files(args, tail)
+
+ cwd_ = os.getcwd() + os.sep
+
+ if format == 'ascii':
+
+ for file in args:
+ try:
+ f, line, func, time = \
+ self.get_function_profile(file, function_name)
+ except ValueError as e:
+ sys.stderr.write("%s: func: %s: %s\n" %
+ (self.name, file, e))
+ else:
+ if f.startswith(cwd_):
+ f = f[len(cwd_):]
+ print("%.3f %s:%d(%s)" % (time, f, line, func))
+
+ elif format == 'gnuplot':
+
+ results = self.collect_results(args, self.get_function_time,
+ function_name)
+
+ self.gnuplot_results(results)
+
+ else:
+
+ sys.stderr.write('%s: func: Unknown format "%s".\n' % (self.name, format))
+ sys.exit(1)
+
+ #
+
+ def help_mem(self):
+ help = """\
+ Usage: scons-time mem [OPTIONS] FILE [...]
+
+ -C DIR, --chdir=DIR Change to DIR before looking for files
+ -f FILE, --file=FILE Read configuration from specified FILE
+ --fmt=FORMAT, --format=FORMAT Print data in specified FORMAT
+ -h, --help Print this help and exit
+ -p STRING, --prefix=STRING Use STRING as log file/profile prefix
+ --stage=STAGE Plot memory at the specified stage:
+ pre-read, post-read, pre-build,
+ post-build (default: post-build)
+ -t NUMBER, --tail=NUMBER Only report the last NUMBER files
+ --title=TITLE Specify the output plot TITLE
+ """
+ sys.stdout.write(self.outdent(help))
+ sys.stdout.flush()
+
+ def do_mem(self, argv):
+
+ format = 'ascii'
+ logfile_path = lambda x: x
+ stage = self.default_stage
+ tail = None
+
+ short_opts = '?C:f:hp:t:'
+
+ long_opts = [
+ 'chdir=',
+ 'file=',
+ 'fmt=',
+ 'format=',
+ 'help',
+ 'prefix=',
+ 'stage=',
+ 'tail=',
+ 'title=',
+ ]
+
+ opts, args = getopt.getopt(argv[1:], short_opts, long_opts)
+
+ for o, a in opts:
+ if o in ('-C', '--chdir'):
+ self.chdir = a
+ elif o in ('-f', '--file'):
+ self.config_file = a
+ elif o in ('--fmt', '--format'):
+ format = a
+ elif o in ('-?', '-h', '--help'):
+ self.do_help(['help', 'mem'])
+ sys.exit(0)
+ elif o in ('-p', '--prefix'):
+ self.prefix = a
+ elif o in ('--stage',):
+ if not a in self.stages:
+ sys.stderr.write('%s: mem: Unrecognized stage "%s".\n' % (self.name, a))
+ sys.exit(1)
+ stage = a
+ elif o in ('-t', '--tail'):
+ tail = int(a)
+ elif o in ('--title',):
+ self.title = a
+
+ if self.config_file:
+ HACK_for_exec(open(self.config_file, 'r').read(), self.__dict__)
+
+ if self.chdir:
+ os.chdir(self.chdir)
+ logfile_path = lambda x: os.path.join(self.chdir, x)
+
+ if not args:
+
+ pattern = '%s*.log' % self.prefix
+ args = self.args_to_files([pattern], tail)
+
+ if not args:
+ if self.chdir:
+ directory = self.chdir
+ else:
+ directory = os.getcwd()
+
+ sys.stderr.write('%s: mem: No arguments specified.\n' % self.name)
+ sys.stderr.write('%s No %s*.log files found in "%s".\n' % (self.name_spaces, self.prefix, directory))
+ sys.stderr.write('%s Type "%s help mem" for help.\n' % (self.name_spaces, self.name))
+ sys.exit(1)
+
+ else:
+
+ args = self.args_to_files(args, tail)
+
+ cwd_ = os.getcwd() + os.sep
+
+ if format == 'ascii':
+
+ self.ascii_table(args, tuple(self.stages), self.get_memory, logfile_path)
+
+ elif format == 'gnuplot':
+
+ results = self.collect_results(args, self.get_memory,
+ self.stage_strings[stage])
+
+ self.gnuplot_results(results)
+
+ else:
+
+ sys.stderr.write('%s: mem: Unknown format "%s".\n' % (self.name, format))
+ sys.exit(1)
+
+ return 0
+
+ #
+
+ def help_obj(self):
+ help = """\
+ Usage: scons-time obj [OPTIONS] OBJECT FILE [...]
+
+ -C DIR, --chdir=DIR Change to DIR before looking for files
+ -f FILE, --file=FILE Read configuration from specified FILE
+ --fmt=FORMAT, --format=FORMAT Print data in specified FORMAT
+ -h, --help Print this help and exit
+ -p STRING, --prefix=STRING Use STRING as log file/profile prefix
+ --stage=STAGE Plot memory at the specified stage:
+ pre-read, post-read, pre-build,
+ post-build (default: post-build)
+ -t NUMBER, --tail=NUMBER Only report the last NUMBER files
+ --title=TITLE Specify the output plot TITLE
+ """
+ sys.stdout.write(self.outdent(help))
+ sys.stdout.flush()
+
+ def do_obj(self, argv):
+
+ format = 'ascii'
+ logfile_path = lambda x: x
+ stage = self.default_stage
+ tail = None
+
+ short_opts = '?C:f:hp:t:'
+
+ long_opts = [
+ 'chdir=',
+ 'file=',
+ 'fmt=',
+ 'format=',
+ 'help',
+ 'prefix=',
+ 'stage=',
+ 'tail=',
+ 'title=',
+ ]
+
+ opts, args = getopt.getopt(argv[1:], short_opts, long_opts)
+
+ for o, a in opts:
+ if o in ('-C', '--chdir'):
+ self.chdir = a
+ elif o in ('-f', '--file'):
+ self.config_file = a
+ elif o in ('--fmt', '--format'):
+ format = a
+ elif o in ('-?', '-h', '--help'):
+ self.do_help(['help', 'obj'])
+ sys.exit(0)
+ elif o in ('-p', '--prefix'):
+ self.prefix = a
+ elif o in ('--stage',):
+ if not a in self.stages:
+ sys.stderr.write('%s: obj: Unrecognized stage "%s".\n' % (self.name, a))
+ sys.stderr.write('%s Type "%s help obj" for help.\n' % (self.name_spaces, self.name))
+ sys.exit(1)
+ stage = a
+ elif o in ('-t', '--tail'):
+ tail = int(a)
+ elif o in ('--title',):
+ self.title = a
+
+ if not args:
+ sys.stderr.write('%s: obj: Must specify an object name.\n' % self.name)
+ sys.stderr.write('%s Type "%s help obj" for help.\n' % (self.name_spaces, self.name))
+ sys.exit(1)
+
+ object_name = args.pop(0)
+
+ if self.config_file:
+ HACK_for_exec(open(self.config_file, 'r').read(), self.__dict__)
+
+ if self.chdir:
+ os.chdir(self.chdir)
+ logfile_path = lambda x: os.path.join(self.chdir, x)
+
+ if not args:
+
+ pattern = '%s*.log' % self.prefix
+ args = self.args_to_files([pattern], tail)
+
+ if not args:
+ if self.chdir:
+ directory = self.chdir
+ else:
+ directory = os.getcwd()
+
+ sys.stderr.write('%s: obj: No arguments specified.\n' % self.name)
+ sys.stderr.write('%s No %s*.log files found in "%s".\n' % (self.name_spaces, self.prefix, directory))
+ sys.stderr.write('%s Type "%s help obj" for help.\n' % (self.name_spaces, self.name))
+ sys.exit(1)
+
+ else:
+
+ args = self.args_to_files(args, tail)
+
+ cwd_ = os.getcwd() + os.sep
+
+ if format == 'ascii':
+
+ self.ascii_table(args, tuple(self.stages), self.get_object_counts, logfile_path, object_name)
+
+ elif format == 'gnuplot':
+
+ stage_index = 0
+ for s in self.stages:
+ if stage == s:
+ break
+ stage_index = stage_index + 1
+
+ results = self.collect_results(args, self.get_object_counts,
+ object_name, stage_index)
+
+ self.gnuplot_results(results)
+
+ else:
+
+ sys.stderr.write('%s: obj: Unknown format "%s".\n' % (self.name, format))
+ sys.exit(1)
+
+ return 0
+
+ #
+
+ def help_run(self):
+ help = """\
+ Usage: scons-time run [OPTIONS] [FILE ...]
+
+ --aegis=PROJECT Use SCons from the Aegis PROJECT
+ --chdir=DIR Name of unpacked directory for chdir
+ -f FILE, --file=FILE Read configuration from specified FILE
+ -h, --help Print this help and exit
+ -n, --no-exec No execute, just print command lines
+ --number=NUMBER Put output in files for run NUMBER
+ --outdir=OUTDIR Put output files in OUTDIR
+ -p STRING, --prefix=STRING Use STRING as log file/profile prefix
+ --python=PYTHON Time using the specified PYTHON
+ -q, --quiet Don't print command lines
+ --scons=SCONS Time using the specified SCONS
+ --svn=URL, --subversion=URL Use SCons from Subversion URL
+ -v, --verbose Display output of commands
+ """
+ sys.stdout.write(self.outdent(help))
+ sys.stdout.flush()
+
+ def do_run(self, argv):
+ """
+ """
+ run_number_list = [None]
+
+ short_opts = '?f:hnp:qs:v'
+
+ long_opts = [
+ 'aegis=',
+ 'file=',
+ 'help',
+ 'no-exec',
+ 'number=',
+ 'outdir=',
+ 'prefix=',
+ 'python=',
+ 'quiet',
+ 'scons=',
+ 'svn=',
+ 'subdir=',
+ 'subversion=',
+ 'verbose',
+ ]
+
+ opts, args = getopt.getopt(argv[1:], short_opts, long_opts)
+
+ for o, a in opts:
+ if o in ('--aegis',):
+ self.aegis_project = a
+ elif o in ('-f', '--file'):
+ self.config_file = a
+ elif o in ('-?', '-h', '--help'):
+ self.do_help(['help', 'run'])
+ sys.exit(0)
+ elif o in ('-n', '--no-exec'):
+ self.execute = self._do_not_execute
+ elif o in ('--number',):
+ run_number_list = self.split_run_numbers(a)
+ elif o in ('--outdir',):
+ self.outdir = a
+ elif o in ('-p', '--prefix'):
+ self.prefix = a
+ elif o in ('--python',):
+ self.python = a
+ elif o in ('-q', '--quiet'):
+ self.display = self._do_not_display
+ elif o in ('-s', '--subdir'):
+ self.subdir = a
+ elif o in ('--scons',):
+ self.scons = a
+ elif o in ('--svn', '--subversion'):
+ self.subversion_url = a
+ elif o in ('-v', '--verbose'):
+ self.redirect = tee_to_file
+ self.verbose = True
+ self.svn_co_flag = ''
+
+ if not args and not self.config_file:
+ sys.stderr.write('%s: run: No arguments or -f config file specified.\n' % self.name)
+ sys.stderr.write('%s Type "%s help run" for help.\n' % (self.name_spaces, self.name))
+ sys.exit(1)
+
+ if self.config_file:
+ exec(open(self.config_file, 'r').read(), self.__dict__)
+
+ if args:
+ self.archive_list = args
+
+ archive_file_name = os.path.split(self.archive_list[0])[1]
+
+ if not self.subdir:
+ self.subdir = self.archive_splitext(archive_file_name)[0]
+
+ if not self.prefix:
+ self.prefix = self.archive_splitext(archive_file_name)[0]
+
+ prepare = None
+ if self.subversion_url:
+ prepare = self.prep_subversion_run
+ elif self.aegis_project:
+ prepare = self.prep_aegis_run
+
+ for run_number in run_number_list:
+ self.individual_run(run_number, self.archive_list, prepare)
+
+ def split_run_numbers(self, s):
+ result = []
+ for n in s.split(','):
+ try:
+ x, y = n.split('-')
+ except ValueError:
+ result.append(int(n))
+ else:
+ result.extend(list(range(int(x), int(y)+1)))
+ return result
+
+ def scons_path(self, dir):
+ return os.path.join(dir, 'src', 'script', 'scons.py')
+
+ def scons_lib_dir_path(self, dir):
+ return os.path.join(dir, 'src', 'engine')
+
+ def prep_aegis_run(self, commands, removals):
+ self.aegis_tmpdir = make_temp_file(prefix = self.name + '-aegis-')
+ removals.append((shutil.rmtree, 'rm -rf %%s', self.aegis_tmpdir))
+
+ self.aegis_parent_project = os.path.splitext(self.aegis_project)[0]
+ self.scons = self.scons_path(self.aegis_tmpdir)
+ self.scons_lib_dir = self.scons_lib_dir_path(self.aegis_tmpdir)
+
+ commands.extend([
+ 'mkdir %(aegis_tmpdir)s',
+ (lambda: os.chdir(self.aegis_tmpdir), 'cd %(aegis_tmpdir)s'),
+ '%(aegis)s -cp -ind -p %(aegis_parent_project)s .',
+ '%(aegis)s -cp -ind -p %(aegis_project)s -delta %(run_number)s .',
+ ])
+
+ def prep_subversion_run(self, commands, removals):
+ self.svn_tmpdir = make_temp_file(prefix = self.name + '-svn-')
+ removals.append((shutil.rmtree, 'rm -rf %%s', self.svn_tmpdir))
+
+ self.scons = self.scons_path(self.svn_tmpdir)
+ self.scons_lib_dir = self.scons_lib_dir_path(self.svn_tmpdir)
+
+ commands.extend([
+ 'mkdir %(svn_tmpdir)s',
+ '%(svn)s co %(svn_co_flag)s -r %(run_number)s %(subversion_url)s %(svn_tmpdir)s',
+ ])
+
+ def individual_run(self, run_number, archive_list, prepare=None):
+ """
+ Performs an individual run of the default SCons invocations.
+ """
+
+ commands = []
+ removals = []
+
+ if prepare:
+ prepare(commands, removals)
+
+ save_scons = self.scons
+ save_scons_wrapper = self.scons_wrapper
+ save_scons_lib_dir = self.scons_lib_dir
+
+ if self.outdir is None:
+ self.outdir = self.orig_cwd
+ elif not os.path.isabs(self.outdir):
+ self.outdir = os.path.join(self.orig_cwd, self.outdir)
+
+ if self.scons is None:
+ self.scons = self.scons_path(self.orig_cwd)
+
+ if self.scons_lib_dir is None:
+ self.scons_lib_dir = self.scons_lib_dir_path(self.orig_cwd)
+
+ if self.scons_wrapper is None:
+ self.scons_wrapper = self.scons
+
+ if not run_number:
+ run_number = self.find_next_run_number(self.outdir, self.prefix)
+
+ self.run_number = str(run_number)
+
+ self.prefix_run = self.prefix + '-%03d' % run_number
+
+ if self.targets0 is None:
+ self.targets0 = self.startup_targets
+ if self.targets1 is None:
+ self.targets1 = self.targets
+ if self.targets2 is None:
+ self.targets2 = self.targets
+
+ self.tmpdir = make_temp_file(prefix = self.name + '-')
+
+ commands.extend([
+ 'mkdir %(tmpdir)s',
+
+ (os.chdir, 'cd %%s', self.tmpdir),
+ ])
+
+ for archive in archive_list:
+ if not os.path.isabs(archive):
+ archive = os.path.join(self.orig_cwd, archive)
+ if os.path.isdir(archive):
+ dest = os.path.split(archive)[1]
+ commands.append((shutil.copytree, 'cp -r %%s %%s', archive, dest))
+ else:
+ suffix = self.archive_splitext(archive)[1]
+ unpack_command = self.unpack_map.get(suffix)
+ if not unpack_command:
+ dest = os.path.split(archive)[1]
+ commands.append((shutil.copyfile, 'cp %%s %%s', archive, dest))
+ else:
+ commands.append(unpack_command + (archive,))
+
+ commands.extend([
+ (os.chdir, 'cd %%s', self.subdir),
+ ])
+
+ commands.extend(self.initial_commands)
+
+ commands.extend([
+ (lambda: read_tree('.'),
+ 'find * -type f | xargs cat > /dev/null'),
+
+ (self.set_env, 'export %%s=%%s',
+ 'SCONS_LIB_DIR', self.scons_lib_dir),
+
+ '%(python)s %(scons_wrapper)s --version',
+ ])
+
+ index = 0
+ for run_command in self.run_commands:
+ setattr(self, 'prof%d' % index, self.profile_name(index))
+ c = (
+ self.log_execute,
+ self.log_display,
+ run_command,
+ self.logfile_name(index),
+ )
+ commands.append(c)
+ index = index + 1
+
+ commands.extend([
+ (os.chdir, 'cd %%s', self.orig_cwd),
+ ])
+
+ if not os.environ.get('PRESERVE'):
+ commands.extend(removals)
+
+ commands.append((shutil.rmtree, 'rm -rf %%s', self.tmpdir))
+
+ self.run_command_list(commands, self.__dict__)
+
+ self.scons = save_scons
+ self.scons_lib_dir = save_scons_lib_dir
+ self.scons_wrapper = save_scons_wrapper
+
+ #
+
+ def help_time(self):
+ help = """\
+ Usage: scons-time time [OPTIONS] FILE [...]
+
+ -C DIR, --chdir=DIR Change to DIR before looking for files
+ -f FILE, --file=FILE Read configuration from specified FILE
+ --fmt=FORMAT, --format=FORMAT Print data in specified FORMAT
+ -h, --help Print this help and exit
+ -p STRING, --prefix=STRING Use STRING as log file/profile prefix
+ -t NUMBER, --tail=NUMBER Only report the last NUMBER files
+ --which=TIMER Plot timings for TIMER: total,
+ SConscripts, SCons, commands.
+ """
+ sys.stdout.write(self.outdent(help))
+ sys.stdout.flush()
+
+ def do_time(self, argv):
+
+ format = 'ascii'
+ logfile_path = lambda x: x
+ tail = None
+ which = 'total'
+
+ short_opts = '?C:f:hp:t:'
+
+ long_opts = [
+ 'chdir=',
+ 'file=',
+ 'fmt=',
+ 'format=',
+ 'help',
+ 'prefix=',
+ 'tail=',
+ 'title=',
+ 'which=',
+ ]
+
+ opts, args = getopt.getopt(argv[1:], short_opts, long_opts)
+
+ for o, a in opts:
+ if o in ('-C', '--chdir'):
+ self.chdir = a
+ elif o in ('-f', '--file'):
+ self.config_file = a
+ elif o in ('--fmt', '--format'):
+ format = a
+ elif o in ('-?', '-h', '--help'):
+ self.do_help(['help', 'time'])
+ sys.exit(0)
+ elif o in ('-p', '--prefix'):
+ self.prefix = a
+ elif o in ('-t', '--tail'):
+ tail = int(a)
+ elif o in ('--title',):
+ self.title = a
+ elif o in ('--which',):
+ if not a in list(self.time_strings.keys()):
+ sys.stderr.write('%s: time: Unrecognized timer "%s".\n' % (self.name, a))
+ sys.stderr.write('%s Type "%s help time" for help.\n' % (self.name_spaces, self.name))
+ sys.exit(1)
+ which = a
+
+ if self.config_file:
+ HACK_for_exec(open(self.config_file, 'r').read(), self.__dict__)
+
+ if self.chdir:
+ os.chdir(self.chdir)
+ logfile_path = lambda x: os.path.join(self.chdir, x)
+
+ if not args:
+
+ pattern = '%s*.log' % self.prefix
+ args = self.args_to_files([pattern], tail)
+
+ if not args:
+ if self.chdir:
+ directory = self.chdir
+ else:
+ directory = os.getcwd()
+
+ sys.stderr.write('%s: time: No arguments specified.\n' % self.name)
+ sys.stderr.write('%s No %s*.log files found in "%s".\n' % (self.name_spaces, self.prefix, directory))
+ sys.stderr.write('%s Type "%s help time" for help.\n' % (self.name_spaces, self.name))
+ sys.exit(1)
+
+ else:
+
+ args = self.args_to_files(args, tail)
+
+ cwd_ = os.getcwd() + os.sep
+
+ if format == 'ascii':
+
+ columns = ("Total", "SConscripts", "SCons", "commands")
+ self.ascii_table(args, columns, self.get_debug_times, logfile_path)
+
+ elif format == 'gnuplot':
+
+ results = self.collect_results(args, self.get_debug_times,
+ self.time_strings[which])
+
+ self.gnuplot_results(results, fmt='%s %.6f')
+
+ else:
+
+ sys.stderr.write('%s: time: Unknown format "%s".\n' % (self.name, format))
+ sys.exit(1)
+
+if __name__ == '__main__':
+ opts, args = getopt.getopt(sys.argv[1:], 'h?V', ['help', 'version'])
+
+ ST = SConsTimer()
+
+ for o, a in opts:
+ if o in ('-?', '-h', '--help'):
+ ST.do_help(['help'])
+ sys.exit(0)
+ elif o in ('-V', '--version'):
+ sys.stdout.write('scons-time version\n')
+ sys.exit(0)
+
+ if not args:
+ sys.stderr.write('Type "%s help" for usage.\n' % ST.name)
+ sys.exit(1)
+
+ ST.execute_subcommand(args)
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/script/scons.bat b/3rdParty/SCons/scons-3.0.1/script/scons.bat
new file mode 100644
index 0000000..fddeca4
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/script/scons.bat
@@ -0,0 +1,34 @@
+@REM __COPYRIGHT__
+@REM __FILE__ __REVISION__ __DATE__ __DEVELOPER__
+@echo off
+set SCONS_ERRORLEVEL=
+if "%OS%" == "Windows_NT" goto WinNT
+
+@REM for 9x/Me you better not have more than 9 args
+python -c "from os.path import join; import sys; sys.path = [ join(sys.prefix, 'Lib', 'site-packages', 'scons-__VERSION__'), join(sys.prefix, 'Lib', 'site-packages', 'scons'), join(sys.prefix, 'scons-__VERSION__'), join(sys.prefix, 'scons')] + sys.path; import SCons.Script; SCons.Script.main()" %1 %2 %3 %4 %5 %6 %7 %8 %9
+@REM no way to set exit status of this script for 9x/Me
+goto endscons
+
+@REM Credit where credit is due: we return the exit code despite our
+@REM use of setlocal+endlocal using a technique from Bear's Journal:
+@REM http://code-bear.com/bearlog/2007/06/01/getting-the-exit-code-from-a-batch-file-that-is-run-from-a-python-program/
+
+:WinNT
+setlocal
+@REM ensure the script will be executed with the Python it was installed for
+set path=%~dp0;%~dp0..;%path%
+@REM try the script named as the .bat file in current dir, then in Scripts subdir
+set scriptname=%~dp0%~n0.py
+if not exist "%scriptname%" set scriptname=%~dp0Scripts\%~n0.py
+python "%scriptname%" %*
+endlocal & set SCONS_ERRORLEVEL=%ERRORLEVEL%
+
+if NOT "%COMSPEC%" == "%SystemRoot%\system32\cmd.exe" goto returncode
+if errorlevel 9009 echo you do not have python in your PATH
+goto endscons
+
+:returncode
+exit /B %SCONS_ERRORLEVEL%
+
+:endscons
+call :returncode %SCONS_ERRORLEVEL%
diff --git a/3rdParty/SCons/scons-3.0.1/script/scons.py b/3rdParty/SCons/scons-3.0.1/script/scons.py
new file mode 100644
index 0000000..f2a44f8
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/script/scons.py
@@ -0,0 +1,207 @@
+#! /usr/bin/env python
+#
+# SCons - a Software Constructor
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+from __future__ import print_function
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+__version__ = "__VERSION__"
+
+__build__ = "__BUILD__"
+
+__buildsys__ = "__BUILDSYS__"
+
+__date__ = "__DATE__"
+
+__developer__ = "__DEVELOPER__"
+
+import os
+import sys
+
+
+##############################################################################
+# BEGIN STANDARD SCons SCRIPT HEADER
+#
+# This is the cut-and-paste logic so that a self-contained script can
+# interoperate correctly with different SCons versions and installation
+# locations for the engine. If you modify anything in this section, you
+# should also change other scripts that use this same header.
+##############################################################################
+
+# Strip the script directory from sys.path() so on case-insensitive
+# (WIN32) systems Python doesn't think that the "scons" script is the
+# "SCons" package. Replace it with our own library directories
+# (version-specific first, in case they installed by hand there,
+# followed by generic) so we pick up the right version of the build
+# engine modules if they're in either directory.
+
+
+if (3,0,0) < sys.version_info < (3,5,0) or sys.version_info < (2,7,0):
+ msg = "scons: *** SCons version %s does not run under Python version %s.\n\
+Python < 3.5 is not yet supported.\n"
+ sys.stderr.write(msg % (__version__, sys.version.split()[0]))
+ sys.exit(1)
+
+
+script_dir = os.path.dirname(os.path.realpath(__file__))
+
+if script_dir in sys.path:
+ sys.path.remove(script_dir)
+
+libs = []
+
+if "SCONS_LIB_DIR" in os.environ:
+ libs.append(os.environ["SCONS_LIB_DIR"])
+
+# - running from source takes priority (since 2.3.2), excluding SCONS_LIB_DIR settings
+script_path = os.path.abspath(os.path.dirname(__file__))
+source_path = os.path.join(script_path, '..', 'engine')
+libs.append(source_path)
+
+local_version = 'scons-local-' + __version__
+local = 'scons-local'
+if script_dir:
+ local_version = os.path.join(script_dir, local_version)
+ local = os.path.join(script_dir, local)
+libs.append(os.path.abspath(local_version))
+libs.append(os.path.abspath(local))
+
+scons_version = 'scons-%s' % __version__
+
+# preferred order of scons lookup paths
+prefs = []
+
+
+# - running from egg check
+try:
+ import pkg_resources
+except ImportError:
+ pass
+else:
+ # when running from an egg add the egg's directory
+ try:
+ d = pkg_resources.get_distribution('scons')
+ except pkg_resources.DistributionNotFound:
+ pass
+ else:
+ prefs.append(d.location)
+
+if sys.platform == 'win32':
+ # sys.prefix is (likely) C:\Python*;
+ # check only C:\Python*.
+ prefs.append(sys.prefix)
+ prefs.append(os.path.join(sys.prefix, 'Lib', 'site-packages'))
+else:
+ # On other (POSIX) platforms, things are more complicated due to
+ # the variety of path names and library locations. Try to be smart
+ # about it.
+ if script_dir == 'bin':
+ # script_dir is `pwd`/bin;
+ # check `pwd`/lib/scons*.
+ prefs.append(os.getcwd())
+ else:
+ if script_dir == '.' or script_dir == '':
+ script_dir = os.getcwd()
+ head, tail = os.path.split(script_dir)
+ if tail == "bin":
+ # script_dir is /foo/bin;
+ # check /foo/lib/scons*.
+ prefs.append(head)
+
+ head, tail = os.path.split(sys.prefix)
+ if tail == "usr":
+ # sys.prefix is /foo/usr;
+ # check /foo/usr/lib/scons* first,
+ # then /foo/usr/local/lib/scons*.
+ prefs.append(sys.prefix)
+ prefs.append(os.path.join(sys.prefix, "local"))
+ elif tail == "local":
+ h, t = os.path.split(head)
+ if t == "usr":
+ # sys.prefix is /foo/usr/local;
+ # check /foo/usr/local/lib/scons* first,
+ # then /foo/usr/lib/scons*.
+ prefs.append(sys.prefix)
+ prefs.append(head)
+ else:
+ # sys.prefix is /foo/local;
+ # check only /foo/local/lib/scons*.
+ prefs.append(sys.prefix)
+ else:
+ # sys.prefix is /foo (ends in neither /usr or /local);
+ # check only /foo/lib/scons*.
+ prefs.append(sys.prefix)
+
+ temp = [os.path.join(x, 'lib') for x in prefs]
+ temp.extend([os.path.join(x,
+ 'lib',
+ 'python' + sys.version[:3],
+ 'site-packages') for x in prefs])
+ prefs = temp
+
+ # Add the parent directory of the current python's library to the
+ # preferences. On SuSE-91/AMD64, for example, this is /usr/lib64,
+ # not /usr/lib.
+ try:
+ libpath = os.__file__
+ except AttributeError:
+ pass
+ else:
+ # Split /usr/libfoo/python*/os.py to /usr/libfoo/python*.
+ libpath, tail = os.path.split(libpath)
+ # Split /usr/libfoo/python* to /usr/libfoo
+ libpath, tail = os.path.split(libpath)
+ # Check /usr/libfoo/scons*.
+ prefs.append(libpath)
+
+# Look first for 'scons-__version__' in all of our preference libs,
+# then for 'scons'.
+libs.extend([os.path.join(x, scons_version) for x in prefs])
+libs.extend([os.path.join(x, 'scons') for x in prefs])
+
+sys.path = libs + sys.path
+
+##############################################################################
+# END STANDARD SCons SCRIPT HEADER
+##############################################################################
+
+if __name__ == "__main__":
+ try:
+ import SCons.Script
+ except ImportError:
+ print("SCons import failed. Unable to find engine files in:")
+ for path in libs:
+ print(" {}".format(path))
+ raise
+
+ # this does all the work, and calls sys.exit
+ # with the proper exit status when done.
+ SCons.Script.main()
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/script/sconsign.py b/3rdParty/SCons/scons-3.0.1/script/sconsign.py
new file mode 100644
index 0000000..e7bc271
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/script/sconsign.py
@@ -0,0 +1,557 @@
+#! /usr/bin/env python
+#
+# SCons - a Software Constructor
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+from __future__ import print_function
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+__version__ = "__VERSION__"
+
+__build__ = "__BUILD__"
+
+__buildsys__ = "__BUILDSYS__"
+
+__date__ = "__DATE__"
+
+__developer__ = "__DEVELOPER__"
+
+import os
+import sys
+
+##############################################################################
+# BEGIN STANDARD SCons SCRIPT HEADER
+#
+# This is the cut-and-paste logic so that a self-contained script can
+# interoperate correctly with different SCons versions and installation
+# locations for the engine. If you modify anything in this section, you
+# should also change other scripts that use this same header.
+##############################################################################
+
+# Strip the script directory from sys.path() so on case-insensitive
+# (WIN32) systems Python doesn't think that the "scons" script is the
+# "SCons" package. Replace it with our own library directories
+# (version-specific first, in case they installed by hand there,
+# followed by generic) so we pick up the right version of the build
+# engine modules if they're in either directory.
+
+
+script_dir = os.path.dirname(os.path.realpath(__file__))
+
+if script_dir in sys.path:
+ sys.path.remove(script_dir)
+
+libs = []
+
+if "SCONS_LIB_DIR" in os.environ:
+ libs.append(os.environ["SCONS_LIB_DIR"])
+
+# - running from source takes priority (since 2.3.2), excluding SCONS_LIB_DIR settings
+script_path = os.path.abspath(os.path.dirname(__file__))
+source_path = os.path.join(script_path, '..', 'engine')
+libs.append(source_path)
+
+local_version = 'scons-local-' + __version__
+local = 'scons-local'
+if script_dir:
+ local_version = os.path.join(script_dir, local_version)
+ local = os.path.join(script_dir, local)
+libs.append(os.path.abspath(local_version))
+libs.append(os.path.abspath(local))
+
+scons_version = 'scons-%s' % __version__
+
+# preferred order of scons lookup paths
+prefs = []
+
+try:
+ import pkg_resources
+except ImportError:
+ pass
+else:
+ # when running from an egg add the egg's directory
+ try:
+ d = pkg_resources.get_distribution('scons')
+ except pkg_resources.DistributionNotFound:
+ pass
+ else:
+ prefs.append(d.location)
+
+if sys.platform == 'win32':
+ # sys.prefix is (likely) C:\Python*;
+ # check only C:\Python*.
+ prefs.append(sys.prefix)
+ prefs.append(os.path.join(sys.prefix, 'Lib', 'site-packages'))
+else:
+ # On other (POSIX) platforms, things are more complicated due to
+ # the variety of path names and library locations. Try to be smart
+ # about it.
+ if script_dir == 'bin':
+ # script_dir is `pwd`/bin;
+ # check `pwd`/lib/scons*.
+ prefs.append(os.getcwd())
+ else:
+ if script_dir == '.' or script_dir == '':
+ script_dir = os.getcwd()
+ head, tail = os.path.split(script_dir)
+ if tail == "bin":
+ # script_dir is /foo/bin;
+ # check /foo/lib/scons*.
+ prefs.append(head)
+
+ head, tail = os.path.split(sys.prefix)
+ if tail == "usr":
+ # sys.prefix is /foo/usr;
+ # check /foo/usr/lib/scons* first,
+ # then /foo/usr/local/lib/scons*.
+ prefs.append(sys.prefix)
+ prefs.append(os.path.join(sys.prefix, "local"))
+ elif tail == "local":
+ h, t = os.path.split(head)
+ if t == "usr":
+ # sys.prefix is /foo/usr/local;
+ # check /foo/usr/local/lib/scons* first,
+ # then /foo/usr/lib/scons*.
+ prefs.append(sys.prefix)
+ prefs.append(head)
+ else:
+ # sys.prefix is /foo/local;
+ # check only /foo/local/lib/scons*.
+ prefs.append(sys.prefix)
+ else:
+ # sys.prefix is /foo (ends in neither /usr or /local);
+ # check only /foo/lib/scons*.
+ prefs.append(sys.prefix)
+
+ temp = [os.path.join(x, 'lib') for x in prefs]
+ temp.extend([os.path.join(x,
+ 'lib',
+ 'python' + sys.version[:3],
+ 'site-packages') for x in prefs])
+ prefs = temp
+
+ # Add the parent directory of the current python's library to the
+ # preferences. On SuSE-91/AMD64, for example, this is /usr/lib64,
+ # not /usr/lib.
+ try:
+ libpath = os.__file__
+ except AttributeError:
+ pass
+ else:
+ # Split /usr/libfoo/python*/os.py to /usr/libfoo/python*.
+ libpath, tail = os.path.split(libpath)
+ # Split /usr/libfoo/python* to /usr/libfoo
+ libpath, tail = os.path.split(libpath)
+ # Check /usr/libfoo/scons*.
+ prefs.append(libpath)
+
+# Look first for 'scons-__version__' in all of our preference libs,
+# then for 'scons'.
+libs.extend([os.path.join(x, scons_version) for x in prefs])
+libs.extend([os.path.join(x, 'scons') for x in prefs])
+
+sys.path = libs + sys.path
+
+##############################################################################
+# END STANDARD SCons SCRIPT HEADER
+##############################################################################
+
+import SCons.compat
+
+try:
+ import whichdb
+ whichdb = whichdb.whichdb
+except ImportError as e:
+ from dbm import whichdb
+
+import time
+import pickle
+import imp
+
+import SCons.SConsign
+
+def my_whichdb(filename):
+ if filename[-7:] == ".dblite":
+ return "SCons.dblite"
+ try:
+ f = open(filename + ".dblite", "rb")
+ f.close()
+ return "SCons.dblite"
+ except IOError:
+ pass
+ return _orig_whichdb(filename)
+
+
+# Should work on python2
+_orig_whichdb = whichdb
+whichdb = my_whichdb
+
+# was changed for python3
+#_orig_whichdb = whichdb.whichdb
+#dbm.whichdb = my_whichdb
+
+def my_import(mname):
+ if '.' in mname:
+ i = mname.rfind('.')
+ parent = my_import(mname[:i])
+ fp, pathname, description = imp.find_module(mname[i+1:],
+ parent.__path__)
+ else:
+ fp, pathname, description = imp.find_module(mname)
+ return imp.load_module(mname, fp, pathname, description)
+
+class Flagger(object):
+ default_value = 1
+ def __setitem__(self, item, value):
+ self.__dict__[item] = value
+ self.default_value = 0
+ def __getitem__(self, item):
+ return self.__dict__.get(item, self.default_value)
+
+Do_Call = None
+Print_Directories = []
+Print_Entries = []
+Print_Flags = Flagger()
+Verbose = 0
+Readable = 0
+
+def default_mapper(entry, name):
+ try:
+ val = eval("entry."+name)
+ except:
+ val = None
+ if sys.version_info.major >= 3 and isinstance(val, bytes):
+ # This is a dirty hack for py 2/3 compatibility. csig is a bytes object
+ # in Python3 while Python2 bytes are str. Hence, we decode the csig to a
+ # Python3 string
+ val = val.decode()
+ return str(val)
+
+def map_action(entry, name):
+ try:
+ bact = entry.bact
+ bactsig = entry.bactsig
+ except AttributeError:
+ return None
+ return '%s [%s]' % (bactsig, bact)
+
+def map_timestamp(entry, name):
+ try:
+ timestamp = entry.timestamp
+ except AttributeError:
+ timestamp = None
+ if Readable and timestamp:
+ return "'" + time.ctime(timestamp) + "'"
+ else:
+ return str(timestamp)
+
+def map_bkids(entry, name):
+ try:
+ bkids = entry.bsources + entry.bdepends + entry.bimplicit
+ bkidsigs = entry.bsourcesigs + entry.bdependsigs + entry.bimplicitsigs
+ except AttributeError:
+ return None
+ result = []
+ for i in range(len(bkids)):
+ result.append(nodeinfo_string(bkids[i], bkidsigs[i], " "))
+ if result == []:
+ return None
+ return "\n ".join(result)
+
+map_field = {
+ 'action' : map_action,
+ 'timestamp' : map_timestamp,
+ 'bkids' : map_bkids,
+}
+
+map_name = {
+ 'implicit' : 'bkids',
+}
+
+def field(name, entry, verbose=Verbose):
+ if not Print_Flags[name]:
+ return None
+ fieldname = map_name.get(name, name)
+ mapper = map_field.get(fieldname, default_mapper)
+ val = mapper(entry, name)
+ if verbose:
+ val = name + ": " + val
+ return val
+
+def nodeinfo_raw(name, ninfo, prefix=""):
+ # This just formats the dictionary, which we would normally use str()
+ # to do, except that we want the keys sorted for deterministic output.
+ d = ninfo.__getstate__()
+ try:
+ keys = ninfo.field_list + ['_version_id']
+ except AttributeError:
+ keys = sorted(d.keys())
+ l = []
+ for k in keys:
+ l.append('%s: %s' % (repr(k), repr(d.get(k))))
+ if '\n' in name:
+ name = repr(name)
+ return name + ': {' + ', '.join(l) + '}'
+
+def nodeinfo_cooked(name, ninfo, prefix=""):
+ try:
+ field_list = ninfo.field_list
+ except AttributeError:
+ field_list = []
+ if '\n' in name:
+ name = repr(name)
+ outlist = [name+':'] + [_f for _f in [field(x, ninfo, Verbose) for x in field_list] if _f]
+ if Verbose:
+ sep = '\n ' + prefix
+ else:
+ sep = ' '
+ return sep.join(outlist)
+
+nodeinfo_string = nodeinfo_cooked
+
+def printfield(name, entry, prefix=""):
+ outlist = field("implicit", entry, 0)
+ if outlist:
+ if Verbose:
+ print(" implicit:")
+ print(" " + outlist)
+ outact = field("action", entry, 0)
+ if outact:
+ if Verbose:
+ print(" action: " + outact)
+ else:
+ print(" " + outact)
+
+def printentries(entries, location):
+ if Print_Entries:
+ for name in Print_Entries:
+ try:
+ entry = entries[name]
+ except KeyError:
+ sys.stderr.write("sconsign: no entry `%s' in `%s'\n" % (name, location))
+ else:
+ try:
+ ninfo = entry.ninfo
+ except AttributeError:
+ print(name + ":")
+ else:
+ print(nodeinfo_string(name, entry.ninfo))
+ printfield(name, entry.binfo)
+ else:
+ for name in sorted(entries.keys()):
+ entry = entries[name]
+ try:
+ ninfo = entry.ninfo
+ except AttributeError:
+ print(name + ":")
+ else:
+ print(nodeinfo_string(name, entry.ninfo))
+ printfield(name, entry.binfo)
+
+class Do_SConsignDB(object):
+ def __init__(self, dbm_name, dbm):
+ self.dbm_name = dbm_name
+ self.dbm = dbm
+
+ def __call__(self, fname):
+ # The *dbm modules stick their own file suffixes on the names
+ # that are passed in. This is causes us to jump through some
+ # hoops here to be able to allow the user
+ try:
+ # Try opening the specified file name. Example:
+ # SPECIFIED OPENED BY self.dbm.open()
+ # --------- -------------------------
+ # .sconsign => .sconsign.dblite
+ # .sconsign.dblite => .sconsign.dblite.dblite
+ db = self.dbm.open(fname, "r")
+ except (IOError, OSError) as e:
+ print_e = e
+ try:
+ # That didn't work, so try opening the base name,
+ # so that if the actually passed in 'sconsign.dblite'
+ # (for example), the dbm module will put the suffix back
+ # on for us and open it anyway.
+ db = self.dbm.open(os.path.splitext(fname)[0], "r")
+ except (IOError, OSError):
+ # That didn't work either. See if the file name
+ # they specified just exists (independent of the dbm
+ # suffix-mangling).
+ try:
+ open(fname, "r")
+ except (IOError, OSError) as e:
+ # Nope, that file doesn't even exist, so report that
+ # fact back.
+ print_e = e
+ sys.stderr.write("sconsign: %s\n" % (print_e))
+ return
+ except KeyboardInterrupt:
+ raise
+ except pickle.UnpicklingError:
+ sys.stderr.write("sconsign: ignoring invalid `%s' file `%s'\n" % (self.dbm_name, fname))
+ return
+ except Exception as e:
+ sys.stderr.write("sconsign: ignoring invalid `%s' file `%s': %s\n" % (self.dbm_name, fname, e))
+ return
+
+ if Print_Directories:
+ for dir in Print_Directories:
+ try:
+ val = db[dir]
+ except KeyError:
+ sys.stderr.write("sconsign: no dir `%s' in `%s'\n" % (dir, args[0]))
+ else:
+ self.printentries(dir, val)
+ else:
+ for dir in sorted(db.keys()):
+ self.printentries(dir, db[dir])
+
+ def printentries(self, dir, val):
+ print('=== ' + dir + ':')
+ printentries(pickle.loads(val), dir)
+
+def Do_SConsignDir(name):
+ try:
+ fp = open(name, 'rb')
+ except (IOError, OSError) as e:
+ sys.stderr.write("sconsign: %s\n" % (e))
+ return
+ try:
+ sconsign = SCons.SConsign.Dir(fp)
+ except KeyboardInterrupt:
+ raise
+ except pickle.UnpicklingError:
+ sys.stderr.write("sconsign: ignoring invalid .sconsign file `%s'\n" % (name))
+ return
+ except Exception as e:
+ sys.stderr.write("sconsign: ignoring invalid .sconsign file `%s': %s\n" % (name, e))
+ return
+ printentries(sconsign.entries, args[0])
+
+##############################################################################
+
+import getopt
+
+helpstr = """\
+Usage: sconsign [OPTIONS] FILE [...]
+Options:
+ -a, --act, --action Print build action information.
+ -c, --csig Print content signature information.
+ -d DIR, --dir=DIR Print only info about DIR.
+ -e ENTRY, --entry=ENTRY Print only info about ENTRY.
+ -f FORMAT, --format=FORMAT FILE is in the specified FORMAT.
+ -h, --help Print this message and exit.
+ -i, --implicit Print implicit dependency information.
+ -r, --readable Print timestamps in human-readable form.
+ --raw Print raw Python object representations.
+ -s, --size Print file sizes.
+ -t, --timestamp Print timestamp information.
+ -v, --verbose Verbose, describe each field.
+"""
+
+opts, args = getopt.getopt(sys.argv[1:], "acd:e:f:hirstv",
+ ['act', 'action',
+ 'csig', 'dir=', 'entry=',
+ 'format=', 'help', 'implicit',
+ 'raw', 'readable',
+ 'size', 'timestamp', 'verbose'])
+
+
+for o, a in opts:
+ if o in ('-a', '--act', '--action'):
+ Print_Flags['action'] = 1
+ elif o in ('-c', '--csig'):
+ Print_Flags['csig'] = 1
+ elif o in ('-d', '--dir'):
+ Print_Directories.append(a)
+ elif o in ('-e', '--entry'):
+ Print_Entries.append(a)
+ elif o in ('-f', '--format'):
+ # Try to map the given DB format to a known module
+ # name, that we can then try to import...
+ Module_Map = {'dblite' : 'SCons.dblite',
+ 'sconsign' : None}
+ dbm_name = Module_Map.get(a, a)
+ if dbm_name:
+ try:
+ if dbm_name != "SCons.dblite":
+ dbm = my_import(dbm_name)
+ else:
+ import SCons.dblite
+ dbm = SCons.dblite
+ # Ensure that we don't ignore corrupt DB files,
+ # this was handled by calling my_import('SCons.dblite')
+ # again in earlier versions...
+ SCons.dblite.ignore_corrupt_dbfiles = 0
+ except:
+ sys.stderr.write("sconsign: illegal file format `%s'\n" % a)
+ print(helpstr)
+ sys.exit(2)
+ Do_Call = Do_SConsignDB(a, dbm)
+ else:
+ Do_Call = Do_SConsignDir
+ elif o in ('-h', '--help'):
+ print(helpstr)
+ sys.exit(0)
+ elif o in ('-i', '--implicit'):
+ Print_Flags['implicit'] = 1
+ elif o in ('--raw',):
+ nodeinfo_string = nodeinfo_raw
+ elif o in ('-r', '--readable'):
+ Readable = 1
+ elif o in ('-s', '--size'):
+ Print_Flags['size'] = 1
+ elif o in ('-t', '--timestamp'):
+ Print_Flags['timestamp'] = 1
+ elif o in ('-v', '--verbose'):
+ Verbose = 1
+
+
+if Do_Call:
+ for a in args:
+ Do_Call(a)
+else:
+ for a in args:
+ dbm_name = whichdb(a)
+ if dbm_name:
+ Map_Module = {'SCons.dblite' : 'dblite'}
+ if dbm_name != "SCons.dblite":
+ dbm = my_import(dbm_name)
+ else:
+ import SCons.dblite
+ dbm = SCons.dblite
+ # Ensure that we don't ignore corrupt DB files,
+ # this was handled by calling my_import('SCons.dblite')
+ # again in earlier versions...
+ SCons.dblite.ignore_corrupt_dbfiles = 0
+ Do_SConsignDB(Map_Module.get(dbm_name, dbm_name), dbm)(a)
+ else:
+ Do_SConsignDir(a)
+
+sys.exit(0)
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/setup.cfg b/3rdParty/SCons/scons-3.0.1/setup.cfg
new file mode 100644
index 0000000..bda7571
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/setup.cfg
@@ -0,0 +1,8 @@
+[bdist_rpm]
+group = Development/Tools
+
+[bdist_wininst]
+title = SCons - a software construction tool
+
+[bdist_wheel]
+universal=1
diff --git a/3rdParty/SCons/scons-3.0.1/setup.py b/3rdParty/SCons/scons-3.0.1/setup.py
new file mode 100644
index 0000000..100e367
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/setup.py
@@ -0,0 +1,518 @@
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+"""
+NOTE: Installed SCons is not importable like usual Python packages. It is
+ executed explicitly with command line scripts. This allows multiple
+ SCons versions to coexist within single Python installation, which
+ is critical for enterprise build cases. Explicit invokation is
+ necessary to avoid confusion over which version of SCons is active.
+
+ By default SCons is installed into versioned directory, e.g.
+ site-packages/scons-2.1.0.alpha.20101125 and much of the stuff
+ below is dedicated to make it happen on various platforms.
+"""
+
+from __future__ import print_function
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import os
+import stat
+import sys
+
+Version = "__VERSION__"
+
+man_pages = [
+ 'scons.1',
+ 'sconsign.1',
+ 'scons-time.1',
+]
+
+# change to setup.py directory if it was executed from other dir
+(head, tail) = os.path.split(sys.argv[0])
+if head:
+ os.chdir(head)
+ sys.argv[0] = tail
+
+# flag if setup.py is run on win32 or _for_ win32 platform,
+# (when building windows installer on linux, for example)
+is_win32 = 0
+if not sys.platform == 'win32':
+ try:
+ if sys.argv[1] == 'bdist_wininst':
+ is_win32 = 1
+ except IndexError:
+ pass
+else:
+ is_win32 = 1
+
+import distutils
+import distutils.core
+import distutils.command.install
+import distutils.command.install_data
+import distutils.command.install_lib
+import distutils.command.install_scripts
+import distutils.command.build_scripts
+import distutils.msvccompiler
+
+
+_install = distutils.command.install.install
+_install_data = distutils.command.install_data.install_data
+_install_lib = distutils.command.install_lib.install_lib
+_install_scripts = distutils.command.install_scripts.install_scripts
+_build_scripts = distutils.command.build_scripts.build_scripts
+
+
+class _options(object):
+ pass
+
+
+Options = _options()
+
+Installed = []
+
+
+def set_explicitly(name, args):
+ """
+ Return if the installation directory was set explicitly by the
+ user on the command line. This is complicated by the fact that
+ "install --install-lib=/foo" gets turned into "install_lib
+ --install-dir=/foo" internally.
+ """
+ if args[0] == "install_" + name:
+ s = "--install-dir="
+ else:
+ # The command is something else (usually "install")
+ s = "--install-%s=" % name
+ set = 0
+ length = len(s)
+ for a in args[1:]:
+ if a[:length] == s:
+ set = 1
+ break
+ return set
+
+
+class install(_install):
+ user_options = _install.user_options + [
+ ('no-scons-script', None,
+ "don't install 'scons', only install 'scons-%s'" % Version),
+ ('no-version-script', None,
+ "don't install 'scons-%s', only install 'scons'" % Version),
+ ('install-bat', None,
+ "install 'scons.bat' script"),
+ ('no-install-bat', None,
+ "do not install 'scons.bat' script"),
+ ('install-man', None,
+ "install SCons man pages"),
+ ('no-install-man', None,
+ "do not install SCons man pages"),
+ ('standard-lib', None,
+ "install SCons library in standard Python location"),
+ ('standalone-lib', None,
+ "install SCons library in separate standalone directory"),
+ ('version-lib', None,
+ "install SCons library in version-numbered directory"),
+ ]
+ boolean_options = _install.boolean_options + [
+ 'no-scons-script',
+ 'no-version-script',
+ 'install-bat',
+ 'no-install-bat',
+ 'install-man',
+ 'no-install-man',
+ 'standard-lib',
+ 'standalone-lib',
+ 'version-lib'
+ ]
+
+ if hasattr(os, 'link'):
+ user_options.append(
+ ('hardlink-scons', None,
+ "hard link 'scons' to the version-numbered script, don't make a separate 'scons' copy"),
+ )
+ boolean_options.append('hardlink-script')
+
+ if hasattr(os, 'symlink'):
+ user_options.append(
+ ('symlink-scons', None,
+ "make 'scons' a symbolic link to the version-numbered script, don't make a separate 'scons' copy"),
+ )
+ boolean_options.append('symlink-script')
+
+ def initialize_options(self):
+ _install.initialize_options(self)
+ self.no_scons_script = 0
+ self.no_version_script = 0
+ self.install_bat = 0
+ self.no_install_bat = not is_win32
+ self.install_man = 0
+ self.no_install_man = is_win32
+ self.standard_lib = 0
+ self.standalone_lib = 0
+ self.version_lib = 0
+ self.hardlink_scons = 0
+ self.symlink_scons = 0
+ # Don't warn about having to put the library directory in the
+ # search path.
+ self.warn_dir = 0
+
+ def finalize_options(self):
+ _install.finalize_options(self)
+ if self.install_bat:
+ Options.install_bat = 1
+ else:
+ Options.install_bat = not self.no_install_bat
+ if self.install_man:
+ Options.install_man = 1
+ else:
+ Options.install_man = not self.no_install_man
+ Options.standard_lib = self.standard_lib
+ Options.standalone_lib = self.standalone_lib
+ Options.version_lib = self.version_lib
+ Options.install_scons_script = not self.no_scons_script
+ Options.install_version_script = not self.no_version_script
+ Options.hardlink_scons = self.hardlink_scons
+ Options.symlink_scons = self.symlink_scons
+
+
+def get_scons_prefix(libdir, is_win32):
+ """
+ Return the right prefix for SCons library installation. Find
+ this by starting with the library installation directory
+ (.../site-packages, most likely) and crawling back up until we reach
+ a directory name beginning with "python" (or "Python").
+ """
+ drive, head = os.path.splitdrive(libdir)
+ while head:
+ if head == os.sep:
+ break
+ head, tail = os.path.split(head)
+ if tail.lower()[:6] == "python":
+ # Found the Python library directory...
+ if is_win32:
+ # ...on Win32 systems, "scons" goes in the directory:
+ # C:\PythonXX => C:\PythonXX\scons
+ return os.path.join(drive + head, tail)
+ else:
+ # ...on other systems, "scons" goes above the directory:
+ # /usr/lib/pythonX.X => /usr/lib/scons
+ return os.path.join(drive + head)
+ return libdir
+
+
+def force_to_usr_local(self):
+ """
+ A hack to decide if we need to "force" the installation directories
+ to be under /usr/local. This is because Mac Os X Tiger and
+ Leopard, by default, put the libraries and scripts in their own
+ directories under /Library or /System/Library.
+ """
+ return (sys.platform[:6] == 'darwin' and
+ (self.install_dir[:9] == '/Library/' or
+ self.install_dir[:16] == '/System/Library/'))
+
+
+class install_lib(_install_lib):
+ def finalize_options(self):
+ _install_lib.finalize_options(self)
+ if force_to_usr_local(self):
+ self.install_dir = '/usr/local/lib'
+ args = self.distribution.script_args
+ if not set_explicitly("lib", args):
+ # They didn't explicitly specify the installation
+ # directory for libraries...
+ is_win32 = sys.platform == "win32" or args[0] == 'bdist_wininst'
+ prefix = get_scons_prefix(self.install_dir, is_win32)
+ if Options.standalone_lib:
+ # ...but they asked for a standalone directory.
+ self.install_dir = os.path.join(prefix, "scons")
+ elif Options.version_lib or not Options.standard_lib:
+ # ...they asked for a version-specific directory,
+ # or they get it by default.
+ self.install_dir = os.path.join(prefix, "scons-%s" % Version)
+
+ msg = "Installed SCons library modules into %s" % self.install_dir
+ Installed.append(msg)
+
+
+class install_scripts(_install_scripts):
+ def finalize_options(self):
+ _install_scripts.finalize_options(self)
+ if force_to_usr_local(self):
+ self.install_dir = '/usr/local/bin'
+ self.build_dir = os.path.join('build', 'scripts')
+ msg = "Installed SCons scripts into %s" % self.install_dir
+ Installed.append(msg)
+
+ def do_nothing(self, *args, **kw):
+ pass
+
+ def hardlink_scons(self, src, dst, ver):
+ try:
+ os.unlink(dst)
+ except OSError:
+ pass
+ os.link(ver, dst)
+
+ def symlink_scons(self, src, dst, ver):
+ try:
+ os.unlink(dst)
+ except OSError:
+ pass
+ os.symlink(os.path.split(ver)[1], dst)
+
+ def copy_scons(self, src, dst, *args):
+ try:
+ os.unlink(dst)
+ except OSError:
+ pass
+ self.copy_file(src, dst)
+ self.outfiles.append(dst)
+
+ def run(self):
+ # --- distutils copy/paste ---
+ if not self.skip_build:
+ self.run_command('build_scripts')
+ # --- /distutils copy/paste ---
+
+ # Custom SCons installation stuff.
+ if Options.hardlink_scons:
+ create_basename_script = self.hardlink_scons
+ elif Options.symlink_scons:
+ create_basename_script = self.symlink_scons
+ elif Options.install_scons_script:
+ create_basename_script = self.copy_scons
+ else:
+ create_basename_script = self.do_nothing
+
+ if Options.install_version_script:
+ create_version_script = self.copy_scons
+ else:
+ create_version_script = self.do_nothing
+
+ inputs = self.get_inputs()
+ bat_scripts = [x for x in inputs if x[-4:] == '.bat']
+ non_bat_scripts = [x for x in inputs if x[-4:] != '.bat']
+
+ self.outfiles = []
+ self.mkpath(self.install_dir)
+
+ for src in non_bat_scripts:
+ base = os.path.basename(src)
+ scons = os.path.join(self.install_dir, base)
+ scons_ver = scons + '-' + Version
+ if is_win32:
+ scons += '.py'
+ scons_ver += '.py'
+ create_version_script(src, scons_ver)
+ create_basename_script(src, scons, scons_ver)
+
+ if Options.install_bat:
+ if is_win32:
+ bat_install_dir = get_scons_prefix(self.install_dir, is_win32)
+ else:
+ bat_install_dir = self.install_dir
+ for src in bat_scripts:
+ scons_bat = os.path.join(bat_install_dir, 'scons.bat')
+ scons_version_bat = os.path.join(bat_install_dir,
+ 'scons-' + Version + '.bat')
+ self.copy_scons(src, scons_bat)
+ self.copy_scons(src, scons_version_bat)
+
+ # --- distutils copy/paste ---
+ if hasattr(os, 'chmod') and hasattr(os, 'stat'):
+ # Set the executable bits (owner, group, and world) on
+ # all the scripts we just installed.
+ for file in self.get_outputs():
+ if self.dry_run:
+ # log.info("changing mode of %s", file)
+ pass
+ else:
+ # Use symbolic versions of permissions so this script doesn't fail to parse under python3.x
+ exec_and_read_permission = stat.S_IXOTH | stat.S_IXUSR | stat.S_IXGRP | stat.S_IROTH | stat.S_IRUSR | stat.S_IRGRP
+ mode_mask = 4095 # Octal 07777 used because python3 has different octal syntax than python 2
+ mode = ((os.stat(file)[stat.ST_MODE]) | exec_and_read_permission) & mode_mask
+ # log.info("changing mode of %s to %o", file, mode)
+ os.chmod(file, mode)
+ # --- /distutils copy/paste ---
+
+
+class build_scripts(_build_scripts):
+ def finalize_options(self):
+ _build_scripts.finalize_options(self)
+ self.build_dir = os.path.join('build', 'scripts')
+
+
+class install_data(_install_data):
+ def initialize_options(self):
+ _install_data.initialize_options(self)
+
+ def finalize_options(self):
+ _install_data.finalize_options(self)
+ if force_to_usr_local(self):
+ self.install_dir = '/usr/local'
+ if Options.install_man:
+ if is_win32:
+ dir = 'Doc'
+ else:
+ dir = os.path.join('man', 'man1')
+ self.data_files = [(dir, man_pages)]
+ man_dir = os.path.join(self.install_dir, dir)
+ msg = "Installed SCons man pages into %s" % man_dir
+ Installed.append(msg)
+ else:
+ self.data_files = []
+
+
+description = "Open Source next-generation build tool."
+
+long_description = """Open Source next-generation build tool.
+Improved, cross-platform substitute for the classic Make
+utility. In short, SCons is an easier, more reliable
+and faster way to build software."""
+
+scripts = [
+ 'script/scons',
+ 'script/sconsign',
+ 'script/scons-time',
+ 'script/scons-configure-cache',
+
+ # We include scons.bat in the list of scripts, even on UNIX systems,
+ # because we provide an option to allow it be installed explicitly,
+ # for example if you're installing from UNIX on a share that's
+ # accessible to Windows and you want the scons.bat.
+ 'script/scons.bat',
+]
+
+arguments = {
+ 'name': "scons",
+ 'version': Version,
+ 'description': description,
+ 'long_description': long_description,
+ 'author': 'Steven Knight',
+ 'author_email': 'knight@baldmt.com',
+ 'url': "http://www.scons.org/",
+ 'packages': ["SCons",
+ "SCons.compat",
+ "SCons.Node",
+ "SCons.Options",
+ "SCons.Platform",
+ "SCons.Scanner",
+ "SCons.Script",
+ "SCons.Tool",
+ "SCons.Tool.docbook",
+ "SCons.Tool.MSCommon",
+ "SCons.Tool.packaging",
+ "SCons.Variables",
+ ],
+ 'package_dir': {'': 'engine',
+ 'SCons.Tool.docbook': 'engine/SCons/Tool/docbook'},
+ 'package_data': {'SCons.Tool.docbook': ['docbook-xsl-1.76.1/*',
+ 'docbook-xsl-1.76.1/common/*',
+ 'docbook-xsl-1.76.1/docsrc/*',
+ 'docbook-xsl-1.76.1/eclipse/*',
+ 'docbook-xsl-1.76.1/epub/*',
+ 'docbook-xsl-1.76.1/epub/bin/*',
+ 'docbook-xsl-1.76.1/epub/bin/lib/*',
+ 'docbook-xsl-1.76.1/epub/bin/xslt/*',
+ 'docbook-xsl-1.76.1/extensions/*',
+ 'docbook-xsl-1.76.1/fo/*',
+ 'docbook-xsl-1.76.1/highlighting/*',
+ 'docbook-xsl-1.76.1/html/*',
+ 'docbook-xsl-1.76.1/htmlhelp/*',
+ 'docbook-xsl-1.76.1/images/*',
+ 'docbook-xsl-1.76.1/images/callouts/*',
+ 'docbook-xsl-1.76.1/images/colorsvg/*',
+ 'docbook-xsl-1.76.1/javahelp/*',
+ 'docbook-xsl-1.76.1/lib/*',
+ 'docbook-xsl-1.76.1/manpages/*',
+ 'docbook-xsl-1.76.1/params/*',
+ 'docbook-xsl-1.76.1/profiling/*',
+ 'docbook-xsl-1.76.1/roundtrip/*',
+ 'docbook-xsl-1.76.1/slides/browser/*',
+ 'docbook-xsl-1.76.1/slides/fo/*',
+ 'docbook-xsl-1.76.1/slides/graphics/*',
+ 'docbook-xsl-1.76.1/slides/graphics/active/*',
+ 'docbook-xsl-1.76.1/slides/graphics/inactive/*',
+ 'docbook-xsl-1.76.1/slides/graphics/toc/*',
+ 'docbook-xsl-1.76.1/slides/html/*',
+ 'docbook-xsl-1.76.1/slides/htmlhelp/*',
+ 'docbook-xsl-1.76.1/slides/keynote/*',
+ 'docbook-xsl-1.76.1/slides/keynote/xsltsl/*',
+ 'docbook-xsl-1.76.1/slides/svg/*',
+ 'docbook-xsl-1.76.1/slides/xhtml/*',
+ 'docbook-xsl-1.76.1/template/*',
+ 'docbook-xsl-1.76.1/tests/*',
+ 'docbook-xsl-1.76.1/tools/bin/*',
+ 'docbook-xsl-1.76.1/tools/make/*',
+ 'docbook-xsl-1.76.1/webhelp/*',
+ 'docbook-xsl-1.76.1/webhelp/docs/*',
+ 'docbook-xsl-1.76.1/webhelp/docs/common/*',
+ 'docbook-xsl-1.76.1/webhelp/docs/common/css/*',
+ 'docbook-xsl-1.76.1/webhelp/docs/common/images/*',
+ 'docbook-xsl-1.76.1/webhelp/docs/common/jquery/*',
+ 'docbook-xsl-1.76.1/webhelp/docs/common/jquery/theme-redmond/*',
+ 'docbook-xsl-1.76.1/webhelp/docs/common/jquery/theme-redmond/images/*',
+ 'docbook-xsl-1.76.1/webhelp/docs/common/jquery/treeview/*',
+ 'docbook-xsl-1.76.1/webhelp/docs/common/jquery/treeview/images/*',
+ 'docbook-xsl-1.76.1/webhelp/docs/content/*',
+ 'docbook-xsl-1.76.1/webhelp/docs/content/search/*',
+ 'docbook-xsl-1.76.1/webhelp/docs/content/search/stemmers/*',
+ 'docbook-xsl-1.76.1/webhelp/docsrc/*',
+ 'docbook-xsl-1.76.1/webhelp/template/*',
+ 'docbook-xsl-1.76.1/webhelp/template/common/*',
+ 'docbook-xsl-1.76.1/webhelp/template/common/css/*',
+ 'docbook-xsl-1.76.1/webhelp/template/common/images/*',
+ 'docbook-xsl-1.76.1/webhelp/template/common/jquery/*',
+ 'docbook-xsl-1.76.1/webhelp/template/common/jquery/theme-redmond/*',
+ 'docbook-xsl-1.76.1/webhelp/template/common/jquery/theme-redmond/images/*',
+ 'docbook-xsl-1.76.1/webhelp/template/common/jquery/treeview/*',
+ 'docbook-xsl-1.76.1/webhelp/template/common/jquery/treeview/images/*',
+ 'docbook-xsl-1.76.1/webhelp/template/content/search/*',
+ 'docbook-xsl-1.76.1/webhelp/template/content/search/stemmers/*',
+ 'docbook-xsl-1.76.1/webhelp/xsl/*',
+ 'docbook-xsl-1.76.1/website/*',
+ 'docbook-xsl-1.76.1/xhtml/*',
+ 'docbook-xsl-1.76.1/xhtml-1_1/*',
+ 'utils/*']},
+ 'data_files': [('man/man1', man_pages)],
+ 'scripts': scripts,
+ 'cmdclass': {'install': install,
+ 'install_lib': install_lib,
+ 'install_data': install_data,
+ 'install_scripts': install_scripts,
+ 'build_scripts': build_scripts}
+}
+
+distutils.core.setup(**arguments)
+
+if Installed:
+ for i in Installed:
+ print(i)
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/test_files.py b/3rdParty/SCons/scons-3.0.1/test_files.py
new file mode 100644
index 0000000..1eee11d
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/test_files.py
@@ -0,0 +1,106 @@
+#!/usr/bin/env python
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+from __future__ import print_function
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+"""
+Verify that we have certain important files in our distribution
+packages.
+
+Note that this is a packaging test, not a functional test, so the
+name of this script doesn't end in *Tests.py.
+"""
+
+import os
+import os.path
+import re
+
+import TestSCons
+
+test = TestSCons.TestSCons()
+
+try:
+ cwd = os.environ['SCONS_CWD']
+except KeyError:
+ cwd = os.getcwd()
+
+def build_path(*args):
+ return os.path.join(cwd, 'build', *args)
+
+build_scons_tar_gz = build_path('unpack-tar-gz', 'scons-'+test.scons_version)
+build_scons_zip = build_path('unpack-zip', 'scons-'+test.scons_version)
+build_local_tar_gz = build_path('test-local-tar-gz')
+build_local_zip = build_path('test-local-zip')
+
+scons_files = [
+ 'CHANGES.txt',
+ 'LICENSE.txt',
+ 'README.txt',
+ 'RELEASE.txt',
+]
+
+local_files = [
+ 'scons-LICENSE',
+ 'scons-README',
+]
+
+# Map each directory to search (dictionary keys) to a list of its
+# subsidiary files and directories to exclude from copyright checks.
+check = {
+ build_scons_tar_gz : scons_files,
+ build_scons_zip : scons_files,
+ build_local_tar_gz : local_files,
+ build_local_zip : local_files,
+}
+
+missing = []
+no_result = []
+
+for directory, check_list in check.items():
+ if os.path.exists(directory):
+ for c in check_list:
+ f = os.path.join(directory, c)
+ if not os.path.isfile(f):
+ missing.append(f)
+ else:
+ no_result.append(directory)
+
+if missing:
+ print("Missing the following files:\n")
+ print("\t" + "\n\t".join(missing))
+ test.fail_test(1)
+
+if no_result:
+ print("Cannot check files, the following have apparently not been built:")
+ print("\t" + "\n\t".join(no_result))
+ test.no_result(1)
+
+test.pass_test()
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/test_interrupts.py b/3rdParty/SCons/scons-3.0.1/test_interrupts.py
new file mode 100644
index 0000000..0fd8ba7
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/test_interrupts.py
@@ -0,0 +1,146 @@
+#!/usr/bin/env python
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+from __future__ import print_function
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+"""
+Verify that the SCons source code contains only correct handling of
+keyboard interrupts (e.g. Ctrl-C).
+"""
+
+import os
+import os.path
+import re
+import time
+
+import TestSCons
+
+test = TestSCons.TestSCons()
+
+# We do not want statements of the form:
+# try:
+# # do something, e.g.
+# return a['x']
+# except:
+# # do the exception handling
+# a['x'] = getx()
+# return a['x']
+#
+# The code above may catch a KeyboardInterrupt exception, which was not
+# intended by the programmer. We check for these situations in all python
+# source files.
+
+try:
+ cwd = os.environ['SCONS_CWD']
+except KeyError:
+ scons_lib_dir = os.environ['SCONS_LIB_DIR']
+ MANIFEST = os.path.join(scons_lib_dir, 'MANIFEST.in')
+else:
+ #cwd = os.getcwd()
+ scons_lib_dir = os.path.join(cwd, 'build', 'scons')
+ MANIFEST = os.path.join(scons_lib_dir, 'MANIFEST')
+
+# We expect precisely this many uncaught KeyboardInterrupt exceptions
+# from the files in the following dictionary.
+
+expected_uncaught = {
+ 'engine/SCons/Job.py' : 5,
+ 'engine/SCons/Script/Main.py' : 1,
+ 'engine/SCons/Taskmaster.py' : 3,
+}
+
+try:
+ fp = open(MANIFEST)
+except IOError:
+ test.skip_test('%s does not exist; skipping test.\n' % MANIFEST)
+else:
+ files = fp.read().split()
+ files = [f for f in files if f[-3:] == '.py']
+
+# some regexps to parse the python files
+tryexc_pat = re.compile(
+r'^(?P<try_or_except>(?P<indent> *)(try|except)( [^\n]*)?:.*)',re.MULTILINE)
+keyboardint_pat = re.compile(r' *except +([^,],)*KeyboardInterrupt([ ,][^\n]*)?:[^\n]*')
+exceptall_pat = re.compile(r' *except(?: *| +Exception *, *[^: ]+):[^\n]*')
+
+uncaughtKeyboardInterrupt = 0
+for f in files:
+ contents = open(os.path.join(scons_lib_dir, f)).read()
+ try_except_lines = {}
+ lastend = 0
+ while True:
+ match = tryexc_pat.search( contents, lastend )
+ if match is None:
+ break
+ #print match.groups()
+ lastend = match.end()
+ try:
+ indent_list = try_except_lines[match.group('indent')]
+ except:
+ indent_list = []
+ line_num = 1 + contents[:match.start()].count('\n')
+ indent_list.append( (line_num, match.group('try_or_except') ) )
+ try_except_lines[match.group('indent')] = indent_list
+ uncaught_this_file = []
+ for indent in list(try_except_lines.keys()):
+ exc_keyboardint_seen = 0
+ exc_all_seen = 0
+ for (l,statement) in try_except_lines[indent] + [(-1,indent + 'try')]:
+ #print "%4d %s" % (l,statement),
+ m1 = keyboardint_pat.match(statement)
+ m2 = exceptall_pat.match(statement)
+ if statement.find(indent + 'try') == 0:
+ if exc_all_seen and not exc_keyboardint_seen:
+ uncaught_this_file.append(line)
+ exc_keyboardint_seen = 0
+ exc_all_seen = 0
+ line = l
+ #print " -> reset"
+ elif m1 is not None:
+ exc_keyboardint_seen = 1
+ #print " -> keyboard -> ", m1.groups()
+ elif m2 is not None:
+ exc_all_seen = 1
+ #print " -> all -> ", m2.groups()
+ else:
+ pass
+ #print "Warning: unknown statement %s" % statement
+ expected_num = expected_uncaught.get(f, 0)
+ if expected_num != len(uncaught_this_file):
+ uncaughtKeyboardInterrupt = 1
+ msg = "%s: expected %d uncaught interrupts, got %d:"
+ print(msg % (f, expected_num, len(uncaught_this_file)))
+ for line in uncaught_this_file:
+ print(" File %s:%d: Uncaught KeyboardInterrupt!" % (f,line))
+
+test.fail_test(uncaughtKeyboardInterrupt)
+
+test.pass_test()
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/test_pychecker.py b/3rdParty/SCons/scons-3.0.1/test_pychecker.py
new file mode 100644
index 0000000..54d78fb
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/test_pychecker.py
@@ -0,0 +1,152 @@
+#!/usr/bin/env python
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+from __future__ import print_function
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+"""
+Use pychecker to catch various Python coding errors.
+"""
+
+import os
+import os.path
+import sys
+
+import TestSCons
+
+test = TestSCons.TestSCons()
+
+test.skip_test('Not ready for clean pychecker output; skipping test.\n')
+
+try:
+ import pychecker
+except ImportError:
+ pychecker = test.where_is('pychecker')
+ if not pychecker:
+ test.skip_test("Could not find 'pychecker'; skipping test(s).\n")
+ program = pychecker
+ default_arguments = []
+else:
+ pychecker = os.path.join(os.path.split(pychecker.__file__)[0], 'checker.py')
+ program = sys.executable
+ default_arguments = [pychecker]
+
+try:
+ cwd = os.environ['SCONS_CWD']
+except KeyError:
+ src_engine = os.environ['SCONS_LIB_DIR']
+else:
+ src_engine = os.path.join(cwd, 'build', 'scons-src', 'src', 'engine')
+ if not os.path.exists(src_engine):
+ src_engine = os.path.join(cwd, 'src', 'engine')
+
+src_engine_ = os.path.join(src_engine, '')
+
+MANIFEST = os.path.join(src_engine, 'MANIFEST.in')
+files = open(MANIFEST).read().split()
+
+files = [f for f in files if f[-3:] == '.py']
+
+ignore = [
+ 'SCons/compat/__init__.py',
+ 'SCons/compat/_scons_UserString.py',
+ 'SCons/compat/_scons_hashlib.py',
+ 'SCons/compat/_scons_sets.py',
+ 'SCons/compat/_scons_subprocess.py',
+ 'SCons/compat/builtins.py',
+]
+
+u = {}
+for file in files:
+ u[file] = 1
+for file in ignore:
+ try:
+ del u[file]
+ except KeyError:
+ pass
+files = sorted(u.keys())
+
+mismatches = []
+
+default_arguments.extend([
+ '--quiet',
+ '--limit=1000',
+ # Suppress warnings about unused arguments to functions and methods.
+ # We have too many wrapper functions that intentionally only use some
+ # of their arguments.
+ '--no-argsused',
+])
+
+if sys.platform == 'win32':
+ default_arguments.extend([
+ '--blacklist', '"pywintypes,pywintypes.error"',
+ ])
+
+per_file_arguments = {
+ #'SCons/__init__.py' : [
+ # '--varlist',
+ # '"__revision__,__version__,__build__,__buildsys__,__date__,__developer__"',
+ #],
+}
+
+pywintypes_warning = "warning: couldn't find real module for class pywintypes.error (module name: pywintypes)\n"
+
+os.environ['PYTHONPATH'] = src_engine
+
+for file in files:
+
+ args = (default_arguments +
+ per_file_arguments.get(file, []) +
+ [os.path.join(src_engine, file)])
+
+ test.run(program=program, arguments=args, status=None, stderr=None)
+
+ stdout = test.stdout()
+ stdout = stdout.replace(src_engine_, '')
+
+ stderr = test.stderr()
+ stderr = stderr.replace(src_engine_, '')
+ stderr = stderr.replace(pywintypes_warning, '')
+
+ if test.status or stdout or stderr:
+ mismatches.append('\n')
+ mismatches.append(' '.join([program] + args) + '\n')
+
+ mismatches.append('STDOUT =====================================\n')
+ mismatches.append(stdout)
+
+ if stderr:
+ mismatches.append('STDERR =====================================\n')
+ mismatches.append(stderr)
+
+if mismatches:
+ print(''.join(mismatches[1:]))
+ test.fail_test()
+
+test.pass_test()
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/test_setup.py b/3rdParty/SCons/scons-3.0.1/test_setup.py
new file mode 100644
index 0000000..edf0de5
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/test_setup.py
@@ -0,0 +1,333 @@
+#!/usr/bin/env python
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+from __future__ import print_function
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+"""
+Test how the setup.py script installs SCons.
+
+Note that this is an installation test, not a functional test, so the
+name of this script doesn't end in *Tests.py.
+"""
+
+import os
+import os.path
+import shutil
+import sys
+
+try: WindowsError
+except NameError: WindowsError = OSError
+
+import TestSCons
+
+version = TestSCons.TestSCons.scons_version
+
+scons_version = 'scons-%s' % version
+
+python = TestSCons.python
+
+class MyTestSCons(TestSCons.TestSCons):
+
+ _lib_modules = [
+ # A representative smattering of build engine modules.
+ '__init__.py',
+ 'Action.py',
+ 'Builder.py',
+ 'Environment.py',
+ 'Util.py',
+ ]
+
+ _base_scripts = [
+ 'scons',
+ 'sconsign',
+ ]
+
+ _version_scripts = [
+ 'scons-%s' % version,
+ 'sconsign-%s' % version,
+ ]
+
+ _bat_scripts = [
+ 'scons.bat',
+ ]
+
+ _bat_version_scripts = [
+ 'scons-%s.bat' % version,
+ ]
+
+ _man_pages = [
+ 'scons.1',
+ 'sconsign.1',
+ ]
+
+ def __init__(self):
+ TestSCons.TestSCons.__init__(self)
+ self.root = self.workpath('root')
+ self.prefix = self.root + os.path.splitdrive(sys.prefix)[1]
+
+ if sys.platform == 'win32':
+ self.bin_dir = os.path.join(self.prefix, 'Scripts')
+ self.bat_dir = self.prefix
+ self.standalone_lib = os.path.join(self.prefix, 'scons')
+ self.standard_lib = os.path.join(self.prefix,
+ 'Lib',
+ 'site-packages',
+ '')
+ self.version_lib = os.path.join(self.prefix, scons_version)
+ self.man_dir = os.path.join(self.prefix, 'Doc')
+ else:
+ self.bin_dir = os.path.join(self.prefix, 'bin')
+ self.bat_dir = self.bin_dir
+ self.lib_dir = os.path.join(self.prefix, 'lib')
+ self.standalone_lib = os.path.join(self.lib_dir, 'scons')
+ self.standard_lib = os.path.join(self.lib_dir,
+ 'python%s' % sys.version[:3],
+ 'site-packages',
+ '')
+ self.version_lib = os.path.join(self.lib_dir, scons_version)
+ self.man_dir = os.path.join(self.prefix, 'man', 'man1')
+
+ self.prepend_bin_dir = lambda p: os.path.join(self.bin_dir, p)
+ self.prepend_bat_dir = lambda p: os.path.join(self.bat_dir, p)
+ self.prepend_man_dir = lambda p: os.path.join(self.man_dir, p)
+
+ def run(self, *args, **kw):
+ kw['chdir'] = scons_version
+ kw['program'] = python
+ kw['stderr'] = None
+ return TestSCons.TestSCons.run(self, *args, **kw)
+
+ def remove(self, dir):
+ try: shutil.rmtree(dir)
+ except (OSError, WindowsError): pass
+
+ def stdout_lines(self):
+ return self.stdout().split('\n')
+
+
+ def lib_line(self, lib):
+ return 'Installed SCons library modules into %s' % lib
+
+ def lib_paths(self, lib_dir):
+ return [os.path.join(lib_dir, 'SCons', p) for p in self._lib_modules]
+
+ def scripts_line(self):
+ return 'Installed SCons scripts into %s' % self.bin_dir
+
+ def base_script_paths(self):
+ scripts = self._base_scripts
+ return list(map(self.prepend_bin_dir, scripts))
+
+ def version_script_paths(self):
+ scripts = self._version_scripts
+ return list(map(self.prepend_bin_dir, scripts))
+
+ def bat_script_paths(self):
+ scripts = self._bat_scripts + self._bat_version_scripts
+ return list(map(self.prepend_bat_dir, scripts))
+
+ def man_page_line(self):
+ return 'Installed SCons man pages into %s' % self.man_dir
+
+ def man_page_paths(self):
+ return list(map(self.prepend_man_dir, self._man_pages))
+
+
+ def must_have_installed(self, paths):
+ for p in paths:
+ self.must_exist(p)
+
+ def must_not_have_installed(self, paths):
+ for p in paths:
+ self.must_not_exist(p)
+
+try:
+ cwd = os.environ['SCONS_CWD']
+except KeyError:
+ cwd = os.getcwd()
+
+test = MyTestSCons()
+
+test.subdir(test.root)
+
+tar_gz = os.path.join(cwd, 'build', 'dist', '%s.tar.gz' % scons_version)
+zip = os.path.join(cwd, 'build', 'dist', '%s.zip' % scons_version)
+
+if os.path.isfile(zip):
+ try: import zipfile
+ except ImportError: pass
+ else:
+ zf = zipfile.ZipFile(zip, 'r')
+
+ for name in zf.namelist():
+ dir = os.path.dirname(name)
+ try: os.makedirs(dir)
+ except: pass
+ # if the file exists, then delete it before writing
+ # to it so that we don't end up trying to write to a symlink:
+ if os.path.isfile(name) or os.path.islink(name):
+ os.unlink(name)
+ if not os.path.isdir(name):
+ open(name, 'w').write(zf.read(name))
+
+if not os.path.isdir(scons_version) and os.path.isfile(tar_gz):
+ # Unpack the .tar.gz file. This should create the scons_version/
+ # subdirectory from which we execute the setup.py script therein.
+ os.system("gunzip -c %s | tar xf -" % tar_gz)
+
+if not os.path.isdir(scons_version):
+ print("Cannot test package installation, found none of the following packages:")
+ print("\t" + tar_gz)
+ print("\t" + zip)
+ test.no_result(1)
+
+# Verify that a virgin installation installs the version library,
+# the scripts and (on UNIX/Linux systems) the man pages.
+test.run(arguments = 'setup.py install --root=%s' % test.root)
+test.fail_test(not test.lib_line(test.version_lib) in test.stdout_lines())
+test.must_have_installed(test.lib_paths(test.version_lib))
+
+# Verify that --standard-lib installs into the Python standard library.
+test.run(arguments = 'setup.py install --root=%s --standard-lib' % test.root)
+test.fail_test(not test.lib_line(test.standard_lib) in test.stdout_lines())
+test.must_have_installed(test.lib_paths(test.standard_lib))
+
+# Verify that --standalone-lib installs the standalone library.
+test.run(arguments = 'setup.py install --root=%s --standalone-lib' % test.root)
+test.fail_test(not test.lib_line(test.standalone_lib) in test.stdout_lines())
+test.must_have_installed(test.lib_paths(test.standalone_lib))
+
+# Verify that --version-lib installs into a version-specific library directory.
+test.run(arguments = 'setup.py install --root=%s --version-lib' % test.root)
+test.fail_test(not test.lib_line(test.version_lib) in test.stdout_lines())
+
+# Now that all of the libraries are in place,
+# verify that a default installation still installs the version library.
+test.run(arguments = 'setup.py install --root=%s' % test.root)
+test.fail_test(not test.lib_line(test.version_lib) in test.stdout_lines())
+
+test.remove(test.version_lib)
+
+# Now with only the standard and standalone libraries in place,
+# verify that a default installation still installs the version library.
+test.run(arguments = 'setup.py install --root=%s' % test.root)
+test.fail_test(not test.lib_line(test.version_lib) in test.stdout_lines())
+
+test.remove(test.version_lib)
+test.remove(test.standalone_lib)
+
+# Now with only the standard libraries in place,
+# verify that a default installation still installs the version library.
+test.run(arguments = 'setup.py install --root=%s' % test.root)
+test.fail_test(not test.lib_line(test.version_lib) in test.stdout_lines())
+
+
+
+#
+test.run(arguments = 'setup.py install --root=%s' % test.root)
+test.fail_test(not test.scripts_line() in test.stdout_lines())
+if sys.platform == 'win32':
+ test.must_have_installed(test.base_script_paths())
+ test.must_have_installed(test.version_script_paths())
+ test.must_have_installed(test.bat_script_paths())
+else:
+ test.must_have_installed(test.base_script_paths())
+ test.must_have_installed(test.version_script_paths())
+ test.must_not_have_installed(test.bat_script_paths())
+
+test.remove(test.prefix)
+
+test.run(arguments = 'setup.py install --root=%s --no-install-bat' % test.root)
+test.fail_test(not test.scripts_line() in test.stdout_lines())
+test.must_have_installed(test.base_script_paths())
+test.must_have_installed(test.version_script_paths())
+test.must_not_have_installed(test.bat_script_paths())
+
+test.remove(test.prefix)
+
+test.run(arguments = 'setup.py install --root=%s --install-bat' % test.root)
+test.fail_test(not test.scripts_line() in test.stdout_lines())
+test.must_have_installed(test.base_script_paths())
+test.must_have_installed(test.version_script_paths())
+test.must_have_installed(test.bat_script_paths())
+
+test.remove(test.prefix)
+
+test.run(arguments = 'setup.py install --root=%s --no-scons-script' % test.root)
+test.fail_test(not test.scripts_line() in test.stdout_lines())
+test.must_not_have_installed(test.base_script_paths())
+test.must_have_installed(test.version_script_paths())
+# Doesn't matter whether we installed the .bat scripts or not.
+
+test.remove(test.prefix)
+
+test.run(arguments = 'setup.py install --root=%s --no-version-script' % test.root)
+test.fail_test(not test.scripts_line() in test.stdout_lines())
+test.must_have_installed(test.base_script_paths())
+test.must_not_have_installed(test.version_script_paths())
+# Doesn't matter whether we installed the .bat scripts or not.
+
+
+
+test.remove(test.man_dir)
+
+test.run(arguments = 'setup.py install --root=%s' % test.root)
+if sys.platform == 'win32':
+ test.fail_test(test.man_page_line() in test.stdout_lines())
+ test.must_not_have_installed(test.man_page_paths())
+else:
+ test.fail_test(not test.man_page_line() in test.stdout_lines())
+ test.must_have_installed(test.man_page_paths())
+
+test.remove(test.man_dir)
+
+test.run(arguments = 'setup.py install --root=%s --no-install-man' % test.root)
+test.fail_test(test.man_page_line() in test.stdout_lines())
+test.must_not_have_installed(test.man_page_paths())
+
+test.remove(test.man_dir)
+
+test.run(arguments = 'setup.py install --root=%s --install-man' % test.root)
+test.fail_test(not test.man_page_line() in test.stdout_lines())
+test.must_have_installed(test.man_page_paths())
+
+
+
+# Verify that we don't warn about the directory in which we've
+# installed the modules when using a non-standard prefix.
+other_prefix = test.workpath('other-prefix')
+test.subdir(other_prefix)
+test.run(arguments = 'setup.py install --prefix=%s' % other_prefix)
+test.fail_test(test.stderr().find("you'll have to change the search path yourself")
+ != -1)
+
+# All done.
+test.pass_test()
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/3rdParty/SCons/scons-3.0.1/test_strings.py b/3rdParty/SCons/scons-3.0.1/test_strings.py
new file mode 100644
index 0000000..297d59d
--- /dev/null
+++ b/3rdParty/SCons/scons-3.0.1/test_strings.py
@@ -0,0 +1,267 @@
+#!/usr/bin/env python
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+from __future__ import print_function
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+"""
+Verify that we have proper strings like Copyright notices on all the
+right files in our distributions.
+
+Note that this is a source file and packaging test, not a functional test,
+so the name of this script doesn't end in *Tests.py.
+"""
+
+import fnmatch
+import os
+import os.path
+import re
+
+import TestCmd
+import TestSCons
+
+# Use TestCmd, not TestSCons, so we don't chdir to a temporary directory.
+test = TestCmd.TestCmd()
+
+scons_version = TestSCons.SConsVersion
+
+def build_path(*args):
+ return os.path.join('build', *args)
+
+build_scons = build_path('scons')
+build_local = build_path('scons-local', 'scons-local-'+scons_version)
+build_src = build_path('scons-src')
+
+class Checker(object):
+ def __init__(self, directory,
+ search_list = [],
+ remove_list = [],
+ remove_patterns = []):
+ self.directory = directory
+ self.search_list = search_list
+ self.remove_dict = {}
+ for r in remove_list:
+ self.remove_dict[os.path.join(directory, r)] = 1
+ self.remove_patterns = remove_patterns
+
+ def directory_exists(self):
+ return os.path.exists(self.directory)
+
+ def remove_this(self, name, path):
+ if self.remove_dict.get(path):
+ return 1
+ else:
+ for pattern in self.remove_patterns:
+ if fnmatch.fnmatch(name, pattern):
+ return 1
+ return 0
+
+ def search_this(self, path):
+ if self.search_list:
+ for pattern in self.search_list:
+ if fnmatch.fnmatch(path, pattern):
+ return 1
+ return None
+ else:
+ return os.path.isfile(path)
+
+ def find_missing(self):
+ result = []
+ for dirpath, dirnames, filenames in os.walk(self.directory):
+ if '.svn' in dirnames:
+ dirnames.remove('.svn')
+ for dname in dirnames[:]:
+ dpath = os.path.join(dirpath, dname)
+ if self.remove_this(dname, dpath):
+ dirnames.remove(dname)
+ for fname in filenames:
+ fpath = os.path.join(dirpath, fname)
+ if self.search_this(fpath) and not self.remove_this(fname, fpath):
+ body = open(fpath, 'r').read()
+ for expr in self.expressions:
+ if not expr.search(body):
+ msg = '%s: missing %s' % (fpath, repr(expr.pattern))
+ result.append(msg)
+ return result
+
+class CheckUnexpandedStrings(Checker):
+ expressions = [
+ re.compile('__COPYRIGHT__'),
+ re.compile('__FILE__ __REVISION__ __DATE__ __DEVELOPER__'),
+ ]
+ def must_be_built(self):
+ return None
+
+class CheckPassTest(Checker):
+ expressions = [
+ re.compile(r'\.pass_test()'),
+ ]
+ def must_be_built(self):
+ return None
+
+class CheckExpandedCopyright(Checker):
+ expressions = [
+ re.compile('Copyright.*The SCons Foundation'),
+ ]
+ def must_be_built(self):
+ return 1
+
+check_list = [
+
+ CheckUnexpandedStrings(
+ 'src',
+ search_list = [ '*.py' ],
+ remove_list = [
+ 'engine/SCons/compat/_scons_sets.py',
+ 'engine/SCons/compat/_scons_subprocess.py',
+ 'engine/SCons/Conftest.py',
+ 'engine/SCons/dblite.py',
+ ],
+ ),
+
+ CheckUnexpandedStrings(
+ 'test',
+ search_list = [ '*.py' ],
+ ),
+
+ CheckPassTest(
+ 'test',
+ search_list = [ '*.py' ],
+ remove_list = [
+ 'Fortran/common.py',
+ ],
+ ),
+
+ CheckExpandedCopyright(
+ build_scons,
+ remove_list = [
+ 'build',
+ 'build-stamp',
+ 'configure-stamp',
+ 'debian',
+ 'dist',
+ 'gentoo',
+ 'engine/SCons/compat/_scons_sets.py',
+ 'engine/SCons/compat/_scons_subprocess.py',
+ 'engine/SCons/Conftest.py',
+ 'engine/SCons/dblite.py',
+ 'MANIFEST',
+ 'setup.cfg',
+ ],
+ # We run epydoc on the *.py files, which generates *.pyc files.
+ remove_patterns = [
+ '*.pyc',
+ ]
+ ),
+
+ CheckExpandedCopyright(
+ build_local,
+ remove_list = [
+ 'SCons/compat/_scons_sets.py',
+ 'SCons/compat/_scons_subprocess.py',
+ 'SCons/Conftest.py',
+ 'SCons/dblite.py',
+ 'scons-%s.egg-info' % scons_version,
+ ],
+ ),
+
+ CheckExpandedCopyright(
+ build_src,
+ remove_list = [
+ 'bench/timeit.py',
+ 'bin',
+ 'config',
+ 'debian',
+ 'gentoo',
+ 'doc/design',
+ 'doc/MANIFEST',
+ 'doc/python10',
+ 'doc/reference',
+ 'doc/developer/MANIFEST',
+ 'doc/man/MANIFEST',
+ 'doc/user/cons.pl',
+ 'doc/user/MANIFEST',
+ 'doc/user/SCons-win32-install-1.jpg',
+ 'doc/user/SCons-win32-install-2.jpg',
+ 'doc/user/SCons-win32-install-3.jpg',
+ 'doc/user/SCons-win32-install-4.jpg',
+ 'examples',
+ 'gentoo',
+ 'QMTest/classes.qmc',
+ 'QMTest/configuration',
+ 'QMTest/TestCmd.py',
+ 'QMTest/TestCmdTests.py',
+ 'QMTest/TestCommon.py',
+ 'QMTest/TestCommonTests.py',
+ 'src/MANIFEST.in',
+ 'src/setup.cfg',
+ 'src/engine/MANIFEST.in',
+ 'src/engine/MANIFEST-xml.in',
+ 'src/engine/setup.cfg',
+ 'src/engine/SCons/compat/_scons_sets.py',
+ 'src/engine/SCons/compat/_scons_subprocess.py',
+ 'src/engine/SCons/Conftest.py',
+ 'src/engine/SCons/dblite.py',
+ 'src/script/MANIFEST.in',
+ 'src/script/setup.cfg',
+ 'test/Fortran/.exclude_tests',
+ 'timings/changelog.html',
+ 'timings/ElectricCloud/genscons.pl',
+ 'timings/graph.html',
+ 'timings/index.html',
+ 'review.py',
+ ],
+ remove_patterns = [
+ '*.js',
+ ]
+ ),
+
+]
+
+missing_strings = []
+not_built = []
+
+for collector in check_list:
+ if collector.directory_exists():
+ missing_strings.extend(collector.find_missing())
+ elif collector.must_be_built():
+ not_built.append(collector.directory)
+
+if missing_strings:
+ print("Found the following files with missing strings:")
+ print("\t" + "\n\t".join(missing_strings))
+ test.fail_test(1)
+
+if not_built:
+ print("Cannot check all strings, the following have apparently not been built:")
+ print("\t" + "\n\t".join(not_built))
+ test.no_result(1)
+
+test.pass_test()
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/BuildTools/CheckHeaders.py b/BuildTools/CheckHeaders.py
index 79ff85c..752d257 100755
--- a/BuildTools/CheckHeaders.py
+++ b/BuildTools/CheckHeaders.py
@@ -36,7 +36,7 @@ for line in file.readlines() :
continue
for forbiddenInclude, ignores in FORBIDDEN_INCLUDES :
if forbiddenInclude in line and len([x for x in ignores if x in filename]) == 0 :
- print "Found " + forbiddenInclude + " include in " + filename
+ print("Found " + forbiddenInclude + " include in " + filename)
foundBadHeaders = True
sys.exit(foundBadHeaders)
diff --git a/BuildTools/CheckTranslations.py b/BuildTools/CheckTranslations.py
index 615f81f..0617fba 100755
--- a/BuildTools/CheckTranslations.py
+++ b/BuildTools/CheckTranslations.py
@@ -41,10 +41,10 @@ for filename in os.listdir("Swift/Translations") :
translationText = getText(translation.childNodes)
translationPlaceholders = set(re.findall("%\d+%?", translationText))
if translationPlaceholders != sourcePlaceholders :
- print "[Error] " + filename + ": Placeholder mismatch in translation '" + sourceText + "'"
+ print("[Error] " + filename + ": Placeholder mismatch in translation '" + sourceText + "'")
if not finished :
- print "[Warning] " + filename + ": Unfinished"
+ print("[Warning] " + filename + ": Unfinished")
if language not in desktop_generic_names and language != "en" :
- print "[Warning] GenericName field missing in desktop entry for " + language
+ print("[Warning] GenericName field missing in desktop entry for " + language)
if language not in desktop_comments and language != "en" :
- print "[Warning] Comment field missing in desktop entry for " + language
+ print("[Warning] Comment field missing in desktop entry for " + language)
diff --git a/BuildTools/Copyright/find-contribs.py b/BuildTools/Copyright/find-contribs.py
index ac30afb..799ae7b 100755
--- a/BuildTools/Copyright/find-contribs.py
+++ b/BuildTools/Copyright/find-contribs.py
@@ -46,12 +46,12 @@ def print_log(full_log):
full_swiften_log = subprocess.check_output(["git", "log", "--", "Swiften"])
-print "Contributors for Swiften/ subtree:\n"
+print("Contributors for Swiften/ subtree:\n")
print_log(full_swiften_log)
full_all_log = subprocess.check_output(["git", "log"])
-print "\n\n\n\n"
+print("\n\n\n\n")
-print "Contributors for full tree:\n"
+print("Contributors for full tree:\n")
print_log(full_all_log)
diff --git a/BuildTools/Copyrighter.py b/BuildTools/Copyrighter.py
index a16050c..4c7bfeb 100755
--- a/BuildTools/Copyrighter.py
+++ b/BuildTools/Copyrighter.py
@@ -8,7 +8,7 @@ CONTRIBUTOR_LICENSE = "mit"
LICENSE_DIR = "Documentation/Licenses"
# The following regex parses license comment blocks and its part out of a complete source file.
-reParseLicenseCommentBlocks = re.compile(ur'(\/\*\n\s\*\sCopyright \(c\) (?P<startYear>\d\d\d\d)(-(?P<endYear>\d\d\d\d))? (?P<author>[^\n\.]*)\.?\n.\* (?P<license>[^\n]*)\n \* (?P<seeMore>[^\n]+)\n *\*\/)')
+reParseLicenseCommentBlocks = re.compile(r'(\/\*\n\s\*\sCopyright \(c\) (?P<startYear>\d\d\d\d)(-(?P<endYear>\d\d\d\d))? (?P<author>[^\n\.]*)\.?\n.\* (?P<license>[^\n]*)\n \* (?P<seeMore>[^\n]+)\n *\*\/)')
class License :
def __init__(self, name, file) :
@@ -122,14 +122,14 @@ def check_copyright(filename, hints) :
return True
else :
if hints :
- print "Copyright block for " + copyrightSetting.author + " does not cover current year in: " + filename
+ print("Copyright block for " + copyrightSetting.author + " does not cover current year in: " + filename)
return False
if hints :
- print "Missing copyright block for " + copyrightSetting.author + " in: " + filename
+ print("Missing copyright block for " + copyrightSetting.author + " in: " + filename)
return False
else :
if hints :
- print "No copyright found in: " + filename
+ print("No copyright found in: " + filename)
return False
def replace_data_in_file(filename, begin, end, replaceWith) :
@@ -140,7 +140,7 @@ def replace_data_in_file(filename, begin, end, replaceWith) :
def set_or_update_copyright(filename) :
if check_copyright(filename, False) :
- print "No update required for file: " + filename
+ print("No update required for file: " + filename)
else :
copyrightBlocks = parse_file_new(filename)
username, email = get_userinfo()
@@ -161,7 +161,7 @@ def set_or_update_copyright(filename) :
replace_data_in_file(filename, lastBlock+1, lastBlock+1, "\n" + str(copyrightSetting))
def print_help() :
- print """Usage:
+ print("""Usage:
Copyrighter.py check-copyright $filename
Cheks for the existence of a copyright comment block.
@@ -172,7 +172,7 @@ def print_help() :
A users license configuration can be set via the SWIFT_LICENSE_CONFIG environment variable
in the format "$copyright holder|$license", e.g. "Jane Doe|mit". Possible values for
$license are default, mit and gpl.
- """
+ """)
if sys.argv[1] == "check-copyright" :
file = sys.argv[2]
@@ -183,6 +183,6 @@ elif sys.argv[1] == "set-copyright" :
file = sys.argv[2]
set_or_update_copyright(file)
else :
- print "Unknown command: " + sys.argv[1]
+ print("Unknown command: " + sys.argv[1])
print_help()
sys.exit(-1)
diff --git a/BuildTools/CrashReportAnalysis/WindowsMinidumpAnalyse.py b/BuildTools/CrashReportAnalysis/WindowsMinidumpAnalyse.py
index dada920..19e5f87 100644
--- a/BuildTools/CrashReportAnalysis/WindowsMinidumpAnalyse.py
+++ b/BuildTools/CrashReportAnalysis/WindowsMinidumpAnalyse.py
@@ -3,7 +3,7 @@
# ----
# This script requires:
# - cdb, the Windows command line debugger installed and available in PATH.
-# - the SWIFT_DIST environment variable set to a locatioon that contains msi and pdb.gz files.
+# - the SWIFT_DIST environment variable set to a location that contains msi and pdb.gz files.
import sys
from subprocess import call
@@ -19,11 +19,11 @@ import time
swiftWindowBuildsPathPrefix = os.getenv("SWIFT_DIST")
if swiftWindowBuildsPathPrefix == None :
- print "Please set the SWIFT_DIST environment variable to a location containing msi and pdb.gz files."
+ print("Please set the SWIFT_DIST environment variable to a location containing msi and pdb.gz files.")
sys.exit(1)
if len(sys.argv) != 3:
- print "Usage: python WindowsMinidumpAnalyse.py VERSION MINIDUMP_FILE"
+ print("Usage: python WindowsMinidumpAnalyse.py VERSION MINIDUMP_FILE")
sys.exit(1)
version = sys.argv[1]
@@ -93,7 +93,7 @@ def printHumanReadableReport():
try:
shutil.rmtree(working_folder)
except:
- print ""
+ print("")
# clone local git repository into dedicated directory
call(["git", "clone", ".", working_folder], shell=True)
@@ -120,7 +120,7 @@ assert(len(commit) > 0)
if not os.path.exists(symbol_cache_path):
os.makedirs(symbol_cache_path)
-#print "Checking out commit {0}.".format(commit)
+#print("Checking out commit {0}.".format(commit))
call(["git", "-C", working_folder, "checkout", commit])
os.chdir(working_folder)
diff --git a/BuildTools/DocBook/SCons/DocBook.py b/BuildTools/DocBook/SCons/DocBook.py
index ffb0bfc..d7c95ba 100644
--- a/BuildTools/DocBook/SCons/DocBook.py
+++ b/BuildTools/DocBook/SCons/DocBook.py
@@ -5,6 +5,19 @@
import SCons.Util, SCons.Action
import xml.dom.minidom, re, os.path, sys
+def maybeBytesToString(s):
+ if isinstance(s, bytes):
+ return s.decode('utf-8')
+ return s
+
+def prepareForWrite(s):
+ try:
+ if isinstance(s, unicode):
+ return s.encode('utf-8')
+ except NameError:
+ pass
+ return s
+
def generate(env) :
# Location of stylesheets and catalogs
docbook_dir = "#/BuildTools/DocBook"
@@ -32,15 +45,15 @@ def generate(env) :
rewritePrefix="%(docbook_xsl_dir)s/" />
</catalog>"""
- docbook_xml_dir = source[0].get_contents()
- docbook_xsl_dir = source[1].get_contents()
+ docbook_xml_dir = maybeBytesToString(source[0].get_contents())
+ docbook_xsl_dir = maybeBytesToString(source[1].get_contents())
if env["PLATFORM"] == "win32" :
docbook_xml_dir = docbook_xml_dir.replace("\\","/")
docbook_xsl_dir = docbook_xsl_dir.replace("\\","/")
file = open(target[0].abspath, "w")
file.write(catalog % {
- "docbook_xml_dir" : docbook_xml_dir,
- "docbook_xsl_dir" : docbook_xsl_dir,
+ "docbook_xml_dir" : prepareForWrite(docbook_xml_dir),
+ "docbook_xsl_dir" : prepareForWrite(docbook_xsl_dir),
})
file.close()
diff --git a/BuildTools/DocBook/SCons/XSLT.py b/BuildTools/DocBook/SCons/XSLT.py
index 38e36c5..6a40b62 100644
--- a/BuildTools/DocBook/SCons/XSLT.py
+++ b/BuildTools/DocBook/SCons/XSLT.py
@@ -8,7 +8,7 @@ import xml.dom.minidom, os, os.path
def generate(env) :
def generate_actions(source, target, env, for_signature) :
if not env.has_key("XSLTSTYLESHEET") :
- raise SCons.Errors.UserError, "The XSLTSTYLESHEET construction variable must be defined"
+ raise SCons.Errors.UserError("The XSLTSTYLESHEET construction variable must be defined")
# Process the XML catalog files
# FIXME: It's probably not clean to do an ENV assignment globally
diff --git a/BuildTools/FixIncludes.py b/BuildTools/FixIncludes.py
index 8984944..e532464 100755
--- a/BuildTools/FixIncludes.py
+++ b/BuildTools/FixIncludes.py
@@ -153,12 +153,12 @@ for line in content[headerStart:headerEnd]:
headerGroups[headerType] = [line]
if containsComplexPreprocessorDirectives:
- print "Cannot format headers containing preprocessor #if, #pragma, #define or #undef statements!"
+ print("Cannot format headers containing preprocessor #if, #pragma, #define or #undef statements!")
exit(1)
if filename_base.endswith(".h"):
if not HeaderType.PRAGMA_ONCE in headerGroups:
- print "Missing #pragma once!"
+ print("Missing #pragma once!")
exit(2)
cleanHeaderFile(content, headerStart, headerEnd, headerGroups)
elif filename_base.endswith(".cpp") or filename_base.endswith(".mm"):
diff --git a/BuildTools/GenerateAppCastFeeds.py b/BuildTools/GenerateAppCastFeeds.py
index 8135134..e7493df 100755
--- a/BuildTools/GenerateAppCastFeeds.py
+++ b/BuildTools/GenerateAppCastFeeds.py
@@ -148,6 +148,6 @@ writeAppcastFile(filename=os.path.join(args.outputFolder, "swift-testing-appcast
writeAppcastFile(filename=os.path.join(args.outputFolder, "swift-development-appcast-mac.xml"),
title="Swift Development Releases",
description="",
- regexPattern="^\d+(\.\d+)?(\.\d+)?(alpha)?(beta\d+)?(rc\d+)?(-dev\d+)?$",
+ regexPattern="^\d+(\.\d+)?(\.\d+)?(alpha\d*)?(beta\d+)?(rc\d+)?(-dev\d+)?$",
appcastURL=urlparse.urljoin(args.downloadsURL, "swift-development-appcast-mac.xml"),
releases=automaticReleases)
diff --git a/BuildTools/GetBuildVersion.py b/BuildTools/GetBuildVersion.py
index 70fdc5c..be7cc03 100755
--- a/BuildTools/GetBuildVersion.py
+++ b/BuildTools/GetBuildVersion.py
@@ -16,6 +16,6 @@ if only_major :
if version_match :
print version_match.group(1)
else :
- print "0"
+ print("0")
else :
print Version.getBuildVersion(os.path.dirname(sys.argv[0]) + "/..", sys.argv[1])
diff --git a/BuildTools/Gource/GetGravatars.py b/BuildTools/Gource/GetGravatars.py
index d1f40a4..17198aa 100755
--- a/BuildTools/Gource/GetGravatars.py
+++ b/BuildTools/Gource/GetGravatars.py
@@ -5,7 +5,7 @@ import subprocess, os, sys, hashlib, urllib
GRAVATAR_URL = "http://www.gravatar.com/avatar/%(id)s?d=404"
if len(sys.argv) != 2 :
- print "Usage: " + sys.argv[0] + " <output-dir>"
+ print("Usage: " + sys.argv[0] + " <output-dir>")
sys.exit(-1)
output_dir = sys.argv[1]
@@ -18,32 +18,32 @@ for line in p.stdout.readlines() :
authors[author_components[0]] = author_components[1]
p.stdin.close()
if p.wait() != 0 :
- print "Error"
+ print("Error")
sys.exit(-1)
# Get & save the avatars
if not os.path.isdir(output_dir) :
os.makedirs(output_dir)
for email, name in authors.items() :
- print "Processing avatar for " + name + " <" + email + ">"
+ print("Processing avatar for " + name + " <" + email + ">")
filename = os.path.join(output_dir, name + ".png")
if os.path.isfile(filename) :
- print "-> Already there. Skipping."
+ print("-> Already there. Skipping.")
continue
m = hashlib.md5()
m.update(email)
url = GRAVATAR_URL % {"id" : m.hexdigest()}
- print "- Downloading " + url
+ print("- Downloading " + url)
f = urllib.urlopen(url)
input = None
if f.getcode() == 200 :
input = f.read()
f.close()
if input :
- print "- Saving file " + filename
+ print("- Saving file " + filename)
f = open(filename, "w")
f.write(input)
f.close()
else :
- print "- No Gravatar found"
+ print("- No Gravatar found")
diff --git a/BuildTools/InstallSwiftDependencies.sh b/BuildTools/InstallSwiftDependencies.sh
index 378f141..438e395 100755
--- a/BuildTools/InstallSwiftDependencies.sh
+++ b/BuildTools/InstallSwiftDependencies.sh
@@ -4,14 +4,14 @@
SYSTEM_NAME=$(uname)
-if [ "$SYSTEM_NAME" == "Linux" ]
+if [ "$SYSTEM_NAME" == "Linux" ]
then
# handle linux distributions
SYSTEM_DISTRO=$(lsb_release -i -s)
if [ "$SYSTEM_DISTRO" == "Debian" ]
then
sudo apt-get install build-essential pkg-config libssl-dev qt5-default libqt5x11extras5-dev libqt5webkit5-dev qtmultimedia5-dev qttools5-dev-tools qt5-image-formats-plugins libqt5svg5-dev libminiupnpc-dev libnatpmp-dev libhunspell-dev
- elif [ "$SYSTEM_DISTRO" == "Ubuntu" ] || [ "$SYSTEM_DISTRO" == "LinuxMint" ]
+ elif [ "$SYSTEM_DISTRO" == "Ubuntu" ] || [ "$SYSTEM_DISTRO" == "LinuxMint" ] || [ "$SYSTEM_DISTRO" == "neon" ]
then
sudo apt-get install build-essential pkg-config libssl-dev qt5-default libqt5x11extras5-dev libqt5webkit5-dev qtmultimedia5-dev qttools5-dev-tools qt5-image-formats-plugins libqt5svg5-dev libminiupnpc-dev libnatpmp-dev libhunspell-dev
elif [ "$SYSTEM_DISTRO" == "Arch" ]
diff --git a/BuildTools/ProjectCopyrightSummary.py b/BuildTools/ProjectCopyrightSummary.py
index 6e2d824..f6b18a0 100755
--- a/BuildTools/ProjectCopyrightSummary.py
+++ b/BuildTools/ProjectCopyrightSummary.py
@@ -17,7 +17,7 @@ def CopyrightNames(filename):
names = []
with open(filename, 'r') as file:
data = file.read()
- p = re.compile(ur'\* Copyright.*\d\d\d\d (.*?)\.?$', re.MULTILINE)
+ p = re.compile(r'\* Copyright.*\d\d\d\d (.*?)\.?$', re.MULTILINE)
names = re.findall(p, data)
return names
diff --git a/BuildTools/SCons/SConscript.boot b/BuildTools/SCons/SConscript.boot
index fc943f7..7b29c06 100644
--- a/BuildTools/SCons/SConscript.boot
+++ b/BuildTools/SCons/SConscript.boot
@@ -37,7 +37,8 @@ if os.name == "mac" or (os.name == "posix" and os.uname()[0] == "Darwin"):
vars.Add(BoolVariable("mac105", "Link against the 10.5 frameworks", "no"))
vars.Add(BoolVariable("mac106", "Link against the 10.6 frameworks", "no"))
if os.name == "nt" :
- vars.Add(PathVariable("vcredist", "MSVC redistributable dir", None, PathVariable.PathAccept))
+ vars.Add(PathVariable("vcredist", "MSVC redistributable path", None, PathVariable.PathAccept))
+ vars.Add(PathVariable("vcredistdir", "MSVC redistributable dir", None, PathVariable.PathAccept))
if os.name == "nt" :
vars.Add(PathVariable("wix_bindir", "Path to WiX binaries", "", PathVariable.PathAccept))
if os.name == "nt" :
@@ -53,6 +54,7 @@ vars.Add(PathVariable("boost_includedir", "Boost headers location", None, PathVa
vars.Add(PathVariable("boost_libdir", "Boost library location", None, PathVariable.PathAccept))
vars.Add(BoolVariable("boost_bundled_enable", "Allow use of bundled Boost as last resort", "true"))
vars.Add(BoolVariable("boost_force_bundled", "Force use of bundled Boost.", False))
+vars.Add(BoolVariable("allow_boost_1_64", "Allow use of Boost 1.64", False))
vars.Add(PathVariable("zlib_includedir", "Zlib headers location", None, PathVariable.PathAccept))
vars.Add(PathVariable("zlib_libdir", "Zlib library location", None, PathVariable.PathAccept))
vars.Add(PathVariable("zlib_libfile", "Zlib library file (full path to file)", None, PathVariable.PathAccept))
@@ -106,10 +108,12 @@ vars.Add(BoolVariable("enable_variants", "Build in a separate dir under build/,
vars.Add(BoolVariable("experimental_ft", "Build experimental file transfer", "yes"))
vars.Add(BoolVariable("experimental", "Build experimental features", "no"))
vars.Add(BoolVariable("set_iterator_debug_level", "Set _ITERATOR_DEBUG_LEVEL=0", "yes"))
+vars.Add(EnumVariable("msvc_runtime", "Choose MSVC runtime library", "MD", ["MT", "MTd", "MD", "MDd"]))
vars.Add(BoolVariable("unbound", "Build bundled ldns and unbound. Use them for DNS lookup.", "no"))
vars.Add(BoolVariable("check_headers", "Independently build compilation units for all Swiften headers for detecting missing dependencies.", "no"))
vars.Add("win_target_arch", "Target architecture for Windows builds. x86 for 32-bit (default) or x86_64 for 64-bit.", "x86")
vars.Add(BoolVariable("install_git_hooks", "Install git hooks", "true"))
+vars.Add(BoolVariable("help2man", "Run help2man to geneate man pages", "false"))
# Code Signing Options
vars.Add("codesign_identity", "macOS code signing identity to be passed to codesign when building the distribution package. Must match the Commen Name of the Subject of the code signing certificate.", "")
@@ -128,6 +132,7 @@ env_ENV = {
'PATH' : os.environ['PATH'],
'LD_LIBRARY_PATH' : os.environ.get("LD_LIBRARY_PATH", ""),
'TERM' : os.environ.get("TERM", ""),
+ 'SDKROOT' : os.environ.get("SDKROOT", ""),
}
if "MSVC_VERSION" in ARGUMENTS :
@@ -273,11 +278,13 @@ if env["debug"] :
if env["set_iterator_debug_level"] :
env.Append(CPPDEFINES = ["_ITERATOR_DEBUG_LEVEL=0"])
env.Append(LINKFLAGS = ["/OPT:NOREF"])
- env.Append(CCFLAGS = ["/MD"])
else :
env.Append(CCFLAGS = ["-g"])
-elif env["PLATFORM"] == "win32" :
- env.Append(CCFLAGS = ["/MD"])
+
+if env["PLATFORM"] == "win32" :
+ env.AppendUnique(CCFLAGS = ["/{}".format(env.get("msvc_runtime"))])
+ # debug builds against debug MSVC runtime can cause some more sections in the object file
+ env.AppendUnique(CCFLAGS = ["/bigobj"])
if env.get("universal", 0) :
assert(env["PLATFORM"] == "darwin")
@@ -426,6 +433,8 @@ for path in ["SWIFT_INSTALLDIR", "SWIFTEN_INSTALLDIR", "SLUIFT_INSTALLDIR"] :
env[path] = Dir(ARGUMENTS[path]).abspath
else :
env[path] = Dir("#/" + ARGUMENTS[path]).abspath
+if ARGUMENTS.get("SWIFTEN_LIBDIR", "") :
+ env["SWIFTEN_LIBDIR"] = ARGUMENTS["SWIFTEN_LIBDIR"]
################################################################################
diff --git a/BuildTools/SCons/SConstruct b/BuildTools/SCons/SConstruct
index 2c2d629..78f388b 100644
--- a/BuildTools/SCons/SConstruct
+++ b/BuildTools/SCons/SConstruct
@@ -7,9 +7,9 @@ root = Dir("../..").abspath
# Override SConscript to handle tests
oldSConscript = SConscript
-def SConscript(*arguments, **keywords) :
- if not keywords.get("test_only", False) or env["TEST"] :
- return apply(oldSConscript, arguments, keywords)
+def SConscript(*args, **kwargs) :
+ if not kwargs.get("test_only", False) or env["TEST"] :
+ return oldSConscript(*args, **kwargs)
env.SConscript = SConscript
################################################################################
@@ -142,11 +142,11 @@ conf = Configure(conf_env, custom_tests = {
})
if not conf.CheckCXX() or not conf.CheckCC() :
- print "Error: You need a working compiler"
+ print("Error: You need a working compiler")
Exit(1)
if not conf.CheckCpp11Support() :
- print "Error: You need a compiler with support for the C++11 standard"
+ print("Error: You need a compiler with support for the C++11 standard")
Exit(1)
@@ -170,7 +170,7 @@ if (not zlib_okay) and conf.CheckLib("z") :
if zlib_okay :
env["ZLIB_FLAGS"] = zlib_flags
elif not env.get("zlib_bundled_enable", True) :
- print "Error: Zlib not found and zlib_bundled_enable is false"
+ print("Error: Zlib not found and zlib_bundled_enable is false")
Exit(1)
else :
env["ZLIB_BUNDLED"] = True
@@ -238,10 +238,16 @@ if not env.get("boost_force_bundled") and allLibsPresent :
# FIXME: Remove this workaround when UUID is available in most distros
env["BOOST_BUNDLED_UUID_ONLY"] = True
elif not env.get("boost_bundled_enable", True) :
- print "Error: Boost not found and boost_bundled_enable is false"
+ print("Error: Boost not found and boost_bundled_enable is false")
Exit(1)
else :
env["BOOST_BUNDLED"] = True
+boost_version = GetVersion(conf, "BOOST_VERSION", "boost/version.hpp")
+if boost_version == 106400 :
+ #Version 1.64 has some issues with the serialization of boost::optional, see https://svn.boost.org/trac10/ticket/13050
+ env["BOOST_1_64_DETECTED"] = True
+else:
+ env["BOOST_1_64_DETECTED"] = False
conf.Finish()
@@ -367,7 +373,7 @@ if env.get("try_expat", True) and not env.get("HAVE_LIBXML",0) :
# Bundled expat
bundledExpat = False
if not env.get("HAVE_EXPAT", 0) and not env.get("HAVE_LIBXML", 0) :
- print "Expat or LibXML not found. Using bundled Expat"
+ print("Expat or LibXML not found. Using bundled Expat")
SConscript("#/3rdParty/Expat/SConscript")
env["HAVE_EXPAT"] = 1
env["EXPAT_BUNDLED"] = True
@@ -418,10 +424,10 @@ if not env.get("HAVE_ICU", False) and not env.get("HAVE_LIBIDN", False) :
env["HAVE_LIBIDN"] = 1
env["LIBIDN_BUNDLED"] = 1
elif env.get("need_idn", True):
- print "Error: ICU and LIBIDN not found, and libidn_bundled_enable is false"
+ print("Error: ICU and LIBIDN not found, and libidn_bundled_enable is false")
Exit(1)
else:
- print "Proceeding without an IDN library because need_idn was false. This will break all internal binaries"
+ print("Proceeding without an IDN library because need_idn was false. This will break all internal binaries")
# Unbound
if env["unbound"] :
@@ -508,7 +514,7 @@ if not env.get("lua_force_bundled", False) and conf.CheckLibWithHeader(env["lua_
if lua_version > 0 :
env["LUA_FLAGS"]["LUA_VERSION"] = str(lua_version // 100) + "." + str(lua_version % 100)
else :
- print "Warning: Unable to determine Lua version. Not installing Lua libraries."
+ print("Warning: Unable to determine Lua version. Not installing Lua libraries.")
env["LUA_FLAGS"].update(lua_flags)
else :
env["LUA_BUNDLED"] = 1
@@ -548,6 +554,10 @@ conf.Finish()
if env["qt"] :
env["QTDIR"] = env["qt"]
+if env["PLATFORM"] == "win32" :
+ systemIncludeFlag = "/I"
+else:
+ systemIncludeFlag = "-isystem"
################################################################################
# TLS backend selection
@@ -577,9 +587,9 @@ elif env.get("tls_backend") == "openssl" :
openssl_include = env.get("openssl_include")
openssl_libdir = env.get("openssl_libdir")
if openssl_include:
- openssl_flags = {"CPPPATH":[openssl_include]}
+ openssl_flags = { "CPPFLAGS": [systemIncludeFlag + openssl_include]}
else:
- openssl_flags = { "CPPPATH": [os.path.join(openssl_prefix, "include")] }
+ openssl_flags = { "CPPFLAGS": [systemIncludeFlag + os.path.join(openssl_prefix, "include")] }
if openssl_libdir:
openssl_flags["LIBPATH"] = [openssl_libdir]
env["OPENSSL_DIR"] = openssl_prefix
@@ -660,7 +670,7 @@ try :
except SCons.Errors.StopError:
env["HAVE_QT"] = False
except Exception as e:
- print "Info: %s" % str(e)
+ print("Info: %s" % str(e))
env["HAVE_QT"] = False
################################################################################
@@ -682,7 +692,7 @@ try:
if not env.GetOption("clean") and env.get("install_git_hooks", True) :
env.Install("#/.git/hooks", Glob("#/BuildTools/Git/Hooks/*"))
except TypeError:
- print "You seem to be using Swift in a Git submodule. Not installing hooks."
+ print("You seem to be using Swift in a Git submodule. Not installing hooks.")
################################################################################
@@ -697,6 +707,8 @@ if ARGUMENTS.get("replace_pragma_once", False) :
return path[i+1:]
for actual_root, dirs, files in os.walk(root) :
+ dirs.sort()
+ files.sort()
if "3rdParty" in actual_root :
continue
for file in files :
@@ -723,14 +735,14 @@ if ARGUMENTS.get("dump_trace", False) :
# Modules
modules = []
if os.path.isdir(Dir("#/3rdParty").abspath) :
- for dir in os.listdir(Dir("#/3rdParty").abspath) :
+ for dir in sorted(os.listdir(Dir("#/3rdParty").abspath)) :
full_dir = os.path.join(Dir("#/3rdParty").abspath, dir)
if not os.path.isdir(full_dir) :
continue
sconscript = os.path.join(full_dir, "SConscript")
if os.path.isfile(sconscript) :
modules.append("3rdParty/" + dir)
-for dir in os.listdir(Dir("#").abspath) :
+for dir in sorted(os.listdir(Dir("#").abspath)) :
full_dir = os.path.join(Dir("#").abspath, dir)
if not os.path.isdir(full_dir) :
continue
@@ -746,7 +758,7 @@ modules.append("QA")
env["PROJECTS"] = [m for m in modules if m not in ["Documentation", "QA", "SwifTools"] and not m.startswith("3rdParty")]
for stage in ["flags", "build"] :
env["SCONS_STAGE"] = stage
- SConscript(dirs = map(lambda x : root + "/" + x, modules))
+ SConscript(dirs = list(map(lambda x : root + "/" + x, modules)))
# SLOCCount
if ARGUMENTS.get("sloccount", False) :
@@ -758,9 +770,9 @@ if ARGUMENTS.get("sloccount", False) :
# Print summary
################################################################################
-print
-print " Build Configuration"
-print " -------------------"
+print("")
+print(" Build Configuration")
+print(" -------------------")
parsers = []
if env.get("HAVE_LIBXML", 0):
@@ -769,15 +781,14 @@ if env.get("HAVE_EXPAT", 0):
parsers.append("Expat")
if env.get("EXPAT_BUNDLED", False) :
parsers.append("(Bundled)")
-print " Projects: " + ' '.join(env["PROJECTS"])
-print ""
-print " XML Parsers: " + ' '.join(parsers)
+print(" Projects: " + ' '.join(env["PROJECTS"]))
+print("")
+print(" XML Parsers: " + ' '.join(parsers))
-print " TLS Support: " + (env.get("HAVE_OPENSSL",0) and "OpenSSL" or env.get("HAVE_SECURETRANSPORT",0) and "Secure Transport" or env.get("HAVE_SCHANNEL", 0) and "Schannel" or "Disabled")
-print " DNSSD Support: " + (env.get("HAVE_BONJOUR") and "Bonjour" or (env.get("HAVE_AVAHI") and "Avahi" or "Disabled"))
-print
+print(" TLS Support: " + (env.get("HAVE_OPENSSL",0) and "OpenSSL" or env.get("HAVE_SECURETRANSPORT",0) and "Secure Transport" or env.get("HAVE_SCHANNEL", 0) and "Schannel" or "Disabled"))
+print(" DNSSD Support: " + (env.get("HAVE_BONJOUR") and "Bonjour" or (env.get("HAVE_AVAHI") and "Avahi" or "Disabled")))
+print("")
if not GetOption("help") and not env.get("HAVE_OPENSSL", 0) and not env.get("HAVE_SCHANNEL", 0) and not env.get("HAVE_SECURETRANSPORT", 0):
- print "Error: A working TLS backend is required. Please check the documentation for more information."
+ print("Error: A working TLS backend is required. Please check the documentation for more information.")
Exit(1)
-
diff --git a/BuildTools/SCons/Tools/AppBundle.py b/BuildTools/SCons/Tools/AppBundle.py
index 337e83f..31cfef1 100644
--- a/BuildTools/SCons/Tools/AppBundle.py
+++ b/BuildTools/SCons/Tools/AppBundle.py
@@ -34,7 +34,7 @@ def generate(env) :
"""
for key, value in infoDict.items() :
plist += "<key>" + key + "</key>\n"
- plist += "<string>" + value.encode("utf-8") + "</string>\n"
+ plist += "<string>" + value + "</string>\n"
if handlesXMPPURIs :
plist += """<key>CFBundleURLTypes</key>
<array>
@@ -50,7 +50,7 @@ def generate(env) :
if sparklePublicDSAKey :
plist += "<key>SUPublicDSAKeyFile</key>"
- plist += "<string>" + sparklePublicDSAKey.name.encode("utf-8") + "</string>"
+ plist += "<string>" + sparklePublicDSAKey.name + "</string>"
env.Install(resourcesDir, sparklePublicDSAKey)
plist += """</dict>
</plist>
diff --git a/BuildTools/SCons/Tools/InstallWithSymLinks.py b/BuildTools/SCons/Tools/InstallWithSymLinks.py
index 23d12ed..4955192 100644
--- a/BuildTools/SCons/Tools/InstallWithSymLinks.py
+++ b/BuildTools/SCons/Tools/InstallWithSymLinks.py
@@ -74,21 +74,21 @@ def scons_copytree(src, dst, symlinks=False):
else:
shutil.copy2(srcname, dstname)
# XXX What about devices, sockets etc.?
- except (IOError, os.error), why:
+ except (IOError, os.error) as why:
errors.append((srcname, dstname, str(why)))
# catch the CopytreeError from the recursive copytree so that we can
# continue with other files
- except CopytreeError, err:
+ except CopytreeError as err:
errors.extend(err.args[0])
try:
shutil.copystat(src, dst)
except WindowsError:
# can't copy file access times on Windows
pass
- except OSError, why:
+ except OSError as why:
errors.extend((src, dst, str(why)))
if errors:
- raise CopytreeError, errors
+ raise CopytreeError(errors)
def symlinkBuilderImpl(target, source, env):
diff --git a/BuildTools/SCons/Tools/WindowsBundle.py b/BuildTools/SCons/Tools/WindowsBundle.py
index 20d41ff..9781deb 100644
--- a/BuildTools/SCons/Tools/WindowsBundle.py
+++ b/BuildTools/SCons/Tools/WindowsBundle.py
@@ -33,9 +33,13 @@ def generate(env) :
mappings = []
- p = re.compile(ur'"([^\"]*)" "([^\"]*)"')
+ regex = re.compile(r'"([^\"]*)" "([^\"]*)"')
+
+ if SCons.Util.PY3:
+ matches = re.findall(regex, stdout.decode('utf8'))
+ else:
+ matches = re.findall(regex, stdout)
- matches = re.findall(p, stdout)
for match in matches:
mappings.append(match)
return mappings
@@ -83,8 +87,21 @@ def generate(env) :
qtmappings = captureWinDeployQtMapping()
assert(qtmappings)
+ # Add QtWebKit dependencies.
+ # This is needed as QtWebKit since 5.6 is developed and released seperately
+ # of Qt and windeployqt does not know about its dependencies anymore.
+ for map_from, map_to in qtmappings:
+ if map_to == "Qt5WebKit.dll":
+ # hidden Qt5WebKit dependencies
+ hidden_dependencies = ["libxml2.dll", "libxslt.dll"]
+ for dependency in hidden_dependencies:
+ dependency_from_path = os.path.join(env["QTDIR"], "bin", dependency)
+ if os.path.isfile(dependency_from_path):
+ qtmappings.append((dependency_from_path, dependency))
+ break
+
# handle core DLLs
- qt_corelib_regex = re.compile(ur".*bin.*\\(.*)\.dll")
+ qt_corelib_regex = re.compile(r".*bin.*\\(.*)\.dll")
for qtlib in qtlibs:
if qtlib.startswith("Qt5"):
@@ -98,7 +115,7 @@ def generate(env) :
all_files += env.Install(bundle, src_path)
# handle plugins
- qt_plugin_regex = re.compile(ur".*plugins.*\\(.*)\\(.*)\.dll")
+ qt_plugin_regex = re.compile(r".*plugins.*\\(.*)\\(.*)\.dll")
for (src_path, target_path) in qtmappings:
if qt_plugin_regex.match(src_path):
plugin_folder, filename = qt_plugin_regex.match(src_path).groups()
@@ -119,4 +136,3 @@ def generate(env) :
def exists(env) :
return env["PLATFORM"] == "win32"
-
diff --git a/BuildTools/SCons/Tools/qt4.py b/BuildTools/SCons/Tools/qt4.py
index d5c14e2..372b261 100644
--- a/BuildTools/SCons/Tools/qt4.py
+++ b/BuildTools/SCons/Tools/qt4.py
@@ -37,6 +37,7 @@ __revision__ = "/home/scons/scons/branch.0/branch.96/baseline/src/engine/SCons/T
import os.path
import re
import subprocess
+from string import Template
import SCons.Action
import SCons.Builder
@@ -129,7 +130,9 @@ class _Automoc:
# The following is kind of hacky to get builders working properly (FIXME)
objBuilderEnv = objBuilder.env
- objBuilder.env = env
+ objBuilder.env = env.Clone()
+ if os.path.basename(objBuilder.env ["CXX"]).startswith(("gcc", "clang")):
+ objBuilder.env.Append(CXXFLAGS = "-w")
mocBuilderEnv = env.Moc4.env
env.Moc4.env = env
@@ -137,23 +140,23 @@ class _Automoc:
out_sources = source[:]
for obj in source:
- if isinstance(obj,basestring): # big kludge!
- print "scons: qt4: '%s' MAYBE USING AN OLD SCONS VERSION AND NOT CONVERTED TO 'File'. Discarded." % str(obj)
+ if isinstance(obj,str): # big kludge!
+ print("scons: qt4: '%s' MAYBE USING AN OLD SCONS VERSION AND NOT CONVERTED TO 'File'. Discarded." % str(obj))
continue
if not obj.has_builder():
# binary obj file provided
if debug:
- print "scons: qt: '%s' seems to be a binary. Discarded." % str(obj)
+ print("scons: qt: '%s' seems to be a binary. Discarded." % str(obj))
continue
cpp = obj.sources[0]
if not splitext(str(cpp))[1] in cxx_suffixes:
if debug:
- print "scons: qt: '%s' is no cxx file. Discarded." % str(cpp)
+ print("scons: qt: '%s' is no cxx file. Discarded." % str(cpp) )
# c or fortran source
continue
#cpp_contents = comment.sub('', cpp.get_contents())
try:
- cpp_contents = cpp.get_contents()
+ cpp_contents = str(cpp.get_contents())
except: continue # may be an still not generated source
h=None
for h_ext in header_extensions:
@@ -163,12 +166,12 @@ class _Automoc:
h = find_file(hname, (cpp.get_dir(),), env.File)
if h:
if debug:
- print "scons: qt: Scanning '%s' (header of '%s')" % (str(h), str(cpp))
+ print("scons: qt: Scanning '%s' (header of '%s')" % (str(h), str(cpp)))
#h_contents = comment.sub('', h.get_contents())
- h_contents = h.get_contents()
+ h_contents = str(h.get_contents())
break
if not h and debug:
- print "scons: qt: no header for '%s'." % (str(cpp))
+ print("scons: qt: no header for '%s'." % (str(cpp)))
if h and q_object_search.search(h_contents):
# h file with the Q_OBJECT macro found -> add moc_cpp
moc_cpp = env.Moc4(h)
@@ -176,14 +179,14 @@ class _Automoc:
out_sources.append(moc_o)
#moc_cpp.target_scanner = SCons.Defaults.CScan
if debug:
- print "scons: qt: found Q_OBJECT macro in '%s', moc'ing to '%s'" % (str(h), str(moc_cpp))
+ print("scons: qt: found Q_OBJECT macro in '%s', moc'ing to '%s'" % (str(h), str(moc_cpp)))
if cpp and q_object_search.search(cpp_contents):
# cpp file with Q_OBJECT macro found -> add moc
# (to be included in cpp)
moc = env.Moc4(cpp)
env.Ignore(moc, moc)
if debug:
- print "scons: qt: found Q_OBJECT macro in '%s', moc'ing to '%s'" % (str(cpp), str(moc))
+ print("scons: qt: found Q_OBJECT macro in '%s', moc'ing to '%s'" % (str(cpp), str(moc)))
#moc.source_scanner = SCons.Defaults.CScan
# restore the original env attributes (FIXME)
objBuilder.env = objBuilderEnv
@@ -344,7 +347,7 @@ def generate(env):
else:
result.append(itemPath)
return result
- contents = node.get_contents()
+ contents = str(node.get_contents())
includes = [included[1] for included in qrcinclude_re.findall(contents)]
qrcpath = os.path.dirname(node.path)
dirs = [included for included in includes if os.path.isdir(os.path.join(qrcpath,included))]
@@ -368,8 +371,30 @@ def generate(env):
env.Append( BUILDERS = { 'Qrc': qrcbuilder } )
# Interface builder
+ def addDisableWarningsPragmaToFile(target, source, env):
+ assert( len(target) == 1 )
+ assert( len(source) == 1 )
+ srcf = str(source[0])
+ dstf = str(target[0])
+ with open(dstf, 'r+') as uiHeader:
+ data=uiHeader.read()
+
+ template = Template(
+"""#pragma once
+#pragma warning(push, 0)
+#pragma GCC system_header
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wall"
+$uiheadertext
+#pragma clang diagnostic pop
+#pragma warning(pop)
+""")
+ uiHeader.seek(0)
+ uiHeader.write(template.substitute(uiheadertext=data))
+ uiHeader.truncate()
+
uic4builder = Builder(
- action = SCons.Action.Action('$QT4_UICCOM', cmdstr = '$QT4_UICCOMSTR'),
+ action = [SCons.Action.Action('$QT4_UICCOM', cmdstr = '$QT4_UICCOMSTR'), SCons.Action.Action(addDisableWarningsPragmaToFile, None)],
src_suffix='$QT4_UISUFFIX',
suffix='$QT4_UICDECLSUFFIX',
prefix='$QT4_UICDECLPREFIX',
diff --git a/BuildTools/SCons/Tools/textfile.py b/BuildTools/SCons/Tools/textfile.py
deleted file mode 100644
index 89f8963..0000000
--- a/BuildTools/SCons/Tools/textfile.py
+++ /dev/null
@@ -1,175 +0,0 @@
-# -*- python -*-
-#
-# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 The SCons Foundation
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-
-__doc__ = """
-Textfile/Substfile builder for SCons.
-
- Create file 'target' which typically is a textfile. The 'source'
- may be any combination of strings, Nodes, or lists of same. A
- 'linesep' will be put between any part written and defaults to
- os.linesep.
-
- The only difference between the Textfile builder and the Substfile
- builder is that strings are converted to Value() nodes for the
- former and File() nodes for the latter. To insert files in the
- former or strings in the latter, wrap them in a File() or Value(),
- respectively.
-
- The values of SUBST_DICT first have any construction variables
- expanded (its keys are not expanded). If a value of SUBST_DICT is
- a python callable function, it is called and the result is expanded
- as the value. Values are substituted in a "random" order; if any
- substitution could be further expanded by another subsitition, it
- is unpredictible whether the expansion will occur.
-"""
-
-__revision__ = "src/engine/SCons/Tool/textfile.py 5357 2011/09/09 21:31:03 bdeegan"
-
-import SCons
-
-import os
-import re
-
-from SCons.Node import Node
-from SCons.Node.Python import Value
-from SCons.Util import is_String, is_Sequence, is_Dict
-
-def _do_subst(node, subs):
- """
- Fetch the node contents and replace all instances of the keys with
- their values. For example, if subs is
- {'%VERSION%': '1.2345', '%BASE%': 'MyProg', '%prefix%': '/bin'},
- then all instances of %VERSION% in the file will be replaced with
- 1.2345 and so forth.
- """
- contents = node.get_text_contents()
- if not subs: return contents
- for (k,v) in subs:
- contents = re.sub(k, v, contents)
- return contents
-
-def _action(target, source, env):
- # prepare the line separator
- linesep = env['LINESEPARATOR']
- if linesep is None:
- linesep = os.linesep
- elif is_String(linesep):
- pass
- elif isinstance(linesep, Value):
- linesep = linesep.get_text_contents()
- else:
- raise SCons.Errors.UserError(
- 'unexpected type/class for LINESEPARATOR: %s'
- % repr(linesep), None)
-
- # create a dictionary to use for the substitutions
- if 'SUBST_DICT' not in env:
- subs = None # no substitutions
- else:
- d = env['SUBST_DICT']
- if is_Dict(d):
- d = list(d.items())
- elif is_Sequence(d):
- pass
- else:
- raise SCons.Errors.UserError('SUBST_DICT must be dict or sequence')
- subs = []
- for (k,v) in d:
- if callable(v):
- v = v()
- if is_String(v):
- v = env.subst(v)
- else:
- v = str(v)
- subs.append((k,v))
-
- # write the file
- try:
- fd = open(target[0].get_path(), "wb")
- except (OSError,IOError), e:
- raise SCons.Errors.UserError("Can't write target file %s" % target[0])
- # separate lines by 'linesep' only if linesep is not empty
- lsep = None
- for s in source:
- if lsep: fd.write(lsep)
- fd.write(_do_subst(s, subs))
- lsep = linesep
- fd.close()
-
-def _strfunc(target, source, env):
- return "Creating '%s'" % target[0]
-
-def _convert_list_R(newlist, sources):
- for elem in sources:
- if is_Sequence(elem):
- _convert_list_R(newlist, elem)
- elif isinstance(elem, Node):
- newlist.append(elem)
- else:
- newlist.append(Value(elem))
-def _convert_list(target, source, env):
- if len(target) != 1:
- raise SCons.Errors.UserError("Only one target file allowed")
- newlist = []
- _convert_list_R(newlist, source)
- return target, newlist
-
-_common_varlist = ['SUBST_DICT', 'LINESEPARATOR']
-
-_text_varlist = _common_varlist + ['TEXTFILEPREFIX', 'TEXTFILESUFFIX']
-_text_builder = SCons.Builder.Builder(
- action = SCons.Action.Action(_action, _strfunc, varlist = _text_varlist),
- source_factory = Value,
- emitter = _convert_list,
- prefix = '$TEXTFILEPREFIX',
- suffix = '$TEXTFILESUFFIX',
- )
-
-_subst_varlist = _common_varlist + ['SUBSTFILEPREFIX', 'TEXTFILESUFFIX']
-_subst_builder = SCons.Builder.Builder(
- action = SCons.Action.Action(_action, _strfunc, varlist = _subst_varlist),
- source_factory = SCons.Node.FS.File,
- emitter = _convert_list,
- prefix = '$SUBSTFILEPREFIX',
- suffix = '$SUBSTFILESUFFIX',
- src_suffix = ['.in'],
- )
-
-def generate(env):
- env['LINESEPARATOR'] = os.linesep
- env['BUILDERS']['MyTextfile'] = _text_builder
- env['TEXTFILEPREFIX'] = ''
- env['TEXTFILESUFFIX'] = '.txt'
- env['BUILDERS']['MySubstfile'] = _subst_builder
- env['SUBSTFILEPREFIX'] = ''
- env['SUBSTFILESUFFIX'] = ''
-
-def exists(env):
- return 1
-
-# Local Variables:
-# tab-width:4
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/BuildTools/SCons/Tools/wix.py b/BuildTools/SCons/Tools/wix.py
index 907b6d9..986ea23 100644
--- a/BuildTools/SCons/Tools/wix.py
+++ b/BuildTools/SCons/Tools/wix.py
@@ -15,7 +15,10 @@ def generate(env) :
def WiX_IncludeScanner(source, env, path, arg):
wixIncludeRegexp = re.compile(r'^\s*\<\?include (\S+.wxs)\s*\?\>\S*', re.M)
- contents = source.get_contents()
+ if SCons.Util.PY3:
+ contents = source.get_contents().decode("utf8")
+ else:
+ contents = source.get_contents()
includes = wixIncludeRegexp.findall(contents)
return [ "" + include for include in includes ]
@@ -38,7 +41,7 @@ def generate(env) :
light_builder = SCons.Builder.Builder(
- action = '"$WIX_LIGHT" $WIX_LIGHT_OPTIONS -b "$WIX_SOURCE_OBJECT_DIR" ${SOURCES} -o ${TARGET}',
+ action = '"$WIX_LIGHT" $WIX_LIGHT_OPTIONS -b "$WIX_SOURCE_OBJECT_DIR" ${SOURCES} -loc Swift\\Packaging\\WiX\\Swift_en-us.wxl -o ${TARGET}',
src_suffix = '.wixobj',
src_builder = candle_builder)
@@ -48,4 +51,3 @@ def generate(env) :
def exists(env) :
return True
-
diff --git a/BuildTools/SCons/Version.py b/BuildTools/SCons/Version.py
index d34c2a7..23cd850 100644
--- a/BuildTools/SCons/Version.py
+++ b/BuildTools/SCons/Version.py
@@ -1,26 +1,34 @@
-import subprocess, os, datetime, re, os.path
-
-def getGitBuildVersion(root, project) :
- tag = git("describe --tags --exact --match \"" + project + "-*\"", root)
- if tag :
- return tag.rstrip()[len(project)+1:]
- tag = git("describe --tags --match \"" + project + "-*\"", root)
- if tag :
- m = re.match(project + "-(.*)-(.*)-(.*)", tag)
- if m :
- return m.group(1) + "-dev" + m.group(2)
+from __future__ import print_function
+import subprocess, os, datetime, re, os.path, sys, unittest
+
+def gitDescribeToVersion(tag, tagPrefix):
+ m = re.match(r'^' + tagPrefix + r'-(.+?)(?:-(.+?)-(.+?))?$', tag)
+ if not m:
+ return None
+ result = m.group(1)
+ if m.group(2):
+ result += "-dev" + m.group(2)
+ return result
+
+def getGitBuildVersion(root, tagPrefix) :
+ tag = git("describe --tags --match \"" + tagPrefix + "-*\"", root)
+ if tag:
+ return gitDescribeToVersion(tag, tagPrefix)
return None
-def git(cmd, root) :
+def git(cmd, root):
full_cmd = "git " + cmd
+ # Would've used with .. as p, but that's not supported by Python 2.7
p = subprocess.Popen(full_cmd, cwd=root, shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, close_fds=(os.name != "nt"))
gitVersion = p.stdout.read()
- # error = p.stderr.read()
- # if error:
- # print "Git error: " + error
- p.stdin.close()
- if p.wait() == 0 :
- return gitVersion
+ try:
+ p.stdin.close()
+ p.stdout.close()
+ p.stderr.close()
+ except:
+ pass
+ if p.wait() == 0:
+ return bytes(gitVersion).decode('utf-8')
return None
def getBuildVersion(root, project) :
@@ -37,32 +45,187 @@ def getBuildVersion(root, project) :
return datetime.date.today().strftime("%Y%m%d")
-def convertToWindowsVersion(version) :
- version_match = re.match("(\d+)\.(\d+)(.*)", version)
- major = version_match and int(version_match.group(1)) or 0
- minor = version_match and int(version_match.group(2)) or 0
- if version_match and len(version_match.group(3)) == 0 :
- patch = 60000
- else :
- match = re.match("^beta(\d+)(.*)", version_match.group(3))
- build_string = ""
- if match :
- patch = 1000*int(match.group(1))
- build_string = match.group(2)
- else :
- rc_match = re.match("^rc(\d+)(.*)", version_match.group(3))
- if rc_match :
- patch = 10000*int(rc_match.group(1))
- build_string = rc_match.group(2)
- else :
- patch = 0
- alpha_match = re.match("^alpha(.*)", version_match.group(3))
- if alpha_match :
- build_string = alpha_match.group(1)
-
- if len(build_string) > 0 :
- build_match = re.match("^-dev(\d+)", build_string)
- if build_match :
- patch += int(build_match.group(1))
+# The following conversion allows us to use version tags the format:
+# major.0
+# major.0.(0 to 9)
+#
+# Either from above followed by:
+# alpha(0 to 4)
+# beta(0 to 6)
+# rc(1 to 11)
+#
+# Followed by an optional -dev(1-65535) for off tag builds.
+def convertToWindowsVersion(version):
+ match = re.match(r"(?P<major>\d+)\.(?P<minor>\d+)\.?(?P<patch>\d+)?(?:(?P<stage>rc|beta|alpha)(?P<stage_number>\d+)?)?(?:-dev(?P<dev>\d+))?", version)
+ assert(match)
+ major, minor, patch = (0, 0, 0)
+
+ groups = match.groupdict()
+ assert(groups['major'])
+ major = int(groups['major'])
+
+ if groups['minor']:
+ assert(int(groups['minor']) == 0)
+
+ if groups['patch']:
+ assert(0 <= int(groups['patch']) <= 9)
+ minor = int(groups['patch']) * 25
+
+ stage = groups["stage"]
+ if stage:
+ stageNumber = groups['stage_number']
+ if not stageNumber or stageNumber == "":
+ stageNumber = 0
+ else:
+ stageNumber = int(stageNumber)
+
+ if stage == "alpha":
+ assert(0 <= stageNumber <= 4)
+ minor = 1 + stageNumber
+ elif stage == "beta":
+ assert(0 <= stageNumber <= 6)
+ minor = 6 + stageNumber
+ elif stage == "rc":
+ assert(1 <= stageNumber <= 11)
+ minor = 12 + stageNumber
+ else:
+ assert(False)
+ else:
+ minor = minor + 24
+ if groups['dev']:
+ patch = 1 + int(groups['dev'])
+
+ # The following constraints are set by Windows Installer framework
+ assert(0 <= major <= 255)
+ assert(0 <= minor <= 255)
+ assert(0 <= patch <= 65535)
return (major, minor, patch)
+
+# Test Windows version mapping scheme
+class TestCases(unittest.TestCase):
+ def testWindowsVersionsAreDescending(self):
+ versionStringsWithOldVersions = [
+ ("5.0rc11", None),
+ ("5.0rc1", None),
+ ("5.0beta6", None),
+ ("5.0alpha4", None),
+ ("5.0alpha2", None),
+ ("5.0alpha", None),
+ ("4.0.9", None),
+ ("4.0.1", None),
+ ("4.0", (4, 0, 60000)),
+ ("4.0rc6", (4, 0, 60000)),
+ ("4.0rc5", (4, 0, 50000)),
+ ("4.0rc4", (4, 0, 40000)),
+ ("4.0rc3", (4, 0, 30000)),
+ ('4.0rc2-dev39', (4, 0, 20039)),
+ ('4.0rc2-dev34', (4, 0, 20034)),
+ ('4.0rc2-dev33', (4, 0, 20033)),
+ ('4.0rc2-dev31', (4, 0, 20031)),
+ ('4.0rc2-dev30', (4, 0, 20030)),
+ ('4.0rc2-dev29', (4, 0, 20029)),
+ ('4.0rc2-dev27', (4, 0, 20027)),
+ ('4.0rc2', (4, 0, 20000)),
+ ('4.0rc1', (4, 0, 10000)),
+ ('4.0beta2-dev203', (4, 0, 2203)),
+ ('4.0beta2-dev195', (4, 0, 2195)),
+ ('4.0beta2-dev177', (4, 0, 2177)),
+ ('4.0beta2-dev171', (4, 0, 2171)),
+ ('4.0beta2-dev154', (4, 0, 2154)),
+ ('4.0beta2-dev150', (4, 0, 2150)),
+ ('4.0beta2-dev142', (4, 0, 2142)),
+ ('4.0beta2-dev140', (4, 0, 2140)),
+ ('4.0beta2-dev133', (4, 0, 2133)),
+ ('4.0beta2-dev118', (4, 0, 2118)),
+ ('4.0beta2-dev112', (4, 0, 2112)),
+ ('4.0beta2-dev93', (4, 0, 2093)),
+ ('4.0beta2-dev80', (4, 0, 2080)),
+ ('4.0beta2-dev72', (4, 0, 2072)),
+ ('4.0beta2-dev57', (4, 0, 2057)),
+ ('4.0beta2-dev44', (4, 0, 2044)),
+ ('4.0beta2-dev38', (4, 0, 2038)),
+ ('4.0beta2-dev29', (4, 0, 2029)),
+ ('4.0beta2-dev15', (4, 0, 2015)),
+ ('4.0beta2', (4, 0, 2000)),
+ ('4.0beta1', (4, 0, 1000)),
+ ('4.0alpha-dev80', (4, 0, 80)),
+ ('4.0alpha-dev50', (4, 0, 50)),
+ ('4.0alpha-dev43', (4, 0, 43)),
+ ('4.0alpha-dev21', (4, 0, 21)),
+ ('3.0', (3, 0, 60000)),
+ ('3.0rc3', (3, 0, 30000)),
+ ('3.0rc2', (3, 0, 20000)),
+ ('3.0rc1', (3, 0, 10000)),
+ ('3.0beta2-dev124', (3, 0, 2124)),
+ ('3.0beta2-dev81', (3, 0, 2081)),
+ ('3.0beta2-dev50', (3, 0, 2050)),
+ ('3.0beta2-dev44', (3, 0, 2044)),
+ ('3.0beta2-dev40', (3, 0, 2040)),
+ ('3.0beta2-dev26', (3, 0, 2026)),
+ ('3.0beta2', (3, 0, 2000)),
+ ('3.0beta1', (3, 0, 1000)),
+ ('3.0alpha-dev529', (3, 0, 529)),
+ ('3.0alpha-dev528', (3, 0, 528)),
+ ('3.0alpha-dev526', (3, 0, 526)),
+ ('3.0alpha-dev524', (3, 0, 524)),
+ ('3.0alpha-dev515', (3, 0, 515)),
+ ]
+ prevParsed = None
+ prevOldVersion = None
+ for string, oldVersion in versionStringsWithOldVersions:
+ parsed = convertToWindowsVersion(string)
+ if prevOldVersion and oldVersion:
+ self.assertTrue(oldVersion <= prevOldVersion, "Old version %r must come before %r" % (oldVersion, prevOldVersion))
+ if prevParsed:
+ self.assertTrue(parsed < prevParsed, "%s => %r must be smaller than %s => %r" % (string, parsed, prevString, prevParsed))
+ prevString = string
+ prevParsed = parsed
+ prevOldVersion = oldVersion
+
+ def testThatBetaIsHigherThanAlpha(self):
+ self.assertTrue(convertToWindowsVersion("3.0beta0") > convertToWindowsVersion("3.0alpha0"))
+ self.assertTrue(convertToWindowsVersion("3.0beta6") > convertToWindowsVersion("3.0alpha1"))
+ self.assertTrue(convertToWindowsVersion("3.0beta6") > convertToWindowsVersion("3.0alpha4"))
+
+ def testThatRcIsHigherThanAlphaAndBeta(self):
+ self.assertTrue(convertToWindowsVersion("3.0rc11") > convertToWindowsVersion("3.0alpha0"))
+ self.assertTrue(convertToWindowsVersion("3.0rc11") > convertToWindowsVersion("3.0alpha4"))
+ self.assertTrue(convertToWindowsVersion("3.0rc1") > convertToWindowsVersion("3.0alpha0"))
+ self.assertTrue(convertToWindowsVersion("3.0rc1") > convertToWindowsVersion("3.0alpha4"))
+ self.assertTrue(convertToWindowsVersion("3.0rc11") > convertToWindowsVersion("3.0beta0"))
+ self.assertTrue(convertToWindowsVersion("3.0rc11") > convertToWindowsVersion("3.0beta6"))
+ self.assertTrue(convertToWindowsVersion("3.0rc1") > convertToWindowsVersion("3.0beta0"))
+ self.assertTrue(convertToWindowsVersion("3.0rc1") > convertToWindowsVersion("3.0beta6"))
+
+ def testThatStableIsHigherThanAlphaAndBetaAndRc(self):
+ self.assertTrue(convertToWindowsVersion("3.0") > convertToWindowsVersion("3.0alpha0"))
+ self.assertTrue(convertToWindowsVersion("3.0") > convertToWindowsVersion("3.0alpha4"))
+ self.assertTrue(convertToWindowsVersion("3.0") > convertToWindowsVersion("3.0alpha0"))
+ self.assertTrue(convertToWindowsVersion("3.0") > convertToWindowsVersion("3.0alpha4"))
+ self.assertTrue(convertToWindowsVersion("3.0") > convertToWindowsVersion("3.0beta0"))
+ self.assertTrue(convertToWindowsVersion("3.0") > convertToWindowsVersion("3.0beta6"))
+ self.assertTrue(convertToWindowsVersion("3.0") > convertToWindowsVersion("3.0rc1"))
+ self.assertTrue(convertToWindowsVersion("3.0") > convertToWindowsVersion("3.0rc11"))
+
+ def testGitDescribeToVersion(self):
+ self.assertEqual("5.0alpha2-dev100", gitDescribeToVersion("swift-5.0alpha2-100-g33d5f6571", "swift"))
+ self.assertEqual("5.0alpha2", gitDescribeToVersion("swift-5.0alpha2", "swift"))
+ self.assertEqual("5.0-dev1", gitDescribeToVersion("swift-5.0-1-g012312312", "swift"))
+ self.assertIsNone(gitDescribeToVersion("swiften-5.0-1-g012312312", "swift"))
+ self.assertIsNone(gitDescribeToVersion("quickly-5.0-1-g012312312", "swift"))
+ self.assertIsNone(gitDescribeToVersion("swift-", "swift"))
+ self.assertIsNone(gitDescribeToVersion("swift", "swift"))
+
+if __name__ == '__main__':
+ if len(sys.argv) == 1:
+ unittest.main()
+ elif len(sys.argv) == 2:
+ if sys.argv[1] == "--git-build-version":
+ print(getGitBuildVersion(os.path.dirname(os.path.dirname(__file__)), "swift"))
+ else:
+ print(convertToWindowsVersion(sys.argv[1]))
+ sys.exit(0)
+ else:
+ print("Error: Simply run the script without arguments or pass a single argument.")
+ sys.exit(-1)
diff --git a/BuildTools/TranslationCoverage.xslt b/BuildTools/TranslationCoverage.xslt
new file mode 100644
index 0000000..4329174
--- /dev/null
+++ b/BuildTools/TranslationCoverage.xslt
@@ -0,0 +1,50 @@
+<?xml version="1.0"?>
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+
+<!--
+
+To use this XSLT, run it with xsltproc:
+
+ xsltproc BuildTools/TranslationCoverage.xslt Swift/Translations/swift_nl.ts
+
+Supported parameters:
+
+ full if set to 1 or true, generate a full report instead of the default oneliner.
+
+-->
+
+<xsl:param name="full" select="'0'" />
+<xsl:param name="filename" />
+<xsl:output method="text" />
+
+<xsl:variable name="contexts" select="count(TS/context)"/>
+<xsl:variable name="vanished" select="count(TS/context/message/translation[@type = 'vanished'])"/>
+<xsl:variable name="obsolete" select="count(TS/context/message/translation[@type = 'obsolete'])"/>
+<xsl:variable name="strings" select="count(TS/context/message/source) - $vanished - $obsolete"/>
+<xsl:variable name="translations" select="count(TS/context/message/translation[not(@type) and text()])"/>
+<xsl:variable name="missing" select="$strings - $translations"/>
+<xsl:variable name="percent_done" select="floor($translations div $strings * 100)"/>
+
+<xsl:template match="/TS">
+ <xsl:choose>
+ <xsl:when test="$full != '0' and $full != 'false'"><xsl:call-template name="full" /></xsl:when>
+ <xsl:otherwise><xsl:call-template name="terse" /></xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="terse"><xsl:value-of select="$percent_done"/>% complete, <xsl:value-of select="$vanished"/> vanished, <xsl:value-of select="$obsolete"/> obsolete, <xsl:value-of select="$missing"/> missing
+</xsl:template>
+
+<xsl:template name="full"><xsl:if test="$filename">Report for <xsl:value-of select="$filename" />:
+
+</xsl:if>Contexts: <xsl:value-of select="$contexts"/>
+Active Strings: <xsl:value-of select="$strings"/>
+Translations: <xsl:value-of select="$translations"/>, <xsl:value-of select="$percent_done"/>% complete
+Missing: <xsl:value-of select="$missing"/>
+Vanished: <xsl:value-of select="$vanished"/>
+Obsolete: <xsl:value-of select="$obsolete"/>
+
+Note: Strings and Translations do not include vanished or obsolete messages.
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/BuildTools/UpdateDebianChangelog.py b/BuildTools/UpdateDebianChangelog.py
index 1d0e3ea..d7e1f1b 100755
--- a/BuildTools/UpdateDebianChangelog.py
+++ b/BuildTools/UpdateDebianChangelog.py
@@ -20,7 +20,7 @@ if m :
if project == "" :
project="swift-im"
-if "dev" in version :
+if "dev" in version or "alpha" in version :
distribution = "development"
elif "beta" in version or "rc" in version :
distribution = "beta development"
@@ -38,4 +38,3 @@ if last_version != version :
changelog.write("\n")
changelog.write(changelog_data)
changelog.close()
-
diff --git a/BuildTools/scons2ninja.py b/BuildTools/scons2ninja.py
index 6c77c88..df4c655 100755
--- a/BuildTools/scons2ninja.py
+++ b/BuildTools/scons2ninja.py
@@ -1,5 +1,5 @@
#!/usr/bin/env python
-# -*- coding: utf-8 -*-
+# -*- coding: utf-8 -*-
################################################################################
#
@@ -204,9 +204,9 @@ class NinjaBuilder :
def to_string(self, lst, quote = False) :
if is_list(lst) :
if quote :
- return ' '.join([quote_spaces(x) for x in lst])
+ return ' '.join([quote_spaces(x) for x in lst])
else :
- return ' '.join([escape(x) for x in lst])
+ return ' '.join([escape(x) for x in lst])
if is_regexp(lst) :
return ' '.join([escape(x) for x in self.targets if lst.match(x)])
return escape(lst)
@@ -248,8 +248,8 @@ ninja = NinjaBuilder()
ninja.pool('scons_pool', depth = 1)
if sys.platform == 'win32' :
- ninja.rule('cl',
- deps = 'msvc',
+ ninja.rule('cl',
+ deps = 'msvc',
command = '$cl /showIncludes $clflags -c $in /Fo$out',
description = 'CXX $out')
@@ -369,7 +369,7 @@ for line in f.stdout :
# Skip lines if requested from previous command
if skip_nth_line >= 0 :
- skip_nth_line -= 1
+ skip_nth_line -= 1
if skip_nth_line == 0 :
continue
@@ -407,7 +407,7 @@ for line in f.stdout :
level = line.index('+-') / 2
filename = line[level*2+2:]
if filename.startswith('[') :
- filename = filename[1:-1]
+ filename = filename[1:-1]
# Check if we use the 'fixed' format which escapes filenamenames
if filename.startswith('\'') and filename.endswith('\'') :
@@ -429,7 +429,7 @@ for line in f.stdout :
previous_filename = filename
if f.wait() != 0 :
- print "Error calling '" + scons_generate_cmd + "'"
+ print("Error calling '" + scons_generate_cmd + "'")
print f.stderr.read()
exit(-1)
@@ -528,10 +528,10 @@ for line in build_lines :
libpaths = get_unary_flags("/libpath:", flags)
deps = get_built_libs(libs, libpaths, ninja.targets)
if out in mtflags :
- ninja.build(out, 'link_mt', objects, deps = sorted(deps),
+ ninja.build(out, 'link_mt', objects, deps = sorted(deps),
libs = libs, linkflags = flags, mtflags = mtflags[out])
else :
- ninja.build(out, 'link', objects, deps = sorted(deps),
+ ninja.build(out, 'link', objects, deps = sorted(deps),
libs = libs, linkflags = flags)
elif tool == 'rc':
@@ -589,10 +589,12 @@ for line in build_lines :
source = flags[0];
outdir, flags = extract_binary_flag("-o", flags)
basename, flags = extract_binary_flag("--basename", flags)
- ninja.build(os.path.join(outdir, basename + ".h"), 'sdef', [source],
+ ninja.build(os.path.join(outdir, basename + ".h"), 'sdef', [source],
basename = basename,
outdir = outdir)
+ elif tool == 'checker':
+ pass
elif not ninja_custom_command(ninja, line) :
raise Exception("Unknown tool: '" + line + "'")
diff --git a/COPYING b/COPYING
index 6e23714..fcf0996 100644
--- a/COPYING
+++ b/COPYING
@@ -1,5 +1,5 @@
Swift - An XMPP Client
-Copyright (C) 2009-2016 Isode Limited.
+Copyright (C) 2009-2018 Isode Limited.
The license under which these products are made available is provided in the COPYING.gpl file.
diff --git a/COPYING.dependencies b/COPYING.dependencies
index 50a9984..55f1c8d 100644
--- a/COPYING.dependencies
+++ b/COPYING.dependencies
@@ -47,6 +47,25 @@ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+Copyright 2001-2004 Unicode, Inc.
+
+Disclaimer
+
+This source code is provided as is by Unicode, Inc. No claims are
+made as to fitness for any particular purpose. No warranties of any
+kind are expressed or implied. The recipient agrees to determine
+applicability of information provided. If this file has been
+purchased on magnetic or optical media from Unicode, Inc., the
+sole remedy for any claim will be exchange of defective media
+within 90 days of receipt.
+
+Limitations on Rights to Redistribute This Code
+
+Unicode, Inc. hereby grants the right to freely use the information
+supplied in this file in the creation of products supporting the
+Unicode Standard, and to make copies of this file in any form
+for internal or external distribution as long as this notice
+remains attached.
=====
Boost
@@ -728,7 +747,7 @@ modification, are permitted provided that the following conditions
are met:
1. Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
+ notice, this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in
@@ -811,7 +830,7 @@ are met:
Eric Young (eay@cryptsoft.com)"
The word 'cryptographic' can be left out if the rouines from the library
being used are not cryptographic related :-).
-4. If you include any Windows specific code (or a derivative thereof) from
+4. If you include any Windows specific code (or a derivative thereof) from
the apps directory (application code) you must include an acknowledgement:
"This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
diff --git a/COPYING.gpl b/COPYING.gpl
index 287498c..dccf27e 100644
--- a/COPYING.gpl
+++ b/COPYING.gpl
@@ -1,5 +1,5 @@
Swift - An XMPP Client
-Copyright (C) 2009-2016 Isode Limited.
+Copyright (C) 2009-2018 Isode Limited.
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
diff --git a/COPYING.thirdparty b/COPYING.thirdparty
index 35cad47..4698061 100644
--- a/COPYING.thirdparty
+++ b/COPYING.thirdparty
@@ -172,6 +172,108 @@ FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
OTHER DEALINGS IN THE FONT SOFTWARE.
================
+Noto Color Emoji
+================
+
+Copyright (c) <dates>, <Copyright Holder> (<URL|email>),
+with Reserved Font Name <Reserved Font Name>.
+Copyright (c) <dates>, <additional Copyright Holder> (<URL|email>),
+with Reserved Font Name <additional Reserved Font Name>.
+Copyright (c) <dates>, <additional Copyright Holder> (<URL|email>).
+
+This Font Software is licensed under the SIL Open Font License, Version 1.1.
+This license is copied below, and is also available with a FAQ at:
+http://scripts.sil.org/OFL
+
+
+-----------------------------------------------------------
+SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
+-----------------------------------------------------------
+
+PREAMBLE
+The goals of the Open Font License (OFL) are to stimulate worldwide
+development of collaborative font projects, to support the font creation
+efforts of academic and linguistic communities, and to provide a free and
+open framework in which fonts may be shared and improved in partnership
+with others.
+
+The OFL allows the licensed fonts to be used, studied, modified and
+redistributed freely as long as they are not sold by themselves. The
+fonts, including any derivative works, can be bundled, embedded,
+redistributed and/or sold with any software provided that any reserved
+names are not used by derivative works. The fonts and derivatives,
+however, cannot be released under any other type of license. The
+requirement for fonts to remain under this license does not apply
+to any document created using the fonts or their derivatives.
+
+DEFINITIONS
+"Font Software" refers to the set of files released by the Copyright
+Holder(s) under this license and clearly marked as such. This may
+include source files, build scripts and documentation.
+
+"Reserved Font Name" refers to any names specified as such after the
+copyright statement(s).
+
+"Original Version" refers to the collection of Font Software components as
+distributed by the Copyright Holder(s).
+
+"Modified Version" refers to any derivative made by adding to, deleting,
+or substituting -- in part or in whole -- any of the components of the
+Original Version, by changing formats or by porting the Font Software to a
+new environment.
+
+"Author" refers to any designer, engineer, programmer, technical
+writer or other person who contributed to the Font Software.
+
+PERMISSION & CONDITIONS
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of the Font Software, to use, study, copy, merge, embed, modify,
+redistribute, and sell modified and unmodified copies of the Font
+Software, subject to the following conditions:
+
+1) Neither the Font Software nor any of its individual components,
+in Original or Modified Versions, may be sold by itself.
+
+2) Original or Modified Versions of the Font Software may be bundled,
+redistributed and/or sold with any software, provided that each copy
+contains the above copyright notice and this license. These can be
+included either as stand-alone text files, human-readable headers or
+in the appropriate machine-readable metadata fields within text or
+binary files as long as those fields can be easily viewed by the user.
+
+3) No Modified Version of the Font Software may use the Reserved Font
+Name(s) unless explicit written permission is granted by the corresponding
+Copyright Holder. This restriction only applies to the primary font name as
+presented to the users.
+
+4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
+Software shall not be used to promote, endorse or advertise any
+Modified Version, except to acknowledge the contribution(s) of the
+Copyright Holder(s) and the Author(s) or with their explicit written
+permission.
+
+5) The Font Software, modified or unmodified, in part or in whole,
+must be distributed entirely under this license, and must not be
+distributed under any other license. The requirement for fonts to
+remain under this license does not apply to any document created
+using the Font Software.
+
+TERMINATION
+This license becomes null and void if any of the above conditions are
+not met.
+
+DISCLAIMER
+THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
+OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
+COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
+DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
+OTHER DEALINGS IN THE FONT SOFTWARE.
+
+================
Third-party code
================
@@ -208,16 +310,19 @@ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
--- START OF SIMPLIFIED BSD LICENSE
-Copyright (c) 2012 Isode Limited, London, England.
-Copyright (c) 2012 Yoann Blein.
-Copyright (c) 2012 Mateusz Piekos.
-Copyright (c) 2012 Catalin Badea.
-Copyright (c) 2012 Maciej Niedzielski.
-Copyright (c) 2015 Kim Alvefur.
-Copyright (c) 2015 Tarun Gupta.
-Copyright (c) 2015 Daniel Baczynski.
-Copyright (c) 2015 Michael Vetter.
-Copyright (c) 2016 Barun Parruck.
+Copyright (c) 2012 Isode Limited, London, England
+Copyright (c) 2012 Yoann Blein
+Copyright (c) 2012 Mateusz Piekos
+Copyright (c) 2012 Catalin Badea
+Copyright (c) 2012 Maciej Niedzielski
+Copyright (c) 2015 Kim Alvefur
+Copyright (c) 2015 Tarun Gupta
+Copyright (c) 2015 Daniel Baczynski
+Copyright (c) 2015 Michael Vetter
+Copyright (c) 2016 Barun Parruck
+Copyright (c) 2017 Vitaly Takmazov
+Copyright (c) 2017 Dennis Schridde
+Copyright (c) 2018 Bernhard M. Wiedemann
All rights reserved.
Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
diff --git a/DEVELOPMENT.md b/DEVELOPMENT.md
index 3e48510..69c4ead 100644
--- a/DEVELOPMENT.md
+++ b/DEVELOPMENT.md
@@ -46,10 +46,11 @@ The Windows package consist of a Widnows Installer (.msi) file. This is generate
For packaging use:
- Microsoft VS 2013 Express
- WiX
-- Download the C++ redistributable package from Microsoft and put it at `C:\Program Files (x86)\Common Files\Merge Modules\`
+- Swift has a dependency on C++ redistributable package from Microsoft that needs to be deployed during install. If the common tools for Visual C++ is installed, then the installation file should be located under `C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\redist\1033\` (for Visual Studio 2013). If not download from Microsoft and put it at `C:\Program Files (x86)\Common Files\Merge Modules\`
- `config.py` should contain:
- qt = "c:\\qt\\5.4.2"
- vcredist = "C:\\Program Files (x86)\\Common Files\\Merge Modules\\vcredist_x86.exe"
+ qt = "c:\\qt\\5.6.2"
+ vcredist = "C:\\Program Files (x86)\\Microsoft Visual Studio 12.0\\VC\\redist\\vcredist_x86.exe"
+ vcredistdir = "C:\\Program Files (x86)\\Microsoft Visual Studio 12.0\\VC\\redist\\x86\Microsoft.VC120.CRT\\"
debug = 1
optimize = 1
wix_bindir = "c:\\program files\\Windows Installer XML v3.5\\bin"
diff --git a/Documentation/SwiftenDevelopersGuide/Examples/EchoBot/.gitignore b/Documentation/SwiftenDevelopersGuide/Examples/EchoBot/.gitignore
index aca6fe1..ef95cc1 100644
--- a/Documentation/SwiftenDevelopersGuide/Examples/EchoBot/.gitignore
+++ b/Documentation/SwiftenDevelopersGuide/Examples/EchoBot/.gitignore
@@ -1,4 +1,5 @@
EchoBot?
+EchoBot0x
*.cpp.xml
*.h.xml
EchoComponent
diff --git a/Documentation/SwiftenDevelopersGuide/SConscript b/Documentation/SwiftenDevelopersGuide/SConscript
index ac7c67a..95e5c87 100644
--- a/Documentation/SwiftenDevelopersGuide/SConscript
+++ b/Documentation/SwiftenDevelopersGuide/SConscript
@@ -9,36 +9,6 @@ env.Tool("DocBook", toolpath = ["#/BuildTools/DocBook/SCons"])
import sys, re, os.path
def generateDocBookCode(env, target, source) :
- # Strips empty lines from the beginning & end of a program
- def stripEmptyLines(program) :
- programLines = program.split('\n')
- newProgramLines = []
- inProgram = False
- for line in programLines :
- if not re.match("^\s*$", line) or inProgram :
- inProgram = True
- newProgramLines.append(line)
- return '\n'.join(newProgramLines).rstrip()
-
- def createCallouts(program, calloutPrefix) :
- newProgramLines = []
- calloutLines = []
- nextID = 0
- for line in program.split("\n") :
- # FIXME: Takes the largest match
- m = re.match(".*\/* \(\*\) (.*) \*/.*", line)
- if m :
- cobID = "cob-" + calloutPrefix + "-" + str(nextID)
- coID = "co-" + calloutPrefix + "-" + str(nextID)
- nextID += 1
- line = re.sub("/\*.*\*/", "]]><co id=\"%(cobID)s\" linkends=\"%(coID)s\"/><![CDATA[" % {"cobID" : cobID, "coID" : coID}, line)
- calloutLines.append("<callout arearefs=\"%(cobID)s\" id=\"%(coID)s\"><para>%(text)s</para></callout>" % {"cobID": cobID, "coID": coID, "text": m.group(1)})
- newProgramLines.append(line)
- callouts = ""
- if len(calloutLines) > 0 :
- callouts = "<calloutlist>" + "\n".join(calloutLines) + "</calloutlist>"
- return ("\n".join(newProgramLines), callouts)
-
# Parse program
filename = source[0].abspath
filenameBase = os.path.basename(filename).replace(".cpp", "")
@@ -71,10 +41,7 @@ def generateDocBookCode(env, target, source) :
inputfile.close()
for programName, program in programs.items() :
- program = stripEmptyLines(program)
- (program, callouts) = createCallouts(program, filenameBase + "-" + programName)
-
- document = "<foo><programlisting><![CDATA[" + program + "]]></programlisting>" + callouts + "</foo>"
+ document = "<foo><programlisting><![CDATA[" + program.strip() + "]]></programlisting></foo>"
# Generate code
output = open(target[0].abspath, 'w')
diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..b26f8a3
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,21 @@
+
+NUM_CPU := $(shell python -c 'import multiprocessing; print(multiprocessing.cpu_count())')
+
+.PHONY: all
+all: build.ninja
+ ninja
+
+.PHONY: clang-tidy
+clang-tidy: compile_commands.json
+ ninja -t targets all | grep cxx | grep -v 3rdParty | sed -e's/\.o: cxx/.cpp/' | xargs -t -P ${NUM_CPU} -n 1 clang-tidy -warnings-as-errors=*
+
+.PHONY: clang-tidy-fix
+clang-tidy-fix: compile_commands.json
+ ninja -t targets all | grep cxx | grep -v 3rdParty | sed -e's/\.o: cxx/.cpp/' | xargs -t -P ${NUM_CPU} -n 1 -I{} clang-tidy -p=${PWD} -export-fixes={}.clang-tidy-changes.yaml {}
+ clang-apply-replacements -remove-change-desc-files ${PWD}
+
+compile_commands.json: build.ninja
+ ninja -t compdb cxx > compile_commands.json
+
+build.ninja:
+ ./BuildTools/scons2ninja.py check=1 build_examples=0
diff --git a/QA/Checker/checker.cpp b/QA/Checker/checker.cpp
index 3cc7713..4d6a90e 100644
--- a/QA/Checker/checker.cpp
+++ b/QA/Checker/checker.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010-2017 Isode Limited.
+ * Copyright (c) 2010-2019 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -9,6 +9,8 @@
#include <string>
#include <sstream>
+#include <boost/algorithm/string/predicate.hpp>
+
#include <gtest/gtest.h>
#include <QA/Checker/CppUnitTestResultPrinter.h>
@@ -43,6 +45,9 @@ int main(int argc, char* argv[]) {
else if (param == "--debug") {
Swift::Log::setLogLevel(Swift::Log::debug);
}
+ else if (boost::starts_with(param, "--")) {
+ continue;
+ }
else {
testsToRun.push_back(param);
}
@@ -136,7 +141,7 @@ int main(int argc, char* argv[]) {
googleTestWasSuccessful = RUN_ALL_TESTS() == 0 ? true : false;
} catch (const ::testing::internal::GoogleTestFailureException& e) {
googleTestWasSuccessful = false;
- SWIFT_LOG(error) << "GoogleTestFailureException was thrown: " << e.what() << std::endl;
+ SWIFT_LOG(error) << "GoogleTestFailureException was thrown: " << e.what();
}
auto cppUnitWasSuccessful = result.wasSuccessful() ? true : false;
diff --git a/README.md b/README.md
index 1407683..4c40c8c 100644
--- a/README.md
+++ b/README.md
@@ -26,8 +26,9 @@ Platforms we officially test our releases on are listed below. We only test on d
* Swift
* Windows 7 to Windows 10
* Mac OS X 10.10 and Mac OS X 10.11
- * Ubuntu 14.04 ( Trusty Tahr ) and Ubuntu 16.04 ( Xenial Xerus )
+ * Ubuntu 17.10 ( Artful Aardvark ) and Ubuntu 16.04 ( Xenial Xerus )
* Debian 8 ( jessie )
+ * Debian 9 ( stretch )
## External Dependencies
The Swift repository includes some third party dependencies in the 3rdParty directory
@@ -38,6 +39,7 @@ to easy development. Third party dependencies not included are listed below:
* Qt 5 and QtWebKit is required by Swift. Depending on platform, architecture, and compiler/IDE, you have the following options to fulfill this dependency:
* download and install the [official binary Qt 5.5 release](http://download.qt.io/archive/qt/5.5/5.5.1/) if it is available for your platform/architecture/compiler
* download and install the latest [official binary Qt 5.7 release](http://download.qt.io/archive/qt/5.7/) **and** download the *matching* [Qt WebKit Technology Preview release for Qt 5.7](https://github.com/annulen/webkit/releases/) and copy/merge the folders with the matching folders of the previously installed Qt 5.7 installation
+ * Some features of Swift, such as unicode Emojis support, require QT 5.6 or newer.
## General Build Instructions
The Swift projects use the SCons build system for build configuration and Build
@@ -63,6 +65,7 @@ After installing Qt, simply run `./scons qt=/Users/username/Qt_installation_path
- Windows SDK
- Python (2.5 <= version < 3)
- Qt Open Source Edition
+ - QT 5.6 or newer to support emojis.
A binary release of Qt can be obtained from https://www.qt.io/download-open-source/. Make sure it matches the Visual Studio version you have installed.
diff --git a/Slimber/Cocoa/CocoaMenulet.mm b/Slimber/Cocoa/CocoaMenulet.mm
index a05843e..3bb39da 100644
--- a/Slimber/Cocoa/CocoaMenulet.mm
+++ b/Slimber/Cocoa/CocoaMenulet.mm
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012-2016 Isode Limited.
+ * Copyright (c) 2012-2019 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -17,9 +17,9 @@ CocoaMenulet::CocoaMenulet() {
statusItem = [[[NSStatusBar systemStatusBar]
statusItemWithLength: NSVariableStatusItemLength] retain];
- [statusItem setHighlightMode: YES];
- [statusItem setEnabled: YES];
- [statusItem setToolTip: @"Slimber"];
+ [statusItem.button.cell setHighlightsBy: NSChangeGrayCellMask | NSChangeBackgroundCellMask];
+ [statusItem.button setEnabled: YES];
+ [statusItem.button setToolTip: @"Slimber"];
[statusItem setMenu: menu];
}
@@ -32,7 +32,7 @@ CocoaMenulet::~CocoaMenulet() {
void CocoaMenulet::setIcon(const std::string& icon) {
NSString* path = [[NSBundle mainBundle] pathForResource: std2NSString(icon) ofType:@"png"];
NSImage* image = [[NSImage alloc] initWithContentsOfFile: path];
- [statusItem setImage: image];
+ [statusItem.button setImage: image];
[image release];
}
diff --git a/Slimber/Cocoa/MainMenu.xib b/Slimber/Cocoa/MainMenu.xib
index bed7223..fb124d4 100644
--- a/Slimber/Cocoa/MainMenu.xib
+++ b/Slimber/Cocoa/MainMenu.xib
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<archive type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="7.03">
<data>
- <int key="IBDocument.SystemTarget">1050</int>
+ <int key="IBDocument.SystemTarget">1060</int>
<string key="IBDocument.SystemVersion">9J61</string>
<string key="IBDocument.InterfaceBuilderVersion">677</string>
<string key="IBDocument.AppKitVersion">949.46</string>
diff --git a/Slimber/MainController.cpp b/Slimber/MainController.cpp
index cd36132..93eb4e7 100644
--- a/Slimber/MainController.cpp
+++ b/Slimber/MainController.cpp
@@ -102,13 +102,13 @@ void MainController::handleServerStopped(boost::optional<ServerError> error) {
std::string message;
switch (error->getType()) {
case ServerError::C2SPortConflict:
- message = std::string("Error: Port ") + boost::lexical_cast<std::string>(server->getClientToServerPort()) + std::string(" in use");
+ message = std::string("Error: Port ") + std::to_string(server->getClientToServerPort()) + std::string(" in use");
break;
case ServerError::C2SError:
message = std::string("Local connection server error");
break;
case ServerError::LinkLocalPortConflict:
- message = std::string("Error: Port ") + boost::lexical_cast<std::string>(server->getLinkLocalPort()) + std::string(" in use");
+ message = std::string("Error: Port ") + std::to_string(server->getLinkLocalPort()) + std::string(" in use");
break;
case ServerError::LinkLocalError:
message = std::string("External connection server error");
diff --git a/Slimber/SConscript b/Slimber/SConscript
index a41fe0b..fa5aa53 100644
--- a/Slimber/SConscript
+++ b/Slimber/SConscript
@@ -11,10 +11,10 @@ elif env["PLATFORM"] != "darwin" :
env["PROJECTS"].remove("Slimber")
if not "Slimber" in env["PROJECTS"] and env["SCONS_STAGE"] == "flags" :
- print "Bonjour missing. Not building Slimber."
+ print("Bonjour missing. Not building Slimber.")
if not env.get("HAVE_QT", False) and "Slimber" in env["PROJECTS"] :
- print "Qt missing. Not building Slimber."
+ print("Qt missing. Not building Slimber.")
env["PROJECTS"].remove("Slimber")
if "Slimber" in env["PROJECTS"] :
diff --git a/Slimber/Server.cpp b/Slimber/Server.cpp
index 3bc3112..7bb2ed9 100644
--- a/Slimber/Server.cpp
+++ b/Slimber/Server.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2019 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -39,8 +39,8 @@
namespace Swift {
Server::Server(
- int clientConnectionPort,
- int linkLocalConnectionPort,
+ unsigned short clientConnectionPort,
+ unsigned short linkLocalConnectionPort,
LinkLocalServiceBrowser* linkLocalServiceBrowser,
VCardCollection* vCardCollection,
EventLoop* eventLoop) :
@@ -306,7 +306,7 @@ void Server::handleLinkLocalElementReceived(std::shared_ptr<ToplevelElement> ele
void Server::handleConnectFinished(std::shared_ptr<LinkLocalConnector> connector, bool error) {
if (error) {
- SWIFT_LOG(warning) << "Error connecting" << std::endl;
+ SWIFT_LOG(warning) << "Error connecting";
// TODO: Send back queued stanzas
}
else {
diff --git a/Slimber/Server.h b/Slimber/Server.h
index 4842cd9..2ee5a4a 100644
--- a/Slimber/Server.h
+++ b/Slimber/Server.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -41,8 +41,8 @@ namespace Swift {
class Server {
public:
Server(
- int clientConnectionPort,
- int linkLocalConnectionPort,
+ unsigned short clientConnectionPort,
+ unsigned short linkLocalConnectionPort,
LinkLocalServiceBrowser* browser,
VCardCollection* vCardCollection,
EventLoop* eventLoop);
@@ -51,11 +51,11 @@ namespace Swift {
void start();
void stop();
- int getLinkLocalPort() const {
+ unsigned short getLinkLocalPort() const {
return linkLocalConnectionPort;
}
- int getClientToServerPort() const {
+ unsigned short getClientToServerPort() const {
return clientConnectionPort;
}
@@ -105,8 +105,8 @@ namespace Swift {
PlatformXMLParserFactory xmlParserFactory;
bool linkLocalServiceRegistered;
bool rosterRequested;
- int clientConnectionPort;
- int linkLocalConnectionPort;
+ unsigned short clientConnectionPort;
+ unsigned short linkLocalConnectionPort;
LinkLocalServiceBrowser* linkLocalServiceBrowser;
VCardCollection* vCardCollection;
EventLoop* eventLoop;
diff --git a/Slimber/UnitTest/LinkLocalPresenceManagerTest.cpp b/Slimber/UnitTest/LinkLocalPresenceManagerTest.cpp
index c8e7700..b1a51c9 100644
--- a/Slimber/UnitTest/LinkLocalPresenceManagerTest.cpp
+++ b/Slimber/UnitTest/LinkLocalPresenceManagerTest.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -225,7 +225,9 @@ class LinkLocalPresenceManagerTest : public CppUnit::TestFixture {
info.setFirstName(firstName);
info.setLastName(lastName);
info.setNick(nickName);
- querier->setServiceInfo(service, DNSSDResolveServiceQuery::Result(name + "._presence._tcp.local", "rabbithole.local", 1234, info.toTXTRecord()));
+ auto txtRecord = info.toTXTRecord();
+ CPPUNIT_ASSERT(txtRecord);
+ querier->setServiceInfo(service, DNSSDResolveServiceQuery::Result(name + "._presence._tcp.local", "rabbithole.local", 1234, *txtRecord));
querier->addService(service);
eventLoop->processEvents();
}
@@ -241,7 +243,9 @@ class LinkLocalPresenceManagerTest : public CppUnit::TestFixture {
LinkLocalServiceInfo info;
info.setStatus(status);
info.setMessage(message);
- querier->setServiceInfo(service, DNSSDResolveServiceQuery::Result(name + "._presence._tcp.local", "rabbithole.local", 1234, info.toTXTRecord()));
+ auto txtRecord = info.toTXTRecord();
+ CPPUNIT_ASSERT(txtRecord);
+ querier->setServiceInfo(service, DNSSDResolveServiceQuery::Result(name + "._presence._tcp.local", "rabbithole.local", 1234, *txtRecord));
eventLoop->processEvents();
}
diff --git a/Sluift/ElementConvertors/DOMElementConvertor.cpp b/Sluift/ElementConvertors/DOMElementConvertor.cpp
index 56b45aa..5e72cc8 100644
--- a/Sluift/ElementConvertors/DOMElementConvertor.cpp
+++ b/Sluift/ElementConvertors/DOMElementConvertor.cpp
@@ -185,7 +185,7 @@ boost::optional<std::string> DOMElementConvertor::convertToLua(
// Parse the payload again
ParserClient parserClient(L);
- std::shared_ptr<XMLParser> parser(parsers.createXMLParser(&parserClient));
+ std::shared_ptr<XMLParser> parser(parsers.createXMLParser(&parserClient, false));
bool result = parser->parse(serializedPayload);
assert(result);
diff --git a/Sluift/ElementConvertors/DefaultElementConvertor.cpp b/Sluift/ElementConvertors/DefaultElementConvertor.cpp
index 75e6706..d3d60ff 100644
--- a/Sluift/ElementConvertors/DefaultElementConvertor.cpp
+++ b/Sluift/ElementConvertors/DefaultElementConvertor.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2013-2016 Isode Limited.
+ * Copyright (c) 2013-2019 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -20,7 +20,7 @@ DefaultElementConvertor::~DefaultElementConvertor() {
}
std::shared_ptr<Element> DefaultElementConvertor::convertFromLua(lua_State*, int, const std::string& type) {
- SWIFT_LOG(warning) << "Unable to convert type '" << type << "'" << std::endl;
+ SWIFT_LOG(warning) << "Unable to convert type '" << type << "'";
return std::shared_ptr<Element>();
}
diff --git a/Sluift/ElementConvertors/FormConvertor.cpp b/Sluift/ElementConvertors/FormConvertor.cpp
index 90fd9fe..245e0f9 100644
--- a/Sluift/ElementConvertors/FormConvertor.cpp
+++ b/Sluift/ElementConvertors/FormConvertor.cpp
@@ -29,7 +29,7 @@ namespace {
lua_pushnil(L);
for (lua_pushnil(L); lua_next(L, index) != 0; ) {
lua_getfield(L, -1, "name");
- if (lua_equal(L, -1, 2)) {
+ if (lua_compare(L, -1, 2, LUA_OPEQ)) {
lua_pop(L, 1);
return 1;
}
@@ -44,7 +44,7 @@ namespace {
if (lua_type(L, -1) == LUA_TTABLE) {
for (lua_pushnil(L); lua_next(L, -2) != 0; ) {
lua_getfield(L, -1, "name");
- if (lua_equal(L, -1, 2)) {
+ if (lua_compare(L, -1, 2, LUA_OPEQ)) {
lua_pushvalue(L, 3);
lua_setfield(L, -3, "value");
foundField = true;
diff --git a/Sluift/ElementConvertors/PubSubAffiliationsConvertor.cpp b/Sluift/ElementConvertors/PubSubAffiliationsConvertor.cpp
index c6ba09e..8f8a660 100644
--- a/Sluift/ElementConvertors/PubSubAffiliationsConvertor.cpp
+++ b/Sluift/ElementConvertors/PubSubAffiliationsConvertor.cpp
@@ -33,7 +33,7 @@ std::shared_ptr<PubSubAffiliations> PubSubAffiliationsConvertor::doConvertFromLu
lua_pop(L, 1);
if (lua_type(L, -1) == LUA_TTABLE) {
std::vector< std::shared_ptr<PubSubAffiliation> > items;
- for(size_t i = 0; i < lua_objlen(L, -1); ++i) {
+ for(size_t i = 0; i < lua_rawlen(L, -1); ++i) {
lua_pushnumber(L, i + 1);
lua_gettable(L, -2);
if (!lua_isnil(L, -1)) {
diff --git a/Sluift/ElementConvertors/PubSubEventItemConvertor.cpp b/Sluift/ElementConvertors/PubSubEventItemConvertor.cpp
index ac86024..19ab09a 100644
--- a/Sluift/ElementConvertors/PubSubEventItemConvertor.cpp
+++ b/Sluift/ElementConvertors/PubSubEventItemConvertor.cpp
@@ -39,7 +39,7 @@ std::shared_ptr<PubSubEventItem> PubSubEventItemConvertor::doConvertFromLua(lua_
lua_getfield(L, -1, "data");
if (lua_type(L, -1) == LUA_TTABLE) {
std::vector< std::shared_ptr<Payload> > items;
- for(size_t i = 0; i < lua_objlen(L, -1); ++i) {
+ for(size_t i = 0; i < lua_rawlen(L, -1); ++i) {
lua_pushnumber(L, i + 1);
lua_gettable(L, -2);
if (!lua_isnil(L, -1)) {
diff --git a/Sluift/ElementConvertors/PubSubEventItemsConvertor.cpp b/Sluift/ElementConvertors/PubSubEventItemsConvertor.cpp
index 7a3cde1..66f798e 100644
--- a/Sluift/ElementConvertors/PubSubEventItemsConvertor.cpp
+++ b/Sluift/ElementConvertors/PubSubEventItemsConvertor.cpp
@@ -34,7 +34,7 @@ std::shared_ptr<PubSubEventItems> PubSubEventItemsConvertor::doConvertFromLua(lu
lua_getfield(L, -1, "items");
if (lua_type(L, -1) == LUA_TTABLE) {
std::vector< std::shared_ptr<PubSubEventItem> > items;
- for(size_t i = 0; i < lua_objlen(L, -1); ++i) {
+ for(size_t i = 0; i < lua_rawlen(L, -1); ++i) {
lua_pushnumber(L, i + 1);
lua_gettable(L, -2);
if (!lua_isnil(L, -1)) {
@@ -51,7 +51,7 @@ std::shared_ptr<PubSubEventItems> PubSubEventItemsConvertor::doConvertFromLua(lu
lua_getfield(L, -1, "retracts");
if (lua_type(L, -1) == LUA_TTABLE) {
std::vector< std::shared_ptr<PubSubEventRetract> > items;
- for(size_t i = 0; i < lua_objlen(L, -1); ++i) {
+ for(size_t i = 0; i < lua_rawlen(L, -1); ++i) {
lua_pushnumber(L, i + 1);
lua_gettable(L, -2);
if (!lua_isnil(L, -1)) {
diff --git a/Sluift/ElementConvertors/PubSubItemConvertor.cpp b/Sluift/ElementConvertors/PubSubItemConvertor.cpp
index 27fd4a3..b46419a 100644
--- a/Sluift/ElementConvertors/PubSubItemConvertor.cpp
+++ b/Sluift/ElementConvertors/PubSubItemConvertor.cpp
@@ -29,7 +29,7 @@ std::shared_ptr<PubSubItem> PubSubItemConvertor::doConvertFromLua(lua_State* L)
lua_getfield(L, -1, "data");
if (lua_type(L, -1) == LUA_TTABLE) {
std::vector< std::shared_ptr<Payload> > items;
- for(size_t i = 0; i < lua_objlen(L, -1); ++i) {
+ for(size_t i = 0; i < lua_rawlen(L, -1); ++i) {
lua_pushnumber(L, i + 1);
lua_gettable(L, -2);
if (!lua_isnil(L, -1)) {
diff --git a/Sluift/ElementConvertors/PubSubItemsConvertor.cpp b/Sluift/ElementConvertors/PubSubItemsConvertor.cpp
index 5fa1bd3..0bb8eb9 100644
--- a/Sluift/ElementConvertors/PubSubItemsConvertor.cpp
+++ b/Sluift/ElementConvertors/PubSubItemsConvertor.cpp
@@ -33,7 +33,7 @@ std::shared_ptr<PubSubItems> PubSubItemsConvertor::doConvertFromLua(lua_State* L
lua_pop(L, 1);
if (lua_type(L, -1) == LUA_TTABLE) {
std::vector< std::shared_ptr<PubSubItem> > items;
- for(size_t i = 0; i < lua_objlen(L, -1); ++i) {
+ for(size_t i = 0; i < lua_rawlen(L, -1); ++i) {
lua_pushnumber(L, i + 1);
lua_gettable(L, -2);
if (!lua_isnil(L, -1)) {
diff --git a/Sluift/ElementConvertors/PubSubOwnerAffiliationsConvertor.cpp b/Sluift/ElementConvertors/PubSubOwnerAffiliationsConvertor.cpp
index ee8a8cb..9ca76fc 100644
--- a/Sluift/ElementConvertors/PubSubOwnerAffiliationsConvertor.cpp
+++ b/Sluift/ElementConvertors/PubSubOwnerAffiliationsConvertor.cpp
@@ -33,7 +33,7 @@ std::shared_ptr<PubSubOwnerAffiliations> PubSubOwnerAffiliationsConvertor::doCon
lua_pop(L, 1);
if (lua_type(L, -1) == LUA_TTABLE) {
std::vector< std::shared_ptr<PubSubOwnerAffiliation> > items;
- for(size_t i = 0; i < lua_objlen(L, -1); ++i) {
+ for(size_t i = 0; i < lua_rawlen(L, -1); ++i) {
lua_pushnumber(L, i + 1);
lua_gettable(L, -2);
if (!lua_isnil(L, -1)) {
diff --git a/Sluift/ElementConvertors/PubSubOwnerSubscriptionsConvertor.cpp b/Sluift/ElementConvertors/PubSubOwnerSubscriptionsConvertor.cpp
index 88085b5..3530efe 100644
--- a/Sluift/ElementConvertors/PubSubOwnerSubscriptionsConvertor.cpp
+++ b/Sluift/ElementConvertors/PubSubOwnerSubscriptionsConvertor.cpp
@@ -33,7 +33,7 @@ std::shared_ptr<PubSubOwnerSubscriptions> PubSubOwnerSubscriptionsConvertor::doC
lua_pop(L, 1);
if (lua_type(L, -1) == LUA_TTABLE) {
std::vector< std::shared_ptr<PubSubOwnerSubscription> > items;
- for(size_t i = 0; i < lua_objlen(L, -1); ++i) {
+ for(size_t i = 0; i < lua_rawlen(L, -1); ++i) {
lua_pushnumber(L, i + 1);
lua_gettable(L, -2);
if (!lua_isnil(L, -1)) {
diff --git a/Sluift/ElementConvertors/PubSubPublishConvertor.cpp b/Sluift/ElementConvertors/PubSubPublishConvertor.cpp
index 63c97bc..d8a2742 100644
--- a/Sluift/ElementConvertors/PubSubPublishConvertor.cpp
+++ b/Sluift/ElementConvertors/PubSubPublishConvertor.cpp
@@ -34,7 +34,7 @@ std::shared_ptr<PubSubPublish> PubSubPublishConvertor::doConvertFromLua(lua_Stat
lua_getfield(L, -1, "items");
if (lua_type(L, -1) == LUA_TTABLE) {
std::vector< std::shared_ptr<PubSubItem> > items;
- for(size_t i = 0; i < lua_objlen(L, -1); ++i) {
+ for(size_t i = 0; i < lua_rawlen(L, -1); ++i) {
lua_pushnumber(L, i + 1);
lua_gettable(L, -2);
if (!lua_isnil(L, -1)) {
diff --git a/Sluift/ElementConvertors/PubSubRetractConvertor.cpp b/Sluift/ElementConvertors/PubSubRetractConvertor.cpp
index c070ad6..c27ad7d 100644
--- a/Sluift/ElementConvertors/PubSubRetractConvertor.cpp
+++ b/Sluift/ElementConvertors/PubSubRetractConvertor.cpp
@@ -34,7 +34,7 @@ std::shared_ptr<PubSubRetract> PubSubRetractConvertor::doConvertFromLua(lua_Stat
lua_getfield(L, -1, "items");
if (lua_type(L, -1) == LUA_TTABLE) {
std::vector< std::shared_ptr<PubSubItem> > items;
- for(size_t i = 0; i < lua_objlen(L, -1); ++i) {
+ for(size_t i = 0; i < lua_rawlen(L, -1); ++i) {
lua_pushnumber(L, i + 1);
lua_gettable(L, -2);
if (!lua_isnil(L, -1)) {
diff --git a/Sluift/ElementConvertors/PubSubSubscriptionsConvertor.cpp b/Sluift/ElementConvertors/PubSubSubscriptionsConvertor.cpp
index 3712192..2325181 100644
--- a/Sluift/ElementConvertors/PubSubSubscriptionsConvertor.cpp
+++ b/Sluift/ElementConvertors/PubSubSubscriptionsConvertor.cpp
@@ -33,7 +33,7 @@ std::shared_ptr<PubSubSubscriptions> PubSubSubscriptionsConvertor::doConvertFrom
lua_pop(L, 1);
if (lua_type(L, -1) == LUA_TTABLE) {
std::vector< std::shared_ptr<PubSubSubscription> > items;
- for(size_t i = 0; i < lua_objlen(L, -1); ++i) {
+ for(size_t i = 0; i < lua_rawlen(L, -1); ++i) {
lua_pushnumber(L, i + 1);
lua_gettable(L, -2);
if (!lua_isnil(L, -1)) {
diff --git a/Sluift/ElementConvertors/SecurityLabelConvertor.cpp b/Sluift/ElementConvertors/SecurityLabelConvertor.cpp
index 21d9a8f..8bc323a 100644
--- a/Sluift/ElementConvertors/SecurityLabelConvertor.cpp
+++ b/Sluift/ElementConvertors/SecurityLabelConvertor.cpp
@@ -26,7 +26,7 @@ std::shared_ptr<SecurityLabel> SecurityLabelConvertor::doConvertFromLua(lua_Stat
lua_getfield(L, -1, "equivalent_labels");
if (lua_type(L, -1) == LUA_TTABLE) {
std::vector< std::string > items;
- for(size_t i = 0; i < lua_objlen(L, -1); ++i) {
+ for(size_t i = 0; i < lua_rawlen(L, -1); ++i) {
lua_pushnumber(L, i + 1);
lua_gettable(L, -2);
if (lua_isstring(L, -1)) {
diff --git a/Sluift/ElementConvertors/StanzaConvertor.h b/Sluift/ElementConvertors/StanzaConvertor.h
index bdaaad3..a7b4e4e 100644
--- a/Sluift/ElementConvertors/StanzaConvertor.h
+++ b/Sluift/ElementConvertors/StanzaConvertor.h
@@ -46,7 +46,7 @@ namespace Swift {
lua_pop(L, 1);
lua_getfield(L, -1, "payloads");
if (lua_type(L, -1) == LUA_TTABLE) {
- for(size_t i = 0; i < lua_objlen(L, -1); ++i) {
+ for(size_t i = 0; i < lua_rawlen(L, -1); ++i) {
lua_pushnumber(L, i + 1);
lua_gettable(L, -2);
if (!lua_isnil(L, -1)) {
diff --git a/Sluift/Examples/SendReference.lua b/Sluift/Examples/SendReference.lua
new file mode 100644
index 0000000..2e60182
--- /dev/null
+++ b/Sluift/Examples/SendReference.lua
@@ -0,0 +1,74 @@
+#!/usr/bin/env sluift --
+
+-- This is an example of sending a custom payload, a XEP-0372 reference in this
+-- case.
+--
+-- Running this requires a sluift binary somewhere in the PATH. Alternatively,
+-- you can feed this to sluift, or to a Lua that has sluift.so in its library
+-- path.
+
+require("sluift")
+
+DEFAULT_URI = "http://example.com/kitten.jpg"
+
+function usage(err)
+ print("Usage: SendReference.lua jid [tojid] [datauri]")
+ print()
+ print("This tool will log in as jid, and send a reference to tojid. If no tojid")
+ print("is provided, a message to itself is sent. The datauri defaults to")
+ print(DEFAULT_URI .. ", but can be overridden.")
+
+ if err then
+ print("")
+ print("Error: " .. err)
+ end
+ os.exit(1)
+end
+
+function get_password(prompt)
+ if prompt then
+ io.write(prompt)
+ end
+ local stty_ret = os.execute("stty -echo 2>/dev/null")
+ if stty_ret then
+ io.write("\027[8m")
+ end
+ local ok, pass = pcall(io.read, "*l")
+ if stty_ret then
+ io.write("\027[m")
+ else
+ os.execute("stty echo")
+ end
+ io.write("\n");
+ if ok then
+ return pass
+ end
+end
+
+if #arg < 1 then
+ usage("no jid specified")
+end
+jid = arg[1]
+password = os.getenv("XMPP_PASSWORD") or get_password("Password: ")
+tojid = #arg > 1 and arg[2] or jid
+datauri = #arg > 2 and arg[3] or DEFAULT_URI
+
+sluift.debug = 1
+sluift.with(sluift.new_client(jid, password), function()
+ options = { host=os.getenv("XMPP_HOST"), port=os.getenv("XMPP_PORT") }
+ connect(options)
+ reference = {
+ ['_type'] = 'dom',
+ ['tag'] = 'reference',
+ ['ns'] = 'urn:xmpp:reference:0',
+ ['attributes'] = {
+ { ['name'] = 'type', ['value'] = 'data' },
+ { ['name'] = 'uri', ['value'] = datauri },
+ { ['name'] = 'mimeType', ['value'] = arg[4] },
+ { ['name'] = 'begin', ['value'] = arg[5] },
+ { ['name'] = 'end', ['value'] = arg[6] }
+ },
+ }
+ send_message{to=tojid, body="Check out this data!", payloads={reference}}
+ disconnect()
+end)
diff --git a/Sluift/Lua/LuaUtils.h b/Sluift/Lua/LuaUtils.h
index b87eb38..b9f5bff 100644
--- a/Sluift/Lua/LuaUtils.h
+++ b/Sluift/Lua/LuaUtils.h
@@ -12,7 +12,22 @@
#include <vector>
#if LUA_VERSION_NUM < 502
-#define lua_pushglobaltable(L) lua_pushvalue(L, LUA_GLOBALSINDEX)
+#define lua_pushglobaltable(L) lua_pushvalue(L, LUA_GLOBALSINDEX)
+#define lua_compare(L,idx1,idx2,LUA_OPEQ) lua_equal(L,(idx1),(idx2))
+#define lua_rawlen(L, i) lua_objlen(L,(i))
+#endif
+#if LUA_VERSION_NUM >= 503
+#undef luaL_register
+#define luaL_register(L, n, l) \
+ lua_getglobal( L, n ); \
+ if( lua_isnil( L, -1 ) ) \
+ { \
+ lua_pop( L, 1 ); \
+ lua_newtable( L ); \
+ } \
+ luaL_setfuncs( L, (l), 0 ); \
+ lua_pushvalue( L, -1 ); \
+ lua_setglobal( L, n );
#endif
namespace Swift {
diff --git a/Sluift/SConscript b/Sluift/SConscript
index de9cab6..af54ece 100644
--- a/Sluift/SConscript
+++ b/Sluift/SConscript
@@ -3,7 +3,7 @@ import Version, os.path
Import(["env"])
if env["SCONS_STAGE"] == "build" and not GetOption("help") and not env.get("HAVE_LUA", 0) :
- print "Warning: Lua was not found. Sluift will not be built."
+ print("Warning: Lua was not found. Sluift will not be built.")
if "Sluift" in env["PROJECTS"] :
env["PROJECTS"].remove("Sluift")
diff --git a/Sluift/SluiftClient.cpp b/Sluift/SluiftClient.cpp
index e8c43c9..99892a9 100644
--- a/Sluift/SluiftClient.cpp
+++ b/Sluift/SluiftClient.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2013-2017 Isode Limited.
+ * Copyright (c) 2013-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -38,6 +38,9 @@ SluiftClient::SluiftClient(
client->onPresenceReceived.connect(boost::bind(&SluiftClient::handleIncomingPresence, this, _1));
client->getPubSubManager()->onEvent.connect(boost::bind(&SluiftClient::handleIncomingPubSubEvent, this, _1, _2));
client->getRoster()->onInitialRosterPopulated.connect(boost::bind(&SluiftClient::handleInitialRosterPopulated, this));
+ client->getRoster()->onJIDAdded.connect(boost::bind(&SluiftClient::handleIncomingRosterAdd, this, _1));
+ client->getRoster()->onJIDRemoved.connect(boost::bind(&SluiftClient::handleIncomingRosterRemove, this, _1));
+ client->getRoster()->onJIDUpdated.connect(boost::bind(&SluiftClient::handleIncomingRosterUpdate, this, _1));
client->getClientBlockListManager()->getBlockList()->onItemAdded.connect(boost::bind(&SluiftClient::handleIncomingBlockEvent, this, _1));
client->getClientBlockListManager()->getBlockList()->onItemRemoved.connect(boost::bind(&SluiftClient::handleIncomingUnblockEvent, this, _1));
}
@@ -48,6 +51,9 @@ SluiftClient::~SluiftClient() {
}
void SluiftClient::connect() {
+ if (client->isActive()) {
+ throw Lua::Exception("Client is already connecting or connected");
+ }
rosterReceived = false;
blockListReceived = false;
disconnectedError = boost::optional<ClientError>();
@@ -189,6 +195,18 @@ void SluiftClient::handleInitialRosterPopulated() {
rosterReceived = true;
}
+void SluiftClient::handleIncomingRosterAdd(const JID& item) {
+ pendingEvents.push_back(Event(item, Event::RosterAddType));
+}
+
+void SluiftClient::handleIncomingRosterRemove(const JID& item) {
+ pendingEvents.push_back(Event(item, Event::RosterRemoveType));
+}
+
+void SluiftClient::handleIncomingRosterUpdate(const JID& item) {
+ pendingEvents.push_back(Event(item, Event::RosterUpdateType));
+}
+
void SluiftClient::handleRequestResponse(std::shared_ptr<Payload> response, std::shared_ptr<ErrorPayload> error) {
requestResponse = response;
requestError = error;
diff --git a/Sluift/SluiftClient.h b/Sluift/SluiftClient.h
index a48c681..ac4c582 100644
--- a/Sluift/SluiftClient.h
+++ b/Sluift/SluiftClient.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2013-2017 Isode Limited.
+ * Copyright (c) 2013-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -45,7 +45,10 @@ namespace Swift {
PresenceType,
PubSubEventType,
BlockEventType,
- UnblockEventType
+ UnblockEventType,
+ RosterAddType,
+ RosterRemoveType,
+ RosterUpdateType
};
Event(std::shared_ptr<Message> stanza) : type(MessageType), stanza(stanza) {}
@@ -61,7 +64,7 @@ namespace Swift {
JID from;
std::shared_ptr<PubSubEventPayload> pubsubEvent;
- // Blocklist
+ // Blocklist & Roster Push
JID item;
};
@@ -81,7 +84,6 @@ namespace Swift {
}
void connect();
- void connect(const std::string& host, int port);
void waitConnected(int timeout);
bool isConnected() const;
void setTraceEnabled(bool b);
@@ -110,7 +112,7 @@ namespace Swift {
void disconnect();
void setSoftwareVersion(const std::string& name, const std::string& version, const std::string& os);
boost::optional<SluiftClient::Event> getNextEvent(int timeout,
- boost::function<bool (const Event&)> condition = 0);
+ boost::function<bool (const Event&)> condition = boost::function<bool (const Event&)>());
std::vector<XMPPRosterItem> getRoster(int timeout);
std::vector<JID> getBlockList(int timeout);
@@ -123,6 +125,9 @@ namespace Swift {
void handleIncomingBlockEvent(const JID& item);
void handleIncomingUnblockEvent(const JID& item);
void handleInitialRosterPopulated();
+ void handleIncomingRosterAdd(const JID& item);
+ void handleIncomingRosterRemove(const JID& item);
+ void handleIncomingRosterUpdate(const JID& item);
void handleRequestResponse(std::shared_ptr<Payload> response, std::shared_ptr<ErrorPayload> error);
void handleDisconnected(const boost::optional<ClientError>& error);
diff --git a/Sluift/SluiftComponent.cpp b/Sluift/SluiftComponent.cpp
index e1d1738..74728ee 100644
--- a/Sluift/SluiftComponent.cpp
+++ b/Sluift/SluiftComponent.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2014-2016 Isode Limited.
+ * Copyright (c) 2014-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -40,7 +40,10 @@ SluiftComponent::~SluiftComponent() {
delete component;
}
-void SluiftComponent::connect(const std::string& host, int port) {
+void SluiftComponent::connect(const std::string& host, unsigned short port) {
+ if (component->isActive()) {
+ throw Lua::Exception("Component is already connecting or connected");
+ }
disconnectedError = boost::optional<ComponentError>();
component->connect(host, port);
}
@@ -75,7 +78,7 @@ bool SluiftComponent::isConnected() const {
void SluiftComponent::disconnect() {
component->disconnect();
- while (component->isAvailable()) {
+ while (component->isActive()) {
eventLoop->runUntilEvents();
}
}
@@ -102,12 +105,12 @@ boost::optional<SluiftComponent::Event> SluiftComponent::getNextEvent(
}
// Wait for new events
- while (!watchdog.getTimedOut() && currentIndex >= pendingEvents.size() && component->isAvailable()) {
+ while (!watchdog.getTimedOut() && currentIndex >= pendingEvents.size() && component->isActive()) {
eventLoop->runUntilEvents();
}
// Finish if we're disconnected or timed out
- if (watchdog.getTimedOut() || !component->isAvailable()) {
+ if (watchdog.getTimedOut() || !component->isActive()) {
return boost::optional<Event>();
}
}
diff --git a/Sluift/SluiftComponent.h b/Sluift/SluiftComponent.h
index d45c3b2..586a94e 100644
--- a/Sluift/SluiftComponent.h
+++ b/Sluift/SluiftComponent.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2014-2016 Isode Limited.
+ * Copyright (c) 2014-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -63,7 +63,7 @@ namespace Swift {
return component;
}
- void connect(const std::string& host, int port);
+ void connect(const std::string& host, unsigned short port);
void waitConnected(int timeout);
bool isConnected() const;
void setTraceEnabled(bool b);
@@ -85,7 +85,7 @@ namespace Swift {
void disconnect();
void setSoftwareVersion(const std::string& name, const std::string& version, const std::string& os);
boost::optional<SluiftComponent::Event> getNextEvent(int timeout,
- boost::function<bool (const Event&)> condition = 0);
+ boost::function<bool (const Event&)> condition = boost::function<bool (const Event&)>());
private:
Sluift::Response doSendRequest(std::shared_ptr<Request> request, int timeout);
diff --git a/Sluift/client.cpp b/Sluift/client.cpp
index 75f675d..814ad45 100644
--- a/Sluift/client.cpp
+++ b/Sluift/client.cpp
@@ -1,12 +1,10 @@
/*
- * Copyright (c) 2013-2017 Isode Limited.
+ * Copyright (c) 2013-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
#include <boost/assign/list_of.hpp>
-#include <boost/lambda/bind.hpp>
-#include <boost/lambda/lambda.hpp>
#include <Swiften/Base/IDGenerator.h>
#include <Swiften/Disco/ClientDiscoManager.h>
@@ -42,7 +40,6 @@
#include <Sluift/globals.h>
using namespace Swift;
-namespace lambda = boost::lambda;
static inline SluiftClient* getClient(lua_State* L) {
return *Lua::checkUserData<SluiftClient>(L, 1);
@@ -302,6 +299,7 @@ SLUIFT_LUA_FUNCTION_WITH_HELP(
"body the body of the message. Can alternatively be specified using the `body` option\n",
"to the JID to send the message to\n"
+ "id the id to set on the stanza\n"
"body the body of the message\n"
"subject the subject of the MUC room to set\n"
"type the type of message to send (`normal`, `chat`, `error`, `groupchat`, `headline`)\n"
@@ -310,6 +308,7 @@ SLUIFT_LUA_FUNCTION_WITH_HELP(
Sluift::globals.eventLoop.runOnce();
JID to;
boost::optional<std::string> body;
+ boost::optional<std::string> id;
boost::optional<std::string> subject;
std::vector<std::shared_ptr<Payload> > payloads;
int index = 2;
@@ -327,6 +326,10 @@ SLUIFT_LUA_FUNCTION_WITH_HELP(
to = *value;
}
+ if (boost::optional<std::string> value = Lua::getStringField(L, index, "id")) {
+ id = value;
+ }
+
if (boost::optional<std::string> value = Lua::getStringField(L, index, "body")) {
body = value;
}
@@ -353,6 +356,9 @@ SLUIFT_LUA_FUNCTION_WITH_HELP(
if (body && !body->empty()) {
message->setBody(*body);
}
+ if (id) {
+ message->setID(*id);
+ }
if (subject) {
message->setSubject(*subject);
}
@@ -372,7 +378,8 @@ SLUIFT_LUA_FUNCTION_WITH_HELP(
"self\n"
"body the text of the presence. Can alternatively be specified using the `status` option\n",
- "to the JID to send the message to\n"
+ "to the JID to send the presence to\n"
+ "id the id to set on the stanza\n"
"status the text of the presence\n"
"show the availability of the presence (`online`, `ffc`, `away`, `xa`, `dnd`)\n"
"priority the priority of the presence\n"
@@ -391,6 +398,9 @@ SLUIFT_LUA_FUNCTION_WITH_HELP(
if (boost::optional<std::string> value = Lua::getStringField(L, index, "to")) {
presence->setTo(*value);
}
+ if (boost::optional<std::string> id = Lua::getStringField(L, index, "id")) {
+ presence->setID(*id);
+ }
if (boost::optional<std::string> value = Lua::getStringField(L, index, "status")) {
presence->setStatus(*value);
}
@@ -602,6 +612,33 @@ static void pushEvent(lua_State* L, const SluiftClient::Event& event) {
Lua::registerTableToString(L, -1);
break;
}
+ case SluiftClient::Event::RosterAddType: {
+ Lua::Table result = boost::assign::map_list_of
+ ("type", std::make_shared<Lua::Value>(std::string("rosterpush")))
+ ("jid", std::make_shared<Lua::Value>(event.item.toString()))
+ ("action", std::make_shared<Lua::Value>(std::string("added")));
+ Lua::pushValue(L, result);
+ Lua::registerTableToString(L, -1);
+ break;
+ }
+ case SluiftClient::Event::RosterRemoveType: {
+ Lua::Table result = boost::assign::map_list_of
+ ("type", std::make_shared<Lua::Value>(std::string("rosterpush")))
+ ("jid", std::make_shared<Lua::Value>(event.item.toString()))
+ ("action", std::make_shared<Lua::Value>(std::string("removed")));
+ Lua::pushValue(L, result);
+ Lua::registerTableToString(L, -1);
+ break;
+ }
+ case SluiftClient::Event::RosterUpdateType: {
+ Lua::Table result = boost::assign::map_list_of
+ ("type", std::make_shared<Lua::Value>(std::string("rosterpush")))
+ ("jid", std::make_shared<Lua::Value>(event.item.toString()))
+ ("action", std::make_shared<Lua::Value>(std::string("updated")));
+ Lua::pushValue(L, result);
+ Lua::registerTableToString(L, -1);
+ break;
+ }
}
}
@@ -659,7 +696,9 @@ SLUIFT_LUA_FUNCTION(Client, get_next_event) {
}
else if (type) {
event = client->getNextEvent(
- timeout, lambda::bind(&SluiftClient::Event::type, lambda::_1) == *type);
+ timeout, [&](const SluiftClient::Event& event) {
+ return event.type == *type;
+ });
}
else {
event = client->getNextEvent(timeout);
@@ -701,7 +740,7 @@ SLUIFT_LUA_FUNCTION_WITH_HELP(
lua_getfield(L, 2, "groups");
if (!lua_isnil(L, -1)) {
if (lua_type(L, -1) == LUA_TTABLE) {
- for (size_t i = 1; i <= lua_objlen(L, -1); ++i) {
+ for (size_t i = 1; i <= lua_rawlen(L, -1); ++i) {
lua_rawgeti(L, -1, boost::numeric_cast<int>(i));
const char* rawGroup = lua_tostring(L, -1);
if (rawGroup) {
diff --git a/Sluift/component.cpp b/Sluift/component.cpp
index df96d43..c1b1da4 100644
--- a/Sluift/component.cpp
+++ b/Sluift/component.cpp
@@ -1,12 +1,10 @@
/*
- * Copyright (c) 2014-2016 Isode Limited.
+ * Copyright (c) 2014-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
#include <boost/assign/list_of.hpp>
-#include <boost/lambda/bind.hpp>
-#include <boost/lambda/lambda.hpp>
#include <Swiften/Base/IDGenerator.h>
#include <Swiften/Elements/DiscoInfo.h>
@@ -41,7 +39,6 @@
#include <Sluift/globals.h>
using namespace Swift;
-namespace lambda = boost::lambda;
static inline SluiftComponent* getComponent(lua_State* L) {
return *Lua::checkUserData<SluiftComponent>(L, 1);
@@ -99,13 +96,13 @@ SLUIFT_LUA_FUNCTION(Component, async_connect) {
SluiftComponent* component = getComponent(L);
std::string host;
- int port = 0;
+ unsigned short port = 0;
if (lua_istable(L, 2)) {
if (boost::optional<std::string> hostString = Lua::getStringField(L, 2, "host")) {
host = *hostString;
}
if (boost::optional<int> portInt = Lua::getIntField(L, 2, "port")) {
- port = *portInt;
+ port = boost::numeric_cast<unsigned short>(*portInt);
}
}
component->connect(host, port);
@@ -433,7 +430,9 @@ SLUIFT_LUA_FUNCTION(Component, get_next_event) {
}
else if (type) {
event = component->getNextEvent(
- timeout, lambda::bind(&SluiftComponent::Event::type, lambda::_1) == *type);
+ timeout, [&](const SluiftComponent::Event& event) {
+ return event.type == *type;
+ });
}
else {
event = component->getNextEvent(timeout);
diff --git a/Sluift/core.lua b/Sluift/core.lua
index 89c96ba..f35a603 100644
--- a/Sluift/core.lua
+++ b/Sluift/core.lua
@@ -6,7 +6,8 @@
local sluift = select(1, ...)
local _G = _G
-local pairs, ipairs, print, tostring, type, error, assert, next, rawset, xpcall, unpack, io = pairs, ipairs, print, tostring, type, error, assert, next, rawset, xpcall, unpack, io
+local pairs, ipairs, print, tostring, type, error, assert, next, rawset, xpcall, io = pairs, ipairs, print, tostring, type, error, assert, next, rawset, xpcall, io
+local unpack = table.unpack or unpack
local setmetatable, getmetatable = setmetatable, getmetatable
local string = require "string"
local table = require "table"
@@ -961,7 +962,7 @@ register_help(Component.process_events)
-- component:set_command{to = 'alice@wonderland.lit', command = { type = 'execute', node = 'uptime' }}
--
local get_set_shortcuts = {
- get = {'software_version', 'disco_items', 'xml', 'dom', 'vcard'},
+ get = {'software_version', 'disco_items', 'disco_info', 'xml', 'dom', 'vcard'},
set = {'command', 'vcard'}
}
for query_action, query_types in pairs(get_set_shortcuts) do
diff --git a/SwifTools/Application/ApplicationPathProvider.cpp b/SwifTools/Application/ApplicationPathProvider.cpp
index 8b952bb..77457ef 100644
--- a/SwifTools/Application/ApplicationPathProvider.cpp
+++ b/SwifTools/Application/ApplicationPathProvider.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2019 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -25,7 +25,7 @@ boost::filesystem::path ApplicationPathProvider::getProfileDir(const std::string
boost::filesystem::create_directory(result);
}
catch (const boost::filesystem::filesystem_error& e) {
- SWIFT_LOG(error) << e.what() << std::endl;
+ SWIFT_LOG(error) << e.what();
}
return result;
}
diff --git a/SwifTools/Application/MacOSXApplicationPathProvider.cpp b/SwifTools/Application/MacOSXApplicationPathProvider.cpp
index 684d8b2..d7b99b9 100644
--- a/SwifTools/Application/MacOSXApplicationPathProvider.cpp
+++ b/SwifTools/Application/MacOSXApplicationPathProvider.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2019 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -23,7 +23,7 @@ boost::filesystem::path MacOSXApplicationPathProvider::getDataDir() const {
boost::filesystem::create_directory(result);
}
catch (const boost::filesystem::filesystem_error& e) {
- SWIFT_LOG(error) << e.what() << std::endl;
+ SWIFT_LOG(error) << e.what();
}
return result;
}
diff --git a/SwifTools/Application/UnixApplicationPathProvider.cpp b/SwifTools/Application/UnixApplicationPathProvider.cpp
index e455d23..a345766 100644
--- a/SwifTools/Application/UnixApplicationPathProvider.cpp
+++ b/SwifTools/Application/UnixApplicationPathProvider.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2019 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -54,7 +54,7 @@ boost::filesystem::path UnixApplicationPathProvider::getDataDir() const {
boost::filesystem::create_directories(dataPath);
}
catch (const boost::filesystem::filesystem_error& e) {
- SWIFT_LOG(error) << "file system error: " << e.what() << std::endl;
+ SWIFT_LOG(error) << "file system error: " << e.what();
}
return dataPath;
}
diff --git a/SwifTools/AutoUpdater/SparkleAutoUpdater.mm b/SwifTools/AutoUpdater/SparkleAutoUpdater.mm
index b4a4c05..274ab3c 100644
--- a/SwifTools/AutoUpdater/SparkleAutoUpdater.mm
+++ b/SwifTools/AutoUpdater/SparkleAutoUpdater.mm
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2016-2017 Isode Limited.
+ * Copyright (c) 2016-2019 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -46,7 +46,7 @@ SparkleAutoUpdater::SparkleAutoUpdater(const std::string& appcastFeed) : d(new P
SWIFT_LOG(debug) << (canDoSilentUpdates ?
"The current running user has enough permissions to do a silent update." :
- "The current running user has insufficient permissions to do a silent update.") << std::endl;
+ "The current running user has insufficient permissions to do a silent update.");
setAppcastFeed(appcastFeed);
}
diff --git a/SwifTools/AutoUpdater/SparkleAutoUpdaterDelegate.mm b/SwifTools/AutoUpdater/SparkleAutoUpdaterDelegate.mm
index be58355..b9294d9 100644
--- a/SwifTools/AutoUpdater/SparkleAutoUpdaterDelegate.mm
+++ b/SwifTools/AutoUpdater/SparkleAutoUpdaterDelegate.mm
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2016-2017 Isode Limited.
+ * Copyright (c) 2016-2019 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -49,7 +49,7 @@ using namespace Swift;
- (void)updater:(SUUpdater *)updater failedToDownloadUpdate:(SUAppcastItem *)item error:(NSError *)error {
(void)updater;
(void)item;
- SWIFT_LOG(error) << ns2StdString([error localizedDescription]) << std::endl;
+ SWIFT_LOG(error) << ns2StdString([error localizedDescription]);
onNewUpdateState(AutoUpdater::State::ErrorCheckingForUpdate);
}
@@ -71,7 +71,7 @@ using namespace Swift;
onNewUpdateState(AutoUpdater::State::NoUpdateAvailable);
}
else {
- SWIFT_LOG(error) << ns2StdString([error localizedDescription]) << std::endl;
+ SWIFT_LOG(error) << ns2StdString([error localizedDescription]);
onNewUpdateState(AutoUpdater::State::ErrorCheckingForUpdate);
}
}
diff --git a/SwifTools/CrashReporter.cpp b/SwifTools/CrashReporter.cpp
index bf637c8..b02e73b 100644
--- a/SwifTools/CrashReporter.cpp
+++ b/SwifTools/CrashReporter.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012-2016 Isode Limited.
+ * Copyright (c) 2012-2019 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -46,7 +46,7 @@ CrashReporter::CrashReporter(const boost::filesystem::path& path, const std::str
boost::filesystem::create_directories(path);
}
catch (const boost::filesystem::filesystem_error& e) {
- SWIFT_LOG(error) << "ERROR: " << e.what() << std::endl;
+ SWIFT_LOG(error) << "ERROR: " << e.what();
}
}
diff --git a/SwifTools/Dock/Dock.h b/SwifTools/Dock/Dock.h
index 6120445..362aabc 100644
--- a/SwifTools/Dock/Dock.h
+++ b/SwifTools/Dock/Dock.h
@@ -1,11 +1,13 @@
/*
- * Copyright (c) 2010 Isode Limited.
+ * Copyright (c) 2010-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
#pragma once
+#include <cstddef>
+
namespace Swift {
@@ -13,6 +15,6 @@ namespace Swift {
public:
virtual ~Dock();
- virtual void setNumberOfPendingMessages(int i) = 0;
+ virtual void setNumberOfPendingMessages(size_t i) = 0;
};
}
diff --git a/SwifTools/Dock/MacOSXDock.h b/SwifTools/Dock/MacOSXDock.h
index 6b33506..ef85a88 100644
--- a/SwifTools/Dock/MacOSXDock.h
+++ b/SwifTools/Dock/MacOSXDock.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010 Isode Limited.
+ * Copyright (c) 2010-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -16,6 +16,6 @@ namespace Swift {
public:
MacOSXDock(CocoaApplication* application);
- virtual void setNumberOfPendingMessages(int i);
+ virtual void setNumberOfPendingMessages(size_t i);
};
}
diff --git a/SwifTools/Dock/MacOSXDock.mm b/SwifTools/Dock/MacOSXDock.mm
index 5c7207c..3935ac0 100644
--- a/SwifTools/Dock/MacOSXDock.mm
+++ b/SwifTools/Dock/MacOSXDock.mm
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2015-2016 Isode Limited.
+ * Copyright (c) 2015-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -18,7 +18,7 @@ namespace Swift {
MacOSXDock::MacOSXDock(CocoaApplication*) {
}
-void MacOSXDock::setNumberOfPendingMessages(int i) {
+void MacOSXDock::setNumberOfPendingMessages(size_t i) {
std::string label(i > 0 ? boost::lexical_cast<std::string>(i) : "");
NSString *labelString = [[NSString alloc] initWithUTF8String: label.c_str()];
[[NSApp dockTile] setBadgeLabel: labelString];
diff --git a/SwifTools/Dock/NullDock.h b/SwifTools/Dock/NullDock.h
index 9f3c554..137ba03 100644
--- a/SwifTools/Dock/NullDock.h
+++ b/SwifTools/Dock/NullDock.h
@@ -1,11 +1,13 @@
/*
- * Copyright (c) 2010 Isode Limited.
+ * Copyright (c) 2010-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
#pragma once
+#include <cstddef>
+
#include <SwifTools/Dock/Dock.h>
namespace Swift {
@@ -13,7 +15,7 @@ namespace Swift {
public:
NullDock() {}
- virtual void setNumberOfPendingMessages(int) {
+ virtual void setNumberOfPendingMessages(size_t) {
}
};
}
diff --git a/SwifTools/Dock/WindowsDock.h b/SwifTools/Dock/WindowsDock.h
index fc10a48..f9a9dae 100644
--- a/SwifTools/Dock/WindowsDock.h
+++ b/SwifTools/Dock/WindowsDock.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -18,7 +18,7 @@ namespace Swift {
public:
WindowsDock(QSystemTrayIcon* tray, Notifier* notifier) : tray(tray), notifier(notifier) {}
- virtual void setNumberOfPendingMessages(int i) {
+ virtual void setNumberOfPendingMessages(size_t i) {
if (notifier->isAvailable()) {
return;
}
diff --git a/SwifTools/HunspellChecker.cpp b/SwifTools/HunspellChecker.cpp
index 1de369b..019a4dc 100644
--- a/SwifTools/HunspellChecker.cpp
+++ b/SwifTools/HunspellChecker.cpp
@@ -84,12 +84,12 @@ bool HunspellChecker::isAutomaticallyDetectingLanguage() {
void HunspellChecker::setActiveLanguage(const std::string& language) {
auto dictionaries = detectedDictionaries();
if (dictionaries.find(language) != dictionaries.end()) {
- SWIFT_LOG(debug) << "Initialized Hunspell with dic,aff files " << dictionaries[language].dicPath << " , " << dictionaries[language].affPath << std::endl;
+ SWIFT_LOG(debug) << "Initialized Hunspell with dic,aff files " << dictionaries[language].dicPath << " , " << dictionaries[language].affPath;
speller_ = std::unique_ptr<Hunspell>(new Hunspell(dictionaries[language].affPath.c_str(), dictionaries[language].dicPath.c_str()));
activeLangauge_ = language;
}
else {
- SWIFT_LOG(warning) << "Unsupported language '" << language << "'" << std::endl;
+ SWIFT_LOG(warning) << "Unsupported language '" << language << "'";
}
}
diff --git a/SwifTools/Idle/MacOSXIdleQuerier.cpp b/SwifTools/Idle/MacOSXIdleQuerier.cpp
index 6d6780b..89fa050 100644
--- a/SwifTools/Idle/MacOSXIdleQuerier.cpp
+++ b/SwifTools/Idle/MacOSXIdleQuerier.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010 Isode Limited.
+ * Copyright (c) 2010-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -10,6 +10,8 @@
#include <cassert>
#include <iostream>
+#include <limits>
+
#include <boost/numeric/conversion/cast.hpp>
#include <CoreFoundation/CoreFoundation.h>
@@ -29,7 +31,12 @@ int MacOSXIdleQuerier::getIdleTimeSeconds() {
assert(result);
(void) result;
CFRelease(property);
- return boost::numeric_cast<int>(idle / 1000000000);
+ try {
+ return boost::numeric_cast<int>(idle / 1000000000);
+ }
+ catch (const boost::numeric::bad_numeric_cast&) {
+ return std::numeric_limits<int>::max();
+ }
}
}
diff --git a/SwifTools/MacOSXChecker.mm b/SwifTools/MacOSXChecker.mm
index aefe3e7..afaa87c 100644
--- a/SwifTools/MacOSXChecker.mm
+++ b/SwifTools/MacOSXChecker.mm
@@ -5,7 +5,7 @@
*/
/*
- * Copyright (c) 2015-2016 Isode Limited.
+ * Copyright (c) 2015-2017 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -19,6 +19,8 @@
#include <AppKit/AppKit.h>
+#include <SwifTools/Cocoa/CocoaUtil.h>
+
namespace Swift {
MacOSXChecker::MacOSXChecker() {
@@ -54,7 +56,7 @@ void MacOSXChecker::getSuggestions(const std::string& word, std::vector<std::str
NSString* wordString = [[NSString alloc] initWithUTF8String: word.c_str()];
NSArray* suggestions = [spellChecker guessesForWordRange:NSMakeRange(0, [wordString length]) inString:wordString language:nil inSpellDocumentWithTag:0];
for(unsigned int i = 0; i < [suggestions count]; ++i) {
- list.push_back(std::string([[suggestions objectAtIndex:i] UTF8String]));
+ list.push_back(ns2StdString([suggestions objectAtIndex:i]));
}
[wordString release];
}
diff --git a/SwifTools/Notifier/NotificationCenterNotifier.mm b/SwifTools/Notifier/NotificationCenterNotifier.mm
index 1538186..e6fdfb6 100644
--- a/SwifTools/Notifier/NotificationCenterNotifier.mm
+++ b/SwifTools/Notifier/NotificationCenterNotifier.mm
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2015-2016 Isode Limited.
+ * Copyright (c) 2015-2019 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -88,7 +88,7 @@ void NotificationCenterNotifier::handleUserNotificationActivated(const std::stri
}
}
else {
- SWIFT_LOG(warning) << "Missing callback entry for activated notification. The activate notification may come from another instance." << std::endl;
+ SWIFT_LOG(warning) << "Missing callback entry for activated notification. The activate notification may come from another instance.";
}
}
diff --git a/SwifTools/SpellParser.cpp b/SwifTools/SpellParser.cpp
index 5bafa6e..e449b45 100644
--- a/SwifTools/SpellParser.cpp
+++ b/SwifTools/SpellParser.cpp
@@ -5,7 +5,7 @@
*/
/*
- * Copyright (c) 2016 Isode Limited.
+ * Copyright (c) 2016-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -15,7 +15,6 @@
#include <string>
#include <boost/bind.hpp>
-#include <boost/numeric/conversion/cast.hpp>
#include <boost/ref.hpp>
#include <boost/spirit/include/lex_lexertl.hpp>
@@ -47,14 +46,14 @@ struct counter
{
switch (t.id()) {
case ID_WWW:
- position += boost::numeric_cast<size_t>(t.value().size());
+ position += static_cast<std::size_t>(t.value().size());
break;
case ID_HTTP:
- position += boost::numeric_cast<size_t>(t.value().size());
+ position += static_cast<std::size_t>(t.value().size());
break;
case ID_WORD: // matched a word
- wordPositions.push_back(boost::tuples::make_tuple(position, position + boost::numeric_cast<size_t>(t.value().size())));
- position += boost::numeric_cast<size_t>(t.value().size());
+ wordPositions.push_back(boost::tuples::make_tuple(position, position + static_cast<std::size_t>(t.value().size())));
+ position += static_cast<std::size_t>(t.value().size());
break;
case ID_CHAR: // match a simple char
++position;
diff --git a/Swift/ChangeLog.md b/Swift/ChangeLog.md
index 32b5711..9152b50 100644
--- a/Swift/ChangeLog.md
+++ b/Swift/ChangeLog.md
@@ -1,3 +1,57 @@
+4.0.3 (2019-01-03)
+------------------
+- Fix handling of empty bookmark responses
+
+4.0.2 (2018-04-05)
+------------------
+- Fix versioning issue in Windows Installer process
+
+4.0.1 (2018-03-28)
+------------------
+- Allow setting vCard on servers that do not return an empty vCard on fresh accounts
+
+4.0 (2018-03-20)
+----------------
+- New chat theme including a new font
+- Support for message carbons (XEP-0280)
+- Enabled trellis mode as a default feature, allowing several tiled chats windows to be shown at once
+- Redesigned keyword highlighting
+- Improve date formatting
+- Fix Last Message Correction in multi client scenarios
+- Fix UI layout issue for translations that require right-to-left (RTL) layout
+- Fix UX issues in trellis mode
+- Improvements to font size handling in the chat theme
+- Fix display of default avatar on Windows
+- Support for automatic software updates on macOS
+- macOS releases are now code-signed
+- Support for unicode emojis on macOS
+- Add AppImage for Linux 64-bit as a supported platform
+- Improved spell checker support on Linux
+- And assorted smaller features and usability enhancements
+
+4.0-rc6 ( 2018-03-07 )
+----------------------
+- Small usability fixes in Carbons ( XEP-0280 ) handling and Windows installer
+- Fix crashes related to room invitations, layout changes, and vCard handling
+- And smaller bug fixes
+
+4.0-rc5 ( 2018-01-09 )
+----------------------
+- Fix crash during sleep on macOS
+
+4.0-rc4 ( 2018-01-04 )
+----------------------
+- Remove conflicting shortcut
+- Debian packaging fixes
+
+4.0-rc3 ( 2017-11-28 )
+----------------------
+- Fix crash in emoticon dialog
+- Fix Windows MSI installer when updating from earlier Swift version
+- Update translations ( Dutch, German )
+- Add AppImage for Linux 64-bit as a supported platform
+- And smaller bug fixes
+
4.0-rc2 ( 2017-05-22 )
----------------------
- Fix regression in chat window titles for chat rooms
@@ -10,7 +64,7 @@
- Fix Last Message Correction in multi client scenarios
- Fix display of default avatar on Windows
- Support for automatic software updates on macOS
-- Redesigned keyword highlighing
+- Redesigned keyword highlighting
- Support for unicode emojis on macOS
- Improvements to font size handling in the chat theme
- Fix UX issues in trellis mode
@@ -117,4 +171,4 @@ Yoann Blein, Catalin Badea, Pavol Babincak, Mateusz Piekos, Alexey Melnikov and
1.0 ( 2011-04-18 )
------------------
-- Initial release. \ No newline at end of file
+- Initial release.
diff --git a/Swift/Controllers/AccountController.cpp b/Swift/Controllers/AccountController.cpp
new file mode 100644
index 0000000..a257cc4
--- /dev/null
+++ b/Swift/Controllers/AccountController.cpp
@@ -0,0 +1,873 @@
+/*
+ * Copyright (c) 2010-2019 Isode Limited.
+ * All rights reserved.
+ * See the COPYING file for more information.
+ */
+
+#include <Swift/Controllers/AccountController.h>
+
+#include <cstdlib>
+#include <memory>
+
+#include <boost/bind.hpp>
+#include <boost/lexical_cast.hpp>
+
+#include <Swiften/Base/Algorithm.h>
+#include <Swiften/Base/Log.h>
+#include <Swiften/Base/String.h>
+#include <Swiften/Base/format.h>
+#include <Swiften/Client/Client.h>
+#include <Swiften/Client/ClientBlockListManager.h>
+#include <Swiften/Client/ClientXMLTracer.h>
+#include <Swiften/Client/NickResolver.h>
+#include <Swiften/Client/StanzaChannel.h>
+#include <Swiften/Client/Storages.h>
+#include <Swiften/Crypto/CryptoProvider.h>
+#include <Swiften/Disco/CapsInfoGenerator.h>
+#include <Swiften/Disco/ClientDiscoManager.h>
+#include <Swiften/Disco/GetDiscoInfoRequest.h>
+#include <Swiften/Elements/ChatState.h>
+#include <Swiften/Elements/DiscoInfo.h>
+#include <Swiften/Elements/Presence.h>
+#include <Swiften/Elements/VCardUpdate.h>
+#include <Swiften/FileTransfer/FileTransferManager.h>
+#include <Swiften/Network/NetworkFactories.h>
+#include <Swiften/Network/TimerFactory.h>
+#include <Swiften/Presence/PresenceSender.h>
+#include <Swiften/Queries/Requests/EnableCarbonsRequest.h>
+#include <Swiften/StringCodecs/Base64.h>
+#include <Swiften/StringCodecs/Hexify.h>
+#include <Swiften/VCards/GetVCardRequest.h>
+#include <Swiften/VCards/VCardManager.h>
+
+#ifdef SWIFTEN_PLATFORM_WIN32
+#include <Swiften/SASL/WindowsAuthentication.h>
+#endif
+
+#include <Swift/Controllers/AdHocManager.h>
+#include <Swift/Controllers/BlockListController.h>
+#include <Swift/Controllers/BuildVersion.h>
+#include <Swift/Controllers/Chat/Chattables.h>
+#include <Swift/Controllers/Chat/ChatsManager.h>
+#include <Swift/Controllers/Chat/MUCController.h>
+#include <Swift/Controllers/Chat/UserSearchController.h>
+#include <Swift/Controllers/ContactEditController.h>
+#include <Swift/Controllers/ContactSuggester.h>
+#include <Swift/Controllers/ContactsFromXMPPRoster.h>
+#include <Swift/Controllers/EventNotifier.h>
+#include <Swift/Controllers/EventWindowController.h>
+#include <Swift/Controllers/FdpFormSubmitController.h>
+#include <Swift/Controllers/FileTransfer/FileTransferOverview.h>
+#include <Swift/Controllers/FileTransferListController.h>
+#include <Swift/Controllers/Highlighting/HighlightEditorController.h>
+#include <Swift/Controllers/Highlighting/HighlightManager.h>
+#include <Swift/Controllers/HistoryController.h>
+#include <Swift/Controllers/HistoryViewController.h>
+#include <Swift/Controllers/Intl.h>
+#include <Swift/Controllers/PresenceNotifier.h>
+#include <Swift/Controllers/ProfileController.h>
+#include <Swift/Controllers/Roster/RosterController.h>
+#include <Swift/Controllers/SettingConstants.h>
+#include <Swift/Controllers/Settings/SettingsProvider.h>
+#include <Swift/Controllers/ShowProfileController.h>
+#include <Swift/Controllers/SoundEventController.h>
+#include <Swift/Controllers/SoundPlayer.h>
+#include <Swift/Controllers/StatusTracker.h>
+#include <Swift/Controllers/Storages/CertificateStorageFactory.h>
+#include <Swift/Controllers/Storages/CertificateStorageTrustChecker.h>
+#include <Swift/Controllers/Storages/StoragesFactory.h>
+#include <Swift/Controllers/SystemTray.h>
+#include <Swift/Controllers/SystemTrayController.h>
+#include <Swift/Controllers/UIEvents/JoinMUCUIEvent.h>
+#include <Swift/Controllers/UIEvents/RequestChatUIEvent.h>
+#include <Swift/Controllers/UIEvents/UIEventStream.h>
+#include <Swift/Controllers/UIInterfaces/LoginWindow.h>
+#include <Swift/Controllers/UIInterfaces/LoginWindowFactory.h>
+#include <Swift/Controllers/UIInterfaces/MainWindow.h>
+#include <Swift/Controllers/UIInterfaces/UIFactory.h>
+#include <Swift/Controllers/WhiteboardManager.h>
+#include <Swift/Controllers/XMLConsoleController.h>
+#include <Swift/Controllers/XMPPEvents/EventController.h>
+#include <Swift/Controllers/XMPPURIController.h>
+
+#include <SwifTools/Dock/Dock.h>
+#include <SwifTools/Idle/IdleDetector.h>
+#include <SwifTools/Notifier/TogglableNotifier.h>
+
+namespace Swift {
+
+static const std::string CLIENT_NAME = "Swift";
+static const std::string CLIENT_NODE = "http://swift.im";
+
+
+AccountController::AccountController(
+ EventLoop* eventLoop,
+ NetworkFactories* networkFactories,
+ UIFactory* uiFactories,
+ SettingsProvider* settings,
+ SystemTray* systemTray,
+ SoundPlayer* soundPlayer,
+ StoragesFactory* storagesFactory,
+ CertificateStorageFactory* certificateStorageFactory,
+ Dock* dock,
+ Notifier* notifier,
+ URIHandler* uriHandler,
+ IdleDetector* idleDetector,
+ const std::map<std::string, std::string>& emoticons,
+ bool useDelayForLatency) :
+ eventLoop_(eventLoop),
+ networkFactories_(networkFactories),
+ uiFactory_(uiFactories),
+ storagesFactory_(storagesFactory),
+ certificateStorageFactory_(certificateStorageFactory),
+ settings_(settings),
+ uriHandler_(uriHandler),
+ idleDetector_(idleDetector),
+ loginWindow_(nullptr) ,
+ useDelayForLatency_(useDelayForLatency),
+ ftOverview_(nullptr),
+ emoticons_(emoticons),
+ fdpFormSubmitController_(nullptr) {
+ storages_ = nullptr;
+ certificateStorage_ = nullptr;
+ certificateTrustChecker_ = nullptr;
+ statusTracker_ = nullptr;
+ presenceNotifier_ = nullptr;
+ eventNotifier_ = nullptr;
+ rosterController_ = nullptr;
+ chatsManager_ = nullptr;
+ historyController_ = nullptr;
+ historyViewController_ = nullptr;
+ eventWindowController_ = nullptr;
+ profileController_ = nullptr;
+ blockListController_ = nullptr;
+ showProfileController_ = nullptr;
+ contactEditController_ = nullptr;
+ userSearchControllerChat_ = nullptr;
+ userSearchControllerAdd_ = nullptr;
+ userSearchControllerInvite_ = nullptr;
+ contactsFromRosterProvider_ = nullptr;
+ contactSuggesterWithoutRoster_ = nullptr;
+ contactSuggesterWithRoster_ = nullptr;
+ whiteboardManager_ = nullptr;
+ adHocManager_ = nullptr;
+ quitRequested_ = false;
+ clientInitialized_ = false;
+ offlineRequested_ = false;
+
+ timeBeforeNextReconnect_ = -1;
+ dock_ = dock;
+ uiEventStream_ = new UIEventStream();
+
+ notifier_ = new TogglableNotifier(notifier);
+ notifier_->setPersistentEnabled(settings_->getSetting(SettingConstants::SHOW_NOTIFICATIONS));
+ eventController_ = new EventController();
+ eventController_->onEventQueueLengthChange.connect(boost::bind(&AccountController::handleEventQueueLengthChange, this, _1));
+
+ systemTrayController_ = new SystemTrayController(eventController_, systemTray);
+ loginWindow_ = uiFactory_->createLoginWindow(uiEventStream_);
+ loginWindow_->setShowNotificationToggle(!notifier->isExternallyConfigured());
+
+ highlightManager_ = new HighlightManager(settings_);
+ highlightEditorController_ = new HighlightEditorController(uiEventStream_, uiFactory_, highlightManager_);
+
+ soundEventController_ = new SoundEventController(eventController_, soundPlayer, settings, highlightManager_);
+
+ xmppURIController_ = new XMPPURIController(uriHandler_, uiEventStream_);
+
+ loginWindow_->onLoginRequest.connect(boost::bind(&AccountController::handleLoginRequest, this, _1, _2, _3, _4, _5, _6, _7));
+ loginWindow_->onPurgeSavedLoginRequest.connect(boost::bind(&AccountController::handlePurgeSavedLoginRequest, this, _1));
+ loginWindow_->onCancelLoginRequest.connect(boost::bind(&AccountController::handleCancelLoginRequest, this));
+ loginWindow_->onQuitRequest.connect(boost::bind(&AccountController::handleQuitRequest, this));
+
+ idleDetector_->setIdleTimeSeconds(settings->getSetting(SettingConstants::IDLE_TIMEOUT));
+ idleDetector_->onIdleChanged.connect(boost::bind(&AccountController::handleInputIdleChanged, this, _1));
+
+ xmlConsoleController_ = new XMLConsoleController(uiEventStream_, uiFactory_);
+
+ fileTransferListController_ = new FileTransferListController(uiEventStream_, uiFactory_);
+
+ settings_->onSettingChanged.connect(boost::bind(&AccountController::handleSettingChanged, this, _1));
+
+}
+
+AccountController::~AccountController() {
+ idleDetector_->onIdleChanged.disconnect(boost::bind(&AccountController::handleInputIdleChanged, this, _1));
+
+ purgeCachedCredentials();
+ //setManagersOffline();
+ eventController_->disconnectAll();
+
+ resetClient();
+ delete highlightEditorController_;
+ delete highlightManager_;
+ delete fileTransferListController_;
+ delete xmlConsoleController_;
+ delete xmppURIController_;
+ delete soundEventController_;
+ delete systemTrayController_;
+ delete eventController_;
+ delete notifier_;
+ delete uiEventStream_;
+}
+
+void AccountController::purgeCachedCredentials() {
+ safeClear(password_);
+}
+
+void AccountController::resetClient() {
+ purgeCachedCredentials();
+ resetCurrentError();
+ resetPendingReconnects();
+ vCardPhotoHash_.clear();
+ delete contactEditController_;
+ contactEditController_ = nullptr;
+ delete profileController_;
+ profileController_ = nullptr;
+ delete showProfileController_;
+ showProfileController_ = nullptr;
+ delete eventWindowController_;
+ eventWindowController_ = nullptr;
+ delete chatsManager_;
+ chatsManager_ = nullptr;
+#ifdef SWIFT_EXPERIMENTAL_HISTORY
+ delete historyViewController_;
+ historyViewController_ = nullptr;
+ delete historyController_;
+ historyController_ = nullptr;
+#endif
+ fileTransferListController_->setFileTransferOverview(nullptr);
+ delete ftOverview_;
+ ftOverview_ = nullptr;
+ delete blockListController_;
+ blockListController_ = nullptr;
+ delete rosterController_;
+ rosterController_ = nullptr;
+ chattables_.reset();
+ delete eventNotifier_;
+ eventNotifier_ = nullptr;
+ delete presenceNotifier_;
+ presenceNotifier_ = nullptr;
+ delete certificateTrustChecker_;
+ certificateTrustChecker_ = nullptr;
+ delete certificateStorage_;
+ certificateStorage_ = nullptr;
+ delete storages_;
+ storages_ = nullptr;
+ delete statusTracker_;
+ statusTracker_ = nullptr;
+ delete profileSettings_;
+ profileSettings_ = nullptr;
+ delete userSearchControllerChat_;
+ userSearchControllerChat_ = nullptr;
+ delete userSearchControllerAdd_;
+ userSearchControllerAdd_ = nullptr;
+ delete userSearchControllerInvite_;
+ userSearchControllerInvite_ = nullptr;
+ delete contactSuggesterWithoutRoster_;
+ contactSuggesterWithoutRoster_ = nullptr;
+ delete contactSuggesterWithRoster_;
+ contactSuggesterWithRoster_ = nullptr;
+ delete contactsFromRosterProvider_;
+ contactsFromRosterProvider_ = nullptr;
+ delete adHocManager_;
+ adHocManager_ = nullptr;
+ delete whiteboardManager_;
+ whiteboardManager_ = nullptr;
+ clientInitialized_ = false;
+}
+
+void AccountController::handleSettingChanged(const std::string& settingPath) {
+ if (settingPath == SettingConstants::SHOW_NOTIFICATIONS.getKey()) {
+ notifier_->setPersistentEnabled(settings_->getSetting(SettingConstants::SHOW_NOTIFICATIONS));
+ }
+}
+
+void AccountController::resetPendingReconnects() {
+ timeBeforeNextReconnect_ = -1;
+ if (reconnectTimer_) {
+ reconnectTimer_->stop();
+ reconnectTimer_.reset();
+ }
+ resetCurrentError();
+}
+
+void AccountController::resetCurrentError() {
+ if (lastDisconnectError_) {
+ lastDisconnectError_->conclude();
+ lastDisconnectError_ = std::shared_ptr<ErrorEvent>();
+ }
+}
+
+void AccountController::handleConnected() {
+ boundJID_ = client_->getJID();
+ resetCurrentError();
+ resetPendingReconnects();
+
+ if (settings_->getSetting(SettingConstants::FORGET_PASSWORDS)) {
+ purgeCachedCredentials();
+ }
+
+ bool freshLogin = rosterController_ == nullptr;
+ myStatusLooksOnline_ = true;
+ if (freshLogin) {
+ profileController_ = new ProfileController(client_->getVCardManager(), uiFactory_, uiEventStream_);
+ showProfileController_ = new ShowProfileController(client_->getVCardManager(), uiFactory_, uiEventStream_);
+ ftOverview_ = new FileTransferOverview(client_->getFileTransferManager());
+ fileTransferListController_->setFileTransferOverview(ftOverview_);
+ chattables_ = std::make_unique<Chattables>();
+ rosterController_ = new RosterController(boundJID_, client_->getRoster(), client_->getAvatarManager(), uiFactory_, client_->getNickManager(), client_->getNickResolver(), client_->getPresenceOracle(), client_->getSubscriptionManager(), eventController_, uiEventStream_, client_->getIQRouter(), settings_, client_->getEntityCapsProvider(), client_->getClientBlockListManager(), client_->getVCardManager(), *chattables_);
+ rosterController_->onChangeStatusRequest.connect(boost::bind(&AccountController::handleChangeStatusRequest, this, _1, _2));
+ rosterController_->onSignOutRequest.connect(boost::bind(&AccountController::signOut, this));
+ rosterController_->getWindow()->onShowCertificateRequest.connect(boost::bind(&AccountController::handleShowCertificateRequest, this));
+
+ blockListController_ = new BlockListController(client_->getClientBlockListManager(), uiEventStream_, uiFactory_, eventController_);
+
+ contactEditController_ = new ContactEditController(rosterController_, client_->getVCardManager(), uiFactory_, uiEventStream_);
+ whiteboardManager_ = new WhiteboardManager(uiFactory_, uiEventStream_, client_->getNickResolver(), client_->getWhiteboardSessionManager());
+
+ /* Doing this early as an ordering fix. Various things later will
+ * want to have the user's nick available and this means it will
+ * be before they receive stanzas that need it (e.g. bookmarks).*/
+ client_->getVCardManager()->requestOwnVCard();
+
+ contactSuggesterWithoutRoster_ = new ContactSuggester();
+ contactSuggesterWithRoster_ = new ContactSuggester();
+
+ userSearchControllerInvite_ = new UserSearchController(UserSearchController::Type::InviteToChat, jid_, uiEventStream_, client_->getVCardManager(), uiFactory_, client_->getIQRouter(), rosterController_, contactSuggesterWithRoster_, client_->getAvatarManager(), client_->getPresenceOracle(), profileSettings_);
+#ifdef SWIFT_EXPERIMENTAL_HISTORY
+ historyController_ = new HistoryController(storages_->getHistoryStorage());
+ historyViewController_ = new HistoryViewController(jid_, uiEventStream_, historyController_, client_->getNickResolver(), client_->getAvatarManager(), client_->getPresenceOracle(), uiFactory_);
+ chatsManager_ = new ChatsManager(jid_, client_->getStanzaChannel(), client_->getIQRouter(), eventController_, uiFactory_, uiFactory_, client_->getNickResolver(), client_->getPresenceOracle(), client_->getPresenceSender(), uiEventStream_, uiFactory_, useDelayForLatency_, networkFactories_->getTimerFactory(), client_->getMUCRegistry(), client_->getEntityCapsProvider(), client_->getMUCManager(), uiFactory_, profileSettings_, ftOverview_, client_->getRoster(), !settings_->getSetting(SettingConstants::REMEMBER_RECENT_CHATS), settings_, historyController_, whiteboardManager_, highlightManager_, client_->getClientBlockListManager(), emoticons_, client_->getVCardManager());
+#else
+ chatsManager_ = new ChatsManager(jid_, client_->getStanzaChannel(), client_->getIQRouter(), eventController_, uiFactory_, uiFactory_, client_->getNickResolver(), client_->getPresenceOracle(), client_->getPresenceSender(), uiEventStream_, uiFactory_, useDelayForLatency_, networkFactories_->getTimerFactory(), client_->getMUCRegistry(), client_->getEntityCapsProvider(), client_->getMUCManager(), uiFactory_, profileSettings_, ftOverview_, client_->getRoster(), !settings_->getSetting(SettingConstants::REMEMBER_RECENT_CHATS), settings_, nullptr, whiteboardManager_, highlightManager_, client_->getClientBlockListManager(), emoticons_, client_->getVCardManager(), *chattables_);
+#endif
+ contactsFromRosterProvider_ = new ContactsFromXMPPRoster(client_->getRoster(), client_->getAvatarManager(), client_->getPresenceOracle());
+ contactSuggesterWithoutRoster_->addContactProvider(chatsManager_);
+ contactSuggesterWithRoster_->addContactProvider(chatsManager_);
+ contactSuggesterWithRoster_->addContactProvider(contactsFromRosterProvider_);
+ highlightEditorController_->setContactSuggester(contactSuggesterWithoutRoster_);
+
+ client_->onMessageReceived.connect(boost::bind(&ChatsManager::handleIncomingMessage, chatsManager_, _1));
+ chatsManager_->setAvatarManager(client_->getAvatarManager());
+
+ eventWindowController_ = new EventWindowController(eventController_, uiFactory_);
+
+ loginWindow_->morphInto(rosterController_->getWindow());
+
+ DiscoInfo discoInfo;
+ discoInfo.addIdentity(DiscoInfo::Identity(CLIENT_NAME, "client", "pc"));
+ discoInfo.addFeature(DiscoInfo::ChatStatesFeature);
+ discoInfo.addFeature(DiscoInfo::SecurityLabelsFeature);
+ discoInfo.addFeature(DiscoInfo::MessageCorrectionFeature);
+#ifdef SWIFT_EXPERIMENTAL_FT
+ discoInfo.addFeature(DiscoInfo::JingleFeature);
+ discoInfo.addFeature(DiscoInfo::JingleFTFeature);
+ discoInfo.addFeature(DiscoInfo::JingleTransportsIBBFeature);
+ discoInfo.addFeature(DiscoInfo::JingleTransportsS5BFeature);
+#endif
+#ifdef SWIFT_EXPERIMENTAL_WB
+ discoInfo.addFeature(DiscoInfo::WhiteboardFeature);
+#endif
+ discoInfo.addFeature(DiscoInfo::MessageDeliveryReceiptsFeature);
+ client_->getDiscoManager()->setCapsNode(CLIENT_NODE);
+ client_->getDiscoManager()->setDiscoInfo(discoInfo);
+
+ userSearchControllerChat_ = new UserSearchController(UserSearchController::Type::StartChat, jid_, uiEventStream_, client_->getVCardManager(), uiFactory_, client_->getIQRouter(), rosterController_, contactSuggesterWithRoster_, client_->getAvatarManager(), client_->getPresenceOracle(), profileSettings_);
+ userSearchControllerAdd_ = new UserSearchController(UserSearchController::Type::AddContact, jid_, uiEventStream_, client_->getVCardManager(), uiFactory_, client_->getIQRouter(), rosterController_, contactSuggesterWithoutRoster_, client_->getAvatarManager(), client_->getPresenceOracle(), profileSettings_);
+ adHocManager_ = new AdHocManager(JID(boundJID_.getDomain()), uiFactory_, client_->getIQRouter(), uiEventStream_, rosterController_->getWindow());
+
+ chatsManager_->onImpromptuMUCServiceDiscovered.connect(boost::bind(&UserSearchController::setCanInitiateImpromptuMUC, userSearchControllerChat_, _1));
+ }
+ loginWindow_->setIsLoggingIn(false);
+
+ client_->requestRoster();
+
+ GetDiscoInfoRequest::ref discoInfoRequest = GetDiscoInfoRequest::create(JID(boundJID_.getDomain()), client_->getIQRouter());
+ discoInfoRequest->onResponse.connect(boost::bind(&AccountController::handleServerDiscoInfoResponse, this, _1, _2));
+ discoInfoRequest->send();
+
+ client_->getVCardManager()->requestOwnVCard();
+
+ rosterController_->setJID(boundJID_);
+ rosterController_->setEnabled(true);
+ rosterController_->getWindow()->setStreamEncryptionStatus(client_->isStreamEncrypted());
+ profileController_->setAvailable(true);
+ contactEditController_->setAvailable(true);
+ /* Send presence later to catch all the incoming presences. */
+ sendPresence(statusTracker_->getNextPresence());
+
+ /* Enable chats last of all, so rejoining MUCs has the right sent presence */
+ assert(chatsManager_);
+ chatsManager_->setOnline(true);
+ adHocManager_->setOnline(true);
+}
+
+void AccountController::handleEventQueueLengthChange(size_t count) {
+ dock_->setNumberOfPendingMessages(count);
+}
+
+void AccountController::reconnectAfterError() {
+ if (reconnectTimer_) {
+ reconnectTimer_->stop();
+ }
+ performLoginFromCachedCredentials();
+}
+
+void AccountController::handleChangeStatusRequest(StatusShow::Type show, const std::string &statusText) {
+ std::shared_ptr<Presence> presence(new Presence());
+ if (show == StatusShow::None) {
+ // Note: this is misleading, None doesn't mean unavailable on the wire.
+ presence->setType(Presence::Unavailable);
+ resetPendingReconnects();
+ myStatusLooksOnline_ = false;
+ offlineRequested_ = true;
+ }
+ else {
+ offlineRequested_ = false;
+ presence->setShow(show);
+ }
+ presence->setStatus(statusText);
+ statusTracker_->setRequestedPresence(presence);
+ if (presence->getType() != Presence::Unavailable) {
+ profileSettings_->storeInt("lastShow", presence->getShow());
+ profileSettings_->storeString("lastStatus", presence->getStatus());
+ }
+ if (presence->getType() != Presence::Unavailable && !client_->isAvailable()) {
+ performLoginFromCachedCredentials();
+ } else {
+ sendPresence(presence);
+ }
+}
+
+void AccountController::sendPresence(std::shared_ptr<Presence> presence) {
+ rosterController_->getWindow()->setMyStatusType(presence->getShow());
+ rosterController_->getWindow()->setMyStatusText(presence->getStatus());
+ systemTrayController_->setMyStatusType(presence->getShow());
+ notifier_->setTemporarilyDisabled(presence->getShow() == StatusShow::DND);
+
+ // Add information and send
+ presence->updatePayload(std::make_shared<VCardUpdate>(vCardPhotoHash_));
+ client_->getPresenceSender()->sendPresence(presence);
+ if (presence->getType() == Presence::Unavailable) {
+ logout();
+ }
+}
+
+void AccountController::handleInputIdleChanged(bool idle) {
+ if (!statusTracker_) {
+ //Haven't logged in yet.
+ return;
+ }
+
+ if (settings_->getSetting(SettingConstants::IDLE_GOES_OFFLINE)) {
+ if (idle) {
+ logout();
+ }
+ }
+ else {
+ if (idle) {
+ if (statusTracker_->goAutoAway(idleDetector_->getIdleTimeSeconds())) {
+ if (client_ && client_->isAvailable()) {
+ sendPresence(statusTracker_->getNextPresence());
+ }
+ }
+ } else {
+ if (statusTracker_->goAutoUnAway()) {
+ if (client_ && client_->isAvailable()) {
+ sendPresence(statusTracker_->getNextPresence());
+ }
+ }
+ }
+ }
+}
+
+void AccountController::handleShowCertificateRequest() {
+ std::vector<Certificate::ref> chain = client_->getStanzaChannel()->getPeerCertificateChain();
+ rosterController_->getWindow()->openCertificateDialog(chain);
+}
+
+void AccountController::handleLoginRequest(const std::string &username, const std::string &password, const std::string& certificatePath, CertificateWithKey::ref certificate, const ClientOptions& options, bool remember, bool loginAutomatically) {
+ jid_ = JID(username);
+ if (options.singleSignOn && (!jid_.isValid() || !jid_.getNode().empty())) {
+ loginWindow_->setMessage(QT_TRANSLATE_NOOP("", "User address invalid. User address should be of the form 'wonderland.lit'"));
+ loginWindow_->setIsLoggingIn(false);
+ } else if (!options.singleSignOn && (!jid_.isValid() || jid_.getNode().empty())) {
+ loginWindow_->setMessage(QT_TRANSLATE_NOOP("", "User address invalid. User address should be of the form 'alice@wonderland.lit'"));
+ loginWindow_->setIsLoggingIn(false);
+ } else {
+#ifdef SWIFTEN_PLATFORM_WIN32
+ if (options.singleSignOn) {
+ std::string userName;
+ std::string clientName;
+ std::string serverName;
+ std::shared_ptr<boost::system::error_code> errorCode = getUserNameEx(userName, clientName, serverName);
+
+ if (!errorCode) {
+ /* Create JID using the Windows logon name and user provided domain name */
+ jid_ = JID(clientName, username);
+ }
+ else {
+ loginWindow_->setMessage(str(format(QT_TRANSLATE_NOOP("", "Error obtaining Windows user name (%1%)")) % errorCode->message()));
+ loginWindow_->setIsLoggingIn(false);
+ return;
+ }
+ }
+#endif
+
+ loginWindow_->setMessage("");
+ loginWindow_->setIsLoggingIn(true);
+ profileSettings_ = new ProfileSettingsProvider(username, settings_);
+ if (!settings_->getSetting(SettingConstants::FORGET_PASSWORDS)) {
+ profileSettings_->storeString("jid", username);
+ profileSettings_->storeString("certificate", certificatePath);
+ profileSettings_->storeString("pass", (remember || loginAutomatically) ? password : "");
+ std::string optionString = serializeClientOptions(options);
+ profileSettings_->storeString("options", optionString);
+ profileSettings_->storeInt("enabled", 1);
+ loginWindow_->addAvailableAccount(profileSettings_->getStringSetting("jid"), profileSettings_->getStringSetting("pass"), profileSettings_->getStringSetting("certificate"), options);
+ }
+
+ password_ = password;
+ certificate_ = certificate;
+ clientOptions_ = options;
+ performLoginFromCachedCredentials();
+ }
+}
+
+void AccountController::handlePurgeSavedLoginRequest(const std::string& username) {
+ settings_->removeProfile(username);
+ loginWindow_->removeAvailableAccount(username);
+}
+
+void AccountController::performLoginFromCachedCredentials() {
+ if (settings_->getSetting(SettingConstants::FORGET_PASSWORDS) && password_.empty()) {
+ /* Then we can't try to login again. */
+ return;
+ }
+ /* If we logged in with a bare JID, and we have a full bound JID, re-login with the
+ * bound JID to try and keep dynamically assigned resources */
+ JID clientJID = jid_;
+ if (boundJID_.isValid() && jid_.isBare() && boundJID_.toBare() == jid_) {
+ clientJID = boundJID_;
+ }
+
+ if (!statusTracker_) {
+ statusTracker_ = new StatusTracker();
+ }
+ if (!clientInitialized_) {
+ storages_ = storagesFactory_->createStorages(jid_.toBare());
+ certificateStorage_ = certificateStorageFactory_->createCertificateStorage(jid_.toBare());
+ certificateTrustChecker_ = new CertificateStorageTrustChecker(certificateStorage_);
+
+ client_ = std::make_shared<Swift::Client>(clientJID, createSafeByteArray(password_.c_str()), networkFactories_, storages_);
+ clientInitialized_ = true;
+ client_->setCertificateTrustChecker(certificateTrustChecker_);
+ client_->onDataRead.connect(boost::bind(&XMLConsoleController::handleDataRead, xmlConsoleController_, _1));
+ client_->onDataWritten.connect(boost::bind(&XMLConsoleController::handleDataWritten, xmlConsoleController_, _1));
+ client_->onDisconnected.connect(boost::bind(&AccountController::handleDisconnected, this, _1));
+ client_->onConnected.connect(boost::bind(&AccountController::handleConnected, this));
+
+ client_->setSoftwareVersion(CLIENT_NAME, buildVersion);
+
+ client_->getVCardManager()->onVCardChanged.connect(boost::bind(&AccountController::handleVCardReceived, this, _1, _2));
+ presenceNotifier_ = new PresenceNotifier(client_->getStanzaChannel(), notifier_, client_->getMUCRegistry(), client_->getAvatarManager(), client_->getNickResolver(), client_->getPresenceOracle(), networkFactories_->getTimerFactory());
+ presenceNotifier_->onNotificationActivated.connect(boost::bind(&AccountController::handleNotificationClicked, this, _1));
+ eventNotifier_ = new EventNotifier(eventController_, notifier_, client_->getAvatarManager(), client_->getNickResolver());
+ eventNotifier_->onNotificationActivated.connect(boost::bind(&AccountController::handleNotificationClicked, this, _1));
+ if (certificate_) {
+ client_->setCertificate(certificate_);
+ }
+ std::shared_ptr<Presence> presence(new Presence());
+ presence->setShow(static_cast<StatusShow::Type>(profileSettings_->getIntSetting("lastShow", StatusShow::Online)));
+ presence->setStatus(profileSettings_->getStringSetting("lastStatus"));
+ statusTracker_->setRequestedPresence(presence);
+ fdpFormSubmitController_ = std::make_unique<FdpFormSubmitController>(jid_, client_->getIQRouter(), uiEventStream_, uiFactory_);
+ } else {
+ /* In case we're in the middle of another login, make sure they don't overlap */
+ client_->disconnect();
+ }
+ systemTrayController_->setConnecting();
+ if (rosterController_) {
+ rosterController_->getWindow()->setConnecting();
+ }
+ ClientOptions clientOptions = clientOptions_;
+ bool eagle = settings_->getSetting(SettingConstants::FORGET_PASSWORDS);
+ clientOptions.forgetPassword = eagle;
+ clientOptions.useTLS = eagle ? ClientOptions::RequireTLS : clientOptions_.useTLS;
+ client_->connect(clientOptions);
+}
+
+void AccountController::handleDisconnected(const boost::optional<ClientError>& error) {
+ if (rosterController_) {
+ rosterController_->getWindow()->setStreamEncryptionStatus(false);
+ }
+ if (adHocManager_) {
+ adHocManager_->setOnline(false);
+ }
+ if (settings_->getSetting(SettingConstants::FORGET_PASSWORDS)) {
+ purgeCachedCredentials();
+ }
+ if (quitRequested_) {
+ resetClient();
+ loginWindow_->quit();
+ }
+ else if (error) {
+ std::string message;
+ std::string certificateErrorMessage;
+ bool forceSignout = false;
+ switch(error->getType()) {
+ case ClientError::UnknownError: message = QT_TRANSLATE_NOOP("", "Unknown Error"); break;
+ case ClientError::DomainNameResolveError: message = QT_TRANSLATE_NOOP("", "Unable to find server"); break;
+ case ClientError::ConnectionError: message = QT_TRANSLATE_NOOP("", "Error connecting to server"); break;
+ case ClientError::ConnectionReadError: message = QT_TRANSLATE_NOOP("", "Error while receiving server data"); break;
+ case ClientError::ConnectionWriteError: message = QT_TRANSLATE_NOOP("", "Error while sending data to the server"); break;
+ case ClientError::XMLError: message = QT_TRANSLATE_NOOP("", "Error parsing server data"); break;
+ case ClientError::AuthenticationFailedError: message = QT_TRANSLATE_NOOP("", "Login/password invalid"); break;
+ case ClientError::CompressionFailedError: message = QT_TRANSLATE_NOOP("", "Error while compressing stream"); break;
+ case ClientError::ServerVerificationFailedError: message = QT_TRANSLATE_NOOP("", "Server verification failed"); break;
+ case ClientError::NoSupportedAuthMechanismsError: message = QT_TRANSLATE_NOOP("", "Authentication mechanisms not supported"); break;
+ case ClientError::UnexpectedElementError: message = QT_TRANSLATE_NOOP("", "Unexpected response"); break;
+ case ClientError::ResourceBindError: message = QT_TRANSLATE_NOOP("", "Error binding resource"); break;
+ case ClientError::SessionStartError: message = QT_TRANSLATE_NOOP("", "Error starting session"); break;
+ case ClientError::StreamError: message = QT_TRANSLATE_NOOP("", "Stream error"); break;
+ case ClientError::TLSError: message = QT_TRANSLATE_NOOP("", "Encryption error"); break;
+ case ClientError::ClientCertificateLoadError: message = QT_TRANSLATE_NOOP("", "Error loading certificate (Invalid file or password?)"); break;
+ case ClientError::ClientCertificateError: message = QT_TRANSLATE_NOOP("", "Certificate not authorized"); break;
+ case ClientError::CertificateCardRemoved: message = QT_TRANSLATE_NOOP("", "Certificate card removed"); forceSignout = true; break;
+
+ case ClientError::UnknownCertificateError: certificateErrorMessage = QT_TRANSLATE_NOOP("", "Unknown certificate"); break;
+ case ClientError::CertificateExpiredError: certificateErrorMessage = QT_TRANSLATE_NOOP("", "Certificate has expired"); break;
+ case ClientError::CertificateNotYetValidError: certificateErrorMessage = QT_TRANSLATE_NOOP("", "Certificate is not yet valid"); break;
+ case ClientError::CertificateSelfSignedError: certificateErrorMessage = QT_TRANSLATE_NOOP("", "Certificate is self-signed"); break;
+ case ClientError::CertificateRejectedError: certificateErrorMessage = QT_TRANSLATE_NOOP("", "Certificate has been rejected"); break;
+ case ClientError::CertificateUntrustedError: certificateErrorMessage = QT_TRANSLATE_NOOP("", "Certificate is not trusted"); break;
+ case ClientError::InvalidCertificatePurposeError: certificateErrorMessage = QT_TRANSLATE_NOOP("", "Certificate cannot be used for encrypting your connection"); break;
+ case ClientError::CertificatePathLengthExceededError: certificateErrorMessage = QT_TRANSLATE_NOOP("", "Certificate path length constraint exceeded"); break;
+ case ClientError::InvalidCertificateSignatureError: certificateErrorMessage = QT_TRANSLATE_NOOP("", "Invalid certificate signature"); break;
+ case ClientError::InvalidCAError: certificateErrorMessage = QT_TRANSLATE_NOOP("", "Invalid Certificate Authority"); break;
+ case ClientError::InvalidServerIdentityError: certificateErrorMessage = QT_TRANSLATE_NOOP("", "Certificate does not match the host identity"); break;
+ case ClientError::RevokedError: certificateErrorMessage = QT_TRANSLATE_NOOP("", "Certificate has been revoked"); break;
+ case ClientError::RevocationCheckFailedError: certificateErrorMessage = QT_TRANSLATE_NOOP("", "Unable to determine certificate revocation state"); break;
+ }
+ bool forceReconnectAfterCertificateTrust = false;
+ if (!certificateErrorMessage.empty()) {
+ std::vector<Certificate::ref> certificates = certificateTrustChecker_->getLastCertificateChain();
+ if (!certificates.empty() && loginWindow_->askUserToTrustCertificatePermanently(certificateErrorMessage, certificates)) {
+ certificateStorage_->addCertificate(certificates[0]);
+ forceReconnectAfterCertificateTrust = true;
+ }
+ else {
+ message = QT_TRANSLATE_NOOP("", "Certificate error");
+ }
+ }
+
+ if (!message.empty() && error->getErrorCode()) {
+ message = str(format(QT_TRANSLATE_NOOP("", "%1% (%2%)")) % message % error->getErrorCode()->message());
+ }
+
+ if (forceReconnectAfterCertificateTrust && settings_->getSetting(SettingConstants::FORGET_PASSWORDS)) {
+ forceReconnectAfterCertificateTrust = false;
+ forceSignout = true;
+ message = QT_TRANSLATE_NOOP("", "Re-enter credentials and retry");
+ }
+
+ if (forceReconnectAfterCertificateTrust) {
+ performLoginFromCachedCredentials();
+ }
+ else if (forceSignout || !rosterController_) { //hasn't been logged in yet or permanent error
+ signOut();
+ loginWindow_->setMessage(message);
+ loginWindow_->setIsLoggingIn(false);
+ } else {
+ logout();
+ if (settings_->getSetting(SettingConstants::FORGET_PASSWORDS)) {
+ message = str(format(QT_TRANSLATE_NOOP("", "Disconnected from %1%: %2%. To reconnect, Sign Out and provide your password again.")) % jid_.getDomain() % message);
+ } else {
+ if (!offlineRequested_) {
+ setReconnectTimer();
+ }
+ if (lastDisconnectError_) {
+ message = str(format(QT_TRANSLATE_NOOP("", "Reconnect to %1% failed: %2%. Will retry in %3% seconds.")) % jid_.getDomain() % message % std::to_string(timeBeforeNextReconnect_));
+ lastDisconnectError_->conclude();
+ } else {
+ message = str(format(QT_TRANSLATE_NOOP("", "Disconnected from %1%: %2%.")) % jid_.getDomain() % message);
+ }
+ lastDisconnectError_ = std::make_shared<ErrorEvent>(JID(jid_.getDomain()), message);
+ eventController_->handleIncomingEvent(lastDisconnectError_);
+ }
+ }
+ }
+ else if (!rosterController_) { //hasn't been logged in yet
+ loginWindow_->setIsLoggingIn(false);
+ }
+}
+
+void AccountController::setReconnectTimer() {
+ if (timeBeforeNextReconnect_ < 0) {
+ timeBeforeNextReconnect_ = 1;
+ } else {
+ timeBeforeNextReconnect_ = timeBeforeNextReconnect_ >= 150 ? 300 : timeBeforeNextReconnect_ * 2; // Randomly selected by roll of a die, as required by 3920bis
+ }
+ if (reconnectTimer_) {
+ reconnectTimer_->stop();
+ }
+ reconnectTimer_ = networkFactories_->getTimerFactory()->createTimer(timeBeforeNextReconnect_ * 1000);
+ reconnectTimer_->onTick.connect(boost::bind(&AccountController::reconnectAfterError, this));
+ reconnectTimer_->start();
+}
+
+void AccountController::handleCancelLoginRequest() {
+ signOut();
+}
+
+void AccountController::signOut() {
+ if (settings_->getSetting(SettingConstants::FORGET_PASSWORDS)) {
+ purgeCachedCredentials();
+ }
+ profileSettings_->storeInt("enabled", 0);
+ eventController_->clear();
+ logout();
+ loginWindow_->loggedOut();
+ resetClient();
+}
+
+void AccountController::logout() {
+ if (settings_->getSetting(SettingConstants::FORGET_PASSWORDS)) {
+ purgeCachedCredentials();
+ }
+ systemTrayController_->setMyStatusType(StatusShow::None);
+ if (clientInitialized_ /*&& client_->isAvailable()*/) {
+ client_->disconnect();
+ }
+ if (rosterController_ && myStatusLooksOnline_) {
+ rosterController_->getWindow()->setMyStatusType(StatusShow::None);
+ rosterController_->getWindow()->setMyStatusText("");
+ myStatusLooksOnline_ = false;
+ }
+ setManagersOffline();
+}
+
+void AccountController::setManagersOffline() {
+ if (chatsManager_) {
+ chatsManager_->setOnline(false);
+ }
+ if (rosterController_) {
+ rosterController_->setEnabled(false);
+ }
+ if (profileController_) {
+ profileController_->setAvailable(false);
+ }
+ if (contactEditController_) {
+ contactEditController_->setAvailable(false);
+ }
+}
+
+void AccountController::handleServerDiscoInfoResponse(std::shared_ptr<DiscoInfo> info, ErrorPayload::ref error) {
+ if (!error) {
+ chatsManager_->setServerDiscoInfo(info);
+ adHocManager_->setServerDiscoInfo(info);
+ if (info->hasFeature(DiscoInfo::BlockingCommandFeature)) {
+ rosterController_->getWindow()->setBlockingCommandAvailable(true);
+ rosterController_->initBlockingCommand();
+ }
+ if (info->hasFeature(DiscoInfo::MessageCarbonsFeature)) {
+ enableMessageCarbons();
+ }
+ }
+}
+
+void AccountController::enableMessageCarbons() {
+ auto enableCarbonsRequest = EnableCarbonsRequest::create(client_->getIQRouter());
+ enableCarbonsRequestHandlerConnection_ = enableCarbonsRequest->onResponse.connect([&](Payload::ref /*payload*/, ErrorPayload::ref error) {
+ if (error) {
+ SWIFT_LOG(warning) << "Failed to enable carbons.";
+ }
+ else {
+ SWIFT_LOG(debug) << "Successfully enabled carbons.";
+ }
+ enableCarbonsRequestHandlerConnection_.disconnect();
+ });
+ enableCarbonsRequest->send();
+}
+
+void AccountController::handleVCardReceived(const JID& jid, VCard::ref vCard) {
+ if (!jid.equals(jid_, JID::WithoutResource) || !vCard) {
+ return;
+ }
+ std::string hash;
+ if (!vCard->getPhoto().empty()) {
+ hash = Hexify::hexify(networkFactories_->getCryptoProvider()->getSHA1Hash(vCard->getPhoto()));
+ }
+ if (hash != vCardPhotoHash_) {
+ vCardPhotoHash_ = hash;
+ if (client_ && client_->isAvailable()) {
+ sendPresence(statusTracker_->getNextPresence());
+ }
+ }
+}
+
+void AccountController::handleNotificationClicked(const JID& jid) {
+ assert(chatsManager_);
+ if (clientInitialized_) {
+ if (client_->getMUCRegistry()->isMUC(jid)) {
+ uiEventStream_->send(std::make_shared<JoinMUCUIEvent>(jid));
+ }
+ else {
+ uiEventStream_->send(std::make_shared<RequestChatUIEvent>(jid));
+ }
+ }
+}
+
+void AccountController::handleQuitRequest() {
+ if (client_ && client_->isActive()) {
+ quitRequested_ = true;
+ client_->disconnect();
+ }
+ else {
+ resetClient();
+ loginWindow_->quit();
+ }
+}
+
+//FIXME: Switch all this to boost::serialise
+
+#define SERIALIZE_BOOL(option) result += options.option ? "1" : "0"; result += ",";
+#define SERIALIZE_INT(option) result += boost::lexical_cast<std::string>(options.option); result += ",";
+#define SERIALIZE_STRING(option) result += Base64::encode(createByteArray(options.option)); result += ",";
+#define SERIALIZE_SAFE_STRING(option) result += safeByteArrayToString(Base64::encode(options.option)); result += ",";
+#define SERIALIZE_URL(option) SERIALIZE_STRING(option.toString())
+
+std::string AccountController::serializeClientOptions(const ClientOptions& options) {
+ std::string result;
+ SERIALIZE_BOOL(useStreamCompression)
+ switch (options.useTLS) {
+ case ClientOptions::NeverUseTLS: result += "1";break;
+ case ClientOptions::UseTLSWhenAvailable: result += "2";break;
+ case ClientOptions::RequireTLS: result += "3";break;
+ }
+ result += ",";
+ SERIALIZE_BOOL(allowPLAINWithoutTLS)
+ SERIALIZE_BOOL(useStreamResumption)
+ SERIALIZE_BOOL(useAcks)
+ SERIALIZE_STRING(manualHostname)
+ SERIALIZE_INT(manualPort)
+ switch (options.proxyType) {
+ case ClientOptions::NoProxy: result += "1";break;
+ case ClientOptions::SystemConfiguredProxy: result += "2";break;
+ case ClientOptions::SOCKS5Proxy: result += "3";break;
+ case ClientOptions::HTTPConnectProxy: result += "4";break;
+ }
+ result += ",";
+ SERIALIZE_STRING(manualProxyHostname)
+ SERIALIZE_INT(manualProxyPort)
+ SERIALIZE_URL(boshURL)
+ SERIALIZE_URL(boshHTTPConnectProxyURL)
+ SERIALIZE_SAFE_STRING(boshHTTPConnectProxyAuthID)
+ SERIALIZE_SAFE_STRING(boshHTTPConnectProxyAuthPassword)
+ SERIALIZE_BOOL(tlsOptions.schannelTLS1_0Workaround)
+ SERIALIZE_BOOL(singleSignOn)
+ return result;
+}
+
+}
diff --git a/Swift/Controllers/AccountController.h b/Swift/Controllers/AccountController.h
new file mode 100644
index 0000000..4a31645
--- /dev/null
+++ b/Swift/Controllers/AccountController.h
@@ -0,0 +1,203 @@
+/*
+ * Copyright (c) 2010-2018 Isode Limited.
+ * All rights reserved.
+ * See the COPYING file for more information.
+ */
+
+#pragma once
+
+#include <map>
+#include <memory>
+#include <string>
+#include <vector>
+
+#include <boost/signals2.hpp>
+
+#include <Swiften/Client/ClientError.h>
+#include <Swiften/Client/ClientXMLTracer.h>
+#include <Swiften/Elements/CapsInfo.h>
+#include <Swiften/Elements/DiscoInfo.h>
+#include <Swiften/Elements/ErrorPayload.h>
+#include <Swiften/Elements/Presence.h>
+#include <Swiften/Elements/VCard.h>
+#include <Swiften/JID/JID.h>
+#include <Swiften/Network/Timer.h>
+
+#include <Swift/Controllers/ProfileSettingsProvider.h>
+#include <Swift/Controllers/Settings/SettingsProvider.h>
+#include <Swift/Controllers/UIEvents/UIEvent.h>
+#include <Swift/Controllers/XMPPEvents/ErrorEvent.h>
+
+namespace Swift {
+ class IdleDetector;
+ class UIFactory;
+ class EventLoop;
+ class Client;
+ class Chattables;
+ class ChatController;
+ class ChatsManager;
+ class CertificateStorageFactory;
+ class CertificateStorage;
+ class CertificateStorageTrustChecker;
+ class EventController;
+ class MainWindow;
+ class RosterController;
+ class LoginWindow;
+ class EventLoop;
+ class MUCController;
+ class Notifier;
+ class ProfileController;
+ class ShowProfileController;
+ class ContactEditController;
+ class TogglableNotifier;
+ class PresenceNotifier;
+ class EventNotifier;
+ class SystemTray;
+ class SystemTrayController;
+ class SoundEventController;
+ class SoundPlayer;
+ class XMLConsoleController;
+ class HistoryViewController;
+ class HistoryController;
+ class FileTransferListController;
+ class UIEventStream;
+ class EventWindowFactory;
+ class EventWindowController;
+ class MUCSearchController;
+ class UserSearchController;
+ class StatusTracker;
+ class Dock;
+ class Storages;
+ class StoragesFactory;
+ class NetworkFactories;
+ class URIHandler;
+ class XMPPURIController;
+ class AdHocManager;
+ class AdHocCommandWindowFactory;
+ class FileTransferOverview;
+ class WhiteboardManager;
+ class HighlightManager;
+ class HighlightEditorController;
+ class BlockListController;
+ class ContactSuggester;
+ class ContactsFromXMPPRoster;
+ class FdpFormSubmitController;
+
+ class AccountController {
+ public:
+ AccountController(
+ EventLoop* eventLoop,
+ NetworkFactories* networkFactories,
+ UIFactory* uiFactories,
+ SettingsProvider *settings,
+ SystemTray* systemTray,
+ SoundPlayer* soundPlayer,
+ StoragesFactory* storagesFactory,
+ CertificateStorageFactory* certificateStorageFactory,
+ Dock* dock,
+ Notifier* notifier,
+ URIHandler* uriHandler,
+ IdleDetector* idleDetector,
+ const std::map<std::string, std::string>& emoticons,
+ bool useDelayForLatency);
+ ~AccountController();
+
+ private:
+ void resetClient();
+ void handleConnected();
+ void handleLoginRequest(const std::string& username, const std::string& password, const std::string& certificatePath, CertificateWithKey::ref certificate, const ClientOptions& options, bool remember, bool loginAutomatically);
+ void handleCancelLoginRequest();
+ void handleQuitRequest();
+ void handleChangeStatusRequest(StatusShow::Type show, const std::string &statusText);
+ void handleDisconnected(const boost::optional<ClientError>& error);
+ void handleServerDiscoInfoResponse(std::shared_ptr<DiscoInfo>, ErrorPayload::ref);
+ void handleEventQueueLengthChange(size_t count);
+ void handleVCardReceived(const JID& j, VCard::ref vCard);
+ void handleSettingChanged(const std::string& settingPath);
+ void handlePurgeSavedLoginRequest(const std::string& username);
+ void sendPresence(std::shared_ptr<Presence> presence);
+ void handleInputIdleChanged(bool);
+ void handleShowCertificateRequest();
+ void logout();
+ void signOut();
+ void setReconnectTimer();
+ void resetPendingReconnects();
+ void resetCurrentError();
+ void enableMessageCarbons();
+
+ void performLoginFromCachedCredentials();
+ void reconnectAfterError();
+ void setManagersOffline();
+ void handleNotificationClicked(const JID& jid);
+ void handleForceQuit();
+ void purgeCachedCredentials();
+ std::string serializeClientOptions(const ClientOptions& options);
+
+ private:
+ EventLoop* eventLoop_;
+ NetworkFactories* networkFactories_;
+ UIFactory* uiFactory_;
+ StoragesFactory* storagesFactory_;
+ Storages* storages_;
+ CertificateStorageFactory* certificateStorageFactory_;
+ CertificateStorage* certificateStorage_;
+ CertificateStorageTrustChecker* certificateTrustChecker_;
+ bool clientInitialized_;
+ std::shared_ptr<Client> client_;
+ SettingsProvider *settings_;
+ ProfileSettingsProvider* profileSettings_ = nullptr;
+ Dock* dock_;
+ URIHandler* uriHandler_;
+ IdleDetector* idleDetector_;
+ TogglableNotifier* notifier_;
+ PresenceNotifier* presenceNotifier_;
+ EventNotifier* eventNotifier_;
+ std::unique_ptr<Chattables> chattables_;
+ RosterController* rosterController_;
+ EventController* eventController_;
+ EventWindowController* eventWindowController_;
+ AdHocManager* adHocManager_;
+ LoginWindow* loginWindow_;
+ UIEventStream* uiEventStream_;
+ XMLConsoleController* xmlConsoleController_;
+ HistoryViewController* historyViewController_;
+ HistoryController* historyController_;
+ FileTransferListController* fileTransferListController_;
+ BlockListController* blockListController_;
+ ChatsManager* chatsManager_;
+ ProfileController* profileController_;
+ ShowProfileController* showProfileController_;
+ ContactEditController* contactEditController_;
+ ContactsFromXMPPRoster* contactsFromRosterProvider_;
+ ContactSuggester* contactSuggesterWithoutRoster_;
+ ContactSuggester* contactSuggesterWithRoster_;
+ JID jid_;
+ JID boundJID_;
+ SystemTrayController* systemTrayController_;
+ SoundEventController* soundEventController_;
+ XMPPURIController* xmppURIController_;
+ std::string vCardPhotoHash_;
+ std::string password_;
+ CertificateWithKey::ref certificate_;
+ ClientOptions clientOptions_;
+ std::shared_ptr<ErrorEvent> lastDisconnectError_;
+ bool useDelayForLatency_;
+ UserSearchController* userSearchControllerChat_;
+ UserSearchController* userSearchControllerAdd_;
+ UserSearchController* userSearchControllerInvite_;
+ int timeBeforeNextReconnect_;
+ Timer::ref reconnectTimer_;
+ StatusTracker* statusTracker_;
+ bool myStatusLooksOnline_ = false;
+ bool quitRequested_;
+ bool offlineRequested_;
+ static const int SecondsToWaitBeforeForceQuitting;
+ FileTransferOverview* ftOverview_;
+ WhiteboardManager* whiteboardManager_;
+ HighlightManager* highlightManager_;
+ HighlightEditorController* highlightEditorController_;
+ std::map<std::string, std::string> emoticons_;
+ boost::signals2::connection enableCarbonsRequestHandlerConnection_;
+ std::unique_ptr<FdpFormSubmitController> fdpFormSubmitController_;
+ };
+}
diff --git a/Swift/Controllers/Chat/ChatController.cpp b/Swift/Controllers/Chat/ChatController.cpp
index fe8e870..debd83f 100644
--- a/Swift/Controllers/Chat/ChatController.cpp
+++ b/Swift/Controllers/Chat/ChatController.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010-2017 Isode Limited.
+ * Copyright (c) 2010-2019 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -52,8 +52,8 @@ namespace Swift {
/**
* The controller does not gain ownership of the stanzaChannel, nor the factory.
*/
-ChatController::ChatController(const JID& self, StanzaChannel* stanzaChannel, IQRouter* iqRouter, ChatWindowFactory* chatWindowFactory, const JID &contact, NickResolver* nickResolver, PresenceOracle* presenceOracle, AvatarManager* avatarManager, bool isInMUC, bool useDelayForLatency, UIEventStream* eventStream, TimerFactory* timerFactory, EventController* eventController, EntityCapsProvider* entityCapsProvider, bool userWantsReceipts, SettingsProvider* settings, HistoryController* historyController, MUCRegistry* mucRegistry, HighlightManager* highlightManager, ClientBlockListManager* clientBlockListManager, std::shared_ptr<ChatMessageParser> chatMessageParser, AutoAcceptMUCInviteDecider* autoAcceptMUCInviteDecider)
- : ChatControllerBase(self, stanzaChannel, iqRouter, chatWindowFactory, contact, nickResolver, presenceOracle, avatarManager, useDelayForLatency, eventStream, eventController, entityCapsProvider, historyController, mucRegistry, highlightManager, chatMessageParser, autoAcceptMUCInviteDecider), userWantsReceipts_(userWantsReceipts), settings_(settings), clientBlockListManager_(clientBlockListManager) {
+ChatController::ChatController(const JID& self, StanzaChannel* stanzaChannel, IQRouter* iqRouter, ChatWindowFactory* chatWindowFactory, const JID &contact, NickResolver* nickResolver, PresenceOracle* presenceOracle, AvatarManager* avatarManager, bool isInMUC, bool useDelayForLatency, UIEventStream* eventStream, TimerFactory* timerFactory, EventController* eventController, EntityCapsProvider* entityCapsProvider, bool userWantsReceipts, HistoryController* historyController, MUCRegistry* mucRegistry, HighlightManager* highlightManager, ClientBlockListManager* clientBlockListManager, std::shared_ptr<ChatMessageParser> chatMessageParser, AutoAcceptMUCInviteDecider* autoAcceptMUCInviteDecider, SettingsProvider* settings, Chattables& chattables)
+ : ChatControllerBase(self, stanzaChannel, iqRouter, chatWindowFactory, contact, nickResolver, presenceOracle, avatarManager, useDelayForLatency, eventStream, eventController, entityCapsProvider, historyController, mucRegistry, highlightManager, chatMessageParser, autoAcceptMUCInviteDecider, settings, chattables), userWantsReceipts_(userWantsReceipts), clientBlockListManager_(clientBlockListManager) {
isInMUC_ = isInMUC;
lastWasPresence_ = false;
chatStateNotifier_ = new ChatStateNotifier(stanzaChannel, contact, entityCapsProvider, timerFactory, 20000);
@@ -86,7 +86,7 @@ ChatController::ChatController(const JID& self, StanzaChannel* stanzaChannel, IQ
chatStateNotifier_->setContactIsOnline(theirPresence && theirPresence->getType() == Presence::Available);
startMessage += ".";
chatWindow_->addSystemMessage(chatMessageParser_->parseMessageBody(startMessage), ChatWindow::DefaultDirection);
- chatWindow_->onContinuationsBroken.connect([this, startMessage]() { chatWindow_->addSystemMessage(chatMessageParser_->parseMessageBody(startMessage), ChatWindow::DefaultDirection); });
+ continuationsBrokenConnection_ = chatWindow_->onContinuationsBroken.connect([this, startMessage]() { chatWindow_->addSystemMessage(chatMessageParser_->parseMessageBody(startMessage), ChatWindow::DefaultDirection); });
chatWindow_->onUserTyping.connect(boost::bind(&ChatStateNotifier::setUserIsTyping, chatStateNotifier_));
chatWindow_->onUserCancelsTyping.connect(boost::bind(&ChatStateNotifier::userCancelledNewMessage, chatStateNotifier_));
chatWindow_->onFileTransferStart.connect(boost::bind(&ChatController::handleFileTransferStart, this, _1, _2));
@@ -190,7 +190,7 @@ void ChatController::preHandleIncomingMessage(std::shared_ptr<MessageEvent> mess
// handle XEP-0184 Message Receipts
// incomming receipts
if (std::shared_ptr<DeliveryReceipt> receipt = message->getPayload<DeliveryReceipt>()) {
- SWIFT_LOG(debug) << "received receipt for id: " << receipt->getReceivedID() << std::endl;
+ SWIFT_LOG(debug) << "received receipt for id: " << receipt->getReceivedID();
if (requestedReceipts_.find(receipt->getReceivedID()) != requestedReceipts_.end()) {
chatWindow_->setMessageReceiptState(requestedReceipts_[receipt->getReceivedID()], ChatWindow::ReceiptReceived);
requestedReceipts_.erase(receipt->getReceivedID());
@@ -320,6 +320,7 @@ void ChatController::handleIncomingOwnMessage(std::shared_ptr<Message> message)
if (!message->getBody().get_value_or("").empty()) {
postSendMessage(message->getBody().get_value_or(""), message);
handleStanzaAcked(message);
+ onActivity(message->getBody().get_value_or(""));
}
}
@@ -358,6 +359,7 @@ void ChatController::setOnline(bool online) {
if (!online) {
for (auto& stanzaIdPair : unackedStanzas_) {
chatWindow_->setAckState(stanzaIdPair.second, ChatWindow::Failed);
+ failedStanzas_[stanzaIdPair.second] = stanzaIdPair.first;
}
unackedStanzas_.clear();
@@ -405,7 +407,7 @@ void ChatController::handleWhiteboardStateChange(const ChatWindow::WhiteboardSes
}
void ChatController::handleFileTransferCancel(std::string id) {
- SWIFT_LOG(debug) << "handleFileTransferCancel(" << id << ")" << std::endl;
+ SWIFT_LOG(debug) << "handleFileTransferCancel(" << id << ")";
if (ftControllers.find(id) != ftControllers.end()) {
ftControllers[id]->cancel();
} else {
@@ -414,7 +416,7 @@ void ChatController::handleFileTransferCancel(std::string id) {
}
void ChatController::handleFileTransferStart(std::string id, std::string description) {
- SWIFT_LOG(debug) << "handleFileTransferStart(" << id << ", " << description << ")" << std::endl;
+ SWIFT_LOG(debug) << "handleFileTransferStart(" << id << ", " << description << ")";
if (ftControllers.find(id) != ftControllers.end()) {
ftControllers[id]->start(description);
} else {
@@ -423,7 +425,7 @@ void ChatController::handleFileTransferStart(std::string id, std::string descrip
}
void ChatController::handleFileTransferAccept(std::string id, std::string filename) {
- SWIFT_LOG(debug) << "handleFileTransferAccept(" << id << ", " << filename << ")" << std::endl;
+ SWIFT_LOG(debug) << "handleFileTransferAccept(" << id << ", " << filename << ")";
if (ftControllers.find(id) != ftControllers.end()) {
ftControllers[id]->accept(filename);
} else {
@@ -432,7 +434,7 @@ void ChatController::handleFileTransferAccept(std::string id, std::string filena
}
void ChatController::handleSendFileRequest(std::string filename) {
- SWIFT_LOG(debug) << "ChatController::handleSendFileRequest(" << filename << ")" << std::endl;
+ SWIFT_LOG(debug) << "ChatController::handleSendFileRequest(" << filename << ")";
eventStream_->send(std::make_shared<SendFileUIEvent>(getToJID(), filename));
}
@@ -585,8 +587,20 @@ JID ChatController::messageCorrectionJID(const JID& fromJID) {
}
ChatWindow* ChatController::detachChatWindow() {
- chatWindow_->onUserTyping.disconnect(boost::bind(&ChatStateNotifier::setUserIsTyping, chatStateNotifier_));
+ continuationsBrokenConnection_.disconnect();
+ chatWindow_->onClosed.disconnect(boost::bind(&ChatController::handleWindowClosed, this));
+ chatWindow_->onInviteToChat.disconnect(boost::bind(&ChatController::handleInviteToChat, this, _1));
+ chatWindow_->onUnblockUserRequest.disconnect(boost::bind(&ChatController::handleUnblockUserRequest, this));
+ chatWindow_->onBlockUserRequest.disconnect(boost::bind(&ChatController::handleBlockUserRequest, this));
+ chatWindow_->onWhiteboardWindowShow.disconnect(boost::bind(&ChatController::handleWhiteboardWindowShow, this));
+ chatWindow_->onWhiteboardSessionCancel.disconnect(boost::bind(&ChatController::handleWhiteboardSessionCancel, this));
+ chatWindow_->onWhiteboardSessionAccept.disconnect(boost::bind(&ChatController::handleWhiteboardSessionAccept, this));
+ chatWindow_->onSendFileRequest.disconnect(boost::bind(&ChatController::handleSendFileRequest, this, _1));
+ chatWindow_->onFileTransferCancel.disconnect(boost::bind(&ChatController::handleFileTransferCancel, this, _1));
+ chatWindow_->onFileTransferAccept.disconnect(boost::bind(&ChatController::handleFileTransferAccept, this, _1, _2));
+ chatWindow_->onFileTransferStart.disconnect(boost::bind(&ChatController::handleFileTransferStart, this, _1, _2));
chatWindow_->onUserCancelsTyping.disconnect(boost::bind(&ChatStateNotifier::userCancelledNewMessage, chatStateNotifier_));
+ chatWindow_->onUserTyping.disconnect(boost::bind(&ChatStateNotifier::setUserIsTyping, chatStateNotifier_));
return ChatControllerBase::detachChatWindow();
}
diff --git a/Swift/Controllers/Chat/ChatController.h b/Swift/Controllers/Chat/ChatController.h
index d290d05..447e263 100644
--- a/Swift/Controllers/Chat/ChatController.h
+++ b/Swift/Controllers/Chat/ChatController.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010-2017 Isode Limited.
+ * Copyright (c) 2010-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -30,7 +30,7 @@ namespace Swift {
class ChatController : public ChatControllerBase {
public:
- ChatController(const JID& self, StanzaChannel* stanzaChannel, IQRouter* iqRouter, ChatWindowFactory* chatWindowFactory, const JID &contact, NickResolver* nickResolver, PresenceOracle* presenceOracle, AvatarManager* avatarManager, bool isInMUC, bool useDelayForLatency, UIEventStream* eventStream, TimerFactory* timerFactory, EventController* eventController, EntityCapsProvider* entityCapsProvider, bool userWantsReceipts, SettingsProvider* settings, HistoryController* historyController, MUCRegistry* mucRegistry, HighlightManager* highlightManager, ClientBlockListManager* clientBlockListManager, std::shared_ptr<ChatMessageParser> chatMessageParser, AutoAcceptMUCInviteDecider* autoAcceptMUCInviteDecider);
+ ChatController(const JID& self, StanzaChannel* stanzaChannel, IQRouter* iqRouter, ChatWindowFactory* chatWindowFactory, const JID &contact, NickResolver* nickResolver, PresenceOracle* presenceOracle, AvatarManager* avatarManager, bool isInMUC, bool useDelayForLatency, UIEventStream* eventStream, TimerFactory* timerFactory, EventController* eventController, EntityCapsProvider* entityCapsProvider, bool userWantsReceipts, HistoryController* historyController, MUCRegistry* mucRegistry, HighlightManager* highlightManager, ClientBlockListManager* clientBlockListManager, std::shared_ptr<ChatMessageParser> chatMessageParser, AutoAcceptMUCInviteDecider* autoAcceptMUCInviteDecider, SettingsProvider* settings, Chattables& chattables);
virtual ~ChatController() override;
virtual void setToJID(const JID& jid) override;
virtual void setAvailableServerFeatures(std::shared_ptr<DiscoInfo> info) override;
@@ -96,15 +96,12 @@ namespace Swift {
std::string myLastMessageUIID_;
bool isInMUC_;
std::string lastStatusChangeString_;
- std::map<std::shared_ptr<Stanza>, std::string> unackedStanzas_;
- std::map<std::string, std::string> requestedReceipts_;
StatusShow::Type lastShownStatus_;
Tristate contactSupportsReceipts_;
bool receivingPresenceFromUs_ = false;
bool userWantsReceipts_;
std::map<std::string, FileTransferController*> ftControllers;
- SettingsProvider* settings_;
std::string lastWbID_;
std::string lastHandledMessageID_;
@@ -112,9 +109,9 @@ namespace Swift {
boost::signals2::scoped_connection blockingOnStateChangedConnection_;
boost::signals2::scoped_connection blockingOnItemAddedConnection_;
boost::signals2::scoped_connection blockingOnItemRemovedConnection_;
+ boost::signals2::scoped_connection continuationsBrokenConnection_;
boost::optional<ChatWindow::AlertID> deliveryReceiptAlert_;
boost::optional<ChatWindow::AlertID> blockedContactAlert_;
};
}
-
diff --git a/Swift/Controllers/Chat/ChatControllerBase.cpp b/Swift/Controllers/Chat/ChatControllerBase.cpp
index 0fc735a..3805084 100644
--- a/Swift/Controllers/Chat/ChatControllerBase.cpp
+++ b/Swift/Controllers/Chat/ChatControllerBase.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010-2017 Isode Limited.
+ * Copyright (c) 2010-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -20,11 +20,14 @@
#include <Swiften/Client/StanzaChannel.h>
#include <Swiften/Disco/EntityCapsProvider.h>
#include <Swiften/Elements/Delay.h>
+#include <Swiften/Elements/DeliveryReceipt.h>
+#include <Swiften/Elements/DeliveryReceiptRequest.h>
#include <Swiften/Elements/MUCInvitationPayload.h>
#include <Swiften/Elements/MUCUserPayload.h>
#include <Swiften/Queries/Requests/GetSecurityLabelsCatalogRequest.h>
#include <Swift/Controllers/Chat/AutoAcceptMUCInviteDecider.h>
+#include <Swift/Controllers/Chat/Chattables.h>
#include <Swift/Controllers/Chat/ChatMessageParser.h>
#include <Swift/Controllers/Highlighting/HighlightManager.h>
#include <Swift/Controllers/Highlighting/Highlighter.h>
@@ -38,11 +41,12 @@
namespace Swift {
-ChatControllerBase::ChatControllerBase(const JID& self, StanzaChannel* stanzaChannel, IQRouter* iqRouter, ChatWindowFactory* chatWindowFactory, const JID &toJID, NickResolver* nickResolver, PresenceOracle* presenceOracle, AvatarManager* avatarManager, bool useDelayForLatency, UIEventStream* eventStream, EventController* eventController, EntityCapsProvider* entityCapsProvider, HistoryController* historyController, MUCRegistry* mucRegistry, HighlightManager* highlightManager, std::shared_ptr<ChatMessageParser> chatMessageParser, AutoAcceptMUCInviteDecider* autoAcceptMUCInviteDecider) : selfJID_(self), stanzaChannel_(stanzaChannel), iqRouter_(iqRouter), chatWindowFactory_(chatWindowFactory), toJID_(toJID), labelsEnabled_(false), presenceOracle_(presenceOracle), avatarManager_(avatarManager), useDelayForLatency_(useDelayForLatency), eventController_(eventController), entityCapsProvider_(entityCapsProvider), historyController_(historyController), mucRegistry_(mucRegistry), chatMessageParser_(chatMessageParser), autoAcceptMUCInviteDecider_(autoAcceptMUCInviteDecider), eventStream_(eventStream) {
+ChatControllerBase::ChatControllerBase(const JID& self, StanzaChannel* stanzaChannel, IQRouter* iqRouter, ChatWindowFactory* chatWindowFactory, const JID &toJID, NickResolver* nickResolver, PresenceOracle* presenceOracle, AvatarManager* avatarManager, bool useDelayForLatency, UIEventStream* eventStream, EventController* eventController, EntityCapsProvider* entityCapsProvider, HistoryController* historyController, MUCRegistry* mucRegistry, HighlightManager* highlightManager, std::shared_ptr<ChatMessageParser> chatMessageParser, AutoAcceptMUCInviteDecider* autoAcceptMUCInviteDecider, SettingsProvider* settings, Chattables& chattables) : selfJID_(self), stanzaChannel_(stanzaChannel), iqRouter_(iqRouter), chatWindowFactory_(chatWindowFactory), toJID_(toJID), labelsEnabled_(false), presenceOracle_(presenceOracle), avatarManager_(avatarManager), useDelayForLatency_(useDelayForLatency), eventController_(eventController), entityCapsProvider_(entityCapsProvider), historyController_(historyController), mucRegistry_(mucRegistry), chatMessageParser_(chatMessageParser), autoAcceptMUCInviteDecider_(autoAcceptMUCInviteDecider), eventStream_(eventStream), roomSecurityMarking_(""), previousMessageSecurityMarking_(""), settings_(settings), chattables_(chattables) {
chatWindow_ = chatWindowFactory_->createChatWindow(toJID, eventStream);
chatWindow_->onAllMessagesRead.connect(boost::bind(&ChatControllerBase::handleAllMessagesRead, this));
chatWindow_->onSendMessageRequest.connect(boost::bind(&ChatControllerBase::handleSendMessageRequest, this, _1, _2));
chatWindow_->onContinuationsBroken.connect(boost::bind(&ChatControllerBase::handleContinuationsBroken, this));
+ scopedConnectionResendMessage_ = chatWindow_->onResendMessageRequest.connect(boost::bind(&ChatControllerBase::handleResendMessageRequest, this, _1));
entityCapsProvider_->onCapsChanged.connect(boost::bind(&ChatControllerBase::handleCapsChanged, this, _1));
highlighter_ = highlightManager->createHighlighter(nickResolver);
ChatControllerBase::setOnline(stanzaChannel->isAvailable() && iqRouter->isAvailable());
@@ -58,6 +62,10 @@ void ChatControllerBase::handleContinuationsBroken() {
}
ChatWindow* ChatControllerBase::detachChatWindow() {
+ chatWindow_->onContinuationsBroken.disconnect(boost::bind(&ChatControllerBase::handleContinuationsBroken, this));
+ chatWindow_->onSendMessageRequest.disconnect(boost::bind(&ChatControllerBase::handleSendMessageRequest, this, _1, _2));
+ chatWindow_->onAllMessagesRead.disconnect(boost::bind(&ChatControllerBase::handleAllMessagesRead, this));
+ scopedConnectionResendMessage_.disconnect();
ChatWindow* chatWindow = chatWindow_;
chatWindow_ = nullptr;
return chatWindow;
@@ -110,8 +118,8 @@ void ChatControllerBase::handleAllMessagesRead() {
}
}
-int ChatControllerBase::getUnreadCount() {
- return boost::numeric_cast<int>(targetedUnreadMessages_.size());
+size_t ChatControllerBase::getUnreadCount() {
+ return targetedUnreadMessages_.size();
}
void ChatControllerBase::handleSendMessageRequest(const std::string &body, bool isCorrectionMessage) {
@@ -185,16 +193,44 @@ ChatWindow::ChatMessage ChatControllerBase::buildChatWindowChatMessage(const std
}
void ChatControllerBase::updateMessageCount() {
- chatWindow_->setUnreadMessageCount(boost::numeric_cast<int>(unreadMessages_.size()));
+ auto baseJID = getBaseJID();
+ auto state = chattables_.getState(baseJID);
+ state.unreadCount = unreadMessages_.size();
+ chatWindow_->setUnreadMessageCount(state.unreadCount);
+ chattables_.setState(baseJID, state);
+#ifndef NOT_YET
onUnreadCountChanged();
+#endif
}
std::string ChatControllerBase::addMessage(const ChatWindow::ChatMessage& chatMessage, const std::string& senderName, bool senderIsSelf, const std::shared_ptr<SecurityLabel> label, const boost::filesystem::path& avatarPath, const boost::posix_time::ptime& time) {
+ auto displayedLabel = label;
+
+ if (settings_->getSetting(SettingConstants::MUC_MARKING_ELISION)) {
+ if (roomSecurityMarking_ != "") {
+
+ if (label && label->getDisplayMarking() == roomSecurityMarking_) {
+ if (label->getDisplayMarking() == previousMessageSecurityMarking_) {
+ displayedLabel = std::make_shared<SecurityLabel>();
+ }
+ previousMessageSecurityMarking_ = label->getDisplayMarking();
+ }
+ else if (!label || label->getDisplayMarking().empty()) {
+ displayedLabel = std::make_shared<SecurityLabel>();
+ displayedLabel->setDisplayMarking("Unmarked");
+ previousMessageSecurityMarking_ = "Unmarked";
+ }
+ else {
+ previousMessageSecurityMarking_ = displayedLabel->getDisplayMarking();
+ }
+ }
+ }
+
if (chatMessage.isMeCommand()) {
- return chatWindow_->addAction(chatMessage, senderName, senderIsSelf, label, pathToString(avatarPath), time);
+ return chatWindow_->addAction(chatMessage, senderName, senderIsSelf, displayedLabel, pathToString(avatarPath), time);
}
else {
- return chatWindow_->addMessage(chatMessage, senderName, senderIsSelf, label, pathToString(avatarPath), time);
+ return chatWindow_->addMessage(chatMessage, senderName, senderIsSelf, displayedLabel, pathToString(avatarPath), time);
}
}
@@ -284,7 +320,9 @@ void ChatControllerBase::handleIncomingMessage(std::shared_ptr<MessageEvent> mes
addMessageHandleIncomingMessage(from, chatMessage, message->getID(), senderIsSelf, label, timeStamp);
}
+#ifdef SWIFT_EXPERIMENTAL_HISTORY
logMessage(body, from, selfJID_, timeStamp, true);
+#endif
}
chatWindow_->show();
updateMessageCount();
@@ -339,7 +377,7 @@ void ChatControllerBase::handleMUCInvitation(Message::ref message) {
MUCInvitationPayload::ref invite = message->getPayload<MUCInvitationPayload>();
if (autoAcceptMUCInviteDecider_->isAutoAcceptedInvite(message->getFrom(), invite)) {
- eventStream_->send(std::make_shared<JoinMUCUIEvent>(invite->getJID(), boost::optional<std::string>(), boost::optional<std::string>(), false, false, true));
+ eventStream_->send(std::make_shared<JoinMUCUIEvent>(invite->getJID(), boost::optional<std::string>(), boost::optional<std::string>(), false, true));
} else {
MUCInviteEvent::ref inviteEvent = std::make_shared<MUCInviteEvent>(toJID_, invite->getJID(), invite->getReason(), invite->getPassword(), true, invite->getIsImpromptu());
handleGeneralMUCInvitation(inviteEvent);
@@ -362,4 +400,22 @@ void ChatControllerBase::handleMediatedMUCInvitation(Message::ref message) {
handleGeneralMUCInvitation(inviteEvent);
}
+void ChatControllerBase::handleResendMessageRequest(const std::string& id) {
+ if (failedStanzas_.find(id) != failedStanzas_.end()) {
+ if (auto resendMsg = std::dynamic_pointer_cast<Message>(failedStanzas_[id])) {
+ stanzaChannel_->sendMessage(resendMsg);
+ if (stanzaChannel_->getStreamManagementEnabled()) {
+ chatWindow_->setAckState(id, ChatWindow::Pending);
+ unackedStanzas_[failedStanzas_[id]] = id;
+ }
+ if (resendMsg->getPayload<DeliveryReceiptRequest>()) {
+ requestedReceipts_[resendMsg->getID()] = id;
+ chatWindow_->setMessageReceiptState(id, ChatWindow::ReceiptRequested);
+ }
+ lastWasPresence_ = false;
+ failedStanzas_.erase(id);
+ }
+ }
+}
+
}
diff --git a/Swift/Controllers/Chat/ChatControllerBase.h b/Swift/Controllers/Chat/ChatControllerBase.h
index 88cb95c..92c6175 100644
--- a/Swift/Controllers/Chat/ChatControllerBase.h
+++ b/Swift/Controllers/Chat/ChatControllerBase.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010-2017 Isode Limited.
+ * Copyright (c) 2010-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -28,6 +28,7 @@
#include <Swift/Controllers/Highlighting/HighlightManager.h>
#include <Swift/Controllers/HistoryController.h>
+#include <Swift/Controllers/Settings/SettingsProvider.h>
#include <Swift/Controllers/UIInterfaces/ChatWindow.h>
#include <Swift/Controllers/XMPPEvents/MUCInviteEvent.h>
#include <Swift/Controllers/XMPPEvents/MessageEvent.h>
@@ -36,11 +37,12 @@ namespace Swift {
class AutoAcceptMUCInviteDecider;
class AvatarManager;
class ChatMessageParser;
+ class Chattables;
class ChatWindowFactory;
class EntityCapsProvider;
class EventController;
- class HighlightManager;
class Highlighter;
+ class HighlightManager;
class IQRouter;
class NickResolver;
class StanzaChannel;
@@ -71,7 +73,7 @@ namespace Swift {
boost::signals2::signal<void (const std::string& /*activity*/)> onActivity;
boost::signals2::signal<void ()> onUnreadCountChanged;
boost::signals2::signal<void ()> onWindowClosed;
- int getUnreadCount();
+ size_t getUnreadCount();
const JID& getToJID() {return toJID_;}
void handleCapsChanged(const JID& jid);
void setCanStartImpromptuChats(bool supportsImpromptu);
@@ -79,7 +81,7 @@ namespace Swift {
boost::signals2::signal<void(ChatWindow* /*window to reuse*/, const std::vector<JID>& /*invite people*/, const std::string& /*reason*/)> onConvertToMUC;
protected:
- ChatControllerBase(const JID& self, StanzaChannel* stanzaChannel, IQRouter* iqRouter, ChatWindowFactory* chatWindowFactory, const JID &toJID, NickResolver* nickResolver, PresenceOracle* presenceOracle, AvatarManager* avatarManager, bool useDelayForLatency, UIEventStream* eventStream, EventController* eventController, EntityCapsProvider* entityCapsProvider, HistoryController* historyController, MUCRegistry* mucRegistry, HighlightManager* highlightManager, std::shared_ptr<ChatMessageParser> chatMessageParser, AutoAcceptMUCInviteDecider* autoAcceptMUCInviteDecider);
+ ChatControllerBase(const JID& self, StanzaChannel* stanzaChannel, IQRouter* iqRouter, ChatWindowFactory* chatWindowFactory, const JID &toJID, NickResolver* nickResolver, PresenceOracle* presenceOracle, AvatarManager* avatarManager, bool useDelayForLatency, UIEventStream* eventStream, EventController* eventController, EntityCapsProvider* entityCapsProvider, HistoryController* historyController, MUCRegistry* mucRegistry, HighlightManager* highlightManager, std::shared_ptr<ChatMessageParser> chatMessageParser, AutoAcceptMUCInviteDecider* autoAcceptMUCInviteDecider, SettingsProvider* settings, Chattables& chattables);
/**
* Pass the Message appended, and the stanza used to send it.
@@ -113,6 +115,7 @@ namespace Swift {
* What JID should be used for last message correction (XEP-0308) tracking.
*/
virtual JID messageCorrectionJID(const JID& fromJID) = 0;
+ virtual void handleResendMessageRequest(const std::string& id);
private:
IDGenerator idGenerator_;
@@ -150,5 +153,13 @@ namespace Swift {
AutoAcceptMUCInviteDecider* autoAcceptMUCInviteDecider_;
UIEventStream* eventStream_;
bool lastWasPresence_ = false;
+ std::string roomSecurityMarking_;
+ std::string previousMessageSecurityMarking_;
+ SettingsProvider* settings_;
+ boost::signals2::scoped_connection scopedConnectionResendMessage_;
+ std::map<std::string, std::string> requestedReceipts_;
+ std::map<std::shared_ptr<Stanza>, std::string> unackedStanzas_;
+ std::map<std::string, std::shared_ptr<Stanza>> failedStanzas_;
+ Chattables& chattables_;
};
}
diff --git a/Swift/Controllers/Chat/ChatListWindowChatBoostSerialize.h b/Swift/Controllers/Chat/ChatListWindowChatBoostSerialize.h
new file mode 100644
index 0000000..1e053b2
--- /dev/null
+++ b/Swift/Controllers/Chat/ChatListWindowChatBoostSerialize.h
@@ -0,0 +1,82 @@
+/*
+ * Copyright (c) 2017 Isode Limited.
+ * All rights reserved.
+ * See the COPYING file for more information.
+ */
+
+#pragma once
+
+#include <memory>
+
+#include <boost/version.hpp>
+#include <boost/algorithm/string.hpp>
+#include <boost/archive/text_iarchive.hpp>
+#include <boost/archive/text_oarchive.hpp>
+#include <boost/bind.hpp>
+#include <boost/serialization/map.hpp>
+#include <boost/serialization/optional.hpp>
+#include <boost/serialization/split_free.hpp>
+#include <boost/serialization/string.hpp>
+#include <boost/serialization/vector.hpp>
+
+#include <Swift/Controllers/UIInterfaces/ChatListWindow.h>
+
+BOOST_CLASS_VERSION(Swift::ChatListWindow::Chat, 3)
+namespace Swift {
+ const boost::archive::library_version_type BoostArchiveSkipVersion(15);
+}
+
+namespace boost {
+ namespace serialization {
+ template<class Archive> void save(Archive& ar, const Swift::JID& jid, const unsigned int /*version*/) {
+ std::string jidStr = jid.toString();
+ ar << jidStr;
+ }
+
+ template<class Archive> void load(Archive& ar, Swift::JID& jid, const unsigned int /*version*/) {
+ std::string stringJID;
+ ar >> stringJID;
+ jid = Swift::JID(stringJID);
+ }
+
+ template<class Archive> inline void serialize(Archive& ar, Swift::JID& t, const unsigned int file_version) {
+ split_free(ar, t, file_version);
+ }
+
+ template<class Archive> void serialize(Archive& ar, Swift::ChatListWindow::Chat& chat, const unsigned int version) {
+ auto archiveLibraryVersion = boost::archive::BOOST_ARCHIVE_VERSION();
+ int archiveVersion = 0;
+ archive::text_oarchive* outputStream = dynamic_cast<archive::text_oarchive*>(&ar);
+ if (outputStream) {
+ archiveVersion = outputStream->get_library_version();
+ }
+ archive::text_iarchive* inputStream = dynamic_cast<archive::text_iarchive*>(&ar);
+ if (inputStream) {
+ archiveVersion = inputStream->get_library_version();
+ //Due to https://svn.boost.org/trac10/ticket/13050 the password field may fail to load and crash the client. Therefore we skip loading the values from previous versions.
+ if (archiveLibraryVersion == Swift::BoostArchiveSkipVersion && archiveLibraryVersion > archiveVersion) {
+ return;
+ }
+ }
+ ar & chat.jid;
+ ar & chat.chatName;
+ ar & chat.activity;
+ ar & chat.isMUC;
+ ar & chat.nick;
+ ar & chat.impromptuJIDs;
+ if (version > 0) {
+ if (outputStream && archiveLibraryVersion == Swift::BoostArchiveSkipVersion) {
+ //The bug does not affect the case boost::optional doesn't have a value. Therefore we store always that value, to avoid problem on future launches of the client.
+ boost::optional<std::string> empty;
+ ar & empty;
+ }
+ else {
+ ar & chat.password;
+ }
+ }
+ if (version > 1) {
+ ar & chat.inviteesNames;
+ }
+ }
+ }
+}
diff --git a/Swift/Controllers/Chat/ChatsManager.cpp b/Swift/Controllers/Chat/ChatsManager.cpp
index b7087fd..193af7f 100644
--- a/Swift/Controllers/Chat/ChatsManager.cpp
+++ b/Swift/Controllers/Chat/ChatsManager.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010-2017 Isode Limited.
+ * Copyright (c) 2010-2019 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -9,14 +9,7 @@
#include <memory>
#include <boost/algorithm/string.hpp>
-#include <boost/archive/text_iarchive.hpp>
-#include <boost/archive/text_oarchive.hpp>
#include <boost/bind.hpp>
-#include <boost/serialization/map.hpp>
-#include <boost/serialization/optional.hpp>
-#include <boost/serialization/split_free.hpp>
-#include <boost/serialization/string.hpp>
-#include <boost/serialization/vector.hpp>
#include <Swiften/Avatars/AvatarManager.h>
#include <Swiften/Base/Log.h>
@@ -41,8 +34,10 @@
#include <Swiften/VCards/VCardManager.h>
#include <Swift/Controllers/Chat/AutoAcceptMUCInviteDecider.h>
+#include <Swift/Controllers/Chat/Chattables.h>
#include <Swift/Controllers/Chat/ChatController.h>
#include <Swift/Controllers/Chat/ChatControllerBase.h>
+#include <Swift/Controllers/Chat/ChatListWindowChatBoostSerialize.h>
#include <Swift/Controllers/Chat/ChatMessageParser.h>
#include <Swift/Controllers/Chat/MUCController.h>
#include <Swift/Controllers/Chat/MUCSearchController.h>
@@ -67,48 +62,14 @@
#include <Swift/Controllers/WhiteboardManager.h>
#include <Swift/Controllers/XMPPEvents/EventController.h>
-BOOST_CLASS_VERSION(Swift::ChatListWindow::Chat, 2)
-
-namespace boost {
-namespace serialization {
- template<class Archive> void save(Archive& ar, const Swift::JID& jid, const unsigned int /*version*/) {
- std::string jidStr = jid.toString();
- ar << jidStr;
- }
-
- template<class Archive> void load(Archive& ar, Swift::JID& jid, const unsigned int /*version*/) {
- std::string stringJID;
- ar >> stringJID;
- jid = Swift::JID(stringJID);
- }
-
- template<class Archive> inline void serialize(Archive& ar, Swift::JID& t, const unsigned int file_version){
- split_free(ar, t, file_version);
- }
-
- template<class Archive> void serialize(Archive& ar, Swift::ChatListWindow::Chat& chat, const unsigned int version) {
- ar & chat.jid;
- ar & chat.chatName;
- ar & chat.activity;
- ar & chat.isMUC;
- ar & chat.nick;
- ar & chat.impromptuJIDs;
- if (version > 0) {
- ar & chat.password;
- }
- if (version > 1) {
- ar & chat.inviteesNames;
- }
- }
-}
-}
-
namespace Swift {
typedef std::pair<JID, ChatController*> JIDChatControllerPair;
typedef std::pair<JID, MUCController*> JIDMUCControllerPair;
+#ifndef NOT_YET
#define RECENT_CHATS "recent_chats"
+#endif
ChatsManager::ChatsManager(
JID jid, StanzaChannel* stanzaChannel,
@@ -120,7 +81,9 @@ ChatsManager::ChatsManager(
PresenceOracle* presenceOracle,
PresenceSender* presenceSender,
UIEventStream* uiEventStream,
+#ifndef NOT_YET
ChatListWindowFactory* chatListWindowFactory,
+#endif
bool useDelayForLatency,
TimerFactory* timerFactory,
MUCRegistry* mucRegistry,
@@ -137,7 +100,8 @@ ChatsManager::ChatsManager(
HighlightManager* highlightManager,
ClientBlockListManager* clientBlockListManager,
const std::map<std::string, std::string>& emoticons,
- VCardManager* vcardManager) :
+ VCardManager* vcardManager,
+ Chattables& chattables) :
jid_(jid),
joinMUCWindowFactory_(joinMUCWindowFactory),
useDelayForLatency_(useDelayForLatency),
@@ -153,7 +117,8 @@ ChatsManager::ChatsManager(
highlightManager_(highlightManager),
emoticons_(emoticons),
clientBlockListManager_(clientBlockListManager),
- vcardManager_(vcardManager) {
+ vcardManager_(vcardManager),
+ chattables_(chattables) {
timerFactory_ = timerFactory;
eventController_ = eventController;
stanzaChannel_ = stanzaChannel;
@@ -169,12 +134,12 @@ ChatsManager::ChatsManager(
profileSettings_ = profileSettings;
presenceOracle_->onPresenceChange.connect(boost::bind(&ChatsManager::handlePresenceChange, this, _1));
uiEventConnection_ = uiEventStream_->onUIEvent.connect(boost::bind(&ChatsManager::handleUIEvent, this, _1));
-
+#ifndef NOT_YET
chatListWindow_ = chatListWindowFactory->createChatListWindow(uiEventStream_);
chatListWindow_->onMUCBookmarkActivated.connect(boost::bind(&ChatsManager::handleMUCBookmarkActivated, this, _1));
chatListWindow_->onRecentActivated.connect(boost::bind(&ChatsManager::handleRecentActivated, this, _1));
chatListWindow_->onClearRecentsRequested.connect(boost::bind(&ChatsManager::handleClearRecentsRequested, this));
-
+#endif
joinMUCWindow_ = nullptr;
mucSearchController_ = new MUCSearchController(jid_, mucSearchWindowFactory, iqRouter, profileSettings_);
mucSearchController_->onMUCSelected.connect(boost::bind(&ChatsManager::handleMUCSelectedAfterSearch, this, _1));
@@ -188,24 +153,29 @@ ChatsManager::ChatsManager(
roster_->onJIDUpdated.connect(boost::bind(&ChatsManager::handleJIDUpdatedInRoster, this, _1));
roster_->onRosterCleared.connect(boost::bind(&ChatsManager::handleRosterCleared, this));
+ chattables_.onActivated.connect(boost::bind(&ChatsManager::handleChattableActivated, this, _1));
+
settings_->onSettingChanged.connect(boost::bind(&ChatsManager::handleSettingChanged, this, _1));
userWantsReceipts_ = settings_->getSetting(SettingConstants::REQUEST_DELIVERYRECEIPTS);
setupBookmarks();
+#ifndef NOT_YET
loadRecents();
-
+#endif
autoAcceptMUCInviteDecider_ = new AutoAcceptMUCInviteDecider(jid.getDomain(), roster_, settings_);
}
ChatsManager::~ChatsManager() {
settings_->onSettingChanged.disconnect(boost::bind(&ChatsManager::handleSettingChanged, this, _1));
+ chattables_.onActivated.disconnect(boost::bind(&ChatsManager::handleChattableActivated, this, _1));
roster_->onJIDAdded.disconnect(boost::bind(&ChatsManager::handleJIDAddedToRoster, this, _1));
roster_->onJIDRemoved.disconnect(boost::bind(&ChatsManager::handleJIDRemovedFromRoster, this, _1));
roster_->onJIDUpdated.disconnect(boost::bind(&ChatsManager::handleJIDUpdatedInRoster, this, _1));
roster_->onRosterCleared.disconnect(boost::bind(&ChatsManager::handleRosterCleared, this));
ftOverview_->onNewFileTransferController.disconnect(boost::bind(&ChatsManager::handleNewFileTransferController, this, _1));
delete joinMUCWindow_;
+ SWIFT_LOG(debug) << "Destroying ChatsManager, containing " << chatControllers_.size() << " chats and " << mucControllers_.size() << " MUCs";
for (JIDChatControllerPair controllerPair : chatControllers_) {
delete controllerPair.second;
}
@@ -217,6 +187,7 @@ ChatsManager::~ChatsManager() {
delete autoAcceptMUCInviteDecider_;
}
+#ifndef NOT_YET
void ChatsManager::saveRecents() {
std::stringstream serializeStream;
boost::archive::text_oarchive oa(serializeStream);
@@ -249,6 +220,7 @@ void ChatsManager::handleClearRecentsRequested() {
saveRecents();
handleUnreadCountChanged(nullptr);
}
+#endif
void ChatsManager::handleJIDAddedToRoster(const JID &jid) {
updatePresenceReceivingStateOnChatController(jid);
@@ -283,6 +255,7 @@ void ChatsManager::updatePresenceReceivingStateOnChatController(const JID &jid)
}
}
+#ifndef NOT_YET
ChatListWindow::Chat ChatsManager::updateChatStatusAndAvatarHelper(const ChatListWindow::Chat& chat) const {
ChatListWindow::Chat fixedChat = chat;
if (fixedChat.isMUC) {
@@ -338,10 +311,10 @@ void ChatsManager::loadRecents() {
boost::archive::text_iarchive ia(deserializeStream);
ia >> recentChats;
} catch (const boost::archive::archive_exception& e) {
- SWIFT_LOG(debug) << "Failed to load recents: " << e.what() << std::endl;
+ SWIFT_LOG(debug) << "Failed to load recents: " << e.what();
return;
}
-
+ recentChats.erase(std::remove(recentChats.begin(), recentChats.end(), ChatListWindow::Chat()), recentChats.end());
for (auto chat : recentChats) {
chat.statusType = StatusShow::None;
chat = updateChatStatusAndAvatarHelper(chat);
@@ -350,6 +323,7 @@ void ChatsManager::loadRecents() {
}
handleUnreadCountChanged(nullptr);
}
+#endif
void ChatsManager::setupBookmarks() {
if (!mucBookmarkManager_) {
@@ -358,33 +332,47 @@ void ChatsManager::setupBookmarks() {
mucBookmarkManager_->onBookmarkAdded.connect(boost::bind(&ChatsManager::handleMUCBookmarkAdded, this, _1));
mucBookmarkManager_->onBookmarkRemoved.connect(boost::bind(&ChatsManager::handleMUCBookmarkRemoved, this, _1));
+#ifndef NOT_YET
if (chatListWindow_) {
chatListWindow_->setBookmarksEnabled(false);
chatListWindow_->clearBookmarks();
}
+#endif
}
}
void ChatsManager::handleBookmarksReady() {
+#ifndef NOT_YET
if (chatListWindow_) {
chatListWindow_->setBookmarksEnabled(true);
}
+#endif
}
void ChatsManager::handleMUCBookmarkAdded(const MUCBookmark& bookmark) {
- std::map<JID, MUCController*>::iterator it = mucControllers_.find(bookmark.getRoom());
- if (it == mucControllers_.end() && bookmark.getAutojoin()) {
- handleJoinMUCRequest(bookmark.getRoom(), bookmark.getPassword(), bookmark.getNick(), false, false, false );
+ if (bookmark.getRoom().isBare() && !bookmark.getRoom().getNode().empty()) {
+ std::map<JID, MUCController*>::iterator it = mucControllers_.find(bookmark.getRoom());
+ if (it == mucControllers_.end() && bookmark.getAutojoin()) {
+ handleJoinMUCRequest(bookmark.getRoom(), bookmark.getPassword(), bookmark.getNick(), false, false);
+ }
+#ifndef NOT_YET
+ //Only one entry of the bookmark should exist
+ chatListWindow_->removeMUCBookmark(bookmark);
+ chatListWindow_->addMUCBookmark(bookmark);
+#endif
+ chattables_.addJID(bookmark.getRoom(), Chattables::State::Type::Room);
}
- chatListWindow_->addMUCBookmark(bookmark);
}
void ChatsManager::handleMUCBookmarkRemoved(const MUCBookmark& bookmark) {
+#ifndef NOT_YET
chatListWindow_->removeMUCBookmark(bookmark);
+#endif
}
+#ifndef NOT_YET
ChatListWindow::Chat ChatsManager::createChatListChatItem(const JID& jid, const std::string& activity, bool privateMessage) {
- int unreadCount = 0;
+ size_t unreadCount = 0;
if (mucRegistry_->isMUC(jid)) {
MUCController* controller = mucControllers_[jid.toBare()];
StatusShow::Type type = StatusShow::None;
@@ -427,8 +415,10 @@ ChatListWindow::Chat ChatsManager::createChatListChatItem(const JID& jid, const
return ChatListWindow::Chat(bareishJID, nickResolver_->jidToNick(bareishJID), activity, unreadCount, type, avatarPath, false, privateMessage);
}
}
+#endif
void ChatsManager::handleChatActivity(const JID& jid, const std::string& activity, bool isMUC) {
+#ifndef NOT_YET
const bool privateMessage = mucRegistry_->isMUC(jid.toBare()) && !isMUC;
ChatListWindow::Chat chat = createChatListChatItem(jid, activity, privateMessage);
/* FIXME: handle nick changes */
@@ -444,15 +434,20 @@ void ChatsManager::handleChatActivity(const JID& jid, const std::string& activit
mucControllers_[jid]->setChatWindowTitle(chatListWindowIter->getTitle());
}
}
+#endif
}
void ChatsManager::handleChatClosed(const JID& /*jid*/) {
cleanupPrivateMessageRecents();
+#ifndef NOT_YET
chatListWindow_->setRecents(recentChats_);
+#endif
}
+#ifndef NOT_YET
+
void ChatsManager::handleUnreadCountChanged(ChatControllerBase* controller) {
- int unreadTotal = 0;
+ size_t unreadTotal = 0;
bool controllerIsMUC = dynamic_cast<MUCController*>(controller);
bool isPM = controller && !controllerIsMUC && mucRegistry_->isMUC(controller->getToJID().toBare());
for (ChatListWindow::Chat& chatItem : recentChats_) {
@@ -484,7 +479,9 @@ boost::optional<ChatListWindow::Chat> ChatsManager::removeExistingChat(const Cha
return boost::optional<ChatListWindow::Chat>();
}
}
+#endif
+#ifndef NOT_YET
void ChatsManager::cleanupPrivateMessageRecents() {
/* if we leave a MUC and close a PM, remove it's recent chat entry */
const std::list<ChatListWindow::Chat> chats = recentChats_;
@@ -522,23 +519,38 @@ void ChatsManager::prependRecent(const ChatListWindow::Chat& chat) {
}
recentChats_.push_back(mergedChat);
}
+#endif
void ChatsManager::handleUserLeftMUC(MUCController* mucController) {
std::map<JID, MUCController*>::iterator it;
for (it = mucControllers_.begin(); it != mucControllers_.end(); ++it) {
if ((*it).second == mucController) {
+#ifndef NOT_YET
for (ChatListWindow::Chat& chat : recentChats_) {
if (chat.isMUC && chat.jid == (*it).first) {
chat.statusType = StatusShow::None;
}
}
+#endif
+ const auto& jid = it->first;
+ auto state = chattables_.getState(jid);
+ state.status = StatusShow::None;
+ chattables_.setState(jid, state);
+ //If user deletes bookmark from chatListWindow_ and then decides to leave the room, or if the server doesn't support bookmarks, the bookmark will not exist.
+ if (auto bookmarkFound = mucBookmarkManager_->lookupBookmark(jid)) {
+ MUCBookmark newBookmark(bookmarkFound.get());
+ newBookmark.setAutojoin(false);
+ mucBookmarkManager_->replaceBookmark(bookmarkFound.get(), newBookmark);
+ }
mucControllers_.erase(it);
delete mucController;
break;
}
}
cleanupPrivateMessageRecents();
+#ifndef NOT_YET
chatListWindow_->setRecents(recentChats_);
+#endif
}
void ChatsManager::handleSettingChanged(const std::string& settingPath) {
@@ -615,7 +627,7 @@ void ChatsManager::handleUIEvent(std::shared_ptr<UIEvent> event) {
invitees_[roomJID].insert(jid);
}
// join muc
- MUC::ref muc = handleJoinMUCRequest(roomJID, boost::optional<std::string>(), nickResolver_->jidToNick(jid_), false, true, true);
+ MUC::ref muc = handleJoinMUCRequest(roomJID, boost::optional<std::string>(), nickResolver_->jidToNick(jid_), true, true);
mucControllers_[roomJID]->onImpromptuConfigCompleted.connect(boost::bind(&ChatsManager::finalizeImpromptuJoin, this, muc, createImpromptuMUCEvent->getJIDs(), createImpromptuMUCEvent->getReason(), boost::optional<JID>()));
mucControllers_[roomJID]->activateChatWindow();
}
@@ -625,7 +637,7 @@ void ChatsManager::handleUIEvent(std::shared_ptr<UIEvent> event) {
mucBookmarkManager_->replaceBookmark(editMUCBookmarkEvent->getOldBookmark(), editMUCBookmarkEvent->getNewBookmark());
}
else if (JoinMUCUIEvent::ref joinEvent = std::dynamic_pointer_cast<JoinMUCUIEvent>(event)) {
- handleJoinMUCRequest(joinEvent->getJID(), joinEvent->getPassword(), joinEvent->getNick(), joinEvent->getShouldJoinAutomatically(), joinEvent->getCreateAsReservedRoomIfNew(), joinEvent->isImpromptu());
+ handleJoinMUCRequest(joinEvent->getJID(), joinEvent->getPassword(), joinEvent->getNick(), joinEvent->getCreateAsReservedRoomIfNew(), joinEvent->isImpromptu());
mucControllers_[joinEvent->getJID()]->activateChatWindow();
}
else if (std::shared_ptr<RequestJoinMUCUIEvent> joinEvent = std::dynamic_pointer_cast<RequestJoinMUCUIEvent>(event)) {
@@ -639,6 +651,7 @@ void ChatsManager::handleUIEvent(std::shared_ptr<UIEvent> event) {
}
}
+#ifndef NOT_YET
void ChatsManager::markAllRecentsOffline() {
for (ChatListWindow::Chat& chat : recentChats_) {
chat.setStatusType(StatusShow::None);
@@ -646,6 +659,7 @@ void ChatsManager::markAllRecentsOffline() {
chatListWindow_->setRecents(recentChats_);
}
+#endif
void ChatsManager::handleTransformChatToMUC(ChatController* chatController, ChatWindow* chatWindow, const std::vector<JID>& jidsToInvite, const std::string& reason) {
JID reuseChatInvite = chatController->getToJID();
@@ -659,7 +673,7 @@ void ChatsManager::handleTransformChatToMUC(ChatController* chatController, Chat
JID roomJID = JID(idGenerator_.generateID(), localMUCServiceJID_);
// join muc
- MUC::ref muc = handleJoinMUCRequest(roomJID, boost::optional<std::string>(), nickResolver_->jidToNick(jid_), false, true, true, chatWindow);
+ MUC::ref muc = handleJoinMUCRequest(roomJID, boost::optional<std::string>(), nickResolver_->jidToNick(jid_), true, true, chatWindow);
mucControllers_[roomJID]->onImpromptuConfigCompleted.connect(boost::bind(&ChatsManager::finalizeImpromptuJoin, this, muc, jidsToInvite, reason, boost::optional<JID>(reuseChatInvite)));
}
@@ -668,7 +682,7 @@ void ChatsManager::handleTransformChatToMUC(ChatController* chatController, Chat
*/
void ChatsManager::handlePresenceChange(std::shared_ptr<Presence> newPresence) {
if (mucRegistry_->isMUC(newPresence->getFrom().toBare())) return;
-
+#ifndef NOT_YET
for (ChatListWindow::Chat& chat : recentChats_) {
if (newPresence->getFrom().toBare() == chat.jid.toBare() && !chat.isMUC) {
Presence::ref presence = presenceOracle_->getHighestPriorityPresence(chat.jid.toBare());
@@ -677,8 +691,9 @@ void ChatsManager::handlePresenceChange(std::shared_ptr<Presence> newPresence) {
break;
}
}
-
+#endif
//if (newPresence->getType() != Presence::Unavailable) return;
+
JID fullJID(newPresence->getFrom());
std::map<JID, ChatController*>::iterator it = chatControllers_.find(fullJID);
if (it == chatControllers_.end()) return;
@@ -693,21 +708,25 @@ void ChatsManager::setAvatarManager(AvatarManager* avatarManager) {
avatarManager_->onAvatarChanged.disconnect(boost::bind(&ChatsManager::handleAvatarChanged, this, _1));
}
avatarManager_ = avatarManager;
+#ifndef NOT_YET
for (ChatListWindow::Chat& chat : recentChats_) {
if (!chat.isMUC) {
chat.setAvatarPath(avatarManager_->getAvatarPath(chat.jid));
}
}
+#endif
avatarManager_->onAvatarChanged.connect(boost::bind(&ChatsManager::handleAvatarChanged, this, _1));
}
void ChatsManager::handleAvatarChanged(const JID& jid) {
+#ifndef NOT_YET
for (ChatListWindow::Chat& chat : recentChats_) {
if (!chat.isMUC && jid.toBare() == chat.jid.toBare()) {
chat.setAvatarPath(avatarManager_->getAvatarPath(jid));
break;
}
}
+#endif
}
void ChatsManager::setServerDiscoInfo(std::shared_ptr<DiscoInfo> info) {
@@ -744,10 +763,11 @@ void ChatsManager::setOnline(bool enabled) {
localMUCServiceFinderWalker_->onWalkComplete.connect(boost::bind(&ChatsManager::handleLocalServiceWalkFinished, this));
localMUCServiceFinderWalker_->beginWalk();
}
-
+#ifndef NOT_YET
if (chatListWindow_) {
chatListWindow_->setBookmarksEnabled(enabled);
}
+#endif
}
void ChatsManager::handleChatRequest(const std::string &contact) {
@@ -771,12 +791,14 @@ ChatController* ChatsManager::getChatControllerOrFindAnother(const JID &contact)
ChatController* ChatsManager::createNewChatController(const JID& contact) {
assert(chatControllers_.find(contact) == chatControllers_.end());
std::shared_ptr<ChatMessageParser> chatMessageParser = std::make_shared<ChatMessageParser>(emoticons_, highlightManager_->getConfiguration(), ChatMessageParser::Mode::Chat); /* a message parser that knows this is a chat (not a room/MUC) */
- ChatController* controller = new ChatController(jid_, stanzaChannel_, iqRouter_, chatWindowFactory_, contact, nickResolver_, presenceOracle_, avatarManager_, mucRegistry_->isMUC(contact.toBare()), useDelayForLatency_, uiEventStream_, timerFactory_, eventController_, entityCapsProvider_, userWantsReceipts_, settings_, historyController_, mucRegistry_, highlightManager_, clientBlockListManager_, chatMessageParser, autoAcceptMUCInviteDecider_);
+ auto controller = new ChatController(jid_, stanzaChannel_, iqRouter_, chatWindowFactory_, contact, nickResolver_, presenceOracle_, avatarManager_, mucRegistry_->isMUC(contact.toBare()), useDelayForLatency_, uiEventStream_, timerFactory_, eventController_, entityCapsProvider_, userWantsReceipts_, historyController_, mucRegistry_, highlightManager_, clientBlockListManager_, chatMessageParser, autoAcceptMUCInviteDecider_, settings_, chattables_);
chatControllers_[contact] = controller;
controller->setAvailableServerFeatures(serverDiscoInfo_);
controller->onActivity.connect(boost::bind(&ChatsManager::handleChatActivity, this, contact, _1, false));
controller->onWindowClosed.connect(boost::bind(&ChatsManager::handleChatClosed, this, contact));
+#ifndef NOT_YET
controller->onUnreadCountChanged.connect(boost::bind(&ChatsManager::handleUnreadCountChanged, this, controller));
+#endif
controller->onConvertToMUC.connect(boost::bind(&ChatsManager::handleTransformChatToMUC, this, controller, _1, _2, _3));
updatePresenceReceivingStateOnChatController(contact);
controller->setCanStartImpromptuChats(!localMUCServiceJID_.toString().empty());
@@ -825,20 +847,8 @@ void ChatsManager::rebindControllerJID(const JID& from, const JID& to) {
chatControllers_[to]->setToJID(to);
}
-MUC::ref ChatsManager::handleJoinMUCRequest(const JID &mucJID, const boost::optional<std::string>& password, const boost::optional<std::string>& nickMaybe, bool addAutoJoin, bool createAsReservedIfNew, bool isImpromptu, ChatWindow* reuseChatwindow) {
+MUC::ref ChatsManager::handleJoinMUCRequest(const JID &mucJID, const boost::optional<std::string>& password, const boost::optional<std::string>& nickMaybe, bool createAsReservedIfNew, bool isImpromptu, ChatWindow* reuseChatwindow) {
MUC::ref muc;
- if (addAutoJoin) {
- MUCBookmark bookmark(mucJID, mucJID.getNode());
- bookmark.setAutojoin(true);
- if (nickMaybe) {
- bookmark.setNick(*nickMaybe);
- }
- if (password) {
- bookmark.setPassword(*password);
- }
- mucBookmarkManager_->addBookmark(bookmark);
- }
-
std::map<JID, MUCController*>::iterator it = mucControllers_.find(mucJID);
if (it != mucControllers_.end()) {
if (stanzaChannel_->isAvailable()) {
@@ -860,7 +870,11 @@ MUC::ref ChatsManager::handleJoinMUCRequest(const JID &mucJID, const boost::opti
chatWindowFactoryAdapter = new SingleChatWindowFactoryAdapter(reuseChatwindow);
}
std::shared_ptr<ChatMessageParser> chatMessageParser = std::make_shared<ChatMessageParser>(emoticons_, highlightManager_->getConfiguration(), ChatMessageParser::Mode::GroupChat); /* a message parser that knows this is a room/MUC (not a chat) */
- controller = new MUCController(jid_, muc, password, nick, stanzaChannel_, iqRouter_, reuseChatwindow ? chatWindowFactoryAdapter : chatWindowFactory_, nickResolver_, presenceOracle_, avatarManager_, uiEventStream_, false, timerFactory_, eventController_, entityCapsProvider_, roster_, historyController_, mucRegistry_, highlightManager_, clientBlockListManager_, chatMessageParser, isImpromptu, autoAcceptMUCInviteDecider_, vcardManager_, mucBookmarkManager_);
+ controller = new MUCController(jid_, muc, password, nick, stanzaChannel_, iqRouter_, reuseChatwindow ? chatWindowFactoryAdapter : chatWindowFactory_, nickResolver_, presenceOracle_, avatarManager_, uiEventStream_, false, timerFactory_, eventController_, entityCapsProvider_, roster_, historyController_, mucRegistry_, highlightManager_, clientBlockListManager_, chatMessageParser, isImpromptu, autoAcceptMUCInviteDecider_, vcardManager_, mucBookmarkManager_, settings_, chattables_);
+ chattables_.addJID(muc->getJID(), Chattables::State::Type::Room);
+ auto state = chattables_.getState(muc->getJID());
+ state.status = StatusShow::Online;
+ chattables_.setState(muc->getJID(), state);
if (chatWindowFactoryAdapter) {
/* The adapters are only passed to chat windows, which are deleted in their
* controllers' dtor, which are deleted in ChatManager's dtor. The adapters
@@ -874,7 +888,9 @@ MUC::ref ChatsManager::handleJoinMUCRequest(const JID &mucJID, const boost::opti
controller->onUserJoined.connect(boost::bind(&ChatsManager::handleChatActivity, this, mucJID.toBare(), "", true));
controller->onUserNicknameChanged.connect(boost::bind(&ChatsManager::handleUserNicknameChanged, this, controller, _1, _2));
controller->onActivity.connect(boost::bind(&ChatsManager::handleChatActivity, this, mucJID.toBare(), _1, true));
- controller->onUnreadCountChanged.connect(boost::bind(&ChatsManager::handleUnreadCountChanged, this, controller));
+#ifndef NOT_YET
+ controller->onUnreadCountChanged.connect(boost::bind(&ChatsManager::handleUnreadCountChanged, this, controller));
+#endif
if (!stanzaChannel_->isAvailable()) {
/* When online, the MUC is added to the registry in MUCImpl::internalJoin. This method is not
* called when Swift is offline, so we add it here as only MUCs in the registry are rejoined
@@ -884,12 +900,30 @@ MUC::ref ChatsManager::handleJoinMUCRequest(const JID &mucJID, const boost::opti
}
handleChatActivity(mucJID.toBare(), "", true);
}
-
+#ifndef NOT_YET
auto chatListWindowIter = std::find_if(recentChats_.begin(), recentChats_.end(), [&](const ChatListWindow::Chat& chatListWindow) { return mucJID == (chatListWindow.jid); });
if (chatListWindowIter != recentChats_.end() && (mucControllers_[mucJID]->isImpromptu() || !chatListWindowIter->impromptuJIDs.empty())) {
mucControllers_[mucJID]->setChatWindowTitle(chatListWindowIter->getTitle());
}
-
+#endif
+ if (auto existingBookmark = mucBookmarkManager_->lookupBookmark(mucJID)) {
+ if (!existingBookmark->getAutojoin()) {
+ MUCBookmark newbookmark(existingBookmark.get());
+ newbookmark.setAutojoin(true);
+ mucBookmarkManager_->replaceBookmark(*existingBookmark, newbookmark);
+ }
+ }
+ else {
+ MUCBookmark bookmark(mucJID, mucJID.getNode());
+ bookmark.setAutojoin(true);
+ if (nickMaybe) {
+ bookmark.setNick(*nickMaybe);
+ }
+ if (password) {
+ bookmark.setPassword(*password);
+ }
+ mucBookmarkManager_->addBookmark(bookmark);
+ }
mucControllers_[mucJID]->showChatWindow();
return muc;
}
@@ -902,7 +936,7 @@ void ChatsManager::handleUserNicknameChanged(MUCController* mucController, const
JID oldMUCChatJID = mucController->getToJID().withResource(oldNickname);
JID newMUCChatJID = mucController->getToJID().withResource(newNickname);
- SWIFT_LOG(debug) << "nickname change in " << mucController->getToJID().toString() << " from " << oldNickname << " to " << newNickname << std::endl;
+ SWIFT_LOG(debug) << "nickname change in " << mucController->getToJID().toString() << " from " << oldNickname << " to " << newNickname;
// get current chat controller
ChatController *chatController = getChatControllerIfExists(oldMUCChatJID);
@@ -949,7 +983,7 @@ void ChatsManager::handleIncomingMessage(std::shared_ptr<Message> incomingMessag
controller->handleIncomingOwnMessage(forwardedMessage);
}
else {
- SWIFT_LOG(error) << "Carbons message ignored." << std::endl;
+ SWIFT_LOG(error) << "Carbons message ignored.";
}
return;
}
@@ -999,11 +1033,11 @@ void ChatsManager::handleIncomingMessage(std::shared_ptr<Message> incomingMessag
ChatWindow* window = controller->detachChatWindow();
chatControllers_.erase(fromJID);
delete controller;
- handleJoinMUCRequest(invite->getJID(), boost::optional<std::string>(), boost::optional<std::string>(), false, false, true, window);
+ handleJoinMUCRequest(invite->getJID(), boost::optional<std::string>(), boost::optional<std::string>(), false, true, window);
return;
}
} else {
- handleJoinMUCRequest(invite->getJID(), boost::optional<std::string>(), boost::optional<std::string>(), false, false, true);
+ handleJoinMUCRequest(invite->getJID(), boost::optional<std::string>(), boost::optional<std::string>(), false, true);
return;
}
}
@@ -1062,7 +1096,7 @@ void ChatsManager::handleWhiteboardStateChange(const JID& contact, const ChatWin
chatListWindow_->removeWhiteboardSession(contact.toBare());
}
}
-
+#ifndef NOT_YET
void ChatsManager::handleRecentActivated(const ChatListWindow::Chat& chat) {
if (chat.isMUC && !chat.impromptuJIDs.empty()) {
typedef std::pair<std::string, JID> StringJIDPair;
@@ -1075,13 +1109,30 @@ void ChatsManager::handleRecentActivated(const ChatListWindow::Chat& chat) {
else if (chat.isMUC) {
bool isImpromptu = (!chat.inviteesNames.empty() || !chat.impromptuJIDs.empty());
/* FIXME: This means that recents requiring passwords will just flat-out not work */
- uiEventStream_->send(std::make_shared<JoinMUCUIEvent>(chat.jid, boost::optional<std::string>(), chat.nick, false, false, isImpromptu));
+ uiEventStream_->send(std::make_shared<JoinMUCUIEvent>(chat.jid, boost::optional<std::string>(), chat.nick, false, isImpromptu));
}
else {
uiEventStream_->send(std::make_shared<RequestChatUIEvent>(chat.jid));
}
}
+#endif
+
+void ChatsManager::handleChattableActivated(const JID& jid) {
+ auto state = chattables_.getState(jid);
+ if (state.type == Chattables::State::Type::Person) {
+ uiEventStream_->send(std::make_shared<RequestChatUIEvent>(jid));
+ }
+ else if (state.type == Chattables::State::Type::Room) {
+ if (auto foundBookmark = mucBookmarkManager_->lookupBookmark(jid)) {
+ handleMUCBookmarkActivated(foundBookmark.get());
+ }
+ else {
+ uiEventStream_->send(std::make_shared<JoinMUCUIEvent>(jid, boost::optional<std::string>(), boost::optional<std::string>())); // Just a quick hack to reuse already open MUCs
+ }
+ }
+}
+
void ChatsManager::handleLocalServiceFound(const JID& service, std::shared_ptr<DiscoInfo> info) {
for (DiscoInfo::Identity identity : info->getIdentities()) {
if ((identity.getCategory() == "directory"
@@ -1090,7 +1141,7 @@ void ChatsManager::handleLocalServiceFound(const JID& service, std::shared_ptr<D
&& identity.getType() == "text")) {
localMUCServiceJID_ = service;
localMUCServiceFinderWalker_->endWalk();
- SWIFT_LOG(debug) << "Use following MUC service for impromptu chats: " << localMUCServiceJID_ << std::endl;
+ SWIFT_LOG(debug) << "Use following MUC service for impromptu chats: " << localMUCServiceJID_;
break;
}
}
@@ -1107,17 +1158,21 @@ void ChatsManager::handleLocalServiceWalkFinished() {
onImpromptuMUCServiceDiscovered(impromptuMUCSupported);
}
+#ifndef NOT_YET
std::vector<ChatListWindow::Chat> ChatsManager::getRecentChats() const {
return std::vector<ChatListWindow::Chat>(recentChats_.begin(), recentChats_.end());
}
+#endif
std::vector<Contact::ref> Swift::ChatsManager::getContacts(bool withMUCNicks) {
std::vector<Contact::ref> result;
+#ifndef NOT_YET
for (ChatListWindow::Chat chat : recentChats_) {
if (!chat.isMUC) {
result.push_back(std::make_shared<Contact>(chat.chatName.empty() ? chat.jid.toString() : chat.chatName, chat.jid, chat.statusType, chat.avatarPath));
}
}
+#endif
if (withMUCNicks) {
/* collect MUC nicks */
typedef std::map<JID, MUCController*>::value_type Item;
diff --git a/Swift/Controllers/Chat/ChatsManager.h b/Swift/Controllers/Chat/ChatsManager.h
index 6004347..e120831 100644
--- a/Swift/Controllers/Chat/ChatsManager.h
+++ b/Swift/Controllers/Chat/ChatsManager.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -27,49 +27,52 @@
#include <Swift/Controllers/UIInterfaces/ChatWindowFactory.h>
namespace Swift {
- class EventController;
+ class AutoAcceptMUCInviteDecider;
+ class AvatarManager;
class ChatController;
class ChatControllerBase;
- class MUCController;
- class MUCManager;
+ class ChatListWindowFactory;
+ class ChatMessageParser;
+ class Chattables;
+ class ClientBlockListManager;
+ class DirectedPresenceSender;
+ class DiscoServiceWalker;
+ class EntityCapsProvider;
+ class EventController;
+ class FileTransferController;
+ class FileTransferOverview;
+ class HighlightManager;
+ class HistoryController;
+ class IQRouter;
class JoinMUCWindow;
class JoinMUCWindowFactory;
+ class MUCBookmarkManager;
+ class MUCController;
+ class MUCManager;
+ class MUCSearchController;
+ class MUCSearchWindowFactory;
class NickResolver;
class PresenceOracle;
- class AvatarManager;
- class StanzaChannel;
- class IQRouter;
class PresenceSender;
- class MUCBookmarkManager;
- class ChatListWindowFactory;
- class TimerFactory;
- class EntityCapsProvider;
- class DirectedPresenceSender;
- class MUCSearchWindowFactory;
class ProfileSettingsProvider;
- class MUCSearchController;
- class FileTransferOverview;
- class FileTransferController;
- class XMPPRoster;
class SettingsProvider;
- class WhiteboardManager;
- class HistoryController;
- class HighlightManager;
- class ClientBlockListManager;
- class ChatMessageParser;
- class DiscoServiceWalker;
- class AutoAcceptMUCInviteDecider;
+ class StanzaChannel;
+ class TimerFactory;
class VCardManager;
+ class WhiteboardManager;
+ class XMPPRoster;
class ChatsManager : public ContactProvider {
public:
- ChatsManager(JID jid, StanzaChannel* stanzaChannel, IQRouter* iqRouter, EventController* eventController, ChatWindowFactory* chatWindowFactory, JoinMUCWindowFactory* joinMUCWindowFactory, NickResolver* nickResolver, PresenceOracle* presenceOracle, PresenceSender* presenceSender, UIEventStream* uiEventStream, ChatListWindowFactory* chatListWindowFactory, bool useDelayForLatency, TimerFactory* timerFactory, MUCRegistry* mucRegistry, EntityCapsProvider* entityCapsProvider, MUCManager* mucManager, MUCSearchWindowFactory* mucSearchWindowFactory, ProfileSettingsProvider* profileSettings, FileTransferOverview* ftOverview, XMPPRoster* roster, bool eagleMode, SettingsProvider* settings, HistoryController* historyController_, WhiteboardManager* whiteboardManager, HighlightManager* highlightManager, ClientBlockListManager* clientBlockListManager, const std::map<std::string, std::string>& emoticons, VCardManager* vcardManager);
+ ChatsManager(JID jid, StanzaChannel* stanzaChannel, IQRouter* iqRouter, EventController* eventController, ChatWindowFactory* chatWindowFactory, JoinMUCWindowFactory* joinMUCWindowFactory, NickResolver* nickResolver, PresenceOracle* presenceOracle, PresenceSender* presenceSender, UIEventStream* uiEventStream, ChatListWindowFactory* chatListWindowFactory, bool useDelayForLatency, TimerFactory* timerFactory, MUCRegistry* mucRegistry, EntityCapsProvider* entityCapsProvider, MUCManager* mucManager, MUCSearchWindowFactory* mucSearchWindowFactory, ProfileSettingsProvider* profileSettings, FileTransferOverview* ftOverview, XMPPRoster* roster, bool eagleMode, SettingsProvider* settings, HistoryController* historyController_, WhiteboardManager* whiteboardManager, HighlightManager* highlightManager, ClientBlockListManager* clientBlockListManager, const std::map<std::string, std::string>& emoticons, VCardManager* vcardManager, Chattables& chattables);
virtual ~ChatsManager();
void setAvatarManager(AvatarManager* avatarManager);
void setOnline(bool enabled);
void setServerDiscoInfo(std::shared_ptr<DiscoInfo> info);
void handleIncomingMessage(std::shared_ptr<Message> incomingMessage);
+#ifndef NOT_YET
std::vector<ChatListWindow::Chat> getRecentChats() const;
+#endif
virtual std::vector<Contact::ref> getContacts(bool withMUCNicks);
boost::signals2::signal<void (bool supportsImpromptu)> onImpromptuMUCServiceDiscovered;
@@ -86,10 +89,12 @@ namespace Swift {
};
private:
+#ifndef NOT_YET
ChatListWindow::Chat createChatListChatItem(const JID& jid, const std::string& activity, bool privateMessage);
+#endif
void handleChatRequest(const std::string& contact);
void finalizeImpromptuJoin(MUC::ref muc, const std::vector<JID>& jidsToInvite, const std::string& reason, const boost::optional<JID>& reuseChatJID = boost::optional<JID>());
- MUC::ref handleJoinMUCRequest(const JID& muc, const boost::optional<std::string>& password, const boost::optional<std::string>& nick, bool addAutoJoin, bool createAsReservedIfNew, bool isImpromptu, ChatWindow* reuseChatwindow = nullptr);
+ MUC::ref handleJoinMUCRequest(const JID& muc, const boost::optional<std::string>& password, const boost::optional<std::string>& nick, bool createAsReservedIfNew, bool isImpromptu, ChatWindow* reuseChatwindow = nullptr);
void handleSearchMUCRequest();
void handleMUCSelectedAfterSearch(const JID&);
void rebindControllerJID(const JID& from, const JID& to);
@@ -105,18 +110,25 @@ namespace Swift {
void handleNewFileTransferController(FileTransferController*);
void handleWhiteboardSessionRequest(const JID& contact, bool senderIsSelf);
void handleWhiteboardStateChange(const JID& contact, const ChatWindow::WhiteboardSessionState state);
+#ifndef NOT_YET
boost::optional<ChatListWindow::Chat> removeExistingChat(const ChatListWindow::Chat& chat);
+#endif
bool messageCausesSessionBinding(std::shared_ptr<Message> message);
void cleanupPrivateMessageRecents();
+#ifndef NOT_YET
void appendRecent(const ChatListWindow::Chat& chat);
void prependRecent(const ChatListWindow::Chat& chat);
+#endif
void setupBookmarks();
+#ifndef NOT_YET
void loadRecents();
void saveRecents();
void handleChatMadeRecent();
void handleMUCBookmarkActivated(const MUCBookmark&);
void handleRecentActivated(const ChatListWindow::Chat&);
void handleUnreadCountChanged(ChatControllerBase* controller);
+#endif
+ void handleChattableActivated(const JID& jid);
void handleAvatarChanged(const JID& jid);
void handleClearRecentsRequested();
void handleJIDAddedToRoster(const JID&);
@@ -126,12 +138,13 @@ namespace Swift {
void handleSettingChanged(const std::string& settingPath);
void markAllRecentsOffline();
void handleTransformChatToMUC(ChatController* chatController, ChatWindow* chatWindow, const std::vector<JID>& jidsToInvite, const std::string& reason);
-
void handleLocalServiceFound(const JID& service, std::shared_ptr<DiscoInfo> info);
void handleLocalServiceWalkFinished();
-
void updatePresenceReceivingStateOnChatController(const JID&);
+#ifndef NOT_YET
ChatListWindow::Chat updateChatStatusAndAvatarHelper(const ChatListWindow::Chat& chat) const;
+#endif
+
ChatController* getChatControllerOrFindAnother(const JID &contact);
@@ -139,6 +152,9 @@ namespace Swift {
ChatController* getChatControllerOrCreate(const JID &contact);
ChatController* getChatControllerIfExists(const JID &contact, bool rebindIfNeeded = true);
+ protected:
+ MUCBookmarkManager* mucBookmarkManager_;
+
private:
std::map<JID, MUCController*> mucControllers_;
std::map<JID, ChatController*> chatControllers_;
@@ -154,9 +170,10 @@ namespace Swift {
AvatarManager* avatarManager_;
PresenceSender* presenceSender_;
UIEventStream* uiEventStream_;
- MUCBookmarkManager* mucBookmarkManager_;
std::shared_ptr<DiscoInfo> serverDiscoInfo_;
+#ifndef NOT_YET
ChatListWindow* chatListWindow_;
+#endif
JoinMUCWindow* joinMUCWindow_;
boost::signals2::scoped_connection uiEventConnection_;
bool useDelayForLatency_;
@@ -165,7 +182,9 @@ namespace Swift {
EntityCapsProvider* entityCapsProvider_;
MUCManager* mucManager;
MUCSearchController* mucSearchController_;
+#ifndef NOT_YET
std::list<ChatListWindow::Chat> recentChats_;
+#endif
ProfileSettingsProvider* profileSettings_;
FileTransferOverview* ftOverview_;
XMPPRoster* roster_;
@@ -182,6 +201,7 @@ namespace Swift {
AutoAcceptMUCInviteDecider* autoAcceptMUCInviteDecider_;
IDGenerator idGenerator_;
VCardManager* vcardManager_;
+ Chattables& chattables_;
std::map<JID, std::set<JID>> invitees_;
};
diff --git a/Swift/Controllers/Chat/Chattables.cpp b/Swift/Controllers/Chat/Chattables.cpp
new file mode 100644
index 0000000..707046f
--- /dev/null
+++ b/Swift/Controllers/Chat/Chattables.cpp
@@ -0,0 +1,43 @@
+/*
+ * Copyright (c) 2018 Isode Limited.
+ * All rights reserved.
+ * See the COPYING file for more information.
+ */
+
+#include <Swift/Controllers/Chat/Chattables.h>
+
+namespace Swift {
+
+const std::vector<JID>& Chattables::get() const {
+ return list_;
+}
+
+const Chattables::State& Chattables::getState(const JID& jid) const {
+ auto it = states_.find(jid);
+ return it != states_.end() ? it->second : unknown_;
+}
+
+void Chattables::addJID(const JID& jid, State::Type type) {
+ if (states_.find(jid) != states_.end()) {
+ return;
+ }
+ State state;
+ state.type = type;
+ state.jid = jid;
+ onBeginAdd(static_cast<int>(list_.size()));
+ list_.push_back(jid);
+ states_[jid] = state;
+ onAdded();
+}
+
+void Chattables::setState(const JID& jid, State state) {
+ auto stateIter = states_.find(jid);
+ if (stateIter == states_.end()) {
+ return;
+ }
+ stateIter->second = state;
+ auto listPos = static_cast<int>(std::distance(list_.begin(), std::find(list_.begin(), list_.end(), jid)));
+ onChanged(jid, listPos);
+}
+
+}
diff --git a/Swift/Controllers/Chat/Chattables.h b/Swift/Controllers/Chat/Chattables.h
new file mode 100644
index 0000000..3b5817a
--- /dev/null
+++ b/Swift/Controllers/Chat/Chattables.h
@@ -0,0 +1,47 @@
+/*
+ * Copyright (c) 2018 Isode Limited.
+ * All rights reserved.
+ * See the COPYING file for more information.
+ */
+
+#pragma once
+
+#include <map>
+#include <vector>
+
+#include <boost/signals2.hpp>
+
+#include <Swiften/Elements/StatusShow.h>
+#include <Swiften/JID/JID.h>
+
+namespace Swift {
+class Chattables {
+ public:
+ struct State {
+ enum class Type {Room, Person};
+ JID jid;
+ /// Empty for no name
+ std::string name;
+ size_t unreadCount = 0;
+ Type type;
+ StatusShow::Type status = StatusShow::None;
+ //avatar
+ //status
+ };
+ const std::vector<JID>& get() const;
+ const State& getState(const JID& jid) const;
+
+ void addJID(const JID& jid, State::Type type);
+ void setState(const JID& jid, State state);
+
+ boost::signals2::signal<void (int)> onBeginAdd;
+ boost::signals2::signal<void ()> onAdded;
+ boost::signals2::signal<void (const JID&, int)> onChanged;
+ /// The UI has activated a chattable item (e.g. clicked in the roster)
+ boost::signals2::signal<void (const JID&)> onActivated;
+ private:
+ std::vector<JID> list_;
+ std::map<JID, State> states_;
+ State unknown_;
+};
+}
diff --git a/Swift/Controllers/Chat/MUCController.cpp b/Swift/Controllers/Chat/MUCController.cpp
index ff8efa2..30d4933 100644
--- a/Swift/Controllers/Chat/MUCController.cpp
+++ b/Swift/Controllers/Chat/MUCController.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010-2017 Isode Limited.
+ * Copyright (c) 2010-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -23,6 +23,7 @@
#include <Swiften/Client/ClientBlockListManager.h>
#include <Swiften/Client/StanzaChannel.h>
#include <Swiften/Disco/EntityCapsProvider.h>
+#include <Swiften/Disco/GetDiscoInfoRequest.h>
#include <Swiften/Elements/Delay.h>
#include <Swiften/Elements/Thread.h>
#include <Swiften/MUC/MUC.h>
@@ -35,6 +36,7 @@
#include <SwifTools/TabComplete.h>
#include <Swift/Controllers/Chat/ChatMessageParser.h>
+#include <Swift/Controllers/Chat/Chattables.h>
#include <Swift/Controllers/Highlighting/Highlighter.h>
#include <Swift/Controllers/Intl.h>
#include <Swift/Controllers/Roster/ContactRosterItem.h>
@@ -59,17 +61,6 @@
namespace Swift {
-class MUCBookmarkPredicate {
- public:
- MUCBookmarkPredicate(const JID& mucJID) : roomJID_(mucJID) { }
- bool operator()(const MUCBookmark& operand) {
- return operand.getRoom() == roomJID_;
- }
-
- private:
- JID roomJID_;
-};
-
/**
* The controller does not gain ownership of the stanzaChannel, nor the factory.
*/
@@ -98,8 +89,10 @@ MUCController::MUCController (
bool isImpromptu,
AutoAcceptMUCInviteDecider* autoAcceptMUCInviteDecider,
VCardManager* vcardManager,
- MUCBookmarkManager* mucBookmarkManager) :
- ChatControllerBase(self, stanzaChannel, iqRouter, chatWindowFactory, muc->getJID(), nickResolver, presenceOracle, avatarManager, useDelayForLatency, uiEventStream, eventController, entityCapsProvider, historyController, mucRegistry, highlightManager, chatMessageParser, autoAcceptMUCInviteDecider), muc_(muc), nick_(nick), desiredNick_(nick), password_(password), renameCounter_(0), isImpromptu_(isImpromptu), isImpromptuAlreadyConfigured_(false), clientBlockListManager_(clientBlockListManager), mucBookmarkManager_(mucBookmarkManager) {
+ MUCBookmarkManager* mucBookmarkManager,
+ SettingsProvider* settings,
+ Chattables& chattables) :
+ ChatControllerBase(self, stanzaChannel, iqRouter, chatWindowFactory, muc->getJID(), nickResolver, presenceOracle, avatarManager, useDelayForLatency, uiEventStream, eventController, entityCapsProvider, historyController, mucRegistry, highlightManager, chatMessageParser, autoAcceptMUCInviteDecider, settings, chattables), muc_(muc), nick_(nick), desiredNick_(nick), password_(password), renameCounter_(0), isImpromptu_(isImpromptu), isImpromptuAlreadyConfigured_(false), clientBlockListManager_(clientBlockListManager), mucBookmarkManager_(mucBookmarkManager) {
assert(avatarManager_);
parting_ = true;
@@ -171,14 +164,7 @@ MUCController::MUCController (
mucBookmarkManagerBookmarkAddedConnection_ = (mucBookmarkManager_->onBookmarkAdded.connect(boost::bind(&MUCController::handleMUCBookmarkAdded, this, _1)));
mucBookmarkManagerBookmarkRemovedConnection_ = (mucBookmarkManager_->onBookmarkRemoved.connect(boost::bind(&MUCController::handleMUCBookmarkRemoved, this, _1)));
- std::vector<MUCBookmark> mucBookmarks = mucBookmarkManager_->getBookmarks();
- std::vector<MUCBookmark>::iterator bookmarkIterator = std::find_if(mucBookmarks.begin(), mucBookmarks.end(), MUCBookmarkPredicate(muc->getJID()));
- if (bookmarkIterator != mucBookmarks.end()) {
- updateChatWindowBookmarkStatus(*bookmarkIterator);
- }
- else {
- updateChatWindowBookmarkStatus(boost::optional<MUCBookmark>());
- }
+ updateChatWindowBookmarkStatus(mucBookmarkManager_->lookupBookmark(muc->getJID()));
}
MUCController::~MUCController() {
@@ -273,6 +259,9 @@ void MUCController::rejoin() {
lastActivity_ = historyController_->getLastTimeStampFromMUC(selfJID_, toJID_);
}
#endif
+
+ requestSecurityMarking();
+
if (lastActivity_ == boost::posix_time::not_a_date_time) {
muc_->joinAs(nick_);
}
@@ -492,6 +481,7 @@ void MUCController::setAvailableRoomActions(const MUCOccupant::Affiliation& affi
if (role <= MUCOccupant::Visitor) {
actions.push_back(ChatWindow::Invite);
}
+ actions.push_back(ChatWindow::Leave);
chatWindow_->setAvailableRoomActions(actions);
}
@@ -1243,4 +1233,63 @@ void MUCController::setChatWindowTitle(const std::string& title) {
chatWindow_->setName(chatWindowTitle_);
}
+void MUCController::requestSecurityMarking() {
+ auto discoInfoRequest = GetDiscoInfoRequest::create(muc_->getJID(), iqRouter_);
+ discoInfoRequest->onResponse.connect(
+ [this](std::shared_ptr<DiscoInfo> discoInfoRef, ErrorPayload::ref errorPayloadRef) {
+ if (!discoInfoRef || errorPayloadRef) {
+ return;
+ }
+ const std::vector<Form::ref>& extensionsList = discoInfoRef->getExtensions();
+ if (extensionsList.empty()) {
+ return;
+ }
+ // Get the correct form if it exists
+ Form::ref roomInfoForm;
+ for (const auto& form : extensionsList) {
+ if (form->getFormType() == "http://jabber.org/protocol/muc#roominfo") {
+ roomInfoForm = form;
+ break;
+ }
+ }
+ if (!roomInfoForm) {
+ return;
+ }
+ // It exists, now examine the security marking data
+ auto marking = roomInfoForm->getField("x-isode#roominfo_marking");
+ if (!marking) {
+ return;
+ }
+ // Now we know the marking is valid
+ auto markingValue = marking->getTextSingleValue();
+ if (markingValue == "") {
+ setMUCSecurityMarkingDefault();
+ return;
+ }
+ auto markingForegroundColor = roomInfoForm->getField("x-isode#roominfo_marking_fg_color");
+ auto markingBackgroundColor = roomInfoForm->getField("x-isode#roominfo_marking_bg_color");
+ std::string markingForegroundColorValue = "Black";
+ std::string markingBackgroundColorValue = "White";
+ if (markingForegroundColor && markingForegroundColor->getTextSingleValue() != "") {
+ markingForegroundColorValue = markingForegroundColor->getTextSingleValue();
+ }
+ if (markingBackgroundColor && markingBackgroundColor->getTextSingleValue() != "") {
+ markingBackgroundColorValue = markingBackgroundColor->getTextSingleValue();
+ }
+ setMUCSecurityMarking(markingValue, markingForegroundColorValue, markingBackgroundColorValue);
+ }
+ );
+ discoInfoRequest->send();
+}
+
+void MUCController::setMUCSecurityMarking(const std::string& markingValue, const std::string& markingForegroundColorValue, const std::string& markingBackgroundColorValue) {
+ roomSecurityMarking_ = markingValue;
+ chatWindow_->setChatSecurityMarking(markingValue, markingForegroundColorValue, markingBackgroundColorValue);
+}
+
+void MUCController::setMUCSecurityMarkingDefault() {
+ roomSecurityMarking_ = "";
+ chatWindow_->removeChatSecurityMarking();
+}
+
}
diff --git a/Swift/Controllers/Chat/MUCController.h b/Swift/Controllers/Chat/MUCController.h
index 4b39f54..bd1148f 100644
--- a/Swift/Controllers/Chat/MUCController.h
+++ b/Swift/Controllers/Chat/MUCController.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010-2017 Isode Limited.
+ * Copyright (c) 2010-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -53,7 +53,7 @@ namespace Swift {
class MUCController : public ChatControllerBase {
public:
- MUCController(const JID& self, MUC::ref muc, const boost::optional<std::string>& password, const std::string &nick, StanzaChannel* stanzaChannel, IQRouter* iqRouter, ChatWindowFactory* chatWindowFactory, NickResolver* nickResolver, PresenceOracle* presenceOracle, AvatarManager* avatarManager, UIEventStream* events, bool useDelayForLatency, TimerFactory* timerFactory, EventController* eventController, EntityCapsProvider* entityCapsProvider, XMPPRoster* xmppRoster, HistoryController* historyController, MUCRegistry* mucRegistry, HighlightManager* highlightManager, ClientBlockListManager* clientBlockListManager, std::shared_ptr<ChatMessageParser> chatMessageParser, bool isImpromptu, AutoAcceptMUCInviteDecider* autoAcceptMUCInviteDecider, VCardManager* vcardManager, MUCBookmarkManager* mucBookmarkManager);
+ MUCController(const JID& self, MUC::ref muc, const boost::optional<std::string>& password, const std::string &nick, StanzaChannel* stanzaChannel, IQRouter* iqRouter, ChatWindowFactory* chatWindowFactory, NickResolver* nickResolver, PresenceOracle* presenceOracle, AvatarManager* avatarManager, UIEventStream* events, bool useDelayForLatency, TimerFactory* timerFactory, EventController* eventController, EntityCapsProvider* entityCapsProvider, XMPPRoster* xmppRoster, HistoryController* historyController, MUCRegistry* mucRegistry, HighlightManager* highlightManager, ClientBlockListManager* clientBlockListManager, std::shared_ptr<ChatMessageParser> chatMessageParser, bool isImpromptu, AutoAcceptMUCInviteDecider* autoAcceptMUCInviteDecider, VCardManager* vcardManager, MUCBookmarkManager* mucBookmarkManager, SettingsProvider* settings, Chattables& chattables);
virtual ~MUCController() override;
boost::signals2::signal<void ()> onUserLeft;
boost::signals2::signal<void ()> onUserJoined;
@@ -148,6 +148,10 @@ namespace Swift {
void displaySubjectIfChanged(const std::string& sucject);
void addChatSystemMessage();
+ void requestSecurityMarking();
+ void setMUCSecurityMarking(const std::string& markingValue, const std::string& markingForegroundColorValue, const std::string& markingBackgroundColorValue);
+ void setMUCSecurityMarkingDefault();
+
private:
MUC::ref muc_;
std::string nick_;
@@ -189,4 +193,3 @@ namespace Swift {
std::string chatWindowTitle_;
};
}
-
diff --git a/Swift/Controllers/Chat/MUCSearchController.cpp b/Swift/Controllers/Chat/MUCSearchController.cpp
index 5db917a..0b54d25 100644
--- a/Swift/Controllers/Chat/MUCSearchController.cpp
+++ b/Swift/Controllers/Chat/MUCSearchController.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2019 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -92,7 +92,7 @@ void MUCSearchController::handleSearchService(const JID& jid) {
delete walker_;
}
- SWIFT_LOG(debug) << "Starting walking MUC services" << std::endl;
+ SWIFT_LOG(debug) << "Starting walking MUC services";
itemsInProgress_ = 0;
walker_ = new DiscoServiceWalker(jid, iqRouter_);
walker_->onServiceFound.connect(boost::bind(&MUCSearchController::handleDiscoServiceFound, this, _1, _2));
@@ -113,14 +113,14 @@ void MUCSearchController::handleDiscoServiceFound(const JID& jid, std::shared_pt
}
}
if (isMUC) {
- SWIFT_LOG(debug) << "MUC Service found: " << jid << std::endl;
+ SWIFT_LOG(debug) << "MUC Service found: " << jid;
services_.erase(std::remove(services_.begin(), services_.end(), jid), services_.end());
services_.push_back(jid);
serviceDetails_[jid].setName(name);
serviceDetails_[jid].setJID(jid);
serviceDetails_[jid].setComplete(false);
itemsInProgress_++;
- SWIFT_LOG(debug) << "Requesting items of " << jid << " (" << itemsInProgress_ << " item requests in progress)" << std::endl;
+ SWIFT_LOG(debug) << "Requesting items of " << jid << " (" << itemsInProgress_ << " item requests in progress)";
GetDiscoItemsRequest::ref discoItemsRequest = GetDiscoItemsRequest::create(jid, iqRouter_);
discoItemsRequest->onResponse.connect(boost::bind(&MUCSearchController::handleRoomsItemsResponse, this, _1, _2, jid));
discoItemsRequest->send();
@@ -132,7 +132,7 @@ void MUCSearchController::handleDiscoServiceFound(const JID& jid, std::shared_pt
}
void MUCSearchController::handleDiscoWalkFinished() {
- SWIFT_LOG(debug) << "MUC Walk finished" << std::endl;
+ SWIFT_LOG(debug) << "MUC Walk finished";
updateInProgressness();
}
@@ -144,7 +144,7 @@ void MUCSearchController::removeService(const JID& jid) {
void MUCSearchController::handleRoomsItemsResponse(std::shared_ptr<DiscoItems> items, ErrorPayload::ref error, const JID& jid) {
itemsInProgress_--;
- SWIFT_LOG(debug) << "Items received for " << jid << " (" << itemsInProgress_ << " item requests in progress)" << std::endl;
+ SWIFT_LOG(debug) << "Items received for " << jid << " (" << itemsInProgress_ << " item requests in progress)";
updateInProgressness();
if (error) {
handleDiscoError(jid, error);
diff --git a/Swift/Controllers/Chat/UnitTest/ChatControllerTest.cpp b/Swift/Controllers/Chat/UnitTest/ChatControllerTest.cpp
new file mode 100644
index 0000000..e010656
--- /dev/null
+++ b/Swift/Controllers/Chat/UnitTest/ChatControllerTest.cpp
@@ -0,0 +1,162 @@
+/*
+ * Copyright (c) 2018 Isode Limited.
+ * All rights reserved.
+ * See the COPYING file for more information.
+ */
+
+#include <memory>
+#include <string>
+
+#include <gtest/gtest.h>
+#include <hippomocks.h>
+
+#include <Swiften/Avatars/NullAvatarManager.h>
+#include <Swiften/Client/ClientBlockListManager.h>
+#include <Swiften/Client/DummyStanzaChannel.h>
+#include <Swiften/Client/NickResolver.h>
+#include <Swiften/Disco/DummyEntityCapsProvider.h>
+#include <Swiften/Network/DummyTimerFactory.h>
+#include <Swiften/Queries/DummyIQChannel.h>
+#include <Swiften/Roster/XMPPRoster.h>
+#include <Swiften/Roster/XMPPRosterImpl.h>
+#include <Swiften/VCards/VCardManager.h>
+#include <Swiften/VCards/VCardMemoryStorage.h>
+
+#include <Swift/Controllers/Chat/AutoAcceptMUCInviteDecider.h>
+#include <Swift/Controllers/Chat/ChatController.h>
+#include <Swift/Controllers/Chat/ChatMessageParser.h>
+#include <Swift/Controllers/Chat/Chattables.h>
+#include <Swift/Controllers/Settings/DummySettingsProvider.h>
+#include <Swift/Controllers/UIEvents/UIEventStream.h>
+#include <Swift/Controllers/UIInterfaces/ChatWindowFactory.h>
+#include <Swift/Controllers/UnitTest/MockChatWindow.h>
+#include <Swift/Controllers/XMPPEvents/EventController.h>
+
+using namespace Swift;
+
+/**
+ * Most of the ChatController tests are in ChatsManagerTest.
+ * New tests related with ChatController should be added here,
+ * and old tests should be migrated when possible.
+ */
+
+class ExtendedChatController : public ChatController {
+public:
+ ExtendedChatController(const JID& self, StanzaChannel* stanzaChannel, IQRouter* iqRouter, ChatWindowFactory* chatWindowFactory, const JID &contact, NickResolver* nickResolver, PresenceOracle* presenceOracle, AvatarManager* avatarManager, bool isInMUC, bool useDelayForLatency, UIEventStream* eventStream, TimerFactory* timerFactory, EventController* eventController, EntityCapsProvider* entityCapsProvider, bool userWantsReceipts, HistoryController* historyController, MUCRegistry* mucRegistry, HighlightManager* highlightManager, ClientBlockListManager* clientBlockListManager, std::shared_ptr<ChatMessageParser> chatMessageParser, AutoAcceptMUCInviteDecider* autoAcceptMUCInviteDecider, SettingsProvider* settings, Chattables& chattables) :
+ ChatController(self, stanzaChannel, iqRouter, chatWindowFactory, contact, nickResolver, presenceOracle, avatarManager, isInMUC, useDelayForLatency, eventStream, timerFactory, eventController, entityCapsProvider, userWantsReceipts, historyController, mucRegistry, highlightManager, clientBlockListManager, chatMessageParser, autoAcceptMUCInviteDecider, settings, chattables) {
+ }
+
+ std::map<std::shared_ptr<Stanza>, std::string> getUnackedStanzas() { return unackedStanzas_; }
+ std::map<std::string, std::shared_ptr<Stanza>> getFailedStanzas() { return failedStanzas_; }
+};
+
+class ChatControllerTest : public ::testing::Test {
+protected:
+ virtual void SetUp() {
+ self_ = JID("alice@wonderland.lit");
+ other_ = JID("whiterabbit@wonderland.lit");
+ stanzaChannel_ = new DummyStanzaChannel();
+ iqChannel_ = new DummyIQChannel();
+ iqRouter_ = new IQRouter(iqChannel_);
+ eventController_ = new EventController();
+ xmppRoster_ = new XMPPRosterImpl();
+ vCardManager_ = new VCardManager(self_, iqRouter_, vCardMemoryStorage_);
+ mucRegistry_ = new MUCRegistry();
+ nickResolver_ = new NickResolver(self_, xmppRoster_, vCardManager_, mucRegistry_);
+ presenceOracle_ = new PresenceOracle(stanzaChannel_, xmppRoster_);
+ avatarManager_ = new NullAvatarManager();
+ uiEventStream_ = new UIEventStream();
+ timerFactory_ = new DummyTimerFactory();
+ entityCapsProvider_ = new DummyEntityCapsProvider();
+ settings_ = new DummySettingsProvider();
+ highlightManager_ = new HighlightManager(settings_);
+ highlightManager_->resetToDefaultConfiguration();
+ clientBlockListManager_ = new ClientBlockListManager(iqRouter_);
+ autoAcceptMUCInviteDecider_ = new AutoAcceptMUCInviteDecider(self_.getDomain(), xmppRoster_, settings_);
+ chatMessageParser_ = std::make_shared<ChatMessageParser>(std::map<std::string, std::string>(), highlightManager_->getConfiguration(), ChatMessageParser::Mode::GroupChat);
+ mocks_ = new MockRepository();
+ window_ = new MockChatWindow();
+ chatWindowFactory_ = mocks_->InterfaceMock<ChatWindowFactory>();
+ mocks_->ExpectCall(chatWindowFactory_, ChatWindowFactory::createChatWindow).With(other_, uiEventStream_).Return(window_);
+ chattables_ = std::make_unique<Chattables>();
+
+ controller_ = new ExtendedChatController(self_, stanzaChannel_, iqRouter_, chatWindowFactory_, other_, nickResolver_, presenceOracle_, avatarManager_, false, false, uiEventStream_, timerFactory_, eventController_, entityCapsProvider_, false, nullptr, mucRegistry_, highlightManager_, clientBlockListManager_, chatMessageParser_, nullptr, settings_, *chattables_);
+ }
+ virtual void TearDown() {
+ delete controller_;
+ chattables_.reset();
+ chatMessageParser_.reset();
+ delete autoAcceptMUCInviteDecider_;
+ delete clientBlockListManager_;
+ delete highlightManager_;
+ delete settings_;
+ delete entityCapsProvider_;
+ delete timerFactory_;
+ delete uiEventStream_;
+ delete avatarManager_;
+ delete presenceOracle_;
+ delete nickResolver_;
+ delete mucRegistry_;
+ delete vCardManager_;
+ delete xmppRoster_;
+ delete eventController_;
+ delete iqRouter_;
+ delete iqChannel_;
+ delete stanzaChannel_;
+ }
+
+ JID self_, other_;
+ AvatarManager* avatarManager_ = nullptr;
+ ExtendedChatController* controller_ = nullptr;
+ ChatWindowFactory* chatWindowFactory_;
+ ClientBlockListManager* clientBlockListManager_;
+ EventController* eventController_ = nullptr;
+ EntityCapsProvider* entityCapsProvider_ = nullptr;
+ IQChannel* iqChannel_ = nullptr;
+ IQRouter* iqRouter_ = nullptr;
+ MockRepository* mocks_;
+ MockChatWindow* window_;
+ MUCRegistry* mucRegistry_ = nullptr;
+ NickResolver* nickResolver_ = nullptr;
+ PresenceOracle* presenceOracle_ = nullptr;
+ DummyStanzaChannel* stanzaChannel_ = nullptr;
+ TimerFactory* timerFactory_;
+ XMPPRosterImpl* xmppRoster_ = nullptr;
+ UIEventStream* uiEventStream_;
+ VCardManager* vCardManager_ = nullptr;
+ VCardMemoryStorage* vCardMemoryStorage_ = nullptr;
+ DummySettingsProvider* settings_;
+ HighlightManager* highlightManager_;
+ std::shared_ptr<ChatMessageParser> chatMessageParser_;
+ AutoAcceptMUCInviteDecider* autoAcceptMUCInviteDecider_;
+ std::unique_ptr<Chattables> chattables_;
+
+};
+
+TEST_F(ChatControllerTest, testResendMessage) {
+ std::string msgBody("TestMsg");
+ stanzaChannel_->setStreamManagementEnabled(true);
+ window_->onSendMessageRequest(msgBody, false);
+ {
+ auto failedStanzas = controller_->getFailedStanzas();
+ auto unackedStanzas = controller_->getUnackedStanzas();
+ ASSERT_EQ(failedStanzas.size(), 0);
+ ASSERT_EQ(unackedStanzas.size(), 1);
+ }
+ //Disconnecting to fail the stanza
+ controller_->setOnline(false);
+ controller_->setOnline(true);
+ {
+ auto failedStanzas = controller_->getFailedStanzas();
+ auto unackedStanzas = controller_->getUnackedStanzas();
+ ASSERT_EQ(failedStanzas.size(), 1);
+ ASSERT_EQ(unackedStanzas.size(), 0);
+ }
+ window_->onResendMessageRequest("id");
+ {
+ auto failedStanzas = controller_->getFailedStanzas();
+ auto unackedStanzas = controller_->getUnackedStanzas();
+ ASSERT_EQ(failedStanzas.size(), 0);
+ ASSERT_EQ(unackedStanzas.size(), 1);
+ }
+}
diff --git a/Swift/Controllers/Chat/UnitTest/ChatListWindowChatTest.cpp b/Swift/Controllers/Chat/UnitTest/ChatListWindowChatTest.cpp
new file mode 100644
index 0000000..9561e2b
--- /dev/null
+++ b/Swift/Controllers/Chat/UnitTest/ChatListWindowChatTest.cpp
@@ -0,0 +1,292 @@
+/*
+ * Copyright (c) 2017 Isode Limited.
+ * All rights reserved.
+ * See the COPYING file for more information.
+ */
+
+#include <memory>
+#include <string>
+#include <vector>
+
+#include <boost/algorithm/string.hpp>
+#include <boost/version.hpp>
+
+#include <gtest/gtest.h>
+
+#include <Swiften/Base/ByteArray.h>
+#include <Swiften/StringCodecs/Base64.h>
+
+#include <Swift/Controllers/Chat/ChatListWindowChatBoostSerialize.h>
+#include <Swift/Controllers/UIInterfaces/ChatListWindow.h>
+
+using namespace Swift;
+
+class ChatListWindowChatTest : public ::testing::Test {
+protected:
+ virtual void SetUp() {}
+ virtual void TearDown() {}
+
+ void testOptionalPasswordValue(const boost::optional<std::string>& value1, const std::string& value2) {
+ auto archiveLibraryVersion = boost::archive::BOOST_ARCHIVE_VERSION();
+ if (archiveLibraryVersion != Swift::BoostArchiveSkipVersion) {
+ EXPECT_EQ(value1.get_value_or(""), value2);
+ }
+ else {
+ EXPECT_EQ(value1.get_value_or(""), "");
+ }
+ }
+
+ std::string chatsSerialise(const std::vector<ChatListWindow::Chat>& chats) {
+ std::stringstream serializeStream;
+ boost::archive::text_oarchive oa(serializeStream);
+ oa & chats;
+ std::string serializedStr = Base64::encode(createByteArray(serializeStream.str()));
+ return serializedStr;
+ }
+
+ std::vector<ChatListWindow::Chat> chatsDeserialise(const std::string& b64chats) {
+ ByteArray debase64 = Base64::decode(b64chats);
+ std::vector<ChatListWindow::Chat> recentChats;
+ std::stringstream deserializeStream(std::string(reinterpret_cast<const char*>(vecptr(debase64)), debase64.size()));
+ try {
+ boost::archive::text_iarchive ia(deserializeStream);
+ ia >> recentChats;
+ }
+ catch (const boost::archive::archive_exception& e) {
+ EXPECT_TRUE(false) << "Archive Version:" << boost::archive::BOOST_ARCHIVE_VERSION() << " " << e.what() << std::endl;
+ recentChats.clear();
+ return recentChats;
+ }
+ recentChats.erase(std::remove(recentChats.begin(), recentChats.end(), ChatListWindow::Chat()), recentChats.end());
+ return recentChats;
+ }
+};
+
+TEST_F(ChatListWindowChatTest, testNormalSerialization) {
+ ChatListWindow::Chat chat1("swift@rooms.swift.im", "swift@rooms.swift.im", "Some text 0", 0, StatusShow::None, "", false, false, "Nick Name");
+ ChatListWindow::Chat chat2("testuser1@domain.com", "swift@rooms2.swift.im", "Some text 1", 0, StatusShow::None, "", false, false, "Nick Name", std::string("pass"));
+ ChatListWindow::Chat chat3("testuser2@domain.com", "room 2", "Some text 2", 0, StatusShow::None, "", true, false, "Nick Name");
+ ChatListWindow::Chat chat4("testuser3@domain.com", "room 3", "Some text 2", 0, StatusShow::None, "", true, false, "Nick Name", std::string("pass"));
+
+ std::map<std::string, JID> impromptuJIDs;
+ impromptuJIDs["testuser1@domain.com"] = "testuser1@domain.com";
+ impromptuJIDs["testuser2@domain.com"] = "testuser2@domain.com";
+ std::map<JID, std::string> inviteesNames;
+ inviteesNames["user1@domain.com"] = "user1@domain.com";
+
+ chat3.impromptuJIDs = impromptuJIDs;
+ chat3.inviteesNames = inviteesNames;
+ chat4.impromptuJIDs = impromptuJIDs;
+ chat4.inviteesNames = inviteesNames;
+
+ std::vector<ChatListWindow::Chat> chats;
+ chats.push_back(chat1);
+ chats.push_back(chat2);
+ chats.push_back(chat3);
+ chats.push_back(chat4);
+
+ auto base64 = chatsSerialise(chats);
+ ASSERT_TRUE(base64.size() > 0);
+ auto restoredChats = chatsDeserialise(base64);
+ ASSERT_EQ(restoredChats.size(), 4);
+
+ EXPECT_FALSE(restoredChats[0].isMUC);
+ EXPECT_EQ(restoredChats[0].jid, "swift@rooms.swift.im");
+ EXPECT_EQ(restoredChats[0].chatName, "swift@rooms.swift.im");
+ EXPECT_EQ(restoredChats[0].activity, "Some text 0");
+ EXPECT_EQ(restoredChats[0].nick, "Nick Name");
+ EXPECT_EQ(restoredChats[0].impromptuJIDs.size(), 0);
+ testOptionalPasswordValue(restoredChats[0].password, "");
+ EXPECT_EQ(restoredChats[0].inviteesNames.size(), 0);
+
+ EXPECT_FALSE(restoredChats[1].isMUC);
+ EXPECT_EQ(restoredChats[1].jid, "testuser1@domain.com");
+ EXPECT_EQ(restoredChats[1].chatName, "swift@rooms2.swift.im");
+ EXPECT_EQ(restoredChats[1].activity, "Some text 1");
+ EXPECT_EQ(restoredChats[1].nick, "Nick Name");
+ EXPECT_EQ(restoredChats[1].impromptuJIDs.size(), 0);
+ testOptionalPasswordValue(restoredChats[1].password, "pass");
+ EXPECT_EQ(restoredChats[1].inviteesNames.size(), 0);
+
+ EXPECT_TRUE(restoredChats[2].isMUC);
+ EXPECT_EQ(restoredChats[2].jid, "testuser2@domain.com");
+ EXPECT_EQ(restoredChats[2].chatName, "room 2");
+ EXPECT_EQ(restoredChats[2].activity, "Some text 2");
+ EXPECT_EQ(restoredChats[2].nick, "Nick Name");
+ ASSERT_EQ(restoredChats[2].impromptuJIDs.size(), 2);
+ EXPECT_EQ(restoredChats[2].impromptuJIDs["testuser1@domain.com"], "testuser1@domain.com");
+ EXPECT_EQ(restoredChats[2].impromptuJIDs["testuser2@domain.com"], "testuser2@domain.com");
+ testOptionalPasswordValue(restoredChats[2].password, "");
+ ASSERT_EQ(restoredChats[2].inviteesNames.size(), 1);
+ EXPECT_EQ(restoredChats[2].inviteesNames["user1@domain.com"], "user1@domain.com");
+
+ EXPECT_TRUE(restoredChats[3].isMUC);
+ EXPECT_EQ(restoredChats[3].jid, "testuser3@domain.com");
+ EXPECT_EQ(restoredChats[3].chatName, "room 3");
+ EXPECT_EQ(restoredChats[3].activity, "Some text 2");
+ EXPECT_EQ(restoredChats[3].nick, "Nick Name");
+ ASSERT_EQ(restoredChats[3].impromptuJIDs.size(), 2);
+ EXPECT_EQ(restoredChats[3].impromptuJIDs["testuser1@domain.com"], "testuser1@domain.com");
+ EXPECT_EQ(restoredChats[3].impromptuJIDs["testuser2@domain.com"], "testuser2@domain.com");
+ testOptionalPasswordValue(restoredChats[3].password, "pass");
+ ASSERT_EQ(restoredChats[3].inviteesNames.size(), 1);
+ EXPECT_EQ(restoredChats[3].inviteesNames["user1@domain.com"], "user1@domain.com");
+}
+
+TEST_F(ChatListWindowChatTest, testVersionsSerialization) {
+ auto archiveLibraryVersion = boost::archive::BOOST_ARCHIVE_VERSION();
+ /*
+ The following strings are base64 serialised vectors with these Swift::ChatListWindow::Chat elements:
+
+ Chat1: Jid = "swift@rooms.swift.im", ChatName = "swift@rooms.swift.im", Activity = "Some text 0", isMUC = false, nick="Nick Name"
+ Chat2: Jid = "testuser1@domain.com", ChatName = "swift@rooms2.swift.im", Activity = "Some text 1", isMUC = false, nick="Nick Name", password = "pass"
+ Chat3: Jid = "testuser2@domain.com", ChatName = "room2", Activity = "Some text 2", isMUC = true, nick="Nick Name", impromptuJIDs, inviteesNames
+ Chat4: Jid = "testuser3@domain.com", ChatName = "room3", Activity = "Some text 2", isMUC = true, nick="Nick Name", impromptuJIDs, password = "pass", inviteesNames
+
+ impromptuJIDs = {("testuser1@domain.com","testuser1@domain.com"), ("testuser2@domain.com", "testuser2@domain.com")}
+ inviteesNames = {("user1@domain.com","user1@domain.com")}
+ */
+ std::string serializedChats_BoostArchiveV10_ClassVersion_0 = "MjIgc2VyaWFsaXphdGlvbjo6YXJjaGl2ZSAxMCAwIDAgNCAwIDAgMCAwIDAgMjAgc3dpZnRAcm9vbXMuc3dpZnQuaW0gMjAgc3dpZnRAcm9vbXMuc3dpZnQuaW0gMTEgU29tZSB0ZXh0IDAgMCA5IE5pY2sgTmFtZSAwIDAgMCAwIDIwIHRlc3R1c2VyMUBkb21haW4uY29tIDIxIHN3aWZ0QHJvb21zMi5zd2lmdC5pbSAxMSBTb21lIHRleHQgMSAwIDkgTmljayBOYW1lIDAgMCAyMCB0ZXN0dXNlcjJAZG9tYWluLmNvbSA2IHJvb20gMiAxMSBTb21lIHRleHQgMiAxIDkgTmljayBOYW1lIDIgMCAwIDAgMjAgdGVzdHVzZXIxQGRvbWFpbi5jb20gMjAgdGVzdHVzZXIxQGRvbWFpbi5jb20gMjAgdGVzdHVzZXIyQGRvbWFpbi5jb20gMjAgdGVzdHVzZXIyQGRvbWFpbi5jb20gMjAgdGVzdHVzZXIzQGRvbWFpbi5jb20gNiByb29tIDMgMTEgU29tZSB0ZXh0IDIgMSA5IE5pY2sgTmFtZSAyIDAgMjAgdGVzdHVzZXIxQGRvbWFpbi5jb20gMjAgdGVzdHVzZXIxQGRvbWFpbi5jb20gMjAgdGVzdHVzZXIyQGRvbWFpbi5jb20gMjAgdGVzdHVzZXIyQGRvbWFpbi5jb20=";
+ {
+ auto restoredChats = chatsDeserialise(serializedChats_BoostArchiveV10_ClassVersion_0);
+ if (archiveLibraryVersion == Swift::BoostArchiveSkipVersion) {
+ ASSERT_EQ(restoredChats.size(), 0);
+ }
+ else {
+ ASSERT_EQ(restoredChats.size(), 4);
+
+ EXPECT_FALSE(restoredChats[0].isMUC);
+ EXPECT_EQ(restoredChats[0].jid, "swift@rooms.swift.im");
+ EXPECT_EQ(restoredChats[0].chatName, "swift@rooms.swift.im");
+ EXPECT_EQ(restoredChats[0].activity, "Some text 0");
+ EXPECT_EQ(restoredChats[0].nick, "Nick Name");
+ EXPECT_EQ(restoredChats[0].impromptuJIDs.size(), 0);
+
+ EXPECT_FALSE(restoredChats[1].isMUC);
+ EXPECT_EQ(restoredChats[1].jid, "testuser1@domain.com");
+ EXPECT_EQ(restoredChats[1].chatName, "swift@rooms2.swift.im");
+ EXPECT_EQ(restoredChats[1].activity, "Some text 1");
+ EXPECT_EQ(restoredChats[1].nick, "Nick Name");
+ EXPECT_EQ(restoredChats[1].impromptuJIDs.size(), 0);
+
+ EXPECT_TRUE(restoredChats[2].isMUC);
+ EXPECT_EQ(restoredChats[2].jid, "testuser2@domain.com");
+ EXPECT_EQ(restoredChats[2].chatName, "room 2");
+ EXPECT_EQ(restoredChats[2].activity, "Some text 2");
+ EXPECT_EQ(restoredChats[2].nick, "Nick Name");
+ ASSERT_EQ(restoredChats[2].impromptuJIDs.size(), 2);
+ EXPECT_EQ(restoredChats[2].impromptuJIDs["testuser1@domain.com"], "testuser1@domain.com");
+ EXPECT_EQ(restoredChats[2].impromptuJIDs["testuser2@domain.com"], "testuser2@domain.com");
+
+ EXPECT_TRUE(restoredChats[3].isMUC);
+ EXPECT_EQ(restoredChats[3].jid, "testuser3@domain.com");
+ EXPECT_EQ(restoredChats[3].chatName, "room 3");
+ EXPECT_EQ(restoredChats[3].activity, "Some text 2");
+ EXPECT_EQ(restoredChats[3].nick, "Nick Name");
+ ASSERT_EQ(restoredChats[3].impromptuJIDs.size(), 2);
+ EXPECT_EQ(restoredChats[3].impromptuJIDs["testuser1@domain.com"], "testuser1@domain.com");
+ EXPECT_EQ(restoredChats[3].impromptuJIDs["testuser2@domain.com"], "testuser2@domain.com");
+ }
+ }
+
+ std::string serializedChats_BoostArchiveV10_ClassVersion_1 = "MjIgc2VyaWFsaXphdGlvbjo6YXJjaGl2ZSAxMCAwIDAgNCAxIDAgMSAwIDAgMjAgc3dpZnRAcm9vbXMuc3dpZnQuaW0gMjAgc3dpZnRAcm9vbXMuc3dpZnQuaW0gMTEgU29tZSB0ZXh0IDAgMCA5IE5pY2sgTmFtZSAwIDAgMCAwIDAgMCAwIDIwIHRlc3R1c2VyMUBkb21haW4uY29tIDIxIHN3aWZ0QHJvb21zMi5zd2lmdC5pbSAxMSBTb21lIHRleHQgMSAwIDkgTmljayBOYW1lIDAgMCAxIDAgNCBwYXNzIDIwIHRlc3R1c2VyMkBkb21haW4uY29tIDYgcm9vbSAyIDExIFNvbWUgdGV4dCAyIDEgOSBOaWNrIE5hbWUgMiAwIDAgMCAyMCB0ZXN0dXNlcjFAZG9tYWluLmNvbSAyMCB0ZXN0dXNlcjFAZG9tYWluLmNvbSAyMCB0ZXN0dXNlcjJAZG9tYWluLmNvbSAyMCB0ZXN0dXNlcjJAZG9tYWluLmNvbSAwIDIwIHRlc3R1c2VyM0Bkb21haW4uY29tIDYgcm9vbSAzIDExIFNvbWUgdGV4dCAyIDEgOSBOaWNrIE5hbWUgMiAwIDIwIHRlc3R1c2VyMUBkb21haW4uY29tIDIwIHRlc3R1c2VyMUBkb21haW4uY29tIDIwIHRlc3R1c2VyMkBkb21haW4uY29tIDIwIHRlc3R1c2VyMkBkb21haW4uY29tIDEgMCA0IHBhc3M=";
+ {
+ auto restoredChats = chatsDeserialise(serializedChats_BoostArchiveV10_ClassVersion_1);
+ if (archiveLibraryVersion == Swift::BoostArchiveSkipVersion) {
+ ASSERT_EQ(restoredChats.size(), 0);
+ }
+ else {
+ ASSERT_EQ(restoredChats.size(), 4);
+
+ EXPECT_FALSE(restoredChats[0].isMUC);
+ EXPECT_EQ(restoredChats[0].jid, "swift@rooms.swift.im");
+ EXPECT_EQ(restoredChats[0].chatName, "swift@rooms.swift.im");
+ EXPECT_EQ(restoredChats[0].activity, "Some text 0");
+ EXPECT_EQ(restoredChats[0].nick, "Nick Name");
+ EXPECT_EQ(restoredChats[0].impromptuJIDs.size(), 0);
+ EXPECT_EQ(restoredChats[0].password.get_value_or(""), "");
+
+ EXPECT_FALSE(restoredChats[1].isMUC);
+ EXPECT_EQ(restoredChats[1].jid, "testuser1@domain.com");
+ EXPECT_EQ(restoredChats[1].chatName, "swift@rooms2.swift.im");
+ EXPECT_EQ(restoredChats[1].activity, "Some text 1");
+ EXPECT_EQ(restoredChats[1].nick, "Nick Name");
+ EXPECT_EQ(restoredChats[1].impromptuJIDs.size(), 0);
+ EXPECT_EQ(restoredChats[1].password.get_value_or(""), "pass");
+
+ EXPECT_TRUE(restoredChats[2].isMUC);
+ EXPECT_EQ(restoredChats[2].jid, "testuser2@domain.com");
+ EXPECT_EQ(restoredChats[2].chatName, "room 2");
+ EXPECT_EQ(restoredChats[2].activity, "Some text 2");
+ EXPECT_EQ(restoredChats[2].nick, "Nick Name");
+ ASSERT_EQ(restoredChats[2].impromptuJIDs.size(), 2);
+ EXPECT_EQ(restoredChats[2].impromptuJIDs["testuser1@domain.com"], "testuser1@domain.com");
+ EXPECT_EQ(restoredChats[2].impromptuJIDs["testuser2@domain.com"], "testuser2@domain.com");
+ EXPECT_EQ(restoredChats[2].password.get_value_or(""), "");
+
+ EXPECT_TRUE(restoredChats[3].isMUC);
+ EXPECT_EQ(restoredChats[3].jid, "testuser3@domain.com");
+ EXPECT_EQ(restoredChats[3].chatName, "room 3");
+ EXPECT_EQ(restoredChats[3].activity, "Some text 2");
+ EXPECT_EQ(restoredChats[3].nick, "Nick Name");
+ ASSERT_EQ(restoredChats[3].impromptuJIDs.size(), 2);
+ EXPECT_EQ(restoredChats[3].impromptuJIDs["testuser1@domain.com"], "testuser1@domain.com");
+ EXPECT_EQ(restoredChats[3].impromptuJIDs["testuser2@domain.com"], "testuser2@domain.com");
+ EXPECT_EQ(restoredChats[3].password.get_value_or(""), "pass");
+ }
+ }
+
+ std::string serializedChats_BoostArchiveV10_ClassVersion_2 = "MjIgc2VyaWFsaXphdGlvbjo6YXJjaGl2ZSAxMCAwIDAgNCAyIDAgMiAwIDAgMjAgc3dpZnRAcm9vbXMuc3dpZnQuaW0gMjAgc3dpZnRAcm9vbXMuc3dpZnQuaW0gMTEgU29tZSB0ZXh0IDAgMCA5IE5pY2sgTmFtZSAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMjAgdGVzdHVzZXIxQGRvbWFpbi5jb20gMjEgc3dpZnRAcm9vbXMyLnN3aWZ0LmltIDExIFNvbWUgdGV4dCAxIDAgOSBOaWNrIE5hbWUgMCAwIDEgMCA0IHBhc3MgMCAwIDIwIHRlc3R1c2VyMkBkb21haW4uY29tIDYgcm9vbSAyIDExIFNvbWUgdGV4dCAyIDEgOSBOaWNrIE5hbWUgMiAwIDAgMCAyMCB0ZXN0dXNlcjFAZG9tYWluLmNvbSAyMCB0ZXN0dXNlcjFAZG9tYWluLmNvbSAyMCB0ZXN0dXNlcjJAZG9tYWluLmNvbSAyMCB0ZXN0dXNlcjJAZG9tYWluLmNvbSAwIDEgMCAwIDAgMTYgdXNlcjFAZG9tYWluLmNvbSAxNiB1c2VyMUBkb21haW4uY29tIDIwIHRlc3R1c2VyM0Bkb21haW4uY29tIDYgcm9vbSAzIDExIFNvbWUgdGV4dCAyIDEgOSBOaWNrIE5hbWUgMiAwIDIwIHRlc3R1c2VyMUBkb21haW4uY29tIDIwIHRlc3R1c2VyMUBkb21haW4uY29tIDIwIHRlc3R1c2VyMkBkb21haW4uY29tIDIwIHRlc3R1c2VyMkBkb21haW4uY29tIDEgMCA0IHBhc3MgMSAwIDE2IHVzZXIxQGRvbWFpbi5jb20gMTYgdXNlcjFAZG9tYWluLmNvbQ==";
+ {
+ auto restoredChats = chatsDeserialise(serializedChats_BoostArchiveV10_ClassVersion_2);
+ if (archiveLibraryVersion == Swift::BoostArchiveSkipVersion) {
+ ASSERT_EQ(restoredChats.size(), 0);
+ }
+ else {
+ ASSERT_EQ(restoredChats.size(), 4);
+
+ EXPECT_FALSE(restoredChats[0].isMUC);
+ EXPECT_EQ(restoredChats[0].jid, "swift@rooms.swift.im");
+ EXPECT_EQ(restoredChats[0].chatName, "swift@rooms.swift.im");
+ EXPECT_EQ(restoredChats[0].activity, "Some text 0");
+ EXPECT_EQ(restoredChats[0].nick, "Nick Name");
+ EXPECT_EQ(restoredChats[0].impromptuJIDs.size(), 0);
+ EXPECT_EQ(restoredChats[0].password.get_value_or(""), "");
+ EXPECT_EQ(restoredChats[0].inviteesNames.size(), 0);
+
+ EXPECT_FALSE(restoredChats[1].isMUC);
+ EXPECT_EQ(restoredChats[1].jid, "testuser1@domain.com");
+ EXPECT_EQ(restoredChats[1].chatName, "swift@rooms2.swift.im");
+ EXPECT_EQ(restoredChats[1].activity, "Some text 1");
+ EXPECT_EQ(restoredChats[1].nick, "Nick Name");
+ EXPECT_EQ(restoredChats[1].impromptuJIDs.size(), 0);
+ EXPECT_EQ(restoredChats[1].password.get_value_or(""), "pass");
+ EXPECT_EQ(restoredChats[1].inviteesNames.size(), 0);
+
+ EXPECT_TRUE(restoredChats[2].isMUC);
+ EXPECT_EQ(restoredChats[2].jid, "testuser2@domain.com");
+ EXPECT_EQ(restoredChats[2].chatName, "room 2");
+ EXPECT_EQ(restoredChats[2].activity, "Some text 2");
+ EXPECT_EQ(restoredChats[2].nick, "Nick Name");
+ ASSERT_EQ(restoredChats[2].impromptuJIDs.size(), 2);
+ EXPECT_EQ(restoredChats[2].impromptuJIDs["testuser1@domain.com"], "testuser1@domain.com");
+ EXPECT_EQ(restoredChats[2].impromptuJIDs["testuser2@domain.com"], "testuser2@domain.com");
+ EXPECT_EQ(restoredChats[2].password.get_value_or(""), "");
+ ASSERT_EQ(restoredChats[2].inviteesNames.size(), 1);
+ EXPECT_EQ(restoredChats[2].inviteesNames["user1@domain.com"], "user1@domain.com");
+
+ EXPECT_TRUE(restoredChats[3].isMUC);
+ EXPECT_EQ(restoredChats[3].jid, "testuser3@domain.com");
+ EXPECT_EQ(restoredChats[3].chatName, "room 3");
+ EXPECT_EQ(restoredChats[3].activity, "Some text 2");
+ EXPECT_EQ(restoredChats[3].nick, "Nick Name");
+ ASSERT_EQ(restoredChats[3].impromptuJIDs.size(), 2);
+ EXPECT_EQ(restoredChats[3].impromptuJIDs["testuser1@domain.com"], "testuser1@domain.com");
+ EXPECT_EQ(restoredChats[3].impromptuJIDs["testuser2@domain.com"], "testuser2@domain.com");
+ EXPECT_EQ(restoredChats[3].password.get_value_or(""), "pass");
+ ASSERT_EQ(restoredChats[3].inviteesNames.size(), 1);
+ EXPECT_EQ(restoredChats[3].inviteesNames["user1@domain.com"], "user1@domain.com");
+ }
+ }
+}
+
diff --git a/Swift/Controllers/Chat/UnitTest/ChatsManagerTest.cpp b/Swift/Controllers/Chat/UnitTest/ChatsManagerTest.cpp
index 8f6c3a8..954dd2f 100644
--- a/Swift/Controllers/Chat/UnitTest/ChatsManagerTest.cpp
+++ b/Swift/Controllers/Chat/UnitTest/ChatsManagerTest.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010-2017 Isode Limited.
+ * Copyright (c) 2010-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -32,9 +32,13 @@
#include <Swiften/Elements/Forwarded.h>
#include <Swiften/Elements/MUCInvitationPayload.h>
#include <Swiften/Elements/MUCUserPayload.h>
+#include <Swiften/Elements/PrivateStorage.h>
+#include <Swiften/Elements/Storage.h>
#include <Swiften/FileTransfer/UnitTest/DummyFileTransferManager.h>
#include <Swiften/Jingle/JingleSessionManager.h>
#include <Swiften/MUC/MUCManager.h>
+#include <Swiften/MUC/UnitTest/MockMUC.h>
+#include <Swiften/MUC/MUCBookmarkManager.h>
#include <Swiften/Network/DummyTimerFactory.h>
#include <Swiften/Presence/DirectedPresenceSender.h>
#include <Swiften/Presence/PresenceOracle.h>
@@ -47,6 +51,7 @@
#include <Swift/Controllers/Chat/ChatController.h>
#include <Swift/Controllers/Chat/ChatsManager.h>
+#include <Swift/Controllers/Chat/Chattables.h>
#include <Swift/Controllers/Chat/MUCController.h>
#include <Swift/Controllers/Chat/UnitTest/MockChatListWindow.h>
#include <Swift/Controllers/EventNotifier.h>
@@ -54,6 +59,7 @@
#include <Swift/Controllers/ProfileSettingsProvider.h>
#include <Swift/Controllers/SettingConstants.h>
#include <Swift/Controllers/Settings/DummySettingsProvider.h>
+#include <Swift/Controllers/UIEvents/AddMUCBookmarkUIEvent.h>
#include <Swift/Controllers/UIEvents/CreateImpromptuMUCUIEvent.h>
#include <Swift/Controllers/UIEvents/JoinMUCUIEvent.h>
#include <Swift/Controllers/UIEvents/RequestChatUIEvent.h>
@@ -71,7 +77,6 @@
#include <SwifTools/Notifier/Notifier.h>
#include <Swift/QtUI/QtSwiftUtil.h>
-#include <Swiften/MUC/UnitTest/MockMUC.h>
using namespace Swift;
@@ -104,6 +109,16 @@ class DummyNotifier : public Notifier {
std::vector<Notification> notifications;
};
+class ExtendedChatsManager : public ChatsManager {
+public:
+ ExtendedChatsManager(JID jid, StanzaChannel* stanzaChannel, IQRouter* iqRouter, EventController* eventController, ChatWindowFactory* chatWindowFactory, JoinMUCWindowFactory* joinMUCWindowFactory, NickResolver* nickResolver, PresenceOracle* presenceOracle, PresenceSender* presenceSender, UIEventStream* uiEventStream, ChatListWindowFactory* chatListWindowFactory, bool useDelayForLatency, TimerFactory* timerFactory, MUCRegistry* mucRegistry, EntityCapsProvider* entityCapsProvider, MUCManager* mucManager, MUCSearchWindowFactory* mucSearchWindowFactory, ProfileSettingsProvider* profileSettings, FileTransferOverview* ftOverview, XMPPRoster* roster, bool eagleMode, SettingsProvider* settings, HistoryController* historyController_, WhiteboardManager* whiteboardManager, HighlightManager* highlightManager, ClientBlockListManager* clientBlockListManager, const std::map<std::string, std::string>& emoticons, VCardManager* vcardManager, Chattables& chattables) :
+ ChatsManager(jid, stanzaChannel, iqRouter, eventController, chatWindowFactory, joinMUCWindowFactory, nickResolver, presenceOracle, presenceSender, uiEventStream, chatListWindowFactory, useDelayForLatency, timerFactory, mucRegistry, entityCapsProvider, mucManager, mucSearchWindowFactory, profileSettings, ftOverview, roster, eagleMode, settings, historyController_, whiteboardManager, highlightManager, clientBlockListManager, emoticons, vcardManager, chattables) {
+ }
+ MUCBookmarkManager* getBookmarkManager() {
+ return mucBookmarkManager_;
+ }
+};
+
class ChatsManagerTest : public CppUnit::TestFixture {
CPPUNIT_TEST_SUITE(ChatsManagerTest);
@@ -155,6 +170,17 @@ class ChatsManagerTest : public CppUnit::TestFixture {
CPPUNIT_TEST(testImpromptuChatWindowTitle);
CPPUNIT_TEST(testStandardMUCChatWindowTitle);
+ // Bookmark tests
+ CPPUNIT_TEST(testReceivingBookmarksWithDomainJID);
+ CPPUNIT_TEST(testReceivingBookmarksWithBareJID);
+ CPPUNIT_TEST(testReceivingBookmarksWithFullJID);
+ CPPUNIT_TEST(testAutoJoinBookmarksAndChattables);
+ CPPUNIT_TEST(testJoinNoAutojoinBookmark);
+ CPPUNIT_TEST(testJoinAndBookmarkMUC);
+ CPPUNIT_TEST(testReceivingNoBookmarks);
+ CPPUNIT_TEST(testReceivingNullBookmarks);
+ CPPUNIT_TEST(testReceivingBookmarksError);
+
CPPUNIT_TEST_SUITE_END();
public:
@@ -200,7 +226,8 @@ public:
mocks_->ExpectCall(chatListWindowFactory_, ChatListWindowFactory::createChatListWindow).With(uiEventStream_).Return(chatListWindow_);
clientBlockListManager_ = new ClientBlockListManager(iqRouter_);
timerFactory_ = new DummyTimerFactory();
- manager_ = new ChatsManager(jid_, stanzaChannel_, iqRouter_, eventController_, chatWindowFactory_, joinMUCWindowFactory_, nickResolver_, presenceOracle_, directedPresenceSender_, uiEventStream_, chatListWindowFactory_, true, timerFactory_, mucRegistry_, entityCapsProvider_, mucManager_, mucSearchWindowFactory_, profileSettings_, ftOverview_, xmppRoster_, false, settings_, nullptr, wbManager_, highlightManager_, clientBlockListManager_, emoticons_, vcardManager_);
+ chattables_ = std::make_unique<Chattables>();
+ manager_ = new ExtendedChatsManager(jid_, stanzaChannel_, iqRouter_, eventController_, chatWindowFactory_, joinMUCWindowFactory_, nickResolver_, presenceOracle_, directedPresenceSender_, uiEventStream_, chatListWindowFactory_, true, timerFactory_, mucRegistry_, entityCapsProvider_, mucManager_, mucSearchWindowFactory_, profileSettings_, ftOverview_, xmppRoster_, false, settings_, nullptr, wbManager_, highlightManager_, clientBlockListManager_, emoticons_, vcardManager_, *chattables_);
manager_->setAvatarManager(avatarManager_);
}
@@ -776,7 +803,7 @@ public:
// send message to participantA
auto messageBody = std::string("message body to send");
window->onSendMessageRequest(messageBody, false);
- auto sendMessageStanza = stanzaChannel_->getStanzaAtIndex<Message>(2);
+ auto sendMessageStanza = stanzaChannel_->getStanzaAtIndex<Message>(3);
CPPUNIT_ASSERT_EQUAL(messageBody, *sendMessageStanza->getBody());
// receive reply with error
@@ -1228,6 +1255,11 @@ public:
CPPUNIT_ASSERT_EQUAL(forwardedBody, MockChatWindow::bodyFromMessage(window->lastAddedMessage_));
CPPUNIT_ASSERT_EQUAL(false, window->lastAddedMessageSenderIsSelf_);
+
+ auto recentChats = manager_->getRecentChats();
+ CPPUNIT_ASSERT_EQUAL(recentChats.size(), size_t(1));
+ CPPUNIT_ASSERT_EQUAL(recentChats[0].jid, originalMessage->getFrom().toBare());
+ CPPUNIT_ASSERT_EQUAL(recentChats[0].activity, std::string("Some further text."));
}
}
@@ -1264,6 +1296,11 @@ public:
CPPUNIT_ASSERT_EQUAL(true, window->lastAddedMessageSenderIsSelf_);
CPPUNIT_ASSERT_EQUAL(size_t(1), window->receiptChanges_.size());
CPPUNIT_ASSERT_EQUAL(ChatWindow::ReceiptRequested, window->receiptChanges_[0].second);
+
+ auto recentChats = manager_->getRecentChats();
+ CPPUNIT_ASSERT_EQUAL(recentChats.size(), size_t(1));
+ CPPUNIT_ASSERT_EQUAL(recentChats[0].jid, originalMessage->getTo().toBare());
+ CPPUNIT_ASSERT_EQUAL(recentChats[0].activity, std::string("Some text my other resource sent."));
}
// incoming carbons message for the received delivery receipt to the other resource
@@ -1280,6 +1317,12 @@ public:
CPPUNIT_ASSERT_EQUAL(size_t(2), window->receiptChanges_.size());
CPPUNIT_ASSERT_EQUAL(ChatWindow::ReceiptReceived, window->receiptChanges_[1].second);
+
+ //Delivery receipt should not change the latest recent entry. Checking for the original message.
+ auto recentChats = manager_->getRecentChats();
+ CPPUNIT_ASSERT_EQUAL(recentChats.size(), size_t(1));
+ CPPUNIT_ASSERT_EQUAL(recentChats[0].jid, messageJID.toBare());
+ CPPUNIT_ASSERT_EQUAL(recentChats[0].activity, std::string("Some text my other resource sent."));
}
}
@@ -1319,6 +1362,11 @@ public:
manager_->handleIncomingMessage(messageWrapper);
CPPUNIT_ASSERT_EQUAL(std::string(), MockChatWindow::bodyFromMessage(window->lastAddedMessage_));
CPPUNIT_ASSERT_EQUAL(false, window->lastAddedMessageSenderIsSelf_);
+
+ auto recentChats = manager_->getRecentChats();
+ CPPUNIT_ASSERT_EQUAL(recentChats.size(), size_t(1));
+ CPPUNIT_ASSERT_EQUAL(recentChats[0].jid, originalMessage->getFrom().toBare());
+ CPPUNIT_ASSERT_EQUAL(recentChats[0].activity, std::string("Some further text."));
}
}
@@ -1537,7 +1585,11 @@ public:
uiEventStream_->send(std::make_shared<CreateImpromptuMUCUIEvent>(jids, mucJID, ""));
CPPUNIT_ASSERT_EQUAL(std::string("bar@test.com, foo@test.com"), manager_->getRecentChats()[0].getTitle());
- auto mucJoinPresence = std::dynamic_pointer_cast<Presence>(stanzaChannel_->sentStanzas[2]);
+ // Check the MUC security marking request
+ auto mucInfoRequest = std::dynamic_pointer_cast<IQ>(stanzaChannel_->sentStanzas[2]);
+ CPPUNIT_ASSERT(mucInfoRequest);
+
+ auto mucJoinPresence = std::dynamic_pointer_cast<Presence>(stanzaChannel_->sentStanzas[3]);
CPPUNIT_ASSERT(mucJoinPresence);
// MUC presence reply
@@ -1598,6 +1650,191 @@ public:
CPPUNIT_ASSERT_EQUAL(std::string("mucroom"), window->name_);
}
+ std::shared_ptr<Storage> createBookmarkStorageWithJID(std::shared_ptr<IQ> bookmarkRequest, const JID& jid, const bool autojoin) {
+ CPPUNIT_ASSERT(bookmarkRequest);
+ CPPUNIT_ASSERT_EQUAL(IQ::Get, bookmarkRequest->getType());
+
+ auto privateStorage = bookmarkRequest->getPayload<PrivateStorage>();
+ CPPUNIT_ASSERT(privateStorage);
+
+ auto storage = std::dynamic_pointer_cast<Storage>(privateStorage->getPayload());
+ CPPUNIT_ASSERT(storage);
+
+ auto roomsStorage = std::make_shared<Storage>();
+ if (jid.isValid()) {
+ auto room = Storage::Room();
+ room.jid = jid;
+ room.autoJoin = autojoin;
+ roomsStorage->addRoom(room);
+ }
+ return roomsStorage;
+ }
+
+ void testReceivingBookmarksWithDomainJID() {
+ auto bookmarkRequest = std::dynamic_pointer_cast<IQ>(stanzaChannel_->sentStanzas[0]);
+ auto response = IQ::createResult(
+ bookmarkRequest->getFrom(),
+ bookmarkRequest->getTo(),
+ bookmarkRequest->getID(),
+ std::make_shared<PrivateStorage>(createBookmarkStorageWithJID(bookmarkRequest, "montague.lit", true))
+ );
+ stanzaChannel_->onIQReceived(response);
+ }
+
+ void testReceivingBookmarksWithBareJID() {
+ auto bookmarkRequest = std::dynamic_pointer_cast<IQ>(stanzaChannel_->sentStanzas[0]);
+ MockChatWindow* window = new MockChatWindow();
+ mocks_->ExpectCall(chatWindowFactory_, ChatWindowFactory::createChatWindow).With(JID("example@montague.lit"), uiEventStream_).Return(window);
+ auto response = IQ::createResult(
+ bookmarkRequest->getFrom(),
+ bookmarkRequest->getTo(),
+ bookmarkRequest->getID(),
+ std::make_shared<PrivateStorage>(createBookmarkStorageWithJID(bookmarkRequest, "example@montague.lit", true))
+ );
+ stanzaChannel_->onIQReceived(response);
+ }
+
+ void testReceivingNoBookmarks() {
+ auto bookmarkRequest = std::dynamic_pointer_cast<IQ>(stanzaChannel_->sentStanzas[0]);
+ auto response = IQ::createResult(
+ bookmarkRequest->getFrom(),
+ bookmarkRequest->getTo(),
+ bookmarkRequest->getID(),
+ std::make_shared<PrivateStorage>()
+ );
+ stanzaChannel_->onIQReceived(response);
+ }
+
+ void testReceivingNullBookmarks() {
+ auto bookmarkRequest = std::dynamic_pointer_cast<IQ>(stanzaChannel_->sentStanzas[0]);
+ auto response = IQ::createResult(
+ bookmarkRequest->getFrom(),
+ bookmarkRequest->getTo(),
+ bookmarkRequest->getID(),
+ nullptr
+ );
+ stanzaChannel_->onIQReceived(response);
+ }
+
+ void testReceivingBookmarksError() {
+ auto bookmarkRequest = std::dynamic_pointer_cast<IQ>(stanzaChannel_->sentStanzas[0]);
+ auto response = IQ::createError(
+ bookmarkRequest->getFrom(),
+ bookmarkRequest->getTo(),
+ bookmarkRequest->getID(),
+ ErrorPayload::Condition::ServiceUnavailable,
+ ErrorPayload::Type::Cancel,
+ nullptr
+ );
+ stanzaChannel_->onIQReceived(response);
+ }
+
+ void testReceivingBookmarksWithFullJID() {
+ auto bookmarkRequest = std::dynamic_pointer_cast<IQ>(stanzaChannel_->sentStanzas[0]);
+ auto response = IQ::createResult(
+ bookmarkRequest->getFrom(),
+ bookmarkRequest->getTo(),
+ bookmarkRequest->getID(),
+ std::make_shared<PrivateStorage>(createBookmarkStorageWithJID(bookmarkRequest, "example@montague.lit/someresource", true))
+ );
+ stanzaChannel_->onIQReceived(response);
+ }
+
+ void testAutoJoinBookmarksAndChattables() {
+
+ auto bookmarkRequest = std::dynamic_pointer_cast<IQ>(stanzaChannel_->sentStanzas[0]);
+ auto roomsStorage = createBookmarkStorageWithJID(bookmarkRequest, "autojoin@bookmark.lit", true);
+ auto room = Storage::Room();
+ room.jid = "noAutojoin@bookmark.lit";
+ roomsStorage->addRoom(room);
+
+ //Only autojoin@bookmark.lit window should open.
+ MockChatWindow* autojoinBookmarkWindow = new MockChatWindow();
+ mocks_->ExpectCall(chatWindowFactory_, ChatWindowFactory::createChatWindow).With(JID("autojoin@bookmark.lit"), uiEventStream_).Return(autojoinBookmarkWindow);
+
+ auto response = IQ::createResult(
+ bookmarkRequest->getFrom(),
+ bookmarkRequest->getTo(),
+ bookmarkRequest->getID(),
+ std::make_shared<PrivateStorage>(roomsStorage)
+ );
+ stanzaChannel_->onIQReceived(response);
+ //Both bookmarks should be added to the chattables.
+ CPPUNIT_ASSERT_EQUAL(size_t(2), chattables_->get().size());
+ auto autoJoinState = chattables_->getState("autojoin@bookmark.lit");
+ CPPUNIT_ASSERT(autoJoinState.type == Chattables::State::Type::Room);
+ CPPUNIT_ASSERT_EQUAL(autoJoinState.status, StatusShow::Online);
+ auto noAutoJoinState = chattables_->getState("noAutojoin@bookmark.lit");
+ CPPUNIT_ASSERT(noAutoJoinState.type == Chattables::State::Type::Room);
+ CPPUNIT_ASSERT_EQUAL(noAutoJoinState.status, StatusShow::None);
+ }
+
+ void testJoinNoAutojoinBookmark() {
+
+ auto bookmarkRequest = std::dynamic_pointer_cast<IQ>(stanzaChannel_->sentStanzas[0]);
+ auto roomsStorage = createBookmarkStorageWithJID(bookmarkRequest, "example@montague.lit", false);
+
+ auto response = IQ::createResult(
+ bookmarkRequest->getFrom(),
+ bookmarkRequest->getTo(),
+ bookmarkRequest->getID(),
+ std::make_shared<PrivateStorage>(roomsStorage)
+ );
+ stanzaChannel_->onIQReceived(response);
+
+ //Join previous bookmarked room, expecting no increase in chattables and change of autojoin in bookmark to true
+ MockChatWindow* newExampleChatWindow = new MockChatWindow();
+ mocks_->ExpectCall(chatWindowFactory_, ChatWindowFactory::createChatWindow).With(JID("example@montague.lit"), uiEventStream_).Return(newExampleChatWindow);
+ uiEventStream_->send(std::make_shared<JoinMUCUIEvent>("example@montague.lit", boost::optional<std::string>(), boost::optional<std::string>()));
+ CPPUNIT_ASSERT_EQUAL(size_t(1), chattables_->get().size());
+ auto state = chattables_->getState("example@montague.lit");
+ CPPUNIT_ASSERT(state.type == Chattables::State::Type::Room);
+ CPPUNIT_ASSERT_EQUAL(state.status, StatusShow::Online);
+
+ auto bookmarks = manager_->getBookmarkManager()->getBookmarks();
+ CPPUNIT_ASSERT_EQUAL(bookmarks.size(), size_t(1));
+ CPPUNIT_ASSERT(bookmarks[0].getRoom() == JID("example@montague.lit"));
+ CPPUNIT_ASSERT(bookmarks[0].getAutojoin());
+ }
+
+ void testJoinAndBookmarkMUC() {
+ auto bookmarkRequest = std::dynamic_pointer_cast<IQ>(stanzaChannel_->sentStanzas[0]);
+ auto roomsStorage = createBookmarkStorageWithJID(bookmarkRequest, "", true);
+ auto response = IQ::createResult(
+ bookmarkRequest->getFrom(),
+ bookmarkRequest->getTo(),
+ bookmarkRequest->getID(),
+ std::make_shared<PrivateStorage>(roomsStorage)
+ );
+ stanzaChannel_->onIQReceived(response);
+
+ //Join non-bookmarked room expecting for the room to get bookmarked with autojoin to true
+ MockChatWindow* exampleChatWindow = new MockChatWindow();
+ mocks_->ExpectCall(chatWindowFactory_, ChatWindowFactory::createChatWindow).With("example@montague.lit", uiEventStream_).Return(exampleChatWindow);
+ uiEventStream_->send(std::make_shared<JoinMUCUIEvent>("example@montague.lit", boost::optional<std::string>(), boost::optional<std::string>()));
+ {
+ CPPUNIT_ASSERT_EQUAL(size_t(1), chattables_->get().size());
+ auto state = chattables_->getState("example@montague.lit");
+ CPPUNIT_ASSERT(state.type == Chattables::State::Type::Room);
+ CPPUNIT_ASSERT_EQUAL(state.status, StatusShow::Online);
+
+ auto bookmarks = manager_->getBookmarkManager()->getBookmarks();
+ CPPUNIT_ASSERT_EQUAL(bookmarks.size(), size_t(1));
+ CPPUNIT_ASSERT(bookmarks[0].getRoom() == JID("example@montague.lit"));
+ CPPUNIT_ASSERT(bookmarks[0].getAutojoin());
+
+ }
+ //Exiting room that is bookmarked, expecting chattable to stay but bookmark autojoin change to false.
+ exampleChatWindow->onClosed();
+ {
+ CPPUNIT_ASSERT_EQUAL(size_t(1), chattables_->get().size());
+ auto bookmarks = manager_->getBookmarkManager()->getBookmarks();
+ CPPUNIT_ASSERT_EQUAL(bookmarks.size(), size_t(1));
+ CPPUNIT_ASSERT(bookmarks[0].getRoom() == JID("example@montague.lit"));
+ CPPUNIT_ASSERT(!bookmarks[0].getAutojoin());
+ }
+ }
+
private:
std::shared_ptr<Message> makeDeliveryReceiptTestMessage(const JID& from, const std::string& id) {
std::shared_ptr<Message> message = std::make_shared<Message>();
@@ -1622,7 +1859,7 @@ private:
private:
JID jid_;
std::unique_ptr<DummyNotifier> notifier_;
- ChatsManager* manager_;
+ ExtendedChatsManager* manager_;
DummyStanzaChannel* stanzaChannel_;
IQRouter* iqRouter_;
EventController* eventController_;
@@ -1660,8 +1897,8 @@ private:
int handledHighlightActions_;
std::set<std::string> soundsPlayed_;
DummyTimerFactory* timerFactory_;
+ std::unique_ptr<Chattables> chattables_;
};
CPPUNIT_TEST_SUITE_REGISTRATION(ChatsManagerTest);
-
diff --git a/Swift/Controllers/Chat/UnitTest/ChattablesTest.cpp b/Swift/Controllers/Chat/UnitTest/ChattablesTest.cpp
new file mode 100644
index 0000000..f30e3fd
--- /dev/null
+++ b/Swift/Controllers/Chat/UnitTest/ChattablesTest.cpp
@@ -0,0 +1,140 @@
+/*
+ * Copyright (c) 2018 Isode Limited.
+ * All rights reserved.
+ * See the COPYING file for more information.
+ */
+
+#include <gtest/gtest.h>
+#include <hippomocks.h>
+
+#include <Swift/Controllers/Chat/Chattables.h>
+
+// Clang wrongly things that tests for 0 are using 0 as null.
+#pragma clang diagnostic ignored "-Wzero-as-null-pointer-constant"
+
+using namespace Swift;
+
+class ChattablesTest : public ::testing::Test {
+ protected:
+ void SetUp() {
+ beginListSize_ = 0;
+ endListSize_ = 0;
+ callsToBegin_ = 0;
+ callsToEnd_ = 0;
+ }
+
+ void TearDown() {
+ }
+
+ void updateBeginListSize(int listSize);
+ void updateEndListSize();
+
+ Chattables chattables_;
+ int beginListSize_;
+ int endListSize_;
+ int callsToBegin_;
+ int callsToEnd_;
+};
+
+void ChattablesTest::updateBeginListSize(int listSize) {
+ beginListSize_ = listSize;
+ callsToBegin_++;
+}
+
+void ChattablesTest::updateEndListSize() {
+ endListSize_ = chattables_.get().size();
+ callsToEnd_++;
+}
+
+TEST_F(ChattablesTest, testAddJID) {
+ chattables_.onBeginAdd.connect([this](int listSize){ updateBeginListSize(listSize); });
+ chattables_.onAdded.connect([this](){ updateEndListSize(); });
+ JID jid("user@swift.jid");
+
+ chattables_.addJID(jid, Chattables::State::Type::Person);
+ ASSERT_EQ(0, beginListSize_);
+ ASSERT_EQ(1, endListSize_);
+ ASSERT_EQ(1, callsToBegin_);
+ ASSERT_EQ(1, callsToEnd_);
+
+ ASSERT_EQ(jid, chattables_.get()[0]);
+ Chattables::State state = chattables_.getState(jid);
+ ASSERT_EQ(jid, state.jid);
+ ASSERT_EQ(Chattables::State::Type::Person, state.type);
+}
+
+TEST_F(ChattablesTest, testAddMultipleJIDs) {
+ chattables_.onBeginAdd.connect([this](int listSize){ updateBeginListSize(listSize); });
+ chattables_.onAdded.connect([this](){ updateEndListSize(); });
+ JID jid0("user0@swift.jid");
+ JID jid1("user1@swift.jid");
+ JID jid2("user2@swift.jid");
+
+ chattables_.addJID(jid0, Chattables::State::Type::Person);
+ ASSERT_EQ(0, beginListSize_);
+ ASSERT_EQ(1, endListSize_);
+ ASSERT_EQ(1, callsToBegin_);
+ ASSERT_EQ(1, callsToEnd_);
+ chattables_.addJID(jid1, Chattables::State::Type::Person);
+ ASSERT_EQ(1, beginListSize_);
+ ASSERT_EQ(2, endListSize_);
+ ASSERT_EQ(2, callsToBegin_);
+ ASSERT_EQ(2, callsToEnd_);
+ chattables_.addJID(jid2, Chattables::State::Type::Person);
+ ASSERT_EQ(2, beginListSize_);
+ ASSERT_EQ(3, endListSize_);
+ ASSERT_EQ(3, callsToBegin_);
+ ASSERT_EQ(3, callsToEnd_);
+}
+
+TEST_F(ChattablesTest, testAddRoomJID) {
+ chattables_.onBeginAdd.connect([this](int listSize){ updateBeginListSize(listSize); });
+ chattables_.onAdded.connect([this](){ updateEndListSize(); });
+ JID jid("room@swift.jid");
+
+ chattables_.addJID(jid, Chattables::State::Type::Room);
+ ASSERT_EQ(0, beginListSize_);
+ ASSERT_EQ(1, endListSize_);
+ ASSERT_EQ(1, callsToBegin_);
+ ASSERT_EQ(1, callsToEnd_);
+
+ ASSERT_EQ(jid, chattables_.get()[0]);
+ Chattables::State state = chattables_.getState(jid);
+ ASSERT_EQ(jid, state.jid);
+ ASSERT_EQ(Chattables::State::Type::Room, state.type);
+}
+
+TEST_F(ChattablesTest, testSetState) {
+ JID jid("user@swift.jid");
+ chattables_.addJID(jid, Chattables::State::Type::Person);
+ ASSERT_EQ(1, chattables_.get().size());
+ ASSERT_EQ(jid, chattables_.get()[0]);
+ ASSERT_EQ(Chattables::State::Type::Person, chattables_.getState(jid).type);
+ ASSERT_EQ(StatusShow::None, chattables_.getState(jid).status);
+
+ JID returnedJID;
+ int returnedIndex;
+ int callsToChanged = 0;
+ chattables_.onChanged.connect([&returnedJID, &returnedIndex, &callsToChanged](const JID& jid, int index){
+ returnedJID = jid;
+ returnedIndex = index;
+ callsToChanged++;
+ });
+
+ Chattables::State newState;
+ newState.jid = jid;
+ newState.type = Chattables::State::Type::Room;
+ newState.status = StatusShow::Online;
+ chattables_.setState(jid, newState);
+
+ auto storedState = chattables_.getState(jid);
+
+ ASSERT_EQ(1, chattables_.get().size());
+ ASSERT_EQ(jid, chattables_.get()[0]);
+ ASSERT_EQ(jid, returnedJID);
+ ASSERT_EQ(0, returnedIndex);
+ ASSERT_EQ(1, callsToChanged);
+ ASSERT_EQ(jid, storedState.jid);
+ ASSERT_EQ(Chattables::State::Type::Room, storedState.type);
+ ASSERT_EQ(StatusShow::Online, storedState.status);
+}
diff --git a/Swift/Controllers/Chat/UnitTest/MUCControllerTest.cpp b/Swift/Controllers/Chat/UnitTest/MUCControllerTest.cpp
index 1f69f4f..5339c7b 100644
--- a/Swift/Controllers/Chat/UnitTest/MUCControllerTest.cpp
+++ b/Swift/Controllers/Chat/UnitTest/MUCControllerTest.cpp
@@ -1,13 +1,14 @@
/*
- * Copyright (c) 2010-2017 Isode Limited.
+ * Copyright (c) 2010-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
#include <boost/algorithm/string.hpp>
-#include <cppunit/extensions/HelperMacros.h>
-#include <cppunit/extensions/TestFactoryRegistry.h>
+#include <memory>
+
+#include <gtest/gtest.h>
#include <hippomocks.h>
#include <Swiften/Avatars/NullAvatarManager.h>
@@ -32,10 +33,12 @@
#include <Swiften/VCards/VCardMemoryStorage.h>
#include <Swift/Controllers/Chat/ChatMessageParser.h>
+#include <Swift/Controllers/Chat/Chattables.h>
#include <Swift/Controllers/Chat/MUCController.h>
#include <Swift/Controllers/Chat/UserSearchController.h>
#include <Swift/Controllers/Roster/GroupRosterItem.h>
#include <Swift/Controllers/Roster/Roster.h>
+#include <Swift/Controllers/SettingConstants.h>
#include <Swift/Controllers/Settings/DummySettingsProvider.h>
#include <Swift/Controllers/UIEvents/UIEventStream.h>
#include <Swift/Controllers/UIInterfaces/ChatWindow.h>
@@ -44,587 +47,918 @@
#include <Swift/Controllers/UnitTest/MockChatWindow.h>
#include <Swift/Controllers/XMPPEvents/EventController.h>
+// Clang wrongly things that tests for 0 are using 0 as null.
+#pragma clang diagnostic ignored "-Wzero-as-null-pointer-constant"
+
using namespace Swift;
-class MUCControllerTest : public CppUnit::TestFixture {
- CPPUNIT_TEST_SUITE(MUCControllerTest);
- CPPUNIT_TEST(testJoinPartStringContructionSimple);
- CPPUNIT_TEST(testJoinPartStringContructionMixed);
- CPPUNIT_TEST(testAppendToJoinParts);
- CPPUNIT_TEST(testAddressedToSelf);
- CPPUNIT_TEST(testNotAddressedToSelf);
- CPPUNIT_TEST(testAddressedToSelfBySelf);
- CPPUNIT_TEST(testMessageWithEmptyLabelItem);
- CPPUNIT_TEST(testMessageWithLabelItem);
- CPPUNIT_TEST(testCorrectMessageWithLabelItem);
- CPPUNIT_TEST(testRoleAffiliationStates);
- CPPUNIT_TEST(testSubjectChangeCorrect);
- CPPUNIT_TEST(testSubjectChangeIncorrectA);
- CPPUNIT_TEST(testSubjectChangeIncorrectB);
- CPPUNIT_TEST(testSubjectChangeIncorrectC);
- CPPUNIT_TEST(testHandleOccupantNicknameChanged);
- CPPUNIT_TEST(testHandleOccupantNicknameChangedRoster);
- CPPUNIT_TEST(testHandleChangeSubjectRequest);
-
- CPPUNIT_TEST(testNonImpromptuMUCWindowTitle);
-
- CPPUNIT_TEST_SUITE_END();
-
-public:
- void setUp() {
- crypto_ = std::shared_ptr<CryptoProvider>(PlatformCryptoProvider::create());
- self_ = JID("girl@wonderland.lit/rabbithole");
- nick_ = "aLiCe";
- mucJID_ = JID("teaparty@rooms.wonderland.lit");
- mocks_ = new MockRepository();
- stanzaChannel_ = new DummyStanzaChannel();
- iqChannel_ = new DummyIQChannel();
- iqRouter_ = new IQRouter(iqChannel_);
- eventController_ = new EventController();
- chatWindowFactory_ = mocks_->InterfaceMock<ChatWindowFactory>();
- userSearchWindowFactory_ = mocks_->InterfaceMock<UserSearchWindowFactory>();
- xmppRoster_ = new XMPPRosterImpl();
- presenceOracle_ = new PresenceOracle(stanzaChannel_, xmppRoster_);
- presenceSender_ = new StanzaChannelPresenceSender(stanzaChannel_);
- directedPresenceSender_ = new DirectedPresenceSender(presenceSender_);
- uiEventStream_ = new UIEventStream();
- avatarManager_ = new NullAvatarManager();
- TimerFactory* timerFactory = nullptr;
- window_ = new MockChatWindow();
- mucRegistry_ = new MUCRegistry();
- entityCapsProvider_ = new DummyEntityCapsProvider();
- settings_ = new DummySettingsProvider();
- highlightManager_ = new HighlightManager(settings_);
- highlightManager_->resetToDefaultConfiguration();
- muc_ = std::make_shared<MockMUC>(mucJID_);
- mocks_->ExpectCall(chatWindowFactory_, ChatWindowFactory::createChatWindow).With(muc_->getJID(), uiEventStream_).Return(window_);
- chatMessageParser_ = std::make_shared<ChatMessageParser>(std::map<std::string, std::string>(), highlightManager_->getConfiguration(), ChatMessageParser::Mode::GroupChat);
- vcardStorage_ = new VCardMemoryStorage(crypto_.get());
- vcardManager_ = new VCardManager(self_, iqRouter_, vcardStorage_);
- nickResolver_ = new NickResolver(self_, xmppRoster_, vcardManager_, mucRegistry_);
- clientBlockListManager_ = new ClientBlockListManager(iqRouter_);
- mucBookmarkManager_ = new MUCBookmarkManager(iqRouter_);
- controller_ = new MUCController (self_, muc_, boost::optional<std::string>(), nick_, stanzaChannel_, iqRouter_, chatWindowFactory_, nickResolver_, presenceOracle_, avatarManager_, uiEventStream_, false, timerFactory, eventController_, entityCapsProvider_, nullptr, nullptr, mucRegistry_, highlightManager_, clientBlockListManager_, chatMessageParser_, false, nullptr, vcardManager_, mucBookmarkManager_);
- }
+class MUCControllerTest : public ::testing::Test {
+
+ protected:
+ void SetUp() {
+ crypto_ = std::shared_ptr<CryptoProvider>(PlatformCryptoProvider::create());
+ self_ = JID("girl@wonderland.lit/rabbithole");
+ nick_ = "aLiCe";
+ mucJID_ = JID("teaparty@rooms.wonderland.lit");
+ mocks_ = new MockRepository();
+ stanzaChannel_ = new DummyStanzaChannel();
+ iqChannel_ = new DummyIQChannel();
+ iqRouter_ = new IQRouter(iqChannel_);
+ eventController_ = new EventController();
+ chatWindowFactory_ = mocks_->InterfaceMock<ChatWindowFactory>();
+ userSearchWindowFactory_ = mocks_->InterfaceMock<UserSearchWindowFactory>();
+ xmppRoster_ = new XMPPRosterImpl();
+ presenceOracle_ = new PresenceOracle(stanzaChannel_, xmppRoster_);
+ presenceSender_ = new StanzaChannelPresenceSender(stanzaChannel_);
+ directedPresenceSender_ = new DirectedPresenceSender(presenceSender_);
+ uiEventStream_ = new UIEventStream();
+ avatarManager_ = new NullAvatarManager();
+ TimerFactory* timerFactory = nullptr;
+ window_ = new MockChatWindow();
+ mucRegistry_ = new MUCRegistry();
+ entityCapsProvider_ = new DummyEntityCapsProvider();
+ settings_ = new DummySettingsProvider();
+ highlightManager_ = new HighlightManager(settings_);
+ highlightManager_->resetToDefaultConfiguration();
+ muc_ = std::make_shared<MockMUC>(mucJID_);
+ mocks_->ExpectCall(chatWindowFactory_, ChatWindowFactory::createChatWindow).With(muc_->getJID(), uiEventStream_).Return(window_);
+ chatMessageParser_ = std::make_shared<ChatMessageParser>(std::map<std::string, std::string>(), highlightManager_->getConfiguration(), ChatMessageParser::Mode::GroupChat);
+ vcardStorage_ = new VCardMemoryStorage(crypto_.get());
+ vcardManager_ = new VCardManager(self_, iqRouter_, vcardStorage_);
+ nickResolver_ = new NickResolver(self_, xmppRoster_, vcardManager_, mucRegistry_);
+ clientBlockListManager_ = new ClientBlockListManager(iqRouter_);
+ mucBookmarkManager_ = new MUCBookmarkManager(iqRouter_);
+ chattables_ = std::make_unique<Chattables>();
+ controller_ = new MUCController (self_, muc_, boost::optional<std::string>(), nick_, stanzaChannel_, iqRouter_, chatWindowFactory_, nickResolver_, presenceOracle_, avatarManager_, uiEventStream_, false, timerFactory, eventController_, entityCapsProvider_, nullptr, nullptr, mucRegistry_, highlightManager_, clientBlockListManager_, chatMessageParser_, false, nullptr, vcardManager_, mucBookmarkManager_, settings_, *chattables_);
+ }
- void tearDown() {
- delete controller_;
- delete mucBookmarkManager_;
- delete clientBlockListManager_;
- delete nickResolver_;
- delete vcardManager_;
- delete vcardStorage_;
- delete highlightManager_;
- delete settings_;
- delete entityCapsProvider_;
- delete eventController_;
- delete presenceOracle_;
- delete xmppRoster_;
- delete mocks_;
- delete uiEventStream_;
- delete stanzaChannel_;
- delete presenceSender_;
- delete directedPresenceSender_;
- delete iqRouter_;
- delete iqChannel_;
- delete mucRegistry_;
- delete avatarManager_;
- }
+ void TearDown() {
+ delete controller_;
+ delete mucBookmarkManager_;
+ delete clientBlockListManager_;
+ delete nickResolver_;
+ delete vcardManager_;
+ delete vcardStorage_;
+ delete highlightManager_;
+ delete settings_;
+ delete entityCapsProvider_;
+ delete eventController_;
+ delete presenceOracle_;
+ delete xmppRoster_;
+ delete mocks_;
+ delete uiEventStream_;
+ delete stanzaChannel_;
+ delete presenceSender_;
+ delete directedPresenceSender_;
+ delete iqRouter_;
+ delete iqChannel_;
+ delete mucRegistry_;
+ delete avatarManager_;
+ }
- void finishJoin() {
- Presence::ref presence(new Presence());
- presence->setFrom(JID(muc_->getJID().toString() + "/" + nick_));
- MUCUserPayload::ref status(new MUCUserPayload());
- MUCUserPayload::StatusCode code;
- code.code = 110;
- status->addStatusCode(code);
- presence->addPayload(status);
- stanzaChannel_->onPresenceReceived(presence);
- }
+ void finishJoin() {
+ Presence::ref presence(new Presence());
+ presence->setFrom(JID(muc_->getJID().toString() + "/" + nick_));
+ MUCUserPayload::ref status(new MUCUserPayload());
+ MUCUserPayload::StatusCode code;
+ code.code = 110;
+ status->addStatusCode(code);
+ presence->addPayload(status);
+ stanzaChannel_->onPresenceReceived(presence);
+ }
- void joinCompleted() {
- std::string messageBody("test message");
- window_->onSendMessageRequest(messageBody, false);
- std::shared_ptr<Stanza> rawStanza = stanzaChannel_->sentStanzas[stanzaChannel_->sentStanzas.size() - 1];
- Message::ref message = std::dynamic_pointer_cast<Message>(rawStanza);
- CPPUNIT_ASSERT(stanzaChannel_->isAvailable()); /* Otherwise will prevent sends. */
- CPPUNIT_ASSERT(message);
- CPPUNIT_ASSERT_EQUAL(messageBody, message->getBody().get_value_or(""));
-
- {
- Message::ref message = std::make_shared<Message>();
- message->setType(Message::Groupchat);
- message->setTo(self_);
- message->setFrom(mucJID_.withResource("SomeNickname"));
- message->setID(iqChannel_->getNewIQID());
- message->setSubject("Initial");
+ void joinCompleted() {
+ std::string messageBody("test message");
+ window_->onSendMessageRequest(messageBody, false);
+ std::shared_ptr<Stanza> rawStanza = stanzaChannel_->sentStanzas[stanzaChannel_->sentStanzas.size() - 1];
+ Message::ref message = std::dynamic_pointer_cast<Message>(rawStanza);
+ ASSERT_TRUE(stanzaChannel_->isAvailable()); /* Otherwise will prevent sends. */
+ ASSERT_TRUE(message);
+ ASSERT_EQ(messageBody, message->getBody().get_value_or(""));
+
+ {
+ Message::ref message = std::make_shared<Message>();
+ message->setType(Message::Groupchat);
+ message->setTo(self_);
+ message->setFrom(mucJID_.withResource("SomeNickname"));
+ message->setID(iqChannel_->getNewIQID());
+ message->setSubject("Initial");
+
+ controller_->handleIncomingMessage(std::make_shared<MessageEvent>(message));
+ }
+ }
- controller_->handleIncomingMessage(std::make_shared<MessageEvent>(message));
+ void checkEqual(const std::vector<NickJoinPart>& expected, const std::vector<NickJoinPart>& actual) {
+ ASSERT_EQ(expected.size(), actual.size());
+ for (size_t i = 0; i < expected.size(); i++) {
+ ASSERT_EQ(expected[i].nick, actual[i].nick);
+ ASSERT_EQ(expected[i].type, actual[i].type);
+ }
+ }
+
+ JID jidFromOccupant(const MUCOccupant& occupant) {
+ return JID(mucJID_.toString()+"/"+occupant.getNick());
}
- }
- void testAddressedToSelf() {
- finishJoin();
- Message::ref message(new Message());
+ void testRoleAffiliationStatesVerify(const std::map<std::string, MUCOccupant> &occupants) {
+ /* verify that the roster is in sync */
+ GroupRosterItem* group = window_->getRosterModel()->getRoot();
+ for (auto rosterItem : group->getChildren()) {
+ GroupRosterItem* child = dynamic_cast<GroupRosterItem*>(rosterItem);
+ ASSERT_TRUE(child);
+ for (auto childItem : child->getChildren()) {
+ ContactRosterItem* item = dynamic_cast<ContactRosterItem*>(childItem);
+ ASSERT_TRUE(item);
+ std::map<std::string, MUCOccupant>::const_iterator occupant = occupants.find(item->getJID().getResource());
+ ASSERT_TRUE(occupant != occupants.end());
+ ASSERT_TRUE(item->getMUCRole() == occupant->second.getRole());
+ ASSERT_TRUE(item->getMUCAffiliation() == occupant->second.getAffiliation());
+ }
+ }
+ }
- message = Message::ref(new Message());
- message->setFrom(JID(muc_->getJID().toString() + "/otherperson"));
- message->setBody("basic " + nick_ + " test.");
- message->setType(Message::Groupchat);
- controller_->handleIncomingMessage(MessageEvent::ref(new MessageEvent(message)));
- CPPUNIT_ASSERT_EQUAL((size_t)1, eventController_->getEvents().size());
+ void setMUCSecurityMarking(const std::string& markingValue, const std::string& markingForegroundColorValue, const std::string& markingBackgroundColorValue, const bool includeFormTypeField = true) {
+ auto form = std::make_shared<Form>(Form::Type::ResultType);
- message = Message::ref(new Message());
- message->setFrom(JID(muc_->getJID().toString() + "/otherperson"));
- message->setBody(nick_ + ": hi there");
- message->setType(Message::Groupchat);
- controller_->handleIncomingMessage(MessageEvent::ref(new MessageEvent(message)));
- CPPUNIT_ASSERT_EQUAL((size_t)2, eventController_->getEvents().size());
+ if (includeFormTypeField) {
+ std::shared_ptr<FormField> formTypeField = std::make_shared<FormField>(FormField::Type::HiddenType, "http://jabber.org/protocol/muc#roominfo");
+ formTypeField->setName("FORM_TYPE");
+ form->addField(formTypeField);
+ }
- message->setFrom(JID(muc_->getJID().toString() + "/other"));
- message->setBody("Hi there " + nick_);
- message->setType(Message::Groupchat);
- controller_->handleIncomingMessage(MessageEvent::ref(new MessageEvent(message)));
- CPPUNIT_ASSERT_EQUAL((size_t)3, eventController_->getEvents().size());
+ auto markingField = std::make_shared<FormField>(FormField::Type::TextSingleType, markingValue);
+ auto markingForegroundColorField = std::make_shared<FormField>(FormField::Type::TextSingleType, markingForegroundColorValue);
+ auto markingBackgroundColorField = std::make_shared<FormField>(FormField::Type::TextSingleType, markingBackgroundColorValue);
- message = Message::ref(new Message());
- message->setFrom(JID(muc_->getJID().toString() + "/other2"));
- message->setBody("Hi " + boost::to_lower_copy(nick_) + ".");
- message->setType(Message::Groupchat);
- controller_->handleIncomingMessage(MessageEvent::ref(new MessageEvent(message)));
+ markingField->setName("x-isode#roominfo_marking");
+ markingForegroundColorField->setName("x-isode#roominfo_marking_fg_color");
+ markingBackgroundColorField->setName("x-isode#roominfo_marking_bg_color");
- // The last message is ignored because self-mention highlights are matched case
- // sensitive against the nickname.
- CPPUNIT_ASSERT_EQUAL((size_t)3, eventController_->getEvents().size());
+ form->addField(markingField);
+ form->addField(markingForegroundColorField);
+ form->addField(markingBackgroundColorField);
- message = Message::ref(new Message());
- message->setFrom(JID(muc_->getJID().toString() + "/other3"));
- message->setBody("Hi bert.");
- message->setType(Message::Groupchat);
- controller_->handleIncomingMessage(MessageEvent::ref(new MessageEvent(message)));
- CPPUNIT_ASSERT_EQUAL((size_t)3, eventController_->getEvents().size());
+ auto discoInfoRef = std::make_shared<DiscoInfo>();
+ discoInfoRef->addExtension(form);
- message = Message::ref(new Message());
- message->setFrom(JID(muc_->getJID().toString() + "/other2"));
- message->setBody("Hi " + boost::to_lower_copy(nick_) + "ie.");
- message->setType(Message::Groupchat);
- controller_->handleIncomingMessage(MessageEvent::ref(new MessageEvent(message)));
- CPPUNIT_ASSERT_EQUAL((size_t)3, eventController_->getEvents().size());
+ auto infoResponse = IQ::createResult(self_, mucJID_, "test-id", discoInfoRef);
+ iqChannel_->onIQReceived(infoResponse);
+ }
+
+ Message::ref createTestMessageWithoutSecurityLabel() {
+ auto message = std::make_shared<Message>();
+ message->setType(Message::Type::Groupchat);
+ message->setID("test-id");
+ message->setTo(self_);
+ message->setFrom(mucJID_.withResource("TestNickname"));
+ message->setBody("Do Not Read This Message");
+ return message;
+ }
+
+ JID self_;
+ JID mucJID_;
+ MockMUC::ref muc_;
+ std::string nick_;
+ DummyStanzaChannel* stanzaChannel_;
+ DummyIQChannel* iqChannel_;
+ IQRouter* iqRouter_;
+ EventController* eventController_;
+ ChatWindowFactory* chatWindowFactory_;
+ UserSearchWindowFactory* userSearchWindowFactory_;
+ MUCController* controller_;
+ NickResolver* nickResolver_;
+ PresenceOracle* presenceOracle_;
+ AvatarManager* avatarManager_;
+ StanzaChannelPresenceSender* presenceSender_;
+ DirectedPresenceSender* directedPresenceSender_;
+ MockRepository* mocks_;
+ UIEventStream* uiEventStream_;
+ MockChatWindow* window_;
+ MUCRegistry* mucRegistry_;
+ DummyEntityCapsProvider* entityCapsProvider_;
+ DummySettingsProvider* settings_;
+ HighlightManager* highlightManager_;
+ std::shared_ptr<ChatMessageParser> chatMessageParser_;
+ std::shared_ptr<CryptoProvider> crypto_;
+ VCardManager* vcardManager_;
+ VCardMemoryStorage* vcardStorage_;
+ ClientBlockListManager* clientBlockListManager_;
+ MUCBookmarkManager* mucBookmarkManager_;
+ XMPPRoster* xmppRoster_;
+ std::unique_ptr<Chattables> chattables_;
+};
+
+TEST_F(MUCControllerTest, testAddressedToSelf) {
+ finishJoin();
+ Message::ref message(new Message());
+
+ message = Message::ref(new Message());
+ message->setFrom(JID(muc_->getJID().toString() + "/otherperson"));
+ message->setBody("basic " + nick_ + " test.");
+ message->setType(Message::Groupchat);
+ controller_->handleIncomingMessage(MessageEvent::ref(new MessageEvent(message)));
+ ASSERT_EQ(1, eventController_->getEvents().size());
+
+ message = Message::ref(new Message());
+ message->setFrom(JID(muc_->getJID().toString() + "/otherperson"));
+ message->setBody(nick_ + ": hi there");
+ message->setType(Message::Groupchat);
+ controller_->handleIncomingMessage(MessageEvent::ref(new MessageEvent(message)));
+ ASSERT_EQ(2, eventController_->getEvents().size());
+
+ message->setFrom(JID(muc_->getJID().toString() + "/other"));
+ message->setBody("Hi there " + nick_);
+ message->setType(Message::Groupchat);
+ controller_->handleIncomingMessage(MessageEvent::ref(new MessageEvent(message)));
+ ASSERT_EQ(3, eventController_->getEvents().size());
+
+ message = Message::ref(new Message());
+ message->setFrom(JID(muc_->getJID().toString() + "/other2"));
+ message->setBody("Hi " + boost::to_lower_copy(nick_) + ".");
+ message->setType(Message::Groupchat);
+ controller_->handleIncomingMessage(MessageEvent::ref(new MessageEvent(message)));
+
+ // The last message is ignored because self-mention highlights are matched case
+ // sensitive against the nickname.
+ ASSERT_EQ(3, eventController_->getEvents().size());
+
+ message = Message::ref(new Message());
+ message->setFrom(JID(muc_->getJID().toString() + "/other3"));
+ message->setBody("Hi bert.");
+ message->setType(Message::Groupchat);
+ controller_->handleIncomingMessage(MessageEvent::ref(new MessageEvent(message)));
+ ASSERT_EQ(3, eventController_->getEvents().size());
+
+ message = Message::ref(new Message());
+ message->setFrom(JID(muc_->getJID().toString() + "/other2"));
+ message->setBody("Hi " + boost::to_lower_copy(nick_) + "ie.");
+ message->setType(Message::Groupchat);
+ controller_->handleIncomingMessage(MessageEvent::ref(new MessageEvent(message)));
+ ASSERT_EQ(3, eventController_->getEvents().size());
+}
+
+TEST_F(MUCControllerTest, testNotAddressedToSelf) {
+ finishJoin();
+ Message::ref message(new Message());
+ message->setFrom(JID(muc_->getJID().toString() + "/other3"));
+ message->setBody("Hi there Hatter");
+ message->setType(Message::Groupchat);
+ controller_->handleIncomingMessage(MessageEvent::ref(new MessageEvent(message)));
+ ASSERT_EQ(0, eventController_->getEvents().size());
+}
+
+TEST_F(MUCControllerTest, testAddressedToSelfBySelf) {
+ finishJoin();
+ Message::ref message(new Message());
+ message->setFrom(JID(muc_->getJID().toString() + "/" + nick_));
+ message->setBody("Hi there " + nick_);
+ message->setType(Message::Groupchat);
+ controller_->handleIncomingMessage(MessageEvent::ref(new MessageEvent(message)));
+ ASSERT_EQ(0, eventController_->getEvents().size());
+}
+
+TEST_F(MUCControllerTest, testMessageWithEmptyLabelItem) {
+ SecurityLabelsCatalog::Item label;
+ label.setSelector("Bob");
+ window_->label_ = label;
+ std::shared_ptr<DiscoInfo> features = std::make_shared<DiscoInfo>();
+ features->addFeature(DiscoInfo::SecurityLabelsCatalogFeature);
+ controller_->setAvailableServerFeatures(features);
+ IQ::ref iq = iqChannel_->iqs_[iqChannel_->iqs_.size() - 1];
+ SecurityLabelsCatalog::ref labelPayload = std::make_shared<SecurityLabelsCatalog>();
+ labelPayload->addItem(label);
+ IQ::ref result = IQ::createResult(self_, iq->getID(), labelPayload);
+ iqChannel_->onIQReceived(result);
+ std::string messageBody("agamemnon");
+ window_->onSendMessageRequest(messageBody, false);
+ std::shared_ptr<Stanza> rawStanza = stanzaChannel_->sentStanzas[stanzaChannel_->sentStanzas.size() - 1];
+ Message::ref message = std::dynamic_pointer_cast<Message>(rawStanza);
+ ASSERT_EQ(iq->getTo(), result->getFrom());
+ ASSERT_TRUE(window_->labelsEnabled_);
+ ASSERT_TRUE(stanzaChannel_->isAvailable()); /* Otherwise will prevent sends. */
+ ASSERT_TRUE(message);
+ ASSERT_EQ(messageBody, message->getBody().get());
+ ASSERT_FALSE(message->getPayload<SecurityLabel>());
+}
+
+TEST_F(MUCControllerTest, testMessageWithLabelItem) {
+ std::shared_ptr<SecurityLabel> label = std::make_shared<SecurityLabel>();
+ label->setLabel("a");
+ SecurityLabelsCatalog::Item labelItem;
+ labelItem.setSelector("Bob");
+ labelItem.setLabel(label);
+ window_->label_ = labelItem;
+ std::shared_ptr<DiscoInfo> features = std::make_shared<DiscoInfo>();
+ features->addFeature(DiscoInfo::SecurityLabelsCatalogFeature);
+ controller_->setAvailableServerFeatures(features);
+ IQ::ref iq = iqChannel_->iqs_[iqChannel_->iqs_.size() - 1];
+ SecurityLabelsCatalog::ref labelPayload = std::make_shared<SecurityLabelsCatalog>();
+ labelPayload->addItem(labelItem);
+ IQ::ref result = IQ::createResult(self_, iq->getID(), labelPayload);
+ iqChannel_->onIQReceived(result);
+ std::string messageBody("agamemnon");
+ window_->onSendMessageRequest(messageBody, false);
+ std::shared_ptr<Stanza> rawStanza = stanzaChannel_->sentStanzas[stanzaChannel_->sentStanzas.size() - 1];
+ Message::ref message = std::dynamic_pointer_cast<Message>(rawStanza);
+ ASSERT_EQ(iq->getTo(), result->getFrom());
+ ASSERT_TRUE(window_->labelsEnabled_);
+ ASSERT_TRUE(stanzaChannel_->isAvailable()); /* Otherwise will prevent sends. */
+ ASSERT_TRUE(message);
+ ASSERT_EQ(messageBody, message->getBody().get());
+ ASSERT_EQ(label, message->getPayload<SecurityLabel>());
+}
+
+TEST_F(MUCControllerTest, testCorrectMessageWithLabelItem) {
+ std::shared_ptr<SecurityLabel> label = std::make_shared<SecurityLabel>();
+ label->setLabel("a");
+ SecurityLabelsCatalog::Item labelItem;
+ labelItem.setSelector("Bob");
+ labelItem.setLabel(label);
+ std::shared_ptr<SecurityLabel> label2 = std::make_shared<SecurityLabel>();
+ label->setLabel("b");
+ SecurityLabelsCatalog::Item labelItem2;
+ labelItem2.setSelector("Charlie");
+ labelItem2.setLabel(label2);
+ window_->label_ = labelItem;
+ std::shared_ptr<DiscoInfo> features = std::make_shared<DiscoInfo>();
+ features->addFeature(DiscoInfo::SecurityLabelsCatalogFeature);
+ controller_->setAvailableServerFeatures(features);
+ IQ::ref iq = iqChannel_->iqs_[iqChannel_->iqs_.size() - 1];
+ SecurityLabelsCatalog::ref labelPayload = std::make_shared<SecurityLabelsCatalog>();
+ labelPayload->addItem(labelItem);
+ IQ::ref result = IQ::createResult(self_, iq->getID(), labelPayload);
+ iqChannel_->onIQReceived(result);
+ std::string messageBody("agamemnon");
+ window_->onSendMessageRequest(messageBody, false);
+ std::shared_ptr<Stanza> rawStanza = stanzaChannel_->sentStanzas[stanzaChannel_->sentStanzas.size() - 1];
+ Message::ref message = std::dynamic_pointer_cast<Message>(rawStanza);
+ ASSERT_EQ(iq->getTo(), result->getFrom());
+ ASSERT_TRUE(window_->labelsEnabled_);
+ ASSERT_TRUE(stanzaChannel_->isAvailable()); /* Otherwise will prevent sends. */
+ ASSERT_TRUE(message);
+ ASSERT_EQ(messageBody, message->getBody().get());
+ ASSERT_EQ(label, message->getPayload<SecurityLabel>());
+ window_->label_ = labelItem2;
+ window_->onSendMessageRequest(messageBody, true);
+ rawStanza = stanzaChannel_->sentStanzas[stanzaChannel_->sentStanzas.size() - 1];
+ message = std::dynamic_pointer_cast<Message>(rawStanza);
+ ASSERT_EQ(messageBody, message->getBody().get());
+ ASSERT_EQ(label, message->getPayload<SecurityLabel>());
+}
+
+TEST_F(MUCControllerTest, testAppendToJoinParts) {
+ std::vector<NickJoinPart> list;
+ std::vector<NickJoinPart> gold;
+ MUCController::appendToJoinParts(list, NickJoinPart("Kev", Join));
+ gold.push_back(NickJoinPart("Kev", Join));
+ checkEqual(gold, list);
+ MUCController::appendToJoinParts(list, NickJoinPart("Remko", Join));
+ gold.push_back(NickJoinPart("Remko", Join));
+ checkEqual(gold, list);
+ MUCController::appendToJoinParts(list, NickJoinPart("Bert", Join));
+ gold.push_back(NickJoinPart("Bert", Join));
+ checkEqual(gold, list);
+ MUCController::appendToJoinParts(list, NickJoinPart("Bert", Part));
+ gold[2].type = JoinThenPart;
+ checkEqual(gold, list);
+ MUCController::appendToJoinParts(list, NickJoinPart("Kev", Part));
+ gold[0].type = JoinThenPart;
+ checkEqual(gold, list);
+ MUCController::appendToJoinParts(list, NickJoinPart("Remko", Part));
+ gold[1].type = JoinThenPart;
+ checkEqual(gold, list);
+ MUCController::appendToJoinParts(list, NickJoinPart("Ernie", Part));
+ gold.push_back(NickJoinPart("Ernie", Part));
+ checkEqual(gold, list);
+ MUCController::appendToJoinParts(list, NickJoinPart("Ernie", Join));
+ gold[3].type = PartThenJoin;
+ checkEqual(gold, list);
+ MUCController::appendToJoinParts(list, NickJoinPart("Kev", Join));
+ gold[0].type = Join;
+ checkEqual(gold, list);
+ MUCController::appendToJoinParts(list, NickJoinPart("Ernie", Part));
+ gold[3].type = Part;
+ checkEqual(gold, list);
+
+}
+
+TEST_F(MUCControllerTest, testJoinPartStringContructionSimple) {
+ std::vector<NickJoinPart> list;
+ list.push_back(NickJoinPart("Kev", Join));
+ ASSERT_EQ(std::string("Kev has entered the room"), MUCController::generateJoinPartString(list, false));
+ list.push_back(NickJoinPart("Remko", Part));
+ ASSERT_EQ(std::string("Kev has entered the room and Remko has left the room"), MUCController::generateJoinPartString(list, false));
+ list.push_back(NickJoinPart("Bert", Join));
+ ASSERT_EQ(std::string("Kev and Bert have entered the room and Remko has left the room"), MUCController::generateJoinPartString(list, false));
+ list.push_back(NickJoinPart("Ernie", Join));
+ ASSERT_EQ(std::string("Kev, Bert and Ernie have entered the room and Remko has left the room"), MUCController::generateJoinPartString(list, false));
+}
+
+TEST_F(MUCControllerTest, testJoinPartStringContructionMixed) {
+ std::vector<NickJoinPart> list;
+ list.push_back(NickJoinPart("Kev", JoinThenPart));
+ ASSERT_EQ(std::string("Kev has entered then left the room"), MUCController::generateJoinPartString(list, false));
+ list.push_back(NickJoinPart("Remko", Part));
+ ASSERT_EQ(std::string("Remko has left the room and Kev has entered then left the room"), MUCController::generateJoinPartString(list, false));
+ list.push_back(NickJoinPart("Bert", PartThenJoin));
+ ASSERT_EQ(std::string("Remko has left the room, Kev has entered then left the room and Bert has left then returned to the room"), MUCController::generateJoinPartString(list, false));
+ list.push_back(NickJoinPart("Ernie", JoinThenPart));
+ ASSERT_EQ(std::string("Remko has left the room, Kev and Ernie have entered then left the room and Bert has left then returned to the room"), MUCController::generateJoinPartString(list, false));
+}
+
+TEST_F(MUCControllerTest, testRoleAffiliationStates) {
+
+ typedef std::map<std::string, MUCOccupant> occupant_map;
+ occupant_map occupants;
+ occupants.insert(occupant_map::value_type("Kev", MUCOccupant("Kev", MUCOccupant::Participant, MUCOccupant::Owner)));
+ occupants.insert(occupant_map::value_type("Remko", MUCOccupant("Remko", MUCOccupant::Participant, MUCOccupant::Owner)));
+ occupants.insert(occupant_map::value_type("Bert", MUCOccupant("Bert", MUCOccupant::Participant, MUCOccupant::Owner)));
+ occupants.insert(occupant_map::value_type("Ernie", MUCOccupant("Ernie", MUCOccupant::Participant, MUCOccupant::Owner)));
+
+ /* populate the MUC with fake users */
+ for (auto&& occupant : occupants) {
+ muc_->insertOccupant(occupant.second);
}
- void testNotAddressedToSelf() {
- finishJoin();
- Message::ref message(new Message());
- message->setFrom(JID(muc_->getJID().toString() + "/other3"));
- message->setBody("Hi there Hatter");
- message->setType(Message::Groupchat);
- controller_->handleIncomingMessage(MessageEvent::ref(new MessageEvent(message)));
- CPPUNIT_ASSERT_EQUAL((size_t)0, eventController_->getEvents().size());
+ std::vector<MUCOccupant> alterations;
+ alterations.push_back(MUCOccupant("Kev", MUCOccupant::Visitor, MUCOccupant::Admin));
+ alterations.push_back(MUCOccupant("Remko", MUCOccupant::Moderator, MUCOccupant::Member));
+ alterations.push_back(MUCOccupant("Bert", MUCOccupant::Visitor, MUCOccupant::Outcast));
+ alterations.push_back(MUCOccupant("Ernie", MUCOccupant::NoRole, MUCOccupant::Member));
+ alterations.push_back(MUCOccupant("Bert", MUCOccupant::Moderator, MUCOccupant::Owner));
+ alterations.push_back(MUCOccupant("Kev", MUCOccupant::Participant, MUCOccupant::Outcast));
+ alterations.push_back(MUCOccupant("Bert", MUCOccupant::Visitor, MUCOccupant::NoAffiliation));
+ alterations.push_back(MUCOccupant("Remko", MUCOccupant::NoRole, MUCOccupant::NoAffiliation));
+ alterations.push_back(MUCOccupant("Ernie", MUCOccupant::Visitor, MUCOccupant::Outcast));
+
+ for (const auto& alteration : alterations) {
+ /* perform an alteration to a user's role and affiliation */
+ occupant_map::iterator occupant = occupants.find(alteration.getNick());
+ ASSERT_TRUE(occupant != occupants.end());
+ const JID jid = jidFromOccupant(occupant->second);
+ /* change the affiliation, leave the role in place */
+ muc_->changeAffiliation(jid, alteration.getAffiliation());
+ occupant->second = MUCOccupant(occupant->first, occupant->second.getRole(), alteration.getAffiliation());
+ testRoleAffiliationStatesVerify(occupants);
+ /* change the role, leave the affiliation in place */
+ muc_->changeOccupantRole(jid, alteration.getRole());
+ occupant->second = MUCOccupant(occupant->first, alteration.getRole(), occupant->second.getAffiliation());
+ testRoleAffiliationStatesVerify(occupants);
}
+}
+
+TEST_F(MUCControllerTest, testSubjectChangeCorrect) {
+ joinCompleted();
- void testAddressedToSelfBySelf() {
- finishJoin();
- Message::ref message(new Message());
- message->setFrom(JID(muc_->getJID().toString() + "/" + nick_));
- message->setBody("Hi there " + nick_);
+ {
+ Message::ref message = std::make_shared<Message>();
message->setType(Message::Groupchat);
- controller_->handleIncomingMessage(MessageEvent::ref(new MessageEvent(message)));
- CPPUNIT_ASSERT_EQUAL((size_t)0, eventController_->getEvents().size());
- }
+ message->setTo(self_);
+ message->setFrom(mucJID_.withResource("SomeNickname"));
+ message->setID("3FB99C56-7C92-4755-91B0-9C0098BC7AE0");
+ message->setSubject("New Room Subject");
- void testMessageWithEmptyLabelItem() {
- SecurityLabelsCatalog::Item label;
- label.setSelector("Bob");
- window_->label_ = label;
- std::shared_ptr<DiscoInfo> features = std::make_shared<DiscoInfo>();
- features->addFeature(DiscoInfo::SecurityLabelsCatalogFeature);
- controller_->setAvailableServerFeatures(features);
- IQ::ref iq = iqChannel_->iqs_[iqChannel_->iqs_.size() - 1];
- SecurityLabelsCatalog::ref labelPayload = std::make_shared<SecurityLabelsCatalog>();
- labelPayload->addItem(label);
- IQ::ref result = IQ::createResult(self_, iq->getID(), labelPayload);
- iqChannel_->onIQReceived(result);
- std::string messageBody("agamemnon");
- window_->onSendMessageRequest(messageBody, false);
- std::shared_ptr<Stanza> rawStanza = stanzaChannel_->sentStanzas[stanzaChannel_->sentStanzas.size() - 1];
- Message::ref message = std::dynamic_pointer_cast<Message>(rawStanza);
- CPPUNIT_ASSERT_EQUAL(iq->getTo(), result->getFrom());
- CPPUNIT_ASSERT(window_->labelsEnabled_);
- CPPUNIT_ASSERT(stanzaChannel_->isAvailable()); /* Otherwise will prevent sends. */
- CPPUNIT_ASSERT(message);
- CPPUNIT_ASSERT_EQUAL(messageBody, message->getBody().get());
- CPPUNIT_ASSERT(!message->getPayload<SecurityLabel>());
+ controller_->handleIncomingMessage(std::make_shared<MessageEvent>(message));
+ ASSERT_EQ(std::string("The room subject is now: New Room Subject"), std::dynamic_pointer_cast<ChatWindow::ChatTextMessagePart>(window_->lastAddedSystemMessage_.getParts()[0])->text);
}
+}
- void testMessageWithLabelItem() {
- std::shared_ptr<SecurityLabel> label = std::make_shared<SecurityLabel>();
- label->setLabel("a");
- SecurityLabelsCatalog::Item labelItem;
- labelItem.setSelector("Bob");
- labelItem.setLabel(label);
- window_->label_ = labelItem;
- std::shared_ptr<DiscoInfo> features = std::make_shared<DiscoInfo>();
- features->addFeature(DiscoInfo::SecurityLabelsCatalogFeature);
- controller_->setAvailableServerFeatures(features);
- IQ::ref iq = iqChannel_->iqs_[iqChannel_->iqs_.size() - 1];
- SecurityLabelsCatalog::ref labelPayload = std::make_shared<SecurityLabelsCatalog>();
- labelPayload->addItem(labelItem);
- IQ::ref result = IQ::createResult(self_, iq->getID(), labelPayload);
- iqChannel_->onIQReceived(result);
- std::string messageBody("agamemnon");
- window_->onSendMessageRequest(messageBody, false);
- std::shared_ptr<Stanza> rawStanza = stanzaChannel_->sentStanzas[stanzaChannel_->sentStanzas.size() - 1];
- Message::ref message = std::dynamic_pointer_cast<Message>(rawStanza);
- CPPUNIT_ASSERT_EQUAL(iq->getTo(), result->getFrom());
- CPPUNIT_ASSERT(window_->labelsEnabled_);
- CPPUNIT_ASSERT(stanzaChannel_->isAvailable()); /* Otherwise will prevent sends. */
- CPPUNIT_ASSERT(message);
- CPPUNIT_ASSERT_EQUAL(messageBody, message->getBody().get());
- CPPUNIT_ASSERT_EQUAL(label, message->getPayload<SecurityLabel>());
- }
+/*
+ * Test that message stanzas with subject element and non-empty body element do not cause a subject change.
+ */
+TEST_F(MUCControllerTest, testSubjectChangeIncorrectA) {
+ joinCompleted();
- void testCorrectMessageWithLabelItem() {
- std::shared_ptr<SecurityLabel> label = std::make_shared<SecurityLabel>();
- label->setLabel("a");
- SecurityLabelsCatalog::Item labelItem;
- labelItem.setSelector("Bob");
- labelItem.setLabel(label);
- std::shared_ptr<SecurityLabel> label2 = std::make_shared<SecurityLabel>();
- label->setLabel("b");
- SecurityLabelsCatalog::Item labelItem2;
- labelItem2.setSelector("Charlie");
- labelItem2.setLabel(label2);
- window_->label_ = labelItem;
- std::shared_ptr<DiscoInfo> features = std::make_shared<DiscoInfo>();
- features->addFeature(DiscoInfo::SecurityLabelsCatalogFeature);
- controller_->setAvailableServerFeatures(features);
- IQ::ref iq = iqChannel_->iqs_[iqChannel_->iqs_.size() - 1];
- SecurityLabelsCatalog::ref labelPayload = std::make_shared<SecurityLabelsCatalog>();
- labelPayload->addItem(labelItem);
- IQ::ref result = IQ::createResult(self_, iq->getID(), labelPayload);
- iqChannel_->onIQReceived(result);
- std::string messageBody("agamemnon");
- window_->onSendMessageRequest(messageBody, false);
- std::shared_ptr<Stanza> rawStanza = stanzaChannel_->sentStanzas[stanzaChannel_->sentStanzas.size() - 1];
- Message::ref message = std::dynamic_pointer_cast<Message>(rawStanza);
- CPPUNIT_ASSERT_EQUAL(iq->getTo(), result->getFrom());
- CPPUNIT_ASSERT(window_->labelsEnabled_);
- CPPUNIT_ASSERT(stanzaChannel_->isAvailable()); /* Otherwise will prevent sends. */
- CPPUNIT_ASSERT(message);
- CPPUNIT_ASSERT_EQUAL(messageBody, message->getBody().get());
- CPPUNIT_ASSERT_EQUAL(label, message->getPayload<SecurityLabel>());
- window_->label_ = labelItem2;
- window_->onSendMessageRequest(messageBody, true);
- rawStanza = stanzaChannel_->sentStanzas[stanzaChannel_->sentStanzas.size() - 1];
- message = std::dynamic_pointer_cast<Message>(rawStanza);
- CPPUNIT_ASSERT_EQUAL(messageBody, message->getBody().get());
- CPPUNIT_ASSERT_EQUAL(label, message->getPayload<SecurityLabel>());
+ {
+ Message::ref message = std::make_shared<Message>();
+ message->setType(Message::Groupchat);
+ message->setTo(self_);
+ message->setFrom(mucJID_.withResource("SomeNickname"));
+ message->setID(iqChannel_->getNewIQID());
+ message->setSubject("New Room Subject");
+ message->setBody("Some body text that prevents this stanza from being a subject change.");
+
+ controller_->handleIncomingMessage(std::make_shared<MessageEvent>(message));
+ ASSERT_EQ(std::string("Trying to enter room teaparty@rooms.wonderland.lit"), std::dynamic_pointer_cast<ChatWindow::ChatTextMessagePart>(window_->lastAddedSystemMessage_.getParts()[0])->text);
}
+}
- void checkEqual(const std::vector<NickJoinPart>& expected, const std::vector<NickJoinPart>& actual) {
- CPPUNIT_ASSERT_EQUAL(expected.size(), actual.size());
- for (size_t i = 0; i < expected.size(); i++) {
- CPPUNIT_ASSERT_EQUAL(expected[i].nick, actual[i].nick);
- CPPUNIT_ASSERT_EQUAL(expected[i].type, actual[i].type);
- }
+/*
+ * Test that message stanzas with subject element and thread element do not cause a subject change.
+ */
+TEST_F(MUCControllerTest, testSubjectChangeIncorrectB) {
+ joinCompleted();
+
+ {
+ Message::ref message = std::make_shared<Message>();
+ message->setType(Message::Groupchat);
+ message->setTo(self_);
+ message->setFrom(mucJID_.withResource("SomeNickname"));
+ message->setID(iqChannel_->getNewIQID());
+ message->setSubject("New Room Subject");
+ message->addPayload(std::make_shared<Thread>("Thread that prevents the subject change."));
+
+ controller_->handleIncomingMessage(std::make_shared<MessageEvent>(message));
+ ASSERT_EQ(std::string("Trying to enter room teaparty@rooms.wonderland.lit"), std::dynamic_pointer_cast<ChatWindow::ChatTextMessagePart>(window_->lastAddedSystemMessage_.getParts()[0])->text);
}
+}
- void testAppendToJoinParts() {
- std::vector<NickJoinPart> list;
- std::vector<NickJoinPart> gold;
- MUCController::appendToJoinParts(list, NickJoinPart("Kev", Join));
- gold.push_back(NickJoinPart("Kev", Join));
- checkEqual(gold, list);
- MUCController::appendToJoinParts(list, NickJoinPart("Remko", Join));
- gold.push_back(NickJoinPart("Remko", Join));
- checkEqual(gold, list);
- MUCController::appendToJoinParts(list, NickJoinPart("Bert", Join));
- gold.push_back(NickJoinPart("Bert", Join));
- checkEqual(gold, list);
- MUCController::appendToJoinParts(list, NickJoinPart("Bert", Part));
- gold[2].type = JoinThenPart;
- checkEqual(gold, list);
- MUCController::appendToJoinParts(list, NickJoinPart("Kev", Part));
- gold[0].type = JoinThenPart;
- checkEqual(gold, list);
- MUCController::appendToJoinParts(list, NickJoinPart("Remko", Part));
- gold[1].type = JoinThenPart;
- checkEqual(gold, list);
- MUCController::appendToJoinParts(list, NickJoinPart("Ernie", Part));
- gold.push_back(NickJoinPart("Ernie", Part));
- checkEqual(gold, list);
- MUCController::appendToJoinParts(list, NickJoinPart("Ernie", Join));
- gold[3].type = PartThenJoin;
- checkEqual(gold, list);
- MUCController::appendToJoinParts(list, NickJoinPart("Kev", Join));
- gold[0].type = Join;
- checkEqual(gold, list);
- MUCController::appendToJoinParts(list, NickJoinPart("Ernie", Part));
- gold[3].type = Part;
- checkEqual(gold, list);
+/*
+ * Test that message stanzas with subject element and empty body element do not cause a subject change.
+ */
+TEST_F(MUCControllerTest, testSubjectChangeIncorrectC) {
+ joinCompleted();
+ {
+ Message::ref message = std::make_shared<Message>();
+ message->setType(Message::Groupchat);
+ message->setTo(self_);
+ message->setFrom(mucJID_.withResource("SomeNickname"));
+ message->setID(iqChannel_->getNewIQID());
+ message->setSubject("New Room Subject");
+ message->setBody("");
+
+ controller_->handleIncomingMessage(std::make_shared<MessageEvent>(message));
+ ASSERT_EQ(std::string("Trying to enter room teaparty@rooms.wonderland.lit"), std::dynamic_pointer_cast<ChatWindow::ChatTextMessagePart>(window_->lastAddedSystemMessage_.getParts()[0])->text);
}
+}
+
+TEST_F(MUCControllerTest, testHandleOccupantNicknameChanged) {
+ const auto occupantCount = [&](const std::string & nick) {
+ auto roster = window_->getRosterModel();
+ const auto currentOccupantsJIDs = roster->getJIDs();
+ int count = 0;
+ for (auto & p : currentOccupantsJIDs) {
+ if (p.getResource() == nick) {
+ ++count;
+ }
+ }
+ return count;
+ };
+
+ muc_->insertOccupant(MUCOccupant("TestUserOne", MUCOccupant::Participant, MUCOccupant::Owner));
+ muc_->insertOccupant(MUCOccupant("TestUserTwo", MUCOccupant::Participant, MUCOccupant::Owner));
+ muc_->insertOccupant(MUCOccupant("TestUserThree", MUCOccupant::Participant, MUCOccupant::Owner));
+
+ muc_->onOccupantNicknameChanged("TestUserOne", "TestUserTwo");
+
+ ASSERT_EQ(0, occupantCount("TestUserOne"));
+ ASSERT_EQ(1, occupantCount("TestUserTwo"));
+ ASSERT_EQ(1, occupantCount("TestUserThree"));
+}
+
+TEST_F(MUCControllerTest, testHandleOccupantNicknameChangedRoster) {
+ const auto occupantCount = [&](const std::string & nick) {
+ auto roster = window_->getRosterModel();
+ const auto participants = roster->getGroup("Participants");
+ const auto displayedParticipants = participants->getDisplayedChildren();
+ int count = 0;
+ for (auto & p : displayedParticipants) {
+ if (p->getDisplayName() == nick) {
+ ++count;
+ }
+ }
+ return count;
+ };
+
+ muc_->insertOccupant(MUCOccupant("TestUserOne", MUCOccupant::Participant, MUCOccupant::Owner));
+ muc_->insertOccupant(MUCOccupant("TestUserTwo", MUCOccupant::Participant, MUCOccupant::Owner));
+ muc_->insertOccupant(MUCOccupant("TestUserThree", MUCOccupant::Participant, MUCOccupant::Owner));
+ ASSERT_EQ(1, occupantCount("TestUserOne"));
+ ASSERT_EQ(1, occupantCount("TestUserTwo"));
+ ASSERT_EQ(1, occupantCount("TestUserThree"));
+
+ muc_->onOccupantNicknameChanged("TestUserOne", "TestUserTwo");
+
+ ASSERT_EQ(0, occupantCount("TestUserOne"));
+ ASSERT_EQ(1, occupantCount("TestUserTwo"));
+ ASSERT_EQ(1, occupantCount("TestUserThree"));
+}
+
+TEST_F(MUCControllerTest, testHandleChangeSubjectRequest) {
+ std::string testStr("New Subject");
+ ASSERT_EQ(std::string(""), muc_->newSubjectSet_);
+ window_->onChangeSubjectRequest(testStr);
+ ASSERT_EQ(testStr, muc_->newSubjectSet_);
+}
+
+TEST_F(MUCControllerTest, testNonImpromptuMUCWindowTitle) {
+ ASSERT_EQ(muc_->getJID().getNode(), window_->name_);
+}
+
+TEST_F(MUCControllerTest, testSecurityMarkingRequestCompleteMarking) {
+ setMUCSecurityMarking("Test|Highest Possible Security", "Black", "Red", true);
+
+ ASSERT_EQ(std::string("Test|Highest Possible Security"), window_->markingValue_);
+ ASSERT_EQ(std::string("Black"), window_->markingForegroundColorValue_);
+ ASSERT_EQ(std::string("Red"), window_->markingBackgroundColorValue_);
+}
+
+TEST_F(MUCControllerTest, testSecurityMarkingRequestCompleteMarkingWithExtraForm) {
+ auto formTypeField = std::make_shared<FormField>(FormField::Type::HiddenType, "http://jabber.org/protocol/muc#roominfo");
+ auto markingField = std::make_shared<FormField>(FormField::Type::TextSingleType, "Test|Highest Possible Security");
+ auto markingForegroundColorField = std::make_shared<FormField>(FormField::Type::TextSingleType, "Black");
+ auto markingBackgroundColorField = std::make_shared<FormField>(FormField::Type::TextSingleType, "Red");
+ formTypeField->setName("FORM_TYPE");
+ markingField->setName("x-isode#roominfo_marking");
+ markingForegroundColorField->setName("x-isode#roominfo_marking_fg_color");
+ markingBackgroundColorField->setName("x-isode#roominfo_marking_bg_color");
+
+ auto extraForm = std::make_shared<Form>(Form::Type::ResultType);
+ auto form = std::make_shared<Form>(Form::Type::ResultType);
+ form->addField(formTypeField);
+ form->addField(markingField);
+ form->addField(markingForegroundColorField);
+ form->addField(markingBackgroundColorField);
+
+ auto discoInfoRef = std::make_shared<DiscoInfo>();
+ discoInfoRef->addExtension(extraForm);
+ discoInfoRef->addExtension(form);
+
+ auto infoResponse = IQ::createResult(self_, mucJID_, "test-id", discoInfoRef);
+ iqChannel_->onIQReceived(infoResponse);
+ ASSERT_EQ(std::string("Test|Highest Possible Security"), window_->markingValue_);
+ ASSERT_EQ(std::string("Black"), window_->markingForegroundColorValue_);
+ ASSERT_EQ(std::string("Red"), window_->markingBackgroundColorValue_);
+}
+
+TEST_F(MUCControllerTest, testSecurityMarkingRequestNoColorsInMarking) {
+ auto formTypeField = std::make_shared<FormField>(FormField::Type::HiddenType, "http://jabber.org/protocol/muc#roominfo");
+ auto markingField = std::make_shared<FormField>(FormField::Type::TextSingleType, "Test|Highest Possible Security");
+ auto markingForegroundColorField = std::make_shared<FormField>(FormField::Type::TextSingleType, "");
+ auto markingBackgroundColorField = std::make_shared<FormField>(FormField::Type::TextSingleType, "");
+ formTypeField->setName("FORM_TYPE");
+ markingField->setName("x-isode#roominfo_marking");
+ markingForegroundColorField->setName("x-isode#roominfo_marking_fg_color");
+ markingBackgroundColorField->setName("x-isode#roominfo_marking_bg_color");
+
+ auto form = std::make_shared<Form>(Form::Type::ResultType);
+ form->addField(formTypeField);
+ form->addField(markingField);
+ form->addField(markingForegroundColorField);
+ form->addField(markingBackgroundColorField);
+
+ auto discoInfoRef = std::make_shared<DiscoInfo>();
+ discoInfoRef->addExtension(form);
+
+ auto infoResponse = IQ::createResult(self_, mucJID_, "test-id", discoInfoRef);
+ iqChannel_->onIQReceived(infoResponse);
+ ASSERT_EQ(std::string("Test|Highest Possible Security"), window_->markingValue_);
+ ASSERT_EQ(std::string("Black"), window_->markingForegroundColorValue_);
+ ASSERT_EQ(std::string("White"), window_->markingBackgroundColorValue_);
+}
+
+TEST_F(MUCControllerTest, testSecurityMarkingRequestEmptyMarking) {
+ setMUCSecurityMarking("", "", "", true);
+
+ ASSERT_EQ(std::string(""), window_->markingValue_);
+ ASSERT_EQ(std::string(""), window_->markingForegroundColorValue_);
+ ASSERT_EQ(std::string(""), window_->markingBackgroundColorValue_);
+}
+
+TEST_F(MUCControllerTest, testSecurityMarkingRequestWithMarkingNoFormType) {
+ setMUCSecurityMarking("Test|Highest Possible Security", "Black", "Red", false);
+
+ ASSERT_EQ(std::string(""), window_->markingValue_);
+ ASSERT_EQ(std::string(""), window_->markingForegroundColorValue_);
+ ASSERT_EQ(std::string(""), window_->markingBackgroundColorValue_);
+}
+
+TEST_F(MUCControllerTest, testSecurityMarkingRequestNoMarking) {
+ auto form = std::make_shared<Form>(Form::Type::ResultType);
+
+ auto discoInfoRef = std::make_shared<DiscoInfo>();
+ discoInfoRef->addExtension(form);
+
+ auto infoResponse = IQ::createResult(self_, mucJID_, "test-id", discoInfoRef);
+ iqChannel_->onIQReceived(infoResponse);
+ ASSERT_EQ(std::string(""), window_->markingValue_);
+ ASSERT_EQ(std::string(""), window_->markingForegroundColorValue_);
+ ASSERT_EQ(std::string(""), window_->markingBackgroundColorValue_);
+}
+
+TEST_F(MUCControllerTest, testSecurityMarkingRequestNoForm) {
+ auto discoInfoRef = std::make_shared<DiscoInfo>();
+
+ auto infoResponse = IQ::createResult( self_, mucJID_, "test-id", discoInfoRef);
+ iqChannel_->onIQReceived(infoResponse);
+ ASSERT_EQ(std::string(""), window_->markingValue_);
+ ASSERT_EQ(std::string(""), window_->markingForegroundColorValue_);
+ ASSERT_EQ(std::string(""), window_->markingBackgroundColorValue_);
+}
+
+TEST_F(MUCControllerTest, testSecurityMarkingRequestError) {
+ auto errorPayload = std::make_shared<ErrorPayload>(ErrorPayload::Condition::NotAuthorized, ErrorPayload::Type::Auth);
+
+ auto infoResponse = IQ::createResult( self_, mucJID_, "test-id", errorPayload);
+ iqChannel_->onIQReceived(infoResponse);
+ ASSERT_EQ(std::string(""), window_->markingValue_);
+ ASSERT_EQ(std::string(""), window_->markingForegroundColorValue_);
+ ASSERT_EQ(std::string(""), window_->markingBackgroundColorValue_);
+}
- void testJoinPartStringContructionSimple() {
- std::vector<NickJoinPart> list;
- list.push_back(NickJoinPart("Kev", Join));
- CPPUNIT_ASSERT_EQUAL(std::string("Kev has entered the room"), MUCController::generateJoinPartString(list, false));
- list.push_back(NickJoinPart("Remko", Part));
- CPPUNIT_ASSERT_EQUAL(std::string("Kev has entered the room and Remko has left the room"), MUCController::generateJoinPartString(list, false));
- list.push_back(NickJoinPart("Bert", Join));
- CPPUNIT_ASSERT_EQUAL(std::string("Kev and Bert have entered the room and Remko has left the room"), MUCController::generateJoinPartString(list, false));
- list.push_back(NickJoinPart("Ernie", Join));
- CPPUNIT_ASSERT_EQUAL(std::string("Kev, Bert and Ernie have entered the room and Remko has left the room"), MUCController::generateJoinPartString(list, false));
- }
+TEST_F(MUCControllerTest, testSecurityMarkingAddedToMessage_Elision_NoRoomMarkingA) {
+ settings_->storeSetting(SettingConstants::MUC_MARKING_ELISION, true);
+ setMUCSecurityMarking("", "Black", "Red");
- void testJoinPartStringContructionMixed() {
- std::vector<NickJoinPart> list;
- list.push_back(NickJoinPart("Kev", JoinThenPart));
- CPPUNIT_ASSERT_EQUAL(std::string("Kev has entered then left the room"), MUCController::generateJoinPartString(list, false));
- list.push_back(NickJoinPart("Remko", Part));
- CPPUNIT_ASSERT_EQUAL(std::string("Remko has left the room and Kev has entered then left the room"), MUCController::generateJoinPartString(list, false));
- list.push_back(NickJoinPart("Bert", PartThenJoin));
- CPPUNIT_ASSERT_EQUAL(std::string("Remko has left the room, Kev has entered then left the room and Bert has left then returned to the room"), MUCController::generateJoinPartString(list, false));
- list.push_back(NickJoinPart("Ernie", JoinThenPart));
- CPPUNIT_ASSERT_EQUAL(std::string("Remko has left the room, Kev and Ernie have entered then left the room and Bert has left then returned to the room"), MUCController::generateJoinPartString(list, false));
- }
+ auto messageLabel = std::make_shared<SecurityLabel>();
+ messageLabel->setDisplayMarking("Test|Highest Possible Security");
- JID jidFromOccupant(const MUCOccupant& occupant) {
- return JID(mucJID_.toString()+"/"+occupant.getNick());
- }
+ auto sentMessage = createTestMessageWithoutSecurityLabel();
+ sentMessage->addPayload(messageLabel);
- void testRoleAffiliationStates() {
+ auto sentMessageEvent = std::make_shared<MessageEvent>(sentMessage);
+ controller_->handleIncomingMessage(sentMessageEvent);
- typedef std::map<std::string, MUCOccupant> occupant_map;
- occupant_map occupants;
- occupants.insert(occupant_map::value_type("Kev", MUCOccupant("Kev", MUCOccupant::Participant, MUCOccupant::Owner)));
- occupants.insert(occupant_map::value_type("Remko", MUCOccupant("Remko", MUCOccupant::Participant, MUCOccupant::Owner)));
- occupants.insert(occupant_map::value_type("Bert", MUCOccupant("Bert", MUCOccupant::Participant, MUCOccupant::Owner)));
- occupants.insert(occupant_map::value_type("Ernie", MUCOccupant("Ernie", MUCOccupant::Participant, MUCOccupant::Owner)));
+ auto storedSecurityLabel = window_->lastAddedMessageSecurityLabel_;
- /* populate the MUC with fake users */
- for (auto&& occupant : occupants) {
- muc_->insertOccupant(occupant.second);
- }
+ ASSERT_EQ(false, storedSecurityLabel == nullptr);
+ // This is the potentially altered security label that is displayed on the screen
+ ASSERT_EQ(std::string("Test|Highest Possible Security"), storedSecurityLabel->getDisplayMarking());
+}
- std::vector<MUCOccupant> alterations;
- alterations.push_back(MUCOccupant("Kev", MUCOccupant::Visitor, MUCOccupant::Admin));
- alterations.push_back(MUCOccupant("Remko", MUCOccupant::Moderator, MUCOccupant::Member));
- alterations.push_back(MUCOccupant("Bert", MUCOccupant::Visitor, MUCOccupant::Outcast));
- alterations.push_back(MUCOccupant("Ernie", MUCOccupant::NoRole, MUCOccupant::Member));
- alterations.push_back(MUCOccupant("Bert", MUCOccupant::Moderator, MUCOccupant::Owner));
- alterations.push_back(MUCOccupant("Kev", MUCOccupant::Participant, MUCOccupant::Outcast));
- alterations.push_back(MUCOccupant("Bert", MUCOccupant::Visitor, MUCOccupant::NoAffiliation));
- alterations.push_back(MUCOccupant("Remko", MUCOccupant::NoRole, MUCOccupant::NoAffiliation));
- alterations.push_back(MUCOccupant("Ernie", MUCOccupant::Visitor, MUCOccupant::Outcast));
-
- for (const auto& alteration : alterations) {
- /* perform an alteration to a user's role and affiliation */
- occupant_map::iterator occupant = occupants.find(alteration.getNick());
- CPPUNIT_ASSERT(occupant != occupants.end());
- const JID jid = jidFromOccupant(occupant->second);
- /* change the affiliation, leave the role in place */
- muc_->changeAffiliation(jid, alteration.getAffiliation());
- occupant->second = MUCOccupant(occupant->first, occupant->second.getRole(), alteration.getAffiliation());
- testRoleAffiliationStatesVerify(occupants);
- /* change the role, leave the affiliation in place */
- muc_->changeOccupantRole(jid, alteration.getRole());
- occupant->second = MUCOccupant(occupant->first, alteration.getRole(), occupant->second.getAffiliation());
- testRoleAffiliationStatesVerify(occupants);
- }
- }
+TEST_F(MUCControllerTest, testSecurityMarkingAddedToMessage_Elision_NoRoomMarkingB) {
+ settings_->storeSetting(SettingConstants::MUC_MARKING_ELISION, true);
+ setMUCSecurityMarking("", "Black", "Red");
- void testSubjectChangeCorrect() {
- joinCompleted();
+ auto messageLabel = std::make_shared<SecurityLabel>();
+ messageLabel->setDisplayMarking("");
- {
- Message::ref message = std::make_shared<Message>();
- message->setType(Message::Groupchat);
- message->setTo(self_);
- message->setFrom(mucJID_.withResource("SomeNickname"));
- message->setID("3FB99C56-7C92-4755-91B0-9C0098BC7AE0");
- message->setSubject("New Room Subject");
+ auto sentMessage = createTestMessageWithoutSecurityLabel();
+ sentMessage->addPayload(messageLabel);
- controller_->handleIncomingMessage(std::make_shared<MessageEvent>(message));
- CPPUNIT_ASSERT_EQUAL(std::string("The room subject is now: New Room Subject"), std::dynamic_pointer_cast<ChatWindow::ChatTextMessagePart>(window_->lastAddedSystemMessage_.getParts()[0])->text);
- }
- }
+ auto sentMessageEvent = std::make_shared<MessageEvent>(sentMessage);
+ controller_->handleIncomingMessage(sentMessageEvent);
- /*
- * Test that message stanzas with subject element and non-empty body element do not cause a subject change.
- */
- void testSubjectChangeIncorrectA() {
- joinCompleted();
+ auto storedSecurityLabel = window_->lastAddedMessageSecurityLabel_;
- {
- Message::ref message = std::make_shared<Message>();
- message->setType(Message::Groupchat);
- message->setTo(self_);
- message->setFrom(mucJID_.withResource("SomeNickname"));
- message->setID(iqChannel_->getNewIQID());
- message->setSubject("New Room Subject");
- message->setBody("Some body text that prevents this stanza from being a subject change.");
+ ASSERT_EQ(false, storedSecurityLabel == nullptr);
+ // This is the potentially altered security label that is displayed on the screen
+ ASSERT_EQ(std::string(""), storedSecurityLabel->getDisplayMarking());
+}
- controller_->handleIncomingMessage(std::make_shared<MessageEvent>(message));
- CPPUNIT_ASSERT_EQUAL(std::string("Trying to enter room teaparty@rooms.wonderland.lit"), std::dynamic_pointer_cast<ChatWindow::ChatTextMessagePart>(window_->lastAddedSystemMessage_.getParts()[0])->text);
- }
- }
+TEST_F(MUCControllerTest, testSecurityMarkingAddedToMessage_Elision_WithRoomMarkingA) {
+ settings_->storeSetting(SettingConstants::MUC_MARKING_ELISION, true);
+ setMUCSecurityMarking("Test|Highest Possible Security", "Black", "Red");
- /*
- * Test that message stanzas with subject element and thread element do not cause a subject change.
- */
- void testSubjectChangeIncorrectB() {
- joinCompleted();
+ auto messageLabel = std::make_shared<SecurityLabel>();
+ messageLabel->setDisplayMarking("Test|Highest Possible Security");
- {
- Message::ref message = std::make_shared<Message>();
- message->setType(Message::Groupchat);
- message->setTo(self_);
- message->setFrom(mucJID_.withResource("SomeNickname"));
- message->setID(iqChannel_->getNewIQID());
- message->setSubject("New Room Subject");
- message->addPayload(std::make_shared<Thread>("Thread that prevents the subject change."));
+ auto sentMessage = createTestMessageWithoutSecurityLabel();
+ sentMessage->addPayload(messageLabel);
- controller_->handleIncomingMessage(std::make_shared<MessageEvent>(message));
- CPPUNIT_ASSERT_EQUAL(std::string("Trying to enter room teaparty@rooms.wonderland.lit"), std::dynamic_pointer_cast<ChatWindow::ChatTextMessagePart>(window_->lastAddedSystemMessage_.getParts()[0])->text);
- }
- }
+ // Test the first message matching MUC marking. This message SHOULD have a marking
- /*
- * Test that message stanzas with subject element and empty body element do not cause a subject change.
- */
- void testSubjectChangeIncorrectC() {
- joinCompleted();
+ auto sentMessageEvent1 = std::make_shared<MessageEvent>(sentMessage);
+ controller_->handleIncomingMessage(sentMessageEvent1);
- {
- Message::ref message = std::make_shared<Message>();
- message->setType(Message::Groupchat);
- message->setTo(self_);
- message->setFrom(mucJID_.withResource("SomeNickname"));
- message->setID(iqChannel_->getNewIQID());
- message->setSubject("New Room Subject");
- message->setBody("");
+ auto storedSecurityLabel1 = window_->lastAddedMessageSecurityLabel_;
- controller_->handleIncomingMessage(std::make_shared<MessageEvent>(message));
- CPPUNIT_ASSERT_EQUAL(std::string("Trying to enter room teaparty@rooms.wonderland.lit"), std::dynamic_pointer_cast<ChatWindow::ChatTextMessagePart>(window_->lastAddedSystemMessage_.getParts()[0])->text);
- }
- }
+ ASSERT_EQ(false, storedSecurityLabel1 == nullptr);
+ // This is the potentially altered security label that is displayed on the screen
+ ASSERT_EQ(std::string("Test|Highest Possible Security"), storedSecurityLabel1->getDisplayMarking());
- void testHandleOccupantNicknameChanged() {
- const auto occupantCount = [&](const std::string & nick) {
- auto roster = window_->getRosterModel();
- CPPUNIT_ASSERT(roster != nullptr);
- const auto currentOccupantsJIDs = roster->getJIDs();
- int count = 0;
- for (auto & p : currentOccupantsJIDs) {
- if (p.getResource() == nick) {
- ++count;
- }
- }
- return count;
- };
+ // Test a consecutive message matching MUC marking. This message SHOULD NOT have a marking
- muc_->insertOccupant(MUCOccupant("TestUserOne", MUCOccupant::Participant, MUCOccupant::Owner));
- muc_->insertOccupant(MUCOccupant("TestUserTwo", MUCOccupant::Participant, MUCOccupant::Owner));
- muc_->insertOccupant(MUCOccupant("TestUserThree", MUCOccupant::Participant, MUCOccupant::Owner));
+ auto sentMessageEvent2 = std::make_shared<MessageEvent>(sentMessage);
+ controller_->handleIncomingMessage(sentMessageEvent2);
- muc_->onOccupantNicknameChanged("TestUserOne", "TestUserTwo");
+ auto storedSecurityLabel2 = window_->lastAddedMessageSecurityLabel_;
- CPPUNIT_ASSERT_EQUAL(0, occupantCount("TestUserOne"));
- CPPUNIT_ASSERT_EQUAL(1, occupantCount("TestUserTwo"));
- CPPUNIT_ASSERT_EQUAL(1, occupantCount("TestUserThree"));
- }
+ ASSERT_EQ(false, storedSecurityLabel2 == nullptr);
+ // This is the potentially altered security label that is displayed on the screen
+ ASSERT_EQ(std::string(""), storedSecurityLabel2->getDisplayMarking());
+}
- void testHandleOccupantNicknameChangedRoster() {
- const auto occupantCount = [&](const std::string & nick) {
- auto roster = window_->getRosterModel();
- CPPUNIT_ASSERT(roster != nullptr);
- const auto participants = roster->getGroup("Participants");
- CPPUNIT_ASSERT(participants != nullptr);
- const auto displayedParticipants = participants->getDisplayedChildren();
- int count = 0;
- for (auto & p : displayedParticipants) {
- if (p->getDisplayName() == nick) {
- ++count;
- }
- }
- return count;
- };
+TEST_F(MUCControllerTest, testSecurityMarkingAddedToMessage_Elision_WithRoomMarkingB) {
+ settings_->storeSetting(SettingConstants::MUC_MARKING_ELISION, true);
+ setMUCSecurityMarking("Test|Lower Security Marking", "Black", "Red");
- muc_->insertOccupant(MUCOccupant("TestUserOne", MUCOccupant::Participant, MUCOccupant::Owner));
- muc_->insertOccupant(MUCOccupant("TestUserTwo", MUCOccupant::Participant, MUCOccupant::Owner));
- muc_->insertOccupant(MUCOccupant("TestUserThree", MUCOccupant::Participant, MUCOccupant::Owner));
- CPPUNIT_ASSERT_EQUAL(1, occupantCount("TestUserOne"));
- CPPUNIT_ASSERT_EQUAL(1, occupantCount("TestUserTwo"));
- CPPUNIT_ASSERT_EQUAL(1, occupantCount("TestUserThree"));
+ auto messageLabel = std::make_shared<SecurityLabel>();
+ messageLabel->setDisplayMarking("Test|Highest Possible Security");
- muc_->onOccupantNicknameChanged("TestUserOne", "TestUserTwo");
+ auto sentMessage = createTestMessageWithoutSecurityLabel();
+ sentMessage->addPayload(messageLabel);
- CPPUNIT_ASSERT_EQUAL(0, occupantCount("TestUserOne"));
- CPPUNIT_ASSERT_EQUAL(1, occupantCount("TestUserTwo"));
- CPPUNIT_ASSERT_EQUAL(1, occupantCount("TestUserThree"));
- }
+ auto sentMessageEvent = std::make_shared<MessageEvent>(sentMessage);
+ controller_->handleIncomingMessage(sentMessageEvent);
- void testRoleAffiliationStatesVerify(const std::map<std::string, MUCOccupant> &occupants) {
- /* verify that the roster is in sync */
- GroupRosterItem* group = window_->getRosterModel()->getRoot();
- for (auto rosterItem : group->getChildren()) {
- GroupRosterItem* child = dynamic_cast<GroupRosterItem*>(rosterItem);
- CPPUNIT_ASSERT(child);
- for (auto childItem : child->getChildren()) {
- ContactRosterItem* item = dynamic_cast<ContactRosterItem*>(childItem);
- CPPUNIT_ASSERT(item);
- std::map<std::string, MUCOccupant>::const_iterator occupant = occupants.find(item->getJID().getResource());
- CPPUNIT_ASSERT(occupant != occupants.end());
- CPPUNIT_ASSERT(item->getMUCRole() == occupant->second.getRole());
- CPPUNIT_ASSERT(item->getMUCAffiliation() == occupant->second.getAffiliation());
- }
- }
- }
+ auto storedSecurityLabel = window_->lastAddedMessageSecurityLabel_;
- void testHandleChangeSubjectRequest() {
- std::string testStr("New Subject");
- CPPUNIT_ASSERT_EQUAL(std::string(""), muc_->newSubjectSet_);
- window_->onChangeSubjectRequest(testStr);
- CPPUNIT_ASSERT_EQUAL(testStr, muc_->newSubjectSet_);
- }
+ ASSERT_EQ(false, storedSecurityLabel == nullptr);
+ // This is the potentially altered security label that is displayed on the screen
+ ASSERT_EQ(std::string("Test|Highest Possible Security"), storedSecurityLabel->getDisplayMarking());
+}
- void testNonImpromptuMUCWindowTitle() {
- CPPUNIT_ASSERT_EQUAL(muc_->getJID().getNode(), window_->name_);
- }
+TEST_F(MUCControllerTest, testSecurityMarkingAddedToMessage_Elision_WithRoomMarkingC) {
+ settings_->storeSetting(SettingConstants::MUC_MARKING_ELISION, true);
+ setMUCSecurityMarking("Test|Highest Possible Security", "Black", "Red");
-private:
- JID self_;
- JID mucJID_;
- MockMUC::ref muc_;
- std::string nick_;
- DummyStanzaChannel* stanzaChannel_;
- DummyIQChannel* iqChannel_;
- IQRouter* iqRouter_;
- EventController* eventController_;
- ChatWindowFactory* chatWindowFactory_;
- UserSearchWindowFactory* userSearchWindowFactory_;
- MUCController* controller_;
- NickResolver* nickResolver_;
- PresenceOracle* presenceOracle_;
- AvatarManager* avatarManager_;
- StanzaChannelPresenceSender* presenceSender_;
- DirectedPresenceSender* directedPresenceSender_;
- MockRepository* mocks_;
- UIEventStream* uiEventStream_;
- MockChatWindow* window_;
- MUCRegistry* mucRegistry_;
- DummyEntityCapsProvider* entityCapsProvider_;
- DummySettingsProvider* settings_;
- HighlightManager* highlightManager_;
- std::shared_ptr<ChatMessageParser> chatMessageParser_;
- std::shared_ptr<CryptoProvider> crypto_;
- VCardManager* vcardManager_;
- VCardMemoryStorage* vcardStorage_;
- ClientBlockListManager* clientBlockListManager_;
- MUCBookmarkManager* mucBookmarkManager_;
- XMPPRoster* xmppRoster_;
-};
+ auto messageLabel = std::make_shared<SecurityLabel>();
+ messageLabel->setDisplayMarking("");
+
+ auto sentMessage = createTestMessageWithoutSecurityLabel();
+ sentMessage->addPayload(messageLabel);
+
+ auto sentMessageEvent = std::make_shared<MessageEvent>(sentMessage);
+ controller_->handleIncomingMessage(sentMessageEvent);
+
+ auto storedSecurityLabel = window_->lastAddedMessageSecurityLabel_;
+
+ ASSERT_EQ(false, storedSecurityLabel == nullptr);
+ // This is the potentially altered security label that is displayed on the screen
+ ASSERT_EQ(std::string("Unmarked"), storedSecurityLabel->getDisplayMarking());
+}
+
+TEST_F(MUCControllerTest, testSecurityMarkingAddedToMessage_NoElision_NoRoomMarkingA) {
+ settings_->storeSetting(SettingConstants::MUC_MARKING_ELISION, false);
+ setMUCSecurityMarking("", "Black", "Red");
+
+ auto messageLabel = std::make_shared<SecurityLabel>();
+ messageLabel->setDisplayMarking("Test|Highest Possible Security");
+
+ auto sentMessage = createTestMessageWithoutSecurityLabel();
+ sentMessage->addPayload(messageLabel);
+
+ auto sentMessageEvent = std::make_shared<MessageEvent>(sentMessage);
+ controller_->handleIncomingMessage(sentMessageEvent);
+
+ auto storedSecurityLabel = window_->lastAddedMessageSecurityLabel_;
+
+ ASSERT_EQ(false, storedSecurityLabel == nullptr);
+ // This is the potentially altered security label that is displayed on the screen
+ ASSERT_EQ(std::string("Test|Highest Possible Security"), storedSecurityLabel->getDisplayMarking());
+}
+
+TEST_F(MUCControllerTest, testSecurityMarkingAddedToMessage_NoElision_NoRoomMarkingB) {
+ settings_->storeSetting(SettingConstants::MUC_MARKING_ELISION, false);
+ setMUCSecurityMarking("", "Black", "Red");
+
+ auto messageLabel = std::make_shared<SecurityLabel>();
+ messageLabel->setDisplayMarking("");
+
+ auto sentMessage = createTestMessageWithoutSecurityLabel();
+ sentMessage->addPayload(messageLabel);
+
+ auto sentMessageEvent = std::make_shared<MessageEvent>(sentMessage);
+ controller_->handleIncomingMessage(sentMessageEvent);
+
+ auto storedSecurityLabel = window_->lastAddedMessageSecurityLabel_;
+
+ ASSERT_EQ(false, storedSecurityLabel == nullptr);
+ // This is the potentially altered security label that is displayed on the screen
+ ASSERT_EQ(std::string(""), storedSecurityLabel->getDisplayMarking());
+}
+
+TEST_F(MUCControllerTest, testSecurityMarkingAddedToMessage_NoElision_WithRoomMarkingA) {
+ settings_->storeSetting(SettingConstants::MUC_MARKING_ELISION, false);
+ setMUCSecurityMarking("Test|Highest Possible Security", "Black", "Red");
+
+ auto messageLabel = std::make_shared<SecurityLabel>();
+ messageLabel->setDisplayMarking("Test|Highest Possible Security");
+
+ auto sentMessage = createTestMessageWithoutSecurityLabel();
+ sentMessage->addPayload(messageLabel);
+
+ // Test the first message matching MUC marking. This message SHOULD have a marking
+
+ auto sentMessageEvent1 = std::make_shared<MessageEvent>(sentMessage);
+ controller_->handleIncomingMessage(sentMessageEvent1);
+
+ auto storedSecurityLabel1 = window_->lastAddedMessageSecurityLabel_;
+
+ ASSERT_EQ(false, storedSecurityLabel1 == nullptr);
+ // This is the potentially altered security label that is displayed on the screen
+ ASSERT_EQ(std::string("Test|Highest Possible Security"), storedSecurityLabel1->getDisplayMarking());
+
+ // Test a consecutive message matching MUC marking. This message SHOULD ALSO have a marking
+
+ auto sentMessageEvent2 = std::make_shared<MessageEvent>(sentMessage);
+ controller_->handleIncomingMessage(sentMessageEvent2);
+
+ auto storedSecurityLabel2 = window_->lastAddedMessageSecurityLabel_;
+
+ ASSERT_EQ(false, storedSecurityLabel2 == nullptr);
+ // This is the potentially altered security label that is displayed on the screen
+ ASSERT_EQ(std::string("Test|Highest Possible Security"), storedSecurityLabel2->getDisplayMarking());
+}
+
+TEST_F(MUCControllerTest, testSecurityMarkingAddedToMessage_NoElision_WithRoomMarkingB) {
+ settings_->storeSetting(SettingConstants::MUC_MARKING_ELISION, false);
+ setMUCSecurityMarking("", "Black", "Red");
+
+ auto messageLabel = std::make_shared<SecurityLabel>();
+ messageLabel->setDisplayMarking("");
+
+ auto sentMessage = createTestMessageWithoutSecurityLabel();
+ sentMessage->addPayload(messageLabel);
+
+ auto sentMessageEvent = std::make_shared<MessageEvent>(sentMessage);
+ controller_->handleIncomingMessage(sentMessageEvent);
-CPPUNIT_TEST_SUITE_REGISTRATION(MUCControllerTest);
+ auto storedSecurityLabel = window_->lastAddedMessageSecurityLabel_;
+ ASSERT_EQ(false, storedSecurityLabel == nullptr);
+ // This is the potentially altered security label that is displayed on the screen
+ ASSERT_EQ(std::string(""), storedSecurityLabel->getDisplayMarking());
+}
diff --git a/Swift/Controllers/Chat/UnitTest/MockChatListWindow.h b/Swift/Controllers/Chat/UnitTest/MockChatListWindow.h
index 395b050..1d980d3 100644
--- a/Swift/Controllers/Chat/UnitTest/MockChatListWindow.h
+++ b/Swift/Controllers/Chat/UnitTest/MockChatListWindow.h
@@ -20,7 +20,7 @@ namespace Swift {
void removeWhiteboardSession(const JID& /*jid*/) {}
void setBookmarksEnabled(bool /*enabled*/) {}
void setRecents(const std::list<ChatListWindow::Chat>& /*recents*/) {}
- void setUnreadCount(int /*unread*/) {}
+ void setUnreadCount(size_t /*unread*/) {}
void clearBookmarks() {}
void setOnline(bool /*isOnline*/) {}
};
diff --git a/Swift/Controllers/ContactSuggester.cpp b/Swift/Controllers/ContactSuggester.cpp
index eb27ed4..4b621db 100644
--- a/Swift/Controllers/ContactSuggester.cpp
+++ b/Swift/Controllers/ContactSuggester.cpp
@@ -5,7 +5,7 @@
*/
/*
- * Copyright (c) 2014-2016 Isode Limited.
+ * Copyright (c) 2014-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -19,16 +19,12 @@
#include <boost/algorithm/string.hpp>
#include <boost/algorithm/string/find.hpp>
#include <boost/bind.hpp>
-#include <boost/lambda/bind.hpp>
-#include <boost/lambda/lambda.hpp>
#include <Swiften/Base/Algorithm.h>
#include <Swiften/JID/JID.h>
#include <Swift/Controllers/ContactProvider.h>
-namespace lambda = boost::lambda;
-
namespace Swift {
ContactSuggester::ContactSuggester() {
@@ -60,8 +56,9 @@ std::vector<Contact::ref> ContactSuggester::getSuggestions(const std::string& se
std::sort(results.begin(), results.end(), Contact::lexicographicalSortPredicate);
results.erase(std::unique(results.begin(), results.end(), Contact::equalityPredicate), results.end());
- results.erase(std::remove_if(results.begin(), results.end(), !lambda::bind(&matchContact, search, lambda::_1)),
- results.end());
+ results.erase(std::remove_if(results.begin(), results.end(), [&](const Contact::ref contact) {
+ return !matchContact(search, contact);
+ }), results.end());
std::sort(results.begin(), results.end(), boost::bind(&Contact::sortPredicate, _1, _2, search));
return results;
diff --git a/Swift/Controllers/FdpFormSubmitController.cpp b/Swift/Controllers/FdpFormSubmitController.cpp
new file mode 100644
index 0000000..639b4e9
--- /dev/null
+++ b/Swift/Controllers/FdpFormSubmitController.cpp
@@ -0,0 +1,145 @@
+/*
+ * Copyright (c) 2018 Isode Limited.
+ * All rights reserved.
+ * See the COPYING file for more information.
+ */
+
+#include <Swift/Controllers/FdpFormSubmitController.h>
+
+#include <Swiften/Disco/GetDiscoItemsRequest.h>
+#include <Swiften/Elements/DiscoItems.h>
+#include <Swiften/Queries/IQRouter.h>
+#include <Swiften/Queries/PubSubRequest.h>
+
+#include <Swift/Controllers/UIEvents/FdpFormSubmitWindowOpenUIEvent.h>
+#include <Swift/Controllers/UIEvents/UIEventStream.h>
+#include <Swift/Controllers/UIInterfaces/FdpFormSubmitWindow.h>
+#include <Swift/Controllers/UIInterfaces/FdpFormSubmitWindowFactory.h>
+
+namespace Swift {
+
+FdpFormSubmitController::FdpFormSubmitController(const JID& self, IQRouter* iqRouter, UIEventStream* uiEventStream, FdpFormSubmitWindowFactory* factory) : selfJID_(self), iqRouter_(iqRouter), uiEventStream_(uiEventStream), factory_(factory), formSubmitWindow_(nullptr) {
+ fdpFormSubmitWindowOpenUIEventConnection_= uiEventStream_->onUIEvent.connect( [this](const std::shared_ptr<UIEvent>& uiEvent){ handleUIEvent(uiEvent); });
+}
+
+FdpFormSubmitController::~FdpFormSubmitController() {
+}
+
+void FdpFormSubmitController::handleUIEvent(const std::shared_ptr<UIEvent>& uiEvent) {
+ if (auto openEvent = std::dynamic_pointer_cast<FdpFormSubmitWindowOpenUIEvent>(uiEvent)) {
+ if (formSubmitWindow_) {
+ formSubmitWindow_->raise();
+ }
+ else {
+ createFormSubmitWindow();
+ }
+ }
+}
+
+void FdpFormSubmitController::createFormSubmitWindow() {
+ formSubmitWindow_ = factory_->createFdpFormSubmitWindow();
+ formSubmitWindow_->onCloseEvent.connect([this](){ closeFormSubmitWindow(); });
+ formSubmitWindow_->onRequestPubSubNodeData.connect([this](const std::string& string){ requestPubSubNodeData(string); });
+ formSubmitWindow_->onRequestTemplateForm.connect([this](const std::string& fdpTemplateNodeName){ requestTemplateForm(fdpTemplateNodeName); });
+ formSubmitWindow_->onSubmitForm.connect([this](const std::shared_ptr<Form>& form){ submitForm(form); });
+ formSubmitWindow_->show();
+}
+
+void FdpFormSubmitController::closeFormSubmitWindow() {
+ formSubmitWindow_.reset();
+}
+
+void FdpFormSubmitController::requestPubSubNodeData(const std::string& domainName) {
+ JID domainJID(domainName);
+ auto discoItemsRequest = GetDiscoItemsRequest::create(domainJID, iqRouter_);
+ discoItemsRequest->onResponse.connect(
+ [this, domainName](std::shared_ptr<DiscoItems> discoItems, ErrorPayload::ref errorPayloadRef) {
+ if (!discoItems || errorPayloadRef) {
+ formSubmitWindow_->showNodePlaceholder(FdpFormSubmitWindow::NodeError::DomainNotFound);
+ return;
+ }
+ currentDomain_ = domainName;
+
+ bool templateNodeAdded = false;
+ formSubmitWindow_->clearNodeData();
+ auto discoItemList = discoItems->getItems();
+ for (auto discoItem : discoItemList) {
+ auto node = discoItem.getNode();
+ if (node.substr(0, 13) != "fdp/template/") {
+ continue;
+ }
+
+ std::string nodeName = discoItem.getName().empty() ? node : discoItem.getName();
+
+ formSubmitWindow_->addNode(node, nodeName);
+ templateNodeAdded = true;
+ }
+ if (!templateNodeAdded) {
+ formSubmitWindow_->showNodePlaceholder(FdpFormSubmitWindow::NodeError::NoFdpNodesInDomain);
+ }
+ }
+ );
+ discoItemsRequest->send();
+}
+
+void FdpFormSubmitController::requestTemplateForm(const std::string& nodeName) {
+ auto pubSubItems = std::make_shared<PubSubItems>(nodeName);
+ pubSubItems->setMaximumItems(1);
+ auto formRequest = std::make_shared<PubSubRequest<PubSubItems>>(IQ::Type::Get, selfJID_, currentDomain_, pubSubItems, iqRouter_);
+
+ formRequest->onResponse.connect(
+ [this, nodeName](std::shared_ptr<PubSubItems> response, ErrorPayload::ref errorPayload) {
+ if (!response || errorPayload) {
+ formSubmitWindow_->showFormPlaceholder(FdpFormSubmitWindow::TemplateError::RequestFailed);
+ return;
+ }
+ auto pubSubItemList = response->getItems();
+ if (pubSubItemList.empty()) {
+ formSubmitWindow_->showFormPlaceholder(FdpFormSubmitWindow::TemplateError::CannotLocateForm);
+ return;
+ }
+ auto payloadList = pubSubItemList[0]->getData();
+ if (payloadList.empty()) {
+ formSubmitWindow_->showFormPlaceholder(FdpFormSubmitWindow::TemplateError::CannotLocateForm);
+ return;
+ }
+ if (auto form = std::dynamic_pointer_cast<Form>(payloadList[0])) {
+ currentTemplateNode_ = nodeName;
+ formSubmitWindow_->setFormData(form);
+ }
+ else {
+ formSubmitWindow_->showFormPlaceholder(FdpFormSubmitWindow::TemplateError::InvalidPayload);
+ return;
+ }
+ }
+ );
+
+ formRequest->send();
+}
+
+void FdpFormSubmitController::submitForm(const std::shared_ptr<Form>& form) {
+ std::string submittedNode = currentTemplateNode_;
+ submittedNode.replace(submittedNode.find("/template/", 0), 10, "/submitted/");
+ auto pubSubItem = std::make_shared<PubSubItem>();
+ auto pubSubItems = std::make_shared<PubSubItems>(submittedNode);
+ auto pubSubPublish = std::make_shared<PubSubPublish>();
+ pubSubPublish->setNode(submittedNode);
+ pubSubPublish->addItem(pubSubItem);
+ pubSubItem->addData(form);
+ pubSubItems->addItem(pubSubItem);
+ auto formRequest = std::make_shared<PubSubRequest<PubSubPublish>>(IQ::Type::Set, selfJID_, currentDomain_, pubSubPublish, iqRouter_);
+
+ formRequest->onResponse.connect(
+ [this](std::shared_ptr<PubSubPublish> response, ErrorPayload::ref errorPayload) {
+ if (!response || errorPayload) {
+ formSubmitWindow_->handleSubmitServerResponse(false);
+ return;
+ }
+ formSubmitWindow_->handleSubmitServerResponse(true);
+ }
+ );
+
+ formRequest->send();
+}
+
+}
diff --git a/Swift/Controllers/FdpFormSubmitController.h b/Swift/Controllers/FdpFormSubmitController.h
new file mode 100644
index 0000000..69db08c
--- /dev/null
+++ b/Swift/Controllers/FdpFormSubmitController.h
@@ -0,0 +1,47 @@
+/*
+ * Copyright (c) 2018 Isode Limited.
+ * All rights reserved.
+ * See the COPYING file for more information.
+ */
+
+#pragma once
+
+#include <memory>
+#include <string>
+
+#include <boost/signals2.hpp>
+
+#include <Swiften/JID/JID.h>
+
+namespace Swift {
+ class FdpFormSubmitWindow;
+ class FdpFormSubmitWindowFactory;
+ class Form;
+ class IQRouter;
+ class UIEvent;
+ class UIEventStream;
+
+ class FdpFormSubmitController {
+ public:
+ FdpFormSubmitController(const JID& self, IQRouter* iqRouter, UIEventStream* uiEventStream, FdpFormSubmitWindowFactory* factory);
+ ~FdpFormSubmitController();
+
+ private:
+ void handleUIEvent(const std::shared_ptr<UIEvent>& uiEvent);
+ void createFormSubmitWindow();
+ void closeFormSubmitWindow();
+ void requestPubSubNodeData(const std::string& domainName);
+ void requestTemplateForm(const std::string& nodeName);
+ void submitForm(const std::shared_ptr<Form>& form);
+
+ JID selfJID_;
+ IQRouter* iqRouter_;
+ UIEventStream* uiEventStream_;
+ FdpFormSubmitWindowFactory* factory_;
+ std::unique_ptr<FdpFormSubmitWindow> formSubmitWindow_;
+ std::string currentDomain_;
+ std::string currentTemplateNode_;
+
+ boost::signals2::scoped_connection fdpFormSubmitWindowOpenUIEventConnection_;
+ };
+}
diff --git a/Swift/Controllers/FileTransfer/FileTransferController.cpp b/Swift/Controllers/FileTransfer/FileTransferController.cpp
index 27e9dbf..5b86a7b 100644
--- a/Swift/Controllers/FileTransfer/FileTransferController.cpp
+++ b/Swift/Controllers/FileTransfer/FileTransferController.cpp
@@ -5,7 +5,7 @@
*/
/*
- * Copyright (c) 2015-2017 Isode Limited.
+ * Copyright (c) 2015-2019 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -82,7 +82,7 @@ boost::uintmax_t FileTransferController::getSize() const {
}
void FileTransferController::start(std::string& description) {
- SWIFT_LOG(debug) << "FileTransferController::start" << std::endl;
+ SWIFT_LOG(debug) << "FileTransferController::start";
fileReadStream = std::make_shared<FileReadBytestream>(boost::filesystem::path(filename));
OutgoingFileTransfer::ref outgoingTransfer = ftManager->createOutgoingFileTransfer(otherParty, boost::filesystem::path(filename), description, fileReadStream);
if (outgoingTransfer) {
@@ -98,7 +98,7 @@ void FileTransferController::start(std::string& description) {
}
void FileTransferController::accept(std::string& file) {
- SWIFT_LOG(debug) << "FileTransferController::accept" << std::endl;
+ SWIFT_LOG(debug) << "FileTransferController::accept";
IncomingFileTransfer::ref incomingTransfer = std::dynamic_pointer_cast<IncomingFileTransfer>(transfer);
if (incomingTransfer) {
fileWriteStream = std::make_shared<FileWriteBytestream>(boost::filesystem::path(file));
diff --git a/Swift/Controllers/FileTransfer/FileTransferProgressInfo.cpp b/Swift/Controllers/FileTransfer/FileTransferProgressInfo.cpp
index b073017..eddace9 100644
--- a/Swift/Controllers/FileTransfer/FileTransferProgressInfo.cpp
+++ b/Swift/Controllers/FileTransfer/FileTransferProgressInfo.cpp
@@ -5,7 +5,7 @@
*/
/*
- * Copyright (c) 2016 Isode Limited.
+ * Copyright (c) 2016-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -18,13 +18,13 @@
namespace Swift {
-FileTransferProgressInfo::FileTransferProgressInfo(boost::uintmax_t completeBytes) : completeBytes(completeBytes), completedBytes(0), percentage(0) {
+FileTransferProgressInfo::FileTransferProgressInfo(size_t completeBytes) : completeBytes(completeBytes), completedBytes(0), percentage(0) {
onProgressPercentage(0);
}
-void FileTransferProgressInfo::setBytesProcessed(int processedBytes) {
+void FileTransferProgressInfo::setBytesProcessed(size_t processedBytes) {
int oldPercentage = int(double(completedBytes) / double(completeBytes) * 100.0);
- completedBytes += boost::numeric_cast<boost::uintmax_t>(processedBytes);
+ completedBytes += processedBytes;
int newPercentage = int(double(completedBytes) / double(completeBytes) * 100.0);
if (oldPercentage != newPercentage) {
onProgressPercentage(newPercentage);
diff --git a/Swift/Controllers/FileTransfer/FileTransferProgressInfo.h b/Swift/Controllers/FileTransfer/FileTransferProgressInfo.h
index 5fb955c..869ceba 100644
--- a/Swift/Controllers/FileTransfer/FileTransferProgressInfo.h
+++ b/Swift/Controllers/FileTransfer/FileTransferProgressInfo.h
@@ -5,31 +5,32 @@
*/
/*
- * Copyright (c) 2016 Isode Limited.
+ * Copyright (c) 2016-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
#pragma once
-#include <boost/cstdint.hpp>
+#include <cstddef>
+
#include <boost/signals2.hpp>
namespace Swift {
class FileTransferProgressInfo {
public:
- FileTransferProgressInfo(boost::uintmax_t completeBytes);
+ FileTransferProgressInfo(size_t completeBytes);
public:
- void setBytesProcessed(int processedBytes);
+ void setBytesProcessed(size_t processedBytes);
int getPercentage() const;
boost::signals2::signal<void (int)> onProgressPercentage;
private:
- boost::uintmax_t completeBytes;
- boost::uintmax_t completedBytes;
+ size_t completeBytes;
+ size_t completedBytes;
int percentage;
};
diff --git a/Swift/Controllers/Highlighting/HighlightAction.cpp b/Swift/Controllers/Highlighting/HighlightAction.cpp
index e9f14df..60ace42 100644
--- a/Swift/Controllers/Highlighting/HighlightAction.cpp
+++ b/Swift/Controllers/Highlighting/HighlightAction.cpp
@@ -12,6 +12,8 @@
#include <Swift/Controllers/Highlighting/HighlightAction.h>
+BOOST_CLASS_VERSION(Swift::HighlightAction, 1)
+
namespace Swift {
diff --git a/Swift/Controllers/Highlighting/HighlightAction.h b/Swift/Controllers/Highlighting/HighlightAction.h
index da92901..d11f3ec 100644
--- a/Swift/Controllers/Highlighting/HighlightAction.h
+++ b/Swift/Controllers/Highlighting/HighlightAction.h
@@ -12,11 +12,14 @@
#pragma once
+#include <map>
+#include <memory>
#include <string>
#include <boost/archive/text_iarchive.hpp>
#include <boost/archive/text_oarchive.hpp>
#include <boost/optional.hpp>
+#include <boost/serialization/map.hpp>
#include <boost/serialization/optional.hpp>
namespace Swift {
@@ -57,12 +60,53 @@ namespace Swift {
bool operator ==(const HighlightAction& a, const HighlightAction& b);
bool operator !=(const HighlightAction& a, const HighlightAction& b);
+
template<class Archive>
- void HighlightAction::serialize(Archive& ar, const unsigned int /*version*/) {
- ar & frontColor_;
- ar & backColor_;
- ar & soundFilePath_;
- ar & systemNotificaitonEnabled_;
+ void HighlightAction::serialize(Archive& ar, const unsigned int version) {
+ auto inputStream = dynamic_cast<boost::archive::text_iarchive*>(&ar);
+ auto outputStream = dynamic_cast<boost::archive::text_oarchive*>(&ar);
+
+ if (version == 0) {
+ if (inputStream) {
+ const boost::archive::library_version_type BoostArchiveSkipVersion(15);
+ auto archiveLibraryVersion = boost::archive::BOOST_ARCHIVE_VERSION();
+ //Due to https://svn.boost.org/trac10/ticket/13050 the boost::optional fields may fail to load and crash the client. Therefore we skip loading the values from previous versions.
+ if (archiveLibraryVersion == BoostArchiveSkipVersion && archiveLibraryVersion > inputStream->get_library_version()) {
+ return;
+ }
+ }
+ ar & frontColor_;
+ ar & backColor_;
+ ar & soundFilePath_;
+ ar & systemNotificaitonEnabled_;
+ }
+ else if (version == 1) {
+ //Using a map instead of optional values that may cause a problems when serialised with boost::archive 15 version
+ std::map<std::string, std::string> properties;
+ if (outputStream) {
+ if (frontColor_.is_initialized()) {
+ properties["frontColor"] = frontColor_.get();
+ }
+ if (backColor_.is_initialized()) {
+ properties["backColor"] = backColor_.get();
+ }
+ if (soundFilePath_.is_initialized()) {
+ properties["soundFilePath"] = soundFilePath_.get();
+ }
+ }
+ ar & properties;
+ ar & systemNotificaitonEnabled_;
+ if (inputStream) {
+ if (properties.find("frontColor") != properties.end()) {
+ frontColor_ = properties["frontColor"];
+ }
+ if (properties.find("backColor") != properties.end()) {
+ backColor_ = properties["backColor"];
+ }
+ if (properties.find("soundFilePath") != properties.end()) {
+ soundFilePath_ = properties["soundFilePath"];
+ }
+ }
+ }
}
-
}
diff --git a/Swift/Controllers/Highlighting/HighlightManager.cpp b/Swift/Controllers/Highlighting/HighlightManager.cpp
index 2ca77e7..f09d94c 100644
--- a/Swift/Controllers/Highlighting/HighlightManager.cpp
+++ b/Swift/Controllers/Highlighting/HighlightManager.cpp
@@ -5,7 +5,7 @@
*/
/*
- * Copyright (c) 2014-2017 Isode Limited.
+ * Copyright (c) 2014-2019 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -85,7 +85,7 @@ HighlightConfiguration HighlightManager::highlightConfigurationFromString(const
}
catch (boost::archive::archive_exception&) {
configuration = getDefaultConfig();
- SWIFT_LOG(warning) << "Failed to load highlight configuration. Will use default configuration instead." << std::endl;
+ SWIFT_LOG(warning) << "Failed to load highlight configuration. Will use default configuration instead.";
}
return configuration;
}
diff --git a/Swift/Controllers/MainController.cpp b/Swift/Controllers/MainController.cpp
deleted file mode 100644
index b22e467..0000000
--- a/Swift/Controllers/MainController.cpp
+++ /dev/null
@@ -1,950 +0,0 @@
-/*
- * Copyright (c) 2010-2017 Isode Limited.
- * All rights reserved.
- * See the COPYING file for more information.
- */
-
-#include <Swift/Controllers/MainController.h>
-
-#include <cstdlib>
-#include <memory>
-
-#include <boost/bind.hpp>
-#include <boost/lexical_cast.hpp>
-
-#include <Swiften/Base/Algorithm.h>
-#include <Swiften/Base/Log.h>
-#include <Swiften/Base/String.h>
-#include <Swiften/Base/format.h>
-#include <Swiften/Client/Client.h>
-#include <Swiften/Client/ClientBlockListManager.h>
-#include <Swiften/Client/ClientXMLTracer.h>
-#include <Swiften/Client/NickResolver.h>
-#include <Swiften/Client/StanzaChannel.h>
-#include <Swiften/Client/Storages.h>
-#include <Swiften/Crypto/CryptoProvider.h>
-#include <Swiften/Disco/CapsInfoGenerator.h>
-#include <Swiften/Disco/ClientDiscoManager.h>
-#include <Swiften/Disco/GetDiscoInfoRequest.h>
-#include <Swiften/Elements/ChatState.h>
-#include <Swiften/Elements/DiscoInfo.h>
-#include <Swiften/Elements/Presence.h>
-#include <Swiften/Elements/VCardUpdate.h>
-#include <Swiften/FileTransfer/FileTransferManager.h>
-#include <Swiften/Network/NetworkFactories.h>
-#include <Swiften/Network/TimerFactory.h>
-#include <Swiften/Presence/PresenceSender.h>
-#include <Swiften/Queries/Requests/EnableCarbonsRequest.h>
-#include <Swiften/StringCodecs/Base64.h>
-#include <Swiften/StringCodecs/Hexify.h>
-#include <Swiften/VCards/GetVCardRequest.h>
-#include <Swiften/VCards/VCardManager.h>
-
-#ifdef SWIFTEN_PLATFORM_WIN32
-#include <Swiften/SASL/WindowsAuthentication.h>
-#endif
-
-#include <Swift/Controllers/AdHocManager.h>
-#include <Swift/Controllers/BlockListController.h>
-#include <Swift/Controllers/BuildVersion.h>
-#include <Swift/Controllers/Chat/ChatsManager.h>
-#include <Swift/Controllers/Chat/MUCController.h>
-#include <Swift/Controllers/Chat/UserSearchController.h>
-#include <Swift/Controllers/ContactEditController.h>
-#include <Swift/Controllers/ContactSuggester.h>
-#include <Swift/Controllers/ContactsFromXMPPRoster.h>
-#include <Swift/Controllers/EventNotifier.h>
-#include <Swift/Controllers/EventWindowController.h>
-#include <Swift/Controllers/FileTransfer/FileTransferOverview.h>
-#include <Swift/Controllers/FileTransferListController.h>
-#include <Swift/Controllers/Highlighting/HighlightEditorController.h>
-#include <Swift/Controllers/Highlighting/HighlightManager.h>
-#include <Swift/Controllers/HistoryController.h>
-#include <Swift/Controllers/HistoryViewController.h>
-#include <Swift/Controllers/Intl.h>
-#include <Swift/Controllers/PresenceNotifier.h>
-#include <Swift/Controllers/ProfileController.h>
-#include <Swift/Controllers/Roster/RosterController.h>
-#include <Swift/Controllers/SettingConstants.h>
-#include <Swift/Controllers/Settings/SettingsProvider.h>
-#include <Swift/Controllers/ShowProfileController.h>
-#include <Swift/Controllers/SoundEventController.h>
-#include <Swift/Controllers/SoundPlayer.h>
-#include <Swift/Controllers/StatusTracker.h>
-#include <Swift/Controllers/Storages/CertificateStorageFactory.h>
-#include <Swift/Controllers/Storages/CertificateStorageTrustChecker.h>
-#include <Swift/Controllers/Storages/StoragesFactory.h>
-#include <Swift/Controllers/SystemTray.h>
-#include <Swift/Controllers/SystemTrayController.h>
-#include <Swift/Controllers/UIEvents/JoinMUCUIEvent.h>
-#include <Swift/Controllers/UIEvents/RequestChatUIEvent.h>
-#include <Swift/Controllers/UIEvents/UIEventStream.h>
-#include <Swift/Controllers/UIInterfaces/LoginWindow.h>
-#include <Swift/Controllers/UIInterfaces/LoginWindowFactory.h>
-#include <Swift/Controllers/UIInterfaces/MainWindow.h>
-#include <Swift/Controllers/UIInterfaces/UIFactory.h>
-#include <Swift/Controllers/WhiteboardManager.h>
-#include <Swift/Controllers/XMLConsoleController.h>
-#include <Swift/Controllers/XMPPEvents/EventController.h>
-#include <Swift/Controllers/XMPPURIController.h>
-
-#include <SwifTools/Dock/Dock.h>
-#include <SwifTools/Idle/IdleDetector.h>
-#include <SwifTools/Notifier/TogglableNotifier.h>
-
-namespace Swift {
-
-static const std::string CLIENT_NAME = "Swift";
-static const std::string CLIENT_NODE = "http://swift.im";
-
-
-MainController::MainController(
- EventLoop* eventLoop,
- NetworkFactories* networkFactories,
- UIFactory* uiFactories,
- SettingsProvider* settings,
- SystemTray* systemTray,
- SoundPlayer* soundPlayer,
- StoragesFactory* storagesFactory,
- CertificateStorageFactory* certificateStorageFactory,
- Dock* dock,
- Notifier* notifier,
- URIHandler* uriHandler,
- IdleDetector* idleDetector,
- const std::map<std::string, std::string>& emoticons,
- bool useDelayForLatency) :
- eventLoop_(eventLoop),
- networkFactories_(networkFactories),
- uiFactory_(uiFactories),
- storagesFactory_(storagesFactory),
- certificateStorageFactory_(certificateStorageFactory),
- settings_(settings),
- uriHandler_(uriHandler),
- idleDetector_(idleDetector),
- loginWindow_(nullptr) ,
- useDelayForLatency_(useDelayForLatency),
- ftOverview_(nullptr),
- emoticons_(emoticons) {
- storages_ = nullptr;
- certificateStorage_ = nullptr;
- certificateTrustChecker_ = nullptr;
- statusTracker_ = nullptr;
- presenceNotifier_ = nullptr;
- eventNotifier_ = nullptr;
- rosterController_ = nullptr;
- chatsManager_ = nullptr;
- historyController_ = nullptr;
- historyViewController_ = nullptr;
- eventWindowController_ = nullptr;
- profileController_ = nullptr;
- blockListController_ = nullptr;
- showProfileController_ = nullptr;
- contactEditController_ = nullptr;
- userSearchControllerChat_ = nullptr;
- userSearchControllerAdd_ = nullptr;
- userSearchControllerInvite_ = nullptr;
- contactsFromRosterProvider_ = nullptr;
- contactSuggesterWithoutRoster_ = nullptr;
- contactSuggesterWithRoster_ = nullptr;
- whiteboardManager_ = nullptr;
- adHocManager_ = nullptr;
- quitRequested_ = false;
- clientInitialized_ = false;
- offlineRequested_ = false;
-
- timeBeforeNextReconnect_ = -1;
- dock_ = dock;
- uiEventStream_ = new UIEventStream();
-
- notifier_ = new TogglableNotifier(notifier);
- notifier_->setPersistentEnabled(settings_->getSetting(SettingConstants::SHOW_NOTIFICATIONS));
- eventController_ = new EventController();
- eventController_->onEventQueueLengthChange.connect(boost::bind(&MainController::handleEventQueueLengthChange, this, _1));
-
- systemTrayController_ = new SystemTrayController(eventController_, systemTray);
- loginWindow_ = uiFactory_->createLoginWindow(uiEventStream_);
- loginWindow_->setShowNotificationToggle(!notifier->isExternallyConfigured());
-
- highlightManager_ = new HighlightManager(settings_);
- highlightEditorController_ = new HighlightEditorController(uiEventStream_, uiFactory_, highlightManager_);
-
- soundEventController_ = new SoundEventController(eventController_, soundPlayer, settings, highlightManager_);
-
- xmppURIController_ = new XMPPURIController(uriHandler_, uiEventStream_);
-
- std::string selectedLoginJID = settings_->getSetting(SettingConstants::LAST_LOGIN_JID);
- bool loginAutomatically = settings_->getSetting(SettingConstants::LOGIN_AUTOMATICALLY);
- std::string cachedPassword;
- std::string cachedCertificate;
- ClientOptions cachedOptions;
- bool eagle = settings_->getSetting(SettingConstants::FORGET_PASSWORDS);
- if (!eagle) {
- for (auto&& profile : settings->getAvailableProfiles()) {
- ProfileSettingsProvider profileSettings(profile, settings);
- std::string password = profileSettings.getStringSetting("pass");
- std::string certificate = profileSettings.getStringSetting("certificate");
- std::string jid = profileSettings.getStringSetting("jid");
- ClientOptions clientOptions = parseClientOptions(profileSettings.getStringSetting("options"));
-
-#ifdef SWIFTEN_PLATFORM_WIN32
- clientOptions.singleSignOn = settings_->getSetting(SettingConstants::SINGLE_SIGN_ON);
-#endif
-
- loginWindow_->addAvailableAccount(jid, password, certificate, clientOptions);
- if (jid == selectedLoginJID) {
- cachedPassword = password;
- cachedCertificate = certificate;
- cachedOptions = clientOptions;
- }
- }
- loginWindow_->selectUser(selectedLoginJID);
- loginWindow_->setLoginAutomatically(loginAutomatically);
- }
-
-
- loginWindow_->onLoginRequest.connect(boost::bind(&MainController::handleLoginRequest, this, _1, _2, _3, _4, _5, _6, _7));
- loginWindow_->onPurgeSavedLoginRequest.connect(boost::bind(&MainController::handlePurgeSavedLoginRequest, this, _1));
- loginWindow_->onCancelLoginRequest.connect(boost::bind(&MainController::handleCancelLoginRequest, this));
- loginWindow_->onQuitRequest.connect(boost::bind(&MainController::handleQuitRequest, this));
-
- idleDetector_->setIdleTimeSeconds(settings->getSetting(SettingConstants::IDLE_TIMEOUT));
- idleDetector_->onIdleChanged.connect(boost::bind(&MainController::handleInputIdleChanged, this, _1));
-
- xmlConsoleController_ = new XMLConsoleController(uiEventStream_, uiFactory_);
-
- fileTransferListController_ = new FileTransferListController(uiEventStream_, uiFactory_);
-
- settings_->onSettingChanged.connect(boost::bind(&MainController::handleSettingChanged, this, _1));
-
- if (loginAutomatically) {
- profileSettings_ = new ProfileSettingsProvider(selectedLoginJID, settings_);
- /* FIXME: deal with autologin with a cert*/
- handleLoginRequest(selectedLoginJID, cachedPassword, cachedCertificate, CertificateWithKey::ref(), cachedOptions, true, true);
- } else {
- profileSettings_ = nullptr;
- }
-}
-
-MainController::~MainController() {
- idleDetector_->onIdleChanged.disconnect(boost::bind(&MainController::handleInputIdleChanged, this, _1));
-
- purgeCachedCredentials();
- //setManagersOffline();
- eventController_->disconnectAll();
-
- resetClient();
- delete highlightEditorController_;
- delete highlightManager_;
- delete fileTransferListController_;
- delete xmlConsoleController_;
- delete xmppURIController_;
- delete soundEventController_;
- delete systemTrayController_;
- delete eventController_;
- delete notifier_;
- delete uiEventStream_;
-}
-
-void MainController::purgeCachedCredentials() {
- safeClear(password_);
-}
-
-void MainController::resetClient() {
- purgeCachedCredentials();
- resetCurrentError();
- resetPendingReconnects();
- vCardPhotoHash_.clear();
- delete contactEditController_;
- contactEditController_ = nullptr;
- delete profileController_;
- profileController_ = nullptr;
- delete showProfileController_;
- showProfileController_ = nullptr;
- delete eventWindowController_;
- eventWindowController_ = nullptr;
- delete chatsManager_;
- chatsManager_ = nullptr;
-#ifdef SWIFT_EXPERIMENTAL_HISTORY
- delete historyViewController_;
- historyViewController_ = nullptr;
- delete historyController_;
- historyController_ = nullptr;
-#endif
- fileTransferListController_->setFileTransferOverview(nullptr);
- delete ftOverview_;
- ftOverview_ = nullptr;
- delete blockListController_;
- blockListController_ = nullptr;
- delete rosterController_;
- rosterController_ = nullptr;
- delete eventNotifier_;
- eventNotifier_ = nullptr;
- delete presenceNotifier_;
- presenceNotifier_ = nullptr;
- delete certificateTrustChecker_;
- certificateTrustChecker_ = nullptr;
- delete certificateStorage_;
- certificateStorage_ = nullptr;
- delete storages_;
- storages_ = nullptr;
- delete statusTracker_;
- statusTracker_ = nullptr;
- delete profileSettings_;
- profileSettings_ = nullptr;
- delete userSearchControllerChat_;
- userSearchControllerChat_ = nullptr;
- delete userSearchControllerAdd_;
- userSearchControllerAdd_ = nullptr;
- delete userSearchControllerInvite_;
- userSearchControllerInvite_ = nullptr;
- delete contactSuggesterWithoutRoster_;
- contactSuggesterWithoutRoster_ = nullptr;
- delete contactSuggesterWithRoster_;
- contactSuggesterWithRoster_ = nullptr;
- delete contactsFromRosterProvider_;
- contactsFromRosterProvider_ = nullptr;
- delete adHocManager_;
- adHocManager_ = nullptr;
- delete whiteboardManager_;
- whiteboardManager_ = nullptr;
- clientInitialized_ = false;
-}
-
-void MainController::handleSettingChanged(const std::string& settingPath) {
- if (settingPath == SettingConstants::SHOW_NOTIFICATIONS.getKey()) {
- notifier_->setPersistentEnabled(settings_->getSetting(SettingConstants::SHOW_NOTIFICATIONS));
- }
-}
-
-void MainController::resetPendingReconnects() {
- timeBeforeNextReconnect_ = -1;
- if (reconnectTimer_) {
- reconnectTimer_->stop();
- reconnectTimer_.reset();
- }
- resetCurrentError();
-}
-
-void MainController::resetCurrentError() {
- if (lastDisconnectError_) {
- lastDisconnectError_->conclude();
- lastDisconnectError_ = std::shared_ptr<ErrorEvent>();
- }
-}
-
-void MainController::handleConnected() {
- boundJID_ = client_->getJID();
- resetCurrentError();
- resetPendingReconnects();
-
- if (settings_->getSetting(SettingConstants::FORGET_PASSWORDS)) {
- purgeCachedCredentials();
- }
-
- bool freshLogin = rosterController_ == nullptr;
- myStatusLooksOnline_ = true;
- if (freshLogin) {
- profileController_ = new ProfileController(client_->getVCardManager(), uiFactory_, uiEventStream_);
- showProfileController_ = new ShowProfileController(client_->getVCardManager(), uiFactory_, uiEventStream_);
- ftOverview_ = new FileTransferOverview(client_->getFileTransferManager());
- fileTransferListController_->setFileTransferOverview(ftOverview_);
- rosterController_ = new RosterController(boundJID_, client_->getRoster(), client_->getAvatarManager(), uiFactory_, client_->getNickManager(), client_->getNickResolver(), client_->getPresenceOracle(), client_->getSubscriptionManager(), eventController_, uiEventStream_, client_->getIQRouter(), settings_, client_->getEntityCapsProvider(), client_->getClientBlockListManager(), client_->getVCardManager());
- rosterController_->onChangeStatusRequest.connect(boost::bind(&MainController::handleChangeStatusRequest, this, _1, _2));
- rosterController_->onSignOutRequest.connect(boost::bind(&MainController::signOut, this));
- rosterController_->getWindow()->onShowCertificateRequest.connect(boost::bind(&MainController::handleShowCertificateRequest, this));
-
- blockListController_ = new BlockListController(client_->getClientBlockListManager(), uiEventStream_, uiFactory_, eventController_);
-
- contactEditController_ = new ContactEditController(rosterController_, client_->getVCardManager(), uiFactory_, uiEventStream_);
- whiteboardManager_ = new WhiteboardManager(uiFactory_, uiEventStream_, client_->getNickResolver(), client_->getWhiteboardSessionManager());
-
- /* Doing this early as an ordering fix. Various things later will
- * want to have the user's nick available and this means it will
- * be before they receive stanzas that need it (e.g. bookmarks).*/
- client_->getVCardManager()->requestOwnVCard();
-
- contactSuggesterWithoutRoster_ = new ContactSuggester();
- contactSuggesterWithRoster_ = new ContactSuggester();
-
- userSearchControllerInvite_ = new UserSearchController(UserSearchController::Type::InviteToChat, jid_, uiEventStream_, client_->getVCardManager(), uiFactory_, client_->getIQRouter(), rosterController_, contactSuggesterWithRoster_, client_->getAvatarManager(), client_->getPresenceOracle(), profileSettings_);
-#ifdef SWIFT_EXPERIMENTAL_HISTORY
- historyController_ = new HistoryController(storages_->getHistoryStorage());
- historyViewController_ = new HistoryViewController(jid_, uiEventStream_, historyController_, client_->getNickResolver(), client_->getAvatarManager(), client_->getPresenceOracle(), uiFactory_);
- chatsManager_ = new ChatsManager(jid_, client_->getStanzaChannel(), client_->getIQRouter(), eventController_, uiFactory_, uiFactory_, client_->getNickResolver(), client_->getPresenceOracle(), client_->getPresenceSender(), uiEventStream_, uiFactory_, useDelayForLatency_, networkFactories_->getTimerFactory(), client_->getMUCRegistry(), client_->getEntityCapsProvider(), client_->getMUCManager(), uiFactory_, profileSettings_, ftOverview_, client_->getRoster(), !settings_->getSetting(SettingConstants::REMEMBER_RECENT_CHATS), settings_, historyController_, whiteboardManager_, highlightManager_, client_->getClientBlockListManager(), emoticons_, client_->getVCardManager());
-#else
- chatsManager_ = new ChatsManager(jid_, client_->getStanzaChannel(), client_->getIQRouter(), eventController_, uiFactory_, uiFactory_, client_->getNickResolver(), client_->getPresenceOracle(), client_->getPresenceSender(), uiEventStream_, uiFactory_, useDelayForLatency_, networkFactories_->getTimerFactory(), client_->getMUCRegistry(), client_->getEntityCapsProvider(), client_->getMUCManager(), uiFactory_, profileSettings_, ftOverview_, client_->getRoster(), !settings_->getSetting(SettingConstants::REMEMBER_RECENT_CHATS), settings_, nullptr, whiteboardManager_, highlightManager_, client_->getClientBlockListManager(), emoticons_, client_->getVCardManager());
-#endif
- contactsFromRosterProvider_ = new ContactsFromXMPPRoster(client_->getRoster(), client_->getAvatarManager(), client_->getPresenceOracle());
- contactSuggesterWithoutRoster_->addContactProvider(chatsManager_);
- contactSuggesterWithRoster_->addContactProvider(chatsManager_);
- contactSuggesterWithRoster_->addContactProvider(contactsFromRosterProvider_);
- highlightEditorController_->setContactSuggester(contactSuggesterWithoutRoster_);
-
- client_->onMessageReceived.connect(boost::bind(&ChatsManager::handleIncomingMessage, chatsManager_, _1));
- chatsManager_->setAvatarManager(client_->getAvatarManager());
-
- eventWindowController_ = new EventWindowController(eventController_, uiFactory_);
-
- loginWindow_->morphInto(rosterController_->getWindow());
-
- DiscoInfo discoInfo;
- discoInfo.addIdentity(DiscoInfo::Identity(CLIENT_NAME, "client", "pc"));
- discoInfo.addFeature(DiscoInfo::ChatStatesFeature);
- discoInfo.addFeature(DiscoInfo::SecurityLabelsFeature);
- discoInfo.addFeature(DiscoInfo::MessageCorrectionFeature);
-#ifdef SWIFT_EXPERIMENTAL_FT
- discoInfo.addFeature(DiscoInfo::JingleFeature);
- discoInfo.addFeature(DiscoInfo::JingleFTFeature);
- discoInfo.addFeature(DiscoInfo::JingleTransportsIBBFeature);
- discoInfo.addFeature(DiscoInfo::JingleTransportsS5BFeature);
-#endif
-#ifdef SWIFT_EXPERIMENTAL_WB
- discoInfo.addFeature(DiscoInfo::WhiteboardFeature);
-#endif
- discoInfo.addFeature(DiscoInfo::MessageDeliveryReceiptsFeature);
- client_->getDiscoManager()->setCapsNode(CLIENT_NODE);
- client_->getDiscoManager()->setDiscoInfo(discoInfo);
-
- userSearchControllerChat_ = new UserSearchController(UserSearchController::Type::StartChat, jid_, uiEventStream_, client_->getVCardManager(), uiFactory_, client_->getIQRouter(), rosterController_, contactSuggesterWithRoster_, client_->getAvatarManager(), client_->getPresenceOracle(), profileSettings_);
- userSearchControllerAdd_ = new UserSearchController(UserSearchController::Type::AddContact, jid_, uiEventStream_, client_->getVCardManager(), uiFactory_, client_->getIQRouter(), rosterController_, contactSuggesterWithoutRoster_, client_->getAvatarManager(), client_->getPresenceOracle(), profileSettings_);
- adHocManager_ = new AdHocManager(JID(boundJID_.getDomain()), uiFactory_, client_->getIQRouter(), uiEventStream_, rosterController_->getWindow());
-
- chatsManager_->onImpromptuMUCServiceDiscovered.connect(boost::bind(&UserSearchController::setCanInitiateImpromptuMUC, userSearchControllerChat_, _1));
- }
- loginWindow_->setIsLoggingIn(false);
-
- client_->requestRoster();
-
- GetDiscoInfoRequest::ref discoInfoRequest = GetDiscoInfoRequest::create(JID(boundJID_.getDomain()), client_->getIQRouter());
- discoInfoRequest->onResponse.connect(boost::bind(&MainController::handleServerDiscoInfoResponse, this, _1, _2));
- discoInfoRequest->send();
-
- client_->getVCardManager()->requestOwnVCard();
-
- rosterController_->setJID(boundJID_);
- rosterController_->setEnabled(true);
- rosterController_->getWindow()->setStreamEncryptionStatus(client_->isStreamEncrypted());
- profileController_->setAvailable(true);
- contactEditController_->setAvailable(true);
- /* Send presence later to catch all the incoming presences. */
- sendPresence(statusTracker_->getNextPresence());
-
- /* Enable chats last of all, so rejoining MUCs has the right sent presence */
- assert(chatsManager_);
- chatsManager_->setOnline(true);
- adHocManager_->setOnline(true);
-}
-
-void MainController::handleEventQueueLengthChange(int count) {
- dock_->setNumberOfPendingMessages(count);
-}
-
-void MainController::reconnectAfterError() {
- if (reconnectTimer_) {
- reconnectTimer_->stop();
- }
- performLoginFromCachedCredentials();
-}
-
-void MainController::handleChangeStatusRequest(StatusShow::Type show, const std::string &statusText) {
- std::shared_ptr<Presence> presence(new Presence());
- if (show == StatusShow::None) {
- // Note: this is misleading, None doesn't mean unavailable on the wire.
- presence->setType(Presence::Unavailable);
- resetPendingReconnects();
- myStatusLooksOnline_ = false;
- offlineRequested_ = true;
- }
- else {
- offlineRequested_ = false;
- presence->setShow(show);
- }
- presence->setStatus(statusText);
- statusTracker_->setRequestedPresence(presence);
- if (presence->getType() != Presence::Unavailable) {
- profileSettings_->storeInt("lastShow", presence->getShow());
- profileSettings_->storeString("lastStatus", presence->getStatus());
- }
- if (presence->getType() != Presence::Unavailable && !client_->isAvailable()) {
- performLoginFromCachedCredentials();
- } else {
- sendPresence(presence);
- }
-}
-
-void MainController::sendPresence(std::shared_ptr<Presence> presence) {
- rosterController_->getWindow()->setMyStatusType(presence->getShow());
- rosterController_->getWindow()->setMyStatusText(presence->getStatus());
- systemTrayController_->setMyStatusType(presence->getShow());
- notifier_->setTemporarilyDisabled(presence->getShow() == StatusShow::DND);
-
- // Add information and send
- presence->updatePayload(std::make_shared<VCardUpdate>(vCardPhotoHash_));
- client_->getPresenceSender()->sendPresence(presence);
- if (presence->getType() == Presence::Unavailable) {
- logout();
- }
-}
-
-void MainController::handleInputIdleChanged(bool idle) {
- if (!statusTracker_) {
- //Haven't logged in yet.
- return;
- }
-
- if (settings_->getSetting(SettingConstants::IDLE_GOES_OFFLINE)) {
- if (idle) {
- logout();
- }
- }
- else {
- if (idle) {
- if (statusTracker_->goAutoAway(idleDetector_->getIdleTimeSeconds())) {
- if (client_ && client_->isAvailable()) {
- sendPresence(statusTracker_->getNextPresence());
- }
- }
- } else {
- if (statusTracker_->goAutoUnAway()) {
- if (client_ && client_->isAvailable()) {
- sendPresence(statusTracker_->getNextPresence());
- }
- }
- }
- }
-}
-
-void MainController::handleShowCertificateRequest() {
- std::vector<Certificate::ref> chain = client_->getStanzaChannel()->getPeerCertificateChain();
- rosterController_->getWindow()->openCertificateDialog(chain);
-}
-
-void MainController::handleLoginRequest(const std::string &username, const std::string &password, const std::string& certificatePath, CertificateWithKey::ref certificate, const ClientOptions& options, bool remember, bool loginAutomatically) {
- jid_ = JID(username);
- if (options.singleSignOn && (!jid_.isValid() || !jid_.getNode().empty())) {
- loginWindow_->setMessage(QT_TRANSLATE_NOOP("", "User address invalid. User address should be of the form 'wonderland.lit'"));
- loginWindow_->setIsLoggingIn(false);
- } else if (!options.singleSignOn && (!jid_.isValid() || jid_.getNode().empty())) {
- loginWindow_->setMessage(QT_TRANSLATE_NOOP("", "User address invalid. User address should be of the form 'alice@wonderland.lit'"));
- loginWindow_->setIsLoggingIn(false);
- } else {
-#ifdef SWIFTEN_PLATFORM_WIN32
- if (options.singleSignOn) {
- std::string userName;
- std::string clientName;
- std::string serverName;
- std::shared_ptr<boost::system::error_code> errorCode = getUserNameEx(userName, clientName, serverName);
-
- if (!errorCode) {
- /* Create JID using the Windows logon name and user provided domain name */
- jid_ = JID(clientName, username);
- }
- else {
- loginWindow_->setMessage(str(format(QT_TRANSLATE_NOOP("", "Error obtaining Windows user name (%1%)")) % errorCode->message()));
- loginWindow_->setIsLoggingIn(false);
- return;
- }
- }
-#endif
-
- loginWindow_->setMessage("");
- loginWindow_->setIsLoggingIn(true);
- profileSettings_ = new ProfileSettingsProvider(username, settings_);
- if (!settings_->getSetting(SettingConstants::FORGET_PASSWORDS)) {
- profileSettings_->storeString("jid", username);
- profileSettings_->storeString("certificate", certificatePath);
- profileSettings_->storeString("pass", (remember || loginAutomatically) ? password : "");
- std::string optionString = serializeClientOptions(options);
- profileSettings_->storeString("options", optionString);
- settings_->storeSetting(SettingConstants::LAST_LOGIN_JID, username);
- settings_->storeSetting(SettingConstants::LOGIN_AUTOMATICALLY, loginAutomatically);
- loginWindow_->addAvailableAccount(profileSettings_->getStringSetting("jid"), profileSettings_->getStringSetting("pass"), profileSettings_->getStringSetting("certificate"), options);
- }
-
- password_ = password;
- certificate_ = certificate;
- clientOptions_ = options;
- performLoginFromCachedCredentials();
- }
-}
-
-void MainController::handlePurgeSavedLoginRequest(const std::string& username) {
- settings_->removeProfile(username);
- loginWindow_->removeAvailableAccount(username);
-}
-
-void MainController::performLoginFromCachedCredentials() {
- if (settings_->getSetting(SettingConstants::FORGET_PASSWORDS) && password_.empty()) {
- /* Then we can't try to login again. */
- return;
- }
- /* If we logged in with a bare JID, and we have a full bound JID, re-login with the
- * bound JID to try and keep dynamically assigned resources */
- JID clientJID = jid_;
- if (boundJID_.isValid() && jid_.isBare() && boundJID_.toBare() == jid_) {
- clientJID = boundJID_;
- }
-
- if (!statusTracker_) {
- statusTracker_ = new StatusTracker();
- }
- if (!clientInitialized_) {
- storages_ = storagesFactory_->createStorages(jid_.toBare());
- certificateStorage_ = certificateStorageFactory_->createCertificateStorage(jid_.toBare());
- certificateTrustChecker_ = new CertificateStorageTrustChecker(certificateStorage_);
-
- client_ = std::make_shared<Swift::Client>(clientJID, createSafeByteArray(password_.c_str()), networkFactories_, storages_);
- clientInitialized_ = true;
- client_->setCertificateTrustChecker(certificateTrustChecker_);
- client_->onDataRead.connect(boost::bind(&XMLConsoleController::handleDataRead, xmlConsoleController_, _1));
- client_->onDataWritten.connect(boost::bind(&XMLConsoleController::handleDataWritten, xmlConsoleController_, _1));
- client_->onDisconnected.connect(boost::bind(&MainController::handleDisconnected, this, _1));
- client_->onConnected.connect(boost::bind(&MainController::handleConnected, this));
-
- client_->setSoftwareVersion(CLIENT_NAME, buildVersion);
-
- client_->getVCardManager()->onVCardChanged.connect(boost::bind(&MainController::handleVCardReceived, this, _1, _2));
- presenceNotifier_ = new PresenceNotifier(client_->getStanzaChannel(), notifier_, client_->getMUCRegistry(), client_->getAvatarManager(), client_->getNickResolver(), client_->getPresenceOracle(), networkFactories_->getTimerFactory());
- presenceNotifier_->onNotificationActivated.connect(boost::bind(&MainController::handleNotificationClicked, this, _1));
- eventNotifier_ = new EventNotifier(eventController_, notifier_, client_->getAvatarManager(), client_->getNickResolver());
- eventNotifier_->onNotificationActivated.connect(boost::bind(&MainController::handleNotificationClicked, this, _1));
- if (certificate_) {
- client_->setCertificate(certificate_);
- }
- std::shared_ptr<Presence> presence(new Presence());
- presence->setShow(static_cast<StatusShow::Type>(profileSettings_->getIntSetting("lastShow", StatusShow::Online)));
- presence->setStatus(profileSettings_->getStringSetting("lastStatus"));
- statusTracker_->setRequestedPresence(presence);
- } else {
- /* In case we're in the middle of another login, make sure they don't overlap */
- client_->disconnect();
- }
- systemTrayController_->setConnecting();
- if (rosterController_) {
- rosterController_->getWindow()->setConnecting();
- }
- ClientOptions clientOptions = clientOptions_;
- bool eagle = settings_->getSetting(SettingConstants::FORGET_PASSWORDS);
- clientOptions.forgetPassword = eagle;
- clientOptions.useTLS = eagle ? ClientOptions::RequireTLS : clientOptions_.useTLS;
- client_->connect(clientOptions);
-}
-
-void MainController::handleDisconnected(const boost::optional<ClientError>& error) {
- if (rosterController_) {
- rosterController_->getWindow()->setStreamEncryptionStatus(false);
- }
- if (adHocManager_) {
- adHocManager_->setOnline(false);
- }
- if (settings_->getSetting(SettingConstants::FORGET_PASSWORDS)) {
- purgeCachedCredentials();
- }
- if (quitRequested_) {
- resetClient();
- loginWindow_->quit();
- }
- else if (error) {
- std::string message;
- std::string certificateErrorMessage;
- bool forceSignout = false;
- switch(error->getType()) {
- case ClientError::UnknownError: message = QT_TRANSLATE_NOOP("", "Unknown Error"); break;
- case ClientError::DomainNameResolveError: message = QT_TRANSLATE_NOOP("", "Unable to find server"); break;
- case ClientError::ConnectionError: message = QT_TRANSLATE_NOOP("", "Error connecting to server"); break;
- case ClientError::ConnectionReadError: message = QT_TRANSLATE_NOOP("", "Error while receiving server data"); break;
- case ClientError::ConnectionWriteError: message = QT_TRANSLATE_NOOP("", "Error while sending data to the server"); break;
- case ClientError::XMLError: message = QT_TRANSLATE_NOOP("", "Error parsing server data"); break;
- case ClientError::AuthenticationFailedError: message = QT_TRANSLATE_NOOP("", "Login/password invalid"); break;
- case ClientError::CompressionFailedError: message = QT_TRANSLATE_NOOP("", "Error while compressing stream"); break;
- case ClientError::ServerVerificationFailedError: message = QT_TRANSLATE_NOOP("", "Server verification failed"); break;
- case ClientError::NoSupportedAuthMechanismsError: message = QT_TRANSLATE_NOOP("", "Authentication mechanisms not supported"); break;
- case ClientError::UnexpectedElementError: message = QT_TRANSLATE_NOOP("", "Unexpected response"); break;
- case ClientError::ResourceBindError: message = QT_TRANSLATE_NOOP("", "Error binding resource"); break;
- case ClientError::SessionStartError: message = QT_TRANSLATE_NOOP("", "Error starting session"); break;
- case ClientError::StreamError: message = QT_TRANSLATE_NOOP("", "Stream error"); break;
- case ClientError::TLSError: message = QT_TRANSLATE_NOOP("", "Encryption error"); break;
- case ClientError::ClientCertificateLoadError: message = QT_TRANSLATE_NOOP("", "Error loading certificate (Invalid file or password?)"); break;
- case ClientError::ClientCertificateError: message = QT_TRANSLATE_NOOP("", "Certificate not authorized"); break;
- case ClientError::CertificateCardRemoved: message = QT_TRANSLATE_NOOP("", "Certificate card removed"); forceSignout = true; break;
-
- case ClientError::UnknownCertificateError: certificateErrorMessage = QT_TRANSLATE_NOOP("", "Unknown certificate"); break;
- case ClientError::CertificateExpiredError: certificateErrorMessage = QT_TRANSLATE_NOOP("", "Certificate has expired"); break;
- case ClientError::CertificateNotYetValidError: certificateErrorMessage = QT_TRANSLATE_NOOP("", "Certificate is not yet valid"); break;
- case ClientError::CertificateSelfSignedError: certificateErrorMessage = QT_TRANSLATE_NOOP("", "Certificate is self-signed"); break;
- case ClientError::CertificateRejectedError: certificateErrorMessage = QT_TRANSLATE_NOOP("", "Certificate has been rejected"); break;
- case ClientError::CertificateUntrustedError: certificateErrorMessage = QT_TRANSLATE_NOOP("", "Certificate is not trusted"); break;
- case ClientError::InvalidCertificatePurposeError: certificateErrorMessage = QT_TRANSLATE_NOOP("", "Certificate cannot be used for encrypting your connection"); break;
- case ClientError::CertificatePathLengthExceededError: certificateErrorMessage = QT_TRANSLATE_NOOP("", "Certificate path length constraint exceeded"); break;
- case ClientError::InvalidCertificateSignatureError: certificateErrorMessage = QT_TRANSLATE_NOOP("", "Invalid certificate signature"); break;
- case ClientError::InvalidCAError: certificateErrorMessage = QT_TRANSLATE_NOOP("", "Invalid Certificate Authority"); break;
- case ClientError::InvalidServerIdentityError: certificateErrorMessage = QT_TRANSLATE_NOOP("", "Certificate does not match the host identity"); break;
- case ClientError::RevokedError: certificateErrorMessage = QT_TRANSLATE_NOOP("", "Certificate has been revoked"); break;
- case ClientError::RevocationCheckFailedError: certificateErrorMessage = QT_TRANSLATE_NOOP("", "Unable to determine certificate revocation state"); break;
- }
- bool forceReconnectAfterCertificateTrust = false;
- if (!certificateErrorMessage.empty()) {
- std::vector<Certificate::ref> certificates = certificateTrustChecker_->getLastCertificateChain();
- if (!certificates.empty() && loginWindow_->askUserToTrustCertificatePermanently(certificateErrorMessage, certificates)) {
- certificateStorage_->addCertificate(certificates[0]);
- forceReconnectAfterCertificateTrust = true;
- }
- else {
- message = QT_TRANSLATE_NOOP("", "Certificate error");
- }
- }
-
- if (!message.empty() && error->getErrorCode()) {
- message = str(format(QT_TRANSLATE_NOOP("", "%1% (%2%)")) % message % error->getErrorCode()->message());
- }
-
- if (forceReconnectAfterCertificateTrust && settings_->getSetting(SettingConstants::FORGET_PASSWORDS)) {
- forceReconnectAfterCertificateTrust = false;
- forceSignout = true;
- message = QT_TRANSLATE_NOOP("", "Re-enter credentials and retry");
- }
-
- if (forceReconnectAfterCertificateTrust) {
- performLoginFromCachedCredentials();
- }
- else if (forceSignout || !rosterController_) { //hasn't been logged in yet or permanent error
- signOut();
- loginWindow_->setMessage(message);
- loginWindow_->setIsLoggingIn(false);
- } else {
- logout();
- if (settings_->getSetting(SettingConstants::FORGET_PASSWORDS)) {
- message = str(format(QT_TRANSLATE_NOOP("", "Disconnected from %1%: %2%. To reconnect, Sign Out and provide your password again.")) % jid_.getDomain() % message);
- } else {
- if (!offlineRequested_) {
- setReconnectTimer();
- }
- if (lastDisconnectError_) {
- message = str(format(QT_TRANSLATE_NOOP("", "Reconnect to %1% failed: %2%. Will retry in %3% seconds.")) % jid_.getDomain() % message % boost::lexical_cast<std::string>(timeBeforeNextReconnect_));
- lastDisconnectError_->conclude();
- } else {
- message = str(format(QT_TRANSLATE_NOOP("", "Disconnected from %1%: %2%.")) % jid_.getDomain() % message);
- }
- lastDisconnectError_ = std::make_shared<ErrorEvent>(JID(jid_.getDomain()), message);
- eventController_->handleIncomingEvent(lastDisconnectError_);
- }
- }
- }
- else if (!rosterController_) { //hasn't been logged in yet
- loginWindow_->setIsLoggingIn(false);
- }
-}
-
-void MainController::setReconnectTimer() {
- if (timeBeforeNextReconnect_ < 0) {
- timeBeforeNextReconnect_ = 1;
- } else {
- timeBeforeNextReconnect_ = timeBeforeNextReconnect_ >= 150 ? 300 : timeBeforeNextReconnect_ * 2; // Randomly selected by roll of a die, as required by 3920bis
- }
- if (reconnectTimer_) {
- reconnectTimer_->stop();
- }
- reconnectTimer_ = networkFactories_->getTimerFactory()->createTimer(timeBeforeNextReconnect_ * 1000);
- reconnectTimer_->onTick.connect(boost::bind(&MainController::reconnectAfterError, this));
- reconnectTimer_->start();
-}
-
-void MainController::handleCancelLoginRequest() {
- signOut();
-}
-
-void MainController::signOut() {
- if (settings_->getSetting(SettingConstants::FORGET_PASSWORDS)) {
- purgeCachedCredentials();
- }
- eventController_->clear();
- logout();
- loginWindow_->loggedOut();
- resetClient();
-}
-
-void MainController::logout() {
- if (settings_->getSetting(SettingConstants::FORGET_PASSWORDS)) {
- purgeCachedCredentials();
- }
- systemTrayController_->setMyStatusType(StatusShow::None);
- if (clientInitialized_ /*&& client_->isAvailable()*/) {
- client_->disconnect();
- }
- if (rosterController_ && myStatusLooksOnline_) {
- rosterController_->getWindow()->setMyStatusType(StatusShow::None);
- rosterController_->getWindow()->setMyStatusText("");
- myStatusLooksOnline_ = false;
- }
- setManagersOffline();
-}
-
-void MainController::setManagersOffline() {
- if (chatsManager_) {
- chatsManager_->setOnline(false);
- }
- if (rosterController_) {
- rosterController_->setEnabled(false);
- }
- if (profileController_) {
- profileController_->setAvailable(false);
- }
- if (contactEditController_) {
- contactEditController_->setAvailable(false);
- }
-}
-
-void MainController::handleServerDiscoInfoResponse(std::shared_ptr<DiscoInfo> info, ErrorPayload::ref error) {
- if (!error) {
- chatsManager_->setServerDiscoInfo(info);
- adHocManager_->setServerDiscoInfo(info);
- if (info->hasFeature(DiscoInfo::BlockingCommandFeature)) {
- rosterController_->getWindow()->setBlockingCommandAvailable(true);
- rosterController_->initBlockingCommand();
- }
- if (info->hasFeature(DiscoInfo::MessageCarbonsFeature)) {
- enableMessageCarbons();
- }
- }
-}
-
-void MainController::enableMessageCarbons() {
- auto enableCarbonsRequest = EnableCarbonsRequest::create(client_->getIQRouter());
- enableCarbonsRequestHandlerConnection_ = enableCarbonsRequest->onResponse.connect([&](Payload::ref /*payload*/, ErrorPayload::ref error) {
- if (error) {
- SWIFT_LOG(warning) << "Failed to enable carbons." << std::endl;
- }
- else {
- SWIFT_LOG(debug) << "Successfully enabled carbons." << std::endl;
- }
- enableCarbonsRequestHandlerConnection_.disconnect();
- });
- enableCarbonsRequest->send();
-}
-
-void MainController::handleVCardReceived(const JID& jid, VCard::ref vCard) {
- if (!jid.equals(jid_, JID::WithoutResource) || !vCard) {
- return;
- }
- std::string hash;
- if (!vCard->getPhoto().empty()) {
- hash = Hexify::hexify(networkFactories_->getCryptoProvider()->getSHA1Hash(vCard->getPhoto()));
- }
- if (hash != vCardPhotoHash_) {
- vCardPhotoHash_ = hash;
- if (client_ && client_->isAvailable()) {
- sendPresence(statusTracker_->getNextPresence());
- }
- }
-}
-
-void MainController::handleNotificationClicked(const JID& jid) {
- assert(chatsManager_);
- if (clientInitialized_) {
- if (client_->getMUCRegistry()->isMUC(jid)) {
- uiEventStream_->send(std::make_shared<JoinMUCUIEvent>(jid));
- }
- else {
- uiEventStream_->send(std::make_shared<RequestChatUIEvent>(jid));
- }
- }
-}
-
-void MainController::handleQuitRequest() {
- if (client_ && client_->isActive()) {
- quitRequested_ = true;
- client_->disconnect();
- }
- else {
- resetClient();
- loginWindow_->quit();
- }
-}
-
-#define SERIALIZE_BOOL(option) result += options.option ? "1" : "0"; result += ",";
-#define SERIALIZE_INT(option) result += boost::lexical_cast<std::string>(options.option); result += ",";
-#define SERIALIZE_STRING(option) result += Base64::encode(createByteArray(options.option)); result += ",";
-#define SERIALIZE_SAFE_STRING(option) result += safeByteArrayToString(Base64::encode(options.option)); result += ",";
-#define SERIALIZE_URL(option) SERIALIZE_STRING(option.toString())
-
-std::string MainController::serializeClientOptions(const ClientOptions& options) {
- std::string result;
- SERIALIZE_BOOL(useStreamCompression);
- switch (options.useTLS) {
- case ClientOptions::NeverUseTLS: result += "1";break;
- case ClientOptions::UseTLSWhenAvailable: result += "2";break;
- case ClientOptions::RequireTLS: result += "3";break;
- }
- result += ",";
- SERIALIZE_BOOL(allowPLAINWithoutTLS);
- SERIALIZE_BOOL(useStreamResumption);
- SERIALIZE_BOOL(useAcks);
- SERIALIZE_STRING(manualHostname);
- SERIALIZE_INT(manualPort);
- switch (options.proxyType) {
- case ClientOptions::NoProxy: result += "1";break;
- case ClientOptions::SystemConfiguredProxy: result += "2";break;
- case ClientOptions::SOCKS5Proxy: result += "3";break;
- case ClientOptions::HTTPConnectProxy: result += "4";break;
- }
- result += ",";
- SERIALIZE_STRING(manualProxyHostname);
- SERIALIZE_INT(manualProxyPort);
- SERIALIZE_URL(boshURL);
- SERIALIZE_URL(boshHTTPConnectProxyURL);
- SERIALIZE_SAFE_STRING(boshHTTPConnectProxyAuthID);
- SERIALIZE_SAFE_STRING(boshHTTPConnectProxyAuthPassword);
- SERIALIZE_BOOL(tlsOptions.schannelTLS1_0Workaround);
- return result;
-}
-
-#define CHECK_PARSE_LENGTH if (i >= segments.size()) {return result;}
-#define PARSE_INT_RAW(defaultValue) CHECK_PARSE_LENGTH intVal = defaultValue; try {intVal = boost::lexical_cast<int>(segments[i]);} catch(const boost::bad_lexical_cast&) {};i++;
-#define PARSE_STRING_RAW CHECK_PARSE_LENGTH stringVal = byteArrayToString(Base64::decode(segments[i]));i++;
-
-#define PARSE_BOOL(option, defaultValue) PARSE_INT_RAW(defaultValue); result.option = (intVal == 1);
-#define PARSE_INT(option, defaultValue) PARSE_INT_RAW(defaultValue); result.option = intVal;
-#define PARSE_STRING(option) PARSE_STRING_RAW; result.option = stringVal;
-#define PARSE_SAFE_STRING(option) PARSE_STRING_RAW; result.option = SafeString(createSafeByteArray(stringVal));
-#define PARSE_URL(option) {PARSE_STRING_RAW; result.option = URL::fromString(stringVal);}
-
-
-ClientOptions MainController::parseClientOptions(const std::string& optionString) {
- ClientOptions result;
- size_t i = 0;
- int intVal = 0;
- std::string stringVal;
- std::vector<std::string> segments = String::split(optionString, ',');
-
- PARSE_BOOL(useStreamCompression, 1);
- PARSE_INT_RAW(-1);
- switch (intVal) {
- case 1: result.useTLS = ClientOptions::NeverUseTLS;break;
- case 2: result.useTLS = ClientOptions::UseTLSWhenAvailable;break;
- case 3: result.useTLS = ClientOptions::RequireTLS;break;
- default:;
- }
- PARSE_BOOL(allowPLAINWithoutTLS, 0);
- PARSE_BOOL(useStreamResumption, 0);
- PARSE_BOOL(useAcks, 1);
- PARSE_STRING(manualHostname);
- PARSE_INT(manualPort, -1);
- PARSE_INT_RAW(-1);
- switch (intVal) {
- case 1: result.proxyType = ClientOptions::NoProxy;break;
- case 2: result.proxyType = ClientOptions::SystemConfiguredProxy;break;
- case 3: result.proxyType = ClientOptions::SOCKS5Proxy;break;
- case 4: result.proxyType = ClientOptions::HTTPConnectProxy;break;
- }
- PARSE_STRING(manualProxyHostname);
- PARSE_INT(manualProxyPort, -1);
- PARSE_URL(boshURL);
- PARSE_URL(boshHTTPConnectProxyURL);
- PARSE_SAFE_STRING(boshHTTPConnectProxyAuthID);
- PARSE_SAFE_STRING(boshHTTPConnectProxyAuthPassword);
- PARSE_BOOL(tlsOptions.schannelTLS1_0Workaround, false);
-
- return result;
-}
-
-}
diff --git a/Swift/Controllers/MainController.h b/Swift/Controllers/MainController.h
deleted file mode 100644
index cc3d45f..0000000
--- a/Swift/Controllers/MainController.h
+++ /dev/null
@@ -1,201 +0,0 @@
-/*
- * Copyright (c) 2010-2016 Isode Limited.
- * All rights reserved.
- * See the COPYING file for more information.
- */
-
-#pragma once
-
-#include <map>
-#include <memory>
-#include <string>
-#include <vector>
-
-#include <boost/signals2.hpp>
-
-#include <Swiften/Client/ClientError.h>
-#include <Swiften/Client/ClientXMLTracer.h>
-#include <Swiften/Elements/CapsInfo.h>
-#include <Swiften/Elements/DiscoInfo.h>
-#include <Swiften/Elements/ErrorPayload.h>
-#include <Swiften/Elements/Presence.h>
-#include <Swiften/Elements/VCard.h>
-#include <Swiften/JID/JID.h>
-#include <Swiften/Network/Timer.h>
-
-#include <Swift/Controllers/ProfileSettingsProvider.h>
-#include <Swift/Controllers/Settings/SettingsProvider.h>
-#include <Swift/Controllers/UIEvents/UIEvent.h>
-#include <Swift/Controllers/XMPPEvents/ErrorEvent.h>
-
-namespace Swift {
- class IdleDetector;
- class UIFactory;
- class EventLoop;
- class Client;
- class ChatController;
- class ChatsManager;
- class CertificateStorageFactory;
- class CertificateStorage;
- class CertificateStorageTrustChecker;
- class EventController;
- class MainWindow;
- class RosterController;
- class LoginWindow;
- class EventLoop;
- class MUCController;
- class Notifier;
- class ProfileController;
- class ShowProfileController;
- class ContactEditController;
- class TogglableNotifier;
- class PresenceNotifier;
- class EventNotifier;
- class SystemTray;
- class SystemTrayController;
- class SoundEventController;
- class SoundPlayer;
- class XMLConsoleController;
- class HistoryViewController;
- class HistoryController;
- class FileTransferListController;
- class UIEventStream;
- class EventWindowFactory;
- class EventWindowController;
- class MUCSearchController;
- class UserSearchController;
- class StatusTracker;
- class Dock;
- class Storages;
- class StoragesFactory;
- class NetworkFactories;
- class URIHandler;
- class XMPPURIController;
- class AdHocManager;
- class AdHocCommandWindowFactory;
- class FileTransferOverview;
- class WhiteboardManager;
- class HighlightManager;
- class HighlightEditorController;
- class BlockListController;
- class ContactSuggester;
- class ContactsFromXMPPRoster;
-
- class MainController {
- public:
- MainController(
- EventLoop* eventLoop,
- NetworkFactories* networkFactories,
- UIFactory* uiFactories,
- SettingsProvider *settings,
- SystemTray* systemTray,
- SoundPlayer* soundPlayer,
- StoragesFactory* storagesFactory,
- CertificateStorageFactory* certificateStorageFactory,
- Dock* dock,
- Notifier* notifier,
- URIHandler* uriHandler,
- IdleDetector* idleDetector,
- const std::map<std::string, std::string>& emoticons,
- bool useDelayForLatency);
- ~MainController();
-
-
- private:
- void resetClient();
- void handleConnected();
- void handleLoginRequest(const std::string& username, const std::string& password, const std::string& certificatePath, CertificateWithKey::ref certificate, const ClientOptions& options, bool remember, bool loginAutomatically);
- void handleCancelLoginRequest();
- void handleQuitRequest();
- void handleChangeStatusRequest(StatusShow::Type show, const std::string &statusText);
- void handleDisconnected(const boost::optional<ClientError>& error);
- void handleServerDiscoInfoResponse(std::shared_ptr<DiscoInfo>, ErrorPayload::ref);
- void handleEventQueueLengthChange(int count);
- void handleVCardReceived(const JID& j, VCard::ref vCard);
- void handleSettingChanged(const std::string& settingPath);
- void handlePurgeSavedLoginRequest(const std::string& username);
- void sendPresence(std::shared_ptr<Presence> presence);
- void handleInputIdleChanged(bool);
- void handleShowCertificateRequest();
- void logout();
- void signOut();
- void setReconnectTimer();
- void resetPendingReconnects();
- void resetCurrentError();
- void enableMessageCarbons();
-
- void performLoginFromCachedCredentials();
- void reconnectAfterError();
- void setManagersOffline();
- void handleNotificationClicked(const JID& jid);
- void handleForceQuit();
- void purgeCachedCredentials();
- std::string serializeClientOptions(const ClientOptions& options);
- ClientOptions parseClientOptions(const std::string& optionString);
-
- private:
- EventLoop* eventLoop_;
- NetworkFactories* networkFactories_;
- UIFactory* uiFactory_;
- StoragesFactory* storagesFactory_;
- Storages* storages_;
- CertificateStorageFactory* certificateStorageFactory_;
- CertificateStorage* certificateStorage_;
- CertificateStorageTrustChecker* certificateTrustChecker_;
- bool clientInitialized_;
- std::shared_ptr<Client> client_;
- SettingsProvider *settings_;
- ProfileSettingsProvider* profileSettings_;
- Dock* dock_;
- URIHandler* uriHandler_;
- IdleDetector* idleDetector_;
- TogglableNotifier* notifier_;
- PresenceNotifier* presenceNotifier_;
- EventNotifier* eventNotifier_;
- RosterController* rosterController_;
- EventController* eventController_;
- EventWindowController* eventWindowController_;
- AdHocManager* adHocManager_;
- LoginWindow* loginWindow_;
- UIEventStream* uiEventStream_;
- XMLConsoleController* xmlConsoleController_;
- HistoryViewController* historyViewController_;
- HistoryController* historyController_;
- FileTransferListController* fileTransferListController_;
- BlockListController* blockListController_;
- ChatsManager* chatsManager_;
- ProfileController* profileController_;
- ShowProfileController* showProfileController_;
- ContactEditController* contactEditController_;
- ContactsFromXMPPRoster* contactsFromRosterProvider_;
- ContactSuggester* contactSuggesterWithoutRoster_;
- ContactSuggester* contactSuggesterWithRoster_;
- JID jid_;
- JID boundJID_;
- SystemTrayController* systemTrayController_;
- SoundEventController* soundEventController_;
- XMPPURIController* xmppURIController_;
- std::string vCardPhotoHash_;
- std::string password_;
- CertificateWithKey::ref certificate_;
- ClientOptions clientOptions_;
- std::shared_ptr<ErrorEvent> lastDisconnectError_;
- bool useDelayForLatency_;
- UserSearchController* userSearchControllerChat_;
- UserSearchController* userSearchControllerAdd_;
- UserSearchController* userSearchControllerInvite_;
- int timeBeforeNextReconnect_;
- Timer::ref reconnectTimer_;
- StatusTracker* statusTracker_;
- bool myStatusLooksOnline_ = false;
- bool quitRequested_;
- bool offlineRequested_;
- static const int SecondsToWaitBeforeForceQuitting;
- FileTransferOverview* ftOverview_;
- WhiteboardManager* whiteboardManager_;
- HighlightManager* highlightManager_;
- HighlightEditorController* highlightEditorController_;
- std::map<std::string, std::string> emoticons_;
- boost::signals2::connection enableCarbonsRequestHandlerConnection_;
- };
-}
diff --git a/Swift/Controllers/Roster/LeastCommonSubsequence.h b/Swift/Controllers/Roster/LeastCommonSubsequence.h
index 8daa20c..7988ee7 100644
--- a/Swift/Controllers/Roster/LeastCommonSubsequence.h
+++ b/Swift/Controllers/Roster/LeastCommonSubsequence.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2011-2016 Isode Limited.
+ * Copyright (c) 2011-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -32,7 +32,7 @@ namespace Swift {
Predicate predicate;
for (size_t i = 1; i < width; ++i) {
for (size_t j = 1; j < height; ++j) {
- result[i + j*width] = predicate(*(xBegin + boost::numeric_cast<long long>(i)-1), *(yBegin + boost::numeric_cast<long long >(j)-1)) ? result[(i-1) + (j-1)*width] + 1 : std::max(result[i + (j-1)*width], result[i-1 + (j*width)]);
+ result[i + j*width] = predicate(*(xBegin + static_cast<long long>(i)-1), *(yBegin + static_cast<long long>(j)-1)) ? result[(i-1) + (j-1)*width] + 1 : std::max(result[i + (j-1)*width], result[i-1 + (j*width)]);
}
}
}
diff --git a/Swift/Controllers/Roster/RosterController.cpp b/Swift/Controllers/Roster/RosterController.cpp
index f5de801..90c5ce1 100644
--- a/Swift/Controllers/Roster/RosterController.cpp
+++ b/Swift/Controllers/Roster/RosterController.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -31,6 +31,7 @@
#include <Swiften/Roster/XMPPRosterItem.h>
#include <Swiften/VCards/VCardManager.h>
+#include <Swift/Controllers/Chat/Chattables.h>
#include <Swift/Controllers/Intl.h>
#include <Swift/Controllers/Roster/GroupRosterItem.h>
#include <Swift/Controllers/Roster/ItemOperations/AppearOffline.h>
@@ -49,6 +50,7 @@
#include <Swift/Controllers/UIEvents/RemoveRosterItemUIEvent.h>
#include <Swift/Controllers/UIEvents/RenameGroupUIEvent.h>
#include <Swift/Controllers/UIEvents/RenameRosterItemUIEvent.h>
+#include <Swift/Controllers/UIEvents/UIEventStream.h>
#include <Swift/Controllers/UIInterfaces/MainWindow.h>
#include <Swift/Controllers/UIInterfaces/MainWindowFactory.h>
#include <Swift/Controllers/XMPPEvents/ErrorEvent.h>
@@ -60,14 +62,16 @@ namespace Swift {
/**
* The controller does not gain ownership of these parameters.
*/
-RosterController::RosterController(const JID& jid, XMPPRoster* xmppRoster, AvatarManager* avatarManager, MainWindowFactory* mainWindowFactory, NickManager* nickManager, NickResolver* nickResolver, PresenceOracle* presenceOracle, SubscriptionManager* subscriptionManager, EventController* eventController, UIEventStream* uiEventStream, IQRouter* iqRouter, SettingsProvider* settings, EntityCapsProvider* entityCapsManager, ClientBlockListManager* clientBlockListManager, VCardManager* vcardManager)
- : myJID_(jid), xmppRoster_(xmppRoster), mainWindowFactory_(mainWindowFactory), mainWindow_(mainWindowFactory_->createMainWindow(uiEventStream)), roster_(new Roster()), offlineFilter_(new OfflineRosterFilter()), vcardManager_(vcardManager), avatarManager_(avatarManager), nickManager_(nickManager), nickResolver_(nickResolver), presenceOracle_(presenceOracle), uiEventStream_(uiEventStream), entityCapsManager_(entityCapsManager), clientBlockListManager_(clientBlockListManager) {
+RosterController::RosterController(const JID& jid, XMPPRoster* xmppRoster, AvatarManager* avatarManager, MainWindowFactory* mainWindowFactory, NickManager* nickManager, NickResolver* nickResolver, PresenceOracle* presenceOracle, SubscriptionManager* subscriptionManager, EventController* eventController, UIEventStream* uiEventStream, IQRouter* iqRouter, SettingsProvider* settings, EntityCapsProvider* entityCapsManager, ClientBlockListManager* clientBlockListManager, VCardManager* vcardManager, Chattables& chattables)
+ : myJID_(jid), xmppRoster_(xmppRoster), mainWindowFactory_(mainWindowFactory), mainWindow_(mainWindowFactory_->createMainWindow(chattables, uiEventStream)), roster_(new Roster()), offlineFilter_(new OfflineRosterFilter()), vcardManager_(vcardManager), avatarManager_(avatarManager), nickManager_(nickManager), nickResolver_(nickResolver), presenceOracle_(presenceOracle), uiEventStream_(uiEventStream), entityCapsManager_(entityCapsManager), clientBlockListManager_(clientBlockListManager), chattables_(chattables) {
iqRouter_ = iqRouter;
subscriptionManager_ = subscriptionManager;
eventController_ = eventController;
settings_ = settings;
expandiness_ = new RosterGroupExpandinessPersister(roster_, settings);
+#ifndef NOT_YET
mainWindow_->setRosterModel(roster_);
+#endif
rosterVCardProvider_ = new RosterVCardProvider(roster_, vcardManager, JID::WithoutResource);
changeStatusConnection_ = mainWindow_->onChangeStatusRequest.connect(boost::bind(&RosterController::handleChangeStatusRequest, this, _1, _2));
@@ -148,6 +152,11 @@ void RosterController::handleOnJIDAdded(const JID& jid) {
roster_->addContact(jid, jid, name, QT_TRANSLATE_NOOP("", "Contacts"), avatarManager_->getAvatarPath(jid));
}
applyAllPresenceTo(jid);
+
+ chattables_.addJID(jid, Chattables::State::Type::Person);
+ auto state = chattables_.getState(jid);
+ state.name = name;
+ chattables_.setState(jid, state);
}
void RosterController::applyAllPresenceTo(const JID& jid) {
@@ -329,13 +338,17 @@ void RosterController::handleIncomingPresence(Presence::ref newPresence) {
if (newPresence->getType() == Presence::Error) {
return;
}
- Presence::ref accountPresence = presenceOracle_->getAccountPresence(newPresence->getFrom().toBare());
+ auto bareFrom = newPresence->getFrom().toBare();
+ Presence::ref accountPresence = presenceOracle_->getAccountPresence(bareFrom);
if (!accountPresence) {
accountPresence = Presence::create();
accountPresence->setFrom(newPresence->getFrom());
accountPresence->setType(Presence::Unavailable);
}
roster_->applyOnItems(SetPresence(accountPresence));
+ auto state = chattables_.getState(bareFrom);
+ state.status = accountPresence->getShow();
+ chattables_.setState(bareFrom, state);
}
void RosterController::handleSubscriptionRequest(const JID& jid, const std::string& message) {
diff --git a/Swift/Controllers/Roster/RosterController.h b/Swift/Controllers/Roster/RosterController.h
index ca2ecdc..d5a5671 100644
--- a/Swift/Controllers/Roster/RosterController.h
+++ b/Swift/Controllers/Roster/RosterController.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -24,6 +24,7 @@
namespace Swift {
class AvatarManager;
+ class Chattables;
class ClientBlockListManager;
class EntityCapsProvider;
class EventController;
@@ -49,7 +50,7 @@ namespace Swift {
class RosterController {
public:
- RosterController(const JID& jid, XMPPRoster* xmppRoster, AvatarManager* avatarManager, MainWindowFactory* mainWindowFactory, NickManager* nickManager, NickResolver* nickResolver, PresenceOracle* presenceOracle, SubscriptionManager* subscriptionManager, EventController* eventController, UIEventStream* uiEventStream, IQRouter* iqRouter, SettingsProvider* settings, EntityCapsProvider* entityCapsProvider, ClientBlockListManager* clientBlockListManager, VCardManager* vcardManager);
+ RosterController(const JID& jid, XMPPRoster* xmppRoster, AvatarManager* avatarManager, MainWindowFactory* mainWindowFactory, NickManager* nickManager, NickResolver* nickResolver, PresenceOracle* presenceOracle, SubscriptionManager* subscriptionManager, EventController* eventController, UIEventStream* uiEventStream, IQRouter* iqRouter, SettingsProvider* settings, EntityCapsProvider* entityCapsProvider, ClientBlockListManager* clientBlockListManager, VCardManager* vcardManager, Chattables& chattables);
~RosterController();
void showRosterWindow();
void setJID(const JID& jid) { myJID_ = jid; }
@@ -112,6 +113,7 @@ namespace Swift {
UIEventStream* uiEventStream_;
EntityCapsProvider* entityCapsManager_;
ClientBlockListManager* clientBlockListManager_;
+ Chattables& chattables_;
RosterVCardProvider* rosterVCardProvider_;
std::shared_ptr<ContactRosterItem> ownContact_;
std::unique_ptr<FeatureOracle> featureOracle_;
diff --git a/Swift/Controllers/Roster/TableRoster.cpp b/Swift/Controllers/Roster/TableRoster.cpp
index 713f390..01bf4a6 100644
--- a/Swift/Controllers/Roster/TableRoster.cpp
+++ b/Swift/Controllers/Roster/TableRoster.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2011-2016 Isode Limited.
+ * Copyright (c) 2011-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -132,15 +132,20 @@ void TableRoster::handleUpdateTimerTick() {
std::vector<size_t> itemRemoves;
std::vector<size_t> itemInserts;
computeIndexDiff<Item, ItemEquals, ItemNeedsUpdate >(sections[sectionUpdates[i]].items, newSections[sectionPostUpdates[i]].items, itemUpdates, itemPostUpdates, itemRemoves, itemInserts);
- size_t end = update.insertedRows.size();
- update.insertedRows.resize(update.insertedRows.size() + itemInserts.size());
- std::transform(itemInserts.begin(), itemInserts.end(), update.insertedRows.begin() + boost::numeric_cast<long long>(end), CreateIndexForSection(sectionPostUpdates[i]));
- end = update.deletedRows.size();
- update.deletedRows.resize(update.deletedRows.size() + itemRemoves.size());
- std::transform(itemRemoves.begin(), itemRemoves.end(), update.deletedRows.begin() + boost::numeric_cast<long long>(end), CreateIndexForSection(sectionUpdates[i]));
- end = update.updatedRows.size();
- update.updatedRows.resize(update.updatedRows.size() + itemUpdates.size());
- std::transform(itemUpdates.begin(), itemUpdates.end(), update.updatedRows.begin() + boost::numeric_cast<long long>(end), CreateIndexForSection(sectionPostUpdates[i]));
+ try {
+ size_t end = update.insertedRows.size();
+ update.insertedRows.resize(update.insertedRows.size() + itemInserts.size());
+ std::transform(itemInserts.begin(), itemInserts.end(), update.insertedRows.begin() + boost::numeric_cast<long long>(end), CreateIndexForSection(sectionPostUpdates[i]));
+ end = update.deletedRows.size();
+ update.deletedRows.resize(update.deletedRows.size() + itemRemoves.size());
+ std::transform(itemRemoves.begin(), itemRemoves.end(), update.deletedRows.begin() + boost::numeric_cast<long long>(end), CreateIndexForSection(sectionUpdates[i]));
+ end = update.updatedRows.size();
+ update.updatedRows.resize(update.updatedRows.size() + itemUpdates.size());
+ std::transform(itemUpdates.begin(), itemUpdates.end(), update.updatedRows.begin() + boost::numeric_cast<long long>(end), CreateIndexForSection(sectionPostUpdates[i]));
+ }
+ catch (const boost::numeric::bad_numeric_cast&) {
+ // If any container claims it has more than long long max items, we have bigger issues, so letting this pass
+ }
}
// Switch the old model with the new
diff --git a/Swift/Controllers/Roster/UnitTest/RosterControllerTest.cpp b/Swift/Controllers/Roster/UnitTest/RosterControllerTest.cpp
index 9b64def..0a9ea18 100644
--- a/Swift/Controllers/Roster/UnitTest/RosterControllerTest.cpp
+++ b/Swift/Controllers/Roster/UnitTest/RosterControllerTest.cpp
@@ -1,9 +1,11 @@
/*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
+#include <memory>
+
#include <cppunit/extensions/HelperMacros.h>
#include <cppunit/extensions/TestFactoryRegistry.h>
@@ -32,6 +34,7 @@
#include <Swiften/VCards/VCardManager.h>
#include <Swiften/VCards/VCardMemoryStorage.h>
+#include <Swift/Controllers/Chat/Chattables.h>
#include <Swift/Controllers/Roster/ContactRosterItem.h>
#include <Swift/Controllers/Roster/GroupRosterItem.h>
#include <Swift/Controllers/Roster/Roster.h>
@@ -62,6 +65,7 @@ class RosterControllerTest : public CppUnit::TestFixture {
CPPUNIT_TEST(testRemoveResultsInUnavailablePresence);
CPPUNIT_TEST(testOwnContactInRosterPresence);
CPPUNIT_TEST(testMultiResourceFileTransferFeature);
+ //FIXME: All needs rewriting for new roster
CPPUNIT_TEST_SUITE_END();
public:
@@ -90,7 +94,8 @@ class RosterControllerTest : public CppUnit::TestFixture {
clientBlockListManager_ = new ClientBlockListManager(router_);
vcardStorage_ = new VCardMemoryStorage(crypto_);
vcardManager_ = new VCardManager(jid_, router_, vcardStorage_);
- rosterController_ = new RosterController(jid_, xmppRoster_, avatarManager_, mainWindowFactory_, nickManager_, nickResolver_, presenceOracle_, subscriptionManager_, eventController_, uiEventStream_, router_, settings_, entityCapsManager_, clientBlockListManager_, vcardManager_);
+ chattables_ = std::make_unique<Chattables>();
+ rosterController_ = new RosterController(jid_, xmppRoster_, avatarManager_, mainWindowFactory_, nickManager_, nickResolver_, presenceOracle_, subscriptionManager_, eventController_, uiEventStream_, router_, settings_, entityCapsManager_, clientBlockListManager_, vcardManager_, *chattables_);
mainWindow_ = mainWindowFactory_->last;
capsInfoGenerator_ = std::make_unique<CapsInfoGenerator>("", crypto_);
}
@@ -476,6 +481,7 @@ class RosterControllerTest : public CppUnit::TestFixture {
VCardStorage* vcardStorage_;
VCardManager* vcardManager_;
std::unique_ptr<CapsInfoGenerator> capsInfoGenerator_;
+ std::unique_ptr<Chattables> chattables_;
};
CPPUNIT_TEST_SUITE_REGISTRATION(RosterControllerTest);
diff --git a/Swift/Controllers/SConscript b/Swift/Controllers/SConscript
index 0c3127c..3840fbf 100644
--- a/Swift/Controllers/SConscript
+++ b/Swift/Controllers/SConscript
@@ -25,6 +25,7 @@ if env["SCONS_STAGE"] == "build" :
"AdHocController.cpp",
"AdHocManager.cpp",
"BlockListController.cpp",
+ "Chat/Chattables.cpp",
"Chat/ChatController.cpp",
"Chat/ChatControllerBase.cpp",
"Chat/ChatMessageParser.cpp",
@@ -40,6 +41,7 @@ if env["SCONS_STAGE"] == "build" :
"ContactsFromXMPPRoster.cpp",
"EventNotifier.cpp",
"EventWindowController.cpp",
+ "FdpFormSubmitController.cpp",
"FileTransfer/FileTransferController.cpp",
"FileTransfer/FileTransferOverview.cpp",
"FileTransfer/FileTransferProgressInfo.cpp",
@@ -50,7 +52,7 @@ if env["SCONS_STAGE"] == "build" :
"Highlighting/Highlighter.cpp",
"HistoryController.cpp",
"HistoryViewController.cpp",
- "MainController.cpp",
+ "AccountController.cpp",
"PresenceNotifier.cpp",
"PreviousStatusStore.cpp",
"ProfileController.cpp",
@@ -84,6 +86,7 @@ if env["SCONS_STAGE"] == "build" :
"Translator.cpp",
"UIEvents/UIEvent.cpp",
"UIInterfaces/ChatListWindow.cpp",
+ "UIInterfaces/FdpFormSubmitWindow.cpp",
"UIInterfaces/HighlightEditorWindow.cpp",
"UIInterfaces/XMLConsoleWidget.cpp",
"WhiteboardManager.cpp",
@@ -93,8 +96,11 @@ if env["SCONS_STAGE"] == "build" :
])
env.Append(UNITTEST_SOURCES = [
+ File("Chat/UnitTest/ChatListWindowChatTest.cpp"),
File("Chat/UnitTest/ChatMessageParserTest.cpp"),
File("Chat/UnitTest/ChatsManagerTest.cpp"),
+ File("Chat/UnitTest/ChatControllerTest.cpp"),
+ File("Chat/UnitTest/ChattablesTest.cpp"),
File("Chat/UnitTest/MUCControllerTest.cpp"),
File("Roster/UnitTest/LeastCommonSubsequenceTest.cpp"),
File("Roster/UnitTest/RosterControllerTest.cpp"),
@@ -103,6 +109,7 @@ if env["SCONS_STAGE"] == "build" :
File("Settings/UnitTest/SettingsProviderHierachyTest.cpp"),
File("UnitTest/ChatMessageSummarizerTest.cpp"),
File("UnitTest/ContactSuggesterTest.cpp"),
+ File("UnitTest/FdpFormSubmitControllerTest.cpp"),
File("UnitTest/MockChatWindow.cpp"),
File("UnitTest/PresenceNotifierTest.cpp"),
File("UnitTest/PreviousStatusStoreTest.cpp"),
diff --git a/Swift/Controllers/SettingConstants.cpp b/Swift/Controllers/SettingConstants.cpp
index f0064ba..8336200 100644
--- a/Swift/Controllers/SettingConstants.cpp
+++ b/Swift/Controllers/SettingConstants.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012-2017 Isode Limited.
+ * Copyright (c) 2012-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -14,8 +14,6 @@ const SettingsProvider::Setting<bool> SettingConstants::SHOW_NOTIFICATIONS = Set
const SettingsProvider::Setting<bool> SettingConstants::REQUEST_DELIVERYRECEIPTS = SettingsProvider::Setting<bool>("requestDeliveryReceipts", false);
const SettingsProvider::Setting<bool> SettingConstants::FORGET_PASSWORDS = SettingsProvider::Setting<bool>("forgetPasswords", false);
const SettingsProvider::Setting<bool> SettingConstants::REMEMBER_RECENT_CHATS = SettingsProvider::Setting<bool>("rememberRecentChats", true);
-const SettingsProvider::Setting<std::string> SettingConstants::LAST_LOGIN_JID = SettingsProvider::Setting<std::string>("lastLoginJID", "");
-const SettingsProvider::Setting<bool> SettingConstants::LOGIN_AUTOMATICALLY = SettingsProvider::Setting<bool>("loginAutomatically", false);
const SettingsProvider::Setting<bool> SettingConstants::SHOW_OFFLINE("showOffline", false);
const SettingsProvider::Setting<std::string> SettingConstants::EXPANDED_ROSTER_GROUPS("GroupExpandiness", "");
const SettingsProvider::Setting<bool> SettingConstants::PLAY_SOUNDS("playSounds", true);
@@ -23,6 +21,7 @@ const SettingsProvider::Setting<std::string> SettingConstants::HIGHLIGHT_RULES("
const SettingsProvider::Setting<std::string> SettingConstants::HIGHLIGHT_RULES_V2("highlightRulesV2", "@");
const SettingsProvider::Setting<std::string> SettingConstants::INVITE_AUTO_ACCEPT_MODE("inviteAutoAcceptMode", "presence");
const SettingsProvider::Setting<bool> SettingConstants::DISCONNECT_ON_CARD_REMOVAL("disconnectOnCardRemoval", true);
-const SettingsProvider::Setting<bool> SettingConstants::SINGLE_SIGN_ON("singleSignOn", false);
+const SettingsProvider::Setting<bool> SettingConstants::MUC_MARKING_ELISION("mucMarkingElision", true);
+const SettingsProvider::Setting<bool> SettingConstants::FUTURE("future", false);
}
diff --git a/Swift/Controllers/SettingConstants.h b/Swift/Controllers/SettingConstants.h
index fec2d27..68c22b7 100644
--- a/Swift/Controllers/SettingConstants.h
+++ b/Swift/Controllers/SettingConstants.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012-2017 Isode Limited.
+ * Copyright (c) 2012-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -34,8 +34,6 @@ namespace Swift {
static const SettingsProvider::Setting<bool> REQUEST_DELIVERYRECEIPTS;
static const SettingsProvider::Setting<bool> FORGET_PASSWORDS;
static const SettingsProvider::Setting<bool> REMEMBER_RECENT_CHATS;
- static const SettingsProvider::Setting<std::string> LAST_LOGIN_JID;
- static const SettingsProvider::Setting<bool> LOGIN_AUTOMATICALLY;
/**
* The #SHOW_OFFLINE setting specifies whether or not to show offline contacts in the
* roster.
@@ -85,13 +83,21 @@ namespace Swift {
*/
static const SettingsProvider::Setting<bool> DISCONNECT_ON_CARD_REMOVAL;
/**
- * The #SINGLE_SIGN_ON setting
- * specifies whether to log in using Single Sign On.
- * This is currently supported on Windows.
+ * The #MUC_MARKING_ELISION setting
+ * specifies whether or not messages with the default muc
+ * marking display their marking, and whether unmarked messages
+ * are marked as such.
*
- * If set true Swift will use GSSAPI authentication to
- * log in the user; else not.
+ * If set true, unmarked messages will be marked with the marking
+ * "unmarked", and messages with the room default marking will
+ * have their markings stripped.
*/
- static const SettingsProvider::Setting<bool> SINGLE_SIGN_ON;
+ static const SettingsProvider::Setting<bool> MUC_MARKING_ELISION;
+
+ /**
+ * The #FUTURE setting enables use of experimental features
+ * planned for future releases.
+ */
+ static const SettingsProvider::Setting<bool> FUTURE;
};
}
diff --git a/Swift/Controllers/Settings/XMLSettingsProvider.cpp b/Swift/Controllers/Settings/XMLSettingsProvider.cpp
index 2573af0..a316cef 100644
--- a/Swift/Controllers/Settings/XMLSettingsProvider.cpp
+++ b/Swift/Controllers/Settings/XMLSettingsProvider.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012-2016 Isode Limited.
+ * Copyright (c) 2012-2019 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -18,16 +18,16 @@ namespace Swift {
XMLSettingsProvider::XMLSettingsProvider(const std::string& xmlConfig) : level_(0) {
if (!xmlConfig.empty()) {
PlatformXMLParserFactory factory;
- auto parser = factory.createXMLParser(this);
+ auto parser = factory.createXMLParser(this, true);
if (parser->parse(xmlConfig)) {
- SWIFT_LOG(debug) << "Found and parsed system config" << std::endl;
+ SWIFT_LOG(debug) << "Found and parsed system config";
}
else {
- SWIFT_LOG(debug) << "Found invalid system config" << std::endl;
+ SWIFT_LOG(debug) << "Found invalid system config";
}
}
else {
- SWIFT_LOG(debug) << "No system config found" << std::endl;
+ SWIFT_LOG(debug) << "No system config found";
}
}
@@ -68,7 +68,7 @@ int XMLSettingsProvider::getSetting(const Setting<int>& setting) {
if (values_.find(setting.getKey()) != values_.end()) {
std::string value = values_[setting.getKey()];
try {
- return value.empty() ? setting.getDefaultValue() : boost::lexical_cast<int>(value);;
+ return value.empty() ? setting.getDefaultValue() : boost::lexical_cast<int>(value);
}
catch(boost::bad_lexical_cast &) {}
}
@@ -110,7 +110,7 @@ void XMLSettingsProvider::handleStartElement(const std::string& element, const s
void XMLSettingsProvider::handleEndElement(const std::string& /*element*/, const std::string& /*ns*/) {
if (level_ == SettingLevel) {
values_[currentElement_] = currentText_;
- SWIFT_LOG(debug) << "Setting value of " << currentElement_ << " to " << currentText_ << std::endl;
+ SWIFT_LOG(debug) << "Setting value of " << currentElement_ << " to " << currentText_;
}
level_--;
}
@@ -123,7 +123,3 @@ void XMLSettingsProvider::handleCharacterData(const std::string& data) {
}
-
-
-
-
diff --git a/Swift/Controllers/StatusCache.cpp b/Swift/Controllers/StatusCache.cpp
index 3c6baed..f9196f6 100644
--- a/Swift/Controllers/StatusCache.cpp
+++ b/Swift/Controllers/StatusCache.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012-2016 Isode Limited.
+ * Copyright (c) 2012-2019 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -76,13 +76,13 @@ void StatusCache::loadRecents() {
previousStatuses_.push_back(PreviousStatus(boost::trim_copy(bits[1]), type));
}
catch (const boost::bad_lexical_cast& e) {
- SWIFT_LOG(error) << "Failed to load recent status cache entry: " << e.what() << std::endl;
+ SWIFT_LOG(error) << "Failed to load recent status cache entry: " << e.what();
}
}
}
}
catch (const boost::filesystem::filesystem_error& e) {
- SWIFT_LOG(error) << "Failed to load recents: " << e.what() << std::endl;
+ SWIFT_LOG(error) << "Failed to load recents: " << e.what();
}
}
@@ -100,7 +100,7 @@ void StatusCache::saveRecents() {
file.close();
}
catch (const boost::filesystem::filesystem_error& e) {
- SWIFT_LOG(error) << "Failed to save recents: " << e.what() << std::endl;
+ SWIFT_LOG(error) << "Failed to save recents: " << e.what();
}
}
diff --git a/Swift/Controllers/Storages/AvatarFileStorage.cpp b/Swift/Controllers/Storages/AvatarFileStorage.cpp
index a103920..808c432 100644
--- a/Swift/Controllers/Storages/AvatarFileStorage.cpp
+++ b/Swift/Controllers/Storages/AvatarFileStorage.cpp
@@ -1,16 +1,15 @@
/*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2019 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
#include <Swift/Controllers/Storages/AvatarFileStorage.h>
-#include <iostream>
-
#include <boost/filesystem.hpp>
#include <boost/filesystem/fstream.hpp>
+#include <Swiften/Base/Log.h>
#include <Swiften/Base/String.h>
#include <Swiften/Crypto/CryptoProvider.h>
#include <Swiften/StringCodecs/Hexify.h>
@@ -31,13 +30,13 @@ AvatarFileStorage::AvatarFileStorage(const boost::filesystem::path& avatarsDir,
jidAvatars.insert(std::make_pair(jid, r.first));
}
else if (!r.first.empty() || !r.second.empty()) {
- std::cerr << "Invalid entry in avatars file: " << r.second << std::endl;
+ SWIFT_LOG(error) << "Invalid entry in avatars file: " << r.second;
}
}
}
}
catch (...) {
- std::cerr << "Error reading avatars file" << std::endl;
+ SWIFT_LOG(error) << "Error reading avatars file";
}
}
}
@@ -55,12 +54,17 @@ void AvatarFileStorage::addAvatar(const std::string& hash, const ByteArray& avat
boost::filesystem::create_directories(avatarPath.parent_path());
}
catch (const boost::filesystem::filesystem_error& e) {
- std::cerr << "ERROR: " << e.what() << std::endl;
+ SWIFT_LOG(error) << "filesystem error: " << e.what();
}
}
- boost::filesystem::ofstream file(avatarPath, boost::filesystem::ofstream::binary|boost::filesystem::ofstream::out);
- file.write(reinterpret_cast<const char*>(vecptr(avatar)), static_cast<std::streamsize>(avatar.size()));
- file.close();
+
+ try {
+ boost::filesystem::ofstream file(avatarPath, boost::filesystem::ofstream::binary|boost::filesystem::ofstream::out);
+ file.write(reinterpret_cast<const char*>(vecptr(avatar)), static_cast<std::streamsize>(avatar.size()));
+ }
+ catch (const boost::filesystem::filesystem_error& e) {
+ SWIFT_LOG(error) << "filesystem error: " << e.what();
+ }
}
boost::filesystem::path AvatarFileStorage::getAvatarPath(const std::string& hash) const {
@@ -69,7 +73,12 @@ boost::filesystem::path AvatarFileStorage::getAvatarPath(const std::string& hash
ByteArray AvatarFileStorage::getAvatar(const std::string& hash) const {
ByteArray data;
- readByteArrayFromFile(data, getAvatarPath(hash));
+ try {
+ readByteArrayFromFile(data, getAvatarPath(hash));
+ }
+ catch (const boost::filesystem::filesystem_error& e) {
+ SWIFT_LOG(error) << "filesystem error: " << e.what();
+ }
return data;
}
@@ -98,7 +107,7 @@ void AvatarFileStorage::saveJIDAvatars() {
file.close();
}
catch (...) {
- std::cerr << "Error writing avatars file" << std::endl;
+ SWIFT_LOG(error) << "Error writing avatars file";
}
}
diff --git a/Swift/Controllers/Storages/CertificateFileStorage.cpp b/Swift/Controllers/Storages/CertificateFileStorage.cpp
index 3fe6d54..a8661df 100644
--- a/Swift/Controllers/Storages/CertificateFileStorage.cpp
+++ b/Swift/Controllers/Storages/CertificateFileStorage.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2019 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -31,7 +31,7 @@ bool CertificateFileStorage::hasCertificate(Certificate::ref certificate) const
return true;
}
else {
- SWIFT_LOG(warning) << "Stored certificate does not match received certificate" << std::endl;
+ SWIFT_LOG(warning) << "Stored certificate does not match received certificate";
return false;
}
}
@@ -50,10 +50,15 @@ void CertificateFileStorage::addCertificate(Certificate::ref certificate) {
std::cerr << "ERROR: " << e.what() << std::endl;
}
}
- boost::filesystem::ofstream file(certificatePath, boost::filesystem::ofstream::binary|boost::filesystem::ofstream::out);
- ByteArray data = certificate->toDER();
- file.write(reinterpret_cast<const char*>(vecptr(data)), boost::numeric_cast<std::streamsize>(data.size()));
- file.close();
+ try {
+ boost::filesystem::ofstream file(certificatePath, boost::filesystem::ofstream::binary|boost::filesystem::ofstream::out);
+ ByteArray data = certificate->toDER();
+ file.write(reinterpret_cast<const char*>(vecptr(data)), boost::numeric_cast<std::streamsize>(data.size()));
+ file.close();
+ }
+ catch (...) {
+ SWIFT_LOG(warning) << "Failed to store certificate to " << certificatePath;
+ }
}
boost::filesystem::path CertificateFileStorage::getCertificatePath(Certificate::ref certificate) const {
diff --git a/Swift/Controllers/UIEvents/FdpFormSubmitWindowOpenUIEvent.h b/Swift/Controllers/UIEvents/FdpFormSubmitWindowOpenUIEvent.h
new file mode 100644
index 0000000..d540cb2
--- /dev/null
+++ b/Swift/Controllers/UIEvents/FdpFormSubmitWindowOpenUIEvent.h
@@ -0,0 +1,17 @@
+/*
+ * Copyright (c) 2018 Isode Limited.
+ * All rights reserved.
+ * See the COPYING file for more information.
+ */
+
+#pragma once
+
+#include <Swift/Controllers/UIEvents/UIEvent.h>
+
+namespace Swift {
+ class FdpFormSubmitWindowOpenUIEvent : public UIEvent {
+ public:
+ FdpFormSubmitWindowOpenUIEvent() {
+ }
+ };
+}
diff --git a/Swift/Controllers/UIEvents/JoinMUCUIEvent.h b/Swift/Controllers/UIEvents/JoinMUCUIEvent.h
index 5d6df55..78103a8 100644
--- a/Swift/Controllers/UIEvents/JoinMUCUIEvent.h
+++ b/Swift/Controllers/UIEvents/JoinMUCUIEvent.h
@@ -19,7 +19,7 @@ namespace Swift {
class JoinMUCUIEvent : public UIEvent {
public:
typedef std::shared_ptr<JoinMUCUIEvent> ref;
- JoinMUCUIEvent(const JID& jid, const boost::optional<std::string>& password = boost::optional<std::string>(), const boost::optional<std::string>& nick = boost::optional<std::string>(), bool joinAutomaticallyInFuture = false, bool createAsReservedRoomIfNew = false, bool isImpromptu = false, bool isContinuation = false) : jid_(jid), nick_(nick), joinAutomatically_(joinAutomaticallyInFuture), createAsReservedRoomIfNew_(createAsReservedRoomIfNew), password_(password), isImpromptuMUC_(isImpromptu), isContinuation_(isContinuation) {}
+ JoinMUCUIEvent(const JID& jid, const boost::optional<std::string>& password = boost::optional<std::string>(), const boost::optional<std::string>& nick = boost::optional<std::string>(), bool createAsReservedRoomIfNew = false, bool isImpromptu = false, bool isContinuation = false) : jid_(jid), nick_(nick), createAsReservedRoomIfNew_(createAsReservedRoomIfNew), password_(password), isImpromptuMUC_(isImpromptu), isContinuation_(isContinuation) {}
const boost::optional<std::string>& getNick() const {return nick_;}
const JID& getJID() const {return jid_;}
bool getShouldJoinAutomatically() const {return joinAutomatically_;}
diff --git a/Swift/Controllers/UIInterfaces/ChatListWindow.h b/Swift/Controllers/UIInterfaces/ChatListWindow.h
index 29097e9..6aa729b 100644
--- a/Swift/Controllers/UIInterfaces/ChatListWindow.h
+++ b/Swift/Controllers/UIInterfaces/ChatListWindow.h
@@ -26,7 +26,7 @@ namespace Swift {
class Chat {
public:
Chat() : statusType(StatusShow::None), isMUC(false), unreadCount(0), isPrivateMessage(false) {}
- Chat(const JID& jid, const std::string& chatName, const std::string& activity, int unreadCount, StatusShow::Type statusType, const boost::filesystem::path& avatarPath, bool isMUC, bool isPrivateMessage = false, const std::string& nick = "", const boost::optional<std::string> password = boost::optional<std::string>())
+ Chat(const JID& jid, const std::string& chatName, const std::string& activity, size_t unreadCount, StatusShow::Type statusType, const boost::filesystem::path& avatarPath, bool isMUC, bool isPrivateMessage = false, const std::string& nick = "", const boost::optional<std::string> password = boost::optional<std::string>())
: jid(jid), chatName(chatName), activity(activity), statusType(statusType), isMUC(isMUC), nick(nick), password(password), unreadCount(unreadCount), avatarPath(avatarPath), isPrivateMessage(isPrivateMessage) {}
/** Assume that nicks and other transient features aren't important for equality */
bool operator==(const Chat& other) const {
@@ -53,7 +53,7 @@ namespace Swift {
return key_compare(inviteesNames, other.inviteesNames);
}
}
- void setUnreadCount(int unread) {
+ void setUnreadCount(size_t unread) {
unreadCount = unread;
}
void setStatusType(StatusShow::Type type) {
@@ -93,7 +93,7 @@ namespace Swift {
bool isMUC;
std::string nick;
boost::optional<std::string> password;
- int unreadCount;
+ size_t unreadCount;
boost::filesystem::path avatarPath;
std::map<std::string, JID> impromptuJIDs;
std::map<JID, std::string> inviteesNames;
@@ -107,7 +107,7 @@ namespace Swift {
virtual void removeWhiteboardSession(const JID& jid) = 0;
virtual void removeMUCBookmark(const MUCBookmark& bookmark) = 0;
virtual void setRecents(const std::list<Chat>& recents) = 0;
- virtual void setUnreadCount(int unread) = 0;
+ virtual void setUnreadCount(size_t unread) = 0;
virtual void clearBookmarks() = 0;
virtual void setOnline(bool isOnline) = 0;
diff --git a/Swift/Controllers/UIInterfaces/ChatWindow.h b/Swift/Controllers/UIInterfaces/ChatWindow.h
index 8273802..1c36ffc 100644
--- a/Swift/Controllers/UIInterfaces/ChatWindow.h
+++ b/Swift/Controllers/UIInterfaces/ChatWindow.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010-2017 Isode Limited.
+ * Copyright (c) 2010-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -33,6 +33,8 @@ namespace Swift {
class ContactRosterItem;
class FileTransferController;
class UserSearchWindow;
+ class DiscoInfo;
+ class ErrorPayload;
class ChatWindow {
@@ -139,7 +141,7 @@ namespace Swift {
enum AckState {Pending, Received, Failed};
enum ReceiptState {ReceiptRequested, ReceiptReceived, ReceiptFailed};
enum OccupantAction {Kick, Ban, MakeModerator, MakeParticipant, MakeVisitor, AddContact, ShowProfile};
- enum RoomAction {ChangeSubject, Configure, Affiliations, Destroy, Invite};
+ enum RoomAction {ChangeSubject, Configure, Affiliations, Destroy, Invite, Leave};
enum FileTransferState {
Initialisation, ///< Collecting information required for sending the request out.
WaitingForAccept, ///< The file transfer request was send out.
@@ -200,7 +202,7 @@ namespace Swift {
virtual void setSecurityLabelsEnabled(bool enabled) = 0;
virtual void setCorrectionEnabled(Tristate enabled) = 0;
virtual void setFileTransferEnabled(Tristate enabled) = 0;
- virtual void setUnreadMessageCount(int count) = 0;
+ virtual void setUnreadMessageCount(size_t count) = 0;
virtual void convertToMUC(MUCType mucType) = 0;
// virtual TreeWidget *getTreeWidget() = 0;
virtual void setSecurityLabelsError() = 0;
@@ -219,6 +221,9 @@ namespace Swift {
virtual void showBookmarkWindow(const MUCBookmark& bookmark) = 0;
virtual void setBookmarkState(RoomBookmarkState bookmarkState) = 0;
+ virtual void setChatSecurityMarking(const std::string& markingValue, const std::string& markingForegroundColorValue, const std::string& markingBackgroundColorValue) = 0;
+ virtual void removeChatSecurityMarking() = 0;
+
/**
* A handle that uniquely identities an alert message.
*/
@@ -249,6 +254,7 @@ namespace Swift {
boost::signals2::signal<void ()> onClosed;
boost::signals2::signal<void ()> onAllMessagesRead;
boost::signals2::signal<void (const std::string&, bool isCorrection)> onSendMessageRequest;
+ boost::signals2::signal<void (const std::string&)> onResendMessageRequest;
boost::signals2::signal<void ()> onSendCorrectionMessageRequest;
boost::signals2::signal<void ()> onUserTyping;
boost::signals2::signal<void ()> onUserCancelsTyping;
@@ -282,4 +288,3 @@ namespace Swift {
boost::signals2::signal<void ()> onUnblockUserRequest;
};
}
-
diff --git a/Swift/Controllers/UIInterfaces/FdpFormSubmitWindow.cpp b/Swift/Controllers/UIInterfaces/FdpFormSubmitWindow.cpp
new file mode 100644
index 0000000..47ef9cd
--- /dev/null
+++ b/Swift/Controllers/UIInterfaces/FdpFormSubmitWindow.cpp
@@ -0,0 +1,32 @@
+/*
+ * Copyright (c) 2018 Isode Limited.
+ * All rights reserved.
+ * See the COPYING file for more information.
+ */
+
+#include <Swift/Controllers/UIInterfaces/FdpFormSubmitWindow.h>
+
+#include <Swift/Controllers/Intl.h>
+
+namespace Swift {
+
+std::string FdpFormSubmitWindow::getNodeErrorText(NodeError nodeError) const {
+ switch(nodeError) {
+ case NodeError::DomainNotFound: return QT_TRANSLATE_NOOP("", "Error: No pubsub domain found");
+ case NodeError::NoFdpNodesInDomain: return QT_TRANSLATE_NOOP("", "Error: Domain does not contain an FDP template node");
+ case NodeError::NoError: return "";
+ }
+ return "";
+}
+
+std::string FdpFormSubmitWindow::getTemplateErrorText(TemplateError templateError) const {
+ switch(templateError) {
+ case TemplateError::CannotLocateForm: return QT_TRANSLATE_NOOP("", "Error: Could not locate template form");
+ case TemplateError::InvalidPayload: return QT_TRANSLATE_NOOP("", "Error: Invalid payload returned from node");
+ case TemplateError::RequestFailed: return QT_TRANSLATE_NOOP("", "Error: Pubsub request failed");
+ case TemplateError::NoError: return "";
+ }
+ return "";
+}
+
+}
diff --git a/Swift/Controllers/UIInterfaces/FdpFormSubmitWindow.h b/Swift/Controllers/UIInterfaces/FdpFormSubmitWindow.h
new file mode 100644
index 0000000..572f910
--- /dev/null
+++ b/Swift/Controllers/UIInterfaces/FdpFormSubmitWindow.h
@@ -0,0 +1,54 @@
+/*
+ * Copyright (c) 2018 Isode Limited.
+ * All rights reserved.
+ * See the COPYING file for more information.
+ */
+
+#pragma once
+
+#include <memory>
+#include <string>
+
+#include <boost/signals2.hpp>
+
+namespace Swift {
+
+ class Form;
+
+ class FdpFormSubmitWindow {
+
+ public:
+ enum class NodeError {
+ DomainNotFound,
+ NoFdpNodesInDomain,
+ NoError,
+ };
+ enum class TemplateError {
+ CannotLocateForm,
+ InvalidPayload,
+ RequestFailed,
+ NoError,
+ };
+
+ virtual ~FdpFormSubmitWindow() {}
+
+ virtual void show() = 0;
+ virtual void raise() = 0;
+ virtual void addNode(const std::string& node, const std::string& nodeName) = 0;
+ virtual void clearNodeData() = 0;
+ virtual void setFormData(const std::shared_ptr<Form>& form) = 0;
+ virtual void showNodePlaceholder(NodeError nodeError) = 0;
+ virtual void showFormPlaceholder(TemplateError templateError) = 0;
+ virtual void handleSubmitServerResponse(bool submissionSuccess) = 0;
+
+ boost::signals2::signal<void ()> onCloseEvent;
+ boost::signals2::signal<void (const std::string&)> onRequestPubSubNodeData;
+ boost::signals2::signal<void (const std::string&)> onRequestTemplateForm;
+ boost::signals2::signal<void (const std::shared_ptr<Form>&)> onSubmitForm;
+
+ protected:
+
+ std::string getNodeErrorText(NodeError nodeError) const;
+ std::string getTemplateErrorText(TemplateError templateError) const;
+ };
+}
diff --git a/Swift/Controllers/UIInterfaces/FdpFormSubmitWindowFactory.h b/Swift/Controllers/UIInterfaces/FdpFormSubmitWindowFactory.h
new file mode 100644
index 0000000..ef11eaf
--- /dev/null
+++ b/Swift/Controllers/UIInterfaces/FdpFormSubmitWindowFactory.h
@@ -0,0 +1,19 @@
+/*
+ * Copyright (c) 2018 Isode Limited.
+ * All rights reserved.
+ * See the COPYING file for more information.
+ */
+
+#pragma once
+
+#include <memory>
+
+namespace Swift {
+ class FdpFormSubmitWindow;
+
+ class FdpFormSubmitWindowFactory {
+ public:
+ virtual ~FdpFormSubmitWindowFactory() {}
+ virtual std::unique_ptr<FdpFormSubmitWindow> createFdpFormSubmitWindow() = 0;
+ };
+}
diff --git a/Swift/Controllers/UIInterfaces/MainWindow.h b/Swift/Controllers/UIInterfaces/MainWindow.h
index bfd8c67..e4b4657 100644
--- a/Swift/Controllers/UIInterfaces/MainWindow.h
+++ b/Swift/Controllers/UIInterfaces/MainWindow.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -13,12 +13,12 @@
#include <Swiften/Elements/DiscoItems.h>
#include <Swiften/Elements/StatusShow.h>
-#include <Swiften/JID/JID.h>
#include <Swiften/TLS/Certificate.h>
#include <Swift/Controllers/Roster/ContactRosterItem.h>
namespace Swift {
+ class JID;
class Roster;
class MainWindow {
diff --git a/Swift/Controllers/UIInterfaces/MainWindowFactory.h b/Swift/Controllers/UIInterfaces/MainWindowFactory.h
index c0110cf..af924e2 100644
--- a/Swift/Controllers/UIInterfaces/MainWindowFactory.h
+++ b/Swift/Controllers/UIInterfaces/MainWindowFactory.h
@@ -1,17 +1,15 @@
/*
- * Copyright (c) 2010 Isode Limited.
+ * Copyright (c) 2010-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
-#ifndef SWIFTEN_MainWindowFactory_H
-#define SWIFTEN_MainWindowFactory_H
-
-#include "Swiften/JID/JID.h"
-#include "Swift/Controllers/UIEvents/UIEventStream.h"
+#pragma once
namespace Swift {
+ class Chattables;
class MainWindow;
+ class UIEventStream;
class MainWindowFactory {
public:
@@ -19,9 +17,7 @@ namespace Swift {
/**
* Transfers ownership of result.
*/
- virtual MainWindow* createMainWindow(UIEventStream* eventStream) = 0;
+ virtual MainWindow* createMainWindow(Chattables&, UIEventStream*) = 0;
};
}
-#endif
-
diff --git a/Swift/Controllers/UIInterfaces/UIFactory.h b/Swift/Controllers/UIInterfaces/UIFactory.h
index a0976dc..c49364a 100644
--- a/Swift/Controllers/UIInterfaces/UIFactory.h
+++ b/Swift/Controllers/UIInterfaces/UIFactory.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -12,6 +12,7 @@
#include <Swift/Controllers/UIInterfaces/ChatWindowFactory.h>
#include <Swift/Controllers/UIInterfaces/ContactEditWindowFactory.h>
#include <Swift/Controllers/UIInterfaces/EventWindowFactory.h>
+#include <Swift/Controllers/UIInterfaces/FdpFormSubmitWindowFactory.h>
#include <Swift/Controllers/UIInterfaces/FileTransferListWidgetFactory.h>
#include <Swift/Controllers/UIInterfaces/HighlightEditorWindowFactory.h>
#include <Swift/Controllers/UIInterfaces/HistoryWindowFactory.h>
@@ -42,7 +43,8 @@ namespace Swift {
public FileTransferListWidgetFactory,
public WhiteboardWindowFactory,
public HighlightEditorWindowFactory,
- public BlockListEditorWidgetFactory {
+ public BlockListEditorWidgetFactory,
+ public FdpFormSubmitWindowFactory {
public:
virtual ~UIFactory() {}
};
diff --git a/Swift/Controllers/UnitTest/FdpFormSubmitControllerTest.cpp b/Swift/Controllers/UnitTest/FdpFormSubmitControllerTest.cpp
new file mode 100644
index 0000000..8dc3442
--- /dev/null
+++ b/Swift/Controllers/UnitTest/FdpFormSubmitControllerTest.cpp
@@ -0,0 +1,269 @@
+/*
+ * Copyright (c) 2018 Isode Limited.
+ * All rights reserved.
+ * See the COPYING file for more information.
+ */
+
+#include <memory>
+#include <string>
+
+#include <gtest/gtest.h>
+
+#include <Swiften/Client/DummyStanzaChannel.h>
+#include <Swiften/Elements/DiscoItems.h>
+#include <Swiften/Elements/Form.h>
+#include <Swiften/Elements/FormField.h>
+#include <Swiften/Elements/IQ.h>
+#include <Swiften/Elements/Payload.h>
+#include <Swiften/Elements/PubSub.h>
+#include <Swiften/Elements/PubSubItems.h>
+#include <Swiften/Elements/PubSubPublish.h>
+#include <Swiften/JID/JID.h>
+#include <Swiften/Queries/IQRouter.h>
+
+#include <Swift/Controllers/FdpFormSubmitController.h>
+#include <Swift/Controllers/UIEvents/FdpFormSubmitWindowOpenUIEvent.h>
+#include <Swift/Controllers/UIEvents/UIEventStream.h>
+#include <Swift/Controllers/UnitTest/MockFdpFormSubmitWindowFactory.h>
+#include <Swift/Controllers/UnitTest/MockFdpFormSubmitWindow.h>
+
+namespace Swift {
+
+class FdpFormSubmitControllerTest : public ::testing::Test {
+
+ protected:
+ void SetUp() {
+ clientJid_ = JID(clientJIDString_);
+ stanzaChannel_ = std::make_unique<DummyStanzaChannel>();
+ iqRouter_ = std::make_unique<IQRouter>(stanzaChannel_.get());
+ uiEventStream_ = std::make_unique<UIEventStream>();
+ fdpWindowFactory_ = std::make_unique<MockFdpFormSubmitWindowFactory>();
+ fdpController_ = std::make_unique<FdpFormSubmitController>(clientJid_, iqRouter_.get(), uiEventStream_.get(), fdpWindowFactory_.get());
+ auto fdpWindowOpenUIEvent = std::make_shared<FdpFormSubmitWindowOpenUIEvent>();
+ uiEventStream_->send(fdpWindowOpenUIEvent);
+ fdpWindow_ = fdpWindowFactory_->getMockFdpFormSubmitWindow();
+ }
+
+ void TearDown() {
+ }
+
+ std::shared_ptr<DiscoItems> createDiscoItemsResult();
+ std::shared_ptr<PubSub> createTemplatePubSubResult(const std::shared_ptr<Form>& form);
+ std::shared_ptr<PubSub> createSubmittedPubSubResult();
+
+ std::string clientJIDString_ = "testjid@test.im/swift";
+ JID clientJid_;
+ std::unique_ptr<DummyStanzaChannel> stanzaChannel_;
+ std::unique_ptr<IQRouter> iqRouter_;
+ std::unique_ptr<UIEventStream> uiEventStream_;
+ std::unique_ptr<MockFdpFormSubmitWindowFactory> fdpWindowFactory_;
+ std::unique_ptr<FdpFormSubmitController> fdpController_;
+ MockFdpFormSubmitWindow* fdpWindow_;
+};
+
+std::shared_ptr<DiscoItems> FdpFormSubmitControllerTest::createDiscoItemsResult() {
+ auto discoItems = std::make_shared<DiscoItems>();
+ discoItems->addItem(DiscoItems::Item("node0", JID(), "fdp/template/testNode0"));
+ discoItems->addItem(DiscoItems::Item("node1", JID(), "fdp/template/testNode1"));
+ discoItems->addItem(DiscoItems::Item("node2", JID(), "fdp/template/testNode2"));
+ return discoItems;
+}
+
+std::shared_ptr<PubSub> FdpFormSubmitControllerTest::createTemplatePubSubResult(const std::shared_ptr<Form>& form) {
+ auto pubSubItem = std::make_shared<PubSubItem>();
+ pubSubItem->addData(form);
+ auto pubSubItems = std::make_shared<PubSubItems>();
+ pubSubItems->addItem(pubSubItem);
+ auto pubSub = std::make_shared<PubSub>();
+ pubSub->setPayload(pubSubItems);
+ return pubSub;
+}
+
+std::shared_ptr<PubSub> FdpFormSubmitControllerTest::createSubmittedPubSubResult() {
+ auto pubSubItem = std::make_shared<PubSubItem>();
+ pubSubItem->setID("testID");
+ auto pubSubPublish = std::make_shared<PubSubPublish>();
+ pubSubPublish->addItem(pubSubItem);
+ pubSubPublish->setNode("fdp/submitted/test");
+ auto pubSub = std::make_shared<PubSub>();
+ pubSub->setPayload(pubSubPublish);
+ return pubSub;
+}
+
+TEST_F(FdpFormSubmitControllerTest, testRequestPubSubNodeData) {
+ std::string domainName = "fdp.example.test";
+ fdpWindow_->onRequestPubSubNodeData(domainName);
+ ASSERT_EQ(1, stanzaChannel_->sentStanzas.size());
+ auto requestIq = std::dynamic_pointer_cast<IQ>(stanzaChannel_->sentStanzas[0]);
+ ASSERT_EQ(domainName, requestIq->getTo());
+ auto discoItemsPayloads = requestIq->getPayloads<DiscoItems>();
+ ASSERT_EQ(1, discoItemsPayloads.size());
+
+ auto discoItemsResult = createDiscoItemsResult();
+ auto resultIq = IQ::createResult(clientJid_, domainName, requestIq->getID(), discoItemsResult);
+ stanzaChannel_->onIQReceived(resultIq);
+
+ auto discoItemsList = discoItemsResult->getItems();
+ ASSERT_EQ(discoItemsList.size(), fdpWindow_->nodeData.size());
+ for (unsigned int i = 0; i < fdpWindow_->nodeData.size(); i++) {
+ auto nodeItem = fdpWindow_->nodeData[i];
+ auto discoItem = discoItemsList[i];
+ ASSERT_EQ(discoItem.getNode(), nodeItem.first);
+ ASSERT_EQ(discoItem.getName(), nodeItem.second);
+ }
+ ASSERT_EQ(FdpFormSubmitWindow::NodeError::NoError, fdpWindow_->nodeError_);
+}
+
+TEST_F(FdpFormSubmitControllerTest, testRequestPubSubNodeDataError) {
+ std::string domainName = "fdp.example.test";
+ fdpWindow_->onRequestPubSubNodeData(domainName);
+ ASSERT_EQ(1, stanzaChannel_->sentStanzas.size());
+ auto requestIq = std::dynamic_pointer_cast<IQ>(stanzaChannel_->sentStanzas[0]);
+ ASSERT_EQ(domainName, requestIq->getTo());
+
+ auto resultIq = IQ::createError(clientJid_, domainName, requestIq->getID());
+ stanzaChannel_->onIQReceived(resultIq);
+
+ ASSERT_EQ(true, fdpWindow_->nodeData.empty());
+ ASSERT_EQ(FdpFormSubmitWindow::NodeError::DomainNotFound, fdpWindow_->nodeError_);
+}
+
+TEST_F(FdpFormSubmitControllerTest, testRequestTemplateForm) {
+ std::string domainName = "fdp.example.test";
+ fdpWindow_->onRequestPubSubNodeData(domainName);
+ auto nodeDataRequestIq = std::dynamic_pointer_cast<IQ>(stanzaChannel_->sentStanzas[0]);
+ auto discoItemsResult = createDiscoItemsResult();
+ auto discoItemsResultIq = IQ::createResult(clientJid_, domainName, nodeDataRequestIq->getID(), discoItemsResult);
+ stanzaChannel_->onIQReceived(discoItemsResultIq);
+
+ std::string templateNodeName = "fdp/template/test";
+ fdpWindow_->onRequestTemplateForm(templateNodeName);
+ ASSERT_EQ(2, stanzaChannel_->sentStanzas.size());
+ auto requestIq = std::dynamic_pointer_cast<IQ>(stanzaChannel_->sentStanzas[1]);
+ ASSERT_EQ(domainName, requestIq->getTo());
+ auto pubSubPayloads = requestIq->getPayloads<PubSub>();
+ ASSERT_EQ(1, pubSubPayloads.size());
+
+ std::string value0("value0");
+ std::string value1("value1@example.test");
+ auto field0 = std::make_shared<FormField>(FormField::TextSingleType, value0);
+ auto field1 = std::make_shared<FormField>(FormField::JIDSingleType, value1);
+ auto form = std::make_shared<Form>();
+ form->addField(field0);
+ form->addField(field1);
+ auto pubSubResult = createTemplatePubSubResult(form);
+ auto resultIq = IQ::createResult(clientJid_, domainName, requestIq->getID(), pubSubResult);
+ stanzaChannel_->onIQReceived(resultIq);
+
+ ASSERT_EQ(form, fdpWindow_->templateForm_);
+ auto fields = fdpWindow_->templateForm_->getFields();
+ ASSERT_EQ(2, fields.size());
+ ASSERT_EQ(field0, fields[0]);
+ ASSERT_EQ(field1, fields[1]);
+ ASSERT_EQ(value0, fields[0]->getTextSingleValue());
+ ASSERT_EQ(value1, fields[1]->getJIDSingleValue());
+ ASSERT_EQ(FdpFormSubmitWindow::TemplateError::NoError, fdpWindow_->templateError_);
+}
+
+TEST_F(FdpFormSubmitControllerTest, testRequestTemplateFormError) {
+ std::string domainName = "fdp.example.test";
+ fdpWindow_->onRequestPubSubNodeData(domainName);
+ auto nodeDataRequestIq = std::dynamic_pointer_cast<IQ>(stanzaChannel_->sentStanzas[0]);
+ auto discoItemsResult = createDiscoItemsResult();
+ auto discoItemsResultIq = IQ::createResult(clientJid_, domainName, nodeDataRequestIq->getID(), discoItemsResult);
+ stanzaChannel_->onIQReceived(discoItemsResultIq);
+
+ std::string templateNodeName = "fdp/template/test";
+ fdpWindow_->onRequestTemplateForm(templateNodeName);
+ ASSERT_EQ(2, stanzaChannel_->sentStanzas.size());
+ auto requestIq = std::dynamic_pointer_cast<IQ>(stanzaChannel_->sentStanzas[1]);
+ ASSERT_EQ(domainName, requestIq->getTo());
+
+ auto resultIq = IQ::createError(clientJid_, domainName, requestIq->getID());
+ stanzaChannel_->onIQReceived(resultIq);
+
+ ASSERT_EQ(nullptr, fdpWindow_->templateForm_);
+ ASSERT_EQ(FdpFormSubmitWindow::TemplateError::RequestFailed, fdpWindow_->templateError_);
+}
+
+TEST_F(FdpFormSubmitControllerTest, testSubmitForm) {
+ std::string domainName = "fdp.example.test";
+ std::string templateNodeName = "fdp/template/test";
+ fdpWindow_->onRequestPubSubNodeData(domainName);
+ auto nodeDataRequestIq = std::dynamic_pointer_cast<IQ>(stanzaChannel_->sentStanzas[0]);
+ auto discoItemsResult = createDiscoItemsResult();
+ auto discoItemsResultIq = IQ::createResult(clientJid_, domainName, nodeDataRequestIq->getID(), discoItemsResult);
+ stanzaChannel_->onIQReceived(discoItemsResultIq);
+ fdpWindow_->onRequestTemplateForm(templateNodeName);
+ auto templateFormRequestIq = std::dynamic_pointer_cast<IQ>(stanzaChannel_->sentStanzas[1]);
+ auto templateForm = std::make_shared<Form>();
+ auto templatePubSubResult = createTemplatePubSubResult(templateForm);
+ auto templatePubSubResultIq = IQ::createResult(clientJid_, domainName, templateFormRequestIq->getID(), templatePubSubResult);
+ stanzaChannel_->onIQReceived(templatePubSubResultIq);
+
+ std::string value0("value0");
+ std::string value1("value1@example.test");
+ auto field0 = std::make_shared<FormField>(FormField::TextSingleType, value0);
+ auto field1 = std::make_shared<FormField>(FormField::JIDSingleType, value1);
+ auto form = std::make_shared<Form>();
+ form->addField(field0);
+ form->addField(field1);
+ fdpWindow_->onSubmitForm(form);
+
+ ASSERT_EQ(3, stanzaChannel_->sentStanzas.size());
+ auto requestIq = std::dynamic_pointer_cast<IQ>(stanzaChannel_->sentStanzas[2]);
+ ASSERT_EQ(domainName, requestIq->getTo());
+ auto pubSubPayloads = requestIq->getPayloads<PubSub>();
+ ASSERT_EQ(1, pubSubPayloads.size());
+ auto pubSubPayload = pubSubPayloads[0];
+ auto pubSubPublishPayload = std::dynamic_pointer_cast<PubSubPublish>(pubSubPayload->getPayload());
+ ASSERT_TRUE(pubSubPublishPayload);
+ auto pubSubItems = pubSubPublishPayload->getItems();
+ ASSERT_EQ(1, pubSubItems.size());
+ auto dataList = pubSubItems[0]->getData();
+ ASSERT_EQ(1, dataList.size());
+ auto submittedForm = std::dynamic_pointer_cast<Form>(dataList[0]);
+ ASSERT_TRUE(submittedForm);
+ ASSERT_EQ(form, submittedForm);
+ auto fields = submittedForm->getFields();
+ ASSERT_EQ(2, fields.size());
+ ASSERT_EQ(field0, fields[0]);
+ ASSERT_EQ(field1, fields[1]);
+ ASSERT_EQ(value0, fields[0]->getTextSingleValue());
+ ASSERT_EQ(value1, fields[1]->getJIDSingleValue());
+
+ auto pubSubResult = createSubmittedPubSubResult();
+ auto resultIq = IQ::createResult(clientJid_, domainName, requestIq->getID(), pubSubResult);
+ stanzaChannel_->onIQReceived(resultIq);
+
+ ASSERT_EQ(true, fdpWindow_->submissionSuccess_);
+}
+
+TEST_F(FdpFormSubmitControllerTest, testSubmitFormError) {
+ std::string domainName = "fdp.example.test";
+ std::string templateNodeName = "fdp/template/test";
+ fdpWindow_->onRequestPubSubNodeData(domainName);
+ auto nodeDataRequestIq = std::dynamic_pointer_cast<IQ>(stanzaChannel_->sentStanzas[0]);
+ auto discoItemsResult = createDiscoItemsResult();
+ auto discoItemsResultIq = IQ::createResult(clientJid_, domainName, nodeDataRequestIq->getID(), discoItemsResult);
+ stanzaChannel_->onIQReceived(discoItemsResultIq);
+ fdpWindow_->onRequestTemplateForm(templateNodeName);
+ auto templateFormRequestIq = std::dynamic_pointer_cast<IQ>(stanzaChannel_->sentStanzas[1]);
+ auto templateForm = std::make_shared<Form>();
+ auto templatePubSubResult = createTemplatePubSubResult(templateForm);
+ auto templatePubSubResultIq = IQ::createResult(clientJid_, domainName, templateFormRequestIq->getID(), templatePubSubResult);
+ stanzaChannel_->onIQReceived(templatePubSubResultIq);
+
+ auto form = std::make_shared<Form>();
+ fdpWindow_->onSubmitForm(form);
+ ASSERT_EQ(3, stanzaChannel_->sentStanzas.size());
+ auto requestIq = std::dynamic_pointer_cast<IQ>(stanzaChannel_->sentStanzas[2]);
+ ASSERT_EQ(domainName, requestIq->getTo());
+
+ auto resultIq = IQ::createError(clientJid_, domainName, requestIq->getID());
+ stanzaChannel_->onIQReceived(resultIq);
+
+ ASSERT_EQ(false, fdpWindow_->submissionSuccess_);
+}
+
+}
diff --git a/Swift/Controllers/UnitTest/MockChatWindow.h b/Swift/Controllers/UnitTest/MockChatWindow.h
index 7682781..38b3b1f 100644
--- a/Swift/Controllers/UnitTest/MockChatWindow.h
+++ b/Swift/Controllers/UnitTest/MockChatWindow.h
@@ -17,10 +17,11 @@ namespace Swift {
MockChatWindow() {}
virtual ~MockChatWindow();
- virtual std::string addMessage(const ChatMessage& message, const std::string& senderName, bool senderIsSelf, std::shared_ptr<SecurityLabel> /*label*/, const std::string& /*avatarPath*/, const boost::posix_time::ptime& /*time*/) {
+ virtual std::string addMessage(const ChatMessage& message, const std::string& senderName, bool senderIsSelf, std::shared_ptr<SecurityLabel> label, const std::string& /*avatarPath*/, const boost::posix_time::ptime& /*time*/) {
lastAddedMessage_ = message;
lastAddedMessageSenderName_ = senderName;
lastAddedMessageSenderIsSelf_ = senderIsSelf;
+ lastAddedMessageSecurityLabel_ = label;
return "id";
}
@@ -72,7 +73,7 @@ namespace Swift {
virtual void activate() {}
virtual void setAvailableSecurityLabels(const std::vector<SecurityLabelsCatalog::Item>& labels) {labels_ = labels;}
virtual void setSecurityLabelsEnabled(bool enabled) {labelsEnabled_ = enabled;}
- virtual void setUnreadMessageCount(int /*count*/) {}
+ virtual void setUnreadMessageCount(size_t /*count*/) {}
virtual void convertToMUC(MUCType mucType) {
mucType_ = mucType;
@@ -133,10 +134,19 @@ namespace Swift {
lastAddedMessageSenderIsSelf_ = lastAddedActionSenderIsSelf_ = false;
}
+ void setChatSecurityMarking(const std::string& markingValue, const std::string& markingForegroundColorValue, const std::string& markingBackgroundColorValue) {
+ markingValue_ = markingValue;
+ markingForegroundColorValue_ = markingForegroundColorValue;
+ markingBackgroundColorValue_ = markingBackgroundColorValue;
+ }
+
+ void removeChatSecurityMarking() {}
+
std::string name_;
ChatMessage lastAddedMessage_;
std::string lastAddedMessageSenderName_;
bool lastAddedMessageSenderIsSelf_ = false;
+ std::shared_ptr<SecurityLabel> lastAddedMessageSecurityLabel_ = nullptr;
ChatMessage lastAddedAction_;
std::string lastAddedActionSenderName_;
bool lastAddedActionSenderIsSelf_ = false;
@@ -154,6 +164,9 @@ namespace Swift {
Roster* roster_ = nullptr;
std::vector<std::pair<std::string, ReceiptState>> receiptChanges_;
boost::optional<MUCType> mucType_;
+ std::string markingValue_;
+ std::string markingForegroundColorValue_;
+ std::string markingBackgroundColorValue_;
};
}
diff --git a/Swift/Controllers/UnitTest/MockFdpFormSubmitWindow.h b/Swift/Controllers/UnitTest/MockFdpFormSubmitWindow.h
new file mode 100644
index 0000000..28ef35f
--- /dev/null
+++ b/Swift/Controllers/UnitTest/MockFdpFormSubmitWindow.h
@@ -0,0 +1,37 @@
+/*
+ * Copyright (c) 2018 Isode Limited.
+ * All rights reserved.
+ * See the COPYING file for more information.
+ */
+
+#pragma once
+
+#include <memory>
+#include <string>
+
+#include <Swift/Controllers/UIInterfaces/FdpFormSubmitWindow.h>
+
+namespace Swift {
+
+ class Form;
+
+ class MockFdpFormSubmitWindow : public FdpFormSubmitWindow {
+ public:
+ MockFdpFormSubmitWindow() : FdpFormSubmitWindow() {}
+ virtual void show() override {}
+ virtual void raise() override {}
+ virtual void addNode(const std::string& node, const std::string& nodeName) override { nodeData.push_back(std::pair<std::string, std::string>(node, nodeName)); }
+ virtual void clearNodeData() override { nodeData.clear(); }
+ virtual void setFormData(const std::shared_ptr<Form>& form) override { templateForm_ = form; }
+ virtual void showNodePlaceholder(NodeError nodeError) override { nodeError_ = nodeError; }
+ virtual void showFormPlaceholder(TemplateError templateError) override { templateError_ = templateError; }
+ virtual void handleSubmitServerResponse(bool submissionSuccess) override { submissionSuccess_ = submissionSuccess; }
+
+ std::vector<std::pair<std::string, std::string>> nodeData;
+ std::shared_ptr<Form> templateForm_ = nullptr;
+ NodeError nodeError_ = NodeError::NoError;
+ TemplateError templateError_ = TemplateError::NoError;
+ bool submissionSuccess_ = false;
+ };
+
+}
diff --git a/Swift/Controllers/UnitTest/MockFdpFormSubmitWindowFactory.h b/Swift/Controllers/UnitTest/MockFdpFormSubmitWindowFactory.h
new file mode 100644
index 0000000..8015419
--- /dev/null
+++ b/Swift/Controllers/UnitTest/MockFdpFormSubmitWindowFactory.h
@@ -0,0 +1,31 @@
+/*
+ * Copyright (c) 2018 Isode Limited.
+ * All rights reserved.
+ * See the COPYING file for more information.
+ */
+
+#pragma once
+
+#include <memory>
+
+#include <Swift/Controllers/UIInterfaces/FdpFormSubmitWindowFactory.h>
+#include <Swift/Controllers/UnitTest/MockFdpFormSubmitWindow.h>
+
+namespace Swift {
+
+ class MockFdpFormSubmitWindowFactory : public FdpFormSubmitWindowFactory {
+ public:
+ MockFdpFormSubmitWindowFactory() : FdpFormSubmitWindowFactory() {}
+
+ virtual std::unique_ptr<FdpFormSubmitWindow> createFdpFormSubmitWindow() override {
+ std::unique_ptr<FdpFormSubmitWindow> fdpFormSubmitWindow = std::make_unique<MockFdpFormSubmitWindow>();
+ mockFdpFormSubmitWindow_ = static_cast<MockFdpFormSubmitWindow*>(fdpFormSubmitWindow.get());
+ return fdpFormSubmitWindow;
+ }
+
+ MockFdpFormSubmitWindow* getMockFdpFormSubmitWindow() { return mockFdpFormSubmitWindow_; }
+
+ private:
+ MockFdpFormSubmitWindow* mockFdpFormSubmitWindow_;
+ };
+}
diff --git a/Swift/Controllers/UnitTest/MockMainWindow.h b/Swift/Controllers/UnitTest/MockMainWindow.h
index 6ae2aa7..9265310 100644
--- a/Swift/Controllers/UnitTest/MockMainWindow.h
+++ b/Swift/Controllers/UnitTest/MockMainWindow.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -26,6 +26,7 @@ namespace Swift {
virtual void setStreamEncryptionStatus(bool /*tlsInPlaceAndValid*/) {}
virtual void openCertificateDialog(const std::vector<Certificate::ref>& /*chain*/) {}
virtual void setBlockingCommandAvailable(bool /*isAvailable*/) {}
+ virtual void openFdpFormSubmitDialog(const JID& /*self*/, IQRouter* /*iqRouter*/) {}
Roster* roster;
};
diff --git a/Swift/Controllers/UnitTest/MockMainWindowFactory.h b/Swift/Controllers/UnitTest/MockMainWindowFactory.h
index adf4fdf..331ca11 100644
--- a/Swift/Controllers/UnitTest/MockMainWindowFactory.h
+++ b/Swift/Controllers/UnitTest/MockMainWindowFactory.h
@@ -20,9 +20,7 @@ namespace Swift {
/**
* Transfers ownership of result.
*/
- virtual MainWindow* createMainWindow(UIEventStream*) {last = new MockMainWindow();return last;}
+ virtual MainWindow* createMainWindow(Chattables&, UIEventStream*) {last = new MockMainWindow();return last;}
MockMainWindow* last;
};
}
-
-
diff --git a/Swift/Controllers/XMPPEvents/EventController.cpp b/Swift/Controllers/XMPPEvents/EventController.cpp
index f8fb192..0e9429d 100644
--- a/Swift/Controllers/XMPPEvents/EventController.cpp
+++ b/Swift/Controllers/XMPPEvents/EventController.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -51,7 +51,7 @@ void EventController::handleIncomingEvent(std::shared_ptr<StanzaEvent> sourceEve
if ((messageEvent && messageEvent->isReadable()) || subscriptionEvent || errorEvent || mucInviteEvent || incomingFileTransferEvent) {
events_.push_back(sourceEvent);
sourceEvent->onConclusion.connect(boost::bind(&EventController::handleEventConcluded, this, sourceEvent));
- onEventQueueLengthChange(boost::numeric_cast<int>(events_.size()));
+ onEventQueueLengthChange(events_.size());
onEventQueueEventAdded(sourceEvent);
if (sourceEvent->getConcluded()) {
handleEventConcluded(sourceEvent);
@@ -62,7 +62,7 @@ void EventController::handleIncomingEvent(std::shared_ptr<StanzaEvent> sourceEve
void EventController::handleEventConcluded(std::shared_ptr<StanzaEvent> event) {
event->onConclusion.disconnect(boost::bind(&EventController::handleEventConcluded, this, event));
events_.erase(std::remove(events_.begin(), events_.end(), event), events_.end());
- onEventQueueLengthChange(boost::numeric_cast<int>(events_.size()));
+ onEventQueueLengthChange(events_.size());
}
void EventController::disconnectAll() {
diff --git a/Swift/Controllers/XMPPEvents/EventController.h b/Swift/Controllers/XMPPEvents/EventController.h
index 8a095d9..5b746e4 100644
--- a/Swift/Controllers/XMPPEvents/EventController.h
+++ b/Swift/Controllers/XMPPEvents/EventController.h
@@ -1,11 +1,12 @@
/*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
#pragma once
+#include <cstddef>
#include <memory>
#include <vector>
@@ -22,7 +23,7 @@ namespace Swift {
~EventController();
void handleIncomingEvent(std::shared_ptr<StanzaEvent> sourceEvent);
- boost::signals2::signal<void (int)> onEventQueueLengthChange;
+ boost::signals2::signal<void (size_t)> onEventQueueLengthChange;
boost::signals2::signal<void (std::shared_ptr<StanzaEvent>)> onEventQueueEventAdded;
const EventList& getEvents() const {return events_;}
void disconnectAll();
diff --git a/Swift/Packaging/Debian/.dockerignore b/Swift/Packaging/Debian/.dockerignore
new file mode 100644
index 0000000..5d238e7
--- /dev/null
+++ b/Swift/Packaging/Debian/.dockerignore
@@ -0,0 +1 @@
+**/out
diff --git a/Swift/Packaging/Debian/.gitignore b/Swift/Packaging/Debian/.gitignore
index 5401ae0..9c8f275 100644
--- a/Swift/Packaging/Debian/.gitignore
+++ b/Swift/Packaging/Debian/.gitignore
@@ -1,3 +1,7 @@
/swift-*
/swift_*
/libswiften*
+/out/
+/swift-src/
+swift-im*.orig.tar.gz
+*.tmp.package
diff --git a/Swift/Packaging/Debian/Dockerfile.package.in b/Swift/Packaging/Debian/Dockerfile.package.in
new file mode 100644
index 0000000..b53d477
--- /dev/null
+++ b/Swift/Packaging/Debian/Dockerfile.package.in
@@ -0,0 +1,30 @@
+FROM __DISTRO__
+MAINTAINER packages@swift.im
+
+ENV DEBIAN_VERSION=__DEBIAN_VERSION__
+
+# Make sure nothing needs an interactive prompt
+ARG DEBIAN_FRONTEND=noninteractive
+
+RUN \
+ apt-get -qq update && \
+ apt-get install -y lintian devscripts scons build-essential dh-make pkg-config libssl-dev qt5-default libqt5x11extras5-dev libqt5webkit5-dev qtmultimedia5-dev qttools5-dev-tools qt5-image-formats-plugins libqt5svg5-dev libminiupnpc-dev libnatpmp-dev libhunspell-dev libxml2-dev libxss-dev libboost-dev libboost-filesystem-dev libboost-program-options-dev libboost-regex-dev libboost-signals-dev libboost-system-dev libboost-thread-dev libboost-date-time-dev libidn11-dev docbook-xsl docbook-xml xsltproc libxml2-utils libsqlite3-dev zlib1g-dev help2man && \
+ apt-get clean
+
+RUN mkdir /swift-packages
+COPY * /swift-packages/
+
+CMD \
+ gpg --allow-secret-key-import --import /gpg-keys/*.asc && \
+ cd /swift-packages && \
+ tar xf swift-im_${DEBIAN_VERSION}*.orig.tar.gz && \
+ tar xf swift-im_${DEBIAN_VERSION}*.debian.tar.xz -C /swift-packages/swift-im-${DEBIAN_VERSION}/ && \
+ cd swift-im-${DEBIAN_VERSION} && \
+ debuild -i -I -b --lintian-opts --profile debian --pedantic && \
+ cd /swift-packages/ && \
+ rm -rf /swift-packages/swift-im-${DEBIAN_VERSION}/ && \
+ rm -f /swift-packages/swift-im_${DEBIAN_VERSION}*.orig.tar.gz && \
+ rm -f /swift-packages/swift-im_${DEBIAN_VERSION}*.debian.tar.xz && \
+ rm -f /swift-packages/swift-im_${DEBIAN_VERSION}*.dsc && \
+ rm -f /swift-packages/swift-im_${DEBIAN_VERSION}*_source.* && \
+ mv * /out/
diff --git a/Swift/Packaging/Debian/Dockerfile.source b/Swift/Packaging/Debian/Dockerfile.source
new file mode 100644
index 0000000..3c23b2c
--- /dev/null
+++ b/Swift/Packaging/Debian/Dockerfile.source
@@ -0,0 +1,17 @@
+FROM debian:stretch
+VOLUME ["/gpg-keys"]
+MAINTAINER packages@swift.im
+
+RUN \
+ apt-get -qq update && \
+ apt-get install -y lintian devscripts scons build-essential pkg-config libssl-dev qt5-default libqt5x11extras5-dev libqt5webkit5-dev qtmultimedia5-dev qttools5-dev-tools qt5-image-formats-plugins libqt5svg5-dev libminiupnpc-dev libnatpmp-dev libhunspell-dev libxml2-dev libxss-dev libboost-dev libboost-filesystem-dev libboost-program-options-dev libboost-regex-dev libboost-signals-dev libboost-system-dev libboost-thread-dev libboost-date-time-dev libidn11-dev docbook-xsl docbook-xml xsltproc libxml2-utils libsqlite3-dev zlib1g-dev help2man && \
+ apt-get clean
+
+COPY swift-src /swift-src
+
+CMD \
+ gpg --allow-secret-key-import --import /gpg-keys/*.asc && \
+ cd /swift-src && \
+ mv swift-im_*.orig.tar.gz ../ && \
+ debuild -i -I -S --lintian-opts --pedantic && \
+ mv /swift-im* /out/
diff --git a/Swift/Packaging/Debian/Testing/swift-distr-tests.sh b/Swift/Packaging/Debian/Testing/swift-distr-tests.sh
index 8d03282..e817974 100755
--- a/Swift/Packaging/Debian/Testing/swift-distr-tests.sh
+++ b/Swift/Packaging/Debian/Testing/swift-distr-tests.sh
@@ -40,25 +40,31 @@ arr[0,0]="ubuntu"
arr[0,1]="http://archive.ubuntu.com/ubuntu"
arr[0,2]="xenial"
-#Ubuntu yakkety
+#Ubuntu artful
arr[1,0]="ubuntu"
arr[1,1]="http://archive.ubuntu.com/ubuntu"
-arr[1,2]="yakkety"
+arr[1,2]="artful"
#Debian jessie
arr[2,0]="debian"
arr[2,1]="http://deb.debian.org/debian/"
arr[2,2]="jessie"
-#Debian sid
+#Debian stretch
arr[3,0]="debian"
arr[3,1]="http://deb.debian.org/debian/"
-arr[3,2]="sid"
+arr[3,2]="stretch"
+
+#Debian sid
+arr[4,0]="debian"
+arr[4,1]="http://deb.debian.org/debian/"
+arr[4,2]="sid"
+
DIST="$1"
RETURN_VALUE=0
-for counter in {0..3}
+for counter in {0..4}
do
# for ARCH in "amd64" "i386"
for ARCH in "amd64"
diff --git a/Swift/Packaging/Debian/changelog.debian-unstable b/Swift/Packaging/Debian/changelog.debian-unstable
index ca9ffec..f2bf2c5 100644
--- a/Swift/Packaging/Debian/changelog.debian-unstable
+++ b/Swift/Packaging/Debian/changelog.debian-unstable
@@ -1,3 +1,21 @@
+swift-im (4.0.3-1) UNRELEASED; urgency=medium
+
+ * New chat theme including a new font
+ * Support for message carbons (XEP-0280)
+ * Enabled trellis mode as a default feature, allowing several tiled chats windows to be shown at once
+ * Redesigned keyword highlighting
+ * Improve date formatting
+ * Fix Last Message Correction in multi client scenarios
+ * Fix UI layout issue for translations that require right-to-left (RTL) layout
+ * Fix UX issues in trellis mode
+ * Improvements to font size handling in the chat theme
+ * Add AppImage for Linux 64-bit as a supported platform
+ * Improved spell checker support on Linux
+ * Allow setting vCard on servers that do not return an empty vCard on fresh accounts
+ * And assorted smaller features and usability enhancements. Closes: 840151, 889062
+
+ -- Kevin Smith <kevin@kismith.co.uk> Thu, 03 Jan 2019 13:59:07 +0100
+
swift-im (3.0.4-1) unstable; urgency=low
* New upstream release
diff --git a/Swift/Packaging/Debian/debian/control.in b/Swift/Packaging/Debian/debian/control.in
index 26544e5..e779f21 100644
--- a/Swift/Packaging/Debian/debian/control.in
+++ b/Swift/Packaging/Debian/debian/control.in
@@ -3,7 +3,7 @@ Section: net
Priority: optional
Maintainer: Swift Package Maintainer <packages@swift.im>
Uploaders: Remko Tronçon <dev@el-tramo.be>, Kevin Smith <kevin@kismith.co.uk>
-Build-Depends: debhelper (>= 9), scons (>= 1.2.0), libssl-dev (>= 0.9.8g), qtbase5-dev (>= 5.0.0), qtchooser, qtbase5-dev-tools (>= 5.0.0), libqt5x11extras5-dev (>= 5.0.0), libqt5webkit5-dev (>= 5.0.0), qtmultimedia5-dev (>=5.0.0), qttools5-dev-tools (>=5.0.0), qt5-image-formats-plugins (>=5.0.0), libqt5svg5-dev (>=5.0.0), libxml2-dev (>= 2.7.6), libxss-dev (>= 1.2.0), libboost-dev (>= 1.34.1), libboost-filesystem-dev (>= 1.34.1), libboost-program-options-dev (>= 1.34.1), libboost-regex-dev (>= 1.34.1), libboost-signals-dev (>= 1.34.1), libboost-system-dev (>= 1.34.1), libboost-thread-dev (>= 1.34.1), libboost-date-time-dev (>= 1.34.1), libidn11-dev (>= 1.10), docbook-xsl (>= 1.75.0), docbook-xml (>= 4.5), xsltproc, libxml2-utils, libnatpmp-dev, libminiupnpc-dev, libsqlite3-dev, libhunspell-dev, zlib1g-dev
+Build-Depends: debhelper (>= 9), scons (>= 1.2.0), libssl-dev (>= 0.9.8g), qtbase5-dev (>= 5.0.0), qtchooser, qtbase5-dev-tools (>= 5.0.0), libqt5x11extras5-dev (>= 5.0.0), libqt5webkit5-dev (>= 5.0.0), qtmultimedia5-dev (>=5.0.0), qttools5-dev-tools (>=5.0.0), qt5-image-formats-plugins (>=5.0.0), libqt5svg5-dev (>=5.0.0), libxml2-dev (>= 2.7.6), libxss-dev (>= 1.2.0), libboost-dev (>= 1.34.1), libboost-filesystem-dev (>= 1.34.1), libboost-program-options-dev (>= 1.34.1), libboost-regex-dev (>= 1.34.1), libboost-signals-dev (>= 1.34.1), libboost-system-dev (>= 1.34.1), libboost-thread-dev (>= 1.34.1), libboost-date-time-dev (>= 1.34.1), libidn11-dev (>= 1.10), docbook-xsl (>= 1.75.0), docbook-xml (>= 4.5), xsltproc, libxml2-utils, libnatpmp-dev, libminiupnpc-dev, libsqlite3-dev, libhunspell-dev, zlib1g-dev, help2man
Standards-Version: 3.9.8
Vcs-Git: git://swift.im/swift
Vcs-Browser: http://swift.im/git/swift
diff --git a/Swift/Packaging/Debian/debian/copyright b/Swift/Packaging/Debian/debian/copyright
index a0c2c79..9219930 100644
--- a/Swift/Packaging/Debian/debian/copyright
+++ b/Swift/Packaging/Debian/debian/copyright
@@ -3,7 +3,7 @@ with help from Olly Betts <olly@survex.com>.
The upstream sources were obtained from http://swift.im.
-Copyright (C) 2010-2016 Isode Limited.
+Copyright (C) 2010-2019 Isode Limited.
Licensed under the GNU General Public License.
See /usr/share/common-licenses/GPL-3 for the full license.
diff --git a/Swift/Packaging/Debian/debian/rules b/Swift/Packaging/Debian/debian/rules
index 87c551b..ed432bb 100755
--- a/Swift/Packaging/Debian/debian/rules
+++ b/Swift/Packaging/Debian/debian/rules
@@ -4,7 +4,7 @@
export PYTHONDONTWRITEBYTECODE=1
export QT_SELECT=qt5
-SCONS_FLAGS=V=1 qt5=1 optimize=1 debug=1 allow_warnings=1 swiften_dll=1 docbook_xsl=/usr/share/xml/docbook/stylesheet/docbook-xsl docbook_xml=/usr/share/xml/docbook/schema/dtd/4.5 linkflags="$(shell dpkg-buildflags --get LDFLAGS)" ccflags="$(shell dpkg-buildflags --get CPPFLAGS) $(shell dpkg-buildflags --get CFLAGS)"
+SCONS_FLAGS=V=1 qt5=1 optimize=1 debug=1 allow_warnings=1 swiften_dll=1 help2man=1 docbook_xsl=/usr/share/xml/docbook/stylesheet/docbook-xsl docbook_xml=/usr/share/xml/docbook/schema/dtd/4.5 linkflags="$(shell dpkg-buildflags --get LDFLAGS)" ccflags="$(shell dpkg-buildflags --get CPPFLAGS) $(shell dpkg-buildflags --get CFLAGS)"
SCONS_INSTALL_BASE=$(CURDIR)/debian/tmp
SCONS_INSTALL_FLAGS=SWIFT_INSTALLDIR=$(SCONS_INSTALL_BASE)/usr SWIFTEN_INSTALLDIR=$(SCONS_INSTALL_BASE)/usr
SWIFT_INSTALLDIR=$(SCONS_INSTALL_BASE)/usr SWIFTEN_INSTALLDIR=$(SCONS_INSTALL_BASE)/usr
@@ -21,7 +21,7 @@ override_dh_clean:
override_dh_configure:
override_dh_auto_build:
- scons $(SCONS_FLAGS) $(SCONS_EXTRA_FLAGS) Swift Swiften
+ scons $(SCONS_FLAGS) $(SCONS_EXTRA_FLAGS) Swift Swiften debian/swift-im.1 debian/swiften-config.1
override_dh_auto_install:
scons $(SCONS_FLAGS) $(SCONS_EXTRA_FLAGS) $(SCONS_INSTALL_FLAGS) $(SCONS_INSTALL_BASE)
diff --git a/Swift/Packaging/Debian/package.sh b/Swift/Packaging/Debian/package.sh
index d19f5dc..62dfff0 100755
--- a/Swift/Packaging/Debian/package.sh
+++ b/Swift/Packaging/Debian/package.sh
@@ -95,18 +95,6 @@ cat $DIRNAME/debian/control.in | sed -e "s/%SWIFTEN_SOVERSION%/$SWIFTEN_SOVERSIO
rm $DIRNAME/debian/control.in
mv $DIRNAME/debian/libswiften.install $DIRNAME/debian/libswiften$SWIFTEN_SOVERSION.install
cat ../../../COPYING.thirdparty | tail -n +3 >> $DIRNAME/debian/copyright
-# Generate updated man-page if possible
-if type "help2man" > /dev/null 2>&1; then
- if [ -f ../../QtUI/swift-im ]; then
- help2man -m "Swift Manual" -S "Swift" -n "swift-im" -N ../../QtUI/swift-im > $DIRNAME/debian/swift-im.1
- fi
- if [ -f ../../../Swiften/Config/swiften-config ]; then
- help2man -m "Swift Manual" -S "swiften-config" -n "swiften-config" -N ../../../Swiften/Config/swiften-config > $DIRNAME/debian/swiften-config.1
- fi
-else
- >2& echo "Unable to generate man pages. Please ensure that help2man is installed"
- exit 1;
-fi
# Build
cd $DIRNAME
diff --git a/Swift/Packaging/Debian/package_all_platforms.sh b/Swift/Packaging/Debian/package_all_platforms.sh
index 097fe38..afd0621 100755
--- a/Swift/Packaging/Debian/package_all_platforms.sh
+++ b/Swift/Packaging/Debian/package_all_platforms.sh
@@ -24,9 +24,15 @@ export SWIFT_FORCE_LUCID="yep"
unset SWIFT_FORCE_LUCID
./package.sh
-for distro in xenial yakkety jessie sid; do
+if [ -z ${SWIFT_PACKAGE_PLATFORMS+x} ];
+then
+ platformsarray=( xenial artful jessie stretch sid )
+else
+ platformsarray=( $SWIFT_PACKAGE_PLATFORMS )
+fi
+
+for distro in "${platformsarray[@]}"; do
for arch in amd64; do
pbuilder-dist $distro $arch build *.dsc
done
done
-
diff --git a/Swift/Packaging/Debian/package_docker.sh b/Swift/Packaging/Debian/package_docker.sh
new file mode 100755
index 0000000..7fd1a3e
--- /dev/null
+++ b/Swift/Packaging/Debian/package_docker.sh
@@ -0,0 +1,70 @@
+#!/bin/bash
+
+set -e
+
+cd $(dirname $(readlink -f $0 || realpath $0))
+export PYTHONPATH=../../../BuildTools/SCons
+VERSION=${VERSION:=`../../../BuildTools/GetBuildVersion.py swift`}
+DEBIAN_VERSION=`../../../BuildTools/DebianizeVersion.py $VERSION`
+SWIFTEN_SOVERSION=`../../../BuildTools/GetBuildVersion.py swift --major`
+SWIFT_SOURCE_DIR=swift-im-$DEBIAN_VERSION
+TARBALLBARE="swift-im_$DEBIAN_VERSION.orig.tar.gz"
+TARBALL="${SHARED_DIR}${TARBALLBARE}"
+# DEVATTN there is an issue with some versions of Qt(5.11.1) and docker see https://bugreports.qt.io/browse/QTBUG-64490. Workaround is to add privileged flag
+if [ -z ${DOCKERRUNEXTRAFLAGS+x} ];
+then
+ DOCKERRUNEXTRAFLAGS="--privileged"
+fi
+
+rm -rf $SWIFT_SOURCE_DIR
+git clone ../../../.git $SWIFT_SOURCE_DIR
+
+rm -rf $SWIFT_SOURCE_DIR/.git
+find $SWIFT_SOURCE_DIR -name .gitignore | xargs rm -f
+find $SWIFT_SOURCE_DIR/3rdParty -type f | grep -v uuid | grep -v SConscript | grep -v miniupnp | grep -v natpmp || xargs rm -f
+find $SWIFT_SOURCE_DIR/3rdParty -depth -empty -type d -exec rmdir {} \;
+rm -rf $SWIFT_SOURCE_DIR/3rdParty/SCons
+rm -rf $SWIFT_SOURCE_DIR/Swift/Packaging/Debian
+rm -rf $SWIFT_SOURCE_DIR/BuildTools/DocBook/Fonts
+rm -rf $SWIFT_SOURCE_DIR/BuildTools/Git/Hooks/commit-msg
+echo $VERSION > $SWIFT_SOURCE_DIR/VERSION.swift
+
+tar czf $TARBALLBARE $SWIFT_SOURCE_DIR
+cp $TARBALLBARE $SWIFT_SOURCE_DIR
+
+cp -r debian $SWIFT_SOURCE_DIR/debian
+../../../BuildTools/UpdateDebianChangelog.py $SWIFT_SOURCE_DIR/debian/changelog $DEBIAN_VERSION
+
+cat $SWIFT_SOURCE_DIR/debian/control.in | sed -e "s/%SWIFTEN_SOVERSION%/$SWIFTEN_SOVERSION/g" | sed -e "s/%WEBKIT_DEPENDENCY%/$WEBKIT_DEPENDENCY/g" > $SWIFT_SOURCE_DIR/debian/control
+rm $SWIFT_SOURCE_DIR/debian/control.in
+mv $SWIFT_SOURCE_DIR/debian/libswiften.install $SWIFT_SOURCE_DIR/debian/libswiften$SWIFTEN_SOVERSION.install
+cat ../../../COPYING.thirdparty | tail -n +3 >> $SWIFT_SOURCE_DIR/debian/copyright
+
+rm -rf swift-src
+mv $SWIFT_SOURCE_DIR swift-src
+docker build -t swift/swiftsourcebuilder -f Dockerfile.source .
+mkdir -p out/source
+docker run --rm -v`pwd`/gpg-keys:/gpg-keys -v`pwd`/out/source:/out swift/swiftsourcebuilder
+
+TMP_DOCKERFILE=Dockerfile.tmp.package
+
+if [ -z ${SWIFT_PACKAGE_PLATFORMS+x} ];
+then
+ platformsarray=( ubuntu:bionic ubuntu:cosmic debian:stretch debian:sid )
+else
+ platformsarray=( $SWIFT_PACKAGE_PLATFORMS )
+fi
+
+for distro in "${platformsarray[@]}";
+do
+ if [ -f $TMP_DOCKERFILE ];
+ then
+ rm $TMP_DOCKERFILE
+ fi
+ cat Dockerfile.package.in | sed -e "s/__DISTRO__/$distro/" -e "s/__DEBIAN_VERSION__/$DEBIAN_VERSION/" > $TMP_DOCKERFILE
+ docker build -t swift/packager -f $TMP_DOCKERFILE out/source
+ OUT_DIR="out/${distro//\://}"
+ echo $OUT_DIR
+ mkdir -p $OUT_DIR
+ docker run --rm $DOCKERRUNEXTRAFLAGS -v`pwd`/gpg-keys:/gpg-keys -v`pwd`/$OUT_DIR:/out swift/packager
+done
diff --git a/Swift/Packaging/Debian/update_debian_repo.sh b/Swift/Packaging/Debian/update_debian_repo.sh
index d62a376..fc736ed 100644
--- a/Swift/Packaging/Debian/update_debian_repo.sh
+++ b/Swift/Packaging/Debian/update_debian_repo.sh
@@ -73,14 +73,25 @@ command -v reprepro >/dev/null 2>&1 || { echo >&2 "This script requires aptly bu
mkdir -p $APT_REPO_ROOT
+if [ -z ${SWIFT_PACKAGE_PLATFORMS+x} ]; then
+ platformsarray=( bionic cosmic stretch sid )
+else
+ platformsarray=( $SWIFT_PACKAGE_PLATFORMS )
+fi
+
# distros
for full_distribution_path in $INCOMING_FOLDER/{debian,ubuntu}/*; do
distro_version=`basename $full_distribution_path`
distro_name=$(basename `dirname $full_distribution_path`)
distro_reprepro_root=${APT_REPO_ROOT}/${distro_name}/${distro_version}
- # ensure reprepro diretctory for this distribution version is present
- if [ ! -d "$distro_preprepro_root" ]; then
+ if ! [[ ${platformsarray[@]} == *"$distro_version"* ]]; then
+ echo "$distro_version was not found in SWIFT_PACKAGE_PLATFORMS. Skipping..."
+ continue
+ fi
+
+ # ensure reprepro directory for this distribution version is present
+ if [ ! -d "$distro_reprepro_root" ]; then
echo "Create distribution repository for $distro_name/$distro_version"
mkdir -p $distro_reprepro_root
mkdir -p ${distro_reprepro_root}/conf
@@ -89,7 +100,7 @@ for full_distribution_path in $INCOMING_FOLDER/{debian,ubuntu}/*; do
write_reprepo_conf_incoming_to_file "${distro_reprepro_root}/conf/incoming" "$full_distribution_path"
fi
- # This is workaround for https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=808558
+ # This is workaround for https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=808558
# and https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=843402
if [ "$distro_name/$distro_version" = "debian/sid" ]; then
sed -i '/dbgsym/ d' $full_distribution_path/*.changes
diff --git a/Swift/Packaging/SConscript b/Swift/Packaging/SConscript
new file mode 100644
index 0000000..fda5182
--- /dev/null
+++ b/Swift/Packaging/SConscript
@@ -0,0 +1,29 @@
+Import("env")
+import os
+
+################################################################################
+# Build
+################################################################################
+
+if env["SCONS_STAGE"] == "build" :
+ help2man = env.WhereIs('help2man', os.environ['PATH'])
+ if help2man:
+ env['HELP2MAN'] = help2man
+ env['HELP2MANSTR'] = "HELP2MAN $TARGET"
+
+ if Dir("#/debian").exists():
+ # This is needed for debian packaging using pbuilder which expects
+ # generated man pages in this location.
+ env['HELP2MAN_DEBIAN_DIR'] = "#/debian"
+ else:
+ env['HELP2MAN_DEBIAN_DIR'] = "Debian/debian"
+
+ swiftenConfigHelp = env.Command(
+ target='$HELP2MAN_DEBIAN_DIR/swiften-config.1', source='#/Swiften/Config/swiften-config',
+ action = Action('$HELP2MAN --no-discard-stderr -m "Swift Manual" -S "swiften-config" -n "swiften-config" -N $SOURCE > $TARGET', cmdstr = "$HELP2MANSTR"))
+ swiftHelp = env.Command(
+ target='$HELP2MAN_DEBIAN_DIR/swift-im.1', source='#/Swift/QtUI/swift-im',
+ action = Action('$HELP2MAN --no-discard-stderr -m "Swift Manual" -S "Swift" -n "swift-im" -N "LD_LIBRARY_PATH=$LD_LIBRARY_PATH:./Swiften $SOURCE" > $TARGET', cmdstr = "$HELP2MANSTR"))
+ else:
+ print("Enabled help2man but help2man is not in the PATH of the current environment.")
+ Exit(1)
diff --git a/Swift/Packaging/WiX/Swift.wxs b/Swift/Packaging/WiX/Swift.wxs
index 1e8d129..a2e8dd6 100644
--- a/Swift/Packaging/WiX/Swift.wxs
+++ b/Swift/Packaging/WiX/Swift.wxs
@@ -3,18 +3,29 @@
<!-- For a sensible tutorial on WiX, see http://wix.tramontana.co.hu/tutorial -->
<Wix xmlns='http://schemas.microsoft.com/wix/2006/wi'>
-
<?include variables.wxs ?>
<Product Name='Swift' Id='*' UpgradeCode='D7F276D5-BA67-421E-817B-9E7AB4B7D2BF' Language='1033' Codepage='1252' Version='$(var.Version)' Manufacturer='Swift.im'>
- <Package Id='*' Keywords='Installer' Description="Swift Installer" Comments="Swift is available under the GPL version 3" Manufacturer="Swift.im" InstallerVersion='300' Languages='1033' Compressed='yes' SummaryCodepage='1252' InstallScope="perMachine"/>
+ <Package Id='*' Keywords='Installer' Description="Swift Installer" Comments="Swift is available under the GPL version 3" Manufacturer="Swift.im" InstallerVersion='500' Languages='1033' Compressed='yes' SummaryCodepage='1252' />
+ <Property Id="ALLUSERS" Value="2" />
+ <Property Id="MSIINSTALLPERUSER" Value="1" />
+ <Property Id="WIXUIVCREDISTINSTALL" Value="0" />
+
+ <Property Id="VCREDISTINSTALLED">
+ <RegistrySearch Id="VCREDISTINSTALLED"
+ Root="HKLM"
+ Key="SOFTWARE\Wow6432Node\Microsoft\VisualStudio\$(var.MsvcDotVersion)\VC\Runtimes\$(sys.BUILDARCH)"
+ Name="Installed"
+ Type="raw" />
+
+ </Property>
<Media Id='1' Cabinet='Swift.cab' EmbedCab='yes'/>
<!-- Schedule the upgrade to afterInstallExecute means that MSI will first install the new version
over the existing version and run the uninstall of the old version afterwards. This way shortcuts
are not recreated on every new installation and pinned shortcuts stay alive.
However this requires that the components for installed files with the same filename will always
- have the same GUID (do not run heat.exe with -gg flag) or else when MSI removes the components
+ have the same GUID (do not run heat.exe with -gg flag) or else when MSI removes the components
of the old version with the same filename as components of the new version it will delete the
files that belong to components of the new version.-->
<MajorUpgrade Schedule="afterInstallExecute" DowngradeErrorMessage="A newer version is already installed. Remove this version if you wish to downgrade." />
@@ -25,6 +36,9 @@
-->
<Directory Id='ProgramFilesFolder' Name='PFiles'>
+ <Directory Id="APPLICATIONFOLDER" Name="Swift">
+ </Directory>
+
<!--<Directory Id='INSTALLDIR' Name='Swift'>
</Directory>-->
</Directory>
@@ -42,8 +56,11 @@
<Directory Id="DesktopFolder" Name="Desktop" />
</Directory>
+ <Property Id="WixAppFolder" Value="WixPerUserFolder" />
+
<Feature Id='Core' Level='1' Title='Swift' Description='All necessary Swift files' Display='expand' ConfigurableDirectory='INSTALLDIR' AllowAdvertise='no' Absent='disallow'>
<ComponentGroupRef Id='Files' />
+ <ComponentGroupRef Id='VCFiles' />
<!--<ComponentRef Id='Manual' />-->
</Feature>
@@ -53,23 +70,133 @@
<!--<UIRef Id='WixUI_Advanced'/>-->
<!--<UIRef Id="WixUI_Minimal"/>-->
- <UIRef Id="WixUI_Mondo"/>
+ <!--UIRef Id="WixUI_Mondo"/-->
+ <UIRef Id="WixUI_Swift"/>
+
<WixVariable Id='WixUILicenseRtf' Value='COPYING.rtf'/>
<Icon Id="Swift.exe" SourceFile="Swift.exe" />
<Property Id="ARPPRODUCTICON" Value="Swift.exe"/> <!-- The icon in the "Programs" dialog -->
- <!--
- VC Redistributable
+ <!--
+ VC Redistributable
-->
<Binary Id="CRTBinary" SourceFile="$(var.VCCRTFile)"/>
<CustomAction Id="CRTAction" Impersonate="no" Return="asyncNoWait" Execute="deferred" BinaryKey="CRTBinary" ExeCommand="/passive"/>
-
+ <InstallUISequence>
+ <!-- Suppress FindRelatedProducts untill the user selects the scope of the install -->
+ <FindRelatedProducts Suppress="yes" />
+ </InstallUISequence>
<InstallExecuteSequence>
- <Custom Action='CRTAction' After='InstallInitialize'/>
+ <Custom Action='CRTAction' After='InstallInitialize'>(NOT VCREDISTINSTALLED AND ALLUSERS = 1) OR WIXUIVCREDISTINSTALL = 1</Custom>
</InstallExecuteSequence>
</Product>
+ <Fragment>
+ <DirectoryRef Id="INSTALLDIR">
+ <Component Id="msvcp.dll" Guid="*">
+ <Condition>(NOT (VCREDISTINSTALLED OR ALLUSERS = 1)) AND WIXUIVCREDISTINSTALL = 0 </Condition>
+ <File Id="msvcp$(var.MsvcVersion).dll" KeyPath="yes" Source="$(var.VCCRTPath)\msvcp$(var.MsvcVersion).dll" />
+ </Component>
+ <Component Id="vcruntime.dll" Guid="*">
+ <Condition>(NOT (VCREDISTINSTALLED OR ALLUSERS = 1)) AND WIXUIVCREDISTINSTALL = 0 </Condition>
+ <?if $(var.MsvcVersion) > "120"?>
+ <File Id="vcruntime$(var.MsvcVersion).dll" KeyPath="yes" Source="$(var.VCCRTPath)\vcruntime$(var.MsvcVersion).dll" />
+ <?else?>
+ <File Id="msvcr$(var.MsvcVersion).dll" KeyPath="yes" Source="$(var.VCCRTPath)\msvcr$(var.MsvcVersion).dll" />
+ <?endif?>
+ </Component>
+ </DirectoryRef>
+ </Fragment>
+ <Fragment>
+ <ComponentGroup Id="VCFiles">
+ <ComponentRef Id="msvcp.dll" />
+ <ComponentRef Id="vcruntime.dll" />
+ </ComponentGroup>
+ </Fragment>
+ <Fragment>
+
+ <WixVariable Id="WixUISupportPerUser" Value="1" Overridable="yes" />
+ <WixVariable Id="WixUISupportPerMachine" Value="1" Overridable="yes" />
+
+ <!-- This is Based on WixUI_Mondo, but it adds an InstallScopeDlg dialog -->
+ <UI Id="WixUI_Swift">
+ <TextStyle Id="WixUI_Font_Normal" FaceName="Tahoma" Size="8" />
+ <TextStyle Id="WixUI_Font_Bigger" FaceName="Tahoma" Size="12" />
+ <TextStyle Id="WixUI_Font_Title" FaceName="Tahoma" Size="9" Bold="yes" />
+
+ <Property Id="DefaultUIFont" Value="WixUI_Font_Normal" />
+ <Property Id="WixUI_Mode" Value="Mondo" />
+
+ <DialogRef Id="ErrorDlg" />
+ <DialogRef Id="FatalError" />
+ <DialogRef Id="FilesInUse" />
+ <DialogRef Id="MsiRMFilesInUse" />
+ <DialogRef Id="PrepareDlg" />
+ <DialogRef Id="ProgressDlg" />
+ <DialogRef Id="ResumeDlg" />
+ <DialogRef Id="UserExit" />
+
+ <Publish Dialog="ExitDialog" Control="Finish" Event="EndDialog" Value="Return" Order="999">1</Publish>
+
+ <Publish Dialog="WelcomeDlg" Control="Next" Event="NewDialog" Value="LicenseAgreementDlg">NOT Installed AND NOT PATCH</Publish>
+ <Publish Dialog="WelcomeDlg" Control="Next" Event="NewDialog" Value="VerifyReadyDlg">Installed AND PATCH</Publish>
+
+ <Publish Dialog="LicenseAgreementDlg" Control="Back" Event="NewDialog" Value="WelcomeDlg">1</Publish>
+ <Publish Dialog="LicenseAgreementDlg" Control="Next" Event="NewDialog" Value="InstallScopeDlg" Order="2">LicenseAccepted = "1"</Publish>
+
+ <Publish Dialog="InstallScopeDlg" Control="Back" Event="NewDialog" Value="LicenseAgreementDlg">1</Publish>
+ <!-- override default WixAppFolder of WixPerMachineFolder as standard user won't be shown the radio group to set WixAppFolder -->
+ <Publish Dialog="InstallScopeDlg" Control="Next" Property="WixAppFolder" Value="WixPerUserFolder" Order="1">!(wix.WixUISupportPerUser) AND NOT Privileged</Publish>
+ <Publish Dialog="InstallScopeDlg" Control="Next" Property="ALLUSERS" Value="{}" Order="2">WixAppFolder = "WixPerUserFolder"</Publish>
+ <Publish Dialog="InstallScopeDlg" Control="Next" Property="ALLUSERS" Value="1" Order="3">WixAppFolder = "WixPerMachineFolder"</Publish>
+ <Publish Dialog="InstallScopeDlg" Control="Next" Property="APPLICATIONFOLDER" Value="[WixPerUserFolder]" Order="4">WixAppFolder = "WixPerUserFolder"</Publish>
+ <Publish Dialog="InstallScopeDlg" Control="Next" Property="APPLICATIONFOLDER" Value="[WixPerMachineFolder]" Order="5">WixAppFolder = "WixPerMachineFolder"</Publish>
+ <Publish Dialog="InstallScopeDlg" Control="Next" Event="NewDialog" Value="SetupTypeDlg">1</Publish>
+ <!-- After selecting the scope of the installation, run FindRelatedProducts to find previous versions that needs upgrading -->
+ <Publish Dialog="InstallScopeDlg" Control="Next" Event="DoAction" Value="FindRelatedProducts" Order="6">1</Publish>
+
+ <Publish Dialog="SetupTypeDlg" Control="Back" Event="NewDialog" Value="InstallScopeDlg">1</Publish>
+ <Publish Dialog="SetupTypeDlg" Control="TypicalButton" Event="NewDialog" Value="VCResdistDialog">NOT VCREDISTINSTALLED AND NOT ALLUSERS </Publish>
+ <Publish Dialog="SetupTypeDlg" Control="CustomButton" Event="NewDialog" Value="CustomizeDlg">NOT VCREDISTINSTALLED AND NOT ALLUSERS </Publish>
+ <Publish Dialog="SetupTypeDlg" Control="CompleteButton" Event="NewDialog" Value="VCResdistDialog">NOT VCREDISTINSTALLED AND NOT ALLUSERS </Publish>
+ <Publish Dialog="SetupTypeDlg" Control="TypicalButton" Event="NewDialog" Value="VerifyReadyDlg">VCREDISTINSTALLED OR ALLUSERS = 1</Publish>
+ <Publish Dialog="SetupTypeDlg" Control="CustomButton" Event="NewDialog" Value="CustomizeDlg">VCREDISTINSTALLED OR ALLUSERS = 1</Publish>
+ <Publish Dialog="SetupTypeDlg" Control="CompleteButton" Event="NewDialog" Value="VerifyReadyDlg">VCREDISTINSTALLED OR ALLUSERS = 1</Publish>
+
+ <Dialog Id="VCResdistDialog" Width="260" Height="85" Title="[ProductName] Setup">
+ <Control Id="VcRredistNo" Type="PushButton" X="132" Y="57" Width="56" Height="17" Default="yes" Cancel="yes" Text="!(loc.WixUINo)">
+ <Publish Property="WIXUIVCREDISTINSTALL" Value="0">1</Publish>
+ <Publish Event="NewDialog" Value="VerifyReadyDlg">1</Publish>
+ </Control>
+ <Control Id="VcRredistYes" Type="PushButton" X="72" Y="57" Width="56" Height="17" Text="!(loc.WixUIYes)">
+ <Publish Property="WIXUIVCREDISTINSTALL" Value="1">1</Publish>
+ <Publish Event="NewDialog" Value="VerifyReadyDlg">1</Publish>
+ </Control>
+ <Control Id="Text" Type="Text" X="48" Y="15" Width="194" Height="30" NoPrefix="yes" Text="Visual Studio redistributables installation was not found on your computer. Would you like Swift to install them?" />
+ <Control Id="Icon" Type="Icon" X="15" Y="15" Width="24" Height="24" ToolTip="!(loc.CancelDlgIconTooltip)" FixedSize="yes" IconSize="32" Text="!(loc.CancelDlgIcon)" />
+ </Dialog>
+
+ <Publish Dialog="CustomizeDlg" Control="Back" Event="NewDialog" Value="MaintenanceTypeDlg" Order="1">WixUI_InstallMode = "Change"</Publish>
+ <Publish Dialog="CustomizeDlg" Control="Back" Event="NewDialog" Value="SetupTypeDlg" Order="2">WixUI_InstallMode = "InstallCustom"</Publish>
+ <Publish Dialog="CustomizeDlg" Control="Next" Event="NewDialog" Value="VCResdistDialog" Order="1">NOT VCREDISTINSTALLED AND NOT ALLUSERS</Publish>
+ <Publish Dialog="CustomizeDlg" Control="Next" Event="NewDialog" Value="VerifyReadyDlg" Order="2">VCREDISTINSTALLED OR ALLUSERS = 1</Publish>
+
+ <Publish Dialog="VerifyReadyDlg" Control="Back" Event="NewDialog" Value="CustomizeDlg" Order="1">WixUI_InstallMode = "InstallCustom"</Publish>
+ <Publish Dialog="VerifyReadyDlg" Control="Back" Event="NewDialog" Value="SetupTypeDlg" Order="2">WixUI_InstallMode = "InstallTypical" OR WixUI_InstallMode = "InstallComplete"</Publish>
+ <Publish Dialog="VerifyReadyDlg" Control="Back" Event="NewDialog" Value="CustomizeDlg" Order="3">WixUI_InstallMode = "Change"</Publish>
+ <Publish Dialog="VerifyReadyDlg" Control="Back" Event="NewDialog" Value="MaintenanceTypeDlg" Order="4">WixUI_InstallMode = "Repair" OR WixUI_InstallMode = "Remove"</Publish>
+ <Publish Dialog="VerifyReadyDlg" Control="Back" Event="NewDialog" Value="WelcomeDlg" Order="2">WixUI_InstallMode = "Update"</Publish>
+
+ <Publish Dialog="MaintenanceWelcomeDlg" Control="Next" Event="NewDialog" Value="MaintenanceTypeDlg">1</Publish>
+
+ <Publish Dialog="MaintenanceTypeDlg" Control="ChangeButton" Event="NewDialog" Value="CustomizeDlg">1</Publish>
+ <Publish Dialog="MaintenanceTypeDlg" Control="RepairButton" Event="NewDialog" Value="VerifyReadyDlg">1</Publish>
+ <Publish Dialog="MaintenanceTypeDlg" Control="RemoveButton" Event="NewDialog" Value="VerifyReadyDlg">1</Publish>
+ <Publish Dialog="MaintenanceTypeDlg" Control="Back" Event="NewDialog" Value="MaintenanceWelcomeDlg">1</Publish>
+ </UI>
+ <UIRef Id="WixUI_Common" />
+ </Fragment>
</Wix>
diff --git a/Swift/Packaging/WiX/Swift_en-us.wxl b/Swift/Packaging/WiX/Swift_en-us.wxl
new file mode 100644
index 0000000..780b290
--- /dev/null
+++ b/Swift/Packaging/WiX/Swift_en-us.wxl
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<WixLocalization Culture="en-us" xmlns="http://schemas.microsoft.com/wix/2006/localization">
+ <String Id="InstallScopeDlgPerUserDescription">[ProductName] will be installed in a user folder and auto-updates will be enabled. The application be installed only for your user and you do not need to be an Administrator. </String>
+</WixLocalization>
diff --git a/Swift/Packaging/WiX/include.xslt b/Swift/Packaging/WiX/include.xslt
index ec1ad50..df86446 100644
--- a/Swift/Packaging/WiX/include.xslt
+++ b/Swift/Packaging/WiX/include.xslt
@@ -1,6 +1,6 @@
<?xml version="1.0"?>
-<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:wix="http://schemas.microsoft.com/wix/2006/wi">
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:wix="http://schemas.microsoft.com/wix/2006/wi" xmlns="http://schemas.microsoft.com/wix/2006/wi" exclude-result-prefixes="xsl wix">
<xsl:template match='wix:Directory[@Id="Swift"]/@Id'>
<xsl:attribute name='Id'>INSTALLDIR</xsl:attribute>
@@ -11,4 +11,14 @@
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
+
+ <xsl:template match="wix:Component">
+ <xsl:copy>
+ <xsl:apply-templates select="@*"/>
+ <xsl:value-of select="concat(preceding-sibling::text(), ' ')" />
+ <RemoveFile Id="remove_{@Id}" Name="{@Id}" On="install" />
+ <xsl:apply-templates select="node()"/>
+ </xsl:copy>
+ </xsl:template>
+
</xsl:stylesheet>
diff --git a/Swift/QtUI/CAPICertificateSelector.cpp b/Swift/QtUI/CAPICertificateSelector.cpp
index 36d8c54..7e4bc0b 100644
--- a/Swift/QtUI/CAPICertificateSelector.cpp
+++ b/Swift/QtUI/CAPICertificateSelector.cpp
@@ -18,7 +18,9 @@
#include <boost/algorithm/string.hpp>
#include <Swift/Controllers/Intl.h>
#include <Swift/QtUI/QtSwiftUtil.h>
+
#include <Swiften/Base/Log.h>
+#include <Swiften/TLS/Schannel/SchannelUtil.h>
namespace Swift {
@@ -78,32 +80,31 @@ std::string selectCAPICertificate() {
if (titleLength == 0 || promptLength == 0) {
int error = GetLastError();
switch (error) {
- case ERROR_INSUFFICIENT_BUFFER: SWIFT_LOG(error) << "Insufficient buffer for rendering cert dialog" << std::endl;break;
- case ERROR_INVALID_FLAGS: SWIFT_LOG(error) << "Invalid flags for rendering cert dialog" << std::endl;break;
- case ERROR_INVALID_PARAMETER: SWIFT_LOG(error) << "Invalid parameter for rendering cert dialog" << std::endl;break;
- case ERROR_NO_UNICODE_TRANSLATION: SWIFT_LOG(error) << "Invalid unicode for rendering cert dialog" << std::endl;break;
- default: SWIFT_LOG(error) << "Unexpected multibyte conversion errorcode" << std::endl;
+ case ERROR_INSUFFICIENT_BUFFER: SWIFT_LOG(error) << "Insufficient buffer for rendering cert dialog"; break;
+ case ERROR_INVALID_FLAGS: SWIFT_LOG(error) << "Invalid flags for rendering cert dialog"; break;
+ case ERROR_INVALID_PARAMETER: SWIFT_LOG(error) << "Invalid parameter for rendering cert dialog"; break;
+ case ERROR_NO_UNICODE_TRANSLATION: SWIFT_LOG(error) << "Invalid unicode for rendering cert dialog"; break;
+ default: SWIFT_LOG(error) << "Unexpected multibyte conversion errorcode";
}
}
-
-
+ std::string result;
/* Call Windows dialog to select a suitable certificate */
- PCCERT_CONTEXT cert = CryptUIDlgSelectCertificateFromStore(hstore, hwnd, titleChars, promptChars, exclude_columns, 0, NULL);
+ {
+ ScopedCertContext cert(CryptUIDlgSelectCertificateFromStore(hstore, hwnd, titleChars, promptChars, exclude_columns, 0, NULL));
+ if (cert) {
+ result = getCertUri(cert, certStoreName);
+ }
+ }
delete[] titleChars;
delete[] promptChars;
if (hstore) {
- CertCloseStore(hstore, 0);
- }
-
- std::string result;
-
- if (cert) {
- result = getCertUri(cert, certStoreName);
- CertFreeCertificateContext(cert);
+ if (CertCloseStore(hstore, 0) == FALSE) {
+ SWIFT_LOG(debug) << "Failed to close the certificate store handle.";
+ }
}
return result;
diff --git a/Swift/QtUI/ChatList/QtChatListWindow.cpp b/Swift/QtUI/ChatList/QtChatListWindow.cpp
index 3caed57..2fd05c4 100644
--- a/Swift/QtUI/ChatList/QtChatListWindow.cpp
+++ b/Swift/QtUI/ChatList/QtChatListWindow.cpp
@@ -86,11 +86,9 @@ void QtChatListWindow::handleClicked(const QModelIndex& index) {
void QtChatListWindow::setupContextMenus() {
mucMenu_ = new QMenu();
- onlineOnlyActions_ << mucMenu_->addAction(tr("Add New Bookmark"), this, SLOT(handleAddBookmark()));
onlineOnlyActions_ << mucMenu_->addAction(tr("Edit Bookmark"), this, SLOT(handleEditBookmark()));
onlineOnlyActions_ << mucMenu_->addAction(tr("Remove Bookmark"), this, SLOT(handleRemoveBookmark()));
emptyMenu_ = new QMenu();
- onlineOnlyActions_ << emptyMenu_->addAction(tr("Add New Bookmark"), this, SLOT(handleAddBookmark()));
}
void QtChatListWindow::handleItemActivated(const QModelIndex& index) {
@@ -132,7 +130,7 @@ void QtChatListWindow::setRecents(const std::list<ChatListWindow::Chat>& recents
model_->setRecents(recents);
}
-void QtChatListWindow::setUnreadCount(int unread) {
+void QtChatListWindow::setUnreadCount(size_t unread) {
emit onCountUpdated(unread);
}
@@ -146,22 +144,6 @@ void QtChatListWindow::handleRemoveBookmark() {
eventStream_->send(std::make_shared<RemoveMUCBookmarkUIEvent>(mucItem->getBookmark()));
}
-void QtChatListWindow::handleAddBookmarkFromRecents() {
- const ChatListRecentItem* item = dynamic_cast<const ChatListRecentItem*>(contextMenuItem_);
- if (item) {
- const ChatListWindow::Chat& chat = item->getChat();
- MUCBookmark bookmark(chat.jid, chat.jid.toBare().toString());
- bookmark.setNick(chat.nick);
- bookmark.setPassword(chat.password);
- eventStream_->send(std::make_shared<AddMUCBookmarkUIEvent>(bookmark));
- }
-}
-
-void QtChatListWindow::handleAddBookmark() {
- (new QtAddBookmarkWindow(eventStream_))->show();
-}
-
-
void QtChatListWindow::handleEditBookmark() {
const ChatListMUCItem* mucItem = dynamic_cast<const ChatListMUCItem*>(contextMenuItem_);
if (!mucItem) return;
@@ -208,11 +190,8 @@ void QtChatListWindow::contextMenuEvent(QContextMenuEvent* event) {
if (mucItem) {
contextMenuItem_ = mucItem;
bookmarkAction = mucRecentsMenu.addAction(tr("Edit Bookmark"), this, SLOT(handleEditBookmark()));
+ bookmarkAction->setEnabled(isOnline_);
}
- else {
- bookmarkAction = mucRecentsMenu.addAction(tr("Add to Bookmarks"), this, SLOT(handleAddBookmarkFromRecents()));
- }
- bookmarkAction->setEnabled(isOnline_);
mucRecentsMenu.addAction(tr("Clear recents"), this, SLOT(handleClearRecentsRequested()));
mucRecentsMenu.exec(QCursor::pos());
return;
diff --git a/Swift/QtUI/ChatList/QtChatListWindow.h b/Swift/QtUI/ChatList/QtChatListWindow.h
index 834e318..3322001 100644
--- a/Swift/QtUI/ChatList/QtChatListWindow.h
+++ b/Swift/QtUI/ChatList/QtChatListWindow.h
@@ -27,18 +27,16 @@ namespace Swift {
void removeWhiteboardSession(const JID& jid);
void setBookmarksEnabled(bool enabled);
void setRecents(const std::list<ChatListWindow::Chat>& recents);
- void setUnreadCount(int unread);
+ void setUnreadCount(size_t unread);
void clearBookmarks();
virtual void setOnline(bool isOnline);
signals:
- void onCountUpdated(int count);
+ void onCountUpdated(size_t count);
private slots:
void handleItemActivated(const QModelIndex&);
- void handleAddBookmark();
void handleEditBookmark();
void handleRemoveBookmark();
- void handleAddBookmarkFromRecents();
void handleClicked(const QModelIndex& index);
void handleSettingChanged(const std::string& setting);
void handleClearRecentsRequested();
diff --git a/Swift/QtUI/ChattablesModel.cpp b/Swift/QtUI/ChattablesModel.cpp
new file mode 100644
index 0000000..67d0579
--- /dev/null
+++ b/Swift/QtUI/ChattablesModel.cpp
@@ -0,0 +1,63 @@
+/*
+ * Copyright (c) 2018 Isode Limited.
+ * All rights reserved.
+ * See the COPYING file for more information.
+ */
+
+#include <Swift/QtUI/ChattablesModel.h>
+
+#include <QDebug>
+
+#include <Swift/Controllers/Chat/Chattables.h>
+
+#include <Swift/QtUI/QtSwiftUtil.h>
+
+namespace Swift {
+
+ChattablesModel::ChattablesModel(Chattables& chattables, QObject* parent) : QAbstractListModel(parent), chattables_(chattables) {
+ using scoped_connection = boost::signals2::scoped_connection;
+ connectionList_.emplace_back(std::make_unique<scoped_connection>(
+ chattables_.onBeginAdd.connect([this](int index) {beginInsertRows(QModelIndex(), index, index);})
+ ));
+ connectionList_.emplace_back(std::make_unique<scoped_connection>(
+ chattables_.onAdded.connect([this]() {endInsertRows();})
+ ));
+ connectionList_.emplace_back(std::make_unique<scoped_connection>(
+ chattables_.onChanged.connect(
+ [this](const JID& jid, int index) {
+ auto modelIndex = createIndex(index, 0, const_cast<JID*>(&jid));
+ dataChanged(modelIndex, modelIndex, {});
+ }
+ )
+ ));
+}
+
+int ChattablesModel::rowCount(const QModelIndex& /*parent*/) const {
+ return chattables_.get().size();
+}
+
+QVariant ChattablesModel::data(const QModelIndex& index, int role) const {
+ //FIXME: Check validity
+ auto state = chattables_.getState(chattables_.get()[index.row()]);
+ if (role == Qt::DisplayRole) {
+ return P2QSTRING((state.name.empty() ? state.jid.toString() : state.name));
+ }
+ if (role == UnreadCountRole) {
+ return QString::number(state.unreadCount);
+ }
+ if (role == TypeRole) {
+ switch (state.type) {
+ case Chattables::State::Type::Room: return "ROOM";
+ case Chattables::State::Type::Person: return "PERSON";
+ }
+ }
+ if (role == StatusRole) {
+ return QVariant(static_cast<int>(state.status));
+ }
+ if (role == JIDRole) {
+ return P2QSTRING(state.jid.toString());
+ }
+ return QVariant();
+}
+
+}
diff --git a/Swift/QtUI/ChattablesModel.h b/Swift/QtUI/ChattablesModel.h
new file mode 100644
index 0000000..6617d97
--- /dev/null
+++ b/Swift/QtUI/ChattablesModel.h
@@ -0,0 +1,34 @@
+/*
+ * Copyright (c) 2018 Isode Limited.
+ * All rights reserved.
+ * See the COPYING file for more information.
+ */
+
+#pragma once
+
+#include <memory>
+#include <vector>
+
+#include <boost/signals2/connection.hpp>
+
+#include <QAbstractListModel>
+
+namespace Swift {
+class Chattables;
+class ChattablesModel : public QAbstractListModel {
+ public:
+ enum ChattablesRoles {
+ UnreadCountRole = Qt::UserRole,
+ TypeRole = Qt::UserRole + 1,
+ StatusRole = Qt::UserRole + 2,
+ JIDRole = Qt::UserRole + 3
+ };
+ ChattablesModel(Chattables& chattables, QObject* parent);
+ int rowCount(const QModelIndex& parent = QModelIndex()) const;
+ QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const;
+ private:
+ Chattables& chattables_;
+ std::vector<std::unique_ptr<boost::signals2::scoped_connection>> connectionList_;
+};
+
+}
diff --git a/Swift/QtUI/FlowLayout.cpp b/Swift/QtUI/FlowLayout.cpp
index c42b7e1..8a12841 100644
--- a/Swift/QtUI/FlowLayout.cpp
+++ b/Swift/QtUI/FlowLayout.cpp
@@ -49,7 +49,6 @@
****************************************************************************/
#include <QtWidgets>
-
#include "FlowLayout.h"
FlowLayout::FlowLayout(QWidget *parent, int margin, int hSpacing, int vSpacing)
: QLayout(parent), m_hSpace(hSpacing), m_vSpace(vSpacing)
@@ -108,12 +107,12 @@ QLayoutItem *FlowLayout::takeAt(int index)
if (index >= 0 && index < itemList.size())
return itemList.takeAt(index);
else
- return 0;
+ return nullptr;
}
Qt::Orientations FlowLayout::expandingDirections() const
{
- return 0;
+ return nullptr;
}
bool FlowLayout::hasHeightForWidth() const
@@ -192,7 +191,7 @@ int FlowLayout::smartSpacing(QStyle::PixelMetric pm) const
return -1;
} else if (parent->isWidgetType()) {
QWidget *pw = static_cast<QWidget *>(parent);
- return pw->style()->pixelMetric(pm, 0, pw);
+ return pw->style()->pixelMetric(pm, nullptr, pw);
} else {
return static_cast<QLayout *>(parent)->spacing();
}
diff --git a/Swift/QtUI/QtAboutWidget.cpp b/Swift/QtUI/QtAboutWidget.cpp
index 2db0c9d..0a4e0ba 100644
--- a/Swift/QtUI/QtAboutWidget.cpp
+++ b/Swift/QtUI/QtAboutWidget.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010-2017 Isode Limited.
+ * Copyright (c) 2010-2019 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -150,7 +150,7 @@ void QtAboutWidget::openPlainTextWindow(const QString& path) {
text->activateWindow();
}
else {
- SWIFT_LOG(error) << "Failed to open " << Q2PSTRING(path) << "." << std::endl;
+ SWIFT_LOG(error) << "Failed to open " << Q2PSTRING(path) << ".";
}
}
diff --git a/Swift/QtUI/QtBookmarkDetailWindow.cpp b/Swift/QtUI/QtBookmarkDetailWindow.cpp
index 920e94e..efa0e25 100644
--- a/Swift/QtUI/QtBookmarkDetailWindow.cpp
+++ b/Swift/QtUI/QtBookmarkDetailWindow.cpp
@@ -42,7 +42,7 @@ boost::optional<MUCBookmark> QtBookmarkDetailWindow::createBookmarkFromForm() {
MUCBookmark bookmark(room, name);
std::string nick(Q2PSTRING(nick_->text()));
std::string password(Q2PSTRING(password_->text()));
- bookmark.setAutojoin(autojoin_->isChecked());
+ bookmark.setAutojoin(true);
if (!nick.empty()) {
bookmark.setNick(nick);
}
@@ -68,12 +68,6 @@ void QtBookmarkDetailWindow::createFormFromBookmark(const MUCBookmark& bookmark)
if (bookmark.getPassword()) {
password_->setText(P2QSTRING((*bookmark.getPassword())));
}
-
- if (bookmark.getAutojoin()) {
- autojoin_->setCheckState(Qt::Checked);
- } else {
- autojoin_->setCheckState(Qt::Unchecked);
- }
}
}
diff --git a/Swift/QtUI/QtBookmarkDetailWindow.ui b/Swift/QtUI/QtBookmarkDetailWindow.ui
index be55686..affb7e4 100644
--- a/Swift/QtUI/QtBookmarkDetailWindow.ui
+++ b/Swift/QtUI/QtBookmarkDetailWindow.ui
@@ -82,29 +82,6 @@
<item row="3" column="1">
<widget class="QLineEdit" name="password_"/>
</item>
- <item row="4" column="0">
- <spacer name="horizontalSpacer">
- <property name="orientation">
- <enum>Qt::Horizontal</enum>
- </property>
- <property name="sizeHint" stdset="0">
- <size>
- <width>40</width>
- <height>20</height>
- </size>
- </property>
- </spacer>
- </item>
- <item row="4" column="1">
- <widget class="QCheckBox" name="autojoin_">
- <property name="text">
- <string>Enter automatically</string>
- </property>
- <property name="checked">
- <bool>true</bool>
- </property>
- </widget>
- </item>
</layout>
</item>
<item>
diff --git a/Swift/QtUI/QtCachedImageScaler.cpp b/Swift/QtUI/QtCachedImageScaler.cpp
index e1f540b..445d113 100644
--- a/Swift/QtUI/QtCachedImageScaler.cpp
+++ b/Swift/QtUI/QtCachedImageScaler.cpp
@@ -21,7 +21,7 @@ QtCachedImageScaler::QtCachedImageScaler() {
boost::filesystem::path QtCachedImageScaler::getScaledImage(const boost::filesystem::path& imagePath, int size) {
boost::filesystem::path scaledImagePath(imagePath);
- std::string suffix = "." + boost::lexical_cast<std::string>(size);
+ std::string suffix = "." + std::to_string(size);
scaledImagePath = stringToPath(pathToString(scaledImagePath) + suffix);
if (!boost::filesystem::exists(scaledImagePath)) {
QImage image(P2QSTRING(pathToString(imagePath)));
diff --git a/Swift/QtUI/QtChatOverview.cpp b/Swift/QtUI/QtChatOverview.cpp
new file mode 100644
index 0000000..76943e9
--- /dev/null
+++ b/Swift/QtUI/QtChatOverview.cpp
@@ -0,0 +1,66 @@
+/*
+ * Copyright (c) 2018 Isode Limited.
+ * All rights reserved.
+ * See the COPYING file for more information.
+ */
+
+#include <Swift/QtUI/QtChatOverview.h>
+
+#include <QHBoxLayout>
+#include <QLabel>
+#include <QPalette>
+#include <QVBoxLayout>
+
+#include <Swift/Controllers/Chat/Chattables.h>
+
+#include <Swift/QtUI/ChattablesModel.h>
+#include <Swift/QtUI/QtChatOverviewBundle.h>
+
+namespace Swift {
+
+QtChatOverview::QtChatOverview(Chattables& chattables, QWidget* parent) : QWidget(parent), chattables_(chattables) {
+ QPalette newPalette = palette();
+ newPalette.setColor(QPalette::Background, {38, 81, 112});
+ setAutoFillBackground(true);
+ newPalette.setColor(QPalette::Foreground, {255, 255, 255});
+ setPalette(newPalette);
+
+ auto mainLayout = new QVBoxLayout();
+ setLayout(mainLayout);
+
+ auto headerLayout = new QHBoxLayout();
+ mainLayout->addLayout(headerLayout);
+ auto allLabel = new QLabel(tr("All"), this);
+ allLabel->setStyleSheet("color: white;");
+ auto peopleLabel = new QLabel(tr("People"), this);
+ peopleLabel->setStyleSheet("color: white;");
+ auto roomsLabel = new QLabel(tr("Rooms"), this);
+ roomsLabel->setStyleSheet("color: white;");
+ headerLayout->addWidget(allLabel);
+ headerLayout->addWidget(peopleLabel);
+ headerLayout->addWidget(roomsLabel);
+
+ rootModel_ = new ChattablesModel(chattables_, this);
+
+ auto unreadBundle = new QtChatOverviewBundle(rootModel_, "UNREAD", true, this);
+ connect(unreadBundle, SIGNAL(clicked(JID)), this, SLOT(handleItemClicked(JID)));
+ mainLayout->addWidget(unreadBundle);
+
+ auto peopleBundle = new QtChatOverviewBundle(rootModel_, "PEOPLE", false, this);
+ connect(peopleBundle, SIGNAL(clicked(JID)), this, SLOT(handleItemClicked(JID)));
+ mainLayout->addWidget(peopleBundle);
+
+ auto roomsBundle = new QtChatOverviewBundle(rootModel_, "ROOMS", false, this);
+ connect(roomsBundle, SIGNAL(clicked(JID)), this, SLOT(handleItemClicked(JID)));
+ mainLayout->addWidget(roomsBundle);
+
+ mainLayout->addStretch();
+}
+
+QtChatOverview::~QtChatOverview() {}
+
+void QtChatOverview::handleItemClicked(JID jid) {
+ chattables_.onActivated(jid);
+}
+
+} // namespace Swift
diff --git a/Swift/QtUI/QtChatOverview.h b/Swift/QtUI/QtChatOverview.h
new file mode 100644
index 0000000..8cd7762
--- /dev/null
+++ b/Swift/QtUI/QtChatOverview.h
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 2018 Isode Limited.
+ * All rights reserved.
+ * See the COPYING file for more information.
+ */
+
+#pragma once
+
+#include <QWidget>
+
+#include <Swiften/JID/JID.h>
+
+namespace Swift {
+ class Chattables;
+ class ChattablesModel;
+ class QtChatOverview : public QWidget {
+ Q_OBJECT
+ public:
+ QtChatOverview(Chattables&, QWidget* parent);
+ ~QtChatOverview() override;
+
+ private slots:
+ void handleItemClicked(JID jid);
+ private:
+ Chattables& chattables_;
+ ChattablesModel* rootModel_;
+ };
+}
diff --git a/Swift/QtUI/QtChatOverviewBundle.cpp b/Swift/QtUI/QtChatOverviewBundle.cpp
new file mode 100644
index 0000000..121ae2e
--- /dev/null
+++ b/Swift/QtUI/QtChatOverviewBundle.cpp
@@ -0,0 +1,146 @@
+/*
+ * Copyright (c) 2018 Isode Limited.
+ * All rights reserved.
+ * See the COPYING file for more information.
+ */
+
+#include <Swift/QtUI/QtChatOverviewBundle.h>
+
+#include <QHBoxLayout>
+#include <QLabel>
+#include <QPalette>
+#include <QSortFilterProxyModel>
+#include <QVBoxLayout>
+
+#include <Swiften/Elements/StatusShow.h>
+
+#include <Swift/QtUI/ChattablesModel.h>
+#include <Swift/QtUI/QtChatOverviewDelegate.h>
+#include <Swift/QtUI/QtClickableLabel.h>
+#include <Swift/QtUI/QtExpandedListView.h>
+#include <Swift/QtUI/QtSwiftUtil.h>
+
+namespace Swift {
+
+BundleFilter::BundleFilter(QObject* parent) : QSortFilterProxyModel(parent) {
+ sort(0, Qt::AscendingOrder);
+ setDynamicSortFilter(true);
+ setSortCaseSensitivity(Qt::CaseSensitivity::CaseInsensitive);
+}
+
+void BundleFilter::addFilter(Filter filter) {
+ filters_.emplace(filter);
+ invalidateFilter();
+}
+
+bool BundleFilter::hasFilter(Filter filter) {
+ return filters_.count(filter) > 0;
+}
+
+void BundleFilter::removeFilter(Filter filter) {
+ filters_.erase(filter);
+ invalidateFilter();
+}
+
+bool BundleFilter::filterAcceptsRow(int sourceRow, const QModelIndex& sourceParent) const {
+ auto row = sourceModel()->index(sourceRow, 0, sourceParent);
+ if (filters_.count(Filter::Unread)) {
+ if (row.data(ChattablesModel::UnreadCountRole).toInt() == 0) {
+ return false;
+ }
+ }
+ if (filters_.count(Filter::People)) {
+ if (row.data(ChattablesModel::TypeRole).toString() != "PERSON") {
+ return false;
+ }
+ }
+ if (filters_.count(Filter::Rooms)) {
+ if (row.data(ChattablesModel::TypeRole).toString() != "ROOM") {
+ return false;
+ }
+ }
+ if (filters_.count(Filter::Online)) {
+ if (static_cast<StatusShow::Type>(row.data(ChattablesModel::StatusRole).toInt()) == StatusShow::None) {
+ return false;
+ }
+ }
+ return true;
+}
+
+QtChatOverviewBundle::QtChatOverviewBundle(ChattablesModel* rootModel, QString name, bool hideWhenEmpty, QWidget* parent) : QWidget(parent), rootModel_(rootModel), hideWhenEmpty_(hideWhenEmpty) {
+ proxyModel_ = new BundleFilter(this);
+ if (name == "UNREAD") { // FIXME: Obviously needs a better approach
+ proxyModel_->addFilter(BundleFilter::Filter::Unread);
+ }
+ if (name == "PEOPLE") {
+ proxyModel_->addFilter(BundleFilter::Filter::People);
+ proxyModel_->addFilter(BundleFilter::Filter::Online);
+ }
+ if (name == "ROOMS") {
+ proxyModel_->addFilter(BundleFilter::Filter::Rooms);
+ proxyModel_->addFilter(BundleFilter::Filter::Online);
+ }
+ proxyModel_->setSourceModel(rootModel);
+
+
+ auto mainLayout = new QVBoxLayout();
+ setLayout(mainLayout);
+
+ auto headerLayout = new QHBoxLayout();
+ mainLayout->addLayout(headerLayout);
+ auto nameLabel = new QLabel(name, this);
+ nameLabel->setStyleSheet("color: white;");
+ headerLayout->addWidget(nameLabel);
+ headerLayout->addStretch();
+ if (!hideWhenEmpty_) {
+ filterLabel_ = new QtClickableLabel(this);
+ filterLabel_->setText(tr("Online"));
+ filterLabel_->setStyleSheet("color: white;");
+ headerLayout->addWidget(filterLabel_);
+ connect(filterLabel_, SIGNAL(clicked()), this, SLOT(handleFilterClicked()));
+ }
+ listView_ = new QtExpandedListView(this);
+ listView_->setModel(proxyModel_);
+ listView_->setFrameStyle(QFrame::NoFrame);
+ listView_->setItemDelegate(new QtChatOverviewDelegate(this));
+ connect(listView_, SIGNAL(clicked(const QModelIndex&)), this, SLOT(handleItemClicked(const QModelIndex&)));
+ mainLayout->addWidget(listView_);
+
+ if (hideWhenEmpty_) {
+ connect(proxyModel_, &QAbstractItemModel::modelReset, this, [&](){
+ updateVisibility();
+ });
+ connect(proxyModel_, &QAbstractItemModel::rowsInserted, this, [&](){
+ updateVisibility();
+ });
+ connect(proxyModel_, &QAbstractItemModel::rowsRemoved, this, [&](){
+ updateVisibility();
+ });
+ updateVisibility();
+ }
+}
+
+QtChatOverviewBundle::~QtChatOverviewBundle() {}
+
+void QtChatOverviewBundle::handleFilterClicked() {
+ if (proxyModel_->hasFilter(BundleFilter::Filter::Online)) {
+ proxyModel_->removeFilter(BundleFilter::Filter::Online);
+ filterLabel_->setText(tr("All"));
+ }
+ else {
+ proxyModel_->addFilter(BundleFilter::Filter::Online);
+ filterLabel_->setText(tr("Online"));
+ }
+}
+
+void QtChatOverviewBundle::updateVisibility() {
+ auto shouldBeVisible = (proxyModel_->rowCount(listView_->rootIndex()) > 0);
+ setVisible(shouldBeVisible);
+}
+
+
+void QtChatOverviewBundle::handleItemClicked(const QModelIndex& index) {
+ clicked(JID(Q2PSTRING(index.data(ChattablesModel::JIDRole).toString())));
+}
+
+} // namespace Swift
diff --git a/Swift/QtUI/QtChatOverviewBundle.h b/Swift/QtUI/QtChatOverviewBundle.h
new file mode 100644
index 0000000..95fd5d2
--- /dev/null
+++ b/Swift/QtUI/QtChatOverviewBundle.h
@@ -0,0 +1,61 @@
+/*
+ * Copyright (c) 2018 Isode Limited.
+ * All rights reserved.
+ * See the COPYING file for more information.
+ */
+
+#pragma once
+
+#include <set>
+
+#include <QSortFilterProxyModel>
+#include <QString>
+#include <QWidget>
+
+#include <Swiften/JID/JID.h>
+
+class QListView;
+
+namespace Swift {
+ class ChattablesModel;
+ class QtClickableLabel;
+ class QtExpandedListView;
+
+ class BundleFilter : public QSortFilterProxyModel {
+ Q_OBJECT
+ public:
+ enum class Filter {Unread, People, Rooms, Online};
+ BundleFilter(QObject* parent);
+ void addFilter(Filter);
+ bool hasFilter(Filter);
+ void removeFilter(Filter);
+ protected:
+ bool filterAcceptsRow(int sourceRow, const QModelIndex& sourceParent) const;
+ private:
+ std::set<Filter> filters_;
+ };
+
+ class QtChatOverviewBundle : public QWidget {
+ Q_OBJECT
+ public:
+ QtChatOverviewBundle(ChattablesModel*, QString name, bool hideWhenEmpty, QWidget* parent);
+ ~QtChatOverviewBundle() override;
+
+ signals:
+ void clicked(JID jid);
+
+ private slots:
+ void handleFilterClicked();
+ void handleItemClicked(const QModelIndex&);
+
+ private:
+ void updateVisibility();
+
+ private:
+ ChattablesModel* rootModel_;
+ QtExpandedListView* listView_;
+ BundleFilter* proxyModel_;
+ bool hideWhenEmpty_;
+ QtClickableLabel* filterLabel_ = nullptr;
+ };
+}
diff --git a/Swift/QtUI/QtChatOverviewDelegate.cpp b/Swift/QtUI/QtChatOverviewDelegate.cpp
new file mode 100644
index 0000000..00821fe
--- /dev/null
+++ b/Swift/QtUI/QtChatOverviewDelegate.cpp
@@ -0,0 +1,88 @@
+/*
+ * Copyright (c) 2018 Isode Limited.
+ * All rights reserved.
+ * See the COPYING file for more information.
+ */
+
+#include <Swift/QtUI/QtChatOverviewDelegate.h>
+
+#include <Swiften/Elements/StatusShow.h>
+
+#include <Swift/QtUI/ChattablesModel.h>
+#include <Swift/QtUI/Roster/DelegateCommons.h>
+
+namespace Swift {
+
+QtChatOverviewDelegate::QtChatOverviewDelegate(QObject* parent) : QItemDelegate(parent), nameFont(QApplication::font()) {
+
+}
+
+QtChatOverviewDelegate::~QtChatOverviewDelegate() {}
+
+QSize QtChatOverviewDelegate::sizeHint(const QStyleOptionViewItem& /*option*/, const QModelIndex& /*index*/) const {
+ int heightByAvatar = DelegateCommons::avatarSize + DelegateCommons::verticalMargin * 2;
+ QFontMetrics nameMetrics(nameFont);
+ int sizeByText = 2 * DelegateCommons::verticalMargin + nameMetrics.height();
+ return QSize(150, sizeByText > heightByAvatar ? sizeByText : heightByAvatar);
+}
+
+void QtChatOverviewDelegate::paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const {
+ painter->save();
+ QRect fullRegion(option.rect);
+ const int statusCircleRadius = 3;
+ const int horizontalMargin = 4;
+
+ QColor bgColor(38, 81, 112);
+ QPen fontPen("white"); // FIXME
+
+ if (option.state & QStyle::State_Selected) {
+ //FIXME
+ }
+ painter->fillRect(fullRegion, bgColor);
+ painter->setPen(fontPen);
+
+ QFontMetrics nameMetrics(nameFont);
+ painter->setFont(nameFont);
+ QRect nameRegion(fullRegion.adjusted((horizontalMargin + statusCircleRadius) * 2, DelegateCommons::verticalMargin, 0, 0));
+ DelegateCommons::drawElidedText(painter, nameRegion, index.data(Qt::DisplayRole).toString());
+
+ const auto green = QColor(124, 243, 145);
+ const auto yellow = QColor(243, 243, 0);
+ const auto red = QColor(255, 45, 71);
+ const auto grey = QColor(159,159,159);
+ auto circleColour = grey;
+ auto status = static_cast<StatusShow::Type>(index.data(ChattablesModel::StatusRole).toInt());
+ switch (status) {
+ case StatusShow::Online: circleColour = green; break;
+ case StatusShow::FFC: circleColour = green; break;
+ case StatusShow::Away: circleColour = yellow; break;
+ case StatusShow::XA: circleColour = yellow; break;
+ case StatusShow::DND: circleColour = red; break;
+ case StatusShow::None: circleColour = grey; break;
+ }
+
+ painter->setRenderHint(QPainter::Antialiasing, true);
+
+ int unreadCount = index.data(ChattablesModel::UnreadCountRole).toInt();
+ if (unreadCount > 0) {
+ int unreadCountSize = 16;
+ QRect unreadRect(fullRegion.right() - unreadCountSize - horizontalMargin, fullRegion.top() + (fullRegion.height() - unreadCountSize) / 2, unreadCountSize, unreadCountSize);
+ QPen pen(QColor("white"));
+ pen.setWidth(1);
+ painter->setRenderHint(QPainter::Antialiasing, true);
+ painter->setPen(pen);
+ painter->drawEllipse(unreadRect);
+ painter->setBackgroundMode(Qt::TransparentMode);
+ painter->setPen(QColor("white"));
+ DelegateCommons::drawElidedText(painter, unreadRect, QString("%1").arg(unreadCount), Qt::AlignCenter);
+ }
+
+ painter->setPen(circleColour);
+ painter->setBrush(circleColour);
+ painter->drawEllipse(fullRegion.topLeft() + QPointF(horizontalMargin + 4, fullRegion.height() / 2), statusCircleRadius, statusCircleRadius);
+
+
+ painter->restore();
+}
+
+} // namespace Swift
diff --git a/Swift/QtUI/QtChatOverviewDelegate.h b/Swift/QtUI/QtChatOverviewDelegate.h
new file mode 100644
index 0000000..b00337d
--- /dev/null
+++ b/Swift/QtUI/QtChatOverviewDelegate.h
@@ -0,0 +1,23 @@
+/*
+ * Copyright (c) 2018 Isode Limited.
+ * All rights reserved.
+ * See the COPYING file for more information.
+ */
+
+#pragma once
+
+#include <QItemDelegate>
+#include <QFont>
+
+namespace Swift {
+ class QtChatOverviewDelegate : public QItemDelegate {
+ Q_OBJECT
+ public:
+ QtChatOverviewDelegate(QObject* parent);
+ ~QtChatOverviewDelegate() override;
+ QSize sizeHint(const QStyleOptionViewItem& option, const QModelIndex& index) const override;
+ void paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const override;
+ private:
+ QFont nameFont;
+ };
+}
diff --git a/Swift/QtUI/QtChatTabs.cpp b/Swift/QtUI/QtChatTabs.cpp
index ad95a07..edd0b87 100644
--- a/Swift/QtUI/QtChatTabs.cpp
+++ b/Swift/QtUI/QtChatTabs.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -18,12 +18,13 @@
#include <QMenu>
#include <QTabBar>
#include <QTabWidget>
-#include <QtGlobal>
#include <QWindow>
+#include <QtGlobal>
#include <Swiften/Base/Log.h>
#include <Swift/Controllers/ChatMessageSummarizer.h>
+#include <Swift/Controllers/SettingConstants.h>
#include <Swift/QtUI/QtSwiftUtil.h>
#include <Swift/QtUI/QtTabWidget.h>
@@ -33,13 +34,13 @@
#include <Swift/QtUI/Trellis/QtGridSelectionDialog.h>
namespace Swift {
-QtChatTabs::QtChatTabs(bool singleWindow, SettingsProvider* settingsProvider, bool trellisMode) : QWidget(), singleWindow_(singleWindow), settingsProvider_(settingsProvider), trellisMode_(trellisMode), dynamicGrid_(nullptr), gridSelectionDialog_(nullptr) {
+QtChatTabs::QtChatTabs(SettingsProvider* settingsProvider, bool trellisMode) : QWidget(), settingsProvider_(settingsProvider), trellisMode_(trellisMode), dynamicGrid_(nullptr), gridSelectionDialog_(nullptr) {
#ifndef Q_OS_MAC
setWindowIcon(QIcon(":/logo-chat-16.png"));
#else
setAttribute(Qt::WA_ShowWithoutActivating);
#endif
- dynamicGrid_ = new QtDynamicGridLayout(this, trellisMode);
+ dynamicGrid_ = new QtDynamicGridLayout(settingsProvider->getSetting(SettingConstants::FUTURE), this, trellisMode);
connect(dynamicGrid_, SIGNAL(tabCloseRequested(int)), this, SLOT(handleTabCloseRequested(int)));
connect(dynamicGrid_, SIGNAL(onCurrentIndexChanged(int)), this, SLOT(handleCurrentTabIndexChanged(int)));
@@ -112,8 +113,6 @@ void QtChatTabs::setViewMenu(QMenu* viewMenu) {
if (trellisMode_) {
viewMenu->addSeparator();
QAction* action = new QAction(tr("Change &layout"), this);
- action->setShortcutContext(Qt::ApplicationShortcut);
- action->setShortcut(QKeySequence(tr("Ctrl+Alt+L")));
connect(action, SIGNAL(triggered()), this, SLOT(handleOpenLayoutChangeDialog()));
viewMenu->addAction(action);
@@ -201,13 +200,8 @@ void QtChatTabs::handleTabClosing() {
if (widget && ((index = dynamicGrid_->indexOf(widget)) >= 0)) {
dynamicGrid_->removeTab(index);
if (dynamicGrid_->count() == 0) {
- if (!singleWindow_) {
- hide();
- }
- else {
- setWindowTitle("");
- onTitleChanged("");
- }
+ setWindowTitle("");
+ onTitleChanged("");
}
else {
handleTabTitleUpdated(dynamicGrid_->currentWidget());
@@ -427,4 +421,8 @@ void QtChatTabs::checkForFirstShow() {
}
}
+QSize QtChatTabs::sizeHint() const {
+ return QSize(600, 600);
+}
+
}
diff --git a/Swift/QtUI/QtChatTabs.h b/Swift/QtUI/QtChatTabs.h
index 0c12d96..6a758ca 100644
--- a/Swift/QtUI/QtChatTabs.h
+++ b/Swift/QtUI/QtChatTabs.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -26,13 +26,14 @@ namespace Swift {
class QtChatTabs : public QWidget, public QtChatTabsBase {
Q_OBJECT
public:
- QtChatTabs(bool singleWindow, SettingsProvider* settingsProvider, bool trellisMode);
+ QtChatTabs(SettingsProvider* settingsProvider, bool trellisMode);
virtual ~QtChatTabs();
virtual void addTab(QtTabbable* tab);
void minimise();
QtTabbable* getCurrentTab();
void setViewMenu(QMenu* viewMenu);
+ QSize sizeHint() const;
signals:
void geometryChanged();
@@ -65,7 +66,6 @@ namespace Swift {
void checkForFirstShow();
private:
- bool singleWindow_;
SettingsProvider* settingsProvider_;
bool trellisMode_;
QtDynamicGridLayout* dynamicGrid_;
diff --git a/Swift/QtUI/QtChatTabsShortcutOnlySubstitute.cpp b/Swift/QtUI/QtChatTabsShortcutOnlySubstitute.cpp
deleted file mode 100644
index 40ab17f..0000000
--- a/Swift/QtUI/QtChatTabsShortcutOnlySubstitute.cpp
+++ /dev/null
@@ -1,108 +0,0 @@
-/*
- * Copyright (c) 2015-2016 Isode Limited.
- * All rights reserved.
- * See the COPYING file for more information.
- */
-
-#include <Swift/QtUI/QtChatTabsShortcutOnlySubstitute.h>
-
-#include <cassert>
-
-#include <QApplication>
-#include <QShortcut>
-
-#include <Swiften/Base/Log.h>
-
-#include <Swift/QtUI/QtTabbable.h>
-
-namespace Swift {
-
-QtChatTabsShortcutOnlySubstitute::QtChatTabsShortcutOnlySubstitute() : QWidget() {
-
-}
-
-QtChatTabsShortcutOnlySubstitute::~QtChatTabsShortcutOnlySubstitute() {
-
-}
-
-void QtChatTabsShortcutOnlySubstitute::addTab(QtTabbable* tab) {
- connect(tab, SIGNAL(requestNextTab()), this, SLOT(handleRequestedNextTab()), Qt::UniqueConnection);
- connect(tab, SIGNAL(requestActiveTab()), this, SLOT(handleRequestedActiveTab()), Qt::UniqueConnection);
- connect(tab, SIGNAL(requestPreviousTab()), this, SLOT(handleRequestedPreviousTab()), Qt::UniqueConnection);
-
- connect(new QShortcut(QKeySequence(tr("CTRL+W", "Close chat tab.")), tab), SIGNAL(activated()), this, SLOT(handleCloseTabShortcut()));
- connect(new QShortcut(QKeySequence(Qt::CTRL + Qt::Key_PageUp), tab), SIGNAL(activated()), tab, SIGNAL(requestPreviousTab()));
- connect(new QShortcut(QKeySequence(Qt::CTRL + Qt::Key_PageDown), tab), SIGNAL(activated()), tab, SIGNAL(requestNextTab()));
- connect(new QShortcut(QKeySequence(Qt::ALT + Qt::Key_A), tab), SIGNAL(activated()), tab, SIGNAL(requestActiveTab()));
-}
-
-void QtChatTabsShortcutOnlySubstitute::handleCloseTabShortcut() {
- QtTabbable* senderTab = dynamic_cast<QtTabbable*>(sender()->parent());
- SWIFT_LOG_ASSERT(senderTab, debug) << "No window to close." << std::endl;
- if (senderTab) {
- senderTab->close();
- }
-}
-
-void QtChatTabsShortcutOnlySubstitute::handleRequestedNextTab() {
- QtTabbable* senderTab = dynamic_cast<QtTabbable*>(sender());
-
- QList<QtTabbable*> tabs = tabbableWindows();
-
- int currentIndex = tabs.indexOf(senderTab);
- assert(currentIndex >= 0);
-
- QtTabbable* nextTab = tabs.at((currentIndex + 1) % tabs.size());
- nextTab->activateWindow();
-}
-
-void QtChatTabsShortcutOnlySubstitute::handleRequestedActiveTab() {
- QtTabbable* senderTab = dynamic_cast<QtTabbable*>(sender());
-
- QtTabbable::AlertType types[] = {QtTabbable::WaitingActivity, QtTabbable::ImpendingActivity};
-
- QList<QtTabbable*> tabs = tabbableWindows();
-
- for (auto& type : types) {
- int startIndex = tabs.indexOf(senderTab);
- int currentIndex = startIndex;
-
- do {
- currentIndex = (currentIndex + 1) % tabs.size();
- QtTabbable* currentTab = tabs.at(currentIndex);
- if (currentTab->getWidgetAlertState() == type) {
- currentTab->activateWindow();
- return;
- }
- } while (startIndex != currentIndex);
- }
-}
-
-void QtChatTabsShortcutOnlySubstitute::handleRequestedPreviousTab() {
- QtTabbable* senderTab = dynamic_cast<QtTabbable*>(sender());
-
- QList<QtTabbable*> tabs = tabbableWindows();
-
- int currentIndex = tabs.indexOf(senderTab);
- assert(currentIndex >= 0);
-
- QtTabbable* previousTab = tabs.at((currentIndex + tabs.size() - 1) % tabs.size());
- previousTab->activateWindow();
-}
-
-QList<QtTabbable*> QtChatTabsShortcutOnlySubstitute::tabbableWindows() const {
- QList<QWidget*> windows = qApp->topLevelWidgets();
-
- QList<QtTabbable*> tabbables;
- for (auto topLevelWidget : windows) {
- QtTabbable* tabbable = dynamic_cast<QtTabbable*>(topLevelWidget);
- if (tabbable) {
- tabbables << tabbable;
- }
- }
-
- return tabbables;
-}
-
-}
-
diff --git a/Swift/QtUI/QtChatTabsShortcutOnlySubstitute.h b/Swift/QtUI/QtChatTabsShortcutOnlySubstitute.h
deleted file mode 100644
index b330fe7..0000000
--- a/Swift/QtUI/QtChatTabsShortcutOnlySubstitute.h
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Copyright (c) 2015-2016 Isode Limited.
- * All rights reserved.
- * See the COPYING file for more information.
- */
-
-#pragma once
-
-#include <QList>
-#include <QWidget>
-
-#include <Swift/QtUI/QtChatTabsBase.h>
-
-class QShortcut;
-
-namespace Swift {
-
-class QtChatTabsShortcutOnlySubstitute : public QWidget, public QtChatTabsBase {
- Q_OBJECT
-
- public:
- QtChatTabsShortcutOnlySubstitute();
- virtual ~QtChatTabsShortcutOnlySubstitute();
-
- virtual void addTab(QtTabbable* tab);
-
- private slots:
- void handleCloseTabShortcut();
- void handleRequestedNextTab();
- void handleRequestedActiveTab();
- void handleRequestedPreviousTab();
-
- private:
- QList<QtTabbable*> tabbableWindows() const;
-
- private:
- QList<QShortcut*> shortcuts_;
-};
-
-}
diff --git a/Swift/QtUI/QtChatWindow.cpp b/Swift/QtUI/QtChatWindow.cpp
index e750caa..82c65ce 100644
--- a/Swift/QtUI/QtChatWindow.cpp
+++ b/Swift/QtUI/QtChatWindow.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010-2017 Isode Limited.
+ * Copyright (c) 2010-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -111,8 +111,11 @@ QtChatWindow::QtChatWindow(const QString& contact, QtChatTheme* theme, UIEventSt
messageLog_ = new QtPlainChatView(this, eventStream_);
}
else {
- messageLog_ = new QtWebKitChatView(this, eventStream_, theme, this); // I accept that passing the ChatWindow in so that the view can call the signals is somewhat inelegant, but it saves a lot of boilerplate. This patch is unpleasant enough already. So let's fix this soon (it at least needs fixing by the time history is sorted), but not now.
+ messageLog_ = new QtWebKitChatView(this, eventStream_, theme, this, settings); // I accept that passing the ChatWindow in so that the view can call the signals is somewhat inelegant, but it saves a lot of boilerplate. This patch is unpleasant enough already. So let's fix this soon (it at least needs fixing by the time history is sorted), but not now.
}
+ // When used with QSplitter and setChildrenCollapsible(false), the following prevents
+ // this widget to be hidden, i.e. resized to zero width.
+ messageLog_->setMinimumWidth(20);
logRosterSplitter_->addWidget(messageLog_);
treeWidget_ = new QtOccupantListWidget(eventStream_, settings_, QtTreeWidget::MessageDisplayJID, this);
@@ -152,11 +155,15 @@ QtChatWindow::QtChatWindow(const QString& contact, QtChatTheme* theme, UIEventSt
connect(input_, SIGNAL(lostFocus()), this, SLOT(handleTextInputLostFocus()));
connect(input_, SIGNAL(itemDropped(QDropEvent*)), this, SLOT(dropEvent(QDropEvent*)));
QPushButton* emojisButton_ = new QPushButton(this);
-
-#ifdef SWIFTEN_PLATFORM_MACOSX
emojisButton_->setText("\xF0\x9F\x98\x83");
-#else
- emojisButton_->setIcon(QIcon(":/emoticons/smile.png"));
+
+#if defined(SWIFTEN_PLATFORM_WINDOWS) || defined(SWIFTEN_PLATFORM_LINUX)
+ //Using a emoji glyph instead of an image makes the button sizes inequal in windows & linux,
+ //so we set fixed size for both buttons, the one that is hinted for actionButton_
+ emojisButton_->setMaximumWidth(actionButton_->sizeHint().width());
+ emojisButton_->setMaximumHeight(actionButton_->sizeHint().height());
+ actionButton_->setMaximumWidth(actionButton_->sizeHint().width());
+ actionButton_->setMaximumHeight(actionButton_->sizeHint().height());
#endif
connect(emojisButton_, SIGNAL(clicked()), this, SLOT(handleEmojisButtonClicked()));
@@ -353,6 +360,10 @@ QByteArray QtChatWindow::getSplitterState() {
void QtChatWindow::handleChangeSplitterState(QByteArray state) {
logRosterSplitter_->restoreState(state);
+#ifdef SWIFTEN_PLATFORM_MACOSX
+ logRosterSplitter_->setHandleWidth(0);
+#endif
+ logRosterSplitter_->setChildrenCollapsible(false);
}
void QtChatWindow::handleSplitterMoved(int, int) {
@@ -494,7 +505,7 @@ void QtChatWindow::showEvent(QShowEvent* event) {
QWidget::showEvent(event);
}
-void QtChatWindow::setUnreadMessageCount(int count) {
+void QtChatWindow::setUnreadMessageCount(size_t count) {
if (unreadCount_ != count) {
unreadCount_ = count;
updateTitleWithUnreadCount();
@@ -536,7 +547,7 @@ void QtChatWindow::flash() {
emit requestFlash();
}
-int QtChatWindow::getCount() {
+size_t QtChatWindow::getCount() {
return unreadCount_;
}
@@ -707,16 +718,26 @@ void QtChatWindow::handleEmojiClicked(QString emoji) {
if (isVisible()) {
input_->textCursor().insertText(emoji);
input_->setFocus();
- // The next line also deletes the emojisGrid_, as it was added to the
- // layout of the emojisMenu_.
- emojisMenu_.reset();
+ // We cannot delete the emojisGrid_
+ // Grid may not close yet and we should not try to destroy it.
+ emojisMenu_->setVisible(false);
}
}
void QtChatWindow::handleTextInputReceivedFocus() {
lastLineTracker_.setHasFocus(true);
input_->setFocus();
- onAllMessagesRead();
+ if (focusTimer_) {
+ focusTimer_->stop();
+ }
+ else {
+ focusTimer_ = std::make_unique<QTimer>(this);
+ focusTimer_->setSingleShot(true);
+ focusTimer_->setTimerType(Qt::CoarseTimer);
+ connect(focusTimer_.get(), &QTimer::timeout, this, &QtChatWindow::handleFocusTimerTick);
+ }
+ focusTimer_->setInterval(1000);
+ focusTimer_->start();
}
void QtChatWindow::handleTextInputLostFocus() {
@@ -730,6 +751,7 @@ void QtChatWindow::handleActionButtonClicked() {
QAction* affiliations = nullptr;
QAction* destroy = nullptr;
QAction* invite = nullptr;
+ QAction* leave = nullptr;
QAction* block = nullptr;
QAction* unblock = nullptr;
@@ -783,6 +805,10 @@ void QtChatWindow::handleActionButtonClicked() {
invite = contextMenu.addAction(tr("Invite person to this room…"));
invite->setEnabled(isOnline_);
break;
+ case ChatWindow::Leave:
+ leave = contextMenu.addAction(tr("Leave room"));
+ leave->setEnabled(isOnline_);
+ break;
}
}
}
@@ -834,6 +860,9 @@ void QtChatWindow::handleActionButtonClicked() {
else if (result == invite) {
onInviteToChat(std::vector<JID>());
}
+ else if (result == leave) {
+ close();
+ }
else if (result == block) {
onBlockUserRequest();
}
@@ -867,14 +896,16 @@ void QtChatWindow::setCanInitiateImpromptuChats(bool supportsImpromptu) {
}
void QtChatWindow::showBookmarkWindow(const MUCBookmark& bookmark) {
- if (roomBookmarkState_ == RoomNotBookmarked) {
- QtAddBookmarkWindow* window = new QtAddBookmarkWindow(eventStream_, bookmark);
+ if (roomBookmarkState_ != RoomNotBookmarked) {
+ QtEditBookmarkWindow* window = new QtEditBookmarkWindow(eventStream_, bookmark);
window->show();
}
+#ifndef NOT_YET
else {
- QtEditBookmarkWindow* window = new QtEditBookmarkWindow(eventStream_, bookmark);
+ QtAddBookmarkWindow* window = new QtAddBookmarkWindow(eventStream_, bookmark);
window->show();
}
+#endif // ! NOT_YET
}
std::string QtChatWindow::getID() const {
@@ -984,4 +1015,60 @@ void QtChatWindow::setBookmarkState(RoomBookmarkState bookmarkState) {
roomBookmarkState_ = bookmarkState;
}
+void QtChatWindow::setChatSecurityMarking(const std::string& markingValue, const std::string& markingForegroundColorValue, const std::string& markingBackgroundColorValue) {
+ auto layout = static_cast<QBoxLayout*>(this->layout());
+
+ if (securityMarkingLayout_) {
+ layout->removeItem(securityMarkingLayout_);
+ securityMarkingLayout_->removeWidget(securityMarkingDisplay_);
+ delete securityMarkingLayout_;
+ }
+ delete securityMarkingDisplay_;
+
+ securityMarkingLayout_ = new QHBoxLayout();
+ securityMarkingDisplay_ = new QLabel(P2QSTRING(markingValue));
+
+ securityMarkingLayout_->addWidget(securityMarkingDisplay_);
+ layout->insertLayout(1, securityMarkingLayout_);
+
+ auto palette = securityMarkingDisplay_->palette();
+ palette.setColor(securityMarkingDisplay_->foregroundRole(), P2QSTRING(markingForegroundColorValue));
+ palette.setColor(securityMarkingDisplay_->backgroundRole(), P2QSTRING(markingBackgroundColorValue));
+
+ securityMarkingDisplay_->setPalette(palette);
+ securityMarkingDisplay_->setContentsMargins(4,4,4,4);
+ securityMarkingDisplay_->setAutoFillBackground(true);
+ securityMarkingDisplay_->setAlignment(Qt::AlignCenter);
+}
+
+void QtChatWindow::removeChatSecurityMarking() {
+ if (!securityMarkingLayout_) {
+ return;
+ }
+
+ auto layout = static_cast<QBoxLayout*>(this->layout());
+
+ layout->removeItem(securityMarkingLayout_);
+ securityMarkingLayout_->removeWidget(securityMarkingDisplay_);
+
+ delete securityMarkingDisplay_;
+ delete securityMarkingLayout_;
+ securityMarkingDisplay_ = nullptr;
+ securityMarkingLayout_ = nullptr;
+}
+
+void QtChatWindow::handleFocusTimerTick() {
+ if (hasFocus()) {
+ onAllMessagesRead();
+ }
+ focusTimer_.reset();
+}
+
+void QtChatWindow::resendMessage(const std::string& id) {
+ if (!isOnline_ || (blockingState_ == IsBlocked)) {
+ return;
+ }
+ onResendMessageRequest(id);
+}
+
}
diff --git a/Swift/QtUI/QtChatWindow.h b/Swift/QtUI/QtChatWindow.h
index 361d7c6..b876d1e 100644
--- a/Swift/QtUI/QtChatWindow.h
+++ b/Swift/QtUI/QtChatWindow.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010-2017 Isode Limited.
+ * Copyright (c) 2010-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -34,6 +34,7 @@ class QComboBox;
class QLabel;
class QSplitter;
class QPushButton;
+class QTimer;
namespace Swift {
class QtChatView;
@@ -93,6 +94,7 @@ namespace Swift {
void replaceMessage(const ChatMessage& message, const std::string& id, const boost::posix_time::ptime& time);
void replaceWithAction(const ChatMessage& message, const std::string& id, const boost::posix_time::ptime& time);
+ void resendMessage(const std::string& id);
// File transfer related stuff
std::string addFileTransfer(const std::string& senderName, const std::string& avatarPath, bool senderIsSelf, const std::string& filename, const boost::uintmax_t sizeInBytes, const std::string& description);
void setFileTransferProgress(std::string id, const int percentageDone);
@@ -104,7 +106,7 @@ namespace Swift {
void show();
bool isVisible() const;
void activate();
- void setUnreadMessageCount(int count);
+ void setUnreadMessageCount(size_t count);
void convertToMUC(MUCType mucType);
// TreeWidget *getTreeWidget();
void setAvailableSecurityLabels(const std::vector<SecurityLabelsCatalog::Item>& labels);
@@ -117,7 +119,7 @@ namespace Swift {
void setContactChatState(ChatState::ChatStateType state);
void setRosterModel(Roster* roster);
void setTabComplete(TabComplete* completer);
- int getCount();
+ size_t getCount();
virtual void replaceSystemMessage(const ChatMessage& message, const std::string& id, const TimestampBehaviour timestampBehaviour);
void replaceLastMessage(const ChatMessage& message, const TimestampBehaviour timestampBehaviour);
void setAckState(const std::string& id, AckState state);
@@ -194,8 +196,12 @@ namespace Swift {
void resetDayChangeTimer();
+ void setChatSecurityMarking(const std::string& markingValue, const std::string& markingForegroundColorValue, const std::string& markingBackgroundColorValue);
+ void removeChatSecurityMarking();
+ void handleFocusTimerTick();
+
private:
- int unreadCount_;
+ size_t unreadCount_;
bool contactIsTyping_;
LastLineTracker lastLineTracker_;
std::string id_;
@@ -241,5 +247,8 @@ namespace Swift {
QPointer<QtEmojisSelector> emojisGrid_;
std::map<std::string, std::string> emoticonsMap_;
QTimer* dayChangeTimer = nullptr;
+ QHBoxLayout* securityMarkingLayout_ = nullptr;
+ QLabel* securityMarkingDisplay_ = nullptr;
+ std::unique_ptr<QTimer> focusTimer_;
};
}
diff --git a/Swift/QtUI/QtChatWindowFactory.cpp b/Swift/QtUI/QtChatWindowFactory.cpp
index 49cfe4d..33c8b94 100644
--- a/Swift/QtUI/QtChatWindowFactory.cpp
+++ b/Swift/QtUI/QtChatWindowFactory.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010-2017 Isode Limited.
+ * Copyright (c) 2010-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -11,7 +11,6 @@
#include <SwifTools/EmojiMapper.h>
#include <Swift/QtUI/QtChatTabs.h>
-#include <Swift/QtUI/QtChatTabsBase.h>
#include <Swift/QtUI/QtChatTheme.h>
#include <Swift/QtUI/QtChatWindow.h>
#include <Swift/QtUI/QtEmojisSelector.h>
@@ -23,22 +22,17 @@ namespace Swift {
static const QString SPLITTER_STATE = "mucSplitterState";
static const QString CHAT_TABS_GEOMETRY = "chatTabsGeometry";
-QtChatWindowFactory::QtChatWindowFactory(QtSingleWindow* splitter, SettingsProvider* settings, QtSettingsProvider* qtSettings, QtChatTabsBase* tabs, const QString& themePath, const std::map<std::string, std::string>& emoticonsMap) : themePath_(themePath), emoticonsMap_(emoticonsMap) {
+QtChatWindowFactory::QtChatWindowFactory(QtSingleWindow* splitter, SettingsProvider* settings, QtSettingsProvider* qtSettings, QtChatTabs* tabs, const QString& themePath, const std::map<std::string, std::string>& emoticonsMap) : themePath_(themePath), emoticonsMap_(emoticonsMap) {
qtOnlySettings_ = qtSettings;
settings_ = settings;
tabs_ = tabs;
theme_ = nullptr;
- QtChatTabs* fullTabs = dynamic_cast<QtChatTabs*>(tabs_);
- if (splitter) {
- assert(fullTabs && "Netbook mode and no-tabs interface is not supported!");
- splitter->addWidget(fullTabs);
- } else if (fullTabs) {
- QVariant chatTabsGeometryVariant = qtOnlySettings_->getQSettings()->value(CHAT_TABS_GEOMETRY);
- if (chatTabsGeometryVariant.isValid()) {
- fullTabs->restoreGeometry(chatTabsGeometryVariant.toByteArray());
- }
- connect(fullTabs, SIGNAL(geometryChanged()), this, SLOT(handleWindowGeometryChanged()));
+ splitter->addWidget(tabs_);
+ QVariant chatTabsGeometryVariant = qtOnlySettings_->getQSettings()->value(CHAT_TABS_GEOMETRY);
+ if (chatTabsGeometryVariant.isValid()) {
+ tabs_->restoreGeometry(chatTabsGeometryVariant.toByteArray());
}
+ connect(tabs_, SIGNAL(geometryChanged()), this, SLOT(handleWindowGeometryChanged()));
}
QtChatWindowFactory::~QtChatWindowFactory() {
@@ -60,7 +54,7 @@ ChatWindow* QtChatWindowFactory::createChatWindow(const JID &contact,UIEventStre
connect(this, SIGNAL(changeSplitterState(QByteArray)), chatWindow, SLOT(handleChangeSplitterState(QByteArray)));
QVariant splitterState = qtOnlySettings_->getQSettings()->value(SPLITTER_STATE);
- if(splitterState.isValid()) {
+ if (splitterState.isValid()) {
chatWindow->handleChangeSplitterState(splitterState.toByteArray());
}
diff --git a/Swift/QtUI/QtChatWindowFactory.h b/Swift/QtUI/QtChatWindowFactory.h
index 2bb6a90..3e4dca3 100644
--- a/Swift/QtUI/QtChatWindowFactory.h
+++ b/Swift/QtUI/QtChatWindowFactory.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010-2017 Isode Limited.
+ * Copyright (c) 2010-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -24,7 +24,7 @@
#include <Swift/QtUI/QtSettingsProvider.h>
namespace Swift {
- class QtChatTabsBase;
+ class QtChatTabs;
class QtChatTheme;
class UIEventStream;
class QtUIPreferences;
@@ -32,7 +32,7 @@ namespace Swift {
class QtChatWindowFactory : public QObject, public ChatWindowFactory {
Q_OBJECT
public:
- QtChatWindowFactory(QtSingleWindow* splitter, SettingsProvider* settings, QtSettingsProvider* qtSettings, QtChatTabsBase* tabs, const QString& themePath, const std::map<std::string, std::string>& emoticonsMap);
+ QtChatWindowFactory(QtSingleWindow* splitter, SettingsProvider* settings, QtSettingsProvider* qtSettings, QtChatTabs* tabs, const QString& themePath, const std::map<std::string, std::string>& emoticonsMap);
~QtChatWindowFactory();
ChatWindow* createChatWindow(const JID &contact, UIEventStream* eventStream);
signals:
@@ -44,7 +44,7 @@ namespace Swift {
QString themePath_;
SettingsProvider* settings_;
QtSettingsProvider* qtOnlySettings_;
- QtChatTabsBase* tabs_;
+ QtChatTabs* tabs_;
QtChatTheme* theme_;
std::map<std::string, std::string> emoticonsMap_;
};
diff --git a/Swift/QtUI/QtColorToolButton.cpp b/Swift/QtUI/QtColorToolButton.cpp
index b349a47..6452cf4 100644
--- a/Swift/QtUI/QtColorToolButton.cpp
+++ b/Swift/QtUI/QtColorToolButton.cpp
@@ -36,6 +36,7 @@ void QtColorToolButton::setColor(const QColor& color)
void QtColorToolButton::onClicked()
{
QColor c = QColorDialog::getColor(color_, this);
+ window()->raise();
if (c.isValid()) {
setColor(c);
}
diff --git a/Swift/QtUI/QtDBUSURIHandler.cpp b/Swift/QtUI/QtDBUSURIHandler.cpp
index 34659f4..a1446c3 100644
--- a/Swift/QtUI/QtDBUSURIHandler.cpp
+++ b/Swift/QtUI/QtDBUSURIHandler.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2011-2016 Isode Limited.
+ * Copyright (c) 2011-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -19,7 +19,7 @@ using namespace Swift;
namespace {
class DBUSAdaptor: public QDBusAbstractAdaptor {
Q_OBJECT
- Q_CLASSINFO("D-Bus Interface", "im.swift.Swift.URIHandler");
+ Q_CLASSINFO("D-Bus Interface", "im.swift.Swift.URIHandler")
public:
DBUSAdaptor(QtDBUSURIHandler* uriHandler) : QDBusAbstractAdaptor(uriHandler), uriHandler(uriHandler) {
}
diff --git a/Swift/QtUI/QtEditBookmarkWindow.cpp b/Swift/QtUI/QtEditBookmarkWindow.cpp
index 1d6b467..c724c97 100644
--- a/Swift/QtUI/QtEditBookmarkWindow.cpp
+++ b/Swift/QtUI/QtEditBookmarkWindow.cpp
@@ -12,7 +12,6 @@ namespace Swift {
QtEditBookmarkWindow::QtEditBookmarkWindow(UIEventStream* eventStream, const MUCBookmark& bookmark) : eventStream_(eventStream), bookmark_(bookmark) {
name_->setText(P2QSTRING(bookmark.getName()));
room_->setText(P2QSTRING(bookmark.getRoom().toString()));
- autojoin_->setChecked(bookmark.getAutojoin());
nick_->setText(bookmark.getNick() ? P2QSTRING(bookmark.getNick().get()) : "");
password_->setText(bookmark.getPassword() ? P2QSTRING(bookmark.getPassword().get()) : "");
}
diff --git a/Swift/QtUI/QtEmojiCell.cpp b/Swift/QtUI/QtEmojiCell.cpp
index 865f1f6..106e968 100644
--- a/Swift/QtUI/QtEmojiCell.cpp
+++ b/Swift/QtUI/QtEmojiCell.cpp
@@ -1,11 +1,13 @@
/*
- * Copyright (c) 2016-2017 Isode Limited.
+ * Copyright (c) 2016-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
#include <Swift/QtUI/QtEmojiCell.h>
+#include <Swiften/Base/Platform.h>
+
#include <QFont>
#include <QFontMetrics>
#include <QPushButton>
@@ -17,13 +19,20 @@ namespace Swift {
QtEmojiCell::QtEmojiCell(QString shortname, QString text, QWidget* parent) : QPushButton(parent) {
setText(text);
QFont font = this->font();
+#ifdef SWIFTEN_PLATFORM_WINDOWS
+ //Windows emoji font miscalculates the bounding rectangular that surrounds the emoji. We set a multiplier value to make it look consistent with linux & Mac
+ const float sizeMultiplier = 1.3;
+ font.setPointSize(18);
+#else
font.setPointSize(22);
+ const float sizeMultiplier = 1;
+#endif
font.setBold(true);
setFont(font);
const auto boundingRect = fontMetrics().boundingRect("\xF0\x9F\x98\x83");
- setFixedWidth(qMax(boundingRect.width(), boundingRect.height()));
- setFixedHeight(qMax(boundingRect.width(), boundingRect.height()));
+ setFixedWidth(qMax(sizeMultiplier*boundingRect.width(), sizeMultiplier*boundingRect.height()));
+ setFixedHeight(qMax(sizeMultiplier*boundingRect.width(), sizeMultiplier*boundingRect.height()));
setFlat(true);
setToolTip(shortname);
diff --git a/Swift/QtUI/QtEmojisScroll.h b/Swift/QtUI/QtEmojisScroll.h
index 959ab5f..f954c2d 100644
--- a/Swift/QtUI/QtEmojisScroll.h
+++ b/Swift/QtUI/QtEmojisScroll.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2016-2017 Isode Limited.
+ * Copyright (c) 2016-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -13,6 +13,6 @@ namespace Swift {
class QtEmojisScroll : public QWidget {
Q_OBJECT
public:
- QtEmojisScroll(QLayout* emojiLayout, QWidget *parent = 0);
+ QtEmojisScroll(QLayout* emojiLayout, QWidget* parent = nullptr);
};
}
diff --git a/Swift/QtUI/QtEmojisSelector.cpp b/Swift/QtUI/QtEmojisSelector.cpp
index 62ed862..fe2f235 100644
--- a/Swift/QtUI/QtEmojisSelector.cpp
+++ b/Swift/QtUI/QtEmojisSelector.cpp
@@ -24,7 +24,6 @@
namespace Swift {
QtEmojisSelector::QtEmojisSelector(QSettings* settings, const std::map<std::string, std::string>& emoticonsMap, QWidget* parent) : QTabWidget(parent), settings_(settings), emoticonsMap_(emoticonsMap) {
-#ifdef SWIFTEN_PLATFORM_MACOSX
recentEmojisGrid_ = addRecentTab();
connect(recentEmojisGrid_, SIGNAL(onEmojiSelected(QString)), this, SLOT(emojiClickedSlot(QString)));
@@ -34,17 +33,13 @@ namespace Swift {
connect(grid, SIGNAL(onEmojiSelected(QString)), this, SLOT(emojiClickedSlot(QString)));
}
}
-
loadSettings();
-#else
- setupEmoticonsTab();
-#endif
+ //The size of an emoji cell varies depending the OS, 42 is the ceil value.
+ setFixedSize(QSize(EmojiMapper::emojisInCategory.size() * 42, 300));
}
QtEmojisSelector::~QtEmojisSelector() {
-#ifdef SWIFTEN_PLATFORM_MACOSX
writeSettings();
-#endif
}
QtRecentEmojisGrid* QtEmojisSelector::addRecentTab() {
diff --git a/Swift/QtUI/QtEmojisSelector.h b/Swift/QtUI/QtEmojisSelector.h
index 7ac11d0..1a64cf4 100644
--- a/Swift/QtUI/QtEmojisSelector.h
+++ b/Swift/QtUI/QtEmojisSelector.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2016-2017 Isode Limited.
+ * Copyright (c) 2016-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -20,7 +20,7 @@ namespace Swift {
class QtEmojisSelector : public QTabWidget {
Q_OBJECT
public:
- QtEmojisSelector(QSettings* settings, const std::map<std::string, std::string>& emoticonsMap, QWidget * parent = 0);
+ QtEmojisSelector(QSettings* settings, const std::map<std::string, std::string>& emoticonsMap, QWidget* parent = nullptr);
~QtEmojisSelector();
public slots:
diff --git a/Swift/QtUI/QtExpandedListView.cpp b/Swift/QtUI/QtExpandedListView.cpp
new file mode 100644
index 0000000..84769c5
--- /dev/null
+++ b/Swift/QtUI/QtExpandedListView.cpp
@@ -0,0 +1,111 @@
+/*
+ * Copyright (c) 2018 Isode Limited.
+ * All rights reserved.
+ * See the COPYING file for more information.
+ */
+
+#include <Swift/QtUI/QtExpandedListView.h>
+
+#include <QWheelEvent>
+#include <QScrollArea>
+#include <QDebug>
+
+namespace Swift {
+
+QtExpandedListView::QtExpandedListView(QWidget* parent) : QListView(parent) {
+ // Disable macOS focus rectangle due to bad performance.
+ setAttribute(Qt::WA_MacShowFocusRect, 0);
+ setSizePolicy(sizePolicy().horizontalPolicy(), QSizePolicy::Fixed);
+}
+
+void QtExpandedListView::setModel(QAbstractItemModel* newModel) {
+ if (model()) {
+ disconnectFromModel(model());
+ }
+ if (newModel) {
+ connectToModel(newModel);
+ }
+ QListView::setModel(newModel);
+ adjustHeightToModelChange();
+}
+
+QtExpandedListView::~QtExpandedListView() {
+ if (model()) {
+ disconnectFromModel(model());
+ }
+}
+
+bool QtExpandedListView::viewportEvent(QEvent* event) {
+ // Ignore wheel events for faster mouse scrolling.
+ if (event && event->type() == QEvent::Wheel) {
+ return false;
+ }
+
+ return QListView::viewportEvent(event);
+}
+
+template <typename T>
+T getParentOfType(QWidget* start) {
+ auto parentW = start->parentWidget();
+ if (parentW == nullptr) {
+ return nullptr;
+ }
+ T result = dynamic_cast<T>(parentW);
+ if (result) {
+ return result;
+ }
+ return getParentOfType<T>(parentW);
+}
+
+void QtExpandedListView::currentChanged(const QModelIndex &current, const QModelIndex &) {
+ // Make sure that the current selected index is visible in the parent QScrollArea.
+ auto scrollArea = getParentOfType<QScrollArea*>(parentWidget());
+ if (scrollArea) {
+ auto scrollWidget = scrollArea->widget();
+ QList<QPoint> points;
+ auto visRect = visualRect(current);
+ points << mapTo(scrollWidget, visRect.topLeft());
+ points << mapTo(scrollWidget, visRect.topRight());
+ points << mapTo(scrollWidget, visRect.bottomLeft());
+ points << mapTo(scrollWidget, visRect.bottomRight());
+
+ for (auto&& point : points) {
+ scrollArea->ensureVisible(point.x(), point.y(), 0, 0);
+ }
+ }
+}
+
+void QtExpandedListView::adjustHeightToModelChange() {
+ updateGeometry();
+}
+
+QSize QtExpandedListView::minimumSizeHint() const {
+ auto sh = sizeHint();
+ return QSize(0, sh.height());
+}
+
+QSize QtExpandedListView::sizeHint() const {
+ auto listViewSH = QListView::sizeHint();
+ if (model()) {
+ auto lastRect = rectForIndex(model()->index(model()->rowCount()-1, 0, rootIndex()));
+ auto idealHeight = lastRect.y() + lastRect.height() + frameWidth() * 2;
+ listViewSH.setHeight(idealHeight);
+ }
+ return listViewSH;
+}
+
+void QtExpandedListView::connectToModel(QAbstractItemModel* model) {
+ connect(model, &QAbstractItemModel::dataChanged, this, &QtExpandedListView::adjustHeightToModelChange);
+ connect(model, &QAbstractItemModel::modelReset, this, &QtExpandedListView::adjustHeightToModelChange);
+ connect(model, &QAbstractItemModel::rowsInserted, this, &QtExpandedListView::adjustHeightToModelChange);
+ connect(model, &QAbstractItemModel::rowsRemoved, this, &QtExpandedListView::adjustHeightToModelChange);
+}
+
+void QtExpandedListView::disconnectFromModel(QAbstractItemModel* model) {
+ disconnect(model, &QAbstractItemModel::dataChanged, this, &QtExpandedListView::adjustHeightToModelChange);
+ disconnect(model, &QAbstractItemModel::modelReset, this, &QtExpandedListView::adjustHeightToModelChange);
+ disconnect(model, &QAbstractItemModel::rowsInserted, this, &QtExpandedListView::adjustHeightToModelChange);
+ disconnect(model, &QAbstractItemModel::rowsRemoved, this, &QtExpandedListView::adjustHeightToModelChange);
+}
+
+}
diff --git a/Swift/QtUI/QtExpandedListView.h b/Swift/QtUI/QtExpandedListView.h
new file mode 100644
index 0000000..df78376
--- /dev/null
+++ b/Swift/QtUI/QtExpandedListView.h
@@ -0,0 +1,34 @@
+/*
+ * Copyright (c) 2018 Isode Limited.
+ * All rights reserved.
+ * See the COPYING file for more information.
+ */
+
+#pragma once
+
+#include <QListView>
+
+namespace Swift {
+
+class QtExpandedListView : public QListView {
+public:
+ QtExpandedListView(QWidget* parent);
+ ~QtExpandedListView() override;
+
+ void setModel(QAbstractItemModel* model) override;
+ bool viewportEvent(QEvent* event) override;
+ QSize minimumSizeHint() const override;
+ QSize sizeHint() const override;
+
+protected slots:
+ void currentChanged(const QModelIndex &current, const QModelIndex &previous) override;
+
+private slots:
+ void adjustHeightToModelChange();
+
+private:
+ void connectToModel(QAbstractItemModel* model);
+ void disconnectFromModel(QAbstractItemModel* model);
+};
+
+}
diff --git a/Swift/QtUI/QtFdpFormSubmitWindow.cpp b/Swift/QtUI/QtFdpFormSubmitWindow.cpp
new file mode 100644
index 0000000..5719f87
--- /dev/null
+++ b/Swift/QtUI/QtFdpFormSubmitWindow.cpp
@@ -0,0 +1,215 @@
+/*
+ * Copyright (c) 2018 Isode Limited.
+ * All rights reserved.
+ * See the COPYING file for more information.
+ */
+
+#include <Swift/QtUI/QtFdpFormSubmitWindow.h>
+
+#include <QCloseEvent>
+#include <QHBoxLayout>
+#include <QLabel>
+#include <QLineEdit>
+#include <QPushButton>
+#include <QSpacerItem>
+#include <QVBoxLayout>
+
+#include <Swift/QtUI/QtFormWidget.h>
+#include <Swift/QtUI/QtListWidget.h>
+#include <Swift/QtUI/QtSwiftUtil.h>
+
+namespace Swift {
+QtFdpFormSubmitWindow::QtFdpFormSubmitWindow(QWidget* parent) : QDialog(parent), FdpFormSubmitWindow() {
+ layout_ = new QVBoxLayout(this);
+ subLayout_ = new QHBoxLayout(this);
+
+ initNodeViewLayout();
+ initFormLayout();
+ subLayout_->addLayout(nodeViewLayout_);
+ subLayout_->addLayout(formLayout_);
+ subLayout_->setStretchFactor(nodeViewLayout_, 2);
+ subLayout_->setStretchFactor(formLayout_, 3);
+ layout_->addLayout(subLayout_);
+
+ submitButton_ = new QPushButton(tr("Submit Form"), this);
+ submitButton_->setEnabled(false);
+ okButton_ = new QPushButton(tr("Ok"), this);
+ okButton_->hide();
+ cancelButton_ = new QPushButton(tr("Cancel"), this);
+ connect(submitButton_, &QPushButton::clicked, this, &QtFdpFormSubmitWindow::handleSubmitClicked);
+ connect(okButton_, &QPushButton::clicked, this, &QWidget::close);
+ connect(cancelButton_, &QPushButton::clicked, this, &QWidget::close);
+ auto buttonSpacer = new QSpacerItem(0, 0, QSizePolicy::Expanding, QSizePolicy::Minimum);
+ buttonLayout_ = new QHBoxLayout(this);
+ buttonLayout_->addItem(buttonSpacer);
+ buttonLayout_->addWidget(submitButton_);
+ buttonLayout_->addWidget(cancelButton_);
+ layout_->addLayout(buttonLayout_);
+
+ setMinimumWidth(800);
+ setMinimumHeight(600);
+
+ this->setWindowTitle(tr("FDP Form Submission"));
+}
+
+QtFdpFormSubmitWindow::~QtFdpFormSubmitWindow() {
+}
+
+void QtFdpFormSubmitWindow::closeEvent(QCloseEvent* event) {
+ event->ignore();
+ onCloseEvent();
+}
+
+void QtFdpFormSubmitWindow::initNodeViewLayout() {
+ nodeViewLayout_ = new QVBoxLayout(this);
+ auto domainSearchLayout = new QHBoxLayout(this);
+ pubSubDomainEdit_ = new QLineEdit(this);
+ loadDomainButton_ = new QPushButton(tr("Load"), this);
+ pubSubNodeView_ = new QtListWidget(this);
+ pubSubDomainEdit_->setPlaceholderText(tr("Enter pubsub domain here"));
+ pubSubNodeView_->setMinimumWidth(300);
+ connect(loadDomainButton_, &QPushButton::clicked, this, &QtFdpFormSubmitWindow::handleLoadDomainButtonClicked);
+ connect(pubSubNodeView_, &QListWidget::itemDoubleClicked, this, &QtFdpFormSubmitWindow::handlePubSubNodeViewItemDoubleClicked);
+ domainSearchLayout->addWidget(pubSubDomainEdit_);
+ domainSearchLayout->addWidget(loadDomainButton_);
+ nodeViewLayout_->addLayout(domainSearchLayout);
+ nodeViewLayout_->addWidget(pubSubNodeView_);
+}
+
+void QtFdpFormSubmitWindow::initFormLayout() {
+ formPlaceholder_ = new QLabel(tr("No form loaded"));
+ formPlaceholder_->setAlignment(Qt::AlignCenter);
+ formPlaceholder_->setMinimumWidth(200);
+ formPlaceholder_->setStyleSheet("QLabel { color : #AAAAAA; }");
+ formLayout_ = new QVBoxLayout(this);
+ formLayout_->addWidget(formPlaceholder_, Qt::AlignCenter);
+}
+
+void QtFdpFormSubmitWindow::show() {
+ QDialog::show();
+}
+
+void QtFdpFormSubmitWindow::raise() {
+ QDialog::raise();
+}
+
+void QtFdpFormSubmitWindow::addNode(const std::string& node, const std::string& nodeName) {
+ auto listItem = new QListWidgetItem(P2QSTRING(nodeName));
+ listItem->setData(Qt::UserRole, P2QSTRING(node));
+ pubSubNodeView_->addItem(listItem);
+}
+
+void QtFdpFormSubmitWindow::clearNodeData() {
+ pubSubNodeView_->clear();
+ pubSubNodeView_->setWordWrap(false);
+ disconnect(pubSubNodeView_, &QtListWidget::onResize, this, &QtFdpFormSubmitWindow::handleNodeListResize);
+}
+
+void QtFdpFormSubmitWindow::setFormData(const std::shared_ptr<Form>& form) {
+ if (formWidget_) {
+ formLayout_->removeWidget(formWidget_);
+ formWidget_->deleteLater();
+ formWidget_ = nullptr;
+ }
+ else if (!formPlaceholder_->isHidden()) {
+ formLayout_->removeWidget(formPlaceholder_);
+ formPlaceholder_->hide();
+ }
+ formWidget_ = new QtFormWidget(form);
+ formWidget_->setEditable(true);
+ formLayout_->addWidget(formWidget_);
+
+ if (!okButton_->isHidden()) {
+ buttonLayout_->removeWidget(okButton_);
+ okButton_->hide();
+ }
+ if (submitButton_->isHidden()) {
+ buttonLayout_->insertWidget(1, submitButton_);
+ submitButton_->show();
+ }
+ submitButton_->setEnabled(true);
+ cancelButton_->setEnabled(true);
+}
+
+void QtFdpFormSubmitWindow::showNodePlaceholder(NodeError nodeError) {
+ pubSubNodeView_->clear();
+ pubSubNodeView_->setWordWrap(true);
+ auto listItem = new QListWidgetItem;
+ auto placeholderText = P2QSTRING(getNodeErrorText(nodeError));
+ listItem->setText(placeholderText);
+ listItem->setTextAlignment(Qt::AlignCenter);
+ listItem->setFlags(Qt::NoItemFlags);
+ listItem->setSizeHint(QSize(listItem->sizeHint().width(), pubSubNodeView_->height()));
+ connect(pubSubNodeView_, &QtListWidget::onResize, this, &QtFdpFormSubmitWindow::handleNodeListResize);
+ pubSubNodeView_->addItem(listItem);
+}
+
+void QtFdpFormSubmitWindow::showFormPlaceholder(TemplateError templateError) {
+ if (formWidget_) {
+ formLayout_->removeWidget(formWidget_);
+ formWidget_->deleteLater();
+ formWidget_ = nullptr;
+ }
+ auto placeholderText = P2QSTRING(getTemplateErrorText(templateError));
+ formPlaceholder_->setText(placeholderText);
+ if (formPlaceholder_->isHidden()) {
+ formLayout_->addWidget(formPlaceholder_, Qt::AlignCenter);
+ formPlaceholder_->show();
+ }
+
+ if (!okButton_->isHidden()) {
+ buttonLayout_->removeWidget(okButton_);
+ okButton_->hide();
+ }
+ if (submitButton_->isHidden()) {
+ buttonLayout_->insertWidget(1, submitButton_);
+ submitButton_->show();
+ }
+ submitButton_->setEnabled(false);
+ cancelButton_->setEnabled(true);
+}
+
+void QtFdpFormSubmitWindow::handleLoadDomainButtonClicked() {
+ std::string domainUri = Q2PSTRING(pubSubDomainEdit_->text());
+ onRequestPubSubNodeData(domainUri);
+}
+
+void QtFdpFormSubmitWindow::handlePubSubListViewTemplateSelected(const std::string& nodeName) {
+ onRequestTemplateForm(nodeName);
+}
+
+void QtFdpFormSubmitWindow::handlePubSubNodeViewItemDoubleClicked(QListWidgetItem* item) {
+ handlePubSubListViewTemplateSelected(Q2PSTRING(item->data(Qt::UserRole).toString()));
+}
+
+void QtFdpFormSubmitWindow::handleSubmitClicked() {
+ auto form = formWidget_->getCompletedForm();
+ formWidget_->setDisabled(true);
+ submitButton_->setEnabled(false);
+ onSubmitForm(form);
+}
+
+void QtFdpFormSubmitWindow::handleSubmitServerResponse(bool submissionSuccess) {
+ if (submissionSuccess) {
+ if (!submitButton_->isHidden()) {
+ buttonLayout_->removeWidget(submitButton_);
+ submitButton_->hide();
+ }
+ if (okButton_->isHidden()) {
+ buttonLayout_->insertWidget(1, okButton_);
+ okButton_->show();
+ }
+ cancelButton_->setEnabled(false);
+ }
+ else {
+ formWidget_->setDisabled(false);
+ submitButton_->setEnabled(true);
+ }
+}
+
+void QtFdpFormSubmitWindow::handleNodeListResize() {
+ auto placeholderItem = pubSubNodeView_->item(0);
+ placeholderItem->setSizeHint(QSize(placeholderItem->sizeHint().width(), pubSubNodeView_->height()));
+}
+
+}
diff --git a/Swift/QtUI/QtFdpFormSubmitWindow.h b/Swift/QtUI/QtFdpFormSubmitWindow.h
new file mode 100644
index 0000000..b429927
--- /dev/null
+++ b/Swift/QtUI/QtFdpFormSubmitWindow.h
@@ -0,0 +1,75 @@
+/*
+ * Copyright (c) 2018 Isode Limited.
+ * All rights reserved.
+ * See the COPYING file for more information.
+ */
+
+#pragma once
+
+#include <memory>
+
+#include <QDialog>
+
+#include <Swift/Controllers/UIInterfaces/FdpFormSubmitWindow.h>
+
+class QHBoxLayout;
+class QLabel;
+class QLineEdit;
+class QListWidgetItem;
+class QPushButton;
+class QTextEdit;
+class QVBoxLayout;
+
+namespace Swift {
+
+ class Form;
+ class QtFormWidget;
+ class QtListWidget;
+ class QtPubSubNodeController;
+
+ class QtFdpFormSubmitWindow : public QDialog, public FdpFormSubmitWindow {
+ Q_OBJECT
+
+ public:
+ QtFdpFormSubmitWindow(QWidget* parent = nullptr);
+ virtual ~QtFdpFormSubmitWindow() override;
+
+ protected:
+ virtual void closeEvent(QCloseEvent* event) override;
+
+ private:
+ void initNodeViewLayout();
+ void initFormLayout();
+ virtual void show() override;
+ virtual void raise() override;
+ virtual void addNode(const std::string& node, const std::string& nodeName) override;
+ virtual void clearNodeData() override;
+ virtual void setFormData(const std::shared_ptr<Form>& form) override;
+ virtual void showNodePlaceholder(NodeError nodeError) override;
+ virtual void showFormPlaceholder(TemplateError templateError) override;
+ virtual void handleSubmitServerResponse(bool submissionSuccess) override;
+
+ private slots:
+ void handleLoadDomainButtonClicked();
+ void handlePubSubListViewTemplateSelected(const std::string& nodeName);
+ void handlePubSubNodeViewItemDoubleClicked(QListWidgetItem* item);
+ void handleSubmitClicked();
+ void handleNodeListResize();
+
+ private:
+ QVBoxLayout* layout_;
+ QHBoxLayout* subLayout_;
+ QHBoxLayout* buttonLayout_;
+ QVBoxLayout* nodeViewLayout_;
+ QVBoxLayout* formLayout_;
+ QLineEdit* pubSubDomainEdit_;
+ QPushButton* loadDomainButton_;
+ QtListWidget* pubSubNodeView_;
+ QLabel* formPlaceholder_;
+ QTextEdit* nodePlaceholderTextEdit_ = nullptr;
+ QtFormWidget* formWidget_ = nullptr;
+ QPushButton* cancelButton_;
+ QPushButton* submitButton_ = nullptr;
+ QPushButton* okButton_ = nullptr;
+ };
+}
diff --git a/Swift/QtUI/QtFormWidget.cpp b/Swift/QtUI/QtFormWidget.cpp
index 96c2da0..860ddfa 100644
--- a/Swift/QtUI/QtFormWidget.cpp
+++ b/Swift/QtUI/QtFormWidget.cpp
@@ -147,7 +147,7 @@ QWidget* QtFormWidget::createWidget(FormField::ref field, const FormField::Type
std::string indexString;
if (index) {
/* for multi-item forms we need to distinguish between the different rows */
- indexString = boost::lexical_cast<std::string>(index);
+ indexString = std::to_string(index);
}
fields_[field->getName() + indexString] = widget;
return widget;
diff --git a/Swift/QtUI/QtHighlightNotificationConfigDialog.cpp b/Swift/QtUI/QtHighlightNotificationConfigDialog.cpp
index 19274a2..0521a2d 100644
--- a/Swift/QtUI/QtHighlightNotificationConfigDialog.cpp
+++ b/Swift/QtUI/QtHighlightNotificationConfigDialog.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2016-2017 Isode Limited.
+ * Copyright (c) 2016-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -50,7 +50,7 @@ QtHighlightNotificationConfigDialog::QtHighlightNotificationConfigDialog(QtSetti
}
});
connect(ui_.userHighlightTreeWidget, &QTreeWidget::currentItemChanged, [&](QTreeWidgetItem* current, QTreeWidgetItem* ) {
- ui_.removeUserHighlightPushButton->setEnabled(current != 0);
+ ui_.removeUserHighlightPushButton->setEnabled(current != nullptr);
});
// keyword highlight edit slots
@@ -72,7 +72,7 @@ QtHighlightNotificationConfigDialog::QtHighlightNotificationConfigDialog(QtSetti
}
});
connect(ui_.keywordHighlightTreeWidget, &QTreeWidget::currentItemChanged, [&](QTreeWidgetItem* current, QTreeWidgetItem* ) {
- ui_.removeKeywordHighlightPushButton->setEnabled(current != 0);
+ ui_.removeKeywordHighlightPushButton->setEnabled(current != nullptr);
});
// setup slots for main dialog buttons
diff --git a/Swift/QtUI/QtHistoryWindow.cpp b/Swift/QtUI/QtHistoryWindow.cpp
index 77a7f12..0e7e89d 100644
--- a/Swift/QtUI/QtHistoryWindow.cpp
+++ b/Swift/QtUI/QtHistoryWindow.cpp
@@ -49,7 +49,7 @@ QtHistoryWindow::QtHistoryWindow(SettingsProvider* settings, UIEventStream* even
idCounter_ = 0;
delete ui_.conversation_;
- conversation_ = new QtWebKitChatView(nullptr, nullptr, theme_, this, true); // Horrible unsafe. Do not do this. FIXME
+ conversation_ = new QtWebKitChatView(nullptr, nullptr, theme_, this, settings, true); // Horrible unsafe. Do not do this. FIXME
QSizePolicy sizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred);
sizePolicy.setHorizontalStretch(80);
sizePolicy.setVerticalStretch(0);
@@ -131,7 +131,7 @@ void QtHistoryWindow::addMessage(const std::string &message, const std::string &
QTime dayTime = QTime(time.time_of_day().hours(), time.time_of_day().minutes(), time.time_of_day().seconds());
QDateTime qTime = QDateTime(date, dayTime);
- std::string id = "id" + boost::lexical_cast<std::string>(idCounter_++);
+ std::string id = "id" + std::to_string(idCounter_++);
QString qAvatarPath = scaledAvatarPath.isEmpty() ? "qrc:/icons/avatar.png" : QUrl::fromLocalFile(scaledAvatarPath).toEncoded();
diff --git a/Swift/QtUI/QtJoinMUCWindow.cpp b/Swift/QtUI/QtJoinMUCWindow.cpp
index 13de1c9..550ae4a 100644
--- a/Swift/QtUI/QtJoinMUCWindow.cpp
+++ b/Swift/QtUI/QtJoinMUCWindow.cpp
@@ -49,7 +49,7 @@ void QtJoinMUCWindow::handleJoin() {
lastSetNick = Q2PSTRING(ui.nickName->text());
std::string password = Q2PSTRING(ui.password->text());
JID room(Q2PSTRING(ui.room->text()));
- uiEventStream->send(std::make_shared<JoinMUCUIEvent>(room, password, lastSetNick, ui.joinAutomatically->isChecked(), !ui.instantRoom->isChecked()));
+ uiEventStream->send(std::make_shared<JoinMUCUIEvent>(room, password, lastSetNick, !ui.instantRoom->isChecked()));
hide();
}
diff --git a/Swift/QtUI/QtJoinMUCWindow.ui b/Swift/QtUI/QtJoinMUCWindow.ui
index 24d6ab8..96f1d17 100644
--- a/Swift/QtUI/QtJoinMUCWindow.ui
+++ b/Swift/QtUI/QtJoinMUCWindow.ui
@@ -101,13 +101,6 @@
</spacer>
</item>
<item>
- <widget class="QCheckBox" name="joinAutomatically">
- <property name="text">
- <string>Enter automatically in future</string>
- </property>
- </widget>
- </item>
- <item>
<widget class="QPushButton" name="joinButton">
<property name="text">
<string>Enter Room</string>
@@ -124,7 +117,6 @@
<tabstop>nickName</tabstop>
<tabstop>password</tabstop>
<tabstop>instantRoom</tabstop>
- <tabstop>joinAutomatically</tabstop>
<tabstop>joinButton</tabstop>
</tabstops>
<resources/>
diff --git a/Swift/QtUI/QtListWidget.cpp b/Swift/QtUI/QtListWidget.cpp
new file mode 100644
index 0000000..e35bbbb
--- /dev/null
+++ b/Swift/QtUI/QtListWidget.cpp
@@ -0,0 +1,20 @@
+/*
+ * Copyright (c) 2018 Isode Limited.
+ * All rights reserved.
+ * See the COPYING file for more information.
+ */
+
+#include <Swift/QtUI/QtListWidget.h>
+
+#include <QListWidget>
+
+namespace Swift {
+
+QtListWidget::QtListWidget(QWidget* parent) : QListWidget(parent) {
+}
+
+void QtListWidget::resizeEvent(QResizeEvent*) {
+ emit onResize();
+}
+
+}
diff --git a/Swift/QtUI/QtListWidget.h b/Swift/QtUI/QtListWidget.h
new file mode 100644
index 0000000..b7380c4
--- /dev/null
+++ b/Swift/QtUI/QtListWidget.h
@@ -0,0 +1,23 @@
+/*
+ * Copyright (c) 2018 Isode Limited.
+ * All rights reserved.
+ * See the COPYING file for more information.
+ */
+
+#pragma once
+
+#include <QListWidget>
+
+namespace Swift {
+
+class QtListWidget : public QListWidget {
+ Q_OBJECT
+ public:
+ QtListWidget(QWidget* parent = nullptr);
+ protected:
+ virtual void resizeEvent(QResizeEvent*);
+ signals:
+ void onResize();
+};
+
+}
diff --git a/Swift/QtUI/QtLoginWindow.cpp b/Swift/QtUI/QtLoginWindow.cpp
index 654e921..8fdce4d 100644
--- a/Swift/QtUI/QtLoginWindow.cpp
+++ b/Swift/QtUI/QtLoginWindow.cpp
@@ -573,4 +573,8 @@ void QtLoginWindow::handleOpenConnectionOptions() {
}
}
+QSize QtLoginWindow::sizeHint() const {
+ return QSize(250, 600);
+}
+
}
diff --git a/Swift/QtUI/QtLoginWindow.h b/Swift/QtUI/QtLoginWindow.h
index 674e1e3..d3c2601 100644
--- a/Swift/QtUI/QtLoginWindow.h
+++ b/Swift/QtUI/QtLoginWindow.h
@@ -54,12 +54,15 @@ namespace Swift {
void hide();
QtMenus getMenus() const;
virtual void quit();
+ QSize sizeHint() const;
signals:
void geometryChanged();
- private slots:
+ public slots:
void loginClicked();
+
+ private slots:
void handleCertficateChecked(bool);
void handleQuit();
void handleShowXMLConsole();
diff --git a/Swift/QtUI/QtMainWindow.cpp b/Swift/QtUI/QtMainWindow.cpp
index 0c1dd97..92488ae 100644
--- a/Swift/QtUI/QtMainWindow.cpp
+++ b/Swift/QtUI/QtMainWindow.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -19,6 +19,7 @@
#include <QListWidgetItem>
#include <QMenuBar>
#include <QPushButton>
+#include <QScrollArea>
#include <QTabWidget>
#include <QToolBar>
@@ -26,6 +27,7 @@
#include <Swift/Controllers/SettingConstants.h>
#include <Swift/Controllers/UIEvents/JoinMUCUIEvent.h>
+#include <Swift/Controllers/UIEvents/FdpFormSubmitWindowOpenUIEvent.h>
#include <Swift/Controllers/UIEvents/RequestAdHocUIEvent.h>
#include <Swift/Controllers/UIEvents/RequestAddUserDialogUIEvent.h>
#include <Swift/Controllers/UIEvents/RequestBlockListDialogUIEvent.h>
@@ -35,6 +37,7 @@
#include <Swift/Controllers/UIEvents/RequestProfileEditorUIEvent.h>
#include <Swift/QtUI/QtAdHocCommandWithJIDWindow.h>
+#include <Swift/QtUI/QtChatOverview.h>
#include <Swift/QtUI/QtLoginWindow.h>
#include <Swift/QtUI/QtSettingsProvider.h>
#include <Swift/QtUI/QtSwiftUtil.h>
@@ -52,7 +55,7 @@
namespace Swift {
-QtMainWindow::QtMainWindow(SettingsProvider* settings, UIEventStream* uiEventStream, QtLoginWindow::QtMenus loginMenus, StatusCache* statusCache, bool emoticonsExist, bool enableAdHocCommandOnJID) : QWidget(), MainWindow(false), loginMenus_(loginMenus) {
+QtMainWindow::QtMainWindow(Chattables& chattables, SettingsProvider* settings, UIEventStream* uiEventStream, QtLoginWindow::QtMenus loginMenus, StatusCache* statusCache, bool emoticonsExist, bool enableAdHocCommandOnJID) : QWidget(), MainWindow(false), chattables_(chattables), loginMenus_(loginMenus) {
uiEventStream_ = uiEventStream;
settings_ = settings;
setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding));
@@ -66,11 +69,22 @@ QtMainWindow::QtMainWindow(SettingsProvider* settings, UIEventStream* uiEventStr
connect(meView_, SIGNAL(onShowCertificateInfo()), this, SLOT(handleShowCertificateInfo()));
tabs_ = new QtTabWidget(this);
-#if QT_VERSION >= 0x040500
tabs_->setDocumentMode(true);
-#endif
tabs_->setTabPosition(QTabWidget::South);
mainLayout->addWidget(tabs_);
+
+ if (settings->getSetting(SettingConstants::FUTURE)) {
+ chatOverview_ = new QtChatOverview(chattables, this);
+ auto overviewScroll = new QScrollArea(this);
+ overviewScroll->setWidgetResizable(true);
+ overviewScroll->setWidget(chatOverview_);
+ tabs_->addTab(overviewScroll, tr("&All"));
+
+ // When used with QSplitter and setChildrenCollapsible(false), the following prevents
+ // this widget to be hidden, i.e. resized to zero width.
+ chatOverview_->setMinimumWidth(20);
+ }
+
contactsTabWidget_ = new QWidget(this);
contactsTabWidget_->setContentsMargins(0, 0, 0, 0);
QBoxLayout *contactTabLayout = new QBoxLayout(QBoxLayout::TopToBottom, contactsTabWidget_);
@@ -82,9 +96,7 @@ QtMainWindow::QtMainWindow(SettingsProvider* settings, UIEventStream* uiEventStr
contactTabLayout->addWidget(treeWidget_);
new QtFilterWidget(this, treeWidget_, uiEventStream_, contactTabLayout);
-
tabs_->addTab(contactsTabWidget_, tr("&Contacts"));
-
eventWindow_ = new QtEventWindow(uiEventStream_);
connect(eventWindow_, SIGNAL(onNewEventCountUpdated(int)), this, SLOT(handleEventCountUpdated(int)));
@@ -103,8 +115,11 @@ QtMainWindow::QtMainWindow(SettingsProvider* settings, UIEventStream* uiEventStr
tabs_->tabBar()->hide();
tabBarCombo_ = new QComboBox(this);
tabBarCombo_->setAccessibleName("Current View");
+ tabBarCombo_->addItem(tr("All"));
+#ifndef NOT_YET
tabBarCombo_->addItem(tr("Contacts"));
tabBarCombo_->addItem(tr("Chats"));
+#endif
tabBarCombo_->addItem(tr("Notices"));
tabBarCombo_->setCurrentIndex(tabs_->currentIndex());
mainLayout->addWidget(tabBarCombo_);
@@ -185,6 +200,13 @@ QtMainWindow::QtMainWindow(SettingsProvider* settings, UIEventStream* uiEventStr
}
serverAdHocMenu_ = new QMenu(tr("Run Server Command"), this);
actionsMenu->addMenu(serverAdHocMenu_);
+ if (settings_->getSetting(SettingConstants::FUTURE)) {
+ actionsMenu->addSeparator();
+ submitFormAction_ = new QAction(tr("Submit Form"), this);
+ connect(submitFormAction_, &QAction::triggered, this, &QtMainWindow::handleSubmitFormActionTriggered);
+ actionsMenu->addAction(submitFormAction_);
+ onlineOnlyActions_ << submitFormAction_;
+ }
actionsMenu->addSeparator();
QAction* signOutAction = new QAction(tr("&Sign Out"), this);
connect(signOutAction, SIGNAL(triggered()), SLOT(handleSignOutAction()));
@@ -423,5 +445,8 @@ void QtMainWindow::setBlockingCommandAvailable(bool isAvailable) {
openBlockingListEditor_->setVisible(isAvailable);
}
+void QtMainWindow::handleSubmitFormActionTriggered() {
+ uiEventStream_->send(std::make_shared<FdpFormSubmitWindowOpenUIEvent>());
}
+}
diff --git a/Swift/QtUI/QtMainWindow.h b/Swift/QtUI/QtMainWindow.h
index c46fdfc..b285831 100644
--- a/Swift/QtUI/QtMainWindow.h
+++ b/Swift/QtUI/QtMainWindow.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -12,6 +12,7 @@
#include <QMenu>
#include <QWidget>
+#include <Swift/Controllers/Chat/Chattables.h>
#include <Swift/Controllers/UIInterfaces/MainWindow.h>
#include <Swift/QtUI/ChatList/QtChatListWindow.h>
@@ -19,44 +20,45 @@
#include <Swift/QtUI/QtLoginWindow.h>
#include <Swift/QtUI/QtRosterHeader.h>
+class QAction;
class QComboBox;
class QLineEdit;
-class QPushButton;
-class QToolBar;
-class QAction;
class QMenu;
+class QPushButton;
class QTabWidget;
+class QToolBar;
namespace Swift {
+ class QtChatOverview;
class QtRosterWidget;
- class TreeWidget;
- class UIEventStream;
class QtTabWidget;
- class SettingsProvider;
class QtUIPreferences;
+ class SettingsProvider;
class StatusCache;
+ class TreeWidget;
+ class UIEventStream;
class QtMainWindow : public QWidget, public MainWindow {
Q_OBJECT
public:
- QtMainWindow(SettingsProvider*, UIEventStream* eventStream, QtLoginWindow::QtMenus loginMenus, StatusCache* statusCache, bool emoticonsExist, bool enableAdHocCommandOnJID);
- virtual ~QtMainWindow();
+ QtMainWindow(Chattables&, SettingsProvider*, UIEventStream* eventStream, QtLoginWindow::QtMenus loginMenus, StatusCache* statusCache, bool emoticonsExist, bool enableAdHocCommandOnJID);
+ virtual ~QtMainWindow() override;
std::vector<QMenu*> getMenus() {return menus_;}
- void setMyNick(const std::string& name);
- void setMyJID(const JID& jid);
- void setMyAvatarPath(const std::string& path);
- void setMyStatusText(const std::string& status);
- void setMyStatusType(StatusShow::Type type);
- void setMyContactRosterItem(std::shared_ptr<ContactRosterItem> contact);
- void setConnecting();
- void setStreamEncryptionStatus(bool tlsInPlaceAndValid);
- void openCertificateDialog(const std::vector<Certificate::ref>& chain);
+ void setMyNick(const std::string& name) override;
+ void setMyJID(const JID& jid) override;
+ void setMyAvatarPath(const std::string& path) override;
+ void setMyStatusText(const std::string& status) override;
+ void setMyStatusType(StatusShow::Type type) override;
+ void setMyContactRosterItem(std::shared_ptr<ContactRosterItem> contact) override;
+ void setConnecting() override;
+ void setStreamEncryptionStatus(bool tlsInPlaceAndValid) override;
+ void openCertificateDialog(const std::vector<Certificate::ref>& chain) override;
static void openCertificateDialog(const std::vector<Certificate::ref>& chain, QWidget* parent);
QtEventWindow* getEventWindow();
QtChatListWindow* getChatListWindow();
- void setRosterModel(Roster* roster);
- void setAvailableAdHocCommands(const std::vector<DiscoItems::Item>& commands);
- void setBlockingCommandAvailable(bool isAvailable);
+ void setRosterModel(Roster* roster) override;
+ void setAvailableAdHocCommands(const std::vector<DiscoItems::Item>& commands) override;
+ void setBlockingCommandAvailable(bool isAvailable) override;
private slots:
void handleStatusChanged(StatusShow::Type showType, const QString &statusMessage);
void handleSettingChanged(const std::string& settingPath);
@@ -79,8 +81,10 @@ namespace Swift {
void handleShowCertificateInfo();
void handleEditBlockingList();
void handleSomethingSelectedChanged(bool itemSelected);
+ void handleSubmitFormActionTriggered();
private:
+ Chattables& chattables_;
SettingsProvider* settings_;
QtLoginWindow::QtMenus loginMenus_;
std::vector<QMenu*> menus_;
@@ -98,6 +102,7 @@ namespace Swift {
QMenu* serverAdHocMenu_;
QtTabWidget* tabs_;
QComboBox* tabBarCombo_;
+ QtChatOverview* chatOverview_;
QWidget* contactsTabWidget_;
QWidget* eventsTabWidget_;
QtEventWindow* eventWindow_;
@@ -106,5 +111,6 @@ namespace Swift {
std::vector<DiscoItems::Item> serverAdHocCommands_;
QList<QAction*> serverAdHocCommandActions_;
QList<QAction*> onlineOnlyActions_;
+ QAction* submitFormAction_;
};
}
diff --git a/Swift/QtUI/QtPlainChatView.cpp b/Swift/QtUI/QtPlainChatView.cpp
index 7e9c857..cdee1e6 100644
--- a/Swift/QtUI/QtPlainChatView.cpp
+++ b/Swift/QtUI/QtPlainChatView.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2013-2017 Isode Limited.
+ * Copyright (c) 2013-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -42,7 +42,7 @@ QtPlainChatView::QtPlainChatView(QtChatWindow *window, UIEventStream* eventStrea
QtPlainChatView::~QtPlainChatView() {
}
-QString chatMessageToString(const ChatWindow::ChatMessage& message) {
+static QString chatMessageToString(const ChatWindow::ChatMessage& message) {
QString result;
for (auto&& part : message.getParts()) {
std::shared_ptr<ChatWindow::ChatTextMessagePart> textPart;
@@ -178,7 +178,7 @@ void QtPlainChatView::setAckState(const std::string& /*id*/, ChatWindow::AckStat
std::string QtPlainChatView::addFileTransfer(const std::string& senderName, const std::string& /*avatarPath*/, bool senderIsSelf, const std::string& filename, const boost::uintmax_t sizeInBytes, const std::string& description)
{
- const std::string ftId = "ft" + boost::lexical_cast<std::string>(idGenerator_++);
+ const std::string ftId = "ft" + std::to_string(idGenerator_++);
const std::string sizeString = formatSize(sizeInBytes);
FileTransfer* transfer;
@@ -327,7 +327,7 @@ void QtPlainChatView::acceptMUCInvite()
{
AcceptMUCInviteAction *action = dynamic_cast<AcceptMUCInviteAction*>(sender());
if (action) {
- eventStream_->send(std::make_shared<JoinMUCUIEvent>(action->jid_.toString(), action->password_, boost::optional<std::string>(), false, false, action->isImpromptu_, action->isContinuation_));
+ eventStream_->send(std::make_shared<JoinMUCUIEvent>(action->jid_.toString(), action->password_, boost::optional<std::string>(), false, action->isImpromptu_, action->isContinuation_));
delete action->parent_;
}
}
diff --git a/Swift/QtUI/QtScaledAvatarCache.cpp b/Swift/QtUI/QtScaledAvatarCache.cpp
index 37ea6a9..e3a28d6 100644
--- a/Swift/QtUI/QtScaledAvatarCache.cpp
+++ b/Swift/QtUI/QtScaledAvatarCache.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2011-2016 Isode Limited.
+ * Copyright (c) 2011-2019 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -53,8 +53,8 @@ QString QtScaledAvatarCache::getScaledAvatarPath(const QString& path) {
if (avatarFile.exists() && !avatarFile.absolutePath().startsWith(":/")) {
QString cacheSubPath = QString("ScaledAvatarCacheV%1/%2").arg(QString::number(QT_SCALED_AVATAR_CACHE_VERSION), QString::number(size));
if (!avatarFile.dir().mkpath(cacheSubPath)) {
- SWIFT_LOG(error) << "avatarFile.dir(): " << Q2PSTRING(avatarFile.dir().absolutePath()) << std::endl;
- SWIFT_LOG(error) << "Failed creating cache folder: " << Q2PSTRING(cacheSubPath) << std::endl;
+ SWIFT_LOG(error) << "avatarFile.dir(): " << Q2PSTRING(avatarFile.dir().absolutePath());
+ SWIFT_LOG(error) << "Failed creating cache folder: " << Q2PSTRING(cacheSubPath);
return path;
}
QDir targetDir(avatarFile.dir().absoluteFilePath(cacheSubPath));
@@ -75,7 +75,7 @@ QString QtScaledAvatarCache::getScaledAvatarPath(const QString& path) {
return path;
}
} else {
- SWIFT_LOG(warning) << "Failed to load " << Q2PSTRING(path) << std::endl;
+ SWIFT_LOG(warning) << "Failed to load " << Q2PSTRING(path);
}
}
return targetFile;
diff --git a/Swift/QtUI/QtSingleWindow.cpp b/Swift/QtUI/QtSingleWindow.cpp
index 1fba497..af7e552 100644
--- a/Swift/QtUI/QtSingleWindow.cpp
+++ b/Swift/QtUI/QtSingleWindow.cpp
@@ -1,13 +1,21 @@
/*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
#include <Swift/QtUI/QtSingleWindow.h>
+#include <QPushButton>
+#include <QVBoxLayout>
+
+#include <Swiften/Base/Platform.h>
+
#include <Swift/QtUI/QtChatTabs.h>
+#include <Swift/QtUI/QtLoginWindow.h>
#include <Swift/QtUI/QtSettingsProvider.h>
+#include <Swift/QtUI/ServerList/QtServerListView.h>
+#include <Swift/QtUI/ServerList/ServerListModel.h>
namespace Swift {
@@ -16,31 +24,49 @@ static const QString SINGLE_WINDOW_SPLITS = QString("SINGLE_WINDOW_SPLITS");
QtSingleWindow::QtSingleWindow(QtSettingsProvider* settings) : QSplitter() {
settings_ = settings;
- QVariant geometryVariant = settings_->getQSettings()->value(SINGLE_WINDOW_GEOMETRY);
+ auto geometryVariant = settings_->getQSettings()->value(SINGLE_WINDOW_GEOMETRY);
if (geometryVariant.isValid()) {
restoreGeometry(geometryVariant.toByteArray());
}
- connect(this, SIGNAL(splitterMoved(int, int)), this, SLOT(handleSplitterMoved(int, int)));
+ connect(this, SIGNAL(splitterMoved(int, int)), this, SLOT(handleSplitterMoved(/*int, int*/)));
+ setChildrenCollapsible(false);
+
+ auto left = new QWidget(this);
+ serverList_ = new QtServerListView();
+ serverListModel_ = new ServerListModel();
+ serverList_->setModel(serverListModel_);
+ serverListModel_->setModelData(&accountData_);
+ accountData_.onDataChanged.connect(boost::bind(&ServerListModel::handleDataChanged, serverListModel_));
+ auto addButton = new QPushButton("+", left);
+ QVBoxLayout* leftLayout = new QVBoxLayout();
+ leftLayout->addWidget(serverList_);
+ leftLayout->addWidget(addButton);
+ left->setLayout(leftLayout);
+ QSplitter::addWidget(left);
+ loginWindows_ = new QStackedWidget(this);
+ QSplitter::addWidget(loginWindows_);
+ tabs_ = new QStackedWidget(this);
+ QSplitter::addWidget(tabs_);
restoreSplitters();
+ setStretchFactor(0, 0);
+ setStretchFactor(1, 0);
+ setStretchFactor(2, 1);
+ connect(serverList_, &QtServerListView::clicked, this, &QtSingleWindow::handleListItemClicked);
+ connect(addButton, &QPushButton::clicked, this, &QtSingleWindow::wantsToAddAccount);
+#ifdef SWIFTEN_PLATFORM_MACOSX
+ setHandleWidth(0);
+#endif
}
QtSingleWindow::~QtSingleWindow() {
}
-void QtSingleWindow::addWidget(QWidget* widget) {
- QtChatTabs* tabs = dynamic_cast<QtChatTabs*>(widget);
- if (tabs) {
- connect(tabs, SIGNAL(onTitleChanged(const QString&)), this, SLOT(handleTabsTitleChanged(const QString&)));
- }
- QSplitter::addWidget(widget);
-}
-
void QtSingleWindow::handleTabsTitleChanged(const QString& title) {
setWindowTitle(title);
}
-void QtSingleWindow::handleSplitterMoved(int, int) {
+void QtSingleWindow::handleSplitterMoved() {
QList<QVariant> variantValues;
QList<int> intValues = sizes();
for (const auto& value : intValues) {
@@ -50,17 +76,18 @@ void QtSingleWindow::handleSplitterMoved(int, int) {
}
void QtSingleWindow::restoreSplitters() {
- QList<QVariant> variantValues = settings_->getQSettings()->value(SINGLE_WINDOW_SPLITS).toList();
- QList<int> intValues;
- for (auto&& value : variantValues) {
- intValues.append(value.toInt());
+ auto splitsVariant = settings_->getQSettings()->value(SINGLE_WINDOW_SPLITS);
+ if (splitsVariant.isValid()) {
+ auto variantValues = splitsVariant.toList();
+ QList<int> intValues;
+ for (auto&& value : variantValues) {
+ intValues.append(value.toInt());
+ }
+ setSizes(intValues);
+ }
+ else {
+ handleSplitterMoved();
}
- setSizes(intValues);
-}
-
-void QtSingleWindow::insertAtFront(QWidget* widget) {
- insertWidget(0, widget);
- restoreSplitters();
}
void QtSingleWindow::handleGeometryChanged() {
@@ -76,4 +103,24 @@ void QtSingleWindow::moveEvent(QMoveEvent*) {
handleGeometryChanged();
}
+void QtSingleWindow::addAccount(QtLoginWindow* loginWindow, QtChatTabs* tabs) {
+ loginWindows_->addWidget(loginWindow);
+ tabs_->addWidget(tabs);
+ std::string account = QString("Account %1").arg(loginWindows_->count()).toStdString();
+ accountData_.addAccount(account);
+ emit serverListModel_->layoutChanged();
+}
+
+void QtSingleWindow::handleListItemClicked(const QModelIndex& item) {
+ auto currentTabs = tabs_->widget(tabs_->currentIndex());
+ disconnect(currentTabs, SIGNAL(onTitleChanged(const QString&)), this, SLOT(handleTabsTitleChanged(const QString&)));
+ loginWindows_->setCurrentIndex(item.row());
+ tabs_->setCurrentIndex(item.row());
+ currentTabs = tabs_->widget(tabs_->currentIndex());
+ connect(currentTabs, SIGNAL(onTitleChanged(const QString&)), this, SLOT(handleTabsTitleChanged(const QString&)));
+ //TODO change the title of the window.
+ handleTabsTitleChanged(QString("Swift"));
+
+}
+
}
diff --git a/Swift/QtUI/QtSingleWindow.h b/Swift/QtUI/QtSingleWindow.h
index 804be65..a707cd3 100644
--- a/Swift/QtUI/QtSingleWindow.h
+++ b/Swift/QtUI/QtSingleWindow.h
@@ -1,29 +1,41 @@
/*
- * Copyright (c) 2010-2012 Isode Limited.
+ * Copyright (c) 2010-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
#pragma once
+#include <QListWidget>
#include <QSplitter>
+#include <QStackedWidget>
+
+#include <Swift/QtUI/ServerList/ServerListModel.h>
namespace Swift {
+ class QtChatTabs;
+ class QtLoginWindow;
class QtSettingsProvider;
+ class QtServerListView;
+ class ServerListModel;
class QtSingleWindow : public QSplitter {
Q_OBJECT
public:
QtSingleWindow(QtSettingsProvider* settings);
virtual ~QtSingleWindow();
- void insertAtFront(QWidget* widget);
- void addWidget(QWidget* widget);
+ void addAccount(QtLoginWindow* widget, QtChatTabs* tabs);
+
+ signals:
+ void wantsToAddAccount();
+
protected:
void resizeEvent(QResizeEvent*);
void moveEvent(QMoveEvent*);
private slots:
- void handleSplitterMoved(int, int);
+ void handleSplitterMoved();
void handleTabsTitleChanged(const QString& title);
+ void handleListItemClicked(const QModelIndex&);
private:
void handleGeometryChanged();
void restoreSplitters();
@@ -31,6 +43,11 @@ namespace Swift {
private:
QtSettingsProvider* settings_;
+ SwiftAccountData accountData_;
+ QtServerListView* serverList_;
+ ServerListModel* serverListModel_;
+ QStackedWidget* loginWindows_;
+ QStackedWidget* tabs_;
};
}
diff --git a/Swift/QtUI/QtSoundSelectionStyledItemDelegate.h b/Swift/QtUI/QtSoundSelectionStyledItemDelegate.h
index fabf668..f03cacc 100644
--- a/Swift/QtUI/QtSoundSelectionStyledItemDelegate.h
+++ b/Swift/QtUI/QtSoundSelectionStyledItemDelegate.h
@@ -11,6 +11,7 @@
namespace Swift {
class QtSoundSelectionStyledItemDelegate : public QStyledItemDelegate {
+ Q_OBJECT
public:
QtSoundSelectionStyledItemDelegate(QObject* parent = nullptr);
diff --git a/Swift/QtUI/QtSpellCheckerWindow.cpp b/Swift/QtUI/QtSpellCheckerWindow.cpp
index a8178c4..23b0963 100644
--- a/Swift/QtUI/QtSpellCheckerWindow.cpp
+++ b/Swift/QtUI/QtSpellCheckerWindow.cpp
@@ -5,7 +5,7 @@
*/
/*
- * Copyright (c) 2016 Isode Limited.
+ * Copyright (c) 2016-2019 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -64,7 +64,7 @@ void QtSpellCheckerWindow::setSupportedLanguages(const std::vector<std::string>&
}
void QtSpellCheckerWindow::setActiveLanguage(const std::string& language) {
- SWIFT_LOG_ASSERT(languageItems_.find(language) != languageItems_.end(), warning) << "Language '" << language << "' is not available." << std::endl;
+ SWIFT_LOG_ASSERT(languageItems_.find(language) != languageItems_.end(), warning) << "Language '" << language << "' is not available.";
if (languageItems_.find(language) != languageItems_.end()) {
languageItems_[language]->setSelected(true);
}
diff --git a/Swift/QtUI/QtStatusWidget.cpp b/Swift/QtUI/QtStatusWidget.cpp
index b175e5c..5e2ba5f 100644
--- a/Swift/QtUI/QtStatusWidget.cpp
+++ b/Swift/QtUI/QtStatusWidget.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -8,9 +8,6 @@
#include <algorithm>
-#include <boost/lambda/bind.hpp>
-#include <boost/lambda/lambda.hpp>
-
#include <QApplication>
#include <QBoxLayout>
#include <QComboBox>
@@ -32,8 +29,6 @@
#include <Swift/QtUI/QtLineEdit.h>
#include <Swift/QtUI/QtSwiftUtil.h>
-namespace lambda = boost::lambda;
-
namespace Swift {
QtStatusWidget::QtStatusWidget(StatusCache* statusCache, QWidget *parent) : QWidget(parent), statusCache_(statusCache), editCursor_(Qt::IBeamCursor), viewCursor_(Qt::PointingHandCursor) {
@@ -153,8 +148,9 @@ void QtStatusWidget::generateList() {
}
std::vector<StatusCache::PreviousStatus> previousStatuses = statusCache_->getMatches(Q2PSTRING(text), 8);
for (const auto& savedStatus : previousStatuses) {
- if (savedStatus.first.empty() || std::find_if(allTypes_.begin(), allTypes_.end(),
- savedStatus.second == lambda::_1 && savedStatus.first == lambda::bind(&statusShowTypeToFriendlyName, lambda::_1)) != allTypes_.end()) {
+ if (savedStatus.first.empty() || std::find_if(allTypes_.begin(), allTypes_.end(), [&](StatusShow::Type type) {
+ return (savedStatus.second == type) && (savedStatus.first == statusShowTypeToFriendlyName(type));
+ }) != allTypes_.end()) {
continue;
}
QListWidgetItem* item = new QListWidgetItem(P2QSTRING(savedStatus.first), menu_);
diff --git a/Swift/QtUI/QtStrings.h b/Swift/QtUI/QtStrings.h
index d0cd421..84bc7f9 100644
--- a/Swift/QtUI/QtStrings.h
+++ b/Swift/QtUI/QtStrings.h
@@ -26,6 +26,14 @@ QT_TRANSLATE_NOOP("QLineEdit", "&Copy");
QT_TRANSLATE_NOOP("QLineEdit", "&Paste");
QT_TRANSLATE_NOOP("QLineEdit", "Delete");
+QT_TRANSLATE_NOOP("QWidgetTextControl", "Select All");
+QT_TRANSLATE_NOOP("QWidgetTextControl", "&Undo");
+QT_TRANSLATE_NOOP("QWidgetTextControl", "&Redo");
+QT_TRANSLATE_NOOP("QWidgetTextControl", "Cu&t");
+QT_TRANSLATE_NOOP("QWidgetTextControl", "&Copy");
+QT_TRANSLATE_NOOP("QWidgetTextControl", "&Paste");
+QT_TRANSLATE_NOOP("QWidgetTextControl", "Delete");
+
QT_TRANSLATE_NOOP("QScrollBar", "Scroll here");
QT_TRANSLATE_NOOP("QScrollBar", "Top");
QT_TRANSLATE_NOOP("QScrollBar", "Bottom");
@@ -76,6 +84,10 @@ QT_TRANSLATE_NOOP("QDialogButtonBox", "Cancel");
QT_TRANSLATE_NOOP("QMessageBox", "Show Details...");
QT_TRANSLATE_NOOP("QMessageBox", "Hide Details...");
+QT_TRANSLATE_NOOP("QPlatformTheme", "OK");
+QT_TRANSLATE_NOOP("QPlatformTheme", "Cancel");
+QT_TRANSLATE_NOOP("QPlatformTheme", "Restore Defaults");
+
QT_TRANSLATE_NOOP("MAC_APPLICATION_MENU", "Services");
QT_TRANSLATE_NOOP("MAC_APPLICATION_MENU", "Hide %1");
QT_TRANSLATE_NOOP("MAC_APPLICATION_MENU", "Hide Others");
diff --git a/Swift/QtUI/QtSwift.cpp b/Swift/QtUI/QtSwift.cpp
index 7b4e2c3..73fd733 100644
--- a/Swift/QtUI/QtSwift.cpp
+++ b/Swift/QtUI/QtSwift.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010-2017 Isode Limited.
+ * Copyright (c) 2010-2019 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -22,8 +22,10 @@
#include <Swiften/Base/Path.h>
#include <Swiften/Base/Paths.h>
#include <Swiften/Base/Platform.h>
+#include <Swiften/Base/String.h>
#include <Swiften/Client/Client.h>
#include <Swiften/Elements/Presence.h>
+#include <Swiften/StringCodecs/Base64.h>
#include <Swiften/TLS/TLSContextFactory.h>
#include <SwifTools/Application/PlatformApplicationPathProvider.h>
@@ -33,7 +35,7 @@
#include <Swift/Controllers/ApplicationInfo.h>
#include <Swift/Controllers/BuildVersion.h>
-#include <Swift/Controllers/MainController.h>
+#include <Swift/Controllers/AccountController.h>
#include <Swift/Controllers/SettingConstants.h>
#include <Swift/Controllers/Settings/SettingsProviderHierachy.h>
#include <Swift/Controllers/Settings/XMLSettingsProvider.h>
@@ -42,8 +44,6 @@
#include <Swift/Controllers/Storages/FileStoragesFactory.h>
#include <Swift/QtUI/QtChatTabs.h>
-#include <Swift/QtUI/QtChatTabsBase.h>
-#include <Swift/QtUI/QtChatTabsShortcutOnlySubstitute.h>
#include <Swift/QtUI/QtChatWindowFactory.h>
#include <Swift/QtUI/QtLoginWindow.h>
#include <Swift/QtUI/QtSingleWindow.h>
@@ -92,15 +92,15 @@ po::options_description QtSwift::getOptionsDescription() {
("debug", "Turn on debug logging")
("help", "Show this help message")
("version", "Show version information")
- ("netbook-mode", "Use netbook mode display (unsupported)")
("no-tabs", "Don't manage chat windows in tabs (unsupported)")
("latency-debug", "Use latency debugging (unsupported)")
- ("multi-account", po::value<int>()->default_value(1), "Number of accounts to open windows for (unsupported)")
- ("start-minimized", "Don't show the login/roster window at startup")
- ("enable-jid-adhocs", "Enable AdHoc commands to custom JID's.")
+ ("enable-jid-adhocs", "Enable AdHoc commands to custom JIDs.")
#if QT_VERSION >= 0x040800
("language", po::value<std::string>(), "Use a specific language, instead of the system-wide one")
#endif
+ ("logfile", po::value<std::string>()->implicit_value(""), "Save all logging information to a file")
+ ("enable-future", "Enable future features (unsupported). This will persist across restarts")
+ ("disable-future", "Disable future features. This will persist across restarts")
;
return result;
}
@@ -161,34 +161,42 @@ QtSwift::QtSwift(const po::variables_map& options) : networkFactories_(&clientMa
qtSettings_ = new QtSettingsProvider();
xmlSettings_ = loadSettingsFile(P2QSTRING(pathToString(Paths::getExecutablePath() / "system-settings.xml")));
- settingsHierachy_ = new SettingsProviderHierachy();
- settingsHierachy_->addProviderToTopOfStack(xmlSettings_);
- settingsHierachy_->addProviderToTopOfStack(qtSettings_);
+ settingsHierarchy_ = new SettingsProviderHierachy();
+ settingsHierarchy_->addProviderToTopOfStack(xmlSettings_);
+ settingsHierarchy_->addProviderToTopOfStack(qtSettings_);
- networkFactories_.getTLSContextFactory()->setDisconnectOnCardRemoval(settingsHierachy_->getSetting(SettingConstants::DISCONNECT_ON_CARD_REMOVAL));
+ networkFactories_.getTLSContextFactory()->setDisconnectOnCardRemoval(settingsHierarchy_->getSetting(SettingConstants::DISCONNECT_ON_CARD_REMOVAL));
- std::map<std::string, std::string> emoticons;
- loadEmoticonsFile(":/emoticons/emoticons.txt", emoticons);
- loadEmoticonsFile(P2QSTRING(pathToString(Paths::getExecutablePath() / "emoticons.txt")), emoticons);
+ loadEmoticonsFile(":/emoticons/emoticons.txt", emoticons_);
+ loadEmoticonsFile(P2QSTRING(pathToString(Paths::getExecutablePath() / "emoticons.txt")), emoticons_);
- if (options.count("netbook-mode")) {
- splitter_ = new QtSingleWindow(qtSettings_);
- } else {
- splitter_ = nullptr;
+ splitter_ = new QtSingleWindow(qtSettings_);
+ connect(splitter_, SIGNAL(wantsToAddAccount()), this, SLOT(handleWantsToAddAccount()));
+
+ if (options.count("debug")) {
+ Log::setLogLevel(Swift::Log::debug);
}
- int numberOfAccounts = 1;
- try {
- numberOfAccounts = options["multi-account"].as<int>();
- } catch (...) {
- /* This seems to fail on a Mac when the .app is launched directly (the usual path).*/
- numberOfAccounts = 1;
+ if (options.count("enable-future")) {
+ settingsHierarchy_->storeSetting(SettingConstants::FUTURE, true);
}
- if (options.count("debug")) {
- Log::setLogLevel(Swift::Log::debug);
+ if (options.count("disable-future")) {
+ settingsHierarchy_->storeSetting(SettingConstants::FUTURE, false);
}
+ if (options.count("logfile")) {
+ try {
+ std::string fileName = options["logfile"].as<std::string>();
+ Log::setLogFile(fileName);
+ }
+ catch (...) {
+ SWIFT_LOG(error) << "Error while retrieving the specified log file name from the command line";
+ }
+ }
+ //TODO this old option can be purged
+ useDelayForLatency_ = options.count("latency-debug") > 0;
+
// Load fonts
std::vector<std::string> fontNames = {
"themes/Default/Lato2OFL/Lato-Black.ttf",
@@ -214,22 +222,22 @@ QtSwift::QtSwift(const po::variables_map& options) : networkFactories_(&clientMa
for (auto&& fontName : fontNames) {
std::string fontPath = std::string(":/") + fontName;
int error = QFontDatabase::addApplicationFont(P2QSTRING(fontPath));
- assert((error != -1) && "Failed to load font.");
+ SWIFT_LOG_ASSERT(error != -1, error) << "Failed to load font " << fontPath;
}
- bool enableAdHocCommandOnJID = options.count("enable-jid-adhocs") > 0;
- tabs_ = nullptr;
- if (options.count("no-tabs") && !splitter_) {
- tabs_ = new QtChatTabsShortcutOnlySubstitute();
- }
- else {
- tabs_ = new QtChatTabs(splitter_ != nullptr, settingsHierachy_, true);
- }
- bool startMinimized = options.count("start-minimized") > 0;
+#ifdef SWIFTEN_PLATFORM_LINUX
+ std::string fontPath = std::string(":/themes/Default/Noto/NotoColorEmoji.ttf");
+ int error = QFontDatabase::addApplicationFont(P2QSTRING(fontPath));
+ SWIFT_LOG_ASSERT(error != -1, error) << "Failed to load font " << fontPath;
+ QFont::insertSubstitution(QApplication::font().family(),"NotoColorEmoji");
+#endif
+#ifdef SWIFTEN_PLATFORM_WINDOWS
+ QFont::insertSubstitution(QApplication::font().family(), "Segoe UI Emoji");
+#endif
+ enableAdHocCommandOnJID_ = options.count("enable-jid-adhocs") > 0;
applicationPathProvider_ = new PlatformApplicationPathProvider(SWIFT_APPLICATION_NAME);
storagesFactory_ = new FileStoragesFactory(applicationPathProvider_->getDataDir(), networkFactories_.getCryptoProvider());
certificateStorageFactory_ = new CertificateFileStorageFactory(applicationPathProvider_->getDataDir(), tlsFactories_.getCertificateFactory(), networkFactories_.getCryptoProvider());
- chatWindowFactory_ = new QtChatWindowFactory(splitter_, settingsHierachy_, qtSettings_, tabs_, ":/themes/Default/", emoticons);
soundPlayer_ = new QtSoundPlayer(applicationPathProvider_);
// Ugly, because the dock depends on the tray, but the temporary
@@ -265,50 +273,24 @@ QtSwift::QtSwift(const po::variables_map& options) : networkFactories_(&clientMa
statusCache_ = new StatusCache(applicationPathProvider_);
- if (splitter_) {
- splitter_->show();
- }
+ splitter_->show();
PlatformAutoUpdaterFactory autoUpdaterFactory;
- if (autoUpdaterFactory.isSupported() && settingsHierachy_->getSetting(QtUISettingConstants::ENABLE_SOFTWARE_UPDATES)
- && !settingsHierachy_->getSetting(QtUISettingConstants::SOFTWARE_UPDATE_CHANNEL).empty()) {
- autoUpdater_ = autoUpdaterFactory.createAutoUpdater(updateChannelToFeed(settingsHierachy_->getSetting(QtUISettingConstants::SOFTWARE_UPDATE_CHANNEL)));
+ if (autoUpdaterFactory.isSupported() && settingsHierarchy_->getSetting(QtUISettingConstants::ENABLE_SOFTWARE_UPDATES)
+ && !settingsHierarchy_->getSetting(QtUISettingConstants::SOFTWARE_UPDATE_CHANNEL).empty()) {
+ autoUpdater_ = autoUpdaterFactory.createAutoUpdater(updateChannelToFeed(settingsHierarchy_->getSetting(QtUISettingConstants::SOFTWARE_UPDATE_CHANNEL)));
autoUpdater_->checkForUpdates();
autoUpdater_->onUpdateStateChanged.connect(boost::bind(&QtSwift::handleAutoUpdaterStateChanged, this, _1));
- settingsHierachy_->onSettingChanged.connect([&](const std::string& path) {
+ settingsHierarchy_->onSettingChanged.connect([&](const std::string& path) {
if (path == QtUISettingConstants::SOFTWARE_UPDATE_CHANNEL.getKey()) {
- autoUpdater_->setAppcastFeed(updateChannelToFeed(settingsHierachy_->getSetting(QtUISettingConstants::SOFTWARE_UPDATE_CHANNEL)));
+ autoUpdater_->setAppcastFeed(updateChannelToFeed(settingsHierarchy_->getSetting(QtUISettingConstants::SOFTWARE_UPDATE_CHANNEL)));
autoUpdater_->checkForUpdates();
}
});
}
-
- for (int i = 0; i < numberOfAccounts; i++) {
- if (i > 0) {
- // Don't add the first tray (see note above)
- systemTrays_.push_back(new QtSystemTray());
- }
- QtUIFactory* uiFactory = new QtUIFactory(settingsHierachy_, qtSettings_, tabs_, splitter_, systemTrays_[i], chatWindowFactory_, networkFactories_.getTimerFactory(), statusCache_, autoUpdater_, startMinimized, !emoticons.empty(), enableAdHocCommandOnJID);
- uiFactories_.push_back(uiFactory);
- MainController* mainController = new MainController(
- &clientMainThreadCaller_,
- &networkFactories_,
- uiFactory,
- settingsHierachy_,
- systemTrays_[i],
- soundPlayer_,
- storagesFactory_,
- certificateStorageFactory_,
- dock_,
- notifier_,
- uriHandler_,
- &idleDetector_,
- emoticons,
- options.count("latency-debug") > 0);
- mainControllers_.push_back(mainController);
- }
-
+ migrateLastLoginAccount();
+ restoreAccounts();
connect(qApp, SIGNAL(aboutToQuit()), this, SLOT(handleAboutToQuit()));
}
@@ -317,17 +299,15 @@ QtSwift::~QtSwift() {
for (auto* factory : uiFactories_) {
delete factory;
}
- for (auto* controller : mainControllers_) {
+ for (auto* controller : accountControllers_) {
delete controller;
}
delete notifier_;
for (auto* tray : systemTrays_) {
delete tray;
}
- delete tabs_;
- delete chatWindowFactory_;
delete splitter_;
- delete settingsHierachy_;
+ delete settingsHierarchy_;
delete qtSettings_;
delete xmlSettings_;
delete statusCache_;
@@ -364,4 +344,139 @@ void QtSwift::handleAutoUpdaterStateChanged(AutoUpdater::State updatedState) {
}
}
+void QtSwift::handleWantsToAddAccount() {
+ auto loginWindow = addAccount();
+ if (!settingsHierarchy_->getSetting(SettingConstants::FORGET_PASSWORDS)) {
+ for (const auto& profile : settingsHierarchy_->getAvailableProfiles()) {
+ ProfileSettingsProvider profileSettings(profile, settingsHierarchy_);
+ if (profileSettings.getIntSetting("enabled", 0)) {
+ // No point showing accounts that're already logged in
+ continue;
+ }
+ const auto& password = profileSettings.getStringSetting("pass");
+ const auto& certificate = profileSettings.getStringSetting("certificate");
+ const auto& jid = profileSettings.getStringSetting("jid");
+ const auto& clientOptions = parseClientOptions(profileSettings.getStringSetting("options"));
+ loginWindow->addAvailableAccount(jid, password, certificate, clientOptions);
+ }
+ }
+}
+
+void QtSwift::restoreAccounts() {
+ if (!settingsHierarchy_->getSetting(SettingConstants::FORGET_PASSWORDS)) {
+ for (const auto& profile : settingsHierarchy_->getAvailableProfiles()) {
+ ProfileSettingsProvider profileSettings(profile, settingsHierarchy_);
+ if (!profileSettings.getIntSetting("enabled", 0)) {
+ continue;
+ }
+ const auto& jid = profileSettings.getStringSetting("jid");
+ const auto& password = profileSettings.getStringSetting("pass");
+ const auto& certificate = profileSettings.getStringSetting("certificate");
+ const auto& clientOptions = parseClientOptions(profileSettings.getStringSetting("options"));
+ auto loginWindow = addAccount();
+ loginWindow->addAvailableAccount(jid, password, certificate, clientOptions);
+ loginWindow->loginClicked();
+ }
+ }
+}
+
+void QtSwift::migrateLastLoginAccount() {
+ const SettingsProvider::Setting<bool> loginAutomatically = SettingsProvider::Setting<bool>("loginAutomatically", false);
+ if (settingsHierarchy_->getSetting(loginAutomatically)) {
+ auto selectedLoginJID = settingsHierarchy_->getSetting(SettingsProvider::Setting<std::string>("lastLoginJID", ""));
+ for (const auto& profile : settingsHierarchy_->getAvailableProfiles()) {
+ ProfileSettingsProvider profileSettings(profile, settingsHierarchy_);
+ if (profileSettings.getStringSetting("jid") == selectedLoginJID) {
+ profileSettings.storeInt("enabled", 1);
+ break;
+ }
+ }
+ settingsHierarchy_->storeSetting(loginAutomatically, false);
+ }
+}
+
+QtLoginWindow* QtSwift::addAccount() {
+ if (uiFactories_.size() > 0) {
+ // Don't add the first tray (see note above)
+ systemTrays_.push_back(new QtSystemTray());
+ }
+ auto tabs = new QtChatTabs(settingsHierarchy_, true);
+ QtUIFactory* uiFactory = new QtUIFactory(settingsHierarchy_, qtSettings_, tabs, splitter_, systemTrays_[systemTrays_.size() - 1], networkFactories_.getTimerFactory(), statusCache_, autoUpdater_, emoticons_, enableAdHocCommandOnJID_);
+ uiFactories_.push_back(uiFactory);
+ AccountController* accountController = new AccountController(
+ &clientMainThreadCaller_,
+ &networkFactories_,
+ uiFactory,
+ settingsHierarchy_,
+ systemTrays_[systemTrays_.size() - 1],
+ soundPlayer_,
+ storagesFactory_,
+ certificateStorageFactory_,
+ dock_,
+ notifier_,
+ uriHandler_,
+ &idleDetector_,
+ emoticons_,
+ useDelayForLatency_);
+ accountControllers_.push_back(accountController);
+
+ //FIXME - accountController has already created the window, so we can pass null here and get the old one
+ auto loginWindow = uiFactory->createLoginWindow(nullptr);
+
+ return dynamic_cast<QtLoginWindow*>(loginWindow);
+}
+
+//FIXME: Switch all this to boost::serialise
+
+#define CHECK_PARSE_LENGTH if (i >= segments.size()) {return result;}
+#define PARSE_INT_RAW(defaultValue) CHECK_PARSE_LENGTH intVal = defaultValue; try {intVal = boost::lexical_cast<int>(segments[i]);} catch(const boost::bad_lexical_cast&) {};i++;
+#define PARSE_STRING_RAW CHECK_PARSE_LENGTH stringVal = byteArrayToString(Base64::decode(segments[i]));i++;
+
+#define PARSE_BOOL(option, defaultValue) PARSE_INT_RAW(defaultValue); result.option = (intVal == 1);
+#define PARSE_INT(option, defaultValue) PARSE_INT_RAW(defaultValue); result.option = intVal;
+#define PARSE_STRING(option) PARSE_STRING_RAW; result.option = stringVal;
+#define PARSE_SAFE_STRING(option) PARSE_STRING_RAW; result.option = SafeString(createSafeByteArray(stringVal));
+#define PARSE_URL(option) {PARSE_STRING_RAW; result.option = URL::fromString(stringVal);}
+
+
+ClientOptions QtSwift::parseClientOptions(const std::string& optionString) {
+ ClientOptions result;
+ size_t i = 0;
+ int intVal = 0;
+ std::string stringVal;
+ std::vector<std::string> segments = String::split(optionString, ',');
+
+ PARSE_BOOL(useStreamCompression, 1)
+ PARSE_INT_RAW(-1)
+ switch (intVal) {
+ case 1: result.useTLS = ClientOptions::NeverUseTLS; break;
+ case 2: result.useTLS = ClientOptions::UseTLSWhenAvailable; break;
+ case 3: result.useTLS = ClientOptions::RequireTLS; break;
+ default:;
+ }
+ PARSE_BOOL(allowPLAINWithoutTLS, 0)
+ PARSE_BOOL(useStreamResumption, 0)
+ PARSE_BOOL(useAcks, 1)
+ PARSE_STRING(manualHostname)
+ PARSE_INT(manualPort, -1)
+ PARSE_INT_RAW(-1)
+ switch (intVal) {
+ case 1: result.proxyType = ClientOptions::NoProxy; break;
+ case 2: result.proxyType = ClientOptions::SystemConfiguredProxy; break;
+ case 3: result.proxyType = ClientOptions::SOCKS5Proxy; break;
+ case 4: result.proxyType = ClientOptions::HTTPConnectProxy; break;
+ }
+ PARSE_STRING(manualProxyHostname)
+ PARSE_INT(manualProxyPort, -1)
+ PARSE_URL(boshURL)
+ PARSE_URL(boshHTTPConnectProxyURL)
+ PARSE_SAFE_STRING(boshHTTPConnectProxyAuthID)
+ PARSE_SAFE_STRING(boshHTTPConnectProxyAuthPassword)
+ PARSE_BOOL(tlsOptions.schannelTLS1_0Workaround, false)
+ PARSE_BOOL(singleSignOn, false)
+
+ return result;
+}
+
+
}
diff --git a/Swift/QtUI/QtSwift.h b/Swift/QtUI/QtSwift.h
index a7dc3cf..811b6e4 100644
--- a/Swift/QtUI/QtSwift.h
+++ b/Swift/QtUI/QtSwift.h
@@ -1,17 +1,19 @@
/*
- * Copyright (c) 2010-2017 Isode Limited.
+ * Copyright (c) 2010-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
#pragma once
+#include <map>
#include <string>
#include <boost/program_options/options_description.hpp>
#include <boost/program_options/variables_map.hpp>
#include <Swiften/Base/Platform.h>
+#include <Swiften/Client/ClientOptions.h>
#include <Swiften/EventLoop/Qt/QtEventLoop.h>
#include <Swiften/Network/BoostNetworkFactories.h>
#include <Swiften/TLS/PlatformTLSFactories.h>
@@ -35,27 +37,28 @@ namespace po = boost::program_options;
class QSplitter;
namespace Swift {
- class QtUIFactory;
- class CertificateStorageFactory;
- class Dock;
- class Notifier;
- class StoragesFactory;
class ApplicationPathProvider;
class AvatarStorage;
class CapsStorage;
- class MainController;
- class QtSystemTray;
- class QtChatTabsBase;
+ class CertificateStorageFactory;
+ class Dock;
+ class EventLoop;
+ class AccountController;
+ class Notifier;
+ class QtChatTabs;
class QtChatWindowFactory;
- class QtSoundPlayer;
+ class QtLoginWindow;
class QtMUCSearchWindowFactory;
+ class QtSingleWindow;
+ class QtSoundPlayer;
+ class QtSystemTray;
+ class QtUIFactory;
class QtUserSearchWindowFactory;
- class EventLoop;
- class URIHandler;
class SettingsProviderHierachy;
- class XMLSettingsProvider;
class StatusCache;
- class QtSingleWindow;
+ class StoragesFactory;
+ class URIHandler;
+ class XMLSettingsProvider;
class QtSwift : public QObject {
Q_OBJECT
@@ -67,28 +70,35 @@ namespace Swift {
private slots:
void handleAboutToQuit();
void handleAutoUpdaterStateChanged(AutoUpdater::State updatedState);
+ void handleWantsToAddAccount();
private:
XMLSettingsProvider* loadSettingsFile(const QString& fileName);
void loadEmoticonsFile(const QString& fileName, std::map<std::string, std::string>& emoticons);
static const std::string& updateChannelToFeed(const std::string& channel);
+ QtLoginWindow* addAccount();
+ ClientOptions parseClientOptions(const std::string& optionString);
+ void restoreAccounts();
+ /**
+ * Upgrades the config from pre-multi-account to post-multi-account format (added in 5.0).
+ */
+ void migrateLastLoginAccount();
private:
QtEventLoop clientMainThreadCaller_;
PlatformTLSFactories tlsFactories_;
BoostNetworkFactories networkFactories_;
QtChatWindowFactory* chatWindowFactory_;
- std::vector<MainController*> mainControllers_;
+ std::vector<AccountController*> accountControllers_;
std::vector<QtSystemTray*> systemTrays_;
std::vector<QtUIFactory*> uiFactories_;
QtSettingsProvider* qtSettings_;
XMLSettingsProvider* xmlSettings_;
- SettingsProviderHierachy* settingsHierachy_;
+ SettingsProviderHierachy* settingsHierarchy_;
QtSingleWindow* splitter_;
QtSoundPlayer* soundPlayer_;
Dock* dock_;
URIHandler* uriHandler_;
- QtChatTabsBase* tabs_;
ApplicationPathProvider* applicationPathProvider_;
StoragesFactory* storagesFactory_;
CertificateStorageFactory* certificateStorageFactory_;
@@ -97,6 +107,9 @@ namespace Swift {
StatusCache* statusCache_;
PlatformIdleQuerier idleQuerier_;
ActualIdleDetector idleDetector_;
+ std::map<std::string, std::string> emoticons_;
+ bool enableAdHocCommandOnJID_ = false;
+ bool useDelayForLatency_;
#if defined(SWIFTEN_PLATFORM_MACOSX)
CocoaApplication cocoaApplication_;
CocoaApplicationActivateHelper cocoaApplicationActivateHelper_;
diff --git a/Swift/QtUI/QtTabWidget.cpp b/Swift/QtUI/QtTabWidget.cpp
index 67e3ae9..99ef6ee 100644
--- a/Swift/QtUI/QtTabWidget.cpp
+++ b/Swift/QtUI/QtTabWidget.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2017 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -57,7 +57,7 @@ void QtTabWidget::paintEvent(QPaintEvent * event) {
label.setAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
label.setGeometry(QRect(QPoint(0,0), size()) - QMargins(10,10,10,10));
label.setWordWrap(true);
- label.setText(tr("This empty cell is a placeholder for chat windows. You can move existing chats to this cell by dragging the tab over here. You can change the number of cells via the 'Change layout' dialog under the 'View' menu or by using the %1 shortcut.").arg(QKeySequence(tr("Ctrl+Alt+L")).toString(QKeySequence::NativeText)));
+ label.setText(tr("This empty cell is a placeholder for chat windows. You can move existing chats to this cell by dragging the tab over here. You can change the number of cells via the 'Change layout' dialog under the 'View' menu."));
QPainter painter(this);
painter.drawPixmap(label.geometry().topLeft(), label.grab());
}
diff --git a/Swift/QtUI/QtTabbable.h b/Swift/QtUI/QtTabbable.h
index 5837702..63c60f4 100644
--- a/Swift/QtUI/QtTabbable.h
+++ b/Swift/QtUI/QtTabbable.h
@@ -19,7 +19,7 @@ namespace Swift {
bool isWidgetSelected();
virtual AlertType getWidgetAlertState() {return NoActivity;}
- virtual int getCount() {return 0;}
+ virtual size_t getCount() {return 0;}
virtual std::string getID() const = 0;
virtual void setEmphasiseFocus(bool /*emphasise*/) {}
diff --git a/Swift/QtUI/QtTextEdit.cpp b/Swift/QtUI/QtTextEdit.cpp
index e63cd4f..b3c57a7 100644
--- a/Swift/QtUI/QtTextEdit.cpp
+++ b/Swift/QtUI/QtTextEdit.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010-2017 Isode Limited.
+ * Copyright (c) 2010-2019 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -240,7 +240,7 @@ void QtTextEdit::setUpSpellChecker() {
}
else {
// Spellchecking is not working, as we did not get a valid checker from the factory. Disable spellchecking.
- SWIFT_LOG(warning) << "Spellchecking is currently misconfigured in Swift (e.g. missing dictionary or broken dictionary file). Disable spellchecking." << std::endl;
+ SWIFT_LOG(warning) << "Spellchecking is currently misconfigured in Swift (e.g. missing dictionary or broken dictionary file). Disable spellchecking.";
settings_->storeSetting(QtUISettingConstants::SPELL_CHECKER, false);
}
diff --git a/Swift/QtUI/QtUIFactory.cpp b/Swift/QtUI/QtUIFactory.cpp
index ece29ec..49f55dd 100644
--- a/Swift/QtUI/QtUIFactory.cpp
+++ b/Swift/QtUI/QtUIFactory.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010-2017 Isode Limited.
+ * Copyright (c) 2010-2019 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -10,6 +10,7 @@
#include <QSplitter>
+#include <Swiften/Base/Log.h>
#include <Swiften/Whiteboard/WhiteboardSession.h>
#include <Swift/Controllers/Settings/SettingsProviderHierachy.h>
@@ -18,10 +19,10 @@
#include <Swift/QtUI/QtAdHocCommandWindow.h>
#include <Swift/QtUI/QtBlockListEditorWindow.h>
#include <Swift/QtUI/QtChatTabs.h>
-#include <Swift/QtUI/QtChatTabsBase.h>
#include <Swift/QtUI/QtChatWindow.h>
#include <Swift/QtUI/QtChatWindowFactory.h>
#include <Swift/QtUI/QtContactEditWindow.h>
+#include <Swift/QtUI/QtFdpFormSubmitWindow.h>
#include <Swift/QtUI/QtFileTransferListWidget.h>
#include <Swift/QtUI/QtHighlightNotificationConfigDialog.h>
#include <Swift/QtUI/QtHistoryWindow.h>
@@ -40,23 +41,32 @@
namespace Swift {
-QtUIFactory::QtUIFactory(SettingsProviderHierachy* settings, QtSettingsProvider* qtOnlySettings, QtChatTabsBase* tabs, QtSingleWindow* netbookSplitter, QtSystemTray* systemTray, QtChatWindowFactory* chatWindowFactory, TimerFactory* timerFactory, StatusCache* statusCache, AutoUpdater* autoUpdater, bool startMinimized, bool emoticonsExist, bool enableAdHocCommandOnJID) : settings(settings), qtOnlySettings(qtOnlySettings), tabsBase(tabs), netbookSplitter(netbookSplitter), systemTray(systemTray), chatWindowFactory(chatWindowFactory), timerFactory_(timerFactory), lastMainWindow(nullptr), loginWindow(nullptr), statusCache(statusCache), autoUpdater(autoUpdater), startMinimized(startMinimized), emoticonsExist_(emoticonsExist), enableAdHocCommandOnJID_(enableAdHocCommandOnJID) {
- chatFontSize = settings->getSetting(QtUISettingConstants::CHATWINDOW_FONT_SIZE);
- historyFontSize_ = settings->getSetting(QtUISettingConstants::HISTORYWINDOW_FONT_SIZE);
- this->tabs = dynamic_cast<QtChatTabs*>(tabsBase);
+QtUIFactory::QtUIFactory(SettingsProviderHierachy* settings, QtSettingsProvider* qtOnlySettings, QtChatTabs* tabs, QtSingleWindow* netbookSplitter, QtSystemTray* systemTray, TimerFactory* timerFactory, StatusCache* statusCache, AutoUpdater* autoUpdater, std::map<std::string, std::string>& emoticons, bool enableAdHocCommandOnJID) : settings_(settings), qtOnlySettings_(qtOnlySettings), tabs_(tabs), netbookSplitter_(netbookSplitter), systemTray_(systemTray), timerFactory_(timerFactory), lastMainWindow_(nullptr), loginWindow_(nullptr), statusCache_(statusCache), autoUpdater_(autoUpdater), emoticons_(emoticons), enableAdHocCommandOnJID_(enableAdHocCommandOnJID) {
+ emoticonsExist_ = !emoticons_.empty();
+ chatWindowFactory_ = new QtChatWindowFactory(netbookSplitter_, settings, qtOnlySettings, tabs_, ":/themes/Default/", emoticons_);
+ chatFontSize_ = settings_->getSetting(QtUISettingConstants::CHATWINDOW_FONT_SIZE);
+ historyFontSize_ = settings_->getSetting(QtUISettingConstants::HISTORYWINDOW_FONT_SIZE);
+}
+
+QtUIFactory::~QtUIFactory() {
+ SWIFT_LOG(debug) << "Entering QtUIFactory destructor. chatWindows size:" << chatWindows_.size();
+ for (auto chat : chatWindows_) {
+ SWIFT_LOG_ASSERT(chat.isNull(), debug) << "QtUIFactory has active chat windows and has not been reset properly";
+ }
+ delete chatWindowFactory_;
}
XMLConsoleWidget* QtUIFactory::createXMLConsoleWidget() {
QtXMLConsoleWidget* widget = new QtXMLConsoleWidget();
- tabsBase->addTab(widget);
+ tabs_->addTab(widget);
showTabs();
widget->show();
return widget;
}
HistoryWindow* QtUIFactory::createHistoryWindow(UIEventStream* uiEventStream) {
- QtHistoryWindow* window = new QtHistoryWindow(settings, uiEventStream);
- tabsBase->addTab(window);
+ QtHistoryWindow* window = new QtHistoryWindow(settings_, uiEventStream);
+ tabs_->addTab(window);
showTabs();
connect(window, SIGNAL(fontResized(int)), this, SLOT(handleHistoryWindowFontResized(int)));
@@ -67,53 +77,39 @@ HistoryWindow* QtUIFactory::createHistoryWindow(UIEventStream* uiEventStream) {
void QtUIFactory::handleHistoryWindowFontResized(int size) {
historyFontSize_ = size;
- settings->storeSetting(QtUISettingConstants::HISTORYWINDOW_FONT_SIZE, size);
+ settings_->storeSetting(QtUISettingConstants::HISTORYWINDOW_FONT_SIZE, size);
}
FileTransferListWidget* QtUIFactory::createFileTransferListWidget() {
QtFileTransferListWidget* widget = new QtFileTransferListWidget();
- tabsBase->addTab(widget);
+ tabs_->addTab(widget);
showTabs();
widget->show();
return widget;
}
-MainWindow* QtUIFactory::createMainWindow(UIEventStream* eventStream) {
- lastMainWindow = new QtMainWindow(settings, eventStream, loginWindow->getMenus(), statusCache, emoticonsExist_, enableAdHocCommandOnJID_);
- if (tabs) {
- tabs->setViewMenu(lastMainWindow->getMenus()[0]);
- }
- return lastMainWindow;
+MainWindow* QtUIFactory::createMainWindow(Chattables& chattables, UIEventStream* eventStream) {
+ lastMainWindow_ = new QtMainWindow(chattables, settings_, eventStream, loginWindow_->getMenus(), statusCache_, emoticonsExist_, enableAdHocCommandOnJID_);
+ tabs_->setViewMenu(lastMainWindow_->getMenus()[0]);
+ return lastMainWindow_;
}
LoginWindow* QtUIFactory::createLoginWindow(UIEventStream* eventStream) {
- loginWindow = new QtLoginWindow(eventStream, settings, timerFactory_, autoUpdater);
- if (netbookSplitter) {
- netbookSplitter->insertAtFront(loginWindow);
- }
- connect(systemTray, SIGNAL(clicked()), loginWindow, SLOT(toggleBringToFront()));
-
-#ifndef SWIFT_MOBILE
- QVariant loginWindowGeometryVariant = qtOnlySettings->getQSettings()->value("loginWindowGeometry");
- if (loginWindowGeometryVariant.isValid()) {
- loginWindow->restoreGeometry(loginWindowGeometryVariant.toByteArray());
+ if (loginWindow_) {
+ return loginWindow_;
}
- connect(loginWindow, SIGNAL(geometryChanged()), this, SLOT(handleLoginWindowGeometryChanged()));
- if (startMinimized) loginWindow->hide();
-#endif
- return loginWindow;
-}
-
-void QtUIFactory::handleLoginWindowGeometryChanged() {
- qtOnlySettings->getQSettings()->setValue("loginWindowGeometry", loginWindow->saveGeometry());
+ loginWindow_ = new QtLoginWindow(eventStream, settings_, timerFactory_, autoUpdater_);
+ netbookSplitter_->addAccount(loginWindow_, tabs_);
+ connect(systemTray_, SIGNAL(clicked()), loginWindow_, SLOT(toggleBringToFront()));
+ return loginWindow_;
}
EventWindow* QtUIFactory::createEventWindow() {
- return lastMainWindow->getEventWindow();
+ return lastMainWindow_->getEventWindow();
}
ChatListWindow* QtUIFactory::createChatListWindow(UIEventStream*) {
- return lastMainWindow->getChatListWindow();
+ return lastMainWindow_->getChatListWindow();
}
MUCSearchWindow* QtUIFactory::createMUCSearchWindow() {
@@ -121,27 +117,27 @@ MUCSearchWindow* QtUIFactory::createMUCSearchWindow() {
}
ChatWindow* QtUIFactory::createChatWindow(const JID& contact, UIEventStream* eventStream) {
- QtChatWindow* window = dynamic_cast<QtChatWindow*>(chatWindowFactory->createChatWindow(contact, eventStream));
+ QtChatWindow* window = dynamic_cast<QtChatWindow*>(chatWindowFactory_->createChatWindow(contact, eventStream));
// remove already closed and thereby deleted chat windows
- chatWindows.erase(std::remove_if(chatWindows.begin(), chatWindows.end(),
+ chatWindows_.erase(std::remove_if(chatWindows_.begin(), chatWindows_.end(),
[](QPointer<QtChatWindow>& window) {
return window.isNull();
- }), chatWindows.end());
+ }), chatWindows_.end());
- chatWindows.push_back(window);
+ chatWindows_.push_back(window);
connect(window, SIGNAL(fontResized(int)), this, SLOT(handleChatWindowFontResized(int)));
- window->handleFontResized(chatFontSize);
+ window->handleFontResized(chatFontSize_);
return window;
}
void QtUIFactory::handleChatWindowFontResized(int size) {
- chatFontSize = size;
- settings->storeSetting(QtUISettingConstants::CHATWINDOW_FONT_SIZE, size);
+ chatFontSize_ = size;
+ settings_->storeSetting(QtUISettingConstants::CHATWINDOW_FONT_SIZE, size);
// resize font in other chat windows
- for (auto&& existingWindow : chatWindows) {
+ for (auto&& existingWindow : chatWindows_) {
if (!existingWindow.isNull()) {
existingWindow->handleFontResized(size);
}
@@ -149,7 +145,7 @@ void QtUIFactory::handleChatWindowFontResized(int size) {
}
UserSearchWindow* QtUIFactory::createUserSearchWindow(UserSearchWindow::Type type, UIEventStream* eventStream, const std::set<std::string>& groups) {
- return new QtUserSearchWindow(eventStream, type, groups, qtOnlySettings);
+ return new QtUserSearchWindow(eventStream, type, groups, qtOnlySettings_);
}
JoinMUCWindow* QtUIFactory::createJoinMUCWindow(UIEventStream* uiEventStream) {
@@ -169,7 +165,7 @@ WhiteboardWindow* QtUIFactory::createWhiteboardWindow(std::shared_ptr<Whiteboard
}
HighlightEditorWindow* QtUIFactory::createHighlightEditorWindow() {
- return new QtHighlightNotificationConfigDialog(qtOnlySettings);
+ return new QtHighlightNotificationConfigDialog(qtOnlySettings_);
}
BlockListEditorWidget *QtUIFactory::createBlockListEditorWidget() {
@@ -180,11 +176,13 @@ AdHocCommandWindow* QtUIFactory::createAdHocCommandWindow(std::shared_ptr<Outgoi
return new QtAdHocCommandWindow(command);
}
+std::unique_ptr<FdpFormSubmitWindow> QtUIFactory::createFdpFormSubmitWindow() {
+ return std::make_unique<QtFdpFormSubmitWindow>();
+}
+
void QtUIFactory::showTabs() {
- if (tabs) {
- if (!tabs->isVisible()) {
- tabs->show();
- }
+ if (!tabs_->isVisible()) {
+ tabs_->show();
}
}
diff --git a/Swift/QtUI/QtUIFactory.h b/Swift/QtUI/QtUIFactory.h
index 18bf9fe..04836fe 100644
--- a/Swift/QtUI/QtUIFactory.h
+++ b/Swift/QtUI/QtUIFactory.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010-2017 Isode Limited.
+ * Copyright (c) 2010-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -17,8 +17,9 @@ class QSplitter;
namespace Swift {
class AutoUpdater;
+ class Chattables;
+ class FdpFormSubmitWindow;
class QtChatTabs;
- class QtChatTabsBase;
class QtChatTheme;
class QtChatWindow;
class QtChatWindowFactory;
@@ -35,11 +36,11 @@ namespace Swift {
class QtUIFactory : public QObject, public UIFactory {
Q_OBJECT
public:
- QtUIFactory(SettingsProviderHierachy* settings, QtSettingsProvider* qtOnlySettings, QtChatTabsBase* tabs, QtSingleWindow* netbookSplitter, QtSystemTray* systemTray, QtChatWindowFactory* chatWindowFactory, TimerFactory* timerFactory, StatusCache* statusCache, AutoUpdater* autoUpdater, bool startMinimized, bool emoticonsExist, bool enableAdHocCommandOnJID);
-
+ QtUIFactory(SettingsProviderHierachy* settings, QtSettingsProvider* qtOnlySettings, QtChatTabs* tabs, QtSingleWindow* netbookSplitter, QtSystemTray* systemTray, TimerFactory* timerFactory, StatusCache* statusCache, AutoUpdater* autoUpdater, std::map<std::string, std::string>& emoticons, bool enableAdHocCommandOnJID);
+ ~QtUIFactory();
virtual XMLConsoleWidget* createXMLConsoleWidget();
virtual HistoryWindow* createHistoryWindow(UIEventStream*);
- virtual MainWindow* createMainWindow(UIEventStream* eventStream);
+ virtual MainWindow* createMainWindow(Chattables& chattables, UIEventStream* eventStream);
virtual LoginWindow* createLoginWindow(UIEventStream* eventStream);
virtual EventWindow* createEventWindow();
virtual ChatListWindow* createChatListWindow(UIEventStream*);
@@ -54,9 +55,9 @@ namespace Swift {
virtual HighlightEditorWindow* createHighlightEditorWindow();
virtual BlockListEditorWidget* createBlockListEditorWidget();
virtual AdHocCommandWindow* createAdHocCommandWindow(std::shared_ptr<OutgoingAdHocCommandSession> command);
+ virtual std::unique_ptr<FdpFormSubmitWindow> createFdpFormSubmitWindow();
private slots:
- void handleLoginWindowGeometryChanged();
void handleChatWindowFontResized(int);
void handleHistoryWindowFontResized(int);
@@ -64,23 +65,22 @@ namespace Swift {
void showTabs();
private:
- SettingsProviderHierachy* settings;
- QtSettingsProvider* qtOnlySettings;
- QtChatTabsBase* tabsBase;
- QtChatTabs* tabs;
- QtSingleWindow* netbookSplitter;
- QtSystemTray* systemTray;
- QtChatWindowFactory* chatWindowFactory;
+ SettingsProviderHierachy* settings_;
+ QtSettingsProvider* qtOnlySettings_;
+ QtChatTabs* tabs_;
+ QtSingleWindow* netbookSplitter_;
+ QtSystemTray* systemTray_;
+ QtChatWindowFactory* chatWindowFactory_;
TimerFactory* timerFactory_;
- QtMainWindow* lastMainWindow;
- QtLoginWindow* loginWindow;
- StatusCache* statusCache;
- AutoUpdater* autoUpdater;
- std::vector<QPointer<QtChatWindow> > chatWindows;
- bool startMinimized;
- int chatFontSize;
+ QtMainWindow* lastMainWindow_;
+ QtLoginWindow* loginWindow_;
+ StatusCache* statusCache_;
+ AutoUpdater* autoUpdater_;
+ std::vector<QPointer<QtChatWindow> > chatWindows_;
+ int chatFontSize_;
int historyFontSize_;
bool emoticonsExist_;
+ std::map<std::string, std::string>& emoticons_;
bool enableAdHocCommandOnJID_;
};
}
diff --git a/Swift/QtUI/QtVCardWidget/QtVCardFieldInfo.h b/Swift/QtUI/QtVCardWidget/QtVCardFieldInfo.h
index 093357a..fa42c49 100644
--- a/Swift/QtUI/QtVCardWidget/QtVCardFieldInfo.h
+++ b/Swift/QtUI/QtVCardWidget/QtVCardFieldInfo.h
@@ -5,7 +5,7 @@
*/
/*
- * Copyright (c) 2016 Isode Limited.
+ * Copyright (c) 2016-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -36,7 +36,7 @@
} \
\
virtual bool testInstance(QWidget* widget) const { \
- return dynamic_cast<FIELD_CLASS*>(widget) != 0; \
+ return dynamic_cast<FIELD_CLASS*>(widget) != nullptr; \
} \
};
diff --git a/Swift/QtUI/QtVCardWidget/QtVCardWidget.cpp b/Swift/QtUI/QtVCardWidget/QtVCardWidget.cpp
index 290feca..1cd5505 100644
--- a/Swift/QtUI/QtVCardWidget/QtVCardWidget.cpp
+++ b/Swift/QtUI/QtVCardWidget/QtVCardWidget.cpp
@@ -5,7 +5,7 @@
*/
/*
- * Copyright (c) 2014-2016 Isode Limited.
+ * Copyright (c) 2014-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -358,7 +358,7 @@ int QtVCardWidget::fieldTypeInstances(std::shared_ptr<QtVCardFieldInfo> fieldTyp
return instances;
}
-void layoutDeleteChildren(QLayout *layout) {
+static void layoutDeleteChildren(QLayout *layout) {
while(layout->count() > 0) {
QLayoutItem* child;
if ((child = layout->takeAt(0)) != nullptr) {
diff --git a/Swift/QtUI/QtWebKitChatView.cpp b/Swift/QtUI/QtWebKitChatView.cpp
index ea9a9c6..75a23f8 100644
--- a/Swift/QtUI/QtWebKitChatView.cpp
+++ b/Swift/QtUI/QtWebKitChatView.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010-2017 Isode Limited.
+ * Copyright (c) 2010-2019 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -11,9 +11,9 @@
#include <QDesktopWidget>
#include <QEventLoop>
#include <QFile>
+#include <QFileDevice>
#include <QFileDialog>
#include <QFileInfo>
-#include <QFileDevice>
#include <QInputDialog>
#include <QKeyEvent>
#include <QMessageBox>
@@ -28,6 +28,8 @@
#include <Swiften/Base/Log.h>
#include <Swiften/StringCodecs/Base64.h>
+#include <Swift/Controllers/SettingConstants.h>
+#include <Swift/Controllers/Settings/SettingsProvider.h>
#include <Swift/Controllers/UIEvents/JoinMUCUIEvent.h>
#include <Swift/Controllers/UIEvents/UIEventStream.h>
@@ -51,12 +53,15 @@ const QString QtWebKitChatView::ButtonFileTransferSendRequest = QString("filetra
const QString QtWebKitChatView::ButtonFileTransferAcceptRequest = QString("filetransfer-acceptrequest");
const QString QtWebKitChatView::ButtonFileTransferOpenFile = QString("filetransfer-openfile");
const QString QtWebKitChatView::ButtonMUCInvite = QString("mucinvite");
+const QString QtWebKitChatView::ButtonResendMessage = QString("resend-message");
+const QString QtWebKitChatView::ButtonResendPopup = QString("popup-resend");
+
namespace {
const double minimalFontScaling = 0.7;
}
-QtWebKitChatView::QtWebKitChatView(QtChatWindow* window, UIEventStream* eventStream, QtChatTheme* theme, QWidget* parent, bool disableAutoScroll) : QtChatView(parent), window_(window), eventStream_(eventStream), fontSizeSteps_(0), disableAutoScroll_(disableAutoScroll), previousMessageKind_(PreviosuMessageWasNone), previousMessageWasSelf_(false), showEmoticons_(false), insertingLastLine_(false), idCounter_(0) {
+QtWebKitChatView::QtWebKitChatView(QtChatWindow* window, UIEventStream* eventStream, QtChatTheme* theme, QWidget* parent, SettingsProvider* settings, bool disableAutoScroll /*= false*/) : QtChatView(parent), window_(window), eventStream_(eventStream), fontSizeSteps_(0), disableAutoScroll_(disableAutoScroll), previousMessageKind_(PreviosuMessageWasNone), previousMessageWasSelf_(false), showEmoticons_(false), insertingLastLine_(false), idCounter_(0), settings_(settings) {
theme_ = theme;
QVBoxLayout* mainLayout = new QVBoxLayout(this);
@@ -136,7 +141,7 @@ void QtWebKitChatView::addMessageBottom(std::shared_ptr<ChatSnippet> snippet) {
void QtWebKitChatView::addMessageTop(std::shared_ptr<ChatSnippet> /* snippet */) {
// TODO: Implement this in a sensible manner later.
- SWIFT_LOG(error) << "Not yet implemented!" << std::endl;
+ SWIFT_LOG(error) << "Not yet implemented!";
}
void QtWebKitChatView::addToDOM(std::shared_ptr<ChatSnippet> snippet) {
@@ -379,7 +384,7 @@ void QtWebKitChatView::setFileTransferProgress(QString id, const int percentageD
rememberScrolledToBottom();
QWebElement ftElement = findElementWithID(document_, "div", id);
if (ftElement.isNull()) {
- SWIFT_LOG(debug) << "Tried to access FT UI via invalid id!" << std::endl;
+ SWIFT_LOG(debug) << "Tried to access FT UI via invalid id!";
return;
}
QWebElement progressBar = ftElement.findFirst("div.progressbar");
@@ -393,7 +398,7 @@ void QtWebKitChatView::setFileTransferStatus(QString id, const ChatWindow::FileT
rememberScrolledToBottom();
QWebElement ftElement = findElementWithID(document_, "div", id);
if (ftElement.isNull()) {
- SWIFT_LOG(debug) << "Tried to access FT UI via invalid id! id = " << Q2PSTRING(id) << std::endl;
+ SWIFT_LOG(debug) << "Tried to access FT UI via invalid id! id = " << Q2PSTRING(id);
return;
}
@@ -478,7 +483,7 @@ int QtWebKitChatView::getSnippetPositionByDate(const QDate& date) {
void QtWebKitChatView::resetTopInsertPoint() {
// TODO: Implement or refactor later.
- SWIFT_LOG(error) << "Not yet implemented!" << std::endl;
+ SWIFT_LOG(error) << "Not yet implemented!";
}
std::string QtWebKitChatView::addMessage(
@@ -555,10 +560,13 @@ std::string QtWebKitChatView::addMessage(
QString scaledAvatarPath = QtScaledAvatarCache(32).getScaledAvatarPath(avatarPath.c_str());
+ std::string messageMarkingValue = "";
+
QString htmlString;
if (label) {
+ messageMarkingValue = label->getDisplayMarking();
htmlString = QString("<span style=\"border: thin dashed grey; padding-left: .5em; padding-right: .5em; color: %1; background-color: %2; font-size: 90%; margin-right: .5em; \" class='swift_label'>").arg(QtUtilities::htmlEscape(P2QSTRING(label->getForegroundColor()))).arg(QtUtilities::htmlEscape(P2QSTRING(label->getBackgroundColor())));
- htmlString += QString("%1</span> ").arg(QtUtilities::htmlEscape(P2QSTRING(label->getDisplayMarking())));
+ htmlString += QString("%1</span> ").arg(QtUtilities::htmlEscape(P2QSTRING(messageMarkingValue)));
}
QString styleSpanStart = style == "" ? "" : "<span style=\"" + style + "\">";
@@ -569,15 +577,16 @@ std::string QtWebKitChatView::addMessage(
QString highlightSpanEnd = highlightWholeMessage ? "</span>" : "";
htmlString += "<span class='swift_inner_message'>" + styleSpanStart + highlightSpanStart + message + highlightSpanEnd + styleSpanEnd + "</span>" ;
- bool appendToPrevious = appendToPreviousCheck(PreviousMessageWasMessage, senderName, senderIsSelf);
+ bool appendToPrevious = appendToPreviousCheck(PreviousMessageWasMessage, senderName, senderIsSelf, label);
QString qAvatarPath = scaledAvatarPath.isEmpty() ? "qrc:/icons/avatar.svg" : QUrl::fromLocalFile(scaledAvatarPath).toEncoded();
- std::string id = "id" + boost::lexical_cast<std::string>(idCounter_++);
+ std::string id = "id" + std::to_string(idCounter_++);
addMessageBottom(std::make_shared<MessageSnippet>(htmlString, QtUtilities::htmlEscape(P2QSTRING(senderName)), B2QDATE(time), qAvatarPath, senderIsSelf, appendToPrevious, theme_, P2QSTRING(id), direction));
previousMessageWasSelf_ = senderIsSelf;
previousSenderName_ = P2QSTRING(senderName);
previousMessageKind_ = PreviousMessageWasMessage;
+ previousMessageDisplayMarking_ = messageMarkingValue;
return id;
}
@@ -600,6 +609,10 @@ QString QtWebKitChatView::buildChatWindowButton(const QString& name, const QStri
return html;
}
+QString QtWebKitChatView::buildChatWindowPopupImageButton(const QString& title, const QString& path, const QString& arg1, const QString& arg2, const QString& arg3, const QString& arg4, const QString& arg5) {
+ return QString("<div class=\"popup\" onclick='chatwindow.buttonClicked(\"%3\", \"%5\", \"6\", \"7\", \"8\", \"9\")' \"><img src='%1' title='%2'/><span class=\"popuptext\" id=\"resendPopup\" ><div class=\"resendButton\" onclick='chatwindow.buttonClicked(\"%4\", \"%5\", \"6\", \"7\", \"8\", \"9\")'>Resend</div></span></div>").arg(path).arg(title).arg(QtWebKitChatView::ButtonResendPopup).arg(QtWebKitChatView::ButtonResendMessage).arg(encodeButtonArgument(arg1)).arg(encodeButtonArgument(arg2)).arg(encodeButtonArgument(arg3)).arg(encodeButtonArgument(arg4)).arg(encodeButtonArgument(arg5));
+}
+
void QtWebKitChatView::resizeEvent(QResizeEvent* event) {
// This code ensures that if the user is scrolled all to the bottom of a chat view,
// the view stays scrolled to the bottom if the view is resized or if the message
@@ -611,7 +624,7 @@ void QtWebKitChatView::resizeEvent(QResizeEvent* event) {
}
std::string QtWebKitChatView::addFileTransfer(const std::string& senderName, const std::string& avatarPath, bool senderIsSelf, const std::string& filename, const boost::uintmax_t sizeInBytes, const std::string& description) {
- SWIFT_LOG(debug) << "addFileTransfer" << std::endl;
+ SWIFT_LOG(debug) << "addFileTransfer";
QString ft_id = QString("ft%1").arg(P2QSTRING(boost::lexical_cast<std::string>(idCounter_++)));
QString actionText;
@@ -645,7 +658,7 @@ std::string QtWebKitChatView::addFileTransfer(const std::string& senderName, con
bool appendToPrevious = appendToPreviousCheck(PreviousMessageWasFileTransfer, senderName, senderIsSelf);
QString scaledAvatarPath = QtScaledAvatarCache(32).getScaledAvatarPath(avatarPath.c_str());
QString qAvatarPath = scaledAvatarPath.isEmpty() ? "qrc:/icons/avatar.svg" : QUrl::fromLocalFile(scaledAvatarPath).toEncoded();
- std::string id = "ftmessage" + boost::lexical_cast<std::string>(idCounter_++);
+ std::string id = "ftmessage" + std::to_string(idCounter_++);
addMessageBottom(std::make_shared<MessageSnippet>(htmlString, QtUtilities::htmlEscape(P2QSTRING(senderName)), B2QDATE(boost::posix_time::second_clock::universal_time()), qAvatarPath, senderIsSelf, appendToPrevious, theme_, P2QSTRING(id), ChatSnippet::getDirection(actionText)));
previousMessageWasSelf_ = senderIsSelf;
@@ -679,7 +692,7 @@ std::string QtWebKitChatView::addWhiteboardRequest(const QString& contact, bool
"</div>";
}
QString qAvatarPath = "qrc:/icons/avatar.svg";
- std::string id = "wbmessage" + boost::lexical_cast<std::string>(idCounter_++);
+ std::string id = "wbmessage" + std::to_string(idCounter_++);
addMessageBottom(std::make_shared<MessageSnippet>(htmlString, QtUtilities::htmlEscape(contact), B2QDATE(boost::posix_time::second_clock::universal_time()), qAvatarPath, false, false, theme_, P2QSTRING(id), ChatSnippet::getDirection(actionText)));
previousMessageWasSelf_ = false;
previousSenderName_ = contact;
@@ -713,7 +726,7 @@ static bool isFilePathWritable(const QString& path) {
void QtWebKitChatView::setFileTransferWarning(QString id, QString warningText) {
QWebElement ftElement = findElementWithID(document_, "div", id);
if (ftElement.isNull()) {
- SWIFT_LOG(debug) << "Tried to access FT UI via invalid id! id = " << Q2PSTRING(id) << std::endl;
+ SWIFT_LOG(debug) << "Tried to access FT UI via invalid id! id = " << Q2PSTRING(id);
return;
}
@@ -724,7 +737,7 @@ void QtWebKitChatView::setFileTransferWarning(QString id, QString warningText) {
void QtWebKitChatView::removeFileTransferWarning(QString id) {
QWebElement ftElement = findElementWithID(document_, "div", id);
if (ftElement.isNull()) {
- SWIFT_LOG(debug) << "Tried to access FT UI via invalid id! id = " << Q2PSTRING(id) << std::endl;
+ SWIFT_LOG(debug) << "Tried to access FT UI via invalid id! id = " << Q2PSTRING(id);
return;
}
@@ -798,11 +811,25 @@ void QtWebKitChatView::handleHTMLButtonClicked(QString id, QString encodedArgume
QString elementID = arg3;
QString isImpromptu = arg4;
QString isContinuation = arg5;
- eventStream_->send(std::make_shared<JoinMUCUIEvent>(Q2PSTRING(roomJID), Q2PSTRING(password), boost::optional<std::string>(), false, false, isImpromptu.contains("true"), isContinuation.contains("true")));
+ eventStream_->send(std::make_shared<JoinMUCUIEvent>(Q2PSTRING(roomJID), Q2PSTRING(password), boost::optional<std::string>(), false, isImpromptu.contains("true"), isContinuation.contains("true")));
setMUCInvitationJoined(elementID);
}
+ else if (id.startsWith(ButtonResendPopup)) {
+ QString chatID = arg1;
+ QWebElement message = document_.findFirst("#" + arg1);
+ if (!message.isNull()) {
+ QWebElement popuptext = message.findFirst("span#resendPopup.popuptext");
+ if (!popuptext.isNull()) {
+ popuptext.toggleClass("show");
+ }
+ }
+ }
+ else if (id.startsWith(ButtonResendMessage)) {
+ QString chatID = arg1;
+ window_->resendMessage(Q2PSTRING(chatID));
+ }
else {
- SWIFT_LOG(debug) << "Unknown HTML button! ( " << Q2PSTRING(id) << " )" << std::endl;
+ SWIFT_LOG(debug) << "Unknown HTML button! ( " << Q2PSTRING(id) << " )";
}
}
@@ -822,7 +849,7 @@ void QtWebKitChatView::addErrorMessage(const ChatWindow::ChatMessage& errorMessa
}
QString errorMessageHTML(chatMessageToHTML(errorMessage));
- std::string id = "id" + boost::lexical_cast<std::string>(idCounter_++);
+ std::string id = "id" + std::to_string(idCounter_++);
addMessageBottom(std::make_shared<SystemMessageSnippet>("<span class=\"error\">" + errorMessageHTML + "</span>", QDateTime::currentDateTime(), false, theme_, P2QSTRING(id), ChatSnippet::getDirection(errorMessage)));
previousMessageWasSelf_ = false;
@@ -835,7 +862,7 @@ std::string QtWebKitChatView::addSystemMessage(const ChatWindow::ChatMessage& me
}
QString messageHTML = chatMessageToHTML(message);
- std::string id = "id" + boost::lexical_cast<std::string>(idCounter_++);
+ std::string id = "id" + std::to_string(idCounter_++);
addMessageBottom(std::make_shared<SystemMessageSnippet>(messageHTML, QDateTime::currentDateTime(), false, theme_, P2QSTRING(id), getActualDirection(message, direction)));
previousMessageKind_ = PreviousMessageWasSystem;
@@ -901,7 +928,7 @@ void QtWebKitChatView::addPresenceMessage(const ChatWindow::ChatMessage& message
}
QString messageHTML = chatMessageToHTML(message);
- std::string id = "id" + boost::lexical_cast<std::string>(idCounter_++);
+ std::string id = "id" + std::to_string(idCounter_++);
addMessageBottom(std::make_shared<SystemMessageSnippet>(messageHTML, QDateTime::currentDateTime(), false, theme_, P2QSTRING(id), getActualDirection(message, direction)));
previousMessageKind_ = PreviousMessageWasPresence;
@@ -958,7 +985,9 @@ void QtWebKitChatView::setAckState(std::string const& id, ChatWindow::AckState s
xml = "";
displayReceiptInfo(P2QSTRING(id), true);
break;
- case ChatWindow::Failed: xml = "<img src='qrc:/icons/error.png' title='" + tr("This message may not have been transmitted.") + "'/>"; break;
+ case ChatWindow::Failed:
+ xml = buildChatWindowPopupImageButton(tr("This message may not have been sent. Click to resend."), "qrc:/icons/error.png", P2QSTRING(id));
+ break;
}
setAckXML(P2QSTRING(id), xml);
}
@@ -978,12 +1007,19 @@ void QtWebKitChatView::setMessageReceiptState(const std::string& id, ChatWindow:
setReceiptXML(P2QSTRING(id), xml);
}
-bool QtWebKitChatView::appendToPreviousCheck(PreviousMessageKind messageKind, const std::string& senderName, bool senderIsSelf) {
+bool QtWebKitChatView::appendToPreviousCheck(PreviousMessageKind messageKind, const std::string& senderName, bool senderIsSelf, const std::shared_ptr<SecurityLabel>& label /*=nullptr*/) {
bool result = previousMessageKind_ == messageKind && ((senderIsSelf && previousMessageWasSelf_) || (!senderIsSelf && !previousMessageWasSelf_&& previousSenderName_ == P2QSTRING(senderName)));
if (insertingLastLine_) {
insertingLastLine_ = false;
return false;
}
+ if (settings_->getSetting(SettingConstants::MUC_MARKING_ELISION)) {
+ if (label && label->getDisplayMarking() != previousMessageDisplayMarking_) {
+ if (label->getDisplayMarking() != "") {
+ return false;
+ }
+ }
+ }
return result;
}
diff --git a/Swift/QtUI/QtWebKitChatView.h b/Swift/QtUI/QtWebKitChatView.h
index f816942..f0b4459 100644
--- a/Swift/QtUI/QtWebKitChatView.h
+++ b/Swift/QtUI/QtWebKitChatView.h
@@ -28,6 +28,7 @@ namespace Swift {
class QtChatWindowJSBridge;
class UIEventStream;
class QtChatWindow;
+ class SettingsProvider;
class QtWebKitChatView : public QtChatView {
Q_OBJECT
@@ -41,8 +42,10 @@ namespace Swift {
static const QString ButtonFileTransferAcceptRequest;
static const QString ButtonFileTransferOpenFile;
static const QString ButtonMUCInvite;
+ static const QString ButtonResendMessage;
+ static const QString ButtonResendPopup;
public:
- QtWebKitChatView(QtChatWindow* window, UIEventStream* eventStream, QtChatTheme* theme, QWidget* parent, bool disableAutoScroll = false);
+ QtWebKitChatView(QtChatWindow* window, UIEventStream* eventStream, QtChatTheme* theme, QWidget* parent, SettingsProvider* settings, bool disableAutoScroll = false);
~QtWebKitChatView() override;
/** Add message to window.
@@ -150,12 +153,13 @@ namespace Swift {
const boost::posix_time::ptime& time,
const QString& style,
const HighlightAction& highlight);
- bool appendToPreviousCheck(PreviousMessageKind messageKind, const std::string& senderName, bool senderIsSelf);
+ bool appendToPreviousCheck(PreviousMessageKind messageKind, const std::string& senderName, bool senderIsSelf, const std::shared_ptr<SecurityLabel>& label = nullptr);
static ChatSnippet::Direction getActualDirection(const ChatWindow::ChatMessage& message, ChatWindow::Direction direction);
QString getHighlightSpanStart(const std::string& text, const std::string& background);
QString getHighlightSpanStart(const HighlightAction& highlight);
QString chatMessageToHTML(const ChatWindow::ChatMessage& message);
static QString buildChatWindowButton(const QString& name, const QString& id, const QString& arg1 = QString(), const QString& arg2 = QString(), const QString& arg3 = QString(), const QString& arg4 = QString(), const QString& arg5 = QString());
+ static QString buildChatWindowPopupImageButton(const QString& title, const QString& path, const QString& arg1 = QString(), const QString& arg2 = QString(), const QString& arg3 = QString(), const QString& arg4 = QString(), const QString& arg5 = QString());
protected:
void resizeEvent(QResizeEvent* event) override;
@@ -189,5 +193,7 @@ namespace Swift {
QString previousSenderName_;
std::map<QString, QString> descriptions_;
std::map<QString, QString> filePaths_;
+ std::string previousMessageDisplayMarking_;
+ SettingsProvider* settings_ = nullptr;
};
}
diff --git a/Swift/QtUI/QtWebView.cpp b/Swift/QtUI/QtWebView.cpp
index 967be1a..24636ed 100644
--- a/Swift/QtUI/QtWebView.cpp
+++ b/Swift/QtUI/QtWebView.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010-2017 Isode Limited.
+ * Copyright (c) 2010-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -7,8 +7,6 @@
#include <Swift/QtUI/QtWebView.h>
-#include <boost/numeric/conversion/cast.hpp>
-
#include <QFocusEvent>
#include <QKeyEvent>
#include <QKeySequence>
@@ -48,7 +46,7 @@ void QtWebView::keyPressEvent(QKeyEvent* event) {
modifiers,
event->text(),
event->isAutoRepeat(),
- boost::numeric_cast<unsigned short>(event->count()));
+ event->count());
QWebView::keyPressEvent(translatedEvent);
delete translatedEvent;
}
diff --git a/Swift/QtUI/Roster/QtFilterWidget.cpp b/Swift/QtUI/Roster/QtFilterWidget.cpp
index 2f561bd..c017d29 100644
--- a/Swift/QtUI/Roster/QtFilterWidget.cpp
+++ b/Swift/QtUI/Roster/QtFilterWidget.cpp
@@ -82,7 +82,7 @@ bool QtFilterWidget::eventFilter(QObject*, QEvent* event) {
} else if ((keyEvent->key() == Qt::Key_Alt && event->type() == QEvent::KeyRelease && isModifierSinglePressed_)
|| (keyEvent->key() == Qt::Key_Menu)) {
QPoint itemOffset(2,2);
- QPoint contextMenuPosition = treeView_->visualRect(treeView_->currentIndex()).topLeft() + itemOffset;;
+ QPoint contextMenuPosition = treeView_->visualRect(treeView_->currentIndex()).topLeft() + itemOffset;
QApplication::postEvent(treeView_, new QContextMenuEvent(QContextMenuEvent::Keyboard, contextMenuPosition, treeView_->mapToGlobal(contextMenuPosition)));
return true;
} else if (keyEvent->key() == Qt::Key_Return) {
diff --git a/Swift/QtUI/SConscript b/Swift/QtUI/SConscript
index ff97b42..96979c0 100644
--- a/Swift/QtUI/SConscript
+++ b/Swift/QtUI/SConscript
@@ -1,5 +1,6 @@
import os, datetime, re, time
import Version
+import SCons.Util
def generateQRCTheme(dir, prefix) :
sourceDir = dir.abspath
@@ -7,6 +8,11 @@ def generateQRCTheme(dir, prefix) :
result += "<RCC version =\"1.0\">"
result += "<qresource prefix=\"/themes/" + prefix + "\">"
for (path, dirs, files) in os.walk(sourceDir) :
+ #skip the Noto emoji fonts in Windows. No need to package them since they aren't used
+ if "Noto" in path and not env["PLATFORM"] == "linux" :
+ continue
+ dirs.sort()
+ files.sort()
for file in files :
filePath = os.path.join(path,file)
result += "<file alias=\"%(alias)s\">%(path)s</file>" % {
@@ -19,12 +25,12 @@ def generateQRCTheme(dir, prefix) :
Import("env")
-myenv = env.Clone()
+myenv = env.Clone(tools = [ 'textfile' ])
# Disable warnings that affect Qt
-myenv["CXXFLAGS"] = filter(lambda x : x != "-Wfloat-equal", myenv["CXXFLAGS"])
+myenv["CXXFLAGS"] = list(filter(lambda x : x != "-Wfloat-equal", myenv["CXXFLAGS"]))
if "clang" in env["CC"] :
- myenv.Append(CXXFLAGS = ["-Wno-float-equal", "-Wno-shorten-64-to-32", "-Wno-missing-prototypes", "-Wno-unreachable-code", "-Wno-disabled-macro-expansion", "-Wno-unused-private-field", "-Wno-extra-semi", "-Wno-duplicate-enum", "-Wno-missing-variable-declarations", "-Wno-conversion", "-Wno-undefined-reinterpret-cast"])
+ myenv.Append(CXXFLAGS = ["-Wno-float-equal", "-Wno-shorten-64-to-32", "-Wno-conversion"])
myenv.UseFlags(env["SWIFT_CONTROLLERS_FLAGS"])
myenv.UseFlags(env["SWIFTOOLS_FLAGS"])
@@ -57,7 +63,7 @@ myenv.Tool("textfile", toolpath = ["#/BuildTools/SCons/Tools"])
qt4modules = ['QtCore', 'QtWebKit', 'QtGui']
if myenv["qt5"] :
qt_version = '5'
- # QtSvg is required so the image format plugin for SVG images is installed
+ # QtSvg is required so the image format plugin for SVG images is installed
# correctly by Qt's deployment tools.
qt4modules += ['QtWidgets', 'QtWebKitWidgets', 'QtMultimedia', 'QtSvg']
if env["PLATFORM"] != "win32" and env["PLATFORM"] != "darwin" :
@@ -110,131 +116,140 @@ myenv.WriteVal("DefaultTheme.qrc", myenv.Value(generateQRCTheme(myenv.Dir("#/Swi
sources = [
"main.cpp",
+ "ChatList/ChatListDelegate.cpp",
+ "ChatList/ChatListModel.cpp",
+ "ChatList/ChatListMUCItem.cpp",
+ "ChatList/ChatListRecentItem.cpp",
+ "ChatList/ChatListWhiteboardItem.cpp",
+ "ChatList/QtChatListWindow.cpp",
+ "ChattablesModel.cpp",
+ "ChatSnippet.cpp",
+ "EventViewer/EventDelegate.cpp",
+ "EventViewer/EventModel.cpp",
+ "EventViewer/QtEvent.cpp",
+ "EventViewer/QtEventWindow.cpp",
+ "EventViewer/TwoLineDelegate.cpp",
"FlowLayout.cpp",
+ "MessageSnippet.cpp",
+ "MUCSearch/MUCSearchDelegate.cpp",
+ "MUCSearch/MUCSearchEmptyItem.cpp",
+ "MUCSearch/MUCSearchModel.cpp",
+ "MUCSearch/MUCSearchRoomItem.cpp",
+ "MUCSearch/MUCSearchServiceItem.cpp",
+ "MUCSearch/QtLeafSortFilterProxyModel.cpp",
+ "MUCSearch/QtMUCSearchWindow.cpp",
+ "ServerList/ServerListDelegate.cpp",
+ "ServerList/ServerListModel.cpp",
+ "ServerList/QtServerListView.cpp",
+ "qrc_DefaultTheme.cc",
+ "qrc_Swift.cc",
"QtAboutWidget.cpp",
- "QtSpellCheckerWindow.cpp",
+ "QtAddBookmarkWindow.cpp",
+ "QtAdHocCommandWindow.cpp",
+ "QtAdHocCommandWithJIDWindow.cpp",
+ "QtAffiliationEditor.cpp",
"QtAvatarWidget.cpp",
- "QtUIFactory.cpp",
+ "QtBlockListEditorWindow.cpp",
+ "QtBookmarkDetailWindow.cpp",
+ "QtCachedImageScaler.cpp",
+ "QtChatOverview.cpp",
+ "QtChatOverviewBundle.cpp",
+ "QtChatOverviewDelegate.cpp",
+ "QtChatTabs.cpp",
+ "QtChatTabsBase.cpp",
+ "QtChatTheme.cpp",
+ "QtChatView.cpp",
+ "QtChatWindow.cpp",
"QtChatWindowFactory.cpp",
+ "QtChatWindowJSBridge.cpp",
+ "QtCheckBoxStyledItemDelegate.cpp",
"QtClickableLabel.cpp",
+ "QtClosableLineEdit.cpp",
+ "QtColorSelectionStyledItemDelegate.cpp",
+ "QtColorToolButton.cpp",
+ "QtConnectionSettingsWindow.cpp",
+ "QtContactEditWidget.cpp",
+ "QtContactEditWindow.cpp",
+ "QtEditBookmarkWindow.cpp",
+ "QtElidingLabel.cpp",
+ "QtEmojiCell.cpp",
+ "QtEmojisGrid.cpp",
+ "QtEmojisScroll.cpp",
+ "QtEmojisSelector.cpp",
+ "QtEmoticonsGrid.cpp",
+ "QtExpandedListView.cpp",
+ "QtFdpFormSubmitWindow.cpp",
+ "QtFileTransferListItemModel.cpp",
+ "QtFileTransferListWidget.cpp",
+ "QtFormResultItemModel.cpp",
+ "QtFormWidget.cpp",
+ "QtHighlightNotificationConfigDialog.cpp",
+ "QtHistoryWindow.cpp",
+ "QtJoinMUCWindow.cpp",
+ "QtLineEdit.cpp",
+ "QtListWidget.cpp",
"QtLoginWindow.cpp",
"QtMainWindow.cpp",
- "QtProfileWindow.cpp",
- "QtBlockListEditorWindow.cpp",
+ "QtMUCConfigurationWindow.cpp",
"QtNameWidget.cpp",
+ "QtPlainChatView.cpp",
+ "QtProfileWindow.cpp",
+ "QtRecentEmojisGrid.cpp",
+ "QtResourceHelper.cpp",
+ "QtRosterHeader.cpp",
+ "QtScaledAvatarCache.cpp",
"QtSettingsProvider.cpp",
+ "QtSingleWindow.cpp",
+ "QtSoundPlayer.cpp",
+ "QtSoundSelectionStyledItemDelegate.cpp",
+ "QtSpellCheckerWindow.cpp",
+ "QtSpellCheckHighlighter.cpp",
"QtStatusWidget.cpp",
- "QtScaledAvatarCache.cpp",
+ "QtSubscriptionRequestWindow.cpp",
"QtSwift.cpp",
- "QtURIHandler.cpp",
- "QtChatWindow.cpp",
- "QtChatView.cpp",
- "QtWebKitChatView.cpp",
- "QtPlainChatView.cpp",
- "QtChatTheme.cpp",
- "QtChatTabs.cpp",
- "QtChatTabsBase.cpp",
- "QtChatTabsShortcutOnlySubstitute.cpp",
- "QtSoundPlayer.cpp",
"QtSystemTray.cpp",
- "QtCachedImageScaler.cpp",
"QtTabbable.cpp",
"QtTabWidget.cpp",
"QtTextEdit.cpp",
- "QtXMLConsoleWidget.cpp",
- "QtHistoryWindow.cpp",
- "QtFileTransferListWidget.cpp",
- "QtFileTransferListItemModel.cpp",
- "QtAdHocCommandWindow.cpp",
- "QtAdHocCommandWithJIDWindow.cpp",
+ "QtUIFactory.cpp",
+ "QtUISettingConstants.cpp",
+ "QtUpdateFeedSelectionDialog.cpp",
+ "QtURIHandler.cpp",
+ "QtURLValidator.cpp",
"QtUtilities.cpp",
- "QtBookmarkDetailWindow.cpp",
- "QtAddBookmarkWindow.cpp",
- "QtEditBookmarkWindow.cpp",
- "QtEmojisGrid.cpp",
- "QtEmojiCell.cpp",
- "QtEmojisScroll.cpp",
- "QtEmojisSelector.cpp",
- "QtRecentEmojisGrid.cpp",
- "QtEmoticonsGrid.cpp",
- "QtContactEditWindow.cpp",
- "QtContactEditWidget.cpp",
- "QtSingleWindow.cpp",
- "QtColorToolButton.cpp",
- "QtClosableLineEdit.cpp",
- "QtHighlightNotificationConfigDialog.cpp",
- "ChatSnippet.cpp",
- "MessageSnippet.cpp",
- "SystemMessageSnippet.cpp",
- "QtElidingLabel.cpp",
- "QtFormWidget.cpp",
- "QtFormResultItemModel.cpp",
- "QtLineEdit.cpp",
- "QtJoinMUCWindow.cpp",
- "QtConnectionSettingsWindow.cpp",
- "Roster/RosterModel.cpp",
- "Roster/QtTreeWidget.cpp",
- "Roster/RosterDelegate.cpp",
- "Roster/GroupItemDelegate.cpp",
+ "QtWebKitChatView.cpp",
+ "QtWebView.cpp",
+ "QtXMLConsoleWidget.cpp",
"Roster/DelegateCommons.cpp",
+ "Roster/GroupItemDelegate.cpp",
"Roster/QtFilterWidget.cpp",
- "Roster/QtRosterWidget.cpp",
"Roster/QtOccupantListWidget.cpp",
+ "Roster/QtRosterWidget.cpp",
+ "Roster/QtTreeWidget.cpp",
+ "Roster/RosterDelegate.cpp",
+ "Roster/RosterModel.cpp",
"Roster/RosterTooltip.cpp",
- "EventViewer/EventModel.cpp",
- "EventViewer/EventDelegate.cpp",
- "EventViewer/TwoLineDelegate.cpp",
- "EventViewer/QtEventWindow.cpp",
- "EventViewer/QtEvent.cpp",
- "ChatList/QtChatListWindow.cpp",
- "ChatList/ChatListModel.cpp",
- "ChatList/ChatListDelegate.cpp",
- "ChatList/ChatListMUCItem.cpp",
- "ChatList/ChatListRecentItem.cpp",
- "ChatList/ChatListWhiteboardItem.cpp",
- "MUCSearch/MUCSearchDelegate.cpp",
- "MUCSearch/MUCSearchEmptyItem.cpp",
- "MUCSearch/MUCSearchModel.cpp",
- "MUCSearch/MUCSearchRoomItem.cpp",
- "MUCSearch/MUCSearchServiceItem.cpp",
- "MUCSearch/QtLeafSortFilterProxyModel.cpp",
- "MUCSearch/QtMUCSearchWindow.cpp",
+ "SystemMessageSnippet.cpp",
+ "Trellis/QtDNDTabBar.cpp",
+ "Trellis/QtDynamicGridLayout.cpp",
+ "Trellis/QtGridSelectionDialog.cpp",
"UserSearch/ContactListDelegate.cpp",
"UserSearch/ContactListModel.cpp",
"UserSearch/QtContactListWidget.cpp",
"UserSearch/QtSuggestingJIDInput.cpp",
- "UserSearch/QtUserSearchFirstPage.cpp",
- "UserSearch/QtUserSearchFirstMultiJIDPage.cpp",
+ "UserSearch/QtUserSearchDetailsPage.cpp",
"UserSearch/QtUserSearchFieldsPage.cpp",
+ "UserSearch/QtUserSearchFirstMultiJIDPage.cpp",
+ "UserSearch/QtUserSearchFirstPage.cpp",
"UserSearch/QtUserSearchResultsPage.cpp",
- "UserSearch/QtUserSearchDetailsPage.cpp",
"UserSearch/QtUserSearchWindow.cpp",
- "UserSearch/UserSearchModel.cpp",
"UserSearch/UserSearchDelegate.cpp",
+ "UserSearch/UserSearchModel.cpp",
+ "Whiteboard/ColorWidget.cpp",
"Whiteboard/FreehandLineItem.cpp",
"Whiteboard/GView.cpp",
- "Whiteboard/TextDialog.cpp",
"Whiteboard/QtWhiteboardWindow.cpp",
- "Whiteboard/ColorWidget.cpp",
- "QtSubscriptionRequestWindow.cpp",
- "QtRosterHeader.cpp",
- "QtWebView.cpp",
- "qrc_DefaultTheme.cc",
- "qrc_Swift.cc",
- "QtChatWindowJSBridge.cpp",
- "QtMUCConfigurationWindow.cpp",
- "QtAffiliationEditor.cpp",
- "QtUISettingConstants.cpp",
- "QtURLValidator.cpp",
- "QtResourceHelper.cpp",
- "QtSpellCheckHighlighter.cpp",
- "QtUpdateFeedSelectionDialog.cpp",
- "Trellis/QtDynamicGridLayout.cpp",
- "Trellis/QtDNDTabBar.cpp",
- "Trellis/QtGridSelectionDialog.cpp",
- "QtCheckBoxStyledItemDelegate.cpp",
- "QtColorSelectionStyledItemDelegate.cpp",
- "QtSoundSelectionStyledItemDelegate.cpp"
+ "Whiteboard/TextDialog.cpp"
]
if env["PLATFORM"] == "win32" :
@@ -351,7 +366,7 @@ myenv["TEXTFILESUFFIX"] = ""
copying_files = [myenv.File("../../COPYING.gpl"), myenv.File("../../COPYING.thirdparty"), myenv.File("../../COPYING.dependencies")]
if env["PLATFORM"] == "darwin" and env["HAVE_SPARKLE"] :
copying_files.append(env["SPARKLE_COPYING"])
-myenv.MyTextfile(target = "COPYING", source = copying_files, LINESEPARATOR = "\n\n========\n\n\n")
+myenv.Textfile(target = "COPYING", source = copying_files, LINESEPARATOR = "\n\n========\n\n\n")
################################################################################
# Translation
@@ -461,11 +476,16 @@ if env["PLATFORM"] == "win32" :
#myenv.Nsis("../Packaging/nsis/swift.nsi")
if env["SCONS_STAGE"] == "build" and env.get("wix_bindir", None):
def convertToRTF(env, target, source) :
- infile = open(source[0].abspath, 'r')
- outfile = open(target[0].abspath, 'w')
+ if SCons.Util.PY3:
+ infile = open(source[0].abspath, 'r', encoding="utf8")
+ outfile = open(target[0].abspath, 'w', encoding="utf8")
+ else:
+ infile = open(source[0].abspath, 'r')
+ outfile = open(target[0].abspath, 'w')
outfile.write('{\\rtf1\\ansi{\\fonttbl\\f0\\fswiss Helvetica;}\\fs16\\f0\\pard\n')
for line in infile:
- for char in line.decode("utf-8") :
+ line = line if SCons.Util.PY3 else line.decode("utf-8")
+ for char in line :
if ord(char) > 127 :
# FIXME: This is incorrect, because it only works for latin1.
# The correct way is \u<decimal utf16 point>? , but this is more
@@ -478,9 +498,16 @@ if env["PLATFORM"] == "win32" :
outfile.close()
infile.close()
copying = env.Command(["Swift/COPYING.rtf"], ["COPYING"], convertToRTF)
+ if env.get("vcredistdir", "") :
+ vcredistdir = os.path.dirname(env["vcredistdir"])
+ else:
+ vcredistdir = os.path.dirname(env["vcredist"])+"\\..\\" + ("x86" if env["win_target_arch"] == "x86" else "x64") + "\\Microsoft.VC"+env.get("MSVC_VERSION", "").replace(".","")[:3]+".CRT\\"
wixvariables = {
'VCCRTFile': env["vcredist"],
- 'Version': str(myenv["SWIFT_VERSION_MAJOR"]) + "." + str(myenv["SWIFT_VERSION_MINOR"]) + "." + str(myenv["SWIFT_VERSION_PATCH"])
+ 'VCCRTPath': vcredistdir,
+ 'Version': str(myenv["SWIFT_VERSION_MAJOR"]) + "." + str(myenv["SWIFT_VERSION_MINOR"]) + "." + str(myenv["SWIFT_VERSION_PATCH"]),
+ 'MsvcVersion': str(env.get("MSVC_VERSION", "").replace(".","")[:3]),
+ 'MsvcDotVersion': str(env.get("MSVC_VERSION", "")[:4])
}
wixincludecontent = "<Include>"
for key in wixvariables:
@@ -494,7 +521,18 @@ if env["PLATFORM"] == "win32" :
lightTask = myenv.WiX_Light('#/Packages/Swift/Swift-' + myenv["SWIFT_VERSION"] + '.msi', ['..\\Packaging\\WiX\\gen_files.wixobj','..\\Packaging\\WiX\\Swift.wixobj'])
if myenv.get("SIGNTOOL_KEY_PFX", None) and myenv.get("SIGNTOOL_TIMESTAMP_URL", None) :
def signToolAction(target = None, source = None, env = None):
- env.Execute('signtool.exe sign /fd SHA256 /f "${SIGNTOOL_KEY_PFX}" /t "${SIGNTOOL_TIMESTAMP_URL}" ' + str(target[0]))
+ signresult = 0
+ for x in range (1, 4) :
+ print("Attemping to sign the packages [%s]" % x)
+ signresult = env.Execute('signtool.exe sign /fd SHA256 /f "${SIGNTOOL_KEY_PFX}" /t "${SIGNTOOL_TIMESTAMP_URL}" /d "Swift Installer" ' + str(target[0]))
+ if signresult != 1 :
+ break
+ #If all 3 attemps to sign the package failed, stop the build.
+ if signresult == 1 :
+ print("Error: The build has failed to sign the installer package")
+ Exit(1)
+ if signresult == 2 :
+ print("Signing was completed with warnings.")
myenv.AddPostAction(lightTask, signToolAction)
diff --git a/Swift/QtUI/ServerList/QtServerListView.cpp b/Swift/QtUI/ServerList/QtServerListView.cpp
new file mode 100644
index 0000000..c22680f
--- /dev/null
+++ b/Swift/QtUI/ServerList/QtServerListView.cpp
@@ -0,0 +1,31 @@
+/*
+ * Copyright (c) 2018 Isode Limited.
+ * All rights reserved.
+ * See the COPYING file for more information.
+ */
+
+#include <Swift/QtUI/ServerList/QtServerListView.h>
+
+namespace Swift {
+
+QtServerListView::QtServerListView() {
+ QPalette newPalette = palette();
+ //TODO move color and theme variables to a shared location.
+ newPalette.setColor(QPalette::Base, { 38, 81, 112 });
+ setAutoFillBackground(true);
+ setPalette(newPalette);
+ delegate_ = std::make_unique<ServerListDelegate>();
+ setItemDelegate(delegate_.get());
+ setMaximumWidth(widgetWidth);
+ setMinimumWidth(widgetWidth);
+ setFrameStyle(QFrame::NoFrame);
+ setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
+ setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
+ setSelectionMode(QAbstractItemView::NoSelection);
+}
+
+QtServerListView::~QtServerListView() {
+
+}
+
+}
diff --git a/Swift/QtUI/ServerList/QtServerListView.h b/Swift/QtUI/ServerList/QtServerListView.h
new file mode 100644
index 0000000..bd625aa
--- /dev/null
+++ b/Swift/QtUI/ServerList/QtServerListView.h
@@ -0,0 +1,25 @@
+/*
+ * Copyright (c) 2018 Isode Limited.
+ * All rights reserved.
+ * See the COPYING file for more information.
+ */
+
+#pragma once
+
+#include <memory>
+
+#include <QListView>
+
+#include <Swift/QtUI/ServerList/ServerListDelegate.h>
+
+namespace Swift {
+ class QtServerListView : public QListView {
+ Q_OBJECT
+ public:
+ QtServerListView();
+ virtual ~QtServerListView();
+ private:
+ std::unique_ptr<ServerListDelegate> delegate_;
+ static const int widgetWidth = 82;
+ };
+}
diff --git a/Swift/QtUI/ServerList/ServerListDelegate.cpp b/Swift/QtUI/ServerList/ServerListDelegate.cpp
new file mode 100644
index 0000000..2afb4ea
--- /dev/null
+++ b/Swift/QtUI/ServerList/ServerListDelegate.cpp
@@ -0,0 +1,117 @@
+/*
+ * Copyright (c) 2018 Isode Limited.
+ * All rights reserved.
+ * See the COPYING file for more information.
+ */
+
+#include <Swift/QtUI/ServerList/ServerListDelegate.h>
+
+#include <QApplication>
+#include <QBitmap>
+#include <QBrush>
+#include <QColor>
+#include <QDebug>
+#include <QFileInfo>
+#include <QFontMetrics>
+#include <QPainter>
+#include <QPainterPath>
+#include <QPen>
+#include <QPolygon>
+
+#include <Swift/QtUI/QtScaledAvatarCache.h>
+#include <Swift/QtUI/ServerList/ServerListModel.h>
+
+namespace Swift {
+
+ServerListDelegate::ServerListDelegate() {
+
+}
+
+ServerListDelegate::~ServerListDelegate() {
+
+}
+
+void ServerListDelegate::paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const {
+ QColor bgColor(38, 81, 112);
+ painter->fillRect(option.rect, bgColor);
+ SwiftAccountData::SwiftAccountDataItem* item = static_cast<SwiftAccountData::SwiftAccountDataItem*>(index.internalPointer());
+ paintServerAvatar(painter, option, item->iconPath_, item->status_, false, item->unreadCount_);
+}
+
+QSize ServerListDelegate::sizeHint(const QStyleOptionViewItem& /*option*/, const QModelIndex& /*index*/) const {
+ //TODO Make this configurable.
+ return QSize(75, 75);
+}
+
+void ServerListDelegate::paintServerAvatar(QPainter* painter, const QStyleOptionViewItem& option, const QString& avatarPath, const StatusShow& /*serverPresence*/, bool isIdle, size_t unreadCount) const {
+ painter->save();
+ QRect fullRegion(option.rect);
+ if (option.state & QStyle::State_Selected) {
+ painter->fillRect(fullRegion, option.palette.highlight());
+ painter->setPen(option.palette.highlightedText().color());
+ }
+ auto secondLineColor = painter->pen().color();
+ secondLineColor.setAlphaF(0.7);
+
+ QRect presenceRegion(QPoint(common_.farLeftMargin, fullRegion.top() + common_.horizontalMargin), QSize(presenceIconWidth, presenceIconHeight));
+ QRect idleIconRegion(QPoint(common_.farLeftMargin, fullRegion.top()), QSize(presenceIconWidth * 2, presenceIconHeight - common_.verticalMargin));
+ int calculatedAvatarSize = fullRegion.height() - common_.verticalMargin;
+ //This overlaps the presenceIcon, so must be painted first
+ QRect avatarRegion(QPoint(presenceRegion.right() - common_.presenceIconWidth / 2, presenceRegion.top()), QSize(calculatedAvatarSize, calculatedAvatarSize));
+
+ QPixmap avatarPixmap;
+ if (!avatarPath.isEmpty()) {
+ QString scaledAvatarPath = QtScaledAvatarCache(avatarRegion.height()).getScaledAvatarPath(avatarPath);
+ if (QFileInfo(scaledAvatarPath).exists()) {
+ avatarPixmap.load(scaledAvatarPath);
+ }
+ }
+ if (avatarPixmap.isNull()) {
+ avatarPixmap = QPixmap(":/icons/avatar.svg").scaled(avatarRegion.height(), avatarRegion.width(), Qt::KeepAspectRatio, Qt::SmoothTransformation);
+ }
+ painter->drawPixmap(avatarRegion.topLeft() + QPoint(((avatarRegion.width() - avatarPixmap.width()) / 2), (avatarRegion.height() - avatarPixmap.height()) / 2), avatarPixmap);
+ //Paint the presence status over the top of the avatar
+ //FIXME enable drawing status when ServerPresence data are available.
+ /*{
+ //TODO make the colors consistent with chattables work from QtChatOverviewDelegate::paint, copying for now
+ const auto green = QColor(124, 243, 145);
+ const auto yellow = QColor(243, 243, 0);
+ const auto red = QColor(255, 45, 71);
+ const auto grey = QColor(159, 159, 159);
+ QColor color = grey;
+ switch (serverPresence.getType()) {
+ case StatusShow::Online: color = green; break;
+ case StatusShow::FFC: color = green; break;
+ case StatusShow::Away: color = yellow; break;
+ case StatusShow::XA: color = yellow; break;
+ case StatusShow::DND: color = red; break;
+ case StatusShow::None: color = grey; break;
+ }
+ QPen pen(color);
+ pen.setWidth(1);
+ painter->setRenderHint(QPainter::Antialiasing, true);
+ painter->setPen(pen);
+ painter->setBrush(QBrush(color, Qt::SolidPattern));
+ painter->drawEllipse(presenceRegion);
+ }*/
+
+ if (isIdle) {
+ common_.idleIcon.paint(painter, idleIconRegion, Qt::AlignBottom | Qt::AlignHCenter);
+ }
+
+ if (unreadCount > 0) {
+ QRect unreadRect(avatarRegion.right() - common_.unreadCountSize - common_.horizontalMargin, avatarRegion.top(), common_.unreadCountSize, common_.unreadCountSize);
+ QPen pen(QColor("black"));
+ pen.setWidth(1);
+ painter->setRenderHint(QPainter::Antialiasing, true);
+ painter->setPen(pen);
+ painter->setBrush(QBrush(QColor("red"), Qt::SolidPattern));
+ painter->drawEllipse(unreadRect);
+ painter->setBackgroundMode(Qt::TransparentMode);
+ painter->setPen(QColor("white"));
+ common_.drawElidedText(painter, unreadRect, QString("%1").arg(unreadCount), Qt::AlignCenter);
+ }
+ painter->restore();
+}
+
+}
diff --git a/Swift/QtUI/ServerList/ServerListDelegate.h b/Swift/QtUI/ServerList/ServerListDelegate.h
new file mode 100644
index 0000000..3f8b72b
--- /dev/null
+++ b/Swift/QtUI/ServerList/ServerListDelegate.h
@@ -0,0 +1,31 @@
+/*
+ * Copyright (c) 2018 Isode Limited.
+ * All rights reserved.
+ * See the COPYING file for more information.
+ */
+
+#pragma once
+
+#include <QStyledItemDelegate>
+
+#include <Swiften/Elements/StatusShow.h>
+
+#include <Swift/QtUI/Roster/DelegateCommons.h>
+
+namespace Swift {
+
+ class ServerListDelegate : public QStyledItemDelegate {
+ public:
+ ServerListDelegate();
+ ~ServerListDelegate() override;
+ QSize sizeHint(const QStyleOptionViewItem& option, const QModelIndex& index) const override;
+ void paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const override;
+ private:
+ void paintServerAvatar(QPainter* painter, const QStyleOptionViewItem& option, const QString& avatarPath, const StatusShow& presence, bool isIdle, size_t unreadCount) const;
+ private:
+ DelegateCommons common_;
+ static const int presenceIconHeight = 12;
+ static const int presenceIconWidth = 12;
+ };
+
+}
diff --git a/Swift/QtUI/ServerList/ServerListModel.cpp b/Swift/QtUI/ServerList/ServerListModel.cpp
new file mode 100644
index 0000000..e5dc35e
--- /dev/null
+++ b/Swift/QtUI/ServerList/ServerListModel.cpp
@@ -0,0 +1,68 @@
+/*
+ * Copyright (c) 2018 Isode Limited.
+ * All rights reserved.
+ * See the COPYING file for more information.
+ */
+
+//#include <Swift/QtUI/ServerList/ServerListModel.h>
+#include <QBrush>
+#include <QColor>
+#include <QMimeData>
+
+#include "ServerListModel.h"
+
+namespace Swift {
+
+ServerListModel::ServerListModel() {
+}
+
+ServerListModel::~ServerListModel() {
+}
+
+QVariant ServerListModel::data(const QModelIndex& index, int role) const {
+ if (!index.isValid()) {
+ return QVariant();
+ }
+ SwiftAccountData::SwiftAccountDataItem* item = static_cast<SwiftAccountData::SwiftAccountDataItem*>(index.internalPointer());
+ switch (role) {
+ case Qt::DisplayRole: return QString(item->userJID_.toBare().toString().c_str());
+ case Qt::BackgroundRole: return QBrush(Qt::transparent);
+ case Qt::ToolTipRole: return QString(item->userJID_.toBare().toString().c_str());
+ default: return QVariant();
+ }
+}
+
+QModelIndex ServerListModel::index(int row, int column, const QModelIndex& /*parent*/) const {
+ if (!modelData_ || static_cast<size_t>(row) >= modelData_->size()) {
+ return QModelIndex();
+ }
+ return createIndex(row, column, modelData_->getAccount(row));
+}
+
+QModelIndex ServerListModel::parent(const QModelIndex& /*index*/) const {
+ return QModelIndex();
+}
+
+QMimeData* ServerListModel::mimeData(const QModelIndexList& indexes) const {
+ return QAbstractItemModel::mimeData(indexes);
+}
+
+int ServerListModel::rowCount(const QModelIndex& /*parent*/) const {
+ if (!modelData_) {
+ return 0;
+ }
+ return modelData_->size();
+}
+
+int ServerListModel::columnCount(const QModelIndex& /*parent*/) const {
+ if (!modelData_) {
+ return 0;
+ }
+ return 1;
+}
+
+void ServerListModel::handleDataChanged() {
+ emit layoutChanged();
+}
+
+}
diff --git a/Swift/QtUI/ServerList/ServerListModel.h b/Swift/QtUI/ServerList/ServerListModel.h
new file mode 100644
index 0000000..ae89ade
--- /dev/null
+++ b/Swift/QtUI/ServerList/ServerListModel.h
@@ -0,0 +1,87 @@
+/*
+ * Copyright (c) 2018 Isode Limited.
+ * All rights reserved.
+ * See the COPYING file for more information.
+ */
+
+#pragma once
+
+#include <boost/signals2.hpp>
+
+#include <QAbstractItemModel>
+
+#include <Swiften/Elements/StatusShow.h>
+#include <Swiften/JID/JID.h>
+
+namespace Swift {
+
+ class SwiftAccountData {
+ public:
+ struct SwiftAccountDataItem {
+ SwiftAccountDataItem(std::string serverID) : serverID_(serverID) {}
+ //FIXME eliminate serverID_, the userJID_ will be the ID when we connect with the actual data.
+ std::string serverID_;
+ QString iconPath_;
+ JID userJID_;
+ size_t unreadCount_ = 0;
+ StatusShow status_ = StatusShow::None;
+ boost::signals2::scoped_connection dataChangedConnection_;
+ boost::signals2::signal<void ()> onDataChanged;
+ void handleChangeStatusRequest(StatusShow::Type show, const std::string& /*statusText*/) {
+ status_ = show;
+ onDataChanged();
+ }
+ };
+ public:
+ SwiftAccountData() {}
+ ~SwiftAccountData() {
+ for (auto account : accounts_) {
+ delete account;
+ }
+ }
+ //FIXME make addAccount with SwiftAccountDataItem, and added after a succesfull connection to the server has been established.
+ void addAccount(JID userJID) {
+ SwiftAccountDataItem* newItem = new SwiftAccountDataItem(userJID);
+ newItem->dataChangedConnection_ = newItem->onDataChanged.connect(boost::bind(&SwiftAccountData::handleDataChanged, this));
+ accounts_.push_back(newItem);
+ }
+ SwiftAccountDataItem* getAccount(int index) {
+ if (index >= accounts_.size()) {
+ return nullptr;
+ }
+ return accounts_[index];
+ }
+ size_t size() {
+ return accounts_.size();
+ }
+ public:
+ boost::signals2::signal<void()> onDataChanged;
+ private:
+ void handleDataChanged() {
+ onDataChanged();
+ }
+ private:
+ QList<SwiftAccountDataItem*> accounts_;
+ };
+
+ class ServerListModel : public QAbstractItemModel {
+ Q_OBJECT
+ public:
+ ServerListModel();
+ ~ServerListModel() override;
+
+ QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const override;
+ QModelIndex index(int row, int column, const QModelIndex& parent = QModelIndex()) const override;
+ QModelIndex parent(const QModelIndex& index) const override;
+
+ QMimeData* mimeData(const QModelIndexList& indexes) const override;
+
+ virtual int rowCount(const QModelIndex& parent = QModelIndex()) const override;
+ virtual int columnCount(const QModelIndex& parent = QModelIndex()) const override;
+
+ void setModelData(SwiftAccountData* data) { modelData_ = data; }
+ void handleDataChanged();
+ private:
+ SwiftAccountData* modelData_;
+ };
+}
diff --git a/Swift/QtUI/Trellis/QtDynamicGridLayout.cpp b/Swift/QtUI/Trellis/QtDynamicGridLayout.cpp
index b753ffa..53e2733 100644
--- a/Swift/QtUI/Trellis/QtDynamicGridLayout.cpp
+++ b/Swift/QtUI/Trellis/QtDynamicGridLayout.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2014-2016 Isode Limited.
+ * Copyright (c) 2014-2019 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -23,7 +23,7 @@
namespace Swift {
-QtDynamicGridLayout::QtDynamicGridLayout(QWidget* parent, bool enableDND) : QWidget(parent), dndEnabled_(enableDND), movingTab_(nullptr) {
+QtDynamicGridLayout::QtDynamicGridLayout(bool future, QWidget* parent, bool enableDND) : QWidget(parent), dndEnabled_(enableDND), movingTab_(nullptr), future_(future) {
gridLayout_ = new QGridLayout(this);
setContentsMargins(0,0,0,0);
setDimensions(QSize(1,1));
@@ -49,6 +49,9 @@ int QtDynamicGridLayout::addTab(QtTabbable* tab, const QString& title) {
tabWidget->addTab(tab, title);
}
tab->setEmphasiseFocus(getDimension().width() > 1 || getDimension().height() > 1);
+ if (future_) {
+ showHideFirstTabs(); // FIXME: Putting it here as a workaround until I work out why it doesn't work initially
+ }
return tabWidget ? indexOf(tab) : -1;
}
@@ -144,7 +147,9 @@ void QtDynamicGridLayout::removeTab(int index) {
int tabIndex = -1;
QtTabWidget* tabWidget = indexToTabWidget(index, tabIndex);
if (tabWidget) {
+ QWidget* tab = tabWidget->widget(tabIndex);
tabWidget->removeTab(tabIndex);
+ tab->setParent(nullptr);
}
}
@@ -326,6 +331,24 @@ void QtDynamicGridLayout::setDimensions(const QSize& dim) {
setCurrentWidget(restoredWidget);
updateEmphasiseFocusOnTabs();
+
+ if (future_) {
+ showHideFirstTabs();
+ }
+}
+
+void QtDynamicGridLayout::showHideFirstTabs() {
+ int tmp;
+ auto firstTabs = indexToTabWidget(0, tmp);
+
+ if (firstTabs) {
+ if (gridLayout_->columnCount() == 1 && gridLayout_->rowCount() == 1) {
+ firstTabs->tabBar()->hide();
+ }
+ else {
+ firstTabs->tabBar()->show();
+ }
+ }
}
void QtDynamicGridLayout::updateEmphasiseFocusOnTabs() {
@@ -491,9 +514,9 @@ void QtDynamicGridLayout::updateTabPositions() {
void QtDynamicGridLayout::moveTab(QtTabWidget* tabWidget, int oldIndex, int newIndex) {
#if QT_VERSION >= 0x040500
- SWIFT_LOG_ASSERT(movingTab_ == nullptr, error) << std::endl;
+ SWIFT_LOG_ASSERT(movingTab_ == nullptr, error);
movingTab_ = qobject_cast<QtTabbable*>(tabWidget->widget(oldIndex));
- SWIFT_LOG_ASSERT(movingTab_ != nullptr, error) << std::endl;
+ SWIFT_LOG_ASSERT(movingTab_ != nullptr, error);
if (movingTab_) {
// Install event filter that filters out events issued during the internal movement of the
@@ -503,7 +526,7 @@ void QtDynamicGridLayout::moveTab(QtTabWidget* tabWidget, int oldIndex, int newI
tabWidget->tabBar()->moveTab(oldIndex, newIndex);
qApp->removeEventFilter(this);
- SWIFT_LOG_ASSERT(movingTab_ == tabWidget->widget(newIndex), error) << std::endl;
+ SWIFT_LOG_ASSERT(movingTab_ == tabWidget->widget(newIndex), error);
}
movingTab_ = nullptr;
tabWidget->widget(newIndex)->setFocus();
diff --git a/Swift/QtUI/Trellis/QtDynamicGridLayout.h b/Swift/QtUI/Trellis/QtDynamicGridLayout.h
index 682ae41..f3a2e96 100644
--- a/Swift/QtUI/Trellis/QtDynamicGridLayout.h
+++ b/Swift/QtUI/Trellis/QtDynamicGridLayout.h
@@ -20,7 +20,7 @@ namespace Swift {
class QtDynamicGridLayout : public QWidget {
Q_OBJECT
public:
- explicit QtDynamicGridLayout(QWidget* parent = nullptr, bool enableDND = false);
+ explicit QtDynamicGridLayout(bool future, QWidget* parent = nullptr, bool enableDND = false);
virtual ~QtDynamicGridLayout();
QSize getDimension() const;
@@ -71,6 +71,7 @@ namespace Swift {
void moveTab(QtTabWidget* tabWidget, int oldIndex, int newIndex);
QtTabWidget* createDNDTabWidget(QWidget* parent);
void updateEmphasiseFocusOnTabs();
+ void showHideFirstTabs();
private:
QGridLayout *gridLayout_;
@@ -78,5 +79,6 @@ namespace Swift {
QHash<QString, QPoint> tabPositions_;
QtTabbable* movingTab_;
bool resizing_ = false;
+ bool future_ = false;
};
}
diff --git a/Swift/QtUI/Trellis/QtGridSelectionDialog.cpp b/Swift/QtUI/Trellis/QtGridSelectionDialog.cpp
index 0533edf..e922e07 100644
--- a/Swift/QtUI/Trellis/QtGridSelectionDialog.cpp
+++ b/Swift/QtUI/Trellis/QtGridSelectionDialog.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2014-2016 Isode Limited.
+ * Copyright (c) 2014-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -76,7 +76,7 @@ int QtGridSelectionDialog::getDescriptionTextHeight() const {
int QtGridSelectionDialog::getDescriptionTextHeight(int width) const {
// Height of descriptive centered text below trellis
auto fontMetrics = QFontMetrics(QApplication::font());
- auto descriptionBB = fontMetrics.boundingRect(QRect(0, 0, width - 2 * horizontalMargin, 1000), Qt::TextWordWrap, descriptionText, 0, 0);
+ auto descriptionBB = fontMetrics.boundingRect(QRect(0, 0, width - 2 * horizontalMargin, 1000), Qt::TextWordWrap, descriptionText, 0, nullptr);
return (descriptionBB.height() + descriptionBB.y());
}
@@ -136,7 +136,7 @@ void QtGridSelectionDialog::paintEvent(QPaintEvent*) {
// draw description text
auto fontMetrics = QFontMetrics(QApplication::font());
- auto descriptionBB = fontMetrics.boundingRect(QRect(0,0, width() - 2 * horizontalMargin,0), Qt::AlignHCenter | Qt::AlignTop | Qt::TextWordWrap, descriptionText, 0, 0);
+ auto descriptionBB = fontMetrics.boundingRect(QRect(0,0, width() - 2 * horizontalMargin,0), Qt::AlignHCenter | Qt::AlignTop | Qt::TextWordWrap, descriptionText, 0, nullptr);
QStyleOption opt;
opt.initFrom(this);
diff --git a/Swift/QtUI/UserSearch/ContactListModel.cpp b/Swift/QtUI/UserSearch/ContactListModel.cpp
index 6ef85d7..5d8aa6c 100644
--- a/Swift/QtUI/UserSearch/ContactListModel.cpp
+++ b/Swift/QtUI/UserSearch/ContactListModel.cpp
@@ -5,7 +5,7 @@
*/
/*
- * Copyright (c) 2014-2016 Isode Limited.
+ * Copyright (c) 2014-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -22,32 +22,6 @@
namespace Swift {
-QDataStream& operator >>(QDataStream& in, StatusShow::Type& e){
- quint32 buffer;
- in >> buffer;
- switch(buffer) {
- case StatusShow::Online:
- e = StatusShow::Online;
- break;
- case StatusShow::Away:
- e = StatusShow::Away;
- break;
- case StatusShow::FFC:
- e = StatusShow::FFC;
- break;
- case StatusShow::XA:
- e = StatusShow::XA;
- break;
- case StatusShow::DND:
- e = StatusShow::DND;
- break;
- default:
- e = StatusShow::None;
- break;
- }
- return in;
-}
-
ContactListModel::ContactListModel(bool editable) : QAbstractItemModel(), editable_(editable) {
}
diff --git a/Swift/QtUI/UserSearch/QtSuggestingJIDInput.cpp b/Swift/QtUI/UserSearch/QtSuggestingJIDInput.cpp
index 8c46e38..e55ee80 100644
--- a/Swift/QtUI/UserSearch/QtSuggestingJIDInput.cpp
+++ b/Swift/QtUI/UserSearch/QtSuggestingJIDInput.cpp
@@ -205,7 +205,7 @@ void QtSuggestingJIDInput::hidePopup() {
// Give focus back to input widget because the hide() call passes the focus to the wrong widget.
setFocus();
-#if defined(Q_WS_MAC)
+#if defined(Q_OS_MAC)
// This workaround is needed on OS X, to bring the dialog containing this widget back to the front after
// the popup is hidden. Ubuntu 16.04 and Windows 8 do not have this issue.
window()->raise();
diff --git a/Swift/QtUI/UserSearch/QtUserSearchWindow.cpp b/Swift/QtUI/UserSearch/QtUserSearchWindow.cpp
index 8d15739..4489bc0 100644
--- a/Swift/QtUI/UserSearch/QtUserSearchWindow.cpp
+++ b/Swift/QtUI/UserSearch/QtUserSearchWindow.cpp
@@ -606,6 +606,7 @@ void QtUserSearchWindow::clear() {
howText = QString(tr("Who do you want to invite to the chat?"));
}
firstMultiJIDPage_->howLabel_->setText(howText);
+ firstMultiJIDPage_->groupBox->setEnabled(true);
}
clearForm();
resultsPage_->results_->setModel(nullptr);
diff --git a/Swift/QtUI/UserSearch/QtUserSearchWindow.h b/Swift/QtUI/UserSearch/QtUserSearchWindow.h
index d487a91..f67712e 100644
--- a/Swift/QtUI/UserSearch/QtUserSearchWindow.h
+++ b/Swift/QtUI/UserSearch/QtUserSearchWindow.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010-2017 Isode Limited.
+ * Copyright (c) 2010-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -8,6 +8,7 @@
#include <set>
+#include <QAbstractItemModel>
#include <QWizard>
#include <Swift/Controllers/UIInterfaces/UserSearchWindow.h>
diff --git a/Swift/QtUI/main.cpp b/Swift/QtUI/main.cpp
index 81dc670..3e20e23 100644
--- a/Swift/QtUI/main.cpp
+++ b/Swift/QtUI/main.cpp
@@ -100,7 +100,7 @@ int main(int argc, char* argv[]) {
qtTranslator.load(QString(SWIFT_APPLICATION_NAME).toLower() + "_" + P2QSTRING(language), P2QSTRING(Swift::pathToString(someTranslationPath.parent_path())));
}
else {
- qtTranslator.load(QLocale::system(), QString(SWIFT_APPLICATION_NAME).toLower(), "_", P2QSTRING(Swift::pathToString(someTranslationPath)));
+ qtTranslator.load(QLocale::system(), QString(SWIFT_APPLICATION_NAME).toLower(), "_", P2QSTRING(Swift::pathToString(someTranslationPath.parent_path())));
}
#else
//std::cout << "Loading " << std::string(QLocale::system().name().toUtf8()) << std::endl;
diff --git a/Swift/SConscript b/Swift/SConscript
index daff755..30b09e0 100644
--- a/Swift/SConscript
+++ b/Swift/SConscript
@@ -7,11 +7,17 @@ SConscript("Controllers/SConscript")
if env["SCONS_STAGE"] == "build" :
if not GetOption("help") and not env.get("HAVE_QT", 0) :
if "Swift" in env["PROJECTS"] :
- print "Warning: Swift requires Qt. Not building the Swift Qt application."
+ print("Warning: Swift requires Qt. Not building the Swift Qt application.")
env["PROJECTS"].remove("Swift")
elif not GetOption("help") and env["target"] == "native" and "Swift" in env["PROJECTS"] :
try :
SConscript("QtUI/SConscript")
except Exception as e:
- print "Warning: %s" % str(e)
+ print("Warning: %s" % str(e))
env["PROJECTS"].remove("Swift")
+if "Swift" in env["PROJECTS"] and env["BOOST_1_64_DETECTED"] and not env.get("allow_boost_1_64") and not env.GetOption("clean") :
+ #Version 1.64 has some issues with the serialization of boost::optional, see https://svn.boost.org/trac10/ticket/13050
+ print("Boost 1.64 has been detected. It is not recommended to use this version due to a regression within the library. Swift has been removed from the current build. You can still use this version by setting allow_boost_1_64 to true, but recent chats and highlighting rules will reset.")
+ env["PROJECTS"].remove("Swift")
+if env["help2man"]:
+ SConscript("Packaging/SConscript") \ No newline at end of file
diff --git a/Swift/Translations/swift_de.ts b/Swift/Translations/swift_de.ts
index a658c45..73e0ed8 100644
--- a/Swift/Translations/swift_de.ts
+++ b/Swift/Translations/swift_de.ts
@@ -62,7 +62,7 @@
<message>
<location filename="../Controllers/Chat/ChatController.cpp" line="481"/>
<source> and has been idle since %1%</source>
- <translation>und ist untätig seit %1%</translation>
+ <translation> und ist untätig seit %1%</translation>
</message>
<message>
<source>The day is now %1%</source>
@@ -834,12 +834,12 @@
<translation>Verbannter</translation>
</message>
<message>
- <location filename="../QtUI/CAPICertificateSelector.cpp" line="63"/>
+ <location filename="../QtUI/CAPICertificateSelector.cpp" line="65"/>
<source>TLS Client Certificate Selection</source>
<translation>TLS Clientzertifikatauswahl</translation>
</message>
<message>
- <location filename="../QtUI/CAPICertificateSelector.cpp" line="64"/>
+ <location filename="../QtUI/CAPICertificateSelector.cpp" line="66"/>
<source>Select a certificate to use for authentication</source>
<translation>Wähle ein Zertifikat zur Authentifizierung</translation>
</message>
@@ -879,39 +879,47 @@
</message>
</context>
<context>
+ <name>Form</name>
+ <message>
+ <location filename="../QtUI/Form.ui" line="16"/>
+ <source>Form</source>
+ <translation>Formular</translation>
+ </message>
+</context>
+<context>
<name>MAC_APPLICATION_MENU</name>
<message>
- <location filename="../QtUI/QtStrings.h" line="79"/>
+ <location filename="../QtUI/QtStrings.h" line="91"/>
<source>Services</source>
<translation>Dienste</translation>
</message>
<message>
- <location filename="../QtUI/QtStrings.h" line="80"/>
+ <location filename="../QtUI/QtStrings.h" line="92"/>
<source>Hide %1</source>
<translation>Verstecke %1</translation>
</message>
<message>
- <location filename="../QtUI/QtStrings.h" line="81"/>
+ <location filename="../QtUI/QtStrings.h" line="93"/>
<source>Hide Others</source>
<translation>Verstecke andere</translation>
</message>
<message>
- <location filename="../QtUI/QtStrings.h" line="82"/>
+ <location filename="../QtUI/QtStrings.h" line="94"/>
<source>Show All</source>
<translation>Zeige alle</translation>
</message>
<message>
- <location filename="../QtUI/QtStrings.h" line="83"/>
+ <location filename="../QtUI/QtStrings.h" line="95"/>
<source>Preferences...</source>
<translation>Einstellungen...</translation>
</message>
<message>
- <location filename="../QtUI/QtStrings.h" line="84"/>
+ <location filename="../QtUI/QtStrings.h" line="96"/>
<source>Quit %1</source>
<translation>Beende %1</translation>
</message>
<message>
- <location filename="../QtUI/QtStrings.h" line="85"/>
+ <location filename="../QtUI/QtStrings.h" line="97"/>
<source>About %1</source>
<translation>Ãœber %1</translation>
</message>
@@ -927,32 +935,32 @@
<context>
<name>QDialogButtonBox</name>
<message>
- <location filename="../QtUI/QtStrings.h" line="69"/>
+ <location filename="../QtUI/QtStrings.h" line="77"/>
<source>&amp;Yes</source>
<translation>&amp;Ja</translation>
</message>
<message>
- <location filename="../QtUI/QtStrings.h" line="70"/>
+ <location filename="../QtUI/QtStrings.h" line="78"/>
<source>&amp;No</source>
<translation>&amp;Nein</translation>
</message>
<message>
- <location filename="../QtUI/QtStrings.h" line="71"/>
+ <location filename="../QtUI/QtStrings.h" line="79"/>
<source>&amp;OK</source>
<translation>&amp;Ok</translation>
</message>
<message>
- <location filename="../QtUI/QtStrings.h" line="72"/>
+ <location filename="../QtUI/QtStrings.h" line="80"/>
<source>OK</source>
<translation>Ok</translation>
</message>
<message>
- <location filename="../QtUI/QtStrings.h" line="73"/>
+ <location filename="../QtUI/QtStrings.h" line="81"/>
<source>&amp;Cancel</source>
<translation>&amp;Abbrechen</translation>
</message>
<message>
- <location filename="../QtUI/QtStrings.h" line="74"/>
+ <location filename="../QtUI/QtStrings.h" line="82"/>
<source>Cancel</source>
<translation>Abbrechen</translation>
</message>
@@ -1012,12 +1020,12 @@
<context>
<name>QMessageBox</name>
<message>
- <location filename="../QtUI/QtStrings.h" line="76"/>
+ <location filename="../QtUI/QtStrings.h" line="84"/>
<source>Show Details...</source>
<translation>Details anzeigen...</translation>
</message>
<message>
- <location filename="../QtUI/QtStrings.h" line="77"/>
+ <location filename="../QtUI/QtStrings.h" line="85"/>
<source>Hide Details...</source>
<translation>Details verstecken...</translation>
</message>
@@ -1242,39 +1250,57 @@
</message>
</context>
<context>
+ <name>QPlatformTheme</name>
+ <message>
+ <location filename="../QtUI/QtStrings.h" line="87"/>
+ <source>OK</source>
+ <translation>OK</translation>
+ </message>
+ <message>
+ <location filename="../QtUI/QtStrings.h" line="88"/>
+ <source>Cancel</source>
+ <translation>Abbrechen</translation>
+ </message>
+ <message>
+ <location filename="../QtUI/QtStrings.h" line="89"/>
+ <source>Restore Defaults</source>
+ <translation>Standardeinstellungen</translation>
+ </message>
+</context>
+<context>
<name>QScrollBar</name>
<message>
- <location filename="../QtUI/QtStrings.h" line="29"/>
+ <location filename="../QtUI/QtStrings.h" line="37"/>
<source>Scroll here</source>
<translation>Hier scrollen</translation>
</message>
<message>
- <location filename="../QtUI/QtStrings.h" line="30"/>
+ <location filename="../QtUI/QtStrings.h" line="38"/>
<source>Top</source>
<translation>Oben</translation>
</message>
<message>
- <location filename="../QtUI/QtStrings.h" line="31"/>
+ <location filename="../QtUI/QtStrings.h" line="39"/>
<source>Bottom</source>
<translation>Unten</translation>
</message>
<message>
- <location filename="../QtUI/QtStrings.h" line="32"/>
+ <location filename="../QtUI/QtStrings.h" line="40"/>
<source>Page up</source>
<translation>Seite hoch</translation>
</message>
<message>
- <location filename="../QtUI/QtStrings.h" line="33"/>
+ <location filename="../QtUI/QtStrings.h" line="41"/>
<source>Page down</source>
<translation>Seite runter</translation>
</message>
<message>
- <location filename="../QtUI/QtStrings.h" line="34"/>
+ <location filename="../QtUI/QtStrings.h" line="42"/>
<source>Scroll up</source>
<translation>raufscrollen</translation>
</message>
<message>
- <location filename="../QtUI/QtStrings.h" line="35"/>
+ <location filename="../QtUI/QtStrings.h" line="43"/>
<source>Scroll down</source>
<translation>runterscrollen</translation>
</message>
@@ -1282,37 +1308,37 @@
<context>
<name>QTextControl</name>
<message>
- <location filename="../QtUI/QtStrings.h" line="37"/>
+ <location filename="../QtUI/QtStrings.h" line="45"/>
<source>Select All</source>
<translation>Alles auswählen</translation>
</message>
<message>
- <location filename="../QtUI/QtStrings.h" line="38"/>
+ <location filename="../QtUI/QtStrings.h" line="46"/>
<source>&amp;Copy</source>
<translation>&amp;Kopieren</translation>
</message>
<message>
- <location filename="../QtUI/QtStrings.h" line="39"/>
+ <location filename="../QtUI/QtStrings.h" line="47"/>
<source>&amp;Undo</source>
<translation>&amp;Rückgängig</translation>
</message>
<message>
- <location filename="../QtUI/QtStrings.h" line="40"/>
+ <location filename="../QtUI/QtStrings.h" line="48"/>
<source>&amp;Redo</source>
<translation>&amp;Wiederherstellen</translation>
</message>
<message>
- <location filename="../QtUI/QtStrings.h" line="41"/>
+ <location filename="../QtUI/QtStrings.h" line="49"/>
<source>Cu&amp;t</source>
<translation>&amp;Ausschneiden</translation>
</message>
<message>
- <location filename="../QtUI/QtStrings.h" line="42"/>
+ <location filename="../QtUI/QtStrings.h" line="50"/>
<source>&amp;Paste</source>
<translation>&amp;Einfügen</translation>
</message>
<message>
- <location filename="../QtUI/QtStrings.h" line="43"/>
+ <location filename="../QtUI/QtStrings.h" line="51"/>
<source>Delete</source>
<translation>Löschen</translation>
</message>
@@ -1320,115 +1346,153 @@
<context>
<name>QWebPage</name>
<message>
- <location filename="../QtUI/QtStrings.h" line="45"/>
+ <location filename="../QtUI/QtStrings.h" line="53"/>
<source>Copy Link</source>
<translation>Verknüpfung kopieren</translation>
</message>
<message>
- <location filename="../QtUI/QtStrings.h" line="46"/>
+ <location filename="../QtUI/QtStrings.h" line="54"/>
<source>Copy</source>
<translation>Kopieren</translation>
</message>
<message>
- <location filename="../QtUI/QtStrings.h" line="47"/>
+ <location filename="../QtUI/QtStrings.h" line="55"/>
<source>Copy Image</source>
<translation>Bild kopieren</translation>
</message>
<message>
- <location filename="../QtUI/QtStrings.h" line="48"/>
+ <location filename="../QtUI/QtStrings.h" line="56"/>
<source>Scroll here</source>
<translation>Hier scrollen</translation>
</message>
<message>
- <location filename="../QtUI/QtStrings.h" line="49"/>
+ <location filename="../QtUI/QtStrings.h" line="57"/>
<source>Top</source>
<translation>Oben</translation>
</message>
<message>
- <location filename="../QtUI/QtStrings.h" line="50"/>
+ <location filename="../QtUI/QtStrings.h" line="58"/>
<source>Bottom</source>
<translation>Unten</translation>
</message>
<message>
- <location filename="../QtUI/QtStrings.h" line="51"/>
+ <location filename="../QtUI/QtStrings.h" line="59"/>
<source>Page up</source>
<translation>Seite hoch</translation>
</message>
<message>
- <location filename="../QtUI/QtStrings.h" line="52"/>
+ <location filename="../QtUI/QtStrings.h" line="60"/>
<source>Page down</source>
<translation>Seite runter</translation>
</message>
<message>
- <location filename="../QtUI/QtStrings.h" line="53"/>
+ <location filename="../QtUI/QtStrings.h" line="61"/>
<source>Scroll up</source>
<translation>hochscrollen</translation>
</message>
<message>
- <location filename="../QtUI/QtStrings.h" line="54"/>
+ <location filename="../QtUI/QtStrings.h" line="62"/>
<source>Scroll down</source>
<translation>runterscrollen</translation>
</message>
</context>
<context>
+ <name>QWidgetTextControl</name>
+ <message>
+ <location filename="../QtUI/QtStrings.h" line="29"/>
+ <source>Select All</source>
+ <translation>Alles auswählen</translation>
+ </message>
+ <message>
+ <location filename="../QtUI/QtStrings.h" line="30"/>
+ <source>&amp;Undo</source>
+ <translation>&amp;Rückgängig</translation>
+ </message>
+ <message>
+ <location filename="../QtUI/QtStrings.h" line="31"/>
+ <source>&amp;Redo</source>
+ <translation>&amp;Wiederherstellen</translation>
+ </message>
+ <message>
+ <location filename="../QtUI/QtStrings.h" line="32"/>
+ <source>Cu&amp;t</source>
+ <translation>&amp;Ausschneiden</translation>
+ </message>
+ <message>
+ <location filename="../QtUI/QtStrings.h" line="33"/>
+ <source>&amp;Copy</source>
+ <translation>&amp;Kopieren</translation>
+ </message>
+ <message>
+ <location filename="../QtUI/QtStrings.h" line="34"/>
+ <source>&amp;Paste</source>
+ <translation>&amp;Einfügen</translation>
+ </message>
+ <message>
+ <location filename="../QtUI/QtStrings.h" line="35"/>
+ <source>Delete</source>
+ <translation>Löschen</translation>
+ </message>
+</context>
+<context>
<name>QWizard</name>
<message>
- <location filename="../QtUI/QtStrings.h" line="56"/>
+ <location filename="../QtUI/QtStrings.h" line="64"/>
<source>&lt; &amp;Back</source>
<translation>&lt; &amp;Zurück</translation>
</message>
<message>
- <location filename="../QtUI/QtStrings.h" line="57"/>
+ <location filename="../QtUI/QtStrings.h" line="65"/>
<source>&amp;Finish</source>
<translation>&amp;Abschließen</translation>
</message>
<message>
- <location filename="../QtUI/QtStrings.h" line="58"/>
+ <location filename="../QtUI/QtStrings.h" line="66"/>
<source>&amp;Help</source>
<translation>&amp;Hilfe</translation>
</message>
<message>
- <location filename="../QtUI/QtStrings.h" line="59"/>
+ <location filename="../QtUI/QtStrings.h" line="67"/>
<source>Go Back</source>
<translation>Zurück</translation>
</message>
<message>
- <location filename="../QtUI/QtStrings.h" line="60"/>
+ <location filename="../QtUI/QtStrings.h" line="68"/>
<source>Continue</source>
<translation>Weiter</translation>
</message>
<message>
- <location filename="../QtUI/QtStrings.h" line="61"/>
+ <location filename="../QtUI/QtStrings.h" line="69"/>
<source>Commit</source>
<translation>Festlegen</translation>
</message>
<message>
- <location filename="../QtUI/QtStrings.h" line="62"/>
+ <location filename="../QtUI/QtStrings.h" line="70"/>
<source>Done</source>
<translation>Fertig</translation>
</message>
<message>
- <location filename="../QtUI/QtStrings.h" line="63"/>
+ <location filename="../QtUI/QtStrings.h" line="71"/>
<source>Quit</source>
<translation>Beenden</translation>
</message>
<message>
- <location filename="../QtUI/QtStrings.h" line="64"/>
+ <location filename="../QtUI/QtStrings.h" line="72"/>
<source>Help</source>
<translation>Hilfe</translation>
</message>
<message>
- <location filename="../QtUI/QtStrings.h" line="65"/>
+ <location filename="../QtUI/QtStrings.h" line="73"/>
<source>Cancel</source>
<translation>Abbrechen</translation>
</message>
<message>
- <location filename="../QtUI/QtStrings.h" line="66"/>
+ <location filename="../QtUI/QtStrings.h" line="74"/>
<source>&amp;Next</source>
<translation>&amp;Nächstes</translation>
</message>
<message>
- <location filename="../QtUI/QtStrings.h" line="67"/>
+ <location filename="../QtUI/QtStrings.h" line="75"/>
<source>&amp;Next &gt;</source>
<translation>&amp;Nächstes &gt;</translation>
</message>
@@ -1437,49 +1501,41 @@
<name>QtAffiliationEditor</name>
<message>
<location filename="../QtUI/QtAffiliationEditor.ui" line="14"/>
- <location filename="../QtUI/ui_QtAffiliationEditor.h" line="122"/>
<source>Edit Affiliations</source>
<translation>Zugehörigkeiten bearbeiten</translation>
</message>
<message>
<location filename="../QtUI/QtAffiliationEditor.ui" line="28"/>
- <location filename="../QtUI/ui_QtAffiliationEditor.h" line="124"/>
<source>Affiliation:</source>
<translation>Zugehörigkeit:</translation>
</message>
<message>
<location filename="../QtUI/QtAffiliationEditor.ui" line="36"/>
- <location filename="../QtUI/ui_QtAffiliationEditor.h" line="127"/>
<source>Owner</source>
<translation>Besitzer</translation>
</message>
<message>
<location filename="../QtUI/QtAffiliationEditor.ui" line="41"/>
- <location filename="../QtUI/ui_QtAffiliationEditor.h" line="128"/>
<source>Administrator</source>
<translation>Administrator</translation>
</message>
<message>
<location filename="../QtUI/QtAffiliationEditor.ui" line="46"/>
- <location filename="../QtUI/ui_QtAffiliationEditor.h" line="129"/>
<source>Member</source>
<translation>Mitglied</translation>
</message>
<message>
<location filename="../QtUI/QtAffiliationEditor.ui" line="51"/>
- <location filename="../QtUI/ui_QtAffiliationEditor.h" line="130"/>
<source>Outcast (Banned)</source>
<translation>Verbannter</translation>
</message>
<message>
<location filename="../QtUI/QtAffiliationEditor.ui" line="68"/>
- <location filename="../QtUI/ui_QtAffiliationEditor.h" line="132"/>
<source>Add User</source>
<translation>Benutzer hinzufügen</translation>
</message>
<message>
<location filename="../QtUI/QtAffiliationEditor.ui" line="75"/>
- <location filename="../QtUI/ui_QtAffiliationEditor.h" line="133"/>
<source>Remove User</source>
<translation>Benutzer entfernen</translation>
</message>
@@ -1488,19 +1544,16 @@
<name>QtBlockListEditorWindow</name>
<message>
<location filename="../QtUI/QtBlockListEditorWindow.ui" line="14"/>
- <location filename="../QtUI/ui_QtBlockListEditorWindow.h" line="103"/>
<source>Edit Block List</source>
<translation>Blockliste bearbeiten</translation>
</message>
<message>
<location filename="../QtUI/QtBlockListEditorWindow.ui" line="35"/>
- <location filename="../QtUI/ui_QtBlockListEditorWindow.h" line="104"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p align=&quot;justify&quot;&gt;The following list shows all contacts that you have currently blocked. You can add contacts to the list at the bottom of the list and remove contacts by clicking on the right column.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p align=&quot;justify&quot;&gt;Die folgende Liste zeigt alle Kontakte, die aktuell blockiert sind. Sie können Kontakte am unteren Ende via Mausklick hinzufügen oder Kontakte von der Liste entfernen, indem Sie in die rechte Spalte klicken.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
<location filename="../QtUI/QtBlockListEditorWindow.ui" line="101"/>
- <location filename="../QtUI/ui_QtBlockListEditorWindow.h" line="107"/>
<source>Save</source>
<translation>Speichern</translation>
</message>
@@ -1509,37 +1562,31 @@
<name>QtBookmarkDetailWindow</name>
<message>
<location filename="../QtUI/QtBookmarkDetailWindow.ui" line="20"/>
- <location filename="../QtUI/ui_QtBookmarkDetailWindow.h" line="138"/>
<source>Edit Bookmark Details</source>
<translation>Lesezeichendetails editieren</translation>
</message>
<message>
<location filename="../QtUI/QtBookmarkDetailWindow.ui" line="48"/>
- <location filename="../QtUI/ui_QtBookmarkDetailWindow.h" line="139"/>
<source>Bookmark Name:</source>
<translation>Lesezeichenname:</translation>
</message>
<message>
<location filename="../QtUI/QtBookmarkDetailWindow.ui" line="58"/>
- <location filename="../QtUI/ui_QtBookmarkDetailWindow.h" line="140"/>
<source>Room Address:</source>
<translation>Chatraumadresse:</translation>
</message>
<message>
<location filename="../QtUI/QtBookmarkDetailWindow.ui" line="68"/>
- <location filename="../QtUI/ui_QtBookmarkDetailWindow.h" line="141"/>
<source>Your Nickname:</source>
<translation>Dein Nickname:</translation>
</message>
<message>
<location filename="../QtUI/QtBookmarkDetailWindow.ui" line="78"/>
- <location filename="../QtUI/ui_QtBookmarkDetailWindow.h" line="142"/>
<source>Room password:</source>
<translation>Chatraum Passwort:</translation>
</message>
<message>
<location filename="../QtUI/QtBookmarkDetailWindow.ui" line="101"/>
- <location filename="../QtUI/ui_QtBookmarkDetailWindow.h" line="143"/>
<source>Enter automatically</source>
<translation>Automatisch betreten</translation>
</message>
@@ -1548,7 +1595,6 @@
<name>QtCertificateViewerDialog</name>
<message>
<location filename="../QtUI/QtCertificateViewerDialog.ui" line="14"/>
- <location filename="../QtUI/ui_QtCertificateViewerDialog.h" line="98"/>
<source>Certificate Viewer</source>
<translation>Zertifikatsbetrachter</translation>
</message>
@@ -1557,79 +1603,66 @@
<name>QtConnectionSettings</name>
<message>
<location filename="../QtUI/QtConnectionSettings.ui" line="14"/>
- <location filename="../QtUI/ui_QtConnectionSettings.h" line="394"/>
<source>Connection Options</source>
<translation>Verbindungsoptionen</translation>
</message>
<message>
<location filename="../QtUI/QtConnectionSettings.ui" line="22"/>
- <location filename="../QtUI/ui_QtConnectionSettings.h" line="395"/>
<source>Connection Method:</source>
<translation>Verbindungsmethode:</translation>
</message>
<message>
<location filename="../QtUI/QtConnectionSettings.ui" line="36"/>
- <location filename="../QtUI/ui_QtConnectionSettings.h" line="398"/>
<source>Automatic</source>
<translation>Automatisch</translation>
</message>
<message>
<location filename="../QtUI/QtConnectionSettings.ui" line="41"/>
- <location filename="../QtUI/ui_QtConnectionSettings.h" line="399"/>
<source>Manual</source>
<translation>Manuell</translation>
</message>
<message>
<location filename="../QtUI/QtConnectionSettings.ui" line="46"/>
- <location filename="../QtUI/ui_QtConnectionSettings.h" line="400"/>
<source>BOSH</source>
<translation>BOSH</translation>
</message>
<message>
<location filename="../QtUI/QtConnectionSettings.ui" line="99"/>
- <location filename="../QtUI/ui_QtConnectionSettings.h" line="402"/>
<source>Secure connection:</source>
<translation>Sichere Verbindung:</translation>
</message>
<message>
<location filename="../QtUI/QtConnectionSettings.ui" line="107"/>
- <location filename="../QtUI/ui_QtConnectionSettings.h" line="405"/>
<source>Never</source>
<translation>Niemals</translation>
</message>
<message>
<location filename="../QtUI/QtConnectionSettings.ui" line="112"/>
- <location filename="../QtUI/ui_QtConnectionSettings.h" line="406"/>
<source>Encrypt when possible</source>
<translation>Verschlüsselung wenn möglich</translation>
</message>
<message>
<location filename="../QtUI/QtConnectionSettings.ui" line="117"/>
- <location filename="../QtUI/ui_QtConnectionSettings.h" line="407"/>
<source>Always encrypt</source>
<translation>Immer Verschlüsseln</translation>
</message>
<message>
<location filename="../QtUI/QtConnectionSettings.ui" line="127"/>
- <location filename="../QtUI/ui_QtConnectionSettings.h" line="409"/>
<source>Allow Compression</source>
<translation>Komprimierung erlaubt</translation>
</message>
<message>
<location filename="../QtUI/QtConnectionSettings.ui" line="134"/>
- <location filename="../QtUI/ui_QtConnectionSettings.h" line="410"/>
<source>Allow sending password over insecure connection</source>
<translation>Erlaube das Versenden des Passworts über unsichere Verbindungen</translation>
</message>
<message>
<location filename="../QtUI/QtConnectionSettings.ui" line="141"/>
- <location filename="../QtUI/ui_QtConnectionSettings.h" line="411"/>
<source>Limit encryption to TLS 1.0</source>
<translation>Beschränke Verschlüsselung auf TLS 1.0</translation>
</message>
<message>
<location filename="../QtUI/QtConnectionSettings.ui" line="164"/>
- <location filename="../QtUI/ui_QtConnectionSettings.h" line="412"/>
<source>Manually select server</source>
<translation>Manuelle Serverauswahl</translation>
</message>
@@ -1637,9 +1670,6 @@
<location filename="../QtUI/QtConnectionSettings.ui" line="192"/>
<location filename="../QtUI/QtConnectionSettings.ui" line="322"/>
<location filename="../QtUI/QtConnectionSettings.ui" line="436"/>
- <location filename="../QtUI/ui_QtConnectionSettings.h" line="413"/>
- <location filename="../QtUI/ui_QtConnectionSettings.h" line="425"/>
- <location filename="../QtUI/ui_QtConnectionSettings.h" line="429"/>
<source>Hostname:</source>
<translation>Hostname:</translation>
</message>
@@ -1647,69 +1677,56 @@
<location filename="../QtUI/QtConnectionSettings.ui" line="215"/>
<location filename="../QtUI/QtConnectionSettings.ui" line="345"/>
<location filename="../QtUI/QtConnectionSettings.ui" line="459"/>
- <location filename="../QtUI/ui_QtConnectionSettings.h" line="414"/>
- <location filename="../QtUI/ui_QtConnectionSettings.h" line="426"/>
- <location filename="../QtUI/ui_QtConnectionSettings.h" line="430"/>
<source>Port:</source>
<translation>Port:</translation>
</message>
<message>
<location filename="../QtUI/QtConnectionSettings.ui" line="237"/>
- <location filename="../QtUI/ui_QtConnectionSettings.h" line="415"/>
<source>Connection Proxy</source>
<translation>Verbindungsproxy</translation>
</message>
<message>
<location filename="../QtUI/QtConnectionSettings.ui" line="245"/>
- <location filename="../QtUI/ui_QtConnectionSettings.h" line="416"/>
<source>Proxy type:</source>
<translation>Proxyart:</translation>
</message>
<message>
<location filename="../QtUI/QtConnectionSettings.ui" line="256"/>
- <location filename="../QtUI/ui_QtConnectionSettings.h" line="419"/>
<source>None</source>
<translation>Kein Proxy</translation>
</message>
<message>
<location filename="../QtUI/QtConnectionSettings.ui" line="261"/>
- <location filename="../QtUI/ui_QtConnectionSettings.h" line="420"/>
<source>Use system-configured proxy</source>
<translation>Benutze System-Proxykonfiguration</translation>
</message>
<message>
<location filename="../QtUI/QtConnectionSettings.ui" line="266"/>
- <location filename="../QtUI/ui_QtConnectionSettings.h" line="421"/>
<source>SOCKS5</source>
<translation>SOCKS5</translation>
</message>
<message>
<location filename="../QtUI/QtConnectionSettings.ui" line="271"/>
- <location filename="../QtUI/ui_QtConnectionSettings.h" line="422"/>
<source>HTTP Connect</source>
<translation>HTTP Connect</translation>
</message>
<message>
<location filename="../QtUI/QtConnectionSettings.ui" line="294"/>
- <location filename="../QtUI/ui_QtConnectionSettings.h" line="424"/>
<source>Override system-configured proxy</source>
<translation>Ãœber System-Proxykonfiguration hinwegsetzen</translation>
</message>
<message>
<location filename="../QtUI/QtConnectionSettings.ui" line="389"/>
- <location filename="../QtUI/ui_QtConnectionSettings.h" line="427"/>
<source>BOSH URI:</source>
<translation>BOSH URI:</translation>
</message>
<message>
<location filename="../QtUI/QtConnectionSettings.ui" line="408"/>
- <location filename="../QtUI/ui_QtConnectionSettings.h" line="428"/>
<source>Manually select HTTP proxy</source>
<translation>Manuelle Auswahl des HTTP Proxy</translation>
</message>
<message>
<location filename="../QtUI/QtConnectionSettings.ui" line="498"/>
- <location filename="../QtUI/ui_QtConnectionSettings.h" line="431"/>
<source>Connection options will be saved when next connecting to this account.</source>
<translation>Verbindungsoptionen werden beim nächsten Verbindungsversuch zu diesem Konto gespeichert.</translation>
</message>
@@ -1806,19 +1823,19 @@
</message>
<message>
<source>No Sound</source>
- <translation type="vanished">Keinen Ton</translation>
+ <translation type="vanished">Keinen Sound</translation>
</message>
<message>
<source>Default Sound</source>
- <translation type="vanished">Standartton</translation>
+ <translation type="vanished">Standardsound</translation>
</message>
<message>
<source>Custom Sound</source>
- <translation type="vanished">Benutzerdefinierter Ton</translation>
+ <translation type="vanished">Benutzerdefinierter Sound</translation>
</message>
<message>
<source>...</source>
- <translation type="vanished">Ton auswählen…</translation>
+ <translation type="vanished">Sound auswählen…</translation>
</message>
</context>
<context>
@@ -1832,147 +1849,118 @@
<name>QtHighlightNotificationConfigDialog</name>
<message>
<location filename="../QtUI/QtHighlightNotificationConfigDialog.ui" line="14"/>
- <location filename="../QtUI/ui_QtHighlightNotificationConfigDialog.h" line="305"/>
<source>Highlight and Notification Configuration</source>
<translation>Hervorhebungs- und Benachrichtigungseinstellungen</translation>
</message>
<message>
<location filename="../QtUI/QtHighlightNotificationConfigDialog.ui" line="26"/>
- <location filename="../QtUI/ui_QtHighlightNotificationConfigDialog.h" line="306"/>
<source>Highlight messages from these people</source>
<translation>Nachrichten von folgenden Personen hervorheben</translation>
</message>
<message>
<location filename="../QtUI/QtHighlightNotificationConfigDialog.ui" line="87"/>
- <location filename="../QtUI/ui_QtHighlightNotificationConfigDialog.h" line="312"/>
<source>Nickname</source>
- <translation>Spitzname</translation>
+ <translation>Nickname</translation>
</message>
<message>
<location filename="../QtUI/QtHighlightNotificationConfigDialog.ui" line="92"/>
<location filename="../QtUI/QtHighlightNotificationConfigDialog.ui" line="258"/>
- <location filename="../QtUI/ui_QtHighlightNotificationConfigDialog.h" line="311"/>
- <location filename="../QtUI/ui_QtHighlightNotificationConfigDialog.h" line="320"/>
<source>Text color</source>
<translation>Textfarbe</translation>
</message>
<message>
<location filename="../QtUI/QtHighlightNotificationConfigDialog.ui" line="97"/>
<location filename="../QtUI/QtHighlightNotificationConfigDialog.ui" line="263"/>
- <location filename="../QtUI/ui_QtHighlightNotificationConfigDialog.h" line="310"/>
- <location filename="../QtUI/ui_QtHighlightNotificationConfigDialog.h" line="319"/>
<source>Background color</source>
<translation>Hintergrundfrabe</translation>
</message>
<message>
<location filename="../QtUI/QtHighlightNotificationConfigDialog.ui" line="102"/>
<location filename="../QtUI/QtHighlightNotificationConfigDialog.ui" line="268"/>
- <location filename="../QtUI/ui_QtHighlightNotificationConfigDialog.h" line="309"/>
- <location filename="../QtUI/ui_QtHighlightNotificationConfigDialog.h" line="318"/>
<source>Play sound</source>
<translation>Sound abspielen</translation>
</message>
<message>
<location filename="../QtUI/QtHighlightNotificationConfigDialog.ui" line="107"/>
<location filename="../QtUI/QtHighlightNotificationConfigDialog.ui" line="273"/>
- <location filename="../QtUI/ui_QtHighlightNotificationConfigDialog.h" line="308"/>
- <location filename="../QtUI/ui_QtHighlightNotificationConfigDialog.h" line="317"/>
<source>Create notification</source>
<translation>Benachrichtigung erstellen</translation>
</message>
<message>
<location filename="../QtUI/QtHighlightNotificationConfigDialog.ui" line="158"/>
<location filename="../QtUI/QtHighlightNotificationConfigDialog.ui" line="295"/>
- <location filename="../QtUI/ui_QtHighlightNotificationConfigDialog.h" line="313"/>
- <location filename="../QtUI/ui_QtHighlightNotificationConfigDialog.h" line="323"/>
<source>+</source>
<translation>+</translation>
</message>
<message>
<location filename="../QtUI/QtHighlightNotificationConfigDialog.ui" line="174"/>
<location filename="../QtUI/QtHighlightNotificationConfigDialog.ui" line="311"/>
- <location filename="../QtUI/ui_QtHighlightNotificationConfigDialog.h" line="314"/>
- <location filename="../QtUI/ui_QtHighlightNotificationConfigDialog.h" line="324"/>
<source>-</source>
<translation>-</translation>
</message>
<message>
<location filename="../QtUI/QtHighlightNotificationConfigDialog.ui" line="199"/>
- <location filename="../QtUI/ui_QtHighlightNotificationConfigDialog.h" line="315"/>
<source>Highlight messages containing these keywords</source>
<translation>Nachrichten hervorheben die folgende Schlüsselwörter enthalten</translation>
</message>
<message>
<location filename="../QtUI/QtHighlightNotificationConfigDialog.ui" line="248"/>
- <location filename="../QtUI/ui_QtHighlightNotificationConfigDialog.h" line="322"/>
<source>Keyword</source>
<translation>Schlüsselwort</translation>
</message>
<message>
<location filename="../QtUI/QtHighlightNotificationConfigDialog.ui" line="253"/>
- <location filename="../QtUI/ui_QtHighlightNotificationConfigDialog.h" line="321"/>
<source>Match case sensitive</source>
<translation>Groß-/Kleinschreibung beachten</translation>
</message>
<message>
<location filename="../QtUI/QtHighlightNotificationConfigDialog.ui" line="336"/>
- <location filename="../QtUI/ui_QtHighlightNotificationConfigDialog.h" line="325"/>
<source>General notification settings</source>
<translation>Globale Benachrichtigungseinstellungen</translation>
</message>
<message>
<location filename="../QtUI/QtHighlightNotificationConfigDialog.ui" line="350"/>
<location filename="../QtUI/QtHighlightNotificationConfigDialog.ui" line="435"/>
- <location filename="../QtUI/ui_QtHighlightNotificationConfigDialog.h" line="326"/>
- <location filename="../QtUI/ui_QtHighlightNotificationConfigDialog.h" line="334"/>
<source>...</source>
<translation>...</translation>
</message>
<message>
<location filename="../QtUI/QtHighlightNotificationConfigDialog.ui" line="357"/>
- <location filename="../QtUI/ui_QtHighlightNotificationConfigDialog.h" line="327"/>
<source>Highlight background color on own mention</source>
<translation>Hintergrundfarbe hervorheben wen Sie selber erwähnt wurden</translation>
</message>
<message>
<location filename="../QtUI/QtHighlightNotificationConfigDialog.ui" line="379"/>
- <location filename="../QtUI/ui_QtHighlightNotificationConfigDialog.h" line="328"/>
<source>Create notification on incoming group messages</source>
<translation>Benachrichtigen wenn eine Gruppennachricht eintrifft</translation>
</message>
<message>
<location filename="../QtUI/QtHighlightNotificationConfigDialog.ui" line="386"/>
- <location filename="../QtUI/ui_QtHighlightNotificationConfigDialog.h" line="329"/>
<source>Create notification when my name is mentioned</source>
<translation>Benachrichtigen wenn dein Name erwähnt wurde</translation>
</message>
<message>
<location filename="../QtUI/QtHighlightNotificationConfigDialog.ui" line="393"/>
- <location filename="../QtUI/ui_QtHighlightNotificationConfigDialog.h" line="330"/>
<source>Play sound on incoming direct messages</source>
<translation>Bei einkommenden direkten Nachrichten Sound abspielen</translation>
</message>
<message>
<location filename="../QtUI/QtHighlightNotificationConfigDialog.ui" line="400"/>
- <location filename="../QtUI/ui_QtHighlightNotificationConfigDialog.h" line="331"/>
<source>Play sound on incoming group messages</source>
<translation>Bei einkommenden Gruppennachrichten Sound abspielen</translation>
</message>
<message>
<location filename="../QtUI/QtHighlightNotificationConfigDialog.ui" line="407"/>
- <location filename="../QtUI/ui_QtHighlightNotificationConfigDialog.h" line="332"/>
<source>Create notification on incoming direct messages</source>
<translation>Benachrichtigen wenn eine direkte Nachricht eintrifft</translation>
</message>
<message>
<location filename="../QtUI/QtHighlightNotificationConfigDialog.ui" line="414"/>
- <location filename="../QtUI/ui_QtHighlightNotificationConfigDialog.h" line="333"/>
<source>Play sound when my name is mentioned</source>
<translation>Sound abspielen wenn dein Name erwähnt wurde</translation>
</message>
<message>
<location filename="../QtUI/QtHighlightNotificationConfigDialog.ui" line="442"/>
- <location filename="../QtUI/ui_QtHighlightNotificationConfigDialog.h" line="335"/>
<source>Highlight text color on own mention</source>
<translation>Textfarbe hervorheben wen Sie selber erwähnt wurden</translation>
</message>
@@ -1981,25 +1969,21 @@
<name>QtHistoryWindow</name>
<message>
<location filename="../QtUI/QtHistoryWindow.ui" line="14"/>
- <location filename="../QtUI/ui_QtHistoryWindow.h" line="132"/>
<source>History</source>
<translation>Verlauf</translation>
</message>
<message>
<location filename="../QtUI/QtHistoryWindow.ui" line="22"/>
- <location filename="../QtUI/ui_QtHistoryWindow.h" line="133"/>
<source>Search:</source>
<translation>Suche:</translation>
</message>
<message>
<location filename="../QtUI/QtHistoryWindow.ui" line="42"/>
- <location filename="../QtUI/ui_QtHistoryWindow.h" line="134"/>
<source>Next</source>
<translation>Weiter</translation>
</message>
<message>
<location filename="../QtUI/QtHistoryWindow.ui" line="52"/>
- <location filename="../QtUI/ui_QtHistoryWindow.h" line="135"/>
<source>Previous</source>
<translation>Zurück</translation>
</message>
@@ -2009,44 +1993,36 @@
<message>
<location filename="../QtUI/QtJoinMUCWindow.ui" line="20"/>
<location filename="../QtUI/QtJoinMUCWindow.ui" line="113"/>
- <location filename="../QtUI/ui_QtJoinMUCWindow.h" line="143"/>
- <location filename="../QtUI/ui_QtJoinMUCWindow.h" line="151"/>
<source>Enter Room</source>
<translation>Chatraum betreten</translation>
</message>
<message>
<location filename="../QtUI/QtJoinMUCWindow.ui" line="28"/>
- <location filename="../QtUI/ui_QtJoinMUCWindow.h" line="144"/>
<source>Room Address:</source>
<translation>Chatraumadresse:</translation>
</message>
<message>
<location filename="../QtUI/QtJoinMUCWindow.ui" line="42"/>
- <location filename="../QtUI/ui_QtJoinMUCWindow.h" line="146"/>
<source>Your Nickname:</source>
<translation>Dein Nickname:</translation>
</message>
<message>
<location filename="../QtUI/QtJoinMUCWindow.ui" line="56"/>
- <location filename="../QtUI/ui_QtJoinMUCWindow.h" line="148"/>
<source>Room Password:</source>
<translation>Chatraum Passwort:</translation>
</message>
<message>
<location filename="../QtUI/QtJoinMUCWindow.ui" line="71"/>
- <location filename="../QtUI/ui_QtJoinMUCWindow.h" line="149"/>
<source>Automatically configure newly created rooms</source>
<translation>Automatisch Konfigurieren bei Betreten</translation>
</message>
<message>
<location filename="../QtUI/QtJoinMUCWindow.ui" line="35"/>
- <location filename="../QtUI/ui_QtJoinMUCWindow.h" line="145"/>
<source>Search ...</source>
<translation>Suchen ...</translation>
</message>
<message>
<location filename="../QtUI/QtJoinMUCWindow.ui" line="106"/>
- <location filename="../QtUI/ui_QtJoinMUCWindow.h" line="150"/>
<source>Enter automatically in future</source>
<translation>In Zukunft automatisch eintreten</translation>
</message>
@@ -2055,37 +2031,31 @@
<name>QtMUCSearchWindow</name>
<message>
<location filename="../QtUI/MUCSearch/QtMUCSearchWindow.ui" line="14"/>
- <location filename="../QtUI/MUCSearch/ui_QtMUCSearchWindow.h" line="123"/>
<source>Search Room</source>
<translation>Chatraum suchen</translation>
</message>
<message>
<location filename="../QtUI/MUCSearch/QtMUCSearchWindow.ui" line="33"/>
- <location filename="../QtUI/MUCSearch/ui_QtMUCSearchWindow.h" line="124"/>
<source>Service:</source>
<translation>Service:</translation>
</message>
<message>
<location filename="../QtUI/MUCSearch/QtMUCSearchWindow.ui" line="55"/>
- <location filename="../QtUI/MUCSearch/ui_QtMUCSearchWindow.h" line="125"/>
<source>Cancel</source>
<translation>Abbrechen</translation>
</message>
<message>
<location filename="../QtUI/MUCSearch/QtMUCSearchWindow.ui" line="96"/>
- <location filename="../QtUI/MUCSearch/ui_QtMUCSearchWindow.h" line="129"/>
<source>List rooms</source>
<translation>Chaträume auflisten</translation>
</message>
<message>
<location filename="../QtUI/MUCSearch/QtMUCSearchWindow.ui" line="106"/>
- <location filename="../QtUI/MUCSearch/ui_QtMUCSearchWindow.h" line="130"/>
<source>Search for</source>
<translation>Suche nach</translation>
</message>
<message>
<location filename="../QtUI/MUCSearch/QtMUCSearchWindow.ui" line="65"/>
- <location filename="../QtUI/MUCSearch/ui_QtMUCSearchWindow.h" line="126"/>
<source>OK</source>
<translation>Ok</translation>
</message>
@@ -2094,21 +2064,17 @@
<name>QtProfileWindow</name>
<message>
<location filename="../QtUI/QtProfileWindow.ui" line="14"/>
- <location filename="../QtUI/ui_QtProfileWindow.h" line="104"/>
<source>Edit Profile</source>
<translation>Profil editieren</translation>
</message>
<message>
<location filename="../QtUI/QtProfileWindow.ui" line="26"/>
<location filename="../QtUI/QtProfileWindow.ui" line="36"/>
- <location filename="../QtUI/ui_QtProfileWindow.h" line="105"/>
- <location filename="../QtUI/ui_QtProfileWindow.h" line="106"/>
<source>TextLabel</source>
<translation>Textbezeichnung</translation>
</message>
<message>
<location filename="../QtUI/QtProfileWindow.ui" line="84"/>
- <location filename="../QtUI/ui_QtProfileWindow.h" line="109"/>
<source>Save</source>
<translation>Speichern</translation>
</message>
@@ -2117,13 +2083,11 @@
<name>QtSpellCheckerWindow</name>
<message>
<location filename="../QtUI/QtSpellCheckerWindow.ui" line="14"/>
- <location filename="../QtUI/ui_QtSpellCheckerWindow.h" line="100"/>
<source>Dialog</source>
<translation>Dialog</translation>
</message>
<message>
<location filename="../QtUI/QtSpellCheckerWindow.ui" line="20"/>
- <location filename="../QtUI/ui_QtSpellCheckerWindow.h" line="101"/>
<source>Spell Checker Enabled</source>
<translation>Rechtschreibprüfung aktiviert</translation>
</message>
@@ -2141,19 +2105,16 @@
</message>
<message>
<location filename="../QtUI/QtSpellCheckerWindow.ui" line="32"/>
- <location filename="../QtUI/ui_QtSpellCheckerWindow.h" line="102"/>
<source>Language:</source>
<translation>Sprache:</translation>
</message>
<message>
<location filename="../QtUI/QtSpellCheckerWindow.ui" line="53"/>
- <location filename="../QtUI/ui_QtSpellCheckerWindow.h" line="103"/>
<source>Cancel</source>
<translation>Abbrechen</translation>
</message>
<message>
<location filename="../QtUI/QtSpellCheckerWindow.ui" line="60"/>
- <location filename="../QtUI/ui_QtSpellCheckerWindow.h" line="104"/>
<source>Apply</source>
<translation>Anwenden</translation>
</message>
@@ -2162,43 +2123,36 @@
<name>QtUpdateFeedSelectionDialog</name>
<message>
<location filename="../QtUI/QtUpdateFeedSelectionDialog.ui" line="14"/>
- <location filename="../QtUI/ui_QtUpdateFeedSelectionDialog.h" line="96"/>
<source>Select Update Channel</source>
<translation>Update Kanal auswählen</translation>
</message>
<message>
<location filename="../QtUI/QtUpdateFeedSelectionDialog.ui" line="27"/>
- <location filename="../QtUI/ui_QtUpdateFeedSelectionDialog.h" line="97"/>
<source>Stable Channel</source>
<translation>Kanal für stabile Versionen</translation>
</message>
<message>
<location filename="../QtUI/QtUpdateFeedSelectionDialog.ui" line="35"/>
- <location filename="../QtUI/ui_QtUpdateFeedSelectionDialog.h" line="98"/>
<source>Testing Channel</source>
<translation>Kanal für Testversionen</translation>
</message>
<message>
<location filename="../QtUI/QtUpdateFeedSelectionDialog.ui" line="43"/>
- <location filename="../QtUI/ui_QtUpdateFeedSelectionDialog.h" line="99"/>
<source>Development Channel</source>
<translation>Kanal für Entwicklungsversionen</translation>
</message>
<message>
<location filename="../QtUI/QtUpdateFeedSelectionDialog.ui" line="54"/>
- <location filename="../QtUI/ui_QtUpdateFeedSelectionDialog.h" line="102"/>
<source>This release channel includes our stable releases. They went throught internal QA testing and had previous RC releases to find critical bugs.</source>
<translation>Dieser Freigabekanal enthält die stabilen Freigaben. Diese Freigaben sind durchliefen interne QA-Tests und hatten vorangegangen RC-Freigaben um kritische Fehler zu finden.</translation>
</message>
<message>
<location filename="../QtUI/QtUpdateFeedSelectionDialog.ui" line="76"/>
- <location filename="../QtUI/ui_QtUpdateFeedSelectionDialog.h" line="103"/>
<source>This release channel includes our stable releases, beta releases and release candidates. They should be free from obvious bugs and are released for wider testing to find more obscure bugs.</source>
<translation>Dieser Freigabekanal enthält die stabilen Releases, Beta Releases und Releasekandidaten. Diese Freigaben sollten frei von offensichtlichen Fehlern sein und werden freigegeben um größeren Testrahmen zu erreichen und mehr obskure Fehler zu finden.</translation>
</message>
<message>
<location filename="../QtUI/QtUpdateFeedSelectionDialog.ui" line="89"/>
- <location filename="../QtUI/ui_QtUpdateFeedSelectionDialog.h" line="104"/>
<source>This release channel includes our stable releases, beta releases, release candidates and development releases. The development releases are not thoroughly tested and might contain bugs.</source>
<translation>Dieser Freigabekanal enthält die stabilen Releases, Beta Releases, Releasekandidaten und Entwicklungsreleases. Die Entwicklungsreleases sind nicht wirklich getest und können Fehler enthalten.</translation>
</message>
@@ -2314,7 +2268,6 @@
<name>QtUserSearchWizard</name>
<message>
<location filename="../QtUI/UserSearch/QtUserSearchWizard.ui" line="14"/>
- <location filename="../QtUI/UserSearch/ui_QtUserSearchWizard.h" line="38"/>
<source>Find User</source>
<translation>Benutzer finden</translation>
</message>
@@ -2633,57 +2586,57 @@
</message>
<message>
<location filename="../QtUI/QtCertificateViewerDialog.cpp" line="110"/>
- <location filename="../QtUI/QtCertificateViewerDialog.cpp" line="138"/>
+ <location filename="../QtUI/QtCertificateViewerDialog.cpp" line="136"/>
<source>Organization</source>
<translation>Organisation</translation>
</message>
<message>
<location filename="../QtUI/QtCertificateViewerDialog.cpp" line="111"/>
- <location filename="../QtUI/QtCertificateViewerDialog.cpp" line="139"/>
+ <location filename="../QtUI/QtCertificateViewerDialog.cpp" line="137"/>
<source>Common Name</source>
<translation>Gemeiner Name</translation>
</message>
<message>
<location filename="../QtUI/QtCertificateViewerDialog.cpp" line="112"/>
- <location filename="../QtUI/QtCertificateViewerDialog.cpp" line="140"/>
+ <location filename="../QtUI/QtCertificateViewerDialog.cpp" line="138"/>
<source>Locality</source>
<translation>Lokalität</translation>
</message>
<message>
<location filename="../QtUI/QtCertificateViewerDialog.cpp" line="113"/>
- <location filename="../QtUI/QtCertificateViewerDialog.cpp" line="141"/>
+ <location filename="../QtUI/QtCertificateViewerDialog.cpp" line="139"/>
<source>Organizational Unit</source>
<translation>Unternehmensabteilung</translation>
</message>
<message>
<location filename="../QtUI/QtCertificateViewerDialog.cpp" line="114"/>
- <location filename="../QtUI/QtCertificateViewerDialog.cpp" line="142"/>
+ <location filename="../QtUI/QtCertificateViewerDialog.cpp" line="140"/>
<source>Country</source>
<translation>Land</translation>
</message>
<message>
<location filename="../QtUI/QtCertificateViewerDialog.cpp" line="115"/>
- <location filename="../QtUI/QtCertificateViewerDialog.cpp" line="143"/>
+ <location filename="../QtUI/QtCertificateViewerDialog.cpp" line="141"/>
<source>State</source>
<translation>Land</translation>
</message>
<message>
- <location filename="../QtUI/QtCertificateViewerDialog.cpp" line="125"/>
+ <location filename="../QtUI/QtCertificateViewerDialog.cpp" line="123"/>
<source>Alternate Subject Names</source>
<translation>Alternativer Subjektname</translation>
</message>
<message>
- <location filename="../QtUI/QtCertificateViewerDialog.cpp" line="129"/>
+ <location filename="../QtUI/QtCertificateViewerDialog.cpp" line="127"/>
<source>E-mail Address</source>
<translation>E-Mail Adresse</translation>
</message>
<message>
- <location filename="../QtUI/QtCertificateViewerDialog.cpp" line="131"/>
+ <location filename="../QtUI/QtCertificateViewerDialog.cpp" line="129"/>
<source>DNS Name</source>
<translation>DNS Name</translation>
</message>
<message>
- <location filename="../QtUI/QtCertificateViewerDialog.cpp" line="137"/>
+ <location filename="../QtUI/QtCertificateViewerDialog.cpp" line="135"/>
<source>Issuer</source>
<translation>Herausgeber</translation>
</message>
@@ -2733,9 +2686,8 @@
<translation>&amp;Anordnung ändern</translation>
</message>
<message>
- <location filename="../QtUI/QtChatTabs.cpp" line="116"/>
<source>Ctrl+Alt+L</source>
- <translation>Ctrl+Alt+L</translation>
+ <translation type="vanished">Ctrl+Alt+L</translation>
</message>
<message>
<location filename="../QtUI/QtChatTabs.cpp" line="120"/>
@@ -3602,7 +3554,7 @@
<location filename="../QtUI/QtSoundSelectionStyledItemDelegate.cpp" line="44"/>
<location filename="../QtUI/QtSoundSelectionStyledItemDelegate.cpp" line="69"/>
<source>Default sound</source>
- <translation>Default Sound</translation>
+ <translation>Standardsound</translation>
</message>
</context>
<context>
@@ -3679,12 +3631,12 @@
<context>
<name>Swift::QtSwift</name>
<message>
- <location filename="../QtUI/QtSwift.cpp" line="363"/>
+ <location filename="../QtUI/QtSwift.cpp" line="374"/>
<source>Swift Update Available</source>
<translation>Swift Update verfügbar</translation>
</message>
<message>
- <location filename="../QtUI/QtSwift.cpp" line="363"/>
+ <location filename="../QtUI/QtSwift.cpp" line="374"/>
<source>Restart Swift to update to the new Swift version.</source>
<translation>Swift muss neugestartet werden damit das Update installiert werden kann.</translation>
</message>
@@ -3692,25 +3644,28 @@
<context>
<name>Swift::QtTabWidget</name>
<message>
- <location filename="../QtUI/QtTabWidget.cpp" line="60"/>
<source>This empty cell is a placeholder for chat windows. You can move existing chats to this cell by dragging the tab over here. You can change the number of cells via the &apos;Change layout&apos; dialog under the &apos;View&apos; menu or by using the %1 shortcut.</source>
- <translation>Diese leere Zelle ist ein Platzhalter für Chatfenster. Sie können bestehende Chatfenster zu dieser Zelle bewegen indem Sie das Tab hierher ziehen. Sie können die Anzahl von Zellen anhand des &quot;Anordnung ändern&quot; Dialogs im Menü &quot;Ansicht&quot; ändern oder indem Sie die Tastenkombination %1 nutzen.</translation>
+ <translation type="vanished">Diese leere Zelle ist ein Platzhalter für Chatfenster. Sie können bestehende Chatfenster zu dieser Zelle bewegen indem Sie das Tab hierher ziehen. Sie können die Anzahl von Zellen anhand des &quot;Anordnung ändern&quot; Dialogs im Menü &quot;Ansicht&quot; ändern oder indem Sie die Tastenkombination %1 nutzen.</translation>
</message>
<message>
- <location filename="../QtUI/QtTabWidget.cpp" line="60"/>
<source>Ctrl+Alt+L</source>
- <translation>Ctrl+Alt+L</translation>
+ <translation type="vanished">Ctrl+Alt+L</translation>
+ </message>
+ <message>
+ <location filename="../QtUI/QtTabWidget.cpp" line="60"/>
+ <source>This empty cell is a placeholder for chat windows. You can move existing chats to this cell by dragging the tab over here. You can change the number of cells via the &apos;Change layout&apos; dialog under the &apos;View&apos; menu.</source>
+ <translation>Diese leere Zelle ist ein Platzhalter für Chatfenster. Sie können bestehende Chatfenster zu dieser Zelle bewegen indem Sie das Tab hierher ziehen. Sie können die Anzahl von Zellen anhand des &quot;Anordnung ändern&quot; Dialogs im Menü &quot;Ansicht&quot; ändern.</translation>
</message>
</context>
<context>
<name>Swift::QtTextEdit</name>
<message>
- <location filename="../QtUI/QtTextEdit.cpp" line="164"/>
+ <location filename="../QtUI/QtTextEdit.cpp" line="166"/>
<source>Spell Checker Options</source>
<translation>Rechtschreibprüfungsoptionen</translation>
</message>
<message>
- <location filename="../QtUI/QtTextEdit.cpp" line="209"/>
+ <location filename="../QtUI/QtTextEdit.cpp" line="211"/>
<source>No Suggestions</source>
<translation>Keine Korrekturempfehlungen</translation>
</message>
diff --git a/Swift/Translations/swift_nl.ts b/Swift/Translations/swift_nl.ts
index 2686e5e..7b37e72 100644
--- a/Swift/Translations/swift_nl.ts
+++ b/Swift/Translations/swift_nl.ts
@@ -32,10 +32,6 @@
<translation>%1% is nu bezet</translation>
</message>
<message>
- <source>The day is now %1%</source>
- <translation>De huidige dag is nu %1%</translation>
- </message>
- <message>
<source>Error sending message</source>
<translation>Fout tijdens het versturen van bericht</translation>
</message>
@@ -540,10 +536,6 @@
<translation>%1% heeft de %2% betreden.</translation>
</message>
<message>
- <source>%1%</source>
- <translation>%1%</translation>
- </message>
- <message>
<source>You&apos;ve blocked this room. To enter the room, first unblock it using the cog menu and try again</source>
<translation>U heeft deze kamer geblokkeerd. Om de kamer te betreden moet u deze eerst deblokkeren met behulp van het tandradmenu, en het dan opnieuw proberen</translation>
</message>
@@ -608,10 +600,6 @@
<translation>Deze server ondersteunt het delen van echte identiteiten in deze conversatie niet.</translation>
</message>
<message>
- <source>Empty Chat</source>
- <translation>Lege conversatie</translation>
- </message>
- <message>
<source>This contact is already on your contact list.</source>
<translation>Dit contact staat al op uw contactenlijst.</translation>
</message>
@@ -655,6 +643,38 @@
<source>Outcast</source>
<translation>Verstoteling</translation>
</message>
+ <message>
+ <source>This user could not be found in the room.</source>
+ <translation>De gebruiker kan niet worden gevonden in deze kamer.</translation>
+ </message>
+ <message>
+ <source>The room subject has been removed</source>
+ <translation>Het onderwerp van deze kamer is verwijderd</translation>
+ </message>
+ <message>
+ <source>%1% says</source>
+ <translation>%1% zegt</translation>
+ </message>
+ <message>
+ <source>%1% in %2% says</source>
+ <translation>%1% in %2% zegt</translation>
+ </message>
+ <message>
+ <source>%1% mentioned you in %2%</source>
+ <translation>%1% heeft u genoemd in %2%</translation>
+ </message>
+ <message>
+ <source>%1% mentioned &apos;%2%&apos;</source>
+ <translation>%1% heeft &apos;%2%&apos; genoemd</translation>
+ </message>
+ <message>
+ <source>There was an error fetching your current profile data</source>
+ <translation>Er is een fout opgetreden bij het ophalen van uw profielgegevens</translation>
+ </message>
+ <message>
+ <source>Failed to retrieve recent profile for user.</source>
+ <translation>Ophalen van recente profielgegevens is mislukt.</translation>
+ </message>
</context>
<context>
<name>CloseButton</name>
@@ -695,12 +715,7 @@
</message>
</context>
<context>
- <name>QGuiApplication</name>
- <message>
- <source>QT_LAYOUT_DIRECTION</source>
- <comment>Translate this to LTR for left-to-right or RTL for right-to-left languages</comment>
- <translation>LTR</translation>
- </message>
+ <name>QApplication</name>
<message>
<source>QT_LAYOUT_DIRECTION</source>
<translation>LTR</translation>
@@ -734,6 +749,18 @@
</message>
</context>
<context>
+ <name>QGuiApplication</name>
+ <message>
+ <source>QT_LAYOUT_DIRECTION</source>
+ <comment>Translate this to LTR for left-to-right or RTL for right-to-left languages</comment>
+ <translation>LTR</translation>
+ </message>
+ <message>
+ <source>QT_LAYOUT_DIRECTION</source>
+ <translation>LTR</translation>
+ </message>
+</context>
+<context>
<name>QLineEdit</name>
<message>
<source>Select All</source>
@@ -951,6 +978,21 @@
</message>
</context>
<context>
+ <name>QPlatformTheme</name>
+ <message>
+ <source>OK</source>
+ <translation>OK</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation>Annuleren</translation>
+ </message>
+ <message>
+ <source>Restore Defaults</source>
+ <translation>Standaardintellingen</translation>
+ </message>
+</context>
+<context>
<name>QScrollBar</name>
<message>
<source>Scroll here</source>
@@ -1056,6 +1098,37 @@
</message>
</context>
<context>
+ <name>QWidgetTextControl</name>
+ <message>
+ <source>Select All</source>
+ <translation>Alles selecteren</translation>
+ </message>
+ <message>
+ <source>&amp;Undo</source>
+ <translation>&amp;Herstel</translation>
+ </message>
+ <message>
+ <source>&amp;Redo</source>
+ <translation>&amp;Opnieuw</translation>
+ </message>
+ <message>
+ <source>Cu&amp;t</source>
+ <translation>&amp;Knip</translation>
+ </message>
+ <message>
+ <source>&amp;Copy</source>
+ <translation>&amp;Kopieer</translation>
+ </message>
+ <message>
+ <source>&amp;Paste</source>
+ <translation>&amp;Plak</translation>
+ </message>
+ <message>
+ <source>Delete</source>
+ <translation>Verwijder</translation>
+ </message>
+</context>
+<context>
<name>QWizard</name>
<message>
<source>&lt; &amp;Back</source>
@@ -1202,7 +1275,7 @@
</message>
<message>
<source>Manual</source>
- <translation>Manueel</translation>
+ <translation>Handmatig</translation>
</message>
<message>
<source>BOSH</source>
@@ -1234,7 +1307,7 @@
</message>
<message>
<source>Manually select server</source>
- <translation>Manuele serverselectie</translation>
+ <translation>Handmatige serverselectie</translation>
</message>
<message>
<source>Hostname:</source>
@@ -1278,7 +1351,7 @@
</message>
<message>
<source>Manually select HTTP proxy</source>
- <translation>Selecteer HTTP proxy manueel</translation>
+ <translation>Selecteer HTTP proxy handmatig</translation>
</message>
<message>
<source>Connection Options</source>
@@ -1401,34 +1474,94 @@
</message>
</context>
<context>
- <name>QtHighlightEditorWidget</name>
+ <name>QtHighlightNotificationConfigDialog</name>
<message>
- <source>Form</source>
- <translation>Formulier</translation>
+ <source>Highlight and Notification Configuration</source>
+ <translation>Markeer- en meldingsinstellingen</translation>
</message>
<message>
- <source>Incoming messages are checked against the following rules. First rule that matches will be executed.</source>
- <translation>Inkomende berichten worden gecontrolleerd aan de hand van de volgende regels. De eerst overeenkomende regel wordt uitgevoerd.</translation>
+ <source>Highlight messages from these people</source>
+ <translation>Markeer berichten van deze mensen</translation>
</message>
<message>
- <source>New</source>
- <translation>Nieuw</translation>
+ <source>Nickname</source>
+ <translation>Roepnaam</translation>
</message>
<message>
- <source>Delete</source>
- <translation>Verwijder</translation>
+ <source>Text color</source>
+ <translation>Tekstkleur</translation>
</message>
<message>
- <source>Move up</source>
- <translation>Verplaats omhoog</translation>
+ <source>Background color</source>
+ <translation>Achtergrondkleur</translation>
</message>
<message>
- <source>Move down</source>
- <translation>Verplaats omlaag</translation>
+ <source>Play sound</source>
+ <translation>Speel geluid</translation>
</message>
<message>
- <source>Close</source>
- <translation>Sluit tab</translation>
+ <source>Create notification</source>
+ <translation>Melding</translation>
+ </message>
+ <message>
+ <source>+</source>
+ <translation>+</translation>
+ </message>
+ <message>
+ <source>-</source>
+ <translation>-</translation>
+ </message>
+ <message>
+ <source>Highlight messages containing these keywords</source>
+ <translation>Markeer berichten die deze sleutelwoorden bevatten</translation>
+ </message>
+ <message>
+ <source>Keyword</source>
+ <translation>Sleutelwoord</translation>
+ </message>
+ <message>
+ <source>Match case sensitive</source>
+ <translation>Identieke hoofdletters/kleine letters</translation>
+ </message>
+ <message>
+ <source>General notification settings</source>
+ <translation>Algemene meldingsinstellingen</translation>
+ </message>
+ <message>
+ <source>...</source>
+ <translation>...</translation>
+ </message>
+ <message>
+ <source>Highlight background color on own mention</source>
+ <translation>Achtergrondkleur van vermeldingen van mijn naam</translation>
+ </message>
+ <message>
+ <source>Create notification on incoming group messages</source>
+ <translation>Melding bij binnenkomende berichten uit een kamer</translation>
+ </message>
+ <message>
+ <source>Create notification when my name is mentioned</source>
+ <translation>Melding wanneer mijn naam genoemd wordt</translation>
+ </message>
+ <message>
+ <source>Play sound on incoming direct messages</source>
+ <translation>Speel geluid bij binnenkomende directe berichten</translation>
+ </message>
+ <message>
+ <source>Play sound on incoming group messages</source>
+ <translation>Speel geluid bij binnenkomende groepsgesprekken</translation>
+ </message>
+ <message>
+ <source>Create notification on incoming direct messages</source>
+ <translation>Melding bij binnenkomende directe berichten</translation>
+ </message>
+ <message>
+ <source>Play sound when my name is mentioned</source>
+ <translation>Speel geluid wanneer mijn naam genoemd wordt</translation>
+ </message>
+ <message>
+ <source>Highlight text color on own mention</source>
+ <translation>Tekstkleur van vermeldingen van mijn naam</translation>
</message>
</context>
<context>
@@ -1503,6 +1636,10 @@
<source>OK</source>
<translation>OK</translation>
</message>
+ <message>
+ <source>Search for</source>
+ <translation>Zoek naar</translation>
+ </message>
</context>
<context>
<name>QtProfileWindow</name>
@@ -1530,18 +1667,6 @@
<translation>Spellingscontrole ingeschakeld</translation>
</message>
<message>
- <source>Dictionary Path:</source>
- <translation>Pad woordenboek:</translation>
- </message>
- <message>
- <source>Change</source>
- <translation>Wijzig</translation>
- </message>
- <message>
- <source>Current Language:</source>
- <translation>Huidige taal:</translation>
- </message>
- <message>
<source>Language:</source>
<translation>Taal:</translation>
</message>
@@ -1555,6 +1680,37 @@
</message>
</context>
<context>
+ <name>QtUpdateFeedSelectionDialog</name>
+ <message>
+ <source>Select Update Channel</source>
+ <translation>Kies updatekanaal</translation>
+ </message>
+ <message>
+ <source>Stable Channel</source>
+ <translation>Stabiel kanaal</translation>
+ </message>
+ <message>
+ <source>Testing Channel</source>
+ <translation>Testkanaal</translation>
+ </message>
+ <message>
+ <source>Development Channel</source>
+ <translation>Ontwikkelkanaal</translation>
+ </message>
+ <message>
+ <source>This release channel includes our stable releases. They went throught internal QA testing and had previous RC releases to find critical bugs.</source>
+ <translation>Dit kanaal bevat onze stabiele versies. Deze hebben uitgebreide interne kwaliteitscontrole gehad, en hebben testversies gehad om kritische fouten te vinden.</translation>
+ </message>
+ <message>
+ <source>This release channel includes our stable releases, beta releases and release candidates. They should be free from obvious bugs and are released for wider testing to find more obscure bugs.</source>
+ <translation>Dit kanaal bevat onze stabiele versies, betaversies en release candidates. Deze versies zouden vrij moeten zijn van opvallende fouten en worden verspreidt om minder opvallende fouten te vinden.</translation>
+ </message>
+ <message>
+ <source>This release channel includes our stable releases, beta releases, release candidates and development releases. The development releases are not thoroughly tested and might contain bugs.</source>
+ <translation>Dit kanaal bevat onze stabiele versies, betaversies, release candidates en ontwikkelversies. De ontwikkelversies zijn niet uitvoerig getest en kunnen fouten bevatten.</translation>
+ </message>
+</context>
+<context>
<name>QtUserSearchFieldsPage</name>
<message>
<source>Nickname:</source>
@@ -1738,6 +1894,46 @@
<source>Close</source>
<translation>Sluiten</translation>
</message>
+ <message>
+ <source>View Changes</source>
+ <translation>Belijk Wijzigingen</translation>
+ </message>
+ <message>
+ <source>You are receiving updates from the Stable update channel.</source>
+ <translation>U ontvangt updates vanuit het stabiele updatekanaal.</translation>
+ </message>
+ <message>
+ <source>You are receiving updates from the Development update channel.</source>
+ <translation>U ontvangt updates vanuit het ontwikkelupdatekanaal.</translation>
+ </message>
+ <message>
+ <source>You are receiving updates from the Testing update channel.</source>
+ <translation>U ontvangt updates vanuit het testupdatekanaal.</translation>
+ </message>
+ <message>
+ <source>Change the update channel.</source>
+ <translation>Wijzig het updatekanaal.</translation>
+ </message>
+ <message>
+ <source>Checking for updates…</source>
+ <translation>Controlleren op updates…</translation>
+ </message>
+ <message>
+ <source>Error checking for updates!</source>
+ <translation>Fout tijdens het controlleren op updates!</translation>
+ </message>
+ <message>
+ <source>Swift is up to date.</source>
+ <translation>Swift is up-to-date.</translation>
+ </message>
+ <message>
+ <source>Downloading update…</source>
+ <translation>Update aan het downloaden…</translation>
+ </message>
+ <message>
+ <source>Update will be installed when you next restart Swift.</source>
+ <translation>De update wordt geinstalleerd wanneer u Swift herstart.</translation>
+ </message>
</context>
<context>
<name>Swift::QtAdHocCommandWindow</name>
@@ -1941,10 +2137,6 @@ afbeelding</translation>
<translation>Wijzig &amp;opmaak</translation>
</message>
<message>
- <source>Ctrl+Alt+L</source>
- <translation>Ctrl+Alt+L</translation>
- </message>
- <message>
<source>Move Tab right</source>
<translation>Verplaats tab naar rechts</translation>
</message>
@@ -2063,6 +2255,10 @@ afbeelding</translation>
<source>Edit bookmark...</source>
<translation>Bewerk bladwijzer...</translation>
</message>
+ <message>
+ <source>The day is now %1</source>
+ <translation>De huidige dag is nu %1</translation>
+ </message>
</context>
<context>
<name>Swift::QtConnectionSettingsWindow</name>
@@ -2118,6 +2314,13 @@ afbeelding</translation>
</message>
</context>
<context>
+ <name>Swift::QtEmojisSelector</name>
+ <message>
+ <source>Recent</source>
+ <translation>Recent</translation>
+ </message>
+</context>
+<context>
<name>Swift::QtEventWindow</name>
<message>
<source>Display Notice</source>
@@ -2136,108 +2339,10 @@ afbeelding</translation>
</message>
</context>
<context>
- <name>Swift::QtHighlightEditor</name>
- <message>
- <source>Highlight Rules</source>
- <translation>Markeerregels</translation>
- </message>
- <message>
- <source>Apply to all chat messages</source>
- <translation>Pas toe op alle berichten in conversaties</translation>
- </message>
- <message>
- <source>Apply to all room messages</source>
- <translation>Pas toe op alle berichten in kamers</translation>
- </message>
- <message>
- <source>Select sound file...</source>
- <translation>Selecteer geluidsbestand...</translation>
- </message>
-</context>
-<context>
- <name>Swift::QtHighlightEditorWidget</name>
- <message>
- <source>Highlight Rules</source>
- <translation>Markeerregels</translation>
- </message>
-</context>
-<context>
- <name>Swift::QtHighlightRulesItemModel</name>
- <message>
- <source>Apply to</source>
- <translation>Pas toe op</translation>
- </message>
+ <name>Swift::QtGridSelectionDialog</name>
<message>
- <source>Sender</source>
- <translation>Afzender</translation>
- </message>
- <message>
- <source>Keyword</source>
- <translation>Sleutelwoord</translation>
- </message>
- <message>
- <source>Action</source>
- <translation>Actie</translation>
- </message>
- <message>
- <source>Nick Is Keyword</source>
- <translation>Roepnaam is sleutelwoord</translation>
- </message>
- <message>
- <source>Match Case</source>
- <translation>Identieke hoofdletters/kleine letters</translation>
- </message>
- <message>
- <source>Match Whole Words</source>
- <translation>Heel woord</translation>
- </message>
- <message>
- <source>Highlight Text</source>
- <translation>Markeer tekst</translation>
- </message>
- <message>
- <source>Text Color</source>
- <translation>Voorgrondkleur</translation>
- </message>
- <message>
- <source>Text Background</source>
- <translation>Achtergrondkleur</translation>
- </message>
- <message>
- <source>Play Sounds</source>
- <translation>Speel geluid</translation>
- </message>
- <message>
- <source>Sound File</source>
- <translation>Geluidsbestand</translation>
- </message>
- <message>
- <source>&lt;nick&gt;</source>
- <translation>&lt;roepnaam&gt;</translation>
- </message>
- <message>
- <source>Highlight text</source>
- <translation>Markeer tekst</translation>
- </message>
- <message>
- <source>Play sound</source>
- <translation>Speel geluid</translation>
- </message>
- <message>
- <source>None</source>
- <translation>Geen</translation>
- </message>
- <message>
- <source>Chat or MUC</source>
- <translation>Conversatie of kamer</translation>
- </message>
- <message>
- <source>Chat</source>
- <translation>Conversatie</translation>
- </message>
- <message>
- <source>MUC</source>
- <translation>Kamer</translation>
+ <source>Select the number of rows and columns for your layout. You can change the size by moving the mouse or cursor keys.</source>
+ <translation>Kies het aantal rijen en kolommen voor uw opmaak. U kunt de grootte wijzigen met de muis of met de pijltjestoetsen.</translation>
</message>
</context>
<context>
@@ -2572,35 +2677,35 @@ afbeelding</translation>
<name>Swift::QtPlainChatView</name>
<message>
<source>Chat Messages</source>
- <translation type="unfinished"></translation>
+ <translation>Berichten</translation>
</message>
<message>
<source>At %1 %2 said:</source>
- <translation type="unfinished"></translation>
+ <translation>Om %1 zei %2:</translation>
</message>
<message>
<source>At %1 &lt;i&gt;%2 </source>
- <translation type="unfinished"></translation>
+ <translation>Om %1 &lt;i&gt;%2</translation>
</message>
<message>
<source>At %1 %2 corrected the last message to:</source>
- <translation type="unfinished"></translation>
+ <translation>Om %1 corrigeerde %2 het laatste bericht naar:</translation>
</message>
<message>
<source>At %1 %2 corrected the last action to: &lt;i&gt;</source>
- <translation type="unfinished"></translation>
+ <translation>Om %1 corrigeerde %2 de laatste actie naar: &lt;i&gt;</translation>
</message>
<message>
<source>File transfer description</source>
- <translation type="unfinished">Beschrijving bestand</translation>
+ <translation>Beschrijving bestand</translation>
</message>
<message>
<source>Description:</source>
- <translation type="unfinished">Beschrijving:</translation>
+ <translation>Beschrijving:</translation>
</message>
<message>
<source>Save File</source>
- <translation type="unfinished">Bestand opslaan</translation>
+ <translation>Bestand opslaan</translation>
</message>
</context>
<context>
@@ -2695,18 +2800,14 @@ afbeelding</translation>
</message>
</context>
<context>
- <name>Swift::QtSpellCheckerWindow</name>
- <message>
- <source>Dictionary Path</source>
- <translation>Pad woordenboek</translation>
- </message>
+ <name>Swift::QtSoundSelectionStyledItemDelegate</name>
<message>
- <source>Select Personal Dictionary</source>
- <translation>Kies persoonlijk woordenboek</translation>
+ <source>No sound</source>
+ <translation>Geen geluid</translation>
</message>
<message>
- <source>(*.dic</source>
- <translation>(*.dic</translation>
+ <source>Default sound</source>
+ <translation>Standaardgeluid</translation>
</message>
</context>
<context>
@@ -2756,6 +2857,24 @@ afbeelding</translation>
</message>
</context>
<context>
+ <name>Swift::QtSwift</name>
+ <message>
+ <source>Swift Update Available</source>
+ <translation>Swift-update beschikbaar</translation>
+ </message>
+ <message>
+ <source>Restart Swift to update to the new Swift version.</source>
+ <translation>Herstart Swift om bij te werken naar de nieuwe versie.</translation>
+ </message>
+</context>
+<context>
+ <name>Swift::QtTabWidget</name>
+ <message>
+ <source>This empty cell is a placeholder for chat windows. You can move existing chats to this cell by dragging the tab over here. You can change the number of cells via the &apos;Change layout&apos; dialog under the &apos;View&apos; menu.</source>
+ <translation>Dit lege vak is vulling voor berichtenschermen. U kunt bestaande gesprekken naar dit vak verplaatsen door het tabje hier heen te slepen. U kunt het aantal vakken veranderen door middel van het &apos;Wijzig opmaak&apos;-scherm in het &apos;Beeld&apos;-menu.</translation>
+ </message>
+</context>
+<context>
<name>Swift::QtTextEdit</name>
<message>
<source>Spell Checker Options</source>
@@ -3028,7 +3147,7 @@ afbeelding</translation>
</message>
<message>
<source>0118 999 881 999 119 7253</source>
- <translation></translation>
+ <translation>0118 999 881 999 119 7253</translation>
</message>
</context>
<context>
@@ -3253,7 +3372,7 @@ afbeelding</translation>
<message>
<source>TRANSLATION_LICENSE</source>
<comment>This string contains the license under which this translation is licensed. We ask you to license the translation under the BSD license. Please read http://www.opensource.org/licenses/bsd-license.php, and if you agree to release your translation under this license, use the following (untranslated) text: &apos;This translation is licensed under the BSD License. See http://www.opensource.org/licenses/bsd-license.php&apos;</comment>
- <translation>This translation is licensed under the GNU General Public License v3. See Documentation/Licenses/GPLv3.txt for more information</translation>
+ <translation>This translation is licensed under the BSD License. See http://www.opensource.org/licenses/bsd-license.php</translation>
</message>
</context>
</TS>
diff --git a/Swift/resources/themes/Default/Noto/LICENSE b/Swift/resources/themes/Default/Noto/LICENSE
new file mode 100644
index 0000000..d952d62
--- /dev/null
+++ b/Swift/resources/themes/Default/Noto/LICENSE
@@ -0,0 +1,92 @@
+This Font Software is licensed under the SIL Open Font License,
+Version 1.1.
+
+This license is copied below, and is also available with a FAQ at:
+http://scripts.sil.org/OFL
+
+-----------------------------------------------------------
+SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
+-----------------------------------------------------------
+
+PREAMBLE
+The goals of the Open Font License (OFL) are to stimulate worldwide
+development of collaborative font projects, to support the font
+creation efforts of academic and linguistic communities, and to
+provide a free and open framework in which fonts may be shared and
+improved in partnership with others.
+
+The OFL allows the licensed fonts to be used, studied, modified and
+redistributed freely as long as they are not sold by themselves. The
+fonts, including any derivative works, can be bundled, embedded,
+redistributed and/or sold with any software provided that any reserved
+names are not used by derivative works. The fonts and derivatives,
+however, cannot be released under any other type of license. The
+requirement for fonts to remain under this license does not apply to
+any document created using the fonts or their derivatives.
+
+DEFINITIONS
+"Font Software" refers to the set of files released by the Copyright
+Holder(s) under this license and clearly marked as such. This may
+include source files, build scripts and documentation.
+
+"Reserved Font Name" refers to any names specified as such after the
+copyright statement(s).
+
+"Original Version" refers to the collection of Font Software
+components as distributed by the Copyright Holder(s).
+
+"Modified Version" refers to any derivative made by adding to,
+deleting, or substituting -- in part or in whole -- any of the
+components of the Original Version, by changing formats or by porting
+the Font Software to a new environment.
+
+"Author" refers to any designer, engineer, programmer, technical
+writer or other person who contributed to the Font Software.
+
+PERMISSION & CONDITIONS
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of the Font Software, to use, study, copy, merge, embed,
+modify, redistribute, and sell modified and unmodified copies of the
+Font Software, subject to the following conditions:
+
+1) Neither the Font Software nor any of its individual components, in
+Original or Modified Versions, may be sold by itself.
+
+2) Original or Modified Versions of the Font Software may be bundled,
+redistributed and/or sold with any software, provided that each copy
+contains the above copyright notice and this license. These can be
+included either as stand-alone text files, human-readable headers or
+in the appropriate machine-readable metadata fields within text or
+binary files as long as those fields can be easily viewed by the user.
+
+3) No Modified Version of the Font Software may use the Reserved Font
+Name(s) unless explicit written permission is granted by the
+corresponding Copyright Holder. This restriction only applies to the
+primary font name as presented to the users.
+
+4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
+Software shall not be used to promote, endorse or advertise any
+Modified Version, except to acknowledge the contribution(s) of the
+Copyright Holder(s) and the Author(s) or with their explicit written
+permission.
+
+5) The Font Software, modified or unmodified, in part or in whole,
+must be distributed entirely under this license, and must not be
+distributed under any other license. The requirement for fonts to
+remain under this license does not apply to any document created using
+the Font Software.
+
+TERMINATION
+This license becomes null and void if any of the above conditions are
+not met.
+
+DISCLAIMER
+THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
+OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
+COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
+DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
+OTHER DEALINGS IN THE FONT SOFTWARE.
diff --git a/Swift/resources/themes/Default/Noto/NotoColorEmoji.ttf b/Swift/resources/themes/Default/Noto/NotoColorEmoji.ttf
new file mode 100644
index 0000000..9d82f52
--- /dev/null
+++ b/Swift/resources/themes/Default/Noto/NotoColorEmoji.ttf
Binary files differ
diff --git a/Swift/resources/themes/Default/main.css b/Swift/resources/themes/Default/main.css
index 2fe7374..aa3d92d 100644
--- a/Swift/resources/themes/Default/main.css
+++ b/Swift/resources/themes/Default/main.css
@@ -1,7 +1,7 @@
/* Chat Window Container */
body {
- font-family: 'Lato', sans-serif;
+ font-family: 'Lato', 'apple color emoji', 'notocoloremoji', sans-serif;
margin: 0;
padding: 0;
}
@@ -234,3 +234,47 @@ div.time {
span.swift_receipt > img {
height: 12px;
}
+
+.resendButton {
+}
+
+.popup {
+ position: relative;
+ display: inline-block;
+ cursor: pointer;
+ user-select: none;
+}
+
+/* The actual popup */
+.popup .popuptext {
+ visibility: hidden;
+ width: 50px;
+ background-color: #6eb6ce;
+ color: #fff;
+ text-align: center;
+ border-radius: 6px;
+ padding: 8px 0;
+ position: absolute;
+ z-index: 1;
+ bottom: 125%;
+ left: 50%;
+ margin-left: -25px;
+}
+
+/* Popup arrow */
+.popup .popuptext::after {
+ content: "";
+ position: absolute;
+ top: 100%;
+ left: 50%;
+ margin-left: -5px;
+ border-width: 5px;
+ border-style: solid;
+ border-color: #6eb6ce transparent transparent transparent;
+}
+
+/* Toggle this class - hide and show the popup */
+.popup .show {
+ visibility: visible;
+ animation: fadeIn 1s;
+}
diff --git a/Swiften/Avatars/CombinedAvatarProvider.cpp b/Swiften/Avatars/CombinedAvatarProvider.cpp
index 465512f..ba6e6be 100644
--- a/Swiften/Avatars/CombinedAvatarProvider.cpp
+++ b/Swiften/Avatars/CombinedAvatarProvider.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2019 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -39,17 +39,17 @@ void CombinedAvatarProvider::handleAvatarChanged(const JID& jid) {
}
boost::optional<std::string> newHash = getCombinedAvatarAndCache(jid);
if (newHash != oldHash) {
- SWIFT_LOG(debug) << "Avatar changed: " << jid << ": " << oldHash << " -> " << (newHash ? newHash.get() : "NULL") << std::endl;
+ SWIFT_LOG(debug) << "Avatar changed: " << jid << ": " << oldHash << " -> " << (newHash ? newHash.get() : "NULL");
onAvatarChanged(jid);
}
}
boost::optional<std::string> CombinedAvatarProvider::getCombinedAvatarAndCache(const JID& jid) const {
- SWIFT_LOG(debug) << "JID: " << jid << std::endl;
+ SWIFT_LOG(debug) << "JID: " << jid;
boost::optional<std::string> hash;
for (size_t i = 0; i < providers.size() && !hash; ++i) {
hash = providers[i]->getAvatarHash(jid);
- SWIFT_LOG(debug) << "Provider " << providers[i] << ": " << (hash ? hash.get() : "NULL") << std::endl;
+ SWIFT_LOG(debug) << "Provider " << providers[i] << ": " << (hash ? hash.get() : "NULL");
}
if (hash) {
avatars[jid] = *hash;
diff --git a/Swiften/Avatars/UnitTest/AvatarManagerImplTest.cpp b/Swiften/Avatars/UnitTest/AvatarManagerImplTest.cpp
index 241f375..5a35410 100644
--- a/Swiften/Avatars/UnitTest/AvatarManagerImplTest.cpp
+++ b/Swiften/Avatars/UnitTest/AvatarManagerImplTest.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2014-2016 Isode Limited.
+ * Copyright (c) 2014-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -91,6 +91,7 @@ class AvatarManagerImplTest : public CppUnit::TestFixture {
/* send new presence to notify of blank avatar */
vcardUpdate = std::make_shared<VCardUpdate>();
+ vcardUpdate->setPhotoHash("da39a3ee5e6b4b0d3255bfef95601890afd80709");
presence = std::make_shared<Presence>();
presence->setTo(ownerJID);
presence->setFrom(personJID);
diff --git a/Swiften/Avatars/VCardUpdateAvatarManager.cpp b/Swiften/Avatars/VCardUpdateAvatarManager.cpp
index 3e8d87b..d04c13c 100644
--- a/Swiften/Avatars/VCardUpdateAvatarManager.cpp
+++ b/Swiften/Avatars/VCardUpdateAvatarManager.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2019 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -32,10 +32,14 @@ void VCardUpdateAvatarManager::handlePresenceReceived(std::shared_ptr<Presence>
return;
}
JID from = getAvatarJID(presence->getFrom());
+ if (update->getPhotoHash().size() != 40) {
+ SWIFT_LOG(debug) << "Invalid vCard avatar photo hash length. Must be hex-encoded SHA-1, i.e. 40 characters.";
+ return;
+ }
if (getAvatarHash(from) == update->getPhotoHash()) {
return;
}
- SWIFT_LOG(debug) << "Updated hash: " << from << " -> " << update->getPhotoHash() << std::endl;
+ SWIFT_LOG(debug) << "Updated hash: " << from << " -> " << update->getPhotoHash();
if (avatarStorage_->hasAvatar(update->getPhotoHash())) {
setAvatarHash(from, update->getPhotoHash());
}
@@ -46,7 +50,7 @@ void VCardUpdateAvatarManager::handlePresenceReceived(std::shared_ptr<Presence>
void VCardUpdateAvatarManager::handleVCardChanged(const JID& from, VCard::ref vCard) {
if (!vCard) {
- SWIFT_LOG(debug) << "Missing element: " << from << ": null vcard payload" << std::endl;
+ SWIFT_LOG(debug) << "Missing element: " << from << ": null vcard payload";
return;
}
@@ -63,7 +67,7 @@ void VCardUpdateAvatarManager::handleVCardChanged(const JID& from, VCard::ref vC
}
void VCardUpdateAvatarManager::setAvatarHash(const JID& from, const std::string& hash) {
- SWIFT_LOG(debug) << "Updating hash: " << from << " -> " << hash << std::endl;
+ SWIFT_LOG(debug) << "Updating hash: " << from << " -> " << hash;
avatarHashes_[from] = hash;
onAvatarChanged(from);
}
diff --git a/Swiften/Base/Algorithm.h b/Swiften/Base/Algorithm.h
index 108dbe3..ee761b7 100644
--- a/Swiften/Base/Algorithm.h
+++ b/Swiften/Base/Algorithm.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2011-2014 Isode Limited.
+ * Copyright (c) 2011-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -160,4 +160,28 @@ namespace Swift {
return lhs.size() == rhs.size() && std::equal(lhs.begin(), lhs.end(), rhs.begin(), pred);
}
+
+ /**
+ * Ranges
+ */
+ template <typename T>
+ class range_t {
+ public:
+ range_t(T b, T e) : b_(b), e_(e) {}
+
+ T begin() {
+ return b_;
+ }
+ T end() {
+ return e_;
+ }
+ private:
+ T b_;
+ T e_;
+ };
+
+ template <typename T>
+ range_t<T> range(T b, T e) {
+ return range_t<T>(b, e);
+ }
}
diff --git a/Swiften/Base/DateTime.cpp b/Swiften/Base/DateTime.cpp
index 4443566..23b3b84 100644
--- a/Swiften/Base/DateTime.cpp
+++ b/Swiften/Base/DateTime.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2011-2016 Isode Limited.
+ * Copyright (c) 2011-2019 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -40,7 +40,7 @@ std::string dateTimeToLocalString(const boost::posix_time::ptime& time) {
localString = boost::posix_time::to_simple_string(boost::date_time::c_local_adjustor<boost::posix_time::ptime>::utc_to_local(time));
}
catch(std::out_of_range& exception) {
- SWIFT_LOG(debug) << exception.what() << std::endl;
+ SWIFT_LOG(debug) << exception.what();
}
return localString;
}
diff --git a/Swiften/Base/Log.cpp b/Swiften/Base/Log.cpp
index 0efac7e..b6f1851 100644
--- a/Swiften/Base/Log.cpp
+++ b/Swiften/Base/Log.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010-2015 Isode Limited.
+ * Copyright (c) 2010-2019 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -16,6 +16,8 @@
namespace Swift {
static Log::Severity logLevel = Log::warning;
+std::unique_ptr<FILE, Log::LogFileClose> Log::logfile;
+Log::Callback Log::logCallback;
Log::Log() {
}
@@ -25,18 +27,38 @@ Log::~Log() {
__android_log_print(ANDROID_LOG_VERBOSE, "Swift", stream.str().c_str(), 1);
#else
// Using stdio for thread safety (POSIX file i/o calls are guaranteed to be atomic)
- fprintf(stderr, "%s", stream.str().c_str());
- fflush(stderr);
+ if (logCallback) {
+ logCallback(severity_, std::move(file_), line_, std::move(function_), stream.str());
+ }
+ else {
+ stream << std::endl;
+ if (logfile) {
+ fwrite(stream.str().c_str(), sizeof(char), stream.str().size(), logfile.get());
+ fflush(logfile.get());
+ }
+ else {
+ fwrite(stream.str().c_str(), sizeof(char), stream.str().size(), stderr);
+ fflush(stderr);
+ }
+ }
#endif
}
std::ostringstream& Log::getStream(
- Severity /*severity*/,
- const std::string& severityString,
- const std::string& file,
+ Severity severity,
+ std::string severityString,
+ std::string file,
int line,
- const std::string& function) {
- stream << "[" << severityString << "] " << file << ":" << line << " " << function << ": ";
+ std::string function) {
+ if (logCallback) {
+ severity_ = severity;
+ file_ = std::move(file);
+ line_ = line;
+ function_ = std::move(function);
+ }
+ else {
+ stream << "[" << severityString << "] " << file << ":" << line << " " << function << ": ";
+ }
return stream;
}
@@ -48,4 +70,14 @@ void Log::setLogLevel(Severity level) {
logLevel = level;
}
+void Log::setLogFile(const std::string& fileName) {
+ if (!fileName.empty()) {
+ logfile = std::unique_ptr<FILE, Log::LogFileClose>(fopen(fileName.c_str(), "a"));
+ }
+}
+
+void Log::setLogCallback(Callback callback) {
+ Log::logCallback = callback;
+}
+
}
diff --git a/Swiften/Base/Log.h b/Swiften/Base/Log.h
index 33c969d..255e478 100644
--- a/Swiften/Base/Log.h
+++ b/Swiften/Base/Log.h
@@ -6,6 +6,9 @@
#pragma once
+#include <cstdio>
+#include <functional>
+#include <memory>
#include <sstream>
#include <Swiften/Base/API.h>
@@ -16,22 +19,38 @@ namespace Swift {
enum Severity {
error, warning, info, debug
};
+ using Callback = std::function<void(Severity severity, std::string file, int line, std::string function, std::string message)>;
Log();
~Log();
std::ostringstream& getStream(
Severity severity,
- const std::string& severityString,
- const std::string& file,
+ std::string severityString,
+ std::string file,
int line,
- const std::string& function);
+ std::string function);
static Severity getLogLevel();
static void setLogLevel(Severity level);
+ static void setLogFile(const std::string& fileName);
+ static void setLogCallback(Callback callback);
private:
+ struct LogFileClose {
+ void operator()(FILE* p) {
+ if (p) {
+ fclose(p);
+ }
+ }
+ };
std::ostringstream stream;
+ static std::unique_ptr<FILE, LogFileClose> logfile;
+ static Callback logCallback;
+ Severity severity_;
+ std::string file_;
+ int line_;
+ std::string function_;
};
}
diff --git a/Swiften/Base/Platform.h b/Swiften/Base/Platform.h
index 4deba2b..22dff30 100644
--- a/Swiften/Base/Platform.h
+++ b/Swiften/Base/Platform.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010 Isode Limited.
+ * Copyright (c) 2010-2019 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -43,9 +43,9 @@
#endif
// Endianness
-#include <boost/detail/endian.hpp>
-#if defined(BOOST_LITTLE_ENDIAN)
+#include <boost/predef/other/endian.h>
+#if defined(BOOST_ENDIAN_LITTLE_BYTE)
#define SWIFTEN_LITTLE_ENDIAN
-#elif defined(BOOST_BIG_ENDIAN)
+#elif defined(BOOST_ENDIAN_BIG_BYTE)
#define SWIFTEN_BIG_ENDIAN
#endif
diff --git a/Swiften/Base/URL.cpp b/Swiften/Base/URL.cpp
index 4a47a11..5c0f0d7 100644
--- a/Swiften/Base/URL.cpp
+++ b/Swiften/Base/URL.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -11,7 +11,7 @@
namespace Swift {
-int URL::getPortOrDefaultPort(const URL& url) {
+unsigned short URL::getPortOrDefaultPort(const URL& url) {
if (url.getPort()) {
return *url.getPort();
}
@@ -62,7 +62,7 @@ URL URL::fromString(const std::string& urlString) {
}
std::string host;
- boost::optional<int> port;
+ boost::optional<unsigned short> port;
if (hostAndPort[0] == '[') {
// handle IPv6 address literals
size_t addressEndIndex = hostAndPort.find(']');
@@ -71,9 +71,9 @@ URL URL::fromString(const std::string& urlString) {
colonIndex = hostAndPort.find(':', addressEndIndex);
if (colonIndex != std::string::npos) {
try {
- port = boost::lexical_cast<int>(hostAndPort.substr(colonIndex + 1));
+ port = boost::numeric_cast<unsigned short>(boost::lexical_cast<int>(hostAndPort.substr(colonIndex + 1)));
}
- catch (const boost::bad_lexical_cast&) {
+ catch (...) {
return URL();
}
}
@@ -87,7 +87,7 @@ URL URL::fromString(const std::string& urlString) {
if (colonIndex != std::string::npos) {
host = unescape(hostAndPort.substr(0, colonIndex));
try {
- port = boost::lexical_cast<int>(hostAndPort.substr(colonIndex + 1));
+ port = boost::numeric_cast<unsigned short>(boost::lexical_cast<int>(hostAndPort.substr(colonIndex + 1)));
}
catch (const boost::bad_lexical_cast&) {
return URL();
@@ -132,7 +132,7 @@ std::string URL::toString() const {
}
if (port) {
result += ":";
- result += boost::lexical_cast<std::string>(*port);
+ result += std::to_string(*port);
}
result += path;
return result;
diff --git a/Swiften/Base/URL.h b/Swiften/Base/URL.h
index 1a03efe..8fdb018 100644
--- a/Swiften/Base/URL.h
+++ b/Swiften/Base/URL.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2011-2016 Isode Limited.
+ * Copyright (c) 2011-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -21,7 +21,7 @@ class SWIFTEN_API URL {
URL() : scheme(""), user(""), password(""), host(""), path(""), empty(true) {
}
- URL(const std::string& scheme, const std::string& host, int port, const std::string& path) : scheme(scheme), user(), password(), host(host), port(port), path(path), empty(false) {
+ URL(const std::string& scheme, const std::string& host, unsigned short port, const std::string& path) : scheme(scheme), user(), password(), host(host), port(port), path(path), empty(false) {
}
URL(const std::string& scheme, const std::string& host, const std::string& path) : scheme(scheme), user(), password(), host(host), path(path), empty(false) {
@@ -51,7 +51,7 @@ class SWIFTEN_API URL {
/**
* Port number
*/
- boost::optional<int> getPort() const {
+ boost::optional<unsigned short> getPort() const {
return port;
}
@@ -64,7 +64,7 @@ class SWIFTEN_API URL {
std::string toString() const;
- static int getPortOrDefaultPort(const URL& url);
+ static unsigned short getPortOrDefaultPort(const URL& url);
static URL fromString(const std::string&);
static std::string unescape(const std::string&);
@@ -74,7 +74,7 @@ class SWIFTEN_API URL {
std::string user;
std::string password;
std::string host;
- boost::optional<int> port;
+ boost::optional<unsigned short> port;
std::string path;
bool empty;
};
diff --git a/Swiften/Base/UnitTest/LogTest.cpp b/Swiften/Base/UnitTest/LogTest.cpp
new file mode 100644
index 0000000..5d710db
--- /dev/null
+++ b/Swiften/Base/UnitTest/LogTest.cpp
@@ -0,0 +1,49 @@
+/*
+ * Copyright (c) 2019 Isode Limited.
+ * All rights reserved.
+ * See the COPYING file for more information.
+ */
+
+#include <vector>
+
+#include <boost/algorithm/string/predicate.hpp>
+
+#include <gtest/gtest.h>
+
+#include <Swiften/Base/Log.h>
+
+using namespace Swift;
+
+struct LogEntry {
+ LogEntry(Log::Severity severity, std::string file, int line, std::string function, std::string message) : severity(severity), file(std::move(file)), line(line), function(std::move(function)), message(std::move(message)) {}
+
+ Log::Severity severity;
+ std::string file;
+ int line;
+ std::string function;
+ std::string message;
+};
+
+// Helper class to set the logging callback. Using this class to set it will ensure the
+// logCallback is reset to empty (its default state) after each test.
+class LogCallbackSetter {
+public:
+ LogCallbackSetter(Log::Callback callback) {
+ Log::setLogCallback(callback);
+ }
+ ~LogCallbackSetter() {
+ Log::setLogCallback({});
+ }
+};
+
+TEST(LogTest, testCallback) {
+ std::vector<LogEntry> logEntries;
+ LogCallbackSetter callbackSetter = {[&](Log::Severity severity, const std::string& file, int line, const std::string& function, const std::string& message) {
+ logEntries.emplace_back(severity, file, line, function, message);
+ }};
+
+ SWIFT_LOG(error) << "An error";
+ ASSERT_EQ(1, logEntries.size());
+ ASSERT_EQ(Log::error, logEntries[0].severity);
+ ASSERT_EQ("An error", logEntries[0].message);
+}
diff --git a/Swiften/Base/UnitTest/URLTest.cpp b/Swiften/Base/UnitTest/URLTest.cpp
index c38398a..da9f15c 100644
--- a/Swiften/Base/UnitTest/URLTest.cpp
+++ b/Swiften/Base/UnitTest/URLTest.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012-2016 Isode Limited.
+ * Copyright (c) 2012-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -66,7 +66,7 @@ class URLTest : public CppUnit::TestFixture {
CPPUNIT_ASSERT_EQUAL(std::string("http"), url.getScheme());
CPPUNIT_ASSERT_EQUAL(std::string("foo.bar"), url.getHost());
- CPPUNIT_ASSERT_EQUAL(1234, *url.getPort());
+ CPPUNIT_ASSERT_EQUAL(static_cast<unsigned short>(1234), *url.getPort());
CPPUNIT_ASSERT_EQUAL(std::string("/baz/bam"), url.getPath());
}
@@ -75,7 +75,7 @@ class URLTest : public CppUnit::TestFixture {
CPPUNIT_ASSERT_EQUAL(std::string("http"), url.getScheme());
CPPUNIT_ASSERT_EQUAL(std::string("foo.bar"), url.getHost());
- CPPUNIT_ASSERT_EQUAL(11440, *url.getPort());
+ CPPUNIT_ASSERT_EQUAL(static_cast<unsigned short>(11440), *url.getPort());
CPPUNIT_ASSERT_EQUAL(std::string("/http-bind/"), url.getPath());
}
@@ -84,7 +84,7 @@ class URLTest : public CppUnit::TestFixture {
CPPUNIT_ASSERT_EQUAL(std::string("http"), url.getScheme());
CPPUNIT_ASSERT_EQUAL(std::string("foo.bar"), url.getHost());
- CPPUNIT_ASSERT_EQUAL(1234, *url.getPort());
+ CPPUNIT_ASSERT_EQUAL(static_cast<unsigned short>(1234), *url.getPort());
CPPUNIT_ASSERT_EQUAL(std::string(""), url.getPath());
}
@@ -121,7 +121,7 @@ class URLTest : public CppUnit::TestFixture {
CPPUNIT_ASSERT_EQUAL(std::string("http"), url.getScheme());
CPPUNIT_ASSERT_EQUAL(std::string("127.0.0.1"), url.getHost());
- CPPUNIT_ASSERT_EQUAL(12345, url.getPort().get_value_or(0));
+ CPPUNIT_ASSERT_EQUAL(static_cast<unsigned short>(12345), url.getPort().get_value_or(0));
CPPUNIT_ASSERT_EQUAL(std::string("/foobar"), url.getPath());
}
@@ -137,7 +137,7 @@ class URLTest : public CppUnit::TestFixture {
CPPUNIT_ASSERT_EQUAL(std::string("http"), url.getScheme());
CPPUNIT_ASSERT_EQUAL(std::string("fdf8:f53b:82e4::53"), url.getHost());
- CPPUNIT_ASSERT_EQUAL(12435, url.getPort().get_value_or(0));
+ CPPUNIT_ASSERT_EQUAL(static_cast<unsigned short>(12435), url.getPort().get_value_or(0));
}
void test_FromString_ToString_IPv6RFC2732() {
@@ -147,7 +147,7 @@ class URLTest : public CppUnit::TestFixture {
CPPUNIT_ASSERT_EQUAL(std::string("http"), url.getScheme());
CPPUNIT_ASSERT_EQUAL(std::string("FEDC:BA98:7654:3210:FEDC:BA98:7654:3210"), url.getHost());
- CPPUNIT_ASSERT_EQUAL(80, url.getPort().get_value_or(2));
+ CPPUNIT_ASSERT_EQUAL(static_cast<unsigned short>(80), url.getPort().get_value_or(2));
CPPUNIT_ASSERT_EQUAL(std::string("/index.html"), url.getPath());
CPPUNIT_ASSERT_EQUAL(std::string(testVector), url.toString());
@@ -159,7 +159,7 @@ class URLTest : public CppUnit::TestFixture {
CPPUNIT_ASSERT_EQUAL(std::string("http"), url.getScheme());
CPPUNIT_ASSERT_EQUAL(std::string("1080:0:0:0:8:800:200C:417A"), url.getHost());
- CPPUNIT_ASSERT_EQUAL(2, url.getPort().get_value_or(2));
+ CPPUNIT_ASSERT_EQUAL(static_cast<unsigned short>(2), url.getPort().get_value_or(2));
CPPUNIT_ASSERT_EQUAL(std::string("/index.html"), url.getPath());
CPPUNIT_ASSERT_EQUAL(std::string(testVector), url.toString());
@@ -171,7 +171,7 @@ class URLTest : public CppUnit::TestFixture {
CPPUNIT_ASSERT_EQUAL(std::string("http"), url.getScheme());
CPPUNIT_ASSERT_EQUAL(std::string("3ffe:2a00:100:7031::1"), url.getHost());
- CPPUNIT_ASSERT_EQUAL(2, url.getPort().get_value_or(2));
+ CPPUNIT_ASSERT_EQUAL(static_cast<unsigned short>(2), url.getPort().get_value_or(2));
CPPUNIT_ASSERT_EQUAL(std::string(""), url.getPath());
CPPUNIT_ASSERT_EQUAL(std::string(testVector), url.toString());
@@ -183,7 +183,7 @@ class URLTest : public CppUnit::TestFixture {
CPPUNIT_ASSERT_EQUAL(std::string("http"), url.getScheme());
CPPUNIT_ASSERT_EQUAL(std::string("1080::8:800:200C:417A"), url.getHost());
- CPPUNIT_ASSERT_EQUAL(2, url.getPort().get_value_or(2));
+ CPPUNIT_ASSERT_EQUAL(static_cast<unsigned short>(2), url.getPort().get_value_or(2));
CPPUNIT_ASSERT_EQUAL(std::string("/foo"), url.getPath());
CPPUNIT_ASSERT_EQUAL(std::string(testVector), url.toString());
@@ -195,7 +195,7 @@ class URLTest : public CppUnit::TestFixture {
CPPUNIT_ASSERT_EQUAL(std::string("http"), url.getScheme());
CPPUNIT_ASSERT_EQUAL(std::string("::192.9.5.5"), url.getHost());
- CPPUNIT_ASSERT_EQUAL(2, url.getPort().get_value_or(2));
+ CPPUNIT_ASSERT_EQUAL(static_cast<unsigned short>(2), url.getPort().get_value_or(2));
CPPUNIT_ASSERT_EQUAL(std::string("/ipng"), url.getPath());
CPPUNIT_ASSERT_EQUAL(std::string(testVector), url.toString());
@@ -207,7 +207,7 @@ class URLTest : public CppUnit::TestFixture {
CPPUNIT_ASSERT_EQUAL(std::string("http"), url.getScheme());
CPPUNIT_ASSERT_EQUAL(std::string("::FFFF:129.144.52.38"), url.getHost());
- CPPUNIT_ASSERT_EQUAL(80, url.getPort().get_value_or(2));
+ CPPUNIT_ASSERT_EQUAL(static_cast<unsigned short>(80), url.getPort().get_value_or(2));
CPPUNIT_ASSERT_EQUAL(std::string("/index.html"), url.getPath());
CPPUNIT_ASSERT_EQUAL(std::string(testVector), url.toString());
@@ -219,7 +219,7 @@ class URLTest : public CppUnit::TestFixture {
CPPUNIT_ASSERT_EQUAL(std::string("http"), url.getScheme());
CPPUNIT_ASSERT_EQUAL(std::string("2010:836B:4179::836B:4179"), url.getHost());
- CPPUNIT_ASSERT_EQUAL(2, url.getPort().get_value_or(2));
+ CPPUNIT_ASSERT_EQUAL(static_cast<unsigned short>(2), url.getPort().get_value_or(2));
CPPUNIT_ASSERT_EQUAL(std::string(), url.getPath());
CPPUNIT_ASSERT_EQUAL(std::string(testVector), url.toString());
diff --git a/Swiften/ChangeLog.md b/Swiften/ChangeLog.md
index d823954..60355b4 100644
--- a/Swiften/ChangeLog.md
+++ b/Swiften/ChangeLog.md
@@ -1,3 +1,28 @@
+5-in-progress
+-------------
+- Update build system from scons 2.4.0 to 3.0.1
+
+4.0.1 (2018-03-28)
+------------------
+- Fix handling errors when fetching own vCard
+
+4.0 (2018-03-20)
+----------------
+- Moved code-base to C++11
+ - Use C++11 threading instead of Boost.Thread library
+ - Use C++11 smart pointers instead of Boost's
+- Migrated from Boost.Signals to Boost.Signals2
+- Build without warnings on our CI platforms
+- General cleanup like remove of superflous files and #include statements. This means header files that previously were included implictly need to be explicitly included now
+- Support IPv6 addresses in URLs
+- Handle sessions being closed by the server
+- Verify certificates when using HTTPS in BOSH connections
+- In memory caching of latest entity capabilites lookups
+- Changed source code style to use soft tabs (4 spaces wide) instead of hard tabs. Custom patches for Swiften will need to be reformatted accordingly
+- Require a TLS backend for building
+- Update 3rdParty/lcov to version 1.12
+- Fix several possible race conditions, smaller leaks, and other small bugs
+
4.0-rc1 ( 2017-05-17 )
----------------------
- Handle sessions being closed by the server
diff --git a/Swiften/Chat/ChatStateTracker.cpp b/Swiften/Chat/ChatStateTracker.cpp
index 25ecd1c..839f47d 100644
--- a/Swiften/Chat/ChatStateTracker.cpp
+++ b/Swiften/Chat/ChatStateTracker.cpp
@@ -17,7 +17,7 @@ void ChatStateTracker::handleMessageReceived(std::shared_ptr<Message> message) {
}
std::shared_ptr<ChatState> statePayload = message->getPayload<ChatState>();
if (statePayload) {
- changeState(statePayload->getChatState());;
+ changeState(statePayload->getChatState());
}
}
diff --git a/Swiften/Chat/UnitTest/ChatStateNotifierTest.cpp b/Swiften/Chat/UnitTest/ChatStateNotifierTest.cpp
index efd37d9..b6c909a 100644
--- a/Swiften/Chat/UnitTest/ChatStateNotifierTest.cpp
+++ b/Swiften/Chat/UnitTest/ChatStateNotifierTest.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -13,6 +13,9 @@
#include <Swiften/Disco/DummyEntityCapsProvider.h>
#include <Swiften/Network/DummyTimerFactory.h>
+// Clang wrongly things that tests for 0 are using 0 as null.
+#pragma clang diagnostic ignored "-Wzero-as-null-pointer-constant"
+
using namespace Swift;
class ChatStateNotifierTest : public ::testing::Test {
diff --git a/Swiften/Client/ClientSession.cpp b/Swiften/Client/ClientSession.cpp
index 661a832..1114336 100644
--- a/Swiften/Client/ClientSession.cpp
+++ b/Swiften/Client/ClientSession.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2019 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -88,7 +88,7 @@ ClientSession::ClientSession(
authenticationPort(-1) {
#ifdef SWIFTEN_PLATFORM_WIN32
if (WindowsRegistry::isFIPSEnabled()) {
- SWIFT_LOG(info) << "Windows is running in FIPS-140 mode. Some authentication methods will be unavailable." << std::endl;
+ SWIFT_LOG(info) << "Windows is running in FIPS-140 mode. Some authentication methods will be unavailable.";
}
#endif
}
@@ -122,7 +122,7 @@ void ClientSession::sendStanza(std::shared_ptr<Stanza> stanza) {
}
void ClientSession::handleStreamStart(const ProtocolHeader&) {
- CHECK_STATE_OR_RETURN(State::WaitingForStreamStart);
+ CHECK_STATE_OR_RETURN(State::WaitingForStreamStart)
state = State::Negotiating;
}
@@ -214,7 +214,7 @@ void ClientSession::handleElement(std::shared_ptr<ToplevelElement> element) {
}
}
else if (StreamFeatures* streamFeatures = dynamic_cast<StreamFeatures*>(element.get())) {
- CHECK_STATE_OR_RETURN(State::Negotiating);
+ CHECK_STATE_OR_RETURN(State::Negotiating)
if (streamFeatures->hasStartTLS() && stream->supportsTLSEncryption() && useTLS != NeverUseTLS) {
state = State::WaitingForEncrypt;
@@ -231,13 +231,13 @@ void ClientSession::handleElement(std::shared_ptr<ToplevelElement> element) {
#ifdef SWIFTEN_PLATFORM_WIN32
if (singleSignOn) {
const boost::optional<std::string> authenticationHostname = streamFeatures->getAuthenticationHostname();
- bool gssapiSupported = streamFeatures->hasAuthenticationMechanism("GSSAPI") && authenticationHostname && !authenticationHostname->empty();
+ bool gssapiSupported = streamFeatures->hasAuthenticationMechanism("GSSAPI");
if (!gssapiSupported) {
finishSession(Error::NoSupportedAuthMechanismsError);
}
else {
- WindowsGSSAPIClientAuthenticator* gssapiAuthenticator = new WindowsGSSAPIClientAuthenticator(*authenticationHostname, localJID.getDomain(), authenticationPort);
+ WindowsGSSAPIClientAuthenticator* gssapiAuthenticator = new WindowsGSSAPIClientAuthenticator(authenticationHostname.value_or(""), localJID.getDomain(), authenticationPort);
std::shared_ptr<Error> error = std::make_shared<Error>(Error::AuthenticationFailedError);
authenticator = gssapiAuthenticator;
@@ -320,7 +320,7 @@ void ClientSession::handleElement(std::shared_ptr<ToplevelElement> element) {
}
}
else if (std::dynamic_pointer_cast<Compressed>(element)) {
- CHECK_STATE_OR_RETURN(State::Compressing);
+ CHECK_STATE_OR_RETURN(State::Compressing)
state = State::WaitingForStreamStart;
stream->addZLibCompression();
stream->resetXMPPParser();
@@ -343,7 +343,7 @@ void ClientSession::handleElement(std::shared_ptr<ToplevelElement> element) {
continueSessionInitialization();
}
else if (AuthChallenge* challenge = dynamic_cast<AuthChallenge*>(element.get())) {
- CHECK_STATE_OR_RETURN(State::Authenticating);
+ CHECK_STATE_OR_RETURN(State::Authenticating)
assert(authenticator);
if (authenticator->setChallenge(challenge->getValue())) {
stream->writeElement(std::make_shared<AuthResponse>(authenticator->getResponse()));
@@ -361,7 +361,7 @@ void ClientSession::handleElement(std::shared_ptr<ToplevelElement> element) {
}
}
else if (AuthSuccess* authSuccess = dynamic_cast<AuthSuccess*>(element.get())) {
- CHECK_STATE_OR_RETURN(State::Authenticating);
+ CHECK_STATE_OR_RETURN(State::Authenticating)
assert(authenticator);
if (!authenticator->setChallenge(authSuccess->getValue())) {
finishSession(Error::ServerVerificationFailedError);
@@ -378,7 +378,7 @@ void ClientSession::handleElement(std::shared_ptr<ToplevelElement> element) {
finishSession(Error::AuthenticationFailedError);
}
else if (dynamic_cast<TLSProceed*>(element.get())) {
- CHECK_STATE_OR_RETURN(State::WaitingForEncrypt);
+ CHECK_STATE_OR_RETURN(State::WaitingForEncrypt)
state = State::Encrypting;
stream->addTLSEncryption();
}
@@ -433,7 +433,7 @@ void ClientSession::sendCredentials(const SafeByteArray& password) {
void ClientSession::handleTLSEncrypted() {
if (!std::dynamic_pointer_cast<BOSHSessionStream>(stream)) {
- CHECK_STATE_OR_RETURN(State::Encrypting);
+ CHECK_STATE_OR_RETURN(State::Encrypting)
}
std::vector<Certificate::ref> certificateChain = stream->getPeerCertificateChain();
@@ -531,7 +531,7 @@ void ClientSession::finish() {
finishSession(std::shared_ptr<Error>());
}
else {
- SWIFT_LOG(warning) << "Session already finished or finishing." << std::endl;
+ SWIFT_LOG(warning) << "Session already finished or finishing.";
}
}
@@ -544,7 +544,7 @@ void ClientSession::finishSession(std::shared_ptr<Swift::Error> error) {
error_ = error;
}
else {
- SWIFT_LOG(warning) << "Session finished twice" << std::endl;
+ SWIFT_LOG(warning) << "Session finished twice";
}
assert(stream->isOpen());
if (stanzaAckResponder_) {
diff --git a/Swiften/Client/ClientSessionStanzaChannel.cpp b/Swiften/Client/ClientSessionStanzaChannel.cpp
index f48b306..6a5d07d 100644
--- a/Swiften/Client/ClientSessionStanzaChannel.cpp
+++ b/Swiften/Client/ClientSessionStanzaChannel.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2019 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -49,7 +49,7 @@ std::string ClientSessionStanzaChannel::getNewIQID() {
void ClientSessionStanzaChannel::send(std::shared_ptr<Stanza> stanza) {
if (!isAvailable()) {
- SWIFT_LOG(warning) << "Client: Trying to send a stanza while disconnected." << std::endl;
+ SWIFT_LOG(warning) << "Client: Trying to send a stanza while disconnected.";
return;
}
session->sendStanza(stanza);
diff --git a/Swiften/Client/CoreClient.cpp b/Swiften/Client/CoreClient.cpp
index 1de1d61..7579bca 100644
--- a/Swiften/Client/CoreClient.cpp
+++ b/Swiften/Client/CoreClient.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2019 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -69,33 +69,53 @@ void CoreClient::connect(const ClientOptions& o) {
HostAddressPort systemHTTPConnectProxy = networkFactories->getProxyProvider()->getHTTPConnectProxy();
switch (o.proxyType) {
case ClientOptions::NoProxy:
- SWIFT_LOG(debug) << " without a proxy" << std::endl;
+ SWIFT_LOG(debug) << " without a proxy";
break;
case ClientOptions::SystemConfiguredProxy:
- SWIFT_LOG(debug) << " with a system configured proxy" << std::endl;
+ SWIFT_LOG(debug) << " with a system configured proxy";
if (systemSOCKS5Proxy.isValid()) {
- SWIFT_LOG(debug) << "Found SOCK5 Proxy: " << systemSOCKS5Proxy.getAddress().toString() << ":" << systemSOCKS5Proxy.getPort() << std::endl;
+ SWIFT_LOG(debug) << "Found SOCK5 Proxy: " << systemSOCKS5Proxy.getAddress().toString() << ":" << systemSOCKS5Proxy.getPort();
proxyConnectionFactories.push_back(new SOCKS5ProxiedConnectionFactory(networkFactories->getDomainNameResolver(), networkFactories->getConnectionFactory(), networkFactories->getTimerFactory(), systemSOCKS5Proxy.getAddress().toString(), systemSOCKS5Proxy.getPort()));
}
if (systemHTTPConnectProxy.isValid()) {
- SWIFT_LOG(debug) << "Found HTTPConnect Proxy: " << systemHTTPConnectProxy.getAddress().toString() << ":" << systemHTTPConnectProxy.getPort() << std::endl;
+ SWIFT_LOG(debug) << "Found HTTPConnect Proxy: " << systemHTTPConnectProxy.getAddress().toString() << ":" << systemHTTPConnectProxy.getPort();
proxyConnectionFactories.push_back(new HTTPConnectProxiedConnectionFactory(networkFactories->getDomainNameResolver(), networkFactories->getConnectionFactory(), networkFactories->getTimerFactory(), systemHTTPConnectProxy.getAddress().toString(), systemHTTPConnectProxy.getPort()));
}
break;
case ClientOptions::SOCKS5Proxy: {
- SWIFT_LOG(debug) << " with manual configured SOCKS5 proxy" << std::endl;
+ SWIFT_LOG(debug) << " with manual configured SOCKS5 proxy";
std::string proxyHostname = o.manualProxyHostname.empty() ? systemSOCKS5Proxy.getAddress().toString() : o.manualProxyHostname;
- int proxyPort = o.manualProxyPort == -1 ? systemSOCKS5Proxy.getPort() : o.manualProxyPort;
- SWIFT_LOG(debug) << "Proxy: " << proxyHostname << ":" << proxyPort << std::endl;
+ auto proxyPort = systemSOCKS5Proxy.getPort();
+ if (o.manualProxyPort != -1) {
+ try {
+ proxyPort = boost::numeric_cast<unsigned short>(o.manualProxyPort);
+ }
+ catch (const boost::numeric::bad_numeric_cast& e) {
+ SWIFT_LOG(warning) << "Manual proxy port " << o.manualProxyPort << " is invalid: " << e.what();
+ onDisconnected(boost::optional<ClientError>(ClientError::ConnectionError));
+ return;
+ }
+ }
+ SWIFT_LOG(debug) << "Proxy: " << proxyHostname << ":" << proxyPort;
proxyConnectionFactories.push_back(new SOCKS5ProxiedConnectionFactory(networkFactories->getDomainNameResolver(), networkFactories->getConnectionFactory(), networkFactories->getTimerFactory(), proxyHostname, proxyPort));
useDirectConnection = false;
break;
}
case ClientOptions::HTTPConnectProxy: {
- SWIFT_LOG(debug) << " with manual configured HTTPConnect proxy" << std::endl;
+ SWIFT_LOG(debug) << " with manual configured HTTPConnect proxy";
std::string proxyHostname = o.manualProxyHostname.empty() ? systemHTTPConnectProxy.getAddress().toString() : o.manualProxyHostname;
- int proxyPort = o.manualProxyPort == -1 ? systemHTTPConnectProxy.getPort() : o.manualProxyPort;
- SWIFT_LOG(debug) << "Proxy: " << proxyHostname << ":" << proxyPort << std::endl;
+ unsigned short proxyPort = systemHTTPConnectProxy.getPort();
+ if (o.manualProxyPort != -1) {
+ try {
+ proxyPort = boost::numeric_cast<unsigned short>(o.manualProxyPort);
+ }
+ catch (const boost::numeric::bad_numeric_cast& e) {
+ SWIFT_LOG(warning) << "Manual proxy port " << o.manualProxyPort << " is invalid: " << e.what();
+ onDisconnected(boost::optional<ClientError>(ClientError::ConnectionError));
+ return;
+ }
+ }
+ SWIFT_LOG(debug) << "Proxy: " << proxyHostname << ":" << proxyPort;
proxyConnectionFactories.push_back(new HTTPConnectProxiedConnectionFactory(networkFactories->getDomainNameResolver(), networkFactories->getConnectionFactory(), networkFactories->getTimerFactory(), proxyHostname, proxyPort, o.httpTrafficFilter));
useDirectConnection = false;
break;
@@ -108,7 +128,17 @@ void CoreClient::connect(const ClientOptions& o) {
// Create connector
std::string host = o.manualHostname.empty() ? jid_.getDomain() : o.manualHostname;
- int port = o.manualPort;
+ unsigned short port = 0;
+ if (o.manualPort != -1) {
+ try {
+ port = boost::numeric_cast<unsigned short>(o.manualPort);
+ }
+ catch (const boost::numeric::bad_numeric_cast& e) {
+ SWIFT_LOG(warning) << "Invalid manual port " << o.manualPort << ": " << e.what();
+ onDisconnected(boost::optional<ClientError>(ClientError::ConnectionError));
+ return;
+ }
+ }
boost::optional<std::string> serviceLookupPrefix;
if (o.manualHostname.empty()) {
serviceLookupPrefix = "_xmpp-client._tcp.";
@@ -144,7 +174,7 @@ void CoreClient::connect(const ClientOptions& o) {
sessionStream_->onDataRead.connect(boost::bind(&CoreClient::handleDataRead, this, _1));
sessionStream_->onDataWritten.connect(boost::bind(&CoreClient::handleDataWritten, this, _1));
if (certificate_ && !certificate_->isNull()) {
- SWIFT_LOG(debug) << "set certificate" << std::endl;
+ SWIFT_LOG(debug) << "set certificate";
sessionStream_->setTLSCertificate(certificate_);
}
boshSessionStream_->open();
@@ -286,6 +316,8 @@ void CoreClient::handleSessionFinished(std::shared_ptr<Error> error) {
clientError = ClientError(ClientError::CertificateCardRemoved);
break;
case TLSError::UnknownError:
+ case TLSError::AcceptFailed:
+ case TLSError::ConnectFailed:
clientError = ClientError(ClientError::TLSError);
break;
}
@@ -391,7 +423,7 @@ void CoreClient::sendPresence(std::shared_ptr<Presence> presence) {
void CoreClient::sendData(const std::string& data) {
if (!sessionStream_) {
- SWIFT_LOG(warning) << "Client: Trying to send data while disconnected." << std::endl;
+ SWIFT_LOG(warning) << "Client: Trying to send data while disconnected.";
return;
}
sessionStream_->writeData(data);
@@ -475,11 +507,11 @@ void CoreClient::resetSession() {
void CoreClient::forceReset() {
if (connector_) {
- SWIFT_LOG(warning) << "Client not disconnected properly: Connector still active" << std::endl;
+ SWIFT_LOG(warning) << "Client not disconnected properly: Connector still active";
resetConnector();
}
if (sessionStream_ || connection_) {
- SWIFT_LOG(warning) << "Client not disconnected properly: Session still active" << std::endl;
+ SWIFT_LOG(warning) << "Client not disconnected properly: Session still active";
resetSession();
}
}
diff --git a/Swiften/Client/DummyStanzaChannel.h b/Swiften/Client/DummyStanzaChannel.h
index 4cc0f7e..1ba70ad 100644
--- a/Swiften/Client/DummyStanzaChannel.h
+++ b/Swiften/Client/DummyStanzaChannel.h
@@ -48,8 +48,12 @@ namespace Swift {
return available_;
}
+ virtual void setStreamManagementEnabled(bool enable) {
+ streamManagement_ = enable;
+ }
+
virtual bool getStreamManagementEnabled() const {
- return false;
+ return streamManagement_;
}
template<typename T> bool isRequestAtIndex(size_t index, const JID& jid, IQ::Type type) {
@@ -101,5 +105,6 @@ namespace Swift {
bool available_ = true;
bool uniqueIDs_ = false;
unsigned int idCounter_ = 0;
+ bool streamManagement_ = false;
};
}
diff --git a/Swiften/Client/UnitTest/XMLBeautifierTest.cpp b/Swiften/Client/UnitTest/XMLBeautifierTest.cpp
index 2eac086..2a639ea 100644
--- a/Swiften/Client/UnitTest/XMLBeautifierTest.cpp
+++ b/Swiften/Client/UnitTest/XMLBeautifierTest.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010-2017 Isode Limited.
+ * Copyright (c) 2010-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -8,6 +8,9 @@
#include <Swiften/Client/XMLBeautifier.h>
#include <iostream>
+// Clang wrongly things that tests for 0 are using 0 as null.
+#pragma clang diagnostic ignored "-Wzero-as-null-pointer-constant"
+
using namespace Swift;
namespace {
diff --git a/Swiften/Component/ComponentConnector.cpp b/Swiften/Component/ComponentConnector.cpp
index a7375a7..7789c4c 100644
--- a/Swiften/Component/ComponentConnector.cpp
+++ b/Swiften/Component/ComponentConnector.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -15,7 +15,7 @@
namespace Swift {
-ComponentConnector::ComponentConnector(const std::string& hostname, int port, DomainNameResolver* resolver, ConnectionFactory* connectionFactory, TimerFactory* timerFactory) : hostname(hostname), port(port), resolver(resolver), connectionFactory(connectionFactory), timerFactory(timerFactory), timeoutMilliseconds(0) {
+ComponentConnector::ComponentConnector(const std::string& hostname, unsigned short port, DomainNameResolver* resolver, ConnectionFactory* connectionFactory, TimerFactory* timerFactory) : hostname(hostname), port(port), resolver(resolver), connectionFactory(connectionFactory), timerFactory(timerFactory), timeoutMilliseconds(0) {
}
void ComponentConnector::setTimeoutMilliseconds(int milliseconds) {
diff --git a/Swiften/Component/ComponentConnector.h b/Swiften/Component/ComponentConnector.h
index ab36901..cfd49fe 100644
--- a/Swiften/Component/ComponentConnector.h
+++ b/Swiften/Component/ComponentConnector.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -28,7 +28,7 @@ namespace Swift {
public:
typedef std::shared_ptr<ComponentConnector> ref;
- static ComponentConnector::ref create(const std::string& hostname, int port, DomainNameResolver* resolver, ConnectionFactory* connectionFactory, TimerFactory* timerFactory) {
+ static ComponentConnector::ref create(const std::string& hostname, unsigned short port, DomainNameResolver* resolver, ConnectionFactory* connectionFactory, TimerFactory* timerFactory) {
return ref(new ComponentConnector(hostname, port, resolver, connectionFactory, timerFactory));
}
@@ -40,7 +40,7 @@ namespace Swift {
boost::signals2::signal<void (std::shared_ptr<Connection>)> onConnectFinished;
private:
- ComponentConnector(const std::string& hostname, int port, DomainNameResolver*, ConnectionFactory*, TimerFactory*);
+ ComponentConnector(const std::string& hostname, unsigned short port, DomainNameResolver*, ConnectionFactory*, TimerFactory*);
void handleAddressQueryResult(const std::vector<HostAddress>& address, boost::optional<DomainNameResolveError> error);
void tryNextAddress();
@@ -53,7 +53,7 @@ namespace Swift {
private:
std::string hostname;
- int port;
+ unsigned short port;
DomainNameResolver* resolver;
ConnectionFactory* connectionFactory;
TimerFactory* timerFactory;
diff --git a/Swiften/Component/ComponentSessionStanzaChannel.cpp b/Swiften/Component/ComponentSessionStanzaChannel.cpp
index e4bf231..deac8b2 100644
--- a/Swiften/Component/ComponentSessionStanzaChannel.cpp
+++ b/Swiften/Component/ComponentSessionStanzaChannel.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010-2017 Isode Limited.
+ * Copyright (c) 2010-2019 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -47,7 +47,7 @@ std::string ComponentSessionStanzaChannel::getNewIQID() {
void ComponentSessionStanzaChannel::send(std::shared_ptr<Stanza> stanza) {
if (!isAvailable()) {
- SWIFT_LOG(warning) << "Component: Trying to send a stanza while disconnected." << std::endl;
+ SWIFT_LOG(warning) << "Component: Trying to send a stanza while disconnected.";
return;
}
session->sendStanza(stanza);
diff --git a/Swiften/Component/CoreComponent.cpp b/Swiften/Component/CoreComponent.cpp
index 3896bdd..ef7d3a4 100644
--- a/Swiften/Component/CoreComponent.cpp
+++ b/Swiften/Component/CoreComponent.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2019 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -33,7 +33,7 @@ CoreComponent::CoreComponent(const JID& jid, const std::string& secret, NetworkF
CoreComponent::~CoreComponent() {
if (session_ || connection_) {
- SWIFT_LOG(warning) << "Component not disconnected properly" << std::endl;
+ SWIFT_LOG(warning) << "Component not disconnected properly";
}
delete iqRouter_;
@@ -43,7 +43,7 @@ CoreComponent::~CoreComponent() {
delete stanzaChannel_;
}
-void CoreComponent::connect(const std::string& host, int port) {
+void CoreComponent::connect(const std::string& host, unsigned short port) {
assert(!connector_);
connector_ = ComponentConnector::create(host, port, networkFactories->getDomainNameResolver(), networkFactories->getConnectionFactory(), networkFactories->getTimerFactory());
connector_->onConnectFinished.connect(boost::bind(&CoreComponent::handleConnectorFinished, this, _1));
@@ -166,4 +166,12 @@ void CoreComponent::sendData(const std::string& data) {
sessionStream_->writeData(data);
}
+bool CoreComponent::isActive() const {
+ return session_ || connector_;
+}
+
+bool CoreComponent::isAvailable() const {
+ return stanzaChannel_->isAvailable();
+}
+
}
diff --git a/Swiften/Component/CoreComponent.h b/Swiften/Component/CoreComponent.h
index f673643..7565d00 100644
--- a/Swiften/Component/CoreComponent.h
+++ b/Swiften/Component/CoreComponent.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010-2017 Isode Limited.
+ * Copyright (c) 2010-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -46,7 +46,7 @@ namespace Swift {
CoreComponent(const JID& jid, const std::string& secret, NetworkFactories* networkFactories);
virtual ~CoreComponent();
- void connect(const std::string& host, int port);
+ void connect(const std::string& host, unsigned short port);
void disconnect();
void sendMessage(std::shared_ptr<Message>);
@@ -61,9 +61,18 @@ namespace Swift {
return stanzaChannel_;
}
- bool isAvailable() const {
- return stanzaChannel_->isAvailable();
- }
+ /**
+ * Checks whether the component is connected to the server,
+ * and stanzas can be sent.
+ */
+ bool isAvailable() const;
+
+ /**
+ * Checks whether the component is active.
+ *
+ * A component is active when it is connected or connecting to the server.
+ */
+ bool isActive() const;
/**
* Returns the JID of the component
diff --git a/Swiften/Component/UnitTest/ComponentConnectorTest.cpp b/Swiften/Component/UnitTest/ComponentConnectorTest.cpp
index 3b4fa83..bd26989 100644
--- a/Swiften/Component/UnitTest/ComponentConnectorTest.cpp
+++ b/Swiften/Component/UnitTest/ComponentConnectorTest.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -146,7 +146,7 @@ class ComponentConnectorTest : public CppUnit::TestFixture {
}
private:
- ComponentConnector::ref createConnector(const std::string& hostname, int port) {
+ ComponentConnector::ref createConnector(const std::string& hostname, unsigned short port) {
ComponentConnector::ref connector = ComponentConnector::create(hostname, port, resolver, connectionFactory, timerFactory);
connector->onConnectFinished.connect(boost::bind(&ComponentConnectorTest::handleConnectorFinished, this, _1));
return connector;
diff --git a/Swiften/Config/SConscript b/Swiften/Config/SConscript
index dd06d61..ae0d37a 100644
--- a/Swiften/Config/SConscript
+++ b/Swiften/Config/SConscript
@@ -10,7 +10,7 @@ def cStringVariable(env, cVar, sconsVar) :
# FIXME: Probably not very robust
for var in sconsVar.split(" ") :
result += "\t\"" + env.subst(var).replace("\\", "\\\\") + "\",\n"
- result += "\t0\n"
+ result += "\tnullptr\n"
result += "};\n"
return result
@@ -22,15 +22,15 @@ swiften_env.UseFlags(swiften_env["SWIFTEN_DEP_FLAGS"])
cppflags = replaceSwiftenPath(" ".join([
swiften_env.subst("$CPPFLAGS").replace("-isystem ","-I"),
- swiften_env.subst("$_CPPDEFFLAGS"),
+ swiften_env.subst("$_CPPDEFFLAGS"),
swiften_env.subst("$_CPPINCFLAGS")]))
config_flags += cStringVariable(swiften_env, "CPPFLAGS", cppflags)
libflags = replaceSwiftenPath(" ".join([
- swiften_env.subst("$_LIBDIRFLAGS"),
- swiften_env.subst("$_LIBFLAGS"),
- swiften_env.subst("$_FRAMEWORKPATH"),
- swiften_env.subst("$_FRAMEWORKS"),
+ swiften_env.subst("$_LIBDIRFLAGS"),
+ swiften_env.subst("$_LIBFLAGS"),
+ swiften_env.subst("$_FRAMEWORKPATH"),
+ swiften_env.subst("$_FRAMEWORKS"),
swiften_env.subst("$_FRAMEWORKSFLAGS")
]))
config_flags += cStringVariable(swiften_env, "LIBFLAGS", libflags)
diff --git a/Swiften/Crypto/CommonCryptoCryptoProvider.cpp b/Swiften/Crypto/CommonCryptoCryptoProvider.cpp
index d4257e0..3cc69b0 100644
--- a/Swiften/Crypto/CommonCryptoCryptoProvider.cpp
+++ b/Swiften/Crypto/CommonCryptoCryptoProvider.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2013-2017 Isode Limited.
+ * Copyright (c) 2013-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -49,7 +49,12 @@ namespace {
template<typename ContainerType>
Hash& updateInternal(const ContainerType& data) {
assert(!finalized);
- if (!CC_SHA1_Update(&context, vecptr(data), boost::numeric_cast<CC_LONG>(data.size()))) {
+ try {
+ if (!CC_SHA1_Update(&context, vecptr(data), boost::numeric_cast<CC_LONG>(data.size()))) {
+ assert(false);
+ }
+ }
+ catch (const boost::numeric::bad_numeric_cast&) {
assert(false);
}
return *this;
@@ -90,7 +95,12 @@ namespace {
template<typename ContainerType>
Hash& updateInternal(const ContainerType& data) {
assert(!finalized);
- if (!CC_MD5_Update(&context, vecptr(data), boost::numeric_cast<CC_LONG>(data.size()))) {
+ try {
+ if (!CC_MD5_Update(&context, vecptr(data), boost::numeric_cast<CC_LONG>(data.size()))) {
+ assert(false);
+ }
+ }
+ catch (const boost::numeric::bad_numeric_cast&) {
assert(false);
}
return *this;
@@ -104,7 +114,12 @@ namespace {
template<typename T>
ByteArray getHMACSHA1Internal(const T& key, const ByteArray& data) {
std::vector<unsigned char> result(CC_SHA1_DIGEST_LENGTH);
- CCHmac(kCCHmacAlgSHA1, vecptr(key), key.size(), vecptr(data), boost::numeric_cast<CC_LONG>(data.size()), vecptr(result));
+ try {
+ CCHmac(kCCHmacAlgSHA1, vecptr(key), key.size(), vecptr(data), boost::numeric_cast<CC_LONG>(data.size()), vecptr(result));
+ }
+ catch (const boost::numeric::bad_numeric_cast&) {
+ assert(false);
+ }
return result;
}
}
diff --git a/Swiften/Crypto/OpenSSLCryptoProvider.cpp b/Swiften/Crypto/OpenSSLCryptoProvider.cpp
index b46cb2a..5245bd8 100644
--- a/Swiften/Crypto/OpenSSLCryptoProvider.cpp
+++ b/Swiften/Crypto/OpenSSLCryptoProvider.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2013-2017 Isode Limited.
+ * Copyright (c) 2013-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -28,7 +28,7 @@ namespace {
}
}
- ~SHA1Hash() {
+ ~SHA1Hash() override {
}
virtual Hash& update(const ByteArray& data) override {
@@ -69,7 +69,7 @@ namespace {
}
}
- ~MD5Hash() {
+ ~MD5Hash() override {
}
virtual Hash& update(const ByteArray& data) override {
@@ -107,7 +107,12 @@ namespace {
ByteArray getHMACSHA1Internal(const T& key, const ByteArray& data) {
unsigned int len = SHA_DIGEST_LENGTH;
std::vector<unsigned char> result(len);
- HMAC(EVP_sha1(), vecptr(key), boost::numeric_cast<int>(key.size()), vecptr(data), data.size(), vecptr(result), &len);
+ try {
+ HMAC(EVP_sha1(), vecptr(key), boost::numeric_cast<int>(key.size()), vecptr(data), data.size(), vecptr(result), &len);
+ }
+ catch (const boost::numeric::bad_numeric_cast&) {
+ assert(false);
+ }
return result;
}
}
diff --git a/Swiften/Disco/CapsManager.cpp b/Swiften/Disco/CapsManager.cpp
index 794cf74..2b8fb7d 100644
--- a/Swiften/Disco/CapsManager.cpp
+++ b/Swiften/Disco/CapsManager.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2019 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -53,7 +53,7 @@ void CapsManager::handleDiscoInfoReceived(const JID& from, const std::string& ha
requestedDiscoInfos.erase(hash);
if (error || !discoInfo || CapsInfoGenerator("", crypto).generateCapsInfo(*discoInfo.get()).getVersion() != hash) {
if (warnOnInvalidHash && !error && discoInfo) {
- SWIFT_LOG(warning) << "Caps from " << from.toString() << " do not verify" << std::endl;
+ SWIFT_LOG(warning) << "Caps from " << from.toString() << " do not verify";
}
failingCaps.insert(std::make_pair(from, hash));
std::map<std::string, std::set< std::pair<JID, std::string> > >::iterator i = fallbacks.find(hash);
diff --git a/Swiften/Disco/DiscoServiceWalker.cpp b/Swiften/Disco/DiscoServiceWalker.cpp
index a3f95d2..7332e63 100644
--- a/Swiften/Disco/DiscoServiceWalker.cpp
+++ b/Swiften/Disco/DiscoServiceWalker.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2019 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -17,7 +17,7 @@ DiscoServiceWalker::DiscoServiceWalker(const JID& service, IQRouter* iqRouter, s
}
void DiscoServiceWalker::beginWalk() {
- SWIFT_LOG(debug) << "Starting walk to " << service_ << std::endl;
+ SWIFT_LOG(debug) << "Starting walk to " << service_;
assert(!active_);
assert(servicesBeingSearched_.empty());
active_ = true;
@@ -26,7 +26,7 @@ void DiscoServiceWalker::beginWalk() {
void DiscoServiceWalker::endWalk() {
if (active_) {
- SWIFT_LOG(debug) << "Ending walk to " << service_ << std::endl;
+ SWIFT_LOG(debug) << "Ending walk to " << service_;
for (auto&& request : pendingDiscoInfoRequests_) {
request->onResponse.disconnect(boost::bind(&DiscoServiceWalker::handleDiscoInfoResponse, this, _1, _2, request));
}
@@ -39,7 +39,7 @@ void DiscoServiceWalker::endWalk() {
}
void DiscoServiceWalker::walkNode(const JID& jid) {
- SWIFT_LOG(debug) << "Walking node " << jid << std::endl;
+ SWIFT_LOG(debug) << "Walking node " << jid;
servicesBeingSearched_.insert(jid);
searchedServices_.insert(jid);
GetDiscoInfoRequest::ref discoInfoRequest = GetDiscoInfoRequest::create(jid, iqRouter_);
@@ -54,7 +54,7 @@ void DiscoServiceWalker::handleDiscoInfoResponse(std::shared_ptr<DiscoInfo> info
return;
}
- SWIFT_LOG(debug) << "Disco info response from " << request->getReceiver() << std::endl;
+ SWIFT_LOG(debug) << "Disco info response from " << request->getReceiver();
request->onResponse.disconnect(boost::bind(&DiscoServiceWalker::handleDiscoInfoResponse, this, _1, _2, request));
pendingDiscoInfoRequests_.erase(request);
@@ -90,7 +90,7 @@ void DiscoServiceWalker::handleDiscoItemsResponse(std::shared_ptr<DiscoItems> it
return;
}
- SWIFT_LOG(debug) << "Received disco items from " << request->getReceiver() << std::endl;
+ SWIFT_LOG(debug) << "Received disco items from " << request->getReceiver();
request->onResponse.disconnect(boost::bind(&DiscoServiceWalker::handleDiscoItemsResponse, this, _1, _2, request));
pendingDiscoItemsRequests_.erase(request);
if (error) {
@@ -103,7 +103,7 @@ void DiscoServiceWalker::handleDiscoItemsResponse(std::shared_ptr<DiscoItems> it
* but I've never seen one in the wild, and it's an easy fix for not looping.
*/
if (std::find(searchedServices_.begin(), searchedServices_.end(), item.getJID()) == searchedServices_.end()) { /* Don't recurse infinitely */
- SWIFT_LOG(debug) << "Received disco item " << item.getJID() << std::endl;
+ SWIFT_LOG(debug) << "Received disco item " << item.getJID();
walkNode(item.getJID());
}
}
@@ -112,12 +112,12 @@ void DiscoServiceWalker::handleDiscoItemsResponse(std::shared_ptr<DiscoItems> it
}
void DiscoServiceWalker::handleDiscoError(const JID& jid, ErrorPayload::ref /*error*/) {
- SWIFT_LOG(debug) << "Disco error from " << jid << std::endl;
+ SWIFT_LOG(debug) << "Disco error from " << jid;
markNodeCompleted(jid);
}
void DiscoServiceWalker::markNodeCompleted(const JID& jid) {
- SWIFT_LOG(debug) << "Node completed " << jid << std::endl;
+ SWIFT_LOG(debug) << "Node completed " << jid;
servicesBeingSearched_.erase(jid);
/* All results are in */
if (servicesBeingSearched_.empty()) {
diff --git a/Swiften/Elements/Bytestreams.h b/Swiften/Elements/Bytestreams.h
index ca30922..599ed46 100644
--- a/Swiften/Elements/Bytestreams.h
+++ b/Swiften/Elements/Bytestreams.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -22,11 +22,11 @@ namespace Swift {
typedef std::shared_ptr<Bytestreams> ref;
struct StreamHost {
- StreamHost(const std::string& host = "", const JID& jid = JID(), int port = -1) : host(host), jid(jid), port(port) {}
+ StreamHost(const std::string& host = "", const JID& jid = JID(), unsigned short port = 0) : host(host), jid(jid), port(port) {}
std::string host;
JID jid;
- int port;
+ unsigned short port;
};
Bytestreams() {}
diff --git a/Swiften/Elements/DiscoInfo.cpp b/Swiften/Elements/DiscoInfo.cpp
index 11f0623..701ed40 100644
--- a/Swiften/Elements/DiscoInfo.cpp
+++ b/Swiften/Elements/DiscoInfo.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010-2015 Isode Limited.
+ * Copyright (c) 2010-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -26,6 +26,7 @@ const std::string DiscoInfo::MessageDeliveryReceiptsFeature = std::string("urn:x
const std::string DiscoInfo::WhiteboardFeature = std::string("http://swift.im/whiteboard");
const std::string DiscoInfo::BlockingCommandFeature = std::string("urn:xmpp:blocking");
const std::string DiscoInfo::MessageCarbonsFeature = std::string("urn:xmpp:carbons:2");
+const std::string DiscoInfo::ReferencesFeature = std::string("urn:xmpp:references:0");
bool DiscoInfo::Identity::operator<(const Identity& other) const {
if (category_ == other.category_) {
diff --git a/Swiften/Elements/DiscoInfo.h b/Swiften/Elements/DiscoInfo.h
index c8009ee..713eaba 100644
--- a/Swiften/Elements/DiscoInfo.h
+++ b/Swiften/Elements/DiscoInfo.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -37,6 +37,7 @@ namespace Swift {
static const std::string WhiteboardFeature;
static const std::string BlockingCommandFeature;
static const std::string MessageCarbonsFeature;
+ static const std::string ReferencesFeature;
class Identity {
public:
diff --git a/Swiften/Elements/Form.h b/Swiften/Elements/Form.h
index 899fb93..827e497 100644
--- a/Swiften/Elements/Form.h
+++ b/Swiften/Elements/Form.h
@@ -89,6 +89,9 @@ namespace Swift {
return instructions_;
}
+ /** Returns the Form::Type enum (ie. ResultType, CancelType etc.).
+ * NOT to be confused with Form::getFormType().
+ */
Type getType() const {
return type_;
}
@@ -97,6 +100,9 @@ namespace Swift {
type_ = type;
}
+ /** Returns the value of the field FORM_TYPE
+ * NOT to be confused with Form::getType().
+ */
std::string getFormType() const;
FormField::ref getField(const std::string& name) const;
void addItem(const FormItem& item);
diff --git a/Swiften/Elements/IBB.h b/Swiften/Elements/IBB.h
index bd0b661..6ebe66e 100644
--- a/Swiften/Elements/IBB.h
+++ b/Swiften/Elements/IBB.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -28,10 +28,10 @@ namespace Swift {
MessageStanza
};
- IBB(Action action = Open, const std::string& streamID = "") : action(action), streamID(streamID), stanzaType(IQStanza), blockSize(-1), sequenceNumber(-1) {
+ IBB(Action action = Open, const std::string& streamID = "") : action(action), streamID(streamID), stanzaType(IQStanza), blockSize(0), sequenceNumber(-1) {
}
- static IBB::ref createIBBOpen(const std::string& streamID, int blockSize) {
+ static IBB::ref createIBBOpen(const std::string& streamID, unsigned int blockSize) {
IBB::ref result = std::make_shared<IBB>(Open, streamID);
result->setBlockSize(blockSize);
return result;
@@ -80,11 +80,11 @@ namespace Swift {
this->data = data;
}
- int getBlockSize() const {
+ unsigned int getBlockSize() const {
return blockSize;
}
- void setBlockSize(int blockSize) {
+ void setBlockSize(unsigned int blockSize) {
this->blockSize = blockSize;
}
@@ -101,7 +101,7 @@ namespace Swift {
std::string streamID;
std::vector<unsigned char> data;
StanzaType stanzaType;
- int blockSize;
+ unsigned int blockSize;
int sequenceNumber;
};
}
diff --git a/Swiften/Elements/JingleFileTransferFileInfo.h b/Swiften/Elements/JingleFileTransferFileInfo.h
index 9fd8756..0e8ccd4 100644
--- a/Swiften/Elements/JingleFileTransferFileInfo.h
+++ b/Swiften/Elements/JingleFileTransferFileInfo.h
@@ -36,7 +36,7 @@ namespace Swift {
public:
void setName(const std::string& name) {
- name_ = name;;
+ name_ = name;
}
const std::string& getName() const {
diff --git a/Swiften/Elements/MIXJoin.h b/Swiften/Elements/MIXJoin.h
index 2d82adc..ecd7b12 100644
--- a/Swiften/Elements/MIXJoin.h
+++ b/Swiften/Elements/MIXJoin.h
@@ -8,12 +8,12 @@
#include <memory>
#include <string>
+#include <unordered_set>
#include <boost/optional.hpp>
#include <Swiften/Base/API.h>
#include <Swiften/Elements/Payload.h>
-#include <Swiften/Elements/MIXSubscribe.h>
#include <Swiften/Elements/Form.h>
#include <Swiften/JID/JID.h>
@@ -31,7 +31,7 @@ namespace Swift {
return channel_;
}
- void setChannel(const JID& channel) {
+ void setChannel(JID channel) {
channel_ = channel;
}
@@ -39,20 +39,24 @@ namespace Swift {
return jid_;
}
- void setJID(const JID& jid) {
+ void setJID(JID jid) {
jid_ = jid;
}
- const std::vector<MIXSubscribe::ref>& getSubscriptions() const {
+ const std::unordered_set<std::string>& getSubscriptions() const {
return subscribeItems_;
}
- void setSubscriptions(const std::vector<MIXSubscribe::ref>& value) {
- subscribeItems_ = value ;
+ void setSubscriptions(std::unordered_set<std::string> values) {
+ subscribeItems_ = values ;
}
- void addSubscription(MIXSubscribe::ref value) {
- subscribeItems_.push_back(value);
+ void addSubscription(std::string value) {
+ subscribeItems_.insert(value);
+ }
+
+ bool hasSubscription(const std::string& value) const {
+ return std::find(subscribeItems_.begin(), subscribeItems_.end(), value) != subscribeItems_.end();
}
void setForm(std::shared_ptr<Form> form) {
@@ -66,7 +70,7 @@ namespace Swift {
private:
boost::optional<JID> jid_;
boost::optional<JID> channel_;
- std::vector<MIXSubscribe::ref> subscribeItems_;
+ std::unordered_set<std::string> subscribeItems_;
std::shared_ptr<Form> form_;
// FIXME: MIXInvitation to be implemented. boost::optional<MIXInvitation> invitation_;
};
diff --git a/Swiften/Elements/MIXSubscribe.h b/Swiften/Elements/MIXSubscribe.h
deleted file mode 100644
index eaf1aa9..0000000
--- a/Swiften/Elements/MIXSubscribe.h
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Copyright (c) 2017 Tarun Gupta
- * Licensed under the simplified BSD license.
- * See Documentation/Licenses/BSD-simplified.txt for more information.
- */
-
-#pragma once
-
-#include <memory>
-#include <string>
-
-#include <boost/optional.hpp>
-
-#include <Swiften/Base/API.h>
-#include <Swiften/Elements/Payload.h>
-
-namespace Swift {
- class SWIFTEN_API MIXSubscribe : public Payload {
-
- public:
- using ref = std::shared_ptr<MIXSubscribe>;
-
- public:
-
- MIXSubscribe() {}
-
- const std::string& getNode() const {
- return node_;
- }
-
- void setNode(const std::string& node) {
- node_ = node;
- }
-
- private:
- std::string node_;
- };
-}
diff --git a/Swiften/Elements/MIXUpdateSubscription.h b/Swiften/Elements/MIXUpdateSubscription.h
new file mode 100644
index 0000000..dc6ed27
--- /dev/null
+++ b/Swiften/Elements/MIXUpdateSubscription.h
@@ -0,0 +1,56 @@
+/*
+ * Copyright (c) 2017 Tarun Gupta
+ * Licensed under the simplified BSD license.
+ * See Documentation/Licenses/BSD-simplified.txt for more information.
+ */
+
+#pragma once
+
+#include <memory>
+#include <unordered_set>
+
+#include <boost/optional.hpp>
+
+#include <Swiften/Base/API.h>
+#include <Swiften/Elements/Payload.h>
+#include <Swiften/JID/JID.h>
+
+namespace Swift {
+ class SWIFTEN_API MIXUpdateSubscription : public Payload {
+
+ public:
+ using ref = std::shared_ptr<MIXUpdateSubscription>;
+
+ public:
+
+ MIXUpdateSubscription() {}
+
+ const boost::optional<JID>& getJID() const {
+ return jid_;
+ }
+
+ void setJID(JID jid) {
+ jid_ = jid;
+ }
+
+ const std::unordered_set<std::string>& getSubscriptions() const {
+ return subscribeItems_;
+ }
+
+ void setSubscriptions(std::unordered_set<std::string> values) {
+ subscribeItems_ = values ;
+ }
+
+ void addSubscription(std::string value) {
+ subscribeItems_.insert(value);
+ }
+
+ bool hasSubscription(const std::string& value) const {
+ return std::find(subscribeItems_.begin(), subscribeItems_.end(), value) != subscribeItems_.end();
+ }
+
+ private:
+ boost::optional<JID> jid_;
+ std::unordered_set<std::string> subscribeItems_;
+ };
+}
diff --git a/Swiften/Elements/PubSubItem.cpp b/Swiften/Elements/PubSubItem.cpp
index 4dc0907..b5f17cc 100644
--- a/Swiften/Elements/PubSubItem.cpp
+++ b/Swiften/Elements/PubSubItem.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2013 Isode Limited.
+ * Copyright (c) 2013-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -11,5 +11,8 @@ using namespace Swift;
PubSubItem::PubSubItem() {
}
+PubSubItem::PubSubItem(const std::string& id) : id_(id) {
+}
+
PubSubItem::~PubSubItem() {
}
diff --git a/Swiften/Elements/PubSubItem.h b/Swiften/Elements/PubSubItem.h
index ba13150..161b733 100644
--- a/Swiften/Elements/PubSubItem.h
+++ b/Swiften/Elements/PubSubItem.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2013-2017 Isode Limited.
+ * Copyright (c) 2013-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -18,32 +18,32 @@ namespace Swift {
public:
PubSubItem();
+ PubSubItem(const std::string& id);
virtual ~PubSubItem();
const std::vector< std::shared_ptr<Payload> >& getData() const {
- return data;
+ return data_;
}
void setData(const std::vector< std::shared_ptr<Payload> >& value) {
- this->data = value ;
+ this->data_ = value ;
}
void addData(std::shared_ptr<Payload> value) {
- this->data.push_back(value);
+ this->data_.push_back(value);
}
const std::string& getID() const {
- return id;
+ return id_;
}
void setID(const std::string& value) {
- this->id = value ;
+ this->id_ = value ;
}
-
private:
- std::vector< std::shared_ptr<Payload> > data;
- std::string id;
+ std::vector< std::shared_ptr<Payload> > data_;
+ std::string id_;
};
}
diff --git a/Swiften/Elements/PubSubItems.h b/Swiften/Elements/PubSubItems.h
index c60adca..c8b7f53 100644
--- a/Swiften/Elements/PubSubItems.h
+++ b/Swiften/Elements/PubSubItems.h
@@ -61,7 +61,6 @@ namespace Swift {
this->subscriptionID = value ;
}
-
private:
std::string node;
std::vector< std::shared_ptr<PubSubItem> > items;
diff --git a/Swiften/Elements/ReferencePayload.cpp b/Swiften/Elements/ReferencePayload.cpp
new file mode 100644
index 0000000..288f28f
--- /dev/null
+++ b/Swiften/Elements/ReferencePayload.cpp
@@ -0,0 +1,63 @@
+/*
+ * Copyright (c) 2018 Isode Limited.
+ * All rights reserved.
+ * See the COPYING file for more information.
+ */
+
+#include <Swiften/Elements/ReferencePayload.h>
+
+namespace Swift {
+
+ReferencePayload::ReferencePayload()
+ : type_(Type::Data) {
+}
+
+const ReferencePayload::Type& ReferencePayload::getType() const {
+ return type_;
+}
+
+void ReferencePayload::setType(const ReferencePayload::Type& type) {
+ type_ = type;
+}
+
+const boost::optional<std::string>& ReferencePayload::getUri() const {
+ return uri_;
+}
+
+void ReferencePayload::setUri(const boost::optional<std::string>& uri) {
+ uri_ = uri;
+}
+
+const boost::optional<std::string>& ReferencePayload::getBegin() const {
+ return begin_;
+}
+
+void ReferencePayload::setBegin(const boost::optional<std::string>& begin) {
+ begin_ = begin;
+}
+
+const boost::optional<std::string>& ReferencePayload::getEnd() const {
+ return end_;
+}
+
+void ReferencePayload::setEnd(const boost::optional<std::string>& end) {
+ end_ = end;
+}
+
+const boost::optional<std::string>& ReferencePayload::getAnchor() const {
+ return anchor_;
+}
+
+void ReferencePayload::setAnchor(const boost::optional<std::string>& anchor) {
+ anchor_ = anchor;
+}
+
+const std::vector<std::shared_ptr<Payload>>& ReferencePayload::getPayloads() const {
+ return payloads_;
+}
+
+void ReferencePayload::addPayload(const std::shared_ptr<Payload>& payload) {
+ payloads_.push_back(payload);
+}
+
+}
diff --git a/Swiften/Elements/ReferencePayload.h b/Swiften/Elements/ReferencePayload.h
new file mode 100644
index 0000000..b9a394e
--- /dev/null
+++ b/Swiften/Elements/ReferencePayload.h
@@ -0,0 +1,62 @@
+/*
+ * Copyright (c) 2018 Isode Limited.
+ * All rights reserved.
+ * See the COPYING file for more information.
+ */
+
+#pragma once
+
+#include <string>
+#include <vector>
+
+#include <boost/optional.hpp>
+
+#include <Swiften/Base/API.h>
+#include <Swiften/Elements/Payload.h>
+
+namespace Swift {
+ /**
+ * reference from XEP-0372
+ */
+ class SWIFTEN_API ReferencePayload : public Payload {
+
+ public:
+
+ typedef std::shared_ptr<ReferencePayload> ref;
+
+ enum class Type {
+ Data,
+ Mention,
+ PubSub,
+ Unknown
+ };
+
+ ReferencePayload();
+
+ const Type& getType() const;
+ const boost::optional<std::string>& getUri() const;
+ const boost::optional<std::string>& getBegin() const;
+ const boost::optional<std::string>& getEnd() const;
+ const boost::optional<std::string>& getAnchor() const;
+
+ const std::vector<std::shared_ptr<Payload>>& getPayloads() const;
+
+ void setType(const Type& type);
+ void setUri(const boost::optional<std::string>& uri);
+ void setBegin(const boost::optional<std::string>& begin);
+ void setEnd(const boost::optional<std::string>& end);
+ void setAnchor(const boost::optional<std::string>& anchor);
+
+ void addPayload(const std::shared_ptr<Payload>& payload);
+
+ private:
+
+ Type type_;
+ boost::optional<std::string> uri_;
+ boost::optional<std::string> begin_;
+ boost::optional<std::string> end_;
+ boost::optional<std::string> anchor_;
+
+ std::vector<std::shared_ptr<Payload>> payloads_;
+ };
+}
diff --git a/Swiften/Elements/S5BProxyRequest.h b/Swiften/Elements/S5BProxyRequest.h
index e3f5206..2fecae4 100644
--- a/Swiften/Elements/S5BProxyRequest.h
+++ b/Swiften/Elements/S5BProxyRequest.h
@@ -5,7 +5,7 @@
*/
/*
- * Copyright (c) 2015-2016 Isode Limited.
+ * Copyright (c) 2015-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -30,7 +30,7 @@ public:
public:
struct StreamHost {
std::string host;
- int port;
+ unsigned short port;
JID jid;
};
diff --git a/Swiften/Elements/SecurityLabel.h b/Swiften/Elements/SecurityLabel.h
index 0f0311e..fcaa610 100644
--- a/Swiften/Elements/SecurityLabel.h
+++ b/Swiften/Elements/SecurityLabel.h
@@ -15,6 +15,7 @@
namespace Swift {
class SWIFTEN_API SecurityLabel : public Payload {
public:
+ using ref = std::shared_ptr<SecurityLabel>;
SecurityLabel();
diff --git a/Swiften/Elements/StanzaAck.cpp b/Swiften/Elements/StanzaAck.cpp
index bd0b78d..dda97f5 100644
--- a/Swiften/Elements/StanzaAck.cpp
+++ b/Swiften/Elements/StanzaAck.cpp
@@ -1,19 +1,17 @@
/*
- * Copyright (c) 2013 Isode Limited.
+ * Copyright (c) 2013-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
#include <Swiften/Elements/StanzaAck.h>
-#include <boost/numeric/conversion/cast.hpp>
-
using namespace Swift;
StanzaAck::~StanzaAck() {
}
-void StanzaAck::setHandledStanzasCount(int i) {
- handledStanzasCount = boost::numeric_cast<unsigned int>(i);
+void StanzaAck::setHandledStanzasCount(unsigned int i) {
+ handledStanzasCount = i;
valid = true;
}
diff --git a/Swiften/Elements/StanzaAck.h b/Swiften/Elements/StanzaAck.h
index 68f0a2f..f664aca 100644
--- a/Swiften/Elements/StanzaAck.h
+++ b/Swiften/Elements/StanzaAck.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -24,7 +24,7 @@ namespace Swift {
return handledStanzasCount;
}
- void setHandledStanzasCount(int i);
+ void setHandledStanzasCount(unsigned int i);
bool isValid() const {
return valid;
diff --git a/Swiften/Elements/StreamError.h b/Swiften/Elements/StreamError.h
index aa294fd..6dda15c 100644
--- a/Swiften/Elements/StreamError.h
+++ b/Swiften/Elements/StreamError.h
@@ -27,7 +27,6 @@ namespace Swift {
ImproperAddressing,
InternalServerError,
InvalidFrom,
- InvalidID,
InvalidNamespace,
InvalidXML,
NotAuthorized,
@@ -41,6 +40,7 @@ namespace Swift {
SystemShutdown,
UndefinedCondition,
UnsupportedEncoding,
+ UnsupportedFeature,
UnsupportedStanzaType,
UnsupportedVersion
};
diff --git a/Swiften/Elements/StreamInitiationFileInfo.h b/Swiften/Elements/StreamInitiationFileInfo.h
index f2dc5b9..773814f 100644
--- a/Swiften/Elements/StreamInitiationFileInfo.h
+++ b/Swiften/Elements/StreamInitiationFileInfo.h
@@ -26,7 +26,7 @@ public:
name(name), description(description), size(size), hash(hash), date(date), algo(algo), supportsRangeRequests(false), rangeOffset(0) {}
void setName(const std::string& name) {
- this->name = name;;
+ this->name = name;
}
const std::string& getName() const {
diff --git a/Swiften/Entity/PayloadPersister.cpp b/Swiften/Entity/PayloadPersister.cpp
index 3fd246c..fe51d86 100644
--- a/Swiften/Entity/PayloadPersister.cpp
+++ b/Swiften/Entity/PayloadPersister.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2011-2016 Isode Limited.
+ * Copyright (c) 2011-2019 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -34,7 +34,7 @@ void PayloadPersister::savePayload(std::shared_ptr<Payload> payload, const boost
file.close();
}
catch (const boost::filesystem::filesystem_error& e) {
- SWIFT_LOG(error) << e.what() << std::endl;
+ SWIFT_LOG(error) << e.what();
}
}
@@ -50,7 +50,7 @@ std::shared_ptr<Payload> PayloadPersister::loadPayload(const boost::filesystem::
}
}
catch (const boost::filesystem::filesystem_error& e) {
- SWIFT_LOG(error) << e.what() << std::endl;
+ SWIFT_LOG(error) << e.what();
}
return std::shared_ptr<Payload>();
}
diff --git a/Swiften/EventLoop/BoostASIOEventLoop.cpp b/Swiften/EventLoop/BoostASIOEventLoop.cpp
index 30143b9..45dd4a2 100644
--- a/Swiften/EventLoop/BoostASIOEventLoop.cpp
+++ b/Swiften/EventLoop/BoostASIOEventLoop.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2015-2016 Isode Limited.
+ * Copyright (c) 2015-2019 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -23,7 +23,7 @@ void BoostASIOEventLoop::handleASIOEvent() {
std::unique_lock<std::recursive_mutex> lock(isEventInASIOEventLoopMutex_);
isEventInASIOEventLoop_ = false;
}
- handleNextEvents();
+ handleNextEvent();
}
void BoostASIOEventLoop::eventPosted() {
diff --git a/Swiften/EventLoop/Cocoa/CocoaEventLoop.mm b/Swiften/EventLoop/Cocoa/CocoaEventLoop.mm
index b8ab621..39dc7ec 100644
--- a/Swiften/EventLoop/Cocoa/CocoaEventLoop.mm
+++ b/Swiften/EventLoop/Cocoa/CocoaEventLoop.mm
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2015-2016 Isode Limited.
+ * Copyright (c) 2015-2019 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -23,7 +23,7 @@ void CocoaEventLoop::handleNextCocoaEvent() {
std::unique_lock<std::recursive_mutex> lock(isEventInCocoaEventLoopMutex_);
isEventInCocoaEventLoop_ = false;
}
- handleNextEvents();
+ handleNextEvent();
}
void CocoaEventLoop::eventPosted() {
diff --git a/Swiften/EventLoop/DummyEventLoop.cpp b/Swiften/EventLoop/DummyEventLoop.cpp
index 4dfbac3..234ba7a 100644
--- a/Swiften/EventLoop/DummyEventLoop.cpp
+++ b/Swiften/EventLoop/DummyEventLoop.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2019 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -15,14 +15,14 @@ DummyEventLoop::DummyEventLoop() {
DummyEventLoop::~DummyEventLoop() {
if (hasEvents()) {
- SWIFT_LOG(warning) << "DummyEventLoop: Unhandled events at destruction time" << std::endl;
+ SWIFT_LOG(warning) << "DummyEventLoop: Unhandled events at destruction time";
}
}
void DummyEventLoop::processEvents() {
while(hasEvents()) {
hasEvents_ = false;
- handleNextEvents();
+ handleNextEvent();
}
}
diff --git a/Swiften/EventLoop/EventLoop.cpp b/Swiften/EventLoop/EventLoop.cpp
index 186616f..1852f3f 100644
--- a/Swiften/EventLoop/EventLoop.cpp
+++ b/Swiften/EventLoop/EventLoop.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2019 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -10,15 +10,10 @@
#include <cassert>
#include <vector>
-#include <boost/bind.hpp>
-#include <boost/lambda/bind.hpp>
-#include <boost/lambda/lambda.hpp>
#include <boost/optional.hpp>
#include <Swiften/Base/Log.h>
-namespace lambda = boost::lambda;
-
namespace Swift {
inline void invokeCallback(const Event& event) {
@@ -27,10 +22,10 @@ inline void invokeCallback(const Event& event) {
event.callback();
}
catch (const std::exception& e) {
- SWIFT_LOG(error) << "Uncaught exception in event loop: " << e.what() << std::endl;
+ SWIFT_LOG(error) << "Uncaught exception in event loop: " << e.what();
}
catch (...) {
- SWIFT_LOG(error) << "Uncaught non-exception in event loop" << std::endl;
+ SWIFT_LOG(error) << "Uncaught non-exception in event loop";
}
}
@@ -40,9 +35,8 @@ EventLoop::EventLoop() : nextEventID_(0), handlingEvents_(false) {
EventLoop::~EventLoop() {
}
-void EventLoop::handleNextEvents() {
- const int eventsBatched = 100;
- // If handleNextEvents is already in progress, e.g. in case of a recursive call due to
+void EventLoop::handleNextEvent() {
+ // If handleNextEvent is already in progress, e.g. in case of a recursive call due to
// the event loop implementation, then do no handle further events. Instead call
// eventPosted() to continue event handling later.
bool callEventPosted = handlingEvents_;
@@ -50,19 +44,17 @@ void EventLoop::handleNextEvents() {
handlingEvents_ = true;
std::unique_lock<std::recursive_mutex> lock(removeEventsMutex_);
{
- std::vector<Event> nextEvents;
+ boost::optional<Event> nextEvent;
{
- std::unique_lock<std::recursive_mutex> lock(eventsMutex_);
- for (int n = 0; ((n < eventsBatched) && !events_.empty()); n++) {
- nextEvents.push_back(events_.front());
+ std::unique_lock<std::recursive_mutex> eventsLock(eventsMutex_);
+ if (!events_.empty()) {
+ nextEvent = events_.front();
events_.pop_front();
}
callEventPosted = !events_.empty();
}
- if (!nextEvents.empty()) {
- for (const auto& event : nextEvents) {
- invokeCallback(event);
- }
+ if (nextEvent) {
+ invokeCallback(*nextEvent);
}
}
handlingEvents_ = false;
@@ -96,7 +88,9 @@ void EventLoop::removeEventsFromOwner(std::shared_ptr<EventOwner> owner) {
std::lock(removeLock, eventsLock);
- events_.remove_if(lambda::bind(&Event::owner, lambda::_1) == owner);
+ events_.remove_if([&](const Event& event) {
+ return event.owner == owner;
+ });
}
}
diff --git a/Swiften/EventLoop/EventLoop.h b/Swiften/EventLoop/EventLoop.h
index 06b9fbb..f61b9bc 100644
--- a/Swiften/EventLoop/EventLoop.h
+++ b/Swiften/EventLoop/EventLoop.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2019 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -43,21 +43,20 @@ namespace Swift {
protected:
/**
- * The \ref handleNextEvents method is called by an implementation of the abstract \ref EventLoop class
+ * The \ref handleNextEvent method is called by an implementation of the abstract \ref EventLoop class
* at any point after the virtual \ref eventPosted method has been called.
* This method does not block, except for short-time synchronization.
- * It can process multiple events before it reutrns.
* If called recursively, the event queue is not further processed. Instead, \ref eventPosted
* is called to notify the implementing event loop of the non-empty event queue.
- * It is recommended to not call \ref handleNextEvents inside an event posted to the event loop
+ * It is recommended to not call \ref handleNextEvent inside an event posted to the event loop
* as this can lead to an infinite loop.
*/
- void handleNextEvents();
+ void handleNextEvent();
/**
* The \ref eventPosted virtual method serves as notification for when events are still available in the queue.
* It is called after the first event is posted to an empty queue or after an event has been handled in
- * \ref handleNextEvents and there are still remaining events in the queue.
+ * \ref handleNextEvent and there are still remaining events in the queue.
*/
virtual void eventPosted() = 0;
diff --git a/Swiften/EventLoop/Qt/QtEventLoop.h b/Swiften/EventLoop/Qt/QtEventLoop.h
index b1644c2..cf374ab 100644
--- a/Swiften/EventLoop/Qt/QtEventLoop.h
+++ b/Swiften/EventLoop/Qt/QtEventLoop.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2019 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -38,7 +38,7 @@ namespace Swift {
std::unique_lock<std::recursive_mutex> lock(isEventInQtEventLoopMutex_);
isEventInQtEventLoop_ = false;
}
- handleNextEvents();
+ handleNextEvent();
//event->deleteLater(); FIXME: Leak?
return true;
}
diff --git a/Swiften/EventLoop/SimpleEventLoop.cpp b/Swiften/EventLoop/SimpleEventLoop.cpp
index cac04e4..745fadb 100644
--- a/Swiften/EventLoop/SimpleEventLoop.cpp
+++ b/Swiften/EventLoop/SimpleEventLoop.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2019 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -34,7 +34,7 @@ void SimpleEventLoop::doRun(bool breakAfterEvents) {
}
void SimpleEventLoop::runOnce() {
- handleNextEvents();
+ handleNextEvent();
}
void SimpleEventLoop::stop() {
diff --git a/Swiften/EventLoop/SingleThreadedEventLoop.cpp b/Swiften/EventLoop/SingleThreadedEventLoop.cpp
index 0542f37..89b4460 100644
--- a/Swiften/EventLoop/SingleThreadedEventLoop.cpp
+++ b/Swiften/EventLoop/SingleThreadedEventLoop.cpp
@@ -5,7 +5,7 @@
*/
/*
- * Copyright (c) 2016 Isode Limited.
+ * Copyright (c) 2016-2019 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -43,7 +43,7 @@ void SingleThreadedEventLoop::handleEvents() {
std::lock_guard<std::mutex> lock(eventAvailableMutex_);
eventAvailable_ = false;
}
- handleNextEvents();
+ handleNextEvent();
}
void SingleThreadedEventLoop::stop() {
diff --git a/Swiften/EventLoop/UnitTest/EventLoopTest.cpp b/Swiften/EventLoop/UnitTest/EventLoopTest.cpp
index 00a4376..26c56d3 100644
--- a/Swiften/EventLoop/UnitTest/EventLoopTest.cpp
+++ b/Swiften/EventLoop/UnitTest/EventLoopTest.cpp
@@ -23,6 +23,7 @@ class EventLoopTest : public CppUnit::TestFixture {
CPPUNIT_TEST(testPost);
CPPUNIT_TEST(testRemove);
CPPUNIT_TEST(testHandleEvent_Recursive);
+ CPPUNIT_TEST(testHandleEvent_FirstEventRemovesSecondEvent);
CPPUNIT_TEST_SUITE_END();
public:
@@ -74,6 +75,18 @@ class EventLoopTest : public CppUnit::TestFixture {
CPPUNIT_ASSERT_EQUAL(1, events_[1]);
}
+ void testHandleEvent_FirstEventRemovesSecondEvent() {
+ DummyEventLoop testling;
+ auto eventOwner = std::make_shared<MyEventOwner>();
+ auto secondEventFired = false;
+
+ testling.postEvent([&](){ testling.removeEventsFromOwner(eventOwner); }, eventOwner);
+ testling.postEvent([&](){ secondEventFired = true; }, eventOwner);
+ testling.processEvents();
+
+ CPPUNIT_ASSERT_EQUAL(false, secondEventFired);
+ }
+
private:
struct MyEventOwner : public EventOwner {};
void logEvent(int i) {
diff --git a/Swiften/Examples/ConnectivityTest/ConnectivityTest.cpp b/Swiften/Examples/ConnectivityTest/ConnectivityTest.cpp
index 607038f..cc783c6 100644
--- a/Swiften/Examples/ConnectivityTest/ConnectivityTest.cpp
+++ b/Swiften/Examples/ConnectivityTest/ConnectivityTest.cpp
@@ -77,7 +77,7 @@ int main(int argc, char* argv[]) {
ClientXMLTracer* tracer = new ClientXMLTracer(client);
client->onConnected.connect(&handleConnected);
errorConnection = client->onDisconnected.connect(&handleDisconnected);
- std::cout << "Connecting to JID " << jid << " with timeout " << timeout << "ms on host: "; ;
+ std::cout << "Connecting to JID " << jid << " with timeout " << timeout << "ms on host: ";
if (!connectHost.empty()) {
std::cout << connectHost << std::endl;
ClientOptions options;
diff --git a/Swiften/Examples/SendFile/ReceiveFile.cpp b/Swiften/Examples/SendFile/ReceiveFile.cpp
index 193c1b7..d641662 100644
--- a/Swiften/Examples/SendFile/ReceiveFile.cpp
+++ b/Swiften/Examples/SendFile/ReceiveFile.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2019 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -80,7 +80,7 @@ class FileReceiver {
}
void handleIncomingFileTransfer(IncomingFileTransfer::ref transfer) {
- SWIFT_LOG(debug) << "foo" << std::endl;
+ SWIFT_LOG(debug) << "foo";
incomingFileTransfers.push_back(transfer);
std::shared_ptr<FileWriteBytestream> out = std::make_shared<FileWriteBytestream>("out");
transfer->onFinished.connect(boost::bind(&FileReceiver::handleFileTransferFinished, this, _1, out));
diff --git a/Swiften/FileTransfer/ByteArrayReadBytestream.cpp b/Swiften/FileTransfer/ByteArrayReadBytestream.cpp
index cd9fa4a..3fdff27 100644
--- a/Swiften/FileTransfer/ByteArrayReadBytestream.cpp
+++ b/Swiften/FileTransfer/ByteArrayReadBytestream.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -19,13 +19,19 @@ std::shared_ptr<ByteArray> ByteArrayReadBytestream::read(size_t size) {
if (position + readSize > data.size()) {
readSize = data.size() - position;
}
- std::shared_ptr<ByteArray> result = std::make_shared<ByteArray>(
- data.begin() + boost::numeric_cast<long long>(position),
- data.begin() + boost::numeric_cast<long long>(position) + boost::numeric_cast<long long>(readSize));
-
- onRead(*result);
- position += readSize;
- return result;
+ try {
+ std::shared_ptr<ByteArray> result = std::make_shared<ByteArray>(
+ data.begin() + boost::numeric_cast<long long>(position),
+ data.begin() + boost::numeric_cast<long long>(position) + boost::numeric_cast<long long>(readSize));
+ onRead(*result);
+ position += readSize;
+ return result;
+ }
+ catch (const boost::numeric::bad_numeric_cast&) {
+ // If we cannot cast to long long, we probably ran out of memory long ago
+ assert(false);
+ return {};
+ }
}
void ByteArrayReadBytestream::addData(const std::vector<unsigned char>& moreData) {
diff --git a/Swiften/FileTransfer/DefaultFileTransferTransporter.cpp b/Swiften/FileTransfer/DefaultFileTransferTransporter.cpp
index c6987c0..ae3d7e0 100644
--- a/Swiften/FileTransfer/DefaultFileTransferTransporter.cpp
+++ b/Swiften/FileTransfer/DefaultFileTransferTransporter.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2013-2016 Isode Limited.
+ * Copyright (c) 2013-2019 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -133,7 +133,7 @@ void DefaultFileTransferTransporter::handleActivateProxySessionResult(const std:
void DefaultFileTransferTransporter::startActivatingProxy(const JID& proxyServiceJID) {
// activate proxy
- SWIFT_LOG(debug) << "Start activating proxy " << proxyServiceJID.toString() << " with sid = " << s5bSessionID << "." << std::endl;
+ SWIFT_LOG(debug) << "Start activating proxy " << proxyServiceJID.toString() << " with sid = " << s5bSessionID << ".";
S5BProxyRequest::ref proxyRequest = std::make_shared<S5BProxyRequest>();
proxyRequest->setSID(s5bSessionID);
proxyRequest->setActivate(role == Initiator ? responder : initiator);
@@ -207,7 +207,7 @@ std::shared_ptr<TransportSession> DefaultFileTransferTransporter::createLocalCan
transportSession = std::make_shared<S5BTransportSession<SOCKS5BytestreamClientSession> >(proxySession, stream);
}
else {
- SWIFT_LOG(error) << "Failed obtaining proxy session with candidate JID " << candidate.jid << " and dstAddr " << getLocalCandidateSOCKS5DstAddr() << "." << std::endl;
+ SWIFT_LOG(error) << "Failed obtaining proxy session with candidate JID " << candidate.jid << " and dstAddr " << getLocalCandidateSOCKS5DstAddr() << ".";
}
}
@@ -234,7 +234,7 @@ std::shared_ptr<TransportSession> DefaultFileTransferTransporter::createLocalCan
transportSession = std::make_shared<S5BTransportSession<SOCKS5BytestreamClientSession> >(proxySession, stream);
}
else {
- SWIFT_LOG(error) << "Failed obtaining proxy session with candidate JID " << candidate.jid << " and dstAddr " << getLocalCandidateSOCKS5DstAddr() << "." << std::endl;
+ SWIFT_LOG(error) << "Failed obtaining proxy session with candidate JID " << candidate.jid << " and dstAddr " << getLocalCandidateSOCKS5DstAddr() << ".";
}
}
@@ -255,11 +255,11 @@ std::string DefaultFileTransferTransporter::getSOCKS5DstAddr() const {
std::string result;
if (role == Initiator) {
result = getInitiatorCandidateSOCKS5DstAddr();
- SWIFT_LOG(debug) << "Initiator S5B DST.ADDR = " << s5bSessionID << " + " << initiator.toString() << " + " << responder.toString() << " : " << result << std::endl;
+ SWIFT_LOG(debug) << "Initiator S5B DST.ADDR = " << s5bSessionID << " + " << initiator.toString() << " + " << responder.toString() << " : " << result;
}
else {
result = getResponderCandidateSOCKS5DstAddr();
- SWIFT_LOG(debug) << "Responder S5B DST.ADDR = " << s5bSessionID << " + " << responder.toString() << " + " << initiator.toString() << " : " << result << std::endl;
+ SWIFT_LOG(debug) << "Responder S5B DST.ADDR = " << s5bSessionID << " + " << responder.toString() << " + " << initiator.toString() << " : " << result;
}
return result;
}
diff --git a/Swiften/FileTransfer/FailingTransportSession.cpp b/Swiften/FileTransfer/FailingTransportSession.cpp
index d1eb6a6..b9c79a0 100644
--- a/Swiften/FileTransfer/FailingTransportSession.cpp
+++ b/Swiften/FileTransfer/FailingTransportSession.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2016 Isode Limited.
+ * Copyright (c) 2016-2019 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -14,7 +14,7 @@ FailingTransportSession::~FailingTransportSession() {
}
void FailingTransportSession::start() {
- SWIFT_LOG(error) << "Trying to start failing transport." << std::endl;
+ SWIFT_LOG(error) << "Trying to start failing transport.";
onFinished(FileTransferError(FileTransferError::PeerError));
}
diff --git a/Swiften/FileTransfer/FileTransferManagerImpl.cpp b/Swiften/FileTransfer/FileTransferManagerImpl.cpp
index 05dd3bb..98eb50e 100644
--- a/Swiften/FileTransfer/FileTransferManagerImpl.cpp
+++ b/Swiften/FileTransfer/FileTransferManagerImpl.cpp
@@ -5,7 +5,7 @@
*/
/*
- * Copyright (c) 2013-2016 Isode Limited.
+ * Copyright (c) 2013-2019 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -156,7 +156,7 @@ OutgoingFileTransfer::ref FileTransferManagerImpl::createOutgoingFileTransfer(
}
}
else {
- SWIFT_LOG(warning) << "No entity capabilities information for " << receipient.toString() << std::endl;
+ SWIFT_LOG(warning) << "No entity capabilities information for " << receipient.toString();
}
return outgoingFTManager->createOutgoingFileTransfer(iqRouter->getJID(), receipient, bytestream, fileInfo, options);
diff --git a/Swiften/FileTransfer/IBBSendSession.cpp b/Swiften/FileTransfer/IBBSendSession.cpp
index e51c91c..258412b 100644
--- a/Swiften/FileTransfer/IBBSendSession.cpp
+++ b/Swiften/FileTransfer/IBBSendSession.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -40,7 +40,7 @@ IBBSendSession::~IBBSendSession() {
void IBBSendSession::start() {
IBBRequest::ref request = IBBRequest::create(
- from, to, IBB::createIBBOpen(id, boost::numeric_cast<int>(blockSize)), router);
+ from, to, IBB::createIBBOpen(id, blockSize), router);
request->onResponse.connect(boost::bind(&IBBSendSession::handleIBBResponse, this, _1, _2));
active = true;
request->send();
diff --git a/Swiften/FileTransfer/IncomingJingleFileTransfer.cpp b/Swiften/FileTransfer/IncomingJingleFileTransfer.cpp
index d5de5e4..7c46c60 100644
--- a/Swiften/FileTransfer/IncomingJingleFileTransfer.cpp
+++ b/Swiften/FileTransfer/IncomingJingleFileTransfer.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2011-2016 Isode Limited.
+ * Copyright (c) 2011-2019 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -67,8 +67,8 @@ IncomingJingleFileTransfer::~IncomingJingleFileTransfer() {
void IncomingJingleFileTransfer::accept(
std::shared_ptr<WriteBytestream> stream,
const FileTransferOptions& options) {
- SWIFT_LOG(debug) << std::endl;
- if (state != Initial) { SWIFT_LOG(warning) << "Incorrect state" << std::endl; return; }
+ SWIFT_LOG(debug);
+ if (state != Initial) { SWIFT_LOG(warning) << "Incorrect state"; return; }
assert(!this->stream);
this->stream = stream;
@@ -85,7 +85,7 @@ void IncomingJingleFileTransfer::accept(
JingleS5BTransportPayload::ref s5bTransport = initialContent->getTransport<JingleS5BTransportPayload>();
JingleIBBTransportPayload::ref ibbTransport = initialContent->getTransport<JingleIBBTransportPayload>();
if (s5bTransport) {
- SWIFT_LOG(debug) << "Got S5B transport as initial payload." << std::endl;
+ SWIFT_LOG(debug) << "Got S5B transport as initial payload.";
setTransporter(transporterFactory->createResponderTransporter(
getInitiator(), getResponder(), s5bTransport->getSessionID(), options));
transporter->addRemoteCandidates(s5bTransport->getCandidates(), s5bTransport->getDstAddr());
@@ -93,7 +93,7 @@ void IncomingJingleFileTransfer::accept(
transporter->startGeneratingLocalCandidates();
}
else if (ibbTransport && options.isInBandAllowed()) {
- SWIFT_LOG(debug) << "Got IBB transport as initial payload." << std::endl;
+ SWIFT_LOG(debug) << "Got IBB transport as initial payload.";
setTransporter(transporterFactory->createResponderTransporter(
getInitiator(), getResponder(), ibbTransport->getSessionID(), options));
@@ -112,7 +112,7 @@ void IncomingJingleFileTransfer::accept(
}
void IncomingJingleFileTransfer::cancel() {
- SWIFT_LOG(debug) << std::endl;
+ SWIFT_LOG(debug);
terminate(state == Initial ? JinglePayload::Reason::Decline : JinglePayload::Reason::Cancel);
}
@@ -120,8 +120,8 @@ void IncomingJingleFileTransfer::handleLocalTransportCandidatesGenerated(
const std::string& s5bSessionID,
const std::vector<JingleS5BTransportPayload::Candidate>& candidates,
const std::string& dstAddr) {
- SWIFT_LOG(debug) << std::endl;
- if (state != GeneratingInitialLocalCandidates) { SWIFT_LOG(warning) << "Incorrect state" << std::endl; return; }
+ SWIFT_LOG(debug);
+ if (state != GeneratingInitialLocalCandidates) { SWIFT_LOG(warning) << "Incorrect state"; return; }
fillCandidateMap(localCandidates, candidates);
@@ -140,11 +140,11 @@ void IncomingJingleFileTransfer::handleLocalTransportCandidatesGenerated(
void IncomingJingleFileTransfer::handleSessionInfoReceived(JinglePayload::ref jinglePayload) {
- SWIFT_LOG(debug) << std::endl;
+ SWIFT_LOG(debug);
JingleFileTransferHash::ref transferHash = jinglePayload->getPayload<JingleFileTransferHash>();
if (transferHash) {
- SWIFT_LOG(debug) << "Received hash information." << std::endl;
+ SWIFT_LOG(debug) << "Received hash information.";
waitOnHashTimer->stop();
if (transferHash->getFileInfo().getHashes().find("sha-1") != transferHash->getFileInfo().getHashes().end()) {
hashes["sha-1"] = transferHash->getFileInfo().getHash("sha-1").get();
@@ -157,16 +157,16 @@ void IncomingJingleFileTransfer::handleSessionInfoReceived(JinglePayload::ref ji
}
}
else {
- SWIFT_LOG(debug) << "Ignoring unknown session info" << std::endl;
+ SWIFT_LOG(debug) << "Ignoring unknown session info";
}
}
void IncomingJingleFileTransfer::handleSessionTerminateReceived(boost::optional<JinglePayload::Reason> reason) {
- SWIFT_LOG(debug) << std::endl;
- if (state == Finished) { SWIFT_LOG(warning) << "Incorrect state" << std::endl; return; }
+ SWIFT_LOG(debug);
+ if (state == Finished) { SWIFT_LOG(warning) << "Incorrect state"; return; }
if (state == Finished) {
- SWIFT_LOG(debug) << "Already terminated" << std::endl;
+ SWIFT_LOG(debug) << "Already terminated";
return;
}
@@ -187,21 +187,21 @@ void IncomingJingleFileTransfer::checkHashAndTerminate() {
terminate(JinglePayload::Reason::Success);
}
else {
- SWIFT_LOG(warning) << "Hash verification failed" << std::endl;
+ SWIFT_LOG(warning) << "Hash verification failed";
terminate(JinglePayload::Reason::MediaError);
}
}
void IncomingJingleFileTransfer::checkIfAllDataReceived() {
if (receivedBytes == getFileSizeInBytes()) {
- SWIFT_LOG(debug) << "All data received." << std::endl;
+ SWIFT_LOG(debug) << "All data received.";
bool hashInfoAvailable = false;
for (const auto& hashElement : hashes) {
hashInfoAvailable |= !hashElement.second.empty();
}
if (!hashInfoAvailable) {
- SWIFT_LOG(debug) << "No hash information yet. Waiting a while on hash info." << std::endl;
+ SWIFT_LOG(debug) << "No hash information yet. Waiting a while on hash info.";
setState(WaitingForHash);
waitOnHashTimer->start();
}
@@ -210,7 +210,7 @@ void IncomingJingleFileTransfer::checkIfAllDataReceived() {
}
}
else if (receivedBytes > getFileSizeInBytes()) {
- SWIFT_LOG(debug) << "We got more than we could handle!" << std::endl;
+ SWIFT_LOG(debug) << "We got more than we could handle!";
terminate(JinglePayload::Reason::MediaError);
}
}
@@ -225,15 +225,15 @@ void IncomingJingleFileTransfer::handleWriteStreamDataReceived(
void IncomingJingleFileTransfer::handleTransportReplaceReceived(
const JingleContentID& content, JingleTransportPayload::ref transport) {
- SWIFT_LOG(debug) << std::endl;
+ SWIFT_LOG(debug);
if (state != WaitingForFallbackOrTerminate) {
- SWIFT_LOG(warning) << "Incorrect state" << std::endl;
+ SWIFT_LOG(warning) << "Incorrect state";
return;
}
JingleIBBTransportPayload::ref ibbTransport;
if (options.isInBandAllowed() && (ibbTransport = std::dynamic_pointer_cast<JingleIBBTransportPayload>(transport))) {
- SWIFT_LOG(debug) << "transport replaced with IBB" << std::endl;
+ SWIFT_LOG(debug) << "transport replaced with IBB";
startTransferring(transporter->createIBBReceiveSession(
ibbTransport->getSessionID(),
@@ -242,7 +242,7 @@ void IncomingJingleFileTransfer::handleTransportReplaceReceived(
session->sendTransportAccept(content, ibbTransport);
}
else {
- SWIFT_LOG(debug) << "Unknown replace transport" << std::endl;
+ SWIFT_LOG(debug) << "Unknown replace transport";
session->sendTransportReject(content, transport);
}
}
@@ -253,25 +253,25 @@ JingleContentID IncomingJingleFileTransfer::getContentID() const {
bool IncomingJingleFileTransfer::verifyData() {
if (hashes.empty()) {
- SWIFT_LOG(debug) << "no verification possible, skipping" << std::endl;
+ SWIFT_LOG(debug) << "no verification possible, skipping";
return true;
}
if (hashes.find("sha-1") != hashes.end()) {
- SWIFT_LOG(debug) << "Verify SHA-1 hash: " << (hashes["sha-1"] == hashCalculator->getSHA1Hash()) << std::endl;
+ SWIFT_LOG(debug) << "Verify SHA-1 hash: " << (hashes["sha-1"] == hashCalculator->getSHA1Hash());
return hashes["sha-1"] == hashCalculator->getSHA1Hash();
}
else if (hashes.find("md5") != hashes.end()) {
- SWIFT_LOG(debug) << "Verify MD5 hash: " << (hashes["md5"] == hashCalculator->getMD5Hash()) << std::endl;
+ SWIFT_LOG(debug) << "Verify MD5 hash: " << (hashes["md5"] == hashCalculator->getMD5Hash());
return hashes["md5"] == hashCalculator->getMD5Hash();
}
else {
- SWIFT_LOG(debug) << "Unknown hash, skipping" << std::endl;
+ SWIFT_LOG(debug) << "Unknown hash, skipping";
return true;
}
}
void IncomingJingleFileTransfer::handleWaitOnHashTimerTicked() {
- SWIFT_LOG(debug) << std::endl;
+ SWIFT_LOG(debug);
waitOnHashTimer->stop();
terminate(JinglePayload::Reason::Success);
}
@@ -285,14 +285,14 @@ const JID& IncomingJingleFileTransfer::getRecipient() const {
}
void IncomingJingleFileTransfer::setState(State state) {
- SWIFT_LOG(debug) << state << std::endl;
+ SWIFT_LOG(debug) << state;
this->state = state;
onStateChanged(FileTransfer::State(getExternalState(state)));
}
void IncomingJingleFileTransfer::setFinishedState(
FileTransfer::State::Type type, const boost::optional<FileTransferError>& error) {
- SWIFT_LOG(debug) << std::endl;
+ SWIFT_LOG(debug);
this->state = Finished;
onStateChanged(type);
onFinished(error);
@@ -340,7 +340,7 @@ void IncomingJingleFileTransfer::stopAll() {
transportSession->stop();
transportSession.reset();
break;
- case Finished: SWIFT_LOG(warning) << "Already finished" << std::endl; break;
+ case Finished: SWIFT_LOG(warning) << "Already finished"; break;
}
if (state != Initial) {
removeTransporter();
@@ -356,7 +356,7 @@ void IncomingJingleFileTransfer::fallback() {
}
void IncomingJingleFileTransfer::startTransferViaRemoteCandidate() {
- SWIFT_LOG(debug) << std::endl;
+ SWIFT_LOG(debug);
if (ourCandidateChoice->type == JingleS5BTransportPayload::Candidate::ProxyType) {
setState(WaitingForPeerProxyActivate);
@@ -367,7 +367,7 @@ void IncomingJingleFileTransfer::startTransferViaRemoteCandidate() {
}
void IncomingJingleFileTransfer::startTransferViaLocalCandidate() {
- SWIFT_LOG(debug) << std::endl;
+ SWIFT_LOG(debug);
if (theirCandidateChoice->type == JingleS5BTransportPayload::Candidate::ProxyType) {
setState(WaitingForLocalProxyActivate);
@@ -379,7 +379,7 @@ void IncomingJingleFileTransfer::startTransferViaLocalCandidate() {
}
void IncomingJingleFileTransfer::startTransferring(std::shared_ptr<TransportSession> transportSession) {
- SWIFT_LOG(debug) << std::endl;
+ SWIFT_LOG(debug);
this->transportSession = transportSession;
transferFinishedConnection = transportSession->onFinished.connect(
@@ -409,7 +409,7 @@ std::shared_ptr<TransportSession> IncomingJingleFileTransfer::createRemoteCandid
}
void IncomingJingleFileTransfer::terminate(JinglePayload::Reason::Type reason) {
- SWIFT_LOG(debug) << reason << std::endl;
+ SWIFT_LOG(debug) << reason;
if (state != Finished) {
session->sendTerminate(reason);
diff --git a/Swiften/FileTransfer/IncrementalBytestreamHashCalculator.cpp b/Swiften/FileTransfer/IncrementalBytestreamHashCalculator.cpp
index f177304..faddcb9 100644
--- a/Swiften/FileTransfer/IncrementalBytestreamHashCalculator.cpp
+++ b/Swiften/FileTransfer/IncrementalBytestreamHashCalculator.cpp
@@ -64,12 +64,12 @@ ByteArray IncrementalBytestreamHashCalculator::getMD5Hash() {
std::string IncrementalBytestreamHashCalculator::getSHA1String() {
assert(sha1Hasher);
- return Hexify::hexify(getSHA1Hash());;
+ return Hexify::hexify(getSHA1Hash());
}
std::string IncrementalBytestreamHashCalculator::getMD5String() {
assert(md5Hasher);
- return Hexify::hexify(getMD5Hash());;
+ return Hexify::hexify(getMD5Hash());
}
}
diff --git a/Swiften/FileTransfer/JingleFileTransfer.cpp b/Swiften/FileTransfer/JingleFileTransfer.cpp
index 62c3a53..3d05db9 100644
--- a/Swiften/FileTransfer/JingleFileTransfer.cpp
+++ b/Swiften/FileTransfer/JingleFileTransfer.cpp
@@ -1,13 +1,11 @@
/*
- * Copyright (c) 2013-2016 Isode Limited.
+ * Copyright (c) 2013-2019 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
#include <Swiften/FileTransfer/JingleFileTransfer.h>
-#include <boost/typeof/typeof.hpp>
-
#include <Swiften/Base/Log.h>
#include <Swiften/Crypto/CryptoProvider.h>
#include <Swiften/FileTransfer/FileTransferTransporter.h>
@@ -29,7 +27,6 @@ JingleFileTransfer::JingleFileTransfer(
theirCandidateSelectFinished(false) {
session->addListener(this);
-
}
JingleFileTransfer::~JingleFileTransfer() {
@@ -81,7 +78,7 @@ boost::optional<FileTransferError> JingleFileTransfer::getFileTransferError(Jing
void JingleFileTransfer::handleRemoteTransportCandidateSelectFinished(
const std::string& s5bSessionID, const boost::optional<JingleS5BTransportPayload::Candidate>& candidate) {
- SWIFT_LOG(debug) << std::endl;
+ SWIFT_LOG(debug);
ourCandidateChoice = candidate;
ourCandidateSelectFinished = true;
@@ -101,42 +98,42 @@ void JingleFileTransfer::handleRemoteTransportCandidateSelectFinished(
// decide on candidates according to http://xmpp.org/extensions/xep-0260.html#complete
void JingleFileTransfer::decideOnCandidates() {
- SWIFT_LOG(debug) << std::endl;
+ SWIFT_LOG(debug);
if (!ourCandidateSelectFinished || !theirCandidateSelectFinished) {
- SWIFT_LOG(debug) << "Can't make a decision yet!" << std::endl;
+ SWIFT_LOG(debug) << "Can't make a decision yet!";
return;
}
if (!ourCandidateChoice && !theirCandidateChoice) {
- SWIFT_LOG(debug) << "No candidates succeeded." << std::endl;
+ SWIFT_LOG(debug) << "No candidates succeeded.";
fallback();
}
else if (ourCandidateChoice && !theirCandidateChoice) {
- SWIFT_LOG(debug) << "Start transfer using remote candidate: " << ourCandidateChoice.get().cid << "." << std::endl;
+ SWIFT_LOG(debug) << "Start transfer using remote candidate: " << ourCandidateChoice.get().cid << ".";
startTransferViaRemoteCandidate();
}
else if (theirCandidateChoice && !ourCandidateChoice) {
- SWIFT_LOG(debug) << "Start transfer using local candidate: " << theirCandidateChoice.get().cid << "." << std::endl;
+ SWIFT_LOG(debug) << "Start transfer using local candidate: " << theirCandidateChoice.get().cid << ".";
startTransferViaLocalCandidate();
}
else {
SWIFT_LOG(debug) << "Choosing between candidates "
<< ourCandidateChoice->cid << "(" << ourCandidateChoice->priority << ")" << " and "
- << theirCandidateChoice->cid << "(" << theirCandidateChoice->priority << ")" << std::endl;
+ << theirCandidateChoice->cid << "(" << theirCandidateChoice->priority << ")";
if (ourCandidateChoice->priority > theirCandidateChoice->priority) {
- SWIFT_LOG(debug) << "Start transfer using remote candidate: " << ourCandidateChoice.get().cid << "." << std::endl;
+ SWIFT_LOG(debug) << "Start transfer using remote candidate: " << ourCandidateChoice.get().cid << ".";
startTransferViaRemoteCandidate();
}
else if (ourCandidateChoice->priority < theirCandidateChoice->priority) {
- SWIFT_LOG(debug) << "Start transfer using local candidate:" << theirCandidateChoice.get().cid << "." << std::endl;
+ SWIFT_LOG(debug) << "Start transfer using local candidate:" << theirCandidateChoice.get().cid << ".";
startTransferViaLocalCandidate();
}
else {
if (hasPriorityOnCandidateTie()) {
- SWIFT_LOG(debug) << "Start transfer using remote candidate: " << ourCandidateChoice.get().cid << std::endl;
+ SWIFT_LOG(debug) << "Start transfer using remote candidate: " << ourCandidateChoice.get().cid;
startTransferViaRemoteCandidate();
}
else {
- SWIFT_LOG(debug) << "Start transfer using local candidate: " << theirCandidateChoice.get().cid << std::endl;
+ SWIFT_LOG(debug) << "Start transfer using local candidate: " << theirCandidateChoice.get().cid;
startTransferViaLocalCandidate();
}
}
@@ -145,11 +142,11 @@ void JingleFileTransfer::decideOnCandidates() {
void JingleFileTransfer::handleProxyActivateFinished(
const std::string& s5bSessionID, ErrorPayload::ref error) {
- SWIFT_LOG(debug) << std::endl;
- if (!isWaitingForLocalProxyActivate()) { SWIFT_LOG(warning) << "Incorrect state" << std::endl; return; }
+ SWIFT_LOG(debug);
+ if (!isWaitingForLocalProxyActivate()) { SWIFT_LOG(warning) << "Incorrect state"; return; }
if (error) {
- SWIFT_LOG(debug) << "Error activating proxy" << std::endl;
+ SWIFT_LOG(debug) << "Error activating proxy";
JingleS5BTransportPayload::ref proxyError = std::make_shared<JingleS5BTransportPayload>();
proxyError->setSessionID(s5bSessionID);
proxyError->setProxyError(true);
@@ -167,18 +164,18 @@ void JingleFileTransfer::handleProxyActivateFinished(
void JingleFileTransfer::handleTransportInfoReceived(
const JingleContentID& /* contentID */, JingleTransportPayload::ref transport) {
- SWIFT_LOG(debug) << std::endl;
+ SWIFT_LOG(debug);
if (JingleS5BTransportPayload::ref s5bPayload = std::dynamic_pointer_cast<JingleS5BTransportPayload>(transport)) {
if (s5bPayload->hasCandidateError() || !s5bPayload->getCandidateUsed().empty()) {
- SWIFT_LOG(debug) << "Received candidate decision from peer" << std::endl;
- if (!isTryingCandidates()) { SWIFT_LOG(warning) << "Incorrect state" << std::endl; return; }
+ SWIFT_LOG(debug) << "Received candidate decision from peer";
+ if (!isTryingCandidates()) { SWIFT_LOG(warning) << "Incorrect state"; return; }
theirCandidateSelectFinished = true;
if (!s5bPayload->hasCandidateError()) {
- BOOST_AUTO(theirCandidate, localCandidates.find(s5bPayload->getCandidateUsed()));
+ auto theirCandidate = localCandidates.find(s5bPayload->getCandidateUsed());
if (theirCandidate == localCandidates.end()) {
- SWIFT_LOG(warning) << "Got invalid candidate" << std::endl;
+ SWIFT_LOG(warning) << "Got invalid candidate";
terminate(JinglePayload::Reason::GeneralError);
return;
}
@@ -187,27 +184,27 @@ void JingleFileTransfer::handleTransportInfoReceived(
decideOnCandidates();
}
else if (!s5bPayload->getActivated().empty()) {
- SWIFT_LOG(debug) << "Received peer activate from peer" << std::endl;
- if (!isWaitingForPeerProxyActivate()) { SWIFT_LOG(warning) << "Incorrect state" << std::endl; return; }
+ SWIFT_LOG(debug) << "Received peer activate from peer";
+ if (!isWaitingForPeerProxyActivate()) { SWIFT_LOG(warning) << "Incorrect state"; return; }
if (ourCandidateChoice->cid == s5bPayload->getActivated()) {
startTransferring(createRemoteCandidateSession());
}
else {
- SWIFT_LOG(warning) << "ourCandidateChoice doesn't match activated proxy candidate!" << std::endl;
+ SWIFT_LOG(warning) << "ourCandidateChoice doesn't match activated proxy candidate!";
terminate(JinglePayload::Reason::GeneralError);
}
}
else if (s5bPayload->hasProxyError()) {
- SWIFT_LOG(debug) << "Received proxy error. Trying to fall back to IBB." << std::endl;
+ SWIFT_LOG(debug) << "Received proxy error. Trying to fall back to IBB.";
fallback();
}
else {
- SWIFT_LOG(debug) << "Ignoring unknown info" << std::endl;
+ SWIFT_LOG(debug) << "Ignoring unknown info";
}
}
else {
- SWIFT_LOG(debug) << "Ignoring unknown info" << std::endl;
+ SWIFT_LOG(debug) << "Ignoring unknown info";
}
}
@@ -231,4 +228,3 @@ void JingleFileTransfer::removeTransporter() {
transporter = nullptr;
}
}
-
diff --git a/Swiften/FileTransfer/LocalJingleTransportCandidateGenerator.cpp b/Swiften/FileTransfer/LocalJingleTransportCandidateGenerator.cpp
index 834a401..7cb4cbb 100644
--- a/Swiften/FileTransfer/LocalJingleTransportCandidateGenerator.cpp
+++ b/Swiften/FileTransfer/LocalJingleTransportCandidateGenerator.cpp
@@ -5,7 +5,7 @@
*/
/*
- * Copyright (c) 2013-2016 Isode Limited.
+ * Copyright (c) 2013-2019 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -45,7 +45,7 @@ LocalJingleTransportCandidateGenerator::LocalJingleTransportCandidateGenerator(
}
LocalJingleTransportCandidateGenerator::~LocalJingleTransportCandidateGenerator() {
- SWIFT_LOG_ASSERT(!s5bServerInitializeRequest, warning) << std::endl;
+ SWIFT_LOG_ASSERT(!s5bServerInitializeRequest, warning);
}
void LocalJingleTransportCandidateGenerator::start() {
@@ -98,7 +98,7 @@ void LocalJingleTransportCandidateGenerator::handleS5BServerInitialized(bool suc
}
}
else {
- SWIFT_LOG(warning) << "Unable to start SOCKS5 server" << std::endl;
+ SWIFT_LOG(warning) << "Unable to start SOCKS5 server";
if (s5bServerResourceUser_) {
s5bServerResourceUser_->onSuccessfulInitialized.disconnect(boost::bind(&LocalJingleTransportCandidateGenerator::handleS5BServerInitialized, this, _1));
}
diff --git a/Swiften/FileTransfer/OutgoingJingleFileTransfer.cpp b/Swiften/FileTransfer/OutgoingJingleFileTransfer.cpp
index 367fc97..57a18a8 100644
--- a/Swiften/FileTransfer/OutgoingJingleFileTransfer.cpp
+++ b/Swiften/FileTransfer/OutgoingJingleFileTransfer.cpp
@@ -5,7 +5,7 @@
*/
/*
- * Copyright (c) 2013-2016 Isode Limited.
+ * Copyright (c) 2013-2019 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -87,9 +87,9 @@ OutgoingJingleFileTransfer::~OutgoingJingleFileTransfer() {
}
void OutgoingJingleFileTransfer::start() {
- SWIFT_LOG(debug) << std::endl;
+ SWIFT_LOG(debug);
if (state != Initial) {
- SWIFT_LOG(warning) << "Incorrect state" << std::endl;
+ SWIFT_LOG(warning) << "Incorrect state";
return;
}
@@ -109,7 +109,7 @@ void OutgoingJingleFileTransfer::cancel() {
}
void OutgoingJingleFileTransfer::terminate(JinglePayload::Reason::Type reason) {
- SWIFT_LOG(debug) << reason << std::endl;
+ SWIFT_LOG(debug) << reason;
if (state != Initial && state != GeneratingInitialLocalCandidates && state != Finished) {
session->sendTerminate(reason);
@@ -122,8 +122,8 @@ void OutgoingJingleFileTransfer::handleSessionAcceptReceived(
const JingleContentID&,
JingleDescription::ref,
JingleTransportPayload::ref transportPayload) {
- SWIFT_LOG(debug) << std::endl;
- if (state != WaitingForAccept) { SWIFT_LOG(warning) << "Incorrect state" << std::endl; return; }
+ SWIFT_LOG(debug);
+ if (state != WaitingForAccept) { SWIFT_LOG(warning) << "Incorrect state"; return; }
if (JingleS5BTransportPayload::ref s5bPayload = std::dynamic_pointer_cast<JingleS5BTransportPayload>(transportPayload)) {
transporter->addRemoteCandidates(s5bPayload->getCandidates(), s5bPayload->getDstAddr());
@@ -134,14 +134,14 @@ void OutgoingJingleFileTransfer::handleSessionAcceptReceived(
startTransferring(transporter->createIBBSendSession(ibbPayload->getSessionID(), ibbPayload->getBlockSize().get_value_or(DEFAULT_BLOCK_SIZE), stream));
}
else {
- SWIFT_LOG(debug) << "Unknown transport payload. Falling back." << std::endl;
+ SWIFT_LOG(debug) << "Unknown transport payload. Falling back.";
fallback();
}
}
void OutgoingJingleFileTransfer::handleSessionTerminateReceived(boost::optional<JinglePayload::Reason> reason) {
- SWIFT_LOG(debug) << std::endl;
- if (state == Finished) { SWIFT_LOG(warning) << "Incorrect state: " << state << std::endl; return; }
+ SWIFT_LOG(debug);
+ if (state == Finished) { SWIFT_LOG(warning) << "Incorrect state: " << state; return; }
stopAll();
if (state == WaitForTermination) {
@@ -162,26 +162,26 @@ void OutgoingJingleFileTransfer::handleSessionTerminateReceived(boost::optional<
}
void OutgoingJingleFileTransfer::handleTransportAcceptReceived(const JingleContentID&, JingleTransportPayload::ref transport) {
- SWIFT_LOG(debug) << std::endl;
- if (state != FallbackRequested) { SWIFT_LOG(warning) << "Incorrect state" << std::endl; return; }
+ SWIFT_LOG(debug);
+ if (state != FallbackRequested) { SWIFT_LOG(warning) << "Incorrect state"; return; }
if (JingleIBBTransportPayload::ref ibbPayload = std::dynamic_pointer_cast<JingleIBBTransportPayload>(transport)) {
startTransferring(transporter->createIBBSendSession(ibbPayload->getSessionID(), ibbPayload->getBlockSize().get_value_or(DEFAULT_BLOCK_SIZE), stream));
}
else {
- SWIFT_LOG(debug) << "Unknown transport replacement" << std::endl;
+ SWIFT_LOG(debug) << "Unknown transport replacement";
terminate(JinglePayload::Reason::FailedTransport);
}
}
void OutgoingJingleFileTransfer::handleTransportRejectReceived(const JingleContentID &, std::shared_ptr<JingleTransportPayload>) {
- SWIFT_LOG(debug) << std::endl;
+ SWIFT_LOG(debug);
terminate(JinglePayload::Reason::UnsupportedTransports);
}
void OutgoingJingleFileTransfer::sendSessionInfoHash() {
- SWIFT_LOG(debug) << std::endl;
+ SWIFT_LOG(debug);
JingleFileTransferHash::ref hashElement = std::make_shared<JingleFileTransferHash>();
hashElement->getFileInfo().addHash(HashElement("sha-1", hashCalculator->getSHA1Hash()));
@@ -191,8 +191,8 @@ void OutgoingJingleFileTransfer::sendSessionInfoHash() {
void OutgoingJingleFileTransfer::handleLocalTransportCandidatesGenerated(
const std::string& s5bSessionID, const std::vector<JingleS5BTransportPayload::Candidate>& candidates, const std::string& dstAddr) {
- SWIFT_LOG(debug) << std::endl;
- if (state != GeneratingInitialLocalCandidates) { SWIFT_LOG(warning) << "Incorrect state: " << state << std::endl; return; }
+ SWIFT_LOG(debug);
+ if (state != GeneratingInitialLocalCandidates) { SWIFT_LOG(warning) << "Incorrect state: " << state; return; }
fillCandidateMap(localCandidates, candidates);
@@ -203,7 +203,7 @@ void OutgoingJingleFileTransfer::handleLocalTransportCandidatesGenerated(
JingleTransportPayload::ref transport;
if (candidates.empty()) {
- SWIFT_LOG(debug) << "no S5B candidates generated. Send IBB transport candidate." << std::endl;
+ SWIFT_LOG(debug) << "no S5B candidates generated. Send IBB transport candidate.";
JingleIBBTransportPayload::ref ibbTransport = std::make_shared<JingleIBBTransportPayload>();
ibbTransport->setBlockSize(DEFAULT_BLOCK_SIZE);
ibbTransport->setSessionID(idGenerator->generateID());
@@ -216,7 +216,7 @@ void OutgoingJingleFileTransfer::handleLocalTransportCandidatesGenerated(
s5bTransport->setDstAddr(dstAddr);
for (auto&& candidate : candidates) {
s5bTransport->addCandidate(candidate);
- SWIFT_LOG(debug) << "\t" << "S5B candidate: " << candidate.hostPort.toString() << std::endl;
+ SWIFT_LOG(debug) << "\t" << "S5B candidate: " << candidate.hostPort.toString();
}
transport = s5bTransport;
}
@@ -226,7 +226,7 @@ void OutgoingJingleFileTransfer::handleLocalTransportCandidatesGenerated(
void OutgoingJingleFileTransfer::fallback() {
if (options.isInBandAllowed()) {
- SWIFT_LOG(debug) << "Trying to fallback to IBB transport." << std::endl;
+ SWIFT_LOG(debug) << "Trying to fallback to IBB transport.";
JingleIBBTransportPayload::ref ibbTransport = std::make_shared<JingleIBBTransportPayload>();
ibbTransport->setBlockSize(DEFAULT_BLOCK_SIZE);
ibbTransport->setSessionID(idGenerator->generateID());
@@ -234,14 +234,14 @@ void OutgoingJingleFileTransfer::fallback() {
session->sendTransportReplace(contentID, ibbTransport);
}
else {
- SWIFT_LOG(debug) << "Fallback to IBB transport not allowed." << std::endl;
+ SWIFT_LOG(debug) << "Fallback to IBB transport not allowed.";
terminate(JinglePayload::Reason::ConnectivityError);
}
}
void OutgoingJingleFileTransfer::handleTransferFinished(boost::optional<FileTransferError> error) {
- SWIFT_LOG(debug) << std::endl;
- if (state != Transferring) { SWIFT_LOG(warning) << "Incorrect state: " << state << std::endl; return; }
+ SWIFT_LOG(debug);
+ if (state != Transferring) { SWIFT_LOG(warning) << "Incorrect state: " << state; return; }
if (error) {
terminate(JinglePayload::Reason::ConnectivityError);
@@ -256,7 +256,7 @@ void OutgoingJingleFileTransfer::handleTransferFinished(boost::optional<FileTran
}
void OutgoingJingleFileTransfer::startTransferring(std::shared_ptr<TransportSession> transportSession) {
- SWIFT_LOG(debug) << std::endl;
+ SWIFT_LOG(debug);
this->transportSession = transportSession;
processedBytesConnection = transportSession->onBytesSent.connect(
@@ -269,14 +269,14 @@ void OutgoingJingleFileTransfer::startTransferring(std::shared_ptr<TransportSess
void OutgoingJingleFileTransfer::setInternalState(State state) {
- SWIFT_LOG(debug) << state << std::endl;
+ SWIFT_LOG(debug) << state;
this->state = state;
setState(FileTransfer::State(getExternalState(state)));
}
void OutgoingJingleFileTransfer::setFinishedState(
FileTransfer::State::Type type, const boost::optional<FileTransferError>& error) {
- SWIFT_LOG(debug) << std::endl;
+ SWIFT_LOG(debug);
this->state = Finished;
onStateChanged(type);
onFinished(error);
@@ -301,9 +301,9 @@ FileTransfer::State::Type OutgoingJingleFileTransfer::getExternalState(State sta
}
void OutgoingJingleFileTransfer::stopAll() {
- SWIFT_LOG(debug) << state << std::endl;
+ SWIFT_LOG(debug) << state;
switch (state) {
- case Initial: SWIFT_LOG(warning) << "Not yet started" << std::endl; break;
+ case Initial: SWIFT_LOG(warning) << "Not yet started"; break;
case GeneratingInitialLocalCandidates: transporter->stopGeneratingLocalCandidates(); break;
case WaitingForAccept: break;
case TryingCandidates: transporter->stopTryingRemoteCandidates(); break;
@@ -320,7 +320,7 @@ void OutgoingJingleFileTransfer::stopAll() {
break;
case WaitForTermination:
break;
- case Finished: SWIFT_LOG(warning) << "Already finished" << std::endl; break;
+ case Finished: SWIFT_LOG(warning) << "Already finished"; break;
}
if (state != Initial) {
removeTransporter();
@@ -328,7 +328,7 @@ void OutgoingJingleFileTransfer::stopAll() {
}
void OutgoingJingleFileTransfer::startTransferViaRemoteCandidate() {
- SWIFT_LOG(debug) << std::endl;
+ SWIFT_LOG(debug);
if (ourCandidateChoice->type == JingleS5BTransportPayload::Candidate::ProxyType) {
setInternalState(WaitingForPeerProxyActivate);
@@ -340,7 +340,7 @@ void OutgoingJingleFileTransfer::startTransferViaRemoteCandidate() {
}
void OutgoingJingleFileTransfer::startTransferViaLocalCandidate() {
- SWIFT_LOG(debug) << std::endl;
+ SWIFT_LOG(debug);
if (theirCandidateChoice->type == JingleS5BTransportPayload::Candidate::ProxyType) {
setInternalState(WaitingForLocalProxyActivate);
@@ -400,7 +400,7 @@ std::shared_ptr<TransportSession> OutgoingJingleFileTransfer::createRemoteCandid
void OutgoingJingleFileTransfer::handleWaitForRemoteTerminationTimeout() {
assert(state == WaitForTermination);
- SWIFT_LOG(warning) << "Other party did not terminate session. Terminate it now." << std::endl;
+ SWIFT_LOG(warning) << "Other party did not terminate session. Terminate it now.";
waitForRemoteTermination->stop();
terminate(JinglePayload::Reason::MediaError);
}
diff --git a/Swiften/FileTransfer/RemoteJingleTransportCandidateSelector.cpp b/Swiften/FileTransfer/RemoteJingleTransportCandidateSelector.cpp
index 56013ca..4023be3 100644
--- a/Swiften/FileTransfer/RemoteJingleTransportCandidateSelector.cpp
+++ b/Swiften/FileTransfer/RemoteJingleTransportCandidateSelector.cpp
@@ -5,7 +5,7 @@
*/
/*
- * Copyright (c) 2013-2016 Isode Limited.
+ * Copyright (c) 2013-2019 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -56,14 +56,14 @@ void RemoteJingleTransportCandidateSelector::stopSelectingCandidate() {
void RemoteJingleTransportCandidateSelector::tryNextCandidate() {
if (candidates.empty()) {
- SWIFT_LOG(debug) << "No more candidates" << std::endl;
+ SWIFT_LOG(debug) << "No more candidates";
onCandidateSelectFinished(
boost::optional<JingleS5BTransportPayload::Candidate>(), std::shared_ptr<SOCKS5BytestreamClientSession>());
}
else {
lastCandidate = candidates.top();
candidates.pop();
- SWIFT_LOG(debug) << "Trying candidate " << lastCandidate.cid << std::endl;
+ SWIFT_LOG(debug) << "Trying candidate " << lastCandidate.cid;
if ((lastCandidate.type == JingleS5BTransportPayload::Candidate::DirectType && options.isDirectAllowed()) ||
(lastCandidate.type == JingleS5BTransportPayload::Candidate::AssistedType && options.isAssistedAllowed()) ||
(lastCandidate.type == JingleS5BTransportPayload::Candidate::ProxyType && options.isProxiedAllowed())) {
@@ -75,7 +75,7 @@ void RemoteJingleTransportCandidateSelector::tryNextCandidate() {
s5bSession->start();
}
else {
- SWIFT_LOG(debug) << "Can't handle this type of candidate" << std::endl;
+ SWIFT_LOG(debug) << "Can't handle this type of candidate";
tryNextCandidate();
}
}
diff --git a/Swiften/FileTransfer/SOCKS5BytestreamClientSession.cpp b/Swiften/FileTransfer/SOCKS5BytestreamClientSession.cpp
index 5ddd32b..a3f0dab 100644
--- a/Swiften/FileTransfer/SOCKS5BytestreamClientSession.cpp
+++ b/Swiften/FileTransfer/SOCKS5BytestreamClientSession.cpp
@@ -5,7 +5,7 @@
*/
/*
- * Copyright (c) 2013-2016 Isode Limited.
+ * Copyright (c) 2013-2019 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -49,7 +49,7 @@ SOCKS5BytestreamClientSession::~SOCKS5BytestreamClientSession() {
void SOCKS5BytestreamClientSession::start() {
assert(state == Initial);
- SWIFT_LOG(debug) << "Trying to connect via TCP to " << addressPort.toString() << "." << std::endl;
+ SWIFT_LOG(debug) << "Trying to connect via TCP to " << addressPort.toString() << ".";
weFailedTimeout->start();
connectFinishedConnection = connection->onConnectFinished.connect(
boost::bind(&SOCKS5BytestreamClientSession::handleConnectFinished, this, _1));
@@ -57,7 +57,7 @@ void SOCKS5BytestreamClientSession::start() {
}
void SOCKS5BytestreamClientSession::stop() {
- SWIFT_LOG(debug) << std::endl;
+ SWIFT_LOG(debug);
if (state < Ready) {
weFailedTimeout->stop();
}
@@ -70,7 +70,7 @@ void SOCKS5BytestreamClientSession::stop() {
}
void SOCKS5BytestreamClientSession::process() {
- SWIFT_LOG(debug) << "unprocessedData.size(): " << unprocessedData.size() << std::endl;
+ SWIFT_LOG(debug) << "unprocessedData.size(): " << unprocessedData.size();
ByteArray bndAddress;
switch(state) {
case Initial:
@@ -124,19 +124,19 @@ void SOCKS5BytestreamClientSession::process() {
}
unprocessedData.clear();
state = Ready;
- SWIFT_LOG(debug) << "session ready" << std::endl;
+ SWIFT_LOG(debug) << "session ready";
// issue ready signal so the bytestream can be used for reading or writing
weFailedTimeout->stop();
onSessionReady(false);
break;
case Ready:
- SWIFT_LOG(debug) << "Received further data in Ready state." << std::endl;
+ SWIFT_LOG(debug) << "Received further data in Ready state.";
break;
case Reading:
case Writing:
case Finished:
- SWIFT_LOG(debug) << "Unexpected receive of data. Current state: " << state << std::endl;
- SWIFT_LOG(debug) << "Data: " << Hexify::hexify(unprocessedData) << std::endl;
+ SWIFT_LOG(debug) << "Unexpected receive of data. Current state: " << state;
+ SWIFT_LOG(debug) << "Data: " << Hexify::hexify(unprocessedData);
unprocessedData.clear();
//assert(false);
}
@@ -150,7 +150,7 @@ void SOCKS5BytestreamClientSession::hello() {
}
void SOCKS5BytestreamClientSession::authenticate() {
- SWIFT_LOG(debug) << std::endl;
+ SWIFT_LOG(debug);
SafeByteArray header = createSafeByteArray("\x05\x01\x00\x03", 4);
SafeByteArray message = header;
append(message, createSafeByteArray(boost::numeric_cast<char>(destination.size())));
@@ -168,7 +168,7 @@ void SOCKS5BytestreamClientSession::startReceiving(std::shared_ptr<WriteBytestre
writeBytestream->write(unprocessedData);
unprocessedData.clear();
} else {
- SWIFT_LOG(debug) << "Session isn't ready for transfer yet!" << std::endl;
+ SWIFT_LOG(debug) << "Session isn't ready for transfer yet!";
}
}
@@ -180,7 +180,7 @@ void SOCKS5BytestreamClientSession::startSending(std::shared_ptr<ReadBytestream>
boost::bind(&SOCKS5BytestreamClientSession::sendData, this));
sendData();
} else {
- SWIFT_LOG(debug) << "Session isn't ready for transfer yet!" << std::endl;
+ SWIFT_LOG(debug) << "Session isn't ready for transfer yet!";
}
}
@@ -205,7 +205,7 @@ void SOCKS5BytestreamClientSession::sendData() {
}
void SOCKS5BytestreamClientSession::finish(bool error) {
- SWIFT_LOG(debug) << std::endl;
+ SWIFT_LOG(debug);
if (state < Ready) {
weFailedTimeout->stop();
}
@@ -227,10 +227,10 @@ void SOCKS5BytestreamClientSession::finish(bool error) {
void SOCKS5BytestreamClientSession::handleConnectFinished(bool error) {
connectFinishedConnection.disconnect();
if (error) {
- SWIFT_LOG(debug) << "Failed to connect via TCP to " << addressPort.toString() << "." << std::endl;
+ SWIFT_LOG(debug) << "Failed to connect via TCP to " << addressPort.toString() << ".";
finish(true);
} else {
- SWIFT_LOG(debug) << "Successfully connected via TCP" << addressPort.toString() << "." << std::endl;
+ SWIFT_LOG(debug) << "Successfully connected via TCP" << addressPort.toString() << ".";
disconnectedConnection = connection->onDisconnected.connect(
boost::bind(&SOCKS5BytestreamClientSession::handleDisconnected, this, _1));
dataReadConnection = connection->onDataRead.connect(
@@ -242,7 +242,7 @@ void SOCKS5BytestreamClientSession::handleConnectFinished(bool error) {
}
void SOCKS5BytestreamClientSession::handleDataRead(std::shared_ptr<SafeByteArray> data) {
- SWIFT_LOG(debug) << "state: " << state << " data.size() = " << data->size() << std::endl;
+ SWIFT_LOG(debug) << "state: " << state << " data.size() = " << data->size();
if (state != Reading) {
append(unprocessedData, *data);
process();
@@ -254,14 +254,14 @@ void SOCKS5BytestreamClientSession::handleDataRead(std::shared_ptr<SafeByteArray
}
void SOCKS5BytestreamClientSession::handleDisconnected(const boost::optional<Connection::Error>& error) {
- SWIFT_LOG(debug) << (error ? (error == Connection::ReadError ? "Read Error" : "Write Error") : "No Error") << std::endl;
+ SWIFT_LOG(debug) << (error ? (error == Connection::ReadError ? "Read Error" : "Write Error") : "No Error");
if (error) {
finish(true);
}
}
void SOCKS5BytestreamClientSession::handleWeFailedTimeout() {
- SWIFT_LOG(debug) << "Failed due to timeout!" << std::endl;
+ SWIFT_LOG(debug) << "Failed due to timeout!";
finish(true);
}
diff --git a/Swiften/FileTransfer/SOCKS5BytestreamProxiesManager.cpp b/Swiften/FileTransfer/SOCKS5BytestreamProxiesManager.cpp
index cd4cfaa..72c4d41 100644
--- a/Swiften/FileTransfer/SOCKS5BytestreamProxiesManager.cpp
+++ b/Swiften/FileTransfer/SOCKS5BytestreamProxiesManager.cpp
@@ -5,7 +5,7 @@
*/
/*
- * Copyright (c) 2015-2016 Isode Limited.
+ * Copyright (c) 2015-2019 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -46,7 +46,7 @@ SOCKS5BytestreamProxiesManager::~SOCKS5BytestreamProxiesManager() {
void SOCKS5BytestreamProxiesManager::addS5BProxy(S5BProxyRequest::ref proxy) {
if (proxy) {
- SWIFT_LOG_ASSERT(HostAddress::fromString(proxy->getStreamHost().get().host), warning) << std::endl;
+ SWIFT_LOG_ASSERT(HostAddress::fromString(proxy->getStreamHost().get().host), warning);
if (!localS5BProxies_) {
localS5BProxies_ = std::vector<S5BProxyRequest::ref>();
}
@@ -62,7 +62,7 @@ const boost::optional<std::vector<S5BProxyRequest::ref> >& SOCKS5BytestreamProxi
}
void SOCKS5BytestreamProxiesManager::connectToProxies(const std::string& sessionID) {
- SWIFT_LOG(debug) << "session ID: " << sessionID << std::endl;
+ SWIFT_LOG(debug) << "session ID: " << sessionID;
ProxyJIDClientSessionVector clientSessions;
if (localS5BProxies_) {
@@ -71,7 +71,7 @@ void SOCKS5BytestreamProxiesManager::connectToProxies(const std::string& session
if (proxyHostAddress) {
std::shared_ptr<Connection> conn = connectionFactory_->createConnection();
HostAddressPort addressPort = HostAddressPort(proxyHostAddress.get(), proxy->getStreamHost().get().port);
- SWIFT_LOG_ASSERT(addressPort.isValid(), warning) << std::endl;
+ SWIFT_LOG_ASSERT(addressPort.isValid(), warning);
std::shared_ptr<SOCKS5BytestreamClientSession> session = std::make_shared<SOCKS5BytestreamClientSession>(conn, addressPort, sessionID, timerFactory_);
JID proxyJid = proxy->getStreamHost().get().jid;
clientSessions.push_back(std::pair<JID, std::shared_ptr<SOCKS5BytestreamClientSession> >(proxyJid, session));
@@ -103,7 +103,7 @@ std::shared_ptr<SOCKS5BytestreamClientSession> SOCKS5BytestreamProxiesManager::g
i->second->stop();
}
}
- SWIFT_LOG_ASSERT(activeSession, warning) << "No active session with matching ID found." << std::endl;
+ SWIFT_LOG_ASSERT(activeSession, warning) << "No active session with matching ID found.";
proxySessions_.erase(sessionID);
@@ -144,7 +144,7 @@ void SOCKS5BytestreamProxiesManager::handleNameLookupResult(const std::vector<Ho
}
else {
if (addresses.empty()) {
- SWIFT_LOG(warning) << "S5B proxy hostname does not resolve." << std::endl;
+ SWIFT_LOG(warning) << "S5B proxy hostname does not resolve.";
}
else {
// generate proxy per returned address
diff --git a/Swiften/FileTransfer/SOCKS5BytestreamProxyFinder.cpp b/Swiften/FileTransfer/SOCKS5BytestreamProxyFinder.cpp
index 90c42dd..1efc54a 100644
--- a/Swiften/FileTransfer/SOCKS5BytestreamProxyFinder.cpp
+++ b/Swiften/FileTransfer/SOCKS5BytestreamProxyFinder.cpp
@@ -5,7 +5,7 @@
*/
/*
- * Copyright (c) 2015-2016 Isode Limited.
+ * Copyright (c) 2015-2019 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -71,10 +71,10 @@ void SOCKS5BytestreamProxyFinder::handleProxyResponse(std::shared_ptr<GenericReq
requester->onResponse.disconnect(boost::bind(&SOCKS5BytestreamProxyFinder::handleProxyResponse, this, requester, _1, _2));
pendingRequests.erase(requester);
if (error) {
- SWIFT_LOG(debug) << "ERROR" << std::endl;
+ SWIFT_LOG(debug) << "ERROR";
} else {
if (request) {
- SWIFT_LOG(debug) << "add request" << std::endl;
+ SWIFT_LOG(debug) << "add request";
proxyHosts.push_back(request);
}
}
diff --git a/Swiften/FileTransfer/SOCKS5BytestreamServerManager.cpp b/Swiften/FileTransfer/SOCKS5BytestreamServerManager.cpp
index f749735..7fc1388 100644
--- a/Swiften/FileTransfer/SOCKS5BytestreamServerManager.cpp
+++ b/Swiften/FileTransfer/SOCKS5BytestreamServerManager.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012-2016 Isode Limited.
+ * Copyright (c) 2012-2019 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -48,12 +48,12 @@ SOCKS5BytestreamServerManager::SOCKS5BytestreamServerManager(
}
SOCKS5BytestreamServerManager::~SOCKS5BytestreamServerManager() {
- SWIFT_LOG_ASSERT(!connectionServer, warning) << std::endl;
- SWIFT_LOG_ASSERT(!getPublicIPRequest, warning) << std::endl;
- SWIFT_LOG_ASSERT(!forwardPortRequest, warning) << std::endl;
- SWIFT_LOG_ASSERT(state == Start, warning) << std::endl;
+ SWIFT_LOG_ASSERT(!connectionServer, warning);
+ SWIFT_LOG_ASSERT(!getPublicIPRequest, warning);
+ SWIFT_LOG_ASSERT(!forwardPortRequest, warning);
+ SWIFT_LOG_ASSERT(state == Start, warning);
if (portMapping && !unforwardPortRequest) {
- SWIFT_LOG(warning) << "Port forwarding still alive. Trying to remove it now." << std::endl;
+ SWIFT_LOG(warning) << "Port forwarding still alive. Trying to remove it now.";
unforwardPortRequest = natTraverser->createRemovePortForwardingRequest(portMapping.get().getLocalPort(), portMapping.get().getPublicPort());
unforwardPortRequest->start();
}
@@ -114,27 +114,27 @@ void SOCKS5BytestreamServerManager::initialize() {
// Find a port to listen on
assert(!connectionServer);
- int port;
+ unsigned short port;
for (port = LISTEN_PORTS_BEGIN; port < LISTEN_PORTS_END; ++port) {
- SWIFT_LOG(debug) << "Trying to start server on port " << port << std::endl;
+ SWIFT_LOG(debug) << "Trying to start server on port " << port;
connectionServer = connectionServerFactory->createConnectionServer(HostAddress::fromString("::").get(), port);
boost::optional<ConnectionServer::Error> error = connectionServer->tryStart();
if (!error) {
break;
}
else if (*error != ConnectionServer::Conflict) {
- SWIFT_LOG(debug) << "Error starting server" << std::endl;
+ SWIFT_LOG(debug) << "Error starting server";
onInitialized(false);
return;
}
connectionServer.reset();
}
if (!connectionServer) {
- SWIFT_LOG(debug) << "Unable to find an open port" << std::endl;
+ SWIFT_LOG(debug) << "Unable to find an open port";
onInitialized(false);
return;
}
- SWIFT_LOG(debug) << "Server started succesfully" << std::endl;
+ SWIFT_LOG(debug) << "Server started succesfully";
connectionServerPort = port;
// Start bytestream server. Should actually happen before the connectionserver is started
@@ -164,7 +164,7 @@ void SOCKS5BytestreamServerManager::setupPortForwarding() {
}
// Forward ports
- int port = server->getAddressPort().getPort();
+ auto port = server->getAddressPort().getPort();
assert(!forwardPortRequest);
portMapping = boost::optional<NATPortMapping>();
if ((forwardPortRequest = natTraverser->createForwardPortRequest(port, port))) {
@@ -211,10 +211,10 @@ void SOCKS5BytestreamServerManager::stop() {
void SOCKS5BytestreamServerManager::handleGetPublicIPResult(boost::optional<HostAddress> address) {
if (address) {
- SWIFT_LOG(debug) << "Public IP discovered as " << address.get().toString() << "." << std::endl;
+ SWIFT_LOG(debug) << "Public IP discovered as " << address.get().toString() << ".";
}
else {
- SWIFT_LOG(debug) << "No public IP discoverable." << std::endl;
+ SWIFT_LOG(debug) << "No public IP discoverable.";
}
publicAddress = address;
@@ -225,10 +225,10 @@ void SOCKS5BytestreamServerManager::handleGetPublicIPResult(boost::optional<Host
void SOCKS5BytestreamServerManager::handleForwardPortResult(boost::optional<NATPortMapping> mapping) {
if (mapping) {
- SWIFT_LOG(debug) << "Mapping port was successful." << std::endl;
+ SWIFT_LOG(debug) << "Mapping port was successful.";
}
else {
- SWIFT_LOG(debug) << "Mapping port has failed." << std::endl;
+ SWIFT_LOG(debug) << "Mapping port has failed.";
}
portMapping = mapping;
@@ -243,7 +243,7 @@ void SOCKS5BytestreamServerManager::handleUnforwardPortResult(boost::optional<bo
portMapping.reset();
}
else {
- SWIFT_LOG(warning) << "Failed to remove port forwarding." << std::endl;
+ SWIFT_LOG(warning) << "Failed to remove port forwarding.";
}
attemptedPortMapping_ = false;
unforwardPortRequest.reset();
diff --git a/Swiften/FileTransfer/SOCKS5BytestreamServerManager.h b/Swiften/FileTransfer/SOCKS5BytestreamServerManager.h
index 3c06513..74578cc 100644
--- a/Swiften/FileTransfer/SOCKS5BytestreamServerManager.h
+++ b/Swiften/FileTransfer/SOCKS5BytestreamServerManager.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012-2016 Isode Limited.
+ * Copyright (c) 2012-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -78,7 +78,7 @@ namespace Swift {
enum { Start, Initializing, Initialized } state;
SOCKS5BytestreamServer* server;
std::shared_ptr<ConnectionServer> connectionServer;
- int connectionServerPort = -1;
+ unsigned short connectionServerPort = 0;
std::shared_ptr<NATTraversalGetPublicIPRequest> getPublicIPRequest;
std::shared_ptr<NATTraversalForwardPortRequest> forwardPortRequest;
diff --git a/Swiften/FileTransfer/SOCKS5BytestreamServerSession.cpp b/Swiften/FileTransfer/SOCKS5BytestreamServerSession.cpp
index bc4e8e4..a4ab751 100644
--- a/Swiften/FileTransfer/SOCKS5BytestreamServerSession.cpp
+++ b/Swiften/FileTransfer/SOCKS5BytestreamServerSession.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2019 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -33,13 +33,13 @@ SOCKS5BytestreamServerSession::SOCKS5BytestreamServerSession(
SOCKS5BytestreamServerSession::~SOCKS5BytestreamServerSession() {
if (state != Finished && state != Initial) {
- SWIFT_LOG(warning) << "SOCKS5BytestreamServerSession unfinished" << std::endl;
+ SWIFT_LOG(warning) << "SOCKS5BytestreamServerSession unfinished";
finish();
}
}
void SOCKS5BytestreamServerSession::start() {
- SWIFT_LOG(debug) << std::endl;
+ SWIFT_LOG(debug);
dataReadConnection = connection->onDataRead.connect(
boost::bind(&SOCKS5BytestreamServerSession::handleDataRead, this, _1));
state = WaitingForAuthentication;
@@ -50,7 +50,7 @@ void SOCKS5BytestreamServerSession::stop() {
}
void SOCKS5BytestreamServerSession::startSending(std::shared_ptr<ReadBytestream> stream) {
- if (state != ReadyForTransfer) { SWIFT_LOG(debug) << "Not ready for transfer!" << std::endl; return; }
+ if (state != ReadyForTransfer) { SWIFT_LOG(debug) << "Not ready for transfer!"; return; }
readBytestream = stream;
state = WritingData;
@@ -62,7 +62,7 @@ void SOCKS5BytestreamServerSession::startSending(std::shared_ptr<ReadBytestream>
}
void SOCKS5BytestreamServerSession::startReceiving(std::shared_ptr<WriteBytestream> stream) {
- if (state != ReadyForTransfer) { SWIFT_LOG(debug) << "Not ready for transfer!" << std::endl; return; }
+ if (state != ReadyForTransfer) { SWIFT_LOG(debug) << "Not ready for transfer!"; return; }
writeBytestream = stream;
state = ReadingData;
@@ -93,7 +93,7 @@ void SOCKS5BytestreamServerSession::handleDataAvailable() {
}
void SOCKS5BytestreamServerSession::handleDisconnected(const boost::optional<Connection::Error>& error) {
- SWIFT_LOG(debug) << (error ? (error == Connection::ReadError ? "Read Error" : "Write Error") : "No Error") << std::endl;
+ SWIFT_LOG(debug) << (error ? (error == Connection::ReadError ? "Read Error" : "Write Error") : "No Error");
finish(error ? boost::optional<FileTransferError>(FileTransferError::PeerError) : boost::optional<FileTransferError>());
}
@@ -109,7 +109,7 @@ void SOCKS5BytestreamServerSession::process() {
if (i == 2 + authCount) {
// Authentication message is complete
if (i != unprocessedData.size()) {
- SWIFT_LOG(debug) << "Junk after authentication mechanism" << std::endl;
+ SWIFT_LOG(debug) << "Junk after authentication mechanism";
}
unprocessedData.clear();
connection->write(createSafeByteArray("\x05\x00", 2));
@@ -130,7 +130,7 @@ void SOCKS5BytestreamServerSession::process() {
i += 2;
if (i <= unprocessedData.size()) {
if (i != unprocessedData.size()) {
- SWIFT_LOG(debug) << "Junk after authentication mechanism" << std::endl;
+ SWIFT_LOG(debug) << "Junk after authentication mechanism";
}
unprocessedData.clear();
streamID = byteArrayToString(requestID);
@@ -138,15 +138,22 @@ void SOCKS5BytestreamServerSession::process() {
SafeByteArray result = createSafeByteArray("\x05", 1);
result.push_back(hasBytestream ? 0x0 : 0x4);
append(result, createByteArray("\x00\x03", 2));
- result.push_back(boost::numeric_cast<unsigned char>(requestID.size()));
+ try {
+ result.push_back(boost::numeric_cast<unsigned char>(requestID.size()));
+ }
+ catch (const boost::numeric::bad_numeric_cast& e) {
+ SWIFT_LOG(warning) << "SOCKS5 request ID is too long (" << requestID.size() << "): " << e.what();
+ finish();
+ return;
+ }
append(result, concat(requestID, createByteArray("\x00\x00", 2)));
if (!hasBytestream) {
- SWIFT_LOG(debug) << "Readstream or Wrtiestream with ID " << streamID << " not found!" << std::endl;
+ SWIFT_LOG(debug) << "Readstream or Wrtiestream with ID " << streamID << " not found!";
connection->write(result);
finish(boost::optional<FileTransferError>(FileTransferError::PeerError));
}
else {
- SWIFT_LOG(debug) << "Found stream. Sent OK." << std::endl;
+ SWIFT_LOG(debug) << "Found stream. Sent OK.";
connection->write(result);
state = ReadyForTransfer;
}
@@ -178,7 +185,7 @@ void SOCKS5BytestreamServerSession::sendData() {
}
void SOCKS5BytestreamServerSession::finish(const boost::optional<FileTransferError>& error) {
- SWIFT_LOG(debug) << "state: " << state << std::endl;
+ SWIFT_LOG(debug) << "state: " << state;
if (state == Finished) {
return;
}
diff --git a/Swiften/FileTransfer/UnitTest/IBBSendSessionTest.cpp b/Swiften/FileTransfer/UnitTest/IBBSendSessionTest.cpp
index f9057f8..2399cbe 100644
--- a/Swiften/FileTransfer/UnitTest/IBBSendSessionTest.cpp
+++ b/Swiften/FileTransfer/UnitTest/IBBSendSessionTest.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -58,7 +58,7 @@ class IBBSendSessionTest : public CppUnit::TestFixture {
CPPUNIT_ASSERT(stanzaChannel->isRequestAtIndex<IBB>(0, JID("foo@bar.com/baz"), IQ::Set));
IBB::ref ibb = stanzaChannel->sentStanzas[0]->getPayload<IBB>();
CPPUNIT_ASSERT_EQUAL(IBB::Open, ibb->getAction());
- CPPUNIT_ASSERT_EQUAL(1234, ibb->getBlockSize());
+ CPPUNIT_ASSERT_EQUAL(1234u, ibb->getBlockSize());
CPPUNIT_ASSERT_EQUAL(std::string("myid"), ibb->getStreamID());
}
diff --git a/Swiften/FileTransfer/UnitTest/SOCKS5BytestreamClientSessionTest.cpp b/Swiften/FileTransfer/UnitTest/SOCKS5BytestreamClientSessionTest.cpp
index 80667b6..fad02da 100644
--- a/Swiften/FileTransfer/UnitTest/SOCKS5BytestreamClientSessionTest.cpp
+++ b/Swiften/FileTransfer/UnitTest/SOCKS5BytestreamClientSessionTest.cpp
@@ -5,7 +5,7 @@
*/
/*
- * Copyright (c) 2015-2016 Isode Limited.
+ * Copyright (c) 2015-2019 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -238,7 +238,7 @@ private:
std::shared_ptr<SafeByteArray> dataToSend;
//ByteArray failingData = Hexify::unhexify("8417947d1d305c72c11520ea7d2c6e787396705e72c312c6ccc3f66613d7cae1b91b7ab48e8b59a17d559c15fb51");
//append(dataToSend, failingData);
- //SWIFT_LOG(debug) << "hexed: " << Hexify::hexify(failingData) << std::endl;
+ //SWIFT_LOG(debug) << "hexed: " << Hexify::hexify(failingData);
do {
ByteArray rndArray = generateRandomByteArray(correctData->size());
dataToSend = createSafeByteArrayRef(vecptr(rndArray), rndArray.size());
@@ -255,7 +255,7 @@ private:
void handleConnectionDataWritten(const SafeByteArray& data) {
append(unprocessedInput, data);
- //SWIFT_LOG(debug) << "unprocessedInput (" << unprocessedInput.size() << "): " << Hexify::hexify(unprocessedInput) << std::endl;
+ //SWIFT_LOG(debug) << "unprocessedInput (" << unprocessedInput.size() << "): " << Hexify::hexify(unprocessedInput);
}
void handleSessionReady(bool error) {
diff --git a/Swiften/IDN/ICUConverter.cpp b/Swiften/IDN/ICUConverter.cpp
index d6b0827..37ce708 100644
--- a/Swiften/IDN/ICUConverter.cpp
+++ b/Swiften/IDN/ICUConverter.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012-2016 Isode Limited.
+ * Copyright (c) 2012-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -19,6 +19,8 @@ using namespace Swift;
using boost::numeric_cast;
namespace {
+ static constexpr auto maxStringPrepLength = 1023;
+
typedef std::vector<UChar, SafeAllocator<UChar> > ICUString;
const char* toConstCharArray(const std::string& input) {
@@ -93,15 +95,8 @@ namespace {
ICUString icuInput = convertToICUString(s);
ICUString icuResult;
UParseError parseError;
- icuResult.resize(icuInput.size());
+ icuResult.resize(maxStringPrepLength);
int32_t icuResultLength = usprep_prepare(icuProfile.get(), vecptr(icuInput), numeric_cast<int32_t>(icuInput.size()), vecptr(icuResult), numeric_cast<int32_t>(icuResult.size()), USPREP_ALLOW_UNASSIGNED, &parseError, &status);
- icuResult.resize(numeric_cast<size_t>(icuResultLength));
- if (status == U_BUFFER_OVERFLOW_ERROR) {
- status = U_ZERO_ERROR;
- icuResult.resize(numeric_cast<size_t>(icuResultLength));
- icuResultLength = usprep_prepare(icuProfile.get(), vecptr(icuInput), numeric_cast<int32_t>(icuInput.size()), vecptr(icuResult), numeric_cast<int32_t>(icuResult.size()), USPREP_ALLOW_UNASSIGNED, &parseError, &status);
- icuResult.resize(numeric_cast<size_t>(icuResultLength));
- }
if (U_FAILURE(status)) {
return std::vector<char, SafeAllocator<char> >();
}
diff --git a/Swiften/IDN/LibIDNConverter.cpp b/Swiften/IDN/LibIDNConverter.cpp
index 0c01352..e2a87be 100644
--- a/Swiften/IDN/LibIDNConverter.cpp
+++ b/Swiften/IDN/LibIDNConverter.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012-2016 Isode Limited.
+ * Copyright (c) 2012-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -24,7 +24,7 @@ extern "C" {
using namespace Swift;
namespace {
- static const int MAX_STRINGPREP_SIZE = 1024;
+ static const size_t MAX_STRINGPREP_SIZE = 1024;
const Stringprep_profile* getLibIDNProfile(IDNConverter::StringPrepProfile profile) {
switch(profile) {
@@ -44,7 +44,8 @@ namespace {
return ContainerType();
}
- input.resize(MAX_STRINGPREP_SIZE);
+ // Ensure we have enough space for stringprepping, and that input is always NUL terminated
+ input.resize(std::max(MAX_STRINGPREP_SIZE, input.size() + 1));
if (stringprep(&input[0], MAX_STRINGPREP_SIZE, static_cast<Stringprep_profile_flags>(0), getLibIDNProfile(profile)) == 0) {
return input;
}
@@ -77,6 +78,9 @@ boost::optional<std::string> LibIDNConverter::getIDNAEncoded(const std::string&
if (idna_to_ascii_8z(domain.c_str(), &output, IDNA_USE_STD3_ASCII_RULES) == IDNA_SUCCESS) {
std::string result(output);
free(output);
+ if (result.size() > 255) {
+ return boost::optional<std::string>();
+ }
return result;
}
else {
diff --git a/Swiften/IDN/PlatformIDNConverter.cpp b/Swiften/IDN/PlatformIDNConverter.cpp
index c85d3b6..3564bb9 100644
--- a/Swiften/IDN/PlatformIDNConverter.cpp
+++ b/Swiften/IDN/PlatformIDNConverter.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012-2016 Isode Limited.
+ * Copyright (c) 2012-2019 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -13,16 +13,17 @@
namespace Swift {
-IDNConverter* PlatformIDNConverter::create() {
+std::unique_ptr<IDNConverter> PlatformIDNConverter::create() {
#if defined(HAVE_LIBIDN)
- return new LibIDNConverter();
+ return std::make_unique<LibIDNConverter>();
#elif defined(HAVE_ICU)
- return new ICUConverter();
+ return std::make_unique<ICUConverter>();
#else
#if defined(NEED_IDN)
#error "No IDN implementation"
+#else
+ return {};
#endif
- return nullptr;
#endif
}
diff --git a/Swiften/IDN/PlatformIDNConverter.h b/Swiften/IDN/PlatformIDNConverter.h
index 704f7a7..3b9a275 100644
--- a/Swiften/IDN/PlatformIDNConverter.h
+++ b/Swiften/IDN/PlatformIDNConverter.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012 Isode Limited.
+ * Copyright (c) 2012-2019 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -8,10 +8,12 @@
#include <Swiften/Base/API.h>
+#include <memory>
+
namespace Swift {
class IDNConverter;
namespace PlatformIDNConverter {
- SWIFTEN_API IDNConverter* create();
+ SWIFTEN_API std::unique_ptr<IDNConverter> create();
}
}
diff --git a/Swiften/IDN/SConscript b/Swiften/IDN/SConscript
index 28596f7..0afad0e 100644
--- a/Swiften/IDN/SConscript
+++ b/Swiften/IDN/SConscript
@@ -23,6 +23,7 @@ swiften_env.Append(SWIFTEN_OBJECTS = [objects])
if env["TEST"] :
test_env = myenv.Clone()
test_env.UseFlags(swiften_env["CPPUNIT_FLAGS"])
+ test_env.UseFlags(myenv.get("GOOGLETEST_FLAGS", ""))
env.Append(UNITTEST_OBJECTS = test_env.SwiftenObject([
File("UnitTest/IDNConverterTest.cpp"),
File("UnitTest/UTF8ValidatorTest.cpp")
diff --git a/Swiften/IDN/UnitTest/IDNConverterTest.cpp b/Swiften/IDN/UnitTest/IDNConverterTest.cpp
index 508a28c..77a1ece 100644
--- a/Swiften/IDN/UnitTest/IDNConverterTest.cpp
+++ b/Swiften/IDN/UnitTest/IDNConverterTest.cpp
@@ -1,64 +1,98 @@
/*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
#include <memory>
-#include <cppunit/extensions/HelperMacros.h>
-#include <cppunit/extensions/TestFactoryRegistry.h>
+#include <gtest/gtest.h>
#include <Swiften/IDN/IDNConverter.h>
#include <Swiften/IDN/PlatformIDNConverter.h>
using namespace Swift;
-class IDNConverterTest : public CppUnit::TestFixture {
- CPPUNIT_TEST_SUITE(IDNConverterTest);
- CPPUNIT_TEST(testStringPrep);
- CPPUNIT_TEST(testStringPrep_Empty);
- CPPUNIT_TEST(testGetEncoded);
- CPPUNIT_TEST(testGetEncoded_International);
- CPPUNIT_TEST(testGetEncoded_Invalid);
- CPPUNIT_TEST_SUITE_END();
-
- public:
- void setUp() {
- testling = std::shared_ptr<IDNConverter>(PlatformIDNConverter::create());
- }
-
- void testStringPrep() {
- std::string result = testling->getStringPrepared("tron\xc3\x87on", IDNConverter::NamePrep);
-
- CPPUNIT_ASSERT_EQUAL(std::string("tron\xc3\xa7on"), result);
- }
-
- void testStringPrep_Empty() {
- CPPUNIT_ASSERT_EQUAL(std::string(""), testling->getStringPrepared("", IDNConverter::NamePrep));
- CPPUNIT_ASSERT_EQUAL(std::string(""), testling->getStringPrepared("", IDNConverter::XMPPNodePrep));
- CPPUNIT_ASSERT_EQUAL(std::string(""), testling->getStringPrepared("", IDNConverter::XMPPResourcePrep));
- }
-
- void testGetEncoded() {
- boost::optional<std::string> result = testling->getIDNAEncoded("www.swift.im");
- CPPUNIT_ASSERT(!!result);
- CPPUNIT_ASSERT_EQUAL(std::string("www.swift.im"), *result);
- }
-
- void testGetEncoded_International() {
- boost::optional<std::string> result = testling->getIDNAEncoded("www.tron\xc3\x87on.com");
- CPPUNIT_ASSERT(!!result);
- CPPUNIT_ASSERT_EQUAL(std::string("www.xn--tronon-zua.com"), *result);
- }
-
- void testGetEncoded_Invalid() {
- boost::optional<std::string> result = testling->getIDNAEncoded("www.foo,bar.com");
- CPPUNIT_ASSERT(!result);
- }
-
- private:
- std::shared_ptr<IDNConverter> testling;
+class IDNConverterTest : public ::testing::Test {
+
+protected:
+ virtual void SetUp() {
+ testling_ = std::shared_ptr<IDNConverter>(PlatformIDNConverter::create());
+ }
+
+ std::shared_ptr<IDNConverter> testling_;
};
-CPPUNIT_TEST_SUITE_REGISTRATION(IDNConverterTest);
+TEST_F(IDNConverterTest, testStringPrep) {
+ std::string result = testling_->getStringPrepared("tron\xc3\x87on", IDNConverter::NamePrep);
+
+ ASSERT_EQ(std::string("tron\xc3\xa7on"), result);
+}
+
+TEST_F(IDNConverterTest, testStringPrep_Empty) {
+ ASSERT_EQ(std::string(""), testling_->getStringPrepared("", IDNConverter::NamePrep));
+ ASSERT_EQ(std::string(""), testling_->getStringPrepared("", IDNConverter::XMPPNodePrep));
+ ASSERT_EQ(std::string(""), testling_->getStringPrepared("", IDNConverter::XMPPResourcePrep));
+}
+
+TEST_F(IDNConverterTest, testStringPrep_MaximumOutputSize) {
+ const std::string input(1023, 'x');
+ ASSERT_EQ(input, testling_->getStringPrepared(input, IDNConverter::NamePrep));
+ ASSERT_EQ(input, testling_->getStringPrepared(input, IDNConverter::XMPPNodePrep));
+ ASSERT_EQ(input, testling_->getStringPrepared(input, IDNConverter::XMPPResourcePrep));
+}
+
+TEST_F(IDNConverterTest, testStringPrep_TooLong) {
+ const std::string input(1024, 'x');
+ ASSERT_THROW(testling_->getStringPrepared(input, IDNConverter::NamePrep), std::exception);
+ ASSERT_THROW(testling_->getStringPrepared(input, IDNConverter::XMPPNodePrep), std::exception);
+ ASSERT_THROW(testling_->getStringPrepared(input, IDNConverter::XMPPResourcePrep), std::exception);
+}
+
+TEST_F(IDNConverterTest, testStringPrep_ShrinkingBelow1023) {
+ std::string input;
+ std::string expected;
+ // The four byte \u03b1\u0313 UTF-8 string will shrink to the three byte \u1f00
+ for (auto i = 0; i < 300; ++i) {
+ input +="\xce\xb1\xcc\x93"; // UTF-8 repesentation of U+03B1 U+0313
+ expected += "\xe1\xbc\x80"; // UTF-8 representation of U+1F00
+ }
+ ASSERT_EQ(expected, testling_->getStringPrepared(input, IDNConverter::NamePrep));
+ ASSERT_EQ(expected, testling_->getStringPrepared(input, IDNConverter::XMPPNodePrep));
+ ASSERT_EQ(expected, testling_->getStringPrepared(input, IDNConverter::XMPPResourcePrep));
+}
+
+TEST_F(IDNConverterTest, testGetEncoded) {
+ boost::optional<std::string> result = testling_->getIDNAEncoded("www.swift.im");
+ ASSERT_TRUE(!!result);
+ ASSERT_EQ(std::string("www.swift.im"), *result);
+}
+
+TEST_F(IDNConverterTest, testGetEncoded_International) {
+ boost::optional<std::string> result = testling_->getIDNAEncoded("www.tron\xc3\x87on.com");
+ ASSERT_TRUE(result);
+ ASSERT_EQ(std::string("www.xn--tronon-zua.com"), *result);
+}
+
+TEST_F(IDNConverterTest, testGetEncoded_Invalid) {
+ boost::optional<std::string> result = testling_->getIDNAEncoded("www.foo,bar.com");
+ ASSERT_FALSE(result);
+}
+
+TEST_F(IDNConverterTest, testRFC1035LengthRestrictions) {
+ // label size check, 63 octets or less
+ ASSERT_TRUE(testling_->getIDNAEncoded(std::string(63, 'a') + ".example"));
+ ASSERT_TRUE(testling_->getIDNAEncoded(std::string(63, 'a') + "." + std::string(63, 'a') + ".example"));
+ ASSERT_FALSE(testling_->getIDNAEncoded(std::string(64, 'a') + "." + std::string(63, 'a') + ".example"));
+ ASSERT_FALSE(testling_->getIDNAEncoded(std::string(63, 'a') + "." + std::string(64, 'a') + ".example"));
+ ASSERT_FALSE(testling_->getIDNAEncoded(std::string(0, 'a') + "." + std::string(63, 'a') + ".example"));
+ ASSERT_FALSE(testling_->getIDNAEncoded(std::string(63, 'a') + "." + std::string(0, 'a') + ".example"));
+
+ // domain name 255 octets or less
+ ASSERT_TRUE(testling_->getIDNAEncoded(std::string(63, 'a') + ".example"));
+ ASSERT_TRUE(testling_->getIDNAEncoded(std::string(63, 'a') + "." + std::string(63, 'a') + ".example"));
+ ASSERT_TRUE(testling_->getIDNAEncoded(std::string(63, 'a') + "." + std::string(63, 'a') + "." + std::string(63, 'a') + ".example"));
+ ASSERT_TRUE(testling_->getIDNAEncoded(std::string(63, 'a') + "." + std::string(63, 'a') + "." + std::string(63, 'a') + "." + std::string(55, 'a') + ".example"));
+ ASSERT_FALSE(testling_->getIDNAEncoded(std::string(63, 'a') + "." + std::string(63, 'a') + "." + std::string(63, 'a') + "." + std::string(56, 'a') + ".example"));
+ ASSERT_FALSE(testling_->getIDNAEncoded(std::string(63, 'a') + "." + std::string(56, 'a') + "." + std::string(63, 'a') + "." + std::string(63, 'a') + ".example"));
+}
diff --git a/Swiften/JID/JID.cpp b/Swiften/JID/JID.cpp
index c82674d..eb72014 100644
--- a/Swiften/JID/JID.cpp
+++ b/Swiften/JID/JID.cpp
@@ -1,25 +1,19 @@
/*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
-#define SWIFTEN_CACHE_JID_PREP
-
#include <sstream>
#include <string>
#include <vector>
-#ifdef SWIFTEN_CACHE_JID_PREP
-#include <mutex>
-#include <unordered_map>
-#endif
-
#include <boost/optional.hpp>
#include <Swiften/Base/String.h>
#include <Swiften/IDN/IDNConverter.h>
#include <Swiften/JID/JID.h>
+#include <Swiften/Network/HostAddress.h>
#ifndef SWIFTEN_JID_NO_DEFAULT_IDN_CONVERTER
#include <memory>
@@ -28,15 +22,6 @@
using namespace Swift;
-#ifdef SWIFTEN_CACHE_JID_PREP
-typedef std::unordered_map<std::string, std::string> PrepCache;
-
-static std::mutex namePrepCacheMutex;
-static PrepCache nodePrepCache;
-static PrepCache domainPrepCache;
-static PrepCache resourcePrepCache;
-#endif
-
static const std::vector<char> escapedChars = {' ', '"', '&', '\'', '/', '<', '>', '@', ':'};
static IDNConverter* idnConverter = nullptr;
@@ -87,6 +72,33 @@ JID::JID(const std::string& node, const std::string& domain, const std::string&
nameprepAndSetComponents(node, domain, resource);
}
+JID::JID(const JID& other) {
+ this->operator=(other);
+}
+
+JID::JID(JID&& other) {
+ this->operator=(std::move(other));
+}
+
+JID& JID::operator=(const JID& other) {
+ valid_ = other.valid_;
+ node_ = other.node_;
+ domain_ = other.domain_;
+ hasResource_ = other.hasResource_;
+ resource_ = other.resource_;
+ return *this;
+}
+
+JID& JID::operator=(JID&& other) {
+ valid_ = other.valid_;
+ other.valid_ = false;
+ node_ = std::move(other.node_);
+ domain_ = std::move(other.domain_);
+ hasResource_ = other.hasResource_;
+ resource_ = std::move(other.resource_);
+ return *this;
+}
+
void JID::initializeFromString(const std::string& jid) {
if (String::beginsWith(jid, '@')) {
valid_ = false;
@@ -104,74 +116,76 @@ void JID::initializeFromString(const std::string& jid) {
hasResource_ = false;
bare = jid;
}
- std::pair<std::string,std::string> nodeAndDomain = String::getSplittedAtFirst(bare, '@');
- if (nodeAndDomain.second.empty()) {
- nameprepAndSetComponents("", nodeAndDomain.first, resource);
+ auto firstMatch = bare.find('@');
+ if (firstMatch != bare.npos) {
+ nameprepAndSetComponents(bare.substr(0, firstMatch), bare.substr(firstMatch + 1), resource);
}
else {
- nameprepAndSetComponents(nodeAndDomain.first, nodeAndDomain.second, resource);
+ nameprepAndSetComponents("", bare, resource);
}
}
-
-void JID::nameprepAndSetComponents(const std::string& node, const std::string& domain, const std::string& resource) {
- if (domain.empty() || !idnConverter->getIDNAEncoded(domain)) {
+void JID::setComponents(const std::string& node, const std::string& domain, const std::string& resource) {
+ domain_ = domain;
+ try {
+ node_ = idnConverter->getStringPrepared(node, IDNConverter::XMPPNodePrep);
+ resource_ = idnConverter->getStringPrepared(resource, IDNConverter::XMPPResourcePrep);
+ }
+ catch (...) {
valid_ = false;
return;
}
+}
- if (hasResource_ && resource.empty()) {
+void JID::nameprepAndSetComponents(const std::string& node, const std::string& domain, const std::string& resource) {
+ if (domain.empty() || (hasResource_ && resource.empty())) {
valid_ = false;
return;
}
-#ifndef SWIFTEN_CACHE_JID_PREP
- node_ = idnConverter->getStringPrepared(node, IDNConverter::XMPPNodePrep);
- domain_ = idnConverter->getStringPrepared(domain, IDNConverter::NamePrep);
- resource_ = idnConverter->getStringPrepared(resource, IDNConverter::XMPPResourcePrep);
-#else
- std::unique_lock<std::mutex> lock(namePrepCacheMutex);
-
- std::pair<PrepCache::iterator, bool> r;
-
- r = nodePrepCache.insert(std::make_pair(node, std::string()));
- if (r.second) {
- try {
- r.first->second = idnConverter->getStringPrepared(node, IDNConverter::XMPPNodePrep);
- }
- catch (...) {
- nodePrepCache.erase(r.first);
- valid_ = false;
+
+ // Handling IPv6 addresses according to RFC 3986 rules
+ // saying that they are enclosed in square brackets
+ // which we have to remove when passing to HostAddress
+ if (domain.size() > 2 && domain.front() == '[' && domain.back() == ']') {
+ auto inner = std::string(domain.begin() + 1, domain.end() - 1);
+ auto hostAddress = HostAddress::fromString(inner);
+ if (hostAddress && hostAddress->isValid()) {
+ setComponents(node, domain, resource);
return;
}
}
- node_ = r.first->second;
- r = domainPrepCache.insert(std::make_pair(domain, std::string()));
- if (r.second) {
- try {
- r.first->second = idnConverter->getStringPrepared(domain, IDNConverter::NamePrep);
- }
- catch (...) {
- domainPrepCache.erase(r.first);
- valid_ = false;
+ const auto isAnyOfNonNumericAndNotDot = std::any_of(std::begin(domain), std::end(domain), [](char c) {return !::isdigit(c) && c != '.'; });
+ const auto isDomainAllNumeric = std::all_of(std::begin(domain), std::end(domain), [](char c) {return ::isdigit(c) ; });
+
+ //Prevent Windows validating non-dotted integers as OK if it can unpack them
+ if (!isAnyOfNonNumericAndNotDot && !isDomainAllNumeric) {
+ auto hostAddress = HostAddress::fromString(domain);
+ if (hostAddress && hostAddress->isValid()) {
+ setComponents(node, domain, resource);
return;
}
}
- domain_ = r.first->second;
- r = resourcePrepCache.insert(std::make_pair(resource, std::string()));
- if (r.second) {
- try {
- r.first->second = idnConverter->getStringPrepared(resource, IDNConverter::XMPPResourcePrep);
+ if (!isAnyOfNonNumericAndNotDot || !idnConverter->getIDNAEncoded(domain)) {
+ valid_ = false;
+ return;
+ }
+
+ try {
+ node_ = idnConverter->getStringPrepared(node, IDNConverter::XMPPNodePrep);
+ if (domain.back() == '.') {
+ domain_ = idnConverter->getStringPrepared(domain.substr(0, domain.size() - 1), IDNConverter::NamePrep);
}
- catch (...) {
- resourcePrepCache.erase(r.first);
- valid_ = false;
- return;
+ else {
+ domain_ = idnConverter->getStringPrepared(domain, IDNConverter::NamePrep);
}
+ resource_ = idnConverter->getStringPrepared(resource, IDNConverter::XMPPResourcePrep);
+ }
+ catch (...) {
+ valid_ = false;
+ return;
}
- resource_ = r.first->second;
-#endif
if (domain_.empty()) {
valid_ = false;
diff --git a/Swiften/JID/JID.h b/Swiften/JID/JID.h
index dc92f53..aecc7cb 100644
--- a/Swiften/JID/JID.h
+++ b/Swiften/JID/JID.h
@@ -75,6 +75,11 @@ namespace Swift {
*/
JID(const std::string& node, const std::string& domain, const std::string& resource);
+ JID(const JID& other);
+ JID(JID&& other);
+ JID& operator=(const JID& other);
+ JID& operator=(JID&& other);
+
/**
* @return Is a correctly-formatted JID.
*/
@@ -184,6 +189,7 @@ namespace Swift {
private:
void nameprepAndSetComponents(const std::string& node, const std::string& domain, const std::string& resource);
+ void setComponents(const std::string& node, const std::string& domain, const std::string& resource);
void initializeFromString(const std::string&);
private:
diff --git a/Swiften/JID/UnitTest/JIDTest.cpp b/Swiften/JID/UnitTest/JIDTest.cpp
index ca3e5ae..fc7583f 100644
--- a/Swiften/JID/UnitTest/JIDTest.cpp
+++ b/Swiften/JID/UnitTest/JIDTest.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -20,11 +20,20 @@ class JIDTest : public CppUnit::TestFixture
CPPUNIT_TEST(testConstructorWithString_NoNode);
CPPUNIT_TEST(testConstructorWithString_EmptyResource);
CPPUNIT_TEST(testConstructorWithString_OnlyDomain);
+ CPPUNIT_TEST(testConstructorWithString_OnlyDomainWithDot);
+ CPPUNIT_TEST(testConstructorWithString_OnlyDomainDotStrippedOff);
+ CPPUNIT_TEST(testConstructorWithString_InvalidOnlyDomainSingleDot);
CPPUNIT_TEST(testConstructorWithString_InvalidDomain);
+ CPPUNIT_TEST(testConstructorWithString_InvalidDomainOnlyDigits);
+ CPPUNIT_TEST(testConstructorWithString_InvalidDomainEmptyLabel);
CPPUNIT_TEST(testConstructorWithString_UpperCaseNode);
CPPUNIT_TEST(testConstructorWithString_UpperCaseDomain);
CPPUNIT_TEST(testConstructorWithString_UpperCaseResource);
CPPUNIT_TEST(testConstructorWithString_EmptyNode);
+ CPPUNIT_TEST(testConstructorWithString_EmptyDomain);
+ CPPUNIT_TEST(testConstructorWithString_EmptyDomainWithResource);
+ CPPUNIT_TEST(testConstructorWithString_DotDomain);
+ CPPUNIT_TEST(testConstructorWithString_DotDomainWithResource);
CPPUNIT_TEST(testConstructorWithString_IllegalResource);
CPPUNIT_TEST(testConstructorWithString_SpacesInNode);
CPPUNIT_TEST(testConstructorWithStrings);
@@ -62,6 +71,13 @@ class JIDTest : public CppUnit::TestFixture
CPPUNIT_TEST(testGetEscapedNode_BackslashAtEnd);
CPPUNIT_TEST(testGetUnescapedNode);
CPPUNIT_TEST(testGetUnescapedNode_XEP106Examples);
+ CPPUNIT_TEST(testStringPrepFailures);
+ CPPUNIT_TEST(testConstructorWithString_DomainIPv4);
+ CPPUNIT_TEST(testConstructorWithString_DomainNOTIPv4);
+ CPPUNIT_TEST(testConstructorWithString_ValidDomainNOTIPv4);
+ CPPUNIT_TEST(testConstructorWithString_DomainIPv6);
+ CPPUNIT_TEST(testConstructorWithString_DomainInvalidIPv6);
+ CPPUNIT_TEST(testConstructorWithString_DomainIPv6NoBrackets);
CPPUNIT_TEST_SUITE_END();
public:
@@ -119,10 +135,42 @@ class JIDTest : public CppUnit::TestFixture
CPPUNIT_ASSERT(testling.isValid());
}
+ void testConstructorWithString_OnlyDomainWithDot() {
+ JID testling("bar.");
+
+ CPPUNIT_ASSERT_EQUAL(std::string(""), testling.getNode());
+ CPPUNIT_ASSERT_EQUAL(std::string("bar"), testling.getDomain());
+ CPPUNIT_ASSERT_EQUAL(std::string(""), testling.getResource());
+ CPPUNIT_ASSERT(testling.isBare());
+ CPPUNIT_ASSERT(testling.isValid());
+ }
+
+ void testConstructorWithString_OnlyDomainDotStrippedOff() {
+ JID testling("foo.@bar./resource.");
+
+ CPPUNIT_ASSERT_EQUAL(std::string("foo."), testling.getNode());
+ CPPUNIT_ASSERT_EQUAL(std::string("bar"), testling.getDomain());
+ CPPUNIT_ASSERT_EQUAL(std::string("resource."), testling.getResource());
+ CPPUNIT_ASSERT(!testling.isBare());
+ CPPUNIT_ASSERT(testling.isValid());
+ }
+
+ void testConstructorWithString_InvalidOnlyDomainSingleDot() {
+ CPPUNIT_ASSERT(!JID(".").isValid());
+ }
+
void testConstructorWithString_InvalidDomain() {
CPPUNIT_ASSERT(!JID("foo@bar,baz").isValid());
}
+ void testConstructorWithString_InvalidDomainOnlyDigits() {
+ CPPUNIT_ASSERT(!JID("1234").isValid());
+ }
+
+ void testConstructorWithString_InvalidDomainEmptyLabel() {
+ CPPUNIT_ASSERT(!JID("foo@bar..").isValid());
+ }
+
void testConstructorWithString_UpperCaseNode() {
JID testling("Fo\xCE\xA9@bar");
@@ -151,6 +199,36 @@ class JIDTest : public CppUnit::TestFixture
CPPUNIT_ASSERT(!testling.isValid());
}
+ void testConstructorWithString_EmptyDomain() {
+ JID testling("bar@");
+
+ CPPUNIT_ASSERT(!testling.isValid());
+ }
+
+ void testStringPrepFailures() {
+ CPPUNIT_ASSERT_EQUAL(false, JID("foo@bar", "example.com").isValid());
+ CPPUNIT_ASSERT_EQUAL(false, JID("foo^", "example*com").isValid());
+ CPPUNIT_ASSERT_EQUAL(false, JID("foobar", "example^com").isValid());
+ }
+
+ void testConstructorWithString_EmptyDomainWithResource() {
+ JID testling("bar@/resource");
+
+ CPPUNIT_ASSERT(!testling.isValid());
+ }
+
+ void testConstructorWithString_DotDomain() {
+ JID testling("bar@.");
+
+ CPPUNIT_ASSERT(!testling.isValid());
+ }
+
+ void testConstructorWithString_DotDomainWithResource() {
+ JID testling("bar@./resource");
+
+ CPPUNIT_ASSERT(!testling.isValid());
+ }
+
void testConstructorWithString_IllegalResource() {
JID testling("foo@bar.com/\xd8\xb1\xd9\x85\xd9\x82\xd9\x87\x20\xd8\xaa\xd8\xb1\xd9\x86\xd8\xb3\x20");
@@ -425,6 +503,46 @@ class JIDTest : public CppUnit::TestFixture
CPPUNIT_ASSERT_EQUAL(std::string("c:\\cool stuff"), JID("c\\3a\\cool\\20stuff@example.com").getUnescapedNode());
CPPUNIT_ASSERT_EQUAL(std::string("c:\\5commas"), JID("c\\3a\\5c5commas@example.com").getUnescapedNode());
}
+
+ void testConstructorWithString_DomainIPv4() {
+ JID testling("foo@192.34.12.1/resource");
+
+ CPPUNIT_ASSERT_EQUAL(std::string("foo"), testling.getNode());
+ CPPUNIT_ASSERT_EQUAL(std::string("192.34.12.1"), testling.getDomain());
+ CPPUNIT_ASSERT_EQUAL(std::string("resource"), testling.getResource());
+ CPPUNIT_ASSERT(!testling.isBare());
+ CPPUNIT_ASSERT(testling.isValid());
+ }
+
+ void testConstructorWithString_DomainNOTIPv4() {
+ JID testling("foo@500.34.12.1/resource");
+ CPPUNIT_ASSERT(!testling.isValid());
+ }
+
+ void testConstructorWithString_ValidDomainNOTIPv4() {
+ JID testling("foo@500.34.12.1a/resource");
+ CPPUNIT_ASSERT(testling.isValid());
+ }
+
+ void testConstructorWithString_DomainIPv6() {
+ JID testling("foo@[fe80::a857:33ff:febd:3580]/resource");
+
+ CPPUNIT_ASSERT_EQUAL(std::string("foo"), testling.getNode());
+ CPPUNIT_ASSERT_EQUAL(std::string("[fe80::a857:33ff:febd:3580]"), testling.getDomain());
+ CPPUNIT_ASSERT_EQUAL(std::string("resource"), testling.getResource());
+ CPPUNIT_ASSERT(!testling.isBare());
+ CPPUNIT_ASSERT(testling.isValid());
+ }
+
+ void testConstructorWithString_DomainInvalidIPv6() {
+ JID testling("foo@[1111::a1111:1111:111!:!!!!]/resource");
+ CPPUNIT_ASSERT(!testling.isValid());
+ }
+
+ void testConstructorWithString_DomainIPv6NoBrackets() {
+ JID testling("foo@fe80::a857:33ff:febd:3580/resource");
+ CPPUNIT_ASSERT(!testling.isValid());
+ }
};
CPPUNIT_TEST_SUITE_REGISTRATION(JIDTest);
diff --git a/Swiften/Jingle/AbstractJingleSessionListener.cpp b/Swiften/Jingle/AbstractJingleSessionListener.cpp
index 20edf15..56d2e92 100644
--- a/Swiften/Jingle/AbstractJingleSessionListener.cpp
+++ b/Swiften/Jingle/AbstractJingleSessionListener.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2013-2016 Isode Limited.
+ * Copyright (c) 2013-2019 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -11,31 +11,31 @@
using namespace Swift;
void AbstractJingleSessionListener::handleSessionAcceptReceived(const JingleContentID&, std::shared_ptr<JingleDescription>, std::shared_ptr<JingleTransportPayload>) {
- SWIFT_LOG(warning) << "Unimplemented" << std::endl;
+ SWIFT_LOG(warning) << "Unimplemented";
}
void AbstractJingleSessionListener::handleSessionInfoReceived(std::shared_ptr<JinglePayload>) {
- SWIFT_LOG(warning) << "Unimplemented" << std::endl;
+ SWIFT_LOG(warning) << "Unimplemented";
}
void AbstractJingleSessionListener::handleSessionTerminateReceived(boost::optional<JinglePayload::Reason>) {
- SWIFT_LOG(warning) << "Unimplemented" << std::endl;
+ SWIFT_LOG(warning) << "Unimplemented";
}
void AbstractJingleSessionListener::handleTransportAcceptReceived(const JingleContentID&, std::shared_ptr<JingleTransportPayload>) {
- SWIFT_LOG(warning) << "Unimplemented" << std::endl;
+ SWIFT_LOG(warning) << "Unimplemented";
}
void AbstractJingleSessionListener::handleTransportInfoReceived(const JingleContentID&, std::shared_ptr<JingleTransportPayload>) {
- SWIFT_LOG(warning) << "Unimplemented" << std::endl;
+ SWIFT_LOG(warning) << "Unimplemented";
}
void AbstractJingleSessionListener::handleTransportRejectReceived(const JingleContentID&, std::shared_ptr<JingleTransportPayload>) {
- SWIFT_LOG(warning) << "Unimplemented" << std::endl;
+ SWIFT_LOG(warning) << "Unimplemented";
}
void AbstractJingleSessionListener::handleTransportReplaceReceived(const JingleContentID&, std::shared_ptr<JingleTransportPayload>) {
- SWIFT_LOG(warning) << "Unimplemented" << std::endl;
+ SWIFT_LOG(warning) << "Unimplemented";
}
void AbstractJingleSessionListener::handleTransportInfoAcknowledged(const std::string&) {
diff --git a/Swiften/Jingle/JingleResponder.cpp b/Swiften/Jingle/JingleResponder.cpp
index 09bb234..af9808e 100644
--- a/Swiften/Jingle/JingleResponder.cpp
+++ b/Swiften/Jingle/JingleResponder.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2011-2016 Isode Limited.
+ * Copyright (c) 2011-2019 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -32,17 +32,17 @@ bool JingleResponder::handleSetRequest(const JID& from, const JID& to, const std
JingleSessionImpl::ref session = std::make_shared<JingleSessionImpl>(payload->getInitiator(), from, payload->getSessionID(), router);
sessionManager->handleIncomingSession(from, to, session, payload->getContents());
} else {
- SWIFT_LOG(debug) << "Unable to create Jingle session due to initiator not being a full JID." << std::endl;
+ SWIFT_LOG(debug) << "Unable to create Jingle session due to initiator not being a full JID.";
}
}
}
else {
JingleSessionImpl::ref session;
if (payload->getInitiator().isValid()) {
- SWIFT_LOG(debug) << "Lookup session by initiator." << std::endl;
+ SWIFT_LOG(debug) << "Lookup session by initiator.";
session = sessionManager->getSession(payload->getInitiator(), payload->getSessionID());
} else {
- SWIFT_LOG(debug) << "Lookup session by from attribute." << std::endl;
+ SWIFT_LOG(debug) << "Lookup session by from attribute.";
session = sessionManager->getSession(from, payload->getSessionID());
}
if (session) {
diff --git a/Swiften/Jingle/JingleSessionImpl.cpp b/Swiften/Jingle/JingleSessionImpl.cpp
index 06aa039..b4c5d03 100644
--- a/Swiften/Jingle/JingleSessionImpl.cpp
+++ b/Swiften/Jingle/JingleSessionImpl.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2019 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -23,7 +23,7 @@
namespace Swift {
JingleSessionImpl::JingleSessionImpl(const JID& initiator, const JID& peerJID, const std::string& id, IQRouter* router) : JingleSession(initiator, id), iqRouter(router), peerJID(peerJID) {
- SWIFT_LOG(debug) << "initiator: " << initiator << ", peerJID: " << peerJID << std::endl;
+ SWIFT_LOG(debug) << "initiator: " << initiator << ", peerJID: " << peerJID;
}
void JingleSessionImpl::handleIncomingAction(JinglePayload::ref action) {
@@ -38,7 +38,7 @@ void JingleSessionImpl::handleIncomingAction(JinglePayload::ref action) {
JingleContentPayload::ref content = action->getPayload<JingleContentPayload>();
if (!content) {
- SWIFT_LOG(debug) << "no content payload!" << std::endl;
+ SWIFT_LOG(debug) << "no content payload!";
return;
}
JingleContentID contentID(content->getName(), content->getCreator());
diff --git a/Swiften/Jingle/JingleSessionManager.cpp b/Swiften/Jingle/JingleSessionManager.cpp
index f7ed58e..083554a 100644
--- a/Swiften/Jingle/JingleSessionManager.cpp
+++ b/Swiften/Jingle/JingleSessionManager.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2011-2016 Isode Limited.
+ * Copyright (c) 2011-2019 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -38,7 +38,7 @@ void JingleSessionManager::removeIncomingSessionHandler(IncomingJingleSessionHan
void JingleSessionManager::registerOutgoingSession(const JID& initiator, JingleSessionImpl::ref session) {
sessions.insert(std::make_pair(JIDSession(initiator, session->getID()), session));
- SWIFT_LOG(debug) << "Added session " << session->getID() << " for initiator " << initiator.toString() << std::endl;
+ SWIFT_LOG(debug) << "Added session " << session->getID() << " for initiator " << initiator.toString();
}
void JingleSessionManager::handleIncomingSession(const JID& initiator, const JID& recipient, JingleSessionImpl::ref session, const std::vector<JingleContentPayload::ref>& contents) {
diff --git a/Swiften/LinkLocal/DNSSD/Avahi/AvahiQuerier.cpp b/Swiften/LinkLocal/DNSSD/Avahi/AvahiQuerier.cpp
index 1b79946..66b4ae8 100644
--- a/Swiften/LinkLocal/DNSSD/Avahi/AvahiQuerier.cpp
+++ b/Swiften/LinkLocal/DNSSD/Avahi/AvahiQuerier.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -25,7 +25,7 @@ std::shared_ptr<DNSSDBrowseQuery> AvahiQuerier::createBrowseQuery() {
return std::make_shared<AvahiBrowseQuery>(shared_from_this(), eventLoop);
}
-std::shared_ptr<DNSSDRegisterQuery> AvahiQuerier::createRegisterQuery(const std::string& name, int port, const ByteArray& info) {
+std::shared_ptr<DNSSDRegisterQuery> AvahiQuerier::createRegisterQuery(const std::string& name, unsigned short port, const ByteArray& info) {
return std::make_shared<AvahiRegisterQuery>(name, port, info, shared_from_this(), eventLoop);
}
diff --git a/Swiften/LinkLocal/DNSSD/Avahi/AvahiQuerier.h b/Swiften/LinkLocal/DNSSD/Avahi/AvahiQuerier.h
index 5dce19d..73dd11d 100644
--- a/Swiften/LinkLocal/DNSSD/Avahi/AvahiQuerier.h
+++ b/Swiften/LinkLocal/DNSSD/Avahi/AvahiQuerier.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -30,7 +30,7 @@ namespace Swift {
std::shared_ptr<DNSSDBrowseQuery> createBrowseQuery();
std::shared_ptr<DNSSDRegisterQuery> createRegisterQuery(
- const std::string& name, int port, const ByteArray& info);
+ const std::string& name, unsigned short port, const ByteArray& info);
std::shared_ptr<DNSSDResolveServiceQuery> createResolveServiceQuery(
const DNSSDServiceID&);
std::shared_ptr<DNSSDResolveHostnameQuery> createResolveHostnameQuery(
diff --git a/Swiften/LinkLocal/DNSSD/Avahi/AvahiRegisterQuery.h b/Swiften/LinkLocal/DNSSD/Avahi/AvahiRegisterQuery.h
index 68281d0..b780043 100644
--- a/Swiften/LinkLocal/DNSSD/Avahi/AvahiRegisterQuery.h
+++ b/Swiften/LinkLocal/DNSSD/Avahi/AvahiRegisterQuery.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -18,7 +18,7 @@ namespace Swift {
class AvahiRegisterQuery : public DNSSDRegisterQuery, public AvahiQuery {
public:
- AvahiRegisterQuery(const std::string& name, int port, const ByteArray& txtRecord, std::shared_ptr<AvahiQuerier> querier, EventLoop* eventLoop) : AvahiQuery(querier, eventLoop), name(name), port(port), txtRecord(txtRecord), group(0) {
+ AvahiRegisterQuery(const std::string& name, unsigned short port, const ByteArray& txtRecord, std::shared_ptr<AvahiQuerier> querier, EventLoop* eventLoop) : AvahiQuery(querier, eventLoop), name(name), port(port), txtRecord(txtRecord), group(0) {
}
void registerService();
@@ -50,7 +50,7 @@ namespace Swift {
private:
std::string name;
- int port;
+ unsigned short port;
ByteArray txtRecord;
AvahiEntryGroup* group;
};
diff --git a/Swiften/LinkLocal/DNSSD/Avahi/AvahiResolveHostnameQuery.cpp b/Swiften/LinkLocal/DNSSD/Avahi/AvahiResolveHostnameQuery.cpp
index 08de722..262add3 100644
--- a/Swiften/LinkLocal/DNSSD/Avahi/AvahiResolveHostnameQuery.cpp
+++ b/Swiften/LinkLocal/DNSSD/Avahi/AvahiResolveHostnameQuery.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2019 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -15,7 +15,7 @@
namespace Swift {
AvahiResolveHostnameQuery::AvahiResolveHostnameQuery(const std::string& hostname, int, std::shared_ptr<AvahiQuerier> querier, EventLoop* eventLoop) : AvahiQuery(querier, eventLoop), hostname(hostname) {
- SWIFT_LOG(debug) << "Resolving hostname " << hostname << std::endl;
+ SWIFT_LOG(debug) << "Resolving hostname " << hostname;
}
void AvahiResolveHostnameQuery::run() {
diff --git a/Swiften/LinkLocal/DNSSD/Bonjour/BonjourBrowseQuery.h b/Swiften/LinkLocal/DNSSD/Bonjour/BonjourBrowseQuery.h
index c049ed2..63f34db 100644
--- a/Swiften/LinkLocal/DNSSD/Bonjour/BonjourBrowseQuery.h
+++ b/Swiften/LinkLocal/DNSSD/Bonjour/BonjourBrowseQuery.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -50,12 +50,17 @@ namespace Swift {
}
else {
//std::cout << "Discovered service: name:" << name << " domain:" << domain << " type: " << type << std::endl;
- DNSSDServiceID service(name, domain, type, boost::numeric_cast<int>(interfaceIndex));
- if (flags & kDNSServiceFlagsAdd) {
- eventLoop->postEvent(boost::bind(boost::ref(onServiceAdded), service), shared_from_this());
+ try {
+ DNSSDServiceID service(name, domain, type, boost::numeric_cast<int>(interfaceIndex));
+ if (flags & kDNSServiceFlagsAdd) {
+ eventLoop->postEvent(boost::bind(boost::ref(onServiceAdded), service), shared_from_this());
+ }
+ else {
+ eventLoop->postEvent(boost::bind(boost::ref(onServiceRemoved), service), shared_from_this());
+ }
}
- else {
- eventLoop->postEvent(boost::bind(boost::ref(onServiceRemoved), service), shared_from_this());
+ catch (...) {
+ eventLoop->postEvent(boost::bind(boost::ref(onError)), shared_from_this());
}
}
}
diff --git a/Swiften/LinkLocal/DNSSD/Bonjour/BonjourQuerier.cpp b/Swiften/LinkLocal/DNSSD/Bonjour/BonjourQuerier.cpp
index 0906ffc..551421e 100644
--- a/Swiften/LinkLocal/DNSSD/Bonjour/BonjourQuerier.cpp
+++ b/Swiften/LinkLocal/DNSSD/Bonjour/BonjourQuerier.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -11,6 +11,7 @@
#include <unistd.h>
#include <Swiften/Base/Algorithm.h>
+#include <Swiften/Base/Log.h>
#include <Swiften/LinkLocal/DNSSD/Bonjour/BonjourBrowseQuery.h>
#include <Swiften/LinkLocal/DNSSD/Bonjour/BonjourRegisterQuery.h>
#include <Swiften/LinkLocal/DNSSD/Bonjour/BonjourResolveHostnameQuery.h>
@@ -36,7 +37,7 @@ std::shared_ptr<DNSSDBrowseQuery> BonjourQuerier::createBrowseQuery() {
return std::make_shared<BonjourBrowseQuery>(shared_from_this(), eventLoop);
}
-std::shared_ptr<DNSSDRegisterQuery> BonjourQuerier::createRegisterQuery(const std::string& name, int port, const ByteArray& info) {
+std::shared_ptr<DNSSDRegisterQuery> BonjourQuerier::createRegisterQuery(const std::string& name, unsigned short port, const ByteArray& info) {
return std::make_shared<BonjourRegisterQuery>(name, port, info, shared_from_this(), eventLoop);
}
diff --git a/Swiften/LinkLocal/DNSSD/Bonjour/BonjourQuerier.h b/Swiften/LinkLocal/DNSSD/Bonjour/BonjourQuerier.h
index 77326bc..6af1c1f 100644
--- a/Swiften/LinkLocal/DNSSD/Bonjour/BonjourQuerier.h
+++ b/Swiften/LinkLocal/DNSSD/Bonjour/BonjourQuerier.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -25,7 +25,7 @@ namespace Swift {
std::shared_ptr<DNSSDBrowseQuery> createBrowseQuery();
std::shared_ptr<DNSSDRegisterQuery> createRegisterQuery(
- const std::string& name, int port, const ByteArray& info);
+ const std::string& name, unsigned short port, const ByteArray& info);
std::shared_ptr<DNSSDResolveServiceQuery> createResolveServiceQuery(
const DNSSDServiceID&);
std::shared_ptr<DNSSDResolveHostnameQuery> createResolveHostnameQuery(
diff --git a/Swiften/LinkLocal/DNSSD/Bonjour/BonjourRegisterQuery.h b/Swiften/LinkLocal/DNSSD/Bonjour/BonjourRegisterQuery.h
index 8b2e955..cc95d64 100644
--- a/Swiften/LinkLocal/DNSSD/Bonjour/BonjourRegisterQuery.h
+++ b/Swiften/LinkLocal/DNSSD/Bonjour/BonjourRegisterQuery.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2019 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -20,12 +20,21 @@ namespace Swift {
class BonjourRegisterQuery : public DNSSDRegisterQuery, public BonjourQuery {
public:
- BonjourRegisterQuery(const std::string& name, int port, const ByteArray& txtRecord, std::shared_ptr<BonjourQuerier> querier, EventLoop* eventLoop) : BonjourQuery(querier, eventLoop) {
+ BonjourRegisterQuery(const std::string& name, unsigned short port, const ByteArray& txtRecord, std::shared_ptr<BonjourQuerier> querier, EventLoop* eventLoop) : BonjourQuery(querier, eventLoop) {
+ unsigned short recordSize = 0;
+ try {
+ recordSize = boost::numeric_cast<unsigned short>(txtRecord.size());
+ }
+ catch (const boost::numeric::bad_numeric_cast&) {
+ SWIFT_LOG(warning) << "Bonjour TXT record is too long (" << txtRecord.size() << " bytes), not registring service";
+ return;
+ }
DNSServiceErrorType result = DNSServiceRegister(
- &sdRef, 0, 0, name.c_str(), "_presence._tcp", nullptr, nullptr, boost::numeric_cast<unsigned short>(port),
- boost::numeric_cast<unsigned short>(txtRecord.size()), vecptr(txtRecord),
+ &sdRef, 0, 0, name.c_str(), "_presence._tcp", nullptr, nullptr, port,
+ recordSize, vecptr(txtRecord),
&BonjourRegisterQuery::handleServiceRegisteredStatic, this);
if (result != kDNSServiceErr_NoError) {
+ SWIFT_LOG(warning) << "Failed to register Bonjour service";
sdRef = nullptr;
}
}
@@ -45,7 +54,12 @@ namespace Swift {
void updateServiceInfo(const ByteArray& txtRecord) {
std::lock_guard<std::mutex> lock(sdRefMutex);
- DNSServiceUpdateRecord(sdRef, nullptr, 0, boost::numeric_cast<unsigned short>(txtRecord.size()), vecptr(txtRecord), 0);
+ try {
+ DNSServiceUpdateRecord(sdRef, nullptr, 0, boost::numeric_cast<unsigned short>(txtRecord.size()), vecptr(txtRecord), 0);
+ }
+ catch (const boost::numeric::bad_numeric_cast&) {
+ SWIFT_LOG(warning) << "Bonjour TXT record is too long (" << txtRecord.size() << " bytes), not updating service record";
+ }
}
private:
diff --git a/Swiften/LinkLocal/DNSSD/Bonjour/BonjourResolveHostnameQuery.h b/Swiften/LinkLocal/DNSSD/Bonjour/BonjourResolveHostnameQuery.h
index dbf3f0e..61f000e 100644
--- a/Swiften/LinkLocal/DNSSD/Bonjour/BonjourResolveHostnameQuery.h
+++ b/Swiften/LinkLocal/DNSSD/Bonjour/BonjourResolveHostnameQuery.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -23,11 +23,16 @@ namespace Swift {
class BonjourResolveHostnameQuery : public DNSSDResolveHostnameQuery, public BonjourQuery {
public:
BonjourResolveHostnameQuery(const std::string& hostname, int interfaceIndex, std::shared_ptr<BonjourQuerier> querier, EventLoop* eventLoop) : BonjourQuery(querier, eventLoop) {
- DNSServiceErrorType result = DNSServiceGetAddrInfo(
- &sdRef, 0, boost::numeric_cast<unsigned int>(interfaceIndex), kDNSServiceProtocol_IPv4,
- hostname.c_str(),
- &BonjourResolveHostnameQuery::handleHostnameResolvedStatic, this);
- if (result != kDNSServiceErr_NoError) {
+ try {
+ DNSServiceErrorType result = DNSServiceGetAddrInfo(
+ &sdRef, 0, boost::numeric_cast<unsigned int>(interfaceIndex), kDNSServiceProtocol_IPv4,
+ hostname.c_str(),
+ &BonjourResolveHostnameQuery::handleHostnameResolvedStatic, this);
+ if (result != kDNSServiceErr_NoError) {
+ sdRef = nullptr;
+ }
+ }
+ catch (...) {
sdRef = nullptr;
}
}
diff --git a/Swiften/LinkLocal/DNSSD/Bonjour/BonjourResolveServiceQuery.h b/Swiften/LinkLocal/DNSSD/Bonjour/BonjourResolveServiceQuery.h
index 7a5555e..4baf87b 100644
--- a/Swiften/LinkLocal/DNSSD/Bonjour/BonjourResolveServiceQuery.h
+++ b/Swiften/LinkLocal/DNSSD/Bonjour/BonjourResolveServiceQuery.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -20,12 +20,17 @@ namespace Swift {
class BonjourResolveServiceQuery : public DNSSDResolveServiceQuery, public BonjourQuery {
public:
BonjourResolveServiceQuery(const DNSSDServiceID& service, std::shared_ptr<BonjourQuerier> querier, EventLoop* eventLoop) : BonjourQuery(querier, eventLoop) {
- DNSServiceErrorType result = DNSServiceResolve(
- &sdRef, 0, boost::numeric_cast<unsigned int>(service.getNetworkInterfaceID()),
- service.getName().c_str(), service.getType().c_str(),
- service.getDomain().c_str(),
- &BonjourResolveServiceQuery::handleServiceResolvedStatic, this);
- if (result != kDNSServiceErr_NoError) {
+ try {
+ DNSServiceErrorType result = DNSServiceResolve(
+ &sdRef, 0, boost::numeric_cast<unsigned int>(service.getNetworkInterfaceID()),
+ service.getName().c_str(), service.getType().c_str(),
+ service.getDomain().c_str(),
+ &BonjourResolveServiceQuery::handleServiceResolvedStatic, this);
+ if (result != kDNSServiceErr_NoError) {
+ sdRef = nullptr;
+ }
+ }
+ catch (...) {
sdRef = nullptr;
}
}
diff --git a/Swiften/LinkLocal/DNSSD/DNSSDQuerier.h b/Swiften/LinkLocal/DNSSD/DNSSDQuerier.h
index 8f3c3ec..3924c05 100644
--- a/Swiften/LinkLocal/DNSSD/DNSSDQuerier.h
+++ b/Swiften/LinkLocal/DNSSD/DNSSDQuerier.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -26,7 +26,7 @@ namespace Swift {
virtual std::shared_ptr<DNSSDBrowseQuery> createBrowseQuery() = 0;
virtual std::shared_ptr<DNSSDRegisterQuery> createRegisterQuery(
- const std::string& name, int port, const ByteArray& info) = 0;
+ const std::string& name, unsigned short port, const ByteArray& info) = 0;
virtual std::shared_ptr<DNSSDResolveServiceQuery> createResolveServiceQuery(
const DNSSDServiceID&) = 0;
virtual std::shared_ptr<DNSSDResolveHostnameQuery> createResolveHostnameQuery(
diff --git a/Swiften/LinkLocal/DNSSD/DNSSDResolveServiceQuery.h b/Swiften/LinkLocal/DNSSD/DNSSDResolveServiceQuery.h
index b55447a..6416d69 100644
--- a/Swiften/LinkLocal/DNSSD/DNSSDResolveServiceQuery.h
+++ b/Swiften/LinkLocal/DNSSD/DNSSDResolveServiceQuery.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -16,11 +16,11 @@ namespace Swift {
class DNSSDResolveServiceQuery {
public:
struct Result {
- Result(const std::string& fullName, const std::string& host, int port, const ByteArray& info) :
+ Result(const std::string& fullName, const std::string& host, unsigned short port, const ByteArray& info) :
fullName(fullName), host(host), port(port), info(info) {}
std::string fullName;
std::string host;
- int port;
+ unsigned short port;
ByteArray info;
};
diff --git a/Swiften/LinkLocal/DNSSD/Fake/FakeDNSSDQuerier.cpp b/Swiften/LinkLocal/DNSSD/Fake/FakeDNSSDQuerier.cpp
index c17f8b2..3381a26 100644
--- a/Swiften/LinkLocal/DNSSD/Fake/FakeDNSSDQuerier.cpp
+++ b/Swiften/LinkLocal/DNSSD/Fake/FakeDNSSDQuerier.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -32,7 +32,7 @@ std::shared_ptr<DNSSDBrowseQuery> FakeDNSSDQuerier::createBrowseQuery() {
return std::make_shared<FakeDNSSDBrowseQuery>(shared_from_this());
}
-std::shared_ptr<DNSSDRegisterQuery> FakeDNSSDQuerier::createRegisterQuery(const std::string& name, int port, const ByteArray& info) {
+std::shared_ptr<DNSSDRegisterQuery> FakeDNSSDQuerier::createRegisterQuery(const std::string& name, unsigned short port, const ByteArray& info) {
return std::make_shared<FakeDNSSDRegisterQuery>(name, port, info, shared_from_this());
}
@@ -105,7 +105,7 @@ void FakeDNSSDQuerier::setServiceInfo(const DNSSDServiceID& id, const DNSSDResol
}
}
-bool FakeDNSSDQuerier::isServiceRegistered(const std::string& name, int port, const ByteArray& info) {
+bool FakeDNSSDQuerier::isServiceRegistered(const std::string& name, unsigned short port, const ByteArray& info) {
for (const auto& query : getQueries<FakeDNSSDRegisterQuery>()) {
if (query->name == name && query->port == port && query->info == info) {
return true;
diff --git a/Swiften/LinkLocal/DNSSD/Fake/FakeDNSSDQuerier.h b/Swiften/LinkLocal/DNSSD/Fake/FakeDNSSDQuerier.h
index 5d4fefd..07cb75c 100644
--- a/Swiften/LinkLocal/DNSSD/Fake/FakeDNSSDQuerier.h
+++ b/Swiften/LinkLocal/DNSSD/Fake/FakeDNSSDQuerier.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010-2017 Isode Limited.
+ * Copyright (c) 2010-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -39,7 +39,7 @@ namespace Swift {
std::shared_ptr<DNSSDBrowseQuery> createBrowseQuery();
std::shared_ptr<DNSSDRegisterQuery> createRegisterQuery(
- const std::string& name, int port, const ByteArray& info);
+ const std::string& name, unsigned short port, const ByteArray& info);
std::shared_ptr<DNSSDResolveServiceQuery> createResolveServiceQuery(
const DNSSDServiceID&);
std::shared_ptr<DNSSDResolveHostnameQuery> createResolveHostnameQuery(
@@ -51,7 +51,7 @@ namespace Swift {
void addService(const DNSSDServiceID& id);
void removeService(const DNSSDServiceID& id);
void setServiceInfo(const DNSSDServiceID& id, const DNSSDResolveServiceQuery::Result& info);
- bool isServiceRegistered(const std::string& name, int port, const ByteArray& info);
+ bool isServiceRegistered(const std::string& name, unsigned short port, const ByteArray& info);
void setAddress(const std::string& hostname, boost::optional<HostAddress> address);
void setBrowseError();
diff --git a/Swiften/LinkLocal/DNSSD/Fake/FakeDNSSDRegisterQuery.h b/Swiften/LinkLocal/DNSSD/Fake/FakeDNSSDRegisterQuery.h
index 7478841..ee6bb92 100644
--- a/Swiften/LinkLocal/DNSSD/Fake/FakeDNSSDRegisterQuery.h
+++ b/Swiften/LinkLocal/DNSSD/Fake/FakeDNSSDRegisterQuery.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -17,7 +17,7 @@ namespace Swift {
class FakeDNSSDRegisterQuery : public DNSSDRegisterQuery, public FakeDNSSDQuery {
public:
- FakeDNSSDRegisterQuery(const std::string& name, int port, const ByteArray& info, std::shared_ptr<FakeDNSSDQuerier> querier) : FakeDNSSDQuery(querier), name(name), port(port), info(info) {
+ FakeDNSSDRegisterQuery(const std::string& name, unsigned short port, const ByteArray& info, std::shared_ptr<FakeDNSSDQuerier> querier) : FakeDNSSDQuery(querier), name(name), port(port), info(info) {
}
void registerService() {
@@ -33,7 +33,7 @@ namespace Swift {
}
std::string name;
- int port;
+ unsigned short port;
ByteArray info;
};
}
diff --git a/Swiften/LinkLocal/LinkLocalService.h b/Swiften/LinkLocal/LinkLocalService.h
index 9b0e2ab..c51f890 100644
--- a/Swiften/LinkLocal/LinkLocalService.h
+++ b/Swiften/LinkLocal/LinkLocalService.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -31,7 +31,7 @@ namespace Swift {
return id.getName();
}
- int getPort() const {
+ unsigned short getPort() const {
return info.port;
}
diff --git a/Swiften/LinkLocal/LinkLocalServiceBrowser.cpp b/Swiften/LinkLocal/LinkLocalServiceBrowser.cpp
index b79f184..0498384 100644
--- a/Swiften/LinkLocal/LinkLocalServiceBrowser.cpp
+++ b/Swiften/LinkLocal/LinkLocalServiceBrowser.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -65,17 +65,29 @@ bool LinkLocalServiceBrowser::isRegistered() const {
return !!registerQuery;
}
-void LinkLocalServiceBrowser::registerService(const std::string& name, int port, const LinkLocalServiceInfo& info) {
+void LinkLocalServiceBrowser::registerService(const std::string& name, unsigned short port, const LinkLocalServiceInfo& info) {
assert(!registerQuery);
- registerQuery = querier->createRegisterQuery(name, port, info.toTXTRecord());
- registerQuery->onRegisterFinished.connect(
- boost::bind(&LinkLocalServiceBrowser::handleRegisterFinished, this, _1));
- registerQuery->registerService();
+ if (auto txtRecord = info.toTXTRecord()) {
+ registerQuery = querier->createRegisterQuery(name, port, *txtRecord);
+ registerQuery->onRegisterFinished.connect(
+ boost::bind(&LinkLocalServiceBrowser::handleRegisterFinished, this, _1));
+ registerQuery->registerService();
+ }
+ else {
+ haveError = true;
+ stop();
+ }
}
void LinkLocalServiceBrowser::updateService(const LinkLocalServiceInfo& info) {
assert(registerQuery);
- registerQuery->updateServiceInfo(info.toTXTRecord());
+ if (auto txtRecord = info.toTXTRecord()) {
+ registerQuery->updateServiceInfo(*txtRecord);
+ }
+ else {
+ haveError = true;
+ stop();
+ }
}
void LinkLocalServiceBrowser::unregisterService() {
diff --git a/Swiften/LinkLocal/LinkLocalServiceBrowser.h b/Swiften/LinkLocal/LinkLocalServiceBrowser.h
index c59a4d0..bfcfc07 100644
--- a/Swiften/LinkLocal/LinkLocalServiceBrowser.h
+++ b/Swiften/LinkLocal/LinkLocalServiceBrowser.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -35,7 +35,7 @@ namespace Swift {
void registerService(
const std::string& name,
- int port,
+ unsigned short port,
const LinkLocalServiceInfo& info = LinkLocalServiceInfo());
void updateService(
const LinkLocalServiceInfo& info = LinkLocalServiceInfo());
diff --git a/Swiften/LinkLocal/LinkLocalServiceInfo.cpp b/Swiften/LinkLocal/LinkLocalServiceInfo.cpp
index 7a7ed3b..5e529fd 100644
--- a/Swiften/LinkLocal/LinkLocalServiceInfo.cpp
+++ b/Swiften/LinkLocal/LinkLocalServiceInfo.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010-2013 Isode Limited.
+ * Copyright (c) 2010-2019 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -11,40 +11,47 @@
#include <Swiften/Base/Algorithm.h>
#include <Swiften/Base/Concat.h>
+#include <Swiften/Base/Log.h>
namespace Swift {
-ByteArray LinkLocalServiceInfo::toTXTRecord() const {
- ByteArray result(getEncoded("txtvers=1"));
- if (!firstName.empty()) {
- append(result, getEncoded("1st=" + firstName));
- }
- if (!lastName.empty()) {
- append(result, getEncoded("last=" + lastName));
- }
- if (!email.empty()) {
- append(result, getEncoded("email=" + email));
- }
- if (jid.isValid()) {
- append(result, getEncoded("jid=" + jid.toString()));
- }
- if (!message.empty()) {
- append(result, getEncoded("msg=" + message));
- }
- if (!nick.empty()) {
- append(result, getEncoded("nick=" + nick));
- }
- if (port) {
- append(result, getEncoded("port.p2pj=" + std::string(boost::lexical_cast<std::string>(*port))));
- }
+boost::optional<ByteArray> LinkLocalServiceInfo::toTXTRecord() const {
+ try {
+ ByteArray result(getEncoded("txtvers=1"));
+ if (!firstName.empty()) {
+ append(result, getEncoded("1st=" + firstName));
+ }
+ if (!lastName.empty()) {
+ append(result, getEncoded("last=" + lastName));
+ }
+ if (!email.empty()) {
+ append(result, getEncoded("email=" + email));
+ }
+ if (jid.isValid()) {
+ append(result, getEncoded("jid=" + jid.toString()));
+ }
+ if (!message.empty()) {
+ append(result, getEncoded("msg=" + message));
+ }
+ if (!nick.empty()) {
+ append(result, getEncoded("nick=" + nick));
+ }
+ if (port) {
+ append(result, getEncoded("port.p2pj=" + std::string(std::to_string(*port))));
+ }
- switch (status) {
- case Available: append(result, getEncoded("status=avail")); break;
- case Away: append(result, getEncoded("status=away")); break;
- case DND: append(result, getEncoded("status=dnd")); break;
- }
+ switch (status) {
+ case Available: append(result, getEncoded("status=avail")); break;
+ case Away: append(result, getEncoded("status=away")); break;
+ case DND: append(result, getEncoded("status=dnd")); break;
+ }
- return result;
+ return result;
+ }
+ catch (const std::exception& e) {
+ SWIFT_LOG(warning) << "Failed to create TXT record for link local service info: " << e.what();
+ return boost::none;
+ }
}
ByteArray LinkLocalServiceInfo::getEncoded(const std::string& s) {
@@ -82,7 +89,13 @@ LinkLocalServiceInfo LinkLocalServiceInfo::createFromTXTRecord(const ByteArray&
info.setNick(entry.second);
}
else if (entry.first == "port.p2pj") {
- info.setPort(boost::lexical_cast<int>(entry.second));
+ try {
+ info.setPort(boost::numeric_cast<unsigned short>(boost::lexical_cast<int>(entry.second)));
+ }
+ catch (const boost::bad_lexical_cast&) {
+ }
+ catch (const boost::numeric::bad_numeric_cast&) {
+ }
}
else if (entry.first == "status") {
if (entry.second == "away") {
diff --git a/Swiften/LinkLocal/LinkLocalServiceInfo.h b/Swiften/LinkLocal/LinkLocalServiceInfo.h
index 9f15c6e..adfd062 100644
--- a/Swiften/LinkLocal/LinkLocalServiceInfo.h
+++ b/Swiften/LinkLocal/LinkLocalServiceInfo.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -43,10 +43,10 @@ namespace Swift {
Status getStatus() const { return status; }
void setStatus(Status s) { status = s; }
- boost::optional<int> getPort() const { return port; }
- void setPort(int p) { port = p; }
+ boost::optional<unsigned short> getPort() const { return port; }
+ void setPort(unsigned short p) { port = p; }
- ByteArray toTXTRecord() const;
+ boost::optional<ByteArray> toTXTRecord() const;
static LinkLocalServiceInfo createFromTXTRecord(const ByteArray& record);
@@ -62,6 +62,6 @@ namespace Swift {
std::string message;
std::string nick;
Status status;
- boost::optional<int> port;
+ boost::optional<unsigned short> port;
};
}
diff --git a/Swiften/LinkLocal/UnitTest/LinkLocalConnectorTest.cpp b/Swiften/LinkLocal/UnitTest/LinkLocalConnectorTest.cpp
index 85ae537..59cf996 100644
--- a/Swiften/LinkLocal/UnitTest/LinkLocalConnectorTest.cpp
+++ b/Swiften/LinkLocal/UnitTest/LinkLocalConnectorTest.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -53,7 +53,7 @@ class LinkLocalConnectorTest : public CppUnit::TestFixture {
CPPUNIT_ASSERT(!connectError);
CPPUNIT_ASSERT(connection->connectedTo);
CPPUNIT_ASSERT_EQUAL(std::string(connection->connectedTo->getAddress().toString()), std::string("192.168.1.1"));
- CPPUNIT_ASSERT_EQUAL(connection->connectedTo->getPort(), 1234);
+ CPPUNIT_ASSERT_EQUAL(connection->connectedTo->getPort(), static_cast<unsigned short>(1234));
}
void testConnect_UnableToResolve() {
@@ -114,12 +114,14 @@ class LinkLocalConnectorTest : public CppUnit::TestFixture {
}
private:
- std::shared_ptr<LinkLocalConnector> createConnector(const std::string& hostname, int port) {
+ std::shared_ptr<LinkLocalConnector> createConnector(const std::string& hostname, unsigned short port) {
+ auto txtRecord = LinkLocalServiceInfo().toTXTRecord();
+ CPPUNIT_ASSERT(txtRecord);
LinkLocalService service(
DNSSDServiceID("myname", "local."),
DNSSDResolveServiceQuery::Result(
"myname._presence._tcp.local", hostname, port,
- LinkLocalServiceInfo().toTXTRecord()));
+ *txtRecord));
std::shared_ptr<LinkLocalConnector> result(
new LinkLocalConnector(service, querier, connection));
result->onConnectFinished.connect(
diff --git a/Swiften/LinkLocal/UnitTest/LinkLocalServiceBrowserTest.cpp b/Swiften/LinkLocal/UnitTest/LinkLocalServiceBrowserTest.cpp
index a80d748..3491634 100644
--- a/Swiften/LinkLocal/UnitTest/LinkLocalServiceBrowserTest.cpp
+++ b/Swiften/LinkLocal/UnitTest/LinkLocalServiceBrowserTest.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -47,10 +47,12 @@ class LinkLocalServiceBrowserTest : public CppUnit::TestFixture {
eventLoop = new DummyEventLoop();
querier = std::make_shared<FakeDNSSDQuerier>("wonderland.lit", eventLoop);
aliceServiceID = new DNSSDServiceID("alice", "wonderland.lit");
- aliceServiceInfo = new DNSSDResolveServiceQuery::Result("_presence._tcp.wonderland.lit", "xmpp.wonderland.lit", 1234, LinkLocalServiceInfo().toTXTRecord());
+ auto txtRecord = LinkLocalServiceInfo().toTXTRecord();
+ CPPUNIT_ASSERT(txtRecord);
+ aliceServiceInfo = new DNSSDResolveServiceQuery::Result("_presence._tcp.wonderland.lit", "xmpp.wonderland.lit", 1234, *txtRecord);
testServiceID = new DNSSDServiceID("foo", "bar.local");
- testServiceInfo = new DNSSDResolveServiceQuery::Result("_presence._tcp.bar.local", "xmpp.bar.local", 1234, LinkLocalServiceInfo().toTXTRecord());
- testServiceInfo2 = new DNSSDResolveServiceQuery::Result("_presence.tcp.bar.local", "xmpp.foo.local", 2345, LinkLocalServiceInfo().toTXTRecord());
+ testServiceInfo = new DNSSDResolveServiceQuery::Result("_presence._tcp.bar.local", "xmpp.bar.local", 1234, *txtRecord);
+ testServiceInfo2 = new DNSSDResolveServiceQuery::Result("_presence.tcp.bar.local", "xmpp.foo.local", 2345, *txtRecord);
errorStopReceived = false;
normalStopReceived = false;
}
@@ -292,7 +294,9 @@ class LinkLocalServiceBrowserTest : public CppUnit::TestFixture {
testling->registerService("foo@bar", 1234, info);
eventLoop->processEvents();
- CPPUNIT_ASSERT(querier->isServiceRegistered("foo@bar", 1234, info.toTXTRecord()));
+ auto txtRecord = info.toTXTRecord();
+ CPPUNIT_ASSERT(txtRecord);
+ CPPUNIT_ASSERT(querier->isServiceRegistered("foo@bar", 1234, *txtRecord));
CPPUNIT_ASSERT_EQUAL(1, static_cast<int>(registeredServices.size()));
CPPUNIT_ASSERT(registeredServices[0] == DNSSDServiceID("foo@bar", "wonderland.lit"));
testling->stop();
@@ -311,7 +315,9 @@ class LinkLocalServiceBrowserTest : public CppUnit::TestFixture {
CPPUNIT_ASSERT(!testling->isRunning());
CPPUNIT_ASSERT(testling->hasError());
CPPUNIT_ASSERT(errorStopReceived);
- CPPUNIT_ASSERT(!querier->isServiceRegistered("foo@bar", 1234, info.toTXTRecord()));
+ auto txtRecord = info.toTXTRecord();
+ CPPUNIT_ASSERT(txtRecord);
+ CPPUNIT_ASSERT(!querier->isServiceRegistered("foo@bar", 1234, *txtRecord));
}
void testRegisterService_Reregister() {
@@ -329,7 +335,9 @@ class LinkLocalServiceBrowserTest : public CppUnit::TestFixture {
testling->registerService("bar@baz", 3456, info);
eventLoop->processEvents();
- CPPUNIT_ASSERT(querier->isServiceRegistered("bar@baz", 3456, info.toTXTRecord()));
+ auto txtRecord = info.toTXTRecord();
+ CPPUNIT_ASSERT(txtRecord);
+ CPPUNIT_ASSERT(querier->isServiceRegistered("bar@baz", 3456, *txtRecord));
testling->stop();
}
@@ -346,7 +354,9 @@ class LinkLocalServiceBrowserTest : public CppUnit::TestFixture {
info.setFirstName("Bar");
testling->updateService(info);
- CPPUNIT_ASSERT(querier->isServiceRegistered("foo@bar", 1234, info.toTXTRecord()));
+ auto txtRecord = info.toTXTRecord();
+ CPPUNIT_ASSERT(txtRecord);
+ CPPUNIT_ASSERT(querier->isServiceRegistered("foo@bar", 1234, *txtRecord));
testling->stop();
}
diff --git a/Swiften/LinkLocal/UnitTest/LinkLocalServiceInfoTest.cpp b/Swiften/LinkLocal/UnitTest/LinkLocalServiceInfoTest.cpp
index 0a94a98..35cb1b4 100644
--- a/Swiften/LinkLocal/UnitTest/LinkLocalServiceInfoTest.cpp
+++ b/Swiften/LinkLocal/UnitTest/LinkLocalServiceInfoTest.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -29,7 +29,9 @@ class LinkLocalServiceInfoTest : public CppUnit::TestFixture {
info.setLastName("Tron\xc3\xe7on");
info.setStatus(LinkLocalServiceInfo::Away);
- CPPUNIT_ASSERT_EQUAL(createByteArray("\x09txtvers=1\x09" + std::string("1st=Remko\x0dlast=Tron\xc3\xe7on\x0bstatus=away")), info.toTXTRecord());
+ auto txtRecord = info.toTXTRecord();
+ CPPUNIT_ASSERT(txtRecord);
+ CPPUNIT_ASSERT_EQUAL(createByteArray("\x09txtvers=1\x09" + std::string("1st=Remko\x0dlast=Tron\xc3\xe7on\x0bstatus=away")), *txtRecord);
}
void testCreateFromTXTRecord() {
@@ -57,7 +59,9 @@ class LinkLocalServiceInfoTest : public CppUnit::TestFixture {
info.setStatus(LinkLocalServiceInfo::DND);
info.setPort(1234);
- LinkLocalServiceInfo info2 = LinkLocalServiceInfo::createFromTXTRecord(info.toTXTRecord());
+ auto txtRecord = info.toTXTRecord();
+ CPPUNIT_ASSERT(txtRecord);
+ LinkLocalServiceInfo info2 = LinkLocalServiceInfo::createFromTXTRecord(*txtRecord);
CPPUNIT_ASSERT_EQUAL(info.getFirstName(), info2.getFirstName());
CPPUNIT_ASSERT_EQUAL(info.getLastName(), info2.getLastName());
CPPUNIT_ASSERT_EQUAL(info.getEMail(), info2.getEMail());
@@ -67,6 +71,13 @@ class LinkLocalServiceInfoTest : public CppUnit::TestFixture {
CPPUNIT_ASSERT(info.getStatus() == info2.getStatus());
CPPUNIT_ASSERT(info.getPort() == info2.getPort());
}
+
+ void testToTXTRecordWithInvalidParameter() {
+ LinkLocalServiceInfo info;
+ info.setFirstName(std::string(256, 'x'));
+ auto txtRecord = info.toTXTRecord();
+ CPPUNIT_ASSERT(!txtRecord);
+ }
};
CPPUNIT_TEST_SUITE_REGISTRATION(LinkLocalServiceInfoTest);
diff --git a/Swiften/LinkLocal/UnitTest/LinkLocalServiceTest.cpp b/Swiften/LinkLocal/UnitTest/LinkLocalServiceTest.cpp
index 206d824..cb5f40a 100644
--- a/Swiften/LinkLocal/UnitTest/LinkLocalServiceTest.cpp
+++ b/Swiften/LinkLocal/UnitTest/LinkLocalServiceTest.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010 Isode Limited.
+ * Copyright (c) 2010-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -58,10 +58,12 @@ class LinkLocalServiceTest : public CppUnit::TestFixture {
info.setFirstName(firstName);
info.setLastName(lastName);
info.setNick(nickName);
+ auto txtRecord = info.toTXTRecord();
+ CPPUNIT_ASSERT(txtRecord);
return LinkLocalService(service,
DNSSDResolveServiceQuery::Result(
name + "._presence._tcp.local", "rabbithole.local", 1234,
- info.toTXTRecord()));
+ *txtRecord));
}
};
diff --git a/Swiften/MIX/MIX.cpp b/Swiften/MIX/MIX.cpp
new file mode 100644
index 0000000..f3e3d69
--- /dev/null
+++ b/Swiften/MIX/MIX.cpp
@@ -0,0 +1,14 @@
+/*
+ * Copyright (c) 2017 Tarun Gupta
+ * Licensed under the simplified BSD license.
+ * See Documentation/Licenses/BSD-simplified.txt for more information.
+ */
+
+#include <Swiften/MIX/MIX.h>
+
+namespace Swift {
+
+MIX::~MIX() {
+}
+
+}
diff --git a/Swiften/MIX/MIX.h b/Swiften/MIX/MIX.h
new file mode 100644
index 0000000..1398a6e
--- /dev/null
+++ b/Swiften/MIX/MIX.h
@@ -0,0 +1,69 @@
+/*
+ * Copyright (c) 2017 Tarun Gupta
+ * Licensed under the simplified BSD license.
+ * See Documentation/Licenses/BSD-simplified.txt for more information.
+ */
+
+#pragma once
+
+#include <memory>
+#include <string>
+#include <unordered_set>
+
+#include <boost/signals2.hpp>
+
+#include <Swiften/Base/API.h>
+#include <Swiften/JID/JID.h>
+#include <Swiften/Elements/Form.h>
+#include <Swiften/Elements/MIXJoin.h>
+#include <Swiften/Elements/MIXLeave.h>
+#include <Swiften/Elements/MIXUpdateSubscription.h>
+#include <Swiften/Elements/MIXUserPreference.h>
+#include <Swiften/Elements/ErrorPayload.h>
+
+namespace Swift {
+ class SWIFTEN_API MIX {
+ public:
+ using ref = std::shared_ptr<MIX>;
+
+ public:
+ virtual ~MIX();
+
+ /**
+ * Join a MIX channel and subscribe to nodes.
+ */
+ virtual void joinChannel(const std::unordered_set<std::string>& nodes) = 0;
+
+ /**
+ * Join Channel with a set of preferences.
+ */
+ virtual void joinChannelWithPreferences(const std::unordered_set<std::string>& nodes, Form::ref form) = 0;
+
+ /**
+ * Update subscription of nodes.
+ */
+ virtual void updateSubscription(const std::unordered_set<std::string>& nodes) = 0;
+
+ /**
+ * Leave a MIX channel and unsubcribe nodes.
+ */
+ virtual void leaveChannel() = 0;
+
+ /**
+ * Request a configuration form for updating preferences.
+ */
+ virtual void requestPreferencesForm() = 0;
+
+ /**
+ * Update preferences after requesting preference form.
+ */
+ virtual void updatePreferences(Form::ref form) = 0;
+
+ public:
+ boost::signals2::signal<void (MIXJoin::ref /* joinResponse */, ErrorPayload::ref /* joinError */)> onJoinResponse;
+ boost::signals2::signal<void (MIXLeave::ref /* leaveResponse */, ErrorPayload::ref /* leaveError */)> onLeaveResponse;
+ boost::signals2::signal<void (MIXUpdateSubscription::ref /* updateResponse */, ErrorPayload::ref /* updateError */)> onSubscriptionUpdateResponse;
+ boost::signals2::signal<void (Form::ref /* preferencesForm */, ErrorPayload::ref /* failedConfiguration */)> onPreferencesFormResponse;
+ boost::signals2::signal<void (MIXUserPreference::ref /* userPreferenceResponse */, ErrorPayload::ref /* failedUpdate */)> onPreferencesUpdateResponse;
+ };
+}
diff --git a/Swiften/MIX/MIXImpl.cpp b/Swiften/MIX/MIXImpl.cpp
new file mode 100644
index 0000000..cd3eb21
--- /dev/null
+++ b/Swiften/MIX/MIXImpl.cpp
@@ -0,0 +1,97 @@
+/*
+ * Copyright (c) 2017 Tarun Gupta
+ * Licensed under the simplified BSD license.
+ * See Documentation/Licenses/BSD-simplified.txt for more information.
+ */
+
+#include <Swiften/MIX/MIXImpl.h>
+
+#include <Swiften/Client/StanzaChannel.h>
+#include <Swiften/Elements/IQ.h>
+#include <Swiften/Queries/GenericRequest.h>
+#include <Swiften/Queries/IQRouter.h>
+
+namespace Swift {
+
+MIXImpl::MIXImpl(const JID& ownJID, const JID& channelJID, IQRouter* iqRouter) : ownJID_(ownJID), channelJID_(channelJID), iqRouter_(iqRouter) {
+
+}
+
+MIXImpl::~MIXImpl() {
+
+}
+
+void MIXImpl::joinChannel(const std::unordered_set<std::string>& nodes) {
+ joinChannelWithPreferences(nodes, nullptr);
+}
+
+void MIXImpl::joinChannelWithPreferences(const std::unordered_set<std::string>& nodes, Form::ref form) {
+ auto joinPayload = std::make_shared<MIXJoin>();
+ joinPayload->setChannel(channelJID_);
+ for (auto node : nodes) {
+ joinPayload->addSubscription(node);
+ }
+ if (form) {
+ joinPayload->setForm(form);
+ }
+ auto request = std::make_shared<GenericRequest<MIXJoin>>(IQ::Set, getJID(), joinPayload, iqRouter_);
+ request->onResponse.connect(boost::bind(&MIXImpl::handleJoinResponse, this, _1, _2));
+ request->send();
+}
+
+void MIXImpl::handleJoinResponse(MIXJoin::ref payload, ErrorPayload::ref error) {
+ onJoinResponse(payload, error);
+}
+
+void MIXImpl::updateSubscription(const std::unordered_set<std::string>& nodes) {
+ auto updateSubscriptionPayload = std::make_shared<MIXUpdateSubscription>();
+ updateSubscriptionPayload->setSubscriptions(nodes);
+ auto request = std::make_shared<GenericRequest<MIXUpdateSubscription>>(IQ::Set, channelJID_, updateSubscriptionPayload, iqRouter_);
+ request->onResponse.connect(boost::bind(&MIXImpl::handleUpdateSubscriptionResponse, this, _1, _2));
+ request->send();
+}
+
+void MIXImpl::handleUpdateSubscriptionResponse(MIXUpdateSubscription::ref payload, ErrorPayload::ref error) {
+ onSubscriptionUpdateResponse(payload, error);
+}
+
+void MIXImpl::leaveChannel() {
+ auto leavePayload = std::make_shared<MIXLeave>();
+ leavePayload->setChannel(channelJID_);
+ auto request = std::make_shared<GenericRequest<MIXLeave>>(IQ::Set, getJID(), leavePayload, iqRouter_);
+ request->onResponse.connect(boost::bind(&MIXImpl::handleLeaveResponse, this, _1, _2));
+ request->send();
+}
+
+void MIXImpl::handleLeaveResponse(MIXLeave::ref payload, ErrorPayload::ref error) {
+ onLeaveResponse(payload, error);
+}
+
+void MIXImpl::requestPreferencesForm() {
+ auto prefPayload = std::make_shared<MIXUserPreference>();
+ auto request = std::make_shared<GenericRequest<MIXUserPreference>>(IQ::Get, channelJID_, prefPayload, iqRouter_);
+ request->onResponse.connect(boost::bind(&MIXImpl::handlePreferencesFormReceived, this, _1, _2));
+ request->send();
+}
+
+void MIXImpl::handlePreferencesFormReceived(MIXUserPreference::ref payload, ErrorPayload::ref error) {
+ Form::ref form = nullptr;
+ if (payload) {
+ form = payload->getData();
+ }
+ onPreferencesFormResponse(form, error);
+}
+
+void MIXImpl::handlePreferencesResultReceived(MIXUserPreference::ref payload, ErrorPayload::ref error) {
+ onPreferencesUpdateResponse(payload, error);
+}
+
+void MIXImpl::updatePreferences(Form::ref form) {
+ auto prefPayload = std::make_shared<MIXUserPreference>();
+ prefPayload->setData(form);
+ auto request = std::make_shared<GenericRequest<MIXUserPreference>>(IQ::Set, channelJID_, prefPayload, iqRouter_);
+ request->onResponse.connect(boost::bind(&MIXImpl::handlePreferencesResultReceived, this, _1, _2));
+ request->send();
+}
+
+}
diff --git a/Swiften/MIX/MIXImpl.h b/Swiften/MIX/MIXImpl.h
new file mode 100644
index 0000000..4da7a62
--- /dev/null
+++ b/Swiften/MIX/MIXImpl.h
@@ -0,0 +1,67 @@
+/*
+ * Copyright (c) 2018 Isode Limited.
+ * All rights reserved.
+ * See the COPYING file for more information.
+ */
+
+ /*
+ * Copyright (c) 2017 Tarun Gupta
+ * Licensed under the simplified BSD license.
+ * See Documentation/Licenses/BSD-simplified.txt for more information.
+ */
+
+#pragma once
+
+#include <Swiften/MIX/MIX.h>
+
+namespace Swift {
+ class StanzaChannel;
+ class IQRouter;
+
+ class SWIFTEN_API MIXImpl : public MIX {
+ public:
+ using ref = std::shared_ptr<MIXImpl>;
+
+ public:
+ MIXImpl(const JID& ownJID, const JID& channelJID, IQRouter* iqRouter);
+ virtual ~MIXImpl() override;
+
+ /**
+ * Returns the (bare) JID of the user.
+ */
+ virtual JID getJID() const {
+ return ownJID_.toBare();
+ }
+
+ /**
+ * Returns the JID of MIX channel.
+ */
+ virtual JID getChannelJID() const {
+ return channelJID_;
+ }
+
+ virtual void joinChannel(const std::unordered_set<std::string>& nodes) override;
+
+ virtual void joinChannelWithPreferences(const std::unordered_set<std::string>& nodes, Form::ref form) override;
+
+ virtual void updateSubscription(const std::unordered_set<std::string>& nodes) override;
+
+ virtual void leaveChannel() override;
+
+ virtual void requestPreferencesForm() override;
+
+ virtual void updatePreferences(Form::ref form) override;
+
+ private:
+ void handleJoinResponse(MIXJoin::ref, ErrorPayload::ref);
+ void handleLeaveResponse(MIXLeave::ref, ErrorPayload::ref);
+ void handleUpdateSubscriptionResponse(MIXUpdateSubscription::ref, ErrorPayload::ref);
+ void handlePreferencesFormReceived(MIXUserPreference::ref, ErrorPayload::ref);
+ void handlePreferencesResultReceived(MIXUserPreference::ref /*payload*/, ErrorPayload::ref error);
+
+ private:
+ JID ownJID_;
+ JID channelJID_;
+ IQRouter* iqRouter_;
+ };
+}
diff --git a/Swiften/MIX/UnitTest/MIXImplTest.cpp b/Swiften/MIX/UnitTest/MIXImplTest.cpp
new file mode 100644
index 0000000..05dde17
--- /dev/null
+++ b/Swiften/MIX/UnitTest/MIXImplTest.cpp
@@ -0,0 +1,312 @@
+/*
+ * Copyright (c) 2017 Tarun Gupta
+ * Licensed under the simplified BSD license.
+ * See Documentation/Licenses/BSD-simplified.txt for more information.
+ */
+
+#include <gtest/gtest.h>
+
+#include <boost/bind.hpp>
+
+#include <Swiften/Elements/FormField.h>
+#include <Swiften/Client/DummyStanzaChannel.h>
+#include <Swiften/MIX/MIXImpl.h>
+#include <Swiften/Queries/IQRouter.h>
+
+using namespace Swift;
+
+class MIXImplTest : public ::testing::Test {
+
+ protected:
+ void SetUp() {
+ ownJID_ = JID("hag66@shakespeare.example/UUID-a1j/7533");
+ channelJID_ = JID("coven@mix.shakespeare.example");
+ channel_ = new DummyStanzaChannel();
+ router_ = new IQRouter(channel_);
+ successfulJoins_ = 0;
+ }
+
+ void TearDown() {
+ delete router_;
+ delete channel_;
+ }
+
+ MIX::ref createMIXClient() {
+ auto mix = std::make_shared<MIXImpl>(ownJID_, channelJID_, router_);
+ mix->onJoinResponse.connect(boost::bind(&MIXImplTest::handleJoin, this, _1, _2));
+ mix->onLeaveResponse.connect(boost::bind(&MIXImplTest::handleLeave, this, _1, _2));
+ mix->onSubscriptionUpdateResponse.connect(boost::bind(&MIXImplTest::handleSubscriptionUpdate, this, _1, _2));
+ mix->onPreferencesFormResponse.connect(boost::bind(&MIXImplTest::handlePreferencesForm, this, _1, _2));
+ return mix;
+ }
+
+ void handleJoin(MIXJoin::ref joinPayload, ErrorPayload::ref error) {
+ if (joinPayload) {
+ ASSERT_FALSE(error);
+ ASSERT_TRUE(joinPayload->getJID());
+ ASSERT_EQ(*joinPayload->getJID(), JID("123456#coven@mix.shakespeare.example"));
+ if (joinPayload->getForm()) {
+ preferenceForm_ = joinPayload->getForm();
+ }
+ ++successfulJoins_;
+ subscribedNodes_ = joinPayload->getSubscriptions();
+ }
+ }
+
+ void handleLeave(MIXLeave::ref leavePayload, ErrorPayload::ref error) {
+ ASSERT_TRUE(leavePayload);
+ ASSERT_FALSE(error);
+ ASSERT_EQ(static_cast<int>(0), subscribedNodes_.size());
+ }
+
+ void handleSubscriptionUpdate(MIXUpdateSubscription::ref payload, ErrorPayload::ref error) {
+ ASSERT_TRUE(payload);
+ ASSERT_FALSE(error);
+ if (payload) {
+ for (auto node : payload->getSubscriptions()) {
+ subscribedNodes_.insert(node);
+ }
+ }
+ }
+
+ void handlePreferencesForm(Form::ref form, ErrorPayload::ref error) {
+ ASSERT_FALSE(error);
+ if (form) {
+ preferenceForm_ = form;
+ }
+ }
+
+ IQ::ref createJoinResult(const std::unordered_set<std::string>& nodes, Form::ref form) {
+ auto joinResultPayload = std::make_shared<MIXJoin>();
+ for (auto node : nodes) {
+ joinResultPayload->addSubscription(node);
+ }
+ if (form) {
+ joinResultPayload->setForm(form);
+ }
+ joinResultPayload->setJID(JID("123456#coven@mix.shakespeare.example"));
+ return IQ::createResult(ownJID_, channel_->sentStanzas[0]->getTo(), channel_->sentStanzas[0]->getID(), joinResultPayload);
+ }
+
+ IQ::ref createLeaveResult() {
+ auto leaveResultPayload = std::make_shared<MIXLeave>();
+ return IQ::createResult(ownJID_, channel_->sentStanzas[0]->getTo(), channel_->sentStanzas[0]->getID(), leaveResultPayload);
+ }
+
+ IQ::ref createError() {
+ return IQ::createError(ownJID_, channel_->sentStanzas[0]->getTo(), channel_->sentStanzas[0]->getID());
+ }
+
+ bool hasSubscription(const std::string& value) {
+ return std::find(subscribedNodes_.begin(), subscribedNodes_.end(), value) != subscribedNodes_.end();
+ }
+
+ JID ownJID_;
+ JID channelJID_;
+ DummyStanzaChannel* channel_;
+ IQRouter* router_;
+ int successfulJoins_;
+ Form::ref preferenceForm_;
+ std::unordered_set<std::string> subscribedNodes_;
+};
+
+TEST_F(MIXImplTest, testJoinError) {
+ MIX::ref testling = createMIXClient();
+ testling->joinChannel(std::unordered_set<std::string>());
+
+ ASSERT_EQ(1, static_cast<int>(channel_->sentStanzas.size()));
+ ASSERT_TRUE(channel_->isRequestAtIndex<MIXJoin>(0, ownJID_.toBare(), IQ::Set));
+
+ auto iq = channel_->getStanzaAtIndex<IQ>(0);
+ ASSERT_TRUE(iq);
+ ASSERT_TRUE(iq->getPayload<MIXJoin>());
+ ASSERT_FALSE(iq->getPayload<MIXJoin>()->getForm());
+ ASSERT_EQ(static_cast<size_t>(0), iq->getPayload<MIXJoin>()->getSubscriptions().size());
+
+ channel_->onIQReceived(createError());
+ ASSERT_EQ(static_cast<int>(0), successfulJoins_);
+ ASSERT_EQ(static_cast<int>(0), subscribedNodes_.size());
+}
+
+TEST_F(MIXImplTest, testJoinWithAllSubscriptions) {
+ MIX::ref testling = createMIXClient();
+ std::unordered_set<std::string> nodes;
+ nodes.insert(std::string("urn:xmpp:mix:nodes:messages"));
+ nodes.insert(std::string("urn:xmpp:mix:nodes:presence"));
+ nodes.insert(std::string("urn:xmpp:mix:nodes:participants"));
+ nodes.insert(std::string("urn:xmpp:mix:nodes:config"));
+
+ testling->joinChannel(nodes);
+
+ ASSERT_EQ(1, static_cast<int>(channel_->sentStanzas.size()));
+ ASSERT_TRUE(channel_->isRequestAtIndex<MIXJoin>(0, ownJID_.toBare(), IQ::Set));
+
+ auto iq = channel_->getStanzaAtIndex<IQ>(0);
+ ASSERT_TRUE(iq);
+ ASSERT_TRUE(iq->getPayload<MIXJoin>());
+ ASSERT_FALSE(iq->getPayload<MIXJoin>()->getForm());
+ ASSERT_EQ(static_cast<size_t>(4), iq->getPayload<MIXJoin>()->getSubscriptions().size());
+
+ channel_->onIQReceived(createJoinResult(nodes, nullptr));
+ ASSERT_EQ(static_cast<int>(1), successfulJoins_);
+ ASSERT_EQ(static_cast<int>(4), subscribedNodes_.size());
+}
+
+TEST_F(MIXImplTest, testJoinWithSomeSubscriptions) {
+ MIX::ref testling = createMIXClient();
+ std::unordered_set<std::string> nodes;
+ nodes.insert(std::string("urn:xmpp:mix:nodes:messages"));
+ nodes.insert(std::string("urn:xmpp:mix:nodes:presence"));
+ nodes.insert(std::string("urn:xmpp:mix:nodes:participants"));
+ nodes.insert(std::string("urn:xmpp:mix:nodes:config"));
+
+ testling->joinChannel(nodes);
+
+ ASSERT_EQ(1, static_cast<int>(channel_->sentStanzas.size()));
+ ASSERT_TRUE(channel_->isRequestAtIndex<MIXJoin>(0, ownJID_.toBare(), IQ::Set));
+
+ auto iq = channel_->getStanzaAtIndex<IQ>(0);
+ ASSERT_TRUE(iq);
+ ASSERT_TRUE(iq->getPayload<MIXJoin>());
+ ASSERT_FALSE(iq->getPayload<MIXJoin>()->getForm());
+ ASSERT_EQ(static_cast<size_t>(4), iq->getPayload<MIXJoin>()->getSubscriptions().size());
+
+ std::unordered_set<std::string> subscribedTo;
+ subscribedTo.insert(std::string("urn:xmpp:mix:nodes:messages"));
+
+ channel_->onIQReceived(createJoinResult(subscribedTo, nullptr));
+ ASSERT_EQ(static_cast<int>(1), successfulJoins_);
+ ASSERT_EQ(static_cast<int>(1), subscribedNodes_.size());
+ ASSERT_TRUE(hasSubscription(std::string("urn:xmpp:mix:nodes:messages")));
+}
+
+TEST_F(MIXImplTest, testLeaveChannel) {
+ MIX::ref testling = createMIXClient();
+ testling->leaveChannel();
+ ASSERT_EQ(1, static_cast<int>(channel_->sentStanzas.size()));
+ ASSERT_TRUE(channel_->isRequestAtIndex<MIXLeave>(0, ownJID_.toBare(), IQ::Set));
+
+ auto iq = channel_->getStanzaAtIndex<IQ>(0);
+ ASSERT_TRUE(iq);
+ ASSERT_TRUE(iq->getPayload<MIXLeave>());
+ ASSERT_TRUE(iq->getPayload<MIXLeave>()->getChannel());
+
+ channel_->onIQReceived(createLeaveResult());
+}
+
+TEST_F(MIXImplTest, testUpdateSubscription) {
+ MIX::ref testling = createMIXClient();
+ std::unordered_set<std::string> nodes;
+ nodes.insert(std::string("urn:xmpp:mix:nodes:messages"));
+ nodes.insert(std::string("urn:xmpp:mix:nodes:presence"));
+
+ testling->joinChannel(nodes);
+
+ ASSERT_EQ(1, static_cast<int>(channel_->sentStanzas.size()));
+ ASSERT_TRUE(channel_->isRequestAtIndex<MIXJoin>(0, ownJID_.toBare(), IQ::Set));
+
+ channel_->onIQReceived(createJoinResult(nodes, nullptr));
+ ASSERT_EQ(static_cast<int>(1), successfulJoins_);
+ ASSERT_EQ(static_cast<int>(2), subscribedNodes_.size());
+
+ nodes.clear();
+ nodes.insert(std::string("urn:xmpp:mix:nodes:participants"));
+ nodes.insert(std::string("urn:xmpp:mix:nodes:config"));
+
+ testling->updateSubscription(nodes);
+
+ ASSERT_EQ(2, static_cast<int>(channel_->sentStanzas.size()));
+ ASSERT_TRUE(channel_->isRequestAtIndex<MIXUpdateSubscription>(1, channelJID_, IQ::Set));
+
+ // fake response
+ auto subscriptionUpdate = std::make_shared<MIXUpdateSubscription>();
+ subscriptionUpdate->setSubscriptions(nodes);
+ subscriptionUpdate->setJID(JID("hag66@shakespeare.example"));
+ auto response = IQ::createResult(ownJID_, channel_->sentStanzas[1]->getTo(), channel_->sentStanzas[1]->getID(), subscriptionUpdate);
+
+ channel_->onIQReceived(response);
+ ASSERT_EQ(static_cast<int>(4), subscribedNodes_.size());
+ ASSERT_TRUE(hasSubscription(std::string("urn:xmpp:mix:nodes:participants")));
+ ASSERT_TRUE(hasSubscription(std::string("urn:xmpp:mix:nodes:config")));
+ ASSERT_TRUE(hasSubscription(std::string("urn:xmpp:mix:nodes:messages")));
+}
+
+TEST_F(MIXImplTest, testJoinWithPreference) {
+ MIX::ref testling = createMIXClient();
+ std::unordered_set<std::string> nodes;
+ nodes.insert(std::string("urn:xmpp:mix:nodes:messages"));
+ nodes.insert(std::string("urn:xmpp:mix:nodes:presence"));
+
+ auto parameters = std::make_shared<Form>();
+ parameters->setType(Form::Type::SubmitType);
+
+ auto fieldType = std::make_shared<FormField>(FormField::HiddenType);
+ fieldType->setName("FORM_TYPE");
+ fieldType->addValue("urn:xmpp:mix:0");
+ parameters->addField(fieldType);
+
+ auto fieldJIDVisibility = std::make_shared<FormField>();
+ fieldJIDVisibility->setName("JID Visibility");
+ fieldJIDVisibility->addValue("never");
+ parameters->addField(fieldJIDVisibility);
+
+ testling->joinChannelWithPreferences(nodes, parameters);
+
+ ASSERT_EQ(1, static_cast<int>(channel_->sentStanzas.size()));
+ ASSERT_TRUE(channel_->isRequestAtIndex<MIXJoin>(0, ownJID_.toBare(), IQ::Set));
+
+ //fake response
+ auto responseForm = std::make_shared<Form>();
+ responseForm->setType(Form::Type::ResultType);
+
+ auto fieldTypeResponse = std::make_shared<FormField>(FormField::HiddenType);
+ fieldTypeResponse->setName("FORM_TYPE");
+ fieldTypeResponse->addValue("urn:xmpp:mix:0");
+ responseForm->addField(fieldTypeResponse);
+
+ auto fieldJIDVisibilityResponse = std::make_shared<FormField>();
+ fieldJIDVisibilityResponse->setName("JID Visibility");
+ fieldJIDVisibilityResponse->addValue("never");
+ responseForm->addField(fieldJIDVisibilityResponse);
+
+ auto fieldprivateMessagesResponse = std::make_shared<FormField>();
+ fieldprivateMessagesResponse->setName("Private Messages");
+ fieldprivateMessagesResponse->addValue("allow");
+ responseForm->addField(fieldprivateMessagesResponse);
+
+ auto vCardResponse = std::make_shared<FormField>();
+ vCardResponse->setName("vCard");
+ vCardResponse->addValue("block");
+ responseForm->addField(vCardResponse);
+
+ channel_->onIQReceived(createJoinResult(nodes, responseForm));
+ ASSERT_EQ(static_cast<int>(1), successfulJoins_);
+ ASSERT_EQ(static_cast<int>(2), subscribedNodes_.size());
+ ASSERT_TRUE(preferenceForm_);
+
+ ASSERT_TRUE(preferenceForm_->getField("JID Visibility"));
+ ASSERT_EQ(std::string("never"), preferenceForm_->getField("JID Visibility")->getTextSingleValue());
+}
+
+TEST_F(MIXImplTest, preferenceFormRequest) {
+ MIX::ref testling = createMIXClient();
+ testling->requestPreferencesForm();
+
+ ASSERT_EQ(1, static_cast<int>(channel_->sentStanzas.size()));
+ ASSERT_TRUE(channel_->isRequestAtIndex<MIXUserPreference>(0, channelJID_, IQ::Get));
+
+ //fake response
+ auto responseForm = std::make_shared<Form>();
+ responseForm->setType(Form::Type::FormType);
+
+ auto fieldTypeResponse = std::make_shared<FormField>(FormField::HiddenType);
+ fieldTypeResponse->setName("FORM_TYPE");
+ fieldTypeResponse->addValue("urn:xmpp:mix:0");
+ responseForm->addField(fieldTypeResponse);
+
+ auto preferenceResponse = std::make_shared<MIXUserPreference>();
+ preferenceResponse->setData(responseForm);
+
+ channel_->onIQReceived(IQ::createResult(ownJID_, channel_->sentStanzas[0]->getTo(), channel_->sentStanzas[0]->getID(), preferenceResponse));
+ ASSERT_TRUE(preferenceForm_);
+}
diff --git a/Swiften/MUC/MUCBookmarkManager.cpp b/Swiften/MUC/MUCBookmarkManager.cpp
index 9f8ae77..e0922ae 100644
--- a/Swiften/MUC/MUCBookmarkManager.cpp
+++ b/Swiften/MUC/MUCBookmarkManager.cpp
@@ -1,11 +1,12 @@
/*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
#include <Swiften/MUC/MUCBookmarkManager.h>
+#include <algorithm>
#include <memory>
#include <boost/bind.hpp>
@@ -25,14 +26,15 @@ MUCBookmarkManager::MUCBookmarkManager(IQRouter* iqRouter) {
}
void MUCBookmarkManager::handleBookmarksReceived(std::shared_ptr<Storage> payload, ErrorPayload::ref error) {
- if (error) {
+ if (error || !payload) {
return;
}
ready_ = true;
+ handlingReceivedBookmarks_ = true;
onBookmarksReady();
- storage = payload;
+ storage_ = payload;
std::vector<MUCBookmark> receivedBookmarks;
for (const auto& room : payload->getRooms()) {
@@ -47,18 +49,25 @@ void MUCBookmarkManager::handleBookmarksReceived(std::shared_ptr<Storage> payloa
onBookmarkRemoved(oldBookmark);
}
}
-
+ std::vector<MUCBookmark> newAddedBookmarksToBeSignaled;
for (const auto& newBookmark : receivedBookmarks) {
if (!containsEquivalent(bookmarks_, newBookmark)) {
newBookmarks.push_back(newBookmark);
- onBookmarkAdded(newBookmark);
+ //If the bookmark does not exist in bookmark manager, after emmiting the signal, chatsmanager will try to join the room, if the bookmark has autojoin to true.
+ //The bookmark is not yet available in bookmark manager, therefore a new bookmark will be created which will be lost when newBookmarks replace bookmarks.
+ newAddedBookmarksToBeSignaled.push_back(newBookmark);
}
}
bookmarks_ = newBookmarks;
+ for (auto bookmark : newAddedBookmarksToBeSignaled) {
+ onBookmarkAdded(bookmark);
+ }
+
+ handlingReceivedBookmarks_ = false;
}
bool MUCBookmarkManager::containsEquivalent(const std::vector<MUCBookmark>& list, const MUCBookmark& bookmark) {
- return std::find(list.begin(), list.end(), bookmark) != list.end();
+ return std::find_if(list.begin(), list.end(), [&](const MUCBookmark& val) { return bookmark.getRoom() == val.getRoom(); }) != list.end();
}
void MUCBookmarkManager::replaceBookmark(const MUCBookmark& oldBookmark, const MUCBookmark& newBookmark) {
@@ -76,8 +85,15 @@ void MUCBookmarkManager::replaceBookmark(const MUCBookmark& oldBookmark, const M
void MUCBookmarkManager::addBookmark(const MUCBookmark& bookmark) {
if (!ready_) return;
- bookmarks_.push_back(bookmark);
- onBookmarkAdded(bookmark);
+ if (auto found = lookupBookmark(bookmark.getRoom())) {
+ if (found != bookmark) {
+ replaceBookmark(found.get(), bookmark);
+ }
+ }
+ else {
+ bookmarks_.push_back(bookmark);
+ onBookmarkAdded(bookmark);
+ }
flush();
}
@@ -96,17 +112,20 @@ void MUCBookmarkManager::removeBookmark(const MUCBookmark& bookmark) {
}
void MUCBookmarkManager::flush() {
- if (!storage) {
- storage = std::make_shared<Storage>();
+ if (handlingReceivedBookmarks_) {
+ return;
+ }
+ if (!storage_) {
+ storage_ = std::make_shared<Storage>();
}
// Update the storage element
- storage->clearRooms();
+ storage_->clearRooms();
for (const auto& bookmark : bookmarks_) {
- storage->addRoom(bookmark.toStorage());
+ storage_->addRoom(bookmark.toStorage());
}
// Send an iq to save the storage element
- SetPrivateStorageRequest<Storage>::ref request = SetPrivateStorageRequest<Storage>::create(storage, iqRouter_);
+ SetPrivateStorageRequest<Storage>::ref request = SetPrivateStorageRequest<Storage>::create(storage_, iqRouter_);
// FIXME: We should care about the result
//request->onResponse.connect(boost::bind(&MUCBookmarkManager::handleBookmarksSet, this, _1, _2));
request->send();
@@ -116,4 +135,12 @@ const std::vector<MUCBookmark>& MUCBookmarkManager::getBookmarks() const {
return bookmarks_;
}
+boost::optional<MUCBookmark> MUCBookmarkManager::lookupBookmark(const JID& bookmarkJID) const {
+ auto bookmarkIterator = std::find_if(bookmarks_.begin(), bookmarks_.end(), [&](const MUCBookmark& val) { return bookmarkJID == val.getRoom(); });
+ if (bookmarkIterator != bookmarks_.end()) {
+ return *bookmarkIterator;
+ }
+ return boost::none;
+}
+
}
diff --git a/Swiften/MUC/MUCBookmarkManager.h b/Swiften/MUC/MUCBookmarkManager.h
index 78fbbb0..1ef227d 100644
--- a/Swiften/MUC/MUCBookmarkManager.h
+++ b/Swiften/MUC/MUCBookmarkManager.h
@@ -27,8 +27,8 @@ namespace Swift {
void addBookmark(const MUCBookmark& bookmark);
void removeBookmark(const MUCBookmark& bookmark);
void replaceBookmark(const MUCBookmark& oldBookmark, const MUCBookmark& newBookmark);
-
const std::vector<MUCBookmark>& getBookmarks() const;
+ boost::optional<MUCBookmark> lookupBookmark(const JID& bookmarkJID) const;
public:
boost::signals2::signal<void (const MUCBookmark&)> onBookmarkAdded;
@@ -45,8 +45,9 @@ namespace Swift {
private:
bool ready_;
+ bool handlingReceivedBookmarks_;
std::vector<MUCBookmark> bookmarks_;
IQRouter* iqRouter_;
- std::shared_ptr<Storage> storage;
+ std::shared_ptr<Storage> storage_;
};
}
diff --git a/Swiften/MUC/MUCImpl.cpp b/Swiften/MUC/MUCImpl.cpp
index 029bb4b..d2b33f3 100644
--- a/Swiften/MUC/MUCImpl.cpp
+++ b/Swiften/MUC/MUCImpl.cpp
@@ -371,7 +371,7 @@ void MUCImpl::changeAffiliation(const JID& jid, MUCOccupant::Affiliation affilia
MUCAdminPayload::ref mucPayload = std::make_shared<MUCAdminPayload>();
MUCItem item;
item.affiliation = affiliation;
- item.realJID = jid.toBare();
+ item.realJID = jid;
mucPayload->addItem(item);
std::shared_ptr<GenericRequest<MUCAdminPayload> > request = std::make_shared<GenericRequest<MUCAdminPayload> >(IQ::Set, getJID(), mucPayload, iqRouter_);
request->onResponse.connect(boost::bind(&MUCImpl::handleAffiliationChangeResponse, this, _1, _2, jid, affiliation));
diff --git a/Swiften/Network/BOSHConnection.cpp b/Swiften/Network/BOSHConnection.cpp
index b4ffa7d..1312a3e 100644
--- a/Swiften/Network/BOSHConnection.cpp
+++ b/Swiften/Network/BOSHConnection.cpp
@@ -5,7 +5,7 @@
*/
/*
- * Copyright (c) 2011-2017 Isode Limited.
+ * Copyright (c) 2011-2019 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -27,6 +27,7 @@
#include <Swiften/StreamStack/DummyStreamLayer.h>
#include <Swiften/StreamStack/TLSLayer.h>
#include <Swiften/TLS/TLSContext.h>
+#include <Swiften/TLS/TLSContextFactory.h>
#include <Swiften/TLS/TLSOptions.h>
namespace Swift {
@@ -42,7 +43,8 @@ BOSHConnection::BOSHConnection(const URL& boshURL, Connector::ref connector, XML
connectionReady_(false)
{
if (boshURL_.getScheme() == "https") {
- tlsLayer_ = std::make_shared<TLSLayer>(tlsContextFactory, tlsOptions);
+ auto tlsContext = tlsContextFactory->createTLSContext(tlsOptions);
+ tlsLayer_ = std::make_shared<TLSLayer>(std::move(tlsContext));
// The following dummyLayer_ is needed as the TLSLayer will pass the decrypted data to its parent layer.
// The dummyLayer_ will serve as the parent layer.
dummyLayer_ = std::make_shared<DummyStreamLayer>(tlsLayer_.get());
@@ -72,27 +74,27 @@ void BOSHConnection::cancelConnector() {
}
void BOSHConnection::handleTLSConnected() {
- SWIFT_LOG(debug) << std::endl;
+ SWIFT_LOG(debug);
onConnectFinished(false);
}
void BOSHConnection::handleTLSApplicationDataRead(const SafeByteArray& data) {
- SWIFT_LOG(debug) << std::endl;
+ SWIFT_LOG(debug);
handleDataRead(std::make_shared<SafeByteArray>(data));
}
void BOSHConnection::handleTLSNetowrkDataWriteRequest(const SafeByteArray& data) {
- SWIFT_LOG(debug) << std::endl;
+ SWIFT_LOG(debug);
connection_->write(data);
}
void BOSHConnection::handleRawDataRead(std::shared_ptr<SafeByteArray> data) {
- SWIFT_LOG(debug) << std::endl;
+ SWIFT_LOG(debug);
tlsLayer_->handleDataRead(*data.get());
}
-void BOSHConnection::handleTLSError(std::shared_ptr<TLSError> /* error */) {
-
+void BOSHConnection::handleTLSError(std::shared_ptr<TLSError> error) {
+ SWIFT_LOG(debug) << (error ? error->getMessage() : "Unknown TLS error");
}
void BOSHConnection::writeData(const SafeByteArray& data) {
@@ -121,7 +123,7 @@ void BOSHConnection::restartStream() {
bool BOSHConnection::setClientCertificate(CertificateWithKey::ref cert) {
if (tlsLayer_) {
- SWIFT_LOG(debug) << "set client certificate" << std::endl;
+ SWIFT_LOG(debug) << "set client certificate";
return tlsLayer_->setClientCertificate(cert);
}
else {
@@ -209,7 +211,7 @@ void BOSHConnection::write(const SafeByteArray& data, bool streamRestart, bool t
writeData(safeHeader);
pending_ = true;
- SWIFT_LOG(debug) << "write data: " << safeByteArrayToString(safeHeader) << std::endl;
+ SWIFT_LOG(debug) << "write data: " << safeByteArrayToString(safeHeader);
}
void BOSHConnection::handleConnectFinished(Connection::ref connection) {
@@ -273,7 +275,7 @@ void BOSHConnection::startStream(const std::string& to, unsigned long long rid)
SafeByteArray safeHeader = createSafeByteArray(header.str());
onBOSHDataWritten(safeHeader);
writeData(safeHeader);
- SWIFT_LOG(debug) << "write stream header: " << safeByteArrayToString(safeHeader) << std::endl;
+ SWIFT_LOG(debug) << "write stream header: " << safeByteArrayToString(safeHeader);
}
void BOSHConnection::handleDataRead(std::shared_ptr<SafeByteArray> data) {
diff --git a/Swiften/Network/BOSHConnection.h b/Swiften/Network/BOSHConnection.h
index c492ac4..f0a946a 100644
--- a/Swiften/Network/BOSHConnection.h
+++ b/Swiften/Network/BOSHConnection.h
@@ -31,7 +31,7 @@ namespace Swift {
class XMLParserFactory;
class TLSContextFactory;
class TLSLayer;
- struct TLSOptions;
+ class TLSOptions;
class HighLayer;
class SWIFTEN_API BOSHError : public SessionStream::SessionStreamError {
diff --git a/Swiften/Network/BOSHConnectionPool.cpp b/Swiften/Network/BOSHConnectionPool.cpp
index 8a75e81..3a79a16 100644
--- a/Swiften/Network/BOSHConnectionPool.cpp
+++ b/Swiften/Network/BOSHConnectionPool.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2011-2016 Isode Limited.
+ * Copyright (c) 2011-2019 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -266,7 +266,7 @@ std::shared_ptr<BOSHConnection> BOSHConnectionPool::createConnection() {
if (boshURL.getScheme() == "https") {
bool success = connection->setClientCertificate(clientCertificate);
- SWIFT_LOG(debug) << "setClientCertificate, success: " << success << std::endl;
+ SWIFT_LOG(debug) << "setClientCertificate, success: " << success;
}
connection->connect();
diff --git a/Swiften/Network/BoostConnection.cpp b/Swiften/Network/BoostConnection.cpp
index 0de7b25..6ae6bf6 100644
--- a/Swiften/Network/BoostConnection.cpp
+++ b/Swiften/Network/BoostConnection.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2019 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -14,7 +14,6 @@
#include <boost/asio/placeholders.hpp>
#include <boost/asio/write.hpp>
#include <boost/bind.hpp>
-#include <boost/numeric/conversion/cast.hpp>
#include <Swiften/Base/Algorithm.h>
#include <Swiften/Base/ByteArray.h>
@@ -64,7 +63,7 @@ void BoostConnection::listen() {
void BoostConnection::connect(const HostAddressPort& addressPort) {
boost::asio::ip::tcp::endpoint endpoint(
- boost::asio::ip::address::from_string(addressPort.getAddress().toString()), boost::numeric_cast<unsigned short>(addressPort.getPort()));
+ boost::asio::ip::address::from_string(addressPort.getAddress().toString()), addressPort.getPort());
socket_.async_connect(
endpoint,
boost::bind(&BoostConnection::handleConnectFinished, shared_from_this(), boost::asio::placeholders::error));
@@ -108,7 +107,7 @@ void BoostConnection::doWrite(const SafeByteArray& data) {
}
void BoostConnection::handleConnectFinished(const boost::system::error_code& error) {
- SWIFT_LOG(debug) << "Connect finished: " << error << std::endl;
+ SWIFT_LOG(debug) << "Connect finished: " << error;
if (!error) {
eventLoop->postEvent(boost::bind(boost::ref(onConnectFinished), false), shared_from_this());
doRead();
@@ -127,7 +126,7 @@ void BoostConnection::doRead() {
}
void BoostConnection::handleSocketRead(const boost::system::error_code& error, size_t bytesTransferred) {
- SWIFT_LOG(debug) << "Socket read " << error << std::endl;
+ SWIFT_LOG(debug) << "Socket read " << error;
if (!error) {
readBuffer_->resize(bytesTransferred);
eventLoop->postEvent(boost::bind(boost::ref(onDataRead), readBuffer_), shared_from_this());
@@ -142,7 +141,7 @@ void BoostConnection::handleSocketRead(const boost::system::error_code& error, s
}
void BoostConnection::handleDataWritten(const boost::system::error_code& error) {
- SWIFT_LOG(debug) << "Data written " << error << std::endl;
+ SWIFT_LOG(debug) << "Data written " << error;
if (!error) {
eventLoop->postEvent(boost::ref(onDataWritten), shared_from_this());
}
diff --git a/Swiften/Network/BoostConnectionServer.cpp b/Swiften/Network/BoostConnectionServer.cpp
index 34b5799..dc05172 100644
--- a/Swiften/Network/BoostConnectionServer.cpp
+++ b/Swiften/Network/BoostConnectionServer.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2019 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -19,10 +19,10 @@
namespace Swift {
-BoostConnectionServer::BoostConnectionServer(int port, std::shared_ptr<boost::asio::io_service> ioService, EventLoop* eventLoop) : port_(port), ioService_(ioService), eventLoop(eventLoop), acceptor_(nullptr) {
+BoostConnectionServer::BoostConnectionServer(unsigned short port, std::shared_ptr<boost::asio::io_service> ioService, EventLoop* eventLoop) : port_(port), ioService_(ioService), eventLoop(eventLoop), acceptor_(nullptr) {
}
-BoostConnectionServer::BoostConnectionServer(const HostAddress &address, int port, std::shared_ptr<boost::asio::io_service> ioService, EventLoop* eventLoop) : address_(address), port_(port), ioService_(ioService), eventLoop(eventLoop), acceptor_(nullptr) {
+BoostConnectionServer::BoostConnectionServer(const HostAddress &address, unsigned short port, std::shared_ptr<boost::asio::io_service> ioService, EventLoop* eventLoop) : address_(address), port_(port), ioService_(ioService), eventLoop(eventLoop), acceptor_(nullptr) {
}
void BoostConnectionServer::start() {
@@ -37,16 +37,16 @@ boost::optional<BoostConnectionServer::Error> BoostConnectionServer::tryStart()
assert(!acceptor_);
boost::asio::ip::tcp::endpoint endpoint;
if (address_.isValid()) {
- endpoint = boost::asio::ip::tcp::endpoint(address_.getRawAddress(), boost::numeric_cast<unsigned short>(port_));
+ endpoint = boost::asio::ip::tcp::endpoint(address_.getRawAddress(), port_);
}
else {
- endpoint = boost::asio::ip::tcp::endpoint(boost::asio::ip::tcp::v6(), boost::numeric_cast<unsigned short>(port_));
+ endpoint = boost::asio::ip::tcp::endpoint(boost::asio::ip::tcp::v6(), port_);
}
acceptor_ = new boost::asio::ip::tcp::acceptor(*ioService_, endpoint);
if (endpoint.protocol() == boost::asio::ip::tcp::v6()) {
boost::system::error_code ec;
acceptor_->set_option(boost::asio::ip::v6_only(false), ec);
- SWIFT_LOG_ASSERT(ec, warning) << "IPv4/IPv6 dual-stack support is not supported on this platform." << std::endl;
+ SWIFT_LOG_ASSERT(ec, warning) << "IPv4/IPv6 dual-stack support is not supported on this platform.";
}
acceptNextConnection();
}
@@ -58,6 +58,9 @@ boost::optional<BoostConnectionServer::Error> BoostConnectionServer::tryStart()
return UnknownError;
}
}
+ catch (const boost::numeric::bad_numeric_cast&) {
+ return UnknownError;
+ }
return boost::optional<Error>();
}
diff --git a/Swiften/Network/BoostConnectionServer.h b/Swiften/Network/BoostConnectionServer.h
index 3dd9830..917d638 100644
--- a/Swiften/Network/BoostConnectionServer.h
+++ b/Swiften/Network/BoostConnectionServer.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -23,11 +23,11 @@ namespace Swift {
public:
typedef std::shared_ptr<BoostConnectionServer> ref;
- static ref create(int port, std::shared_ptr<boost::asio::io_service> ioService, EventLoop* eventLoop) {
+ static ref create(unsigned short port, std::shared_ptr<boost::asio::io_service> ioService, EventLoop* eventLoop) {
return ref(new BoostConnectionServer(port, ioService, eventLoop));
}
- static ref create(const HostAddress &address, int port, std::shared_ptr<boost::asio::io_service> ioService, EventLoop* eventLoop) {
+ static ref create(const HostAddress &address, unsigned short port, std::shared_ptr<boost::asio::io_service> ioService, EventLoop* eventLoop) {
return ref(new BoostConnectionServer(address, port, ioService, eventLoop));
}
@@ -40,8 +40,8 @@ namespace Swift {
boost::signals2::signal<void (boost::optional<Error>)> onStopped;
private:
- BoostConnectionServer(int port, std::shared_ptr<boost::asio::io_service> ioService, EventLoop* eventLoop);
- BoostConnectionServer(const HostAddress &address, int port, std::shared_ptr<boost::asio::io_service> ioService, EventLoop* eventLoop);
+ BoostConnectionServer(unsigned short port, std::shared_ptr<boost::asio::io_service> ioService, EventLoop* eventLoop);
+ BoostConnectionServer(const HostAddress &address, unsigned short port, std::shared_ptr<boost::asio::io_service> ioService, EventLoop* eventLoop);
void stop(boost::optional<Error> e);
void acceptNextConnection();
@@ -49,7 +49,7 @@ namespace Swift {
private:
HostAddress address_;
- int port_;
+ unsigned short port_;
std::shared_ptr<boost::asio::io_service> ioService_;
EventLoop* eventLoop;
boost::asio::ip::tcp::acceptor* acceptor_;
diff --git a/Swiften/Network/BoostConnectionServerFactory.cpp b/Swiften/Network/BoostConnectionServerFactory.cpp
index 8b3fd2f..6936453 100644
--- a/Swiften/Network/BoostConnectionServerFactory.cpp
+++ b/Swiften/Network/BoostConnectionServerFactory.cpp
@@ -19,11 +19,11 @@ namespace Swift {
BoostConnectionServerFactory::BoostConnectionServerFactory(std::shared_ptr<boost::asio::io_service> ioService, EventLoop* eventLoop) : ioService(ioService), eventLoop(eventLoop) {
}
-std::shared_ptr<ConnectionServer> BoostConnectionServerFactory::createConnectionServer(int port) {
+std::shared_ptr<ConnectionServer> BoostConnectionServerFactory::createConnectionServer(unsigned short port) {
return BoostConnectionServer::create(port, ioService, eventLoop);
}
-std::shared_ptr<ConnectionServer> BoostConnectionServerFactory::createConnectionServer(const Swift::HostAddress &hostAddress, int port) {
+std::shared_ptr<ConnectionServer> BoostConnectionServerFactory::createConnectionServer(const Swift::HostAddress &hostAddress, unsigned short port) {
return BoostConnectionServer::create(hostAddress, port, ioService, eventLoop);
}
diff --git a/Swiften/Network/BoostConnectionServerFactory.h b/Swiften/Network/BoostConnectionServerFactory.h
index 033e63d..956132b 100644
--- a/Swiften/Network/BoostConnectionServerFactory.h
+++ b/Swiften/Network/BoostConnectionServerFactory.h
@@ -5,7 +5,7 @@
*/
/*
- * Copyright (c) 2015-2016 Isode Limited.
+ * Copyright (c) 2015-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -25,9 +25,9 @@ namespace Swift {
public:
BoostConnectionServerFactory(std::shared_ptr<boost::asio::io_service>, EventLoop* eventLoop);
- virtual std::shared_ptr<ConnectionServer> createConnectionServer(int port);
+ virtual std::shared_ptr<ConnectionServer> createConnectionServer(unsigned short port);
- virtual std::shared_ptr<ConnectionServer> createConnectionServer(const Swift::HostAddress &hostAddress, int port);
+ virtual std::shared_ptr<ConnectionServer> createConnectionServer(const Swift::HostAddress &hostAddress, unsigned short port);
private:
std::shared_ptr<boost::asio::io_service> ioService;
diff --git a/Swiften/Network/BoostNetworkFactories.cpp b/Swiften/Network/BoostNetworkFactories.cpp
index 9fef73c..13a7960 100644
--- a/Swiften/Network/BoostNetworkFactories.cpp
+++ b/Swiften/Network/BoostNetworkFactories.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2019 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -44,9 +44,9 @@ BoostNetworkFactories::BoostNetworkFactories(EventLoop* eventLoop, std::shared_p
idnConverter = PlatformIDNConverter::create();
#ifdef USE_UNBOUND
// TODO: What to do about idnConverter.
- domainNameResolver = new UnboundDomainNameResolver(idnConverter, ioServiceThread.getIOService(), eventLoop);
+ domainNameResolver = new UnboundDomainNameResolver(idnConverter.get(), ioServiceThread.getIOService(), eventLoop);
#else
- domainNameResolver = new PlatformDomainNameResolver(idnConverter, eventLoop);
+ domainNameResolver = new PlatformDomainNameResolver(idnConverter.get(), eventLoop);
#endif
cryptoProvider = PlatformCryptoProvider::create();
}
@@ -54,7 +54,6 @@ BoostNetworkFactories::BoostNetworkFactories(EventLoop* eventLoop, std::shared_p
BoostNetworkFactories::~BoostNetworkFactories() {
delete cryptoProvider;
delete domainNameResolver;
- delete idnConverter;
delete proxyProvider;
delete tlsFactories;
delete xmlParserFactory;
diff --git a/Swiften/Network/BoostNetworkFactories.h b/Swiften/Network/BoostNetworkFactories.h
index 2bf8d33..33a3584 100644
--- a/Swiften/Network/BoostNetworkFactories.h
+++ b/Swiften/Network/BoostNetworkFactories.h
@@ -1,11 +1,13 @@
/*
- * Copyright (c) 2010-2017 Isode Limited.
+ * Copyright (c) 2010-2019 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
#pragma once
+#include <memory>
+
#include <Swiften/Base/API.h>
#include <Swiften/Network/BoostIOServiceThread.h>
#include <Swiften/Network/NetworkFactories.h>
@@ -68,7 +70,7 @@ namespace Swift {
}
virtual IDNConverter* getIDNConverter() const override {
- return idnConverter;
+ return idnConverter.get();
}
virtual CryptoProvider* getCryptoProvider() const override {
@@ -87,7 +89,7 @@ namespace Swift {
PlatformTLSFactories* tlsFactories;
ProxyProvider* proxyProvider;
EventLoop* eventLoop;
- IDNConverter* idnConverter;
+ std::unique_ptr<IDNConverter> idnConverter;
CryptoProvider* cryptoProvider;
};
}
diff --git a/Swiften/Network/ChainedConnector.cpp b/Swiften/Network/ChainedConnector.cpp
index ea55db3..a9210ba 100644
--- a/Swiften/Network/ChainedConnector.cpp
+++ b/Swiften/Network/ChainedConnector.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2011-2016 Isode Limited.
+ * Copyright (c) 2011-2019 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -18,7 +18,7 @@ using namespace Swift;
ChainedConnector::ChainedConnector(
const std::string& hostname,
- int port,
+ unsigned short port,
const boost::optional<std::string>& serviceLookupPrefix,
DomainNameResolver* resolver,
const std::vector<ConnectionFactory*>& connectionFactories,
@@ -45,7 +45,7 @@ void ChainedConnector::setTimeoutMilliseconds(int milliseconds) {
}
void ChainedConnector::start() {
- SWIFT_LOG(debug) << "Starting queued connector for " << hostname << std::endl;
+ SWIFT_LOG(debug) << "Starting queued connector for " << hostname;
connectionFactoryQueue = std::deque<ConnectionFactory*>(connectionFactories.begin(), connectionFactories.end());
tryNextConnectionFactory();
@@ -63,12 +63,12 @@ void ChainedConnector::stop() {
void ChainedConnector::tryNextConnectionFactory() {
assert(!currentConnector);
if (connectionFactoryQueue.empty()) {
- SWIFT_LOG(debug) << "No more connection factories" << std::endl;
+ SWIFT_LOG(debug) << "No more connection factories";
finish(std::shared_ptr<Connection>(), lastError);
}
else {
ConnectionFactory* connectionFactory = connectionFactoryQueue.front();
- SWIFT_LOG(debug) << "Trying next connection factory: " << typeid(*connectionFactory).name() << std::endl;
+ SWIFT_LOG(debug) << "Trying next connection factory: " << typeid(*connectionFactory).name();
connectionFactoryQueue.pop_front();
currentConnector = Connector::create(hostname, port, serviceLookupPrefix, resolver, connectionFactory, timerFactory);
currentConnector->setTimeoutMilliseconds(timeoutMilliseconds);
@@ -78,7 +78,7 @@ void ChainedConnector::tryNextConnectionFactory() {
}
void ChainedConnector::handleConnectorFinished(std::shared_ptr<Connection> connection, std::shared_ptr<Error> error) {
- SWIFT_LOG(debug) << "Connector finished" << std::endl;
+ SWIFT_LOG(debug) << "Connector finished";
currentConnector->onConnectFinished.disconnect(boost::bind(&ChainedConnector::handleConnectorFinished, this, _1, _2));
lastError = error;
currentConnector.reset();
diff --git a/Swiften/Network/ChainedConnector.h b/Swiften/Network/ChainedConnector.h
index a00d7e5..9620293 100644
--- a/Swiften/Network/ChainedConnector.h
+++ b/Swiften/Network/ChainedConnector.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2011-2016 Isode Limited.
+ * Copyright (c) 2011-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -26,7 +26,7 @@ namespace Swift {
class SWIFTEN_API ChainedConnector {
public:
- ChainedConnector(const std::string& hostname, int port, const boost::optional<std::string>& serviceLookupPrefix, DomainNameResolver*, const std::vector<ConnectionFactory*>&, TimerFactory*);
+ ChainedConnector(const std::string& hostname, unsigned short port, const boost::optional<std::string>& serviceLookupPrefix, DomainNameResolver*, const std::vector<ConnectionFactory*>&, TimerFactory*);
~ChainedConnector();
void setTimeoutMilliseconds(int milliseconds);
@@ -42,7 +42,7 @@ namespace Swift {
private:
std::string hostname;
- int port;
+ unsigned short port;
boost::optional<std::string> serviceLookupPrefix;
DomainNameResolver* resolver;
std::vector<ConnectionFactory*> connectionFactories;
diff --git a/Swiften/Network/ConnectionServerFactory.h b/Swiften/Network/ConnectionServerFactory.h
index 413131e..2ebccc1 100644
--- a/Swiften/Network/ConnectionServerFactory.h
+++ b/Swiften/Network/ConnectionServerFactory.h
@@ -5,7 +5,7 @@
*/
/*
- * Copyright (c) 2015-2016 Isode Limited.
+ * Copyright (c) 2015-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -24,8 +24,8 @@ namespace Swift {
public:
virtual ~ConnectionServerFactory();
- virtual std::shared_ptr<ConnectionServer> createConnectionServer(int port) = 0;
+ virtual std::shared_ptr<ConnectionServer> createConnectionServer(unsigned short port) = 0;
- virtual std::shared_ptr<ConnectionServer> createConnectionServer(const Swift::HostAddress& hostAddress, int port) = 0;
+ virtual std::shared_ptr<ConnectionServer> createConnectionServer(const Swift::HostAddress& hostAddress, unsigned short port) = 0;
};
}
diff --git a/Swiften/Network/Connector.cpp b/Swiften/Network/Connector.cpp
index 457d8a9..e27b95d 100644
--- a/Swiften/Network/Connector.cpp
+++ b/Swiften/Network/Connector.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2019 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -17,7 +17,7 @@
namespace Swift {
-Connector::Connector(const std::string& hostname, int port, const boost::optional<std::string>& serviceLookupPrefix, DomainNameResolver* resolver, ConnectionFactory* connectionFactory, TimerFactory* timerFactory) : hostname(hostname), port(port), serviceLookupPrefix(serviceLookupPrefix), resolver(resolver), connectionFactory(connectionFactory), timerFactory(timerFactory), timeoutMilliseconds(0), queriedAllServices(true), foundSomeDNS(false) {
+Connector::Connector(const std::string& hostname, unsigned short port, const boost::optional<std::string>& serviceLookupPrefix, DomainNameResolver* resolver, ConnectionFactory* connectionFactory, TimerFactory* timerFactory) : hostname(hostname), port(port), serviceLookupPrefix(serviceLookupPrefix), resolver(resolver), connectionFactory(connectionFactory), timerFactory(timerFactory), timeoutMilliseconds(0), queriedAllServices(true), foundSomeDNS(false) {
}
void Connector::setTimeoutMilliseconds(int milliseconds) {
@@ -25,17 +25,17 @@ void Connector::setTimeoutMilliseconds(int milliseconds) {
}
void Connector::start() {
- SWIFT_LOG(debug) << "Starting connector for " << hostname << std::endl;
+ SWIFT_LOG(debug) << "Starting connector for " << hostname;
assert(!currentConnection);
assert(!serviceQuery);
assert(!timer);
- queriedAllServices = false;
auto hostAddress = HostAddress::fromString(hostname);
if (timeoutMilliseconds > 0) {
timer = timerFactory->createTimer(timeoutMilliseconds);
timer->onTick.connect(boost::bind(&Connector::handleTimeout, shared_from_this()));
}
if (serviceLookupPrefix) {
+ queriedAllServices = false;
serviceQuery = resolver->createServiceQuery(*serviceLookupPrefix, hostname);
serviceQuery->onResult.connect(boost::bind(&Connector::handleServiceQueryResult, shared_from_this(), _1));
serviceQuery->run();
@@ -66,7 +66,7 @@ void Connector::queryAddress(const std::string& hostname) {
}
void Connector::handleServiceQueryResult(const std::vector<DomainNameServiceQuery::Result>& result) {
- SWIFT_LOG(debug) << result.size() << " SRV result(s)" << std::endl;
+ SWIFT_LOG(debug) << result.size() << " SRV result(s)";
serviceQueryResults = std::deque<DomainNameServiceQuery::Result>(result.begin(), result.end());
serviceQuery.reset();
if (!serviceQueryResults.empty()) {
@@ -77,23 +77,23 @@ void Connector::handleServiceQueryResult(const std::vector<DomainNameServiceQuer
void Connector::tryNextServiceOrFallback() {
if (queriedAllServices) {
- SWIFT_LOG(debug) << "Queried all services" << std::endl;
+ SWIFT_LOG(debug) << "Queried all services";
finish(std::shared_ptr<Connection>());
}
else if (serviceQueryResults.empty()) {
- SWIFT_LOG(debug) << "Falling back on A resolution" << std::endl;
+ SWIFT_LOG(debug) << "Falling back on A resolution";
// Fall back on simple address resolving
queriedAllServices = true;
queryAddress(hostname);
}
else {
- SWIFT_LOG(debug) << "Querying next address" << std::endl;
+ SWIFT_LOG(debug) << "Querying next address";
queryAddress(serviceQueryResults.front().hostname);
}
}
void Connector::handleAddressQueryResult(const std::vector<HostAddress>& addresses, boost::optional<DomainNameResolveError> error) {
- SWIFT_LOG(debug) << addresses.size() << " addresses" << std::endl;
+ SWIFT_LOG(debug) << addresses.size() << " addresses";
addressQuery.reset();
if (error || addresses.empty()) {
if (!serviceQueryResults.empty()) {
@@ -110,7 +110,7 @@ void Connector::handleAddressQueryResult(const std::vector<HostAddress>& address
void Connector::tryNextAddress() {
if (addressQueryResults.empty()) {
- SWIFT_LOG(debug) << "Done trying addresses. Moving on." << std::endl;
+ SWIFT_LOG(debug) << "Done trying addresses. Moving on.";
// Done trying all addresses. Move on to the next host.
if (!serviceQueryResults.empty()) {
serviceQueryResults.pop_front();
@@ -118,11 +118,11 @@ void Connector::tryNextAddress() {
tryNextServiceOrFallback();
}
else {
- SWIFT_LOG(debug) << "Trying next address" << std::endl;
+ SWIFT_LOG(debug) << "Trying next address";
HostAddress address = addressQueryResults.front();
addressQueryResults.pop_front();
- int connectPort = (port == -1 ? 5222 : port);
+ unsigned short connectPort = (port == 0 ? 5222 : port);
if (!serviceQueryResults.empty()) {
connectPort = serviceQueryResults.front().port;
}
@@ -133,7 +133,7 @@ void Connector::tryNextAddress() {
void Connector::tryConnect(const HostAddressPort& target) {
assert(!currentConnection);
- SWIFT_LOG(debug) << "Trying to connect to " << target.getAddress().toString() << ":" << target.getPort() << std::endl;
+ SWIFT_LOG(debug) << "Trying to connect to " << target.getAddress().toString() << ":" << target.getPort();
currentConnection = connectionFactory->createConnection();
currentConnection->onConnectFinished.connect(boost::bind(&Connector::handleConnectionConnectFinished, shared_from_this(), _1));
currentConnection->connect(target);
@@ -143,11 +143,18 @@ void Connector::tryConnect(const HostAddressPort& target) {
}
void Connector::handleConnectionConnectFinished(bool error) {
- SWIFT_LOG(debug) << "ConnectFinished: " << (error ? "error" : "success") << std::endl;
+ SWIFT_LOG(debug) << "ConnectFinished: " << (error ? "error" : "success");
if (timer) {
timer->stop();
timer.reset();
}
+ if (!currentConnection) {
+ // We've hit a race condition where multiple finisheds were on the eventloop queue at once.
+ // This is particularly likely on macOS where the hourly momentary wakeup while asleep
+ // can cause both a timeout and an onConnectFinished to be queued sequentially (SWIFT-232).
+ // Let the first one process as normal, but ignore the second.
+ return;
+ }
currentConnection->onConnectFinished.disconnect(boost::bind(&Connector::handleConnectionConnectFinished, shared_from_this(), _1));
if (error) {
currentConnection.reset();
@@ -188,7 +195,8 @@ void Connector::finish(std::shared_ptr<Connection> connection) {
}
void Connector::handleTimeout() {
- SWIFT_LOG(debug) << "Timeout" << std::endl;
+ SWIFT_LOG(debug) << "Timeout";
+ SWIFT_LOG_ASSERT(currentConnection, error) << "Connection not valid but triggered a timeout";
handleConnectionConnectFinished(true);
}
diff --git a/Swiften/Network/Connector.h b/Swiften/Network/Connector.h
index d8a1b88..c76a4af 100644
--- a/Swiften/Network/Connector.h
+++ b/Swiften/Network/Connector.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -30,7 +30,7 @@ namespace Swift {
public:
typedef std::shared_ptr<Connector> ref;
- static Connector::ref create(const std::string& hostname, int port, const boost::optional<std::string>& serviceLookupPrefix, DomainNameResolver* resolver, ConnectionFactory* connectionFactory, TimerFactory* timerFactory) {
+ static Connector::ref create(const std::string& hostname, unsigned short port, const boost::optional<std::string>& serviceLookupPrefix, DomainNameResolver* resolver, ConnectionFactory* connectionFactory, TimerFactory* timerFactory) {
return ref(new Connector(hostname, port, serviceLookupPrefix, resolver, connectionFactory, timerFactory));
}
@@ -46,7 +46,7 @@ namespace Swift {
boost::signals2::signal<void (std::shared_ptr<Connection>, std::shared_ptr<Error>)> onConnectFinished;
private:
- Connector(const std::string& hostname, int port, const boost::optional<std::string>& serviceLookupPrefix, DomainNameResolver*, ConnectionFactory*, TimerFactory*);
+ Connector(const std::string& hostname, unsigned short port, const boost::optional<std::string>& serviceLookupPrefix, DomainNameResolver*, ConnectionFactory*, TimerFactory*);
void handleServiceQueryResult(const std::vector<DomainNameServiceQuery::Result>& result);
void handleAddressQueryResult(const std::vector<HostAddress>& address, boost::optional<DomainNameResolveError> error);
@@ -63,7 +63,7 @@ namespace Swift {
private:
std::string hostname;
- int port;
+ unsigned short port;
boost::optional<std::string> serviceLookupPrefix;
DomainNameResolver* resolver;
ConnectionFactory* connectionFactory;
diff --git a/Swiften/Network/DomainNameServiceQuery.cpp b/Swiften/Network/DomainNameServiceQuery.cpp
index 708bbce..5784dd7 100644
--- a/Swiften/Network/DomainNameServiceQuery.cpp
+++ b/Swiften/Network/DomainNameServiceQuery.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -11,15 +11,11 @@
#include <iterator>
#include <numeric>
-#include <boost/lambda/bind.hpp>
-#include <boost/lambda/lambda.hpp>
#include <boost/numeric/conversion/cast.hpp>
-#include <boost/typeof/typeof.hpp>
#include <Swiften/Base/RandomGenerator.h>
using namespace Swift;
-namespace lambda = boost::lambda;
namespace {
struct ResultPriorityComparator {
@@ -43,19 +39,25 @@ void DomainNameServiceQuery::sortResults(std::vector<DomainNameServiceQuery::Res
std::vector<DomainNameServiceQuery::Result>::iterator next = std::upper_bound(i, queries.end(), *i, comparator);
if (std::distance(i, next) > 1) {
std::vector<int> weights;
- std::transform(i, next, std::back_inserter(weights),
- /* easy hack to account for '0' weights getting at least some weight */
- lambda::bind(&Result::weight, lambda::_1) + 1);
- for (int j = 0; j < boost::numeric_cast<int>(weights.size() - 1); ++j) {
- std::vector<int> cumulativeWeights;
- std::partial_sum(
- weights.begin() + j,
- weights.end(),
- std::back_inserter(cumulativeWeights));
- int randomNumber = generator.generateRandomInteger(cumulativeWeights.back());
- BOOST_AUTO(selectedIndex, std::lower_bound(cumulativeWeights.begin(), cumulativeWeights.end(), randomNumber) - cumulativeWeights.begin());
- std::swap(i[j], i[j + selectedIndex]);
- std::swap(weights.begin()[j], weights.begin()[j + selectedIndex]);
+ std::transform(i, next, std::back_inserter(weights), [](const DomainNameServiceQuery::Result& result) {
+ /* easy hack to account for '0' weights getting at least some weight */
+ return result.weight + 1;
+ });
+ try {
+ for (int j = 0; j < boost::numeric_cast<int>(weights.size()) - 1; ++j) {
+ std::vector<int> cumulativeWeights;
+ std::partial_sum(
+ weights.begin() + j,
+ weights.end(),
+ std::back_inserter(cumulativeWeights));
+ int randomNumber = generator.generateRandomInteger(cumulativeWeights.back());
+ auto selectedIndex = std::lower_bound(cumulativeWeights.begin(), cumulativeWeights.end(), randomNumber) - cumulativeWeights.begin();
+ std::swap(i[j], i[j + selectedIndex]);
+ std::swap(weights.begin()[j], weights.begin()[j + selectedIndex]);
+ }
+ }
+ catch (const boost::numeric::bad_numeric_cast&) {
+ // In the unlikely event of weights.size() being too large, use the list as-is.
}
}
i = next;
diff --git a/Swiften/Network/DomainNameServiceQuery.h b/Swiften/Network/DomainNameServiceQuery.h
index b27f32e..1631b99 100644
--- a/Swiften/Network/DomainNameServiceQuery.h
+++ b/Swiften/Network/DomainNameServiceQuery.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -24,9 +24,9 @@ namespace Swift {
typedef std::shared_ptr<DomainNameServiceQuery> ref;
struct Result {
- Result(const std::string& hostname = "", int port = -1, int priority = -1, int weight = -1) : hostname(hostname), port(port), priority(priority), weight(weight) {}
+ Result(const std::string& hostname = "", unsigned short port = 0, int priority = -1, int weight = -1) : hostname(hostname), port(port), priority(priority), weight(weight) {}
std::string hostname;
- int port;
+ unsigned short port;
int priority;
int weight;
};
diff --git a/Swiften/Network/DummyConnectionServer.h b/Swiften/Network/DummyConnectionServer.h
index 970cbb7..a4fd07f 100644
--- a/Swiften/Network/DummyConnectionServer.h
+++ b/Swiften/Network/DummyConnectionServer.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -17,8 +17,8 @@
namespace Swift {
class SWIFTEN_API DummyConnectionServer : public ConnectionServer, public EventOwner, public std::enable_shared_from_this<DummyConnectionServer> {
public:
- DummyConnectionServer(EventLoop* /*eventLoop*/, int port) : localAddressPort(HostAddress(), port) {}
- DummyConnectionServer(EventLoop* /*eventLoop*/, const Swift::HostAddress& hostAddress, int port) : localAddressPort(hostAddress, port) {}
+ DummyConnectionServer(EventLoop* /*eventLoop*/, unsigned short port) : localAddressPort(HostAddress(), port) {}
+ DummyConnectionServer(EventLoop* /*eventLoop*/, const Swift::HostAddress& hostAddress, unsigned short port) : localAddressPort(hostAddress, port) {}
virtual ~DummyConnectionServer() {}
virtual HostAddressPort getAddressPort() const {
diff --git a/Swiften/Network/DummyConnectionServerFactory.h b/Swiften/Network/DummyConnectionServerFactory.h
index 822f95f..4b25118 100644
--- a/Swiften/Network/DummyConnectionServerFactory.h
+++ b/Swiften/Network/DummyConnectionServerFactory.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2014-2016 Isode Limited.
+ * Copyright (c) 2014-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -20,11 +20,11 @@ public:
DummyConnectionServerFactory(EventLoop* eventLoop) : eventLoop(eventLoop) {}
virtual ~DummyConnectionServerFactory() {}
- virtual std::shared_ptr<ConnectionServer> createConnectionServer(int port) {
+ virtual std::shared_ptr<ConnectionServer> createConnectionServer(unsigned short port) {
return std::make_shared<DummyConnectionServer>(eventLoop, port);
}
- virtual std::shared_ptr<ConnectionServer> createConnectionServer(const Swift::HostAddress& hostAddress, int port) {
+ virtual std::shared_ptr<ConnectionServer> createConnectionServer(const Swift::HostAddress& hostAddress, unsigned short port) {
return std::make_shared<DummyConnectionServer>(eventLoop, hostAddress, port);
}
diff --git a/Swiften/Network/EnvironmentProxyProvider.cpp b/Swiften/Network/EnvironmentProxyProvider.cpp
index 8edb136..6fbf373 100644
--- a/Swiften/Network/EnvironmentProxyProvider.cpp
+++ b/Swiften/Network/EnvironmentProxyProvider.cpp
@@ -5,7 +5,7 @@
*/
/*
- * Copyright (c) 2016 Isode Limited.
+ * Copyright (c) 2016-2019 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -17,6 +17,8 @@
#include <iostream>
+#include <boost/numeric/conversion/cast.hpp>
+
#include <Swiften/Base/Log.h>
namespace Swift {
@@ -24,7 +26,7 @@ namespace Swift {
EnvironmentProxyProvider::EnvironmentProxyProvider() {
socksProxy = getFromEnv("all_proxy", "socks");
httpProxy = getFromEnv("http_proxy", "http");
- SWIFT_LOG(debug) << "Environment: SOCKS5 => " << socksProxy.toString() << "; HTTP Connect => " << httpProxy.toString() << std::endl;
+ SWIFT_LOG(debug) << "Environment: SOCKS5 => " << socksProxy.toString() << "; HTTP Connect => " << httpProxy.toString();
}
HostAddressPort EnvironmentProxyProvider::getHTTPConnectProxy() const {
@@ -38,7 +40,7 @@ HostAddressPort EnvironmentProxyProvider::getSOCKS5Proxy() const {
HostAddressPort EnvironmentProxyProvider::getFromEnv(const char* envVarName, std::string proxyProtocol) {
char* envVar = nullptr;
std::string address;
- int port = 0;
+ unsigned short port = 0;
envVar = getenv(envVarName);
@@ -46,7 +48,11 @@ HostAddressPort EnvironmentProxyProvider::getFromEnv(const char* envVarName, std
address = envVar != nullptr ? envVar : "0.0.0.0";
if(envVar != nullptr && address.compare(0, proxyProtocol.length(), proxyProtocol) == 0) {
address = address.substr(proxyProtocol.length(), address.length());
- port = atoi(address.substr(address.find(':') + 1, address.length()).c_str());
+ try {
+ port = boost::numeric_cast<unsigned short>(atoi(address.substr(address.find(':') + 1, address.length()).c_str()));
+ }
+ catch (boost::numeric::bad_numeric_cast&) {
+ }
address = address.substr(0, address.find(':'));
}
diff --git a/Swiften/Network/GConfProxyProvider.cpp b/Swiften/Network/GConfProxyProvider.cpp
index eade450..a2f8adc 100644
--- a/Swiften/Network/GConfProxyProvider.cpp
+++ b/Swiften/Network/GConfProxyProvider.cpp
@@ -5,7 +5,7 @@
*/
/*
- * Copyright (c) 2016-2017 Isode Limited.
+ * Copyright (c) 2016-2019 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -21,6 +21,8 @@ extern "C" {
#include <gconf/gconf-client.h>
}
+#include <boost/numeric/conversion/cast.hpp>
+
#include <Swiften/Base/Log.h>
namespace Swift {
@@ -37,7 +39,7 @@ GConfProxyProvider::GConfProxyProvider() {
socksProxy = getFromGConf("/system/proxy/socks_host", "/system/proxy/socks_port");
httpProxy = getFromGConf("/system/http_proxy/host", "/system/http_proxy/port");
- SWIFT_LOG(debug) << "GConf: SOCKS5 => " << socksProxy.toString() << "; HTTP Connect => " << httpProxy.toString() << std::endl;
+ SWIFT_LOG(debug) << "GConf: SOCKS5 => " << socksProxy.toString() << "; HTTP Connect => " << httpProxy.toString();
}
HostAddressPort GConfProxyProvider::getHTTPConnectProxy() const {
@@ -50,13 +52,17 @@ HostAddressPort GConfProxyProvider::getSOCKS5Proxy() const {
HostAddressPort GConfProxyProvider::getFromGConf(const char* gcHost, const char* gcPort) {
std::string address;
- int port = 0;
+ unsigned short port = 0;
gchar* str;
GConfClient* client = gconf_client_get_default();
str = gconf_client_get_string(client, gcHost, NULL);
- port = static_cast<int> (gconf_client_get_int(client, gcPort, NULL));
+ try {
+ port = boost::numeric_cast<unsigned short>(gconf_client_get_int(client, gcPort, NULL));
+ }
+ catch (const boost::numeric::bad_numeric_cast&) {
+ }
if(str) {
address = static_cast<char*> (str);
diff --git a/Swiften/Network/HTTPConnectProxiedConnection.cpp b/Swiften/Network/HTTPConnectProxiedConnection.cpp
index b5e521b..e63b8e2 100644
--- a/Swiften/Network/HTTPConnectProxiedConnection.cpp
+++ b/Swiften/Network/HTTPConnectProxiedConnection.cpp
@@ -5,7 +5,7 @@
*/
/*
- * Copyright (c) 2011-2016 Isode Limited.
+ * Copyright (c) 2011-2019 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -36,7 +36,7 @@ HTTPConnectProxiedConnection::HTTPConnectProxiedConnection(
ConnectionFactory* connectionFactory,
TimerFactory* timerFactory,
const std::string& proxyHost,
- int proxyPort,
+ unsigned short proxyPort,
const SafeString& authID,
const SafeString& authPassword) :
ProxiedConnection(resolver, connectionFactory, timerFactory, proxyHost, proxyPort),
@@ -77,7 +77,7 @@ void HTTPConnectProxiedConnection::initializeProxy() {
nextHTTPRequestHeaders_.clear();
}
append(data, createSafeByteArray("\r\n"));
- SWIFT_LOG(debug) << "HTTP Proxy send headers: " << byteArrayToString(ByteArray(data.begin(), data.end())) << std::endl;
+ SWIFT_LOG(debug) << "HTTP Proxy send headers: " << byteArrayToString(ByteArray(data.begin(), data.end()));
write(data);
}
@@ -111,7 +111,7 @@ void HTTPConnectProxiedConnection::sendHTTPRequest(const std::string& statusLine
void HTTPConnectProxiedConnection::handleProxyInitializeData(std::shared_ptr<SafeByteArray> data) {
std::string dataString = byteArrayToString(ByteArray(data->begin(), data->end()));
- SWIFT_LOG(debug) << data << std::endl;
+ SWIFT_LOG(debug) << data;
httpResponseBuffer_.append(dataString);
std::string statusLine;
@@ -141,17 +141,17 @@ void HTTPConnectProxiedConnection::handleProxyInitializeData(std::shared_ptr<Saf
if (tmp.size() > 1) {
try {
int status = boost::lexical_cast<int>(tmp[1]);
- SWIFT_LOG(debug) << "Proxy Status: " << status << std::endl;
+ SWIFT_LOG(debug) << "Proxy Status: " << status;
if (status / 100 == 2) { // all 2XX states are OK
setProxyInitializeFinished(true);
}
else {
- SWIFT_LOG(debug) << "HTTP Proxy returned an error: " << httpResponseBuffer_ << std::endl;
+ SWIFT_LOG(debug) << "HTTP Proxy returned an error: " << httpResponseBuffer_;
setProxyInitializeFinished(false);
}
}
catch (boost::bad_lexical_cast&) {
- SWIFT_LOG(warning) << "Unexpected response: " << tmp[1] << std::endl;
+ SWIFT_LOG(warning) << "Unexpected response: " << tmp[1];
setProxyInitializeFinished(false);
}
}
diff --git a/Swiften/Network/HTTPConnectProxiedConnection.h b/Swiften/Network/HTTPConnectProxiedConnection.h
index 6592839..a83d47c 100644
--- a/Swiften/Network/HTTPConnectProxiedConnection.h
+++ b/Swiften/Network/HTTPConnectProxiedConnection.h
@@ -5,7 +5,7 @@
*/
/*
- * Copyright (c) 2011-2017 Isode Limited.
+ * Copyright (c) 2011-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -30,14 +30,14 @@ namespace Swift {
virtual ~HTTPConnectProxiedConnection();
- static ref create(DomainNameResolver* resolver, ConnectionFactory* connectionFactory, TimerFactory* timerFactory, const std::string& proxyHost, int proxyPort, const SafeString& authID, const SafeString& authPassword) {
+ static ref create(DomainNameResolver* resolver, ConnectionFactory* connectionFactory, TimerFactory* timerFactory, const std::string& proxyHost, unsigned short proxyPort, const SafeString& authID, const SafeString& authPassword) {
return ref(new HTTPConnectProxiedConnection(resolver, connectionFactory, timerFactory, proxyHost, proxyPort, authID, authPassword));
}
void setHTTPTrafficFilter(std::shared_ptr<HTTPTrafficFilter> trafficFilter);
private:
- HTTPConnectProxiedConnection(DomainNameResolver* resolver, ConnectionFactory* connectionFactory, TimerFactory* timerFactory, const std::string& proxyHost, int proxyPort, const SafeString& authID, const SafeString& authPassword);
+ HTTPConnectProxiedConnection(DomainNameResolver* resolver, ConnectionFactory* connectionFactory, TimerFactory* timerFactory, const std::string& proxyHost, unsigned short proxyPort, const SafeString& authID, const SafeString& authPassword);
virtual void initializeProxy();
virtual void handleProxyInitializeData(std::shared_ptr<SafeByteArray> data);
diff --git a/Swiften/Network/HTTPConnectProxiedConnectionFactory.cpp b/Swiften/Network/HTTPConnectProxiedConnectionFactory.cpp
index 91ace3d..54b998a 100644
--- a/Swiften/Network/HTTPConnectProxiedConnectionFactory.cpp
+++ b/Swiften/Network/HTTPConnectProxiedConnectionFactory.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012-2016 Isode Limited.
+ * Copyright (c) 2012-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -16,11 +16,11 @@
namespace Swift {
-HTTPConnectProxiedConnectionFactory::HTTPConnectProxiedConnectionFactory(DomainNameResolver* resolver, ConnectionFactory* connectionFactory, TimerFactory* timerFactory, const std::string& proxyHost, int proxyPort, std::shared_ptr<HTTPTrafficFilter> httpTrafficFilter) : resolver_(resolver), connectionFactory_(connectionFactory), timerFactory_(timerFactory), proxyHost_(proxyHost), proxyPort_(proxyPort), authID_(""), authPassword_(""), httpTrafficFilter_(httpTrafficFilter) {
+HTTPConnectProxiedConnectionFactory::HTTPConnectProxiedConnectionFactory(DomainNameResolver* resolver, ConnectionFactory* connectionFactory, TimerFactory* timerFactory, const std::string& proxyHost, unsigned short proxyPort, std::shared_ptr<HTTPTrafficFilter> httpTrafficFilter) : resolver_(resolver), connectionFactory_(connectionFactory), timerFactory_(timerFactory), proxyHost_(proxyHost), proxyPort_(proxyPort), authID_(""), authPassword_(""), httpTrafficFilter_(httpTrafficFilter) {
}
-HTTPConnectProxiedConnectionFactory::HTTPConnectProxiedConnectionFactory(DomainNameResolver* resolver, ConnectionFactory* connectionFactory, TimerFactory* timerFactory, const std::string& proxyHost, int proxyPort, const SafeString& authID, const SafeString& authPassword, std::shared_ptr<HTTPTrafficFilter> httpTrafficFilter) : resolver_(resolver), connectionFactory_(connectionFactory), timerFactory_(timerFactory), proxyHost_(proxyHost), proxyPort_(proxyPort), authID_(authID), authPassword_(authPassword), httpTrafficFilter_(httpTrafficFilter) {
+HTTPConnectProxiedConnectionFactory::HTTPConnectProxiedConnectionFactory(DomainNameResolver* resolver, ConnectionFactory* connectionFactory, TimerFactory* timerFactory, const std::string& proxyHost, unsigned short proxyPort, const SafeString& authID, const SafeString& authPassword, std::shared_ptr<HTTPTrafficFilter> httpTrafficFilter) : resolver_(resolver), connectionFactory_(connectionFactory), timerFactory_(timerFactory), proxyHost_(proxyHost), proxyPort_(proxyPort), authID_(authID), authPassword_(authPassword), httpTrafficFilter_(httpTrafficFilter) {
}
std::shared_ptr<Connection> HTTPConnectProxiedConnectionFactory::createConnection() {
diff --git a/Swiften/Network/HTTPConnectProxiedConnectionFactory.h b/Swiften/Network/HTTPConnectProxiedConnectionFactory.h
index 395f64f..7a5f527 100644
--- a/Swiften/Network/HTTPConnectProxiedConnectionFactory.h
+++ b/Swiften/Network/HTTPConnectProxiedConnectionFactory.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012-2017 Isode Limited.
+ * Copyright (c) 2012-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -24,8 +24,8 @@ namespace Swift {
class SWIFTEN_API HTTPConnectProxiedConnectionFactory : public ConnectionFactory {
public:
- HTTPConnectProxiedConnectionFactory(DomainNameResolver* resolver, ConnectionFactory* connectionFactory, TimerFactory* timerFactory, const std::string& proxyHost, int proxyPort, std::shared_ptr<HTTPTrafficFilter> httpTrafficFilter = std::shared_ptr<HTTPTrafficFilter>());
- HTTPConnectProxiedConnectionFactory(DomainNameResolver* resolver, ConnectionFactory* connectionFactory, TimerFactory* timerFactory, const std::string& proxyHost, int proxyPort, const SafeString& authID, const SafeString& authPassword, std::shared_ptr<HTTPTrafficFilter> httpTrafficFilter = std::shared_ptr<HTTPTrafficFilter>());
+ HTTPConnectProxiedConnectionFactory(DomainNameResolver* resolver, ConnectionFactory* connectionFactory, TimerFactory* timerFactory, const std::string& proxyHost, unsigned short proxyPort, std::shared_ptr<HTTPTrafficFilter> httpTrafficFilter = std::shared_ptr<HTTPTrafficFilter>());
+ HTTPConnectProxiedConnectionFactory(DomainNameResolver* resolver, ConnectionFactory* connectionFactory, TimerFactory* timerFactory, const std::string& proxyHost, unsigned short proxyPort, const SafeString& authID, const SafeString& authPassword, std::shared_ptr<HTTPTrafficFilter> httpTrafficFilter = std::shared_ptr<HTTPTrafficFilter>());
virtual std::shared_ptr<Connection> createConnection();
@@ -34,7 +34,7 @@ namespace Swift {
ConnectionFactory* connectionFactory_;
TimerFactory* timerFactory_;
std::string proxyHost_;
- int proxyPort_;
+ unsigned short proxyPort_;
SafeString authID_;
SafeString authPassword_;
std::shared_ptr<HTTPTrafficFilter> httpTrafficFilter_;
diff --git a/Swiften/Network/HostAddress.cpp b/Swiften/Network/HostAddress.cpp
index 6eca80b..e82f433 100644
--- a/Swiften/Network/HostAddress.cpp
+++ b/Swiften/Network/HostAddress.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2019 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -43,7 +43,7 @@ std::string HostAddress::toString() const {
addressString = address_.to_string(errorCode);
if (errorCode) {
- SWIFT_LOG(debug) << "error: " << errorCode.message() << std::endl;
+ SWIFT_LOG(debug) << "error: " << errorCode.message();
}
return addressString;
diff --git a/Swiften/Network/HostAddress.h b/Swiften/Network/HostAddress.h
index e4ddffb..7a22cf4 100644
--- a/Swiften/Network/HostAddress.h
+++ b/Swiften/Network/HostAddress.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -27,6 +27,10 @@ namespace Swift {
return address_ == o.address_;
}
+ bool operator<(const HostAddress& o) const {
+ return address_ < o.address_;
+ }
+
bool isValid() const;
bool isLocalhost() const;
diff --git a/Swiften/Network/HostAddressPort.cpp b/Swiften/Network/HostAddressPort.cpp
index 76c276e..248be2d 100644
--- a/Swiften/Network/HostAddressPort.cpp
+++ b/Swiften/Network/HostAddressPort.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010 Isode Limited.
+ * Copyright (c) 2010-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -10,7 +10,7 @@
using namespace Swift;
-HostAddressPort::HostAddressPort(const HostAddress& address, int port) : address_(address), port_(port) {
+HostAddressPort::HostAddressPort(const HostAddress& address, unsigned short port) : address_(address), port_(port) {
}
HostAddressPort::HostAddressPort(const boost::asio::ip::tcp::endpoint& endpoint) {
@@ -21,7 +21,7 @@ HostAddressPort::HostAddressPort(const boost::asio::ip::tcp::endpoint& endpoint)
std::string HostAddressPort::toString() const {
std::string portAsString;
try {
- portAsString = boost::lexical_cast<std::string>(getPort());
+ portAsString = std::to_string(getPort());
} catch (boost::bad_lexical_cast&) {
}
return getAddress().toString() + ":" + portAsString;
diff --git a/Swiften/Network/HostAddressPort.h b/Swiften/Network/HostAddressPort.h
index e42e1d1..759af01 100644
--- a/Swiften/Network/HostAddressPort.h
+++ b/Swiften/Network/HostAddressPort.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010 Isode Limited.
+ * Copyright (c) 2010-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -14,14 +14,14 @@
namespace Swift {
class SWIFTEN_API HostAddressPort {
public:
- HostAddressPort(const HostAddress& address = HostAddress(), int port = -1);
+ HostAddressPort(const HostAddress& address = HostAddress(), unsigned short port = 0);
HostAddressPort(const boost::asio::ip::tcp::endpoint& endpoint);
const HostAddress& getAddress() const {
return address_;
}
- int getPort() const {
+ unsigned short getPort() const {
return port_;
}
@@ -29,6 +29,13 @@ namespace Swift {
return address_ == o.address_ && port_ == o.port_;
}
+ bool operator<(const HostAddressPort& o) const {
+ if (address_ < o.address_) {
+ return true;
+ }
+ return address_ == o.address_ && port_ < o.port_;
+ }
+
bool isValid() const {
return address_.isValid() && port_ > 0;
}
@@ -37,6 +44,6 @@ namespace Swift {
private:
HostAddress address_;
- int port_;
+ unsigned short port_;
};
}
diff --git a/Swiften/Network/MacOSXProxyProvider.cpp b/Swiften/Network/MacOSXProxyProvider.cpp
index 232fc60..d3b10dd 100644
--- a/Swiften/Network/MacOSXProxyProvider.cpp
+++ b/Swiften/Network/MacOSXProxyProvider.cpp
@@ -5,7 +5,7 @@
*/
/*
- * Copyright (c) 2013-2016 Isode Limited.
+ * Copyright (c) 2013-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -40,13 +40,15 @@ static HostAddressPort getFromDictionary(CFDictionaryRef dict, CFStringRef enabl
CFRelease(zero);
if(result != kCFCompareEqualTo) {
- int port = 0;
+ unsigned short port = 0;
std::string host = "";
try {
CFNumberRef numberValue = reinterpret_cast<CFNumberRef> (CFDictionaryGetValue(dict, portKey));
if(numberValue != nullptr) {
- CFNumberGetValue(numberValue, kCFNumberIntType, &port);
+ int intPort = 0;
+ CFNumberGetValue(numberValue, kCFNumberIntType, &intPort);
+ port = boost::numeric_cast<unsigned short>(intPort);
}
CFStringRef stringValue = reinterpret_cast<CFStringRef> (CFDictionaryGetValue(dict, hostKey));
diff --git a/Swiften/Network/MiniUPnPInterface.cpp b/Swiften/Network/MiniUPnPInterface.cpp
index dbe8bcd..8425c77 100644
--- a/Swiften/Network/MiniUPnPInterface.cpp
+++ b/Swiften/Network/MiniUPnPInterface.cpp
@@ -5,7 +5,7 @@
*/
/*
- * Copyright (c) 2015-2016 Isode Limited.
+ * Copyright (c) 2015-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -14,8 +14,6 @@
#include <memory>
-#include <boost/lexical_cast.hpp>
-
#include <miniupnpc.h>
#include <upnpcommands.h>
#include <upnperrors.h>
@@ -73,16 +71,16 @@ boost::optional<HostAddress> MiniUPnPInterface::getPublicIP() {
}
}
-boost::optional<NATPortMapping> MiniUPnPInterface::addPortForward(int actualLocalPort, int actualPublicPort) {
+boost::optional<NATPortMapping> MiniUPnPInterface::addPortForward(unsigned short actualLocalPort, unsigned short actualPublicPort) {
if (!p->isValid) {
return boost::optional<NATPortMapping>();
}
NATPortMapping mapping(actualLocalPort, actualPublicPort, NATPortMapping::TCP);
- std::string publicPort = boost::lexical_cast<std::string>(mapping.getPublicPort());
- std::string localPort = boost::lexical_cast<std::string>(mapping.getLocalPort());
- std::string leaseSeconds = boost::lexical_cast<std::string>(mapping.getLeaseInSeconds());
+ std::string publicPort = std::to_string(mapping.getPublicPort());
+ std::string localPort = std::to_string(mapping.getLocalPort());
+ std::string leaseSeconds = std::to_string(mapping.getLeaseInSeconds());
int ret = UPNP_AddPortMapping(
p->urls.controlURL,
@@ -107,9 +105,9 @@ bool MiniUPnPInterface::removePortForward(const NATPortMapping& mapping) {
return false;
}
- std::string publicPort = boost::lexical_cast<std::string>(mapping.getPublicPort());
- std::string localPort = boost::lexical_cast<std::string>(mapping.getLocalPort());
- std::string leaseSeconds = boost::lexical_cast<std::string>(mapping.getLeaseInSeconds());
+ std::string publicPort = std::to_string(mapping.getPublicPort());
+ std::string localPort = std::to_string(mapping.getLocalPort());
+ std::string leaseSeconds = std::to_string(mapping.getLeaseInSeconds());
int ret = UPNP_DeletePortMapping(p->urls.controlURL, p->data.first.servicetype, publicPort.c_str(), mapping.getProtocol() == NATPortMapping::TCP ? "TCP" : "UDP", nullptr);
return ret == UPNPCOMMAND_SUCCESS;
diff --git a/Swiften/Network/MiniUPnPInterface.h b/Swiften/Network/MiniUPnPInterface.h
index 89457b8..8c68268 100644
--- a/Swiften/Network/MiniUPnPInterface.h
+++ b/Swiften/Network/MiniUPnPInterface.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2011-2016 Isode Limited.
+ * Copyright (c) 2011-2018 Isode Limited.
* Licensed under the simplified BSD license.
* See Documentation/Licenses/BSD-simplified.txt for more information.
*/
@@ -23,7 +23,7 @@ namespace Swift {
virtual bool isAvailable();
boost::optional<HostAddress> getPublicIP();
- boost::optional<NATPortMapping> addPortForward(int localPort, int publicPort);
+ boost::optional<NATPortMapping> addPortForward(unsigned short localPort, unsigned short publicPort);
bool removePortForward(const NATPortMapping&);
private:
diff --git a/Swiften/Network/NATPMPInterface.cpp b/Swiften/Network/NATPMPInterface.cpp
index 5e0b3b3..e20fecd 100644
--- a/Swiften/Network/NATPMPInterface.cpp
+++ b/Swiften/Network/NATPMPInterface.cpp
@@ -5,7 +5,7 @@
*/
/*
- * Copyright (c) 2014-2016 Isode Limited.
+ * Copyright (c) 2014-2019 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -14,8 +14,6 @@
#include <memory>
-#include <boost/numeric/conversion/cast.hpp>
-
#include <Swiften/Base/Log.h>
// This has to be included after the previous headers, because of WIN32 macro
@@ -44,7 +42,7 @@ bool NATPMPInterface::isAvailable() {
boost::optional<HostAddress> NATPMPInterface::getPublicIP() {
if (sendpublicaddressrequest(&p->natpmp) < 0) {
- SWIFT_LOG(debug) << "Failed to send NAT-PMP public address request!" << std::endl;
+ SWIFT_LOG(debug) << "Failed to send NAT-PMP public address request!";
return boost::optional<HostAddress>();
}
@@ -69,20 +67,20 @@ boost::optional<HostAddress> NATPMPInterface::getPublicIP() {
return boost::optional<HostAddress>(HostAddress(reinterpret_cast<const unsigned char*>(&(response.pnu.publicaddress.addr)), 4));
}
else {
- SWIFT_LOG(debug) << "Inavlid NAT-PMP response." << std::endl;
+ SWIFT_LOG(debug) << "Inavlid NAT-PMP response.";
return boost::optional<HostAddress>();
}
}
-boost::optional<NATPortMapping> NATPMPInterface::addPortForward(int localPort, int publicPort) {
+boost::optional<NATPortMapping> NATPMPInterface::addPortForward(unsigned short localPort, unsigned short publicPort) {
NATPortMapping mapping(localPort, publicPort, NATPortMapping::TCP);
if (sendnewportmappingrequest(
&p->natpmp,
mapping.getProtocol() == NATPortMapping::TCP ? NATPMP_PROTOCOL_TCP : NATPMP_PROTOCOL_UDP,
- boost::numeric_cast<uint16_t>(mapping.getLocalPort()),
- boost::numeric_cast<uint16_t>(mapping.getPublicPort()),
- boost::numeric_cast<uint32_t>(mapping.getLeaseInSeconds())) < 0) {
- SWIFT_LOG(debug) << "Failed to send NAT-PMP port forwarding request!" << std::endl;
+ mapping.getLocalPort(),
+ mapping.getPublicPort(),
+ mapping.getLeaseInSeconds()) < 0) {
+ SWIFT_LOG(debug) << "Failed to send NAT-PMP port forwarding request!";
return boost::optional<NATPortMapping>();
}
@@ -104,18 +102,18 @@ boost::optional<NATPortMapping> NATPMPInterface::addPortForward(int localPort, i
} while(false /*r == NATPMP_TRYAGAIN*/);
if (r == 0) {
- NATPortMapping result(response.pnu.newportmapping.privateport, response.pnu.newportmapping.mappedpublicport, NATPortMapping::TCP, boost::numeric_cast<int>(response.pnu.newportmapping.lifetime));
+ NATPortMapping result(response.pnu.newportmapping.privateport, response.pnu.newportmapping.mappedpublicport, NATPortMapping::TCP, response.pnu.newportmapping.lifetime);
return result;
}
else {
- SWIFT_LOG(debug) << "Invalid NAT-PMP response." << std::endl;
+ SWIFT_LOG(debug) << "Invalid NAT-PMP response.";
return boost::optional<NATPortMapping>();
}
}
bool NATPMPInterface::removePortForward(const NATPortMapping& mapping) {
- if (sendnewportmappingrequest(&p->natpmp, mapping.getProtocol() == NATPortMapping::TCP ? NATPMP_PROTOCOL_TCP : NATPMP_PROTOCOL_UDP, 0, 0, boost::numeric_cast<uint32_t>(mapping.getLocalPort())) < 0) {
- SWIFT_LOG(debug) << "Failed to send NAT-PMP remove forwarding request!" << std::endl;
+ if (sendnewportmappingrequest(&p->natpmp, mapping.getProtocol() == NATPortMapping::TCP ? NATPMP_PROTOCOL_TCP : NATPMP_PROTOCOL_UDP, mapping.getLocalPort(), 0, 0) < 0) {
+ SWIFT_LOG(debug) << "Failed to send NAT-PMP remove forwarding request!";
return false;
}
@@ -135,7 +133,7 @@ bool NATPMPInterface::removePortForward(const NATPortMapping& mapping) {
return true;
}
else {
- SWIFT_LOG(debug) << "Invalid NAT-PMP response." << std::endl;
+ SWIFT_LOG(debug) << "Invalid NAT-PMP response.";
return false;
}
}
diff --git a/Swiften/Network/NATPMPInterface.h b/Swiften/Network/NATPMPInterface.h
index e1666c8..58d62b6 100644
--- a/Swiften/Network/NATPMPInterface.h
+++ b/Swiften/Network/NATPMPInterface.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2011-2016 Isode Limited.
+ * Copyright (c) 2011-2018 Isode Limited.
* Licensed under the simplified BSD license.
* See Documentation/Licenses/BSD-simplified.txt for more information.
*/
@@ -23,7 +23,7 @@ namespace Swift {
virtual bool isAvailable();
virtual boost::optional<HostAddress> getPublicIP();
- virtual boost::optional<NATPortMapping> addPortForward(int localPort, int publicPort);
+ virtual boost::optional<NATPortMapping> addPortForward(unsigned short localPort, unsigned short publicPort);
virtual bool removePortForward(const NATPortMapping&);
private:
diff --git a/Swiften/Network/NATPortMapping.h b/Swiften/Network/NATPortMapping.h
index ff8fde3..bf0fb1c 100644
--- a/Swiften/Network/NATPortMapping.h
+++ b/Swiften/Network/NATPortMapping.h
@@ -5,7 +5,7 @@
*/
/*
- * Copyright (c) 2015 Isode Limited.
+ * Copyright (c) 2015-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -23,16 +23,16 @@ namespace Swift {
UDP
};
- NATPortMapping(int localPort, int publicPort, Protocol protocol = TCP, int leaseInSeconds = 60 * 60 * 24) :
+ NATPortMapping(unsigned short localPort, unsigned short publicPort, Protocol protocol = TCP, uint32_t leaseInSeconds = 60 * 60 * 24) :
publicPort(publicPort), localPort(localPort), protocol(protocol), leaseInSeconds(leaseInSeconds) {
}
- int getPublicPort() const {
+ unsigned short getPublicPort() const {
return publicPort;
}
- int getLocalPort() const {
+ unsigned short getLocalPort() const {
return localPort;
}
@@ -40,14 +40,14 @@ namespace Swift {
return protocol;
}
- int getLeaseInSeconds() const {
+ uint32_t getLeaseInSeconds() const {
return leaseInSeconds;
}
private:
- int publicPort;
- int localPort;
+ unsigned short publicPort;
+ unsigned short localPort;
Protocol protocol;
- int leaseInSeconds;
+ uint32_t leaseInSeconds;
};
}
diff --git a/Swiften/Network/NATTraversalInterface.h b/Swiften/Network/NATTraversalInterface.h
index ea9ed6a..1655eb6 100644
--- a/Swiften/Network/NATTraversalInterface.h
+++ b/Swiften/Network/NATTraversalInterface.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2011-2015 Isode Limited.
+ * Copyright (c) 2011-2018 Isode Limited.
* Licensed under the simplified BSD license.
* See Documentation/Licenses/BSD-simplified.txt for more information.
*/
@@ -19,7 +19,7 @@ namespace Swift {
virtual bool isAvailable() = 0;
virtual boost::optional<HostAddress> getPublicIP() = 0;
- virtual boost::optional<NATPortMapping> addPortForward(int localPort, int publicPort) = 0;
+ virtual boost::optional<NATPortMapping> addPortForward(unsigned short localPort, unsigned short publicPort) = 0;
virtual bool removePortForward(const NATPortMapping&) = 0;
};
}
diff --git a/Swiften/Network/NATTraversalRemovePortForwardingRequest.h b/Swiften/Network/NATTraversalRemovePortForwardingRequest.h
index 3db9ee1..83235f9 100644
--- a/Swiften/Network/NATTraversalRemovePortForwardingRequest.h
+++ b/Swiften/Network/NATTraversalRemovePortForwardingRequest.h
@@ -5,7 +5,7 @@
*/
/*
- * Copyright (c) 2015-2016 Isode Limited.
+ * Copyright (c) 2015-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -26,8 +26,8 @@ namespace Swift {
UDP
};
- unsigned int publicPort;
- unsigned int localPort;
+ unsigned short publicPort;
+ unsigned short localPort;
Protocol protocol;
unsigned long leaseInSeconds;
};
diff --git a/Swiften/Network/NATTraverser.h b/Swiften/Network/NATTraverser.h
index 716bfcb..7f03c03 100644
--- a/Swiften/Network/NATTraverser.h
+++ b/Swiften/Network/NATTraverser.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2011-2016 Isode Limited.
+ * Copyright (c) 2011-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -20,7 +20,7 @@ namespace Swift {
virtual ~NATTraverser();
virtual std::shared_ptr<NATTraversalGetPublicIPRequest> createGetPublicIPRequest() = 0;
- virtual std::shared_ptr<NATTraversalForwardPortRequest> createForwardPortRequest(int localPort, int publicPort) = 0;
- virtual std::shared_ptr<NATTraversalRemovePortForwardingRequest> createRemovePortForwardingRequest(int localPort, int publicPort) = 0;
+ virtual std::shared_ptr<NATTraversalForwardPortRequest> createForwardPortRequest(unsigned short localPort, unsigned short publicPort) = 0;
+ virtual std::shared_ptr<NATTraversalRemovePortForwardingRequest> createRemovePortForwardingRequest(unsigned short localPort, unsigned short publicPort) = 0;
};
}
diff --git a/Swiften/Network/NullNATTraversalInterface.h b/Swiften/Network/NullNATTraversalInterface.h
index ecbf110..eabc197 100644
--- a/Swiften/Network/NullNATTraversalInterface.h
+++ b/Swiften/Network/NullNATTraversalInterface.h
@@ -21,7 +21,7 @@ namespace Swift {
return boost::optional<HostAddress>();
}
- virtual boost::optional<NATPortMapping> addPortForward(int, int) {
+ virtual boost::optional<NATPortMapping> addPortForward(unsigned short, unsigned short) {
return boost::optional<NATPortMapping>();
}
diff --git a/Swiften/Network/NullNATTraverser.cpp b/Swiften/Network/NullNATTraverser.cpp
index cc8bae0..0b9464e 100644
--- a/Swiften/Network/NullNATTraverser.cpp
+++ b/Swiften/Network/NullNATTraverser.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2011-2016 Isode Limited.
+ * Copyright (c) 2011-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -72,11 +72,11 @@ std::shared_ptr<NATTraversalGetPublicIPRequest> NullNATTraverser::createGetPubli
return std::make_shared<NullNATTraversalGetPublicIPRequest>(eventLoop);
}
-std::shared_ptr<NATTraversalForwardPortRequest> NullNATTraverser::createForwardPortRequest(int, int) {
+std::shared_ptr<NATTraversalForwardPortRequest> NullNATTraverser::createForwardPortRequest(unsigned short, unsigned short) {
return std::make_shared<NullNATTraversalForwardPortRequest>(eventLoop);
}
-std::shared_ptr<NATTraversalRemovePortForwardingRequest> NullNATTraverser::createRemovePortForwardingRequest(int, int) {
+std::shared_ptr<NATTraversalRemovePortForwardingRequest> NullNATTraverser::createRemovePortForwardingRequest(unsigned short, unsigned short) {
return std::make_shared<NullNATTraversalRemovePortForwardingRequest>(eventLoop);
}
diff --git a/Swiften/Network/NullNATTraverser.h b/Swiften/Network/NullNATTraverser.h
index d3a6640..2f975bf 100644
--- a/Swiften/Network/NullNATTraverser.h
+++ b/Swiften/Network/NullNATTraverser.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2011-2016 Isode Limited.
+ * Copyright (c) 2011-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -16,8 +16,8 @@ namespace Swift {
NullNATTraverser(EventLoop* eventLoop);
std::shared_ptr<NATTraversalGetPublicIPRequest> createGetPublicIPRequest();
- std::shared_ptr<NATTraversalForwardPortRequest> createForwardPortRequest(int localPort, int publicPort);
- std::shared_ptr<NATTraversalRemovePortForwardingRequest> createRemovePortForwardingRequest(int localPort, int publicPort);
+ std::shared_ptr<NATTraversalForwardPortRequest> createForwardPortRequest(unsigned short localPort, unsigned short publicPort);
+ std::shared_ptr<NATTraversalRemovePortForwardingRequest> createRemovePortForwardingRequest(unsigned short localPort, unsigned short publicPort);
private:
EventLoop* eventLoop;
diff --git a/Swiften/Network/PlatformDomainNameServiceQuery.cpp b/Swiften/Network/PlatformDomainNameServiceQuery.cpp
index a5d180b..2ff14e1 100644
--- a/Swiften/Network/PlatformDomainNameServiceQuery.cpp
+++ b/Swiften/Network/PlatformDomainNameServiceQuery.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2019 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -58,7 +58,7 @@ void PlatformDomainNameServiceQuery::runBlocking() {
return;
}
- SWIFT_LOG(debug) << "Querying " << service << std::endl;
+ SWIFT_LOG(debug) << "Querying " << service;
std::vector<DomainNameServiceQuery::Result> records;
@@ -97,7 +97,7 @@ void PlatformDomainNameServiceQuery::runBlocking() {
response.resize(NS_PACKETSZ);
int responseLength = res_query(const_cast<char*>(service.c_str()), ns_c_in, ns_t_srv, reinterpret_cast<u_char*>(vecptr(response)), response.size());
if (responseLength == -1) {
- SWIFT_LOG(debug) << "Error" << std::endl;
+ SWIFT_LOG(debug) << "Error";
emitError();
return;
}
@@ -129,35 +129,42 @@ void PlatformDomainNameServiceQuery::runBlocking() {
currentEntry += entryLength;
currentEntry += NS_RRFIXEDSZ;
- // Priority
- if (currentEntry + 2 >= messageEnd) {
- emitError();
- return;
- }
- record.priority = boost::numeric_cast<int>(ns_get16(currentEntry));
- currentEntry += 2;
-
- // Weight
- if (currentEntry + 2 >= messageEnd) {
- emitError();
- return;
+ try {
+ // Priority
+ if (currentEntry + 2 >= messageEnd) {
+ emitError();
+ return;
+ }
+ record.priority = boost::numeric_cast<int>(ns_get16(currentEntry));
+ currentEntry += 2;
+
+ // Weight
+ if (currentEntry + 2 >= messageEnd) {
+ emitError();
+ return;
+ }
+ record.weight = boost::numeric_cast<int>(ns_get16(currentEntry));
+ currentEntry += 2;
+
+ // Port
+ if (currentEntry + 2 >= messageEnd) {
+ emitError();
+ return;
+ }
+ record.port = boost::numeric_cast<unsigned short>(ns_get16(currentEntry));
+ currentEntry += 2;
+
+ // Hostname
+ if (currentEntry >= messageEnd) {
+ emitError();
+ return;
+ }
}
- record.weight = boost::numeric_cast<int>(ns_get16(currentEntry));
- currentEntry += 2;
-
- // Port
- if (currentEntry + 2 >= messageEnd) {
+ catch (const boost::numeric::bad_numeric_cast&) {
emitError();
return;
}
- record.port = boost::numeric_cast<int>(ns_get16(currentEntry));
- currentEntry += 2;
- // Hostname
- if (currentEntry >= messageEnd) {
- emitError();
- return;
- }
ByteArray entry;
entry.resize(NS_MAXDNAME);
entryLength = dn_expand(messageStart, messageEnd, currentEntry, reinterpret_cast<char*>(vecptr(entry)), entry.size());
diff --git a/Swiften/Network/PlatformNATTraversalWorker.cpp b/Swiften/Network/PlatformNATTraversalWorker.cpp
index f56de0b..5431379 100644
--- a/Swiften/Network/PlatformNATTraversalWorker.cpp
+++ b/Swiften/Network/PlatformNATTraversalWorker.cpp
@@ -84,7 +84,7 @@ class PlatformNATTraversalGetPublicIPRequest : public NATTraversalGetPublicIPReq
class PlatformNATTraversalForwardPortRequest : public NATTraversalForwardPortRequest, public PlatformNATTraversalRequest {
public:
- PlatformNATTraversalForwardPortRequest(PlatformNATTraversalWorker* worker, unsigned int localIP, unsigned int publicIP) : PlatformNATTraversalRequest(worker), localIP(localIP), publicIP(publicIP) {
+ PlatformNATTraversalForwardPortRequest(PlatformNATTraversalWorker* worker, unsigned short localPort, unsigned short publicPort) : PlatformNATTraversalRequest(worker), localPort(localPort), publicPort(publicPort) {
}
virtual ~PlatformNATTraversalForwardPortRequest() {
@@ -99,12 +99,12 @@ class PlatformNATTraversalForwardPortRequest : public NATTraversalForwardPortReq
}
virtual void runBlocking() {
- getEventLoop()->postEvent(boost::bind(boost::ref(onResult), getNATTraversalInterface()->addPortForward(boost::numeric_cast<int>(localIP), boost::numeric_cast<int>(publicIP))), shared_from_this());
+ getEventLoop()->postEvent(boost::bind(boost::ref(onResult), getNATTraversalInterface()->addPortForward(localPort, publicPort)), shared_from_this());
}
private:
- unsigned int localIP;
- unsigned int publicIP;
+ unsigned short localPort;
+ unsigned short publicPort;
};
class PlatformNATTraversalRemovePortForwardingRequest : public NATTraversalRemovePortForwardingRequest, public PlatformNATTraversalRequest {
@@ -157,7 +157,7 @@ NATTraversalInterface* PlatformNATTraversalWorker::getNATTraversalInterface() co
miniUPnPInterface = new MiniUPnPInterface();
miniUPnPSupported = miniUPnPInterface->isAvailable();
}
- SWIFT_LOG(debug) << "UPnP NAT traversal supported: " << miniUPnPSupported << std::endl;
+ SWIFT_LOG(debug) << "UPnP NAT traversal supported: " << static_cast<bool>(miniUPnPSupported);
if (miniUPnPSupported) {
return miniUPnPInterface;
}
@@ -168,7 +168,7 @@ NATTraversalInterface* PlatformNATTraversalWorker::getNATTraversalInterface() co
natPMPInterface = new NATPMPInterface();
natPMPSupported = natPMPInterface->isAvailable();
}
- SWIFT_LOG(debug) << "NAT-PMP NAT traversal supported: " << natPMPSupported << std::endl;
+ SWIFT_LOG(debug) << "NAT-PMP NAT traversal supported: " << static_cast<bool>(natPMPSupported);
if (natPMPSupported) {
return natPMPInterface;
}
@@ -181,11 +181,11 @@ std::shared_ptr<NATTraversalGetPublicIPRequest> PlatformNATTraversalWorker::crea
return std::make_shared<PlatformNATTraversalGetPublicIPRequest>(this);
}
-std::shared_ptr<NATTraversalForwardPortRequest> PlatformNATTraversalWorker::createForwardPortRequest(int localPort, int publicPort) {
+std::shared_ptr<NATTraversalForwardPortRequest> PlatformNATTraversalWorker::createForwardPortRequest(unsigned short localPort, unsigned short publicPort) {
return std::make_shared<PlatformNATTraversalForwardPortRequest>(this, localPort, publicPort);
}
-std::shared_ptr<NATTraversalRemovePortForwardingRequest> PlatformNATTraversalWorker::createRemovePortForwardingRequest(int localPort, int publicPort) {
+std::shared_ptr<NATTraversalRemovePortForwardingRequest> PlatformNATTraversalWorker::createRemovePortForwardingRequest(unsigned short localPort, unsigned short publicPort) {
NATPortMapping mapping(localPort, publicPort, NATPortMapping::TCP); // FIXME
return std::make_shared<PlatformNATTraversalRemovePortForwardingRequest>(this, mapping);
}
diff --git a/Swiften/Network/PlatformNATTraversalWorker.h b/Swiften/Network/PlatformNATTraversalWorker.h
index aee1052..368798e 100644
--- a/Swiften/Network/PlatformNATTraversalWorker.h
+++ b/Swiften/Network/PlatformNATTraversalWorker.h
@@ -5,7 +5,7 @@
*/
/*
- * Copyright (c) 2016-2017 Isode Limited.
+ * Copyright (c) 2016-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -44,8 +44,8 @@ namespace Swift {
virtual ~PlatformNATTraversalWorker();
std::shared_ptr<NATTraversalGetPublicIPRequest> createGetPublicIPRequest();
- std::shared_ptr<NATTraversalForwardPortRequest> createForwardPortRequest(int localPort, int publicPort);
- std::shared_ptr<NATTraversalRemovePortForwardingRequest> createRemovePortForwardingRequest(int localPort, int publicPort);
+ std::shared_ptr<NATTraversalForwardPortRequest> createForwardPortRequest(unsigned short localPort, unsigned short publicPort);
+ std::shared_ptr<NATTraversalRemovePortForwardingRequest> createRemovePortForwardingRequest(unsigned short localPort, unsigned short publicPort);
private:
NATTraversalInterface* getNATTraversalInterface() const;
diff --git a/Swiften/Network/ProxiedConnection.cpp b/Swiften/Network/ProxiedConnection.cpp
index aa6c4d2..0c5cda6 100644
--- a/Swiften/Network/ProxiedConnection.cpp
+++ b/Swiften/Network/ProxiedConnection.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012-2016 Isode Limited.
+ * Copyright (c) 2012-2019 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -20,7 +20,7 @@ ProxiedConnection::ProxiedConnection(
ConnectionFactory* connectionFactory,
TimerFactory* timerFactory,
const std::string& proxyHost,
- int proxyPort) :
+ unsigned short proxyPort) :
resolver_(resolver),
connectionFactory_(connectionFactory),
timerFactory_(timerFactory),
@@ -37,7 +37,7 @@ ProxiedConnection::~ProxiedConnection() {
connection_->onDisconnected.disconnect(boost::bind(&ProxiedConnection::handleDisconnected, shared_from_this(), _1));
}
if (connected_) {
- SWIFT_LOG(warning) << "Connection was still established." << std::endl;
+ SWIFT_LOG(warning) << "Connection was still established.";
}
}
diff --git a/Swiften/Network/ProxiedConnection.h b/Swiften/Network/ProxiedConnection.h
index 440fb86..f79845a 100644
--- a/Swiften/Network/ProxiedConnection.h
+++ b/Swiften/Network/ProxiedConnection.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012-2017 Isode Limited.
+ * Copyright (c) 2012-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -20,7 +20,7 @@ namespace Swift {
class SWIFTEN_API ProxiedConnection : public Connection, public std::enable_shared_from_this<ProxiedConnection> {
public:
- ProxiedConnection(DomainNameResolver* resolver, ConnectionFactory* connectionFactory, TimerFactory* timerFactory, const std::string& proxyHost, int proxyPort);
+ ProxiedConnection(DomainNameResolver* resolver, ConnectionFactory* connectionFactory, TimerFactory* timerFactory, const std::string& proxyHost, unsigned short proxyPort);
virtual ~ProxiedConnection();
virtual void listen();
@@ -55,7 +55,7 @@ namespace Swift {
ConnectionFactory* connectionFactory_;
TimerFactory* timerFactory_;
std::string proxyHost_;
- int proxyPort_;
+ unsigned short proxyPort_;
HostAddressPort server_;
Connector::ref connector_;
std::shared_ptr<Connection> connection_;
diff --git a/Swiften/Network/SOCKS5ProxiedConnection.cpp b/Swiften/Network/SOCKS5ProxiedConnection.cpp
index 2492827..c76b6e6 100644
--- a/Swiften/Network/SOCKS5ProxiedConnection.cpp
+++ b/Swiften/Network/SOCKS5ProxiedConnection.cpp
@@ -5,7 +5,7 @@
*/
/*
- * Copyright (c) 2014-2016 Isode Limited.
+ * Copyright (c) 2014-2019 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -27,7 +27,7 @@ SOCKS5ProxiedConnection::SOCKS5ProxiedConnection(
ConnectionFactory* connectionFactory,
TimerFactory* timerFactory,
const std::string& proxyHost,
- int proxyPort) :
+ unsigned short proxyPort) :
ProxiedConnection(resolver, connectionFactory, timerFactory, proxyHost, proxyPort),
proxyState_(Initial) {
}
@@ -50,7 +50,7 @@ void SOCKS5ProxiedConnection::handleProxyInitializeData(std::shared_ptr<SafeByte
assert(rawAddress.is_v4() || rawAddress.is_v6());
if (proxyState_ == ProxyAuthenticating) {
- SWIFT_LOG(debug) << "ProxyAuthenticating response received, reply with the connect BYTEs" << std::endl;
+ SWIFT_LOG(debug) << "ProxyAuthenticating response received, reply with the connect BYTEs";
unsigned char choosenMethod = static_cast<unsigned char> ((*data)[1]);
if ((*data)[0] == 0x05 && choosenMethod != 0xFF) {
switch(choosenMethod) { // use the correct Method
@@ -79,7 +79,7 @@ void SOCKS5ProxiedConnection::handleProxyInitializeData(std::shared_ptr<SafeByte
return;
}
catch(...) {
- SWIFT_LOG(error) << "exception caught" << std::endl;
+ SWIFT_LOG(error) << "exception caught";
}
write(socksConnect);
break;
@@ -92,8 +92,8 @@ void SOCKS5ProxiedConnection::handleProxyInitializeData(std::shared_ptr<SafeByte
setProxyInitializeFinished(false);
}
else if (proxyState_ == ProxyConnecting) {
- SWIFT_LOG(debug) << "Connect response received, check if successfully." << std::endl;
- SWIFT_LOG(debug) << "Errorbyte: 0x" << std::hex << static_cast<int> ((*data)[1]) << std::dec << std::endl;
+ SWIFT_LOG(debug) << "Connect response received, check if successfully.";
+ SWIFT_LOG(debug) << "Errorbyte: 0x" << std::hex << static_cast<int> ((*data)[1]) << std::dec;
/*
data.at(1) can be one of the following:
@@ -109,11 +109,11 @@ void SOCKS5ProxiedConnection::handleProxyInitializeData(std::shared_ptr<SafeByte
0x09 bis 0xFF unassigned
*/
if ((*data)[0] == 0x05 && (*data)[1] == 0x0) {
- SWIFT_LOG(debug) << "Successfully connected the server via the proxy." << std::endl;
+ SWIFT_LOG(debug) << "Successfully connected the server via the proxy.";
setProxyInitializeFinished(true);
}
else {
- SWIFT_LOG(error) << "SOCKS Proxy returned an error: " << std::hex << (*data)[1] << std::endl;
+ SWIFT_LOG(error) << "SOCKS Proxy returned an error: " << std::hex << (*data)[1];
setProxyInitializeFinished(false);
}
}
diff --git a/Swiften/Network/SOCKS5ProxiedConnection.h b/Swiften/Network/SOCKS5ProxiedConnection.h
index c8faae9..515c5b7 100644
--- a/Swiften/Network/SOCKS5ProxiedConnection.h
+++ b/Swiften/Network/SOCKS5ProxiedConnection.h
@@ -5,7 +5,7 @@
*/
/*
- * Copyright (c) 2015-2016 Isode Limited.
+ * Copyright (c) 2015-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -24,12 +24,12 @@ namespace Swift {
public:
typedef std::shared_ptr<SOCKS5ProxiedConnection> ref;
- static ref create(DomainNameResolver* resolver, ConnectionFactory* connectionFactory, TimerFactory* timerFactory, const std::string& proxyHost, int proxyPort) {
+ static ref create(DomainNameResolver* resolver, ConnectionFactory* connectionFactory, TimerFactory* timerFactory, const std::string& proxyHost, unsigned short proxyPort) {
return ref(new SOCKS5ProxiedConnection(resolver, connectionFactory, timerFactory, proxyHost, proxyPort));
}
private:
- SOCKS5ProxiedConnection(DomainNameResolver* resolver, ConnectionFactory* connectionFactory, TimerFactory* timerFactory, const std::string& proxyHost, int proxyPort);
+ SOCKS5ProxiedConnection(DomainNameResolver* resolver, ConnectionFactory* connectionFactory, TimerFactory* timerFactory, const std::string& proxyHost, unsigned short proxyPort);
virtual void initializeProxy();
virtual void handleProxyInitializeData(std::shared_ptr<SafeByteArray> data);
diff --git a/Swiften/Network/SOCKS5ProxiedConnectionFactory.cpp b/Swiften/Network/SOCKS5ProxiedConnectionFactory.cpp
index 01ce8ac..abd7718 100644
--- a/Swiften/Network/SOCKS5ProxiedConnectionFactory.cpp
+++ b/Swiften/Network/SOCKS5ProxiedConnectionFactory.cpp
@@ -16,7 +16,7 @@
namespace Swift {
-SOCKS5ProxiedConnectionFactory::SOCKS5ProxiedConnectionFactory(DomainNameResolver* resolver, ConnectionFactory* connectionFactory, TimerFactory* timerFactory, const std::string& proxyHost, int proxyPort) : resolver_(resolver), connectionFactory_(connectionFactory), timerFactory_(timerFactory), proxyHost_(proxyHost), proxyPort_(proxyPort) {
+SOCKS5ProxiedConnectionFactory::SOCKS5ProxiedConnectionFactory(DomainNameResolver* resolver, ConnectionFactory* connectionFactory, TimerFactory* timerFactory, const std::string& proxyHost, unsigned short proxyPort) : resolver_(resolver), connectionFactory_(connectionFactory), timerFactory_(timerFactory), proxyHost_(proxyHost), proxyPort_(proxyPort) {
}
std::shared_ptr<Connection> SOCKS5ProxiedConnectionFactory::createConnection() {
diff --git a/Swiften/Network/SOCKS5ProxiedConnectionFactory.h b/Swiften/Network/SOCKS5ProxiedConnectionFactory.h
index 8631239..47ae9a3 100644
--- a/Swiften/Network/SOCKS5ProxiedConnectionFactory.h
+++ b/Swiften/Network/SOCKS5ProxiedConnectionFactory.h
@@ -5,7 +5,7 @@
*/
/*
- * Copyright (c) 2015-2016 Isode Limited.
+ * Copyright (c) 2015-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -23,7 +23,7 @@ namespace Swift {
class SWIFTEN_API SOCKS5ProxiedConnectionFactory : public ConnectionFactory {
public:
- SOCKS5ProxiedConnectionFactory(DomainNameResolver* resolver, ConnectionFactory* connectionFactory, TimerFactory* timerFactory, const std::string& proxyHost, int proxyPort);
+ SOCKS5ProxiedConnectionFactory(DomainNameResolver* resolver, ConnectionFactory* connectionFactory, TimerFactory* timerFactory, const std::string& proxyHost, unsigned short proxyPort);
virtual std::shared_ptr<Connection> createConnection();
@@ -32,6 +32,6 @@ namespace Swift {
ConnectionFactory* connectionFactory_;
TimerFactory* timerFactory_;
std::string proxyHost_;
- int proxyPort_;
+ unsigned short proxyPort_;
};
}
diff --git a/Swiften/Network/StaticDomainNameResolver.cpp b/Swiften/Network/StaticDomainNameResolver.cpp
index 95b3dd9..eca6687 100644
--- a/Swiften/Network/StaticDomainNameResolver.cpp
+++ b/Swiften/Network/StaticDomainNameResolver.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -50,6 +50,10 @@ namespace {
if (!resolver->getIsResponsive()) {
return;
}
+ if (auto address = HostAddress::fromString(host)) {
+ // IP Literals should resolve to themselves
+ resolver->addAddress(host, *address);
+ }
StaticDomainNameResolver::AddressesMap::const_iterator i = resolver->getAddresses().find(host);
if (i != resolver->getAddresses().end()) {
eventLoop->postEvent(
@@ -98,14 +102,14 @@ void StaticDomainNameResolver::addService(const std::string& service, const Doma
void StaticDomainNameResolver::addXMPPClientService(const std::string& domain, const HostAddressPort& address) {
static int hostid = 0;
- std::string hostname(std::string("host-") + boost::lexical_cast<std::string>(hostid));
+ std::string hostname(std::string("host-") + std::to_string(hostid));
hostid++;
addService("_xmpp-client._tcp." + domain, ServiceQuery::Result(hostname, address.getPort(), 0, 0));
addAddress(hostname, address.getAddress());
}
-void StaticDomainNameResolver::addXMPPClientService(const std::string& domain, const std::string& hostname, int port) {
+void StaticDomainNameResolver::addXMPPClientService(const std::string& domain, const std::string& hostname, unsigned short port) {
addService("_xmpp-client._tcp." + domain, ServiceQuery::Result(hostname, port, 0, 0));
}
diff --git a/Swiften/Network/StaticDomainNameResolver.h b/Swiften/Network/StaticDomainNameResolver.h
index 76394d0..2064046 100644
--- a/Swiften/Network/StaticDomainNameResolver.h
+++ b/Swiften/Network/StaticDomainNameResolver.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -31,7 +31,7 @@ namespace Swift {
void addAddress(const std::string& domain, const HostAddress& address);
void addService(const std::string& service, const DomainNameServiceQuery::Result& result);
void addXMPPClientService(const std::string& domain, const HostAddressPort&);
- void addXMPPClientService(const std::string& domain, const std::string& host, int port);
+ void addXMPPClientService(const std::string& domain, const std::string& host, unsigned short port);
const AddressesMap& getAddresses() const {
return addresses;
diff --git a/Swiften/Network/TLSConnection.cpp b/Swiften/Network/TLSConnection.cpp
index 7c293d1..82bf114 100644
--- a/Swiften/Network/TLSConnection.cpp
+++ b/Swiften/Network/TLSConnection.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2011-2016 Isode Limited.
+ * Copyright (c) 2011-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -32,7 +32,6 @@ TLSConnection::~TLSConnection() {
connection->onDataRead.disconnect(boost::bind(&TLSConnection::handleRawDataRead, this, _1));
connection->onDataWritten.disconnect(boost::bind(&TLSConnection::handleRawDataWritten, this));
connection->onDisconnected.disconnect(boost::bind(&TLSConnection::handleRawDisconnected, this, _1));
- delete context;
}
void TLSConnection::handleTLSConnectFinished(bool error) {
@@ -71,7 +70,7 @@ HostAddressPort TLSConnection::getRemoteAddress() const {
}
TLSContext* TLSConnection::getTLSContext() const {
- return context;
+ return context.get();
}
void TLSConnection::handleRawConnectFinished(bool error) {
diff --git a/Swiften/Network/TLSConnection.h b/Swiften/Network/TLSConnection.h
index 0c395d1..1ab1ec6 100644
--- a/Swiften/Network/TLSConnection.h
+++ b/Swiften/Network/TLSConnection.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2011-2016 Isode Limited.
+ * Copyright (c) 2011-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -46,7 +46,7 @@ namespace Swift {
void handleTLSDataForApplication(const SafeByteArray& data);
private:
- TLSContext* context;
+ std::unique_ptr<TLSContext> context;
Connection::ref connection;
};
}
diff --git a/Swiften/Network/UnboundDomainNameResolver.cpp b/Swiften/Network/UnboundDomainNameResolver.cpp
index 1df6b8f..21bc697 100644
--- a/Swiften/Network/UnboundDomainNameResolver.cpp
+++ b/Swiften/Network/UnboundDomainNameResolver.cpp
@@ -64,7 +64,7 @@ class UnboundDomainNameServiceQuery : public DomainNameServiceQuery, public Unbo
1 /* CLASS IN (internet) */,
helper, UnboundDomainNameResolver::unbound_callback_wrapper, NULL);
if(retval != 0) {
- SWIFT_LOG(debug) << "resolve error: " << ub_strerror(retval) << std::endl;
+ SWIFT_LOG(debug) << "resolve error: " << ub_strerror(retval);
delete helper;
}
}
@@ -73,7 +73,7 @@ class UnboundDomainNameServiceQuery : public DomainNameServiceQuery, public Unbo
std::vector<DomainNameServiceQuery::Result> serviceRecords;
if(err != 0) {
- SWIFT_LOG(debug) << "resolve error: " << ub_strerror(err) << std::endl;
+ SWIFT_LOG(debug) << "resolve error: " << ub_strerror(err);
} else {
if(result->havedata) {
ldns_pkt* replyPacket = 0;
@@ -105,7 +105,7 @@ class UnboundDomainNameServiceQuery : public DomainNameServiceQuery, public Unbo
serviceRecord.hostname = std::string(reinterpret_cast<char*>(ldns_buffer_at(buffer, 0)));
serviceRecords.push_back(serviceRecord);
- SWIFT_LOG(debug) << "hostname " << serviceRecord.hostname << " added" << std::endl;
+ SWIFT_LOG(debug) << "hostname " << serviceRecord.hostname << " added";
}
}
if (replyPacket) ldns_pkt_free(replyPacket);
@@ -137,7 +137,7 @@ class UnboundDomainNameAddressQuery : public DomainNameAddressQuery, public Unbo
1 /* CLASS IN (internet) */,
helper, UnboundDomainNameResolver::unbound_callback_wrapper, NULL);
if(retval != 0) {
- SWIFT_LOG(debug) << "resolve error: " << ub_strerror(retval) << std::endl;
+ SWIFT_LOG(debug) << "resolve error: " << ub_strerror(retval);
delete helper;
}
}
@@ -145,10 +145,10 @@ class UnboundDomainNameAddressQuery : public DomainNameAddressQuery, public Unbo
void handleResult(int err, struct ub_result* result) {
std::vector<HostAddress> addresses;
boost::optional<DomainNameResolveError> error;
- SWIFT_LOG(debug) << "Result for: " << name << std::endl;
+ SWIFT_LOG(debug) << "Result for: " << name;
if(err != 0) {
- SWIFT_LOG(debug) << "resolve error: " << ub_strerror(err) << std::endl;
+ SWIFT_LOG(debug) << "resolve error: " << ub_strerror(err);
error = DomainNameResolveError();
} else {
if(result->havedata) {
@@ -156,13 +156,13 @@ class UnboundDomainNameAddressQuery : public DomainNameAddressQuery, public Unbo
char address[100];
const char* addressStr = 0;
if ((addressStr = inet_ntop(AF_INET, result->data[i], address, 100))) {
- SWIFT_LOG(debug) << "IPv4 address: " << addressStr << std::endl;
+ SWIFT_LOG(debug) << "IPv4 address: " << addressStr;
addresses.push_back(HostAddress(std::string(addressStr)));
} else if ((addressStr = inet_ntop(AF_INET6, result->data[i], address, 100))) {
- SWIFT_LOG(debug) << "IPv6 address: " << addressStr << std::endl;
+ SWIFT_LOG(debug) << "IPv6 address: " << addressStr;
addresses.push_back(HostAddress(std::string(addressStr)));
} else {
- SWIFT_LOG(debug) << "inet_ntop() failed" << std::endl;
+ SWIFT_LOG(debug) << "inet_ntop() failed";
error = DomainNameResolveError();
}
}
@@ -182,7 +182,7 @@ class UnboundDomainNameAddressQuery : public DomainNameAddressQuery, public Unbo
UnboundDomainNameResolver::UnboundDomainNameResolver(IDNConverter* idnConverter, std::shared_ptr<boost::asio::io_service> ioService, EventLoop* eventLoop) : idnConverter(idnConverter), ioService(ioService), ubDescriptior(*ioService), eventLoop(eventLoop) {
ubContext = ub_ctx_create();
if(!ubContext) {
- SWIFT_LOG(debug) << "could not create unbound context" << std::endl;
+ SWIFT_LOG(debug) << "could not create unbound context";
}
eventOwner = std::make_shared<EventOwner>();
@@ -192,11 +192,11 @@ UnboundDomainNameResolver::UnboundDomainNameResolver(IDNConverter* idnConverter,
/* read /etc/resolv.conf for DNS proxy settings (from DHCP) */
if( (ret=ub_ctx_resolvconf(ubContext, const_cast<char*>("/etc/resolv.conf"))) != 0) {
- SWIFT_LOG(error) << "error reading resolv.conf: " << ub_strerror(ret) << ". errno says: " << strerror(errno) << std::endl;
+ SWIFT_LOG(error) << "error reading resolv.conf: " << ub_strerror(ret) << ". errno says: " << strerror(errno);
}
/* read /etc/hosts for locally supplied host addresses */
if( (ret=ub_ctx_hosts(ubContext, const_cast<char*>("/etc/hosts"))) != 0) {
- SWIFT_LOG(error) << "error reading hosts: " << ub_strerror(ret) << ". errno says: " << strerror(errno) << std::endl;
+ SWIFT_LOG(error) << "error reading hosts: " << ub_strerror(ret) << ". errno says: " << strerror(errno);
}
ubDescriptior.assign(ub_fd(ubContext));
@@ -231,7 +231,7 @@ void UnboundDomainNameResolver::processData() {
if (ub_poll(ubContext)) {
int ret = ub_process(ubContext);
if(ret != 0) {
- SWIFT_LOG(debug) << "resolve error: " << ub_strerror(ret) << std::endl;
+ SWIFT_LOG(debug) << "resolve error: " << ub_strerror(ret);
}
}
}
diff --git a/Swiften/Network/UnitTest/BOSHConnectionPoolTest.cpp b/Swiften/Network/UnitTest/BOSHConnectionPoolTest.cpp
index 5d6fedd..4aeaf24 100644
--- a/Swiften/Network/UnitTest/BOSHConnectionPoolTest.cpp
+++ b/Swiften/Network/UnitTest/BOSHConnectionPoolTest.cpp
@@ -194,7 +194,7 @@ class BOSHConnectionPoolTest : public CppUnit::TestFixture {
CPPUNIT_ASSERT_EQUAL(st(2), connectionFactory->connections.size()); /* 0 was waiting for response, open and send on 1 */
CPPUNIT_ASSERT_EQUAL(st(4), boshDataWritten.size()); /* data */
c1 = connectionFactory->connections[1];
- std::string fullBody = "<body rid='" + boost::lexical_cast<std::string>(rid) + "' sid='" + sid + "' xmlns='http://jabber.org/protocol/httpbind'><blah/></body>"; /* check empty write */
+ std::string fullBody = "<body rid='" + std::to_string(rid) + "' sid='" + sid + "' xmlns='http://jabber.org/protocol/httpbind'><blah/></body>"; /* check empty write */
CPPUNIT_ASSERT_EQUAL(fullBody, lastBody());
CPPUNIT_ASSERT(c0->pending);
CPPUNIT_ASSERT(c1->pending);
@@ -310,7 +310,7 @@ class BOSHConnectionPoolTest : public CppUnit::TestFixture {
readResponse("<body></body>", c0);
eventLoop->processEvents();
CPPUNIT_ASSERT_EQUAL(st(3), boshDataWritten.size());
- std::string fullBody = "<body rid='" + boost::lexical_cast<std::string>(initialRID + 2) + "' sid='" + sid + "' xmlns='http://jabber.org/protocol/httpbind'></body>";
+ std::string fullBody = "<body rid='" + std::to_string(initialRID + 2) + "' sid='" + sid + "' xmlns='http://jabber.org/protocol/httpbind'></body>";
std::string response = boshDataWritten[2];
size_t bodyPosition = response.find("\r\n\r\n");
CPPUNIT_ASSERT_EQUAL(fullBody, response.substr(bodyPosition+4));
@@ -427,7 +427,7 @@ class BOSHConnectionPoolTest : public CppUnit::TestFixture {
"Access-Control-Allow-Headers: Content-Type\r\n"
"Content-Length: "));
connection->onDataRead(data1);
- std::shared_ptr<SafeByteArray> data2 = std::make_shared<SafeByteArray>(createSafeByteArray(boost::lexical_cast<std::string>(response.size())));
+ std::shared_ptr<SafeByteArray> data2 = std::make_shared<SafeByteArray>(createSafeByteArray(std::to_string(response.size())));
connection->onDataRead(data2);
std::shared_ptr<SafeByteArray> data3 = std::make_shared<SafeByteArray>(createSafeByteArray("\r\n\r\n"));
connection->onDataRead(data3);
@@ -440,7 +440,7 @@ class BOSHConnectionPoolTest : public CppUnit::TestFixture {
std::string result = "POST /" + path + " HTTP/1.1\r\n"
+ "Host: " + to + ":" + port + "\r\n"
+ "Content-Type: text/xml; charset=utf-8\r\n"
- + "Content-Length: " + boost::lexical_cast<std::string>(body.size()) + "\r\n\r\n"
+ + "Content-Length: " + std::to_string(body.size()) + "\r\n\r\n"
+ body;
return result;
}
diff --git a/Swiften/Network/UnitTest/BOSHConnectionTest.cpp b/Swiften/Network/UnitTest/BOSHConnectionTest.cpp
index e34cb96..17d8333 100644
--- a/Swiften/Network/UnitTest/BOSHConnectionTest.cpp
+++ b/Swiften/Network/UnitTest/BOSHConnectionTest.cpp
@@ -318,7 +318,7 @@ class BOSHConnectionTest : public CppUnit::TestFixture {
"Access-Control-Allow-Headers: Content-Type\r\n"
"Content-Length: "));
connection->onDataRead(data1);
- std::shared_ptr<SafeByteArray> data2 = std::make_shared<SafeByteArray>(createSafeByteArray(boost::lexical_cast<std::string>(response.size())));
+ std::shared_ptr<SafeByteArray> data2 = std::make_shared<SafeByteArray>(createSafeByteArray(std::to_string(response.size())));
connection->onDataRead(data2);
std::shared_ptr<SafeByteArray> data3 = std::make_shared<SafeByteArray>(createSafeByteArray("\r\n\r\n"));
connection->onDataRead(data3);
diff --git a/Swiften/Network/UnitTest/ConnectorTest.cpp b/Swiften/Network/UnitTest/ConnectorTest.cpp
index 8524439..065911d 100644
--- a/Swiften/Network/UnitTest/ConnectorTest.cpp
+++ b/Swiften/Network/UnitTest/ConnectorTest.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -26,6 +26,7 @@ class ConnectorTest : public CppUnit::TestFixture {
CPPUNIT_TEST(testConnect);
CPPUNIT_TEST(testConnect_NoServiceLookups);
CPPUNIT_TEST(testConnect_NoServiceLookups_DefaultPort);
+ CPPUNIT_TEST(testConnect_OnlyLiteral);
CPPUNIT_TEST(testConnect_FirstAddressHostFails);
CPPUNIT_TEST(testConnect_NoSRVHost);
CPPUNIT_TEST(testConnect_NoHosts);
@@ -91,7 +92,7 @@ class ConnectorTest : public CppUnit::TestFixture {
}
void testConnect_NoServiceLookups_DefaultPort() {
- Connector::ref testling(createConnector(-1, boost::optional<std::string>()));
+ Connector::ref testling(createConnector(0, boost::optional<std::string>()));
resolver->addXMPPClientService("foo.com", host1);
resolver->addXMPPClientService("foo.com", host2);
resolver->addAddress("foo.com", host3.getAddress());
@@ -102,7 +103,7 @@ class ConnectorTest : public CppUnit::TestFixture {
CPPUNIT_ASSERT_EQUAL(1, static_cast<int>(connections.size()));
CPPUNIT_ASSERT(connections[0]);
CPPUNIT_ASSERT(host3.getAddress() == (*(connections[0]->hostAddressPort)).getAddress());
- CPPUNIT_ASSERT_EQUAL(5222, (*(connections[0]->hostAddressPort)).getPort());
+ CPPUNIT_ASSERT_EQUAL(static_cast<unsigned short>(5222), (*(connections[0]->hostAddressPort)).getPort());
CPPUNIT_ASSERT(!std::dynamic_pointer_cast<DomainNameResolveError>(error));
}
@@ -119,6 +120,21 @@ class ConnectorTest : public CppUnit::TestFixture {
CPPUNIT_ASSERT(!std::dynamic_pointer_cast<DomainNameResolveError>(error));
}
+ void testConnect_OnlyLiteral() {
+ auto testling = Connector::create("1.1.1.1", 1234, boost::none, resolver, connectionFactory, timerFactory);
+ testling->onConnectFinished.connect(boost::bind(&ConnectorTest::handleConnectorFinished, this, _1, _2));
+
+ auto address1 = HostAddress::fromString("1.1.1.1").get();
+ connectionFactory->failingPorts.push_back(HostAddressPort(address1, 1234));
+
+ testling->start();
+ eventLoop->processEvents();
+
+ CPPUNIT_ASSERT_EQUAL(1, static_cast<int>(connections.size()));
+ CPPUNIT_ASSERT(!connections[0]);
+ CPPUNIT_ASSERT_EQUAL(1, static_cast<int>(connectionFactory->createdConnections.size()));
+ }
+
void testConnect_FirstAddressHostFails() {
Connector::ref testling(createConnector());
@@ -312,7 +328,7 @@ class ConnectorTest : public CppUnit::TestFixture {
private:
- Connector::ref createConnector(int port = -1, boost::optional<std::string> serviceLookupPrefix = boost::optional<std::string>("_xmpp-client._tcp.")) {
+ Connector::ref createConnector(unsigned short port = 0, boost::optional<std::string> serviceLookupPrefix = boost::optional<std::string>("_xmpp-client._tcp.")) {
Connector::ref connector = Connector::create("foo.com", port, serviceLookupPrefix, resolver, connectionFactory, timerFactory);
connector->onConnectFinished.connect(boost::bind(&ConnectorTest::handleConnectorFinished, this, _1, _2));
return connector;
@@ -356,12 +372,15 @@ class ConnectorTest : public CppUnit::TestFixture {
}
std::shared_ptr<Connection> createConnection() {
- return std::make_shared<MockConnection>(failingPorts, isResponsive, eventLoop);
+ auto connection = std::make_shared<MockConnection>(failingPorts, isResponsive, eventLoop);
+ createdConnections.push_back(connection);
+ return connection;
}
EventLoop* eventLoop;
bool isResponsive;
std::vector<HostAddressPort> failingPorts;
+ std::vector<std::shared_ptr<MockConnection>> createdConnections;
};
private:
diff --git a/Swiften/Network/UnitTest/HTTPConnectProxiedConnectionTest.cpp b/Swiften/Network/UnitTest/HTTPConnectProxiedConnectionTest.cpp
index 1a160b7..e9268b0 100644
--- a/Swiften/Network/UnitTest/HTTPConnectProxiedConnectionTest.cpp
+++ b/Swiften/Network/UnitTest/HTTPConnectProxiedConnectionTest.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2019 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -37,7 +37,7 @@ namespace {
virtual std::vector<std::pair<std::string, std::string> > filterHTTPResponseHeader(const std::string& /* statusLine */, const std::vector<std::pair<std::string, std::string> >& response) {
filterResponses.push_back(response);
- SWIFT_LOG(debug) << std::endl;
+ SWIFT_LOG(debug);
return filterResponseReturn;
}
@@ -409,7 +409,7 @@ class HTTPConnectProxiedConnectionTest : public CppUnit::TestFixture {
std::shared_ptr<Connection> createConnection() {
std::shared_ptr<MockConnection> connection = std::make_shared<MockConnection>(failingPorts, eventLoop);
connections.push_back(connection);
- SWIFT_LOG(debug) << "new connection created" << std::endl;
+ SWIFT_LOG(debug) << "new connection created";
return connection;
}
@@ -421,7 +421,7 @@ class HTTPConnectProxiedConnectionTest : public CppUnit::TestFixture {
private:
std::string proxyHost;
HostAddressPort proxyHostAddress;
- int proxyPort;
+ unsigned short proxyPort;
HostAddressPort host;
DummyEventLoop* eventLoop;
StaticDomainNameResolver* resolver;
diff --git a/Swiften/Network/UnitTest/HostAddressTest.cpp b/Swiften/Network/UnitTest/HostAddressTest.cpp
index 226346b..bd345a7 100644
--- a/Swiften/Network/UnitTest/HostAddressTest.cpp
+++ b/Swiften/Network/UnitTest/HostAddressTest.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -10,6 +10,7 @@
#include <cppunit/extensions/TestFactoryRegistry.h>
#include <Swiften/Network/HostAddress.h>
+#include <Swiften/Network/HostAddressPort.h>
using namespace Swift;
@@ -21,6 +22,7 @@ class HostAddressTest : public CppUnit::TestFixture {
CPPUNIT_TEST(testToString);
CPPUNIT_TEST(testToString_IPv6);
CPPUNIT_TEST(testToString_Invalid);
+ CPPUNIT_TEST(testComparison);
CPPUNIT_TEST_SUITE_END();
public:
@@ -62,6 +64,32 @@ class HostAddressTest : public CppUnit::TestFixture {
CPPUNIT_ASSERT_EQUAL(std::string("0.0.0.0"), testling.toString());
}
+
+ void testComparison() {
+ auto ha127_0_0_1 = *HostAddress::fromString("127.0.0.1");
+ auto ha127_0_0_2 = *HostAddress::fromString("127.0.0.2");
+ auto ha127_0_1_0 = *HostAddress::fromString("127.0.1.0");
+
+ CPPUNIT_ASSERT(ha127_0_0_1 < ha127_0_0_2);
+ CPPUNIT_ASSERT(ha127_0_0_2 < ha127_0_1_0);
+ CPPUNIT_ASSERT(!(ha127_0_0_1 < ha127_0_0_1));
+ CPPUNIT_ASSERT(!(ha127_0_0_2 < ha127_0_0_1));
+ CPPUNIT_ASSERT(!(ha127_0_0_2 == ha127_0_0_1));
+ CPPUNIT_ASSERT(ha127_0_0_1 == ha127_0_0_1);
+
+ auto hap_127_0_0_1__1 = HostAddressPort(ha127_0_0_1, 1);
+ auto hap_127_0_0_1__2 = HostAddressPort(ha127_0_0_1, 2);
+ auto hap_127_0_0_2__1 = HostAddressPort(ha127_0_0_2, 1);
+ auto hap_127_0_0_2__2 = HostAddressPort(ha127_0_0_2, 2);
+
+ CPPUNIT_ASSERT(hap_127_0_0_1__1 < hap_127_0_0_1__2);
+ CPPUNIT_ASSERT(!(hap_127_0_0_1__1 < hap_127_0_0_1__1));
+ CPPUNIT_ASSERT(!(hap_127_0_0_1__1 == hap_127_0_0_1__2));
+ CPPUNIT_ASSERT(hap_127_0_0_1__1 == hap_127_0_0_1__1);
+ CPPUNIT_ASSERT(!(hap_127_0_0_1__2 == hap_127_0_0_1__1));
+ CPPUNIT_ASSERT(hap_127_0_0_1__2 < hap_127_0_0_2__1);
+ CPPUNIT_ASSERT(hap_127_0_0_2__1 < hap_127_0_0_2__2);
+ }
};
CPPUNIT_TEST_SUITE_REGISTRATION(HostAddressTest);
diff --git a/Swiften/Network/WindowsProxyProvider.cpp b/Swiften/Network/WindowsProxyProvider.cpp
index 78bd72f..13fdb25 100644
--- a/Swiften/Network/WindowsProxyProvider.cpp
+++ b/Swiften/Network/WindowsProxyProvider.cpp
@@ -17,6 +17,7 @@
#include <stdlib.h>
#include <boost/lexical_cast.hpp>
+#include <boost/numeric/conversion/cast.hpp>
#include <windows.h>
@@ -51,7 +52,7 @@ WindowsProxyProvider::WindowsProxyProvider()
for(auto&& proxy : proxies) {
if(proxy.find('=') != std::string::npos) {
protocolAndProxy = String::getSplittedAtFirst(proxy, '=');
- SWIFT_LOG(debug) << "Found proxy: " << protocolAndProxy.first << " => " << protocolAndProxy.second << std::endl;
+ SWIFT_LOG(debug) << "Found proxy: " << protocolAndProxy.first << " => " << protocolAndProxy.second;
if(protocolAndProxy.first.compare("socks") == 0) {
socksProxy = getAsHostAddressPort(protocolAndProxy.second);
}
@@ -77,15 +78,15 @@ HostAddressPort WindowsProxyProvider::getAsHostAddressPort(std::string proxy) {
try {
std::pair<std::string, std::string> tmp;
- int port = 0;
+ unsigned short port = 0;
tmp = String::getSplittedAtFirst(proxy, ':');
// .c_str() is needed as tmp.second can include a \0 char which will end in an exception of the lexical cast.
// with .c_str() the \0 will not be part of the string which is to be casted
- port = boost::lexical_cast<int> (tmp.second.c_str());
+ port = boost::numeric_cast<unsigned short>(boost::lexical_cast<int> (tmp.second.c_str()));
ret = HostAddressPort(HostAddress::fromString(tmp.first).get(), port);
}
catch(...) {
- SWIFT_LOG(error) << "Exception occured while parsing windows proxy \"getHostAddressPort\"." << std::endl;
+ SWIFT_LOG(error) << "Exception occured while parsing windows proxy \"getHostAddressPort\".";
}
return ret;
diff --git a/Swiften/Parser/Attribute.h b/Swiften/Parser/Attribute.h
index f54317e..07e63b4 100644
--- a/Swiften/Parser/Attribute.h
+++ b/Swiften/Parser/Attribute.h
@@ -14,6 +14,9 @@ namespace Swift {
Attribute(const std::string& name, const std::string& ns) : name(name), ns(ns) {
}
+ Attribute(const std::string& name, const std::string& ns, const std::string& prefix) : name(name), ns(ns), prefix(prefix) {
+ }
+
const std::string& getName() const {
return name;
}
@@ -22,6 +25,10 @@ namespace Swift {
return ns;
}
+ const std::string& getPrefix() const {
+ return prefix;
+ }
+
bool operator==(const Attribute& o) const {
return o.name == name && o.ns == ns;
}
@@ -29,5 +36,6 @@ namespace Swift {
private:
std::string name;
std::string ns;
+ std::string prefix;
};
}
diff --git a/Swiften/Parser/AttributeMap.cpp b/Swiften/Parser/AttributeMap.cpp
index c112d52..7814a64 100644
--- a/Swiften/Parser/AttributeMap.cpp
+++ b/Swiften/Parser/AttributeMap.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2011-2016 Isode Limited.
+ * Copyright (c) 2011-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -8,19 +8,17 @@
#include <algorithm>
-#include <boost/lambda/bind.hpp>
-#include <boost/lambda/lambda.hpp>
#include <boost/optional.hpp>
using namespace Swift;
-namespace lambda = boost::lambda;
AttributeMap::AttributeMap() {
}
std::string AttributeMap::getAttribute(const std::string& attribute, const std::string& ns) const {
- AttributeValueMap::const_iterator i = std::find_if(attributes.begin(), attributes.end(),
- lambda::bind(&AttributeMap::Entry::getAttribute, lambda::_1) == Attribute(attribute, ns));
+ const auto i = std::find_if(attributes.begin(), attributes.end(), [&](const Entry& entry) {
+ return entry.getAttribute() == Attribute(attribute, ns);
+ });
if (i == attributes.end()) {
return "";
}
@@ -30,8 +28,9 @@ std::string AttributeMap::getAttribute(const std::string& attribute, const std::
}
bool AttributeMap::getBoolAttribute(const std::string& attribute, bool defaultValue) const {
- AttributeValueMap::const_iterator i = std::find_if(attributes.begin(), attributes.end(),
- lambda::bind(&AttributeMap::Entry::getAttribute, lambda::_1) == Attribute(attribute, ""));
+ const auto i = std::find_if(attributes.begin(), attributes.end(), [&](const Entry& entry) {
+ return entry.getAttribute() == Attribute(attribute, "");
+ });
if (i == attributes.end()) {
return defaultValue;
}
@@ -41,8 +40,9 @@ bool AttributeMap::getBoolAttribute(const std::string& attribute, bool defaultVa
}
boost::optional<std::string> AttributeMap::getAttributeValue(const std::string& attribute) const {
- AttributeValueMap::const_iterator i = std::find_if(attributes.begin(), attributes.end(),
- lambda::bind(&AttributeMap::Entry::getAttribute, lambda::_1) == Attribute(attribute, ""));
+ const auto i = std::find_if(attributes.begin(), attributes.end(), [&](const Entry& entry) {
+ return entry.getAttribute() == Attribute(attribute, "");
+ });
if (i == attributes.end()) {
return boost::optional<std::string>();
}
@@ -54,3 +54,7 @@ boost::optional<std::string> AttributeMap::getAttributeValue(const std::string&
void AttributeMap::addAttribute(const std::string& name, const std::string& ns, const std::string& value) {
attributes.push_back(Entry(Attribute(name, ns), value));
}
+
+void AttributeMap::addAttribute(const std::string& name, const std::string& ns, const std::string& prefix, const std::string& value) {
+ attributes.push_back(Entry(Attribute(name, ns, prefix), value));
+}
diff --git a/Swiften/Parser/AttributeMap.h b/Swiften/Parser/AttributeMap.h
index 804d6aa..26d5826 100644
--- a/Swiften/Parser/AttributeMap.h
+++ b/Swiften/Parser/AttributeMap.h
@@ -43,6 +43,7 @@ namespace Swift {
boost::optional<std::string> getAttributeValue(const std::string&) const;
void addAttribute(const std::string& name, const std::string& ns, const std::string& value);
+ void addAttribute(const std::string& name, const std::string& ns, const std::string& prefix, const std::string& value);
const std::vector<Entry>& getEntries() const {
return attributes;
diff --git a/Swiften/Parser/BOSHBodyExtractor.cpp b/Swiften/Parser/BOSHBodyExtractor.cpp
index c45d338..ff56792 100644
--- a/Swiften/Parser/BOSHBodyExtractor.cpp
+++ b/Swiften/Parser/BOSHBodyExtractor.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2011-2016 Isode Limited.
+ * Copyright (c) 2011-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -8,8 +8,6 @@
#include <memory>
-#include <boost/numeric/conversion/cast.hpp>
-
#include <Swiften/Parser/XMLParser.h>
#include <Swiften/Parser/XMLParserClient.h>
#include <Swiften/Parser/XMLParserFactory.h>
@@ -119,17 +117,19 @@ BOSHBodyExtractor::BOSHBodyExtractor(XMLParserFactory* parserFactory, const Byte
body = BOSHBody();
if (!endElementSeen) {
+ assert(i <= j.base());
body->content = std::string(
reinterpret_cast<const char*>(vecptr(data) + std::distance(data.begin(), i)),
- boost::numeric_cast<size_t>(std::distance(i, j.base())));
+ static_cast<size_t>(std::distance(i, j.base())));
}
// Parse the body element
BOSHBodyParserClient parserClient(this);
std::shared_ptr<XMLParser> parser(parserFactory->createXMLParser(&parserClient));
+ assert(data.begin() <= i);
if (!parser->parse(std::string(
reinterpret_cast<const char*>(vecptr(data)),
- boost::numeric_cast<size_t>(std::distance(data.begin(), i))))) {
+ static_cast<size_t>(std::distance(data.begin(), i))))) {
/* TODO: This needs to be only validating the BOSH <body> element, so that XMPP parsing errors are caught at
the correct higher layer */
body = boost::optional<BOSHBody>();
diff --git a/Swiften/Parser/ExpatParser.cpp b/Swiften/Parser/ExpatParser.cpp
index 77d959c..32d4f53 100644
--- a/Swiften/Parser/ExpatParser.cpp
+++ b/Swiften/Parser/ExpatParser.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2019 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -7,18 +7,46 @@
#include <Swiften/Parser/ExpatParser.h>
#include <cassert>
+#include <limits>
#include <memory>
#include <string>
-#include <expat.h>
+#include <boost/algorithm/string.hpp>
-#include <boost/numeric/conversion/cast.hpp>
+#include <expat.h>
#include <Swiften/Base/String.h>
#include <Swiften/Parser/XMLParserClient.h>
#pragma clang diagnostic ignored "-Wdisabled-macro-expansion"
+namespace {
+struct XmlInfo {
+ std::string prefix;
+ std::string uri;
+ std::string name;
+};
+
+XmlInfo splitExpatInfo(const std::string& s, char sep) {
+ // name
+ // uri|name
+ // uri|name|prefix
+ std::vector<std::string> v;
+ boost::split(v, s, [sep](char c) {return c == sep; });
+ switch (v.size()) {
+ case 1:
+ return{ "", "", std::move(v[0]) };
+ case 2:
+ return{ "", std::move(v[0]), std::move(v[1]) };
+ case 3:
+ return{ std::move(v[2]), std::move(v[0]), std::move(v[1]) };
+ default:
+ return{ "", "", "" };
+ }
+}
+}
+
+
namespace Swift {
static const char NAMESPACE_SEPARATOR = '\x01';
@@ -28,33 +56,24 @@ struct ExpatParser::Private {
};
static void handleStartElement(void* parser, const XML_Char* name, const XML_Char** attributes) {
- std::pair<std::string,std::string> nsTagPair = String::getSplittedAtFirst(name, NAMESPACE_SEPARATOR);
- if (nsTagPair.second == "") {
- nsTagPair.second = nsTagPair.first;
- nsTagPair.first = "";
- }
+ auto elemInfo = splitExpatInfo(name, NAMESPACE_SEPARATOR);
+
AttributeMap attributeValues;
const XML_Char** currentAttribute = attributes;
while (*currentAttribute) {
- std::pair<std::string,std::string> nsAttributePair = String::getSplittedAtFirst(*currentAttribute, NAMESPACE_SEPARATOR);
- if (nsAttributePair.second == "") {
- nsAttributePair.second = nsAttributePair.first;
- nsAttributePair.first = "";
- }
- attributeValues.addAttribute(nsAttributePair.second, nsAttributePair.first, std::string(*(currentAttribute+1)));
+ auto attribInfo = splitExpatInfo(*currentAttribute, NAMESPACE_SEPARATOR);
+ attributeValues.addAttribute(attribInfo.name, attribInfo.uri, attribInfo.prefix, std::string(*(currentAttribute+1)));
currentAttribute += 2;
}
- static_cast<XMLParser*>(parser)->getClient()->handleStartElement(nsTagPair.second, nsTagPair.first, attributeValues);
+ auto* client = static_cast<XMLParser*>(parser)->getClient();
+ client->handleStartElementPrefix(elemInfo.prefix, elemInfo.uri, elemInfo.name, attributeValues);
+ client->handleStartElement(elemInfo.name, elemInfo.uri, attributeValues);
}
static void handleEndElement(void* parser, const XML_Char* name) {
- std::pair<std::string,std::string> nsTagPair = String::getSplittedAtFirst(name, NAMESPACE_SEPARATOR);
- if (nsTagPair.second == "") {
- nsTagPair.second = nsTagPair.first;
- nsTagPair.first = "";
- }
- static_cast<XMLParser*>(parser)->getClient()->handleEndElement(nsTagPair.second, nsTagPair.first);
+ auto elemInfo = splitExpatInfo(name, NAMESPACE_SEPARATOR);
+ static_cast<XMLParser*>(parser)->getClient()->handleEndElement(elemInfo.name, elemInfo.uri);
}
static void handleCharacterData(void* parser, const XML_Char* data, int len) {
@@ -65,26 +84,51 @@ static void handleCharacterData(void* parser, const XML_Char* data, int len) {
static void handleXMLDeclaration(void*, const XML_Char*, const XML_Char*, int) {
}
+static void handleNamespaceDeclaration(void* parser, const XML_Char* prefix, const XML_Char* uri) {
+ static_cast<XMLParser*>(parser)->getClient()->handleNamespaceDeclaration(std::string(prefix ? prefix : ""), std::string(uri ? uri : ""));
+}
+
static void handleEntityDeclaration(void* parser, const XML_Char*, int, const XML_Char*, int, const XML_Char*, const XML_Char*, const XML_Char*, const XML_Char*) {
static_cast<ExpatParser*>(parser)->stopParser();
}
+static void handleComment(void* parser, const XML_Char* /*data*/) {
+ if (!static_cast<ExpatParser*>(parser)->allowsComments()) {
+ static_cast<ExpatParser*>(parser)->stopParser();
+ }
+}
-ExpatParser::ExpatParser(XMLParserClient* client) : XMLParser(client), p(new Private()) {
+static void handleProcessingInstruction(void* parser, const XML_Char* /*target*/, const XML_Char* /*data*/) {
+ static_cast<ExpatParser*>(parser)->stopParser();
+}
+
+static void handleDoctypeDeclaration(void* parser, const XML_Char* /*doctypeName*/, const XML_Char* /*sysid*/, const XML_Char* /*pubid*/, int /*has_internal_subset*/) {
+ static_cast<ExpatParser*>(parser)->stopParser();
+}
+
+ExpatParser::ExpatParser(XMLParserClient* client, bool allowComments) : XMLParser(client, allowComments), p(new Private()) {
p->parser_ = XML_ParserCreateNS("UTF-8", NAMESPACE_SEPARATOR);
+ XML_SetReturnNSTriplet(p->parser_, true);
XML_SetUserData(p->parser_, this);
XML_SetElementHandler(p->parser_, handleStartElement, handleEndElement);
XML_SetCharacterDataHandler(p->parser_, handleCharacterData);
XML_SetXmlDeclHandler(p->parser_, handleXMLDeclaration);
XML_SetEntityDeclHandler(p->parser_, handleEntityDeclaration);
+ XML_SetNamespaceDeclHandler(p->parser_, handleNamespaceDeclaration, nullptr);
+ XML_SetCommentHandler(p->parser_, handleComment);
+ XML_SetProcessingInstructionHandler(p->parser_, handleProcessingInstruction);
+ XML_SetDoctypeDeclHandler(p->parser_, handleDoctypeDeclaration, nullptr);
}
ExpatParser::~ExpatParser() {
XML_ParserFree(p->parser_);
}
-bool ExpatParser::parse(const std::string& data) {
- bool success = XML_Parse(p->parser_, data.c_str(), boost::numeric_cast<int>(data.size()), false) == XML_STATUS_OK;
+bool ExpatParser::parse(const std::string& data, bool finalData) {
+ if (data.size() > std::numeric_limits<int>::max()) {
+ return false;
+ }
+ bool success = XML_Parse(p->parser_, data.c_str(), static_cast<int>(data.size()), finalData) == XML_STATUS_OK;
/*if (!success) {
std::cout << "ERROR: " << XML_ErrorString(XML_GetErrorCode(p->parser_)) << " while parsing " << data << std::endl;
}*/
diff --git a/Swiften/Parser/ExpatParser.h b/Swiften/Parser/ExpatParser.h
index 12df463..34d790d 100644
--- a/Swiften/Parser/ExpatParser.h
+++ b/Swiften/Parser/ExpatParser.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2019 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -16,10 +16,10 @@
namespace Swift {
class SWIFTEN_API ExpatParser : public XMLParser, public boost::noncopyable {
public:
- ExpatParser(XMLParserClient* client);
+ ExpatParser(XMLParserClient* client, bool allowComments = false);
~ExpatParser();
- bool parse(const std::string& data);
+ bool parse(const std::string& data, bool finalData = false);
void stopParser();
diff --git a/Swiften/Parser/IQParser.cpp b/Swiften/Parser/IQParser.cpp
index 5cfae34..363f7ec 100644
--- a/Swiften/Parser/IQParser.cpp
+++ b/Swiften/Parser/IQParser.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2019 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -32,7 +32,7 @@ void IQParser::handleStanzaAttributes(const AttributeMap& attributes) {
getStanzaGeneric()->setType(IQ::Error);
}
else {
- SWIFT_LOG(warning) << "Unknown IQ type: " << *type << std::endl;
+ SWIFT_LOG(warning) << "Unknown IQ type: " << *type;
getStanzaGeneric()->setType(IQ::Get);
}
}
diff --git a/Swiften/Parser/LibXMLParser.cpp b/Swiften/Parser/LibXMLParser.cpp
index be0a92d..32b91a1 100644
--- a/Swiften/Parser/LibXMLParser.cpp
+++ b/Swiften/Parser/LibXMLParser.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2019 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -8,16 +8,21 @@
#include <cassert>
#include <cstring>
+#include <limits>
#include <memory>
#include <string>
-#include <boost/numeric/conversion/cast.hpp>
-
#include <libxml/parser.h>
#include <Swiften/Base/Log.h>
#include <Swiften/Parser/XMLParserClient.h>
+namespace {
+std::string asString(const unsigned char* s) {
+ return s ? std::string(reinterpret_cast<const char*>(s)) : std::string();
+}
+}
+
namespace Swift {
struct LibXMLParser::Private {
@@ -25,32 +30,62 @@ struct LibXMLParser::Private {
xmlParserCtxtPtr context_;
};
-static void handleStartElement(void* parser, const xmlChar* name, const xmlChar*, const xmlChar* xmlns, int, const xmlChar**, int nbAttributes, int nbDefaulted, const xmlChar ** attributes) {
+static void handleStartElement(void* parser, const xmlChar* name, const xmlChar* prefix, const xmlChar* xmlns, int nbNamespaces, const xmlChar** namespaces, int nbAttributes, int nbDefaulted, const xmlChar ** attributes) {
AttributeMap attributeValues;
if (nbDefaulted != 0) {
// Just because i don't understand what this means yet :-)
- SWIFT_LOG(error) << "Unexpected nbDefaulted on XML element" << std::endl;
+ SWIFT_LOG(error) << "Unexpected nbDefaulted on XML element";
}
for (int i = 0; i < nbAttributes*5; i += 5) {
- std::string attributeNS = "";
- if (attributes[i+2]) {
- attributeNS = std::string(reinterpret_cast<const char*>(attributes[i+2]));
- }
+ std::string attributeName = asString(attributes[i]);
+ std::string attributePrefix = asString(attributes[i+1]);
+ std::string attributeNS = asString(attributes[i+2]);
+ assert(attributes[i+4] >= attributes[i+3]);
attributeValues.addAttribute(
- std::string(reinterpret_cast<const char*>(attributes[i])),
+ attributeName,
attributeNS,
+ attributePrefix,
std::string(reinterpret_cast<const char*>(attributes[i+3]),
- boost::numeric_cast<size_t>(attributes[i+4]-attributes[i+3])));
+ static_cast<size_t>(attributes[i+4]-attributes[i+3])));
+ }
+ auto* client = static_cast<XMLParser*>(parser)->getClient();
+ for (auto i = 0; i < nbNamespaces * 2; i += 2) {
+ const auto prefix = asString(namespaces[i]);
+ const auto uri = asString(namespaces[i + 1]);
+ client->handleNamespaceDeclaration(prefix, uri);
}
- static_cast<XMLParser*>(parser)->getClient()->handleStartElement(reinterpret_cast<const char*>(name), (xmlns ? reinterpret_cast<const char*>(xmlns) : std::string()), attributeValues);
+ auto nameStr = asString(name);
+ auto xmlsnsStr = asString(xmlns);
+ auto prefixStr = asString(prefix);
+ client->handleStartElementPrefix(prefixStr, xmlsnsStr, nameStr, attributeValues);
+ client->handleStartElement(nameStr, xmlsnsStr, attributeValues);
}
static void handleEndElement(void *parser, const xmlChar* name, const xmlChar*, const xmlChar* xmlns) {
- static_cast<XMLParser*>(parser)->getClient()->handleEndElement(reinterpret_cast<const char*>(name), (xmlns ? reinterpret_cast<const char*>(xmlns) : std::string()));
+ static_cast<XMLParser*>(parser)->getClient()->handleEndElement(asString(name), asString(xmlns));
}
static void handleCharacterData(void* parser, const xmlChar* data, int len) {
- static_cast<XMLParser*>(parser)->getClient()->handleCharacterData(std::string(reinterpret_cast<const char*>(data), boost::numeric_cast<size_t>(len)));
+ assert(len >= 0);
+ static_cast<XMLParser*>(parser)->getClient()->handleCharacterData(std::string(reinterpret_cast<const char*>(data), static_cast<size_t>(len)));
+}
+
+static void handleComment(void* parser, const xmlChar* /*data*/) {
+ if (!static_cast<LibXMLParser*>(parser)->allowsComments()) {
+ static_cast<LibXMLParser*>(parser)->stopParser();
+ }
+}
+
+static void handleEntityDeclaration(void * parser, const xmlChar* /*name*/, int /*type*/, const xmlChar* /*publicId*/, const xmlChar* /*systemId*/, xmlChar* /*content*/) {
+ static_cast<LibXMLParser*>(parser)->stopParser();
+}
+
+static void handleProcessingInstruction(void* parser, const xmlChar* /*target*/, const xmlChar* /*data*/) {
+ static_cast<LibXMLParser*>(parser)->stopParser();
+}
+
+static void handleExternalSubset(void* parser, const xmlChar * /*name*/, const xmlChar * /*ExternalID*/, const xmlChar * /*SystemID*/) {
+ static_cast<LibXMLParser*>(parser)->stopParser();
}
static void handleError(void*, const char* /*m*/, ... ) {
@@ -65,12 +100,20 @@ static void handleError(void*, const char* /*m*/, ... ) {
static void handleWarning(void*, const char*, ... ) {
}
+static void handleGenericError(void*, const char*, ... ) {
+}
+
+static void handleStructuredError(void*, xmlErrorPtr) {
+}
+
bool LibXMLParser::initialized = false;
-LibXMLParser::LibXMLParser(XMLParserClient* client) : XMLParser(client), p(new Private()) {
+LibXMLParser::LibXMLParser(XMLParserClient* client, bool allowComments) : XMLParser(client, allowComments), p(new Private()) {
// Initialize libXML for multithreaded applications
if (!initialized) {
xmlInitParser();
+ xmlSetGenericErrorFunc(nullptr, handleGenericError);
+ xmlSetStructuredErrorFunc(nullptr, handleStructuredError);
initialized = true;
}
@@ -81,6 +124,10 @@ LibXMLParser::LibXMLParser(XMLParserClient* client) : XMLParser(client), p(new P
p->handler_.characters = &handleCharacterData;
p->handler_.warning = &handleWarning;
p->handler_.error = &handleError;
+ p->handler_.comment = &handleComment;
+ p->handler_.entityDecl = &handleEntityDeclaration;
+ p->handler_.processingInstruction = &handleProcessingInstruction;
+ p->handler_.externalSubset = &handleExternalSubset;
p->context_ = xmlCreatePushParserCtxt(&p->handler_, this, nullptr, 0, nullptr);
xmlCtxtUseOptions(p->context_, XML_PARSE_NOENT);
@@ -93,12 +140,16 @@ LibXMLParser::~LibXMLParser() {
}
}
-bool LibXMLParser::parse(const std::string& data) {
- if (xmlParseChunk(p->context_, data.c_str(), boost::numeric_cast<int>(data.size()), false) == XML_ERR_OK) {
+bool LibXMLParser::parse(const std::string& data, bool finalData) {
+ if (data.size() > std::numeric_limits<int>::max()) {
+ return false;
+ }
+ auto error = xmlParseChunk(p->context_, data.c_str(), static_cast<int>(data.size()), finalData);
+ if (error == XML_ERR_OK) {
return true;
}
- xmlError* error = xmlCtxtGetLastError(p->context_);
- if (error->code == XML_WAR_NS_URI || error->code == XML_WAR_NS_URI_RELATIVE) {
+ if (stopped_) return false;
+ if (error == XML_WAR_NS_URI || error == XML_WAR_NS_URI_RELATIVE) {
xmlCtxtResetLastError(p->context_);
p->context_->errNo = XML_ERR_OK;
return true;
@@ -106,4 +157,9 @@ bool LibXMLParser::parse(const std::string& data) {
return false;
}
+void LibXMLParser::stopParser() {
+ stopped_ = true;
+ xmlStopParser(p->context_);
+}
+
}
diff --git a/Swiften/Parser/LibXMLParser.h b/Swiften/Parser/LibXMLParser.h
index 9f752ce..e21770d 100644
--- a/Swiften/Parser/LibXMLParser.h
+++ b/Swiften/Parser/LibXMLParser.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2019 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -19,13 +19,16 @@ namespace Swift {
*/
class LibXMLParser : public XMLParser, public boost::noncopyable {
public:
- LibXMLParser(XMLParserClient* client);
+ LibXMLParser(XMLParserClient* client, bool allowComments = false);
virtual ~LibXMLParser();
- bool parse(const std::string& data);
+ bool parse(const std::string& data, bool finalData = false);
+
+ void stopParser();
private:
static bool initialized;
+ bool stopped_ = false;
struct Private;
const std::unique_ptr<Private> p;
diff --git a/Swiften/Parser/PayloadParsers/BytestreamsParser.cpp b/Swiften/Parser/PayloadParsers/BytestreamsParser.cpp
index 405c593..71bce54 100644
--- a/Swiften/Parser/PayloadParsers/BytestreamsParser.cpp
+++ b/Swiften/Parser/PayloadParsers/BytestreamsParser.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -7,6 +7,7 @@
#include <Swiften/Parser/PayloadParsers/BytestreamsParser.h>
#include <boost/lexical_cast.hpp>
+#include <boost/numeric/conversion/cast.hpp>
namespace Swift {
@@ -23,7 +24,9 @@ void BytestreamsParser::handleStartElement(const std::string& element, const std
else if (level == PayloadLevel) {
if (element == "streamhost") {
try {
- getPayloadInternal()->addStreamHost(Bytestreams::StreamHost(attributes.getAttribute("host"), JID(attributes.getAttribute("jid")), boost::lexical_cast<int>(attributes.getAttribute("port"))));
+ getPayloadInternal()->addStreamHost(Bytestreams::StreamHost(attributes.getAttribute("host"), JID(attributes.getAttribute("jid")), boost::numeric_cast<unsigned short>(boost::lexical_cast<int>(attributes.getAttribute("port")))));
+ }
+ catch (boost::numeric::bad_numeric_cast&) {
}
catch (boost::bad_lexical_cast&) {
}
diff --git a/Swiften/Parser/PayloadParsers/FullPayloadParserFactoryCollection.cpp b/Swiften/Parser/PayloadParsers/FullPayloadParserFactoryCollection.cpp
index 8f57704..9e56b63 100644
--- a/Swiften/Parser/PayloadParsers/FullPayloadParserFactoryCollection.cpp
+++ b/Swiften/Parser/PayloadParsers/FullPayloadParserFactoryCollection.cpp
@@ -56,6 +56,7 @@
#include <Swiften/Parser/PayloadParsers/MIXRegisterNickParserFactory.h>
#include <Swiften/Parser/PayloadParsers/MIXSetNickParserFactory.h>
#include <Swiften/Parser/PayloadParsers/MIXDestroyParser.h>
+#include <Swiften/Parser/PayloadParsers/MIXUpdateSubscriptionParser.h>
#include <Swiften/Parser/PayloadParsers/MIXJoinParserFactory.h>
#include <Swiften/Parser/PayloadParsers/MIXPayloadParserFactory.h>
#include <Swiften/Parser/PayloadParsers/MIXUserPreferenceParser.h>
@@ -74,6 +75,7 @@
#include <Swiften/Parser/PayloadParsers/PubSubOwnerPubSubParser.h>
#include <Swiften/Parser/PayloadParsers/PubSubParser.h>
#include <Swiften/Parser/PayloadParsers/RawXMLPayloadParserFactory.h>
+#include <Swiften/Parser/PayloadParsers/ReferencePayloadParser.h>
#include <Swiften/Parser/PayloadParsers/ReplaceParser.h>
#include <Swiften/Parser/PayloadParsers/ResourceBindParser.h>
#include <Swiften/Parser/PayloadParsers/ResultSetParser.h>
@@ -143,6 +145,7 @@ FullPayloadParserFactoryCollection::FullPayloadParserFactoryCollection() {
factories_.push_back(std::make_shared<MIXRegisterNickParserFactory>());
factories_.push_back(std::make_shared<MIXSetNickParserFactory>());
factories_.push_back(std::make_shared<GenericPayloadParserFactory<MIXCreateParser> >("create", "urn:xmpp:mix:0"));
+ factories_.push_back(std::make_shared<GenericPayloadParserFactory<MIXUpdateSubscriptionParser> >("update-subscription", "urn:xmpp:mix:0"));
factories_.push_back(std::make_shared<GenericPayloadParserFactory<MIXUserPreferenceParser> >("user-preference", "urn:xmpp:mix:0"));
factories_.push_back(std::make_shared<MIXPayloadParserFactory>());
factories_.push_back(std::make_shared<GenericPayloadParserFactory<MIXLeaveParser> >("leave", "urn:xmpp:mix:0"));
@@ -185,6 +188,7 @@ FullPayloadParserFactoryCollection::FullPayloadParserFactoryCollection() {
factories_.push_back(std::make_shared<GenericPayloadParserFactory2<CarbonsSentParser> >("sent", "urn:xmpp:carbons:2", this));
factories_.push_back(std::make_shared<GenericPayloadParserFactory<CarbonsPrivateParser> >("private", "urn:xmpp:carbons:2"));
factories_.push_back(std::make_shared<MIXJoinParserFactory>());
+ factories_.push_back(std::make_shared<GenericPayloadParserFactory2<ReferencePayloadParser> >("reference", "urn:xmpp:reference:0", this));
for (auto& factory : factories_) {
addFactory(factory.get());
diff --git a/Swiften/Parser/PayloadParsers/IBBParser.cpp b/Swiften/Parser/PayloadParsers/IBBParser.cpp
index 9b6babc..1ba44e1 100644
--- a/Swiften/Parser/PayloadParsers/IBBParser.cpp
+++ b/Swiften/Parser/PayloadParsers/IBBParser.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -39,7 +39,7 @@ void IBBParser::handleStartElement(const std::string& element, const std::string
getPayloadInternal()->setStanzaType(IBB::IQStanza);
}
try {
- getPayloadInternal()->setBlockSize(boost::lexical_cast<int>(attributes.getAttribute("block-size")));
+ getPayloadInternal()->setBlockSize(boost::lexical_cast<unsigned int>(attributes.getAttribute("block-size")));
}
catch (boost::bad_lexical_cast&) {
}
diff --git a/Swiften/Parser/PayloadParsers/JingleS5BTransportMethodPayloadParser.cpp b/Swiften/Parser/PayloadParsers/JingleS5BTransportMethodPayloadParser.cpp
index e639e20..a405e0e 100644
--- a/Swiften/Parser/PayloadParsers/JingleS5BTransportMethodPayloadParser.cpp
+++ b/Swiften/Parser/PayloadParsers/JingleS5BTransportMethodPayloadParser.cpp
@@ -5,7 +5,7 @@
*/
/*
- * Copyright (c) 2014-2016 Isode Limited.
+ * Copyright (c) 2014-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -13,6 +13,7 @@
#include <Swiften/Parser/PayloadParsers/JingleS5BTransportMethodPayloadParser.h>
#include <boost/lexical_cast.hpp>
+#include <boost/numeric/conversion/cast.hpp>
#include <boost/optional.hpp>
#include <Swiften/Base/Log.h>
@@ -40,10 +41,10 @@ namespace Swift {
JingleS5BTransportPayload::Candidate candidate;
candidate.cid = attributes.getAttributeValue("cid").get_value_or("");
- int port = -1;
+ unsigned short port = 0;
try {
- port = boost::lexical_cast<int>(attributes.getAttributeValue("port").get_value_or("-1"));
- } catch(boost::bad_lexical_cast &) { }
+ port = boost::numeric_cast<unsigned short>(boost::lexical_cast<int>(attributes.getAttributeValue("port").get_value_or("0")));
+ } catch(...) { }
candidate.hostPort = HostAddressPort(HostAddress::fromString(attributes.getAttributeValue("host").get_value_or("")).get_value_or(HostAddress()), port);
candidate.jid = JID(attributes.getAttributeValue("jid").get_value_or(""));
int priority = -1;
diff --git a/Swiften/Parser/PayloadParsers/MIXJoinParser.cpp b/Swiften/Parser/PayloadParsers/MIXJoinParser.cpp
index 0c09c44..6e72f90 100644
--- a/Swiften/Parser/PayloadParsers/MIXJoinParser.cpp
+++ b/Swiften/Parser/PayloadParsers/MIXJoinParser.cpp
@@ -9,7 +9,6 @@
#include <boost/optional.hpp>
#include <Swiften/Parser/PayloadParserFactory.h>
-#include <Swiften/Parser/PayloadParsers/MIXSubscribeParser.h>
#include <Swiften/Parser/PayloadParsers/FormParser.h>
using namespace Swift;
@@ -36,7 +35,9 @@ void MIXJoinParser::handleStartElement(const std::string& element, const std::st
if (level_ == 1) {
if (element == "subscribe" && ns == "urn:xmpp:mix:0") {
- currentPayloadParser_ = std::make_shared<MIXSubscribeParser>();
+ if (boost::optional<std::string> attributeValue = attributes.getAttributeValue("node")) {
+ getPayloadInternal()->addSubscription(*attributeValue);
+ }
}
if (element == "x" && ns == "jabber:x:data") {
currentPayloadParser_ = std::make_shared<FormParser>();
@@ -57,9 +58,6 @@ void MIXJoinParser::handleEndElement(const std::string& element, const std::stri
}
if (level_ == 1) {
- if (element == "subscribe" && ns == "urn:xmpp:mix:0") {
- getPayloadInternal()->addSubscription(std::dynamic_pointer_cast<MIXSubscribe>(currentPayloadParser_->getPayload()));
- }
if (element == "x" && ns == "jabber:x:data") {
getPayloadInternal()->setForm(std::dynamic_pointer_cast<Form>(currentPayloadParser_->getPayload()));
}
diff --git a/Swiften/Parser/PayloadParsers/MIXSubscribeParser.cpp b/Swiften/Parser/PayloadParsers/MIXSubscribeParser.cpp
deleted file mode 100644
index 1500716..0000000
--- a/Swiften/Parser/PayloadParsers/MIXSubscribeParser.cpp
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Copyright (c) 2017 Tarun Gupta
- * Licensed under the simplified BSD license.
- * See Documentation/Licenses/BSD-simplified.txt for more information.
- */
-
-#include <Swiften/Parser/PayloadParsers/MIXSubscribeParser.h>
-
-#include <boost/optional.hpp>
-
-#include <Swiften/Parser/PayloadParserFactory.h>
-#include <Swiften/Parser/PayloadParserFactoryCollection.h>
-
-using namespace Swift;
-
-MIXSubscribeParser::MIXSubscribeParser() : level_(0) {
-}
-
-MIXSubscribeParser::~MIXSubscribeParser() {
-}
-
-void MIXSubscribeParser::handleStartElement(const std::string&, const std::string&, const AttributeMap& attributes) {
- if (level_ == 0) {
- if (boost::optional<std::string> attributeValue = attributes.getAttributeValue("node")) {
- getPayloadInternal()->setNode(*attributeValue);
- }
- }
- ++level_;
-}
-
-void MIXSubscribeParser::handleEndElement(const std::string& , const std::string& ) {
- --level_;
-}
-
-void MIXSubscribeParser::handleCharacterData(const std::string& ) {
-}
diff --git a/Swiften/Parser/PayloadParsers/MIXSubscribeParser.h b/Swiften/Parser/PayloadParsers/MIXSubscribeParser.h
deleted file mode 100644
index 95d6d74..0000000
--- a/Swiften/Parser/PayloadParsers/MIXSubscribeParser.h
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright (c) 2017 Tarun Gupta
- * Licensed under the simplified BSD license.
- * See Documentation/Licenses/BSD-simplified.txt for more information.
- */
-
-/*
- * Copyright (c) 2017 Isode Limited.
- * All rights reserved.
- * See the COPYING file for more information.
- */
-
-#pragma once
-
-#include <memory>
-
-#include <Swiften/Base/API.h>
-#include <Swiften/Elements/MIXSubscribe.h>
-#include <Swiften/Parser/GenericPayloadParser.h>
-
-namespace Swift {
- class PayloadParserFactoryCollection;
- class PayloadParser;
-
- class SWIFTEN_API MIXSubscribeParser : public GenericPayloadParser<MIXSubscribe> {
- public:
- MIXSubscribeParser();
- virtual ~MIXSubscribeParser() override;
-
- virtual void handleStartElement(const std::string& element, const std::string&, const AttributeMap& attributes) override;
- virtual void handleEndElement(const std::string& element, const std::string&) override;
- virtual void handleCharacterData(const std::string& data) override;
-
- private:
- int level_;
- };
-}
diff --git a/Swiften/Parser/PayloadParsers/MIXUpdateSubscriptionParser.cpp b/Swiften/Parser/PayloadParsers/MIXUpdateSubscriptionParser.cpp
new file mode 100644
index 0000000..d530e49
--- /dev/null
+++ b/Swiften/Parser/PayloadParsers/MIXUpdateSubscriptionParser.cpp
@@ -0,0 +1,49 @@
+/*
+ * Copyright (c) 2017 Tarun Gupta
+ * Licensed under the simplified BSD license.
+ * See Documentation/Licenses/BSD-simplified.txt for more information.
+ */
+
+#include <Swiften/Parser/PayloadParsers/MIXUpdateSubscriptionParser.h>
+
+#include <boost/optional.hpp>
+
+#include <Swiften/Parser/PayloadParserFactory.h>
+#include <Swiften/Parser/PayloadParsers/FormParser.h>
+
+namespace Swift {
+
+MIXUpdateSubscriptionParser::MIXUpdateSubscriptionParser() : level_(0) {
+}
+
+MIXUpdateSubscriptionParser::~MIXUpdateSubscriptionParser() {
+}
+
+void MIXUpdateSubscriptionParser::handleStartElement(const std::string& element, const std::string& ns, const AttributeMap& attributes) {
+ if (level_ == 0) {
+ if (boost::optional<std::string> attributeValue = attributes.getAttributeValue("jid")) {
+ if (boost::optional<JID> jid = JID::parse(*attributeValue)) {
+ getPayloadInternal()->setJID(*jid);
+ }
+ }
+ }
+
+ if (level_ == 1) {
+ if (element == "subscribe" && ns == "urn:xmpp:mix:0") {
+ if (boost::optional<std::string> attributeValue = attributes.getAttributeValue("node")) {
+ getPayloadInternal()->addSubscription(*attributeValue);
+ }
+ }
+ }
+
+ ++level_;
+}
+
+void MIXUpdateSubscriptionParser::handleEndElement(const std::string&, const std::string&) {
+ --level_;
+}
+
+void MIXUpdateSubscriptionParser::handleCharacterData(const std::string&) {
+}
+
+}
diff --git a/Swiften/Parser/PayloadParsers/MIXUpdateSubscriptionParser.h b/Swiften/Parser/PayloadParsers/MIXUpdateSubscriptionParser.h
new file mode 100644
index 0000000..47966ff
--- /dev/null
+++ b/Swiften/Parser/PayloadParsers/MIXUpdateSubscriptionParser.h
@@ -0,0 +1,36 @@
+/*
+ * Copyright (c) 2017 Tarun Gupta
+ * Licensed under the simplified BSD license.
+ * See Documentation/Licenses/BSD-simplified.txt for more information.
+ */
+
+/*
+ * Copyright (c) 2017-2018 Isode Limited.
+ * All rights reserved.
+ * See the COPYING file for more information.
+ */
+
+#pragma once
+
+#include <memory>
+
+#include <Swiften/Base/API.h>
+#include <Swiften/Elements/MIXUpdateSubscription.h>
+#include <Swiften/Parser/GenericPayloadParser.h>
+
+namespace Swift {
+ class PayloadParser;
+
+ class SWIFTEN_API MIXUpdateSubscriptionParser : public GenericPayloadParser<MIXUpdateSubscription> {
+ public:
+ MIXUpdateSubscriptionParser();
+ virtual ~MIXUpdateSubscriptionParser() override;
+
+ virtual void handleStartElement(const std::string& element, const std::string&, const AttributeMap& attributes) override;
+ virtual void handleEndElement(const std::string& element, const std::string&) override;
+ virtual void handleCharacterData(const std::string& data) override;
+
+ private:
+ int level_;
+ };
+}
diff --git a/Swiften/Parser/PayloadParsers/ReferencePayloadParser.cpp b/Swiften/Parser/PayloadParsers/ReferencePayloadParser.cpp
new file mode 100644
index 0000000..a337a29
--- /dev/null
+++ b/Swiften/Parser/PayloadParsers/ReferencePayloadParser.cpp
@@ -0,0 +1,79 @@
+/*
+ * Copyright (c) 2018 Isode Limited.
+ * All rights reserved.
+ * See the COPYING file for more information.
+ */
+
+#include <Swiften/Parser/PayloadParsers/ReferencePayloadParser.h>
+
+#include <cassert>
+#include <iostream>
+
+#include <Swiften/Parser/PayloadParserFactory.h>
+#include <Swiften/Parser/PayloadParserFactoryCollection.h>
+
+namespace Swift {
+
+ReferencePayloadParser::ReferencePayloadParser(PayloadParserFactoryCollection* factories) : factories_(factories) {
+}
+
+ReferencePayload::Type ReferencePayloadParser::getTypeFromString(const std::string& typeString) const {
+ if (typeString == "data") {
+ return ReferencePayload::Type::Data;
+ }
+ else if (typeString == "mention") {
+ return ReferencePayload::Type::Mention;
+ }
+ else if (typeString == "pubsub") {
+ return ReferencePayload::Type::PubSub;
+ }
+ else {
+ return ReferencePayload::Type::Unknown;
+ }
+}
+
+void ReferencePayloadParser::handleStartElement(const std::string& element, const std::string& ns, const AttributeMap& attributes) {
+ if (level_ == topLevel_) {
+ if (element == "reference") {
+ getPayloadInternal()->setType(getTypeFromString(attributes.getAttribute("type")));
+ getPayloadInternal()->setUri(attributes.getAttributeValue("uri"));
+ getPayloadInternal()->setBegin(attributes.getAttributeValue("begin"));
+ getPayloadInternal()->setEnd(attributes.getAttributeValue("end"));
+ getPayloadInternal()->setAnchor(attributes.getAttributeValue("anchor"));
+ }
+ }
+ else if (level_ == payloadLevel_) {
+ PayloadParserFactory* payloadParserFactory = factories_->getPayloadParserFactory(element, ns, attributes);
+ if (payloadParserFactory) {
+ currentPayloadParser_.reset(payloadParserFactory->createPayloadParser());
+ }
+ }
+
+ if (level_ >= payloadLevel_ && currentPayloadParser_) {
+ currentPayloadParser_->handleStartElement(element, ns, attributes);
+ }
+
+ ++level_;
+}
+
+void ReferencePayloadParser::handleEndElement(const std::string& element, const std::string& ns) {
+ --level_;
+ if (currentPayloadParser_) {
+ if (level_ >= payloadLevel_) {
+ currentPayloadParser_->handleEndElement(element, ns);
+ }
+
+ if (level_ == payloadLevel_) {
+ getPayloadInternal()->addPayload(currentPayloadParser_->getPayload());
+ currentPayloadParser_.reset();
+ }
+ }
+}
+
+void ReferencePayloadParser::handleCharacterData(const std::string& data) {
+ if (level_ > payloadLevel_ && currentPayloadParser_) {
+ currentPayloadParser_->handleCharacterData(data);
+ }
+}
+
+}
diff --git a/Swiften/Parser/PayloadParsers/ReferencePayloadParser.h b/Swiften/Parser/PayloadParsers/ReferencePayloadParser.h
new file mode 100644
index 0000000..3afd181
--- /dev/null
+++ b/Swiften/Parser/PayloadParsers/ReferencePayloadParser.h
@@ -0,0 +1,35 @@
+/*
+ * Copyright (c) 2018 Isode Limited.
+ * All rights reserved.
+ * See the COPYING file for more information.
+ */
+
+#pragma once
+
+#include <Swiften/Base/API.h>
+#include <Swiften/Elements/ReferencePayload.h>
+#include <Swiften/Parser/GenericPayloadParser.h>
+
+namespace Swift {
+
+ class PayloadParserFactoryCollection;
+
+ class SWIFTEN_API ReferencePayloadParser : public GenericPayloadParser<ReferencePayload> {
+ public:
+
+ ReferencePayloadParser(PayloadParserFactoryCollection* factories);
+
+ virtual void handleStartElement(const std::string& element, const std::string& ns, const AttributeMap& attributes);
+ virtual void handleEndElement(const std::string& element, const std::string& ns);
+ virtual void handleCharacterData(const std::string& data);
+
+ private:
+
+ ReferencePayload::Type getTypeFromString(const std::string& typeString) const;
+ int level_ = 0;
+ const int topLevel_ = 0;
+ const int payloadLevel_ = 1;
+ PayloadParserFactoryCollection* factories_;
+ std::shared_ptr<PayloadParser> currentPayloadParser_;
+ };
+}
diff --git a/Swiften/Parser/PayloadParsers/S5BProxyRequestParser.cpp b/Swiften/Parser/PayloadParsers/S5BProxyRequestParser.cpp
index 502f400..7a5a1fd 100644
--- a/Swiften/Parser/PayloadParsers/S5BProxyRequestParser.cpp
+++ b/Swiften/Parser/PayloadParsers/S5BProxyRequestParser.cpp
@@ -5,7 +5,7 @@
*/
/*
- * Copyright (c) 2015-2016 Isode Limited.
+ * Copyright (c) 2015-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -13,6 +13,7 @@
#include <Swiften/Parser/PayloadParsers/S5BProxyRequestParser.h>
#include <boost/lexical_cast.hpp>
+#include <boost/numeric/conversion/cast.hpp>
#include <boost/optional.hpp>
namespace Swift {
@@ -27,15 +28,14 @@ void S5BProxyRequestParser::handleStartElement(const std::string& element, const
if (element == "streamhost") {
if (attributes.getAttributeValue("host") && attributes.getAttributeValue("jid") && attributes.getAttributeValue("port")) {
std::string host = attributes.getAttributeValue("host").get_value_or("");
- int port = -1;
+ unsigned short port = 0;
JID jid = attributes.getAttributeValue("jid").get_value_or("");
try {
- port = boost::lexical_cast<int>(attributes.getAttributeValue("port").get());
- } catch (boost::bad_lexical_cast &) {
- port = -1;
+ port = boost::numeric_cast<unsigned short>(boost::lexical_cast<int>(attributes.getAttributeValue("port").get()));
+ } catch (...) {
}
- if (!host.empty() && port != -1 && jid.isValid()) {
+ if (!host.empty() && port != 0 && jid.isValid()) {
S5BProxyRequest::StreamHost streamHost;
streamHost.host = host;
streamHost.port = port;
diff --git a/Swiften/Parser/PayloadParsers/UnitTest/MIXJoinParserTest.cpp b/Swiften/Parser/PayloadParsers/UnitTest/MIXJoinParserTest.cpp
index 88d8fc1..0ad4589 100644
--- a/Swiften/Parser/PayloadParsers/UnitTest/MIXJoinParserTest.cpp
+++ b/Swiften/Parser/PayloadParsers/UnitTest/MIXJoinParserTest.cpp
@@ -30,12 +30,11 @@ TEST(MIXJoinParserTest, XEP0369_Example22) {
ASSERT_FALSE(payload->getJID());
ASSERT_FALSE(payload->getForm());
- const std::vector<MIXSubscribe::ref> items = payload->getSubscriptions();
- ASSERT_EQ(static_cast<size_t>(4), items.size());
- ASSERT_EQ(std::string("urn:xmpp:mix:nodes:messages"), items[0]->getNode());
- ASSERT_EQ(std::string("urn:xmpp:mix:nodes:presence"), items[1]->getNode());
- ASSERT_EQ(std::string("urn:xmpp:mix:nodes:participants"), items[2]->getNode());
- ASSERT_EQ(std::string("urn:xmpp:mix:nodes:config"), items[3]->getNode());
+ ASSERT_EQ(static_cast<size_t>(4), payload->getSubscriptions().size());
+ ASSERT_TRUE(payload->hasSubscription(std::string("urn:xmpp:mix:nodes:messages")));
+ ASSERT_TRUE(payload->hasSubscription(std::string("urn:xmpp:mix:nodes:presence")));
+ ASSERT_TRUE(payload->hasSubscription(std::string("urn:xmpp:mix:nodes:participants")));
+ ASSERT_TRUE(payload->hasSubscription(std::string("urn:xmpp:mix:nodes:config")));
}
TEST(MIXJoinParserTest, XEP0369_Example23) {
@@ -56,12 +55,11 @@ TEST(MIXJoinParserTest, XEP0369_Example23) {
ASSERT_FALSE(payload->getJID());
ASSERT_FALSE(payload->getForm());
- const std::vector<MIXSubscribe::ref> items = payload->getSubscriptions();
- ASSERT_EQ(static_cast<size_t>(4), items.size());
- ASSERT_EQ(std::string("urn:xmpp:mix:nodes:messages"), items[0]->getNode());
- ASSERT_EQ(std::string("urn:xmpp:mix:nodes:presence"), items[1]->getNode());
- ASSERT_EQ(std::string("urn:xmpp:mix:nodes:participants"), items[2]->getNode());
- ASSERT_EQ(std::string("urn:xmpp:mix:nodes:config"), items[3]->getNode());
+ ASSERT_EQ(static_cast<size_t>(4), payload->getSubscriptions().size());
+ ASSERT_TRUE(payload->hasSubscription(std::string("urn:xmpp:mix:nodes:messages")));
+ ASSERT_TRUE(payload->hasSubscription(std::string("urn:xmpp:mix:nodes:presence")));
+ ASSERT_TRUE(payload->hasSubscription(std::string("urn:xmpp:mix:nodes:participants")));
+ ASSERT_TRUE(payload->hasSubscription(std::string("urn:xmpp:mix:nodes:config")));
}
TEST(MIXJoinParserTest, XEP0369_Example24) {
@@ -83,12 +81,11 @@ TEST(MIXJoinParserTest, XEP0369_Example24) {
ASSERT_EQ(JID("123456#coven@mix.shakespeare.example"), *payload->getJID());
ASSERT_FALSE(payload->getForm());
- const std::vector<MIXSubscribe::ref> items = payload->getSubscriptions();
- ASSERT_EQ(static_cast<size_t>(4), items.size());
- ASSERT_EQ(std::string("urn:xmpp:mix:nodes:messages"), items[0]->getNode());
- ASSERT_EQ(std::string("urn:xmpp:mix:nodes:presence"), items[1]->getNode());
- ASSERT_EQ(std::string("urn:xmpp:mix:nodes:participants"), items[2]->getNode());
- ASSERT_EQ(std::string("urn:xmpp:mix:nodes:config"), items[3]->getNode());
+ ASSERT_EQ(static_cast<size_t>(4), payload->getSubscriptions().size());
+ ASSERT_TRUE(payload->hasSubscription(std::string("urn:xmpp:mix:nodes:messages")));
+ ASSERT_TRUE(payload->hasSubscription(std::string("urn:xmpp:mix:nodes:presence")));
+ ASSERT_TRUE(payload->hasSubscription(std::string("urn:xmpp:mix:nodes:participants")));
+ ASSERT_TRUE(payload->hasSubscription(std::string("urn:xmpp:mix:nodes:config")));
}
TEST(MIXJoinParserTest, XEP0369_Example29) {
@@ -112,10 +109,10 @@ TEST(MIXJoinParserTest, XEP0369_Example29) {
ASSERT_FALSE(payload->getChannel());
ASSERT_FALSE(payload->getJID());
- const std::vector<MIXSubscribe::ref> items = payload->getSubscriptions();
- ASSERT_EQ(static_cast<size_t>(2), items.size());
- ASSERT_EQ(std::string("urn:xmpp:mix:nodes:messages"), items[0]->getNode());
- ASSERT_EQ(std::string("urn:xmpp:mix:nodes:presence"), items[1]->getNode());
+
+ ASSERT_EQ(static_cast<size_t>(2), payload->getSubscriptions().size());
+ ASSERT_TRUE(payload->hasSubscription(std::string("urn:xmpp:mix:nodes:messages")));
+ ASSERT_TRUE(payload->hasSubscription(std::string("urn:xmpp:mix:nodes:presence")));
ASSERT_TRUE(payload->getForm());
ASSERT_EQ(Form::Type::SubmitType, payload->getForm()->getType());
@@ -156,10 +153,9 @@ TEST(MIXJoinParserTest, XEP0369_Example30) {
ASSERT_TRUE(payload->getJID());
ASSERT_EQ(JID("hag66@shakespeare.example"), *payload->getJID());
- const std::vector<MIXSubscribe::ref> items = payload->getSubscriptions();
- ASSERT_EQ(static_cast<size_t>(2), items.size());
- ASSERT_EQ(std::string("urn:xmpp:mix:nodes:messages"), items[0]->getNode());
- ASSERT_EQ(std::string("urn:xmpp:mix:nodes:presence"), items[1]->getNode());
+ ASSERT_EQ(static_cast<size_t>(2), payload->getSubscriptions().size());
+ ASSERT_TRUE(payload->hasSubscription(std::string("urn:xmpp:mix:nodes:messages")));
+ ASSERT_TRUE(payload->hasSubscription(std::string("urn:xmpp:mix:nodes:presence")));
ASSERT_TRUE(payload->getForm());
ASSERT_EQ(Form::Type::ResultType, payload->getForm()->getType());
diff --git a/Swiften/Parser/PayloadParsers/UnitTest/MIXUpdateSubscriptionParserTest.cpp b/Swiften/Parser/PayloadParsers/UnitTest/MIXUpdateSubscriptionParserTest.cpp
new file mode 100644
index 0000000..985a34b
--- /dev/null
+++ b/Swiften/Parser/PayloadParsers/UnitTest/MIXUpdateSubscriptionParserTest.cpp
@@ -0,0 +1,49 @@
+/*
+ * Copyright (c) 2017 Tarun Gupta
+ * Licensed under the simplified BSD license.
+ * See Documentation/Licenses/BSD-simplified.txt for more information.
+ */
+
+#include <gtest/gtest.h>
+
+#include <Swiften/Elements/MIXUpdateSubscription.h>
+#include <Swiften/Parser/PayloadParsers/UnitTest/PayloadsParserTester.h>
+
+using namespace Swift;
+
+TEST(MIXUpdateSubscriptionParserTest, XEP0369_Example28) {
+ PayloadsParserTester parser;
+ ASSERT_TRUE(parser.parse(
+ "<update-subscription xmlns=\"urn:xmpp:mix:0\">"
+ "<subscribe node=\"urn:xmpp:mix:nodes:messages\"/>"
+ "</update-subscription>"
+ ));
+
+ auto payload = parser.getPayload<MIXUpdateSubscription>();
+ ASSERT_TRUE(payload);
+
+ ASSERT_FALSE(payload->getJID());
+
+ auto items = payload->getSubscriptions();
+ ASSERT_EQ(static_cast<size_t>(1), items.size());
+ ASSERT_TRUE(payload->hasSubscription(std::string("urn:xmpp:mix:nodes:messages")));
+}
+
+TEST(MIXUpdateSubscriptionParserTest, XEP0369_Example28_WithJID) {
+ PayloadsParserTester parser;
+ ASSERT_TRUE(parser.parse(
+ "<update-subscription xmlns=\"urn:xmpp:mix:0\" jid=\"hag66@shakespeare.example\">"
+ "<subscribe node=\"urn:xmpp:mix:nodes:messages\"/>"
+ "</update-subscription>"
+ ));
+
+ auto payload = parser.getPayload<MIXUpdateSubscription>();
+ ASSERT_TRUE(payload);
+
+ ASSERT_TRUE(payload->getJID());
+ ASSERT_EQ(JID("hag66@shakespeare.example"), *payload->getJID());
+
+ auto items = payload->getSubscriptions();
+ ASSERT_EQ(static_cast<size_t>(1), items.size());
+ ASSERT_TRUE(payload->hasSubscription(std::string("urn:xmpp:mix:nodes:messages")));
+}
diff --git a/Swiften/Parser/PayloadParsers/UnitTest/PayloadsParserTester.h b/Swiften/Parser/PayloadParsers/UnitTest/PayloadsParserTester.h
index dcdbffa..8f9e0e1 100644
--- a/Swiften/Parser/PayloadParsers/UnitTest/PayloadsParserTester.h
+++ b/Swiften/Parser/PayloadParsers/UnitTest/PayloadsParserTester.h
@@ -19,7 +19,7 @@ namespace Swift {
class PayloadsParserTester : public XMLParserClient {
public:
PayloadsParserTester() : level(0) {
- xmlParser = PlatformXMLParserFactory().createXMLParser(this);
+ xmlParser = PlatformXMLParserFactory().createXMLParser(this, false);
}
bool parse(const std::string& data) {
diff --git a/Swiften/Parser/PayloadParsers/UnitTest/ReferencePayloadParserTest.cpp b/Swiften/Parser/PayloadParsers/UnitTest/ReferencePayloadParserTest.cpp
new file mode 100644
index 0000000..ca7b280
--- /dev/null
+++ b/Swiften/Parser/PayloadParsers/UnitTest/ReferencePayloadParserTest.cpp
@@ -0,0 +1,134 @@
+/*
+ * Copyright (c) 2018 Isode Limited.
+ * All rights reserved.
+ * See the COPYING file for more information.
+ */
+
+#include <gtest/gtest.h>
+
+#include <Swiften/Elements/Body.h>
+#include <Swiften/Elements/Delay.h>
+#include <Swiften/Elements/ErrorPayload.h>
+#include <Swiften/Parser/PayloadParsers/ReferencePayloadParser.h>
+#include <Swiften/Parser/PayloadParsers/UnitTest/PayloadsParserTester.h>
+
+using namespace Swift;
+
+TEST(ReferencePayloadParserTest, testParse) {
+ PayloadsParserTester parser;
+
+ ASSERT_TRUE(parser.parse(
+ "<reference xmlns='urn:xmpp:reference:0' "
+ "type='data' "
+ "uri='https://www.example.com/mindBlowingImage.jpeg' "
+ "begin='11' "
+ "end='22' "
+ "anchor='xmpp:data@localhost.example.test'>"
+ "</reference>"));
+
+ auto payload = std::dynamic_pointer_cast<ReferencePayload>(parser.getPayload());
+ ASSERT_EQ(static_cast<int>(ReferencePayload::Type::Data), static_cast<int>(payload->getType()));
+ ASSERT_EQ(std::string("https://www.example.com/mindBlowingImage.jpeg"), *payload->getUri());
+ ASSERT_EQ(std::string("11"), *payload->getBegin());
+ ASSERT_EQ(std::string("22"), *payload->getEnd());
+ ASSERT_EQ(std::string("xmpp:data@localhost.example.test"), *payload->getAnchor());
+}
+
+TEST(ReferencePayloadParserTest, testParseNoType) {
+ PayloadsParserTester parser;
+
+ ASSERT_TRUE(parser.parse(
+ "<reference xmlns='urn:xmpp:reference:0' "
+ "uri='https://www.example.com/mindBlowingImage.jpeg' "
+ "begin='11' "
+ "end='22' "
+ "anchor='xmpp:data@localhost.example.test'>"
+ "</reference>"));
+
+ auto payload = std::dynamic_pointer_cast<ReferencePayload>(parser.getPayload());
+ ASSERT_EQ(static_cast<int>(ReferencePayload::Type::Unknown), static_cast<int>(payload->getType()));
+ ASSERT_EQ(std::string("https://www.example.com/mindBlowingImage.jpeg"), *payload->getUri());
+ ASSERT_EQ(std::string("11"), *payload->getBegin());
+ ASSERT_EQ(std::string("22"), *payload->getEnd());
+ ASSERT_EQ(std::string("xmpp:data@localhost.example.test"), *payload->getAnchor());
+}
+
+TEST(ReferencePayloadParserTest, testParseEmbeddedPayloads) {
+ PayloadsParserTester parser;
+
+ ASSERT_TRUE(parser.parse(
+ "<reference xmlns='urn:xmpp:reference:0' type='data'> "
+ "<error type=\"modify\">"
+ "<bad-request xmlns=\"urn:ietf:params:xml:ns:xmpp-stanzas\"/>"
+ "<delay xmlns='urn:xmpp:delay' from='juliet@capulet.com/balcony' stamp='2002-09-10T23:41:07Z'/>"
+ "<text xmlns=\"urn:ietf:params:xml:ns:xmpp-stanzas\">boo</text>"
+ "</error>"
+ "</reference>"));
+
+ auto payload = std::dynamic_pointer_cast<ReferencePayload>(parser.getPayload());
+ ASSERT_EQ(static_cast<int>(ReferencePayload::Type::Data), static_cast<int>(payload->getType()));
+ ASSERT_FALSE(payload->getUri());
+ ASSERT_FALSE(payload->getBegin());
+ ASSERT_FALSE(payload->getEnd());
+ ASSERT_FALSE(payload->getAnchor());
+ auto childPayloadList = payload->getPayloads();
+ auto errorPayload = std::dynamic_pointer_cast<ErrorPayload>(childPayloadList[0]);
+ ASSERT_TRUE(errorPayload);
+ ASSERT_EQ("boo", errorPayload->getText());
+ auto delayPayload = std::dynamic_pointer_cast<Delay>(errorPayload->getPayload());
+ ASSERT_TRUE(delayPayload);
+}
+
+TEST(ReferencePayloadParserTest, testParseEmbeddedPayloadWithText) {
+ PayloadsParserTester parser;
+
+ ASSERT_TRUE(parser.parse(
+ "<reference xmlns='urn:xmpp:reference:0' type='data'> "
+ "<body>Example Text</body>"
+ "</reference>"));
+
+ auto payload = std::dynamic_pointer_cast<ReferencePayload>(parser.getPayload());
+ auto childPayloadList = payload->getPayloads();
+ auto bodyPayload = std::dynamic_pointer_cast<Body>(childPayloadList[0]);
+ ASSERT_EQ("Example Text", bodyPayload->getText());
+}
+
+TEST(ReferencePayloadParserTest, testParseRecursive) {
+ PayloadsParserTester parser;
+
+ ASSERT_TRUE(parser.parse(
+ "<reference xmlns='urn:xmpp:reference:0' type='data'> "
+ "<reference xmlns='urn:xmpp:reference:0' type='data' uri='https://download.montague.lit/4a771ac1-f0b2-4a4a-9700-f2a26fa2bb67/summit.jpg' /> "
+ "<reference xmlns='urn:xmpp:reference:0' type='data' uri='xmpp:romeo@montague.lit/resource?jingle;id=9559976B-3FBF-4E7E-B457-2DAA225972BB' /> "
+ "<reference xmlns='urn:xmpp:reference:0' type='data'> "
+ "<reference xmlns='urn:xmpp:reference:0' type='data' uri='https://www.example.com/mindBlowingImage.jpeg' /> "
+ "</reference>"
+ "</reference>"));
+
+ auto payload = std::dynamic_pointer_cast<ReferencePayload>(parser.getPayload());
+ ASSERT_EQ(static_cast<int>(ReferencePayload::Type::Data), static_cast<int>(payload->getType()));
+ auto childPayloadList = payload->getPayloads();
+ auto childPayloadA = std::dynamic_pointer_cast<ReferencePayload>(childPayloadList[0]);
+ auto childPayloadB = std::dynamic_pointer_cast<ReferencePayload>(childPayloadList[1]);
+ auto childPayloadC = std::dynamic_pointer_cast<ReferencePayload>(childPayloadList[2]);
+ ASSERT_TRUE(childPayloadA);
+ ASSERT_TRUE(childPayloadB);
+ ASSERT_TRUE(childPayloadC);
+ ASSERT_EQ(static_cast<int>(ReferencePayload::Type::Data), static_cast<int>(childPayloadA->getType()));
+ ASSERT_EQ(static_cast<int>(ReferencePayload::Type::Data), static_cast<int>(childPayloadB->getType()));
+ ASSERT_EQ(static_cast<int>(ReferencePayload::Type::Data), static_cast<int>(childPayloadC->getType()));
+ ASSERT_EQ(std::string("https://download.montague.lit/4a771ac1-f0b2-4a4a-9700-f2a26fa2bb67/summit.jpg"), *childPayloadA->getUri());
+ ASSERT_EQ(std::string("xmpp:romeo@montague.lit/resource?jingle;id=9559976B-3FBF-4E7E-B457-2DAA225972BB"), *childPayloadB->getUri());
+ ASSERT_FALSE(childPayloadC->getUri());
+ ASSERT_FALSE(childPayloadC->getBegin());
+ ASSERT_FALSE(childPayloadC->getEnd());
+ ASSERT_FALSE(childPayloadC->getAnchor());
+ auto grandChildPayloadList = childPayloadC->getPayloads();
+ auto grandChildPayload = std::dynamic_pointer_cast<ReferencePayload>(grandChildPayloadList[0]);
+ ASSERT_TRUE(grandChildPayload);
+ ASSERT_EQ(static_cast<int>(ReferencePayload::Type::Data), static_cast<int>(grandChildPayload->getType()));
+ ASSERT_EQ(std::string("https://www.example.com/mindBlowingImage.jpeg"), *grandChildPayload->getUri());
+ ASSERT_FALSE(grandChildPayload->getBegin());
+ ASSERT_FALSE(grandChildPayload->getEnd());
+ ASSERT_FALSE(grandChildPayload->getAnchor());
+}
diff --git a/Swiften/Parser/PlatformXMLParserFactory.cpp b/Swiften/Parser/PlatformXMLParserFactory.cpp
index bf66734..a424aca 100644
--- a/Swiften/Parser/PlatformXMLParserFactory.cpp
+++ b/Swiften/Parser/PlatformXMLParserFactory.cpp
@@ -20,11 +20,11 @@ namespace Swift {
PlatformXMLParserFactory::PlatformXMLParserFactory() {
}
-std::unique_ptr<XMLParser> PlatformXMLParserFactory::createXMLParser(XMLParserClient* client) {
+std::unique_ptr<XMLParser> PlatformXMLParserFactory::createXMLParser(XMLParserClient* client, bool allowComments) {
#ifdef HAVE_LIBXML
- return std::make_unique<LibXMLParser>(client);
+ return std::make_unique<LibXMLParser>(client, allowComments);
#else
- return std::make_unique<ExpatParser>(client);
+ return std::make_unique<ExpatParser>(client, allowComments);
#endif
}
diff --git a/Swiften/Parser/PlatformXMLParserFactory.h b/Swiften/Parser/PlatformXMLParserFactory.h
index fa3ca19..d72a513 100644
--- a/Swiften/Parser/PlatformXMLParserFactory.h
+++ b/Swiften/Parser/PlatformXMLParserFactory.h
@@ -14,6 +14,6 @@ namespace Swift {
public:
PlatformXMLParserFactory();
- virtual std::unique_ptr<XMLParser> createXMLParser(XMLParserClient*);
+ virtual std::unique_ptr<XMLParser> createXMLParser(XMLParserClient*, bool allowComments = false);
};
}
diff --git a/Swiften/Parser/PresenceParser.cpp b/Swiften/Parser/PresenceParser.cpp
index 0235a12..f73e9d8 100644
--- a/Swiften/Parser/PresenceParser.cpp
+++ b/Swiften/Parser/PresenceParser.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2019 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -41,7 +41,7 @@ void PresenceParser::handleStanzaAttributes(const AttributeMap& attributes) {
getStanzaGeneric()->setType(Presence::Error);
}
else {
- SWIFT_LOG(error) << "Unknown Presence type: " << *type << std::endl;
+ SWIFT_LOG(error) << "Unknown Presence type: " << *type;
getStanzaGeneric()->setType(Presence::Available);
}
}
diff --git a/Swiften/Parser/SConscript b/Swiften/Parser/SConscript
index bfc7850..4ac5aa4 100644
--- a/Swiften/Parser/SConscript
+++ b/Swiften/Parser/SConscript
@@ -53,6 +53,7 @@ sources = [
"PayloadParsers/PriorityParser.cpp",
"PayloadParsers/PrivateStorageParser.cpp",
"PayloadParsers/RawXMLPayloadParser.cpp",
+ "PayloadParsers/ReferencePayloadParser.cpp",
"PayloadParsers/ResourceBindParser.cpp",
"PayloadParsers/RosterItemExchangeParser.cpp",
"PayloadParsers/RosterParser.cpp",
@@ -75,8 +76,8 @@ sources = [
"PayloadParsers/MIXPayloadParser.cpp",
"PayloadParsers/MIXLeaveParser.cpp",
"PayloadParsers/MIXJoinParser.cpp",
- "PayloadParsers/MIXSubscribeParser.cpp",
"PayloadParsers/MIXUserPreferenceParser.cpp",
+ "PayloadParsers/MIXUpdateSubscriptionParser.cpp",
"PayloadParsers/MUCUserPayloadParser.cpp",
"PayloadParsers/MUCAdminPayloadParser.cpp",
"PayloadParsers/MUCOwnerPayloadParser.cpp",
diff --git a/Swiften/Parser/StanzaAckParser.cpp b/Swiften/Parser/StanzaAckParser.cpp
index de0287e..42ab181 100644
--- a/Swiften/Parser/StanzaAckParser.cpp
+++ b/Swiften/Parser/StanzaAckParser.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010 Isode Limited.
+ * Copyright (c) 2010-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -17,7 +17,7 @@ void StanzaAckParser::handleStartElement(const std::string&, const std::string&,
if (depth == 0) {
std::string handledStanzasString = attributes.getAttribute("h");
try {
- getElementGeneric()->setHandledStanzasCount(boost::lexical_cast<int>(handledStanzasString));
+ getElementGeneric()->setHandledStanzasCount(boost::lexical_cast<unsigned int>(handledStanzasString));
}
catch (const boost::bad_lexical_cast &) {
}
diff --git a/Swiften/Parser/StreamErrorParser.cpp b/Swiften/Parser/StreamErrorParser.cpp
index 64e0681..e89af58 100644
--- a/Swiften/Parser/StreamErrorParser.cpp
+++ b/Swiften/Parser/StreamErrorParser.cpp
@@ -48,9 +48,6 @@ void StreamErrorParser::handleEndElement(const std::string& element, const std::
else if(element == "invalid-from") {
getElementGeneric()->setType(StreamError::InvalidFrom);
}
- else if(element == "invalid-id") {
- getElementGeneric()->setType(StreamError::InvalidID);
- }
else if(element == "invalid-namespace") {
getElementGeneric()->setType(StreamError::InvalidNamespace);
}
@@ -90,6 +87,9 @@ void StreamErrorParser::handleEndElement(const std::string& element, const std::
else if(element == "unsupported-encoding") {
getElementGeneric()->setType(StreamError::UnsupportedEncoding);
}
+ else if(element == "unsupported-feature") {
+ getElementGeneric()->setType(StreamError::UnsupportedFeature);
+ }
else if(element == "unsupported-stanza-type") {
getElementGeneric()->setType(StreamError::UnsupportedStanzaType);
}
diff --git a/Swiften/Parser/Tree/ParserElement.cpp b/Swiften/Parser/Tree/ParserElement.cpp
index 5415945..988bc13 100644
--- a/Swiften/Parser/Tree/ParserElement.cpp
+++ b/Swiften/Parser/Tree/ParserElement.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2011-2016 Isode Limited.
+ * Copyright (c) 2011-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -7,13 +7,8 @@
#include <Swiften/Parser/Tree/ParserElement.h>
-#include <boost/lambda/bind.hpp>
-#include <boost/lambda/lambda.hpp>
-
#include <Swiften/Parser/Tree/NullParserElement.h>
-namespace lambda = boost::lambda;
-
namespace Swift {
ParserElement::ParserElement(const std::string& name, const std::string& xmlns, const AttributeMap& attributes) : name_(name), xmlns_(xmlns), attributes_(attributes) {
@@ -34,8 +29,9 @@ void ParserElement::appendCharacterData(const std::string& data) {
std::vector<ParserElement::ref> ParserElement::getChildren(const std::string& name, const std::string& xmlns) const {
std::vector<ParserElement::ref> result;
- std::remove_copy_if(children_.begin(), children_.end(), std::back_inserter(result),
- lambda::bind(&ParserElement::getName, *lambda::_1) != name || lambda::bind(&ParserElement::getNamespace, *lambda::_1) != xmlns);
+ std::remove_copy_if(children_.begin(), children_.end(), std::back_inserter(result), [&](const ParserElement::ref& element) {
+ return (element->getName() != name) || (element->getNamespace() != xmlns);
+ });
return result;
}
diff --git a/Swiften/Parser/UnitTest/AttributeMapTest.cpp b/Swiften/Parser/UnitTest/AttributeMapTest.cpp
index 4529eac..d9335c1 100644
--- a/Swiften/Parser/UnitTest/AttributeMapTest.cpp
+++ b/Swiften/Parser/UnitTest/AttributeMapTest.cpp
@@ -15,6 +15,7 @@ class AttributeMapTest : public CppUnit::TestFixture
{
CPPUNIT_TEST_SUITE(AttributeMapTest);
CPPUNIT_TEST(testGetAttribute_Namespaced);
+ CPPUNIT_TEST(testGetAttribute_Namespaced_Prefix);
CPPUNIT_TEST(testGetBoolAttribute_True);
CPPUNIT_TEST(testGetBoolAttribute_1);
CPPUNIT_TEST(testGetBoolAttribute_False);
@@ -34,6 +35,22 @@ class AttributeMapTest : public CppUnit::TestFixture
CPPUNIT_ASSERT_EQUAL(std::string("en"), testling.getAttribute("lang", "http://www.w3.org/XML/1998/namespace"));
}
+ void testGetAttribute_Namespaced_Prefix() {
+ AttributeMap testling;
+ testling.addAttribute("lang", "", "prefix", "nl");
+ testling.addAttribute("lang", "http://www.w3.org/XML/1998/namespace", "prefix", "en");
+ testling.addAttribute("lang", "", "prefix", "fr");
+
+ CPPUNIT_ASSERT_EQUAL(std::string("en"), testling.getAttribute("lang", "http://www.w3.org/XML/1998/namespace"));
+ const auto& entries = testling.getEntries();
+ auto it = std::find_if(entries.begin(), entries.end(), [](const AttributeMap::Entry& e) {
+ return e.getValue() == "en";
+ });
+ const bool found = it != entries.end();
+ CPPUNIT_ASSERT_EQUAL(true, found);
+ CPPUNIT_ASSERT_EQUAL(std::string("prefix"), it->getAttribute().getPrefix());
+ }
+
void testGetBoolAttribute_True() {
AttributeMap testling;
testling.addAttribute("foo", "", "true");
diff --git a/Swiften/Parser/UnitTest/XMLParserTest.cpp b/Swiften/Parser/UnitTest/XMLParserTest.cpp
index b593aa7..89229c9 100644
--- a/Swiften/Parser/UnitTest/XMLParserTest.cpp
+++ b/Swiften/Parser/UnitTest/XMLParserTest.cpp
@@ -6,6 +6,7 @@
#include <cppunit/extensions/HelperMacros.h>
#include <cppunit/extensions/TestFactoryRegistry.h>
+#include <unordered_map>
#include <vector>
#include <string>
@@ -34,10 +35,17 @@ class XMLParserTest : public CppUnit::TestFixture {
CPPUNIT_TEST(testParse_WhitespaceInAttribute);
CPPUNIT_TEST(testParse_AttributeWithoutNamespace);
CPPUNIT_TEST(testParse_AttributeWithNamespace);
+ CPPUNIT_TEST(testParse_AttributeWithNamespaceNoPrefix);
CPPUNIT_TEST(testParse_BillionLaughs);
CPPUNIT_TEST(testParse_InternalEntity);
//CPPUNIT_TEST(testParse_UndefinedPrefix);
//CPPUNIT_TEST(testParse_UndefinedAttributePrefix);
+ CPPUNIT_TEST(testParse_AllowCommentsInXML);
+ CPPUNIT_TEST(testParse_DisallowCommentsInXML);
+ CPPUNIT_TEST(testParse_Doctype);
+ CPPUNIT_TEST(testParse_ProcessingInstructions);
+ CPPUNIT_TEST(testParse_ProcessingPrefixedElement);
+ CPPUNIT_TEST(testParse_InvalidlyEncodedInput);
CPPUNIT_TEST_SUITE_END();
public:
@@ -61,6 +69,9 @@ class XMLParserTest : public CppUnit::TestFixture {
CPPUNIT_ASSERT_EQUAL(std::string("query"), client_.events[1].data);
CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(0), client_.events[1].attributes.getEntries().size());
CPPUNIT_ASSERT_EQUAL(std::string("jabber:iq:version"), client_.events[1].ns);
+ CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(1), client_.events[1].namespaces.size());
+ CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(1), client_.events[1].namespaces.count(""));
+ CPPUNIT_ASSERT_EQUAL(std::string("jabber:iq:version"), client_.events[1].namespaces[""]);
CPPUNIT_ASSERT_EQUAL(Client::EndElement, client_.events[2].type);
CPPUNIT_ASSERT_EQUAL(std::string("query"), client_.events[2].data);
@@ -85,10 +96,13 @@ class XMLParserTest : public CppUnit::TestFixture {
CPPUNIT_ASSERT_EQUAL(std::string("query"), client_.events[0].data);
CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(0), client_.events[0].attributes.getEntries().size());
CPPUNIT_ASSERT_EQUAL(std::string("jabber:iq:version"), client_.events[0].ns);
+ CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(1), client_.events[0].namespaces.size());
+ CPPUNIT_ASSERT_EQUAL(std::string("jabber:iq:version"), client_.events[0].namespaces[""]);
CPPUNIT_ASSERT_EQUAL(Client::StartElement, client_.events[1].type);
CPPUNIT_ASSERT_EQUAL(std::string("name"), client_.events[1].data);
CPPUNIT_ASSERT_EQUAL(std::string("jabber:iq:version"), client_.events[1].ns);
+ CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(0), client_.events[1].namespaces.size());
CPPUNIT_ASSERT_EQUAL(Client::CharacterData, client_.events[2].type);
CPPUNIT_ASSERT_EQUAL(std::string("Swift"), client_.events[2].data);
@@ -161,6 +175,8 @@ class XMLParserTest : public CppUnit::TestFixture {
CPPUNIT_ASSERT_EQUAL(Client::StartElement, client_.events[0].type);
CPPUNIT_ASSERT_EQUAL(std::string("x"), client_.events[0].data);
CPPUNIT_ASSERT_EQUAL(std::string("bla"), client_.events[0].ns);
+ CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(1), client_.events[0].namespaces.size());
+ CPPUNIT_ASSERT_EQUAL(std::string("bla"), client_.events[0].namespaces["p"]);
CPPUNIT_ASSERT_EQUAL(Client::StartElement, client_.events[1].type);
CPPUNIT_ASSERT_EQUAL(std::string("y"), client_.events[1].data);
@@ -176,7 +192,7 @@ class XMLParserTest : public CppUnit::TestFixture {
}
void testParse_UnhandledXML() {
- ParserType testling(&client_);
+ ParserType testling(&client_, true);
CPPUNIT_ASSERT(testling.parse("<iq><!-- Testing --></iq>"));
@@ -217,6 +233,15 @@ class XMLParserTest : public CppUnit::TestFixture {
CPPUNIT_ASSERT_EQUAL(std::string("iq"), client_.events[1].data);
}
+ void testParse_CompleteDocument() {
+ ParserType testling(&client_);
+
+ CPPUNIT_ASSERT(!testling.parse("<iq", true));
+ CPPUNIT_ASSERT(!testling.parse("<iq>", true));
+ CPPUNIT_ASSERT(!testling.parse("<iq><child>foo</child>", true));
+ CPPUNIT_ASSERT(testling.parse("<iq><child>foo</child></iq>", true));
+ }
+
void testParse_WhitespaceInAttribute() {
ParserType testling(&client_);
@@ -242,6 +267,7 @@ class XMLParserTest : public CppUnit::TestFixture {
CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(1), client_.events[0].attributes.getEntries().size());
CPPUNIT_ASSERT_EQUAL(std::string("attr"), client_.events[0].attributes.getEntries()[0].getAttribute().getName());
CPPUNIT_ASSERT_EQUAL(std::string(""), client_.events[0].attributes.getEntries()[0].getAttribute().getNamespace());
+ CPPUNIT_ASSERT_EQUAL(std::string(""), client_.events[0].attributes.getEntries()[0].getAttribute().getPrefix());
}
void testParse_AttributeWithNamespace() {
@@ -253,6 +279,25 @@ class XMLParserTest : public CppUnit::TestFixture {
CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(1), client_.events[0].attributes.getEntries().size());
CPPUNIT_ASSERT_EQUAL(std::string("attr"), client_.events[0].attributes.getEntries()[0].getAttribute().getName());
CPPUNIT_ASSERT_EQUAL(std::string("http://swift.im/f"), client_.events[0].attributes.getEntries()[0].getAttribute().getNamespace());
+ CPPUNIT_ASSERT_EQUAL(std::string("f"), client_.events[0].attributes.getEntries()[0].getAttribute().getPrefix());
+ CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(2), client_.events[0].namespaces.size());
+ CPPUNIT_ASSERT_EQUAL(std::string("http://swift.im"), client_.events[0].namespaces[""]);
+ CPPUNIT_ASSERT_EQUAL(std::string("http://swift.im/f"), client_.events[0].namespaces["f"]);
+ }
+
+ void testParse_AttributeWithNamespaceNoPrefix() {
+ ParserType testling(&client_);
+
+ CPPUNIT_ASSERT(testling.parse(
+ "<query xmlns='http://swift.im' xmlns:f='http://swift.im/f' attr='3'/>"));
+
+ CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(1), client_.events[0].attributes.getEntries().size());
+ CPPUNIT_ASSERT_EQUAL(std::string("attr"), client_.events[0].attributes.getEntries()[0].getAttribute().getName());
+ CPPUNIT_ASSERT_EQUAL(std::string(""), client_.events[0].attributes.getEntries()[0].getAttribute().getNamespace());
+ CPPUNIT_ASSERT_EQUAL(std::string(""), client_.events[0].attributes.getEntries()[0].getAttribute().getPrefix());
+ CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(2), client_.events[0].namespaces.size());
+ CPPUNIT_ASSERT_EQUAL(std::string("http://swift.im"), client_.events[0].namespaces[""]);
+ CPPUNIT_ASSERT_EQUAL(std::string("http://swift.im/f"), client_.events[0].namespaces["f"]);
}
void testParse_BillionLaughs() {
@@ -292,6 +337,7 @@ class XMLParserTest : public CppUnit::TestFixture {
CPPUNIT_ASSERT_EQUAL(Client::StartElement, client_.events[0].type);
CPPUNIT_ASSERT_EQUAL(std::string("foo:bar"), client_.events[0].data);
CPPUNIT_ASSERT_EQUAL(std::string(""), client_.events[0].ns);
+ CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(0), client_.events[0].namespaces.size());
CPPUNIT_ASSERT_EQUAL(Client::StartElement, client_.events[1].type);
CPPUNIT_ASSERT_EQUAL(std::string("bla"), client_.events[1].data);
@@ -309,48 +355,136 @@ class XMLParserTest : public CppUnit::TestFixture {
void testParse_UndefinedAttributePrefix() {
ParserType testling(&client_);
- CPPUNIT_ASSERT(testling.parse(
- "<foo bar:baz='bla'/>"));
+ CPPUNIT_ASSERT(testling.parse("<foo bar:baz='bla'/>"));
CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(1), client_.events[0].attributes.getEntries().size());
CPPUNIT_ASSERT_EQUAL(std::string("bar:baz"), client_.events[0].attributes.getEntries()[0].getAttribute().getName());
}
+ void testParse_AllowCommentsInXML() {
+ ParserType testling(&client_, true);
+
+ CPPUNIT_ASSERT(testling.parse("<message><!-- Some More Comments Testing --></message>"));
+
+ CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(2), client_.events.size());
+
+ CPPUNIT_ASSERT_EQUAL(Client::StartElement, client_.events[0].type);
+ CPPUNIT_ASSERT_EQUAL(std::string("message"), client_.events[0].data);
+
+ CPPUNIT_ASSERT_EQUAL(Client::EndElement, client_.events[1].type);
+ CPPUNIT_ASSERT_EQUAL(std::string("message"), client_.events[1].data);
+ }
+
+ void testParse_DisallowCommentsInXML() {
+ ParserType testling(&client_);
+
+ CPPUNIT_ASSERT(!testling.parse("<message><!-- Some More Comments Testing --></message>"));
+ }
+
+ void testParse_Doctype() {
+ ParserType testling(&client_);
+
+ CPPUNIT_ASSERT(!testling.parse("<!DOCTYPE greeting SYSTEM \"hello.dtd\">"));
+ }
+
+ void testParse_ProcessingInstructions() {
+ ParserType testling(&client_);
+
+ CPPUNIT_ASSERT(!testling.parse("<?xml-stylesheet type=\"text/xsl\" href=\"Sample.xsl\"?>"));
+ }
+
+ void testParse_ProcessingPrefixedElement() {
+ client_.testingStartElementPrefix = true;
+ ParserType testling(&client_);
+
+ CPPUNIT_ASSERT(testling.parse("<prefix:message xmlns='uri' xmlns:prefix='uriPrefix'/>"));
+
+ CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(2), client_.events.size());
+
+ CPPUNIT_ASSERT_EQUAL(Client::StartElementPrefix, client_.events[0].type);
+ CPPUNIT_ASSERT_EQUAL(std::string("message"), client_.events[0].data);
+ CPPUNIT_ASSERT_EQUAL(std::string("uriPrefix"), client_.events[0].ns);
+ CPPUNIT_ASSERT_EQUAL(std::string("prefix"), client_.events[0].prefix);
+
+ CPPUNIT_ASSERT_EQUAL(Client::EndElement, client_.events[1].type);
+ CPPUNIT_ASSERT_EQUAL(std::string("message"), client_.events[1].data);
+ CPPUNIT_ASSERT_EQUAL(std::string("uriPrefix"), client_.events[1].ns);
+ }
+
+ void testParse_InvalidlyEncodedInput() {
+ ParserType testling(&client_);
+
+ // The following input was generated by a fuzzer, and triggered a crash in the LibXML2 parser because
+ // some types of error (buffer I/O errors, for instance) will not update the error in the parser context,
+ // and the code used to rely on that error always being set if parsing failed.
+ // This particular input will trick the parser into believing the encoding is UTF-16LE, which eventually will lead
+ // to two invalid encodings, followed by an I/O error. The latter will end parsing without updating the
+ // error in the parsing context, which used to trigger a crash.
+ testling.parse(std::string("<\0?\0\x80q type='get' id='aab9a'<<query xmlns='jabber:iq:roster'/>\x9b\x9b\x9b\x9b\x9b\x9b\x9b\x9b\x9b\x9b\x9b\x9b\x9b\x9b\x9b\x9b\x9b\x9b\x9b\x9b\x9b\x9b\x9b\x9b\x9b\x9b\x9b\x9b\x9b\x9b\x9b\x9b\x9b\x9b\x9b\x9b\x9b\x9b\x9b\x9b\x9b\x9b\x9b\x9b\x9b\x9b\x9b\x9b\x9b\x9b\x9b\x9b\x9b\x9b\x9b\x9b\x9b\x9b\x9b\x9b\x9b\x9b\x9b\x9b\x9b\x9b\x9b\x9b\x9b\x9b\x9b\x9b\x9b\x9b\x9b\x9b\x9b\x9b\x9b\x9b\x9b\x9b\x9b\x9b\x9b\x9b\x9b\x9b\x9b\x9b\x9b\x9b\x9b\x9b\x9b\x9b\x9b\x9b\x9b\x9b\x9b\x9b\x9b\x9b\x9b\x9b\x9b\x9b\x9b\x9b\x9b\x9b\x9b\x9b\x9b\x9b\x9b\x9b\x9b\x9b\x9b\x9b\x9b\x9b\x9b\x9b\x9b\x9b\x9b\x9b\x9b\x9b\x9b\x9b\x9b\x9b\x9b\x9b\x9b\x9b\x9b\x9b\x9b\x9b\x9b\x9b\x9b\x9b\x9b\x9b\x9b\x9b\x9b\x9b\x9b\x9b\x9b\x9br:i><quq:private'><storage xml s='s'\x00\x10</query></iq>", 271));
+ testling.parse("<iq type='get'\x9e\x9e\x9e\x9e\x9e\x9e\x9e\x9e\x9e\x9e\x9e\x9e\x9e\x9e\x9e\x9e\x9e\x9e\x9e\x9e\x9e\x9e\x9e\x9e\x9e\x9e\x9e\x9e\x9e\x9e\x9e\x9e\x9e\x9e\x9e\x9e\x9e\x9e\x9e\x9e\x9e\x9e\x9e\x9e\x9e\x9e\x9e\x9e\x9e\x9e\x9e\x9e\x9e\x9e\x9e\x9e\x9e\x9e\x9e\x9e\x9e\x9e\x9e\x9e\x9e\x9e\x9e\x9e\x9e\x9e\x9e\x9e\x9e\x9e\x9e\x9e\x9e\x9e\x9e\x9e\x9e\x9e\x9e\x9e\x9e\x9e\x9e\x9e\x9e\x9e\x9e\x9e\x9e\x9e\x9e\x9e\x9e\x9e\x9e\x9e\x9e\x9e\x9e\x9e\x9e\x9e\x9e\x9e\x9e\x9e\x9e\x9e\x9e\x9e\x9e to='ad5d8d2b25' ext='ca cs min@wonderland.t' id='aabda'><vCard xmlnr='vcard-temp'/>O/iq>");
+ testling.parse("<\xff\xff\xff\x7fype:'get' to='won\x84" "erland.lit' id='aabea'><tuery xmlns='\xd8Vtp://jabber.org/p\x88ot\x8b" "col/disco#info'/>abber.org/protocol/disco#Nnfo'/></iq>");
+ }
+
private:
class Client : public XMLParserClient {
public:
- enum Type { StartElement, EndElement, CharacterData };
+ using NamespaceMap = std::unordered_map<std::string /* prefix */, std::string /* uri */>;
+ enum Type { StartElement, StartElementPrefix, EndElement, CharacterData, NamespaceDefined };
struct Event {
Event(
Type type,
const std::string& data,
const std::string& ns,
- const AttributeMap& attributes)
- : type(type), data(data), ns(ns), attributes(attributes) {}
+ const std::string& prefix,
+ const AttributeMap& attributes,
+ NamespaceMap namespaces)
+ : type(type), data(data), ns(ns), prefix(prefix), attributes(attributes), namespaces(std::move(namespaces)) {}
+ Event(
+ Type type,
+ const std::string& data,
+ const std::string& ns,
+ const AttributeMap& attributes,
+ NamespaceMap namespaces = {})
+ : Event(type, data, ns, {}, attributes, std::move(namespaces)) {}
Event(Type type, const std::string& data, const std::string& ns = std::string())
- : type(type), data(data), ns(ns) {}
+ : Event(type, data, ns, "", AttributeMap(), NamespaceMap()) {}
Type type;
std::string data;
std::string ns;
+ std::string prefix;
AttributeMap attributes;
+ NamespaceMap namespaces;
};
Client() {}
- virtual void handleStartElement(const std::string& element, const std::string& ns, const AttributeMap& attributes) {
- events.push_back(Event(StartElement, element, ns, attributes));
+ void handleStartElement(const std::string& element, const std::string& ns, const AttributeMap& attributes) override {
+ if (testingStartElementPrefix) return;
+ events.push_back(Event(StartElement, element, ns, attributes, std::move(namespaces_)));
}
- virtual void handleEndElement(const std::string& element, const std::string& ns) {
+ void handleStartElementPrefix(const std::string& prefix, const std::string& uri, const std::string& name, const AttributeMap&) override {
+ if (!testingStartElementPrefix) return;
+ events.push_back(Event(StartElementPrefix, name, uri, prefix, AttributeMap(), NamespaceMap()));
+ }
+
+ void handleEndElement(const std::string& element, const std::string& ns) override {
events.push_back(Event(EndElement, element, ns));
}
- virtual void handleCharacterData(const std::string& data) {
+ void handleCharacterData(const std::string& data) override {
events.push_back(Event(CharacterData, data));
}
+ void handleNamespaceDeclaration(const std::string& prefix, const std::string& uri) override {
+ namespaces_[prefix] = uri;
+ }
+
std::vector<Event> events;
+ bool testingStartElementPrefix = false;
+ private:
+ NamespaceMap namespaces_;
} client_;
};
diff --git a/Swiften/Parser/XMLParser.cpp b/Swiften/Parser/XMLParser.cpp
index 8e92fe4..8a0799f 100644
--- a/Swiften/Parser/XMLParser.cpp
+++ b/Swiften/Parser/XMLParser.cpp
@@ -8,7 +8,7 @@
namespace Swift {
-XMLParser::XMLParser(XMLParserClient* client) : client_(client) {
+XMLParser::XMLParser(XMLParserClient* client, bool allowComments) : client_(client), allowComments_(allowComments){
}
XMLParser::~XMLParser() {
diff --git a/Swiften/Parser/XMLParser.h b/Swiften/Parser/XMLParser.h
index 8a73c3f..3b09d22 100644
--- a/Swiften/Parser/XMLParser.h
+++ b/Swiften/Parser/XMLParser.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010 Isode Limited.
+ * Copyright (c) 2010-2019 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -15,16 +15,21 @@ namespace Swift {
class SWIFTEN_API XMLParser {
public:
- XMLParser(XMLParserClient* client);
+ XMLParser(XMLParserClient* client, bool allowComments = false);
virtual ~XMLParser();
- virtual bool parse(const std::string& data) = 0;
+ virtual bool parse(const std::string& data, bool finalData = false) = 0;
XMLParserClient* getClient() const {
return client_;
}
+ bool allowsComments() const {
+ return allowComments_;
+ }
+
private:
XMLParserClient* client_;
+ const bool allowComments_ = false;
};
}
diff --git a/Swiften/Parser/XMLParserClient.cpp b/Swiften/Parser/XMLParserClient.cpp
index 6dc6db6..6698900 100644
--- a/Swiften/Parser/XMLParserClient.cpp
+++ b/Swiften/Parser/XMLParserClient.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010 Isode Limited.
+ * Copyright (c) 2010-2019 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -11,5 +11,14 @@ namespace Swift {
XMLParserClient::~XMLParserClient() {
}
+void XMLParserClient::handleStartElement(const std::string&, const std::string&, const AttributeMap&) {
+}
+
+void XMLParserClient::handleStartElementPrefix(const std::string&, const std::string&, const std::string&, const AttributeMap&) {
+}
+
+void XMLParserClient::handleNamespaceDeclaration(const std::string&, const std::string&) {
+}
+
}
diff --git a/Swiften/Parser/XMLParserClient.h b/Swiften/Parser/XMLParserClient.h
index e4346f6..2f0bc9e 100644
--- a/Swiften/Parser/XMLParserClient.h
+++ b/Swiften/Parser/XMLParserClient.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010 Isode Limited.
+ * Copyright (c) 2010-2019 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -14,8 +14,22 @@ namespace Swift {
public:
virtual ~XMLParserClient();
- virtual void handleStartElement(const std::string& element, const std::string& ns, const AttributeMap& attributes) = 0;
+ /**
+ * Client will have to implement only one of the following methods depending on whether
+ * he is interested in processing the element prefix or not.
+ */
+ virtual void handleStartElement(const std::string& element, const std::string& ns, const AttributeMap& attributes);
+ virtual void handleStartElementPrefix(const std::string& prefix, const std::string& uri, const std::string& element, const AttributeMap& attributes);
+
virtual void handleEndElement(const std::string& element, const std::string& ns) = 0;
virtual void handleCharacterData(const std::string& data) = 0;
+
+ /**
+ * Signal that a namespace prefix has been declared
+ * This callback might be called multiple times for a single element,
+ * and will trigger before the corresponding \ref handleStartElement
+ * is called.
+ */
+ virtual void handleNamespaceDeclaration(const std::string& prefix, const std::string& uri);
};
}
diff --git a/Swiften/Parser/XMLParserFactory.h b/Swiften/Parser/XMLParserFactory.h
index 595512b..ae3c90e 100644
--- a/Swiften/Parser/XMLParserFactory.h
+++ b/Swiften/Parser/XMLParserFactory.h
@@ -18,6 +18,6 @@ namespace Swift {
public:
virtual ~XMLParserFactory();
- virtual std::unique_ptr<XMLParser> createXMLParser(XMLParserClient*) = 0;
+ virtual std::unique_ptr<XMLParser> createXMLParser(XMLParserClient*, bool allowComments = false) = 0;
};
}
diff --git a/Swiften/QA/ClientTest/ClientTest.cpp b/Swiften/QA/ClientTest/ClientTest.cpp
index 5cb1765..c5117fa 100644
--- a/Swiften/QA/ClientTest/ClientTest.cpp
+++ b/Swiften/QA/ClientTest/ClientTest.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -8,6 +8,7 @@
#include <thread>
#include <boost/bind.hpp>
+#include <boost/numeric/conversion/cast.hpp>
#include <Swiften/Client/Client.h>
#include <Swiften/Client/ClientXMLTracer.h>
@@ -74,7 +75,17 @@ int main(int, char**) {
if (boshHost && boshPort && boshPath) {
std::cout << "Using BOSH with URL: http://" << boshHost << ":" << boshPort << boshPath << std::endl;
- options.boshURL = URL("http", boshHost, atoi(boshPort), boshPath);
+ try {
+ options.boshURL = URL("http", boshHost, boost::numeric_cast<unsigned short>(boost::lexical_cast<int>(boshPort)), boshPath);
+ }
+ catch (const boost::numeric::bad_numeric_cast& e) {
+ std::cerr << "SWIFT_CLIENTTEST_BOSH_PORT doesn't hold a valid port number: " << e.what() << std::endl;
+ return -1;
+ }
+ catch (const boost::bad_lexical_cast& e) {
+ std::cerr << "SWIFT_CLIENTTEST_BOSH_PORT doesn't hold a valid port number: " << e.what() << std::endl;
+ return -1;
+ }
}
client = new Swift::Client(JID(jid), std::string(pass), &networkFactories);
diff --git a/Swiften/QA/DNSSDTest/DNSSDTest.cpp b/Swiften/QA/DNSSDTest/DNSSDTest.cpp
index ae2fafd..5a78d2f 100644
--- a/Swiften/QA/DNSSDTest/DNSSDTest.cpp
+++ b/Swiften/QA/DNSSDTest/DNSSDTest.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -35,7 +35,7 @@ class DNSSDTest : public CppUnit::TestFixture {
public:
void setUp() {
eventLoop = new DummyEventLoop();
- querier = std::make_shared<DNSSDQuerier>();
+ querier = std::make_shared<DNSSDQuerierType>(eventLoop);
querier->start();
}
@@ -55,7 +55,7 @@ class DNSSDTest : public CppUnit::TestFixture {
// Publish the service
LinkLocalServiceInfo info;
- std::shared_ptr<DNSSDRegisterQuery> registerQuery = querier->createRegisterQuery("DNSSDTest", 1234, info.toTXTRecord());
+ std::shared_ptr<DNSSDRegisterQuery> registerQuery = querier->createRegisterQuery("DNSSDTest", 1234, *info.toTXTRecord());
registerQuery->onRegisterFinished.connect(boost::bind(&DNSSDTest::handleRegisterFinished, this, _1));
registerQuery->registerService();
@@ -137,7 +137,7 @@ class DNSSDTest : public CppUnit::TestFixture {
private:
DummyEventLoop* eventLoop;
- std::shared_ptr<DNSSDQuerier> querier;
+ std::shared_ptr<DNSSDQuerierType> querier;
std::vector<DNSSDServiceID> added;
std::vector<DNSSDServiceID> registered;
std::vector<DNSSDServiceID> toRemove;
diff --git a/Swiften/QA/DNSSDTest/SConscript b/Swiften/QA/DNSSDTest/SConscript
index 275a314..d9c9b04 100644
--- a/Swiften/QA/DNSSDTest/SConscript
+++ b/Swiften/QA/DNSSDTest/SConscript
@@ -7,6 +7,7 @@ if env["TEST"] :
myenv.MergeFlags(myenv["CHECKER_FLAGS"])
myenv.MergeFlags(myenv["SWIFTEN_FLAGS"])
myenv.MergeFlags(myenv["CPPUNIT_FLAGS"])
+ myenv.MergeFlags(myenv["GOOGLETEST_FLAGS"])
myenv.MergeFlags(myenv["BOOST_FLAGS"])
myenv.MergeFlags(myenv["LIBIDN_FLAGS"])
if myenv.get("HAVE_BONJOUR", 0) :
@@ -14,6 +15,7 @@ if env["TEST"] :
elif myenv.get("HAVE_AVAHI", 0) :
myenv.Append(CPPDEFINES = ["HAVE_AVAHI"])
myenv.MergeFlags(myenv["AVAHI_FLAGS"])
+ myenv.MergeFlags(myenv["PLATFORM_FLAGS"])
tester = myenv.Program("DNSSDTest", [
"DNSSDTest.cpp",
diff --git a/Swiften/QA/FileTransferTest/FileTransferTest.cpp b/Swiften/QA/FileTransferTest/FileTransferTest.cpp
index ebdb36a..7d69277 100644
--- a/Swiften/QA/FileTransferTest/FileTransferTest.cpp
+++ b/Swiften/QA/FileTransferTest/FileTransferTest.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2014-2016 Isode Limited.
+ * Copyright (c) 2014-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -8,7 +8,6 @@
#include <boost/algorithm/string.hpp>
#include <boost/filesystem.hpp>
-#include <boost/numeric/conversion/cast.hpp>
#include <Swiften/Base/Debug.h>
@@ -78,14 +77,14 @@ class FileTransferTest {
sendFilePath_ = boost::filesystem::unique_path("ft_send_%%%%%%%%%%%%%%%%.bin");
receiveFilePath_ = boost::filesystem::unique_path("ft_receive_%%%%%%%%%%%%%%%%.bin");
- size_t size = 1024 + boost::numeric_cast<size_t>(randGen.generateRandomInteger(1024 * 10));
+ size_t size = 1024 + static_cast<size_t>(randGen.generateRandomInteger(1024 * 10));
sendData_.resize(size);
for (unsigned char& n : sendData_) {
- n = boost::numeric_cast<unsigned char>(randGen.generateRandomInteger(255));
+ n = static_cast<unsigned char>(randGen.generateRandomInteger(255));
}
std::ofstream outfile(sendFilePath_.native().c_str(), std::ios::out | std::ios::binary);
- outfile.write(reinterpret_cast<char *>(&sendData_[0]), boost::numeric_cast<ptrdiff_t>(sendData_.size()));
+ outfile.write(reinterpret_cast<char *>(&sendData_[0]), static_cast<ptrdiff_t>(sendData_.size()));
outfile.close();
}
diff --git a/Swiften/QA/NetworkTest/DomainNameResolverTest.cpp b/Swiften/QA/NetworkTest/DomainNameResolverTest.cpp
index 95ebb6d..69e6fe8 100644
--- a/Swiften/QA/NetworkTest/DomainNameResolverTest.cpp
+++ b/Swiften/QA/NetworkTest/DomainNameResolverTest.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -179,19 +179,19 @@ class DomainNameResolverTest : public CppUnit::TestFixture {
CPPUNIT_ASSERT_EQUAL(4, static_cast<int>(serviceQueryResult.size()));
CPPUNIT_ASSERT_EQUAL(std::string("xmpp1.test.swift.im"), serviceQueryResult[0].hostname);
- CPPUNIT_ASSERT_EQUAL(5000, serviceQueryResult[0].port);
+ CPPUNIT_ASSERT_EQUAL(static_cast<unsigned short>(5000), serviceQueryResult[0].port);
CPPUNIT_ASSERT_EQUAL(0, serviceQueryResult[0].priority);
CPPUNIT_ASSERT_EQUAL(1, serviceQueryResult[0].weight);
CPPUNIT_ASSERT_EQUAL(std::string("xmpp-invalid.test.swift.im"), serviceQueryResult[1].hostname);
- CPPUNIT_ASSERT_EQUAL(5000, serviceQueryResult[1].port);
+ CPPUNIT_ASSERT_EQUAL(static_cast<unsigned short>(5000), serviceQueryResult[1].port);
CPPUNIT_ASSERT_EQUAL(1, serviceQueryResult[1].priority);
CPPUNIT_ASSERT_EQUAL(100, serviceQueryResult[1].weight);
CPPUNIT_ASSERT_EQUAL(std::string("xmpp3.test.swift.im"), serviceQueryResult[2].hostname);
- CPPUNIT_ASSERT_EQUAL(5000, serviceQueryResult[2].port);
+ CPPUNIT_ASSERT_EQUAL(static_cast<unsigned short>(5000), serviceQueryResult[2].port);
CPPUNIT_ASSERT_EQUAL(3, serviceQueryResult[2].priority);
CPPUNIT_ASSERT_EQUAL(100, serviceQueryResult[2].weight);
CPPUNIT_ASSERT_EQUAL(std::string("xmpp2.test.swift.im"), serviceQueryResult[3].hostname);
- CPPUNIT_ASSERT_EQUAL(5000, serviceQueryResult[3].port);
+ CPPUNIT_ASSERT_EQUAL(static_cast<unsigned short>(5000), serviceQueryResult[3].port);
CPPUNIT_ASSERT_EQUAL(5, serviceQueryResult[3].priority);
CPPUNIT_ASSERT_EQUAL(100, serviceQueryResult[3].weight);
}
diff --git a/Swiften/QA/StorageTest/SConscript b/Swiften/QA/StorageTest/SConscript
index b8360ec..46107a0 100644
--- a/Swiften/QA/StorageTest/SConscript
+++ b/Swiften/QA/StorageTest/SConscript
@@ -10,7 +10,8 @@ if env["TEST"] :
myenv.MergeFlags(myenv["CPPUNIT_FLAGS"])
myenv.MergeFlags(myenv["GOOGLETEST_FLAGS"])
myenv.MergeFlags(myenv["BOOST_FLAGS"])
- myenv.MergeFlags(myenv["LIBIDN_FLAGS"])
+ myenv.MergeFlags(myenv.get("LIBIDN_FLAGS", {}))
+ myenv.MergeFlags(myenv.get("ICU_FLAGS", {}))
myenv.MergeFlags(myenv.get("EXPAT_FLAGS", {}))
myenv.MergeFlags(myenv.get("LIBXML_FLAGS", {}))
myenv.MergeFlags(myenv["PLATFORM_FLAGS"])
diff --git a/Swiften/QA/TLSTest/CertificateTest.cpp b/Swiften/QA/TLSTest/CertificateTest.cpp
index 02ec0f8..463ef9e 100644
--- a/Swiften/QA/TLSTest/CertificateTest.cpp
+++ b/Swiften/QA/TLSTest/CertificateTest.cpp
@@ -15,6 +15,9 @@
#include <Swiften/Base/ByteArray.h>
#include <Swiften/TLS/CertificateFactory.h>
+#include <Swiften/TLS/TLSContext.h>
+#include <Swiften/TLS/PlatformTLSFactories.h>
+#include <Swiften/TLS/TLSContextFactory.h>
#include <SwifTools/Application/PlatformApplicationPathProvider.h>
@@ -30,13 +33,21 @@ class CertificateTest : public CppUnit::TestFixture {
CPPUNIT_TEST(testGetSRVNames);
CPPUNIT_TEST(testGetDNSNames);
CPPUNIT_TEST(testGetXMPPAddresses);
+ CPPUNIT_TEST(testCreateCertificateChain);
+ CPPUNIT_TEST(testCreateTlsContext);
+ CPPUNIT_TEST(testCreateTlsContextDisableSystemTAs);
CPPUNIT_TEST_SUITE_END();
public:
void setUp() {
pathProvider = std::make_unique<PlatformApplicationPathProvider>("FileReadBytestreamTest");
readByteArrayFromFile(certificateData, (pathProvider->getExecutableDir() / "jabber_org.crt"));
+ readByteArrayFromFile(chainData, (pathProvider->getExecutableDir() / "certificateChain.pem"));
+ readByteArrayFromFile(keyData, (pathProvider->getExecutableDir() / "privateKey.pem"));
certificateFactory = std::unique_ptr<CertificateFactory>(new CERTIFICATE_FACTORY());
+
+ PlatformTLSFactories* tlsFactories_ = new PlatformTLSFactories();
+ tlsContextFactory_ = tlsFactories_->getTLSContextFactory();
}
void testConstructFromDER() {
@@ -88,10 +99,68 @@ class CertificateTest : public CppUnit::TestFixture {
CPPUNIT_ASSERT_EQUAL(std::string("*.jabber.org"), testling->getXMPPAddresses()[0]);
}
+ void testCreateCertificateChain() {
+ // The input chain contains a 2-certificate chain:
+ // the first certificate has:
+ // a subject of "O=messaging,CN=Mixer Messaging Configuration,CN=badger.isode.net"
+ // an issuer of "O=messaging, CN=New Messaging CA"
+ // the second certificate has:
+ // a subject of "O=messaging, CN=New Messaging CA"
+ // an issuer of "O=messaging, CN=New Messaging CA"
+ // i.e. it is a self-signed certificate
+ std::vector<std::shared_ptr<Certificate>> chain = certificateFactory->createCertificateChain(chainData);
+ CPPUNIT_ASSERT_EQUAL(2,static_cast<int>(chain.size()));
+ CPPUNIT_ASSERT_EQUAL(std::string("Mixer Messaging Configuration"), chain[0]->getCommonNames()[0]);
+ CPPUNIT_ASSERT_EQUAL(std::string("badger.isode.net"), chain[0]->getCommonNames()[1]);
+ CPPUNIT_ASSERT_EQUAL(std::string("New Messaging CA"), chain[1]->getCommonNames()[0]);
+ }
+
+ void testCreateTlsContext() {
+ // Create 2-certificate chain as in previous test
+ std::vector<std::shared_ptr<Certificate>> chain = certificateFactory->createCertificateChain(chainData);
+ CPPUNIT_ASSERT_EQUAL(2,static_cast<int>(chain.size()));
+
+ // Load private key from string
+ PrivateKey::ref key = certificateFactory->createPrivateKey(Swift::createSafeByteArray(keyData));
+ CPPUNIT_ASSERT(key);
+
+ const TLSOptions options;
+ auto context = tlsContextFactory_->createTLSContext(options, TLSContext::Mode::Server);
+ CPPUNIT_ASSERT(context);
+
+ context->setCertificateChain(chain);
+ context->setPrivateKey(key);
+ }
+
+ /**
+ * This test does not actually verify that use of system TAs has been disabled, it just provides
+ * a convenient mechanism for testing via a debugger.
+ **/
+ void testCreateTlsContextDisableSystemTAs() {
+ // Create 2-certificate chain as in previous test
+ std::vector<std::shared_ptr<Certificate>> chain = certificateFactory->createCertificateChain(chainData);
+ CPPUNIT_ASSERT_EQUAL(2,static_cast<int>(chain.size()));
+
+ // Load private key from string
+ PrivateKey::ref key = certificateFactory->createPrivateKey(Swift::createSafeByteArray(keyData));
+ CPPUNIT_ASSERT(key);
+
+ // Turn off use of system TAs
+ TLSOptions options;
+ options.ignoreSystemTrustAnchors = true;
+ auto context = tlsContextFactory_->createTLSContext(options, TLSContext::Mode::Server);
+ CPPUNIT_ASSERT(context);
+
+ context->setCertificateChain(chain);
+ context->setPrivateKey(key);
+ }
private:
std::unique_ptr<PlatformApplicationPathProvider> pathProvider;
ByteArray certificateData;
+ ByteArray chainData;
+ ByteArray keyData;
std::unique_ptr<CertificateFactory> certificateFactory;
+ TLSContextFactory* tlsContextFactory_;
};
#ifdef HAVE_OPENSSL
diff --git a/Swiften/QA/TLSTest/SConscript b/Swiften/QA/TLSTest/SConscript
index 7811b50..81e2471 100644
--- a/Swiften/QA/TLSTest/SConscript
+++ b/Swiften/QA/TLSTest/SConscript
@@ -24,4 +24,4 @@ if env["TEST"] :
# Reenable if either http://www.tls-o-matic.com/ is fixed or we have setup a replacement.
#"CertificateErrorTest.cpp"
])
- myenv.Test(tester, "system") \ No newline at end of file
+ myenv.Test(tester, "system")
diff --git a/Swiften/QA/TLSTest/certificateChain.pem b/Swiften/QA/TLSTest/certificateChain.pem
new file mode 100644
index 0000000..cb3c0fb
--- /dev/null
+++ b/Swiften/QA/TLSTest/certificateChain.pem
@@ -0,0 +1,49 @@
+-----BEGIN CERTIFICATE-----
+MIIFFTCCA/2gAwIBAgIKXmMION+1bnZpIzANBgkqhkiG9w0BAQsFADAvMRIwEAYD
+VQQKEwltZXNzYWdpbmcxGTAXBgNVBAMTEE5ldyBNZXNzYWdpbmcgQ0EwHhcNMTkw
+NzI5MTAxMjMxWhcNMjAwNzI5MTAxMjMxWjBXMRIwEAYDVQQKEwltZXNzYWdpbmcx
+JjAkBgNVBAMTHU1peGVyIE1lc3NhZ2luZyBDb25maWd1cmF0aW9uMRkwFwYDVQQD
+ExBiYWRnZXIuaXNvZGUubmV0MIIBojANBgkqhkiG9w0BAQEFAAOCAY8AMIIBigKC
+AYEAt42TMYe9oO4K6XmvST4kiy4cG+nmVDCtZRfAfF/A+1GQXTZ8OfLbPF5noLIF
+f1Jj6fBDA2HiKoLQWfNnIklNEzgPbOREuAuCe660sW1JzJFr5O5qYyf6bHKkYmRr
+CGHJ3G5kkXZOW3MhczPNHrTIUSL7lYLMZAcyWStkhgBy7lBuYtgDEXbdRH8OGgly
+XC39AAU93y7ynw6W3SorU6h9cwvS0Ho8KVemCXoE38WLeSrIw1ks+Kf1YQopg9O3
+2SkXp6Z9elG5Wk5Rh0L0H2XHnAvmodr9TW6rtrPkJZfLL+NfcnGtI6QKnvL8EhYG
+d+XiPOV8jyGAFRC1Be72wlF29Rw20zdoD3kAdeqBLWfL8H9mnQpebEIDj8Lmahub
++W4uuUqCG8NuY43lGJzJni9CFWvhD7ss1yVGz84zqRHu5iXNDncWH2luJT1gXvFW
+6mxcfe+AwSiZ8PrhDQZBfTyx7ob4Ozdc1d59XTPyckj2msnCo2ayg+jKaViDd4vz
+nNwhAgMBAAGjggGJMIIBhTAbBgNVHREEFDASghBiYWRnZXIuaXNvZGUubmV0MA4G
+A1UdDwEB/wQEAwIF4DAMBgNVHRMBAf8EAjAAMHQGA1UdHwRtMGswaaBnoGWGY2xk
+YXA6Ly9kaWFib2xvLmlzb2RlLm5ldDoxOTM4OS9jbj1OZXclMjBNZXNzYWdpbmcl
+MjBDQSxvPW1lc3NhZ2luZz9jZXJ0aWZpY2F0ZVJldm9jYXRpb25MaXN0O2JpbmFy
+eTCBkQYIKwYBBQUHAQEEgYQwgYEwfwYIKwYBBQUHMAKGc2xkYXA6Ly9kaWFib2xv
+Lmlzb2RlLm5ldDoxOTM4OS9jbj1OZXclMjBNZXNzYWdpbmclMjBDQSxvPW1lc3Nh
+Z2luZz9jQUNlcnRpZmljYXRlO2JpbmFyeSxjcm9zc0NlcnRpZmljYXRlUGFpcjti
+aW5hcnkwHQYDVR0OBBYEFFjf69BczlDoKiSBSvxCr9sy0OJ2MB8GA1UdIwQYMBaA
+FJvoU0Lwg8vVCEmEMoKy29zFo/Y7MA0GCSqGSIb3DQEBCwUAA4IBAQCS4zLVH98S
+Cl4gsmTkxM+lBsdzQ18ymA6p9ZRXGmJ405C9rN7um9XnbWwOHO6ach7zie2GxWLp
+KOYKjX/5Pjt7mPwG8eKepPAxDenzKw5TocjscR9VxBsym0oEkWHPQG+xSqySQGUw
+/5QoGy6v06yE8CZ7BKHPh91Jy7IjIDBxWaEtTAPyuH4i4DnsmA0/xSrJ7ez6g399
+YgqDnBInC63bYv5IDD1CmEr/0boBWpsOf50OC6JVhaPLAldwTAxLSOMBJ4q4onXC
+ZqDHY3EMRtwYEffNg9ZorXJwLmU3Lq/R3B9lC22XNPDFj/bZ5RpwVFtuN5HfeZzO
+aPbNoa0Nf+QB
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIDJDCCAgygAwIBAgIKSm7KkUZOigMk9zANBgkqhkiG9w0BAQsFADAvMRIwEAYD
+VQQKEwltZXNzYWdpbmcxGTAXBgNVBAMTEE5ldyBNZXNzYWdpbmcgQ0EwHhcNMTYw
+MTI2MTU1MTU2WhcNMjYwMTI2MTU1MTU2WjAvMRIwEAYDVQQKEwltZXNzYWdpbmcx
+GTAXBgNVBAMTEE5ldyBNZXNzYWdpbmcgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IB
+DwAwggEKAoIBAQDgcuX1s8EvO8GDHx7vSW9oeDnLUBx5E48Vb2qcJVc34ik1j6ZV
+d8/+tzmyy/BskFbaOJ0KD5XYOoI8TJtu28lASWZj1vAEZkfrDdBbKeb1BQhShMt2
+ICgzp7l4ubwd6rqCGHpD/f12RVhSlU3y6TniaK62a9RwJOpL/wvnCcJLPjaTw8om
+EY62EyUP+FymUbo3Rb3aWLM7avHl1/32pyzUgRzvZR63hlMHnlE5Sgc84j9KMwJH
+k+mCyXIGPc+yhL33ljR63Eoiqynyk0HPU6pWai1WKuSv6zMDPwnNaJA3VpLNUHsd
+eVe1GyOmPFePnhRPZYfC+Dk8lxDUmZfNFKZlAgMBAAGjQjBAMA4GA1UdDwEB/wQE
+AwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBSb6FNC8IPL1QhJhDKCstvc
+xaP2OzANBgkqhkiG9w0BAQsFAAOCAQEApgA5oupwTS2Ylt9mhS/TDX9wzR0DqnC5
+t9skgU9B/1MnzgqEMKGmuhRBiqDyr0jsPegBFI/CpTdIpakpSUrIvBTZADzkrkI+
+3k2jnpEv0vodaFIHQonDysq5h4bXsCSdSprdhiUa1GKFtnJ92Ro/2Uaw5UcqFPCg
+7kj7RmRVlAIynUAT81cefQww0HBFPN9SdBEpp6YP4P1u1x8GV0Bfq93r4G5jkiHN
+dA6xejk7RZK4mTH+K2aFpWoHCqMr7RAzV5UiXis4cFAmtv+5K/G7eazNx0Y+ODo4
+fweh+xW+dOXuP1lzW4DzwhEf/8tgFgI0jIvscPgdgHY7t9SQRJPYQQ==
+-----END CERTIFICATE-----
diff --git a/Swiften/QA/TLSTest/privateKey.pem b/Swiften/QA/TLSTest/privateKey.pem
new file mode 100644
index 0000000..5769000
--- /dev/null
+++ b/Swiften/QA/TLSTest/privateKey.pem
@@ -0,0 +1,40 @@
+-----BEGIN PRIVATE KEY-----
+MIIG/wIBADANBgkqhkiG9w0BAQEFAASCBukwggblAgEAAoIBgQDu1QdEBrcWj+D/
+rkmh++QSu2f0qlJ6Re8dEBtbqpxLiyYZ5IeaLts9szXabfSTchdJr/d0IyHfHQFS
+MGXDphKRaNnV5r//XuojUtorPyGe0DnZR2mp8S9adD7WxNjQLSQabr8PPPW8jrTx
+eJyIvYToLs9lx1IIDcr/3ZTuhBe2FK3Q173M5GF36Jb4yKWLPIfJ6auZjO5G9LZF
+3o2vVWxfc7ESnXvf3sAcWQPR08/ud0vLa3W3A8dC0XGk4BbE32cxvSuzWPHZd257
+HiHIW5pKLZXSMTu7fVNzBzDlo8BYQ5kad1ic+hhyIHBwTUO0Hz3EYP+9FG3TNG84
+65K9EeN3/Qw2P9468GHWAXqlzKFiIGikxYHGwvGd0CdegHtZ/TwIgVvpIDp6XB6U
+ez/TYPEiMCqX8TCIQi8FU3obEouMoPMHKM8vzQdSItZtPn6gD16M4xKdMm6fbvCD
+1okdcrWQnZo72pp8cfpS87KhP5z1ec9B/Wqysh4nrO35v8LXH60CAwEAAQKCAYEA
+jPDUJ9XaqAriWaBtvZTbpB5KG72DjLrGgB0oN/E36PDF3FPbniZ2pTOj3TI0OesD
+SS351uSAsZz5UZpUA6B2pq78llllBnvpqkzTiN/ppEH3UXzuIya8riGZj758wGVT
+P/II+CIeVlbU+wcVQTCuRSKSq9pzU2NoX5RQtmznXUFYzbzzOf2wc0WkCk7GOqPO
+8l3eMXBUkTUKd7L9Y/ICUVYBsh2To6pdLp1tPp9DvtNRvEq/HfCx34GgEg9YAHhg
+1rcPhh71M+TLYHznl5r/Jm1kIVrP3zyr1Bm5DDgZLE3GTN/oFumgXQyFCPyslup1
+gdZzS6W+fbeKxoPzjPOhzHVUxVZ/yqJH1xa1gs4ECQ4QXxdnr7yY1H5k5S8dabO5
+bEvXP+tH95HcAtAbvoRt+NC+xIJ39d6X7X2c4TPLoMIxDxmbEOCi9sg+4Ws+7E2s
+a/01fTZFT+lzuGBdp9Zz/tltDrwfYD0V+Q7qO0o/nJPINI+alAWlqQia00ZyZr4V
+AoHBAPxwCls99/LUzY7IJc0TV3ukk3sFi3rt58u8BE4+RaCtmgPMDj1l+EnaY9RW
+IOj91ECZ8+a23elNPZOkXKuYuJmJIpjOogOMM8r+Q4WF87xoRcdcjPh+PBat66HZ
++8mbm0VQ98cjxs0/kTRRayzz7UG9Onf1PhFfnw55sbMGItVssRDi9lRZJdSRU+CC
+qyAt8TUEH0lo+8AKbRn7xW4VHiD0hmLKDi4F713QLCPgmNlPQ/C60FTIRYS18gzK
+ARhuzwKBwQDyM9YiiFFQ3irGKtbj9W3bDHNmMl9YOHMYVXJAvh83Zcp80qRsShtw
+n3mV3vcVI+KNeZtKFUrJIYNTspNBP/w8U4lGGW+7tAt0dd0WY9m3ygnZg0GOHoaC
+uUusGicZR7FgbYlJzCiRhFhWcFyh0VOrm/k7OjznAvwfWbRKrlLvQdrWrLj7dyN3
+8n9lArq9ZxXJLpBXDUJ1R+F+hPIIIRKeYF2ULUFNE0U9Pj7SVTT7L7jPMWKnrVJh
+U4/hVAEHyMMCgcB4hCTtmpAdZmscl4E0ft9tMA0Y1nTYo2veYEzN7fzf0QGOfoTt
+2xjGaXTvko7zrPsAPH+szfDzyOR08Cst4SOAaXAS89N1TiIL74fc3y6V7FIj85N5
+rwqQ6UdtZdxHS/q9BQLGF9Z5drej+proQywqDmUzj+mp8bTF/GNRzMQkkFeYcEKZ
+0lW1PgyFStzX6BcX8HffXDeUX2Xm2cRP4dUYdqUR1NUgM8UrTI9GMZvHY4hUDVwY
+neRSj2qXoHkVaRECgcEArilkM9S+VF5Nd85aU/WqFzeuy7AxK2j8KmVXEQMlw1oo
+7vUxUsU/Ug77CTAZkFQLlxv49J629kZo/wiMJwFxyZdwQL4NwHXJPud6IZ2Pcz+P
+MZ/WxfFhXCMOLSVpNB5/iA18CVsLWQhH1XBay+mQNvijkVlhbeSRk6GXqZQNAwrh
+6Divk/Opx5jSzrnVulikK9SV6mMYhOk5VxcWS44sq0I0SFb6fAf9Y/qchfbLcExy
+olqqzFQvxtilv6v+SbCtAoHBAOXPUQ7VVuQZo4HA+CaQRYgQjGMxo4jeGiqrUAaX
+b+MpUjU7VxiSrfH3wFxCuMfW7dfQJKp7BAG8PCNzP1eW3+LhPkRSPAT0nwk/bQ5E
+N/n6NBqwsJFoTqueS0qDVdPichwKGvnIrraHSVeMeHZNv+TQdMjmTJ5AfBNCal9b
+7EPTFQO0Tj4GAB77fVRzewyVB+qXccoD2Gts9aWbY9FVGyhkvRenL7CcbgrzLZvt
+php/1crfbWtZ/3Nwz6L8LEdZHA==
+-----END PRIVATE KEY-----
diff --git a/Swiften/Roster/XMPPRosterController.cpp b/Swiften/Roster/XMPPRosterController.cpp
index 8ee9755..2b98b53 100644
--- a/Swiften/Roster/XMPPRosterController.cpp
+++ b/Swiften/Roster/XMPPRosterController.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2019 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -66,7 +66,7 @@ void XMPPRosterController::handleRosterReceived(std::shared_ptr<RosterPayload> r
xmppRoster_->addContact(item.getJID(), item.getName(), item.getGroups(), item.getSubscription());
}
else {
- SWIFT_LOG(error) << "Stored invalid roster item" << std::endl;
+ SWIFT_LOG(error) << "Stored invalid roster item";
}
}
}
diff --git a/Swiften/SASL/UnitTest/WindowsServicePrincipalNameTest.cpp b/Swiften/SASL/UnitTest/WindowsServicePrincipalNameTest.cpp
index fa07052..ef3a9b3 100644
--- a/Swiften/SASL/UnitTest/WindowsServicePrincipalNameTest.cpp
+++ b/Swiften/SASL/UnitTest/WindowsServicePrincipalNameTest.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2015 Isode Limited.
+ * Copyright (c) 2015-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -97,16 +97,16 @@ class WindowsServicePrincipalNameTest : public CppUnit::TestFixture {
WindowsServicePrincipalName spn("adlon.isode.net");
spn.setInstanceName("mlink.adlon.isode.net");
- spn.setInstancePort(6222);
- CPPUNIT_ASSERT_EQUAL(spn.toString(), std::string("xmpp/mlink.adlon.isode.net:6222/adlon.isode.net"));
+ spn.setInstancePort(55222);
+ CPPUNIT_ASSERT_EQUAL(spn.toString(), std::string("xmpp/mlink.adlon.isode.net:55222/adlon.isode.net"));
spn.setInstancePort(0);
CPPUNIT_ASSERT_EQUAL(spn.toString(), std::string("xmpp/mlink.adlon.isode.net/adlon.isode.net"));
WindowsServicePrincipalName spn2("mlink.adlon.isode.net");
- spn2.setInstancePort(6222);
- CPPUNIT_ASSERT_EQUAL(spn2.toString(), std::string("xmpp/mlink.adlon.isode.net:6222"));
+ spn2.setInstancePort(55222);
+ CPPUNIT_ASSERT_EQUAL(spn2.toString(), std::string("xmpp/mlink.adlon.isode.net:55222"));
spn2.setInstancePort(0);
CPPUNIT_ASSERT_EQUAL(spn2.toString(), std::string("xmpp/mlink.adlon.isode.net"));
diff --git a/Swiften/SASL/WindowsAuthentication.cpp b/Swiften/SASL/WindowsAuthentication.cpp
index b86381b..f951fac 100644
--- a/Swiften/SASL/WindowsAuthentication.cpp
+++ b/Swiften/SASL/WindowsAuthentication.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2015-2016 Isode Limited.
+ * Copyright (c) 2015-2019 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -16,14 +16,14 @@
#define ASSIGN_ERROR(status, errorCode) \
{ \
errorCode = std::make_shared<boost::system::error_code>(status, boost::system::system_category()); \
- SWIFT_LOG(debug) << std::hex << "status: 0x" << status << ": " << errorCode->message() << std::endl; \
+ SWIFT_LOG(debug) << std::hex << "status: 0x" << status << ": " << errorCode->message(); \
}
#define ASSIGN_SEC_ERROR(status, errorCode) \
{ \
if (status == SEC_E_OK) \
{ \
- SWIFT_LOG(debug) << "success" << std::endl; \
+ SWIFT_LOG(debug) << "success"; \
} \
else { \
ASSIGN_ERROR(status, errorCode); \
@@ -46,14 +46,14 @@ std::shared_ptr<boost::system::error_code> getUserNameEx(std::string& userName,
std::size_t position;
userName = convertWStringToString(std::wstring(vecptr(value), length));
- SWIFT_LOG(debug) << "User Name: " << userName << std::endl;
+ SWIFT_LOG(debug) << "User Name: " << userName;
position = userName.find("\\");
clientName = userName.substr(position + 1);
- SWIFT_LOG(debug) << "Client name: " << clientName << std::endl;
+ SWIFT_LOG(debug) << "Client name: " << clientName;
serverName = userName.substr(0, position);
- SWIFT_LOG(debug) << "Server name: " << serverName << std::endl;
+ SWIFT_LOG(debug) << "Server name: " << serverName;
break;
}
@@ -161,7 +161,7 @@ std::shared_ptr<boost::system::error_code> initializeSecurityContext(const boost
}
if ((status == SEC_E_OK) || (status == SEC_I_COMPLETE_AND_CONTINUE) || (status == SEC_I_COMPLETE_NEEDED) || (status == SEC_I_CONTINUE_NEEDED)) {
outputToken = createSafeByteArray (static_cast<unsigned char *>(outputTokenBuffer.pvBuffer), outputTokenBuffer.cbBuffer);
- SWIFT_LOG(debug) << "outputToken.size(): " << outputToken.size() << std::endl;
+ SWIFT_LOG(debug) << "outputToken.size(): " << outputToken.size();
freeContextBuffer(outputTokenBuffer.pvBuffer);
return std::shared_ptr<boost::system::error_code>(); /* success */
@@ -229,7 +229,7 @@ std::shared_ptr<boost::system::error_code> decryptMessage(const PCtxtHandle cont
messageBuffer[1].cbBuffer = 0;
messageBuffer[1].pvBuffer = NULL;
- SWIFT_LOG(debug) << "inputMessage.size(): " << inputMessage.size() << std::endl;
+ SWIFT_LOG(debug) << "inputMessage.size(): " << inputMessage.size();
status = DecryptMessage(
contextHandle,
@@ -239,13 +239,13 @@ std::shared_ptr<boost::system::error_code> decryptMessage(const PCtxtHandle cont
ASSIGN_SEC_ERROR(status, errorCode);
if (status == SEC_E_OK) {
if (qualityOfProtection == SECQOP_WRAP_NO_ENCRYPT) {
- SWIFT_LOG(debug) << "Message was signed only" << std::endl;
+ SWIFT_LOG(debug) << "Message was signed only";
}
else {
- SWIFT_LOG(debug) << "Message was encrypted" << std::endl;
+ SWIFT_LOG(debug) << "Message was encrypted";
}
- SWIFT_LOG(debug) << "messageBuffer[1].cbBuffer: " << messageBuffer[1].cbBuffer << std::endl;
+ SWIFT_LOG(debug) << "messageBuffer[1].cbBuffer: " << messageBuffer[1].cbBuffer;
decrypted = createSafeByteArray (static_cast<unsigned char *>(messageBuffer[1].pvBuffer), messageBuffer[1].cbBuffer);
}
@@ -281,9 +281,9 @@ std::shared_ptr<boost::system::error_code> encryptMessage(const PCtxtHandle cont
messageBuffer[2].cbBuffer = sizes.cbBlockSize;
messageBuffer[2].pvBuffer = vecptr(blockSize);
- SWIFT_LOG(debug) << "sizes.cbSecurityTrailer: " << sizes.cbSecurityTrailer << std::endl;
- SWIFT_LOG(debug) << "inputMessage.size(): " << inputMessage.size() << std::endl;
- SWIFT_LOG(debug) << "sizes.cbBlockSize: " << sizes.cbBlockSize << std::endl;
+ SWIFT_LOG(debug) << "sizes.cbSecurityTrailer: " << sizes.cbSecurityTrailer;
+ SWIFT_LOG(debug) << "inputMessage.size(): " << inputMessage.size();
+ SWIFT_LOG(debug) << "sizes.cbBlockSize: " << sizes.cbBlockSize;
status = EncryptMessage(
contextHandle,
@@ -294,9 +294,9 @@ std::shared_ptr<boost::system::error_code> encryptMessage(const PCtxtHandle cont
if (status == SEC_E_OK) {
unsigned char* pointer;
- SWIFT_LOG(debug) << "messageBuffer[0].cbBuffer: " << messageBuffer[0].cbBuffer << std::endl;
- SWIFT_LOG(debug) << "messageBuffer[1].cbBuffer: " << messageBuffer[1].cbBuffer << std::endl;
- SWIFT_LOG(debug) << "messageBuffer[2].cbBuffer: " << messageBuffer[2].cbBuffer << std::endl;
+ SWIFT_LOG(debug) << "messageBuffer[0].cbBuffer: " << messageBuffer[0].cbBuffer;
+ SWIFT_LOG(debug) << "messageBuffer[1].cbBuffer: " << messageBuffer[1].cbBuffer;
+ SWIFT_LOG(debug) << "messageBuffer[2].cbBuffer: " << messageBuffer[2].cbBuffer;
output.resize(messageBuffer[0].cbBuffer + messageBuffer[1].cbBuffer + messageBuffer[2].cbBuffer);
pointer = vecptr(output);
diff --git a/Swiften/SASL/WindowsGSSAPIClientAuthenticator.cpp b/Swiften/SASL/WindowsGSSAPIClientAuthenticator.cpp
index aae437f..10e8c89 100644
--- a/Swiften/SASL/WindowsGSSAPIClientAuthenticator.cpp
+++ b/Swiften/SASL/WindowsGSSAPIClientAuthenticator.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2015-2016 Isode Limited.
+ * Copyright (c) 2015-2019 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -44,7 +44,7 @@ WindowsGSSAPIClientAuthenticator::~WindowsGSSAPIClientAuthenticator() {
}
boost::optional<SafeByteArray> WindowsGSSAPIClientAuthenticator::getResponse() const {
- SWIFT_LOG(debug) << "response_.size(): " << response_.size() << std::endl;
+ SWIFT_LOG(debug) << "response_.size(): " << response_.size();
return response_;
}
@@ -56,7 +56,7 @@ bool WindowsGSSAPIClientAuthenticator::setChallenge(const boost::optional<ByteAr
}
else if (step_ == SecurityLayerNegotiation) {
if (!challengeData) {
- SWIFT_LOG(debug) << "Empty message received from the server" << std::endl;
+ SWIFT_LOG(debug) << "Empty message received from the server";
error_ = true;
return false;
}
@@ -68,7 +68,7 @@ bool WindowsGSSAPIClientAuthenticator::setChallenge(const boost::optional<ByteAr
}
if (challenge.size() != 4) {
- SWIFT_LOG(debug) << "Token received from the server of incorrect length: " << challenge.size() << std::endl;
+ SWIFT_LOG(debug) << "Token received from the server of incorrect length: " << challenge.size();
error_ = true;
return false;
}
@@ -77,14 +77,14 @@ bool WindowsGSSAPIClientAuthenticator::setChallenge(const boost::optional<ByteAr
unsigned char serverSecurityLayer = challengePointer[0];
if (serverSecurityLayer == 0) {
- SWIFT_LOG(debug) << "Server supports unknown security layer, assuming no security layer" << std::endl;
+ SWIFT_LOG(debug) << "Server supports unknown security layer, assuming no security layer";
serverSecurityLayer = SECURITY_LAYER_NONE;
}
else if (serverSecurityLayer == SECURITY_LAYER_NONE) {
- SWIFT_LOG(debug) << "Server supports no security layer" << std::endl;
+ SWIFT_LOG(debug) << "Server supports no security layer";
}
else {
- SWIFT_LOG(debug) << "Server supports security layer" << std::endl;
+ SWIFT_LOG(debug) << "Server supports security layer";
}
unsigned int serverMaximumBuffer = (challengePointer[1] << 16) |
@@ -92,7 +92,7 @@ bool WindowsGSSAPIClientAuthenticator::setChallenge(const boost::optional<ByteAr
(challengePointer[3] << 0);
if ((serverSecurityLayer == SECURITY_LAYER_NONE) && (serverMaximumBuffer != 0)) {
- SWIFT_LOG(debug) << "Server supports no security layer but has maximum buffer size" << serverMaximumBuffer << std::endl;
+ SWIFT_LOG(debug) << "Server supports no security layer but has maximum buffer size" << serverMaximumBuffer;
error_ = true;
return false;
}
@@ -158,7 +158,7 @@ void WindowsGSSAPIClientAuthenticator::buildSecurityContext(const boost::optiona
}
if (contextSupported & ISC_REQ_MUTUAL_AUTH == 0) {
- SWIFT_LOG(debug) << "Mutual authentication not supported" << std::endl;
+ SWIFT_LOG(debug) << "Mutual authentication not supported";
error_ = true;
return;
}
@@ -181,14 +181,14 @@ void WindowsGSSAPIClientAuthenticator::buildSecurityContext(const boost::optiona
}
userName_ = names.sUserName;
- SWIFT_LOG(debug) << "User name: " << userName_ << std::endl;
+ SWIFT_LOG(debug) << "User name: " << userName_;
std::size_t position = userName_.find("\\");
clientName_ = userName_.substr(position + 1);
- SWIFT_LOG(debug) << "Client name: " << clientName_ << std::endl;
+ SWIFT_LOG(debug) << "Client name: " << clientName_;
serverName_ = userName_.substr(0, position);
- SWIFT_LOG(debug) << "Server name: " << serverName_ << std::endl;
+ SWIFT_LOG(debug) << "Server name: " << serverName_;
freeContextBuffer(names.sUserName);
step_ = SecurityLayerNegotiation;
diff --git a/Swiften/SASL/WindowsServicePrincipalName.cpp b/Swiften/SASL/WindowsServicePrincipalName.cpp
index 419395c..6c87925 100644
--- a/Swiften/SASL/WindowsServicePrincipalName.cpp
+++ b/Swiften/SASL/WindowsServicePrincipalName.cpp
@@ -64,7 +64,7 @@ std::string WindowsServicePrincipalName::toString() {
firstCall = false;
}
- SWIFT_LOG(debug) << "SPN: " << str << std::endl;
+ SWIFT_LOG(debug) << "SPN: " << str;
return str;
}
@@ -72,17 +72,17 @@ DWORD WindowsServicePrincipalName::dsMakeSpn(DWORD* length, wchar_t* value) {
DWORD status;
#ifdef UNICODE
- SWIFT_LOG(debug) << "UNICODE is defined" << std::endl;
+ SWIFT_LOG(debug) << "UNICODE is defined";
#else
- SWIFT_LOG(debug) << "UNICODE is not defined" << std::endl;
+ SWIFT_LOG(debug) << "UNICODE is not defined";
#endif
- SWIFT_LOG(debug) << "serviceClass_: " << convertWStringToString(serviceClass_.c_str()) << std::endl;
- SWIFT_LOG(debug) << "serviceName_: " << convertWStringToString(serviceName_.c_str()) << std::endl;
- SWIFT_LOG(debug) << "instanceName_: " << convertWStringToString(instanceName_.c_str()) << std::endl;
- SWIFT_LOG(debug) << "referrer_: " << convertWStringToString(referrer_.c_str()) << std::endl;
- SWIFT_LOG(debug) << "instancePort_: " << instancePort_ << std::endl;
- SWIFT_LOG(debug) << "length: " << *length << std::endl;
+ SWIFT_LOG(debug) << "serviceClass_: " << convertWStringToString(serviceClass_.c_str());
+ SWIFT_LOG(debug) << "serviceName_: " << convertWStringToString(serviceName_.c_str());
+ SWIFT_LOG(debug) << "instanceName_: " << convertWStringToString(instanceName_.c_str());
+ SWIFT_LOG(debug) << "referrer_: " << convertWStringToString(referrer_.c_str());
+ SWIFT_LOG(debug) << "instancePort_: " << instancePort_;
+ SWIFT_LOG(debug) << "length: " << *length;
/* Call the Unicode function because that is recommended:
https://msdn.microsoft.com/en-us/library/windows/desktop/ff381407%28v=vs.85%29.aspx */
@@ -97,7 +97,7 @@ https://msdn.microsoft.com/en-us/library/windows/desktop/ff381407%28v=vs.85%29.a
if (status != ERROR_SUCCESS) {
boost::system::error_code errorCode(status, boost::system::system_category());
- SWIFT_LOG(debug) << std::hex << "status: 0x" << status << ": " << errorCode.message() << std::endl;
+ SWIFT_LOG(debug) << std::hex << "status: 0x" << status << ": " << errorCode.message();
}
return status;
diff --git a/Swiften/SASL/WindowsServicePrincipalName.h b/Swiften/SASL/WindowsServicePrincipalName.h
index 4c9f557..2e4e5c4 100644
--- a/Swiften/SASL/WindowsServicePrincipalName.h
+++ b/Swiften/SASL/WindowsServicePrincipalName.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2015 Isode Limited.
+ * Copyright (c) 2015-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -49,7 +49,7 @@ namespace Swift {
* it remain 0 to indicate that the default port is
* used.
*/
- void setInstancePort(short int instancePort) { instancePort_ = instancePort; }
+ void setInstancePort(unsigned short instancePort) { instancePort_ = instancePort; }
/*
* This follows the rules of SPN creation on Windows and
diff --git a/Swiften/SConscript b/Swiften/SConscript
index bd1faf9..7ea7355 100644
--- a/Swiften/SConscript
+++ b/Swiften/SConscript
@@ -12,7 +12,7 @@ external_swiften_dep_modules = ["BOOST"]
if env["SCONS_STAGE"] == "flags" :
env["SWIFTEN_DLL"] = env["swiften_dll"]
env["SWIFTEN_VERSION"] = Version.getBuildVersion(env.Dir("#").abspath, "swift")
- version_match = re.match("(\d+)\.(\d+).*", env["SWIFTEN_VERSION"])
+ version_match = re.match(r"(\d+)\.(\d+).*", env["SWIFTEN_VERSION"])
if version_match :
env["SWIFTEN_VERSION_MAJOR"] = int(version_match.group(1))
env["SWIFTEN_VERSION_MINOR"] = int(version_match.group(2))
@@ -142,6 +142,7 @@ if env["SCONS_STAGE"] == "build" :
"Elements/PubSubPayload.cpp",
"Elements/PubSubOwnerPayload.cpp",
"Elements/PubSubEventPayload.cpp",
+ "Elements/ReferencePayload.cpp",
"Elements/RosterItemExchangePayload.cpp",
"Elements/RosterPayload.cpp",
"Elements/SecurityLabel.cpp",
@@ -164,6 +165,8 @@ if env["SCONS_STAGE"] == "build" :
"Elements/IsodeIQDelegation.cpp",
"Entity/Entity.cpp",
"Entity/PayloadPersister.cpp",
+ "MIX/MIX.cpp",
+ "MIX/MIXImpl.cpp",
"MUC/MUC.cpp",
"MUC/MUCImpl.cpp",
"MUC/MUCManager.cpp",
@@ -216,13 +219,14 @@ if env["SCONS_STAGE"] == "build" :
"Serializer/PayloadSerializers/MIXUserPreferenceSerializer.cpp",
"Serializer/PayloadSerializers/MIXLeaveSerializer.cpp",
"Serializer/PayloadSerializers/MIXJoinSerializer.cpp",
- "Serializer/PayloadSerializers/MIXSubscribeSerializer.cpp",
+ "Serializer/PayloadSerializers/MIXUpdateSubscriptionSerializer.cpp",
"Serializer/PayloadSerializers/MUCPayloadSerializer.cpp",
"Serializer/PayloadSerializers/MUCUserPayloadSerializer.cpp",
"Serializer/PayloadSerializers/MUCAdminPayloadSerializer.cpp",
"Serializer/PayloadSerializers/MUCOwnerPayloadSerializer.cpp",
"Serializer/PayloadSerializers/MUCDestroyPayloadSerializer.cpp",
"Serializer/PayloadSerializers/MUCInvitationPayloadSerializer.cpp",
+ "Serializer/PayloadSerializers/ReferencePayloadSerializer.cpp",
"Serializer/PayloadSerializers/ResourceBindSerializer.cpp",
"Serializer/PayloadSerializers/RosterItemExchangeSerializer.cpp",
"Serializer/PayloadSerializers/RosterSerializer.cpp",
@@ -379,6 +383,7 @@ if env["SCONS_STAGE"] == "build" :
File("Avatars/UnitTest/CombinedAvatarProviderTest.cpp"),
File("Avatars/UnitTest/AvatarManagerImplTest.cpp"),
File("Base/UnitTest/IDGeneratorTest.cpp"),
+ File("Base/UnitTest/LogTest.cpp"),
File("Base/UnitTest/LRUCacheTest.cpp"),
File("Base/UnitTest/SimpleIDGeneratorTest.cpp"),
File("Base/UnitTest/StringTest.cpp"),
@@ -415,6 +420,7 @@ if env["SCONS_STAGE"] == "build" :
File("LinkLocal/UnitTest/LinkLocalServiceBrowserTest.cpp"),
File("LinkLocal/UnitTest/LinkLocalServiceInfoTest.cpp"),
File("LinkLocal/UnitTest/LinkLocalServiceTest.cpp"),
+ File("MIX/UnitTest/MIXImplTest.cpp"),
File("MUC/UnitTest/MUCTest.cpp"),
File("MUC/UnitTest/MockMUC.cpp"),
File("Network/UnitTest/HostAddressTest.cpp"),
@@ -434,6 +440,7 @@ if env["SCONS_STAGE"] == "build" :
File("Parser/PayloadParsers/UnitTest/CommandParserTest.cpp"),
File("Parser/PayloadParsers/UnitTest/PriorityParserTest.cpp"),
File("Parser/PayloadParsers/UnitTest/RawXMLPayloadParserTest.cpp"),
+ File("Parser/PayloadParsers/UnitTest/ReferencePayloadParserTest.cpp"),
File("Parser/PayloadParsers/UnitTest/ResourceBindParserTest.cpp"),
File("Parser/PayloadParsers/UnitTest/RosterItemExchangeParserTest.cpp"),
File("Parser/PayloadParsers/UnitTest/RosterParserTest.cpp"),
@@ -442,6 +449,7 @@ if env["SCONS_STAGE"] == "build" :
File("Parser/PayloadParsers/UnitTest/JingleParserTest.cpp"),
File("Parser/PayloadParsers/UnitTest/MIXParticipantParserTest.cpp"),
File("Parser/PayloadParsers/UnitTest/MIXPayloadParserTest.cpp"),
+ File("Parser/PayloadParsers/UnitTest/MIXUpdateSubscriptionParserTest.cpp"),
File("Parser/PayloadParsers/UnitTest/MIXRegisterNickParserTest.cpp"),
File("Parser/PayloadParsers/UnitTest/MIXSetNickParserTest.cpp"),
File("Parser/PayloadParsers/UnitTest/MIXDestroyParserTest.cpp"),
@@ -510,6 +518,7 @@ if env["SCONS_STAGE"] == "build" :
File("Serializer/PayloadSerializers/UnitTest/ErrorSerializerTest.cpp"),
File("Serializer/PayloadSerializers/UnitTest/IBBSerializerTest.cpp"),
File("Serializer/PayloadSerializers/UnitTest/PrioritySerializerTest.cpp"),
+ File("Serializer/PayloadSerializers/UnitTest/ReferencePayloadSerializerTest.cpp"),
File("Serializer/PayloadSerializers/UnitTest/ResourceBindSerializerTest.cpp"),
File("Serializer/PayloadSerializers/UnitTest/RosterItemExchangeSerializerTest.cpp"),
File("Serializer/PayloadSerializers/UnitTest/RosterSerializerTest.cpp"),
@@ -530,6 +539,7 @@ if env["SCONS_STAGE"] == "build" :
File("Serializer/PayloadSerializers/UnitTest/MUCAdminPayloadSerializerTest.cpp"),
File("Serializer/PayloadSerializers/UnitTest/MIXParticipantSerializerTest.cpp"),
File("Serializer/PayloadSerializers/UnitTest/MIXSetNickSerializerTest.cpp"),
+ File("Serializer/PayloadSerializers/UnitTest/MIXUpdateSubscriptionSerializerTest.cpp"),
File("Serializer/PayloadSerializers/UnitTest/MIXRegisterNickSerializerTest.cpp"),
File("Serializer/PayloadSerializers/UnitTest/MIXDestroySerializerTest.cpp"),
File("Serializer/PayloadSerializers/UnitTest/MIXCreateSerializerTest.cpp"),
@@ -570,6 +580,10 @@ if env["SCONS_STAGE"] == "build" :
File("Whiteboard/UnitTest/WhiteboardServerTest.cpp"),
File("Whiteboard/UnitTest/WhiteboardClientTest.cpp"),
])
+ if env.get("HAVE_OPENSSL", 0) :
+ env.Append(UNITTEST_SOURCES = [
+ File("TLS/UnitTest/ClientServerTest.cpp"),
+ ])
# Generate the Swiften header
def relpath(path, start) :
@@ -580,6 +594,8 @@ if env["SCONS_STAGE"] == "build" :
swiften_public_includes = []
top_path = env.Dir("..").abspath
for root, dirs, files in os.walk(env.Dir(".").abspath) :
+ dirs.sort()
+ files.sort()
if root.endswith("UnitTest") :
continue
for file in files :
@@ -630,8 +646,9 @@ if env["SCONS_STAGE"] == "build" :
# Install swiften
if swiften_env.get("SWIFTEN_INSTALLDIR", "") :
- swiften_env.Install(os.path.join(swiften_env["SWIFTEN_INSTALLDIR"], "lib"), swiften_lib)
+ swiften_libdir = swiften_env.get("SWIFTEN_LIBDIR", "lib")
+ swiften_env.Install(os.path.join(swiften_env["SWIFTEN_INSTALLDIR"], swiften_libdir), swiften_lib)
for alias in myenv["SWIFTEN_LIBRARY_ALIASES"] :
- myenv.Command(myenv.File(os.path.join(swiften_env["SWIFTEN_INSTALLDIR"], "lib", alias)), [env.Value(swiften_lib[0].name), swiften_lib[0]], symlink)
+ myenv.Command(myenv.File(os.path.join(swiften_env["SWIFTEN_INSTALLDIR"], swiften_libdir, alias)), [env.Value(swiften_lib[0].name), swiften_lib[0]], symlink)
for include in swiften_includes :
swiften_env.Install(os.path.join(swiften_env["SWIFTEN_INSTALLDIR"], "include", os.path.dirname(include)), "#/" + include)
diff --git a/Swiften/Serializer/PayloadSerializers/BytestreamsSerializer.cpp b/Swiften/Serializer/PayloadSerializers/BytestreamsSerializer.cpp
index 78bb0eb..37a9c03 100644
--- a/Swiften/Serializer/PayloadSerializers/BytestreamsSerializer.cpp
+++ b/Swiften/Serializer/PayloadSerializers/BytestreamsSerializer.cpp
@@ -25,7 +25,7 @@ std::string BytestreamsSerializer::serializePayload(std::shared_ptr<Bytestreams>
std::shared_ptr<XMLElement> streamHostElement(new XMLElement("streamhost"));
streamHostElement->setAttribute("host", streamHost.host);
streamHostElement->setAttribute("jid", streamHost.jid.toString());
- streamHostElement->setAttribute("port", boost::lexical_cast<std::string>(streamHost.port));
+ streamHostElement->setAttribute("port", std::to_string(streamHost.port));
queryElement.addNode(streamHostElement);
}
diff --git a/Swiften/Serializer/PayloadSerializers/FullPayloadSerializerCollection.cpp b/Swiften/Serializer/PayloadSerializers/FullPayloadSerializerCollection.cpp
index d1b2e97..31294f1 100644
--- a/Swiften/Serializer/PayloadSerializers/FullPayloadSerializerCollection.cpp
+++ b/Swiften/Serializer/PayloadSerializers/FullPayloadSerializerCollection.cpp
@@ -47,6 +47,7 @@
#include <Swiften/Serializer/PayloadSerializers/MAMResultSerializer.h>
#include <Swiften/Serializer/PayloadSerializers/MIXJoinSerializer.h>
#include <Swiften/Serializer/PayloadSerializers/MIXDestroySerializer.h>
+#include <Swiften/Serializer/PayloadSerializers/MIXUpdateSubscriptionSerializer.h>
#include <Swiften/Serializer/PayloadSerializers/MIXParticipantSerializer.h>
#include <Swiften/Serializer/PayloadSerializers/MIXRegisterNickSerializer.h>
#include <Swiften/Serializer/PayloadSerializers/MIXCreateSerializer.h>
@@ -68,6 +69,7 @@
#include <Swiften/Serializer/PayloadSerializers/PubSubOwnerPubSubSerializer.h>
#include <Swiften/Serializer/PayloadSerializers/PubSubSerializer.h>
#include <Swiften/Serializer/PayloadSerializers/RawXMLPayloadSerializer.h>
+#include <Swiften/Serializer/PayloadSerializers/ReferencePayloadSerializer.h>
#include <Swiften/Serializer/PayloadSerializers/ReplaceSerializer.h>
#include <Swiften/Serializer/PayloadSerializers/ResourceBindSerializer.h>
#include <Swiften/Serializer/PayloadSerializers/ResultSetSerializer.h>
@@ -172,6 +174,7 @@ FullPayloadSerializerCollection::FullPayloadSerializerCollection() {
serializers_.push_back(new MIXLeaveSerializer());
serializers_.push_back(new MIXJoinSerializer());
serializers_.push_back(new MIXDestroySerializer());
+ serializers_.push_back(new MIXUpdateSubscriptionSerializer());
serializers_.push_back(new MAMResultSerializer(this));
serializers_.push_back(new MAMQuerySerializer());
serializers_.push_back(new MAMFinSerializer());
@@ -184,6 +187,8 @@ FullPayloadSerializerCollection::FullPayloadSerializerCollection() {
serializers_.push_back(new IsodeIQDelegationSerializer(this));
+ serializers_.push_back(new ReferencePayloadSerializer(this));
+
for (auto serializer : serializers_) {
addSerializer(serializer);
}
diff --git a/Swiften/Serializer/PayloadSerializers/IBBSerializer.cpp b/Swiften/Serializer/PayloadSerializers/IBBSerializer.cpp
index e41ff8c..74a8e7b 100644
--- a/Swiften/Serializer/PayloadSerializers/IBBSerializer.cpp
+++ b/Swiften/Serializer/PayloadSerializers/IBBSerializer.cpp
@@ -26,7 +26,7 @@ std::string IBBSerializer::serializePayload(std::shared_ptr<IBB> ibb) const {
XMLElement ibbElement("data", "http://jabber.org/protocol/ibb");
ibbElement.setAttribute("sid", ibb->getStreamID());
if (ibb->getSequenceNumber() >= 0) {
- ibbElement.setAttribute("seq", boost::lexical_cast<std::string>(ibb->getSequenceNumber()));
+ ibbElement.setAttribute("seq", std::to_string(ibb->getSequenceNumber()));
}
ibbElement.addNode(std::make_shared<XMLTextNode>(Base64::encode(ibb->getData())));
return ibbElement.serialize();
@@ -39,7 +39,7 @@ std::string IBBSerializer::serializePayload(std::shared_ptr<IBB> ibb) const {
case IBB::MessageStanza: ibbElement.setAttribute("stanza", "message"); break;
}
assert(ibb->getBlockSize() > 0);
- ibbElement.setAttribute("block-size", boost::lexical_cast<std::string>(ibb->getBlockSize()));
+ ibbElement.setAttribute("block-size", std::to_string(ibb->getBlockSize()));
return ibbElement.serialize();
}
case IBB::Close: {
diff --git a/Swiften/Serializer/PayloadSerializers/JingleFileTransferFileInfoSerializer.cpp b/Swiften/Serializer/PayloadSerializers/JingleFileTransferFileInfoSerializer.cpp
index 35a0a6e..95996c7 100644
--- a/Swiften/Serializer/PayloadSerializers/JingleFileTransferFileInfoSerializer.cpp
+++ b/Swiften/Serializer/PayloadSerializers/JingleFileTransferFileInfoSerializer.cpp
@@ -44,13 +44,13 @@ std::string JingleFileTransferFileInfoSerializer::serializePayload(std::shared_p
if (fileInfo->getSupportsRangeRequests()) {
std::shared_ptr<XMLElement> range = std::make_shared<XMLElement>("range");
if (fileInfo->getRangeOffset() != 0) {
- range->setAttribute("offset", boost::lexical_cast<std::string>(fileInfo->getRangeOffset()));
+ range->setAttribute("offset", std::to_string(fileInfo->getRangeOffset()));
}
fileElement.addNode(range);
}
if (fileInfo->getSize() > 0) {
- fileElement.addNode(std::make_shared<XMLElement>("size", "", boost::lexical_cast<std::string>(fileInfo->getSize())));
+ fileElement.addNode(std::make_shared<XMLElement>("size", "", std::to_string(fileInfo->getSize())));
}
for (const auto& hashElement : fileInfo->getHashes()) {
diff --git a/Swiften/Serializer/PayloadSerializers/JingleIBBTransportPayloadSerializer.cpp b/Swiften/Serializer/PayloadSerializers/JingleIBBTransportPayloadSerializer.cpp
index 9930e44..c5c45e1 100644
--- a/Swiften/Serializer/PayloadSerializers/JingleIBBTransportPayloadSerializer.cpp
+++ b/Swiften/Serializer/PayloadSerializers/JingleIBBTransportPayloadSerializer.cpp
@@ -28,7 +28,7 @@ JingleIBBTransportPayloadSerializer::JingleIBBTransportPayloadSerializer() {
std::string JingleIBBTransportPayloadSerializer::serializePayload(std::shared_ptr<JingleIBBTransportPayload> payload) const {
XMLElement payloadXML("transport", "urn:xmpp:jingle:transports:ibb:1");
if (payload->getBlockSize()) {
- payloadXML.setAttribute("block-size", boost::lexical_cast<std::string>(*payload->getBlockSize()));
+ payloadXML.setAttribute("block-size", std::to_string(*payload->getBlockSize()));
}
payloadXML.setAttribute("sid", payload->getSessionID());
diff --git a/Swiften/Serializer/PayloadSerializers/JinglePayloadSerializer.cpp b/Swiften/Serializer/PayloadSerializers/JinglePayloadSerializer.cpp
index aaac757..566d556 100644
--- a/Swiften/Serializer/PayloadSerializers/JinglePayloadSerializer.cpp
+++ b/Swiften/Serializer/PayloadSerializers/JinglePayloadSerializer.cpp
@@ -5,7 +5,7 @@
*/
/*
- * Copyright (c) 2015-2016 Isode Limited.
+ * Copyright (c) 2015-2019 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -93,7 +93,7 @@ std::string JinglePayloadSerializer::actionToString(JinglePayload::Action action
case JinglePayload::TransportReplace:
return "transport-replace";
case JinglePayload::UnknownAction:
- SWIFT_LOG(warning) << "Serializing unknown action value." << std::endl;
+ SWIFT_LOG(warning) << "Serializing unknown action value.";
return "";
}
assert(false);
@@ -103,7 +103,7 @@ std::string JinglePayloadSerializer::actionToString(JinglePayload::Action action
std::string JinglePayloadSerializer::reasonTypeToString(JinglePayload::Reason::Type type) const {
switch(type) {
case JinglePayload::Reason::UnknownType:
- SWIFT_LOG(warning) << "Unknown jingle reason type!" << std::endl;
+ SWIFT_LOG(warning) << "Unknown jingle reason type!";
return "";
case JinglePayload::Reason::AlternativeSession:
return "alternative-session";
diff --git a/Swiften/Serializer/PayloadSerializers/JingleS5BTransportPayloadSerializer.cpp b/Swiften/Serializer/PayloadSerializers/JingleS5BTransportPayloadSerializer.cpp
index 5e74d8e..f9a1832 100644
--- a/Swiften/Serializer/PayloadSerializers/JingleS5BTransportPayloadSerializer.cpp
+++ b/Swiften/Serializer/PayloadSerializers/JingleS5BTransportPayloadSerializer.cpp
@@ -39,8 +39,8 @@ std::string JingleS5BTransportPayloadSerializer::serializePayload(std::shared_pt
candidateXML->setAttribute("cid", candidate.cid);
candidateXML->setAttribute("host", candidate.hostPort.getAddress().toString());
candidateXML->setAttribute("jid", candidate.jid.toString());
- candidateXML->setAttribute("port", boost::lexical_cast<std::string>(candidate.hostPort.getPort()));
- candidateXML->setAttribute("priority", boost::lexical_cast<std::string>(candidate.priority));
+ candidateXML->setAttribute("port", std::to_string(candidate.hostPort.getPort()));
+ candidateXML->setAttribute("priority", std::to_string(candidate.priority));
candidateXML->setAttribute("type", typeToString(candidate.type));
payloadXML.addNode(candidateXML);
}
diff --git a/Swiften/Serializer/PayloadSerializers/LastSerializer.h b/Swiften/Serializer/PayloadSerializers/LastSerializer.h
index 1710bc0..719eff5 100644
--- a/Swiften/Serializer/PayloadSerializers/LastSerializer.h
+++ b/Swiften/Serializer/PayloadSerializers/LastSerializer.h
@@ -18,7 +18,7 @@ namespace Swift {
LastSerializer() : GenericPayloadSerializer<Last>() {}
virtual std::string serializePayload(std::shared_ptr<Last> last) const {
- return "<query xmlns='jabber:iq:last' seconds='" + boost::lexical_cast<std::string>(last->getSeconds()) + "'/>";
+ return "<query xmlns='jabber:iq:last' seconds='" + std::to_string(last->getSeconds()) + "'/>";
}
};
}
diff --git a/Swiften/Serializer/PayloadSerializers/MIXJoinSerializer.cpp b/Swiften/Serializer/PayloadSerializers/MIXJoinSerializer.cpp
index cfb4d31..509e41e 100644
--- a/Swiften/Serializer/PayloadSerializers/MIXJoinSerializer.cpp
+++ b/Swiften/Serializer/PayloadSerializers/MIXJoinSerializer.cpp
@@ -7,8 +7,8 @@
#include <Swiften/Serializer/PayloadSerializers/MIXJoinSerializer.h>
#include <memory>
+#include <string>
-#include <Swiften/Serializer/PayloadSerializers/MIXSubscribeSerializer.h>
#include <Swiften/Serializer/PayloadSerializers/FormSerializer.h>
#include <Swiften/Serializer/XML/XMLElement.h>
#include <Swiften/Serializer/XML/XMLRawTextNode.h>
@@ -32,9 +32,16 @@ std::string MIXJoinSerializer::serializePayload(std::shared_ptr<MIXJoin> payload
if (payload->getJID()) {
element.setAttribute("jid", *payload->getJID());
}
- for (const auto& item : payload->getSubscriptions()) {
- element.addNode(std::make_shared<XMLRawTextNode>(MIXSubscribeSerializer().serialize(item)));
+ auto subscriptionData = payload->getSubscriptions();
+ std::vector<std::string> subscriptions(subscriptionData.begin(), subscriptionData.end());
+ std::sort(subscriptions.begin(), subscriptions.end());
+
+ for (const auto& item : subscriptions) {
+ auto subscribeElement = std::make_shared<XMLElement>("subscribe");
+ subscribeElement->setAttribute("node", item);
+ element.addNode(subscribeElement);
}
+
if (payload->getForm()) {
element.addNode(std::make_shared<XMLRawTextNode>(FormSerializer().serialize(payload->getForm())));
}
diff --git a/Swiften/Serializer/PayloadSerializers/MIXSubscribeSerializer.cpp b/Swiften/Serializer/PayloadSerializers/MIXSubscribeSerializer.cpp
deleted file mode 100644
index 3ce6d89..0000000
--- a/Swiften/Serializer/PayloadSerializers/MIXSubscribeSerializer.cpp
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Copyright (c) 2017 Tarun Gupta
- * Licensed under the simplified BSD license.
- * See Documentation/Licenses/BSD-simplified.txt for more information.
- */
-
-#include <Swiften/Serializer/PayloadSerializers/MIXSubscribeSerializer.h>
-
-#include <memory>
-
-#include <Swiften/Serializer/XML/XMLElement.h>
-#include <Swiften/Serializer/XML/XMLRawTextNode.h>
-
-using namespace Swift;
-
-MIXSubscribeSerializer::MIXSubscribeSerializer() {
-}
-
-MIXSubscribeSerializer::~MIXSubscribeSerializer() {
-}
-
-std::string MIXSubscribeSerializer::serializePayload(std::shared_ptr<MIXSubscribe> payload) const {
- if (!payload) {
- return "";
- }
- XMLElement element("subscribe");
- element.setAttribute("node", payload->getNode());
- return element.serialize();
-}
diff --git a/Swiften/Serializer/PayloadSerializers/MIXSubscribeSerializer.h b/Swiften/Serializer/PayloadSerializers/MIXSubscribeSerializer.h
deleted file mode 100644
index a63a2be..0000000
--- a/Swiften/Serializer/PayloadSerializers/MIXSubscribeSerializer.h
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Copyright (c) 2017 Tarun Gupta
- * Licensed under the simplified BSD license.
- * See Documentation/Licenses/BSD-simplified.txt for more information.
- */
-
-/*
- * Copyright (c) 2017 Isode Limited.
- * All rights reserved.
- * See the COPYING file for more information.
- */
-
-#pragma once
-
-#include <memory>
-
-#include <Swiften/Base/API.h>
-#include <Swiften/Elements/MIXSubscribe.h>
-#include <Swiften/Serializer/GenericPayloadSerializer.h>
-
-namespace Swift {
-
- class SWIFTEN_API MIXSubscribeSerializer : public GenericPayloadSerializer<MIXSubscribe> {
- public:
- MIXSubscribeSerializer();
- virtual ~MIXSubscribeSerializer() override;
-
- virtual std::string serializePayload(std::shared_ptr<MIXSubscribe>) const override;
- };
-}
diff --git a/Swiften/Serializer/PayloadSerializers/MIXUpdateSubscriptionSerializer.cpp b/Swiften/Serializer/PayloadSerializers/MIXUpdateSubscriptionSerializer.cpp
new file mode 100644
index 0000000..8e95474
--- /dev/null
+++ b/Swiften/Serializer/PayloadSerializers/MIXUpdateSubscriptionSerializer.cpp
@@ -0,0 +1,43 @@
+/*
+ * Copyright (c) 2017 Tarun Gupta
+ * Licensed under the simplified BSD license.
+ * See Documentation/Licenses/BSD-simplified.txt for more information.
+ */
+
+#include <Swiften/Serializer/PayloadSerializers/MIXUpdateSubscriptionSerializer.h>
+
+#include <memory>
+
+#include <Swiften/Serializer/PayloadSerializers/FormSerializer.h>
+#include <Swiften/Serializer/XML/XMLElement.h>
+#include <Swiften/Serializer/XML/XMLRawTextNode.h>
+
+namespace Swift {
+
+MIXUpdateSubscriptionSerializer::MIXUpdateSubscriptionSerializer() {
+}
+
+MIXUpdateSubscriptionSerializer::~MIXUpdateSubscriptionSerializer() {
+}
+
+std::string MIXUpdateSubscriptionSerializer::serializePayload(std::shared_ptr<MIXUpdateSubscription> payload) const {
+ if (!payload) {
+ return "";
+ }
+ XMLElement element("update-subscription", "urn:xmpp:mix:0");
+ if (payload->getJID()) {
+ element.setAttribute("jid", *payload->getJID());
+ }
+ auto subscriptionData = payload->getSubscriptions();
+ std::vector<std::string> subscriptions(subscriptionData.begin(), subscriptionData.end());
+ std::sort(subscriptions.begin(), subscriptions.end());
+
+ for (const auto& item : subscriptions) {
+ auto subscribeElement = std::make_shared<XMLElement>("subscribe");
+ subscribeElement->setAttribute("node", item);
+ element.addNode(subscribeElement);
+ }
+ return element.serialize();
+}
+
+}
diff --git a/Swiften/Serializer/PayloadSerializers/MIXUpdateSubscriptionSerializer.h b/Swiften/Serializer/PayloadSerializers/MIXUpdateSubscriptionSerializer.h
new file mode 100644
index 0000000..4ba9584
--- /dev/null
+++ b/Swiften/Serializer/PayloadSerializers/MIXUpdateSubscriptionSerializer.h
@@ -0,0 +1,30 @@
+/*
+ * Copyright (c) 2017 Tarun Gupta
+ * Licensed under the simplified BSD license.
+ * See Documentation/Licenses/BSD-simplified.txt for more information.
+ */
+
+/*
+ * Copyright (c) 2017-2018 Isode Limited.
+ * All rights reserved.
+ * See the COPYING file for more information.
+ */
+
+#pragma once
+
+#include <memory>
+
+#include <Swiften/Base/API.h>
+#include <Swiften/Elements/MIXUpdateSubscription.h>
+#include <Swiften/Serializer/GenericPayloadSerializer.h>
+
+namespace Swift {
+
+ class SWIFTEN_API MIXUpdateSubscriptionSerializer : public GenericPayloadSerializer<MIXUpdateSubscription> {
+ public:
+ MIXUpdateSubscriptionSerializer();
+ virtual ~MIXUpdateSubscriptionSerializer() override;
+
+ virtual std::string serializePayload(std::shared_ptr<MIXUpdateSubscription>) const override;
+ };
+}
diff --git a/Swiften/Serializer/PayloadSerializers/MUCPayloadSerializer.cpp b/Swiften/Serializer/PayloadSerializers/MUCPayloadSerializer.cpp
index 4f0f637..cde129e 100644
--- a/Swiften/Serializer/PayloadSerializers/MUCPayloadSerializer.cpp
+++ b/Swiften/Serializer/PayloadSerializers/MUCPayloadSerializer.cpp
@@ -25,15 +25,15 @@ std::string MUCPayloadSerializer::serializePayload(std::shared_ptr<MUCPayload> m
std::shared_ptr<XMLElement> historyElement(new XMLElement("history"));
bool history = false;
if (muc->getMaxChars() >= 0) {
- historyElement->setAttribute("maxchars", boost::lexical_cast<std::string>(muc->getMaxChars()));
+ historyElement->setAttribute("maxchars", std::to_string(muc->getMaxChars()));
history = true;
}
if (muc->getMaxStanzas() >= 0) {
- historyElement->setAttribute("maxstanzas", boost::lexical_cast<std::string>(muc->getMaxStanzas()));
+ historyElement->setAttribute("maxstanzas", std::to_string(muc->getMaxStanzas()));
history = true;
}
if (muc->getSeconds() >= 0) {
- historyElement->setAttribute("seconds", boost::lexical_cast<std::string>(muc->getSeconds()));
+ historyElement->setAttribute("seconds", std::to_string(muc->getSeconds()));
history = true;
}
if (muc->getSince() != boost::posix_time::not_a_date_time) {
diff --git a/Swiften/Serializer/PayloadSerializers/PrioritySerializer.h b/Swiften/Serializer/PayloadSerializers/PrioritySerializer.h
index 687d07f..fa2cef0 100644
--- a/Swiften/Serializer/PayloadSerializers/PrioritySerializer.h
+++ b/Swiften/Serializer/PayloadSerializers/PrioritySerializer.h
@@ -18,7 +18,7 @@ namespace Swift {
PrioritySerializer() : GenericPayloadSerializer<Priority>() {}
virtual std::string serializePayload(std::shared_ptr<Priority> priority) const {
- return "<priority>" + boost::lexical_cast<std::string>(priority->getPriority()) + "</priority>";
+ return "<priority>" + std::to_string(priority->getPriority()) + "</priority>";
}
};
}
diff --git a/Swiften/Serializer/PayloadSerializers/PubSubItemsSerializer.cpp b/Swiften/Serializer/PayloadSerializers/PubSubItemsSerializer.cpp
index 9786f51..b2c7326 100644
--- a/Swiften/Serializer/PayloadSerializers/PubSubItemsSerializer.cpp
+++ b/Swiften/Serializer/PayloadSerializers/PubSubItemsSerializer.cpp
@@ -37,7 +37,7 @@ std::string PubSubItemsSerializer::serializePayload(std::shared_ptr<PubSubItems>
element.addNode(std::make_shared<XMLRawTextNode>(PubSubItemSerializer(serializers).serialize(item)));
}
if (payload->getMaximumItems()) {
- element.setAttribute("max_items", boost::lexical_cast<std::string>(*payload->getMaximumItems()));
+ element.setAttribute("max_items", std::to_string(*payload->getMaximumItems()));
}
if (payload->getSubscriptionID()) {
element.setAttribute("subid", *payload->getSubscriptionID());
diff --git a/Swiften/Serializer/PayloadSerializers/ReferencePayloadSerializer.cpp b/Swiften/Serializer/PayloadSerializers/ReferencePayloadSerializer.cpp
new file mode 100644
index 0000000..128aac7
--- /dev/null
+++ b/Swiften/Serializer/PayloadSerializers/ReferencePayloadSerializer.cpp
@@ -0,0 +1,64 @@
+/*
+ * Copyright (c) 2018-2019 Isode Limited.
+ * All rights reserved.
+ * See the COPYING file for more information.
+ */
+
+#include <Swiften/Serializer/PayloadSerializers/ReferencePayloadSerializer.h>
+
+#include <memory>
+
+#include <Swiften/Base/Log.h>
+#include <Swiften/Serializer/XML/XMLElement.h>
+#include <Swiften/Serializer/XML/XMLRawTextNode.h>
+#include <Swiften/Serializer/PayloadSerializerCollection.h>
+
+namespace Swift {
+
+ReferencePayloadSerializer::ReferencePayloadSerializer(PayloadSerializerCollection* payloadSerializers) : GenericPayloadSerializer<ReferencePayload>(), payloadSerializers_(payloadSerializers) {
+}
+
+std::string ReferencePayloadSerializer::serializePayload(ReferencePayload::ref reference) const {
+ XMLElement element("reference", "urn:xmpp:reference:0");
+
+ auto type = reference->getType();
+ if (type != ReferencePayload::Type::Unknown) {
+ element.setAttribute("type", getTypeString(type));
+
+ if (auto uri = reference->getUri()) {
+ element.setAttribute("uri", *uri);
+ }
+ if (auto begin = reference->getBegin()) {
+ element.setAttribute("begin", *begin);
+ }
+ if (auto end = reference->getEnd()) {
+ element.setAttribute("end", *end);
+ }
+ if (auto anchor = reference->getAnchor()) {
+ element.setAttribute("anchor", *anchor);
+ }
+
+ std::string serializedPayloads;
+ for (const auto& payload : reference->getPayloads()) {
+ if (auto serializer = payloadSerializers_->getPayloadSerializer(payload)) {
+ element.addNode(std::make_shared<XMLRawTextNode>(serializer->serialize(payload)));
+ }
+ else {
+ SWIFT_LOG(warning) << "Could not find serializer for " << typeid(*(payload.get())).name();
+ }
+ }
+ }
+ return element.serialize();
+}
+
+const std::string ReferencePayloadSerializer::getTypeString(const ReferencePayload::Type type) const {
+ switch(type) {
+ case ReferencePayload::Type::Data: return "data";
+ case ReferencePayload::Type::Mention: return "mention";
+ case ReferencePayload::Type::PubSub: return "pubsub";
+ case ReferencePayload::Type::Unknown: return "unknown";
+ }
+ return "";
+}
+
+}
diff --git a/Swiften/Serializer/PayloadSerializers/ReferencePayloadSerializer.h b/Swiften/Serializer/PayloadSerializers/ReferencePayloadSerializer.h
new file mode 100644
index 0000000..2af6045
--- /dev/null
+++ b/Swiften/Serializer/PayloadSerializers/ReferencePayloadSerializer.h
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 2018 Isode Limited.
+ * All rights reserved.
+ * See the COPYING file for more information.
+ */
+
+#pragma once
+
+#include <Swiften/Base/API.h>
+#include <Swiften/Elements/ReferencePayload.h>
+#include <Swiften/Serializer/GenericPayloadSerializer.h>
+
+namespace Swift {
+ class PayloadSerializerCollection;
+
+ class SWIFTEN_API ReferencePayloadSerializer : public GenericPayloadSerializer<ReferencePayload> {
+ public:
+ ReferencePayloadSerializer(PayloadSerializerCollection* payloadSerializers);
+ virtual std::string serializePayload(ReferencePayload::ref reference) const;
+
+ private:
+ const std::string getTypeString(const ReferencePayload::Type type) const;
+
+ PayloadSerializerCollection* payloadSerializers_;
+ };
+}
diff --git a/Swiften/Serializer/PayloadSerializers/ResultSetSerializer.cpp b/Swiften/Serializer/PayloadSerializers/ResultSetSerializer.cpp
index 3302863..3d13ce3 100644
--- a/Swiften/Serializer/PayloadSerializers/ResultSetSerializer.cpp
+++ b/Swiften/Serializer/PayloadSerializers/ResultSetSerializer.cpp
@@ -29,21 +29,21 @@ std::string ResultSetSerializer::serializePayload(std::shared_ptr<ResultSet> pay
XMLElement element("set", "http://jabber.org/protocol/rsm");
if (payload->getMaxItems()) {
- element.addNode(std::make_shared<XMLElement>("max", "", boost::lexical_cast<std::string>(*payload->getMaxItems())));
+ element.addNode(std::make_shared<XMLElement>("max", "", std::to_string(*payload->getMaxItems())));
}
if (payload->getCount()) {
- element.addNode(std::make_shared<XMLElement>("count", "", boost::lexical_cast<std::string>(*payload->getCount())));
+ element.addNode(std::make_shared<XMLElement>("count", "", std::to_string(*payload->getCount())));
}
if (payload->getIndex()) {
- element.addNode(std::make_shared<XMLElement>("index", "", boost::lexical_cast<std::string>(*payload->getIndex())));
+ element.addNode(std::make_shared<XMLElement>("index", "", std::to_string(*payload->getIndex())));
}
if (payload->getFirstID()) {
std::shared_ptr<XMLElement> firstElement = std::make_shared<XMLElement>("first", "", *payload->getFirstID());
if (payload->getFirstIDIndex()) {
- firstElement->setAttribute("index", boost::lexical_cast<std::string>(*payload->getFirstIDIndex()));
+ firstElement->setAttribute("index", std::to_string(*payload->getFirstIDIndex()));
}
element.addNode(firstElement);
}
diff --git a/Swiften/Serializer/PayloadSerializers/S5BProxyRequestSerializer.h b/Swiften/Serializer/PayloadSerializers/S5BProxyRequestSerializer.h
index 14cbd14..e992f72 100644
--- a/Swiften/Serializer/PayloadSerializers/S5BProxyRequestSerializer.h
+++ b/Swiften/Serializer/PayloadSerializers/S5BProxyRequestSerializer.h
@@ -29,7 +29,7 @@ namespace Swift {
if (s5bProxyRequest && s5bProxyRequest->getStreamHost()) {
std::shared_ptr<XMLElement> streamHost = std::make_shared<XMLElement>("streamhost");
streamHost->setAttribute("host", s5bProxyRequest->getStreamHost().get().host);
- streamHost->setAttribute("port", boost::lexical_cast<std::string>(s5bProxyRequest->getStreamHost().get().port));
+ streamHost->setAttribute("port", std::to_string(s5bProxyRequest->getStreamHost().get().port));
streamHost->setAttribute("jid", s5bProxyRequest->getStreamHost().get().jid.toString());
queryElement.addNode(streamHost);
} else if (s5bProxyRequest && s5bProxyRequest->getActivate()) {
diff --git a/Swiften/Serializer/PayloadSerializers/StreamInitiationFileInfoSerializer.cpp b/Swiften/Serializer/PayloadSerializers/StreamInitiationFileInfoSerializer.cpp
index ba296f9..718e550 100644
--- a/Swiften/Serializer/PayloadSerializers/StreamInitiationFileInfoSerializer.cpp
+++ b/Swiften/Serializer/PayloadSerializers/StreamInitiationFileInfoSerializer.cpp
@@ -40,7 +40,7 @@ std::string StreamInitiationFileInfoSerializer::serializePayload(std::shared_ptr
fileElement.setAttribute("name", fileInfo->getName());
}
if (fileInfo->getSize() != 0) {
- fileElement.setAttribute("size", boost::lexical_cast<std::string>(fileInfo->getSize()));
+ fileElement.setAttribute("size", std::to_string(fileInfo->getSize()));
}
if (!fileInfo->getDescription().empty()) {
std::shared_ptr<XMLElement> desc = std::make_shared<XMLElement>("desc", "", fileInfo->getDescription());
@@ -49,7 +49,7 @@ std::string StreamInitiationFileInfoSerializer::serializePayload(std::shared_ptr
if (fileInfo->getSupportsRangeRequests()) {
std::shared_ptr<XMLElement> range = std::make_shared<XMLElement>("range");
if (fileInfo->getRangeOffset() != 0) {
- range->setAttribute("offset", boost::lexical_cast<std::string>(fileInfo->getRangeOffset()));
+ range->setAttribute("offset", std::to_string(fileInfo->getRangeOffset()));
}
fileElement.addNode(range);
}
diff --git a/Swiften/Serializer/PayloadSerializers/StreamInitiationSerializer.cpp b/Swiften/Serializer/PayloadSerializers/StreamInitiationSerializer.cpp
index 3faa5b7..813edb4 100644
--- a/Swiften/Serializer/PayloadSerializers/StreamInitiationSerializer.cpp
+++ b/Swiften/Serializer/PayloadSerializers/StreamInitiationSerializer.cpp
@@ -38,7 +38,7 @@ std::string StreamInitiationSerializer::serializePayload(std::shared_ptr<StreamI
std::shared_ptr<XMLElement> fileElement(new XMLElement("file", "http://jabber.org/protocol/si/profile/file-transfer"));
fileElement->setAttribute("name", file.getName());
if (file.getSize() != 0) {
- fileElement->setAttribute("size", boost::lexical_cast<std::string>(file.getSize()));
+ fileElement->setAttribute("size", std::to_string(file.getSize()));
}
if (!file.getDescription().empty()) {
std::shared_ptr<XMLElement> descElement(new XMLElement("desc"));
diff --git a/Swiften/Serializer/PayloadSerializers/UnitTest/MIXJoinSerializerTest.cpp b/Swiften/Serializer/PayloadSerializers/UnitTest/MIXJoinSerializerTest.cpp
index ff8aa70..2987a20 100644
--- a/Swiften/Serializer/PayloadSerializers/UnitTest/MIXJoinSerializerTest.cpp
+++ b/Swiften/Serializer/PayloadSerializers/UnitTest/MIXJoinSerializerTest.cpp
@@ -16,24 +16,16 @@ TEST(MIXJoinSerializerTest, XEP0369_Example22) {
auto join = std::make_shared<MIXJoin>();
join->setChannel(JID("coven@mix.shakespeare.example"));
- std::shared_ptr<MIXSubscribe> node1(new MIXSubscribe());
- node1->setNode(std::string("urn:xmpp:mix:nodes:messages"));
- join->addSubscription(node1);
- std::shared_ptr<MIXSubscribe> node2(new MIXSubscribe());
- node2->setNode(std::string("urn:xmpp:mix:nodes:presence"));
- join->addSubscription(node2);
- std::shared_ptr<MIXSubscribe> node3(new MIXSubscribe());
- node3->setNode(std::string("urn:xmpp:mix:nodes:participants"));
- join->addSubscription(node3);
- std::shared_ptr<MIXSubscribe> node4(new MIXSubscribe());
- node4->setNode(std::string("urn:xmpp:mix:nodes:config"));
- join->addSubscription(node4);
+ join->addSubscription(std::string("urn:xmpp:mix:nodes:messages"));
+ join->addSubscription(std::string("urn:xmpp:mix:nodes:presence"));
+ join->addSubscription(std::string("urn:xmpp:mix:nodes:participants"));
+ join->addSubscription(std::string("urn:xmpp:mix:nodes:config"));
std::string expectedResult = "<join channel=\"coven@mix.shakespeare.example\" xmlns=\"urn:xmpp:mix:0\">"
+ "<subscribe node=\"urn:xmpp:mix:nodes:config\"/>"
"<subscribe node=\"urn:xmpp:mix:nodes:messages\"/>"
- "<subscribe node=\"urn:xmpp:mix:nodes:presence\"/>"
"<subscribe node=\"urn:xmpp:mix:nodes:participants\"/>"
- "<subscribe node=\"urn:xmpp:mix:nodes:config\"/>"
+ "<subscribe node=\"urn:xmpp:mix:nodes:presence\"/>"
"</join>";
ASSERT_EQ(expectedResult, testling.serialize(join));
}
@@ -43,24 +35,16 @@ TEST(MIXJoinSerializerTest, XEP0369_Example23) {
std::shared_ptr<MIXJoin> join(new MIXJoin());
- std::shared_ptr<MIXSubscribe> node1(new MIXSubscribe());
- node1->setNode(std::string("urn:xmpp:mix:nodes:messages"));
- join->addSubscription(node1);
- std::shared_ptr<MIXSubscribe> node2(new MIXSubscribe());
- node2->setNode(std::string("urn:xmpp:mix:nodes:presence"));
- join->addSubscription(node2);
- std::shared_ptr<MIXSubscribe> node3(new MIXSubscribe());
- node3->setNode(std::string("urn:xmpp:mix:nodes:participants"));
- join->addSubscription(node3);
- std::shared_ptr<MIXSubscribe> node4(new MIXSubscribe());
- node4->setNode(std::string("urn:xmpp:mix:nodes:config"));
- join->addSubscription(node4);
+ join->addSubscription(std::string("urn:xmpp:mix:nodes:messages"));
+ join->addSubscription(std::string("urn:xmpp:mix:nodes:presence"));
+ join->addSubscription(std::string("urn:xmpp:mix:nodes:participants"));
+ join->addSubscription(std::string("urn:xmpp:mix:nodes:config"));
std::string expectedResult = "<join xmlns=\"urn:xmpp:mix:0\">"
+ "<subscribe node=\"urn:xmpp:mix:nodes:config\"/>"
"<subscribe node=\"urn:xmpp:mix:nodes:messages\"/>"
- "<subscribe node=\"urn:xmpp:mix:nodes:presence\"/>"
"<subscribe node=\"urn:xmpp:mix:nodes:participants\"/>"
- "<subscribe node=\"urn:xmpp:mix:nodes:config\"/>"
+ "<subscribe node=\"urn:xmpp:mix:nodes:presence\"/>"
"</join>";
ASSERT_EQ(expectedResult, testling.serialize(join));
}
@@ -71,24 +55,16 @@ TEST(MIXJoinSerializerTest, XEP0369_Example24) {
std::shared_ptr<MIXJoin> join(new MIXJoin());
join->setJID(JID("123456#coven@mix.shakespeare.example"));
- std::shared_ptr<MIXSubscribe> node1(new MIXSubscribe());
- node1->setNode(std::string("urn:xmpp:mix:nodes:messages"));
- join->addSubscription(node1);
- std::shared_ptr<MIXSubscribe> node2(new MIXSubscribe());
- node2->setNode(std::string("urn:xmpp:mix:nodes:presence"));
- join->addSubscription(node2);
- std::shared_ptr<MIXSubscribe> node3(new MIXSubscribe());
- node3->setNode(std::string("urn:xmpp:mix:nodes:participants"));
- join->addSubscription(node3);
- std::shared_ptr<MIXSubscribe> node4(new MIXSubscribe());
- node4->setNode(std::string("urn:xmpp:mix:nodes:config"));
- join->addSubscription(node4);
+ join->addSubscription(std::string("urn:xmpp:mix:nodes:messages"));
+ join->addSubscription(std::string("urn:xmpp:mix:nodes:presence"));
+ join->addSubscription(std::string("urn:xmpp:mix:nodes:participants"));
+ join->addSubscription(std::string("urn:xmpp:mix:nodes:config"));
std::string expectedResult = "<join jid=\"123456#coven@mix.shakespeare.example\" xmlns=\"urn:xmpp:mix:0\">"
+ "<subscribe node=\"urn:xmpp:mix:nodes:config\"/>"
"<subscribe node=\"urn:xmpp:mix:nodes:messages\"/>"
- "<subscribe node=\"urn:xmpp:mix:nodes:presence\"/>"
"<subscribe node=\"urn:xmpp:mix:nodes:participants\"/>"
- "<subscribe node=\"urn:xmpp:mix:nodes:config\"/>"
+ "<subscribe node=\"urn:xmpp:mix:nodes:presence\"/>"
"</join>";
ASSERT_EQ(expectedResult, testling.serialize(join));
}
@@ -98,12 +74,8 @@ TEST(MIXJoinSerializerTest, XEP0369_Example29) {
std::shared_ptr<MIXJoin> join(new MIXJoin());
- std::shared_ptr<MIXSubscribe> node1(new MIXSubscribe());
- node1->setNode(std::string("urn:xmpp:mix:nodes:messages"));
- join->addSubscription(node1);
- std::shared_ptr<MIXSubscribe> node2(new MIXSubscribe());
- node2->setNode(std::string("urn:xmpp:mix:nodes:presence"));
- join->addSubscription(node2);
+ join->addSubscription(std::string("urn:xmpp:mix:nodes:messages"));
+ join->addSubscription(std::string("urn:xmpp:mix:nodes:presence"));
std::shared_ptr<Form> parameters(std::make_shared<Form>());
parameters->setType(Form::Type::SubmitType);
@@ -141,12 +113,8 @@ TEST(MIXJoinSerializerTest, XEP0369_Example30) {
std::shared_ptr<MIXJoin> join(new MIXJoin());
join->setJID(JID("hag66@shakespeare.example"));
- std::shared_ptr<MIXSubscribe> node1(new MIXSubscribe());
- node1->setNode(std::string("urn:xmpp:mix:nodes:messages"));
- join->addSubscription(node1);
- std::shared_ptr<MIXSubscribe> node2(new MIXSubscribe());
- node2->setNode(std::string("urn:xmpp:mix:nodes:presence"));
- join->addSubscription(node2);
+ join->addSubscription(std::string("urn:xmpp:mix:nodes:messages"));
+ join->addSubscription(std::string("urn:xmpp:mix:nodes:presence"));
std::shared_ptr<Form> parameters(std::make_shared<Form>());
parameters->setType(Form::Type::ResultType);
diff --git a/Swiften/Serializer/PayloadSerializers/UnitTest/MIXUpdateSubscriptionSerializerTest.cpp b/Swiften/Serializer/PayloadSerializers/UnitTest/MIXUpdateSubscriptionSerializerTest.cpp
new file mode 100644
index 0000000..3e35a82
--- /dev/null
+++ b/Swiften/Serializer/PayloadSerializers/UnitTest/MIXUpdateSubscriptionSerializerTest.cpp
@@ -0,0 +1,36 @@
+/*
+ * Copyright (c) 2017 Tarun Gupta
+ * Licensed under the simplified BSD license.
+ * See Documentation/Licenses/BSD-simplified.txt for more information.
+ */
+
+#include <gtest/gtest.h>
+
+#include <Swiften/Serializer/PayloadSerializers/MIXUpdateSubscriptionSerializer.h>
+
+using namespace Swift;
+
+TEST(MIXUpdateSubscriptionSerializerTest, XEP0369_Example28) {
+ MIXUpdateSubscriptionSerializer testling;
+
+ auto update = std::make_shared<MIXUpdateSubscription>();
+ update->addSubscription(std::string("urn:xmpp:mix:nodes:messages"));
+
+ std::string expectedResult = "<update-subscription xmlns=\"urn:xmpp:mix:0\">"
+ "<subscribe node=\"urn:xmpp:mix:nodes:messages\"/>"
+ "</update-subscription>";
+ ASSERT_EQ(expectedResult, testling.serialize(update));
+}
+
+TEST(MIXUpdateSubscriptionSerializerTest, XEP0369_Example28WithJID) {
+ MIXUpdateSubscriptionSerializer testling;
+
+ auto update = std::make_shared<MIXUpdateSubscription>();
+ update->setJID(JID("hag66@shakespeare.example"));
+ update->addSubscription(std::string("urn:xmpp:mix:nodes:messages"));
+
+ std::string expectedResult = "<update-subscription jid=\"hag66@shakespeare.example\" xmlns=\"urn:xmpp:mix:0\">"
+ "<subscribe node=\"urn:xmpp:mix:nodes:messages\"/>"
+ "</update-subscription>";
+ ASSERT_EQ(expectedResult, testling.serialize(update));
+}
diff --git a/Swiften/Serializer/PayloadSerializers/UnitTest/ReferencePayloadSerializerTest.cpp b/Swiften/Serializer/PayloadSerializers/UnitTest/ReferencePayloadSerializerTest.cpp
new file mode 100644
index 0000000..82465d7
--- /dev/null
+++ b/Swiften/Serializer/PayloadSerializers/UnitTest/ReferencePayloadSerializerTest.cpp
@@ -0,0 +1,81 @@
+/*
+ * Copyright (c) 2018 Isode Limited.
+ * All rights reserved.
+ * See the COPYING file for more information.
+ */
+
+#include <gtest/gtest.h>
+
+#include <Swiften/Serializer/PayloadSerializers/ReferencePayloadSerializer.h>
+
+#include <Swiften/Elements/Body.h>
+#include <Swiften/Serializer/PayloadSerializers/FullPayloadSerializerCollection.h>
+
+using namespace Swift;
+
+static FullPayloadSerializerCollection serializers;
+
+TEST(ReferencePayloadSerializerTest, testSerialize) {
+ ReferencePayloadSerializer testling(&serializers);
+ auto reference = std::make_shared<ReferencePayload>();
+ reference->setType(ReferencePayload::Type::Data);
+ reference->setUri(boost::optional<std::string>("https://www.example.com/mindBlowingImage.jpeg"));
+ reference->setBegin(boost::optional<std::string>("11"));
+ reference->setEnd(boost::optional<std::string>("22"));
+ reference->setAnchor(boost::optional<std::string>("xmpp:data@localhost.example.test"));
+
+ std::string expectedResult =
+ "<reference "
+ "anchor=\"xmpp:data@localhost.example.test\" "
+ "begin=\"11\" "
+ "end=\"22\" "
+ "type=\"data\" "
+ "uri=\"https://www.example.com/mindBlowingImage.jpeg\" "
+ "xmlns=\"urn:xmpp:reference:0\"/>";
+
+ ASSERT_EQ(expectedResult, testling.serialize(reference));
+}
+
+TEST(ReferencePayloadSerializerTest, testSerializeNoType) {
+ ReferencePayloadSerializer testling(&serializers);
+ auto reference = std::make_shared<ReferencePayload>();
+ reference->setUri(boost::optional<std::string>("https://www.example.com/mindBlowingImage.jpeg"));
+ reference->setBegin(boost::optional<std::string>("11"));
+ reference->setEnd(boost::optional<std::string>("22"));
+ reference->setAnchor(boost::optional<std::string>("xmpp:data@localhost.example.test"));
+
+ std::string expectedResult =
+ "<reference "
+ "anchor=\"xmpp:data@localhost.example.test\" "
+ "begin=\"11\" "
+ "end=\"22\" "
+ "type=\"data\" "
+ "uri=\"https://www.example.com/mindBlowingImage.jpeg\" "
+ "xmlns=\"urn:xmpp:reference:0\"/>";
+
+ ASSERT_EQ(expectedResult, testling.serialize(reference));
+}
+
+TEST(ReferencePayloadSerializerTest, testSerializeWithEmbeddedPayload) {
+ ReferencePayloadSerializer testling(&serializers);
+ auto reference = std::make_shared<ReferencePayload>();
+ reference->setUri(boost::optional<std::string>("https://www.example.com/mindBlowingImage.jpeg"));
+ reference->setBegin(boost::optional<std::string>("11"));
+ reference->setEnd(boost::optional<std::string>("22"));
+ reference->setAnchor(boost::optional<std::string>("xmpp:data@localhost.example.test"));
+ auto payload = std::make_shared<Body>(std::string("Look, I'm in a reference"));
+ reference->addPayload(payload);
+
+ std::string expectedResult =
+ "<reference "
+ "anchor=\"xmpp:data@localhost.example.test\" "
+ "begin=\"11\" "
+ "end=\"22\" "
+ "type=\"data\" "
+ "uri=\"https://www.example.com/mindBlowingImage.jpeg\" "
+ "xmlns=\"urn:xmpp:reference:0\">"
+ "<body>Look, I'm in a reference</body>"
+ "</reference>";
+
+ ASSERT_EQ(expectedResult, testling.serialize(reference));
+}
diff --git a/Swiften/Serializer/PayloadSerializers/UserTuneSerializer.cpp b/Swiften/Serializer/PayloadSerializers/UserTuneSerializer.cpp
index 687b566..8bb3a4b 100644
--- a/Swiften/Serializer/PayloadSerializers/UserTuneSerializer.cpp
+++ b/Swiften/Serializer/PayloadSerializers/UserTuneSerializer.cpp
@@ -26,7 +26,7 @@ std::string UserTuneSerializer::serializePayload(std::shared_ptr<UserTune> paylo
}
XMLElement element("tune", "http://jabber.org/protocol/tune");
if (payload->getRating()) {
- element.addNode(std::make_shared<XMLElement>("rating", "", boost::lexical_cast<std::string>(*payload->getRating())));
+ element.addNode(std::make_shared<XMLElement>("rating", "", std::to_string(*payload->getRating())));
}
if (payload->getTitle()) {
element.addNode(std::make_shared<XMLElement>("title", "", *payload->getTitle()));
@@ -44,7 +44,7 @@ std::string UserTuneSerializer::serializePayload(std::shared_ptr<UserTune> paylo
element.addNode(std::make_shared<XMLElement>("source", "", *payload->getSource()));
}
if (payload->getLength()) {
- element.addNode(std::make_shared<XMLElement>("length", "", boost::lexical_cast<std::string>(*payload->getLength())));
+ element.addNode(std::make_shared<XMLElement>("length", "", std::to_string(*payload->getLength())));
}
return element.serialize();
}
diff --git a/Swiften/Serializer/PayloadSerializers/WhiteboardSerializer.cpp b/Swiften/Serializer/PayloadSerializers/WhiteboardSerializer.cpp
index 34fd149..f38f5b7 100644
--- a/Swiften/Serializer/PayloadSerializers/WhiteboardSerializer.cpp
+++ b/Swiften/Serializer/PayloadSerializers/WhiteboardSerializer.cpp
@@ -5,7 +5,7 @@
*/
/*
- * Copyright (c) 2016 Isode Limited.
+ * Copyright (c) 2016-2019 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -26,13 +26,13 @@ namespace Swift {
void WhiteboardElementSerializingVisitor::visit(WhiteboardLineElement& line) {
element = std::make_shared<XMLElement>("line");
try {
- element->setAttribute("x1", boost::lexical_cast<std::string>(line.x1()));
- element->setAttribute("y1", boost::lexical_cast<std::string>(line.y1()));
- element->setAttribute("x2", boost::lexical_cast<std::string>(line.x2()));
- element->setAttribute("y2", boost::lexical_cast<std::string>(line.y2()));
+ element->setAttribute("x1", std::to_string(line.x1()));
+ element->setAttribute("y1", std::to_string(line.y1()));
+ element->setAttribute("x2", std::to_string(line.x2()));
+ element->setAttribute("y2", std::to_string(line.y2()));
element->setAttribute("id", line.getID());
element->setAttribute("stroke", line.getColor().toHex());
- element->setAttribute("stroke-width", boost::lexical_cast<std::string>(line.getPenWidth()));
+ element->setAttribute("stroke-width", std::to_string(line.getPenWidth()));
element->setAttribute("opacity", alphaToOpacity(line.getColor().getAlpha()));
} catch (boost::bad_lexical_cast&) {
}
@@ -43,14 +43,14 @@ namespace Swift {
element->setAttribute("id", path.getID());
element->setAttribute("stroke", path.getColor().toHex());
try {
- element->setAttribute("stroke-width", boost::lexical_cast<std::string>(path.getPenWidth()));
+ element->setAttribute("stroke-width", std::to_string(path.getPenWidth()));
element->setAttribute("opacity", alphaToOpacity(path.getColor().getAlpha()));
std::string pathData;
if (path.getPoints().size() != 0) {
std::vector<std::pair<int, int> >::const_iterator it = path.getPoints().begin();
- pathData = "M"+boost::lexical_cast<std::string>(it->first)+" "+boost::lexical_cast<std::string>(it->second)+"L";
+ pathData = "M"+std::to_string(it->first)+" "+std::to_string(it->second)+"L";
for (; it != path.getPoints().end(); ++it) {
- pathData += boost::lexical_cast<std::string>(it->first)+" "+boost::lexical_cast<std::string>(it->second)+" ";
+ pathData += std::to_string(it->first)+" "+std::to_string(it->second)+" ";
}
}
element->setAttribute("d", pathData);
@@ -61,14 +61,14 @@ namespace Swift {
void WhiteboardElementSerializingVisitor::visit(WhiteboardRectElement& rect) {
element = std::make_shared<XMLElement>("rect");
try {
- element->setAttribute("x", boost::lexical_cast<std::string>(rect.getX()));
- element->setAttribute("y", boost::lexical_cast<std::string>(rect.getY()));
- element->setAttribute("width", boost::lexical_cast<std::string>(rect.getWidth()));
- element->setAttribute("height", boost::lexical_cast<std::string>(rect.getHeight()));
+ element->setAttribute("x", std::to_string(rect.getX()));
+ element->setAttribute("y", std::to_string(rect.getY()));
+ element->setAttribute("width", std::to_string(rect.getWidth()));
+ element->setAttribute("height", std::to_string(rect.getHeight()));
element->setAttribute("id", rect.getID());
element->setAttribute("stroke", rect.getPenColor().toHex());
- element->setAttribute("fill", rect.getBrushColor().toHex());;
- element->setAttribute("stroke-width", boost::lexical_cast<std::string>(rect.getPenWidth()));
+ element->setAttribute("fill", rect.getBrushColor().toHex());
+ element->setAttribute("stroke-width", std::to_string(rect.getPenWidth()));
element->setAttribute("opacity", alphaToOpacity(rect.getPenColor().getAlpha()));
element->setAttribute("fill-opacity", alphaToOpacity(rect.getBrushColor().getAlpha()));
} catch (boost::bad_lexical_cast&) {
@@ -80,14 +80,14 @@ namespace Swift {
try {
element->setAttribute("id", polygon.getID());
element->setAttribute("stroke", polygon.getPenColor().toHex());
- element->setAttribute("fill", polygon.getBrushColor().toHex());;
- element->setAttribute("stroke-width", boost::lexical_cast<std::string>(polygon.getPenWidth()));
+ element->setAttribute("fill", polygon.getBrushColor().toHex());
+ element->setAttribute("stroke-width", std::to_string(polygon.getPenWidth()));
element->setAttribute("opacity", alphaToOpacity(polygon.getPenColor().getAlpha()));
element->setAttribute("fill-opacity", alphaToOpacity(polygon.getBrushColor().getAlpha()));
std::string points;
std::vector<std::pair<int, int> >::const_iterator it = polygon.getPoints().begin();
for (; it != polygon.getPoints().end(); ++it) {
- points += boost::lexical_cast<std::string>(it->first)+","+boost::lexical_cast<std::string>(it->second)+" ";
+ points += std::to_string(it->first)+","+std::to_string(it->second)+" ";
}
element->setAttribute("points", points);
} catch (boost::bad_lexical_cast&) {
@@ -97,9 +97,9 @@ namespace Swift {
void WhiteboardElementSerializingVisitor::visit(WhiteboardTextElement& text) {
element = std::make_shared<XMLElement>("text");
try {
- element->setAttribute("x", boost::lexical_cast<std::string>(text.getX()));
- element->setAttribute("y", boost::lexical_cast<std::string>(text.getY()));
- element->setAttribute("font-size", boost::lexical_cast<std::string>(text.getSize()));
+ element->setAttribute("x", std::to_string(text.getX()));
+ element->setAttribute("y", std::to_string(text.getY()));
+ element->setAttribute("font-size", std::to_string(text.getSize()));
element->setAttribute("id", text.getID());
element->setAttribute("fill", text.getColor().toHex());
element->setAttribute("opacity", alphaToOpacity(text.getColor().getAlpha()));
@@ -111,14 +111,14 @@ namespace Swift {
void WhiteboardElementSerializingVisitor::visit(WhiteboardEllipseElement& ellipse) {
element = std::make_shared<XMLElement>("ellipse");
try {
- element->setAttribute("cx", boost::lexical_cast<std::string>(ellipse.getCX()));
- element->setAttribute("cy", boost::lexical_cast<std::string>(ellipse.getCY()));
- element->setAttribute("rx", boost::lexical_cast<std::string>(ellipse.getRX()));
- element->setAttribute("ry", boost::lexical_cast<std::string>(ellipse.getRY()));
+ element->setAttribute("cx", std::to_string(ellipse.getCX()));
+ element->setAttribute("cy", std::to_string(ellipse.getCY()));
+ element->setAttribute("rx", std::to_string(ellipse.getRX()));
+ element->setAttribute("ry", std::to_string(ellipse.getRY()));
element->setAttribute("id", ellipse.getID());
element->setAttribute("stroke", ellipse.getPenColor().toHex());
- element->setAttribute("fill", ellipse.getBrushColor().toHex());;
- element->setAttribute("stroke-width", boost::lexical_cast<std::string>(ellipse.getPenWidth()));
+ element->setAttribute("fill", ellipse.getBrushColor().toHex());
+ element->setAttribute("stroke-width", std::to_string(ellipse.getPenWidth()));
element->setAttribute("opacity", alphaToOpacity(ellipse.getPenColor().getAlpha()));
element->setAttribute("fill-opacity", alphaToOpacity(ellipse.getBrushColor().getAlpha()));
} catch (boost::bad_lexical_cast&) {
@@ -134,7 +134,7 @@ namespace Swift {
if (opacity == 100) {
return "1";
} else {
- return "."+boost::lexical_cast<std::string>(opacity);
+ return "."+std::to_string(opacity);
}
}
@@ -148,7 +148,7 @@ namespace Swift {
if (insertOp) {
try {
operationNode->setAttribute("type", "insert");
- operationNode->setAttribute("pos", boost::lexical_cast<std::string>(insertOp->getPos()));
+ operationNode->setAttribute("pos", std::to_string(insertOp->getPos()));
operationNode->setAttribute("id", insertOp->getID());
operationNode->setAttribute("parentid", insertOp->getParentID());
} catch (boost::bad_lexical_cast&) {
@@ -160,10 +160,10 @@ namespace Swift {
if (updateOp) {
try {
operationNode->setAttribute("type", "update");
- operationNode->setAttribute("pos", boost::lexical_cast<std::string>(updateOp->getPos()));
+ operationNode->setAttribute("pos", std::to_string(updateOp->getPos()));
operationNode->setAttribute("id", updateOp->getID());
operationNode->setAttribute("parentid", updateOp->getParentID());
- operationNode->setAttribute("newpos", boost::lexical_cast<std::string>(updateOp->getNewPos()));
+ operationNode->setAttribute("newpos", std::to_string(updateOp->getNewPos()));
} catch (boost::bad_lexical_cast&) {
}
updateOp->getElement()->accept(visitor);
@@ -175,7 +175,7 @@ namespace Swift {
if (deleteOp) {
try {
operationNode->setAttribute("type", "delete");
- operationNode->setAttribute("pos", boost::lexical_cast<std::string>(deleteOp->getPos()));
+ operationNode->setAttribute("pos", std::to_string(deleteOp->getPos()));
operationNode->setAttribute("id", deleteOp->getID());
operationNode->setAttribute("parentid", deleteOp->getParentID());
operationNode->setAttribute("elementid", deleteOp->getElementID());
@@ -199,7 +199,7 @@ namespace Swift {
case WhiteboardPayload::SessionTerminate:
return "session-terminate";
case WhiteboardPayload::UnknownType:
- SWIFT_LOG(warning) << "Serializing unknown action value." << std::endl;
+ SWIFT_LOG(warning) << "Serializing unknown action value.";
return "";
}
assert(false);
diff --git a/Swiften/Serializer/StanzaAckSerializer.h b/Swiften/Serializer/StanzaAckSerializer.h
index f5a27dc..228d67b 100644
--- a/Swiften/Serializer/StanzaAckSerializer.h
+++ b/Swiften/Serializer/StanzaAckSerializer.h
@@ -25,7 +25,7 @@ namespace Swift {
StanzaAck::ref stanzaAck(std::dynamic_pointer_cast<StanzaAck>(element));
assert(stanzaAck->isValid());
XMLElement result("a", "urn:xmpp:sm:2");
- result.setAttribute("h", std::string(boost::lexical_cast<std::string>(stanzaAck->getHandledStanzasCount())));
+ result.setAttribute("h", std::string(std::to_string(stanzaAck->getHandledStanzasCount())));
return createSafeByteArray(result.serialize());
}
};
diff --git a/Swiften/Serializer/StanzaSerializer.cpp b/Swiften/Serializer/StanzaSerializer.cpp
index 3de706d..d4231c5 100644
--- a/Swiften/Serializer/StanzaSerializer.cpp
+++ b/Swiften/Serializer/StanzaSerializer.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2019 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -53,7 +53,7 @@ SafeByteArray StanzaSerializer::serialize(std::shared_ptr<ToplevelElement> eleme
serializedPayloads += serializer->serialize(payload);
}
else {
- SWIFT_LOG(warning) << "Could not find serializer for " << typeid(*(payload.get())).name() << std::endl;
+ SWIFT_LOG(warning) << "Could not find serializer for " << typeid(*(payload.get())).name();
}
}
serializedPayloads = String::sanitizeXMPPString(serializedPayloads);
diff --git a/Swiften/Serializer/StreamErrorSerializer.cpp b/Swiften/Serializer/StreamErrorSerializer.cpp
index 66a71ca..684e8fe 100644
--- a/Swiften/Serializer/StreamErrorSerializer.cpp
+++ b/Swiften/Serializer/StreamErrorSerializer.cpp
@@ -30,7 +30,6 @@ SafeByteArray StreamErrorSerializer::serialize(std::shared_ptr<ToplevelElement>
case StreamError::ImproperAddressing: typeTag = "improper-addressing"; break;
case StreamError::InternalServerError: typeTag = "internal-server-error"; break;
case StreamError::InvalidFrom: typeTag = "invalid-from"; break;
- case StreamError::InvalidID: typeTag = "invalid-id"; break;
case StreamError::InvalidNamespace: typeTag = "invalid-namespace"; break;
case StreamError::InvalidXML: typeTag = "invalid-xml"; break;
case StreamError::NotAuthorized: typeTag = "not-authorized"; break;
@@ -44,6 +43,7 @@ SafeByteArray StreamErrorSerializer::serialize(std::shared_ptr<ToplevelElement>
case StreamError::SystemShutdown: typeTag = "system-shutdown"; break;
case StreamError::UndefinedCondition: typeTag = "undefined-condition"; break;
case StreamError::UnsupportedEncoding: typeTag = "unsupported-encoding"; break;
+ case StreamError::UnsupportedFeature: typeTag = "unsupported-feature"; break;
case StreamError::UnsupportedStanzaType: typeTag = "unsupported-stanza-type"; break;
case StreamError::UnsupportedVersion: typeTag = "unsupported-version"; break;
}
diff --git a/Swiften/Serializer/StreamResumeSerializer.cpp b/Swiften/Serializer/StreamResumeSerializer.cpp
index 619ac9c..e4a40c9 100644
--- a/Swiften/Serializer/StreamResumeSerializer.cpp
+++ b/Swiften/Serializer/StreamResumeSerializer.cpp
@@ -23,7 +23,7 @@ SafeByteArray StreamResumeSerializer::serialize(std::shared_ptr<ToplevelElement>
XMLElement element("resume", "urn:xmpp:sm:2");
element.setAttribute("previd", e->getResumeID());
if (e->getHandledStanzasCount()) {
- element.setAttribute("h", boost::lexical_cast<std::string>(e->getHandledStanzasCount().get()));
+ element.setAttribute("h", std::to_string(e->getHandledStanzasCount().get()));
}
return createSafeByteArray(element.serialize());
}
diff --git a/Swiften/Serializer/StreamResumedSerializer.cpp b/Swiften/Serializer/StreamResumedSerializer.cpp
index 5b88ded..2398335 100644
--- a/Swiften/Serializer/StreamResumedSerializer.cpp
+++ b/Swiften/Serializer/StreamResumedSerializer.cpp
@@ -23,7 +23,7 @@ SafeByteArray StreamResumedSerializer::serialize(std::shared_ptr<ToplevelElement
XMLElement element("resumed", "urn:xmpp:sm:2");
element.setAttribute("previd", e->getResumeID());
if (e->getHandledStanzasCount()) {
- element.setAttribute("h", boost::lexical_cast<std::string>(e->getHandledStanzasCount().get()));
+ element.setAttribute("h", std::to_string(e->getHandledStanzasCount().get()));
}
return createSafeByteArray(element.serialize());
}
diff --git a/Swiften/Serializer/XML/UnitTest/XMLElementTest.cpp b/Swiften/Serializer/XML/UnitTest/XMLElementTest.cpp
index ed3f8ab..ce6d7fa 100644
--- a/Swiften/Serializer/XML/UnitTest/XMLElementTest.cpp
+++ b/Swiften/Serializer/XML/UnitTest/XMLElementTest.cpp
@@ -65,6 +65,13 @@ class XMLElementTest : public CppUnit::TestFixture
CPPUNIT_ASSERT_EQUAL(std::string("<foo myatt=\"\"/>"), testling.serialize());
}
+
+ void testEscape_SpecialAttributeCharacters() {
+ auto testling = XMLElement::escapeAttributeValue(R"(<"'&>not escaped.)");
+
+ CPPUNIT_ASSERT_EQUAL(std::string("&lt;&quot;&apos;&amp;&gt;not escaped."), testling);
+ }
+
};
CPPUNIT_TEST_SUITE_REGISTRATION(XMLElementTest);
diff --git a/Swiften/Serializer/XML/XMLElement.cpp b/Swiften/Serializer/XML/XMLElement.cpp
index f2397ca..7515061 100644
--- a/Swiften/Serializer/XML/XMLElement.cpp
+++ b/Swiften/Serializer/XML/XMLElement.cpp
@@ -39,14 +39,17 @@ std::string XMLElement::serialize() {
return result;
}
+std::string XMLElement::escapeAttributeValue(std::string value) {
+ String::replaceAll(value, '&', "&amp;");
+ String::replaceAll(value, '<', "&lt;");
+ String::replaceAll(value, '>', "&gt;");
+ String::replaceAll(value, '\'', "&apos;");
+ String::replaceAll(value, '"', "&quot;");
+ return value;
+}
+
void XMLElement::setAttribute(const std::string& attribute, const std::string& value) {
- std::string escapedValue(value);
- String::replaceAll(escapedValue, '&', "&amp;");
- String::replaceAll(escapedValue, '<', "&lt;");
- String::replaceAll(escapedValue, '>', "&gt;");
- String::replaceAll(escapedValue, '\'', "&apos;");
- String::replaceAll(escapedValue, '"', "&quot;");
- attributes_[attribute] = escapedValue;
+ attributes_[attribute] = escapeAttributeValue(value);
}
void XMLElement::addNode(std::shared_ptr<XMLNode> node) {
diff --git a/Swiften/Serializer/XML/XMLElement.h b/Swiften/Serializer/XML/XMLElement.h
index 54de041..db74626 100644
--- a/Swiften/Serializer/XML/XMLElement.h
+++ b/Swiften/Serializer/XML/XMLElement.h
@@ -21,6 +21,7 @@ namespace Swift {
XMLElement(const std::string& tag, const std::string& xmlns = "", const std::string& text = "");
+ static std::string escapeAttributeValue(std::string value);
void setAttribute(const std::string& attribute, const std::string& value);
void addNode(std::shared_ptr<XMLNode> node);
diff --git a/Swiften/Serializer/XMPPSerializer.cpp b/Swiften/Serializer/XMPPSerializer.cpp
index 9cde777..7a003fb 100644
--- a/Swiften/Serializer/XMPPSerializer.cpp
+++ b/Swiften/Serializer/XMPPSerializer.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2019 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -89,7 +89,7 @@ SafeByteArray XMPPSerializer::serializeElement(std::shared_ptr<ToplevelElement>
return (*i)->serialize(element);
}
else {
- SWIFT_LOG(warning) << "Could not find serializer for " << typeid(*(element.get())).name() << std::endl;
+ SWIFT_LOG(warning) << "Could not find serializer for " << typeid(*(element.get())).name();
return createSafeByteArray("");
}
}
diff --git a/Swiften/Session/BasicSessionStream.cpp b/Swiften/Session/BasicSessionStream.cpp
index 10c6ad0..c44961d 100644
--- a/Swiften/Session/BasicSessionStream.cpp
+++ b/Swiften/Session/BasicSessionStream.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -34,11 +34,8 @@ BasicSessionStream::BasicSessionStream(
connection(connection),
tlsContextFactory(tlsContextFactory),
timerFactory(timerFactory),
- compressionLayer(nullptr),
- tlsLayer(nullptr),
- whitespacePingLayer(nullptr),
tlsOptions_(tlsOptions) {
- xmppLayer = new XMPPLayer(payloadParserFactories, payloadSerializers, xmlParserFactory, streamType);
+ auto xmppLayer = std::make_unique<XMPPLayer>(payloadParserFactories, payloadSerializers, xmlParserFactory, streamType);
xmppLayer->onStreamStart.connect(boost::bind(&BasicSessionStream::handleStreamStartReceived, this, _1));
xmppLayer->onStreamEnd.connect(boost::bind(&BasicSessionStream::handleStreamEndReceived, this));
xmppLayer->onElement.connect(boost::bind(&BasicSessionStream::handleElementReceived, this, _1));
@@ -47,53 +44,50 @@ BasicSessionStream::BasicSessionStream(
xmppLayer->onWriteData.connect(boost::bind(&BasicSessionStream::handleDataWritten, this, _1));
connection->onDisconnected.connect(boost::bind(&BasicSessionStream::handleConnectionFinished, this, _1));
- connectionLayer = new ConnectionLayer(connection);
-
- streamStack = new StreamStack(xmppLayer, connectionLayer);
+ streamStack = std::make_unique<StreamStack>(std::move(xmppLayer), std::unique_ptr<ConnectionLayer>(new ConnectionLayer(connection)));
available = true;
}
BasicSessionStream::~BasicSessionStream() {
- delete compressionLayer;
- if (tlsLayer) {
+ if (auto tlsLayer = streamStack->getLayer<TLSLayer>()) {
tlsLayer->onError.disconnect(boost::bind(&BasicSessionStream::handleTLSError, this, _1));
tlsLayer->onConnected.disconnect(boost::bind(&BasicSessionStream::handleTLSConnected, this));
- delete tlsLayer;
}
- delete whitespacePingLayer;
- delete streamStack;
connection->onDisconnected.disconnect(boost::bind(&BasicSessionStream::handleConnectionFinished, this, _1));
- delete connectionLayer;
+ auto xmppLayer = streamStack->getLayer<XMPPLayer>();
xmppLayer->onStreamStart.disconnect(boost::bind(&BasicSessionStream::handleStreamStartReceived, this, _1));
xmppLayer->onStreamEnd.disconnect(boost::bind(&BasicSessionStream::handleStreamEndReceived, this));
xmppLayer->onElement.disconnect(boost::bind(&BasicSessionStream::handleElementReceived, this, _1));
xmppLayer->onError.disconnect(boost::bind(&BasicSessionStream::handleXMPPError, this));
xmppLayer->onDataRead.disconnect(boost::bind(&BasicSessionStream::handleDataRead, this, _1));
xmppLayer->onWriteData.disconnect(boost::bind(&BasicSessionStream::handleDataWritten, this, _1));
- delete xmppLayer;
}
void BasicSessionStream::writeHeader(const ProtocolHeader& header) {
assert(available);
+ auto* xmppLayer = streamStack->getLayer<XMPPLayer>();
xmppLayer->writeHeader(header);
}
void BasicSessionStream::writeElement(std::shared_ptr<ToplevelElement> element) {
assert(available);
+ auto* xmppLayer = streamStack->getLayer<XMPPLayer>();
xmppLayer->writeElement(element);
}
void BasicSessionStream::writeFooter() {
assert(available);
+ auto* xmppLayer = streamStack->getLayer<XMPPLayer>();
xmppLayer->writeFooter();
}
void BasicSessionStream::writeData(const std::string& data) {
assert(available);
+ auto* xmppLayer = streamStack->getLayer<XMPPLayer>();
xmppLayer->writeData(data);
}
@@ -111,12 +105,14 @@ bool BasicSessionStream::supportsTLSEncryption() {
void BasicSessionStream::addTLSEncryption() {
assert(available);
- tlsLayer = new TLSLayer(tlsContextFactory, tlsOptions_);
+ auto tlsContext = tlsContextFactory->createTLSContext(tlsOptions_);
+ auto tlsLayer = std::make_unique<TLSLayer>(std::move(tlsContext));
if (hasTLSCertificate() && !tlsLayer->setClientCertificate(getTLSCertificate())) {
onClosed(std::make_shared<SessionStreamError>(SessionStreamError::InvalidTLSCertificateError));
}
else {
- streamStack->addLayer(tlsLayer);
+ streamStack->addLayer(std::move(tlsLayer));
+ auto tlsLayer = streamStack->getLayer<TLSLayer>();
tlsLayer->onError.connect(boost::bind(&BasicSessionStream::handleTLSError, this, _1));
tlsLayer->onConnected.connect(boost::bind(&BasicSessionStream::handleTLSConnected, this));
tlsLayer->connect();
@@ -124,23 +120,23 @@ void BasicSessionStream::addTLSEncryption() {
}
bool BasicSessionStream::isTLSEncrypted() {
- return tlsLayer;
+ return streamStack->getLayer<TLSLayer>();
}
Certificate::ref BasicSessionStream::getPeerCertificate() const {
- return tlsLayer->getPeerCertificate();
+ return streamStack->getLayer<TLSLayer>()->getPeerCertificate();
}
std::vector<Certificate::ref> BasicSessionStream::getPeerCertificateChain() const {
- return tlsLayer->getPeerCertificateChain();
+ return streamStack->getLayer<TLSLayer>()->getPeerCertificateChain();
}
std::shared_ptr<CertificateVerificationError> BasicSessionStream::getPeerCertificateVerificationError() const {
- return tlsLayer->getPeerCertificateVerificationError();
+ return streamStack->getLayer<TLSLayer>()->getPeerCertificateVerificationError();
}
ByteArray BasicSessionStream::getTLSFinishMessage() const {
- return tlsLayer->getContext()->getFinishMessage();
+ return streamStack->getLayer<TLSLayer>()->getContext()->getFinishMessage();
}
bool BasicSessionStream::supportsZLibCompression() {
@@ -148,15 +144,15 @@ bool BasicSessionStream::supportsZLibCompression() {
}
void BasicSessionStream::addZLibCompression() {
- compressionLayer = new CompressionLayer();
- streamStack->addLayer(compressionLayer);
+ streamStack->addLayer(std::make_unique<CompressionLayer>());
}
void BasicSessionStream::setWhitespacePingEnabled(bool enabled) {
+ auto whitespacePingLayer = streamStack->getLayer<WhitespacePingLayer>();
if (enabled) {
if (!whitespacePingLayer) {
- whitespacePingLayer = new WhitespacePingLayer(timerFactory);
- streamStack->addLayer(whitespacePingLayer);
+ streamStack->addLayer(std::make_unique<WhitespacePingLayer>(timerFactory));
+ whitespacePingLayer = streamStack->getLayer<WhitespacePingLayer>();
}
whitespacePingLayer->setActive();
}
@@ -166,6 +162,7 @@ void BasicSessionStream::setWhitespacePingEnabled(bool enabled) {
}
void BasicSessionStream::resetXMPPParser() {
+ auto* xmppLayer = streamStack->getLayer<XMPPLayer>();
xmppLayer->resetParser();
}
diff --git a/Swiften/Session/BasicSessionStream.h b/Swiften/Session/BasicSessionStream.h
index 48b3d63..30a7e3b 100644
--- a/Swiften/Session/BasicSessionStream.h
+++ b/Swiften/Session/BasicSessionStream.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -83,12 +83,7 @@ namespace Swift {
std::shared_ptr<Connection> connection;
TLSContextFactory* tlsContextFactory;
TimerFactory* timerFactory;
- XMPPLayer* xmppLayer;
- ConnectionLayer* connectionLayer;
- CompressionLayer* compressionLayer;
- TLSLayer* tlsLayer;
- WhitespacePingLayer* whitespacePingLayer;
- StreamStack* streamStack;
+ std::unique_ptr<StreamStack> streamStack;
TLSOptions tlsOptions_;
};
diff --git a/Swiften/Session/Session.cpp b/Swiften/Session/Session.cpp
index ebdb5d1..b1525b8 100644
--- a/Swiften/Session/Session.cpp
+++ b/Swiften/Session/Session.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -22,16 +22,10 @@ Session::Session(
payloadParserFactories(payloadParserFactories),
payloadSerializers(payloadSerializers),
xmlParserFactory(xmlParserFactory),
- xmppLayer(nullptr),
- connectionLayer(nullptr),
- streamStack(nullptr),
finishing(false) {
}
Session::~Session() {
- delete streamStack;
- delete connectionLayer;
- delete xmppLayer;
}
void Session::startSession() {
@@ -44,7 +38,7 @@ void Session::finishSession() {
return;
}
finishing = true;
- if (xmppLayer) {
+ if (auto xmppLayer = getXMPPLayer()) {
xmppLayer->writeFooter();
}
connection->disconnect();
@@ -55,14 +49,14 @@ void Session::finishSession(const SessionError& /*error*/) {
return;
}
finishing = true;
- if (xmppLayer) {
+ if (auto xmppLayer = getXMPPLayer()) {
xmppLayer->writeFooter();
}
connection->disconnect();
}
void Session::initializeStreamStack() {
- xmppLayer = new XMPPLayer(payloadParserFactories, payloadSerializers, xmlParserFactory, ClientStreamType);
+ auto xmppLayer = std::unique_ptr<XMPPLayer>(new XMPPLayer(payloadParserFactories, payloadSerializers, xmlParserFactory, ClientStreamType));
xmppLayer->onStreamStart.connect(
boost::bind(&Session::handleStreamStart, this, _1));
xmppLayer->onElement.connect(boost::bind(&Session::handleElement, this, _1));
@@ -72,12 +66,20 @@ void Session::initializeStreamStack() {
xmppLayer->onWriteData.connect(boost::bind(boost::ref(onDataWritten), _1));
connection->onDisconnected.connect(
boost::bind(&Session::handleDisconnected, this, _1));
- connectionLayer = new ConnectionLayer(connection);
- streamStack = new StreamStack(xmppLayer, connectionLayer);
+ streamStack = std::unique_ptr<StreamStack>(new StreamStack(std::move(xmppLayer), std::unique_ptr<ConnectionLayer>(new ConnectionLayer(connection))));
}
+XMPPLayer* Session::getXMPPLayer() const {
+ return dynamic_cast<XMPPLayer*>(streamStack->getTopLayer());
+}
+
+StreamStack* Session::getStreamStack() const {
+ return streamStack.get();
+}
+
+
void Session::sendElement(std::shared_ptr<ToplevelElement> stanza) {
- xmppLayer->writeElement(stanza);
+ getXMPPLayer()->writeElement(stanza);
}
void Session::handleDisconnected(const boost::optional<Connection::Error>& connectionError) {
diff --git a/Swiften/Session/Session.h b/Swiften/Session/Session.h
index 04153ec..e6a0d53 100644
--- a/Swiften/Session/Session.h
+++ b/Swiften/Session/Session.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010-2017 Isode Limited.
+ * Copyright (c) 2010-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -85,13 +85,8 @@ namespace Swift {
void initializeStreamStack();
- XMPPLayer* getXMPPLayer() const {
- return xmppLayer;
- }
-
- StreamStack* getStreamStack() const {
- return streamStack;
- }
+ XMPPLayer* getXMPPLayer() const;
+ StreamStack* getStreamStack() const;
void setFinished();
@@ -105,9 +100,8 @@ namespace Swift {
PayloadParserFactoryCollection* payloadParserFactories;
PayloadSerializerCollection* payloadSerializers;
XMLParserFactory* xmlParserFactory;
- XMPPLayer* xmppLayer;
- ConnectionLayer* connectionLayer;
- StreamStack* streamStack;
+
+ std::unique_ptr<StreamStack> streamStack;
bool finishing;
};
}
diff --git a/Swiften/StreamManagement/StanzaAckRequester.cpp b/Swiften/StreamManagement/StanzaAckRequester.cpp
index 8941f4a..c71803a 100644
--- a/Swiften/StreamManagement/StanzaAckRequester.cpp
+++ b/Swiften/StreamManagement/StanzaAckRequester.cpp
@@ -1,19 +1,17 @@
/*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2019 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
#include <Swiften/StreamManagement/StanzaAckRequester.h>
-#include <boost/numeric/conversion/cast.hpp>
-
#include <Swiften/Base/Log.h>
#include <Swiften/Elements/Message.h>
namespace Swift {
-static const unsigned int MAX_HANDLED_STANZA_COUNT = boost::numeric_cast<unsigned int>((1ULL<<32) - 1);
+static const unsigned int MAX_HANDLED_STANZA_COUNT = static_cast<unsigned int>((1ULL<<32) - 1);
StanzaAckRequester::StanzaAckRequester() : lastHandledStanzasCount(0) {
@@ -30,7 +28,7 @@ void StanzaAckRequester::handleAckReceived(unsigned int handledStanzasCount) {
unsigned int i = lastHandledStanzasCount;
while (i != handledStanzasCount) {
if (unackedStanzas.empty()) {
- SWIFT_LOG(warning) << "Server acked more stanzas than we sent" << std::endl;
+ SWIFT_LOG(warning) << "Server acked more stanzas than we sent";
break;
}
std::shared_ptr<Stanza> ackedStanza = unackedStanzas.front();
diff --git a/Swiften/StreamManagement/StanzaAckResponder.cpp b/Swiften/StreamManagement/StanzaAckResponder.cpp
index b6171d0..bfe6f4d 100644
--- a/Swiften/StreamManagement/StanzaAckResponder.cpp
+++ b/Swiften/StreamManagement/StanzaAckResponder.cpp
@@ -1,16 +1,14 @@
/*
- * Copyright (c) 2010 Isode Limited.
+ * Copyright (c) 2010-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
#include <Swiften/StreamManagement/StanzaAckResponder.h>
-#include <boost/numeric/conversion/cast.hpp>
-
namespace Swift {
-static const unsigned int MAX_HANDLED_STANZA_COUNT = boost::numeric_cast<unsigned int>((1ULL<<32) - 1);
+static const unsigned int MAX_HANDLED_STANZA_COUNT = static_cast<unsigned int>((1ULL << 32) - 1);
StanzaAckResponder::StanzaAckResponder() : handledStanzasCount(0) {
}
diff --git a/Swiften/StreamManagement/UnitTest/StanzaAckRequesterTest.cpp b/Swiften/StreamManagement/UnitTest/StanzaAckRequesterTest.cpp
index ce16e1f..e0ebefd 100644
--- a/Swiften/StreamManagement/UnitTest/StanzaAckRequesterTest.cpp
+++ b/Swiften/StreamManagement/UnitTest/StanzaAckRequesterTest.cpp
@@ -1,11 +1,12 @@
/*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
+#include <cstdint>
+
#include <boost/bind.hpp>
-#include <boost/numeric/conversion/cast.hpp>
#include <cppunit/extensions/HelperMacros.h>
#include <cppunit/extensions/TestFactoryRegistry.h>
@@ -111,7 +112,7 @@ class StanzaAckRequesterTest : public CppUnit::TestFixture {
// Handle stanza ack count wrapping, as per the XEP
void testHandleAckReceived_WrapAround() {
std::shared_ptr<StanzaAckRequester> testling(createRequester());
- testling->lastHandledStanzasCount = boost::numeric_cast<unsigned int>((1ULL<<32) - 1);
+ testling->lastHandledStanzasCount = UINT32_MAX;
testling->handleStanzaSent(createMessage("m1"));
testling->handleStanzaSent(createMessage("m2"));
diff --git a/Swiften/StreamManagement/UnitTest/StanzaAckResponderTest.cpp b/Swiften/StreamManagement/UnitTest/StanzaAckResponderTest.cpp
index ffdabe9..ee4b913 100644
--- a/Swiften/StreamManagement/UnitTest/StanzaAckResponderTest.cpp
+++ b/Swiften/StreamManagement/UnitTest/StanzaAckResponderTest.cpp
@@ -1,11 +1,12 @@
/*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
+#include <cstdint>
+
#include <boost/bind.hpp>
-#include <boost/numeric/conversion/cast.hpp>
#include <cppunit/extensions/HelperMacros.h>
#include <cppunit/extensions/TestFactoryRegistry.h>
@@ -63,7 +64,7 @@ class StanzaAckResponderTest : public CppUnit::TestFixture {
// Handle stanza ack count wrapping, as per the XEP
void testHandleAckRequestReceived_WrapAround() {
std::shared_ptr<StanzaAckResponder> testling(createResponder());
- testling->handledStanzasCount = boost::numeric_cast<unsigned int>((1ULL<<32) - 1);
+ testling->handledStanzasCount = UINT32_MAX;
testling->handleStanzaReceived();
testling->handleStanzaReceived();
diff --git a/Swiften/StreamStack/StreamStack.cpp b/Swiften/StreamStack/StreamStack.cpp
index 44a018d..cf80fb1 100644
--- a/Swiften/StreamStack/StreamStack.cpp
+++ b/Swiften/StreamStack/StreamStack.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -8,30 +8,30 @@
#include <boost/bind.hpp>
+#include <Swiften/StreamStack/HighLayer.h>
#include <Swiften/StreamStack/LowLayer.h>
#include <Swiften/StreamStack/StreamLayer.h>
-#include <Swiften/StreamStack/XMPPLayer.h>
namespace Swift {
-StreamStack::StreamStack(XMPPLayer* xmppLayer, LowLayer* physicalLayer) : xmppLayer_(xmppLayer), physicalLayer_(physicalLayer) {
- physicalLayer_->setParentLayer(xmppLayer_);
- xmppLayer_->setChildLayer(physicalLayer_);
+StreamStack::StreamStack(std::unique_ptr<HighLayer> topLayer, std::unique_ptr<LowLayer> bottomLayer) : topLayer_(std::move(topLayer)), bottomLayer_(std::move(bottomLayer)) {
+ bottomLayer_->setParentLayer(topLayer_.get());
+ topLayer_->setChildLayer(bottomLayer_.get());
}
StreamStack::~StreamStack() {
}
-void StreamStack::addLayer(StreamLayer* newLayer) {
- LowLayer* lowLayer = layers_.empty() ? physicalLayer_ : *layers_.rbegin();
+void StreamStack::addLayer(std::unique_ptr<StreamLayer> streamLayer) {
+ auto* lowLayer = layers_.empty() ? bottomLayer_.get() : layers_.rbegin()->get();
- xmppLayer_->setChildLayer(newLayer);
- newLayer->setParentLayer(xmppLayer_);
+ topLayer_->setChildLayer(streamLayer.get());
+ streamLayer->setParentLayer(topLayer_.get());
- lowLayer->setParentLayer(newLayer);
- newLayer->setChildLayer(lowLayer);
+ lowLayer->setParentLayer(streamLayer.get());
+ streamLayer->setChildLayer(lowLayer);
- layers_.push_back(newLayer);
+ layers_.emplace_back(std::move(streamLayer));
}
}
diff --git a/Swiften/StreamStack/StreamStack.h b/Swiften/StreamStack/StreamStack.h
index b12a69f..263b1f5 100644
--- a/Swiften/StreamStack/StreamStack.h
+++ b/Swiften/StreamStack/StreamStack.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -15,34 +15,40 @@
#include <Swiften/Elements/Stanza.h>
namespace Swift {
- class XMPPLayer;
+ class HighLayer;
class LowLayer;
class StreamLayer;
class SWIFTEN_API StreamStack {
public:
- StreamStack(XMPPLayer* xmppLayer, LowLayer* physicalLayer);
+ StreamStack(std::unique_ptr<HighLayer> topLayer, std::unique_ptr<LowLayer> bottomLayer);
~StreamStack();
- void addLayer(StreamLayer*);
+ void addLayer(std::unique_ptr<StreamLayer> /* streamLayer */);
- XMPPLayer* getXMPPLayer() const {
- return xmppLayer_;
+ HighLayer* getTopLayer() const {
+ return topLayer_.get();
}
- template<typename T> T* getLayer() {
- for (auto& i : layers_) {
- T* layer = dynamic_cast<T*>(i);
+ template<typename T> T* getLayer() const {
+ for (const auto& i : layers_) {
+ T* layer = dynamic_cast<T*>(i.get());
if (layer) {
return layer;
}
}
+ if (T* layer = dynamic_cast<T*>(topLayer_.get())) {
+ return layer;
+ }
+ if (T* layer = dynamic_cast<T*>(bottomLayer_.get())) {
+ return layer;
+ }
return nullptr;
}
private:
- XMPPLayer* xmppLayer_;
- LowLayer* physicalLayer_;
- std::vector<StreamLayer*> layers_;
+ std::unique_ptr<HighLayer> topLayer_;
+ std::unique_ptr<LowLayer> bottomLayer_;
+ std::vector<std::unique_ptr<StreamLayer>> layers_;
};
}
diff --git a/Swiften/StreamStack/TLSLayer.cpp b/Swiften/StreamStack/TLSLayer.cpp
index ced879e..9f84889 100644
--- a/Swiften/StreamStack/TLSLayer.cpp
+++ b/Swiften/StreamStack/TLSLayer.cpp
@@ -1,11 +1,13 @@
/*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
#include <Swiften/StreamStack/TLSLayer.h>
+#include <memory>
+
#include <boost/bind.hpp>
#include <Swiften/TLS/TLSContext.h>
@@ -13,44 +15,42 @@
namespace Swift {
-TLSLayer::TLSLayer(TLSContextFactory* factory, const TLSOptions& tlsOptions) {
- context = factory->createTLSContext(tlsOptions);
- context->onDataForNetwork.connect(boost::bind(&TLSLayer::writeDataToChildLayer, this, _1));
- context->onDataForApplication.connect(boost::bind(&TLSLayer::writeDataToParentLayer, this, _1));
- context->onConnected.connect(onConnected);
- context->onError.connect(onError);
+TLSLayer::TLSLayer(std::unique_ptr<TLSContext> tlsContext) : context_(std::move(tlsContext)) {
+ context_->onDataForNetwork.connect(boost::bind(&TLSLayer::writeDataToChildLayer, this, _1));
+ context_->onDataForApplication.connect(boost::bind(&TLSLayer::writeDataToParentLayer, this, _1));
+ context_->onConnected.connect(onConnected);
+ context_->onError.connect(onError);
}
TLSLayer::~TLSLayer() {
- delete context;
}
void TLSLayer::connect() {
- context->connect();
+ context_->connect();
}
void TLSLayer::writeData(const SafeByteArray& data) {
- context->handleDataFromApplication(data);
+ context_->handleDataFromApplication(data);
}
void TLSLayer::handleDataRead(const SafeByteArray& data) {
- context->handleDataFromNetwork(data);
+ context_->handleDataFromNetwork(data);
}
bool TLSLayer::setClientCertificate(CertificateWithKey::ref certificate) {
- return context->setClientCertificate(certificate);
+ return context_->setClientCertificate(certificate);
}
Certificate::ref TLSLayer::getPeerCertificate() const {
- return context->getPeerCertificate();
+ return context_->getPeerCertificate();
}
std::vector<Certificate::ref> TLSLayer::getPeerCertificateChain() const {
- return context->getPeerCertificateChain();
+ return context_->getPeerCertificateChain();
}
std::shared_ptr<CertificateVerificationError> TLSLayer::getPeerCertificateVerificationError() const {
- return context->getPeerCertificateVerificationError();
+ return context_->getPeerCertificateVerificationError();
}
}
diff --git a/Swiften/StreamStack/TLSLayer.h b/Swiften/StreamStack/TLSLayer.h
index 415a3f0..89588e3 100644
--- a/Swiften/StreamStack/TLSLayer.h
+++ b/Swiften/StreamStack/TLSLayer.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -23,7 +23,7 @@ namespace Swift {
class SWIFTEN_API TLSLayer : public StreamLayer {
public:
- TLSLayer(TLSContextFactory*, const TLSOptions&);
+ TLSLayer(std::unique_ptr<TLSContext> tlsContext);
virtual ~TLSLayer();
void connect();
@@ -37,7 +37,7 @@ namespace Swift {
void handleDataRead(const SafeByteArray& data);
TLSContext* getContext() const {
- return context;
+ return context_.get();
}
public:
@@ -45,6 +45,6 @@ namespace Swift {
boost::signals2::signal<void ()> onConnected;
private:
- TLSContext* context;
+ std::unique_ptr<TLSContext> context_;
};
}
diff --git a/Swiften/StreamStack/UnitTest/StreamStackTest.cpp b/Swiften/StreamStack/UnitTest/StreamStackTest.cpp
index f0f82c9..b074736 100644
--- a/Swiften/StreamStack/UnitTest/StreamStackTest.cpp
+++ b/Swiften/StreamStack/UnitTest/StreamStackTest.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -39,19 +39,17 @@ class StreamStackTest : public CppUnit::TestFixture {
public:
void setUp() {
- physicalStream_ = new TestLowLayer();
- xmppStream_ = new XMPPLayer(&parserFactories_, &serializers_, &xmlParserFactory_, ClientStreamType);
+ testling_ = std::make_unique<StreamStack>(std::make_unique<XMPPLayer>(&parserFactories_, &serializers_, &xmlParserFactory_, ClientStreamType), std::make_unique<TestLowLayer>());
+ physicalStream_ = testling_->getLayer<TestLowLayer>();
+ xmppStream_ = testling_->getLayer<XMPPLayer>();
elementsReceived_ = 0;
dataWriteReceived_ = 0;
}
void tearDown() {
- delete physicalStream_;
- delete xmppStream_;
}
void testWriteData_NoIntermediateStreamStack() {
- StreamStack testling(xmppStream_, physicalStream_);
xmppStream_->writeData("foo");
@@ -60,9 +58,8 @@ class StreamStackTest : public CppUnit::TestFixture {
}
void testWriteData_OneIntermediateStream() {
- StreamStack testling(xmppStream_, physicalStream_);
- std::shared_ptr<MyStreamLayer> xStream(new MyStreamLayer("X"));
- testling.addLayer(xStream.get());
+ std::unique_ptr<MyStreamLayer> xStream(new MyStreamLayer("X"));
+ testling_->addLayer(std::move(xStream));
xmppStream_->writeData("foo");
@@ -71,11 +68,10 @@ class StreamStackTest : public CppUnit::TestFixture {
}
void testWriteData_TwoIntermediateStreamStack() {
- StreamStack testling(xmppStream_, physicalStream_);
- std::shared_ptr<MyStreamLayer> xStream(new MyStreamLayer("X"));
- std::shared_ptr<MyStreamLayer> yStream(new MyStreamLayer("Y"));
- testling.addLayer(xStream.get());
- testling.addLayer(yStream.get());
+ std::unique_ptr<MyStreamLayer> xStream(new MyStreamLayer("X"));
+ std::unique_ptr<MyStreamLayer> yStream(new MyStreamLayer("Y"));
+ testling_->addLayer(std::move(xStream));
+ testling_->addLayer(std::move(yStream));
xmppStream_->writeData("foo");
@@ -84,7 +80,6 @@ class StreamStackTest : public CppUnit::TestFixture {
}
void testReadData_NoIntermediateStreamStack() {
- StreamStack testling(xmppStream_, physicalStream_);
xmppStream_->onElement.connect(boost::bind(&StreamStackTest::handleElement, this, _1));
physicalStream_->onDataRead(createSafeByteArray("<stream:stream xmlns:stream='http://etherx.jabber.org/streams'><presence/>"));
@@ -93,10 +88,9 @@ class StreamStackTest : public CppUnit::TestFixture {
}
void testReadData_OneIntermediateStream() {
- StreamStack testling(xmppStream_, physicalStream_);
xmppStream_->onElement.connect(boost::bind(&StreamStackTest::handleElement, this, _1));
- std::shared_ptr<MyStreamLayer> xStream(new MyStreamLayer("<"));
- testling.addLayer(xStream.get());
+ std::unique_ptr<MyStreamLayer> xStream(new MyStreamLayer("<"));
+ testling_->addLayer(std::move(xStream));
physicalStream_->onDataRead(createSafeByteArray("stream:stream xmlns:stream='http://etherx.jabber.org/streams'><presence/>"));
@@ -104,12 +98,11 @@ class StreamStackTest : public CppUnit::TestFixture {
}
void testReadData_TwoIntermediateStreamStack() {
- StreamStack testling(xmppStream_, physicalStream_);
xmppStream_->onElement.connect(boost::bind(&StreamStackTest::handleElement, this, _1));
- std::shared_ptr<MyStreamLayer> xStream(new MyStreamLayer("s"));
- std::shared_ptr<MyStreamLayer> yStream(new MyStreamLayer("<"));
- testling.addLayer(xStream.get());
- testling.addLayer(yStream.get());
+ std::unique_ptr<MyStreamLayer> xStream(new MyStreamLayer("s"));
+ std::unique_ptr<MyStreamLayer> yStream(new MyStreamLayer("<"));
+ testling_->addLayer(std::move(xStream));
+ testling_->addLayer(std::move(yStream));
physicalStream_->onDataRead(createSafeByteArray("tream:stream xmlns:stream='http://etherx.jabber.org/streams'><presence/>"));
@@ -117,10 +110,9 @@ class StreamStackTest : public CppUnit::TestFixture {
}
void testAddLayer_ExistingOnWriteDataSlot() {
- StreamStack testling(xmppStream_, physicalStream_);
xmppStream_->onWriteData.connect(boost::bind(&StreamStackTest::handleWriteData, this, _1));
- std::shared_ptr<MyStreamLayer> xStream(new MyStreamLayer("X"));
- testling.addLayer(xStream.get());
+ std::unique_ptr<MyStreamLayer> xStream(new MyStreamLayer("X"));
+ testling_->addLayer(std::move(xStream));
xmppStream_->writeData("foo");
@@ -176,6 +168,7 @@ class StreamStackTest : public CppUnit::TestFixture {
TestLowLayer* physicalStream_;
PlatformXMLParserFactory xmlParserFactory_;
XMPPLayer* xmppStream_;
+ std::unique_ptr<StreamStack> testling_;
int elementsReceived_;
int dataWriteReceived_;
};
diff --git a/Swiften/StreamStack/WhitespacePingLayer.cpp b/Swiften/StreamStack/WhitespacePingLayer.cpp
index 9a473f3..7c8301e 100644
--- a/Swiften/StreamStack/WhitespacePingLayer.cpp
+++ b/Swiften/StreamStack/WhitespacePingLayer.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2019 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -22,7 +22,7 @@ WhitespacePingLayer::WhitespacePingLayer(TimerFactory* timerFactory) : isActive(
}
WhitespacePingLayer::~WhitespacePingLayer() {
- SWIFT_LOG_ASSERT(!isActive, debug) << "WhitespacePingLayer still active at destruction." << std::endl;
+ SWIFT_LOG_ASSERT(!isActive, debug) << "WhitespacePingLayer still active at destruction.";
if (isActive) {
timer->stop();
}
diff --git a/Swiften/TLS/CAPICertificate.cpp b/Swiften/TLS/CAPICertificate.cpp
index a46b9f6..526b535 100644
--- a/Swiften/TLS/CAPICertificate.cpp
+++ b/Swiften/TLS/CAPICertificate.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012-2016 Isode Limited.
+ * Copyright (c) 2012-2019 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -14,6 +14,7 @@
#include <Swiften/Base/Log.h>
#include <Swiften/Network/TimerFactory.h>
#include <Swiften/StringCodecs/Hexify.h>
+#include <Swiften/TLS/Schannel/SchannelUtil.h>
// Size of the SHA1 hash
#define SHA1_HASH_LEN 20
@@ -21,7 +22,7 @@
#define DEBUG_SCARD_STATUS(function, status) \
{ \
std::shared_ptr<boost::system::error_code> errorCode = std::make_shared<boost::system::error_code>(status, boost::system::system_category()); \
- SWIFT_LOG(debug) << std::hex << function << ": status: 0x" << status << ": " << errorCode->message() << std::endl; \
+ SWIFT_LOG(debug) << std::hex << function << ": status: 0x" << status << ": " << errorCode->message(); \
}
namespace Swift {
@@ -43,6 +44,7 @@ CAPICertificate::CAPICertificate(const std::string& capiUri, TimerFactory* timer
}
CAPICertificate::~CAPICertificate() {
+ SWIFT_LOG(debug) << "Destroying the CAPICertificate";
if (smartCardTimer_) {
smartCardTimer_->stop();
smartCardTimer_->onTick.disconnect(boost::bind(&CAPICertificate::handleSmartCardTimerTick, this));
@@ -50,7 +52,9 @@ CAPICertificate::~CAPICertificate() {
}
if (certStoreHandle_) {
- CertCloseStore(certStoreHandle_, 0);
+ if (CertCloseStore(certStoreHandle_, 0) == FALSE) {
+ SWIFT_LOG(debug) << "Failed to close the certificate store handle";
+ }
}
if (cardHandle_) {
@@ -80,7 +84,7 @@ const std::string& CAPICertificate::getSmartCardReaderName() const {
return smartCardReaderName_;
}
-PCCERT_CONTEXT findCertificateInStore (HCERTSTORE certStoreHandle, const std::string &certName) {
+PCCERT_CONTEXT findCertificateInStore(HCERTSTORE certStoreHandle, const std::string &certName) {
if (!boost::iequals(certName.substr(0, 5), "sha1:")) {
// Find client certificate. Note that this sample just searches for a
@@ -105,8 +109,7 @@ PCCERT_CONTEXT findCertificateInStore (HCERTSTORE certStoreHandle, const std::st
}
-
-void CAPICertificate::setUri (const std::string& capiUri) {
+void CAPICertificate::setUri(const std::string& capiUri) {
valid_ = false;
/* Syntax: "certstore:" <cert_store> ":" <hash> ":" <hash_of_cert> */
@@ -118,7 +121,7 @@ void CAPICertificate::setUri (const std::string& capiUri) {
/* Substring of subject: uses "storename" */
std::string capiIdentity = capiUri.substr(10);
std::string newCertStoreName;
- size_t pos = capiIdentity.find_first_of (':');
+ size_t pos = capiIdentity.find_first_of(':');
if (pos == std::string::npos) {
/* Using the default certificate store */
@@ -146,49 +149,38 @@ void CAPICertificate::setUri (const std::string& capiUri) {
certStore_ = newCertStoreName;
- PCCERT_CONTEXT certContext = findCertificateInStore (certStoreHandle_, certName_);
-
+ ScopedCertContext certContext(findCertificateInStore(certStoreHandle_, certName_));
if (!certContext) {
return;
}
-
/* Now verify that we can have access to the corresponding private key */
DWORD len;
- CRYPT_KEY_PROV_INFO *pinfo;
- HCRYPTPROV hprov;
- HCRYPTKEY key;
-
if (!CertGetCertificateContextProperty(certContext,
CERT_KEY_PROV_INFO_PROP_ID,
NULL,
&len)) {
- CertFreeCertificateContext(certContext);
+ SWIFT_LOG(error) << "Error while retrieving context properties";
return;
}
- pinfo = static_cast<CRYPT_KEY_PROV_INFO *>(malloc(len));
+ std::shared_ptr<CRYPT_KEY_PROV_INFO> pinfo(static_cast<CRYPT_KEY_PROV_INFO *>(malloc(len)), free);
if (!pinfo) {
- CertFreeCertificateContext(certContext);
return;
}
- if (!CertGetCertificateContextProperty(certContext, CERT_KEY_PROV_INFO_PROP_ID, pinfo, &len)) {
- CertFreeCertificateContext(certContext);
- free(pinfo);
+ if (!CertGetCertificateContextProperty(certContext, CERT_KEY_PROV_INFO_PROP_ID, pinfo.get(), &len)) {
return;
}
+ certContext.FreeContext();
- CertFreeCertificateContext(certContext);
-
+ HCRYPTPROV hprov;
// Now verify if we have access to the private key
if (!CryptAcquireContextW(&hprov, pinfo->pwszContainerName, pinfo->pwszProvName, pinfo->dwProvType, 0)) {
- free(pinfo);
return;
}
-
char smartCardReader[1024];
DWORD bufferLength = sizeof(smartCardReader);
if (!CryptGetProvParam(hprov, PP_SMARTCARD_READER, (BYTE *)&smartCardReader, &bufferLength, 0)) {
@@ -205,19 +197,19 @@ void CAPICertificate::setUri (const std::string& capiUri) {
smartCardTimer_ = timerFactory_->createTimer(SMARTCARD_EJECTION_CHECK_FREQUENCY_MILLISECONDS);
}
else {
- ///Need to handle an error here
+ CryptReleaseContext(hprov, 0);
+ return;
}
}
+ HCRYPTKEY key;
if (!CryptGetUserKey(hprov, pinfo->dwKeySpec, &key)) {
CryptReleaseContext(hprov, 0);
- free(pinfo);
return;
}
CryptDestroyKey(key);
CryptReleaseContext(hprov, 0);
- free(pinfo);
if (smartCardTimer_) {
smartCardTimer_->onTick.connect(boost::bind(&CAPICertificate::handleSmartCardTimerTick, this));
@@ -227,7 +219,7 @@ void CAPICertificate::setUri (const std::string& capiUri) {
valid_ = true;
}
-static void smartcard_check_status (SCARDCONTEXT hContext,
+static void smartcard_check_status(SCARDCONTEXT hContext,
const char* pReader,
SCARDHANDLE hCardHandle, /* Can be 0 on the first call */
SCARDHANDLE* newCardHandle, /* The handle returned */
@@ -288,37 +280,35 @@ static void smartcard_check_status (SCARDCONTEXT hContext,
}
}
-bool CAPICertificate::checkIfSmartCardPresent () {
+bool CAPICertificate::checkIfSmartCardPresent() {
if (!smartCardReaderName_.empty()) {
DWORD dwState;
smartcard_check_status(scardContext_, smartCardReaderName_.c_str(), cardHandle_, &cardHandle_, &dwState);
switch (dwState) {
case SCARD_ABSENT:
- SWIFT_LOG(debug) << "Card absent." << std::endl;
+ SWIFT_LOG(debug) << "Card absent.";
break;
case SCARD_PRESENT:
- SWIFT_LOG(debug) << "Card present." << std::endl;
+ SWIFT_LOG(debug) << "Card present.";
break;
case SCARD_SWALLOWED:
- SWIFT_LOG(debug) << "Card swallowed." << std::endl;
+ SWIFT_LOG(debug) << "Card swallowed.";
break;
case SCARD_POWERED:
- SWIFT_LOG(debug) << "Card has power." << std::endl;
+ SWIFT_LOG(debug) << "Card has power.";
break;
case SCARD_NEGOTIABLE:
- SWIFT_LOG(debug) << "Card reset and waiting PTS negotiation." << std::endl;
+ SWIFT_LOG(debug) << "Card reset and waiting PTS negotiation.";
break;
case SCARD_SPECIFIC:
- SWIFT_LOG(debug) << "Card has specific communication protocols set." << std::endl;
+ SWIFT_LOG(debug) << "Card has specific communication protocols set.";
break;
default:
- SWIFT_LOG(debug) << "Unknown or unexpected card state." << std::endl;
+ SWIFT_LOG(debug) << "Unknown or unexpected card state.";
break;
}
-
-
switch (dwState) {
case SCARD_ABSENT:
return false;
@@ -342,6 +332,7 @@ bool CAPICertificate::checkIfSmartCardPresent () {
void CAPICertificate::handleSmartCardTimerTick() {
bool poll = checkIfSmartCardPresent();
if (lastPollingResult_ && !poll) {
+ SWIFT_LOG(debug) << "CAPI Certificate detected that the certificate card was removed";
onCertificateCardRemoved();
}
lastPollingResult_ = poll;
diff --git a/Swiften/TLS/CertificateFactory.cpp b/Swiften/TLS/CertificateFactory.cpp
index 487f7cd..d4db3f4 100644
--- a/Swiften/TLS/CertificateFactory.cpp
+++ b/Swiften/TLS/CertificateFactory.cpp
@@ -1,14 +1,35 @@
/*
- * Copyright (c) 2010 Isode Limited.
+ * Copyright (c) 2010-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
#include <Swiften/TLS/CertificateFactory.h>
+#include <cassert>
+#include <memory>
+#include <sstream>
+#include <string>
+
+#include <boost/algorithm/string/predicate.hpp>
+#include <boost/optional.hpp>
+
+#include <Swiften/Base/Log.h>
+#include <Swiften/StringCodecs/Base64.h>
+#include <Swiften/TLS/PrivateKey.h>
+
namespace Swift {
CertificateFactory::~CertificateFactory() {
}
+std::vector<std::shared_ptr<Certificate>> CertificateFactory::createCertificateChain(const ByteArray& /* data */) {
+ assert(false);
+ return std::vector<std::shared_ptr<Certificate>>();
+}
+
+PrivateKey::ref CertificateFactory::createPrivateKey(const SafeByteArray& data, boost::optional<SafeByteArray> password) {
+ return std::make_shared<PrivateKey>(data, password);
+}
+
}
diff --git a/Swiften/TLS/CertificateFactory.h b/Swiften/TLS/CertificateFactory.h
index 522a6e6..873c36b 100644
--- a/Swiften/TLS/CertificateFactory.h
+++ b/Swiften/TLS/CertificateFactory.h
@@ -1,13 +1,17 @@
/*
- * Copyright (c) 2010-2015 Isode Limited.
+ * Copyright (c) 2010-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
#pragma once
+#include <boost/optional.hpp>
+
#include <Swiften/Base/API.h>
+#include <Swiften/Base/SafeByteArray.h>
#include <Swiften/TLS/Certificate.h>
+#include <Swiften/TLS/PrivateKey.h>
namespace Swift {
class SWIFTEN_API CertificateFactory {
@@ -15,5 +19,7 @@ namespace Swift {
virtual ~CertificateFactory();
virtual Certificate* createCertificateFromDER(const ByteArray& der) = 0;
+ virtual std::vector<std::shared_ptr<Certificate>> createCertificateChain(const ByteArray& data);
+ PrivateKey::ref createPrivateKey(const SafeByteArray& data, boost::optional<SafeByteArray> password = boost::optional<SafeByteArray>());
};
}
diff --git a/Swiften/TLS/OpenSSL/OpenSSLCertificate.cpp b/Swiften/TLS/OpenSSL/OpenSSLCertificate.cpp
index 17ac8cc..66b650d 100644
--- a/Swiften/TLS/OpenSSL/OpenSSLCertificate.cpp
+++ b/Swiften/TLS/OpenSSL/OpenSSLCertificate.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2019 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -30,19 +30,27 @@ OpenSSLCertificate::OpenSSLCertificate(const ByteArray& der) {
#else
const unsigned char* p = vecptr(der);
#endif
- cert = std::shared_ptr<X509>(d2i_X509(NULL, &p, der.size()), X509_free);
+ cert = std::shared_ptr<X509>(d2i_X509(nullptr, &p, der.size()), X509_free);
if (!cert) {
- SWIFT_LOG(warning) << "Error creating certificate from DER data" << std::endl;
+// SWIFT_LOG(warning) << "Error creating certificate from DER data";
}
parse();
}
+void OpenSSLCertificate::incrementReferenceCount() const {
+#if OPENSSL_VERSION_NUMBER >= 0x10100000L
+ X509_up_ref(cert.get());
+#else
+ CRYPTO_add(&(cert.get()->references), 1, CRYPTO_LOCK_EVP_PKEY);
+#endif
+}
+
ByteArray OpenSSLCertificate::toDER() const {
ByteArray result;
if (!cert) {
return result;
}
- result.resize(i2d_X509(cert.get(), NULL));
+ result.resize(i2d_X509(cert.get(), nullptr));
unsigned char* p = vecptr(result);
i2d_X509(cert.get(), &p);
return result;
diff --git a/Swiften/TLS/OpenSSL/OpenSSLCertificate.h b/Swiften/TLS/OpenSSL/OpenSSLCertificate.h
index 186caea..64da82a 100644
--- a/Swiften/TLS/OpenSSL/OpenSSLCertificate.h
+++ b/Swiften/TLS/OpenSSL/OpenSSLCertificate.h
@@ -45,6 +45,8 @@ namespace Swift {
return cert;
}
+ void incrementReferenceCount() const;
+
private:
void parse();
diff --git a/Swiften/TLS/OpenSSL/OpenSSLCertificateFactory.cpp b/Swiften/TLS/OpenSSL/OpenSSLCertificateFactory.cpp
new file mode 100644
index 0000000..73058a5
--- /dev/null
+++ b/Swiften/TLS/OpenSSL/OpenSSLCertificateFactory.cpp
@@ -0,0 +1,56 @@
+/*
+ * Copyright (c) 2018 Isode Limited.
+ * All rights reserved.
+ * See the COPYING file for more information.
+ */
+
+#include <Swiften/TLS/OpenSSL/OpenSSLCertificateFactory.h>
+
+#include <openssl/pem.h>
+#include <openssl/err.h>
+
+namespace Swift {
+
+OpenSSLCertificateFactory::OpenSSLCertificateFactory() {
+}
+
+OpenSSLCertificateFactory::~OpenSSLCertificateFactory() {
+}
+
+Certificate* OpenSSLCertificateFactory::createCertificateFromDER(const ByteArray& der) {
+ return new OpenSSLCertificate(der);
+}
+
+std::vector<std::shared_ptr<Certificate>> OpenSSLCertificateFactory::createCertificateChain(const ByteArray& data) {
+ std::vector<std::shared_ptr<Certificate>> certificateChain;
+
+ if (data.size() > std::numeric_limits<int>::max()) {
+ return certificateChain;
+ }
+
+ auto bio = std::shared_ptr<BIO>(BIO_new(BIO_s_mem()), BIO_free);
+ BIO_write(bio.get(), vecptr(data), int(data.size()));
+
+ // Attempt parsing data as PEM
+ X509* openSSLCert = nullptr;
+ auto x509certFromPEM = PEM_read_bio_X509(bio.get(), &openSSLCert, nullptr, nullptr);
+ if (x509certFromPEM && openSSLCert) {
+ std::shared_ptr<X509> x509Cert(openSSLCert, X509_free);
+ certificateChain.emplace_back(std::make_shared<OpenSSLCertificate>(x509Cert));
+ openSSLCert = nullptr;
+ while ((x509certFromPEM = PEM_read_bio_X509(bio.get(), &openSSLCert, nullptr, nullptr)) != nullptr) {
+ std::shared_ptr<X509> x509Cert(openSSLCert, X509_free);
+ certificateChain.emplace_back(std::make_shared<OpenSSLCertificate>(x509Cert));
+ openSSLCert = nullptr;
+ }
+ }
+
+ // Clear any (expected) errors which resulted from PEM parsing
+ // If we don't do this, any existing TLS context will detect these
+ // spurious errors and fail to work
+ ERR_clear_error();
+
+ return certificateChain;
+}
+
+}
diff --git a/Swiften/TLS/OpenSSL/OpenSSLCertificateFactory.h b/Swiften/TLS/OpenSSL/OpenSSLCertificateFactory.h
index c996cd5..a6974c8 100644
--- a/Swiften/TLS/OpenSSL/OpenSSLCertificateFactory.h
+++ b/Swiften/TLS/OpenSSL/OpenSSLCertificateFactory.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010-2014 Isode Limited.
+ * Copyright (c) 2010-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -12,8 +12,10 @@
namespace Swift {
class OpenSSLCertificateFactory : public CertificateFactory {
public:
- virtual Certificate* createCertificateFromDER(const ByteArray& der) {
- return new OpenSSLCertificate(der);
- }
+ OpenSSLCertificateFactory();
+ virtual ~OpenSSLCertificateFactory() override final;
+
+ virtual Certificate* createCertificateFromDER(const ByteArray& der) override final;
+ virtual std::vector<std::shared_ptr<Certificate>> createCertificateChain(const ByteArray& data) override final;
};
}
diff --git a/Swiften/TLS/OpenSSL/OpenSSLContext.cpp b/Swiften/TLS/OpenSSL/OpenSSLContext.cpp
index 0805917..86b0504 100644
--- a/Swiften/TLS/OpenSSL/OpenSSLContext.cpp
+++ b/Swiften/TLS/OpenSSL/OpenSSLContext.cpp
@@ -1,8 +1,9 @@
/*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2019 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
+
#include <Swiften/Base/Platform.h>
#ifdef SWIFTEN_PLATFORM_WINDOWS
@@ -10,15 +11,21 @@
#include <wincrypt.h>
#endif
+#include <cassert>
+#include <memory>
#include <vector>
+
+
+#include <openssl/bio.h>
#include <openssl/err.h>
#include <openssl/pkcs12.h>
-#include <memory>
#if defined(SWIFTEN_PLATFORM_MACOSX)
#include <Security/Security.h>
#endif
+#include <Swiften/Base/Log.h>
+#include <Swiften/Base/Algorithm.h>
#include <Swiften/TLS/OpenSSL/OpenSSLContext.h>
#include <Swiften/TLS/OpenSSL/OpenSSLCertificate.h>
#include <Swiften/TLS/CertificateWithKey.h>
@@ -35,14 +42,78 @@ namespace Swift {
static const int MAX_FINISHED_SIZE = 4096;
static const int SSL_READ_BUFFERSIZE = 8192;
+#define SSL_DEFAULT_VERIFY_DEPTH 5
+
+// Callback function declarations for certificate verification
+extern "C" {
+ static int certVerifyCallback(X509_STORE_CTX *store_ctx, void*);
+ static int verifyCallback(int preverify_ok, X509_STORE_CTX *ctx);
+}
+
static void freeX509Stack(STACK_OF(X509)* stack) {
sk_X509_free(stack);
}
-OpenSSLContext::OpenSSLContext() : state_(Start), context_(0), handle_(0), readBIO_(0), writeBIO_(0) {
+namespace {
+ class OpenSSLInitializerFinalizer {
+ public:
+ OpenSSLInitializerFinalizer() {
+ SSL_load_error_strings();
+ SSL_library_init();
+ OpenSSL_add_all_algorithms();
+
+ // Disable compression
+ /*
+ STACK_OF(SSL_COMP)* compressionMethods = SSL_COMP_get_compression_methods();
+ sk_SSL_COMP_zero(compressionMethods);*/
+ }
+
+ ~OpenSSLInitializerFinalizer() {
+ EVP_cleanup();
+ }
+
+ OpenSSLInitializerFinalizer(const OpenSSLInitializerFinalizer &) = delete;
+ };
+
+ std::unique_ptr<SSL_CTX> createSSL_CTX(OpenSSLContext::Mode mode) {
+ std::unique_ptr<SSL_CTX> sslCtx;
+ switch (mode) {
+ case OpenSSLContext::Mode::Client:
+ sslCtx = std::unique_ptr<SSL_CTX>(SSL_CTX_new(SSLv23_client_method()));
+ break;
+ case OpenSSLContext::Mode::Server:
+ sslCtx = std::unique_ptr<SSL_CTX>(SSL_CTX_new(SSLv23_server_method()));
+ break;
+ }
+ return sslCtx;
+ }
+
+ std::string openSSLInternalErrorToString() {
+ auto bio = std::shared_ptr<BIO>(BIO_new(BIO_s_mem()), BIO_free);
+ ERR_print_errors(bio.get());
+ std::string errorString;
+ errorString.resize(BIO_pending(bio.get()));
+ BIO_read(bio.get(), (void*)errorString.data(), errorString.size());
+ return errorString;
+ }
+ }
+
+OpenSSLContext::OpenSSLContext(const TLSOptions& options, Mode mode) : mode_(mode), state_(State::Start) {
ensureLibraryInitialized();
- context_ = SSL_CTX_new(SSLv23_client_method());
- SSL_CTX_set_options(context_, SSL_OP_NO_SSLv2 | SSL_OP_NO_SSLv3);
+ context_ = createSSL_CTX(mode_);
+ SSL_CTX_set_options(context_.get(), SSL_OP_NO_SSLv2 | SSL_OP_NO_SSLv3);
+
+ if (mode_ == Mode::Server) {
+#if OPENSSL_VERSION_NUMBER < 0x1010
+ // Automatically select highest preference curve used for ECDH temporary keys used during
+ // key exchange if possible.
+ // Since version 1.1.0, this option is always enabled.
+ SSL_CTX_set_ecdh_auto(context_.get(), 1);
+#endif
+
+ SSL_CTX_set_tlsext_servername_arg(context_.get(), this);
+ SSL_CTX_set_tlsext_servername_callback(context_.get(), OpenSSLContext::handleServerNameCallback);
+ }
// TODO: implement CRL checking
// TODO: download CRL (HTTP transport)
@@ -50,111 +121,420 @@ OpenSSLContext::OpenSSLContext() : state_(Start), context_(0), handle_(0), readB
// TODO: implement OCSP support
// TODO: handle OCSP stapling see https://www.rfc-editor.org/rfc/rfc4366.txt
- // Load system certs
+
+ // Default for ignoreSystemTrustAnchors is false, i.e. load System TAs by default,
+ // to preserve previous behaviour
+ if (!options.ignoreSystemTrustAnchors) {
+ // Load system certs
#if defined(SWIFTEN_PLATFORM_WINDOWS)
- X509_STORE* store = SSL_CTX_get_cert_store(context_);
- HCERTSTORE systemStore = CertOpenSystemStore(0, "ROOT");
- if (systemStore) {
- PCCERT_CONTEXT certContext = NULL;
- while (true) {
- certContext = CertFindCertificateInStore(systemStore, X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, 0, CERT_FIND_ANY, NULL, certContext);
- if (!certContext) {
- break;
- }
- OpenSSLCertificate cert(createByteArray(certContext->pbCertEncoded, certContext->cbCertEncoded));
- if (store && cert.getInternalX509()) {
- X509_STORE_add_cert(store, cert.getInternalX509().get());
+ X509_STORE* store = SSL_CTX_get_cert_store(context_.get());
+ HCERTSTORE systemStore = CertOpenSystemStore(0, "ROOT");
+ if (systemStore) {
+ PCCERT_CONTEXT certContext = nullptr;
+ while (true) {
+ certContext = CertFindCertificateInStore(systemStore, X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, 0, CERT_FIND_ANY, nullptr, certContext);
+ if (!certContext) {
+ break;
+ }
+ OpenSSLCertificate cert(createByteArray(certContext->pbCertEncoded, certContext->cbCertEncoded));
+ if (store && cert.getInternalX509()) {
+ X509_STORE_add_cert(store, cert.getInternalX509().get());
+ }
}
}
- }
#elif !defined(SWIFTEN_PLATFORM_MACOSX)
- SSL_CTX_set_default_verify_paths(context_);
+ SSL_CTX_set_default_verify_paths(context_.get());
#elif defined(SWIFTEN_PLATFORM_MACOSX) && !defined(SWIFTEN_PLATFORM_IPHONE)
- // On Mac OS X 10.5 (OpenSSL < 0.9.8), OpenSSL does not automatically look in the system store.
- // On Mac OS X 10.6 (OpenSSL >= 0.9.8), OpenSSL *does* look in the system store to determine trust.
- // However, if there is a certificate error, it will always emit the "Invalid CA" error if we didn't add
- // the certificates first. See
- // http://opensource.apple.com/source/OpenSSL098/OpenSSL098-27/src/crypto/x509/x509_vfy_apple.c
- // to understand why. We therefore add all certs from the system store ourselves.
- X509_STORE* store = SSL_CTX_get_cert_store(context_);
- CFArrayRef anchorCertificates;
- if (SecTrustCopyAnchorCertificates(&anchorCertificates) == 0) {
- for (int i = 0; i < CFArrayGetCount(anchorCertificates); ++i) {
- SecCertificateRef cert = reinterpret_cast<SecCertificateRef>(const_cast<void*>(CFArrayGetValueAtIndex(anchorCertificates, i)));
- CSSM_DATA certCSSMData;
- if (SecCertificateGetData(cert, &certCSSMData) != 0 || certCSSMData.Length == 0) {
- continue;
- }
- std::vector<unsigned char> certData;
- certData.resize(certCSSMData.Length);
- memcpy(&certData[0], certCSSMData.Data, certCSSMData.Length);
- OpenSSLCertificate certificate(certData);
- if (store && certificate.getInternalX509()) {
- X509_STORE_add_cert(store, certificate.getInternalX509().get());
+ // On Mac OS X 10.5 (OpenSSL < 0.9.8), OpenSSL does not automatically look in the system store.
+ // On Mac OS X 10.6 (OpenSSL >= 0.9.8), OpenSSL *does* look in the system store to determine trust.
+ // However, if there is a certificate error, it will always emit the "Invalid CA" error if we didn't add
+ // the certificates first. See
+ // http://opensource.apple.com/source/OpenSSL098/OpenSSL098-27/src/crypto/x509/x509_vfy_apple.c
+ // to understand why. We therefore add all certs from the system store ourselves.
+ X509_STORE* store = SSL_CTX_get_cert_store(context_.get());
+ CFArrayRef anchorCertificates;
+ if (SecTrustCopyAnchorCertificates(&anchorCertificates) == 0) {
+ for (int i = 0; i < CFArrayGetCount(anchorCertificates); ++i) {
+ SecCertificateRef cert = reinterpret_cast<SecCertificateRef>(const_cast<void*>(CFArrayGetValueAtIndex(anchorCertificates, i)));
+ CSSM_DATA certCSSMData;
+ if (SecCertificateGetData(cert, &certCSSMData) != 0 || certCSSMData.Length == 0) {
+ continue;
+ }
+ std::vector<unsigned char> certData;
+ certData.resize(certCSSMData.Length);
+ memcpy(&certData[0], certCSSMData.Data, certCSSMData.Length);
+ OpenSSLCertificate certificate(certData);
+ if (store && certificate.getInternalX509()) {
+ X509_STORE_add_cert(store, certificate.getInternalX509().get());
+ }
}
+ CFRelease(anchorCertificates);
}
- CFRelease(anchorCertificates);
- }
#endif
+ }
+ configure(options);
}
OpenSSLContext::~OpenSSLContext() {
- SSL_free(handle_);
- SSL_CTX_free(context_);
}
void OpenSSLContext::ensureLibraryInitialized() {
- static bool isLibraryInitialized = false;
- if (!isLibraryInitialized) {
- SSL_load_error_strings();
- SSL_library_init();
- OpenSSL_add_all_algorithms();
+ static OpenSSLInitializerFinalizer openSSLInit;
+}
+
+void OpenSSLContext::initAndSetBIOs() {
+ // Ownership of BIOs is transferred
+ readBIO_ = BIO_new(BIO_s_mem());
+ writeBIO_ = BIO_new(BIO_s_mem());
+ SSL_set_bio(handle_.get(), readBIO_, writeBIO_);
+}
+
+// This callback is called by OpenSSL when a client certificate needs to be verified.
+// In turn, this calls the verification callback which the user
+// of this OpenSSLContext has configured (if any).
+static int certVerifyCallback(X509_STORE_CTX* store_ctx, void* arg)
+{
+ OpenSSLContext* context = static_cast<OpenSSLContext *>(arg);
+
+ // Need to stash store_ctx pointer for use within verification
+ context->setX509StoreContext(store_ctx);
+
+ int ret;
+
+ // This callback shouldn't have been set up if the context doesn't
+ // have a verifyCertCallback set, but it doesn't hurt to double check
+ std::function<int (const TLSContext *)> cb = context->getVerifyCertCallback();
+ if (cb != nullptr) {
+ ret = cb(static_cast<const OpenSSLContext*>(context));
+ } else {
+ SWIFT_LOG(debug) << "certVerifyCallback called but context.verifyCertCallback is unset";
+ ret = 0;
+ }
+
+ context->setX509StoreContext(nullptr);
+ return ret;
+}
+
+// Convenience function to generate a text representation
+// of an X509 Name. This information is only used for logging.
+static std::string X509_NAME_to_text(X509_NAME* name)
+{
+ std::string nameString;
+
+ if (!name) {
+ return nameString;
+ }
+
+ std::unique_ptr<BIO, decltype(&BIO_free)> io(BIO_new(BIO_s_mem()), &BIO_free);
+ int r = X509_NAME_print_ex(io.get(), name, 0, XN_FLAG_RFC2253);
+ BIO_write(io.get(), "\0", 1);
+
+ if (r > 0) {
+ BUF_MEM* ptr = nullptr;
+ BIO_get_mem_ptr(io.get(), &ptr);
+ nameString = ptr->data;
+ }
+
+ return nameString;
+}
+
+// Check depth of certificate chain
+static int verifyCallback(int preverifyOk, X509_STORE_CTX* ctx)
+{
+ // Retrieve the pointer to the SSL of the connection currently treated
+ // and the application specific data stored into the SSL object.
+
+ int err = X509_STORE_CTX_get_error(ctx);
+ int depth = X509_STORE_CTX_get_error_depth(ctx);
- // Disable compression
- /*
- STACK_OF(SSL_COMP)* compressionMethods = SSL_COMP_get_compression_methods();
- sk_SSL_COMP_zero(compressionMethods);*/
+ SSL* ssl = static_cast<SSL*>(X509_STORE_CTX_get_ex_data(ctx, SSL_get_ex_data_X509_STORE_CTX_idx()));
+ SSL_CTX* sslctx = ssl ? SSL_get_SSL_CTX(ssl) : nullptr;
+ if (!sslctx) {
+ SWIFT_LOG(debug) << "verifyCallback: internal error";
+ return preverifyOk;
+ }
+
+ if (SSL_CTX_get_verify_mode(sslctx) == SSL_VERIFY_NONE) {
+ SWIFT_LOG(debug) << "verifyCallback: no verification required";
+ // No verification requested
+ return 1;
+ }
- isLibraryInitialized = true;
+ X509* errCert = X509_STORE_CTX_get_current_cert(ctx);
+ std::string subjectString;
+ if (errCert) {
+ X509_NAME* subjectName = X509_get_subject_name(errCert);
+ subjectString = X509_NAME_to_text(subjectName);
}
+
+ // Catch a too long certificate chain. The depth limit set using
+ // SSL_CTX_set_verify_depth() is by purpose set to "limit+1" so
+ // that whenever the "depth>verify_depth" condition is met, we
+ // have violated the limit and want to log this error condition.
+ // We must do it here, because the CHAIN_TOO_LONG error would not
+ // be found explicitly; only errors introduced by cutting off the
+ // additional certificates would be logged.
+ if (depth >= SSL_CTX_get_verify_depth(sslctx)) {
+ preverifyOk = 0;
+ err = X509_V_ERR_CERT_CHAIN_TOO_LONG;
+ X509_STORE_CTX_set_error(ctx, err);
+ }
+
+ if (!preverifyOk) {
+ std::string issuerString;
+ if (errCert) {
+ X509_NAME* issuerName = X509_get_issuer_name(errCert);
+ issuerString = X509_NAME_to_text(issuerName);
+ }
+ SWIFT_LOG(debug) << "verifyCallback: verification error " <<
+ X509_verify_cert_error_string(err) << " depth: " <<
+ depth << " issuer: " << ((issuerString.length() > 0) ? issuerString : "<unknown>");
+ } else {
+ SWIFT_LOG(debug) << "verifyCallback: SSL depth: " << depth << " Subject: " <<
+ ((subjectString.length() > 0) ? subjectString : "<>");
+ }
+ // Always return "OK", as check on verification status
+ // will be performed once TLS handshake has completed,
+ // by calling OpenSSLContext::getVerificationErrorTypeForResult() to
+ // get the value set via X509_STORE_CTX_set_error() above.
+ return 1;
+}
+
+bool OpenSSLContext::configure(const TLSOptions &options)
+{
+ if (options.cipherSuites) {
+ std::string cipherSuites = *(options.cipherSuites);
+ if (SSL_CTX_set_cipher_list(context_.get(), cipherSuites.c_str()) != 1 ) {
+ SWIFT_LOG(debug) << "Failed to set cipher-suites";
+ return false;
+ }
+ }
+
+ if (options.context) {
+ const auto& contextId = *options.context;
+
+ if (SSL_CTX_set_session_id_context(context_.get(),
+ reinterpret_cast<const unsigned char *>(contextId.c_str()),
+ contextId.length()) != 1) {
+ SWIFT_LOG(debug) << "Failed to set context-id";
+ return false;
+ }
+ }
+
+ if (options.sessionCacheTimeout) {
+ int scto = *options.sessionCacheTimeout;
+ if (scto <= 0) {
+ SWIFT_LOG(debug) << "Invalid value for session-cache-timeout";
+ return false;
+ }
+ (void)SSL_CTX_set_timeout(context_.get(), scto);
+ if (SSL_CTX_get_timeout(context_.get()) != scto) {
+ SWIFT_LOG(debug) << "Failed to set session-cache-timeout";
+ return false;
+ }
+ }
+
+ if (options.verifyCertificateCallback) {
+ verifyCertCallback = *options.verifyCertificateCallback;
+ } else {
+ verifyCertCallback = nullptr;
+ }
+
+ if (options.verifyMode) {
+ TLSOptions::VerifyMode verify_mode = *options.verifyMode;
+ int mode;
+ switch (verify_mode) {
+ case TLSOptions::VerifyMode::None:
+ mode = SSL_VERIFY_NONE;
+ break;
+ case TLSOptions::VerifyMode::Required:
+ mode = SSL_VERIFY_PEER | SSL_VERIFY_FAIL_IF_NO_PEER_CERT | SSL_VERIFY_CLIENT_ONCE;
+ break;
+ case TLSOptions::VerifyMode::Optional:
+ mode = SSL_VERIFY_PEER | SSL_VERIFY_CLIENT_ONCE;
+ break;
+ }
+
+ // Set up default certificate chain verification depth - may be overridden below
+ SSL_CTX_set_verify_depth(context_.get(), SSL_DEFAULT_VERIFY_DEPTH + 1);
+
+ // Set callbacks up
+ SSL_CTX_set_verify(context_.get(), mode, verifyCallback);
+
+ // Only set up certificate verification callback if a user callback has
+ // been configured via the TLSOptions
+ if (verifyCertCallback != nullptr) {
+ SSL_CTX_set_cert_verify_callback(context_.get(), certVerifyCallback, this);
+ }
+ }
+
+ if (options.verifyDepth) {
+ int depth = *options.verifyDepth;
+ if (depth <= 0) {
+ SWIFT_LOG(debug) << "Invalid value for verify-depth";
+ return false;
+ }
+
+ // Increase depth limit by one, so that verifyCallback() will log it
+ SSL_CTX_set_verify_depth(context_.get(), depth + 1);
+ }
+
+ auto updateOptionIfPresent = [this](boost::optional<bool> option, int flag) {
+ if (option) {
+ if (*option) {
+ SSL_CTX_set_options(context_.get(), flag);
+ }
+ else {
+ SSL_CTX_clear_options(context_.get(), flag);
+ }
+ }
+ };
+ updateOptionIfPresent(options.workaroundMicrosoftSessID, SSL_OP_MICROSOFT_SESS_ID_BUG);
+ updateOptionIfPresent(options.workaroundNetscapeChallenge, SSL_OP_NETSCAPE_CHALLENGE_BUG);
+ updateOptionIfPresent(options.workaroundNetscapeReuseCipherChange, SSL_OP_NETSCAPE_REUSE_CIPHER_CHANGE_BUG);
+ updateOptionIfPresent(options.workaroundSSLRef2ReuseCertType, SSL_OP_SSLREF2_REUSE_CERT_TYPE_BUG);
+ updateOptionIfPresent(options.workaroundMicrosoftBigSSLv3Buffer, SSL_OP_MICROSOFT_BIG_SSLV3_BUFFER);
+ updateOptionIfPresent(options.workaroundSSLeay080ClientDH, SSL_OP_SSLEAY_080_CLIENT_DH_BUG);
+ updateOptionIfPresent(options.workaroundTLSD5, SSL_OP_TLS_D5_BUG);
+ updateOptionIfPresent(options.workaroundTLSBlockPadding, SSL_OP_TLS_BLOCK_PADDING_BUG);
+ updateOptionIfPresent(options.workaroundDontInsertEmptyFragments, SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS);
+ updateOptionIfPresent(options.workaroundAll, SSL_OP_ALL);
+ updateOptionIfPresent(options.suppressSSLv2, SSL_OP_NO_SSLv2);
+ updateOptionIfPresent(options.suppressSSLv3, SSL_OP_NO_SSLv3);
+ updateOptionIfPresent(options.suppressTLSv1, SSL_OP_NO_TLSv1);
+ updateOptionIfPresent(options.disableTLSRollBackBug, SSL_OP_TLS_ROLLBACK_BUG);
+ updateOptionIfPresent(options.singleDHUse, SSL_OP_SINGLE_DH_USE);
+
+ if (options.trustAnchors) {
+ // Add any additional Trust Anchors which are present in the TLSOptions
+ X509_STORE* store = SSL_CTX_get_cert_store(context_.get());
+
+ if (store) {
+ for (auto& certificate : *options.trustAnchors) {
+ auto openSSLCert = dynamic_cast<OpenSSLCertificate*>(certificate.get());
+ if (openSSLCert && openSSLCert->getInternalX509()) {
+ X509_STORE_add_cert(store, openSSLCert->getInternalX509().get());
+ // Don't need to increment reference count as X509_STORE_add_cert does thiS
+ }
+ }
+ }
+ }
+
+ return true;
+}
+
+
+void OpenSSLContext::accept() {
+ assert(mode_ == Mode::Server);
+ handle_ = std::unique_ptr<SSL>(SSL_new(context_.get()));
+ if (!handle_) {
+ state_ = State::Error;
+ onError(std::make_shared<TLSError>(TLSError::AcceptFailed, openSSLInternalErrorToString()));
+ return;
+ }
+
+ initAndSetBIOs();
+
+ state_ = State::Accepting;
+ doAccept();
}
void OpenSSLContext::connect() {
- handle_ = SSL_new(context_);
- if (handle_ == nullptr) {
- state_ = Error;
- onError(std::make_shared<TLSError>());
+ connect(std::string());
+}
+
+void OpenSSLContext::connect(const std::string& requestedServerName) {
+ assert(mode_ == Mode::Client);
+ handle_ = std::unique_ptr<SSL>(SSL_new(context_.get()));
+ if (!handle_) {
+ state_ = State::Error;
+ onError(std::make_shared<TLSError>(TLSError::ConnectFailed, openSSLInternalErrorToString()));
return;
}
- // Ownership of BIOs is ransferred
- readBIO_ = BIO_new(BIO_s_mem());
- writeBIO_ = BIO_new(BIO_s_mem());
- SSL_set_bio(handle_, readBIO_, writeBIO_);
+ if (!requestedServerName.empty()) {
+ if (SSL_set_tlsext_host_name(handle_.get(), const_cast<char*>(requestedServerName.c_str())) != 1) {
+ onError(std::make_shared<TLSError>(TLSError::ConnectFailed, "Failed to set Server Name Indication: " + openSSLInternalErrorToString()));\
+ return;
+ }
+ }
+
+ // Ownership of BIOs is transferred to the SSL_CTX instance in handle_.
+ initAndSetBIOs();
- state_ = Connecting;
+ state_ = State::Connecting;
doConnect();
}
+void OpenSSLContext::doAccept() {
+ auto acceptResult = SSL_accept(handle_.get());
+ auto error = SSL_get_error(handle_.get(), acceptResult);
+ switch (error) {
+ case SSL_ERROR_NONE: {
+ state_ = State::Connected;
+ //std::cout << x->name << std::endl;
+ //const char* comp = SSL_get_current_compression(handle_.get());
+ //std::cout << "Compression: " << SSL_COMP_get_name(comp) << std::endl;
+ onConnected();
+ // The following call is important so the client knowns the handshake is finished.
+ sendPendingDataToNetwork();
+ sendPendingDataToApplication();
+ break;
+ }
+ case SSL_ERROR_WANT_READ:
+ sendPendingDataToNetwork();
+ break;
+ case SSL_ERROR_WANT_WRITE:
+ sendPendingDataToNetwork();
+ break;
+ default:
+ state_ = State::Error;
+ onError(std::make_shared<TLSError>(TLSError::AcceptFailed, openSSLInternalErrorToString()));
+ sendPendingDataToNetwork();
+ }
+}
+
void OpenSSLContext::doConnect() {
- int connectResult = SSL_connect(handle_);
- int error = SSL_get_error(handle_, connectResult);
+ int connectResult = SSL_connect(handle_.get());
+ int error = SSL_get_error(handle_.get(), connectResult);
switch (error) {
case SSL_ERROR_NONE: {
- state_ = Connected;
+ state_ = State::Connected;
//std::cout << x->name << std::endl;
- //const char* comp = SSL_get_current_compression(handle_);
+ //const char* comp = SSL_get_current_compression(handle_.get());
//std::cout << "Compression: " << SSL_COMP_get_name(comp) << std::endl;
onConnected();
+ // The following is needed since OpenSSL 1.1.1 for the server to be able to calculate the
+ // TLS finish message.
+ sendPendingDataToNetwork();
break;
}
case SSL_ERROR_WANT_READ:
sendPendingDataToNetwork();
break;
default:
- state_ = Error;
+ state_ = State::Error;
onError(std::make_shared<TLSError>());
+ onError(std::make_shared<TLSError>(TLSError::ConnectFailed, openSSLInternalErrorToString()));
+ }
+}
+
+int OpenSSLContext::handleServerNameCallback(SSL* ssl, int*, void* arg) {
+ if (ssl == nullptr)
+ return SSL_TLSEXT_ERR_NOACK;
+
+ const char* servername = SSL_get_servername(ssl, TLSEXT_NAMETYPE_host_name);
+ if (servername) {
+ auto serverNameString = std::string(servername);
+ auto context = reinterpret_cast<OpenSSLContext*>(arg);
+ context->onServerNameRequested(serverNameString);
+
+ if (context->abortTLSHandshake_) {
+ context->abortTLSHandshake_ = false;
+ return SSL_TLSEXT_ERR_ALERT_FATAL;
+ }
}
+ return SSL_TLSEXT_ERR_OK;
}
void OpenSSLContext::sendPendingDataToNetwork() {
@@ -170,43 +550,148 @@ void OpenSSLContext::sendPendingDataToNetwork() {
void OpenSSLContext::handleDataFromNetwork(const SafeByteArray& data) {
BIO_write(readBIO_, vecptr(data), data.size());
switch (state_) {
- case Connecting:
+ case State::Accepting:
+ doAccept();
+ break;
+ case State::Connecting:
doConnect();
break;
- case Connected:
+ case State::Connected:
sendPendingDataToApplication();
break;
- case Start: assert(false); break;
- case Error: /*assert(false);*/ break;
+ case State::Start: assert(false); break;
+ case State::Error: /*assert(false);*/ break;
}
}
void OpenSSLContext::handleDataFromApplication(const SafeByteArray& data) {
- if (SSL_write(handle_, vecptr(data), data.size()) >= 0) {
- sendPendingDataToNetwork();
+ auto ret = SSL_write(handle_.get(), vecptr(data), data.size());
+ if (ret > 0 || SSL_get_error(handle_.get(), ret) == SSL_ERROR_WANT_READ) {
+ sendPendingDataToNetwork();
}
else {
- state_ = Error;
- onError(std::make_shared<TLSError>());
+ state_ = State::Error;
+ onError(std::make_shared<TLSError>(TLSError::UnknownError, openSSLInternalErrorToString()));
}
}
void OpenSSLContext::sendPendingDataToApplication() {
SafeByteArray data;
data.resize(SSL_READ_BUFFERSIZE);
- int ret = SSL_read(handle_, vecptr(data), data.size());
+ int ret = SSL_read(handle_.get(), vecptr(data), data.size());
while (ret > 0) {
data.resize(ret);
onDataForApplication(data);
data.resize(SSL_READ_BUFFERSIZE);
- ret = SSL_read(handle_, vecptr(data), data.size());
+ ret = SSL_read(handle_.get(), vecptr(data), data.size());
}
- if (ret < 0 && SSL_get_error(handle_, ret) != SSL_ERROR_WANT_READ) {
- state_ = Error;
- onError(std::make_shared<TLSError>());
+ if (ret < 0 && SSL_get_error(handle_.get(), ret) != SSL_ERROR_WANT_READ) {
+ state_ = State::Error;
+ onError(std::make_shared<TLSError>(TLSError::UnknownError, openSSLInternalErrorToString()));
}
}
+bool OpenSSLContext::setCertificateChain(const std::vector<std::shared_ptr<Certificate>>& certificateChain) {
+ if (certificateChain.size() == 0) {
+ SWIFT_LOG(debug) << "Trying to load empty certificate chain.";
+ return false;
+ }
+
+ // load endpoint certificate
+ auto openSSLCert = dynamic_cast<OpenSSLCertificate*>(certificateChain[0].get());
+ if (!openSSLCert) {
+ return false;
+ }
+
+ // This increments the reference count on the X509 certificate automatically
+ if (SSL_CTX_use_certificate(context_.get(), openSSLCert->getInternalX509().get()) != 1) {
+ return false;
+ }
+
+ if (certificateChain.size() > 1) {
+ for (auto certificate = certificateChain.begin() + 1; certificate != certificateChain.end(); ++certificate) {
+ auto openSSLCert = dynamic_cast<OpenSSLCertificate*>(certificate->get());
+ if (!openSSLCert) {
+ return false;
+ }
+
+ if (SSL_CTX_add_extra_chain_cert(context_.get(), openSSLCert->getInternalX509().get()) != 1) {
+ SWIFT_LOG(debug) << "Trying to load empty certificate chain.";
+ return false;
+ }
+ // Have to manually increment reference count as SSL_CTX_add_extra_chain_cert does not do so
+ openSSLCert->incrementReferenceCount();
+ }
+ }
+
+ if (handle_) {
+ // This workaround is needed as OpenSSL has a shortcut to not do anything
+ // if you set the SSL_CTX to the existing SSL_CTX and not reloading the
+ // certificates from the SSL_CTX.
+ auto dummyContext = createSSL_CTX(mode_);
+ SSL_set_SSL_CTX(handle_.get(), dummyContext.get());
+ SSL_set_SSL_CTX(handle_.get(), context_.get());
+ }
+
+ return true;
+}
+
+int empty_or_preset_password_cb(char* buf, int max_len, int flag, void* password);
+
+int empty_or_preset_password_cb(char* buf, int max_len, int /* flag */, void* password) {
+ char* charPassword = (char*)password;
+ if (charPassword == nullptr) {
+ return 0;
+ }
+ int len = strlen(charPassword);
+ if(len > max_len) {
+ return 0;
+ }
+ memcpy(buf, charPassword, len);
+ return len;
+}
+
+bool OpenSSLContext::setPrivateKey(const PrivateKey::ref& privateKey) {
+ if (privateKey->getData().size() > std::numeric_limits<int>::max()) {
+ return false;
+ }
+
+ auto bio = std::shared_ptr<BIO>(BIO_new(BIO_s_mem()), BIO_free);
+ BIO_write(bio.get(), vecptr(privateKey->getData()), int(privateKey->getData().size()));
+
+ SafeByteArray safePassword;
+ void* password = nullptr;
+ if (privateKey->getPassword()) {
+ safePassword = privateKey->getPassword().get();
+ safePassword.push_back(0);
+ password = safePassword.data();
+ }
+ // Make sure resultKey is tidied up by wrapping it in a shared_ptr
+ auto resultKey = std::shared_ptr<EVP_PKEY>(PEM_read_bio_PrivateKey(bio.get(), nullptr, empty_or_preset_password_cb, password), EVP_PKEY_free);
+ if (resultKey) {
+ if (handle_) {
+ auto result = SSL_use_PrivateKey(handle_.get(), resultKey.get());
+ if (result != 1) {
+ return false;
+ }
+ }
+ else {
+ auto result = SSL_CTX_use_PrivateKey(context_.get(), resultKey.get());
+ if (result != 1) {
+ return false;
+ }
+ }
+ }
+ else {
+ return false;
+ }
+ return true;
+}
+
+void OpenSSLContext::setAbortTLSHandshake(bool abort) {
+ abortTLSHandshake_ = abort;
+}
+
bool OpenSSLContext::setClientCertificate(CertificateWithKey::ref certificate) {
std::shared_ptr<PKCS12Certificate> pkcs12Certificate = std::dynamic_pointer_cast<PKCS12Certificate>(certificate);
if (!pkcs12Certificate || pkcs12Certificate->isNull()) {
@@ -216,16 +701,16 @@ bool OpenSSLContext::setClientCertificate(CertificateWithKey::ref certificate) {
// Create a PKCS12 structure
BIO* bio = BIO_new(BIO_s_mem());
BIO_write(bio, vecptr(pkcs12Certificate->getData()), pkcs12Certificate->getData().size());
- std::shared_ptr<PKCS12> pkcs12(d2i_PKCS12_bio(bio, NULL), PKCS12_free);
+ std::shared_ptr<PKCS12> pkcs12(d2i_PKCS12_bio(bio, nullptr), PKCS12_free);
BIO_free(bio);
if (!pkcs12) {
return false;
}
// Parse PKCS12
- X509 *certPtr = 0;
- EVP_PKEY* privateKeyPtr = 0;
- STACK_OF(X509)* caCertsPtr = 0;
+ X509 *certPtr = nullptr;
+ EVP_PKEY* privateKeyPtr = nullptr;
+ STACK_OF(X509)* caCertsPtr = nullptr;
SafeByteArray password(pkcs12Certificate->getPassword());
password.push_back(0);
int result = PKCS12_parse(pkcs12.get(), reinterpret_cast<const char*>(vecptr(password)), &privateKeyPtr, &certPtr, &caCertsPtr);
@@ -237,32 +722,71 @@ bool OpenSSLContext::setClientCertificate(CertificateWithKey::ref certificate) {
std::shared_ptr<STACK_OF(X509)> caCerts(caCertsPtr, freeX509Stack);
// Use the key & certificates
- if (SSL_CTX_use_certificate(context_, cert.get()) != 1) {
+ if (SSL_CTX_use_certificate(context_.get(), cert.get()) != 1) {
return false;
}
- if (SSL_CTX_use_PrivateKey(context_, privateKey.get()) != 1) {
+ if (SSL_CTX_use_PrivateKey(context_.get(), privateKey.get()) != 1) {
return false;
}
for (int i = 0; i < sk_X509_num(caCerts.get()); ++i) {
- SSL_CTX_add_extra_chain_cert(context_, sk_X509_value(caCerts.get(), i));
+ SSL_CTX_add_extra_chain_cert(context_.get(), sk_X509_value(caCerts.get(), i));
}
return true;
}
+bool OpenSSLContext::setDiffieHellmanParameters(const ByteArray& parametersInOpenSslDer) {
+ auto bio = std::unique_ptr<BIO, decltype(&BIO_free)>(BIO_new(BIO_s_mem()), BIO_free);
+ if (bio) {
+ BIO_write(bio.get(), vecptr(parametersInOpenSslDer), parametersInOpenSslDer.size());
+ auto result = 0L;
+ if (auto dhparams = d2i_DHparams_bio(bio.get(), nullptr)) {
+ if (handle_) {
+ result = SSL_set_tmp_dh(handle_.get(), dhparams);
+ }
+ else {
+ result = SSL_CTX_set_tmp_dh(context_.get(), dhparams);
+ }
+ DH_free(dhparams);
+ }
+ return result == 1;
+ }
+ return false;
+}
+
std::vector<Certificate::ref> OpenSSLContext::getPeerCertificateChain() const {
std::vector<Certificate::ref> result;
- STACK_OF(X509)* chain = SSL_get_peer_cert_chain(handle_);
+
+ // When this context is a server, the peer (client) certificate
+ // is obtained via SSL_get_peer_certificate, and any other
+ // certificates set by the peer are available via SSL_get_peer_cert_chain.
+ // When this context is a client, all of the server's certificates are
+ // obtained using SSL_get_peer_cert_chain
+ if (mode_ == Mode::Server) {
+ auto cert = SSL_get_peer_certificate(handle_.get());
+ if (cert) {
+ // Do not need to copy the returned cert as SSL_get_peer_certificate
+ // increments the reference count on the certificate
+ std::shared_ptr<X509> x509Cert(cert, X509_free);
+ Certificate::ref cert = std::make_shared<OpenSSLCertificate>(x509Cert);
+ result.push_back(cert);
+ }
+ }
+
+ STACK_OF(X509)* chain = SSL_get_peer_cert_chain(handle_.get());
for (int i = 0; i < sk_X509_num(chain); ++i) {
+ // Here we do need to copy the returned cert, since SSL_get_peer_cert_chain
+ // does not increment the reference count on each certificate
std::shared_ptr<X509> x509Cert(X509_dup(sk_X509_value(chain, i)), X509_free);
Certificate::ref cert = std::make_shared<OpenSSLCertificate>(x509Cert);
result.push_back(cert);
}
+
return result;
}
std::shared_ptr<CertificateVerificationError> OpenSSLContext::getPeerCertificateVerificationError() const {
- int verifyResult = SSL_get_verify_result(handle_);
+ int verifyResult = SSL_get_verify_result(handle_.get());
if (verifyResult != X509_V_OK) {
return std::make_shared<CertificateVerificationError>(getVerificationErrorTypeForResult(verifyResult));
}
@@ -274,11 +798,19 @@ std::shared_ptr<CertificateVerificationError> OpenSSLContext::getPeerCertificate
ByteArray OpenSSLContext::getFinishMessage() const {
ByteArray data;
data.resize(MAX_FINISHED_SIZE);
- size_t size = SSL_get_finished(handle_, vecptr(data), data.size());
+ auto size = SSL_get_finished(handle_.get(), vecptr(data), data.size());
data.resize(size);
return data;
}
+ByteArray OpenSSLContext::getPeerFinishMessage() const {
+ ByteArray data;
+ data.resize(MAX_FINISHED_SIZE);
+ auto size = SSL_get_peer_finished(handle_.get(), vecptr(data), data.size());
+ data.resize(size);
+ return data;
+ }
+
CertificateVerificationError::Type OpenSSLContext::getVerificationErrorTypeForResult(int result) {
assert(result != 0);
switch (result) {
diff --git a/Swiften/TLS/OpenSSL/OpenSSLContext.h b/Swiften/TLS/OpenSSL/OpenSSLContext.h
index e75b3c9..8eb5758 100644
--- a/Swiften/TLS/OpenSSL/OpenSSLContext.h
+++ b/Swiften/TLS/OpenSSL/OpenSSLContext.h
@@ -1,11 +1,13 @@
/*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
#pragma once
+#include <memory>
+
#include <boost/noncopyable.hpp>
#include <boost/signals2.hpp>
@@ -14,41 +16,77 @@
#include <Swiften/Base/ByteArray.h>
#include <Swiften/TLS/CertificateWithKey.h>
#include <Swiften/TLS/TLSContext.h>
+#include <Swiften/TLS/TLSOptions.h>
-namespace Swift {
+namespace std {
+ template<>
+ class default_delete<SSL_CTX> {
+ public:
+ void operator()(SSL_CTX *ptr) {
+ SSL_CTX_free(ptr);
+ }
+ };
+
+ template<>
+ class default_delete<SSL> {
+ public:
+ void operator()(SSL *ptr) {
+ SSL_free(ptr);
+ }
+ };
+}
+namespace Swift {
class OpenSSLContext : public TLSContext, boost::noncopyable {
public:
- OpenSSLContext();
- virtual ~OpenSSLContext();
+ OpenSSLContext(const TLSOptions& options, Mode mode);
+ virtual ~OpenSSLContext() override final;
+
+ void accept() override final;
+ void connect() override final;
+ void connect(const std::string& requestHostname) override final;
+
+ bool setCertificateChain(const std::vector<std::shared_ptr<Certificate>>& certificateChain) override final;
+ bool setPrivateKey(const PrivateKey::ref& privateKey) override final;
+ bool setClientCertificate(CertificateWithKey::ref cert) override final;
+ void setAbortTLSHandshake(bool abort) override final;
+ bool setDiffieHellmanParameters(const ByteArray& parametersInOpenSslDer) override final;
- void connect();
- bool setClientCertificate(CertificateWithKey::ref cert);
+ void handleDataFromNetwork(const SafeByteArray&) override final;
+ void handleDataFromApplication(const SafeByteArray&) override final;
- void handleDataFromNetwork(const SafeByteArray&);
- void handleDataFromApplication(const SafeByteArray&);
+ std::vector<Certificate::ref> getPeerCertificateChain() const override final;
+ std::shared_ptr<CertificateVerificationError> getPeerCertificateVerificationError() const override final;
- std::vector<Certificate::ref> getPeerCertificateChain() const;
- std::shared_ptr<CertificateVerificationError> getPeerCertificateVerificationError() const;
+ virtual ByteArray getFinishMessage() const override final;
+ virtual ByteArray getPeerFinishMessage() const override final;
- virtual ByteArray getFinishMessage() const;
+ void setX509StoreContext(X509_STORE_CTX *ptr) { x509_store_ctx = ptr; }
+ std::function<int (const TLSContext *)> getVerifyCertCallback() { return verifyCertCallback; }
private:
+ bool configure(const TLSOptions& options);
static void ensureLibraryInitialized();
-
+ static int handleServerNameCallback(SSL *ssl, int *ad, void *arg);
static CertificateVerificationError::Type getVerificationErrorTypeForResult(int);
+ void initAndSetBIOs();
+ void doAccept();
void doConnect();
void sendPendingDataToNetwork();
void sendPendingDataToApplication();
private:
- enum State { Start, Connecting, Connected, Error };
+ enum class State { Start, Accepting, Connecting, Connected, Error };
+ const Mode mode_;
State state_;
- SSL_CTX* context_;
- SSL* handle_;
- BIO* readBIO_;
- BIO* writeBIO_;
- };
+ std::unique_ptr<SSL_CTX> context_;
+ std::unique_ptr<SSL> handle_;
+ BIO* readBIO_ = nullptr;
+ BIO* writeBIO_ = nullptr;
+ bool abortTLSHandshake_ = false;
+ X509_STORE_CTX *x509_store_ctx = nullptr;
+ std::function<int (const TLSContext *)> verifyCertCallback = nullptr;
+ };
}
diff --git a/Swiften/TLS/OpenSSL/OpenSSLContextFactory.cpp b/Swiften/TLS/OpenSSL/OpenSSLContextFactory.cpp
index 9f7b2aa..e332ca8 100644
--- a/Swiften/TLS/OpenSSL/OpenSSLContextFactory.cpp
+++ b/Swiften/TLS/OpenSSL/OpenSSLContextFactory.cpp
@@ -1,34 +1,60 @@
/*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2019 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
#include <Swiften/TLS/OpenSSL/OpenSSLContextFactory.h>
+#include <openssl/bio.h>
+#include <openssl/dh.h>
+#include <openssl/pem.h>
+
#include <Swiften/Base/Log.h>
#include <Swiften/TLS/OpenSSL/OpenSSLContext.h>
+#pragma clang diagnostic ignored "-Wshorten-64-to-32"
+
namespace Swift {
bool OpenSSLContextFactory::canCreate() const {
return true;
}
-TLSContext* OpenSSLContextFactory::createTLSContext(const TLSOptions&) {
- return new OpenSSLContext();
+std::unique_ptr<TLSContext> OpenSSLContextFactory::createTLSContext(const TLSOptions& options, TLSContext::Mode mode) {
+ return std::make_unique<OpenSSLContext>(options, mode);
+}
+
+ByteArray OpenSSLContextFactory::convertDHParametersFromPEMToDER(const std::string& dhParametersInPEM) {
+ ByteArray dhParametersInDER;
+
+ auto bio = std::unique_ptr<BIO, decltype(&BIO_free)>(BIO_new(BIO_s_mem()), BIO_free);
+ if (bio) {
+ BIO_write(bio.get(), dhParametersInPEM.data(), dhParametersInPEM.size());
+ if (auto params = PEM_read_bio_DHparams(bio.get(), nullptr, nullptr, nullptr)) {
+ unsigned char* buffer = nullptr;
+ auto len = i2d_DHparams(params, &buffer);
+ if (len > 0) {
+ dhParametersInDER = createByteArray(buffer, static_cast<size_t>(len));
+ free(buffer);
+ }
+ DH_free(params);
+
+ }
+ }
+ return dhParametersInDER;
}
void OpenSSLContextFactory::setCheckCertificateRevocation(bool check) {
if (check) {
- SWIFT_LOG(warning) << "CRL Checking not supported for OpenSSL" << std::endl;
+ SWIFT_LOG(warning) << "CRL Checking not supported for OpenSSL";
assert(false);
}
}
void OpenSSLContextFactory::setDisconnectOnCardRemoval(bool check) {
if (check) {
- SWIFT_LOG(warning) << "Smart cards not supported for OpenSSL" << std::endl;
+ SWIFT_LOG(warning) << "Smart cards not supported for OpenSSL";
}
}
diff --git a/Swiften/TLS/OpenSSL/OpenSSLContextFactory.h b/Swiften/TLS/OpenSSL/OpenSSLContextFactory.h
index e121a1a..834e479 100644
--- a/Swiften/TLS/OpenSSL/OpenSSLContextFactory.h
+++ b/Swiften/TLS/OpenSSL/OpenSSLContextFactory.h
@@ -1,23 +1,25 @@
/*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2019 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
#pragma once
-#include <cassert>
+#include <memory>
#include <Swiften/TLS/TLSContextFactory.h>
namespace Swift {
class OpenSSLContextFactory : public TLSContextFactory {
public:
- bool canCreate() const;
- virtual TLSContext* createTLSContext(const TLSOptions& tlsOptions);
+ bool canCreate() const override final;
+ virtual std::unique_ptr<TLSContext> createTLSContext(const TLSOptions& tlsOptions, TLSContext::Mode mode) override final;
+
+ virtual ByteArray convertDHParametersFromPEMToDER(const std::string& dhParametersInPEM) override final;
// Not supported
- virtual void setCheckCertificateRevocation(bool b);
- virtual void setDisconnectOnCardRemoval(bool b);
+ virtual void setCheckCertificateRevocation(bool b) override final;
+ virtual void setDisconnectOnCardRemoval(bool b) override final;
};
}
diff --git a/Swiften/TLS/PrivateKey.cpp b/Swiften/TLS/PrivateKey.cpp
new file mode 100644
index 0000000..31cac1d
--- /dev/null
+++ b/Swiften/TLS/PrivateKey.cpp
@@ -0,0 +1,22 @@
+/*
+ * Copyright (c) 2018 Isode Limited.
+ * All rights reserved.
+ * See the COPYING file for more information.
+ */
+
+#include <Swiften/TLS/PrivateKey.h>
+
+namespace Swift {
+
+PrivateKey::PrivateKey(const SafeByteArray& data, boost::optional<SafeByteArray> password) : data_(data), password_(password) {
+}
+
+const SafeByteArray& PrivateKey::getData() const {
+ return data_;
+}
+
+const boost::optional<SafeByteArray>& PrivateKey::getPassword() const {
+ return password_;
+}
+
+}
diff --git a/Swiften/TLS/PrivateKey.h b/Swiften/TLS/PrivateKey.h
new file mode 100644
index 0000000..332fc48
--- /dev/null
+++ b/Swiften/TLS/PrivateKey.h
@@ -0,0 +1,33 @@
+/*
+ * Copyright (c) 2018 Isode Limited.
+ * All rights reserved.
+ * See the COPYING file for more information.
+ */
+
+#pragma once
+
+#include <memory>
+
+#include <boost/optional.hpp>
+
+#include <Swiften/Base/SafeByteArray.h>
+#include <Swiften/TLS/PrivateKey.h>
+
+namespace Swift {
+
+class PrivateKey {
+public:
+ using ref = std::shared_ptr<PrivateKey>;
+
+public:
+ PrivateKey(const SafeByteArray& data, boost::optional<SafeByteArray> password = boost::optional<SafeByteArray>());
+
+ const SafeByteArray& getData() const;
+ const boost::optional<SafeByteArray>& getPassword() const;
+
+private:
+ SafeByteArray data_;
+ boost::optional<SafeByteArray> password_;
+};
+
+}
diff --git a/Swiften/TLS/SConscript b/Swiften/TLS/SConscript
index 68bf50b..a79e6a1 100644
--- a/Swiften/TLS/SConscript
+++ b/Swiften/TLS/SConscript
@@ -4,6 +4,7 @@ objects = swiften_env.SwiftenObject([
"Certificate.cpp",
"CertificateFactory.cpp",
"CertificateTrustChecker.cpp",
+ "PrivateKey.cpp",
"ServerIdentityVerifier.cpp",
"TLSContext.cpp",
"TLSContextFactory.cpp",
@@ -16,8 +17,11 @@ if myenv.get("HAVE_OPENSSL", 0) :
"OpenSSL/OpenSSLContext.cpp",
"OpenSSL/OpenSSLCertificate.cpp",
"OpenSSL/OpenSSLContextFactory.cpp",
+ "OpenSSL/OpenSSLCertificateFactory.cpp",
])
myenv.Append(CPPDEFINES = "HAVE_OPENSSL")
+ if myenv["PLATFORM"] == "win32" :
+ myenv.Append(CPPDEFINES = "NOMINMAX")
elif myenv.get("HAVE_SCHANNEL", 0) :
swiften_env.Append(LIBS = ["Winscard"])
objects += myenv.SwiftenObject([
diff --git a/Swiften/TLS/Schannel/SchannelContext.cpp b/Swiften/TLS/Schannel/SchannelContext.cpp
index 5799157..722fb4a 100644
--- a/Swiften/TLS/Schannel/SchannelContext.cpp
+++ b/Swiften/TLS/Schannel/SchannelContext.cpp
@@ -5,7 +5,7 @@
*/
/*
- * Copyright (c) 2012-2016 Isode Limited.
+ * Copyright (c) 2012-2019 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -16,6 +16,7 @@
#include <WinHTTP.h> /* For SECURITY_FLAG_IGNORE_CERT_CN_INVALID */
+#include <Swiften/Base/Log.h>
#include <Swiften/TLS/CAPICertificate.h>
#include <Swiften/TLS/Schannel/SchannelCertificate.h>
@@ -39,13 +40,20 @@ SchannelContext::SchannelContext(bool tls1_0Workaround) : state_(Start), secCont
//------------------------------------------------------------------------
SchannelContext::~SchannelContext() {
- if (myCertStore_) CertCloseStore(myCertStore_, 0);
+ SWIFT_LOG(debug) << "Destroying SchannelContext";
+ if (myCertStore_) {
+ if (CertCloseStore(myCertStore_, 0) == FALSE) {
+ SWIFT_LOG(debug) << "Failed to close the certificate store";
+ }
+ }
}
//------------------------------------------------------------------------
void SchannelContext::determineStreamSizes() {
- QueryContextAttributes(contextHandle_, SECPKG_ATTR_STREAM_SIZES, &streamSizes_);
+ if (QueryContextAttributes(contextHandle_, SECPKG_ATTR_STREAM_SIZES, &streamSizes_) != SEC_E_OK) {
+ SWIFT_LOG(debug) << "QueryContextAttributes failed to determinate the stream size";
+ }
}
//------------------------------------------------------------------------
@@ -267,8 +275,8 @@ void SchannelContext::continueHandshake(const SafeByteArray& data) {
SecBuffer inBuffers[2];
// Provide Schannel with the remote host's handshake data
- inBuffers[0].pvBuffer = (char*)(&receivedData_[0]);
- inBuffers[0].cbBuffer = (unsigned long)receivedData_.size();
+ inBuffers[0].pvBuffer = static_cast<char*>(&receivedData_[0]);
+ inBuffers[0].cbBuffer = static_cast<unsigned long>(receivedData_.size());
inBuffers[0].BufferType = SECBUFFER_TOKEN;
inBuffers[1].pvBuffer = NULL;
@@ -483,8 +491,8 @@ void SchannelContext::decryptAndProcessData(const SafeByteArray& data) {
// contexts. Additionally, a second SECBUFFER_TOKEN type buffer that contains a security token
// must also be supplied.
//
- inBuffers[0].pvBuffer = (char*)(&receivedData_[0]);
- inBuffers[0].cbBuffer = (unsigned long)receivedData_.size();
+ inBuffers[0].pvBuffer = static_cast<char*>(&receivedData_[0]);
+ inBuffers[0].cbBuffer = static_cast<unsigned long>(receivedData_.size());
inBuffers[0].BufferType = SECBUFFER_DATA;
inBuffers[1].BufferType = SECBUFFER_EMPTY;
@@ -578,7 +586,7 @@ void SchannelContext::encryptAndSendData(const SafeByteArray& data) {
outBuffers[0].BufferType = SECBUFFER_STREAM_HEADER;
outBuffers[1].pvBuffer = &sendBuffer[0] + streamSizes_.cbHeader;
- outBuffers[1].cbBuffer = (unsigned long)bytesToSend;
+ outBuffers[1].cbBuffer = static_cast<unsigned long>(bytesToSend);
outBuffers[1].BufferType = SECBUFFER_DATA;
outBuffers[2].pvBuffer = &sendBuffer[0] + streamSizes_.cbHeader + bytesToSend;
@@ -645,6 +653,7 @@ std::vector<Certificate::ref> SchannelContext::getPeerCertificateChain() const {
SECURITY_STATUS status = QueryContextAttributes(contextHandle_, SECPKG_ATTR_REMOTE_CERT_CONTEXT, pServerCert.Reset());
if (status != SEC_E_OK) {
+ SWIFT_LOG(debug) << "Error while Querying the Certificate Chain";
return certificateChain;
}
certificateChain.push_back(std::make_shared<SchannelCertificate>(pServerCert));
@@ -678,6 +687,10 @@ ByteArray SchannelContext::getFinishMessage() const {
if (ret == SEC_E_OK) {
return createByteArray(((unsigned char*) bindings.Bindings) + bindings.Bindings->dwApplicationDataOffset + 11 /* tls-unique:*/, bindings.Bindings->cbApplicationDataLength - 11);
}
+ else {
+ SWIFT_LOG(debug) << "Error while retrieving Finish Message";
+ }
+
return ByteArray();
}
diff --git a/Swiften/TLS/Schannel/SchannelContextFactory.cpp b/Swiften/TLS/Schannel/SchannelContextFactory.cpp
index f78d386..d029730 100644
--- a/Swiften/TLS/Schannel/SchannelContextFactory.cpp
+++ b/Swiften/TLS/Schannel/SchannelContextFactory.cpp
@@ -5,7 +5,7 @@
*/
/*
- * Copyright (c) 2015-2016 Isode Limited.
+ * Copyright (c) 2015-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -23,11 +23,13 @@ bool SchannelContextFactory::canCreate() const {
return true;
}
-TLSContext* SchannelContextFactory::createTLSContext(const TLSOptions& tlsOptions) {
+std::unique_ptr<TLSContext> SchannelContextFactory::createTLSContext(const TLSOptions& tlsOptions, TLSContext::Mode mode) {
+ // TLS server mode is not supported for the SecureTransport backend yet.
+ assert(mode == TLSContext::Mode::Client);
SchannelContext* context = new SchannelContext(tlsOptions.schannelTLS1_0Workaround);
context->setCheckCertificateRevocation(checkCertificateRevocation);
context->setDisconnectOnCardRemoval(disconnectOnCardRemoval);
- return context;
+ return std::unique_ptr<TLSContext>(context);
}
void SchannelContextFactory::setCheckCertificateRevocation(bool b) {
diff --git a/Swiften/TLS/Schannel/SchannelContextFactory.h b/Swiften/TLS/Schannel/SchannelContextFactory.h
index 142f193..76ff365 100644
--- a/Swiften/TLS/Schannel/SchannelContextFactory.h
+++ b/Swiften/TLS/Schannel/SchannelContextFactory.h
@@ -5,13 +5,15 @@
*/
/*
- * Copyright (c) 2015 Isode Limited.
+ * Copyright (c) 2015-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
#pragma once
+#include <memory>
+
#include <Swiften/TLS/TLSContextFactory.h>
namespace Swift {
@@ -20,8 +22,7 @@ namespace Swift {
SchannelContextFactory();
bool canCreate() const;
- virtual TLSContext* createTLSContext(const TLSOptions& tlsOptions);
-
+ virtual std::unique_ptr<TLSContext> createTLSContext(const TLSOptions& tlsOptions, TLSContext::Mode mode = TLSContext::Mode::Client);
virtual void setCheckCertificateRevocation(bool b);
virtual void setDisconnectOnCardRemoval(bool b);
diff --git a/Swiften/TLS/SecureTransport/SecureTransportCertificate.mm b/Swiften/TLS/SecureTransport/SecureTransportCertificate.mm
index db0af89..fffb3ed 100644
--- a/Swiften/TLS/SecureTransport/SecureTransportCertificate.mm
+++ b/Swiften/TLS/SecureTransport/SecureTransportCertificate.mm
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2015-2016 Isode Limited.
+ * Copyright (c) 2015-2017 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -93,13 +93,14 @@ void SecureTransportCertificate::parse() {
NSDictionary* subjectAltNamesDict = certDict[@"2.5.29.17"][@"value"];
for (NSDictionary* entry in subjectAltNamesDict) {
- if ([entry[@"label"] isEqualToString:static_cast<NSString * _Nonnull>([NSString stringWithUTF8String:ID_ON_XMPPADDR_OID])]) {
+ NSString* label = entry[@"label"];
+ if ([label isEqualToString:static_cast<NSString * _Nonnull>([NSString stringWithUTF8String:ID_ON_XMPPADDR_OID])]) {
xmppAddresses_.push_back(ns2StdString(entry[@"value"]));
}
- else if ([entry[@"label"] isEqualToString:static_cast<NSString * _Nonnull>([NSString stringWithUTF8String:ID_ON_DNSSRV_OID])]) {
+ else if ([label isEqualToString:static_cast<NSString * _Nonnull>([NSString stringWithUTF8String:ID_ON_DNSSRV_OID])]) {
srvNames_.push_back(ns2StdString(entry[@"value"]));
}
- else if ([entry[@"label"] isEqualToString:@"DNS Name"]) {
+ else if ([label isEqualToString:@"DNS Name"]) {
dnsNames_.push_back(ns2StdString(entry[@"value"]));
}
}
diff --git a/Swiften/TLS/SecureTransport/SecureTransportContext.mm b/Swiften/TLS/SecureTransport/SecureTransportContext.mm
index 1ed636b..b4f7842 100644
--- a/Swiften/TLS/SecureTransport/SecureTransportContext.mm
+++ b/Swiften/TLS/SecureTransport/SecureTransportContext.mm
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2015-2016 Isode Limited.
+ * Copyright (c) 2015-2019 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -72,14 +72,14 @@ CFArrayRef CreateClientCertificateChainAsCFArrayRef(CertificateWithKey::ref key)
break;
case errSecAuthFailed:
// Password did not work for decoding the certificate.
- SWIFT_LOG(warning) << "Invalid password." << std::endl;
+ SWIFT_LOG(warning) << "Invalid password.";
break;
case errSecDecode:
// Other decoding error.
- SWIFT_LOG(warning) << "PKCS12 decoding error." << std::endl;
+ SWIFT_LOG(warning) << "PKCS12 decoding error.";
break;
default:
- SWIFT_LOG(warning) << "Unknown error." << std::endl;
+ SWIFT_LOG(warning) << "Unknown error.";
}
if (securityError != errSecSuccess) {
@@ -110,20 +110,20 @@ SecureTransportContext::SecureTransportContext(bool checkCertificateRevocation)
// set IO callbacks
error = SSLSetIOFuncs(sslContext_.get(), &SecureTransportContext::SSLSocketReadCallback, &SecureTransportContext::SSLSocketWriteCallback);
if (error != noErr) {
- SWIFT_LOG(error) << "Unable to set IO functions to SSL context." << std::endl;
+ SWIFT_LOG(error) << "Unable to set IO functions to SSL context.";
sslContext_.reset();
}
error = SSLSetConnection(sslContext_.get(), this);
if (error != noErr) {
- SWIFT_LOG(error) << "Unable to set connection to SSL context." << std::endl;
+ SWIFT_LOG(error) << "Unable to set connection to SSL context.";
sslContext_.reset();
}
error = SSLSetSessionOption(sslContext_.get(), kSSLSessionOptionBreakOnServerAuth, true);
if (error != noErr) {
- SWIFT_LOG(error) << "Unable to set kSSLSessionOptionBreakOnServerAuth on session." << std::endl;
+ SWIFT_LOG(error) << "Unable to set kSSLSessionOptionBreakOnServerAuth on session.";
sslContext_.reset();
}
}
@@ -154,19 +154,19 @@ std::string SecureTransportContext::stateToString(State state) {
}
void SecureTransportContext::setState(State newState) {
- SWIFT_LOG(debug) << "Switch state from " << stateToString(state_) << " to " << stateToString(newState) << "." << std::endl;
+ SWIFT_LOG(debug) << "Switch state from " << stateToString(state_) << " to " << stateToString(newState) << ".";
state_ = newState;
}
void SecureTransportContext::connect() {
- SWIFT_LOG_ASSERT(state_ == None, error) << "current state '" << stateToString(state_) << " invalid." << std::endl;
+ SWIFT_LOG_ASSERT(state_ == None, error) << "current state '" << stateToString(state_) << " invalid.";
if (clientCertificate_) {
CFArrayRef certs = CreateClientCertificateChainAsCFArrayRef(clientCertificate_);
if (certs) {
std::shared_ptr<CFArray> certRefs(certs, CFRelease);
OSStatus result = SSLSetCertificate(sslContext_.get(), certRefs.get());
if (result != noErr) {
- SWIFT_LOG(error) << "SSLSetCertificate failed with error " << result << "." << std::endl;
+ SWIFT_LOG(error) << "SSLSetCertificate failed with error " << result << ".";
}
}
}
@@ -174,23 +174,23 @@ void SecureTransportContext::connect() {
}
void SecureTransportContext::processHandshake() {
- SWIFT_LOG_ASSERT(state_ == None || state_ == Handshake, error) << "current state '" << stateToString(state_) << " invalid." << std::endl;
+ SWIFT_LOG_ASSERT(state_ == None || state_ == Handshake, error) << "current state '" << stateToString(state_) << " invalid.";
OSStatus error = SSLHandshake(sslContext_.get());
if (error == errSSLWouldBlock) {
setState(Handshake);
}
else if (error == noErr) {
- SWIFT_LOG(debug) << "TLS handshake successful." << std::endl;
+ SWIFT_LOG(debug) << "TLS handshake successful.";
setState(HandshakeDone);
onConnected();
}
else if (error == errSSLPeerAuthCompleted) {
- SWIFT_LOG(debug) << "Received server certificate. Start verification." << std::endl;
+ SWIFT_LOG(debug) << "Received server certificate. Start verification.";
setState(Handshake);
verifyServerCertificate();
}
else {
- SWIFT_LOG(debug) << "Error returned from SSLHandshake call is " << error << "." << std::endl;
+ SWIFT_LOG(debug) << "Error returned from SSLHandshake call is " << error << ".";
fatalError(nativeToTLSError(error), std::make_shared<CertificateVerificationError>());
}
}
@@ -226,13 +226,13 @@ void SecureTransportContext::verifyServerCertificate() {
OSStatus cssmResult = 0;
switch(trustResult) {
case kSecTrustResultUnspecified:
- SWIFT_LOG(warning) << "Successful implicit validation. Result unspecified." << std::endl;
+ SWIFT_LOG(warning) << "Successful implicit validation. Result unspecified.";
break;
case kSecTrustResultProceed:
- SWIFT_LOG(warning) << "Validation resulted in explicitly trusted." << std::endl;
+ SWIFT_LOG(warning) << "Validation resulted in explicitly trusted.";
break;
case kSecTrustResultRecoverableTrustFailure:
- SWIFT_LOG(warning) << "recoverable trust failure" << std::endl;
+ SWIFT_LOG(warning) << "recoverable trust failure";
error = SecTrustGetCssmResultCode(trust, &cssmResult);
if (error == errSecSuccess) {
verificationError_ = CSSMErrorToVerificationError(cssmResult);
@@ -304,8 +304,8 @@ bool SecureTransportContext::setClientCertificate(CertificateWithKey::ref cert)
}
void SecureTransportContext::handleDataFromNetwork(const SafeByteArray& data) {
- SWIFT_LOG(debug) << std::endl;
- SWIFT_LOG_ASSERT(state_ == HandshakeDone || state_ == Handshake, error) << "current state '" << stateToString(state_) << " invalid." << std::endl;
+ SWIFT_LOG(debug);
+ SWIFT_LOG_ASSERT(state_ == HandshakeDone || state_ == Handshake, error) << "current state '" << stateToString(state_) << " invalid.";
append(readingBuffer_, data);
@@ -332,7 +332,7 @@ void SecureTransportContext::handleDataFromNetwork(const SafeByteArray& data) {
break;
}
else {
- SWIFT_LOG(error) << "SSLRead failed with error " << error << ", read bytes: " << bytesRead << "." << std::endl;
+ SWIFT_LOG(error) << "SSLRead failed with error " << error << ", read bytes: " << bytesRead << ".";
fatalError(std::make_shared<TLSError>(), std::make_shared<CertificateVerificationError>());
return;
}
@@ -347,7 +347,7 @@ void SecureTransportContext::handleDataFromNetwork(const SafeByteArray& data) {
}
break;
case Error:
- SWIFT_LOG(debug) << "Igoring received data in error state." << std::endl;
+ SWIFT_LOG(debug) << "Igoring received data in error state.";
break;
}
}
@@ -358,13 +358,13 @@ void SecureTransportContext::handleDataFromApplication(const SafeByteArray& data
OSStatus error = SSLWrite(sslContext_.get(), data.data(), data.size(), &processedBytes);
switch(error) {
case errSSLWouldBlock:
- SWIFT_LOG(warning) << "Unexpected because the write callback does not block." << std::endl;
+ SWIFT_LOG(warning) << "Unexpected because the write callback does not block.";
return;
case errSSLClosedGraceful:
case noErr:
return;
default:
- SWIFT_LOG(warning) << "SSLWrite returned error code: " << error << ", processed bytes: " << processedBytes << std::endl;
+ SWIFT_LOG(warning) << "SSLWrite returned error code: " << error << ", processed bytes: " << processedBytes;
fatalError(std::make_shared<TLSError>(), std::shared_ptr<CertificateVerificationError>());
}
}
@@ -376,7 +376,7 @@ std::vector<Certificate::ref> SecureTransportContext::getPeerCertificateChain()
typedef boost::remove_pointer<SecTrustRef>::type SecTrust;
std::shared_ptr<SecTrust> securityTrust;
- SecTrustRef secTrust = nullptr;;
+ SecTrustRef secTrust = nullptr;
OSStatus error = SSLCopyPeerTrust(sslContext_.get(), &secTrust);
if (error == noErr) {
securityTrust = std::shared_ptr<SecTrust>(secTrust, CFRelease);
@@ -390,7 +390,7 @@ std::vector<Certificate::ref> SecureTransportContext::getPeerCertificateChain()
}
}
else {
- SWIFT_LOG(warning) << "Failed to obtain peer trust structure; error = " << error << "." << std::endl;
+ SWIFT_LOG(warning) << "Failed to obtain peer trust structure; error = " << error << ".";
}
}
@@ -402,7 +402,7 @@ CertificateVerificationError::ref SecureTransportContext::getPeerCertificateVeri
}
ByteArray SecureTransportContext::getFinishMessage() const {
- SWIFT_LOG(warning) << "Access to TLS handshake finish message is not part of OS X Secure Transport APIs." << std::endl;
+ SWIFT_LOG(warning) << "Access to TLS handshake finish message is not part of OS X Secure Transport APIs.";
return ByteArray();
}
@@ -453,42 +453,42 @@ std::shared_ptr<CertificateVerificationError> SecureTransportContext::CSSMErrorT
std::shared_ptr<CertificateVerificationError> error;
switch(resultCode) {
case CSSMERR_TP_NOT_TRUSTED:
- SWIFT_LOG(debug) << "CSSM result code: CSSMERR_TP_NOT_TRUSTED" << std::endl;
+ SWIFT_LOG(debug) << "CSSM result code: CSSMERR_TP_NOT_TRUSTED";
error = std::make_shared<CertificateVerificationError>(CertificateVerificationError::Untrusted);
break;
case CSSMERR_TP_CERT_NOT_VALID_YET:
- SWIFT_LOG(debug) << "CSSM result code: CSSMERR_TP_CERT_NOT_VALID_YET" << std::endl;
+ SWIFT_LOG(debug) << "CSSM result code: CSSMERR_TP_CERT_NOT_VALID_YET";
error = std::make_shared<CertificateVerificationError>(CertificateVerificationError::NotYetValid);
break;
case CSSMERR_TP_CERT_EXPIRED:
- SWIFT_LOG(debug) << "CSSM result code: CSSMERR_TP_CERT_EXPIRED" << std::endl;
+ SWIFT_LOG(debug) << "CSSM result code: CSSMERR_TP_CERT_EXPIRED";
error = std::make_shared<CertificateVerificationError>(CertificateVerificationError::Expired);
break;
case CSSMERR_TP_CERT_REVOKED:
- SWIFT_LOG(debug) << "CSSM result code: CSSMERR_TP_CERT_REVOKED" << std::endl;
+ SWIFT_LOG(debug) << "CSSM result code: CSSMERR_TP_CERT_REVOKED";
error = std::make_shared<CertificateVerificationError>(CertificateVerificationError::Revoked);
break;
case CSSMERR_TP_VERIFY_ACTION_FAILED:
- SWIFT_LOG(debug) << "CSSM result code: CSSMERR_TP_VERIFY_ACTION_FAILED" << std::endl;
+ SWIFT_LOG(debug) << "CSSM result code: CSSMERR_TP_VERIFY_ACTION_FAILED";
break;
case CSSMERR_APPLETP_INCOMPLETE_REVOCATION_CHECK:
- SWIFT_LOG(debug) << "CSSM result code: CSSMERR_APPLETP_INCOMPLETE_REVOCATION_CHECK" << std::endl;
+ SWIFT_LOG(debug) << "CSSM result code: CSSMERR_APPLETP_INCOMPLETE_REVOCATION_CHECK";
if (checkCertificateRevocation_) {
error = std::make_shared<CertificateVerificationError>(CertificateVerificationError::RevocationCheckFailed);
}
break;
case CSSMERR_APPLETP_OCSP_UNAVAILABLE:
- SWIFT_LOG(debug) << "CSSM result code: CSSMERR_APPLETP_OCSP_UNAVAILABLE" << std::endl;
+ SWIFT_LOG(debug) << "CSSM result code: CSSMERR_APPLETP_OCSP_UNAVAILABLE";
if (checkCertificateRevocation_) {
error = std::make_shared<CertificateVerificationError>(CertificateVerificationError::RevocationCheckFailed);
}
break;
case CSSMERR_APPLETP_SSL_BAD_EXT_KEY_USE:
- SWIFT_LOG(debug) << "CSSM result code: CSSMERR_APPLETP_SSL_BAD_EXT_KEY_USE" << std::endl;
+ SWIFT_LOG(debug) << "CSSM result code: CSSMERR_APPLETP_SSL_BAD_EXT_KEY_USE";
error = std::make_shared<CertificateVerificationError>(CertificateVerificationError::InvalidPurpose);
break;
default:
- SWIFT_LOG(warning) << "unhandled CSSM error: " << resultCode << ", CSSM_TP_BASE_TP_ERROR: " << CSSM_TP_BASE_TP_ERROR << std::endl;
+ SWIFT_LOG(warning) << "unhandled CSSM error: " << resultCode << ", CSSM_TP_BASE_TP_ERROR: " << CSSM_TP_BASE_TP_ERROR;
error = std::make_shared<CertificateVerificationError>(CertificateVerificationError::UnknownError);
break;
}
diff --git a/Swiften/TLS/SecureTransport/SecureTransportContextFactory.cpp b/Swiften/TLS/SecureTransport/SecureTransportContextFactory.cpp
index 1fac1fb..ac399e1 100644
--- a/Swiften/TLS/SecureTransport/SecureTransportContextFactory.cpp
+++ b/Swiften/TLS/SecureTransport/SecureTransportContextFactory.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2015-2016 Isode Limited.
+ * Copyright (c) 2015-2019 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -26,8 +26,10 @@ bool SecureTransportContextFactory::canCreate() const {
return true;
}
-TLSContext* SecureTransportContextFactory::createTLSContext(const TLSOptions& /* tlsOptions */) {
- return new SecureTransportContext(checkCertificateRevocation_);
+std::unique_ptr<TLSContext> SecureTransportContextFactory::createTLSContext(const TLSOptions& /* tlsOptions */, TLSContext::Mode mode) {
+ // TLS server mode is not supported for the SecureTransport backend yet.
+ assert(mode == TLSContext::Mode::Client);
+ return std::unique_ptr<TLSContext>(new SecureTransportContext(checkCertificateRevocation_));
}
void SecureTransportContextFactory::setCheckCertificateRevocation(bool b) {
@@ -37,7 +39,7 @@ void SecureTransportContextFactory::setCheckCertificateRevocation(bool b) {
void SecureTransportContextFactory::setDisconnectOnCardRemoval(bool b) {
disconnectOnCardRemoval_ = b;
if (disconnectOnCardRemoval_) {
- SWIFT_LOG(warning) << "Smart cards have not been tested yet" << std::endl;
+ SWIFT_LOG(warning) << "Smart cards have not been tested yet";
}
}
diff --git a/Swiften/TLS/SecureTransport/SecureTransportContextFactory.h b/Swiften/TLS/SecureTransport/SecureTransportContextFactory.h
index 74c598f..b86639a 100644
--- a/Swiften/TLS/SecureTransport/SecureTransportContextFactory.h
+++ b/Swiften/TLS/SecureTransport/SecureTransportContextFactory.h
@@ -1,11 +1,13 @@
/*
- * Copyright (c) 2015 Isode Limited.
+ * Copyright (c) 2015-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
#pragma once
+#include <memory>
+
#include <Swiften/TLS/TLSContextFactory.h>
namespace Swift {
@@ -17,7 +19,7 @@ class SecureTransportContextFactory : public TLSContextFactory {
virtual bool canCreate() const;
- virtual TLSContext* createTLSContext(const TLSOptions& tlsOptions);
+ virtual std::unique_ptr<TLSContext> createTLSContext(const TLSOptions& tlsOptions, TLSContext::Mode mode = TLSContext::Mode::Client);
virtual void setCheckCertificateRevocation(bool b);
virtual void setDisconnectOnCardRemoval(bool b);
diff --git a/Swiften/TLS/ServerIdentityVerifier.cpp b/Swiften/TLS/ServerIdentityVerifier.cpp
index 226e94b..18ea2aa 100644
--- a/Swiften/TLS/ServerIdentityVerifier.cpp
+++ b/Swiften/TLS/ServerIdentityVerifier.cpp
@@ -12,7 +12,7 @@
namespace Swift {
-ServerIdentityVerifier::ServerIdentityVerifier(const JID& jid, IDNConverter* idnConverter) : domainValid(false) {
+ServerIdentityVerifier::ServerIdentityVerifier(const JID& jid, IDNConverter* idnConverter, bool checkServer) : domainValid(false), checkServer_(checkServer) {
domain = jid.getDomain();
boost::optional<std::string> domainResult = idnConverter->getIDNAEncoded(domain);
if (!!domainResult) {
@@ -36,12 +36,14 @@ bool ServerIdentityVerifier::certificateVerifies(Certificate::ref certificate) {
}
hasSAN |= !dnsNames.empty();
+ std::string prefix = (checkServer_) ? "_xmpp-server." : "_xmpp-client.";
+
// SRV names
std::vector<std::string> srvNames = certificate->getSRVNames();
for (const auto& srvName : srvNames) {
// Only match SRV names that begin with the service; this isn't required per
// spec, but we're being purist about this.
- if (boost::starts_with(srvName, "_xmpp-client.") && matchesDomain(srvName.substr(std::string("_xmpp-client.").size(), srvName.npos))) {
+ if (boost::starts_with(srvName, prefix) && matchesDomain(srvName.substr(prefix.size(), srvName.npos))) {
return true;
}
}
@@ -80,15 +82,15 @@ bool ServerIdentityVerifier::matchesDomain(const std::string& s) const {
if (dotIndex != matchDomain.npos) {
matchDomain = matchDomain.substr(dotIndex + 1, matchDomain.npos);
}
- return matchString == matchDomain;
+ return boost::iequals(matchString, matchDomain);
}
else {
- return s == encodedDomain;
+ return boost::iequals(s, encodedDomain);
}
}
bool ServerIdentityVerifier::matchesAddress(const std::string& s) const {
- return s == domain;
+ return boost::iequals(s, domain);
}
}
diff --git a/Swiften/TLS/ServerIdentityVerifier.h b/Swiften/TLS/ServerIdentityVerifier.h
index f40c683..f2cf46f 100644
--- a/Swiften/TLS/ServerIdentityVerifier.h
+++ b/Swiften/TLS/ServerIdentityVerifier.h
@@ -18,7 +18,7 @@ namespace Swift {
class SWIFTEN_API ServerIdentityVerifier {
public:
- ServerIdentityVerifier(const JID& jid, IDNConverter* idnConverter);
+ ServerIdentityVerifier(const JID& jid, IDNConverter* idnConverter, bool checkServer=false);
bool certificateVerifies(Certificate::ref);
@@ -30,5 +30,6 @@ namespace Swift {
std::string domain;
std::string encodedDomain;
bool domainValid;
+ bool checkServer_;
};
}
diff --git a/Swiften/TLS/TLSContext.cpp b/Swiften/TLS/TLSContext.cpp
index 2763547..fd31c2d 100644
--- a/Swiften/TLS/TLSContext.cpp
+++ b/Swiften/TLS/TLSContext.cpp
@@ -1,19 +1,53 @@
/*
- * Copyright (c) 2010 Isode Limited.
+ * Copyright (c) 2010-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
#include <Swiften/TLS/TLSContext.h>
+#include <cassert>
+
namespace Swift {
TLSContext::~TLSContext() {
}
+void TLSContext::accept() {
+ assert(false);
+}
+
+void TLSContext::connect(const std::string& /* serverName */) {
+ assert(false);
+}
+
+bool TLSContext::setCertificateChain(const std::vector<std::shared_ptr<Certificate>>& /* certificateChain */) {
+ assert(false);
+ return false;
+}
+
+bool TLSContext::setPrivateKey(const PrivateKey::ref& /* privateKey */) {
+ assert(false);
+ return false;
+}
+
+bool TLSContext::setDiffieHellmanParameters(const ByteArray& /*parametersInOpenSslDer*/) {
+ assert(false);
+ return false;
+}
+
+void TLSContext::setAbortTLSHandshake(bool /* abort */) {
+ assert(false);
+}
+
Certificate::ref TLSContext::getPeerCertificate() const {
std::vector<Certificate::ref> chain = getPeerCertificateChain();
return chain.empty() ? Certificate::ref() : chain[0];
}
+ByteArray TLSContext::getPeerFinishMessage() const {
+ assert(false);
+ return ByteArray();
+}
+
}
diff --git a/Swiften/TLS/TLSContext.h b/Swiften/TLS/TLSContext.h
index 79e3485..f2dbdce 100644
--- a/Swiften/TLS/TLSContext.h
+++ b/Swiften/TLS/TLSContext.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -15,6 +15,7 @@
#include <Swiften/TLS/Certificate.h>
#include <Swiften/TLS/CertificateVerificationError.h>
#include <Swiften/TLS/CertificateWithKey.h>
+#include <Swiften/TLS/PrivateKey.h>
#include <Swiften/TLS/TLSError.h>
namespace Swift {
@@ -23,9 +24,21 @@ namespace Swift {
public:
virtual ~TLSContext();
+ virtual void accept();
virtual void connect() = 0;
+ virtual void connect(const std::string& serverName);
+
+ virtual bool setCertificateChain(const std::vector<std::shared_ptr<Certificate>>& /* certificateChain */);
+ virtual bool setPrivateKey(const PrivateKey::ref& /* privateKey */);
virtual bool setClientCertificate(CertificateWithKey::ref cert) = 0;
+ virtual bool setDiffieHellmanParameters(const ByteArray& parametersInOpenSslDer);
+
+ /**
+ * This method can be used during the \ref onServerNameRequested signal,
+ * to report an error about an unknown host back to the requesting client.
+ */
+ virtual void setAbortTLSHandshake(bool /* abort */);
virtual void handleDataFromNetwork(const SafeByteArray&) = 0;
virtual void handleDataFromApplication(const SafeByteArray&) = 0;
@@ -35,11 +48,19 @@ namespace Swift {
virtual CertificateVerificationError::ref getPeerCertificateVerificationError() const = 0;
virtual ByteArray getFinishMessage() const = 0;
+ virtual ByteArray getPeerFinishMessage() const;
+
+ public:
+ enum class Mode {
+ Client,
+ Server
+ };
public:
boost::signals2::signal<void (const SafeByteArray&)> onDataForNetwork;
boost::signals2::signal<void (const SafeByteArray&)> onDataForApplication;
boost::signals2::signal<void (std::shared_ptr<TLSError>)> onError;
boost::signals2::signal<void ()> onConnected;
+ boost::signals2::signal<void (const std::string&)> onServerNameRequested;
};
}
diff --git a/Swiften/TLS/TLSContextFactory.cpp b/Swiften/TLS/TLSContextFactory.cpp
index d196e15..91e60d6 100644
--- a/Swiften/TLS/TLSContextFactory.cpp
+++ b/Swiften/TLS/TLSContextFactory.cpp
@@ -6,9 +6,16 @@
#include <Swiften/TLS/TLSContextFactory.h>
+#include <cassert>
+
namespace Swift {
TLSContextFactory::~TLSContextFactory() {
}
+ByteArray TLSContextFactory::convertDHParametersFromPEMToDER(const std::string& /* pem */) {
+ assert(false);
+ return ByteArray();
+}
+
}
diff --git a/Swiften/TLS/TLSContextFactory.h b/Swiften/TLS/TLSContextFactory.h
index d2ffe15..5f70541 100644
--- a/Swiften/TLS/TLSContextFactory.h
+++ b/Swiften/TLS/TLSContextFactory.h
@@ -1,25 +1,29 @@
/*
- * Copyright (c) 2010-2015 Isode Limited.
+ * Copyright (c) 2010-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
#pragma once
+#include <memory>
+
#include <Swiften/Base/API.h>
+#include <Swiften/Base/ByteArray.h>
+#include <Swiften/TLS/TLSContext.h>
#include <Swiften/TLS/TLSOptions.h>
namespace Swift {
- class TLSContext;
-
class SWIFTEN_API TLSContextFactory {
public:
virtual ~TLSContextFactory();
virtual bool canCreate() const = 0;
- virtual TLSContext* createTLSContext(const TLSOptions& tlsOptions) = 0;
+ virtual std::unique_ptr<TLSContext> createTLSContext(const TLSOptions& tlsOptions, TLSContext::Mode = TLSContext::Mode::Client) = 0;
virtual void setCheckCertificateRevocation(bool b) = 0;
virtual void setDisconnectOnCardRemoval(bool b) = 0;
+
+ virtual ByteArray convertDHParametersFromPEMToDER(const std::string& pem);
};
}
diff --git a/Swiften/TLS/TLSError.h b/Swiften/TLS/TLSError.h
index ae775e6..9e4af2f 100644
--- a/Swiften/TLS/TLSError.h
+++ b/Swiften/TLS/TLSError.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012-2016 Isode Limited.
+ * Copyright (c) 2012-2019 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -7,6 +7,7 @@
#pragma once
#include <memory>
+#include <string>
#include <Swiften/Base/API.h>
#include <Swiften/Base/Error.h>
@@ -18,16 +19,23 @@ namespace Swift {
enum Type {
UnknownError,
- CertificateCardRemoved
+ CertificateCardRemoved,
+ AcceptFailed,
+ ConnectFailed
};
- TLSError(Type type = UnknownError) : type(type) {}
+ TLSError(Type type = UnknownError, std::string message = "") : type_(type), message_(std::move(message)) {}
Type getType() const {
- return type;
+ return type_;
+ }
+
+ const std::string& getMessage() const {
+ return message_;
}
private:
- Type type;
+ Type type_;
+ std::string message_;
};
}
diff --git a/Swiften/TLS/TLSOptions.h b/Swiften/TLS/TLSOptions.h
index dd7e920..e3faaf9 100644
--- a/Swiften/TLS/TLSOptions.h
+++ b/Swiften/TLS/TLSOptions.h
@@ -7,8 +7,11 @@
#pragma once
namespace Swift {
+ class TLSContext;
+ class Certificate;
- struct TLSOptions {
+ class TLSOptions {
+ public:
TLSOptions() : schannelTLS1_0Workaround(false) {
}
@@ -21,5 +24,54 @@ namespace Swift {
*/
bool schannelTLS1_0Workaround;
+ /**
+ * OpenSSL configuration flags
+ */
+ boost::optional<bool> workaroundMicrosoftSessID;
+ boost::optional<bool> workaroundNetscapeChallenge;
+ boost::optional<bool> workaroundNetscapeReuseCipherChange;
+ boost::optional<bool> workaroundSSLRef2ReuseCertType;
+ boost::optional<bool> workaroundMicrosoftBigSSLv3Buffer;
+ boost::optional<bool> workaroundSSLeay080ClientDH;
+ boost::optional<bool> workaroundTLSD5;
+ boost::optional<bool> workaroundTLSBlockPadding;
+ boost::optional<bool> workaroundDontInsertEmptyFragments;
+ boost::optional<bool> workaroundAll;
+ boost::optional<bool> suppressSSLv2;
+ boost::optional<bool> suppressSSLv3;
+ boost::optional<bool> suppressTLSv1;
+ boost::optional<bool> disableTLSRollBackBug;
+ boost::optional<bool> singleDHUse;
+
+ /**
+ * Other OpenSSL configuration items
+ */
+ boost::optional<std::string> cipherSuites;
+ boost::optional<std::string> context;
+ boost::optional<int> sessionCacheTimeout;
+ boost::optional<int> verifyDepth;
+
+ enum class VerifyMode {
+ None,
+ Required,
+ Optional
+ };
+ boost::optional<VerifyMode> verifyMode;
+
+ /**
+ * Callback for certificate verification
+ */
+
+ boost::optional<std::function<int(const TLSContext *)>> verifyCertificateCallback;
+
+ /**
+ * Allows specification of application-specific Trust Anchors
+ */
+ boost::optional<std::vector<std::shared_ptr<Certificate>>> trustAnchors;
+
+ /**
+ * Turns off automatic loading of system Trust Anchors
+ */
+ bool ignoreSystemTrustAnchors = false;
};
}
diff --git a/Swiften/TLS/UnitTest/CertificateTest.cpp b/Swiften/TLS/UnitTest/CertificateTest.cpp
index 2483dae..d5bf210 100644
--- a/Swiften/TLS/UnitTest/CertificateTest.cpp
+++ b/Swiften/TLS/UnitTest/CertificateTest.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -10,9 +10,12 @@
#include <cppunit/extensions/TestFactoryRegistry.h>
#include <Swiften/Base/ByteArray.h>
+#include <Swiften/Base/Platform.h>
#include <Swiften/Crypto/CryptoProvider.h>
#include <Swiften/Crypto/PlatformCryptoProvider.h>
#include <Swiften/TLS/Certificate.h>
+#include <Swiften/TLS/CertificateFactory.h>
+#include <Swiften/TLS/PlatformTLSFactories.h>
#include <Swiften/TLS/SimpleCertificate.h>
using namespace Swift;
@@ -20,6 +23,10 @@ using namespace Swift;
class CertificateTest : public CppUnit::TestFixture {
CPPUNIT_TEST_SUITE(CertificateTest);
CPPUNIT_TEST(testGetSHA1Fingerprint);
+#ifdef HAVE_OPENSSL
+ CPPUNIT_TEST(testParsingPEMCertificate);
+#endif
+ CPPUNIT_TEST(testParsingPEMPrivateKey);
CPPUNIT_TEST_SUITE_END();
public:
@@ -29,6 +36,108 @@ class CertificateTest : public CppUnit::TestFixture {
CPPUNIT_ASSERT_EQUAL(std::string("2f:b5:e1:34:19:fc:89:24:68:65:e7:a3:24:f4:76:ec:62:4e:87:40"), Certificate::getSHA1Fingerprint(testling, std::shared_ptr<CryptoProvider>(PlatformCryptoProvider::create()).get()));
}
+
+ void testParsingPEMCertificate() {
+ PlatformTLSFactories tlsFactories;
+
+ auto PEMCertificate = R"(-----BEGIN CERTIFICATE-----
+MIIEsjCCApoCCQCbkjlQfUqPtTANBgkqhkiG9w0BAQsFADAbMRkwFwYDVQQDDBBt
+b250YWd1ZS5leGFtcGxlMB4XDTE4MDExODE2NTMxMloXDTQ1MDYwNDE2NTMxMlow
+GzEZMBcGA1UEAwwQbW9udGFndWUuZXhhbXBsZTCCAiIwDQYJKoZIhvcNAQEBBQAD
+ggIPADCCAgoCggIBALAx5xuEYOjDJ9QHMvwRuDzxbHl1zR97SJFPAkmD8xH0sC61
+DNRyUvRq6UXb4znhqeqrNuZ9PV47GyK2Dpy/c/MY5NE3m/c+Z1tUnrcqyCkxITIn
+jdSI/elc9yhtMXX6lRi68BdPJnj/9+6trW0cWHlKEgnaSTAgCVB+4Dg9mjTIroCa
+HLoAKhr2zS7Ihs28aWb0cSvZ+qFgQhr7FGP2kfssTTQYyRPn9uHhtyWH6RqSv5x9
+BBGZWN5GtjkJvupcYWLt8ftuQyFpwEeEz5cgtiyKgsfz9CYvS9/OcwdLQr4z5Zq6
+eKxsog9GdwIi1Us4KR0X6tKu9ze42iEWF+foEWFP9/bjrVK/tt5lTSKnenk0nA8I
+amkG0btNAGihDti3lv60bGpd3B2/uh4gzzT2buXdf0EaybCt52MIr8xkwMU0Tkri
+RAYchdS8U8sekWG5Lg9m3L2BDa8/TKS/WflJhGcZeInGQslgIx7fCgO1M7Zr50pO
+wSURPXpvqUkXNEBy639UQEUsnBhntEQwZWx/6x6Ma/U5a5dL6qbtEJjlwIvS+nl9
+3w26g3DvWydNMCtZIVhgdrl+dZs+Uw5eA3QkHkDTSfYvQk7X5SYL0J5ZxwBvU9r1
+ED054+TAEuX2euiRA37xLhxonj8BaKkPQGlAHCLZaZPmNJWkNxElJhMoCfqBAgMB
+AAEwDQYJKoZIhvcNAQELBQADggIBAF+FNyW3nVeQeugBMksIhj7EMJl1AEKi0+78
+ZPsYX3CDbc/8GRZoTg/EWSiwPCBYc9VsxuKtODEYABCZgk7LnSBYoEauJDKWqkgM
+UOKPJI2hu7mIK7FJpjvEZe2MnRRA63oI/NVDJm8T2clrv/vPkY+ppsVl0toC0SpH
+/3dF5c65vYI19rTJraRU6kIrrgxFBzxzpn07LGh2rrOCQfy2umTSRMwz3ORAFfmi
++Kek1Dt7c+JVJ0ivCwhhc8MKza3JS2MuDfVWGnXtDLb81Ai0t4tQfLKvZEcgW+lh
+Drz9gv22buwncWL/IxtuhzyILtDSDKAYFbhfG6IAQut9BjMgpMnKrBCDlOLJl08K
+tgj2h7vUKyNSt3ndcSAtXjr6FD7+xPExJuyn/MgLONGGAZoZHFB4QO90wQaXxMPh
+7rnjUtzfLR8qkDmX8ZB4f4VOWpDWo4hBpgjTk0gYfzEkrh+zTqE9reh7CZ1WzwXO
+KnIBU2dZOE+XsJe49lW106DLqGzKRuQMUAwFMb7C7Nlg9GKTnvi41o+g6YE+MgxR
+uPKu891pCBtnDxZiWPT+7Fa/9UXxdIOTVIHW6utSWiWYbeNwXSmIm2ShfmNfWj9m
+x1JgJrFB6daWGR9aDBeDVRhgL6Z35lH7xI62pLJ4o2d2Y/9dUWAJfz5O8opeCyrF
+zqCzpwGL
+-----END CERTIFICATE-----
+)";
+
+ auto certificateChain = tlsFactories.getCertificateFactory()->createCertificateChain(createByteArray(PEMCertificate));
+ CPPUNIT_ASSERT_EQUAL(size_t(1), certificateChain.size());
+
+ auto certificate = certificateChain[0].get();
+ CPPUNIT_ASSERT_EQUAL(std::string("/CN=montague.example"), certificate->getSubjectName());
+ }
+
+ void testParsingPEMPrivateKey() {
+ PlatformTLSFactories tlsFactories;
+
+ auto PEMPrivateKey = R"(-----BEGIN PRIVATE KEY-----
+MIIJQwIBADANBgkqhkiG9w0BAQEFAASCCS0wggkpAgEAAoICAQCwMecbhGDowyfU
+BzL8Ebg88Wx5dc0fe0iRTwJJg/MR9LAutQzUclL0aulF2+M54anqqzbmfT1eOxsi
+tg6cv3PzGOTRN5v3PmdbVJ63KsgpMSEyJ43UiP3pXPcobTF1+pUYuvAXTyZ4//fu
+ra1tHFh5ShIJ2kkwIAlQfuA4PZo0yK6Amhy6ACoa9s0uyIbNvGlm9HEr2fqhYEIa
++xRj9pH7LE00GMkT5/bh4bclh+kakr+cfQQRmVjeRrY5Cb7qXGFi7fH7bkMhacBH
+hM+XILYsioLH8/QmL0vfznMHS0K+M+WaunisbKIPRncCItVLOCkdF+rSrvc3uNoh
+Fhfn6BFhT/f2461Sv7beZU0ip3p5NJwPCGppBtG7TQBooQ7Yt5b+tGxqXdwdv7oe
+IM809m7l3X9BGsmwredjCK/MZMDFNE5K4kQGHIXUvFPLHpFhuS4PZty9gQ2vP0yk
+v1n5SYRnGXiJxkLJYCMe3woDtTO2a+dKTsElET16b6lJFzRAcut/VEBFLJwYZ7RE
+MGVsf+sejGv1OWuXS+qm7RCY5cCL0vp5fd8NuoNw71snTTArWSFYYHa5fnWbPlMO
+XgN0JB5A00n2L0JO1+UmC9CeWccAb1Pa9RA9OePkwBLl9nrokQN+8S4caJ4/AWip
+D0BpQBwi2WmT5jSVpDcRJSYTKAn6gQIDAQABAoICABqc/wZ2AVlHGP36tGXEm2qB
+INxbwcbujTB9mZ/XEWD176KucCiquAL5HxERPIointK2V82Kvzk7fkbI7v4YIQBo
+Ey/S0XkP8Panmm2aRa+LHzN/K/odUxTrmN1/WMg0OE8K9Xbf2rTOHPntO9POQ0LW
+wFDCqulc/WsuLtnv3Bn68fi0zn/9xF5cRvO5EDuFKPqHE40HGMdFTdbbc+IBfV1N
+/L9QuxaJpA3MVSiTFc+QuOZ/L50k53pzfdSxtyeZGpCh1jofFn62hXeIBP8TztB9
+f3GKVKdr328HtPI2GPe3yQeNAOsyYWwjPZiSAFujOPqPAUYfbXH6NuBmgOfjcrRb
+AhOv9F1VNi+G56NJ6jo/NPygD+LYQdIKs5rv3E4ehyQzbu+SoGyVCnF3qm0cvz+v
+tB5/gNiWiyRhNF94DZHlceDMQSdyB/pfTZsKZ44Yv44Bzl54YbzR8yr/ZKzAj6gt
+5lwAqCIcdRj4i5DmIa7psj3iYWe9hYV7f+zwdosPKibRvO9FpvDCbb7biIPkMozw
+cYH6QlSsZ+XsK/Z3WPFPq0wHOgoWW9Tr8LYyQxGjLO+xD8ziQ7Rp0KApEunuO29s
+CPXj+l1HqNmAK2LkdNI3c/yStlaAcOzYD6pauciHWlTnIGZG8aHV6elIjK0C/h7B
+3GndVc0TbewbP0bL56QBAoIBAQDU/yl4nlELhpoI1WW8v/FcDnc3V5dBilJ3LQtp
+a3SKBcNWXE850TviOAklMrYmS1wuWdBTjEay9Ka6dImqMFGupmJjLmUw0KXrtPin
+xIz5DZ42nmTKnYevuBQoQrrq7toxf5hYow2ZjeH2vSX+igY1gxDZbLW4Wb9GPYMo
+Au5+z8XpA8R0key52nvnKastm5YxNstAlBOodAPKlbIr2bzmrHSjXAGjUzb+z6NZ
+5Lx+zvQCy9kaIYvfOJm3eLSbMXzeP2S59qbwL+dC4ZJ5m3hjRmMaactV6LSchVNt
+eLEYJpm92IdjQhG6oqM0IaU3aSjWMSrOAytylmqoEt4wA+WhAoIBAQDTxJ9VLb+J
+OD0x/9cm17KpK1nGQBQ0T0oZQUH5M/tXTPCCoIpoL9UhKQ34vlPaZXkBQrXPw+PN
+Y0J26uR6w4CowWAMn8LR6cYsWcOKuURcDYs/SPflD3rraevJwugQhkXtub2nV7dP
+88Z/jGvhXthJmjUmNoKq3OC2MuSfHSkm8ipvaAblwb+lt5zBJGQ6iGXbi5TI6b+D
+lnAidQpG/V464Zc9gb788P0K2vUeoZRLI7CurYqpDV0mBtPhFv5L1M0S8+psG7Pa
+NIEKcW/b76vU9odTrtGBT0gCVYU7f8QnTN4g6c7dEhcZa2Zvg0YSmb4XuU9RQGC5
+As47nEUnPCjhAoIBAQDTXKnAogn2kAmGvoyIs0hFe61d47ObPDH9RVvPruwkkvd2
+WX/c9f6gy853dU0/zwSYklOitM7rgs94s3BwzCYiU8XKeh28RTCBKEKf6PGjq5nW
+xXNrhMtC2j5WfXGS9JbdC6sYOiWivSMAgE6Vuk3TCE7OE4x4dcbTYvMl31Lf0Dqq
+sixfKPdqrp7Jk5XkWkK+b4teeBLR1N52R/pYfWdw2K2d9g1CD6/BSDbnW46Zn7CQ
+nczAm417Y2VWpZdDceZhfTLtPxAFxOOOgN2jg14B1bU+XsGCbLvdnohdV6kVOCjU
+NWyUWNnTBNVDRCf5RodZlczORmL1AMKyKpcFurhBAoIBABSxbfBg3AqImFI+ccO1
+6BtnxQn+UPsblF4LZmr3jWPmfMoG7f9oTSdEX70ivAbnS3+4CRQYTDZRsLj2EwV7
+/SKAYuZY5iyk71x+GQGBQRDNsgGpG7AiZxyB6Sx6Azs6I7MrJ0Em7R6+73KfQhtv
+rSrkCrWFNheEJeEn7/csXk0T9NmWDLZ+zD9hRcwJxlGB6pIdfZh0XuZ42NRFI4/0
+SjTuvlygRQ1qbw+UfcdUeq0s+6LWCmqih6ujlyizmn3GeZOUih+uRVDZOJLQquGO
+9feFb4vZ1VcRbDPuL2q0/XHprPsCXdh0YBV3zTawWTSQGWcwEHQcGld50rU4e/lt
+g4ECggEBAKwoqsqIHheL+uS2CHXmwFIr+rvOlLYlfB8XrwV/da3p7QChaDLbNIVM
+uOAozCMkJY+dufPGI+3cKsR3kLAGejmfbH5OTzTbwCLOJFCWaoMuvOTY2Govte61
+gU1BWnjUgVJgVA/YTwn2yo02d0nG5/rSZ9xIt3hfO6ac5FhHBTA1DAZ1wDiLeow+
+qngZ2sA4ePtwhGFtvLVwTcGAfkWvQFi2YPBpesFIAmQ/ACGC7Ye75Ja4k36/8YwE
+NiXR2Yy1hxwwi7CTWWzI0X+mvE/Oqpd8PUqPJCJcpz892Gq4EGCxM7Bz7NxCcvvw
+5IMXuORWuoq0gXiCdEyko+saXsyWlqw=
+-----END PRIVATE KEY-----
+)";
+
+ auto privateKey = tlsFactories.getCertificateFactory()->createPrivateKey(createSafeByteArray(PEMPrivateKey));
+
+ CPPUNIT_ASSERT(privateKey != nullptr);
+ }
};
CPPUNIT_TEST_SUITE_REGISTRATION(CertificateTest);
diff --git a/Swiften/TLS/UnitTest/ClientServerTest.cpp b/Swiften/TLS/UnitTest/ClientServerTest.cpp
new file mode 100644
index 0000000..a356dcf
--- /dev/null
+++ b/Swiften/TLS/UnitTest/ClientServerTest.cpp
@@ -0,0 +1,883 @@
+/*
+ * Copyright (c) 2010-2019 Isode Limited.
+ * All rights reserved.
+ * See the COPYING file for more information.
+ */
+
+#include <map>
+#include <memory>
+#include <utility>
+#include <vector>
+
+#include <boost/variant.hpp>
+
+#include <gtest/gtest.h>
+
+#include <Swiften/Base/Log.h>
+#include <Swiften/TLS/CertificateFactory.h>
+#include <Swiften/TLS/PlatformTLSFactories.h>
+#include <Swiften/TLS/TLSContext.h>
+#include <Swiften/TLS/TLSContextFactory.h>
+#include <Swiften/TLS/TLSOptions.h>
+
+using namespace Swift;
+namespace {
+
+
+std::map<std::string, std::string> certificatePEM = {
+ {"montague.example",
+R"(-----BEGIN CERTIFICATE-----
+MIIEsjCCApoCCQCbkjlQfUqPtTANBgkqhkiG9w0BAQsFADAbMRkwFwYDVQQDDBBt
+b250YWd1ZS5leGFtcGxlMB4XDTE4MDExODE2NTMxMloXDTQ1MDYwNDE2NTMxMlow
+GzEZMBcGA1UEAwwQbW9udGFndWUuZXhhbXBsZTCCAiIwDQYJKoZIhvcNAQEBBQAD
+ggIPADCCAgoCggIBALAx5xuEYOjDJ9QHMvwRuDzxbHl1zR97SJFPAkmD8xH0sC61
+DNRyUvRq6UXb4znhqeqrNuZ9PV47GyK2Dpy/c/MY5NE3m/c+Z1tUnrcqyCkxITIn
+jdSI/elc9yhtMXX6lRi68BdPJnj/9+6trW0cWHlKEgnaSTAgCVB+4Dg9mjTIroCa
+HLoAKhr2zS7Ihs28aWb0cSvZ+qFgQhr7FGP2kfssTTQYyRPn9uHhtyWH6RqSv5x9
+BBGZWN5GtjkJvupcYWLt8ftuQyFpwEeEz5cgtiyKgsfz9CYvS9/OcwdLQr4z5Zq6
+eKxsog9GdwIi1Us4KR0X6tKu9ze42iEWF+foEWFP9/bjrVK/tt5lTSKnenk0nA8I
+amkG0btNAGihDti3lv60bGpd3B2/uh4gzzT2buXdf0EaybCt52MIr8xkwMU0Tkri
+RAYchdS8U8sekWG5Lg9m3L2BDa8/TKS/WflJhGcZeInGQslgIx7fCgO1M7Zr50pO
+wSURPXpvqUkXNEBy639UQEUsnBhntEQwZWx/6x6Ma/U5a5dL6qbtEJjlwIvS+nl9
+3w26g3DvWydNMCtZIVhgdrl+dZs+Uw5eA3QkHkDTSfYvQk7X5SYL0J5ZxwBvU9r1
+ED054+TAEuX2euiRA37xLhxonj8BaKkPQGlAHCLZaZPmNJWkNxElJhMoCfqBAgMB
+AAEwDQYJKoZIhvcNAQELBQADggIBAF+FNyW3nVeQeugBMksIhj7EMJl1AEKi0+78
+ZPsYX3CDbc/8GRZoTg/EWSiwPCBYc9VsxuKtODEYABCZgk7LnSBYoEauJDKWqkgM
+UOKPJI2hu7mIK7FJpjvEZe2MnRRA63oI/NVDJm8T2clrv/vPkY+ppsVl0toC0SpH
+/3dF5c65vYI19rTJraRU6kIrrgxFBzxzpn07LGh2rrOCQfy2umTSRMwz3ORAFfmi
++Kek1Dt7c+JVJ0ivCwhhc8MKza3JS2MuDfVWGnXtDLb81Ai0t4tQfLKvZEcgW+lh
+Drz9gv22buwncWL/IxtuhzyILtDSDKAYFbhfG6IAQut9BjMgpMnKrBCDlOLJl08K
+tgj2h7vUKyNSt3ndcSAtXjr6FD7+xPExJuyn/MgLONGGAZoZHFB4QO90wQaXxMPh
+7rnjUtzfLR8qkDmX8ZB4f4VOWpDWo4hBpgjTk0gYfzEkrh+zTqE9reh7CZ1WzwXO
+KnIBU2dZOE+XsJe49lW106DLqGzKRuQMUAwFMb7C7Nlg9GKTnvi41o+g6YE+MgxR
+uPKu891pCBtnDxZiWPT+7Fa/9UXxdIOTVIHW6utSWiWYbeNwXSmIm2ShfmNfWj9m
+x1JgJrFB6daWGR9aDBeDVRhgL6Z35lH7xI62pLJ4o2d2Y/9dUWAJfz5O8opeCyrF
+zqCzpwGL
+-----END CERTIFICATE-----
+)"},
+ {"capulet.example",
+R"(-----BEGIN CERTIFICATE-----
+MIIEsDCCApgCCQDUGdmqHfGngTANBgkqhkiG9w0BAQsFADAaMRgwFgYDVQQDDA9j
+YXB1bGV0LmV4YW1wbGUwHhcNMTgwMTE4MTY1NjEyWhcNNDUwNjA0MTY1NjEyWjAa
+MRgwFgYDVQQDDA9jYXB1bGV0LmV4YW1wbGUwggIiMA0GCSqGSIb3DQEBAQUAA4IC
+DwAwggIKAoICAQCgA/CpV7UGqUdjhEVoMjFIZ6Ca/C7utrVPAqBvE14eiurIhQrQ
+AmYeC9zA4/uXCdqkGq/a/RbF3OOCKLRUejCcynb0EnxiHxHa48ZsvLbKCK6guoXE
+pWnaZsmRpvJrBB2z6ohmxRuaDuc5CJT+Oq8AFPp3StTAFDo3Cju3fsGZPkNpCGbj
+ELwk4ok9INtEuTrMEmHZTD+VfjpXauUfN4ygKaPXJanCuxuifyin403BWgd8igkD
+oSCWxoDFMy3HGbh/NU+nJPJ23FxVC39RdDG3elvjNFpSZnALbiMnyor7YjF5TN93
+1ZWwn3VTnl7DnFquEbKbYyVFUzRII8Cd1TzKOL48rVLrCAqMXwm6YFtST6qPb9TZ
+0SX8qZGCwBfHV5OeS0ZgiBMMlmUPYcw9MlyvZnYyDPCOoPWmhEqd2gQzn//7hzb5
+mriCEyfcMzAqohylBNHXUVZTx5KcazJz6oOYdWEs1jfSXNKefgSWlgeoG2fgTXPN
+1OkQVS+FOiI0VCAIwR+vxhG3hVTz3kzXWvEt7M51faaHWWlnSzOrbSuj3f0ibS5J
+cj6ClyzOQRQDwzofyZ7oPWh6No/XkepVIn3HTTlnj1/8e6VsH+EBKSzoX2XvWPkO
+GAZEGHKiKh944u6d6mW37BPD2oKyusP3uPL5j2Fdm+m0HkP3/7yw+5EFVQIDAQAB
+MA0GCSqGSIb3DQEBCwUAA4ICAQCfCGK4iDo8H0i12wBC0+6GB9NBmgn8P09AUN0l
+tQjZPaqZCtLtBBqOrAaZQBQMfI0QAm5/h/VkhMvz5HQjqmQhI2drSDOmarYzOGgY
+yVItkEwtLEVhiGoeJ+L3Smosoqq6QFjcDzH7UzPTrJNspnY+09+m53pJggh41zzt
+1TOU+QasaB5oGopFaFUUlwjHAc7FpZgEd+tV6j0cpdT3GabVkkoLg01Z+0mqkpLD
+OjRBKJX8XvZ38VESsy3gWpcXnDq03n+8OgZo4R9SEcyyxjWbyb+qg2dzbQvRB2Va
+QNoXp5EzemXvFSulhR+TfDk2K1h45BurikRQxDi8LpBTUsCMwiqXdem68HOlTwLi
+/kMWbnVBcdurYcWVSwlJU4EJcTEdk51JStO1V0nAA0nCwn/iEhY8I6BitnrcCJ5e
+4CGVWr+zAm8DBjaFMTzy46Q5NcT0hwnHGN6T6l4aMcRggIK9anRbXCn6dSzma1pd
+R5N/Do00FTpyZGcUlVPnSlIfZVl7y/9XEO1n6xDJURrefL1JrM7UMyB17jA8HMq3
+S05kF7XRpludRB4QkAJt5BNNv6BPP7HPIKyR/rq94ONvzVPAo7uASyFE2sMBsfwP
+pXAI1LVolPCoUC13jEkKdmc8kMSxU+XtsvFryNhkfQtZfSg+nBRFYptFE7GrZ9WY
+GMSL4g==
+-----END CERTIFICATE-----
+)"},
+ {"casigned.example.com",
+R"(-----BEGIN CERTIFICATE-----
+MIIDYTCCAkmgAwIBAgIJAPEpYlUWlJW8MA0GCSqGSIb3DQEBCwUAMEAxCzAJBgNV
+BAYTAkdCMRAwDgYDVQQIDAdFbmdsYW5kMQ4wDAYDVQQKDAVJc29kZTEPMA0GA1UE
+AwwGVGVzdENBMB4XDTE4MDExODAwMDAwMFoXDTQ5MDExODAwMDAwMFowTjELMAkG
+A1UEBhMCR0IxEDAOBgNVBAgMB0VuZ2xhbmQxDjAMBgNVBAoMBUlzb2RlMR0wGwYD
+VQQDDBRjYXNpZ25lZC5leGFtcGxlLmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEP
+ADCCAQoCggEBAKw4iCscGIDCc55mwxgJsn/v2GEorpE9zHYsMfl6px2aRLGgB8ki
+xYyNiEPA/b/ilShRp7pp22LPb5O3aOVVWzAs5FTvPdFY2vS8YIxR6XSKXO3u4Q8/
+w8CR0AbKpeCtL0TwSl1u76nq6ORMep6QGsTjDLQ7wUwdShL4qV4nIGxJWon/5GI0
+nl4Xr/wzmysbMjAMSiWOR90DNZMvqQBBhQcJdqdirc+whR8gOhIMvJBn5jlMuFEB
+zL/bR+kG/zFuD0EMsMTy6TETefYuxeWmhuzQENyAV5+1v48G/1a9zzN9Y0xQ6T0N
+ppbLzq+/zhxT1eBN8/O0bAGUzzk1VSFvouECAwEAAaNQME4wHQYDVR0OBBYEFCnR
+umlxjdaUvcpf77zahrDmPnt1MB8GA1UdIwQYMBaAFAbbhPAKtD5YzxQqGH2Um4/f
+OmdFMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBAEPrTTKS+7A4dJJh
+gSAS44ZYyR8/kt9Y3V4qxJM2xrOrW6rM8N15n2i/osSy0AYHiPuvgDG+D7hLt5Ct
+7jZKrp3JRsBaU8//9k6+euwVyWS+EKo/eb7qtSNibZOk7GwrXekJMbRXz1cHTKnW
+0R8UG+EMkOqKQh5dhWuEBXff9SYLTALf0/i+/Ixl3b9rQ6zpY/7UwBdlWLaliM1i
+odIgVu1XRE6Su+bGMa1L5ArniN0LMFq9Mxag2H0V7Kru7vIvbBkL7U6tbi7u26hv
+q4kUFROW2U2C02FTmJeSEBvWoDyMoVjKkmaTL0+vDSQRPGtCsvCgaCXgOwU2Po9s
+8jjHQxg=
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIDUzCCAjugAwIBAgIJAPEpYlUWlJW7MA0GCSqGSIb3DQEBCwUAMEAxCzAJBgNV
+BAYTAkdCMRAwDgYDVQQIDAdFbmdsYW5kMQ4wDAYDVQQKDAVJc29kZTEPMA0GA1UE
+AwwGVGVzdENBMB4XDTE4MDExODAwMDAwMFoXDTQ5MDExODAwMDAwMFowQDELMAkG
+A1UEBhMCR0IxEDAOBgNVBAgMB0VuZ2xhbmQxDjAMBgNVBAoMBUlzb2RlMQ8wDQYD
+VQQDDAZUZXN0Q0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCiCA+9
+bdSHFNPOgbsnhrKbLJP+1lxWTe06+ExwJA3QgCKsR13MsAK8rhmuNB0k8ZIFJL+c
+yUOUgw0370eP940QAtK+HinJpvaGEZKEwaB8VUCjzFTb7zUBio1Y7B45aawEV3qT
+Lzcnil3f7vPIxnAoaptzPriySdggIsimj+y6AWum5FUPyfZzF7EnYfF/VH8V/ZNX
+fku7PPbaeDHvu4EF/0s8P+/l6jddz8dqbDMjH3GDM8sjryWPQPNDjKZ1x80BIdyq
+s9m/kXqIIySNwdIa/X+nYTMchUa5y46n2N4n0RA4F+rf+Ni1Cxk9Ejmmz5hinV+t
+Yzh6jsbB7yZiqEnzAgMBAAGjUDBOMB0GA1UdDgQWBBQG24TwCrQ+WM8UKhh9lJuP
+3zpnRTAfBgNVHSMEGDAWgBQG24TwCrQ+WM8UKhh9lJuP3zpnRTAMBgNVHRMEBTAD
+AQH/MA0GCSqGSIb3DQEBCwUAA4IBAQBMHQ3WMEhkEc0VoOEw3mbsngt1eyJz+nFM
+FeGdRb7JSwpJfe/yBxyGodGyHsQJPVole6sUdq8S1QGT547PkgDHc6Btoq96Mahq
+brgfx1JL9a1F8qaqcENebHc7ltW8kps4xtdlithfo4nKaciYZ5mKbug+AFv569mb
+LU3F282dyW1dLa7+L8dGbb8Ntpnp0BB0Cotm4GX3Xi6Y+fikouqcmXj7vX+uMhG4
+pQpXqb2ML1Gev4w6XUsnls+OJok97x99NsOcqtwqsLJS/sg0cpwrgZ9+50hQKlHO
+8H6hhNjGBkvpIiNsWb9UOc+Id86J+drs9Ed93Eyyvwnq2XcqPGF3
+-----END CERTIFICATE-----)"}};
+std::map<std::string, std::string> privateKeyPEM = {
+ {"montague.example",
+R"(-----BEGIN PRIVATE KEY-----
+MIIJQwIBADANBgkqhkiG9w0BAQEFAASCCS0wggkpAgEAAoICAQCwMecbhGDowyfU
+BzL8Ebg88Wx5dc0fe0iRTwJJg/MR9LAutQzUclL0aulF2+M54anqqzbmfT1eOxsi
+tg6cv3PzGOTRN5v3PmdbVJ63KsgpMSEyJ43UiP3pXPcobTF1+pUYuvAXTyZ4//fu
+ra1tHFh5ShIJ2kkwIAlQfuA4PZo0yK6Amhy6ACoa9s0uyIbNvGlm9HEr2fqhYEIa
++xRj9pH7LE00GMkT5/bh4bclh+kakr+cfQQRmVjeRrY5Cb7qXGFi7fH7bkMhacBH
+hM+XILYsioLH8/QmL0vfznMHS0K+M+WaunisbKIPRncCItVLOCkdF+rSrvc3uNoh
+Fhfn6BFhT/f2461Sv7beZU0ip3p5NJwPCGppBtG7TQBooQ7Yt5b+tGxqXdwdv7oe
+IM809m7l3X9BGsmwredjCK/MZMDFNE5K4kQGHIXUvFPLHpFhuS4PZty9gQ2vP0yk
+v1n5SYRnGXiJxkLJYCMe3woDtTO2a+dKTsElET16b6lJFzRAcut/VEBFLJwYZ7RE
+MGVsf+sejGv1OWuXS+qm7RCY5cCL0vp5fd8NuoNw71snTTArWSFYYHa5fnWbPlMO
+XgN0JB5A00n2L0JO1+UmC9CeWccAb1Pa9RA9OePkwBLl9nrokQN+8S4caJ4/AWip
+D0BpQBwi2WmT5jSVpDcRJSYTKAn6gQIDAQABAoICABqc/wZ2AVlHGP36tGXEm2qB
+INxbwcbujTB9mZ/XEWD176KucCiquAL5HxERPIointK2V82Kvzk7fkbI7v4YIQBo
+Ey/S0XkP8Panmm2aRa+LHzN/K/odUxTrmN1/WMg0OE8K9Xbf2rTOHPntO9POQ0LW
+wFDCqulc/WsuLtnv3Bn68fi0zn/9xF5cRvO5EDuFKPqHE40HGMdFTdbbc+IBfV1N
+/L9QuxaJpA3MVSiTFc+QuOZ/L50k53pzfdSxtyeZGpCh1jofFn62hXeIBP8TztB9
+f3GKVKdr328HtPI2GPe3yQeNAOsyYWwjPZiSAFujOPqPAUYfbXH6NuBmgOfjcrRb
+AhOv9F1VNi+G56NJ6jo/NPygD+LYQdIKs5rv3E4ehyQzbu+SoGyVCnF3qm0cvz+v
+tB5/gNiWiyRhNF94DZHlceDMQSdyB/pfTZsKZ44Yv44Bzl54YbzR8yr/ZKzAj6gt
+5lwAqCIcdRj4i5DmIa7psj3iYWe9hYV7f+zwdosPKibRvO9FpvDCbb7biIPkMozw
+cYH6QlSsZ+XsK/Z3WPFPq0wHOgoWW9Tr8LYyQxGjLO+xD8ziQ7Rp0KApEunuO29s
+CPXj+l1HqNmAK2LkdNI3c/yStlaAcOzYD6pauciHWlTnIGZG8aHV6elIjK0C/h7B
+3GndVc0TbewbP0bL56QBAoIBAQDU/yl4nlELhpoI1WW8v/FcDnc3V5dBilJ3LQtp
+a3SKBcNWXE850TviOAklMrYmS1wuWdBTjEay9Ka6dImqMFGupmJjLmUw0KXrtPin
+xIz5DZ42nmTKnYevuBQoQrrq7toxf5hYow2ZjeH2vSX+igY1gxDZbLW4Wb9GPYMo
+Au5+z8XpA8R0key52nvnKastm5YxNstAlBOodAPKlbIr2bzmrHSjXAGjUzb+z6NZ
+5Lx+zvQCy9kaIYvfOJm3eLSbMXzeP2S59qbwL+dC4ZJ5m3hjRmMaactV6LSchVNt
+eLEYJpm92IdjQhG6oqM0IaU3aSjWMSrOAytylmqoEt4wA+WhAoIBAQDTxJ9VLb+J
+OD0x/9cm17KpK1nGQBQ0T0oZQUH5M/tXTPCCoIpoL9UhKQ34vlPaZXkBQrXPw+PN
+Y0J26uR6w4CowWAMn8LR6cYsWcOKuURcDYs/SPflD3rraevJwugQhkXtub2nV7dP
+88Z/jGvhXthJmjUmNoKq3OC2MuSfHSkm8ipvaAblwb+lt5zBJGQ6iGXbi5TI6b+D
+lnAidQpG/V464Zc9gb788P0K2vUeoZRLI7CurYqpDV0mBtPhFv5L1M0S8+psG7Pa
+NIEKcW/b76vU9odTrtGBT0gCVYU7f8QnTN4g6c7dEhcZa2Zvg0YSmb4XuU9RQGC5
+As47nEUnPCjhAoIBAQDTXKnAogn2kAmGvoyIs0hFe61d47ObPDH9RVvPruwkkvd2
+WX/c9f6gy853dU0/zwSYklOitM7rgs94s3BwzCYiU8XKeh28RTCBKEKf6PGjq5nW
+xXNrhMtC2j5WfXGS9JbdC6sYOiWivSMAgE6Vuk3TCE7OE4x4dcbTYvMl31Lf0Dqq
+sixfKPdqrp7Jk5XkWkK+b4teeBLR1N52R/pYfWdw2K2d9g1CD6/BSDbnW46Zn7CQ
+nczAm417Y2VWpZdDceZhfTLtPxAFxOOOgN2jg14B1bU+XsGCbLvdnohdV6kVOCjU
+NWyUWNnTBNVDRCf5RodZlczORmL1AMKyKpcFurhBAoIBABSxbfBg3AqImFI+ccO1
+6BtnxQn+UPsblF4LZmr3jWPmfMoG7f9oTSdEX70ivAbnS3+4CRQYTDZRsLj2EwV7
+/SKAYuZY5iyk71x+GQGBQRDNsgGpG7AiZxyB6Sx6Azs6I7MrJ0Em7R6+73KfQhtv
+rSrkCrWFNheEJeEn7/csXk0T9NmWDLZ+zD9hRcwJxlGB6pIdfZh0XuZ42NRFI4/0
+SjTuvlygRQ1qbw+UfcdUeq0s+6LWCmqih6ujlyizmn3GeZOUih+uRVDZOJLQquGO
+9feFb4vZ1VcRbDPuL2q0/XHprPsCXdh0YBV3zTawWTSQGWcwEHQcGld50rU4e/lt
+g4ECggEBAKwoqsqIHheL+uS2CHXmwFIr+rvOlLYlfB8XrwV/da3p7QChaDLbNIVM
+uOAozCMkJY+dufPGI+3cKsR3kLAGejmfbH5OTzTbwCLOJFCWaoMuvOTY2Govte61
+gU1BWnjUgVJgVA/YTwn2yo02d0nG5/rSZ9xIt3hfO6ac5FhHBTA1DAZ1wDiLeow+
+qngZ2sA4ePtwhGFtvLVwTcGAfkWvQFi2YPBpesFIAmQ/ACGC7Ye75Ja4k36/8YwE
+NiXR2Yy1hxwwi7CTWWzI0X+mvE/Oqpd8PUqPJCJcpz892Gq4EGCxM7Bz7NxCcvvw
+5IMXuORWuoq0gXiCdEyko+saXsyWlqw=
+-----END PRIVATE KEY-----
+)"},{"capulet.example",
+R"(-----BEGIN PRIVATE KEY-----
+MIIJQwIBADANBgkqhkiG9w0BAQEFAASCCS0wggkpAgEAAoICAQCgA/CpV7UGqUdj
+hEVoMjFIZ6Ca/C7utrVPAqBvE14eiurIhQrQAmYeC9zA4/uXCdqkGq/a/RbF3OOC
+KLRUejCcynb0EnxiHxHa48ZsvLbKCK6guoXEpWnaZsmRpvJrBB2z6ohmxRuaDuc5
+CJT+Oq8AFPp3StTAFDo3Cju3fsGZPkNpCGbjELwk4ok9INtEuTrMEmHZTD+VfjpX
+auUfN4ygKaPXJanCuxuifyin403BWgd8igkDoSCWxoDFMy3HGbh/NU+nJPJ23FxV
+C39RdDG3elvjNFpSZnALbiMnyor7YjF5TN931ZWwn3VTnl7DnFquEbKbYyVFUzRI
+I8Cd1TzKOL48rVLrCAqMXwm6YFtST6qPb9TZ0SX8qZGCwBfHV5OeS0ZgiBMMlmUP
+Ycw9MlyvZnYyDPCOoPWmhEqd2gQzn//7hzb5mriCEyfcMzAqohylBNHXUVZTx5Kc
+azJz6oOYdWEs1jfSXNKefgSWlgeoG2fgTXPN1OkQVS+FOiI0VCAIwR+vxhG3hVTz
+3kzXWvEt7M51faaHWWlnSzOrbSuj3f0ibS5Jcj6ClyzOQRQDwzofyZ7oPWh6No/X
+kepVIn3HTTlnj1/8e6VsH+EBKSzoX2XvWPkOGAZEGHKiKh944u6d6mW37BPD2oKy
+usP3uPL5j2Fdm+m0HkP3/7yw+5EFVQIDAQABAoICAQCBom+IYdvwp5eEUhaA0ZkH
+lZyRsxi6oB7HAdPD6SbpC5YmGVKnLipY0TdotcqPlJYjONObUErwxYEzY5KkldFo
+VMaF+av3OkCW2s1YLpLPnrUK1dGlfHUDUR6f92aRuGXv6mPTDoDMEKLWm9NJG3XH
+VTeNCXzOmBSJnqq+f9yML9sg7oOcFWS3ZSfV9BZv2Lh/t6y6BIHGtNrDE4DIB5LP
+9qwbkxGzBy7eOLJRQV8u86b5CENBQ3pJbEvKdynxES9dL212dgJQtTnAVG4zKTVV
+9bUXnsRF2WOQfwvQItDx051NLjAkv05kJutAcR9IzhTQzNmr9Wiufzft8bkMpUJ3
+Mf8cJk5VNm9mgKvWnqKrPSyfNcicykcVHXr0yDICLgttWy5d9bj9/DcfrIOzEwhd
+MOhTixYtR1dv/7p9kqw2mRgMV3GtB6f+AoQ29NrCt9bD6T2Rth9lXSo90sLW47J9
+QIan8jb/T4N7nuga37wLlpL5KhA7nyzlaF37PyvhbErzOxRfq287iQKCyF+nh3n5
+9HzWDWz+8zYcjsxlYc1x7XHWWAYKS1h+ZWPjWCLH8hlh3ZRdPm4CUfwuZmA2EjNT
+8dRblRQ8QB9cvsKoLjKt8vB8mIoH6Sjk5I3vqNVXl6Su0JrvLg5A/3tfyPfxsm5c
+rTunLQllzpgo2/q6ssz9yQKCAQEAzgDf0ozoyH9+k4ND7LCy5G1vGr8LqMhyjgSC
+4AhBIM/Hz56YSrU0hIFpgu/VGWLkGN/0AiwhHBKpt+6KkvLBjxnv71dmI2hBIbb4
+Hzy4EXtPTtFqn4gffYjOen6co8RUl1vTOmRDUdfS6su0v9TD3335TIIfF+5DAGvR
+V6OIHkQWWrHazUZx0tbwRyty3Q4NtYgXLFrcWFYfMFd26GhFrM7uHFrbOg5U3gpZ
+/YdaaJzfdaJKHNPNQJUPD40n36n8RyjlWSWkUfEV3ITm0IMiCJ19WDjyddLUXuzC
+KSoeiTCISXzZ8lhmvnBB4pW9V1O1o8cDJFRT1ouUfOKqK86lxwKCAQEAxtnMzmEp
+Z+W3Jlz9istkJHerNATtQzj3KSNHbrM8gB+O0igq0BWbj+lvNtbuZVprLrOpbDk8
+Ksk+PdbgSbsQjALcs1FpoIsPWt6sKTwrZQuMCocHzGfrp0MA613YCRw9sNBM08C6
+TNbjSTiVlBb3xyjsI3hLZ9sj8N9rV6yomlwM6MnpdIDUxfiv5tlqZcqCYdibJ9zu
+tWi44O2tim3uCVrajop/NsHXbROjd7MeV4gaj3SsJ4cLyvfcBkfwrhUse5D6qy6y
+08ZsbrMUqY50ZG0WUcKzJxJcF/mOANZ+Dgqe9jwKlxV8E1Lj7PaQWWzQ5bWVgnLe
+TuKoZurGEaJMAwKCAQEAgWHJMYswlOSGUg2KdrjP0mns8wZ0QzCJyiqJLD3i8cGu
+Q/bevWUrs+E3rHYHCCe1DO5zaX3f2arbD1txizOOX9sxd8gTrT9IUO2CztOq48fn
+mqAqcEHlTUnELOkiZjTj0CBq/OyF33xGyxLf1e/CibasAeJjtvr89+G/nGRoFGI9
+C/9SZcTNrlcyl/Bw9udhstbjfwceBxkoA4ubcgIzaIKayBJESCVCJiaoOHRvUu7b
+5hzkoVBhRCOaTvEfzvkLKoJD8YaTuqdJTLPn56PEl1aap/M0TM36dhgLJiF/BjkG
+D+mrVOsytH760l2ripJXraJLleCku0X1H66YpGTodwKCAQA34vCntDEB7VLrKklr
+37v2b9ejGBtiwDjey/aAi0lerP/j2rwlnV0KNk42eHOp8p6bEo10SCW71LF0idah
+gjylTQygLSpln4+iN2Dlee6sSHGEZ+zuKurVKISyob5c2R4ReomNHeZ+QArDAm8v
+nsDmrX6ofV+cAb/5K6Gsk28TavmJ122Qe8DRHxK467P2hdLdExaQPoysWZFUThhv
+BnRXFrzEQPJ9/j7Afjt8IdBOQ4dLeDwGI/NRiRXCgieHlZXZ6KY6xDYoROUmu5f8
+C3h03R/fvLvDKGrPpiid3aqx4ZRJmhhT3AryF2LNr4JkT6vqU32Amy4Vt6givKsM
+O7PnAoIBAAggpMq7PMugGP4B9PgNb00oGmWfXSa+M83O0GGN7jSirxqkaK+/eDOY
+kSnVFWmORNBlSz+bLoA3Bw2mFXI8HfSbHM9E/Qt0scf0hV+SwpTuO3pDWF5ev20G
+mL1QEBUNDmvOn2SYERKI1iRevjBBXSzwTpAXnfaWvvTn1XSKzSJK3TjMhFTZHtbj
+mgPPV65cznhofUsg2QenT8zKisvYPYN3p3p9Jo6IqHyT/CCymwIB4OMZITiwXxQs
+PMAxlZGkX3Uri5A8Ln3QQ46elanI2TlC+ZDa84gu/Gw691JWCfsaSaQDTJKnGqos
+dwiNVl130YWaJLjiA9Poc2llKtypfQ8=
+-----END PRIVATE KEY-----
+)"},
+ {"casigned.example.com",
+R"(-----BEGIN PRIVATE KEY-----
+MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCsOIgrHBiAwnOe
+ZsMYCbJ/79hhKK6RPcx2LDH5eqcdmkSxoAfJIsWMjYhDwP2/4pUoUae6adtiz2+T
+t2jlVVswLORU7z3RWNr0vGCMUel0ilzt7uEPP8PAkdAGyqXgrS9E8Epdbu+p6ujk
+THqekBrE4wy0O8FMHUoS+KleJyBsSVqJ/+RiNJ5eF6/8M5srGzIwDEoljkfdAzWT
+L6kAQYUHCXanYq3PsIUfIDoSDLyQZ+Y5TLhRAcy/20fpBv8xbg9BDLDE8ukxE3n2
+LsXlpobs0BDcgFeftb+PBv9Wvc8zfWNMUOk9DaaWy86vv84cU9XgTfPztGwBlM85
+NVUhb6LhAgMBAAECggEAP5KesUstwFoHU/GbEsSBn7hpp3Pc/MBTOUwXJoCgL81C
+jk8EkLrFMZ0NL/WNtcduR/PcdnOdCFyKU3zgu8dGYgIwRyoJJ74lFTJ0cVfLVbm9
+lBcZ/QcMu4kXwWoM0WMcj9YjnVnWHmMYlS2mFeIb/5HQnrdwIyisr1QbMSZAUbgn
+HOLSjkd0KUcXxwP9HfE/8zUFbUsv/wPHE9T5eWqZz7lKZRvgUyk3jYElpewxqPvR
+HPOq9BN87ft7rPzmmZ4JCU2tM5MEQONo3jT5pljTU/iz4pfs1HArHS+/zZbGcoiu
+AhODErhLucodwZ07MZsE9KAdGPGUeob4SgMwmkIiAQKBgQDYZ33DHOgYd5Fa7Tqv
+TC77Nbpjmnk5lyoInNf+7pxBTgqIuKbpS6Ctq76nHI0qerNfd44LqojQEJ9S5rbL
+3s+HR+pypx3DyysE92uLaVsF4rfwZeEpJyQ1Q9NGbsKVb2nNrdGs3LZhG5PL+JQT
+8lS9h/sMIbh5Gd/Dkt8a2HlTawKBgQDLu3YdXWeWUOcq63YrLFDO+RUGsCe1cf+2
+3wTmMRgxfzpAPDZKymUPwrJNd1ddCQiRVKg91pLhlDl8B89Q4iWdOpYnE6vrnw3w
+6iEdEyA6IauvEvD3JPXHGtVHKBS/wz06wQVGzsgMvVun1w32SDzTGZ/somvkN1UE
+BTMRVqXB4wKBgCgkgnq4GQG45FjGmtU7v5dP7yRc2lHpjZ2NYq/imU+v51pXTncG
+VWcB7drX/AO+QRnbdpkJaFmYS8W4EH6e9UY1+/KKt4XDYVaJgwSYZY8g8FgCvhLB
+NQFAdKejEitgQHMr5DI5uwcmc3MpyGYu1LNXzyT/+FVWjGCeFQ7IyzDDAoGAXK9I
++ez/bkQaFs2OMe/0R2TL6wIC3qohMpndSbf2ELaX0pdR/856EaR6p4FujlXIvw0r
+iQ5wPg3H5SRMbbikchYwL1DkusnedsadD/QeijO9PmW4mEcJRW5wrvGOFvuEhJFB
+jEgQfLM82muc33lXqpYSyn3N5cJCfBS9edrYiA8CgYEA0Tsa4KvwzmBXzy2jexUT
+PPYtV9S7hS0D7Owf5SBI1wtWczOu3Y6DsCG4mbDi/tvo1dxC9d5Ns8RXHH9mtdyn
+8VUuSu24lk7VZ0OP5/byiAGqC2urDFGe0iBqePdb+3uS1g132LzAJm4RqBYw4Xjd
+P6n9b0V3iodcFLMTy1ShJ+I=
+-----END PRIVATE KEY-----
+)"}};
+
+auto montagueEncryptedPEM = R"(-----BEGIN RSA PRIVATE KEY-----
+Proc-Type: 4,ENCRYPTED
+DEK-Info: AES-256-CBC,6B0A69362920334824667C1B6207279B
+
+vlDCCnUf9aDbCD4+PUuo5LGvzTFlT03ZRMnHDcBzE2mp1OMBjxeEu4j4cqUJE2qV
+NXCRbsedMsydoHlg76LssYM7J/AI9dp5cek0HgYMqdeB+hoNn22AmjRb7WhY4VeW
+RqKAzkXT1lsxEF8hykQcalbsrbdmKkPosiNJF4Pb9EEefl01e+Ny3nb7GRs22tzX
+lJNBk+lrM0Jlg1Y6c3F5/5CkKHTXP4924Pzjzf6Bw5hG80izrYeBUC5lZJtqDM7B
+lmFXAng4RIDKk1TsqeJ11Fa1nMqFkvRvlU8RdrcZ5rtngWxIAvTXAjbDk5mvS6Iw
+WdjmH46TrVMQLXC2Qh++grldyx4GDm7rShLm23J9lUAdPLjIvurYT+LfbCRqfgIw
+hkPtm6BWkkf95KfpMKZ0giOhikqnF2YsozgqI5SphDFIAGN7bXa7Z8g/xFI9Uqie
+2+rWqVvBOQ8PBepTd2H2uahV+pP1wHmgqN/bp/paXt6+Qf7ptH6MNTwgnTanDfnk
+wzyhVlw5tTsG8okjD1cT2R7RbuDQRkArpzbnATPEU9Itrx0Sh/ZPKPDDVS+aSBHA
+3JytZX5yzd/yilNjE3NfN1G923lcWXRX3KsdZUQjbcPugML7xbC+orqwxeYLipMN
+jfNEGK0IrTNmRN5HqFU6JBNbas67BlFU4Zt4Tt73sUHrMpSSRINd8itRZaKtqZuM
+8upj7ZUD/j6j/JmSxN2w+TcmHXfNWZirTFWUvtF/l1WCHilsuO49VW/CqGFW2Bad
+32YzPkENljj/xuijGOHr1qVFozfG4/noXdVtJm0oflt1ImdjvOO91LneaAhVE8lO
+K5SwOnsrlr6UM0tb/HnunT5Se49YQSGnXOiXO68bPO9S0JZ33MeAP5kSbMSZ6VXr
+luw7dga0jfJLqnWU2arxOqruc9bSwkfU0RUoWXZqrKwUiXdyl/vVeU1Y67yuYqXH
+7eUrdL+BdSDbeOC/5xmWAkeheC4OBBYCcwbVv1Aw67sUaQIcyWMkx8Kq9tn8vpRa
+ETcagVjUXqAjrYtRpmCXU6KdmeGKoQZq14EVREytk0KnTUQTFtv8LJhsau16v4pS
+in7Yt658hdf9CSA5snfUcvLeETNeQHQWvmN+0uD/UB9vRPbHp3kPSvitoS799QB1
+ydrD8zXdUSpcW+V2P75c7u0XkcUTbyGIBuwLAtr5fweyyiKs/v//rPaBlzEG1WUr
+OFSH9KZ+m9UwqmauXesySXoVsmjCQKUVVj4/QI/aWftmMY58CDNJw+q77dAzSYrj
+yFbhUt5ZKqAvb+rt3dJswkZ1sxAbmTw290NAV4NPP8cjXUjLwmU+KNZ2VFkxt77p
+1LxG+Ia+TV1JystBvFeiJ6sWEC3lQ7+0b8oDfE5aovQpGk+Cb7hyt0EvDh0/AkvT
+B/KCQc8wUjyn+yejBicfMzHVaOphwlajrt+vSNF4G7J+Wo5luTEXpWQrKq22xnah
+sal7IusjSgPdFpLCuyAy6atb/4aQoeXlE/r8tXbmrl48SnadwAndoZVt3gzIv1/Z
+oDc5koTBQk6aIoWHb6qslRt9tmrnF22aP+/a10oahgIliWAL3jUwLqZYzdbMKkMv
+NEbobf7kO5LTzv+w09K0A8miF+8js351FBw05gsaUHgufF3OCGAdQfXDN7d6Lxho
+HbhiuzxlHOnth3TWNfqhvNkwFP3gfAIaqlU1Z28AP6pZtUw93QYNABUez8QFZj5c
+sdUpopUO8krnwUPNup6yTB/m72Vx2aSqXgu4upxUNVJlgDFmnCBhOe0KKjzduIvy
+bRHxL93UZxDnpn8DBB1bgmdSzgInc2gfq91j1AyL+nbZv+kob/jG3OxMWNjenVDj
++TeyP3OypAUK/8jP98ExS75mE661mN28kKrUfTRxZGt8CJY4AFL4lAzIf2p4JMch
+aPE30/DmXmKng+VP+3ik5FEomMLIc6QkrEzzcMYQkDsNdjd202CAXRSAqnT+VFtR
+MlopkSVvEpn83HdCqcANl8rNo+ANnFMyyPL7sFd470KhSVTcQVSb+wR8DOiZr8Vt
+uR0G3+KgdEDAvZStkWTCr5eMYhm95QVclnHhsLq0AaLrOm32PqBi2C4mGyW04Mud
+m7lUuRkf/mLKWZZfKleefp12waahMqSXAo3shqyTNVPKOFSVA/UF0mFGon1Npo/x
+6z4hd5sbG1kiPlrt9EeTgtwFhQ0lxM755QTvAB6GXcLxkGkdNdqhJzFtTRAE9P01
+CiI1JYEvTHBdGcsBbw9zJikOEXCA19fAMkHqSfo5aU/qbuvDsY2QLZkgfiMnpoOx
+ghQzeJ95jiYE3V5WNtB/7CRthfC54moWW7w6ZgdIuCEN6JvK0zmsahv2o16kkzWA
+YTw1lqaNMHIhlidRwy2Q+ke0mmNTIHHtNqLGVfOE4TwSN3VIIhXNZ5E65LuBw7tQ
+SyFK07dfMQXixqaeo+ytXBNTFEq1MEza/PxwUojn7njbCKhO5qGavkiyNs5nk3ZE
+htkhtreIUj6kHzWAvylxLbRy9+4AJA3/UCnudMRtX/McjtN2jNwZKPaXWCQF85ff
+koOclVf4j/eYQnWT03zXjAx1DKazIk0laEfB4soXfQfgXdFyj3YKXKKD8WzCW/ag
+cloY4yZVa+SWnj0P23oPdptL9vOM1NK1lXAp2tvvZHPp0UmLtXVU4eNaabC79dXC
+3KU9bVruCdpQki4kGk3MvsoB9OyNEZE1jxLZ+7FI0D1XKJ4qHZcwOyGqD07+Xect
+w2xs4stXxvogUZdQ3G6GBANFXEjDzEu5vZn9z668mCe0cQG/iNWOR5ZGmdjlmW5O
+6O9ibFmk7pc975V9SVHH9rS/GZGz/PW6CJ8O0GALw5y9fczXxjvCz7dPHK5MO40m
+fDWCwIqK1D2LOEewMFqOOleBhHMpVfQX+Uu34UlWHGFnOm1fK+dIdT7tss5o8Gkz
+gCBFpmjyi8H+VtXOy5JTTIi/80pnLO8nsv27FNPVU3UZJCZjfR9LCeqZwgF1MFIe
+X137HnkpmtJGF+bcMRwY5u9fSQQZtBNLCadRsvHnz6J+1uodFDnre0+Q4dokmFfv
+0UveWc1CDRa3qXpzW5U6NpFjYWQmiS3KA5VY5/KHE7UJxnEI1R1gEaQ6/Ogp2cmI
+-----END RSA PRIVATE KEY-----
+)";
+
+auto dhParamsOpenSslDer1024 = R"(-----BEGIN DH PARAMETERS-----
+MIGHAoGBANjw4f5+gu8b8X8O6ALyJA1tH9TQTWZEI3YjUKQ1m0dVBMJ6XDC7FLJn
+gqE4hIGcm1FAWwIiuo0uMufqyVwFT2c+G8j4JHWK5z1tEP+GaqiO34N0cUo86qHp
+THSkJN7LuHbYRqI9fHWDZocW/5yAsDq5RPUCjFZAoh1BWdfDFfrjAgEC
+-----END DH PARAMETERS-----
+)";
+auto dhParamsOpenSslDer2048 = R"(-----BEGIN DH PARAMETERS-----
+MIIBCAKCAQEA0Q6vD5qtrh3XEkVkbN29ord/k3sgo2Q3PiFmyFt89qqVbebEzYmt
+t8DwaFGMcGlyKs4Lb1s7vocm9y3M9C0FZm85Muvv8WCbLZVZ+wfEtMibOjgRoDqt
+p7Qqe7/iPgMVrSjWegVkg3V8K8dnPpohPClM0yOe4NpBjSVNgBVJRpEtH8gFiCor
+H7hw63HpN/MgFdkjZNeCN+erv8p673xH8LrN98gQpkdQ9vCqYt1dHxF2XZcxBp8x
+XganwPeGgQosofkA6nVB70hyjwjEyxnHJZIMlx6DPXWC7X6ed0SazgH0sQNdACvG
+uU1zHCVIv6/f0adKrJg0s1jrM3qWZ6HmUwIBAg==
+-----END DH PARAMETERS-----
+)";
+
+auto createTLSContext = [](TLSContext::Mode mode) {
+ auto tlsFactories = std::make_shared<PlatformTLSFactories>();
+
+ auto tlsContextFactory = tlsFactories->getTLSContextFactory();
+
+ auto tlsContext = std::unique_ptr<TLSContext>(tlsContextFactory->createTLSContext({}, mode));
+ return tlsContext;
+};
+
+// This connects a TLSContext to another TLSContext
+class ClientServerConnector {
+ public:
+ ClientServerConnector(TLSContext* client, TLSContext* server) : clientContext_(client), serverContext_(server) {
+ connections_.push_back(clientContext_->onDataForNetwork.connect([&](const SafeByteArray& data) {
+ serverContext_->handleDataFromNetwork(data);
+ }));
+ connections_.push_back(serverContext_->onDataForNetwork.connect([&](const SafeByteArray& data) {
+ clientContext_->handleDataFromNetwork(data);
+ }));
+ }
+
+ private:
+ TLSContext* clientContext_;
+ TLSContext* serverContext_;
+ std::vector<boost::signals2::connection> connections_;
+};
+
+struct TLSDataForNetwork {
+ SafeByteArray data;
+};
+
+struct TLSDataForApplication {
+ SafeByteArray data;
+};
+
+struct TLSFault {
+ std::shared_ptr<Swift::TLSError> error;
+};
+
+struct TLSConnected {
+ std::vector<Certificate::ref> chain;
+};
+
+struct TLSServerNameRequested {
+ std::string name;
+};
+
+using TLSEvent = boost::variant<TLSDataForNetwork, TLSDataForApplication, TLSFault, TLSConnected, TLSServerNameRequested>;
+
+class TLSEventToSafeByteArrayVisitor : public boost::static_visitor<SafeByteArray> {
+ public:
+ SafeByteArray operator()(const TLSDataForNetwork& tlsData) const {
+ return tlsData.data;
+ }
+
+ SafeByteArray operator()(const TLSDataForApplication& tlsData) const {
+ return tlsData.data;
+ }
+
+ SafeByteArray operator()(const TLSFault&) const {
+ return createSafeByteArray("");
+ }
+
+ SafeByteArray operator()(const TLSConnected&) const {
+ return createSafeByteArray("");
+ }
+
+ SafeByteArray operator()(const TLSServerNameRequested&) const {
+ return createSafeByteArray("");
+ }
+};
+
+class TLSEventToStringVisitor : public boost::static_visitor<std::string> {
+ public:
+ std::string operator()(const TLSDataForNetwork& event) const {
+ return std::string("TLSDataForNetwork(") + "size: " + std::to_string(event.data.size()) + ")";
+ }
+
+ std::string operator()(const TLSDataForApplication& event) const {
+ return std::string("TLSDataForApplication(") + "size: " + std::to_string(event.data.size()) + ")";
+ }
+
+ std::string operator()(const TLSFault&) const {
+ return "TLSFault()";
+ }
+
+ std::string operator()(const TLSConnected& event) const {
+ std::string certificates;
+ for (auto cert : event.chain) {
+ certificates += "\t" + cert->getSubjectName() + "\n";
+ }
+ return std::string("TLSConnected()") + "\n" + certificates;
+ }
+
+ std::string operator()(const TLSServerNameRequested& event) const {
+ return std::string("TLSServerNameRequested(") + "name: " + event.name + ")";
+ }
+};
+
+class TLSClientServerEventHistory {
+ public:
+ TLSClientServerEventHistory(TLSContext* client, TLSContext* server) {
+ connectContext(std::string("client"), client);
+ connectContext(std::string("server"), server);
+ }
+
+ __attribute__((unused))
+ void print() {
+ auto count = 0;
+ std::cout << "\n";
+ for (auto event : events) {
+ if (event.first == "server") {
+ std::cout << std::string(80, ' ');
+ }
+ std::cout << count << ". ";
+ std::cout << event.first << " : " << boost::apply_visitor(TLSEventToStringVisitor(), event.second) << std::endl;
+ count++;
+ }
+ }
+
+ template<class TLSEventType>
+ boost::optional<TLSEventType> getEvent(const std::string& peer, size_t number = 0) {
+ for (const auto& pair : events) {
+ if (pair.first == peer) {
+ if (pair.second.type() == typeid(TLSEventType)) {
+ if (number == 0) {
+ return boost::optional<TLSEventType>(boost::get<TLSEventType>(pair.second));
+ }
+ else {
+ number--;
+ }
+ }
+ }
+ }
+ return {};
+ }
+
+ private:
+ void connectContext(const std::string& name, TLSContext* context) {
+ connections_.push_back(context->onDataForNetwork.connect([=](const SafeByteArray& data) {
+ events.push_back(std::pair<std::string, TLSEvent>(name, TLSDataForNetwork{data}));
+ }));
+ connections_.push_back(context->onDataForApplication.connect([=](const SafeByteArray& data) {
+ events.push_back(std::pair<std::string, TLSEvent>(name, TLSDataForApplication{data}));
+ }));
+ connections_.push_back(context->onError.connect([=](std::shared_ptr<Swift::TLSError> error) {
+ events.push_back(std::pair<std::string, TLSEvent>(name, TLSFault{error}));
+ }));
+ connections_.push_back(context->onConnected.connect([=](){
+ events.push_back(std::pair<std::string, TLSEvent>(name, TLSConnected{context->getPeerCertificateChain()}));
+ }));
+ }
+
+ public:
+ std::vector<std::pair<std::string, TLSEvent>> events;
+
+ private:
+ std::vector<boost::signals2::connection> connections_;
+};
+
+}
+
+TEST(ClientServerTest, testInitAndFreeContext) {
+ auto tlsClientContext = createTLSContext(TLSContext::Mode::Client);
+ auto tlsServerContext = createTLSContext(TLSContext::Mode::Server);
+}
+
+TEST(ClientServerTest, testServerSetPrivateKey) {
+ auto tlsServerContext = createTLSContext(TLSContext::Mode::Server);
+}
+
+TEST(ClientServerTest, testServerSetCertificateChain) {
+ auto tlsServerContext = createTLSContext(TLSContext::Mode::Server);
+}
+
+TEST(ClientServerTest, testClientServerBasicCommunicationWithCertificateMissing) {
+ auto clientContext = createTLSContext(TLSContext::Mode::Client);
+ auto serverContext = createTLSContext(TLSContext::Mode::Server);
+
+ TLSClientServerEventHistory events(clientContext.get(), serverContext.get());
+
+ ClientServerConnector connector(clientContext.get(), serverContext.get());
+
+ auto tlsFactories = std::make_shared<PlatformTLSFactories>();
+
+ auto privateKey = tlsFactories->getCertificateFactory()->createPrivateKey(createSafeByteArray(privateKeyPEM["capulet.example"]));
+ ASSERT_NE(nullptr, privateKey.get());
+ ASSERT_EQ(true, serverContext->setPrivateKey(privateKey));
+
+ serverContext->accept();
+ clientContext->connect();
+
+ ASSERT_EQ("server", events.events[1].first);
+ ASSERT_EQ("TLSFault()", boost::apply_visitor(TLSEventToStringVisitor(), events.events[1].second));
+}
+
+TEST(ClientServerTest, testClientServerBasicCommunicationWithPrivateKeyMissing) {
+ auto clientContext = createTLSContext(TLSContext::Mode::Client);
+ auto serverContext = createTLSContext(TLSContext::Mode::Server);
+
+ TLSClientServerEventHistory events(clientContext.get(), serverContext.get());
+
+ ClientServerConnector connector(clientContext.get(), serverContext.get());
+
+ auto tlsFactories = std::make_shared<PlatformTLSFactories>();
+
+ ASSERT_EQ(true, serverContext->setCertificateChain(tlsFactories->getCertificateFactory()->createCertificateChain(createByteArray(certificatePEM["capulet.example"]))));
+
+ serverContext->accept();
+ clientContext->connect();
+
+ ASSERT_EQ("server", events.events[1].first);
+ ASSERT_EQ("TLSFault()", boost::apply_visitor(TLSEventToStringVisitor(), events.events[1].second));
+}
+
+TEST(ClientServerTest, testWrongPrivateKeyAfterCertificate) {
+ auto clientContext = createTLSContext(TLSContext::Mode::Client);
+ auto serverContext = createTLSContext(TLSContext::Mode::Server);
+
+ TLSClientServerEventHistory events(clientContext.get(), serverContext.get());
+
+ ClientServerConnector connector(clientContext.get(), serverContext.get());
+
+ auto tlsFactories = std::make_shared<PlatformTLSFactories>();
+
+ ASSERT_EQ(true, serverContext->setCertificateChain(tlsFactories->getCertificateFactory()->createCertificateChain(createByteArray(certificatePEM["capulet.example"]))));
+
+ auto privateKey = tlsFactories->getCertificateFactory()->createPrivateKey(createSafeByteArray(privateKeyPEM["montague.example"]));
+ ASSERT_NE(nullptr, privateKey.get());
+ ASSERT_EQ(false, serverContext->setPrivateKey(privateKey));
+
+ serverContext->accept();
+ clientContext->connect();
+}
+
+TEST(ClientServerTest, testWrongCertificateAfterPrivateKey) {
+ auto clientContext = createTLSContext(TLSContext::Mode::Client);
+ auto serverContext = createTLSContext(TLSContext::Mode::Server);
+
+ TLSClientServerEventHistory events(clientContext.get(), serverContext.get());
+
+ ClientServerConnector connector(clientContext.get(), serverContext.get());
+
+ auto tlsFactories = std::make_shared<PlatformTLSFactories>();
+
+ auto privateKey = tlsFactories->getCertificateFactory()->createPrivateKey(createSafeByteArray(privateKeyPEM["montague.example"]));
+ ASSERT_NE(nullptr, privateKey.get());
+ ASSERT_EQ(true, serverContext->setPrivateKey(privateKey));
+
+ ASSERT_EQ(true, serverContext->setCertificateChain(tlsFactories->getCertificateFactory()->createCertificateChain(createByteArray(certificatePEM["capulet.example"]))));
+
+ serverContext->accept();
+ clientContext->connect();
+
+ ASSERT_EQ("server", events.events[1].first);
+ ASSERT_EQ("TLSFault()", boost::apply_visitor(TLSEventToStringVisitor(), events.events[1].second));
+}
+
+TEST(ClientServerTest, testClientServerBasicCommunication) {
+ auto clientContext = createTLSContext(TLSContext::Mode::Client);
+ auto serverContext = createTLSContext(TLSContext::Mode::Server);
+
+ TLSClientServerEventHistory events(clientContext.get(), serverContext.get());
+
+ ClientServerConnector connector(clientContext.get(), serverContext.get());
+
+ auto tlsFactories = std::make_shared<PlatformTLSFactories>();
+
+ ASSERT_EQ(true, serverContext->setCertificateChain(tlsFactories->getCertificateFactory()->createCertificateChain(createByteArray(certificatePEM["capulet.example"]))));
+
+ auto privateKey = tlsFactories->getCertificateFactory()->createPrivateKey(createSafeByteArray(privateKeyPEM["capulet.example"]));
+ ASSERT_NE(nullptr, privateKey.get());
+ ASSERT_EQ(true, serverContext->setPrivateKey(privateKey));
+
+ serverContext->accept();
+ clientContext->connect();
+
+ clientContext->handleDataFromApplication(createSafeByteArray("This is a test message from the client."));
+ serverContext->handleDataFromApplication(createSafeByteArray("This is a test message from the server."));
+
+ auto firstMessageFromClient = events.getEvent<TLSDataForApplication>("server");
+ ASSERT_EQ(true, firstMessageFromClient.is_initialized());
+ ASSERT_EQ(safeByteArrayToString(createSafeByteArray("This is a test message from the client.")), safeByteArrayToString(firstMessageFromClient->data));
+ auto firstMessageFromServer = events.getEvent<TLSDataForApplication>("client");
+ ASSERT_EQ(true, firstMessageFromServer.is_initialized());
+ ASSERT_EQ(safeByteArrayToString(createSafeByteArray("This is a test message from the server.")), safeByteArrayToString(firstMessageFromServer->data));
+}
+
+TEST(ClientServerTest, testClientServerBasicCommunicationEncryptedPrivateKeyRightPassword) {
+ auto clientContext = createTLSContext(TLSContext::Mode::Client);
+ auto serverContext = createTLSContext(TLSContext::Mode::Server);
+
+ TLSClientServerEventHistory events(clientContext.get(), serverContext.get());
+
+ ClientServerConnector connector(clientContext.get(), serverContext.get());
+
+ auto tlsFactories = std::make_shared<PlatformTLSFactories>();
+
+ ASSERT_EQ(true, serverContext->setCertificateChain(tlsFactories->getCertificateFactory()->createCertificateChain(createByteArray(certificatePEM["montague.example"]))));
+
+ auto privateKey = tlsFactories->getCertificateFactory()->createPrivateKey(createSafeByteArray(montagueEncryptedPEM), createSafeByteArray("test"));
+ ASSERT_NE(nullptr, privateKey.get());
+ ASSERT_EQ(true, serverContext->setPrivateKey(privateKey));
+
+ serverContext->accept();
+ clientContext->connect();
+
+ clientContext->handleDataFromApplication(createSafeByteArray("This is a test message from the client."));
+ serverContext->handleDataFromApplication(createSafeByteArray("This is a test message from the server."));
+
+ auto firstMessageFromClient = events.getEvent<TLSDataForApplication>("server");
+ ASSERT_EQ(true, firstMessageFromClient.is_initialized());
+ ASSERT_EQ(safeByteArrayToString(createSafeByteArray("This is a test message from the client.")), safeByteArrayToString(firstMessageFromClient->data));
+ auto firstMessageFromServer = events.getEvent<TLSDataForApplication>("client");
+ ASSERT_EQ(true, firstMessageFromServer.is_initialized());
+ ASSERT_EQ(safeByteArrayToString(createSafeByteArray("This is a test message from the server.")), safeByteArrayToString(firstMessageFromServer->data));
+}
+
+TEST(ClientServerTest, testClientServerBasicCommunicationWithChainedCert) {
+ auto clientContext = createTLSContext(TLSContext::Mode::Client);
+ auto serverContext = createTLSContext(TLSContext::Mode::Server);
+
+ TLSClientServerEventHistory events(clientContext.get(), serverContext.get());
+
+ ClientServerConnector connector(clientContext.get(), serverContext.get());
+
+ auto tlsFactories = std::make_shared<PlatformTLSFactories>();
+
+ ASSERT_TRUE(serverContext->setCertificateChain(tlsFactories->getCertificateFactory()->createCertificateChain(createByteArray(certificatePEM["casigned.example.com"]))));
+
+ auto privateKey = tlsFactories->getCertificateFactory()->createPrivateKey(createSafeByteArray(privateKeyPEM["casigned.example.com"]));
+ ASSERT_NE(nullptr, privateKey.get());
+ ASSERT_TRUE(serverContext->setPrivateKey(privateKey));
+
+ serverContext->accept();
+ clientContext->connect();
+
+ clientContext->handleDataFromApplication(createSafeByteArray("This is a test message from the client."));
+ serverContext->handleDataFromApplication(createSafeByteArray("This is a test message from the server."));
+
+ auto serverEvent = std::find_if(events.events.begin(), events.events.end(), [](std::pair<std::string, TLSEvent>& event){
+ return event.first == "server" && (event.second.type() == typeid(TLSDataForApplication));
+ });
+ ASSERT_NE(events.events.end(), serverEvent);
+ ASSERT_EQ(safeByteArrayToString(createSafeByteArray("This is a test message from the client.")), safeByteArrayToString(boost::apply_visitor(TLSEventToSafeByteArrayVisitor(), serverEvent->second)));
+ auto clientEvent = std::find_if(events.events.begin(), events.events.end(), [](std::pair<std::string, TLSEvent>& event){
+ return event.first == "client" && (event.second.type() == typeid(TLSDataForApplication));
+ });
+ ASSERT_NE(events.events.end(), clientEvent);
+ ASSERT_EQ(safeByteArrayToString(createSafeByteArray("This is a test message from the server.")), safeByteArrayToString(boost::apply_visitor(TLSEventToSafeByteArrayVisitor(), clientEvent->second)));
+}
+
+TEST(ClientServerTest, testSettingPrivateKeyWithWrongPassword) {
+ auto clientContext = createTLSContext(TLSContext::Mode::Client);
+ auto serverContext = createTLSContext(TLSContext::Mode::Server);
+
+ TLSClientServerEventHistory events(clientContext.get(), serverContext.get());
+
+ ClientServerConnector connector(clientContext.get(), serverContext.get());
+
+ auto tlsFactories = std::make_shared<PlatformTLSFactories>();
+
+ ASSERT_EQ(true, serverContext->setCertificateChain(tlsFactories->getCertificateFactory()->createCertificateChain(createByteArray(certificatePEM["montague.example"]))));
+
+ auto privateKey = tlsFactories->getCertificateFactory()->createPrivateKey(createSafeByteArray(montagueEncryptedPEM), createSafeByteArray("foo"));
+ ASSERT_NE(nullptr, privateKey.get());
+ ASSERT_EQ(false, serverContext->setPrivateKey(privateKey));
+}
+
+TEST(ClientServerTest, testSettingPrivateKeyWithoutRequiredPassword) {
+ auto clientContext = createTLSContext(TLSContext::Mode::Client);
+ auto serverContext = createTLSContext(TLSContext::Mode::Server);
+
+ TLSClientServerEventHistory events(clientContext.get(), serverContext.get());
+
+ ClientServerConnector connector(clientContext.get(), serverContext.get());
+
+ auto tlsFactories = std::make_shared<PlatformTLSFactories>();
+
+ ASSERT_EQ(true, serverContext->setCertificateChain(tlsFactories->getCertificateFactory()->createCertificateChain(createByteArray(certificatePEM["montague.example"]))));
+
+ auto privateKey = tlsFactories->getCertificateFactory()->createPrivateKey(createSafeByteArray(montagueEncryptedPEM));
+ ASSERT_NE(nullptr, privateKey.get());
+ ASSERT_EQ(false, serverContext->setPrivateKey(privateKey));
+}
+
+TEST(ClientServerTest, testClientServerSNIRequestedHostAvailable) {
+ auto tlsFactories = std::make_shared<PlatformTLSFactories>();
+ auto clientContext = createTLSContext(TLSContext::Mode::Client);
+ auto serverContext = createTLSContext(TLSContext::Mode::Server);
+
+ serverContext->onServerNameRequested.connect([&](const std::string& requestedName) {
+ if (certificatePEM.find(requestedName) != certificatePEM.end() && privateKeyPEM.find(requestedName) != privateKeyPEM.end()) {
+ auto certChain = tlsFactories->getCertificateFactory()->createCertificateChain(createByteArray(certificatePEM[requestedName]));
+ ASSERT_EQ(true, serverContext->setCertificateChain(std::move(certChain)));
+
+ auto privateKey = tlsFactories->getCertificateFactory()->createPrivateKey(createSafeByteArray(privateKeyPEM[requestedName]));
+ ASSERT_NE(nullptr, privateKey.get());
+ ASSERT_EQ(true, serverContext->setPrivateKey(privateKey));
+ }
+ });
+
+ TLSClientServerEventHistory events(clientContext.get(), serverContext.get());
+
+ ClientServerConnector connector(clientContext.get(), serverContext.get());
+
+ ASSERT_EQ(true, serverContext->setCertificateChain(tlsFactories->getCertificateFactory()->createCertificateChain(createByteArray(certificatePEM["capulet.example"]))));
+
+ auto privateKey = tlsFactories->getCertificateFactory()->createPrivateKey(createSafeByteArray(privateKeyPEM["capulet.example"]));
+ ASSERT_NE(nullptr, privateKey.get());
+ ASSERT_EQ(true, serverContext->setPrivateKey(privateKey));
+
+ serverContext->accept();
+ clientContext->connect("montague.example");
+
+ clientContext->handleDataFromApplication(createSafeByteArray("This is a test message from the client."));
+ serverContext->handleDataFromApplication(createSafeByteArray("This is a test message from the server."));
+
+ auto firstMessageFromClient = events.getEvent<TLSDataForApplication>("server");
+ ASSERT_EQ(true, firstMessageFromClient.is_initialized());
+ ASSERT_EQ(safeByteArrayToString(createSafeByteArray("This is a test message from the client.")), safeByteArrayToString(firstMessageFromClient->data));
+ auto firstMessageFromServer = events.getEvent<TLSDataForApplication>("client");
+ ASSERT_EQ(true, firstMessageFromServer.is_initialized());
+ ASSERT_EQ(safeByteArrayToString(createSafeByteArray("This is a test message from the server.")), safeByteArrayToString(firstMessageFromServer->data));
+
+ ASSERT_EQ("/CN=montague.example", events.getEvent<TLSConnected>("client")->chain[0]->getSubjectName());
+}
+
+TEST(ClientServerTest, testClientServerSNIRequestedHostUnavailable) {
+ auto tlsFactories = std::make_shared<PlatformTLSFactories>();
+ auto clientContext = createTLSContext(TLSContext::Mode::Client);
+ auto serverContext = createTLSContext(TLSContext::Mode::Server);
+
+ serverContext->onServerNameRequested.connect([&](const std::string&) {
+ serverContext->setAbortTLSHandshake(true);
+ });
+
+ TLSClientServerEventHistory events(clientContext.get(), serverContext.get());
+
+ ClientServerConnector connector(clientContext.get(), serverContext.get());
+
+ ASSERT_EQ(true, serverContext->setCertificateChain(tlsFactories->getCertificateFactory()->createCertificateChain(createByteArray(certificatePEM["capulet.example"]))));
+
+ auto privateKey = tlsFactories->getCertificateFactory()->createPrivateKey(createSafeByteArray(privateKeyPEM["capulet.example"]));
+ ASSERT_NE(nullptr, privateKey.get());
+ ASSERT_EQ(true, serverContext->setPrivateKey(privateKey));
+
+ serverContext->accept();
+ clientContext->connect("montague.example");
+
+ ASSERT_EQ("server", events.events[1].first);
+ ASSERT_EQ("TLSFault()", boost::apply_visitor(TLSEventToStringVisitor(), events.events[1].second));
+
+ ASSERT_EQ("client", events.events[3].first);
+ ASSERT_EQ("TLSFault()", boost::apply_visitor(TLSEventToStringVisitor(), events.events[3].second));
+}
+
+TEST(ClientServerTest, testClientServerEqualFinishedMessage) {
+ auto clientContext = createTLSContext(TLSContext::Mode::Client);
+ auto serverContext = createTLSContext(TLSContext::Mode::Server);
+
+ TLSClientServerEventHistory events(clientContext.get(), serverContext.get());
+
+ ClientServerConnector connector(clientContext.get(), serverContext.get());
+
+ auto tlsFactories = std::make_shared<PlatformTLSFactories>();
+
+ ASSERT_EQ(true, serverContext->setCertificateChain(tlsFactories->getCertificateFactory()->createCertificateChain(createByteArray(certificatePEM["capulet.example"]))));
+
+ auto privateKey = tlsFactories->getCertificateFactory()->createPrivateKey(createSafeByteArray(privateKeyPEM["capulet.example"]));
+ ASSERT_NE(nullptr, privateKey.get());
+ ASSERT_EQ(true, serverContext->setPrivateKey(privateKey));
+
+ serverContext->accept();
+ clientContext->connect();
+
+ ASSERT_EQ(serverContext->getPeerFinishMessage(), clientContext->getFinishMessage());
+ ASSERT_EQ(clientContext->getPeerFinishMessage(), serverContext->getFinishMessage());
+}
+
+TEST(ClientServerTest, testClientServerBasicCommunicationWith2048BitDHParams) {
+ auto clientContext = createTLSContext(TLSContext::Mode::Client);
+ auto serverContext = createTLSContext(TLSContext::Mode::Server);
+
+ TLSClientServerEventHistory events(clientContext.get(), serverContext.get());
+
+ ClientServerConnector connector(clientContext.get(), serverContext.get());
+
+ auto tlsFactories = std::make_shared<PlatformTLSFactories>();
+
+ ASSERT_EQ(true, serverContext->setCertificateChain(tlsFactories->getCertificateFactory()->createCertificateChain(createByteArray(certificatePEM["capulet.example"]))));
+
+ auto privateKey = tlsFactories->getCertificateFactory()->createPrivateKey(createSafeByteArray(privateKeyPEM["capulet.example"]));
+ ASSERT_NE(nullptr, privateKey.get());
+ ASSERT_EQ(true, serverContext->setPrivateKey(privateKey));
+
+ ASSERT_EQ(true, serverContext->setDiffieHellmanParameters(tlsFactories->getTLSContextFactory()->convertDHParametersFromPEMToDER(dhParamsOpenSslDer2048)));
+
+ serverContext->accept();
+ clientContext->connect();
+
+ clientContext->handleDataFromApplication(createSafeByteArray("This is a test message from the client."));
+ serverContext->handleDataFromApplication(createSafeByteArray("This is a test message from the server."));
+
+ auto firstMessageFromClient = events.getEvent<TLSDataForApplication>("server");
+ ASSERT_EQ(true, firstMessageFromClient.is_initialized());
+ ASSERT_EQ(safeByteArrayToString(createSafeByteArray("This is a test message from the client.")), safeByteArrayToString(firstMessageFromClient->data));
+ auto firstMessageFromServer = events.getEvent<TLSDataForApplication>("client");
+ ASSERT_EQ(true, firstMessageFromServer.is_initialized());
+ ASSERT_EQ(safeByteArrayToString(createSafeByteArray("This is a test message from the server.")), safeByteArrayToString(firstMessageFromServer->data));
+}
+
+TEST(ClientServerTest, testClientServerBasicCommunicationWith1024BitDHParams) {
+ auto clientContext = createTLSContext(TLSContext::Mode::Client);
+ auto serverContext = createTLSContext(TLSContext::Mode::Server);
+
+ TLSClientServerEventHistory events(clientContext.get(), serverContext.get());
+
+ ClientServerConnector connector(clientContext.get(), serverContext.get());
+
+ auto tlsFactories = std::make_shared<PlatformTLSFactories>();
+
+ ASSERT_EQ(true, serverContext->setCertificateChain(tlsFactories->getCertificateFactory()->createCertificateChain(createByteArray(certificatePEM["capulet.example"]))));
+
+ auto privateKey = tlsFactories->getCertificateFactory()->createPrivateKey(createSafeByteArray(privateKeyPEM["capulet.example"]));
+ ASSERT_NE(nullptr, privateKey.get());
+ ASSERT_EQ(true, serverContext->setPrivateKey(privateKey));
+
+ ASSERT_EQ(true, serverContext->setDiffieHellmanParameters(tlsFactories->getTLSContextFactory()->convertDHParametersFromPEMToDER(dhParamsOpenSslDer1024)));
+
+ serverContext->accept();
+ clientContext->connect();
+
+ clientContext->handleDataFromApplication(createSafeByteArray("This is a test message from the client."));
+ serverContext->handleDataFromApplication(createSafeByteArray("This is a test message from the server."));
+
+ auto firstMessageFromClient = events.getEvent<TLSDataForApplication>("server");
+ ASSERT_EQ(true, firstMessageFromClient.is_initialized());
+ ASSERT_EQ(safeByteArrayToString(createSafeByteArray("This is a test message from the client.")), safeByteArrayToString(firstMessageFromClient->data));
+ auto firstMessageFromServer = events.getEvent<TLSDataForApplication>("client");
+ ASSERT_EQ(true, firstMessageFromServer.is_initialized());
+ ASSERT_EQ(safeByteArrayToString(createSafeByteArray("This is a test message from the server.")), safeByteArrayToString(firstMessageFromServer->data));
+}
diff --git a/Swiften/TLS/UnitTest/ServerIdentityVerifierTest.cpp b/Swiften/TLS/UnitTest/ServerIdentityVerifierTest.cpp
index 30fe423..47f3db2 100644
--- a/Swiften/TLS/UnitTest/ServerIdentityVerifierTest.cpp
+++ b/Swiften/TLS/UnitTest/ServerIdentityVerifierTest.cpp
@@ -35,6 +35,8 @@ class ServerIdentityVerifierTest : public CppUnit::TestFixture {
CPPUNIT_TEST(testCertificateVerifies_WithMatchingInternationalXmppAddr);
CPPUNIT_TEST(testCertificateVerifies_WithMatchingCNWithoutSAN);
CPPUNIT_TEST(testCertificateVerifies_WithMatchingCNWithSAN);
+ CPPUNIT_TEST(testCertificateVerifies_WithMatchingSRVNameWithServerExpected);
+ CPPUNIT_TEST(testCertificateVerifies_WithMatchingSRVNameWithClientUnexpected);
CPPUNIT_TEST_SUITE_END();
public:
@@ -58,6 +60,14 @@ class ServerIdentityVerifierTest : public CppUnit::TestFixture {
CPPUNIT_ASSERT(testling.certificateVerifies(certificate));
}
+ void testCertificateVerifies_WithMatchingDNSNameMixedCase() {
+ ServerIdentityVerifier testling(JID("foo@baR.com/baz"), idnConverter.get());
+ SimpleCertificate::ref certificate(new SimpleCertificate());
+ certificate->addDNSName("Bar.com");
+
+ CPPUNIT_ASSERT(testling.certificateVerifies(certificate));
+ }
+
void testCertificateVerifies_WithSecondMatchingDNSName() {
ServerIdentityVerifier testling(JID("foo@bar.com/baz"), idnConverter.get());
SimpleCertificate::ref certificate(new SimpleCertificate());
@@ -131,6 +141,24 @@ class ServerIdentityVerifierTest : public CppUnit::TestFixture {
CPPUNIT_ASSERT(!testling.certificateVerifies(certificate));
}
+ void testCertificateVerifies_WithMatchingSRVNameWithServerExpected() {
+ // Server-mode test which gets cert with "xmpp-server" SRV name
+ ServerIdentityVerifier testling(JID("foo@bar.com/baz"), idnConverter.get(), true);
+ SimpleCertificate::ref certificate(new SimpleCertificate());
+ certificate->addSRVName("_xmpp-server.bar.com");
+
+ CPPUNIT_ASSERT(testling.certificateVerifies(certificate));
+ }
+
+ void testCertificateVerifies_WithMatchingSRVNameWithClientUnexpected() {
+ // Server-mode test which gets cert with "xmpp-client" SRV name
+ ServerIdentityVerifier testling(JID("foo@bar.com/baz"), idnConverter.get(), true);
+ SimpleCertificate::ref certificate(new SimpleCertificate());
+ certificate->addSRVName("_xmpp-client.bar.com");
+
+ CPPUNIT_ASSERT(!testling.certificateVerifies(certificate));
+ }
+
void testCertificateVerifies_WithMatchingXmppAddr() {
ServerIdentityVerifier testling(JID("foo@bar.com/baz"), idnConverter.get());
SimpleCertificate::ref certificate(new SimpleCertificate());
@@ -139,6 +167,14 @@ class ServerIdentityVerifierTest : public CppUnit::TestFixture {
CPPUNIT_ASSERT(testling.certificateVerifies(certificate));
}
+ void testCertificateVerifies_WithMatchingXmppAddrMixedCase() {
+ ServerIdentityVerifier testling(JID("foo@baR.com/baz"), idnConverter.get());
+ SimpleCertificate::ref certificate(new SimpleCertificate());
+ certificate->addXMPPAddress("bAr.com");
+
+ CPPUNIT_ASSERT(testling.certificateVerifies(certificate));
+ }
+
void testCertificateVerifies_WithMatchingXmppAddrWithWildcard() {
ServerIdentityVerifier testling(JID("foo@im.bar.com/baz"), idnConverter.get());
SimpleCertificate::ref certificate(new SimpleCertificate());
@@ -147,6 +183,14 @@ class ServerIdentityVerifierTest : public CppUnit::TestFixture {
CPPUNIT_ASSERT(!testling.certificateVerifies(certificate));
}
+ void testCertificateVerifies_WithMatchingXmppAddrWithWildcardMixedCase() {
+ ServerIdentityVerifier testling(JID("foo@im.bAr.com/baz"), idnConverter.get());
+ SimpleCertificate::ref certificate(new SimpleCertificate());
+ certificate->addXMPPAddress("*.baR.com");
+
+ CPPUNIT_ASSERT(!testling.certificateVerifies(certificate));
+ }
+
void testCertificateVerifies_WithMatchingInternationalXmppAddr() {
ServerIdentityVerifier testling(JID("foo@tron\xc3\xa7.com/baz"), idnConverter.get());
SimpleCertificate::ref certificate(new SimpleCertificate());
@@ -155,6 +199,14 @@ class ServerIdentityVerifierTest : public CppUnit::TestFixture {
CPPUNIT_ASSERT(testling.certificateVerifies(certificate));
}
+ void testCertificateVerifies_WithMatchingInternationalXmppAddrMixedCase() {
+ ServerIdentityVerifier testling(JID("foo@tRon\xc3\xa7.com/baz"), idnConverter.get());
+ SimpleCertificate::ref certificate(new SimpleCertificate());
+ certificate->addXMPPAddress("trOn\xc3\xa7.com");
+
+ CPPUNIT_ASSERT(testling.certificateVerifies(certificate));
+ }
+
void testCertificateVerifies_WithMatchingCNWithoutSAN() {
ServerIdentityVerifier testling(JID("foo@bar.com/baz"), idnConverter.get());
SimpleCertificate::ref certificate(new SimpleCertificate());
diff --git a/Swiften/VCards/UnitTest/VCardManagerTest.cpp b/Swiften/VCards/UnitTest/VCardManagerTest.cpp
index 3d5338d..669c3ff 100644
--- a/Swiften/VCards/UnitTest/VCardManagerTest.cpp
+++ b/Swiften/VCards/UnitTest/VCardManagerTest.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -31,7 +31,17 @@ class VCardManagerTest : public CppUnit::TestFixture {
CPPUNIT_TEST(testRequest_Error);
CPPUNIT_TEST(testRequest_VCardAlreadyRequested);
CPPUNIT_TEST(testRequest_AfterPreviousRequest);
- CPPUNIT_TEST(testRequestOwnVCard);
+
+ CPPUNIT_TEST(testRequestVCard_ReturnFullVCard);
+ CPPUNIT_TEST(testRequestVCard_ReturnEmptyVCard);
+ CPPUNIT_TEST(testRequestVCard_ReturnItemNotFoundError);
+ CPPUNIT_TEST(testRequestVCard_ReturnFeatureNotImplementedError);
+
+ CPPUNIT_TEST(testRequestOwnVCard_ReturnFullVCard);
+ CPPUNIT_TEST(testRequestOwnVCard_ReturnEmptyVCard);
+ CPPUNIT_TEST(testRequestOwnVCard_ReturnItemNotFoundError);
+ CPPUNIT_TEST(testRequestOwnVCard_ReturnFeatureNotImplementedError);
+
CPPUNIT_TEST(testCreateSetVCardRequest);
CPPUNIT_TEST(testCreateSetVCardRequest_Error);
CPPUNIT_TEST_SUITE_END();
@@ -54,7 +64,7 @@ class VCardManagerTest : public CppUnit::TestFixture {
}
void testGet_NewVCardRequestsVCard() {
- std::shared_ptr<VCardManager> testling = createManager();
+ auto testling = createManager();
VCard::ref result = testling->getVCardAndRequestWhenNeeded(JID("foo@bar.com/baz"));
CPPUNIT_ASSERT(!result);
@@ -63,7 +73,7 @@ class VCardManagerTest : public CppUnit::TestFixture {
}
void testGet_ExistingVCard() {
- std::shared_ptr<VCardManager> testling = createManager();
+ auto testling = createManager();
VCard::ref vcard(new VCard());
vcard->setFullName("Foo Bar");
vcardStorage->setVCard(JID("foo@bar.com/baz"), vcard);
@@ -75,7 +85,7 @@ class VCardManagerTest : public CppUnit::TestFixture {
}
void testRequest_RequestsVCard() {
- std::shared_ptr<VCardManager> testling = createManager();
+ auto testling = createManager();
testling->requestVCard(JID("foo@bar.com/baz"));
CPPUNIT_ASSERT_EQUAL(1, static_cast<int>(stanzaChannel->sentStanzas.size()));
@@ -83,7 +93,7 @@ class VCardManagerTest : public CppUnit::TestFixture {
}
void testRequest_ReceiveEmitsNotification() {
- std::shared_ptr<VCardManager> testling = createManager();
+ auto testling = createManager();
testling->requestVCard(JID("foo@bar.com/baz"));
stanzaChannel->onIQReceived(createVCardResult());
@@ -96,7 +106,7 @@ class VCardManagerTest : public CppUnit::TestFixture {
}
void testRequest_Error() {
- std::shared_ptr<VCardManager> testling = createManager();
+ auto testling = createManager();
testling->requestVCard(JID("foo@bar.com/baz"));
stanzaChannel->onIQReceived(IQ::createError(JID("baz@fum.com/foo"), stanzaChannel->sentStanzas[0]->getTo(), stanzaChannel->sentStanzas[0]->getID()));
@@ -105,7 +115,7 @@ class VCardManagerTest : public CppUnit::TestFixture {
}
void testRequest_VCardAlreadyRequested() {
- std::shared_ptr<VCardManager> testling = createManager();
+ auto testling = createManager();
testling->requestVCard(JID("foo@bar.com/baz"));
VCard::ref result = testling->getVCardAndRequestWhenNeeded(JID("foo@bar.com/baz"));
@@ -114,7 +124,7 @@ class VCardManagerTest : public CppUnit::TestFixture {
}
void testRequest_AfterPreviousRequest() {
- std::shared_ptr<VCardManager> testling = createManager();
+ auto testling = createManager();
testling->requestVCard(JID("foo@bar.com/baz"));
stanzaChannel->onIQReceived(createVCardResult());
testling->requestVCard(JID("foo@bar.com/baz"));
@@ -123,8 +133,60 @@ class VCardManagerTest : public CppUnit::TestFixture {
CPPUNIT_ASSERT(stanzaChannel->isRequestAtIndex<VCard>(1, JID("foo@bar.com/baz"), IQ::Get));
}
- void testRequestOwnVCard() {
- std::shared_ptr<VCardManager> testling = createManager();
+ void testRequestVCard_ReturnFullVCard() {
+ auto testling = createManager();
+ testling->requestVCard(JID("foo@bar.com/baz"));
+ stanzaChannel->onIQReceived(createVCardResult());
+
+ CPPUNIT_ASSERT_EQUAL(1, static_cast<int>(stanzaChannel->sentStanzas.size()));
+ CPPUNIT_ASSERT(stanzaChannel->isRequestAtIndex<VCard>(0, JID("foo@bar.com/baz"), IQ::Get));
+ CPPUNIT_ASSERT_EQUAL(1, static_cast<int>(changes.size()));
+ CPPUNIT_ASSERT_EQUAL(JID("foo@bar.com/baz"), changes[0].first);
+ CPPUNIT_ASSERT_EQUAL(std::string("Foo Bar"), changes[0].second->getFullName());
+ CPPUNIT_ASSERT_EQUAL(false, changes[0].second->isEmpty());
+ }
+
+ void testRequestVCard_ReturnEmptyVCard() {
+ auto testling = createManager();
+ testling->requestVCard(JID("foo@bar.com/baz"));
+ stanzaChannel->onIQReceived([&](){
+ auto vcard = std::make_shared<VCard>();
+ return IQ::createResult(JID("foo@bar.com/baz"), stanzaChannel->sentStanzas[0]->getTo(), stanzaChannel->sentStanzas[0]->getID(), vcard);
+ }());
+
+ CPPUNIT_ASSERT_EQUAL(1, static_cast<int>(stanzaChannel->sentStanzas.size()));
+ CPPUNIT_ASSERT(stanzaChannel->isRequestAtIndex<VCard>(0, JID("foo@bar.com/baz"), IQ::Get));
+ CPPUNIT_ASSERT_EQUAL(1, static_cast<int>(changes.size()));
+ CPPUNIT_ASSERT_EQUAL(true, changes[0].second->isEmpty());
+ }
+
+ void testRequestVCard_ReturnItemNotFoundError() {
+ auto testling = createManager();
+ testling->requestVCard(JID("foo@bar.com/baz"));
+ stanzaChannel->onIQReceived([&](){
+ return IQ::createError(JID("foo@bar.com/baz"), stanzaChannel->sentStanzas[0]->getTo(), stanzaChannel->sentStanzas[0]->getID(), ErrorPayload::ItemNotFound);
+ }());
+
+ CPPUNIT_ASSERT_EQUAL(1, static_cast<int>(stanzaChannel->sentStanzas.size()));
+ CPPUNIT_ASSERT(stanzaChannel->isRequestAtIndex<VCard>(0, JID("foo@bar.com/baz"), IQ::Get));
+ CPPUNIT_ASSERT_EQUAL(1, static_cast<int>(changes.size()));
+ CPPUNIT_ASSERT_EQUAL(true, changes[0].second->isEmpty());
+ }
+
+ void testRequestVCard_ReturnFeatureNotImplementedError() {
+ auto testling = createManager();
+ testling->requestVCard(JID("foo@bar.com/baz"));
+ stanzaChannel->onIQReceived([&](){
+ return IQ::createError(JID("foo@bar.com/baz"), stanzaChannel->sentStanzas[0]->getTo(), stanzaChannel->sentStanzas[0]->getID(), ErrorPayload::FeatureNotImplemented);
+ }());
+
+ CPPUNIT_ASSERT_EQUAL(1, static_cast<int>(stanzaChannel->sentStanzas.size()));
+ CPPUNIT_ASSERT(stanzaChannel->isRequestAtIndex<VCard>(0, JID("foo@bar.com/baz"), IQ::Get));
+ CPPUNIT_ASSERT_EQUAL(0, static_cast<int>(changes.size()));
+ }
+
+ void testRequestOwnVCard_ReturnFullVCard() {
+ auto testling = createManager();
testling->requestVCard(ownJID);
stanzaChannel->onIQReceived(createOwnVCardResult());
@@ -139,8 +201,47 @@ class VCardManagerTest : public CppUnit::TestFixture {
CPPUNIT_ASSERT_EQUAL(std::string("Myself"), ownChanges[0]->getFullName());
}
+ void testRequestOwnVCard_ReturnEmptyVCard() {
+ auto testling = createManager();
+ testling->requestVCard(ownJID);
+ stanzaChannel->onIQReceived([&](){
+ auto vcard = std::make_shared<VCard>();
+ return IQ::createResult(JID(), stanzaChannel->sentStanzas[0]->getTo(), stanzaChannel->sentStanzas[0]->getID(), vcard);
+ }());
+
+ CPPUNIT_ASSERT_EQUAL(1, static_cast<int>(stanzaChannel->sentStanzas.size()));
+ CPPUNIT_ASSERT(stanzaChannel->isRequestAtIndex<VCard>(0, JID(), IQ::Get));
+ CPPUNIT_ASSERT_EQUAL(1, static_cast<int>(changes.size()));
+ CPPUNIT_ASSERT_EQUAL(true, changes[0].second->isEmpty());
+ }
+
+ void testRequestOwnVCard_ReturnItemNotFoundError() {
+ auto testling = createManager();
+ testling->requestVCard(ownJID);
+ stanzaChannel->onIQReceived([&](){
+ return IQ::createError(JID(), stanzaChannel->sentStanzas[0]->getTo(), stanzaChannel->sentStanzas[0]->getID(), ErrorPayload::ItemNotFound);
+ }());
+
+ CPPUNIT_ASSERT_EQUAL(1, static_cast<int>(stanzaChannel->sentStanzas.size()));
+ CPPUNIT_ASSERT(stanzaChannel->isRequestAtIndex<VCard>(0, JID(), IQ::Get));
+ CPPUNIT_ASSERT_EQUAL(1, static_cast<int>(changes.size()));
+ CPPUNIT_ASSERT_EQUAL(true, changes[0].second->isEmpty());
+ }
+
+ void testRequestOwnVCard_ReturnFeatureNotImplementedError() {
+ auto testling = createManager();
+ testling->requestVCard(ownJID);
+ stanzaChannel->onIQReceived([&](){
+ return IQ::createError(JID(), stanzaChannel->sentStanzas[0]->getTo(), stanzaChannel->sentStanzas[0]->getID(), ErrorPayload::FeatureNotImplemented);
+ }());
+
+ CPPUNIT_ASSERT_EQUAL(1, static_cast<int>(stanzaChannel->sentStanzas.size()));
+ CPPUNIT_ASSERT(stanzaChannel->isRequestAtIndex<VCard>(0, JID(), IQ::Get));
+ CPPUNIT_ASSERT_EQUAL(0, static_cast<int>(changes.size()));
+ }
+
void testCreateSetVCardRequest() {
- std::shared_ptr<VCardManager> testling = createManager();
+ auto testling = createManager();
VCard::ref vcard = std::make_shared<VCard>();
vcard->setFullName("New Name");
SetVCardRequest::ref request = testling->createSetVCardRequest(vcard);
@@ -154,7 +255,7 @@ class VCardManagerTest : public CppUnit::TestFixture {
}
void testCreateSetVCardRequest_Error() {
- std::shared_ptr<VCardManager> testling = createManager();
+ auto testling = createManager();
VCard::ref vcard = std::make_shared<VCard>();
vcard->setFullName("New Name");
SetVCardRequest::ref request = testling->createSetVCardRequest(vcard);
diff --git a/Swiften/VCards/VCardManager.cpp b/Swiften/VCards/VCardManager.cpp
index 95b96fa..9423702 100644
--- a/Swiften/VCards/VCardManager.cpp
+++ b/Swiften/VCards/VCardManager.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2018 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -50,10 +50,9 @@ void VCardManager::requestOwnVCard() {
requestVCard(JID());
}
-
void VCardManager::handleVCardReceived(const JID& actualJID, VCard::ref vcard, ErrorPayload::ref error) {
requestedVCards.erase(actualJID);
- if (!error) {
+ if (!error || (error && error->getCondition() == ErrorPayload::ItemNotFound)) {
if (!vcard) {
vcard = VCard::ref(new VCard());
}
diff --git a/scons b/scons
index 2132dfa..81aba3c 100755
--- a/scons
+++ b/scons
@@ -7,17 +7,17 @@
function is_supported_python
{
local exe=$1
- $exe -c 'import sys; (major, minor, a, b, c) = sys.version_info; python_version = (major, minor); exit(not ((2, 4) <= python_version <= (2, 7)))' 2>/dev/null
+ $exe -c 'import sys; (major, minor, a, b, c) = sys.version_info; python_version = (major, minor); exit(not (((2, 7) <= python_version) or ((3, 5) <= python_version)))' 2>/dev/null
}
declare -a supported_python_versions=(python python2.7 python2.6 python2.5 python2.4)
for exe in ${supported_python_versions[*]}; do
if is_supported_python "$exe"; then
- exec $exe `dirname $0`/3rdParty/SCons/scons-2.4.0/script/scons "$@"
+ exec $exe `dirname $0`/3rdParty/SCons/scons-3.0.1/script/scons.py "$@"
exit
fi
done
-echo "No suitable Python interpreter found! Swift build system supports Python 2.4 to Python 2.7.!!!" >&2
+echo "No suitable Python interpreter found! Swift build system supports Python 2.7.* and Python 3.5 or higher!" >&2
exit 1 \ No newline at end of file
diff --git a/scons.bat b/scons.bat
index 2095481..aed4d21 100644
--- a/scons.bat
+++ b/scons.bat
@@ -1,3 +1,3 @@
@echo off
-python 3rdParty/SCons/scons-2.4.0/script/scons %*
+python 3rdParty/SCons/scons-3.0.1/script/scons.py %*